[med-svn] [ncbi-vdb] 02/04: New upstream version 2.8.1+dfsg

Andreas Tille tille at debian.org
Wed Jan 11 10:10:49 UTC 2017


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

tille pushed a commit to branch master
in repository ncbi-vdb.

commit 879c0ec88afd6640f4785fb332299d2a06ada41c
Author: Andreas Tille <tille at debian.org>
Date:   Wed Jan 11 07:17:50 2017 +0100

    New upstream version 2.8.1+dfsg
---
 .github/ISSUE_TEMPLATE.md                          |    21 -
 .github/PULL_REQUEST_TEMPLATE.md                   |    13 -
 .gitignore                                         |    49 +-
 .travis.yml                                        |    20 -
 CHANGES.md                                         |    58 +
 LICENSE                                            |    77 +
 Makefile                                           |   159 +
 README.md                                          |   114 +-
 build.gradle                                       |   227 -
 build.xml                                          |    62 -
 build/.gitignore                                   |    10 +
 build/Makefile.cc                                  |    67 +
 build/Makefile.clang                               |    80 +
 build/Makefile.env                                 |   373 +
 build/Makefile.gcc                                 |    88 +
 build/Makefile.icc                                 |    77 +
 build/Makefile.install                             |   151 +
 build/Makefile.linux                               |    84 +
 build/Makefile.rules                               |   111 +
 build/Makefile.scm                                 |    94 +
 build/Makefile.shell                               |   176 +
 build/Makefile.targets                             |   117 +
 build/Makefile.vers                                |    26 +
 build/abspath.sh                                   |    31 +
 build/cc.sh                                        |   129 +
 build/cp.sh                                        |    32 +
 build/gprof2dot.py                                 |  2763 ++
 build/increment-release.sh                         |    44 +
 build/ld.linux.cmn.sh                              |   158 +
 build/ld.linux.dlib.sh                             |   308 +
 build/ld.linux.exe.sh                              |   322 +
 build/ld.linux.exe_cmd.sh                          |     1 +
 build/ld.linux.gcc.sh                              |    47 +
 build/ld.linux.icc.sh                              |    47 +
 build/ld.linux.ln.sh                               |    98 +
 build/ld.linux.slib.sh                             |   146 +
 build/ld.mac.clang.sh                              |    59 +
 build/ld.mac.cmn.sh                                |   159 +
 build/ld.mac.dlib.sh                               |   366 +
 build/ld.mac.exe.sh                                |   340 +
 build/ld.mac.gcc.sh                                |    58 +
 build/ld.mac.ln.sh                                 |   103 +
 build/ld.mac.slib.sh                               |   101 +
 build/ld.rwin.dlib.sh                              |   363 +
 build/ld.rwin.exe.sh                               |   366 +
 build/ld.rwin.slib.sh                              |   123 +
 build/ld.rwin.stub.sh                              |    59 +
 build/ld.rwin.vc++.sh                              |    65 +
 build/ld.sh                                        |   593 +
 build/ld.sun.cc.sh                                 |    56 +
 build/ld.sun.cmn.sh                                |   160 +
 build/ld.sun.dlib.sh                               |   282 +
 build/ld.sun.exe.sh                                |   299 +
 build/ld.sun.ln.sh                                 |    87 +
 build/ld.sun.slib.sh                               |   135 +
 build/ld.unix.cmn.sh                               |   149 +
 build/ld.unix.slib.sh                              |   124 +
 build/ld.win.cmn.sh                                |   225 +
 build/ld.win.dlib.sh                               |   327 +
 build/ld.win.exe.sh                                |   321 +
 build/ld.win.slib.sh                               |   135 +
 build/ld.win.stub.sh                               |    60 +
 build/ld.win.vc++.sh                               |    65 +
 build/libexists.sh                                 |   180 +
 build/mac.arch.sh                                  |    87 +
 build/make-defs-xf.pl                              |   108 +
 build/make-defs.pl                                 |   247 +
 build/make-vers-inc.sh                             |    46 +
 build/run_remotely.sh                              |   124 +
 build/scm-collect.sh                               |    42 +
 build/scm.sh                                       |   136 +
 build/scm.txt                                      |   117 +
 build/sra-dflt-schema.sh                           |   163 +
 build/tag-module.sh                                |   213 +
 build/valgrind.suppress                            |    21 +
 build/wait_for_file.sh                             |    65 +
 configure                                          |    45 +
 gradle/wrapper/gradle-wrapper.jar                  |   Bin 53556 -> 0 bytes
 gradle/wrapper/gradle-wrapper.properties           |     6 -
 gradlew                                            |   164 -
 .../tribble/util/ftp => interfaces}/.gitignore     |     0
 interfaces/align/align-access.h                    |   350 +
 interfaces/align/align.h                           |    70 +
 interfaces/align/align.vschema                     |  1610 +
 interfaces/align/alignsrc.h                        |    71 +
 interfaces/align/bam.h                             |   836 +
 interfaces/align/dna-reverse-cmpl.h                |    43 +
 interfaces/align/extern.h                          |    41 +
 interfaces/align/iterator.h                        |   610 +
 interfaces/align/iterator_examples.txt             |   148 +
 interfaces/align/manager.h                         |    69 +
 interfaces/align/mate-cache.vschema                |    99 +
 interfaces/align/pileup-stats.vschema              |   120 +
 interfaces/align/qstat.vschema                     |    87 +
 interfaces/align/quality-quantizer.h               |    49 +
 interfaces/align/reader-refseq.h                   |    72 +
 interfaces/align/reference.h                       |   150 +
 interfaces/align/refseq-mgr.h                      |    88 +
 interfaces/align/refseq.vschema                    |   100 +
 interfaces/align/seq.vschema                       |   300 +
 interfaces/align/writer-alignment.h                |   181 +
 interfaces/align/writer-cmn.h                      |    46 +
 interfaces/align/writer-reference.h                |   180 +
 interfaces/align/writer-refseq.h                   |    89 +
 interfaces/align/writer-sequence.h                 |   157 +
 interfaces/cc/cc/compiler.h                        |    39 +
 interfaces/cc/gcc/compiler.h                       |    39 +
 interfaces/cc/gcc/fat86/arch-impl.h                |    33 +
 interfaces/cc/gcc/fat86/atomic.h                   |    33 +
 interfaces/cc/gcc/fat86/atomic32.h                 |    37 +
 interfaces/cc/gcc/fat86/atomic64.h                 |    32 +
 interfaces/cc/gcc/fat86/bitstr.h                   |    33 +
 interfaces/cc/gcc/fat86/byteswap.h                 |    33 +
 interfaces/cc/gcc/fat86/strtol.h                   |    33 +
 interfaces/cc/gcc/i386/arch-impl.h                 |   488 +
 interfaces/cc/gcc/i386/atomic.h                    |   169 +
 interfaces/cc/gcc/i386/atomic32.h                  |   366 +
 interfaces/cc/gcc/i386/bitstr.h                    |    39 +
 interfaces/cc/gcc/i386/byteswap.h                  |    89 +
 interfaces/cc/gcc/i386/strtol.h                    |    67 +
 interfaces/cc/gcc/noarch/bitstr.h                  |   413 +
 interfaces/cc/gcc/ppc32/arch-impl.h                |   209 +
 interfaces/cc/gcc/ppc32/atomic.h                   |   157 +
 interfaces/cc/gcc/ppc32/atomic32.h                 |   197 +
 interfaces/cc/gcc/ppc32/bitstr.h                   |    40 +
 interfaces/cc/gcc/ppc32/strtol.h                   |    67 +
 interfaces/cc/gcc/v128.h                           |  1093 +
 interfaces/cc/gcc/va_copy.h                        |    49 +
 interfaces/cc/gcc/x86_64/arch-impl.h               |   459 +
 interfaces/cc/gcc/x86_64/atomic.h                  |   183 +
 interfaces/cc/gcc/x86_64/atomic32.h                |   365 +
 interfaces/cc/gcc/x86_64/atomic64.h                |   365 +
 interfaces/cc/gcc/x86_64/bitstr.h                  |    39 +
 interfaces/cc/gcc/x86_64/byteswap.h                |    89 +
 interfaces/cc/gcc/x86_64/strtol.h                  |    69 +
 interfaces/cc/icc/compiler.h                       |    39 +
 interfaces/cc/vc++/compiler.h                      |    72 +
 interfaces/cc/vc++/i386/arch-impl.h                |    42 +
 interfaces/cc/vc++/i386/bitstr.h                   |    39 +
 interfaces/cc/vc++/noarch/arch-impl.h              |   378 +
 interfaces/cc/vc++/noarch/bitstr.h                 |   412 +
 interfaces/cc/vc++/stdbool.h                       |    46 +
 interfaces/cc/vc++/stdint.h                        |    50 +
 interfaces/cc/vc++/va_copy.h                       |    43 +
 interfaces/cc/vc++/x86_64/arch-impl.h              |    42 +
 interfaces/cc/vc++/x86_64/bitstr.h                 |    39 +
 interfaces/csra2/csra2.vschema                     |    42 +
 interfaces/csra2/read.vschema                      |   255 +
 interfaces/csra2/reference.vschema                 |   245 +
 interfaces/csra2/stats.vschema                     |    92 +
 interfaces/fastq/extern.h                          |    41 +
 interfaces/fastq/fq-dump.h                         |   110 +
 interfaces/hdf5/extern.h                           |    41 +
 interfaces/hdf5/kdf5.h                             |    89 +
 interfaces/insdc/insdc.h                           |   277 +
 interfaces/insdc/insdc.vschema                     |   232 +
 interfaces/insdc/seq.vschema                       |   210 +
 interfaces/insdc/sra.h                             |   111 +
 interfaces/insdc/sra.vschema                       |   470 +
 interfaces/kapp/args-conv.h                        |    57 +
 interfaces/kapp/args.h                             |   402 +
 interfaces/kapp/extern.h                           |    47 +
 interfaces/kapp/loader-file.h                      |   122 +
 interfaces/kapp/loader-meta.h                      |    55 +
 interfaces/kapp/log-xml.h                          |    76 +
 interfaces/kapp/main.h                             |   174 +
 interfaces/kapp/progressbar.h                      |    82 +
 interfaces/kapp/queue-file.h                       |   149 +
 interfaces/kdb/btree.h                             |   188 +
 interfaces/kdb/column.h                            |   360 +
 interfaces/kdb/consistency-check.h                 |   142 +
 interfaces/kdb/database.h                          |   278 +
 interfaces/kdb/extern.h                            |    41 +
 interfaces/kdb/index.h                             |   309 +
 interfaces/kdb/kdb-priv.h                          |   165 +
 interfaces/kdb/manager.h                           |   182 +
 interfaces/kdb/meta.h                              |   411 +
 interfaces/kdb/meta.hpp                            |   487 +
 interfaces/kdb/namelist.h                          |    81 +
 interfaces/kdb/rowset-impl.h                       |   141 +
 interfaces/kdb/rowset.h                            |   186 +
 interfaces/kdb/table.h                             |   298 +
 interfaces/kfc/callconv.h                          |    53 +
 interfaces/kfc/ctx.h                               |   198 +
 interfaces/kfc/defs.h                              |   199 +
 interfaces/kfc/except.h                            |   215 +
 interfaces/kfc/extern.h                            |    68 +
 interfaces/kfc/rc.h                                |   361 +
 interfaces/kfc/refcount-impl.h                     |    95 +
 interfaces/kfc/refcount.h                          |   246 +
 interfaces/kfc/rsrc-global.h                       |    72 +
 interfaces/kfc/rsrc.h                              |    89 +
 interfaces/kfc/tstate.h                            |   107 +
 interfaces/kfc/vtbl-impl.h                         |   139 +
 interfaces/kfc/xc.h                                |   192 +
 interfaces/kfc/xcdefs.h                            |    81 +
 interfaces/kfc/xcext.h                             |    64 +
 interfaces/kfc/xcgen.h                             |    68 +
 interfaces/kfg/config.h                            |   425 +
 interfaces/kfg/extern.h                            |    41 +
 interfaces/kfg/kart.h                              |    90 +
 interfaces/kfg/keystore-priv.h                     |    92 +
 interfaces/kfg/keystore.h                          |   159 +
 interfaces/kfg/kfg-priv.h                          |   110 +
 interfaces/kfg/ngc.h                               |    67 +
 interfaces/kfg/properties.h                        |   143 +
 interfaces/kfg/repository.h                        |   423 +
 interfaces/kfs/arc.h                               |   143 +
 interfaces/kfs/arrayfile.h                         |   180 +
 interfaces/kfs/buffile.h                           |    94 +
 interfaces/kfs/bzip.h                              |    77 +
 interfaces/kfs/cacheteefile.h                      |   162 +
 interfaces/kfs/countfile.h                         |    73 +
 interfaces/kfs/crc.h                               |   292 +
 interfaces/kfs/defs.h                              |   121 +
 interfaces/kfs/directory.h                         |   591 +
 interfaces/kfs/directory.hpp                       |   582 +
 interfaces/kfs/dyload.h                            |   223 +
 interfaces/kfs/extendable-ramfile.h                |    50 +
 interfaces/kfs/extern.h                            |    41 +
 interfaces/kfs/ffext.h                             |    48 +
 interfaces/kfs/ffmagic.h                           |    49 +
 interfaces/kfs/file-impl.h                         |   193 +
 interfaces/kfs/file-v1.h                           |   259 +
 interfaces/kfs/file-v2.h                           |   264 +
 interfaces/kfs/file.h                              |    99 +
 interfaces/kfs/file.hpp                            |   147 +
 interfaces/kfs/fileformat.h                        |   140 +
 interfaces/kfs/filetools.h                         |    86 +
 interfaces/kfs/gzip.h                              |    77 +
 interfaces/kfs/impl.h                              |   319 +
 interfaces/kfs/kfs-priv.h                          |    99 +
 interfaces/kfs/lockfile.h                          |   116 +
 interfaces/kfs/manager.h                           |    31 +
 interfaces/kfs/md5.h                               |   289 +
 interfaces/kfs/mmap.h                              |   134 +
 interfaces/kfs/nullfile.h                          |    62 +
 interfaces/kfs/pagefile.h                          |   191 +
 interfaces/kfs/path-priv.h                         |    32 +
 interfaces/kfs/path.h                              |    32 +
 interfaces/kfs/pmem.h                              |   156 +
 interfaces/kfs/quickmount.h                        |    61 +
 interfaces/kfs/ramfile.h                           |    75 +
 interfaces/kfs/readheadfile.h                      |    86 +
 interfaces/kfs/sra.h                               |   191 +
 interfaces/kfs/subfile.h                           |    64 +
 interfaces/kfs/szip.h                              |    77 +
 interfaces/kfs/tar.h                               |    94 +
 interfaces/kfs/teefile.h                           |    66 +
 interfaces/kfs/toc.h                               |   148 +
 interfaces/kfs/wgaencrypt.h                        |    27 +
 interfaces/klib/btree.h                            |   147 +
 interfaces/klib/callconv.h                         |    34 +
 interfaces/klib/checksum.h                         |   152 +
 interfaces/klib/container.h                        |   455 +
 interfaces/klib/data-buffer.h                      |   206 +
 interfaces/klib/debug.h                            |   549 +
 interfaces/klib/defs.h                             |   147 +
 interfaces/klib/extern.h                           |    51 +
 interfaces/klib/impl.h                             |    96 +
 interfaces/klib/klib-priv.h                        |   108 +
 interfaces/klib/ksort-macro.h                      |   257 +
 interfaces/klib/log.h                              |   381 +
 interfaces/klib/logfmt.h                           |    62 +
 interfaces/klib/misc.h                             |    51 +
 interfaces/klib/namelist.h                         |   227 +
 interfaces/klib/namelist.hpp                       |   130 +
 interfaces/klib/ncbi-vdb-version.h                 |    56 +
 interfaces/klib/num-gen.h                          |   228 +
 interfaces/klib/out.h                              |    86 +
 interfaces/klib/pack.h                             |   138 +
 interfaces/klib/path-priv.h                        |   266 +
 interfaces/klib/path.h                             |   252 +
 interfaces/klib/pbstree.h                          |   287 +
 interfaces/klib/printf.h                           |   406 +
 interfaces/klib/progressbar.h                      |    85 +
 interfaces/klib/ptrie.h                            |   296 +
 interfaces/klib/rc.h                               |   201 +
 interfaces/klib/refcount.h                         |   102 +
 interfaces/klib/report.h                           |   103 +
 interfaces/klib/sort.h                             |   123 +
 interfaces/klib/sra-release-version.h              |   100 +
 interfaces/klib/status.h                           |   147 +
 interfaces/klib/symbol.h                           |   146 +
 interfaces/klib/symtab.h                           |   225 +
 interfaces/klib/text.h                             |   563 +
 interfaces/klib/time.h                             |   100 +
 interfaces/klib/token.h                            |   254 +
 interfaces/klib/trie.h                             |   293 +
 interfaces/klib/vector.h                           |   539 +
 interfaces/klib/vlen-encode.h                      |   161 +
 interfaces/klib/writer.h                           |   170 +
 interfaces/kns/adapt.h                             |    89 +
 interfaces/kns/ascp.h                              |   101 +
 interfaces/kns/endpoint.h                          |   148 +
 interfaces/kns/extern.h                            |    41 +
 interfaces/kns/http-priv.h                         |    63 +
 interfaces/kns/http.h                              |   407 +
 interfaces/kns/impl.h                              |   111 +
 interfaces/kns/kns-mgr-priv.h                      |   149 +
 interfaces/kns/manager-ext.h                       |    59 +
 interfaces/kns/manager.h                           |   103 +
 interfaces/kns/socket.h                            |   151 +
 interfaces/kns/stream.h                            |   222 +
 interfaces/kns/tls.h                               |   100 +
 interfaces/kproc/barrier.h                         |    75 +
 interfaces/kproc/barrier.hpp                       |    79 +
 interfaces/kproc/cond.h                            |   103 +
 interfaces/kproc/cond.hpp                          |   107 +
 interfaces/kproc/extern.h                          |    41 +
 interfaces/kproc/impl.h                            |   104 +
 interfaces/kproc/lock.h                            |   144 +
 interfaces/kproc/lock.hpp                          |   163 +
 interfaces/kproc/procmgr.h                         |   120 +
 interfaces/kproc/q-extern.h                        |    41 +
 interfaces/kproc/queue.h                           |   116 +
 interfaces/kproc/sem.h                             |   138 +
 interfaces/kproc/sem.hpp                           |   134 +
 interfaces/kproc/task.h                            |    83 +
 interfaces/kproc/thread.h                          |    91 +
 interfaces/kproc/thread.hpp                        |    98 +
 interfaces/kproc/timeout.h                         |    74 +
 interfaces/krypto/aes-priv.h                       |     1 +
 interfaces/krypto/cipher-impl.h                    |     1 +
 interfaces/krypto/cipher-priv.h                    |     1 +
 interfaces/krypto/cipher-test.h                    |    49 +
 interfaces/krypto/cipher.h                         |   208 +
 interfaces/krypto/ciphermgr-priv.h                 |    38 +
 interfaces/krypto/ciphermgr.h                      |    98 +
 interfaces/krypto/encfile-priv.h                   |   250 +
 interfaces/krypto/encfile.h                        |   134 +
 interfaces/krypto/extern.h                         |    48 +
 interfaces/krypto/key.h                            |   103 +
 interfaces/krypto/manager-priv.h                   |    26 +
 interfaces/krypto/manager.h                        |    33 +
 interfaces/krypto/reencfile.h                      |    94 +
 interfaces/krypto/rng-impl.h                       |    86 +
 interfaces/krypto/rng.h                            |    68 +
 interfaces/krypto/testciphermgr.h                  |    58 +
 interfaces/krypto/wgaencrypt.h                     |   128 +
 interfaces/ktst/test_tools.hpp                     |    22 +
 interfaces/ktst/unit_test.hpp                      |   260 +
 interfaces/ktst/unit_test_suite.hpp                |   515 +
 interfaces/kxml/xml.h                              |   382 +
 interfaces/kxml/xml.hpp                            |   198 +
 interfaces/loader/alignment-writer.h               |   108 +
 interfaces/loader/common-reader-priv.h             |   300 +
 interfaces/loader/common-reader.h                  |   486 +
 interfaces/loader/common-writer.h                  |   192 +
 interfaces/loader/mmarray.h                        |    50 +
 interfaces/loader/reference-writer.h               |    80 +
 interfaces/loader/sequence-writer.h                |    93 +
 interfaces/ncbi/clip.vschema                       |   147 +
 interfaces/ncbi/extern.h                           |    41 +
 interfaces/ncbi/kimpl-sra-cgi.h                    |    91 +
 interfaces/ncbi/ksra-cgi-lib.h                     |    52 +
 interfaces/ncbi/ksra-cgi.h                         |   111 +
 interfaces/ncbi/ncbi.h                             |    73 +
 interfaces/ncbi/ncbi.vschema                       |   195 +
 interfaces/ncbi/pnbrdb.vschema                     |    98 +
 interfaces/ncbi/seq-graph.vschema                  |   180 +
 interfaces/ncbi/seq.vschema                        |   894 +
 interfaces/ncbi/spotname.h                         |   150 +
 interfaces/ncbi/spotname.vschema                   |   377 +
 interfaces/ncbi/sra.vschema                        |   758 +
 interfaces/ncbi/stats.vschema                      |   119 +
 interfaces/ncbi/varloc.vschema                     |   204 +
 interfaces/ncbi/vdb-blast-priv.h                   |    53 +
 interfaces/ncbi/vdb-blast.h                        |   606 +
 interfaces/ncbi/wgs-contig.h                       |   183 +
 interfaces/ncbi/wgs-contig.vschema                 |   695 +
 interfaces/ngs/Model.graphml                       |   801 +
 interfaces/ngs/NOTES.txt                           |     9 +
 interfaces/ngs/SimpleModel.graphml                 |   395 +
 interfaces/ngs/cstdint                             |     1 +
 interfaces/ngs/ncbi/NGS.hpp                        |    95 +
 interfaces/os/linux/os-native.h                    |    43 +
 interfaces/os/unix/oserror.h                       |    38 +
 interfaces/os/unix/sysalloc.h                      |    40 +
 interfaces/os/unix/unix-native.h                   |    58 +
 interfaces/rdbms/rdbms.h                           |   362 +
 interfaces/rdbms/sybase.h                          |    52 +
 interfaces/search/extern.h                         |    41 +
 interfaces/search/grep.h                           |   268 +
 interfaces/search/nucstrstr.h                      |   153 +
 interfaces/search/ref-variation.h                  |   159 +
 interfaces/search/smith-waterman.h                 |    72 +
 interfaces/simple/extern.h                         |    41 +
 interfaces/simple/sra.hpp                          |  1127 +
 interfaces/sra/454.vschema                         |   289 +
 interfaces/sra/abi.h                               |   167 +
 interfaces/sra/abi.vschema                         |   241 +
 interfaces/sra/extern.h                            |    41 +
 interfaces/sra/fastq.h                             |   191 +
 interfaces/sra/generic-fastq.vschema               |   265 +
 interfaces/sra/helicos.vschema                     |    85 +
 interfaces/sra/illumina.h                          |   170 +
 interfaces/sra/illumina.vschema                    |   408 +
 interfaces/sra/impl.h                              |   121 +
 interfaces/sra/ion-torrent.vschema                 |   117 +
 interfaces/sra/nanopore.vschema                    |    84 +
 interfaces/sra/pacbio.h                            |    66 +
 interfaces/sra/pacbio.vschema                      |   307 +
 interfaces/sra/path-extern.h                       |    41 +
 interfaces/sra/pevents.vschema                     |    91 +
 interfaces/sra/rd-extern.h                         |    41 +
 interfaces/sra/sch-extern.h                        |    41 +
 interfaces/sra/sff-file.h                          |   110 +
 interfaces/sra/sff.h                               |   147 +
 interfaces/sra/sradb-priv.h                        |   407 +
 interfaces/sra/sradb.h                             |   545 +
 interfaces/sra/sradb.hpp                           |   441 +
 interfaces/sra/srapath.h                           |   181 +
 interfaces/sra/srapath.hpp                         |   176 +
 interfaces/sra/sraschema.h                         |    72 +
 interfaces/sra/types.h                             |   350 +
 interfaces/sra/wsradb.h                            |   242 +
 interfaces/sra/wsradb.hpp                          |   591 +
 interfaces/svdb/extern.h                           |    47 +
 interfaces/svdb/svdb.h                             |   531 +
 interfaces/tui/extern.h                            |    41 +
 interfaces/tui/tui.h                               |   297 +
 interfaces/tui/tui.hpp                             |   739 +
 interfaces/tui/tui_dlg.h                           |   367 +
 interfaces/vdb/blob.h                              |   154 +
 interfaces/vdb/built-in.vschema                    |   412 +
 interfaces/vdb/cursor.h                            |   490 +
 interfaces/vdb/cursor.hpp                          |   388 +
 interfaces/vdb/database.h                          |   334 +
 interfaces/vdb/database.hpp                        |   347 +
 interfaces/vdb/dependencies.h                      |   231 +
 interfaces/vdb/extern.h                            |    47 +
 interfaces/vdb/manager.h                           |   234 +
 interfaces/vdb/manager.hpp                         |   386 +
 interfaces/vdb/report.h                            |    92 +
 interfaces/vdb/schema.h                            |   460 +
 interfaces/vdb/schema.hpp                          |   252 +
 interfaces/vdb/table.h                             |   424 +
 interfaces/vdb/table.hpp                           |   328 +
 interfaces/vdb/types.h                             |    39 +
 interfaces/vdb/types.hpp                           |   230 +
 interfaces/vdb/vdb-priv.h                          |   342 +
 interfaces/vdb/vdb.h                               |    62 +
 interfaces/vdb/vdb.vschema                         |   859 +
 interfaces/vdb/xform.h                             |   826 +
 interfaces/vfs/extern.h                            |    47 +
 interfaces/vfs/keyring-priv.h                      |    52 +
 interfaces/vfs/manager-priv.h                      |   161 +
 interfaces/vfs/manager.h                           |   322 +
 interfaces/vfs/path-priv.h                         |   266 +
 interfaces/vfs/path.h                              |   294 +
 interfaces/vfs/resolver.h                          |   311 +
 interfaces/xfs/doc.h                               |   123 +
 interfaces/xfs/editors.h                           |   310 +
 interfaces/xfs/extern.h                            |    48 +
 interfaces/xfs/handle.h                            |   106 +
 interfaces/xfs/model.h                             |   248 +
 interfaces/xfs/node.h                              |   217 +
 interfaces/xfs/path.h                              |   227 +
 interfaces/xfs/perm.h                              |   173 +
 interfaces/xfs/tree.h                              |   176 +
 interfaces/xfs/xfs-defs.h                          |   125 +
 interfaces/xfs/xfs.h                               |   165 +
 interfaces/xfs/xlog.h                              |    54 +
 libs/Makefile                                      |    89 +
 libs/align/.gitignore                              |     1 +
 libs/align/Makefile                                |   163 +
 libs/align/al_iterator.c                           |   565 +
 libs/align/align-access.c                          |   812 +
 libs/align/align_mgr.c                             |   108 +
 libs/align/bam-priv.h                              |    48 +
 libs/align/bam.c                                   |  5055 +++
 libs/align/debug.h                                 |    77 +
 libs/align/dna-reverse-cmpl.c                      |    80 +
 libs/align/pl_iterator.c                           |   689 +
 libs/align/quality-quantizer.c                     |   109 +
 libs/align/reader-cmn.c                            |   317 +
 libs/align/reader-cmn.h                            |    81 +
 libs/align/reader-refseq.c                         |   279 +
 libs/align/reader-wgs.c                            |   169 +
 libs/align/reader-wgs.h                            |    58 +
 libs/align/ref_iterator.c                          |   863 +
 libs/align/reference-cmn.c                         |    43 +
 libs/align/reference-cmn.h                         |    38 +
 libs/align/reference.c                             |  1943 ++
 libs/align/refseq-mgr-priv.h                       |    35 +
 libs/align/refseq-mgr.c                            |  1273 +
 libs/align/writer-alignment.c                      |   440 +
 libs/align/writer-cmn.c                            |   589 +
 libs/align/writer-priv.h                           |   151 +
 libs/align/writer-ref.c                            |   481 +
 libs/align/writer-ref.h                            |   106 +
 libs/align/writer-reference.c                      |  3186 ++
 libs/align/writer-refseq.c                         |   179 +
 libs/align/writer-sequence.c                       |   778 +
 libs/ascp/Makefile                                 |    87 +
 libs/ascp/ascp-priv.h                              |    74 +
 libs/ascp/ascp.c                                   |   840 +
 libs/ascp/linux/ascp-path.c                        |   119 +
 libs/ascp/unix/connect.c                           |   618 +
 libs/axf/.gitignore                                |     1 +
 libs/axf/Makefile                                  |   142 +
 libs/axf/align-local_ref_id.c                      |   143 +
 libs/axf/align-local_ref_start.c                   |   148 +
 libs/axf/align-ref-name.c                          |   191 +
 libs/axf/align-ref-pos.c                           |   299 +
 libs/axf/align-ref-seq-id.c                        |   188 +
 libs/axf/align-restore-read.c                      |   150 +
 libs/axf/cigar.c                                   |  2578 ++
 libs/axf/generate-mismatch-qual.c                  |   152 +
 libs/axf/get-sam-flags.c                           |   228 +
 libs/axf/get_mate_align_ids.c                      |   332 +
 libs/axf/make-cmp-read_desc.c                      |   176 +
 libs/axf/mismatch-restore-qual.c                   |   135 +
 libs/axf/not-my-row.c                              |    76 +
 libs/axf/project_read_from_sequence.c              |   285 +
 libs/axf/raw-restore-qual.c                        |    95 +
 libs/axf/raw-restore-read.c                        |   119 +
 libs/axf/ref-preserve_qual.c                       |   429 +
 libs/axf/ref-restore-read.c                        |   201 +
 libs/axf/ref-tbl-sub-select.c                      |   533 +
 libs/axf/ref-tbl.c                                 |   106 +
 libs/axf/ref-tbl.h                                 |    32 +
 libs/axf/refseq-stats.c                            |   205 +
 libs/axf/seq-construct-read.c                      |   125 +
 libs/axf/seq-restore-linkage-group.c               |   186 +
 libs/axf/seq-restore-read.c                        |   749 +
 libs/axf/template-len.c                            |   136 +
 libs/blast/Makefile                                |    91 +
 libs/blast/blast-mgr.c                             |   670 +
 libs/blast/blast-mgr.h                             |    78 +
 libs/blast/reader.c                                |  2361 ++
 libs/blast/reader.h                                |    53 +
 libs/blast/reference.c                             |  1714 ++
 libs/blast/reference.h                             |    86 +
 libs/blast/run-set.c                               |  3251 ++
 libs/blast/run-set.h                               |   313 +
 libs/cipher/cipher-1.7/PKG-INFO                    |    13 +
 libs/cipher/cipher-1.7/README.md                   |     4 +
 libs/cipher/cipher-1.7/cipher.egg-info/PKG-INFO    |    13 +
 libs/cipher/cipher-1.7/cipher.egg-info/SOURCES.txt |    12 +
 .../cipher.egg-info/dependency_links.txt           |     1 +
 .../cipher/cipher-1.7/cipher.egg-info/not-zip-safe |     1 +
 .../cipher-1.7/cipher.egg-info/top_level.txt       |     1 +
 libs/cipher/cipher-1.7/cipher/__init__.py          |   393 +
 libs/cipher/cipher-1.7/decrypt.py                  |    25 +
 libs/cipher/cipher-1.7/encrypt.py                  |    25 +
 libs/cipher/cipher-1.7/requirements-test.txt       |     5 +
 libs/cipher/cipher-1.7/setup.cfg                   |    16 +
 libs/cipher/cipher-1.7/setup.py                    |     4 +
 libs/csra2/Makefile                                |    87 +
 libs/hdf5/.gitignore                               |     2 +
 libs/hdf5/Makefile                                 |   122 +
 libs/hdf5/hdf5arrayfile-priv.h                     |    79 +
 libs/hdf5/hdf5arrayfile.c                          |   656 +
 libs/hdf5/hdf5dir.c                                |   879 +
 libs/hdf5/hdf5file.c                               |   383 +
 libs/kapp/Makefile                                 |   152 +
 libs/kapp/args-conv.c                              |    43 +
 libs/kapp/args.c                                   |  2390 ++
 libs/kapp/args_debug.h                             |    47 +
 libs/kapp/linux/ram.c                              |    79 +
 libs/kapp/loader-file.c                            |   643 +
 libs/kapp/loader-meta.c                            |   105 +
 libs/kapp/log-xml.c                                |   416 +
 libs/kapp/main-priv.h                              |    76 +
 libs/kapp/main.c                                   |   516 +
 libs/kapp/progressbar.c                            |   199 +
 libs/kapp/queue-file.c                             |   925 +
 libs/kapp/tokenizer.c                              |   525 +
 libs/kapp/unix/args-conv-os.c                      |    32 +
 libs/kapp/unix/sysmain.c                           |   296 +
 .../htsjdk/samtools/apps => libs/kdb}/.gitignore   |     0
 libs/kdb/Makefile                                  |   166 +
 libs/kdb/btree.c                                   |   579 +
 libs/kdb/cc-priv.h                                 |    51 +
 libs/kdb/coldata-priv.h                            |   126 +
 libs/kdb/coldata.c                                 |   188 +
 libs/kdb/colfmt-priv.h                             |   339 +
 libs/kdb/colidx-priv.h                             |   122 +
 libs/kdb/colidx.c                                  |   243 +
 libs/kdb/colidx0-priv.h                            |    93 +
 libs/kdb/colidx0.c                                 |   433 +
 libs/kdb/colidx1-priv.h                            |   130 +
 libs/kdb/colidx1.c                                 |   771 +
 libs/kdb/colidx2-priv.h                            |    99 +
 libs/kdb/colidx2.c                                 |   219 +
 libs/kdb/column-cc.c                               |   229 +
 libs/kdb/column-priv.h                             |    94 +
 libs/kdb/column.c                                  |  1132 +
 libs/kdb/database-cc.c                             |   339 +
 libs/kdb/database-cmn.c                            |   496 +
 libs/kdb/database-priv.h                           |   115 +
 libs/kdb/database.c                                |   807 +
 libs/kdb/dbcc-cmn.c                                |   141 +
 libs/kdb/dbmgr-cmn.c                               |   485 +
 libs/kdb/dbmgr-priv.h                              |   128 +
 libs/kdb/dbmgr.c                                   |   420 +
 libs/kdb/idstats-priv.h                            |    74 +
 libs/kdb/idstats.c                                 |   269 +
 libs/kdb/idxblk-priv.h                             |   136 +
 libs/kdb/idxblk.c                                  |   695 +
 libs/kdb/index-cmn.h                               |   286 +
 libs/kdb/index-priv.h                              |   134 +
 libs/kdb/index.c                                   |  1006 +
 libs/kdb/kdb-priv.h                                |   122 +
 libs/kdb/kdb.c                                     |   951 +
 libs/kdb/kdbfmt-priv.h                             |    76 +
 libs/kdb/libkdb.vers.h                             |    27 +
 libs/kdb/meta.c                                    |  2141 ++
 libs/kdb/ptrieval-v1.c                             |   265 +
 libs/kdb/ptrieval-v2.c                             |   396 +
 libs/kdb/rowset-it.c_old                           |   385 +
 libs/kdb/rowset-priv.h_old                         |   116 +
 libs/kdb/rowset-simple.c                           |   434 +
 libs/kdb/rowset.c                                  |   494 +
 libs/kdb/rowset.c_old                              |  1513 +
 libs/kdb/table-cc.c                                |   378 +
 libs/kdb/table-priv.h                              |    81 +
 libs/kdb/table.c                                   |   721 +
 libs/kdb/trieidx-priv.h                            |    74 +
 libs/kdb/trieidx-v1.c                              |   222 +
 libs/kdb/trieidx-v2.c                              |  1047 +
 libs/kdb/trieval-v1.c                              |    49 +
 libs/kdb/trieval-v2.c                              |    49 +
 libs/kdb/u64idx-v3.c                               |   162 +
 libs/kdb/wcoldata-priv.h                           |   172 +
 libs/kdb/wcoldata.c                                |   342 +
 libs/kdb/wcolidx-priv.h                            |   166 +
 libs/kdb/wcolidx.c                                 |   694 +
 libs/kdb/wcolidx0-priv.h                           |   153 +
 libs/kdb/wcolidx0.c                                |   831 +
 libs/kdb/wcolidx1-priv.h                           |   152 +
 libs/kdb/wcolidx1.c                                |   921 +
 libs/kdb/wcolidx2-priv.h                           |   114 +
 libs/kdb/wcolidx2.c                                |   241 +
 libs/kdb/wcolumn-priv.h                            |   120 +
 libs/kdb/wcolumn.c                                 |  2681 ++
 libs/kdb/wdatabase-priv.h                          |    95 +
 libs/kdb/wdatabase.c                               |  1642 +
 libs/kdb/wdbmgr.c                                  |   421 +
 libs/kdb/werror-priv.h                             |    59 +
 libs/kdb/widxblk-priv.h                            |   195 +
 libs/kdb/widxblk.c                                 |   546 +
 libs/kdb/windex-priv.h                             |   230 +
 libs/kdb/windex.c                                  |  1889 ++
 libs/kdb/wkdb-priv.h                               |   160 +
 libs/kdb/wkdb.c                                    |  1430 +
 libs/kdb/wmeta.c                                   |  3526 +++
 libs/kdb/wtable-priv.h                             |   106 +
 libs/kdb/wtable.c                                  |  1641 +
 libs/kdb/wtrieidx-v1.c                             |  1100 +
 libs/kdb/wtrieidx-v2.c                             |  2560 ++
 libs/kdb/wu64idx-v3.c                              |   416 +
 libs/kfc/Makefile                                  |    97 +
 libs/kfc/except.c                                  |   128 +
 libs/kfc/refcount.c                                |   181 +
 libs/kfc/rsrc-priv.h                               |    44 +
 libs/kfc/rsrc.c                                    |   180 +
 libs/kfc/sysctx-priv.h                             |    45 +
 libs/kfc/tstate.c                                  |  1041 +
 libs/kfc/unix/sysctx.c                             |   192 +
 libs/kfc/unix/sysrsrc.c                            |   148 +
 libs/kfc/vtbl.c                                    |   208 +
 libs/kfc/xc.c                                      |    36 +
 libs/kfg/.gitignore                                |     2 +
 libs/kfg/Makefile                                  |   128 +
 libs/kfg/certs.kfg                                 |    31 +
 libs/kfg/config-aws.c                              |   287 +
 libs/kfg/config-grammar.c                          |  1726 ++
 libs/kfg/config-grammar.y                          |   185 +
 libs/kfg/config-lex.c                              |  2517 ++
 libs/kfg/config-lex.l                              |   221 +
 libs/kfg/config-tokens.h                           |    75 +
 libs/kfg/config.c                                  |  4387 +++
 libs/kfg/default.kfg                               |    47 +
 libs/kfg/kart.c                                    |   720 +
 libs/kfg/keystore.c                                |   858 +
 libs/kfg/kfg-lex.h                                 |    67 +
 libs/kfg/kfg-parse.h                               |    41 +
 libs/kfg/kfg-priv.h                                |    32 +
 libs/kfg/ngc-priv.h                                |    59 +
 libs/kfg/ngc.c                                     |   484 +
 libs/kfg/properties.c                              |   768 +
 libs/kfg/report-kfg.c                              |   532 +
 libs/kfg/repository.c                              |  1982 ++
 libs/kfs/.gitignore                                |     1 +
 libs/kfs/Makefile                                  |   221 +
 libs/kfs/arc.c                                     |  4089 +++
 libs/kfs/arrayfile.c                               |   423 +
 libs/kfs/buffile-read.c                            |   265 +
 libs/kfs/buffile-write.c                           |   371 +
 libs/kfs/buffile.c                                 |   574 +
 libs/kfs/bzip.c                                    |   836 +
 libs/kfs/cacheteefile.c                            |  1833 ++
 libs/kfs/countfile.c                               |   652 +
 libs/kfs/crc32.c                                   |  1771 ++
 libs/kfs/dir_test.c                                |    54 +
 libs/kfs/directory-v2.c                            |  1185 +
 libs/kfs/directory.c                               |  1539 +
 libs/kfs/extendable-ramfile.c                      |   280 +
 libs/kfs/ffext.c                                   |   812 +
 libs/kfs/ffkey.c                                   |   833 +
 libs/kfs/ffmagic.c                                 |   969 +
 libs/kfs/file-v2.c                                 |   724 +
 libs/kfs/file.c                                    |  1002 +
 libs/kfs/fileformat-priv.h                         |   124 +
 libs/kfs/fileformat.c                              |   291 +
 libs/kfs/from_to_namelist.c                        |   454 +
 libs/kfs/gzip.c                                    |   646 +
 libs/kfs/impl.h                                    |   120 +
 libs/kfs/karc-priv.h                               |    43 +
 libs/kfs/kfs-priv.h                                |    47 +
 libs/kfs/kfsmagic                                  | 20101 ++++++++++++
 libs/kfs/lockfile.c                                |   350 +
 libs/kfs/manager.c                                 |   641 +
 libs/kfs/md5.c                                     |  1910 ++
 libs/kfs/mmap-priv.h                               |   111 +
 libs/kfs/mmap.c                                    |   754 +
 libs/kfs/nullfile.c                                |   273 +
 libs/kfs/pagefile.c                                |  1388 +
 libs/kfs/pmem.c                                    |   632 +
 libs/kfs/quickmount.c                              |   967 +
 libs/kfs/ramfile.c                                 |   424 +
 libs/kfs/readheadfile.c                            |   294 +
 libs/kfs/report.c                                  |   169 +
 libs/kfs/sra.c                                     |   486 +
 libs/kfs/subfile.c                                 |   337 +
 libs/kfs/szip.c                                    |   575 +
 libs/kfs/tar.c                                     |  2684 ++
 libs/kfs/teefile.c                                 |   532 +
 libs/kfs/toc-priv.h                                |   841 +
 libs/kfs/toc.c                                     |  1764 ++
 libs/kfs/tocdir.c                                  |   411 +
 libs/kfs/tocentry.c                                |  1748 ++
 libs/kfs/tocfile.c                                 |   635 +
 libs/kfs/unix/sysdir-priv.h                        |    68 +
 libs/kfs/unix/sysdir.c                             |  2414 ++
 libs/kfs/unix/sysdll.c                             |  1436 +
 libs/kfs/unix/sysfile-priv.h                       |    89 +
 libs/kfs/unix/sysfile-v2.c                         |  1018 +
 libs/kfs/unix/sysfile.c                            |  1079 +
 libs/kfs/unix/syslockfile.c                        |   215 +
 libs/kfs/unix/sysmmap-priv.h                       |    68 +
 libs/kfs/unix/sysmmap.c                            |   143 +
 libs/klib/.gitignore                               |     1 +
 libs/klib/Judy.h                                   |   635 +
 libs/klib/Makefile                                 |   159 +
 libs/klib/SHA-32bit.c                              |   313 +
 libs/klib/SHA-64bit.c                              |   271 +
 libs/klib/bsd/syserrcode.c                         |    44 +
 libs/klib/bsearch.c                                |    77 +
 libs/klib/bstpersist.c                             |   252 +
 libs/klib/btree.c                                  |  1457 +
 libs/klib/container.c                              |  1646 +
 libs/klib/cp1252.c                                 |    65 +
 libs/klib/crc32.c                                  |   500 +
 libs/klib/data-buffer.c                            |   656 +
 libs/klib/debug.c                                  |   352 +
 libs/klib/iso8859-1.c                              |    42 +
 libs/klib/iso8859.c                                |   205 +
 libs/klib/judy-vector.c                            |  1793 ++
 .../samtools/fastq => libs/klib/judy}/.gitignore   |     0
 libs/klib/judy/Judy1.h                             |   549 +
 libs/klib/judy/Judy1Tables.32.c                    |    72 +
 libs/klib/judy/Judy1Tables.64.c                    |   132 +
 libs/klib/judy/JudyByCount.c                       |   952 +
 libs/klib/judy/JudyByCountWithDefs.c               |     4 +
 libs/klib/judy/JudyCascade.c                       |  1940 ++
 libs/klib/judy/JudyCount.c                         |  1193 +
 libs/klib/judy/JudyCreateBranch.c                  |   312 +
 libs/klib/judy/JudyDecascade.c                     |  1204 +
 libs/klib/judy/JudyDel.c                           |  2144 ++
 libs/klib/judy/JudyFirst.c                         |   211 +
 libs/klib/judy/JudyFreeArray.c                     |   361 +
 libs/klib/judy/JudyGet.c                           |  1092 +
 libs/klib/judy/JudyHS.c                            |   770 +
 libs/klib/judy/JudyHS.h                            |    35 +
 libs/klib/judy/JudyIns.c                           |  1871 ++
 libs/klib/judy/JudyInsArray.c                      |  1176 +
 libs/klib/judy/JudyInsertBranch.c                  |   133 +
 libs/klib/judy/JudyL.h                             |   503 +
 libs/klib/judy/JudyLTables.32.c                    |   121 +
 libs/klib/judy/JudyLTables.64.c                    |   219 +
 libs/klib/judy/JudyMalloc.c                        |    86 +
 libs/klib/judy/JudyMallocIF.c                      |   780 +
 libs/klib/judy/JudyMemActive.c                     |   257 +
 libs/klib/judy/JudyMemUsed.c                       |    59 +
 libs/klib/judy/JudyNext.c                          |     2 +
 libs/klib/judy/JudyNextEmpty.c                     |     2 +
 libs/klib/judy/JudyPrev.c                          |     2 +
 libs/klib/judy/JudyPrevEmpty.c                     |     2 +
 libs/klib/judy/JudyPrevNext.c                      |  1888 ++
 libs/klib/judy/JudyPrevNextEmpty.c                 |  1388 +
 libs/klib/judy/JudyPrintJP.c                       |   399 +
 libs/klib/judy/JudyPrivate.h                       |  1610 +
 libs/klib/judy/JudyPrivate1L.h                     |   483 +
 libs/klib/judy/JudyPrivateBranch.h                 |   777 +
 libs/klib/judy/JudySL.c                            |  1125 +
 libs/klib/judy/JudyTablesGen.c                     |   294 +
 libs/klib/judy/Judy_Bit.c                          |    23 +
 libs/klib/judy/Judy_Bit_Cascade.c                  |     3 +
 libs/klib/judy/Judy_Bit_Count.c                    |     3 +
 libs/klib/judy/Judy_Bit_Decascade.c                |     3 +
 libs/klib/judy/Judy_Bit_Next.c                     |     3 +
 libs/klib/judy/Judy_Bit_NextEmpty.c                |     3 +
 libs/klib/judy/Judy_Bit_Prev.c                     |     3 +
 libs/klib/judy/Judy_Word.c                         |    23 +
 libs/klib/judy/Judy_Word_Cascade.c                 |     3 +
 libs/klib/judy/Judy_Word_Count.c                   |     3 +
 libs/klib/judy/Judy_Word_Decascade.c               |     3 +
 libs/klib/judy/Judy_Word_Next.c                    |     3 +
 libs/klib/judy/Judy_Word_NextEmpty.c               |     3 +
 libs/klib/judy/Judy_Word_Prev.c                    |     3 +
 libs/klib/judy/Makefile                            |   225 +
 libs/klib/judy/_Judy1Tables.c                      |    31 +
 libs/klib/judy/_JudyLTables.c                      |    31 +
 libs/klib/judy/j__udyGet.c                         |     2 +
 libs/klib/ksort.c                                  |    98 +
 libs/klib/linux/syserrcode.c                       |    53 +
 libs/klib/log-priv.h                               |    96 +
 libs/klib/log.c                                    |   986 +
 libs/klib/maybeswap.h                              |    57 +
 libs/klib/md5.c                                    |   421 +
 libs/klib/namelist.c                               |   149 +
 libs/klib/ncbi-vdb-version.c                       |    45 +
 libs/klib/num-gen.c                                |  1157 +
 libs/klib/out.c                                    |   208 +
 libs/klib/pack.c                                   |   517 +
 libs/klib/pbstree-impl.c                           |   847 +
 libs/klib/pbstree-native.c                         |    30 +
 libs/klib/pbstree-priv.h                           |   680 +
 libs/klib/pbstree-swapped.c                        |    30 +
 libs/klib/pbstree.c                                |   395 +
 libs/klib/printf.c                                 |  3540 +++
 libs/klib/progressbar.c                            |   160 +
 libs/klib/ptpersist.c                              |  1121 +
 libs/klib/ptrie.c                                  |  1992 ++
 libs/klib/qsort.c                                  |   311 +
 libs/klib/rc-idx-tbl.c                             |    41 +
 libs/klib/rc-tbl.c                                 |    38 +
 libs/klib/refcount.c                               |   499 +
 libs/klib/release-vers.h                           |    44 +
 libs/klib/report-klib.c                            |   912 +
 libs/klib/sra-release-version.c                    |   335 +
 libs/klib/status-rc-strings.c                      |    40 +
 libs/klib/status-rc.c                              |   156 +
 libs/klib/status.c                                 |   439 +
 libs/klib/symtab.c                                 |   736 +
 libs/klib/text.c                                   |  1134 +
 libs/klib/time.c                                   |     3 +
 libs/klib/token.c                                  |  1291 +
 libs/klib/trie-priv.h                              |   237 +
 libs/klib/trie.c                                   |  1486 +
 libs/klib/trieval.c                                |   168 +
 libs/klib/unix/misc.c                              |    33 +
 libs/klib/unix/syserrcode.c                        |    46 +
 libs/klib/unix/syslog.c                            |   209 +
 libs/klib/unix/systime.c                           |   162 +
 libs/klib/unix/syswriter.c                         |   163 +
 libs/klib/unpack.c                                 |   833 +
 libs/klib/utf8.c                                   |  1355 +
 libs/klib/vector.c                                 |   626 +
 libs/klib/vector_namelist.c                        |   633 +
 libs/klib/vlen-encode.c                            |   773 +
 libs/klib/writer-priv.h                            |   169 +
 libs/klib/writer.c                                 |   645 +
 libs/kns/Makefile                                  |   116 +
 libs/kns/buffered-stream.c                         |   249 +
 libs/kns/endpoint.c                                |   155 +
 libs/kns/http-client.c                             |  3575 +++
 libs/kns/http-file.c                               |   638 +
 libs/kns/http-priv.h                               |   132 +
 libs/kns/http-retrier.c                            |   503 +
 libs/kns/http.c                                    |   341 +
 libs/kns/kns_manager-ext.c                         |   157 +
 libs/kns/kns_manager.c                             |   346 +
 libs/kns/linux/sysendpoint.c                       |   158 +
 libs/kns/linux/syspoll.c                           |   107 +
 libs/kns/manager.c                                 |  1033 +
 libs/kns/mgr-priv.h                                |    92 +
 libs/kns/poll-priv.h                               |    51 +
 libs/kns/stream-from-files.c                       |   168 +
 libs/kns/stream-from-streams.c                     |   150 +
 libs/kns/stream-priv.h                             |    52 +
 libs/kns/stream.c                                  |   782 +
 libs/kns/sysmgr.h                                  |    41 +
 libs/kns/tls-priv.h                                |    80 +
 libs/kns/tls.c                                     |  1087 +
 libs/kns/unix/sysmgr.c                             |    37 +
 libs/kns/unix/syssock.c                            |  1435 +
 libs/kns/unix/sysstream.c                          |   251 +
 libs/kns/url-fetcher-curl.c                        |   255 +
 libs/kns/url-fetcher-impl.h                        |   109 +
 libs/kns/url-fetcher.c                             |   129 +
 libs/kproc/Makefile                                |   162 +
 libs/kproc/bsd/syslock-priv.h                      |    72 +
 libs/kproc/bsd/syslock.c                           |   932 +
 libs/kproc/bsd/sysmgr.c                            |    38 +
 libs/kproc/linux/sysbarrier.c                      |   170 +
 libs/kproc/linux/syslock-priv.h                    |    68 +
 libs/kproc/linux/syslock.c                         |   617 +
 libs/kproc/linux/sysmgr.c                          |    52 +
 libs/kproc/procmgr.c                               |   445 +
 libs/kproc/queue.c                                 |   428 +
 libs/kproc/sem.c                                   |   472 +
 libs/kproc/stbarrier.c                             |   128 +
 libs/kproc/stcond.c                                |   152 +
 libs/kproc/stlock.c                                |   311 +
 libs/kproc/stsem.c                                 |   233 +
 libs/kproc/stthread.c                              |   149 +
 libs/kproc/sttimeout.c                             |    65 +
 libs/kproc/task.c                                  |   156 +
 libs/kproc/unix/syscond-priv.h                     |    78 +
 libs/kproc/unix/syscond.c                          |   320 +
 libs/kproc/unix/systhread.c                        |   272 +
 libs/kproc/unix/systimeout.c                       |   128 +
 libs/krypto/.gitignore                             |     2 +
 libs/krypto/Makefile                               |   297 +
 libs/krypto/aes-byte.c                             |   236 +
 libs/krypto/aes-impl.c                             |     1 +
 libs/krypto/aes-ncbi-ni.c                          |     2 +
 libs/krypto/aes-ncbi-priv.h                        |   227 +
 libs/krypto/aes-ncbi.c                             |  2641 ++
 libs/krypto/aes-priv.h                             |    94 +
 libs/krypto/aes.c                                  |     1 +
 libs/krypto/aes_core.c                             |  1181 +
 libs/krypto/aes_x86core.c                          |     2 +
 libs/krypto/aesx86.c                               |     1 +
 libs/krypto/blockcipher-byte-impl.h                |   113 +
 libs/krypto/blockcipher-impl.h                     |   187 +
 libs/krypto/blockcipher-priv.h                     |    90 +
 libs/krypto/blockcipher-vec-impl.h                 |   119 +
 libs/krypto/blockcipher.c                          |     3 +
 libs/krypto/cipher-byte.c                          |   522 +
 libs/krypto/cipher-impl.h                          |   174 +
 libs/krypto/cipher-no-vec.c                        |    41 +
 libs/krypto/cipher-priv.h                          |    79 +
 libs/krypto/cipher-vec.c                           |   808 +
 libs/krypto/cipher.c                               |   543 +
 libs/krypto/ciphermgr.c                            |   295 +
 libs/krypto/ciphertest.c                           |    80 +
 libs/krypto/compile-test.c                         |    50 +
 libs/krypto/csprng.c                               |   163 +
 libs/krypto/encfile-priv.h                         |   162 +
 libs/krypto/encfile.c                              |  2019 ++
 libs/krypto/encfilev2.c                            |  2622 ++
 libs/krypto/key.c                                  |   126 +
 libs/krypto/manager.c                              |    11 +
 libs/krypto/ncbi-priv.h                            |   122 +
 libs/krypto/no-null-ncbi.c                         |    59 +
 libs/krypto/null-ncbi-priv.h                       |    56 +
 libs/krypto/null-ncbi.c                            |   251 +
 libs/krypto/reencfile.c                            |  1243 +
 libs/krypto/rng-impl.h                             |    91 +
 .../source/.gitignore => libs/krypto/rng-priv.h    |     0
 libs/krypto/rng.c                                  |   120 +
 libs/krypto/testcipher.c                           |    76 +
 libs/krypto/unix/sysrng.c                          |   114 +
 libs/krypto/wgaencrypt.c                           |  1254 +
 libs/ktst/Makefile                                 |    87 +
 libs/ktst/testcase.cpp                             |   108 +
 libs/ktst/testenv.cpp                              |   518 +
 libs/ktst/testrunner.cpp                           |    86 +
 libs/ktst/unix/systestenv.cpp                      |   137 +
 libs/kxml/Makefile                                 |   117 +
 libs/kxml/xml.c                                    |  1705 +
 libs/kxml/xtoc-parsexml.c                          |   576 +
 libs/kxml/xtoc-priv.h                              |   124 +
 libs/kxml/xtoc.c                                   |  3464 +++
 libs/loader/Makefile                               |    88 +
 libs/loader/alignment-writer.c                     |   271 +
 libs/loader/common-reader.c                        |   614 +
 libs/loader/common-writer.c                        |  2067 ++
 libs/loader/mmarray.c                              |   131 +
 libs/loader/reference-writer.c                     |   483 +
 libs/loader/sequence-writer.c                      |   366 +
 libs/ncbi-vdb/Makefile                             |   160 +
 libs/ncbi-vdb/libncbi-vdb.vers                     |     1 +
 libs/ngs-c++/Makefile                              |   103 +
 libs/ngs-c++/NCBI-NGS.cpp                          |   106 +
 libs/ngs-c++/testy-the-bear.cpp                    |   277 +
 libs/ngs-jni/.gitignore                            |     1 +
 libs/ngs-jni/Makefile                              |   109 +
 libs/ngs-jni/jni_ErrorMsg.c                        |   173 +
 libs/ngs-jni/jni_ErrorMsg.h                        |    89 +
 libs/ngs-jni/jni_Manager.c                         |   250 +
 libs/ngs-jni/jni_Manager.h                         |    77 +
 libs/ngs-jni/jni_String.c                          |   195 +
 libs/ngs-jni/jni_String.h                          |    91 +
 libs/ngs-py/Makefile                               |    87 +
 libs/ngs-py/py_Manager.c                           |   218 +
 libs/ngs-py/py_Manager.h                           |    27 +
 libs/ngs-py/py_ngs_defs.h                          |    15 +
 libs/ngs/BAM_Alignment.c                           |   657 +
 libs/ngs/BAM_Alignment.h                           |    58 +
 libs/ngs/BAM_ReadCollection.c                      |  1522 +
 libs/ngs/BAM_Record.c                              |   142 +
 libs/ngs/BAM_Record.h                              |    82 +
 libs/ngs/CSRA1_Alignment.c                         |  1451 +
 libs/ngs/CSRA1_Alignment.h                         |    83 +
 libs/ngs/CSRA1_Pileup.c                            |  1921 ++
 libs/ngs/CSRA1_Pileup.h                            |   341 +
 libs/ngs/CSRA1_PileupEvent.c                       |   931 +
 libs/ngs/CSRA1_PileupEvent.h                       |    50 +
 libs/ngs/CSRA1_Read.c                              |   463 +
 libs/ngs/CSRA1_Read.h                              |    96 +
 libs/ngs/CSRA1_ReadCollection.c                    |   753 +
 libs/ngs/CSRA1_ReadCollection.h                    |    58 +
 libs/ngs/CSRA1_Reference.c                         |  1102 +
 libs/ngs/CSRA1_Reference.h                         |    96 +
 libs/ngs/CSRA1_ReferenceWindow.c                   |  1062 +
 libs/ngs/CSRA1_ReferenceWindow.h                   |    67 +
 libs/ngs/EBI_ReferenceSequence.c                   |   402 +
 libs/ngs/EBI_ReferenceSequence.h                   |    51 +
 libs/ngs/Makefile                                  |   129 +
 libs/ngs/Model.graphml                             |   661 +
 libs/ngs/NCBI-NGS.c                                |    66 +
 libs/ngs/NCBI-NGS.h                                |    58 +
 libs/ngs/NGS_Alignment.c                           |   993 +
 libs/ngs/NGS_Alignment.h                           |   209 +
 libs/ngs/NGS_Cursor.c                              |   611 +
 libs/ngs/NGS_Cursor.h                              |   140 +
 libs/ngs/NGS_ErrBlock.c                            |    57 +
 libs/ngs/NGS_ErrBlock.h                            |    53 +
 libs/ngs/NGS_Fragment.c                            |   286 +
 libs/ngs/NGS_Fragment.h                            |   175 +
 libs/ngs/NGS_FragmentBlob.c                        |   414 +
 libs/ngs/NGS_FragmentBlob.h                        |   125 +
 libs/ngs/NGS_FragmentBlobIterator.c                |   185 +
 libs/ngs/NGS_FragmentBlobIterator.h                |    79 +
 libs/ngs/NGS_Id.c                                  |   179 +
 libs/ngs/NGS_Id.h                                  |    93 +
 libs/ngs/NGS_Pileup.c                              |   235 +
 libs/ngs/NGS_Pileup.h                              |   147 +
 libs/ngs/NGS_PileupEvent.c                         |   493 +
 libs/ngs/NGS_PileupEvent.h                         |   179 +
 libs/ngs/NGS_Read.c                                |   522 +
 libs/ngs/NGS_Read.h                                |   190 +
 libs/ngs/NGS_ReadCollection.c                      |   674 +
 libs/ngs/NGS_ReadCollection.h                      |   194 +
 libs/ngs/NGS_ReadGroup.c                           |   229 +
 libs/ngs/NGS_ReadGroup.h                           |   127 +
 libs/ngs/NGS_Refcount.c                            |   182 +
 libs/ngs/NGS_Refcount.h                            |   102 +
 libs/ngs/NGS_Reference.c                           |   916 +
 libs/ngs/NGS_Reference.h                           |   214 +
 libs/ngs/NGS_ReferenceSequence.c                   |   282 +
 libs/ngs/NGS_ReferenceSequence.h                   |   138 +
 libs/ngs/NGS_Statistics.c                          |   336 +
 libs/ngs/NGS_Statistics.h                          |   143 +
 libs/ngs/NGS_String.c                              |   413 +
 libs/ngs/NGS_String.h                              |   109 +
 libs/ngs/NOTES.txt                                 |   128 +
 libs/ngs/SRA_DB_ReadCollection.c                   |   456 +
 libs/ngs/SRA_Read.c                                |   943 +
 libs/ngs/SRA_Read.h                                |   173 +
 libs/ngs/SRA_ReadCollection.c                      |   424 +
 libs/ngs/SRA_ReadGroup.c                           |   429 +
 libs/ngs/SRA_ReadGroup.h                           |    73 +
 libs/ngs/SRA_ReadGroupInfo.c                       |   333 +
 libs/ngs/SRA_ReadGroupInfo.h                       |    89 +
 libs/ngs/SRA_ReferenceSequence.c                   |   374 +
 libs/ngs/SRA_ReferenceSequence.h                   |    56 +
 libs/ngs/SRA_Statistics.c                          |   792 +
 libs/ngs/SRA_Statistics.h                          |    61 +
 libs/ngs/VByteBlob.c                               |   117 +
 libs/ngs/VByteBlob.h                               |    47 +
 libs/ngs/extern.h                                  |    41 +
 .../htsjdk/tribble/tmp => libs/search}/.gitignore  |     0
 libs/search/Makefile                               |    98 +
 libs/search/agrep-dp.c                             |   880 +
 libs/search/agrep-myers.c                          |   644 +
 libs/search/agrep-myersunltd.c                     |  1039 +
 libs/search/agrep-wumanber.c                       |   415 +
 libs/search/debug.h                                |    43 +
 libs/search/fgrep-aho.c                            |   363 +
 libs/search/fgrep-boyermoore.c                     |   462 +
 libs/search/fgrep-dumb.c                           |   326 +
 libs/search/nucstrstr.c                            |  4621 +++
 libs/search/search-priv.h                          |   140 +
 libs/search/search.c                               |   388 +
 libs/search/sw-search.c                            |  1496 +
 libs/sra/.gitignore                                |     1 +
 libs/sra/Makefile                                  |   249 +
 libs/sra/built-in.vschema                          |   580 +
 libs/sra/libsra-schema.vers.h                      |    27 +
 libs/sra/libsradb.vers.h                           |    27 +
 libs/sra/libsrareader.vers.h                       |     1 +
 libs/sra/libsraschema.vers.h                       |     1 +
 libs/sra/libwsradb.vers.h                          |     1 +
 libs/sra/libwsraschema.vers.h                      |     1 +
 libs/sra/reader-abi.c                              |   473 +
 libs/sra/reader-cmn.c                              |   379 +
 libs/sra/reader-cmn.h                              |   161 +
 libs/sra/reader-fastq.c                            |   623 +
 libs/sra/reader-illumina.c                         |   567 +
 libs/sra/reader-sff.c                              |   380 +
 libs/sra/sra-debug.h                               |    42 +
 libs/sra/sra-dflt-schema.c                         |   552 +
 libs/sra/sra-priv.h                                |   183 +
 libs/sra/sra-schema.c                              |  4133 +++
 libs/sra/sracache.c                                |   560 +
 libs/sra/sracol.c                                  |   235 +
 libs/sra/sramgr-cmn.c                              |   572 +
 libs/sra/sramgr.c                                  |   186 +
 libs/sra/sraschema-priv.h                          |    36 +
 libs/sra/sraschema-stub.c                          |    51 +
 libs/sra/sraschema.c                               |    74 +
 libs/sra/sratbl-cmn.c                              |  1458 +
 libs/sra/sratbl.c                                  |   118 +
 libs/sra/types.c                                   |   298 +
 libs/sra/wsramgr.c                                 |   165 +
 libs/sra/wsraschema-stub.c                         |    51 +
 libs/sra/wsratbl.c                                 |   649 +
 libs/sraxf/.gitignore                              |     1 +
 libs/sraxf/Makefile                                |   152 +
 libs/sraxf/bio-start.c                             |   197 +
 libs/sraxf/color-from-dna.c                        |   151 +
 libs/sraxf/denormalize.c                           |   231 +
 libs/sraxf/dna-from-color.c                        |   150 +
 libs/sraxf/dynamic-454-read-descriptor.c           |   303 +
 libs/sraxf/extract-coordinates.c                   |   354 +
 libs/sraxf/extract-name_coord.c                    |   243 +
 libs/sraxf/extract-name_fmt.c                      |   240 +
 libs/sraxf/extract-spot_name.c                     |   105 +
 libs/sraxf/fix_read_seg_impl.h                     |   169 +
 libs/sraxf/format-spot-name.c                      |   333 +
 libs/sraxf/fpcodec.c                               |   267 +
 libs/sraxf/index_lookup.c                          |   270 +
 libs/sraxf/make-position.c                         |   133 +
 libs/sraxf/name-tokenizer.h                        |   121 +
 libs/sraxf/normalize.c                             |   240 +
 libs/sraxf/prefix-tree-to-name.c                   |   162 +
 libs/sraxf/process-position.c                      |   198 +
 libs/sraxf/qstat-trigger.c                         |   256 +
 libs/sraxf/qual4_codec.h                           |    43 +
 libs/sraxf/qual4_decode.c                          |   257 +
 libs/sraxf/qual4_encode.c                          |   232 +
 libs/sraxf/read-desc.c                             |   143 +
 libs/sraxf/read-seg-from-readn.c                   |   361 +
 libs/sraxf/rewrite-spot-name.c                     |   223 +
 libs/sraxf/rotate.c                                |   271 +
 libs/sraxf/spot-desc.c                             |   102 +
 libs/sraxf/stat_mod.c                              |   392 +
 libs/sraxf/stat_mod.h                              |    80 +
 libs/sraxf/stats.c                                 |   764 +
 libs/sraxf/stats_quality.c                         |   132 +
 libs/sraxf/swap.c                                  |   228 +
 libs/sraxf/tokenize-spot_name-454.c                |   122 +
 libs/sraxf/tokenize-spot_name-abi.c                |   146 +
 libs/sraxf/tokenize-spot_name-generic-fastq.c      |    81 +
 libs/sraxf/tokenize-spot_name-helicos.c            |   112 +
 libs/sraxf/tokenize-spot_name-illumina.c           |   151 +
 libs/sraxf/tokenize-spot_name-ion-torrent.c        |   136 +
 libs/sraxf/untyped-priv.h                          |    83 +
 libs/sraxf/untyped.c                               |   378 +
 libs/sraxf/v0-decompress-init.c                    |  2838 ++
 libs/sraxf/v0-decompress-local.h                   |   368 +
 libs/sraxf/v0-decompress.c                         |  1093 +
 libs/sraxf/v0-decompress.h                         |   170 +
 libs/sraxf/v0-funcs.c                              |   337 +
 libs/sraxf/varloc.c                                |   105 +
 libs/svdb/.gitignore                               |     1 +
 libs/svdb/Makefile                                 |    95 +
 libs/svdb/svdb.c                                   |  3215 ++
 libs/tui/Makefile                                  |   137 +
 libs/tui/bsd/systui.c                              |   619 +
 libs/tui/dir_dlg.c                                 |   470 +
 libs/tui/eventring.c                               |   134 +
 libs/tui/eventring.h                               |    74 +
 libs/tui/file_dlg.c                                |   380 +
 libs/tui/line_policy.c                             |   379 +
 libs/tui/line_policy.h                             |    86 +
 libs/tui/linux/systui.c                            |   624 +
 libs/tui/screen.c                                  |   209 +
 libs/tui/screen.h                                  |    75 +
 libs/tui/string_cache.c                            |   378 +
 libs/tui/string_cache.h                            |    54 +
 libs/tui/tui-priv.h                                |    87 +
 libs/tui/tui.c                                     |   380 +
 libs/tui/tui_cpp.cpp                               |   226 +
 libs/tui/tui_dlg.c                                 |  1291 +
 libs/tui/tui_dlg_helper.c                          |   250 +
 libs/tui/tui_menu.c                                |   913 +
 libs/tui/tui_menu.h                                |    49 +
 libs/tui/tui_palette.c                             |   304 +
 libs/tui/tui_std_dlg.c                             |   355 +
 libs/tui/tui_widget.c                              |  1079 +
 libs/tui/tui_widget.h                              |   210 +
 libs/tui/tui_widget_button.c                       |    87 +
 libs/tui/tui_widget_checkbox.c                     |    87 +
 libs/tui/tui_widget_grid.c                         |   488 +
 libs/tui/tui_widget_inputline.c                    |   181 +
 libs/tui/tui_widget_label.c                        |    53 +
 libs/tui/tui_widget_progress.c                     |   120 +
 libs/tui/tui_widget_radiobox.c                     |   130 +
 libs/tui/tui_widget_spin_edit.c                    |   118 +
 libs/tui/tui_widget_string_list.c                  |   183 +
 libs/tui/unix/systui.c                             |    29 +
 libs/vdb/.gitignore                                |     1 +
 libs/vdb/Makefile                                  |   188 +
 libs/vdb/blob-headers.c                            |   726 +
 libs/vdb/blob-headers.h                            |   114 +
 libs/vdb/blob-priv.h                               |   206 +
 libs/vdb/blob.c                                    |  1690 +
 libs/vdb/blob.h                                    |    84 +
 libs/vdb/cast.c                                    |   583 +
 libs/vdb/column-cmn.c                              |   356 +
 libs/vdb/column-priv.h                             |   304 +
 libs/vdb/column.c                                  |    80 +
 libs/vdb/compare.c                                 |   242 +
 libs/vdb/cursor-cmn.c                              |  2910 ++
 libs/vdb/cursor-priv.h                             |   322 +
 libs/vdb/cursor.c                                  |   200 +
 libs/vdb/database-cmn.c                            |   928 +
 libs/vdb/database-depend.c                         |  1807 ++
 libs/vdb/database-load.c                           |   119 +
 libs/vdb/database-priv.h                           |   150 +
 libs/vdb/database.c                                |    29 +
 libs/vdb/dbmgr-cmn.c                               |   943 +
 libs/vdb/dbmgr-priv.h                              |   115 +
 libs/vdb/dbmgr.c                                   |   157 +
 libs/vdb/delta_average.c                           |   298 +
 libs/vdb/environment-read.c                        |   108 +
 libs/vdb/fixed-row-len.c                           |    67 +
 libs/vdb/gen-cast.pl                               |   480 +
 libs/vdb/index_insert.c                            |   150 +
 libs/vdb/index_lookup.c                            |   191 +
 libs/vdb/index_project.c                           |   221 +
 libs/vdb/libvdb.vers.h                             |    27 +
 libs/vdb/linker-cmn.c                              |   656 +
 libs/vdb/linker-int.c                              |   679 +
 libs/vdb/linker-priv.h                             |   272 +
 libs/vdb/linker.c                                  |    45 +
 libs/vdb/merge.c                                   |   215 +
 libs/vdb/meta-append.c                             |   145 +
 libs/vdb/meta-attr-read.c                          |   448 +
 libs/vdb/meta-attr-write.c                         |   529 +
 libs/vdb/meta-read.c                               |   140 +
 libs/vdb/meta-value.c                              |   381 +
 libs/vdb/meta-write.c                              |   155 +
 libs/vdb/page-map.c                                |  1734 ++
 libs/vdb/page-map.h                                |   386 +
 libs/vdb/parameter-read.c                          |   103 +
 libs/vdb/phys-cmn.c                                |   784 +
 libs/vdb/phys-load.c                               |   330 +
 libs/vdb/phys-priv.h                               |   194 +
 libs/vdb/phys.c                                    |    67 +
 libs/vdb/prod-cmn.c                                |  2567 ++
 libs/vdb/prod-expr.c                               |   885 +
 libs/vdb/prod-expr.h                               |   202 +
 libs/vdb/prod-func.c                               |   957 +
 libs/vdb/prod-priv.h                               |   462 +
 libs/vdb/prod.c                                    |   136 +
 libs/vdb/range-validate.c                          |   195 +
 libs/vdb/redimension.c                             |   108 +
 libs/vdb/report-vdb.c                              |   853 +
 libs/vdb/row-id.c                                  |    64 +
 libs/vdb/row-len.c                                 |    65 +
 libs/vdb/schema-db.c                               |   752 +
 libs/vdb/schema-dump.c                             |   683 +
 libs/vdb/schema-dump.h                             |   208 +
 libs/vdb/schema-eval.c                             |  1400 +
 libs/vdb/schema-expr.c                             |  2170 ++
 libs/vdb/schema-expr.h                             |   396 +
 libs/vdb/schema-func.c                             |  1658 +
 libs/vdb/schema-int.c                              |   376 +
 libs/vdb/schema-parse.c                            |   857 +
 libs/vdb/schema-parse.h                            |   607 +
 libs/vdb/schema-priv.h                             |  1308 +
 libs/vdb/schema-prod.c                             |  1005 +
 libs/vdb/schema-tbl.c                              |  2925 ++
 libs/vdb/schema-tok.c                              |    74 +
 libs/vdb/schema-tok.h                              |    61 +
 libs/vdb/schema-type.c                             |  2573 ++
 libs/vdb/schema.c                                  |  1768 ++
 libs/vdb/split.c                                   |   398 +
 libs/vdb/table-cmn.c                               |  1401 +
 libs/vdb/table-load.c                              |   323 +
 libs/vdb/table-priv.h                              |   238 +
 libs/vdb/table.c                                   |   109 +
 libs/vdb/test/Makefile                             |    51 +
 libs/vdb/test/test-prod-cmn.c                      |    10 +
 libs/vdb/transpose.c                               |   720 +
 libs/vdb/wcolumn.c                                 |  1074 +
 libs/vdb/wcursor.c                                 |  1238 +
 libs/vdb/wdatabase.c                               |   680 +
 libs/vdb/wdbmgr.c                                  |   267 +
 libs/vdb/wlinker.c                                 |    98 +
 libs/vdb/wphys.c                                   |   912 +
 libs/vdb/wprod.c                                   |   439 +
 libs/vdb/wtable.c                                  |  1055 +
 libs/vdb/xform-priv.h                              |    83 +
 libs/vfs/Makefile                                  |   102 +
 libs/vfs/keyring.c                                 |   292 +
 libs/vfs/keyring.h                                 |   111 +
 libs/vfs/kurl-stub.c                               |    18 +
 libs/vfs/manager.c                                 |  3519 +++
 libs/vfs/path-priv.h                               |   148 +
 libs/vfs/path.c                                    |  3801 +++
 libs/vfs/resolver-3.0.c                            |   326 +
 libs/vfs/resolver-priv.h                           |   244 +
 libs/vfs/resolver.c                                |  4876 +++
 libs/vfs/srapath-stub.c                            |   372 +
 libs/vfs/srapath.c                                 |  1424 +
 libs/vfs/unix/syskeyring.c                         |   161 +
 libs/vfs/unix/syspath.c                            |   155 +
 libs/vxf/.gitignore                                |     1 +
 libs/vxf/Makefile                                  |   196 +
 libs/vxf/add-row-id.c                              |    80 +
 libs/vxf/bit_or.c                                  |   135 +
 libs/vxf/bunzip.c                                  |   130 +
 libs/vxf/bzip.c                                    |   184 +
 libs/vxf/ceil.c                                    |    48 +
 libs/vxf/checksum.c                                |   566 +
 libs/vxf/clip.c                                    |   200 +
 libs/vxf/cut.c                                     |   227 +
 libs/vxf/delta.c                                   |   108 +
 libs/vxf/deriv.c                                   |   109 +
 libs/vxf/diff.c                                    |   356 +
 libs/vxf/echo.c                                    |   187 +
 libs/vxf/entrez.c                                  |   170 +
 libs/vxf/exists.c                                  |   212 +
 libs/vxf/extract_token.c                           |   105 +
 libs/vxf/floor.c                                   |    49 +
 libs/vxf/fsplit-join.impl.h                        |   136 +
 libs/vxf/funzip.c                                  |   172 +
 libs/vxf/fzip.c                                    |   168 +
 libs/vxf/integral.c                                |   113 +
 libs/vxf/integral_0.c                              |   114 +
 libs/vxf/irzip.c                                   |   564 +
 libs/vxf/irzip.impl.h                              |   482 +
 libs/vxf/iunzip.c                                  |   748 +
 libs/vxf/izip-common.h                             |   195 +
 libs/vxf/izip-decode.impl.h                        |   162 +
 libs/vxf/izip-encode.impl.h                        |   523 +
 libs/vxf/izip.c                                    |   866 +
 libs/vxf/lower-case-tech-reads.c                   |   111 +
 libs/vxf/map.c                                     |  1017 +
 libs/vxf/math-funcs-impl.h                         |   361 +
 libs/vxf/max.c                                     |   175 +
 libs/vxf/min.c                                     |   175 +
 libs/vxf/outlier-decoder.c                         |   113 +
 libs/vxf/outlier-encoder.c                         |   141 +
 libs/vxf/pack.c                                    |    92 +
 libs/vxf/paste.c                                   |   357 +
 libs/vxf/rand_4na_2na.c                            |   200 +
 libs/vxf/rldecode.c                                |   155 +
 libs/vxf/rlencode.c                                |   262 +
 libs/vxf/round.c                                   |    49 +
 libs/vxf/simple-sub-select.c                       |   293 +
 libs/vxf/sprintf.c                                 |  1280 +
 libs/vxf/strtonum.c                                |   354 +
 libs/vxf/subtract-row-id.c                         |    83 +
 libs/vxf/sum.c                                     |   356 +
 libs/vxf/trim.c                                    |   229 +
 libs/vxf/trunc.c                                   |    49 +
 libs/vxf/undelta.c                                 |   108 +
 libs/vxf/unpack.c                                  |   115 +
 libs/vxf/unzip.c                                   |   234 +
 libs/vxf/vec-sum.c                                 |   239 +
 libs/vxf/wgs-tokenize-accession.c                  |   213 +
 libs/vxf/zip.c                                     |   216 +
 libs/wgsxf/Makefile                                |   127 +
 libs/wgsxf/build_read_type.c                       |   113 +
 libs/wgsxf/build_scaffold.c                        |   435 +
 libs/xfs/Makefile                                  |   140 +
 libs/xfs/bogus.c                                   |   373 +
 libs/xfs/common.h                                  |   217 +
 libs/xfs/contnode.c                                |   685 +
 libs/xfs/contnode.h                                |    98 +
 libs/xfs/doc.c                                     |   730 +
 libs/xfs/docnode.c                                 |   745 +
 libs/xfs/editors.c                                 |   491 +
 libs/xfs/encro.c                                   |   875 +
 libs/xfs/encws.c                                   |  1793 ++
 libs/xfs/foo.c                                     |   250 +
 libs/xfs/gap.c                                     |   585 +
 libs/xfs/gapc.c                                    |   993 +
 libs/xfs/gapf.c                                    |   879 +
 libs/xfs/gapk.c                                    |   440 +
 libs/xfs/gapka.c                                   |  1005 +
 libs/xfs/gapks.c                                   |   882 +
 libs/xfs/handle.c                                  |   227 +
 libs/xfs/http.c                                    |  1300 +
 libs/xfs/kfs.c                                     |  2038 ++
 libs/xfs/lockdpt.c                                 |   192 +
 libs/xfs/lockdpt.h                                 |    76 +
 libs/xfs/lreader.c                                 |   459 +
 libs/xfs/lreader.h                                 |   117 +
 libs/xfs/mehr.c                                    |   258 +
 libs/xfs/mehr.h                                    |    77 +
 libs/xfs/model.c                                   |  1157 +
 libs/xfs/ncon.c                                    |   525 +
 libs/xfs/ncon.h                                    |    98 +
 libs/xfs/node.c                                    |   616 +
 libs/xfs/owp.c                                     |   375 +
 libs/xfs/owp.h                                     |    86 +
 libs/xfs/path.c                                    |  1505 +
 libs/xfs/perm.c                                    |   805 +
 libs/xfs/platform.h                                |    51 +
 libs/xfs/readme.c                                  |   193 +
 libs/xfs/schwarzschraube.c                         |   334 +
 libs/xfs/schwarzschraube.h                         |   118 +
 libs/xfs/simcon.c                                  |   214 +
 libs/xfs/spen.c                                    |   963 +
 libs/xfs/spen.h                                    |   121 +
 libs/xfs/tar.c                                     |  1225 +
 libs/xfs/teleport.c                                |   460 +
 libs/xfs/teleport.h                                |   108 +
 libs/xfs/tree.c                                    |   717 +
 libs/xfs/unix/operations.c                         |  2155 ++
 libs/xfs/unix/operations.h                         |    54 +
 libs/xfs/unix/platform.c                           |   359 +
 libs/xfs/unix/security.c                           |    24 +
 libs/xfs/xencro.c                                  |   944 +
 libs/xfs/xencro.h                                  |   118 +
 libs/xfs/xencws.c                                  |  5090 +++
 libs/xfs/xencws.h                                  |    71 +
 libs/xfs/xfs-priv.h                                |   118 +
 libs/xfs/xfs.c                                     |   403 +
 libs/xfs/xgap.c                                    |  1408 +
 libs/xfs/xgap.h                                    |   244 +
 libs/xfs/xgapf.c                                   |  1822 ++
 libs/xfs/xgapf.h                                   |   126 +
 libs/xfs/xgapk.c                                   |  1777 ++
 libs/xfs/xgapk.h                                   |   184 +
 libs/xfs/xhttp.c                                   |  2988 ++
 libs/xfs/xhttp.h                                   |   174 +
 libs/xfs/xlog.c                                    |   295 +
 libs/xfs/xtar.c                                    |  1248 +
 libs/xfs/xtar.h                                    |   160 +
 libs/xfs/zehr.c                                    |  1063 +
 libs/xfs/zehr.h                                    |   266 +
 local-builds.sh                                    |    72 +
 schema_crc.pl                                      |   148 +
 scripts/explain_sam_flags.py                       |    65 -
 scripts/release_picard.sh                          |   152 -
 setup/install                                      |    45 +
 setup/install.perl                                 |  1329 +
 setup/install.prl                                  |     9 +
 setup/konfigure.perl                               |  1762 ++
 setup/os-arch.perl                                 |    22 +
 setup/os-arch.prl                                  |   106 +
 setup/package.prl                                  |    57 +
 setup/s/install                                    |    45 +
 setup/s/os.prl                                     |     2 +
 .../java/htsjdk/samtools/AbstractBAMFileIndex.java |   721 -
 .../htsjdk/samtools/AbstractSAMHeaderRecord.java   |   116 -
 src/main/java/htsjdk/samtools/AlignmentBlock.java  |    58 -
 .../java/htsjdk/samtools/AsyncSAMFileWriter.java   |    59 -
 .../java/htsjdk/samtools/BAMFileConstants.java     |    45 -
 src/main/java/htsjdk/samtools/BAMFileReader.java   |   913 -
 src/main/java/htsjdk/samtools/BAMFileSpan.java     |   268 -
 src/main/java/htsjdk/samtools/BAMFileWriter.java   |   200 -
 src/main/java/htsjdk/samtools/BAMIndex.java        |    67 -
 src/main/java/htsjdk/samtools/BAMIndexContent.java |    69 -
 .../java/htsjdk/samtools/BAMIndexMetaData.java     |   271 -
 src/main/java/htsjdk/samtools/BAMIndexWriter.java  |    54 -
 src/main/java/htsjdk/samtools/BAMIndexer.java      |   313 -
 .../java/htsjdk/samtools/BAMIteratorFilter.java    |    26 -
 .../BAMQueryMultipleIntervalsIteratorFilter.java   |    59 -
 src/main/java/htsjdk/samtools/BAMRecord.java       |   365 -
 src/main/java/htsjdk/samtools/BAMRecordCodec.java  |   210 -
 src/main/java/htsjdk/samtools/BamFileIoUtils.java  |   178 -
 .../java/htsjdk/samtools/BamIndexValidator.java    |   151 -
 src/main/java/htsjdk/samtools/Bin.java             |   162 -
 src/main/java/htsjdk/samtools/BinList.java         |   119 -
 .../java/htsjdk/samtools/BinaryBAMIndexWriter.java |   207 -
 .../java/htsjdk/samtools/BinaryCigarCodec.java     |    89 -
 src/main/java/htsjdk/samtools/BinaryTagCodec.java  |   425 -
 .../java/htsjdk/samtools/BinningIndexBuilder.java  |   187 -
 .../java/htsjdk/samtools/BinningIndexContent.java  |   263 -
 .../java/htsjdk/samtools/BrowseableBAMIndex.java   |    54 -
 src/main/java/htsjdk/samtools/CRAMBAIIndexer.java  |   474 -
 src/main/java/htsjdk/samtools/CRAMCRAIIndexer.java |   135 -
 .../htsjdk/samtools/CRAMContainerStreamWriter.java |   495 -
 src/main/java/htsjdk/samtools/CRAMFileReader.java  |   559 -
 src/main/java/htsjdk/samtools/CRAMFileWriter.java  |   168 -
 src/main/java/htsjdk/samtools/CRAMIterator.java    |   310 -
 .../java/htsjdk/samtools/CachingBAMFileIndex.java  |   169 -
 .../samtools/ChainedDownsamplingIterator.java      |    90 -
 src/main/java/htsjdk/samtools/Chunk.java           |   169 -
 src/main/java/htsjdk/samtools/Cigar.java           |   340 -
 src/main/java/htsjdk/samtools/CigarElement.java    |    75 -
 src/main/java/htsjdk/samtools/CigarOperator.java   |   211 -
 .../samtools/ComparableSamRecordIterator.java      |    89 -
 .../ConstantMemoryDownsamplingIterator.java        |    88 -
 .../samtools/CoordinateSortedPairInfoMap.java      |   297 -
 .../java/htsjdk/samtools/CustomReaderFactory.java  |   143 -
 .../htsjdk/samtools/DefaultSAMRecordFactory.java   |    54 -
 src/main/java/htsjdk/samtools/Defaults.java        |   174 -
 .../htsjdk/samtools/DiskBasedBAMFileIndex.java     |    78 -
 .../java/htsjdk/samtools/DownsamplingIterator.java |   113 -
 .../samtools/DownsamplingIteratorFactory.java      |   118 -
 .../htsjdk/samtools/DuplicateScoringStrategy.java  |   138 -
 src/main/java/htsjdk/samtools/DuplicateSet.java    |   184 -
 .../java/htsjdk/samtools/DuplicateSetIterator.java |   172 -
 .../htsjdk/samtools/FileTruncatedException.java    |    46 -
 src/main/java/htsjdk/samtools/FixBAMFile.java      |    46 -
 .../java/htsjdk/samtools/GenomicIndexUtil.java     |   100 -
 .../samtools/HighAccuracyDownsamplingIterator.java |   196 -
 src/main/java/htsjdk/samtools/LinearIndex.java     |   126 -
 .../htsjdk/samtools/MergingSamRecordIterator.java  |   238 -
 .../samtools/NotPrimarySkippingIterator.java       |    62 -
 src/main/java/htsjdk/samtools/QueryInterval.java   |    96 -
 .../java/htsjdk/samtools/ReservedTagConstants.java |    70 -
 .../SAMBinaryTagAndUnsignedArrayValue.java         |    65 -
 .../java/htsjdk/samtools/SAMBinaryTagAndValue.java |   251 -
 src/main/java/htsjdk/samtools/SAMException.java    |    44 -
 src/main/java/htsjdk/samtools/SAMFileHeader.java   |   399 -
 src/main/java/htsjdk/samtools/SAMFileSource.java   |    68 -
 src/main/java/htsjdk/samtools/SAMFileSpan.java     |    49 -
 src/main/java/htsjdk/samtools/SAMFileWriter.java   |    50 -
 .../java/htsjdk/samtools/SAMFileWriterFactory.java |   505 -
 .../java/htsjdk/samtools/SAMFileWriterImpl.java    |   247 -
 src/main/java/htsjdk/samtools/SAMFlag.java         |   110 -
 .../java/htsjdk/samtools/SAMFormatException.java   |    44 -
 .../htsjdk/samtools/SAMHeaderRecordComparator.java |    68 -
 src/main/java/htsjdk/samtools/SAMLineParser.java   |   487 -
 .../java/htsjdk/samtools/SAMProgramRecord.java     |   132 -
 .../java/htsjdk/samtools/SAMReadGroupRecord.java   |   165 -
 src/main/java/htsjdk/samtools/SAMRecord.java       |  2378 --
 .../java/htsjdk/samtools/SAMRecordComparator.java  |    40 -
 .../samtools/SAMRecordCoordinateComparator.java    |   105 -
 .../samtools/SAMRecordDuplicateComparator.java     |   363 -
 .../java/htsjdk/samtools/SAMRecordFactory.java     |    28 -
 .../java/htsjdk/samtools/SAMRecordIterator.java    |    52 -
 .../samtools/SAMRecordQueryHashComparator.java     |    72 -
 .../samtools/SAMRecordQueryNameComparator.java     |    89 -
 .../java/htsjdk/samtools/SAMRecordSetBuilder.java  |   576 -
 src/main/java/htsjdk/samtools/SAMRecordUtil.java   |    77 -
 .../htsjdk/samtools/SAMSequenceDictionary.java     |   355 -
 .../samtools/SAMSequenceDictionaryCodec.java       |   114 -
 .../java/htsjdk/samtools/SAMSequenceRecord.java    |   248 -
 .../java/htsjdk/samtools/SAMSortOrderChecker.java  |    89 -
 src/main/java/htsjdk/samtools/SAMTag.java          |    82 -
 src/main/java/htsjdk/samtools/SAMTagUtil.java      |   122 -
 src/main/java/htsjdk/samtools/SAMTestUtil.java     |   128 -
 .../java/htsjdk/samtools/SAMTextHeaderCodec.java   |   500 -
 src/main/java/htsjdk/samtools/SAMTextReader.java   |   253 -
 src/main/java/htsjdk/samtools/SAMTextWriter.java   |   221 -
 src/main/java/htsjdk/samtools/SAMTools.java        |   119 -
 src/main/java/htsjdk/samtools/SAMUtils.java        |  1226 -
 .../java/htsjdk/samtools/SAMValidationError.java   |   291 -
 src/main/java/htsjdk/samtools/SQTagUtil.java       |   154 -
 src/main/java/htsjdk/samtools/SRAFileReader.java   |   309 -
 src/main/java/htsjdk/samtools/SRAIndex.java        |   257 -
 src/main/java/htsjdk/samtools/SRAIterator.java     |   256 -
 .../java/htsjdk/samtools/SamFileHeaderMerger.java  |   786 -
 .../java/htsjdk/samtools/SamFileValidator.java     |   872 -
 src/main/java/htsjdk/samtools/SamFiles.java        |    98 -
 src/main/java/htsjdk/samtools/SamFlagField.java    |   203 -
 src/main/java/htsjdk/samtools/SamIndexes.java      |    94 -
 .../java/htsjdk/samtools/SamInputResource.java     |   497 -
 src/main/java/htsjdk/samtools/SamPairUtil.java     |   510 -
 src/main/java/htsjdk/samtools/SamReader.java       |   621 -
 .../java/htsjdk/samtools/SamReaderFactory.java     |   568 -
 src/main/java/htsjdk/samtools/SamStreams.java      |   164 -
 .../SecondaryOrSupplementarySkippingIterator.java  |    41 -
 .../StreamInflatingIndexingOutputStream.java       |   103 -
 .../samtools/TagValueAndUnsignedArrayFlag.java     |    42 -
 src/main/java/htsjdk/samtools/TextCigarCodec.java  |    91 -
 src/main/java/htsjdk/samtools/TextTagCodec.java    |   331 -
 .../htsjdk/samtools/TextualBAMIndexWriter.java     |   185 -
 .../java/htsjdk/samtools/ValidationStringency.java |    21 -
 .../java/htsjdk/samtools/apps/TimeChannel.java     |    58 -
 .../htsjdk/samtools/apps/TimeRandomAccessFile.java |    55 -
 src/main/java/htsjdk/samtools/cram/CRAIEntry.java  |   195 -
 src/main/java/htsjdk/samtools/cram/CRAIIndex.java  |   267 -
 .../java/htsjdk/samtools/cram/CRAMException.java   |    22 -
 .../cram/build/CompressionHeaderFactory.java       |   592 -
 .../samtools/cram/build/ContainerFactory.java      |   215 -
 .../samtools/cram/build/ContainerParser.java       |   221 -
 .../samtools/cram/build/Cram2SamRecordFactory.java |   227 -
 .../samtools/cram/build/CramContainerIterator.java |    77 -
 .../java/htsjdk/samtools/cram/build/CramIO.java    |   343 -
 .../htsjdk/samtools/cram/build/CramNormalizer.java |   347 -
 .../cram/build/CramSpanContainerIterator.java      |   100 -
 .../samtools/cram/build/Sam2CramRecordFactory.java |   374 -
 .../java/htsjdk/samtools/cram/build/Utils.java     |    54 -
 .../samtools/cram/common/CramVersionPolicies.java  |    24 -
 .../htsjdk/samtools/cram/common/CramVersions.java  |    11 -
 .../htsjdk/samtools/cram/common/IntHashMap.java    |   415 -
 .../htsjdk/samtools/cram/common/MutableInt.java    |    27 -
 .../java/htsjdk/samtools/cram/common/Version.java  |    63 -
 .../samtools/cram/digest/AbstractSerialDigest.java |    26 -
 .../samtools/cram/digest/ByteSumCombine.java       |    12 -
 .../java/htsjdk/samtools/cram/digest/Combine.java  |     6 -
 .../samtools/cram/digest/ContentDigests.java       |   217 -
 .../htsjdk/samtools/cram/digest/Crc32Hasher.java   |    42 -
 .../samtools/cram/digest/IntegerSumCombine.java    |    10 -
 .../samtools/cram/digest/MessageDigestHasher.java  |    30 -
 .../java/htsjdk/samtools/cram/digest/SERIES.java   |    34 -
 .../samtools/cram/encoding/AbstractBitCodec.java   |    56 -
 .../samtools/cram/encoding/BetaIntegerCodec.java   |    62 -
 .../cram/encoding/BetaIntegerEncoding.java         |    78 -
 .../htsjdk/samtools/cram/encoding/BitCodec.java    |    97 -
 .../cram/encoding/ByteArrayLenEncoding.java        |   146 -
 .../cram/encoding/ByteArrayStopEncoding.java       |   130 -
 .../htsjdk/samtools/cram/encoding/DataSeries.java  |    49 -
 .../samtools/cram/encoding/DataSeriesMap.java      |    29 -
 .../samtools/cram/encoding/DataSeriesType.java     |    41 -
 .../htsjdk/samtools/cram/encoding/Encoding.java    |    44 -
 .../samtools/cram/encoding/EncodingFactory.java    |   118 -
 .../cram/encoding/ExternalByteArrayCodec.java      |    76 -
 .../cram/encoding/ExternalByteArrayEncoding.java   |    63 -
 .../samtools/cram/encoding/ExternalByteCodec.java  |    64 -
 .../cram/encoding/ExternalByteEncoding.java        |    62 -
 .../samtools/cram/encoding/ExternalCompressor.java |    84 -
 .../cram/encoding/ExternalIntegerCodec.java        |    76 -
 .../cram/encoding/ExternalIntegerEncoding.java     |    62 -
 .../samtools/cram/encoding/ExternalLongCodec.java  |    65 -
 .../cram/encoding/ExternalLongEncoding.java        |    62 -
 .../samtools/cram/encoding/GammaIntegerCodec.java  |    72 -
 .../cram/encoding/GammaIntegerEncoding.java        |    73 -
 .../samtools/cram/encoding/GolombIntegerCodec.java |   101 -
 .../cram/encoding/GolombIntegerEncoding.java       |    80 -
 .../samtools/cram/encoding/GolombLongCodec.java    |   100 -
 .../samtools/cram/encoding/GolombLongEncoding.java |    73 -
 .../cram/encoding/GolombRiceIntegerCodec.java      |    87 -
 .../cram/encoding/GolombRiceIntegerEncoding.java   |    73 -
 .../htsjdk/samtools/cram/encoding/NullCodec.java   |    52 -
 .../samtools/cram/encoding/NullEncoding.java       |    57 -
 .../cram/encoding/SubexponentialIntegerCodec.java  |    99 -
 .../encoding/SubexponentialIntegerEncoding.java    |    78 -
 .../cram/encoding/huffman/HuffmanCode.java         |    99 -
 .../cram/encoding/huffman/HuffmanLeaf.java         |    28 -
 .../cram/encoding/huffman/HuffmanNode.java         |    28 -
 .../cram/encoding/huffman/HuffmanTree.java         |    30 -
 .../huffman/codec/CanonicalHuffmanByteCodec.java   |    70 -
 .../codec/CanonicalHuffmanIntegerCodec.java        |    59 -
 .../encoding/huffman/codec/HuffmanBitCode.java     |    29 -
 .../huffman/codec/HuffmanByteEncoding.java         |    91 -
 .../encoding/huffman/codec/HuffmanByteHelper.java  |   178 -
 .../encoding/huffman/codec/HuffmanIntHelper.java   |   178 -
 .../huffman/codec/HuffmanIntegerEncoding.java      |   100 -
 .../huffman/codec/HuffmanParamsCalculator.java     |   137 -
 .../samtools/cram/encoding/rans/Constants.java     |     7 -
 .../htsjdk/samtools/cram/encoding/rans/D04.java    |    86 -
 .../htsjdk/samtools/cram/encoding/rans/D14.java    |    71 -
 .../samtools/cram/encoding/rans/Decoding.java      |    93 -
 .../htsjdk/samtools/cram/encoding/rans/E04.java    |    59 -
 .../htsjdk/samtools/cram/encoding/rans/E14.java    |    88 -
 .../samtools/cram/encoding/rans/Encoding.java      |    73 -
 .../samtools/cram/encoding/rans/Frequencies.java   |   331 -
 .../htsjdk/samtools/cram/encoding/rans/RANS.java   |   172 -
 .../htsjdk/samtools/cram/encoding/rans/Utils.java  |    34 -
 .../cram/encoding/reader/AbstractReader.java       |   131 -
 .../cram/encoding/reader/CramRecordReader.java     |   212 -
 .../samtools/cram/encoding/reader/DataReader.java  |    44 -
 .../cram/encoding/reader/DataReaderFactory.java    |   228 -
 .../cram/encoding/reader/RefSeqIdReader.java       |   242 -
 .../encoding/readfeatures/BaseQualityScore.java    |    76 -
 .../samtools/cram/encoding/readfeatures/Bases.java |    76 -
 .../cram/encoding/readfeatures/Deletion.java       |    77 -
 .../cram/encoding/readfeatures/HardClip.java       |    75 -
 .../cram/encoding/readfeatures/InsertBase.java     |    77 -
 .../cram/encoding/readfeatures/Insertion.java      |    75 -
 .../cram/encoding/readfeatures/Padding.java        |    76 -
 .../cram/encoding/readfeatures/ReadBase.java       |    89 -
 .../cram/encoding/readfeatures/ReadFeature.java    |    36 -
 .../cram/encoding/readfeatures/RefSkip.java        |    76 -
 .../cram/encoding/readfeatures/Scores.java         |    79 -
 .../cram/encoding/readfeatures/SoftClip.java       |    77 -
 .../cram/encoding/readfeatures/Substitution.java   |   110 -
 .../samtools/cram/encoding/writer/DataWriter.java  |    41 -
 .../cram/encoding/writer/DataWriterFactory.java    |   109 -
 .../samtools/cram/encoding/writer/Writer.java      |   270 -
 .../htsjdk/samtools/cram/io/BitInputStream.java    |    51 -
 .../htsjdk/samtools/cram/io/BitOutputStream.java   |    73 -
 .../htsjdk/samtools/cram/io/CRC32InputStream.java  |    77 -
 .../htsjdk/samtools/cram/io/CRC32OutputStream.java |    55 -
 .../samtools/cram/io/CountingInputStream.java      |    83 -
 .../java/htsjdk/samtools/cram/io/CramArray.java    |    41 -
 src/main/java/htsjdk/samtools/cram/io/CramInt.java |    78 -
 .../samtools/cram/io/DefaultBitInputStream.java    |   115 -
 .../samtools/cram/io/DefaultBitOutputStream.java   |   178 -
 .../cram/io/ExposedByteArrayOutputStream.java      |    26 -
 .../samtools/cram/io/ExternalCompression.java      |   152 -
 src/main/java/htsjdk/samtools/cram/io/ITF8.java    |   186 -
 .../htsjdk/samtools/cram/io/InputStreamUtils.java  |    80 -
 src/main/java/htsjdk/samtools/cram/io/LTF8.java    |   193 -
 .../htsjdk/samtools/cram/lossy/BaseCategory.java   |    57 -
 .../samtools/cram/lossy/BaseCategoryType.java      |    30 -
 .../java/htsjdk/samtools/cram/lossy/Binning.java   |    76 -
 .../samtools/cram/lossy/PreservationPolicy.java    |    42 -
 .../cram/lossy/QualityScorePreservation.java       |   410 -
 .../samtools/cram/lossy/QualityScoreTreatment.java |    47 -
 .../cram/lossy/QualityScoreTreatmentType.java      |    22 -
 .../htsjdk/samtools/cram/lossy/ReadCategory.java   |    50 -
 .../samtools/cram/lossy/ReadCategoryType.java      |    29 -
 .../samtools/cram/ref/CRAMReferenceSource.java     |    22 -
 .../htsjdk/samtools/cram/ref/EnaRefService.java    |   122 -
 .../cram/ref/InMemoryReferenceSequenceFile.java    |   102 -
 .../htsjdk/samtools/cram/ref/ReferenceRegion.java  |    93 -
 .../htsjdk/samtools/cram/ref/ReferenceSource.java  |   280 -
 .../htsjdk/samtools/cram/ref/ReferenceTracks.java  |   172 -
 .../samtools/cram/structure/AlignmentSpan.java     |    92 -
 .../java/htsjdk/samtools/cram/structure/Block.java |   323 -
 .../cram/structure/BlockCompressionMethod.java     |    22 -
 .../samtools/cram/structure/BlockContentType.java  |    22 -
 .../samtools/cram/structure/CompressionHeader.java |   299 -
 .../htsjdk/samtools/cram/structure/Container.java  |    81 -
 .../samtools/cram/structure/ContainerHeaderIO.java |    96 -
 .../samtools/cram/structure/ContainerIO.java       |   237 -
 .../cram/structure/CramCompressionRecord.java      |   348 -
 .../htsjdk/samtools/cram/structure/CramHeader.java |   123 -
 .../htsjdk/samtools/cram/structure/EncodingID.java |    64 -
 .../samtools/cram/structure/EncodingKey.java       |    40 -
 .../samtools/cram/structure/EncodingParams.java    |    39 -
 .../htsjdk/samtools/cram/structure/ReadTag.java    |   487 -
 .../java/htsjdk/samtools/cram/structure/Slice.java |   245 -
 .../htsjdk/samtools/cram/structure/SliceIO.java    |   153 -
 .../cram/structure/SubstitutionMatrix.java         |   179 -
 .../htsjdk/samtools/example/ExampleSamUsage.java   |   118 -
 .../htsjdk/samtools/example/PrintReadsExample.java |    98 -
 .../htsjdk/samtools/fastq/AsyncFastqWriter.java    |    20 -
 .../htsjdk/samtools/fastq/BasicFastqWriter.java    |    89 -
 .../java/htsjdk/samtools/fastq/FastqConstants.java |    49 -
 .../java/htsjdk/samtools/fastq/FastqReader.java    |   199 -
 .../java/htsjdk/samtools/fastq/FastqRecord.java    |   124 -
 .../java/htsjdk/samtools/fastq/FastqWriter.java    |    13 -
 .../htsjdk/samtools/fastq/FastqWriterFactory.java  |    31 -
 .../samtools/filter/AbstractJavascriptFilter.java  |   159 -
 .../htsjdk/samtools/filter/AggregateFilter.java    |    79 -
 .../java/htsjdk/samtools/filter/AlignedFilter.java |    87 -
 .../samtools/filter/DuplicateReadFilter.java       |    52 -
 .../filter/FailsVendorReadQualityFilter.java       |    57 -
 .../htsjdk/samtools/filter/FilteringIterator.java  |    53 -
 .../samtools/filter/FilteringSamIterator.java      |   155 -
 .../htsjdk/samtools/filter/InsertSizeFilter.java   |    31 -
 .../htsjdk/samtools/filter/IntervalFilter.java     |   102 -
 .../samtools/filter/IntervalKeepPairFilter.java    |   108 -
 .../samtools/filter/JavascriptSamRecordFilter.java |   101 -
 .../samtools/filter/MappingQualityFilter.java      |    25 -
 .../samtools/filter/NotPrimaryAlignmentFilter.java |    54 -
 .../samtools/filter/OverclippedReadFilter.java     |    76 -
 .../htsjdk/samtools/filter/ReadNameFilter.java     |   120 -
 .../htsjdk/samtools/filter/SamRecordFilter.java    |    53 -
 .../samtools/filter/SecondaryAlignmentFilter.java  |    20 -
 .../filter/SecondaryOrSupplementaryFilter.java     |    32 -
 .../htsjdk/samtools/filter/SolexaNoiseFilter.java  |    66 -
 .../java/htsjdk/samtools/filter/TagFilter.java     |    85 -
 .../samtools/filter/WholeReadClippedFilter.java    |    64 -
 src/main/java/htsjdk/samtools/liftover/Chain.java  |   414 -
 .../java/htsjdk/samtools/liftover/LiftOver.java    |   319 -
 src/main/java/htsjdk/samtools/metrics/Header.java  |    43 -
 .../java/htsjdk/samtools/metrics/MetricBase.java   |   125 -
 .../java/htsjdk/samtools/metrics/MetricsFile.java  |   594 -
 .../java/htsjdk/samtools/metrics/StringHeader.java |    72 -
 .../htsjdk/samtools/metrics/VersionHeader.java     |    81 -
 .../reference/AbstractFastaSequenceFile.java       |   158 -
 .../samtools/reference/FastaSequenceFile.java      |   172 -
 .../samtools/reference/FastaSequenceIndex.java     |   323 -
 .../reference/IndexedFastaSequenceFile.java        |   328 -
 .../samtools/reference/ReferenceSequence.java      |    84 -
 .../samtools/reference/ReferenceSequenceFile.java  |    90 -
 .../reference/ReferenceSequenceFileFactory.java    |   136 -
 .../reference/ReferenceSequenceFileWalker.java     |   111 -
 .../seekablestream/ByteArraySeekableStream.java    |    99 -
 .../seekablestream/ISeekableStreamFactory.java     |    33 -
 .../seekablestream/SeekableBufferedStream.java     |   132 -
 .../samtools/seekablestream/SeekableFTPStream.java |   120 -
 .../seekablestream/SeekableFTPStreamHelper.java    |   166 -
 .../seekablestream/SeekableFileStream.java         |   128 -
 .../seekablestream/SeekableHTTPStream.java         |   186 -
 .../seekablestream/SeekableMemoryStream.java       |    64 -
 .../seekablestream/SeekablePathStream.java         |   121 -
 .../samtools/seekablestream/SeekableStream.java    |    69 -
 .../seekablestream/SeekableStreamFactory.java      |    97 -
 .../samtools/seekablestream/UserPasswordInput.java |    31 -
 .../java/htsjdk/samtools/sra/ReferenceCache.java   |    46 -
 .../java/htsjdk/samtools/sra/SRAAccession.java     |   177 -
 .../htsjdk/samtools/sra/SRAAlignmentIterator.java  |   209 -
 .../samtools/sra/SRAIndexedSequenceFile.java       |   112 -
 .../java/htsjdk/samtools/sra/SRALazyRecord.java    |  1056 -
 .../samtools/sra/SRAUnalignmentIterator.java       |   181 -
 src/main/java/htsjdk/samtools/sra/SRAUtils.java    |    83 -
 .../htsjdk/samtools/util/AbstractAsyncWriter.java  |   137 -
 .../htsjdk/samtools/util/AbstractIterator.java     |    85 -
 .../htsjdk/samtools/util/AbstractLocusInfo.java    |   146 -
 .../samtools/util/AbstractLocusIterator.java       |   572 -
 .../samtools/util/AbstractProgressLogger.java      |   119 -
 .../samtools/util/AbstractRecordAndOffset.java     |   130 -
 .../java/htsjdk/samtools/util/AsciiWriter.java     |    83 -
 .../samtools/util/AsyncBufferedIterator.java       |   281 -
 .../java/htsjdk/samtools/util/BinaryCodec.java     |   670 -
 .../util/BlockCompressedFilePointerUtil.java       |   101 -
 .../samtools/util/BlockCompressedInputStream.java  |   513 -
 .../samtools/util/BlockCompressedOutputStream.java |   392 -
 .../util/BlockCompressedStreamConstants.java       |   118 -
 .../java/htsjdk/samtools/util/BlockGunzipper.java  |   132 -
 .../htsjdk/samtools/util/BufferedLineReader.java   |   115 -
 src/main/java/htsjdk/samtools/util/CigarUtil.java  |   294 -
 .../htsjdk/samtools/util/CloseableIterator.java    |    63 -
 src/main/java/htsjdk/samtools/util/CloserUtil.java |    81 -
 src/main/java/htsjdk/samtools/util/CodeUtil.java   |    14 -
 .../java/htsjdk/samtools/util/CollectionUtil.java  |   191 -
 .../java/htsjdk/samtools/util/ComparableTuple.java |    28 -
 src/main/java/htsjdk/samtools/util/CoordMath.java  |    76 -
 .../htsjdk/samtools/util/CoordSpanInputSteam.java  |   100 -
 .../samtools/util/CustomGzipOutputStream.java      |    24 -
 src/main/java/htsjdk/samtools/util/DateParser.java |   337 -
 .../htsjdk/samtools/util/DelegatingIterator.java   |    35 -
 .../java/htsjdk/samtools/util/DiskBackedQueue.java |   406 -
 .../htsjdk/samtools/util/EdgeReadIterator.java     |   228 -
 .../samtools/util/EdgingRecordAndOffset.java       |   219 -
 .../java/htsjdk/samtools/util/FastLineReader.java  |   171 -
 .../htsjdk/samtools/util/FastqQualityFormat.java   |    36 -
 .../samtools/util/FileAppendStreamLRUCache.java    |    78 -
 src/main/java/htsjdk/samtools/util/FormatUtil.java |   203 -
 src/main/java/htsjdk/samtools/util/Histogram.java  |   567 -
 src/main/java/htsjdk/samtools/util/HttpUtils.java  |    80 -
 src/main/java/htsjdk/samtools/util/IOUtil.java     |   946 -
 src/main/java/htsjdk/samtools/util/Interval.java   |   202 -
 .../java/htsjdk/samtools/util/IntervalList.java    |   790 -
 .../util/IntervalListReferenceSequenceMask.java    |   125 -
 .../java/htsjdk/samtools/util/IntervalTree.java    |  1227 -
 .../java/htsjdk/samtools/util/IntervalTreeMap.java |   331 -
 .../java/htsjdk/samtools/util/IntervalUtil.java    |    76 -
 .../java/htsjdk/samtools/util/Iso8601Date.java     |    65 -
 .../java/htsjdk/samtools/util/IterableAdapter.java |    29 -
 .../htsjdk/samtools/util/IterableOnceIterator.java |    42 -
 src/main/java/htsjdk/samtools/util/Iterables.java  |    24 -
 src/main/java/htsjdk/samtools/util/Lazy.java       |    40 -
 src/main/java/htsjdk/samtools/util/LineReader.java |    51 -
 src/main/java/htsjdk/samtools/util/ListMap.java    |    48 -
 src/main/java/htsjdk/samtools/util/Locatable.java  |    25 -
 .../java/htsjdk/samtools/util/LocationAware.java   |    26 -
 src/main/java/htsjdk/samtools/util/Locus.java      |    36 -
 .../java/htsjdk/samtools/util/LocusComparator.java |    41 -
 src/main/java/htsjdk/samtools/util/LocusImpl.java  |    49 -
 src/main/java/htsjdk/samtools/util/Log.java        |   214 -
 .../samtools/util/Md5CalculatingInputStream.java   |   133 -
 .../samtools/util/Md5CalculatingOutputStream.java  |   119 -
 .../java/htsjdk/samtools/util/MergingIterator.java |   145 -
 src/main/java/htsjdk/samtools/util/Murmur3.java    |   119 -
 .../java/htsjdk/samtools/util/OverlapDetector.java |   193 -
 .../java/htsjdk/samtools/util/PeekIterator.java    |    85 -
 .../htsjdk/samtools/util/PeekableIterator.java     |    79 -
 .../samtools/util/PositionalOutputStream.java      |    65 -
 .../java/htsjdk/samtools/util/ProcessExecutor.java |   243 -
 .../java/htsjdk/samtools/util/ProgressLogger.java  |    52 -
 .../samtools/util/ProgressLoggerInterface.java     |    38 -
 .../samtools/util/QualityEncodingDetector.java     |   405 -
 .../java/htsjdk/samtools/util/QualityUtil.java     |    77 -
 .../samtools/util/ReferenceSequenceMask.java       |    55 -
 .../htsjdk/samtools/util/RelativeIso8601Date.java  |   203 -
 .../htsjdk/samtools/util/ResourceLimitedMap.java   |   105 -
 .../samtools/util/ResourceLimitedMapFunctor.java   |    47 -
 .../htsjdk/samtools/util/RuntimeEOFException.java  |    46 -
 .../htsjdk/samtools/util/RuntimeIOException.java   |    46 -
 .../samtools/util/RuntimeScriptException.java      |    45 -
 .../htsjdk/samtools/util/SamLocusIterator.java     |   292 -
 .../util/SamRecordIntervalIteratorFactory.java     |   157 -
 .../samtools/util/SamRecordTrackingBuffer.java     |   321 -
 .../htsjdk/samtools/util/SamRecordWithOrdinal.java |    56 -
 .../java/htsjdk/samtools/util/SequenceUtil.java    |  1031 -
 .../java/htsjdk/samtools/util/SnappyLoader.java    |   127 -
 .../samtools/util/SolexaQualityConverter.java      |   129 -
 .../htsjdk/samtools/util/SortingCollection.java    |   514 -
 .../samtools/util/SortingLongCollection.java       |   349 -
 src/main/java/htsjdk/samtools/util/StopWatch.java  |    76 -
 .../htsjdk/samtools/util/StringLineReader.java     |    99 -
 src/main/java/htsjdk/samtools/util/StringUtil.java |   603 -
 .../htsjdk/samtools/util/TempStreamFactory.java    |    83 -
 src/main/java/htsjdk/samtools/util/TestUtil.java   |    98 -
 .../java/htsjdk/samtools/util/TrimmingUtil.java    |    67 -
 src/main/java/htsjdk/samtools/util/Tuple.java      |    41 -
 .../util/WholeGenomeReferenceSequenceMask.java     |    80 -
 .../java/htsjdk/samtools/util/ftp/FTPClient.java   |   240 -
 .../java/htsjdk/samtools/util/ftp/FTPReply.java    |   113 -
 .../java/htsjdk/samtools/util/ftp/FTPStream.java   |    53 -
 .../java/htsjdk/samtools/util/ftp/FTPUtils.java    |   154 -
 .../htsjdk/samtools/util/zip/DeflaterFactory.java  |    48 -
 .../java/htsjdk/tribble/AbstractFeatureCodec.java  |    50 -
 .../java/htsjdk/tribble/AbstractFeatureReader.java |   193 -
 .../java/htsjdk/tribble/AsciiFeatureCodec.java     |    92 -
 .../java/htsjdk/tribble/BinaryFeatureCodec.java    |    52 -
 .../htsjdk/tribble/CloseableTribbleIterator.java   |    27 -
 src/main/java/htsjdk/tribble/Feature.java          |    43 -
 src/main/java/htsjdk/tribble/FeatureCodec.java     |   136 -
 .../java/htsjdk/tribble/FeatureCodecHeader.java    |    83 -
 src/main/java/htsjdk/tribble/FeatureReader.java    |    41 -
 src/main/java/htsjdk/tribble/NameAwareCodec.java   |    37 -
 src/main/java/htsjdk/tribble/SimpleFeature.java    |    53 -
 .../java/htsjdk/tribble/TabixFeatureReader.java    |   217 -
 src/main/java/htsjdk/tribble/Tribble.java          |   100 -
 src/main/java/htsjdk/tribble/TribbleException.java |   139 -
 .../tribble/TribbleIndexedFeatureReader.java       |   573 -
 .../java/htsjdk/tribble/annotation/Strand.java     |    52 -
 src/main/java/htsjdk/tribble/bed/BEDCodec.java     |   242 -
 src/main/java/htsjdk/tribble/bed/BEDFeature.java   |    55 -
 .../java/htsjdk/tribble/bed/FullBEDFeature.java    |   433 -
 .../java/htsjdk/tribble/bed/SimpleBEDFeature.java  |   140 -
 .../java/htsjdk/tribble/example/CountRecords.java  |   200 -
 .../htsjdk/tribble/example/ExampleBinaryCodec.java |   128 -
 .../java/htsjdk/tribble/example/IndexToTable.java  |    72 -
 .../htsjdk/tribble/example/IndicesAreEqual.java    |    76 -
 .../tribble/example/ProfileIndexReading.java       |    66 -
 .../exception/CodecLineParsingException.java       |    50 -
 .../tribble/exception/UnsortedFileException.java   |    45 -
 .../htsjdk/tribble/gelitext/DiploidGenotype.java   |    66 -
 .../htsjdk/tribble/gelitext/GeliTextCodec.java     |   117 -
 .../htsjdk/tribble/gelitext/GeliTextFeature.java   |   148 -
 .../java/htsjdk/tribble/index/AbstractIndex.java   |   451 -
 src/main/java/htsjdk/tribble/index/Block.java      |    82 -
 src/main/java/htsjdk/tribble/index/ChrIndex.java   |    55 -
 .../htsjdk/tribble/index/DynamicIndexCreator.java  |   209 -
 src/main/java/htsjdk/tribble/index/Index.java      |    99 -
 .../java/htsjdk/tribble/index/IndexCreator.java    |    57 -
 .../java/htsjdk/tribble/index/IndexFactory.java    |   515 -
 .../java/htsjdk/tribble/index/MutableIndex.java    |    36 -
 .../htsjdk/tribble/index/TribbleIndexCreator.java  |    53 -
 .../htsjdk/tribble/index/interval/Interval.java    |   115 -
 .../index/interval/IntervalIndexCreator.java       |   159 -
 .../tribble/index/interval/IntervalTree.java       |   551 -
 .../tribble/index/interval/IntervalTreeIndex.java  |   214 -
 .../htsjdk/tribble/index/linear/LinearIndex.java   |   434 -
 .../tribble/index/linear/LinearIndexCreator.java   |   126 -
 .../htsjdk/tribble/index/tabix/TabixFormat.java    |   109 -
 .../htsjdk/tribble/index/tabix/TabixIndex.java     |   366 -
 .../tribble/index/tabix/TabixIndexCreator.java     |   202 -
 .../htsjdk/tribble/readers/AsciiLineReader.java    |   185 -
 .../tribble/readers/AsciiLineReaderIterator.java   |   101 -
 .../java/htsjdk/tribble/readers/LineIterator.java  |    12 -
 .../htsjdk/tribble/readers/LineIteratorImpl.java   |    34 -
 .../java/htsjdk/tribble/readers/LineReader.java    |    43 -
 .../htsjdk/tribble/readers/LineReaderUtil.java     |    56 -
 .../tribble/readers/LongLineBufferedReader.java    |   490 -
 .../java/htsjdk/tribble/readers/Positional.java    |    60 -
 .../tribble/readers/PositionalBufferedStream.java  |   229 -
 .../tribble/readers/SynchronousLineReader.java     |    61 -
 .../tribble/readers/TabixIteratorLineReader.java   |    54 -
 .../java/htsjdk/tribble/readers/TabixReader.java   |   526 -
 src/main/java/htsjdk/tribble/readme.txt            |     1 -
 src/main/java/htsjdk/tribble/util/FTPHelper.java   |    55 -
 src/main/java/htsjdk/tribble/util/HTTPHelper.java  |   152 -
 .../tribble/util/LittleEndianInputStream.java      |   144 -
 .../tribble/util/LittleEndianOutputStream.java     |   120 -
 src/main/java/htsjdk/tribble/util/MathUtils.java   |    66 -
 .../java/htsjdk/tribble/util/ParsingUtils.java     |   478 -
 .../java/htsjdk/tribble/util/RemoteURLHelper.java  |    55 -
 src/main/java/htsjdk/tribble/util/TabixUtils.java  |   115 -
 src/main/java/htsjdk/tribble/util/URLHelper.java   |    56 -
 .../util/popgen/HardyWeinbergCalculation.java      |   149 -
 src/main/java/htsjdk/variant/bcf2/BCF2Codec.java   |   491 -
 src/main/java/htsjdk/variant/bcf2/BCF2Decoder.java |   362 -
 .../variant/bcf2/BCF2GenotypeFieldDecoders.java    |   278 -
 .../variant/bcf2/BCF2LazyGenotypesDecoder.java     |    99 -
 src/main/java/htsjdk/variant/bcf2/BCF2Type.java    |   214 -
 src/main/java/htsjdk/variant/bcf2/BCF2Utils.java   |   336 -
 src/main/java/htsjdk/variant/bcf2/BCFVersion.java  |   105 -
 .../variant/example/PrintVariantsExample.java      |   103 -
 .../java/htsjdk/variant/utils/GeneralUtils.java    |   246 -
 .../utils/SAMSequenceDictionaryExtractor.java      |   137 -
 .../java/htsjdk/variant/variantcontext/Allele.java |   546 -
 .../htsjdk/variant/variantcontext/CommonInfo.java  |   341 -
 .../variant/variantcontext/FastGenotype.java       |   173 -
 .../htsjdk/variant/variantcontext/Genotype.java    |   670 -
 .../variant/variantcontext/GenotypeBuilder.java    |   421 -
 .../variantcontext/GenotypeJEXLContext.java        |    59 -
 .../variantcontext/GenotypeLikelihoods.java        |   578 -
 .../variant/variantcontext/GenotypeType.java       |    47 -
 .../variant/variantcontext/GenotypesContext.java   |   719 -
 .../htsjdk/variant/variantcontext/JEXLMap.java     |   228 -
 .../variantcontext/JexlMissingValueTreatment.java  |    39 -
 .../variantcontext/LazyGenotypesContext.java       |   226 -
 .../variantcontext/StructuralVariantType.java      |    47 -
 .../variant/variantcontext/VariantContext.java     |  1734 --
 .../variantcontext/VariantContextBuilder.java      |   498 -
 .../variantcontext/VariantContextComparator.java   |   105 -
 .../variantcontext/VariantContextUtils.java        |   483 -
 .../variant/variantcontext/VariantJEXLContext.java |   102 -
 .../variantcontext/filter/CompoundFilter.java      |    74 -
 .../variantcontext/filter/FilteringIterator.java   |    47 -
 .../filter/FilteringVariantContextIterator.java    |   127 -
 .../filter/GenotypeQualityFilter.java              |    79 -
 .../filter/HeterozygosityFilter.java               |    84 -
 .../filter/JavascriptVariantFilter.java            |    97 -
 .../filter/PassingVariantFilter.java               |    44 -
 .../variant/variantcontext/filter/SnpFilter.java   |    44 -
 .../filter/VariantContextFilter.java               |    43 -
 .../writer/AsyncVariantContextWriter.java          |    54 -
 .../variant/variantcontext/writer/BCF2Encoder.java |   261 -
 .../variantcontext/writer/BCF2FieldEncoder.java    |   455 -
 .../variantcontext/writer/BCF2FieldWriter.java     |   323 -
 .../writer/BCF2FieldWriterManager.java             |   180 -
 .../variant/variantcontext/writer/BCF2Writer.java  |   443 -
 .../writer/IndexingVariantContextWriter.java       |   180 -
 .../writer/IntGenotypeFieldAccessors.java          |    97 -
 .../variant/variantcontext/writer/Options.java     |    41 -
 .../writer/SortingVariantContextWriter.java        |    66 -
 .../writer/SortingVariantContextWriterBase.java    |   201 -
 .../variant/variantcontext/writer/VCFWriter.java   |   231 -
 .../writer/VariantContextWriter.java               |    51 -
 .../writer/VariantContextWriterBuilder.java        |   537 -
 .../writer/VariantContextWriterFactory.java        |   282 -
 .../java/htsjdk/variant/vcf/AbstractVCFCodec.java  |   791 -
 src/main/java/htsjdk/variant/vcf/VCF3Codec.java    |   134 -
 src/main/java/htsjdk/variant/vcf/VCFCodec.java     |   161 -
 .../htsjdk/variant/vcf/VCFCompoundHeaderLine.java  |   301 -
 src/main/java/htsjdk/variant/vcf/VCFConstants.java |   130 -
 .../htsjdk/variant/vcf/VCFContigHeaderLine.java    |   118 -
 src/main/java/htsjdk/variant/vcf/VCFEncoder.java   |   382 -
 .../java/htsjdk/variant/vcf/VCFFileReader.java     |   153 -
 .../htsjdk/variant/vcf/VCFFilterHeaderLine.java    |    79 -
 .../htsjdk/variant/vcf/VCFFormatHeaderLine.java    |    63 -
 src/main/java/htsjdk/variant/vcf/VCFHeader.java    |   574 -
 .../java/htsjdk/variant/vcf/VCFHeaderLine.java     |   174 -
 .../htsjdk/variant/vcf/VCFHeaderLineCount.java     |    33 -
 .../variant/vcf/VCFHeaderLineTranslator.java       |   183 -
 .../java/htsjdk/variant/vcf/VCFHeaderLineType.java |    33 -
 .../java/htsjdk/variant/vcf/VCFHeaderVersion.java  |   138 -
 .../java/htsjdk/variant/vcf/VCFIDHeaderLine.java   |    31 -
 .../java/htsjdk/variant/vcf/VCFInfoHeaderLine.java |    61 -
 .../java/htsjdk/variant/vcf/VCFRecordCodec.java    |    64 -
 .../htsjdk/variant/vcf/VCFSimpleHeaderLine.java    |   127 -
 .../htsjdk/variant/vcf/VCFStandardHeaderLines.java |   233 -
 src/main/java/htsjdk/variant/vcf/VCFUtils.java     |   209 -
 .../htsjdk/cram/io/ExternalCompressionTest.java    |    30 -
 .../htsjdk/samtools/AbstractBAMFileIndexTest.java  |    62 -
 .../java/htsjdk/samtools/BAMCigarOverflowTest.java |    29 -
 .../java/htsjdk/samtools/BAMFileIndexTest.java     |   527 -
 .../java/htsjdk/samtools/BAMFileWriterTest.java    |   192 -
 .../java/htsjdk/samtools/BAMIndexWriterTest.java   |   227 -
 src/test/java/htsjdk/samtools/BAMIteratorTest.java |    71 -
 ...AMQueryMultipleIntervalsIteratorFilterTest.java |   146 -
 .../java/htsjdk/samtools/BAMRemoteFileTest.java    |   327 -
 src/test/java/htsjdk/samtools/BinTest.java         |    39 -
 .../java/htsjdk/samtools/CRAMBAIIndexerTest.java   |    87 -
 .../java/htsjdk/samtools/CRAMCRAIIndexerTest.java  |   183 -
 .../java/htsjdk/samtools/CRAMComplianceTest.java   |   150 -
 .../samtools/CRAMContainerStreamWriterTest.java    |   184 -
 .../java/htsjdk/samtools/CRAMEdgeCasesTest.java    |   158 -
 .../java/htsjdk/samtools/CRAMFileBAIIndexTest.java |   301 -
 .../htsjdk/samtools/CRAMFileCRAIIndexTest.java     |   368 -
 .../java/htsjdk/samtools/CRAMFileReaderTest.java   |   231 -
 .../java/htsjdk/samtools/CRAMFileWriterTest.java   |   282 -
 .../samtools/CRAMFileWriterWithIndexTest.java      |   209 -
 .../java/htsjdk/samtools/CRAMIndexQueryTest.java   |   708 -
 src/test/java/htsjdk/samtools/ChunkTest.java       |    78 -
 src/test/java/htsjdk/samtools/CigarCodecTest.java  |   110 -
 src/test/java/htsjdk/samtools/CigarTest.java       |   118 -
 .../htsjdk/samtools/DownsamplingIteratorTests.java |    87 -
 .../htsjdk/samtools/DuplicateSetIteratorTest.java  |    63 -
 .../java/htsjdk/samtools/GenomicIndexUtilTest.java |    50 -
 ...MergingSamRecordIteratorGroupCollisionTest.java |   528 -
 .../samtools/MergingSamRecordIteratorTest.java     |   312 -
 .../htsjdk/samtools/ProgramRecordChainingTest.java |    57 -
 .../samtools/SAMBinaryTagAndValueUnitTest.java     |   183 -
 src/test/java/htsjdk/samtools/SAMCloneTest.java    |    52 -
 .../htsjdk/samtools/SAMFileWriterFactoryTest.java  |   307 -
 src/test/java/htsjdk/samtools/SAMFlagTest.java     |    42 -
 .../java/htsjdk/samtools/SAMIntegerTagTest.java    |   375 -
 .../samtools/SAMRecordDuplicateComparatorTest.java |   233 -
 .../java/htsjdk/samtools/SAMRecordUnitTest.java    |  1041 -
 .../samtools/SAMSequenceDictionaryCodecTest.java   |   122 -
 .../htsjdk/samtools/SAMSequenceDictionaryTest.java |   147 -
 .../java/htsjdk/samtools/SAMTextReaderTest.java    |   137 -
 .../java/htsjdk/samtools/SAMTextWriterTest.java    |   130 -
 src/test/java/htsjdk/samtools/SAMUtilsTest.java    |   250 -
 .../htsjdk/samtools/SamFileHeaderMergerTest.java   |   265 -
 src/test/java/htsjdk/samtools/SamFilesTest.java    |    91 -
 .../java/htsjdk/samtools/SamFlagFieldTest.java     |   150 -
 .../samtools/SamHeaderRecordComparatorTest.java    |    72 -
 src/test/java/htsjdk/samtools/SamIndexesTest.java  |   193 -
 src/test/java/htsjdk/samtools/SamPairUtilTest.java |   251 -
 .../java/htsjdk/samtools/SamReaderFactoryTest.java |   468 -
 .../java/htsjdk/samtools/SamReaderSortTest.java    |   102 -
 src/test/java/htsjdk/samtools/SamReaderTest.java   |   170 -
 src/test/java/htsjdk/samtools/SamSpecIntTest.java  |    97 -
 src/test/java/htsjdk/samtools/SamStreamsTest.java  |   124 -
 .../SequenceNameTruncationAndValidationTest.java   |    98 -
 .../java/htsjdk/samtools/ValidateSamFileTest.java  |   547 -
 .../java/htsjdk/samtools/cram/CRAIEntryTest.java   |   144 -
 .../java/htsjdk/samtools/cram/CRAIIndexTest.java   |   220 -
 .../samtools/cram/LosslessRoundTripTest.java       |    68 -
 .../java/htsjdk/samtools/cram/VersionTest.java     |   106 -
 .../cram/build/CompressionHeaderFactoryTest.java   |   208 -
 .../samtools/cram/build/ContainerFactoryTest.java  |   134 -
 .../samtools/cram/build/ContainerParserTest.java   |   185 -
 .../htsjdk/samtools/cram/build/CramIOTest.java     |    82 -
 .../cram/encoding/huffman/codec/HuffmanTest.java   |   106 -
 .../samtools/cram/encoding/rans/RansTest.java      |   228 -
 .../java/htsjdk/samtools/cram/io/ITF8Test.java     |   101 -
 .../java/htsjdk/samtools/cram/io/LTF8Test.java     |    80 -
 .../cram/lossy/QualityScorePreservationTest.java   |   162 -
 .../samtools/cram/ref/EnaRefServiceTest.java       |    15 -
 .../cram/structure/CramCompressionRecordTest.java  |    68 -
 .../samtools/cram/structure/ReadTagTest.java       |   138 -
 .../htsjdk/samtools/cram/structure/SliceTests.java |    70 -
 .../cram/structure/SubstitutionMatrixTest.java     |   105 -
 .../htsjdk/samtools/fastq/FastqRecordTest.java     |   204 -
 .../htsjdk/samtools/fastq/FastqWriterTest.java     |    73 -
 .../filter/FailsVendorReadQualityFilterTest.java   |    65 -
 .../samtools/filter/InsertSizeFilterTest.java      |    43 -
 .../filter/IntervalKeepPairFilterTest.java         |   123 -
 .../filter/JavascriptSamRecordFilterTest.java      |    74 -
 .../samtools/filter/MappingQualityFilterTest.java  |    39 -
 .../samtools/filter/OverclippedReadFilterTest.java |    83 -
 .../samtools/filter/SolexaNoiseFilterTest.java     |    73 -
 .../java/htsjdk/samtools/filter/TagFilterTest.java |    77 -
 .../htsjdk/samtools/liftover/LiftOverTest.java     |   468 -
 .../htsjdk/samtools/metrics/MetricBaseTest.java    |    75 -
 .../htsjdk/samtools/metrics/MetricsFileTest.java   |   213 -
 .../htsjdk/samtools/metrics/StringHeaderTest.java  |    19 -
 .../htsjdk/samtools/metrics/VersionHeaderTest.java |    22 -
 .../reference/FakeReferenceSequenceFile.java       |    77 -
 .../samtools/reference/FastaSequenceFileTest.java  |    85 -
 .../samtools/reference/FastaSequenceIndexTest.java |   256 -
 .../reference/InMemoryReferenceSequenceFile.java   |    66 -
 .../reference/IndexedFastaSequenceFileTest.java    |   308 -
 .../ReferenceSequenceFileFactoryTests.java         |    39 -
 .../reference/ReferenceSequenceFileWalkerTest.java |    73 -
 .../samtools/reference/ReferenceSequenceTests.java |    98 -
 .../seekablestream/SeekableBufferedStreamTest.java |   162 -
 .../seekablestream/SeekableFTPStreamTest.java      |   106 -
 .../seekablestream/SeekableFileStreamTest.java     |    52 -
 .../seekablestream/SeekableMemoryStreamTest.java   |    93 -
 .../seekablestream/SeekablePathStreamTest.java     |    51 -
 .../seekablestream/SeekableStreamFactoryTest.java  |    45 -
 .../java/htsjdk/samtools/sra/AbstractSRATest.java  |    89 -
 .../java/htsjdk/samtools/sra/SRAAccessionTest.java |    28 -
 .../java/htsjdk/samtools/sra/SRAIndexTest.java     |   134 -
 .../htsjdk/samtools/sra/SRALazyRecordTest.java     |    51 -
 .../java/htsjdk/samtools/sra/SRAQueryTest.java     |    73 -
 .../java/htsjdk/samtools/sra/SRAReferenceTest.java |    95 -
 src/test/java/htsjdk/samtools/sra/SRATest.java     |   434 -
 .../samtools/util/AbstractLocusInfoTest.java       |    79 -
 .../util/AbstractLocusIteratorTestTemplate.java    |    68 -
 .../samtools/util/AbstractRecordAndOffsetTest.java |    63 -
 .../samtools/util/AsyncBufferedIteratorTest.java   |   115 -
 .../java/htsjdk/samtools/util/AsyncWriterTest.java |    77 -
 .../java/htsjdk/samtools/util/BinaryCodecTest.java |   287 -
 .../util/BlockCompressedFilePointerUtilTest.java   |    96 -
 .../util/BlockCompressedOutputStreamTest.java      |   214 -
 .../util/BlockCompressedTerminatorTest.java        |    59 -
 .../java/htsjdk/samtools/util/CigarUtilTest.java   |   143 -
 .../samtools/util/CloseableIteratorTest.java       |    31 -
 .../java/htsjdk/samtools/util/CodeUtilTest.java    |    15 -
 .../htsjdk/samtools/util/ComparableTupleTest.java  |    61 -
 .../samtools/util/CoordSpanInputSteamTest.java     |   108 -
 .../htsjdk/samtools/util/DiskBackedQueueTest.java  |   132 -
 .../htsjdk/samtools/util/EdgeReadIteratorTest.java |   402 -
 .../samtools/util/EdgingRecordAndOffsetTest.java   |    94 -
 .../java/htsjdk/samtools/util/HistogramTest.java   |   366 -
 .../htsjdk/samtools/util/IntervalListTest.java     |   520 -
 .../htsjdk/samtools/util/IntervalTreeMapTest.java  |    55 -
 .../htsjdk/samtools/util/IntervalTreeTest.java     |   187 -
 src/test/java/htsjdk/samtools/util/IoUtilTest.java |   190 -
 .../java/htsjdk/samtools/util/Iso8601DateTest.java |    57 -
 src/test/java/htsjdk/samtools/util/IupacTest.java  |    77 -
 .../htsjdk/samtools/util/MergingIteratorTest.java  |   175 -
 .../htsjdk/samtools/util/OverlapDetectorTest.java  |   240 -
 .../samtools/util/PositionalOutputStreamTest.java  |    62 -
 .../samtools/util/QualityEncodingDetectorTest.java |   109 -
 .../samtools/util/RelativeIso8601DateTest.java     |    53 -
 .../htsjdk/samtools/util/SamLocusIteratorTest.java |   673 -
 .../htsjdk/samtools/util/SequenceUtilTest.java     |   453 -
 .../samtools/util/SolexaQualityConverterTest.java  |    86 -
 .../samtools/util/SortingCollectionTest.java       |   230 -
 .../samtools/util/SortingLongCollectionTest.java   |   119 -
 .../htsjdk/samtools/util/StringLineReaderTest.java |   119 -
 .../java/htsjdk/samtools/util/StringUtilTest.java  |   122 -
 .../htsjdk/samtools/util/TrimmingUtilTest.java     |    70 -
 src/test/java/htsjdk/samtools/util/TupleTest.java  |    62 -
 .../htsjdk/tribble/AbstractFeatureReaderTest.java  |   112 -
 .../java/htsjdk/tribble/BinaryFeaturesTest.java    |    62 -
 .../java/htsjdk/tribble/FeatureReaderTest.java     |   168 -
 src/test/java/htsjdk/tribble/TestUtils.java        |    28 -
 .../tribble/TribbleIndexFeatureReaderTest.java     |    88 -
 src/test/java/htsjdk/tribble/TribbleTest.java      |    31 -
 src/test/java/htsjdk/tribble/bed/BEDCodecTest.java |   240 -
 .../java/htsjdk/tribble/gelitext/GeliTextTest.java |   100 -
 .../htsjdk/tribble/index/IndexFactoryTest.java     |   120 -
 src/test/java/htsjdk/tribble/index/IndexTest.java  |    97 -
 .../tribble/index/interval/IntervalTreeTest.java   |   153 -
 .../tribble/index/linear/LinearIndexTest.java      |   243 -
 .../htsjdk/tribble/index/tabix/TabixIndexTest.java |   144 -
 .../tribble/readers/AsciiLineReaderTest.java       |    52 -
 .../readers/LongLineBufferedReaderTest.java        |    32 -
 .../readers/PositionalBufferedStreamTest.java      |   121 -
 .../java/htsjdk/tribble/readers/ReaderTest.java    |   183 -
 .../readers/SynchronousLineReaderUnitTest.java     |    39 -
 .../htsjdk/tribble/readers/TabixReaderTest.java    |   162 -
 .../java/htsjdk/tribble/util/ParsingUtilsTest.java |   163 -
 .../htsjdk/tribble/util/ftp/FTPClientTest.java     |   247 -
 .../java/htsjdk/tribble/util/ftp/FTPUtilsTest.java |    31 -
 .../util/popgen/HardyWeinbergCalculationTest.java  |    41 -
 .../htsjdk/variant/PrintVariantsExampleTest.java   |    65 -
 src/test/java/htsjdk/variant/VariantBaseTest.java  |   278 -
 .../variant/bcf2/BCF2EncoderDecoderUnitTest.java   |   587 -
 .../htsjdk/variant/bcf2/BCF2UtilsUnitTest.java     |   228 -
 .../utils/SAMSequenceDictionaryExtractorTest.java  |    65 -
 .../variant/variantcontext/AlleleUnitTest.java     |   262 -
 .../variantcontext/GenotypeBuilderTest.java        |    75 -
 .../GenotypeLikelihoodsUnitTest.java               |   337 -
 .../variant/variantcontext/GenotypeUnitTest.java   |   107 -
 .../variantcontext/GenotypesContextUnitTest.java   |   318 -
 .../variantcontext/VariantContextBuilderTest.java  |    65 -
 .../variantcontext/VariantContextTestProvider.java |  1014 -
 .../variantcontext/VariantContextUnitTest.java     |  1621 -
 .../variantcontext/VariantJEXLContextUnitTest.java |   312 -
 .../variantcontext/filter/AllFailFilter.java       |    41 -
 .../variantcontext/filter/AllPassFilter.java       |    41 -
 .../variantcontext/filter/CompoundFilterTest.java  |    78 -
 .../FilteringVariantContextIteratorTest.java       |    88 -
 .../filter/GenotypeQualityFilterTest.java          |   105 -
 .../filter/HeterozygosityFilterTest.java           |   128 -
 .../filter/JavascriptVariantFilterTest.java        |    72 -
 .../filter/PassingVariantFilterTest.java           |    46 -
 .../variantcontext/filter/SnpFilterTest.java       |    54 -
 .../writer/TabixOnTheFlyIndexCreationTest.java     |    66 -
 .../variantcontext/writer/VCFWriterUnitTest.java   |   280 -
 .../VariantContextWriterBuilderUnitTest.java       |   399 -
 .../writer/VariantContextWritersUnitTest.java      |   163 -
 .../htsjdk/variant/vcf/AbstractVCFCodecTest.java   |    60 -
 .../htsjdk/variant/vcf/IndexFactoryUnitTest.java   |    96 -
 .../variant/vcf/VCFCompoundHeaderLineUnitTest.java |    46 -
 .../java/htsjdk/variant/vcf/VCFEncoderTest.java    |   125 -
 .../vcf/VCFHeaderLineTranslatorUnitTest.java       |    62 -
 .../htsjdk/variant/vcf/VCFHeaderLineUnitTest.java  |    43 -
 .../java/htsjdk/variant/vcf/VCFHeaderUnitTest.java |   563 -
 .../vcf/VCFStandardHeaderLinesUnitTest.java        |   204 -
 .../BAMCigarOverflowTest/CigarOverflowTest.bam     |   Bin 662 -> 0 bytes
 .../samtools/BAMFileIndexTest/index_test.bam       |   Bin 594149 -> 0 bytes
 .../samtools/BAMFileIndexTest/index_test.bam.bai   |   Bin 1621416 -> 0 bytes
 .../BAMFileIndexTest/symlink_with_index.bam        |     1 -
 .../BAMFileIndexTest/symlink_with_index.bam.bai    |     1 -
 .../symlink_without_linked_index.bam               |     1 -
 .../SAMIntegerTagTest/variousAttributes.bam        |   Bin 258 -> 0 bytes
 .../SAMIntegerTagTest/variousAttributes.sam        |     4 -
 .../SamFileHeaderMergerTest/Chromosome1to10.bam    |   Bin 3708 -> 0 bytes
 .../SamFileHeaderMergerTest/Chromosome5to9.bam     |   Bin 1991 -> 0 bytes
 .../case1/chr11sub_file1.sam                       |     5 -
 .../case1/chr11sub_file2.sam                       |    11 -
 .../case1/expected_output.sam                      |    13 -
 .../case2/chr11sub_file1.sam                       |     9 -
 .../case2/chr11sub_file2.sam                       |     7 -
 .../case2/chr11sub_file3.sam                       |     9 -
 .../case2/chr11sub_file4.sam                       |     5 -
 .../case2/expected_output.sam                      |    21 -
 .../SamFileHeaderMergerTest/unsorted_input/1.sam   |    11 -
 .../SamFileHeaderMergerTest/unsorted_input/2.sam   |    11 -
 .../reference_with_lower_and_uppercase.dict        |     3 -
 .../reference_with_lower_and_uppercase.fasta       |     4 -
 .../reference_with_lower_and_uppercase.fasta.fai   |     2 -
 .../SequenceUtil/upper_and_lowercase_read.sam      |    10 -
 .../samtools/ValidateSamFileTest/bad_index.bai     |   Bin 1621416 -> 0 bytes
 .../samtools/ValidateSamFileTest/bad_index.bam     |   Bin 594149 -> 0 bytes
 .../samtools/ValidateSamFileTest/buggyHeader.sam   |    30 -
 .../samtools/ValidateSamFileTest/duplicate_rg.sam  |    11 -
 .../ValidateSamFileTest/duplicated_reads.sam       |    17 -
 .../duplicated_reads_out_of_order.sam              |    17 -
 .../samtools/ValidateSamFileTest/hanging_tab.sam   |     3 -
 .../inappropriate_mate_cigar_string.sam            |    13 -
 .../invalid_coord_sort_order.sam                   |    27 -
 .../invalid_mate_cigar_string.sam                  |    19 -
 .../ValidateSamFileTest/invalid_platform_unit.sam  |    21 -
 .../invalid_queryname_sort_order.sam               |    27 -
 .../ValidateSamFileTest/mate_cigar_and_no_oqs.sam  |     4 -
 .../ValidateSamFileTest/mate_cigar_and_oqs.sam     |     4 -
 .../ValidateSamFileTest/missing_fields.sam         |     3 -
 .../ValidateSamFileTest/missing_platform_unit.sam  |    10 -
 .../test_samfile_version_1pt5.bam                  |   Bin 259 -> 0 bytes
 .../samtools/ValidateSamFileTest/truncated.bam     |   Bin 336031 -> 0 bytes
 .../ValidateSamFileTest/truncated_quals.sam        |     4 -
 .../samtools/ValidateSamFileTest/truncated_tag.sam |     4 -
 .../htsjdk/samtools/ValidateSamFileTest/valid.sam  |    21 -
 .../ValidateSamFileTest/zero_length_read.sam       |     3 -
 .../htsjdk/samtools/block_compressed.sam.gz        |   Bin 257 -> 0 bytes
 src/test/resources/htsjdk/samtools/compressed.bam  |   Bin 307 -> 0 bytes
 .../resources/htsjdk/samtools/compressed.sam.gz    |   Bin 238 -> 0 bytes
 .../htsjdk/samtools/coordinate_sorted.sam          |    15 -
 .../cram/CRAMException/testContigNotInRef.cram     |   Bin 3433 -> 0 bytes
 .../cram/CRAMException/testContigNotInRef.cram.bai |   Bin 96 -> 0 bytes
 .../cram/CRAMException/testContigNotInRef.dict     |     2 -
 .../cram/CRAMException/testContigNotInRef.fa       |     2 -
 .../cram/CRAMException/testContigNotInRef.fa.fai   |     1 -
 .../cram/CRAMException/testContigNotInRef.fasta    |     2 -
 ...78.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram |   Bin 47259 -> 0 bytes
 ....21.1-100.100-SeqsPerSlice.0-unMapped.cram.crai |   Bin 81 -> 0 bytes
 ...78.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram |   Bin 47796 -> 0 bytes
 ....21.1-100.100-SeqsPerSlice.1-unMapped.cram.crai |   Bin 94 -> 0 bytes
 ....20.21.1-100.100-SeqsPerSlice.500-unMapped.cram |   Bin 77664 -> 0 bytes
 ...1.1-100.100-SeqsPerSlice.500-unMapped.cram.crai |   Bin 124 -> 0 bytes
 .../htsjdk/samtools/cram/auxf#values.2.1.cram      |   Bin 11427 -> 0 bytes
 .../htsjdk/samtools/cram/auxf#values.3.0.cram      |   Bin 1586 -> 0 bytes
 .../resources/htsjdk/samtools/cram/auxf#values.sam |     5 -
 .../htsjdk/samtools/cram/auxf.alteredForMD5test.fa |     2 -
 .../samtools/cram/auxf.alteredForMD5test.fa.fai    |     1 -
 src/test/resources/htsjdk/samtools/cram/auxf.fa    |     2 -
 .../resources/htsjdk/samtools/cram/auxf.fa.fai     |     1 -
 .../htsjdk/samtools/cram/c1#bounds.2.1.cram        |   Bin 10508 -> 0 bytes
 .../htsjdk/samtools/cram/c1#bounds.3.0.cram        |   Bin 642 -> 0 bytes
 .../resources/htsjdk/samtools/cram/c1#bounds.sam   |     4 -
 .../htsjdk/samtools/cram/c1#clip.2.1.cram          |   Bin 10630 -> 0 bytes
 .../htsjdk/samtools/cram/c1#clip.3.0.cram          |   Bin 771 -> 0 bytes
 .../resources/htsjdk/samtools/cram/c1#clip.sam     |     8 -
 .../htsjdk/samtools/cram/c1#noseq.2.1.cram         |   Bin 10652 -> 0 bytes
 .../htsjdk/samtools/cram/c1#noseq.3.0.cram         |   Bin 797 -> 0 bytes
 .../resources/htsjdk/samtools/cram/c1#noseq.sam    |    10 -
 .../htsjdk/samtools/cram/c1#pad1.2.1.cram          |   Bin 10623 -> 0 bytes
 .../htsjdk/samtools/cram/c1#pad1.3.0.cram          |   Bin 761 -> 0 bytes
 .../resources/htsjdk/samtools/cram/c1#pad1.sam     |    10 -
 .../htsjdk/samtools/cram/c1#pad2.2.1.cram          |   Bin 10658 -> 0 bytes
 .../htsjdk/samtools/cram/c1#pad2.3.0.cram          |   Bin 796 -> 0 bytes
 .../resources/htsjdk/samtools/cram/c1#pad2.sam     |    14 -
 .../htsjdk/samtools/cram/c1#pad3.2.1.cram          |   Bin 10697 -> 0 bytes
 .../htsjdk/samtools/cram/c1#pad3.3.0.cram          |   Bin 848 -> 0 bytes
 .../resources/htsjdk/samtools/cram/c1#pad3.sam     |    14 -
 .../htsjdk/samtools/cram/c1#unknown.2.1.cram       |   Bin 10784 -> 0 bytes
 .../htsjdk/samtools/cram/c1#unknown.3.0.cram       |   Bin 949 -> 0 bytes
 .../resources/htsjdk/samtools/cram/c1#unknown.sam  |     9 -
 src/test/resources/htsjdk/samtools/cram/c1.fa      |     2 -
 src/test/resources/htsjdk/samtools/cram/c1.fa.fai  |     1 -
 .../resources/htsjdk/samtools/cram/c2#pad.2.1.cram |   Bin 11077 -> 0 bytes
 .../resources/htsjdk/samtools/cram/c2#pad.3.0.cram |   Bin 1070 -> 0 bytes
 .../resources/htsjdk/samtools/cram/ce#1.2.1.cram   |   Bin 10746 -> 0 bytes
 .../resources/htsjdk/samtools/cram/ce#1.3.0.cram   |   Bin 895 -> 0 bytes
 src/test/resources/htsjdk/samtools/cram/ce#1.sam   |     2 -
 .../resources/htsjdk/samtools/cram/ce#2.2.1.cram   |   Bin 10839 -> 0 bytes
 .../resources/htsjdk/samtools/cram/ce#2.3.0.cram   |   Bin 988 -> 0 bytes
 src/test/resources/htsjdk/samtools/cram/ce#2.sam   |     3 -
 .../resources/htsjdk/samtools/cram/ce#5.2.1.cram   |   Bin 11221 -> 0 bytes
 .../resources/htsjdk/samtools/cram/ce#5.3.0.cram   |   Bin 1130 -> 0 bytes
 src/test/resources/htsjdk/samtools/cram/ce#5.sam   |    11 -
 .../resources/htsjdk/samtools/cram/ce#5b.2.1.cram  |   Bin 12668 -> 0 bytes
 .../resources/htsjdk/samtools/cram/ce#5b.3.0.cram  |   Bin 2669 -> 0 bytes
 src/test/resources/htsjdk/samtools/cram/ce#5b.sam  |    12 -
 .../htsjdk/samtools/cram/ce#large_seq.2.1.cram     |   Bin 101355 -> 0 bytes
 .../htsjdk/samtools/cram/ce#large_seq.3.0.cram     |   Bin 84800 -> 0 bytes
 .../htsjdk/samtools/cram/ce#large_seq.sam          |     3 -
 .../htsjdk/samtools/cram/ce#supp.2.1.cram          |   Bin 10649 -> 0 bytes
 .../htsjdk/samtools/cram/ce#supp.3.0.cram          |   Bin 809 -> 0 bytes
 .../resources/htsjdk/samtools/cram/ce#supp.sam     |     6 -
 .../htsjdk/samtools/cram/ce#tag_depadded.2.1.cram  |   Bin 11114 -> 0 bytes
 .../htsjdk/samtools/cram/ce#tag_depadded.3.0.cram  |   Bin 1258 -> 0 bytes
 .../htsjdk/samtools/cram/ce#tag_depadded.sam       |    11 -
 .../htsjdk/samtools/cram/ce#tag_padded.2.1.cram    |   Bin 10922 -> 0 bytes
 .../htsjdk/samtools/cram/ce#tag_padded.3.0.cram    |   Bin 1082 -> 0 bytes
 .../htsjdk/samtools/cram/ce#tag_padded.sam         |    11 -
 .../htsjdk/samtools/cram/ce#unmap.2.1.cram         |   Bin 10503 -> 0 bytes
 .../htsjdk/samtools/cram/ce#unmap.3.0.cram         |   Bin 601 -> 0 bytes
 .../resources/htsjdk/samtools/cram/ce#unmap.sam    |     6 -
 .../htsjdk/samtools/cram/ce#unmap1.2.1.cram        |   Bin 11730 -> 0 bytes
 .../htsjdk/samtools/cram/ce#unmap1.3.0.cram        |   Bin 1505 -> 0 bytes
 .../resources/htsjdk/samtools/cram/ce#unmap1.sam   |    20 -
 .../htsjdk/samtools/cram/ce#unmap2.2.1.cram        |   Bin 12587 -> 0 bytes
 .../htsjdk/samtools/cram/ce#unmap2.3.0.cram        |   Bin 2404 -> 0 bytes
 .../resources/htsjdk/samtools/cram/ce#unmap2.sam   |    29 -
 src/test/resources/htsjdk/samtools/cram/ce.fa      | 20803 -------------
 src/test/resources/htsjdk/samtools/cram/ce.fa.fai  |     7 -
 .../htsjdk/samtools/cram/cramQueryTest.cram        |   Bin 2863 -> 0 bytes
 .../htsjdk/samtools/cram/cramQueryTest.cram.bai    |   Bin 336 -> 0 bytes
 .../htsjdk/samtools/cram/cramQueryTestEmpty.cram   |   Bin 2183 -> 0 bytes
 .../samtools/cram/cramQueryTestEmpty.cram.bai      |   Bin 48 -> 0 bytes
 .../htsjdk/samtools/cram/cramQueryWithBAI.cram     |   Bin 8947 -> 0 bytes
 .../htsjdk/samtools/cram/cramQueryWithBAI.cram.bai |   Bin 152 -> 0 bytes
 .../htsjdk/samtools/cram/cramQueryWithCRAI.cram    |   Bin 4131 -> 0 bytes
 .../samtools/cram/cramQueryWithCRAI.cram.crai      |   Bin 59 -> 0 bytes
 .../resources/htsjdk/samtools/cram/fieldarith.sam  |    15 -
 .../samtools/cram/human_g1k_v37.20.21.1-100.dict   |     3 -
 .../samtools/cram/human_g1k_v37.20.21.1-100.fasta  |    11 -
 .../cram/human_g1k_v37.20.21.1-100.fasta.fai       |     2 -
 .../cram/human_g1k_v37.20.21.10M-10M200k.dict      |     3 -
 .../cram/human_g1k_v37.20.21.10M-10M200k.fasta     |  5002 ---
 .../cram/human_g1k_v37.20.21.10M-10M200k.fasta.fai |     2 -
 .../htsjdk/samtools/cram/io/bzip2-test.bz2         |   Bin 56 -> 0 bytes
 src/test/resources/htsjdk/samtools/cram/test.cram  |   Bin 3433 -> 0 bytes
 .../resources/htsjdk/samtools/cram/test.cram.bai   |   Bin 96 -> 0 bytes
 src/test/resources/htsjdk/samtools/cram/test.dict  |     2 -
 src/test/resources/htsjdk/samtools/cram/test.fa    |     2 -
 .../resources/htsjdk/samtools/cram/test.fa.fai     |     1 -
 src/test/resources/htsjdk/samtools/cram/test2.cram |   Bin 3433 -> 0 bytes
 src/test/resources/htsjdk/samtools/cram/test2.dict |     2 -
 src/test/resources/htsjdk/samtools/cram/test2.fa   |     2 -
 .../resources/htsjdk/samtools/cram/test2.fa.fai    |     1 -
 .../htsjdk/samtools/cram/xx#blank.2.1.cram         |   Bin 10080 -> 0 bytes
 .../htsjdk/samtools/cram/xx#blank.3.0.cram         |   Bin 140 -> 0 bytes
 .../htsjdk/samtools/cram/xx#large_aux.2.1.cram     |   Bin 35824 -> 0 bytes
 .../htsjdk/samtools/cram/xx#large_aux.3.0.cram     |   Bin 20418 -> 0 bytes
 .../htsjdk/samtools/cram/xx#large_aux.sam          |     4 -
 .../htsjdk/samtools/cram/xx#large_aux2.2.1.cram    |   Bin 10868 -> 0 bytes
 .../htsjdk/samtools/cram/xx#large_aux2.3.0.cram    |   Bin 1008 -> 0 bytes
 .../htsjdk/samtools/cram/xx#large_aux2.sam         |    11 -
 .../htsjdk/samtools/cram/xx#minimal.2.1.cram       |   Bin 10995 -> 0 bytes
 .../htsjdk/samtools/cram/xx#minimal.3.0.cram       |   Bin 1096 -> 0 bytes
 .../resources/htsjdk/samtools/cram/xx#minimal.sam  |    10 -
 .../htsjdk/samtools/cram/xx#pair.2.1.cram          |   Bin 10454 -> 0 bytes
 .../htsjdk/samtools/cram/xx#pair.3.0.cram          |   Bin 590 -> 0 bytes
 .../resources/htsjdk/samtools/cram/xx#pair.sam     |     7 -
 .../resources/htsjdk/samtools/cram/xx#rg.2.1.cram  |   Bin 10643 -> 0 bytes
 .../resources/htsjdk/samtools/cram/xx#rg.3.0.cram  |   Bin 794 -> 0 bytes
 src/test/resources/htsjdk/samtools/cram/xx#rg.sam  |    13 -
 .../htsjdk/samtools/cram/xx#tlen.2.1.cram          |   Bin 11312 -> 0 bytes
 .../htsjdk/samtools/cram/xx#tlen.3.0.cram          |   Bin 1296 -> 0 bytes
 .../htsjdk/samtools/cram/xx#tlen2.2.1.cram         |   Bin 11380 -> 0 bytes
 .../htsjdk/samtools/cram/xx#tlen2.3.0.cram         |   Bin 1359 -> 0 bytes
 .../htsjdk/samtools/cram/xx#triplet.2.1.cram       |   Bin 10853 -> 0 bytes
 .../htsjdk/samtools/cram/xx#triplet.3.0.cram       |   Bin 950 -> 0 bytes
 .../resources/htsjdk/samtools/cram/xx#triplet.sam  |     7 -
 .../htsjdk/samtools/cram/xx#unsorted.2.1.cram      |   Bin 11131 -> 0 bytes
 .../htsjdk/samtools/cram/xx#unsorted.3.0.cram      |   Bin 1262 -> 0 bytes
 .../resources/htsjdk/samtools/cram/xx#unsorted.sam |     8 -
 src/test/resources/htsjdk/samtools/cram/xx.fa      |     5 -
 src/test/resources/htsjdk/samtools/cram/xx.fa.fai  |     2 -
 .../htsjdk/samtools/cram_query_sorted.cram         |   Bin 13266 -> 0 bytes
 .../htsjdk/samtools/cram_query_sorted.fasta        |    40 -
 .../htsjdk/samtools/cram_query_sorted.fasta.fai    |     8 -
 src/test/resources/htsjdk/samtools/cram_tlen.fasta |    41 -
 .../resources/htsjdk/samtools/cram_tlen.fasta.fai  |     8 -
 .../htsjdk/samtools/cram_tlen_reads.sorted.sam     |    19 -
 .../htsjdk/samtools/cram_with_bai_index.cram       |   Bin 4213 -> 0 bytes
 .../htsjdk/samtools/cram_with_bai_index.cram.bai   |   Bin 336 -> 0 bytes
 .../htsjdk/samtools/cram_with_crai_index.cram      |   Bin 4213 -> 0 bytes
 .../htsjdk/samtools/cram_with_crai_index.cram.crai |   Bin 77 -> 0 bytes
 src/test/resources/htsjdk/samtools/empty.bai       |   Bin 8 -> 0 bytes
 src/test/resources/htsjdk/samtools/empty.bam       |   Bin 90 -> 0 bytes
 .../htsjdk/samtools/empty_no_empty_gzip_block.bai  |   Bin 8 -> 0 bytes
 .../htsjdk/samtools/empty_no_empty_gzip_block.bam  |   Bin 62 -> 0 bytes
 src/test/resources/htsjdk/samtools/hg19mini.dict   |     5 -
 src/test/resources/htsjdk/samtools/hg19mini.fasta  |   804 -
 .../resources/htsjdk/samtools/hg19mini.fasta.fai   |     4 -
 .../intervallist/IntervalListFromVCFTest.vcf       |    53 -
 .../IntervalListFromVCFTestComp.interval_list      |     7 -
 ...ntervalListFromVCFTestCompInverse.interval_list |    10 -
 ...lListFromVCFTestCompInverseManual.interval_list |    10 -
 .../intervallist/IntervalListFromVCFTestManual.vcf |    57 -
 ...IntervalListFromVCFTestManualComp.interval_list |    12 -
 .../IntervalListchr123_empty.interval_list         |     4 -
 src/test/resources/htsjdk/samtools/inttest.bam     |   Bin 329 -> 0 bytes
 src/test/resources/htsjdk/samtools/inttest.sam     |    26 -
 .../resources/htsjdk/samtools/io/5newline5.txt     |     2 -
 .../resources/htsjdk/samtools/io/slurptest.txt     |     3 -
 src/test/resources/htsjdk/samtools/issue76.bam     |   Bin 5121 -> 0 bytes
 src/test/resources/htsjdk/samtools/issue76.bam.bai |   Bin 776 -> 0 bytes
 .../htsjdk/samtools/liftover/hg18ToHg19.over.chain | 30850 -------------------
 .../htsjdk/samtools/metrics/metricsOne.metrics     |    13 -
 .../htsjdk/samtools/metrics/metricsOneCopy.metrics |    13 -
 .../metrics/metricsOneModifiedHistogram.metrics    |    14 -
 .../metrics/metricsOneModifiedMetrics.metrics      |    13 -
 .../resources/htsjdk/samtools/queryname_sorted.sam |    15 -
 .../resources/htsjdk/samtools/readWithBadRname.sam |     6 -
 .../reference/Homo_sapiens_assembly18.fasta.fai    |    45 -
 .../reference/Homo_sapiens_assembly18.trimmed.dict |     3 -
 .../Homo_sapiens_assembly18.trimmed.fasta          | 16946 ----------
 .../Homo_sapiens_assembly18.trimmed.fasta.fai      |     2 -
 .../Homo_sapiens_assembly18.trimmed.nodict.fasta   | 16946 ----------
 ...omo_sapiens_assembly18.trimmed.nodict.fasta.fai |     2 -
 .../Homo_sapiens_assembly18.trimmed.noindex.fasta  | 16946 ----------
 .../reference_with_trailing_whitespace.dict        |     3 -
 .../reference_with_trailing_whitespace.fasta       |     4 -
 .../htsjdk/samtools/reference/testing.fai          |     7 -
 src/test/resources/htsjdk/samtools/roundtrip.sam   |    16 -
 src/test/resources/htsjdk/samtools/samFilter01.js  |     2 -
 src/test/resources/htsjdk/samtools/samFilter02.js  |     9 -
 .../samtools/seekablestream/megabyteZeros.dat      |   Bin 1000000 -> 0 bytes
 .../htsjdk/samtools/seekablestream/seekTest.txt    |     5 -
 .../htsjdk/samtools/sequenceWithSpace.bam          |   Bin 391 -> 0 bytes
 .../htsjdk/samtools/sequenceWithSpace.sam          |     6 -
 .../htsjdk/samtools/serialization_test.bam         |   Bin 339 -> 0 bytes
 .../htsjdk/samtools/serialization_test.bam.bai     |   Bin 120 -> 0 bytes
 .../htsjdk/samtools/serialization_test.sam         |     8 -
 .../resources/htsjdk/samtools/sra/test_archive.sra |   Bin 1099831 -> 0 bytes
 .../resources/htsjdk/samtools/uncompressed.sam     |    15 -
 src/test/resources/htsjdk/samtools/unsorted.sam    |    15 -
 .../5k-30BB2AAXX.3.aligned.sam.fastq               | 19808 ------------
 .../illumina-as-standard.bam                       |   Bin 652 -> 0 bytes
 .../QualityEncodingDetectorTest/s_1_sequence.txt   |    40 -
 .../solexa-as-standard.bam                         |   Bin 944 -> 0 bytes
 .../solexa_full_range_as_solexa.fastq              |     8 -
 .../util/QualityEncodingDetectorTest/unmapped.sam  |    12 -
 .../htsjdk/samtools/util/defective_bgzf.bam        |   Bin 359 -> 0 bytes
 .../htsjdk/samtools/util/no_bgzf_terminator.bam    |   Bin 354 -> 0 bytes
 .../htsjdk/samtools/util/whitespace_text_file.txt  |     6 -
 src/test/resources/htsjdk/tribble/Tb.vcf.idx       |   Bin 998966 -> 0 bytes
 src/test/resources/htsjdk/tribble/basicDbSNP.dbsnp |    43 -
 ....deletions.10kbp.het.gq99.hand_curated.hg19.bed |    35 -
 ...ions.10kbp.het.gq99.hand_curated.hg19_fixed.bed |    36 -
 .../htsjdk/tribble/bed/Unigene.sample.bed          |    72 -
 .../resources/htsjdk/tribble/bed/disconcontigs.bed |     5 -
 src/test/resources/htsjdk/tribble/bed/unsorted.bed |     5 -
 .../resources/htsjdk/tribble/complexExample.vcf    |    23 -
 src/test/resources/htsjdk/tribble/fakeBed.bed      |    51 -
 src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz   |   Bin 351859 -> 0 bytes
 .../resources/htsjdk/tribble/fakeVCF.vcf.gz.tbi    |   Bin 170 -> 0 bytes
 src/test/resources/htsjdk/tribble/gwas/smallp.gwas |    20 -
 .../htsjdk/tribble/index/chrY_Y4_small.bed         |  5000 ---
 src/test/resources/htsjdk/tribble/large.txt        |   165 -
 src/test/resources/htsjdk/tribble/sites.bed        |  1000 -
 src/test/resources/htsjdk/tribble/soapsnp.txt      |    24 -
 .../resources/htsjdk/tribble/split/test.bin.part1  |   Bin 16000 -> 0 bytes
 .../resources/htsjdk/tribble/split/test.bin.part2  |   Bin 16000 -> 0 bytes
 .../resources/htsjdk/tribble/split/test.bin.part3  |   Bin 16000 -> 0 bytes
 .../resources/htsjdk/tribble/split/test.bin.split  |     3 -
 .../tabix/YRI.trio.2010_07.indel.sites.vcf.gz      |   Bin 250626 -> 0 bytes
 .../tabix/YRI.trio.2010_07.indel.sites.vcf.gz.tbi  |   Bin 32877 -> 0 bytes
 .../htsjdk/tribble/tabix/bigger.vcf.gz.tbi         |   Bin 595996 -> 0 bytes
 .../htsjdk/tribble/tabix/testTabixIndex.vcf        |    51 -
 .../htsjdk/tribble/tabix/testTabixIndex.vcf.gz     |   Bin 372 -> 0 bytes
 .../resources/htsjdk/tribble/tabix/trioDup.vcf     |    75 -
 .../resources/htsjdk/tribble/tabix/trioDup.vcf.gz  |   Bin 1353 -> 0 bytes
 .../htsjdk/tribble/tabix/trioDup.vcf.gz.tbi        |   Bin 324 -> 0 bytes
 .../resources/htsjdk/tribble/test with spaces.vcf  |    24 -
 src/test/resources/htsjdk/tribble/test.bed         |     9 -
 src/test/resources/htsjdk/tribble/test.gff         |     9 -
 .../resources/htsjdk/tribble/test.tabix.bed.gz     |   Bin 116 -> 0 bytes
 .../resources/htsjdk/tribble/test.tabix.bed.gz.tbi |   Bin 121 -> 0 bytes
 src/test/resources/htsjdk/tribble/test.vcf         |    24 -
 src/test/resources/htsjdk/tribble/test.vcf.bgz     |   Bin 849 -> 0 bytes
 src/test/resources/htsjdk/tribble/test.vcf.gz      |   Bin 822 -> 0 bytes
 src/test/resources/htsjdk/tribble/testGeliText.txt |    50 -
 .../resources/htsjdk/tribble/testIntervalList.list |     6 -
 src/test/resources/htsjdk/tribble/trio.vcf         |   100 -
 src/test/resources/htsjdk/tribble/trio.vcf.idx     |   Bin 495 -> 0 bytes
 src/test/resources/htsjdk/tribble/trioDup.vcf      |    75 -
 src/test/resources/htsjdk/tribble/vcfexample.vcf   |    12 -
 .../resources/htsjdk/tribble/vcfexample.vcf.gz     |   Bin 471 -> 0 bytes
 .../resources/htsjdk/tribble/vcfexample.vcf.gz.tbi |   Bin 114 -> 0 bytes
 .../htsjdk/tribble/vcfexample.vcf.truncated.gz     |   Bin 470 -> 0 bytes
 .../htsjdk/tribble/vcfexample.vcf.truncated.hdr.gz |   Bin 460 -> 0 bytes
 src/test/resources/htsjdk/variant/HiSeq.10000.vcf  | 10001 ------
 ...baseline.20111114.both.exome.genotypes.1000.vcf |   249 -
 .../resources/htsjdk/variant/VCF4HeaderTest.vcf    |    42 -
 .../resources/htsjdk/variant/VQSR.mixedTest.recal  |    32 -
 src/test/resources/htsjdk/variant/breakpoint.vcf   |     6 -
 .../htsjdk/variant/dbsnp_135.b37.1000.vcf          |   249 -
 .../htsjdk/variant/diagnosis_targets_testfile.vcf  |   117 -
 src/test/resources/htsjdk/variant/ex2.bgzf.bcf.csi |   Bin 130 -> 0 bytes
 src/test/resources/htsjdk/variant/ex2.vcf          |    23 -
 .../htsjdk/variant/serialization_test.bcf          |   Bin 7490 -> 0 bytes
 .../htsjdk/variant/serialization_test.bcf.idx      |   Bin 1146 -> 0 bytes
 .../htsjdk/variant/structuralvariants.vcf          |    22 -
 .../Homo_sapiens_assembly18.trimmed.dict           |     3 -
 .../Homo_sapiens_assembly18.trimmed.fasta          | 16946 ----------
 .../Homo_sapiens_assembly18.trimmed.fasta.fai      |     2 -
 .../ScreenSamReads.100.input.sam                   |    21 -
 .../empty.interval_list                            |     4 -
 .../SamSequenceDictionaryExtractor/test1.dict      |     3 -
 .../utils/SamSequenceDictionaryExtractor/test1.vcf |    53 -
 .../SamSequenceDictionaryExtractor/test1.vcf.idx   |   Bin 2283 -> 0 bytes
 .../test1_comp.interval_list                       |     8 -
 .../test2_comp.interval_list                       |     7 -
 .../test3_comp.interval_list                       |    24 -
 .../test4_comp.interval_list                       |    25 -
 .../resources/htsjdk/variant/variantFilter01.js    |     2 -
 .../resources/htsjdk/variant/variantFilter02.js    |    20 -
 .../Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl   |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl   |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl   |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl   |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl   |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C59.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl   |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C60.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C61.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C62.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C63.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C64.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C65.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C66.1/s_1_1101.bcl  |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl   |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl   |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl   |   Bin 2004 -> 0 bytes
 .../Intensities/BaseCalls/L001/s_1_1101.filter     |   Bin 2012 -> 0 bytes
 .../125T125T/Data/Intensities/L001/s_1_1101.clocs  |   Bin 4359 -> 0 bytes
 .../Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl   |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl   |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl   |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl   |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl   |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl  |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl   |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl   |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl   |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl   |   Bin 64 -> 0 bytes
 .../Intensities/BaseCalls/L001/s_1_1101.filter     |   Bin 72 -> 0 bytes
 .../sf/picard/illumina/25T8B25T/sams/ACAGGTAT.sam  |    10 -
 .../sf/picard/illumina/25T8B25T/sams/ACAGTTGA.sam  |     6 -
 .../sf/picard/illumina/25T8B25T/sams/ACTAAGAC.sam  |    10 -
 .../sf/picard/illumina/25T8B25T/sams/AGGTCGCA.sam  |    10 -
 .../sf/picard/illumina/25T8B25T/sams/ATTATCAA.sam  |    12 -
 .../sf/picard/illumina/25T8B25T/sams/CAATAGTC.sam  |    16 -
 .../sf/picard/illumina/25T8B25T/sams/CAGCGGTA.sam  |    12 -
 .../sf/picard/illumina/25T8B25T/sams/CGCTATGT.sam  |    12 -
 .../sf/picard/illumina/25T8B25T/sams/CTGTAATC.sam  |    14 -
 .../sf/picard/illumina/25T8B25T/sams/GACCAGGA.sam  |    16 -
 .../sf/picard/illumina/25T8B25T/sams/GCCGTCGA.sam  |    12 -
 .../sf/picard/illumina/25T8B25T/sams/GCCTAGCC.sam  |    12 -
 .../net/sf/picard/illumina/25T8B25T/sams/N.sam     |    34 -
 .../sf/picard/illumina/25T8B25T/sams/TGCAAGTA.sam  |     6 -
 .../sf/picard/illumina/25T8B25T/sams/TGTAATCA.sam  |     8 -
 src/test/resources/testng.xml                      |    20 -
 test/Makefile                                      |    70 +
 test/align/Makefile                                |    56 +
 test/align/indextest.cpp                           |   113 +
 test/cc/Makefile                                   |    60 +
 test/cc/asm-test.cpp                               |   480 +
 test/cipher/Makefile                               |    52 +
 test/cipher/test.sh                                |    46 +
 test/judy_test/Makefile                            |    58 +
 test/judy_test/judytest.c                          |  1831 ++
 test/junit-4.11.jar                                |   Bin 0 -> 288666 bytes
 test/kapp/Makefile                                 |   169 +
 test/kapp/env-test-tool.c                          |   170 +
 test/kapp/kapp-test.cpp                            |   549 +
 test/kapp/qfiletest.c                              |   338 +
 test/kapp/queuefile.data                           |   338 +
 test/kapp/report-kns-agent.c                       |    58 +
 test/kapp/run-kns-agent.sh                         |    60 +
 test/kapp/run-sig-core.sh                          |   116 +
 test/kapp/sig-core.c                               |   101 +
 test/kdb/Makefile                                  |   124 +
 test/kdb/kdbtest.cpp                               |   183 +
 test/kdb/remote_open_test.cpp                      |   304 +
 test/kdb/root/sra/SRR000123.sra.cache              |   Bin 0 -> 2975732 bytes
 test/kdb/rowsettest.cpp                            |   819 +
 test/kdb/test-btree.c                              |   338 +
 .../kdb/testdb/tbl/SEQUENCE/col/dummy              |     0
 test/kdb/wkdbtest.cpp                              |   264 +
 test/kfc/Makefile                                  |    57 +
 test/kfc/kfc.c                                     |    29 +
 test/kfc/test-except.c                             |   133 +
 test/kfg/Makefile                                  |   139 +
 test/kfg/config.linux.kfg                          |    26 +
 test/kfg/config.schema.kfg                         |    25 +
 test/kfg/config.sra.kfg                            |    29 +
 test/kfg/flat-sra-kfg.cpp                          |   429 +
 test/kfg/flat-sra-kfg/aux_root/empty.kfg           |     1 +
 test/kfg/flat-sra-kfg/new/sraFlat.kfg              |     1 +
 test/kfg/flat-sra-kfg/old/fuse1000.kfg             |     1 +
 test/kfg/keystoretest.cpp                          |   429 +
 test/kfg/kfgtest.cpp                               |  1030 +
 test/kfg/ncbi-home-from-env.configs/dir1/file.kfg  |     2 +
 .../dir1/not-user-settings.xml                     |     2 +
 .../dir1/user-settings.mkfg                        |     2 +
 test/kfg/ncbi-home-from-env.configs/dir2/file.kfg  |     2 +
 .../dir2/not-user-settings.xml                     |     2 +
 .../dir2/user-settings.mkfg                        |     2 +
 test/kfg/ncbi-home-from-env.cpp                    |    50 +
 test/kfg/prj_2956.ngc                              |   Bin 0 -> 91 bytes
 test/kfg/repositorytest.cpp                        |   280 +
 test/kfg/wb-test-kfg.cpp                           |   628 +
 test/kfs/Makefile                                  |   137 +
 test/kfs/cacheteetest.cpp                          |   603 +
 test/kfs/kfstest.cpp                               |   198 +
 test/kfs/md5test.cpp                               |   199 +
 test/kfs/ramfiletest.cpp                           |   199 +
 test/kfs/resolvetest.cpp                           |   196 +
 test/kfs/test.tar                                  |   Bin 0 -> 20480 bytes
 test/klib/Makefile                                 |   198 +
 test/klib/asm-test.c                               |   114 +
 test/klib/md5appendtest.c                          |   274 +
 test/klib/printf-test.c                            |   836 +
 test/klib/test-SraReleaseVersion.cpp               |   316 +
 test/klib/test-klib.cpp                            |  1027 +
 test/klib/test-log.cpp                             |   317 +
 test/klib/test-out.cpp                             |   156 +
 test/klib/test-vnamelist.cpp                       |   364 +
 test/kns/KNSManagerSingletonTest.cpp               |    69 +
 test/kns/Makefile                                  |   172 +
 test/kns/TestProxy.hpp                             |   227 +
 test/kns/http-client.c                             |    17 +
 test/kns/http-test.c                               |   368 +
 test/kns/http_dropconnection_test.cpp              |   437 +
 test/kns/httptest.cpp                              |   875 +
 test/kns/knstest.cpp                               |  1095 +
 test/kns/nih_1_out.txt                             |   277 +
 test/kns/test-proxy-with-env.cpp                   |   112 +
 test/kns/test-proxy.cpp                            |   263 +
 test/kns/test-proxy.h                              |     7 +
 test/kns/test-proxy/2-path-no-env/config           |     1 +
 test/kns/test-proxy/2-path-no-env/expected         |     2 +
 test/kns/test-proxy/2-path-no-port-no-env/config   |     1 +
 test/kns/test-proxy/2-path-no-port-no-env/expected |     2 +
 .../MULTIPLE_PROXIES/all.MULTIPLE_PROXIES/config   |     1 +
 .../all.MULTIPLE_PROXIES/environment               |     4 +
 .../MULTIPLE_PROXIES/all.MULTIPLE_PROXIES/expected |    10 +
 .../disabled.MULTIPLE_PROXIES/config               |     2 +
 .../disabled.MULTIPLE_PROXIES/environment          |     4 +
 .../disabled.MULTIPLE_PROXIES/expected             |     0
 .../enabled.MULTIPLE_PROXIES/config                |     2 +
 .../enabled.MULTIPLE_PROXIES/environment           |     4 +
 .../enabled.MULTIPLE_PROXIES/expected              |    10 +
 .../env-kfg.MULTIPLE_PROXIES/config                |     2 +
 .../env-kfg.MULTIPLE_PROXIES/environment           |     4 +
 .../env-kfg.MULTIPLE_PROXIES/expected              |    10 +
 .../env-only.MULTIPLE_PROXIES/config               |     2 +
 .../env-only.MULTIPLE_PROXIES/environment          |     4 +
 .../env-only.MULTIPLE_PROXIES/expected             |     8 +
 .../ignore.MULTIPLE_PROXIES/config                 |     2 +
 .../ignore.MULTIPLE_PROXIES/environment            |     4 +
 .../ignore.MULTIPLE_PROXIES/expected               |     0
 .../kfg-env.MULTIPLE_PROXIES/config                |     2 +
 .../kfg-env.MULTIPLE_PROXIES/environment           |     4 +
 .../kfg-env.MULTIPLE_PROXIES/expected              |    10 +
 .../proxy-not-only.MULTIPLE_PROXIES/config         |     2 +
 .../proxy-not-only.MULTIPLE_PROXIES/environment    |     4 +
 .../proxy-not-only.MULTIPLE_PROXIES/expected       |    10 +
 .../proxy-only.MILTIPLE_PROXIES/config             |     2 +
 .../proxy-only.MILTIPLE_PROXIES/environment        |     4 +
 .../proxy-only.MILTIPLE_PROXIES/expected           |    10 +
 test/kns/test-proxy/all/config                     |     1 +
 test/kns/test-proxy/all/environment                |     4 +
 test/kns/test-proxy/all/expected                   |     5 +
 test/kns/test-proxy/comma-error/environment        |     1 +
 .../kns/test-proxy/comma-error/expected            |     0
 test/kns/test-proxy/disabled/config                |     2 +
 test/kns/test-proxy/disabled/environment           |     4 +
 .../kns/test-proxy/disabled/expected               |     0
 test/kns/test-proxy/enabled/config                 |     2 +
 test/kns/test-proxy/enabled/environment            |     4 +
 test/kns/test-proxy/enabled/expected               |     5 +
 test/kns/test-proxy/env-kfg/config                 |     2 +
 test/kns/test-proxy/env-kfg/environment            |     4 +
 test/kns/test-proxy/env-kfg/expected               |     5 +
 test/kns/test-proxy/env-only/config                |     2 +
 test/kns/test-proxy/env-only/environment           |     4 +
 test/kns/test-proxy/env-only/expected              |     4 +
 test/kns/test-proxy/error/config                   |     1 +
 test/kns/test-proxy/error/environment              |     1 +
 .../kns/test-proxy/error/expected                  |     0
 test/kns/test-proxy/http_proxy/environment         |     1 +
 test/kns/test-proxy/http_proxy/expected            |     1 +
 test/kns/test-proxy/ignore/config                  |     2 +
 test/kns/test-proxy/ignore/environment             |     4 +
 .../kns/test-proxy/ignore/expected                 |     0
 test/kns/test-proxy/kfg-env/config                 |     2 +
 test/kns/test-proxy/kfg-env/environment            |     4 +
 test/kns/test-proxy/kfg-env/expected               |     5 +
 test/kns/test-proxy/kfg-only/config                |     2 +
 test/kns/test-proxy/kfg-only/environment           |     4 +
 test/kns/test-proxy/kfg-only/expected              |     1 +
 test/kns/test-proxy/no-env/config                  |     1 +
 test/kns/test-proxy/no-env/expected                |     1 +
 test/kns/test-proxy/no-port-no-env/config          |     1 +
 test/kns/test-proxy/no-port-no-env/expected        |     1 +
 test/kns/test-proxy/proxy-not-only/config          |     2 +
 test/kns/test-proxy/proxy-not-only/environment     |     4 +
 test/kns/test-proxy/proxy-not-only/expected        |     5 +
 test/kns/test-proxy/proxy-only/config              |     2 +
 test/kns/test-proxy/proxy-only/environment         |     4 +
 test/kns/test-proxy/proxy-only/expected            |     5 +
 test/kproc/Makefile                                |    55 +
 test/kproc/kproctest.cpp                           |  1000 +
 test/krypto/Makefile                               |   215 +
 test/krypto/test-aes-ciphers.c                     |   792 +
 test/krypto/test-cipher-speed.c                    |   910 +
 test/krypto/test-cmn.cpp                           |   359 +
 test/krypto/test-cmn.hpp                           |    90 +
 test/krypto/test-csprng.c                          |   230 +
 test/krypto/test-encdec.cpp                        |   607 +
 test/krypto/test-krypto-slow.cpp                   |   401 +
 test/krypto/test-modes.c                           |  1261 +
 test/krypto/test-reenc.cpp                         |   376 +
 test/ktst/Makefile                                 |    60 +
 test/ktst/ktsttest.cpp                             |   186 +
 test/loader/Makefile                               |    58 +
 test/loader/loadertest.cpp                         |   407 +
 test/loader/sequence-writer.c                      |   366 +
 test/loader/sequencewriter.vschema                 |    47 +
 test/ngs-c++/CSRA1PileupTest.cpp                   |   742 +
 test/ngs-c++/CSRA1_ReadCollection_test.cpp         |   252 +
 test/ngs-c++/CSRA1test.cpp                         |  1105 +
 test/ngs-c++/Makefile                              |   139 +
 test/ngs-c++/NGStest.cpp                           |    71 +
 test/ngs-c++/SRADBtest.cpp                         |   536 +
 test/ngs-c++/SRAtest.cpp                           |   478 +
 test/ngs-c++/SRR600096                             |   Bin 0 -> 81253 bytes
 test/ngs-c++/SRR611340                             |   Bin 0 -> 211261 bytes
 test/ngs-c++/ngsfixture.hpp                        |    93 +
 test/ngs-c++/seq_spot_id_0.sra                     |   Bin 0 -> 14316329 bytes
 test/ngs-c++/valgrind.suppress                     |    12 +
 test/ngs-java/Makefile                             |   125 +
 test/ngs-java/build.xml                            |    53 +
 test/ngs-java/ngs_test_CSRA1.java                  |   963 +
 test/ngs-java/ngs_test_lib_load.java               |   246 +
 test/ngs-python/Makefile                           |    57 +
 test/ngs-python/build.xml                          |    41 +
 test/ngs-python/tests.py                           |   506 +
 test/ngs/Makefile                                  |   216 +
 test/ngs/data/.gitignore                           |     1 +
 test/ngs/data/SysPathTest/md/cur                   |   Bin 0 -> 21398 bytes
 test/ngs/data/SysPathTest/md5                      |     1 +
 .../data/SysPathTest/tbl/SEQUENCE/col/READ/data    |   Bin 0 -> 143 bytes
 .../ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx |   Bin 0 -> 40 bytes
 .../data/SysPathTest/tbl/SEQUENCE/col/READ/idx0    |     0
 .../data/SysPathTest/tbl/SEQUENCE/col/READ/idx1    |   Bin 0 -> 132 bytes
 .../data/SysPathTest/tbl/SEQUENCE/col/READ/idx2    |   Bin 0 -> 112 bytes
 .../data/SysPathTest/tbl/SEQUENCE/col/READ/md/cur  |   Bin 0 -> 174 bytes
 .../ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/md5 |     6 +
 test/ngs/data/SysPathTest/tbl/SEQUENCE/md/cur      |   Bin 0 -> 21734 bytes
 test/ngs/data/SysPathTest/tbl/SEQUENCE/md5         |     1 +
 test/ngs/ngs_c_fixture.hpp                         |   180 +
 test/ngs/ngstest.cpp                               |   956 +
 test/ngs/ngstest_csra1.cpp                         |  1365 +
 test/ngs/ngstest_csra1_pileup.cpp                  |   577 +
 test/ngs/ngstest_csra1_readcollection.cpp          |   739 +
 test/ngs/ngstest_csra1_refwin.cpp                  |   824 +
 test/ngs/ngstest_fragmentblob.cpp                  |   597 +
 test/ngs/ngstest_makedb.cpp                        |   196 +
 test/ngs/ngstest_reference.cpp                     |   158 +
 test/ngs/ngstest_sra.cpp                           |  1071 +
 test/ngs/ngstest_sradb.cpp                         |   866 +
 test/ngs/valgrind.suppress                         |    16 +
 test/only-remote-repository.kfg                    |     2 +
 test/search/Makefile                               |    61 +
 test/search/PerfCounter.h                          |   211 +
 test/search/agrep-main.c                           |   346 +
 test/search/search-vdb.cpp                         |   512 +
 test/search/search-vdb.h                           |   229 +
 test/search/test-agrep.cpp                         |   928 +
 test/sraxf/Makefile                                |    60 +
 test/sraxf/fix_read_seg-test.cpp                   |   131 +
 test/vdb/.gitignore                                |     1 +
 test/vdb/Makefile                                  |   246 +
 test/vdb/SYS-224064.cpp                            |   237 +
 test/vdb/db/blob_val_inv_chsum.sra                 |   Bin 0 -> 196213 bytes
 test/vdb/kfg/empty/empty.kfg                       |     1 +
 test/vdb/kfg/linux/test-dependencies.kfg           |     3 +
 test/vdb/test-VDB-3060.cpp                         |   411 +
 test/vdb/test-VDB-3061.cpp                         |   250 +
 test/vdb/test-blob-val.cpp                         |   185 +
 test/vdb/test-dependencies.cpp                     |   452 +
 test/vdb/test-sparse-col.cpp                       |   358 +
 test/vdb/test-vdb.cpp                              |   624 +
 test/vdb/test-wvdb.cpp                             |   520 +
 test/vfs/Makefile                                  |   141 +
 test/vfs/caching-kfg/incomplete.kfg                |     4 +
 test/vfs/managertest.cpp                           |   490 +
 test/vfs/ncbi/protected1/SRR999997                 |     1 +
 test/vfs/ncbi/protected1/SRR999997.ncbi_enc        |   Bin 0 -> 32864 bytes
 .../vfs/ncbi/public/refseq/YYZZ99                  |     0
 .../vfs/ncbi/public/refseq/ZZ999999.9              |     0
 .../vfs/ncbi/public/sra/SRR999998.sra              |     0
 .../.gitignore => test/vfs/ncbi/public/wgs/YYZZ99  |     0
 test/vfs/ncbi_enc                                  |   Bin 0 -> 65696 bytes
 test/vfs/path-test.c                               |   765 +
 test/vfs/pathtest.cpp                              |   737 +
 .../redirect-rejected-names-cgi-http-to-https.cpp  |   213 +
 .../incomplete.kfg                                 |     1 +
 .../vfs/repo/wgs/WGS/YY/ZZ/YYZZ10                  |     0
 .../vfs/repo/wgs/WGS/YY/ZZ/YYZZ99                  |     0
 .../vfs/repo/wgs2/WGS/YY/ZZ/YYZZ20                 |     0
 .../vfs/repo/wgs2/WGS/YY/ZZ/YYZZ99                 |     0
 test/vfs/resolvertest.cpp                          |   344 +
 test/vfs/test-caching.cpp                          |   615 +
 test/vxf/Makefile                                  |    83 +
 test/vxf/VDB-2915.cpp                              |   508 +
 test/vxf/local_config/local.kfg                    |     2 +
 test/vxf/wb-irzip-impl.c                           |    88 +
 test/vxf/wb-irzip-impl.h                           |    56 +
 test/vxf/wb-test-vxf.cpp                           |   268 +
 vdb3/itf/kfc/array.hpp                             |   127 +
 vdb3/itf/kfc/atomic-ia32.hpp                       |   500 +
 vdb3/itf/kfc/atomic-x86_64.hpp                     |   356 +
 vdb3/itf/kfc/atomic.hpp                            |   133 +
 vdb3/itf/kfc/callstk.hpp                           |   117 +
 vdb3/itf/kfc/caps.hpp                              |    59 +
 vdb3/itf/kfc/defs.hpp                              |   113 +
 vdb3/itf/kfc/except.hpp                            |   174 +
 vdb3/itf/kfc/fd.hpp                                |   102 +
 vdb3/itf/kfc/fdmgr.hpp                             |    95 +
 vdb3/itf/kfc/integer.hpp                           |   191 +
 vdb3/itf/kfc/log.hpp                               |   118 +
 vdb3/itf/kfc/memmgr.hpp                            |   133 +
 vdb3/itf/kfc/memory.hpp                            |   149 +
 vdb3/itf/kfc/ptr.hpp                               |   174 +
 vdb3/itf/kfc/ref.hpp                               |   155 +
 vdb3/itf/kfc/refcount.hpp                          |    94 +
 vdb3/itf/kfc/rsrc.hpp                              |   150 +
 vdb3/itf/kfc/stream.hpp                            |   135 +
 vdb3/itf/kfc/string.hpp                            |   252 +
 vdb3/itf/kfc/syserr.hpp                            |    57 +
 vdb3/itf/kfc/task-impl.hpp                         |   139 +
 vdb3/itf/kfc/task.hpp                              |   124 +
 vdb3/itf/kfc/time.hpp                              |   299 +
 vdb3/itf/kfc/timemgr.hpp                           |    94 +
 vdb3/itf/kfc/vers.hpp                              |   101 +
 vdb3/src/kfc/Makefile                              |    88 +
 vdb3/src/kfc/array.cpp                             |   152 +
 vdb3/src/kfc/callstk.cpp                           |    60 +
 vdb3/src/kfc/except.cpp                            |   222 +
 vdb3/src/kfc/fd.cpp                                |   204 +
 vdb3/src/kfc/fdmgr.cpp                             |   101 +
 vdb3/src/kfc/integer.cpp                           |   137 +
 vdb3/src/kfc/log.cpp                               |   142 +
 vdb3/src/kfc/memmgr.cpp                            |   162 +
 vdb3/src/kfc/memory.cpp                            |   392 +
 vdb3/src/kfc/pfdmgr.cpp                            |    64 +
 vdb3/src/kfc/pfdmgr.hpp                            |    68 +
 vdb3/src/kfc/plogger.cpp                           |   148 +
 vdb3/src/kfc/plogger.hpp                           |    72 +
 vdb3/src/kfc/pmemmgr.cpp                           |   315 +
 vdb3/src/kfc/pmemmgr.hpp                           |    75 +
 vdb3/src/kfc/ptimemgr.cpp                          |    81 +
 vdb3/src/kfc/ptimemgr.hpp                          |    64 +
 vdb3/src/kfc/ptr.cpp                               |   206 +
 vdb3/src/kfc/ref.cpp                               |   140 +
 vdb3/src/kfc/refcount.cpp                          |   113 +
 vdb3/src/kfc/rsrc.cpp                              |   141 +
 vdb3/src/kfc/stream.cpp                            |   395 +
 vdb3/src/kfc/string.cpp                            |  1324 +
 vdb3/src/kfc/syserr.cpp                            |    97 +
 vdb3/src/kfc/task-impl.cpp                         |   352 +
 vdb3/src/kfc/task.cpp                              |   109 +
 vdb3/src/kfc/time.cpp                              |   290 +
 vdb3/src/kfc/timemgr.cpp                           |   105 +
 vdb3/src/kfc/vers.cpp                              |    85 +
 3010 files changed, 635622 insertions(+), 299489 deletions(-)

diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index 9c2648f..0000000
--- a/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-### Verify
-Can you see anything in the logs? 
-Make sure your issue is not already in the [htsjdk issue tracker](https://github.com/samtools/htsjdk/issues?q=)
-
-### Subject of the issue
-Describe your issue here.
-Provide **screenshots** , **stacktrace** , **logs** where appropriate.
-
-### Your environment
-* version of htsjdk
-* version of java
-* which OS
-
-### Steps to reproduce
-Tell us how to reproduce this issue. If possible, include a short code snippet to demonstrate the problem.
-
-### Expected behaviour
-Tell us what should happen
-
-### Actual behaviour
-Tell us what happens instead
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 300af57..0000000
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### Description
-
-Please explain the changes you made here.
-Explain the **motivation** for making this change. What existing problem does the pull request solve?
-
-### Checklist
-
-- [ ] Code compiles correctly
-- [ ] New tests covering changes and new functionality
-- [ ] All tests passing
-- [ ] Extended the README / documentation, if necessary
-- [ ] Is not backward compatible (breaks binary or source compatibility)
-
diff --git a/.gitignore b/.gitignore
index a20c2c9..40b02ab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,19 +1,34 @@
-htsjdk.iws
-.command_tmp
-atlassian-ide-plugin.xml
-/htsjdk.version.properties
-/test-output
+user.status
+vgcore.*
+/bin64
+/build/COMP.mac
+/build/Makefile.config*
+/build/MSVC/2010/ipch
+/build/MSVC/2010/ncbi-vdb.opensdf
+/centos
+/ilib64
+/lib64
+/mac
+/Makefile.config.mac.arch
+/reconfigure
+/schema
+/test-bin64
+user.status
+/win
+*.opensdf
+*.sdf
+*.suo
+*.log
+/.cproject
+/.project
+/.pydevproject
 
-#intellij
-.idea/
-src/htsjdk.iml
-*.iml
-*.ipr
-*.iws
+# mac os x meta-files
+.DS_Store
+._*
 
-
-
-
-#gradle stuff
-.gradle/
-build/
+*~
+\#*
+.\#*
+core
+*.pyc
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 1e92599..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: java
-dist: trusty
-sudo: true
-before_cache:
-  - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
-cache:
-  directories:
-    - $HOME/.gradle/caches/
-    - $HOME/.gradle/wrapper/
-    - $HOME/.m2
-jdk:
-  - oraclejdk8
-script: ./gradlew jacocoTestReport testSRA;
-after_success:
-  - echo "TRAVIS_BRANCH='$TRAVIS_BRANCH'";
-    echo "JAVA_HOME='$JAVA_HOME'";
-    ./gradlew coveralls;
-    if [ "$TRAVIS_BRANCH" == "master" ]; then
-       ./gradlew uploadArchives;
-    fi
diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
index 0000000..02cfc3f
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,58 @@
+# NCBI External Developer Release:
+
+## NCBI VDB 2.8.1
+**December 22, 2016**
+
+  **kfg**: added possibility to create an empty KConfig object that does not try to load any file  
+
+
+## NCBI VDB 2.8.0
+**October 7, 2016**
+
+### HTTPS-ENABLED RELEASE
+
+  **kfg, kns**: Use environment variables to determine the proxy for a http protocol  
+  **kfg, vdb-config**: vdb-config-GUI has now option to pick up proxy-setting from environment  
+  **kns**: All tools and libraries now support https  
+  **kns**: replaced all direct uses of sleep() within code to enforce standardization upon mS.  
+  **kproc, ncbi-vdb**: Fixed KCondition to generate timeout error on Windows when timeout exhausted  
+  **ngs-engine**: improved diagnostic messages  
+  **test**: updated tests to not fail outside of NCBI  
+  **test-sra**: test-sra prints network information  
+  **test-sra**: test-sra prints version of ncbi-vdb or ngs-sdk dynamic library  
+  **vdb**: improved parameter checking on VDatabaseOpenTableRead()  
+  **vdb**: new function: "VDBManagerDeleteCacheOlderThan()"  
+  **vdb**: problem with buffer-overrun when compressing random data fixed  
+  **vdb**: remote/aux nodes have been removed from configuration  
+
+
+## NCBI VDB 2.7.0
+**July 12, 2016**
+
+  **blast, kfg, ncbi-vdb, sra-tools, vfs**: restored possibility to disable local caching  
+  **doc, ncbi-vdb**: created a Wiki page illustrating how to use the API to set up logging  
+  **kdb, kfs, kns**: Added blob validation for data being fetched remotely  
+  **kfg**: When loading configuration files on Windows USERPROFILE environment variable is used before HOME  
+  **kfg**: modified auxiliary remote access configuration to use load-balanced servers  
+  **kns**: Fixed a bug when KHttpRequestPOST generated an incorrect Content-Length after retry  
+  **ngs, search, sra-search**: sra-search was modified to support multiple threads.  
+  **ngs-engine, ngs-tools, sra-tools, vfs**: The "auxiliary" nodes in configuration are now ignored  
+  **ngs-engine**: Added support for blob-by-blob access to SEQUENCE table  
+  **ngs-engine**: removed a potential memory leak in NGS_CursorMake()  
+  **search**: now supports multi-threaded search  
+  **vdb**: fixed a bug in VCursorFindNextRowIdDirect where it returned a wrong rowId  
+  **vdb**: fixed a bug in the code used to iterate over blobs where rowmap expansion cache would reset iteration to initial row instead of respecting sequence  
+  **vfs**: environment variable VDB_PWFILE is no longer used  
+
+
+## NCBI VDB 2.6.3
+**May 25, 2016**
+
+  **vdb**: Fixed a bound on memory cache that would never flush under certain access modes  
+
+## NCBI VDB 2.6.2
+**April 20, 2016**
+
+  **kdb**: Fixed VTableDropColumn, so that it can drop static columns  
+  **kfs, kns**: Fixed thread safety issues for both cache and http files  
+  **kproc**: Fixed KQueue to wake waiters when sealed, fixed KSemaphore to wake waiters when canceled  
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..ab19612
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,77 @@
+CONTENTS
+
+  Public Domain Notice
+  Exceptions (for bundled 3rd-party code)
+  Copyright F.A.Q.
+
+
+==============================================================
+                     PUBLIC DOMAIN NOTICE
+         National Center for Biotechnology Information
+
+With the exception of certain third-party files summarized below, this
+software is a "United States Government Work" under the terms of the
+United States Copyright Act.  It was written as part of the authors'
+official duties as United States Government employees and thus cannot
+be copyrighted.  This software is freely available to the public for
+use. The National Library of Medicine and the U.S. Government have not
+placed any restriction on its use or reproduction.
+
+Although all reasonable efforts have been taken to ensure the accuracy
+and reliability of the software and data, the NLM and the U.S.
+Government do not and cannot warrant the performance or results that
+may be obtained by using this software or data. The NLM and the U.S.
+Government disclaim all warranties, express or implied, including
+warranties of performance, merchantability or fitness for any
+particular purpose.
+
+Please cite the authors in any work or product based on this material.
+
+
+==============================================================
+EXCEPTIONS (in all cases excluding NCBI-written makefiles):
+
+Location: {libs,interfaces}/ext/bzip2
+Author:   Julian R Seward
+License:  BSDish [libs/ext/bzip2/LICENSE]
+
+Location: {libs,interfaces}/ext/zlib
+Authors:  Jean-loup Gailly and Mark Adler
+License:  BSDish [interfaces/ext/zlib.h]
+
+Location: libs/klib
+Author:   Douglas C. Schmidt
+License:  GNU Lesser General Public [libs/klib/qsort.c]
+
+
+==============================================================
+Copyright F.A.Q.
+
+
+--------------------------------------------------------------
+Q. Our product makes use of the NCBI source code, and we made changes
+   and additions to that version of the NCBI code to better fit it to
+   our needs. Can we copyright the code, and how?
+
+A. You can copyright only the *changes* or the *additions* you made to the
+   NCBI source code. You should identify unambiguously those sections of
+   the code that were modified, e.g. by commenting any changes you made
+   in the code you distribute. Therefore, your license has to make clear
+   to users that your product is a combination of code that is public domain
+   within the U.S. (but may be subject to copyright by the U.S. in foreign
+   countries) and code that has been created or modified by you.
+
+--------------------------------------------------------------
+Q. Can we (re)license all or part of the NCBI source code?
+
+A. No, you cannot license or relicense the source code written by NCBI
+   since you cannot claim any copyright in the software that was developed
+   at NCBI as a 'government work' and consequently is in the public domain
+   within the U.S.
+
+--------------------------------------------------------------
+Q. What if these copyright guidelines are not clear enough or are not
+   applicable to my particular case?
+
+A. Contact us. Send your questions to 'sra-tools at ncbi.nlm.nih.gov'.
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..792d697
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,159 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+#-------------------------------------------------------------------------------
+# environment
+#
+TOP ?= $(CURDIR)
+include $(TOP)/build/Makefile.shell
+
+
+#-------------------------------------------------------------------------------
+# default
+#
+SUBDIRS = \
+	libs \
+
+# common targets for non-leaf Makefiles; must follow a definition of SUBDIRS
+include $(TOP)/build/Makefile.targets
+
+default: $(SUBDIRS)
+
+test: $(SUBDIRS)
+
+$(SUBDIRS) test:
+	@ $(MAKE) -C $@
+
+.PHONY: default $(SUBDIRS) test
+
+#-------------------------------------------------------------------------------
+# all
+#
+$(SUBDIRS_ALL):
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(SUBDIRS_STD):
+
+#-------------------------------------------------------------------------------
+# install
+#
+
+install: 
+	@ echo "Checking make status of object libraries..."
+	@ $(MAKE) -s --no-print-directory TOP=$(CURDIR) $(SUBDIRS)
+	@ $(MAKE) -s --no-print-directory TOP=$(CURDIR) -f build/Makefile.install install
+
+uninstall:    
+	@ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.install uninstall
+
+.PHONY: install uninstall
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: clean_test
+
+clean_test:
+	@ $(MAKE) -s -C test clean
+
+#-------------------------------------------------------------------------------
+# runtests
+#
+runtests: runtests_test
+
+runtests_test:
+	@ $(MAKE) -s -C test runtests
+
+#-------------------------------------------------------------------------------
+# slowtests
+#
+slowtests: slowtests_test
+
+slowtests_test:
+	@ $(MAKE) -s -C test slowtests
+
+#-------------------------------------------------------------------------------
+# valgrind
+#
+valgrind: valgrind_test
+
+valgrind_test:
+	@ $(MAKE) -s -C test valgrind
+
+#-------------------------------------------------------------------------------
+# pass-through targets
+#
+COMPILERS = GCC ICC VC++ CLANG
+ARCHITECTURES = i386 x86_64 sparc32 sparc64
+CONFIG = debug profile release
+PUBLISH = scm pubtools
+REPORTS = bindir targdir osdir config compilers architecture architectures
+PASSTHRUS = \
+	out \
+	CC $(COMPILERS) \
+	$(ARCHITECTURES) \
+	$(CONFIG) $(PUBLISH) \
+	purify purecov \
+	local static dynamic
+
+$(RHOSTS):
+	@ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env local
+	@ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env require-proxy-exec
+	@ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env $@
+	@ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env rebuild-dirlinks config
+
+$(PASSTHRUS):
+	@ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env $@
+	@ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env rebuild-dirlinks config
+
+$(REPORTS):
+	@ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env $@
+
+.PHONY: $(PASSTHRUS) $(RHOSTS) $(REPORTS)
+
+
+#-------------------------------------------------------------------------------
+# configuration help
+#
+help configure:
+	@ echo "Before initial build, run 'make OUTDIR=<dir> out' from"
+	@ echo "the project root to set the output directory of your builds."
+	@ echo
+	@ echo "To select a compiler, run 'make <comp>' where"
+	@ echo "comp = { "$(COMPILERS)" }."
+	@ echo
+	@ echo "For hosts that support cross-compilation ( only Macintosh today ),"
+	@ echo "you can run 'make <arch>' where arch = { "$(ARCHITECTURES)" }."
+	@ echo
+	@ echo "To set a build configuration, run 'make <config>' where"
+	@ echo "config = { "$(CONFIG)" }."
+	@ echo
+	@ echo "To select a remote build configuration, run 'make <rhost>' where"
+	@ echo "rhost = { "$(RHOSTS)" }."
+	@ echo
+
+.PHONY: help configure
diff --git a/README.md b/README.md
index 0e468d3..1804521 100644
--- a/README.md
+++ b/README.md
@@ -1,107 +1,31 @@
-[![Coverage Status](https://coveralls.io/repos/github/samtools/htsjdk/badge.svg?branch=master)](https://coveralls.io/github/samtools/htsjdk?branch=master)
-[![Build Status](https://travis-ci.org/samtools/htsjdk.svg?branch=master)](https://travis-ci.org/samtools/htsjdk)
-[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.samtools/htsjdk/badge.svg)](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.github.samtools%22%20AND%20a%3A%22htsjdk%22)
-[![License](http://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/samtools/htsjdk)
-[![Language](http://img.shields.io/badge/language-java-brightgreen.svg)](https://www.java.com/)
+# The NCBI SRA ( Sequence Read Archive )
 
-Status of downstream projects automatically built on top of the current htsjdk master branch. See [gatk-jenkins](https://gatk-jenkins.broadinstitute.org/view/HTSJDK%20Release%20Tests/) for detailed logs. Failure may indicate problems  in htsjdk, but may also be due to expected incompatibilities between versions, or unrelated failures in downstream projects.
-- [Picard](https://github.com/broadinstitute/picard):  [![Build Status](https://gatk-jenkins.broadinstitute.org/buildStatus/icon?job=picard-on-htsjdk-master)](https://gatk-jenkins.broadinstitute.org/job/picard-on-htsjdk-master/)
-- [GATK 4](https://github.com/broadinstitute/gatk): [![Build Status](https://gatk-jenkins.broadinstitute.org/buildStatus/icon?job=gatk-on-htsjdk-master)](https://gatk-jenkins.broadinstitute.org/job/gatk-on-htsjdk-master/)
+### Contact:
+email: sra-tools at ncbi.nlm.nih.gov
 
-## A Java API for high-throughput sequencing data (HTS) formats.  
+### Change Log
+Please check the CHANGES.md file for change history.
 
-HTSJDK is an implementation of a unified Java library for accessing
-common file formats, such as [SAM][1] and [VCF][2], used for high-throughput
-sequencing data.  There are also an number of useful utilities for 
-manipulating HTS data.
+## NCBI VDB
+The SRA Toolkit and SDK from NCBI is a collection of tools and libraries for
+using data in the INSDC Sequence Read Archives.
 
-Please see the [HTSJDK Documentation](http://samtools.github.io/htsjdk) for more information.
+### IMPORTANT ANNOUNCEMENT
+As was announced in [OMB memorandum M-15-13](https://www.whitehouse.gov/sites/default/files/omb/memoranda/2015/m-15-13.pdf) on June 8, 2015, NCBI and all Federal systems will be transitioning to using HTTPS-only protocols before the end of 2016. This change will affect any software that uses NCBI APIs such as the E-utilities or NCBI software toolkits such as `sra-tools`, `ncbi-vdb` or `ngs`.
 
-> **NOTE: _HTSJDK does not currently support the latest Variant Call Format Specification (VCFv4.3 and BCFv2.2)._**
+The NLM and NCBI may implement the switch to HTTPS-only as early as September 30, 2016.
 
-#### Building HTSJDK
+In particular, software products that depend on `sra-tools`, `ncbi-vdb` or `ngs` may not function as expected after September 30 unless they are properly updated from this site or by the software provider.
 
-HTSJDK is now built using [gradle](http://gradle.org/).
-
-A wrapper script (`gradlew`) is included which will download the appropriate version of gradle on the first invocation.
-
-Example gradle usage from the htsjdk root directory:
- - compile and build a jar 
- ```
- ./gradlew
- ```
- or
- ```
- ./gradlew jar
- ```
- The jar will be in build/libs/htsjdk-\<version\>.jar where version is based on the current git commit.
-
- - run tests, a specific test class, or run a test and wait for the debugger to connect
- ```
- ./gradlew test
-
- ./gradlew test -Dtest.single=TestClassName
-
- ./gradlew test --tests htsjdk.variant.variantcontext.AlleleUnitTest
- ./gradlew test --tests "*AlleleUnitTest"
-
- ./gradlew test --tests "*AlleleUnitTest" --debug-jvm
- ```
-
-- run tests and collect coverage information (report will be in `build/reports/jacoco/test/html/index.html`)
-```
-./gradlew jacocoTestReport
-```
-
- - clean the project directory
- ```
- ./gradlew clean
- ```
-
- - build a monolithic jar that includes all of htsjdk's dependencies
- ```
- ./gradlew shadowJar
- ```
+If you use software that accesses NCBI SRA data in any way, your software will likely be affected by this change. Please check with your software provider for recent udpates or patches, and be sure to acquire these before September 30.
  
- - create a snapshot and install it into your local maven repository
- ```
- ./gradlew install
- ```
-
- - for an exhaustive list of all available targets
- ```
- ./gradlew tasks
- ```
-
-#### Create an HTSJDK project in IntelliJ
-To create a project in IntelliJ IDE for htsjdk do the following:
-
-1. Select fom the menu: `File -> New -> Project from Existing Sources`
-2. In the resulting dialog, chose `Import from existing model`, select `Gradle` and `Next`
-3. Choose the `default gradle wrapper` and `Finish`.
-
-From time to time if dependencies change in htsjdk you may need to refresh the project from the `View -> Gradle` menu.
-
-#### Licensing Information
-
-Not all sub-packages of htsjdk are subject to the same license, so a license notice is included in each source file or sub-package as appropriate. Please check the relevant license notice whenever you start working with a part of htsjdk that you have not previously worked with to avoid any surprises. 
-
-#### Java Minimum Version Support Policy
-
-> **NOTE: _Effective November 24th 2015, HTSJDK has ended support of Java 7 and previous versions. Java 8 is now required_.**
-
-We will support all Java SE versions supported by Oracle until at least six months after Oracle's Public Updates period has ended ([see this link](http://www.oracle.com/technetwork/java/eol-135779.html)).
-
-Java SE Major Release | End of Java SE Oracle Public Updates | Proposed End of Support in HTSJDK | Actual End of Support in HTSJDK
----- | ---- | ---- | ----
-6 | Feb 2013 | Aug 2013 | Oct 2015
-7 | Apr 2015 | Oct 2015 | Oct 2015
-8* | Mar 2017 | Sep 2017 | Sep 2017
+If you develop software that relies on `sra-tools`, `ncbi-vdb` or `ngs` in any way, you will likely need to update your code so that it accesses NCBI using HTTPS.
 
-* to be finalized
+We have released new tools with version 2.8.0 that are HTTPS compatible and `M-15-13` compliant as of October 7, 2016. Please be certain to [update all of your binaries](https://github.com/ncbi/sra-tools/wiki/Downloads) and configuration files.
 
-HTSJDK is migrating to semantic versioning (http://semver.org/). We will eventually adhere to it strictly and bump our major version whenever there are breaking changes to our API, but until we more clearly define what constitutes our official API, clients should assume that every release potentially contains at least minor changes to public methods.
+For additional information on using, configuring, and building the toolkit,
+please visit our [wiki](https://github.com/ncbi/sra-tools/wiki)
+or our web site at [NCBI](http://www.ncbi.nlm.nih.gov/Traces/sra/?view=toolkit_doc)
 
-[1]: http://samtools.sourceforge.net
-[2]: http://vcftools.sourceforge.net/specs.html
 
+SRA Toolkit Development Team
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 9e8f351..0000000
--- a/build.gradle
+++ /dev/null
@@ -1,227 +0,0 @@
-buildscript {
-    repositories {
-        mavenCentral()
-    }
-}
-
-plugins {
-    id "java"
-    id 'maven'
-    id 'signing'
-    id 'jacoco'
-    id 'com.palantir.git-version' version '0.5.1'
-    id 'com.github.johnrengelman.shadow' version '1.2.3'
-    id "com.github.kt3k.coveralls" version "2.6.3"
-}
-
-repositories {
-    mavenCentral()
-}
-
-jacocoTestReport {
-    dependsOn test
-    group = "Reporting"
-    description = "Generate Jacoco coverage reports after running tests."
-    additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
-
-    reports {
-        xml.enabled = true // coveralls plugin depends on xml format report
-        html.enabled = true
-    }
-}
-
-jacoco {
-    toolVersion = "0.7.5.201505241946"
-}
-
-dependencies {
-    compile "org.apache.commons:commons-jexl:2.1.1"
-    compile "commons-logging:commons-logging:1.1.1"
-    compile "org.xerial.snappy:snappy-java:1.0.3-rc3"
-    compile "org.apache.commons:commons-compress:1.4.1"
-    compile "org.tukaani:xz:1.5"
-    compile "gov.nih.nlm.ncbi:ngs-java:1.2.4"
-
-    testCompile "org.testng:testng:6.9.9"
-}
-
-sourceCompatibility = 1.8
-targetCompatibility = 1.8
-
-final isRelease = Boolean.getBoolean("release")
-final gitVersion = gitVersion().replaceAll(".dirty", "")
-version = isRelease ? gitVersion : gitVersion + "-SNAPSHOT"
-
-logger.info("build for version:" + version)
-group = 'com.github.samtools'
-
-defaultTasks 'jar'
-
-jar {
-    manifest {
-        attributes 'Implementation-Title': 'HTSJDK',
-                'Implementation-Vendor' : 'Samtools Organization',
-                'Implementation-Version': version
-    }
-}
-
-import org.gradle.internal.os.OperatingSystem;
-
-tasks.withType(Test) {
-    outputs.upToDateWhen { false } // tests will always rerun
-    useTestNG()
-
-    // set heap size for the test JVM(s)
-    minHeapSize = "1G"
-    maxHeapSize = "2G"
-
-    jvmArgs '-Djava.awt.headless=true'  //this prevents awt from displaying a java icon while the tests are running
-
-    if (System.env.CI == "true") {  //if running under a CI output less into the logs
-        int count = 0
-
-        beforeTest { descriptor ->
-            count++
-            if( count % 100 == 0) {
-                logger.lifecycle("Finished "+ Integer.toString(count++) + " tests")
-            }
-        }
-    } else {
-        // show standard out and standard error of the test JVM(s) on the console
-        testLogging.showStandardStreams = true
-        beforeTest { descriptor ->
-            logger.lifecycle("Running Test: " + descriptor)
-        }
-
-        // listen to standard out and standard error of the test JVM(s)
-        onOutput { descriptor, event ->
-            logger.lifecycle("Test: " + descriptor + " produced standard out/err: " + event.message )
-        }
-    }
-
-    testLogging {
-        testLogging {
-            events "skipped", "failed"
-            exceptionFormat = "full"
-        }
-        afterSuite { desc, result ->
-            if (!desc.parent) { // will match the outermost suite
-                println "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)"
-            }
-        }
-    }
-}
-
-test {
-    description = "Runs the unit tests other than the SRA tests"
-
-    useTestNG {
-        if( OperatingSystem.current().isUnix() ){
-            excludeGroups "slow", "broken", "sra"
-        } else {
-            excludeGroups "slow", "broken", "unix", "sra"
-        }
-    }
-}
-
-task testSRA(type: Test) {
-    jvmArgs '-Dsamjdk.sra_libraries_download=true'
-
-    description "Run the SRA tests"
-    useTestNG {
-        configFailurePolicy 'continue'
-        includeGroups "sra"
-    }
-}
-
-task wrapper(type: Wrapper) {
-    description = "Regenerate the gradle wrapper"
-    gradleVersion = '2.13'
-}
-
-// This is a hack to disable the java 8 default javadoc lint until we fix the html formatting
-if (JavaVersion.current().isJava8Compatible()) {
-    tasks.withType(Javadoc) {
-        options.addStringOption('Xdoclint:none', '-quiet')
-    }
-}
-
-task javadocJar(type: Jar, dependsOn: javadoc) {
-    classifier = 'javadoc'
-    from 'build/docs/javadoc'
-}
-
-task sourcesJar(type: Jar) {
-    from sourceSets.main.allSource
-    classifier = 'sources'
-}
-
-/**
- *This specifies what artifacts will be built and uploaded when performing a maven upload.
- */
-artifacts {
-    archives jar
-    archives javadocJar
-    archives sourcesJar
-}
-
-/**
- * Sign non-snapshot releases with our secret key.  This should never need to be invoked directly.
- */
-signing {
-    required { isRelease && gradle.taskGraph.hasTask("uploadArchives") }
-    sign configurations.archives
-}
-
-/**
- * Upload a release to sonatype.  You must be an authorized uploader and have your sonatype
- * username and password information in your gradle properties file.  See the readme for more info.
- *
- * For releasing to your local maven repo, use gradle install
- */
-uploadArchives {
-    repositories {
-        mavenDeployer {
-            beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
-
-            repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
-                authentication(userName: project.findProperty("sonatypeUsername"), password: project.findProperty("sonatypePassword"))
-            }
-
-            snapshotRepository(url: "https://artifactory.broadinstitute.org/artifactory/libs-snapshot-local/") {
-                authentication(userName: System.env.ARTIFACTORY_USERNAME, password: System.env.ARTIFACTORY_PASSWORD)
-            }
-
-            pom.project {
-                name 'HTSJDK'
-                packaging 'jar'
-                description 'A Java API for high-throughput sequencing data (HTS) formats'
-                url 'http://samtools.github.io/htsjdk/'
-
-                developers {
-                    developer {
-                        id 'picard'
-                        name 'Picard Team'
-                        url 'http://broadinstitute.github.io/picard'
-                    }
-                }
-
-                scm {
-                    url 'git at github.com:samtools/htsjdk.git'
-                    connection 'scm:git:git at github.com:samtools/htsjdk.git'
-                }
-
-                licenses {
-                    license {
-                        name 'MIT License'
-                        url 'http://opensource.org/licenses/MIT'
-                        distribution 'repo'
-                    }
-                }
-            }
-        }
-    }
-    doFirst{
-        System.out.println("Uploading version $version")
-    }
-}
diff --git a/build.xml b/build.xml
deleted file mode 100755
index 59bebde..0000000
--- a/build.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  ~ The MIT License
-  ~
-  ~ Copyright (c) 2009 The Broad Institute
-  ~
-  ~ 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
-  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-  ~ THE SOFTWARE.
-  -->
-
-<project name="htsjdk" basedir="." default="all">
-
-
-    <property name="gradle.executable" location="gradlew"/>
-
-    <echo>
-        ANT IS DEPRECATED FOR BUILDING HTSJDK
-
-        Please switch to using gradlew
-
-        Examples:
-        compile htsjdk or it's tests
-          ./gradlew compileJava
-          ./gradlew compileTest
-
-        build a jar
-          ./gradlew jar
-
-        build a jar, along with source and document jars
-        ./gradlew build
-
-        build a jar that packages all of htsjdk's dependencies in a single jar
-        ./gradlew shadowJar
-
-        run tests, or a single test, or run a test and wait for the debugger
-          ./gradlew test
-          ./gradlew test --tests "*AlleleUnitTest"
-          ./gradlew test --tests "*AlleleUnitTest" --debug-jvm
-
-        clean the project directory
-          ./gradlew clean
-
-        see an exhaustive list of all available targets
-          ./gradlew tasks
-    </echo>
-
-</project>
diff --git a/build/.gitignore b/build/.gitignore
new file mode 100644
index 0000000..0f6621b
--- /dev/null
+++ b/build/.gitignore
@@ -0,0 +1,10 @@
+.cvsignore
+RHOST* ARCH* BUILD* COMP* OUTDIR*
+STATIC
+ld.linux.exe_cmd.sh
+LNKG.*
+*.sdf
+*.suo
+*.user
+
+
diff --git a/build/Makefile.cc b/build/Makefile.cc
new file mode 100644
index 0000000..590b55e
--- /dev/null
+++ b/build/Makefile.cc
@@ -0,0 +1,67 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# compilers
+CC = @ $(TOP)/build/$(OS)-cc.sh $(OS) 'cc -c' \
+	 $(CHECKSUM) --objx $(OBJX) --cflags "$(CFLAGS)" -MD
+CP = @ $(TOP)/build/$(OS)-c++.sh $(OS) 'c++ -c' \
+	 $(CHECKSUM) --objx $(OBJX) --cflags "$(CPFLAGS)" -MD
+
+# C preprocessor
+PP = cc -E $(CFLAGS)
+
+# linkers
+LD = @ $(TOP)/build/ld.sh $(OS) $(ARCH) cc \
+	--build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+	$(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+	-MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+LP = @ $(TOP)/build/ld.sh $(OS) $(ARCH) c++ \
+	--build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+	$(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+	-MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+# tool options
+WARN =
+
+ifeq (64,$(BITS))
+	CARCH = -m64
+else
+	CARCH = -m32
+endif
+
+ifeq (prof, $(BUILD))
+	PROF = -xpg
+endif
+
+ifeq (dbg, $(BUILD))
+	DBG = -g
+	OPT = $(WARN)
+	NOPT = $(WARN)
+	PED = -xc99=all -Xc -v
+else
+	OPT = -xO3
+	PED = -xc99=all # -Xc -v
+endif
diff --git a/build/Makefile.clang b/build/Makefile.clang
new file mode 100644
index 0000000..f6e54d5
--- /dev/null
+++ b/build/Makefile.clang
@@ -0,0 +1,80 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# compilers
+CC = @ $(TOP)/build/cc.sh $(OS) 'clang -c' \
+	 $(CHECKSUM) --objx $(OBJX) --cflags "$(CFLAGS)" -MD
+CP = @ $(TOP)/build/cc.sh $(OS) 'clang++ -c' \
+	 $(CHECKSUM) --objx $(OBJX) --cflags "$(CPFLAGS)" -MD
+
+# C preprocessor
+PP = gcc -E $(CFLAGS)
+
+# linkers
+LD = @ $(TOP)/build/ld.sh $(OS) $(ARCH) clang \
+	--build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+	$(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+	-MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+LPFLAGS = $(LDFLAGS)
+
+LP = @ $(TOP)/build/ld.sh $(OS) $(ARCH) clang++ \
+	--build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+	$(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+	-MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+# tool options
+WARN = -Wall -Wno-variadic-macros -Wno-long-long # -Wconversion
+
+ifeq (64,$(BITS))
+	CARCH = -m64
+else
+ifeq (32_64,$(BITS))
+	CARCH = -arch i386 -arch x86_64  
+else    
+	CARCH = -m32
+endif    
+endif
+
+ifeq (prof, $(BUILD))
+	PROF = -pg
+endif
+
+ifeq (dbg, $(BUILD))
+	DBG = -g
+	OPT = $(WARN)
+	NOPT = $(WARN)
+	PED = -std=c99 -pedantic # -fdiagnostics-show-option
+else
+
+ifeq (x86_64, $(ARCH))
+	OPT = -O3 -Wall -Wno-variadic-macros -fno-strict-aliasing
+else
+	OPT = -O3 -Wno-variadic-macros -fno-strict-aliasing
+endif
+endif
+
+# clang is designed to be a GCC substitute
+COMP_DAD = gcc
diff --git a/build/Makefile.env b/build/Makefile.env
new file mode 100644
index 0000000..17bed71
--- /dev/null
+++ b/build/Makefile.env
@@ -0,0 +1,373 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# pick up dependencies from object directory
+ifdef SRCDIR
+	include $(wildcard *.d)
+endif
+
+# determine shell environment
+include $(TOP)/build/Makefile.shell
+
+# load build configuration
+include $(CONFIG_FILE)
+
+# normally build shared and static external libs
+LIBEXT = $(LIBX) $(SHLX)
+
+# normally build static intermediate libs
+ILIBEXT = $(LIBX)
+
+# determine BUILD
+ifeq (,$(BUILD))
+	BUILD = dbg
+endif
+
+# some rules are sensitive to the type of build
+BUILDTYPE = $(BUILD)
+
+# adjust settings for build
+ifeq (dbg,$(BUILD))
+	DEBUG := -D_DEBUGGING
+endif
+ifeq (prof,$(BUILD))
+	DEBUG := -D_PROFILING
+endif
+ifeq (pur,$(BUILD))
+	DEBUG := -D_DEBUGGING
+	LD_PRE := purify
+	LNKG = stat
+endif
+ifeq (pcov,$(BUILD))
+	DEBUG := -D_DEBUGGING
+	LD_PRE := purecov
+	LNKG = stat
+endif
+ifeq (scm,$(BUILD))
+	BUILDTYPE = rel
+	CHECKSUM := --checksum
+endif
+
+ifeq (yes,$(HAS_RHOST))
+	LOCAL_OR_REMOTE = remote
+else
+	LOCAL_OR_REMOTE = local
+endif
+
+
+# drop all suffix rules
+.SUFFIXES:
+
+# load OS and COMP specific files
+include $(TOP)/build/Makefile.$(OS)
+include $(TOP)/build/Makefile.$(COMP)
+include $(TOP)/build/Makefile.rules
+
+# external schema modules
+EXT_SCHEMA_MODULES = axf sraxf wgsxf vxf
+UPDATE_SCHEMA_LIBS := $(addprefix -lw,$(EXT_SCHEMA_MODULES))
+READONLY_SCHEMA_LIBS = $(addprefix -l,$(EXT_SCHEMA_MODULES))
+ALWAYS_STATIC_SCHEMA_LIBS = $(addprefix -s,$(EXT_SCHEMA_MODULES))
+
+# full directory paths
+TARGDIR ?= $(OUTDIR)/$(OS)/$(TOOLSET)/$(ARCH)/$(BUILD)
+BINDIR ?= $(TARGDIR)/bin
+ifeq (win,$(OS))
+    # on Windows, place test executables next to .dlls
+    TEST_BINDIR = $(BINDIR)
+else
+    TEST_BINDIR = $(TARGDIR)/test-bin
+endif
+ILIBDIR = $(TARGDIR)/ilib
+LIBDIR = $(TARGDIR)/lib
+OBJDIR = $(TARGDIR)/obj/$(MODULE)
+
+CLSPATH         ?= $(TARGDIR)/java
+CLASSPATH       ?= $(CLSPATH)
+CLASSDIR        ?= $(TARGDIR)/$(MODULE)
+TEST_CLSPATH    ?= $(TARGDIR)/test/java
+JAVASOURCEPATH  ?= $(TOP)/java
+
+# path to the ncbi sub-directory
+# this is where modules and installed schema files are kept
+ifeq (win,$(OS))
+    # under Windows, we are always relative to binary path
+	NCBIDIR = $(BINDIR)/ncbi
+else
+	# under Linux and Mac, it can be binary or library
+	NCBIDIR = $(LIBDIR)/ncbi $(BINDIR)/ncbi
+endif
+
+# make reissue command
+MAKE_CMD = $(MAKE) BUILD=$(BUILD) TOOLSET=$(TOOLSET) COMP=$(COMP) LNKG=$(LNKG) \
+    TOP=$(TOP) SRCDIR=$(SRCDIR) OUTDIR=$(OUTDIR) -C $(OBJDIR) -f $(SRCDIR)/Makefile
+
+JMAKE_CMD = $(MAKE) BUILD=$(BUILD) TOOLSET=$(TOOLSET) COMP=$(COMP) LNKG=$(LNKG) \
+    TOP=$(TOP) SRCDIR=$(SRCDIR) OUTDIR=$(OUTDIR) -C $(CLASSDIR) -f $(SRCDIR)/Makefile
+
+# directory and link creation
+SUBDIRS = bin test-bin ilib lib
+OUTDIRS = schema
+
+# compilation rules
+#MAKE_JOBS = 16
+
+stdcompile: makedirs
+	@ $(MAKE_CMD) -j$(MAKE_JOBS) $(TARGDIR)/compile
+
+# clean rules
+stdclean:
+	@ -rm -rf $(OBJDIR)
+	@ -rm -rf $(addprefix $(OUTDIR)/$(OS)/$(TOOLSET)/,dyn stat)
+	@ -rm -rf $(addsuffix .*,$(addprefix $(ILIBDIR)/,$(ALL_LIBS))) \
+			$(addsuffix .*,$(addprefix $(LIBDIR)/,$(ALL_LIBS))) \
+			$(addsuffix -static.*,$(addprefix $(LIBDIR)/,$(ALL_LIBS))) \
+			$(addsuffix *,$(addprefix $(BINDIR)/,$(ALL_TOOLS) $(ALL_LIBS))) \
+			$(addsuffix *,$(addprefix $(TEST_BINDIR)/,$(ALL_TOOLS) $(TEST_TOOLS) $(SLOW_TEST_TOOLS)))
+
+stdjclean:
+	@ -rm -rf $(CLSPATH)
+
+# removing symbolic links that point to specific builds
+removelinks:
+	@ test ! -h $(OUTDIR)/schema && rm -rf $(OUTDIR)/schema || true
+	@ rm -f $(addprefix $(OUTDIR)/,$(addsuffix $(BITS),$(SUBDIRS)))
+	@ rm -f $(addprefix $(OUTDIR)/,$(OUTDIRS))
+
+# create all required output directories
+makedirs:
+	@ mkdir -p $(addprefix $(TARGDIR)/,$(SUBDIRS) obj/$(MODULE)) $(NCBIDIR)
+
+makejdirs: makedirs
+	@ mkdir -p $(CLASSDIR)
+
+# build version include files
+vers-includes: makedirs
+	@ $(MAKE_CMD) -s $(TARGDIR)/$@
+
+ifeq (win,$(OS))
+
+# Windows doesn't really support symbolic links
+# we may add them back in when our toolkit is able to create them
+rebuild-dirlinks: makedirs
+	@ true
+else
+
+LNDIRS = $(addprefix ln_,$(SUBDIRS))
+$(LNDIRS):
+	@ ln -s $(TARGDIR)/$(subst ln_,,$@) $(OUTDIR)/$(subst ln_,,$@)$(BITS)
+
+ifdef NOREBUILD_LINKS
+rebuild-dirlinks:
+	@ true
+else
+rebuild-dirlinks: removelinks makedirs $(LNDIRS)
+	@ ln -s $(TOP)/interfaces $(OUTDIR)/schema
+endif
+
+endif
+
+.PHONY: compile stdcompile stdclean removelinks makedirs vers-includes rebuild-dirlinks
+.PHONY: stdjclean makejdirs
+
+# configuration targets 
+out:
+	@ echo $(OUTDIR) > $(TOP)/build/OUTDIR.$(BUILD_OS)
+	@ $(MAKE) TOP=$(TOP) -f $(TOP)/build/Makefile.env rebuild-dirlinks
+
+$(RHOSTS):
+	@ cat $(TOP)/rhosts/$@ >> $(TOP)/build/RHOST.$(HOST_OS)
+
+require-proxy-exec:
+	@ $(MAKE) -C $(TOP)/test/proxy_exec proxy-exec
+	@ echo "PROXY_TOOL := $(BINDIR)/proxy-exec" > $(TOP)/build/RHOST.$(HOST_OS)
+
+local:
+	@ rm -f $(TOP)/build/RHOST.$(HOST_OS)
+
+CC:
+	@ echo cc > $(TOP)/build/COMP.$(OS)
+
+GCC:
+	@ echo gcc > $(TOP)/build/COMP.$(OS)
+
+ICC:
+	@ echo icc > $(TOP)/build/COMP.$(OS)
+
+VC++:
+	@ echo vc++ > $(TOP)/build/COMP.$(OS)
+
+CLANG:
+	@ echo clang > $(TOP)/build/COMP.$(OS)
+
+static dynamic:
+	@ echo "there is no longer any difference between static and dynamic builds"
+
+debug:
+	@ echo dbg > $(TOP)/build/BUILD.$(OS)
+
+profile:
+	@ echo prof > $(TOP)/build/BUILD.$(OS)
+
+release:
+	@ echo rel > $(TOP)/build/BUILD.$(OS)
+
+scm:
+	@ echo scm > $(TOP)/build/BUILD.$(OS)
+
+pubtools: release
+
+bindir:
+	@ echo "$(BINDIR)"
+
+targdir:
+	@ echo "$(TARGDIR)"
+
+osdir:
+	@ echo "$(OUTDIR)/$(OS)"
+
+compilers:
+	@ echo "$(COMPILERS)"
+
+architectures:
+	@ echo "$(ARCHITECTURES)"
+
+architecture:
+	@ echo "$(ARCH)"
+
+config:
+	@ echo "  current build is $(LOCAL_OR_REMOTE) $(BUILD_OS) $(BUILD) $(ARCH) build using $(TOOLSET) tools"
+	@ echo "  output target directory is '$(TARGDIR)'"
+	@ echo
+
+purify:
+	@ echo pur > $(TOP)/build/BUILD.$(OS)
+
+purecov:
+	@ echo pcov > $(TOP)/build/BUILD.$(OS)
+
+.PHONY: out CC GCC ICC debug profile release scm purify purecov local local require-proxy-exec $(RHOSTS) bindir report_config
+
+# includes based upon build
+ITF = $(TOP)/interfaces
+OSINC = $(TOP)/interfaces/os
+CCINC = $(TOP)/interfaces/cc
+XTINC = $(TOP)/interfaces/ext
+NGSINC = $(NGS_INCDIR)
+OVERRIDEINC = $(TOP)/interfaces/override
+
+# OS specific source and include dirs
+SRCDIRS_OS = $(SRCDIR)/$(OS)
+INCDIRS_OS = $(OSINC)/$(OS)
+
+# most OS' have a parent type
+ifdef OS_DAD
+
+SRCDIRS_OS += $(SRCDIR)/$(OS_DAD)
+INCDIRS_OS += $(OSINC)/$(OS_DAD)
+
+# some OS' have a grandparent
+ifdef OS_GDAD
+SRCDIRS_OS += $(SRCDIR)/$(OS_GDAD)
+INCDIRS_OS += $(OSINC)/$(OS_GDAD)
+endif
+
+endif
+
+# compiler specific includes
+INCDIRS_COMP = \
+	$(CCINC)/$(COMP)/$(ARCH) \
+	$(CCINC)/$(COMP)
+
+# some compilers have a parent type
+ifdef COMP_DAD
+
+INCDIRS_COMP += \
+	$(CCINC)/$(COMP_DAD)/$(ARCH) \
+	$(CCINC)/$(COMP_DAD)
+
+endif
+
+VPATH = \
+	$(SRCDIR)/$(COMP)/$(ARCH) \
+	$(SRCDIR)/$(COMP) \
+	$(SRCDIRS_OS) \
+	$(SRCDIR)
+
+INCDIRS = \
+	$(addprefix -I,$(OVERRIDEINC)) \
+	$(addprefix -I,$(SRCDIRS_OS)) \
+	$(addprefix -I,$(SRCDIR) $(ITF)) \
+	$(addprefix -I,$(INCDIRS_COMP)) \
+	$(addprefix -I,$(INCDIRS_OS)) \
+	$(addprefix -I,$(XTINC) $(NGSINC)) \
+	-I.
+
+
+# defines that describe os & architecture
+DLLX ?= $(SHLX)
+ARCHDEFS = -D_ARCH_BITS=__SIZEOF_POINTER__*__CHAR_BIT__ -DLIBPREFIX=$(LPFX) -DSHLIBEXT=$(DLLX)
+
+# default tool parameters
+CFLAGS	= $(DEBUG) $(DBG) $(CARCH) $(PROF) $(PED) $(DEFINES) $(ARCHDEFS) $(MIN_DEPLOY_OS_OPT) $(INCDIRS)
+CPFLAGS = $(DEBUG) $(DBG) $(CARCH) $(PROF) $(DEFINES) $(ARCHDEFS) $(MIN_DEPLOY_OS_OPT) $(INCDIRS)
+# some LDFLAGS may have been specified in $(CONFIG_FILE)
+LDFLAGS += $(DBG) $(PROF) $(CARCH) $(MIN_DEPLOY_OS_OPT)
+
+#-------------------------------------------------------------------------------
+# runtests
+# 
+# MallocScribble=1 is for catching allocation problems on Mac
+#
+ifeq ($(RUNTESTS_OVERRIDE),)
+runtests: std $(TEST_TOOLS)
+	@ export VDB_CONFIG=$(VDB_CONFIG);\
+	export LD_LIBRARY_PATH=$(LIBDIR):$$LD_LIBRARY_PATH;export MallocScribble=1;\
+	for i in $(TEST_TOOLS);\
+	do\
+		echo ++++++++++++++++++++++++++++++++++++++++++++++++++++++;\
+		echo Run $(TEST_BINDIR)/$$i;eval $(RUN_REMOTELY) $(TEST_BINDIR)/$$i;r=$$?; \
+		if [ "$$r" != "0" ] ; then exit $$r; fi; \
+	done
+
+.PHONY: runtests
+endif
+
+#-------------------------------------------------------------------------------
+# slowtests
+# 
+# $(SLOWTESTSDATADIR) should be used to create temporary test files
+SLOWTESTSDATADIR ?= /panfs/pan1.be-md.ncbi.nlm.nih.gov/sra-test/slowtests/$(shell whoami)
+
+slowtests: std $(SLOW_TEST_TOOLS)
+	@ export LD_LIBRARY_PATH=$(LIBDIR):$$LD_LIBRARY_PATH;\
+	for i in $(SLOW_TEST_TOOLS);\
+	do\
+		echo ++++++++++++++++++++++++++++++++++++++++++++++++++++++;\
+		echo Run $(TEST_BINDIR)/$$i;eval $(RUN_REMOTELY) $(TEST_BINDIR)/$$i;r=$$?; \
+		if [ "$$r" != "0" ] ; then exit $$r; fi; \
+	done
+
+.PHONY: slowtests
+
diff --git a/build/Makefile.gcc b/build/Makefile.gcc
new file mode 100644
index 0000000..91b2a19
--- /dev/null
+++ b/build/Makefile.gcc
@@ -0,0 +1,88 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# compilers
+CC = @ $(TOP)/build/cc.sh $(OS) 'gcc -c' \
+	 $(CHECKSUM) --objx $(OBJX) --cflags "$(CFLAGS)" -MD
+CP = @ $(TOP)/build/cc.sh $(OS) 'g++ -c' \
+	 $(CHECKSUM) --objx $(OBJX) --cflags "$(CPFLAGS)" -MD
+
+# C preprocessor
+PP = gcc -E $(CFLAGS)
+
+# linkers
+LD = @ $(TOP)/build/ld.sh $(OS) $(ARCH) gcc \
+	--build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+	$(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+	-MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+LPFLAGS = $(LDFLAGS)
+
+LP = @ $(TOP)/build/ld.sh $(OS) $(ARCH) g++ \
+	--build $(BUILD) --ldflags "$(LPFLAGS)" $(STATIC) \
+	$(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+	-MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+# tool options
+WARN = -Wall -Wno-long-long 
+ifneq (sun,$(OS))
+    WARN += -Wno-variadic-macros
+endif
+
+ifeq (64,$(BITS))
+	CARCH = -m64
+else
+ifeq (32_64,$(BITS))
+	CARCH = -arch i386 -arch x86_64  
+else    
+	CARCH = -m32
+endif    
+endif
+
+ifeq (prof, $(BUILD))
+	PROF = -pg
+endif
+
+ifeq (dbg, $(BUILD))
+	DBG = -g
+	OPT = $(WARN)
+	NOPT = $(WARN)
+	# GCC seems unable to use c99 without ansi, which
+	# basically clobbers features back to c89. the options
+	# must be specified in the order shown.
+	PED = -std=gnu99 -pedantic # -fdiagnostics-show-option
+else
+
+OPT = -O3 -Wno-variadic-macros -fno-strict-aliasing -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
+ifeq (x86_64, $(ARCH))
+	OPT += -Wall
+endif
+
+endif
+
+ifeq (mac,$(OS))
+     # g++ linker on mac needs to be told which standard c++ library to use
+     LPFLAGS += -lstdc++
+endif
diff --git a/build/Makefile.icc b/build/Makefile.icc
new file mode 100644
index 0000000..612a148
--- /dev/null
+++ b/build/Makefile.icc
@@ -0,0 +1,77 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# compilers
+CC = @ $(TOP)/build/cc.sh $(OS) 'icc -c' \
+	$(CHECKSUM) --objx $(OBJX) --cflags "$(CFLAGS)" -MD
+CP = @ $(TOP)/build/cc.sh $(OS) 'icpc -c' \
+	$(CHECKSUM) --objx $(OBJX) --cflags "$(CPFLAGS)" -MD
+
+# C preprocessor
+PP = icc -E $(CFLAGS)
+
+# linkers
+LD = @ $(TOP)/build/ld.sh $(OS) $(ARCH) icc \
+	--build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+	$(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+	-MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+LP = @ $(TOP)/build/ld.sh $(OS) $(ARCH) icpc \
+	--build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+	$(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+	-MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+# tool options
+WARN = -Wall
+
+ifeq (64,$(BITS))
+	CARCH = -m64
+else
+	CARCH = -m32
+endif
+
+ifeq (prof, $(BUILD))
+	PROF := -p
+endif
+
+ifeq (dbg, $(BUILD))
+	DBG = -g
+	OPT = $(WARN)
+	NOPT = $(WARN)
+else
+
+ifeq (x86_64, $(ARCH))
+	OPT := -O3 -unroll -xW
+else
+	OPT := -O3 -unroll -xW
+endif
+endif
+
+ifeq (prof, $(BUILD))
+	OPT += -vec_report5
+endif
+
+# ICC is designed to be a GCC substitute
+COMP_DAD = gcc
diff --git a/build/Makefile.install b/build/Makefile.install
new file mode 100644
index 0000000..743ff72
--- /dev/null
+++ b/build/Makefile.install
@@ -0,0 +1,151 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# determine shell environment
+include $(TOP)/build/Makefile.shell
+
+# load build configuration
+include $(CONFIG_FILE)
+
+#-------------------------------------------------------------------------------
+# install
+# 
+LIBRARIES_TO_INSTALL = \
+    ncbi-vdb.$(VERSION_LIBX) \
+    ncbi-vdb.$(VERSION_SHLX) \
+    ncbi-wvdb.$(VERSION_LIBX) \
+    ncbi-wvdb.$(VERSION_SHLX) \
+    ncbi-ngs-c++.$(VERSION_LIBX) \
+
+LIB_TARGET = $(INST_LIBDIR)$(BITS)
+
+LIBRARIES_WITH_PREFIX = \
+	$(addprefix $(LIB_TARGET)/$(LPFX),$(LIBRARIES_TO_INSTALL))
+
+checkversion:
+
+copylibs: checkversion $(LIB_TARGET) 
+	@ echo "Installing libraries to $(LIB_TARGET)"
+	@ $(MAKE) -f $(TOP)/build/Makefile.install $(LIBRARIES_WITH_PREFIX)
+
+copyincludes: checkversion
+	@echo "Installing includes to $(INST_INCDIR)"
+	@mkdir -p $(INST_INCDIR)/ncbi-vdb
+	@cp $(TOP)/interfaces/ngs/ncbi/NGS.hpp $(INST_INCDIR)/ncbi-vdb
+
+#fake root for debugging
+#uncomment this line and change the test for root ( see under install: ) to succeed:
+#ROOT = ~/root
+
+INCLUDE_SYMLINK = $(ROOT)/usr/include/ncbi-vdb
+PROFILE_FILE = $(ROOT)/etc/profile.d/ncbi-vdb
+KONFIG_DIR = $(ROOT)/etc/ncbi
+
+ifeq (linux, $(OS))
+    ifeq (0, $(shell id -u))
+        LINUX_ROOT = true
+    endif
+endif
+
+install: copylibs copyincludes 
+ifeq (true, $(LINUX_ROOT))
+	@ # install symlink to includes 
+	@ echo "Updating $(INCLUDE_SYMLINK)"
+	@ rm -f $(INCLUDE_SYMLINK)
+	@ ln -s $(INST_INCDIR)/ncbi-vdb $(INCLUDE_SYMLINK)
+	@ #
+	@ # install configuration file(s)
+	@ echo "Installing configuration files to $(KONFIG_DIR)"
+	@ mkdir -p $(KONFIG_DIR)
+	if [ -f $(KONFIG_DIR)/certs.kfg ] ; \
+	  then mv -v $(KONFIG_DIR)/certs.kfg    $(KONFIG_DIR)/certs.kfg.orig    ; fi
+	if [ -f $(KONFIG_DIR)/default.kfg  ] ; \
+	  then mv -v $(KONFIG_DIR)/default.kfg  $(KONFIG_DIR)/default.kfg.orig  ; fi
+	if [ -f $(KONFIG_DIR)/ncbi-vdb.kfg ] ; \
+	  then mv -v $(KONFIG_DIR)/ncbi-vdb.kfg $(KONFIG_DIR)/ncbi-vdb.kfg.orig ; fi
+	@ cp $(TOP)/libs/kfg/certs.kfg   $(KONFIG_DIR)
+	@ cp $(TOP)/libs/kfg/default.kfg $(KONFIG_DIR)
+	@ #
+	@ echo "Updating $(PROFILE_FILE).[c]sh"
+	@ printf \
+"#version $(VERSION)\n"\
+"if ! echo \$$LD_LIBRARY_PATH | /bin/grep -q $(LIB_TARGET)\n"\
+"then export LD_LIBRARY_PATH=$(LIB_TARGET):\$$LD_LIBRARY_PATH\n"\
+"fi\n" \
+"export NCBI_VDB_LIBDIR=$(LIB_TARGET)\n" \
+        >$(PROFILE_FILE).sh && chmod 644 $(PROFILE_FILE).sh || true;
+	@ printf \
+"#version $(VERSION)\n"\
+"echo \$$LD_LIBRARY_PATH | /bin/grep -q $(LIB_TARGET)\n"\
+"if ( \$$status ) setenv LD_LIBRARY_PATH $(LIB_TARGET):\$$LD_LIBRARY_PATH\n"\
+"setenv NCBI_VDB_LIBDIR $(LIB_TARGET)\n" \
+        >$(PROFILE_FILE).csh && chmod 644 $(PROFILE_FILE).csh || true;
+	@ #TODO: check version of the files above
+	@ #
+	@ echo "Use \$$NCBI_VDB_LIBDIR in your link commands, e.g.:"
+	@ echo "      ld -L\$$NCBI_VDB_LIBDIR -lncbi-vdb ..."
+else    
+	@ #
+	@ echo "Installing configuration files to $(LIB_TARGET)/ncbi/"
+	@ mkdir -p $(LIB_TARGET)/ncbi
+	if [ -f $(LIB_TARGET)/ncbi/certs.kfg    ] ; then \
+	  mv -v $(LIB_TARGET)/ncbi/certs.kfg \
+	        $(LIB_TARGET)/ncbi/certs.kfg.orig ; fi
+	if [ -f $(LIB_TARGET)/ncbi/default.kfg  ] ; then \
+	  mv -v $(LIB_TARGET)/ncbi/default.kfg \
+	        $(LIB_TARGET)/ncbi/default.kfg.orig ; fi
+	if [ -f $(LIB_TARGET)/ncbi/ncbi-vdb.kfg ] ; then \
+	  mv -v $(LIB_TARGET)/ncbi/ncbi-vdb.kfg \
+	        $(LIB_TARGET)/ncbi/ncbi-vdb.kfg.orig ; fi
+	@ cp $(TOP)/libs/kfg/certs.kfg   $(LIB_TARGET)/ncbi
+	@ cp $(TOP)/libs/kfg/default.kfg $(LIB_TARGET)/ncbi
+	@ #
+	@ echo "Please add $(LIB_TARGET) to your LD_LIBRARY_PATH, e.g.:"
+	@ echo "      export LD_LIBRARY_PATH=$(LIB_TARGET):\$$LD_LIBRARY_PATH"
+	@ #
+	@ echo "Use $(LIB_TARGET) in your link commands, e.g.:"
+	@ echo "      export NCBI_VDB_LIBDIR=$(LIB_TARGET)"   
+	@ echo "      ld -L\$$NCBI_VDB_LIBDIR -lncbi-vdb ..."
+endif
+
+#-------------------------------------------------------------------------------
+# uninstall
+# 
+
+TO_UNINSTALL = $(LIB_TARGET)/libncbi-vdb.* $(LIB_TARGET)/libncbi-wvdb.* $(LIB_TARGET)/libncbi-ngs-c++.*
+ifneq (true, $(LINUX_ROOT))
+    TO_UNINSTALL += $(LIB_TARGET)/ncbi/ncbi-vdb.kfg $(LIB_TARGET)/ncbi/default.kfg
+endif
+TO_UNINSTALL_AS_ROOT = $(INCLUDE_SYMLINK) $(KONFIG_DIR)/ncbi-vdb.kfg  $(KONFIG_DIR)/default.kfg $(PROFILE_FILE).sh $(PROFILE_FILE).csh
+
+uninstall:
+	@ echo "Uninstalling $(TO_UNINSTALL) ..."
+	@ rm -rf $(TO_UNINSTALL)
+ifeq (true, $(LINUX_ROOT))
+	@ echo "Uninstalling $(TO_UNINSTALL_AS_ROOT) ..."
+	@ rm -rf $(TO_UNINSTALL_AS_ROOT)
+endif
+	@ echo "done."
+
+.PHONY: install copylibs copyincludes checkversion uninstall
diff --git a/build/Makefile.linux b/build/Makefile.linux
new file mode 100644
index 0000000..546cd42
--- /dev/null
+++ b/build/Makefile.linux
@@ -0,0 +1,84 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# default compiler
+ifeq (,$(COMP))
+	COMP = gcc
+endif
+
+# handle attempts to set cross-compilation architecture
+# note that if your installation is set up for cross compilation,
+# you can try to enable it on your own.
+ifeq (i386,$(ARCH))
+i386:
+	@ true
+x86_64:
+	@ echo "Linux builds do not support cross-compilation to this architecture"
+endif
+
+ifeq (x86_64,$(ARCH))
+i386:
+	@ echo "Linux builds do not support cross-compilation to this architecture"
+x86_64:
+	@ true
+endif
+
+.PHONY: i386 x86_64
+
+
+# library prefix
+LPFX = lib
+
+# file extensions
+OBJX = o
+LOBX = pic.o
+LIBX = a
+SHLX = so
+
+# compilation defines
+DEFINES	:= -DLINUX -DUNIX -D_GNU_SOURCE -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DPKGNAME=linux$(BITS)
+
+# linux is a Unix variant
+OS_DAD = unix
+
+# flex+bison: on Mac, use source-controlled generated .c/.h files
+YACC = @ true
+LEX = @ true
+
+# build matrix
+COMPILERS = GCC # ICC
+
+# valgrind
+VALGRIND = export NCBI_VALGRIND=ncbi; valgrind --error-exitcode=1 --suppressions=$(TOP)/build/valgrind.suppress --show-reachable=no --quiet --leak-check=full
+
+VALGRIND_TARGETS = $(addprefix vg-,$(TEST_TOOLS))
+
+valgrind: $(VALGRIND_TARGETS)
+
+vg-test-%: test-%
+	$(VALGRIND) $(TEST_BINDIR)/$^
+
+vg-wb-test-%: wb-test-%
+	$(VALGRIND) $(TEST_BINDIR)/$^
diff --git a/build/Makefile.rules b/build/Makefile.rules
new file mode 100644
index 0000000..ba4e481
--- /dev/null
+++ b/build/Makefile.rules
@@ -0,0 +1,111 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+## build rules
+LOC_INFO = -D__mod_name__=$(MODULE) -D__file_name__=$*
+
+# executable image
+%.$(OBJX): %.c
+	$(CC) -o $@ $(OPT) $< $(LOC_INFO) -D__file_ext__=c
+%.$(OBJX): %.cpp
+	$(CP) -o $@ $(OPT) $< $(LOC_INFO) -D__file_ext__=cpp
+%.$(OBJX): %.cxx
+	$(CP) -o $@ $(OPT) $< $(LOC_INFO) -D__file_ext__=cxx
+
+# non-optimized executable image
+%.nopt.$(OBJX): %.c
+	$(CC) -o $@ $(NOPT) $< $(LOC_INFO) -D__file_ext__=c
+%.nopt.$(OBJX): %.cpp
+	$(CP) -o $@ $(NOPT) $< $(LOC_INFO) -D__file_ext__=cpp
+%.nopt.$(OBJX): %.cxx
+	$(CP) -o $@ $(NOPT) $< $(LOC_INFO) -D__file_ext__=cxx
+
+# relocatable image
+%.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=c
+%.$(LOBX): %.cpp
+	$(CP) -o $@ -fPIC $(OPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cpp
+%.$(LOBX): %.cxx
+	$(CP) -o $@ -fPIC $(OPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cxx
+
+# non-optimized relocatable image
+%.nopt.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=c
+%.nopt.$(LOBX): %.cpp
+	$(CP) -o $@ -fPIC $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cpp
+%.nopt.$(LOBX): %.cxx
+	$(CP) -o $@ -fPIC $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cxx
+
+# non-optimized relocatable image with persisted image byte swapping
+%.swap.nopt.$(LOBX): %.c
+	$(CC) -o $@ -fPIC -DSWAP_PERSISTED $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=c
+%.swap.nopt.$(LOBX): %.cpp
+	$(CP) -o $@ -fPIC -DSWAP_PERSISTED $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cpp
+%.swap.nopt.$(LOBX): %.cxx
+	$(CP) -o $@ -fPIC -DSWAP_PERSISTED $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cxx
+
+# assembly
+%.$(OBJX) %.$(LOBX): %.s
+	$(CC) -o $@ $<
+
+# assembly language output
+%.s: %.c
+	$(CC) -S -o $@ $(OPT) $<
+%.s: %.cpp
+	$(CP) -S -o $@ $(OPT) $<
+%.s: %.cxx
+	$(CP) -S -o $@ $(OPT) $<
+
+%.nopt.s: %.c
+	$(CC) -S -o $@ $(NOPT) $<
+%.nopt.s: %.cpp
+	$(CP) -S -o $@ $(NOPT) $<
+%.nopt.s: %.cxx
+	$(CP) -S -o $@ $(NOPT) $<
+
+%.pic.s: %.c
+	$(CC) -S -o $@ -fPIC $(OPT) $<
+%.pic.s: %.cpp
+	$(CP) -S -o $@ -fPIC $(OPT) $<
+%.pic.s: %.cxx
+	$(CP) -S -o $@ -fPIC $(OPT) $<
+
+%.nopt.pic.s: %.c
+	$(CC) -S -o $@ -fPIC $(NOPT) $<
+%.nopt.pic.s: %.cpp
+	$(CP) -S -o $@ -fPIC $(NOPT) $<
+%.nopt.pic.s: %.cxx
+	$(CP) -S -o $@ -fPIC $(NOPT) $<
+
+# yacc and lex
+# these are disabled for now (and LEX and YACC defined as 'true') - use source controlled .c files;
+#$(SRCDIR)/%.c: %.y
+#	$(YACC) -o $@ $^
+#$(SRCDIR)/%.c: %.l
+#	$(LEX) -DYY_BUF_SIZE=16777216 -t $< | grep -v '^#line' > $@
+
+# version include generation
+%.vers.h: %.vers
+	$(TOP)/build/make-vers-inc.sh $^ > $@
diff --git a/build/Makefile.scm b/build/Makefile.scm
new file mode 100644
index 0000000..b972029
--- /dev/null
+++ b/build/Makefile.scm
@@ -0,0 +1,94 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: install
+
+# determine a few things
+TOP ?= $(abspath ..)
+include $(TOP)/build/Makefile.env
+
+# current distribution point
+ifeq (linux,$(OS))
+TRACE_SOFTWARE = /panfs/traces01/trace_software/vdb
+endif
+ifeq (mac,$(OS))
+TRACE_SOFTWARE = /net/traces01/trace_software/vdb
+endif
+ifeq (win,$(OS))
+TRACE_SOFTWARE = //panfs/traces01/trace_software/vdb
+endif
+
+
+#-------------------------------------------------------------------------------
+# targets
+#
+INSTALL_TARGETS = \
+	interfaces \
+	schema \
+	os \
+	arch
+
+install: $(INSTALL_TARGETS)
+
+.PHONY: install $(INSTALL_TARGETS)
+
+
+#-------------------------------------------------------------------------------
+# interfaces
+#  populates the interfaces directory
+#
+interfaces:
+	@ bash cp.sh $(TOP)/interfaces $(TRACE_SOFTWARE)/interfaces "-name *.h -o -name *.hpp"
+
+
+#-------------------------------------------------------------------------------
+# schema
+#  populates the schema directory
+#
+schema:
+	@ bash cp.sh $(TOP)/interfaces $(TRACE_SOFTWARE)/schema "-name *.vschema"
+
+
+#-------------------------------------------------------------------------------
+# operating system
+#  populates any os-specific things, such as configuration
+#
+os:
+	@ true
+
+
+#-------------------------------------------------------------------------------
+# architecture
+#  populates build results
+#
+arch: arch-$(BUILD)
+
+arch-dbg:
+	@ bash cp.sh $(BINDIR) $(TRACE_SOFTWARE)/$(OS)/debug/$(ARCH)/bin "-type d -a -name ncbi -prune -o ! -type d -print"
+	@ bash cp.sh $(LIBDIR) $(TRACE_SOFTWARE)/$(OS)/debug/$(ARCH)/lib "-type d -a -name ncbi -prune -o ! -type d -print"
+	@ bash cp.sh $(ILIBDIR) $(TRACE_SOFTWARE)/$(OS)/debug/$(ARCH)/ilib "! -type d -print"
+
+arch-rel:
+	@ bash cp.sh $(BINDIR) $(TRACE_SOFTWARE)/$(OS)/release/$(ARCH)/bin "-type d -a -name ncbi -prune -o ! -type d -print"
+	@ bash cp.sh $(LIBDIR) $(TRACE_SOFTWARE)/$(OS)/release/$(ARCH)/lib "-type d -a -name ncbi -prune -o ! -type d -print"
diff --git a/build/Makefile.shell b/build/Makefile.shell
new file mode 100644
index 0000000..d90b53e
--- /dev/null
+++ b/build/Makefile.shell
@@ -0,0 +1,176 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+CONFIG_FILE = $(TOP)/build/Makefile.config
+ifeq (no, $(shell test -f $(CONFIG_FILE) && echo yes || echo no))
+    $(error "*** File '$(CONFIG_FILE)' is missing. Please run $(TOP)/build/configure")
+endif
+
+# determine OS
+UNAME = $(shell uname -s)
+
+ifeq (Darwin, $(UNAME))
+	HOST_OS = mac
+endif
+ifeq (Linux, $(UNAME))
+	HOST_OS = linux
+endif
+ifeq (SunOS, $(UNAME))
+	HOST_OS = sun
+	ARCHITECTURES = x86_64 i386
+endif
+ifeq (xCYGWIN, $(findstring xCYGWIN,x$(UNAME)))
+	HOST_OS = win
+endif
+ifeq (xMINGW, $(findstring xMINGW,x$(UNAME)))
+	HOST_OS = win
+endif
+
+# assume build OS is the same as host OS
+OS = $(HOST_OS)
+BUILD_OS = $(OS)
+
+# determine ARCH
+ARCHITECTURES = default
+ifeq (mac,$(HOST_OS))
+	HOST_ARCH = $(shell $(TOP)/build/mac.arch.sh)
+else
+	MARCH = $(shell uname -m)
+
+	ifeq (i386, $(MARCH))
+		HOST_ARCH = i386
+	endif
+	ifeq (i486, $(MARCH))
+		HOST_ARCH = i386
+	endif
+	ifeq (i586, $(MARCH))
+		HOST_ARCH = i386
+	endif
+	ifeq (i686, $(MARCH))
+		ifeq (WOW64x, $(findstring WOW64x,$(UNAME)x))
+			# 64-bit capable Cygwin. Analyze the version of cl to set the corect architecture
+			CL = $(shell cl.exe 2>&1 >/dev/null)
+			ifeq (for x64, $(findstring for x64, $(CL)))
+				HOST_ARCH = x86_64
+			else
+				HOST_ARCH = i386
+			endif			
+		else
+			HOST_ARCH = i386
+		endif	
+	endif
+	ifeq (x86_64, $(MARCH))
+		HOST_ARCH = x86_64
+	endif
+	ifeq (i86pc, $(MARCH))
+		HOST_ARCH = x86_64
+		ARCHITECTURES = x86_64 i386
+	endif
+	ifeq (sun4v,$(MARCH))
+		HOST_ARCH = sparc64
+		ARCHITECTURES = sparc64 sparc32
+	endif
+endif
+
+ARCH = $(HOST_ARCH)
+REMOTE_ARCH = $(ARCH)
+
+# pick up dependencies from object directory
+ifdef SRCDIR
+	include $(wildcard *.d)
+endif
+
+# determine SRCDIR
+ifdef MODULE
+    SRCDIR=$(TOP)/$(MODULE)
+else
+    SRCDIR=$(TOP)
+endif
+
+# set COMP, LNKG and BUILD
+COMP = $(shell test -f $(TOP)/build/COMP && mv $(TOP)/build/COMP $(TOP)/build/COMP.$(OS); test -f $(TOP)/build/COMP.$(OS) && cat $(TOP)/build/COMP.$(OS) || echo gcc)
+LNKG = $(shell test -f $(TOP)/build/STATIC && mv $(TOP)/build/STATIC $(TOP)/build/LNKG.$(OS) && echo stat > $(TOP)/build/LNKG.$(OS); test -f $(TOP)/build/LNKG.$(OS) && cat $(TOP)/build/LNKG.$(OS) || echo stat)
+BUILD = $(shell test -f $(TOP)/build/BUILD && mv $(TOP)/build/BUILD $(TOP)/build/BUILD.$(OS); test -f $(TOP)/build/BUILD.$(OS) && cat $(TOP)/build/BUILD.$(OS) || echo dbg)
+TOOLSET := $(COMP)
+
+ifdef USE_GCC_IF_ICC
+    ifeq (icc,$(COMP))
+        COMP = gcc
+    endif
+    ifeq (clang,$(COMP))
+        COMP = gcc
+    endif
+endif
+
+RHOSTS = $(shell (test -d $(TOP)/rhosts && test -n "$$(ls $(TOP)/rhosts/)") && \
+                  ls $(TOP)/rhosts/ | xargs -n1 basename | grep -v CVS | grep -v example | grep -v "~")
+
+# detect RHOST
+HAS_RHOST = $(shell test -f $(TOP)/build/RHOST.$(HOST_OS) && echo yes || echo no)
+ifeq (yes,$(HAS_RHOST))
+    include $(TOP)/build/RHOST.$(HOST_OS)
+	ifeq (,$(RPORT))
+		RPORT = 20000
+	endif
+	BUILD_OS = r$(OS)
+	REMOTE_ARCH = $(ARCH)
+	ifeq (,$(LHOME))
+	    LHOME=$(HOME)
+	endif
+endif
+
+# set OUTDIR
+ifndef OUTDIR
+	OUTDIR = $(shell test -f $(TOP)/build/OUTDIR && mv $(TOP)/build/OUTDIR $(TOP)/build/OUTDIR.$(BUILD_OS); test -f $(TOP)/build/OUTDIR.$(BUILD_OS) && cat $(TOP)/build/OUTDIR.$(BUILD_OS) || echo $(TOP))
+	ifeq (,$(OUTDIR))
+		OUTDIR = $(TOP)
+	endif
+endif
+ifeq (,$(ROUTDIR))
+	ROUTDIR = $(RHOME)
+endif
+
+ifeq (yes,$(HAS_RHOST))
+	# set remote flags for calling win-cc.sh and ld.sh)
+	RFLAGS=--rhome "$(RHOME)" --lhome "$(LHOME)" --rhost "$(RHOST)" --rport $(RPORT) --proxy_tool "$(PROXY_TOOL)" \
+ --loutdir "$(OUTDIR)" --routdir "$(ROUTDIR)"
+	# RWORKDIR can be redefined by individual makefiles as needed
+	RWORKDIR = . 
+	RUN_REMOTELY = $(TOP)/build/run_remotely.sh $(PROXY_TOOL) $(RHOST) $(RPORT) $(RHOME) $(LHOME) $(RWORKDIR) $(ROUTDIR) $(OUTDIR)
+endif
+
+# determine BITS
+ifeq (x86_64, $(ARCH))
+	BITS = 64
+endif
+ifeq (sparc64, $(ARCH))
+	BITS = 64
+endif
+ifeq (i386, $(ARCH))
+	BITS = 32
+endif
+ifeq (sparc32, $(ARCH))
+	BITS = 32
+endif
+
diff --git a/build/Makefile.targets b/build/Makefile.targets
new file mode 100644
index 0000000..5e266ca
--- /dev/null
+++ b/build/Makefile.targets
@@ -0,0 +1,117 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# defines make targets commonly used in non-leaf directories:
+#   default
+#   all
+#   std
+#   clean
+#   runtests
+#   slowtests
+#   valgrind
+#
+# requires $(SUBDIRS) to be defined
+#
+# to control which subdirectories are affected by a specific target, define
+# SUBDIRS_CLEAN, SUBDIRS_RUNTESTS, etc., like this:
+#   SUBDIRS_CLEAN = $(addsuffix _clean, du4r1 dir2 dir3)
+#
+
+default: $(SUBDIRS) $(DFLT_EXTRA)
+
+ALL_EXTRA ?= $(DFLT_EXTRA)
+STD_EXTRA ?= $(DFLT_EXTRA)
+
+#-------------------------------------------------------------------------------
+# all
+#
+SUBDIRS_ALL ?= $(addsuffix _all,$(SUBDIRS))
+
+all: $(SUBDIRS_ALL) $(ALL_EXTRA)
+
+$(SUBDIRS_ALL):
+	@ $(MAKE) -C $(subst _all,,$@) all
+
+.PHONY: all $(SUBDIRS_ALL)
+
+#-------------------------------------------------------------------------------
+# std
+#
+SUBDIRS_STD = $(addsuffix _std,$(SUBDIRS))
+
+std: $(SUBDIRS_STD) $(STD_EXTRA)
+
+$(SUBDIRS_STD): 
+	@ $(MAKE) -C $(subst _std,,$@) std
+
+.PHONY: std $(SUBDIRS_STD)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+SUBDIRS_CLEAN ?= $(addsuffix _clean,$(SUBDIRS))
+
+clean: $(SUBDIRS_CLEAN)
+
+$(SUBDIRS_CLEAN):
+	@ $(MAKE) -s -C $(subst _clean,,$@) clean
+
+.PHONY: clean $(SUBDIRS_CLEAN)
+
+#-------------------------------------------------------------------------------
+# runtests
+#
+SUBDIRS_RUNTESTS ?= $(addsuffix _runtests,$(SUBDIRS))
+
+runtests: std $(SUBDIRS_RUNTESTS)
+
+$(SUBDIRS_RUNTESTS):
+	@ $(MAKE) -s -C $(subst _runtests,,$@) runtests
+
+.PHONY: runtests $(SUBDIRS_RUNTESTS)
+
+#-------------------------------------------------------------------------------
+# slowtests
+#
+SUBDIRS_SLOWTESTS ?= $(addsuffix _slowtests, $(SUBDIRS))
+
+slowtests: $(SUBDIRS_SLOWTESTS)
+
+$(SUBDIRS_SLOWTESTS):
+	@ $(MAKE) -C $(subst _slowtests,,$@) slowtests
+
+.PHONY: slowtests $(SUBDIRS_SLOWTESTS)
+
+
+#-------------------------------------------------------------------------------
+# valgrind
+#
+SUBDIRS_VALGRIND ?= $(addsuffix _valgrind, $(SUBDIRS))
+
+valgrind: $(SUBDIRS_VALGRIND)
+
+$(SUBDIRS_VALGRIND):
+	@ $(MAKE) -C $(subst _valgrind,,$@) valgrind
+
+.PHONY: valgrind $(SUBDIRS_VALGRIND)
diff --git a/build/Makefile.vers b/build/Makefile.vers
new file mode 100644
index 0000000..499fbe8
--- /dev/null
+++ b/build/Makefile.vers
@@ -0,0 +1,26 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# NCBI-VDB and library version
+VERSION = 2.8.1
diff --git a/build/abspath.sh b/build/abspath.sh
new file mode 100755
index 0000000..a5aa56b
--- /dev/null
+++ b/build/abspath.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+if cd "$1"
+then
+    pwd
+else
+    echo "`pwd`/$1"
+fi
diff --git a/build/cc.sh b/build/cc.sh
new file mode 100755
index 0000000..d57b450
--- /dev/null
+++ b/build/cc.sh
@@ -0,0 +1,129 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# prepare script name
+SELF_NAME="$(basename $0)"
+SCRIPT_BASE="${0%.sh}"
+
+# os
+OS="$1"
+shift
+
+# binary compiler
+CC="$1"
+shift
+
+# configuration
+unset TARG
+unset ARGS
+CHECKSUM=0
+OBJX=o
+
+while [ $# -ne 0 ]
+do
+
+    case "$1" in
+    --cflags)
+        ARGS="$ARGS $2"
+        shift
+        ;;
+
+    --checksum)
+        CHECKSUM=1
+        ;;
+
+    --objx)
+        OBJX="$2"
+        shift
+        ;;
+
+    -o*)
+        ARGS="$ARGS $1"
+        ARG="${1#-o}"
+        if [ "$ARG" = "" ]
+        then
+            ARGS="$ARGS $2"
+            ARG="$2"
+            shift
+        fi
+        TARG="$ARG"
+        ;;
+
+    *)
+        ARGS="$ARGS $1"
+        ;;
+        
+    esac
+
+    shift
+done
+
+# *** START SCM-code ***************************************
+if [ $CHECKSUM -eq 1 ]
+then
+    if [ "$TARG" = "" ]
+    then
+        echo "$SELF_NAME: no target specified"
+        exit 5
+    fi
+
+    if [ "$TARG" = "${TARG%.$OBJX}" ]
+    then
+        echo "$SELF_NAME: malformed target"
+        exit 6
+    fi
+
+    TARG="${TARG%.$OBJX}"
+fi
+# *** END SCM-code ***************************************
+
+CMD="$CC $ARGS"
+echo "$CMD"
+$CMD || exit $?
+
+# *** START SCM-code ***************************************
+if [ $CHECKSUM -eq 1 ] && [ "$OS" = "linux" ]
+then
+    CMD="strip $TARG.$OBJX -o $TARG.stripped.$OBJX"
+    echo "$CMD"
+    if $CMD
+    then
+        MD5RES=`md5sum -b $TARG.stripped.$OBJX`
+        STATUS=$?
+        rm -f "$TARG.stripped.$OBJX" || true
+        if [ $STATUS -eq 0 ]
+            then
+            MD5VALUE=${MD5RES:0:32}
+            echo "$TARG.$OBJX=$MD5VALUE" > "$TARG.$OBJX.md5"
+            else
+            exit $STATUS
+        fi
+    else
+        STATUS=$?
+        rm "$TARG.$OBJX"
+        exit $STATUS
+    fi
+fi
+# *** END SCM-code ***************************************
diff --git a/build/cp.sh b/build/cp.sh
new file mode 100755
index 0000000..a966bc2
--- /dev/null
+++ b/build/cp.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+SRC="$1"
+DST="$2"
+QUERY="$3"
+
+# go to where this directory may be found
+cd "$SRC" || exit $?
+
+# find all of the files in question
+for f in $(find . $QUERY)
+do
+
+    # test for being newer
+    if [ $f -nt "$DST/$f" ]
+    then
+
+        # test if destination exists
+        if [ ! -f "$DST/$f" ]
+        then
+
+            # make sure the directory exists
+            d=$(dirname "$DST/$f")
+            mkdir -p "$d"
+        fi
+
+        # copy
+        echo "cp $SRC/$f $DST/$f"
+        cp -pPR $f $DST/$f
+    fi
+
+done
diff --git a/build/gprof2dot.py b/build/gprof2dot.py
new file mode 100755
index 0000000..3bd302e
--- /dev/null
+++ b/build/gprof2dot.py
@@ -0,0 +1,2763 @@
+#!/opt/python-2.5/bin/python
+#
+# Copyright 2008-2009 Jose Fonseca
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation, either version 3 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 Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+"""Generate a dot graph from the output of several profilers."""
+
+__author__ = "Jose Fonseca"
+
+__version__ = "1.0"
+
+
+import sys
+import math
+import os.path
+import re
+import textwrap
+import optparse
+import xml.parsers.expat
+
+
+try:
+    # Debugging helper module
+    import debug
+except ImportError:
+    pass
+
+
+def times(x):
+    return u"%u\xd7" % (x,)
+
+def percentage(p):
+    return "%.02f%%" % (p*100.0,)
+
+def add(a, b):
+    return a + b
+
+def equal(a, b):
+    if a == b:
+        return a
+    else:
+        return None
+
+def fail(a, b):
+    assert False
+
+
+tol = 2 ** -23
+
+def ratio(numerator, denominator):
+    try:
+        ratio = float(numerator)/float(denominator)
+    except ZeroDivisionError:
+        # 0/0 is undefined, but 1.0 yields more useful results
+        return 1.0
+    if ratio < 0.0:
+        if ratio < -tol:
+            sys.stderr.write('warning: negative ratio (%s/%s)\n' % (numerator, denominator))
+        return 0.0
+    if ratio > 1.0:
+        if ratio > 1.0 + tol:
+            sys.stderr.write('warning: ratio greater than one (%s/%s)\n' % (numerator, denominator))
+        return 1.0
+    return ratio
+
+
+class UndefinedEvent(Exception):
+    """Raised when attempting to get an event which is undefined."""
+    
+    def __init__(self, event):
+        Exception.__init__(self)
+        self.event = event
+
+    def __str__(self):
+        return 'unspecified event %s' % self.event.name
+
+
+class Event(object):
+    """Describe a kind of event, and its basic operations."""
+
+    def __init__(self, name, null, aggregator, formatter = str):
+        self.name = name
+        self._null = null
+        self._aggregator = aggregator
+        self._formatter = formatter
+
+    def __eq__(self, other):
+        return self is other
+
+    def __hash__(self):
+        return id(self)
+
+    def null(self):
+        return self._null
+
+    def aggregate(self, val1, val2):
+        """Aggregate two event values."""
+        assert val1 is not None
+        assert val2 is not None
+        return self._aggregator(val1, val2)
+    
+    def format(self, val):
+        """Format an event value."""
+        assert val is not None
+        return self._formatter(val)
+
+
+CALLS = Event("Calls", 0, add, times)
+SAMPLES = Event("Samples", 0, add)
+SAMPLES2 = Event("Samples", 0, add)
+
+TIME = Event("Time", 0.0, add, lambda x: '(' + str(x) + ')')
+TIME_RATIO = Event("Time ratio", 0.0, add, lambda x: '(' + percentage(x) + ')')
+TOTAL_TIME = Event("Total time", 0.0, fail)
+TOTAL_TIME_RATIO = Event("Total time ratio", 0.0, fail, percentage)
+
+
+class Object(object):
+    """Base class for all objects in profile which can store events."""
+
+    def __init__(self, events=None):
+        if events is None:
+            self.events = {}
+        else:
+            self.events = events
+
+    def __hash__(self):
+        return id(self)
+
+    def __eq__(self, other):
+        return self is other
+
+    def __contains__(self, event):
+        return event in self.events
+    
+    def __getitem__(self, event):
+        try:
+            return self.events[event]
+        except KeyError:
+            raise UndefinedEvent(event)
+    
+    def __setitem__(self, event, value):
+        if value is None:
+            if event in self.events:
+                del self.events[event]
+        else:
+            self.events[event] = value
+
+
+class Call(Object):
+    """A call between functions.
+    
+    There should be at most one call object for every pair of functions.
+    """
+
+    def __init__(self, callee_id):
+        Object.__init__(self)
+        self.callee_id = callee_id
+        self.ratio = None
+        self.weight = None
+
+
+class Function(Object):
+    """A function."""
+
+    def __init__(self, id, name):
+        Object.__init__(self)
+        self.id = id
+        self.name = name
+        self.module = None
+        self.process = None
+        self.calls = {}
+        self.called = None
+        self.weight = None
+        self.cycle = None
+    
+    def add_call(self, call):
+        if call.callee_id in self.calls:
+            sys.stderr.write('warning: overwriting call from function %s to %s\n' % (str(self.id), str(call.callee_id)))
+        self.calls[call.callee_id] = call
+
+    def get_call(self, callee_id):
+        if not callee_id in self.calls:
+            call = Call(callee_id)
+            call[SAMPLES] = 0
+            call[SAMPLES2] = 0
+            call[CALLS] = 0
+            self.calls[callee_id] = call
+        return self.calls[callee_id]
+
+    # TODO: write utility functions
+
+    def __repr__(self):
+        return self.name
+
+
+class Cycle(Object):
+    """A cycle made from recursive function calls."""
+
+    def __init__(self):
+        Object.__init__(self)
+        # XXX: Do cycles need an id?
+        self.functions = set()
+
+    def add_function(self, function):
+        assert function not in self.functions
+        self.functions.add(function)
+        # XXX: Aggregate events?
+        if function.cycle is not None:
+            for other in function.cycle.functions:
+                if function not in self.functions:
+                    self.add_function(other)
+        function.cycle = self
+
+
+class Profile(Object):
+    """The whole profile."""
+
+    def __init__(self):
+        Object.__init__(self)
+        self.functions = {}
+        self.cycles = []
+
+    def add_function(self, function):
+        if function.id in self.functions:
+            sys.stderr.write('warning: overwriting function %s (id %s)\n' % (function.name, str(function.id)))
+        self.functions[function.id] = function
+
+    def add_cycle(self, cycle):
+        self.cycles.append(cycle)
+
+    def validate(self):
+        """Validate the edges."""
+
+        for function in self.functions.itervalues():
+            for callee_id in function.calls.keys():
+                assert function.calls[callee_id].callee_id == callee_id
+                if callee_id not in self.functions:
+                    sys.stderr.write('warning: call to undefined function %s from function %s\n' % (str(callee_id), function.name))
+                    del function.calls[callee_id]
+
+    def find_cycles(self):
+        """Find cycles using Tarjan's strongly connected components algorithm."""
+
+        # Apply the Tarjan's algorithm successively until all functions are visited
+        visited = set()
+        for function in self.functions.itervalues():
+            if function not in visited:
+                self._tarjan(function, 0, [], {}, {}, visited)
+        cycles = []
+        for function in self.functions.itervalues():
+            if function.cycle is not None and function.cycle not in cycles:
+                cycles.append(function.cycle)
+        self.cycles = cycles
+        if 0:
+            for cycle in cycles:
+                sys.stderr.write("Cycle:\n")
+                for member in cycle.functions:
+                    sys.stderr.write("\tFunction %s\n" % member.name)
+    
+    def _tarjan(self, function, order, stack, orders, lowlinks, visited):
+        """Tarjan's strongly connected components algorithm.
+
+        See also:
+        - http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm
+        """
+
+        visited.add(function)
+        orders[function] = order
+        lowlinks[function] = order
+        order += 1
+        pos = len(stack)
+        stack.append(function)
+        for call in function.calls.itervalues():
+            callee = self.functions[call.callee_id]
+            # TODO: use a set to optimize lookup
+            if callee not in orders:
+                order = self._tarjan(callee, order, stack, orders, lowlinks, visited)
+                lowlinks[function] = min(lowlinks[function], lowlinks[callee])
+            elif callee in stack:
+                lowlinks[function] = min(lowlinks[function], orders[callee])
+        if lowlinks[function] == orders[function]:
+            # Strongly connected component found
+            members = stack[pos:]
+            del stack[pos:]
+            if len(members) > 1:
+                cycle = Cycle()
+                for member in members:
+                    cycle.add_function(member)
+        return order
+
+    def call_ratios(self, event):
+        # Aggregate for incoming calls
+        cycle_totals = {}
+        for cycle in self.cycles:
+            cycle_totals[cycle] = 0.0
+        function_totals = {}
+        for function in self.functions.itervalues():
+            function_totals[function] = 0.0
+        for function in self.functions.itervalues():
+            for call in function.calls.itervalues():
+                if call.callee_id != function.id:
+                    callee = self.functions[call.callee_id]
+                    function_totals[callee] += call[event]
+                    if callee.cycle is not None and callee.cycle is not function.cycle:
+                        cycle_totals[callee.cycle] += call[event]
+
+        # Compute the ratios
+        for function in self.functions.itervalues():
+            for call in function.calls.itervalues():
+                assert call.ratio is None
+                if call.callee_id != function.id:
+                    callee = self.functions[call.callee_id]
+                    if callee.cycle is not None and callee.cycle is not function.cycle:
+                        total = cycle_totals[callee.cycle]
+                    else:
+                        total = function_totals[callee]
+                    call.ratio = ratio(call[event], total)
+
+    def integrate(self, outevent, inevent):
+        """Propagate function time ratio allong the function calls.
+
+        Must be called after finding the cycles.
+
+        See also:
+        - http://citeseer.ist.psu.edu/graham82gprof.html
+        """
+
+        # Sanity checking
+        assert outevent not in self
+        for function in self.functions.itervalues():
+            assert outevent not in function
+            assert inevent in function
+            for call in function.calls.itervalues():
+                assert outevent not in call
+                if call.callee_id != function.id:
+                    assert call.ratio is not None
+
+        # Aggregate the input for each cycle 
+        for cycle in self.cycles:
+            total = inevent.null()
+            for function in self.functions.itervalues():
+                total = inevent.aggregate(total, function[inevent])
+            self[inevent] = total
+
+        # Integrate along the edges
+        total = inevent.null()
+        for function in self.functions.itervalues():
+            total = inevent.aggregate(total, function[inevent])
+            self._integrate_function(function, outevent, inevent)
+        self[outevent] = total
+
+    def _integrate_function(self, function, outevent, inevent):
+        if function.cycle is not None:
+            return self._integrate_cycle(function.cycle, outevent, inevent)
+        else:
+            if outevent not in function:
+                total = function[inevent]
+                for call in function.calls.itervalues():
+                    if call.callee_id != function.id:
+                        total += self._integrate_call(call, outevent, inevent)
+                function[outevent] = total
+            return function[outevent]
+    
+    def _integrate_call(self, call, outevent, inevent):
+        assert outevent not in call
+        assert call.ratio is not None
+        callee = self.functions[call.callee_id]
+        subtotal = call.ratio *self._integrate_function(callee, outevent, inevent)
+        call[outevent] = subtotal
+        return subtotal
+
+    def _integrate_cycle(self, cycle, outevent, inevent):
+        if outevent not in cycle:
+
+            # Compute the outevent for the whole cycle
+            total = inevent.null()
+            for member in cycle.functions:
+                subtotal = member[inevent]
+                for call in member.calls.itervalues():
+                    callee = self.functions[call.callee_id]
+                    if callee.cycle is not cycle:
+                        subtotal += self._integrate_call(call, outevent, inevent)
+                total += subtotal
+            cycle[outevent] = total
+            
+            # Compute the time propagated to callers of this cycle
+            callees = {}
+            for function in self.functions.itervalues():
+                if function.cycle is not cycle:
+                    for call in function.calls.itervalues():
+                        callee = self.functions[call.callee_id]
+                        if callee.cycle is cycle:
+                            try:
+                                callees[callee] += call.ratio
+                            except KeyError:
+                                callees[callee] = call.ratio
+            
+            for member in cycle.functions:
+                member[outevent] = outevent.null()
+
+            for callee, call_ratio in callees.iteritems():
+                ranks = {}
+                call_ratios = {}
+                partials = {}
+                self._rank_cycle_function(cycle, callee, 0, ranks)
+                self._call_ratios_cycle(cycle, callee, ranks, call_ratios, set())
+                partial = self._integrate_cycle_function(cycle, callee, call_ratio, partials, ranks, call_ratios, outevent, inevent)
+                assert partial == max(partials.values())
+                assert not total or abs(1.0 - partial/(call_ratio*total)) <= 0.001
+
+        return cycle[outevent]
+
+    def _rank_cycle_function(self, cycle, function, rank, ranks):
+        if function not in ranks or ranks[function] > rank:
+            ranks[function] = rank
+            for call in function.calls.itervalues():
+                if call.callee_id != function.id:
+                    callee = self.functions[call.callee_id]
+                    if callee.cycle is cycle:
+                        self._rank_cycle_function(cycle, callee, rank + 1, ranks)
+
+    def _call_ratios_cycle(self, cycle, function, ranks, call_ratios, visited):
+        if function not in visited:
+            visited.add(function)
+            for call in function.calls.itervalues():
+                if call.callee_id != function.id:
+                    callee = self.functions[call.callee_id]
+                    if callee.cycle is cycle:
+                        if ranks[callee] > ranks[function]:
+                            call_ratios[callee] = call_ratios.get(callee, 0.0) + call.ratio
+                            self._call_ratios_cycle(cycle, callee, ranks, call_ratios, visited)
+
+    def _integrate_cycle_function(self, cycle, function, partial_ratio, partials, ranks, call_ratios, outevent, inevent):
+        if function not in partials:
+            partial = partial_ratio*function[inevent]
+            for call in function.calls.itervalues():
+                if call.callee_id != function.id:
+                    callee = self.functions[call.callee_id]
+                    if callee.cycle is not cycle:
+                        assert outevent in call
+                        partial += partial_ratio*call[outevent]
+                    else:
+                        if ranks[callee] > ranks[function]:
+                            callee_partial = self._integrate_cycle_function(cycle, callee, partial_ratio, partials, ranks, call_ratios, outevent, inevent)
+                            call_ratio = ratio(call.ratio, call_ratios[callee])
+                            call_partial = call_ratio*callee_partial
+                            try:
+                                call[outevent] += call_partial
+                            except UndefinedEvent:
+                                call[outevent] = call_partial
+                            partial += call_partial
+            partials[function] = partial
+            try:
+                function[outevent] += partial
+            except UndefinedEvent:
+                function[outevent] = partial
+        return partials[function]
+
+    def aggregate(self, event):
+        """Aggregate an event for the whole profile."""
+
+        total = event.null()
+        for function in self.functions.itervalues():
+            try:
+                total = event.aggregate(total, function[event])
+            except UndefinedEvent:
+                return
+        self[event] = total
+
+    def ratio(self, outevent, inevent):
+        assert outevent not in self
+        assert inevent in self
+        for function in self.functions.itervalues():
+            assert outevent not in function
+            assert inevent in function
+            function[outevent] = ratio(function[inevent], self[inevent])
+            for call in function.calls.itervalues():
+                assert outevent not in call
+                if inevent in call:
+                    call[outevent] = ratio(call[inevent], self[inevent])
+        self[outevent] = 1.0
+
+    def prune(self, node_thres, edge_thres):
+        """Prune the profile"""
+
+        # compute the prune ratios
+        for function in self.functions.itervalues():
+            try:
+                function.weight = function[TOTAL_TIME_RATIO]
+            except UndefinedEvent:
+                pass
+
+            for call in function.calls.itervalues():
+                callee = self.functions[call.callee_id]
+
+                if TOTAL_TIME_RATIO in call:
+                    # handle exact cases first
+                    call.weight = call[TOTAL_TIME_RATIO] 
+                else:
+                    try:
+                        # make a safe estimate
+                        call.weight = min(function[TOTAL_TIME_RATIO], callee[TOTAL_TIME_RATIO]) 
+                    except UndefinedEvent:
+                        pass
+
+        # prune the nodes
+        for function_id in self.functions.keys():
+            function = self.functions[function_id]
+            if function.weight is not None:
+                if function.weight < node_thres:
+                    del self.functions[function_id]
+
+        # prune the egdes
+        for function in self.functions.itervalues():
+            for callee_id in function.calls.keys():
+                call = function.calls[callee_id]
+                if callee_id not in self.functions or call.weight is not None and call.weight < edge_thres:
+                    del function.calls[callee_id]
+    
+    def dump(self):
+        for function in self.functions.itervalues():
+            sys.stderr.write('Function %s:\n' % (function.name,))
+            self._dump_events(function.events)
+            for call in function.calls.itervalues():
+                callee = self.functions[call.callee_id]
+                sys.stderr.write('  Call %s:\n' % (callee.name,))
+                self._dump_events(call.events)
+        for cycle in self.cycles:
+            sys.stderr.write('Cycle:\n')
+            self._dump_events(cycle.events)
+            for function in cycle.functions:
+                sys.stderr.write('  Function %s\n' % (function.name,))
+
+    def _dump_events(self, events):
+        for event, value in events.iteritems():
+            sys.stderr.write('    %s: %s\n' % (event.name, event.format(value)))
+
+
+class Struct:
+    """Masquerade a dictionary with a structure-like behavior."""
+
+    def __init__(self, attrs = None):
+        if attrs is None:
+            attrs = {}
+        self.__dict__['_attrs'] = attrs
+    
+    def __getattr__(self, name):
+        try:
+            return self._attrs[name]
+        except KeyError:
+            raise AttributeError(name)
+
+    def __setattr__(self, name, value):
+        self._attrs[name] = value
+
+    def __str__(self):
+        return str(self._attrs)
+
+    def __repr__(self):
+        return repr(self._attrs)
+    
+
+class ParseError(Exception):
+    """Raised when parsing to signal mismatches."""
+
+    def __init__(self, msg, line):
+        self.msg = msg
+        # TODO: store more source line information
+        self.line = line
+
+    def __str__(self):
+        return '%s: %r' % (self.msg, self.line)
+
+
+class Parser:
+    """Parser interface."""
+
+    def __init__(self):
+        pass
+
+    def parse(self):
+        raise NotImplementedError
+
+    
+class LineParser(Parser):
+    """Base class for parsers that read line-based formats."""
+
+    def __init__(self, file):
+        Parser.__init__(self)
+        self._file = file
+        self.__line = None
+        self.__eof = False
+        self.line_no = 0
+
+    def readline(self):
+        line = self._file.readline()
+        if not line:
+            self.__line = ''
+            self.__eof = True
+        else:
+            self.line_no += 1
+        self.__line = line.rstrip('\r\n')
+
+    def lookahead(self):
+        assert self.__line is not None
+        return self.__line
+
+    def consume(self):
+        assert self.__line is not None
+        line = self.__line
+        self.readline()
+        return line
+
+    def eof(self):
+        assert self.__line is not None
+        return self.__eof
+
+
+XML_ELEMENT_START, XML_ELEMENT_END, XML_CHARACTER_DATA, XML_EOF = range(4)
+
+
+class XmlToken:
+
+    def __init__(self, type, name_or_data, attrs = None, line = None, column = None):
+        assert type in (XML_ELEMENT_START, XML_ELEMENT_END, XML_CHARACTER_DATA, XML_EOF)
+        self.type = type
+        self.name_or_data = name_or_data
+        self.attrs = attrs
+        self.line = line
+        self.column = column
+
+    def __str__(self):
+        if self.type == XML_ELEMENT_START:
+            return '<' + self.name_or_data + ' ...>'
+        if self.type == XML_ELEMENT_END:
+            return '</' + self.name_or_data + '>'
+        if self.type == XML_CHARACTER_DATA:
+            return self.name_or_data
+        if self.type == XML_EOF:
+            return 'end of file'
+        assert 0
+
+
+class XmlTokenizer:
+    """Expat based XML tokenizer."""
+
+    def __init__(self, fp, skip_ws = True):
+        self.fp = fp
+        self.tokens = []
+        self.index = 0
+        self.final = False
+        self.skip_ws = skip_ws
+        
+        self.character_pos = 0, 0
+        self.character_data = ''
+        
+        self.parser = xml.parsers.expat.ParserCreate()
+        self.parser.StartElementHandler  = self.handle_element_start
+        self.parser.EndElementHandler    = self.handle_element_end
+        self.parser.CharacterDataHandler = self.handle_character_data
+    
+    def handle_element_start(self, name, attributes):
+        self.finish_character_data()
+        line, column = self.pos()
+        token = XmlToken(XML_ELEMENT_START, name, attributes, line, column)
+        self.tokens.append(token)
+    
+    def handle_element_end(self, name):
+        self.finish_character_data()
+        line, column = self.pos()
+        token = XmlToken(XML_ELEMENT_END, name, None, line, column)
+        self.tokens.append(token)
+
+    def handle_character_data(self, data):
+        if not self.character_data:
+            self.character_pos = self.pos()
+        self.character_data += data
+    
+    def finish_character_data(self):
+        if self.character_data:
+            if not self.skip_ws or not self.character_data.isspace(): 
+                line, column = self.character_pos
+                token = XmlToken(XML_CHARACTER_DATA, self.character_data, None, line, column)
+                self.tokens.append(token)
+            self.character_data = ''
+    
+    def next(self):
+        size = 16*1024
+        while self.index >= len(self.tokens) and not self.final:
+            self.tokens = []
+            self.index = 0
+            data = self.fp.read(size)
+            self.final = len(data) < size
+            try:
+                self.parser.Parse(data, self.final)
+            except xml.parsers.expat.ExpatError, e:
+                #if e.code == xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS:
+                if e.code == 3:
+                    pass
+                else:
+                    raise e
+        if self.index >= len(self.tokens):
+            line, column = self.pos()
+            token = XmlToken(XML_EOF, None, None, line, column)
+        else:
+            token = self.tokens[self.index]
+            self.index += 1
+        return token
+
+    def pos(self):
+        return self.parser.CurrentLineNumber, self.parser.CurrentColumnNumber
+
+
+class XmlTokenMismatch(Exception):
+
+    def __init__(self, expected, found):
+        self.expected = expected
+        self.found = found
+
+    def __str__(self):
+        return '%u:%u: %s expected, %s found' % (self.found.line, self.found.column, str(self.expected), str(self.found))
+
+
+class XmlParser(Parser):
+    """Base XML document parser."""
+
+    def __init__(self, fp):
+        Parser.__init__(self)
+        self.tokenizer = XmlTokenizer(fp)
+        self.consume()
+    
+    def consume(self):
+        self.token = self.tokenizer.next()
+
+    def match_element_start(self, name):
+        return self.token.type == XML_ELEMENT_START and self.token.name_or_data == name
+    
+    def match_element_end(self, name):
+        return self.token.type == XML_ELEMENT_END and self.token.name_or_data == name
+
+    def element_start(self, name):
+        while self.token.type == XML_CHARACTER_DATA:
+            self.consume()
+        if self.token.type != XML_ELEMENT_START:
+            raise XmlTokenMismatch(XmlToken(XML_ELEMENT_START, name), self.token)
+        if self.token.name_or_data != name:
+            raise XmlTokenMismatch(XmlToken(XML_ELEMENT_START, name), self.token)
+        attrs = self.token.attrs
+        self.consume()
+        return attrs
+    
+    def element_end(self, name):
+        while self.token.type == XML_CHARACTER_DATA:
+            self.consume()
+        if self.token.type != XML_ELEMENT_END:
+            raise XmlTokenMismatch(XmlToken(XML_ELEMENT_END, name), self.token)
+        if self.token.name_or_data != name:
+            raise XmlTokenMismatch(XmlToken(XML_ELEMENT_END, name), self.token)
+        self.consume()
+
+    def character_data(self, strip = True):
+        data = ''
+        while self.token.type == XML_CHARACTER_DATA:
+            data += self.token.name_or_data
+            self.consume()
+        if strip:
+            data = data.strip()
+        return data
+
+
+class GprofParser(Parser):
+    """Parser for GNU gprof output.
+
+    See also:
+    - Chapter "Interpreting gprof's Output" from the GNU gprof manual
+      http://sourceware.org/binutils/docs-2.18/gprof/Call-Graph.html#Call-Graph
+    - File "cg_print.c" from the GNU gprof source code
+      http://sourceware.org/cgi-bin/cvsweb.cgi/~checkout~/src/gprof/cg_print.c?rev=1.12&cvsroot=src
+    """
+
+    def __init__(self, fp):
+        Parser.__init__(self)
+        self.fp = fp
+        self.functions = {}
+        self.cycles = {}
+
+    def readline(self):
+        line = self.fp.readline()
+        if not line:
+            sys.stderr.write('error: unexpected end of file\n')
+            sys.exit(1)
+        line = line.rstrip('\r\n')
+        return line
+
+    _int_re = re.compile(r'^\d+$')
+    _float_re = re.compile(r'^\d+\.\d+$')
+
+    def translate(self, mo):
+        """Extract a structure from a match object, while translating the types in the process."""
+        attrs = {}
+        groupdict = mo.groupdict()
+        for name, value in groupdict.iteritems():
+            if value is None:
+                value = None
+            elif self._int_re.match(value):
+                value = int(value)
+            elif self._float_re.match(value):
+                value = float(value)
+            attrs[name] = (value)
+        return Struct(attrs)
+
+    _cg_header_re = re.compile(
+        # original gprof header
+        r'^\s+called/total\s+parents\s*$|' +
+        r'^index\s+%time\s+self\s+descendents\s+called\+self\s+name\s+index\s*$|' +
+        r'^\s+called/total\s+children\s*$|' +
+        # GNU gprof header
+        r'^index\s+%\s+time\s+self\s+children\s+called\s+name\s*$'
+    )
+
+    _cg_ignore_re = re.compile(
+        # spontaneous
+        r'^\s+<spontaneous>\s*$|'
+        # internal calls (such as "mcount")
+        r'^.*\((\d+)\)$'
+    )
+
+    _cg_primary_re = re.compile(
+        r'^\[(?P<index>\d+)\]?' + 
+        r'\s+(?P<percentage_time>\d+\.\d+)' + 
+        r'\s+(?P<self>\d+\.\d+)' + 
+        r'\s+(?P<descendants>\d+\.\d+)' + 
+        r'\s+(?:(?P<called>\d+)(?:\+(?P<called_self>\d+))?)?' + 
+        r'\s+(?P<name>\S.*?)' +
+        r'(?:\s+<cycle\s(?P<cycle>\d+)>)?' +
+        r'\s\[(\d+)\]$'
+    )
+
+    _cg_parent_re = re.compile(
+        r'^\s+(?P<self>\d+\.\d+)?' + 
+        r'\s+(?P<descendants>\d+\.\d+)?' + 
+        r'\s+(?P<called>\d+)(?:/(?P<called_total>\d+))?' + 
+        r'\s+(?P<name>\S.*?)' +
+        r'(?:\s+<cycle\s(?P<cycle>\d+)>)?' +
+        r'\s\[(?P<index>\d+)\]$'
+    )
+
+    _cg_child_re = _cg_parent_re
+
+    _cg_cycle_header_re = re.compile(
+        r'^\[(?P<index>\d+)\]?' + 
+        r'\s+(?P<percentage_time>\d+\.\d+)' + 
+        r'\s+(?P<self>\d+\.\d+)' + 
+        r'\s+(?P<descendants>\d+\.\d+)' + 
+        r'\s+(?:(?P<called>\d+)(?:\+(?P<called_self>\d+))?)?' + 
+        r'\s+<cycle\s(?P<cycle>\d+)\sas\sa\swhole>' +
+        r'\s\[(\d+)\]$'
+    )
+
+    _cg_cycle_member_re = re.compile(
+        r'^\s+(?P<self>\d+\.\d+)?' + 
+        r'\s+(?P<descendants>\d+\.\d+)?' + 
+        r'\s+(?P<called>\d+)(?:\+(?P<called_self>\d+))?' + 
+        r'\s+(?P<name>\S.*?)' +
+        r'(?:\s+<cycle\s(?P<cycle>\d+)>)?' +
+        r'\s\[(?P<index>\d+)\]$'
+    )
+
+    _cg_sep_re = re.compile(r'^--+$')
+
+    def parse_function_entry(self, lines):
+        parents = []
+        children = []
+
+        while True:
+            if not lines:
+                sys.stderr.write('warning: unexpected end of entry\n')
+            line = lines.pop(0)
+            if line.startswith('['):
+                break
+        
+            # read function parent line
+            mo = self._cg_parent_re.match(line)
+            if not mo:
+                if self._cg_ignore_re.match(line):
+                    continue
+                sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line)
+            else:
+                parent = self.translate(mo)
+                parents.append(parent)
+
+        # read primary line
+        mo = self._cg_primary_re.match(line)
+        if not mo:
+            sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line)
+            return
+        else:
+            function = self.translate(mo)
+
+        while lines:
+            line = lines.pop(0)
+            
+            # read function subroutine line
+            mo = self._cg_child_re.match(line)
+            if not mo:
+                if self._cg_ignore_re.match(line):
+                    continue
+                sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line)
+            else:
+                child = self.translate(mo)
+                children.append(child)
+        
+        function.parents = parents
+        function.children = children
+
+        self.functions[function.index] = function
+
+    def parse_cycle_entry(self, lines):
+
+        # read cycle header line
+        line = lines[0]
+        mo = self._cg_cycle_header_re.match(line)
+        if not mo:
+            sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line)
+            return
+        cycle = self.translate(mo)
+
+        # read cycle member lines
+        cycle.functions = []
+        for line in lines[1:]:
+            mo = self._cg_cycle_member_re.match(line)
+            if not mo:
+                sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line)
+                continue
+            call = self.translate(mo)
+            cycle.functions.append(call)
+        
+        self.cycles[cycle.cycle] = cycle
+
+    def parse_cg_entry(self, lines):
+        if lines[0].startswith("["):
+            self.parse_cycle_entry(lines)
+        else:
+            self.parse_function_entry(lines)
+
+    def parse_cg(self):
+        """Parse the call graph."""
+
+        # skip call graph header
+        while not self._cg_header_re.match(self.readline()):
+            pass
+        line = self.readline()
+        while self._cg_header_re.match(line):
+            line = self.readline()
+
+        # process call graph entries
+        entry_lines = []
+        while line != '\014': # form feed
+            if line and not line.isspace():
+                if self._cg_sep_re.match(line):
+                    self.parse_cg_entry(entry_lines)
+                    entry_lines = []
+                else:
+                    entry_lines.append(line)            
+            line = self.readline()
+    
+    def parse(self):
+        self.parse_cg()
+        self.fp.close()
+
+        profile = Profile()
+        profile[TIME] = 0.0
+        
+        cycles = {}
+        for index in self.cycles.iterkeys():
+            cycles[index] = Cycle()
+
+        for entry in self.functions.itervalues():
+            # populate the function
+            function = Function(entry.index, entry.name)
+            function[TIME] = entry.self
+            if entry.called is not None:
+                function.called = entry.called
+            if entry.called_self is not None:
+                call = Call(entry.index)
+                call[CALLS] = entry.called_self
+                function.called += entry.called_self
+            
+            # populate the function calls
+            for child in entry.children:
+                call = Call(child.index)
+                
+                assert child.called is not None
+                call[CALLS] = child.called
+
+                if child.index not in self.functions:
+                    # NOTE: functions that were never called but were discovered by gprof's 
+                    # static call graph analysis dont have a call graph entry so we need
+                    # to add them here
+                    missing = Function(child.index, child.name)
+                    function[TIME] = 0.0
+                    function.called = 0
+                    profile.add_function(missing)
+
+                function.add_call(call)
+
+            profile.add_function(function)
+
+            if entry.cycle is not None:
+                try:
+                    cycle = cycles[entry.cycle]
+                except KeyError:
+                    sys.stderr.write('warning: <cycle %u as a whole> entry missing\n' % entry.cycle) 
+                    cycle = Cycle()
+                    cycles[entry.cycle] = cycle
+                cycle.add_function(function)
+
+            profile[TIME] = profile[TIME] + function[TIME]
+
+        for cycle in cycles.itervalues():
+            profile.add_cycle(cycle)
+
+        # Compute derived events
+        profile.validate()
+        profile.ratio(TIME_RATIO, TIME)
+        profile.call_ratios(CALLS)
+        profile.integrate(TOTAL_TIME, TIME)
+        profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME)
+
+        return profile
+
+
+class CallgrindParser(LineParser):
+    """Parser for valgrind's callgrind tool.
+    
+    See also:
+    - http://valgrind.org/docs/manual/cl-format.html
+    """
+
+    _call_re = re.compile('^calls=\s*(\d+)\s+((\d+|\+\d+|-\d+|\*)\s+)+$')
+
+    def __init__(self, infile):
+        LineParser.__init__(self, infile)
+
+        # Textual positions
+        self.position_ids = {}
+        self.positions = {}
+
+        # Numeric positions
+        self.num_positions = 1
+        self.cost_positions = ['line']
+        self.last_positions = [0]
+
+        # Events
+        self.num_events = 0
+        self.cost_events = []
+
+        self.profile = Profile()
+        self.profile[SAMPLES] = 0
+
+    def parse(self):
+        # read lookahead
+        self.readline()
+
+        self.parse_key('version')
+        self.parse_key('creator')
+        self.parse_part()
+
+        # compute derived data
+        self.profile.validate()
+        self.profile.find_cycles()
+        self.profile.ratio(TIME_RATIO, SAMPLES)
+        self.profile.call_ratios(CALLS)
+        self.profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+        return self.profile
+
+    def parse_part(self):
+        while self.parse_header_line():
+            pass
+        while self.parse_body_line():
+            pass
+        if not self.eof() and False:
+            sys.stderr.write('warning: line %u: unexpected line\n' % self.line_no)
+            sys.stderr.write('%s\n' % self.lookahead())
+        return True
+
+    def parse_header_line(self):
+        return \
+            self.parse_empty() or \
+            self.parse_comment() or \
+            self.parse_part_detail() or \
+            self.parse_description() or \
+            self.parse_event_specification() or \
+            self.parse_cost_line_def() or \
+            self.parse_cost_summary()
+
+    _detail_keys = set(('cmd', 'pid', 'thread', 'part'))
+
+    def parse_part_detail(self):
+        return self.parse_keys(self._detail_keys)
+
+    def parse_description(self):
+        return self.parse_key('desc') is not None
+
+    def parse_event_specification(self):
+        event = self.parse_key('event')
+        if event is None:
+            return False
+        return True
+
+    def parse_cost_line_def(self):
+        pair = self.parse_keys(('events', 'positions'))
+        if pair is None:
+            return False
+        key, value = pair
+        items = value.split()
+        if key == 'events':
+            self.num_events = len(items)
+            self.cost_events = items
+        if key == 'positions':
+            self.num_positions = len(items)
+            self.cost_positions = items
+            self.last_positions = [0]*self.num_positions
+        return True
+
+    def parse_cost_summary(self):
+        pair = self.parse_keys(('summary', 'totals'))
+        if pair is None:
+            return False
+        return True
+
+    def parse_body_line(self):
+        return \
+            self.parse_empty() or \
+            self.parse_comment() or \
+            self.parse_cost_line() or \
+            self.parse_position_spec() or \
+            self.parse_association_spec()
+
+    __subpos_re = r'(0x[0-9a-fA-F]+|\d+|\+\d+|-\d+|\*)'
+    _cost_re = re.compile(r'^' + 
+        __subpos_re + r'( +' + __subpos_re + r')*' +
+        r'( +\d+)*' +
+    '$')
+
+    def parse_cost_line(self, calls=None):
+        line = self.lookahead().rstrip()
+        mo = self._cost_re.match(line)
+        if not mo:
+            return False
+
+        function = self.get_function()
+
+        values = line.split(' ')
+        assert len(values) <= self.num_positions + self.num_events
+
+        positions = values[0 : self.num_positions]
+        events = values[self.num_positions : ]
+        events += ['0']*(self.num_events - len(events))
+
+        for i in range(self.num_positions):
+            position = positions[i]
+            if position == '*':
+                position = self.last_positions[i]
+            elif position[0] in '-+':
+                position = self.last_positions[i] + int(position)
+            elif position.startswith('0x'):
+                position = int(position, 16)
+            else:
+                position = int(position)
+            self.last_positions[i] = position
+
+        events = map(float, events)
+
+        if calls is None:
+            function[SAMPLES] += events[0] 
+            self.profile[SAMPLES] += events[0]
+        else:
+            callee = self.get_callee()
+            callee.called += calls
+    
+            try:
+                call = function.calls[callee.id]
+            except KeyError:
+                call = Call(callee.id)
+                call[CALLS] = calls
+                call[SAMPLES] = events[0]
+                function.add_call(call)
+            else:
+                call[CALLS] += calls
+                call[SAMPLES] += events[0]
+
+        self.consume()
+        return True
+
+    def parse_association_spec(self):
+        line = self.lookahead()
+        if not line.startswith('calls='):
+            return False
+
+        _, values = line.split('=', 1)
+        values = values.strip().split()
+        calls = int(values[0])
+        call_position = values[1:]
+        self.consume()
+
+        self.parse_cost_line(calls)
+
+        return True
+
+    _position_re = re.compile('^(?P<position>[cj]?(?:ob|fl|fi|fe|fn))=\s*(?:\((?P<id>\d+)\))?(?:\s*(?P<name>.+))?')
+
+    _position_table_map = {
+        'ob': 'ob',
+        'fl': 'fl',
+        'fi': 'fl',
+        'fe': 'fl',
+        'fn': 'fn',
+        'cob': 'ob',
+        'cfl': 'fl',
+        'cfi': 'fl',
+        'cfe': 'fl',
+        'cfn': 'fn',
+        'jfi': 'fl',
+    }
+
+    _position_map = {
+        'ob': 'ob',
+        'fl': 'fl',
+        'fi': 'fl',
+        'fe': 'fl',
+        'fn': 'fn',
+        'cob': 'cob',
+        'cfl': 'cfl',
+        'cfi': 'cfl',
+        'cfe': 'cfl',
+        'cfn': 'cfn',
+        'jfi': 'jfi',
+    }
+
+    def parse_position_spec(self):
+        line = self.lookahead()
+        
+        if line.startswith('jump=') or line.startswith('jcnd='):
+            self.consume()
+            return True
+
+        mo = self._position_re.match(line)
+        if not mo:
+            return False
+
+        position, id, name = mo.groups()
+        if id:
+            table = self._position_table_map[position]
+            if name:
+                self.position_ids[(table, id)] = name
+            else:
+                name = self.position_ids.get((table, id), '')
+        self.positions[self._position_map[position]] = name
+
+        self.consume()
+        return True
+
+    def parse_empty(self):
+        if self.eof():
+            return False
+        line = self.lookahead()
+        if line.strip():
+            return False
+        self.consume()
+        return True
+
+    def parse_comment(self):
+        line = self.lookahead()
+        if not line.startswith('#'):
+            return False
+        self.consume()
+        return True
+
+    _key_re = re.compile(r'^(\w+):')
+
+    def parse_key(self, key):
+        pair = self.parse_keys((key,))
+        if not pair:
+            return None
+        key, value = pair
+        return value
+        line = self.lookahead()
+        mo = self._key_re.match(line)
+        if not mo:
+            return None
+        key, value = line.split(':', 1)
+        if key not in keys:
+            return None
+        value = value.strip()
+        self.consume()
+        return key, value
+
+    def parse_keys(self, keys):
+        line = self.lookahead()
+        mo = self._key_re.match(line)
+        if not mo:
+            return None
+        key, value = line.split(':', 1)
+        if key not in keys:
+            return None
+        value = value.strip()
+        self.consume()
+        return key, value
+
+    def make_function(self, module, filename, name):
+        # FIXME: module and filename are not being tracked reliably
+        #id = '|'.join((module, filename, name))
+        id = name
+        try:
+            function = self.profile.functions[id]
+        except KeyError:
+            function = Function(id, name)
+            function[SAMPLES] = 0
+            function.called = 0
+            self.profile.add_function(function)
+        return function
+
+    def get_function(self):
+        module = self.positions.get('ob', '')
+        filename = self.positions.get('fl', '') 
+        function = self.positions.get('fn', '') 
+        return self.make_function(module, filename, function)
+
+    def get_callee(self):
+        module = self.positions.get('cob', '')
+        filename = self.positions.get('cfi', '') 
+        function = self.positions.get('cfn', '') 
+        return self.make_function(module, filename, function)
+
+
+class OprofileParser(LineParser):
+    """Parser for oprofile callgraph output.
+    
+    See also:
+    - http://oprofile.sourceforge.net/doc/opreport.html#opreport-callgraph
+    """
+
+    _fields_re = {
+        'samples': r'(\d+)',
+        '%': r'(\S+)',
+        'linenr info': r'(?P<source>\(no location information\)|\S+:\d+)',
+        'image name': r'(?P<image>\S+(?:\s\(tgid:[^)]*\))?)',
+        'app name': r'(?P<application>\S+)',
+        'symbol name': r'(?P<symbol>\(no symbols\)|.+?)',
+    }
+
+    def __init__(self, infile):
+        LineParser.__init__(self, infile)
+        self.entries = {}
+        self.entry_re = None
+
+    def add_entry(self, callers, function, callees):
+        try:
+            entry = self.entries[function.id]
+        except KeyError:
+            self.entries[function.id] = (callers, function, callees)
+        else:
+            callers_total, function_total, callees_total = entry
+            self.update_subentries_dict(callers_total, callers)
+            function_total.samples += function.samples
+            self.update_subentries_dict(callees_total, callees)
+    
+    def update_subentries_dict(self, totals, partials):
+        for partial in partials.itervalues():
+            try:
+                total = totals[partial.id]
+            except KeyError:
+                totals[partial.id] = partial
+            else:
+                total.samples += partial.samples
+        
+    def parse(self):
+        # read lookahead
+        self.readline()
+
+        self.parse_header()
+        while self.lookahead():
+            self.parse_entry()
+
+        profile = Profile()
+
+        reverse_call_samples = {}
+        
+        # populate the profile
+        profile[SAMPLES] = 0
+        for _callers, _function, _callees in self.entries.itervalues():
+            function = Function(_function.id, _function.name)
+            function[SAMPLES] = _function.samples
+            profile.add_function(function)
+            profile[SAMPLES] += _function.samples
+
+            if _function.application:
+                function.process = os.path.basename(_function.application)
+            if _function.image:
+                function.module = os.path.basename(_function.image)
+
+            total_callee_samples = 0
+            for _callee in _callees.itervalues():
+                total_callee_samples += _callee.samples
+
+            for _callee in _callees.itervalues():
+                if not _callee.self:
+                    call = Call(_callee.id)
+                    call[SAMPLES2] = _callee.samples
+                    function.add_call(call)
+                
+        # compute derived data
+        profile.validate()
+        profile.find_cycles()
+        profile.ratio(TIME_RATIO, SAMPLES)
+        profile.call_ratios(SAMPLES2)
+        profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+        return profile
+
+    def parse_header(self):
+        while not self.match_header():
+            self.consume()
+        line = self.lookahead()
+        fields = re.split(r'\s\s+', line)
+        entry_re = r'^\s*' + r'\s+'.join([self._fields_re[field] for field in fields]) + r'(?P<self>\s+\[self\])?$'
+        self.entry_re = re.compile(entry_re)
+        self.skip_separator()
+
+    def parse_entry(self):
+        callers = self.parse_subentries()
+        if self.match_primary():
+            function = self.parse_subentry()
+            if function is not None:
+                callees = self.parse_subentries()
+                self.add_entry(callers, function, callees)
+        self.skip_separator()
+
+    def parse_subentries(self):
+        subentries = {}
+        while self.match_secondary():
+            subentry = self.parse_subentry()
+            subentries[subentry.id] = subentry
+        return subentries
+
+    def parse_subentry(self):
+        entry = Struct()
+        line = self.consume()
+        mo = self.entry_re.match(line)
+        if not mo:
+            raise ParseError('failed to parse', line)
+        fields = mo.groupdict()
+        entry.samples = int(mo.group(1))
+        if 'source' in fields and fields['source'] != '(no location information)':
+            source = fields['source']
+            filename, lineno = source.split(':')
+            entry.filename = filename
+            entry.lineno = int(lineno)
+        else:
+            source = ''
+            entry.filename = None
+            entry.lineno = None
+        entry.image = fields.get('image', '')
+        entry.application = fields.get('application', '')
+        if 'symbol' in fields and fields['symbol'] != '(no symbols)':
+            entry.symbol = fields['symbol']
+        else:
+            entry.symbol = ''
+        if entry.symbol.startswith('"') and entry.symbol.endswith('"'):
+            entry.symbol = entry.symbol[1:-1]
+        entry.id = ':'.join((entry.application, entry.image, source, entry.symbol))
+        entry.self = fields.get('self', None) != None
+        if entry.self:
+            entry.id += ':self'
+        if entry.symbol:
+            entry.name = entry.symbol
+        else:
+            entry.name = entry.image
+        return entry
+
+    def skip_separator(self):
+        while not self.match_separator():
+            self.consume()
+        self.consume()
+
+    def match_header(self):
+        line = self.lookahead()
+        return line.startswith('samples')
+
+    def match_separator(self):
+        line = self.lookahead()
+        return line == '-'*len(line)
+
+    def match_primary(self):
+        line = self.lookahead()
+        return not line[:1].isspace()
+    
+    def match_secondary(self):
+        line = self.lookahead()
+        return line[:1].isspace()
+
+
+class HProfParser(LineParser):
+    """Parser for java hprof output
+    
+    See also:
+    - http://java.sun.com/developer/technicalArticles/Programming/HPROF.html
+    """
+
+    trace_re = re.compile(r'\t(.*)\((.*):(.*)\)')
+    trace_id_re = re.compile(r'^TRACE (\d+):$')
+
+    def __init__(self, infile):
+        LineParser.__init__(self, infile)
+        self.traces = {}
+        self.samples = {}
+
+    def parse(self):
+        # read lookahead
+        self.readline()
+
+        while not self.lookahead().startswith('------'): self.consume()
+        while not self.lookahead().startswith('TRACE '): self.consume()
+
+        self.parse_traces()
+
+        while not self.lookahead().startswith('CPU'):
+            self.consume()
+
+        self.parse_samples()
+
+        # populate the profile
+        profile = Profile()
+        profile[SAMPLES] = 0
+
+        functions = {}
+
+        # build up callgraph
+        for id, trace in self.traces.iteritems():
+            if not id in self.samples: continue
+            mtime = self.samples[id][0]
+            last = None
+
+            for func, file, line in trace:
+                if not func in functions:
+                    function = Function(func, func)
+                    function[SAMPLES] = 0
+                    profile.add_function(function)
+                    functions[func] = function
+
+                function = functions[func]
+                # allocate time to the deepest method in the trace
+                if not last:
+                    function[SAMPLES] += mtime
+                    profile[SAMPLES] += mtime
+                else:
+                    c = function.get_call(last)
+                    c[SAMPLES2] += mtime
+
+                last = func
+
+        # compute derived data
+        profile.validate()
+        profile.find_cycles()
+        profile.ratio(TIME_RATIO, SAMPLES)
+        profile.call_ratios(SAMPLES2)
+        profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+        return profile
+
+    def parse_traces(self):
+        while self.lookahead().startswith('TRACE '):
+            self.parse_trace()
+
+    def parse_trace(self):
+        l = self.consume()
+        mo = self.trace_id_re.match(l)
+        tid = mo.group(1)
+        last = None
+        trace = []
+
+        while self.lookahead().startswith('\t'):
+            l = self.consume()
+            match = self.trace_re.search(l)
+            if not match:
+                #sys.stderr.write('Invalid line: %s\n' % l)
+                break
+            else:
+                function_name, file, line = match.groups()
+                trace += [(function_name, file, line)]
+
+        self.traces[int(tid)] = trace
+
+    def parse_samples(self):
+        self.consume()
+        self.consume()
+
+        while not self.lookahead().startswith('CPU'):
+            rank, percent_self, percent_accum, count, traceid, method = self.lookahead().split()
+            self.samples[int(traceid)] = (int(count), method)
+            self.consume()
+
+
+class SysprofParser(XmlParser):
+
+    def __init__(self, stream):
+        XmlParser.__init__(self, stream)
+
+    def parse(self):
+        objects = {}
+        nodes = {}
+
+        self.element_start('profile')
+        while self.token.type == XML_ELEMENT_START:
+            if self.token.name_or_data == 'objects':
+                assert not objects
+                objects = self.parse_items('objects')
+            elif self.token.name_or_data == 'nodes':
+                assert not nodes
+                nodes = self.parse_items('nodes')
+            else:
+                self.parse_value(self.token.name_or_data)
+        self.element_end('profile')
+
+        return self.build_profile(objects, nodes)
+
+    def parse_items(self, name):
+        assert name[-1] == 's'
+        items = {}
+        self.element_start(name)
+        while self.token.type == XML_ELEMENT_START:
+            id, values = self.parse_item(name[:-1])
+            assert id not in items
+            items[id] = values
+        self.element_end(name)
+        return items
+
+    def parse_item(self, name):
+        attrs = self.element_start(name)
+        id = int(attrs['id'])
+        values = self.parse_values()
+        self.element_end(name)
+        return id, values
+
+    def parse_values(self):
+        values = {}
+        while self.token.type == XML_ELEMENT_START:
+            name = self.token.name_or_data
+            value = self.parse_value(name)
+            assert name not in values
+            values[name] = value
+        return values
+
+    def parse_value(self, tag):
+        self.element_start(tag)
+        value = self.character_data()
+        self.element_end(tag)
+        if value.isdigit():
+            return int(value)
+        if value.startswith('"') and value.endswith('"'):
+            return value[1:-1]
+        return value
+
+    def build_profile(self, objects, nodes):
+        profile = Profile()
+        
+        profile[SAMPLES] = 0
+        for id, object in objects.iteritems():
+            # Ignore fake objects (process names, modules, "Everything", "kernel", etc.)
+            if object['self'] == 0:
+                continue
+
+            function = Function(id, object['name'])
+            function[SAMPLES] = object['self']
+            profile.add_function(function)
+            profile[SAMPLES] += function[SAMPLES]
+
+        for id, node in nodes.iteritems():
+            # Ignore fake calls
+            if node['self'] == 0:
+                continue
+
+            # Find a non-ignored parent
+            parent_id = node['parent']
+            while parent_id != 0:
+                parent = nodes[parent_id]
+                caller_id = parent['object']
+                if objects[caller_id]['self'] != 0:
+                    break
+                parent_id = parent['parent']
+            if parent_id == 0:
+                continue
+
+            callee_id = node['object']
+
+            assert objects[caller_id]['self']
+            assert objects[callee_id]['self']
+
+            function = profile.functions[caller_id]
+
+            samples = node['self']
+            try:
+                call = function.calls[callee_id]
+            except KeyError:
+                call = Call(callee_id)
+                call[SAMPLES2] = samples
+                function.add_call(call)
+            else:
+                call[SAMPLES2] += samples
+
+        # Compute derived events
+        profile.validate()
+        profile.find_cycles()
+        profile.ratio(TIME_RATIO, SAMPLES)
+        profile.call_ratios(SAMPLES2)
+        profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+        return profile
+
+
+class SharkParser(LineParser):
+    """Parser for MacOSX Shark output.
+
+    Author: tom at dbservice.com
+    """
+
+    def __init__(self, infile):
+        LineParser.__init__(self, infile)
+        self.stack = []
+        self.entries = {}
+
+    def add_entry(self, function):
+        try:
+            entry = self.entries[function.id]
+        except KeyError:
+            self.entries[function.id] = (function, { })
+        else:
+            function_total, callees_total = entry
+            function_total.samples += function.samples
+    
+    def add_callee(self, function, callee):
+        func, callees = self.entries[function.id]
+        try:
+            entry = callees[callee.id]
+        except KeyError:
+            callees[callee.id] = callee
+        else:
+            entry.samples += callee.samples
+        
+    def parse(self):
+        self.readline()
+        self.readline()
+        self.readline()
+        self.readline()
+
+        match = re.compile(r'(?P<prefix>[|+ ]*)(?P<samples>\d+), (?P<symbol>[^,]+), (?P<image>.*)')
+
+        while self.lookahead():
+            line = self.consume()
+            mo = match.match(line)
+            if not mo:
+                raise ParseError('failed to parse', line)
+
+            fields = mo.groupdict()
+            prefix = len(fields.get('prefix', 0)) / 2 - 1
+
+            symbol = str(fields.get('symbol', 0))
+            image = str(fields.get('image', 0))
+
+            entry = Struct()
+            entry.id = ':'.join([symbol, image])
+            entry.samples = int(fields.get('samples', 0))
+
+            entry.name = symbol
+            entry.image = image
+
+            # adjust the callstack
+            if prefix < len(self.stack):
+                del self.stack[prefix:]
+
+            if prefix == len(self.stack):
+                self.stack.append(entry)
+
+            # if the callstack has had an entry, it's this functions caller
+            if prefix > 0:
+                self.add_callee(self.stack[prefix - 1], entry)
+                
+            self.add_entry(entry)
+                
+        profile = Profile()
+        profile[SAMPLES] = 0
+        for _function, _callees in self.entries.itervalues():
+            function = Function(_function.id, _function.name)
+            function[SAMPLES] = _function.samples
+            profile.add_function(function)
+            profile[SAMPLES] += _function.samples
+
+            if _function.image:
+                function.module = os.path.basename(_function.image)
+
+            for _callee in _callees.itervalues():
+                call = Call(_callee.id)
+                call[SAMPLES] = _callee.samples
+                function.add_call(call)
+                
+        # compute derived data
+        profile.validate()
+        profile.find_cycles()
+        profile.ratio(TIME_RATIO, SAMPLES)
+        profile.call_ratios(SAMPLES)
+        profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+        return profile
+
+
+class XPerfParser(Parser):
+    """Parser for CSVs generted by XPerf, from Microsoft Windows Performance Tools.
+    """
+
+    def __init__(self, stream):
+        Parser.__init__(self)
+        self.stream = stream
+        self.profile = Profile()
+        self.profile[SAMPLES] = 0
+        self.column = {}
+
+    def parse(self):
+        import csv
+        reader = csv.reader(
+            self.stream, 
+            delimiter = ',',
+            quotechar = None,
+            escapechar = None,
+            doublequote = False,
+            skipinitialspace = True,
+            lineterminator = '\r\n',
+            quoting = csv.QUOTE_NONE)
+        it = iter(reader)
+        row = reader.next()
+        self.parse_header(row)
+        for row in it:
+            self.parse_row(row)
+                
+        # compute derived data
+        self.profile.validate()
+        self.profile.find_cycles()
+        self.profile.ratio(TIME_RATIO, SAMPLES)
+        self.profile.call_ratios(SAMPLES2)
+        self.profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+        return self.profile
+
+    def parse_header(self, row):
+        for column in range(len(row)):
+            name = row[column]
+            assert name not in self.column
+            self.column[name] = column
+
+    def parse_row(self, row):
+        fields = {}
+        for name, column in self.column.iteritems():
+            value = row[column]
+            for factory in int, float:
+                try:
+                    value = factory(value)
+                except ValueError:
+                    pass
+                else:
+                    break
+            fields[name] = value
+        
+        process = fields['Process Name']
+        symbol = fields['Module'] + '!' + fields['Function']
+        weight = fields['Weight']
+        count = fields['Count']
+
+        function = self.get_function(process, symbol)
+        function[SAMPLES] += weight * count
+        self.profile[SAMPLES] += weight * count
+
+        stack = fields['Stack']
+        if stack != '?':
+            stack = stack.split('/')
+            assert stack[0] == '[Root]'
+            if stack[-1] != symbol:
+                # XXX: some cases the sampled function does not appear in the stack
+                stack.append(symbol)
+            caller = None
+            for symbol in stack[1:]:
+                callee = self.get_function(process, symbol)
+                if caller is not None:
+                    try:
+                        call = caller.calls[callee.id]
+                    except KeyError:
+                        call = Call(callee.id)
+                        call[SAMPLES2] = count
+                        caller.add_call(call)
+                    else:
+                        call[SAMPLES2] += count
+                caller = callee
+
+    def get_function(self, process, symbol):
+        function_id = process + '!' + symbol
+
+        try:
+            function = self.profile.functions[function_id]
+        except KeyError:
+            module, name = symbol.split('!', 1)
+            function = Function(function_id, name)
+            function.process = process
+            function.module = module
+            function[SAMPLES] = 0
+            self.profile.add_function(function)
+
+        return function
+
+
+class SleepyParser(Parser):
+    """Parser for GNU gprof output.
+
+    See also:
+    - http://www.codersnotes.com/sleepy/
+    - http://sleepygraph.sourceforge.net/
+    """
+
+    def __init__(self, filename):
+        Parser.__init__(self)
+
+        from zipfile import ZipFile
+
+        self.database = ZipFile(filename)
+
+        self.symbols = {}
+        self.calls = {}
+
+        self.profile = Profile()
+    
+    _symbol_re = re.compile(
+        r'^(?P<id>\w+)' + 
+        r'\s+"(?P<module>[^"]*)"' + 
+        r'\s+"(?P<procname>[^"]*)"' + 
+        r'\s+"(?P<sourcefile>[^"]*)"' + 
+        r'\s+(?P<sourceline>\d+)$'
+    )
+
+    def parse_symbols(self):
+        lines = self.database.read('symbols.txt').splitlines()
+        for line in lines:
+            mo = self._symbol_re.match(line)
+            if mo:
+                symbol_id, module, procname, sourcefile, sourceline = mo.groups()
+    
+                function_id = ':'.join([module, procname])
+
+                try:
+                    function = self.profile.functions[function_id]
+                except KeyError:
+                    function = Function(function_id, procname)
+                    function.module = module
+                    function[SAMPLES] = 0
+                    self.profile.add_function(function)
+
+                self.symbols[symbol_id] = function
+
+    def parse_callstacks(self):
+        lines = self.database.read("callstacks.txt").splitlines()
+        for line in lines:
+            fields = line.split()
+            samples = int(fields[0])
+            callstack = fields[1:]
+
+            callstack = [self.symbols[symbol_id] for symbol_id in callstack]
+
+            callee = callstack[0]
+
+            callee[SAMPLES] += samples
+            self.profile[SAMPLES] += samples
+            
+            for caller in callstack[1:]:
+                try:
+                    call = caller.calls[callee.id]
+                except KeyError:
+                    call = Call(callee.id)
+                    call[SAMPLES2] = samples
+                    caller.add_call(call)
+                else:
+                    call[SAMPLES2] += samples
+
+                callee = caller
+
+    def parse(self):
+        profile = self.profile
+        profile[SAMPLES] = 0
+
+        self.parse_symbols()
+        self.parse_callstacks()
+
+        # Compute derived events
+        profile.validate()
+        profile.find_cycles()
+        profile.ratio(TIME_RATIO, SAMPLES)
+        profile.call_ratios(SAMPLES2)
+        profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+        return profile
+
+
+class AQtimeTable:
+
+    def __init__(self, name, fields):
+        self.name = name
+
+        self.fields = fields
+        self.field_column = {}
+        for column in range(len(fields)):
+            self.field_column[fields[column]] = column
+        self.rows = []
+
+    def __len__(self):
+        return len(self.rows)
+
+    def __iter__(self):
+        for values, children in self.rows:
+            fields = {}
+            for name, value in zip(self.fields, values):
+                fields[name] = value
+            children = dict([(child.name, child) for child in children])
+            yield fields, children
+        raise StopIteration
+
+    def add_row(self, values, children=()):
+        self.rows.append((values, children))
+
+
+class AQtimeParser(XmlParser):
+
+    def __init__(self, stream):
+        XmlParser.__init__(self, stream)
+        self.tables = {}
+
+    def parse(self):
+        self.element_start('AQtime_Results')
+        self.parse_headers()
+        results = self.parse_results()
+        self.element_end('AQtime_Results')
+        return self.build_profile(results) 
+
+    def parse_headers(self):
+        self.element_start('HEADERS')
+        while self.token.type == XML_ELEMENT_START:
+            self.parse_table_header()
+        self.element_end('HEADERS')
+
+    def parse_table_header(self):
+        attrs = self.element_start('TABLE_HEADER')
+        name = attrs['NAME']
+        id = int(attrs['ID'])
+        field_types = []
+        field_names = []
+        while self.token.type == XML_ELEMENT_START:
+            field_type, field_name = self.parse_table_field()
+            field_types.append(field_type)
+            field_names.append(field_name)
+        self.element_end('TABLE_HEADER')
+        self.tables[id] = name, field_types, field_names
+
+    def parse_table_field(self):
+        attrs = self.element_start('TABLE_FIELD')
+        type = attrs['TYPE']
+        name = self.character_data()
+        self.element_end('TABLE_FIELD')
+        return type, name
+
+    def parse_results(self):
+        self.element_start('RESULTS')
+        table = self.parse_data()
+        self.element_end('RESULTS')
+        return table
+
+    def parse_data(self):
+        rows = []
+        attrs = self.element_start('DATA')
+        table_id = int(attrs['TABLE_ID'])
+        table_name, field_types, field_names = self.tables[table_id]
+        table = AQtimeTable(table_name, field_names)
+        while self.token.type == XML_ELEMENT_START:
+            row, children = self.parse_row(field_types)
+            table.add_row(row, children)
+        self.element_end('DATA')
+        return table
+
+    def parse_row(self, field_types):
+        row = [None]*len(field_types)
+        children = []
+        self.element_start('ROW')
+        while self.token.type == XML_ELEMENT_START:
+            if self.token.name_or_data == 'FIELD':
+                field_id, field_value = self.parse_field(field_types)
+                row[field_id] = field_value
+            elif self.token.name_or_data == 'CHILDREN':
+                children = self.parse_children()
+            else:
+                raise XmlTokenMismatch("<FIELD ...> or <CHILDREN ...>", self.token)
+        self.element_end('ROW')
+        return row, children
+
+    def parse_field(self, field_types):
+        attrs = self.element_start('FIELD')
+        id = int(attrs['ID'])
+        type = field_types[id]
+        value = self.character_data()
+        if type == 'Integer':
+            value = int(value)
+        elif type == 'Float':
+            value = float(value)
+        elif type == 'Address':
+            value = int(value)
+        elif type == 'String':
+            pass
+        else:
+            assert False
+        self.element_end('FIELD')
+        return id, value
+
+    def parse_children(self):
+        children = []
+        self.element_start('CHILDREN')
+        while self.token.type == XML_ELEMENT_START:
+            table = self.parse_data()
+            assert table.name not in children
+            children.append(table)
+        self.element_end('CHILDREN')
+        return children
+
+    def build_profile(self, results):
+        assert results.name == 'Routines'
+        profile = Profile()
+        profile[TIME] = 0.0
+        for fields, tables in results:
+            function = self.build_function(fields)
+            children = tables['Children']
+            for fields, _ in children:
+                call = self.build_call(fields)
+                function.add_call(call)
+            profile.add_function(function)
+            profile[TIME] = profile[TIME] + function[TIME]
+        profile[TOTAL_TIME] = profile[TIME]
+        profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME)
+        return profile
+    
+    def build_function(self, fields):
+        function = Function(self.build_id(fields), self.build_name(fields))
+        function[TIME] = fields['Time']
+        function[TOTAL_TIME] = fields['Time with Children']
+        #function[TIME_RATIO] = fields['% Time']/100.0
+        #function[TOTAL_TIME_RATIO] = fields['% with Children']/100.0
+        return function
+
+    def build_call(self, fields):
+        call = Call(self.build_id(fields))
+        call[TIME] = fields['Time']
+        call[TOTAL_TIME] = fields['Time with Children']
+        #call[TIME_RATIO] = fields['% Time']/100.0
+        #call[TOTAL_TIME_RATIO] = fields['% with Children']/100.0
+        return call
+
+    def build_id(self, fields):
+        return ':'.join([fields['Module Name'], fields['Unit Name'], fields['Routine Name']])
+
+    def build_name(self, fields):
+        # TODO: use more fields
+        return fields['Routine Name']
+
+
+class PstatsParser:
+    """Parser python profiling statistics saved with te pstats module."""
+
+    def __init__(self, *filename):
+        import pstats
+        try:
+            self.stats = pstats.Stats(*filename)
+        except ValueError:
+            import hotshot.stats
+            self.stats = hotshot.stats.load(filename[0])
+        self.profile = Profile()
+        self.function_ids = {}
+
+    def get_function_name(self, (filename, line, name)):
+        module = os.path.splitext(filename)[0]
+        module = os.path.basename(module)
+        return "%s:%d:%s" % (module, line, name)
+
+    def get_function(self, key):
+        try:
+            id = self.function_ids[key]
+        except KeyError:
+            id = len(self.function_ids)
+            name = self.get_function_name(key)
+            function = Function(id, name)
+            self.profile.functions[id] = function
+            self.function_ids[key] = id
+        else:
+            function = self.profile.functions[id]
+        return function
+
+    def parse(self):
+        self.profile[TIME] = 0.0
+        self.profile[TOTAL_TIME] = self.stats.total_tt
+        for fn, (cc, nc, tt, ct, callers) in self.stats.stats.iteritems():
+            callee = self.get_function(fn)
+            callee.called = nc
+            callee[TOTAL_TIME] = ct
+            callee[TIME] = tt
+            self.profile[TIME] += tt
+            self.profile[TOTAL_TIME] = max(self.profile[TOTAL_TIME], ct)
+            for fn, value in callers.iteritems():
+                caller = self.get_function(fn)
+                call = Call(callee.id)
+                if isinstance(value, tuple):
+                    for i in xrange(0, len(value), 4):
+                        nc, cc, tt, ct = value[i:i+4]
+                        if CALLS in call:
+                            call[CALLS] += cc
+                        else:
+                            call[CALLS] = cc
+
+                        if TOTAL_TIME in call:
+                            call[TOTAL_TIME] += ct
+                        else:
+                            call[TOTAL_TIME] = ct
+
+                else:
+                    call[CALLS] = value
+                    call[TOTAL_TIME] = ratio(value, nc)*ct
+
+                caller.add_call(call)
+        #self.stats.print_stats()
+        #self.stats.print_callees()
+
+        # Compute derived events
+        self.profile.validate()
+        self.profile.ratio(TIME_RATIO, TIME)
+        self.profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME)
+
+        return self.profile
+
+
+class Theme:
+
+    def __init__(self, 
+            bgcolor = (0.0, 0.0, 1.0),
+            mincolor = (0.0, 0.0, 0.0),
+            maxcolor = (0.0, 0.0, 1.0),
+            fontname = "Arial",
+            minfontsize = 10.0,
+            maxfontsize = 10.0,
+            minpenwidth = 0.5,
+            maxpenwidth = 4.0,
+            gamma = 2.2,
+            skew = 1.0):
+        self.bgcolor = bgcolor
+        self.mincolor = mincolor
+        self.maxcolor = maxcolor
+        self.fontname = fontname
+        self.minfontsize = minfontsize
+        self.maxfontsize = maxfontsize
+        self.minpenwidth = minpenwidth
+        self.maxpenwidth = maxpenwidth
+        self.gamma = gamma
+        self.skew = skew
+
+    def graph_bgcolor(self):
+        return self.hsl_to_rgb(*self.bgcolor)
+
+    def graph_fontname(self):
+        return self.fontname
+
+    def graph_fontsize(self):
+        return self.minfontsize
+
+    def node_bgcolor(self, weight):
+        return self.color(weight)
+
+    def node_fgcolor(self, weight):
+        return self.graph_bgcolor()
+
+    def node_fontsize(self, weight):
+        return self.fontsize(weight)
+
+    def edge_color(self, weight):
+        return self.color(weight)
+
+    def edge_fontsize(self, weight):
+        return self.fontsize(weight)
+
+    def edge_penwidth(self, weight):
+        return max(weight*self.maxpenwidth, self.minpenwidth)
+
+    def edge_arrowsize(self, weight):
+        return 0.5 * math.sqrt(self.edge_penwidth(weight))
+
+    def fontsize(self, weight):
+        return max(weight**2 * self.maxfontsize, self.minfontsize)
+
+    def color(self, weight):
+        weight = min(max(weight, 0.0), 1.0)
+    
+        hmin, smin, lmin = self.mincolor
+        hmax, smax, lmax = self.maxcolor
+        
+        if self.skew < 0:
+            raise ValueError("Skew must be greater than 0")
+        elif self.skew == 1.0:
+            h = hmin + weight*(hmax - hmin)
+            s = smin + weight*(smax - smin)
+            l = lmin + weight*(lmax - lmin)
+        else:
+            base = self.skew
+            h = hmin + ((hmax-hmin)*(-1.0 + (base ** weight)) / (base - 1.0))
+            s = smin + ((smax-smin)*(-1.0 + (base ** weight)) / (base - 1.0))
+            l = lmin + ((lmax-lmin)*(-1.0 + (base ** weight)) / (base - 1.0))
+
+        return self.hsl_to_rgb(h, s, l)
+
+    def hsl_to_rgb(self, h, s, l):
+        """Convert a color from HSL color-model to RGB.
+
+        See also:
+        - http://www.w3.org/TR/css3-color/#hsl-color
+        """
+
+        h = h % 1.0
+        s = min(max(s, 0.0), 1.0)
+        l = min(max(l, 0.0), 1.0)
+
+        if l <= 0.5:
+            m2 = l*(s + 1.0)
+        else:
+            m2 = l + s - l*s
+        m1 = l*2.0 - m2
+        r = self._hue_to_rgb(m1, m2, h + 1.0/3.0)
+        g = self._hue_to_rgb(m1, m2, h)
+        b = self._hue_to_rgb(m1, m2, h - 1.0/3.0)
+
+        # Apply gamma correction
+        r **= self.gamma
+        g **= self.gamma
+        b **= self.gamma
+
+        return (r, g, b)
+
+    def _hue_to_rgb(self, m1, m2, h):
+        if h < 0.0:
+            h += 1.0
+        elif h > 1.0:
+            h -= 1.0
+        if h*6 < 1.0:
+            return m1 + (m2 - m1)*h*6.0
+        elif h*2 < 1.0:
+            return m2
+        elif h*3 < 2.0:
+            return m1 + (m2 - m1)*(2.0/3.0 - h)*6.0
+        else:
+            return m1
+
+
+TEMPERATURE_COLORMAP = Theme(
+    mincolor = (2.0/3.0, 0.80, 0.25), # dark blue
+    maxcolor = (0.0, 1.0, 0.5), # satured red
+    gamma = 1.0
+)
+
+PINK_COLORMAP = Theme(
+    mincolor = (0.0, 1.0, 0.90), # pink
+    maxcolor = (0.0, 1.0, 0.5), # satured red
+)
+
+GRAY_COLORMAP = Theme(
+    mincolor = (0.0, 0.0, 0.85), # light gray
+    maxcolor = (0.0, 0.0, 0.0), # black
+)
+
+BW_COLORMAP = Theme(
+    minfontsize = 8.0,
+    maxfontsize = 24.0,
+    mincolor = (0.0, 0.0, 0.0), # black
+    maxcolor = (0.0, 0.0, 0.0), # black
+    minpenwidth = 0.1,
+    maxpenwidth = 8.0,
+)
+
+
+class DotWriter:
+    """Writer for the DOT language.
+
+    See also:
+    - "The DOT Language" specification
+      http://www.graphviz.org/doc/info/lang.html
+    """
+
+    def __init__(self, fp):
+        self.fp = fp
+
+    def graph(self, profile, theme):
+        self.begin_graph()
+
+        fontname = theme.graph_fontname()
+
+        self.attr('graph', fontname=fontname, ranksep=0.25, nodesep=0.125)
+        self.attr('node', fontname=fontname, shape="box", style="filled", fontcolor="white", width=0, height=0)
+        self.attr('edge', fontname=fontname)
+
+        for function in profile.functions.itervalues():
+            labels = []
+            if function.process is not None:
+                labels.append(function.process)
+            if function.module is not None:
+                labels.append(function.module)
+            labels.append(function.name)
+            for event in TOTAL_TIME_RATIO, TIME_RATIO:
+                if event in function.events:
+                    label = event.format(function[event])
+                    labels.append(label)
+            if function.called is not None:
+                labels.append(u"%u\xd7" % (function.called,))
+
+            if function.weight is not None:
+                weight = function.weight
+            else:
+                weight = 0.0
+
+            label = '\n'.join(labels)
+            self.node(function.id, 
+                label = label, 
+                color = self.color(theme.node_bgcolor(weight)), 
+                fontcolor = self.color(theme.node_fgcolor(weight)), 
+                fontsize = "%.2f" % theme.node_fontsize(weight),
+            )
+
+            for call in function.calls.itervalues():
+                callee = profile.functions[call.callee_id]
+
+                labels = []
+                for event in TOTAL_TIME_RATIO, CALLS:
+                    if event in call.events:
+                        label = event.format(call[event])
+                        labels.append(label)
+
+                if call.weight is not None:
+                    weight = call.weight
+                elif callee.weight is not None:
+                    weight = callee.weight
+                else:
+                    weight = 0.0
+
+                label = '\n'.join(labels)
+
+                self.edge(function.id, call.callee_id, 
+                    label = label, 
+                    color = self.color(theme.edge_color(weight)), 
+                    fontcolor = self.color(theme.edge_color(weight)),
+                    fontsize = "%.2f" % theme.edge_fontsize(weight), 
+                    penwidth = "%.2f" % theme.edge_penwidth(weight), 
+                    labeldistance = "%.2f" % theme.edge_penwidth(weight), 
+                    arrowsize = "%.2f" % theme.edge_arrowsize(weight),
+                )
+
+        self.end_graph()
+
+    def begin_graph(self):
+        self.write('digraph {\n')
+
+    def end_graph(self):
+        self.write('}\n')
+
+    def attr(self, what, **attrs):
+        self.write("\t")
+        self.write(what)
+        self.attr_list(attrs)
+        self.write(";\n")
+
+    def node(self, node, **attrs):
+        self.write("\t")
+        self.id(node)
+        self.attr_list(attrs)
+        self.write(";\n")
+
+    def edge(self, src, dst, **attrs):
+        self.write("\t")
+        self.id(src)
+        self.write(" -> ")
+        self.id(dst)
+        self.attr_list(attrs)
+        self.write(";\n")
+
+    def attr_list(self, attrs):
+        if not attrs:
+            return
+        self.write(' [')
+        first = True
+        for name, value in attrs.iteritems():
+            if first:
+                first = False
+            else:
+                self.write(", ")
+            self.id(name)
+            self.write('=')
+            self.id(value)
+        self.write(']')
+
+    def id(self, id):
+        if isinstance(id, (int, float)):
+            s = str(id)
+        elif isinstance(id, basestring):
+            if id.isalnum() and not id.startswith('0x'):
+                s = id
+            else:
+                s = self.escape(id)
+        else:
+            raise TypeError
+        self.write(s)
+
+    def color(self, (r, g, b)):
+
+        def float2int(f):
+            if f <= 0.0:
+                return 0
+            if f >= 1.0:
+                return 255
+            return int(255.0*f + 0.5)
+
+        return "#" + "".join(["%02x" % float2int(c) for c in (r, g, b)])
+
+    def escape(self, s):
+        s = s.encode('utf-8')
+        s = s.replace('\\', r'\\')
+        s = s.replace('\n', r'\n')
+        s = s.replace('\t', r'\t')
+        s = s.replace('"', r'\"')
+        return '"' + s + '"'
+
+    def write(self, s):
+        self.fp.write(s)
+
+
+class Main:
+    """Main program."""
+
+    themes = {
+            "color": TEMPERATURE_COLORMAP,
+            "pink": PINK_COLORMAP,
+            "gray": GRAY_COLORMAP,
+            "bw": BW_COLORMAP,
+    }
+
+    def main(self):
+        """Main program."""
+
+        parser = optparse.OptionParser(
+            usage="\n\t%prog [options] [file] ...",
+            version="%%prog %s" % __version__)
+        parser.add_option(
+            '-o', '--output', metavar='FILE',
+            type="string", dest="output",
+            help="output filename [stdout]")
+        parser.add_option(
+            '-n', '--node-thres', metavar='PERCENTAGE',
+            type="float", dest="node_thres", default=0.5,
+            help="eliminate nodes below this threshold [default: %default]")
+        parser.add_option(
+            '-e', '--edge-thres', metavar='PERCENTAGE',
+            type="float", dest="edge_thres", default=0.1,
+            help="eliminate edges below this threshold [default: %default]")
+        parser.add_option(
+            '-f', '--format',
+            type="choice", choices=('prof', 'callgrind', 'oprofile', 'hprof', 'sysprof', 'pstats', 'shark', 'sleepy', 'aqtime', 'xperf'),
+            dest="format", default="prof",
+            help="profile format: prof, callgrind, oprofile, hprof, sysprof, shark, sleepy, aqtime, pstats, or xperf [default: %default]")
+        parser.add_option(
+            '-c', '--colormap',
+            type="choice", choices=('color', 'pink', 'gray', 'bw'),
+            dest="theme", default="color",
+            help="color map: color, pink, gray, or bw [default: %default]")
+        parser.add_option(
+            '-s', '--strip',
+            action="store_true",
+            dest="strip", default=False,
+            help="strip function parameters, template parameters, and const modifiers from demangled C++ function names")
+        parser.add_option(
+            '-w', '--wrap',
+            action="store_true",
+            dest="wrap", default=False,
+            help="wrap function names")
+        # add a new option to control skew of the colorization curve
+        parser.add_option(
+            '--skew',
+            type="float", dest="theme_skew", default=1.0,
+            help="skew the colorization curve.  Values < 1.0 give more variety to lower percentages.  Value > 1.0 give less variety to lower percentages")
+        (self.options, self.args) = parser.parse_args(sys.argv[1:])
+
+        if len(self.args) > 1 and self.options.format != 'pstats':
+            parser.error('incorrect number of arguments')
+
+        try:
+            self.theme = self.themes[self.options.theme]
+        except KeyError:
+            parser.error('invalid colormap \'%s\'' % self.options.theme)
+        
+        # set skew on the theme now that it has been picked.
+        if self.options.theme_skew:
+            self.theme.skew = self.options.theme_skew
+
+        if self.options.format == 'prof':
+            if not self.args:
+                fp = sys.stdin
+            else:
+                fp = open(self.args[0], 'rt')
+            parser = GprofParser(fp)
+        elif self.options.format == 'callgrind':
+            if not self.args:
+                fp = sys.stdin
+            else:
+                fp = open(self.args[0], 'rt')
+            parser = CallgrindParser(fp)
+        elif self.options.format == 'oprofile':
+            if not self.args:
+                fp = sys.stdin
+            else:
+                fp = open(self.args[0], 'rt')
+            parser = OprofileParser(fp)
+        elif self.options.format == 'sysprof':
+            if not self.args:
+                fp = sys.stdin
+            else:
+                fp = open(self.args[0], 'rt')
+            parser = SysprofParser(fp)
+        elif self.options.format == 'hprof':
+            if not self.args:
+                fp = sys.stdin
+            else:
+                fp = open(self.args[0], 'rt')
+            parser = HProfParser(fp)        
+        elif self.options.format == 'pstats':
+            if not self.args:
+                parser.error('at least a file must be specified for pstats input')
+            parser = PstatsParser(*self.args)
+        elif self.options.format == 'xperf':
+            if not self.args:
+                fp = sys.stdin
+            else:
+                fp = open(self.args[0], 'rt')
+            parser = XPerfParser(fp)
+        elif self.options.format == 'shark':
+            if not self.args:
+                fp = sys.stdin
+            else:
+                fp = open(self.args[0], 'rt')
+            parser = SharkParser(fp)
+        elif self.options.format == 'sleepy':
+            if len(self.args) != 1:
+                parser.error('exactly one file must be specified for sleepy input')
+            parser = SleepyParser(self.args[0])
+        elif self.options.format == 'aqtime':
+            if not self.args:
+                fp = sys.stdin
+            else:
+                fp = open(self.args[0], 'rt')
+            parser = AQtimeParser(fp)
+        else:
+            parser.error('invalid format \'%s\'' % self.options.format)
+
+        self.profile = parser.parse()
+        
+        if self.options.output is None:
+            self.output = sys.stdout
+        else:
+            self.output = open(self.options.output, 'wt')
+
+        self.write_graph()
+
+    _parenthesis_re = re.compile(r'\([^()]*\)')
+    _angles_re = re.compile(r'<[^<>]*>')
+    _const_re = re.compile(r'\s+const$')
+
+    def strip_function_name(self, name):
+        """Remove extraneous information from C++ demangled function names."""
+
+        # Strip function parameters from name by recursively removing paired parenthesis
+        while True:
+            name, n = self._parenthesis_re.subn('', name)
+            if not n:
+                break
+
+        # Strip const qualifier
+        name = self._const_re.sub('', name)
+
+        # Strip template parameters from name by recursively removing paired angles
+        while True:
+            name, n = self._angles_re.subn('', name)
+            if not n:
+                break
+
+        return name
+
+    def wrap_function_name(self, name):
+        """Split the function name on multiple lines."""
+
+        if len(name) > 32:
+            ratio = 2.0/3.0
+            height = max(int(len(name)/(1.0 - ratio) + 0.5), 1)
+            width = max(len(name)/height, 32)
+            # TODO: break lines in symbols
+            name = textwrap.fill(name, width, break_long_words=False)
+
+        # Take away spaces
+        name = name.replace(", ", ",")
+        name = name.replace("> >", ">>")
+        name = name.replace("> >", ">>") # catch consecutive
+
+        return name
+
+    def compress_function_name(self, name):
+        """Compress function name according to the user preferences."""
+
+        if self.options.strip:
+            name = self.strip_function_name(name)
+
+        if self.options.wrap:
+            name = self.wrap_function_name(name)
+
+        # TODO: merge functions with same resulting name
+
+        return name
+
+    def write_graph(self):
+        dot = DotWriter(self.output)
+        profile = self.profile
+        profile.prune(self.options.node_thres/100.0, self.options.edge_thres/100.0)
+
+        for function in profile.functions.itervalues():
+            function.name = self.compress_function_name(function.name)
+
+        dot.graph(profile, self.theme)
+
+
+if __name__ == '__main__':
+    Main().main()
diff --git a/build/increment-release.sh b/build/increment-release.sh
new file mode 100755
index 0000000..153c0d6
--- /dev/null
+++ b/build/increment-release.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# capture input
+VERSION=$1
+
+# split the version into separate integers
+SPLIT_VERS="$(echo $VERSION | tr '.' ' ')"
+
+inc-version ()
+{
+    local MAJ=$1
+    local MIN=$2
+    local REL=$(expr $3 + 1)
+
+    echo "$MAJ.$MIN.$REL"
+}
+
+# rewrite the version
+inc-version $SPLIT_VERS
+
diff --git a/build/ld.linux.cmn.sh b/build/ld.linux.cmn.sh
new file mode 100644
index 0000000..0751b72
--- /dev/null
+++ b/build/ld.linux.cmn.sh
@@ -0,0 +1,158 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+LD="$1"
+ARCH="$2"
+BUILD="$3"
+shift 3
+
+SRCDIR="$1"
+BINDIR="$2"
+OUTDIR="$3"
+TARG="$4"
+NAME="$5"
+DBGAP="$6"
+shift 6
+
+VERS="$1"
+VERSFILE="$2"
+DEPFILE="$3"
+shift 3
+
+MODE="$1"
+SCMFLAGS="$2"
+LDFLAGS="$3"
+shift 3
+
+LDIRS="$1"
+XDIRS="$2"
+shift 2
+
+OBJS="$1"
+LIBS="$2"
+
+# decode MODE
+STATIC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+DYLD=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+KPROC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+THREADS=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_M=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_XML=$(expr $MODE % 2)
+
+# decode SCMFLAGS
+CHECKSUM=$(expr $SCMFLAGS % 2)
+STATICSYSLIBS=$(expr $SCMFLAGS / 2)
+
+# return parameter for find-lib
+LIBPATH=''
+
+# initial command state
+CMD=''
+LD_STATIC_STATE=0
+LD_ALL_STATE=0
+
+# for breaking out version
+set-vers ()
+{
+    MAJ=$1
+    MIN=$2
+    REL=$3
+}
+
+# for locating libraries
+find-lib ()
+{
+    _lib="lib$1"
+    _dirs="$2"
+
+    LIBPATH=''
+
+    while [ "$_dirs" != "" ]
+    do
+        _dir="${_dirs%%:*}"
+
+        if [ "$_dir" != "" ]
+        then
+            if [ -e "$_dir/$_lib" ]
+            then
+                while [ -L "$_dir/$_lib" ]
+                do
+                    _lib=$(readlink -n "$_dir/$_lib")
+                done
+                LIBPATH="$_dir/$_lib"
+                break;
+            fi
+        fi
+
+        _dirs="${_dirs#$_dir}"
+        _dirs="${_dirs#:}"
+    done
+}
+
+# setting state
+load-static ()
+{
+    if [ $LD_STATIC_STATE -eq 0 ]
+    then
+        CMD="$CMD $LD_STATIC"
+        LD_STATIC_STATE=1
+    fi
+}
+
+load-dynamic ()
+{
+    if [ $LD_STATIC_STATE -eq 1 ]
+    then
+        CMD="$CMD $LD_DYNAMIC"
+        LD_STATIC_STATE=0
+    fi
+}
+
+load-all-symbols ()
+{
+    if [ $LD_ALL_STATE -eq 0 ]
+    then
+        CMD="$CMD $LD_ALL_SYMBOLS"
+        LD_ALL_STATE=1
+    fi
+}
+
+load-ref-symbols ()
+{
+    if [ $LD_ALL_STATE -eq 1 ]
+    then
+        CMD="$CMD $LD_REF_SYMBOLS"
+        LD_ALL_STATE=0
+    fi
+}
diff --git a/build/ld.linux.dlib.sh b/build/ld.linux.dlib.sh
new file mode 100755
index 0000000..4621a98
--- /dev/null
+++ b/build/ld.linux.dlib.sh
@@ -0,0 +1,308 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : require shared
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%dlib.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+g*)
+    source "${0%dlib.sh}gcc.sh"
+    ;;
+i*)
+    source "${0%dlib.sh}icc.sh"
+    ;;
+ *)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+# DLIB_CMD was started in tool-specific source
+CMD="$DLIB_CMD $LDFLAGS"
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create dynamic lib
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+    # tack on paths
+    DIRS="$LDIRS:$XDIRS"
+    while [ "$DIRS" != "" ]
+    do
+        DIR="${DIRS%%:*}"
+        [ "$DIR" != "" ] && CMD="$CMD -L$DIR"
+        DIRS="${DIRS#$DIR}"
+        DIRS="${DIRS#:}"
+    done
+
+    # update LD_LIBRARY_PATH
+    unset LD_LIBRARY_PATH
+    export LD_LIBRARY_PATH="$LDIRS:$XDIRS"
+
+    # tack on libraries, finding as we go
+    for LIB in $LIBS
+    do
+
+        # strip off switch
+        LIBNAME="${LIB#-[lsd]}"
+
+        # look at linkage
+        case "$LIB" in
+        -ldl|-ddl)
+
+            # always load libdl as shared library
+            load-ref-symbols
+            load-dynamic
+            CMD="$CMD -ldl"
+            ;;
+
+        -l*)
+
+            # normal or dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $LIBNAME.so $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load normally
+                    load-ref-symbols
+                    load-dynamic
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # try static only
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $LIBNAME.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+                    SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                    # load static
+                    load-static
+                    load-all-symbols
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                if [ $STATICSYSLIBS -eq 1 ]
+                then
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to static
+                        load-static
+                        load-all-symbols
+                        ;;
+
+                    *)
+                        # set load to dynamic
+                        load-ref-symbols
+                        load-dynamic
+                        ;;
+
+                    esac
+                else
+                    # set load to normal
+                    load-ref-symbols
+                    load-dynamic
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -s*)
+
+            # force static load
+            FOUND=0
+            find-lib $LIBNAME.a $LDIRS
+            if [ "$LIBPATH" != "" ]
+            then
+
+                # found it
+                FOUND=1
+
+                # add it to dependencies
+                DEPS="$DEPS $LIBPATH"
+                SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                # load static
+                load-static
+                load-all-symbols
+                CMD="$CMD -l$LIBNAME"
+
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                if [ $STATIC -eq 1 ] || [ $STATICSYSLIBS -eq 1 ]
+                then
+                    # set load to static
+                    load-static
+                    load-all-symbols
+                else
+
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to dynamic
+                        load-ref-symbols
+                        load-dynamic
+                        ;;
+
+                    *)
+                        # set load to static
+                        load-static
+                        load-all-symbols
+                        ;;
+                    esac
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -d*)
+
+            # only dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $LIBNAME.so $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load normally
+                    load-ref-symbols
+                    load-dynamic
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                # set load to normal
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        esac
+
+    done
+fi
+
+# put state back to normal
+load-ref-symbols
+load-dynamic
+
+# add in pthreads
+if [ $THREADS -ne 0 ]
+then
+    CMD="$CMD -lpthread"
+fi
+
+# add in xml
+if [ $HAVE_XML -ne 0 ]
+then
+    CMD="$CMD -lxml2"
+fi
+
+# add in math library
+if [ $HAVE_M -ne 0 ]
+then
+    CMD="$CMD -lm"
+fi
+
+# produce shared library
+echo "$CMD"
+$CMD || exit $?
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+if [ $CHECKSUM -eq 1 ]
+then
+    SCM_DIR="${BUILD_DIR%/*}/scm"
+    LOGFILE="$SCM_DIR/scm.log"
+    MSG=">>>>> scm: calling the collect script from ld.linux.dlib.sh <<<<<<"
+    #echo "$MSG"
+    echo "$MSG" >> $LOGFILE
+
+    "$BUILD_DIR/scm-collect.sh" "$OBJS" "$SLIBS" | sort -u > "$TARG.md5"
+fi
\ No newline at end of file
diff --git a/build/ld.linux.exe.sh b/build/ld.linux.exe.sh
new file mode 100755
index 0000000..2309105
--- /dev/null
+++ b/build/ld.linux.exe.sh
@@ -0,0 +1,322 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : ignore - will be dynamically loaded
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : require static
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%exe.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+g*)
+    source "${0%exe.sh}gcc.sh"
+    ;;
+i*)
+    source "${0%exe.sh}icc.sh"
+    ;;
+*)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+# EXE_CMD was started in tool-specific source
+CMD="$EXE_CMD $LDFLAGS"
+
+# if building a static executable against dynamic libraries
+# the main application will substitute for name lookup
+if [ $STATIC -eq 1 ] && [ $DYLD -eq 1 ]
+then
+#    CMD="$CMD $LD_EXPORT_GLOBAL $LD_MULTIPLE_DEFS"
+    CMD="$CMD $LD_EXPORT_GLOBAL"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create executable
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile $VERSFILE"
+if [ "$LIBS" != "" ]
+then
+    # tack on paths
+    DIRS="$LDIRS:$XDIRS"
+    while [ "$DIRS" != "" ]
+    do
+        DIR="${DIRS%%:*}"
+        [ "$DIR" != "" ] && CMD="$CMD -L$DIR"
+        DIRS="${DIRS#$DIR}"
+        DIRS="${DIRS#:}"
+    done
+
+    # update LD_LIBRARY_PATH
+    unset LD_LIBRARY_PATH
+    export LD_LIBRARY_PATH="$LDIRS:$XDIRS"
+
+    # tack on libraries, finding as we go
+    for LIB in $LIBS
+    do
+
+        # strip off switch
+        LIBNAME="${LIB#-[lsd]}"
+
+        # look at linkage
+        case "$LIB" in
+        -ldl|-ddl)
+
+            # always load libdl as shared library
+            load-ref-symbols
+            load-dynamic
+            CMD="$CMD -ldl"
+            ;;
+
+        -l*)
+
+            # normal or dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $LIBNAME.so $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load dynamic
+                    load-dynamic
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # try static only
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $LIBNAME.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+                    SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                    # load static
+                    load-static
+                    [ $STATIC -eq 1 ] && load-all-symbols
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                # do not need to load all symbols for external libs
+                [ $STATIC -eq 1 ] && load-ref-symbols
+
+                if [ $STATICSYSLIBS -eq 1 ]
+                then
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to static
+                        load-static
+                        ;;
+
+                    *)
+                        # set load to dynamic
+                        load-dynamic
+                        ;;
+
+                    esac
+                else
+                    # set load to normal
+                    load-dynamic
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -s*)
+
+            # force static load
+            FOUND=0
+            find-lib $LIBNAME.a $LDIRS
+            if [ "$LIBPATH" != "" ]
+            then
+
+                # found it
+                FOUND=1
+
+                # add it to dependencies
+                DEPS="$DEPS $LIBPATH"
+                SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                # load static
+                load-static
+                [ $STATIC -eq 1 ] && load-all-symbols
+                CMD="$CMD -l$LIBNAME"
+
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                # do not need to load all symbols for external libs
+                [ $STATIC -eq 1 ] && load-ref-symbols
+
+                if [ $STATIC -eq 1 ] || [ $STATICSYSLIBS -eq 1 ]
+                then
+
+                    # set load to static
+                    load-static
+
+                else
+
+                    # special case for libs we have in "ext"
+                    # that are sometimes requested as static
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to dynamic
+                        load-dynamic
+                        ;;
+                    *)
+                        load-static
+                        ;;
+                    esac
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -d*)
+
+            FOUND=0
+            if [ $STATIC -eq 1 ]
+            then
+                find-lib $LIBNAME.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+                    SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                    # load static
+                    load-static
+                    load-all-symbols
+
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+
+                # not found within our directories
+                if [ $FOUND -eq 0 ]
+                then
+                    load-static
+                    load-all-symbols
+
+                    CMD="$CMD -l$LIBNAME"
+                fi
+            fi
+            ;;
+
+
+        esac
+
+    done
+fi
+
+# return to normal
+load-ref-symbols
+load-dynamic
+
+# add in pthreads
+if [ $THREADS -ne 0 ]
+then
+    CMD="$CMD -lpthread"
+fi
+
+# add in xml
+if [ "$HAVE_XML2" == "1" ]
+then
+    CMD="$CMD -lxml2"
+fi
+
+# add in math library
+if [ $HAVE_M -ne 0 ]
+then
+    CMD="$CMD -lm"
+fi
+
+# produce shared library
+echo $CMD
+$CMD || exit $?
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+if [ $CHECKSUM -eq 1 ]
+then
+    SCM_DIR="${BUILD_DIR%/*}/scm"
+    LOGFILE="$SCM_DIR/scm.log"
+    MSG=">>>>> scm: calling the collect script from ld.linux.exe.sh <<<<<<"
+    #echo "$MSG"
+    echo "$MSG" >> $LOGFILE
+
+    "$BUILD_DIR/scm-collect.sh" "$OBJS" "$SLIBS" | sort -u > "$TARG.md5"
+fi
diff --git a/build/ld.linux.exe_cmd.sh b/build/ld.linux.exe_cmd.sh
new file mode 100644
index 0000000..70a5b23
--- /dev/null
+++ b/build/ld.linux.exe_cmd.sh
@@ -0,0 +1 @@
+EXE_CMD="$LD -static-libstdc++ -static-libgcc"
diff --git a/build/ld.linux.gcc.sh b/build/ld.linux.gcc.sh
new file mode 100755
index 0000000..af6aaba
--- /dev/null
+++ b/build/ld.linux.gcc.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# define linker params
+LD_EXPORT_GLOBAL="-Wl,--export-dynamic"
+LD_MULTIPLE_DEFS="-Wl,-zmuldefs"
+LD_STATIC="-Wl,-Bstatic"
+LD_DYNAMIC="-Wl,-Bdynamic"
+LD_ALL_SYMBOLS="-Wl,-whole-archive"
+LD_REF_SYMBOLS="-Wl,-no-whole-archive"
+
+# build command
+DLIB_CMD="$LD -shared"
+EXE_CMD="$LD"
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+    DLIB_CMD="$DLIB_CMD -o $TARG"
+    EXE_CMD="$EXE_CMD -o $TARG"
+else
+    set-vers $(echo $VERS | tr '.' ' ')
+    DLIB_CMD="$DLIB_CMD -o $OUTDIR/$NAME$DBGAP.so.$VERS -Wl,-soname,$NAME.so.$MAJ"
+    EXE_CMD="$EXE_CMD -o $OUTDIR/$NAME$DBGAP.$VERS"
+fi
diff --git a/build/ld.linux.icc.sh b/build/ld.linux.icc.sh
new file mode 100755
index 0000000..0c1ae50
--- /dev/null
+++ b/build/ld.linux.icc.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# define linker params
+LD_EXPORT_GLOBAL="-Wa,--export-dynamic"
+LD_MULTIPLE_DEFS="-Wa,-zmuldefs"
+LD_STATIC="-Bstatic"
+LD_DYNAMIC="-Bdynamic"
+LD_ALL_SYMBOLS="-Wa,-whole-archive"
+LD_REF_SYMBOLS="-Wa,-no-whole-archive"
+
+# build command
+DLIB_CMD="$LD -shared"
+EXE_CMD="$LD"
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+    DLIB_CMD="$DLIB_CMD -o $TARG"
+    EXE_CMD="$EXE_CMD -o $TARG"
+else
+    set-vers $(echo $VERS | tr '.' ' ')
+    DLIB_CMD="$DLIB_CMD -o $OUTDIR/$NAME$DBGAP.so.$VERS -Wl,-soname,$NAME.so.$MAJ"
+    EXE_CMD="$EXE_CMD -o $OUTDIR/$NAME$DBGAP.$VERS"
+fi
diff --git a/build/ld.linux.ln.sh b/build/ld.linux.ln.sh
new file mode 100755
index 0000000..ee5bd9d
--- /dev/null
+++ b/build/ld.linux.ln.sh
@@ -0,0 +1,98 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+TYPE="$1"
+OUTDIR="$2"
+TARG="$3"
+NAME="$4"
+DBGAP="$5"
+EXT="$6"
+VERS="$7"
+
+# find target
+TARG=$(basename "$TARG")
+
+# put extension back onto name
+NAME="$NAME$DBGAP"
+STATIC_NAME="$NAME-static"
+if [ "$EXT" != "" ]
+then
+    NAME="$NAME.$EXT"
+    STATIC_NAME="$STATIC_NAME.$EXT"
+fi
+
+# break out version
+set-vers ()
+{
+    MAJ=$1
+    MIN=$2
+    REL=$3
+}
+
+set-vers $(echo $VERS | tr '.' ' ')
+
+cd "$OUTDIR" || exit 5
+
+# create link
+create-link ()
+{
+    rm -f "$2"
+    local CMD="ln -s $1 $2"
+    echo $CMD
+    $CMD
+}
+
+# test for version in target name
+if [ "$TARG" != "$NAME.$MAJ.$MIN.$REL" ]
+then
+
+    # for simple name, create 2 links
+    if [ "$TARG" = "$NAME" ]
+    then
+        create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ"
+        create-link "$NAME.$MAJ" "$NAME"
+
+        # for static libraries, create special link
+        if [ "$TYPE" = "slib" ]
+        then
+            create-link "$NAME" "$STATIC_NAME"
+        fi
+
+    # for name with major version in it
+    elif [ "$TARG" = "$NAME.$MAJ" ]
+    then
+        create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ"
+
+
+    # for name with major & minor version in it
+    elif [ "$TARG" = "$NAME.$MAJ.$MIN" ]
+    then
+        create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ.$MIN"
+    fi
+fi
diff --git a/build/ld.linux.slib.sh b/build/ld.linux.slib.sh
new file mode 100755
index 0000000..ab72ef8
--- /dev/null
+++ b/build/ld.linux.slib.sh
@@ -0,0 +1,146 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal or static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%slib.sh}cmn.sh"
+
+# initialize command
+CMD="ar -rc"
+
+# function to convert an archive into individual object files
+convert-static ()
+{
+    # list members
+    local path="$1"
+    local mbrs="$(ar -t $path)"
+
+    # unpack archive into temporary directory
+    mkdir -p ld-tmp
+    if ! cd ld-tmp
+    then
+        echo "$SELF_NAME: failed to cd to ld-tmp"
+        exit 5
+    fi
+    ar -x "$path"
+
+    # rename and add to source files list
+    local m=
+    for m in $mbrs
+    do
+        mv $m $LIBNAME-$m
+        CMD="$CMD ld-tmp/$LIBNAME-$m"
+    done
+
+    # return to prior location
+    cd - > /dev/null
+}
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+    CMD="$CMD $TARG"
+else
+    set-vers $(echo $VERS | tr '.' ' ')
+    CMD="$CMD $OUTDIR/$NAME$DBGAP.a.$VERS"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create this lib
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+    # tack on libraries, finding as we go
+    for LIB in $LIBS
+    do
+
+        # strip off switch
+        LIBNAME="${LIB#-[lsd]}"
+
+        # look at linkage
+        case "$LIB" in
+        -s*)
+
+            # force static load
+            find-lib $LIBNAME.a $LDIRS
+            if [ "$LIBPATH" != "" ]
+            then
+
+                # add it to dependencies
+                DEPS="$DEPS $LIBPATH"
+                SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                # convert to individual object files
+                convert-static "$LIBPATH" || exit $?
+
+            fi
+            ;;
+
+        esac
+
+    done
+fi
+
+# produce static library
+echo $CMD
+$CMD || exit $?
+
+# remove temporaries
+rm -rf ld-tmp
+
+# produce dependencies
+if [ "$DEPFILE" != "" ] && [ "$DEPS" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+if [ $CHECKSUM -eq 1 ]
+then
+    SCM_DIR="${BUILD_DIR%/*}/scm"
+    LOGFILE="$SCM_DIR/scm.log"
+    MSG=">>>>> scm: calling the collect script from ld.linux.slib.sh <<<<<<"
+    #echo "$MSG"
+    echo "$MSG" >> $LOGFILE
+
+    "$BUILD_DIR/scm-collect.sh" "$OBJS" "$SLIBS" | sort -u > "$TARG.md5"
+fi
diff --git a/build/ld.mac.clang.sh b/build/ld.mac.clang.sh
new file mode 100755
index 0000000..6982230
--- /dev/null
+++ b/build/ld.mac.clang.sh
@@ -0,0 +1,59 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# define linker params
+LD_EXPORT_GLOBAL="-Wl,-all_load"
+LD_MULTIPLE_DEFS=""
+LD_STATIC=""
+LD_DYNAMIC=""
+LD_ALL_SYMBOLS=""
+LD_REF_SYMBOLS=""
+
+# the Mac is set up for cross-compilation
+if [ "$ARCH" = "fat86" ] 
+then
+LD="$LD -Wl,-arch_multiple"
+DLIB_CMD="$LD -dynamiclib -Wl,-all_load $LDFLAGS"
+else
+LD="$LD -Wl,-arch,$ARCH"
+DLIB_CMD="$LD -dynamiclib $LDFLAGS"
+fi
+
+# build command
+EXE_CMD="$LD"
+
+# Mach install-name sans extension
+INSTNAME="@executable_path/../lib/$NAME$DBGAP"
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+    DLIB_CMD="$DLIB_CMD -o $TARG -install_name $INSTNAME.dylib"
+    EXE_CMD="$EXE_CMD -o $TARG"
+else
+    set-vers $(echo $VERS | tr '.' ' ')
+    DLIB_CMD="$DLIB_CMD -o $OUTDIR/$NAME$DBGAP.$VERS.dylib -install_name $INSTNAME.$VERS.dylib -compatibility_version $MAJ -current_version $VERS -flat_namespace -undefined suppress"
+    EXE_CMD="$EXE_CMD -o $OUTDIR/$NAME$DBGAP.$VERS"
+fi
diff --git a/build/ld.mac.cmn.sh b/build/ld.mac.cmn.sh
new file mode 100644
index 0000000..d3f20b1
--- /dev/null
+++ b/build/ld.mac.cmn.sh
@@ -0,0 +1,159 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+LD="$1"
+ARCH="$2"
+BUILD="$3"
+shift 3
+
+SRCDIR="$1"
+BINDIR="$2"
+OUTDIR="$3"
+TARG="$4"
+NAME="$5"
+DBGAP="$6"
+shift 6
+
+VERS="$1"
+VERSFILE="$2"
+DEPFILE="$3"
+shift 3
+
+MODE="$1"
+SCMFLAGS="$2"
+LDFLAGS="$3"
+shift 3
+
+LDIRS="$1"
+XDIRS="$2"
+shift 2
+
+OBJS="$1"
+LIBS="$2"
+
+# decode MODE
+STATIC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+DYLD=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+KPROC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+THREADS=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_M=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_XML=$(expr $MODE % 2)
+
+# decode SCMFLAGS
+CHECKSUM=$(expr $SCMFLAGS % 2)
+STATICSYSLIBS=$(expr $SCMFLAGS / 2)
+
+# return parameter for find-lib
+LIBPATH=''
+
+# initial command state
+CMD=''
+LD_STATIC_STATE=0
+LD_ALL_STATE=0
+
+# for breaking out version
+set-vers ()
+{
+    MAJ=$1
+    MIN=$2
+    REL=$3
+}
+
+# for locating libraries
+find-lib ()
+{
+    _lib="lib$1"
+    _dirs="$2"
+
+    LIBPATH=''
+
+    while [ "$_dirs" != "" ]
+    do
+        _dir="${_dirs%%:*}"
+
+        if [ "$_dir" != "" ]
+        then
+            if [ -e "$_dir/$_lib" ]
+            then
+                while [ -L "$_dir/$_lib" ]
+                do
+                    _lib=$(readlink -n "$_dir/$_lib")
+                done
+                LIBPATH="$_dir/$_lib"
+                break;
+            fi
+        fi
+
+        _dirs="${_dirs#$_dir}"
+        _dirs="${_dirs#:}"
+    done
+}
+
+# setting state
+load-static ()
+{
+    if [ $LD_STATIC_STATE -eq 0 ]
+    then
+        CMD="$CMD $LD_STATIC"
+        LD_STATIC_STATE=1
+    fi
+}
+
+load-dynamic ()
+{
+    if [ $LD_STATIC_STATE -eq 1 ]
+    then
+        CMD="$CMD $LD_DYNAMIC"
+        LD_STATIC_STATE=0
+    fi
+}
+
+load-all-symbols ()
+{
+    if [ $LD_ALL_STATE -eq 0 ]
+    then
+        CMD="$CMD $LD_ALL_SYMBOLS"
+        # the Mac linker doesn't support state
+        LD_ALL_STATE=0
+    fi
+}
+
+load-ref-symbols ()
+{
+    if [ $LD_ALL_STATE -eq 1 ]
+    then
+        CMD="$CMD $LD_REF_SYMBOLS"
+        LD_ALL_STATE=0
+    fi
+}
diff --git a/build/ld.mac.dlib.sh b/build/ld.mac.dlib.sh
new file mode 100755
index 0000000..d768682
--- /dev/null
+++ b/build/ld.mac.dlib.sh
@@ -0,0 +1,366 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : require shared
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%dlib.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+g*)
+    source "${0%dlib.sh}gcc.sh"
+    ;;
+c*)
+    source "${0%dlib.sh}clang.sh"
+    ;;
+ *)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+# DLIB_CMD was started in tool-specific source
+CMD="$DLIB_CMD"
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# function to convert an archive into individual object files
+convert-static ()
+{
+    if [ "$ARCH" = "fat86" ] 
+    then
+        CMD="$CMD $1"
+    else
+        # list members
+        local path="$1"
+        local mbrs="$(ar -t $path | grep -v '__.SYMDEF SORTED')"
+
+        # unpack archive into temporary directory
+        mkdir -p ld-tmp
+        if ! cd ld-tmp
+        then
+            echo "$SELF_NAME: failed to cd to ld-tmp"
+            exit 5
+        fi
+        ar -x "$path"
+
+        # rename and add to source files list
+        local m=
+        for m in $mbrs
+        do
+            mv $m $LIBNAME-$m
+            CMD="$CMD ld-tmp/$LIBNAME-$m"
+        done
+
+        # return to prior location
+        cd - > /dev/null
+    fi
+}
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+    # tack on paths
+    DIRS="$LDIRS:$XDIRS"
+    while [ "$DIRS" != "" ]
+    do
+        DIR="${DIRS%%:*}"
+        [ "$DIR" != "" ] && CMD="$CMD -L$DIR"
+        DIRS="${DIRS#$DIR}"
+        DIRS="${DIRS#:}"
+    done
+
+    # tack on libraries, finding as we go
+    for LIB in $LIBS
+    do
+
+        # strip off switch
+        LIBNAME="${LIB#-[lsd]}"
+
+        # look at linkage
+        case "$LIB" in
+        -ldl|-ddl)
+
+            # always load libdl as shared library
+            load-ref-symbols
+            load-dynamic
+            CMD="$CMD -ldl"
+            ;;
+
+        -l*)
+
+            # normal or dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $LIBNAME.dylib $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load normally
+                    load-ref-symbols
+                    load-dynamic
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # try static only
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $LIBNAME-static.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+
+                    # load static
+#                    load-static
+#                    load-all-symbols
+#                    CMD="$CMD -l$LIBNAME-static"
+                    convert-static "$LIBPATH" || exit $?
+
+                fi
+            fi
+
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $LIBNAME.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+
+                    # load static
+#                    load-static
+#                    load-all-symbols
+#                    CMD="$CMD -l$LIBNAME"
+                    convert-static "$LIBPATH" || exit $?
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                if [ $STATICSYSLIBS -eq 1 ]
+                then
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to static
+                        load-static
+                        load-all-symbols
+                        ;;
+
+                    *)
+                        # set load to dynamic
+                        load-ref-symbols
+                        load-dynamic
+                        ;;
+
+                    esac
+                else
+                    # set load to normal
+                    load-ref-symbols
+                    load-dynamic
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -s*)
+
+            # force static load
+            FOUND=0
+            find-lib $LIBNAME-static.a $LDIRS
+            if [ "$LIBPATH" != "" ]
+            then
+
+                # found it
+                FOUND=1
+
+                # add it to dependencies
+                DEPS="$DEPS $LIBPATH"
+
+                # load static
+#                load-static
+#                load-all-symbols
+#                CMD="$CMD -l$LIBNAME-static"
+                convert-static "$LIBPATH" || exit $?
+
+            fi
+
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $LIBNAME.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+
+                    # load static
+#                    load-static
+#                    load-all-symbols
+#                    CMD="$CMD -l$LIBNAME"
+                    convert-static "$LIBPATH" || exit $?
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                if [ $STATIC -eq 1 ] || [ $STATICSYSLIBS -eq 1 ]
+                then
+                    # set load to static
+                    load-static
+                    load-all-symbols
+                else
+
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to dynamic
+                        load-ref-symbols
+                        load-dynamic
+                        ;;
+
+                    *)
+                        # set load to static
+                        load-static
+                        load-all-symbols
+                        ;;
+                    esac
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -d*)
+
+            # only dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $LIBNAME.dylib $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load normally
+                    load-ref-symbols
+                    load-dynamic
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                # set load to normal
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        esac
+
+    done
+fi
+
+# put state back to normal
+load-ref-symbols
+load-dynamic
+
+# add in pthreads
+if [ $THREADS -ne 0 ]
+then
+    CMD="$CMD -lpthread"
+fi
+
+# add in xml
+if [ $HAVE_XML -ne 0 ]
+then
+    CMD="$CMD -lxml2 -liconv"
+fi
+
+# add in math library
+if [ $HAVE_M -ne 0 ]
+then
+    CMD="$CMD -lm"
+fi
+
+# produce shared library
+echo "$CMD"
+$CMD || exit $?
+
+# remove temporaries
+rm -rf ld-tmp
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/ld.mac.exe.sh b/build/ld.mac.exe.sh
new file mode 100755
index 0000000..6c6369f
--- /dev/null
+++ b/build/ld.mac.exe.sh
@@ -0,0 +1,340 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : ignore - will be dynamically loaded
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : require static
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%exe.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+g*)
+    source "${0%exe.sh}gcc.sh"
+    ;;
+c*)
+    source "${0%exe.sh}clang.sh"
+    ;;
+*)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+# EXE_CMD was started in tool-specific source
+CMD="$EXE_CMD $LDFLAGS"
+
+# if building a static executable against dynamic libraries
+# the main application will substitute for name lookup
+if [ $STATIC -eq 1 ] && [ $DYLD -eq 1 ]
+then
+    CMD="$CMD $LD_EXPORT_GLOBAL $LD_MULTIPLE_DEFS"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile $VERSFILE"
+if [ "$LIBS" != "" ]
+then
+    # tack on paths
+    DIRS="$LDIRS:$XDIRS"
+    while [ "$DIRS" != "" ]
+    do
+        DIR="${DIRS%%:*}"
+        [ "$DIR" != "" ] && CMD="$CMD -L$DIR"
+        DIRS="${DIRS#$DIR}"
+        DIRS="${DIRS#:}"
+    done
+
+    # tack on libraries, finding as we go
+    for LIB in $LIBS
+    do
+
+        # strip off switch
+        LIBNAME="${LIB#-[lsd]}"
+
+        # look at linkage
+        case "$LIB" in
+        -ldl|-ddl)
+
+            # always load libdl as shared library
+            load-ref-symbols
+            load-dynamic
+            CMD="$CMD -ldl"
+            ;;
+
+        -l*)
+
+            # normal or dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $LIBNAME.dylib $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load dynamic
+                    load-dynamic
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # try static only
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $LIBNAME-static.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+
+                    # load static
+                    load-static
+                    [ $STATIC -eq 1 ] && load-all-symbols
+                    CMD="$CMD -l$LIBNAME-static"
+
+                fi
+            fi
+
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $LIBNAME.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+
+                    # load static
+                    load-static
+                    [ $STATIC -eq 1 ] && load-all-symbols
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                # do not need to load all symbols for external libs
+                [ $STATIC -eq 1 ] && load-ref-symbols
+
+                if [ $STATICSYSLIBS -eq 1 ]
+                then
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to static
+                        load-static
+                        ;;
+
+                    *)
+                        # set load to dynamic
+                        load-dynamic
+                        ;;
+
+                    esac
+                else
+                    # set load to normal
+                    load-dynamic
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -s*)
+
+            # force static load
+            FOUND=0
+            find-lib $LIBNAME-static.a $LDIRS
+            if [ "$LIBPATH" != "" ]
+            then
+
+                # found it
+                FOUND=1
+
+                # add it to dependencies
+                DEPS="$DEPS $LIBPATH"
+
+                # load static
+                load-static
+                [ $STATIC -eq 1 ] && load-all-symbols
+                CMD="$CMD -l$LIBNAME-static"
+
+            fi
+
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $LIBNAME.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+
+                    # load static
+                    load-static
+                    [ $STATIC -eq 1 ] && load-all-symbols
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                # do not need to load all symbols for external libs
+                [ $STATIC -eq 1 ] && load-ref-symbols
+
+                if [ $STATIC -eq 1 ] || [ $STATICSYSLIBS -eq 1 ]
+                then
+
+                    # set load to static
+                    load-static
+
+                else
+
+                    # special case for libs we have in "ext"
+                    # that are sometimes requested as static
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to dynamic
+                        load-dynamic
+                        ;;
+                    *)
+                        load-static
+                        ;;
+                    esac
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -d*)
+
+            FOUND=0
+            if [ $STATIC -eq 1 ]
+            then
+                find-lib $LIBNAME.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+
+                    # load static
+                    load-static
+                    load-all-symbols
+
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+
+                # not found within our directories
+                if [ $FOUND -eq 0 ]
+                then
+                    load-static
+                    load-all-symbols
+
+                    CMD="$CMD -l$LIBNAME"
+                fi
+            fi
+            ;;
+
+
+        esac
+
+    done
+fi
+
+# return to normal
+load-ref-symbols
+load-dynamic
+
+# add in pthreads
+if [ $THREADS -ne 0 ]
+then
+    CMD="$CMD -lpthread"
+fi
+
+# add in xml
+if [ $HAVE_XML -ne 0 ]
+then
+    CMD="$CMD -lxml2 -liconv"
+fi
+
+# add in math library
+if [ $HAVE_M -ne 0 ]
+then
+    CMD="$CMD -lm"
+fi
+
+# produce shared library
+echo $CMD
+$CMD || exit $?
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
diff --git a/build/ld.mac.gcc.sh b/build/ld.mac.gcc.sh
new file mode 100755
index 0000000..b8d056f
--- /dev/null
+++ b/build/ld.mac.gcc.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# define linker params
+LD_EXPORT_GLOBAL="-Wl,-all_load"
+LD_MULTIPLE_DEFS=""
+LD_STATIC=""
+LD_DYNAMIC=""
+LD_ALL_SYMBOLS=""
+LD_REF_SYMBOLS=""
+
+# the Mac is set up for cross-compilation
+if [ "$ARCH" = "fat86" ] 
+then
+LD="$LD -Wl,-arch_multiple"
+else
+LD="$LD -Wl,-arch,$ARCH"
+fi
+
+# build command
+DLIB_CMD="$LD -dynamiclib"
+EXE_CMD="$LD"
+
+# Mach install-name sans extension
+INSTNAME="@executable_path/../lib/$NAME$DBGAP"
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+    DLIB_CMD="$DLIB_CMD -o $TARG -install_name $INSTNAME.dylib"
+    EXE_CMD="$EXE_CMD -o $TARG"
+else
+    set-vers $(echo $VERS | tr '.' ' ')
+    DLIB_CMD="$DLIB_CMD -o $OUTDIR/$NAME$DBGAP.$VERS.dylib -install_name $INSTNAME.$VERS.dylib -compatibility_version $MAJ -current_version $VERS -flat_namespace -undefined suppress"
+    EXE_CMD="$EXE_CMD -o $OUTDIR/$NAME$DBGAP.$VERS"
+fi
diff --git a/build/ld.mac.ln.sh b/build/ld.mac.ln.sh
new file mode 100755
index 0000000..55216fd
--- /dev/null
+++ b/build/ld.mac.ln.sh
@@ -0,0 +1,103 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+TYPE="$1"
+OUTDIR="$2"
+TARG="$3"
+NAME="$4"
+DBGAP="$5"
+EXT="$6"
+VERS="$7"
+
+# find target
+TARG=$(basename "$TARG")
+
+# put extension back onto name, unless it's "dylib"
+NAME="$NAME$DBGAP"
+STATIC_LIB_NAME="$NAME-static.a"
+[ "$EXT" != "" ] && [ "$EXT" != "dylib" ] && NAME="$NAME.$EXT"
+
+# break out version
+set-vers ()
+{
+    MAJ=$1
+    MIN=$2
+    REL=$3
+}
+
+set-vers $(echo $VERS | tr '.' ' ')
+
+cd "$OUTDIR" || exit 5
+
+# assemble versioned names
+NAME_MMR="$NAME.$MAJ.$MIN.$REL"
+NAME_MM="$NAME.$MAJ.$MIN"
+NAME_M="$NAME.$MAJ"
+
+# if extension was "dylib", NOW append to names
+if [ "$EXT" = "dylib" ]
+then
+    NAME_MMR="$NAME_MMR.$EXT"
+    NAME_MM="$NAME_MM.$EXT"
+    NAME_M="$NAME_M.$EXT"
+    NAME="$NAME.$EXT"
+fi
+
+# create link
+create-link ()
+{
+    rm -f "$2"
+    local CMD="ln -s $1 $2"
+    echo $CMD
+    $CMD
+}
+
+# test for version in target name
+if [ "$TARG" != "$NAME_MMR" ]
+then
+
+    # for simple name, create 2 links
+    if [ "$TARG" = "$NAME" ]
+    then
+        create-link "$NAME_MMR" "$NAME_M"
+        create-link "$NAME_M" "$NAME"
+        [ "$EXT" = "a" ] && create-link "$NAME" "$STATIC_LIB_NAME"
+
+    # for name with major version in it
+    elif [ "$TARG" = "$NAME_M" ]
+    then
+        create-link "$NAME_MMR" "$NAME_M"
+
+
+    # for name with major & minor version in it
+    elif [ "$TARG" = "$NAME_MM" ]
+    then
+        create-link "$NAME_MMR" "$NAME_MM"
+    fi
+fi
diff --git a/build/ld.mac.slib.sh b/build/ld.mac.slib.sh
new file mode 100755
index 0000000..98887fb
--- /dev/null
+++ b/build/ld.mac.slib.sh
@@ -0,0 +1,101 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal or static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%slib.sh}cmn.sh"
+
+# initialize command
+CMD="libtool -static -o "
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+    CMD="$CMD $TARG"
+else
+    set-vers $(echo $VERS | tr '.' ' ')
+    CMD="$CMD $OUTDIR/$NAME$DBGAP.a.$VERS"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+    # tack on libraries, finding as we go
+    for LIB in $LIBS
+    do
+
+        # strip off switch
+        LIBNAME="${LIB#-[lsd]}"
+
+        # look at linkage
+        case "$LIB" in
+        -s*)
+
+            # force static load
+            find-lib $LIBNAME.a $LDIRS
+            if [ "$LIBPATH" != "" ]
+            then
+
+                # add it to dependencies
+                DEPS="$DEPS $LIBPATH"
+                
+                # simply add the library to the link line - libtool handles static libraries correctly
+                CMD="$CMD $LIBPATH"
+            fi
+            ;;
+
+        esac
+
+    done
+fi
+
+# produce static library
+echo $CMD
+$CMD || exit $?
+
+# remove temporaries
+rm -rf ld-tmp
+
+# produce dependencies
+if [ "$DEPFILE" != "" ] && [ "$DEPS" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/ld.rwin.dlib.sh b/build/ld.rwin.dlib.sh
new file mode 100755
index 0000000..9dbaa4f
--- /dev/null
+++ b/build/ld.rwin.dlib.sh
@@ -0,0 +1,363 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+#echo "$0 $*"
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : require shared
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%rwin.dlib.sh}win.cmn.sh"
+
+# discover tool chain
+case "$LD" in
+link)
+    source "${0%dlib.sh}vc++.sh"
+    ;;
+ *)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+# DLIB_CMD was started in tool-specific source
+CMD="$DLIB_CMD $LDFLAGS OLE32.lib Ws2_32.lib Shell32.lib /FORCE"
+STATIC_CMD="$SLIB_CMD"
+
+# function to convert static libraries to individual COFF files
+convert-static ()
+{
+    # list members
+    local path="$1"
+    local mbrs="$(ar -t $path)"
+
+    # create sub directory
+    rm -rf "$2" && mkdir "$2"
+    if ! cd "$2"
+    then
+        echo "$SELF_NAME: failed to cd to $2"
+        exit 5
+    fi
+    ar -x "$path"
+
+    # add source files to link
+    local m=
+    for m in $mbrs
+    do
+        CMD="$CMD $2/$m"
+        STATIC_CMD="$STATIC_CMD $2/$m"
+    done
+
+    # return to prior location
+    cd - > /dev/null
+}
+
+# tack on object files
+CMD="$CMD $OBJS"
+STATIC_CMD="$STATIC_CMD $OBJS"
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile $DEF_FILE"
+if [ "$LIBS" != "" ]
+then
+    # tack on paths
+    DIRS="$LDIRS:$XDIRS"
+    while [ "$DIRS" != "" ]
+    do
+        DIR="${DIRS%%:*}"
+        CURDIR="$RHOME/${DIR#$LHOME}"
+        CURDIR="$(echo $CURDIR | tr '/' '\\')"        
+        [ "$CURDIR" != "" ] && CMD="$CMD /LIBPATH:$CURDIR"
+        DIRS="${DIRS#$DIR}"
+        DIRS="${DIRS#:}"
+    done
+
+    HAVE_KERNEL32=0
+    HAVE_CLIB=0
+    
+    # tack on libraries, finding as we go
+    for xLIB in $LIBS
+    do
+        # strip off switch
+        xLIBNAME="${xLIB#-[lsd]}"
+
+        # map xLIBNAME
+        case "$xLIBNAME" in
+        
+        # redirect libdl to link against Kernel32.lib in case of windows
+        dl)
+            if [ $HAVE_KERNEL32 -ne 1 ]
+            then
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD Kernel32.lib"
+                HAVE_KERNEL32=1
+            fi
+            continue
+            ;;
+
+        # redirect libm to link against libc.lib in case of windows
+        # omitting the lib defaults to linking against libc.lib
+        m)
+            if [ $HAVE_CLIB -ne 1 ]
+            then
+                load-ref-symbols
+                load-dynamic
+                HAVE_CLIB=1
+            fi
+            continue
+            ;;
+
+##### TEMPORARY #####
+# use ksproc for kproc
+#    kproc)
+#        xLIBNAME=ksproc
+#        ;;
+#####################
+
+        esac
+
+        # look at linkage
+        case "$xLIB" in
+        -l*)
+
+            # normal or dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $xLIBNAME.lib $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load normally
+                    load-ref-symbols
+                    load-dynamic
+                    CMD="$CMD lib$xLIBNAME.lib"
+
+                fi
+            fi
+
+            # try static only
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $xLIBNAME.a $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $xLIBPATH"
+
+                    # load static
+                    load-static
+                    load-all-symbols
+                    convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                # set load to normal
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD lib$xLIBNAME.lib"
+            fi
+            ;;
+
+        -s*)
+
+            # force static load
+            FOUND=0
+            find-lib $xLIBNAME.a $LDIRS
+            if [ "$xLIBPATH" != "" ]
+            then
+                # found it
+                FOUND=1
+
+                # add it to dependencies
+                DEPS="$DEPS $xLIBPATH"
+
+                # load static
+                load-static
+                load-all-symbols
+                convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                # set load to static
+                load-static
+                load-all-symbols
+                CMD="$CMD lib$xLIBNAME.lib"
+            fi
+            ;;
+
+        -d*)
+
+            # only dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $xLIBNAME.lib $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load normally
+                    load-ref-symbols
+                    load-dynamic
+                    CMD="$CMD lib$xLIBNAME.lib"
+
+                fi
+            fi
+
+            # try static if performing static build
+            # because we HAVE to link against something,
+            # and the dependency code is being statically
+            # linked into an executable...
+            if [ $FOUND -eq 0 ] && [ $STATIC -eq 1 ]
+            then
+                find-lib $xLIBNAME.a $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $xLIBPATH"
+
+                    # load static
+                    load-static
+                    load-all-symbols
+                    convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                # set load to normal
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD lib$xLIBNAME.lib"
+            fi
+            ;;
+
+        esac
+
+    done
+fi
+
+# put state back to normal
+load-ref-symbols
+load-dynamic
+
+# produce shared library, stub library and exp file
+# map to remote view
+CURDIR="$(pwd)"
+echo $CMD
+rm -f $TARG ${TARG%lib}def ${TARG%lib}pdb "$BINDIR/${TARG%lib}dll"
+
+# Windows linker crashes randomly on bigger files with rc=1000, so we will loop until it completes differently
+while [ 1 ]
+do
+    ${TOP}/build/run_remotely.sh $PROXY_TOOL $RHOST $RPORT $RHOME $LHOME $CURDIR $ROUTDIR $LOUTDIR $CMD >${TARG}.out
+    STATUS=$?
+    cat ${TARG}.out
+    if [ "$STATUS" != "0" ]
+    then 
+        grep "fatal error LNK1000" ${TARG}.out >/dev/null
+        if [ "$?" != "0" ] 
+        then 
+            rm -f "$TARG" "${TARG%lib}dll"
+            exit $STATUS
+        fi
+    else
+        rm -rf ${TARG}.out
+        break
+    fi
+    sleep 30s
+done    
+
+# wait for the result file to appear (there may be a network delay)
+${TOP}/build/wait_for_file.sh "${TARG%lib}dll"
+STATUS=$?
+if [ "$STATUS" = "1" ]
+then
+    echo "timed out, TARG='${TARG%lib}dll'"
+    exit $STATUS
+fi
+        
+# copy dll to binary directory, so they can be found by the executables
+# sometimes cp reports an input/output error; try until it succeeds
+while [ 1 ]
+do
+    cp "${TARG%lib}dll" "$BINDIR"
+    STATUS=$?
+    if [ "$STATUS" == "0" ]
+    then
+        break
+    fi
+    echo "waiting for ${TARG%lib}dll to become accessible"
+    ls -l "${TARG%lib}dll"
+    sleep 30s
+done
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+# produce static library using lib
+STATIC_CMD="${TOP}/build/run_remotely.sh $PROXY_TOOL $RHOST $RPORT $RHOME $LHOME $CURDIR $ROUTDIR $LOUTDIR $STATIC_CMD"
+echo "$STATIC_CMD"
+$STATIC_CMD || exit $?
+
diff --git a/build/ld.rwin.exe.sh b/build/ld.rwin.exe.sh
new file mode 100755
index 0000000..ce75f94
--- /dev/null
+++ b/build/ld.rwin.exe.sh
@@ -0,0 +1,366 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+if [ "$VERBOSE" != "" ] ; then echo "$0 $*"; fi
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : ignore - will be dynamically loaded
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : require static
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%rwin.exe.sh}win.cmn.sh"
+
+# discover tool chain
+case "$LD" in
+link)
+    source "${0%exe.sh}vc++.sh"
+    ;;
+*)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+#echo "EXE_CMD=${EXE_CMD}"
+
+# EXE_CMD was started in tool-specific source
+CMD="$EXE_CMD $LDFLAGS OLE32.lib Ws2_32.lib Shell32.lib"
+
+# if building a static executable against dynamic libraries
+# the main application will substitute for name lookup
+if [ $STATIC -eq 1 ] && [ $DYLD -eq 1 ]
+then
+    CMD="$CMD $LD_EXPORT_GLOBAL $LD_MULTIPLE_DEFS"
+fi
+
+# function to convert static libraries to individual COFF files
+convert-static ()
+{
+    # list members
+    local path="$1"
+    local mbrs="$(ar -t $path)"
+
+    # create sub directory
+    rm -rf "$2" && mkdir "$2"
+    if ! cd "$2"
+    then
+        echo "$SELF_NAME: failed to cd to $2"
+        exit 5
+    fi
+    ar -x "$path"
+
+    # add source files to link
+    local m=
+    for m in $mbrs
+    do
+        CMD="$CMD $2/$m"
+    done
+
+    # return to prior location
+    cd - > /dev/null
+}
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# initial dependency upon Makefile - no vers file on Windows
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+    # tack on paths
+    DIRS="$LDIRS:$XDIRS"
+
+    while [ "$DIRS" != "" ]
+    do
+        DIR="${DIRS%%:*}"
+        CURDIR="$RHOME/${DIR#$LHOME}"
+        CURDIR="$(echo $CURDIR | tr '/' '\\')"        
+        [ "$CURDIR" != "" ] && CMD="$CMD /LIBPATH:$CURDIR"        
+        DIRS="${DIRS#$DIR}"
+        DIRS="${DIRS#:}"
+    done
+    
+    HAVE_KERNEL32=0
+    HAVE_WS2=1
+    HAVE_CLIB=0
+
+    # tack on libraries, finding as we go
+    for xLIB in $LIBS
+    do
+
+        # strip off switch
+        xLIBNAME="${xLIB#-[lsd]}"
+
+        # map xLIBNAME
+        case "$xLIBNAME" in
+        dl)
+            if [ $HAVE_KERNEL32 -ne 1 ]
+            then
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD Kernel32.lib"
+                HAVE_KERNEL32=1
+            fi
+            continue
+            ;;
+
+        ws2)
+            if [ $HAVE_WS2 -ne 1 ]
+            then
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD ws2_32.lib"
+                HAVE_WS2=1
+            fi
+            continue
+            ;;
+
+        # redirect libm to link against libc.lib in case of windows
+        # omitting the lib defaults to linking against libc.lib
+        m)
+            if [ $HAVE_CLIB -ne 1 ]
+            then
+                load-ref-symbols
+                load-dynamic
+                HAVE_CLIB=1
+            fi
+            continue
+            ;;
+
+##### TEMPORARY #####
+# use ksproc for kproc
+#    kproc)
+#        xLIBNAME=ksproc
+#        ;;
+#####################
+        esac
+
+        # look at linkage
+        case "$xLIB" in
+        -l*)
+
+            # normal or dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $xLIBNAME.lib $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load dynamic
+                    load-dynamic
+                    CMD="$CMD lib$xLIBNAME.lib"
+
+                fi
+            fi
+
+            # try static only
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $xLIBNAME.a $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $xLIBPATH"
+
+                    # load static
+                    load-static
+                    [ $STATIC -eq 1 ] && load-all-symbols
+                    convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                [ $STATIC -eq 1 ] && load-ref-symbols
+                load-dynamic
+                CMD="$CMD lib$xLIBNAME.lib"
+            fi
+            ;;
+
+        -s*)
+
+            # force static load
+            FOUND=0
+            find-lib $xLIBNAME.a $LDIRS
+            if [ "$xLIBPATH" != "" ]
+            then
+
+                # found it
+                FOUND=1
+
+                # add it to dependencies
+                DEPS="$DEPS $xLIBPATH"
+
+                # load static
+                load-static
+                [ $STATIC -eq 1 ] && load-all-symbols
+                convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                # set load to static
+                load-static
+                [ $STATIC -eq 1 ] && load-all-symbols
+                CMD="$CMD lib$xLIBNAME.lib"
+            fi
+            ;;
+
+        -d*)
+
+            FOUND=0
+            if [ $STATIC -eq 1 ]
+            then
+                find-lib $xLIBNAME.a $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $xLIBPATH"
+
+                    # load static
+                    load-static
+                    load-all-symbols
+                    convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+                fi
+
+                # not found within our directories
+                if [ $FOUND -eq 0 ]
+                then
+                    load-static
+                    load-all-symbols
+
+                    CMD="$CMD lib$xLIBNAME"
+                fi
+            fi
+            ;;
+
+
+        esac
+
+    done
+fi
+
+# return to normal
+load-ref-symbols
+load-dynamic
+
+# determine current directory
+CURDIR="$(pwd)"
+
+# produce executable
+rm -f ${TARG%exe}*
+
+echo $CMD
+
+# Windows linker crashes randomly on bigger files with rc=1000, so we will loop until it completes differently
+while [ 1 ]
+do
+    ${TOP}/build/run_remotely.sh $PROXY_TOOL $RHOST $RPORT $RHOME $LHOME $CURDIR $ROUTDIR $LOUTDIR $CMD >${TARG}.out
+    STATUS=$?
+    cat ${TARG}.out
+    if [ "$STATUS" != "0" ]
+    then 
+        grep "fatal error LNK1000" ${TARG}.out >/dev/null
+        if [ "$?" != "0" ] 
+        then 
+            exit $STATUS
+        fi
+    else
+        rm ${TARG}.out
+        break
+    fi
+    sleep 30s
+done    
+
+# wait for the result file to appear (there may be a network delay)
+${TOP}/build/wait_for_file.sh ${TARG}.exe
+STATUS=$?
+if [ "$STATUS" = "1" ]
+then
+    echo "timed out, TARG='$TARG'"
+    exit $STATUS
+fi
+
+# create a link without .exe which represents make's target
+test -e ${TARG} || ln -s ${TARG}.exe ${TARG}
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+# cleanup temporary files
+rm -f $TARG.lib $TARG.exp
+
+
+# wait for the result file to appear (there may be a network delay)
+${TOP}/build/wait_for_file.sh ${TARG}.exe
+STATUS=$?
+if [ "$STATUS" = "1" ]
+then
+    echo "timed out, TARG='$TARG'"
+    exit $STATUS
+fi
+
+# create a link without .exe which represents make's target
+test -e ${TARG} || ln -s ${TARG}.exe ${TARG}
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+# cleanup temporary files
+rm -f $TARG.lib $TARG.exp
diff --git a/build/ld.rwin.slib.sh b/build/ld.rwin.slib.sh
new file mode 100755
index 0000000..00b0949
--- /dev/null
+++ b/build/ld.rwin.slib.sh
@@ -0,0 +1,123 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+VERBOSE=
+if [ "$VERBOSE" != "" ] ; then echo "$0 $*"; fi
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal or static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%rwin.slib.sh}win.cmn.sh"
+
+# initialize command
+CMD="ar -rc"
+
+# function to convert an archive into individual object files
+convert-static ()
+{
+    # list members
+    local path="$1"
+    local mbrs="$(ar -t $path)"
+
+    # unpack archive into temporary directory
+    mkdir -p ld-tmp
+    if ! cd ld-tmp
+    then
+        echo "$SELF_NAME: failed to cd to ld-tmp"
+        exit 5
+    fi
+    ar -x "$path"
+
+    # rename and add to source files list
+    local m=
+    for m in $mbrs
+    do
+        mv $m $xLIBNAME-$m
+        CMD="$CMD ld-tmp/$xLIBNAME-$m"
+    done
+
+    # return to prior location
+    cd - > /dev/null
+}
+
+CMD="$CMD $TARG $OBJS"
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+    # tack on libraries, finding as we go
+    for xLIB in $LIBS
+    do
+        # strip off switch
+        xLIBNAME="${xLIB#-[lsd]}"
+
+        # look at linkage
+        case "$xLIB" in
+        -s*)
+
+            # force static load
+            find-lib $xLIBNAME.a $LDIRS # .a for static, .lib for dynamic?
+            if [ "$xLIBPATH" != "" ]
+            then
+
+                # add it to dependencies
+                DEPS="$DEPS $xLIBPATH"
+
+                # convert to individual object files
+                convert-static "$xLIBPATH" || exit $?
+
+            fi
+            ;;
+
+        esac
+    done
+fi
+
+# produce static library
+rm -f $TARG
+echo $CMD
+
+$CMD || exit $?
+
+# remove temporaries
+rm -rf ld-tmp
+
+# produce dependencies
+if [ "$DEPFILE" != "" ] && [ "$DEPS" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+exit $STATUS
diff --git a/build/ld.rwin.stub.sh b/build/ld.rwin.stub.sh
new file mode 100755
index 0000000..4c4c394
--- /dev/null
+++ b/build/ld.rwin.stub.sh
@@ -0,0 +1,59 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+#echo "$0 $*"
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : require shared
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%rwin.stub.sh}win.cmn.sh"
+
+# discover tool chain
+case "$LD" in
+link)
+    source "${0%stub.sh}vc++.sh"
+    ;;
+ *)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+# produce stub library and exp file
+echo $STUB_CMD
+$STUB_CMD
diff --git a/build/ld.rwin.vc++.sh b/build/ld.rwin.vc++.sh
new file mode 100755
index 0000000..9322d4d
--- /dev/null
+++ b/build/ld.rwin.vc++.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# define linker params
+LD_EXPORT_GLOBAL=""
+LD_MULTIPLE_DEFS="/FORCE:MULTIPLE"
+LD_STATIC=""
+LD_DYNAMIC=""
+LD_ALL_SYMBOLS="/OPT:NOREF"
+LD_REF_SYMBOLS="/OPT:REF"
+
+# the def file
+unset DEF_SWITCH
+
+DEF_FILE="$SRCDIR/$NAME-$BUILD.def"
+[ ! -f "$DEF_FILE" ] && DEF_FILE="$SRCDIR/$NAME.def"
+if [ -f "$DEF_FILE" ]
+then
+    DEF_FILE_LOCAL="$RHOME/${DEF_FILE#$LHOME}"
+    DEF_FILE_LOCAL="$(echo $DEF_FILE_LOCAL | tr '/' '\\')"
+    DEF_SWITCH="/DEF:$DEF_FILE_LOCAL"
+else
+    unset DEF_FILE
+fi
+
+# the full path to target sans extension
+#echo "TARG=$TARG; LOUTDIR=$LOUTDIR; ROUTDIR=$ROUTDIR"
+WINTARG="$ROUTDIR${TARG#$LOUTDIR}"
+WINTARG="$(echo $WINTARG | tr '/' '\\')"
+WINTARG="${WINTARG%.lib}"
+
+# build command
+STUB_CMD="lib /NOLOGO /MACHINE:x86 $DEF_SWITCH /OUT:$WINTARG.lib"
+SLIB_CMD="lib /NOLOGO /OUT:$WINTARG-static.lib"
+DLIB_CMD="$LD /NOLOGO /DLL $DEF_SWITCH /OUT:$WINTARG.dll /STACK:8000000 /HEAP:1000000000  /INCREMENTAL:NO"
+EXE_CMD="$LD /NOLOGO /OUT:$WINTARG.exe /SUBSYSTEM:CONSOLE /ENTRY:wmainCRTStartup /STACK:8000000 /HEAP:100000000 /INCREMENTAL:NO"
+
+# tack on PDB tracking
+if [ "$BUILD" = "dbg" ]
+then
+    DLIB_CMD="$DLIB_CMD /DEBUG /PDB:$WINTARG.pdb"
+    EXE_CMD="$EXE_CMD /DEBUG /PDB:$WINTARG.pdb"
+fi
diff --git a/build/ld.sh b/build/ld.sh
new file mode 100755
index 0000000..1293a0e
--- /dev/null
+++ b/build/ld.sh
@@ -0,0 +1,593 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# prepare script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+TOP="$(dirname $BUILD_DIR)"
+SCRIPT_BASE="${0%.sh}"
+
+# os
+OS="$1"
+shift
+
+# architecture
+ARCH="$1"
+shift
+
+# binary loader tool
+LD="$1"
+shift
+
+# configuration
+unset SHLX
+unset DYLX
+unset LIBX
+unset OBJX
+unset LOBX
+
+# parameters
+TYPE=exe
+STATIC=0
+DYLD=0
+STATICSYSLIBS=0
+CHECKSUM=0
+KPROC=4
+THREADS=0
+HAVE_KSPROC=0
+NEED_KPROC=1
+HAVE_GZIP=0
+NEED_GZIP=1
+HAVE_BZIP=0
+NEED_BZIP=1
+HAVE_DL=0
+NEED_DL=1
+HAVE_M=0
+NEED_M=1
+HAVE_XML=0
+NEED_XML=0
+HAVE_KFC=0
+HAVE_KAPP=0
+HAVE_NCBI_VDB=0
+HAVE_NCBI_WVDB=0
+unset BUILD
+unset LDIRS
+unset XDIRS
+unset SRCDIR
+unset BINDIR
+unset VERSFILE
+unset VERSDIR
+unset TARG
+unset EXT
+unset OBJS
+unset LIBS
+unset DEPFILE
+
+# paths for translating local to remote
+unset RHOME
+unset LHOME
+unset RHOST
+unset LOUTDIR
+unset ROUTDIR
+unset PROXY_TOOL
+
+while [ $# -ne 0 ]
+do
+
+    case "$1" in
+    --build)
+        BUILD="$2"
+        shift
+        ;;
+
+    --ldflags)
+        LDFLAGS="$2"
+        shift
+        ;;
+
+    --static-system-libs)
+        STATICSYSLIBS=1
+        ;;
+
+    --checksum)
+        CHECKSUM=1
+        ;;
+
+    --shlx)
+        SHLX="$2"
+        shift
+        ;;
+
+    --dylx)
+        SHLX="$2"
+        shift
+        ;;
+
+    --libx)
+        LIBX="$2"
+        shift
+        ;;
+
+    --objx)
+        OBJX="$2"
+        shift
+        ;;
+
+    --srcdir)
+        SRCDIR="$2"
+        shift
+        ;;
+
+    --bindir)
+        BINDIR="$2"
+        shift
+        ;;
+        
+    --rhome)
+        RHOME="$2"
+        shift
+        ;;
+
+    --lhome)
+        LHOME="$2"
+        shift
+        ;;
+
+    --loutdir)
+        LOUTDIR="$2"
+        shift
+        ;;
+
+    --routdir)
+        ROUTDIR="$2"
+        shift
+        ;;
+
+    --rhost)
+        RHOST="$2"
+        shift
+        ;;
+
+    --rport)
+        RPORT="$2"
+        shift
+        ;;
+
+    --proxy_tool)
+        PROXY_TOOL="$2"
+        shift
+        ;;
+
+    -MD)
+        DEPFILE=1
+        ;;
+
+    -L*)
+        ARG="${1#-L}"
+        if [ "$ARG" = "" ]
+        then
+            ARG="$2"
+            shift
+        fi
+        LDIRS="$LDIRS:$ARG"
+        ;;
+        
+    -X*)
+        ARG="${1#-X}"
+        if [ "$ARG" = "" ]
+        then
+            ARG="$2"
+            shift
+        fi
+        XDIRS="$XDIRS:$ARG"
+        ;;
+
+    --dlib)
+        TYPE=dlib
+        ;;
+
+    --slib)
+        TYPE=slib
+        ;;
+
+    --stub)
+        TYPE=stub
+        ;;
+
+    --exe)
+        TYPE=exe
+        ;;
+
+    --static)
+        STATIC=1
+        ;;
+
+    --vers)
+        if [ -f "$2" ]
+        then
+            VERSFILE="$2"
+        elif [ -d "$2" ]
+        then
+            VERSDIR="$2"
+        else
+            echo "$SELF_NAME: expected version file or source directory"
+            exit 3
+        fi
+        shift
+        ;;
+
+    -o*)
+        ARG="${1#-o}"
+        if [ "$ARG" = "" ]
+        then
+            ARG="$2"
+            shift
+        fi
+        TARG="$ARG"
+        ;;
+
+    -lz|-sz|-dz)
+        LIBS="$LIBS $1"
+        HAVE_GZIP=1
+        ;;
+    -[lds]bz2)
+        LIBS="$LIBS $1"
+        HAVE_BZIP=1
+        ;;
+    -[lds]dl)
+        LIBS="$LIBS $1"
+        HAVE_DL=1
+        ;;
+
+    -[lds]xml2)
+        HAVE_XML=32
+        ;;
+
+    -[lds]m)
+        HAVE_M=16
+        ;;
+
+    -lsradb|-ssradb|-dsradb|-lwsradb|-swsradb)
+        LIBS="$LIBS $1"
+        NEED_DL=1
+        DYLD=2
+        ;;
+
+    -lkrypto|-dkrypto)
+        LIBS="$LIBS $1"
+        NEED_KPROC=1
+        ;;
+    -skrypto)
+        LIBS="$LIBS $1"
+        NEED_KPROC=1
+        ;;
+
+    -[ld]kproc)
+        KPROC=4
+        LIBS="$LIBS $1"
+        ;;
+    -skproc)
+        KPROC=4
+        THREADS=8
+        LIBS="$LIBS $1"
+        ;;
+
+    -[lds]ncbi-vdb)
+        HAVE_NCBI_VDB=1
+        KPROC=4
+        HAVE_GZIP=1
+        HAVE_BZIP=1
+        HAVE_KFC=1
+        NEED_M=1
+        NEED_XML=1
+        LIBS="$LIBS $1"
+        ;;
+    -[lds]ncbi-ngs-c++)
+        HAVE_NCBI_VDB=1
+        KPROC=4
+        HAVE_GZIP=1
+        HAVE_BZIP=1
+        HAVE_KFC=1
+        NEED_M=1
+        NEED_XML=1
+        LIBS="$LIBS $1"
+        ;;
+    -[lds]ncbi-wvdb)
+        HAVE_NCBI_WVDB=1
+        KPROC=4
+        HAVE_GZIP=1
+        HAVE_BZIP=1
+        HAVE_KFC=1
+        NEED_M=16
+        NEED_XML=1
+        LIBS="$LIBS $1"
+        ;;
+
+    -[lds]ksproc)
+        HAVE_KSPROC=1
+        LIBS="$LIBS $1"
+        THREADS=0
+        ;;
+
+    -[lds]pthread)
+        THREADS=8
+        ;;
+
+    -[ls]kfs)
+        LIBS="$LIBS $1"
+        NEED_GZIP=1
+        NEED_BZIP=1
+        NEED_DL=1
+        ;;
+    -dkfs)
+        LIBS="$LIBS $1"
+        NEED_GZIP=1
+        NEED_BZIP=1
+        NEED_DL=1
+        DYLD=2
+        ;;
+
+    -[ls]vfs)
+        LIBS="$LIBS $1"
+        ;;
+    -dvfs)
+        LIBS="$LIBS $1"
+        DYLD=2
+        ;;
+
+    -[ls]kxml)
+        LIBS="$LIBS $1"
+        NEED_XML=1
+        ;;
+    -dkxml)
+        LIBS="$LIBS $1"
+        NEED_XML=1
+        DYLD=2
+        ;;
+
+    -[lds]ncbi-bam)
+        LIBS="$LIBS $1"
+        #NEED_GZIP=1
+        ;;
+
+    -[lds]kapp)
+        HAVE_KAPP=1
+        ;;
+
+    -[lds]kapp-norsrc)
+        HAVE_KAPP=1
+        ;;
+
+    -[lds]kfc)
+        LIBS="$LIBS $1"
+        HAVE_KFC=1
+        ;;
+
+    -[ls]*)
+        LIBS="$LIBS $1"
+        ;;
+
+    -d*)
+        LIBS="$LIBS $1"
+        DYLD=2
+        ;;
+
+    *.$OBJX)
+        OBJS="$OBJS $1"
+        ;;
+        
+    esac
+
+    shift
+done
+
+# correct for prefixes
+LDIRS="${LDIRS#:}"
+XDIRS="${XDIRS#:}"
+LIBS="${LIBS# }"
+OBJS="${OBJS# }"
+
+# split target
+OUTDIR=$(dirname "$TARG")
+NAME=$(basename "$TARG")
+
+# dependency file
+[ "$DEPFILE" != "" ] && DEPFILE="$NAME.$TYPE.d"
+
+# parse target
+if [ "$TYPE" = "dlib" ] && [ "$DYLX" != "" ]
+then
+    EXT="$DYLX"
+    NAME="${NAME%.$DYLX}"
+fi
+
+unset VERS
+
+V="${NAME#${NAME%\.[^.]*}\.}"
+if [[ $V == ${V//[^0-9]/} ]]
+then
+    ARG="${NAME%\.$V}"
+    VERS="$V"
+    NAME="${ARG#.}"
+
+	V="${NAME#${NAME%\.[^.]*}\.}"
+	if [[ $V == ${V//[^0-9]/} ]]
+    then
+	    ARG="${NAME%\.$V}"
+    	VERS="$V.$VERS"
+	    NAME="${ARG#.}"
+
+		V="${NAME#${NAME%\.[^.]*}\.}"
+		if [[ $V == ${V//[^0-9]/} ]]
+        then
+		    ARG="${NAME%\.$V}"
+	    	VERS="$V.$VERS"
+		    NAME="${ARG#.}"
+        fi
+    fi
+	#echo "ARG=$ARG,VERS=$VERS,NAME=$NAME"
+fi
+
+case "$TYPE" in
+dlib)
+    if [ "$SHLX" != "" ]
+    then
+        EXT="$SHLX"
+        NAME="${NAME%.$SHLX}"
+    fi
+    ;;
+slib)
+    EXT="$LIBX"
+    NAME="${NAME%.$LIBX}"
+esac
+
+unset DBGAP
+if [ "$NAME" != "${NAME%-dbgap}" ]
+then
+	DBGAP=-dbgap
+	NAME="${NAME%-dbgap}"
+fi
+
+# locate version file and version
+[ "$VERSDIR" != "" ] && VERSFILE="$VERSDIR/$NAME.vers"
+if [ "$VERSFILE" != "" ]
+then
+    if [ ! -f "$VERSFILE" ]
+    then
+        echo "$SELF_NAME: warning - creating version file '$VERSFILE'"
+        echo 1.0.0 > $VERSFILE
+    fi
+
+    if [ ! -r "$VERSFILE" ]
+    then
+        echo "$SELF_NAME: version file '$VERSFILE' is unreadable"
+        exit 5
+    fi
+
+    ARG=$(cat $VERSFILE)
+    if [ "$VERS" != "" ] && [ "$VERS" != "$ARG" ] && [ "$ARG" = "${ARG#$VERS.}" ]
+    then
+        echo "$SELF_NAME: version from file '$VERSFILE' ($ARG) does not match '$VERS'"
+        exit 5
+    fi
+    VERS="$ARG"
+fi
+
+# fix kapp
+[ $HAVE_KAPP -ne 0 ] && [ $HAVE_KFC -ne 0 ] && LIBS="-lkapp $LIBS"
+[ $HAVE_KAPP -ne 0 ] && [ $HAVE_KFC -eq 0 ] && LIBS="-lkapp-norsrc $LIBS"
+
+# detect need for kproc
+if [ $KPROC -eq 0 ] && [ $NEED_KPROC -ne 0 ] && [ $HAVE_KSPROC -eq 0 ]
+then
+    KPROC=4
+    LIBS="$LIBS -lkproc"
+fi
+
+# turn on threads for kproc
+[ $KPROC -ne 0 ] && THREADS=8
+
+# supply missing libraries
+[ $HAVE_GZIP -eq 0 ] && [ $NEED_GZIP -ne 0 ] && LIBS="$LIBS -lz"
+[ $HAVE_BZIP -eq 0 ] && [ $NEED_BZIP -ne 0 ] && LIBS="$LIBS -lbz2"
+[ $HAVE_DL -eq 0 ] && [ $NEED_DL -ne 0 ] && LIBS="$LIBS -ldl"
+[ $HAVE_M -eq 0 ] && [ $NEED_M -ne 0 ] && HAVE_M=16
+[ $HAVE_XML -eq 0 ] && [ $NEED_XML -ne 0 ] && HAVE_XML=32
+
+# overwrite dependencies
+[ -f "$DEPFILE" ] && rm -f "$DEPFILE"
+
+# generate mode
+MODE=$(expr $HAVE_XML + $HAVE_M + $THREADS + $KPROC + $DYLD + $STATIC)
+#MODE=$(expr $THREADS + $KPROC + $DYLD + 1)
+
+# generate SCM flags
+SCMFLAGS=$(expr $STATICSYSLIBS + $STATICSYSLIBS + $CHECKSUM)
+if [ 0 -ne 0 ]
+then
+    echo "# $SELF_NAME"
+    echo "#   script-base    : $SCRIPT_BASE"
+    echo "#   OS             : $OS"
+    echo "#   type           : $TYPE"
+    echo "#   tool           : $LD"
+    echo "#   ARCH           : $ARCH"
+    echo "#   BUILD          : $BUILD"
+    echo "#   srcdir         : $SRCDIR"
+    echo "#   bindir         : $BINDIR"
+    echo "#   outdir         : $OUTDIR"
+    echo "#   target         : $TARG"
+    echo "#   name           : $NAME"
+    echo "#   dbgap          : $DBGAP"
+    echo "#   version        : $VERS"
+    echo "#   vers file      : $VERSFILE"
+    echo "#   dep file       : $DEPFILE"
+    echo "#   mode           : $MODE"
+    echo "#   DYLD           : $DYLD"
+    echo "#   SCMFLAGS       : $SCMFLAGS"
+    echo "#   LDFLAGS        : $LDFLAGS"
+    echo "#   LDIRS          : $LDIRS"
+    echo "#   XDIRS          : $XDIRS"
+    echo "#   objects        : $OBJS"
+    echo "#   libraries      : $LIBS"
+    echo "#   rhost          : $RHOST"
+    echo "#   rport          : $RPORT"
+    echo "#   rhome          : $RHOME"
+    echo "#   lhome          : $LHOME"
+    echo "#   proxy_tool     : $PROXY_TOOL"
+
+    echo "#   static sys libs: $STATICSYSLIBS"
+    echo "#   checksum       : $CHECKSUM"
+    echo "#   static         : $STATIC"
+    echo "#   kproc          : $KPROC"
+    echo "#   thread libs    : $THREADS"
+    echo "#   vers dir       : $VERSDIR"
+    echo "#   extension      : $EXT"
+fi
+
+# perform link
+"$SCRIPT_BASE.$OS.$TYPE.sh" "$LD" "$ARCH" "$BUILD" "$SRCDIR" "$BINDIR" "$OUTDIR" \
+    "$TARG" "$NAME" "$DBGAP" "$VERS" "$VERSFILE" "$DEPFILE" "$MODE" "$SCMFLAGS" \
+    "$LDFLAGS" "$LDIRS" "$XDIRS" "$OBJS" "$LIBS" "$PROXY_TOOL" "$RHOST" "$RPORT" "$RHOME" "$LHOME" "$(pwd)" "$ROUTDIR" "$LOUTDIR"  || exit $?
+
+# establish links
+if [ "$VERS" != "" ] && [ "$OS" != "win" ] && [ "$OS" != "rwin" ]
+then
+    $SCRIPT_BASE.$OS.ln.sh "$TYPE" "$OUTDIR" "$TARG" "$NAME" "$DBGAP" "$EXT" "$VERS"
+fi
+
+# SCM
+if [ $CHECKSUM -eq 1 ] && [ "$OS" = "linux" ]
+then
+    # calling the scm-version-script
+    # parameters are: module-name, current-md5-file, version-file
+    if [ $TYPE = "dlib" ] || [ $TYPE = "exe" ] || [ $STATIC -eq 1 ]
+    then
+        SCM_DIR="$TOP/scm"
+        LOGFILE="$SCM_DIR/scm.log"
+        SCMD="$BUILD_DIR/scm.sh $NAME $TARG.md5 $VERSFILE"
+        echo "$SCMD" >> $LOGFILE
+        $SCMD
+    fi
+fi
diff --git a/build/ld.sun.cc.sh b/build/ld.sun.cc.sh
new file mode 100644
index 0000000..af8a380
--- /dev/null
+++ b/build/ld.sun.cc.sh
@@ -0,0 +1,56 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# define linker params
+LD_EXPORT_GLOBAL=
+LD_MULTIPLE_DEFS="-Wl,-zmuldefs"
+LD_STATIC="-Wl,-Bstatic"
+LD_DYNAMIC="-Wl,-Bdynamic"
+LD_ALL_SYMBOLS="-Wl,--whole-archive"
+LD_REF_SYMBOLS="-Wl,--no-whole-archive"
+
+# build command
+case "$ARCH" in
+    sparc32|i386)
+        DLIB_CMD="$LD -Xlinker -32 -shared"
+        EXE_CMD="$LD -Xlinker -32"
+        ;;
+    sparc64|x86_64)
+        DLIB_CMD="$LD -Xlinker -64 -shared"
+        EXE_CMD="$LD -Xlinker -64"
+        ;;
+esac
+
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+    DLIB_CMD="$DLIB_CMD -o $TARG"
+    EXE_CMD="$EXE_CMD -o $TARG"
+else
+    set-vers $(echo $VERS | tr '.' ' ')
+    DLIB_CMD="$DLIB_CMD -o $OUTDIR/$NAME$DBGAP.so.$VERS -Wl,-soname,$NAME.so.$MAJ"
+    EXE_CMD="$EXE_CMD -o $OUTDIR/$NAME$DBGAP.$VERS"
+fi
diff --git a/build/ld.sun.cmn.sh b/build/ld.sun.cmn.sh
new file mode 100755
index 0000000..c6c5da6
--- /dev/null
+++ b/build/ld.sun.cmn.sh
@@ -0,0 +1,160 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+LD="$1"
+ARCH="$2"
+BUILD="$3"
+shift 3
+
+SRCDIR="$1"
+BINDIR="$2"
+OUTDIR="$3"
+TARG="$4"
+NAME="$5"
+DBGAP="$6"
+shift 6
+
+VERS="$1"
+VERSFILE="$2"
+DEPFILE="$3"
+shift 3
+
+MODE="$1"
+SCMFLAGS="$2"
+LDFLAGS="$3"
+shift 3
+
+LDIRS="$1"
+XDIRS="$2"
+shift 2
+
+OBJS="$1"
+LIBS="$2"
+
+# decode MODE
+STATIC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+DYLD=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+KPROC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+THREADS=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_M=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_XML=$(expr $MODE % 2)
+
+# decode SCMFLAGS
+CHECKSUM=$(expr $SCMFLAGS % 2)
+STATICSYSLIBS=$(expr $SCMFLAGS / 2)
+
+# return parameter for find-lib
+LIBPATH=''
+
+# initial command state
+CMD=''
+LD_STATIC_STATE=0
+LD_ALL_STATE=0
+
+# for breaking out version
+set-vers ()
+{
+    MAJ=$1
+    MIN=$2
+    REL=$3
+}
+
+# for locating libraries
+find-lib ()
+{
+    _lib="lib$1"
+    _dirs="$2"
+
+    LIBPATH=''
+
+    while [ "$_dirs" != "" ]
+    do
+        _dir="${_dirs%%:*}"
+
+        if [ "$_dir" != "" ]
+        then
+            if [ -e "$_dir/$_lib" ]
+            then
+                while [ -L "$_dir/$_lib" ]
+                do
+                    # no readlink on Sun
+                    #_lib=$(readlink -n "$_dir/$_lib") 
+                    cd $_dir && _dir="$(pwd -P)"; test -L _lib || _lib=$(ls -l $_lib | sed 's/.*->\ //g'); cd $OLDPWD
+                done
+                LIBPATH="$_dir/$_lib"
+                break;
+            fi
+        fi
+
+        _dirs="${_dirs#$_dir}"
+        _dirs="${_dirs#:}"
+    done
+}
+
+# setting state
+load-static ()
+{
+    if [ $LD_STATIC_STATE -eq 0 ]
+    then
+        CMD="$CMD $LD_STATIC"
+        LD_STATIC_STATE=1
+    fi
+}
+
+load-dynamic ()
+{
+    if [ $LD_STATIC_STATE -eq 1 ]
+    then
+        CMD="$CMD $LD_DYNAMIC"
+        LD_STATIC_STATE=0
+    fi
+}
+
+load-all-symbols ()
+{
+    if [ $LD_ALL_STATE -eq 0 ]
+    then
+        CMD="$CMD $LD_ALL_SYMBOLS"
+        LD_ALL_STATE=1
+    fi
+}
+
+load-ref-symbols ()
+{
+    if [ $LD_ALL_STATE -eq 1 ]
+    then
+        CMD="$CMD $LD_REF_SYMBOLS"
+        LD_ALL_STATE=0
+    fi
+}
diff --git a/build/ld.sun.dlib.sh b/build/ld.sun.dlib.sh
new file mode 100755
index 0000000..f42f363
--- /dev/null
+++ b/build/ld.sun.dlib.sh
@@ -0,0 +1,282 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : require shared
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%dlib.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+cc)
+    source "${0%dlib.sh}cc.sh"
+    ;;
+ *)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+# DLIB_CMD was started in tool-specific source
+CMD="$DLIB_CMD $LDFLAGS"
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create dynamic lib
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+    # tack on paths
+    DIRS="$LDIRS:$XDIRS"
+    while [ "$DIRS" != "" ]
+    do
+        DIR="${DIRS%%:*}"
+        [ "$DIR" != "" ] && CMD="$CMD -L$DIR"
+        DIRS="${DIRS#$DIR}"
+        DIRS="${DIRS#:}"
+    done
+
+    # update LD_LIBRARY_PATH
+    unset LD_LIBRARY_PATH
+    export LD_LIBRARY_PATH="$LDIRS:$XDIRS"
+
+    # tack on libraries, finding as we go
+    for LIB in $LIBS
+    do
+
+        # strip off switch
+        LIBNAME="${LIB#-[lsd]}"
+
+        # look at linkage
+        case "$LIB" in
+        -ldl|-ddl)
+
+            # always load libdl as shared library
+            load-ref-symbols
+            load-dynamic
+            CMD="$CMD -ldl"
+            ;;
+
+        -l*)
+
+            # normal or dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $LIBNAME.so $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load normally
+                    load-ref-symbols
+                    load-dynamic
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # try static only
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $LIBNAME.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+                    SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                    # load static
+                    load-static
+                    load-all-symbols
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                if [ $STATICSYSLIBS -eq 1 ]
+                then
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to static
+                        load-static
+                        load-all-symbols
+                        ;;
+
+                    *)
+                        # set load to dynamic
+                        load-ref-symbols
+                        load-dynamic
+                        ;;
+
+                    esac
+                else
+                    # set load to normal
+                    load-ref-symbols
+                    load-dynamic
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -s*)
+
+            # force static load
+            FOUND=0
+            find-lib $LIBNAME.a $LDIRS
+            if [ "$LIBPATH" != "" ]
+            then
+
+                # found it
+                FOUND=1
+
+                # add it to dependencies
+                DEPS="$DEPS $LIBPATH"
+                SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                # load static
+                load-static
+                load-all-symbols
+                CMD="$CMD -l$LIBNAME"
+
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                if [ $STATIC -eq 1 ] || [ $STATICSYSLIBS -eq 1 ]
+                then
+                    # set load to static
+                    load-static
+                    load-all-symbols
+                else
+
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to dynamic
+                        load-ref-symbols
+                        load-dynamic
+                        ;;
+
+                    *)
+                        # set load to static
+                        load-static
+                        load-all-symbols
+                        ;;
+                    esac
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -d*)
+
+            # only dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $LIBNAME.so $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load normally
+                    load-ref-symbols
+                    load-dynamic
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                # set load to normal
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        esac
+
+    done
+fi
+
+# put state back to normal
+load-ref-symbols
+load-dynamic
+
+# add in pthreads
+if [ $THREADS -ne 0 ]
+then
+    CMD="$CMD -lpthread"
+fi
+
+# produce shared library
+echo "$CMD"
+$CMD || exit $?
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/ld.sun.exe.sh b/build/ld.sun.exe.sh
new file mode 100755
index 0000000..56e062c
--- /dev/null
+++ b/build/ld.sun.exe.sh
@@ -0,0 +1,299 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : ignore - will be dynamically loaded
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : require static
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%exe.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+cc)
+    source "${0%exe.sh}cc.sh"
+    ;;
+gcc)
+    source "${0%sun.exe.sh}linux.gcc.sh"
+    ;;
+*)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+# EXE_CMD was started in tool-specific source
+CMD="$EXE_CMD $LDFLAGS"
+
+# if building a static executable against dynamic libraries
+# the main application will substitute for name lookup
+if [ $STATIC -eq 1 ] && [ $DYLD -eq 1 ]
+then
+#    CMD="$CMD $LD_EXPORT_GLOBAL $LD_MULTIPLE_DEFS"
+    CMD="$CMD $LD_EXPORT_GLOBAL"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create executable
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile $VERSFILE"
+if [ "$LIBS" != "" ]
+then
+    # tack on paths
+    DIRS="$LDIRS:$XDIRS"
+    while [ "$DIRS" != "" ]
+    do
+        DIR="${DIRS%%:*}"
+        [ "$DIR" != "" ] && CMD="$CMD -L$DIR"
+        DIRS="${DIRS#$DIR}"
+        DIRS="${DIRS#:}"
+    done
+
+    # update LD_LIBRARY_PATH
+    unset LD_LIBRARY_PATH
+    export LD_LIBRARY_PATH="$LDIRS:$XDIRS"
+
+    # tack on libraries, finding as we go
+    for LIB in $LIBS
+    do
+
+        # strip off switch
+        LIBNAME="${LIB#-[lsd]}"
+
+        # look at linkage
+        case "$LIB" in
+        -ldl|-ddl)
+
+            # always load libdl as shared library
+            load-ref-symbols
+            load-dynamic
+            CMD="$CMD -ldl"
+            ;;
+
+        -l*)
+
+            # normal or dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $LIBNAME.so $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load dynamic
+                    load-dynamic
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # try static only
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $LIBNAME.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+                    SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                    # load static
+                    load-static
+                    [ $STATIC -eq 1 ] && load-all-symbols
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                # do not need to load all symbols for external libs
+                [ $STATIC -eq 1 ] && load-ref-symbols
+
+                if [ $STATICSYSLIBS -eq 1 ]
+                then
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to static
+                        load-static
+                        ;;
+
+                    *)
+                        # set load to dynamic
+                        load-dynamic
+                        ;;
+
+                    esac
+                else
+                    # set load to normal
+                    load-dynamic
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -s*)
+
+            # force static load
+            FOUND=0
+            find-lib $LIBNAME.a $LDIRS
+            if [ "$LIBPATH" != "" ]
+            then
+
+                # found it
+                FOUND=1
+
+                # add it to dependencies
+                DEPS="$DEPS $LIBPATH"
+                SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                # load static
+                load-static
+                [ $STATIC -eq 1 ] && load-all-symbols
+                CMD="$CMD -l$LIBNAME"
+
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+
+                # do not need to load all symbols for external libs
+                [ $STATIC -eq 1 ] && load-ref-symbols
+
+                if [ $STATIC -eq 1 ] || [ $STATICSYSLIBS -eq 1 ]
+                then
+
+                    # set load to static
+                    load-static
+
+                else
+
+                    # special case for libs we have in "ext"
+                    # that are sometimes requested as static
+                    case "$LIBNAME" in
+                    z|bz2)
+                        # set load to dynamic
+                        load-dynamic
+                        ;;
+                    *)
+                        load-static
+                        ;;
+                    esac
+                fi
+
+                CMD="$CMD -l$LIBNAME"
+            fi
+            ;;
+
+        -d*)
+
+            FOUND=0
+            if [ $STATIC -eq 1 ]
+            then
+                find-lib $LIBNAME.a $LDIRS
+                if [ "$LIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $LIBPATH"
+                    SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                    # load static
+                    load-static
+                    load-all-symbols
+
+                    CMD="$CMD -l$LIBNAME"
+
+                fi
+
+                # not found within our directories
+                if [ $FOUND -eq 0 ]
+                then
+                    load-static
+                    load-all-symbols
+
+                    CMD="$CMD -l$LIBNAME"
+                fi
+            fi
+            ;;
+
+
+        esac
+
+    done
+fi
+
+# return to normal
+load-ref-symbols
+load-dynamic
+
+# add in pthreads
+if [ $THREADS -ne 0 ]
+then
+    CMD="$CMD -lpthread"
+fi
+
+# produce shared library
+echo $CMD
+$CMD || exit $?
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/ld.sun.ln.sh b/build/ld.sun.ln.sh
new file mode 100644
index 0000000..c248afa
--- /dev/null
+++ b/build/ld.sun.ln.sh
@@ -0,0 +1,87 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+TYPE="$1"
+OUTDIR="$2"
+TARG="$3"
+NAME="$4"
+DBGAP="$5"
+EXT="$6"
+VERS="$7"
+
+# find target
+TARG=$(basename "$TARG")
+
+# put extension back onto name
+NAME="$NAME$DBGAP"
+[ "$EXT" != "" ] && NAME="$NAME.$EXT"
+
+# break out version
+set-vers ()
+{
+    MAJ=$1
+    MIN=$2
+    REL=$3
+}
+
+set-vers $(echo $VERS | tr '.' ' ')
+
+cd "$OUTDIR" || exit 5
+
+# create link
+create-link ()
+{
+    rm -f "$2"
+    local CMD="ln -s $1 $2"
+    echo $CMD
+    $CMD
+}
+
+# test for version in target name
+if [ "$TARG" != "$NAME.$MAJ.$MIN.$REL" ]
+then
+
+    # for simple name, create 2 links
+    if [ "$TARG" = "$NAME" ]
+    then
+        create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ"
+        create-link "$NAME.$MAJ" "$NAME"
+
+    # for name with major version in it
+    elif [ "$TARG" = "$NAME.$MAJ" ]
+    then
+        create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ"
+
+
+    # for name with major & minor version in it
+    elif [ "$TARG" = "$NAME.$MAJ.$MIN" ]
+    then
+        create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ.$MIN"
+    fi
+fi
diff --git a/build/ld.sun.slib.sh b/build/ld.sun.slib.sh
new file mode 100755
index 0000000..1e08638
--- /dev/null
+++ b/build/ld.sun.slib.sh
@@ -0,0 +1,135 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal or static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%slib.sh}cmn.sh"
+
+# initialize command
+CMD="ar -rc"
+
+# function to convert an archive into individual object files
+convert-static ()
+{
+    # list members
+    local path="$1"
+    local mbrs="$(ar -t $path)"
+
+    # unpack archive into temporary directory
+    mkdir -p ld-tmp
+    if ! cd ld-tmp
+    then
+        echo "$SELF_NAME: failed to cd to ld-tmp"
+        exit 5
+    fi
+    ar -x "$path"
+
+    # rename and add to source files list
+    local m=
+    for m in $mbrs
+    do
+        mv $m $NAME-$m
+        CMD="$CMD ld-tmp/$NAME-$m"
+    done
+
+    # return to prior location
+    cd - > /dev/null
+}
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+    CMD="$CMD $TARG"
+else
+    set-vers $(echo $VERS | tr '.' ' ')
+    CMD="$CMD $OUTDIR/$NAME$DBGAP.a.$VERS"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create this lib
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+    # tack on libraries, finding as we go
+    for LIB in $LIBS
+    do
+
+        # strip off switch
+        LIBNAME="${LIB#-[lsd]}"
+
+        # look at linkage
+        case "$LIB" in
+        -s*)
+
+            # force static load
+            find-lib $LIBNAME.a $LDIRS
+            if [ "$LIBPATH" != "" ]
+            then
+
+                # add it to dependencies
+                DEPS="$DEPS $LIBPATH"
+                SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+                # convert to individual object files
+                convert-static "$LIBPATH" || exit $?
+
+            fi
+            ;;
+
+        esac
+
+    done
+fi
+
+# produce static library
+echo $CMD
+$CMD || exit $?
+
+# remove temporaries
+rm -rf ld-tmp
+
+# produce dependencies
+if [ "$DEPFILE" != "" ] && [ "$DEPS" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/ld.unix.cmn.sh b/build/ld.unix.cmn.sh
new file mode 100644
index 0000000..b787c82
--- /dev/null
+++ b/build/ld.unix.cmn.sh
@@ -0,0 +1,149 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+LD="$1"
+shift
+
+SRCDIR="$1"
+OUTDIR="$2"
+TARG="$3"
+NAME="$4"
+DBGAP="$5"
+shift 5
+
+VERS="$1"
+VERSFILE="$2"
+DEPFILE="$3"
+shift 3
+
+MODE="$1"
+SCMFLAGS="$2"
+LDFLAGS="$3"
+shift 3
+
+LDIRS="$1"
+XDIRS="$2"
+shift 2
+
+OBJS="$1"
+LIBS="$2"
+
+# decode MODE
+STATIC=$(expr $MODE % 2)
+DYLD=$(expr $MODE / 2)
+
+# decode SCMFLAGS
+CHECKSUM=$(expr $SCMFLAGS % 2)
+STATICSYSLIBS=$(expr $SCMFLAGS / 2)
+
+# return parameter for find-lib
+LIBPATH=''
+
+# initial command state
+CMD=''
+LD_STATIC_STATE=0
+LD_ALL_STATE=0
+
+# for breaking out version
+set-vers ()
+{
+    MAJ=$1
+    MIN=$2
+    REL=$3
+}
+
+# for locating libraries
+find-lib ()
+{
+    _lib="lib$1"
+    _dirs="$2"
+
+    LIBPATH=''
+
+    while [ "$_dirs" != "" ]
+    do
+        _dir="${_dirs%%:*}"
+
+        if [ "$_dir" != "" ]
+        then
+            if [ -e "$_dir/$_lib" ]
+            then
+                while [ -L "$_dir/$_lib" ]
+                do
+                    _lib=$(stat -c '%N' "$_dir/$_lib" | tr "\`\'" "  ")
+                    _lib="${_lib#*->}"
+                    _lib="lib${_lib# *lib}"
+                    _lib="${_lib%% *}"
+                done
+                LIBPATH="$_dir/$_lib"
+                break;
+            fi
+        fi
+
+        _dirs="${_dirs#$_dir}"
+        _dirs="${_dirs#:}"
+    done
+}
+
+# setting state
+load-static ()
+{
+    if [ $LD_STATIC_STATE -eq 0 ]
+    then
+        CMD="$CMD $LD_STATIC"
+        LD_STATIC_STATE=1
+    fi
+}
+
+load-dynamic ()
+{
+    if [ $LD_STATIC_STATE -eq 1 ]
+    then
+        CMD="$CMD $LD_DYNAMIC"
+        LD_STATIC_STATE=0
+    fi
+}
+
+load-all-symbols ()
+{
+    if [ $LD_ALL_STATE -eq 0 ]
+    then
+        CMD="$CMD $LD_ALL_SYMBOLS"
+        LD_ALL_STATE=1
+    fi
+}
+
+load-ref-symbols ()
+{
+    if [ $LD_ALL_STATE -eq 1 ]
+    then
+        CMD="$CMD $LD_REF_SYMBOLS"
+        LD_ALL_STATE=0
+    fi
+}
diff --git a/build/ld.unix.slib.sh b/build/ld.unix.slib.sh
new file mode 100644
index 0000000..21d4b66
--- /dev/null
+++ b/build/ld.unix.slib.sh
@@ -0,0 +1,124 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal or static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+# initialize command
+CMD="ar -rc"
+
+# function to convert an archive into individual object files
+convert-static ()
+{
+    # list members
+    local path="$1"
+    local mbrs="$(ar -t $path)"
+
+    # unpack archive into temporary directory
+    mkdir -p ld-tmp
+    if ! cd ld-tmp
+    then
+        echo "$SELF_NAME: failed to cd to ld-tmp"
+        exit 5
+    fi
+    ar -x "$path"
+
+    # rename and add to source files list
+    local m=
+    for m in $mbrs
+    do
+        mv $m $LIBNAME-$m
+        CMD="$CMD ld-tmp/$LIBNAME-$m"
+    done
+
+    # return to prior location
+    cd - > /dev/null
+}
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+    CMD="$CMD $TARG"
+else
+    set-vers $(echo $VERS | tr '.' ' ')
+    CMD="$CMD $OUTDIR/$NAME$DBGAP.a.$VERS"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+    # tack on libraries, finding as we go
+    for LIB in $LIBS
+    do
+
+        # strip off switch
+        LIBNAME="${LIB#-[lsd]}"
+
+        # look at linkage
+        case "$LIB" in
+        -l*|-s*)
+
+            # force static load
+            LIBPATH="$(find-lib $LIBNAME.a $LDIRS)"
+            if [ "$LIBPATH" != "" ]
+            then
+
+                # add it to dependencies
+                DEPS="$DEPS $LIBPATH"
+
+                # convert to individual object files
+                convert-static "$LIBPATH" || exit $?
+
+            fi
+            ;;
+
+        esac
+
+    done
+fi
+
+# produce static library
+echo $CMD
+$CMD || exit $?
+
+# remove temporaries
+rm -rf ld-tmp
+
+# produce dependencies
+if [ "$DEPFILE" != "" ] && [ "$DEPS" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/ld.win.cmn.sh b/build/ld.win.cmn.sh
new file mode 100755
index 0000000..19fae3a
--- /dev/null
+++ b/build/ld.win.cmn.sh
@@ -0,0 +1,225 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+VERBOSE=
+if [ "$VERBOSE" != "" ] ; then echo "$0 $*"; fi
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+LD="$1"
+ARCH="$2"
+BUILD="$3"
+shift 3
+
+SRCDIR="$1"
+BINDIR="$2"
+OUTDIR="$3"
+TARG="$4"
+NAME="$5"
+DBGAP="$6"
+shift 6
+
+VERS="$1"
+VERSFILE="$2"
+DEPFILE="$3"
+shift 3
+
+MODE="$1"
+SCMFLAGS="$2"
+LDFLAGS="$3"
+shift 3
+
+LDIRS="$1"
+XDIRS="$2"
+shift 2
+
+OBJS="$1"
+LIBS="$2"
+shift 2
+
+PROXY_TOOL=$1
+RHOST=$2
+RPORT=$3
+RHOME=$4
+LHOME=$5
+WORKDIR=$6
+ROUTDIR=$7
+LOUTDIR=$8
+shift 8
+
+# decode MODE
+STATIC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+DYLD=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+KPROC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+THREADS=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_M=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_XML=$(expr $MODE % 2)
+
+##### TEMPORARY #####
+KPROC=0
+THREADS=0
+HAVE_M=0
+HAVE_XML=0
+#####################
+
+# decode SCMFLAGS
+CHECKSUM=$(expr $SCMFLAGS % 2)
+STATICSYSLIBS=$(expr $SCMFLAGS / 2)
+
+# set target architecture
+if [ "$ARCH" == "i386" ]
+then
+    LDFLAGS="$LDFLAGS /MACHINE:x86"
+else
+    LDFLAGS="$LDFLAGS /MACHINE:x64"
+fi
+
+if [ "$VERBOSE" != "" ] 
+then
+echo "LD            =$LD"
+echo "ARCH          =$ARCH"
+echo "BUILD         =$BUILD"
+echo "SRCDIR        =$SRCDIR"        
+echo "BINDIR        =$BINDIR"        
+echo "OUTDIR        =$OUTDIR"        
+echo "TARG          =$TARG"          
+echo "NAME          =$NAME"          
+echo "DBGAP         =$DBGAP"         
+echo "VERS          =$VERS"          
+echo "VERSFILE      =$VERSFILE"      
+echo "DEPFILE       =$DEPFILE"       
+echo "MODE          =$MODE"          
+echo "SCMFLAGS      =$SCMFLAGS"      
+echo "LDFLAGS       =$LDFLAGS"       
+echo "LDIRS         =$LDIRS"         
+echo "XDIRS         =$XDIRS"         
+echo "OBJS          =$OBJS"          
+echo "LIBS          =$LIBS"   
+echo "PROXY_TOOL    =$PROXY_TOOL"   
+echo "RHOST         =$RHOST"   
+echo "RPORT         =$RPORT"   
+echo "RHOME         =$RHOME"   
+echo "LHOME         =$LHOME"   
+echo "WORKDIR       =$WORKDIR" 
+echo "ROUTDIR       =$ROUTDIR" 
+echo "LOUTDIR       =$LOUTDIR"       
+echo "STATIC        =$STATIC"        
+echo "MODE          =$MODE"          
+echo "DYLD          =$DYLD"          
+echo "MODE          =$MODE"          
+echo "KPROC         =$KPROC"         
+echo "MODE          =$MODE"          
+echo "THREADS       =$THREADS"       
+echo "MODE          =$MODE"          
+echo "HAVE_M        =$HAVE_M"        
+echo "HAVE_XML      =$HAVE_XML"        
+echo "CHECKSUM      =$CHECKSUM"      
+echo "STATICSYSLIBS =$STATICSYSLIBS" 
+fi
+
+# return parameter for find-lib
+xLIBPATH=''
+
+# initial command state
+CMD=''
+LD_STATIC_STATE=0
+LD_ALL_STATE=0
+
+# for breaking out version
+set-vers ()
+{
+    MAJ=$1
+    MIN=$2
+    REL=$3
+}
+
+# for locating libraries
+find-lib ()
+{
+    _lib="lib$1"
+    _dirs="$2"
+
+    xLIBPATH=''
+
+    while [ "$_dirs" != "" ]
+    do
+        _dir="${_dirs%%:*}"
+
+        if [ "$_dir" != "" ]
+        then
+            if [ -e "$_dir/$_lib" ]
+            then
+                xLIBPATH="$_dir/$_lib"
+                break;
+            fi
+        fi
+
+        _dirs="${_dirs#$_dir}"
+        _dirs="${_dirs#:}"
+    done
+}
+
+# setting state
+load-static ()
+{
+    if [ $LD_STATIC_STATE -eq 0 ]
+    then
+        CMD="$CMD $LD_STATIC"
+        LD_STATIC_STATE=1
+    fi
+}
+
+load-dynamic ()
+{
+    if [ $LD_STATIC_STATE -eq 1 ]
+    then
+        CMD="$CMD $LD_DYNAMIC"
+        LD_STATIC_STATE=0
+    fi
+}
+
+load-all-symbols ()
+{
+    if [ $LD_ALL_STATE -eq 0 ]
+    then
+        CMD="$CMD $LD_ALL_SYMBOLS"
+        LD_ALL_STATE=1
+    fi
+}
+
+load-ref-symbols ()
+{
+    if [ $LD_ALL_STATE -eq 1 ]
+    then
+        CMD="$CMD $LD_REF_SYMBOLS"
+        LD_ALL_STATE=0
+    fi
+}
diff --git a/build/ld.win.dlib.sh b/build/ld.win.dlib.sh
new file mode 100755
index 0000000..a006fcc
--- /dev/null
+++ b/build/ld.win.dlib.sh
@@ -0,0 +1,327 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : require shared
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%dlib.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+link)
+    source "${0%dlib.sh}vc++.sh"
+    ;;
+ *)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+# DLIB_CMD was started in tool-specific source
+CMD="$DLIB_CMD $LDFLAGS OLE32.lib Ws2_32.lib"
+
+# function to convert static libraries to individual COFF files
+convert-static ()
+{
+    # list members
+    local path="$1"
+    local mbrs="$(ar -t $path)"
+
+    # create sub directory
+    rm -rf "$2" && mkdir "$2"
+    if ! cd "$2"
+    then
+        echo "$SELF_NAME: failed to cd to $2"
+        exit 5
+    fi
+    ar -x "$path"
+
+    # add source files to link
+    local m=
+    for m in $mbrs
+    do
+        CMD="$CMD $2/$m"
+    done
+
+    # return to prior location
+    cd - > /dev/null
+}
+
+# tack on object files
+CMD="$CMD $(cygpath -w $OBJS)"
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile $DEF_FILE"
+if [ "$LIBS" != "" ]
+then
+    # tack on paths
+    DIRS="$LDIRS:$XDIRS"
+    while [ "$DIRS" != "" ]
+    do
+        DIR="${DIRS%%:*}"
+        [ "$DIR" != "" ] && CMD="$CMD /LIBPATH:$(cygpath -w $DIR)"
+        DIRS="${DIRS#$DIR}"
+        DIRS="${DIRS#:}"
+    done
+
+    HAVE_KERNEL32=0
+    HAVE_CLIB=0
+
+    if [ $THREADS -ne 0 ] || [ $KPROC -ne 0 ]
+    then
+        [ $STATIC -eq 0 ] && CMD="$CMD /MD"
+    fi
+    
+    # tack on libraries, finding as we go
+    for xLIB in $LIBS
+    do
+
+        # strip off switch
+        xLIBNAME="${xLIB#-[lsd]}"
+
+        # map xLIBNAME
+        case "$xLIBNAME" in
+        
+        # redirect libdl to link against Kernel32.lib in case of windows
+        dl)
+            if [ $HAVE_KERNEL32 -ne 1 ]
+            then
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD Kernel32.lib"
+                HAVE_KERNEL32=1
+            fi
+            continue
+            ;;
+
+        # redirect libm to link against libc.lib in case of windows
+        # omitting the lib defaults to linking against libc.lib
+        m)
+            if [ $HAVE_CLIB -ne 1 ]
+            then
+                load-ref-symbols
+                load-dynamic
+                HAVE_CLIB=1
+            fi
+            continue
+            ;;
+
+##### TEMPORARY #####
+# use ksproc for kproc
+    kproc)
+        xLIBNAME=ksproc
+        ;;
+#####################
+
+        esac
+
+        # look at linkage
+        case "$xLIB" in
+        -l*)
+
+            # normal or dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $xLIBNAME.lib $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load normally
+                    load-ref-symbols
+                    load-dynamic
+                    CMD="$CMD lib$xLIBNAME.lib"
+
+                fi
+            fi
+
+            # try static only
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $xLIBNAME.a $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $xLIBPATH"
+
+                    # load static
+                    load-static
+                    load-all-symbols
+                    convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                # set load to normal
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD lib$xLIBNAME.lib"
+            fi
+            ;;
+
+        -s*)
+
+            # force static load
+            FOUND=0
+            find-lib $xLIBNAME.a $LDIRS
+            if [ "$xLIBPATH" != "" ]
+            then
+
+                # found it
+                FOUND=1
+
+                # add it to dependencies
+                DEPS="$DEPS $xLIBPATH"
+
+                # load static
+                load-static
+                load-all-symbols
+                convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                # set load to static
+                load-static
+                load-all-symbols
+                CMD="$CMD lib$xLIBNAME.lib"
+            fi
+            ;;
+
+        -d*)
+
+            # only dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $xLIBNAME.lib $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load normally
+                    load-ref-symbols
+                    load-dynamic
+                    CMD="$CMD lib$xLIBNAME.lib"
+
+                fi
+            fi
+
+            # try static if performing static build
+            # because we HAVE to link against something,
+            # and the dependency code is being statically
+            # linked into an executable...
+            if [ $FOUND -eq 0 ] && [ $STATIC -eq 1 ]
+            then
+                find-lib $xLIBNAME.a $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $xLIBPATH"
+
+                    # load static
+                    load-static
+                    load-all-symbols
+                    convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                # set load to normal
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD lib$xLIBNAME.lib"
+            fi
+            ;;
+
+        esac
+
+    done
+fi
+
+# put state back to normal
+load-ref-symbols
+load-dynamic
+
+# produce shared library, stub library and exp file
+echo $CMD
+$CMD
+STATUS=$?
+if [[ ${STATUS} != 0 ]]
+then
+    rm -f "$TARG" "${TARG%lib}dll"
+    exit $STATUS
+fi
+
+# copy dll to binary directory, so they can be found by the executables
+cp "${TARG%lib}dll" "$BINDIR"
+STATUS=$?
+if [[ ${STATUS} != 0 ]]
+then
+    exit $STATUS
+fi
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/ld.win.exe.sh b/build/ld.win.exe.sh
new file mode 100755
index 0000000..e91ce43
--- /dev/null
+++ b/build/ld.win.exe.sh
@@ -0,0 +1,321 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : ignore - will be dynamically loaded
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : require static
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%exe.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+link)
+    source "${0%exe.sh}vc++.sh"
+    ;;
+*)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+# EXE_CMD was started in tool-specific source
+CMD="$EXE_CMD $LDFLAGS OLE32.lib Ws2_32.lib"
+
+# if building a static executable against dynamic libraries
+# the main application will substitute for name lookup
+if [ $STATIC -eq 1 ] && [ $DYLD -eq 1 ]
+then
+    CMD="$CMD $LD_EXPORT_GLOBAL $LD_MULTIPLE_DEFS"
+fi
+
+# function to convert static libraries to individual COFF files
+convert-static ()
+{
+    if [ $STATIC -eq 0 ]
+    then
+        CMD="$CMD $2.a"
+    else
+        # list members
+        local path=`cd $(dirname $1);pwd`/$(basename $1) # make sure path is absolute
+        local mbrs="$(ar -t $path)"
+
+        # create sub directory
+        rm -rf "$2" && mkdir "$2"
+        if ! cd "$2"
+        then
+            echo "$SELF_NAME: failed to cd to $2"
+            exit 5
+        fi
+        ar -x "$path"
+
+        # add source files to link
+        local m=
+        for m in $mbrs
+        do
+            CMD="$CMD $2/$m"
+        done
+
+        # return to prior location
+        cd - > /dev/null
+    fi
+}
+
+# tack on object files
+CMD="$CMD $(cygpath -w $OBJS)"
+
+# initial dependency upon Makefile - no vers file on Windows
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+    # tack on paths
+    DIRS="$LDIRS:$XDIRS"
+    while [ "$DIRS" != "" ]
+    do
+        DIR="${DIRS%%:*}"
+        [ "$DIR" != "" ] && CMD="$CMD /LIBPATH:$(cygpath -w $DIR)"
+        DIRS="${DIRS#$DIR}"
+        DIRS="${DIRS#:}"
+    done
+
+    HAVE_KERNEL32=0
+    HAVE_WS2=0
+    HAVE_CLIB=0
+
+    if [ $THREADS -ne 0 ] || [ $KPROC -ne 0 ]
+    then
+        if [ $STATIC -ne 0 ]
+        then
+            CMD="$CMD /MT"
+        else
+            CMD="$CMD /MD"
+        fi
+    fi
+
+    # tack on libraries, finding as we go
+    for xLIB in $LIBS
+    do
+
+        # strip off switch
+        xLIBNAME="${xLIB#-[lsd]}"
+
+        # map xLIBNAME
+        case "$xLIBNAME" in
+        dl)
+            if [ $HAVE_KERNEL32 -ne 1 ]
+            then
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD Kernel32.lib"
+                HAVE_KERNEL32=1
+            fi
+            continue
+            ;;
+
+        ws2)
+            if [ $HAVE_WS2 -ne 1 ]
+            then
+                load-ref-symbols
+                load-dynamic
+                CMD="$CMD ws2_32.lib"
+                HAVE_WS2=1
+            fi
+            continue
+            ;;
+
+        # redirect libm to link against libc.lib in case of windows
+        # omitting the lib defaults to linking against libc.lib
+        m)
+            if [ $HAVE_CLIB -ne 1 ]
+            then
+                load-ref-symbols
+                load-dynamic
+                HAVE_CLIB=1
+            fi
+            continue
+            ;;
+
+##### TEMPORARY #####
+# use ksproc for kproc
+    kproc)
+        xLIBNAME=ksproc
+        ;;
+#####################
+
+        esac
+
+        # look at linkage
+        case "$xLIB" in
+        -l*)
+
+            # normal or dynamic linkage
+            FOUND=0
+            if [ $STATIC -eq 0 ]
+            then
+                find-lib $xLIBNAME.lib $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # load dynamic
+                    load-dynamic
+                    CMD="$CMD lib$xLIBNAME.lib"
+
+                fi
+            fi
+
+            # try static only
+            if [ $FOUND -eq 0 ]
+            then
+                find-lib $xLIBNAME.a $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $xLIBPATH"
+
+                    # load static
+                    load-static
+                    [ $STATIC -eq 1 ] && load-all-symbols
+                    convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+                fi
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                [ $STATIC -eq 1 ] && load-ref-symbols
+                load-dynamic
+
+                CMD="$CMD lib$xLIBNAME.lib"
+            fi
+            ;;
+
+        -s*)
+
+            # force static load
+            FOUND=0
+            find-lib $xLIBNAME.a $LDIRS
+            if [ "$xLIBPATH" != "" ]
+            then
+
+                # found it
+                FOUND=1
+
+                # add it to dependencies
+                DEPS="$DEPS $xLIBPATH"
+
+                # load static
+                load-static
+                [ $STATIC -eq 1 ] && load-all-symbols
+                convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+            fi
+
+            # not found within our directories
+            if [ $FOUND -eq 0 ]
+            then
+                # set load to static
+                load-static
+                [ $STATIC -eq 1 ] && load-all-symbols
+                CMD="$CMD lib$xLIBNAME.lib"
+            fi
+            ;;
+
+        -d*)
+
+            FOUND=0
+            if [ $STATIC -eq 1 ]
+            then
+                find-lib $xLIBNAME.a $LDIRS
+                if [ "$xLIBPATH" != "" ]
+                then
+
+                    # found it
+                    FOUND=1
+
+                    # add it to dependencies
+                    DEPS="$DEPS $xLIBPATH"
+
+                    # load static
+                    load-static
+                    load-all-symbols
+                    convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+                fi
+
+                # not found within our directories
+                if [ $FOUND -eq 0 ]
+                then
+                    load-static
+                    load-all-symbols
+
+                    CMD="$CMD lib$xLIBNAME"
+                fi
+            fi
+            ;;
+
+
+        esac
+
+    done
+fi
+
+# return to normal
+load-ref-symbols
+load-dynamic
+
+# produce shared library
+echo $CMD
+$CMD || exit $?
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+# cleanup temporary files
+rm -f $TARG.lib $TARG.exp
diff --git a/build/ld.win.slib.sh b/build/ld.win.slib.sh
new file mode 100755
index 0000000..17bbc25
--- /dev/null
+++ b/build/ld.win.slib.sh
@@ -0,0 +1,135 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal or static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%slib.sh}cmn.sh"
+
+# initialize command
+if [ $STATIC -eq 0 ]
+then
+    CMD="lib /NOLOGO"
+else
+    CMD="ar -rc"
+fi
+
+# function to convert an archive into individual object files
+convert-static ()
+{
+    # list members
+    local path="$1"
+    local mbrs="$(ar -t $path)"
+
+    # unpack archive into temporary directory
+    mkdir -p ld-tmp
+    if ! cd ld-tmp
+    then
+        echo "$SELF_NAME: failed to cd to ld-tmp"
+        exit 5
+    fi
+    ar -x "$path"
+
+    # rename and add to source files list
+    local m=
+    for m in $mbrs
+    do
+        mv $m $NAME-$m
+        CMD="$CMD ld-tmp/$NAME-$m"
+    done
+
+    # return to prior location
+    cd - > /dev/null
+}
+
+if [ $STATIC -eq 0 ]
+then 
+    # no versioned output here, sorry
+    CMD="$CMD /OUT:$(cygpath -w $TARG)"
+
+    # tack on object files
+    CMD="$CMD $(cygpath -w $OBJS)"
+else
+    CMD="$CMD $TARG $OBJS"
+fi
+
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+    # tack on libraries, finding as we go
+    for xLIB in $LIBS
+    do
+
+        # strip off switch
+        xLIBNAME="${xLIB#-[lsd]}"
+
+        # look at linkage
+        case "$xLIB" in
+        -s*)
+
+            # force static load
+            find-lib $xLIBNAME.a $LDIRS
+            if [ "$xLIBPATH" != "" ]
+            then
+
+                # add it to dependencies
+                DEPS="$DEPS $xLIBPATH"
+
+                # convert to individual object files
+                convert-static "$xLIBPATH" || exit $?
+
+            fi
+            ;;
+
+        esac
+
+    done
+fi
+
+# produce static library
+echo $CMD
+$CMD || exit $?
+
+# remove temporaries
+rm -rf ld-tmp
+
+# produce dependencies
+if [ "$DEPFILE" != "" ] && [ "$DEPS" != "" ]
+then
+    echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/ld.win.stub.sh b/build/ld.win.stub.sh
new file mode 100755
index 0000000..92e06af
--- /dev/null
+++ b/build/ld.win.stub.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+#  normal linkage
+#   -l : find shared or static
+#   -s : require static
+#   -d : require shared
+#
+#  static linkage
+#   -l : require static
+#   -s : require static
+#   -d : ignore
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%stub.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+link)
+    source "${0%stub.sh}vc++.sh"
+    ;;
+ *)
+    echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+    exit 5
+esac
+
+# produce stub library and exp file
+echo $STUB_CMD
+$STUB_CMD
diff --git a/build/ld.win.vc++.sh b/build/ld.win.vc++.sh
new file mode 100755
index 0000000..09dd42d
--- /dev/null
+++ b/build/ld.win.vc++.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# define linker params
+LD_EXPORT_GLOBAL=""
+LD_MULTIPLE_DEFS="/FORCE:MULTIPLE"
+LD_STATIC=""
+LD_DYNAMIC=""
+LD_ALL_SYMBOLS="/OPT:NOREF"
+LD_REF_SYMBOLS="/OPT:REF"
+
+# rewrite PATH variable
+unset CYGP
+while [ "$PATH" = "${PATH#/cygdrive}" ]
+do
+    DIR="${PATH%%:*}"
+    PATH="${PATH#$DIR}"
+    PATH="${PATH#:}"
+    CYGP="$CYGP:$DIR"
+done
+PATH="$PATH$CYGP"
+export PATH
+
+# the def file
+unset DEF_SWITCH
+DEF_FILE="$SRCDIR/$NAME-$BUILD.def"
+[ ! -f "$DEF_FILE" ] && DEF_FILE="$SRCDIR/$NAME.def"
+[ -f "$DEF_FILE" ] && DEF_SWITCH="/DEF:$(cygpath -w $DEF_FILE)" || unset DEF_FILE
+
+# the full path to target sans extension
+WINTARG="$(cygpath -w ${TARG%.lib})"
+
+# build command
+STUB_CMD="lib /NOLOGO /MACHINE:x86 $DEF_SWITCH /OUT:$WINTARG.lib"
+DLIB_CMD="$LD /NOLOGO /DLL $DEF_SWITCH /OUT:$WINTARG.dll /STACK:8000000 /HEAP:1000000000"
+EXE_CMD="$LD /NOLOGO /OUT:$WINTARG.exe /SUBSYSTEM:CONSOLE /ENTRY:wmainCRTStartup /STACK:8000000 /HEAP:100000000"
+
+# tack on PDB tracking
+if [ "$BUILD" = "dbg" ]
+then
+    DLIB_CMD="$DLIB_CMD /DEBUG /PDB:$WINTARG.pdb"
+    EXE_CMD="$EXE_CMD /DEBUG /PDB:$WINTARG.pdb"
+fi
diff --git a/build/libexists.sh b/build/libexists.sh
new file mode 100644
index 0000000..b725289
--- /dev/null
+++ b/build/libexists.sh
@@ -0,0 +1,180 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# libexists.sh: test whether one of the given libraries defines all of the specified external names
+# Usage:
+#   bash libexists.sh OS ARCH CC LD CC_SH LD_SH [-L dir ] [-X dir] [-o dir] [-l lib] [-s lib] [-d lib] [-v] extName1 [ extName2 ... ]
+# Parameters:
+#   OS : linux/mac/win
+#   ARCH : i386/x86_64
+#   CC : compiler command
+#   LD : link command
+#   CC_SH : compile script
+#   LD_SH : link script
+#   extName1, ... - external names to find in libraries
+# Options:
+#   -L, -X :    library directories
+#   -o :        directory for intermediate files
+#   -l, -d :    libraries to search (shared or static)
+#   -s :        libraries to search (static)
+#   -v :        verbose mode
+# Environment:
+#   requires an ?? OS.ARCH.sh file in the script's directory
+# Return: 0 if found, the library's name is on stdout
+#         1 not found
+#        -1 bad arguments
+#
+
+BUILD_DIR="$(dirname $0)"
+
+# os
+OS="$1";shift
+# architecture
+ARCH="$1";shift
+# compiler
+CC="$1";shift 1
+# linker
+LD="$1";shift
+# compile script
+CC_SH="$1";shift
+# link script
+LD_SH="$1";shift
+
+# message prefix for verbose mode
+dbgPref="**$(basename $0): "
+
+# parse parameters
+cOpts=
+libs=
+verbose="false"
+outDir="."
+while getopts L:X:l:s:d:vo: o
+do	case "$o" in
+	L|X)	cOpts="${cOpts} -L$OPTARG";libPath="${libPath}:${OPTARG}";;
+	l|d)	libs="${libs} l$OPTARG";; 
+	s)	    libs="${libs} s$OPTARG";; 
+	o)      outDir="$OPTARG";;
+	v)	    verbose="true";; 
+	[?])	printf >&2 "Usage: $0 [-L dir ] [-X dir] [-o dir] [-l lib] [-s lib] [-d lib] [-v] extName1 [ extName2 ... ]"
+		exit -1;;
+	esac
+done
+libPath="${outDir}${libPath}"
+
+shift $((OPTIND - 1))
+
+if [ $verbose == "true" ]
+then
+    printf >&2 "${dbgPref}OS   ='%s'\n"  "$OS"
+    printf >&2 "${dbgPref}ARCH   ='%s'\n"  "$ARCH"
+    printf >&2 "${dbgPref}CC   ='%s'\n"  "$CC"
+    printf >&2 "${dbgPref}LD   ='%s'\n"  "$LD"
+    printf >&2 "${dbgPref}CC_SH   ='%s'\n"  "$CC_SH"
+    printf >&2 "${dbgPref}LD_SH   ='%s'\n"  "$LD_SH"
+    printf >&2 "${dbgPref}cOpts   ='%s'\n"  "$cOpts"
+    printf >&2 "${dbgPref}libs    ='%s'\n"  "$libs"
+    printf >&2 "${dbgPref}verbose ='%s'\n"  $verbose
+    printf >&2 "${dbgPref}outDir  ='%s'\n"  $outDir
+fi
+
+## create a C program referencing all the external names
+srcFile="${outDir}/libexists.c"
+objFile="${outDir}/libexists.o"
+exeFile="${outDir}/libexists"
+
+echo "" >${srcFile}
+for fn in $* 
+do  #declare
+    echo "extern void ${fn}(void);" >>${srcFile}
+done
+echo "int main( int argc, char *argv [] ){" >>${srcFile}
+echo "if (argc < 0 ) {    " >>${srcFile}
+for fn in $* 
+do
+    echo "   ${fn}();" >>${srcFile}
+done
+echo "} return 0;} int wmain(int argc, char *argv []) { return main(argc,argv); }" >>${srcFile}
+
+if [ $verbose == "true" ]
+then
+    echo "${dbgPref}created ${srcFile}:" >&2
+    cat ${srcFile} >&2
+fi
+##
+
+## compile
+compile="${BUILD_DIR}/$CC_SH $OS $CC -c -o ${objFile} ${srcFile}"
+if [ $verbose == "true" ]
+then
+    echo "${dbgPref}${compile}" >&2
+fi
+compileRes=$($compile)
+if [ $verbose == "true" ]
+then
+    echo "${dbgPref}${compileRes}" >&2
+fi
+##
+
+#try to link with all specified libraries until successful
+LD_LIBRARY_PATH=${libPath}:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
+rc=1
+for lib in $libs
+do
+    pref=${lib:0:1}
+    lib=${lib:1}
+    if [ $pref == "s" ]
+    then
+        link="${BUILD_DIR}/$LD_SH $OS $ARCH $LD --static --exe ${cOpts} -l$lib -o${exeFile} --objx o ${objFile}"
+    else
+        link="${BUILD_DIR}/$LD_SH $OS $ARCH $LD          --exe ${cOpts} -l$lib -o${exeFile} --objx o ${objFile}" 
+    fi    
+    if [ $verbose == "true" ]
+    then
+        echo ${dbgPref} "$link" >&2
+    fi
+    linkRes=$($link 2>/dev/null)
+    linkRc=$?
+    if [ $verbose == "true" ]
+    then
+        echo ${dbgPref} "$linkRes" >&2
+    fi
+    
+    if [ $linkRc == 0 ]
+    then 
+        ${exeFile} 2>/dev/null
+        if [ $? == 0 ]
+        then 
+            # Success: RC=0, found library's name to stdout
+            rc=0
+            echo $lib
+            break
+        fi            
+    fi
+done
+
+#clean up
+rm -f ${srcFile} ${objFile} ${exeFile}
+
+exit $rc 
diff --git a/build/mac.arch.sh b/build/mac.arch.sh
new file mode 100755
index 0000000..60ee5d4
--- /dev/null
+++ b/build/mac.arch.sh
@@ -0,0 +1,87 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# PPC or Intel?
+ARCH="$(uname -m)"
+if [ "$ARCH" = "x86_64" ]
+then
+    echo $ARCH
+    exit 0
+fi
+
+# the Mac likes to keep its architecture hidden because for all practical
+# purposes, it is both 32 and 64 bit, and makes use of emulation as needed.
+
+# does the hardware support 64-bit mode, even in emulation?
+SYSCTL=/usr/sbin/sysctl
+[ -x /sbin/sysctl ] && SYSCTL=/sbin/sysctl
+CAP64=$($SYSCTL -n hw.cpu64bit_capable)
+
+# real 64-bit hardware has > 32 bits of address space
+PADDR_BITS=$(/usr/sbin/sysctl -n machdep.cpu.address_bits.physical)
+VADDR_BITS=$(/usr/sbin/sysctl -n machdep.cpu.address_bits.virtual)
+
+# to be 64-bit, it's probably sufficient to test the address space
+# but we have the emulation information as well.
+if [ $CAP64 -ne 0 ]
+then
+    if [ $PADDR_BITS -gt 32 ] && [ $VADDR_BITS -gt 32 ]
+    then
+        # call it 64-bit
+        if [ "$ARCH" = "i386" ] || [ "$ARCH" = "x86_64" ]
+        then
+            echo "x86_64"
+            exit 0
+        fi
+
+        if [ "$ARCH" = "Power Macintosh" ]
+        then
+            echo "ppc64"
+            exit 0
+        fi
+
+        # unrecognized
+        echo "unrecognized"
+        exit 5
+    fi
+fi
+
+# call it 32-bit
+if [ "$ARCH" = "i386" ]
+then
+    echo "i386"
+    exit 0
+fi
+
+if [ "$ARCH" = "Power Macintosh" ]
+then
+    echo "ppc32"
+    exit 0
+fi
+
+# unrecognized
+echo "unrecognized"
+exit 5
+
diff --git a/build/make-defs-xf.pl b/build/make-defs-xf.pl
new file mode 100755
index 0000000..a99ac6d
--- /dev/null
+++ b/build/make-defs-xf.pl
@@ -0,0 +1,108 @@
+#!/usr/bin/perl
+#============================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+use IO::Handle;
+use IO::File;
+use IPC::Open2;
+use FileHandle;
+
+my $libname;
+my $libvers;
+my @files;
+
+sub USAGE() {
+  print "Usage: $0 -o <lib name> [-v <lib vers file>] <c source files>\n";
+  exit 1;
+}
+
+sub file_contents($) {
+  local $/;
+  local $_ = shift;
+  my $fh;
+
+  $fh = new IO::File $_, 'r' or die "can't open $_ for read";
+  undef $/;
+  $_ = <$fh>;
+  undef $fh;
+
+  return $_;
+}
+
+sub process_args() {
+  my $i;
+
+  for ($i = 0; $i < scalar(@ARGV); ++$i) {
+    $_ = $ARGV[$i];
+    last unless /^-(.)/;
+    if ($1 eq 'o') {
+      $libname = $ARGV[++$i];
+    }
+    elsif ($1 eq 'v') {
+      $_ = $ARGV[++$i];
+      $_ = file_contents($_);
+      chomp;
+      warn "vers file is empty" if /^$/;
+      if (/(\d+)\.(\d+)\.(\d+)/) {
+        $libvers = "$1.$2";
+      }
+      else {
+        warn "'$_' is not a valid version";
+      }
+    }
+    else {
+      USAGE;
+    }
+  }
+  USAGE unless $libname;
+
+  for (++$i; $i != scalar(@ARGV); ++$i) {
+    push @files, $ARGV[$i];
+  }
+}
+
+sub process_files() {
+    foreach (@files) {
+	my $in = new IO::File $_, 'r' or die "can't open file '$_' for read";
+	{
+	    local $_;
+
+	    while ($_ = <$in>, defined($_)) {
+		print "\t$1\n" if /^VTRANSFACT_IMPL\s*\(\s*(\w+)/;
+	    }
+	}
+        $in->close();
+    }
+}
+
+process_args;
+USAGE unless $libname;
+USAGE unless scalar(@files);
+
+print "LIBRARY $libname\n";
+print "VERSION $libvers\n" if $libvers;
+print "EXPORTS\n";
+process_files();
+
+exit 0;
diff --git a/build/make-defs.pl b/build/make-defs.pl
new file mode 100755
index 0000000..dbff4dd
--- /dev/null
+++ b/build/make-defs.pl
@@ -0,0 +1,247 @@
+#!/usr/bin/perl
+#============================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+use IO::Handle;
+use IO::File;
+use IPC::Open2;
+use FileHandle;
+
+my $libname;
+my $libvers;
+my $GCC = '';
+my @files;
+
+sub USAGE() {
+  print "Usage: $0 -o <lib name> [-v <lib vers file>] <gcc spec> -- <header files>\n";
+  exit 1;
+}
+
+sub file_contents($) {
+  local $/;
+  local $_ = shift;
+  my $fh;
+
+  $fh = new IO::File $_, 'r' or die "can't open $_ for read";
+  undef $/;
+  $_ = <$fh>;
+  undef $fh;
+
+  return $_;
+}
+
+sub process_args() {
+  my $i;
+
+  for ($i = 0; $i < scalar(@ARGV); ++$i) {
+    $_ = $ARGV[$i];
+    last unless /^-(.)/;
+    if ($1 eq 'o') {
+      $libname = $ARGV[++$i];
+    }
+    elsif ($1 eq 'v') {
+      $_ = $ARGV[++$i];
+      $_ = file_contents($_);
+      chomp;
+      warn "vers file is empty" if /^$/;
+      if (/(\d+)\.(\d+)\.(\d+)/) {
+        $libvers = "$1.$2";
+      }
+      else {
+        warn "'$_' is not a valid version";
+      }
+    }
+    else {
+      USAGE;
+    }
+  }
+#  USAGE unless $libname;
+
+  for ( ; $i != scalar(@ARGV); ++$i) {
+    $_ = $ARGV[$i];
+    last if $_ eq '--';
+    $GCC .= "$_ ";
+  }
+
+  for (++$i; $i != scalar(@ARGV); ++$i) {
+    push @files, $ARGV[$i];
+  }
+}
+
+sub next_token($) {
+  local $_;
+  my $src = shift;
+
+  if ($src =~ /^(\s*)/) {
+    $src = substr $src, length($1);
+  }
+  if ($src =~ /^([^ ]+)/) {
+    $_ = $1;
+    if (/^([A-Za-z_][A-Za-z0-9_]+)/) {
+      $_ = $1;
+      $src = substr $src, length($_);
+      return ($src, 'ident', $_);
+    }
+    else {
+      $_ = substr $src, 0, 1;
+      $src = substr $src, 1;
+      return ($src, 'unknown', $_);
+    }
+  }
+  return ($src, undef, undef);
+}
+
+my $id;
+my $pt_st = 0;
+my $visibility = 'extern';
+
+sub process_token($$) {
+  my $type = shift;
+  my $tok = shift;
+
+  if ($tok eq ';' || $tok eq ',') {
+    if (($pt_st == 4 || $pt_st == 5) && $visibility eq 'extern') {
+      if ($id) {
+        print "\t$id\n";
+      }
+    }
+    $id = undef;
+    if ($tok eq ';') {
+      $pt_st = 0;
+      $visibility = 'extern';
+    }
+    return;
+  }
+  if ($pt_st == 0) {
+    unless ($type eq 'ident') {
+      $pt_st = 1;
+      return;
+    }
+    if ($tok eq 'extern' || $tok eq 'static') {
+      $visibility = $tok;
+    }
+    elsif ($tok eq 'typedef') {
+      $pt_st = 1;
+    }
+    else {
+      if ($tok eq 'const' || $tok eq 'volatile') {
+        $pt_st = 2;
+      }
+      else {
+        $pt_st = ($tok eq 'struct' || $tok eq 'class' || $tok eq 'union' || $tok eq 'enum') ? 3 : 4;
+      }
+    }
+    return;
+  }
+  if ($pt_st == 1) {
+    return;
+  }
+  if ($pt_st == 2) {
+    unless ($type eq 'ident') {
+      $pt_st = 1;
+      return;
+    }
+    $pt_st = ($tok eq 'struct' || $tok eq 'class' || $tok eq 'union' || $tok eq 'enum') ? 3 : 4;
+    return;
+  }
+  if ($pt_st == 3) {
+    unless ($type eq 'ident') {
+      $pt_st = 1;
+      return;
+    }
+    $pt_st = 4;
+    return;
+  }
+  if ($pt_st == 4) {
+    if ($tok eq '__attribute__') {
+      $pt_st = 5;
+      return;
+    }
+    $id = $tok if $type eq 'ident';
+    return;
+  }
+  if ($pt_st == 5) {
+    return;
+  }
+  warn 'unpossible';
+}
+
+my $level = 0;
+
+sub parse($$);
+sub parse($$) {
+  my $src = shift;
+  my $end = shift;
+  my $tok;
+  my $type;
+
+  ++$level;
+  while (($src, $type, $tok) = next_token($src), defined($tok)) {
+    last if ($tok eq $end);
+    process_token($type, $tok) if ($level == 1);
+    $src = parse($src, ')') if ($tok eq '(');
+    $src = parse($src, '}') if ($tok eq '{');
+    $src = parse($src, ']') if ($tok eq '[');
+  }
+  --$level;
+  return $src;
+}
+
+sub process_files() {
+  my $gcc_out;
+  my $gcc_in;
+  my $src = '';
+
+  open2($gcc_in, $gcc_out, "$GCC") or die "can't run preprocessor $GCC";
+  foreach (@files) {
+    next unless $_;
+    $_ = file_contents($_);
+    next unless $_;
+    s/^\#include\s.+$//gm unless /weak\.h/;
+    $gcc_out->print($_);
+  }
+
+  undef $gcc_out; # else gcc won't produce output
+
+  while ($_ = <$gcc_in>, defined($_)) {
+    next if /^\s*$/;
+    next if /^#/;
+    chomp;
+    $src .= " $_";
+  }
+  return $src;
+}
+
+process_args;
+USAGE unless $GCC;
+USAGE unless scalar(@files);
+
+if (defined $libname) { 
+    print "LIBRARY $libname\n";
+    print "VERSION $libvers\n" if $libvers;
+    print "EXPORTS\n"; 
+    }
+parse(process_files(), '');
+
+exit 0;
diff --git a/build/make-vers-inc.sh b/build/make-vers-inc.sh
new file mode 100755
index 0000000..daff98c
--- /dev/null
+++ b/build/make-vers-inc.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# capture input
+if [ $# -eq 1 ]
+then
+    VERSION=$1
+    DEFINE=$(basename $VERSION)
+    DEFINE=$(echo $DEFINE | tr '[a-z].-' '[A-Z]__')
+elif [ $# -ne 2 ]
+then
+    echo "#error in makefile"
+    exit 1
+else
+    DEFINE=$1
+    VERSION=$2
+fi
+
+# split the version into separate integers
+SPLIT_VERS="$(cat $VERSION | tr '.' ' ')"
+
+# issue a single line define
+echo "#define $DEFINE $(printf 0x%02X%02X%04X $SPLIT_VERS)"
diff --git a/build/run_remotely.sh b/build/run_remotely.sh
new file mode 100755
index 0000000..11169f5
--- /dev/null
+++ b/build/run_remotely.sh
@@ -0,0 +1,124 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+VERBOSE=
+if [ "$VERBOSE" != "" ] ; then echo "$0 $*"; fi
+
+# ===========================================================================
+# run a command from a list on a (Windows) build server
+# $1 - path to proxy_exec
+# $2 - server name 
+# $3 - server port
+# $4 - server path mapped to a client dir (e.g. Z:)
+# $5 - client path to the dir mapped on the server
+# $6 - server path to the working directory (e.g. Z:internal\asm-trace)
+# $7 - output directory from server's prespective (e.g. Z:\win\lib)
+# $8 - output directory from client's perspective (e.g. internal/asm-trace/win/lib)
+# $9 - command (can be a single name e.g. cl, or a client path which will be translated into a server path) 
+# $... - arguments
+
+#TODO: translate command name to id
+
+PROXY_TOOL=$1
+if [ ! -e $PROXY_TOOL ]
+then
+    echo "$0 $*"
+    echo "$0: proxy tool ($1) is not found."
+    exit 5
+fi
+
+RHOST=$2
+RPORT=$3
+RHOME=$4
+LHOME=$5
+WORKDIR=$6
+ROUTDIR=$7
+LOUTDIR=$8
+CMD=$9
+shift 9
+ARGS=$*
+
+if [ "$VERBOSE" != "" ] 
+then 
+    echo "PROXY_TOOL=$PROXY_TOOL"
+    echo "RHOST     =$RHOST     "
+    echo "RPORT     =$RPORT     "
+    echo "RHOME     =$RHOME     "
+    echo "LHOME     =$LHOME     "
+    echo "WORKDIR   =$WORKDIR   "
+    echo "ROUTDIR   =$ROUTDIR   "
+    echo "LOUTDIR   =$LOUTDIR   "
+    echo "CMD       =$CMD       "
+    echo "ARGS      =$ARGS      "
+fi
+
+if [ $(eval "dirname \"$CMD\"") != "." ] 
+then # executable is located on the client; translate path for the server
+    if [ "$CMD" != "${CMD#$LHOME}" ] 
+    then
+        RCMD="$RHOME${CMD#$LHOME}.exe"
+    elif [ "$CMD" != "${CMD#$LOUTDIR}" ] 
+    then
+        RCMD="$ROUTDIR${CMD#$LOUTDIR}.exe"
+    else
+        RCMD="$CMD.exe"
+    fi
+
+    if [ "${WORKDIR}" == "." ] 
+    then # run in the directory of the executable
+        # use the original CMD
+        WORKDIR="${CMD%$(basename $CMD)}"
+    fi
+else # executable is located on the server
+    # workdir path translation is expected of the caller
+    RCMD=$CMD
+fi
+
+# translate WORKDIR
+if [ "$WORKDIR" != "${WORKDIR#$LHOME}" ] 
+then
+    WORKDIR="$RHOME${WORKDIR#$LHOME}"
+elif [ "$WORKDIR" != "${WORKDIR#$LOUTDIR}" ] 
+then
+    WORKDIR="$ROUTDIR${WORKDIR#$LOUTDIR}"
+fi
+
+if [ "$VERBOSE" != "" ] ; then echo "RCMD=$RCMD"; fi
+
+#translate slashes
+RCMD="$(echo $RCMD | tr '/' '\\')"
+WORKDIR="$(echo $WORKDIR | tr '/' '\\')"
+
+#extra quotes in case command's filename contains spaces
+if [[ "$RCMD" != "${RCMD/ /}" ]] ; then RCMD="\"$RCMD\""; fi
+
+if [ "$VERBOSE" != "" ] ; then echo "$PROXY_TOOL -D $WORKDIR -S $RHOST -P $RPORT"; fi
+if [ "$VERBOSE" != "" ] ; then echo "sending to stdin: $RCMD $ARGS"; fi
+
+echo "$RCMD $ARGS" | $PROXY_TOOL -D $WORKDIR -S $RHOST -P $RPORT
+exit $?
+
+
+
+
diff --git a/build/scm-collect.sh b/build/scm-collect.sh
new file mode 100755
index 0000000..6284c31
--- /dev/null
+++ b/build/scm-collect.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+OBJ_FILES="$1"
+LIB_FILES="$2"
+
+for f in $OBJ_FILES $LIB_FILES
+do
+    if [ ! -f $f.md5 ]
+    then
+        echo "$f.md5 not found" > /dev/stderr
+        exit 5
+    elif [ ! -r $f.md5 ]
+    then
+        echo "$f.md5 not readable" > /dev/stderr
+        exit 5
+    else
+        cat $f.md5
+    fi
+done
diff --git a/build/scm.sh b/build/scm.sh
new file mode 100755
index 0000000..e872ea3
--- /dev/null
+++ b/build/scm.sh
@@ -0,0 +1,136 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+BUILD_DIR="$(dirname $0)"
+TOP="$(dirname $BUILD_DIR)"
+SCM_DIR="$TOP/scm"
+
+MODULE_NAME="$1"
+CURMD5="$2"
+VERS_FILE="$3"
+
+# if the given versfile does not exist, bail out with no error
+[ -f "$VERS_FILE" ] || exit 0
+
+echo "*** start of scm-handler for $MODULE_NAME ***************************"
+
+#prepare the filenames we will use for the version-increment
+LOGFILE="$SCM_DIR/scm.log"
+PREVMD5="$SCM_DIR/$MODULE_NAME.pub"
+CANDMD5="$SCM_DIR/$MODULE_NAME.cand"
+
+# write a log entry, that a scm-run for this module is executed
+echo -e "\n$(date) ************* scm-run for $MODULE_NAME" >> $LOGFILE
+
+# if the current md5-file does not exist, bail out with error
+if [ ! -f "$CURMD5" ]
+then
+    MSG="current md5-file ($CURMD5) does not exist! SCM RUN TERMINATED!"
+    echo "$MSG"
+    echo "$MSG" >> $LOGFILE
+    exit 6
+fi
+
+
+# check if the current md5-file has the same content as in the
+# candidate md5-file, if yes bail out without error
+if diff -q "$CURMD5" "$CANDMD5" > /dev/null 2>&1
+then
+    MSG="cand. and curr. md5-files are equal, nothing to do!"
+echo "$MSG"
+    echo "$MSG" >> $LOGFILE
+    exit 0
+fi
+
+# check if the candidate md5-file does exist
+if [ ! -f "$CANDMD5" ]
+then
+    MSG="candidate md5-file does not exist."
+    echo "$MSG"
+    echo "$MSG" >> $LOGFILE
+
+    # if candidate-md5-file does not exist
+    # the last published too should not exist
+    if ! cp "$CURMD5" "$CANDMD5"
+    then
+        STATUS=$?
+        MSG="unable to create the candidate-md5-file"
+        echo "$MSG"
+        echo "$MSG" >> $LOGFILE
+        exit $STATUS
+    fi
+
+    # turn this on later
+    cvs add "$CANDMD5"
+    exit 0
+fi
+
+
+# if we reach this line, cand. and curr md5-file do exist
+# and differ in content
+MSG="cand. and curr. md5-files are different."
+echo "$MSG"
+echo "$MSG" >> $LOGFILE
+
+# check if the current md5-file has the same content as in the
+# previously published md5-file, if yes bail out without error
+if diff -q "$CANDMD5" "$PREVMD5" > /dev/null 2>&1
+then
+    CAND_PREV_EQUAL=1
+else
+    CAND_PREV_EQUAL=0
+fi
+
+# if the candidate-md5-file does exist, 
+# copy the current md5-file into the candidate-md5-file
+if ! cp "$CURMD5" "$CANDMD5"
+then
+    STATUS=$?
+    MSG="unable to update the candidate-md5-file"
+    echo "$MSG"
+    echo "$MSG" >> $LOGFILE
+    exit $STATUS
+fi
+
+if [ $CAND_PREV_EQUAL -eq 0 ]
+then
+    MSG="candidate and prev. published md5-files differ, nothing to do!"
+echo "$MSG"
+    echo "$MSG" >> $LOGFILE
+    exit
+fi
+
+# if a candidate file does not exist, the version has to be incremented
+OLDVERS=$(cat "$VERS_FILE")
+NEWVERS=$($BUILD_DIR/increment-release.sh $OLDVERS)
+MSG="version incremented from $OLDVERS to $NEWVERS"
+echo "$MSG"
+echo "$MSG" >> $LOGFILE
+echo $NEWVERS > $VERS_FILE
+
+# trigger a rebuild ( of this module )...
+touch "$BUILD_DIR/version-rebuild"
+
+echo "*** end of scm-handler for $MODULE_NAME *****************************"
diff --git a/build/scm.txt b/build/scm.txt
new file mode 100644
index 0000000..aa4f73e
--- /dev/null
+++ b/build/scm.txt
@@ -0,0 +1,117 @@
+SCM-Build
+---------
+
+(scm = software configuration management ?)
+
+(1) "scm" is a '.phony' target, implemented in Makefile.env
+    ( just like "out", "CC", "GCC", "ICC", "VC++", "debug",
+                "profile", "release", "purify", "purecov" )
+
+
+(2) "make scm" triggers the scm-target in Makefile.env,
+    the actions are:
+
+    @ echo scm > $(TOP)/build/BUILD.$(OS)
+    @ $(MAKE) TOP=$(TOP) -f $(TOP)/build/Makefile.env rebuild-dirlinks
+
+    - no actual compilation/linkage is performed
+    - the string "scm" is written into the build-file: build/BUILD.linux for instance
+        switching the build-system into "scm-mode"
+    - the directory links are rebuild (why?)
+
+
+(3) if the build-system is in "scm-mode", Makefile.env configures
+    makefile-variables like that:
+
+    ifeq (scm,$(BUILD))
+        DEBUG := -DNDEBUG
+        BUILDTYPE = rel
+        CHECKSUM := --checksum
+    endif
+
+    that means:
+        - a build in "scm-mode" is performed like a release-build
+        - the makefile-variable CHECKSUM is set to the value "--checksum"
+
+
+(4) the makefile-variable CHECKSUM is used in these Makefiles:
+        Makefile.cc, Makefile.gcc, Makefile.icc, Makefile.vc++
+    these 4 Makefiles add $CHECKSUM to the parameter-list of
+        CC, CP, LD and LP ( the platform specific compile- and link-scripts )
+
+
+(5) $CC and $CP gets called, because Makefile.rules do use them in their
+        list of rules that build the different kinds of object-files
+
+
+(6) $LD gets called, because it appears in the Makefile of every single
+        module, in the rule to build the final libs/binaries
+    $LP looks like never called by our build-system ( we do not link c++ targets ?)
+
+
+(7) the compiler-scripts cc.sh, win-cc.sh and sun-cc.sh pick up the "--checksum"
+        parameter and set the shell-variable CHECKSUM to 0 or 1
+
+
+(8) the cc.sh - script:
+    - ( in scm-mode ) performs a check that the target is not
+        undefined or malformed
+
+    - calls the compiler to build the object-file
+    
+    ( in scm-mode only )
+    - calls: strip $TARG.$OBJX -o $TARG.stripped.$OBJX
+        to strip away the symbol-names: renaming a variable
+        does not create a different checksum after that
+    - calls: MD5RES=`md5sum -b $TARG.stripped.$OBJX`
+        create a md5-sum of the stripped obj-file
+    - calls: rm -f "$TARG.stripped.$OBJX" || true
+        to remove the stripped obj-file
+    - calls: MD5VALUE=${MD5RES:0:32}
+        to pick the md5-sum only ( not the following filename )
+    - calls: echo "$TARG.$OBJX=$MD5VALUE" > "$TARG.md5"
+        creates a md5-file for every obj-file, that contains
+        the name of the obj-file followed by it's md5-sum
+
+(9) the ld.sh - script:
+    - to perform the link operation the ld.sh-script calls this script:
+        "$SCRIPT_BASE.$OS.$TYPE.sh"
+      ( which becomes: ld.linux.slib.sh / ld.linux.dlib.sh / 
+        ld.linux.exe.sh for instance )
+
+(10) the ld.linux.slib.sh / ld.linux.dlib.sh / ld.linux.exe.sh - scripts:
+    - define a shell-variable "SLIBS"
+    - accumulate the static-libs the target depends on in this shell-variable
+    - after producing the target, call the script: "scm-collect.sh"
+    - parameter to this call is the list of obj-file ($OBJS) and
+      the static dependencies ($SLIBS)
+
+(11) the scm-collect.sh - script:
+    - loops through the given obj-files and static dependencies
+    - for every item in the list it looks for its corresponding md5-file
+    - if the file exists and is readable
+    - prints the content of the file to stdout
+
+(12) back in the ld.linux.slib.sh / ld.linux.dlib.sh / ld.linux.exe.sh - scripts:
+    - pipe the output of the scm-collect.sh - script
+      through "sort -u" and redirect the output to "$TARG.md5"
+      ( sort -u to makes the file canonical and removes double dependencies )
+    - this creates a md5-file for every lib/executable built
+      in the output-directory of the module
+      (for the kfs-module for instance the files "libkfs.a.md5" and
+       "libkfs.so.md5" are created in "output/centos/scm/gcc/x86_64/lib"
+    - these files are the "current-md5-file" for the scm.sh-script
+
+(13) back in the ld.sh - script:
+    - after creating the soft-links for the lib/executable
+    - if in scm-mode and building for linux,
+    - if building a dynamic-lib or an executable,
+    - the "scm.sh" - script is called
+    - the parameters are: module-name, current-md5-file and version-file
+
+(14) the scm.sh - script:
+    - creates a scm-dir underneath the build-dir (if it does not exist)
+    - checks if the current-md5-file exists ( exits with error if not )
+    - compares the current-md5-file with the candidate-md5-file
+      ( exits with exit-code=0 if they are identical = nothing to do )
+    - 
\ No newline at end of file
diff --git a/build/sra-dflt-schema.sh b/build/sra-dflt-schema.sh
new file mode 100755
index 0000000..78c89ad
--- /dev/null
+++ b/build/sra-dflt-schema.sh
@@ -0,0 +1,163 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# prepare script name
+SELF_NAME="$(basename $0)"
+SCRIPT_BASE="${0%.sh}"
+
+# os
+OS="$1"
+shift
+
+# binary compiler
+CC="$1"
+shift 
+
+# everything except windows is fine as-is
+if [[ "$OS" != "win" && "$OS" != "rwin" ]]
+then 
+    echo "$CC $*"
+    $CC $*
+    exit $?
+fi
+
+if [[ "$OS" == "rwin" ]]
+then # for rwin, $CC is a multi-word string; extract server location data from it:
+#                $(TOP)/build/run_remotely.sh $(PROXY_TOOL) $(RHOST) $(RPORT) $(RHOME) $(LHOME) $(TOP) $(ROUTDIR) $(LOUTDIR) $(SCHEMA_EXE)
+    PARMS=($CC)
+    RHOME=${PARMS[4]}
+    LHOME=${PARMS[5]}
+    ROUTDIR=${PARMS[7]}
+    LOUTDIR=${PARMS[8]}
+fi
+
+# state
+unset ARGS
+unset DEPENDENCIES
+unset DEPTARG
+unset TARG
+
+function convert_src_path
+{
+    if [[ "$OS" != "rwin" ]]
+    then
+        convert_path_result="$(cygpath -w $1)"
+    elif [ "$1" != "${1#$LHOME}" ] 
+    then
+        convert_path_result="$RHOME${1#$LHOME}"
+        convert_path_result="$(echo $convert_path_result | tr '/' '\\')"
+    else
+        convert_path_result="$1"
+    fi
+}
+function convert_out_path
+{
+    if [[ "$OS" != "rwin" ]]
+    then
+        convert_path_result="$(cygpath -w $1)"
+    elif [ "$1" != "${1#$LOUTDIR}" ] 
+    then
+        convert_path_result="$ROUTDIR${1#$LOUTDIR}"
+        convert_path_result="$(echo $convert_path_result | tr '/' '\\')"
+    else
+        convert_path_result="$1"
+    fi
+}
+
+
+# process parameters for windows
+while [ $# -ne 0 ]
+do
+
+    case "$1" in
+    -o*)
+        ARG="${1#-o}"
+        if [ "$ARG" = "" ]
+        then
+            ARG="$2"
+            shift
+        fi
+        TARG="$ARG"
+        convert_out_path $ARG
+        ARGS="$ARGS -o${convert_path_result}"
+        ;;
+
+    -I*)
+        ARG="${1#-I}"
+        if [ "$ARG" = "" ]
+        then
+            ARG="$2"
+            shift
+        fi
+        
+        convert_src_path $ARG
+        ARGS="$ARGS -I${convert_path_result}"
+        ;;
+
+    -T*)
+        ARG="${1#-T}"
+        if [ "$ARG" = "" ]
+        then
+            ARG="$2"
+            shift
+        fi
+        DEPTARG="$ARG"
+        DEPENDENCIES=1
+        convert_out_path $ARG
+        ARGS="$ARGS -T${convert_path_result}"
+        ;;
+
+    -L*)
+        LHOME="${1#-L}"
+        ;;
+    -R*)
+        RHOME="${1#-R}"
+        ;;
+    
+    *)
+        convert_src_path $1
+        ARGS="$ARGS ${convert_path_result}"
+        ;;
+
+    esac
+
+    shift
+
+done
+
+echo "$CC $ARGS"
+$CC $ARGS
+STATUS=$?
+if [[ ${STATUS} != 0 ]]
+then
+    rm -f $TARG $DEPTARG
+    exit ${STATUS}
+fi
+
+if [ $DEPENDENCIES -eq 1 ]
+then
+    # fix this
+    rm -f $DEPTARG
+fi
diff --git a/build/tag-module.sh b/build/tag-module.sh
new file mode 100755
index 0000000..12fb498
--- /dev/null
+++ b/build/tag-module.sh
@@ -0,0 +1,213 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# check for '-F' switch
+if [ "$1" = "-F" ]
+then
+    CVSTAG="cvs tag $1"
+    shift 1
+else
+    CVSTAG="cvs tag"
+fi
+
+# check for '-V' switch
+if [ "$1" = "-V" ]
+then
+    VERSFILE="$2"
+    shift 2
+else
+    VERSFILE=""
+fi
+
+# gather parameters
+TOP=$(dirname $0)
+cd $TOP/..
+TOP=$(pwd)
+MODULE=$1
+LIBRARY=$2
+shift 2
+
+# version file
+if [ "$VERSFILE" = "" ]
+then
+    if [ ! -r $MODULE/$LIBRARY.vers ]
+    then
+        echo "cannot access $MODULE/$LIBRARY.vers"
+        exit 1
+    fi
+
+    VERSFILE="$MODULE/$LIBRARY.vers"
+fi
+
+# version
+VERSION=$(cat $VERSFILE)
+
+# build parameters
+BUILD=$(cat ./build/BUILD)
+COMP=$(cat ./build/COMP)
+OUTDIR=$(cat ./build/OUTDIR)
+cd $OUTDIR
+OUTDIR=$(pwd)
+cd -
+
+# architecture
+ARCH=$(uname -m)
+if [ "$ARCH" = "i486" ] || [ "$ARCH" = "i586" ] || [ "$ARCH" = "i686" ]
+then
+    ARCH=i386
+fi
+
+# object directory
+OBJDIR=$OUTDIR/$BUILD/$COMP/$ARCH/obj/$MODULE
+if [ ! -d $OBJDIR ]
+then
+    echo "cannot access $OBJDIR"
+    exit 1
+fi
+
+# tag name
+TAGVERS=$(echo $VERSION | tr '.' '_')
+if [ "$BUILD" = "rel" ]
+then
+    TAG="$LIBRARY-$TAGVERS"
+else
+    TAG="$BUILD-$LIBRARY-$TAGVERS"
+fi
+
+# include make files in sources
+SOURCES="$(find build -name 'Makefile*' -a ! -name '*~')"
+if [ -f $MODULE/Makefile ]
+then
+    SOURCES="$SOURCES $MODULE/Makefile"
+fi
+
+# also include the version file if within the module
+if [ "$VERSFILE" = "$MODULE/$LIBRARY.vers" ]
+then
+    SOURCES="$SOURCES $VERSFILE"
+fi
+
+# allow direct specification of source files
+if [ "$1" = "-S" ]
+then
+    shift
+
+    # take list of sources as given
+    for sfile in $*
+    do
+
+        # source file must be within our tree
+        if [ "$sfile" = "${sfile#$TOP}" ]
+        then
+
+            # get path portion of source file
+            spath=$(dirname $sfile)
+
+            # look for absolute or project relative
+            if [ -f "$sfile" ]
+            then
+                cd "$spath"
+                spath="$(pwd)"
+                cd -
+
+            # look for module relative
+            elif [ -f "$MODULE/$sfile" ]
+            then
+                cd "$MODULE/$spath"
+                spath="$(pwd)"
+                cd -
+            fi
+
+            # retest path
+            if [ "$spath" = "${spath#$TOP}" ]
+            then
+                echo "source file '$sfile' is not within project"
+                exit 1
+            fi
+
+            # create full path
+            sfile="$spath/$(basename $sfile)"
+        fi
+
+        # crop it
+        sfile="${sfile#$TOP/}"
+        SOURCES="$SOURCES $sfile"
+
+    done
+
+else
+
+    # derive source files from dependency files
+    for ofile in $*
+    do
+        # create dependency file name
+        dfile=${ofile%o}d
+
+        # test for it
+        if [ ! -r $OBJDIR/$dfile ]
+        then
+            echo "cannot locate dependency file '$OBJDIR/$dfile'"
+            exit 1
+        fi
+
+        # read it
+        for sfile in $(cat $OBJDIR/$dfile)
+        do
+            # source file must be within our tree
+            # and should not be a generated version include
+            if [ "$sfile" != "${sfile#$TOP}" ] && [ "$sfile" = "${sfile%.vers.h}" ]
+            then
+                # crop it
+                sfile="${sfile#$TOP/}"
+
+                # special case include files in 'inc'
+                # in order to catch all configurations
+                if [ "$sfile" != "${sfile#inc/}" ]
+                then
+                    sfile=$(basename $sfile)
+                    sfile="$(find inc -name $sfile)"
+                fi
+            
+                SOURCES="$SOURCES $sfile"
+            fi
+
+        done
+
+    done
+fi
+
+# must have source files
+if [ "$SOURCES" = "" ]
+then
+    echo "no source files could be found for $LIBRARY"
+    exit 1
+fi
+
+# reduce them to an unique set
+SOURCES="$(echo "$SOURCES" | tr ' ' '\n' | sort -u | tr '\n' ' ')"
+
+# apply tag
+echo -e "\ntagging $TAG within $MODULE"
+$CVSTAG $TAG $SOURCES
diff --git a/build/valgrind.suppress b/build/valgrind.suppress
new file mode 100644
index 0000000..452a4e8
--- /dev/null
+++ b/build/valgrind.suppress
@@ -0,0 +1,21 @@
+{
+   static_cached_KDirectory_in_KConfig_find_home_directory
+   Memcheck:Leak
+    ...
+   fun:find_home_directory
+}
+{
+   vt_cache
+   Memcheck:Leak
+   fun:calloc
+   fun:_ZN3ngs7Resolve*
+}
+{
+   ktst_exception_in_child_process
+   Memcheck:Leak
+   match-leak-kinds: possible
+   fun:malloc
+   fun:__cxa_allocate_exception
+   ...
+   fun:_ZN16ChildProcessFail8Instance11test_methodEv
+}
\ No newline at end of file
diff --git a/build/wait_for_file.sh b/build/wait_for_file.sh
new file mode 100755
index 0000000..dd6059e
--- /dev/null
+++ b/build/wait_for_file.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# wait for a file to become available (used in remote builds to handle delays introduced by the network file system)
+# $1 - file to wait for
+# $2 - timeout (seconds), optional, default 120s
+# return codes: 
+#   0 ok, 
+#   1 timed out, 
+#   2 no file specified, 
+#   3 timeout not numeric
+
+if [ "$1" != "" ] 
+then
+    FILE=$1
+else
+    echo "$0 $*: no file specified" >&2
+    exit 2
+fi     
+
+if [ "$2" == "" ] 
+then 
+    TIMEOUT=120
+elif [[ $2 =~ ([0-9])+ ]]
+then 
+    TIMEOUT=$2
+else
+    echo "$0 $*: timeout not a number" >&2
+    exit 3
+fi
+
+for (( i=0; i < ${TIMEOUT}; i++ ))
+do
+    # give nfs a nudge
+    ls $(dirname $FILE) >/dev/null  
+    if [ -e ${FILE} ]
+    then
+        exit 0
+    fi 
+    echo "waiting for '$FILE' ..."
+    sleep 1s
+done
+exit 1
diff --git a/configure b/configure
new file mode 100755
index 0000000..baa556f
--- /dev/null
+++ b/configure
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+FILENAME="`basename $0`"
+CURDIR="`dirname $0`"
+
+if [ -z "$CURDIR" ]
+    then
+    echo configure: error: configure should be run as ./configure
+    exit 1
+fi
+
+if [ "$FILENAME" != configure -a ! -s setup/konfigure.perl ]
+    then
+    echo configure: error: configure should be run as ./configure
+else
+    perl -v > /dev/null 2>&1 || { echo "checking for perl... no"; \
+        echo >&2 "configure: error: perl not found."; exit 1; }
+
+    cd $CURDIR/setup
+    perl -w konfigure.perl "$@"
+fi
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index ca78035..0000000
Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index aad2b24..0000000
--- a/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Fri May 13 14:00:35 EDT 2016
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-bin.zip
diff --git a/gradlew b/gradlew
deleted file mode 100755
index 27309d9..0000000
--- a/gradlew
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-##  Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
-    echo "$*"
-}
-
-die ( ) {
-    echo
-    echo "$*"
-    echo
-    exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "`uname`" in
-  CYGWIN* )
-    cygwin=true
-    ;;
-  Darwin* )
-    darwin=true
-    ;;
-  MINGW* )
-    msys=true
-    ;;
-  NONSTOP* )
-    nonstop=true
-    ;;
-esac
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-        # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-        JAVACMD="$JAVA_HOME/bin/java"
-    fi
-    if [ ! -x "$JAVACMD" ] ; then
-        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-    fi
-else
-    JAVACMD="java"
-    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
-    MAX_FD_LIMIT=`ulimit -H -n`
-    if [ $? -eq 0 ] ; then
-        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
-            MAX_FD="$MAX_FD_LIMIT"
-        fi
-        ulimit -n $MAX_FD
-        if [ $? -ne 0 ] ; then
-            warn "Could not set maximum file descriptor limit: $MAX_FD"
-        fi
-    else
-        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
-    fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
-    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
-    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
-    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-    JAVACMD=`cygpath --unix "$JAVACMD"`
-
-    # We build the pattern for arguments to be converted via cygpath
-    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
-    SEP=""
-    for dir in $ROOTDIRSRAW ; do
-        ROOTDIRS="$ROOTDIRS$SEP$dir"
-        SEP="|"
-    done
-    OURCYGPATTERN="(^($ROOTDIRS))"
-    # Add a user-defined pattern to the cygpath arguments
-    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
-        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
-    fi
-    # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    i=0
-    for arg in "$@" ; do
-        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
-        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
-
-        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
-            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
-        else
-            eval `echo args$i`="\"$arg\""
-        fi
-        i=$((i+1))
-    done
-    case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
-    esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
-    JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/interfaces/.gitignore
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to interfaces/.gitignore
diff --git a/interfaces/align/align-access.h b/interfaces/align/align-access.h
new file mode 100644
index 0000000..3e2fc83
--- /dev/null
+++ b/interfaces/align/align-access.h
@@ -0,0 +1,350 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_align_align_access_
+#define _h_align_align_access_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VPath;
+
+
+/*--------------------------------------------------------------------------
+ * constants
+ */
+typedef uint8_t AlignmentStrandDirection;
+enum
+{
+    asd_Unknown, /* e.g. an error occured */
+    asd_Forward = 'F',
+    asd_Reverse = 'R'
+};
+
+
+/*--------------------------------------------------------------------------
+ * AlignAccessMgr
+ *  opaque handle to library
+ */
+typedef struct AlignAccessMgr AlignAccessMgr;
+
+/* Make
+ *  make a manager for read-only access
+ */
+ALIGN_EXTERN rc_t CC AlignAccessMgrMake ( const AlignAccessMgr **mgr );
+
+/* AddRef
+ * Release
+ */
+ALIGN_EXTERN rc_t CC AlignAccessMgrAddRef ( const AlignAccessMgr *self );
+ALIGN_EXTERN rc_t CC AlignAccessMgrRelease ( const AlignAccessMgr *self );
+
+
+
+/*--------------------------------------------------------------------------
+ * AlignAccessDB
+ *  opaque handle to database
+ */
+typedef struct AlignAccessDB AlignAccessDB;
+
+/* Make
+ *  make a read-only database handle from BAM file
+ *  where the BAM file is treated as the entire database
+ *
+ *  "bam" [ IN ] - NUL terminated POSIX path in UTF-8 character set
+ *  designating BAM file
+ *
+ *  "bam_index" [ IN ] - NUL terminated POSIX path in UTF-8 character
+ *  set designating BAM index file
+ *
+ * NB - on Windows, these paths should be converted POSIX-style
+ */
+ALIGN_EXTERN rc_t CC AlignAccessMgrMakeBAMDB ( const AlignAccessMgr *self,
+    const AlignAccessDB **db, struct VPath const *bam );
+ALIGN_EXTERN rc_t CC AlignAccessMgrMakeIndexBAMDB ( const AlignAccessMgr *self,
+    const AlignAccessDB **db, struct VPath const *bam, struct VPath const *bam_index );
+
+/* AddRef
+ * Release
+ */
+ALIGN_EXTERN rc_t CC AlignAccessDBAddRef ( const AlignAccessDB *self );
+ALIGN_EXTERN rc_t CC AlignAccessDBRelease ( const AlignAccessDB *self );
+
+
+
+/*--------------------------------------------------------------------------
+ * AlignAccessRefSeqEnumerator
+ *  an enumerator onto available reference sequences
+ */
+typedef struct AlignAccessRefSeqEnumerator AlignAccessRefSeqEnumerator;
+
+#define AlignAccessRefSeqEnumeratorEOFCode (RC(rcAlign, rcTable, rcReading, rcRow, rcNotFound))
+#define AlignAccessRefSeqEnumeratorIsEOF(RESULT_CODE) (GetRCObject(RESULT_CODE) == rcRow && GetRCState(RESULT_CODE) == rcNotFound)
+
+/* EnumerateRefSequences
+ *  make an enumerator of reference sequences visible in database
+ *
+ *  "refseq_enum" [ OUT ] - return parameter for enumerator
+ *
+ *  return codes:
+ *   object: rcRow, state: rcNotFound - if the index is empty
+ */
+ALIGN_EXTERN rc_t CC AlignAccessDBEnumerateRefSequences ( const AlignAccessDB *self,
+    AlignAccessRefSeqEnumerator **refseq_enum );
+
+
+/* AddRef
+ * Release
+ */
+ALIGN_EXTERN rc_t CC AlignAccessRefSeqEnumeratorAddRef ( const AlignAccessRefSeqEnumerator *self );
+ALIGN_EXTERN rc_t CC AlignAccessRefSeqEnumeratorRelease ( const AlignAccessRefSeqEnumerator *self );
+
+/* advance the enumerator to the next element
+ *
+ *  return codes:
+ *   object: rcRow, state: rcNotFound - if there is no next element
+ */
+ALIGN_EXTERN rc_t CC AlignAccessRefSeqEnumeratorNext(const AlignAccessRefSeqEnumerator *cself);
+
+/* GetID
+ *  get text id of reference sequence
+ *
+ *  "id_buffer" [ IN ] and "buffer_size" [ IN ] - return buffer for
+ *  NUL terminated ASCII id
+ *
+ *  "id_size" [ OUT, NULL OKAY ] - optional return parameter for length
+ */
+ALIGN_EXTERN rc_t CC AlignAccessRefSeqEnumeratorGetID ( const AlignAccessRefSeqEnumerator *self,
+    char *id_buffer, size_t buffer_size, size_t *id_size );
+    
+/* GetLength
+ *  get text id of reference sequence
+ */
+ALIGN_EXTERN rc_t CC AlignAccessRefSeqEnumeratorGetLength
+    ( const AlignAccessRefSeqEnumerator *self, uint64_t *length );
+
+
+/*--------------------------------------------------------------------------
+ * AlignAccessAlignmentEnumerator
+ *  an enumerator onto alignments
+ */
+typedef struct AlignAccessAlignmentEnumerator AlignAccessAlignmentEnumerator;
+
+#define AlignAccessAlignmentEnumeratorEOFCode (RC(rcAlign, rcTable, rcReading, rcRow, rcNotFound))
+#define AlignAccessAlignmentEnumeratorIsEOF(RESULT_CODE) (GetRCObject(RESULT_CODE) == rcRow && GetRCState(RESULT_CODE) == rcNotFound)
+
+/* EnumerateAlignments
+ *  make an enumerator of all alignments in database
+ *
+ *  "align_enum" [ OUT ] - return parameter for enumerator
+ *
+ *  return codes:
+ *   object: rcRow, state: rcNotFound - if there is no first element
+ *
+ * NB - this is a BAD interface, here only to support dumping a BAM file
+ *  it may not be available under all circumstances
+ */
+ALIGN_EXTERN rc_t CC AlignAccessDBEnumerateAlignments ( const AlignAccessDB *self,
+    AlignAccessAlignmentEnumerator **align_enum );
+
+
+/* WindowedAlignments
+ *  make an enumerator of alignments within a window of a reference sequence
+ *
+ *  "align_enum" [ OUT ] - return parameter for enumerator
+ *
+ *  "refseq_id" [ IN ] - NUL terminated ASCII string giving reference sequence id
+ *
+ *  "pos" [ IN ] and "wsize" [ IN ] - starting position and size of window
+ *  on reference sequence
+ *
+ *  return codes:
+ *   object: rcRow, state: rcNotFound - if there is no first element
+ */
+ALIGN_EXTERN rc_t CC AlignAccessDBWindowedAlignments ( const AlignAccessDB *self,
+    AlignAccessAlignmentEnumerator **align_enum, const char *refseq_id,
+    uint64_t pos, uint64_t wsize );
+
+
+/* AddRef
+ * Release
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorAddRef ( const AlignAccessAlignmentEnumerator *self );
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorRelease ( const AlignAccessAlignmentEnumerator *self );
+
+
+/* Next
+ * advance the enumerator to the next element
+ *
+ *  return codes:
+ *   object: rcRow, state: rcNotFound - if there is no next element
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorNext ( const AlignAccessAlignmentEnumerator *self );
+
+
+/* GetRefSeqID
+ *  return id of reference sequence
+ *
+ *  "id_buffer" [ IN ] and "buffer_size" [ IN ] - return buffer for
+ *  NUL terminated ASCII id
+ *
+ *  "id_size" [ OUT, NULL OKAY ] - optional return parameter for length
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetRefSeqID ( const AlignAccessAlignmentEnumerator *self,
+    char *id_buffer, size_t buffer_size, size_t *id_size );
+
+
+/* GetRefSeqPos
+ *  return starting position of alignment on reference sequence
+ *
+ *  "start_pos" [ OUT ] - return parameter for starting position
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetRefSeqPos ( const AlignAccessAlignmentEnumerator *self,
+    uint64_t *start_pos );
+    
+/* GetRefSeqPos
+ *  return starting position of alignment on reference sequence
+ *
+ *  "start_pos" [ OUT ] - return parameter for starting position
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetRefSeqLen ( const AlignAccessAlignmentEnumerator *self,
+                                                                 uint32_t *ref_len );
+
+    
+/* GetShortSeqID
+ *  return accession id of aligned short sequence
+ *
+ *  "id_buffer" [ IN ] and "buffer_size" [ IN ] - return buffer for
+ *  NUL terminated ASCII id
+ *
+ *  "id_size" [ OUT, NULL OKAY ] - optional return parameter for length
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetShortSeqAccessionID
+    ( const AlignAccessAlignmentEnumerator *self, char *id_buffer, size_t buffer_size, size_t *id_size );
+
+    
+/* GetShortSeqID
+ *  return id of aligned short sequence
+ *
+ *  "id_buffer" [ IN ] and "buffer_size" [ IN ] - return buffer for
+ *  NUL terminated ASCII id
+ *
+ *  "id_size" [ OUT, NULL OKAY ] - optional return parameter for length
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetShortSeqID
+    ( const AlignAccessAlignmentEnumerator *self, char *id_buffer, size_t buffer_size, size_t *id_size );
+
+
+/* GetMapQuality
+ *  return sequence alignment mapping quality score
+ *
+ *  "score" [ OUT ] - return parameter for mapping quality score (phred-like)
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetMapQuality ( const AlignAccessAlignmentEnumerator *self,
+                                             uint8_t *score );
+    
+/* GetCIGAR
+ *  return sequence alignment information
+ *
+ *  "start_pos" [ OUT, NULL OKAY ] - return parameter for starting position
+ *
+ *  "cigar_buffer" [ IN, NULL OKAY ] and "buffer_size" [ IN ] - return buffer for CIGAR NUL-terminated
+ *  alignment description; null okay if cigar_size not null
+ *  
+ *  "cigar_size" [ OUT, NULL OKAY ] - optional return parameter for CIGAR string length; null ok
+ *  if cigar_buffer not null
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetCIGAR ( const AlignAccessAlignmentEnumerator *self,
+    uint64_t *start_pos, char *cigar_buffer, size_t buffer_size, size_t *cigar_size );
+
+
+/* GetShortSequence
+ *  return short sequence
+ *
+ *  "seq_buffer" [ IN ] and "buffer_size" [ IN ] - return buffer for short sequence
+ *  
+ *  "seq_size" [ OUT ] - return parameter for sequence length
+ *
+ * NB - BAM states that the sequence will be bases in FASTA.
+ *  we will be extending this interface to provide type information
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetShortSequence ( const AlignAccessAlignmentEnumerator *self,
+    char *seq_buffer, size_t buffer_size, size_t *seq_size );
+
+
+/* GetStrandDirection
+ *  returns property
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetStrandDirection
+    ( const AlignAccessAlignmentEnumerator *self, AlignmentStrandDirection *result );
+
+    
+/* GetIsPaired
+ *  returns paired property
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetIsPaired
+    ( const AlignAccessAlignmentEnumerator *self, bool *result );
+
+/* GetIsFirstInPair
+ *  get property
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetIsFirstInPair
+    ( const AlignAccessAlignmentEnumerator *self, bool *result );
+
+/* GetIsSecondInPair
+ *  get property
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetIsSecondInPair
+    ( const AlignAccessAlignmentEnumerator *self, bool *result );
+
+    
+/* GetRecordID
+ *  get property
+ *
+ * A locally unique identifier for each record.  When enumerators from the same
+ * AlignAccessDB object fetch the same record, they will return the same ID.
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetRecordID
+    ( const AlignAccessAlignmentEnumerator *self, uint64_t *result );
+    
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_align_access_ */
diff --git a/interfaces/align/align.h b/interfaces/align/align.h
new file mode 100644
index 0000000..059f7e6
--- /dev/null
+++ b/interfaces/align/align.h
@@ -0,0 +1,70 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_align_align_
+#define _h_align_align_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*==========================================================================
+ * ALIGN types, constants
+ */
+
+
+/*--------------------------------------------------------------------------
+ * ploidy
+ */
+typedef uint32_t NCBI_align_ploidy;
+
+
+/*--------------------------------------------------------------------------
+ * ro_type
+ *  ref-offset type
+ */
+typedef uint8_t NCBI_align_ro_type;
+
+enum
+{
+    NCBI_align_ro_normal            = 0, /* normal ref-offset           */
+    NCBI_align_ro_soft_clip         = 1, /* soft-clipping               */
+    NCBI_align_ro_intron_plus       = 2, /* intron on positive strand   */
+    NCBI_align_ro_intron_minus      = 3, /* intron on negative strand   */
+    NCBI_align_ro_intron_unknown    = 4, /* intron strand not specified */
+    NCBI_align_ro_complete_genomics = 5  /* (future)                    */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_align_align_ */
diff --git a/interfaces/align/align.vschema b/interfaces/align/align.vschema
new file mode 100644
index 0000000..2ea8b96
--- /dev/null
+++ b/interfaces/align/align.vschema
@@ -0,0 +1,1610 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * VDB Alignment types, functions and tables
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'ncbi/seq.vschema';
+include 'ncbi/sra.vschema';
+include 'ncbi/stats.vschema';
+include 'align/seq.vschema';
+include 'align/qstat.vschema';
+include 'sra/abi.vschema';
+include 'align/mate-cache.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * data types
+ */
+
+/* ploidy
+ *  the number of sets of chromosomes in a cell
+ */
+typedef U32 NCBI:align:ploidy;
+
+/* ro_type
+ *  the type of event causing ref-offset
+ */
+typedef U8 NCBI:align:ro_type;
+
+const NCBI:align:ro_type NCBI:align:ro_normal            = 0; // normal ref-offset
+const NCBI:align:ro_type NCBI:align:ro_soft_clip         = 1; // soft-clipping
+const NCBI:align:ro_type NCBI:align:ro_intron_plus       = 2; // intron on positive strand
+const NCBI:align:ro_type NCBI:align:ro_intron_minus      = 3; // intron on negative strand
+const NCBI:align:ro_type NCBI:align:ro_intron_unknown    = 4; // intron strand not specified
+const NCBI:align:ro_type NCBI:align:ro_complete_genomics = 5; // 
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+
+/* cigar
+ *  construct "cigar" alignment string or length arrays
+ *
+ * "ctype" [ CONST ] - select variant of format
+ *   0 => both matches and mismatches represented as M
+ *   1 => matches represented as '=' mismatches as 'X'
+ *
+ *  "has_mismatch" [ DATA ] - a boolean for each base in aligned sequence
+ *   where a value of false means the base aligned to the reference
+ *
+ *  "has_ref_offset" [ DATA ] - a boolean for each base in the aligned sequence
+ *   where a value of true means there is a corresponding offset to position on reference
+ *
+ *  "ref_offset" [ DATA ] - a packed sequence of signed offsets to aligned position
+ *   one entry for every true in "has_ref_offset"
+ *
+ *  "read_len" [ DATA ] - v2: elem_count defines PLOIDY and values are an actual length of reads in spot
+ */
+extern function
+ascii NCBI:align:cigar #1 < U8 ctype > ( bool has_mismatch, bool has_ref_offset,
+    I32 ref_offset, * INSDC:coord:len ref_len ) = ALIGN:cigar;
+
+/* history:
+ *  2.1 - added "ref_offset_type" optional parameter
+ *  NB - reverting to 2.0 due to linker bug in older code
+ */
+extern function < type T >
+T NCBI:align:cigar #2.0 < U8 ctype > ( bool has_mismatch, bool has_ref_offset,
+        I32 ref_offset, INSDC:coord:len read_len, * INSDC:coord:len ref_len, NCBI:align:ro_type ref_offset_type )
+    = ALIGN:cigar_2;
+
+extern function U32 NCBI:align:edit_distance #1
+    ( bool has_mismatch, bool has_ref_offset, I32 ref_offset );
+
+extern function U32 NCBI:align:edit_distance #2
+    ( bool has_mismatch, bool has_ref_offset, I32 ref_offset, INSDC:coord:len ref_len, *INSDC:coord:len read_len)
+  = NCBI:align:edit_distance_2;
+
+extern function U32 NCBI:align:edit_distance #3
+    ( bool has_mismatch, bool has_ref_offset, I32 ref_offset, NCBI:align:ro_type ref_offset_type, INSDC:coord:len read_len)
+  = NCBI:align:edit_distance_3;
+
+/* rna_orientation
+ *  reads column REF_OFFSET_TYPE
+ *  returns '+' if has:
+ *      at least one NCBI:align:ro_intron_plus
+ *      none of NCBI:align:ro_intron_minus
+ *  returns '-' if has:
+ *      at least one NCBI:align:ro_intron_minus
+ *      none of NCBI:align:ro_intron_plus
+ *  returns empty string otherwise
+ */
+extern function
+ascii NCBI:align:rna_orientation #1 ( NCBI:align:ro_type ref_offset_type );
+
+/* project_from_sequence
+ *  projects column from SEQUENCE
+ *
+ *  "T" [ TYPE ]
+ *
+ *  "col" [ CONST ]
+ *  "use_read_len" [ CONST ] whether subset by read_len or by read_id only
+ *
+ *  "seq_spot_id" [ DATA ]
+ *
+ *  "seq_read_id" [ DATA ]
+ */
+extern function < type T >
+T NCBI:align:project_from_sequence #1 < ascii col> ( I64 seq_spot_id, INSDC:coord:one seq_read_id )
+    = ALIGN:project_from_sequence;
+
+
+/* align_restore_read
+ *  restores read by applying alignment-based difference to ref_read
+ *
+ *  "ref_read" [ DATA ]
+ *
+ *  "has_mismatch" [ DATA ] and "mismatch" [ DATA ]
+ *
+ *  "has_ref_offset" [ DATA ] and "ref_offset" [ DATA ]
+ */
+extern function
+INSDC:4na:bin NCBI:align:align_restore_read #1 ( INSDC:4na:bin ref_read, bool has_mismatch,
+        INSDC:4na:bin mismatch, bool has_ref_offset, I32 ref_offset * INSDC:coord:len read_len)
+    = ALIGN:align_restore_read;
+
+
+/* raw_restore_read
+ *  restores read by applying alignment-based difference to align_read
+ *
+ *  "align_read" [ DATA ]
+ *
+ *  "ref_orientation" [ DATA ]
+ */
+extern function
+INSDC:4na:bin NCBI:align:raw_restore_read #1 ( INSDC:4na:bin align_read, bool ref_orientation )
+    = ALIGN:raw_restore_read;
+
+
+/* raw_restore_qual
+ *  restores quality by applying alignment-based difference to align_qual
+ *
+ *  "align_qual" [ DATA ]
+ *
+ *  "ref_orientation" [ DATA ]
+ */
+extern function
+INSDC:quality:phred NCBI:align:raw_restore_qual #1 ( INSDC:quality:phred align_qual, bool ref_orientation );
+
+
+/* ref_sub_select
+ *  projects reference from sequence
+ *
+ *  "id" [ DATA ]
+ *
+ *  "start" [ DATA ] and "len" [ DATA ]
+ *
+ *  "ref_ploidy" [ DATA, OPTIONAL ]
+ */
+extern function
+INSDC:4na:bin NCBI:align:ref_sub_select #1 ( I64 id, INSDC:coord:zero start,
+        INSDC:coord:len len * U32 ref_ploidy)
+    = ALIGN:ref_sub_select;
+
+
+/* ref_restore_read
+ *  restores read from central storage
+ *
+ *  "cmp_rd" [ DATA ]
+ *
+ *  "seq_id" [ DATA ]
+ *
+ *  "seq_start" [ DATA ] and "seq_len" [ DATA ]
+ */
+extern function
+INSDC:4na:bin NCBI:align:ref_restore_read #1 ( INSDC:4na:bin cmp_rd, ascii seq_id,
+        INSDC:coord:one seq_start, INSDC:coord:len seq_len)
+    = ALIGN:ref_restore_read;
+
+
+/* seq_restore_read
+ *  projects read from align_deflate table to SEQUENCE
+ *
+ *  "cmp_rd" [ DATA ]
+ *
+ *  "align_id" [ DATA ]
+ *
+ *  "read_len" [ DATA ]
+ *
+ *  "rd_type" [ DATA ]
+ */
+extern function
+INSDC:4na:bin NCBI:align:seq_restore_read #1 ( INSDC:4na:bin cmp_rd, I64 align_id,
+        INSDC:coord:len read_len, INSDC:SRA:xread_type rd_type )
+    = ALIGN:seq_restore_read;
+
+
+/* seq_restore_linkage_group
+ *  projects LINKAGE_GROUP from PRIMARY_ALIGNMENT table to SEQUENCE
+ *
+ *  "cmp_linkage_group" [ DATA ]
+ *
+ *  "align_id" [ DATA ]
+ */
+extern function
+ascii NCBI:align:seq_restore_linkage_group #1 ( ascii cmp_linkage_group,
+                                                I64 align_id )
+    = ALIGN:seq_restore_linkage_group;
+
+
+/* generate_has_mismatch
+ *  generates has mismatch by doing actual compare of reference and subject,
+ *  *ref_offsets move comparisons reference-wise
+ *
+ *  "reference" [ DATA ]
+ *
+ *  "subject" [ DATA ]
+ *
+ *  "has_ref_offset" [ DATA ]
+ *
+ *  "ref_offset" [ DATA ]
+ */
+extern function
+bool NCBI:align:generate_has_mismatch #1 ( INSDC:4na:bin reference,
+       INSDC:4na:bin subject, bool has_ref_offset, I32 ref_offset)
+    = ALIGN:generate_has_mismatch;
+
+
+/* generate_mismatch
+ *
+ *  "reference" [ DATA ]
+ *
+ *  "subject" [ DATA ]
+ *
+ *  "has_ref_offset" [ DATA ]
+ *
+ *  "ref_offset" [ DATA ]
+ */
+extern function
+INSDC:4na:bin NCBI:align:generate_mismatch #1 ( INSDC:4na:bin reference,
+        INSDC:4na:bin subject, bool has_ref_offset, I32 ref_offset )
+        = ALIGN:generate_mismatch;
+
+
+/* ref_pos
+ *  retrieves the alignment's positions on the reference
+ *  one per PLOIDY
+ *
+ *  "ref_id" [ DATA ]
+ *
+ *  "ref_start" [ DATA ] - one per PLOIDY
+ */
+extern function
+INSDC:coord:zero NCBI:align:ref_pos #1 ( I64 ref_id, INSDC:coord:zero ref_start );
+
+
+/* ref_name
+ *  retrieve the name from the reference
+ *
+ *  "ref_id" [ DATA ]
+ */
+extern function
+ascii NCBI:align:ref_name #1 ( I64 ref_id );
+
+
+/* ref_seq_id
+ *  retrieve the seq_id from the reference
+ *
+ *  "ref_id" [ DATA ]
+ */
+extern function
+ascii NCBI:align:ref_seq_id #1 ( I64 ref_id );
+
+
+/* local_ref_id
+ *  convert global ref_start into ref_id
+ */
+extern function
+I64 NCBI:align:local_ref_id #1 ( U64 global_ref_start );
+
+
+/* global_ref_id
+ *  convert global ref_start into ref_id
+ */
+extern function
+INSDC:coord:zero NCBI:align:local_ref_start #1 ( U64 global_ref_start );
+
+/* not_my_row
+ *  removes current row_id from the list
+ */
+extern function I64 NCBI:align:not_my_row #1 ( I64 list );
+
+/* template_len
+ *  compute template length, i.e. the distance from the left-most to the
+ *  right-most matching reference position
+ */
+extern function I32 NCBI:align:template_len #1 (
+    INSDC:coord:zero pos, INSDC:coord:zero mate_pos,
+    INSDC:coord:len  reflen, INSDC:coord:len mate_reflen,
+    ascii ref_name, ascii mate_ref_name, INSDC:coord:one read_id);
+
+/* get_sam_flags
+ *  compute the flags that would be in a SAM file
+ *
+ * version 1 works with full Alignment databases.
+ * version 2 works with Alignment databases that have had SEQUENCE removed.
+ */
+extern function U32 NCBI:align:get_sam_flags #1 (
+    INSDC:coord:len read_len, INSDC:coord:one read_id, I32 template_len,
+    bool strand, bool mate_strand, bool is_secondary, * INSDC:SRA:read_filter filter);
+
+extern function U32 NCBI:align:get_sam_flags #2 (
+    I64 mate_id, INSDC:coord:one read_id, I32 template_len,
+    bool strand, bool mate_strand, bool is_secondary, * INSDC:SRA:read_filter filter)
+  = NCBI:align:get_sam_flags_2;
+
+/* get_left_soft_clip
+ *  compute the length of the soft clip on the left edge of the alignment
+ */
+extern function INSDC:coord:len NCBI:align:get_left_soft_clip #1
+    ( bool has_ref_offset, I32 ref_offset );
+
+extern function INSDC:coord:len NCBI:align:get_left_soft_clip #2
+    ( bool has_ref_offset, I32 ref_offset, INSDC:coord:len read_len )
+   = NCBI:align:get_left_soft_clip_2;
+
+/* get_right_soft_clip
+ *  compute the length of the soft clip on the right edge of the alignment
+ */
+extern function INSDC:coord:len NCBI:align:get_right_soft_clip #1
+    ( bool has_mismatch, INSDC:coord:len left_clip * bool has_ref_offset );
+
+extern function INSDC:coord:len NCBI:align:get_right_soft_clip #2
+    ( bool has_mismatch, INSDC:coord:len left_clip, bool has_ref_offset, I32 ref_offset )
+   = NCBI:align:get_right_soft_clip_2;
+
+extern function INSDC:coord:len NCBI:align:get_right_soft_clip #3
+    ( bool has_ref_offset, I32 ref_offset, INSDC:coord:len ref_len )
+   = NCBI:align:get_right_soft_clip_3;
+
+extern function INSDC:coord:len NCBI:align:get_right_soft_clip #4
+    ( bool has_ref_offset, I32 ref_offset, INSDC:coord:len read_len, INSDC:coord:len ref_len )
+   = NCBI:align:get_right_soft_clip_4;
+
+extern function INSDC:coord:len NCBI:align:get_right_soft_clip #5
+    ( bool has_ref_offset, I32 ref_offset, NCBI:align:ro_type ref_offset_type, INSDC:coord:len read_len )
+   = NCBI:align:get_right_soft_clip_5;
+
+/* get_clipped_cigar
+ *  compute the CIGAR string with the soft clipping removed
+ */
+extern function ascii NCBI:align:get_clipped_cigar #1 ( ascii cigar );
+
+extern function < type T >
+T NCBI:align:get_clipped_cigar #2 ( ascii cigar, INSDC:coord:len cigar_len ) = NCBI:align:get_clipped_cigar_2;
+
+/* get_clipped_ref_offset
+ *  compute the reference offsets with the soft clipping removed
+ */
+extern function I32 NCBI:align:get_clipped_ref_offset #1
+    ( bool has_ref_offset, I32 ref_offset );
+
+/* clip
+ *  remove the soft clipped bases (or qualities, or has_mismatch, or cetera)
+ *  works with things whose lengths are the same as SEQUENCE.READ
+ */
+extern function < type T > T NCBI:align:clip #1
+    ( T object, INSDC:coord:len left_clip, INSDC:coord:len right_clip);
+
+extern function < type T > T NCBI:align:clip #2
+    ( T object, INSDC:coord:len read_len, INSDC:coord:len left_clip, INSDC:coord:len right_clip)
+   = NCBI:align:clip_2;
+
+/* get_ref_len
+ *  compute reference length from alignment information
+ */
+extern function INSDC:coord:len NCBI:align:get_ref_len #1
+    ( bool has_ref_offset, I32 ref_offset, * INSDC:coord:len right_clip );
+
+extern function INSDC:coord:len NCBI:align:get_ref_len_2 #2
+    ( bool has_ref_offset, I32 ref_offset)
+  = NCBI:align:get_ref_len_2;
+
+
+/* get_mismatch_read
+ *  generate the READ with matching bases replaced with '='
+ */
+extern function ascii NCBI:align:get_mismatch_read #1
+    ( bool has_mismatch, INSDC:dna:text mismatch );
+
+/* get_ref_mismatch
+ * shows mismatch positions in reference space
+ */
+function bool NCBI:align:get_ref_mismatch #1
+    ( bool has_mismatch, bool has_ref_offset, I32 ref_offset,
+      INSDC:coord:len ref_len );
+
+/* get_ref_insert
+ * shows positions of inserts in reference space
+ * i.e. an insert occurs between each pair of true's
+ */
+function bool NCBI:align:get_ref_insert #1
+    ( bool has_mismatch, bool has_ref_offset, I32 ref_offset,
+      INSDC:coord:len ref_len );
+
+/* get_ref_delete
+ * shows positions of deleted bases in reference space
+ */
+function bool NCBI:align:get_ref_delete #1
+    ( bool has_mismatch, bool has_ref_offset, I32 ref_offset,
+      INSDC:coord:len ref_len );
+
+extern function INSDC:quality:phred NCBI:align:compress_quality #1
+    ( INSDC:quality:phred quality, bool preserved );
+
+extern function INSDC:quality:phred NCBI:align:decompress_quality #1
+    < INSDC:quality:phred restored_qual_value >
+    ( INSDC:quality:phred cmp_quality, bool preserved );
+
+/* make_cmp_read_start
+ *
+ */
+extern function INSDC:coord:zero NCBI:align:make_read_start #1
+    (INSDC:coord:len read_len);
+
+/* make_cmp_read_desc
+ *  determines whether an element of "operand" is aligned
+ *  by looking at the corresponding element of "align_id"
+ *
+ *  zeros out unaligned elements of operand, unless "invert" is true,
+ *  in which case it zeros out aligned elements.
+ *
+ *  "T" [ TYPE ] - type of operand
+ *
+ *  "invert" [ CONST ] - if true, invert the logic of which elements
+ *  to zero out.
+ *
+ *  "operand" [ DATA ] - uncompressed data
+ *
+ *  "align_id" [ DATA ] - indication of alignment
+ */
+extern function < type T >
+T NCBI:align:make_cmp_read_desc #1 <bool invert>(T operand, I64 align_id);
+
+/* seq_construct_read
+ *  assembles read from aligned and unaligned parts
+ */
+extern function < type T >
+T NCBI:align:seq_construct_read #1 (
+    T aligned, INSDC:coord:len aligned_read_len,
+    T unaligned, INSDC:coord:len unaligned_read_len );
+
+extern function I64 NCBI:align:get_mate_align_id #1 ( I64 spot_id );
+
+/*--------------------------------------------------------------------------
+ * tables
+ */
+
+
+/* ref_block_cmn
+ *  common implementation ancestor for reference block
+ */
+table NCBI:align:tbl:ref_block_cmn #1.0.0
+{
+    readonly column ascii REF_TABLE
+        = < ascii > meta:read < "CONFIG/REF_TABLE" > ()
+        | < ascii > echo < 'REFERENCE' > ();
+
+    // REF_ID is rowid in Reference Table REF_TABLE
+    extern column I64 REF_ID
+        = out_ref_id;
+
+    // this is a redefinition of REF_START
+    // REF_START is the offset within REFERENCE.READ
+    extern column INSDC:coord:zero REF_START
+        = out_ref_start;
+
+    // global REF_START
+    extern column U64 GLOBAL_REF_START
+        = out_global_ref_start;
+
+    // REF_LEN the length of a read projection on reference
+    INSDC:coord:len out_ref_len_internal
+        = NCBI:align:get_ref_len_2 ( out_has_ref_offset, out_ref_offset )
+        | NCBI:align:get_ref_len   ( out_has_ref_offset, out_ref_offset );
+
+    INSDC:coord:len out_ref_len
+        = .REF_LEN
+/*      | NCBI:align:get_ref_len ( out_has_ref_offset, out_ref_offset, out_right_clip ) */
+        | out_ref_len_internal;
+
+    physical column < INSDC:coord:len > izip_encoding .REF_LEN = REF_LEN;
+    extern column INSDC:coord:len REF_LEN = out_ref_len;
+
+    // REF_ORIENTATION - relative orientation of original raw read to the reference
+    // false -> same orientation, true -> opposite orientation
+    // alignment and reference are always in the same orientation
+    extern column bool_encoding REF_ORIENTATION;
+
+    // REF_PLOIDY
+    extern column < U32 > izip_encoding REF_PLOIDY;
+
+    /* REF_POS
+     *  per PLOIDY
+     */
+    readonly column INSDC:coord:zero REF_POS
+        = NCBI:align:ref_pos ( out_ref_id, out_ref_start );
+
+    /* REF_NAME
+     *  the name of the reference
+     */
+    readonly column ascii REF_NAME
+        = NCBI:align:ref_name ( out_ref_id );
+
+    /* REF_SEQ_ID
+     */
+    readonly column ascii REF_SEQ_ID
+        = NCBI:align:ref_seq_id ( out_ref_id )
+        | < ascii > echo < '' > ();
+};
+
+
+/* global_ref_block
+ *  reference block favoring global ref-start
+ */
+table NCBI:align:tbl:global_ref_block #1.0.0
+    = NCBI:align:tbl:ref_block_cmn #1.0.0
+{
+    U64 out_global_ref_start = .GLOBAL_REF_START;
+    physical < U64 > izip_encoding .GLOBAL_REF_START = GLOBAL_REF_START;
+
+    I64 out_ref_id = NCBI:align:local_ref_id ( .GLOBAL_REF_START );
+    INSDC:coord:zero out_ref_start = NCBI:align:local_ref_start ( .GLOBAL_REF_START );
+};
+
+
+/* local_ref_block
+ *  reference block favoring local ref-start
+ */
+table NCBI:align:tbl:local_ref_block #1.0.0
+    = NCBI:align:tbl:ref_block_cmn #1.0.0
+{
+    I64 out_ref_id = .REF_ID;
+    physical < I64 > izip_encoding .REF_ID = REF_ID;
+
+    INSDC:coord:zero out_ref_start = .REF_START;
+    physical < INSDC:coord:zero > izip_encoding .REF_START = REF_START;
+};
+
+
+/* align_cmn
+ *  common interface and implementation for alignment object
+ *
+ * History:
+ *  2.1 - added REF_OFFSET_TYPE and RNA_ORIENTATION columns
+ *        updated all cigar calculations
+ */
+table NCBI:align:tbl:align_cmn #2.1
+    = NCBI:tbl:base_space_common #1.0.3
+    , NCBI:SRA:tbl:stats #1.2.0
+    , NCBI:align:tbl:ref_block_cmn #1.0.0
+{
+    bool is_secondary = out_is_secondary;
+// temporary key
+    extern column < U32 > izip_encoding TMP_KEY_ID;
+
+    extern column <ascii> zip_encoding LINKAGE_GROUP;
+
+
+/* Raw Sequence Block */
+    // Points to sequence table, which may contain more information about the raw sequence.
+    // row id in SEQUENCE table; 0 if not linked
+    extern column < I64 > izip_encoding SEQ_SPOT_ID;
+
+    // read number in SEQUENCE table; { SEQ_SPOT_ID, SEQ_READ_ID } is the unique link to the sequence
+    extern column < INSDC:coord:one > izip_encoding SEQ_READ_ID;
+
+
+/* Soft-Clipped data block */
+
+    readonly column INSDC:coord:len LEFT_SOFT_CLIP
+        = NCBI:align:get_left_soft_clip ( HAS_REF_OFFSET, REF_OFFSET, out_read_len );
+
+    INSDC:coord:len out_right_clip
+        = NCBI:align:get_right_soft_clip #5 ( out_has_ref_offset, out_ref_offset, out_ro_type, out_read_len )
+        | NCBI:align:get_right_soft_clip #4 ( out_has_ref_offset, out_ref_offset, out_read_len, out_ref_len )
+        | NCBI:align:get_right_soft_clip #3 ( out_has_ref_offset, out_ref_offset, out_ref_len )
+        | NCBI:align:get_right_soft_clip #2 ( out_has_mismatch, LEFT_SOFT_CLIP, out_has_ref_offset, out_ref_offset );
+    readonly column INSDC:coord:len RIGHT_SOFT_CLIP = out_right_clip;
+
+    readonly column ascii CLIPPED_CIGAR_LONG
+        = < ascii > NCBI:align:get_clipped_cigar ( CIGAR_LONG, CIGAR_LONG_LEN );
+
+    readonly column INSDC:coord:len CLIPPED_CIGAR_LONG_LEN
+        = < INSDC:coord:len > NCBI:align:get_clipped_cigar ( CIGAR_LONG, CIGAR_LONG_LEN );
+
+    readonly column ascii CLIPPED_CIGAR_SHORT
+        = < ascii > NCBI:align:get_clipped_cigar ( CIGAR_SHORT, CIGAR_SHORT_LEN );
+
+    readonly column INSDC:coord:len CLIPPED_CIGAR_SHORT_LEN
+        = < INSDC:coord:len > NCBI:align:get_clipped_cigar ( CIGAR_SHORT, CIGAR_SHORT_LEN );
+
+    bool out_clipped_has_mismatch
+        = < bool > NCBI:align:clip (out_has_mismatch, out_read_len, LEFT_SOFT_CLIP, RIGHT_SOFT_CLIP);
+
+    readonly column ascii CLIPPED_HAS_MISMATCH
+        = < U8 , ascii > map < [ 0 , 1 ] , '01'  > ( out_clipped_has_mismatch );
+
+    readonly column bool CLIPPED_HAS_MISMATCH = out_clipped_has_mismatch;
+
+    bool out_clipped_has_ref_offset
+        = < bool > NCBI:align:clip (HAS_REF_OFFSET, out_read_len, LEFT_SOFT_CLIP, RIGHT_SOFT_CLIP);
+
+    readonly column ascii CLIPPED_HAS_REF_OFFSET
+        = < U8 , ascii > map < [ 0 , 1 ] , '01'  > ( out_clipped_has_ref_offset );
+
+    readonly column bool CLIPPED_HAS_REF_OFFSET = out_clipped_has_ref_offset;
+
+    // TBD cannot be computed right unless HAS_MISMATCH and! READ_LEN is used
+    readonly column INSDC:dna:text CLIPPED_MISMATCH
+        = < INSDC:dna:text > NCBI:align:clip #1 ( out_mismatch_dna_text, LEFT_SOFT_CLIP, RIGHT_SOFT_CLIP);
+
+    readonly column I32 CLIPPED_REF_OFFSET
+        = NCBI:align:get_clipped_ref_offset ( HAS_REF_OFFSET, REF_OFFSET );
+
+    readonly column INSDC:quality:phred CLIPPED_QUALITY
+        = < INSDC:quality:phred > NCBI:align:clip (out_qual_phred, out_read_len, LEFT_SOFT_CLIP, RIGHT_SOFT_CLIP);
+
+    readonly column INSDC:dna:text CLIPPED_READ
+        = < INSDC:dna:text > NCBI:align:clip (READ, out_read_len, LEFT_SOFT_CLIP, RIGHT_SOFT_CLIP);
+
+/* Sequence Block */
+
+    extern column < NCBI:align:ploidy > izip_encoding PLOIDY;
+
+    // Number of reads per spot; corresponds to the number of alternative alignments
+    // all alternative alignments are computed against the same reference region
+    U32 out_nreads
+        = .PLOIDY
+        | < U32 > echo < 1 > ();
+
+    // READ_START and READ_LEN are position and length of the sequence
+    physical < INSDC:coord:zero > izip_encoding .READ_START = READ_START;
+    INSDC:coord:zero out_read_start
+        = .READ_START
+        | < INSDC:coord:zero > echo < 0 > ();
+
+    physical < INSDC:coord:len > izip_encoding .READ_LEN = READ_LEN;
+
+    INSDC:coord:len align_spot_len = ( INSDC:coord:len ) row_len ( out_has_ref_offset );
+    INSDC:coord:len out_read_len
+        = .READ_LEN
+        | align_spot_len;
+
+    // associated qualities
+    extern column INSDC:quality:phred CMP_QUALITY
+        = .CMP_QUALITY
+        | out_cmp_quality;
+    physical column < INSDC:quality:phred > zip_encoding .CMP_QUALITY = CMP_QUALITY;
+
+    INSDC:quality:phred out_raw_qual = < INSDC:quality:phred >
+        NCBI:align:project_from_sequence < '( INSDC:quality:phred ) QUALITY'> ( .SEQ_SPOT_ID, .SEQ_READ_ID );
+    INSDC:quality:phred out_qual_phred
+        = NCBI:align:raw_restore_qual ( out_raw_qual, .REF_ORIENTATION )
+        | < INSDC:quality:phred > echo < 30 > ( out_4na_bin );
+    readonly column INSDC:quality:text:phred_33 SAM_QUALITY = QUALITY ;
+
+    // project read group and name
+    ascii out_spot_group = < ascii > simple_sub_select < 'SEQUENCE','SPOT_GROUP'> (.SEQ_SPOT_ID);
+
+
+    INSDC:SRA:spotid_t tmp_seq_spot_id
+        = cast ( .SEQ_SPOT_ID )
+        ;
+    physical <ascii> zip_encoding .SEQ_NAME = SEQ_NAME;
+    extern column ascii SEQ_NAME
+        = .SEQ_NAME
+        | < ascii > simple_sub_select < 'SEQUENCE','NAME'> (.SEQ_SPOT_ID)
+        | sprintf < "%u" > ( tmp_seq_spot_id );
+
+    // compute sam flags
+    /* blows up parser: starts at schema-tbl.c:2138
+    readonly column U32 SAM_FLAGS = NCBI:align:get_sam_flags(MATE_ALIGN_ID,
+        .SEQ_READ_ID, out_template_len, REF_ORIENTATION,
+        out_mate_ref_orientation, is_secondary);
+    */
+    INSDC:coord:len projected_read_len
+        = < INSDC:coord:len > simple_sub_select < 'SEQUENCE', 'READ_LEN' > ( .SEQ_SPOT_ID );
+
+    readonly column U32 SAM_FLAGS
+        = NCBI:align:get_sam_flags #1 (projected_read_len,
+            .SEQ_READ_ID, out_template_len, REF_ORIENTATION,
+            out_mate_ref_orientation, is_secondary, out_rd_filter)
+        | NCBI:align:get_sam_flags #2 (out_mate_align_id,
+            .SEQ_READ_ID, out_template_len, REF_ORIENTATION,
+            out_mate_ref_orientation, is_secondary, out_rd_filter);
+
+    ascii out_name_fmt = < ascii > echo < '$R' > ();
+
+    INSDC:coord:zero trim_start
+        = < INSDC:coord:zero > echo < 0 > ();
+    INSDC:coord:len trim_len
+        = align_spot_len;
+
+    ascii out_label
+        = .LABEL
+        | < ascii > echo < "ploidy1" > ();
+    INSDC:coord:zero out_label_start
+        = .LABEL_START
+        | < INSDC:coord:zero > echo < 0 > ();
+    INSDC:coord:len out_label_len
+        = .LABEL_LEN
+        | < INSDC:coord:len > echo < 7 > ();
+
+    physical < INSDC:SRA:read_filter > zip_encoding .RD_FILTER = READ_FILTER;
+    INSDC:SRA:read_filter out_rd_filter
+        = .RD_FILTER
+        | < INSDC:SRA:read_filter > NCBI:align:project_from_sequence < 'READ_FILTER' > ( .SEQ_SPOT_ID, .SEQ_READ_ID )
+        | < INSDC:SRA:read_filter > echo < SRA_READ_FILTER_PASS > ( out_read_len );
+
+    INSDC:SRA:platform_id out_platform
+        = .PLATFORM
+        | < INSDC:SRA:platform_id > simple_sub_select < 'SEQUENCE','PLATFORM'> (.SEQ_SPOT_ID)
+        | < INSDC:SRA:platform_id > echo < SRA_PLATFORM_UNDEFINED > ();
+
+    U8 out_alignment_count = <U8> NCBI:align:project_from_sequence < 'ALIGNMENT_COUNT' > ( .SEQ_SPOT_ID, .SEQ_READ_ID );
+
+    /* out_read_type
+     *  set to SRA_READ_TYPE_FORWARD + SRA_READ_TYPE_BIOLOGICAL
+     *  which has a constant value of 3
+     */
+    INSDC:SRA:xread_type out_read_type
+        = < INSDC:SRA:xread_type > echo < 3 > ( out_read_len );
+
+    // stats inputs
+    bool in_stats_bin = HAS_REF_OFFSET;
+
+    INSDC:coord:len _alt_in_read_len
+        = READ_LEN
+        | ( INSDC:coord:len ) row_len #1 ( HAS_REF_OFFSET );
+
+    INSDC:SRA:xread_type _alt_in_read_type
+        = READ_TYPE
+        | < INSDC:SRA:xread_type > echo < SRA_READ_TYPE_BIOLOGICAL > (_alt_in_read_len);
+
+    readonly column ascii MISMATCH_READ
+        = NCBI:align:get_mismatch_read ( out_has_mismatch, out_mismatch_dna_text );
+
+/* Alignment block */
+
+    // MAPQ - single value quality of the mapping; the scale is submitter specific
+    extern column < I32 > izip_encoding MAPQ;
+
+    extern column INSDC:coord:zero MATE_REF_POS = out_mate_ref_pos;
+    extern column INSDC:coord:len MATE_REF_LEN = out_mate_ref_len;
+    extern column I64 MATE_REF_ID = out_mate_ref_id;
+    extern column I32 TEMPLATE_LEN = out_template_len;
+    extern column bool MATE_REF_ORIENTATION = out_mate_ref_orientation;
+    readonly column ascii MATE_REF_NAME = NCBI:align:ref_name ( out_mate_ref_id );
+    readonly column ascii MATE_REF_SEQ_ID = NCBI:align:ref_seq_id( out_mate_ref_id );
+    readonly column U8 ALIGNMENT_COUNT  = out_alignment_count;
+
+
+/********************************
+* Columns representing CIGARs
+********************************/
+
+
+    // one value per base i.e. length is same as sum of READ_LEN
+    // partitioned by READ_START and READ_LEN into alternative alignments
+    // flags the shifts in reference position preceeding the base
+    // if sequence of a partitioned read starts with a ref_offset and one or more mismatches
+    // then it represents a left soft clip
+    // any run of mismatches at the end represents a right soft clip
+
+    readonly column ascii HAS_REF_OFFSET =  < U8 , ascii > map < [ 0 , 1 ] , '01'  > ( out_has_ref_offset );
+    extern column bool_encoding HAS_REF_OFFSET;
+    bool out_has_ref_offset = .HAS_REF_OFFSET;
+
+    // has number of elements equal to number of true elements in HAS_REF_OFFSET
+    extern column < I32 > izip_encoding REF_OFFSET;
+    I32 out_ref_offset = .REF_OFFSET;
+
+    // the type of offset recorded in REF_OFFSET
+    extern column < NCBI:align:ro_type > izip_encoding REF_OFFSET_TYPE;
+    NCBI:align:ro_type out_ro_type = .REF_OFFSET_TYPE;
+
+    // DISPLAY Columns
+
+    readonly column I64 ALIGN_ID = row_id ();
+
+    // get projection of the reference
+    readonly column INSDC:dna:text REF_READ
+        = < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( REF_READ );
+
+    readonly column INSDC:4na:bin REF_READ
+        = NCBI:align:ref_sub_select (out_ref_id, out_ref_start, out_ref_len, .REF_PLOIDY)
+        | NCBI:align:ref_sub_select (out_ref_id, out_ref_start, out_ref_len );
+
+    INSDC:4na:bin ref_read_internal
+        = NCBI:align:ref_sub_select (out_ref_id, out_ref_start, out_ref_len_internal, .REF_PLOIDY)
+        | NCBI:align:ref_sub_select (out_ref_id, out_ref_start, out_ref_len_internal);
+
+    // text forms of reads
+    INSDC:dna:text out_dna_text
+        = < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_4na_bin );
+    readonly column INSDC:dna:text RAW_READ
+        = < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_raw_read );
+    readonly column INSDC:4na:bin RAW_READ
+        = out_raw_read;
+
+    // CIGARs
+    readonly column ascii CIGAR_LONG
+        = < ascii > NCBI:align:cigar #2 < 1 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len, out_ref_len, out_ro_type)
+        | < ascii > NCBI:align:cigar #2 < 1 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len, out_ref_len)
+        | < ascii > NCBI:align:cigar #2 < 1 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len)
+        ;
+    readonly column INSDC:coord:len CIGAR_LONG_LEN
+        = < INSDC:coord:len > NCBI:align:cigar #2 < 1 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len, out_ref_len, out_ro_type)
+        | < INSDC:coord:len > NCBI:align:cigar #2 < 1 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len, out_ref_len)
+        | < INSDC:coord:len > NCBI:align:cigar #2 < 1 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len)
+        ;
+    readonly column ascii CIGAR_SHORT
+        = < ascii > NCBI:align:cigar #2 < 0 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len, out_ref_len, out_ro_type)
+        | < ascii > NCBI:align:cigar #2 < 0 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len, out_ref_len)
+        | < ascii > NCBI:align:cigar #2 < 0 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len)
+        ;
+    readonly column INSDC:coord:len CIGAR_SHORT_LEN
+        = < INSDC:coord:len > NCBI:align:cigar #2 < 0 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len, out_ref_len, out_ro_type)
+        | < INSDC:coord:len > NCBI:align:cigar #2 < 0 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len, out_ref_len)
+        | < INSDC:coord:len > NCBI:align:cigar #2 < 0 > (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_read_len)
+        ;
+
+    readonly column ascii RNA_ORIENTATION
+        = NCBI:align:rna_orientation ( out_ro_type )
+        ;
+
+    readonly column U32 EDIT_DISTANCE
+        = NCBI:align:edit_distance #3 (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_ro_type, out_read_len)
+        | NCBI:align:edit_distance #2 (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_ref_len, out_read_len)
+        | NCBI:align:edit_distance #2 (out_has_mismatch, out_has_ref_offset, out_ref_offset, out_ref_len)
+        | NCBI:align:edit_distance #1 (out_has_mismatch, out_has_ref_offset, out_ref_offset);
+
+    readonly column ascii HAS_MISMATCH = < U8 , ascii > map < [ 0 , 1 ] , '01'  > ( out_has_mismatch );
+
+    // needed for backward compatibility
+    readonly column ascii SEQ_SPOT_GROUP = out_spot_group;
+
+
+/* These columns are purely informational. */
+    bool out_ref_mismatch = NCBI:align:get_ref_mismatch ( out_has_mismatch, out_has_ref_offset, out_ref_offset, out_ref_len );
+    readonly column ascii REF_MISMATCH = < U8 , ascii > map < [ 0 , 1 ] , '01'  > ( out_ref_mismatch );
+    readonly column bool REF_MISMATCH = out_ref_mismatch;
+
+    bool out_ref_insert = NCBI:align:get_ref_insert ( out_has_mismatch, out_has_ref_offset, out_ref_offset, out_ref_len );
+    readonly column ascii REF_INSERT = < U8 , ascii > map < [ 0 , 1 ] , '01'  > ( out_ref_insert );
+    readonly column bool REF_INSERT = out_ref_insert;
+
+    bool out_ref_delete = NCBI:align:get_ref_delete ( out_has_mismatch, out_has_ref_offset, out_ref_offset, out_ref_len );
+    readonly column ascii REF_DELETE = < U8 , ascii > map < [ 0 , 1 ] , '01'  > ( out_ref_delete );
+    readonly column bool REF_DELETE = out_ref_delete;
+
+};
+
+
+/* align_full
+ *  aligns externally stored sequence against reference
+ *  alignment transcript is calculated
+ *
+ * History:
+ *  1.1 - respond to changes in base table
+ */
+table NCBI:align:tbl:align_full #1.1
+    = NCBI:align:tbl:align_cmn #2.1
+{
+    bool out_is_secondary = <bool> echo < true > ();
+    // restore reads to its raw form (orientation is restored)
+
+    INSDC:4na:bin out_raw_read
+        = < INSDC:4na:bin > simple_sub_select  < 'PRIMARY_ALIGNMENT', '( INSDC:4na:bin ) RAW_READ' > (.PRIMARY_ALIGNMENT_ID)
+        | < INSDC:4na:bin > NCBI:align:project_from_sequence < '( INSDC:4na:bin ) READ'> ( .SEQ_SPOT_ID, .SEQ_READ_ID );
+
+    INSDC:4na:bin out_4na_bin
+	    = NCBI:align:align_restore_read ( ref_read_internal, out_has_mismatch, tmp_out_mismatch_4na_bin, out_has_ref_offset, out_ref_offset, .READ_LEN )
+	    | NCBI:align:align_restore_read ( ref_read_internal, out_has_mismatch, tmp_out_mismatch_4na_bin, out_has_ref_offset, out_ref_offset )
+    	    | NCBI:align:raw_restore_read ( out_raw_read, .REF_ORIENTATION );
+
+
+    // flags mismatches with the reference
+    // produced by actual comparison of REF_READ and READ
+    // TMP_HAS_MISMATCH is a hack to speed up retrieval during coverage recalculation
+    column bool_encoding TMP_HAS_MISMATCH;
+    bool out_has_mismatch
+        = .TMP_HAS_MISMATCH
+	| NCBI:align:generate_has_mismatch ( REF_READ, READ, out_has_ref_offset, out_ref_offset );
+    readonly column bool HAS_MISMATCH = out_has_mismatch;
+
+    INSDC:4na:bin out_mismatch_4na_bin
+        = NCBI:align:generate_mismatch ( REF_READ, READ, out_has_ref_offset, out_ref_offset );
+
+    INSDC:4na:bin tmp_out_mismatch_4na_bin =  < INSDC:dna:text, INSDC:4na:bin > map < INSDC:4na:map:CHARSET, INSDC:4na:map:BINSET > ( .TMP_MISMATCH );
+
+    // temporary column for reference coverage calculation
+    column < INSDC:dna:text> zip_encoding TMP_MISMATCH;
+
+    INSDC:dna:text out_mismatch_dna_text
+        = .TMP_MISMATCH
+        | < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_mismatch_4na_bin );
+
+    readonly column INSDC:dna:text MISMATCH = out_mismatch_dna_text;
+    readonly column INSDC:4na:bin MISMATCH = out_mismatch_4na_bin;
+
+    physical column < INSDC:coord:zero > izip_encoding .MATE_REF_POS = MATE_REF_POS;
+    INSDC:coord:zero out_mate_ref_pos = .MATE_REF_POS
+                                      | < INSDC:coord:zero > simple_sub_select < '','REF_POS'> (MATE_ALIGN_ID);
+
+    physical column < I64 > izip_encoding .MATE_REF_ID = MATE_REF_ID;
+    I64 out_mate_ref_id = .MATE_REF_ID
+                        | < I64 > simple_sub_select < '','REF_ID'> (MATE_ALIGN_ID);
+
+    INSDC:coord:len out_mate_ref_len = < INSDC:coord:len > simple_sub_select < '','REF_LEN'> (MATE_ALIGN_ID);
+    physical column < I32 > izip_encoding .TEMPLATE_LEN = TEMPLATE_LEN;
+    I32 out_template_len = .TEMPLATE_LEN
+            | NCBI:align:template_len(REF_POS,out_mate_ref_pos,out_ref_len,out_mate_ref_len,REF_NAME,MATE_REF_NAME,SEQ_READ_ID);
+
+    physical column < bool > izip_encoding .MATE_REF_ORIENTATION = MATE_REF_ORIENTATION;
+    bool out_mate_ref_orientation = .MATE_REF_ORIENTATION
+                                  | < bool >  simple_sub_select < '','REF_ORIENTATION'> (MATE_ALIGN_ID);
+
+    I64 out_mate_align_id = .MATE_ALIGN_ID;
+    physical column <I64> izip_encoding .MATE_ALIGN_ID = MATE_ALIGN_ID;
+    extern column I64 MATE_ALIGN_ID = out_mate_align_id;
+
+    physical column < I64 > izip_encoding .PRIMARY_ALIGNMENT_ID = PRIMARY_ALIGNMENT_ID;
+
+    I32 read_idx = <I32> cast (.SEQ_READ_ID);
+    extern column I64 PRIMARY_ALIGNMENT_ID
+        = .PRIMARY_ALIGNMENT_ID
+        | <I64> simple_sub_select < 'SEQUENCE','PRIMARY_ALIGNMENT_ID' > (.SEQ_SPOT_ID,.SEQ_READ_ID);
+
+};
+
+
+/* compressed_by_reference
+ *  aligns internally represented sequence against reference
+ *  alignment transcript is stored
+ *  original sequence is reconstructed
+ *
+ * History:
+ *  1.2 - respond to changes in base table
+ */
+table NCBI:align:tbl:compressed_by_reference #1.2
+    = NCBI:align:tbl:align_cmn #2.1
+{
+    bool out_is_secondary = <bool> echo < false > ();
+
+    // one value per base i.e. length is same as sum of READ_LEN
+    // partitioned by READ_START and READ_LEN into alternative alignments
+    // flags mismatches with the reference
+    extern default column bool_encoding HAS_MISMATCH;
+    bool out_has_mismatch = .HAS_MISMATCH;
+
+    // has number of elements equal to number of true elements in HAS_MISMATCH
+    extern column INSDC:dna:text MISMATCH
+    {
+        read = out_mismatch_dna_text;
+        validate = < INSDC:dna:text > compare ( in_mismatch_dna_text, out_mismatch_dna_text );
+    }
+
+    INSDC:dna:text in_mismatch_dna_text
+        = < INSDC:dna:text, INSDC:dna:text > map < '.acmgrsvtwyhkdbn','NACMGRSVTWYHKDBN' > ( MISMATCH );
+
+    INSDC:4na:bin in_mismatch_4na_bin
+        = < INSDC:dna:text, INSDC:4na:bin > map < INSDC:4na:map:CHARSET, INSDC:4na:map:BINSET > ( in_mismatch_dna_text );
+
+    extern column < ascii > zip_encoding ALIGN_GROUP;
+
+    physical column < INSDC:4na:bin > zip_encoding .MISMATCH = in_mismatch_4na_bin;
+
+    INSDC:4na:bin out_mismatch_4na_bin = .MISMATCH;
+    INSDC:dna:text out_mismatch_dna_text
+        = < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_mismatch_4na_bin );
+
+    I64 out_mate_align_id
+        = .MATE_ALIGN_ID
+        | NCBI:align:get_mate_align_id (.SEQ_SPOT_ID);
+
+    physical column <I64> izip_encoding .MATE_ALIGN_ID = MATE_ALIGN_ID;
+    extern column I64 MATE_ALIGN_ID = out_mate_align_id;
+
+    // restore reads from alignment columns and the reference
+    // optional .READ_LEN size defines PLOIDY
+    INSDC:4na:bin out_4na_bin
+	    = NCBI:align:align_restore_read ( ref_read_internal, out_has_mismatch, .MISMATCH, out_has_ref_offset, out_ref_offset, .READ_LEN )
+	    | NCBI:align:align_restore_read ( ref_read_internal, out_has_mismatch, .MISMATCH, out_has_ref_offset, out_ref_offset );
+
+    // restore reads to its raw form (orientation is restored)
+    INSDC:4na:bin out_raw_read = NCBI:align:raw_restore_read (out_4na_bin,.REF_ORIENTATION);
+
+    I64	primary_align_pair =  < I64 > simple_sub_select < 'SEQUENCE','PRIMARY_ALIGNMENT_ID'> (.SEQ_SPOT_ID);
+    I64 out_mate_ref_id = < I64 > simple_sub_select < '','REF_ID'> (MATE_ALIGN_ID);
+    bool  out_mate_ref_orientation = < bool >  simple_sub_select < '','REF_ORIENTATION'> (MATE_ALIGN_ID);
+    INSDC:coord:zero out_mate_ref_pos = < INSDC:coord:zero > simple_sub_select < '','REF_POS'> (MATE_ALIGN_ID);
+    INSDC:coord:len out_mate_ref_len = < INSDC:coord:len > simple_sub_select < '','REF_LEN'> (MATE_ALIGN_ID);
+    readonly column U32   MATE_EDIT_DISTANCE   = < U32 >   simple_sub_select < '','EDIT_DISTANCE'> (MATE_ALIGN_ID);
+    readonly column ascii MATE_CIGAR_LONG      = < ascii > simple_sub_select < '','CIGAR_LONG'> (MATE_ALIGN_ID);
+    readonly column ascii MATE_CIGAR_SHORT     = < ascii > simple_sub_select < '','CIGAR_SHORT'> (MATE_ALIGN_ID);
+    readonly column INSDC:coord:len MATE_CIGAR_LONG_LEN  = < INSDC:coord:len > simple_sub_select < '','CIGAR_LONG_LEN'> (MATE_ALIGN_ID);
+    readonly column INSDC:coord:len MATE_CIGAR_SHORT_LEN = < INSDC:coord:len > simple_sub_select < '','CIGAR_SHORT_LEN'> (MATE_ALIGN_ID);
+
+    I32 out_template_len = NCBI:align:template_len (REF_POS,out_mate_ref_pos,out_ref_len,out_mate_ref_len,REF_NAME,MATE_REF_NAME,SEQ_READ_ID);
+};
+
+
+/* align_sorted
+ *  deflated alignment data sorted against reference
+ *
+ * History:
+ *  1.2 - respond to changes in base table
+ */
+table NCBI:align:tbl:align_sorted #1.2
+    = NCBI:align:tbl:compressed_by_reference #1.2
+    , NCBI:align:tbl:global_ref_block #1.0.0
+{
+    // 128K
+    column default limit = 131072;
+};
+
+
+/* align_unsorted
+ *  deflated alignment unsorted data
+ *
+ * History:
+ *  1.2 - respond to changes in base table
+ */
+table NCBI:align:tbl:align_unsorted #1.2
+    = NCBI:align:tbl:compressed_by_reference #1.2
+    , NCBI:align:tbl:local_ref_block #1.0.0
+{
+    // 128K
+    column default limit = 131072;
+};
+
+
+/* align_mate_sorted
+ *
+ * History:
+ *  1.1 - respond to changes in base table
+ */
+table NCBI:align:tbl:align_mate_sorted #1.1
+    = NCBI:align:tbl:align_full #1.1
+    , NCBI:align:tbl:global_ref_block #1.0.0
+{
+    // 128K
+    column default limit = 131072;
+};
+
+
+/* align_mate_unsorted
+ *
+ * History:
+ *  1.1 - respond to changes in base table
+ */
+table NCBI:align:tbl:align_mate_unsorted #1.1
+    = NCBI:align:tbl:align_full #1.1
+    , NCBI:align:tbl:local_ref_block #1.0.0
+{
+    // 128K
+    column default limit = 131072;
+};
+
+/* align_allele
+ *  alleles coverage extension
+ *
+ * History:
+ *  1.2 - respond to changes in base table
+ */
+table NCBI:align:tbl:align_allele #1.2
+    = NCBI:align:tbl:align_unsorted #1.2
+{
+    extern column < I64 > izip_encoding EVIDENCE_ALIGNMENT_IDS;
+
+    /*
+    INSDC:quality:phred out_qual_phred
+        = < INSDC:quality:phred > echo < 30 > ( out_4na_bin );
+    */
+};
+
+/*--------------------------------------------------------------------------
+ * seq
+ *  alignment sequence table
+ */
+physical
+I64 NCBI:align:sorted:alignment_id_encoding #1.0
+{
+    decode
+    {
+        I64 outliers_removed = iunzip ( @ );
+        return < I64 > outlier_decode < 0 > ( outliers_removed );
+    }
+
+    encode
+    {
+        I64 outliers_removed = < I64 > outlier_encode < 0 > ( @ );
+        return izip ( outliers_removed );
+    }
+}
+
+
+table NCBI:align:tbl:seq #1.1 =
+    NCBI:tbl:base_space #2.0.3,
+    NCBI:tbl:phred_quality #2.0.4,
+    NCBI:align:tbl:cmp_base_space #1,
+    NCBI:SRA:tbl:spotdesc #1.0.2,
+    NCBI:SRA:tbl:stats #1.2.0
+{
+    // 128K
+    column default limit = 131072;
+
+    // gets primary record in alignment table (size of column is NREADS)
+    // if sorted - should used special encoding
+    extern column <I64> izip_encoding PRIMARY_ALIGNMENT_ID;
+
+    INSDC:coord:zero trim_start = < INSDC:coord:zero > echo < 0 > ();
+    INSDC:coord:len trim_len = _spot_len;
+
+    // size is NREADS
+    extern column < U8 > zip_encoding ALIGNMENT_COUNT;
+
+    // auto-generate name from row-id
+    ascii out_name_fmt = < ascii > echo < '$R' > ();
+
+    // temparary column
+    extern column < U64 > izip_encoding TMP_KEY_ID;
+
+    // restored  READ
+    INSDC:4na:bin out_dcmp_4na_bin
+        = NCBI:align:seq_restore_read (out_cmp_4na_bin, .PRIMARY_ALIGNMENT_ID, .READ_LEN, .READ_TYPE);
+
+    extern column < U64 > izip_encoding TI;
+
+    extern column <ascii> zip_encoding CMP_LINKAGE_GROUP;
+
+    // restored LINKAGE_GROUP
+    readonly column ascii LINKAGE_GROUP = NCBI:align:seq_restore_linkage_group(.CMP_LINKAGE_GROUP, .PRIMARY_ALIGNMENT_ID)
+                                        | .CMP_LINKAGE_GROUP;
+};
+
+
+table NCBI:align:tbl:cs_seq #1.2
+{
+    /* writable columns */
+    extern column INSDC:color:text CMP_CSREAD
+        = out_cmp_color_text
+        ;
+
+    extern column < INSDC:dna:text > zip_encoding CS_KEY;
+
+    extern default column < INSDC:quality:phred > zip_encoding QUALITY;
+
+    extern column < I64 > izip_encoding PRIMARY_ALIGNMENT_ID;
+
+    extern column < U8 > zip_encoding ALIGNMENT_COUNT;
+
+    extern column < INSDC:SRA:platform_id > zip_encoding PLATFORM;
+
+    extern column < ascii > zip_encoding LABEL;
+    extern column < INSDC:coord:zero > izip_encoding LABEL_START;
+    extern column < INSDC:coord:len > izip_encoding LABEL_LEN;
+
+    extern column < INSDC:SRA:xread_type > zip_encoding READ_TYPE;
+    extern column < INSDC:coord:zero > izip_encoding READ_START;
+    extern column < INSDC:coord:len > izip_encoding READ_LEN;
+    extern column < INSDC:SRA:read_filter > zip_encoding READ_FILTER;
+
+    extern column < U64 > izip_encoding TMP_KEY_ID;
+
+    extern column < ascii > zip_encoding SPOT_GROUP;
+
+    extern column < U64 > izip_encoding TI;
+
+    /* writing rules */
+    INSDC:x2cs:bin in_cmp_x2cs_bin
+        = < INSDC:color:text, INSDC:x2cs:bin > map < INSDC:x2cs:map:CHARSET, INSDC:x2cs:map:BINSET > ( CMP_CSREAD )
+        ;
+    INSDC:2cs:bin in_cmp_2cs_bin
+        = < INSDC:x2cs:bin, INSDC:2cs:bin > map < INSDC:x2cs:map:BINSET, [ 0, 1, 2, 3, 0 ] > ( in_cmp_x2cs_bin )
+        ;
+    INSDC:x2cs:bin in_cmp_alt_x2cs_bin
+        = < INSDC:x2cs:bin, INSDC:x2cs:bin > map < INSDC:x2cs:map:BINSET, [ 0, 0, 0, 0, 4 ] > ( in_cmp_x2cs_bin )
+        ;
+    physical column INSDC:2cs:packed .CMP_CSREAD
+        = ( INSDC:2cs:packed ) pack ( in_cmp_2cs_bin )
+        ;
+    physical column < INSDC:x2cs:bin > zip_encoding .CMP_ALTCSREAD
+        = < INSDC:x2cs:bin > trim < ALIGN_LEFT, 0 > ( in_cmp_alt_x2cs_bin )
+        ;
+
+    /* reading rules */
+    INSDC:2cs:packed phys_cmp_2cs_packed
+        = .CMP_CSREAD
+        ;
+    INSDC:x2cs:bin phys_cmp_alt_x2cs_bin
+        = .CMP_ALTCSREAD
+        ;
+    INSDC:2cs:packed phys_2cs_packed
+        = .CSREAD
+        ;
+    INSDC:x2cs:bin phys_alt_x2cs_bin
+        = .ALTCSREAD
+        ;
+    INSDC:2cs:bin out_cmp_2cs_bin
+        = ( INSDC:2cs:bin ) unpack ( phys_cmp_2cs_packed )
+        ;
+    INSDC:2cs:bin out_2cs_bin
+        = ( INSDC:2cs:bin ) unpack ( phys_2cs_packed )
+        ;
+    INSDC:x2cs:bin out_cmp_x2cs_bin
+        = ( INSDC:x2cs:bin ) < U8 > bit_or < ALIGN_RIGHT > ( out_cmp_2cs_bin, phys_cmp_alt_x2cs_bin )
+        | ( INSDC:x2cs:bin ) out_cmp_2cs_bin
+        ;
+    INSDC:x2cs:bin out_x2cs_bin
+        = ( INSDC:x2cs:bin ) < U8 > bit_or < ALIGN_RIGHT > ( out_2cs_bin, phys_alt_x2cs_bin )
+        | ( INSDC:x2cs:bin ) out_2cs_bin
+        ;
+     INSDC:color:text out_cmp_color_text
+        = < INSDC:x2cs:bin, INSDC:color:text > map <  INSDC:x2cs:map:BINSET, INSDC:x2cs:map:CHARSET > ( out_cmp_x2cs_bin )
+        ;
+     INSDC:color:text out_color_text
+        = < INSDC:x2cs:bin, INSDC:color:text > map <  INSDC:x2cs:map:BINSET, INSDC:x2cs:map:CHARSET > ( out_x2cs_bin )
+        ;
+
+    /* triggers from stats */
+    INSDC:quality:phred in_qual_phred
+        = QUALITY
+        ;
+    INSDC:coord:len in_read_len
+        = READ_LEN
+        ;
+    INSDC:SRA:xread_type in_read_type
+        = READ_TYPE
+        ;
+    ascii in_spot_group
+        = SPOT_GROUP
+        ;
+    trigger meta_stats
+        = NCBI:SRA:cmp_stats_trigger ( in_cmp_x2cs_bin, in_qual_phred, in_read_len, in_read_type, in_spot_group )
+        | NCBI:SRA:cmp_stats_trigger ( in_cmp_x2cs_bin, in_qual_phred, in_read_len, in_read_type )
+        ;
+    trigger qual_stats
+        = NCBI:SRA:phred_stats_trigger #1 ( in_qual_phred )
+        ;
+
+    extern column <ascii> zip_encoding CMP_LINKAGE_GROUP;
+
+    // restored LINKAGE_GROUP
+    readonly column ascii LINKAGE_GROUP = NCBI:align:seq_restore_linkage_group(.CMP_LINKAGE_GROUP, .PRIMARY_ALIGNMENT_ID)
+                                        | .CMP_LINKAGE_GROUP;
+};
+
+table NCBI:align:view:cs_seq #1.1 = NCBI:align:tbl:cs_seq #1.2
+{
+    // various READ columns
+    default readonly column INSDC:dna:text READ
+        = < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_dcmp_4na_bin )
+        | < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_4na_bin )
+        ;
+    readonly column INSDC:4na:bin READ = out_dcmp_4na_bin | out_4na_bin;
+    readonly column INSDC:4na:packed READ = pack ( out_dcmp_4na_bin ) | pack ( out_4na_bin );
+    readonly column INSDC:x2na:bin READ = out_dcmp_x2na_bin | out_x2na_bin;
+    readonly column INSDC:2na:bin READ = out_dcmp_2na_bin | out_2na_bin;
+    INSDC:2na:bin out_dcmp_2na_bin
+        = < INSDC:x2na:bin, INSDC:2na:bin > map < INSDC:x2na:map:BINSET, [ 0, 1, 2, 3, 0 ] > ( out_dcmp_x2na_bin )
+        ;
+    INSDC:2na:bin out_2na_bin
+        = < INSDC:x2na:bin, INSDC:2na:bin > map < INSDC:x2na:map:BINSET, [ 0, 1, 2, 3, 0 ] > ( out_x2na_bin )
+        ;
+    readonly column INSDC:2na:packed READ = pack ( out_dcmp_2na_bin ) | pack ( out_2na_bin );
+
+    // decompression in base space
+    INSDC:coord:len cmp_read_len
+        = < INSDC:coord:len > NCBI:align:make_cmp_read_desc #1 < true > ( .READ_LEN, .PRIMARY_ALIGNMENT_ID )
+        ;
+    INSDC:coord:zero cmp_read_start
+        = NCBI:align:make_read_start #1 ( cmp_read_len )
+        ;
+    INSDC:x2na:bin out_cmp_x2na_bin
+        = NCBI:dna_from_color #1 ( out_cmp_x2cs_bin, cmp_read_start, cmp_read_len, .CS_KEY, color_matrix )
+        ;
+    INSDC:x2na:bin out_x2na_bin
+        = NCBI:dna_from_color #1 ( out_x2cs_bin, .READ_START, .READ_LEN, .CS_KEY, color_matrix )
+        ;
+    INSDC:4na:bin out_cmp_4na_bin
+        = < INSDC:x2na:bin, INSDC:4na:bin > map < INSDC:x2na:map:BINSET, [ 1, 2, 4, 8, 15 ] > ( out_cmp_x2na_bin )
+        ;
+    INSDC:4na:bin out_4na_bin
+        = < INSDC:x2na:bin, INSDC:4na:bin > map < INSDC:x2na:map:BINSET, [ 1, 2, 4, 8, 15 ] > ( out_x2na_bin )
+        ;
+    INSDC:4na:bin out_dcmp_4na_bin
+        = NCBI:align:seq_restore_read ( out_cmp_4na_bin, .PRIMARY_ALIGNMENT_ID, .READ_LEN, .READ_TYPE )
+        ;
+
+
+    // various CSREAD columns
+    default readonly column INSDC:color:text CSREAD
+        = < INSDC:x2cs:bin, INSDC:color:text > map <  INSDC:x2cs:map:BINSET, INSDC:x2cs:map:CHARSET > ( out_dcmp_x2cs_bin )
+        | out_color_text;
+    readonly column INSDC:x2cs:bin CSREAD = out_dcmp_x2cs_bin | out_x2cs_bin;
+    readonly column INSDC:2cs:bin CSREAD = out_dcmp_2cs_bin | out_2cs_bin;
+    INSDC:2cs:bin out_dcmp_2cs_bin
+        = < INSDC:x2cs:bin, INSDC:2cs:bin > map < INSDC:x2cs:map:BINSET, [ 0, 1, 2, 3, 0 ] > ( out_dcmp_x2cs_bin )
+        ;
+    readonly column INSDC:2cs:packed CSREAD = pack ( out_dcmp_2cs_bin ) | out_2cs_bin;
+
+
+    // decompression in color space
+    INSDC:x2na:bin out_dcmp_x2na_bin
+        = < INSDC:4na:bin, INSDC:x2na:bin > map < INSDC:4na:map:BINSET, [ 4,0,1,4,2,4,4,4,3,4,4,4,4,4,4,4 ] > ( out_dcmp_4na_bin )
+        ;
+    INSDC:x2cs:bin out_dcmp_x2na_x2cs_bin
+        = NCBI:color_from_dna #1 ( out_dcmp_x2na_bin, .READ_START, .READ_LEN, .CS_KEY, color_matrix )
+        ;
+    INSDC:coord:len aligned_read_len
+        = < INSDC:coord:len > NCBI:align:make_cmp_read_desc #1 < false > ( .READ_LEN, .PRIMARY_ALIGNMENT_ID )
+        ;
+    INSDC:x2cs:bin out_dcmp_x2cs_bin
+        = < INSDC:x2cs:bin > NCBI:align:seq_construct_read #1 ( out_dcmp_x2na_x2cs_bin, .READ_LEN, out_cmp_x2cs_bin, cmp_read_len )
+        ;
+
+    // CS_NATIVE - dynamic
+    U32 cmp_csread_row_len
+        = row_len #1 ( phys_cmp_2cs_packed )
+        ;
+    U32 cmp_csread_not_zero
+        = < U32 > clip < 0, 1 > ( cmp_csread_row_len )
+        ;
+    readonly column bool CS_NATIVE
+        = < U32, bool > map < [ 0, 1 ], [ false, true ] > ( cmp_cs_read_not_zero )
+        ;
+
+    // COLOR_MATRIX
+    readonly column U8 COLOR_MATRIX
+        = color_matrix
+        ;
+    U8 color_matrix
+        = < U8 > echo < INSDC:color:default_matrix > ()
+        ;
+
+    // various QUALITY types
+    readonly column INSDC:quality:text:phred_33 QUALITY
+        = out_qual_text_phred_33
+        | ( INSDC:quality:text:phred_33 ) < B8 > sum < 33 > ( .QUALITY );
+    readonly column INSDC:quality:text:phred_64 QUALITY
+        = out_qual_text_phred_64
+        | ( INSDC:quality:text:phred_64 ) < B8 > sum < 64 > ( .QUALITY );
+
+    // SPOT_LEN
+    INSDC:coord:len spot_len
+        = ( INSDC:coord:len ) row_len ( out_dcmp_4na_bin )
+        | ( INSDC:coord:len ) row_len ( out_4na_bin )
+        ;
+    readonly column INSDC:coord:len SPOT_LEN = spot_len;
+
+    // TRIM_START
+    readonly column INSDC:coord:zero TRIM_START
+        = < INSDC:coord:zero > echo < 0 > ()
+        ;
+    readonly column INSDC:coord:one TRIM_START
+        = < INSDC:coord:one > echo < 1 > ()
+        ;
+    // TRIM_LEN
+    readonly column INSDC:coord:len TRIM_LEN = spot_len;
+
+    // MIN_SPOT_ID
+    readonly column INSDC:SRA:spotid_t MIN_SPOT_ID
+        = < INSDC:SRA:spotid_t > meta:value < "STATS/TABLE/SPOT_MIN" > ()
+        ;
+    // MAX_SPOT_ID
+    readonly column INSDC:SRA:spotid_t MAX_SPOT_ID
+        = < INSDC:SRA:spotid_t > meta:value < "STATS/TABLE/SPOT_MAX" > ()
+        ;
+    // SPOT_COUNT
+    readonly column U64 SPOT_COUNT
+        = < U64 > meta:value < "STATS/TABLE/SPOT_COUNT" > ()
+        ;
+    // BASE_COUNT
+    U64 base_count
+        = < U64 > meta:value < "STATS/TABLE/BASE_COUNT" > ()
+        ;
+    readonly column U64 BASE_COUNT = base_count;
+    // BIO_BASE_COUNT
+    readonly column U64 BIO_BASE_COUNT
+        = < U64 > meta:value < "STATS/TABLE/BIO_BASE_COUNT" > ()
+        ;
+    // CMP_BASE_COUNT
+    readonly column U64 CMP_BASE_COUNT
+        = < U64 > meta:value < "STATS/TABLE/CMP_BASE_COUNT" > ()
+        | base_count
+        ;
+
+    // various PLATFORM
+    // TBD
+
+    // SPOT_ID
+    I64 rowid_64 = row_id ();
+    readonly column INSDC:SRA:spotid_t SPOT_ID
+        = cast ( rowid_64 )
+        ;
+
+    readonly column ascii NAME
+        = sprintf < "%u" > ( SPOT_ID )
+        ;
+
+};
+
+
+/***********************************
+* Reference table - to store reference sequences
+* Sequences are divided in chunks. Two sequences never share a chunk.
+* SEQ_LEN     - real size of a chunk should never exceed MAX_SEQ_LEN when it is set
+* READ        - inherited from NCBI:tbl:base_space
+* CMP_READ,CMP_ALTREAD - are inherited from NCBI:align:tbl:cmp_base_space
+* SEQ_ID,SEQ_START,SEQ_LEN are inherited from  NCBI:align:tbl:seqloc
+* .skey contains NAME of the chunk - it corresponds to actual name used in BAM (chr1,chr2, etc....)
+*
+* SEQ_START,SEQ_LEN,MAX_SEQ_LEN,SEQID and rowlen(READ) operate the following way
+* - SEQ_LEN < MAX_SEQ_LEN - should only happen on the last chunk of the sequence
+* - .READ is absent - there should be a retrieval from external services by SEQ_ID,SEQ_START,SEQ_LEN
+* - rowlen(.READ) = 0  && SEQ_START==0 (used as flag) -  the sequence is SEQ_LEN repetition of 'N'
+* - rowlen(.READ) = 0  && SEQ_START >= 1 - the sequence have to be fetched from external sources
+* - 0 < rowlen(.READ)< SEQ_LEN -- the sequence have to be filled with 'N's
+*
+v***********************************/
+table NCBI:align:tbl:reference #2 =
+    NCBI:align:tbl:cmp_base_space #1,
+    NCBI:tbl:base_space #2.0.3,
+    NCBI:tbl:seqloc #1,
+    NCBI:SRA:tbl:stats #1.2.0
+{
+    INSDC:quality:phred out_qual_phred
+        = < INSDC:quality:phred > echo < 30 > ( out_dcmp_4na_bin );
+
+    //  MAX_SEQ_LEN - should be a constant == static column
+    extern column < U32 > izip_encoding MAX_SEQ_LEN;
+
+    // indicates if sequence has circular structure
+    // copied from refSeq
+    extern column bool_encoding CIRCULAR;
+
+    // make CS_KEY writable
+    INSDC:dna:text in_cs_key
+        = < INSDC:dna:text, INSDC:dna:text > map < 'acgtn', 'ACGTN' > ( CS_KEY );
+    physical column < INSDC:dna:text > zip_encoding .CS_KEY = in_cs_key;
+
+    U32 in_spot_len = SEQ_LEN;
+
+    INSDC:coord:len _alt_in_read_len
+        = READ_LEN
+        | SEQ_LEN;
+
+    INSDC:SRA:xread_type _alt_in_read_type
+        = READ_TYPE
+        | < INSDC:SRA:xread_type > echo < SRA_READ_TYPE_BIOLOGICAL > ();
+
+    // extra columns needed for CS conversion
+    INSDC:coord:zero out_read_start = < INSDC:coord:zero > echo < 0 > ();
+    INSDC:coord:len  out_read_len = .SEQ_LEN;
+
+    extern column utf8  NAME = out_spot_name_utf8;
+    physical utf8 .NAME = idx:text:insert #1.0  < 'i_name' > ( NAME );
+
+    utf8 out_spot_name_utf8 = idx:text:project #1.0 < 'i_name' > (.NAME );
+
+    ascii out_spot_name = cast ( out_spot_name_utf8 );
+
+    INSDC:coord:zero trim_start = < INSDC:coord:zero > echo < 0 > ();
+    INSDC:coord:len trim_len = base_space_spot_len;
+
+    ascii out_label
+        = < ascii > echo < "reference" > ();
+    INSDC:coord:zero out_label_start
+        = < INSDC:coord:zero > echo < 0 > ();
+    INSDC:coord:len out_label_len
+        = < INSDC:coord:len > echo < 9 > ();
+
+    U32 out_nreads
+        = < U32 > echo < 1 > ();
+    INSDC:SRA:xread_type out_read_type
+        = < INSDC:SRA:xread_type > echo < 3 > ();
+    INSDC:SRA:read_filter out_rd_filter
+        = < INSDC:SRA:read_filter > echo < SRA_READ_FILTER_PASS > ();
+
+
+// Columns of computed coverages by alignment
+
+    // TBD: use percentiles instead of min/max?
+    // maximum value clipped at 255 of the coverage density
+    // for a chunk
+    extern column < U8 > izip_encoding CGRAPH_HIGH;
+
+    // minimum value clipped at 255 of the coverage density
+    // for a chunk
+    extern column < U8 > izip_encoding CGRAPH_LOW;
+
+    // count of the number of mismatches in the chunk
+    extern column < U32 > izip_encoding CGRAPH_MISMATCHES;
+
+    // count of the number of inserts and deletes in the chunk
+    extern column < U32 > izip_encoding CGRAPH_INDELS;
+
+    // List of row ids from alignment tables
+    extern column < I64 > izip_encoding PRIMARY_ALIGNMENT_IDS;
+    extern column < I64 > izip_encoding SECONDARY_ALIGNMENT_IDS;
+    extern column < I64 > izip_encoding EVIDENCE_INTERVAL_IDS;
+
+    // both OVERLAP_REF_* columns are array of three elements, matching number of *_IDS columns above.
+    // points back to an offset where the alignments to this chunk start
+    extern column < INSDC:coord:zero > izip_encoding OVERLAP_REF_POS;
+    // indicates the length of the longest tail of the alignmnent to this chunk which start in previous chunks
+    // if value of an element in this col is zero corresponding value of OVERLAP_REF_POS is meaningless
+    extern column < INSDC:coord:len > izip_encoding OVERLAP_REF_LEN;
+
+    // Mechanism to seach for NAME
+    readonly column vdb:row_id_range NAME_RANGE
+        = idx:text:lookup #1.0 < 'i_name', 'QUERY_SEQ_NAME' > ();
+
+    // Fully instantiates READ
+    INSDC:4na:bin out_dcmp_4na_bin
+        = NCBI:align:ref_restore_read (out_cmp_4na_bin, .SEQ_ID, .SEQ_START, .SEQ_LEN);
+}
+
+// THE DATABASES
+database NCBI:align:db:alignment_sorted #1.3
+{
+    table NCBI:align:tbl:reference #2 REFERENCE;
+    table NCBI:align:tbl:align_sorted #1.2 PRIMARY_ALIGNMENT;
+    table NCBI:align:tbl:align_mate_sorted #1.1 SECONDARY_ALIGNMENT;
+    table NCBI:align:tbl:seq #1.1 SEQUENCE;
+    table NCBI:align:view:cs_seq #1.1 CS_SEQUENCE;
+    table NCBI:align:tbl:qstat #1.0 QUAL_STAT;
+};
+
+database NCBI:align:db:alignment_unsorted #1.3
+{
+    table NCBI:align:tbl:reference #2 REFERENCE;
+    table NCBI:align:tbl:align_unsorted #1.2 PRIMARY_ALIGNMENT;
+    table NCBI:align:tbl:align_mate_unsorted #1.1 SECONDARY_ALIGNMENT;
+    table NCBI:align:tbl:seq #1.1 SEQUENCE;
+    table NCBI:align:view:cs_seq #1.1 CS_SEQUENCE;
+    table NCBI:align:tbl:qstat #1.0 QUAL_STAT;
+};
+
+database NCBI:align:db:alignment_evidence #1.3
+{
+    table NCBI:align:tbl:reference #2 REFERENCE;
+    table NCBI:align:tbl:align_unsorted #1.2 PRIMARY_ALIGNMENT;
+    table NCBI:align:tbl:align_mate_unsorted #1.1 SECONDARY_ALIGNMENT;
+    table NCBI:align:tbl:align_allele #1.2 EVIDENCE_INTERVAL;
+    table NCBI:align:tbl:align_mate_unsorted #1.1 EVIDENCE_ALIGNMENT;
+    table NCBI:align:tbl:seq #1.1 SEQUENCE;
+    table NCBI:align:view:cs_seq #1.1 CS_SEQUENCE;
+    table NCBI:align:tbl:qstat #1.0 QUAL_STAT;
+};
+
+database NCBI:align:db:alignment_evidence_sorted #1.2
+{
+    table NCBI:align:tbl:reference #2 REFERENCE;
+    table NCBI:align:tbl:align_sorted #1.2 PRIMARY_ALIGNMENT;
+    table NCBI:align:tbl:align_mate_sorted #1.1 SECONDARY_ALIGNMENT;
+    table NCBI:align:tbl:align_allele #1.2 EVIDENCE_INTERVAL;
+    table NCBI:align:tbl:align_mate_unsorted #1.1 EVIDENCE_ALIGNMENT;
+    table NCBI:align:tbl:seq #1.1 SEQUENCE;
+    table NCBI:align:view:cs_seq #1.1 CS_SEQUENCE;
+    table NCBI:align:tbl:qstat #1.0 QUAL_STAT;
+};
+
+database NCBI:align:db:unaligned #1
+{
+    table NCBI:align:tbl:seq #1.1 SEQUENCE;
+    table NCBI:SRA:ABI:tbl:v2 #1.0.4 CS_SEQUENCE;
+    table NCBI:align:tbl:qstat #1.0 QUAL_STAT;
+};
diff --git a/interfaces/align/alignsrc.h b/interfaces/align/alignsrc.h
new file mode 100644
index 0000000..c894419
--- /dev/null
+++ b/interfaces/align/alignsrc.h
@@ -0,0 +1,71 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_align_alignsrc_
+#define _h_align_alignsrc_
+
+#ifndef _h_align_extern_
+ #include <align/extern.h>
+#endif
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * AlignSrc
+ *  an alignment guy
+ */
+typedef struct AlignSrc AlignSrc;
+
+
+/* Make
+ *  create an alignment source object from BAM file
+ *
+ *  "as" [ OUT ] - return parameter for AlignSrc object
+ *
+ *  "bam" [ IN ] - NUL terminated path to BAM file
+ *
+ *  "bai" [ IN, NULL OKAY ] - optional NUL terminated path to BAM index file
+ */
+ALIGN_EXTERN int CC AlignSrcMakeFromBAM ( const AlignSrc **as, const char *bam, const char *bai );
+
+
+/* Dispose
+ *  release all resources associated with alignment source
+ */
+ALIGN_EXTERN int CC AlignSrcDispose ( const AlignSrc *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_alignsrc_ */
diff --git a/interfaces/align/bam.h b/interfaces/align/bam.h
new file mode 100644
index 0000000..7081c7b
--- /dev/null
+++ b/interfaces/align/bam.h
@@ -0,0 +1,836 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_align_bam_
+#define _h_align_bam_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDirectory;
+struct KFile;
+struct VPath;
+struct AlignAccessDB;
+struct AlignAccessAlignmentEnumerator;
+
+
+/*--------------------------------------------------------------------------
+ * BAMAlignment
+ */
+typedef struct BAMAlignment BAMAlignment;
+
+    
+/* GetBAMAlignment
+ *  get property
+ *
+ * Release with BAMAlignmentRelease.
+ */
+ALIGN_EXTERN rc_t CC AlignAccessAlignmentEnumeratorGetBAMAlignment
+    ( const struct AlignAccessAlignmentEnumerator *self, const BAMAlignment **result );
+
+
+/* AddRef
+ * Release
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentAddRef ( const BAMAlignment *self );
+ALIGN_EXTERN rc_t CC BAMAlignmentRelease ( const BAMAlignment *self );
+
+
+/* GetReadLength
+ *  get the sequence length
+ *  i.e. the number of elements of both sequence and quality
+ *
+ *  "length" [ OUT ] - length in bases of query sequence and quality
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetReadLength ( const BAMAlignment *self, uint32_t *length );
+
+
+/* GetSequence
+ *  get the sequence data [0..ReadLength)
+ *  caller provides buffer of ReadLength bytes
+ *
+ *  "sequence" [ OUT ] - pointer to a buffer of at least ReadLength bytes
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetSequence ( const BAMAlignment *self, char *sequence );
+
+/* GetSequence2
+ *  get the sequence data [0..ReadLength)
+ *  caller provides buffer of ReadLength bytes
+ *
+ *  "sequence" [ OUT ] - pointer to a buffer of at least ReadLength bytes
+ *
+ *  "start" [ IN ] and "stop" [ IN ] - zero-based coordinates, half-closed interval
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetSequence2 ( const BAMAlignment *self, char *sequence, uint32_t start, uint32_t stop);
+
+    
+/* GetQuality
+ *  get the raw quality data [0..ReadLength)
+ *  values are unsigned with 0xFF == missing
+ *
+ *  "quality" [ OUT ] - return param for quality sequence
+ *   held internally, validity is guaranteed for the life of the BAMAlignment
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetQuality ( const BAMAlignment *self, const uint8_t **quality );
+
+/* GetQuality2
+ *  get the raw quality data [0..ReadLength) from OQ if possible else from QUAL
+ *  values are unsigned with 0xFF == missing
+ *
+ *  "quality" [ OUT ] - return param for quality sequence
+ *   held internally, validity is guaranteed for the life of the BAMAlignment
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetQuality2(const BAMAlignment *self, const uint8_t **quality, uint8_t *offset);
+
+/* GetRefSeqId
+ *  get id of reference sequence
+ *  pass result into BAMFileGetRefSeqById to get the Reference Sequence record
+ *
+ *  "refSeqId" [ OUT ] - zero-based id of reference sequence
+ *   returns -1 if set as invalid within BAM ( rc may be zero )
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetRefSeqId ( const BAMAlignment *self, int32_t *refSeqId );
+
+/* GetMateRefSeqId
+ *  get id of mate's reference sequence
+ *  pass result into BAMFileGetRefSeqById to get the Reference Sequence record
+ *
+ *  "refSeqId" [ OUT ] - zero-based id of reference sequence
+ *   returns -1 if invalid
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetMateRefSeqId ( const BAMAlignment *self, int32_t *refSeqId );
+
+
+/* GetPosition
+ *  get the aligned position on the ref. seq.
+ *
+ *  "n" [ IN ] - zero-based position index for cases of multiple alignments
+ *
+ *  "pos" [ OUT ] - zero-based position on reference sequence
+ *  returns -1 if invalid
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetPosition ( const BAMAlignment *self, int64_t *pos );
+    
+/* GetPosition2
+ *  get the aligned start position on the ref. seq.
+ *  get the aligned length on the ref. seq.
+ *
+ *  "n" [ IN ] - zero-based position index for cases of multiple alignments
+ *
+ *  "pos" [ OUT ] - zero-based position on reference sequence
+ *  returns -1 if invalid
+ *
+ *  "length" [ OUT ] - length of alignment on reference sequence
+ *  returns 0 if invalid
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetPosition2 ( const BAMAlignment *self, int64_t *pos, uint32_t *length );
+    
+
+/* GetMatePosition
+ *  starting coordinate of mate's alignment on ref. seq.
+ *
+ *  "pos" [ OUT ] - zero-based position on reference sequence
+ *  returns -1 if invalid
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetMatePosition ( const BAMAlignment *self, int64_t *pos );
+
+
+/* IsMapped
+ *  is the alignment mapped to something
+ */
+ALIGN_EXTERN bool CC BAMAlignmentIsMapped ( const BAMAlignment *self );
+
+
+/* GetReadGroupName
+ *  get the name of the read group (i.e. accession)
+ *  pass result into BAMFileGetReadGroupByName to get the Read Group record
+ *
+ *  "name" [ OUT ] - return param for NUL-terminated read group name
+ *   held internally, validity is guaranteed for the life of the BAMAlignment
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetReadGroupName ( const BAMAlignment *self, const char **name );
+
+
+/* GetReadName
+ *  get the read name (i.e. spot name)
+ * GetReadName2
+ *  get the read name and length in bytes
+ *
+ *  "name" [ OUT ] - return param for NUL-terminated read name
+ *   held internally, validity is guaranteed for the life of the BAMAlignment
+ *
+ *  "length" [ OUT ] - return the number of bytes in "name"
+ *   excluding terminating NUL.
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetReadName ( const BAMAlignment *self, const char **name );
+ALIGN_EXTERN rc_t CC BAMAlignmentGetReadName2 ( const BAMAlignment *self, const char **name, size_t *length );
+    
+    
+/* GetReadName3
+ *  get the read name and length in bytes
+ *  applies fixups to name
+ *
+ *  "name" [ OUT ] - return param for read name
+ *   held internally, validity is guaranteed for the life of the BAMAlignment
+ *
+ *  "length" [ OUT ] - return the number of bytes in "name"
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetReadName3 ( const BAMAlignment *self, const char **name, size_t *length );
+
+/* HasColorSpace
+ *  Does the alignment have colorspace info
+ */
+ALIGN_EXTERN bool CC BAMAlignmentHasColorSpace ( const BAMAlignment *self );
+
+/* GetCSKey
+ *  get the colorspace key
+ *
+ *  "cskey" [ OUT ] - return param 
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetCSKey ( const BAMAlignment *self, char cskey[1] );
+
+ALIGN_EXTERN rc_t CC BAMAlignmentGetCSSeqLen ( const BAMAlignment *self, uint32_t *seqLen );
+/* GetCSSequence
+ *  get the colorspace sequence data [0..seqLen)
+ *  caller provides buffer of seqLen bytes
+ *
+ *  "csseq" [ OUT ] - pointer to a buffer of at least seqLen bytes
+ *  "seqLen" [ IN ] - length of sequence from BAMAlignmentGetCSSeqLen
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetCSSequence ( const BAMAlignment *self, char *csseq, uint32_t seqLen );
+
+ALIGN_EXTERN rc_t CC BAMAlignmentGetCSQuality(BAMAlignment const *cself, uint8_t const **quality, uint8_t *offset);
+
+
+/* GetFlags
+ *  return the raw "flags" bitmap word
+ *
+ *  "flags" [ OUT ] - return parameter for bitmap word
+ */
+enum BAMFlags
+{
+    BAMFlags_bit_WasPaired = 0,  /* was paired when sequenced */
+    BAMFlags_bit_IsMappedAsPair,
+    BAMFlags_bit_SelfIsUnmapped,
+    BAMFlags_bit_MateIsUnmapped,
+    BAMFlags_bit_SelfIsReverse,
+    BAMFlags_bit_MateIsReverse,
+    BAMFlags_bit_IsFirst,        /* and mate exists */
+    BAMFlags_bit_IsSecond,       /* and mate exists */
+    BAMFlags_bit_IsNotPrimary,   /* a read having split hits may have multiple primary alignments */
+    BAMFlags_bit_IsLowQuality,   /* fails platform/vendor quality checks */
+    BAMFlags_bit_IsDuplicate,    /* PCR or optical dup */
+    BAMFlags_bit_IsSupplemental,
+
+    BAMFlags_WasPaired      = (1 << BAMFlags_bit_WasPaired),
+    BAMFlags_IsMappedAsPair	= (1 << BAMFlags_bit_IsMappedAsPair),
+    BAMFlags_SelfIsUnmapped	= (1 << BAMFlags_bit_SelfIsUnmapped),
+    BAMFlags_MateIsUnmapped	= (1 << BAMFlags_bit_MateIsUnmapped),
+    BAMFlags_SelfIsReverse	= (1 << BAMFlags_bit_SelfIsReverse),
+    BAMFlags_MateIsReverse	= (1 << BAMFlags_bit_MateIsReverse),
+    BAMFlags_IsFirst        = (1 << BAMFlags_bit_IsFirst),
+    BAMFlags_IsSecond       = (1 << BAMFlags_bit_IsSecond),
+    BAMFlags_IsNotPrimary	= (1 << BAMFlags_bit_IsNotPrimary),
+    BAMFlags_IsLowQuality	= (1 << BAMFlags_bit_IsLowQuality),
+    BAMFlags_IsDuplicate	= (1 << BAMFlags_bit_IsDuplicate),
+    BAMFlags_IsSupplemental  = (1 << BAMFlags_bit_IsSupplemental)
+};
+
+ALIGN_EXTERN rc_t CC BAMAlignmentGetFlags ( const BAMAlignment *self, uint16_t *flags );
+
+
+/* GetMapQuality
+ *  return the quality score of mapping
+ *
+ *  "qual" [ OUT ] - return param for quality score
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetMapQuality ( const BAMAlignment *self, uint8_t *qual );
+
+
+/* GetAlignmentDetail
+ *  get the alignment details
+ *
+ *  "rslt" [ OUT, NULL OKAY ] and "count" [ IN ] - array to hold detail records
+ *
+ *  "actual" [ OUT, NULL OKAY ] - number of elements written to "rslt"
+ *   required if "rslt" is not NULL
+ *
+ *  "firstMatch" [ OUT, NULL OKAY ] - zero-based index into "rslt" of the first match to the refSeq
+ *   or < 0 if invalid
+ *
+ *  "lastMatch" [ OUT, NULL OKAY ] - zero-based index into "rslt" of the last match to the refSeq
+ *   or < 0 if invalid
+ */
+typedef uint32_t BAMCigarType;
+enum BAMCigarTypes
+{
+    ct_Match    = 'M', /* 0 */
+    ct_Insert   = 'I', /* 1 */
+    ct_Delete   = 'D', /* 2 */
+    ct_Skip     = 'N', /* 3 */
+    ct_SoftClip = 'S', /* 4 */
+    ct_HardClip = 'H', /* 5 */
+    ct_Padded   = 'P', /* 6 */
+    ct_Equal    = '=', /* 7 */
+    ct_NotEqual = 'X', /* 8 */
+    ct_Overlap  = 'B' /* Complete Genomics extension */
+};
+
+typedef struct BAMAlignmentDetail BAMAlignmentDetail;
+struct BAMAlignmentDetail
+{
+    int64_t refSeq_pos; /* position on refSeq where this alignment region starts or -1 if NA */
+    int32_t read_pos;   /* position on read where this alignment region starts or -1 if NA */
+    uint32_t length;    /* length of alignment region */
+    BAMCigarType type;  /* type of alignment */
+};
+
+ALIGN_EXTERN rc_t CC BAMAlignmentGetAlignmentDetail ( const BAMAlignment *self,
+    BAMAlignmentDetail *rslt, uint32_t count, uint32_t *actual,
+    int32_t *firstMatch, int32_t *lastMatch );
+
+
+/* GetCigarCount
+ *  the number of CIGAR elements
+ *  a CIGAR element consists of the pair of matching op code and op length
+ *
+ *  "n" [ OUT ] - return param for cigar count
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetCigarCount ( const BAMAlignment *self, uint32_t *n );
+
+
+ALIGN_EXTERN rc_t CC BAMAlignmentGetRawCigar(const BAMAlignment *cself, uint32_t const **rslt, uint32_t *length);
+
+/* GetCigar
+ *  get CIGAR element n [0..GetCigarCount)
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetCigar ( const BAMAlignment *self,
+    uint32_t n, BAMCigarType *type, uint32_t *length );
+
+
+/* GetInsertSize
+ *  distance in bases to start of mate's alignment on ref. seq.
+ *
+ *  "size" [ OUT ] - >0 for first in pair, <0 for second
+ */
+ALIGN_EXTERN rc_t CC BAMAlignmentGetInsertSize ( const BAMAlignment *self, int64_t *size );
+
+ALIGN_EXTERN rc_t CC BAMAlignmentFormatSAM(const BAMAlignment *self,
+                                           size_t *actsize,
+                                           size_t maxsize,
+                                           char *buffer);
+
+/* OptDataForEach
+ *  DANGER
+ *  these optional fields are the weakest part of BAM.
+ *
+ *  It is probably best to not use this info.
+ *  You can't count on them being there.
+ *  Moreover, you might need to interpret the types correctly.
+ */
+typedef uint32_t BAMOptDataValueType;
+enum BAMOptDataValueTypes
+{
+    dt_CSTRING = 'Z',
+    dt_INT8 = 'c',
+    dt_UINT8 = 'C',
+    dt_INT16 = 's',     
+    dt_UINT16 = 'S',    
+    dt_INT = 'i',
+    dt_UINT = 'I',
+    dt_FLOAT32 = 'f',
+#if 0
+    dt_FLOAT64 = 'd', /* removed? not in Dec 19 2013 version of SAMv1.pdf */
+#endif
+    dt_ASCII = 'A',
+    dt_HEXSTRING = 'H',
+    dt_NUM_ARRAY = 'B'
+};
+
+#define OPT_TAG_X "X?" /* end user data */
+#define OPT_TAG_Y "Y?" /* end user data */
+#define OPT_TAG_Z "Z?" /* end user data */
+
+#define OPT_TAG_ReadGroup   "RG" /* Read Group; same as BAMAlignmentGetReadGroupName */
+#define OPT_TAG_Library     "LB" /* LIbrary; also BAMReadGroup */
+#define OPT_TAG_Unit        "PU" /* Platform specific Unit; also BAMReadGroup */
+#define OPT_TAG_Program     "PG" /* Alignment software name */
+#define OPT_TAG_AlignScore  "AS" /* Alignment Score (MapQuality?) */
+#define OPT_TAG_SecQual     "SQ" /* second called base:2 and quality:6; length == ReadLength? warning */
+#define OPT_TAG_MateMapQual "MQ" /* map Quality of mate */
+#define OPT_TAG_NumMismatch "NM" /* Number of Mismatches */
+#define OPT_TAG_Hits0       "H0" /* Number of perfect hits */
+#define OPT_TAG_Hits1       "H1" /* Number of off-by-one */
+#define OPT_TAG_Hits2       "H2" /* Number of off-by-two */
+#define OPT_TAG_CondQual    "UQ" /* conditional Quality of read */
+#define OPT_TAG_CondQPair   "PQ" /* conditional Quality of pair */
+#define OPT_TAG_ReadHits    "NH" /* Number of times this read (spot) aligns */
+#define OPT_TAG_ReadHits2   "IH" /* Number of times this read (spot) aligns that are in this file */
+#define OPT_TAG_HitIndex    "HI" /* n-th hit for this read in this file */
+#define OPT_TAG_Match2      "MD" /* another sort of matching string like CIGAR but different? */
+#define OPT_TAG_ColorKey    "CS" /* primer and first color */
+#define OPT_TAG_ColorQual   "CQ" /* quality of above */
+#define OPT_TAG_ColorMisses "CM" /* Number of color-space Mismatches */
+#define OPT_TAG_SeqOverlap  "GS" 
+#define OPT_TAG_QualOverlap "GQ" 
+#define OPT_TAG_OverlapDesc "GC"
+#define OPT_TAG_MateSeq     "R2" /* sequence of the mate */
+#define OPT_TAG_MateQual    "Q2" /* quality scores of the mate */
+#define OPT_TAG_OtherQual   "S2"
+#define OPT_TAG_NextHitRef  "CC" /* Reference name of the next hit */
+#define OPT_TAG_NextHitPos  "CP" /* coordinate of the next hit */
+#define OPT_TAG_SingleMapQ  "SM" /* quality of mapping as if not paired */
+#define OPT_TAG_AM          "AM"
+#define OPT_TAG_MAQFlag     "MQ"
+
+
+struct BAMOptData
+{
+    BAMOptDataValueType type;
+    uint32_t element_count;
+    union {
+        int8_t i8[8];
+        uint8_t u8[8];
+        int16_t i16[4];
+        uint16_t u16[4];
+        int32_t i32[2];
+        uint32_t u32[2];
+        int64_t i64[2];
+        uint64_t u64[2];
+        float f32[2];
+        double f64[1];
+        char asciiz[8];
+    } u;
+};
+
+typedef struct BAMOptData BAMOptData;
+
+typedef rc_t ( CC * BAMOptionalDataFunction )
+    ( void *ctx, const char tag[2], const BAMOptData *value );
+
+ALIGN_EXTERN rc_t CC BAMAlignmentOptDataForEach
+    ( const BAMAlignment *self, void *ctx, BAMOptionalDataFunction callback );
+
+    
+ALIGN_EXTERN bool CC BAMAlignmentHasCGData(BAMAlignment const *self);
+
+    
+ALIGN_EXTERN
+rc_t CC BAMAlignmentGetCGSeqQual(BAMAlignment const *self,
+                                 char sequence[/* 35 */],
+                                 uint8_t quality[/* 35 */]);
+
+ALIGN_EXTERN
+rc_t CC BAMAlignmentGetCGCigar(BAMAlignment const *self,
+                               uint32_t *cigar,
+                               uint32_t cig_max,
+                               uint32_t *cig_act);
+    
+ALIGN_EXTERN rc_t BAMAlignmentGetTI(BAMAlignment const *self, uint64_t *ti);
+
+/* strand = '+', '-', or ' ' */
+ALIGN_EXTERN rc_t BAMAlignmentGetRNAStrand(BAMAlignment const *self, uint8_t *strand);
+
+ALIGN_EXTERN rc_t BAMAlignmentGetCGAlignGroup(BAMAlignment const *self,
+                                              char buffer[],
+                                              size_t max_size,
+                                              size_t *act_size);
+    
+    
+/*--------------------------------------------------------------------------
+ * BAMFile
+ */
+typedef struct BAMFile BAMFile;
+
+typedef struct BAMRefSeq BAMRefSeq;
+struct BAMRefSeq
+{
+    uint64_t length;
+    const char *name; /* not null unique */
+    const char *assemblyId;
+    const uint8_t *checksum;
+    const char *uri;
+    const char *species;
+    uint32_t id;
+    uint8_t checksum_array[16];
+};
+
+typedef struct BAMReadGroup BAMReadGroup;
+struct BAMReadGroup
+{
+    const char *name; /* not null unique, accession e.g. SRR001138 */
+    const char *sample; /* not null */
+    const char *library;
+    const char *description;
+    const char *unit; /* platform specific identifier, e.g. BI.080214_SL-XAJ_0001_FC2044KAAXX.7 */
+    const char *insertSize;
+    const char *center; /* e.g. BI */
+    const char *runDate;
+    const char *platform; /* e.g. ILLUMINA */
+    uint32_t id;
+};
+
+
+/* 64-bit structure stored as an integer
+ * The high-order 48 bits store the position in the file at which a 
+ * compressed block starts.  The low-order 16 bits store the position
+ * in the decompressed block at which a record starts.  This is the
+ * way that positions are represented in BAM indices.
+ */
+typedef uint64_t BAMFilePosition;
+
+
+/* Make
+ *  open the BAM file specified by path
+ *
+ *  "path" [ IN ] - NUL terminated string or format
+ */
+ALIGN_EXTERN rc_t CC BAMFileMake ( const BAMFile **result, const char *path, ... );
+
+ALIGN_EXTERN rc_t CC BAMFileMakeWithHeader ( const BAMFile **result,
+                                            char const headerText[],
+                                            char const path[], ... );
+
+/* MakeWithDir
+ *  open the BAM file specified by path and supplied directory
+ *
+ *  "dir" [ IN ] - directory object used to open file
+ *
+ *  "path" [ IN ] - NUL terminated string or format
+ */
+ALIGN_EXTERN rc_t CC BAMFileMakeWithDir ( const BAMFile **result,
+    struct KDirectory const *dir, const char *path, ... );
+ALIGN_EXTERN rc_t CC BAMFileVMakeWithDir ( const BAMFile **result,
+    struct KDirectory const *dir, const char *path, va_list args );
+
+/* Make
+ *  open the BAM file specified by file
+ *
+ *  "file" [ IN ] - an open KFile
+ */
+ALIGN_EXTERN rc_t CC BAMFileMakeWithKFile(const BAMFile **result,
+    struct KFile const *file);
+
+/* Make
+ *  open the BAM file specified by file
+ *
+ *  "file" [ IN ] - an open KFile
+ */
+ALIGN_EXTERN rc_t CC BAMFileMakeWithVPath(const BAMFile **result,
+    struct VPath const *path);
+
+/* ExportBAMFile
+ *  export the BAMFile object in use by the AlignAccessDB, if any
+ *  must be released via BAMFileRelease
+ */
+ALIGN_EXTERN rc_t CC AlignAccessDBExportBAMFile ( struct AlignAccessDB const *self,
+    const BAMFile **result );
+
+
+/* AddRef
+ * Release
+ */
+ALIGN_EXTERN rc_t CC BAMFileAddRef ( const BAMFile *self );
+ALIGN_EXTERN rc_t CC BAMFileRelease ( const BAMFile *self );
+
+
+/* GetPosition
+ *  get the position of the about-to-be read alignment
+ *  this position can be stored
+ *  this position can be passed into SetPosition to seek to the same alignment
+ *
+ *  "pos" [ OUT ] - return parameter for position
+ */
+ALIGN_EXTERN rc_t CC BAMFileGetPosition ( const BAMFile *self, BAMFilePosition *pos );
+
+
+/* GetProportionalPosition
+ *  get the aproximate proportional position in the input file
+ *  this is intended to be useful for computing progress
+ *
+ * NB - does not return rc_t
+ */
+ALIGN_EXTERN float CC BAMFileGetProportionalPosition ( const BAMFile *self );
+
+
+/* Read
+ *  read an aligment
+ *
+ *  "result" [ OUT ] - return param for BAMAlignment object
+ *   must be released with BAMAlignmentRelease
+ *
+ *  returns RC(..., ..., ..., rcRow, rcNotFound) at end
+ */
+ALIGN_EXTERN rc_t CC BAMFileRead ( const BAMFile *self, const BAMAlignment **result );
+
+    
+/* Read
+ *  read an aligment
+ *
+ *  "result" [ OUT ] - return param for BAMAlignment object
+ *   must be released with BAMAlignmentRelease, is invalidated or contents
+ *   change on next call to BAMFileRead2. Unlike with BAMFileRead, no attempt is
+ *   made to preserve this object.
+ *
+ *  returns:
+ *    RC(..., ..., ..., rcRow, rcNotFound) at end
+ *    RC(..., ..., ..., rcRow, rcInvalid) and RC(..., ..., ..., rcRow, rcEmpty)
+ *      are not fatal and are resumable
+ *
+ *  tries to use static buffers and will log messages about parsing errors
+ */
+ALIGN_EXTERN rc_t CC BAMFileRead2 ( const BAMFile *self, const BAMAlignment **result );
+
+
+/* Rewind
+ *  reset the position back to the first aligment in the file
+ */
+ALIGN_EXTERN rc_t CC BAMFileRewind ( const BAMFile *self );
+
+
+/* SetPosition
+ *  set the position to a particular alignment
+ *  pass in the values from GetPosition
+ */
+ALIGN_EXTERN rc_t CC BAMFileSetPosition ( const BAMFile *self, const BAMFilePosition *pos );
+
+
+/* GetRefSeqCount
+ *  get the number of Reference Sequences refered to in the header
+ *  this is not necessarily the number of Reference Sequences referenced
+ *  by the alignments
+ */
+ALIGN_EXTERN rc_t CC BAMFileGetRefSeqCount ( const BAMFile *self, uint32_t *count );
+
+
+/* GetRefSeq
+ *  get the n'th Ref. Seq. where n is [0..RefSeqCount)
+ *  the resulting pointer is static-like; it is freed when the BAMFile is.
+ *  IOW, it is good for precisely at long as the BAMFile is.
+ */
+ALIGN_EXTERN rc_t CC BAMFileGetRefSeq ( const BAMFile *self, uint32_t n, const BAMRefSeq **result );
+
+
+/* GetRefSeqById
+ *  get a Ref. Seq. by its id
+ *  the resulting pointer is static-like; it is freed when the BAMFile is.
+ *  IOW, it is good for precisely at long as the BAMFile is.
+ */
+ALIGN_EXTERN rc_t CC BAMFileGetRefSeqById ( const BAMFile *self, int32_t id, const BAMRefSeq **result );
+
+
+/* GetReadGroupCount
+ *  get the number of Read Groups (accessions, etc.) refered to in the header
+ *  this is not necessarily the number of Read Groups referenced
+ *  by the alignments
+ */
+ALIGN_EXTERN rc_t CC BAMFileGetReadGroupCount ( const BAMFile *self, uint32_t *count );
+
+/* GetReadGroup
+ *  get the n'th Read Group where n is [0..ReadGroupCount)
+ *  the resulting pointer is static-like; it is freed when the BAMFile is.
+ *  IOW, it is good for precisely at long as the BAMFile is.
+ */
+ALIGN_EXTERN rc_t CC BAMFileGetReadGroup ( const BAMFile *self, unsigned n, const BAMReadGroup **result );
+    
+/* GetHeaderText
+ *  get the text of the BAM header file
+ *  the resulting pointer is static-like; it is freed when the BAMFile is.
+ *  IOW, it is good for precisely at long as the BAMFile is.
+ */
+ALIGN_EXTERN rc_t CC BAMFileGetHeaderText(BAMFile const *cself, char const **header, size_t *header_len);
+    
+
+/* GetReadGroupByName
+ *  get a Read Group by its name
+ *  the resulting pointer is static-like; it is freed when the BAMFile is.
+ *  IOW, it is good for precisely at long as the BAMFile is.
+ */
+ALIGN_EXTERN rc_t CC BAMFileGetReadGroupByName ( const BAMFile *self,
+    const char *name, const BAMReadGroup **result );
+
+
+/* OpenIndex
+ *  takes a simple path...
+ */
+ALIGN_EXTERN rc_t CC BAMFileOpenIndex ( const BAMFile *self, const char *path );
+
+ALIGN_EXTERN rc_t CC BAMFileOpenIndexWithVPath ( const BAMFile *self, struct VPath const *path );
+
+/* IsIndexed
+ *  returns true if true
+ */
+ALIGN_EXTERN bool CC BAMFileIsIndexed ( const BAMFile *self );
+
+
+/* IndexHasRefSeqId
+ */
+ALIGN_EXTERN bool CC BAMFileIndexHasRefSeqId ( const BAMFile *self, uint32_t refSeqId );
+
+/* Seek
+ *  seeks a half-open zero-based interval on a particular reference
+ *  rcSelf, rcIncomplete
+ */
+ALIGN_EXTERN rc_t CC BAMFileSeek ( const BAMFile *self, uint32_t refSeqId, uint64_t alignStart, uint64_t alignEnd );
+
+typedef uint32_t BAMValidateOption;
+enum BAMValidateOptions {
+    /* this is the minimum level of BAM file validation; just walks the compressed block headers */
+    bvo_BlockHeaders        = 1,
+    
+    /* decompresses each block */
+    bvo_BlockCompression    = 2,
+    
+    /* within each block, walks the records without examining the contents */
+    bvo_BlockStructure      = 3,
+    
+    /* within each record, validate the structure vis-a-vis the record size */
+    bvo_RecordStructure     = 4,
+    
+    /* verify that the extra fields a parsable */
+    bvo_ExtraFields         = 8,
+    
+    /* confirm that no alignment starts before the alignment preceeding it */
+    bvo_Sorted              = 16,
+    
+    /* verify that flags are consistent with itself and the other fields in the record
+     * NB. can not verify secondary alignment flag 0x100
+     */
+    bvo_FlagsConsistency    = 32,
+    
+    /* verify CIGAR against sequence length */
+    bvo_CIGARConsistency    = 64,
+    
+    /* verify that bin number corresponds to position and alignment length */
+    bvo_BinConsistency      = 128,
+    
+    /* verify that mapQ is consistent with flags and refSeqID */
+    bvo_MapQuality          = 256,
+    
+    /* verify Quality values >= 33 */
+    bvo_QualityValues       = 512,
+    
+    /* verify that sequence length != 0 */
+    bvo_MissingSequence     = 1024,
+    
+    /* verify that Quality values != 255 */
+    bvo_MissingQuality      = 2048,
+    
+    /* compute flagstats */
+    bvo_FlagsStats          = 4096,
+    
+    /* verify that index is parsable
+     * NB. this can be done without a BAM file
+     */
+    bvo_IndexStructure      = 1 << 16,
+    
+    /* verify that the file offsets in the index are valid for the given BAM file
+     * NB. does not cause decompression of the BAM file but will cause referenced
+     * block headers to be validated
+     */
+    bvo_IndexOffsets1       = 2 << 16,
+    
+    /* in addition to verifying that the file offsets in the index are valid for
+     * the given BAM file, verify that the record offsets with the blocks are valid.
+     * NB. will cause referenced blocks to be decompressed and structurally validated.
+     */
+    bvo_IndexOffsets2       = 3 << 16,
+    
+    /* verify that index's reference number and bin number agree with the
+     * referenced record
+     */
+    bvo_IndexBins           = 4 << 16,
+    
+    bvo_IndexOptions        = 7 << 16
+};
+
+typedef struct BAMValidateStats BAMValidateStats;
+typedef struct BAMValidateStatsRow BAMValidateStatsRow;
+
+struct BAMValidateStatsRow {
+    uint64_t good;
+    uint64_t warning;
+    uint64_t error;
+};
+
+struct BAMValidateStats {
+    uint64_t bamFileSize;
+    uint64_t bamFilePosition;
+    uint64_t baiFileSize;
+    uint64_t baiFilePosition;
+    BAMValidateStatsRow blockHeaders;
+    BAMValidateStatsRow blockCompression;
+    BAMValidateStatsRow blockStructure;
+    BAMValidateStatsRow recordStructure;
+    BAMValidateStatsRow extraFields;
+    BAMValidateStatsRow inOrder;
+    BAMValidateStatsRow flags[16];
+    BAMValidateStatsRow CIGAR;
+    BAMValidateStatsRow bin;
+    BAMValidateStatsRow quality;
+    BAMValidateStatsRow hasSequence;
+    BAMValidateStatsRow hasQuality;
+    BAMValidateStatsRow indexFileOffset;
+    BAMValidateStatsRow indexBlockOffset;
+    BAMValidateStatsRow indexBin;
+    bool bamHeaderIsGood;
+    bool bamHeaderIsBad;
+    bool indexStructureIsGood;
+    bool indexStructureIsBad;
+};
+
+typedef rc_t (CC *BAMValidateCallback)(void *ctx, rc_t result, const BAMValidateStats *stats);
+
+/* Validate
+ */
+ALIGN_EXTERN rc_t CC BAMValidate ( struct VPath const *bam,
+                                   struct VPath const *bai,
+                                   BAMValidateOption options,
+                                   BAMValidateCallback callback,
+                                   void *callbackContext
+                                  );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_bam_ */
diff --git a/interfaces/align/dna-reverse-cmpl.h b/interfaces/align/dna-reverse-cmpl.h
new file mode 100644
index 0000000..82c4783
--- /dev/null
+++ b/interfaces/align/dna-reverse-cmpl.h
@@ -0,0 +1,43 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_align_dna_reverse_cmpl_
+#define _h_align_dna_reverse_cmpl_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ALIGN_EXTERN rc_t CC DNAReverseCompliment(const INSDC_dna_text* seq, INSDC_dna_text* cmpl, uint32_t len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_dna_reverse_cmpl_ */
diff --git a/interfaces/align/extern.h b/interfaces/align/extern.h
new file mode 100644
index 0000000..94c711a
--- /dev/null
+++ b/interfaces/align/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_align_extern_
+#define _h_align_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define ALIGN_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define ALIGN_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_align_extern_ */
diff --git a/interfaces/align/iterator.h b/interfaces/align/iterator.h
new file mode 100644
index 0000000..e8a77e6
--- /dev/null
+++ b/interfaces/align/iterator.h
@@ -0,0 +1,610 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_align_iterator_
+#define _h_align_iterator_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_insdc_insdc_
+#include <insdc/insdc.h>
+#endif
+
+#ifndef _h_vdb_database_
+#include <vdb/database.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VCursor;
+struct AlignMgr;
+struct ReferenceObj;
+
+
+/*--------------------------------------------------------------------------
+ * AlignmentIterator
+ *  walk across a single alignment in reference space
+ */
+typedef struct AlignmentIterator AlignmentIterator;
+
+
+/* Make
+ *  create an encapsulation of alignment
+ *
+ *  iter [ OUT ] - return parameter for new iterator
+ *
+ *  copy [ IN ] - when "true" the data will be copied.
+ *  otherwise, pointers will be expected to refer to data
+ *  with a lifetime >= that of the iterator being created.
+ *
+ *  "ref_pos" [ IN ] and "ref_len" [ IN ] - projection onto reference
+ *
+ *  "read" [ IN ] and "read_len" [ IN ] - full sequence of alignment
+ *
+ *  "has_mismatch" [ IN ] - describes comparison result of each base
+ *  in "read" against the alignment.
+ *
+ *  "has_ref_offset" [ IN ] - describes positions of reference offsets
+ *
+ *  "ref_offset" [ IN ] and "ref_offset_len" [ IN ] - packed array of
+ *  offsets of position against reference.
+ */
+ALIGN_EXTERN rc_t CC AlignMgrMakeAlignmentIterator ( struct AlignMgr const *self,
+    AlignmentIterator **iter,
+    bool copy,
+    INSDC_coord_zero ref_pos,
+    INSDC_coord_len ref_len,
+    const INSDC_4na_bin *read,
+    INSDC_coord_len read_len,
+    const bool *has_mismatch,
+    const bool *has_ref_offset,
+    const int32_t *ref_offset,
+    uint32_t ref_offset_len,
+    INSDC_coord_zero ref_window_start,
+    INSDC_coord_len ref_window_len );
+
+
+/* AddRef
+ * Release
+ */
+ALIGN_EXTERN rc_t CC AlignmentIteratorAddRef ( const AlignmentIterator *self );
+ALIGN_EXTERN rc_t CC AlignmentIteratorRelease ( const AlignmentIterator *self );
+
+
+/* Next
+ *  advance position by 1 in reference space
+ *  must be called initially to advance to first element
+ *
+ *  returns RCState = rcDone when done
+ */
+ALIGN_EXTERN rc_t CC AlignmentIteratorNext ( AlignmentIterator *self );
+
+
+/* State
+ *  returns bitmap of state bits and event code at the current position
+ *  will return invalid before initial Next message or after final
+ *
+ *  bits [ 0..7 ] :
+ *    { 0..15 }             = 4na mismatch (NACMGRSVTWYHKDBN)
+ *    64                    = match
+ *    128                   = skip
+ *  bit [ 8 ]               = have insert if ! 0
+ *  bit [ 9 ]               = have delete if ! 0
+ *  bit [ 10 ]              = first base if ! 0
+ *  bit [ 11 ]              = last base if ! 0
+ *  bit [ 31 ]              = iterator position is invalid if ! 0
+ *                            NB - converts state word to negative
+ */
+enum
+{
+    align_iter_match      = ( 1 <<  8 ),
+    align_iter_skip       = ( 1 <<  9 ),
+
+    align_iter_insert     = ( 1 << 10 ),
+    align_iter_delete     = ( 1 << 11 ),
+    align_iter_first      = ( 1 << 12 ),
+    align_iter_last       = ( 1 << 13 ),
+
+    align_iter_invalid    = ( 1 << 31 )
+};
+
+ALIGN_EXTERN int32_t CC AlignmentIteratorState ( const AlignmentIterator *self,
+                                                 INSDC_coord_zero *seq_pos );
+
+
+/* Position
+ *  return current position of iterator relative to reference
+ */
+ALIGN_EXTERN rc_t CC AlignmentIteratorPosition ( const AlignmentIterator *self,
+                                                 INSDC_coord_zero *pos );
+
+
+/* BasesInserted
+ *  return the number of inserted bases and a pointer to their values
+ *
+ *  "bases" [ OUT, NULL OKAY ] - optional output parameter to inserted bases
+ *
+ *  returns count of bases inserted at current position
+ */
+ALIGN_EXTERN uint32_t CC AlignmentIteratorBasesInserted
+    ( const AlignmentIterator *self, const INSDC_4na_bin **bases );
+
+
+/* BasesDeleted
+ *  return the number of bases deleted at the current position
+ *  also returns the location on the reference where the delete starts
+ *
+ *  "pos" [ OUT ] - return parameter for location on the reference
+ *  where delete starts, and continues for the number of bases given by function return
+ *
+ *  returns count of bases deleted at current position
+ */
+ALIGN_EXTERN uint32_t CC AlignmentIteratorBasesDeleted
+    ( const AlignmentIterator *self, INSDC_coord_zero *pos );
+
+
+/*--------------------------------------------------------------------------
+ * PlacementRecord
+ *  record describing a placement
+ */
+typedef struct PlacementRecord PlacementRecord;
+struct PlacementRecord
+{
+    DLNode n;
+
+    /* row id of alignment record */
+    int64_t id;
+
+    /* object representing reference sequence */
+    struct ReferenceObj const *ref;
+
+    /* placement position and length on reference */
+    INSDC_coord_zero pos;
+    INSDC_coord_len len;
+
+    /* mapping quality of alignment */
+    int32_t mapq;
+
+    /* spotgroup is now in here too */
+    uint32_t spot_group_len;
+    char * spot_group;
+};
+
+
+/* Cast
+ *  cast to an extended object
+ *
+ *  "ext" [ IN ] - selects the extended object level
+ *  can be placementRecordExtension0 or placementRecordExtension1
+ */
+
+enum { placementRecordExtension0, placementRecordExtension1 };
+
+ALIGN_EXTERN void* CC PlacementRecordCast ( const PlacementRecord *self, uint32_t ext );
+
+
+ALIGN_EXTERN void* CC PlacementRecord_get_ext_data_ptr ( const PlacementRecord *self, uint32_t ext );
+
+
+/* Whack
+ *  destroys PlacementRecord and any associated extensions
+ */
+ALIGN_EXTERN void CC PlacementRecordWhack ( const PlacementRecord *self );
+
+
+/* structure of function pointers for creating extensions
+   all function pointers are optional ( NULL OKAY ) */
+typedef struct PlacementRecordExtendFuncs PlacementRecordExtendFuncs;
+struct PlacementRecordExtendFuncs
+{
+    /* opaque pointer to data passed to each function */
+    void *data;
+
+    /* destructor */
+    void ( CC * destroy ) ( void *obj, void *data );
+
+    /* constructor */
+    rc_t ( CC * populate ) ( void *obj, const PlacementRecord *placement,
+        struct VCursor const *curs, INSDC_coord_zero ref_window_start,
+        INSDC_coord_len ref_window_len, void *data, void * placement_ctx );
+
+    /* variable allocation size calculation
+       when non-NULL, takes precedence over "fixed_size" */
+    bool ( CC * filter ) ( struct VCursor const *curs, int64_t row_id,
+        const PlacementRecord *placement, INSDC_coord_zero ref_window_start,
+        INSDC_coord_len ref_window_len, void *data, void * placement_ctx );
+
+    /* variable allocation size calculation
+       when non-NULL, takes precedence over "fixed_size" */
+    rc_t ( CC * alloc_size ) ( struct VCursor const *curs, int64_t row_id, size_t * size, void *data, void * placement_ctx );
+    
+    /* fixed allocation size
+       ignored if "alloc_size" is non-NULL,
+       must be non-zero otherwise */
+    size_t fixed_size;
+};
+
+
+/* external functions for extension of a placement record
+   to include ( construct ) an AlignmentIterator */
+ALIGN_EXTERN void CC AlignIteratorRecordDestroy ( void *obj, void *data );
+ALIGN_EXTERN rc_t CC AlignIteratorRecordPopulate ( void *obj,
+    const PlacementRecord *placement, struct VCursor const *curs,
+    INSDC_coord_zero ref_window_start, INSDC_coord_len ref_window_len, void *data );
+ALIGN_EXTERN rc_t CC AlignIteratorRecordSize ( struct VCursor const *curs, int64_t row_id, size_t * size, void *data );
+
+
+/*--------------------------------------------------------------------------
+ * PlacementIterator
+ *  walk across placements from an alignment db within a reference window
+ */
+typedef struct PlacementIterator PlacementIterator;
+
+
+/* Make
+ *  create a placement iterator
+ *
+ *  "iter" [ OUT ] - return parameter for iterator
+ *
+ *  "ref_obj" [ IN, NULL OKAY ] - optional parameter giving an object
+ *  representing the reference sequence for this iterator. it will be
+ *  inserted into each PlacementRecord (see above) and made available to
+ *  outer code.
+ *
+ *  "ref_pos" [ IN ] and "ref_len" [ IN ] - window onto reference
+ *
+ *  "min_mapq" [ IN ] - minimum map quality value
+ *
+ *  "ref_cur" [ IN ] - read-only cursor on REFERENCE table
+ *  will be modified as necessary to contain requisite columns
+ *  will be opened by iterator.
+ *
+ *  "align_cur" [ IN ] - read-only cursor on PRIMARY_ALIGNMENT or SECONDARY_ALIGNMENT
+ *  table ( see "secondary" ). will be modified as necessary to contain
+ *  requisite columns. will be opened by iterator.
+ *
+ *  "ids" [ IN ] - an enum describing which column of alignment ids should
+ *  be used when reading "ref"
+ *
+ *  "ext_0" [ IN, NULL OKAY ] and "ext_1" [ IN, NULL OKAY ] - optional pointers
+ *  to blocks describing how to extend the basic placement record
+ *
+ *  rd_group [ IN, NULL OKAY ]
+ *      != NULL, non empty string ... produce all alignments with this string as
+ *                  spot-group ( no matter what the "real" spot-group of the
+ *                  alignment is )
+ *
+ *      != NULL, empty string ... produce all alignments with the "real" spot-group
+ *                  read from the column "SPOT_GROUP"
+ *
+ *      == NULL, ... produce all alignments with no spot-group assigned ( the user
+ *                  does not wish the data to be read, the alignment to be bined )
+ */
+
+typedef uint8_t align_id_src;
+enum { primary_align_ids, secondary_align_ids, evidence_align_ids };
+
+ALIGN_EXTERN rc_t CC AlignMgrMakePlacementIterator ( struct AlignMgr const *self,
+    PlacementIterator **iter, struct ReferenceObj const *ref_obj,
+    INSDC_coord_zero ref_pos, INSDC_coord_len ref_len, int32_t min_mapq,
+    struct VCursor const *ref_cur, struct VCursor const *align_cur, align_id_src ids,
+    const PlacementRecordExtendFuncs *ext_0, const PlacementRecordExtendFuncs *ext_1,
+    const char * spot_group );
+
+
+/* AddRef
+ * Release
+ */
+ALIGN_EXTERN rc_t CC PlacementIteratorAddRef ( const PlacementIterator *self );
+ALIGN_EXTERN rc_t CC PlacementIteratorRelease ( const PlacementIterator *self );
+
+
+/* RefWindow
+ *  returns the reference identification string and iteration window
+ */
+ALIGN_EXTERN rc_t CC PlacementIteratorRefWindow ( const PlacementIterator *self,
+    const char **idstr, INSDC_coord_zero *pos, INSDC_coord_len *len );
+
+
+/* RefObj
+ *  returns the Ref-obj, that was used to create this placement-iterator
+ */
+ALIGN_EXTERN rc_t CC PlacementIteratorRefObj( const PlacementIterator * self,
+    struct ReferenceObj const ** refobj );
+
+
+/* NextAvailPos
+ *  check the next available position having one or more placements
+ *
+ *  "pos" [ OUT ] - next position on reference having one or more placements
+ *  may return negative position, indicating an alignment that wraps around
+ *  a circular reference, and starts in negative space after linearization.
+ *
+ *  "len" [ OUT, NULL OKAY ] - optional return parameter for length of
+ *  placement at that position
+ *
+ *  returns non-zero rc when no window is done
+ *  (rcRange, rcDone)
+ */
+ALIGN_EXTERN rc_t CC PlacementIteratorNextAvailPos ( const PlacementIterator *self,
+    INSDC_coord_zero *pos, INSDC_coord_len *len );
+
+
+/* NextRecordAt
+ *  retrieve a placement at the requested position
+ *
+ *  "pos" [ IN ] - required position of the placement
+ *  obtained from "NextAvailPos"
+ *
+ *  "rec" [ OUT ] - returned record
+ *  must be freed via PlacementRecordWhack
+ *
+ *  returns non-zero rc when no more placements are available
+ *  (rcOffset, rcDone)
+ */
+ALIGN_EXTERN rc_t CC PlacementIteratorNextRecordAt ( PlacementIterator *self,
+    INSDC_coord_zero pos, const PlacementRecord **rec );
+
+
+/* NextIdAt
+ *  retrieve a row id at the requested position
+ *
+ *  "pos" [ IN ] - required position of the placement
+ *  obtained from "NextAvailPos"
+ *
+ *  "id" [ OUT ] - returned row-id, within domain of align cursor
+ *
+ *  "len" [ OUT, NULL OKAY ] - optional return parameter for length of
+ *  placement on reference
+ *
+ *  returns non-zero rc when no more placements are available
+ *  (rcOffset, rcDone)
+ */
+ALIGN_EXTERN rc_t CC PlacementIteratorNextIdAt ( PlacementIterator *self,
+    INSDC_coord_zero pos, int64_t *row_id, INSDC_coord_len *len );
+
+
+/*--------------------------------------------------------------------------
+ * PlacementSetIterator
+ *  walk across placements from an alignment db within a reference window
+ */
+typedef struct PlacementSetIterator PlacementSetIterator;
+
+
+/* Make
+ *  create a placement set iterator
+ *
+ *  "iter" [ OUT ] - return parameter for iterator
+ *
+ *  "ref_pos" [ IN ] and "ref_len" [ IN ] - window onto reference
+ */
+ALIGN_EXTERN rc_t CC AlignMgrMakePlacementSetIterator ( struct AlignMgr const *self,
+    PlacementSetIterator **iter );
+
+
+/* AddPlacementIterator
+ *  adds a placement iterator
+ *  used to provide ordered placements within window
+ */
+ALIGN_EXTERN rc_t CC PlacementSetIteratorAddPlacementIterator
+    ( PlacementSetIterator *self, PlacementIterator *pi );
+
+
+/* AddRef
+ * Release
+ */
+ALIGN_EXTERN rc_t CC PlacementSetIteratorAddRef ( const PlacementSetIterator *self );
+ALIGN_EXTERN rc_t CC PlacementSetIteratorRelease ( const PlacementSetIterator *self );
+
+
+ALIGN_EXTERN rc_t CC PlacementSetIteratorNextReference ( PlacementSetIterator *self,
+    INSDC_coord_zero *first_pos, INSDC_coord_len *len, struct ReferenceObj const ** refobj );
+
+ALIGN_EXTERN rc_t CC PlacementSetIteratorNextWindow ( PlacementSetIterator *self,
+    INSDC_coord_zero *first_pos, INSDC_coord_len *len );
+
+/* NextAvailPos
+ *  check the next available position having one or more placements
+ *
+ *  "pos" [ OUT ] - next position on reference having one or more placements
+ *  may return negative position, indicating an alignment that wraps around
+ *  a circular reference, and starts in negative space after linearization.
+ *
+ *  "len" [ OUT, NULL OKAY ] - optional return parameter for length of
+ *  placement at that position
+ *
+ *  returns non-zero rc when no more placements are available
+ *  TBD - define a proper value
+ */
+ALIGN_EXTERN rc_t CC PlacementSetIteratorNextAvailPos ( const PlacementSetIterator *self,
+    INSDC_coord_zero *pos, INSDC_coord_len *len );
+
+
+/* NextRecordAt
+ *  retrieve a placement at the requested position
+ *
+ *  "pos" [ IN ] - required position of the placement
+ *  obtained from "NextAvailPos"
+ *
+ *  "rec" [ OUT ] - returned record
+ *  must be freed via PlacementRecordWhack
+ */
+ALIGN_EXTERN rc_t CC PlacementSetIteratorNextRecordAt ( PlacementSetIterator *self,
+    INSDC_coord_zero pos, const PlacementRecord **rec );
+
+
+/* NextIdAt
+ *  retrieve a row id at the requested position
+ *
+ *  "pos" [ IN ] - required position of the placement
+ *  obtained from "NextAvailPos"
+ *
+ *  "id" [ OUT ] - returned row-id, within domain of align cursor
+ *
+ *  "len" [ OUT, NULL OKAY ] - optional return parameter for length of
+ *  placement on reference
+ */
+ALIGN_EXTERN rc_t CC PlacementSetIteratorNextIdAt ( PlacementSetIterator *self,
+    INSDC_coord_zero pos, int64_t *row_id, INSDC_coord_len *len );
+
+
+/*--------------------------------------------------------------------------
+ * ReferenceIterator
+ *  walk across placements from an alignment db within a reference window
+ */
+typedef struct ReferenceIterator ReferenceIterator;
+
+
+/* Make
+ *  create a reference iterator
+ *
+ *  "iter" [ OUT ] - return parameter for iterator
+ *
+ *  "ext_1" [ IN, NULL OKAY ] - optional pointer to a block describing how
+ *  to extend the align-iterator record
+ *
+ *  "min_mapq" [ IN ] - minimum map quality value
+ */
+ALIGN_EXTERN rc_t CC AlignMgrMakeReferenceIterator ( struct AlignMgr const *self,
+    ReferenceIterator **iter, const PlacementRecordExtendFuncs *ext_1, int32_t min_mapq );
+
+
+/* AddRef
+ * Release
+ */
+ALIGN_EXTERN rc_t CC ReferenceIteratorAddRef ( const ReferenceIterator *self );
+ALIGN_EXTERN rc_t CC ReferenceIteratorRelease ( const ReferenceIterator *self );
+
+
+/* AddPlacementIterator
+ *  adds a placement iterator
+ *  used to provide ordered placements within window
+ */
+#if 0
+ALIGN_EXTERN rc_t CC ReferenceIteratorAddPlacementIterator
+    ( ReferenceIterator *self, PlacementIterator *pi );
+#endif
+
+/* AddPlacements
+ *  adds a source for placements (file/table)
+ *  used to provide ordered placements within window
+ */
+ALIGN_EXTERN rc_t CC ReferenceIteratorAddPlacements ( ReferenceIterator *self,
+    struct ReferenceObj const *ref_obj, INSDC_coord_zero ref_pos, INSDC_coord_len ref_len,
+    struct VCursor const *ref, struct VCursor const *align, align_id_src ids,
+    const char * spot_group, void * placement_ctx );
+
+
+/* NextReference
+ *  advance to the next reference
+ */
+ALIGN_EXTERN rc_t CC ReferenceIteratorNextReference ( ReferenceIterator *self,
+    INSDC_coord_zero *first_pos, INSDC_coord_len *len, struct ReferenceObj const ** refobj );
+
+/* NextWindow
+ *  advance to the next window on the reference
+ */
+ALIGN_EXTERN rc_t CC ReferenceIteratorNextWindow ( ReferenceIterator *self,
+    INSDC_coord_zero *first_pos, INSDC_coord_len *len );
+
+/* NextSpotGroup
+ *  advance to the next spot_group on the reference
+ */
+ALIGN_EXTERN rc_t CC ReferenceIteratorNextSpotGroup ( ReferenceIterator *self,
+    const char ** name, size_t * len );
+
+
+/* NextPos
+ *  advance to the next position on current reference
+ *  resets internal iterator on placements at that position
+ */
+ALIGN_EXTERN rc_t CC ReferenceIteratorNextPos ( ReferenceIterator *self, bool skip_empty );
+
+
+/* Position
+ *  return current position on the reference
+ */
+ALIGN_EXTERN rc_t CC ReferenceIteratorPosition ( const ReferenceIterator *self,
+    INSDC_coord_zero *pos, uint32_t * depth, INSDC_4na_bin * base );
+
+
+/* NextPlacement
+ *  advance internal iterator to next placement in list
+ *  returns a pointer to the next placement object at current position
+ */
+ALIGN_EXTERN rc_t CC ReferenceIteratorNextPlacement ( ReferenceIterator *self,
+    const PlacementRecord **rec );
+
+
+/* State
+ *  return state of current placement at current position
+ */
+ALIGN_EXTERN int32_t CC ReferenceIteratorState ( const ReferenceIterator *self, INSDC_coord_zero *seq_pos );
+
+
+/* BasesInserted
+ *  return the number of inserted bases and a pointer to their values
+ *
+ *  "bases" [ OUT, NULL OKAY ] - optional output parameter to inserted bases
+ *
+ *  returns count of bases inserted at current position
+ */
+ALIGN_EXTERN uint32_t CC ReferenceIteratorBasesInserted ( const ReferenceIterator *self,
+    const INSDC_4na_bin **bases );
+
+
+/* BasesDeleted
+ *  return the number of bases deleted at the current position
+ *  also returns the location on the reference where the delete starts
+ *
+ *  "pos" [ OUT ] - return parameter for location on the reference
+ *  where delete starts, and continues for the number of bases given by function return
+ *
+ *  "bases" [ OUT, NULL OKAY ] - optional output parameter to deleted bases
+ *
+ *  returns count of bases deleted at current position
+ */
+ALIGN_EXTERN uint32_t CC ReferenceIteratorBasesDeleted ( const ReferenceIterator *self,
+    INSDC_coord_zero *pos, const INSDC_4na_bin **bases );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_iterator_ */
diff --git a/interfaces/align/iterator_examples.txt b/interfaces/align/iterator_examples.txt
new file mode 100644
index 0000000..5a9727a
--- /dev/null
+++ b/interfaces/align/iterator_examples.txt
@@ -0,0 +1,148 @@
+
+
+const char * path           ... path of database
+const char * refname        ... name of reference to walk
+INSDC_coord_zero ref_pos    ... start of window on reference to walk
+INSDC_coord_len ref_len     ... length of window on reference to walk
+int32_t min_mapq            ... minimal mapping quality ( for a alignment to be considered )
+
+KDirectory *wd;
+rc_t rc = KDirectoryNativeDir( &wd );
+if ( rc == 0 )
+{
+    const VDBManager *v_mgr,
+    rc = VDBManagerMakeRead ( &v_mgr, wd );
+    if ( rc == 0 )
+    {
+        const VDatabase *v_db;
+        rc = VDBManagerOpenDBRead( v_mgr, &v_db, NULL, "%s", path );
+        if ( rc == 0 )
+        {
+            const ReferenceList *ref_list;
+            uint32_t reflist_options =  ereferencelist_usePrimaryIds;
+            rc = ReferenceList_MakeDatabase( &ref_list, v_db, reflist_options, 0, NULL, 0 ); /* align/reference.h */
+            if ( rc == 0 )
+            {
+                const AlignMgr * a_mgr;
+                rc = AlignMgrMakeRead( &a_mgr );   /* align/manager.h */
+                if ( rc == 0 )
+                {
+                    PlacementSetIterator * set_iter;
+                    rc = AlignMgrMakePlacementSetIterator( a_mgr, &set_iter ); /* align/iterator.h */
+                    if ( rc == 0 )
+                    {
+                        const ReferenceObj * ref_obj;
+                        rc = ReferenceList_Find( ref_list, &ref_obj, refname, string_size( refname ) ); /* align/reference.h */
+                        if ( rc == 0 )
+                        {
+                            PlacementIterator *pl_iter;
+                            rc = ReferenceObj_MakePlacementIterator( ref_obj, /* align/reference.h */
+                                &pl_iter,
+                                ref_pos,            /* where it starts on the reference */
+                                ref_len,            /* the whole length of this reference/chromosome */
+                                min_mapq,           /* no minimal mapping-quality to filter out */
+                                NULL,               /* no special reference-cursor */
+                                NULL,               /* no special cursor into the PRIMARY/SECONDARY/EVIDENCE-table */
+                                primary_align_ids,  /* what ID-source to select from REFERENCE-table (ref_obj) */
+                                NULL,               /* no placement-record extensions #0 ( or private context #0 )*/
+                                NULL,               /* no placement-record extensions #1 */
+                                NULL );             /* no spotgroup re-grouping (yet) */
+                            if ( rc == 0 )
+                            {
+                                rc = PlacementSetIteratorAddPlacementIterator ( set_iter, pl_iter ); /* align/iterator.h */
+                                if ( rc == 0 )
+                                {
+                                    rc = walk_set_iter( set_iter ); /* see below */
+                                }
+                            }
+                            ReferenceObj_Release( ref_obj );
+                        }
+                        PlacementSetIteratorRelease( set_iter );
+                    }
+                    AlignMgrRelease( a_mgr );
+                }
+                ReferenceList_Release( ref_list );
+            }
+            VDatabaseRelease ( v_db );
+        }
+        VDBManagerRelease ( v_mgr );
+    }
+    KDirectoryRelease( wd );
+}
+
+
+rc_t walk_set_iter( PlacementSetIterator * set_iter )
+{
+    rc_t rc = 0;
+    while ( rc == 0 )
+    {
+        struct ReferenceObj const * ref_obj;
+        rc = PlacementSetIteratorNextReference( set_iter, NULL, NULL, &ref_obj ); /* align/iterator.h */
+
+        if ( rc == 0 )
+        {
+            rc = walk_reference( set_iter, ref_obj ); /* see below */
+        }
+    }
+    if ( GetRCState( rc ) == rcDone ) rc = 0;
+    return rc;
+}
+
+
+rc_t walk_reference( PlacementSetIterator * set_iter, struct ReferenceObj const * ref_obj )
+{
+    rc_t rc = 0;
+    while ( rc == 0 )
+    {
+        INSDC_coord_zero first_pos;
+        INSDC_coord_len len;
+        rc = PlacementSetIteratorNextWindow( set_iter, &first_pos, &len ); /* align/iterator.h */
+        if ( rc == 0 )
+        {
+            rc = walk_window( set_iter, ref_obj, first_pos, len ); /* see below */
+        }
+    }
+    if ( GetRCState( rc ) == rcDone ) rc = 0;
+    return rc;
+}
+
+
+rc_t walk_window( PlacementSetIterator * set_iter, struct ReferenceObj const * ref_obj,
+                  INSDC_coord_zero first_pos, INSDC_coord_len len )
+{
+    rc_t rc = 0;
+    while ( rc == 0 )
+    {
+        INSDC_coord_zero pos;
+        rc = PlacementSetIteratorNextAvailPos( set_iter, &pos, NULL ); /* align/iterator.h */
+        if ( rc == 0 )
+        {
+            rc = walk_position( set_iter, ref_obj, first_pois, len, pos ); /* see below */
+        }
+    }
+    if ( GetRCState( rc ) == rcDone ) rc = 0;
+    return rc;
+}
+
+
+rc_t walk_position( PlacementSetIterator * set_iter, struct ReferenceObj const * ref_obj,
+                    INSDC_coord_zero first_pos, INSDC_coord_len len, INSDC_coord_zero pos )
+{
+    rc_t rc = 0;
+    while ( rc == 0 )
+    {
+        const PlacementRecord *rec; /* align/iterator.h */
+        rc = PlacementSetIteratorNextRecordAt( set_iter, pos, &rec ); /* align/iterator.h */
+        if ( rc == 0 )
+        {
+            private_context * pctx = PlacementRecord_get_ext_data_ptr( rec, placementRecordExtension0 ); /* align/iterator.h */
+            /*
+                available now is:
+                alignment in rec
+                private context ( that means for instance the table-cursor that was used to read this alignment )
+            */
+        }
+    }
+    if ( GetRCState( rc ) == rcDone ) rc = 0;
+    return rc;
+}
diff --git a/interfaces/align/manager.h b/interfaces/align/manager.h
new file mode 100644
index 0000000..4527f8a
--- /dev/null
+++ b/interfaces/align/manager.h
@@ -0,0 +1,69 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_align_manager_
+#define _h_align_manager_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * AlignMgr
+ *  manages the alignment module
+ */
+typedef struct AlignMgr AlignMgr;
+
+/* MakeRead
+ *  make for read-only operations
+ * MakeUpdate
+ *  make for read/write operations
+ */
+ALIGN_EXTERN rc_t CC AlignMgrMakeRead ( const AlignMgr **mgr );
+ALIGN_EXTERN rc_t CC AlignMgrMakeUpdate ( AlignMgr **mgr );
+
+
+/* AddRef
+ * Release
+ */
+ALIGN_EXTERN rc_t CC AlignMgrAddRef ( const AlignMgr *self );
+ALIGN_EXTERN rc_t CC AlignMgrRelease ( const AlignMgr *self );
+
+    
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_manager_ */
diff --git a/interfaces/align/mate-cache.vschema b/interfaces/align/mate-cache.vschema
new file mode 100644
index 0000000..a164871
--- /dev/null
+++ b/interfaces/align/mate-cache.vschema
@@ -0,0 +1,99 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * VDB mate-cache types, functions and tables
+ */
+version 1;
+
+include 'insdc/insdc.vschema';
+include 'vdb/vdb.vschema';
+include 'insdc/sra.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * data types
+ */
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+
+/*--------------------------------------------------------------------------
+ * tables
+ */
+
+table NCBI:align:tbl:mate_cache #1.1
+{
+    /* SAM_FLAGS
+     */
+    extern column < U32 > izip_encoding SAM_FLAGS_CACHE;
+
+    /* SAM_QUALITY
+     */
+    extern column < INSDC:quality:text:phred_33 > zip_encoding SAM_QUALITY_CACHE;
+
+    /* TEMPLATE_LEN
+     */
+    extern column < I32 > izip_encoding TEMPLATE_LEN_CACHE;
+
+    /* MATE_ALIGN_ID
+     */
+    extern column < I64 > izip_encoding MATE_ALIGN_ID_CACHE;
+
+    /* MATE_REF_NAME
+     */
+    extern column < ascii > zip_encoding MATE_REF_NAME_CACHE;
+
+    /* MATE_REF_POS
+     */
+    extern column < INSDC:coord:zero > izip_encoding MATE_REF_POS_CACHE;
+
+    /* ALIGNMENT_COUNT
+     */
+    extern column < U8 > izip_encoding ALIGNMENT_COUNT_CACHE;
+
+    /* RD_FILTER
+     */
+    extern column < INSDC:SRA:read_filter > zip_encoding RD_FILTER_CACHE;
+    readonly column INSDC:SRA:read_filter READ_FILTER_CACHE = .RD_FILTER_CACHE;
+
+    /* SPOT_GROUP
+     */
+    extern column < ascii > zip_encoding SPOT_GROUP_CACHE;
+    readonly column ascii SEQ_SPOT_GROUP_CACHE = .SPOT_GROUP_CACHE;
+};
+
+/*--------------------------------------------------------------------------
+ * databases
+ */
+
+database NCBI:align:db:mate_cache #1
+{
+    table NCBI:align:tbl:mate_cache #1.1 PRIMARY_ALIGNMENT;
+};
diff --git a/interfaces/align/pileup-stats.vschema b/interfaces/align/pileup-stats.vschema
new file mode 100644
index 0000000..bcbf35e
--- /dev/null
+++ b/interfaces/align/pileup-stats.vschema
@@ -0,0 +1,120 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+version 1;
+
+include 'vdb/built-in.vschema';
+include 'vdb/vdb.vschema';
+include 'insdc/insdc.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * tables
+ */
+
+table NCBI:pileup:tbl:pileup_stats #1
+{
+    /* RUN_NAME
+     *  expected to be a single value for entire object
+     */
+    extern column ascii RUN_NAME;
+
+    /* REFERENCE_SPEC
+     *  the canonical reference accession
+     *  an index is stored in 'ref_spec'.
+     */
+    extern column ascii REFERENCE_SPEC = out_reference_spec;
+    physical < ascii > zip_encoding .REFERENCE_SPEC
+        = idx:text:insert #1.0 < 'ref_spec' > ( REFERENCE_SPEC );
+    ascii out_reference_spec
+        = idx:text:project #1.0 < 'ref_spec' > ( .REFERENCE_SPEC );
+
+    /* REF_POS
+     *  we dedicate a row to every position on the reference
+     *  some rows are empty, other than their position
+     */
+    extern column I64 REF_POS = out_ref_pos;
+    physical < I64 > izip_encoding .REF_POS = in_ref_pos;
+    I64 in_ref_pos
+        = < I64 > sub_row_id ( REF_POS )
+        ;
+    I64 out_ref_pos
+        = < I64 > add_row_id ( .REF_POS )
+        | < I64 > add_row_id ( .REF_POS_TRANS )
+        ;
+
+    /* REF_POS_TRANS
+     *  records the translation between current row-id
+     *  and REF_POS, such that
+     *    row-id () + REF_POS_TRANS == REF_POS
+     */
+    extern column I64 REF_POS_TRANS = out_ref_pos_trans;
+    physical < I64 > izip_encoding .REF_POS_TRANS = in_ref_pos_trans;
+    I64 in_ref_pos_trans
+        = REF_POS_TRANS
+        ;
+    I64 out_ref_pos_trans
+        = .REF_POS_TRANS
+        | < I64 > sub_row_id ( .REF_POS )
+        ;
+
+    /* REF_BASE
+     *  this optional column records data extracted from reference
+     *  it is the base at REF_POS
+     */
+    extern column < INSDC:dna:text > zip_encoding REF_BASE;
+
+    /* DEPTH
+     *  depth of coverage at REF_POS
+     */
+    extern column < U32 > izip_encoding DEPTH;
+
+    /* MISMATCH_COUNTS
+     *  the number of pileup bases that do not match against REF_BASE
+     *  the normal vector MISMATCH_COUNTS [ 4 ] is recorded as MISMATCH_COUNTS [ 3 ]
+     *  where the element representing REF_BASE has been eliminated.
+     */
+    extern column < U32 > izip_encoding MISMATCH_COUNTS;
+
+    /* INSERTION_COUNTS
+     *  the number of insertions-before-bases
+     */
+    extern column < U32 > izip_encoding INSERTION_COUNTS;
+
+    /* DELETION_COUNT
+     *  the number of deletions at REF_POS
+     */
+    extern column < U32 > izip_encoding DELETION_COUNT;
+}
+
+/*--------------------------------------------------------------------------
+ * databases
+ */
+
+database NCBI:pileup:db:pileup_stats #1
+{
+    table NCBI:pileup:tbl:pileup_stats #1 STATS;
+}
diff --git a/interfaces/align/qstat.vschema b/interfaces/align/qstat.vschema
new file mode 100644
index 0000000..d97c20b
--- /dev/null
+++ b/interfaces/align/qstat.vschema
@@ -0,0 +1,87 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * VDB Quality Statistics Table
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'ncbi/ncbi.vschema';
+
+table NCBI:align:tbl:qstat #1.0
+{
+    /* SPOT_GROUP
+     */
+    extern column < ascii > zip_encoding SPOT_GROUP;
+
+    /* CYCLE
+     *  machine cycle
+     */
+    extern column < U32 > izip_encoding CYCLE;
+
+    /* KMER
+     *  use dimer
+     */
+    extern column INSDC:dna:text KMER;
+
+    /* HPRUN
+     *  homopolymer run
+     *  number of bases of the same type preceding the current base
+     */
+    extern column < INSDC:coord:len > izip_encoding HPRUN;
+
+    /* GC_CONTENT
+     *  number of G's or C's in the 7 bases preceding the current base
+     */
+    extern column < U32 > izip_encoding GC_CONTENT;
+
+    /* ORIG_QUAL
+     *  original quality scores
+     */
+    extern column < INSDC:quality:phred > zip_encoding ORIG_QUAL;
+
+    /* MAX_QUAL
+     *  max. quality score in read
+     */
+    extern column < INSDC:quality:phred > zip_encoding MAX_QUAL;
+
+    /* NREAD
+     *  number of the read
+     */
+    extern column < U8 > zip_encoding NREAD;
+
+    /* TOTAL_COUNT
+     *  total count of observed events
+     */
+    extern column < U32 > izip_encoding TOTAL_COUNT;
+
+    /* MISMATCH_COUNT
+     *  count of observed mismatches
+     */
+    extern column < U32 > izip_encoding MISMATCH_COUNT;
+
+};
diff --git a/interfaces/align/quality-quantizer.h b/interfaces/align/quality-quantizer.h
new file mode 100644
index 0000000..223ffda
--- /dev/null
+++ b/interfaces/align/quality-quantizer.h
@@ -0,0 +1,49 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+
+#ifndef _h_align_quality_quantizer_
+#define _h_align_quality_quantizer_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* InitMatrix
+ *  
+ *
+ */
+ALIGN_EXTERN bool CC QualityQuantizerInitMatrix(uint8_t result[256], char const initializer[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_quality_quantizer_ */
diff --git a/interfaces/align/reader-refseq.h b/interfaces/align/reader-refseq.h
new file mode 100644
index 0000000..8fbd017
--- /dev/null
+++ b/interfaces/align/reader-refseq.h
@@ -0,0 +1,72 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was readten as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_align_reader_refseq_
+#define _h_align_reader_refseq_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct VDBManager;
+struct VTable;
+
+enum ETableReaderRefSeq_Options {
+    errefseq_4NA = 0x01 /* read in INSDC:4na:bin, INSDC:dna:text is default */
+};
+
+typedef struct TableReaderRefSeq TableReaderRefSeq;
+
+ALIGN_EXTERN rc_t CC TableReaderRefSeq_MakeTable(const TableReaderRefSeq** cself, const struct VDBManager* vmgr,
+                                                 const struct VTable* table, uint32_t options, size_t cache);
+
+ALIGN_EXTERN rc_t CC TableReaderRefSeq_MakePath(const TableReaderRefSeq** cself, const VDBManager* vmgr,
+                                                const char* path, uint32_t options, size_t cache);
+
+ALIGN_EXTERN void CC TableReaderRefSeq_Whack(const TableReaderRefSeq* cself);
+
+ALIGN_EXTERN rc_t CC TableReaderRefSeq_SeqId(const TableReaderRefSeq* cself, const char** id, uint32_t* id_sz);
+
+ALIGN_EXTERN rc_t CC TableReaderRefSeq_SeqLength(const TableReaderRefSeq* cself, INSDC_coord_len* len);
+
+ALIGN_EXTERN rc_t CC TableReaderRefSeq_Circular(const TableReaderRefSeq* cself, bool* circular);
+
+/* *md5 is NULL if not present */
+ALIGN_EXTERN rc_t CC TableReaderRefSeq_MD5(const TableReaderRefSeq* cself, const uint8_t** md5);
+
+/* read a chunk of refseq into buffer from offset up to offset + len
+   if offset is beyond non-circular refseq size error is returned
+ */
+ALIGN_EXTERN rc_t CC TableReaderRefSeq_Read(const TableReaderRefSeq* cself, INSDC_coord_zero offset, INSDC_coord_len len,
+                                            uint8_t* buffer, INSDC_coord_len* written);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_reader_refseq_ */
diff --git a/interfaces/align/reference.h b/interfaces/align/reference.h
new file mode 100644
index 0000000..b02faf5
--- /dev/null
+++ b/interfaces/align/reference.h
@@ -0,0 +1,150 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was readten as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_align_reader_reference_
+#define _h_align_reader_reference_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#ifndef _h_vdb_cursor_
+#include <vdb/cursor.h>
+#endif
+
+#ifndef _h_vdb_table_
+#include <vdb/table.h>
+#endif
+
+#ifndef _h_vdb_database_
+#include <vdb/database.h>
+#endif
+
+#ifndef _h_vdb_manager_
+#include <vdb/manager.h>
+#endif
+
+#ifndef _h_align_iterator_
+#include <align/iterator.h>
+#endif
+
+#ifndef _h_insdc_insdc_
+#include <insdc/insdc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct VCursor;
+struct PlacementIterator;
+
+enum ReferenceList_Options {
+    ereferencelist_4na = 0x01, /* READ in 4na, otherwise it is DNA */
+    /* next 3 options are used only if iterator is NOT created using existing cursor */
+    ereferencelist_usePrimaryIds = 0x02, /* read PRIMARY_ALIGNMENT_IDS too */
+    ereferencelist_useSecondaryIds = 0x04, /* read SECONDARY_ALIGNMENT_IDS too */
+    ereferencelist_useEvidenceIds = 0x08 /* use EVIDENCE_ALIGNMENT */
+};
+
+typedef struct ReferenceList ReferenceList;
+
+/** name is used to limit only to a single sequence - for quick lookups **/
+/** numbins is used to divide whole reference table in equi-row-bins and show only the bin where the name is falling to **/
+ALIGN_EXTERN rc_t CC ReferenceList_MakeCursor(const ReferenceList** cself, const VCursor* cursor, uint32_t options,
+                                              const char* name, const uint32_t numbins);
+
+ALIGN_EXTERN rc_t CC ReferenceList_MakeTable(const ReferenceList** cself, const VTable* table, uint32_t options,
+                                             size_t cache, const char* name, const uint32_t numbins);
+
+ALIGN_EXTERN rc_t CC ReferenceList_MakeDatabase(const ReferenceList** cself, const VDatabase* db, uint32_t options,
+                                                size_t cache, const char* name, const uint32_t numbins);
+
+ALIGN_EXTERN rc_t CC ReferenceList_MakePath(const ReferenceList** cself, const VDBManager* vmgr, const char* dbpath,
+                                            uint32_t options, size_t cache,const char *name, const uint32_t numbins);
+
+ALIGN_EXTERN rc_t CC ReferenceList_AddRef(const ReferenceList *cself);
+ALIGN_EXTERN void CC ReferenceList_Release(const ReferenceList* cself);
+
+/* number of items in the list */
+ALIGN_EXTERN rc_t CC ReferenceList_Count(const ReferenceList* cself, uint32_t* count);
+
+typedef struct ReferenceObj ReferenceObj;
+
+/* find object by SEQ_ID and if not found by NAME */
+ALIGN_EXTERN rc_t CC ReferenceList_Find(const ReferenceList* cself, const ReferenceObj** obj, const char* key, size_t key_sz);
+
+/* idx is 0-based */
+ALIGN_EXTERN rc_t CC ReferenceList_Get(const ReferenceList* cself, const ReferenceObj** obj, uint32_t idx);
+
+ALIGN_EXTERN rc_t ReferenceObj_AddRef(const ReferenceObj *cself);
+ALIGN_EXTERN void CC ReferenceObj_Release(const ReferenceObj* cself);
+
+/* internal idx for use in ReferenceList_Get above */
+ALIGN_EXTERN rc_t CC ReferenceObj_Idx(const ReferenceObj* cself, uint32_t* idx);
+/* Gets RowId range for the object */
+ALIGN_EXTERN rc_t CC ReferenceObj_IdRange(const ReferenceObj* cself, int64_t* start, int64_t* stop);
+/* Gets Current bin number if ReferenceList was binned*/
+ALIGN_EXTERN rc_t CC ReferenceObj_Bin(const ReferenceObj* cself, uint32_t* bin);
+
+ALIGN_EXTERN rc_t CC ReferenceObj_SeqId(const ReferenceObj* cself, const char** seqid);
+
+ALIGN_EXTERN rc_t CC ReferenceObj_Name(const ReferenceObj* cself, const char** name);
+
+ALIGN_EXTERN rc_t CC ReferenceObj_SeqLength(const ReferenceObj* cself, INSDC_coord_len* len);
+
+ALIGN_EXTERN rc_t CC ReferenceObj_Circular(const ReferenceObj* cself, bool* circular);
+
+/* check if actual refseq data is located in external table (external == true on return)
+   optionally obtain its path, returned path == NULL means actual refseq is missing
+   if path was requested and obtained caller must free(path)! */
+ALIGN_EXTERN rc_t CC ReferenceObj_External(const ReferenceObj* cself, bool* external, char** path);
+
+/* read a chunk of refseq into buffer from offset up to offset + len
+   if offset is beyond non-circular refseq size error is returned
+ */
+ALIGN_EXTERN rc_t CC ReferenceObj_Read(const ReferenceObj* cself, INSDC_coord_zero offset, INSDC_coord_len len,
+                                       uint8_t* buffer, INSDC_coord_len* written);
+
+ALIGN_EXTERN rc_t CC ReferenceObj_GetIdCount( const ReferenceObj* cself, int64_t row_id, uint32_t *count );
+
+/* return pointer to iterator for (PRIMARY|SECONDARY)_ALIGNMENT_IDS to a given range on reference,
+   both cursors could be NULL
+   ref_len will be truncated to seq length for non-circular references
+   for other parameters see AlignMgrMakePlacementIterator
+ */
+ALIGN_EXTERN rc_t CC ReferenceObj_MakePlacementIterator ( const ReferenceObj* cself,
+    PlacementIterator **iter,
+    INSDC_coord_zero ref_window_start,
+    INSDC_coord_len ref_window_len, int32_t min_mapq,
+    struct VCursor const *ref_cur, struct VCursor const *align_cur, align_id_src ids,
+    const PlacementRecordExtendFuncs *ext_0, const PlacementRecordExtendFuncs *ext_1,
+    const char * rd_group, void * placement_ctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_reader_reference_ */
diff --git a/interfaces/align/refseq-mgr.h b/interfaces/align/refseq-mgr.h
new file mode 100644
index 0000000..ad6459a
--- /dev/null
+++ b/interfaces/align/refseq-mgr.h
@@ -0,0 +1,88 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was readten as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_align_refseq_mgr_
+#define _h_align_refseq_mgr_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#include <vdb/manager.h>
+#include <vdb/table.h>
+#include <align/reader-refseq.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct RefSeqMgr RefSeqMgr;
+
+/* Manages refseq tables
+    reader_options [IN] - passed to TableReaderRefSeq
+    cache [IN] - db cache size per single!!! reference (vdb cursor cache)
+    keep_open_num [IN] - number of refseq kept open, 0 - no limit
+ */
+ALIGN_EXTERN rc_t CC RefSeqMgr_Make(const RefSeqMgr** cself, const VDBManager* vmgr,
+                                    uint32_t reader_options, size_t cache, uint32_t keep_open_num);
+
+ALIGN_EXTERN rc_t CC RefSeqMgr_Release(const RefSeqMgr* cself);
+
+ALIGN_EXTERN rc_t CC RefSeqMgr_SetCache(RefSeqMgr const *const cself, size_t cache, uint32_t keep_open_num);
+
+/* return value if 0 means object was found, path is optional */
+ALIGN_EXTERN rc_t RefSeqMgr_Exists(const RefSeqMgr* cself, const char* accession, uint32_t accession_sz, char** path);
+
+/* Read from refseq ided by seq_id chunk of 'len' bases into provided 'buffer' (must be enough big for len);
+   on return written has number of bases written
+ */
+ALIGN_EXTERN rc_t CC RefSeqMgr_Read(const RefSeqMgr* cself, const char* seq_id, uint32_t seq_id_sz,
+                                    INSDC_coord_zero offset, INSDC_coord_len len,
+                                    uint8_t* buffer, INSDC_coord_len* written);
+
+typedef struct RefSeq RefSeq;
+
+ALIGN_EXTERN rc_t CC RefSeqMgr_GetSeq(const RefSeqMgr* cmgr, const RefSeq** cself, const char* seq_id, uint32_t seq_id_sz);
+
+/* Same as RefSeqMgr_Read
+ */
+ALIGN_EXTERN rc_t CC RefSeq_Read(const RefSeq* cself, INSDC_coord_zero offset, INSDC_coord_len len,
+                                 uint8_t* buffer, INSDC_coord_len* written);
+
+ALIGN_EXTERN rc_t CC RefSeq_Circular(const RefSeq* cself, bool* circular);
+
+ALIGN_EXTERN rc_t CC RefSeq_SeqLength(const RefSeq* cself, INSDC_coord_len* len);
+
+ALIGN_EXTERN rc_t CC RefSeq_MD5(const RefSeq* cself, const uint8_t** md5);
+
+ALIGN_EXTERN rc_t CC RefSeq_Name(const RefSeq* cself, const char** name);
+    
+ALIGN_EXTERN rc_t CC RefSeq_Release(const RefSeq* cself);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_refseq_mgr_ */
diff --git a/interfaces/align/refseq.vschema b/interfaces/align/refseq.vschema
new file mode 100644
index 0000000..b61fb99
--- /dev/null
+++ b/interfaces/align/refseq.vschema
@@ -0,0 +1,100 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * VDB Reference Sequence types, functions and tables
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'ncbi/seq.vschema';
+include 'ncbi/sra.vschema';
+include 'ncbi/stats.vschema';
+
+
+extern function U8 NCBI:refseq:stats #2 ( INSDC:4na:bin seq, INSDC:coord:len len )
+    = NCBI:refSeq:stats;
+
+table NCBI:refseq:tbl:reference #1.0.2 =
+    NCBI:tbl:base_space #2.0.2,
+    NCBI:tbl:phred_quality #2.0.3,
+    NCBI:tbl:seqloc #1.0,
+    NCBI:SRA:tbl:stats #1.1.2
+{
+    // 128K
+    column default limit = 131072;
+
+    extern column U32 MAX_SEQ_LEN;                  /* must be static */
+    extern column < ascii > izip_encoding DEF_LINE; /* remainder of defline after SEQ_ID */
+
+    // trigger upconverts to INSDC:dna:text to get MD5
+    trigger table_stats
+        = NCBI:refseq:stats(in_4na_bin, _alt_in_read_len);
+
+    readonly column U64 TOTAL_SEQ_LEN
+        = < U64 > meta:value < 'STATS/TOTAL_SEQ_LEN', true >();
+        
+    readonly column U8[16] MD5
+        = < U8[16] > meta:read < 'STATS/MD5', true >();
+        
+    // indicates if sequence has circular structure
+    // should be static
+    extern column bool_encoding CIRCULAR;
+    
+    /* columns:
+     *  READ
+     *  QUALITY (optional)
+     *  SEQ_ID
+     *  SEQ_START
+     *  SEQ_LEN
+     *  MAX_SEQ_LEN
+     *  TOTAL_SEQ_LEN
+     *  DEF_LINE
+     */
+
+    // make CS_KEY writable
+    INSDC:dna:text in_cs_key
+        = < INSDC:dna:text, INSDC:dna:text > map < 'acgtn', 'ACGTN' > ( CS_KEY );
+    physical column < INSDC:dna:text > zip_encoding .CS_KEY = in_cs_key;
+    // extra columns needed for CS conversion
+    INSDC:coord:zero out_read_start = < INSDC:coord:zero> echo < 0 > ();
+    INSDC:coord:len  out_read_len =  .SEQ_LEN;
+    
+    INSDC:coord:len _alt_in_read_len
+        = READ_LEN
+        | SEQ_LEN;
+
+    INSDC:SRA:xread_type _alt_in_read_type
+        = READ_TYPE
+        | < INSDC:SRA:xread_type > echo < SRA_READ_TYPE_BIOLOGICAL > ();
+
+    INSDC:SRA:xread_type out_read_type
+        = .READ_TYPE
+        | < INSDC:SRA:xread_type > echo < SRA_READ_TYPE_BIOLOGICAL > ();
+};
+
+// older spelling
+alias NCBI:refseq:tbl:reference NCBI:refSeq:tbl:reference;
diff --git a/interfaces/align/seq.vschema b/interfaces/align/seq.vschema
new file mode 100644
index 0000000..9b2f452
--- /dev/null
+++ b/interfaces/align/seq.vschema
@@ -0,0 +1,300 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * Sequence schema
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'ncbi/seq.vschema';
+
+
+/* cmp_base_space
+ *  table representing compressed reads in base space,
+ *  where the bases are only stored for unaligned reads
+ */
+table NCBI:align:tbl:cmp_base_space #1
+    = INSDC:tbl:sequence #1.0.1
+    , NCBI:tbl:dcmp_base_space #1
+{
+    /* CMP_READ
+     *  read compressed against a reference sequence
+     */
+
+    // default is IUPAC character representation
+    extern default column INSDC:dna:text CMP_READ
+    {
+        read = out_cmp_dna_text;
+        validate = < INSDC:dna:text > compare ( in_cmp_dna_text, out_cmp_dna_text );
+    }
+
+    // 4na representation
+    extern column INSDC:4na:bin CMP_READ = out_cmp_4na_bin;
+    extern column INSDC:4na:packed CMP_READ = out_cmp_4na_packed;
+
+    // x2na representation - 2na with ambiguity
+    extern column INSDC:x2na:bin CMP_READ = out_cmp_x2na_bin;
+
+    // 2na representation - 2na with no ambiguity
+    extern column INSDC:2na:bin CMP_READ = out_cmp_2na_bin;
+    extern column INSDC:2na:packed CMP_READ = out_cmp_2na_packed;
+
+
+    /* input processing rules
+     */
+
+    // compressed input text
+    INSDC:dna:text in_cmp_dna_text
+        = < INSDC:dna:text, INSDC:dna:text > map < '.acmgrsvtwyhkdbn','NACMGRSVTWYHKDBN' > ( CMP_READ );
+
+    // compressed input 4na bin
+    INSDC:4na:bin in_cmp_4na_bin
+        = < INSDC:4na:bin > range_validate < 0, 15 > ( CMP_READ )
+        | ( INSDC:4na:bin ) unpack ( in_cmp_4na_packed )
+        | < INSDC:dna:text, INSDC:4na:bin > map < INSDC:4na:map:CHARSET, INSDC:4na:map:BINSET > ( in_cmp_dna_text )
+        | < INSDC:x2na:bin, INSDC:4na:bin > map < INSDC:x2na:map:BINSET, [ 1, 2, 4, 8, 15 ] > ( in_cmp_x2na_bin );
+
+    // compressed input 4na packed
+    INSDC:4na:packed in_cmp_4na_packed = CMP_READ;
+
+    // compressed input x2na bin
+    INSDC:x2na:bin in_cmp_x2na_bin
+        = < INSDC:x2na:bin > range_validate < 0, 4 > ( CMP_READ )
+        | < INSDC:4na:bin, INSDC:x2na:bin > map < INSDC:4na:map:BINSET, [ 4,0,1,4,2,4,4,4,3,4,4,4,4,4,4,4 ] > ( in_cmp_4na_bin );
+
+    // compressed input 2na bin
+    INSDC:2na:bin in_cmp_2na_bin
+        = < INSDC:2na:bin > range_validate < 0, 3 > ( CMP_READ )
+        | ( INSDC:2na:bin ) unpack ( in_cmp_2na_packed )
+        | INSDC:SEQ:rand_4na_2na ( in_cmp_4na_bin );
+
+    // compressed input 2na packed
+    INSDC:2na:packed in_cmp_2na_packed = CMP_READ;
+
+    // input 4na alt-read ( ambiguities )
+    INSDC:4na:bin in_cmp_alt_4na_bin
+        = < INSDC:4na:bin, INSDC:4na:bin > map < INSDC:4na:map:BINSET, [ 15,0,0,3,0,5,6,7,0,9,10,11,12,13,14,15 ] > ( in_cmp_4na_bin );
+
+    // preparing a feed into stats column
+    U8 in_cmp_stats_bin = in_cmp_2na_bin;
+
+
+    /* physical columns
+     */
+
+    physical column INSDC:2na:packed .CMP_READ
+        = in_cmp_2na_packed
+        | ( INSDC:2na:packed ) pack ( in_cmp_2na_bin );
+
+    physical column < INSDC:4na:bin > zip_encoding .CMP_ALTREAD
+        = < INSDC:4na:bin > trim < 0, 0 > ( in_cmp_alt_4na_bin );
+
+
+    /* output processing rules
+     */
+
+    // output 2na packed
+    INSDC:2na:packed out_cmp_2na_packed = .CMP_READ;
+
+    // unambiguous unpacked 2na
+    INSDC:2na:bin out_cmp_2na_bin
+        = ( INSDC:2na:bin ) unpack ( out_cmp_2na_packed );
+
+    // output x2na bin
+    INSDC:x2na:bin out_cmp_x2na_bin
+        = < INSDC:4na:bin, INSDC:x2na:bin > map < INSDC:4na:map:BINSET, [ 4,0,1,4,2,4,4,4,3,4,4,4,4,4,4,4 ] > ( out_cmp_4na_bin );
+
+    // output 2na->4na bin
+    INSDC:4na:bin out_cmp_2na_4na_bin
+        = < INSDC:2na:bin, INSDC:4na:bin > map < INSDC:2na:map:BINSET, [ 1, 2, 4, 8 ] > ( out_cmp_2na_bin );
+
+    // output 4na bin
+    INSDC:4na:bin out_cmp_4na_bin
+        = < INSDC:4na:bin > bit_or < ALIGN_RIGHT > ( out_cmp_2na_4na_bin, .CMP_ALTREAD )
+        | out_cmp_2na_4na_bin;
+
+    // synthesized packed 4na
+    INSDC:4na:packed out_cmp_4na_packed
+        = ( INSDC:4na:packed ) pack ( out_cmp_4na_bin );
+
+    // output text
+    INSDC:dna:text out_cmp_dna_text
+        = < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_cmp_4na_bin );
+
+
+    /* decompressed sequences
+     *   source is out_dcmp_4na_bin - a virtual production
+     */
+
+    // synthesize x2na_bin, 2na_bin and 2na_packed
+    INSDC:x2na:bin out_dcmp_x2na_bin
+        = < INSDC:4na:bin, INSDC:x2na:bin > map < INSDC:4na:map:BINSET, [ 4,0,1,4,2,4,4,4,3,4,4,4,4,4,4,4 ] > ( out_dcmp_4na_bin );
+    INSDC:2na:bin out_dcmp_2na_bin
+        = < INSDC:x2na:bin, INSDC:2na:bin > map < [ 0,1,2,3,4 ], [ 0,1,2,3,0 ] > ( out_dcmp_x2na_bin );
+    INSDC:2na:packed out_dcmp_2na_packed
+        = ( INSDC:2na:packed ) pack ( out_dcmp_2na_bin );
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  cs_native
+	 *  out_cs_key
+	 *  out_signal
+	 *  out_2cs_bin
+	 *  out_2na_bin
+	 *  out_4na_bin
+	 *  out_dna_text
+	 *  out_x2cs_bin
+	 *  out_x2na_bin
+	 *  out_2cs_packed
+	 *  out_2na_packed
+	 *  out_4na_packed
+	 *  out_color_text
+	 *  out_color_matrix
+	 */
+
+	/* NCBI:tbl:dcmp_base_space inherited productions
+	 *  out_dcmp_4na_bin
+	 */
+}
+
+
+/* cmp_color_space
+ *  table representing compressed reads in color space,
+ *  where the colors are only stored for unaligned reads
+ */
+table NCBI:align:tbl:cmp_color_space #1 =
+    INSDC:tbl:sequence #1.0.1, NCBI:tbl:dcmp_color_space #1
+{
+    /* CMP_CSREAD
+     *  read compressed against a reference sequence
+     */
+
+    // default is IUPAC character representation
+    extern default column INSDC:color:text CMP_CSREAD = out_cmp_color_text;
+
+    // x2cs representation - 2cs with ambiguity
+    extern column INSDC:x2cs:bin CMP_CSREAD = out_cmp_x2cs_bin;
+
+    // 2cs representation - 2cs with no ambiguity
+    extern column INSDC:2cs:bin CMP_CSREAD = out_cmp_2cs_bin;
+    extern column INSDC:2cs:packed CMP_CSREAD = out_cmp_2cs_packed;
+
+
+    /* input processing rules
+     */
+
+    // compressed input text
+    INSDC:color:text in_cmp_color_text = CMP_CSREAD;
+
+    // compressed input x2cs bin
+    INSDC:x2cs:bin in_cmp_x2cs_bin
+        = < INSDC:x2cs:bin > range_validate < 0, 4 > ( CMP_CSREAD )
+        | < INSDC:color:text, INSDC:x2cs:bin > map < INSDC:x2cs:map:CHARSET, INSDC:x2cs:map:BINSET > ( in_cmp_color_text );
+
+    // compressed input 2cs bin
+    INSDC:2cs:bin in_cmp_2cs_bin
+        = < INSDC:2cs:bin > range_validate < 0, 3 > ( CMP_CSREAD )
+        | ( INSDC:2cs:bin ) unpack ( in_cmp_2cs_packed )
+        | < INSDC:x2cs:bin, INSDC:2cs:bin > map < INSDC:x2cs:map:BINSET, [ 0, 1, 2, 3, 0 ] > ( in_cmp_x2cs_bin );
+
+    // compressed input 2cs packed
+    INSDC:2cs:packed in_cmp_2cs_packed = CMP_CSREAD;
+
+    // compressed input x2cs alt-read ( ambiguities )
+    INSDC:x2cs:bin in_cmp_alt_x2cs_bin
+        = < INSDC:x2cs:bin, INSDC:x2cs:bin > map < INSDC:x2cs:map:BINSET, [ 0, 0, 0, 0, 4 ] > ( in_cmp_x2cs_bin );
+
+    // preparing a feed into stats column
+    U8 in_cmp_stats_bin = in_cmp_2cs_bin;
+
+
+    /* physical columns
+     */
+
+    physical column INSDC:2cs:packed .CMP_CSREAD
+        = in_cmp_2cs_packed
+        | ( INSDC:2cs:packed ) pack ( in_cmp_2cs_bin );
+
+    physical column < INSDC:x2cs:bin > zip_encoding .CMP_ALTCSREAD
+        = < INSDC:x2cs:bin > trim < 0, 0 > ( in_cmp_alt_x2cs_bin );
+
+
+    /* output processing rules
+     */
+
+    // compressed output 2cs packed
+    INSDC:2cs:packed out_cmp_2cs_packed = .CMP_CSREAD;
+
+    // unambiguous unpacked 2cs
+    INSDC:2cs:bin out_cmp_2cs_bin
+        = ( INSDC:2cs:bin ) unpack ( out_cmp_2cs_packed );
+
+    // unpacked 2cs with ambiguity
+    INSDC:x2cs:bin out_cmp_x2cs_bin
+        = ( INSDC:x2cs:bin ) < U8 > bit_or < ALIGN_RIGHT > ( out_cmp_2cs_bin, .CMP_ALTCSREAD )
+        | ( INSDC:x2cs:bin ) out_cmp_2cs_bin;
+
+    // output text
+    INSDC:color:text out_cmp_color_text
+        = < INSDC:x2cs:bin, INSDC:color:text > map <  INSDC:x2cs:map:BINSET, INSDC:x2cs:map:CHARSET > ( out_cmp_x2cs_bin );
+
+
+    /* decompressed sequences
+     *   sources are out_dcmp_x2cs_bin - virtual production
+     */
+
+    // synthesize 2cs_bin and 2cs_packed
+    INSDC:2cs:bin out_dcmp_2cs_bin
+        = < INSDC:x2cs:bin, INSDC:2cs:bin > map < [ 0,1,2,3,4 ], [ 0,1,2,3,0 ] > ( out_dcmp_x2cs_bin );
+    INSDC:2cs:packed out_dcmp_2cs_packed
+        = ( INSDC:2cs:packed ) pack ( out_dcmp_2cs_bin );
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  cs_native
+	 *  out_cs_key
+	 *  out_signal
+	 *  out_2cs_bin
+	 *  out_2na_bin
+	 *  out_4na_bin
+	 *  out_dna_text
+	 *  out_x2cs_bin
+	 *  out_x2na_bin
+	 *  out_2cs_packed
+	 *  out_2na_packed
+	 *  out_4na_packed
+	 *  out_color_text
+	 *  out_qual_phred
+	 *  out_color_matrix
+	 *  out_qual_text_phred_33
+	 *  out_qual_text_phred_64
+	 */
+
+	/* NCBI:tbl:dcmp_color_space inherited productions
+	 *  out_dcmp_x2cs_bin
+	 */
+}
diff --git a/interfaces/align/writer-alignment.h b/interfaces/align/writer-alignment.h
new file mode 100644
index 0000000..07ffd79
--- /dev/null
+++ b/interfaces/align/writer-alignment.h
@@ -0,0 +1,181 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_align_writer_alignment_
+#define _h_align_writer_alignment_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#include <align/writer-cmn.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum ETableWriterAlgn_ColNames {
+    ewalgn_cn_TMP_KEY_ID,
+    ewalgn_cn_PLOIDY,
+    ewalgn_cn_SEQ_SPOT_ID,
+    ewalgn_cn_SEQ_READ_ID,
+    ewalgn_cn_READ_START,
+    ewalgn_cn_READ_LEN,
+    ewalgn_cn_REF_ID,
+    ewalgn_cn_REF_START,
+    ewalgn_cn_GLOBAL_REF_START,
+    ewalgn_cn_REF_LEN,
+    ewalgn_cn_REF_ORIENTATION,
+    ewalgn_cn_REF_PLOIDY,
+    ewalgn_cn_MATE_REF_ORIENTATION,
+    ewalgn_cn_MATE_REF_ID,
+    ewalgn_cn_MATE_REF_POS,
+    ewalgn_cn_MATE_ALIGN_ID,
+    ewalgn_cn_TEMPLATE_LEN,
+    ewalgn_cn_MAPQ,
+    ewalgn_cn_HAS_MISMATCH,
+    ewalgn_cn_HAS_REF_OFFSET,
+    ewalgn_cn_MISMATCH,
+    ewalgn_cn_REF_OFFSET,
+    ewalgn_cn_REF_OFFSET_TYPE,
+    ewalgn_cn_EVIDENCE_ALIGNMENT_IDS,
+    ewalgn_cn_ALIGN_GROUP,
+    ewalgn_cn_LINKAGE_GROUP,
+    ewalgn_cn_MISMATCH_QUALITY,
+    ewalgn_cn_MATE_GLOBAL_REF_START,
+    ewalgn_cn_MATE_REF_START,
+    ewalgn_cn_Last
+};
+
+typedef uint8_t ETableWriterAlgn_TableType;
+enum {
+    ewalgn_tabletype_PrimaryAlignment,
+    ewalgn_tabletype_SecondaryAlignment,
+    ewalgn_tabletype_EvidenceInterval,
+    ewalgn_tabletype_EvidenceAlignment
+};
+
+enum ETableWriterAlgn_ColOptions {
+    ewalgn_co_SEQ_SPOT_ID = 0x01,           /* SEQ_SPOT_ID will be written with the whole record */
+    ewalgn_co_TMP_KEY_ID = 0x02,            /* use TMP_KEY_ID column, by default not opened */
+    ewalgn_co_PLOIDY = 0x04,                /* ploidy is more than 1, columns PLOIDY, READ_START, READ_LEN needs data */
+    ewalgn_co_unsorted = 0x08,              /* use the unsorted table scheme */
+    ewalgn_co_MATE_ALIGN_ID_only = 0x10,    /* disable all other MATE_* columns */
+    ewalgn_co_MISMATCH_QUALITY = 0x20,      /* enable MISMATCH_QUALITY column */
+    ewalgn_co_MATE_POSITION = 0x40          /* enable mate position columns */
+};
+
+typedef struct TableWriterAlgnData_struct {
+
+    TableWriterData seq_spot_id;
+    TableWriterData seq_read_id;
+    TableWriterData tmp_key_id;
+
+    /* BEGIN filled out by ReferenceMgr_Compress */
+    uint32_t ploidy; /* incremented sequentially for each call, must be set to 0 for each new spot */
+    TableWriterData read_start; /* mandatory */
+    TableWriterData read_len; /* mandatory */
+    TableWriterData has_ref_offset; /* mandatory */
+    TableWriterData ref_offset; /* mandatory */
+    TableWriterData ref_offset_type; /* mandatory */
+    TableWriterData ref_id; /* used for unsorted*/
+    TableWriterData ref_start; /* used only for unsorted */
+    TableWriterData global_ref_start; /* used only for sorted */
+    TableWriterData has_mismatch;  /* mandatory only for primary */
+    TableWriterData mismatch; /* mandatory only for primary */
+    TableWriterData mismatch_qual;
+
+    INSDC_coord_len ref_len; /* projection on refseq is same for all alleles! */
+    /* tmp data, never saved to db */
+    /* recalculated offset in reference based on CIGAR and circularity in Compression */
+    INSDC_coord_zero effective_offset; 
+    int64_t ref_1st_row_id;
+    /* END filled out by ReferenceMgr_Compress */
+
+    TableWriterData ref_orientation;
+    TableWriterData ref_ploidy;
+    TableWriterData mapq;
+    TableWriterData align_group; /* set length to 0 if not used */
+    TableWriterData linkageGroup; /* set length to 0 if not used */
+
+    /* used only only in secondary */
+    TableWriterData mate_ref_orientation;
+    TableWriterData mate_ref_id;
+    TableWriterData mate_ref_pos;
+    TableWriterData mate_align_id;
+    TableWriterData template_len;
+
+    /* used only in for ewalgn_tabletype_EvidenceInterval table type */
+    TableWriterData alingment_ids;
+} TableWriterAlgnData;
+
+typedef struct TableWriterAlgn TableWriterAlgn;
+    
+typedef union ReferenceStart ReferenceStart;
+union ReferenceStart {
+    uint64_t global_ref_start;
+    struct {
+        int64_t ref_id;
+        INSDC_coord_one ref_start;
+    } local;
+};
+
+ALIGN_EXTERN rc_t CC TableWriterAlgn_Make(const TableWriterAlgn** cself, VDatabase* db,
+                                          ETableWriterAlgn_TableType type, uint32_t options);
+
+/* rows optional here */
+ALIGN_EXTERN rc_t CC TableWriterAlgn_Whack(const TableWriterAlgn* cself, bool commit, uint64_t* rows);
+
+ALIGN_EXTERN rc_t CC TableWriterAlgn_WriteDefault(const TableWriterAlgn* cself,
+                                                  enum ETableWriterAlgn_ColNames col, const TableWriterData* data);
+
+ALIGN_EXTERN rc_t CC TableWriterAlgn_GetNextRowId(const TableWriterAlgn* cself, int64_t* rowid);
+
+/* rowid optional here */
+ALIGN_EXTERN rc_t CC TableWriterAlgn_Write(const TableWriterAlgn* cself, const TableWriterAlgnData* data, int64_t* rowid);
+
+/* closes main cursor and creates lookup object on the successfully committed main cursor */
+ALIGN_EXTERN rc_t CC TableWriterAlgn_TmpKeyStart(const TableWriterAlgn* cself);
+
+/* retrieve TMP_KEY value by rowid */
+ALIGN_EXTERN rc_t CC TableWriterAlgn_TmpKey(const TableWriterAlgn* cself, int64_t rowid, uint64_t* key_id);
+
+/* retrieve reference start value by rowid */
+ALIGN_EXTERN rc_t CC TableWriterAlgn_RefStart(const TableWriterAlgn* cself, int64_t rowid, ReferenceStart *const rslt);
+
+/* assign a SPOT_ID value to row */
+ALIGN_EXTERN rc_t CC TableWriterAlgn_Write_SpotId(const TableWriterAlgn* cself, int64_t rowid, int64_t spot_id);
+
+ALIGN_EXTERN rc_t CC TableWriterAlgn_Write_SpotInfo(const TableWriterAlgn* cself,
+                                                    int64_t rowid,
+                                                    int64_t spot_id,
+                                                    int64_t mate_id,
+                                                    ReferenceStart const *ref_start);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_writer_alignment_ */
diff --git a/interfaces/align/writer-cmn.h b/interfaces/align/writer-cmn.h
new file mode 100644
index 0000000..9e6086a
--- /dev/null
+++ b/interfaces/align/writer-cmn.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_align_writer_cmn_
+#define _h_align_writer_cmn_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct TableWriterData_struct {
+    const void* buffer;
+    uint64_t elements;
+} TableWriterData;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_writer_cmn_ */
diff --git a/interfaces/align/writer-reference.h b/interfaces/align/writer-reference.h
new file mode 100644
index 0000000..221b1bc
--- /dev/null
+++ b/interfaces/align/writer-reference.h
@@ -0,0 +1,180 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_align_writer_reference_
+#define _h_align_writer_reference_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#include <insdc/insdc.h>
+#include <align/writer-cmn.h>
+#include <align/writer-alignment.h>
+#include <align/reader-refseq.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFile;
+
+enum EReference_Options {
+    ewrefmgr_co_allREADs = 0x01, /* always write READ */
+    ewrefmgr_co_Coverage = 0x02,  /* use coverage data, by default not used */
+    ewrefmgr_co_AcceptHardClip = 0x04 /* accept hard clipping in CIGAR */
+};
+
+typedef struct ReferenceMgr ReferenceMgr;
+
+/* Writes REFERENCE table with in given db
+    
+    vmgr [IN] - needed only if conf is not NULL
+    conf [IN] - optional path to tab separated file to resolve reference names
+                from source files to standard refseq accessions;
+                standard refseq dictionary location is obtained from kfg files.
+    path {IN] - optional path points to a directory with 'local' references
+                (not found in conf file), default is '.'
+    max_seq_len [IN] - 0 - use default
+    cache [IN] - db cache size per single!!! reference (vdb cursor cache)
+    num_open [IN] - number of refseq kept open, 0 - no limit
+ */
+ALIGN_EXTERN rc_t CC ReferenceMgr_Make(const ReferenceMgr** cself, VDatabase* db, const VDBManager* vmgr,
+                                       const uint32_t options, const char* conf, const char* path, uint32_t max_seq_len,
+                                       size_t cache, uint32_t num_open);
+
+ALIGN_EXTERN rc_t CC ReferenceMgr_Release(const ReferenceMgr *cself,
+                                          const bool commit,
+                                          uint64_t *const Rows,
+                                          const bool build_coverage,
+                                          rc_t (*const quitting)(void)
+                                          );
+
+ALIGN_EXTERN rc_t CC ReferenceMgr_SetCache(ReferenceMgr const *const self, size_t cache, uint32_t num_open);
+
+typedef struct ReferenceSeq ReferenceSeq;
+
+/* id: chr12 or NC_000001.3 */
+ALIGN_EXTERN rc_t CC ReferenceMgr_GetSeq(ReferenceMgr const *self,
+                                         ReferenceSeq const **seq,
+                                         char const id[],
+                                         bool *shouldUnmap,
+                                         bool allowMultiMapping,
+                                         bool wasRenamed[]);
+
+ALIGN_EXTERN rc_t CC ReferenceMgr_Verify(ReferenceMgr const *self,
+                                         char const id[],
+                                         INSDC_coord_len length,
+                                         uint8_t const md5[16],
+                                         bool allowMultiMapping,
+                                         bool wasRenamed[]);
+
+ALIGN_EXTERN rc_t CC ReferenceMgr_FastaPath(const ReferenceMgr* cself, const char* fasta_path);
+
+ALIGN_EXTERN rc_t CC ReferenceMgr_FastaFile(const ReferenceMgr* cself, struct KFile const* file);
+
+enum EReference_CompressionOptions {
+    ewrefmgr_cmp_Binary = 0x01, /* binary cigar on input (BAM format: 28+4 bits) */
+    ewrefmgr_cmp_Exact = 0x02 /* exact matching no cliping */
+};
+
+ALIGN_EXTERN rc_t CC ReferenceMgr_Compress(const ReferenceMgr* cself,
+                                           uint32_t options,
+                                           const char* id,
+                                           INSDC_coord_zero offset,
+                                           const char* seq,
+                                           INSDC_coord_len seq_len,
+                                           const void* cigar,
+                                           uint32_t cigar_len,
+                                           INSDC_coord_zero allele_offset,
+                                           const char* allele,
+                                           INSDC_coord_len allele_len,
+                                           INSDC_coord_zero offset_in_allele,
+                                           const void* allele_cigar,
+                                           uint32_t allele_cigar_len,
+                                           uint8_t rna_orient,
+                                           TableWriterAlgnData* data);
+
+
+/* Read refseq chunk of 'len' bases into provided 'buffer' (must be enough big for len);
+   ref_len - on return has number of bases written to the buffer
+ */
+ALIGN_EXTERN rc_t CC ReferenceSeq_Read(const ReferenceSeq* cself, INSDC_coord_zero offset, INSDC_coord_len len,
+                                       uint8_t* buffer, INSDC_coord_len* ref_len);
+
+ALIGN_EXTERN rc_t CC ReferenceSeq_Get1stRow(const ReferenceSeq* cself, int64_t* row_id);
+    
+ALIGN_EXTERN rc_t CC ReferenceSeq_GetID(ReferenceSeq const *self, char const **rslt);
+
+ALIGN_EXTERN rc_t CC ReferenceSeq_Compress(const ReferenceSeq* cself,
+                                           uint32_t options,
+                                           INSDC_coord_zero offset,
+                                           const char* seq,
+                                           INSDC_coord_len seq_len,
+                                           const void* cigar,
+                                           uint32_t cigar_len,
+                                           INSDC_coord_zero allele_offset,
+                                           const char* allele,
+                                           INSDC_coord_len allele_len,
+                                           INSDC_coord_zero offset_in_allele,
+                                           const void* allele_cigar,
+                                           uint32_t allele_cigar_len,
+                                           uint8_t rna_orient,
+                                           TableWriterAlgnData* data);
+                                           
+ALIGN_EXTERN rc_t CC ReferenceSeq_TranslateOffset_int(ReferenceSeq const *const cself,
+                                                      INSDC_coord_zero const offset,
+                                                      int64_t *const ref_id,
+                                                      INSDC_coord_zero *const ref_start,
+                                                      uint64_t *const global_ref_start);
+                                           
+
+enum ReferenceSeqCoverageTableType {
+    ewrefcov_primary_table = 0,
+    ewrefcov_secondary_table,
+    ewrefcov_evidence_table
+};
+
+typedef struct ReferenceSeqCoverage_struct {
+    /* based only on primary and secondary */
+    uint8_t high;
+    uint8_t low;
+    uint32_t mismatches;
+    uint32_t indels;
+    /* in that order (use enum above): prim, 2nd, evidence */
+    INSDC_coord_zero overlap_ref_pos[3];
+    INSDC_coord_len overlap_ref_len[3];
+    TableWriterData ids[3];
+} ReferenceSeqCoverage;
+
+ALIGN_EXTERN rc_t CC ReferenceSeq_AddCoverage(const ReferenceSeq* cself, INSDC_coord_zero offset, const ReferenceSeqCoverage* data);
+
+ALIGN_EXTERN rc_t CC ReferenceSeq_Release(const ReferenceSeq* cself);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_writer_reference_ */
diff --git a/interfaces/align/writer-refseq.h b/interfaces/align/writer-refseq.h
new file mode 100644
index 0000000..3f3e44a
--- /dev/null
+++ b/interfaces/align/writer-refseq.h
@@ -0,0 +1,89 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_align_writer_refseq_
+#define _h_align_writer_refseq_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#include <vdb/manager.h>
+#include <align/writer-cmn.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* default sequence chunk length */
+#define TableWriterRefSeq_MAX_SEQ_LEN 5000
+
+/* use in TableWriterRefSeq_Write* methods */
+enum ETableWriterRefSeq_ColNames {
+    ewrefseq_cn_MAX_SEQ_LEN, /* static/default */
+    ewrefseq_cn_DEF_LINE, /* static/default */
+    ewrefseq_cn_CS_KEY, /* handled by writer */
+    ewrefseq_cn_READ,
+    ewrefseq_cn_QUALITY, /* optional */
+    ewrefseq_cn_SEQ_ID, /* static/default */
+    ewrefseq_cn_SEQ_START, /* calculated on fly by writer */
+    ewrefseq_cn_SEQ_LEN, /* calculated on fly by writer */
+    ewrefseq_cn_CIRCULAR, /* static/default */
+    ewrefseq_cn_Last = ewrefseq_cn_CIRCULAR
+};
+
+enum ETableWriterRefSeq_ColOptions {
+    ewrefseq_co_QUALITY = 0x01 /* use QUALITY column, by default not opened */
+};
+
+typedef struct TableWriterRefSeqData_struct {
+    TableWriterData read;
+    TableWriterData quality;
+} TableWriterRefSeqData;
+
+typedef struct TableWriterRefSeq TableWriterRefSeq;
+
+ALIGN_EXTERN rc_t CC TableWriterRefSeq_Make(const TableWriterRefSeq** cself, VDBManager* mgr, const char* schema_path,
+                                            const char* table_path, const uint32_t options);
+
+/* rows optional here, app signature is mandatory */
+ALIGN_EXTERN rc_t CC TableWriterRefSeq_Whack(const TableWriterRefSeq* cself, bool commit, uint64_t* rows,
+                                             const char loader_name[],
+                                             const ver_t loader_version,
+                                             const char loader_date[],
+                                             const char app_name[],
+                                             const ver_t app_version);
+
+ALIGN_EXTERN rc_t CC TableWriterRefSeq_WriteDefault(const TableWriterRefSeq* cself,
+                                                    enum ETableWriterRefSeq_ColNames col, const TableWriterData* data);
+
+/* rowid optional here */
+ALIGN_EXTERN rc_t CC TableWriterRefSeq_Write(const TableWriterRefSeq* cself, const TableWriterRefSeqData* data, int64_t* rowid);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_writer_refseq_ */
diff --git a/interfaces/align/writer-sequence.h b/interfaces/align/writer-sequence.h
new file mode 100644
index 0000000..526d6f4
--- /dev/null
+++ b/interfaces/align/writer-sequence.h
@@ -0,0 +1,157 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_align_writer_sequence_
+#define _h_align_writer_sequence_
+
+#ifndef _h_align_extern_
+#include <align/extern.h>
+#endif
+
+#include <align/writer-cmn.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum ETableWriterSeq_ColNames {
+    ewseq_cn_READ,
+    ewseq_cn_CSREAD,
+    ewseq_cn_CSKEY,
+    ewseq_cn_QUALITY,
+    ewseq_cn_PRIMARY_ALIGNMENT_ID,
+    ewseq_cn_ALIGNMENT_COUNT,
+    ewseq_cn_PLATFORM,
+    ewseq_cn_LABEL,
+    ewseq_cn_LABEL_START,
+    ewseq_cn_LABEL_LEN,
+    ewseq_cn_READ_TYPE,
+    ewseq_cn_READ_START,
+    ewseq_cn_READ_LEN,
+    ewseq_cn_TMP_KEY_ID,
+    ewseq_cn_SPOT_GROUP,
+    ewseq_cn_READ_FILTER,
+    ewseq_cn_TI,
+    ewseq_cn_NAME,
+    ewseq_cn_LINKAGE_GROUP,
+    ewseq_cn_Last = ewseq_cn_LINKAGE_GROUP
+};
+
+enum ETableWriterSeq_ColOptions {
+    ewseq_co_SaveRead = 0x01,       /* write read even when there are alignments */
+    ewseq_co_FullQuality = 0x02,    /* write full quality values, by default [1,10,20,30] */
+    ewseq_co_AlignData = 0x04,      /* PRIMARY_ALIGNMENT_ID, ALIGNMENT_COUNT will be written with the whole record */
+    ewseq_co_NoLabelData = 0x08,    /* LABEL and related columns will not be written */
+    ewseq_co_ColorSpace = 0x10,     /* CMP_CSREAD will be written instead of CMP_READ */
+    ewseq_co_SpotGroup = 0x20,      /* SPOT_GROUP will be written */
+    ewseq_co_TI = 0x40,             /* TI will be written */
+    ewseq_co_SaveQual = 0x80,       /* write quality even when there are alignments */
+    ewseq_co_SpotName = 0x100,      /* NAME will be written */
+    ewseq_co_KeepKey = 0x200,       /* TMP_KEY_ID won't be removed */
+};
+
+typedef struct TableWriterSeqData_struct {
+    uint64_t        spot_len;
+    TableWriterData sequence; /* writes sequence ONLY if alignment_count == 0 */
+    TableWriterData quality;
+
+    TableWriterData primary_alignment_id;
+    TableWriterData alignment_count;
+    TableWriterData label;
+    TableWriterData label_start;
+    TableWriterData label_len;
+    uint8_t nreads;
+    TableWriterData read_type;
+    TableWriterData read_start;
+    TableWriterData read_len;
+    uint64_t tmp_key_id;
+    TableWriterData spot_group;
+    TableWriterData cskey;
+    TableWriterData read_filter;
+    TableWriterData no_quantize_mask;
+    TableWriterData platform;
+    TableWriterData ti;
+    TableWriterData spot_name;
+    TableWriterData linkageGroup;
+} TableWriterSeqData;
+
+typedef struct TableWriterSeq TableWriterSeq;
+
+/*
+ * quality_quantization:
+ *  is a ',' seperated list of value pairs, with the pairs seperated by ':'.
+ *  The first of the pair is the value to substitute.
+ *  The second is the limit at which the substitution is no longer valid.
+ *  The second value can be '-' to indication the remainder; this also terminates
+ *  processing of the string.  If the second value is not '-', then the trailing
+ *  ',' is required.
+ *
+ *  Example: 1:10,10:20,20:30,30:40,
+ *  This will substitute 1 for quality values [0, 10), 10 for [10, 20),
+ *  20 for [20, 30), 30 for [30, 40), and 0 for the rest
+ *
+ *  Example: 1:10,10:20,20:30,30:-
+ *  This will substitute 1 for quality values [0, 10), 10 for [10, 20),
+ *  20 for [20, 30), and 30 for the rest
+ *
+ *  Example: 1:30,30:-
+ *  This will substitute 1 for quality values [0, 30), and 30 for the rest
+ *
+ *  Example: 10:30,20:-
+ *  This will substitute 10 for quality values [0, 30), 20 for the rest
+ */
+ALIGN_EXTERN rc_t CC TableWriterSeq_Make(const TableWriterSeq** cself, VDatabase* db,
+                                         const uint32_t options, char const quality_quantization[]);
+
+/* rows optional here */
+ALIGN_EXTERN rc_t CC TableWriterSeq_Whack(const TableWriterSeq* cself, bool commit, uint64_t* rows);
+
+ALIGN_EXTERN rc_t CC TableWriteSeq_WriteDefault(const TableWriterSeq* cself,
+                                                enum ETableWriterSeq_ColNames col, const TableWriterData* data);
+
+ALIGN_EXTERN rc_t CC TableWriterSeq_GetNextRowId(const TableWriterSeq* cself, int64_t* rowid);
+
+/* rowid optional here */
+ALIGN_EXTERN rc_t CC TableWriterSeq_Write(const TableWriterSeq* cself, const TableWriterSeqData* data, int64_t* rowid);
+
+
+/* if option ewseq_co_AlignData is not set (default) below methods are available */
+
+/* closes main cursor and creates lookup object on the successfully committed main cursor */
+ALIGN_EXTERN rc_t CC TableWriterSeq_TmpKeyStart(const TableWriterSeq* cself);
+
+/* retrieve TMP_KEY value by rowid */
+ALIGN_EXTERN rc_t CC TableWriterSeq_TmpKey(const TableWriterSeq* cself, int64_t rowid, uint64_t *key_id);
+
+/* passing rowid == 0 will cause the cursor to be flushed */
+ALIGN_EXTERN rc_t CC TableWriterSeq_WriteAlignmentData(const TableWriterSeq* cself, int64_t rowid,
+                                                       const TableWriterData* primary_alignment_id,
+                                                       const TableWriterData* alignment_count);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_align_writer_sequence_ */
diff --git a/interfaces/cc/cc/compiler.h b/interfaces/cc/cc/compiler.h
new file mode 100644
index 0000000..d1bf565
--- /dev/null
+++ b/interfaces/cc/cc/compiler.h
@@ -0,0 +1,39 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_compiler_
+#define _h_compiler_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_compiler_ */
+
diff --git a/interfaces/cc/gcc/compiler.h b/interfaces/cc/gcc/compiler.h
new file mode 100644
index 0000000..d1bf565
--- /dev/null
+++ b/interfaces/cc/gcc/compiler.h
@@ -0,0 +1,39 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_compiler_
+#define _h_compiler_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_compiler_ */
+
diff --git a/interfaces/cc/gcc/fat86/arch-impl.h b/interfaces/cc/gcc/fat86/arch-impl.h
new file mode 100644
index 0000000..1642a48
--- /dev/null
+++ b/interfaces/cc/gcc/fat86/arch-impl.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#if _ARCH_BITS == 32
+#include "../i386/arch-impl.h"
+#elif _ARCH_BITS == 64
+#include "../x86_64/arch-impl.h"
+#else
+#error "_ARCH_BITS not defined to be 32 or 64"
+#endif
diff --git a/interfaces/cc/gcc/fat86/atomic.h b/interfaces/cc/gcc/fat86/atomic.h
new file mode 100644
index 0000000..be41a38
--- /dev/null
+++ b/interfaces/cc/gcc/fat86/atomic.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#if _ARCH_BITS == 32
+#include "../i386/atomic.h"
+#elif _ARCH_BITS == 64
+#include "../x86_64/atomic.h"
+#else
+#error "_ARCH_BITS not defined to be 32 or 64"
+#endif
diff --git a/interfaces/cc/gcc/fat86/atomic32.h b/interfaces/cc/gcc/fat86/atomic32.h
new file mode 100644
index 0000000..53fa52c
--- /dev/null
+++ b/interfaces/cc/gcc/fat86/atomic32.h
@@ -0,0 +1,37 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _ARCH_BITS
+#define _ARCH_BITS __SIZEOF_POINTER__*__CHAR_BIT__
+#endif
+
+#if _ARCH_BITS == 32
+#include "../i386/atomic32.h"
+#elif _ARCH_BITS == 64
+#include "../x86_64/atomic32.h"
+#else
+#error "_ARCH_BITS not defined to be 32 or 64"
+#endif
diff --git a/interfaces/cc/gcc/fat86/atomic64.h b/interfaces/cc/gcc/fat86/atomic64.h
new file mode 100644
index 0000000..c2a0eaf
--- /dev/null
+++ b/interfaces/cc/gcc/fat86/atomic64.h
@@ -0,0 +1,32 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#if _ARCH_BITS == 32
+#elif _ARCH_BITS == 64
+#include "../x86_64/atomic64.h"
+#else
+#error "_ARCH_BITS not defined to be 32 or 64"
+#endif
diff --git a/interfaces/cc/gcc/fat86/bitstr.h b/interfaces/cc/gcc/fat86/bitstr.h
new file mode 100644
index 0000000..89beb5d
--- /dev/null
+++ b/interfaces/cc/gcc/fat86/bitstr.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#if _ARCH_BITS == 32
+#include "../i386/bitstr.h"
+#elif _ARCH_BITS == 64
+#include "../x86_64/bitstr.h"
+#else
+#error "_ARCH_BITS not defined to be 32 or 64"
+#endif
diff --git a/interfaces/cc/gcc/fat86/byteswap.h b/interfaces/cc/gcc/fat86/byteswap.h
new file mode 100644
index 0000000..49fde67
--- /dev/null
+++ b/interfaces/cc/gcc/fat86/byteswap.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#if _ARCH_BITS == 32
+#include "../i386/byteswap.h"
+#elif _ARCH_BITS == 64
+#include "../x86_64/byteswap.h"
+#else
+#error "_ARCH_BITS not defined to be 32 or 64"
+#endif
diff --git a/interfaces/cc/gcc/fat86/strtol.h b/interfaces/cc/gcc/fat86/strtol.h
new file mode 100644
index 0000000..79970a1
--- /dev/null
+++ b/interfaces/cc/gcc/fat86/strtol.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#if _ARCH_BITS == 32
+#include "../i386/strtol.h"
+#elif _ARCH_BITS == 64
+#include "../x86_64/strtol.h"
+#else
+#error "_ARCH_BITS not defined to be 32 or 64"
+#endif
diff --git a/interfaces/cc/gcc/i386/arch-impl.h b/interfaces/cc/gcc/i386/arch-impl.h
new file mode 100644
index 0000000..9389218
--- /dev/null
+++ b/interfaces/cc/gcc/i386/arch-impl.h
@@ -0,0 +1,488 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_arch_impl_
+#define _h_arch_impl_
+
+#include <stdint.h>
+
+#ifndef USE_GCC_BUILTIN
+#define USE_GCC_BUILTIN 1
+#endif
+
+#if USE_GCC_BUILTIN
+#include <strings.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static __inline__
+int16_t uint16_lsbit ( uint16_t self )
+{
+    int16_t rtn;
+#if USE_GCC_BUILTIN
+    rtn = ( int16_t ) __builtin_ffs ( self ) - 1;
+#else
+    __asm__ __volatile__
+    (
+        "bsf %%ax, %%ax;"
+        "jnz 1f;"
+        "xor %%eax, %%eax;"
+        "dec %%eax;"
+        "1:"
+        : "=a" ( rtn )
+        : "a" ( self )
+    );
+#endif
+    return rtn;
+}
+
+static __inline__
+int32_t uint32_lsbit ( uint32_t self )
+{
+    int32_t rtn;
+#if USE_GCC_BUILTIN
+    rtn = __builtin_ffs ( self ) - 1;
+#else
+    __asm__ __volatile__
+    (
+        "bsf %%eax, %%eax;"
+        "jnz 1f;"
+        "xor %%eax, %%eax;"
+        "dec %%eax;"
+        "1:"
+        : "=a" ( rtn )
+        : "a" ( self )
+    );
+#endif
+    return rtn;
+}
+
+static __inline__
+int16_t uint16_msbit ( uint16_t self )
+{
+    int16_t rtn;
+#if USE_GCC_BUILTIN
+    if ( self == 0 ) return -1;
+    rtn = ( int16_t ) 31 - __builtin_clz ( ( uint32_t ) self );
+#else
+    __asm__ __volatile__
+    (
+        "bsr %%ax, %%ax;"
+        "jnz 1f;"
+        "xor %%eax, %%eax;"
+        "dec %%eax;"
+        "1:"
+        : "=a" ( rtn )
+        : "a" ( self )
+    );
+#endif
+    return rtn;
+}
+
+static __inline__
+int32_t uint32_msbit ( uint32_t self )
+{
+    int32_t rtn;
+#if USE_GCC_BUILTIN
+    if ( self == 0 ) return -1;
+    rtn = 31 - __builtin_clz ( self );
+#else
+    __asm__ __volatile__
+    (
+        "bsr %%eax, %%eax;"
+        "jnz 1f;"
+        "xor %%eax, %%eax;"
+        "dec %%eax;"
+        "1:"
+        : "=a" ( rtn )
+        : "a" ( self )
+    );
+#endif
+    return rtn;
+}
+
+typedef struct int128_t int128_t;
+struct int128_t
+{
+    uint64_t lo;
+    int64_t hi;
+};
+
+static __inline__
+int64_t int128_hi ( const int128_t *self )
+{
+    return self -> hi;
+}
+
+static __inline__
+uint64_t int128_lo ( const int128_t *self )
+{
+    return self -> lo;
+}
+
+static __inline__
+void int128_sethi ( int128_t *self, int64_t i )
+{
+    self -> hi = i;
+}
+
+static __inline__
+void int128_setlo ( int128_t *self, uint64_t i )
+{
+    self -> lo = i;
+}
+
+typedef struct uint128_t uint128_t;
+struct uint128_t
+{
+    uint64_t lo;
+    uint64_t hi;
+};
+
+static __inline__
+uint64_t uint128_hi ( const uint128_t *self )
+{
+    return self -> hi;
+}
+
+static __inline__
+uint64_t uint128_lo ( const uint128_t *self )
+{
+    return self -> lo;
+}
+
+static __inline__
+void uint128_sethi ( uint128_t *self, uint64_t i )
+{
+    self -> hi = i;
+}
+
+static __inline__
+void uint128_setlo ( uint128_t *self, uint64_t i )
+{
+    self -> lo = i;
+}
+
+static __inline__
+void int128_add ( int128_t *self, const int128_t *i )
+{
+    __asm__ __volatile__
+    (
+        "push %%ebx;"
+        "mov (%%edx), %%eax;"
+        "mov 4(%%edx), %%ebx;"
+        "mov 8(%%edx), %%esi;"
+        "mov 12(%%edx), %%edi;"
+        "add %%eax, (%%ecx);"
+        "adc %%ebx, 4(%%ecx);"
+        "adc %%esi, 8(%%ecx);"
+        "adc %%edi, 12(%%ecx);"
+        "pop %%ebx;"
+        :
+        : "c" ( self ), "d" ( i )
+        : "%eax", "%esi", "%edi"
+    );
+}
+
+static __inline__
+void int128_sub ( int128_t *self, const int128_t *i )
+{
+    __asm__ __volatile__
+    (
+        "push %%ebx;"
+        "mov (%%edx), %%eax;"
+        "mov 4(%%edx), %%ebx;"
+        "mov 8(%%edx), %%esi;"
+        "mov 12(%%edx), %%edi;"
+        "sub %%eax, (%%ecx);"
+        "sbb %%ebx, 4(%%ecx);"
+        "sbb %%esi, 8(%%ecx);"
+        "sbb %%edi, 12(%%ecx);"
+        "pop %%ebx;"
+        :
+        : "c" ( self ), "d" ( i )
+        : "%eax", "%esi", "%edi"
+    );
+}
+
+static __inline__
+void int128_sar ( int128_t *self, uint32_t i )
+{
+    __asm__ __volatile__
+    (
+        "mov 4(%%edx), %%eax;"
+        "shrd %%cl, %%eax, (%%edx);"
+        "mov 8(%%edx), %%eax;"
+        "shrd %%cl, %%eax, 4(%%edx);"
+        "mov 12(%%edx), %%eax;"
+        "shrd %%cl, %%eax, 8(%%edx);"
+        "sar %%cl, %%eax;"
+        "mov %%eax, 12(%%edx);"
+        :
+        : "d" ( self ), "c" ( i )
+        :  "%eax"
+    );
+}
+
+static __inline__
+void int128_shl ( int128_t *self, uint32_t i )
+{
+    __asm__ __volatile__
+    (
+        "mov 8(%%edx), %%eax;"
+        "shld %%cl, %%eax, 12(%%edx);"
+        "mov 4(%%edx), %%eax;"
+        "shld %%cl, %%eax, 8(%%edx);"
+        "mov (%%edx), %%eax;"
+        "shld %%cl, %%eax, 4(%%edx);"
+        "shl %%cl, %%eax;"
+        "mov %%eax, (%%edx);"
+        :
+        : "d" ( self ), "c" ( i )
+        :  "%eax"
+    );
+}
+
+static __inline__
+void uint128_and ( uint128_t *self, const uint128_t *i )
+{
+    __asm__ __volatile__
+    (
+        "push %%ebx;"
+        "mov (%%edx), %%eax;"
+        "mov 4(%%edx), %%ebx;"
+        "mov 8(%%edx), %%esi;"
+        "mov 12(%%edx), %%edi;"
+        "and %%eax, (%%ecx);"
+        "and %%ebx, 4(%%ecx);"
+        "and %%esi, 8(%%ecx);"
+        "and %%edi, 12(%%ecx);"
+        "pop %%ebx;"
+        :
+        : "c" ( self ), "d" ( i )
+        : "%eax", "%esi", "%edi"
+    );
+}
+
+static __inline__
+void uint128_or ( uint128_t *self, const uint128_t *i )
+{
+    __asm__ __volatile__
+    (
+        "push %%ebx;"
+        "mov (%%edx), %%eax;"
+        "mov 4(%%edx), %%ebx;"
+        "mov 8(%%edx), %%esi;"
+        "mov 12(%%edx), %%edi;"
+        "or %%eax, (%%ecx);"
+        "or %%ebx, 4(%%ecx);"
+        "or %%esi, 8(%%ecx);"
+        "or %%edi, 12(%%ecx);"
+        "pop %%ebx;"
+        :
+        : "c" ( self ), "d" ( i )
+        : "%eax", "%esi", "%edi"
+    );
+}
+
+static __inline__
+void uint128_orlo ( uint128_t *self, uint64_t i )
+{
+    self -> lo |= i;
+}
+
+static __inline__
+void uint128_xor ( uint128_t *self, const uint128_t *i )
+{
+    __asm__ __volatile__
+    (
+        "push %%ebx;"
+        "mov (%%edx), %%eax;"
+        "mov 4(%%edx), %%ebx;"
+        "mov 8(%%edx), %%esi;"
+        "mov 12(%%edx), %%edi;"
+        "xor %%eax, (%%ecx);"
+        "xor %%ebx, 4(%%ecx);"
+        "xor %%esi, 8(%%ecx);"
+        "xor %%edi, 12(%%ecx);"
+        "pop %%ebx;"
+        :
+        : "c" ( self ), "d" ( i )
+        : "%eax", "%esi", "%edi"
+    );
+}
+
+static __inline__
+void uint128_not ( uint128_t *self )
+{
+    __asm__ __volatile__
+    (
+        "notl (%%ecx);"
+        "notl 4(%%ecx);"
+        "notl 8(%%ecx);"
+        "notl 12(%%ecx);"
+        :
+        : "c" ( self )
+    );
+}
+
+static __inline__
+void uint128_shr ( uint128_t *self, uint32_t i )
+{
+    __asm__ __volatile__
+    (
+        "mov 4(%%edx), %%eax;"
+        "shrd %%cl, %%eax, (%%edx);"
+        "mov 8(%%edx), %%eax;"
+        "shrd %%cl, %%eax, 4(%%edx);"
+        "mov 12(%%edx), %%eax;"
+        "shrd %%cl, %%eax, 8(%%edx);"
+        "shr %%cl, %%eax;"
+        "mov %%eax, 12(%%edx);"
+        :
+        : "d" ( self ), "c" ( i )
+        :  "%eax"
+    );
+}
+
+static __inline__
+void uint128_shl ( uint128_t *self, uint32_t i )
+{
+    __asm__ __volatile__
+    (
+        "mov 8(%%edx), %%eax;"
+        "shld %%cl, %%eax, 12(%%edx);"
+        "mov 4(%%edx), %%eax;"
+        "shld %%cl, %%eax, 8(%%edx);"
+        "mov (%%edx), %%eax;"
+        "shld %%cl, %%eax, 4(%%edx);"
+        "shl %%cl, %%eax;"
+        "mov %%eax, (%%edx);"
+        :
+        : "d" ( self ), "c" ( i )
+        :  "%eax"
+    );
+}
+
+static __inline__
+void uint128_bswap ( uint128_t *self )
+{
+    __asm__ __volatile__
+    (
+        "mov (%%ecx), %%eax;"
+        "mov 12(%%ecx), %%edx;"
+        "bswap %%eax;"
+        "bswap %%edx;"
+        "mov %%eax, 12(%%ecx);"
+        "mov %%edx, (%%ecx);"
+        "mov 4(%%ecx), %%eax;"
+        "mov 8(%%ecx), %%edx;"
+        "bswap %%eax;"
+        "bswap %%edx;"
+        "mov %%eax, 8(%%ecx);"
+        "mov %%edx, 4(%%ecx);"
+        :
+        : "c" ( self )
+        :  "%eax", "%edx"
+    );
+}
+
+static __inline__
+void uint128_bswap_copy ( uint128_t *to, const uint128_t *from )
+{
+    __asm__ __volatile__
+    (
+        "push %%ebx;"
+        "mov (%%edx), %%eax;"
+        "mov 12(%%edx), %%ebx;"
+        "bswap %%eax;"
+        "bswap %%ebx;"
+        "mov %%eax, 12(%%ecx);"
+        "mov %%ebx, (%%ecx);"
+        "mov 4(%%edx), %%eax;"
+        "mov 8(%%edx), %%ebx;"
+        "bswap %%eax;"
+        "bswap %%ebx;"
+        "mov %%eax, 8(%%ecx);"
+        "mov %%ebx, 4(%%ecx);"
+        "pop %%ebx;"
+        :
+        : "c" ( to ), "d" ( from )
+        :  "%eax"
+    );
+}
+
+static __inline__
+uint32_t uint32_rol ( uint32_t val, uint8_t bits )
+{
+    uint32_t rtn;
+    __asm__ __volatile__
+    (
+        "rol %%cl, %%eax;"
+        : "=a" ( rtn )
+        : "a" ( val ), "c" ( bits )
+    );
+    return rtn;
+}
+
+static __inline__
+uint32_t uint32_ror ( uint32_t val, uint8_t bits )
+{
+    uint32_t rtn;
+    __asm__ __volatile__
+    (
+        "ror %%cl, %%eax;"
+        : "=a" ( rtn )
+        : "a" ( val ), "c" ( bits )
+    );
+    return rtn;
+}
+
+static __inline__
+uint64_t uint64_rol ( uint64_t val, uint8_t bits )
+{
+    uint64_t rtn;
+    rtn = ( val << bits ) | ( val >> ( 64 - bits ) );
+    return rtn;
+}
+
+static __inline__
+uint64_t uint64_ror ( uint64_t val, uint8_t bits )
+{
+    uint64_t rtn;
+    rtn = ( val >> bits ) | ( val << ( 64 - bits ) );
+    return rtn;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_arch_impl_ */
diff --git a/interfaces/cc/gcc/i386/atomic.h b/interfaces/cc/gcc/i386/atomic.h
new file mode 100644
index 0000000..d0ea50d
--- /dev/null
+++ b/interfaces/cc/gcc/i386/atomic.h
@@ -0,0 +1,169 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_atomic_
+#define _h_atomic_
+
+#ifndef _h_atomic32_
+#include "atomic32.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int atomic_int;
+typedef struct atomic32_t atomic_t;
+
+typedef struct atomic_ptr_t atomic_ptr_t;
+struct atomic_ptr_t
+{
+    void * volatile ptr;
+};
+
+/* ( * v ) */
+#define atomic_read( v ) \
+    atomic32_read ( v )
+
+/* ( * v ) = i */
+#define atomic_set( v, i ) \
+    atomic32_set ( v, i )
+
+/* prior = ( * v ), ( * v ) += i, prior */
+#define atomic_read_and_add( v, i ) \
+    atomic32_read_and_add ( v, i )
+
+/* ( * v ) += i */
+#define atomic_add( v, i ) \
+    atomic32_add ( v, i )
+
+/* ( * v ) += i */
+#define atomic_add_and_read( v, i ) \
+    atomic32_add_and_read ( v, i )
+
+/* ( void ) ++ ( * v ) */
+#define atomic_inc( v ) \
+    atomic32_inc ( v )
+
+/* ( void ) -- ( * v ) */
+#define atomic_dec( v ) \
+    atomic32_dec ( v )
+
+/* -- ( * v ) == 0 */
+#define atomic_dec_and_test( v ) \
+    atomic32_dec_and_test ( v )
+
+/* ++ ( * v ) == 0
+   when atomic_dec_and_test uses predecrement, you want
+   postincrement to this function. so it isn't very useful */
+#define atomic_inc_and_test( v ) \
+    atomic32_inc_and_test ( v )
+
+/* ( * v ) -- == 0
+   HERE's useful */
+#define atomic_test_and_inc( v ) \
+    atomic32_test_and_inc ( v )
+
+/* prior = ( * v ), ( * v ) = ( prior == t ? s : prior ), prior */
+#define atomic_test_and_set( v, s, t ) \
+    atomic32_test_and_set ( v, s, t )
+
+/* N.B. - THIS FUNCTION IS FOR 32 BIT PTRS ONLY */
+static __inline__
+void *atomic_test_and_set_ptr ( atomic_ptr_t *v, void *s, void *t )
+{
+    void *rtn;
+    __asm__ __volatile__
+    (
+        "lock;"
+        "cmpxchg %%edx,(%%ecx)"
+        : "=a" ( rtn ), "=c" ( v )
+        : "c" ( v ), "d" ( s ), "a" ( t )
+    );
+    return rtn;
+}
+
+/* val = ( * v ), ( ( * v ) = ( val < t ) ? val + i : val ), val */
+#define atomic_read_and_add_lt( v, i, t ) \
+    atomic32_read_and_add_lt ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val <= t ) ? val + i : val ), val */
+#define atomic_read_and_add_le( v, i, t ) \
+    atomic32_read_and_add_le ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val == t ) ? val + i : val ), val */
+#define atomic_read_and_add_eq( v, i, t ) \
+    atomic32_read_and_add_eq ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val != t ) ? val + i : val ), val */
+#define atomic_read_and_add_ne( v, i, t ) \
+    atomic32_read_and_add_ne ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val >= t ) ? val + i : val ), val */
+#define atomic_read_and_add_ge( v, i, t ) \
+    atomic32_read_and_add_ge ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val > t ) ? val + i : val ), val */
+#define atomic_read_and_add_gt( v, i, t ) \
+    atomic32_read_and_add_gt ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( ( val & 1 ) == 1 ) ? val + i : val ), val */
+#define atomic_read_and_add_odd( v, i ) \
+    atomic32_read_and_add_odd ( v, i )
+
+/* val = ( * v ), ( ( * v ) = ( ( val & 1 ) == 0 ) ? val + i : val ), val */
+#define atomic_read_and_add_even( v, i ) \
+    atomic32_read_and_add_even ( v, i )
+
+/* DEPRECATED */
+
+/* val = ( * v ), ( * v ) = ( val < t ? val + i : val ), ( val < t ? 1 : 0 ) */
+#define atomic_add_if_lt( v, i, t ) \
+    atomic32_add_if_lt ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val <= t ? val + i : val ), ( val <= t ? 1 : 0 ) */
+#define atomic_add_if_le( v, i, t ) \
+    atomic32_add_if_le ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val == t ? val + i : val ), ( val == t ? 1 : 0 ) */
+#define atomic_add_if_eq( v, i, t ) \
+    atomic32_add_if_eq ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val >= t ? val + i : val ), ( val >= t ? 1 : 0 ) */
+#define atomic_add_if_ge( v, i, t ) \
+    atomic32_add_if_ge ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val > t ? val + i : val ), ( val > t ? 1 : 0 ) */
+#define atomic_add_if_gt( v, i, t ) \
+    atomic32_add_if_gt ( v, i, t )
+
+#undef LOCK
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_atomic_ */
diff --git a/interfaces/cc/gcc/i386/atomic32.h b/interfaces/cc/gcc/i386/atomic32.h
new file mode 100644
index 0000000..a5e53e8
--- /dev/null
+++ b/interfaces/cc/gcc/i386/atomic32.h
@@ -0,0 +1,366 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_atomic32_
+#define _h_atomic32_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Make sure gcc doesn't try to be clever and move things around
+ * on us. We need to use _exactly_ the address the user gave us,
+ * not some alias that contains the same information.
+ */
+typedef struct atomic32_t atomic32_t;
+struct atomic32_t
+{
+    volatile int counter;
+};
+
+/* int atomic32_read ( const atomic32_t *v ); */
+#define atomic32_read( v ) \
+    ( ( v ) -> counter )
+
+/* void atomic32_set ( atomic32_t *v, int i ); */
+#define atomic32_set( v, i ) \
+    ( ( void ) ( ( ( v ) -> counter ) = ( i ) ) )
+
+/* add to v -> counter and return the prior value */
+static __inline__ int atomic32_read_and_add ( atomic32_t *v, int i )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "mov %3, %1;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+/* if no read is needed, define the least expensive atomic add */
+#define atomic32_add( v, i ) \
+    atomic32_read_and_add ( v, i )
+
+/* add to v -> counter and return the result */
+static __inline__ int atomic32_add_and_read ( atomic32_t *v, int i )
+{
+    int rtn, cmp;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "mov %3, %1;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1,(%2);"
+        "jne 1b;"
+        : "=&a" ( cmp ), "=&r" ( rtn )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+/* just don't try to find out what the result was */
+static __inline__ void atomic32_inc ( atomic32_t *v )
+{
+    __asm__ __volatile__
+    (
+    "lock;"
+        "incl %0"
+        : "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+}
+
+static __inline__ void atomic32_dec ( atomic32_t *v )
+{
+    __asm__ __volatile__
+    (
+    "lock;"
+        "decl %0"
+        : "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+}
+
+/* decrement by one and test result for 0 */
+static __inline__ int atomic32_dec_and_test ( atomic32_t *v )
+{
+    unsigned char c;
+    __asm__ __volatile__
+    (
+    "lock;"
+        "decl %1;"
+        "sete %0"
+        : "=r" ( c ), "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+    return c;
+}
+
+/* when atomic32_dec_and_test uses predecrement, you want
+   postincrement to this function. so it isn't very useful */
+static __inline__ int atomic32_inc_and_test ( atomic32_t *v )
+{
+    unsigned char c;
+    __asm__ __volatile__
+    (
+    "lock;"
+        "incl %1;"
+        "sete %0"
+        : "=r" ( c ), "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+    return c;
+}
+
+/* HERE's useful */
+#define atomic32_test_and_inc( v ) \
+    ( atomic32_read_and_add ( v, 1 ) == 0 )
+
+static __inline__ int atomic32_test_and_set ( atomic32_t *v, int s, int t )
+{
+    int rtn;
+    __asm__ __volatile__
+    (
+    "lock;"
+        "cmpxchg %2, (%1)"
+        : "=a" ( rtn )
+        : "r" ( & v -> counter ), "r" ( s ), "a" ( t )
+    );
+    return rtn;
+}
+
+/* conditional modifications */
+static __inline__
+int atomic32_read_and_add_lt ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jge 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_lt( v, i, t ) \
+    ( atomic32_read_and_add_lt ( v, i, t ) < ( t ) )
+
+static __inline__
+int atomic32_read_and_add_le ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jg 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_le( v, i, t ) \
+    ( atomic32_read_and_add_le ( v, i, t ) <= ( t ) )
+
+static __inline__
+int atomic32_read_and_add_eq ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jne 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_eq( v, i, t ) \
+    ( atomic32_read_and_add_eq ( v, i, t ) == ( t ) )
+
+static __inline__
+int atomic32_read_and_add_ne ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "je 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_ne( v, i, t ) \
+    ( atomic32_read_and_add_ne ( v, i, t ) != ( t ) )
+
+static __inline__
+int atomic32_read_and_add_ge ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jl 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_ge( v, i, t ) \
+    ( atomic32_read_and_add_ge ( v, i, t ) >= ( t ) )
+
+static __inline__
+int atomic32_read_and_add_gt ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jle 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_gt( v, i, t ) \
+    ( atomic32_read_and_add_gt ( v, i, t ) > ( t ) )
+
+static __inline__
+int atomic32_read_and_add_odd ( atomic32_t *v, int i )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "bt $0, %0;"
+        "mov %3, %1;"
+        "jnc 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+static __inline__
+int atomic32_read_and_add_even ( atomic32_t *v, int i )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "bt $0, %0;"
+        "mov %3, %1;"
+        "jc 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_atomic32_ */
diff --git a/interfaces/cc/gcc/i386/bitstr.h b/interfaces/cc/gcc/i386/bitstr.h
new file mode 100644
index 0000000..a2e07ef
--- /dev/null
+++ b/interfaces/cc/gcc/i386/bitstr.h
@@ -0,0 +1,39 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_bitstr_
+#define _h_bitstr_
+
+/* use 32-bit accumulator, 16-bit word size */
+#define WRDSIZE 16
+#define WRDSHIFT 4
+#define WRD uint16_t
+#define ACC uint32_t
+#define BSWAP( x ) bswap_16 ( x )
+
+#include "../noarch/bitstr.h"
+
+#endif /* _h_bitstr_ */
diff --git a/interfaces/cc/gcc/i386/byteswap.h b/interfaces/cc/gcc/i386/byteswap.h
new file mode 100644
index 0000000..3cc5770
--- /dev/null
+++ b/interfaces/cc/gcc/i386/byteswap.h
@@ -0,0 +1,89 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_byteswap_
+#define _h_byteswap_
+
+#ifdef _BYTESWAP_H
+#warning "GNU byteswap.h being used"
+#else
+#define _BYTESWAP_H	1234
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* perform single instruction byte swap */
+static __inline__ uint16_t bswap_16 ( uint16_t i )
+{
+    register uint16_t rtn;
+    __asm__
+    (
+        "rorw $8, %w0"
+        : "=r" ( rtn )
+        : "0" ( i )
+        : "cc"
+    );
+    return rtn;
+}
+
+/* perform single instruction byte swap */
+static __inline__ uint32_t bswap_32 ( uint32_t i )
+{
+    register uint32_t rtn;
+    __asm__
+    (
+        "bswap %0"
+        : "=r" ( rtn )
+        : "0" ( i )
+        : "cc"
+    );
+    return rtn;
+}
+
+/* perform multi-instruction byte swap */
+static __inline__ uint64_t bswap_64 ( uint64_t i )
+{
+    union
+    {
+        uint64_t ll;
+        uint32_t l [ 2 ];
+    } in, rtn;
+    in . ll = i;
+    rtn . l [ 0 ] = bswap_32 ( in . l [ 1 ] );
+    rtn . l [ 1 ] = bswap_32 ( in . l [ 0 ] );
+    return rtn . ll;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _BYTESWAP_H */
+#endif /* _h_byteswap_ */
diff --git a/interfaces/cc/gcc/i386/strtol.h b/interfaces/cc/gcc/i386/strtol.h
new file mode 100644
index 0000000..79f462f
--- /dev/null
+++ b/interfaces/cc/gcc/i386/strtol.h
@@ -0,0 +1,67 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_strtol_
+#define _h_strtol_
+
+#ifndef _h_os_native_
+#include <os-native.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * strtoi32
+ * strtoi32
+ *  based upon actual usage
+ */
+#define strtoi32( str, endp, base ) \
+    strtol ( str, endp, base )
+
+#define strtou32( str, endp, base ) \
+    strtoul ( str, endp, base )
+
+
+/*--------------------------------------------------------------------------
+ * strtoi64
+ * strtoi64
+ *  based upon actual usage
+ */
+#define strtoi64( str, endp, base ) \
+    strtoll ( str, endp, base )
+
+#define strtou64( str, endp, base ) \
+    strtoull ( str, endp, base )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_strtol_ */
diff --git a/interfaces/cc/gcc/noarch/bitstr.h b/interfaces/cc/gcc/noarch/bitstr.h
new file mode 100644
index 0000000..2bb5bd0
--- /dev/null
+++ b/interfaces/cc/gcc/noarch/bitstr.h
@@ -0,0 +1,413 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_noarch_bitstr_
+#define _h_noarch_bitstr_
+
+#ifndef _h_bitstr_
+#error "don't include <noarch/bitstr.h> directly - use <bitstr.h>"
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <byteswap.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* bitcpy
+ *  copy a string of bits from source to dest
+ *
+ *  both source and dest may have non-byte aligned pointers
+ *  the number of bits to copy need not be byte aligned
+ *
+ *  depending upon architecture and OS conventions, the word
+ *  size may be adjusted to 1, 2, or 4 bytes, where the base
+ *  pointers are always word aligned.
+ *
+ *  bits in memory are always treated as big-endian, meaning
+ *  that on multi-byte fetches and stores, we perform byte-swapping
+ *  if there are shifts or masks
+ */
+static __inline__
+void bitcpy ( void *dbase, bitsz_t doff, const void *sbase, bitsz_t soff, bitsz_t sz )
+{
+    /* noop if sz == 0 */
+    if ( sz != 0 )
+    {
+        /* loop counter and destination word count */
+        size_t i, dcountz;
+
+        /* left & right masks and working register */
+        WRD lmask, rmask, reg;
+
+        /* produce word-aligned pointers */
+#if WRDSIZE == 8
+        /* 1-4. all at once */
+        WRD *dst = ( WRD* ) dbase + ( doff >> WRDSHIFT );
+        const WRD *src = ( const WRD* ) sbase + ( soff >> WRDSHIFT );
+#else
+        /* 1. capture word alignment adjustment */
+        size_t dadjust = ( size_t ) dbase & ( WRDSIZE / 8 - 1 );
+        size_t sadjust = ( size_t ) sbase & ( WRDSIZE / 8 - 1 );
+
+        /* 2. create word-aligned pointers */
+        WRD *dst = ( WRD* ) ( ( size_t ) dbase - dadjust );
+        const WRD *src = ( const WRD* ) ( ( size_t ) sbase - sadjust );
+
+        /* 3. incorporate alignment adjustment into offset bits */
+        doff += dadjust << 3;
+        soff += sadjust << 3;
+
+        /* 4. readjust pointers based upon offset */
+        dst += doff >> WRDSHIFT;
+        src += soff >> WRDSHIFT;
+#endif
+        /* 5. restate offsets */
+        doff &= ( WRDSIZE - 1 );
+        soff &= ( WRDSIZE - 1 );
+
+        /* calculate number of words - 1 in dst */
+        dcountz = ( doff + sz + ( WRDSIZE - 1 ) - WRDSIZE ) >> WRDSHIFT;
+
+        /* calculate masks */
+        lmask = rmask = ~ 0;
+        lmask >>= doff;
+        rmask >>= ( doff + sz ) & ( WRDSIZE - 1 );
+        if ( ( WRD ) ( rmask + 1 ) == 0 )
+            rmask = 0;
+
+        /* prime register with masked dst [ 0 ] */
+        reg = BSWAP ( dst [ 0 ] ) & ~ lmask;
+
+        /* if source and destination are aligned */
+        if ( doff == soff )
+        {
+            /* merge src [ 0 ] into reg through mask */
+            reg |= BSWAP ( src [ 0 ] ) & lmask;
+
+#if WRDSIZE > 8
+            /* straight copies don't need byteswap                                                                                                                                                           
+               other than on first and last words                                                                                                                                                            
+               put first word back into little-endian                                                                                                                                                        
+               for remainder of loop */
+            if ( dcountz > 0 )
+            {
+                reg = BSWAP ( reg );
+#endif
+                /* aligned buffers have n:n word ratio */
+                for ( i = 0; i < dcountz; )
+                {
+                    dst [ i ] = reg;
+                    reg = src [ ++ i ];
+                }
+
+#if WRDSIZE > 8
+                /* revert to big-endian */
+                reg = BSWAP ( reg );
+            }
+#endif
+        }
+
+        /* shifting alignment  */
+        else
+        {
+            /* source count may differ from dest count */
+            size_t scountz = ( soff + sz + ( WRDSIZE - 1 ) - WRDSIZE ) >> WRDSHIFT;
+
+            /* use double-word accumulator */
+            ACC acc = BSWAP ( src [ 0 ] );
+
+            /* shift amount */
+            int shift = ( int ) doff - ( int ) soff;
+            if ( shift > 0 )
+            {
+                /* take only valid bits in shifted initial src */
+                reg |= ( WRD ) ( acc >> shift ) & lmask;
+
+                /* because "shift" > 0, we know "dcountz" >= "scountz" */
+                for ( acc <<= WRDSIZE, i = 0; i < scountz; acc <<= WRDSIZE )
+                {
+                    dst [ i ] = BSWAP ( reg );
+                    ++ i;
+                    acc |= BSWAP ( src [ i ] );
+                    reg = ( WRD ) ( acc >> shift );
+                }
+
+                /* if "dcountz" > "scountz" */
+                if ( i < dcountz )
+                {
+                    dst [ i ] = BSWAP ( reg );
+                    reg = ( WRD ) ( acc >> shift );
+                }
+            }
+
+            else
+            {
+                /* need single word read-ahead and right-shift */
+                shift += WRDSIZE;
+
+                /* because "shift" was < 0, we know "dcountz" <= "scountz" */
+                for ( acc <<= WRDSIZE, i = 0; i < dcountz; acc <<= WRDSIZE )
+                {
+                    acc |= BSWAP ( src [ i + 1 ] );
+                    reg |= ( WRD ) ( acc >> shift ) & lmask;
+                    dst [ i ++ ] = BSWAP ( reg );
+                    lmask = ~ 0;
+                    reg = 0;
+                }
+
+                /* if "dcountz" < "scountz" */
+                if ( i < scountz )
+                    acc |= BSWAP ( src [ scountz ] );
+
+                reg |= ( WRD ) ( acc >> shift ) & lmask;
+            }
+        }
+
+        /* mask off unused bytes from src */
+        reg &= ~ rmask;
+
+        /* bring in saved bits from dst */
+        reg |= BSWAP ( dst [ dcountz ] ) & rmask;
+
+        /* write out last word */
+        dst [ dcountz ] = BSWAP ( reg );
+    }
+}
+
+/* bitcmp
+ *  performs bitwise a - b, returning result as int
+ *  result value has no meaning, only sign
+ *  where < 0 means a < b, > 0 means a > b, and 0 means a == b
+ *
+ *  since the comparison produces a tri-state indicator of
+ *  relative magnitude, the order of "a" and "b" is important.
+ *  furthermore, the difference operator must be evaluated
+ *  left to right, because the result indicates more than
+ *  equality.
+ *
+ *  see bitcpy for general word alignment information
+ */
+static __inline__
+int bitcmp ( const void *abase, bitsz_t aoff, const void *bbase, bitsz_t boff, bitsz_t sz )
+{
+    int diff = 0;
+
+    if ( sz != 0 )
+    {
+        /* loop counter and left word count */
+        size_t i, lcountz;
+
+        /* left & right masks and working registers */
+        WRD lmask, rmask, lreg, rreg;
+
+        /* produce word-aligned pointers */
+#if WRDSIZE == 8
+        /* 1-4. all at once */
+        const WRD *left = ( const WRD* ) abase + ( aoff >> WRDSHIFT );
+        const WRD *right = ( const WRD* ) bbase + ( boff >> WRDSHIFT );
+#else
+        /* 1. capture word alignment adjustment */
+        size_t aadjust = ( size_t ) abase & ( WRDSIZE / 8 - 1 );
+        size_t badjust = ( size_t ) bbase & ( WRDSIZE / 8 - 1 );
+
+        /* 2. create word-aligned pointers */
+        const WRD *left = ( const WRD* ) ( ( size_t ) abase - aadjust );
+        const WRD *right = ( const WRD* ) ( ( size_t ) bbase - badjust );
+
+        /* 3. incorporate alignment adjustment into offset bits */
+        aoff += aadjust << 3;
+        boff += badjust << 3;
+
+        /* 4. readjust pointers based upon offset */
+        left += aoff >> WRDSHIFT;
+        right += boff >> WRDSHIFT;
+#endif
+        /* 5. restate offsets */
+        aoff &= ( WRDSIZE - 1 );
+        boff &= ( WRDSIZE - 1 );
+
+        /* calculate number of words - 1 in left
+           since we know a-priori that "sz" > 0, we
+           know that the left and right counts must be
+           at least 1. our loops treat the last word
+           specially, so calculate a loop counter that
+           excludes the last word */
+        lcountz = ( aoff + sz + ( WRDSIZE - 1 ) - WRDSIZE ) >> WRDSHIFT;
+
+        /* calculate masks */
+        lmask = rmask = ~ 0;
+        lmask >>= aoff;
+        rmask >>= ( aoff + sz ) & ( WRDSIZE - 1 );
+        if ( ( WRD ) ( rmask + 1 ) == 0 )
+            rmask = 0;
+
+        /* significant bits from left [ 0 ] */
+        lreg = BSWAP ( left [ 0 ] ) & lmask;
+
+        /* if source and destination are aligned */
+        if ( aoff == boff )
+        {
+            /* test against right bits through mask */
+            rreg = BSWAP ( right [ 0 ] ) & lmask;
+
+            /* produce a difference of all but the last
+               aligned word, where initial word has been
+               left-masked. the last word is tested below. */
+            for ( i = 1; i <= lcountz; ++ i )
+            {
+                diff = ( int ) lreg - ( int ) rreg;
+                if ( diff != 0 )
+                    return diff;
+
+                /* byte-swapping occurs on little-endian architectures */
+                lreg = BSWAP ( left [ i ] );
+                rreg = BSWAP ( right [ i ] );
+            }
+
+            /* fall out to end for masked comparison of last word */
+        }
+
+        /* shifting alignment */
+        else
+        {
+            /* right count may differ from left count
+               since alignments differ, the span of "sz"
+               bits may hit a different number of words in
+               the left array than in the right. */
+            size_t rcountz = ( boff + sz + ( WRDSIZE - 1 ) - WRDSIZE ) >> WRDSHIFT;
+
+            /* use double-word accumulator
+               note that the extra bits get ignored */
+            ACC acc = BSWAP ( right [ 0 ] );
+
+            /* shift amount: positive if "b" needs to be right shifted.
+               NOTE - since the comparison must be successively performed
+               from left to right ( see above ), shifting is ALWAYS toward
+               right, making for special handling when "shift" < 0 ( see below ) */
+            int shift = ( int ) aoff - ( int ) boff;
+            if ( shift > 0 )
+            {
+                /* initial word from right operand, aligned with left */
+                rreg = ( WRD ) ( acc >> shift ) & lmask;
+
+                /* "shift" > 0 means "lcountz" >= "rcountz" */
+                for ( acc <<= WRDSIZE, i = 1; i <= rcountz; acc <<= WRDSIZE, ++ i )
+                {
+                    /* compare words at i-1 */
+                    diff = ( int ) lreg - ( int ) rreg;
+                    if ( diff != 0 )
+                        return diff;
+
+                    /* accumulate next word from right operand */
+                    acc |= BSWAP ( right [ i ] );
+
+                    /* bring in next word from left operand */
+                    lreg = BSWAP ( left [ i ] );
+
+                    /* produce aligned word from right operand */
+                    rreg = ( WRD ) ( acc >> shift );
+                }
+
+                /* if there is one more word in left */
+                if ( lcountz > rcountz )
+                {
+                    /* compare penultimate */
+                    diff = ( int ) lreg - ( int ) rreg;
+                    if ( diff != 0 )
+                        return diff;
+
+                    /* get last word in left */
+                    lreg = BSWAP ( left [ lcountz ] );
+
+                    /* last word from right is already in "acc" */
+                    rreg = ( WRD ) ( acc >> shift );
+                }
+
+                /* fall out to end for masked comparison of last word */
+            }
+
+            else
+            {
+                /* since all shifts must be toward right ( due to left to right
+                   comparison ), this alignment will require a pre-fetch from
+                   right operand into accumulator, and adjusting the negative
+                   shift amount to a positive right-shift. */
+                shift += WRDSIZE;
+
+                /* since "shift" was negative, we know "lcountz" <= "rcountz",
+                   so use "lcountz" as loop limit. pre-shift "acc" as loop init */
+                for ( acc <<= WRDSIZE, i = 1; i <= lcountz; acc <<= WRDSIZE, ++ i )
+                {
+                    /* accumulate next word from right operand */
+                    acc |= BSWAP ( right [ i ] );
+
+                    /* produce aligned word from right operand */
+                    rreg = ( WRD ) ( acc >> shift ) & lmask;
+
+                    /* now test against left */
+                    diff = ( int ) lreg - ( int ) rreg;
+                    if ( diff != 0 )
+                        return diff;
+
+                    /* bring in next word from left operand */
+                    lreg = BSWAP ( left [ i ] );
+
+                    /* no more left mask */
+                    lmask = ~ 0;
+                }
+
+                /* if there is one more word in right */
+                if ( lcountz < rcountz )
+                    acc |= BSWAP ( right [ rcountz ] );
+
+                /* produce "rreg" from "acc" */
+                rreg = ( WRD ) ( acc >> shift ) & lmask;
+
+                /* fall out to end for masked comparison of last word */
+            }
+        }
+
+        /* mask off unused bytes from right */
+        lreg &= ~ rmask;
+        rreg &= ~ rmask;
+
+        /* perform final comparison */
+        diff = ( int ) lreg - ( int ) rreg;
+    }
+
+    return diff;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_noarch_bitstr_ */
diff --git a/interfaces/cc/gcc/ppc32/arch-impl.h b/interfaces/cc/gcc/ppc32/arch-impl.h
new file mode 100644
index 0000000..8255e6b
--- /dev/null
+++ b/interfaces/cc/gcc/ppc32/arch-impl.h
@@ -0,0 +1,209 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_arch_impl_
+#define _h_arch_impl_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static __inline__
+int uint8_lsbit ( uint8_t self )
+{
+    int i;
+    for ( i = 0; ; ++ i )
+    {
+        if ( ( self & ( 1 << i ) ) != 0 )
+            return i;
+    }
+    return -1;
+}
+
+static __inline__
+int16_t uint16_lsbit ( uint16_t self )
+{
+    if ( self == 0 )
+        return -1;
+    if ( ( uint8_t ) self != 0 )
+        return uint8_lsbit ( ( uint8_t ) self );
+    return uint8_lsbit ( ( uint8_t ) ( self >> 8 ) ) + 8;
+}
+
+static __inline__
+int32_t uint32_lsbit ( uint32_t self )
+{
+    if ( self == 0 )
+        return -1;
+    if ( ( uint16_t ) self != 0 )
+        return uint16_lsbit ( ( uint16_t ) self );
+    return uint16_lsbit ( ( uint16_t ) ( self >> 16 ) ) + 16;
+}
+
+typedef struct int128_t int128_t;
+struct int128_t
+{
+    uint64_t lo;
+    int64_t hi;
+};
+
+static __inline__
+int64_t int128_hi ( const int128_t *self )
+{
+    return self -> hi;
+}
+
+static __inline__
+uint64_t int128_lo ( const int128_t *self )
+{
+    return self -> lo;
+}
+
+static __inline__
+void int128_sethi ( int128_t *self, int64_t i )
+{
+    self -> hi = i;
+}
+
+static __inline__
+void int128_setlo ( int128_t *self, uint64_t i )
+{
+    self -> lo = i;
+}
+
+typedef struct uint128_t uint128_t;
+struct uint128_t
+{
+    uint64_t lo;
+    uint64_t hi;
+};
+
+static __inline__
+uint64_t uint128_hi ( const uint128_t *self )
+{
+    return self -> hi;
+}
+
+static __inline__
+uint64_t uint128_lo ( const uint128_t *self )
+{
+    return self -> lo;
+}
+
+static __inline__
+void uint128_sethi ( uint128_t *self, uint64_t i )
+{
+    self -> hi = i;
+}
+
+static __inline__
+void uint128_setlo ( uint128_t *self, uint64_t i )
+{
+    self -> lo = i;
+}
+
+static __inline__
+void int128_add ( int128_t *self, const int128_t *i )
+{
+    uint64_t lo = ( uint32_t ) self -> lo + ( uint32_t ) i -> lo;
+    uint64_t hi = ( self -> lo >> 32 ) + ( i -> lo >> 32 ) + lo >> 32;
+    self -> hi += i -> hi + ( uint32_t ) ( hi >> 32 );
+    self -> lo = ( hi << 32 ) | ( uint32_t ) lo;
+}
+
+static __inline__
+void int128_sub ( int128_t *self, const int128_t *i )
+{
+    int64_t lo = ( uint32_t ) self -> lo - ( uint32_t ) i -> lo;
+    int64_t hi = ( uint32_t ) ( self -> lo >> 32 ) - ( uint32_t ) ( i -> lo >> 32 ) + lo >> 32;
+    self -> hi -= i -> hi + ( hi >> 32 );
+    self -> lo = ( hi << 32 ) | ( uint32_t ) lo;
+}
+
+static __inline__
+void int128_sar ( int128_t *self, uint32_t i )
+{
+}
+
+static __inline__
+void int128_shl ( int128_t *self, uint32_t i )
+{
+}
+
+static __inline__
+void uint128_and ( uint128_t *self, const uint128_t *i )
+{
+}
+
+static __inline__
+void uint128_or ( uint128_t *self, const uint128_t *i )
+{
+}
+
+static __inline__
+void uint128_orlo ( uint128_t *self, uint64_t i )
+{
+    self -> lo |= i;
+}
+
+static __inline__
+void uint128_xor ( uint128_t *self, const uint128_t *i )
+{
+}
+
+static __inline__
+void uint128_not ( uint128_t *self )
+{
+}
+
+static __inline__
+void uint128_shr ( uint128_t *self, uint32_t i )
+{
+}
+
+static __inline__
+void uint128_shl ( uint128_t *self, uint32_t i )
+{
+}
+
+static __inline__
+void uint128_bswap ( uint128_t *self )
+{
+}
+
+static __inline__
+void uint128_bswap_copy ( uint128_t *to, const uint128_t *from )
+{
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_arch_impl_ */
diff --git a/interfaces/cc/gcc/ppc32/atomic.h b/interfaces/cc/gcc/ppc32/atomic.h
new file mode 100644
index 0000000..d07f8c0
--- /dev/null
+++ b/interfaces/cc/gcc/ppc32/atomic.h
@@ -0,0 +1,157 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_atomic_
+#define _h_atomic_
+
+#ifndef _h_atomic32_
+#include "atomic32.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int atomic_int;
+typedef atomic32_t atomic_t;
+
+/* ( * v ) */
+#define atomic_read( v ) \
+    atomic32_read ( v )
+
+/* ( * v ) = i */
+#define atomic_set( v, i ) \
+    atomic32_set ( v, i )
+
+/* prior = ( * v ), ( * v ) += i, prior */
+#define atomic_read_and_add( v, i ) \
+    atomic32_read_and_add ( v, i )
+
+/* ( * v ) += i */
+#define atomic_add( v, i ) \
+    atomic32_add ( v, i )
+
+/* ( * v ) += i */
+#define atomic_add_and_read( v, i ) \
+    atomic32_add_and_read ( v, i )
+
+/* ( void ) ++ ( * v ) */
+#define atomic_inc( v ) \
+    atomic32_inc ( v )
+
+/* ( void ) -- ( * v ) */
+#define atomic_dec( v ) \
+    atomic32_dec ( v )
+
+/* -- ( * v ) == 0 */
+#define atomic_dec_and_test( v ) \
+    atomic32_dec_and_test ( v )
+
+/* ++ ( * v ) == 0
+   when atomic_dec_and_test uses predecrement, you want
+   postincrement to this function. so it isn't very useful */
+#define atomic_inc_and_test( v ) \
+    atomic32_inc_and_test ( v )
+
+/* ( * v ) -- == 0
+   HERE's useful */
+#define atomic_test_and_inc( v ) \
+    atomic32_test_and_inc ( v )
+
+/* prior = ( * v ), ( * v ) = ( prior == t ? s : prior ), prior */
+#define atomic_test_and_set( v, s, t ) \
+    atomic32_test_and_set ( v, s, t )
+
+/* N.B. - THIS FUNCTION IS FOR 32 BIT PTRS ONLY */
+static __inline__ void *atomic_test_and_set_ptr ( void *volatile *v, void *s, void *t )
+{
+    void *rtn = * v;
+    if ( rtn == t )
+        * v = s;
+    return rtn;
+}
+
+/* val = ( * v ), ( ( * v ) = ( val < t ) ? val + i : val ), val */
+#define atomic_read_and_add_lt( v, i, t ) \
+    atomic32_read_and_add_lt ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val <= t ) ? val + i : val ), val */
+#define atomic_read_and_add_le( v, i, t ) \
+    atomic32_read_and_add_le ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val == t ) ? val + i : val ), val */
+#define atomic_read_and_add_eq( v, i, t ) \
+    atomic32_read_and_add_eq ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val != t ) ? val + i : val ), val */
+#define atomic_read_and_add_ne( v, i, t ) \
+    atomic32_read_and_add_ne ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val >= t ) ? val + i : val ), val */
+#define atomic_read_and_add_ge( v, i, t ) \
+    atomic32_read_and_add_ge ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val > t ) ? val + i : val ), val */
+#define atomic_read_and_add_gt( v, i, t ) \
+    atomic32_read_and_add_gt ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( ( val & 1 ) == 1 ) ? val + i : val ), val */
+#define atomic_read_and_add_odd( v, i ) \
+    atomic32_read_and_add_odd ( v, i )
+
+/* val = ( * v ), ( ( * v ) = ( ( val & 1 ) == 0 ) ? val + i : val ), val */
+#define atomic_read_and_add_even( v, i ) \
+    atomic32_read_and_add_even ( v, i )
+
+/* DEPRECATED */
+
+/* val = ( * v ), ( * v ) = ( val < t ? val + i : val ), ( val < t ? 1 : 0 ) */
+#define atomic_add_if_lt( v, i, t ) \
+    atomic32_add_if_lt ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val <= t ? val + i : val ), ( val <= t ? 1 : 0 ) */
+#define atomic_add_if_le( v, i, t ) \
+    atomic32_add_if_le ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val == t ? val + i : val ), ( val == t ? 1 : 0 ) */
+#define atomic_add_if_eq( v, i, t ) \
+    atomic32_add_if_eq ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val >= t ? val + i : val ), ( val >= t ? 1 : 0 ) */
+#define atomic_add_if_ge( v, i, t ) \
+    atomic32_add_if_ge ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val > t ? val + i : val ), ( val > t ? 1 : 0 ) */
+#define atomic_add_if_gt( v, i, t ) \
+    atomic32_add_if_gt ( v, i, t )
+
+#undef LOCK
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_atomic_ */
diff --git a/interfaces/cc/gcc/ppc32/atomic32.h b/interfaces/cc/gcc/ppc32/atomic32.h
new file mode 100644
index 0000000..3f46e6b
--- /dev/null
+++ b/interfaces/cc/gcc/ppc32/atomic32.h
@@ -0,0 +1,197 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_atomic32_
+#define _h_atomic32_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int atomic32_t;
+
+/* int atomic32_read ( const atomic32_t *v ); */
+#define atomic32_read( v ) \
+    ( * ( v ) )
+
+/* void atomic32_set ( atomic32_t *v, int i ); */
+#define atomic32_set( v, i ) \
+    ( ( void ) ( * ( v ) = ( i ) ) )
+
+/* add to v -> counter and return the prior value */
+static __inline__ int atomic32_read_and_add ( atomic32_t *v, int i )
+{
+    int rtn = * v;
+    * v += i;
+    return rtn;
+}
+
+/* if no read is needed, define the least expensive atomic add */
+#define atomic32_add( v, i ) \
+    atomic32_read_and_add ( v, i )
+
+/* add to v -> counter and return the result */
+static __inline__ int atomic32_add_and_read ( atomic32_t *v, int i )
+{
+    int rtn = * v += i;
+    return rtn;
+}
+
+/* just don't try to find out what the result was */
+static __inline__ void atomic32_inc ( atomic32_t *v )
+{
+    ++ v [ 0 ];
+}
+
+static __inline__ void atomic32_dec ( atomic32_t *v )
+{
+    -- v [ 0 ];
+}
+
+/* decrement by one and test result for 0 */
+static __inline__ int atomic32_dec_and_test ( atomic32_t *v )
+{
+    int rtn = -- v [ 0 ] == 0;
+    return rtn;
+}
+
+/* when atomic32_dec_and_test uses predecrement, you want
+   postincrement to this function. so it isn't very useful */
+static __inline__ int atomic32_inc_and_test ( atomic32_t *v )
+{
+    int rtn = ++ v [ 0 ] == 0;
+    return rtn;
+}
+
+/* HERE's useful */
+#define atomic32_test_and_inc( v ) \
+    ( atomic32_read_and_add ( v, 1 ) == 0 )
+
+static __inline__ int atomic32_test_and_set ( atomic32_t *v, int s, int t )
+{
+    int rtn = * v;
+    if ( rtn == t )
+        * v = s;
+    return rtn;
+}
+
+/* conditional modifications */
+static __inline__
+int atomic32_read_and_add_lt ( atomic32_t *v, int i, int t )
+{
+    int rtn = * v;
+    if ( rtn < t )
+        * v = rtn + i;
+    return rtn;
+}
+
+#define atomic32_add_if_lt( v, i, t ) \
+    ( atomic32_read_and_add_lt ( v, i, t ) < ( t ) )
+
+static __inline__
+int atomic32_read_and_add_le ( atomic32_t *v, int i, int t )
+{
+    int rtn = * v;
+    if ( rtn <= t )
+        * v = rtn + i;
+    return rtn;
+}
+
+#define atomic32_add_if_le( v, i, t ) \
+    ( atomic32_read_and_add_le ( v, i, t ) <= ( t ) )
+
+static __inline__
+int atomic32_read_and_add_eq ( atomic32_t *v, int i, int t )
+{
+    int rtn = * v;
+    if ( rtn == t )
+        * v = rtn + i;
+    return rtn;
+}
+
+#define atomic32_add_if_eq( v, i, t ) \
+    ( atomic32_read_and_add_eq ( v, i, t ) == ( t ) )
+
+static __inline__
+int atomic32_read_and_add_ne ( atomic32_t *v, int i, int t )
+{
+    int rtn = * v;
+    if ( rtn != t )
+        * v = rtn + i;
+    return rtn;
+}
+
+#define atomic32_add_if_ne( v, i, t ) \
+    ( atomic32_read_and_add_ne ( v, i, t ) != ( t ) )
+
+static __inline__
+int atomic32_read_and_add_ge ( atomic32_t *v, int i, int t )
+{
+    int rtn = * v;
+    if ( rtn >= t )
+        * v = rtn + i;
+    return rtn;
+}
+
+#define atomic32_add_if_ge( v, i, t ) \
+    ( atomic32_read_and_add_ge ( v, i, t ) >= ( t ) )
+
+static __inline__
+int atomic32_read_and_add_gt ( atomic32_t *v, int i, int t )
+{
+    int rtn = * v;
+    if ( rtn > t )
+        * v = rtn + i;
+    return rtn;
+}
+
+#define atomic32_add_if_gt( v, i, t ) \
+    ( atomic32_read_and_add_gt ( v, i, t ) > ( t ) )
+
+static __inline__
+int atomic32_read_and_add_odd ( atomic32_t *v, int i )
+{
+    int rtn = * v;
+    if ( ( rtn & 1 ) != 0 )
+        * v = rtn + i;
+    return rtn;
+}
+
+static __inline__
+int atomic32_read_and_add_even ( atomic32_t *v, int i )
+{
+    int rtn = * v;
+    if ( ( rtn & 1 ) == 0 )
+        * v = rtn + i;
+    return rtn;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_atomic32_ */
diff --git a/interfaces/cc/gcc/ppc32/bitstr.h b/interfaces/cc/gcc/ppc32/bitstr.h
new file mode 100644
index 0000000..cf5927b
--- /dev/null
+++ b/interfaces/cc/gcc/ppc32/bitstr.h
@@ -0,0 +1,40 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_bitstr_
+#define _h_bitstr_
+
+/* use 32-bit accumulator, 16-bit word size;
+ * no swapping, since already big-endian */
+#define WRDSIZE 16
+#define WRDSHIFT 4
+#define WRD uint16_t
+#define ACC uint32_t
+#define BSWAP( x ) ( x )
+
+#include "../noarch/bitstr.h"
+
+#endif /* _h_bitstr_ */
diff --git a/interfaces/cc/gcc/ppc32/strtol.h b/interfaces/cc/gcc/ppc32/strtol.h
new file mode 100644
index 0000000..79f462f
--- /dev/null
+++ b/interfaces/cc/gcc/ppc32/strtol.h
@@ -0,0 +1,67 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_strtol_
+#define _h_strtol_
+
+#ifndef _h_os_native_
+#include <os-native.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * strtoi32
+ * strtoi32
+ *  based upon actual usage
+ */
+#define strtoi32( str, endp, base ) \
+    strtol ( str, endp, base )
+
+#define strtou32( str, endp, base ) \
+    strtoul ( str, endp, base )
+
+
+/*--------------------------------------------------------------------------
+ * strtoi64
+ * strtoi64
+ *  based upon actual usage
+ */
+#define strtoi64( str, endp, base ) \
+    strtoll ( str, endp, base )
+
+#define strtou64( str, endp, base ) \
+    strtoull ( str, endp, base )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_strtol_ */
diff --git a/interfaces/cc/gcc/v128.h b/interfaces/cc/gcc/v128.h
new file mode 100644
index 0000000..d1ba71d
--- /dev/null
+++ b/interfaces/cc/gcc/v128.h
@@ -0,0 +1,1093 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_v128_
+#define _h_v128_
+
+#include <stdint.h>
+#include <x86intrin.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int8_t   v128_i8_t  __attribute__ ((vector_size (16),__may_alias__));
+typedef uint8_t  v128_u8_t  __attribute__ ((vector_size (16),__may_alias__));
+typedef int16_t  v128_i16_t __attribute__ ((vector_size (16),__may_alias__));
+typedef int32_t  v128_i32_t __attribute__ ((vector_size (16),__may_alias__));
+typedef int64_t  v128_i64_t __attribute__ ((vector_size (16),__may_alias__));
+typedef uint16_t v128_u16_t __attribute__ ((vector_size (16),__may_alias__));
+typedef uint32_t v128_u32_t __attribute__ ((vector_size (16),__may_alias__));
+typedef uint64_t v128_u64_t __attribute__ ((vector_size (16),__may_alias__));
+typedef float    v128_f_t   __attribute__ ((vector_size (16),__may_alias__));
+typedef double   v128_d_t   __attribute__ ((vector_size (16),__may_alias__));
+
+/* NOTE:
+ * these types are to hide perceived flaws in the Intel/GCC code
+ * don't use them outside of this file.  uint8_t, int8_t and int64_t all
+ * fail to compile so the above types can't be used within this file in some 
+ * places.
+ */
+typedef char          v128_c_t   __attribute__ ((vector_size (16),__may_alias__));
+typedef long long int v128_lli_t __attribute__ ((vector_size (16),__may_alias__));
+
+
+#if USE_VEC_REG
+
+/* SSE
+  movss
+  movaps
+  movups
+  movlps
+  movhps
+  movlhps
+  movhlps
+*/
+
+#ifdef __MMX__
+/* MMX
+   v8qi __builtin_ia32_paddb (v8qi, v8qi)
+   v4hi __builtin_ia32_paddw (v4hi, v4hi)
+   v2si __builtin_ia32_paddd (v2si, v2si)
+   v8qi __builtin_ia32_psubb (v8qi, v8qi)
+   v4hi __builtin_ia32_psubw (v4hi, v4hi)
+   v2si __builtin_ia32_psubd (v2si, v2si)
+   v8qi __builtin_ia32_paddsb (v8qi, v8qi)
+   v4hi __builtin_ia32_paddsw (v4hi, v4hi)
+   v8qi __builtin_ia32_psubsb (v8qi, v8qi)
+   v4hi __builtin_ia32_psubsw (v4hi, v4hi)
+   v8qi __builtin_ia32_paddusb (v8qi, v8qi)
+   v4hi __builtin_ia32_paddusw (v4hi, v4hi)
+   v8qi __builtin_ia32_psubusb (v8qi, v8qi)
+   v4hi __builtin_ia32_psubusw (v4hi, v4hi)
+   v4hi __builtin_ia32_pmullw (v4hi, v4hi)
+   v4hi __builtin_ia32_pmulhw (v4hi, v4hi)
+   di __builtin_ia32_pand (di, di)
+   di __builtin_ia32_pandn (di,di)
+   di __builtin_ia32_por (di, di)
+   di __builtin_ia32_pxor (di, di)
+   v8qi __builtin_ia32_pcmpeqb (v8qi, v8qi)
+   v4hi __builtin_ia32_pcmpeqw (v4hi, v4hi)
+   v2si __builtin_ia32_pcmpeqd (v2si, v2si)
+   v8qi __builtin_ia32_pcmpgtb (v8qi, v8qi)
+   v4hi __builtin_ia32_pcmpgtw (v4hi, v4hi)
+   v2si __builtin_ia32_pcmpgtd (v2si, v2si)
+   v8qi __builtin_ia32_punpckhbw (v8qi, v8qi)
+   v4hi __builtin_ia32_punpckhwd (v4hi, v4hi)
+   v2si __builtin_ia32_punpckhdq (v2si, v2si)
+   v8qi __builtin_ia32_punpcklbw (v8qi, v8qi)
+   v4hi __builtin_ia32_punpcklwd (v4hi, v4hi)
+   v2si __builtin_ia32_punpckldq (v2si, v2si)
+   v8qi __builtin_ia32_packsswb (v4hi, v4hi)
+   v4hi __builtin_ia32_packssdw (v2si, v2si)
+   v8qi __builtin_ia32_packuswb (v4hi, v4hi)
+     
+   v4hi __builtin_ia32_psllw (v4hi, v4hi)
+   v2si __builtin_ia32_pslld (v2si, v2si)
+   v1di __builtin_ia32_psllq (v1di, v1di)
+   v4hi __builtin_ia32_psrlw (v4hi, v4hi)
+   v2si __builtin_ia32_psrld (v2si, v2si)
+   v1di __builtin_ia32_psrlq (v1di, v1di)
+   v4hi __builtin_ia32_psraw (v4hi, v4hi)
+   v2si __builtin_ia32_psrad (v2si, v2si)
+   v4hi __builtin_ia32_psllwi (v4hi, int)
+   v2si __builtin_ia32_pslldi (v2si, int)
+   v1di __builtin_ia32_psllqi (v1di, int)
+   v4hi __builtin_ia32_psrlwi (v4hi, int)
+   v2si __builtin_ia32_psrldi (v2si, int)
+   v1di __builtin_ia32_psrlqi (v1di, int)
+   v4hi __builtin_ia32_psrawi (v4hi, int)
+   v2si __builtin_ia32_psradi (v2si, int)
+*/
+#endif
+
+#ifdef __SSE__
+/* SSE
+   v4hi __builtin_ia32_pmulhuw (v4hi, v4hi)
+   v8qi __builtin_ia32_pavgb (v8qi, v8qi)
+   v4hi __builtin_ia32_pavgw (v4hi, v4hi)
+   v1di __builtin_ia32_psadbw (v8qi, v8qi)
+   v8qi __builtin_ia32_pmaxub (v8qi, v8qi)
+   v4hi __builtin_ia32_pmaxsw (v4hi, v4hi)
+   v8qi __builtin_ia32_pminub (v8qi, v8qi)
+   v4hi __builtin_ia32_pminsw (v4hi, v4hi)
+   int __builtin_ia32_pextrw (v4hi, int)
+   v4hi __builtin_ia32_pinsrw (v4hi, int, int)
+   int __builtin_ia32_pmovmskb (v8qi)
+   void __builtin_ia32_maskmovq (v8qi, v8qi, char *)
+   void __builtin_ia32_movntq (di *, di)
+   void __builtin_ia32_sfence (void)
+
+   int __builtin_ia32_comieq (v4sf, v4sf)
+   int __builtin_ia32_comineq (v4sf, v4sf)
+   int __builtin_ia32_comilt (v4sf, v4sf)
+   int __builtin_ia32_comile (v4sf, v4sf)
+   int __builtin_ia32_comigt (v4sf, v4sf)
+   int __builtin_ia32_comige (v4sf, v4sf)
+   int __builtin_ia32_ucomieq (v4sf, v4sf)
+   int __builtin_ia32_ucomineq (v4sf, v4sf)
+   int __builtin_ia32_ucomilt (v4sf, v4sf)
+   int __builtin_ia32_ucomile (v4sf, v4sf)
+   int __builtin_ia32_ucomigt (v4sf, v4sf)
+   int __builtin_ia32_ucomige (v4sf, v4sf)
+   v4sf __builtin_ia32_addps (v4sf, v4sf)
+   v4sf __builtin_ia32_subps (v4sf, v4sf)
+   v4sf __builtin_ia32_mulps (v4sf, v4sf)
+   v4sf __builtin_ia32_divps (v4sf, v4sf)
+   v4sf __builtin_ia32_addss (v4sf, v4sf)
+   v4sf __builtin_ia32_subss (v4sf, v4sf)
+   v4sf __builtin_ia32_mulss (v4sf, v4sf)
+   v4sf __builtin_ia32_divss (v4sf, v4sf)
+   v4si __builtin_ia32_cmpeqps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpltps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpleps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpgtps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpgeps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpunordps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpneqps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpnltps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpnleps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpngtps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpngeps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpordps (v4sf, v4sf)
+   v4si __builtin_ia32_cmpeqss (v4sf, v4sf)
+   v4si __builtin_ia32_cmpltss (v4sf, v4sf)
+   v4si __builtin_ia32_cmpless (v4sf, v4sf)
+   v4si __builtin_ia32_cmpunordss (v4sf, v4sf)
+   v4si __builtin_ia32_cmpneqss (v4sf, v4sf)
+   v4si __builtin_ia32_cmpnlts (v4sf, v4sf)
+   v4si __builtin_ia32_cmpnless (v4sf, v4sf)
+   v4si __builtin_ia32_cmpordss (v4sf, v4sf)
+   v4sf __builtin_ia32_maxps (v4sf, v4sf)
+   v4sf __builtin_ia32_maxss (v4sf, v4sf)
+   v4sf __builtin_ia32_minps (v4sf, v4sf)
+   v4sf __builtin_ia32_minss (v4sf, v4sf)
+   v4sf __builtin_ia32_andps (v4sf, v4sf)
+   v4sf __builtin_ia32_andnps (v4sf, v4sf)
+   v4sf __builtin_ia32_orps (v4sf, v4sf)
+   v4sf __builtin_ia32_xorps (v4sf, v4sf)
+   v4sf __builtin_ia32_movss (v4sf, v4sf)
+   v4sf __builtin_ia32_movhlps (v4sf, v4sf)
+   v4sf __builtin_ia32_movlhps (v4sf, v4sf)
+   v4sf __builtin_ia32_unpckhps (v4sf, v4sf)
+   v4sf __builtin_ia32_unpcklps (v4sf, v4sf)
+   v4sf __builtin_ia32_cvtpi2ps (v4sf, v2si)
+   v4sf __builtin_ia32_cvtsi2ss (v4sf, int)
+   v2si __builtin_ia32_cvtps2pi (v4sf)
+   int __builtin_ia32_cvtss2si (v4sf)
+   v2si __builtin_ia32_cvttps2pi (v4sf)
+   int __builtin_ia32_cvttss2si (v4sf)
+   v4sf __builtin_ia32_rcpps (v4sf)
+   v4sf __builtin_ia32_rsqrtps (v4sf)
+   v4sf __builtin_ia32_sqrtps (v4sf)
+   v4sf __builtin_ia32_rcpss (v4sf)
+   v4sf __builtin_ia32_rsqrtss (v4sf)
+   v4sf __builtin_ia32_sqrtss (v4sf)
+   v4sf __builtin_ia32_shufps (v4sf, v4sf, int)
+*/
+static __inline
+v128_u8_t op_SHUFPS ( v128_u8_t vin1, v128_u8_t vin2, const int mask )
+    __attribute__ ((always_inline));
+
+static __inline
+v128_u8_t op_SHUFPS (v128_u8_t vin1, v128_u8_t vin2, const int mask)
+{
+    return ( v128_u8_t ) __builtin_ia32_shufps ((v128_f_t)vin1, (v128_f_t)vin2, mask);
+}
+
+ /*
+   void __builtin_ia32_movntps (float *, v4sf)
+   int __builtin_ia32_movmskps (v4sf)
+
+v4sf __builtin_ia32_loadaps (float *)
+Generates the movaps machine instruction as a load from memory. 
+void __builtin_ia32_storeaps (float *, v4sf)
+Generates the movaps machine instruction as a store to memory. 
+v4sf __builtin_ia32_loadups (float *)
+Generates the movups machine instruction as a load from memory. 
+void __builtin_ia32_storeups (float *, v4sf)
+Generates the movups machine instruction as a store to memory. 
+v4sf __builtin_ia32_loadsss (float *)
+Generates the movss machine instruction as a load from memory. 
+void __builtin_ia32_storess (float *, v4sf)
+Generates the movss machine instruction as a store to memory. 
+v4sf __builtin_ia32_loadhps (v4sf, const v2sf *)
+Generates the movhps machine instruction as a load from memory. 
+v4sf __builtin_ia32_loadlps (v4sf, const v2sf *)
+Generates the movlps machine instruction as a load from memory 
+void __builtin_ia32_storehps (v2sf *, v4sf)
+Generates the movhps machine instruction as a store to memory. 
+void __builtin_ia32_storelps (v2sf *, v4sf)
+Generates the movlps machine instruction as a store to memory.
+*/
+#endif
+
+#ifdef __SSE2__
+/* sse2
+     int __builtin_ia32_comisdeq (v2df, v2df)
+     int __builtin_ia32_comisdlt (v2df, v2df)
+     int __builtin_ia32_comisdle (v2df, v2df)
+     int __builtin_ia32_comisdgt (v2df, v2df)
+     int __builtin_ia32_comisdge (v2df, v2df)
+     int __builtin_ia32_comisdneq (v2df, v2df)
+     int __builtin_ia32_ucomisdeq (v2df, v2df)
+     int __builtin_ia32_ucomisdlt (v2df, v2df)
+     int __builtin_ia32_ucomisdle (v2df, v2df)
+     int __builtin_ia32_ucomisdgt (v2df, v2df)
+     int __builtin_ia32_ucomisdge (v2df, v2df)
+     int __builtin_ia32_ucomisdneq (v2df, v2df)
+     v2df __builtin_ia32_cmpeqpd (v2df, v2df)
+     v2df __builtin_ia32_cmpltpd (v2df, v2df)
+     v2df __builtin_ia32_cmplepd (v2df, v2df)
+     v2df __builtin_ia32_cmpgtpd (v2df, v2df)
+     v2df __builtin_ia32_cmpgepd (v2df, v2df)
+     v2df __builtin_ia32_cmpunordpd (v2df, v2df)
+     v2df __builtin_ia32_cmpneqpd (v2df, v2df)
+     v2df __builtin_ia32_cmpnltpd (v2df, v2df)
+     v2df __builtin_ia32_cmpnlepd (v2df, v2df)
+     v2df __builtin_ia32_cmpngtpd (v2df, v2df)
+     v2df __builtin_ia32_cmpngepd (v2df, v2df)
+     v2df __builtin_ia32_cmpordpd (v2df, v2df)
+     v2df __builtin_ia32_cmpeqsd (v2df, v2df)
+     v2df __builtin_ia32_cmpltsd (v2df, v2df)
+     v2df __builtin_ia32_cmplesd (v2df, v2df)
+     v2df __builtin_ia32_cmpunordsd (v2df, v2df)
+     v2df __builtin_ia32_cmpneqsd (v2df, v2df)
+     v2df __builtin_ia32_cmpnltsd (v2df, v2df)
+     v2df __builtin_ia32_cmpnlesd (v2df, v2df)
+     v2df __builtin_ia32_cmpordsd (v2df, v2df)
+     v2di __builtin_ia32_paddq (v2di, v2di)
+     v2di __builtin_ia32_psubq (v2di, v2di)
+     v2df __builtin_ia32_addpd (v2df, v2df)
+     v2df __builtin_ia32_subpd (v2df, v2df)
+     v2df __builtin_ia32_mulpd (v2df, v2df)
+     v2df __builtin_ia32_divpd (v2df, v2df)
+     v2df __builtin_ia32_addsd (v2df, v2df)
+     v2df __builtin_ia32_subsd (v2df, v2df)
+     v2df __builtin_ia32_mulsd (v2df, v2df)
+     v2df __builtin_ia32_divsd (v2df, v2df)
+     v2df __builtin_ia32_minpd (v2df, v2df)
+     v2df __builtin_ia32_maxpd (v2df, v2df)
+     v2df __builtin_ia32_minsd (v2df, v2df)
+     v2df __builtin_ia32_maxsd (v2df, v2df)
+     v2df __builtin_ia32_andpd (v2df, v2df)
+     v2df __builtin_ia32_andnpd (v2df, v2df)
+     v2df __builtin_ia32_orpd (v2df, v2df)
+     v2df __builtin_ia32_xorpd (v2df, v2df)
+     v2df __builtin_ia32_movsd (v2df, v2df)
+     v2df __builtin_ia32_unpckhpd (v2df, v2df)
+     v2df __builtin_ia32_unpcklpd (v2df, v2df)
+     v16qi __builtin_ia32_paddb128 (v16qi, v16qi)
+     v8hi __builtin_ia32_paddw128 (v8hi, v8hi)
+     v4si __builtin_ia32_paddd128 (v4si, v4si)
+     v2di __builtin_ia32_paddq128 (v2di, v2di)
+     v16qi __builtin_ia32_psubb128 (v16qi, v16qi)
+     v8hi __builtin_ia32_psubw128 (v8hi, v8hi)
+     v4si __builtin_ia32_psubd128 (v4si, v4si)
+     v2di __builtin_ia32_psubq128 (v2di, v2di)
+     v8hi __builtin_ia32_pmullw128 (v8hi, v8hi)
+     v8hi __builtin_ia32_pmulhw128 (v8hi, v8hi)
+     v2di __builtin_ia32_pand128 (v2di, v2di)
+     v2di __builtin_ia32_pandn128 (v2di, v2di)
+     v2di __builtin_ia32_por128 (v2di, v2di)
+     v2di __builtin_ia32_pxor128 (v2di, v2di)
+     v16qi __builtin_ia32_pavgb128 (v16qi, v16qi)
+     v8hi __builtin_ia32_pavgw128 (v8hi, v8hi)
+     v16qi __builtin_ia32_pcmpeqb128 (v16qi, v16qi)
+     v8hi __builtin_ia32_pcmpeqw128 (v8hi, v8hi)
+     v4si __builtin_ia32_pcmpeqd128 (v4si, v4si)
+     v16qi __builtin_ia32_pcmpgtb128 (v16qi, v16qi)
+     v8hi __builtin_ia32_pcmpgtw128 (v8hi, v8hi)
+     v4si __builtin_ia32_pcmpgtd128 (v4si, v4si)
+     v16qi __builtin_ia32_pmaxub128 (v16qi, v16qi)
+     v8hi __builtin_ia32_pmaxsw128 (v8hi, v8hi)
+     v16qi __builtin_ia32_pminub128 (v16qi, v16qi)
+     v8hi __builtin_ia32_pminsw128 (v8hi, v8hi)
+     v16qi __builtin_ia32_punpckhbw128 (v16qi, v16qi)
+     v8hi __builtin_ia32_punpckhwd128 (v8hi, v8hi)
+     v4si __builtin_ia32_punpckhdq128 (v4si, v4si)
+     v2di __builtin_ia32_punpckhqdq128 (v2di, v2di)
+     v16qi __builtin_ia32_punpcklbw128 (v16qi, v16qi)
+     v8hi __builtin_ia32_punpcklwd128 (v8hi, v8hi)
+     v4si __builtin_ia32_punpckldq128 (v4si, v4si)
+     v2di __builtin_ia32_punpcklqdq128 (v2di, v2di)
+     v16qi __builtin_ia32_packsswb128 (v8hi, v8hi)
+     v8hi __builtin_ia32_packssdw128 (v4si, v4si)
+     v16qi __builtin_ia32_packuswb128 (v8hi, v8hi)
+     v8hi __builtin_ia32_pmulhuw128 (v8hi, v8hi)
+     void __builtin_ia32_maskmovdqu (v16qi, v16qi)
+     v2df __builtin_ia32_loadupd (double *)
+     void __builtin_ia32_storeupd (double *, v2df)
+     v2df __builtin_ia32_loadhpd (v2df, double const *)
+     v2df __builtin_ia32_loadlpd (v2df, double const *)
+     int __builtin_ia32_movmskpd (v2df)
+     int __builtin_ia32_pmovmskb128 (v16qi)
+     void __builtin_ia32_movnti (int *, int)
+     void __builtin_ia32_movntpd (double *, v2df)
+     void __builtin_ia32_movntdq (v2df *, v2df)
+     v4si __builtin_ia32_pshufd (v4si, int)
+     v8hi __builtin_ia32_pshuflw (v8hi, int)
+     v8hi __builtin_ia32_pshufhw (v8hi, int)
+     v2di __builtin_ia32_psadbw128 (v16qi, v16qi)
+     v2df __builtin_ia32_sqrtpd (v2df)
+     v2df __builtin_ia32_sqrtsd (v2df)
+     v2df __builtin_ia32_shufpd (v2df, v2df, int)
+*/
+static __inline
+v128_u8_t op_SHUFPD (v128_u8_t vin1, v128_u8_t vin2, const int mask)
+    __attribute__ ((always_inline));
+
+static __inline
+v128_u8_t op_SHUFPD (v128_u8_t vin1, v128_u8_t vin2, const int mask)
+{
+    return ( v128_u8_t ) __builtin_ia32_shufpd ((v128_d_t)vin1, (v128_d_t)vin2, mask);
+}
+
+/*
+     v2df __builtin_ia32_cvtdq2pd (v4si)
+     v4sf __builtin_ia32_cvtdq2ps (v4si)
+     v4si __builtin_ia32_cvtpd2dq (v2df)
+     v2si __builtin_ia32_cvtpd2pi (v2df)
+     v4sf __builtin_ia32_cvtpd2ps (v2df)
+     v4si __builtin_ia32_cvttpd2dq (v2df)
+     v2si __builtin_ia32_cvttpd2pi (v2df)
+     v2df __builtin_ia32_cvtpi2pd (v2si)
+     int __builtin_ia32_cvtsd2si (v2df)
+     int __builtin_ia32_cvttsd2si (v2df)
+     long long __builtin_ia32_cvtsd2si64 (v2df)
+     long long __builtin_ia32_cvttsd2si64 (v2df)
+     v4si __builtin_ia32_cvtps2dq (v4sf)
+     v2df __builtin_ia32_cvtps2pd (v4sf)
+     v4si __builtin_ia32_cvttps2dq (v4sf)
+     v2df __builtin_ia32_cvtsi2sd (v2df, int)
+     v2df __builtin_ia32_cvtsi642sd (v2df, long long)
+     v4sf __builtin_ia32_cvtsd2ss (v4sf, v2df)
+     v2df __builtin_ia32_cvtss2sd (v2df, v4sf)
+     void __builtin_ia32_clflush (const void *)
+     void __builtin_ia32_lfence (void)
+     void __builtin_ia32_mfence (void)
+     v16qi __builtin_ia32_loaddqu (const char *)
+     void __builtin_ia32_storedqu (char *, v16qi)
+     v1di __builtin_ia32_pmuludq (v2si, v2si)
+     v2di __builtin_ia32_pmuludq128 (v4si, v4si)
+     v8hi __builtin_ia32_psllw128 (v8hi, v8hi)
+     v4si __builtin_ia32_pslld128 (v4si, v4si)
+     v2di __builtin_ia32_psllq128 (v2di, v2di)
+     v8hi __builtin_ia32_psrlw128 (v8hi, v8hi)
+     v4si __builtin_ia32_psrld128 (v4si, v4si)
+     v2di __builtin_ia32_psrlq128 (v2di, v2di)
+     v8hi __builtin_ia32_psraw128 (v8hi, v8hi)
+     v4si __builtin_ia32_psrad128 (v4si, v4si)
+     v2di __builtin_ia32_pslldqi128 (v2di, int)
+     v8hi __builtin_ia32_psllwi128 (v8hi, int)
+     v4si __builtin_ia32_pslldi128 (v4si, int)
+*/
+
+static __inline
+v128_u8_t op_PSLLDI128 ( v128_u8_t vin, const int bit_count )
+    __attribute__ ((always_inline));
+
+static __inline
+v128_u8_t op_PSLLDI128 (v128_u8_t vin, const int bit_count)
+{
+    return (v128_u8_t)__builtin_ia32_pslldi128 ((v128_i32_t)vin, bit_count);
+}
+
+/*
+     v2di __builtin_ia32_psllqi128 (v2di, int)
+     v2di __builtin_ia32_psrldqi128 (v2di, int)
+     v8hi __builtin_ia32_psrlwi128 (v8hi, int)
+     v4si __builtin_ia32_psrldi128 (v4si, int)
+*/
+
+static __inline
+v128_u8_t op_PSRLDI128 ( v128_u8_t vin, const int bit_count )
+    __attribute__ ((always_inline));
+
+static __inline
+v128_u8_t op_PSRLDI128 (v128_u8_t vin, const int bit_count)
+{
+    return (v128_u8_t)__builtin_ia32_psrldi128 ((v128_i32_t)vin, bit_count);
+}
+
+/*
+     v2di __builtin_ia32_psrlqi128 (v2di, int)
+     v8hi __builtin_ia32_psrawi128 (v8hi, int)
+     v4si __builtin_ia32_psradi128 (v4si, int)
+     v4si __builtin_ia32_pmaddwd128 (v8hi, v8hi)
+     v2di __builtin_ia32_movq128 (v2di)
+*/
+static __inline__
+v128_u8_t op_PSHUFD128 ( v128_u8_t vin, const int mask )
+    __attribute__ ((always_inline));
+     
+static __inline__
+v128_u8_t op_PSHUFD128 (v128_u8_t vin, const int mask)
+{
+    return (v128_u8_t)__builtin_ia32_pshufd ((v128_i32_t)vin, mask);
+}
+#endif
+
+#ifdef __SSE3__
+/* sse3
+     v2df __builtin_ia32_addsubpd (v2df, v2df)
+     v4sf __builtin_ia32_addsubps (v4sf, v4sf)
+     v2df __builtin_ia32_haddpd (v2df, v2df)
+     v4sf __builtin_ia32_haddps (v4sf, v4sf)
+     v2df __builtin_ia32_hsubpd (v2df, v2df)
+     v4sf __builtin_ia32_hsubps (v4sf, v4sf)
+     v16qi __builtin_ia32_lddqu (char const *)
+     void __builtin_ia32_monitor (void *, unsigned int, unsigned int)
+     v2df __builtin_ia32_movddup (v2df)
+     v4sf __builtin_ia32_movshdup (v4sf)
+     v4sf __builtin_ia32_movsldup (v4sf)
+     void __builtin_ia32_mwait (unsigned int, unsigned int)
+
+v2df __builtin_ia32_loadddup (double const *)
+
+*/
+
+#endif
+
+#ifdef __SSSE3__
+
+/* ssse3
+ *
+ * The following built-in functions are available when -mssse3 is used. All of
+ * them generate the machine instruction that is part of the name with MMX
+ * registers.
+ *
+ * 
+     v2si __builtin_ia32_phaddd (v2si, v2si)
+     v4hi __builtin_ia32_phaddw (v4hi, v4hi)
+     v4hi __builtin_ia32_phaddsw (v4hi, v4hi)
+     v2si __builtin_ia32_phsubd (v2si, v2si)
+     v4hi __builtin_ia32_phsubw (v4hi, v4hi)
+     v4hi __builtin_ia32_phsubsw (v4hi, v4hi)
+     v4hi __builtin_ia32_pmaddubsw (v8qi, v8qi)
+     v4hi __builtin_ia32_pmulhrsw (v4hi, v4hi)
+     v8qi __builtin_ia32_pshufb (v8qi, v8qi)
+     v8qi __builtin_ia32_psignb (v8qi, v8qi)
+     v2si __builtin_ia32_psignd (v2si, v2si)
+     v4hi __builtin_ia32_psignw (v4hi, v4hi)
+     v1di __builtin_ia32_palignr (v1di, v1di, int)
+     v8qi __builtin_ia32_pabsb (v8qi)
+     v2si __builtin_ia32_pabsd (v2si)
+     v4hi __builtin_ia32_pabsw (v4hi)
+The following built-in functions are available when -mssse3 is used.
+All of them generate the machine instruction that is part of the name
+with SSE registers.
+
+     v4si __builtin_ia32_phaddd128 (v4si, v4si)
+     v8hi __builtin_ia32_phaddw128 (v8hi, v8hi)
+     v8hi __builtin_ia32_phaddsw128 (v8hi, v8hi)
+     v4si __builtin_ia32_phsubd128 (v4si, v4si)
+     v8hi __builtin_ia32_phsubw128 (v8hi, v8hi)
+     v8hi __builtin_ia32_phsubsw128 (v8hi, v8hi)
+     v8hi __builtin_ia32_pmaddubsw128 (v16qi, v16qi)
+     v8hi __builtin_ia32_pmulhrsw128 (v8hi, v8hi)
++    v16qi __builtin_ia32_pshufb128 (v16qi, v16qi)
+     v16qi __builtin_ia32_psignb128 (v16qi, v16qi)
+     v4si __builtin_ia32_psignd128 (v4si, v4si)
+     v8hi __builtin_ia32_psignw128 (v8hi, v8hi)
+     v2di __builtin_ia32_palignr128 (v2di, v2di, int)
+     v16qi __builtin_ia32_pabsb128 (v16qi)
+     v4si __builtin_ia32_pabsd128 (v4si)
+     v8hi __builtin_ia32_pabsw128 (v8hi)
+ */
+
+static __inline__
+v128_u8_t op_PSHUFB128 (register v128_u8_t vin, register const v128_u8_t vtab)
+    __attribute__ ((always_inline));
+
+static __inline__
+v128_u8_t op_PSHUFB128 (register v128_u8_t vin, register const v128_u8_t vtab)
+{
+    return (v128_u8_t)__builtin_ia32_pshufb128 ((v128_c_t)vin, (v128_c_t)vtab);
+}
+#endif
+
+#ifdef __SSE4_1__
+/* sse4.1
+The following built-in functions are available when -msse4.1 is used.
+All of them generate the machine instruction that is part of the name.
+
+     v2df __builtin_ia32_blendpd (v2df, v2df, const int)
+     v4sf __builtin_ia32_blendps (v4sf, v4sf, const int)
+     v2df __builtin_ia32_blendvpd (v2df, v2df, v2df)
+     v4sf __builtin_ia32_blendvps (v4sf, v4sf, v4sf)
+     v2df __builtin_ia32_dppd (v2df, v2df, const int)
+     v4sf __builtin_ia32_dpps (v4sf, v4sf, const int)
+     v4sf __builtin_ia32_insertps128 (v4sf, v4sf, const int)
+     v2di __builtin_ia32_movntdqa (v2di *);
+     v16qi __builtin_ia32_mpsadbw128 (v16qi, v16qi, const int)
+     v8hi __builtin_ia32_packusdw128 (v4si, v4si)
+     v16qi __builtin_ia32_pblendvb128 (v16qi, v16qi, v16qi)
+     v8hi __builtin_ia32_pblendw128 (v8hi, v8hi, const int)
+     v2di __builtin_ia32_pcmpeqq (v2di, v2di)
+     v8hi __builtin_ia32_phminposuw128 (v8hi)
+     v16qi __builtin_ia32_pmaxsb128 (v16qi, v16qi)
+     v4si __builtin_ia32_pmaxsd128 (v4si, v4si)
+     v4si __builtin_ia32_pmaxud128 (v4si, v4si)
+     v8hi __builtin_ia32_pmaxuw128 (v8hi, v8hi)
+     v16qi __builtin_ia32_pminsb128 (v16qi, v16qi)
+     v4si __builtin_ia32_pminsd128 (v4si, v4si)
+     v4si __builtin_ia32_pminud128 (v4si, v4si)
+     v8hi __builtin_ia32_pminuw128 (v8hi, v8hi)
+     v4si __builtin_ia32_pmovsxbd128 (v16qi)
+     v2di __builtin_ia32_pmovsxbq128 (v16qi)
+     v8hi __builtin_ia32_pmovsxbw128 (v16qi)
+     v2di __builtin_ia32_pmovsxdq128 (v4si)
+     v4si __builtin_ia32_pmovsxwd128 (v8hi)
+     v2di __builtin_ia32_pmovsxwq128 (v8hi)
+     v4si __builtin_ia32_pmovzxbd128 (v16qi)
+     v2di __builtin_ia32_pmovzxbq128 (v16qi)
+     v8hi __builtin_ia32_pmovzxbw128 (v16qi)
+     v2di __builtin_ia32_pmovzxdq128 (v4si)
+     v4si __builtin_ia32_pmovzxwd128 (v8hi)
+     v2di __builtin_ia32_pmovzxwq128 (v8hi)
+     v2di __builtin_ia32_pmuldq128 (v4si, v4si)
+     v4si __builtin_ia32_pmulld128 (v4si, v4si)
+     int __builtin_ia32_ptestc128 (v2di, v2di)
+     int __builtin_ia32_ptestnzc128 (v2di, v2di)
+     int __builtin_ia32_ptestz128 (v2di, v2di)
+     v2df __builtin_ia32_roundpd (v2df, const int)
+     v4sf __builtin_ia32_roundps (v4sf, const int)
+     v2df __builtin_ia32_roundsd (v2df, v2df, const int)
+     v4sf __builtin_ia32_roundss (v4sf, v4sf, const int)
+The following built-in functions are available when -msse4.1 is used.
+
+v4sf __builtin_ia32_vec_set_v4sf (v4sf, float, const int)
+Generates the insertps machine instruction. 
+int __builtin_ia32_vec_ext_v16qi (v16qi, const int)
+Generates the pextrb machine instruction. 
+v16qi __builtin_ia32_vec_set_v16qi (v16qi, int, const int)
+Generates the pinsrb machine instruction. 
+v4si __builtin_ia32_vec_set_v4si (v4si, int, const int)
+Generates the pinsrd machine instruction. 
+*/
+static __inline__
+v128_u8_t op_PINSRUD (register v128_u8_t vin, uint32_t ii, const int off)
+    __attribute__ ((always_inline));
+static __inline__
+v128_u8_t op_PINSRUD (register v128_u8_t vin, uint32_t ii, const int off)
+{
+    return (v128_u8_t)__builtin_ia32_vec_set_v4si ((v128_i32_t)vin, ii, ( const uint8_t ) off );
+}
+#define op_PINSRUD( vin, ii, off ) \
+    (v128_u8_t) __builtin_ia32_vec_set_v4si ((v128_i32_t)(vin), ii, off)
+
+/*
+v2di __builtin_ia32_vec_set_v2di (v2di, long long, const int)
+Generates the pinsrq machine instruction in 64bit mode.
+The following built-in functions are changed to generate new SSE4.1 instructions when -msse4.1 is used.
+
+float __builtin_ia32_vec_ext_v4sf (v4sf, const int)
+Generates the extractps machine instruction. 
+int __builtin_ia32_vec_ext_v4si (v4si, const int)
+Generates the pextrd machine instruction. 
+long long __builtin_ia32_vec_ext_v2di (v2di, const int)
+Generates the pextrq machine instruction in 64bit mode.
+ */
+
+#endif
+
+#ifdef __SSE4_2__
+
+/* sse4.2
+The following built-in functions are available when -msse4.2 is used.
+All of them generate the machine instruction that is part of the name.
+
+     v16qi __builtin_ia32_pcmpestrm128 (v16qi, int, v16qi, int, const int)
+     int __builtin_ia32_pcmpestri128 (v16qi, int, v16qi, int, const int)
+     int __builtin_ia32_pcmpestria128 (v16qi, int, v16qi, int, const int)
+     int __builtin_ia32_pcmpestric128 (v16qi, int, v16qi, int, const int)
+     int __builtin_ia32_pcmpestrio128 (v16qi, int, v16qi, int, const int)
+     int __builtin_ia32_pcmpestris128 (v16qi, int, v16qi, int, const int)
+     int __builtin_ia32_pcmpestriz128 (v16qi, int, v16qi, int, const int)
+     v16qi __builtin_ia32_pcmpistrm128 (v16qi, v16qi, const int)
+     int __builtin_ia32_pcmpistri128 (v16qi, v16qi, const int)
+     int __builtin_ia32_pcmpistria128 (v16qi, v16qi, const int)
+     int __builtin_ia32_pcmpistric128 (v16qi, v16qi, const int)
+     int __builtin_ia32_pcmpistrio128 (v16qi, v16qi, const int)
+     int __builtin_ia32_pcmpistris128 (v16qi, v16qi, const int)
+     int __builtin_ia32_pcmpistriz128 (v16qi, v16qi, const int)
+     v2di __builtin_ia32_pcmpgtq (v2di, v2di)
+The following built-in functions are available when -msse4.2 is used.
+
+unsigned int __builtin_ia32_crc32qi (unsigned int, unsigned char)
+Generates the crc32b machine instruction. 
+unsigned int __builtin_ia32_crc32hi (unsigned int, unsigned short)
+Generates the crc32w machine instruction. 
+unsigned int __builtin_ia32_crc32si (unsigned int, unsigned int)
+Generates the crc32l machine instruction. 
+unsigned long long __builtin_ia32_crc32di (unsigned long long, unsigned long long)
+Generates the crc32q machine instruction.
+The following built-in functions are changed to generate new SSE4.2 instructions when -msse4.2 is used.
+
+int __builtin_popcount (unsigned int)
+Generates the popcntl machine instruction. 
+int __builtin_popcountl (unsigned long)
+Generates the popcntl or popcntq machine instruction, depending on the size of unsigned long. 
+int __builtin_popcountll (unsigned long long)
+Generates the popcntq machine instruction.
+
+*/
+
+#endif
+
+/* avx
+The following built-in functions are available when -mavx is used.
+All of them generate the machine instruction that is part of the name.
+
+     v4df __builtin_ia32_addpd256 (v4df,v4df)
+     v8sf __builtin_ia32_addps256 (v8sf,v8sf)
+     v4df __builtin_ia32_addsubpd256 (v4df,v4df)
+     v8sf __builtin_ia32_addsubps256 (v8sf,v8sf)
+     v4df __builtin_ia32_andnpd256 (v4df,v4df)
+     v8sf __builtin_ia32_andnps256 (v8sf,v8sf)
+     v4df __builtin_ia32_andpd256 (v4df,v4df)
+     v8sf __builtin_ia32_andps256 (v8sf,v8sf)
+     v4df __builtin_ia32_blendpd256 (v4df,v4df,int)
+     v8sf __builtin_ia32_blendps256 (v8sf,v8sf,int)
+     v4df __builtin_ia32_blendvpd256 (v4df,v4df,v4df)
+     v8sf __builtin_ia32_blendvps256 (v8sf,v8sf,v8sf)
+     v2df __builtin_ia32_cmppd (v2df,v2df,int)
+     v4df __builtin_ia32_cmppd256 (v4df,v4df,int)
+     v4sf __builtin_ia32_cmpps (v4sf,v4sf,int)
+     v8sf __builtin_ia32_cmpps256 (v8sf,v8sf,int)
+     v2df __builtin_ia32_cmpsd (v2df,v2df,int)
+     v4sf __builtin_ia32_cmpss (v4sf,v4sf,int)
+     v4df __builtin_ia32_cvtdq2pd256 (v4si)
+     v8sf __builtin_ia32_cvtdq2ps256 (v8si)
+     v4si __builtin_ia32_cvtpd2dq256 (v4df)
+     v4sf __builtin_ia32_cvtpd2ps256 (v4df)
+     v8si __builtin_ia32_cvtps2dq256 (v8sf)
+     v4df __builtin_ia32_cvtps2pd256 (v4sf)
+     v4si __builtin_ia32_cvttpd2dq256 (v4df)
+     v8si __builtin_ia32_cvttps2dq256 (v8sf)
+     v4df __builtin_ia32_divpd256 (v4df,v4df)
+     v8sf __builtin_ia32_divps256 (v8sf,v8sf)
+     v8sf __builtin_ia32_dpps256 (v8sf,v8sf,int)
+     v4df __builtin_ia32_haddpd256 (v4df,v4df)
+     v8sf __builtin_ia32_haddps256 (v8sf,v8sf)
+     v4df __builtin_ia32_hsubpd256 (v4df,v4df)
+     v8sf __builtin_ia32_hsubps256 (v8sf,v8sf)
+     v32qi __builtin_ia32_lddqu256 (pcchar)
+     v32qi __builtin_ia32_loaddqu256 (pcchar)
+     v4df __builtin_ia32_loadupd256 (pcdouble)
+     v8sf __builtin_ia32_loadups256 (pcfloat)
+     v2df __builtin_ia32_maskloadpd (pcv2df,v2df)
+     v4df __builtin_ia32_maskloadpd256 (pcv4df,v4df)
+     v4sf __builtin_ia32_maskloadps (pcv4sf,v4sf)
+     v8sf __builtin_ia32_maskloadps256 (pcv8sf,v8sf)
+     void __builtin_ia32_maskstorepd (pv2df,v2df,v2df)
+     void __builtin_ia32_maskstorepd256 (pv4df,v4df,v4df)
+     void __builtin_ia32_maskstoreps (pv4sf,v4sf,v4sf)
+     void __builtin_ia32_maskstoreps256 (pv8sf,v8sf,v8sf)
+     v4df __builtin_ia32_maxpd256 (v4df,v4df)
+     v8sf __builtin_ia32_maxps256 (v8sf,v8sf)
+     v4df __builtin_ia32_minpd256 (v4df,v4df)
+     v8sf __builtin_ia32_minps256 (v8sf,v8sf)
+     v4df __builtin_ia32_movddup256 (v4df)
+     int __builtin_ia32_movmskpd256 (v4df)
+     int __builtin_ia32_movmskps256 (v8sf)
+     v8sf __builtin_ia32_movshdup256 (v8sf)
+     v8sf __builtin_ia32_movsldup256 (v8sf)
+     v4df __builtin_ia32_mulpd256 (v4df,v4df)
+     v8sf __builtin_ia32_mulps256 (v8sf,v8sf)
+     v4df __builtin_ia32_orpd256 (v4df,v4df)
+     v8sf __builtin_ia32_orps256 (v8sf,v8sf)
+     v2df __builtin_ia32_pd_pd256 (v4df)
+     v4df __builtin_ia32_pd256_pd (v2df)
+     v4sf __builtin_ia32_ps_ps256 (v8sf)
+     v8sf __builtin_ia32_ps256_ps (v4sf)
+     int __builtin_ia32_ptestc256 (v4di,v4di,ptest)
+     int __builtin_ia32_ptestnzc256 (v4di,v4di,ptest)
+     int __builtin_ia32_ptestz256 (v4di,v4di,ptest)
+     v8sf __builtin_ia32_rcpps256 (v8sf)
+     v4df __builtin_ia32_roundpd256 (v4df,int)
+     v8sf __builtin_ia32_roundps256 (v8sf,int)
+     v8sf __builtin_ia32_rsqrtps_nr256 (v8sf)
+     v8sf __builtin_ia32_rsqrtps256 (v8sf)
+     v4df __builtin_ia32_shufpd256 (v4df,v4df,int)
+     v8sf __builtin_ia32_shufps256 (v8sf,v8sf,int)
+     v4si __builtin_ia32_si_si256 (v8si)
+     v8si __builtin_ia32_si256_si (v4si)
+     v4df __builtin_ia32_sqrtpd256 (v4df)
+     v8sf __builtin_ia32_sqrtps_nr256 (v8sf)
+     v8sf __builtin_ia32_sqrtps256 (v8sf)
+     void __builtin_ia32_storedqu256 (pchar,v32qi)
+     void __builtin_ia32_storeupd256 (pdouble,v4df)
+     void __builtin_ia32_storeups256 (pfloat,v8sf)
+     v4df __builtin_ia32_subpd256 (v4df,v4df)
+     v8sf __builtin_ia32_subps256 (v8sf,v8sf)
+     v4df __builtin_ia32_unpckhpd256 (v4df,v4df)
+     v8sf __builtin_ia32_unpckhps256 (v8sf,v8sf)
+     v4df __builtin_ia32_unpcklpd256 (v4df,v4df)
+     v8sf __builtin_ia32_unpcklps256 (v8sf,v8sf)
+     v4df __builtin_ia32_vbroadcastf128_pd256 (pcv2df)
+     v8sf __builtin_ia32_vbroadcastf128_ps256 (pcv4sf)
+     v4df __builtin_ia32_vbroadcastsd256 (pcdouble)
+     v4sf __builtin_ia32_vbroadcastss (pcfloat)
+     v8sf __builtin_ia32_vbroadcastss256 (pcfloat)
+     v2df __builtin_ia32_vextractf128_pd256 (v4df,int)
+     v4sf __builtin_ia32_vextractf128_ps256 (v8sf,int)
+     v4si __builtin_ia32_vextractf128_si256 (v8si,int)
+     v4df __builtin_ia32_vinsertf128_pd256 (v4df,v2df,int)
+     v8sf __builtin_ia32_vinsertf128_ps256 (v8sf,v4sf,int)
+     v8si __builtin_ia32_vinsertf128_si256 (v8si,v4si,int)
+     v4df __builtin_ia32_vperm2f128_pd256 (v4df,v4df,int)
+     v8sf __builtin_ia32_vperm2f128_ps256 (v8sf,v8sf,int)
+     v8si __builtin_ia32_vperm2f128_si256 (v8si,v8si,int)
+     v2df __builtin_ia32_vpermil2pd (v2df,v2df,v2di,int)
+     v4df __builtin_ia32_vpermil2pd256 (v4df,v4df,v4di,int)
+     v4sf __builtin_ia32_vpermil2ps (v4sf,v4sf,v4si,int)
+     v8sf __builtin_ia32_vpermil2ps256 (v8sf,v8sf,v8si,int)
+     v2df __builtin_ia32_vpermilpd (v2df,int)
+     v4df __builtin_ia32_vpermilpd256 (v4df,int)
+     v4sf __builtin_ia32_vpermilps (v4sf,int)
+     v8sf __builtin_ia32_vpermilps256 (v8sf,int)
+     v2df __builtin_ia32_vpermilvarpd (v2df,v2di)
+     v4df __builtin_ia32_vpermilvarpd256 (v4df,v4di)
+     v4sf __builtin_ia32_vpermilvarps (v4sf,v4si)
+     v8sf __builtin_ia32_vpermilvarps256 (v8sf,v8si)
+     int __builtin_ia32_vtestcpd (v2df,v2df,ptest)
+     int __builtin_ia32_vtestcpd256 (v4df,v4df,ptest)
+     int __builtin_ia32_vtestcps (v4sf,v4sf,ptest)
+     int __builtin_ia32_vtestcps256 (v8sf,v8sf,ptest)
+     int __builtin_ia32_vtestnzcpd (v2df,v2df,ptest)
+     int __builtin_ia32_vtestnzcpd256 (v4df,v4df,ptest)
+     int __builtin_ia32_vtestnzcps (v4sf,v4sf,ptest)
+     int __builtin_ia32_vtestnzcps256 (v8sf,v8sf,ptest)
+     int __builtin_ia32_vtestzpd (v2df,v2df,ptest)
+     int __builtin_ia32_vtestzpd256 (v4df,v4df,ptest)
+     int __builtin_ia32_vtestzps (v4sf,v4sf,ptest)
+     int __builtin_ia32_vtestzps256 (v8sf,v8sf,ptest)
+     void __builtin_ia32_vzeroall (void)
+     void __builtin_ia32_vzeroupper (void)
+     v4df __builtin_ia32_xorpd256 (v4df,v4df)
+     v8sf __builtin_ia32_xorps256 (v8sf,v8sf)
+
+
+
+*/
+
+#ifdef __AES__
+/*
+ * AES-NI instruction set
+ * includes PCMUL
+ */
+
+/* AES-NI aes
+ */
+
+   
+/* v2di __builtin_ia32_aesenc128 (v2di, v2di) */
+static __inline__
+v128_u8_t op_AESENC (register v128_u8_t state, register const v128_u8_t round_key)
+{
+    return (v128_u8_t)__builtin_ia32_aesenc128 ((v128_lli_t)state,
+                                               (v128_lli_t)round_key);
+}
+
+
+/* v2di __builtin_ia32_aesenclast128 (v2di, v2di) */
+static __inline__
+v128_u8_t op_AESENCLAST (register v128_u8_t state,
+                        register const v128_u8_t round_key)
+{
+    return (v128_u8_t)__builtin_ia32_aesenclast128 ((v128_lli_t)state,
+                                                   (v128_lli_t)round_key);
+}
+
+
+/* v2di __builtin_ia32_aesdec128 (v2di, v2di) */
+static __inline__
+v128_u8_t op_AESDEC (register v128_u8_t state, register const v128_u8_t round_key)
+{
+    return (v128_u8_t)__builtin_ia32_aesdec128 ((v128_lli_t)state,
+                                               (v128_lli_t)round_key);
+}
+
+
+/* v2di __builtin_ia32_aesdeclast128 (v2di, v2di) */
+static __inline__
+v128_u8_t op_AESDECLAST (register v128_u8_t state,
+                        register const v128_u8_t round_key)
+{
+    return (v128_u8_t)__builtin_ia32_aesdeclast128 ((v128_lli_t)state,
+                                                   (v128_lli_t)round_key);
+}
+
+
+/* v2di __builtin_ia32_aeskeygenassist128 (v2di, const int) */
+static __inline__
+v128_u8_t op_AESKEYGENASSIST (register const v128_u8_t round_key,
+                             const int rcon ) __attribute__ ((always_inline));
+static __inline__
+v128_u8_t op_AESKEYGENASSIST (register const v128_u8_t round_key,
+                             const int rcon )
+{
+    return (v128_u8_t)__builtin_ia32_aeskeygenassist128 ((v128_lli_t)round_key, rcon);
+}
+
+#define op_AESKEYGENASSIST( round_key, rcon ) \
+    (v128_u8_t) __builtin_ia32_aeskeygenassist128 ((v128_lli_t) (round_key), rcon)
+
+
+/* v2di __builtin_ia32_aesimc128 (v2di) */
+static __inline__
+v128_u8_t op_AESIMC (register const v128_u8_t round_key)
+{
+    return (v128_u8_t)__builtin_ia32_aesimc128 ((v128_lli_t)round_key);
+}
+
+/* pclmul
+v2di __builtin_ia32_pclmulqdq128 (v2di, v2di, const int)
+*/
+#endif
+
+#ifdef __SSE5__
+/* sse5
+     v2df __builtin_ia32_comeqpd (v2df, v2df)
+     v2df __builtin_ia32_comeqps (v2df, v2df)
+     v4sf __builtin_ia32_comeqsd (v4sf, v4sf)
+     v4sf __builtin_ia32_comeqss (v4sf, v4sf)
+     v2df __builtin_ia32_comfalsepd (v2df, v2df)
+     v2df __builtin_ia32_comfalseps (v2df, v2df)
+     v4sf __builtin_ia32_comfalsesd (v4sf, v4sf)
+     v4sf __builtin_ia32_comfalsess (v4sf, v4sf)
+     v2df __builtin_ia32_comgepd (v2df, v2df)
+     v2df __builtin_ia32_comgeps (v2df, v2df)
+     v4sf __builtin_ia32_comgesd (v4sf, v4sf)
+     v4sf __builtin_ia32_comgess (v4sf, v4sf)
+     v2df __builtin_ia32_comgtpd (v2df, v2df)
+     v2df __builtin_ia32_comgtps (v2df, v2df)
+     v4sf __builtin_ia32_comgtsd (v4sf, v4sf)
+     v4sf __builtin_ia32_comgtss (v4sf, v4sf)
+     v2df __builtin_ia32_comlepd (v2df, v2df)
+     v2df __builtin_ia32_comleps (v2df, v2df)
+     v4sf __builtin_ia32_comlesd (v4sf, v4sf)
+     v4sf __builtin_ia32_comless (v4sf, v4sf)
+     v2df __builtin_ia32_comltpd (v2df, v2df)
+     v2df __builtin_ia32_comltps (v2df, v2df)
+     v4sf __builtin_ia32_comltsd (v4sf, v4sf)
+     v4sf __builtin_ia32_comltss (v4sf, v4sf)
+     v2df __builtin_ia32_comnepd (v2df, v2df)
+     v2df __builtin_ia32_comneps (v2df, v2df)
+     v4sf __builtin_ia32_comnesd (v4sf, v4sf)
+     v4sf __builtin_ia32_comness (v4sf, v4sf)
+     v2df __builtin_ia32_comordpd (v2df, v2df)
+     v2df __builtin_ia32_comordps (v2df, v2df)
+     v4sf __builtin_ia32_comordsd (v4sf, v4sf)
+     v4sf __builtin_ia32_comordss (v4sf, v4sf)
+     v2df __builtin_ia32_comtruepd (v2df, v2df)
+     v2df __builtin_ia32_comtrueps (v2df, v2df)
+     v4sf __builtin_ia32_comtruesd (v4sf, v4sf)
+     v4sf __builtin_ia32_comtruess (v4sf, v4sf)
+     v2df __builtin_ia32_comueqpd (v2df, v2df)
+     v2df __builtin_ia32_comueqps (v2df, v2df)
+     v4sf __builtin_ia32_comueqsd (v4sf, v4sf)
+     v4sf __builtin_ia32_comueqss (v4sf, v4sf)
+     v2df __builtin_ia32_comugepd (v2df, v2df)
+     v2df __builtin_ia32_comugeps (v2df, v2df)
+     v4sf __builtin_ia32_comugesd (v4sf, v4sf)
+     v4sf __builtin_ia32_comugess (v4sf, v4sf)
+     v2df __builtin_ia32_comugtpd (v2df, v2df)
+     v2df __builtin_ia32_comugtps (v2df, v2df)
+     v4sf __builtin_ia32_comugtsd (v4sf, v4sf)
+     v4sf __builtin_ia32_comugtss (v4sf, v4sf)
+     v2df __builtin_ia32_comulepd (v2df, v2df)
+     v2df __builtin_ia32_comuleps (v2df, v2df)
+     v4sf __builtin_ia32_comulesd (v4sf, v4sf)
+     v4sf __builtin_ia32_comuless (v4sf, v4sf)
+     v2df __builtin_ia32_comultpd (v2df, v2df)
+     v2df __builtin_ia32_comultps (v2df, v2df)
+     v4sf __builtin_ia32_comultsd (v4sf, v4sf)
+     v4sf __builtin_ia32_comultss (v4sf, v4sf)
+     v2df __builtin_ia32_comunepd (v2df, v2df)
+     v2df __builtin_ia32_comuneps (v2df, v2df)
+     v4sf __builtin_ia32_comunesd (v4sf, v4sf)
+     v4sf __builtin_ia32_comuness (v4sf, v4sf)
+     v2df __builtin_ia32_comunordpd (v2df, v2df)
+     v2df __builtin_ia32_comunordps (v2df, v2df)
+     v4sf __builtin_ia32_comunordsd (v4sf, v4sf)
+     v4sf __builtin_ia32_comunordss (v4sf, v4sf)
+     v2df __builtin_ia32_fmaddpd (v2df, v2df, v2df)
+     v4sf __builtin_ia32_fmaddps (v4sf, v4sf, v4sf)
+     v2df __builtin_ia32_fmaddsd (v2df, v2df, v2df)
+     v4sf __builtin_ia32_fmaddss (v4sf, v4sf, v4sf)
+     v2df __builtin_ia32_fmsubpd (v2df, v2df, v2df)
+     v4sf __builtin_ia32_fmsubps (v4sf, v4sf, v4sf)
+     v2df __builtin_ia32_fmsubsd (v2df, v2df, v2df)
+     v4sf __builtin_ia32_fmsubss (v4sf, v4sf, v4sf)
+     v2df __builtin_ia32_fnmaddpd (v2df, v2df, v2df)
+     v4sf __builtin_ia32_fnmaddps (v4sf, v4sf, v4sf)
+     v2df __builtin_ia32_fnmaddsd (v2df, v2df, v2df)
+     v4sf __builtin_ia32_fnmaddss (v4sf, v4sf, v4sf)
+     v2df __builtin_ia32_fnmsubpd (v2df, v2df, v2df)
+     v4sf __builtin_ia32_fnmsubps (v4sf, v4sf, v4sf)
+     v2df __builtin_ia32_fnmsubsd (v2df, v2df, v2df)
+     v4sf __builtin_ia32_fnmsubss (v4sf, v4sf, v4sf)
+     v2df __builtin_ia32_frczpd (v2df)
+     v4sf __builtin_ia32_frczps (v4sf)
+     v2df __builtin_ia32_frczsd (v2df, v2df)
+     v4sf __builtin_ia32_frczss (v4sf, v4sf)
+     v2di __builtin_ia32_pcmov (v2di, v2di, v2di)
+     v2di __builtin_ia32_pcmov_v2di (v2di, v2di, v2di)
+     v4si __builtin_ia32_pcmov_v4si (v4si, v4si, v4si)
+     v8hi __builtin_ia32_pcmov_v8hi (v8hi, v8hi, v8hi)
+     v16qi __builtin_ia32_pcmov_v16qi (v16qi, v16qi, v16qi)
+     v2df __builtin_ia32_pcmov_v2df (v2df, v2df, v2df)
+     v4sf __builtin_ia32_pcmov_v4sf (v4sf, v4sf, v4sf)
+     v16qi __builtin_ia32_pcomeqb (v16qi, v16qi)
+     v8hi __builtin_ia32_pcomeqw (v8hi, v8hi)
+     v4si __builtin_ia32_pcomeqd (v4si, v4si)
+     v2di __builtin_ia32_pcomeqq (v2di, v2di)
+     v16qi __builtin_ia32_pcomequb (v16qi, v16qi)
+     v4si __builtin_ia32_pcomequd (v4si, v4si)
+     v2di __builtin_ia32_pcomequq (v2di, v2di)
+     v8hi __builtin_ia32_pcomequw (v8hi, v8hi)
+     v8hi __builtin_ia32_pcomeqw (v8hi, v8hi)
+     v16qi __builtin_ia32_pcomfalseb (v16qi, v16qi)
+     v4si __builtin_ia32_pcomfalsed (v4si, v4si)
+     v2di __builtin_ia32_pcomfalseq (v2di, v2di)
+     v16qi __builtin_ia32_pcomfalseub (v16qi, v16qi)
+     v4si __builtin_ia32_pcomfalseud (v4si, v4si)
+     v2di __builtin_ia32_pcomfalseuq (v2di, v2di)
+     v8hi __builtin_ia32_pcomfalseuw (v8hi, v8hi)
+     v8hi __builtin_ia32_pcomfalsew (v8hi, v8hi)
+     v16qi __builtin_ia32_pcomgeb (v16qi, v16qi)
+     v4si __builtin_ia32_pcomged (v4si, v4si)
+     v2di __builtin_ia32_pcomgeq (v2di, v2di)
+     v16qi __builtin_ia32_pcomgeub (v16qi, v16qi)
+     v4si __builtin_ia32_pcomgeud (v4si, v4si)
+     v2di __builtin_ia32_pcomgeuq (v2di, v2di)
+     v8hi __builtin_ia32_pcomgeuw (v8hi, v8hi)
+     v8hi __builtin_ia32_pcomgew (v8hi, v8hi)
+     v16qi __builtin_ia32_pcomgtb (v16qi, v16qi)
+     v4si __builtin_ia32_pcomgtd (v4si, v4si)
+     v2di __builtin_ia32_pcomgtq (v2di, v2di)
+     v16qi __builtin_ia32_pcomgtub (v16qi, v16qi)
+     v4si __builtin_ia32_pcomgtud (v4si, v4si)
+     v2di __builtin_ia32_pcomgtuq (v2di, v2di)
+     v8hi __builtin_ia32_pcomgtuw (v8hi, v8hi)
+     v8hi __builtin_ia32_pcomgtw (v8hi, v8hi)
+     v16qi __builtin_ia32_pcomleb (v16qi, v16qi)
+     v4si __builtin_ia32_pcomled (v4si, v4si)
+     v2di __builtin_ia32_pcomleq (v2di, v2di)
+     v16qi __builtin_ia32_pcomleub (v16qi, v16qi)
+     v4si __builtin_ia32_pcomleud (v4si, v4si)
+     v2di __builtin_ia32_pcomleuq (v2di, v2di)
+     v8hi __builtin_ia32_pcomleuw (v8hi, v8hi)
+     v8hi __builtin_ia32_pcomlew (v8hi, v8hi)
+     v16qi __builtin_ia32_pcomltb (v16qi, v16qi)
+     v4si __builtin_ia32_pcomltd (v4si, v4si)
+     v2di __builtin_ia32_pcomltq (v2di, v2di)
+     v16qi __builtin_ia32_pcomltub (v16qi, v16qi)
+     v4si __builtin_ia32_pcomltud (v4si, v4si)
+     v2di __builtin_ia32_pcomltuq (v2di, v2di)
+     v8hi __builtin_ia32_pcomltuw (v8hi, v8hi)
+     v8hi __builtin_ia32_pcomltw (v8hi, v8hi)
+     v16qi __builtin_ia32_pcomneb (v16qi, v16qi)
+     v4si __builtin_ia32_pcomned (v4si, v4si)
+     v2di __builtin_ia32_pcomneq (v2di, v2di)
+     v16qi __builtin_ia32_pcomneub (v16qi, v16qi)
+     v4si __builtin_ia32_pcomneud (v4si, v4si)
+     v2di __builtin_ia32_pcomneuq (v2di, v2di)
+     v8hi __builtin_ia32_pcomneuw (v8hi, v8hi)
+     v8hi __builtin_ia32_pcomnew (v8hi, v8hi)
+     v16qi __builtin_ia32_pcomtrueb (v16qi, v16qi)
+     v4si __builtin_ia32_pcomtrued (v4si, v4si)
+     v2di __builtin_ia32_pcomtrueq (v2di, v2di)
+     v16qi __builtin_ia32_pcomtrueub (v16qi, v16qi)
+     v4si __builtin_ia32_pcomtrueud (v4si, v4si)
+     v2di __builtin_ia32_pcomtrueuq (v2di, v2di)
+     v8hi __builtin_ia32_pcomtrueuw (v8hi, v8hi)
+     v8hi __builtin_ia32_pcomtruew (v8hi, v8hi)
+     v4df __builtin_ia32_permpd (v2df, v2df, v16qi)
+     v4sf __builtin_ia32_permps (v4sf, v4sf, v16qi)
+     v4si __builtin_ia32_phaddbd (v16qi)
+     v2di __builtin_ia32_phaddbq (v16qi)
+     v8hi __builtin_ia32_phaddbw (v16qi)
+     v2di __builtin_ia32_phadddq (v4si)
+     v4si __builtin_ia32_phaddubd (v16qi)
+     v2di __builtin_ia32_phaddubq (v16qi)
+     v8hi __builtin_ia32_phaddubw (v16qi)
+     v2di __builtin_ia32_phaddudq (v4si)
+     v4si __builtin_ia32_phadduwd (v8hi)
+     v2di __builtin_ia32_phadduwq (v8hi)
+     v4si __builtin_ia32_phaddwd (v8hi)
+     v2di __builtin_ia32_phaddwq (v8hi)
+     v8hi __builtin_ia32_phsubbw (v16qi)
+     v2di __builtin_ia32_phsubdq (v4si)
+     v4si __builtin_ia32_phsubwd (v8hi)
+     v4si __builtin_ia32_pmacsdd (v4si, v4si, v4si)
+     v2di __builtin_ia32_pmacsdqh (v4si, v4si, v2di)
+     v2di __builtin_ia32_pmacsdql (v4si, v4si, v2di)
+     v4si __builtin_ia32_pmacssdd (v4si, v4si, v4si)
+     v2di __builtin_ia32_pmacssdqh (v4si, v4si, v2di)
+     v2di __builtin_ia32_pmacssdql (v4si, v4si, v2di)
+     v4si __builtin_ia32_pmacsswd (v8hi, v8hi, v4si)
+     v8hi __builtin_ia32_pmacssww (v8hi, v8hi, v8hi)
+     v4si __builtin_ia32_pmacswd (v8hi, v8hi, v4si)
+     v8hi __builtin_ia32_pmacsww (v8hi, v8hi, v8hi)
+     v4si __builtin_ia32_pmadcsswd (v8hi, v8hi, v4si)
+     v4si __builtin_ia32_pmadcswd (v8hi, v8hi, v4si)
+     v16qi __builtin_ia32_pperm (v16qi, v16qi, v16qi)
+     v16qi __builtin_ia32_protb (v16qi, v16qi)
+     v4si __builtin_ia32_protd (v4si, v4si)
+     v2di __builtin_ia32_protq (v2di, v2di)
+     v8hi __builtin_ia32_protw (v8hi, v8hi)
+     v16qi __builtin_ia32_pshab (v16qi, v16qi)
+     v4si __builtin_ia32_pshad (v4si, v4si)
+     v2di __builtin_ia32_pshaq (v2di, v2di)
+     v8hi __builtin_ia32_pshaw (v8hi, v8hi)
+     v16qi __builtin_ia32_pshlb (v16qi, v16qi)
+     v4si __builtin_ia32_pshld (v4si, v4si)
+     v2di __builtin_ia32_pshlq (v2di, v2di)
+     v8hi __builtin_ia32_pshlw (v8hi, v8hi)
+The following builtin-in functions are available when -msse5 is used.
+The second argument must be an integer constant and generate the machine
+instruction that is part of the name with the `_imm' suffix removed.
+
+     v16qi __builtin_ia32_protb_imm (v16qi, int)
+     v4si __builtin_ia32_protd_imm (v4si, int)
+     v2di __builtin_ia32_protq_imm (v2di, int)
+     v8hi __builtin_ia32_protw_imm (v8hi, int)
+
+
+*/
+#endif
+
+#endif /* if USE_VECREG */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_v128_ */
diff --git a/interfaces/cc/gcc/va_copy.h b/interfaces/cc/gcc/va_copy.h
new file mode 100644
index 0000000..34fb64f
--- /dev/null
+++ b/interfaces/cc/gcc/va_copy.h
@@ -0,0 +1,49 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_va_copy_
+#define _h_va_copy_
+
+/* GCC may internally undef 'va_copy' upon include of stdarg.h
+   force it to be included before defining va_copy */
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* kludge - GCC stdarg has this line:
+   #if !defined(__STRICT_ANSI__) || __STDC_VERSION__ + 0 >= 199900L
+   fix build for c99 */
+#if ! defined va_copy && defined __va_copy
+#define va_copy __va_copy
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_va_copy_ */
diff --git a/interfaces/cc/gcc/x86_64/arch-impl.h b/interfaces/cc/gcc/x86_64/arch-impl.h
new file mode 100644
index 0000000..dbfe011
--- /dev/null
+++ b/interfaces/cc/gcc/x86_64/arch-impl.h
@@ -0,0 +1,459 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_arch_impl_
+#define _h_arch_impl_
+
+#include <stdint.h>
+
+/* Intel versions from 11.0 through 13.0 mangle certain shift
+ * statements in inline assembly. */
+#if defined(__INTEL_COMPILER)  &&  __INTEL_COMPILER_BUILD_DATE >= 20090131 \
+    &&  __INTEL_COMPILER_BUILD_DATE < 20130607 
+#  define HAVE_ICC_SHIFT_BUG 1 
+#endif
+
+#ifndef USE_GCC_BUILTIN
+#define USE_GCC_BUILTIN 1
+#endif
+
+#if USE_GCC_BUILTIN
+#include <strings.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static __inline__
+int16_t uint16_lsbit ( uint16_t self )
+{
+    int16_t rtn;
+#if USE_GCC_BUILTIN
+    rtn = ( int16_t ) __builtin_ffs ( self ) - 1;
+#else
+    __asm__ __volatile__
+    (
+        "bsf %%ax, %%ax;"
+        "jnz 1f;"
+        "xor %%eax, %%eax;"
+        "dec %%eax;"
+        "1:"
+        : "=a" ( rtn )
+        : "a" ( self )
+    );
+#endif
+    return rtn;
+}
+
+static __inline__
+int32_t uint32_lsbit ( uint32_t self )
+{
+    int32_t rtn;
+#if USE_GCC_BUILTIN
+    rtn = __builtin_ffs ( self ) - 1;
+#else
+    __asm__ __volatile__
+    (
+        "bsf %%eax, %%eax;"
+        "jnz 1f;"
+        "xor %%eax, %%eax;"
+        "dec %%eax;"
+        "1:"
+        : "=a" ( rtn )
+        : "a" ( self )
+    );
+#endif
+    return rtn;
+}
+
+static __inline__
+int16_t uint16_msbit ( uint16_t self )
+{
+    int16_t rtn;
+#if USE_GCC_BUILTIN
+    if ( self == 0 ) return -1;
+    rtn = ( int16_t ) 31 - __builtin_clz ( ( uint32_t ) self );
+#else
+    __asm__ __volatile__
+    (
+        "bsr %%ax, %%ax;"
+        "jnz 1f;"
+        "xor %%eax, %%eax;"
+        "dec %%eax;"
+        "1:"
+        : "=a" ( rtn )
+        : "a" ( self )
+    );
+#endif
+    return rtn;
+}
+
+static __inline__
+int32_t uint32_msbit ( uint32_t self )
+{
+    int32_t rtn;
+#if USE_GCC_BUILTIN
+    if ( self == 0 ) return -1;
+    rtn = 31 - __builtin_clz ( self );
+#else
+    __asm__ __volatile__
+    (
+        "bsr %%eax, %%eax;"
+        "jnz 1f;"
+        "xor %%eax, %%eax;"
+        "dec %%eax;"
+        "1:"
+        : "=a" ( rtn )
+        : "a" ( self )
+    );
+#endif
+    return rtn;
+}
+
+typedef struct int128_t int128_t;
+struct int128_t
+{
+    uint64_t lo;
+    int64_t hi;
+};
+
+static __inline__
+int64_t int128_hi ( const int128_t *self )
+{
+    return self -> hi;
+}
+
+static __inline__
+uint64_t int128_lo ( const int128_t *self )
+{
+    return self -> lo;
+}
+
+static __inline__
+void int128_sethi ( int128_t *self, int64_t i )
+{
+    self -> hi = i;
+}
+
+static __inline__
+void int128_setlo ( int128_t *self, uint64_t i )
+{
+    self -> lo = i;
+}
+
+typedef struct uint128_t uint128_t;
+struct uint128_t
+{
+    uint64_t lo;
+    uint64_t hi;
+};
+
+static __inline__
+uint64_t uint128_hi ( const uint128_t *self )
+{
+    return self -> hi;
+}
+
+static __inline__
+uint64_t uint128_lo ( const uint128_t *self )
+{
+    return self -> lo;
+}
+
+static __inline__
+void uint128_sethi ( uint128_t *self, uint64_t i )
+{
+    self -> hi = i;
+}
+
+static __inline__
+void uint128_setlo ( uint128_t *self, uint64_t i )
+{
+    self -> lo = i;
+}
+
+static __inline__
+void int128_add ( int128_t *self, const int128_t *i )
+{
+    __asm__ __volatile__
+    (
+        "mov (%%rsi), %%rax;"
+        "mov 8(%%rsi), %%rcx;"
+        "add %%rax, (%%rdi);"
+        "adc %%rcx, 8(%%rdi);"
+        :
+        : "D" ( self ), "S" ( i )
+        : "%rax", "%rcx"
+    );
+}
+
+static __inline__
+void int128_sub ( int128_t *self, const int128_t *i )
+{
+    __asm__ __volatile__
+    (
+        "mov (%%rsi), %%rax;"
+        "mov 8(%%rsi), %%rcx;"
+        "sub %%rax, (%%rdi);"
+        "sbb %%rcx, 8(%%rdi);"
+        :
+        : "D" ( self ), "S" ( i )
+        : "%rax", "%rcx"
+    );
+}
+
+static __inline__
+void int128_sar ( int128_t *self, uint32_t i )
+{
+    __asm__ __volatile__
+    (
+        "mov %%esi, %%ecx;"
+        "mov 8(%%rdi), %%rax;"
+        "shrd %%cl, %%rax, (%%rdi);"
+        "sar %%cl, %%rax;"
+        "mov %%rax, 8(%%rdi);"
+        :
+        : "D" ( self ), "S" ( i )
+        :  "%rax", "%rcx"
+    );
+}
+
+static __inline__
+void int128_shl ( int128_t *self, uint32_t i )
+{
+    __asm__ __volatile__
+    (
+        "mov %%esi, %%ecx;"
+        "mov (%%rdi), %%rax;"
+        "shld %%cl, %%rax, 8(%%rdi);"
+        "shl %%cl, %%rax;"
+        "mov %%rax, (%%rdi);"
+        :
+        : "D" ( self ), "S" ( i )
+        : "%rax", "%rcx"
+    );
+}
+
+static __inline__
+void uint128_and ( uint128_t *self, const uint128_t *i )
+{
+    __asm__ __volatile__
+    (
+        "mov (%%rsi), %%rax;"
+        "mov 8(%%rsi), %%rcx;"
+        "and %%rax, (%%rdi);"
+        "and %%rcx, 8(%%rdi);"
+        :
+        : "D" ( self ), "S" ( i )
+        :"%rax", "%rcx"
+    );
+}
+
+static __inline__
+void uint128_or ( uint128_t *self, const uint128_t *i )
+{
+    __asm__ __volatile__
+    (
+        "mov (%%rsi), %%rax;"
+        "mov 8(%%rsi), %%rcx;"
+        "or %%rax, (%%rdi);"
+        "or %%rcx, 8(%%rdi);"
+        :
+        : "D" ( self ), "S" ( i )
+        :"%rax", "%rcx"
+    );
+}
+
+static __inline__
+void uint128_orlo ( uint128_t *self, uint64_t i )
+{
+    self -> lo |= i;
+}
+
+static __inline__
+void uint128_xor ( uint128_t *self, const uint128_t *i )
+{
+    __asm__ __volatile__
+    (
+        "mov (%%rsi), %%rax;"
+        "mov 8(%%rsi), %%rcx;"
+        "xor %%rax, (%%rdi);"
+        "xor %%rcx, 8(%%rdi);"
+        :
+        : "D" ( self ), "S" ( i )
+        :"%rax", "%rcx"
+    );
+}
+
+static __inline__
+void uint128_not ( uint128_t *self )
+{
+    __asm__ __volatile__
+    (
+        "mov (%%rdi), %%rax;"
+        "mov 8(%%rdi), %%rcx;"
+        "not %%rax;"
+        "not %%rcx;"
+        "mov %%rax, (%%rdi);"
+        "mov %%rcx, 8(%%rdi);"
+        :
+        : "D" ( self )
+        : "%rax", "%rcx"
+    );
+}
+
+static __inline__
+void uint128_shr ( uint128_t *self, uint32_t i )
+{
+#ifdef HAVE_ICC_SHIFT_BUG
+    if (i > 0) {
+        self->lo >>= i;
+        self->lo  |= self->hi << (64 - i);
+        self->hi >>= i;
+    }
+#else
+    __asm__ __volatile__
+    (
+        "mov %%esi, %%ecx;"
+        "mov 8(%%rdi), %%rax;"
+        "shrd %%cl, %%rax, (%%rdi);"
+        "shr %%cl, %%rax;"
+        "mov %%rax, 8(%%rdi);"
+        :
+        : "D" ( self ), "S" ( i )
+        : "%rax", "%rcx"
+    );
+#endif
+}
+
+static __inline__
+void uint128_shl ( uint128_t *self, uint32_t i )
+{
+    __asm__ __volatile__
+    (
+        "mov %%esi, %%ecx;"
+        "mov (%%rdi), %%rax;"
+        "shld %%cl, %%rax, 8(%%rdi);"
+        "shl %%cl, %%rax;"
+        "mov %%rax, (%%rdi);"
+        :
+        : "D" ( self ), "S" ( i )
+        : "%rax", "%rcx"
+    );
+}
+
+static __inline__
+void uint128_bswap ( uint128_t *self )
+{
+    __asm__ __volatile__
+    (
+        "mov (%%rdi), %%rax;"
+        "mov 8(%%rdi), %%rcx;"
+        "bswap %%rax;"
+        "bswap %%rcx;"
+        "mov %%rax, 8(%%rdi);"
+        "mov %%rcx, (%%rdi);"
+        :
+        : "D" ( self )
+        : "%rax", "%rcx"
+    );
+}
+
+static __inline__
+void uint128_bswap_copy ( uint128_t *to, const uint128_t *from )
+{
+    __asm__ __volatile__
+    (
+        "mov (%%rsi), %%rax;"
+        "mov 8(%%rsi), %%rcx;"
+        "bswap %%rax;"
+        "bswap %%rcx;"
+        "mov %%rax, 8(%%rdi);"
+        "mov %%rcx, (%%rdi);"
+        :
+        : "D" ( to ), "S" ( from )
+        : "%rax", "%rcx"
+    );
+}
+
+static __inline__
+uint32_t uint32_rol ( uint32_t val, uint8_t bits )
+{
+    uint32_t rtn;
+    __asm__ __volatile__
+    (
+        "rol %%cl, %%eax;"
+        : "=a" ( rtn )
+        : "a" ( val ), "c" ( bits )
+    );
+    return rtn;
+}
+
+static __inline__
+uint32_t uint32_ror ( uint32_t val, uint8_t bits )
+{
+    uint32_t rtn;
+    __asm__ __volatile__
+    (
+        "ror %%cl, %%eax;"
+        : "=a" ( rtn )
+        : "a" ( val ), "c" ( bits )
+    );
+    return rtn;
+}
+
+static __inline__
+uint64_t uint64_rol ( uint64_t val, uint8_t bits )
+{
+    uint64_t rtn;
+    __asm__ __volatile__
+    (
+        "rol %%cl, %%rax;"
+        : "=a" ( rtn )
+        : "a" ( val ), "c" ( bits )
+    );
+    return rtn;
+}
+
+static __inline__
+uint64_t uint64_ror ( uint64_t val, uint8_t bits )
+{
+    uint64_t rtn;
+    __asm__ __volatile__
+    (
+        "ror %%cl, %%rax;"
+        : "=a" ( rtn )
+        : "a" ( val ), "c" ( bits )
+    );
+    return rtn;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_arch_impl_ */
diff --git a/interfaces/cc/gcc/x86_64/atomic.h b/interfaces/cc/gcc/x86_64/atomic.h
new file mode 100644
index 0000000..41e3dcb
--- /dev/null
+++ b/interfaces/cc/gcc/x86_64/atomic.h
@@ -0,0 +1,183 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_atomic_
+#define _h_atomic_
+
+#ifndef _h_atomic32_
+#include "atomic32.h"
+#endif
+
+#ifndef _h_atomic64_
+#include "atomic64.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if DFLT_ATOMIC_BITS == 32
+#define ATOMIC_NAME( suffix ) \
+    atomic32_ ## suffix
+typedef int atomic_int;
+#else
+#define ATOMIC_NAME( suffix ) \
+    atomic64_ ## suffix
+typedef long int atomic_int;
+#endif
+
+typedef struct ATOMIC_NAME ( t ) atomic_t;
+
+typedef struct atomic_ptr_t atomic_ptr_t;
+struct atomic_ptr_t
+{
+    void * volatile ptr;
+};
+
+/* ( * v ) */
+#define atomic_read( v ) \
+    ATOMIC_NAME ( read ) ( v )
+
+/* ( * v ) = i */
+#define atomic_set( v, i ) \
+    ATOMIC_NAME ( set ) ( v, i )
+
+/* prior = ( * v ), ( * v ) += i, prior */
+#define atomic_read_and_add( v, i ) \
+    ATOMIC_NAME ( read_and_add ) ( v, i )
+
+/* ( * v ) += i */
+#define atomic_add( v, i ) \
+    ATOMIC_NAME ( add ) ( v, i )
+
+/* ( * v ) += i */
+#define atomic_add_and_read( v, i ) \
+    ATOMIC_NAME ( add_and_read ) ( v, i )
+
+/* ( void ) ++ ( * v ) */
+#define atomic_inc( v ) \
+    ATOMIC_NAME ( inc ) ( v )
+
+/* ( void ) -- ( * v ) */
+#define atomic_dec( v ) \
+    ATOMIC_NAME ( dec ) ( v )
+
+/* -- ( * v ) == 0 */
+#define atomic_dec_and_test( v ) \
+    ATOMIC_NAME ( dec_and_test ) ( v )
+
+/* ++ ( * v ) == 0
+   when atomic_dec_and_test uses predecrement, you want
+   postincrement to this function. so it isn't very useful */
+#define atomic_inc_and_test( v ) \
+    ATOMIC_NAME ( inc_and_test ) ( v )
+
+/* ( * v ) -- == 0
+   HERE's useful */
+#define atomic_test_and_inc( v ) \
+    ATOMIC_NAME ( test_and_inc ) ( v )
+
+/* prior = ( * v ), ( * v ) = ( prior == t ? s : prior ), prior */
+#define atomic_test_and_set( v, s, t ) \
+    ATOMIC_NAME ( test_and_set ) ( v, s, t )
+
+/* N.B. - THIS FUNCTION IS FOR 64 BIT PTRS ONLY */
+static __inline__
+void *atomic_test_and_set_ptr ( atomic_ptr_t *v, void *s, void *t )
+{
+    void *rtn;
+    __asm__ __volatile__
+    (
+        "lock;"
+        "cmpxchg %%rsi,(%%rdi)"
+        : "=a" ( rtn )
+        : "D" ( v ), "S" ( s ), "a" ( t )
+    );
+    return rtn;
+}
+
+/* val = ( * v ), ( ( * v ) = ( val < t ) ? val + i : val ), val */
+#define atomic_read_and_add_lt( v, i, t ) \
+    ATOMIC_NAME ( read_and_add_lt ) ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val <= t ) ? val + i : val ), val */
+#define atomic_read_and_add_le( v, i, t ) \
+    ATOMIC_NAME ( read_and_add_le ) ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val == t ) ? val + i : val ), val */
+#define atomic_read_and_add_eq( v, i, t ) \
+    ATOMIC_NAME ( read_and_add_eq ) ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val != t ) ? val + i : val ), val */
+#define atomic_read_and_add_ne( v, i, t ) \
+    ATOMIC_NAME ( read_and_add_ne ) ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val >= t ) ? val + i : val ), val */
+#define atomic_read_and_add_ge( v, i, t ) \
+    ATOMIC_NAME ( read_and_add_ge ) ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( val > t ) ? val + i : val ), val */
+#define atomic_read_and_add_gt( v, i, t ) \
+    ATOMIC_NAME ( read_and_add_gt ) ( v, i, t )
+
+/* val = ( * v ), ( ( * v ) = ( ( val & 1 ) == 1 ) ? val + i : val ), val */
+#define atomic_read_and_add_odd( v, i ) \
+    ATOMIC_NAME ( read_and_add_odd ) ( v, i )
+
+/* val = ( * v ), ( ( * v ) = ( ( val & 1 ) == 0 ) ? val + i : val ), val */
+#define atomic_read_and_add_even( v, i ) \
+    ATOMIC_NAME ( read_and_add_even ) ( v, i )
+
+/* DEPRECATED */
+
+/* val = ( * v ), ( * v ) = ( val < t ? val + i : val ), ( val < t ? 1 : 0 ) */
+#define atomic_add_if_lt( v, i, t ) \
+    ATOMIC_NAME ( add_if_lt ) ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val <= t ? val + i : val ), ( val <= t ? 1 : 0 ) */
+#define atomic_add_if_le( v, i, t ) \
+    ATOMIC_NAME ( add_if_le ) ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val == t ? val + i : val ), ( val == t ? 1 : 0 ) */
+#define atomic_add_if_eq( v, i, t ) \
+    ATOMIC_NAME ( add_if_eq ) ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val >= t ? val + i : val ), ( val >= t ? 1 : 0 ) */
+#define atomic_add_if_ge( v, i, t ) \
+    ATOMIC_NAME ( add_if_ge ) ( v, i, t )
+
+/* val = ( * v ), ( * v ) = ( val > t ? val + i : val ), ( val > t ? 1 : 0 ) */
+#define atomic_add_if_gt( v, i, t ) \
+    ATOMIC_NAME ( add_if_gt ) ( v, i, t )
+
+#undef LOCK
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_atomic_ */
diff --git a/interfaces/cc/gcc/x86_64/atomic32.h b/interfaces/cc/gcc/x86_64/atomic32.h
new file mode 100644
index 0000000..7584643
--- /dev/null
+++ b/interfaces/cc/gcc/x86_64/atomic32.h
@@ -0,0 +1,365 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_atomic32_
+#define _h_atomic32_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Make sure gcc doesn't try to be clever and move things around
+ * on us. We need to use _exactly_ the address the user gave us,
+ * not some alias that contains the same information.
+ */
+typedef struct atomic32_t atomic32_t;
+struct atomic32_t
+{
+    volatile int counter;
+};
+
+/* int atomic32_read ( const atomic32_t *v ); */
+#define atomic32_read( v ) \
+    ( ( v ) -> counter )
+
+/* void atomic32_set ( atomic32_t *v, int i ); */
+#define atomic32_set( v, i ) \
+    ( ( void ) ( ( ( v ) -> counter ) = ( i ) ) )
+
+/* add to v -> counter and return the prior value */
+static __inline__ int atomic32_read_and_add ( atomic32_t *v, int i )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "mov %3, %1;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+/* if no read is needed, define the least expensive atomic add */
+#define atomic32_add( v, i ) \
+    atomic32_read_and_add ( v, i )
+
+/* add to v -> counter and return the result */
+static __inline__ int atomic32_add_and_read ( atomic32_t *v, int i )
+{
+    int rtn, cmp;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "mov %3, %1;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1,(%2);"
+        "jne 1b;"
+        : "=&a" ( cmp ), "=&r" ( rtn )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+/* just don't try to find out what the result was */
+static __inline__ void atomic32_inc ( atomic32_t *v )
+{
+    __asm__ __volatile__
+    (
+    "lock;"
+        "incl %0"
+        : "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+}
+
+static __inline__ void atomic32_dec ( atomic32_t *v )
+{
+    __asm__ __volatile__
+    (
+    "lock;"
+        "decl %0"
+        : "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+}
+
+/* decrement by one and test result for 0 */
+static __inline__ int atomic32_dec_and_test ( atomic32_t *v )
+{
+    unsigned char c;
+    __asm__ __volatile__
+    (
+    "lock;"
+        "decl %1;"
+        "sete %0"
+        : "=r" ( c ), "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+    return c;
+}
+
+/* when atomic32_dec_and_test uses predecrement, you want
+   postincrement to this function. so it isn't very useful */
+static __inline__ int atomic32_inc_and_test ( atomic32_t *v )
+{
+    unsigned char c;
+    __asm__ __volatile__
+    (
+    "lock;"
+        "incl %1;"
+        "sete %0"
+        : "=r" ( c ), "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+    return c;
+}
+
+/* HERE's useful */
+#define atomic32_test_and_inc( v ) \
+    ( atomic32_read_and_add ( v, 1 ) == 0 )
+
+static __inline__ int atomic32_test_and_set ( atomic32_t *v, int s, int t )
+{
+    int rtn;
+    __asm__ __volatile__
+    (
+    "lock;"
+        "cmpxchg %2, (%1)"
+        : "=a" ( rtn )
+        : "r" ( & v -> counter ), "r" ( s ), "a" ( t )
+    );
+    return rtn;
+}
+
+/* conditional modifications */
+static __inline__
+int atomic32_read_and_add_lt ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jge 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_lt( v, i, t ) \
+    ( atomic32_read_and_add_lt ( v, i, t ) < ( t ) )
+
+static __inline__
+int atomic32_read_and_add_le ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jg 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_le( v, i, t ) \
+    ( atomic32_read_and_add_le ( v, i, t ) <= ( t ) )
+
+static __inline__
+int atomic32_read_and_add_eq ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jne 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_eq( v, i, t ) \
+    ( atomic32_read_and_add_eq ( v, i, t ) == ( t ) )
+
+static __inline__
+int atomic32_read_and_add_ne ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "je 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_ne( v, i, t ) \
+    ( atomic32_read_and_add_ne ( v, i, t ) != ( t ) )
+
+static __inline__
+int atomic32_read_and_add_ge ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jl 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_ge( v, i, t ) \
+    ( atomic32_read_and_add_ge ( v, i, t ) >= ( t ) )
+
+static __inline__
+int atomic32_read_and_add_gt ( atomic32_t *v, int i, int t )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jle 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic32_add_if_gt( v, i, t ) \
+    ( atomic32_read_and_add_gt ( v, i, t ) > ( t ) )
+
+static __inline__
+int atomic32_read_and_add_odd ( atomic32_t *v, int i )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "bt $0, %0;"
+        "mov %3, %1;"
+        "jnc 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+static __inline__
+int atomic32_read_and_add_even ( atomic32_t *v, int i )
+{
+    int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "bt $0, %0;"
+        "mov %3, %1;"
+        "jc 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_atomic32_ */
diff --git a/interfaces/cc/gcc/x86_64/atomic64.h b/interfaces/cc/gcc/x86_64/atomic64.h
new file mode 100644
index 0000000..4a1ce7e
--- /dev/null
+++ b/interfaces/cc/gcc/x86_64/atomic64.h
@@ -0,0 +1,365 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_atomic64_
+#define _h_atomic64_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Make sure gcc doesn't try to be clever and move things around
+ * on us. We need to use _exactly_ the address the user gave us,
+ * not some alias that contains the same information.
+ */
+typedef struct atomic64_t atomic64_t;
+struct atomic64_t
+{
+    volatile long int counter;
+};
+
+/* int atomic64_read ( const atomic64_t *v ); */
+#define atomic64_read( v ) \
+    ( ( v ) -> counter )
+
+/* void atomic64_set ( atomic64_t *v, long int i ); */
+#define atomic64_set( v, i ) \
+    ( ( void ) ( ( ( v ) -> counter ) = ( i ) ) )
+
+/* add to v -> counter and return the prior value */
+static __inline__ long int atomic64_read_and_add ( atomic64_t *v, long int i )
+{
+    long int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "mov %3, %1;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+/* if no read is needed, define the least expensive atomic add */
+#define atomic64_add( v, i ) \
+    atomic64_read_and_add ( v, i )
+
+/* add to v -> counter and return the result */
+static __inline__ long int atomic64_add_and_read ( atomic64_t *v, long int i )
+{
+    long int rtn, cmp;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "mov %3, %1;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1,(%2);"
+        "jne 1b;"
+        : "=&a" ( cmp ), "=&r" ( rtn )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+/* just don't try to find out what the result was */
+static __inline__ void atomic64_inc ( atomic64_t *v )
+{
+    __asm__ __volatile__
+    (
+    "lock;"
+        "incq %0"
+        : "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+}
+
+static __inline__ void atomic64_dec ( atomic64_t *v )
+{
+    __asm__ __volatile__
+    (
+    "lock;"
+        "decq %0"
+        : "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+}
+
+/* decrement by one and test result for 0 */
+static __inline__ int atomic64_dec_and_test ( atomic64_t *v )
+{
+    unsigned char c;
+    __asm__ __volatile__
+    (
+    "lock;"
+        "decq %1;"
+        "sete %0"
+        : "=r" ( c ), "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+    return c;
+}
+
+/* when atomic64_dec_and_test uses predecrement, you want
+   postincrement to this function. so it isn't very useful */
+static __inline__ int atomic64_inc_and_test ( atomic64_t *v )
+{
+    unsigned char c;
+    __asm__ __volatile__
+    (
+    "lock;"
+        "incq %1;"
+        "sete %0"
+        : "=r" ( c ), "=m" ( v -> counter )
+        : "m" ( v -> counter )
+    );
+    return c;
+}
+
+/* HERE's useful */
+#define atomic64_test_and_inc( v ) \
+    ( atomic64_read_and_add ( v, 1L ) == 0 )
+
+static __inline__ long int atomic64_test_and_set ( atomic64_t *v, long int s, long int t )
+{
+    long int rtn;
+    __asm__ __volatile__
+    (
+    "lock;"
+        "cmpxchg %2, (%1)"
+        : "=a" ( rtn )
+        : "r" ( & v -> counter ), "r" ( s ), "a" ( t )
+    );
+    return rtn;
+}
+
+/* conditional modifications */
+static __inline__
+long int atomic64_read_and_add_lt ( atomic64_t *v, long int i, long int t )
+{
+    long int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jge 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic64_add_if_lt( v, i, t ) \
+    ( atomic64_read_and_add_lt ( v, i, t ) < ( t ) )
+
+static __inline__
+long int atomic64_read_and_add_le ( atomic64_t *v, long int i, long int t )
+{
+    long int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jg 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic64_add_if_le( v, i, t ) \
+    ( atomic64_read_and_add_le ( v, i, t ) <= ( t ) )
+
+static __inline__
+long int atomic64_read_and_add_eq ( atomic64_t *v, long int i, long int t )
+{
+    long int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jne 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic64_add_if_eq( v, i, t ) \
+    ( atomic64_read_and_add_eq ( v, i, t ) == ( t ) )
+
+static __inline__
+long int atomic64_read_and_add_ne ( atomic64_t *v, long int i, long int t )
+{
+    long int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "je 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic64_add_if_ne( v, i, t ) \
+    ( atomic64_read_and_add_ne ( v, i, t ) != ( t ) )
+
+static __inline__
+long int atomic64_read_and_add_ge ( atomic64_t *v, long int i, long int t )
+{
+    long int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jl 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic64_add_if_ge( v, i, t ) \
+    ( atomic64_read_and_add_ge ( v, i, t ) >= ( t ) )
+
+static __inline__
+long int atomic64_read_and_add_gt ( atomic64_t *v, long int i, long int t )
+{
+    long int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "cmp %4, %0;"
+        "mov %3, %1;"
+        "jle 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i ), "r" ( t )
+    );
+    return rtn;
+}
+
+#define atomic64_add_if_gt( v, i, t ) \
+    ( atomic64_read_and_add_gt ( v, i, t ) > ( t ) )
+
+static __inline__
+long int atomic64_read_and_add_odd ( atomic64_t *v, long int i )
+{
+    long int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "bt $0, %0;"
+        "mov %3, %1;"
+        "jnc 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+static __inline__
+long int atomic64_read_and_add_even ( atomic64_t *v, long int i )
+{
+    long int rtn, sum;
+    __asm__ __volatile__
+    (
+        "mov (%2), %0;"
+    "1:"
+        "bt $0, %0;"
+        "mov %3, %1;"
+        "jc 2f;"
+        "add %0, %1;"
+    "lock;"
+        "cmpxchg %1, (%2);"
+        "jne 1b;"
+    "2:"
+        : "=&a" ( rtn ), "=&r" ( sum )
+        : "r" ( & v -> counter ), "r" ( i )
+    );
+    return rtn;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_atomic64_ */
diff --git a/interfaces/cc/gcc/x86_64/bitstr.h b/interfaces/cc/gcc/x86_64/bitstr.h
new file mode 100644
index 0000000..b52f525
--- /dev/null
+++ b/interfaces/cc/gcc/x86_64/bitstr.h
@@ -0,0 +1,39 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_bitstr_
+#define _h_bitstr_
+
+/* use 64-bit accumulator, 32-bit word size */
+#define WRDSIZE 32
+#define WRDSHIFT 5
+#define WRD uint32_t
+#define ACC uint64_t
+#define BSWAP( x ) bswap_32 ( x )
+
+#include "../noarch/bitstr.h"
+
+#endif /* _h_bitstr_ */
diff --git a/interfaces/cc/gcc/x86_64/byteswap.h b/interfaces/cc/gcc/x86_64/byteswap.h
new file mode 100644
index 0000000..435a233
--- /dev/null
+++ b/interfaces/cc/gcc/x86_64/byteswap.h
@@ -0,0 +1,89 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_byteswap_
+#define _h_byteswap_
+
+#ifdef _BYTESWAP_H
+#warning "GNU byteswap.h being used"
+#else
+#define _BYTESWAP_H	1234
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* perform single instruction byte swap */
+static __inline__ uint16_t bswap_16 ( uint16_t i )
+{
+    register uint16_t rtn;
+    __asm__
+    (
+        "rorw $8, %w0"
+        : "=r" ( rtn )
+        : "0" ( i )
+        : "cc"
+    );
+    return rtn;
+}
+
+/* perform single instruction byte swap */
+static __inline__ uint32_t bswap_32 ( uint32_t i )
+{
+    register uint32_t rtn;
+    __asm__
+    (
+        "bswap %0"
+        : "=r" ( rtn )
+        : "0" ( i )
+        : "cc"
+    );
+    return rtn;
+}
+
+/* perform multi-instruction byte swap */
+static __inline__ uint64_t bswap_64 ( uint64_t i )
+{
+    register uint64_t rtn;
+    __asm__
+    (
+        "bswap %q0"
+        : "=r" ( rtn )
+        : "0" ( i )
+        : "cc"
+    );
+    return rtn;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _BYTESWAP_H */
+#endif /* _h_byteswap_ */
diff --git a/interfaces/cc/gcc/x86_64/strtol.h b/interfaces/cc/gcc/x86_64/strtol.h
new file mode 100644
index 0000000..ceda47d
--- /dev/null
+++ b/interfaces/cc/gcc/x86_64/strtol.h
@@ -0,0 +1,69 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_strtol_
+#define _h_strtol_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * strtoi32
+ * strtou32
+ *  based upon actual usage
+ */
+#define strtoi32( str, endp, base ) \
+    ( int32_t ) strtol ( str, endp, base )
+
+#define strtou32( str, endp, base ) \
+    ( uint32_t ) strtoul ( str, endp, base )
+
+
+/*--------------------------------------------------------------------------
+ * strtoi64
+ * strtou64
+ *  based upon actual usage
+ */
+#define strtoi64( str, endp, base ) \
+    strtol ( str, endp, base )
+
+#define strtou64( str, endp, base ) \
+    strtoul ( str, endp, base )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_strtol_ */
diff --git a/interfaces/cc/icc/compiler.h b/interfaces/cc/icc/compiler.h
new file mode 100644
index 0000000..d1bf565
--- /dev/null
+++ b/interfaces/cc/icc/compiler.h
@@ -0,0 +1,39 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_compiler_
+#define _h_compiler_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_compiler_ */
+
diff --git a/interfaces/cc/vc++/compiler.h b/interfaces/cc/vc++/compiler.h
new file mode 100644
index 0000000..75a5d3c
--- /dev/null
+++ b/interfaces/cc/vc++/compiler.h
@@ -0,0 +1,72 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_compiler_
+#define _h_compiler_
+
+#include <math.h>
+#include <float.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static __inline
+float roundf( float value_in )
+{
+    return ( value_in < 0 ) ? ceilf ( value_in - 0.5F ) : floorf ( value_in + 0.5F );
+}
+
+#define lroundf( x ) (long int)roundf( x )
+
+static __inline
+double round( double value_in )
+{
+    return ( value_in < 0 ) ? ceil ( value_in - 0.5 ) : floor ( value_in + 0.5 );
+}
+
+typedef double double_t;
+
+#define isnan( x ) _isnan ( x )
+
+static __inline
+float truncf( float value_in )
+{
+	return ( value_in < 0 ) ? ceilf( value_in ) : floorf( value_in );
+}
+
+static __inline
+double trunc( double value_in )
+{
+	return ( value_in < 0 ) ? ceil( value_in ) : floor( value_in );
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_compiler_ */
+
diff --git a/interfaces/cc/vc++/i386/arch-impl.h b/interfaces/cc/vc++/i386/arch-impl.h
new file mode 100644
index 0000000..2494460
--- /dev/null
+++ b/interfaces/cc/vc++/i386/arch-impl.h
@@ -0,0 +1,42 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_arch_impl_
+#define _h_arch_impl_
+
+#ifndef _h_noarch_arch_impl_
+#include "../noarch/arch-impl.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_arch_impl_ */
diff --git a/interfaces/cc/vc++/i386/bitstr.h b/interfaces/cc/vc++/i386/bitstr.h
new file mode 100644
index 0000000..a2e07ef
--- /dev/null
+++ b/interfaces/cc/vc++/i386/bitstr.h
@@ -0,0 +1,39 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_bitstr_
+#define _h_bitstr_
+
+/* use 32-bit accumulator, 16-bit word size */
+#define WRDSIZE 16
+#define WRDSHIFT 4
+#define WRD uint16_t
+#define ACC uint32_t
+#define BSWAP( x ) bswap_16 ( x )
+
+#include "../noarch/bitstr.h"
+
+#endif /* _h_bitstr_ */
diff --git a/interfaces/cc/vc++/noarch/arch-impl.h b/interfaces/cc/vc++/noarch/arch-impl.h
new file mode 100644
index 0000000..a351d37
--- /dev/null
+++ b/interfaces/cc/vc++/noarch/arch-impl.h
@@ -0,0 +1,378 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_noarch_arch_impl_
+#define _h_noarch_arch_impl_
+
+#include <stdint.h>
+
+#ifndef _INC_STDLIB
+#include <stdlib.h>
+#endif
+
+#if _M_IX86_FP == 1
+	#define __SSE__ 1
+#else if _M_IX86_FP == 2
+	#define __SSE2__ 1
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* this table is very simple to calculate
+   but simpler yet to use for lookup */
+static const int8_t lsbit_map [] =
+{
+    -1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
+};
+
+static __inline
+int16_t uint16_lsbit ( uint16_t self )
+{
+    /* detect no bits are set */
+    if ( self == 0 )
+        return -1;
+
+    /* detect bits set in lower byte */
+    if ( ( uint8_t ) self != 0 )
+        return lsbit_map [ ( uint8_t ) self ];
+
+    /* return bit set in upper byte */
+    return lsbit_map [ self >> 8 ] + 8;
+}
+
+static __inline
+int32_t uint32_lsbit ( uint32_t self )
+{
+    /* detect no bits are set */
+    if ( self == 0 )
+        return -1;
+
+    /* detect bits set in lower word */
+    if ( ( uint16_t ) self != 0 )
+        return uint16_lsbit ( ( uint16_t ) self );
+
+    /* return bit set in upper word */
+    return uint16_lsbit ( self >> 16 ) + 16;
+}
+
+static const int8_t msbit_map [] =
+{
+    -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
+};
+
+static __inline
+int16_t uint16_msbit ( uint16_t self )
+{
+    uint8_t upper = ( uint8_t ) ( self >> 8 );
+
+    /* detect no bits are set */
+    if ( self == 0 )
+        return -1;
+
+    /* detect bits set in upper byte */
+    if ( upper != 0 )
+        return msbit_map [ upper ] + 8;
+
+    /* return bit set in lower byte */
+    return msbit_map [ ( uint8_t ) self ];
+}
+
+static __inline
+int32_t uint32_msbit ( uint32_t self )
+{
+    uint16_t upper = ( uint16_t ) ( self >> 16 );
+
+    /* detect no bits are set */
+    if ( self == 0 )
+        return -1;
+
+    /* detect bits set in upper word */
+    if ( upper != 0 )
+        return uint16_msbit ( upper ) + 16;
+
+    /* return bit set in lower word */
+    return uint16_msbit ( ( uint16_t ) self );
+}
+
+typedef struct int128_t int128_t;
+struct int128_t
+{
+    uint64_t lo;
+    int64_t hi;
+};
+
+static __inline
+int64_t int128_hi ( const int128_t *self )
+{
+    return self -> hi;
+}
+
+static __inline
+uint64_t int128_lo ( const int128_t *self )
+{
+    return self -> lo;
+}
+
+static __inline
+void int128_sethi ( int128_t *self, int64_t i )
+{
+    self -> hi = i;
+}
+
+static __inline
+void int128_setlo ( int128_t *self, uint64_t i )
+{
+    self -> lo = i;
+}
+
+typedef struct uint128_t uint128_t;
+struct uint128_t
+{
+    uint64_t lo;
+    uint64_t hi;
+};
+
+static __inline
+uint64_t uint128_hi ( const uint128_t *self )
+{
+    return self -> hi;
+}
+
+static __inline
+uint64_t uint128_lo ( const uint128_t *self )
+{
+    return self -> lo;
+}
+
+static __inline
+void uint128_sethi ( uint128_t *self, uint64_t i )
+{
+    self -> hi = i;
+}
+
+static __inline
+void uint128_setlo ( uint128_t *self, uint64_t i )
+{
+    self -> lo = i;
+}
+
+static __inline
+void int128_add ( int128_t *self, const int128_t *i )
+{
+    uint64_t carry = ( ( const uint32_t* ) self ) [ 0 ] + ( ( const uint32_t* ) i ) [ 0 ];
+    self -> hi += i -> hi;
+    carry = ( ( const uint32_t* ) self ) [ 1 ] + ( ( const uint32_t* ) i ) [ 1 ] + ( carry >> 32 );
+    self -> lo += i -> lo;
+    self -> hi += carry >> 32;
+}
+
+static __inline
+void int128_sub ( int128_t *self, const int128_t *i )
+{
+    int carry = i -> lo > self -> lo;
+    self -> hi -= i -> hi;
+    self -> lo -= i -> lo;
+    self -> hi -= carry;
+}
+
+static __inline
+void int128_sar ( int128_t *self, uint32_t i )
+{
+    if ( i < 64 )
+    {
+        self -> lo = ( self -> hi << ( 64 - i ) ) |  ( self -> lo >> i );
+        self -> hi >>= i;
+    }
+    else
+    {
+        self -> lo = self -> hi >> ( i - 64 );
+        self -> hi >>= 63;
+    }
+}
+
+static __inline
+void int128_shl ( int128_t *self, uint32_t i )
+{
+    if ( i < 64 )
+    {
+        self -> hi = ( self -> hi << i ) | ( int64_t ) ( self -> lo >> ( 64 - i ) );
+        self -> lo <<= i;
+    }
+    else
+    {
+        self -> hi = ( int64_t ) ( self -> lo << ( i - 64 ) );
+        self -> lo = 0;
+    }
+}
+
+static __inline
+void uint128_and ( uint128_t *self, const uint128_t *i )
+{
+    self -> lo &= i -> lo;
+    self -> hi &= i -> hi;
+}
+
+static __inline
+void uint128_or ( uint128_t *self, const uint128_t *i )
+{
+    self -> lo |= i -> lo;
+    self -> hi |= i -> hi;
+}
+
+static __inline
+void uint128_orlo ( uint128_t *self, uint64_t i )
+{
+    self -> lo |= i;
+}
+
+static __inline
+void uint128_xor ( uint128_t *self, const uint128_t *i )
+{
+    self -> lo ^= i -> lo;
+    self -> hi ^= i -> hi;
+}
+
+static __inline
+void uint128_not ( uint128_t *self )
+{
+    self -> lo = ~ self -> lo;
+    self -> hi = ~ self -> hi;
+}
+
+static __inline
+void uint128_shr ( uint128_t *self, uint32_t i )
+{
+    if ( i < 64 )
+    {
+        self -> lo = ( self -> hi << ( 64 - i ) ) |  ( self -> lo >> i );
+        self -> hi >>= i;
+    }
+    else
+    {
+        self -> lo = self -> hi >> ( i - 64 );
+        self -> hi >>= 63;
+    }
+}
+
+static __inline
+void uint128_shl ( uint128_t *self, uint32_t i )
+{
+    if ( i < 64 )
+    {
+        self -> hi = ( self -> hi << i ) | ( self -> lo >> ( 64 - i ) );
+        self -> lo <<= i;
+    }
+    else
+    {
+        self -> hi = self -> lo << ( i - 64 );
+        self -> lo = 0;
+    }
+}
+
+static __inline
+void uint128_bswap ( uint128_t *self )
+{
+    uint64_t tmp = _byteswap_uint64 ( self -> lo );
+    self -> lo = _byteswap_uint64 ( self -> hi );
+    ( ( uint64_t* ) self ) [ 1 ] = tmp;
+}
+
+static __inline
+void uint128_bswap_copy ( uint128_t *to, const uint128_t *from )
+{
+    to -> lo = _byteswap_uint64 ( from -> hi );
+    to -> hi = _byteswap_uint64 ( from -> lo );
+}
+
+static __inline__
+uint32_t uint32_rol ( uint32_t val, uint8_t bits )
+{
+    uint32_t rtn;
+    rtn = ( val << bits ) | ( val >> ( 32 - bits ) );
+    return rtn;
+}
+
+static __inline__
+uint32_t uint32_ror ( uint32_t val, uint8_t bits )
+{
+    uint32_t rtn;
+    rtn = ( val >> bits ) | ( val << ( 32 - bits ) );
+    return rtn;
+}
+
+static __inline__
+uint64_t uint64_rol ( uint64_t val, uint8_t bits )
+{
+    uint64_t rtn;
+    rtn = ( val << bits ) | ( val >> ( 64 - bits ) );
+    return rtn;
+}
+
+static __inline__
+uint64_t uint64_ror ( uint64_t val, uint8_t bits )
+{
+    uint64_t rtn;
+    rtn = ( val >> bits ) | ( val << ( 64 - bits ) );
+    return rtn;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_noarch_arch_impl_ */
diff --git a/interfaces/cc/vc++/noarch/bitstr.h b/interfaces/cc/vc++/noarch/bitstr.h
new file mode 100644
index 0000000..88a4c34
--- /dev/null
+++ b/interfaces/cc/vc++/noarch/bitstr.h
@@ -0,0 +1,412 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_noarch_bitstr_
+#define _h_noarch_bitstr_
+
+#ifndef _h_bitstr_
+#error "don't include <noarch/bitstr.h> directly - use <bitstr.h>"
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <byteswap.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* bitcpy                                                                                                                                                                                                    
+ *  copy a string of bits from source to dest                                                                                                                                                                
+ *                                                                                                                                                                                                           
+ *  both source and dest may have non-byte aligned pointers                                                                                                                                                  
+ *  the number of bits to copy need not be byte aligned                                                                                                                                                      
+ *                                                                                                                                                                                                           
+ *  depending upon architecture and OS conventions, the word                                                                                                                                                 
+ *  size may be adjusted to 1, 2, or 4 bytes, where the base                                                                                                                                                 
+ *  pointers are always word aligned.                                                                                                                                                                        
+ *                                                                                                                                                                                                           
+ *  bits in memory are always treated as big-endian, meaning                                                                                                                                                 
+ *  that on multi-byte fetches and stores, we perform byte-swapping                                                                                                                                          
+ *  if there are shifts or masks                                                                                                                                                                             
+ */
+static __inline
+void bitcpy ( void *dbase, bitsz_t doff, const void *sbase, bitsz_t soff, bitsz_t sz )
+{
+    /* noop if sz == 0 */
+    if ( sz != 0 )
+    {
+        /* loop counter and destination word count */
+        size_t i, dcountz;
+
+        /* left & right masks and working register */
+        WRD lmask, rmask, reg;
+
+        /* produce word-aligned pointers */
+#if WRDSIZE == 8
+        /* 1-4. all at once */
+        WRD *dst = ( WRD* ) dbase + ( doff >> WRDSHIFT );
+        const WRD *src = ( const WRD* ) sbase + ( soff >> WRDSHIFT );
+#else
+        /* 1. capture word alignment adjustment */
+        size_t dadjust = ( size_t ) dbase & ( WRDSIZE / 8 - 1 );
+        size_t sadjust = ( size_t ) sbase & ( WRDSIZE / 8 - 1 );
+
+        /* 2. create word-aligned pointers */
+        WRD *dst = ( WRD* ) ( ( size_t ) dbase - dadjust );
+        const WRD *src = ( const WRD* ) ( ( size_t ) sbase - sadjust );
+
+        /* 3. incorporate alignment adjustment into offset bits */
+        doff += dadjust << 3;
+        soff += sadjust << 3;
+
+        /* 4. readjust pointers based upon offset */
+        dst += doff >> WRDSHIFT;
+        src += soff >> WRDSHIFT;
+#endif
+        /* 5. restate offsets */
+        doff &= ( WRDSIZE - 1 );
+        soff &= ( WRDSIZE - 1 );
+
+        /* calculate number of words - 1 in dst */
+        dcountz = ( size_t ) ( ( doff + sz + ( WRDSIZE - 1 ) - WRDSIZE ) >> WRDSHIFT );
+
+        /* calculate masks */
+        lmask = rmask = ~ 0;
+        lmask >>= doff;
+        rmask >>= ( doff + sz ) & ( WRDSIZE - 1 );
+        if ( ( WRD ) ( rmask + 1 ) == 0 )
+            rmask = 0;
+
+        /* prime register with masked dst [ 0 ] */
+        reg = BSWAP ( dst [ 0 ] ) & ~ lmask;
+
+        /* if source and destination are aligned */
+        if ( doff == soff )
+        {
+            /* merge src [ 0 ] into reg through mask */
+            reg |= BSWAP ( src [ 0 ] ) & lmask;
+
+#if WRDSIZE > 8
+            /* straight copies don't need byteswap                                                                                                                                                           
+               other than on first and last words                                                                                                                                                            
+               put first word back into little-endian                                                                                                                                                        
+               for remainder of loop */
+            if ( dcountz > 0 )
+            {
+                reg = BSWAP ( reg );
+#endif
+                /* aligned buffers have n:n word ratio */
+                for ( i = 0; i < dcountz; )
+                {
+                    dst [ i ] = reg;
+                    reg = src [ ++ i ];
+                }
+
+#if WRDSIZE > 8
+                /* revert to big-endian */
+                reg = BSWAP ( reg );
+            }
+#endif
+        }
+
+        /* shifting alignment  */
+        else
+        {
+            /* source count may differ from dest count */
+            size_t scountz = ( size_t ) ( ( soff + sz + ( WRDSIZE - 1 ) - WRDSIZE ) >> WRDSHIFT );
+
+            /* use double-word accumulator */
+            ACC acc = BSWAP ( src [ 0 ] );
+
+            /* shift amount */
+            int shift = ( int ) doff - ( int ) soff;
+            if ( shift > 0 )
+            {
+                /* take only valid bits in shifted initial src */
+                reg |= ( WRD ) ( acc >> shift ) & lmask;
+
+                /* because "shift" > 0, we know "dcountz" >= "scountz" */
+                for ( acc <<= WRDSIZE, i = 0; i < scountz; acc <<= WRDSIZE )
+                {
+                    dst [ i ] = BSWAP ( reg );
+                    acc |= BSWAP ( src [ ++ i ] );
+                    reg = ( WRD ) ( acc >> shift );
+                }
+
+                /* if "dcountz" > "scountz" */
+                if ( i < dcountz )
+                {
+                    dst [ i ] = BSWAP ( reg );
+                    reg = ( WRD ) ( acc >> shift );
+                }
+            }
+
+            else
+            {
+                /* need single word read-ahead and right-shift */
+                shift += WRDSIZE;
+
+                /* because "shift" was < 0, we know "dcountz" <= "scountz" */
+                for ( acc <<= WRDSIZE, i = 0; i < dcountz; acc <<= WRDSIZE )
+                {
+                    acc |= BSWAP ( src [ i + 1 ] );
+                    reg |= ( WRD ) ( acc >> shift ) & lmask;
+                    dst [ i ++ ] = BSWAP ( reg );
+                    lmask = ~ 0;
+                    reg = 0;
+                }
+
+                /* if "dcountz" < "scountz" */
+                if ( i < scountz )
+                    acc |= BSWAP ( src [ scountz ] );
+
+                reg |= ( WRD ) ( acc >> shift ) & lmask;
+            }
+        }
+
+        /* mask off unused bytes from src */
+        reg &= ~ rmask;
+
+        /* bring in saved bits from dst */
+        reg |= BSWAP ( dst [ dcountz ] ) & rmask;
+
+        /* write out last word */
+        dst [ dcountz ] = BSWAP ( reg );
+    }
+}
+
+/* bitcmp
+ *  performs bitwise a - b, returning result as int
+ *  result value has no meaning, only sign
+ *  where < 0 means a < b, > 0 means a > b, and 0 means a == b
+ *
+ *  since the comparison produces a tri-state indicator of
+ *  relative magnitude, the order of "a" and "b" is important.
+ *  furthermore, the difference operator must be evaluated
+ *  left to right, because the result indicates more than
+ *  equality.
+ *
+ *  see bitcpy for general word alignment information
+ */
+static __inline
+int bitcmp ( const void *abase, bitsz_t aoff, const void *bbase, bitsz_t boff, bitsz_t sz )
+{
+    int diff = 0;
+
+    if ( sz != 0 )
+    {
+        /* loop counter and left word count */
+        size_t i, lcountz;
+
+        /* left & right masks and working registers */
+        WRD lmask, rmask, lreg, rreg;
+
+        /* produce word-aligned pointers */
+#if WRDSIZE == 8
+        /* 1-4. all at once */
+        const WRD *left = ( const WRD* ) abase + ( aoff >> WRDSHIFT );
+        const WRD *right = ( const WRD* ) bbase + ( boff >> WRDSHIFT );
+#else
+        /* 1. capture word alignment adjustment */
+        size_t aadjust = ( size_t ) abase & ( WRDSIZE / 8 - 1 );
+        size_t badjust = ( size_t ) bbase & ( WRDSIZE / 8 - 1 );
+
+        /* 2. create word-aligned pointers */
+        const WRD *left = ( const WRD* ) ( ( size_t ) abase - aadjust );
+        const WRD *right = ( const WRD* ) ( ( size_t ) bbase - badjust );
+
+        /* 3. incorporate alignment adjustment into offset bits */
+        aoff += aadjust << 3;
+        boff += badjust << 3;
+
+        /* 4. readjust pointers based upon offset */
+        left += aoff >> WRDSHIFT;
+        right += boff >> WRDSHIFT;
+#endif
+        /* 5. restate offsets */
+        aoff &= ( WRDSIZE - 1 );
+        boff &= ( WRDSIZE - 1 );
+
+        /* calculate number of words - 1 in left
+           since we know a-priori that "sz" > 0, we
+           know that the left and right counts must be
+           at least 1. our loops treat the last word
+           specially, so calculate a loop counter that
+           excludes the last word */
+        lcountz = ( size_t ) ( ( aoff + sz + ( WRDSIZE - 1 ) - WRDSIZE ) >> WRDSHIFT );
+
+        /* calculate masks */
+        lmask = rmask = ~ 0;
+        lmask >>= aoff;
+        rmask >>= ( aoff + sz ) & ( WRDSIZE - 1 );
+        if ( ( WRD ) ( rmask + 1 ) == 0 )
+            rmask = 0;
+
+        /* significant bits from left [ 0 ] */
+        lreg = BSWAP ( left [ 0 ] ) & lmask;
+
+        /* if source and destination are aligned */
+        if ( aoff == boff )
+        {
+            /* test against right bits through mask */
+            rreg = BSWAP ( right [ 0 ] ) & lmask;
+
+            /* produce a difference of all but the last
+               aligned word, where initial word has been
+               left-masked. the last word is tested below. */
+            for ( i = 1; i <= lcountz; ++ i )
+            {
+                diff = ( int ) lreg - ( int ) rreg;
+                if ( diff != 0 )
+                    return diff;
+
+                /* byte-swapping occurs on little-endian architectures */
+                lreg = BSWAP ( left [ i ] );
+                rreg = BSWAP ( right [ i ] );
+            }
+
+            /* fall out to end for masked comparison of last word */
+        }
+
+        /* shifting alignment */
+        else
+        {
+            /* right count may differ from left count
+               since alignments differ, the span of "sz"
+               bits may hit a different number of words in
+               the left array than in the right. */
+            size_t rcountz = ( size_t ) ( ( boff + sz + ( WRDSIZE - 1 ) - WRDSIZE ) >> WRDSHIFT );
+
+            /* use double-word accumulator
+               note that the extra bits get ignored */
+            ACC acc = BSWAP ( right [ 0 ] );
+
+            /* shift amount: positive if "b" needs to be right shifted.
+               NOTE - since the comparison must be successively performed
+               from left to right ( see above ), shifting is ALWAYS toward
+               right, making for special handling when "shift" < 0 ( see below ) */
+            int shift = ( int ) aoff - ( int ) boff;
+            if ( shift > 0 )
+            {
+                /* initial word from right operand, aligned with left */
+                rreg = ( WRD ) ( acc >> shift ) & lmask;
+
+                /* "shift" > 0 means "lcountz" >= "rcountz" */
+                for ( acc <<= WRDSIZE, i = 1; i <= rcountz; acc <<= WRDSIZE, ++ i )
+                {
+                    /* compare words at i-1 */
+                    diff = ( int ) lreg - ( int ) rreg;
+                    if ( diff != 0 )
+                        return diff;
+
+                    /* accumulate next word from right operand */
+                    acc |= BSWAP ( right [ i ] );
+
+                    /* bring in next word from left operand */
+                    lreg = BSWAP ( left [ i ] );
+
+                    /* produce aligned word from right operand */
+                    rreg = ( WRD ) ( acc >> shift );
+                }
+
+                /* if there is one more word in left */
+                if ( lcountz > rcountz )
+                {
+                    /* compare penultimate */
+                    diff = ( int ) lreg - ( int ) rreg;
+                    if ( diff != 0 )
+                        return diff;
+
+                    /* get last word in left */
+                    lreg = BSWAP ( left [ lcountz ] );
+
+                    /* last word from right is already in "acc" */
+                    rreg = ( WRD ) ( acc >> shift );
+                }
+
+                /* fall out to end for masked comparison of last word */
+            }
+
+            else
+            {
+                /* since all shifts must be toward right ( due to left to right
+                   comparison ), this alignment will require a pre-fetch from
+                   right operand into accumulator, and adjusting the negative
+                   shift amount to a positive right-shift. */
+                shift += WRDSIZE;
+
+                /* since "shift" was negative, we know "lcountz" <= "rcountz",
+                   so use "lcountz" as loop limit. pre-shift "acc" as loop init */
+                for ( acc <<= WRDSIZE, i = 1; i <= lcountz; acc <<= WRDSIZE, ++ i )
+                {
+                    /* accumulate next word from right operand */
+                    acc |= BSWAP ( right [ i ] );
+
+                    /* produce aligned word from right operand */
+                    rreg = ( WRD ) ( acc >> shift ) & lmask;
+
+                    /* now test against left */
+                    diff = ( int ) lreg - ( int ) rreg;
+                    if ( diff != 0 )
+                        return diff;
+
+                    /* bring in next word from left operand */
+                    lreg = BSWAP ( left [ i ] );
+
+                    /* no more left mask */
+                    lmask = ~ 0;
+                }
+
+                /* if there is one more word in right */
+                if ( lcountz < rcountz )
+                    acc |= BSWAP ( right [ rcountz ] );
+
+                /* produce "rreg" from "acc" */
+                rreg = ( WRD ) ( acc >> shift ) & lmask;
+
+                /* fall out to end for masked comparison of last word */
+            }
+        }
+
+        /* mask off unused bytes from right */
+        lreg &= ~ rmask;
+        rreg &= ~ rmask;
+
+        /* perform final comparison */
+        diff = ( int ) lreg - ( int ) rreg;
+    }
+
+    return diff;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_noarch_bitstr_ */
diff --git a/interfaces/cc/vc++/stdbool.h b/interfaces/cc/vc++/stdbool.h
new file mode 100644
index 0000000..4807cb4
--- /dev/null
+++ b/interfaces/cc/vc++/stdbool.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _STDBOOL_H
+#define _STDBOOL_H
+
+/*--------------------------------------------------------------------------
+ * bool
+ */
+
+#ifndef __cplusplus
+typedef unsigned char bool;
+
+#undef true
+#define true 1
+
+#undef false
+#define false 0
+
+#endif
+
+
+#endif /* _STDBOOL_H */
diff --git a/interfaces/cc/vc++/stdint.h b/interfaces/cc/vc++/stdint.h
new file mode 100644
index 0000000..44c124d
--- /dev/null
+++ b/interfaces/cc/vc++/stdint.h
@@ -0,0 +1,50 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _STDINT_H
+#define _STDINT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* perhaps not the best place for this, but it helps reduce the
+   number of artificial includes for compatibility */
+#ifndef __inline__
+#define __inline__ __inline
+#endif
+
+#ifndef __func__
+#define __func__ __FUNCTION__
+#endif
+
+#include <../include/stdint.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/interfaces/cc/vc++/va_copy.h b/interfaces/cc/vc++/va_copy.h
new file mode 100644
index 0000000..76fc7c7
--- /dev/null
+++ b/interfaces/cc/vc++/va_copy.h
@@ -0,0 +1,43 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_va_copy_
+#define _h_va_copy_
+
+#include <STDARG.H>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define va_copy( dst, src ) \
+    ( dst ) = ( src )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_va_copy_ */
diff --git a/interfaces/cc/vc++/x86_64/arch-impl.h b/interfaces/cc/vc++/x86_64/arch-impl.h
new file mode 100644
index 0000000..2494460
--- /dev/null
+++ b/interfaces/cc/vc++/x86_64/arch-impl.h
@@ -0,0 +1,42 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_arch_impl_
+#define _h_arch_impl_
+
+#ifndef _h_noarch_arch_impl_
+#include "../noarch/arch-impl.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_arch_impl_ */
diff --git a/interfaces/cc/vc++/x86_64/bitstr.h b/interfaces/cc/vc++/x86_64/bitstr.h
new file mode 100644
index 0000000..b52f525
--- /dev/null
+++ b/interfaces/cc/vc++/x86_64/bitstr.h
@@ -0,0 +1,39 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_bitstr_
+#define _h_bitstr_
+
+/* use 64-bit accumulator, 32-bit word size */
+#define WRDSIZE 32
+#define WRDSHIFT 5
+#define WRD uint32_t
+#define ACC uint64_t
+#define BSWAP( x ) bswap_32 ( x )
+
+#include "../noarch/bitstr.h"
+
+#endif /* _h_bitstr_ */
diff --git a/interfaces/csra2/csra2.vschema b/interfaces/csra2/csra2.vschema
new file mode 100644
index 0000000..91a0b00
--- /dev/null
+++ b/interfaces/csra2/csra2.vschema
@@ -0,0 +1,42 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * Main csra2 database
+ */
+version 1;
+
+include 'csra2/read.vschema';
+include 'csra2/reference.vschema';
+
+/*--------------------------------------------------------------------------
+ * databases
+ */
+database NCBI:csra2:db:aligned #1
+{
+    table NCBI:csra2:view:read #1.0 UNALIGNED;
+    table NCBI:csra2:view:reference #1.0 REFERENCE;
+}
diff --git a/interfaces/csra2/read.vschema b/interfaces/csra2/read.vschema
new file mode 100644
index 0000000..b56e338
--- /dev/null
+++ b/interfaces/csra2/read.vschema
@@ -0,0 +1,255 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * General read table which will be inherited by others
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'insdc/insdc.vschema';
+include 'csra2/stats.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * tables
+ */
+table NCBI:csra2:tbl:read #1.0 = NCBI:csra2:tbl:read_stats #1
+{
+    /* CHUNK_SZ
+     *  describes the maximum number of bases in any row
+     *
+     *  if present, allows a single sequence to be broken into multiple rows
+     *  where this value gives the limit on the number of bases in any row.
+     *
+     *  the sequence will be split across some number of rows, depending upon
+     *  the value of CHUNK_SZ. if length ( seq ) > CHUNK_SZ, then there will
+     *  be multiple rows, where all but the last will have a length of CHUNK_SZ.
+     *  the last ( or only ) row will have a length of length(seq)%CHUNK_SIZE.
+     */
+    extern column INSDC:coord:len CHUNK_SZ;
+
+
+    /* READ
+     *  base calls
+     */
+
+    // textual representation
+    extern default column INSDC:dna:text READ
+    {
+        read = out_dna_text;
+        validate = < INSDC:dna:text > compare ( in_dna_text, out_dna_text );
+    }
+
+    // 4na representation - unpacked
+    extern column INSDC:4na:bin READ
+        = out_4na_bin
+        ;
+
+
+    /* QUALITY
+     *  phred-score quality values
+     */
+    extern default column INSDC:quality:phred QUALITY
+        = out_qual_phred
+        ;
+    extern column INSDC:quality:text:phred_33 QUALITY
+        = ( INSDC:quality:text:phred_33 ) < B8 > sum < 33 > ( out_qual_phred )
+        ;
+    extern column INSDC:quality:text:phred_64 QUALITY
+        = ( INSDC:quality:text:phred_64 ) < B8 > sum < 64 > ( out_qual_phred )
+        ;
+
+    /* ---------------------------- optional columns ---------------------------- */
+
+    /* RD_ID
+     * RD_GROUP
+     *  reports group and id of current row
+     */
+    extern column I64 RD_ID;
+    extern column ascii RD_GROUP;
+
+    /* RD_FILTER
+     *  records filter value if used
+     */
+    extern column INSDC:SRA:read_filter RD_FILTER;
+
+
+    /* ---------------------------- input rules ---------------------------- */
+
+    // input text
+    INSDC:dna:text in_dna_text
+        = < INSDC:dna:text, INSDC:dna:text > map < '.acmgrsvtwyhkdbn','NACMGRSVTWYHKDBN' > ( READ )
+        ;
+
+    // input 4na bin
+    INSDC:4na:bin in_4na_bin
+        = < INSDC:4na:bin > range_validate < 0, 15 > ( READ )
+        | < INSDC:dna:text, INSDC:4na:bin > map < INSDC:4na:map:CHARSET, INSDC:4na:map:BINSET > ( in_dna_text )
+        ;
+
+    // input 2na bin
+    INSDC:2na:bin in_2na_bin
+        = INSDC:SEQ:rand_4na_2na ( in_4na_bin )
+        ;
+
+    // input 4na alt-read ( ambiguities )
+    INSDC:4na:bin in_alt_4na_bin
+        = < INSDC:4na:bin, INSDC:4na:bin > map < INSDC:4na:map:BINSET, [ 15,0,0,3,0,5,6,7,0,9,10,11,12,13,14,15 ] > ( in_4na_bin )
+        ;
+
+    // feed the statistics
+    INSDC:4na:bin in_stats_seq = in_4na_bin;
+    
+    // quality
+    INSDC:quality:text:phred_33 in_qual_text_phred_33 = QUALITY;
+    INSDC:quality:text:phred_64 in_qual_text_phred_64 = QUALITY;
+
+    INSDC:quality:phred in_qual_phred
+        = QUALITY
+        | ( INSDC:quality:phred ) < B8 > diff < 33 > ( in_qual_text_phred_33 )
+        | ( INSDC:quality:phred ) < B8 > diff < 64 > ( in_qual_text_phred_64 )
+        ;
+
+    // feed the statistics
+    INSDC:quality:phred in_stats_qual_phred = in_qual_phred;
+
+    ascii in_stats_read_group
+        = in_stats_spot_group
+        | RD_GROUP
+        ;
+
+
+    /* ---------------------------- physical columns ---------------------------- */
+
+    physical column INSDC:2na:packed .READ
+        = ( INSDC:2na:packed ) pack ( in_2na_bin )
+        ;
+
+    physical column < INSDC:4na:bin > zip_encoding .ALTREAD
+        = < INSDC:4na:bin > trim < 0, 0 > ( in_alt_4na_bin )
+        ;
+
+    physical column < INSDC:quality:phred > delta_average_zip_encoding .QUALITY
+        = in_qual_phred
+        ;
+
+
+    /* ---------------------------- output rules ---------------------------- */
+
+    // output 2na packed
+    INSDC:2na:packed out_2na_packed
+        = .READ
+        ;
+
+    // output 2na bin
+    INSDC:2na:bin out_2na_bin
+        = ( INSDC:2na:bin ) unpack ( out_2na_packed )
+        ;
+
+    // output 2na->4na bin
+    INSDC:4na:bin out_2na_4na_bin
+        = < INSDC:2na:bin, INSDC:4na:bin > map < INSDC:2na:map:BINSET, [ 1, 2, 4, 8 ] > ( out_2na_bin )
+        ;
+
+    // output 4na bin
+    INSDC:4na:bin out_4na_bin
+        = < INSDC:4na:bin > bit_or < ALIGN_RIGHT > ( out_2na_4na_bin, .ALTREAD )
+        | out_2na_4na_bin
+        ;
+    
+    // output text
+    INSDC:dna:text out_dna_text
+        = < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_4na_bin )
+        ;
+    
+    // output quality
+    INSDC:quality:phred out_qual_phred
+        = .QUALITY
+        | < INSDC:quality:phred > echo < 30 > ( out_4na_bin )
+        ;
+}
+
+
+/*--------------------------------------------------------------------------
+ * views
+ */
+table NCBI:csra2:view:read #1.0 =
+    NCBI:csra2:tbl:read #1.0
+{
+    /* CHUNK_SIZE
+     *  describes the maximum number of bases in any row
+     *
+     *  if present, allows a single sequence to be broken into multiple rows
+     *  where this value gives the limit on the number of bases in any row.
+     *
+     *  the sequence will be split across some number of rows, depending upon
+     *  the value of CHUNK_SIZE. if length ( seq ) > CHUNK_SIZE, then there will
+     *  be multiple rows, where all but the last will have a length of CHUNK_SIZE.
+     *  the last ( or only ) row will have a length of length(seq)%CHUNK_SIZE.
+     */
+    readonly column INSDC:coord:len CHUNK_SIZE
+        = .CHUNK_SZ
+        | < INSDC:coord:len > echo < 0xFFFFFFFF > ()
+        ;
+    
+    /* READ
+     *  generate remaining 4 types
+     */
+    readonly column INSDC:4na:packed READ
+        = ( INSDC:4na:packed ) pack ( out_4na_bin )
+        ;
+    readonly column INSDC:x2na:bin READ
+        = < INSDC:4na:bin, INSDC:x2na:bin > map < INSDC:4na:map:BINSET, [ 4,0,1,4,2,4,4,4,3,4,4,4,4,4,4,4 ] > ( out_4na_bin )
+        ;
+    readonly column INSDC:2na:bin READ
+        = out_2na_bin
+        ;
+    readonly column INSDC:2na:packed READ
+        = out_2na_packed
+        ;
+
+    /* READ_ID
+     * READ_GROUP
+     *  reports group and id of current row
+     */
+    readonly column I64 READ_ID
+        = .RD_ID
+        | row_id ()
+        ;
+    readonly column ascii READ_GROUP
+        = .RD_GROUP
+        | < ascii > echo < '' > ()
+        ;
+
+    /* READ_FILTER
+     *  records filter value if used
+     */
+    readonly column INSDC:SRA:read_filter READ_FILTER
+        = .RD_FILTER
+        | < INSDC:SRA:read_filter > echo < SRA_READ_FILTER_PASS > ()
+        ;
+}
diff --git a/interfaces/csra2/reference.vschema b/interfaces/csra2/reference.vschema
new file mode 100644
index 0000000..25fd2f2
--- /dev/null
+++ b/interfaces/csra2/reference.vschema
@@ -0,0 +1,245 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * VDB Alignment types, functions and tables
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'csra2/stats.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * tables
+ */
+table NCBI:csra2:tbl:reference #1.0
+    = NCBI:csra2:tbl:read_stats #1
+{
+    /* CHUNK_SIZE
+     *  describes the maximum number of bases in any cell
+     */
+    extern column INSDC:coord:len CHUNK_SIZE;
+
+    /* CIRCULAR
+     *  true if the reference is circular
+     */
+    extern column bool CIRCULAR;
+
+    /* CANONICAL_NAME
+     *  this should be an accessioned proper name
+     */
+    extern column utf8 CANONICAL_NAME;
+
+    /* COMMON_NAME
+     *  this name may be ambiguous or missing entirely
+     */
+    extern column utf8 COMMON_NAME;
+
+    /* LOCAL_SEQUENCE
+     *  supports name overloading by type
+     */
+    extern default column INSDC:dna:text LOCAL_SEQUENCE
+    {
+        read = out_local_dna_text;
+        validate = < INSDC:dna:text > compare ( in_local_dna_text, out_local_dna_text );
+    }
+    extern column INSDC:4na:bin LOCAL_SEQUENCE = out_local_4na_bin;
+
+    /* PRIMARY_ALIGNMENT_IDS
+     * SECONDARY_ALIGNMENT_IDS
+     *  an index to rows in the PRIMARY_ALIGNMENT and
+     *  SECONDARY_ALIGNMENT tables having alignments 
+     *  STARTING within this chunk
+     *
+     *  the indicies MUST be sorted in clustered order,
+     *  meaning that they are in ascending numeric order
+     */
+    extern column < I64 > izip_encoding PRIMARY_ALIGNMENT_IDS;
+    extern column < I64 > izip_encoding SECONDARY_ALIGNMENT_IDS;
+
+    /* OVERLAP_REF_POS
+     *  min ( REF_POS ) for all alignments intersecting this chunk
+     *  but starting in a previous chunk, where the stored position
+     *  is in reference coordinates.
+     *
+     *  a value of 0 indicates that no alignments starting to
+     *  the left of this chunk also intersect with it.
+     */
+    extern column < INSDC:coord:zero > izip_encoding OVERLAP_REF_POS;
+
+    /* OVERLAP_REF_LEN
+     *  max ( REF_POS + REF_LEN - CHUNK_START ) % CHUNK_SIZE
+     *  for all alignments intersecting this chunk but starting
+     *  in a previous chunk.
+     *
+     *  indicates the amount of this chunk that is needed by
+     *  alignments not starting within chunk. so if a slice on
+     *  this reference were to start at 100 bases into this chunk,
+     *  for example, and the OVERLAP_REF_LEN were 100 or less, then
+     *  there are no alignments from prior chunks that need to be
+     *  considered.
+     */
+    extern column < INSDC:coord:len > izip_encoding OVERLAP_REF_LEN;
+
+    /* COVERAGE
+     *  graphing statistics for the chunk
+     */
+
+    // clipped at 255
+    extern column < U8 > izip_encoding CGRAPH_HIGH;
+    extern column < U8 > izip_encoding CGRAPH_LOW;
+
+    // count of the number of mismatches in the chunk
+    extern column < U32 > izip_encoding CGRAPH_MISMATCHES;
+
+    // count of the number of inserts and deletes in the chunk
+    extern column < U32 > izip_encoding CGRAPH_INDELS;
+
+
+    /* writing rules */
+    INSDC:dna:text in_local_dna_text
+        = < INSDC:dna:text, INSDC:dna:text > map < '.acmgrsvtwyhkdbn','NACMGRSVTWYHKDBN' > ( LOCAL_SEQUENCE );
+        ;
+    INSDC:4na:bin in_local_4na_bin
+        = < INSDC:4na:bin > range_validate < 0, 15 > ( LOCAL_SEQUENCE )
+        | < INSDC:dna:text, INSDC:4na:bin > map < INSDC:4na:map:CHARSET, INSDC:4na:map:BINSET > ( in_local_dna_text )
+        ;
+    INSDC:2na:bin in_local_2na_bin
+        = INSDC:SEQ:rand_4na_2na ( in_local_4na_bin )
+        ;
+    INSDC:4na:bin in_ambig_4na_bin
+        = < INSDC:4na:bin, INSDC:4na:bin > map < INSDC:4na:map:BINSET, [ 15,0,0,3,0,5,6,7,0,9,10,11,12,13,14,15 ] > ( in_local_4na_bin );
+        ;
+
+    INSDC:4na:bin in_stats_seq = in_local_4na_bin;
+
+    /* physical columns for sequence */
+    physical column INSDC:2na:packed .LOCAL_SEQUENCE
+        = ( INSDC:2na:packed ) pack ( in_local_2na_bin )
+        ;
+    physical column < INSDC:4na:bin > zip_encoding .LOCAL_AMBIGUITY
+        = < INSDC:4na:bin > trim < 0, 0 > ( in_ambig_4na_bin )
+        ;
+
+    /* reading rules */
+    INSDC:2na:packed out_local_2na_packed
+        = .LOCAL_SEQUENCE
+        ;
+    INSDC:2na:bin out_local_2na_bin
+        = ( INSDC:2na:bin ) unpack ( out_local_2na_packed )
+        ;
+    INSDC:4na:bin out_local_2na_4na_bin
+        = < INSDC:2na:bin, INSDC:4na:bin > map < INSDC:2na:map:BINSET, [ 1, 2, 4, 8 ] > ( out_local_2na_bin );
+        ;
+    INSDC:4na:bin out_local_4na_bin
+        = < INSDC:4na:bin > bit_or < ALIGN_RIGHT > ( out_local_2na_4na_bin, .LOCAL_AMBIGUITY )
+        ;
+    INSDC:dna:text out_local_dna_text
+        = < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_local_4na_bin )
+        ;
+
+
+    INSDC:coord:len in_local_read_len
+        = ( INSDC:coord:len ) row_len ( in_local_2na_bin )
+        ;
+    INSDC:SRA:xread_type in_local_read_type
+        = < INSDC:SRA:xread_type > echo < SRA_READ_TYPE_BIOLOGICAL > ()
+        ;
+}
+
+
+/*--------------------------------------------------------------------------
+ * "views"
+ */
+table NCBI:csra2:view:reference #1.0
+    = NCBI:csra2:tbl:reference #1.0
+{
+    /* EXTERNAL
+     *  may need to be a function
+     *  it can test the CANONICAL_NAME as in cSRA.v1,
+     *  but if internal it can also check row_length of bases
+     */
+    readonly column bool EXTERNAL
+        = < bool > exists < false > ( .LOCAL_SEQUENCE )
+        | < bool > echo < true > ()
+        ;
+
+    /* SEQUENCE
+     *  available as text, 4na, x2na, 2na
+     */
+    default readonly column INSDC:dna:text SEQUENCE
+        = out_dna_text
+        ;
+    readonly column INSDC:4na:bin SEQUENCE
+        = out_4na_bin
+        ;
+    readonly column INSDC:4na:packed SEQUENCE
+        = ( INSDC:4na:packed ) pack ( out_4na_bin )
+        ;
+    readonly column INSDC:x2na:bin SEQUENCE
+        = < INSDC:4na:bin, INSDC:x2na:bin > map < INSDC:4na:map:BINSET, [ 4,0,1,4,2,4,4,4,3,4,4,4,4,4,4,4 ] > ( out_4na_bin )
+        ;
+    readonly column INSDC:2na:bin SEQUENCE
+        = out_2na_bin
+        ;
+    readonly column INSDC:2na:packed SEQUENCE
+        = pack ( out_2na_bin )
+        ;
+
+    /* QUALITY
+     * This is fake column for compatibility
+     */
+    readonly column INSDC:quality:phred QUALITY
+        = out_qual_phred
+        ;
+
+    /* column aliases */
+    readonly column INSDC:coord:len MAX_SEQ_LEN = .CHUNK_SIZE;
+    readonly column ascii SEQ_ID = cast ( .CANONICAL_NAME );
+
+    /* sequence productions */
+    INSDC:4na:bin out_4na_bin
+        = out_local_4na_bin
+    // TODO:  | sub-select from external table
+        ;
+
+    INSDC:dna:text out_dna_text
+        = < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_4na_bin )
+        ;
+
+    INSDC:2na:bin out_2na_bin
+        = INSDC:SEQ:rand_4na_2na ( out_4na_bin )
+        ;
+
+    /* quality productions */
+    INSDC:quality:phred out_qual_phred
+        = < INSDC:quality:phred > echo < 30 > ( SEQUENCE )
+        ;
+
+    INSDC:quality:phred in_stats_qual_phred = out_qual_phred;
+}
+
diff --git a/interfaces/csra2/stats.vschema b/interfaces/csra2/stats.vschema
new file mode 100644
index 0000000..d89caae
--- /dev/null
+++ b/interfaces/csra2/stats.vschema
@@ -0,0 +1,92 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * NCBI Sequence Read Archive schema
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'insdc/insdc.vschema';
+include 'insdc/sra.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+extern function
+U8 NCBI:csra2:stats_trigger #1 ( B8 read_bin * ascii read_group );
+
+extern function
+U8 NCBI:csra2:phred_stats_trigger #1 ( INSDC:quality:phred qual_bin )
+    = NCBI:SRA:phred_stats_trigger;
+
+/*--------------------------------------------------------------------------
+ * table
+ */
+
+table NCBI:csra2:tbl:read_stats #1
+{
+    readonly column I64 MIN_READ_ID = min_read_id;
+    readonly column I64 MAX_READ_ID = max_read_id;
+    readonly column U64 READ_COUNT  = read_count;
+    readonly column U64 BASE_COUNT  = base_count;
+
+    /* introduce compatibility names */
+    readonly column INSDC:SRA:spotid_t MIN_SPOT_ID = cast ( min_read_id );
+    readonly column INSDC:SRA:spotid_t MAX_SPOT_ID = cast ( max_read_id );
+    readonly column U64 SPOT_COUNT  = read_count;
+
+    /* reading rules */
+    I64 min_read_id
+        = < I64 > meta:value < "STATS/TABLE/READ_MIN" > ()
+        | < I64 > meta:value < "STATS/TABLE/SPOT_MIN" > ()
+        | < I64 > echo < 1 > ()
+        ;
+    I64 max_read_id
+        = < I64 > meta:value < "STATS/TABLE/READ_MAX" > ()
+        | < I64 > meta:value < "STATS/TABLE/SPOT_MAX" > ()
+        | cast ( read_count )
+        ;
+    U64 read_count
+        = < U64 > meta:value < "STATS/TABLE/READ_COUNT" > ()
+        | < U64 > meta:value < "STATS/TABLE/SPOT_COUNT" > ()
+        ;
+    U64 base_count
+        = < U64 > meta:value < "STATS/TABLE/BASE_COUNT" > ()
+        ;
+
+    /* triggers */
+    trigger meta_stats
+        = NCBI:csra2:stats_trigger ( in_stats_seq, in_stats_read_group )
+        | NCBI:csra2:stats_trigger ( in_stats_seq )
+        ;
+        
+    trigger qual_stats
+        = NCBI:csra2:phred_stats_trigger #1 ( in_stats_qual_phred )
+        ;
+}
diff --git a/interfaces/fastq/extern.h b/interfaces/fastq/extern.h
new file mode 100644
index 0000000..219f121
--- /dev/null
+++ b/interfaces/fastq/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_fastq_extern_
+#define _h_fastq_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define FASTQ_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define FASTQ_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_fastq_extern_ */
diff --git a/interfaces/fastq/fq-dump.h b/interfaces/fastq/fq-dump.h
new file mode 100644
index 0000000..ab45eb7
--- /dev/null
+++ b/interfaces/fastq/fq-dump.h
@@ -0,0 +1,110 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_fastq_fq_dump_
+#define _h_fastq_fq_dump_
+
+#ifndef _h_fastq_extern_
+#include <fastq/extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * FastqDumper
+ *  an object capable of producing fastq
+ */
+typedef struct FastqDumper FastqDumper;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+FASTQ_EXTERN rc_t CC FastqDumperAddRef ( const FastqDumper *self );
+FASTQ_EXTERN rc_t CC FastqDumperRelease ( const FastqDumper *self );
+
+
+/* FastqDumperMake
+ *  make an empty dumper
+ */
+FASTQ_EXTERN rc_t CC FastqDumperMake ( FastqDumper **fastq );
+
+
+/* FastqDumperAddSource
+ *  adds an accession/filename/url to be processed
+ */
+FASTQ_EXTERN rc_t CC FastqDumperAddSource ( FastqDumper *self, const char * name );
+
+
+/* FastqDumperEnableSpotSplitting
+ *  spot-splitting is OFF per default
+ */
+FASTQ_EXTERN rc_t CC FastqDumperEnableSpotSplit ( FastqDumper *self );
+
+
+/* FastqDumperEnableClipping
+ *  clipping is OFF per default
+ */
+FASTQ_EXTERN rc_t CC FastqDumperEnableClipping ( FastqDumper *self );
+
+
+/* FastqDumperAddRowRange
+ * default is processing all rows in the source(s)
+ */
+FASTQ_EXTERN rc_t CC FastqDumperAddRowRange ( FastqDumper *self, int64_t range_start, uint64_t count );
+
+
+/* FastqDumperEstimate
+ *  estimates ( because of filtering ) the number of fastq-records
+ *  for gui-tools to setup a progress-bar
+ */
+FASTQ_EXTERN rc_t CC FastqDumperEstimate ( const FastqDumper *self, uint64_t * count );
+
+
+/* FastqDumperSetCallback
+ *  the function will be called for every "fastq-record"
+ */
+FASTQ_EXTERN rc_t CC FastqDumperSetCallback ( FastqDumper *self, 
+    void *data, void ( CC * on_record ) ( uint64_t nr, uint32_t length,
+        const char * seq_id, const char *name,
+        const char * read, const char * quality ) );
+
+
+/* FastqDumperPerform
+ *  performs the requested operations
+ */
+FASTQ_EXTERN rc_t CC FastqDumperPerform ( const FastqDumper *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_fastq_fq_dump_ */
diff --git a/interfaces/hdf5/extern.h b/interfaces/hdf5/extern.h
new file mode 100644
index 0000000..ffa1653
--- /dev/null
+++ b/interfaces/hdf5/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_hdf5_extern_
+#define _h_hdf5_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define HDF5_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define HDF5_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_hdf5_extern_ */
diff --git a/interfaces/hdf5/kdf5.h b/interfaces/hdf5/kdf5.h
new file mode 100644
index 0000000..6564af3
--- /dev/null
+++ b/interfaces/hdf5/kdf5.h
@@ -0,0 +1,89 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdf5_
+#define _h_kdf5_
+
+#ifndef _h_hdf5_extern_
+#include <hdf5/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_kfs_file_
+#include <kfs/file.h>
+#endif
+
+#ifndef _h_kfs_arrayfile_
+#include <kfs/arrayfile.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* MakeHDF5RootDir
+ *
+ *  creates a root-hdf5-directory (in read-only mode)
+ *  from a absolute or relative path
+ *
+ *  "self"     [ IN ]  - directory, used to resolve the path
+ *
+ *  "hdf5_dir" [ OUT ] - return parameter for the created directory
+ *
+ *  "absolute" [ IN ]  - flag: absolute or relative
+ *
+ *  "path"     [ IN ]  - absolute or relative path to hdf5-file
+ */
+HDF5_EXTERN rc_t CC MakeHDF5RootDir ( KDirectory * self, KDirectory ** hdf5_dir, 
+                                      bool absolute, const char *path );
+
+
+/* MakeHDF5ArrayFile
+ *
+ *  creates a KArrayFile (in read-only mode) from a KFile
+ *
+ *  "self"     [ IN ]  - file, this KFile has to be made from a KDirectory
+ *                       the interanly is a HDF5Directory
+ *
+ *  "f"        [ OUT ] - return parameter for the created KArrayFile
+ */
+HDF5_EXTERN rc_t CC MakeHDF5ArrayFile ( const KFile * self, KArrayFile ** f );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kdf5_ */
diff --git a/interfaces/insdc/insdc.h b/interfaces/insdc/insdc.h
new file mode 100644
index 0000000..482ad74
--- /dev/null
+++ b/interfaces/insdc/insdc.h
@@ -0,0 +1,277 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_insdc_insdc_
+#define _h_insdc_insdc_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*==========================================================================
+ * INSDC types, constants
+ */
+
+
+/*--------------------------------------------------------------------------
+ * dna
+ *  represented in IUPAC characters
+ */
+typedef char INSDC_dna_text;
+
+
+/*--------------------------------------------------------------------------
+ * 4na
+ *  nucleotide data with all possible ambiguity
+ *  does not represent all possible EVENTS
+ *
+ *  text encodings use the IUPAC character set
+ *  legal values: [ACMGRSVTWYHKDBNacmgrsvtwyhkdbn.]
+ *  canonical values: [ACMGRSVTWYHKDBN]
+ *
+ *  binary values are 0..15 = { NACMGRSVTWYHKDBN }
+ *
+ *  4na values use bits for each letter:
+ *
+ *       A | C | G | T
+ *    =================
+ *    N    |   |   |
+ *    A  * |   |   |
+ *    C    | * |   |
+ *    M  * | * |   |
+ *    G    |   | * |
+ *    R  * |   | * |
+ *    S    | * | * |
+ *    V  * | * | * |
+ *    T    |   |   | *
+ *    W  * |   |   | *
+ *    Y    | * |   | *
+ *    H  * | * |   | *
+ *    K    |   | * | *
+ *    D  * |   | * | *
+ *    B    | * | * | *
+ *    N  * | * | * | *
+ *
+ *  packed bytes have first base in upper nibble,
+ *  and the following base in lower nibble.
+ *
+ *    bit:  76543210 76543210 76543210
+ *    ================================
+ *    base: 00001111 22223333 44445555 etc.
+ *
+ *  element offsets follow this pattern
+ */
+typedef uint8_t INSDC_4na_bin;
+typedef uint8_t INSDC_4na_packed;
+
+#define INSDC_4na_map_BINSET \
+    { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }
+#define INSDC_4na_map_CHARSET \
+    ".ACMGRSVTWYHKDBN"
+#define INSDC_4na_accept_CHARSET \
+    ".ACMGRSVTWYHKDBNacmgrsvtwyhkdbn"
+
+
+/*--------------------------------------------------------------------------
+ * 2na
+ *  nucleotide data { ATGC }
+ * x2na
+ *  nucleotide data with single ambiguity value
+ *
+ *  text encodings use the IUPAC character set
+ *  legal values: [ACGTNacgtn.]
+ *  canonical values: [ACGTN]
+ *
+ *  binary values are 0..4 = { ACGTN }
+ *
+ *  packed values exclude N:
+ *    A = 0
+ *    C = 1
+ *    G = 2
+ *    T = 3
+ *
+ *  packed bytes have first base in uppermost 2 bits,
+ *  and the following bases in similar fashion:
+ *
+ *    bit:  76543210 76543210
+ *    =======================
+ *    base: 00112233 44556677 etc.
+ *
+ *  element offsets follow this pattern
+ */
+typedef uint8_t INSDC_2na_bin;
+typedef uint8_t INSDC_x2na_bin;
+typedef uint8_t INSDC_2na_packed;
+
+#define INSDC_2na_map_BINSET \
+    { 0,1,2,3 }
+#define INSDC_2na_map_CHARSET \
+    "ACGT"
+#define INSDC_2na_accept_CHARSET \
+    "ACGTacgt"
+#define INSDC_x2na_map_BINSET \
+    { 0,1,2,3,4 }
+#define INSDC_x2na_map_CHARSET \
+    "ACGTN"
+#define INSDC_x2na_accept_CHARSET \
+    "ACGTNacgtn."
+
+
+/*--------------------------------------------------------------------------
+ * color
+ *  color-space data
+ * 2cs
+ *  color-space data 0,1,2,3
+ * x2cs
+ *  color-space data extended with single ambiguity value (.)
+ *
+ *  text encodings use the ASCII numeric character set
+ *  values: [0123.]
+ *
+ *  x2cs values are 0..4 = { 0123. }
+ *
+ *  2cs values exclude '.':
+ *    '0' = 0
+ *    '1' = 1
+ *    '2' = 2
+ *    '3' = 3
+ */
+typedef char INSDC_color_text;
+typedef uint8_t INSDC_2cs_bin;
+typedef uint8_t INSDC_x2cs_bin;
+typedef uint8_t INSDC_2cs_packed;
+
+#define INSDC_2cs_map_BINSET \
+    { 0,1,2,3 }
+#define INSDC_2cs_map_CHARSET \
+    "0123"
+#define INSDC_2cs_accept_CHARSET \
+    "0123"
+#define INSDC_x2cs_map_BINSET \
+    { 0,1,2,3,4 }
+#define INSDC_x2cs_map_CHARSET \
+    "0123."
+#define INSDC_x2cs_accept_CHARSET \
+    "0123."
+#define INSDC_color_default_matrix \
+{                                  \
+    0, 1, 2, 3, 4,                 \
+    1, 0, 3, 2, 4,                 \
+    2, 3, 0, 1, 4,                 \
+    3, 2, 1, 0, 4,                 \
+    4, 4, 4, 4, 4                  \
+}
+
+
+/*--------------------------------------------------------------------------
+ * protein
+ *  represented in IUPAC characters
+ */
+typedef char INSDC_protein_text;
+
+
+/*--------------------------------------------------------------------------
+ * aa
+ *  protein data
+ *  text encodings use the IUPAC character set
+ */
+typedef	uint8_t INSDC_aa_bin;
+
+#define INSDC_aa_map_BINSET \
+    { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 }
+#define INSDC_aa_map_CHARSET \
+    "ABCDEFGHIKLMNPQRSTVWXYZU*OJ"
+#define INSDC_aa_accept_CHARSET \
+    "ABCDEFGHIJKLMNOPQRSTVWXYZU*abcdefghijklmnopqrstvwxyzu"
+
+
+/*--------------------------------------------------------------------------
+ * quality
+ *  quality scoring values
+ *
+ *  phred legal values_ 0..63
+ */
+typedef uint8_t INSDC_quality_phred;
+typedef int8_t INSDC_quality_log_odds;
+
+
+/*--------------------------------------------------------------------------
+ * coordinate
+ *  zero and one based coordinates
+ *  lengths are expressed as unsigned quantities
+ */
+typedef int32_t INSDC_coord_val;
+typedef uint32_t INSDC_coord_len;
+typedef INSDC_coord_val INSDC_coord_zero;
+typedef INSDC_coord_val INSDC_coord_one;
+typedef INSDC_coord_zero INSDC_position_zero;
+typedef INSDC_coord_one INSDC_position_one;
+
+
+/*--------------------------------------------------------------------------
+ * read description
+ *  type and filter constants
+ */
+
+
+/* read type
+ *  describes the type of read within a spot
+ *  the extended version also describes its orientation
+ */
+typedef uint8_t INSDC_read_type;
+enum
+{
+    /* read_type */
+    READ_TYPE_TECHNICAL  = 0,
+    READ_TYPE_BIOLOGICAL = 1,
+
+    /* orientation - applied as bits, e.g.:
+       type = READ_TYPE_BIOLOGICAL | READ_TYPE_REVERSE */
+    READ_TYPE_FORWARD = 2,
+    READ_TYPE_REVERSE = 4
+};
+
+/* read filter
+ */
+typedef uint8_t INSDC_read_filter;
+enum
+{
+    READ_FILTER_PASS = 0,
+    READ_FILTER_REJECT = 1,
+    READ_FILTER_CRITERIA = 2,
+    READ_FILTER_REDACTED = 3
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_insdc_insdc_ */
diff --git a/interfaces/insdc/insdc.vschema b/interfaces/insdc/insdc.vschema
new file mode 100644
index 0000000..8deda52
--- /dev/null
+++ b/interfaces/insdc/insdc.vschema
@@ -0,0 +1,232 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * INSDC types, constants
+ */
+version 1;
+
+
+/*--------------------------------------------------------------------------
+ * dna
+ *  represented in IUPAC characters
+ */
+typedef ascii INSDC:dna:text;
+
+
+/*--------------------------------------------------------------------------
+ * 4na
+ *  nucleotide data with all possible ambiguity
+ *  does not represent all possible EVENTS
+ *
+ *  text encodings use the IUPAC character set
+ *  legal values: [ACMGRSVTWYHKDBNacmgrsvtwyhkdbn.]
+ *  canonical values: [ACMGRSVTWYHKDBN]
+ *
+ *  binary values are 0..15 = { NACMGRSVTWYHKDBN }
+ *
+ *  4na values use bits for each letter:
+ *
+ *       A | C | G | T
+ *    =================
+ *    N    |   |   |
+ *    A  * |   |   |
+ *    C    | * |   |
+ *    M  * | * |   |
+ *    G    |   | * |
+ *    R  * |   | * |
+ *    S    | * | * |
+ *    V  * | * | * |
+ *    T    |   |   | *
+ *    W  * |   |   | *
+ *    Y    | * |   | *
+ *    H  * | * |   | *
+ *    K    |   | * | *
+ *    D  * |   | * | *
+ *    B    | * | * | *
+ *    N  * | * | * | *
+ */
+typedef	U8 INSDC:4na:bin;
+typedef	B1 INSDC:4na:packed [ 4 ];
+
+const INSDC:4na:bin INSDC:4na:map:BINSET
+    = [ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ];
+const INSDC:dna:text INSDC:4na:map:CHARSET
+    = ".ACMGRSVTWYHKDBN";
+const INSDC:dna:text INSDC:4na:accept:CHARSET
+    = ".ACMGRSVTWYHKDBNacmgrsvtwyhkdbn";
+
+
+/*--------------------------------------------------------------------------
+ * 2na  - nucleotide data A,T,G,C
+ * x2na - nucleotide data extended with single ambiguity value (N)
+ *
+ *  text encodings use the IUPAC character set
+ *  legal values: [ACGTNacgtn.]
+ *  canonical values: [ACGTN]
+ *
+ *  x2na values are 0..4 = { ACGTN }
+ *
+ *  2na values exclude N:
+ *    A = 0
+ *    C = 1
+ *    G = 2
+ *    T = 3
+ */
+typedef U8 INSDC:2na:bin;
+typedef U8 INSDC:x2na:bin;
+typedef B1 INSDC:2na:packed [ 2 ];
+
+const INSDC:2na:bin  INSDC:2na:map:BINSET      = [ 0,1,2,3 ];
+const INSDC:dna:text INSDC:2na:map:CHARSET     = "ACGT";
+const INSDC:dna:text INSDC:2na:accept:CHARSET  = "ACGTacgt";
+const INSDC:x2na:bin INSDC:x2na:map:BINSET     = [ 0,1,2,3,4 ];
+const INSDC:dna:text INSDC:x2na:map:CHARSET    = "ACGTN";
+const INSDC:dna:text INSDC:x2na:accept:CHARSET = "ACGTNacgtn.";
+
+
+/*--------------------------------------------------------------------------
+ * color - color-space text
+ * 2cs   - color-space data 0,1,2,3
+ * x2cs  - color-space data extended with single ambiguity value (.)
+ *
+ *  text encodings use the ASCII numeric character set
+ *  values: [0123.]
+ *
+ *  x2cs values are 0..4 = { 0123. }
+ *
+ *  2cs values exclude '.':
+ *    '0' = 0
+ *    '1' = 1
+ *    '2' = 2
+ *    '3' = 3
+ */
+typedef ascii INSDC:color:text;
+typedef U8 INSDC:2cs:bin;
+typedef U8 INSDC:x2cs:bin;
+typedef B1 INSDC:2cs:packed [ 2 ];
+
+const INSDC:2cs:bin  INSDC:2cs:map:BINSET        = [ 0,1,2,3 ];
+const INSDC:color:text INSDC:2cs:map:CHARSET     = "0123";
+const INSDC:color:text INSDC:2cs:accept:CHARSET  = "0123";
+const INSDC:x2cs:bin INSDC:x2cs:map:BINSET       = [ 0,1,2,3,4 ];
+const INSDC:color:text INSDC:x2cs:map:CHARSET    = "0123.";
+const INSDC:color:text INSDC:x2cs:accept:CHARSET = "0123.";
+
+const U8 INSDC:color:default_matrix =
+[
+    0, 1, 2, 3, 4,
+    1, 0, 3, 2, 4,
+    2, 3, 0, 1, 4,
+    3, 2, 1, 0, 4,
+    4, 4, 4, 4, 4
+];
+
+
+/*--------------------------------------------------------------------------
+ * protein
+ *  represented in IUPAC characters
+ */
+typedef ascii INSDC:protein:text;
+
+
+/*--------------------------------------------------------------------------
+ * aa
+ *  protein data
+ *  text encodings use the IUPAC character set
+ */
+typedef	U8 INSDC:aa:bin;
+
+const INSDC:aa:bin INSDC:aa:map:BINSET
+= [ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 ];
+const INSDC:protein:text INSDC:aa:map:CHARSET
+    = "ABCDEFGHIKLMNPQRSTVWXYZU*OJ";
+const INSDC:protein:text INSDC:aa:accept:CHARSET
+    = "ABCDEFGHIJKLMNOPQRSTVWXYZU*abcdefghijklmnopqrstvwxyzu";
+
+
+/*--------------------------------------------------------------------------
+ * quality
+ *  quality scoring values
+ *
+ *  phred legal values: 0..63
+ */
+typedef U8 INSDC:quality:phred;
+typedef I8 INSDC:quality:log_odds;
+
+// text-encoding of quality scores
+// offsets are 33 = '!' and 64 = '@'
+typedef ascii INSDC:quality:text:phred_33;
+typedef ascii INSDC:quality:text:phred_64;
+typedef ascii INSDC:quality:text:log_odds_64;
+
+
+/*--------------------------------------------------------------------------
+ * coordinate
+ *  zero and one based coordinates
+ */
+
+// 32 bit coordinates
+typedef I32 INSDC:coord:val;
+typedef U32 INSDC:coord:len;
+
+// zero or one based coordinate system
+typedef INSDC:coord:val INSDC:coord:zero;
+typedef INSDC:coord:val INSDC:coord:one;
+
+// POSITION types for relating bases to their location in signal
+typedef INSDC:coord:zero INSDC:position:zero;
+typedef INSDC:coord:one INSDC:position:one;
+
+// one-based coordinate limits
+const INSDC:coord:one INSDC:coord:min:one = 0x80000001;
+const INSDC:coord:one INSDC:coord:max:one = 0x3FFFFFFF;
+
+// zero-based coordinate limits
+const INSDC:coord:zero INSDC:coord:min:zero = 0x80000000;
+const INSDC:coord:zero INSDC:coord:max:zero = 0x3FFFFFFE;
+
+/*-------------------------------------------------------------------------
+ * read filters bits
+ */
+typedef U8 INSDC:SRA:read_filter;
+const INSDC:SRA:read_filter SRA_READ_FILTER_PASS = 0;
+const INSDC:SRA:read_filter SRA_READ_FILTER_REJECT = 1;
+const INSDC:SRA:read_filter SRA_READ_FILTER_CRITERIA = 2;
+const INSDC:SRA:read_filter SRA_READ_FILTER_REDACTED = 3;
+
+/*-------------------------------------------------------------------------
+ * read type bits
+ */
+typedef U8 INSDC:SRA:xread_type;
+const INSDC:SRA:xread_type SRA_READ_TYPE_TECHNICAL  = 0;
+const INSDC:SRA:xread_type SRA_READ_TYPE_BIOLOGICAL = 1;
+const INSDC:SRA:xread_type SRA_READ_TYPE_FORWARD    = 2;
+const INSDC:SRA:xread_type SRA_READ_TYPE_REVERSE    = 4;
+
+// original read-types included only technical and biological
+typedef INSDC:SRA:xread_type INSDC:SRA:read_type;
+
diff --git a/interfaces/insdc/seq.vschema b/interfaces/insdc/seq.vschema
new file mode 100644
index 0000000..8fb1b32
--- /dev/null
+++ b/interfaces/insdc/seq.vschema
@@ -0,0 +1,210 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * Sequence schema
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'insdc/insdc.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * rand_4na_2na
+ *  converts 4na to 2na
+ *
+ *  substitutes a random base for ambiguities
+ *  from the bases allowed in the 4na.
+ *
+ *       A | C | G | T
+ *    =================
+ *    N    |   |   |     # any base may be substituted
+ *    A  * |   |   |     # always A
+ *    C    | * |   |     # always C
+ *    M  * | * |   |     # A or C
+ *    G    |   | * |     # always G
+ *    R  * |   | * |     # A or G
+ *    S    | * | * |     # C or G
+ *    V  * | * | * |     # A, C or G
+ *    T    |   |   | *   # always T
+ *    W  * |   |   | *   # A or T
+ *    Y    | * |   | *   # C or T
+ *    H  * | * |   | *   # A, C or T
+ *    K    |   | * | *   # G or T
+ *    D  * |   | * | *   # A, G or T
+ *    B    | * | * | *   # C, G or T
+ *    N  * | * | * | *   # any base may be substituted
+ */
+extern function
+    INSDC:2na:bin INSDC:SEQ:rand_4na_2na #1 ( INSDC:4na:bin rd_bin );
+
+
+/*--------------------------------------------------------------------------
+ * sequence
+ *  basic sequence table
+ *
+ * history:
+ *  1.0.1 - introduced text-mode QUALITY columns
+ */
+table INSDC:tbl:sequence #1.0.1
+{
+    /* READ
+     *  native or converted DNA sequence
+     */
+
+    // default is IUPAC character representation
+    extern default column INSDC:dna:text READ
+    {
+        read = out_dna_text;
+        validate = < INSDC:dna:text > compare ( in_dna_text, out_dna_text );
+    }
+
+    // 4na representation - unpacked and packed
+    extern column INSDC:4na:bin READ = out_4na_bin;
+    extern column INSDC:4na:packed READ = out_4na_packed;
+
+    // x2na representation - 2na with ambiguity
+    extern column INSDC:x2na:bin READ = out_x2na_bin;
+
+    // 2na representation - 2na with no ambiguity - unpacked and packed
+    extern column INSDC:2na:bin READ = out_2na_bin;
+    extern column INSDC:2na:packed READ = out_2na_packed;
+
+
+
+    /* CSREAD
+     *  native or converted color-space sequence
+     */
+
+    // default is ASCII character representation
+    extern default column INSDC:color:text CSREAD
+    {
+        read = out_color_text;
+        validate = < INSDC:color:text > compare ( in_color_text, out_color_text );
+    }
+
+    // x2cs representation - 2cs with ambiguity
+    extern column INSDC:x2cs:bin CSREAD = out_x2cs_bin;
+
+    // 2cs representation - 2cs with no ambiguity - unpacked and packed
+    extern column INSDC:2cs:bin CSREAD = out_2cs_bin;
+    extern column INSDC:2cs:packed CSREAD = out_2cs_packed;
+
+    /* CS_NATIVE
+     *  is color-space the native sequence space
+     */
+    readonly column bool CS_NATIVE = cs_native;
+
+    /* CS_KEY
+     *  leading call given in base-space
+     */
+    extern column INSDC:dna:text CS_KEY
+    {
+        read = out_cs_key;
+        validate = < INSDC:dna:text > compare ( in_cs_key, out_cs_key );
+    }
+
+    /* COLOR_MATRIX
+     *  matrix used for color-space conversions
+     */
+    extern column U8 COLOR_MATRIX = out_color_matrix;
+
+
+    /* QUALITY
+     *  base or color call qualities
+     */
+
+    // PHRED is default
+    extern default column INSDC:quality:phred QUALITY = out_qual_phred;
+
+    // textual encodings
+    extern column INSDC:quality:text:phred_33 QUALITY
+        = out_qual_text_phred_33
+        | ( INSDC:quality:text:phred_33 ) < B8 > sum < 33 > ( out_qual_phred );
+    extern column INSDC:quality:text:phred_64 QUALITY
+        = out_qual_text_phred_64
+        | ( INSDC:quality:text:phred_64 ) < B8 > sum < 64 > ( out_qual_phred );
+
+
+    /* SIGNAL
+     *  signal and intensity information is unspecified
+     */
+    INSDC:coord:len signal_len
+        = ( INSDC:coord:len ) row_len ( out_signal )
+        | < INSDC:coord:len > echo < 0 > ();
+    
+
+	/* VIRTUAL PRODUCTIONS
+	 *  cs_native
+	 *  in_cs_key
+	 *  out_cs_key
+	 *  out_signal
+	 *  in_dna_text
+	 *  out_2cs_bin
+	 *  out_2na_bin
+	 *  out_4na_bin
+	 *  out_dna_text
+	 *  out_x2cs_bin
+	 *  out_x2na_bin
+	 *  in_color_text
+	 *  out_2cs_packed
+	 *  out_2na_packed
+	 *  out_4na_packed
+	 *  out_color_text
+	 *  out_qual_phred
+	 *  out_color_matrix
+	 */
+};
+
+
+/*--------------------------------------------------------------------------
+ * protein
+ *  basic protein sequence table
+ */
+table INSDC:tbl:protein #1
+{
+    /* PROTEIN
+     *  native or converted protein sequence
+     */
+
+    // default is IUPAC character representation
+    extern default column INSDC:protein:text PROTEIN
+    {
+        read = out_protein_text;
+        validate = < INSDC:protein:text > compare ( in_protein_text, out_protein_text );
+    }
+
+    // aa representation
+    extern column INSDC:aa:bin PROTEIN = out_aa_bin;
+
+
+	/* INSDC:tbl:protein productions
+	 *  out_aa_bin
+	 *  in_protein_text
+	 *  out_protein_text
+	 */
+};
diff --git a/interfaces/insdc/sra.h b/interfaces/insdc/sra.h
new file mode 100644
index 0000000..6f5aa71
--- /dev/null
+++ b/interfaces/insdc/sra.h
@@ -0,0 +1,111 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_insdc_sra_
+#define _h_insdc_sra_
+
+#ifndef _h_insdc_insdc_
+#include <insdc/insdc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*==========================================================================
+ * INSDC SRA types, constants
+ */
+
+
+/* spotid_t
+ *  unique id given to every spot
+ */
+typedef int64_t INSDC_SRA_spotid_t;
+
+
+/* spot_ids_found
+ *  returns a tuple of spot ids
+ */
+typedef uint64_t INSDC_SRA_spot_ids_found [ 4 ];
+
+
+/* read filter
+ */
+#define sra_read_filter_t "INSDC:SRA:read_filter"
+typedef INSDC_read_filter INSDC_SRA_read_filter;
+enum
+{
+    SRA_READ_FILTER_PASS = READ_FILTER_PASS,
+    SRA_READ_FILTER_REJECT = READ_FILTER_REJECT,
+    SRA_READ_FILTER_CRITERIA = READ_FILTER_CRITERIA,
+    SRA_READ_FILTER_REDACTED = READ_FILTER_REDACTED
+};
+
+
+/* read type
+ *  describes the type of read within a spot
+ *  the extended version also describes its orientation
+ */
+#define sra_read_type_t "INSDC:SRA:xread_type"
+typedef INSDC_read_type INSDC_SRA_xread_type;
+typedef INSDC_SRA_xread_type INSDC_SRA_read_type;
+enum
+{
+    /* read_type and xread_type */
+    SRA_READ_TYPE_TECHNICAL  = READ_TYPE_TECHNICAL,
+    SRA_READ_TYPE_BIOLOGICAL = READ_TYPE_BIOLOGICAL,
+
+    /* xread_type only - applied as bits, e.g.:
+       type = SRA_READ_TYPE_BIOLOGICAL | SRA_READ_TYPE_REVERSE */
+    SRA_READ_TYPE_FORWARD = READ_TYPE_FORWARD,
+    SRA_READ_TYPE_REVERSE = READ_TYPE_REVERSE
+};
+
+
+/* platform id
+ */
+#define sra_platform_id_t "INSDC:SRA:platform_id"
+typedef uint8_t INSDC_SRA_platform_id;
+enum
+{
+    SRA_PLATFORM_UNDEFINED         = 0,
+    SRA_PLATFORM_454               = 1,
+    SRA_PLATFORM_ILLUMINA          = 2,
+    SRA_PLATFORM_ABSOLID           = 3,
+    SRA_PLATFORM_COMPLETE_GENOMICS = 4,
+    SRA_PLATFORM_HELICOS           = 5,
+    SRA_PLATFORM_PACBIO_SMRT       = 6,
+    SRA_PLATFORM_ION_TORRENT       = 7,
+    SRA_PLATFORM_CAPILLARY         = 8,
+    SRA_PLATFORM_OXFORD_NANOPORE   = 9
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_insdc_sra_ */
diff --git a/interfaces/insdc/sra.vschema b/interfaces/insdc/sra.vschema
new file mode 100644
index 0000000..5cfbfd1
--- /dev/null
+++ b/interfaces/insdc/sra.vschema
@@ -0,0 +1,470 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * INSDC Sequence Read Archive schema
+ */
+version 1;
+
+include 'insdc/seq.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * types
+ */
+
+/* spotid_t
+ *  unique id given to every spot
+ */
+typedef U32 INSDC:SRA:spotid_t;
+
+
+/* spot_ids_found
+ */
+typedef U64 INSDC:SRA:spot_ids_found [ 4 ];
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+
+/* format_spot_name
+ *  given a name format string, X, and Y
+ *  produce a reconstructed spot name string
+ *
+ *  "name_fmt" [ DATA ] - name format string ( see format explanation below )
+ *
+ *  "X" [ DATA ] - X coordinate for spot
+ *
+ *  "Y" [ DATA ] - Y coordinate for spot
+ *
+ *  "spot_name" [ DATA, OPTIONAL ] - potential source of unformatted names
+ *
+ * SYNOPSIS:
+ *  "name_fmt" may have any ASCII characters
+ *  the special character '$' is an escape symbol
+ *  when followed by a recognized format character,
+ *  both the '$' and its format character will be
+ *  replaced with a numeral generated from X and/or Y.
+ *
+ *  when "spot_name" is present and the "name_fmt" row is empty,
+ *  output is taken verbatim from "spot_name"
+ */
+function
+ascii INSDC:SRA:format_spot_name #1 ( ascii name_fmt , I32 X , I32 Y * ascii spot_name );
+
+function
+ascii INSDC:SRA:format_spot_name_no_coord #1 ( ascii name_fmt  * ascii spot_name );
+
+
+/*--------------------------------------------------------------------------
+ * spotcoord
+ *  spot coordinate table
+ *  gives X and Y and potentially other common coordinates
+ */
+table INSDC:SRA:tbl:spotcoord #1
+{
+    /* X, Y
+     *  32 ( or 16 ) bit coordinates within plate region
+     *  the coordinate system ( zero or one-based ) is unspecified
+     */
+    extern default column INSDC:coord:val X = out_x_coord;
+    extern default column INSDC:coord:val Y = out_y_coord;
+
+    // backward compatibility for 16-bit unsigned coordinates
+    extern readonly column U16 X = cast ( x_clip_U16 );
+    extern readonly column U16 Y = cast ( y_clip_U16 );
+
+    // clip signed 32-bit coordinates to unsigned 16-bit
+    INSDC:coord:val x_clip_U16
+        = < INSDC:coord:val > clip < 0, 0xFFFF > ( out_x_coord );
+    INSDC:coord:val y_clip_U16
+        = < INSDC:coord:val > clip < 0, 0xFFFF > ( out_y_coord );
+
+
+	/* INSDC:SRA:tbl:spotcoord virtual productions
+	 *  out_x_coord
+	 *  out_y_coord
+	 */
+};
+
+
+/*--------------------------------------------------------------------------
+ * spotname
+ *  spot name table
+ *  the name column is normally indexed
+ *
+ * history:
+ *  1.0.1 - split X and Y into spotcoord table
+ *  1.0.2 - added ability to get name from TRACE_NAME
+ */
+table INSDC:SRA:tbl:spotname #1.0.2 = INSDC:SRA:tbl:spotcoord #1
+{
+    /* NAME
+     *  external name for spot
+     */
+    extern column ascii NAME = _out_name;
+
+
+    /* SPOT_IDS_FOUND
+     *  lookup by NAME column
+     */
+    readonly column INSDC:SRA:spot_ids_found SPOT_IDS_FOUND
+        =  spot_ids_found;
+
+
+    /* default rules */
+
+    // assemble NAME column output in order of preference
+    ascii _out_name
+        = INSDC:SRA:format_spot_name ( out_name_fmt, out_x_coord, out_y_coord, out_spot_name )
+        | INSDC:SRA:format_spot_name ( out_name_fmt, out_x_coord, out_y_coord )
+        | INSDC:SRA:format_spot_name_no_coord (out_name_fmt)
+        | out_spot_name
+        | out_trace_name
+        ;
+
+
+	/* INSDC:SRA:tbl:spotcoord inherited virtual productions
+	 *  out_x_coord
+	 *  out_y_coord
+	 */
+
+	/* INSDC:SRA:tbl:spotname virtual productions
+	 *  out_name_fmt
+	 *  out_spot_name
+	 *  spot_ids_found
+	 */
+};
+
+
+/*--------------------------------------------------------------------------
+ * spotdesc
+ *  spot descriptor table
+ *
+ * history:
+ *  1.0.1 - base explicitly upon sequence #1.0.1
+ *  1.0.2 - added alternate taps for in_read_type and in_read_len
+ */
+table INSDC:SRA:tbl:spotdesc #1.0.2 = INSDC:tbl:sequence #1.0.1
+{
+    /* NREADS
+     *  describes the number of reads within spot
+     */
+    extern column U8 NREADS = out_nreads;
+
+
+    /* SPOT_LEN
+     *  length of sequence
+     * FIXED_SPOT_LEN
+     *  non-zero if sequence length is fixed throughout table
+     */
+    readonly column INSDC:coord:len SPOT_LEN = spot_len;
+    readonly column INSDC:coord:len FIXED_SPOT_LEN = fixed_spot_len;
+
+
+    /* TRIM_START
+     * TRIM_LEN
+     *  define the spot segment after applying trimming
+     *  trimming may be based upon technical segments and read quality
+     */
+    readonly column INSDC:coord:zero TRIM_START
+        = trim_start
+        | < INSDC:coord:zero> echo < 0 > ();
+    readonly column INSDC:coord:one TRIM_START
+        = ( INSDC:coord:one ) < I32 > sum < 1 > ( trim_start )
+        | < INSDC:coord:one> echo < 1 > ();
+    readonly column INSDC:coord:len TRIM_LEN
+        = trim_len
+        | spot_len;
+
+
+    /* LABEL
+     * LABEL_START, LABEL_LEN
+     *  column pair for writing read labels
+     *  the label text for all reads is concatenated to form the LABEL row
+     *  starting coordinates and lengths delineate labels by read
+     *
+     * NB - row length for LABEL_START/LEN === NREADS,
+     *      row length for LABEL === SUM ( LABEL_LEN [ n ] ) for NREADS
+     */
+    extern column ascii LABEL = out_label;
+    extern column INSDC:coord:zero LABEL_START = out_label_start;
+    extern column INSDC:coord:len LABEL_LEN = out_label_len;
+
+    // 16-bit versions
+    readonly column U16 LABEL_START = cast ( out_label_start );
+    readonly column U16 LABEL_LEN = cast ( out_label_len );
+
+
+    /* READ_TYPE
+     *  binary values giving type of a read
+     *
+     * NB - row length === NREADS
+     */
+    extern default column INSDC:SRA:xread_type READ_TYPE = out_read_type;
+
+    INSDC:SRA:xread_type in_read_type
+        = READ_TYPE
+        | _alt_in_read_type;
+
+    readonly column INSDC:SRA:read_type READ_TYPE
+        = out_read_type
+        | < INSDC:SRA:xread_type, INSDC:SRA:read_type > map < [ 0,1,2,3,4,5,6,7 ], [ 0,1,0,1,0,1,0,1 ] > ( out_read_type );
+
+
+    /* READ_START
+     * READ_LEN
+     *  define starting coordinates and length of read segments
+     *
+     * NB - row length === NREADS
+     */
+    extern default column INSDC:coord:zero READ_START
+        = out_read_start;
+    extern column INSDC:coord:one READ_START
+        = ( INSDC:coord:one ) < I32 > sum < 1 > ( out_read_start );
+    extern column INSDC:coord:len READ_LEN = out_read_len;
+
+    // 16-bit versions
+    readonly column U16 READ_START = cast ( out_read_start );
+    readonly column U16 READ_LEN = cast ( out_read_len );
+
+    INSDC:coord:len in_read_len
+        = READ_LEN
+        | _alt_in_read_len;
+
+
+    /* READ_FILTER
+     *  bits indicate usability of sequence
+     *  always available
+     */
+    extern column INSDC:SRA:read_filter READ_FILTER
+        = out_rd_filter
+        | < INSDC:SRA:read_filter > echo < SRA_READ_FILTER_PASS > ( out_read_start );
+
+    // RD_FILTER - only available if physical column is present
+    extern readonly column INSDC:SRA:read_filter RD_FILTER = out_rd_filter;
+
+
+    /* spot_len is used internally */
+    INSDC:coord:len spot_len
+        = base_space_spot_len
+        | color_space_spot_len
+        | align_spot_len;
+    INSDC:coord:len fixed_spot_len
+        = static_fixed_spot_len
+        | base_space_fixed_spot_len
+        | color_space_fixed_spot_len;
+
+
+	/* INSDC:tbl:sequence inherited virtual productions
+	 *  out_2cs_packed
+	 *  out_2na_packed
+	 */
+
+	/* INSDC:SRA:tbl:spotdesc productions
+	 *  trim_len
+	 *  out_label
+	 *  out_nreads
+	 *  trim_start
+	 *  out_read_len
+	 *  out_label_len
+	 *  out_rd_filter
+	 *  out_read_type
+	 *  out_read_start
+	 *  out_label_start
+	 *  static_fixed_spot_len
+	 */
+};
+
+/*--------------------------------------------------------------------------
+ * stats
+ *  run and spot-group statistics
+ *
+ * history:
+ *  1.1.0 - added CMP_BASE_COUNT
+ */
+table INSDC:SRA:tbl:stats #1.1
+{
+    readonly column INSDC:SRA:spotid_t MIN_SPOT_ID
+        = min_spot_id
+        | < INSDC:SRA:spotid_t > echo < 1 > ();
+    readonly column INSDC:SRA:spotid_t MAX_SPOT_ID
+        = max_spot_id
+        | cast ( spot_count );
+    readonly column U64
+        SPOT_COUNT = spot_count;
+    readonly column U64
+        BASE_COUNT = base_count;
+    readonly column U64
+        BIO_BASE_COUNT = bio_base_count;
+    readonly column U64 CMP_BASE_COUNT
+        = cmp_base_count
+        | base_count;
+
+    U8 stats_dummy = in_stats_bin;
+
+	/* INSDC:SRA:tbl:stats productions
+	 *  base_count
+	 *  spot_count
+	 *  max_spot_id
+	 *  min_spot_id
+     *  in_stats_bin
+	 *  bio_base_count
+	 *  cmp_base_count
+	 */
+};
+
+/*--------------------------------------------------------------------------
+ * sra
+ *  the INSDC SRA table
+ *
+ * history:
+ *  1.0.1 - base explicitly upon spotname #1.0.1
+ *  1.0.2 - base explicitly upon sequence #1.0.1, spotdesc #1.0.1
+ *  1.0.3 - base upon spotdesc #1.0.2
+ */
+
+// platform constants from <insdc/sra.h>
+typedef U8 INSDC:SRA:platform_id;
+const INSDC:SRA:platform_id SRA_PLATFORM_UNDEFINED         = 0;
+const INSDC:SRA:platform_id SRA_PLATFORM_454               = 1;
+const INSDC:SRA:platform_id SRA_PLATFORM_ILLUMINA          = 2;
+const INSDC:SRA:platform_id SRA_PLATFORM_ABSOLID           = 3;
+const INSDC:SRA:platform_id SRA_PLATFORM_COMPLETE_GENOMICS = 4;
+const INSDC:SRA:platform_id SRA_PLATFORM_HELICOS           = 5;
+const INSDC:SRA:platform_id SRA_PLATFORM_PACBIO_SMRT       = 6;
+const INSDC:SRA:platform_id SRA_PLATFORM_ION_TORRENT       = 7;
+const INSDC:SRA:platform_id SRA_PLATFORM_CAPILLARY         = 8;
+const INSDC:SRA:platform_id SRA_PLATFORM_OXFORD_NANOPORE   = 9;
+
+table INSDC:SRA:tbl:sra #1.0.3 =
+    INSDC:tbl:sequence #1.0.1, INSDC:SRA:tbl:spotname #1.0.1,
+    INSDC:SRA:tbl:spotdesc #1.0.2, INSDC:SRA:tbl:stats #1.1.0
+{
+    /* PLATFORM
+     *  platform description
+     *  one version returns a constant defined above
+     *  while the other returns a textual representation
+     */
+    extern column INSDC:SRA:platform_id PLATFORM
+        = .PLATFORM
+        | out_platform;
+    readonly column  ascii PLATFORM
+        = platform_name;
+
+    physical column
+        < INSDC:SRA:platform_id > zip_encoding .PLATFORM = PLATFORM;
+
+
+    /* SPOT_ID
+     *  reports spot id of current row
+     */
+    extern column INSDC:SRA:spotid_t SPOT_ID
+        = < INSDC:SRA:spotid_t > add_row_id ( .SPOT_ID )
+        | cast ( rowid_64 );
+    I64 rowid_64 = row_id ();
+
+    physical column < INSDC:SRA:spotid_t > izip_encoding .SPOT_ID
+        = < INSDC:SRA:spotid_t > sub_row_id ( SPOT_ID );
+
+
+    /* SPOT_GROUP
+     *  a name denoting group membership, ''
+     *  used for "barcode" support
+     */
+    extern column ascii SPOT_GROUP
+        = out_spot_group
+        | .SPOT_GROUP
+        | < ascii > echo < '' > ();
+
+    ascii in_spot_group = SPOT_GROUP;
+
+    physical column
+        < ascii > zip_encoding <  Z_DEFAULT_STRATEGY, Z_BEST_SPEED > .SPOT_GROUP = in_spot_group;
+
+
+	/* INSDC:tbl:sequence inherited virtual productions
+	 *  cs_native
+	 *  in_cs_key
+	 *  out_cs_key
+	 *  out_signal
+	 *  in_dna_text
+	 *  out_2cs_bin
+	 *  out_2na_bin
+	 *  out_4na_bin
+	 *  out_dna_text
+	 *  out_x2cs_bin
+	 *  out_x2na_bin
+	 *  in_color_text
+	 *  out_2cs_packed
+	 *  out_2na_packed
+	 *  out_4na_packed
+	 *  out_color_text
+	 *  out_qual_phred
+	 *  out_color_matrix
+	 */
+
+	/* INSDC:SRA:tbl:spotcoord inherited virtual productions
+	 *  out_x_coord
+	 *  out_y_coord
+	 */
+
+	/* INSDC:SRA:tbl:spotname inherited virtual productions
+	 *  out_name_fmt
+	 *  out_spot_name
+	 *  spot_ids_found
+	 */
+
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  trim_len
+	 *  out_label
+	 *  out_nreads
+	 *  trim_start
+	 *  out_read_len
+	 *  out_label_len
+	 *  out_rd_filter
+	 *  out_read_type
+	 *  out_read_start
+	 *  out_label_start
+	 *  static_fixed_spot_len
+	 */
+
+	/* INSDC:SRA:tbl:stats inherited productions
+	 *  base_count
+	 *  spot_count
+	 *  max_spot_id
+	 *  min_spot_id
+     *  in_stats_bin
+	 *  bio_base_count
+	 */
+
+	/* INSDC:SRA:tbl:sra productions
+	 *  out_platform
+	 *  platform_name
+	 */
+};
diff --git a/interfaces/kapp/args-conv.h b/interfaces/kapp/args-conv.h
new file mode 100644
index 0000000..4a9e66a
--- /dev/null
+++ b/interfaces/kapp/args-conv.h
@@ -0,0 +1,57 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_kapp_args_conv_
+#define _h_kapp_args_conv_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_kapp_args_
+#include "args.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 
+ * No conversion, allocates memory and copies argument as is.
+ * This may should be used from other conversion functions if they decide not to change argument.
+ */
+rc_t ArgsConvDefault(const Args * args, uint32_t arg_index, const char * arg, size_t arg_len, void ** result, WhackParamFnP * whack);
+    
+/*
+ * Converts from utf-8 platform dependent (e.g. with back-slashes on Windows) to utf-8 POSIX full file path format
+ */
+rc_t ArgsConvFilepath(const Args * args, uint32_t arg_index, const char * arg, size_t arg_len, void ** result, WhackParamFnP * whack);
+    
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kapp_args_conv_ */
diff --git a/interfaces/kapp/args.h b/interfaces/kapp/args.h
new file mode 100644
index 0000000..99bb09c
--- /dev/null
+++ b/interfaces/kapp/args.h
@@ -0,0 +1,402 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kapp_args_
+#define _h_kapp_args_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* this define is while adding the --option-file to standard options
+ * and it might not be right yet */
+#define USE_OPTFILE    1
+
+/*
+ * Terminology for this module:
+ *
+ * On the command line all things typed in are arguments
+ * Those arguments that are string preceded by "-" or "--" are options
+ * The -- preceded version of an Option is that Option's name.  A name
+ * can have one or more aliases that are a single character.
+ * The arguments that are not are parameters.
+ *
+ * This module treats all "strings" as if they were made of UTF-8 characters
+ * that can be one or more bytes long.  An alias is a single Unicode character
+ * in UTF-8 format.  7-bit ASCII is a true subset of UTF-8.  8-but ASCII might
+ * not work.
+ */
+
+/*--------------------------------------------------------------------------
+ * Args
+ *  opaque class to build up option lists and parse the command line argc/argv
+ *  not reference counted
+ */
+typedef struct Args Args;
+
+/* ==========
+ * Structure to define a command line option
+ *
+ * these are fed in one by one or through arrays to build up the
+ * tables used to parse the caommand line argc/argv
+ */
+
+typedef void (CC * WhackParamFnP) (void * object);
+typedef rc_t (CC * ConvertParamFnP) (const Args * self, uint32_t arg_index, const char * arg, size_t arg_len, void ** result, WhackParamFnP * whack);
+    
+typedef struct OptDef
+{
+    const char *  name;           	/* UTF8/ASCII NUL terminated long name */
+    const char *  aliases;        	/* UTF8/ASCII NUL terminated set of single utf8/ASCII character names: may be NULL or "" */
+    void (CC *    help_gen) (const char **);	/* function to generate help string */
+    const char ** help;                	/* help-gen can treat these as non-const */
+    uint16_t      max_count;      	/* maximum allowed; 0 is unlimited */
+#define OPT_UNLIM 0
+    bool          needs_value;    	/* does this require an argument value? */
+    bool          required;             /* is this a required parameter?  Not supported yet. */
+    ConvertParamFnP convert_fn;   /* function to convert option. can perform binary conversions. may be NULL */
+} OptDef;
+    
+typedef struct ParamDef ParamDef;
+struct ParamDef
+{
+    ConvertParamFnP convert_fn; /* function to convert option. can perform binary conversions. may be NULL */
+};
+
+extern OptDef StandardOptions [];
+
+#define ALIAS_DEBUG     "+"
+#define ALIAS_LOG_LEVEL "L"
+#define ALIAS_HELP      "h?"
+#define ALIAS_HELP1     "h"
+#define ALIAS_VERSION   "V"
+#define ALIAS_VERBOSE   "v"
+#define ALIAS_QUIET     "q"
+#if USE_OPTFILE
+#define ALIAS_OPTFILE   ""
+#endif
+
+#define OPTION_DEBUG     "debug"
+#define OPTION_LOG_LEVEL "log-level"
+#define OPTION_HELP      "help"
+#define OPTION_VERSION   "version"
+#define OPTION_VERBOSE   "verbose"
+#define OPTION_QUIET     "quiet"
+#if USE_OPTFILE
+#define OPTION_OPTFILE   "option-file"
+#endif
+#define OPTION_NO_USER_SETTINGS "no-user-settings"
+
+#define ALIAS_REPORT    ""
+#define OPTION_REPORT   "ncbi_error_report"
+
+/* Make
+ *  create the empty object
+ */
+rc_t CC ArgsMake ( Args ** pself );
+
+
+/* Whack
+ *  undo all object and owned object construction
+ */
+rc_t CC ArgsWhack ( Args * self );
+
+#ifndef ArgsRelease
+#define ArgsRelease(self) ArgsWhack(self)
+#endif
+
+
+/* AddOption
+ *  takes the OptDef structure to add an option
+ * AddLongOption
+ *  splits the OptDef into simple parameters
+ *
+ *  "opt_short_names" [ IN, NULL OKAY ] - an optional list of single-characters used as
+ *  aliases for the option.
+ *
+ *  "long_name" [ IN ] - a required long option name
+ *
+ *  "opt_param_names [ IN, NULL OKAY ] - an optional list of option parameter names
+ *  currently limited to a single name. when not NULL/empty, implies that the option
+ *  must have a parameter.
+ *
+ *  "help_text" [ IN ] - text for generating help info.
+ *
+ *  "max_count" [ IN, ZERO => INFINITE ] - sets an upper limit on the number of times
+ *  the option can be specified on cmdline. the special value "0" is taken to mean
+ *  as many times as the system will support.
+ *
+ *  "required" [ IN ] - when true, the option must be specified at least once.
+ *  when false, the option is truly optional.
+ */
+rc_t CC ArgsAddOption ( Args * self, const OptDef * option );
+rc_t CC ArgsAddLongOption ( Args * self, const char * opt_short_names, const char * long_name,
+    const char * opt_param_names, const char * help_text, uint32_t max_count, bool required );
+
+
+/* AddOptionArray
+ *  helper function to call the ArgsAddOption() multiple times
+ */
+rc_t CC ArgsAddOptionArray ( Args * self, const OptDef * option, uint32_t count
+#if ADD_SOMETIME_LATER
+    , rc_t ( CC * header_fmt )( Args * args, const char * header ), const char * header
+#endif
+    );
+
+/* AddParam
+ *  adds a slot for a known parameter
+ * AddLongParam
+ *  adds a slot for a cmdline parameter along with some params of its own
+ *
+ *  "param_name" [ IN ] - for help display.
+ *
+ *  "help_text" [ IN ] - for help display.
+ *
+ *  "opt_cvt" [ IN, NULL OKAY ] - optional parameter conversion function
+ */
+rc_t CC ArgsAddParam ( Args * self, const ParamDef * param_def );
+rc_t CC ArgsAddLongParam ( Args * self, const char * param_name, const char * help_text, ConvertParamFnP opt_cvt );
+
+/* ArgsAddParamsArray
+ *  adds parameter definitions for arguments parsing
+ */
+rc_t CC ArgsAddParamArray ( Args * self, const ParamDef * param, uint32_t count );
+
+/* AddStandardOptions
+ *  helper macro to add the array of internally defined
+ *  "standard" options that we want all programs to support
+ */
+rc_t CC ArgsAddStandardOptions ( Args * self );
+
+
+/* Parse
+ *  parse the argc/argv as presented to KMain using the Args structure as built up
+ */
+rc_t CC ArgsParse ( Args * self, int argc, char *argv[] );
+
+
+/* tokenizes a file into an user supplied argv array ( not the one from main() ! )
+ * the result can be passed into ArgsParse(), enables commandline-options from a file
+ *  caller has to free the created array via Args_free_token_argv()
+ */
+rc_t CC Args_tokenize_file_into_argv( const char * filename, int * argc, char *** argv );
+
+rc_t CC Args_tokenize_file_and_progname_into_argv( const char * filename, const char * progname,
+                                                   int * argc, char *** argv );
+
+/* free's the array that was created by calling Args_tokenize_file_into_argv()
+ */
+void CC Args_free_token_argv( int argc, char * argv[] );
+
+
+/* looks in args for file_option(s), if found loades the files, parses them
+   if this results in more files to be parsed ( kind of includes ),
+   the parsing continues recursivly
+ */
+rc_t CC Args_parse_inf_file( Args * args, const char * file_option );
+
+
+/* looks in the unparsed original argv for the value of an option
+   >>> this is a hack to enable special treatment for tools that do not use
+       the standard args-parsing <<<
+ */
+rc_t CC Args_find_option_in_argv( int argc, char * argv[],
+                                  const char * option_name,
+                                  char * option, size_t option_len );
+
+/* OptionCount
+ *  how many times did this Option occur?
+ */
+rc_t CC ArgsOptionCount ( const Args * self, const char * option_name, uint32_t * count );
+
+
+/* OptionValue
+ *  what was the Nth value seen for this option?
+ *  use OptionCount to know how many were seen.
+ */
+rc_t CC ArgsOptionValue ( const Args * self, const char * option_name,
+    uint32_t iteration, const void ** value );
+
+/*
+ * ParamCount
+ *  How many Parameters were seen?
+ */
+rc_t CC ArgsParamCount (const Args * self, uint32_t * count);
+
+/*
+ * ParamValue
+ *  What was the Nth parameter seen?  Use ParamCount to know how many
+ *  were seen.
+ */
+rc_t CC ArgsParamValue (const Args * self, uint32_t iteration, const void ** value);
+
+
+/*
+ * ArgvCount
+ *  This is the original main() argument count (argc or ac)
+ */
+rc_t CC ArgsArgvCount (const Args * self, uint32_t * count);
+rc_t CC ArgsArgc (const Args * self, uint32_t * count);
+#define ArgsArgc ArgsArgvCount
+
+
+/*
+ * ArgvValue
+ *  What was the Nth parameter seen?  Use ArgvCount to know how many
+ *  were seen.
+ *
+ * The 0th value will as with the original argc.argv c system be the program name
+ * as given to us by the O/S and c start up code.
+ */
+rc_t CC ArgsArgvValue (const Args * self, uint32_t iteration, const char ** value_string);
+
+
+
+/* Utility functions to do common combinations and activities */
+
+/*
+ * MakeStandardOptions
+ *  Calls both Make() and AddStandardOptions()
+ *
+ * This is probably the first thing to do in KMain(), then add other Options
+ * via OptDef arracys and structures.  Then call parse.
+ */
+rc_t CC ArgsMakeStandardOptions (Args** pself);
+
+rc_t CC ArgsHandleHelp (Args * self);
+rc_t CC ArgsHandleVersion (Args * self);
+rc_t CC ArgsHandleOptfile (Args * self);
+
+/*
+ * ArgsHandleLogLevel
+ *  calls OptionCount and OptionValue to get parameters for the log-level
+ *  option then uses that/those values to set the Log level for the log module
+ */
+rc_t CC ArgsHandleLogLevel (const Args * self);
+
+
+rc_t CC ArgsHandleStatusLevel (const Args * self);
+rc_t CC ArgsHandleDebug (const Args * self);
+rc_t CC ArgsHandleStandardOptions (Args * self);
+
+rc_t CC ArgsMakeAndHandle (Args ** pself, int argc, char ** argv, uint32_t table_count, ...);
+
+/* the same as ArgsMakeAndHandle but also accepts params definitions */
+rc_t CC ArgsMakeAndHandle2 (Args ** pself, int argc, char ** argv,
+                            ParamDef * params, uint32_t param_count, uint32_t table_count, ...);
+
+rc_t CC ArgsOptionSingleString (const Args * self, const char * option, const char ** value);
+
+/* either fullpath or progname can be NULL, args can not */
+rc_t CC ArgsProgram (const Args * args, const char ** fullpath, const char ** progname);
+
+
+/* after arguments are parsed; check to see if any required arguments are missing */
+rc_t CC ArgsCheckRequired (Args * args);
+
+
+/*
+ * Help Interface:
+ * This interface is an extention os the Args Interface that is used for
+ * generating usage outputs for a command line program,  This interface is provided
+ * to standardize the look of these usage messages.
+ */
+
+/*
+ * This function is defined per program and is the meat of the output
+ * the the short-form usage and the first part of the long-form usage
+ *
+ * It should look something like this:
+ *
+ *
+ *    rc_t UsageSummary (const char * progname)
+ *    {
+ *        return KOutMsg ("\n"
+ *                        "Usage:\n"
+ *                        "  %s [Options] [Parameters]\n"
+ *                        "\n"
+ *                        "Summary:\n"
+ *                        "  Does something incredibly useful or we wouldn't have written it.\n"
+ *                        "  I mean very very useful like pre-slicomg bread.\n",
+ *                        "\n", progname);
+ *    }
+ *
+ * More than one example line can be present if desired.
+ */
+rc_t CC UsageSummary (const char * prog_name);
+
+/*
+ * A program should define this which will be used only of the actual
+ * program name as called is somehow irretrievable
+ */
+extern const char UsageDefaultName[];
+
+
+/*
+ * Version
+ *   Generate the output for the -V or --version options.
+ *   const char * fullpath:  The full argv[0] name for the program
+ *   ver_t version:          the version for this program
+ */
+void CC HelpVersion (const char * fullpath, ver_t version);
+
+void CC HelpOptionLine(const char * alias, const char * option, const char * param, const char ** msgs);
+
+void CC HelpParamLine (const char * param, const char * const * msgs);
+
+/*
+ * OptionsStandard
+ *   output the option lines for the standard options
+ */
+void CC HelpOptionsStandard (void);
+
+
+/*
+ * This Macro creates a default short form usage output typically
+ * used when no options/parameters are given for a program
+ *
+ * It requires 'void summary (const char * program_name)' that is also
+ * used in 'rc_t Usage (const Args* args)' that is the usage function
+ * called when -? -h or --help is given as an option on the command line
+ */
+
+rc_t CC MiniUsage ( const Args * args );
+rc_t CC Usage ( const Args * args );
+
+
+uint32_t CC ArgsGetGlobalTries(bool *isSet);
+
+bool CC Is32BitAndDisplayMessage( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kapp_args_ */
diff --git a/interfaces/kapp/extern.h b/interfaces/kapp/extern.h
new file mode 100644
index 0000000..726e555
--- /dev/null
+++ b/interfaces/kapp/extern.h
@@ -0,0 +1,47 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kapp_extern_
+#define _h_kapp_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+
+#define KAPP_EXTERN LIB_EXPORT
+#define KAPP_EXTERN_DATA extern LIB_EXPORT
+#define EXPORT_LATCH 1
+
+#else
+
+#define KAPP_EXTERN LIB_IMPORT
+#define KAPP_EXTERN_DATA LIB_IMPORT
+
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_kapp_extern_ */
diff --git a/interfaces/kapp/loader-file.h b/interfaces/kapp/loader-file.h
new file mode 100644
index 0000000..e4c0de8
--- /dev/null
+++ b/interfaces/kapp/loader-file.h
@@ -0,0 +1,122 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_kapp_loader_file_
+#define _h_kapp_loader_file_
+
+#ifndef _h_kapp_extern_
+#include <kapp/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#include <klib/log.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KDirectory;
+
+/*--------------------------------------------------------------------------
+* SRA reader buffered input file
+*/
+typedef struct KLoaderFile KLoaderFile;
+
+/*
+    md5_digest - not null forces MD5 verification for the file content
+    read_ahead - force reading of the file in a diff thread, ahead of time,
+                 usefull on compressed file, speeds up MD5 verify too
+*/
+KAPP_EXTERN rc_t CC KLoaderFile_Make(const KLoaderFile **file, struct KDirectory const* dir, const char* filename,
+                                     const uint8_t* md5_digest, bool read_ahead);
+
+KAPP_EXTERN rc_t CC KLoaderFile_Release(const KLoaderFile* cself, bool exclude_from_progress);
+
+/* temporary close the file to avoid too many open files, but stay on position */
+KAPP_EXTERN rc_t CC KLoaderFile_Close(const KLoaderFile* cself);
+
+/* restart reading from beginning of the file */
+KAPP_EXTERN rc_t CC KLoaderFile_Reset(const KLoaderFile* cself);
+
+KAPP_EXTERN rc_t CC KLoaderFile_SetReadAhead(const KLoaderFile* cself, bool read_ahead);
+
+/* print error msg file file info and return original!! rc
+   if msg is NULL fmt is not used so call with NULL, NULL if no msg needs to be printed */
+KAPP_EXTERN rc_t CC KLoaderFile_LOG(const KLoaderFile* cself, KLogLevel lvl, rc_t rc, const char *msg, const char *fmt, ...);
+KAPP_EXTERN rc_t CC KLoaderFile_VLOG(const KLoaderFile* cself, KLogLevel lvl, rc_t rc, const char *msg, const char *fmt, va_list args);
+
+/* returns true if eof is reached and buffer is empty */
+KAPP_EXTERN rc_t CC KLoaderFile_IsEof(const KLoaderFile* cself, bool* eof);
+
+/* returns current buffer position in file */
+KAPP_EXTERN rc_t CC KLoaderFile_Offset(const KLoaderFile* cself, uint64_t* offset);
+
+/* returns current line number in file */
+KAPP_EXTERN rc_t CC KLoaderFile_Line(const KLoaderFile* cself, uint64_t* line);
+
+/* file name */
+KAPP_EXTERN rc_t CC KLoaderFile_Name(const KLoaderFile *self, const char **name);
+
+/* real file name */
+KAPP_EXTERN rc_t CC KLoaderFile_FullName(const KLoaderFile *self, const char **name);
+
+/* file name completly resolved */
+KAPP_EXTERN rc_t CC KLoaderFile_ResolveName(const KLoaderFile *self, char *resolved, size_t rsize);
+
+/* Readline
+ *  makes next line from a file available in buffer.
+ *  eligable EOL symbols are: \n (unix), \r (older mac), \r\n (win)
+ *  EOL symbol(s) never included in buffer length.
+ *  if there is no EOL at EOF - not an error.
+ *  fails if internal buffer is insufficient.
+ *  buffer is NULL on EOF
+ *  rc state of (rcString rcTooLong) means line was too long
+ *              you may copy line and readline again for the tail of the line
+ *
+ *  "buffer" [ OUT ] and "length" [ OUT ] - returned line and it's length
+ */
+KAPP_EXTERN rc_t CC KLoaderFile_Readline(const KLoaderFile* self, const void** buffer, size_t* length);
+
+/* Read
+*  reads "size" bytes from file and makes them available through "buffer"
+*  if "advance" is > 0 than before reading skips "advance" bytes in file
+*  if "size" == 0 then nothing is read and available "length" bytes is returned in "buffer"
+*
+*  "buffer" [ OUT ] - pointer to read bytes, "buffer" NULL means EOF
+*  "length" [ OUT ] - number of read bytes, normally == size,
+                      if less than requested size, rc is [rcBuffer,rcInsufficient], advance and read more!
+*/
+KAPP_EXTERN rc_t CC KLoaderFile_Read(const KLoaderFile* self, size_t advance, size_t size, const void** buffer, size_t* length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kapp_loader_file_ */
diff --git a/interfaces/kapp/loader-meta.h b/interfaces/kapp/loader-meta.h
new file mode 100644
index 0000000..b09431a
--- /dev/null
+++ b/interfaces/kapp/loader-meta.h
@@ -0,0 +1,55 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_kapp_loader_meta_
+#define _h_kapp_loader_meta_
+
+#ifndef _h_kapp_extern_
+#include <kapp/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KMDataNode;
+
+KAPP_EXTERN rc_t CC KLoaderMeta_Write(struct KMDataNode* root,
+                                      const char* argv0, const char* argv0_date,
+                                      const char* app_name, ver_t app_version);
+
+KAPP_EXTERN rc_t CC KLoaderMeta_WriteWithVersion(struct KMDataNode* root,
+                                                 const char* argv0, const char* argv0_date, ver_t argv0_version,
+                                                 const char* app_name, ver_t app_version);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kapp_loader_meta_*/
diff --git a/interfaces/kapp/log-xml.h b/interfaces/kapp/log-xml.h
new file mode 100644
index 0000000..9517fb8
--- /dev/null
+++ b/interfaces/kapp/log-xml.h
@@ -0,0 +1,76 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_kapp_log_xml_h_
+#define _h_kapp_log_xml_h_
+
+#ifndef _kapp_extern_
+#include <kapp/extern.h>
+#endif
+
+#ifndef _kapp_args_
+#include <kapp/args.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KDirectory;
+
+KAPP_EXTERN_DATA const OptDef XMLLogger_Args [];
+KAPP_EXTERN_DATA const size_t XMLLogger_ArgsQty;
+
+typedef struct XMLLogger XMLLogger;
+
+/*
+  Creates XML logging based on dir and command line
+ */
+KAPP_EXTERN rc_t CC XMLLogger_Make(const XMLLogger** cself,
+    struct KDirectory* dir, const Args *args);
+
+/*
+  Creates XML logging based on dir, logpath pair or fd directly
+
+  dir     [IN,NULL] - directory object used to create and open logpath file
+  logpath [IN,NULL] - file name of the log file to _truncate_ and log into
+  fd  [IN,NEGATIVE] - direct file descriptor, if < 0 than not set
+
+  if both logpath == NULL and fd < 0 than no XML log is produced normal log gets full inforamtion
+ */
+KAPP_EXTERN rc_t CC XMLLogger_Make2(const XMLLogger** cself,
+    struct KDirectory* dir, const char* logpath, const int fd);
+
+KAPP_EXTERN void CC XMLLogger_Usage(void);
+
+KAPP_EXTERN void CC XMLLogger_Release(const XMLLogger* cself);
+
+KAPP_EXTERN rc_t CC XMLLogger_Encode(const char* src, char *dst, size_t dst_sz, size_t *num_writ);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kapp_log_xml_h_ */
diff --git a/interfaces/kapp/main.h b/interfaces/kapp/main.h
new file mode 100644
index 0000000..3139834
--- /dev/null
+++ b/interfaces/kapp/main.h
@@ -0,0 +1,174 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kapp_main_
+#define _h_kapp_main_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_kapp_args_
+#include <kapp/args.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KMain
+ *  invoked by platform specific "main" entrypoint
+ */
+
+/* Quitting
+ *  is the program supposed to exit
+ */
+rc_t CC Quitting ( void );
+
+/* SignalQuit
+ *  tell the program to quit
+ */
+rc_t CC SignalQuit ( void );
+
+/* Hangup
+ *  has the program received a SIGHUP
+ */
+rc_t CC Hangup ( void );
+
+/* SignalHup
+ *  send the program a SIGHUP
+ */
+rc_t CC SignalHup ( void );
+
+/* SignalNoHup
+ *  tell the program to stay alive even after SIGHUP
+ */
+rc_t CC SignalNoHup ( void );
+
+/* Version  EXTERN
+ *  return 4-part version code: 0xMMmmrrrr, where
+ *      MM = major release
+ *      mm = minor release
+ *    rrrr = bug-fix release
+ */
+ver_t CC KAppVersion ( void );
+    
+/* KMain - EXTERN
+ *  executable entrypoint "main" is implemented by
+ *  an OS-specific wrapper that takes care of establishing
+ *  signal handlers, logging, etc.
+ *
+ *  in turn, OS-specific "main" will invoke "KMain" as
+ *  platform independent main entrypoint.
+ *
+ *  "argc" [ IN ] - the number of textual parameters in "argv"
+ *  should never be < 0, but has been left as a signed int
+ *  for reasons of tradition.
+ *
+ *  "argv" [ IN ] - array of NUL terminated strings expected
+ *  to be in the shell-native character set: ASCII or UTF-8
+ *  element 0 is expected to be executable identity or path.
+ */
+rc_t CC KMain ( int argc, char *argv [] );
+
+
+/* Usage - EXTERN
+ *  This function is called when the command line argument
+ *  handling sees -? -h or --help
+ */
+rc_t CC Usage ( struct Args const * args );
+
+
+/* Version - EXTERN
+ *  Obsolete: formerly called when the command line option handler
+ *  saw -V or --version
+ */
+rc_t CC Version ( struct Args const * args );
+
+
+/* Usage - EXTERN
+ *  This function is called to check if enviroments meets tool needs
+ *  Pass 0 to requireRamSize if you don't need to check for RAM size
+ */
+rc_t CC KAppCheckEnvironment ( bool require64Bits, uint64_t requireRamSize );
+
+
+/* AsciiToXXX
+ *  replacement for atoi
+ *  converts NUL terminated string in "arg" to integer
+ *  invokes error handler if there is a format error in string
+ *
+ *  "arg" [ IN ] - NUL terminated textual representation of integer
+ *  obeys standard conversion rules:
+ *    starts with "0x" or "0X" - interpret as hex
+ *    starts with '0' - interpret as octal
+ *    otherwise - interpret as decimal
+ *
+ *  "handler_error" [ IN, NULL OKAY ] and "data" [ IN, OPAQUE ] -
+ *  optional callback function to handle case where "arg" could not
+ *  be processed in its entirety. default behavior is to log error
+ *  using "logerr" and invoke "exit".
+ */
+int32_t CC AsciiToI32 ( const char *arg,
+    void ( CC * handle_error ) ( const char *arg, void *data ), void *data );
+uint32_t CC AsciiToU32 ( const char *arg,
+    void ( CC * handle_error ) ( const char *arg, void *data ), void *data );
+int64_t CC AsciiToI64 ( const char *arg,
+    void ( CC * handle_error ) ( const char *arg, void *data ), void *data );
+uint64_t CC AsciiToU64 ( const char *arg,
+    void ( CC * handle_error ) ( const char *arg, void *data ), void *data );
+
+
+/* NextLogLevel
+ * NextLogLevelh
+ *  these match NextArg and NextArgh but take the parameter and use it
+ *  to set the Log Level.
+ *
+ * legal values for the parameter are:
+ * 1. a sequence of + or - characters that each bump the current log level
+ *    up or down one.
+ * 2. an integer with a decimal value from 0 to 13 (octal and hex with the 
+ *    same range are accepted.
+ * 3. fatal, err, warn, info, debug1, debug3, debug3, debug4, debug5, debug6
+ *    debug7, debug8, debug9, debug10
+ */
+void CC NextLogLevel ( const char **argp, int *ip, int argc, char *argv [],
+    const char* ( CC * handle_null ) ( void *data ), void *data );
+void CC NextLogLevelh ( int *ip, int argc, char *argv [],
+    const char* ( CC * handle_null ) ( void *data ), void *data );
+
+#define LogLevelSet( S ) \
+    NextLogLevelCommon ( S )
+
+rc_t CC NextLogLevelCommon ( const char * level_parameter );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kapp_main_ */
diff --git a/interfaces/kapp/progressbar.h b/interfaces/kapp/progressbar.h
new file mode 100644
index 0000000..07d1555
--- /dev/null
+++ b/interfaces/kapp/progressbar.h
@@ -0,0 +1,82 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_kapp_progressbar_
+#define _h_kapp_progressbar_
+
+#ifndef _h_kapp_extern_
+#include <kapp/extern.h>
+#endif
+
+#ifndef _h_klib_log_
+#include <klib/log.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFile;
+struct KDirectory;
+
+typedef struct KLoadProgressbar KLoadProgressbar;
+
+/**
+   Create new object in job
+ */
+KAPP_EXTERN rc_t CC KLoadProgressbar_Make(const KLoadProgressbar** cself, uint64_t size);
+/**
+   if dir is NULL current directory assumed
+ */
+KAPP_EXTERN rc_t CC KLoadProgressbar_File(const KLoadProgressbar** cself, const char* filename, struct KDirectory const* dir);
+KAPP_EXTERN rc_t CC KLoadProgressbar_KFile(const KLoadProgressbar** cself, struct KFile const* file);
+
+/**
+  Release job object
+  if exclude than job stats excluded from reports
+  */
+KAPP_EXTERN void CC KLoadProgressbar_Release(const KLoadProgressbar* cself, bool exclude);
+
+/**
+    Add a chunk of smth (bytes, rows, etc) to the job
+ */
+KAPP_EXTERN rc_t CC KLoadProgressbar_Append(const KLoadProgressbar* cself, uint64_t chunk);
+
+
+/* Set severity level name
+   severity [IN] - default 'status'
+ */
+KAPP_EXTERN rc_t CC KLoadProgressbar_Severity(const char* severity);
+
+/* mark a chunk of bytes as processed
+   report on full percent processed or if forced
+ */
+KAPP_EXTERN rc_t CC KLoadProgressbar_Process(const KLoadProgressbar* cself, uint64_t chunk, bool force_report);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kapp_progressbar_ */
diff --git a/interfaces/kapp/queue-file.h b/interfaces/kapp/queue-file.h
new file mode 100644
index 0000000..79fa890
--- /dev/null
+++ b/interfaces/kapp/queue-file.h
@@ -0,0 +1,149 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_kapp_queue_file_
+#define _h_kapp_queue_file_
+
+#ifndef _h_kapp_extern_
+#include <kapp/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KQueueFile
+ *  an extension to KFile that runs on a background thread
+ */
+struct KFile;
+
+
+/* MakeRead
+ *  make a queue file for reading-ahead on background thread
+ *
+ *  when the file is created, a background thread is started
+ *  that begins reading from "src" at position "pos", into
+ *  buffers of size "buffer_size". each buffer is pushed into
+ *  a cross-thread queue where it is consumed by the reading
+ *  thread.
+ *
+ *  the background thread is throttled by queue capacity - determined
+ *  by "queue_bytes" and "block_size", such that if the queue is full,
+ *  the thread will sleep. the consumer thread is also throttled by the
+ *  queue in that it will sleep if the queue is empty with pending data.
+ *
+ *  the background thread will exit upon reaching end of file,
+ *  upon a permanent error, or if the queue is sealed by the consumer
+ *  thread.
+ *
+ *  when the file is collected in response to a release message,
+ *  the queue will be sealed against further inserts, pending buffers
+ *  will be discarded, the background thread will be joined, and
+ *  the source file will be released.
+ *
+ *  the intended usage is serial reading of the file. reads
+ *  may only progress forward, i.e. backing up is not permitted.
+ *
+ *  "qf" [ OUT ] - return parameter for queue file
+ *
+ *  "pos" [ IN ] - starting position for reads from "src".
+ *  NB - "src" must support being addressed at this position.
+ *
+ *  "src" [ IN ] - source file for read-ahead on background thread.
+ *  must have read permissions.
+ *
+ *  "queue_bytes" [ IN ] - the read-ahead limit of the background
+ *  thread, in bytes. this is the amount of data that will be queued
+ *  for the consumer thread before the bg thread sleeps.
+ *
+ *  "block_size" [ IN, DEFAULT ZERO ] - optional parameter giving
+ *  desired block size when reading from "src". this may be used
+ *  to tune reading for source data, e.g. 64K blocks for gzip.
+ *
+ *  "timeout_ms" [ IN, DEFAULT ZERO ] - optional parameter specifying the period of time (in ms)
+ *  at which the background thread will check whether it is to quit (e.g. the foregrount thread has sealed the buffer),
+ *  when the queue cannot be written into.  If 0 specified, the timeout is set to 150 ms.
+ */
+KAPP_EXTERN rc_t CC KQueueFileMakeRead ( struct KFile const **qf, uint64_t pos,
+    struct KFile const *src, size_t queue_bytes, size_t block_size, uint32_t timeout_ms );
+
+
+/* MakeWrite
+ *  make a queue file for writing-behind on background thread
+ *
+ *  when the file is created, a background thread is started that
+ *  waits for buffers to appear in the cross-thread queue. as the producer
+ *  thread writes, data are accumulated into buffers which are pushed
+ *  into the queue as they fill, and written in turn on the bg thread.
+ *
+ *  the producer thread is throttled by queue capacity - determined by
+ *  "queue_bytes" and "block_size", such that if the queue is full,
+ *  the thread will sleep. the background thread is also throttled by
+ *  the queue in that it will sleep if the queue is empty with pending
+ *  data.
+ *
+ *  the background thread will exit upon a permanent error, or if the
+ *  queue is sealed by the producer thread.
+ *
+ *  when the file is collected in response to a release message,
+ *  the queue will be sealed against further inserts, pending buffers
+ *  will be written, the background thread will be joined, and
+ *  the source file will be released.
+ *
+ *  the intended usage is serial writing of the file. random writes
+ *  will be accepted, but may reduce the queue efficiency.
+ *
+ *  "qf" [ OUT ] - return parameter for queue file
+ *
+ *  "dst" [ IN ] - destination file for write-behind on background thread.
+ *  must have write permissions.
+ *
+ *  "queue_bytes" [ IN ] - the write-behind limit of the producer
+ *  thread, in bytes. this is the amount of data that will be queued
+ *  for the background thread before the producer thread sleeps.
+ *
+ *  "block_size" [ IN, DEFAULT ZERO ] - optional parameter giving
+ *  desired block size when writing to "dst". this may be used
+ *  to tune writing for source data, e.g. 64K blocks for gzip.
+ *
+ *  "timeout_ms" [ IN, DEFAULT ZERO ] - optional parameter specifying the period of time (in ms)
+ *  at which the background thread will check whether it is to quit (e.g. the foregrount thread has sealed the buffer),
+ *  when the queue cannot be read from.  If 0 specified, the timeout is set to 150 ms.
+ */
+KAPP_EXTERN rc_t CC KQueueFileMakeWrite ( struct KFile **qf,
+    struct KFile *dst, size_t queue_bytes, size_t block_size, uint32_t timeout_ms );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kapp_queue_file_ */
diff --git a/interfaces/kdb/btree.h b/interfaces/kdb/btree.h
new file mode 100644
index 0000000..1639126
--- /dev/null
+++ b/interfaces/kdb/btree.h
@@ -0,0 +1,188 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_btree_
+#define _h_kdb_btree_
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * defines
+ */
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+/*--------------------------------------------------------------------------
+ * KBTree
+ *  this implementation is an extremely simplified structure
+ *  meant to provide the ability to create an index for temporary use
+ */
+typedef struct KBTree KBTree;
+
+
+/* MakeRead
+ * MakeUpdate
+ *  make a b-tree object backed by supplied KFile
+ *
+ *  "backing" [ IN ] - open file with appropriate permissions:
+ *   read is required in all cases, and write is required for update.
+ *   NB - a reference will be attached to this file.
+ *
+ *  "climit" [ IN ] - cache limit in bytes. the internal cache will
+ *   retain UP TO ( but not exceeding ) the limit specified. a value
+ *   of 0 ( zero ) will disable caching.
+ *
+ *  "write_through" [ IN ] - if true, causes flushing of modified page
+ *   after its value is released
+ *
+ *  "type" [ IN ] - describes the key type ( see above )
+ *
+ *  "key_chunk_size" [ IN ] - the "chunking" ( alignment ) factor for
+ *   storing keys, rounded up to the nearest power of 2.
+ *
+ *  "value_chunk_size" [ IN ] - chunking factor for values
+ *   ( see "key_chunk_size" )
+ *
+ *  "min_key_size" [ IN ] and "max_key_size" [ IN ] - specifies the allowed
+ *   opaque key sizes. min == max implies fixed size. ignored for well
+ *   known fixed size key types.
+ *
+ *  "id_size" [ IN ] - size of id in bytes, from 1 to 8.
+ *
+ *  "min_value_size" [ IN ] and "max_value_size" [ IN ] - specifies the allowed
+ *   value sizes. min == max implies fixed size.
+ *
+ *  "cmp" [ IN, NULL OKAY ] - optional comparison callback function for opaque keys.
+ *   specific key types will use internal comparison functions. for opaque keys, a
+ *   NULL function pointer will cause ordering by size and binary comparison.
+ */
+KDB_EXTERN rc_t CC KBTreeMakeRead_1 ( const KBTree **bt,
+                                     struct KFile const *backing, size_t climit);
+
+KDB_EXTERN rc_t CC KBTreeMakeUpdate_1 ( KBTree **bt, struct KFile *backing,
+    size_t climit );
+
+#define KBTreeMakeRead(PBT, BACK, CLIM, CMP) KBTreeMakeRead_1(PBT, BACK, CLIM)
+
+#define KBTreeMakeUpdate(PBT, BACK, CLIM, WT, T, MIN_KS, MAX_KS, ID_SIZE, CMP) \
+    KBTreeMakeUpdate_1(PBT, BACK, CLIM)
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KDB_EXTERN rc_t CC KBTreeAddRef ( const KBTree *self );
+KDB_EXTERN rc_t CC KBTreeRelease ( const KBTree *self );
+
+
+/* DropBacking
+ *  used immediately prior to releasing
+ *  prevents modified pages from being flushed to disk
+ *  renders object nearly useless
+ */
+KDB_EXTERN rc_t CC KBTreeDropBacking ( KBTree *self );
+
+
+/* Size
+ *  returns size in bytes of file and cache
+ *
+ *  "lsize" [ OUT, NULL OKAY ] - return parameter for logical size
+ *
+ *  "fsize" [ OUT, NULL OKAY ] - return parameter for file size
+ *
+ *  "csize" [ OUT, NULL OKAY ] - return parameter for cache size
+ */
+KDB_EXTERN rc_t CC KBTreeSize ( const KBTree *self,
+    uint64_t *lsize, uint64_t *fsize, size_t *csize );
+
+
+/* Find
+ *  searches for a match
+ *
+ *  "val" [ OUT ] - return parameter for value found
+ *   accessed via KBTreeValueAccess* described above
+ *   must be balanced with a call to KBTreeValueWhack.
+ *
+ *  "key" [ IN ] and "key_size" [ IN ] - describes an
+ *   opaque key
+ */
+KDB_EXTERN rc_t CC KBTreeFind ( const KBTree *self, uint64_t *id,
+    const void *key, size_t key_size );
+
+
+/* Entry
+ *  searches for a match or creates a new entry
+ *
+ *  "val" [ OUT ] - return parameter for value found
+ *   accessed via KBTreeValueAccess* described above
+ *   must be balanced with a call to KBTreeValueWhack.
+ *
+ *  "was_inserted" [ OUT ] - if true, the returned value was the result of an
+ *   insertion and can be guaranteed to be all 0 bits. otherwise, the returned
+ *   value will be whatever was there previously.
+ *
+ *  "alloc_size" [ IN ] - the number of value bytes to allocate upon insertion,
+ *   i.e. if the key was not found. this value must agree with the limits
+ *   specified in Make ( see above ).
+ *
+ *  "key" [ IN ] and "key_size" [ IN ] - describes an
+ *   opaque key
+ */
+KDB_EXTERN rc_t CC KBTreeEntry ( KBTree *self, uint64_t *id,
+    bool *was_inserted, const void *key, size_t key_size );
+
+
+/* ForEach
+ *  executes a function on each tree element
+ *
+ *  "reverse" [ IN ] - if true, iterate in reverse order
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - callback function
+ */
+KDB_EXTERN rc_t CC KBTreeForEach ( const KBTree *self, bool reverse,
+    void ( CC * f ) ( const void *key, size_t key_size, uint32_t id, void *data ), void *data );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_kdb_btree_ */
diff --git a/interfaces/kdb/column.h b/interfaces/kdb/column.h
new file mode 100644
index 0000000..9797bec
--- /dev/null
+++ b/interfaces/kdb/column.h
@@ -0,0 +1,360 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_column_
+#define _h_kdb_column_
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KTable;
+struct KDBManager;
+struct KDataBuffer;
+
+
+/*--------------------------------------------------------------------------
+ * KChecksum
+ *  describes blob checksum
+ */
+typedef uint8_t KChecksum;
+enum
+{
+    kcsNone,
+    kcsCRC32,
+    kcsMD5
+};
+
+
+/*--------------------------------------------------------------------------
+ * KColumn
+ *  a collection of blobs indexed by oid
+ */
+typedef struct KColumn KColumn;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+KDB_EXTERN rc_t CC KColumnAddRef ( const KColumn *self );
+KDB_EXTERN rc_t CC KColumnRelease ( const KColumn *self );
+
+
+/* CreateColumn
+ * VCreateColumn
+ *  create a new or open an existing column
+ *
+ *  "col" [ OUT ] - return parameter for newly opened column
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "checksum" [ IN ] - the type of checksum information to
+ *  apply when writing blobs
+ *
+ *  "pgsize" [ IN, DEFAULT ZERO ] - size of internal column "pages"
+ *  the default value is indicated by 0 ( zero ).
+ *  NB - CURRENTLY THE ONLY SUPPORTED PAGE SIZE IS 1 ( ONE ) BYTE.
+ *
+ *  "path" [ IN ] - NUL terminated string in UTF-8 giving path to col
+ *  where "." acts as a structure name separator, i.e. struct.member
+ */
+KDB_EXTERN rc_t CC KDBManagerCreateColumn ( struct KDBManager *self,
+    KColumn **col, KCreateMode cmode, KChecksum checksum,
+    size_t pgsize, const char *path, ... );
+KDB_EXTERN rc_t CC KTableCreateColumn ( struct KTable *self,
+    KColumn **col, KCreateMode cmode, KChecksum checksum,
+    size_t pgsize, const char *path, ... );
+
+KDB_EXTERN rc_t CC KDBManagerVCreateColumn ( struct KDBManager *self,
+    KColumn **col, KCreateMode cmode, KChecksum checksum,
+    size_t pgsize, const char *path, va_list args );
+KDB_EXTERN rc_t CC KTableVCreateColumn ( struct KTable *self,
+    KColumn **col, KCreateMode cmode, KChecksum checksum,
+    size_t pgsize, const char *path, va_list args );
+
+
+/* OpenColumnRead
+ * VOpenColumnRead
+ *  open a column for read
+ *
+ *  "col" [ OUT ] - return parameter for newly opened column
+ *
+ *  "path" [ IN ] - NUL terminated string in UTF-8 giving path to col
+ *  where "." acts as a structure name separator, i.e. struct.member
+ */
+KDB_EXTERN rc_t CC KDBManagerOpenColumnRead ( struct KDBManager const *self,
+    const KColumn **col, const char *path, ... );
+KDB_EXTERN rc_t CC KTableOpenColumnRead ( struct KTable const *self,
+    const KColumn **col, const char *path, ... );
+
+KDB_EXTERN rc_t CC KDBManagerVOpenColumnRead ( struct KDBManager const *self,
+    const KColumn **col, const char *path, va_list args );
+KDB_EXTERN rc_t CC KTableVOpenColumnRead ( struct KTable const *self,
+    const KColumn **col, const char *path, va_list args );
+
+
+/* OpenColumnUpdate
+ * VOpenColumnUpdate
+ *  open a column for read/write
+ *
+ *  "col" [ OUT ] - return parameter for newly opened column
+ *
+ *  "path" [ IN ] - NUL terminated string in UTF-8 giving path to col
+ *  where "." acts as a structure name separator, i.e. struct.member
+ */
+KDB_EXTERN rc_t CC KDBManagerOpenColumnUpdate ( struct KDBManager *self,
+    KColumn **col, const char *path, ... );
+KDB_EXTERN rc_t CC KTableOpenColumnUpdate ( struct KTable *self,
+    KColumn **col, const char *path, ... );
+
+KDB_EXTERN rc_t CC KDBManagerVOpenColumnUpdate ( struct KDBManager *self,
+    KColumn **col, const char *path, va_list args );
+KDB_EXTERN rc_t CC KTableVOpenColumnUpdate ( struct KTable *self,
+    KColumn **col, const char *path, va_list args );
+
+
+/* Locked
+ *  returns true if locked
+ */
+KDB_EXTERN bool CC KColumnLocked ( const KColumn *self );
+
+
+/* Version
+ *  returns the format version
+ */
+KDB_EXTERN rc_t CC KColumnVersion ( const KColumn *self, uint32_t *version );
+
+
+/* ByteOrder
+ *  indicates whether original byte order is reversed
+ *  under current architecture.
+ *
+ *  the byte order of the column is established by
+ *  the host architecture when created.
+ *
+ *  "reversed" [ OUT ] - if true, the original byte
+ *  order is reversed with regard to host native byte order.
+ */
+KDB_EXTERN rc_t CC KColumnByteOrder ( const KColumn *self, bool *reversed );
+
+
+/* IdRange
+ *  returns id range for column
+ *
+ *  "first" [ OUT ] - first id in column
+ *
+ *  "count" [ OUT ] - number of ids represented by this column
+ */
+KDB_EXTERN rc_t CC KColumnIdRange ( const KColumn *self, int64_t *first, uint64_t *count );
+
+
+/* FindFirstRowId
+ *  locates the first valid row-id starting from a given id.
+ *  this will be either the start id provided, or
+ *  the first row from the next blob, if available.
+ *
+ *  "found" [ OUT ] - will contain the value of "start" if this is contained within a blob,
+ *  or the first row-id of the next blob after "start", if any.
+ *
+ *  "start" [ IN ] - starting row-id in search, inclusive. if this id is valid,
+ *  it will be returned in "found"
+ *
+ *  returns 0 if id is found, rcNotFound if no more data were available.
+ *  may return other codes upon error.
+ */
+KDB_EXTERN rc_t CC KColumnFindFirstRowId ( const KColumn * self, int64_t * found, int64_t start );
+
+
+/* Reindex
+ *  optimize indices
+ */
+KDB_EXTERN rc_t CC KColumnReindex ( KColumn *self );
+
+
+/* CommitFreq
+ * SetCommitFreq
+ *  manage frequency of commits
+ */
+KDB_EXTERN rc_t CC KColumnCommitFreq ( KColumn *self, uint32_t *freq );
+KDB_EXTERN rc_t CC KColumnSetCommitFreq ( KColumn *self, uint32_t freq );
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+KDB_EXTERN rc_t CC KColumnOpenManagerRead ( const KColumn *self, struct KDBManager const **mgr );
+KDB_EXTERN rc_t CC KColumnOpenManagerUpdate ( KColumn *self, struct KDBManager **mgr );
+
+
+/* OpenParent
+ *  duplicate reference to parent table
+ *  NB - returned reference must be released
+ */
+KDB_EXTERN rc_t CC KColumnOpenParentRead ( const KColumn *self, struct KTable const **tbl );
+KDB_EXTERN rc_t CC KColumnOpenParentUpdate ( KColumn *self, struct KTable **tbl );
+
+
+/*--------------------------------------------------------------------------
+ * KColumnBlobCSData
+ *  checksum data
+ *
+ *  current version: 1
+ *
+ *  current checksum methods: CRC32, MD5
+ */
+typedef union KColumnBlobCSData KColumnBlobCSData;
+union KColumnBlobCSData
+{
+    uint32_t crc32;
+    uint8_t md5_digest [ 16 ];
+};
+
+
+/*--------------------------------------------------------------------------
+ * KColumnBlob
+ *  one or more rows of column data
+ */
+typedef struct KColumnBlob KColumnBlob;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+KDB_EXTERN rc_t CC KColumnBlobAddRef ( const KColumnBlob *self );
+KDB_EXTERN rc_t CC KColumnBlobRelease ( const KColumnBlob *self );
+
+
+/* CreateBlob
+ *  creates a new, unassigned blob
+ */
+KDB_EXTERN rc_t CC KColumnCreateBlob ( KColumn *self, KColumnBlob **blob );
+
+
+/* OpenBlobRead
+ * OpenBlobUpdate
+ *  opens an existing blob containing row data for id
+ */
+KDB_EXTERN rc_t CC KColumnOpenBlobRead ( const KColumn *self, const KColumnBlob **blob, int64_t id );
+KDB_EXTERN rc_t CC KColumnOpenBlobUpdate ( KColumn *self, KColumnBlob **blob, int64_t id );
+
+
+/* Read
+ *  read data from blob
+ *
+ *  "offset" [ IN ] - starting offset into blob
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - number of bytes actually read
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of bytes remaining to be read. specifically,
+ *  "offset" + "num_read" + "remaining" == sizeof blob
+ */
+KDB_EXTERN rc_t CC KColumnBlobRead ( const KColumnBlob *self,
+    size_t offset, void *buffer, size_t bsize,
+    size_t *num_read, size_t *remaining );
+
+/* ReadAll
+ *  read entire blob, plus any auxiliary checksum data
+ *
+ *  "buffer" [ OUT ] - pointer to a KDataBuffer structure that will be initialized
+ *  and resized to contain the entire blob. upon success, will contain the number of bytes
+ *  in buffer->elem_count and buffer->elem_bits == 8.
+ *
+ *  "opt_cs_data [ OUT, NULL OKAY ] - optional output parameter for checksum data
+ *  associated with the blob in "buffer", if any exist.
+ *
+ *  "cs_data_size" [ IN ] - sizeof of * opt_cs_data if not NULL, 0 otherwise
+ */
+KDB_EXTERN rc_t CC KColumnBlobReadAll ( const KColumnBlob * self, struct KDataBuffer * buffer,
+    KColumnBlobCSData * opt_cs_data, size_t cs_data_size );
+
+/* Append
+ *  append data to open blob
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - blob data
+ */
+KDB_EXTERN rc_t CC KColumnBlobAppend ( KColumnBlob *self, const void *buffer, size_t size );
+
+
+/* Validate
+ *  runs checksum validation on unmodified blob
+ */
+KDB_EXTERN rc_t CC KColumnBlobValidate ( const KColumnBlob *self );
+
+/* ValidateBuffer
+ *  run checksum validation on buffer data
+ *
+ *  "buffer" [ IN ] - returned blob buffer from ReadAll
+ *
+ *  "cs_data" [ IN ] and "cs_data_size" [ IN ] - returned checksum data from ReadAll
+ */
+KDB_EXTERN rc_t CC KColumnBlobValidateBuffer ( const KColumnBlob * self,
+    struct KDataBuffer const * buffer, const KColumnBlobCSData * cs_data, size_t cs_data_size );
+
+
+/* IdRange
+ * AssignRange
+ *  access id range for blob
+ *
+ *  "first" [ OUT ] and  "count" [ OUT ] - return parameters for IdRange
+
+ *  "first" [ IN ] and "count" [ IN ] - range parameters for assign
+ */
+KDB_EXTERN rc_t CC KColumnBlobIdRange ( const KColumnBlob *self, int64_t *first, uint32_t *count );
+KDB_EXTERN rc_t CC KColumnBlobAssignRange ( KColumnBlob *self, int64_t first, uint32_t count );
+
+
+/* Commit
+ *  commit changes to blob
+ *  close to further updates
+ */
+KDB_EXTERN rc_t CC KColumnBlobCommit ( KColumnBlob *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_kdb_column_ */
diff --git a/interfaces/kdb/consistency-check.h b/interfaces/kdb/consistency-check.h
new file mode 100644
index 0000000..18444e4
--- /dev/null
+++ b/interfaces/kdb/consistency-check.h
@@ -0,0 +1,142 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ *============================================================================
+ *
+ */
+
+#ifndef _h_kdb_consistency_check_
+#define _h_kdb_consistency_check_
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+#ifndef _h_insdc_sra_
+#include <insdc/sra.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+    
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDatabase;
+struct KTable;
+struct KColumn;
+
+
+/*--------------------------------------------------------------------------
+ * CCReportTypes
+ */
+enum
+{
+    ccrpt_Done,
+    ccrpt_MD5,
+    ccrpt_Blob,
+    ccrpt_Index,
+    ccrpt_Visit
+};
+
+
+/*--------------------------------------------------------------------------
+ * CCReportInfoBlock
+ */
+typedef struct CCReportInfoBlock CCReportInfoBlock;
+struct CCReportInfoBlock
+{
+    const char *objName;
+    uint32_t objId;
+    uint32_t objType;
+    uint32_t type;
+
+    union
+    {
+        struct /* ccrb_done_s */
+        {
+            const char *mesg;
+            rc_t rc;
+        } done;
+
+        struct ccrb_md5_s
+        {
+            const char *file;
+            rc_t rc;
+        } MD5;
+
+        struct ccrb_blob_s
+        {
+            uint64_t start;
+            uint64_t count;
+
+        } blob;
+
+        struct ccrb_index_s
+        {
+            int64_t start_id;
+            uint64_t id_range;
+            uint64_t num_keys;
+            uint64_t num_rows;
+            uint64_t num_holes;
+
+        } index;
+        
+        struct ccrb_visit_s {
+            unsigned depth;
+        } visit;
+    } info;
+};
+
+typedef rc_t ( CC *CCReportFunc ) ( const CCReportInfoBlock *info, void *data );
+
+/* a flag for level parameter */
+#define CC_INDEX_ONLY 0x80000000
+
+/*--------------------------------------------------------------------------
+ * KDatabase
+ */
+KDB_EXTERN rc_t CC KDatabaseConsistencyCheck ( struct KDatabase const *self,
+    uint32_t depth, uint32_t level, CCReportFunc report, void *data );
+
+
+/*--------------------------------------------------------------------------
+ * KTable
+ */
+KDB_EXTERN rc_t CC KTableConsistencyCheck ( struct KTable const *self,
+    uint32_t depth, uint32_t level, CCReportFunc report, void *data,
+    INSDC_SRA_platform_id platform);
+
+
+/*--------------------------------------------------------------------------
+ * KColumn
+ */
+KDB_EXTERN rc_t CC KColumnConsistencyCheck ( struct KColumn const *self,
+    uint32_t level, CCReportInfoBlock *info, CCReportFunc report, void *data );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kdb_consistency_check_ */
diff --git a/interfaces/kdb/database.h b/interfaces/kdb/database.h
new file mode 100644
index 0000000..d1f07ce
--- /dev/null
+++ b/interfaces/kdb/database.h
@@ -0,0 +1,278 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_database_
+#define _h_kdb_database_
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#include <kdb/column.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDBManager;
+
+
+/*--------------------------------------------------------------------------
+ * KDatabase
+ *  opaque connection to a database within file system
+ */
+typedef struct KDatabase KDatabase;
+
+KCreateMode KDatabaseGetCmode ( const KDatabase *self);
+KCreateMode KDatabaseSetCmode ( KDatabase *self, KCreateMode new_val);
+
+KChecksum KDatabaseGetChecksum ( const KDatabase *self);
+KChecksum KDatabaseSetChecksum ( KDatabase *self, KChecksum new_val);
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+KDB_EXTERN rc_t CC KDatabaseAddRef ( const KDatabase *self );
+KDB_EXTERN rc_t CC KDatabaseRelease ( const KDatabase *self );
+
+
+/* CreateDB
+ * VCreateDB
+ *  create a new or open an existing database
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+KDB_EXTERN rc_t CC KDBManagerCreateDB ( struct KDBManager *self,
+    KDatabase **db, KCreateMode cmode, const char *path, ... );
+KDB_EXTERN rc_t CC KDatabaseCreateDB ( KDatabase *self,
+    KDatabase **db, KCreateMode cmode, const char *name, ... );
+
+KDB_EXTERN rc_t CC KDBManagerVCreateDB ( struct KDBManager *self,
+    KDatabase **db, KCreateMode cmode, const char *path, va_list args );
+KDB_EXTERN rc_t CC KDatabaseVCreateDB ( KDatabase *self,
+    KDatabase **db, KCreateMode cmode, const char *name, va_list args );
+
+
+/* OpenDBRead
+ * VOpenDBRead
+ *  open a database for read
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+KDB_EXTERN rc_t CC KDBManagerOpenDBRead ( struct KDBManager const *self,
+    const KDatabase **db, const char *path, ... );
+KDB_EXTERN rc_t CC KDatabaseOpenDBRead ( const KDatabase *self,
+    const KDatabase **db, const char *name, ... );
+
+KDB_EXTERN rc_t CC KDBManagerVOpenDBRead ( struct KDBManager const *self,
+    const KDatabase **db, const char *path, va_list args );
+KDB_EXTERN rc_t CC KDatabaseVOpenDBRead ( const KDatabase *self,
+    const KDatabase **db, const char *name, va_list args );
+
+
+/* OpenDBUpdate
+ * VOpenDBUpdate
+ *  open a database for read/write
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+KDB_EXTERN rc_t CC KDBManagerOpenDBUpdate ( struct KDBManager *self,
+    KDatabase **db, const char *path, ... );
+KDB_EXTERN rc_t CC KDatabaseOpenDBUpdate ( KDatabase *self,
+    KDatabase **db, const char *name, ... );
+
+KDB_EXTERN rc_t CC KDBManagerVOpenDBUpdate ( struct KDBManager *self,
+    KDatabase **db, const char *path, va_list args );
+KDB_EXTERN rc_t CC KDatabaseVOpenDBUpdate ( KDatabase *self,
+    KDatabase **db, const char *name, va_list args );
+
+
+/* Locked
+ *  returns true if locked
+ */
+KDB_EXTERN bool CC KDatabaseLocked ( const KDatabase *self );
+
+
+/* Exists
+ *  returns true if requested object exists
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "name" [ IN ] - NUL terminated object name
+ */
+KDB_EXTERN bool CC KDatabaseExists ( const KDatabase *self, uint32_t type,
+    const char *name, ... );
+KDB_EXTERN bool CC KDatabaseVExists ( const KDatabase *self, uint32_t type,
+    const char *name, va_list args );
+
+/* IsAlias
+ *  returns true if object name is an alias
+ *  returns path to fundamental name if it was aliased
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - optional output buffer
+ *  for fundamenta object name if "alias" is not a fundamental name, 
+ *
+ *  "name" [ IN ] - NUL terminated object name
+ */
+KDB_EXTERN bool CC KDatabaseIsAlias ( const KDatabase *self, uint32_t type,
+    char *resolved, size_t rsize, const char *name );
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+KDB_EXTERN rc_t CC KDatabaseWritable ( const KDatabase *self, uint32_t type,
+    const char *name, ... );
+KDB_EXTERN rc_t CC KDatabaseVWritable ( const KDatabase *self, uint32_t type,
+    const char *name, va_list args );
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+KDB_EXTERN rc_t CC KDatabaseLock ( KDatabase *self, uint32_t type,
+    const char *name, ... );
+KDB_EXTERN rc_t CC KDatabaseVLock ( KDatabase *self, uint32_t type,
+    const char *name, va_list args );
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+KDB_EXTERN rc_t CC KDatabaseUnlock ( KDatabase *self, uint32_t type,
+    const char *name, ... );
+KDB_EXTERN rc_t CC KDatabaseVUnlock ( KDatabase *self, uint32_t type,
+    const char *name, va_list args );
+
+
+/* Rename
+ *  renames a contained object
+ *
+ *  "from" [ IN ] - NUL terminated string in UTF-8
+ *  giving name of contained object
+ *
+ *  "to" [ IN ] - NUL terminated string in UTF-8
+ *  giving new name
+ */
+KDB_EXTERN rc_t CC KDatabaseRenameDB ( KDatabase *self, bool force, const char *from, const char *to );
+KDB_EXTERN rc_t CC KDatabaseRenameTable ( KDatabase *self, bool force, const char *from, const char *to );
+KDB_EXTERN rc_t CC KDatabaseRenameIndex ( KDatabase *self, bool force, const char *from, const char *to );
+
+
+/* Alias
+ *  create an alias to an existing contained object
+ *
+ *  "obj" [ IN ] - NUL terminated string in UTF-8
+ *  giving name of contained object
+ *
+ *  "alias" [ IN ] - NUL terminated string in UTF-8
+ *  giving aliased name
+ */
+KDB_EXTERN rc_t CC KDatabaseAliasDB ( KDatabase *self, const char *obj, const char *alias );
+KDB_EXTERN rc_t CC KDatabaseAliasTable ( KDatabase *self, const char *obj, const char *alias );
+KDB_EXTERN rc_t CC KDatabaseAliasIndex ( KDatabase *self, const char *obj, const char *alias );
+
+
+/* Drop
+ *  drop a contained object
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving name of db
+ */
+KDB_EXTERN rc_t CC KDatabaseDropDB ( KDatabase *self, const char *name, ... );
+KDB_EXTERN rc_t CC KDatabaseDropTable ( KDatabase *self, const char *name, ... );
+KDB_EXTERN rc_t CC KDatabaseDropIndex ( KDatabase *self, const char *name, ... );
+
+KDB_EXTERN rc_t CC KDatabaseVDropDB ( KDatabase *self, const char *name, va_list args );
+KDB_EXTERN rc_t CC KDatabaseVDropTable ( KDatabase *self, const char *name, va_list args );
+KDB_EXTERN rc_t CC KDatabaseVDropIndex ( KDatabase *self, const char *name, va_list args );
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+KDB_EXTERN rc_t CC KDatabaseOpenManagerRead ( const KDatabase *self, struct KDBManager const **mgr );
+KDB_EXTERN rc_t CC KDatabaseOpenManagerUpdate ( KDatabase *self, struct KDBManager **mgr );
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+KDB_EXTERN rc_t CC KDatabaseOpenParentRead ( const KDatabase *self, const KDatabase **par );
+KDB_EXTERN rc_t CC KDatabaseOpenParentUpdate ( KDatabase *self, KDatabase **par );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kdb_database_ */
diff --git a/interfaces/kdb/extern.h b/interfaces/kdb/extern.h
new file mode 100644
index 0000000..2f8e0d0
--- /dev/null
+++ b/interfaces/kdb/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_extern_
+#define _h_kdb_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define KDB_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define KDB_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_kdb_extern_ */
diff --git a/interfaces/kdb/index.h b/interfaces/kdb/index.h
new file mode 100644
index 0000000..3a36bc3
--- /dev/null
+++ b/interfaces/kdb/index.h
@@ -0,0 +1,309 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_index_
+#define _h_kdb_index_
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KTable;
+struct PBSTNode;
+struct KDatabase;
+
+
+/*--------------------------------------------------------------------------
+ * KIdxType
+ *  the type of index being dealt with
+ */
+typedef uint8_t KIdxType;
+enum
+{
+    /* version 1 */
+
+    kitText,          /* text string => id */
+    kitU64,           /* uint64 (like file offset) to row id */
+
+    kitProj = 128     /* reverse index flag, row id => key */
+};
+
+
+/*--------------------------------------------------------------------------
+ * KIndex
+ *  an object capable of mapping an object to integer oid
+ */
+typedef struct KIndex KIndex;
+
+
+/* Addref
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+KDB_EXTERN rc_t CC KIndexAddRef ( const KIndex *self );
+KDB_EXTERN rc_t CC KIndexRelease ( const KIndex *self );
+
+
+/* CreateIndex
+ * VCreateIndex
+ *  create a new or open an existing index
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "type" [ IN ] - type of index to create
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+KDB_EXTERN rc_t CC KDatabaseCreateIndex ( struct KDatabase *self, KIndex **idx,
+    KIdxType type, KCreateMode cmode, const char *name, ... );
+KDB_EXTERN rc_t CC KTableCreateIndex ( struct KTable *self, KIndex **idx,
+    KIdxType type, KCreateMode cmode, const char *name, ... );
+
+KDB_EXTERN rc_t CC KDatabaseVCreateIndex ( struct KDatabase *self, KIndex **idx,
+    KIdxType type, KCreateMode cmode, const char *name, va_list args );
+KDB_EXTERN rc_t CC KTableVCreateIndex ( struct KTable *self, KIndex **idx,
+    KIdxType type, KCreateMode cmode, const char *name, va_list args );
+
+
+/* OpenIndexRead
+ * VOpenIndexRead
+ *  open an index for read
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+KDB_EXTERN rc_t CC KDatabaseOpenIndexRead ( struct KDatabase const *self,
+    const KIndex **idx, const char *name, ... );
+KDB_EXTERN rc_t CC KTableOpenIndexRead ( struct KTable const *self,
+    const KIndex **idx, const char *name, ... );
+
+KDB_EXTERN rc_t CC KDatabaseVOpenIndexRead ( struct KDatabase const *self,
+    const KIndex **idx, const char *name, va_list args );
+KDB_EXTERN rc_t CC KTableVOpenIndexRead ( struct KTable const *self,
+    const KIndex **idx, const char *name, va_list args );
+
+
+/* OpenIndexUpdate
+ * VOpenIndexUpdate
+ *  open an index for read/write
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+
+KDB_EXTERN rc_t CC KDatabaseOpenIndexUpdate ( struct KDatabase *self,
+    KIndex **idx, const char *name, ... );
+KDB_EXTERN rc_t CC KTableOpenIndexUpdate ( struct KTable *self,
+    KIndex **idx, const char *name, ... );
+
+KDB_EXTERN rc_t CC KDatabaseVOpenIndexUpdate ( struct KDatabase *self,
+    KIndex **idx, const char *name, va_list args );
+KDB_EXTERN rc_t CC KTableVOpenIndexUpdate ( struct KTable *self,
+    KIndex **idx, const char *name, va_list args );
+
+
+/* Locked
+ *  returns true if locked
+ */
+KDB_EXTERN bool CC KIndexLocked ( const KIndex *self );
+
+
+/* Version
+ *  returns the format version
+ */
+KDB_EXTERN rc_t CC KIndexVersion ( const KIndex *self, uint32_t *version );
+
+
+/* Type
+ *  returns the type of index
+ */
+KDB_EXTERN rc_t CC KIndexType ( const KIndex *self, KIdxType *type );
+
+
+/* Commit
+ *  ensure any changes are committed to disk
+ */
+KDB_EXTERN rc_t CC KIndexCommit ( KIndex *self );
+
+
+/* CheckConsistency
+ *  run a consistency check on the open index
+ *
+ *  "level" [ IN ] - a measure of rigor of the exercise:
+ *    0 is the lightest
+ *    1 will test all id mappings
+ *    2 will perform key->id retrievals
+ *    3 will perform id->key retrievals if a projection index exists
+ *
+ *  "start_id" [ OUT, NULL OKAY ] - returns the first id in index
+ *
+ *  "id_range" [ OUT, NULL OKAY ] - returns the range of ids from first to last
+ *
+ *  "num_keys" [ OUT, NULL OKAY ] - returns the number of key entries
+ *
+ *  "num_rows" [ OUT, NULL OKAY ] - returns the number of key->id mappings
+ *
+ *  "num_holes" [ OUT, NULL OKAY ] - returns the number of holes in the mapped id range
+ */
+KDB_EXTERN rc_t CC KIndexConsistencyCheck ( const KIndex *self, uint32_t level,
+    int64_t *start_id, uint64_t *id_range, uint64_t *num_keys,
+    uint64_t *num_rows, uint64_t *num_holes );
+
+
+/* Insert
+ *  creates a mapping from key to id
+ *  and potentially from id to key if supported
+ *
+ *  "unique" [ IN ] - if true, key must be unique
+ *
+ *  "key" [ IN ] - NUL terminated string for text
+ *
+ *  "id" [ IN ] - id
+ */
+KDB_EXTERN rc_t CC KIndexInsertText ( KIndex *self, bool unique,
+    const char *key, int64_t id );
+
+/* Delete
+ *  deletes all mappings from key
+ */
+KDB_EXTERN rc_t CC KIndexDeleteText ( KIndex *self, const char *key );
+
+/* Find
+ *  finds a single mapping from key
+ *
+ *  "key" [ IN ] - NUL terminated string to be found
+ *
+ *  "start_id" [ OUT ] - starting id of found range
+ *
+ *  "id_count [ OUT, NULL OKAY ] - the number of contiguous
+ *  row ids in found range
+ *
+ *  "custom_cmp" [ IN, NULL OKAY ] and "data" [ IN, OPAQUE ]
+ *  optional comparison function for search
+ */
+KDB_EXTERN rc_t CC KIndexFindText ( const KIndex *self,
+    const char *key, int64_t *start_id, uint64_t *id_count,
+    int ( CC * custom_cmp ) ( const void *item,
+        struct PBSTNode const *n, void *data ),
+    void *data );
+
+/* FindAll
+ *  finds all mappings from key
+ */
+KDB_EXTERN rc_t CC KIndexFindAllText ( const KIndex *self, const char *key,
+    rc_t ( CC * f ) ( int64_t start_id, uint64_t id_count, void *data ),
+    void *data );
+
+/* Project
+ *  finds key(s) mapping to value/id if supported
+ *
+ *  "id" [ IN ] - row id to be located
+ *
+ *  "start_id [ OUT, NULL OKAY ] - the first id of found range
+ *
+ *  "id_count [ OUT, NULL OKAY ] - the number of contiguous
+ *  row ids in found range
+ *
+ *  "key" [ OUT ] and "kmax" [ IN ] - return buffer
+ *  for NUL terminated index text
+ *
+ *  "actsize" [ OUT, NULL OKAY ] - returns key size in bytes,
+ *   excluding NUL termination
+ *
+ *  returns rcBuffer, rcInsufficient
+ *  if kmax <= strlen ( key )
+ */
+KDB_EXTERN rc_t CC KIndexProjectText ( const KIndex *self,
+    int64_t id, int64_t *start_id, uint64_t *id_count,
+    char *key, size_t kmax, size_t *actsize );
+
+
+/* ProjectAll
+ *  finds key(s) mapping to value/id if supported
+ */
+KDB_EXTERN rc_t CC KIndexProjectAllText ( const KIndex *self, int64_t id,
+    rc_t ( CC * f ) ( int64_t start_id, uint64_t id_count, const char *key, void *data ),
+    void *data );
+
+
+/* InsertU64
+ *  creates a mapping from an (file) offset range to an id range
+ *
+ *  "unique" [ IN ] - if true, key ranges cannot overlap
+ *
+ *  "key" [ IN ] - offset (in file)
+ *
+ *  "key_size" [ IN ] - size of chunk (in file)
+ *
+ *  "start_id" [ IN ] - starting id 
+ *
+ *  "id_count" [ IN ] - number of ids in chunk
+ */
+KDB_EXTERN rc_t CC KIndexInsertU64 ( KIndex *self, bool unique,
+    uint64_t key, uint64_t key_size, int64_t start_id, uint64_t id_count );
+
+/* DeleteU64
+ *  deletes all mappings from key
+ */
+KDB_EXTERN rc_t CC KIndexDeleteU64 ( KIndex *self, uint64_t key );
+
+/* FindU64
+ *  finds a FIRST chunk by offset with in file
+ */
+KDB_EXTERN rc_t CC KIndexFindU64 ( const KIndex *self, uint64_t offset,
+    uint64_t *key, uint64_t *key_size, int64_t *start_id, uint64_t *id_count );
+
+/* FindAllU64
+ *  Iterate through all chunks with an offset and call f() for each range
+ */
+KDB_EXTERN rc_t CC KIndexFindAllU64 ( const KIndex *self, uint64_t offset,
+    rc_t ( CC * f ) ( uint64_t key, uint64_t key_size,
+        int64_t start_id, uint64_t id_count, void *data ),
+    void *data);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_kdb_index_ */
diff --git a/interfaces/kdb/kdb-priv.h b/interfaces/kdb/kdb-priv.h
new file mode 100644
index 0000000..ea1aacb
--- /dev/null
+++ b/interfaces/kdb/kdb-priv.h
@@ -0,0 +1,165 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_kdb_priv_
+#define _h_kdb_kdb_priv_
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h> /* va_list */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDBManager;
+struct KDatabase;
+struct KTable;
+struct KIndex;
+struct KColumn;
+struct KMetadata;
+struct KDirectory;
+struct VFSManager;
+struct VPath;
+
+
+/*--------------------------------------------------------------------------
+ * KDBManager
+ */
+
+/* ModDate
+ *  return a modification timestamp for table
+ */
+KDB_EXTERN rc_t CC KDBManagerGetTableModDate ( struct KDBManager const *self,
+    KTime_t *mtime, const char *path, ... );
+KDB_EXTERN rc_t CC KDBManagerVGetTableModDate ( struct KDBManager const *self,
+    KTime_t *mtime, const char *path, va_list args );
+
+
+/* Make using custom VFSManager */
+KDB_EXTERN rc_t CC KDBManagerMakeReadWithVFSManager (
+    struct KDBManager const ** mgrp, struct KDirectory const * wd,
+    struct VFSManager * vfs );
+KDB_EXTERN rc_t CC KDBManagerMakeUpdateWithVFSManager (
+    struct KDBManager ** mgrp, struct KDirectory *wd,
+    struct VFSManager * vfs );
+
+KDB_EXTERN rc_t CC KDBManagerGetVFSManager ( struct KDBManager const *self,
+    struct VFSManager ** vfs );
+
+KDB_EXTERN rc_t CC KDBManagerVPathOpenLocalDBRead ( struct KDBManager const * self,
+    struct KDatabase const ** db, struct VPath const * path );
+KDB_EXTERN rc_t CC KDBManagerVPathOpenRemoteDBRead ( struct KDBManager const * self,
+    struct KDatabase const ** db, struct VPath const * remote, struct VPath const * cache );
+
+
+/*--------------------------------------------------------------------------
+ * KDatabase
+ */
+
+/* OpenDirectory
+ *  access the directory in use
+ */
+KDB_EXTERN rc_t CC KDatabaseOpenDirectoryRead ( struct KDatabase const *self, struct KDirectory const **dir );
+KDB_EXTERN rc_t CC KDatabaseOpenDirectoryUpdate ( struct KDatabase *self, struct KDirectory **dir );
+
+/* GetPath
+ *  return the absolute path to DB
+ */
+KDB_EXTERN rc_t CC KDatabaseGetPath ( struct KDatabase const *self,
+    const char **path );
+
+
+/*--------------------------------------------------------------------------
+ * KTable
+ */
+
+/* OpenDirectory
+ *  access the directory in use
+ */
+KDB_EXTERN rc_t CC KTableOpenDirectoryRead ( struct KTable const *self, struct KDirectory const **dir );
+KDB_EXTERN rc_t CC KTableOpenDirectoryUpdate ( struct KTable *self, struct KDirectory **dir );
+
+#define KTableGetDirectoryRead KTableOpenDirectoryRead
+#define KTableGetDirectoryUpdate KTableOpenDirectoryUpdate
+
+/* GetPath
+ *  return the absolute path to table
+ */
+KDB_EXTERN rc_t CC KTableGetPath ( struct KTable const *self,
+    const char **path );
+
+
+/*--------------------------------------------------------------------------
+ * KColumn
+ */
+
+/* OpenDirectory
+ *  duplicate reference to the directory in use
+ *  NB - returned reference must be released
+ */
+KDB_EXTERN rc_t CC KColumnOpenDirectoryRead ( struct KColumn const *self, struct KDirectory const **dir );
+KDB_EXTERN rc_t CC KColumnOpenDirectoryUpdate ( struct KColumn *self, struct KDirectory **dir );
+
+#define KColumnGetDirectoryRead KColumnOpenDirectoryRead
+#define KColumnGetDirectoryUpdate KColumnOpenDirectoryUpdate
+
+
+
+/*--------------------------------------------------------------------------
+ * KIndex
+ */
+
+/* MarkModified
+ *  make the index think it has been modified, such that it may be committed
+ *  useful when forcing conversion from an older version
+ */
+KDB_EXTERN rc_t CC KIndexMarkModified ( struct KIndex *self );
+
+
+/* SetMaxId
+ *  certain legacy versions of skey were built to know only the starting id
+ *  of the NAME_FMT column, but were never given a maximum id. allow them
+ *  to be corrected here.
+ */
+KDB_EXTERN void CC KIndexSetMaxRowId ( struct KIndex const *self, int64_t max_row_id );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_kdb_kdb_priv_ */
diff --git a/interfaces/kdb/manager.h b/interfaces/kdb/manager.h
new file mode 100644
index 0000000..c924376
--- /dev/null
+++ b/interfaces/kdb/manager.h
@@ -0,0 +1,182 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_manager_
+#define _h_kdb_manager_
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+/* #ifndef _h_kfs_directory_ */
+/* #include <kfs/directory.h> */
+/* #endif */
+#include <kfs/defs.h> /* kpt types */
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct VPath;
+struct KDirectory;
+
+/*--------------------------------------------------------------------------
+ * KDBPathType
+ *  extends KPathType from <kfs/defs.h>
+ */
+enum
+{
+    /* must be handled carefully and can not go back to KDirectory 
+     * as this value has a different meaning in KDirectory */
+    kptAny = 0,
+    kptDatabase = kptLastDefined,
+    kptTable,
+    kptIndex,
+    kptColumn,
+
+    /* these values may not be used in KDBManagerExists below */
+    kptMetadata,
+    kptPrereleaseTbl
+};
+
+
+/*--------------------------------------------------------------------------
+ * KDBManager
+ *  opaque handle to library
+ */
+typedef struct KDBManager KDBManager;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+KDB_EXTERN rc_t CC KDBManagerAddRef ( const KDBManager *self );
+KDB_EXTERN rc_t CC KDBManagerRelease ( const KDBManager *self );
+
+
+/* MakeRead
+ * MakeUpdate
+ *  create library handle for specific use
+ *  NB - only one of the functions will be implemented
+ *
+ *  "wd" [ IN, NULL OKAY ] - optional working directory for
+ *  accessing the file system. mgr will attach its own reference.
+ */
+KDB_EXTERN rc_t CC KDBManagerMakeRead ( const KDBManager **mgr, struct KDirectory const *wd );
+KDB_EXTERN rc_t CC KDBManagerMakeUpdate ( KDBManager **mgr, struct KDirectory *wd );
+
+
+/* Version
+ *  returns the library version
+ */
+KDB_EXTERN rc_t CC KDBManagerVersion ( const KDBManager *self, uint32_t *version );
+
+
+/* Exists
+ *  returns true if requested object exists
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *
+ *  "path" [ IN ] - NUL terminated path
+ *
+ * DEPRECATED:
+ * Should use KDBManagerPathType for reduced network thrashing.
+ */
+KDB_EXTERN bool CC KDBManagerExists ( const KDBManager *self, uint32_t type,
+    const char *name, ... );
+KDB_EXTERN bool CC KDBManagerVExists ( const KDBManager *self, uint32_t type,
+    const char *name, va_list args );
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+KDB_EXTERN rc_t CC KDBManagerWritable ( const KDBManager *self,
+    const char *path, ... );
+KDB_EXTERN rc_t CC KDBManagerVWritable ( const KDBManager *self,
+    const char *path, va_list args );
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+KDB_EXTERN rc_t CC KDBManagerLock ( KDBManager *self, const char *path, ... );
+KDB_EXTERN rc_t CC KDBManagerVLock ( KDBManager *self, const char *path, va_list args );
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+KDB_EXTERN rc_t CC KDBManagerUnlock ( KDBManager *self, const char *path, ... );
+KDB_EXTERN rc_t CC KDBManagerVUnlock ( KDBManager *self, const char *path, va_list args );
+
+
+/* Drop
+ *  drop an object based on its path
+ *
+ *  "path" [ IN ] - NUL terminated string in UTF-8 giving path to the kdb object
+ */
+KDB_EXTERN rc_t CC KDBManagerDrop ( KDBManager *self, uint32_t obj_type, const char *path, ... );
+KDB_EXTERN rc_t CC KDBManagerVDrop ( KDBManager *self, uint32_t obj_type, const char *path, va_list args );
+
+
+/* RunPeriodicTasks
+ *  executes periodic tasks, such as cache flushing
+ */
+KDB_EXTERN rc_t CC KDBManagerRunPeriodicTasks ( const KDBManager *self );
+
+
+/* PathType
+ *  check the path type of an object/directory path.
+ *  this is an extension of the KDirectoryPathType and will return
+ *  the KDirectory values if a path type is not specifically a
+ *  kdb object
+ */
+KDB_EXTERN int CC KDBManagerPathTypeVP ( const KDBManager * self, const struct VPath * path );
+KDB_EXTERN int CC KDBManagerPathType   ( const KDBManager * self, const char *path, ... );
+KDB_EXTERN int CC KDBManagerVPathType  ( const KDBManager * self, const char *path, va_list args );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kdb_manager_ */
diff --git a/interfaces/kdb/meta.h b/interfaces/kdb/meta.h
new file mode 100644
index 0000000..cee3ed7
--- /dev/null
+++ b/interfaces/kdb/meta.h
@@ -0,0 +1,411 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_meta_
+#define _h_kdb_meta_
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KTable;
+struct KColumn;
+struct KDatabase;
+
+
+/*--------------------------------------------------------------------------
+ * KMetadata
+ *  a versioned, hierarchical structure
+ */
+typedef struct KMetadata KMetadata;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+KDB_EXTERN rc_t CC KMetadataAddRef ( const KMetadata *self );
+KDB_EXTERN rc_t CC KMetadataRelease ( const KMetadata *self );
+
+
+/* OpenMetadataRead
+ *  opens metadata for read
+ *
+ *  "meta" [ OUT ] - return parameter for metadata
+ */
+KDB_EXTERN rc_t CC KDatabaseOpenMetadataRead ( struct KDatabase const *self,
+    const KMetadata **meta );
+KDB_EXTERN rc_t CC KTableOpenMetadataRead ( struct KTable const *self,
+    const KMetadata **meta );
+KDB_EXTERN rc_t CC KColumnOpenMetadataRead ( struct KColumn const *self,
+    const KMetadata **meta );
+
+/* OpenMetadataUpdate
+ *  open metadata for read/write
+ *
+ *  "meta" [ OUT ] - return parameter for metadata
+ */
+KDB_EXTERN rc_t CC KDatabaseOpenMetadataUpdate ( struct KDatabase *self,
+    KMetadata **meta );
+KDB_EXTERN rc_t CC KTableOpenMetadataUpdate ( struct KTable *self,
+    KMetadata **meta );
+KDB_EXTERN rc_t CC KColumnOpenMetadataUpdate ( struct KColumn *self,
+    KMetadata **meta );
+
+
+/* Version
+ *  returns the metadata format version
+ */
+KDB_EXTERN rc_t CC KMetadataVersion ( const KMetadata *self, uint32_t *version );
+
+
+/* ByteOrder
+ *  indicates whether original byte order is reversed
+ *  under current architecture.
+ *
+ *  the byte order of the column is established by
+ *  the host architecture when created.
+ *
+ *  "reversed" [ OUT ] - if true, the original byte
+ *  order is reversed with regard to host native byte order.
+ */
+KDB_EXTERN rc_t CC KMetadataByteOrder ( const KMetadata *self, bool *reversed );
+
+
+/* Revision
+ *  returns current revision number
+ *  where 0 ( zero ) means tip
+ */
+KDB_EXTERN rc_t CC KMetadataRevision ( const KMetadata *self, uint32_t *revision );
+
+
+/* MaxRevision
+ *  returns the maximum revision available
+ */
+KDB_EXTERN rc_t CC KMetadataMaxRevision ( const KMetadata *self, uint32_t *revision );
+
+
+/* Commit
+ *  ensure any changes are committed to disk
+ */
+KDB_EXTERN rc_t CC KMetadataCommit ( KMetadata *self );
+
+
+/* Freeze
+ *  freezes current metadata revision
+ *  further modification will begin on a copy
+ */
+KDB_EXTERN rc_t CC KMetadataFreeze ( KMetadata *self );
+
+
+/* OpenRevision
+ *  opens a read-only indexed revision of metadata
+ */
+KDB_EXTERN rc_t CC KMetadataOpenRevision ( const KMetadata *self,
+    const KMetadata **meta, uint32_t revision );
+
+
+/* GetSequence
+ * SetSequence
+ * NextSequence
+ *  access a named sequence
+ *
+ *  "seq" [ IN ] - NUL terminated sequence name
+ *
+ *  "val" [ OUT ] - return parameter for sequence value
+ *  "val" [ IN ] - new sequence value
+ */
+KDB_EXTERN rc_t CC KMetadataGetSequence ( const KMetadata *self,
+    const char *seq, int64_t *val );
+KDB_EXTERN rc_t CC KMetadataSetSequence ( KMetadata *self,
+    const char *seq, int64_t val );
+KDB_EXTERN rc_t CC KMetadataNextSequence ( KMetadata *self,
+    const char *seq, int64_t *val );
+
+
+/*--------------------------------------------------------------------------
+ * KMDataNode
+ *  a node with an optional value,
+ *  optional attributes, and optional children
+ *
+ *  nodes are identified by path, relative to a starting node,
+ *  where "/" serves as a path separator.
+ */
+typedef struct KMDataNode KMDataNode;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+KDB_EXTERN rc_t CC KMDataNodeAddRef ( const KMDataNode *self );
+KDB_EXTERN rc_t CC KMDataNodeRelease ( const KMDataNode *self );
+
+
+/* OpenNodeRead
+ * VOpenNodeRead
+ *  opens a metadata node
+ *
+ *  "node" [ OUT ] - return parameter for indicated metadata node
+ *
+ *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+ *  node within metadata hierarchy. paths will be interpreted as
+ *  if they were file system paths, using '/' as separator. the
+ *  special values NULL and "" are interpreted as "."
+ */
+KDB_EXTERN rc_t CC KMetadataOpenNodeRead ( const KMetadata *self,
+    const KMDataNode **node, const char *path, ... );
+KDB_EXTERN rc_t CC KMDataNodeOpenNodeRead ( const KMDataNode *self,
+    const KMDataNode **node, const char *path, ... );
+
+KDB_EXTERN rc_t CC KMetadataVOpenNodeRead ( const KMetadata *self,
+    const KMDataNode **node, const char *path, va_list args );
+KDB_EXTERN rc_t CC KMDataNodeVOpenNodeRead ( const KMDataNode *self,
+    const KMDataNode **node, const char *path, va_list args );
+
+
+/* OpenNodeUpdate
+ * VOpenNodeUpdate
+ *  opens a metadata node
+ *
+ *  "node" [ OUT ] - return parameter for indicated metadata node
+ *
+ *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+ *  node within metadata hierarchy. paths will be interpreted as
+ *  if they were file system paths, using '/' as separator. the
+ *  special values NULL and "" are interpreted as "."
+ */
+KDB_EXTERN rc_t CC KMetadataOpenNodeUpdate ( KMetadata *self,
+    KMDataNode **node, const char *path, ... );
+KDB_EXTERN rc_t CC KMDataNodeOpenNodeUpdate ( KMDataNode *self,
+    KMDataNode **node, const char *path, ... );
+
+KDB_EXTERN rc_t CC KMetadataVOpenNodeUpdate ( KMetadata *self,
+    KMDataNode **node, const char *path, va_list args );
+KDB_EXTERN rc_t CC KMDataNodeVOpenNodeUpdate ( KMDataNode *self,
+    KMDataNode **node, const char *path, va_list args );
+
+
+/* ByteOrder
+ *  indicates whether original byte order is reversed
+ *  under current architecture.
+ *
+ *  the byte order of the column is established by
+ *  the host architecture when created.
+ *
+ *  "reversed" [ OUT ] - if true, the original byte
+ *  order is reversed with regard to host native byte order.
+ */
+KDB_EXTERN rc_t CC KMDataNodeByteOrder ( const KMDataNode *self, bool *reversed );
+
+
+/* Read
+ *  read a node value
+ *
+ *  "offset" [ IN ] - initial offset into metadata
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - number of bytes actually read
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of bytes remaining to be read.
+ *  specifically, "offset" + "num_read" + "remaining" == sizeof node data
+ */
+KDB_EXTERN rc_t CC KMDataNodeRead ( const KMDataNode *self,
+    size_t offset, void *buffer, size_t bsize,
+    size_t *num_read, size_t *remaining );
+
+
+/* Write
+ *  write a node value or attribute
+ *  overwrites anything already there
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - new value data
+ */
+KDB_EXTERN rc_t CC KMDataNodeWrite ( KMDataNode *self, const void *buffer, size_t size );
+
+
+/* Append
+ *  append data to value
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - value data to be appended
+ */
+KDB_EXTERN rc_t CC KMDataNodeAppend ( KMDataNode *self, const void *buffer, size_t size );
+
+
+/* Read ( formatted )
+ *  reads as integer or float value in native byte order
+ *
+ *  "bXX" [ OUT ] - return parameter for numeric value
+ */
+KDB_EXTERN rc_t CC KMDataNodeReadB8 ( const KMDataNode *self, void *b8 );
+KDB_EXTERN rc_t CC KMDataNodeReadB16 ( const KMDataNode *self, void *b16 );
+KDB_EXTERN rc_t CC KMDataNodeReadB32 ( const KMDataNode *self, void *b32 );
+KDB_EXTERN rc_t CC KMDataNodeReadB64 ( const KMDataNode *self, void *b64 );
+KDB_EXTERN rc_t CC KMDataNodeReadB128 ( const KMDataNode *self, void *b128 );
+
+
+/* ReadAs ( formatted )
+ *  reads as integer or float value in native byte order
+ *  casts smaller-sized values to desired size, e.g.
+ *    uint32_t to uint64_t
+ *
+ *  "i" [ OUT ] - return parameter for signed integer
+ *  "u" [ OUT ] - return parameter for unsigned integer
+ *  "f" [ OUT ] - return parameter for double float
+ */
+KDB_EXTERN rc_t CC KMDataNodeReadAsI16 ( const KMDataNode *self, int16_t *i );
+KDB_EXTERN rc_t CC KMDataNodeReadAsU16 ( const KMDataNode *self, uint16_t *u );
+KDB_EXTERN rc_t CC KMDataNodeReadAsI32 ( const KMDataNode *self, int32_t *i );
+KDB_EXTERN rc_t CC KMDataNodeReadAsU32 ( const KMDataNode *self, uint32_t *u );
+KDB_EXTERN rc_t CC KMDataNodeReadAsI64 ( const KMDataNode *self, int64_t *i );
+KDB_EXTERN rc_t CC KMDataNodeReadAsU64 ( const KMDataNode *self, uint64_t *u );
+KDB_EXTERN rc_t CC KMDataNodeReadAsF64 ( const KMDataNode *self, double *f );
+
+
+/* Read ( formatted )
+ *  reads as C-string
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated string.
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+KDB_EXTERN rc_t CC KMDataNodeReadCString ( const KMDataNode *self,
+    char *buffer, size_t bsize, size_t *size );
+
+
+/* Write ( formatted )
+ *  writes integer or float value in metadata byte order
+ *
+ *  "bXX" [ IN ] - numeric value
+ */
+KDB_EXTERN rc_t CC KMDataNodeWriteB8 ( KMDataNode *self, const void *b8 );
+KDB_EXTERN rc_t CC KMDataNodeWriteB16 ( KMDataNode *self, const void *b16 );
+KDB_EXTERN rc_t CC KMDataNodeWriteB32 ( KMDataNode *self, const void *b32 );
+KDB_EXTERN rc_t CC KMDataNodeWriteB64 ( KMDataNode *self, const void *b64 );
+KDB_EXTERN rc_t CC KMDataNodeWriteB128 ( KMDataNode *self, const void *b128 );
+
+
+/* Write ( formatted )
+ *  writes string
+ *
+ *  "str" [ IN ] - NUL terminated string.
+ */
+KDB_EXTERN rc_t CC KMDataNodeWriteCString ( KMDataNode *self, const char *str );
+
+
+/* ReadAttr
+ *  reads as NUL-terminated string
+ *
+ *  "name" [ IN ] - NUL terminated attribute name
+ *
+ *  "buffer" [ OUT ] and "bsize" - return parameter for attribute value
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+KDB_EXTERN rc_t CC KMDataNodeReadAttr ( const KMDataNode *self, const char *name,
+    char *buffer, size_t bsize, size_t *size );
+
+
+/* WriteAttr
+ *  writes NUL-terminated string
+ *
+ *  "name" [ IN ] - NUL terminated attribute name
+ *
+ *  "value" [ IN ] - NUL terminated attribute value
+ */
+KDB_EXTERN rc_t CC KMDataNodeWriteAttr ( KMDataNode *self,
+    const char *name, const char *value );
+
+
+/* ReadAttrAs ( formatted )
+ *  reads as integer or float value in native byte order
+ *  casts smaller-sized values to desired size, e.g.
+ *    uint32_t to uint64_t
+ *
+ *  "i" [ OUT ] - return parameter for signed integer
+ *  "u" [ OUT ] - return parameter for unsigned integer
+ *  "f" [ OUT ] - return parameter for double float
+ */
+KDB_EXTERN rc_t CC KMDataNodeReadAttrAsI16 ( const KMDataNode *self, const char *attr, int16_t *i );
+KDB_EXTERN rc_t CC KMDataNodeReadAttrAsU16 ( const KMDataNode *self, const char *attr, uint16_t *u );
+KDB_EXTERN rc_t CC KMDataNodeReadAttrAsI32 ( const KMDataNode *self, const char *attr, int32_t *i );
+KDB_EXTERN rc_t CC KMDataNodeReadAttrAsU32 ( const KMDataNode *self, const char *attr, uint32_t *u );
+KDB_EXTERN rc_t CC KMDataNodeReadAttrAsI64 ( const KMDataNode *self, const char *attr, int64_t *i );
+KDB_EXTERN rc_t CC KMDataNodeReadAttrAsU64 ( const KMDataNode *self, const char *attr, uint64_t *u );
+KDB_EXTERN rc_t CC KMDataNodeReadAttrAsF64 ( const KMDataNode *self, const char *attr, double *f );
+
+
+/* Drop
+ * VDrop
+ *  drop some or all node content
+ */
+KDB_EXTERN rc_t CC KMDataNodeDropAll ( KMDataNode *self );
+KDB_EXTERN rc_t CC KMDataNodeDropAttr ( KMDataNode *self, const char *attr );
+KDB_EXTERN rc_t CC KMDataNodeDropChild ( KMDataNode *self, const char *path, ... );
+KDB_EXTERN rc_t CC KMDataNodeVDropChild ( KMDataNode *self, const char *path, va_list args );
+
+
+/* Rename
+ *  renames a contained object
+ *
+ *  "from" [ IN ] - NUL terminated string in UTF-8
+ *  giving simple name of existing attr
+ *
+ *  "to" [ IN ] - NUL terminated string in UTF-8
+ *  giving new simple attr name
+ */
+KDB_EXTERN rc_t CC KMDataNodeRenameAttr ( KMDataNode *self, const char *from, const char *to );
+KDB_EXTERN rc_t CC KMDataNodeRenameChild ( KMDataNode *self, const char *from, const char *to );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_kdb_meta_ */
diff --git a/interfaces/kdb/meta.hpp b/interfaces/kdb/meta.hpp
new file mode 100644
index 0000000..ca2d9a9
--- /dev/null
+++ b/interfaces/kdb/meta.hpp
@@ -0,0 +1,487 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_kdb_meta_
+#define _hpp_kdb_meta_
+
+#ifndef _h_kdb_meta_
+#include <kdb/meta.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KMetadata
+ *  a versioned, hierarchical structure
+ */
+struct KMetadata
+{
+    /* AddRef
+     * Release
+     *  all objects are reference counted
+     *  NULL references are ignored
+     */
+    inline rc_t AddRef () const throw()
+    { return KMetadataAddRef ( this ); }
+
+    inline rc_t Release () const  throw()
+    { return KMetadataRelease ( this ); }
+
+
+    /* OpenNodeRead
+     *  opens a metadata node
+     *
+     *  "node" [ OUT ] - return parameter for indicated metadata node
+     *
+     *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+     *  node within metadata hierarchy. paths will be interpreted as
+     *  if they were file system paths, using '/' as separator. the
+     *  special values NULL and "" are interpreted as "."
+     */
+    inline rc_t OpenNodeRead ( const KMDataNode **node, 
+        const char *path, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KMetadataVOpenNodeRead ( this, node, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenNodeRead ( const KMDataNode **node, 
+        const char *path, va_list args ) const throw()
+    { return KMetadataVOpenNodeRead ( this, node, path, args ); }
+
+
+    /* OpenNodeUpdate
+     *  opens a metadata node
+     *
+     *  "node" [ OUT ] - return parameter for indicated metadata node
+     *
+     *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+     *  node within metadata hierarchy. paths will be interpreted as
+     *  if they were file system paths, using '/' as separator. the
+     *  special values NULL and "" are interpreted as "."
+     */
+    inline rc_t OpenNodeUpdate ( KMDataNode **node, 
+        const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KMetadataVOpenNodeUpdate ( this, node, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenNodeUpdate ( KMDataNode **node, 
+        const char *path, va_list args ) throw()
+    { return KMetadataVOpenNodeUpdate ( this, node, path, args ); }
+
+
+    /* Version
+     *  returns the metadata format version
+     */
+    inline rc_t Version ( uint32_t *version ) const  throw()
+    { return KMetadataVersion ( this, version ); }
+
+
+    /* ByteOrder
+     *  indicates whether original byte order is reversed
+     *  under current architecture.
+     *
+     *  the byte order of the column is established by
+     *  the host architecture when created.
+     *
+     *  "reversed" [ OUT ] - if true, the original byte
+     *  order is reversed with regard to host native byte order.
+     */
+    inline rc_t ByteOrder ( bool *reversed ) const throw()
+    { return KMetadataByteOrder ( this, reversed ); }
+
+
+    /* Revision
+     *  returns current revision number
+     *  where 0 ( zero ) means tip
+     */
+    inline rc_t Revision ( uint32_t *revision ) const throw()
+    { return KMetadataRevision ( this, revision ); }
+
+
+    /* MaxRevision
+     *  returns the maximum revision available
+     */
+    inline rc_t MaxRevision ( uint32_t *revision ) const throw()
+    { return KMetadataMaxRevision ( this, revision ); }
+
+
+    /* Commit
+     *  ensure any changes are committed to disk
+     */
+    inline rc_t Commit () throw()
+    { return KMetadataCommit ( this ); }
+
+
+    /* Freeze
+     *  freezes current metadata revision
+     *  further modification will begin on a copy
+     */
+    inline rc_t Freeze () throw()
+    { return KMetadataFreeze ( this ); }
+
+
+    /* OpenRevision
+     *  opens a read-only indexed revision of metadata
+     */
+    inline rc_t OpenRevision ( const KMetadata **meta, uint32_t revision ) const throw()
+    { return KMetadataOpenRevision ( this, meta, revision ); }
+
+
+    /* GetSequence
+     * SetSequence
+     * NextSequence
+     *  access a named sequence
+     *
+     *  "seq" [ IN ] - NUL terminated sequence name
+     *
+     *  "val" [ OUT ] - return parameter for sequence value
+     *  "val" [ IN ] - new sequence value
+     */
+    inline rc_t GetSequence ( const char *seq, int64_t *val ) const throw()
+    { return KMetadataGetSequence ( this, seq, val ); }
+
+    inline rc_t SetSequence ( const char *seq, int64_t val ) throw()
+    { return KMetadataSetSequence ( this, seq, val ); }
+
+    inline rc_t NextSequence ( const char *seq, int64_t *val ) throw()
+    { return KMetadataNextSequence ( this, seq, val ); }
+
+private:
+    KMetadata ();
+    ~ KMetadata ();
+    KMetadata ( const KMetadata& );
+    KMetadata &operator = ( const KMetadata& );
+
+};
+
+
+/*--------------------------------------------------------------------------
+ * KMDataNode
+ *  a node with an optional value,
+ *  optional attributes, and optional children
+ *
+ *  nodes are identified by path, relative to a starting node,
+ *  where "/" serves as a path separator.
+ */
+struct KMDataNode
+{
+    /* AddRef
+     * Release
+     *  ignores NULL references
+     */
+    inline rc_t AddRef () const  throw()
+    { return KMDataNodeAddRef ( this ); }
+
+    inline rc_t Release () const  throw()
+    { return KMDataNodeRelease ( this ); }
+
+
+    /* OpenNodeRead
+     * VOpenNodeRead
+     *  opens a metadata node
+     *
+     *  "node" [ OUT ] - return parameter for indicated metadata node
+     *
+     *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+     *  node within metadata hierarchy. paths will be interpreted as
+     *  if they were file system paths, using '/' as separator. the
+     *  special values NULL and "" are interpreted as "."
+     */
+    inline rc_t OpenNodeRead ( const KMDataNode **node,
+        const char *path, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KMDataNodeVOpenNodeRead ( this, node, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenNodeRead ( const KMDataNode **node,
+        const char *path, va_list args ) const throw()
+    { return KMDataNodeVOpenNodeRead ( this, node, path, args ); }
+
+
+    /* OpenNodeUpdate
+     * VOpenNodeUpdate
+     *  opens a metadata node
+     *
+     *  "node" [ OUT ] - return parameter for indicated metadata node
+     *
+     *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+     *  node within metadata hierarchy. paths will be interpreted as
+     *  if they were file system paths, using '/' as separator. the
+     *  special values NULL and "" are interpreted as "."
+     */
+    inline rc_t OpenNodeUpdate ( KMDataNode **node,
+        const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KMDataNodeVOpenNodeUpdate ( this, node, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenNodeUpdate ( KMDataNode **node,
+        const char *path, va_list args ) throw()
+    { return KMDataNodeVOpenNodeUpdate ( this, node, path, args ); }
+
+
+    /* ByteOrder
+     *  indicates whether original byte order is reversed
+     *  under current architecture.
+     *
+     *  the byte order of the column is established by
+     *  the host architecture when created.
+     *
+     *  "reversed" [ OUT ] - if true, the original byte
+     *  order is reversed with regard to host native byte order.
+     */
+     inline rc_t ByteOrder ( bool *reversed ) const throw()
+     { return KMDataNodeByteOrder ( this, reversed ); }
+
+
+    /* Write
+     *  write a node value or attribute
+     *  overwrites anything already there
+     *
+     *  "buffer" [ IN ] and "size" [ IN ] - new value data
+     */
+     inline rc_t Write ( const void *buffer, size_t size ) throw()
+     { return KMDataNodeWrite ( this, buffer, size ); }
+
+
+     /* Append
+      *  append data to value
+      *
+      *  "buffer" [ IN ] and "size" [ IN ] - value data to be appended
+      */
+     inline rc_t Append ( const void *buffer, size_t size ) throw()
+     { return KMDataNodeAppend ( this, buffer, size ); }
+
+
+    /* Read ( formatted )
+     *  reads as integer or float value in native byte order
+     *
+     *  "bXX" [ OUT ] - return parameter for numeric value
+     */
+     inline rc_t ReadB8 ( void *b8 ) const throw()
+     { return KMDataNodeReadB8 ( this, b8 ); }
+     inline rc_t ReadB16 ( void *b16 ) const throw()
+     { return KMDataNodeReadB16 ( this, b16 ); }
+     inline rc_t ReadB32 ( void *b32 ) const throw()
+     { return KMDataNodeReadB32 ( this, b32 ); }
+     inline rc_t ReadB64 ( void *b64 ) const throw()
+     { return KMDataNodeReadB64 ( this, b64 ); }
+     inline rc_t ReadB128 ( void *b128 ) const throw()
+     { return KMDataNodeReadB128 ( this, b128 ); }
+
+
+    /* Read
+     *  read a node value
+     *
+     *  "offset" [ IN ] - initial offset into metadata
+     *
+     *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+     *
+     *  "num_read" [ OUT ] - number of bytes actually read
+     *
+     *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+     *  the number of bytes remaining to be read.
+     *  specifically, "offset" + "num_read" + "remaining" == sizeof node data
+     */
+     inline rc_t Read ( size_t offset, void *buffer, size_t bsize,
+        size_t *num_read, size_t *remaining ) const throw()
+     { return KMDataNodeRead ( this, offset, buffer, bsize, num_read, remaining ); }
+
+
+    /* Read ( formatted )
+     *  reads as integer or float value in native byte order
+     *  casts smaller-sized values to desired size, e.g.
+     *    uint32_t to uint64_t
+     *
+     *  "i" [ OUT ] - return parameter for signed integer
+     *  "u" [ OUT ] - return parameter for unsigned integer
+     *  "f" [ OUT ] - return parameter for double float
+     */
+     inline rc_t Read ( int16_t *value ) const  throw()
+    { return KMDataNodeReadAsI16 ( this, value ); }
+     inline rc_t Read ( uint16_t *value ) const  throw()
+    { return KMDataNodeReadAsU16 ( this, value ); }
+
+     inline rc_t Read ( int32_t *value ) const  throw()
+    { return KMDataNodeReadAsI32 ( this, value ); }
+     inline rc_t Read ( uint32_t *value ) const  throw()
+    { return KMDataNodeReadAsU32 ( this, value ); }
+
+    inline rc_t Read ( int64_t *value ) const  throw()
+    { return KMDataNodeReadAsI64 ( this, value ); }
+    inline rc_t Read ( uint64_t *value ) const  throw()
+    { return KMDataNodeReadAsU64 ( this, value ); }
+
+    inline rc_t Read ( double *value ) const  throw()
+    { return KMDataNodeReadAsF64 ( this, value ); }
+
+
+    /* Read ( formatted )
+     *  reads as C-string
+     *
+     *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+     *  NUL terminated string.
+     *
+     *  "size" [ OUT ] - return parameter giving size of string
+     *  not including NUL byte. the size is set both upon success
+     *  and insufficient buffer space error.
+     */
+    inline rc_t Read ( char *buffer, size_t bsize, size_t *size ) const  throw()
+    { return KMDataNodeReadCString ( this, buffer, bsize, size ); }
+
+
+    /* Write ( formatted )
+     *  writes integer or float value in metadata byte order
+     *
+     *  "bXX" [ IN ] - numeric value
+     */
+     inline rc_t WriteB8 ( const void *b8 ) throw()
+     { return KMDataNodeWriteB8 ( this, b8 ); }
+     inline rc_t WriteB16 ( const void *b16 ) throw()
+     { return KMDataNodeWriteB16 ( this, b16 ); }
+     inline rc_t WriteB32 ( const void *b32 ) throw()
+     { return KMDataNodeWriteB32 ( this, b32 ); }
+     inline rc_t WriteB64 ( const void *b64 ) throw()
+     { return KMDataNodeWriteB64 ( this, b64 ); }
+     inline rc_t WriteB128 ( const void *b128 ) throw()
+     { return KMDataNodeWriteB128 ( this, b128 ); }
+
+
+    /* Write ( formatted )
+     *  writes string
+     *
+     *  "str" [ IN ] - NUL terminated string.
+     */
+     inline rc_t WriteCString ( const char *str ) throw()
+     { return KMDataNodeWriteCString ( this, str ); }
+
+
+    /* ReadAttr
+     *  reads as NUL-terminated string
+     *
+     *  "name" [ IN ] - NUL terminated attribute name
+     *
+     *  "buffer" [ OUT ] and "bsize" - return parameter for attribute value
+     *
+     *  "size" [ OUT ] - return parameter giving size of string
+     *  not including NUL byte. the size is set both upon success
+     *  and insufficient buffer space error.
+     */
+     inline rc_t ReadAttr ( const char *name, char *buffer, 
+        size_t bsize, size_t *size ) const throw()
+     { return KMDataNodeReadAttr ( this, name, buffer, bsize, size ); }
+
+
+    /* WriteAttr
+     *  writes NUL-terminated string
+     *
+     *  "name" [ IN ] - NUL terminated attribute name
+     *
+     *  "value" [ IN ] - NUL terminated attribute value
+     */
+    inline rc_t WriteAttr ( const char *name, const char *value )  throw()
+    { return KMDataNodeWriteAttr ( this, name, value ); }
+
+
+    /* ReadAttrAs ( formatted )
+     *  reads as integer or float value in native byte order
+     *  casts smaller-sized values to desired size, e.g.
+     *    uint32_t to uint64_t
+     *
+     *  "i" [ OUT ] - return parameter for signed integer
+     *  "u" [ OUT ] - return parameter for unsigned integer
+     *  "f" [ OUT ] - return parameter for double float
+     */
+     inline rc_t ReadAttrAsI16 ( const char *attr, int16_t *i ) const throw()
+     { return KMDataNodeReadAttrAsI16 ( this, attr, i ); }
+     inline rc_t ReadAttrAsU16 ( const char *attr, uint16_t *i ) const throw()
+     { return KMDataNodeReadAttrAsU16 ( this, attr, i ); }
+     inline rc_t ReadAttrAsI32 ( const char *attr, int32_t *i ) const throw()
+     { return KMDataNodeReadAttrAsI32 ( this, attr, i ); }
+     inline rc_t ReadAttrAsU32 ( const char *attr, uint32_t *i ) const throw()
+     { return KMDataNodeReadAttrAsU32 ( this, attr, i ); }
+     inline rc_t ReadAttrAsI64 ( const char *attr, int64_t *i ) const throw()
+     { return KMDataNodeReadAttrAsI64 ( this, attr, i ); }
+     inline rc_t ReadAttrAsU64 ( const char *attr, uint64_t *i ) const throw()
+     { return KMDataNodeReadAttrAsU64 ( this, attr, i ); }
+     inline rc_t ReadAttrAsF64 ( const char *attr, double *f ) const throw()
+     { return KMDataNodeReadAttrAsF64 ( this, attr, f ); }
+
+
+     /* Drop
+     *  drop some or all node content
+     */
+     inline rc_t DropAll () throw()
+     { return KMDataNodeDropAll ( this ); }
+     inline rc_t DropAttr ( const char *attr ) throw()
+     { return KMDataNodeDropAttr ( this, attr ); }
+     inline rc_t DropChild ( const char *path, ... ) throw()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KMDataNodeVDropChild ( this, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t DropChild ( const char *path, va_list args ) throw()
+     { return KMDataNodeVDropChild ( this, path, args ); }
+
+
+    /* Rename
+     *  renames a contained object
+     *
+     *  "from" [ IN ] - NUL terminated string in UTF-8
+     *  giving simple name of existing attr
+     *
+     *  "to" [ IN ] - NUL terminated string in UTF-8
+     *  giving new simple attr name
+     */
+    inline rc_t RenameAttr ( const char *from, const char *to ) throw()
+    { return KMDataNodeRenameAttr ( this, from, to ); }
+    inline rc_t RenameChild ( const char *from, const char *to ) throw()
+    { return KMDataNodeRenameChild ( this, from, to ); }
+
+private:
+    KMDataNode ();
+    ~ KMDataNode ();
+    KMDataNode ( const KMDataNode& );
+    KMDataNode &operator = ( const KMDataNode& );
+};
+
+
+#endif // _hpp_kdb_meta_
diff --git a/interfaces/kdb/namelist.h b/interfaces/kdb/namelist.h
new file mode 100644
index 0000000..68233f4
--- /dev/null
+++ b/interfaces/kdb/namelist.h
@@ -0,0 +1,81 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_namelist_
+#define _h_kdb_namelist_
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KTable;
+struct KDatabase;
+struct KMDataNode;
+struct KNamelist;
+
+
+/*--------------------------------------------------------------------------
+ * KNamelist
+ */
+
+/* List
+ *  create database listings
+ */
+KDB_EXTERN rc_t CC KDatabaseListDB ( struct KDatabase const *self, struct KNamelist **names );
+KDB_EXTERN rc_t CC KDatabaseListTbl ( struct KDatabase const *self, struct KNamelist **names );
+KDB_EXTERN rc_t CC KDatabaseListIdx ( struct KDatabase const *self, struct KNamelist **names );
+
+/* List
+ *  create table listings
+ */
+KDB_EXTERN rc_t CC KTableListCol ( struct KTable const *self, struct KNamelist **names );
+KDB_EXTERN rc_t CC KTableListIdx ( struct KTable const *self, struct KNamelist **names );
+
+/* List
+ *  create metadata node listings
+ */
+KDB_EXTERN rc_t CC KMDataNodeListAttr ( struct KMDataNode const *self, struct KNamelist **names );
+KDB_EXTERN rc_t CC KMDataNodeListChildren ( struct KMDataNode const *self, struct KNamelist **names );
+#define KMDataNodeListChild KMDataNodeListChildren
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kdb_namelist_ */
diff --git a/interfaces/kdb/rowset-impl.h b/interfaces/kdb/rowset-impl.h
new file mode 100644
index 0000000..da77b29
--- /dev/null
+++ b/interfaces/kdb/rowset-impl.h
@@ -0,0 +1,141 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_rowset_impl_
+#define _h_kdb_rowset_impl_
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+#ifndef _h_kfc_refcount_impl_
+#include <kfc/refcount-impl.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef KROWSET
+#define KROWSET KRowSet
+#endif
+
+#ifndef KROWSET_IT
+#define KROWSET_IT KRowSetIterator
+#endif
+
+#ifndef KROWSET_DATA
+#define KROWSET_DATA void
+#endif
+
+/* we do not want to expand the RC codes now */
+#define rcRowSet rcVector
+\
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+typedef struct KRowSet_v1_vt KRowSet_v1_vt;
+typedef struct KRowSetIterator_v1_vt KRowSetIterator_v1_vt;
+
+extern KITFTOK_DECL ( KRowSet );
+extern KITFTOK_DECL ( KRowSetIterator );
+
+/*--------------------------------------------------------------------------
+ * KRowSet
+ */
+struct KRowSet
+{
+    KRefcount_v1 dad;
+    const struct KTable * table;
+
+    /* "morphable" state */
+    KROWSET_DATA * data;
+};
+
+
+/*--------------------------------------------------------------------------
+ * KRowSet_v1_vt
+ */
+struct KRowSet_v1_vt
+{
+    KVTable dad;
+
+    /* start minor version == 0 */
+    void ( CC * destroy_data ) ( KROWSET_DATA * self, ctx_t ctx );
+    /* probably need a serialization function */
+    void ( CC * add_row_id_range ) ( struct KROWSET * self, ctx_t ctx, int64_t start_row_id, uint64_t count );
+    uint64_t ( CC * get_num_rows ) ( const struct KROWSET * self, ctx_t ctx );
+    bool ( CC * has_row_id ) ( const struct KROWSET * self, ctx_t ctx, int64_t row_id );
+    struct KROWSET_IT * ( CC * get_iterator ) ( const struct KROWSET * self, ctx_t ctx );
+    /* end minor version == 0 */
+};
+
+/* Init
+ *  initialize a newly allocated RowSet object
+ */
+KDB_EXTERN void CC KRowSetInit ( struct KRowSet *self, ctx_t ctx, const KVTable *kvt,
+    const char *classname );
+
+/* MakeRowSet
+ *  create specific instance of a rowset
+ */
+KDB_EXTERN KRowSet * CC KTableMakeRowSetSimple ( struct KTable const * self, ctx_t ctx );
+
+/*--------------------------------------------------------------------------
+ * KRowSetIterator
+ */
+struct KRowSetIterator
+{
+    KRefcount_v1 dad;
+};
+
+/*--------------------------------------------------------------------------
+ * KRowSetIterator_v1_vt
+ */
+struct KRowSetIterator_v1_vt
+{
+    KVTable dad;
+
+    /* start minor version == 0 */
+    bool ( CC * next ) ( struct KROWSET_IT * self, ctx_t ctx );
+    bool ( CC * is_valid ) ( const struct KROWSET_IT * self );
+    int64_t ( CC * get_row_id ) ( const struct KROWSET_IT * self, ctx_t ctx );
+    /* end minor version == 0 */
+};
+
+/* Init
+ *  initialize a newly allocated RowSet object
+ */
+KDB_EXTERN void CC KRowSetIteratorInit ( struct KRowSetIterator *self, ctx_t ctx, const KVTable *kvt,
+    const char *classname );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kdb_rowset_impl_ */
diff --git a/interfaces/kdb/rowset.h b/interfaces/kdb/rowset.h
new file mode 100644
index 0000000..ab35cd6
--- /dev/null
+++ b/interfaces/kdb/rowset.h
@@ -0,0 +1,186 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_kdb_rowset_
+#define _h_kdb_rowset_
+
+#ifndef _h_kfc_refcount_
+#include <kfc/refcount.h>
+#endif
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KTable;
+
+/*--------------------------------------------------------------------------
+ * KRowSet
+ *  a subset of matching rows
+ */
+typedef struct KRowSet KRowSet;
+
+/* MakeRowSet
+ *  may add others...
+ */
+KDB_EXTERN KRowSet * CC KTableMakeRowSet ( struct KTable const * self, ctx_t ctx );
+
+
+/* Duplicate
+ * Release
+ *  ignores NULL references
+ */
+static __inline__
+KRowSet * KRowSetDuplicate ( const KRowSet * self, ctx_t ctx, caps_t rm )
+{
+    return ( KRowSet * ) KRefcountDuplicate_v1 ( TO_REFCOUNT_V1 ( self ), ctx, rm );
+}
+
+static __inline__
+void KRowSetRelease ( const KRowSet * self, ctx_t ctx )
+{
+    KRefcountRelease_v1 ( TO_REFCOUNT_V1 ( self ), ctx );
+}
+
+/* AddRowId
+ *  add a single row to set
+ *
+ *  "row_id" [ IN ] - row-id to be added
+ */
+KDB_EXTERN void CC KRowSetAddRowId ( KRowSet * self, ctx_t ctx, int64_t row_id );
+
+
+/* AddRowIdRange
+ *  adds row-ids within specified range
+ *
+ *  "row_id" [ IN ] and "count" [ IN ] - range of row-ids to be added
+ */
+KDB_EXTERN void CC KRowSetAddRowIdRange ( KRowSet * self, ctx_t ctx, int64_t row_id, uint64_t count );
+
+/* needed (? maybe ?)
+ *  add an array of row-ids in random order
+ */
+
+
+/* GetNumRowIds
+ *  return the number of elements in set
+ */
+KDB_EXTERN uint64_t CC KRowSetGetNumRowIds ( const KRowSet * self, ctx_t ctx );
+
+/* HasRowId
+ *  checks if element is present in set
+ */
+KDB_EXTERN bool CC KRowSetHasRowId ( const KRowSet * self, ctx_t ctx, int64_t row_id );
+
+/* Visit
+ *  execute a function on each row-id in set
+ */
+KDB_EXTERN void CC KRowSetVisit ( const KRowSet * self, ctx_t ctx,
+    void ( CC * f ) ( ctx_t ctx, int64_t row_id, void * data ), void * data );
+
+/* Intersect
+ *  performs an intersection between two sets and returns the result
+ */
+KDB_EXTERN KRowSet * CC KRowSetIntersect ( ctx_t ctx, const KRowSet * a, const KRowSet * b );
+
+/* Union
+ *  performs a union between two sets and returns the result
+ */
+KDB_EXTERN KRowSet * CC KRowSetUnion ( ctx_t ctx, const KRowSet * a, const KRowSet * b );
+
+/*--------------------------------------------------------------------------
+ * KRowSetIterator
+ *  an iterator over rowset
+ */
+typedef struct KRowSetIterator KRowSetIterator;
+
+
+/* MakeIterator
+ *  create an iterator on set
+ *  initially set to first row-id in set
+ *  iterator always goes over rows in sorted order
+ *  after creating an iterator, any modifications of rowset will result in undefined behavior
+ *    when accessing the iterator (except IteratorRelease function)
+ */
+KDB_EXTERN KRowSetIterator * CC KRowSetMakeIterator ( const KRowSet * self, ctx_t ctx );
+
+
+/* Duplicate
+ * Release
+ *  ignores NULL references
+ */
+static __inline__
+KRowSet * KRowSetIteratorDuplicate ( const KRowSetIterator * self, ctx_t ctx, caps_t rm )
+{
+    return ( KRowSet * ) KRefcountDuplicate_v1 ( TO_REFCOUNT_V1 ( self ), ctx, rm );
+}
+
+static __inline__
+void KRowSetIteratorRelease ( const KRowSetIterator * self, ctx_t ctx )
+{
+    KRefcountRelease_v1 ( TO_REFCOUNT_V1 ( self ), ctx );
+}
+
+/* Next
+ *  advance iterator to next row-id
+
+ *  advance to first row-id on initial invocation
+ *  advance to next row-id subsequently
+ *  returns false if no more row-ids are available.
+ */
+KDB_EXTERN bool CC KRowSetIteratorNext ( KRowSetIterator * self, ctx_t ctx );
+
+/*IsValid
+ * check if iterator points to a valid row
+ *
+ * returns false when iterator points somewhere outside of a row set
+ */
+KDB_EXTERN bool CC KRowSetIteratorIsValid ( const KRowSetIterator * self );
+
+/* GetRowId
+ *  report current row id
+ */
+KDB_EXTERN int64_t CC KRowSetIteratorGetRowId ( const KRowSetIterator * self, ctx_t ctx );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kdb_rowset_ */
diff --git a/interfaces/kdb/table.h b/interfaces/kdb/table.h
new file mode 100644
index 0000000..bd81c9e
--- /dev/null
+++ b/interfaces/kdb/table.h
@@ -0,0 +1,298 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_table_
+#define _h_kdb_table_
+
+#ifndef _h_kdb_extern_
+#include <kdb/extern.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDatabase;
+struct KDBManager;
+
+
+/*--------------------------------------------------------------------------
+ * KTable
+ *  a collection of columns indexed by row id, metadata, indices
+ */
+typedef struct KTable KTable;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+KDB_EXTERN rc_t CC KTableAddRef ( const KTable *self );
+KDB_EXTERN rc_t CC KTableRelease ( const KTable *self );
+
+
+/* CreateTable
+ * VCreateTable
+ *  create a new or open an existing table
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "cmode_mask" [ IN ] - if a bit of "cmode_mask" is set (1) then
+ *  the corresponding bit of "cmode" is used for the table,
+ *  otherwise (0) the corresponding bit is taken from db and "cmode"'s
+ *  bit is ignored
+ *  the mask for setting mode (kcmOpen, kcmInit, kcmCreate) is at least
+ *  one bit set in the mask kcmValueMask.
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to table
+ */
+KDB_EXTERN rc_t CC KDBManagerCreateTable ( struct KDBManager *self,
+    KTable **tbl, KCreateMode cmode, const char *path, ... );
+KDB_EXTERN rc_t CC KDatabaseCreateTableByMask ( struct KDatabase *self,
+    KTable **tbl, KCreateMode cmode, KCreateMode cmode_mask, const char *name, ... );
+/* the following function is DEPRECATED, it's left for backward compatibility only */
+KDB_EXTERN rc_t CC KDatabaseCreateTable ( struct KDatabase *self,
+    KTable **tbl, KCreateMode cmode, const char *name, ... );
+
+/* Default function is added only to make tools/kqsh build possible since
+   it requires 1 to 1 mapping between K- and V-functions
+*/
+/*KDB_EXTERN rc_t CC KDatabaseCreateTableDefault ( struct KDatabase *self,
+    KTable **tbl, const char *name, ... );*/
+KDB_EXTERN rc_t CC KDBManagerVCreateTable ( struct KDBManager *self,
+    KTable **tbl, KCreateMode cmode, const char *path, va_list args );
+KDB_EXTERN rc_t CC KDatabaseVCreateTableByMask ( struct KDatabase *self,
+    KTable **tbl, KCreateMode cmode, KCreateMode cmode_mask, const char *name, va_list args );
+/* the following function is DEPRECATED, it's left for backward compatibility only */
+KDB_EXTERN rc_t CC KDatabaseVCreateTable ( struct KDatabase *self,
+    KTable **tbl, KCreateMode cmode, const char *name, va_list args );
+
+
+/* OpenTableRead
+ * VOpenTableRead
+ *  open a table for read
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to table
+ */
+KDB_EXTERN rc_t CC KDBManagerOpenTableRead ( struct KDBManager const *self,
+    const KTable **tbl, const char *path, ... );
+KDB_EXTERN rc_t CC KDatabaseOpenTableRead ( struct KDatabase const *self,
+    const KTable **tbl, const char *name, ... );
+
+KDB_EXTERN rc_t CC KDBManagerVOpenTableRead ( struct KDBManager const *self,
+    const KTable **tbl, const char *path, va_list args );
+KDB_EXTERN rc_t CC KDatabaseVOpenTableRead ( struct KDatabase const *self,
+    const KTable **tbl, const char *name, va_list args );
+
+
+/* OpenTableUpdate
+ * VOpenTableUpdate
+ *  open a table for read/write
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving name of table
+ */
+KDB_EXTERN rc_t CC KDBManagerOpenTableUpdate ( struct KDBManager *self,
+    KTable **tbl, const char *path, ... );
+KDB_EXTERN rc_t CC KDatabaseOpenTableUpdate ( struct KDatabase *self,
+    KTable **tbl, const char *name, ... );
+
+KDB_EXTERN rc_t CC KDBManagerVOpenTableUpdate ( struct KDBManager *self,
+    KTable **tbl, const char *path, va_list args );
+KDB_EXTERN rc_t CC KDatabaseVOpenTableUpdate ( struct KDatabase *self,
+    KTable **tbl, const char *name, va_list args );
+
+
+/* Locked
+ *  returns true if table is locked
+ */
+KDB_EXTERN bool CC KTableLocked ( const KTable *self );
+
+
+/* Exists
+ *  returns true if requested object exists
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+KDB_EXTERN bool CC KTableExists ( const KTable *self, uint32_t type,
+    const char *name, ... );
+KDB_EXTERN bool CC KTableVExists ( const KTable *self, uint32_t type,
+    const char *name, va_list args );
+
+/* IsAlias
+ *  returns true if object name is an alias
+ *  returns path to fundamental name if it was aliased
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - optional output buffer
+ *  for fundamenta object name if "alias" is not a fundamental name, 
+ *
+ *  "name" [ IN ] - NUL terminated object name
+ */
+KDB_EXTERN bool CC KTableIsAlias ( const KTable *self, uint32_t type,
+    char *resolved, size_t rsize, const char *name );
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+KDB_EXTERN rc_t CC KTableWritable ( const KTable *self, uint32_t type,
+    const char *name, ... );
+KDB_EXTERN rc_t CC KTableVWritable ( const KTable *self, uint32_t type,
+    const char *name, va_list args );
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+KDB_EXTERN rc_t CC KTableLock ( KTable *self, uint32_t type,
+    const char *name, ... );
+KDB_EXTERN rc_t CC KTableVLock ( KTable *self, uint32_t type,
+    const char *name, va_list args );
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+KDB_EXTERN rc_t CC KTableUnlock ( KTable *self, uint32_t type,
+    const char *name, ... );
+KDB_EXTERN rc_t CC KTableVUnlock ( KTable *self, uint32_t type,
+    const char *name, va_list args );
+
+
+/* Rename
+ *  renames a contained object
+ *
+ *  "from" [ IN ] - NUL terminated string in UTF-8
+ *  giving name of contained object
+ *
+ *  "to" [ IN ] - NUL terminated string in UTF-8
+ *  giving new name
+ */
+KDB_EXTERN rc_t CC KTableRenameColumn ( KTable *self, bool force,
+    const char *from, const char *to );
+KDB_EXTERN rc_t CC KTableRenameIndex ( KTable *self, bool force,
+    const char *from, const char *to );
+
+
+/* Alias
+ *  create an alias to an existing contained object
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8
+ *  giving name of contained object
+ *
+ *  "alias" [ IN ] - NUL terminated string in UTF-8
+ *  giving aliased name
+ */
+KDB_EXTERN rc_t CC KTableAliasColumn ( KTable *self, const char *path, const char *alias );
+KDB_EXTERN rc_t CC KTableAliasIndex ( KTable *self, const char *name, const char *alias );
+
+
+/* Drop
+ *  drop a contained object
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving column name
+ */
+KDB_EXTERN rc_t CC KTableDropColumn ( KTable *self, const char *name, ... );
+KDB_EXTERN rc_t CC KTableDropIndex ( KTable *self, const char *name, ... );
+
+KDB_EXTERN rc_t CC KTableVDropColumn ( KTable *self, const char *name, va_list args );
+KDB_EXTERN rc_t CC KTableVDropIndex ( KTable *self, const char *name, va_list args );
+
+
+/* Reindex
+ *  optimize column indices
+ */
+KDB_EXTERN rc_t CC KTableReindex ( KTable *self );
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+KDB_EXTERN rc_t CC KTableOpenManagerRead ( const KTable *self, struct KDBManager const **mgr );
+KDB_EXTERN rc_t CC KTableOpenManagerUpdate ( KTable *self, struct KDBManager **mgr );
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+KDB_EXTERN rc_t CC KTableOpenParentRead ( const KTable *self, struct KDatabase const **db );
+KDB_EXTERN rc_t CC KTableOpenParentUpdate ( KTable *self, struct KDatabase **db );
+
+
+/* HasRemoteData
+ *  indicates whether some/all table data comes from network resource
+ *  such as HttpFile or CacheteeFile
+ */
+KDB_EXTERN bool CC KTableHasRemoteData ( const KTable *self );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_kdb_table_ */
diff --git a/interfaces/kfc/callconv.h b/interfaces/kfc/callconv.h
new file mode 100644
index 0000000..17bdd53
--- /dev/null
+++ b/interfaces/kfc/callconv.h
@@ -0,0 +1,53 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_callconv_
+#define _h_kfc_callconv_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * CC
+ *  calling convention
+ *  should be declared within compiler/os-specific files
+ *  but to make external client builds work, do so here...
+ */
+#ifndef CC
+ #if defined _MSC_VER
+  #define CC __cdecl
+ #else
+  #define CC
+ #endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_kfc_callconv_ */
diff --git a/interfaces/kfc/ctx.h b/interfaces/kfc/ctx.h
new file mode 100644
index 0000000..1f98596
--- /dev/null
+++ b/interfaces/kfc/ctx.h
@@ -0,0 +1,198 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_kfc_ctx_
+#define _h_kfc_ctx_
+
+#ifndef _h_kfc_extern_
+#include <kfc/extern.h>
+#endif
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifndef _h_kfc_rc_
+#include <kfc/rc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KRsrc;
+
+
+/*--------------------------------------------------------------------------
+ * KSourceLoc
+ *  holds a static block identifying module, file and file extension.
+ *  by including this file in a source compilation, a static block
+ *  called "s_src_loc" will be automatically defined.
+ */
+typedef struct KSourceLoc KSourceLoc;
+struct KSourceLoc
+{
+    const char * mod;
+    const char * file;
+    const char * ext;
+};
+
+#ifndef SRC_LOC_DEFINED
+static KSourceLoc s_src_loc = { __mod__, __file__, __fext__ };
+#define SRC_LOC_DEFINED 1
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KFuncLoc
+ *  holds a static block identifying function and source file.
+ */
+typedef struct KFuncLoc KFuncLoc;
+struct KFuncLoc
+{
+    const KSourceLoc * src;
+    const char * func;
+    rc_t rc_context;
+};
+
+#define DECLARE_FUNC_LOC( rc_mod, rc_targ, rc_ctx )                \
+    static KFuncLoc s_func_loc =                                   \
+    { & s_src_loc, __func__, RAW_CTX ( rc_mod, rc_targ, rc_ctx ) }
+
+
+/*--------------------------------------------------------------------------
+ * ctx_t
+ *  modified from vdb-3
+ */
+typedef struct KCtx KCtx;
+struct KCtx
+{
+    struct KRsrc const * rsrc;
+    const KFuncLoc * loc;
+    const KCtx * caller;
+
+    /* record call-stack depth */
+    uint32_t zdepth;
+
+    /* here for hybrid-mode */
+    volatile rc_t rc;
+
+    /* event */
+    void * volatile evt;
+};
+
+/* assert
+ * rsrc_assert
+ */
+#define ctx_assert( ctx )                       \
+    assert ( ctx != NULL )
+#define ctx_rsrc_assert( ctx )                  \
+    ctx_assert ( ctx );                         \
+    assert ( ctx -> rsrc != NULL )
+
+
+/* init
+ *  initialize local context block
+ *  performs a particular contortion to allow:
+ *   a) initialization of a local ctx_t block
+ *   b) reassignment of "ctx" pointer to new block
+ *   c) use as an initializer to allow declarations to follow
+ */
+static __inline__
+KCtx ctx_init ( KCtx * new_ctx, ctx_t * ctxp, const KFuncLoc * func_loc )
+{
+    /* extract caller's ctx pointer */
+    ctx_t ctx = * ctxp;
+
+    /* construct a local copy of ctx_t as return value
+       allow compiler to zero trailing members more
+       efficiently than by explicit initialization */
+    KCtx local_ctx = { ctx -> rsrc, func_loc, ctx, ctx -> zdepth + 1 };
+
+    /* reassign the "ctx" pointer for stack frame */
+    * ctxp = new_ctx;
+
+    /* "return" the new block - a noop that permits
+       use of this function as an initializer, and
+       further declarations of local variables */
+    return local_ctx;
+}
+
+
+/* FUNC_ENTRY
+ *  establishes context within a function
+ *  legal to use wherever a normal declaration is allowed
+ */
+#define FUNC_ENTRY( ctx, rc_mod, rc_targ, rc_ctx )                      \
+    DECLARE_FUNC_LOC ( rc_mod, rc_targ, rc_ctx );                       \
+    KCtx local_ctx = ctx_init ( & local_ctx, & ( ctx ), & s_func_loc )
+
+
+/* POP_CTX [ RESERVED USAGE ]
+ *  unlinks ctx for a stack frame
+ *  used ONLY for code that wants to remove itself from call chain
+ *  after having executed FUNC_ENTRY, i.e. for thunk operations
+ *
+ *  normally, a thunk or other piece of code that does not want
+ *  to participate in the call chain ctx linkage would simply
+ *  avoid using FUNC_ENTRY. however, this can be dangerous if any
+ *  errors occur during operation.
+ *
+ *  to handle this condition, a thunk-like function can use
+ *  FUNC_ENTRY in a normal fashion, but unlink with POP_CTX
+ *  just prior to calling through to the next function, usually
+ *  as a tail-call.
+ */
+#define POP_CTX( ctx ) \
+    ctx = ctx -> caller
+
+
+/* recover
+ *  queries thread for previously stored KRsrc block
+ *  creates a new one if necessary
+ */
+KFC_EXTERN ctx_t CC ctx_recover ( KCtx * new_ctx, const KFuncLoc * func_loc );
+
+
+/* HYBRID_FUNC_ENTRY
+ *  recovers or creates thread-specific KRsrc block
+ *  initializes a local ctx_t
+ *  declares a local ctx pointer variable
+ */
+#define HYBRID_FUNC_ENTRY( rc_mod, rc_targ, rc_ctx )            \
+    KCtx local_ctx;                                             \
+    DECLARE_FUNC_LOC ( rc_mod, rc_targ, rc_ctx );               \
+    ctx_t ctx = ctx_recover ( & local_ctx, & s_func_loc )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfc_ctx_ */
diff --git a/interfaces/kfc/defs.h b/interfaces/kfc/defs.h
new file mode 100644
index 0000000..fc12f2e
--- /dev/null
+++ b/interfaces/kfc/defs.h
@@ -0,0 +1,199 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_defs_
+#define _h_kfc_defs_
+
+#ifndef _h_kfc_callconv_
+#include <kfc/callconv.h>
+#endif
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <memory.h>
+#include <assert.h>
+
+#ifdef __cplusplus
+extern "C" {
+#else
+#include <stdbool.h>
+#endif
+
+/*--------------------------------------------------------------------------
+ * ctx_t
+ *  a thread context block
+ */
+typedef struct KCtx const * ctx_t;
+
+
+/*--------------------------------------------------------------------------
+ * caps_t
+ *  a map of capability bits
+ */
+typedef uint32_t caps_t;
+
+
+/*--------------------------------------------------------------------------
+ * xobj_t
+ *  describes the type of object having problems
+ */
+typedef struct { const char *name; } const xobj_t [ 1 ];
+
+
+/*--------------------------------------------------------------------------
+ * xstate_t
+ *  describes the state of an object having problems
+ */
+typedef struct { const char *name; } const xstate_t [ 1 ];
+
+
+/*--------------------------------------------------------------------------
+ * xc_t
+ *  describes a class of error
+ */
+typedef struct { const char *name; } const xc_t [ 1 ];
+
+
+/*--------------------------------------------------------------------------
+ * under normal usage, the declarations below will create simple externs.
+ * however, they may be redefined to create static objects
+ */
+#ifndef XC_DEFINE
+
+#define XOBJ( name, desc, rc )                  \
+    extern xobj_t name
+#define XOBJ_EXT( name, supr, desc, rc )        \
+    extern xobj_t name
+
+#define XSTATE( name, desc, rc )                \
+    extern xstate_t name
+#define XSTATE_EXT( name, supr, desc, rc )      \
+    extern xstate_t name
+
+#define XC( name, obj, state )                  \
+    extern xc_t name
+#define XC_EXT( name, supr )                    \
+    extern xc_t name
+
+#endif /* XC_DEFINE */
+
+
+/*--------------------------------------------------------------------------
+ * rc_t - VDB.2 LEGACY
+ *  upon success, all functions will return code 0
+ *  other codes indicate failure or additional status information
+ */
+typedef uint32_t rc_t;
+
+
+/*--------------------------------------------------------------------------
+ * ver_t - VDB.2 LEGACY
+ *  32 bit 3 part type
+ */
+typedef uint32_t ver_t;
+
+/* GetMajor
+ *  return major component
+ */
+#define VersionGetMajor( self ) \
+    ( ( self ) >> 24 )
+
+/* GetMinor
+ *  return minor component
+ */
+#define VersionGetMinor( self ) \
+    ( ( ( self ) >> 16 ) & 0xFF )
+
+/* GetRelease
+ *  return release component
+ */
+#define VersionGetRelease( self ) \
+    ( ( self ) & 0xFFFF )
+
+
+/*--------------------------------------------------------------------------
+ * stringize
+ *  it is useful to be able to convert PP defines on the command line
+ */
+#define stringize( tok ) tok_to_string ( tok )
+#define tok_to_string( tok ) # tok
+
+
+/*--------------------------------------------------------------------------
+ * NAME_VERS
+ *  synthesize versioned type and message names
+ */
+#define NAME_VERS( name, maj_vers ) \
+    MAKE_NAME_VERS1 ( name, maj_vers )
+#define MAKE_NAME_VERS1( name, maj_vers ) \
+    MAKE_NAME_VERS2 ( name, maj_vers )
+#define MAKE_NAME_VERS2( name, maj_vers ) \
+    name ## _v ## maj_vers
+
+/*--------------------------------------------------------------------------
+ * __mod__, __file__ and __fext__
+ *  these guys are slightly different from __FILE__
+ *  and they complement __func__
+ */
+#if ! defined __mod__ && defined __mod_name__
+#define __mod__ stringize ( __mod_name__ )
+#endif
+
+#if ! defined __file__ && defined __file_name__
+#define __file__ stringize ( __file_name__ )
+#endif
+
+#if ! defined __fext__ && defined __file_ext__
+#define __fext__ stringize ( __file_ext__ )
+#endif
+
+/*--------------------------------------------------------------------------
+ * PKGNAMESTR
+ */
+#if ! defined PKGNAMESTR && defined PKGNAME
+#define PKGNAMESTR stringize ( PKGNAME )
+#endif
+
+/*--------------------------------------------------------------------------
+ * memcpy()
+ *  as of 11/29/2016 we are prohibiting the use of memcpy
+ *  NB - we depend upon including <string.h> BEFORE redefining
+ */
+#undef memcpy
+#if _DEBUGGING && LINUX
+#define memcpy "DON'T USE MEMCPY! USE MEMMOVE INSTEAD!!"
+#else
+#define memcpy memmove
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_kfc_defs_ */
+
diff --git a/interfaces/kfc/except.h b/interfaces/kfc/except.h
new file mode 100644
index 0000000..6128f67
--- /dev/null
+++ b/interfaces/kfc/except.h
@@ -0,0 +1,215 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_kfc_except_
+#define _h_kfc_except_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+/* some systems ( Windows ) like to define their own versions
+   of these macros. since we write to our own runtime and not
+   to the OS, include any OS headers ( below ) and then undef */
+
+#ifndef _h_os_oserror_
+#include <oserror.h>
+#endif
+
+#include <stdarg.h>
+
+#undef ERROR
+#undef FAILED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * exception-related macros
+ */
+
+/* xc_sev_t
+ *  severity
+ */
+typedef enum xc_sev_t
+{
+    xc_sev_note,            /* used to create some sort of annotation    */
+    xc_sev_warn,            /* used to call attention to a bad condition */
+    xc_sev_fail,            /* indicates uncorrected failure             */
+    xc_sev_fatal            /* indicates an unrecoverable failure        */
+} xc_sev_t;
+
+/* xc_org_t
+ *  origin
+ */
+typedef enum xc_org_t
+{
+    xc_org_system,          /* event originated in OS or C libraries     */
+    xc_org_internal,        /* event originated within vdb               */
+    xc_org_user             /* event caused by user or application       */
+} xc_org_t;
+
+
+/* event
+ *  create a thread event
+ *
+ *  "lineno" [ IN ] - the source line where event was created
+ *  "severity" [ IN ] - severity of the event
+ *  "origin" [ IN ] - origin of the event
+ *  "xc" [ IN ] - type of the event
+ *  "msg" [ IN, VARARG ] - instance data to be recorded on the event
+ */
+void ctx_event ( ctx_t ctx, uint32_t lineno,
+    xc_sev_t severity, xc_org_t origin,
+    xc_t xc, const char *msg, ... );
+void ctx_vevent ( ctx_t ctx, uint32_t lineno,
+    xc_sev_t severity, xc_org_t origin,
+    xc_t xc, const char *msg, va_list args );
+
+
+/* ANNOTATE
+ *  make some annotation
+ *  but not an error
+ */
+#define SYSTEM_ANNOTATE( xc, ... )                                                \
+    ctx_event ( ctx, __LINE__, xc_sev_note, xc_org_system,   xc, __VA_ARGS__ )
+#define INTERNAL_ANNOTATE( xc, ... )                                              \
+    ctx_event ( ctx, __LINE__, xc_sev_note, xc_org_internal, xc, __VA_ARGS__ )
+#define USER_ANNOTATE( xc, ... )                                                  \
+    ctx_event ( ctx, __LINE__, xc_sev_note, xc_org_user,     xc, __VA_ARGS__ )
+
+
+/* WARNING
+ *  make an annotation
+ *  record a warning as an xc_t
+ */
+#define SYSTEM_WARNING( xc, ... )                                                \
+    ctx_event ( ctx, __LINE__, xc_sev_warn, xc_org_system,   xc, __VA_ARGS__ )
+#define INTERNAL_WARNING( xc, ... )                                              \
+    ctx_event ( ctx, __LINE__, xc_sev_warn, xc_org_internal, xc, __VA_ARGS__ )
+#define USER_WARNING( xc, ... )                                                  \
+    ctx_event ( ctx, __LINE__, xc_sev_warn, xc_org_user,     xc, __VA_ARGS__ )
+
+
+/* ERROR
+ *  make an annotation
+ *  record an error as an xc_t
+ */
+#define SYSTEM_ERROR( xc, ... )                                                  \
+    ctx_event ( ctx, __LINE__, xc_sev_fail, xc_org_system,   xc, __VA_ARGS__ )
+#define INTERNAL_ERROR( xc, ... )                                                \
+    ctx_event ( ctx, __LINE__, xc_sev_fail, xc_org_internal, xc, __VA_ARGS__ )
+#define USER_ERROR( xc, ... )                                                    \
+    ctx_event ( ctx, __LINE__, xc_sev_fail, xc_org_user,     xc, __VA_ARGS__ )
+
+
+/* ABORT
+ *  make an annotation
+ *  record a fatal error as an xc_t
+ */
+#define SYSTEM_ABORT( xc, ... )                                                  \
+    ctx_event ( ctx, __LINE__, xc_sev_fatal, xc_org_system,   xc, __VA_ARGS__ )
+#define INTERNAL_ABORT( xc, ... )                                                \
+    ctx_event ( ctx, __LINE__, xc_sev_fatal, xc_org_internal, xc, __VA_ARGS__ )
+#define USER_ABORT( xc, ... )                                                    \
+    ctx_event ( ctx, __LINE__, xc_sev_fatal, xc_org_user,     xc, __VA_ARGS__ )
+
+
+/* UNIMPLEMENTED
+ *  marks an error when the code is simply not finished
+ */
+#define UNIMPLEMENTED()                                 \
+    INTERNAL_ERROR ( xcUnimplemented, "" )
+
+
+/* FAILED
+ *  a test of rc within ctx_t
+ */
+#define FAILED()                                        \
+    ( ctx -> rc != 0 )
+
+
+/* TRY
+ *  another C language "try" macro
+ */
+#define TRY( expr )                                     \
+    expr;                                               \
+    if ( ! FAILED () )
+
+
+/* CATCH
+ *  attempts to catch rc on certain types
+ */
+bool ctx_xc_isa ( ctx_t ctx, xc_t xc );
+bool ctx_xobj_isa ( ctx_t ctx, xobj_t xo );
+bool ctx_xstate_isa ( ctx_t ctx, xstate_t xs );
+
+#define CATCH( xc )                                     \
+    else if ( ctx_xc_isa ( ctx, xc ) )
+#define CATCH_OBJ( xo )                                 \
+    else if ( ctx_xobj_isa ( ctx, xo ) )
+#define CATCH_STATE( xs )                               \
+    else if ( ctx_xstate_isa ( ctx, xs ) )
+#define CATCH_ALL()                                     \
+    else
+
+
+/* ON_FAIL
+ *  reverses TRY logic
+ *  generally used for less-structured code,
+ *  e.g. ON_FAIL ( x ) return y;
+ */
+#define ON_FAIL( expr )                                 \
+    expr;                                               \
+    if ( FAILED () )
+
+
+/* CLEAR
+ *  clears annotation and error
+ *  used from within CATCH handler
+ */
+void ctx_clear ( ctx_t ctx );
+#define CLEAR()                                         \
+    ctx_clear ( ctx )
+
+
+/* WHAT
+ *  retrieves current message
+ *  if no annotation exists, returns empty string
+ */
+const char * ctx_what ( ctx_t ctx );
+#define WHAT()                                          \
+    ctx_what ( ctx )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _h_kfc_except_ */
diff --git a/interfaces/kfc/extern.h b/interfaces/kfc/extern.h
new file mode 100644
index 0000000..4882bb6
--- /dev/null
+++ b/interfaces/kfc/extern.h
@@ -0,0 +1,68 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_extern_
+#define _h_kfc_extern_
+
+#ifndef _h_kfc_callconv_
+#include <kfc/callconv.h>
+#endif
+
+#if ! defined EXPORT_LATCH && _LIBRARY
+
+#define KFC_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+
+#else
+
+#define KFC_EXTERN LIB_IMPORT
+
+#endif
+
+#if defined _MSC_VER
+
+/* __declspec ( dllimport ) will cause creation of
+   function pointers rather than thunks, which makes
+   the code that imports unable to link statically
+   against a library. we leave this symbol defined as
+   "extern" to use thunks instead. as a result, all
+   function addresses resolve to the thunk and not
+   the actual function. */
+#define LIB_IMPORT extern
+#define LIB_IMPORT_DATA extern __declspec ( dllimport )
+#define LIB_EXPORT __declspec ( dllexport )
+#define LIB_EXPORT_DATA __declspec ( dllexport )
+
+#else
+
+#define LIB_IMPORT extern
+#define LIB_IMPORT_DATA extern
+#define LIB_EXPORT
+#define LIB_EXPORT_DATA
+
+#endif
+
+#endif /* _h_kfc_extern_ */
diff --git a/interfaces/kfc/rc.h b/interfaces/kfc/rc.h
new file mode 100644
index 0000000..a6a82d1
--- /dev/null
+++ b/interfaces/kfc/rc.h
@@ -0,0 +1,361 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_rc_
+#define _h_kfc_rc_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * under normal usage, the declarations below will create simple enums.
+ * however, they may be redefined to create textual lookup tables.
+ */
+#ifndef RC_ENUM
+
+#define RC_ENUM( type ) enum type
+
+#undef RC_ENTRY
+#define RC_ENTRY( id, txt ) id,
+
+#undef RC_VFIRST
+#define RC_VFIRST( id1, id2 ) id1 = ( int ) ( ( id2 ) - 1 ),
+
+#undef RC_VLAST
+#define RC_VLAST( id ) id,
+
+#undef RC_LAST
+#define RC_LAST( id ) id
+
+#define RC_EMIT 1
+
+#endif
+
+/*--------------------------------------------------------------------------
+ * RC
+ *  upon success, all functions will return code 0
+ *  other codes indicate failure or additional status information
+ */
+
+
+/* RCModule
+ *  what code module generated the error
+ */
+RC_ENUM ( RCModule )
+{
+    RC_ENTRY ( rcExe, NULL )
+    RC_ENTRY ( rcRuntime, "runtime" )
+    RC_ENTRY ( rcText, "text" )
+    RC_ENTRY ( rcCont, "container" )
+    RC_ENTRY ( rcCS, "checksum" )
+    RC_ENTRY ( rcFF, "file format detection" )
+    RC_ENTRY ( rcFS, "file system" )
+    RC_ENTRY ( rcPS, "process system" )
+    RC_ENTRY ( rcXF, "transform" )
+    RC_ENTRY ( rcDB, "database" )
+    RC_ENTRY ( rcVDB, "virtual database" )
+    RC_ENTRY ( rcApp, "application support" )
+    RC_ENTRY ( rcXML, "xml support" )
+    RC_ENTRY ( rcSRA, "short read archive" )
+    RC_VLAST ( rcLastModule_v1_0 )
+    RC_VFIRST ( rcFirstModule_v1_1, rcLastModule_v1_0 )
+    RC_ENTRY ( rcKFG, "configuration" )
+    RC_ENTRY ( rcAlign, "alignment" )
+    RC_ENTRY ( rcKrypto, "cryptographic" )
+    RC_ENTRY ( rcRDBMS, "RDBMS" )
+    RC_ENTRY ( rcNS, "network system" )
+    RC_ENTRY ( rcVFS, "virtual file system" )
+    RC_LAST ( rcLastModule_v1_1 )
+};
+
+/* RCTarget
+ *  describes the target object of the message
+ */
+RC_ENUM ( RCTarget )
+{
+    RC_ENTRY ( rcNoTarg, NULL )
+    RC_ENTRY ( rcArc, "archive file" )
+    RC_ENTRY ( rcToc, "file system table of contents" )
+    RC_ENTRY ( rcTocEntry, "file table of contents entry" )
+    RC_ENTRY ( rcArgv, "argument list" )
+    RC_ENTRY ( rcAttr, "attribute" )
+    RC_ENTRY ( rcBarrier, "barrier" )
+    RC_ENTRY ( rcBlob, "binary large object" )
+    RC_ENTRY ( rcBuffer, "buffer" )
+    RC_ENTRY ( rcChar, "character" )
+    RC_ENTRY ( rcColumn, "column" )
+    RC_ENTRY ( rcCondition, "condition" )
+    RC_ENTRY ( rcCursor, "cursor" )
+    RC_ENTRY ( rcDatabase, "database" )
+    RC_ENTRY ( rcDirectory, "directory" )
+    RC_ENTRY ( rcDoc, "document" )
+    RC_ENTRY ( rcXmlDoc, "XML document" )
+    RC_ENTRY ( rcFile, "file" )
+    RC_ENTRY ( rcFileDesc, "file descriptor" )
+    RC_ENTRY ( rcFileFormat, "file format" )
+    RC_ENTRY ( rcFunction, "function" )
+    RC_ENTRY ( rcFormatter, "formatter" )
+    RC_ENTRY ( rcFunctParam, "function parameter" )
+    RC_ENTRY ( rcHeader, "header" )
+    RC_ENTRY ( rcIndex, "index" )
+    RC_ENTRY ( rcIterator, "iterator" )
+    RC_ENTRY ( rcLock, "lock" )
+    RC_ENTRY ( rcLog, "log" )
+    RC_ENTRY ( rcMD5SumFmt, "MD5 sum file" )
+    RC_ENTRY ( rcMemMap, "memory map" )
+    RC_ENTRY ( rcMetadata, "metadata" )
+    RC_ENTRY ( rcMgr, "manager" )
+    RC_ENTRY ( rcNamelist, "name list" )
+    RC_ENTRY ( rcNode, "node" )
+    RC_ENTRY ( rcNumeral, "numeral" )
+    RC_ENTRY ( rcPagemap, "page map" )
+    RC_ENTRY ( rcPath, "path" )
+    RC_ENTRY ( rcProcess, "process" ) 
+    RC_ENTRY ( rcQueue, "queue" )
+    RC_ENTRY ( rcRWLock, "read/write lock" )
+    RC_ENTRY ( rcSchema, "schema" )
+    RC_ENTRY ( rcSemaphore, "semaphore" )
+    RC_ENTRY ( rcStorage, "storage" )
+    RC_ENTRY ( rcString, "string" )
+    RC_ENTRY ( rcTable, "table" )
+    RC_ENTRY ( rcThread, "thread" )
+    RC_ENTRY ( rcTimeout, "timeout" )
+    RC_ENTRY ( rcToken, "token" )
+    RC_ENTRY ( rcTree, "tree" )
+    RC_ENTRY ( rcTrie, "trie" )
+    RC_ENTRY ( rcType, "type" )
+    RC_ENTRY ( rcVector, "vector" )
+    RC_ENTRY ( rcDylib, "dynamic library" )
+    RC_ENTRY ( rcExpression, "expression" )
+    RC_VLAST ( rcLastTarget_v1_0 )
+    RC_VFIRST ( rcFirstTarget_v1_1, rcLastTarget_v1_0 )
+    RC_ENTRY ( rcProduction, "schema production" )
+    RC_ENTRY ( rcEncryptionKey, "encryption key" )
+    RC_ENTRY ( rcRng, "random number generator" )
+    RC_ENTRY ( rcCmd, "command" )
+    RC_ENTRY ( rcData, "data" )
+    RC_ENTRY ( rcQuery, "query" )
+    RC_ENTRY ( rcUri, "uri" )
+    RC_LAST  ( rcLastTarget_v1_1 )
+};
+
+/* RCContext
+ *  context under which error occurred
+ */
+RC_ENUM ( RCContext )
+{
+    RC_ENTRY ( rcAllocating, "allocating" )
+    RC_ENTRY ( rcCasting, "type-casting" )
+    RC_ENTRY ( rcConstructing, "constructing" )
+    RC_ENTRY ( rcDestroying, "destroying" )
+    RC_ENTRY ( rcReleasing, "releasing" )
+    RC_ENTRY ( rcAccessing, "accessing" )
+    RC_ENTRY ( rcListing, "listing" )
+    RC_ENTRY ( rcVisiting, "visiting" )
+    RC_ENTRY ( rcResolving, "resolving" )
+    RC_ENTRY ( rcLocking, "locking" )
+    RC_ENTRY ( rcUnlocking, "unlocking" )
+    RC_ENTRY ( rcRenaming, "renaming" )
+    RC_ENTRY ( rcAliasing, "aliasing" )
+    RC_ENTRY ( rcSelecting, "selecting" )
+    RC_ENTRY ( rcProjecting, "projecting" )
+    RC_ENTRY ( rcInserting, "inserting" )
+    RC_ENTRY ( rcRemoving, "removing" )
+    RC_ENTRY ( rcClearing, "clearing" )
+    RC_ENTRY ( rcUpdating, "updating" )
+    RC_ENTRY ( rcCreating, "creating" )
+    RC_ENTRY ( rcOpening, "opening" )
+    RC_ENTRY ( rcClosing, "closing" )
+    RC_ENTRY ( rcResizing, "resizing" )
+    RC_ENTRY ( rcReading, "reading" )
+    RC_ENTRY ( rcWriting, "writing" )
+    RC_ENTRY ( rcCommitting, "committing" )
+    RC_ENTRY ( rcReverting, "reverting" )
+    RC_ENTRY ( rcResetting, "resetting" )
+    RC_ENTRY ( rcPersisting, "persisting" )
+    RC_ENTRY ( rcFreezing, "freezing" )
+    RC_ENTRY ( rcCopying, "copying" )
+    RC_ENTRY ( rcConcatenating, "concatenating" )
+    RC_ENTRY ( rcFormatting, "formatting" )
+    RC_ENTRY ( rcPositioning, "positioning" )
+    RC_ENTRY ( rcPacking, "packing" )
+    RC_ENTRY ( rcUnpacking, "unpacking" )
+    RC_ENTRY ( rcEncoding, "encoding" )
+    RC_ENTRY ( rcDecoding,"decoding" )
+    RC_ENTRY ( rcValidating, "validating" )
+    RC_ENTRY ( rcExecuting, "executing" )
+    RC_ENTRY ( rcHuffmanCoding, "Huffman coding" )
+    RC_ENTRY ( rcReindexing, "re-indexing" )
+    RC_ENTRY ( rcRegistering, "registering" )
+    RC_ENTRY ( rcTokenizing, "tokenizing" )
+    RC_ENTRY ( rcParsing, "parsing" )
+    RC_ENTRY ( rcConverting, "converting" )
+    RC_ENTRY ( rcSignaling, "signaling" )
+    RC_ENTRY ( rcWaiting, "waiting" )
+    RC_ENTRY ( rcAttaching, "attaching" )
+    RC_ENTRY ( rcDetaching, "detaching" )
+    RC_ENTRY ( rcLogging, "logging" )
+    RC_ENTRY ( rcFPCoding, "floating point coding" )
+    RC_ENTRY ( rcMultiplexing, "(de)multiplexing" )
+    RC_ENTRY ( rcClassifying, "classifying" )
+    RC_ENTRY ( rcSearching, "searching" )
+    RC_ENTRY ( rcLoading, "loading" )
+    RC_ENTRY ( rcEvaluating, "evaluating" )
+    RC_ENTRY ( rcInflating, "inflating" )
+    RC_VLAST ( rcLastContext_v1_0 )
+    RC_VFIRST ( rcFirstContext_v1_1, rcLastContext_v1_0 )
+    RC_ENTRY ( rcFlushing, "flushing" )
+    RC_ENTRY ( rcAppending, "appending" )
+    RC_ENTRY ( rcEncrypting, "encrypting" )
+    RC_ENTRY ( rcDecrypting, "decrypting" )
+    RC_ENTRY ( rcComparing, "comparing" )
+    RC_ENTRY ( rcInitializing, "initializing" )
+    RC_ENTRY ( rcRetrieving, "retrieving" )
+    RC_ENTRY ( rcSending, "sending" )
+    RC_ENTRY ( rcProcessing, "processing" )
+    RC_ENTRY ( rcIdentifying, "identifying" )
+    RC_LAST ( rcLastContext_v1_1 )
+};
+
+/* RCObject
+ *  type of object described by state
+ */
+RC_ENUM ( RCObject )
+{
+    RC_ENTRY ( rcNoObj, NULL )
+    RC_VFIRST ( rcFirstObject, rcLastTarget_v1_1 )
+    RC_ENTRY ( rcLink, "symbolic link" )
+    RC_ENTRY ( rcSelf, "self" )
+    RC_ENTRY ( rcParam, "param" )
+    RC_ENTRY ( rcOffset, "offset" )
+    RC_ENTRY ( rcMemory, "memory" )
+    RC_ENTRY ( rcName, "name" )
+    RC_ENTRY ( rcFormat, "format" )
+    RC_ENTRY ( rcTransfer, "transfer" )
+    RC_ENTRY ( rcInterface, "interface" )
+    RC_ENTRY ( rcId, "id" )
+    RC_ENTRY ( rcRange, "range" )
+    RC_ENTRY ( rcConstraint, "constraint" )
+    RC_ENTRY ( rcByteOrder, "byte order" )
+    RC_ENTRY ( rcMessage, "message" )
+    RC_ENTRY ( rcTag, "tag" )
+    RC_ENTRY ( rcResources, "system resources" )
+    RC_ENTRY ( rcDirEntry, "directory-toc entry" )
+    RC_ENTRY ( rcArcHardLink, "archive hard link" )
+    RC_ENTRY ( rcRow, "row" )
+    RC_ENTRY ( rcLibrary, "loadable library" )
+    RC_VLAST ( rcLastObject_v1_0 )
+    RC_VFIRST ( rcFirstObject_v1_1, rcLastObject_v1_0 )
+    RC_ENTRY ( rcItem, "item" )
+    RC_ENTRY ( rcMode, "mode" )
+    RC_ENTRY ( rcEncryption, "encryption" )
+    RC_ENTRY ( rcCrc, "crc" )
+    RC_ENTRY ( rcChecksum, "checksum" )
+    RC_ENTRY ( rcSeed, "seed" )
+    RC_ENTRY ( rcConnection, "connection" )
+    RC_ENTRY ( rcError, "error" )
+    RC_ENTRY ( rcEnvironment, "environment" )
+    RC_ENTRY ( rcSignalSet, "signal set" )
+    RC_ENTRY ( rcSize, "size" )
+    RC_ENTRY ( rcRefcount, "reference count" )
+    RC_LAST ( rcLastObject_v1_1 )
+};
+
+/* RCState
+ *  state of object described
+ */
+RC_ENUM ( RCState )
+{
+    RC_ENTRY ( rcNoErr, "no error" )
+    RC_ENTRY ( rcDone, "done" )
+    RC_ENTRY ( rcUnknown, "unknown" )
+    RC_ENTRY ( rcUnsupported, "unsupported" )
+    RC_ENTRY ( rcUnexpected, "unexpected" )
+    RC_ENTRY ( rcUnrecognized, "unrecognized" )
+    RC_ENTRY ( rcAmbiguous, "ambiguous" )
+    RC_ENTRY ( rcNull, "NULL" )
+    RC_ENTRY ( rcBadVersion, "bad version" )
+    RC_ENTRY ( rcDestroyed, "destroyed" )
+    RC_ENTRY ( rcInvalid, "invalid" )
+    RC_ENTRY ( rcCorrupt, "corrupt" )
+    RC_ENTRY ( rcIncorrect, "incorrect" )
+    RC_ENTRY ( rcInconsistent, "inconsistent" )
+    RC_ENTRY ( rcBusy, "busy" )
+    RC_ENTRY ( rcIncomplete, "incomplete" )
+    RC_ENTRY ( rcInterrupted, "interrupted" )
+    RC_ENTRY ( rcCanceled, "canceled" )
+    RC_ENTRY ( rcEmpty, "empty" )
+    RC_ENTRY ( rcExhausted, "exhausted" )
+    RC_ENTRY ( rcInsufficient, "insufficient" )
+    RC_ENTRY ( rcExcessive, "excessive" )
+    RC_ENTRY ( rcViolated, "violated" )
+    RC_ENTRY ( rcExists, "exists" )
+    RC_ENTRY ( rcNotFound, "not found" )
+    RC_ENTRY ( rcLocked, "locked" )
+    RC_ENTRY ( rcUnlocked, "unlocked" )
+    RC_ENTRY ( rcDetached, "detached" )
+    RC_ENTRY ( rcDeadlock, "deadlock" )
+    RC_ENTRY ( rcUnauthorized, "unauthorized" )
+    RC_ENTRY ( rcReadonly, "read-only" )
+    RC_ENTRY ( rcWriteonly, "write-only" )
+    RC_ENTRY ( rcNoPerm, "no permission" )
+    RC_ENTRY ( rcInPlaceNotAllowed, "update in-place prohibited" )
+    RC_ENTRY ( rcTooShort, "too short" )
+    RC_ENTRY ( rcTooLong, "too long" )
+    RC_ENTRY ( rcTooBig, "too big" )
+    RC_ENTRY ( rcDuplicate, "duplicate" )
+    RC_ENTRY ( rcOutOfKDirectory, "path out of this KDirectory FS" )
+    RC_ENTRY ( rcIgnored, "ignored" )	
+    RC_ENTRY ( rcOutofrange, "out of range" )
+    RC_VLAST ( rcLastState_v1_0 )
+    RC_VFIRST ( rcFirstState_v1_1, rcLastState_v1_0 )
+    RC_ENTRY ( rcOpen, "open" )
+    RC_ENTRY ( rcOutoforder, "out of order" )
+    RC_ENTRY ( rcNotOpen, "not open" )
+    RC_ENTRY ( rcUndefined, "undefined" )
+    RC_ENTRY ( rcUnequal, "unequal" )
+    RC_ENTRY ( rcFailed, "failed" )
+    RC_ENTRY ( rcNotAvailable, "not available" )
+    RC_ENTRY ( rcWrongType, "wrong type" )
+    RC_LAST ( rcLastState_v1_1 )
+};
+
+/* RAW_CTX
+ *  form a context from parts
+ */
+#define RAW_CTX( mod, targ, ctx )                   \
+    ( ( ( rc_t ) ( mod )  << 27 ) | /* 5 bits */    \
+      ( ( rc_t ) ( targ ) << 21 ) | /* 6 bits */    \
+      ( ( rc_t ) ( ctx )  << 14 ) ) /* 7 bits */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_kfc_rc_ */
diff --git a/interfaces/kfc/refcount-impl.h b/interfaces/kfc/refcount-impl.h
new file mode 100644
index 0000000..9c7bdb7
--- /dev/null
+++ b/interfaces/kfc/refcount-impl.h
@@ -0,0 +1,95 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_refcount_impl_
+#define _h_kfc_refcount_impl_
+
+#ifndef _h_kfc_extern_
+#include <kfc/extern.h>
+#endif
+
+#ifndef _h_kfc_refcount_
+#include <kfc/refcount.h>
+#endif
+
+#ifndef _h_kfc_vtbl_impl_
+#include <kfc/vtbl-impl.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KRefcount_v1
+ *   the class
+ */
+struct KRefcount_v1
+{
+    const KVTable * vt;
+    KRefcount refcount;
+
+#if _ARCH_BITS > 32
+    uint8_t align [ sizeof ( void* ) - sizeof ( KRefcount ) ];
+#endif
+
+};
+
+extern KITFTOK_DECL ( KRefcount_v1 );
+
+typedef struct KRefcount_v1_vt KRefcount_v1_vt;
+struct KRefcount_v1_vt
+{
+    KVTable dad;
+
+    /* begin 1.0 */
+    void ( CC * destroy ) ( KRefcount_v1 *self, ctx_t ctx );
+    void * ( CC * dup ) ( const KRefcount_v1 *self, ctx_t ctx, caps_t rm );
+    /* end 1.0 */
+};
+
+
+/* Init
+ *  initialize the refcount to 1
+ *  may perform logging
+ */
+KFC_EXTERN void CC KRefcountInit_v1 ( KRefcount_v1 *self, ctx_t ctx,
+    const KVTable * vt, const char * instance_name );
+
+/* Destroy
+ *  has nothing to destroy
+ *  may perform logging
+ */
+KFC_EXTERN void CC KRefcountDestroy_v1 ( KRefcount_v1 *self, ctx_t ctx );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfc_refcount_impl_ */
diff --git a/interfaces/kfc/refcount.h b/interfaces/kfc/refcount.h
new file mode 100644
index 0000000..cdf5e4b
--- /dev/null
+++ b/interfaces/kfc/refcount.h
@@ -0,0 +1,246 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_refcount_
+#define _h_kfc_refcount_
+
+#ifndef _h_kfc_extern_
+#include <kfc/extern.h>
+#endif
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifndef _h_atomic32_
+#include <atomic32.h>
+#endif
+
+/* normally turned on */
+#ifndef INLINE_REFCOUNT
+#define INLINE_REFCOUNT 0
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KRefcount_v1
+ */
+typedef struct KRefcount_v1 KRefcount_v1;
+
+/* Duplicate
+ *  create a duplicate reference
+ *
+ *  "rm" [ IN ] - capabilities to remove ( default 0 )
+ */
+KFC_EXTERN void * CC KRefcountDuplicate_v1 ( KRefcount_v1 * self, ctx_t ctx, caps_t rm );
+
+/* Release
+ *  release a reference
+ */
+KFC_EXTERN void CC KRefcountRelease_v1 ( KRefcount_v1 * self, ctx_t ctx );
+
+/* TO_REFCOUNT
+ *  cast C subclasses to KRefcount_v1
+ */
+#define TO_REFCOUNT_V1( self ) \
+    ( ( KRefcount_v1* ) ( self ) )
+
+
+
+/*--------------------------------------------------------------------------
+ * KRefcount
+ *  signed 32-bit reference counter
+ * KDualRef
+ *  dual signed/unsigned 16-bit reference counter
+ */
+typedef atomic32_t KRefcount;
+typedef atomic32_t KDualRef;
+
+
+/* Actions
+ *  enum of action indicators
+ */
+enum KRefcountActions
+{
+    krefOkay,      /* no action needs to be taken           */
+    krefWhack,     /* total refcount zero crossing detected */
+    krefZero,      /* owned or dep reference zero crossing  */
+    krefLimit,     /* modification exceeds limits           */
+    krefNegative   /* negative prior or resulting count     */
+};
+
+
+/* Init
+ *  initialize a refcount object
+ *
+ *  "refcount" [ IN/OUT ] - pointer to object being initialized
+ *
+ *  "value" [ IN ] - initial refcount value
+ *    -OR-
+ *  "owned" [ IN ] and "dep" [ IN ] - owned and dependent counts
+ *  function will return krefLimit if counts exceed limits
+ *
+ *  "clsname" [ IN ] - NUL-terminated string stating classname
+ *  of object instance being initialized.
+ *
+ *  "op" [ IN ] - NUL-terminated string stating construction operation
+ *
+ *  "name" [ IN ] - NUL-terminated name of instance
+ */
+KFC_EXTERN void CC KRefcountInit ( KRefcount *refcount, int value,
+    const char *clsname, const char *op, const char *name );
+KFC_EXTERN int CC KDualRefInit ( KDualRef *refcount, int owned, int dep,
+    const char *clsname, const char *op, const char *name );
+
+
+/* Whack
+ *  tear down whatever was built up in object
+ */
+KFC_EXTERN void CC KRefcountWhack ( KRefcount *self, const char *clsname );
+KFC_EXTERN void CC KDualRefWhack ( KDualRef *self, const char *clsname );
+
+
+/* Add
+ *  add an owned reference
+ *  returns enum value indicating action to be taken
+ *
+ *  inline implementation always returns krefOkay.
+ *
+ *  linked-in implementation may return any of the following
+ *  codes, depending upon how it was compiled:
+ *    krefOkay     : reference was successfully added
+ *    krefZero     : reference was added, but prior value was zero
+ *    krefLimit    : reference was NOT added, too many references
+ *    krefNegative : reference was NOT added, prior value was negative
+ */
+KFC_EXTERN int CC KRefcountAdd ( const KRefcount *self, const char *clsname );
+KFC_EXTERN int CC KDualRefAdd ( const KDualRef *self, const char *clsname );
+
+
+/* Drop
+ *  drop an owned reference
+ *  returns enum value indicating action to be taken
+ *
+ *  inline implementation returns:
+ *    krefOkay     : reference was successfully dropped
+ *    krefWhack    : all references are gone and object can be collected
+ *
+ *  linked-in implementation may return any of the following
+ *  codes, depending upon how it was compiled:
+ *    krefOkay     : reference was successfully dropped
+ *    krefWhack    : all references are gone and object can be collected
+ *    krefZero     : reference was dropped, and no further owned refernces exist
+ *    krefNegative : reference was NOT dropped, as resultant count would be negative
+ */
+KFC_EXTERN int CC KRefcountDrop ( const KRefcount *self, const char *clsname );
+KFC_EXTERN int CC KDualRefDrop ( const KDualRef *self, const char *clsname );
+
+
+/* AddDep
+ *  adds a dependency reference
+ *  returns enum value indicating action to be taken
+ *
+ *  inline implementation always returns krefOkay.
+ *
+ *  linked-in implementation may return any of the following
+ *  codes, depending upon how it was compiled:
+ *    krefOkay     : reference was successfully added
+ *    krefZero     : reference was added, but prior value was zero
+ *    krefLimit    : reference was NOT added, too many references
+ *    krefNegative : reference was NOT added, prior value was negative
+ */
+KFC_EXTERN int CC KRefcountAddDep ( const KRefcount *self, const char *clsname );
+KFC_EXTERN int CC KDualRefAddDep ( const KDualRef *self, const char *clsname );
+
+
+/* DropDep
+ *  drop a dependency reference
+ *  returns enum value indicating action to be taken
+ *
+ *  inline implementation returns:
+ *    krefOkay     : reference was successfully dropped
+ *    krefWhack    : all references are gone and object can be collected
+ *
+ *  linked-in implementation may return any of the following
+ *  codes, depending upon how it was compiled:
+ *    krefOkay     : reference was successfully dropped
+ *    krefWhack    : all references are gone and object can be collected
+ *    krefZero     : reference was dropped, and no further dependent refernces exist
+ *    krefNegative : reference was NOT dropped, as resultant count would be negative
+ */
+KFC_EXTERN int CC KRefcountDropDep ( const KRefcount *self, const char *clsname );
+KFC_EXTERN int CC KDualRefDropDep ( const KDualRef *self, const char *clsname );
+
+
+
+/*--------------------------------------------------------------------------
+ * KRefcount inline implementation
+ */
+
+#if INLINE_REFCOUNT
+
+#define KRefcountInit( refcount, value, clsname, op, name ) \
+    ( REFNEW_COMMA ( clsname, op, name, refcount, value ) \
+      atomic32_set ( refcount, value ) )
+#define KRefcountWhack( self, clsname ) \
+    REFMSG ( clsname, "whack", self )
+#define KRefcountAdd( self, clsname ) \
+    ( REFMSG_COMMA ( clsname, "addref", self ) \
+      ( atomic32_read ( self ) < 0 ) ? krefNegative : \
+      ( atomic32_inc ( ( KRefcount* ) ( self ) ), krefOkay ) )
+#define KRefcountDrop( self, clsname ) \
+    ( REFMSG_COMMA ( clsname, "release", self ) \
+      ( atomic32_read ( self ) <= 0 ) ? krefNegative : \
+      ( atomic32_dec_and_test ( ( KRefcount* ) ( self ) ) ? krefWhack : krefOkay ) )
+#define KRefcountAddDep( self, clsname ) \
+    ( REFMSG_COMMA ( clsname, "attach", self ) \
+      ( atomic32_read ( self ) < 0 ) ? krefNegative : \
+      ( atomic32_inc ( ( KRefcount* ) ( self ) ), krefOkay ) )
+#define KRefcountDropDep( self, clsname ) \
+    ( REFMSG_COMMA ( clsname, "sever", self ) \
+      ( atomic32_read ( self ) <= 0 ) ? krefNegative : \
+      ( atomic32_dec_and_test ( ( KRefcount* ) ( self ) ) ? krefWhack : krefOkay ) )
+
+#endif
+
+#define REFNEW( clsname, op, name, instance, refcount ) \
+    ( void ) 0
+#define CNTMSG( clsname, op, instance, refcount ) \
+    ( void ) 0
+#define REFMSG( clsname, op, instance ) \
+    ( void ) 0
+#define REFNEW_COMMA( clsname, op, name, instance, refcount )
+#define REFMSG_COMMA( clsname, op, instance )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfc_refcount_ */
diff --git a/interfaces/kfc/rsrc-global.h b/interfaces/kfc/rsrc-global.h
new file mode 100644
index 0000000..6306a6d
--- /dev/null
+++ b/interfaces/kfc/rsrc-global.h
@@ -0,0 +1,72 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_kfc_rsrc_global_
+#define _h_kfc_rsrc_global_
+
+#ifndef _h_kfc_extern_
+#include <kfc/extern.h>
+#endif
+
+#ifndef _h_kfc_rsrc_
+#include <kfc/rsrc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KCtx;
+struct KFuncLoc;
+
+
+/*--------------------------------------------------------------------------
+ * KRsrc
+ */
+
+/* Global
+ *  retrieve process-global singleton KRsrc block
+ *  initializes block and ctx on initial request
+ *  initializes ctx for subsequent requests
+ */
+KFC_EXTERN void CC KRsrcGlobalInit ( struct KCtx * ctx,
+    struct KFuncLoc const * loc, bool full );
+
+/* Whack - ONE SHOT
+ *  tear down the managers in process main
+ *  or within an atexit handler
+ */
+KFC_EXTERN void CC KRsrcGlobalWhack ( ctx_t ctx );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfc_rsrc_global_ */
diff --git a/interfaces/kfc/rsrc.h b/interfaces/kfc/rsrc.h
new file mode 100644
index 0000000..dfb9eef
--- /dev/null
+++ b/interfaces/kfc/rsrc.h
@@ -0,0 +1,89 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_kfc_rsrc_
+#define _h_kfc_rsrc_
+
+#ifndef _h_kfc_extern_
+#include <kfc/extern.h>
+#endif
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KProcMgr;
+struct KMemMgr;
+struct KConfig;
+struct KNSManager;
+struct VFSManager;
+struct KDBManager;
+struct VDBManager;
+struct KThreadState;
+
+
+/*--------------------------------------------------------------------------
+ * KRsrc
+ *  a very watered-down version of vdb-3 resource capabilities
+ */
+typedef struct KRsrc KRsrc;
+struct KRsrc
+{
+    struct KProcMgr     * proc;
+    struct KThreadState * thread;
+    struct KMemMgr      * mem;
+    struct KConfig      * cfg;
+    struct KNSManager   * kns;
+    struct VFSManager   * vfs;
+    struct KDBManager   * kdb;
+    struct VDBManager   * vdb;
+};
+
+
+/* Init
+ *  initialize a local block from another
+ */
+KFC_EXTERN void CC KRsrcInit ( KRsrc *rsrc, ctx_t ctx );
+
+
+/* Whack
+ *  release references
+ */
+KFC_EXTERN void CC KRsrcWhack ( KRsrc *self, ctx_t ctx );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfc_rsrc_ */
diff --git a/interfaces/kfc/tstate.h b/interfaces/kfc/tstate.h
new file mode 100644
index 0000000..ecd83b9
--- /dev/null
+++ b/interfaces/kfc/tstate.h
@@ -0,0 +1,107 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_tstate_
+#define _h_kfc_tstate_
+
+#ifndef _h_kfc_extern_
+#include <kfc/extern.h>
+#endif
+
+#ifndef _h_kfc_except_
+#include <kfc/except.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KProcMgr;
+
+
+/*--------------------------------------------------------------------------
+ * KThreadState
+ *  exection state belonging to the current thread
+ */
+typedef struct KThreadState KThreadState;
+
+
+/* MakeThreadState
+ *  creates state for a newly created thread
+ *  called from the new thread
+ */
+KThreadState * KProcMgrMakeThreadState ( struct KProcMgr const * self );
+
+
+/* Whack
+ */
+void KThreadStateWhack ( KThreadState * self );
+
+
+/* CaptureEvent
+ *  records an event from the exception mechanism
+ */
+void KThreadStateEvent ( KThreadState * self, ctx_t ctx,
+    uint32_t lineno, xc_sev_t severity, xc_org_t origin,
+    xc_t xc, const char * msg, va_list args );
+
+
+/* ClearEvents
+ *  clears events from a particular point in the callchain
+ *  down toward lower points.
+ */
+void KThreadStateClearEvents ( KThreadState * self, ctx_t ctx );
+
+
+/* GetMessage
+ *  retrieve current event message
+ */
+const char * KThreadStateGetMessage ( const KThreadState * self, ctx_t ctx );
+
+
+/* IsXCErr
+ */
+bool KThreadStateIsXCErr ( const KThreadState * self, ctx_t ctx, xc_t xc );
+
+/* IsXCObj
+ */
+bool KThreadStateIsXCObj ( const KThreadState * self, ctx_t ctx, xobj_t xo );
+
+/* IsXCState
+ */
+bool KThreadStateIsXCState ( const KThreadState * self, ctx_t ctx, xstate_t xs );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfc_tstate_ */
diff --git a/interfaces/kfc/vtbl-impl.h b/interfaces/kfc/vtbl-impl.h
new file mode 100644
index 0000000..7eab2a8
--- /dev/null
+++ b/interfaces/kfc/vtbl-impl.h
@@ -0,0 +1,139 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_vtbl_impl_
+#define _h_kfc_vtbl_impl_
+
+#ifndef _h_kfc_extern_
+#include <kfc/extern.h>
+#endif
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KVTable
+ */
+typedef struct KVTable KVTable;
+
+typedef struct KItfTok KItfTok;
+struct KItfTok
+{
+    const char * const _name;
+    uint32_t idx;
+};
+
+/* use this macro to declare an extern */
+#define KITFTOK_DECL( itf_name ) \
+    KItfTok itf_name ## _tok
+
+/* use this macro to define the token */
+#define KITFTOK_DEF( itf_name ) \
+    KItfTok itf_name ## _tok = { #itf_name }
+
+
+typedef struct KHierCache KHierCache;
+struct KHierCache
+{
+    const KHierCache * volatile next;
+
+    size_t length;
+    const KVTable * parent [ 1 ];
+};
+
+struct KVTable
+{
+    /* implementation classname */
+    const char * name;
+
+    /* external token
+       identifies interface class */
+    const KItfTok * itf;
+
+    /* minor version number
+       allows for extensions */
+    size_t min;
+
+    /* single-inheritance
+       pointer to parent */
+    const KVTable * parent;
+
+    /* cached linear inheritance array */
+    const KHierCache * cache;
+};
+
+#define KVTABLE_INITIALIZER( impl_name, itf_name, min_vers, parent_vt )   \
+    { #impl_name, & itf_name ## _tok, min_vers, parent_vt }
+
+
+/* Resolve
+ *  walks a vtable's hierarchy
+ *  builds a linear array cache of casting pointers
+ *  dynamically configures KItfTok objects to cache their runtime offset
+ */
+void KVTableResolve ( const KVTable * self, ctx_t ctx );
+
+
+/* Cast
+ *  casts a vtable to a particular interface
+ *  returns NULL if not found
+ */
+static __inline__
+const void * KVTableCast ( const KVTable * self, ctx_t ctx, const KItfTok * itf )
+{
+    if ( self != NULL )
+    {
+        if ( self -> cache == NULL )
+            KVTableResolve ( self, ctx );
+
+        assert ( itf -> idx != 0 );
+        assert ( itf -> idx <= ( uint32_t ) self -> cache -> length );
+
+#if KVTABLE_NO_RTT_CHECK
+        return self -> cache -> parent [ itf -> idx - 1 ];
+#else
+        self = self -> cache -> parent [ itf -> idx - 1 ];
+        if ( self -> itf == itf )
+            return self;
+#endif
+    }
+    return NULL;
+}
+#define KVTABLE_CAST( vt, ctx, itf_name ) \
+    KVTableCast ( vt, ctx, & itf_name ## _tok )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfc_vtbl_impl_ */
diff --git a/interfaces/kfc/xc.h b/interfaces/kfc/xc.h
new file mode 100644
index 0000000..a57e845
--- /dev/null
+++ b/interfaces/kfc/xc.h
@@ -0,0 +1,192 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_kfc_xc_
+#define _h_kfc_xc_
+
+#ifndef _h_kfc_extern_
+#include <kfc/extern.h>
+#endif
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * XOBJ
+ *  objects that can have problems
+ */
+XOBJ ( xoSelf, "target object reference", rcSelf );
+XOBJ ( xoParam, "parameter", rcParam );
+XOBJ ( xoString, "string", rcString );
+XOBJ ( xoMemory, "process memory", rcMemory );
+XOBJ ( xoError, "error", rcNoObj );
+XOBJ ( xoBehavior, "behavior", rcFunction );
+XOBJ ( xoTable, "table", rcTable );
+XOBJ ( xoCursor, "cursor", rcCursor );
+XOBJ ( xoColumn, "column", rcColumn );
+XOBJ ( xoInteger, "integer", rcParam );
+XOBJ ( xoRow, "row", rcRow );
+XOBJ ( xoRefcount, "number of references", rcRefcount );
+XOBJ ( xoResource, "resource manager", rcMgr );
+XOBJ ( xoIterator, "iterator", rcIterator );
+XOBJ ( xoArc, "archive", rcArc );
+XOBJ ( xoType, "object type", rcType );
+XOBJ ( xoReference, "reference", rcIterator );
+XOBJ ( xoReadGroup, "read group", rcParam );
+XOBJ ( xoFile, "file", rcFile );
+XOBJ ( xoDirectory, "directory", rcDirectory );
+XOBJ ( xoPath, "pat", rcPath );
+XOBJ ( xoInterface, "interface", rcInterface );
+XOBJ ( xoTransfer, "transfer", rcTransfer );
+XOBJ ( xoFunction, "function", rcFunction );
+XOBJ ( xoBuffer, "buffer", rcBuffer );
+XOBJ ( xoFileDescriptor, "file descriptor", rcFileDesc );
+XOBJ ( xoStorage, "storage", rcStorage );
+XOBJ ( xoArgv, "argument vector", rcArgv );
+XOBJ ( xoZlib, "zlib stream", rcBlob );
+XOBJ ( xoAlignment, "alignment", rcData );
+
+/*--------------------------------------------------------------------------
+ * XSTATE
+ *  states that things can be in
+ *  THESE ARE BEING BADLY FILLED OUT
+ *  and I started the problem... but it needs to be straightened out.
+ */
+XSTATE ( xsIsNull, "is null", rcNull );
+XSTATE ( xsEmpty, "is empty", rcEmpty );
+XSTATE ( xsExhausted, "exhausted", rcExhausted );
+XSTATE ( xsUnexpected, "unexpected", rcUnexpected );
+XSTATE ( xsUnimplemented, "unimplemented", rcUnknown );
+XSTATE ( xsCreateFailed, "failed to create", rcUnknown );
+XSTATE ( xsOpenFailed, "failed to open", rcUnknown );
+XSTATE ( xsNotFound, "not found", rcNotFound );
+XSTATE ( xsReadFailed, "failed to read", rcUnknown );
+XSTATE ( xsOutOfBounds, "out of bounds", rcOutofrange );
+XSTATE ( xsAccessFailed, "failed to access", rcUnknown );
+XSTATE ( xsZombie, "is already freed", rcUnknown );
+XSTATE ( xsExists, "already exists", rcExists );
+XSTATE ( xsWriteOnly, "is write only", rcWriteonly );
+XSTATE ( xsUninitialized, "uninitialized", rcNotOpen );
+XSTATE ( xsIncorrect, "incorrect", rcIncorrect );
+XSTATE ( xsReadOnly, "is read only", rcReadonly );
+XSTATE ( xsInvalid, "invalid", rcInvalid );
+XSTATE ( xsInsufficient, "insufficient", rcInsufficient );
+XSTATE ( xsIncomplete, "incomplete", rcIncomplete );
+XSTATE ( xsFailed, "failed", rcFailed );
+XSTATE ( xsTimeout, "timed out", rcTimeout );
+XSTATE ( xsExcessive, "excessive", rcExcessive );
+XSTATE ( xsUnknown, "unknown", rcUnknown );
+XSTATE ( xsInconsistent, "inconsistent", rcInconsistent );
+XSTATE ( xsUnsupported, "unsupported", rcUnsupported );
+XSTATE_EXT ( xsInitFailed, xsFailed, "init failed", rcFailed );
+XSTATE ( xsNoPrimary, "missing primary", rcInvalid );
+XSTATE ( xsBadVersion, "bad version", rcBadVersion );
+XSTATE ( xsViolated, "violated", rcViolated );
+
+/*--------------------------------------------------------------------------
+ * XC
+ *  error types
+ */
+XC ( xcSelfNull, xoSelf, xsIsNull );
+XC ( xcParamNull, xoParam, xsIsNull );
+XC ( xcStringEmpty, xoString, xsEmpty );
+XC ( xcNoMemory, xoMemory, xsExhausted );
+XC ( xcUnexpected, xoError, xsUnexpected );
+XC ( xcUnimplemented, xoBehavior, xsUnimplemented );
+XC ( xcTableOpenFailed, xoTable, xsOpenFailed );
+XC ( xcCursorCreateFailed, xoCursor, xsCreateFailed );
+XC ( xcCursorOpenFailed, xoCursor, xsOpenFailed );
+XC ( xcColumnNotFound, xoColumn, xsNotFound );
+XC ( xcColumnReadFailed, xoColumn, xsReadFailed );
+XC ( xcIntegerOutOfBounds, xoInteger, xsOutOfBounds );
+XC ( xcCursorAccessFailed, xoCursor, xsAccessFailed );
+XC ( xcRowNotFound, xoRow, xsNotFound );
+XC ( xcSelfZombie, xoSelf, xsZombie );
+XC ( xcRefcountOutOfBounds, xoRefcount, xsOutOfBounds );
+XC ( xcParamOutOfBounds, xoParam, xsOutOfBounds );
+XC ( xcResourceExists, xoResource, xsExists );
+XC ( xcCursorExhausted, xoCursor, xsExhausted );
+XC ( xcStringCreateFailed, xoString, xsCreateFailed );
+XC ( xcIteratorUninitialized, xoIterator, xsUninitialized );
+XC ( xcWrongReference, xoParam, xsIncorrect );
+XC ( xcIteratorExhausted, xoIterator, xsExhausted );
+XC ( xcStringNotFound, xoString, xsNotFound );
+XC ( xcParamUnexpected, xoParam, xsUnexpected );
+XC ( xcArcIncorrect, xoArc, xsIncorrect );
+XC ( xcTypeIncorrect, xoType, xsIncorrect );
+XC ( xcWrongReadGroup, xoReadGroup, xsIncorrect );
+XC ( xcInterfaceNull, xoInterface, xsIsNull );
+XC ( xcTransferIncomplete, xoTransfer, xsIncomplete );
+XC ( xcReleaseFailed, xoRefcount, xsFailed );
+XC ( xcFunctionNull, xoFunction, xsIsNull );
+XC ( xcFunctionIncomplete, xoFunction, xsIncomplete );
+XC ( xcPathNull, xoPath, xsIsNull );
+XC ( xcPathEmpty, xoPath, xsEmpty );
+XC ( xcPathInvalid, xoPath, xsInvalid );
+XC ( xcParamInvalid, xoParam, xsInvalid );
+XC ( xcStorageExhausted, xoStorage, xsExhausted );
+XC ( xcFunctionUnimplemented, xoFunction, xsUnimplemented );
+XC ( xcErrorUnknown, xoError, xsUnknown );
+XC ( xcRefcountInconsistent, xoRefcount, xsInconsistent );
+XC ( xcRefcountExcessive, xoRefcount, xsExcessive );
+XC ( xcBufferInsufficient, xoBuffer, xsInsufficient );
+XC ( xcFileReadOnly, xoFile, xsReadOnly );
+XC ( xcFileWriteOnly, xoFile, xsWriteOnly );
+XC ( xcFileInvalidVersion, xoFile, xsInvalid );
+XC ( xcFileNotFound, xoFile, xsNotFound );
+XC ( xcFileTimeout, xoFile, xsTimeout );
+XC ( xcFileUnexpected, xoFile, xsUnexpected );
+XC ( xcFileDescInvalid, xoFileDescriptor, xsInvalid );
+XC ( xcFileExcessive, xoFile, xsExcessive );
+XC ( xcDirectoryInvalidVersion, xoDirectory, xsInvalid );
+XC ( xcDirectoryWriteOnly, xoDirectory, xsWriteOnly );
+XC ( xcFunctionUnsupported, xoFunction, xsUnsupported );
+XC ( xcInterfaceIncorrect, xoInterface, xsIncorrect );
+XC ( xcInterfaceInvalid, xoInterface, xsInvalid );
+XC ( xcColumnEmpty, xoColumn, xsEmpty );
+XC ( xcParamNotFound, xoParam, xsNotFound );
+XC ( xcArgvInvalid, xoArgv, xsInvalid );
+XC ( xcDirectoryNotFound, xoDirectory, xsNotFound );
+XC ( xcFileAccessFailed, xoFile, xsAccessFailed );
+XC ( xcZlibInitFailed, xoZlib, xsInitFailed );
+XC ( xcZlibDataInvalid, xoZlib, xsInvalid );
+XC ( xcSecondaryAlignmentMissingPrimary, xoAlignment, xsNoPrimary );
+XC ( xcInterfaceBadVersion, xoInterface, xsBadVersion );
+XC ( xcRefcountViolated, xoRefcount, xsViolated );
+XC ( xcSelfInvalid, xoSelf, xsInvalid );
+XC ( xcParamIncorrect, xoParam, xsIncorrect );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfc_xc_ */
diff --git a/interfaces/kfc/xcdefs.h b/interfaces/kfc/xcdefs.h
new file mode 100644
index 0000000..7d88abe
--- /dev/null
+++ b/interfaces/kfc/xcdefs.h
@@ -0,0 +1,81 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_xcdefs_
+#define _h_kfc_xcdefs_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * XCObj
+ */
+typedef struct XCObj XCObj;
+struct XCObj
+{
+    const char *name;
+    const char *desc;
+    const XCObj *dad;
+    uint32_t rc_obj;
+};
+
+
+/*--------------------------------------------------------------------------
+ * XCState
+ */
+typedef struct XCState XCState;
+struct XCState
+{
+    const char *name;
+    const char *desc;
+    const XCState *dad;
+    uint32_t rc_state;
+};
+
+
+/*--------------------------------------------------------------------------
+ * XCErr
+ */
+typedef struct XCErr XCErr;
+struct XCErr
+{
+    const char *name;
+    const XCErr *dad;
+    const XCObj *obj;
+    const XCState *state;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_kfc_xcdefs_ */
diff --git a/interfaces/kfc/xcext.h b/interfaces/kfc/xcext.h
new file mode 100644
index 0000000..712e262
--- /dev/null
+++ b/interfaces/kfc/xcext.h
@@ -0,0 +1,64 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_xcext_
+#define _h_kfc_xcext_
+
+/* turn off default macros */
+#define XC_DEFINE 1
+
+#ifdef _h_kfc_defs_
+#error "<kfc/defs.h> must not be included before <kfc/xcext.h>"
+#endif
+
+#ifndef _h_kfc_xcdefs_
+#include <kfc/xcdefs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define XOBJ( name, desc, rc )                  \
+    extern const XCObj name
+#define XOBJ_EXT( name, supr, desc, rc )        \
+    extern const XCObj name
+
+#define XSTATE( name, desc, rc )                \
+    extern const XCState name
+#define XSTATE_EXT( name, supr, desc, rc )      \
+    extern const XCState name
+
+#define XC( name, obj, state )                  \
+    extern const XCErr name
+#define XC_EXT( name, supr )                    \
+    extern const XCErr name
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfc_xcext_ */
diff --git a/interfaces/kfc/xcgen.h b/interfaces/kfc/xcgen.h
new file mode 100644
index 0000000..64fb1ac
--- /dev/null
+++ b/interfaces/kfc/xcgen.h
@@ -0,0 +1,68 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_xcgen_
+#define _h_kfc_xcgen_
+
+#ifndef _h_kfc_xcext_
+#include <kfc/xcext.h>
+#endif
+
+#ifndef _h_kfc_rc_
+#include <kfc/rc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#undef XOBJ
+#undef XOBJ_EXT
+#undef XSTATE
+#undef XSTATE_EXT
+#undef XC
+#undef XC_EXT
+
+#define XOBJ( name, desc, rc )                          \
+    const XCObj name = { # name, desc, NULL, rc }
+#define XOBJ_EXT( name, supr, desc, rc )                \
+    const XCObj name = { # name, desc, & supr, rc }
+
+#define XSTATE( name, desc, rc )                        \
+    const XCState name = { # name, desc, NULL, rc }
+#define XSTATE_EXT( name, supr, desc, rc )              \
+    const XCState name = { # name, desc, & supr, rc }
+
+#define XC( name, obj, state )                          \
+    const XCErr name = { # name, NULL, & obj, & state }
+#define XC_EXT( name, supr )                            \
+    const XCErr name = { # name, & supr }
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfc_xcgen_ */
diff --git a/interfaces/kfg/config.h b/interfaces/kfg/config.h
new file mode 100644
index 0000000..291f2d5
--- /dev/null
+++ b/interfaces/kfg/config.h
@@ -0,0 +1,425 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfg_config_
+#define _h_kfg_config_
+
+#ifndef _h_kfg_extern_
+#include <kfg/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This flag has important ramifications to all programs.
+ * If set then all programs that use KMain()/KMane() 
+ * become dependant on the kfg and kfs libraries.
+ *
+ * This will also modify the behavior of program tear down.
+ * if unset the memory used by the singleton config manager
+ * will not be freed.
+ */
+#define KFG_COMMON_CREATION 0
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct KDirectory;
+struct KNamelist;
+struct VPath;
+struct String;
+
+/*--------------------------------------------------------------------------
+ * KConfig
+ *  configuration paramter manager
+ */
+typedef struct KConfig KConfig;
+
+
+/* Make
+ *  create a process-global configuration manager
+ *
+ *  "cfg" [ OUT ] - return parameter for mgr
+ *
+ *  "optional_search_base" [ IN, NULL OKAY ]
+ */
+KFG_EXTERN rc_t CC KConfigMake ( KConfig **cfg,
+    struct KDirectory const * optional_search_base );
+
+/* AddRef
+ * Release
+ */
+KFG_EXTERN rc_t CC KConfigAddRef ( const KConfig *self );
+KFG_EXTERN rc_t CC KConfigRelease ( const KConfig *self );
+
+
+/* LoadFile
+ * loads a configuration file
+ */
+KFG_EXTERN rc_t CC KConfigLoadFile ( KConfig * self,
+    const char * path, struct KFile const * file );
+
+
+/* Commit
+ *  Commits changes to user's private configuration file
+ *
+ *  Respects DisabledUserSettings(do not update default user settings)
+ */
+KFG_EXTERN rc_t CC KConfigCommit ( KConfig *self );
+
+/* Read
+ *  read a node value
+ *
+ *  "offset" [ IN ] - initial offset into configuration
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - number of bytes actually read
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of bytes remaining to be read.
+ *  specifically, "offset" + "num_read" + "remaining" == sizeof node data
+ */
+KFG_EXTERN rc_t CC KConfigRead ( const KConfig *self, const char *path,
+    size_t offset, char *buffer, size_t bsize,
+    size_t *num_read, size_t *remaining );
+
+/* ReadBool
+ *  read a boolean node value
+ *
+ * self [ IN ] - KConfig object
+ * path [ IN ] - path to the node
+ * result [ OUT ] - return value (true if "TRUE", false if "FALSE"; rc != 0 if neither)
+ *
+ */
+KFG_EXTERN rc_t CC KConfigReadBool ( const KConfig* self, const char* path, bool* result );
+KFG_EXTERN rc_t CC KConfigWriteBool( KConfig *self, const char * path, bool value );
+    
+/* ReadI64
+ *  read an integer node value
+ *
+ * self [ IN ] - KConfig object
+ * path [ IN ] - path to the node
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+KFG_EXTERN rc_t CC KConfigReadI64 ( const KConfig* self, const char* path, int64_t* result );
+
+/* ReadU64
+ *  read an unsigned node value
+ *
+ * self [ IN ] - KConfig object
+ * path [ IN ] - path to the node
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+KFG_EXTERN rc_t CC KConfigReadU64 ( const KConfig* self, const char* path, uint64_t* result );
+
+/* ReadF64
+ *  read an F64 node value
+ *
+ * self [ IN ] - KConfig object
+ * path [ IN ] - path to the node
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+KFG_EXTERN rc_t CC KConfigReadF64( const KConfig* self, const char* path, double* result );
+
+#if 0
+/*** NB - temporarily lives in vfs due to library interdependencies ***/
+
+/* ReadVPath
+ *  read a VPath node value
+ *
+ * self [ IN ] - KConfig object
+ * path [ IN ] - path to the node
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+KFG_EXTERN rc_t CC KConfigReadVPath ( const KConfig* self, const char* path, struct VPath** result );
+#endif
+
+/* ReadString
+ *  read a String node value
+ *
+ * self [ IN ] - KConfig object
+ * path [ IN ] - path to the node
+ * result [ OUT, NUL-TERMINATED ] - return value; caller responsible for deallocation
+ *
+ */
+KFG_EXTERN rc_t CC KConfigReadString ( const KConfig* self, const char* path, struct String** result );
+KFG_EXTERN rc_t CC KConfigWriteString( KConfig *self, const char * path, const char * value );
+KFG_EXTERN rc_t CC KConfigWriteSString( KConfig *self, const char * path, struct String const * value );
+
+/* Print
+ *  print configuration to output handler (using OUTMSG)
+ */
+KFG_EXTERN rc_t CC KConfigPrint ( const KConfig * self, int indent );
+
+KFG_EXTERN rc_t CC KConfigToFile ( const KConfig * self, struct KFile * file );
+
+/* DisableUserSettings
+ *  for testing purposes
+ */
+KFG_EXTERN void CC KConfigDisableUserSettings ( void );
+
+
+/*--------------------------------------------------------------------------
+ * KConfigNode
+ *  node within configuration tree
+ */
+typedef struct KConfigNode KConfigNode;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+KFG_EXTERN rc_t CC KConfigNodeAddRef ( const KConfigNode *self );
+KFG_EXTERN rc_t CC KConfigNodeRelease ( const KConfigNode *self );
+
+
+KFG_EXTERN rc_t CC KConfigNodeGetMgr( const KConfigNode * self, KConfig ** mgr );
+
+/* OpenNodeRead
+ * VOpenNodeRead
+ *  opens a configuration node
+ *
+ *  "node" [ OUT ] - return parameter for indicated configuration node
+ *
+ *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+ *  node within configuration hierarchy. paths will be interpreted as
+ *  if they were file system paths, using '/' as separator. the
+ *  special values NULL and "" are interpreted as "."
+ */
+KFG_EXTERN rc_t CC KConfigOpenNodeRead ( const KConfig *self,
+    const KConfigNode **node, const char *path, ... );
+KFG_EXTERN rc_t CC KConfigNodeOpenNodeRead ( const KConfigNode *self,
+    const KConfigNode **node, const char *path, ... );
+
+KFG_EXTERN rc_t CC KConfigVOpenNodeRead ( const KConfig *self,
+    const KConfigNode **node, const char *path, va_list args );
+KFG_EXTERN rc_t CC KConfigNodeVOpenNodeRead ( const KConfigNode *self,
+    const KConfigNode **node, const char *path, va_list args );
+
+
+/* OpenNodeUpdate
+ * VOpenNodeUpdate
+ *  opens a configuration node
+ *
+ *  "node" [ OUT ] - return parameter for indicated configuration node
+ *
+ *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+ *  node within configuration hierarchy. paths will be interpreted as
+ *  if they were file system paths, using '/' as separator. the
+ *  special values NULL and "" are interpreted as "."
+ */
+KFG_EXTERN rc_t CC KConfigOpenNodeUpdate ( KConfig *self,
+    KConfigNode **node, const char *path, ... );
+KFG_EXTERN rc_t CC KConfigNodeOpenNodeUpdate ( KConfigNode *self,
+    KConfigNode **node, const char *path, ... );
+
+KFG_EXTERN rc_t CC KConfigVOpenNodeUpdate ( KConfig *self,
+    KConfigNode **node, const char *path, va_list args );
+KFG_EXTERN rc_t CC KConfigNodeVOpenNodeUpdate ( KConfigNode *self,
+    KConfigNode **node, const char *path, va_list args );
+
+
+/* Read
+ *  read a node value
+ *
+ *  "offset" [ IN ] - initial offset into configuration
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - number of bytes actually read
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of bytes remaining to be read.
+ *  specifically, "offset" + "num_read" + "remaining" == sizeof node data
+ */
+KFG_EXTERN rc_t CC KConfigNodeRead ( const KConfigNode *self,
+    size_t offset, char *buffer, size_t bsize,
+    size_t *num_read, size_t *remaining );
+
+/* ReadBool
+ *  read a boolean node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (true if "TRUE", false if "FALSE"; rc != 0 if neither)
+ *
+ */
+KFG_EXTERN rc_t CC KConfigNodeReadBool ( const KConfigNode *self, bool* result );
+
+    
+/* ReadI64
+ *  read an integer node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+KFG_EXTERN rc_t CC KConfigNodeReadI64 ( const KConfigNode *self, int64_t* result );
+
+/* ReadU64
+ *  read an unsigned node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+KFG_EXTERN rc_t CC KConfigNodeReadU64 ( const KConfigNode *self, uint64_t* result );
+
+/* ReadF64
+ *  read an F64 node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+KFG_EXTERN rc_t CC KConfigNodeReadF64 ( const KConfigNode *self, double* result );
+
+#if 0
+/*** NB - temporarily lives in vfs due to library interdependencies ***/
+
+/* ReadVPath
+ *  read a VPath node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+KFG_EXTERN rc_t CC KConfigNodeReadVPath ( const KConfigNode *self, struct VPath** result );
+#endif
+
+/* ReadString
+ *  read a String node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value; caller responsible for deallocation
+ *
+ */
+KFG_EXTERN rc_t CC KConfigNodeReadString ( const KConfigNode *self, struct String** result );
+
+/* ListChildren - nee ListChild
+ *  list all named children
+ */
+#define KConfigNodeListChild KConfigNodeListChildren
+KFG_EXTERN rc_t CC KConfigNodeListChildren ( const KConfigNode *self,
+    struct KNamelist **names );
+
+
+/* Write
+ *  write a node value or attribute
+ *  overwrites anything already there
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - new value data
+ */
+KFG_EXTERN rc_t CC KConfigNodeWrite ( KConfigNode *self, const char *buffer, size_t size );
+
+
+/* Write Boolean
+ *  write a boolean value ( literally the text "true" or "false:
+ *  overwrites anything already there
+ *
+ *  "state" [ IN ] - new value
+ */
+KFG_EXTERN rc_t CC KConfigNodeWriteBool ( KConfigNode *self, bool state );
+
+
+/* Append
+ *  append data to value
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - value data to be appended
+ */
+KFG_EXTERN rc_t CC KConfigNodeAppend ( KConfigNode *self, const char *buffer, size_t size );
+
+
+/* ReadAttr
+ *  reads as NUL-terminated string
+ *
+ *  "name" [ IN ] - NUL terminated attribute name
+ *
+ *  "buffer" [ OUT ] and "bsize" - return parameter for attribute value
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+KFG_EXTERN rc_t CC KConfigNodeReadAttr ( const KConfigNode *self, const char *name,
+    char *buffer, size_t bsize, size_t *size );
+
+
+/* WriteAttr
+ *  writes NUL-terminated string
+ *
+ *  "name" [ IN ] - NUL terminated attribute name
+ *
+ *  "value" [ IN ] - NUL terminated attribute value
+ */
+KFG_EXTERN rc_t CC KConfigNodeWriteAttr ( KConfigNode *self,
+    const char *name, const char *value );
+
+
+/* Drop
+ * VDrop
+ *  drop some or all node content
+ */
+KFG_EXTERN rc_t CC KConfigNodeDropAll ( KConfigNode *self );
+KFG_EXTERN rc_t CC KConfigNodeDropAttr ( KConfigNode *self, const char *attr );
+KFG_EXTERN rc_t CC KConfigNodeDropChild ( KConfigNode *self, const char *path, ... );
+KFG_EXTERN rc_t CC KConfigNodeVDropChild ( KConfigNode *self, const char *path, va_list args );
+
+
+/* Rename
+ *  renames a contained object
+ *
+ *  "from" [ IN ] - NUL terminated string in UTF-8
+ *  giving simple name of existing attr
+ *
+ *  "to" [ IN ] - NUL terminated string in UTF-8
+ *  giving new simple attr name
+ */
+KFG_EXTERN rc_t CC KConfigNodeRenameAttr ( KConfigNode *self, const char *from, const char *to );
+KFG_EXTERN rc_t CC KConfigNodeRenameChild ( KConfigNode *self, const char *from, const char *to );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfg_config_ */
diff --git a/interfaces/kfg/extern.h b/interfaces/kfg/extern.h
new file mode 100644
index 0000000..47e2f43
--- /dev/null
+++ b/interfaces/kfg/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfg_extern_
+#define _h_kfg_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define KFG_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define KFG_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_kfg_extern_ */
diff --git a/interfaces/kfg/kart.h b/interfaces/kfg/kart.h
new file mode 100644
index 0000000..fa54fd4
--- /dev/null
+++ b/interfaces/kfg/kart.h
@@ -0,0 +1,90 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfg_kart_
+#define _h_kfg_kart_
+
+#ifndef _h_kfg_extern_
+#include <kfg/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KDirectory;
+
+/* AA-833 */
+
+typedef struct KartItem KartItem;
+
+KFG_EXTERN rc_t CC KartItemAddRef(const KartItem *self);
+KFG_EXTERN rc_t CC KartItemRelease(const KartItem *self);
+
+/** Do not release the returned String !
+ *  N.B. returned String is not required to be NULL-terminated !
+KFG_EXTERN rc_t CC KartItemTypeId(const KartItem *self, const String **elem);
+ */
+KFG_EXTERN rc_t CC KartItemProjId(const KartItem *self, const String **elem);
+KFG_EXTERN rc_t CC KartItemProjIdNumber(const KartItem *self, uint64_t *id);
+KFG_EXTERN rc_t CC KartItemItemId(const KartItem *self, const String **elem);
+KFG_EXTERN rc_t CC KartItemItemIdNumber(const KartItem *self, uint64_t *id);
+KFG_EXTERN rc_t CC KartItemAccession(const KartItem *self, const String **elem);
+KFG_EXTERN rc_t CC KartItemName(const KartItem *self, const String **elem);
+KFG_EXTERN rc_t CC KartItemItemDesc(const KartItem *self, const String **elem);
+
+typedef struct Kart Kart;
+
+KFG_EXTERN rc_t CC KartAddRef(const Kart *self);
+KFG_EXTERN rc_t CC KartRelease(const Kart *self);
+
+KFG_EXTERN rc_t CC KartMake(const struct KDirectory *dir, const char *path,
+    Kart **kart, bool *isKart);
+#ifdef _DEBUGGING
+KFG_EXTERN rc_t CC KartMakeText(const struct KDirectory *dir, const char *path,
+    Kart **kart, bool *isKart);
+#endif
+
+KFG_EXTERN rc_t CC KartPrint(const Kart *self);
+KFG_EXTERN rc_t CC KartPrintNumbered(const Kart *self);
+
+KFG_EXTERN rc_t CC KartMakeNextItem(Kart *self, const KartItem **item);
+
+KFG_EXTERN rc_t CC KartItemsProcessed(const Kart *self, uint16_t *number);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfg_kart_ */
diff --git a/interfaces/kfg/keystore-priv.h b/interfaces/kfg/keystore-priv.h
new file mode 100644
index 0000000..f86ac3d
--- /dev/null
+++ b/interfaces/kfg/keystore-priv.h
@@ -0,0 +1,92 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfg_keystore_priv_
+#define _h_kfg_keystore_priv_
+
+#ifndef _h_kfg_keystore_
+#include <kfg/keystore.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ KEncryptionKey
+ */
+ struct KEncryptionKey
+ {
+    KRefcount   refcount;
+    String      value; /* 0-terminator is not included */
+ };
+
+KFG_EXTERN rc_t CC KEncryptionKeyMake(const char* value, KEncryptionKey** key);
+ 
+/*--------------------------------------------------------------------------
+ KKeyStore 
+ */
+#ifndef KKEYSTORE_IMPL
+    #define KKEYSTORE_IMPL struct KKeyStore
+#endif
+
+typedef struct KKeyStore_vt_v1_struct {
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t ( *destroy   )                 ( KKEYSTORE_IMPL* self );
+    rc_t ( *getKey )                    ( const KKEYSTORE_IMPL* self, const char* obj_key, KEncryptionKey** enc_key);
+    /* end minor version == 0 */
+
+} KKeyStore_vt_v1;
+
+typedef union KKeyStore_vt {
+    KKeyStore_vt_v1* v1;
+} KKeyStore_vt;
+
+/* KKeyStoreSetConfig
+ * Specify the Config object used by the KeyStore object. If the object is not specified, one will be created 
+ * when required using KConfigMake
+ *
+ * kfg [ IN, NULL OK ] if NULL, forget the current kfg object
+ */
+KFG_EXTERN rc_t CC KKeyStoreSetConfig(struct KKeyStore* self, const struct KConfig* kfg);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfg_keystore_priv_ */
diff --git a/interfaces/kfg/keystore.h b/interfaces/kfg/keystore.h
new file mode 100644
index 0000000..28b97db
--- /dev/null
+++ b/interfaces/kfg/keystore.h
@@ -0,0 +1,159 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfg_keystore_
+#define _h_kfg_keystore_
+
+#ifndef _h_kfg_extern_
+#include <kfg/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFile;
+struct KConfig;
+struct String;
+
+/*--------------------------------------------------------------------------
+ * KEncryptionKey
+ *  Encryption key, reference-counted and kept in non-swappable memory
+ */
+typedef struct KEncryptionKey KEncryptionKey;
+
+KFG_EXTERN rc_t CC KEncryptionKeyAddRef ( struct KEncryptionKey *self );
+KFG_EXTERN rc_t CC KEncryptionKeyRelease ( struct KEncryptionKey *self );
+
+
+/*--------------------------------------------------------------------------
+ * KKeyStore
+ *  Encryption key storage interface
+ */
+typedef struct KKeyStore KKeyStore;
+
+ /* all strings are NUL-terminated */
+ 
+/* AddRef
+ */
+KFG_EXTERN rc_t CC KKeyStoreAddRef ( const KKeyStore *self );
+/* Release
+ */
+KFG_EXTERN rc_t CC KKeyStoreRelease ( const KKeyStore *self );
+
+/* 
+ * KKeyStoreSetTemporaryKeyFromFile
+ *
+ *  set a temporarily encryption key 
+ *  the key will only be maintained for this instance of KKeyStore (use for externally supplied keys).
+ * 
+ *  enc_file[ IN, NULL OK ] - open KFile containing the key (characters after the first \n are ignored)
+ *  if NULL is specified, forget the previously set temporary key
+ */
+KFG_EXTERN rc_t CC KKeyStoreSetTemporaryKeyFromFile(KKeyStore* self, const struct KFile* enc_file);
+
+/* KKeyStoreGetKey
+ * KKeyStoreGetKeyByProjectId
+ *  returns the encryption key associated with the specified object
+ * 
+ *  obj_key [ IN, NULL OK ] - NUL-terminated key of the object in question. The key can be an accession name, or a file system path.
+ *      If NULL, will return the current protected repository's key,
+ *      or, if projectId is passed, will return project's repository's key,
+ *      or, if not within a protected repository, the global key if available
+ *      from environment or configuration 
+ *  enc_key [ OUT ] 
+ */
+KFG_EXTERN rc_t CC KKeyStoreGetKey(const KKeyStore* self, const char* obj_key, KEncryptionKey** enc_key);
+
+KFG_EXTERN rc_t CC KKeyStoreGetKeyByProjectId(const KKeyStore* self,
+    const char* obj_key, KEncryptionKey** enc_key, uint32_t projectId);
+
+/*
+ * Registering bindings between numeric object Ids and object names
+ */                                        
+ 
+/* KKeyStoreSetBindingsFile
+ *  Specifies location of a bindings file used by this instance of KeyStore. 
+ *  If never set or set to NULL, uses default location ($NCBI_HOME/objid.mapping)
+ * 
+ * self [ IN ] - KKeyStore object
+ * path [ IN, NUL-TERMINATED, NULL OK ] - pathname to the bindings file. If NULL, reset to default location ($NCBI_HOME/objid.mapping)
+ */
+KFG_EXTERN rc_t CC KKeyStoreSetBindingsFile(struct KKeyStore* self, const char* path);
+
+/* KKeyStoreGetBindingsFile
+ *  Returns location of a bindings file used by this instance of KeyStore. 
+ * 
+ * self [ IN ] - KKeyStore object
+ * returns pathname to the bindings file. If NULL, default location will be used when needed
+ */
+KFG_EXTERN const char* KKeyStoreGetBindingsFile(const struct KKeyStore* self);
+ 
+/* KKeyStoreRegisterObject
+ *  registers a binding between an object Id and an object name 
+ * 
+ * self [ IN ] - KKeyStore object
+ * oid [ IN ] - object id
+ * obj [ IN ] - object's name (any characters except '\r' and '\n' )
+ */
+KFG_EXTERN rc_t CC KKeyStoreRegisterObject(struct KKeyStore* self, uint32_t oid, const struct String* name);
+
+/* KKeyStoreGetObjectId
+ *  look up an object id by an object name 
+ * 
+ * self [ IN ] - KKeyStore object
+ * obj [ IN ] - object's name 
+ * oid [ OUT ] - object id
+ */
+KFG_EXTERN rc_t CC VKKeyStoreGetObjectId(const struct KKeyStore* self, const struct String* name, uint32_t* oid);
+
+/* KKeyStoreGetObjectName
+ *  look up an object name by an object id
+ * 
+ * self [ IN ] - KKeyStore object
+ * obj [ IN ] - object's name 
+ * oid [ OUT ] - object id
+ */
+KFG_EXTERN rc_t CC KKeyStoreGetObjectName(const struct KKeyStore* self, uint32_t oid, const struct String** name);
+
+
+/* KKeyStoreMake
+ * Creates a non-keyring implementation, which uses a combination of location-based and global encryption keys.
+ * 
+ * self [ OUT ]
+ * kfg [ IN, NULL OK ] - optional config object to use
+ */
+KFG_EXTERN rc_t CC KKeyStoreMake(KKeyStore** self, struct KConfig* kfg);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfg_keystore_ */
diff --git a/interfaces/kfg/kfg-priv.h b/interfaces/kfg/kfg-priv.h
new file mode 100644
index 0000000..7df86ce
--- /dev/null
+++ b/interfaces/kfg/kfg-priv.h
@@ -0,0 +1,110 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfg_kfg_priv_
+#define _h_kfg_kfg_priv_
+
+#ifndef _h_kfg_extern_
+#include <kfg/extern.h>
+#endif
+
+#ifndef _h_kfg_config_
+#include <kfg/config.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDirectory;
+struct KNamelist;
+
+
+/*--------------------------------------------------------------------------
+ * Environment and configuration keys
+ */
+#define ENV_KRYPTO_PWFILE_OLD   "VDB_PWFILE"
+#define ENV_KRYPTO_PWFILE   "VDBPWFILEPTR"
+#define KFG_KRYPTO_PWFILE   "krypto/pwfile"
+#define KFG_KRYPTO_PWFD     "krypto/pwfd"
+
+/*--------------------------------------------------------------------------
+ * KConfig
+ *  configuration paramter manager
+ */
+
+/* ListIncluded
+ *  list all included files
+ */
+KFG_EXTERN rc_t CC KConfigListIncluded ( const KConfig *self,
+    struct KNamelist **names );
+
+/* GetLoadPath
+ *  return colon-separated search path to load KConfig
+ * NB. path should not be released
+ */
+KFG_EXTERN rc_t CC KConfigGetLoadPath ( const KConfig *self,
+    const char **path );
+
+/* MakeEmpty
+ *  make a KConfig object that does not load any configuration file
+ *  during initialization except user settings ( optionally )
+ */
+KFG_EXTERN rc_t CC KConfigMakeEmpty ( KConfig ** cfg );
+
+/* MakeLocal
+ *  make a KConfig object that avoids initializing singleton
+ */
+KFG_EXTERN rc_t CC KConfigMakeLocal ( KConfig **cfg,
+    struct KDirectory const * cfgdir );
+
+
+/* make sure ResolverCgiNode is https */
+KFG_EXTERN rc_t KConfigFixMainResolverCgiNode ( KConfig * self );
+KFG_EXTERN rc_t KConfigFixProtectedResolverCgiNode ( KConfig * self );
+
+
+/* PrintDebug
+ *  print configuration including some internal nodes information
+ */
+KFG_EXTERN rc_t CC KConfigPrintDebug ( const KConfig *self,
+    const char *root_node_name );
+
+/* PrintPartial
+ *  print configuration while skipping some nodes
+ */
+KFG_EXTERN rc_t CC KConfigPrintPartial
+    ( const KConfig *self, int indent, uint32_t skipCount, va_list args );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfg_kfg_priv_ */
diff --git a/interfaces/kfg/ngc.h b/interfaces/kfg/ngc.h
new file mode 100644
index 0000000..b3269a4
--- /dev/null
+++ b/interfaces/kfg/ngc.h
@@ -0,0 +1,67 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfg_ngc_
+#define _h_kfg_ngc_
+
+#ifndef _h_kfg_extern_
+#include <kfg/extern.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct KNgcObj KNgcObj;
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+
+KFG_EXTERN rc_t CC KNgcObjMakeFromString ( const KNgcObj **ngc, const char * line );
+KFG_EXTERN rc_t CC KNgcObjMakeFromFile ( const KNgcObj **ngc, const struct KFile * src );
+
+/* AddRef
+ * Release
+ */
+KFG_EXTERN rc_t CC KNgcObjAddRef ( const KNgcObj *self );
+KFG_EXTERN rc_t CC KNgcObjRelease ( const KNgcObj *self );
+
+KFG_EXTERN rc_t CC KNgcObjPrint ( const KNgcObj *self, char * buffer, size_t buffer_size, size_t * written );
+KFG_EXTERN rc_t CC KNgcObjWriteToFile ( const KNgcObj *self, struct KFile * dst );
+KFG_EXTERN rc_t CC KNgcObjWriteKeyToFile ( const KNgcObj *self, struct KFile * dst );
+
+KFG_EXTERN rc_t CC KNgcObjGetProjectId ( const KNgcObj *self, uint32_t * id );
+KFG_EXTERN rc_t CC KNgcObjGetProjectName ( const KNgcObj *self, char * buffer, size_t buffer_size, size_t * written );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfg_ngc_ */
diff --git a/interfaces/kfg/properties.h b/interfaces/kfg/properties.h
new file mode 100644
index 0000000..3f3e792
--- /dev/null
+++ b/interfaces/kfg/properties.h
@@ -0,0 +1,143 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfg_properties_
+#define _h_kfg_properties_
+
+#ifndef _h_kfg_extern_
+#include <kfg/extern.h>
+#endif
+
+#ifndef _h_kfg_config_
+#include <kfg/config.h>
+#endif
+
+#ifndef _h_kfg_ngc_
+#include <kfg/ngc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* get/set HTTP proxy path */
+KFG_EXTERN rc_t CC KConfig_Get_Http_Proxy_Path
+    ( const KConfig *self, char *buffer, size_t buffer_size, size_t *written );
+KFG_EXTERN rc_t CC KConfig_Set_Http_Proxy_Path
+    ( KConfig *self, const char *value );
+
+/* get/set enabled-state for HTTP proxy */
+KFG_EXTERN rc_t CC KConfig_Get_Http_Proxy_Enabled
+    ( const KConfig *self, bool *enabled, bool dflt );
+KFG_EXTERN rc_t CC KConfig_Set_Http_Proxy_Enabled
+    ( KConfig *self, bool enabled );
+
+/* get/set priority of environmnet vs. configuration for HTTP proxy */
+KFG_EXTERN rc_t CC KConfig_Has_Http_Proxy_Env_Higher_Priority
+    ( const KConfig *self, bool *enabled );
+KFG_EXTERN rc_t CC KConfig_Set_Http_Proxy_Env_Higher_Priority
+    ( KConfig *self, bool enabled );
+
+
+/* get the %HOME% path from config
+ */
+KFG_EXTERN rc_t CC KConfig_Get_Home( const KConfig *self, char * buffer, size_t buffer_size, size_t * written );
+
+/* get/set the default path for proposing a path for ngc-imports
+ */
+KFG_EXTERN rc_t CC KConfig_Get_Default_User_Path( const KConfig *self, char * buffer, size_t buffer_size, size_t * written );
+KFG_EXTERN rc_t CC KConfig_Set_Default_User_Path( const KConfig *self, const char * value );
+
+/* get/set the enabled-state for the 3 repository-categories
+ */
+KFG_EXTERN rc_t CC KConfig_Get_Remote_Access_Enabled
+    ( const KConfig *self, bool * enabled );
+KFG_EXTERN rc_t CC KConfig_Get_Remote_Main_Cgi_Access_Enabled
+    ( const KConfig *self, bool * enabled );
+KFG_EXTERN rc_t CC KConfig_Get_Remote_Aux_Ncbi_Access_Enabled
+    ( const KConfig *self, bool * enabled );
+
+KFG_EXTERN rc_t CC KConfig_Set_Remote_Access_Enabled( KConfig *self, bool enabled );
+
+KFG_EXTERN rc_t CC KConfig_Get_Site_Access_Enabled( const KConfig *self, bool * enabled );
+KFG_EXTERN rc_t CC KConfig_Set_Site_Access_Enabled( KConfig *self, bool enabled );
+
+KFG_EXTERN rc_t CC KConfig_Get_User_Access_Enabled( const KConfig *self, bool * enabled );
+KFG_EXTERN rc_t CC KConfig_Set_User_Access_Enabled( KConfig *self, bool enabled );
+
+
+/* get/set the the cache-enabled-state for the public/protected repositories
+ */
+KFG_EXTERN rc_t CC KConfig_Get_User_Public_Enabled( const KConfig *self, bool * enabled );
+KFG_EXTERN rc_t CC KConfig_Set_User_Public_Enabled( KConfig *self, bool enabled );
+
+KFG_EXTERN rc_t CC KConfig_Get_User_Public_Cached( const KConfig *self, bool * enabled );
+KFG_EXTERN rc_t CC KConfig_Set_User_Public_Cached( KConfig *self, bool enabled );
+
+KFG_EXTERN rc_t CC KConfig_Get_User_Protected_Cached( const KConfig *self, bool * enabled, const char * name );
+KFG_EXTERN rc_t CC KConfig_Set_User_Protected_Cached( KConfig *self, bool enabled, const char * name );
+
+
+/* get/set the the cache-location for the public/protected repositories
+ */
+KFG_EXTERN rc_t CC KConfig_Get_User_Public_Cache_Location( const KConfig *self,
+    char * value, size_t value_size, size_t * written );
+KFG_EXTERN rc_t CC KConfig_Set_User_Public_Cache_Location( KConfig *self, const char * value );
+
+
+/* Query protected repositories
+ */
+KFG_EXTERN rc_t CC KConfigGetProtectedRepositoryCount( const KConfig *self,
+    uint32_t * count );
+KFG_EXTERN rc_t CC KConfigGetProtectedRepositoryName( const KConfig *self,
+    uint32_t id, char * buffer, size_t buffer_size, size_t * written );
+KFG_EXTERN rc_t CC KConfigGetProtectedRepositoryPathById( const KConfig *self,
+    uint32_t id, char * buffer, size_t buffer_size, size_t * written );
+KFG_EXTERN rc_t CC KConfigSetProtectedRepositoryPathById( KConfig *self, uint32_t id, const char * value );
+
+KFG_EXTERN rc_t CC KConfigGetProtectedRepositoryIdByName( const KConfig *self,
+    const char * name, uint32_t * id );
+KFG_EXTERN rc_t CC KConfigGetProtectedRepositoryPathByName( const KConfig *self,
+    const char * name, char * buffer, size_t buffer_size, size_t * written );
+KFG_EXTERN rc_t CC KConfigGetProtectedRepositoryDescriptionByName(
+    const KConfig *self,
+    const char * name, char * buffer, size_t buffer_size, size_t * written );
+
+KFG_EXTERN rc_t CC KConfigDoesProtectedRepositoryExist( const KConfig *self, const char * name, bool * res );
+
+
+KFG_EXTERN rc_t CC KConfigGetProtectedRepositoryEnabledById( const KConfig *self, uint32_t id, bool * enabled );
+KFG_EXTERN rc_t CC KConfigSetProtectedRepositoryEnabledById( KConfig *self, uint32_t id, bool enabled );
+
+KFG_EXTERN rc_t CC KConfigGetProtectedRepositoryCachedById( const KConfig *self, uint32_t id, bool * enabled );
+KFG_EXTERN rc_t CC KConfigSetProtectedRepositoryCachedById( KConfig *self, uint32_t id, bool enabled );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfg_properties_ */
diff --git a/interfaces/kfg/repository.h b/interfaces/kfg/repository.h
new file mode 100644
index 0000000..ec68105
--- /dev/null
+++ b/interfaces/kfg/repository.h
@@ -0,0 +1,423 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfg_repository_
+#define _h_kfg_repository_
+
+
+#ifndef _h_kfg_extern_
+#include <kfg/extern.h>
+#endif
+ 
+#ifndef _h_klib_vector_
+#include <klib/vector.h> /* Vector */
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KConfig;
+struct KNgcObj;
+
+/*--------------------------------------------------------------------------
+ * KRepository
+ *  presents structured access to a storage repository
+ *  as modeled in KConfig.
+ *
+ *  all objects are obtained via KRepositoryMgr ( see below )
+ */
+typedef struct KRepository KRepository;
+
+
+/* AddRef
+ * Release
+ */
+KFG_EXTERN rc_t CC KRepositoryAddRef ( const KRepository *self );
+KFG_EXTERN rc_t CC KRepositoryRelease ( const KRepository *self );
+
+
+/* Category
+ * SubCategory
+ *  tells what the repository category or sub-category are
+ *  or returns "bad" if the repository object is not usable.
+ */
+typedef uint32_t KRepCategory;
+enum
+{
+    krepBadCategory,
+    krepUserCategory,
+    krepSiteCategory,
+    krepRemoteCategory
+};
+
+typedef uint32_t KRepSubCategory;
+enum
+{
+    krepBadSubCategory,
+    krepMainSubCategory,
+    krepAuxSubCategory,
+    krepProtectedSubCategory
+};
+
+KFG_EXTERN KRepCategory CC KRepositoryCategory ( const KRepository *self );
+KFG_EXTERN KRepSubCategory CC KRepositorySubCategory ( const KRepository *self );
+
+
+/* Name
+ *  get the repository name
+ *  attempts to copy NUL-terminated name into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - name output parameter
+ *
+ *  "name_size" [ OUT, NULL OKAY ] - returns the name size in
+ *  bytes, excluding any NUL termination.
+ */
+KFG_EXTERN rc_t CC KRepositoryName ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *name_size );
+
+
+/* DisplayName
+ *  get the repository display name,
+ *  if different from its actual name
+ *
+ *  attempts to copy NUL-terminated name into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - name output parameter
+ *
+ *  "name_size" [ OUT, NULL OKAY ] - returns the name size in
+ *  bytes, excluding any NUL termination.
+ */
+KFG_EXTERN rc_t CC KRepositoryDisplayName ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *name_size );
+
+
+/* Root
+ *  read the root path as a POSIX path or URL
+ *
+ *  attempts to copy NUL-terminated path into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - path output parameter
+ *
+ *  "root_size" [ OUT, NULL OKAY ] - returns the path size in
+ *  bytes, excluding any NUL termination.
+ */
+KFG_EXTERN rc_t CC KRepositoryRoot ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *root_size );
+
+
+/* SetRoot
+ *  set the root path
+ *
+ *  "root" [ IN ] and "root_size" [ IN ] - path input parameter
+ */
+KFG_EXTERN rc_t CC KRepositorySetRoot( KRepository *self,
+    const char *root, size_t root_size );
+
+
+/* RootHistory
+ *  read the root-history as a semicolon separated list of POSIX paths
+ *
+ *  attempts to copy NUL-terminated path into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - path output parameter
+ *
+ *  "roothistory_size" [ OUT, NULL OKAY ] - returns the root-history
+ *  size in bytes, excluding any NUL termination.
+ */
+KFG_EXTERN rc_t CC KRepositoryRootHistory ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *roothistory_size );
+
+
+/* SetRootHistory
+ *  set the root-history list of paths
+ *
+ *  "roothistory" [ IN ] and "roothistory_size" [ IN ] - path input parameter
+ */
+KFG_EXTERN rc_t CC KRepositorySetRootHistory( KRepository *self,
+    const char *roothistory, size_t roothistory_size  );
+
+
+/* AppendToRootHistory
+ *  append to the root-history
+ *
+ *  "roothistory" [ IN ] and "roothistory_size" [ IN ] - path input parameter
+ *  if item == NULL, add the current root to the root-history
+ */
+KFG_EXTERN rc_t CC KRepositoryAppendToRootHistory( KRepository *self,
+    const char *item  );
+
+
+/* Resolver
+ *  read the url of the CGI-resolver
+ *
+ *  attempts to copy NUL-terminated path into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - path output parameter
+ *
+ *  "written" [ OUT, NULL OKAY ] - returns the url size in
+ *  bytes, excluding any NUL termination.
+ */
+KFG_EXTERN rc_t CC KRepositoryResolver ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *written );
+
+
+/* Disabled
+ *  discover whether the repository is enabled
+ */
+KFG_EXTERN bool CC KRepositoryDisabled ( const KRepository *self );
+
+
+/* Set Disabled
+ *  changes the status of a repository, writes status into kfg-file on disk
+ *  disabled = true  ... disables the repository
+ *  disabled = false ... enables the repository
+ */
+KFG_EXTERN rc_t CC KRepositorySetDisabled ( const KRepository *self, bool disabled );
+
+
+/* CacheEnabled
+ *  discover whether the repository supports caching
+ */
+KFG_EXTERN bool CC KRepositoryCacheEnabled ( const KRepository *self );
+
+
+/* DownloadTicket
+ *  return any associated download ticket
+ *
+ *  attempts to copy NUL-terminated ticket into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - ticket output parameter
+ *
+ *  "ticket_size" [ OUT, NULL OKAY ] - returns the ticket size in
+ *  bytes, excluding any NUL termination.
+ */
+KFG_EXTERN rc_t CC KRepositoryDownloadTicket ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *ticket_size );
+
+
+/* EncryptionKey
+ *  return any associated encryption key
+ *
+ *  attempts to copy NUL-terminated key into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - encryption key output parameter
+ *
+ *  "key_size" [ OUT, NULL OKAY ] - returns the key size in
+ *  bytes, excluding any NUL termination.
+ */
+KFG_EXTERN rc_t CC KRepositoryEncryptionKey ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *key_size );
+
+
+/* EncryptionKeyFile
+ *  return path to any associated encryption key file
+ *
+ *  attempts to copy NUL-terminated path into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - key file path output parameter
+ *
+ *  "path_size" [ OUT, NULL OKAY ] - returns the path size in
+ *  bytes, excluding any NUL termination.
+ */
+KFG_EXTERN rc_t CC KRepositoryEncryptionKeyFile ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *path_size );
+
+
+/* Description
+ *  return any associated descriptive text
+ *
+ *  attempts to copy NUL-terminated description into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - description text output parameter
+ *
+ *  "desc_size" [ OUT, NULL OKAY ] - returns the text size in
+ *  bytes, excluding any NUL termination.
+ */
+KFG_EXTERN rc_t CC KRepositoryDescription ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *desc_size );
+
+
+/* ProjectId
+ *  return project id for protected user repository
+ *  return RC when repository is not user protected
+ *
+ *  "projectId" [ OUT ] - returns the project id
+ */
+KFG_EXTERN rc_t CC KRepositoryProjectId
+    ( const KRepository * self, uint32_t * projectId );
+
+
+/* Description
+ *  register an encrypted object in association with the repository's encryption key
+ */
+KFG_EXTERN rc_t CC KRepositoryRegisterObject ( const KRepository *self, const char* object_id );
+
+
+/*--------------------------------------------------------------------------
+ * KRepositoryVector
+ *  uses Vector API
+ *  holds zero or more KRepository objects
+ */
+typedef struct Vector KRepositoryVector;
+
+
+/* Whack
+ *  destroy your vector
+ */
+KFG_EXTERN rc_t CC KRepositoryVectorWhack ( KRepositoryVector *self );
+
+
+/*--------------------------------------------------------------------------
+ * KRepositoryMgr
+ *  manages structured access to repositories
+ */
+typedef struct KRepositoryMgr KRepositoryMgr;
+
+typedef uint32_t RepositorySelect;
+enum
+{
+    user = 1,
+    site = 2,
+    remote = 4,
+};
+
+/* Make
+ *  create a repository manager
+ *  uses values from "self"
+ *
+ *  mgr [ OUT ] 
+ */
+KFG_EXTERN rc_t CC KConfigMakeRepositoryMgrRead ( struct KConfig const *self, const KRepositoryMgr **mgr );
+KFG_EXTERN rc_t CC KConfigMakeRepositoryMgrUpdate ( struct KConfig *self, KRepositoryMgr **mgr );
+
+
+/* AddRef
+ * Release
+ */
+KFG_EXTERN rc_t CC KRepositoryMgrAddRef ( const KRepositoryMgr *self );
+KFG_EXTERN rc_t CC KRepositoryMgrRelease ( const KRepositoryMgr *self );
+
+
+/* UserRepositories
+ *  retrieve all user repositories in a Vector
+ */
+KFG_EXTERN rc_t CC KRepositoryMgrUserRepositories ( const KRepositoryMgr *self,
+    KRepositoryVector *user_repositories );
+
+
+/* SiteRepositories
+ *  retrieve all site repositories in a Vector
+ */
+KFG_EXTERN rc_t CC KRepositoryMgrSiteRepositories ( const KRepositoryMgr *self,
+    KRepositoryVector *site_repositories );
+
+
+/* RemoteRepositories
+ *  retrieve all remote repositories in a Vector
+ */
+KFG_EXTERN rc_t CC KRepositoryMgrRemoteRepositories ( const KRepositoryMgr *self,
+    KRepositoryVector *remote_repositories );
+
+/* CurrentProtectedRepository
+ *  returns the currently active user protected repository
+ */
+KFG_EXTERN rc_t CC KRepositoryMgrCurrentProtectedRepository ( const KRepositoryMgr *self,
+    const KRepository **p_protected );
+
+/* GetProtectedRepository
+ *  retrieves a (read-only) user protected repository by its associated project-id
+ */
+KFG_EXTERN rc_t CC KRepositoryMgrGetProtectedRepository ( const KRepositoryMgr *self, 
+    uint32_t projectId, 
+    const KRepository **p_protected );
+
+
+/* Getter/Setter for the global disabled-node on the main-category
+ */
+KFG_EXTERN bool CC KRepositoryMgrCategoryDisabled ( const KRepositoryMgr *self, KRepCategory category );
+KFG_EXTERN rc_t CC KRepositoryMgrCategorySetDisabled ( const KRepositoryMgr *self, KRepCategory category, bool disabled );
+
+
+/* ImportNgc
+ *  import ngc file into current configuration
+ *
+ * self [ IN ] - KConfig object
+ * path [ IN ] - path to the ngc file
+ * pathToProtectedRepository [ IN, NULL OKAY ] - optional - the
+ *  special value NULL is interpreted as ${HOME}/ncbi/dbGaP-$(Project #)
+ * newRepoParentPath [ OUT, NULL OKAY ] - optional - 
+ *  path to the new protected repository: should not be released!
+ */
+KFG_EXTERN rc_t CC KConfigImportNgc( struct KConfig * self,
+    const char *ngcPath, const char *pathToProtectedRepository,
+    const char **newRepoParentPath);
+
+
+enum
+{
+    /* on input, these bits represent authority to perform operation.
+       on success, they represent operations performed.
+       on failure, they represent reason for failure. */
+
+    INP_CREATE_REPOSITORY  = ( 1 << 0 ),   /* permission to create a new entry         */
+    INP_UPDATE_DNLD_TICKET = ( 1 << 1 ),   /* permission to modifify a download ticket */
+    INP_UPDATE_ENC_KEY     = ( 1 << 2 ),   /* permission to modify an encryption key   */
+    INP_UPDATE_DESC        = ( 1 << 3 ),   /* permission to modify a description       */
+    INP_UPDATE_ROOT        = ( 1 << 4 ),   /* permission to modify root path */
+
+    INP_UPDATE_APPS        = ( 1 << 5 ),   /* modify apps :
+         is used as return value only:
+         permission is not required - apps update it will be always performed */
+};
+
+/* ImportNgcObj
+ *   import of a KNgcObj
+ *
+ *  the KNgcObj has to be created with KNgcObjMakeFromFile() kfg/ngc.h
+ *  the permission-flags define what the functions is allowd to do
+ *  result flags show what was done according to the permissions
+ */
+KFG_EXTERN rc_t CC KRepositoryMgrImportNgcObj( KRepositoryMgr *self,
+    const struct KNgcObj * ngc, const char * location, uint32_t permissions, uint32_t * result_flags );
+
+
+/* HasRemoteAccess
+ *  whether remote access is available (has an enabled remote repository)
+ */
+KFG_EXTERN bool CC KRepositoryMgrHasRemoteAccess ( const KRepositoryMgr *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfg_repository_ */
diff --git a/interfaces/kfs/arc.h b/interfaces/kfs/arc.h
new file mode 100644
index 0000000..6071258
--- /dev/null
+++ b/interfaces/kfs/arc.h
@@ -0,0 +1,143 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_arc_
+#define _h_kfs_arc_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <kfs/toc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KDirectory;
+struct KFile;
+struct KToc;
+struct vector;
+
+/* validate_header_offsets
+ *	This function is a special friend function to the archive package used
+ *	to validate that the compiler used to build the package matches 
+ *	used structure offsets "correctly" to enable the parsing of TAR files.
+ * NOTE:
+ *	This function should not be used except by ktartest (klib/tools/ktartest.c).
+ *	It is built only in a special logging version of the libraries.
+ */
+KFS_EXTERN bool CC validate_header_offsets(void);
+
+typedef struct KArcDir KArcDir;
+typedef struct KArcFile KArcFile;
+
+typedef uint32_t KArcFSType;
+enum eKArcFSType
+{
+    tocUnknown,
+    tocKFile,
+    tocKDirectory,
+    tocKVirtual
+};
+
+
+/* OpenArcDirRead
+ *
+ * This should probably move into the toc-priv with a specific call to open each archive type
+ * with the parse private and not needing the dad-gummed CC and KFS_EXTERN
+ *  Open an archive file as a KDirectory derived type: made to match 
+ *  KDirectoryOpenDirRead() where parse could be the first element of arg
+ *
+ * [IN]  dir    A KDirectory (of any derived type) to reach the archive file
+ * [OUT] pdir   The KDirectory (of type KArcDir) that will be created
+ * [IN]  chroot if non-zero, the new directory becomes chroot'd and interprets paths
+ *      stating with '/'
+ * [IN]  path   The path to the archive - this will become the directory path
+ * [IN]  parse  A pointer to the function needed to build a TOC by parsing the file
+ *
+ * parameters to parse
+ * REQUIRED:    KToc *
+ * REQUIRED:    void *  KFile* | KDirectory* | ???
+ * OPTIONAL:    bool (*)(const char*)           Filter: include or skip this path
+ * OPTIONAL:    rc_t (*)(???)               Sort: reorder name list
+ */
+KFS_EXTERN rc_t CC KDirectoryOpenArcDirRead(const struct KDirectory * self, 
+    const struct KDirectory ** pdir, bool chroot, const char * path, KArcFSType baseType,
+    rc_t ( CC * parse )(struct KToc *,const void *,
+        bool( CC * )(const struct KDirectory*, const char *, void*), void*),
+        bool (CC* filter )(const KDirectory*, const char *, void *), void * filterparam);
+
+KFS_EXTERN rc_t CC KDirectoryOpenArcDirRead_silent(const struct KDirectory * self, 
+    const struct KDirectory ** pdir, bool chroot, const char * path, KArcFSType baseType,
+    rc_t ( CC * parse )(struct KToc *,const void *,
+        bool( CC * )(const struct KDirectory*, const char *, void*), void*),
+        bool (CC* filter )(const KDirectory*, const char *, void *), void * filterparam);
+
+KFS_EXTERN rc_t CC KDirectoryOpenArcDirRead_silent_preopened(const struct KDirectory * self, 
+    const struct KDirectory ** pdir, bool chroot, const char * path, KArcFSType baseType,
+    void * f,
+    rc_t ( CC * parse )(struct KToc *,const void *,
+        bool( CC * )(const struct KDirectory*, const char *, void*), void*),
+        bool (CC* filter )(const KDirectory*, const char *, void *), void * filterparam);
+
+
+KFS_EXTERN bool CC KDirectoryIsKArcDir ( const KDirectory * self );
+KFS_EXTERN bool CC KArcDirIsFromRemote ( const KArcDir * self );
+
+
+#if 0
+/* ----------------------------------------------------------------------
+ * KDirectoryToKArcDir
+ *
+ * [IN]  const KDirectory * 	self	Object oriented C
+ * [OUT] const KArcDir * 	cast	Object oriented C
+ *
+ *
+ * Get a reference to a KArcDir from a KDirectory as a cast.  It is a new reference.
+ */
+
+KFS_EXTERN rc_t CC KDirectoryToKArcDir (const KDirectory * self, const KArcDir ** cast);
+
+KFS_EXTERN rc_t CC KArcDirList ( const KArcDir *self, struct KNamelist **list,
+    bool ( CC * f ) ( const KArcDir *dir, const char *name, void *data ),
+    void *data, const char *path, ... );
+KFS_EXTERN rc_t CC KArcDirVList ( const KArcDir *self, struct KNamelist **list,
+    bool ( CC * f ) ( const KArcDir *dir, const char *name, void *data ),
+    void *data, const char *path, va_list args );
+#endif
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_arc_ */
diff --git a/interfaces/kfs/arrayfile.h b/interfaces/kfs/arrayfile.h
new file mode 100644
index 0000000..079c92c
--- /dev/null
+++ b/interfaces/kfs/arrayfile.h
@@ -0,0 +1,180 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_arrayfile_
+#define _h_kfs_arrayfile_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_namelist_
+#include <klib/namelist.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+
+/*--------------------------------------------------------------------------
+ * KArrayFile
+ *  an array-file is created from a KFile
+ */
+typedef struct KArrayFile KArrayFile;
+
+
+/* Make
+ *  make an array file from a KFile
+ */
+/*
+KFS_EXTERN rc_t CC KArrayFileMakeRead ( const KArrayFile **af, struct KFile const *file );
+KFS_EXTERN rc_t CC KArrayFileMakeUpdate ( KArrayFile **af, struct KFile *file );
+*/
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KFS_EXTERN rc_t CC KArrayFileAddRef ( const KArrayFile *self );
+KFS_EXTERN rc_t CC KArrayFileRelease ( const KArrayFile *self );
+
+
+/* Dimensionality
+ *  returns the number of dimensions in the ArrayFile
+ *
+ *  "dim" [ OUT ] - return parameter for number of dimensions
+ */
+KFS_EXTERN rc_t CC KArrayFileDimensionality ( const KArrayFile *self, uint8_t *dim );
+
+
+/* SetDimensionality
+ *  sets the number of dimensions in the ArrayFile
+ *
+ *  "dim" [ IN ] - new number of dimensions; must be > 0
+ */
+KFS_EXTERN rc_t CC KArrayFileSetDimensionality ( KArrayFile *self, uint8_t dim );
+
+
+/* DimExtents
+ *  returns the extent of every dimension
+ *
+ *  "dim" [ IN ] - the dimensionality of "extents"
+ *
+ *  "extents" [ OUT ] - returns the extent for every dimension
+ */
+KFS_EXTERN rc_t CC KArrayFileDimExtents ( const KArrayFile *self, uint8_t dim, uint64_t *extents );
+
+
+/* SetDimExtents
+ *  sets the new extents for every dimension
+ *
+ *  "dim" [ IN ] - the dimensionality of "extents"
+ *
+ *  "extents" [ IN ] - new extents for every dimension
+ */
+KFS_EXTERN rc_t CC KArrayFileSetDimExtents ( KArrayFile *self, uint8_t dim, uint64_t *extents );
+
+
+/* ElementSize
+ *  returns the element size in bits
+ *
+ *  "elem_bits" [ OUT ] - size of each element in bits
+ */
+KFS_EXTERN rc_t CC KArrayFileElementSize ( const KArrayFile *self, uint64_t *elem_bits );
+
+
+/* Read
+ *  read from n-dimensional position
+ *
+ *  "dim" [ IN ] - the dimensionality of all vectors
+ *
+ *  "pos"  [ IN ] - n-dimensional starting position in elements
+ *
+ *  "buffer" [ OUT ] and "elem_count" [ IN ] - return buffer for read
+ *  where "elem_count" is n-dimensional in elements
+ *
+ *  "num_read" [ OUT ] - n-dimensional return parameter giving back
+ *      the number of read elements in every dimension
+ */
+KFS_EXTERN rc_t CC KArrayFileRead ( const KArrayFile *self, uint8_t dim,
+    const uint64_t *pos, void *buffer, const uint64_t *elem_count,
+    uint64_t *num_read );
+
+
+/* Read_v
+ *  read one element of variable length from n-dimensional position
+ *
+ *  "dim" [ IN ] - the dimensionality of all vectors
+ *
+ *  "pos"  [ IN ] - n-dimensional starting position in elements
+ *
+ *  "buffer" [ OUT ] and "elem_count" [ IN ] - return buffer for read
+ *  where "elem_count" is length of buffer in elements
+ *
+ *  "num_read" [ OUT ] - return parameter giving back
+ *      the number of read elements in every dimension
+ */
+KFS_EXTERN rc_t CC KArrayFileRead_v ( const KArrayFile *self, uint8_t dim,
+    const uint64_t *pos, void *buffer, const uint64_t elem_count,
+    uint64_t *num_read );
+
+
+/* Write
+ *  write into n-dimensional position
+ *
+ *  "dim" [ IN ] - the dimensionality of all vectors
+ *
+ *  "pos"  [ IN ] - n-dimensional offset where to write to
+ *                   in elements
+ *
+ *  "buffer" [ IN ] and "elem_count" [ IN ] - data to be written
+ *  where "elem_count" is n-dimensional in elements
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of elements actually written per dimension
+ */
+KFS_EXTERN rc_t CC KArrayFileWrite ( KArrayFile *self, uint8_t dim,
+    const uint64_t *pos, const void *buffer, const uint64_t *elem_count,
+    uint64_t *num_writ );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_arrayfile_ */
diff --git a/interfaces/kfs/buffile.h b/interfaces/kfs/buffile.h
new file mode 100644
index 0000000..f32837b
--- /dev/null
+++ b/interfaces/kfs/buffile.h
@@ -0,0 +1,94 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_buffile_
+#define _h_kfs_buffile_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+
+/*--------------------------------------------------------------------------
+ * KFile
+ */
+
+/* MakeBufferedRead
+ *  make a read-only file buffer
+ *
+ *  "buf" [ OUT ] - return parameter for new buffered file
+ *
+ *  "original" [ IN ] - source file to be buffered. must have read access
+ *
+ *  "bsize" [ IN ] - buffer size
+ */
+KFS_EXTERN rc_t CC KBufFileMakeRead ( struct KFile const ** buf,
+    struct KFile const * original, size_t bsize );
+
+
+/* MakeBufferedWrite
+ *  make a writable file buffer
+ *
+ *  "buf" [ OUT ] - return parameter for new buffered file
+ *
+ *  "original" [ IN ] - source file to be buffered. must have read access
+ *
+ *  "update" [ IN ] - if true, make a read/write buffer
+ *
+ *  "bsize" [ IN ] - buffer size
+ */
+KFS_EXTERN rc_t CC KBufFileMakeWrite ( struct KFile ** buf,
+    struct KFile * original, bool update, size_t bsize );
+
+
+
+
+KFS_EXTERN rc_t CC KBufReadFileMakeRead ( const struct KFile ** bp,
+     const struct KFile * original, size_t bsize );
+
+KFS_EXTERN rc_t CC KBufWriteFileMakeWrite ( struct KFile ** bp,
+     struct KFile * original, size_t bsize );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_buffile_ */
diff --git a/interfaces/kfs/bzip.h b/interfaces/kfs/bzip.h
new file mode 100644
index 0000000..f91db85
--- /dev/null
+++ b/interfaces/kfs/bzip.h
@@ -0,0 +1,77 @@
+/*=======================================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_bzip_
+#define _h_kfs_bzip_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+/* MakeBzip2ForRead
+ *  creates an adapter to bunzip2 a source file
+ *
+ *  "bz" [ OUT ] - return parameter for decompressed file
+ *
+ *  "src" [ IN ] - compressed source file with read permission
+ *
+ * NB - creates a read-only file that does NOT support random access
+ *  i.e. must be consumed serially starting from offset 0
+ */
+KFS_EXTERN rc_t CC KFileMakeBzip2ForRead ( struct KFile const **bz, struct KFile const *src );
+
+
+/* MakeBzip2ForWrite
+ *  creates an adapter to gzip a source file
+ *
+ *  "bz" [ OUT ] - return parameter for compressed file
+ *
+ *  "src" [ IN ] - uncompressed source file with write permission
+ *
+ * NB - creates a write-only file that does NOT suppport random access
+ *  i.e. must be written serially from offset 0
+ */
+KFS_EXTERN rc_t CC KFileMakeBzip2ForWrite ( struct KFile **bz, struct KFile *src );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_bzip_ */
diff --git a/interfaces/kfs/cacheteefile.h b/interfaces/kfs/cacheteefile.h
new file mode 100644
index 0000000..6e2d04b
--- /dev/null
+++ b/interfaces/kfs/cacheteefile.h
@@ -0,0 +1,162 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_cacheteefile_
+#define _h_kfs_cacheteefile_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ */
+
+/* MakeCacheTee
+ *  takes a KFile as source
+ *
+ *  "tee" [ OUT ] - return parameter for tee file
+ *
+ *  "remote" [ IN ] - the source file, generally costly to read which is
+ *  the motivation behind caching its output
+ *
+ *  "logger" [ IN, NULL OKAY ] - optional debugging output for observing
+ *  access patterns of "remote"
+ *
+ *  "blocksize" [ IN ] - the cache-file page size
+ *                       ( if 0 ... default-value will be 32k )
+ *
+ *  "cluster" [ IN ] - a blocking factor for accessing "remote"
+ *  reads are in blocks of size "blocksize" * "cluster"
+ *  ( 1...4 makes most sense )
+ *
+ *  "report" [ IN ] - when true, provides more verbose debugging output
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting full cache file, i.e. the name of the file
+ *  as it would appear after promoting from partial to full status.
+ *
+ * the function creates a new ( cached ) KFile in **tee
+ *
+ * the caller can access this file to read and query the filesize, these are the only
+ * supported messages to this object
+ *
+ * when the caller requests data that is not already cached in the local file,
+ * the cached file will read from the remote-file, write into the local-file and then
+ * return the requested data in the read-buffer
+ *
+ * when the caller requests data that is already cached, the data will be read from
+ * the local file only, no remote request will be made
+ *
+ * when the caller requests data this is partially cached, the file will return the
+ * part that comes first either from the remote or from the local file
+ * in this case the file will return less data than requested
+ *
+ * when the caller opens an existing local file that contains a full copy of the
+ * remote file, the local KFile will be returned in self
+ *
+ * this function will check if the remote-file and the local file ( if it already exists )
+ * do have the same size and blocksize
+ *
+ */
+KFS_EXTERN rc_t CC KDirectoryMakeCacheTee ( struct KDirectory *self,
+    struct KFile const **tee, struct KFile const *remote,
+    uint32_t blocksize, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVMakeCacheTee ( struct KDirectory *self,
+    struct KFile const **tee, struct KFile const *remote,
+    uint32_t blocksize, const char *path, va_list args );
+
+/* -----
+ * checks if a given file ( has to be a local file )
+ *
+ * a ... is a backing cache-file for the CacheTee-file
+ * b ... all blocks have been filled with the remote content
+ *
+ * it returns the result of the check in *is_complete
+ */
+KFS_EXTERN rc_t CC IsCacheFileComplete( const struct KFile * self, bool * is_complete );
+
+
+/* -----
+ * truncates a cache-file for a CacheTee-filec by removing the bitmap/content-lenght/block-size
+ *
+ * it returns the result of the check in *is_complete
+ */
+KFS_EXTERN rc_t CC TruncateCacheFile( struct KFile * self );
+
+
+/* -----
+ * examens the file, and reports what percentage of blocks are in the cache...
+ *
+ */
+KFS_EXTERN rc_t CC GetCacheCompleteness( const struct KFile * self, float * percent, uint64_t * bytes_in_cache );
+
+
+/* -----
+ * examens the file, and reports the size of the original file ( without the cachefile-footer )
+ *
+ */
+KFS_EXTERN rc_t CC GetCacheTruncatedSize( const struct KFile * self, uint64_t * truncated_size );
+
+/* -----
+ * examens the file, and reports how many blocks have data in them, and how many of these are zero'd out
+ *
+ */
+KFS_EXTERN rc_t CC Has_Cache_Zero_Blocks( const struct KFile * self, uint64_t * checked_blocks, uint64_t * empty_blocks );
+
+
+/* -----
+ * checks if the given file is completely cached, self has to be a open cacheteefile
+ *
+ */
+
+KFS_EXTERN rc_t CC IsCacheTeeComplete( const struct KFile * self, bool * complete );
+
+KFS_EXTERN bool CC KFileIsKCacheTeeFile( const struct KFile * self );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_teefile_ */
diff --git a/interfaces/kfs/countfile.h b/interfaces/kfs/countfile.h
new file mode 100644
index 0000000..4b1c720
--- /dev/null
+++ b/interfaces/kfs/countfile.h
@@ -0,0 +1,73 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_counterfile_
+#define _h_kfs_counterfile_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFile;
+
+typedef struct KCounterFile KCounterFile;
+
+/* -----
+ * Copy can be a serialized type KFile for a KCounterFile opened for Read but
+ * not when opened for write.
+ *
+ * Specifically this means copy can be a KMD5File for read but not for write
+ * other KFile subtypes might have the same restriction.
+ *
+ * A seekless update KCounterfile can be created but does not now exist.
+ *
+ * bytecounter points to where to write a total byte count for the file.
+ *
+ * linecounter points to where to write a count of the lines of a file.
+ *     if NULL this functionality is disabled.
+ *
+ * force_reads causes a read to the end of file on close rather than relying on pass along KFileSize
+ */
+KFS_EXTERN rc_t CC KFileMakeCounterRead (const struct KFile ** self, const KFile * original,
+                                         uint64_t * bytecounter, uint64_t * linecounter, bool force_reads);
+KFS_EXTERN rc_t CC KFileMakeCounterWrite (struct KFile ** self, struct KFile * original,
+                                          uint64_t * bytecounter, uint64_t * linecounter, bool force_reads);
+KFS_EXTERN rc_t CC KFileMakeCounterUpdate (struct KFile ** self, struct KFile * original,
+                                           uint64_t * bytecounter, uint64_t * linecounter, bool force_reads);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_counterfile_ */
diff --git a/interfaces/kfs/crc.h b/interfaces/kfs/crc.h
new file mode 100644
index 0000000..c3e56dd
--- /dev/null
+++ b/interfaces/kfs/crc.h
@@ -0,0 +1,292 @@
+/*=======================================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_crc_
+#define _h_kfs_crc_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+
+/*--------------------------------------------------------------------------
+ * KCRC32SumFmt
+ *  a formatter for reading or writing an crc32sum-style checksum file
+ */
+typedef struct KCRC32SumFmt KCRC32SumFmt;
+
+
+/* AddRef
+ * Release
+ */
+KFS_EXTERN rc_t CC KCRC32SumFmtAddRef ( const KCRC32SumFmt *self );
+KFS_EXTERN rc_t CC KCRC32SumFmtRelease ( const KCRC32SumFmt *self );
+
+
+/* Make
+ *  creates a formatted accessor to textual checksum file
+ *  takes over ownership of "in"/"out" file reference
+ *
+ *  "in" [ IN ] - readable checksum input file
+ *  -OR-
+ *  "out" [ IN ] - writable checksum file. if readable as well,
+ *  its contents will be preserved.
+ */
+KFS_EXTERN rc_t CC KCRC32SumFmtMakeRead ( const KCRC32SumFmt **f, struct KFile const *in );
+KFS_EXTERN rc_t CC KCRC32SumFmtMakeUpdate ( KCRC32SumFmt **f, struct KFile *out );
+
+
+/* Count
+ *  return the number of checksums in file
+ */
+KFS_EXTERN rc_t CC KCRC32SumFmtCount ( const KCRC32SumFmt *self, uint32_t *count );
+
+
+/* Get
+ *  retrieve an indexed checksum line
+ *
+ *  "idx" [ IN ] - zero-based index of checksum to access
+ *
+ *  "path" [ OUT ] and "size" [ IN ] - return buffer for file path
+ *
+ *  "crc32" [ OUT ] - return parameter for the checksum
+ *
+ *  "bin" [ OUT, NULL OKAY ] - true if fopen mode used to
+ *  calculate "digest" was binary, false if text. pertinent if
+ *  digest was calculated using DOS text mode.
+ */
+KFS_EXTERN rc_t CC KCRC32SumFmtGet ( const KCRC32SumFmt *self, uint32_t idx,
+    char *path, size_t size, uint32_t *crc32, bool *bin );
+
+
+/* Find
+ *  retrieve checksum line by path
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  "crc32" [ OUT ] - return parameter for the checksum
+ *
+ *  "bin" [ OUT, NULL OKAY ] - true if fopen mode used to
+ *  calculate "digest" was binary, false if text. pertinent if
+ *  digest was calculated using DOS text mode.
+ */
+KFS_EXTERN rc_t CC KCRC32SumFmtFind ( const KCRC32SumFmt *self,
+    const char *path, uint32_t *crc32, bool *bin );
+
+
+/* Delete
+ *  remove an existing line
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  returns rcNotFound if not present
+ */
+KFS_EXTERN rc_t CC KCRC32SumFmtDelete ( KCRC32SumFmt *self, const char *path );
+
+
+/* Update
+ *  add a checksum line to file or update an existing line
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  "crc32" [ IN ] - calculated checksum
+ *
+ *  "bin" [ IN ] - true if checksum was calculated on all bytes
+ *  in file, false if fopen mode used to read file was text.
+ *
+ * NB - the crc32sum tool was designed to behave like md5sum.
+ *  the md5sum tool operates with the assumption that files
+ *  are opened using "fopen". it records the mode used by prepending
+ *  '*' to indicate binary and ' ' to indicate text mode within the
+ *  checksum line.
+ *
+ *  unfortunately, this creates a situation where text-mode files
+ *  checksummed on DOS cannot be properly checked on any other
+ *  platform without the aid of some filter to drop out '\r' from
+ *  a '\r\n' sequence.
+ *
+ *  fortunately, most users are unaware of the binary/text mode
+ *  switches available with md5sum and use the default mode, which
+ *  is binary on DOS and text on Unix, which happens to be equivalent
+ *  to binary ( making one wonder why binary is not instead the
+ *  universal default ).
+ *
+ *  the end result is that we need to indicate whether CR stripping
+ *  was performed while at the same time behaving like md5sum.
+ */
+KFS_EXTERN rc_t CC KCRC32SumFmtUpdate ( KCRC32SumFmt *self, const char *path,
+    uint32_t crc32, bool bin );
+
+/* Rename
+ * Rename the checksum line to reflect a file name change but no content change.
+ *
+ *  "newpath" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file's new name
+ *
+ *  "oldpath" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file's old name
+ *
+ * Parameter order matches KDirectoryRename()
+ */
+KFS_EXTERN rc_t CC KCRC32SumFmtRename ( KCRC32SumFmt *self, const char *oldpath, const char *newpath );
+
+
+/* Flush
+ *  write data to disk, but stay open
+ */
+KFS_EXTERN rc_t CC KCRC32SumFmtFlush ( KCRC32SumFmt *self );
+
+
+/*--------------------------------------------------------------------------
+ * CRC32 KFile extensions
+ */
+
+/* MakeCRC32Read
+ *  creates an adapter to check CRC32 checksum for a source file
+ *
+ *  "f" [ OUT ] - return parameter for file with crc check
+ *
+ *  "src" [ IN ] - source file with read permission
+ *
+ *  "crc32" [ IN ] - checksum to match
+ *
+ * NB - creates a read-only file that does NOT support random access
+ *  i.e. must be consumed serially starting from offset 0
+ */
+KFS_EXTERN rc_t CC KFileMakeCRC32Read ( struct KFile const **f,
+    struct KFile const *src, uint32_t crc32 );
+
+
+
+
+/*--------------------------------------------------------------------------
+ * KCRC32File
+ *  subclass of KFile
+ */
+typedef struct KCRC32File KCRC32File;
+
+
+/* MakeWrite
+ * MakeAppend
+ *  creates an adapter to calculate CRC checksum for a file
+ *
+ *  "f" [ OUT ] - return parameter for file with crc check
+ *
+ *  "out" [ IN ] - output file with write permission
+ *  since this file is being wrapped by "f", ownership of
+ *  the provided reference is transferred to "f"
+ *
+ *  "fmt" [ IN ] - checksum output formatter.
+ *  since this may be used for multiple checksums, "f" will
+ *  attach its own reference to "fmt".
+ *
+ *  "path" [ IN ] - checksum output file path, used to
+ *  create standard md5sum file entry.
+ *
+ * NB - creates a write-only file that does NOT suppport random access
+ *  i.e. must be written serially from offset 0
+ */
+KFS_EXTERN rc_t CC KCRC32FileMakeWrite ( KCRC32File **f,
+    struct KFile *out, KCRC32SumFmt *fmt, const char *path );
+KFS_EXTERN rc_t CC KCRC32FileMakeAppend ( KCRC32File **f,
+    struct KFile *out, KCRC32SumFmt *fmt, const char *path );
+
+/* MakeReadNew
+ *  creates an adapter to calculate CRC checksum for a file
+ *
+ *  "f" [ OUT ] - return parameter for file with crc check
+ *
+ *  "in" [ IN ] - input file 
+ *  since this file is being wrapped by "f", ownership of
+ *  the provided reference is transferred to "f"
+ *
+ *  "fmt" [ IN ] - checksum output formatter.
+ *  since this may be used for multiple checksums, "f" will
+ *  attach its own reference to "fmt".
+ *
+ *  "path" [ IN ] - checksum output file path, used to
+ *  create standard md5sum file entry.
+ *
+ * NB - creates a write-only file that does NOT suppport random access
+ *  i.e. must be written serially from offset 0
+ */
+KFS_EXTERN rc_t CC KFileMakeNewCRC32Read ( const struct KFile **fp,
+    const struct KFile *in, KCRC32SumFmt *fmt, const char *path );
+
+
+/* ToKFile
+ *  a CRC32 file is a subclass of KFile
+ *  this is an explicit cast operator
+ */
+KFS_EXTERN struct KFile* CC KCRC32FileToKFile ( KCRC32File *self );
+KFS_EXTERN struct KFile const* CC KCRC32FileToKFileConst ( const KCRC32File *self );
+
+/* BeginTransaction
+ *  preserve current CRC state and file marker
+ *  in preparation for rollback
+ */
+KFS_EXTERN rc_t CC KCRC32FileBeginTransaction ( KCRC32File *self );
+
+
+/* Commit
+ *  accept current CRC state as correct
+ */
+KFS_EXTERN rc_t CC KCRC32FileCommit ( KCRC32File *self );
+
+
+/* Revert
+ *  reset state to previous transaction boundary conditions
+ */
+KFS_EXTERN rc_t CC KCRC32FileRevert ( KCRC32File *self );
+
+/* Reset
+ *  reset state to that of an empty file
+ *  aborts any open transaction
+ */
+KFS_EXTERN rc_t CC KCRC32FileReset ( KCRC32File *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_crc_ */
diff --git a/interfaces/kfs/defs.h b/interfaces/kfs/defs.h
new file mode 100644
index 0000000..9437f58
--- /dev/null
+++ b/interfaces/kfs/defs.h
@@ -0,0 +1,121 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_defs_
+#define _h_kfs_defs_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KPathType
+ */
+typedef uint32_t KPathType;
+enum
+{
+    /* add in below zero so as not to change behavior of existing */
+    /* added for KDB that extended this enumeration */ 
+    /* if added it will clash with the kptAlias bit */
+    /* without care be taken */
+    kptFirstDefined = 0,
+
+    /* some paths are bad or non-existent */
+    kptNotFound = kptFirstDefined,
+    kptBadPath,
+
+    /* existing paths describe a directory entry */
+    kptFile,
+    kptDir,
+    kptCharDev,
+    kptBlockDev,
+    kptFIFO,
+
+    /* special types that aren't quite right or normal */
+
+    /* A zombie file is a file in the directory that can not be opened
+     * or read because it is for some reason not really present
+     * zombie as in not live and not dead */
+    kptZombieFile,
+
+    /* special cases for Windows file systems */
+    kptFakeRoot,
+
+    /* special cases for visiting a HDF5-file: */
+
+    /* a dataset is a container for data like a file, but typed */
+    kptDataset,
+    /* a datatype is a object inside a HDF5-group (directory) */
+    kptDatatype,
+
+    /* the type enum may be extended by virtual directories */
+    kptLastDefined,
+
+    /* aliases to the above types have the alias bit set */
+    kptAlias = 128
+};
+
+
+/*--------------------------------------------------------------------------
+ * KCreateMode
+ *  when creating a file or directory, the normal intent is to open it,
+ *  creating it first if necessary, and then go on. alternatively, the
+ *  intention may be to always return a newly initialized object, while
+ *  the last may be to only proceed if actually created, i.e. if the
+ *  object does not already exist in some form.
+ */
+enum
+{
+    /* mode values 0..7 */
+    kcmOpen,
+    kcmInit,
+    kcmCreate,
+    kcmSharedAppend,        /* special mode which works only on
+                             * needed for proper logging
+                             */
+    kcmValueMask = 15,
+
+    /* modifier bits 3..7 */
+    kcmMD5     = ( 1 << 6 ),
+    kcmParents = ( 1 << 7 ),
+    kcmBitMask = ( 1 << 8 ) - kcmValueMask - 1
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_defs_ */
diff --git a/interfaces/kfs/directory.h b/interfaces/kfs/directory.h
new file mode 100644
index 0000000..ba69175
--- /dev/null
+++ b/interfaces/kfs/directory.h
@@ -0,0 +1,591 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_directory_
+#define _h_kfs_directory_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_kfs_defs_
+#include <kfs/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KPath;
+struct KFile;
+struct KNamelist;
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ *  a container node within file system
+ */
+typedef struct KDirectory_v1 KDirectory_v1;
+typedef struct KDirectory_v2 KDirectory_v2;
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KFS_EXTERN rc_t CC KDirectoryAddRef_v1 ( const KDirectory_v1 *self );
+KFS_EXTERN rc_t CC KDirectoryRelease_v1 ( const KDirectory_v1 *self );
+
+KFS_EXTERN KDirectory_v2 * CC KDirectoryDuplicate_v2 ( const KDirectory_v2 *self, ctx_t ctx );
+KFS_EXTERN void CC KDirectoryRelease_v2 ( const KDirectory_v2 *self, ctx_t ctx );
+
+/* List
+ *  create a directory listing
+ *
+ *  "list" [ OUT ] - return parameter for list object
+ *
+ *  "f" [ IN, NULL OKAY ] and "data" [ IN, OPAQUE ] - optional
+ *  filter function to execute on each path. receives a base directory
+ *  and relative path for each entry. if "f" returns true, the name will
+ *  be added to the list.
+ *
+ *  "path" [ IN, NULL OKAY ] - optional parameter for target
+ *  directory. if NULL or empty, interpreted to mean "."
+ *
+ *  function makes a flat list, does not step into sub-dirs!
+ *
+ */
+KFS_EXTERN rc_t CC KDirectoryList_v1 ( const KDirectory_v1 *self, struct KNamelist **list,
+    bool ( CC * f ) ( const KDirectory_v1 *dir, const char *name, void *data ),
+    void *data, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVList ( const KDirectory_v1 *self, struct KNamelist **list,
+    bool ( CC * f ) ( const KDirectory_v1 *dir, const char *name, void *data ),
+    void *data, const char *path, va_list args );
+
+/* Visit
+ *  visit each path under designated directory,
+ *  recursively if so indicated
+ *
+ *  "recur" [ IN ] - if true, recursively visit sub-directories
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to execute
+ *  on each path. receives a base directory and relative path
+ *  for each entry. if "f" returns true, the iteration will
+ *  terminate and that value will be returned. NB - "dir" will not
+ *  be the same as "self".
+ *
+ *  "path" [ IN, NULL OKAY ] - optional NUL terminated string
+ *   in directory-native character set. if NULL or empty, interpreted to mean "."
+ *
+ * VisitFull hits all files types that including those are normally hidden
+ */
+KFS_EXTERN rc_t CC KDirectoryVisit_v1 ( const KDirectory_v1 *self, bool recur,
+    rc_t ( CC * f ) ( const KDirectory_v1 *dir, uint32_t type, const char *name, void *data ),
+    void *data, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVVisit ( const KDirectory_v1 *self, bool recur,
+    rc_t ( CC * f ) ( const KDirectory_v1 *dir, uint32_t type, const char *name, void *data ),
+    void *data, const char *path, va_list args );
+
+KFS_EXTERN void CC KDirectoryVisit_v2 ( const KDirectory_v2 *self, ctx_t ctx, bool recur,
+    bool ( CC * f ) ( const KDirectory_v2 *dir, uint32_t type, const char *name, void *data ),
+    void *data, struct KPath const *path );
+
+/* VisitUpdate
+ *  like Visit except that the directory passed back to "f"
+ *  is available for update operations
+ */
+KFS_EXTERN rc_t CC KDirectoryVisitUpdate_v1 ( KDirectory_v1 *self, bool recur,
+    rc_t ( CC * f ) ( KDirectory_v1 *dir, uint32_t type, const char *name, void *data ),
+    void *data, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVVisitUpdate ( KDirectory_v1 *self, bool recur,
+    rc_t ( CC * f ) ( KDirectory_v1 *dir, uint32_t type, const char *name, void *data ),
+    void *data, const char *path, va_list args );
+
+/* PathType
+ *  returns a KPathType ( defined in kfs/defs.h )
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+KFS_EXTERN uint32_t CC KDirectoryPathType_v1 ( const KDirectory_v1 *self,
+    const char *path, ... );
+KFS_EXTERN uint32_t CC KDirectoryVPathType ( const KDirectory_v1 *self,
+    const char *path, va_list args );
+
+/* ResolvePath
+ *  resolves path to an absolute or directory-relative path
+ *
+ *  "absolute" [ IN ] - if true, always give a path starting
+ *  with '/'. NB - if the directory is chroot'd, the absolute path
+ *  will still be relative to directory root.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *  the resolved path will be directory relative
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target path. NB - need not exist.
+ */
+KFS_EXTERN rc_t CC KDirectoryResolvePath_v1 ( const KDirectory_v1 *self, bool absolute,
+    char *resolved, size_t rsize, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVResolvePath ( const KDirectory_v1 *self, bool absolute,
+    char *resolved, size_t rsize, const char *path, va_list args );
+
+KFS_EXTERN struct KPath * CC KDirectoryResolvePath_v2 ( const KDirectory_v2 *self, ctx_t ctx,
+    bool absolute, struct KPath const *path );
+
+/* ResolveAlias
+ *  resolves an alias path to its immediate target
+ *  NB - the resolved path may be yet another alias
+ *
+ *  "absolute" [ IN ] - if true, always give a path starting
+ *  with '/'. NB - if the directory is chroot'd, the absolute path
+ *  will still be relative to directory root.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *  the resolved path will be directory relative
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting an object presumed to be an alias.
+ */
+KFS_EXTERN rc_t CC KDirectoryResolveAlias_v1 ( const KDirectory_v1 *self, bool absolute,
+    char *resolved, size_t rsize, const char *alias, ... );
+KFS_EXTERN rc_t CC KDirectoryVResolveAlias ( const KDirectory_v1 *self, bool absolute,
+    char *resolved, size_t rsize, const char *alias, va_list args );
+
+/* Rename
+ *  rename an object accessible from directory, replacing
+ *  any existing target object of the same type
+ *
+ *  "from" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ *
+ *  "to" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ *
+ *  "force" [ IN ] - not false means try to do more if it fails internally
+ */
+KFS_EXTERN rc_t CC KDirectoryRename_v1 ( KDirectory_v1 *self, bool force, const char *from, const char *to );
+
+KFS_EXTERN void CC KDirectoryRename_v2 ( KDirectory_v2 *self, ctx_t ctx, 
+    bool force, struct KPath const *from, struct KPath const *to );
+
+/* Remove
+ *  remove an accessible object from its directory
+ *
+ *  "force" [ IN ] - if true and target is a directory,
+ *  remove recursively
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+KFS_EXTERN rc_t CC KDirectoryRemove_v1 ( KDirectory_v1 *self, bool force,
+    const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVRemove ( KDirectory_v1 *self, bool force,
+    const char *path, va_list args );
+
+KFS_EXTERN void CC KDirectoryRemove_v2 ( KDirectory_v2 *self, ctx_t ctx, 
+    bool force, struct KPath const *path );
+
+/* ClearDir
+ *  remove all directory contents
+ *
+ *  "force" [ IN ] - if true and directory entry is a
+ *  sub-directory, remove recursively
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+KFS_EXTERN rc_t CC KDirectoryClearDir_v1 ( KDirectory_v1 *self, bool force,
+    const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVClearDir ( KDirectory_v1 *self, bool force,
+    const char *path, va_list args );
+
+KFS_EXTERN void CC KDirectoryClear_v2 ( KDirectory_v2 *self, ctx_t ctx,
+    bool force, struct KPath const *path );
+
+/* Access
+ *  get access to object
+ *
+ *  "access" [ OUT ] - return parameter for Unix access mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+KFS_EXTERN rc_t CC KDirectoryAccess_v1 ( const KDirectory_v1 *self,
+    uint32_t *access, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVAccess ( const KDirectory_v1 *self,
+    uint32_t *access, const char *path, va_list args );
+
+/* SetAccess
+ *  set access to object a la Unix "chmod"
+ *
+ *  "recur" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ *
+ *  "access" [ IN ] and "mask" [ IN ] - definition of change
+ *  where "access" contains new bit values and "mask defines
+ *  which bits should be changed.
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+KFS_EXTERN rc_t CC KDirectorySetAccess_v1 ( KDirectory_v1 *self, bool recur,
+    uint32_t access, uint32_t mask, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVSetAccess ( KDirectory_v1 *self, bool recur,
+    uint32_t access, uint32_t mask, const char *path, va_list args );
+
+/* Date
+ *  get date/time to object
+ *
+ *  "date" [ OUT ] - return parameter
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+KFS_EXTERN rc_t CC KDirectoryDate_v1 ( const KDirectory_v1 *self,
+    KTime_t *date, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVDate ( const KDirectory_v1 *self,
+    KTime_t *date, const char *path, va_list args );
+
+/* SetDate
+ *  set date to object
+ *
+ *  "recur" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ *
+ *  "date" [ IN ] - new time and date for the object
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+KFS_EXTERN rc_t CC KDirectorySetDate_v1 ( KDirectory_v1 *self, bool recur,
+    KTime_t date, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVSetDate ( KDirectory_v1 *self, bool recur,
+    KTime_t date, const char *path, va_list args );
+
+/* CreateAlias
+ *  creates a path alias according to create mode
+ *  such that "alias" => "targ"
+ *
+ *  "access" [ IN ] - standard Unix directory access mode
+ *  used when "mode" has kcmParents set and alias path does
+ *  not exist.
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation in kfs/defs.h ).
+ *
+ *  "targ" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object, i.e. the object which
+ *  is designated by symlink "alias". THE PATH IS GIVEN RELATIVE
+ *  TO DIRECTORY ( "self" ), NOT SYMLINK ( "alias" )!
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target alias, i.e. the symlink that
+ *  designates a target "targ".
+ */
+KFS_EXTERN rc_t CC KDirectoryCreateAlias_v1 ( KDirectory_v1 *self,
+    uint32_t access, KCreateMode mode,
+    const char *targ, const char *alias );
+
+KFS_EXTERN void CC KDirectoryCreateAlias_v2 ( KDirectory_v2 *self, ctx_t ctx,
+    uint32_t access, KCreateMode mode,
+    struct KPath const *targ, struct KPath const *alias );
+
+/* OpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+KFS_EXTERN rc_t CC KDirectoryOpenFileRead_v1 ( const KDirectory_v1 *self,
+    struct KFile const **f, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVOpenFileRead ( const KDirectory_v1 *self,
+    struct KFile const **f, const char *path, va_list args );
+
+/* OpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+KFS_EXTERN rc_t CC KDirectoryOpenFileWrite_v1 ( KDirectory_v1 *self,
+    struct KFile **f, bool update, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVOpenFileWrite ( KDirectory_v1 *self,
+    struct KFile **f, bool update, const char *path, va_list args );
+
+/* CreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation in kfs/defs.h ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+KFS_EXTERN rc_t CC KDirectoryCreateFile_v1 ( KDirectory_v1 *self, struct KFile **f,
+    bool update, uint32_t access, KCreateMode mode, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVCreateFile ( KDirectory_v1 *self, struct KFile **f,
+    bool update, uint32_t access, KCreateMode mode, const char *path, va_list args );
+
+KFS_EXTERN struct KFile_v2 * CC KDirectoryCreateFile_v2 ( KDirectory_v2 *self, ctx_t ctx,
+    bool update, uint32_t access, KCreateMode mode, struct KPath const *path );
+
+/* FileSize
+ *  returns size in bytes of target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+KFS_EXTERN rc_t CC KDirectoryFileSize_v1 ( const KDirectory_v1 *self,
+    uint64_t *size, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVFileSize ( const KDirectory_v1 *self,
+    uint64_t *size, const char *path, va_list args );
+
+/* FilePhysicalSize
+ *  returns physical allocated size in bytes of target file.  It might
+ * or might not differ from FileSize
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+KFS_EXTERN rc_t CC KDirectoryFilePhysicalSize_v1 ( const KDirectory_v1 *self,
+    uint64_t *size, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVFilePhysicalSize ( const KDirectory_v1 *self,
+    uint64_t *size, const char *path, va_list args );
+
+/* SetFileSize
+ *  sets size in bytes of target file
+ *
+ *  "size" [ IN ] - new file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+KFS_EXTERN rc_t CC KDirectorySetFileSize_v1 ( KDirectory_v1 *self,
+    uint64_t size, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVSetFileSize ( KDirectory_v1 *self,
+    uint64_t size, const char *path, va_list args );
+
+/* FileLocator
+ *  returns a 64-bit key pertinent only to the particular file
+ *  system device holding that file.
+ *
+ *  It can be used as a form of sort key except that it is not 
+ *  guaranteed to be unique.
+ *
+ *  "locator" [ OUT ] - return parameter for file locator
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+KFS_EXTERN rc_t CC KDirectoryFileLocator_v1 ( const KDirectory_v1 *self,
+    uint64_t *locator, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVFileLocator ( const KDirectory_v1 *self,
+    uint64_t *locator, const char *path, va_list args );
+
+/* FileContiguous
+ *  returns true if the file is "contiguous".  Chunked or sparse files are not
+ *  contiguous while most data files are.  Virtual generated files would likely
+ *  not be contiguous.  
+ *
+ *  "contiguous" [ OUT ] - return parameter for file contiguous
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+KFS_EXTERN rc_t CC KDirectoryFileContiguous_v1 ( const KDirectory_v1 *self,
+    bool *contiguous, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVFileContiguous ( const KDirectory_v1 *self,
+    bool *contiguous, const char *path, va_list args );
+
+/* OpenDirRead
+ * OpenDirUpdate
+ *  opens a sub-directory
+ *
+ *  "chroot" [ IN ] - if true, the new directory becomes
+ *  chroot'd and will interpret paths beginning with '/'
+ *  relative to itself.
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+KFS_EXTERN rc_t CC KDirectoryOpenDirRead_v1 ( const KDirectory_v1 *self,
+    const KDirectory_v1 **sub, bool chroot, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVOpenDirRead ( const KDirectory_v1 *self,
+    const KDirectory_v1 **sub, bool chroot, const char *path, va_list args );
+
+KFS_EXTERN rc_t CC KDirectoryOpenDirUpdate_v1 ( KDirectory_v1 *self,
+    KDirectory_v1 **sub, bool chroot, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVOpenDirUpdate ( KDirectory_v1 *self,
+    KDirectory_v1 **sub, bool chroot, const char *path, va_list args );
+
+/* CreateDir
+ *  create a sub-directory
+ *
+ *  "access" [ IN ] - standard Unix directory mode, e.g.0775
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation in defs.h ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+KFS_EXTERN rc_t CC KDirectoryCreateDir_v1 ( KDirectory_v1 *self,
+    uint32_t access, KCreateMode mode, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVCreateDir ( KDirectory_v1 *self,
+    uint32_t access, KCreateMode mode, const char *path, va_list args );
+
+KFS_EXTERN void CC KDirectoryCreateDir_v2 ( KDirectory_v2 *self, ctx_t ctx,
+    uint32_t access, KCreateMode mode, struct KPath const *path );
+
+/* CopyPath
+ *  copies a file
+ *
+ *  "src_path" [ IN ] - path to source-file
+ *
+ *  "dst_path" [ IN ] - file to create
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+KFS_EXTERN rc_t CC KDirectoryCopyPath_v1 ( const KDirectory_v1 *src_dir,
+    KDirectory_v1 *dst_dir, const char *src_path, const char *dst_path );
+
+/* CopyPaths
+ *  copies files, optional recursive in sub-dirs...
+ *
+ *  "recursive" [ IN ] - handle subdir's recursivly
+ *
+ *  "src" [ IN ] - what directory to copy
+ *
+ *  "dst" [ IN ] - into what directory to copy
+ *      ( will be created if it does not already exist )
+ *
+ */
+KFS_EXTERN rc_t CC KDirectoryCopyPaths_v1 ( const KDirectory_v1 * src_dir,
+    KDirectory_v1 *dst_dir, bool recursive, const char *src, const char *dst );
+
+/* Copy
+ *  detects if src is a file or a directory
+ *
+ *  "recursive" [ IN ] - handle subdir's recursivly 
+ *            ( if srs is a directory )
+ *
+ *  "src" [ IN ] - what file/directory to copy
+ *
+ *  "dst" [ IN ] - into what file/directory to copy
+ *      ( will be created if it does not already exist )
+ *
+ */
+KFS_EXTERN rc_t CC KDirectoryCopy_v1 ( const KDirectory_v1 *src_dir,
+    KDirectory_v1 *dst_dir, bool recursive, const char *src, const char *dst );
+
+/* NativeDir
+ *  returns a native file-system directory node reference
+ *  the directory root will be "/" and set to the native
+ *  idea of current working directory
+ *
+ *  NB - the returned reference will be non-const, allowing
+ *  modification operations to be attempted. these operations
+ *  may still fail if the underlying FS disallows them.
+ *
+ *  "dir" [ OUT ] - return parameter for native directory
+ */
+KFS_EXTERN rc_t CC KDirectoryNativeDir_v1 ( KDirectory_v1 **dir );
+
+KFS_EXTERN KDirectory_v2 * CC KDirectoryNativeDir_v2 ( ctx_t ctx );
+
+/*--------------------------------------------------------------------------
+ * default name mappings
+ */
+#ifndef KDirectory
+typedef struct NAME_VERS ( KDirectory, KDIRECTORY_VERS ) KDirectory;
+#endif
+
+#define KDirectoryAddRef NAME_VERS ( KDirectoryAddRef, KDIRECTORY_VERS )
+#define KDirectoryDuplicate NAME_VERS ( KDirectoryDuplicate, KDIRECTORY_VERS )
+#define KDirectoryRelease NAME_VERS ( KDirectoryRelease, KDIRECTORY_VERS )
+#define KDirectoryList NAME_VERS ( KDirectoryList, KDIRECTORY_VERS )
+#define KDirectoryVisit NAME_VERS ( KDirectoryVisit , KDIRECTORY_VERS )
+#define KDirectoryVisitUpdate NAME_VERS ( KDirectoryVisitUpdate , KDIRECTORY_VERS )
+#define KDirectoryPathType NAME_VERS ( KDirectoryPathType , KDIRECTORY_VERS )
+#define KDirectoryResolvePath NAME_VERS ( KDirectoryResolvePath , KDIRECTORY_VERS )
+#define KDirectoryResolveAlias NAME_VERS ( KDirectoryResolveAlias , KDIRECTORY_VERS )
+#define KDirectoryRename NAME_VERS ( KDirectoryRename , KDIRECTORY_VERS ) 
+#define KDirectoryRemove NAME_VERS ( KDirectoryRemove , KDIRECTORY_VERS ) 
+#define KDirectoryClearDir NAME_VERS ( KDirectoryClearDir , KDIRECTORY_VERS )
+#define KDirectoryClear NAME_VERS ( KDirectoryClear , KDIRECTORY_VERS )
+#define KDirectoryAccess NAME_VERS ( KDirectoryAccess , KDIRECTORY_VERS ) 
+#define KDirectorySetAccess NAME_VERS ( KDirectorySetAccess , KDIRECTORY_VERS ) 
+#define KDirectoryDate NAME_VERS ( KDirectoryDate , KDIRECTORY_VERS ) 
+#define KDirectorySetDate NAME_VERS ( KDirectorySetDate , KDIRECTORY_VERS ) 
+#define KDirectoryCreateAlias NAME_VERS ( KDirectoryCreateAlias , KDIRECTORY_VERS )
+#define KDirectoryOpenFileRead NAME_VERS ( KDirectoryOpenFileRead , KDIRECTORY_VERS )
+#define KDirectoryOpenFileWrite NAME_VERS ( KDirectoryOpenFileWrite , KDIRECTORY_VERS ) 
+#define KDirectoryCreateFile NAME_VERS ( KDirectoryCreateFile , KDIRECTORY_VERS )
+#define KDirectoryFileSize NAME_VERS ( KDirectoryFileSize , KDIRECTORY_VERS ) 
+#define KDirectoryFilePhysicalSize NAME_VERS ( KDirectoryFilePhysicalSize , KDIRECTORY_VERS ) 
+#define KDirectorySetFileSize NAME_VERS ( KDirectorySetFileSize , KDIRECTORY_VERS )
+#define KDirectoryFileLocator NAME_VERS ( KDirectoryFileLocator , KDIRECTORY_VERS ) 
+#define KDirectoryFileContiguous NAME_VERS ( KDirectoryFileContiguous , KDIRECTORY_VERS ) 
+#define KDirectoryOpenDirRead NAME_VERS ( KDirectoryOpenDirRead , KDIRECTORY_VERS )
+#define KDirectoryOpenDirUpdate NAME_VERS ( KDirectoryOpenDirUpdate , KDIRECTORY_VERS ) 
+#define KDirectoryCreateDir NAME_VERS ( KDirectoryCreateDir , KDIRECTORY_VERS )
+#define KDirectoryCopyPath NAME_VERS ( KDirectoryCopyPath , KDIRECTORY_VERS )
+#define KDirectoryCopyPaths NAME_VERS ( KDirectoryCopyPaths , KDIRECTORY_VERS )
+#define KDirectoryCopy NAME_VERS ( KDirectoryCopy , KDIRECTORY_VERS )
+#define KDirectoryNativeDir NAME_VERS ( KDirectoryNativeDir , KDIRECTORY_VERS )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_directory_ */
diff --git a/interfaces/kfs/directory.hpp b/interfaces/kfs/directory.hpp
new file mode 100644
index 0000000..3b99a97
--- /dev/null
+++ b/interfaces/kfs/directory.hpp
@@ -0,0 +1,582 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_kfs_directory_
+#define _hpp_kfs_directory_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ *  a container node within file system
+ */
+struct KDirectory {
+    /* AddRef
+     * Release
+     *  ignores NULL references
+     */
+    inline rc_t AddRef ( void ) const throw ()
+    { return KDirectoryAddRef ( this ); }
+    inline rc_t Release ( void ) const throw ()
+    { return KDirectoryRelease ( this ); }
+
+
+    /* List
+     *  create a directory listing
+     *
+     *  "list" [ OUT ] - return parameter for list object
+     *
+     *  "f" [ IN, NULL OKAY ] and "data" [ IN, OPAQUE ] - optional
+     *  filter function to execute on each path. receives a base directory
+     *  and relative path for each entry. if "f" returns true, the name will
+     *  be added to the list.
+     *
+     *  "path" [ IN, NULL OKAY ] - optional parameter for target
+     *  directory. if NULL, interpreted to mean "."
+     */
+    inline rc_t List ( struct KNamelist **list,
+        bool ( CC * f ) ( const KDirectory *dir, const char *name, void *data ),
+        void *data,
+        const char *path, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVList ( this, list, f, data, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t List ( struct KNamelist **list,
+        bool ( CC * f ) ( const KDirectory *dir, const char *name, void *data ),
+        void *data,
+        const char *path, va_list args ) const throw ()
+    { return KDirectoryVList ( this, list, f, data, path, args ); }
+
+
+    /* Visit
+     *  visit each path under designated directory
+     *
+     *  "recurse" [ IN ] - if true, recursively visit sub-directories
+     *
+     *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to execute
+     *  on each path. receives a base directory and relative path
+     *  for each entry. if "f" returns true, the iteration will
+     *  terminate and that value will be returned. NB - "dir" will not
+     *  be the same as "self".
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native character set
+     */
+    inline rc_t Visit ( bool recurse,
+        rc_t ( CC * f ) ( const KDirectory *dir, uint32_t type, const char *name, void *data ),
+        void *data,
+        const char *path, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVVisit ( this, recurse, f, data, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t Visit ( bool recurse,
+        rc_t ( CC * f ) ( const KDirectory *dir, uint32_t type, const char *name, void *data ),
+        void *data,
+        const char *path, va_list args ) const throw ()
+    { return KDirectoryVVisit ( this, recurse, f, data, path, args ); }
+
+
+    /* VisitUpdate
+     *  like Visit except that the directory passed back to "f"
+     *  is available for update operations
+     */
+    inline rc_t VisitUpdate ( bool recurse,
+        rc_t ( CC * f ) ( KDirectory *dir, uint32_t type, const char *name, void *data ),
+        void *data,
+        const char *path, ... ) throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVVisitUpdate ( this, recurse, f, data, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t VisitUpdate ( bool recurse,
+        rc_t ( CC * f ) ( KDirectory *dir, uint32_t type, const char *name, void *data ),
+        void *data,
+        const char *path, va_list args ) throw ()
+    { return KDirectoryVVisitUpdate ( this, recurse, f, data, path, args ); }
+
+
+    /* PathType
+     *  returns a KPathType
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native character set
+     */
+    inline uint32_t PathType ( const char *path, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        uint32_t r = KDirectoryVPathType ( this, path, args );
+        va_end ( args );
+        return r;
+    }
+    inline uint32_t PathType ( const char *path, va_list args ) const throw ()
+    { return KDirectoryVPathType ( this, path, args ); }
+
+
+    /* ResolvePath
+     *  resolves path to an absolute or directory-relative path
+     *
+     *  "absolute" [ IN ] - if true, always give a path starting
+     *  with '/'. NB - if the directory is chroot'd, the absolute path
+     *  will still be relative to directory root.
+     *
+     *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+     *  NUL terminated result path in directory-native character set
+     *  the resolved path will be directory relative
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target path. NB - need not exist.
+    */
+    inline rc_t ResolvePath ( bool absolute, char *resolved, size_t rsize,
+        const char *path, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVResolvePath ( this, absolute, resolved, rsize, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t ResolvePath ( bool absolute, char *resolved, size_t rsize,
+        const char *path, va_list args ) const throw ()
+    { return KDirectoryVResolvePath ( this, absolute, resolved, rsize, path, args ); }
+
+
+    /* ResolveAlias
+     *  resolves an alias path to its immediate target
+     *  NB - the resolved path may be yet another alias
+     *
+     *  "absolute" [ IN ] - if true, always give a path starting
+     *  with '/'. NB - if the directory is chroot'd, the absolute path
+     *  will still be relative to directory root.
+     *
+     *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+     *  NUL terminated result path in directory-native character set
+     *  the resolved path will be directory relative
+     *
+     *  "alias" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting an object presumed to be an alias.
+     */
+     inline rc_t ResolveAlias ( bool absolute, char *resolved, size_t rsize, 
+        const char *alias, ... ) const throw ()
+     {
+        va_list args;
+        va_start ( args, alias );
+        rc_t rc = KDirectoryVResolveAlias ( this, absolute, resolved, rsize, alias, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t ResolveAlias ( bool absolute, char *resolved, size_t rsize, 
+        const char *alias, va_list args ) const throw ()
+     { return KDirectoryVResolveAlias ( this, absolute, resolved, rsize, alias, args ); }
+
+
+     /* Rename
+     *  rename an object accessible from directory, replacing
+     *  any existing target object of the same type
+     *
+     *  "from" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting existing object
+     *
+     *  "to" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting existing object
+     *
+     *  "force" [ IN ] - not false means try to do more if it fails internally
+     */
+     inline rc_t Rename ( bool force, const char *from, const char *to ) throw ()
+     {  return KDirectoryRename ( this, force, from, to );  }
+
+
+     /* Remove
+     *  remove an accessible object from its directory
+     *
+     *  "force" [ IN ] - if true and target is a directory,
+     *  remove recursively
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target object
+     */
+     inline rc_t Remove ( bool force, const char *path, ... ) throw ()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVRemove ( this, force, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t Remove ( bool force, const char *path, va_list args ) throw ()
+     { return KDirectoryVRemove ( this, force, path, args ); }
+
+
+     /* ClearDir
+     *  remove all directory contents
+     *
+     *  "force" [ IN ] - if true and directory entry is a
+     *  sub-directory, remove recursively
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target directory
+     */
+     inline rc_t ClearDir ( bool force, const char *path, ... ) throw ()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVClearDir ( this, force, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t ClearDir ( bool force, const char *path,
+        va_list args ) throw ()
+     { return KDirectoryVClearDir ( this, force, path, args ); }
+
+
+     /* Access
+     *  get access to object
+     *
+     *  "access" [ OUT ] - return parameter for Unix access mode
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target object
+     */
+     inline rc_t Access ( uint32_t *access,
+        const char *path, ... ) const throw ()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVAccess ( this, access, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t Access ( uint32_t *access, const char *path, 
+        va_list args ) const throw ()
+     { return KDirectoryVAccess ( this, access, path, args ); }
+
+
+     /* SetAccess
+     *  set access to object a la Unix "chmod"
+     *
+     *  "recurse" [ IN ] - if non zero and "path" is a directory,
+     *  apply changes recursively.
+     *
+     *  "access" [ IN ] and "mask" [ IN ] - definition of change
+     *  where "access" contains new bit values and "mask defines
+     *  which bits should be changed.
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target object
+     */
+     inline rc_t SetAccess ( bool recurse, uint32_t access, uint32_t mask,
+        const char *path, ... ) throw ()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVSetAccess ( this, recurse, access, mask, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t SetAccess ( bool recurse, uint32_t access, uint32_t mask,
+        const char *path, va_list args ) throw ()
+     { return KDirectoryVSetAccess ( this, recurse, access, mask, path, args ); }
+
+
+     /* Date
+     *  get date/time to object
+     *
+     *  "date" [ OUT ] - return parameter
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target object
+     */
+     inline rc_t Date ( KTime_t *date, const char *path, ... ) const throw ()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVDate ( this, date, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t Date ( KTime_t *date, const char *path,
+        va_list args ) const throw ()
+     { return KDirectoryVDate ( this, date, path, args ); }
+
+
+     /* SetDate
+     *  set date to object
+     *
+     *  "recurse" [ IN ] - if non zero and "path" is a directory,
+     *  apply changes recursively.
+     *
+     *  "date" [ IN ] - new time and date for the object
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target object
+     */
+     inline rc_t SetDate ( bool recurse, KTime_t date,
+        const char *path, ... ) throw ()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVSetDate ( this, recurse, date, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t SetDate ( bool recurse, KTime_t date, const char *path,
+        va_list args ) throw ()
+     { return KDirectoryVSetDate ( this, recurse, date, path, args ); }
+
+
+     /* CreateAlias
+     *  creates a path alias according to create mode
+     *
+     *  "access" [ IN ] - standard Unix directory access mode
+     *  used when "mode" has kcmParents set and alias path does
+     *  not exist.
+     *
+     *  "mode" [ IN ] - a creation mode ( see explanation above ).
+     *
+     *  "targ" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target object
+     *
+     *  "alias" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target alias
+     */
+     inline rc_t CreateAlias ( uint32_t access, KCreateMode mode,
+        const char *targ, const char *alias ) throw ()
+     { return KDirectoryCreateAlias ( this, access, mode, targ, alias ); }
+
+
+    /* OpenFileRead
+     *  opens an existing file with read-only access
+     *
+     *  "f" [ OUT ] - return parameter for newly opened file
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target file
+     */
+    inline rc_t OpenFileRead ( struct KFile const **f,
+        const char *path, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVOpenFileRead ( this, f, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenFileRead ( struct KFile const **f, const char *path,
+        va_list args ) const throw ()
+    { return KDirectoryVOpenFileRead ( this, f, path, args ); }
+
+
+    /* OpenFileWrite
+     *  opens an existing file with write access
+     *
+     *  "f" [ OUT ] - return parameter for newly opened file
+     *
+     *  "update" [ IN ] - if true, open in read/write mode
+     *  otherwise, open in write-only mode
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target file
+     */
+    inline rc_t OpenFileWrite ( struct KFile **f, bool update,
+        const char *path, ... ) throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVOpenFileWrite ( this, f, update, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenFileWrite ( struct KFile **f, bool update,
+        const char *path, va_list args ) throw ()
+    { return KDirectoryVOpenFileWrite ( this, f, update, path, args ); }
+
+
+    /* CreateFile
+     *  opens a file with write access
+     *
+     *  "f" [ OUT ] - return parameter for newly opened file
+     *
+     *  "update" [ IN ] - if true, open in read/write mode
+     *  otherwise, open in write-only mode
+     *
+     *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+     *
+     *  "mode" [ IN ] - a creation mode ( see explanation above ).
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target file
+     */
+     inline rc_t CreateFile ( struct KFile **f, bool update, uint32_t access,
+        KCreateMode mode, const char *path, ... ) throw ()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVCreateFile ( this, f, update, access, mode, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t CreateFile ( struct KFile **f, bool update, uint32_t access,
+        KCreateMode mode, const char *path, va_list args ) throw ()
+     { return KDirectoryVCreateFile ( this, f, update, access, mode, path, args ); }
+
+
+     /* FileSize
+     *  returns size in bytes of target file
+     *
+     *  "size" [ OUT ] - return parameter for file size
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target file
+     */
+     inline rc_t FileSize ( uint64_t *size, 
+        const char *path, ... ) const throw ()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVFileSize ( this, size, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t FileSize ( uint64_t *size, const char *path,
+        va_list args ) const throw ()
+     { return KDirectoryVFileSize ( this, size, path, args ); }
+
+
+     /* SetFileSize
+     *  sets size in bytes of target file
+     *
+     *  "size" [ IN ] - new file size
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target file
+     */
+     inline rc_t SetFileSize ( uint64_t size, const char *path, ... ) throw ()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVSetFileSize ( this, size, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t SetFileSize ( uint64_t size, const char *path,
+        va_list args ) throw ()
+     { return KDirectoryVSetFileSize ( this, size, path, args ); }
+
+
+     /* OpenDirRead
+     * OpenDirUpdate
+     *  opens a sub-directory
+     *
+     *  "chroot" [ IN ] - if true, the new directory becomes
+     *  chroot'd and will interpret paths beginning with '/'
+     *  relative to itself.
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target directory
+     */
+     inline rc_t OpenDirRead ( const KDirectory **sub, bool chroot,
+        const char *path, ... ) const throw ()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVOpenDirRead ( this, sub, chroot, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t OpenDirRead ( const KDirectory **sub, bool chroot,
+        const char *path, va_list args ) const throw ()
+     { return KDirectoryVOpenDirRead ( this, sub, chroot, path, args ); }
+
+     inline rc_t OpenDirUpdate ( KDirectory **sub, bool chroot,
+        const char *path, ... )
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVOpenDirUpdate ( this, sub, chroot, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t OpenDirUpdate ( KDirectory **sub, bool chroot,
+        const char *path, va_list args ) throw ()
+     { return KDirectoryVOpenDirUpdate ( this, sub, chroot, path, args ); }
+
+     /* CreateDir
+     *  create a sub-directory
+     *
+     *  "access" [ IN ] - standard Unix directory mode, e.g.0775
+     *
+     *  "mode" [ IN ] - a creation mode ( see explanation above ).
+     *
+     *  "path" [ IN ] - NUL terminated string in directory-native
+     *  character set denoting target directory
+     */
+     inline rc_t CreateDir ( uint32_t access, KCreateMode mode,
+        const char *path, ... ) throw ()
+     {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KDirectoryVCreateDir ( this, access, mode, path, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t CreateDir ( uint32_t access, KCreateMode mode,
+        const char *path, va_list args ) throw ()
+     { return  KDirectoryVCreateDir ( this, access, mode, path, args ); }
+
+
+    /* NativeDir
+     *  returns a native file-system directory node reference
+     *  the directory root will be "/" and set to the native
+     *  idea of current working directory
+     *
+     *  NB - the returned reference will be non-const, allowing
+     *  modification operations to be attempted. these operations
+     *  may still fail if the underlying FS disallows them.
+     *
+     *  "dir" [ OUT ] - return parameter for native directory
+     */
+    inline static rc_t NativeDir ( KDirectory **dir ) throw ()
+    { return KDirectoryNativeDir ( dir ); }
+
+private:
+    KDirectory ();
+    ~ KDirectory ();
+    KDirectory ( const KDirectory& );
+    KDirectory &operator = ( const KDirectory& );
+};
+
+#endif /* _hpp_kfs_directory_ */
diff --git a/interfaces/kfs/dyload.h b/interfaces/kfs/dyload.h
new file mode 100644
index 0000000..e06958a
--- /dev/null
+++ b/interfaces/kfs/dyload.h
@@ -0,0 +1,223 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_dyload_
+#define _h_kfs_dyload_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * KDyld
+ *  dynamic library loader
+ *
+ *  maintains cache of libraries it has opened while they remain open
+ *  such that subsequent requests for an open library will return a
+ *  new reference to the existing library.
+ */
+typedef struct KDyld KDyld;
+
+
+/* Make
+ *  create a dynamic loader object
+ *
+ *  "dl" [ OUT ] - return parameter for loader
+ */
+KFS_EXTERN rc_t CC KDyldMake ( KDyld **dl );
+
+
+/* AddRef
+ * Release
+ */
+KFS_EXTERN rc_t CC KDyldAddRef ( const KDyld *self );
+KFS_EXTERN rc_t CC KDyldRelease ( const KDyld *self );
+
+
+/* AddSearchPath
+ *  add a search path to loader for locating library files
+ */
+KFS_EXTERN rc_t CC KDyldAddSearchPath ( KDyld *self, const char *path, ... );
+KFS_EXTERN rc_t CC KDyldVAddSearchPath ( KDyld *self, const char *path, va_list args );
+
+
+/* HomeDirectory
+ *  returns a KDirectory where the binary for a given function is located
+ *
+ *  "dir" [ OUT ] - return parameter for home directory ( read-only ), if found
+ *
+ *  "func" [ IN ] - function pointer within binary to be located
+ */
+KFS_EXTERN rc_t CC KDyldHomeDirectory ( const KDyld *self,
+    struct KDirectory const **dir, fptr_t func );
+
+
+/*--------------------------------------------------------------------------
+ * KDylib
+ *  dynamic library
+ */
+typedef struct KDylib KDylib;
+
+
+/* LoadLib
+ *  load a dynamic library
+ *
+ *  "lib" [ OUT ] - return parameter for loaded library
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target library
+ */
+KFS_EXTERN rc_t CC KDyldLoadLib ( KDyld *self,
+    KDylib **lib, const char *path, ... );
+KFS_EXTERN rc_t CC KDyldVLoadLib ( KDyld *self,
+    KDylib **lib, const char *path, va_list args );
+
+
+/* AddRef
+ * Release
+ */
+KFS_EXTERN rc_t CC KDylibAddRef ( const KDylib *self );
+KFS_EXTERN rc_t CC KDylibRelease ( const KDylib *self );
+
+
+/* FullPath
+ *  return full path to library
+ */
+KFS_EXTERN rc_t CC KDylibFullPath ( const KDylib *self, char *path, size_t psize );
+
+
+/*--------------------------------------------------------------------------
+ * KDlset
+ *  set of dynamic libraries
+ *  contained libraries remain resident until set is released
+ */
+typedef struct KDlset KDlset;
+
+
+/* MakeSet
+ *  load a dynamic library
+ *
+ *  "set" [ OUT ] - return parameter for lib set
+ */
+KFS_EXTERN rc_t CC KDyldMakeSet ( const KDyld *self, KDlset **set );
+
+
+/* AddRef
+ * Release
+ */
+KFS_EXTERN rc_t CC KDlsetAddRef ( const KDlset *self );
+KFS_EXTERN rc_t CC KDlsetRelease ( const KDlset *self );
+
+
+/* AddLib
+ *  adds a dynamic library to set
+ *  returns "rcExists" error if already present
+ *
+ *  "lib" [ IN ] - library returned from KDyldLoadLib
+ */
+KFS_EXTERN rc_t CC KDlsetAddLib ( KDlset *self, KDylib *lib );
+
+
+/* AddAll
+ *  adds all dynamic libraries found in dl search path
+ */
+KFS_EXTERN rc_t CC KDlsetAddAll ( KDlset *self );
+
+
+/*--------------------------------------------------------------------------
+ * KSymAddr
+ *  symbol address within a dynamic library
+ */
+typedef struct KSymAddr KSymAddr;
+
+
+/* Symbol
+ *  find a symbol within dynamic library
+ *
+ *  "sym" [ OUT ] - return parameter for exported symbol address
+ *
+ *  "name" [ IN ] - NUL terminated symbol name in
+ *  library-native character set
+ */
+KFS_EXTERN rc_t CC KDylibSymbol ( const KDylib *self, KSymAddr **sym, const char *name );
+KFS_EXTERN rc_t CC KDlsetSymbol ( const KDlset *self, KSymAddr **sym, const char *name );
+
+
+/* FirstSymbol
+ * LastSymbol
+ *  find a symbol within dynamic library set matching criteria
+ *
+ *  "sym" [ OUT ] - return parameter for exported symbol address
+ *
+ *  "name" [ IN ] - NUL terminated symbol name in
+ *  library-native character set
+ *
+ *  "test" [ IN ] and "data" [ IN, OPAQUE ] - callback filter function
+ *  return true if symbol matches criteria
+ */
+KFS_EXTERN rc_t CC KDlsetFirstSymbol ( const KDlset *self, KSymAddr **sym, const char *name,
+    bool ( CC * test ) ( const KSymAddr *sym, void *data ), void *data );
+KFS_EXTERN rc_t CC KDlsetLastSymbol ( const KDlset *self, KSymAddr **sym, const char *name,
+    bool ( CC * test ) ( const KSymAddr *sym, void *data ), void *data );
+
+
+/* AddRef
+ * Release
+ */
+KFS_EXTERN rc_t CC KSymAddrAddRef ( const KSymAddr *self );
+KFS_EXTERN rc_t CC KSymAddrRelease ( const KSymAddr *self );
+
+
+/* AsObj
+ * AsFunc
+ *  retrieve symbol address as pointer to object
+ */
+KFS_EXTERN void *CC KSymAddrAsObj ( const KSymAddr *self );
+KFS_EXTERN void CC KSymAddrAsFunc ( const KSymAddr *self, fptr_t *fp );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_dyload_ */
diff --git a/interfaces/kfs/extendable-ramfile.h b/interfaces/kfs/extendable-ramfile.h
new file mode 100644
index 0000000..93e5582
--- /dev/null
+++ b/interfaces/kfs/extendable-ramfile.h
@@ -0,0 +1,50 @@
+#ifndef _h_kfs_extendable_ramfile_
+#define _h_kfs_extendable_ramfile_
+
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFile;
+
+KFS_EXTERN rc_t CC KExtendableRamFileMake(struct KFile **self);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_extendable_ramfile_ */
diff --git a/interfaces/kfs/extern.h b/interfaces/kfs/extern.h
new file mode 100644
index 0000000..0ea1d3c
--- /dev/null
+++ b/interfaces/kfs/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_extern_
+#define _h_kfs_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define KFS_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define KFS_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_kfs_extern_ */
diff --git a/interfaces/kfs/ffext.h b/interfaces/kfs/ffext.h
new file mode 100644
index 0000000..ab4f16a
--- /dev/null
+++ b/interfaces/kfs/ffext.h
@@ -0,0 +1,48 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_fileformat_ext_
+#define _h_kfs_fileformat_ext_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFileFormat;
+
+KFS_EXTERN rc_t CC KExtFileFormatMake (struct KFileFormat ** pft,
+                                       const char* ext, size_t extlen,
+                                       const char * typeAndClass, size_t tclen);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_fileformat_ext_ */
diff --git a/interfaces/kfs/ffmagic.h b/interfaces/kfs/ffmagic.h
new file mode 100644
index 0000000..4049a49
--- /dev/null
+++ b/interfaces/kfs/ffmagic.h
@@ -0,0 +1,49 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_fileformat_magic_
+#define _h_kfs_fileformat_magic_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFileFormat;
+
+KFS_EXTERN rc_t CC KMagicFileFormatMake (struct KFileFormat ** pft, const char * magic_path,
+			const char* magic, size_t magiclen,
+			const char * typeAndClass, size_t tclen);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_fileformat_magic_ */
diff --git a/interfaces/kfs/file-impl.h b/interfaces/kfs/file-impl.h
new file mode 100644
index 0000000..0c2f123
--- /dev/null
+++ b/interfaces/kfs/file-impl.h
@@ -0,0 +1,193 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_file_impl_
+#define _h_kfs_file_impl_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_kfs_file_
+#include <kfs/file.h>
+#endif
+
+#ifndef _h_kfc_refcount_impl_
+#include <kfc/refcount-impl.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct timeout_t;
+struct KSysFile_v1;
+struct KSysFile_v2;
+struct KDirectory_v1;
+typedef union KFile_vt KFile_vt;
+extern KItfTok KFile_tok_v2;
+
+#if KFILE_VERS == 1
+#define KSysFile KSysFile_v1
+#elif KFILE_VERS == 2
+#define KSysFile KSysFile_v2
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KFile
+ *  a virtual file
+ */
+struct KFile_v1
+{
+    const KFile_vt *vt;
+    struct KDirectory_v1 const *dir;
+    KRefcount refcount;
+    uint8_t read_enabled;
+    uint8_t write_enabled;
+    uint8_t align [ 2 ];
+};
+
+struct KFile_v2
+{
+    KRefcount_v1 dad;
+    uint8_t read_enabled;
+    uint8_t write_enabled;
+    uint8_t align [ sizeof ( void* ) - 2 ];
+};
+
+#ifndef KFILE_IMPL
+#define KFILE_IMPL struct KFile_v1
+#endif
+
+typedef struct KFile_vt_v1 KFile_vt_v1;
+struct KFile_vt_v1
+{
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t ( CC * destroy ) ( KFILE_IMPL *self );
+    struct KSysFile_v1* ( CC * get_sysfile ) ( const KFILE_IMPL *self, uint64_t *offset );
+    rc_t ( CC * random_access ) ( const KFILE_IMPL *self );
+    rc_t ( CC * get_size ) ( const KFILE_IMPL *self, uint64_t *size );
+    rc_t ( CC * set_size ) ( KFILE_IMPL *self, uint64_t size );
+    /* num_read and num_writ are guaranteed non-NULL */
+    rc_t ( CC * read ) ( const KFILE_IMPL *self, uint64_t pos,
+        void *buffer, size_t bsize, size_t *num_read );
+    rc_t ( CC * write ) ( KFILE_IMPL *self, uint64_t pos,
+        const void *buffer, size_t size, size_t *num_writ );
+    /* end minor version == 0 */
+
+    /* start minor version == 1 */
+    uint32_t ( CC * get_type ) ( const KFILE_IMPL * self );
+    /* end minor version == 1 */
+
+    /* start minor version == 2 */
+    rc_t ( CC * timed_read ) ( const KFILE_IMPL *self, uint64_t pos,
+        void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm );
+    rc_t ( CC * timed_write ) ( KFILE_IMPL *self, uint64_t pos,
+        const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm );
+    /* end minor version == 2 */
+
+    /* ANY NEW ENTRIES MUST BE REFLECTED IN libs/kfs/file.c
+       BY BOTH THE CORRESPONDING MESSAGE DISPATCH FUNCTION(s) AND
+       VTABLE VALIDITY CHECKS IN KFileInit_v1 */
+};
+
+union KFile_vt
+{
+    KFile_vt_v1 v1;
+};
+
+typedef struct KFile_v2_vt KFile_v2_vt;
+struct KFile_v2_vt
+{
+    KVTable dad;
+
+    /* start minor version == 0 */
+    struct KSysFile_v2* ( CC * get_sysfile ) ( const KFile_v2 *self, ctx_t ctx, uint64_t *offset );
+    bool ( CC * random_access ) ( const KFile_v2 *self, ctx_t ctx );
+    uint64_t ( CC * get_size ) ( const KFile_v2 *self, ctx_t ctx );
+    void ( CC * set_size ) ( KFile_v2 *self, ctx_t ctx, uint64_t size );
+    /* num_read and num_writ are guaranteed non-NULL */
+    size_t ( CC * read ) ( const KFile_v2 *self, ctx_t ctx, uint64_t pos,
+        void *buffer, size_t bsize );
+    size_t ( CC * write ) ( KFile_v2 *self, ctx_t ctx, uint64_t pos,
+        const void *buffer, size_t size );
+
+    uint32_t ( CC * get_type ) ( const KFile_v2 * self, ctx_t ctx );
+
+    size_t ( CC * timed_read ) ( const KFile_v2 *self, ctx_t ctx, uint64_t pos,
+        void *buffer, size_t bsize, struct timeout_t *tm );
+    size_t ( CC * timed_write ) ( KFile_v2 *self, ctx_t ctx, uint64_t pos,
+        const void *buffer, size_t size, struct timeout_t *tm );
+
+    /* ANY NEW ENTRIES MUST BE REFLECTED IN libs/kfs/file-v2.c
+       BY BOTH THE CORRESPONDING MESSAGE DISPATCH FUNCTION(s) AND
+       VTABLE VALIDITY CHECKS IN KFileInit_v2 */
+};
+
+
+/* Init
+ *  initialize a newly allocated file object
+ */
+KFS_EXTERN rc_t CC KFileInit_v1 ( KFile_v1 *self, const KFile_vt *vt,
+    const char *classname, const char *fname,
+    bool read_enabled, bool write_enabled );
+KFS_EXTERN void CC KFileInit_v2 ( KFile_v2 *self, ctx_t ctx, const KVTable *vt,
+    const char *fname, bool read_enabled, bool write_enabled );
+
+/* Destroy
+ *  destroy file
+ */
+KFS_EXTERN rc_t CC KFileDestroy_v1 ( KFile_v1 *self );
+KFS_EXTERN void CC KFileDestroy_v2 ( KFile_v2 * self );
+
+/* GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ */
+KFS_EXTERN struct KSysFile_v1 * CC KFileGetSysFile_v1 ( const KFile_v1 *self, uint64_t *offset );
+KFS_EXTERN struct KSysFile_v2 * CC KFileGetSysFile_v2 ( const KFile_v2 *self, ctx_t ctx, uint64_t *offset );
+
+#define KFileInit NAME_VERS ( KFileInit, KFILE_VERS )
+#define KFileDestroy NAME_VERS ( KFileDestory, KFILE_VERS )
+#define KFileGetSysFile NAME_VERS ( KFileGetSysFile, KFILE_VERS )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_file_impl_ */
diff --git a/interfaces/kfs/file-v1.h b/interfaces/kfs/file-v1.h
new file mode 100644
index 0000000..dc05dbd
--- /dev/null
+++ b/interfaces/kfs/file-v1.h
@@ -0,0 +1,259 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_file_v1_
+#define _h_kfs_file_v1_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_namelist_
+#include <klib/namelist.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct timeout_t;
+
+
+/*--------------------------------------------------------------------------
+ * KFile_v1
+ *  a file is normally created with a KDirectory
+ *  optionally, the standard i/o files may be created directly
+ */
+typedef struct KFile_v1 KFile_v1;
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KFS_EXTERN rc_t CC KFileAddRef_v1 ( const KFile_v1 *self );
+KFS_EXTERN rc_t CC KFileRelease_v1 ( const KFile_v1 *self );
+
+
+/* RandomAccess
+ *  ALMOST by definition, the file is random access
+ *
+ *  certain file types will refuse random access
+ *  these include FIFO and socket based files, but also
+ *  wrappers that require serial access ( e.g. compression )
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+KFS_EXTERN rc_t CC KFileRandomAccess_v1 ( const KFile_v1 *self );
+
+
+/* Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+KFS_EXTERN uint32_t CC KFileType_v1 ( const KFile_v1 *self );
+
+
+/* Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+KFS_EXTERN rc_t CC KFileSize_v1 ( const KFile_v1 *self, uint64_t *size );
+
+
+/* SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+KFS_EXTERN rc_t CC KFileSetSize_v1 ( KFile_v1 *self, uint64_t size );
+
+
+/* Read
+ * TimedRead
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of file.
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN rc_t CC KFileRead_v1 ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read );
+KFS_EXTERN rc_t CC KFileTimedRead_v1 ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm );
+
+/* ReadAll
+ * TimedReadAll
+ *  read from file until "bsize" bytes have been retrieved
+ *  or until end-of-input
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of file.
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN rc_t CC KFileReadAll_v1 ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read );
+KFS_EXTERN rc_t CC KFileTimedReadAll_v1 ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm );
+
+/* ReadExactly
+ * TimedReadExactly
+ *  read from file until "bytes" have been retrieved
+ *  or return incomplete transfer error
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bytes" [ IN ] - return buffer for read
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN rc_t CC KFileReadExactly_v1 ( const KFile_v1 *self,
+    uint64_t pos, void *buffer, size_t bytes );
+KFS_EXTERN rc_t CC KFileTimedReadExactly_v1 ( const KFile_v1 *self,
+    uint64_t pos, void *buffer, size_t bytes, struct timeout_t *tm );
+
+/* Write
+ * TimedWrite
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed writes. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN rc_t CC KFileWrite_v1 ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ );
+KFS_EXTERN rc_t CC KFileTimedWrite_v1 ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm );
+
+/* WriteAll
+ * TimedWriteAll
+ *  write to file until "size" bytes have been transferred
+ *  or until no further progress can be made
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed writes. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN rc_t CC KFileWriteAll_v1 ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ );
+KFS_EXTERN rc_t CC KFileTimedWriteAll_v1 ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm );
+
+/* WriteExactly
+ * TimedWriteExactly
+ *  write to file until "bytes" have been transferred
+ *  or return incomplete transfer error
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "bytes" [ IN ] - data to be written
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed writes. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN rc_t CC KFileWriteExactly_v1 ( KFile_v1 *self,
+    uint64_t pos, const void *buffer, size_t bytes );
+KFS_EXTERN rc_t CC KFileTimedWriteExactly_v1 ( KFile_v1 *self,
+    uint64_t pos, const void *buffer, size_t bytes, struct timeout_t *tm );
+
+/* MakeStdIn
+ *  creates a read-only file on stdin
+ */
+KFS_EXTERN rc_t CC KFileMakeStdIn_v1 ( const KFile_v1 **std_in );
+
+/* MakeStdOut
+ * MakeStdErr
+ *  creates a write-only file on stdout or stderr
+ */
+KFS_EXTERN rc_t CC KFileMakeStdOut_v1 ( KFile_v1 **std_out );
+KFS_EXTERN rc_t CC KFileMakeStdErr_v1 ( KFile_v1 **std_err );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_file_v1_ */
diff --git a/interfaces/kfs/file-v2.h b/interfaces/kfs/file-v2.h
new file mode 100644
index 0000000..ecd249b
--- /dev/null
+++ b/interfaces/kfs/file-v2.h
@@ -0,0 +1,264 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_file_v2_
+#define _h_kfs_file_v2_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_kfc_refcount_
+#include <kfc/refcount.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct timeout_t;
+
+
+/*--------------------------------------------------------------------------
+ * KFile_v2
+ *  a file is normally created with a KDirectory
+ *  optionally, the standard i/o files may be created directly
+ */
+typedef struct KFile_v2 KFile_v2;
+
+/* Duplicate
+ * Release
+ *  ignores NULL references
+ */
+static __inline__
+KFile_v2 * KFileDuplicate_v2 ( const KFile_v2 * self, ctx_t ctx, caps_t rm )
+{
+    return ( KFile_v2 * ) KRefcountDuplicate_v1 ( TO_REFCOUNT_V1 ( self ), ctx, rm );
+}
+
+static __inline__
+void KFileRelease_v2 ( const KFile_v2 * self, ctx_t ctx )
+{
+    KRefcountRelease_v1 ( TO_REFCOUNT_V1 ( self ), ctx );
+}
+
+
+/* RandomAccess
+ *  ALMOST by definition, the file is random access
+ *
+ *  certain file types will refuse random access
+ *  these include FIFO and socket based files, but also
+ *  wrappers that require serial access ( e.g. compression )
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+KFS_EXTERN bool CC KFileRandomAccess_v2 ( const KFile_v2 *self, ctx_t ctx );
+
+
+/* Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+KFS_EXTERN uint32_t CC KFileType_v2 ( const KFile_v2 *self, ctx_t ctx );
+
+
+/* Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+KFS_EXTERN uint64_t CC KFileSize_v2 ( const KFile_v2 *self, ctx_t ctx );
+
+
+/* SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+KFS_EXTERN void CC KFileSetSize_v2 ( KFile_v2 *self, ctx_t ctx, uint64_t size );
+
+
+/* Read
+ * TimedRead
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of file.
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN size_t CC KFileRead_v2 ( const KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, void *buffer, size_t bsize );
+KFS_EXTERN size_t CC KFileTimedRead_v2 ( const KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, void *buffer, size_t bsize, struct timeout_t *tm );
+
+/* ReadAll
+ * TimedReadAll
+ *  read from file until "bsize" bytes have been retrieved
+ *  or until end-of-input
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of file.
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN size_t CC KFileReadAll_v2 ( const KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, void *buffer, size_t bsize );
+KFS_EXTERN size_t CC KFileTimedReadAll_v2 ( const KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, void *buffer, size_t bsize, struct timeout_t *tm );
+
+/* ReadExactly
+ * TimedReadExactly
+ *  read from file until "bytes" have been retrieved
+ *  or return incomplete transfer error
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bytes" [ IN ] - return buffer for read
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN void CC KFileReadExactly_v2 ( const KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, void *buffer, size_t bytes );
+KFS_EXTERN void CC KFileTimedReadExactly_v2 ( const KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, void *buffer, size_t bytes, struct timeout_t *tm );
+
+/* Write
+ * TimedWrite
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed writes. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN size_t CC KFileWrite_v2 ( KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, const void *buffer, size_t size );
+KFS_EXTERN size_t CC KFileTimedWrite_v2 ( KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, const void *buffer, size_t size, struct timeout_t *tm );
+
+/* WriteAll
+ * TimedWriteAll
+ *  write to file until "size" bytes have been transferred
+ *  or until no further progress can be made
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed writes. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN size_t CC KFileWriteAll_v2 ( KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, const void *buffer, size_t size );
+KFS_EXTERN size_t CC KFileTimedWriteAll_v2 ( KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, const void *buffer, size_t size, struct timeout_t *tm );
+
+/* WriteExactly
+ * TimedWriteExactly
+ *  write to file until "bytes" have been transferred
+ *  or return incomplete transfer error
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "bytes" [ IN ] - data to be written
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed writes. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KFS_EXTERN void CC KFileWriteExactly_v2 ( KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, const void *buffer, size_t bytes );
+KFS_EXTERN void CC KFileTimedWriteExactly_v2 ( KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, const void *buffer, size_t bytes, struct timeout_t *tm );
+
+/* MakeStdIn
+ *  creates a read-only file on stdin
+ */
+KFS_EXTERN const KFile_v2 * CC KFileMakeStdIn_v2 ( ctx_t ctx );
+
+/* MakeStdOut
+ * MakeStdErr
+ *  creates a write-only file on stdout or stderr
+ */
+KFS_EXTERN const KFile_v2 * CC KFileMakeStdOut_v2 ( ctx_t ctx );
+KFS_EXTERN const KFile_v2 * CC KFileMakeStdErr_v2 ( ctx_t ctx );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_file_v2_ */
diff --git a/interfaces/kfs/file.h b/interfaces/kfs/file.h
new file mode 100644
index 0000000..1c5119a
--- /dev/null
+++ b/interfaces/kfs/file.h
@@ -0,0 +1,99 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_file_
+#define _h_kfs_file_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_kfs_file_v1_
+#include <kfs/file-v1.h>
+#endif
+
+#ifndef _h_kfs_file_v2_
+#include <kfs/file-v2.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KFileDesc
+ *  describes basic file types
+ */
+enum KFileDesc
+{
+    kfdNull,
+    kfdInvalid,
+    kfdFile,
+    kfdCharDev,
+    kfdBlockDev,
+    kfdFIFO,
+    kfdSocket,
+
+    /* the type enum may be extended */
+    kfdLastDefined
+};
+
+
+/*--------------------------------------------------------------------------
+ * KFile
+ *  a file is normally created with a KDirectory
+ *  optionally, the standard i/o files may be created directly
+ */
+#define KFileAddRef NAME_VERS ( KFileAddRef, KFILE_VERS )
+#define KFileDuplicate NAME_VERS ( KFileDuplicate, KFILE_VERS )
+#define KFileRelease NAME_VERS ( KFileRelease, KFILE_VERS )
+#define KFileRandomAccess NAME_VERS ( KFileRandomAccess, KFILE_VERS )
+#define KFileType NAME_VERS ( KFileType, KFILE_VERS )
+#define KFileSize NAME_VERS ( KFileSize, KFILE_VERS ) 
+#define KFileSetSize NAME_VERS ( KFileSetSize, KFILE_VERS )
+#define KFileRead NAME_VERS ( KFileRead, KFILE_VERS )
+#define KFileTimedRead NAME_VERS ( KFileTimedRead, KFILE_VERS )
+#define KFileReadAll NAME_VERS ( KFileReadAll, KFILE_VERS )
+#define KFileTimedReadAll NAME_VERS ( KFileTimedReadAll, KFILE_VERS )
+#define KFileReadExactly NAME_VERS ( KFileReadExactly, KFILE_VERS )
+#define KFileTimedReadExactly NAME_VERS ( KFileTimedReadExactly, KFILE_VERS )
+#define KFileWrite NAME_VERS ( KFileWrite, KFILE_VERS )
+#define KFileTimedWrite NAME_VERS ( KFileTimedWrite, KFILE_VERS )
+#define KFileWriteAll NAME_VERS ( KFileWriteAll, KFILE_VERS )
+#define KFileTimedWriteAll NAME_VERS ( KFileTimedWriteAll, KFILE_VERS )
+#define KFileWriteExactly NAME_VERS ( KFileWriteExactly, KFILE_VERS )
+#define KFileTimedWriteExactly NAME_VERS ( KFileTimedWriteExactly, KFILE_VERS )
+#define KFileMakeStdIn NAME_VERS ( KFileMakeStdIn, KFILE_VERS )
+#define KFileMakeStdOut NAME_VERS ( KFileMakeStdOut, KFILE_VERS )
+#define KFileMakeStdErr NAME_VERS ( KFileMakeStdErr, KFILE_VERS )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_file_ */
diff --git a/interfaces/kfs/file.hpp b/interfaces/kfs/file.hpp
new file mode 100644
index 0000000..866a960
--- /dev/null
+++ b/interfaces/kfs/file.hpp
@@ -0,0 +1,147 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_kfs_file_
+#define _hpp_kfs_file_
+
+#ifndef _h_kfs_file_
+#include <kfs/file.h>
+#endif
+
+//#include <kfs/md5.h> // KFileMakeMd5ForReadFromString
+
+/*--------------------------------------------------------------------------
+ * KFile
+ *  a file
+ */
+struct KFile
+{
+    /* AddRef
+     * Release
+     *  ignores NULL references
+     */
+    inline rc_t AddRef () const throw ()
+    { return KFileAddRef ( this ); }
+
+    inline rc_t Release () const throw ()
+    { return KFileRelease ( this ); }
+
+    /* RandomAccess
+     *  ALMOST by definition, the file is random access
+     *
+     *  certain file types will refuse random access
+     *  these include FIFO and socket based files, but also
+     *  wrappers that require serial access ( e.g. compression )
+     *
+     *  returns 0 if random access, error code otherwise
+    */
+    inline rc_t RandomAccess () const throw()
+    { return KFileRandomAccess ( this ); }
+
+
+    /* Type
+     *  returns a KFileDesc
+     *  not intended to be a content type,
+     *  but rather an implementation class
+     */
+    inline uint32_t FileType() const throw()
+    { return KFileType ( this ); }
+
+
+    /* Size
+     *  returns size in bytes of file
+     *
+     *  "size" [ OUT ] - return parameter for file size
+     */
+    inline rc_t Size ( uint64_t *size ) const throw ()
+    { return KFileSize ( this, size ); }
+
+    /* SetSize
+     *  sets size in bytes of file
+     *
+     *  "size" [ IN ] - new file size
+     */
+    inline rc_t SetSize ( uint64_t size ) throw ()
+    { return KFileSetSize ( this, size ); }
+
+    /* Read
+     *  read file from known position
+     *
+     *  "pos" [ IN ] - starting position within file
+     *
+     *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+     *
+     *  "num_read" [ OUT ] - return parameter giving number of bytes
+     *  actually read. when returned value is zero and return code is
+     *  also zero, interpreted as end of file.
+     */
+    inline rc_t Read ( uint64_t pos,
+        void *buffer, size_t bsize, size_t *num_read ) const throw ()
+    { return KFileRead ( this, pos, buffer, bsize, num_read ); }
+
+    /* Write
+     *  write file at known position
+     *
+     *  "pos" [ IN ] - starting position within file
+     *
+     *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+     *
+     *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+     *  giving number of bytes actually written
+     */
+    inline rc_t Write ( uint64_t pos,
+        const void *buffer, size_t size, size_t *num_writ ) throw ()
+    { return KFileWrite ( this, pos, buffer, size, num_writ ); }
+
+    /* MakeStdIn
+     *  creates a read-only file on stdin
+     */
+    static inline rc_t MakeStdIn ( const KFile **std_in ) throw ()
+    { return KFileMakeStdIn ( std_in ); }
+
+    /* MakeStdOut
+     * MakeStdErr
+     *  creates a write-only file on stdout or stderr
+     */
+    static inline rc_t MakeStdOut ( KFile **std_out ) throw ()
+    { return KFileMakeStdOut ( std_out ); }
+    static inline rc_t MakeStdErr ( KFile **std_err ) throw ()
+    { return KFileMakeStdErr ( std_err ); }
+     
+
+    /*/ MD5
+    static inline rc_t MakeMd5ForRead ( const KFile **f,
+        const KFile *src, const char digest[MD5_DIGEST_SIZE] )
+    { return KFileMakeMd5ForReadFromString ( f, src, digest ); }*/
+
+private:
+    KFile ();
+    ~ KFile ();
+    KFile ( const KFile& );
+    KFile &operator = ( const KFile& );
+};
+
+#endif // _hpp_kfs_file_
diff --git a/interfaces/kfs/fileformat.h b/interfaces/kfs/fileformat.h
new file mode 100644
index 0000000..b68c635
--- /dev/null
+++ b/interfaces/kfs/fileformat.h
@@ -0,0 +1,140 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_fileformat_
+#define _h_kfs_fileformat_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KDirectory;
+
+/*
+ * Multiple descriptions can be attached to a single key.
+ * At most one key can be attached to a single description.
+ *
+ * Multiple types can be attached to a single class.
+ * At most one class can be attached to a single type.
+ */
+
+
+/*--------------------------------------------------------------------------
+ * KFileFormatType
+ *  describes basic file content types.  The type can be used to choose what
+ *  parser is used to extract information for a loader, archive as filesystem,
+ *  or decompress for further parsing.
+ */
+typedef
+int32_t KFileFormatType;
+enum KFileFormatType_e
+{
+    kfftError = -2,		/* A file that can not be read for typing */
+    kfftNotFound = -1,		/* not found in a search */
+    kfftUnknown = 0		/* not yet or file format not understood. */
+    /* other types are registered during construction **?** */
+};
+
+/* -------------------------------------------------------------------------
+ * KFileFormatClass
+ *   Describes which class of operations can be performed in a given file.
+ *     Unknown: nothing in particular
+ *     Compressed: decompressed to reveal different expanded file contents
+ *     Archive: treated as a file system to reach contained files
+ *     Run: loaded into the SRA DB
+ */
+typedef
+int32_t KFileFormatClass;
+enum KFileFormatClass_e
+{
+    kffcError = -2,		/* A file that can not be read for typing */
+    kffcNotFound = -1,		/* not found in a search */
+    kffcUnknown = 0		/* not yet or file format not understood. */
+};
+
+/*--------------------------------------------------------------------------
+ * KFileFormat
+ */
+typedef struct KFileFormat KFileFormat;
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KFS_EXTERN rc_t CC KFileFormatAddRef (const KFileFormat *self);
+KFS_EXTERN rc_t CC KFileFormatRelease (const KFileFormat *self);
+
+/* Type
+ *  intended to be a content type,
+ *  if type, class or desc is NULL those types are not returned
+ */
+KFS_EXTERN rc_t CC KFileFormatGetTypeBuff (const KFileFormat *self, const void * buff, size_t buff_len,
+			KFileFormatType * type, KFileFormatClass * class,
+			char * description, size_t descriptionmax,
+			size_t * length);
+
+#define KFileFormatGetTypeBuffType(self,buff,buff_len,type) \
+    KFileFormatGetTypeBuff(self,buff,buff_len,type,NULL,NULL,0,NULL)
+
+#define KFileFormatGetTypeBuffClass(self,buff,buff_len,class) \
+    KFileFormatGetTypeBuff(self,buff,buff_len,NULL,class,NULL,0,NULL)
+
+/* useful for logging perhaps */
+#define KFileFormatGetTypeBuffDescr(self,buff,buff_len,descr,descr_max,descr_len)	\
+    KFileFormatGetTypeBuff(self,buff,buff_len,NULL,NULL,descr,descr_max,descr_len)
+
+KFS_EXTERN rc_t CC KFileFormatGetTypePath(const KFileFormat *self, const struct KDirectory * dir,
+                                          const char * path, KFileFormatType * type,
+                                          KFileFormatClass * class, char * description,
+                                          size_t descriptionmax, size_t * length);
+#define KFileFormatGetTypePathType(self,dir,path,type)			\
+    KFileFormatGetTypePath(self,dir,path,type,NULL,NULL,0,NULL)
+
+#define KFileFormatGetTypePathClass(self,dir,path,class)			\
+    KFileFormatGetTypePath(self,dir,path,NULL,class,NULL,0,NULL)
+
+/* useful for logging perhaps */
+#define KFileFormatGetTypePathDescr(self,dir,path,descr,descr_max,descr_len) \
+    KFileFormatGetTypePath(self,dir,path,NULL,NULL,descr,descr_max,descr_len)
+
+
+KFS_EXTERN rc_t CC KFileFormatGetClassDescr (const KFileFormat *self, KFileFormatClass c,
+			char * description, size_t descriptionmax);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_fileformat_ */
diff --git a/interfaces/kfs/filetools.h b/interfaces/kfs/filetools.h
new file mode 100644
index 0000000..ff9eb6f
--- /dev/null
+++ b/interfaces/kfs/filetools.h
@@ -0,0 +1,86 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_filetools_
+#define _h_kfs_filetools_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_kfs_file_
+#include <kfs/file.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* PLEASE DO NOT VERSION these functions, they use only the standard KFile-Interface */
+
+
+/* LoadKFileToNameList
+ * parses the content of a file as text, decomposes this text into lines,
+ * and adds the lines to the namelist. Because VNamelist cannot contain empty lines,
+ * empty lines are translated into a string containing a single space-character.
+ * The parsing accepts POSIX/Mac and Windows line endings.
+ */
+KFS_EXTERN rc_t CC LoadKFileToNameList( struct KFile const * self, struct VNamelist * namelist );
+
+
+/* LoadFileByNameToNameList
+ * calls internally LoadKFileToNameList(), but does construct the KFile internally from the given path
+ */
+KFS_EXTERN rc_t CC LoadFileByNameToNameList( struct VNamelist * namelist, const char * filename );
+
+
+/* Walks a file by calling the on_line for each line
+  */
+
+KFS_EXTERN rc_t CC ProcessFileLineByLine( struct KFile const * self,
+    rc_t ( CC * on_line )( const String * line, void * data ), void * data );
+
+/* WriteNameListToKFile
+ * Writes the lines of namelist into the given KFile.
+ * Uses the string given in delim as line-ending
+ */
+KFS_EXTERN rc_t CC WriteNameListToKFile( struct KFile * self, const VNamelist * namelist, 
+                                         const char * delim );
+
+/* WriteNamelistToFileByName
+ * calls internally WriteNameListToKFile(), but does construct the KFile internally from the given path
+ * if the file exists, it will be overwritten. if the files does not exist it will be created
+ */
+KFS_EXTERN rc_t CC WriteNamelistToFileByName( const VNamelist * namelist,
+     const char * filename, const char * delim );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_filetools_ */
diff --git a/interfaces/kfs/gzip.h b/interfaces/kfs/gzip.h
new file mode 100644
index 0000000..c5639fc
--- /dev/null
+++ b/interfaces/kfs/gzip.h
@@ -0,0 +1,77 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_gzip_
+#define _h_kfs_gzip_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+/* MakeGzipForRead
+ *  creates an adapter to gunzip a source file
+ *
+ *  "gz" [ OUT ] - return parameter for decompressed file
+ *
+ *  "src" [ IN ] - compressed source file with read permission
+ *
+ * NB - creates a read-only file that does NOT support random access
+ *  i.e. must be consumed serially starting from offset 0
+ */
+KFS_EXTERN rc_t CC KFileMakeGzipForRead ( struct KFile const **gz, struct KFile const *src );
+
+
+/* MakeGzipForWrite
+ *  creates an adapter to gzip a source file
+ *
+ *  "gz" [ OUT ] - return parameter for compressed file
+ *
+ *  "src" [ IN ] - uncompressed source file with write permission
+ *
+ * NB - creates a write-only file that does NOT suppport random access
+ *  i.e. must be written serially from offset 0
+ */
+KFS_EXTERN rc_t CC KFileMakeGzipForWrite ( struct KFile **gz, struct KFile *file );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_gzip_ */
diff --git a/interfaces/kfs/impl.h b/interfaces/kfs/impl.h
new file mode 100644
index 0000000..5233768
--- /dev/null
+++ b/interfaces/kfs/impl.h
@@ -0,0 +1,319 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_impl_
+#define _h_kfs_impl_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_kfs_file_impl_
+#include <kfs/file-impl.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_kfs_arrayfile_
+#include <kfs/arrayfile.h>
+#endif
+
+#ifndef _h_klib_namelist_
+#include <klib/namelist.h>
+#endif
+
+#if KFILE_VERS != 1 && KDIRECTORY_VERS != 1
+#error "include <kfs/file-impl.h> and <kfs/directory-impl.h> separately"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KPath;
+struct KBufFile;
+struct KSysDir_v1;
+struct KSysDir_v2;
+typedef union KDirectory_vt KDirectory_vt;
+
+#if KDIRECTORY_VERS == 1
+#define KSysDir KSysDir_v1
+#elif KDIRECTORY_VERS == 2
+#define KSysDir KSysDir_v2
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ *  a virtual directory
+ */
+struct KDirectory_v1
+{
+    const KDirectory_vt *vt;
+    KRefcount refcount;
+    uint8_t read_only;
+    uint8_t align [ 3 ];
+};
+
+struct KDirectory_v2
+{
+    const KDirectory_vt *vt;
+    KRefcount refcount;
+    uint8_t read_only;
+    uint8_t align [ 3 ];
+};
+
+#ifndef KDIR_IMPL
+#define KDIR_IMPL struct KDirectory
+#endif
+
+#if KDIRECTORY_VERS == 1
+#define KDIRECTORY_V1_IMPL KDIR_IMPL
+#define KDIRECTORY_V2_IMPL struct KDirectory_v2
+#elif KDIRECTORY_VERS == 2
+#define KDIRECTORY_V1_IMPL struct KDirectory_v1
+#define KDIRECTORY_V2_IMPL KDIR_IMPL
+#else
+#error unknown KDirectory version
+#endif
+
+
+typedef struct KDirectory_vt_v1 KDirectory_vt_v1;
+struct KDirectory_vt_v1
+{
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t ( CC * destroy ) ( KDIR_IMPL *self );
+    rc_t ( CC * list_dir ) ( const KDIR_IMPL *self, struct KNamelist **list,
+         bool ( CC * f ) ( const KDirectory *dir, const char *name, void *data ),
+         void *data, const char *path, va_list args );
+    rc_t ( CC * visit ) ( const KDIR_IMPL *self, bool recur,
+        rc_t ( CC * f ) ( const KDirectory*, uint32_t, const char*, void* ),
+        void *data, const char *path, va_list args );
+    rc_t ( CC * visit_update ) ( KDIR_IMPL *self, bool recur,
+        rc_t ( CC * f ) ( KDirectory*, uint32_t, const char*, void* ),
+        void *data, const char *path, va_list args );
+    uint32_t ( CC * path_type ) ( const KDIR_IMPL *self, const char *path, va_list args );
+    rc_t ( CC * resolve_path ) ( const KDIR_IMPL *self, bool absolute,
+        char *resolved, size_t rsize, const char *path, va_list args );
+    rc_t ( CC * resolve_alias ) ( const KDIR_IMPL *self, bool absolute,
+        char *resolved, size_t rsize, const char *alias, va_list args );
+    rc_t ( CC * rename ) ( KDIR_IMPL *self, bool force, const char *from, const char *to );
+    rc_t ( CC * remove ) ( KDIR_IMPL *self, bool force, const char *path, va_list args );
+    rc_t ( CC * clear_dir ) ( KDIR_IMPL *self, bool force, const char *path, va_list args );
+    rc_t ( CC * access ) ( const KDIR_IMPL *self,
+        uint32_t *access, const char *path, va_list args );
+    rc_t ( CC * set_access ) ( KDIR_IMPL *self, bool recur,
+        uint32_t access, uint32_t mask, const char *path, va_list args );
+    rc_t ( CC * create_alias ) ( KDIR_IMPL *self, uint32_t access,
+        KCreateMode mode, const char *targ, const char *alias );
+    rc_t ( CC * open_file_read ) ( const KDIR_IMPL *self,
+        const KFile **f, const char *path, va_list args );
+    rc_t ( CC * open_file_write ) ( KDIR_IMPL *self,
+        KFile **f, bool update, const char *path, va_list args );
+    rc_t ( CC * create_file ) ( KDIR_IMPL *self, KFile **f, bool update,
+        uint32_t access, KCreateMode mode, const char *path, va_list args );
+    rc_t ( CC * file_size ) ( const KDIR_IMPL *self,
+        uint64_t *size, const char *path, va_list args );
+    rc_t ( CC * set_size ) ( KDIR_IMPL *self,
+        uint64_t size, const char *path, va_list args );
+    rc_t ( CC * open_dir_read ) ( const KDIR_IMPL *self,
+        const KDirectory **sub, bool chroot, const char *path, va_list args );
+    rc_t ( CC * open_dir_update ) ( KDIR_IMPL *self,
+        KDirectory **sub, bool chroot, const char *path, va_list args );
+    rc_t ( CC * create_dir ) ( KDIR_IMPL *self, uint32_t access,
+        KCreateMode mode, const char *path, va_list args );
+
+    /* optional destructor method - leave NULL if not needed */
+    rc_t ( CC * destroy_file ) ( KDIR_IMPL *self, KFile *f );
+    /* end minor version == 0 */
+
+    /* start minor version == 1 */
+    rc_t ( CC * date ) ( const KDIR_IMPL *self,
+        KTime_t * date, const char *path, va_list args );
+    rc_t ( CC * setdate ) ( KDIR_IMPL * self, bool recur,
+        KTime_t date, const char *path, va_list args );
+    struct KSysDir_v1* ( CC * get_sysdir ) ( const KDIR_IMPL *self );
+    /* end minor version == 1 */
+
+    /* start minor version == 2 */
+    rc_t ( CC * file_locator ) ( const KDIR_IMPL *self,
+        uint64_t *locator, const char *path, va_list args );
+    /* end minor version == 2 */
+
+    /* start minor version == 3 */
+    rc_t ( CC * file_phys_size ) ( const KDIR_IMPL *self,
+        uint64_t *phys_size, const char *path, va_list args );
+    rc_t ( CC * file_contiguous ) ( const KDIR_IMPL *self,
+        bool *contiguous, const char *path, va_list args );
+    /* end minor version == 3 */
+
+    /* ANY NEW ENTRIES MUST BE REFLECTED IN libs/kfs/directory.c
+       BY BOTH THE CORRESPONDING MESSAGE DISPATCH FUNCTION(s) AND
+       VTABLE VALIDITY CHECKS IN KDirectoryInit */
+};
+
+typedef struct KDirectory_vt_v2 KDirectory_vt_v2;
+struct KDirectory_vt_v2
+{
+    /* version == 2.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    void ( CC * destroy ) ( KDIRECTORY_V2_IMPL *self, ctx_t ctx );
+    void ( CC * visit ) ( const KDIRECTORY_V2_IMPL *self, ctx_t ctx, bool recur,
+        bool ( CC * f ) ( const KDirectory_v2 *dir, uint32_t type, const char *name, void *data ),
+        void *data, struct KPath const *path );
+    struct KPath * ( CC * resolve_path ) ( const KDIRECTORY_V2_IMPL *self, ctx_t ctx, bool absolute,
+        struct KPath const *path );
+    void ( CC * rename ) ( KDIRECTORY_V2_IMPL *self, ctx_t ctx, bool force, struct KPath const *from, struct KPath const *to );
+    void ( CC * remove ) ( KDIRECTORY_V2_IMPL *self, ctx_t ctx, bool force, struct KPath const *path );
+    void ( CC * clear_dir ) ( KDIRECTORY_V2_IMPL *self, ctx_t ctx, bool force, struct KPath const *path );
+    void ( CC * create_alias ) ( KDIRECTORY_V2_IMPL *self, ctx_t ctx, uint32_t access,
+        KCreateMode mode, struct KPath const *targ, struct KPath const *alias );
+    struct KFile_v2 * ( CC * create_file ) ( KDIRECTORY_V2_IMPL *self, ctx_t ctx, bool update,
+        uint32_t access, KCreateMode mode, struct KPath const *path );
+    void ( CC * create_dir ) ( KDIRECTORY_V2_IMPL *self, ctx_t ctx, uint32_t access,
+        KCreateMode mode, struct KPath const *path );
+
+    /* ANY NEW ENTRIES MUST BE REFLECTED IN libs/kfs/directory.c
+       BY BOTH THE CORRESPONDING MESSAGE DISPATCH FUNCTION(s) AND
+       VTABLE VALIDITY CHECKS IN KDirectoryInit */
+};
+
+union KDirectory_vt
+{
+    KDirectory_vt_v1 v1;
+    KDirectory_vt_v2 v2;
+};
+
+/* Init
+ *  initialize a newly allocated directory object
+ */
+KFS_EXTERN rc_t CC KDirectoryInit_v1 ( KDirectory_v1 *self, const KDirectory_vt *vt, 
+    const char * class_name, const char * path, bool update );
+
+/* DestroyFile
+ *  does whatever is necessary with an unreferenced file
+ */
+KFS_EXTERN rc_t CC KDirectoryDestroyFile_v1 ( const KDirectory_v1 *self, KFile_v1 *f );
+KFS_EXTERN void CC KDirectoryDestroyFile_v2 ( const KDirectory_v2 *self, ctx_t ctx, KFile_v2 *f );
+
+/* GetSysDir
+ *  returns an underlying system file object
+ */
+KFS_EXTERN struct KSysDir_v1* CC KDirectoryGetSysDir_v1 ( const KDirectory_v1 *self );
+KFS_EXTERN struct KSysDir_v2* CC KDirectoryGetSysDir_v2 ( const KDirectory_v2 *self, ctx_t ctx );
+
+
+/* RealPath
+ *  exposes functionality of system directory
+ */
+KFS_EXTERN rc_t CC KSysDirRealPath_v1 ( struct KSysDir_v1 const *self,
+    char *real, size_t bsize, const char *path, ... );
+KFS_EXTERN rc_t CC KSysDirVRealPath ( struct KSysDir_v1 const *self,
+    char *real, size_t bsize, const char *path, va_list args );
+
+#define KDirectoryInit NAME_VERS ( KDirectoryInit, KFILE_VERS )
+#define KDirectoryDestoryFile NAME_VERS ( KDirectoryDestoryFile, KFILE_VERS )
+#define KDirectoryGetSysDir NAME_VERS ( KDirectoryGetSysDir, KFILE_VERS )
+#define KSysDirRealPath NAME_VERS ( KSysDirRealPath, KFILE_VERS )
+
+
+/*--------------------------------------------------------------------------
+ * KArrayFile
+ *  an array-file is created from a KFile
+ */
+typedef union  KArrayFile_vt KArrayFile_vt;
+struct KArrayFile
+{
+    const KArrayFile_vt *vt;
+    KRefcount refcount;
+    uint8_t read_enabled;
+    uint8_t write_enabled;
+    uint8_t align [ 2 ];
+};
+
+#ifndef KARRAYFILE_IMPL
+#define KARRAYFILE_IMPL KArrayFile
+#endif
+
+typedef struct KArrayFile_vt_v1 KArrayFile_vt_v1;
+struct KArrayFile_vt_v1
+{
+    /* version number */
+    uint32_t maj, min;
+
+    /* start minor version == 0 */
+    rc_t ( CC * destroy ) ( KARRAYFILE_IMPL *self );
+    rc_t ( CC * dimensionality ) ( const KARRAYFILE_IMPL *self, uint8_t *dim );
+    rc_t ( CC * set_dimensionality ) ( KARRAYFILE_IMPL *self, uint8_t dim );
+    rc_t ( CC * dim_extents ) ( const KARRAYFILE_IMPL *self, uint8_t dim, uint64_t *extents );
+    rc_t ( CC * set_dim_extents ) ( KARRAYFILE_IMPL *self, uint8_t dim, uint64_t *extents );
+    rc_t ( CC * element_size ) ( const KARRAYFILE_IMPL *self, uint64_t *elem_bits );
+    rc_t ( CC * read ) ( const KARRAYFILE_IMPL *self, uint8_t dim,
+        const uint64_t *pos, void *buffer, const uint64_t *elem_count,
+        uint64_t *num_read );
+    rc_t ( CC * write ) ( KARRAYFILE_IMPL *self, uint8_t dim,
+        const uint64_t *pos, const void *buffer, const uint64_t *elem_count,
+        uint64_t *num_writ );
+    rc_t ( CC * get_meta ) ( const KARRAYFILE_IMPL *self, const char *key, 
+                             const KNamelist **list );
+
+    rc_t ( CC * read_v ) ( const KARRAYFILE_IMPL *self, uint8_t dim,
+        const uint64_t * pos, char * buffer, const uint64_t buffer_size,
+        uint64_t * num_read );
+
+    /* end minor version == 0 */
+};
+
+union KArrayFile_vt
+{
+    KArrayFile_vt_v1 v1;
+};
+
+/* Init
+ *  initialize a newly allocated array-file object
+ */
+KFS_EXTERN rc_t CC KArrayFileInit ( KArrayFile *self, const KArrayFile_vt *vt, 
+    bool read_enabled, bool write_enabled );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_impl_ */
diff --git a/interfaces/kfs/kfs-priv.h b/interfaces/kfs/kfs-priv.h
new file mode 100644
index 0000000..49bb6d1
--- /dev/null
+++ b/interfaces/kfs/kfs-priv.h
@@ -0,0 +1,99 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_priv_
+#define _h_kfs_priv_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * struct/class forwards
+ */
+struct KArrayFile;
+struct KDirectory;
+struct KDlset;
+struct KFile;
+struct KFile_v2;
+struct KNamelist;
+struct KPath;
+
+/* MakeFDFile
+ *  creates a file from a file-descriptor
+ *  not supported under Windows
+ */
+KFS_EXTERN rc_t CC KFileMakeFDFileRead ( struct KFile const **f, int fd );
+KFS_EXTERN rc_t CC KFileMakeFDFileWrite ( struct KFile **f, bool update, int fd );
+
+KFS_EXTERN struct KFile_v2 const * CC KFileMakeFDFileRead_v2 ( ctx_t ctx, int fd );
+KFS_EXTERN struct KFile_v2 * CC KFileMakeFDFileWrite_v2 ( ctx_t ctx, bool update, int fd );
+
+/* GetMeta
+ *  extracts metadata into a string-vector
+ *
+ *  "key"   [ IN ]  - the key which part of the metadata to retrieve
+ *
+ *  "list"  [ OUT ] - the metadata will be filled into this list
+ *
+ */
+KFS_EXTERN rc_t CC KArrayFileGetMeta ( struct KArrayFile const *self, const char *key,
+    const struct KNamelist **list );
+
+/* List
+ *  list the paths to the libraries in the set
+ */
+KFS_EXTERN rc_t CC KDlsetList ( struct KDlset const *self, struct KNamelist **list );
+
+
+#if WINDOWS
+
+/* PosixStringToSystemString
+ * converts posix path string to system path
+ *  "buffer" [ OUT ] - NUL terminated system path string
+ *  "bsize" [ IN ] - buffer length
+ *  "path" [ IN ] - NUL terminated posix path string
+ */
+KFS_EXTERN rc_t CC KDirectoryPosixStringToSystemString (
+    const struct KDirectory *self,
+    char *buffer, size_t bsize, const char *path, ... );
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_priv_ */
diff --git a/interfaces/kfs/lockfile.h b/interfaces/kfs/lockfile.h
new file mode 100644
index 0000000..ef83254
--- /dev/null
+++ b/interfaces/kfs/lockfile.h
@@ -0,0 +1,116 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_lockfile_
+#define _h_kfs_lockfile_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_kfs_defs_
+#include <kfs/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * KLockFile
+ *  a mutual exclusion lock on a file
+ *  the lock is acquired upon creation
+ *  and released upon destruction
+ *
+ * NB - only guaranteed to work when used from a single host
+ */
+typedef struct KLockFile KLockFile;
+
+
+/* AddRef
+ * Release
+ */
+KFS_EXTERN rc_t CC KLockFileAddRef ( const KLockFile *self );
+KFS_EXTERN rc_t CC KLockFileRelease ( const KLockFile *self );
+
+
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ *  interface extensions
+ */
+
+
+/* CreateLockFile
+ *  attempts to create a KLockFile
+ *
+ *  "lock" [ OUT ] - return parameter for newly created lock file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting lock file
+ */
+KFS_EXTERN rc_t CC KDirectoryCreateLockFile ( struct KDirectory *self,
+    KLockFile **lock, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVCreateLockFile ( struct KDirectory *self,
+    KLockFile **lock, const char *path, va_list args );
+
+
+/* CreateExclusiveAccessFile
+ *  opens a file with exclusive write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+KFS_EXTERN rc_t CC KDirectoryCreateExclusiveAccessFile ( struct KDirectory *self, struct KFile **f,
+    bool update, uint32_t access, KCreateMode mode, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVCreateExclusiveAccessFile ( struct KDirectory *self, struct KFile **f,
+    bool update, uint32_t access, KCreateMode mode, const char *path, va_list args );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_lockfile_ */
diff --git a/interfaces/kfs/manager.h b/interfaces/kfs/manager.h
new file mode 100644
index 0000000..559a1be
--- /dev/null
+++ b/interfaces/kfs/manager.h
@@ -0,0 +1,31 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_manager_
+#define _h_kfs_manager_
+
+
+#endif /* _h_kfs_manager_ */
diff --git a/interfaces/kfs/md5.h b/interfaces/kfs/md5.h
new file mode 100644
index 0000000..798f827
--- /dev/null
+++ b/interfaces/kfs/md5.h
@@ -0,0 +1,289 @@
+/*=======================================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_md5_
+#define _h_kfs_md5_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+
+/*--------------------------------------------------------------------------
+ * KMD5SumFmt
+ *  a formatter for reading or writing an md5sum-style checksum file
+ */
+typedef struct KMD5SumFmt KMD5SumFmt;
+
+
+/* AddRef
+ * Release
+ */
+KFS_EXTERN rc_t CC KMD5SumFmtAddRef ( const KMD5SumFmt *self );
+KFS_EXTERN rc_t CC KMD5SumFmtRelease ( const KMD5SumFmt *self );
+
+
+/* Make
+ *  creates a formatted accessor to textual checksum file
+ *  takes over ownership of "in"/"out" file reference
+ *
+ *  "in" [ IN ] - readable checksum input file
+ *  -OR-
+ *  "out" [ IN ] - writable checksum file. if readable as well,
+ *  its contents will be preserved.
+ */
+KFS_EXTERN rc_t CC KMD5SumFmtMakeRead ( const KMD5SumFmt **f, struct KFile const *in );
+KFS_EXTERN rc_t CC KMD5SumFmtMakeUpdate ( KMD5SumFmt **f, struct KFile *out );
+
+
+/* Count
+ *  return the number of checksums in file
+ */
+KFS_EXTERN rc_t CC KMD5SumFmtCount ( const KMD5SumFmt *self, uint32_t *count );
+
+
+/* Get
+ *  retrieve an indexed checksum line
+ *
+ *  "idx" [ IN ] - zero-based index of checksum to access
+ *
+ *  "path" [ OUT ] and "size" [ IN ] - return buffer for file path
+ *
+ *  "digest" [ OUT ] - return parameter for the MD5 checksum
+ *
+ *  "bin" [ OUT, NULL OKAY ] - true if fopen mode used to
+ *  calculate "digest" was binary, false if text. pertinent if
+ *  digest was calculated using DOS text mode.
+ */
+KFS_EXTERN rc_t CC KMD5SumFmtGet ( const KMD5SumFmt *self, uint32_t idx,
+    char *path, size_t size, uint8_t digest [ 16 ], bool *bin );
+
+
+/* Find
+ *  retrieve checksum line by path
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  "digest" [ OUT ] - return parameter for the MD5 checksum
+ *
+ *  "bin" [ OUT, NULL OKAY ] - true if fopen mode used to
+ *  calculate "digest" was binary, false if text. pertinent if
+ *  digest was calculated using DOS text mode.
+ */
+KFS_EXTERN rc_t CC KMD5SumFmtFind ( const KMD5SumFmt *self,
+    const char *path, uint8_t digest [ 16 ], bool *bin );
+
+
+/* Delete
+ *  remove an existing line
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  returns rcNotFound if not present
+ */
+KFS_EXTERN rc_t CC KMD5SumFmtDelete ( KMD5SumFmt *self, const char *path );
+
+
+/* Update
+ *  add a checksum line to file or update an existing line
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  "digest" [ IN ] - calculated MD5 checksum
+ *
+ *  "bin" [ IN ] - true if checksum was calculated on all bytes
+ *  in file, false if fopen mode used to read file was text.
+ *
+ * NB - the md5sum tool operates with the assumption that files
+ *  are opened using "fopen". it records the mode used by prepending
+ *  '*' to indicate binary and ' ' to indicate text mode within the
+ *  checksum line.
+ *
+ *  unfortunately, this creates a situation where text-mode files
+ *  checksummed on DOS cannot be properly checked on any other
+ *  platform without the aid of some filter to drop out '\r' from
+ *  a '\r\n' sequence.
+ *
+ *  fortunately, most users are unaware of the binary/text mode
+ *  switches available with md5sum and use the default mode, which
+ *  is binary on DOS and text on Unix, which happens to be equivalent
+ *  to binary ( making one wonder why binary is not instead the
+ *  universal default ).
+ *
+ *  the end result is that we need to indicate whether CR stripping
+ *  was performed while at the same time behaving like md5sum.
+ */
+KFS_EXTERN rc_t CC KMD5SumFmtUpdate ( KMD5SumFmt *self, const char *path,
+    const uint8_t digest [ 16 ], bool bin );
+
+/* Rename
+ * Rename the checksum line to reflect a file name change but no content change.
+ *
+ *  "newpath" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file's new name
+ *
+ *  "oldpath" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file's old name
+ *
+ * Parameter order matches KDirectoryRename()
+ */
+KFS_EXTERN rc_t CC KMD5SumFmtRename ( KMD5SumFmt *self, const char *oldpath, const char *newpath );
+
+
+/* Flush
+ *  write data to disk, but stay open
+ */
+KFS_EXTERN rc_t CC KMD5SumFmtFlush ( KMD5SumFmt *self );
+
+
+/*--------------------------------------------------------------------------
+ * MD5 KFile extensions
+ */
+
+/* MakeMD5Read
+ *  creates an adapter to check MD5 checksum for a source file
+ *
+ *  "f" [ OUT ] - return parameter for file with md5 check
+ *
+ *  "src" [ IN ] - source file with read permission
+ *
+ *  "digest" [ IN ] - MD5 checksum to match
+ *
+ * NB - creates a read-only file that does NOT support random access
+ *  i.e. must be consumed serially starting from offset 0
+ */
+KFS_EXTERN rc_t CC KFileMakeMD5Read ( struct KFile const **f,
+    struct KFile const *src, const uint8_t digest [ 16 ] );
+
+    
+/*--------------------------------------------------------------------------
+ * KMD5File
+ *  subclass of KFile
+ */
+typedef struct KMD5File KMD5File;
+
+
+/* MakeWrite
+ * MakeAppend
+ *  creates an adapter to create MD5 checksum for a file
+ *
+ *  "f" [ OUT ] - return parameter for file with md5 check
+ *
+ *  "out" [ IN ] - output file with write permission
+ *  since this file is being wrapped by "f", ownership of
+ *  the provided reference is transferred to "f"
+ *
+ *  "md5" [ IN ] - md5 checksum output formatter.
+ *  since this may be used for multiple checksums, "f" will
+ *  attach its own reference to "md5".
+ *
+ *  "path" [ IN ] - md5 checksum output file path, used to
+ *  create standard md5sum file entry.
+ *
+ * NB - creates a write-only file that does NOT suppport random access
+ *  i.e. must be written serially from offset 0
+ */
+KFS_EXTERN rc_t CC KMD5FileMakeWrite ( KMD5File **f,
+    struct KFile *out, KMD5SumFmt *md5, const char *path );
+KFS_EXTERN rc_t CC KMD5FileMakeAppend ( KMD5File **f,
+    struct KFile *out, KMD5SumFmt *md5, const char *path );
+
+/* MakeReadNew
+ *  creates an adapter to create MD5 checksum for a file
+ *
+ *  "f" [ OUT ] - return parameter for file with md5 check
+ *
+ *  "in" [ IN ] - input file 
+ *  since this file is being wrapped by "f", ownership of
+ *  the provided reference is transferred to "f"
+ *
+ *  "md5" [ IN ] - md5 checksum output formatter.
+ *  since this may be used for multiple checksums, "f" will
+ *  attach its own reference to "md5".
+ *
+ *  "path" [ IN ] - md5 checksum output file path, used to
+ *  create standard md5sum file entry.
+ *
+ * NB - creates a write-only file that does NOT suppport random access
+ *  i.e. must be written serially from offset 0
+ */
+KFS_EXTERN rc_t CC KFileMakeNewMD5Read ( const struct KFile **fp,
+    const struct KFile *in, KMD5SumFmt *md5, const char *path );
+
+
+/* ToKFile
+ *  an MD5 file is a subclass of KFile
+ *  this is an explicit cast operator
+ */
+KFS_EXTERN struct KFile* CC KMD5FileToKFile ( KMD5File *self );
+KFS_EXTERN struct KFile const* CC KMD5FileToKFileConst ( const KMD5File *self );
+
+/* BeginTransaction
+ *  preserve current MD5 state and file marker
+ *  in preparation for rollback
+ */
+KFS_EXTERN rc_t CC KMD5FileBeginTransaction ( KMD5File *self );
+
+
+/* Commit
+ *  accept current MD5 state as correct
+ */
+KFS_EXTERN rc_t CC KMD5FileCommit ( KMD5File *self );
+
+
+/* Revert
+ *  reset state to previous transaction boundary conditions
+ */
+KFS_EXTERN rc_t CC KMD5FileRevert ( KMD5File *self );
+
+/* Reset
+ *  reset state to that of an empty file
+ *  aborts any open transaction
+ */
+KFS_EXTERN rc_t CC KMD5FileReset ( KMD5File *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_md5_ */
diff --git a/interfaces/kfs/mmap.h b/interfaces/kfs/mmap.h
new file mode 100644
index 0000000..ca442d8
--- /dev/null
+++ b/interfaces/kfs/mmap.h
@@ -0,0 +1,134 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_mmap_
+#define _h_kfs_mmap_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+
+/*--------------------------------------------------------------------------
+ * KMMap
+ *  a memory mapped region
+ */
+typedef struct KMMap KMMap;
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KFS_EXTERN rc_t CC KMMapAddRef ( const KMMap *self );
+KFS_EXTERN rc_t CC KMMapRelease ( const KMMap *self );
+
+/* Size
+ *  returns size of memory region
+ *
+ *  "size" [ OUT ] - return parameter for region size
+ */
+KFS_EXTERN rc_t CC KMMapSize ( const KMMap *self, size_t *size );
+
+/* Position
+ *  returns region starting offset into mapped file
+ *
+ *  "pos" [ OUT ] - return parameter for file offset
+ */
+KFS_EXTERN rc_t CC KMMapPosition ( const KMMap *self, uint64_t *pos );
+
+/* Reposition
+ *  shift region to a new position
+ *  may change region size
+ *
+ *  "pos" [ IN ] - new starting position for region
+ *
+ *  "size" [ OUT, NULL OKAY ] - optional return parameter
+ *  for resultant region size
+ */
+KFS_EXTERN rc_t CC KMMapReposition ( const KMMap *self, uint64_t pos, size_t *size );
+
+/* Addr
+ *  returns starting address of memory region
+ *
+ *  "addr" [ OUT ] - return parameter for memory address
+ */
+KFS_EXTERN rc_t CC KMMapAddrRead ( const KMMap *self, const void **addr );
+KFS_EXTERN rc_t CC KMMapAddrUpdate ( KMMap *self, void **addr );
+
+/* Make
+ *  maps entire file
+ *
+ *  "f" [ IN ] - file to map.
+ *  a new reference will be added
+ */
+KFS_EXTERN rc_t CC KMMapMakeRead ( const KMMap **mm, struct KFile const *f );
+KFS_EXTERN rc_t CC KMMapMakeUpdate ( KMMap **mm, struct KFile *f );
+
+/* MakeMax
+ *  maps as much of a file as possible
+ *
+ *  "f" [ IN ] - file to map.
+ *  a new reference will be added
+ */
+KFS_EXTERN rc_t CC KMMapMakeMaxRead ( const KMMap **mm, struct KFile const *f );
+KFS_EXTERN rc_t CC KMMapMakeMaxUpdate ( KMMap **mm, struct KFile *f );
+
+/* MakeRgn
+ *  maps a portion of a file
+ *
+ *  "f" [ IN ] - file to map
+ *  a new reference will be added
+ *
+ *  "pos" [ IN ] - starting offset into file
+ *
+ *  "size" [ IN, DEFAULT ZERO ] - size of resulting region. if 0,
+ *  the size will be interpreted as meaning size of "f" - "pos".
+ */
+KFS_EXTERN rc_t CC KMMapMakeRgnRead ( const KMMap **mm,
+    struct KFile const *f, uint64_t pos, size_t size );
+KFS_EXTERN rc_t CC KMMapMakeRgnUpdate ( KMMap **mm,
+    struct KFile *f, uint64_t pos, size_t size );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_mmap_ */
diff --git a/interfaces/kfs/nullfile.h b/interfaces/kfs/nullfile.h
new file mode 100644
index 0000000..35bf866
--- /dev/null
+++ b/interfaces/kfs/nullfile.h
@@ -0,0 +1,62 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_nullfile_
+#define _h_kfs_nullfile_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFile;
+
+typedef struct KNullFile KNullFile;
+
+/* -----
+ * Copy can be a serialized type KFile for a KNullFile opened for Read but
+ * not when opened for write.
+ *
+ * Specifically this means copy can be a KMD5File for read but not for write
+ * other KFile nulltypes might have the same restriction.
+ *
+ * A seekless update KNullfile can be created but does not now exist.
+ */
+KFS_EXTERN rc_t CC KFileMakeNullRead (const struct KFile ** self);
+KFS_EXTERN rc_t CC KFileMakeNullUpdate (struct KFile ** self);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_nullfile_ */
diff --git a/interfaces/kfs/pagefile.h b/interfaces/kfs/pagefile.h
new file mode 100644
index 0000000..3183576
--- /dev/null
+++ b/interfaces/kfs/pagefile.h
@@ -0,0 +1,191 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_pagefile_
+#define _h_kfs_pagefile_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+
+/*--------------------------------------------------------------------------
+ * KPage
+ *  a reference counted page
+ */
+typedef struct KPage KPage;
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KFS_EXTERN rc_t CC KPageAddRef ( const KPage *self );
+KFS_EXTERN rc_t CC KPageRelease ( const KPage *self );
+
+
+/* Id
+ *  returns page id
+ *
+ *  "page_id" [ OUT ] - return parameter for page id
+ */
+KFS_EXTERN rc_t CC KPageId ( const KPage *self, uint32_t *page_id );
+
+
+/* ConstSize
+ *  returns constant page size
+ */
+KFS_EXTERN size_t CC KPageConstSize ( void );
+
+
+/* AccessRead
+ * AccessUpdate
+ *  gain access to page memory
+ *  update access marks page as modified
+ *
+ *  "mem" [ OUT ] - pointer to page
+ *
+ *  "bytes" [ OUT, NULL OKAY ] - page size in bytes
+ */
+KFS_EXTERN rc_t CC KPageAccessRead ( const KPage *self, const void **mem, size_t *bytes );
+KFS_EXTERN rc_t CC KPageAccessUpdate ( KPage *self, void **mem, size_t *bytes );
+
+
+/*--------------------------------------------------------------------------
+ * KPageFile
+ *  presents some level of page management on top of a random-access KFile
+ */
+typedef struct KPageFile KPageFile;
+
+
+/* Make
+ *  creates a page file
+ *
+ *  "pf" [ OUT ] - return parameter for page file
+ *
+ *  "backing" [ IN ] - backing file
+ *   NB - attaches a new reference to file
+ *        does not take ownership
+ *
+ *  "climit" [ IN ] - cache size limit
+ *
+ *  "write_through" [ IN ] - if true, causes page flushing
+ *  on each KPageRelease message if modified.
+ */
+KFS_EXTERN rc_t CC KPageFileMakeRead ( const KPageFile **pf,
+    struct KFile const *backing, size_t climit );
+KFS_EXTERN rc_t CC KPageFileMakeUpdate ( KPageFile **pf,
+    struct KFile *backing, size_t climit, bool write_through );
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KFS_EXTERN rc_t CC KPageFileAddRef ( const KPageFile *self );
+KFS_EXTERN rc_t CC KPageFileRelease ( const KPageFile *self );
+
+
+/* Size
+ *  returns size in bytes of file and cache
+ *
+ *  "lsize" [ OUT, NULL OKAY ] - return parameter for logical size
+ *
+ *  "fsize" [ OUT, NULL OKAY ] - return parameter for file size
+ *
+ *  "csize" [ OUT, NULL OKAY ] - return parameter for cache size
+ */
+KFS_EXTERN rc_t CC KPageFileSize ( const KPageFile *self,
+    uint64_t *lsize, uint64_t *fsize, size_t *csize );
+
+
+/* SetSize
+ *  extends or truncates underlying file
+ *  may affect cache contents
+ *
+ *  "size" [ IN ] - logical size
+ */
+KFS_EXTERN rc_t CC KPageFileSetSize ( KPageFile *self, uint64_t size );
+
+
+/* Alloc
+ *  allocates a new page
+ *  the page will be zeroed and initially unmodified
+ *
+ *  "page" [ OUT ] - return parameter for page object
+ *
+ *  "page_id" [ OUT, NULL OKAY ] - optional return parameter for page id
+ */
+KFS_EXTERN rc_t CC KPageFileAlloc ( KPageFile *self, KPage **page, uint32_t *page_id );
+
+
+/* Get
+ *  returns an existing page
+ *
+ *  "page" [ OUT ] - return parameter for page object
+ *
+ *  "page_id" [ IN ] - id of page to retrieve
+ */
+KFS_EXTERN rc_t CC KPageFileGet ( KPageFile *self, KPage **page, uint32_t page_id );
+
+
+/* PosGet
+ *  returns a page corresponding to position
+ *
+ *  "page" [ OUT ] - return parameter for page object
+ *
+ *  "offset" [ IN ] - offset to a byte within file
+ */
+KFS_EXTERN rc_t CC KPageFilePosGet ( KPageFile *self, KPage **page, uint64_t offset );
+
+
+/* DropBacking
+ *  used immediately prior to releasing
+ *  prevents modified pages from being flushed to disk
+ *  renders object nearly useless
+ */
+KFS_EXTERN rc_t CC KPageFileDropBacking ( KPageFile *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_pagefile_ */
diff --git a/interfaces/kfs/path-priv.h b/interfaces/kfs/path-priv.h
new file mode 100644
index 0000000..2e676a7
--- /dev/null
+++ b/interfaces/kfs/path-priv.h
@@ -0,0 +1,32 @@
+/*===========================================================================
+*
+*                            Public Domain Notice
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_path_priv_
+#define _h_kfs_path_priv_
+
+DO NOT USE
+
+#endif /* _h_kfs_path_priv_ */
diff --git a/interfaces/kfs/path.h b/interfaces/kfs/path.h
new file mode 100644
index 0000000..91949a0
--- /dev/null
+++ b/interfaces/kfs/path.h
@@ -0,0 +1,32 @@
+/*===========================================================================
+*
+*                            Public Domain Notice
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_path_
+#define _h_kfs_path_
+
+DO NOT USE
+
+#endif /* _h_kfs_path_ */
diff --git a/interfaces/kfs/pmem.h b/interfaces/kfs/pmem.h
new file mode 100644
index 0000000..3cffff1
--- /dev/null
+++ b/interfaces/kfs/pmem.h
@@ -0,0 +1,156 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_pmem_
+#define _h_kfs_pmem_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KPageFile;
+
+
+/*--------------------------------------------------------------------------
+ * KMemBank
+ *  manages simple blocks of memory
+ *  optionally backed by a persistent page file
+ */
+typedef struct KMemBank KMemBank;
+
+
+/* Make
+ *  make a memory bank with a fixed block size
+ *  the total amount of memory may be limited
+ *  the memory may be drawn from an externally supplied page file
+ *
+ *  "block_size" [ IN ] - ignored
+ *
+ *  "limit" [ IN, DFLT ZERO ] - ignored
+ *
+ *  "backing" [ IN ] - a page source for allocator.
+ *  a new reference will be added if not null.
+ */
+KFS_EXTERN rc_t CC KMemBankMake ( KMemBank **bank,
+    size_t block_size, uint64_t limit, struct KFile *backing );
+
+
+/* AddRef
+ * Release
+ */
+KFS_EXTERN rc_t CC KMemBankAddRef ( const KMemBank *self );
+KFS_EXTERN rc_t CC KMemBankRelease ( const KMemBank *self );
+
+
+/* Alloc
+ *  allocate memory
+ *
+ *  "id" [ OUT ] - return parameter for memory allocation id
+ *
+ *  "bytes" [ IN ] - the number of bytes to allocate
+ *
+ *  "clear" [ IN ] - if true, initialize the memory to zero
+ */
+KFS_EXTERN rc_t CC KMemBankAlloc ( KMemBank *self,
+    uint64_t *id, uint64_t bytes, bool clear );
+
+
+/* Free
+ *  free memory
+ *
+ *  "id" [ IN, ZERO OKAY ] - id of the allocation to be freed
+ */
+KFS_EXTERN rc_t CC KMemBankFree ( KMemBank *self, uint64_t id );
+
+
+/* Size
+ *  returns the allocated capacity of the memory object
+ *
+ *  "id" [ IN ] - id of the allocation
+ *
+ *  "size" [ OUT ] - return parameter
+ */
+KFS_EXTERN rc_t CC KMemBankSize ( const KMemBank *self, uint64_t id, uint64_t *size );
+
+
+/* SetSize
+ *  performs a reallocation of memory object
+ *
+ *  "id" [ IN ] - id of the allocation being resized
+ *
+ *  "size" [ IN ] - new capacity
+ */
+KFS_EXTERN rc_t CC KMemBankSetSize ( KMemBank *self, uint64_t id, uint64_t size );
+
+
+/* Read
+ *  linearly access memory
+ *
+ *  "id" [ IN ] - id of the allocation being read
+ *
+ *  "pos" [ IN ] - starting offset into allocation
+ *
+ *  "buffer" [ IN ] and "bsize" [ IN ] - buffer for returned data
+ *
+ *  "num_read" [ OUT ] - return parameter for the number of bytes read
+ */
+KFS_EXTERN rc_t CC KMemBankRead ( const KMemBank *self, uint64_t id,
+   uint64_t pos, void *buffer, size_t bsize, size_t *num_read );
+
+
+/* Write
+ *  linearly update memory
+ *  will resize as required
+ *
+ *  "id" [ IN ] - id of the allocation being writ
+ *
+ *  "pos" [ IN ] - starting offset into allocation
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to write
+ *
+ *  "num_writ" [ OUT ] - return parameter for the number of bytes written
+ */
+KFS_EXTERN rc_t CC KMemBankWrite ( KMemBank *self, uint64_t id,
+    uint64_t pos, const void *buffer, size_t size, size_t *num_writ );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_pmem_ */
diff --git a/interfaces/kfs/quickmount.h b/interfaces/kfs/quickmount.h
new file mode 100644
index 0000000..6ecbaef
--- /dev/null
+++ b/interfaces/kfs/quickmount.h
@@ -0,0 +1,61 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_quick_mount_
+#define _h_kfs_quick_mount_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KDirectory;
+struct KFile;
+
+typedef struct KQuickMountDir KQuickMountDir;
+
+/* OpenQuickMountDirRead
+ *
+ */
+KFS_EXTERN rc_t KQuickMountDirMake (const struct KDirectory * self, 
+                                    const struct KDirectory ** pnewdir,
+                                    const struct KFile * file,
+                                    const char * path, size_t path_size,
+                                    const char * mount, size_t mount_size);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_quick_mount_ */
diff --git a/interfaces/kfs/ramfile.h b/interfaces/kfs/ramfile.h
new file mode 100644
index 0000000..65957b1
--- /dev/null
+++ b/interfaces/kfs/ramfile.h
@@ -0,0 +1,75 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_ramfile_
+#define _h_kfs_ramfile_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFile;
+
+typedef struct KRamFile KRamFile;
+
+/* -----
+ * fakes file reads and writes into a buffer
+ *
+ * writes never fail. Acts like a sliding window from previous writes of possible
+ * reads only succeed of they are from what was contained in the last write
+ *
+ * zero fills are put in where possible. If you write a buffer, slide the window with 
+ * a write that doesn't fill the buffer, the rest will be zero not what was previously written
+ *
+ * The Read only form doesn;t allow writes but will reflect what was put in
+ * the buffer outside of the KFile
+ *
+ * The write only will accept writes but can only be accessed outside of the KFile.
+ *
+ * The update form tries its best to give what was asked for [see above]
+ */
+KFS_EXTERN rc_t CC KRamFileMakeRead (const struct KFile ** self,
+                                     char * buffer, size_t buffer_size);
+
+KFS_EXTERN rc_t CC KRamFileMakeWrite (struct KFile ** self,
+                                      char * buffer, size_t buffer_size);
+
+KFS_EXTERN rc_t CC KRamFileMakeUpdate (struct KFile ** self,
+                                       char * buffer, size_t buffer_size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_ramfile_ */
diff --git a/interfaces/kfs/readheadfile.h b/interfaces/kfs/readheadfile.h
new file mode 100644
index 0000000..1cd47a1
--- /dev/null
+++ b/interfaces/kfs/readheadfile.h
@@ -0,0 +1,86 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_readheadfile_
+#define _h_kfs_readheadfile_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards allowing opaque class typing
+ */
+struct KFile;
+
+
+/* MakeReadHead
+ *  make a read-only file where we buffer only the first part of the file
+ *  this is pretty much only needed to type a file when we don't know
+ *  or want to see if we can acess randomly.  This is a fairly smart type
+ *  that will take ownership of the pointer to the 'original' KFile
+ *  reference.  If it finds that the 'original' KFile is seekable (has
+ *  random access) it will merely return a reference to that const KFile *
+ *  rather than creating a new KFile that will in most cases pass through 
+ *  all method calls to the original.
+ *
+ *  This type was created primarily to allow the reading of the first part
+ *  of a file for type recognition with out forcing numerous cases of
+ *  duplicated code to check for random access on an existing KFile reference
+ *  and handling of the pre-read in the application.
+ *
+ *  This class is intended for files that once typed will be read straight
+ *  through.  If more random access to the file is needed the KBufFile is 
+ *  indicated rather than this one.  If a straight through access is needed
+ *  this is a far lighter weight solution than KBufFile.
+ *
+ *  A references is added to the original even if it becomes used as the new
+ *  file because it allows random access.
+ *
+ *  "buf" [ OUT ] - return parameter for new buffered file
+ *
+ *  "original" [ IN ] - source file to be buffered. must have read access
+ *
+ *  "bsize" [ IN ] - buffer size
+ */
+KFS_EXTERN 
+rc_t CC KFileMakeReadHead (const struct KFile ** pself,
+                           const struct KFile * original,
+                           size_t buffer_size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_readheadfile_ */
diff --git a/interfaces/kfs/sra.h b/interfaces/kfs/sra.h
new file mode 100644
index 0000000..c312b59
--- /dev/null
+++ b/interfaces/kfs/sra.h
@@ -0,0 +1,191 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_sra_
+#define _h_kfs_sra_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#include <klib/defs.h>
+
+#include <stdarg.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This file provides documentation and symbols for the single file archive
+ * format originally created for the SRA project.
+ */
+
+/*
+ * filler bytes before data files can be inserted to make the start line
+ * up on specified boundaries.  By using a single bit approach for the values
+ * we get the bit-wise not of the mask that must be met for the start of the file.
+ * Or one more than the maximum number of inserted bytes.  This is only used on
+ * creation of the file and has no bearing at all on the parsing afterwards.
+ * In it's only use so far any bit in a 32 bit bit number could be used not
+ * just these enumerated values.  
+ */
+typedef uint32_t KSRAFileAlignment;
+enum eKSRAFileAlignment
+{
+    /* align on byte count unit boundaries
+     * set this to the number of bytes in the alignment unit
+     */
+    sraAlignInvalid = 0,
+    sraAlign1Byte = 1,
+    sraAlign2Byte = 2,
+    sraAlign4Byte = 4,
+    sraAlign8Byte = 8,
+    sraAlign16Byte = 16,
+    sraAlign32Byte = 32,
+    sraAlign64Byte = 64
+};
+
+/* ======================================================================
+ *
+ * SRA File Format
+ */
+typedef uint32_t SraEndian_t;
+/* enum fails to handle these due to integer overflow */
+#define eSraByteOrderTag     0x05031988
+#define eSraByteOrderReverse 0x88190305
+
+
+
+
+typedef struct KSraHeader KSraHeader;
+struct KSraHeader
+{
+    /* the first two fields are byte endian agnostic - they are low to high as shown */
+    uint8_t	ncbi[4];                /* 'N', 'C', 'B', 'I' */
+    uint8_t	sra[4];                 /* '.', 's', 'r', 'a' */
+    /* this field lets you determine the byte order of the file */
+    SraEndian_t	byte_order;
+    /* not a ver_t - this is a 4 byte integer with no subfields */
+    uint32_t	version;
+    union 
+    {
+        struct
+        {
+            /* the only header field in the first version is the data offset */
+            uint64_t	file_offset;
+        } v1;
+    } u;
+};
+
+/* ======================================================================
+ * Header format structures
+ *
+ */
+
+
+
+#define FS_SRA_CUR_VERSION 1
+KFS_EXTERN size_t CC SraHeaderSize ( const KSraHeader * self );
+
+KFS_EXTERN uint64_t CC SraHeaderGetFileOffset (const KSraHeader * self);
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct KDirectory;
+struct KToc;
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ *  SRA-specific extensions
+ */
+
+/* KArcParseSRA
+ *	A parse function for sra files suitable for KDirectoryOpenArcDirRead
+ *
+ * [INOUT] KArcTOC*	self	The TOC (table of contents) to fill in with the parse
+ * [IN]    const KFile*	kfile	The opened (as KFile) archive to parse.
+ */
+KFS_EXTERN rc_t CC KArcParseSRA ( struct KToc * self,
+                                  const void * kvoid,
+                                  bool (CC*ignored) (const struct KDirectory*,  const char*, void*),
+                                  void *ignored_data);
+KFS_EXTERN rc_t CC KArcParseSRAUnbounded ( struct KToc * self,
+                                           const void * kvoid,
+                                           bool (CC*ignored) (const struct KDirectory*,  const char*, void*),
+                                           void *ignored_data);
+
+KFS_EXTERN rc_t CC KArcParseKDir( struct KToc * self,
+                                  const void * kdir,
+                                  bool(CC*f)(const struct KDirectory*,const char *, void*),
+                                  void *filterparam);
+
+
+/* KDirectoryOpenSraArchive
+ *  opens a named SRA archive
+ *
+ *  "sra_dir" [ OUT ] - return parameter for archive
+ *
+ *  "chroot" [ IN ] - if non-zero, the new directory becomes
+ *  chroot'd and will interpret paths beginning with '/'
+ *  relative to itself.
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting sraget archive
+ */
+KFS_EXTERN rc_t CC KDirectoryOpenSraArchiveRead ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVOpenSraArchiveRead ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, va_list args );
+KFS_EXTERN rc_t CC KDirectoryOpenSraArchiveRead_silent ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVOpenSraArchiveRead_silent ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, va_list args );
+KFS_EXTERN rc_t CC KDirectoryOpenSraArchiveRead_silent_preopened ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const struct KFile * f, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVOpenSraArchiveRead_silent_preopened ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const struct KFile * f, const char *path, va_list args );
+KFS_EXTERN rc_t CC KDirectoryOpenSraArchiveReadUnbounded_silent_preopened ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const struct KFile * f, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVOpenSraArchiveReadUnbounded_silent_preopened ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const struct KFile * f, const char *path, va_list args );
+/* copycat needs an unbounded version - that is filesize is not necessarily known
+ * this is unsafe for most other uses */
+KFS_EXTERN rc_t CC KDirectoryOpenSraArchiveReadUnbounded ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, ... );
+KFS_EXTERN rc_t CC KDirectoryVOpenSraArchiveReadUnbounded ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, va_list args );
+
+KFS_EXTERN rc_t CC KFileIsSRA (const char * b, size_t z);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_sra_ */
diff --git a/interfaces/kfs/subfile.h b/interfaces/kfs/subfile.h
new file mode 100644
index 0000000..bad2c5b
--- /dev/null
+++ b/interfaces/kfs/subfile.h
@@ -0,0 +1,64 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_subfile_
+#define _h_kfs_subfile_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFile;
+
+typedef struct KSubFile KSubFile;
+
+/* -----
+ * Copy can be a serialized type KFile for a KSubFile opened for Read but
+ * not when opened for write.
+ *
+ * Specifically this means copy can be a KMD5File for read but not for write
+ * other KFile subtypes might have the same restriction.
+ *
+ * A seekless update KSubfile can be created but does not now exist.
+ */
+KFS_EXTERN rc_t CC KFileMakeSubRead (const struct KFile ** self, const struct KFile * original,
+			uint64_t start_position, uint64_t size);
+KFS_EXTERN rc_t CC KFileMakeSubUpdate (struct KFile ** self, struct KFile * original,
+			uint64_t start_position, uint64_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_subfile_ */
diff --git a/interfaces/kfs/szip.h b/interfaces/kfs/szip.h
new file mode 100644
index 0000000..beef303
--- /dev/null
+++ b/interfaces/kfs/szip.h
@@ -0,0 +1,77 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_szip_
+#define _h_kfs_szip_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+/* MakeSzipForRead
+ *  creates an adapter to gunzip a source file
+ *
+ *  "sz" [ OUT ] - return parameter for decompressed file
+ *
+ *  "src" [ IN ] - compressed source file with read permission
+ *
+ * NB - creates a read-only file that does NOT support random access
+ *  i.e. must be consumed serially starting from offset 0
+ */
+KFS_EXTERN rc_t CC KFileMakeSzipForRead ( struct KFile const **sz, struct KFile const *src );
+
+
+/* MakeSzipForWrite
+ *  creates an adapter to gzip a source file
+ *
+ *  "sz" [ OUT ] - return parameter for compressed file
+ *
+ *  "src" [ IN ] - uncompressed source file with write permission
+ *
+ * NB - creates a write-only file that does NOT suppport random access
+ *  i.e. must be written serially from offset 0
+ */
+KFS_EXTERN rc_t CC KFileMakeSzipForWrite ( struct KFile **sz, struct KFile *file );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_szip_ */
diff --git a/interfaces/kfs/tar.h b/interfaces/kfs/tar.h
new file mode 100644
index 0000000..96d8c63
--- /dev/null
+++ b/interfaces/kfs/tar.h
@@ -0,0 +1,94 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_tar_
+#define _h_kfs_tar_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct KDirectory;
+struct KToc;
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ *  TAR-specific extensions
+ */
+
+/* ParseTAR
+ *  A parse function for tar files suitable for KDirectoryOpenArcDirRead
+ *
+ * [INOUT] KToc*    self    The TOC (table of contents) to fill in with the parse
+ * [IN]    const KFile* kfile   The opened (as KFile) archive to parse.
+ */
+KFS_EXTERN rc_t CC KArcParseTAR( struct KToc * self, 
+                                 const void * kfile,
+                                 bool(CC*f)(const struct KDirectory*,const char *, void*),
+                                 void *filterparam);
+
+/* KDirectoryOpenTarArchive
+ *  opens a named TAR archive
+ *
+ *  "tar_dir" [ OUT ] - return parameter for archive
+ *
+ *  "chroot" [ IN ] - if non-zero, the new directory becomes
+ *  chroot'd and will interpret paths beginning with '/'
+ *  relative to itself.
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target archive
+ */
+KFS_EXTERN int CC KDirectoryOpenTarArchiveRead ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const char *path, ... );
+KFS_EXTERN int CC KDirectoryVOpenTarArchiveRead ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const char *path, va_list args );
+
+KFS_EXTERN int CC KDirectoryOpenTarArchiveRead_silent ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const char *path, ... );
+KFS_EXTERN int CC KDirectoryVOpenTarArchiveRead_silent ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const char *path, va_list args );
+
+KFS_EXTERN int CC KDirectoryOpenTarArchiveRead_silent_preopened ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const struct KFile * f, const char *path, ... );
+KFS_EXTERN int CC KDirectoryVOpenTarArchiveRead_silent_preopened ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const struct KFile * f, const char *path, va_list args );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_tar_ */
diff --git a/interfaces/kfs/teefile.h b/interfaces/kfs/teefile.h
new file mode 100644
index 0000000..698e91c
--- /dev/null
+++ b/interfaces/kfs/teefile.h
@@ -0,0 +1,66 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_teefile_
+#define _h_kfs_teefile_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFile;
+
+typedef struct KTeeFile KTeeFile;
+
+/* -----
+ * Copy can be a serialized type KFile for a KTeeFile opened for Read but
+ * not when opened for write.
+ *
+ * Specifically this means copy can be a KMD5File for read but not for write
+ * other KFile subtypes might have the same restriction.
+ *
+ * A seekless update KTeefile can be created but does not now exist.
+ */
+KFS_EXTERN rc_t CC KFileMakeTeeRead (const struct KFile ** self, 
+                                     const struct KFile * original,
+                                     struct KFile * copy);
+KFS_EXTERN rc_t CC KFileMakeTeeUpdate (struct KFile ** self,
+                                       struct KFile * original,
+                                       struct KFile * copy);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_teefile_ */
diff --git a/interfaces/kfs/toc.h b/interfaces/kfs/toc.h
new file mode 100644
index 0000000..e0de152
--- /dev/null
+++ b/interfaces/kfs/toc.h
@@ -0,0 +1,148 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_toc_
+#define _h_kfs_toc_
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_klib_pbstree_
+#include <klib/pbstree.h>
+#endif
+
+#ifndef _h_kfs_sra_
+#include <kfs/sra.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*==========================================================================
+ * The TOC (Table of Contents) is the basis of non-O/S level file systems
+ * directory structures.
+ *
+ * The TOC is based on a set of entries.  An entry can represent a file
+ * (collection of bytes), a directory (a list of entries, or a link (an
+ * entry that refers to another entry).
+ *
+ * Files are represented either as a contiguous array of bytes or a
+ * sequence of smaller chunks of contiguous bytes.  Other than the initial
+ * creation of the chunked version, most operations on the chunked file
+ * will be able to treat it as a contiguous sequence with any gaps between
+ * contiguous chunks being treated as if they were all zero bytes.  So
+ * for the most part the two types of file are the same to the outside
+ * world.
+ *
+ * A directory is viewed as a sorted list of named references to files.
+ * In the first versions the form is of a binary search tree per directory
+ * but for the most part that detail is irrelevant.  In the tree a directory
+ * is an entry that contains its own tree.  A path is a sequence of named
+ * entries in order - the representation of a path is the Unix/Posix style
+ * path.
+ *
+ * A link is either a hard or soft link 9using Unix/Posix terminology. A
+ * soft link is a named item that contains a path that names another item.
+ * A hard link will as much as possible refer directly to the same file,
+ * directory or another link as another item.
+ *
+ * Each entry is represented by a TocEntry.
+ *
+ * A path as mentioned above is a list of facets (names of directories) up to
+ * a final leaf item that can be any of the item types.
+ *
+ * Position is the logical offset within a file or a particualr byte,  The
+ * first byte is at position 0.
+ */
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct BSTree;
+struct Vector;
+struct String;
+struct KFile;
+
+
+/*--------------------------------------------------------------------------
+ * KTocChunk
+ *  Describes a chunk of valid data within a file.  The concept is that a file
+ *  can be made up of discrete chunks that might not be consecutive on the 
+ *  storage system.  There might also be gaps between the chunks - gaps that 
+ *  read as all zeroes.  These could be tarred up versions of sparse files
+ *  where the only things stored on disk are small regions of non-zero data. 
+ *  Or it could be some archival format where data is broken into some form of
+ *  packets.
+ *
+ *  64 bit values are used for file sizes up to 18,446,744,073,709,551,617 bytes
+ *  up to exabytes.  The human genome is in the gigabyte range so 32 bit values
+ *  are too close to the limits so the larger range was used.
+ *
+ *  This struct is very clear and public so chunks can be built up or used  freely
+ *  by non-file-system specific code.
+ */
+typedef struct KTocChunk KTocChunk;
+struct KTocChunk
+{
+    /* position of chunk within logical file */
+    uint64_t logical_position;
+
+    /* position of chunk within source container file */
+    uint64_t source_position;
+
+    /* chunk size */
+    uint64_t size;
+};
+
+
+
+KFS_EXTERN rc_t CC KDirectoryOpenTocFileRead( const KDirectory * self,
+                                              struct KFile const ** pfile,
+                                              KSRAFileAlignment align,
+                                              bool (CC * filter) (const KDirectory*,const char*,void*),
+                                              void * filter_param,
+                                              rc_t (CC * usort)(const KDirectory*, struct Vector*) );
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_toc_ */
diff --git a/interfaces/kfs/wgaencrypt.h b/interfaces/kfs/wgaencrypt.h
new file mode 100644
index 0000000..2f479c8
--- /dev/null
+++ b/interfaces/kfs/wgaencrypt.h
@@ -0,0 +1,27 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#error "OBSOLETE do not use"
diff --git a/interfaces/klib/btree.h b/interfaces/klib/btree.h
new file mode 100644
index 0000000..399788f
--- /dev/null
+++ b/interfaces/klib/btree.h
@@ -0,0 +1,147 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_btree_
+#define _h_klib_btree_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * defines
+ */
+
+#define PGBITS 15
+#define PGSIZE ( 1U << PGBITS )
+    
+
+/* A pager must allocate pages of exactly 32k
+ * page id's can not be larger than 31 bits
+ * and page id's must be greater than zero
+ * thus the maximum amount of memory that a pager
+ * can provide is 32k * (2**31-1) = ~64G
+ * keys are stored compressed, so 64G can store a lot of keys.
+ *
+ * If you don't provide a pager, but you do provide a backing file
+ * KPageFile will be used to provide the paging.
+ * If you don't provide a pager or a backing file, pages will be
+ * provided by malloc, up to the given memory limit.
+ */
+typedef struct Pager Pager;
+    
+typedef struct Pager_vt Pager_vt;
+struct Pager_vt {
+    /* Pager and Pager_vt is expected to work like this:
+     *  uint32_t id = 0;
+     *  void const *page = vt->alloc(pager, &id);
+     *  if (page != NULL) {
+     *      void *content = vt->update(pager, page);
+     *      assert(contents != NULL);
+     *
+     *  ... // do something with page contents
+     *
+     *      vt->unuse(pager, page); contents = NULL; page = NULL;
+     *
+     *  ...
+     *
+     *      page = use(pager, id);
+     *      assert(page != NULL);
+     *      void const *data = vt->access(pager, page);
+     *      assert(data != NULL);
+     *
+     *      ...
+     *
+     *      vt->unuse(pager, page); data = NULL, page = NULL;
+     *  }
+     *  else {
+     *      // can't allocate anymore pages
+     *  }
+     */
+
+    /* it's reasonable for this function to fail, e.g. a pager may
+     * limit the number of pages that it's willing to hand out
+     */
+    void const *(*alloc)(Pager *self, uint32_t *newid);
+    
+    /* these functions can't fail in any meaningful sense
+     * these functions failing is like an assert or a sudden
+     * hardware failure, in other words, not recoverable.
+     */
+    void const *(*use   )(Pager *self, uint32_t pageid);
+    void const *(*access)(Pager *self, void const *page);
+    void       *(*update)(Pager *self, void const *page);
+    void        (*unuse )(Pager *self, void const *page);
+};
+
+/* Find
+ *  searches for a match
+ *
+ *  "key" [ IN ] and "key_size" [ IN ] - describes an
+ *   opaque key
+ */
+KLIB_EXTERN rc_t CC BTreeFind ( uint32_t root, Pager *pager, Pager_vt const *vt, uint32_t *id,
+    const void *key, size_t key_size );
+
+
+/* Entry
+ *  searches for a match or creates a new entry
+ *
+ *  "was_inserted" [ OUT ] - if true, the returned value was the result of an
+ *   insertion and can be guaranteed to be all 0 bits. otherwise, the returned
+ *   value will be whatever was there previously.
+ *
+ *  "key" [ IN ] and "key_size" [ IN ] - describes an
+ *   opaque key
+ */
+KLIB_EXTERN rc_t CC BTreeEntry ( uint32_t *root, Pager *pager, Pager_vt const *vt, uint32_t *id,
+    bool *was_inserted, const void *key, size_t key_size );
+
+/* ForEach
+ *  executes a function on each tree element
+ *
+ *  "reverse" [ IN ] - if true, iterate in reverse order
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - callback function
+ */
+
+KLIB_EXTERN rc_t CC BTreeForEach ( uint32_t root, Pager *pager, Pager_vt const *vt, bool reverse,
+                                 void ( CC * f ) ( const void *key, size_t key_size, uint32_t id, void *data ), void *data );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_klib_btree_ */
diff --git a/interfaces/klib/callconv.h b/interfaces/klib/callconv.h
new file mode 100644
index 0000000..34eafc6
--- /dev/null
+++ b/interfaces/klib/callconv.h
@@ -0,0 +1,34 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_callconv_
+#define _h_klib_callconv_
+
+#ifndef _h_kfc_callconv_
+#include <kfc/callconv.h>
+#endif
+
+#endif /*  _h_klib_callconv_ */
diff --git a/interfaces/klib/checksum.h b/interfaces/klib/checksum.h
new file mode 100644
index 0000000..5c38ee8
--- /dev/null
+++ b/interfaces/klib/checksum.h
@@ -0,0 +1,152 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_checksum_
+#define _h_klib_checksum_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * CRC32
+ */
+
+/* CRC32Init
+ *  initializes table
+ *  IDEMPOTENT
+ */
+KLIB_EXTERN void CC CRC32Init ( void );
+
+/* CRC32
+ *  runs checksum on arbitrary data, returning result
+ *  initial checksum to be passed in is 0
+ *  subsequent checksums should be return from prior invocation
+ */
+KLIB_EXTERN uint32_t CC CRC32 ( uint32_t checksum, const void *data, size_t size );
+
+
+/*--------------------------------------------------------------------------
+ * MD5
+ *  taken from Peter Deutsch's sources due to simplicity
+ */
+typedef struct MD5State MD5State;
+struct MD5State
+{
+    uint32_t count [ 2 ];
+    uint32_t abcd [ 4 ];
+    uint8_t buf [ 64 ];
+};
+
+/* Init
+ *  initialize the algorithm and state block
+ */
+KLIB_EXTERN void CC MD5StateInit ( MD5State *md5 );
+
+/* Append
+ *  run MD5 on data block
+ *  accumulate results into "md5"
+ *  processes data in chunks
+ */
+KLIB_EXTERN void CC MD5StateAppend ( MD5State *md5, const void *data, size_t size );
+
+/* Finish
+ *  processes any remaining data in "md5"
+ *  returns 16 bytes of digest
+ */
+KLIB_EXTERN void CC MD5StateFinish ( MD5State *md5, uint8_t digest [ 16 ] );
+
+
+/*--------------------------------------------------------------------------
+ * SHA
+ */
+typedef struct SHA32bitState SHA1State, SHA256State;
+struct SHA32bitState
+{
+    uint64_t len;
+    uint32_t H [ 8 ];
+    uint32_t cur;
+    uint8_t  W [ 64 ];
+};
+
+typedef struct SHA64bitState SHA384State, SHA512State;
+struct SHA64bitState
+{
+    uint64_t len;
+    uint64_t H [ 8 ];
+    unsigned long cur;
+    uint8_t W [ 128 ];
+};
+
+
+/* Init
+ *  initialize the algorithm and state block
+ */
+KLIB_EXTERN void CC SHA1StateInit ( SHA1State *state );
+KLIB_EXTERN void CC SHA256StateInit ( SHA256State *state );
+KLIB_EXTERN void CC SHA384StateInit ( SHA384State *state );
+KLIB_EXTERN void CC SHA512StateInit ( SHA512State *state );
+
+
+/* Append
+ *  run SHA-x on data block
+ *  accumulate results into "state"
+ *  processes data in chunks
+ */
+KLIB_EXTERN void CC SHA1StateAppend ( SHA1State *state, const void *data, size_t size );
+KLIB_EXTERN void CC SHA256StateAppend ( SHA256State *state, const void *data, size_t size );
+KLIB_EXTERN void CC SHA384StateAppend ( SHA384State *state, const void *data, size_t size );
+KLIB_EXTERN void CC SHA512StateAppend ( SHA512State *state, const void *data, size_t size );
+
+
+/* Finish
+ *  processes any remaining data in "state"
+ *  returns N bytes of digest
+ *  N = 20 for SHA-1
+ *  N = 32 for SHA-256
+ *  N = 48 for SHA-384
+ *  N = 64 for SHA-512
+ */
+KLIB_EXTERN void CC SHA1StateFinish ( SHA1State *state, uint8_t digest [ 20 ] );
+KLIB_EXTERN void CC SHA256StateFinish ( SHA256State *state, uint8_t digest [ 32 ] );
+KLIB_EXTERN void CC SHA384StateFinish ( SHA384State *state, uint8_t digest [ 48 ] );
+KLIB_EXTERN void CC SHA512StateFinish ( SHA512State *state, uint8_t digest [ 64 ] );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_checksum_ */
diff --git a/interfaces/klib/container.h b/interfaces/klib/container.h
new file mode 100644
index 0000000..5008705
--- /dev/null
+++ b/interfaces/klib/container.h
@@ -0,0 +1,455 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_container_
+#define _h_klib_container_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SLNode
+ *  singly linked node
+ */
+typedef struct SLNode SLNode;
+struct SLNode
+{
+    SLNode *next;
+};
+
+/* SLNodeNext
+ *  returns next node
+ */
+#define SLNodeNext( n ) \
+    ( n ) -> next
+
+#if 0
+/* SLNodeFindNext
+ *  find next element satisfying criteria
+ */
+KLIB_EXTERN SLNode* CC SLNodeFindNext ( const SLNode *n, bool ( CC * f ) ( const SLNode *n ) );
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SLList
+ *  singly linked list
+ */
+typedef struct SLList SLList;
+struct SLList
+{
+    SLNode *head;
+    SLNode *tail;
+};
+
+
+/* SLListInit
+ *  initialize a singly linked list
+ */
+#define SLListInit( sl ) \
+    ( void ) ( ( sl ) -> head = ( sl ) -> tail = NULL )
+
+/* SLListHead
+ *  returns list head
+ */
+#define SLListHead( sl ) \
+    ( sl ) -> head
+
+/* SLListTail
+ *  returns list tail
+ */
+#define SLListTail( sl ) \
+    ( sl ) -> tail
+
+/* SLListPushHead
+ *  push a single node onto head of list
+ */
+#define SLListPushHead( sl, n ) \
+    ( void ) ( ( ( sl ) -> tail == NULL ? \
+        ( void ) ( ( sl ) -> tail = ( n ) ) : ( void ) 0 ), \
+        ( n ) -> next = ( sl ) -> head, ( sl ) -> head = ( n ) )
+
+/* SLListPushTail
+ *  push a single node onto tail of list
+ */
+KLIB_EXTERN void CC SLListPushTail ( SLList *sl, SLNode *n );
+
+/* SLListPopHead
+ *  pop a single node from head of list
+ */
+KLIB_EXTERN SLNode* CC SLListPopHead ( SLList *sl );
+
+/* SLListPopTail
+ *  pop a single node from tail of list
+ */
+KLIB_EXTERN SLNode* CC SLListPopTail ( SLList *sl );
+
+/* SLListUnlink
+ *  removes a designated node from list
+ */
+KLIB_EXTERN void CC SLListUnlink ( SLList *sl, SLNode *n );
+
+/* SLListForEach
+ *  executes a function on each list element
+ */
+KLIB_EXTERN void CC SLListForEach ( const SLList *sl,
+    void ( CC * f ) ( SLNode *n, void *data ), void *data );
+
+/* SLListDoUntil
+ *  executes a function on each element
+ *  until the function returns true
+ */
+KLIB_EXTERN bool CC SLListDoUntil ( const SLList *sl,
+    bool ( CC * f ) ( SLNode *n, void *data ), void *data );
+
+/* SLListFindFirst
+ *  find first element satisfying criteria
+ */
+KLIB_EXTERN SLNode* CC SLListFindFirst ( const SLList *sl, bool ( CC * f ) ( const SLNode *n ) );
+
+/* SLListWhack
+ *  pops elements from list and
+ *  executes a user provided destructor
+ */
+KLIB_EXTERN void CC SLListWhack ( SLList *sl, void ( CC * whack ) ( SLNode *n, void *data ), void *data );
+
+
+/*--------------------------------------------------------------------------
+ * DLNode
+ *  doubly linked node
+ */
+typedef struct DLNode DLNode;
+struct DLNode
+{
+    DLNode *next;
+    DLNode *prev;
+};
+
+/* DLNodeNext
+ *  returns next node
+ */
+#define DLNodeNext( n ) \
+    ( n ) -> next
+
+/* DLNodePrev
+ *  returns prev node
+ */
+#define DLNodePrev( n ) \
+    ( n ) -> prev
+
+#if 0
+/* DLNodeFindNext
+ *  find next element satisfying criteria
+ */
+KLIB_EXTERN DLNode* CC DLNodeFindNext ( const DLNode *n, bool ( CC * f ) ( const DLNode *n ) );
+
+/* DLNodeFindPrev
+ *  find previous element satisfying criteria
+ */
+KLIB_EXTERN DLNode* CC DLNodeFindPrev ( const DLNode *n, bool ( CC * f ) ( const DLNode *n ) );
+#endif
+
+/*--------------------------------------------------------------------------
+ * DLList
+ *  doubly linked list
+ */
+typedef struct DLList DLList;
+struct DLList
+{
+    DLNode *head;
+    DLNode *tail;
+};
+
+/* DLListInit
+ *  initialize a doubly linked list
+ */
+#define DLListInit( dl ) \
+    ( void ) ( ( dl ) -> head = ( dl ) -> tail = NULL )
+
+/* DLListHead
+ *  returns list head
+ */
+#define DLListHead( dl ) \
+    ( dl ) -> head
+
+/* DLListTail
+ *  returns list tail
+ */
+#define DLListTail( dl ) \
+    ( dl ) -> tail
+
+/* DLListPushHead
+ *  push a single node onto the head of list
+ */
+KLIB_EXTERN void CC DLListPushHead ( DLList *dl, DLNode *n );
+
+/* DLListPushTail
+ *  push a single node onto the tail of list
+ */
+KLIB_EXTERN void CC DLListPushTail ( DLList *dl, DLNode *n );
+
+/* DLListPopHead
+ *  pop a single node from head of list
+ */
+KLIB_EXTERN DLNode* CC DLListPopHead ( DLList *dl );
+
+/* DLListPopTail
+ *  pop a single node from tail of list
+ */
+KLIB_EXTERN DLNode* CC DLListPopTail ( DLList *dl );
+
+/* DLListPrependList
+ *  pushes list contents onto the head of target
+ */
+KLIB_EXTERN void CC DLListPrependList ( DLList *dl, DLList *l );
+
+/* DLListAppendList
+ *  pushes list contents onto the tail of target
+ */
+KLIB_EXTERN void CC DLListAppendList ( DLList *dl, DLList *l );
+
+/* DLListInsertNodeBefore
+ *  inserts node "n" before "which" within list
+ */
+KLIB_EXTERN void CC DLListInsertNodeBefore ( DLList *dl, DLNode *which, DLNode *n );
+
+/* DLListInsertNodeAfter
+ *  inserts node "n" after "which" within list
+ */
+KLIB_EXTERN void CC DLListInsertNodeAfter ( DLList *dl, DLNode *which, DLNode *n );
+
+/* DLListInsertListBefore
+ *  inserts list "l" before "which" within list "dl"
+ */
+KLIB_EXTERN void CC DLListInsertListBefore ( DLList *dl, DLNode *which, DLList *l );
+
+/* DLListInsertListAfter
+ *  inserts list "l" after "which" within list "dl"
+ */
+KLIB_EXTERN void CC DLListInsertListAfter ( DLList *dl, DLNode *which, DLList *l );
+
+/* DLListUnlink
+ *  removes a designated node from list
+ */
+KLIB_EXTERN void CC DLListUnlink ( DLList *dl, DLNode *n );
+
+/* DLListForEach
+ *  executes a function on each list element
+ */
+KLIB_EXTERN void CC DLListForEach ( const DLList *dl, bool reverse,
+    void ( CC * f ) ( DLNode *n, void *data ), void *data );
+
+/* DLListDoUntil
+ *  executes a function on each element
+ *  until the function returns true
+ */
+KLIB_EXTERN bool CC DLListDoUntil ( const DLList *dl, bool reverse,
+    bool ( CC * f ) ( DLNode *n, void *data ), void *data );
+
+/* DLListFindFirst
+ *  find first element satisfying criteria
+ */
+KLIB_EXTERN DLNode* CC DLListFindFirst ( const DLList *dl, bool ( CC * f ) ( const DLNode *n ) );
+
+/* DLListFindLast
+ *  find last element satisfying criteria
+ */
+KLIB_EXTERN DLNode* CC DLListFindLast ( const DLList *dl, bool ( CC * f ) ( const DLNode *n ) );
+
+/* DLListWhack
+ *  pops elements from list and
+ *  executes a user provided destructor
+ */
+KLIB_EXTERN void CC DLListWhack ( DLList *dl, void ( CC * whack ) ( DLNode *n, void *data ), void *data );
+
+
+/*--------------------------------------------------------------------------
+ * BSTNode
+ *  binary search tree node
+ */
+typedef struct BSTNode BSTNode;
+struct BSTNode
+{
+    BSTNode *par;
+    BSTNode *child [ 2 ];
+};
+
+/* BSTNodeNext
+ *  returns next node
+ */
+KLIB_EXTERN BSTNode* CC BSTNodeNext ( const BSTNode *n );
+
+/* BSTNodePrev
+ *  returns prev node
+ */
+KLIB_EXTERN BSTNode* CC BSTNodePrev ( const BSTNode *n );
+
+/* BSTNodeParent
+ *  returns a parent node if there, NULL otherwise
+ */
+KLIB_EXTERN BSTNode* CC BSTNodeParent ( const BSTNode *n );
+
+/* BSTNodeFindNext
+ *  find next element satisfying criteria
+ */
+KLIB_EXTERN BSTNode* CC BSTNodeFindNext ( const BSTNode *n, bool ( CC * f ) ( const BSTNode *n ) );
+
+/* BSTNodeFindPrev
+ *  find previous element satisfying criteria
+ */
+KLIB_EXTERN BSTNode* CC BSTNodeFindPrev ( const BSTNode *n, bool ( CC * f ) ( const BSTNode *n ) );
+
+
+/*--------------------------------------------------------------------------
+ * BSTree
+ *  binary search tree
+ */
+typedef struct BSTree BSTree;
+struct BSTree
+{
+    BSTNode *root;
+};
+
+/* BSTreeInit
+ *  initialize tree
+ */
+#define BSTreeInit( bt ) \
+    ( void ) ( ( bt ) -> root = NULL )
+
+/* BSTreeDepth
+ *  returns number of layers in tree
+ *
+ *  if "exact" is true, then the maximum
+ *  depth is returned. otherwise, the depth of
+ *  an arbitrary leaf node is returned
+ */
+KLIB_EXTERN uint32_t CC BSTreeDepth ( const BSTree *bt, bool exact );
+
+/* BSTreeFirst
+ *  returns first node
+ */
+KLIB_EXTERN BSTNode* CC BSTreeFirst ( const BSTree *bt );
+
+/* BSTreeLast
+ *  returns last node
+ */
+KLIB_EXTERN BSTNode* CC BSTreeLast ( const BSTree *bt );
+
+/* BSTreeFind
+ *  find an object within tree
+ *  "cmp" function returns equivalent of "item" - "n"
+ */
+KLIB_EXTERN BSTNode* CC BSTreeFind ( const BSTree *bt, const void *item,
+    int64_t ( CC * cmp ) ( const void *item, const BSTNode *n ) );
+
+/* BSTreeInsert
+ *  insert an object within tree, even if duplicate
+ *  "sort" function returns equivalent of "item" - "n"
+ *
+ *  the treatment of order for items reported as identical
+ *  i.e. sort function returns zero when they are compared,
+ *  is undefined.
+ *
+ *  the current implementation treats '<=' as '<' such
+ *  that all inserts are converted to a '<' or '>' comparison,
+ *  but this should not be relied upon.
+ *
+ *  returns 0 if insert succeeded or an OS error code otherwise.
+ */
+KLIB_EXTERN rc_t CC BSTreeInsert ( BSTree *bt, BSTNode *item,
+    int64_t ( CC * sort ) ( const BSTNode *item, const BSTNode *n ) );
+
+/* BSTreeInsertUnique
+ *  insert an object within tree, but only if unique.
+ *  "sort" function returns equivalent of "item" - "n"
+ *
+ *  returns 0 if insertion succeeded. or an OS error code otherwise.
+ *  if error code is EEXIST, the existing object is returned in "exist".
+ */
+KLIB_EXTERN rc_t CC BSTreeInsertUnique ( BSTree *bt, BSTNode *item, BSTNode **exist,
+    int64_t ( CC * sort ) ( const BSTNode *item, const BSTNode *n ) );
+
+/* BSTreeResort
+ *  an optimized removal and re-insertion of
+ *  all contained elements using another function
+ *
+ *  the treatment of order for items reported as identical
+ *  i.e. sort function returns zero when they are compared,
+ *  is undefined.
+ *
+ *  the current implementation treats '<=' as '<' such
+ *  that all inserts are converted to a '<' or '>' comparison,
+ *  but this should not be relied upon.
+ */
+KLIB_EXTERN void CC BSTreeResort ( BSTree *bt,
+    int64_t ( CC * resort ) ( const BSTNode *item, const BSTNode *n ) );
+
+/* BSTreeUnlink
+ *  removes a node from tree
+ *
+ *  returns true if node was removed from tree
+ *  false if it could not be removed, e.g. was not in tree
+ */
+KLIB_EXTERN bool CC BSTreeUnlink ( BSTree *bt, BSTNode *n );
+
+/* BSTreeForEach
+ *  executes a function on each tree element
+ */
+KLIB_EXTERN void CC BSTreeForEach ( const BSTree *bt, bool reverse,
+    void ( CC * f ) ( BSTNode *n, void *data ), void *data );
+
+/* BSTreeDoUntil
+ *  executes a function on each element
+ *  until the function returns true
+ *
+ *  return values:
+ *    false unless the function returns true
+ */
+KLIB_EXTERN bool CC BSTreeDoUntil ( const BSTree *bt, bool reverse,
+    bool ( CC * f ) ( BSTNode *n, void *data ), void *data );
+
+/* BSTreeWhack
+ *  removes nodes from tree and
+ *  executes a user provided destructor
+ */
+KLIB_EXTERN void CC BSTreeWhack ( BSTree *bt, void ( CC * whack ) ( BSTNode *n, void *data ), void *data );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_container_ */
diff --git a/interfaces/klib/data-buffer.h b/interfaces/klib/data-buffer.h
new file mode 100644
index 0000000..dbb0bca
--- /dev/null
+++ b/interfaces/klib/data-buffer.h
@@ -0,0 +1,206 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_klib_data_buffer
+#define _h_klib_data_buffer
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KDataBuffer
+ *  simple, open structure to reference an opaque data buffer
+ *
+ *  "base" - pointer to first byte of buffer
+ *
+ *  "elem_bits" - size of buffer element datatype in bits
+ *
+ *  "elem_count" - size of buffer in elements
+ *
+ *  "bit_offset" [ DEFAULT ZERO ] - offset from "base"
+ *  to first bit of buffer, always 0 when "elem_bits" % 8 == 0
+ *  bits are left-packed, i.e.:
+ *
+ *    bit_offset | starting bit
+ *   ============+=============
+ *            0  |  7
+ *            1  |  6
+ *            2  |  5
+ *              ...
+ *            6  |  1
+ *            7  |  0
+ */
+typedef struct KDataBuffer KDataBuffer;
+struct KDataBuffer
+{
+    const void *ignore;
+    void *base;
+    uint64_t elem_bits;
+    uint64_t elem_count;
+    uint8_t bit_offset;
+};
+
+
+/* Bits
+ *  return buffer size in bits
+ */
+#define KDataBufferBits( self ) \
+    ((((bitsz_t)((const KDataBuffer *)(self))->elem_bits) * ((const KDataBuffer *)(self))->elem_count))
+
+/* Bytes
+ *  returns buffer size in bytes
+ */
+#define KDataBufferBytes( self ) \
+   ((size_t)((KDataBufferBits(self) + 7) >> 3))
+
+
+/* Make
+ *  create a new empty buffer
+ *
+ *  "buffer" [ OUT ] - pointer to structure to initialize
+ *
+ *  "elem_bits" [ IN ] - the number of bits in each element
+ *
+ *  "elem_capacity" [ IN ] - the minimum number of elements to be allocated
+ */
+KLIB_EXTERN rc_t CC KDataBufferMake ( KDataBuffer *buffer,
+    uint64_t elem_bits, uint64_t elem_capacity );
+
+
+/* MakeBytes
+ * MakeBits
+ *  create a new empty buffer with default element size
+ */
+#define KDataBufferMakeBytes( buffer, bytes ) \
+    KDataBufferMake ( buffer, 8, bytes )
+#define KDataBufferMakeBits( buffer, bits ) \
+    KDataBufferMake ( buffer, 1, bits )
+
+/* Sub
+ *  create a sub-range reference to an existing buffer
+ *
+ *  "sub" [ OUT ] - pointer to subrange structure
+ *
+ *  "start" [ IN ] - element offset of subrange from start of "self".
+ *  if given start >= self->elem_count, the resultant subrange
+ *  will have an element count of 0.
+ *
+ *  "count" [ IN, DEFAULT UINT64_MAX ] - number of elements of subrange.
+ *  when given count exceeds buffer size, the actual count is calculated to be
+ *  all remaining count in "self" from "start". otherwise, the
+ *  requested count will be limited to the actual count available
+ *  in "self".
+ */
+KLIB_EXTERN rc_t CC KDataBufferSub ( const KDataBuffer *self,
+    KDataBuffer *sub, uint64_t start, uint64_t count );
+
+
+/* MakeWritable
+ *  make a writable copy of the buffer, copying contents if needed.
+ *
+ *  "writable" [ OUT ] - pointer to the structure to initialize
+ *
+ * The usage pattern is:
+ *   KDataBuffer buffer;
+ * ...
+ * initialize buffer
+ * do stuff which might make it shared
+ *   (like pass it to a function that might retain it)
+ * ...
+ *   KDataBuffer writable;
+ *   rc_t rc = KDataBufferMakeWritable(&buffer, &writable);
+ *
+ *   if (rc == 0) {
+ *       / * until you whack the old one KDataBufferWritable(&writable) might be false! * /
+ *       KDataBufferWhack(&buffer);
+ *       buffer = writable;
+ * ...
+ * do whatever you want with buffer because it is now writable (not shared)
+ * ...
+ *   }
+ *   KDataBufferWhack(&buffer);
+ */
+KLIB_EXTERN rc_t CC KDataBufferMakeWritable ( const KDataBuffer *self, KDataBuffer *writable );
+
+
+/* Whack
+ *  release memory associated with a buffer.
+ */
+KLIB_EXTERN rc_t CC KDataBufferWhack ( KDataBuffer *self );
+
+
+/* Resize
+ *  make a buffer bigger or smaller.
+ *  can fail if not enough memory.
+ *  can fail if not writable.
+ *
+ *  "new_count" [ IN ] - new number of elements
+ */
+KLIB_EXTERN rc_t CC KDataBufferResize ( KDataBuffer *self, uint64_t new_count );
+
+
+/* Cast
+ *  create a new data-buffer with a different element size
+ *  won't increase the total number of bits
+ *
+ *  "cast" [ OUT ] - newly typed buffer
+ *
+ *  "new_elem_bits" [ IN ] - new element size in bits
+ *
+ *  "can_shrink" [ IN ] - when true allow
+ *  KDataBufferBits ( cast ) < KDataBufferBits ( self )
+ */
+KLIB_EXTERN rc_t CC KDataBufferCast ( const KDataBuffer *self,
+    KDataBuffer *cast, uint64_t new_elem_bits, bool can_shrink );
+
+
+/* Writable
+ *  returns true if buffer is valid and writable
+ */
+KLIB_EXTERN bool CC KDataBufferWritable ( const KDataBuffer *self );
+
+
+/* CheckIntegrity
+ *  performs some level of integrity checking on buffer structure
+ */
+KLIB_EXTERN rc_t CC KDataBufferCheckIntegrity ( const KDataBuffer *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_data_buffer_ */
diff --git a/interfaces/klib/debug.h b/interfaces/klib/debug.h
new file mode 100644
index 0000000..40b1633
--- /dev/null
+++ b/interfaces/klib/debug.h
@@ -0,0 +1,549 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#ifndef _h_klib_debug_
+#define _h_klib_debug_
+
+#if _DEBUGGING
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_status_
+#include <klib/status.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ----------
+ * KDbgModule and KDbgCondition
+ *
+ * KDbg messages are filtered by a pair of values: a module and a condition.
+ *
+ * A KDbgFlag is a single bit representing an enumerated condition ID
+ *
+ * In this context the module is merely a set and not specifically tied to any
+ * other use of the term module.
+ */
+
+
+
+/*
+ * To add a new module, just add it to the list in MODULE_NAMES but as a 
+ * parameter to the macro "_module"
+ *
+ * Then add the conditions for that module.  There must be at least one.
+ * Put them in the macro "_condition"
+ *
+ * NOTE:
+ * There must be at least one condition for a module.
+ *
+ * NOTE:
+ * Do not seperate the items in eith MODULES or xxx_CONDITIONS by anything 
+ * other than white space.
+ *
+ * NOTE:
+ * The exact text must used in the _module(MOD) and the MOD_CONDITIONS()
+ * so if you want all lower, all upper ot mixed case it must be the same.
+ * this exact case will apply to the command line argument as well.
+ *
+ * NOTE:
+ * The MOD and CONDITIONS must be legal C Identifiers. The exception is a
+ * condition may start with a numeric or even be all numeric.  Punctuation other
+ * than '_' is not allowed.
+ *
+ * NOTE:
+ * No not use condition "ANY" or "NONE" as they are special flag names.
+ *
+ * The rest of the file will take care of adding the new strings, enumerations
+ * and structures for the new modules and/or new conditions.
+ *
+ * The expected command line will be "-D mod" to add "any" for the module or
+ * "-D mod-cond" to add only that condition with in the module.
+ * "-D" and "--debug" are expected to be equivalent"
+ *
+ * The expected usage in a C source file is to use the flag value.
+ * For an added module (MMM) and condition (CCC) the symbols used would be
+ * "dbg_MMM" and "dbg_MMM_CCC" that will get an index
+ * to a flag value and the flag to test for a condition.
+ *
+ * Any number of individual "-D conditions" are accepted.
+ */
+
+#define MODULE_NAMES() \
+    _module(AES)    _module(ALIGN)   _module(APP)  _module(ARGS) \
+    _module(BLAST)  _module(KDB) \
+    _module(KFG)    _module(KFS)     _module(KNS)  _module(KRYPTO) \
+    _module(LEGREF) _module(LOADLIB) \
+    _module(REF)    _module(SEARCH)  _module(SRA) \
+    _module(VDB)    _module(VFS)     _module(XARC) _module(XML)  \
+    
+
+#define APP_CONDITIONS() \
+    _condition(APP,0)  _condition(APP,1)  _condition(APP,2)  _condition(APP,3)  \
+    _condition(APP,4)  _condition(APP,5)  _condition(APP,6)  _condition(APP,7)  \
+    _condition(APP,8)  _condition(APP,9)  _condition(APP,10) _condition(APP,11) \
+    _condition(APP,12) _condition(APP,13) _condition(APP,14) _condition(APP,15) \
+    _condition(APP,16) _condition(APP,17) _condition(APP,18) _condition(APP,19) \
+    _condition(APP,20) _condition(APP,21) _condition(APP,22) _condition(APP,23) \
+    _condition(APP,24) _condition(APP,25) _condition(APP,26) _condition(APP,27) \
+    _condition(APP,28) _condition(APP,29) _condition(APP,30) _condition(APP,31) \
+    _condition(APP,32) _condition(APP,33) _condition(APP,34) _condition(APP,35) \
+    _condition(APP,36) _condition(APP,37) _condition(APP,38) _condition(APP,39) \
+    _condition(APP,40) _condition(APP,41) _condition(APP,42) _condition(APP,43) \
+    _condition(APP,44) _condition(APP,45) _condition(APP,46) _condition(APP,47) \
+    _condition(APP,48) _condition(APP,49) _condition(APP,50) _condition(APP,51) \
+    _condition(APP,52) _condition(APP,53) _condition(APP,54) _condition(APP,55) \
+    _condition(APP,56) _condition(APP,57) _condition(APP,58) _condition(APP,59) \
+    _condition(APP,60) _condition(APP,61) _condition(APP,62) _condition(APP,63) 
+
+#define BLAST_CONDITIONS() \
+    _condition(BLAST,BLAST)
+
+#define KDB_CONDITIONS() \
+    _condition(KDB,KDB) _condition(KDB,POS)
+
+/* place holder should be replaced by the first object that gets the debug stuff tested for krefcount_t */
+#define REF_CONDITIONS() \
+    _condition(REF,PLACEHOLDER)
+
+#define LEGREF_CONDITIONS() \
+    _condition(LEGREF,MD5) _condition(LEGREF,CRC)
+
+#define KFS_CONDITIONS() \
+    _condition(KFS,MD5)      _condition(KFS,DLL) _condition(KFS,KFFENTRY) _condition(KFS,KFF)  \
+    _condition(KFS,ARCENTRY) _condition(KFS,ARC) _condition(KFS,TOCENTRY) _condition(KFS,TOC)  \
+    _condition(KFS,TARENTRY) _condition(KFS,TAR) _condition(KFS,SRASORT)  _condition(KFS,GZIP) \
+    _condition(KFS,DIR)  _condition(KFS,COUNTER) _condition(KFS,BZIP)     _condition(KFS,SYS) \
+    _condition(KFS,POS)  _condition(KFS,PAGE)
+
+#define KNS_CONDITIONS() \
+    _condition(KNS,ERR) _condition(KNS,HTTP) _condition(KNS,MGR) _condition(KNS,SOCKET)
+
+#define VFS_CONDITIONS() \
+    _condition(VFS,MGR)     _condition(VFS,PATH)     _condition(VFS,SERVICE)
+
+#define XML_CONDITIONS() \
+    _condition(XML,XML)
+
+#define VDB_CONDITIONS() \
+    _condition(VDB,RESOLVE) \
+    _condition(VDB,COMPARE) \
+    _condition(VDB,FUNCTION) \
+    _condition(VDB,VDB) \
+    _condition(VDB,PARSE) \
+    _condition(VDB,MTCURSOR)
+
+#define SRA_CONDITIONS() \
+    _condition(SRA,INFO) _condition(SRA,SORT) _condition(SRA,SUB) 
+
+#define XARC_CONDITIONS() \
+    _condition(XARC,ENTRY) \
+    _condition(XARC,ARC)
+
+#define ALIGN_CONDITIONS() \
+    _condition(ALIGN,WRITER) _condition(ALIGN,COMPRESS) _condition(ALIGN,COVERAGE) \
+    _condition(ALIGN,BAM) _condition(ALIGN,BGZF) _condition(ALIGN,CFG)
+
+#define KFG_CONDITIONS() \
+    _condition(KFG,LOAD) _condition(KFG,NODE)
+
+#define KRYPTO_CONDITIONS() \
+    _condition(KRYPTO,STS) \
+    _condition(KRYPTO,CFG) \
+    _condition(KRYPTO,ENCRYPT) \
+    _condition(KRYPTO,DECRYPT)
+
+#define AES_CONDITIONS() \
+    _condition(AES,KEYEXP) _condition(AES,CIPHER) \
+    _condition(AES,INVKEYEXP) _condition(AES,INVCIPHER) \
+    _condition(AES,OBJECT)
+
+#define SEARCH_CONDITIONS() \
+    _condition(SEARCH,MYERS)
+
+#define LOADLIB_CONDITIONS() \
+    _condition(LOADLIB,PBAR) _condition(LOADLIB,FILE) _condition(LOADLIB,XLOG)
+
+#define ARGS_CONDITIONS() \
+    _condition(ARGS,WRITER)
+
+/*
+ * Nothing below here needs to be changed when just adding new modules
+ * and/or conditions
+ */
+
+/* macros to do preprocessor token pasting and stringification */
+#define DBG_PASTE_2(a,b)        a##b
+#define DBG_PASTE_3(a,b,c)      a##b##c
+#define DBG_PASTE_4(a,b,c,d)    a##b##c##d
+#define DBG_PASTE_5(a,b,c,d,e)  a##b##c##d##e
+#define DBG_STRING(a)           #a
+
+/*
+ * Build the module enumerations/flags.
+ */
+#define _module(mod)   DBG_PASTE_2(DBG_,mod),
+
+typedef int32_t KDbgMod;
+enum
+{
+    DBG_MOD_NOT_FOUND = -1,
+    MODULE_NAMES()
+    DBG_MOD_COUNT
+};
+
+#undef _module
+
+
+/* 
+ * the dbg_id and dbg_flag types are for ease of generically
+ * typing flags with more specific types defined below.  These are more fully
+ * filled out to help debuggers more than any real need for the code to work
+ *
+ * We'll just assume a limit of 32 bits for an enumeration.
+ */
+
+/* dbg_id is approprite as a array index */
+    typedef uint32_t KDbgCond;
+enum
+{
+    DBG_COND_MIN = 0,
+    DBG_COND_0 = DBG_COND_MIN,      DBG_COND_1,     DBG_COND_2,
+    DBG_COND_3,     DBG_COND_4,     DBG_COND_5,     DBG_COND_6,
+    DBG_COND_7,     DBG_COND_8,     DBG_COND_9,     DBG_COND_10,
+    DBG_COND_11,    DBG_COND_12,    DBG_COND_13,    DBG_COND_14,
+    DBG_COND_15,    DBG_COND_16,    DBG_COND_17,    DBG_COND_18,
+    DBG_COND_19,    DBG_COND_20,    DBG_COND_21,    DBG_COND_22,
+    DBG_COND_23,    DBG_COND_24,    DBG_COND_25,    DBG_COND_26,
+    DBG_COND_27,    DBG_COND_28,    DBG_COND_29,    DBG_COND_30,
+    DBG_COND_31,    DBG_COND_32,    DBG_COND_33,    DBG_COND_34,
+    DBG_COND_35,    DBG_COND_36,    DBG_COND_37,    DBG_COND_38,
+    DBG_COND_39,    DBG_COND_40,    DBG_COND_41,    DBG_COND_42,
+    DBG_COND_43,    DBG_COND_44,    DBG_COND_45,    DBG_COND_46,
+    DBG_COND_47,    DBG_COND_48,    DBG_COND_49,    DBG_COND_50,
+    DBG_COND_51,    DBG_COND_52,    DBG_COND_53,    DBG_COND_54,
+    DBG_COND_55,    DBG_COND_56,    DBG_COND_57,    DBG_COND_58,
+    DBG_COND_59,    DBG_COND_60,    DBG_COND_61,    DBG_COND_62,
+    DBG_COND_63,    DBG_COND_MAX = DBG_COND_63
+};
+
+typedef uint64_t KDbgFlag;
+typedef uint64_t KDbgMask;
+
+
+/* to make a KDbgFlag out of a KDbgCond, shift 1 one by the condition id */
+/* to make as mask out of flags just OR them together */
+
+KLIB_EXTERN KDbgFlag CC KDbgCondToFlag ( KDbgCond cond );
+
+#if LOG_INLINING
+#define DBG_FLAG(debug_cond) (((KDbgFlag)1)<<debug_cond)
+#else
+#define DBG_FLAG(debug_cond) KDbgCondToFlag(debug_cond)
+#endif
+
+
+/* dbg_flag is a type that can be used to and against the enabled fkags/masks */
+typedef uint64_t dbg_flag;
+
+#define DBG_FLAG_NONE 0
+#define DBG_FLAG_0  (((dbg_flag)1)<<DBG_COND_0)
+#define DBG_FLAG_1  (((dbg_flag)1)<<DBG_COND_1)
+#define DBG_FLAG_2  (((dbg_flag)1)<<DBG_COND_2)
+#define DBG_FLAG_3  (((dbg_flag)1)<<DBG_COND_3)
+#define DBG_FLAG_4  (((dbg_flag)1)<<DBG_COND_4)
+#define DBG_FLAG_5  (((dbg_flag)1)<<DBG_COND_5)
+#define DBG_FLAG_6  (((dbg_flag)1)<<DBG_COND_6)
+#define DBG_FLAG_7  (((dbg_flag)1)<<DBG_COND_7)
+#define DBG_FLAG_8  (((dbg_flag)1)<<DBG_COND_8)
+#define DBG_FLAG_9  (((dbg_flag)1)<<DBG_COND_9)
+#define DBG_FLAG_10 (((dbg_flag)1)<<DBG_COND_10)
+#define DBG_FLAG_11 (((dbg_flag)1)<<DBG_COND_11)
+#define DBG_FLAG_12 (((dbg_flag)1)<<DBG_COND_12)
+#define DBG_FLAG_13 (((dbg_flag)1)<<DBG_COND_13)
+#define DBG_FLAG_14 (((dbg_flag)1)<<DBG_COND_14)
+#define DBG_FLAG_15 (((dbg_flag)1)<<DBG_COND_15)
+#define DBG_FLAG_16 (((dbg_flag)1)<<DBG_COND_16)
+#define DBG_FLAG_17 (((dbg_flag)1)<<DBG_COND_17)
+#define DBG_FLAG_18 (((dbg_flag)1)<<DBG_COND_18)
+#define DBG_FLAG_19 (((dbg_flag)1)<<DBG_COND_19)
+#define DBG_FLAG_20 (((dbg_flag)1)<<DBG_COND_20)
+#define DBG_FLAG_21 (((dbg_flag)1)<<DBG_COND_21)
+#define DBG_FLAG_22 (((dbg_flag)1)<<DBG_COND_22)
+#define DBG_FLAG_23 (((dbg_flag)1)<<DBG_COND_23)
+#define DBG_FLAG_24 (((dbg_flag)1)<<DBG_COND_24)
+#define DBG_FLAG_25 (((dbg_flag)1)<<DBG_COND_25)
+#define DBG_FLAG_26 (((dbg_flag)1)<<DBG_COND_26)
+#define DBG_FLAG_27 (((dbg_flag)1)<<DBG_COND_27)
+#define DBG_FLAG_28 (((dbg_flag)1)<<DBG_COND_28)
+#define DBG_FLAG_29 (((dbg_flag)1)<<DBG_COND_29)
+#define DBG_FLAG_30 (((dbg_flag)1)<<DBG_COND_30)
+#define DBG_FLAG_31 (((dbg_flag)1)<<DBG_COND_31)
+#define DBG_FLAG_32 (((dbg_flag)1)<<DBG_COND_32)
+#define DBG_FLAG_33 (((dbg_flag)1)<<DBG_COND_33)
+#define DBG_FLAG_34 (((dbg_flag)1)<<DBG_COND_34)
+#define DBG_FLAG_35 (((dbg_flag)1)<<DBG_COND_35)
+#define DBG_FLAG_36 (((dbg_flag)1)<<DBG_COND_36)
+#define DBG_FLAG_37 (((dbg_flag)1)<<DBG_COND_37)
+#define DBG_FLAG_38 (((dbg_flag)1)<<DBG_COND_38)
+#define DBG_FLAG_39 (((dbg_flag)1)<<DBG_COND_39)
+#define DBG_FLAG_40 (((dbg_flag)1)<<DBG_COND_40)
+#define DBG_FLAG_41 (((dbg_flag)1)<<DBG_COND_41)
+#define DBG_FLAG_42 (((dbg_flag)1)<<DBG_COND_42)
+#define DBG_FLAG_43 (((dbg_flag)1)<<DBG_COND_43)
+#define DBG_FLAG_44 (((dbg_flag)1)<<DBG_COND_44)
+#define DBG_FLAG_45 (((dbg_flag)1)<<DBG_COND_45)
+#define DBG_FLAG_46 (((dbg_flag)1)<<DBG_COND_46)
+#define DBG_FLAG_47 (((dbg_flag)1)<<DBG_COND_47)
+#define DBG_FLAG_48 (((dbg_flag)1)<<DBG_COND_48)
+#define DBG_FLAG_49 (((dbg_flag)1)<<DBG_COND_49)
+#define DBG_FLAG_50 (((dbg_flag)1)<<DBG_COND_50)
+#define DBG_FLAG_51 (((dbg_flag)1)<<DBG_COND_51)
+#define DBG_FLAG_52 (((dbg_flag)1)<<DBG_COND_52)
+#define DBG_FLAG_53 (((dbg_flag)1)<<DBG_COND_53)
+#define DBG_FLAG_54 (((dbg_flag)1)<<DBG_COND_54)
+#define DBG_FLAG_55 (((dbg_flag)1)<<DBG_COND_55)
+#define DBG_FLAG_56 (((dbg_flag)1)<<DBG_COND_56)
+#define DBG_FLAG_57 (((dbg_flag)1)<<DBG_COND_57)
+#define DBG_FLAG_58 (((dbg_flag)1)<<DBG_COND_58)
+#define DBG_FLAG_59 (((dbg_flag)1)<<DBG_COND_59)
+#define DBG_FLAG_60 (((dbg_flag)1)<<DBG_COND_60)
+#define DBG_FLAG_61 (((dbg_flag)1)<<DBG_COND_61)
+#define DBG_FLAG_62 (((dbg_flag)1)<<DBG_COND_62)
+#define DBG_FLAG_63 (((dbg_flag)1)<<DBG_COND_63)
+#define DBG_FLAG_ANY (~(dbg_flag)0)
+
+/*
+ * Build the list of enums for the various modules.
+ * These are descendant types of KDbgCond and KDbgFlag
+ *
+ * The use of ',' or ';' at the end of macros is precise to suit the use
+ * in the initializers and enum definitions.
+ *
+ * These usually means no ',' or ';' at the end of instantiations.
+ */
+#define _module(mod)                            \
+    typedef int32_t DBG_PASTE_2(DBG_COND_,mod); \
+    enum                                        \
+        {                                       \
+        DBG_PASTE_2(mod,_CONDITIONS())          \
+        DBG_PASTE_3(DBG_,mod,_COUNT)            \
+    };
+#define _condition(mod,flag) DBG_PASTE_4(DBG_,mod,_,flag),
+
+MODULE_NAMES()
+
+#undef _condition
+#undef _module
+
+typedef struct dbg_s_flag dbg_s_flag;
+struct dbg_s_flag
+{
+    const char * name;
+    KDbgFlag flag;
+};
+
+typedef struct dbg_s_mod dbg_s_mod;
+struct dbg_s_mod
+{
+    const char *       name;  /* matches item in MODULE_NAMES() */
+    const dbg_s_flag *  conds; /* array of structures for setting flags */
+    KDbgMask           flags; /* which flags are active */
+};
+
+extern dbg_s_mod dbg_flag_mod     [DBG_MOD_COUNT+1];
+
+
+#define _module(mod) \
+    extern KDbgMask DBG_PASTE_3(DBG_,mod,_ANY);
+
+MODULE_NAMES()
+
+#undef _module
+
+
+/*
+ * strings will be defined only in the single C file that should
+ * define the symbol below before including this file.
+ *
+ * This could have been done in the C file but was done here to
+ * keep the spirit of the work done all in one place.
+ */
+
+#ifdef _KLIB_DEBUG_C_
+
+#define _module(mod) \
+    KDbgFlag DBG_PASTE_3(DBG_,mod,_ANY) = ( DBG_PASTE_2(mod,_CONDITIONS()) 0);
+#define _condition(mod,flag) \
+    (((KDbgFlag)1)<<DBG_PASTE_4(DBG_,mod,_,flag)) |
+
+MODULE_NAMES()
+
+#undef _module
+#undef _condition
+
+#define _module(mod)                            \
+    dbg_s_flag DBG_PASTE_2(dbg_s_flag_,mod) [] = \
+    {                                            \
+        DBG_PASTE_2(mod,_CONDITIONS())           \
+        { NULL, DBG_FLAG_NONE }                      \
+    };
+
+#define _condition(mod,flag)                                           \
+    { DBG_STRING(flag), ((KDbgFlag)1)<<DBG_PASTE_4(DBG_,mod,_,flag) },
+
+MODULE_NAMES()
+
+#undef _module
+#undef _condition
+
+#define _module(mod)                           \
+    {                                           \
+        DBG_STRING(mod),                         \
+        DBG_PASTE_2(dbg_s_flag_,mod),        \
+        0                                       \
+    },
+
+dbg_s_mod dbg_flag_mod [] = 
+{
+    MODULE_NAMES()
+    { NULL, NULL }
+};
+#undef _module
+
+#define _module(mod) 
+
+#endif /* if _KLIB_TEST_C_ */
+
+
+/*
+ * For module 'mod' turn on or off the specific flags in
+ * mask flags
+ *
+ * bits in mask are effected.
+ * return previous 
+ */
+KLIB_EXTERN KDbgMask CC KDbgSetModConds ( KDbgMod mod, KDbgMask mask, KDbgMask flags );
+KLIB_EXTERN bool CC KDbgTestModConds ( KDbgMod mod, KDbgMask flags );
+
+
+/*
+ * Init()
+ * Initialize the debug messages module to a known state
+ */
+KLIB_EXTERN rc_t CC KDbgInit (void);
+
+/* 
+ * param is coming in as utf-8/ASCII with NUL terminator or we fail
+ * we also assume no more than 127 significant characters
+ *
+ * These strings can be utf-8 or ASCII even if we are using 
+ * clib strXXX functions.
+ */
+KLIB_EXTERN rc_t CC KDbgSetString (const char * string);
+
+/* KDbgMask KDbgFlagsGet  (KDbgMod mod); */
+/* bool     KDbgTestCond  (KDbgMask mask); */
+
+
+/*
+ * Get the KDbgMod associated with a name.
+ */
+KLIB_EXTERN rc_t CC KDbgGetModId (KDbgMod * mod, 
+                   const char * mod_name, size_t mod_size);
+
+/*
+ * Get the KDbgCond associated with a name.
+ */
+KLIB_EXTERN rc_t CC KDbgGetCndFlag (KDbgMod mod, KDbgFlag * flag,
+                      const char * cnd_name, size_t cnd_size);
+
+KLIB_EXTERN KDbgMask CC KDbgGetModFlags ( KDbgMod mod );
+
+KLIB_EXTERN rc_t CC KDbgMsg (const char * fmt, ...);
+
+#define DBGMSG(mod,flags,msg) \
+    (void)(((KDbgWriterGet() != NULL) && (KDbgTestModConds (mod, flags)))  \
+           ? KDbgMsg msg : 0)
+
+/* -----
+ * Handlers for application and library writers.
+ */
+KLIB_EXTERN KWrtHandler* CC KDbgHandlerGet ( void );
+KLIB_EXTERN KWrtWriter CC KDbgWriterGet ( void );
+KLIB_EXTERN void* CC KDbgWriterDataGet ( void );
+
+/* Handler
+ *  sets output handler for standard output
+ *
+ *  "logger" [ IN ] and "self" [ IN, OPAQUE ] - callback function
+ *  to handle log output
+ */
+KLIB_EXTERN rc_t CC KDbgHandlerSet ( KWrtWriter writer, void * data );
+
+KLIB_EXTERN rc_t CC KDbgHandlerSetStdOut();
+KLIB_EXTERN rc_t CC KDbgHandlerSetStdErr();
+
+
+KLIB_EXTERN void CC KDbgSetRowId( uint64_t row_id );
+KLIB_EXTERN uint64_t CC KDbgGetRowId( void );
+KLIB_EXTERN void CC KDbgSetColName( const char * col_name );
+KLIB_EXTERN const char * CC KDbgGetColName( void );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#else /* #if _DEBUGGING */
+
+#define DBGMSG(mod,flags,msg) ((void)0)
+
+#define KDbgInit() ((rc_t)0)
+
+#define KDbgHandlerSetStdOut() ((rc_t)0)
+#define KDbgHandlerSetStdErr() ((rc_t)0)
+
+#define KDbgSetString(s) ((rc_t)0)
+
+#define KDbgHandlerSet(a,b) ((rc_t)0)
+
+#define KDbgHandlerGet() ((void*)NULL)
+#define KDbgWriterGet() ((void*)NULL)
+#define KDbgWriterDataGet() ((void*)NULL)
+
+#endif /* #if _DEBUGGING */
+
+#endif /*  _h_klib_debug_ */
diff --git a/interfaces/klib/defs.h b/interfaces/klib/defs.h
new file mode 100644
index 0000000..51e2aaf
--- /dev/null
+++ b/interfaces/klib/defs.h
@@ -0,0 +1,147 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_defs_
+#define _h_klib_defs_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * bitsz_t
+ *  where size_t always denotes a quantity of bytes,
+ *  bitsz_t denotes a quantity of bits.
+ */
+typedef uint64_t bitsz_t;
+
+
+/*--------------------------------------------------------------------------
+ * fptr_t
+ *  "generic" function pointer type
+ *  has very little real use other than to calm down compilers
+ */
+typedef int ( CC * fptr_t ) ( void );
+
+
+/*--------------------------------------------------------------------------
+ * remove_t
+ *  usually when message signatures change, the compiler can
+ *  and will pick up the changes and trigger an error. sometimes
+ *  it will just issue a warning, and other times will not pick
+ *  up on the significance of a change.
+ *
+ *  to ensure that a change of signature gets caught everywhere
+ *  by the compiler, we can introduce an extra parameter that
+ *  causes us to visit all dependent code.
+ */
+typedef struct remove_t remove_t;
+
+
+/*--------------------------------------------------------------------------
+ * KTime_t
+ *  64 bit time_t
+ *  operations are declared in <klib/time.h>
+ */
+typedef int64_t KTime_t;
+typedef int64_t KTimeMs_t;
+
+/*--------------------------------------------------------------------------
+ * KCreateMode
+ *  values are defined in <kfs/defs.h>
+ */
+typedef uint32_t KCreateMode;
+
+
+/*--------------------------------------------------------------------------
+ * kfs defines
+ */
+#ifndef KFILE_VERS
+#define KFILE_VERS 1
+#endif
+
+#ifndef KFile
+#if KFILE_VERS == 1
+#define KFile KFile_v1
+#elif KFILE_VERS == 2
+#define KFile KFile_v2
+#endif
+#endif
+
+#ifndef KDIRECTORY_VERS
+#define KDIRECTORY_VERS 1
+#endif
+
+#ifndef KDirectory
+#if KDIRECTORY_VERS == 1
+#define KDirectory KDirectory_v1
+#elif KDIRECTORY_VERS == 2
+#define KDirectory KDirectory_v2
+#endif
+#endif
+
+
+#if 1
+
+/*--------------------------------------------------------------------------
+ * LPFX
+ * SHLX
+ * MODX
+ *  take their input from make
+ */
+#ifndef LIBPREFIX
+ #define LPFX ""
+#else
+ #define LPFXSTR2( str ) # str
+ #define LPFXSTR( str ) LPFXSTR2 ( str )
+ #define LPFX LPFXSTR ( LIBPREFIX )
+#endif
+#ifndef SHLIBEXT
+ #define SHLX ""
+#else
+ #define SHLXSTR2( str ) "." # str
+ #define SHLXSTR( str ) SHLXSTR2 ( str )
+ #define SHLX SHLXSTR ( SHLIBEXT )
+#endif
+#ifndef MODEXT
+ #define MODX SHLX
+#else
+ #define MODXSTR2( str ) "." # str
+ #define MODXSTR( str ) MODXSTR2 ( str )
+ #define MODX MODXSTR ( MODIBEXT )
+#endif
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_klib_defs_ */
diff --git a/interfaces/klib/extern.h b/interfaces/klib/extern.h
new file mode 100644
index 0000000..39aaac5
--- /dev/null
+++ b/interfaces/klib/extern.h
@@ -0,0 +1,51 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_extern_
+#define _h_klib_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+
+#define KLIB_EXTERN LIB_EXPORT
+#define KLIB_EXTERN_DATA extern LIB_EXPORT
+#define EXPORT_LATCH 1
+
+#else
+
+#define KLIB_EXTERN LIB_IMPORT
+#ifdef __cplusplus
+#define KLIB_EXTERN_DATA extern /* LIB_IMPORT_DATA */
+#else
+#define KLIB_EXTERN_DATA LIB_IMPORT_DATA
+#endif
+
+#endif
+
+#ifndef _h_kfc_extern_
+#include <kfc/extern.h>
+#endif
+
+#endif /* _h_klib_extern_ */
diff --git a/interfaces/klib/impl.h b/interfaces/klib/impl.h
new file mode 100644
index 0000000..35959ea
--- /dev/null
+++ b/interfaces/klib/impl.h
@@ -0,0 +1,96 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_impl_
+#define _h_klib_impl_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_namelist_
+#include <klib/namelist.h>
+#endif
+
+#ifndef _h_atomic_
+#include <atomic.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+typedef union KNamelist_vt KNamelist_vt;
+
+
+/*--------------------------------------------------------------------------
+ * KNamelist
+ *  a virtual directory listing
+ */
+struct KNamelist
+{
+    const KNamelist_vt *vt;
+    atomic_t refcount;
+};
+
+#ifndef KNAMELIST_IMPL
+#define KNAMELIST_IMPL KNamelist
+#endif
+
+typedef struct KNamelist_vt_v1 KNamelist_vt_v1;
+struct KNamelist_vt_v1
+{
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t ( CC * destroy ) ( KNAMELIST_IMPL *self );
+    rc_t ( CC * count ) ( const KNAMELIST_IMPL *self, uint32_t *count );
+    rc_t ( CC * get ) ( const KNAMELIST_IMPL *self, uint32_t idx, const char **name );
+    /* end minor version == 0 */
+};
+
+union KNamelist_vt
+{
+    KNamelist_vt_v1 v1;
+};
+
+/* Init
+ */
+KLIB_EXTERN rc_t CC KNamelistInit ( KNamelist *self, const KNamelist_vt *vt );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_impl_ */
diff --git a/interfaces/klib/klib-priv.h b/interfaces/klib/klib-priv.h
new file mode 100644
index 0000000..2b2580d
--- /dev/null
+++ b/interfaces/klib/klib-priv.h
@@ -0,0 +1,108 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_priv_
+#define _h_klib_priv_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_writer_
+#include <klib/writer.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ */
+
+
+/* reporting structure
+ */
+typedef struct ReportFuncs ReportFuncs;
+struct ReportFuncs
+{
+    void ( CC * report ) ( uint32_t indent, const char* name, uint32_t count, ... );
+    void ( CC * reportData ) ( uint32_t indent, const char* name, const char* data, uint32_t count, ... );
+    rc_t ( CC * reportData1 ) ( const char* data );
+    void ( CC * reportOpen ) ( uint32_t indent, const char* name, uint32_t count, ... );
+    void ( CC * reportOpen1 ) ( uint32_t indent, const char* name );
+    void ( CC * reportClose ) ( uint32_t indent, const char* name );
+    void ( CC * reportClose1 ) ( const char* name );
+    void ( CC * reportError ) ( uint32_t indent, rc_t rc, const char* function );
+    void ( CC * reportErrorStr ) ( uint32_t indent, rc_t rc, const char* function,
+        const char* name, const char* val );
+    void ( CC * reportErrorStrImpl ) ( uint32_t indent, rc_t rc, const char* function,
+        const char* name, const char* val, bool eol );
+    void ( CC * reportErrorStrInt ) ( uint32_t indent, rc_t rc, const char* function,
+        const char* names, const char* vals, const char* namei, uint32_t vali );
+    void ( CC * reportError3Str ) ( uint32_t indent, rc_t rc, const char* function,
+        const char* name, const char* v1, const char* v2, const char* v3, bool eol );
+};
+
+
+/* InitKFS
+ */
+KLIB_EXTERN void CC ReportInitKFS (
+    rc_t ( CC * report_cwd ) ( const ReportFuncs *f, uint32_t indent ),
+    rc_t ( CC * report_redirect ) ( KWrtHandler* handler,
+        const char* filename, bool* to_file, bool finalize ) );
+
+/* InitConfig
+ *  returns appname if available
+ */
+KLIB_EXTERN const char* CC ReportInitConfig ( rc_t ( CC * report )
+    ( const ReportFuncs *f, uint32_t indent,
+      uint32_t configNodesSkipCount, va_list args ) );
+
+
+/* InitVDB
+ */
+KLIB_EXTERN rc_t CC ReportInitVDB(
+    rc_t (CC *report_obj)(const ReportFuncs *f,
+        uint32_t indent, const char *path, bool *wasDbOrTableSet),
+    rc_t (CC *report_software)(const ReportFuncs *f,
+        uint32_t indent, const char *argv_0, const char *date, ver_t tool_ver),
+    rc_t (CC *whack)(void));
+
+
+/* RecordZombieFile
+ */
+KLIB_EXTERN void CC ReportRecordZombieFile ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_priv_ */
diff --git a/interfaces/klib/ksort-macro.h b/interfaces/klib/ksort-macro.h
new file mode 100644
index 0000000..e86d57b
--- /dev/null
+++ b/interfaces/klib/ksort-macro.h
@@ -0,0 +1,257 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_klib_ksort_macro_
+#define _h_klib_ksort_macro_
+
+#include <limits.h>
+#include <stdlib.h>
+
+
+/* Copyright (C) 1991,1992,1996,1997,1999,2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Written by Douglas C. Schmidt (schmidt at ics.uci.edu).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* If you consider tuning this algorithm, you should consult first:
+   Engineering a sort function; Jon Bentley and M. Douglas McIlroy;
+   Software - Practice and Experience; Vol. 23 (11), 1249-1265, 1993.  */
+
+/* Discontinue quicksort algorithm when partition gets below this size.
+   This particular magic number was chosen to work best on a Sun 4/260. */
+#ifndef KSORT_MAX_THRESH
+#define KSORT_MAX_THRESH 4
+#endif
+
+/* Stack node declarations used to store unfulfilled partition obligations. */
+#ifndef ksort_stack_node_declared
+#define ksort_stack_node_declared 1
+typedef struct ksort_stack_node ksort_stack_node;
+struct ksort_stack_node
+{
+    char *lo;
+    char *hi;
+};
+#endif
+
+/* The next 4 #defines implement a very fast in-line stack abstraction. */
+/* The stack needs log (total_elements) entries (we could even subtract
+   log(MAX_THRESH)).  Since total_elements has type size_t, we get as
+   upper bound for log (total_elements):
+   bits per byte (CHAR_BIT) * sizeof(size_t).  */
+
+#ifndef KSORT_STACK_SIZE
+#define KSORT_STACK_SIZE	(CHAR_BIT * sizeof(size_t))
+#endif
+
+#ifndef KSORT_PUSH
+#define KSORT_PUSH(low, high)	((void) ((top->lo = (low)), (top->hi = (high)), ++top))
+#endif
+
+#ifndef KSORT_POP
+#define	KSORT_POP(low, high)	((void) (--top, (low = top->lo), (high = top->hi)))
+#endif
+
+#ifndef KSORT_STACK_EMPTY
+#define	KSORT_STACK_EMPTY	( stack >= top )
+#endif
+
+#ifndef KSORT_SWAP
+#define KSORT_SWAP( a, b, off, size )           \
+    do                                          \
+    {                                           \
+        register size_t i, end = off + size;    \
+        register char *__a = (a), *__b = (b);   \
+        for ( i = off; i < end; ++ i )          \
+        {                                       \
+            char __tmp = __a [ i ];             \
+            __a [ i ] = __b [ i ];              \
+            __b [ i ] = __tmp;                  \
+        }                                       \
+    } while (0)
+#endif
+
+#define KSORT_TSWAP( T, a, b )                  \
+    do                                          \
+    {                                           \
+        T tmp = * ( const T* ) ( a );           \
+        * ( T* ) ( a ) = * ( const T* ) ( b );  \
+        * ( T* ) ( b ) = tmp;                   \
+    }                                           \
+    while ( 0 )
+
+
+/* Order size using quicksort.  This implementation incorporates
+   four optimizations discussed in Sedgewick:
+
+   1. Non-recursive, using an explicit stack of pointer that store the
+   next array partition to sort.  To save time, this maximum amount
+   of space required to store an array of SIZE_MAX is allocated on the
+   stack.  Assuming a 32-bit (64 bit) integer for size_t, this needs
+   only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes).
+   Pretty cheap, actually.
+
+   2. Chose the pivot element using a median-of-three decision tree.
+   This reduces the probability of selecting a bad pivot value and
+   eliminates certain extraneous comparisons.
+
+   3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
+   insertion sort to order the MAX_THRESH items within each partition.
+   This is a big win, since insertion sort is faster for small, mostly
+   sorted array segments.
+
+   4. The larger of the two sub-partitions is always pushed onto the
+   stack first, with the algorithm then concentrating on the
+   smaller partition.  This *guarantees* no more than log (total_elems)
+   stack size is needed (actually O(1) in this case)!  */
+
+#define KSORT( PBASE, TOTAL_ELEMS, ELEM_SIZE, SWAP_OFFSET, SWAP_SIZE )            \
+    register char *base_ptr = ( char* ) ( PBASE );                                \
+    const size_t max_thresh = KSORT_MAX_THRESH * ( ELEM_SIZE );                   \
+    if ( ( TOTAL_ELEMS ) < 2)                                                     \
+        return;                                                                   \
+    if ( ( TOTAL_ELEMS ) > KSORT_MAX_THRESH)                                      \
+    {                                                                             \
+        char *lo = base_ptr;                                                      \
+        char *hi = & lo [ ( ELEM_SIZE ) * ( ( TOTAL_ELEMS ) - 1 ) ];              \
+        ksort_stack_node stack [ KSORT_STACK_SIZE ];                              \
+        ksort_stack_node *top = stack;                                            \
+        KSORT_PUSH (NULL, NULL);                                                  \
+        while ( ! KSORT_STACK_EMPTY )                                             \
+        {                                                                         \
+            char *left_ptr;                                                       \
+            char *right_ptr;                                                      \
+            char *mid = lo + ( ELEM_SIZE ) * ( ( hi - lo ) / ( ELEM_SIZE ) >> 1 );\
+            if ( CMP ( ( void* ) mid, ( void* ) lo ) < 0 )                        \
+                SWAP ( mid, lo, ( SWAP_OFFSET ), ( SWAP_SIZE ) );                 \
+            if ( CMP ( ( void* ) hi, ( void* ) mid) < 0 )                         \
+                SWAP ( mid, hi, ( SWAP_OFFSET ), ( SWAP_SIZE ) );                 \
+            else                                                                  \
+                goto jump_over;                                                   \
+            if ( CMP ( ( void* ) mid, ( void* ) lo ) < 0 )                        \
+                SWAP ( mid, lo, ( SWAP_OFFSET ), ( SWAP_SIZE ) );                 \
+        jump_over:                                                                \
+            left_ptr  = lo + ( ELEM_SIZE );                                       \
+            right_ptr = hi - ( ELEM_SIZE );                                       \
+            do                                                                    \
+            {                                                                     \
+                while ( CMP ( ( void* ) left_ptr, ( void* ) mid ) < 0 )           \
+                    left_ptr += ( ELEM_SIZE );                                    \
+                while ( CMP ( ( void* ) mid, ( void* ) right_ptr ) < 0 )          \
+                    right_ptr -= ( ELEM_SIZE );                                   \
+                if ( left_ptr < right_ptr )                                       \
+                {                                                                 \
+                    SWAP ( left_ptr, right_ptr, ( SWAP_OFFSET ), ( SWAP_SIZE ) ); \
+                    if ( mid == left_ptr )                                        \
+                        mid = right_ptr;                                          \
+                    else if ( mid == right_ptr )                                  \
+                        mid = left_ptr;                                           \
+                    left_ptr += ( ELEM_SIZE );                                    \
+                    right_ptr -= ( ELEM_SIZE );                                   \
+                }                                                                 \
+                else if ( left_ptr == right_ptr )                                 \
+                {                                                                 \
+                    left_ptr += ( ELEM_SIZE );                                    \
+                    right_ptr -= ( ELEM_SIZE );                                   \
+                    break;                                                        \
+                }                                                                 \
+            }                                                                     \
+            while ( left_ptr <= right_ptr );                                      \
+            if ((size_t) (right_ptr - lo) <= max_thresh)                          \
+            {                                                                     \
+                if ((size_t) (hi - left_ptr) <= max_thresh)                       \
+                    KSORT_POP (lo, hi);                                           \
+                else                                                              \
+                    lo = left_ptr;                                                \
+            }                                                                     \
+            else if ((size_t) (hi - left_ptr) <= max_thresh)                      \
+                hi = right_ptr;                                                   \
+            else if ((right_ptr - lo) > (hi - left_ptr))                          \
+            {                                                                     \
+                KSORT_PUSH (lo, right_ptr);                                       \
+                lo = left_ptr;                                                    \
+            }                                                                     \
+            else                                                                  \
+            {                                                                     \
+                KSORT_PUSH (left_ptr, hi);                                        \
+                hi = right_ptr;                                                   \
+            }                                                                     \
+        }                                                                         \
+    }                                                                             \
+    {                                                                             \
+        register char *run_ptr;                                                   \
+        char *const end_ptr = & base_ptr [(ELEM_SIZE)*((TOTAL_ELEMS)-1)];         \
+        char *tmp_ptr = base_ptr;                                                 \
+        char *thresh = base_ptr + max_thresh;                                     \
+        if ( thresh > end_ptr )                                                   \
+            thresh = end_ptr;                                                     \
+        for (run_ptr = tmp_ptr+(ELEM_SIZE);run_ptr<=thresh;run_ptr+=(ELEM_SIZE))  \
+            if ( CMP ( ( void* ) run_ptr, ( void* ) tmp_ptr ) < 0 )               \
+                tmp_ptr = run_ptr;                                                \
+        if (tmp_ptr != base_ptr)                                                  \
+            SWAP ( tmp_ptr, base_ptr, ( SWAP_OFFSET ), ( SWAP_SIZE ) );           \
+        tmp_ptr = base_ptr + ( ELEM_SIZE );                                       \
+        for ( run_ptr = base_ptr + ( 2 * ( ELEM_SIZE ) );                         \
+              run_ptr <= end_ptr; tmp_ptr = run_ptr, run_ptr += ( ELEM_SIZE ) )   \
+        {                                                                         \
+            for ( ; tmp_ptr >= base_ptr; tmp_ptr -= ( ELEM_SIZE ) )               \
+            {                                                                     \
+                if ( CMP ( run_ptr, tmp_ptr ) >= 0 )                              \
+                    break;                                                        \
+            }                                                                     \
+            tmp_ptr += ( ELEM_SIZE );                                             \
+            if ( tmp_ptr != run_ptr )                                             \
+            {                                                                     \
+                char *trav;                                                       \
+                trav = run_ptr + ( ELEM_SIZE );                                   \
+                while ( --trav >= run_ptr )                                       \
+                {                                                                 \
+                    char c = *trav;                                               \
+                    char *hi, *lo;                                                \
+                    for (hi=lo=trav; (lo-=(ELEM_SIZE)) >= tmp_ptr; hi=lo)         \
+                        *hi = *lo;                                                \
+                    *hi = c;                                                      \
+                }                                                                 \
+            }                                                                     \
+        }                                                                         \
+    }                                                                             \
+    ( void ) 0
+
+#endif /* _h_klib_ksort_macro_ */
diff --git a/interfaces/klib/log.h b/interfaces/klib/log.h
new file mode 100644
index 0000000..f8262df
--- /dev/null
+++ b/interfaces/klib/log.h
@@ -0,0 +1,381 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_log_
+#define _h_klib_log_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_logfmt_
+#include <klib/logfmt.h>
+#endif
+
+#ifndef _h_klib_writer_
+#include <klib/writer.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * KLogLevel
+ *  indicates the severity of message: emission of messages depends upon
+ *  the setting of a global value that allows messages assigned higher priority
+ * (lower numeric value) while filtering lower priority messages.
+ *
+ *  "fatal" - reported when about to abort
+ *  "sys"   - an error occurred when interacting with OS
+ *  "int"   - an internal logic error occurred
+ *  "err"   - a user-level error occurred
+ *  "warn"  - an unusual or undesired condition was detected
+ *  "info"  - an event, state or condition is being reported
+ *  "debug" - verbose output for use in debugging
+ */
+typedef uint32_t KLogLevel;
+enum
+{
+    klogLevelMin = 0,
+    klogFatal = klogLevelMin,
+    klogSys,
+    klogInt,
+    klogErr,
+    klogWarn,
+    klogInfo,
+    klogDebug,
+    klogLevelMax = klogDebug
+};
+
+/* Get
+ *  retrieve current process-global log level
+ */
+KLIB_EXTERN KLogLevel CC KLogLevelGet (void);
+
+/* Set
+ *  set process-global log level
+ */
+KLIB_EXTERN rc_t CC KLogLevelSet ( KLogLevel lvl );
+
+
+/* KLogLevelAdjust
+ *  adjust process-global log level by an offset from current
+ */
+KLIB_EXTERN void CC KLogLevelAdjust ( int32_t adjust );
+
+
+/* KLogLevelExplain
+ *  inserts level description
+ *
+ * buffer may not be NULL, num_writ may be NULL
+ */
+KLIB_EXTERN rc_t CC KLogLevelExplain ( KLogLevel lvl, char* buffer, size_t bsize, size_t* num_writ );
+
+KLIB_EXTERN const char ** CC KLogGetParamStrings ( void );
+
+/* LastErrorCode
+ * LastErrorCodeReset
+ *  return or clear the last reported rc_t with log level klogErr or above
+ */
+KLIB_EXTERN rc_t CC KLogLastErrorCode ( void );
+KLIB_EXTERN void CC KLogLastErrorCodeReset ( void );
+
+/* LastErrorCodeSet
+ *  set the last reported rc_t with log level klogErr or above
+ */
+KLIB_EXTERN void CC KLogLastErrorCodeSet ( KLogLevel lvl, rc_t rc );
+
+/* -----
+ * Handlers for application and library writers.
+ */
+KLIB_EXTERN KWrtHandler* CC KLogHandlerGet (void);
+KLIB_EXTERN KWrtHandler* CC KLogLibHandlerGet (void);
+
+KLIB_EXTERN KWrtWriter CC KLogWriterGet (void);
+KLIB_EXTERN KWrtWriter CC KLogLibWriterGet (void);
+KLIB_EXTERN void* CC KLogDataGet (void);
+KLIB_EXTERN void* CC KLogLibDataGet (void);
+
+
+/* Handler
+ *  sets output handler for standard output
+ *
+ *  "logger" [ IN ] and "self" [ IN, OPAQUE ] - callback function
+ *  to handle log output
+ */
+KLIB_EXTERN rc_t CC KLogHandlerSet    (KWrtWriter writer, void * data);
+KLIB_EXTERN rc_t CC KLogLibHandlerSet (KWrtWriter writer, void * data);
+
+KLIB_EXTERN rc_t CC KLogHandlerSetStdOut    (void);
+KLIB_EXTERN rc_t CC KLogLibHandlerSetStdOut (void);
+KLIB_EXTERN rc_t CC KLogHandlerSetStdErr    (void);
+KLIB_EXTERN rc_t CC KLogLibHandlerSetStdErr (void);
+
+/* formatting */
+
+typedef uint32_t KLogFmtFlags;
+enum
+{
+    klogFmtTimestamp = 0x00000001,
+    klogFmtSeverity = 0x00000002,
+    klogFmtPid = 0x00000004,
+    klogFmtAppName = 0x00000008,
+    klogFmtAppVersion = 0x00000010,
+    klogFmtMessage = 0x00000020, /* actual message  */
+    klogFmtReason = 0x00000040, /* full RC message */
+    klogFmtReasonShort = 0x00000080, /* object and state only */
+    klogFmtRC = 0x00000100, /* rc enum textual values */
+    klogFmtModule = 0x00000200, /* rc enum name for module */
+    klogFmtTarget = 0x00000400, /* rc enum name for target */
+    klogFmtContext = 0x00000800, /* rc enum name for context */
+    klogFmtObject = 0x00001000, /* rc enum name for object */
+    klogFmtState = 0x00002000, /* rc enum name for state */
+    klogFmtModuleText = 0x00004000, /* rc enum text for module */
+    klogFmtTargetText = 0x00008000, /* rc enum text for target */
+    klogFmtContextText = 0x00010000, /* rc enum text for context */
+    klogFmtObjectText = 0x00020000, /* rc enum text for object */
+    klogFmtStateText = 0x00040000, /* rc enum text for state */
+    klogFmtLocalTimestamp = 0x00080000 /* print time stamp in local time, if both bits set local takes over */
+};
+
+KLIB_EXTERN KFmtHandler* CC KLogFmtHandlerGet (void);
+KLIB_EXTERN KFmtHandler* CC KLogLibFmtHandlerGet (void);
+
+KLIB_EXTERN KLogFmtFlags CC KLogFmtFlagsGet ( void );
+KLIB_EXTERN KLogFmtFlags CC KLogLibFmtFlagsGet ( void );
+
+KLIB_EXTERN KFmtWriter CC KLogFmtWriterGet (void);
+KLIB_EXTERN KFmtWriter CC KLogLibFmtWriterGet (void);
+KLIB_EXTERN void* CC KLogFmtDataGet (void);
+KLIB_EXTERN void* CC KLogLibFmtDataGet (void);
+
+KLIB_EXTERN rc_t CC KLogFmtFlagsSet    (KLogFmtFlags flags);
+KLIB_EXTERN rc_t CC KLogLibFmtFlagsSet (KLogFmtFlags flags);
+
+KLIB_EXTERN rc_t CC KLogFmtHandlerSet    (KFmtWriter formatter, KLogFmtFlags flags, void* data);
+KLIB_EXTERN rc_t CC KLogLibFmtHandlerSet (KFmtWriter formatter, KLogFmtFlags flags, void* data);
+
+KLIB_EXTERN rc_t CC KLogFmtHandlerSetDefault(void);
+KLIB_EXTERN rc_t CC KLogLibFmtHandlerSetDefault(void);
+
+/*--------------------------------------------------------------------------
+ * Log
+ *  global logging
+ *
+ *  this logging API - like most others - attempts to remain isolated
+ *  from any actual logging implementation, such that output may be
+ *  routed in several ways.
+ *
+ *  the default handler
+ *
+ *  the path from unstructured text to formatted XML is difficult in that
+ *  it requires parsing, and is therefore error prone.
+ *
+ *  the path from structured reports to XML as well as less or unstructured
+ *  text is simple to implement, but generally more of a burden to use.
+ *
+ *  the challenge is therefore to present an API that makes structured
+ *  logging less painful than it might be.
+ */
+
+
+/* Init
+ *  initialize the logging module with executable identity and version,
+ *  plus logging level. actual behavior is determined by the logging
+ *  implementation.
+ *
+ */
+KLIB_EXTERN rc_t CC KLogInit (void );
+
+/* LogMsg
+ *  makes an entry to the log file
+ *
+ *  "lvl" [ IN ] - severity of message
+ *
+ *  "msg" [ IN ] - NUL terminated string
+ */
+KLIB_EXTERN rc_t CC LogMsg ( KLogLevel lvl, const char *msg );
+KLIB_EXTERN rc_t CC LogLibMsg ( KLogLevel lvl, const char *msg );
+
+/* pLogMsg
+ *  makes a parameterized entry to the log file
+ *
+ *  "lvl" [ IN ] - severity of message
+ *
+ *  "msg" [ IN ] - NUL terminated string with named parameters
+ *
+ *  "fmt" [ IN ] - NUL terminated format string, behaves according
+ *  to standard printf-style formatting
+ */
+KLIB_EXTERN rc_t CC pLogMsg ( KLogLevel lvl, const char *msg, const char *fmt, ... );
+KLIB_EXTERN rc_t CC vLogMsg ( KLogLevel lvl, const char *msg, const char *fmt, va_list args );
+KLIB_EXTERN rc_t CC pLogLibMsg ( KLogLevel lvl, const char *msg, const char *fmt, ... );
+KLIB_EXTERN rc_t CC vLogLibMsg ( KLogLevel lvl, const char *msg, const char *fmt, va_list args );
+
+
+/* LogErr
+ *  reports an error to log file
+ *
+ *  "lvl" [ IN ] - severity of message
+ *
+ *  "rc" [ IN ] - return code to be decoded
+ *
+ *  "msg" [ IN, NULL OKAY ] - optional NUL terminated message string
+ */
+KLIB_EXTERN rc_t CC LogErr ( KLogLevel lvl, rc_t rc, const char *msg );
+KLIB_EXTERN rc_t CC LogLibErr ( KLogLevel lvl, rc_t rc, const char *msg );
+
+
+/* pLogErr
+ *  reports an error to log file
+ *
+ *  "lvl" [ IN ] - severity of message
+ *
+ *  "rc" [ IN ] - return code to be decoded
+ *
+ *  "msg" [ IN ] - NUL terminated message string with named parameters
+ *
+ *  "fmt" [ IN ] - NUL terminated format string, behaves according
+ *  to standard printf-style formatting
+ */
+KLIB_EXTERN rc_t CC pLogErr ( KLogLevel lvl, rc_t rc, const char *msg, const char *fmt, ... );
+KLIB_EXTERN rc_t CC vLogErr ( KLogLevel lvl, rc_t rc, const char *msg, const char *fmt, va_list args );
+KLIB_EXTERN rc_t CC pLogLibErr ( KLogLevel lvl, rc_t rc, const char *msg, const char *fmt, ... );
+KLIB_EXTERN rc_t CC vLogLibErr ( KLogLevel lvl, rc_t rc, const char *msg, const char *fmt, va_list args );
+
+/* conditional wrapper */
+#ifdef _LIBRARY
+
+/*
+ * Usage:
+ *  LOGMSG (logWarn, (logWarn, "Something happened"));
+ *
+ * But we can't HAVE a pony...
+ */
+#define LOGMSG(lvl,msg)         \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? LogLibMsg (lvl, msg) : (rc_t)0)
+
+/*
+ * fmt is  two fmt strings plus parameters 
+ * usage resembles
+ *   PLOGMSG (logWarn, (logWarn, "message with $(PARAM1) and $(PARAM2)", "PARAM1=%s,PARAM2=%d", "parameter1", int_var));
+ */
+#define PLOGMSG(lvl,msg)        \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? pLogLibMsg msg : (rc_t)0)
+
+/*
+ * fmt is  two fmt strings plus parameters 
+ * usage resembles
+ *   VLOGMSG (logWarn, (logWarn, "message with $(PARAM1) and $(PARAM2)", "PARAM1=%s,PARAM2=%d", args));
+ */
+#define VLOGMSG(lvl,msg)        \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? vLogLibMsg msg : (rc_t)0)
+
+/*
+ * Usage:
+ *  LOGMSG (logWarn, rc, "Something wicked this way comes");
+ */
+#define LOGERR(lvl,rc,msg)        \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? LogLibErr (lvl,rc,msg) : (rc_t)0)
+
+/*
+ * fmt is  two fmt strings plus parameters 
+ * usage resembles
+ *   PLOGERR (logWarn, (logWarn, rc, "message with $(PARAM1) and $(PARAM2)", "PARAM1=%s,PARAM2=%d", "parameter1", int_var));
+ */
+#define PLOGERR(lvl,msg)        \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? pLogLibErr msg : (rc_t)0)
+
+/*
+ * fmt is  two fmt strings plus parameters 
+ * usage resembles
+ *   VLOGERR (logWarn, (logWarn, rc, "message with $(PARAM1) and $(PARAM2)", "PARAM1=%s,PARAM2=%d", args));
+ */
+#define VLOGERR(lvl,msg)        \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? vLogLibErr msg : (rc_t)0)
+
+#else
+
+/*
+ * Usage:
+ *  LOGMSG (logWarn, "Something happened");
+ */
+#define LOGMSG(lvl,msg)         \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? LogMsg (lvl,msg) : (rc_t)0)
+
+/*
+ * fmt is  two fmt strings plus parameters 
+ * usage resembles
+ *   PLOGMSG (logWarn, (logWarn, "message with $(PARAM1) and $(PARAM2)", "PARAM1=%s,PARAM2=%d", "parameter1", int_var));
+ */
+#define PLOGMSG(lvl,msg)        \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? pLogMsg msg : (rc_t)0)
+
+/*
+ * fmt is  two fmt strings plus parameters 
+ * usage resembles
+ *   VLOGMSG (logWarn, (logWarn, "message with $(PARAM1) and $(PARAM2)", "PARAM1=%s,PARAM2=%d", args));
+ */
+#define VLOGMSG(lvl,msg)        \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? vLogMsg msg : (rc_t)0)
+
+/*
+ * Usage:
+ *  LOGMSG (logWarn, rc, "Something wicked this way comes");
+ */
+#define LOGERR(lvl,rc,msg)        \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? LogErr (lvl,rc,msg) : (rc_t)0)
+
+/*
+ * fmt is  two fmt strings plus parameters 
+ * usage resembles
+ *   PLOGERR (logWarn, (logWarn, rc, "message with $(PARAM1) and $(PARAM2)", "PARAM1=%s,PARAM2=%d", "parameter1", int_var));
+ */
+#define PLOGERR(lvl,msg)        \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? pLogErr msg : (rc_t)0)
+
+/*
+ * fmt is  two fmt strings plus parameters 
+ * usage resembles
+ *   VLOGERR (logWarn, (logWarn, rc, "message with $(PARAM1) and $(PARAM2)", "PARAM1=%s,PARAM2=%d", args));
+ */
+#define VLOGERR(lvl,msg)        \
+    ((((unsigned)lvl) <= KLogLevelGet()) ? vLogErr msg : (rc_t)0)
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_log_ */
diff --git a/interfaces/klib/logfmt.h b/interfaces/klib/logfmt.h
new file mode 100644
index 0000000..619a3ec
--- /dev/null
+++ b/interfaces/klib/logfmt.h
@@ -0,0 +1,62 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_logfmt_
+#define _h_klib_logfmt_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define PLOG_NAME(name)   #name
+#define	PLOG_C(name)	  PLOG_NAME(name) "=%c"
+#define	PLOG_S(name)	  PLOG_NAME(name) "=%s"
+#define	PLOG_I8(name)	  PLOG_NAME(name) "=%hhd"
+#define	PLOG_U8(name)	  PLOG_NAME(name) "=%hhu"
+#define	PLOG_X8(name)	  PLOG_NAME(name) "=0x%2.2hhX"
+#define	PLOG_I16(name)	  PLOG_NAME(name) "=%hd"
+#define	PLOG_U16(name)	  PLOG_NAME(name) "=%hu"
+#define	PLOG_X16(name)	  PLOG_NAME(name) "=0x%4.4hX"
+#define	PLOG_I32(name)	  PLOG_NAME(name) "=%d"
+#define	PLOG_U32(name)	  PLOG_NAME(name) "=%u"
+#define	PLOG_X32(name)	  PLOG_NAME(name) "=0x%8.8X"
+#define	PLOG_I64(name)	  PLOG_NAME(name) "=%ld"
+#define	PLOG_U64(name)	  PLOG_NAME(name) "=%lu"
+#define	PLOG_X64(name)	  PLOG_NAME(name) "=0x%16.16lX"
+#define	PLOG_PDIFF(name)  PLOG_NAME(name) "=%zd"
+#define	PLOG_SIZE(name)	  PLOG_NAME(name) "=0x%zu"
+#define PLOG_P(name)      PLOG_NAME(name) "=%p"
+/* use the above to fill in the below */
+#define PLOG_2(a,b)		    a "," b
+#define PLOG_3(a,b,c)		a "," b "," c
+#define PLOG_4(a,b,c,d)		a "," b "," c "," d
+#define PLOG_5(a,b,c,d,e)	a "," b "," c "," d "," e
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_logfmt_ */
diff --git a/interfaces/klib/misc.h b/interfaces/klib/misc.h
new file mode 100644
index 0000000..21469da
--- /dev/null
+++ b/interfaces/klib/misc.h
@@ -0,0 +1,51 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_misc_
+#define _h_klib_misc_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** Is user a administrator? Has user root privileges? */
+KLIB_EXTERN bool CC is_iser_an_admin(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_klib_misc_ */
diff --git a/interfaces/klib/namelist.h b/interfaces/klib/namelist.h
new file mode 100644
index 0000000..8439d72
--- /dev/null
+++ b/interfaces/klib/namelist.h
@@ -0,0 +1,227 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_namelist_
+#define _h_klib_namelist_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KNamelist
+ *  a generic list of NUL-terminated name strings
+ */
+typedef struct KNamelist KNamelist;
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KLIB_EXTERN rc_t CC KNamelistAddRef ( const KNamelist *self );
+KLIB_EXTERN rc_t CC KNamelistRelease ( const KNamelist *self );
+
+/* Count
+ *  returns the number of entries
+ *
+ *  "count" [ OUT ] - return parameter for entry count
+ */
+KLIB_EXTERN rc_t CC KNamelistCount ( const KNamelist *self, uint32_t *count );
+
+/* Get
+ *  get an indexed name
+ *
+ *  "idx" [ IN ] - a zero-based name index
+ *
+ *  "name" [ OUT ] - return parameter for NUL terminated name
+ */
+KLIB_EXTERN rc_t CC KNamelistGet ( const KNamelist *self,
+    uint32_t idx, const char **name );
+
+
+/*--------------------------------------------------------------------------
+ * VNamelist
+ *  generic Vector namelist implementation
+ */
+typedef struct VNamelist VNamelist;
+
+/* Make
+ *  make an empty namelist
+ *
+ *  "names" [ OUT ] - return parameter for namelist object
+ *
+ *  "alloc_blocksize" [ IN ] - selects the number of names in
+ *  a vector block; used for allocating and extending
+ */
+KLIB_EXTERN rc_t CC VNamelistMake ( VNamelist **names, const uint32_t alloc_blocksize );
+
+/* Release
+ *  ignores NULL references
+ */
+KLIB_EXTERN rc_t CC VNamelistRelease ( const VNamelist *self );
+
+/* ToNamelist
+ *  cast operator
+ *
+ *  "cast" [ OUT ] - return parameter for new KNamelist reference
+ *  must be released by KNamelistRelease
+ */
+KLIB_EXTERN rc_t CC VNamelistToNamelist ( VNamelist *self, KNamelist **cast );
+KLIB_EXTERN rc_t CC VNamelistToConstNamelist ( const VNamelist *self, const KNamelist **cast );
+
+
+/* Append
+ *  appends a copy of string to the VNamelist
+ *
+ *  "src" [ IN ] - NUL terminated name string / String-struct ... to be copied
+ *  and appended.
+ */
+KLIB_EXTERN rc_t CC VNamelistAppend ( VNamelist *self, const char* src );
+KLIB_EXTERN rc_t CC VNamelistAppendString ( VNamelist *self, const String * src );
+
+/* Remove
+ *  removes a string from the namelist
+ *
+ *  "s" [ IN ] - NUL terminated name string to be removed
+ */
+KLIB_EXTERN rc_t CC VNamelistRemove( VNamelist *self, const char* s );
+
+/* Remove all
+ *  removes all strings from the namelist ( calls free on them internally )
+ *
+ */
+KLIB_EXTERN rc_t CC VNamelistRemoveAll( VNamelist *self );
+
+
+/* Remove string at index ( and calls fron on it internally )
+ *  returns error code if index is invalid
+ *
+ */
+KLIB_EXTERN rc_t CC VNamelistRemoveIdx( VNamelist *self, uint32_t idx );
+
+
+/* IndexOf
+ *  searches linear in the namelist for the string
+ *
+ *  "s" [ IN ] - NUL terminated name string to be searched for
+ *
+ *  "found" [ OUT ] - index of the string if found
+ *  unchanged if not found
+ *
+ *  returns RC( rcCont, rcNamelist, rcSearching, rcString, rcNotFound ) if not found
+ */
+KLIB_EXTERN rc_t CC VNamelistIndexOf( VNamelist *self, const char* s, uint32_t *found );
+
+/* Count
+ *  returns the number of entries
+ *
+ *  "count" [ OUT ] - return parameter for entry count
+ */
+KLIB_EXTERN rc_t CC VNameListCount ( const VNamelist *self, uint32_t *count );
+
+/* Get
+ *  get an indexed name
+ *
+ *  "idx" [ IN ] - a zero-based name index
+ *
+ *  "name" [ OUT ] - return parameter for NUL terminated name
+ */
+KLIB_EXTERN rc_t CC VNameListGet ( const VNamelist *self, uint32_t idx, const char **name );
+
+
+/* Reorder
+ *  sort the names according to case sensitivity
+ *  and UNICODE character code ordering
+ *
+ *  "case_insensitive" [ IN ] - when true, perform "tolower" on
+ *   each character before compare
+ */
+KLIB_EXTERN void CC VNamelistReorder ( VNamelist *self, bool case_insensitive );
+
+
+/* foreach_String_part, foreach_Str_part
+ *  splits a String or char-ptr by delim, invokes callback-funtion on each part
+ *  trailing delim's without content are omitted
+ */
+KLIB_EXTERN rc_t CC foreach_String_part( const String * src, const uint32_t delim,
+         rc_t ( CC * f ) ( const String * part, void *data ), void * data );
+         
+KLIB_EXTERN rc_t CC foreach_Str_part( const char * src, const uint32_t delim,
+         rc_t ( CC * f ) ( const String * part, void *data ), void * data );
+
+
+/* VNamelistSplitString, VNamelistSplitStr
+ *  splits a String or char-ptr and adds parts to existing VNamelist
+ */
+KLIB_EXTERN rc_t CC VNamelistSplitString ( VNamelist * list,
+        const String * str, const uint32_t delim );
+
+KLIB_EXTERN rc_t CC VNamelistSplitStr ( VNamelist * list,
+        const char * str, const uint32_t delim );
+
+
+/* VNamelistFromString, VNamelistFromStr
+ *  splits a String or char-ptr and creates VNamelist from parts
+ */
+KLIB_EXTERN rc_t CC VNamelistFromString ( VNamelist ** list,
+        const String * str, const uint32_t delim );
+
+KLIB_EXTERN rc_t CC VNamelistFromStr ( VNamelist ** list,
+        const char * str, const uint32_t delim );
+
+/* VNamelistJoin
+ *  join all strings in the given list and put delim's inbetween them
+ *  the function will allocate the result-String
+ */
+KLIB_EXTERN rc_t CC VNamelistJoin( const VNamelist * list,
+        const uint32_t delim, const String ** rslt );
+
+/* VNamelistContainsString, VNamelistContainsStr
+ *  loop through the list to and report if and where it contains the item
+ */
+KLIB_EXTERN rc_t CC VNamelistContainsString( const VNamelist * list,
+        const String * item, int32_t * idx );
+KLIB_EXTERN rc_t CC VNamelistContainsStr( const VNamelist * list,
+        const char * item, int32_t * idx );
+        
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_namelist_ */
diff --git a/interfaces/klib/namelist.hpp b/interfaces/klib/namelist.hpp
new file mode 100644
index 0000000..58c7d6a
--- /dev/null
+++ b/interfaces/klib/namelist.hpp
@@ -0,0 +1,130 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_klib_namelist_
+#define _hpp_klib_namelist_
+
+#ifndef _h_klib_namelist_
+#include <klib/namelist.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KNamelist
+ *  a generic list of NUL-terminated name strings
+ */
+struct KNamelist
+{
+    /* AddRef
+     * Release
+     *  ignores NULL references
+     */
+    inline int AddRef () const throw()
+    { return KNamelistAddRef ( this ); }
+    inline int Release () const throw()
+    { return KNamelistRelease ( this ); }
+
+    /* Count
+     *  returns the number of entries
+     *
+     *  "count" [ OUT ] - return parameter for entry count
+     */
+    rc_t Count ( uint32_t *count ) const throw()
+    { return KNamelistCount ( this, count ); }
+
+    /* Get
+     *  get an indexed name
+     *
+     *  "idx" [ IN ] - a zero-based name index
+     *
+     *  "name" [ OUT ] - return parameter for NUL terminated name
+     */
+    rc_t Get ( uint32_t idx, const char **name ) const throw()
+    { return KNamelistGet ( this, idx, name ); }
+
+private:
+    KNamelist ();
+    ~ KNamelist ();
+    KNamelist ( const KNamelist& );
+    KNamelist &operator = ( const KNamelist& );
+};
+
+
+/*--------------------------------------------------------------------------
+ * VNamelist
+ *  a vector-based list of NUL-terminated name strings
+ */
+struct VNamelist
+{
+
+    inline static rc_t Make ( VNamelist **namelist, const uint32_t alloc_blocksize ) throw ()
+    { return VNamelistMake ( namelist, alloc_blocksize ); }
+
+    /* AddRef
+     * Release
+     *  ignores NULL references
+     */
+    inline int AddRef () const throw()
+    { return KNamelistAddRef ( ( const KNamelist * )this ); }
+    inline int Release () const throw()
+    { return VNamelistRelease ( this ); }
+
+    /* Count
+     *  returns the number of entries
+     *
+     *  "count" [ OUT ] - return parameter for entry count
+     */
+    rc_t Count ( uint32_t *count ) const throw()
+    { return KNamelistCount ( ( const KNamelist * )this, count ); }
+
+    /* Get
+     *  get an indexed name
+     *
+     *  "idx" [ IN ] - a zero-based name index
+     *
+     *  "name" [ OUT ] - return parameter for NUL terminated name
+     */
+    rc_t Get ( uint32_t idx, const char **name ) const throw()
+    { return KNamelistGet ( ( const KNamelist * )this, idx, name ); }
+    
+    /* Append
+     *  append a string...
+     *
+     *  "src" [ IN ] - the string to append
+     */
+    rc_t Append ( const char *src ) throw()
+    { return VNamelistAppend ( this, src ); }
+
+
+private:
+    VNamelist ();
+    ~ VNamelist ();
+    VNamelist ( const VNamelist& );
+    VNamelist &operator = ( const VNamelist& );
+};
+
+ 
+#endif // _hpp_klib_namelist_
diff --git a/interfaces/klib/ncbi-vdb-version.h b/interfaces/klib/ncbi-vdb-version.h
new file mode 100644
index 0000000..b56ba31
--- /dev/null
+++ b/interfaces/klib/ncbi-vdb-version.h
@@ -0,0 +1,56 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#ifndef _h_klib_ncbi_vdb_version_
+#define _h_klib_ncbi_vdb_version_
+
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** Return ncbi-vdb package version.
+    The returned string should not be released. */
+KLIB_EXTERN const char *GetPackageVersion(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _h_klib_ncbi_vdb_version_ */
diff --git a/interfaces/klib/num-gen.h b/interfaces/klib/num-gen.h
new file mode 100644
index 0000000..844107f
--- /dev/null
+++ b/interfaces/klib/num-gen.h
@@ -0,0 +1,228 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_num_gen_
+#define _h_klib_num_gen_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * A NUMBER GENERATOR
+ * 
+ *  input : string, for instance "3,6,8,12,44-49"
+ *  ouptut: sequence of integers, for instance 3,6,8,12,44,45,46,47,48,49
+ */
+
+
+/*--------------------------------------------------------------------------
+ * opaque number-generator and it's iterator
+ */
+struct num_gen;
+struct num_gen_iter;
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_make
+ *
+ *  creates a empty number-generator
+ *  or creates a number-generator and parses the string
+ *  or creates and presets it with a range
+ */
+KLIB_EXTERN rc_t CC num_gen_make( struct num_gen ** self );
+KLIB_EXTERN rc_t CC num_gen_make_sorted( struct num_gen ** self, bool sorted );
+KLIB_EXTERN rc_t CC num_gen_make_from_str( struct num_gen ** self, const char * src );
+KLIB_EXTERN rc_t CC num_gen_make_from_str_sorted( struct num_gen ** self, const char * src, bool sorted );
+KLIB_EXTERN rc_t CC num_gen_make_from_range( struct num_gen ** self, int64_t first, uint64_t count );
+KLIB_EXTERN rc_t CC num_gen_copy( const struct num_gen * self, struct num_gen ** dest );
+
+/*--------------------------------------------------------------------------
+ * num_gen_destroy
+ *
+ *  destroys a number-generator
+ */
+KLIB_EXTERN rc_t CC num_gen_destroy( struct num_gen * self );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_clear
+ *
+ *  resets a number-generator, to be empty just like after num_gen_make()
+ */
+KLIB_EXTERN rc_t CC num_gen_clear( struct num_gen * self );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_parse
+ *
+ *  parses a given string in this form: "3,6,8,12,44-49"
+ *  does not clear the number-generator before parsing
+ *  eventual overlaps with the previous content are consolidated
+ */
+KLIB_EXTERN rc_t CC num_gen_parse( struct num_gen * self, const char * src );
+KLIB_EXTERN rc_t CC num_gen_parse_S( struct num_gen * self, const String * src );
+
+/*--------------------------------------------------------------------------
+ * num_gen_add
+ *
+ *  inserts the given interval into the number-generator
+ *
+ *  num_gen_add( *g, 10, 30 )
+ *  is equivalent to:
+ *  num_gen_parse( *g, "10-39" );
+ *
+ *  eventual overlaps with the previous content are consolidated 
+ */
+KLIB_EXTERN rc_t CC num_gen_add( struct num_gen * self, const int64_t first, const uint64_t count );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_trim
+ *
+ *  checks if the content of the number-generator is inside the given interval
+ *  removes or shortens internal nodes if necessary
+ */
+KLIB_EXTERN rc_t CC num_gen_trim( struct num_gen * self, const int64_t first, const uint64_t count );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_empty
+ *
+ *  checks if the generator has no ranges defined
+ */
+KLIB_EXTERN bool CC num_gen_empty( const struct num_gen * self );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_as_string
+ *
+ *  prints the content of the num_gen into the buffer
+ *  *s = "1-5,20,24-25"
+ */
+KLIB_EXTERN rc_t CC num_gen_as_string( const struct num_gen * self, char * buffer, size_t buffsize,
+                                        size_t * written, bool full_info );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_contains_value
+ *
+ *  checks if the generator contains the given value
+ */
+KLIB_EXTERN rc_t CC num_gen_contains_value( const struct num_gen * self, const int64_t value );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_range_check
+ *
+ *  if the generator is empty --> set it to the given range
+ *  if it is not empty ---------> trim it to the given range
+ */
+KLIB_EXTERN rc_t CC num_gen_range_check( struct num_gen * self, const int64_t first, const uint64_t count );
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_make
+ *
+ *  creates a iterator from the number-generator
+ *  the iterator contains a constant copy of the number-ranges
+ *  after this call it is safe to destroy or change the number-generator
+ *  returns an error-code if the number-generator was empty,
+ *  and *iter will be NULL
+ */
+KLIB_EXTERN rc_t CC num_gen_iterator_make( const struct num_gen * self, const struct num_gen_iter ** iter );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_destroy
+ *
+ *  destroys the iterator
+ */
+KLIB_EXTERN rc_t CC num_gen_iterator_destroy( const struct num_gen_iter * self );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_count
+ *
+ *  returns how many values the iterator contains
+ */
+KLIB_EXTERN rc_t CC num_gen_iterator_count( const struct num_gen_iter * self, uint64_t * count );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_next
+ *
+ *  pulls the next value out of the iterator...
+ *  returns an error-code if the iterator has no more values
+ */
+KLIB_EXTERN bool CC num_gen_iterator_next( const struct num_gen_iter * self, int64_t * value, rc_t * rc );
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_min
+ *
+ *  pulls the lowest value out of the iterator...
+ *  returns an error-code if the iterator has no more values
+ */
+KLIB_EXTERN rc_t CC num_gen_iterator_min( const struct num_gen_iter * self, int64_t * value );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_max
+ *
+ *  pulls the highest value out of the iterator...
+ *  returns an error-code if the iterator has no more values
+ */
+KLIB_EXTERN rc_t CC num_gen_iterator_max( const struct num_gen_iter * self, int64_t * value );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_percent
+ *
+ *  return in value the percentage of the iterator...
+ *  depending on fract-digits the percentage will be:
+ *      fract_digits = 0 ... full percent's
+ *      fract_digits = 1 ... 1/10-th of a percent
+ *      fract_digits = 2 ... 1/100-th of a percent
+ */
+KLIB_EXTERN rc_t CC num_gen_iterator_percent( const struct num_gen_iter * self, uint8_t fract_digits, uint32_t * value );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_num_gen_ */
diff --git a/interfaces/klib/out.h b/interfaces/klib/out.h
new file mode 100644
index 0000000..02aa06f
--- /dev/null
+++ b/interfaces/klib/out.h
@@ -0,0 +1,86 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_out_
+#define _h_klib_out_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_writer_
+#include <klib/writer.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* -----
+ * Handlers for application and library writers.
+ */
+
+KLIB_EXTERN KWrtHandler* CC KOutHandlerGet (void);
+
+/* Handler
+ *  sets output handler for standard output
+ *
+ *  "logger" [ IN ] and "self" [ IN, OPAQUE ] - callback function
+ *  to handle log output
+ */
+KLIB_EXTERN rc_t CC KOutHandlerSet          (KWrtWriter writer, void * data);
+KLIB_EXTERN rc_t CC KOutHandlerSetStdOut    (void);
+KLIB_EXTERN rc_t CC KOutHandlerSetStdErr    (void);
+
+KLIB_EXTERN KWrtWriter CC KOutWriterGet (void);
+KLIB_EXTERN void * CC KOutDataGet (void);
+
+KLIB_EXTERN rc_t CC KOutInit (void);
+
+KLIB_EXTERN rc_t CC KOutMsg (const char * fmt, ...);
+
+#define KOutStr(str) KOutMsg("%s",str)
+
+/*
+ * A usage could look like
+ *
+ * OUTMSG (kout_2, "Current Out Level is %d\n", OutLevelGet());
+ *
+ */
+#define OUTMSG(msg) \
+    ((KOutWriterGet() != NULL) ? KOutMsg msg : 0)
+
+#define OUTSTR(msg) \
+    ((KOutWriterGet() != NULL) ? KOutStr (msg) : 0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_klib_out_ */
diff --git a/interfaces/klib/pack.h b/interfaces/klib/pack.h
new file mode 100644
index 0000000..dbc1656
--- /dev/null
+++ b/interfaces/klib/pack.h
@@ -0,0 +1,138 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_pack_
+#define _h_klib_pack_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * bit-packing operations
+ *  packed bits have leading zeros eliminated
+ *  unpacked bits have no more information, but may occupy more storage
+ *
+ *  packed bits are stored in big-endian byte order and big-bit-endian
+ *  bit order. unpacked bits are in architecture native order.
+ *
+ *  little-endian architectures place the least significant information
+ *  in the left-most addresses. Intel architecture still has bit ordering
+ *  with LSB to the right. the only way to view byte and bit order as
+ *  coherent in this architecture is in 2 dimensions, such that bit ordering
+ *  within a byte is along one dimension and the bytes are another.
+ *
+ *  viewing a stream of bits is by definition uni-dimensional, and thus
+ *  this code treats bit streams in big-bit-endian order, with the most
+ *  significant bit of the most significant byte to the left, and each
+ *  bit to the right has decreasing significance.
+ *
+ *  packed bits are left-aligned, such that an 8=>2 packing of the bytes
+ *  [ 1, 2, 3 ] will yield a single byte of 0b01101100 ( 0x6C ).
+ *
+ *  a pack or unpack operation with identical bit sizes ( e.g. 16=>16 )
+ *  will act like a _memcpy_ on big-endian architectures and a byte-swap
+ *  on little-endian architectures.
+ */
+
+
+/* Pack
+ *  accepts a series of unpacked source bits
+ *  produces a series of packed destination bits by eliminating MSB
+ *
+ *  "unpacked" [ IN ] - original element size in bits
+ *  must be in 2^^[3..6], i.e. { 8, 16, 32, 64 }
+ *
+ *  "packed" [ IN ] - packed element size in bits
+ *  must be <= "unpacked"
+ *
+ *  "src" [ IN ] and "ssize" [ IN ] - source buffer
+ *  with size given in bytes
+ *
+ *  "consumed" [ OUT, NULL OKAY ] - number of source bytes
+ *  consumed. if NULL, then all source bytes MUST be consumed
+ *  or an error will be generated.
+ *
+ *  "dst" [ OUT ] and "dst_off" [ IN ] - destination
+ *  buffer bit address
+ *
+ *  "dsize" [ IN ] - size of "dst" in bits, not including "dst_off"
+ *
+ *  "psize" [ OUT ] - resultant packed size in bits
+ *
+ * NB - the implementation may allow packing in place
+ */
+KLIB_EXTERN rc_t CC Pack ( uint32_t unpacked, uint32_t packed,
+    const void *src, size_t ssize, size_t *consumed,
+    void *dst, bitsz_t dst_off, bitsz_t dsize, bitsz_t *psize );
+
+
+/* Unpack
+ *  accepts a series of packed source bits
+ *  produces a series of unpacked destination bits by left-padding zeros
+ *
+ *  "packed" [ IN ] - packed element size in bits
+ *
+ *  "unpacked [ IN ] - original element size in bits
+ *  must be >= "packed" and
+ *  must be in 2^^[3..6], i.e. { 8, 16, 32, 64 }
+ *
+ *  "src" [ IN ] and "src_off" [ IN ] - source buffer
+ *  bit address
+ *
+ *  "ssize" [ IN ] - number of bits in "src", not including "src_off"
+ *
+ *  "consumed" [ OUT, NULL OKAY ] - number of source bits
+ *  consumed. if NULL, then all source bits MUST be consumed
+ *  or an error will be generated.
+ *
+ *  "dst" [ OUT ] and "dsize" [ IN ] - destination buffer
+ *  where size is given in bytes
+ *
+ *  "usize" [ OUT ] - resultant unpacked size in bytes
+ *
+ * NB - "src" and "dst" may have same address since
+ *  the implementation unpacks from right to left, smaller to larger
+ */
+KLIB_EXTERN rc_t CC Unpack ( uint32_t packed, uint32_t unpacked,
+    const void *src, bitsz_t src_off, bitsz_t ssize, bitsz_t *consumed,
+    void *dst, size_t dsize, size_t *usize );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_pack_ */
diff --git a/interfaces/klib/path-priv.h b/interfaces/klib/path-priv.h
new file mode 100644
index 0000000..23a4d43
--- /dev/null
+++ b/interfaces/klib/path-priv.h
@@ -0,0 +1,266 @@
+/*===========================================================================
+*
+*                            Public Domain Notice
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_path_priv_
+#define _h_klib_path_priv_
+
+#ifndef _h_vfs_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_vfs_path_
+#include <klib/path.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct String;
+
+
+#define NCBI_FILE_SCHEME       "ncbi-file"
+#define NCBI_ACCESSION_SCHEME  "ncbi-acc"
+#define HTTP_SCHEME            "http"
+#define FTP_SCHEME             "ftp"
+#define FASP_SCHEME            "fasp"
+#define NCBI_LEGREFSEQ_SCHEME  "x-ncbi-legrefseq"
+#define NCBI_OBJECT_SCHEME     "ncbi-obj"
+
+/* options for a VPath possibly obtained from a query string on an URI */
+typedef uint32_t KPOption_t;
+enum eKPOption_t
+{
+    kpopt_encrypted,
+    kpopt_pwpath,
+    kpopt_pwfd,
+    kpopt_readgroup,
+#if 0    
+    kpopt_temporary_pw_hack,
+#endif    
+    kpopt_vdb_ctx,
+    kpopt_gap_ticket, 
+    kpopt_count
+};
+
+
+/* =====
+ * Much of what follows is expected to move into the interface klib/path.h
+ * once it becomes supported.
+ */
+
+/* MakeFmt
+ *  make a path object from a format string plus arguments
+ *
+ *  "new_path" [ OUT ] - a reference to the new object.
+ *
+ *  "fmt" [ IN ] and "args" [ IN ] - arguments to string_printf
+ *  ( see <klib/text.h> ) to build a NUL-terminated string
+ *  that conforms with the rules for "posix_path"
+ *
+ * NB - SECURITY RISK IF USED DIRECTLY FROM EXTERNAL STRINGS.
+ *      ALSO, FMT IS **NOT** PRINTF COMPATIBLE - see string_printf.
+ */
+
+#if 0
+KLIB_EXTERN rc_t CC KPathMakeRelative ( KPath ** new_path, const KPath * base_path,
+                                       const char * relative_path );
+KLIB_EXTERN rc_t CC KPathMakeRelativeFmt ( KPath ** new_path, const KPath * base_path,
+                                          const char * fmt, ... );
+KLIB_EXTERN rc_t CC KPathVMakeRelativeFmt ( KPath ** new_path, const KPath * base_path,
+                                           const char * fmt, va_list args );
+KLIB_EXTERN rc_t CC KPathMakeCurrentPath ( KPath ** new_path );
+
+KLIB_EXTERN rc_t CC KPathMakeURI ( KPath ** new_path, const char * uri );
+#endif
+
+
+/* Option
+ *  rc == 0 if the option has been specified
+ *  for options with a parameter, the value of the parameter is copied to buffer
+ */
+KLIB_EXTERN rc_t CC KPathOption ( const KPath * self, KPOption_t option,
+                                char * buffer, size_t buffer_size,
+                                size_t * num_read);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vfs_path_priv_ */
+
+/*--------------------------------------------------------------------------
+ *
+ * The ABNF form described in RFC5234 will be used to define URLS and paths
+ * with some handwaving instead of complete character definitions for case 
+ * insensitivity.  CORE definitions from RFC5234 will be used again handwaving
+ * case insensitivity.
+ *
+ * --------------------
+ *
+ * URL for a VPath
+ *
+ *  as per RFC 3986, an URI consists of:
+ *
+ *    URI           = scheme ":" heir-part [ "?" query ] [ "#" fragment ]
+ *
+ *  We will support however something intbetween an URI and an IRI in that we'll
+ *  all UTF-8 rather than limit certain characters to ASCII.
+ *
+ *  For the NCBI path  URL:  The hier-part is intended to be compatible with the 
+ *                    "file:" scheme  Authority on any of the Unix-like operating
+ *                    systems must either be empty or "localhost".  For Windows
+ *                    it must  be a host that can be used if the "file" url is
+ *                    translated into a UNC style Windows path.  Also in a
+ *                    Windows vfs: URL a single colon ':' will be allowed only at
+ *                    the end of a single character rive letter for the first
+ *                    sub-part of the path.
+ *
+ *    scheme        = "ncbi-file" ; ( case insensitive )
+ *
+ *    hier-part     = "//" authority path-abempty
+ *                  / path-absolute
+ *                  / path-relative
+ *                  / path-empty
+ *
+ * by RFC 3986 authority is
+ *    authority     = [ userinfo "@" ] host [ ":" port]
+ * but at this point we only recognize
+ *    authority     = host
+ *
+ * by RFC 3986 host is
+ *    host          = IP-literal / IPv4address / reg-name
+ * but at this point we only recognize
+ *    host          = reg-name
+ *
+ *    reg-name      = *( unreserved / pct-encoded / sub-delims )
+ *
+ *    path          = path-abempty
+ *                  / path-absolute
+ *                  / path-noscheme
+ *                  / path-rootless
+ *                  / path-empty
+ *
+ *    path-abempty  = * ( "/" segment )
+ *
+ *    path-absolute = "/" segment-nz *( "/" segment )
+ *
+ *    path-noscheme = segment-nz-nc *( "/" segment )
+ *
+ *    path-rootless = segment-nz *( "/" segment )
+ *
+ *    path-empty    = ""
+ *
+ *    segment       = *pchar       ; can be empty
+ *    segment-nz    = 1*pchar      ; can't be empty
+ *    segment-nz-nc = 1*pchar-nz   ; can't be empty
+ *
+ *    pchar         = ":" / pchar-nc
+ *
+ *    pchar-nc      = unreserved / pct-encoded / sub-delims ? "@"
+ *
+ *    pct-encoded   = "%" HEXDIG HEXDIG ; hex digits are 0-9, a-f or A-F
+ *
+ *    authority   = "localhost" / host-name ; the host name is an O/S specific 
+ *                                          ; name of a remote host 
+ *
+ *    query       = query_entry [ * ( "&" query_entry ) ]
+ *
+ *    query_entry = "encrypt" / "enc" / ( "pwfile=" hier-part ) / ( "pwfd=" fd )
+ *
+ *    fd          = 1* DIGIT
+ *
+ *    unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~" / UTF-8
+ *
+ *    reserved    = gen-delims / subdelims
+ *
+ *    gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
+ *
+ *    sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*"
+ *                / "+" / "," / ";" / "="
+ *
+ * Handwaving on the UTF-8.  We'll accept it rather than requiring percent encoding
+ * in most cases.
+
+ * Examples:
+ *         "ncbi-file://home/my-name/data-files"
+ *         "ncbi-file://win-server/archive/secure/read12345?encrypted"
+ *         "ncbi-file:///c:/scanned-data/0001/file.sra?enc?pwd-file=c:/Users/JamesMcCoy/ncbi.pwd"
+ *
+ *  We allow an implied scheme of "vfs" if none present.
+ *  'host-name' is partially implemented for Windows.  Not currently for any the
+ *  of the supported Unix systems.  We do not support IP addresses instead of 
+ *  host names.
+ *
+ *  'path' can be either absolute or relative and must be posix style as per 
+ *  RFC 3986 and matches the "file" scheme.
+ *
+ *  'fragment' is not yet implemented or defined.
+ *
+ *  'fd' is a system specific file handle.  Not yet supported on Windows.
+ *
+ * --------------------
+ *
+ * VFS posix_path representation:
+ *
+ * The internal representation of a path for VFS resembles very closely the
+ * POSIX pathname crossed with the Windows UNC path.  Only the Unix "/" 
+ * separator is allowed not the "\" for paths.
+ *
+ * posix-path     = full-path / relative-path
+ *
+ * full-path      = ["//" host] "/" [ directory-path "/" ] resource
+ *
+ * relative-path  = [ directory-path "/" ] resource
+ *
+ * directory-path = resource [ "/" directory-path ]
+ *
+ * resource       = string ; (UTF-8 O/S specific name for a directory or a file)
+ *
+ * host           = string ; (UTF-8 O/S specific name for the local or remote host)
+ *
+ * For a host "localhost" is a synonym for the current host.
+ * The "//host" is not guaranteed to work for all systems except "//localhost"
+ *
+ * The resource "." is assumed to mean the local directory and will be stripped
+ * when a path is made canonical.
+ *
+ * The resource ".." is assumed to mean the containing directory and when made 
+ * canonical it will be left in at the begining for relative paths or removed along 
+ * with the preceding resource name.
+ *
+ * For Windows the device is handled in a unique way with some potential for ambiguity.
+ * The UNC approach for a named drive "C:" becomes "/c".  So "C:\" becomes "/c/".
+ *
+ * In the future the complex approach from the "file:" URL should be adopted 
+ * with the ":" allowed only in the first directory name in a path.  RFC 3986 
+ * notes though that this complex approach puts some five variants into the ABNF
+ * to describe the path portion of an URL.
+ */
diff --git a/interfaces/klib/path.h b/interfaces/klib/path.h
new file mode 100644
index 0000000..eebcfb0
--- /dev/null
+++ b/interfaces/klib/path.h
@@ -0,0 +1,252 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_path_
+#define _h_klib_path_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+    
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct String;
+
+
+/*--------------------------------------------------------------------------
+ * KPath
+ *  represents an unbound object query key
+ *  may be created from a simple file-system path,
+ *  a more formal URN or URL,
+ *  or other modes of creation
+ *
+ *  a path will have these parts:
+ *    scheme       : a scheme for retrieval
+ *    auth         : login name for authentication
+ *    host         : authoritative source
+ *    port         : port for connecting with host
+ *    path         : host-relative path
+ *    query        : parameters for interpretation
+ *    fragment     : internal component of object
+ *    proj         : project id
+ *    name         : alternate or primary name
+ *
+ *  file-system paths with no modifying parameters
+ *  will be given standard "file" scheme. paths having
+ *  parameters will be given the scheme "ncbi-file".
+ *
+ *  standard networking schemes ( "http", "ftp", etc. )
+ *  are supported.
+ *
+ *  NCBI accessions are given the scheme "ncbi-acc".
+ *
+ *  NCBI remote object id paths receive scheme "ncbi-obj".
+ */
+typedef struct KPath KPath;
+
+
+/* MakePath
+ *  make a path object from a string conforming to
+ *  either a standard POSIX path or a URI
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "path_str" [ IN ] - a UTF-8 NUL-terminated string
+ *  representing a POSIX path or URI, or
+ *  a string_printf compatible format string
+ *
+ *  "path_fmt" [ IN ] and "args" [ IN ] - a UTF-8 NUL-terminated fmt string
+ *  compatible with string_vprintf, plus argument list
+ *
+ *  Examples:
+ *      "ncbi-file:/home/my-name/data-files"
+ *      "ncbi-file://win-server/archive/secure/read12345?encrypted"
+ *      "ncbi-file:///c/scanned-data/0001/file.sra?enc&pwfile=/c/Users/JamesMcCoy/ncbi.pwd"
+
+    KLIB_EXTERN rc_t CC MakePath_v1 ( KPath ** new_path, const char *path_str, ... );
+    KLIB_EXTERN rc_t CC VMakePath_v1 ( KPath ** new_path, const char *path_fmt, va_list args );
+ */
+KLIB_EXTERN KPath * CC MakePath ( ctx_t ctx, const char *path_str, ... );
+KLIB_EXTERN KPath * CC VMakePath ( ctx_t ctx, const char *path_fmt, va_list args );
+
+/* MakeSysPath
+ *  make a path object from an OS native filesystem path string
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "sys_path" [ IN ] - a UTF-8 NUL-terminated string
+ *  representing a native filesystem path
+ *
+ *  "wide_sys_path" [ IN ] - a wide NUL-terminated string
+ *  representing a native filesystem path, where
+ *  wchar_t is either USC-2 or UTF-32 depending upon libraries
+
+
+KLIB_EXTERN KPath * CC MakeSysPath ( ctx_t ctx, const char *sys_path );
+KLIB_EXTERN KPath * CC VMakeSysPath ( ctx_t ctx, const wchar_t * wide_sys_path );
+ */
+
+/* MakeAccPath - TEMPORARY
+ *  takes a textual accession representation
+ *  creates a VPath representing an accession
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "acc" [ IN ] - a NUL-terminated ASCII fmt string
+
+    LIB_EXPORT rc_t CC MakeAccPath_v1 ( KPath ** new_path, const char * acc, ... );
+    LIB_EXPORT rc_t CC VMakeAccPath_v1 ( KPath ** new_path, const char * fmt, va_list args );
+ */
+
+KLIB_EXTERN KPath * CC MakeAccPath ( ctx_t ctx, const char * acc, ... );
+KLIB_EXTERN KPath * CC VMakeAccPath ( ctx_t ctx, const char * fmt, va_list args );
+
+/* MakeOidPath - TEMPORARY
+ *  takes an integer oid
+ *  creates a VPath representing an obj-id
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "oid" [ IN ] - a non-zero object id
+
+    LIB_EXPORT rc_t CC MakeOidPath_v1 ( KPath ** new_path, uint32_t oid )
+ */
+
+KLIB_EXTERN KPath * CC MakeOidPath ( ctx_t ctx, uint32_t oid );
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KLIB_EXTERN KPath * CC KPathDuplicate ( const KPath *self, ctx_t ctx );
+KLIB_EXTERN rc_t CC KPathRelease ( const KPath *self );
+
+
+/* IsFSCompatible
+ *  asks if the path can be used with the OS' filesystems
+ */
+KLIB_EXTERN bool CC KPathIsFSCompatible ( const KPath *self, ctx_t ctx );
+
+
+/* FromUri
+ *  asks if the path was created from a formal URI
+ */
+KLIB_EXTERN bool CC KPathFromUri ( const KPath *self, ctx_t ctx );
+
+/* Read*
+ *  read the various parts
+ *  copies out data into user-supplied buffer
+ *
+ *  "buffer" [ OUT ] and "buffer_size" [ IN ] - output buffer
+ *  for data read. if sufficient space is available, the copy
+ *  will be NUL-terminated.
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  for the number of valid bytes in "buffer" after a successful
+ *  read. on failure due to insufficient buffer, contains the
+ *  number of bytes required for transfer.
+ */
+KLIB_EXTERN size_t CC KPathReadUri ( const KPath *self, ctx_t ctx,
+                                     char * buffer, size_t buffer_size );
+    KLIB_EXTERN size_t CC KPathReadScheme ( const KPath * self, ctx_t ctx,
+                                        char * buffer, size_t buffer_size );
+KLIB_EXTERN size_t CC KPathReadAuth ( const KPath *self, ctx_t ctx,
+                                      char * buffer, size_t buffer_size );
+KLIB_EXTERN size_t CC KPathReadHost ( const KPath *self, ctx_t ctx,
+                                      char * buffer, size_t buffer_size );
+KLIB_EXTERN size_t CC KPathReadPortName ( const KPath *self, ctx_t ctx,
+                                          char * buffer, size_t buffer_size );
+KLIB_EXTERN size_t CC KPathReadPath ( const KPath *self, ctx_t ctx,
+                                      char * buffer, size_t buffer_size );
+KLIB_EXTERN size_t CC KPathReadQuery ( const KPath *self, ctx_t ctx,
+                                       char * buffer, size_t buffer_size );
+KLIB_EXTERN size_t CC KPathReadParam ( const KPath *self, ctx_t ctx, 
+                                       const char * param, char * buffer, size_t buffer_size );
+KLIB_EXTERN size_t CC KPathReadFragment ( const KPath *self, ctx_t ctx,
+                                          char * buffer, size_t buffer_size );
+
+
+/* MakeUri
+ *  convert a VPath into a URI
+ */
+KLIB_EXTERN struct String const * CC KPathMakeUri ( const KPath *self, ctx_t ctx );
+
+
+
+/* MakeString
+ *  convert a KPath into a String
+ *  respects original source of path,
+ *  i.e. does not add scheme unnecessarily
+ */
+KLIB_EXTERN struct String const * CC KPathMakeString ( const KPath *self, ctx_t ctx );
+
+
+/* Get*
+ *  retrieves internal parts
+ *  returns pointers to internal String data
+ *  Strings remain valid while "self" is valid
+ */
+KLIB_EXTERN struct String *  CC KPathGetScheme ( const KPath *self, ctx_t ctx, struct String * str );
+KLIB_EXTERN struct String *  CC KPathGetAuth ( const KPath *self, ctx_t ctx, struct String * str );
+KLIB_EXTERN struct String *  CC KPathGetHost ( const KPath *self, ctx_t ctx, struct String * str );
+KLIB_EXTERN struct String *  CC KPathGetPortName ( const KPath *self, ctx_t ctx, struct String * str );
+KLIB_EXTERN uint16_t CC KPathGetPortNum ( const KPath *self, ctx_t ctx );
+KLIB_EXTERN struct String *  CC KPathGetPath ( const KPath *self, ctx_t ctx, struct String * str );
+KLIB_EXTERN struct String *  CC KPathGetQuery ( const KPath *self, ctx_t ctx, struct String * str );
+KLIB_EXTERN struct String *  CC KPathGetParam ( const KPath *self, ctx_t ctx, const char * param, struct String * str );
+KLIB_EXTERN struct String *  CC KPathGetFragment ( const KPath *self, ctx_t ctx, struct String * str );
+/* TEMPORARY */
+KLIB_EXTERN uint32_t CC KPathGetOid ( const KPath *self, ctx_t ctx );
+
+/* legacy support */
+/*
+#define KPathMake LegacyKPathMake
+KLIB_EXTERN rc_t KPathMake ( KPath ** new_path, const char * posix_path );
+#define KPathMakeFmt LegacyKPathMakeFmt
+rc_t KPathMakeFmt ( KPath ** new_path, const char * fmt, ... );
+#define KPathMakeVFmt LegacyKPathMakeVFmt
+rc_t KPathMakeVFmt ( KPath ** new_path, const char * fmt, va_list args );
+#define KPathMakeSysPath LegacyKPathMakeSysPath
+KLIB_EXTERN rc_t KPathMakeSysPath ( KPath ** new_path, const char * sys_path );
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vfs_path_ */
diff --git a/interfaces/klib/pbstree.h b/interfaces/klib/pbstree.h
new file mode 100644
index 0000000..3d69bbb
--- /dev/null
+++ b/interfaces/klib/pbstree.h
@@ -0,0 +1,287 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_pbstree_
+#define _h_klib_pbstree_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct BSTree;
+
+
+/*--------------------------------------------------------------------------
+ * PBSTNode
+ *  identifies a node within persisted binary search tree
+ *
+ *  a BSTree will contain BSTNodes, which themselves are intrusive but
+ *  irrelevant internal tree links plus an externally defined data
+ *  structure, having both key and value, and supporting multiple
+ *  keys per node. the internal links permit navigation from node
+ *  to node that is not possible with the PBSTNode.
+ *
+ *  a PBSTree does not contain structured nodes, but stores linkage
+ *  and ordering information separately from the externally defined
+ *  data, and rather than using pointers, assigns integer ids to the
+ *  nodes themselves. navigation by pointers would require allocations,
+ *  which are unnecessary and expensive when traversing a read-only
+ *  persisted image. navigation is therefore intrusive on an externally
+ *  allocated node structure.
+ */
+typedef struct PBSTNode PBSTNode;
+struct PBSTNode
+{
+    struct
+    {
+        const void *addr;
+        size_t size;
+
+    } data;
+
+    const void *internal;
+    uint32_t id;
+};
+
+/* PBSTNodeNext
+ *  updates the structure
+ *  returns next 1-based node id or 0 for NULL
+ */
+KLIB_EXTERN uint32_t CC PBSTNodeNext ( PBSTNode *self );
+
+/* PBSTNodePrev
+ *  updates the structure
+ *  returns prev 1-based node id or 0 for NULL
+ */
+KLIB_EXTERN uint32_t CC PBSTNodePrev ( PBSTNode *self );
+
+/* PBSTNodeFindNext
+ *  find next element satisfying criteria
+ *  fills out "n" if found
+ *  returns 1-based node id or 0 for NULL
+ */
+KLIB_EXTERN uint32_t CC PBSTNodeFindNext ( PBSTNode *self,
+     bool ( CC * f ) ( const PBSTNode *n ) );
+
+/* PBSTNodeFindPrev
+ *  find previous element satisfying criteria
+ *  fills out "n" if found
+ *  returns 1-based node id or 0 for NULL
+ */
+KLIB_EXTERN uint32_t CC PBSTNodeFindPrev ( PBSTNode *self,
+    bool ( CC * f ) ( const PBSTNode *n ) );
+
+
+/*--------------------------------------------------------------------------
+ * PBSTree
+ *  a flattened binary search tree
+ *
+ *  mimics read-only behavior of a BSTree
+ */
+typedef struct PBSTree PBSTree;
+
+/* PBSTreeMake
+ *  make a PBSTree structure
+ *
+ *  "mem" [ IN ] - constant memory image of persisted tree
+ *  with a lifetime exceeding that of the PBSTree itself
+ *
+ *  "byteswap" [ IN ] - if true, the persisted image needs
+ *  to be read with byteswapping
+ */
+KLIB_EXTERN rc_t CC PBSTreeMake ( PBSTree **pt, const void *addr, size_t size, bool byteswap );
+
+/* PBSTreeCount
+ *  returns number of elements in tree
+ *  not included within the BSTree interface itself, but
+ *  was included here due to the fact that it is constant
+ *
+ *  return value:
+ *    integer value >= 0
+ */
+KLIB_EXTERN uint32_t CC PBSTreeCount ( const PBSTree *self );
+
+/* PBSTreeDepth
+ *  returns number of layers in tree
+ *
+ *  return value:
+ *    integer value >= 0
+ */
+KLIB_EXTERN uint32_t CC PBSTreeDepth ( const PBSTree *self );
+
+/* PBSTreeSize
+ *  returns the size in bytes
+ *  of the PBSTree image
+ */
+KLIB_EXTERN size_t CC PBSTreeSize ( const PBSTree *self );
+
+/* PBSTreeGetNode
+ *  gets a PBSTNode from an id
+ *
+ *  "node" [ OUT ] - return parameter for node
+ *
+ *  "id" [ IN ] - a 1-based integer node id
+ *
+ *  return values:
+ *    EINVAL => an invalid parameter was passed
+ *    ENOENT => id out of range
+ */
+KLIB_EXTERN rc_t CC PBSTreeGetNode ( const PBSTree *self, PBSTNode *node, uint32_t id );
+
+/* PBSTreeFind
+ *  find an object within tree
+ *
+ *  "rtn" [ OUT ] - return parameter for node if found. its value
+ *  is undefined unless the function returns success.
+ *
+ *  "item" [ IN ] - item to be matched against a node. will be
+ *  supplied as the first parameter to the comparison function.
+ *
+ *  "cmp" [ IN ] - function that evaluates "item" against each internal
+ *  node for relative position, returning 0 for match, negative when
+ *  "item" is to left of node, and positive otherwise.
+ *
+ *  return value:
+ *    0    => not found
+ *    1..n => internal id of node, also recorded within "rtn"
+ */
+KLIB_EXTERN uint32_t CC PBSTreeFind ( const PBSTree *self, PBSTNode *rtn,
+    const void *item, int ( CC * cmp ) ( const void *item, const PBSTNode *n , void * data), void * data );
+
+/* PBSTreeForEach
+ *  executes a function on each tree element
+ *
+ *  "reverse" [ IN ] - if true, traverse from last to first element,
+ *  if false, traverse in the normal forward direction.
+ *
+ *  "f" [ IN ] and "data" [ IN ] - callback function for evaluating each
+ *  node within the tree. the passed out node structure is itself fully
+ *  modifiable.
+ */
+KLIB_EXTERN void CC PBSTreeForEach ( const PBSTree *self, bool reverse,
+    void ( CC * f ) ( PBSTNode *n, void *data ), void *data );
+
+/* PBSTreeDoUntil
+ *  executes a function on each element
+ *  until the function returns true
+ *
+ *  "reverse" [ IN ] - if true, traverse from last to first element,
+ *  if false, traverse in the normal forward direction.
+ *
+ *  "f" [ IN ] and "data" [ IN ] - callback function for evaluating each
+ *  node within the tree. the passed out node structure is itself fully
+ *  modifiable. the function returns "true" to halt iteration.
+ *
+ *  return values:
+ *    the last value returned by "f" or false if never invoked
+ */
+KLIB_EXTERN bool CC PBSTreeDoUntil ( const PBSTree *self, bool reverse,
+    bool ( CC * f ) ( PBSTNode *n, void *data ), void *data );
+
+/* PBSTreeWhack
+ *  whacks PBSTree object
+ *  the constant memory image used to create the PBSTree may now be released
+ */
+KLIB_EXTERN void CC PBSTreeWhack ( PBSTree *self );
+
+
+
+/*--------------------------------------------------------------------------
+ * persistence functions
+ */
+
+/* PTWriteFunc
+ *  a generic streaming function
+ */
+typedef rc_t ( CC * PTWriteFunc )
+    ( void *param, const void *buffer, size_t bytes, size_t *num_writ );
+
+/* PTAuxFunc
+ *  a function to measure or write auxiliary node data
+ *  where "node" is a BSTNode or TTNode.
+ *
+ *  when "write" is NULL, the number of bytes that would
+ *  be written is returned in "num_writ".
+ */
+typedef rc_t ( CC * PTAuxFunc )
+    ( void *param, const void *node, size_t *num_writ,
+      PTWriteFunc write, void *write_param );
+
+
+/*--------------------------------------------------------------------------
+ * BSTree
+ */
+
+/* BSTreePersist
+ *  write a binary search tree to some storage location
+ *
+ *  the tree is persisted by making between one and three passes
+ *  over its nodes, see description of "write" parameter.
+ *
+ *  the first pass examines internal tree structure and invokes
+ *  a user-supplied function to determine overall size.
+ *
+ *  the second pass persists the internal structure in a packed
+ *  format, using the user-supplied generic "write" function.
+ *
+ *  the third pass invokes another user-supplied function to write
+ *  auxiliary node data to output.
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] -  returns parameter for the number
+ *  of bytes written as a result of persisting the tree. this will
+ *  be the actual bytes written regardless of return status.
+ *
+ *  "write" [ IN, NULL OKAY ]  and "write_param" [ IN ] -  a generic
+ *  output streaming function used for all operations. if NULL, then
+ *  the function will exit after its first pass with the number of
+ *  bytes required in "num_writ".
+ *
+ *  "aux" [ IN ] and "aux_param" [ IN ] - a specialized function for
+ *  streaming auxiliary node data to output using the supplied "write"
+ *  function. it is invoked during the first pass with a NULL write
+ *  function for gathering size data, and during the third pass with
+ *  a non-NULL write function.
+ */
+KLIB_EXTERN rc_t CC BSTreePersist ( struct BSTree const *self, size_t *num_writ,
+    PTWriteFunc write, void *write_param, PTAuxFunc aux, void *aux_param );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_pbstree_ */
diff --git a/interfaces/klib/printf.h b/interfaces/klib/printf.h
new file mode 100644
index 0000000..e56ed15
--- /dev/null
+++ b/interfaces/klib/printf.h
@@ -0,0 +1,406 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_printf_
+#define _h_klib_printf_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct String;
+struct KSymbol;
+struct KDataBuffer;
+struct KWrtHandler;
+
+
+/*--------------------------------------------------------------------------
+ * FORMAT
+ *  a description of the string_printf formatting
+ */
+
+#define SUPPORT_PERCENT_N 1
+
+
+/*
+  The standard C library formatting approach was taken as a basis.
+
+  This interface differs in some ways, in that it presents a sub-set of
+  the std. C format convention, and then extends it for klib.
+
+  The general substitution parameter format is:
+
+    '%' [ <flags> ] [ <field-width> ] [ '.' <precision> ] [ ':' <index> ] \
+        [ <storage-class-width> ] <storage-class>
+
+  where:
+
+    flags
+        = ' '           : prepend space to a numeral if it does not have a sign
+        | '+'           : always produce a sign on numeric conversion
+        | '-'           : left-align parameter within field
+        | '0'           : left-pad with zeros rather than spaces
+        | '#'           : use "alternate" representation
+        | ','           : produce comma-separated triples
+        | '\''          :  "      "
+        ;
+
+    field-width *(1)
+        = DECIMAL       : an unsigned base-10 numeral
+        | '*'           : take field width from args as type 'uint32_t'
+        ;
+
+    precision *(1)(2)(3)
+        = DECIMAL       : an unsigned base-10 numeral
+        | '*'           : take precision from args as type 'uint32_t'
+        |               : an empty precision means 0
+        ;
+
+    index
+        = idx           : a single, zero-based vector element
+        | idx '-' idx   : a fully-closed, zero-based interval
+        | idx '/' len   : a start index plus length
+        ;
+
+    idx
+        = DECIMAL       : an unsigned base-10 numeral
+        | '*'           : take index from args as type 'uint32_t'
+        | '$'           : last vector element
+        |               : an empty index means 0 or $
+        ;
+
+    len
+        = DECIMAL       : a base-10 numeral
+        | '*'           : take length from args as type 'uint32_t'
+        | '$'           : length-of ( vector )
+        |               : an empty length means $
+        ;
+
+    storage-class-width
+        = 't'           : tiny integer ( i.e. byte )
+        | 'h'           : half the normal size
+        | 'l'           : twice the normal size
+        | 'z'           : sizeof size_t
+        | time-modifier
+        ;
+
+    time-modifier
+        = 'h'           : date only
+        | 'l'           : date and time
+        | 'z'           : date, time and zone
+        ;
+
+    scalar storage-class
+        = 'd' | 'i'     : decimal signed integer
+        | 'u'           : decimal unsigned integer
+        | 'x'           : lower-case hex integer
+        | 'X'           : upper-case hex integer
+        | 'o'           : octal integer
+        | 'b'           : binary integer
+        | 'p'           : hex void*
+        | 'f'           : double
+        | 'e'           : scientific notation double
+        | 'g'           : general double
+        | 'c'           : UTF-32 character
+        | 'N'           : const KSymbol* [ <klib/symbol.h> ]
+        | 'V' *(2)      : tri-part version [ ver_t ]
+        | 'R'           : return code [ rc_t ]
+        | 'T'           : const KTime*  [ <klib/time.h> ]
+        | '!'           ; operating specific error code ( i.e. errno or GetLastError() )
+        | 'n' *(5)      ; output of number of characters printed so far to uint32_t*
+        ;
+
+    single-index vector storage-class *(6)(7)
+        = 'd' | 'i'     : as above
+        | 'u' | 'x'     : index range is ignored
+        | 'X' | 'o'     : start index is used
+        | 'b' | 'p'     : to select element
+        | 'f' | 'e' | 'g'
+        | 'N'           : const KSymbol* [ <klib/symbol.h> ]
+        | 'V' *(2)      : tri-part version [ ver_t ]
+        | 'R'           : return code [ rc_t ]
+        | 'T'           : const KTime*  [ <klib/time.h> ]
+        ;
+
+    index-range vector storage-class *(8)
+        = 'c' *(9)      : unbounded character vector
+        | 's' | 'S'     : bounded character vector
+        ;
+
+  Notes:
+     1. field-width and precision measure characters, not bytes
+     2. for version numbers, precision gives the number of fields,
+        where 1 = major, 2 = major.minor and 3 = major.minor.release.
+     3. in the absence of precision, versions are written with the
+        minimum number of fields required.
+     4. the storage-class-width is interpreted differently for storage-class
+        'T' ( const KTime* )
+     5. %n may not be supported for security purposes
+     6. when an index is specified, the argument is taken as an
+        unbounded vector. if an index range is given, only the
+        starting index is used, and only a single element is selected.
+     7. the vector reference class is determined by both the format
+        and the size modifier.
+     8. an index for character classes may specify a string as the
+        selection. when missing, the default start index is 0 while
+        the default end index is $.
+     9. a character vector is NOT assumed to be NUL-terminated,
+        and in this case the default end index is the start index.
+
+ */
+
+
+/* string_printf
+ *  provides a facility similar to snprintf
+ *  formatting is similar but differs somewhat [ see FORMAT at bottom ]
+ *
+ *  "dst" [ OUT ] and "bsize" [ IN ] - output buffer for string
+ *  will be NUL-terminated if possible
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - returns the number of non-NUL bytes
+ *  written to "dst" or the required "bsize" to complete successfully,
+ *  not including the NUL termination.
+ *
+ *  "fmt" [ IN ] and "args" [ IN, OPTIONAL ] - data to write
+ *
+ *  returns 0 if all bytes were successfully written and a NUL-byte was
+ *  written into the buffer.
+ *
+ *  returns rcBuffer, rcInsufficient if the buffer was too small. in this
+ *  case, it is possible that the only missing byte would be the NUL
+ *  termination, and the output string may still be usable since "num_writ"
+ *  indicates the actual number of text bytes.
+ */
+KLIB_EXTERN rc_t CC string_printf ( char *dst, size_t bsize,
+    size_t *num_writ, const char *fmt, ... );
+KLIB_EXTERN rc_t CC string_vprintf ( char *dst, size_t bsize,
+    size_t *num_writ, const char *fmt, va_list args );
+
+
+/* KDataBufferPrintf
+ *  provides a facility similar to string_printf
+ *  except that it appends into a KDataBuffer
+ *
+ *  "buf" [ IN ] - previously initialized buffer
+ *  MUST be initialized, or results are unpredictable
+ *  ( except for the prediction that all will fail )
+ */
+KLIB_EXTERN rc_t CC KDataBufferPrintf ( struct KDataBuffer * buf,
+    const char * fmt, ... );
+KLIB_EXTERN rc_t CC KDataBufferVPrintf ( struct KDataBuffer * buf,
+    const char * fmt, va_list args );
+
+
+/*--------------------------------------------------------------------------
+ * structured_printf
+ *  the engine behind string_printf
+ */
+
+/* formatting
+ */
+enum
+{
+    spfNone,                                    /* 'n', sptTerm                       */
+    spfText,                                    /* 'csS', literal                     */
+    spfSignedInt,                               /* 'di'                               */
+    spfUnsigned,                                /* 'bouxX'                            */
+    spfStdFloat,                                /* 'f'                                */
+    spfGenFloat,                                /* 'g'                                */
+    spfSciFloat,                                /* 'e'                                */
+    spfVersion,                                 /* 'V'                                */
+    spfSymbol,                                  /* 'N'                                */
+    spfTime,                                    /* [ 'hlz' + ] 'T'                    */
+    spfRC,                                      /* 'R'                                */
+    spfOSErr                                    /* '!'                                */
+};
+
+/* types
+ */
+enum
+{
+    sptTerm,                                    /* terminates format                  */
+    sptLiteral,                                 /* char literal        - arg in fmt   */
+    sptSignedInt,                               /* signed scalar int   - arg is d     */
+    sptSignedInt8Vect,                          /* signed vector int   - arg is d8    */
+    sptSignedInt16Vect,                         /* signed vector int   - arg is d16   */
+    sptSignedInt32Vect,                         /* signed vector int   - arg is d32   */
+    sptSignedInt64Vect,                         /* signed vector int   - arg is d64   */
+    sptUnsignedInt,                             /* unsigned scalar int - arg is u     */
+    sptUnsignedInt8Vect,                        /* unsigned vector int - arg is u8    */
+    sptUnsignedInt16Vect,                       /* unsigned vector int - arg is u16   */
+    sptUnsignedInt32Vect,                       /* unsigned vector int - arg is u32   */
+    sptUnsignedInt64Vect,                       /* unsigned vector int - arg is u64   */
+    sptFloat,                                   /* scalar float        - arg is f     */
+    sptFloat32Vect,                             /* vector float        - arg is f32   */
+    sptFloat64Vect,                             /* vector float        - arg is f64   */
+    sptFloatLongVect,                           /* vector float        - arg is flong */
+    sptChar,                                    /* scalar character    - arg is c     */
+    sptNulTermString,                           /* vector character    - arg is s     */
+    sptString,                                  /* vector character    - arg is S     */
+    sptUCS2String,                              /* vector character    - arg is S     */
+    sptUTF32String,                             /* vector character    - arg is S     */
+    sptPointer,                                 /* object reference    - arg is p     */
+    sptRowId,                                   /* current row id      - arg is d     */
+    sptRowLen                                   /* current row length  - arg is u     */
+#if SUPPORT_PERCENT_N
+    , sptBytesPrinted                           /* output parameter    - arg is n     */
+#endif
+};
+
+
+/* format
+ *  structured and constant format information
+ *  takes the place of format string
+ *  flags indicate whether fields are active
+ *  and in some cases whether the value is external, in the next arg
+ */
+typedef struct PrintFmt PrintFmt;
+struct PrintFmt
+{
+    union
+    {
+        struct
+        {
+            uint64_t min_field_width;           /* minimum field width in characters  */
+            uint64_t precision;                 /* precision in characters            */
+            uint64_t start_idx;                 /* zero-based starting vector index   */
+            uint64_t select_len;                /* length of selection or 0 for inf   */
+        } f;
+        struct
+        {
+            const char *text;                   /* string literal text pointer        */
+            size_t size;                        /* string literal text size           */
+        } l;
+    } u;
+    unsigned int upper_case_num       : 1;      /* upper-case numerals                */
+    unsigned int reverse_alnum        : 1;      /* reverse ordering of alpha-numeric  */
+    unsigned int thousands_separate   : 1;      /* separate numerals by thousands     */
+    unsigned int ext_field_width      : 1;      /* field width is external argument   */
+    unsigned int ext_precision        : 1;      /* precision is external argument     */
+    unsigned int inf_start_index      : 1;      /* start index is last in vector      */
+    unsigned int ext_start_index      : 1;      /* start index is external argument   */
+    unsigned int inf_stop_index       : 1;      /* stop index is last in vector       */
+    unsigned int ext_stop_index       : 1;      /* stop index is an external argument */
+    unsigned int ext_select_len       : 1;      /* selection length is external       */
+    unsigned int add_prefix           : 1;      /* '#' flag on 'boxX'                 */
+    unsigned int force_decimal_point  : 1;      /* '#' flag on 'efg'                  */
+    unsigned int leave_trailing_zeros : 1;      /* '#' flag on 'g'                    */
+    unsigned int print_time           : 1;
+    unsigned int print_date           : 1;
+    unsigned int print_weekday        : 1;
+    unsigned int print_timezone       : 1;
+    unsigned int hour_24              : 1;
+    unsigned int min_vers_components  : 1;
+    unsigned int explain_rc           : 1;
+    unsigned int type_cast            : 1;      /* if true, convert type for fmt      */
+    unsigned int pointer_arg          : 1;      /* argument is a pointer              */
+    uint32_t radix;                             /* 0 default, 2, 8, 10, 16, .. 36     */
+    uint8_t fmt;                                /* spf... from above                  */
+    uint8_t type;                               /* spt... from above                  */
+    char sign;                                  /* 0, ' ' or '+'                      */
+    char left_fill;                             /* 0 for left-align, ' ' or '0'       */
+};
+
+
+/* argument
+ *  union of argument values
+ *  passed as an array, much like va_arg
+ */
+typedef union PrintArg PrintArg;
+union PrintArg
+{
+    int64_t d;                                  /* signed integer scalar              */
+    const int8_t *d8;                           /* signed integer vectors             */
+    const int16_t *d16;
+    const int32_t *d32;
+    const int64_t *d64;
+
+    uint64_t u;                                 /* unsigned integer scalar            */
+    const uint8_t *u8;                          /* unsigned integer vectors           */
+    const uint16_t *u16;
+    const uint32_t *u32;
+    const uint64_t *u64;
+
+    double f;                                   /* floating point scalar              */
+    const float *f32;                           /* floating point vectors             */
+    const double *f64;
+    const long double *flong;
+
+    uint32_t c;                                 /* character scalar                   */
+    const char *s;                              /* NUL-terminated char vector         */
+    struct String const *S;                     /* character vector                   */
+
+    const void *p;                              /* object reference                   */
+
+#if SUPPORT_PERCENT_N
+    uint32_t *n;                                /* output parameter                   */
+#endif
+};
+
+
+/* structured_printf
+ *  uses constant format descriptors and argument block
+ *  prints to "out" handler
+ */
+KLIB_EXTERN rc_t CC structured_printf ( struct KWrtHandler const *out,
+    size_t *num_writ, const PrintFmt *fmt, const PrintArg *args );
+
+
+/* structured_sprintf
+ *  uses constant format descriptors and argument block
+ *  prints to UTF-8 character buffer "dst"
+ */
+KLIB_EXTERN rc_t CC structured_sprintf ( char *dst, size_t bsize,
+    size_t *num_writ, const PrintFmt *fmt, const PrintArg *args );
+
+
+/* TEMPORARY */
+KLIB_EXTERN rc_t CC new_string_printf ( char *dst, size_t bsize,
+    size_t *num_writ, const char *fmt, ... );
+KLIB_EXTERN rc_t CC new_string_vprintf ( char *dst, size_t bsize,
+    size_t *num_writ, const char *fmt, va_list args );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_printf_ */
diff --git a/interfaces/klib/progressbar.h b/interfaces/klib/progressbar.h
new file mode 100644
index 0000000..8c0bffa
--- /dev/null
+++ b/interfaces/klib/progressbar.h
@@ -0,0 +1,85 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_progressbar_
+#define _h_progressbar_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct progressbar;
+
+/*--------------------------------------------------------------------------
+ * make_progressbar
+ *
+ *  creates a progressbar with zero-values inside
+ *  does not output anything
+ *  digits: 0  ... update_progressbar( pb, 7 ) 		---> 7%
+ *          1  ... update_progressbar( pb, 71 )		---> 7.1%
+ *          2  ... update_progressbar( pb, 715 )	---> 7.15%
+ *  digits > 2 are internally stored as 2
+ */
+KLIB_EXTERN rc_t CC make_progressbar( struct progressbar ** pb, const uint8_t digits );
+
+
+/*--------------------------------------------------------------------------
+ * destroy_progressbar
+ *
+ *  destroy's the progressbar
+ *  does not output anything
+ */
+KLIB_EXTERN rc_t CC destroy_progressbar( struct progressbar * pb );
+
+
+/*--------------------------------------------------------------------------
+ * update_progressbar
+ *
+ *  sets the progressbar to a specific percentage
+ *  outputs only if the percentage has changed from the last call
+ *  the meaning of the percent-value depends of the given didits value to make_progressbar()
+ *		digits = 0		percent in full percent				 7 ---> 7%
+ *      digits = 1		precent in 1/10-th of a percent 	71 ---> 7,1%
+ *      digits = 2		precent in 1/100-th of a percent   715 ---> 7,15%
+ *  expects the percents in increasing order ( does not jump back )
+ *  writes a growing bar made from '-'-chars with the value at the end
+ */
+KLIB_EXTERN rc_t CC update_progressbar( struct progressbar * pb, const uint32_t percent );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_progressbar_ */
diff --git a/interfaces/klib/ptrie.h b/interfaces/klib/ptrie.h
new file mode 100644
index 0000000..d19e29f
--- /dev/null
+++ b/interfaces/klib/ptrie.h
@@ -0,0 +1,296 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_ptrie_
+#define _h_klib_ptrie_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_pbstree_
+#include <klib/pbstree.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct Trie;
+struct String;
+
+
+/*--------------------------------------------------------------------------
+ * PTNode
+ *  a node within text tree
+ *
+ *  a Trie will contain TNodes, which themselves are intrusive but
+ *  irrelevant internal tree links plus a key string plus an externally
+ *  defined data structure, representing a value, and supporting multiple
+ *  nodes per key. the internal links permit navigation from node
+ *  to node that is not possible with the PTNode. furthermore, they
+ *  provide direct access to the key string that is not normally stored
+ *  verbatim within a persisted image.
+ *
+ *  a PTrie does not contain structured nodes, but stores linkage
+ *  and ordering information separately from the externally defined
+ *  data, and rather than using pointers, assigns integer ids to the
+ *  nodes themselves. navigation by pointers would require allocations,
+ *  which are unnecessary and expensive when traversing a read-only
+ *  persisted image. navigation is therefore intrusive on an externally
+ *  allocated node structure.
+ */
+typedef struct PTNode PTNode;
+struct PTNode
+{
+    /* minimally value data
+       may also contain key string information,
+       either by reference or literal text */
+    struct
+    {
+        const void *addr;
+        size_t size;
+
+    } data;
+
+    /* used internally */
+    const void *internal;
+    uint32_t id;
+};
+
+/* MakeKey
+ *  tries to make a key string from node
+ *  will fail if key text was not embedded into image when created
+ *
+ *  "key" [ OUT ] - return parameter for a key string allocation
+ *  that must be whacked with StringWhack when no longer needed.
+ */
+KLIB_EXTERN rc_t CC PTNodeMakeKey ( const PTNode *self, struct String const **key );
+
+
+/*--------------------------------------------------------------------------
+ * PTrie
+ *  a persisted tree of text nodes
+ *
+ *  this is a collection of { key, value } pairs, where a many-value
+ *  to one key paradigm is naturally supported, as in the b-tree.
+ *
+ *  the desired retrieval operations are:
+ *   a) key -> id : value
+ *   b) key -> { id : value, ... }
+ *   c) RE -> id : value
+ *   d) RE -> { id : value, ... }
+ *   e) iteration across { id : value, ... }
+ *   f) id : value -> key
+ *
+ *  the reverse retrieval operation is:
+ *   a) id -> value
+ *
+ *  indexing of the id is performed externally, and should not be interpreted
+ *  as a serial, integer value. it may be a byte offset or a combination of
+ *  two integer values, as well as anything else.
+ */
+typedef struct PTrie PTrie;
+
+/* Make
+ *  make a persisted tree structure
+ * MakeOrig - DEPRECATED
+ *  includes code to handle original composite node encoding
+ *
+ *  "addr" [ IN ] and "size" [ IN ] - constant memory image of
+ *  persisted text tree with a lifetime exceeding that of the
+ *  PTrie itself
+ *
+ *  "byteswap" [ IN ] - true if persisted image must be byteswapped
+ */
+KLIB_EXTERN rc_t CC PTrieMake ( PTrie **tt,
+    const void *addr, size_t size, bool byteswap );
+KLIB_EXTERN rc_t CC PTrieMakeOrig ( PTrie **tt,
+    const void *addr, size_t size, bool byteswap );
+
+/* Count
+ *  returns number of { id : value } pairs in text tree
+ *  not included within the Trie interface itself, but
+ *  was included here due to the fact that it is constant
+ *
+ *  return value:
+ *    integer value >= 0
+ */
+KLIB_EXTERN uint32_t CC PTrieCount ( const PTrie *self );
+
+/* Size
+ *  returns the size in bytes
+ *  of the PTrie image
+ */
+KLIB_EXTERN size_t CC PTrieSize ( const PTrie *self );
+
+/* GetNode
+ *  gets a PTNode from an id
+ *
+ *  "node" [ OUT ] - return parameter for node
+ *
+ *  "id" [ IN ] - a 1-based integer node id
+ *
+ *  return values:
+ *    EINVAL => an invalid parameter was passed
+ *    ENOENT => id out of range
+ */
+KLIB_EXTERN rc_t CC PTrieGetNode ( const PTrie *self, PTNode *node, uint32_t id );
+
+/* Find
+ * PTrieFindRE
+ *  find a single { id, value } pair  within tree
+ *
+ *  "key" [ IN ] - an exact match text string
+ *
+ *  "re" [ IN ] - a regular expression string
+ *
+ *  "rtn" [ OUT ] - return parameter for node if found.
+ *  its value is undefined unless the function returns success.
+ *
+ *  "custom_cmp" [ IN, NULL OKAY ] and "data" [ OPAQUE ] - optional
+ *  comparison function
+ *
+ *  return value:
+ *    0    => not found
+ *    1..n => id of found pair
+ */
+KLIB_EXTERN uint32_t CC PTrieFind ( const PTrie *self, struct String const *key, PTNode *rtn,
+    int ( CC * custom_cmp ) ( const void *item, const PBSTNode *n ,void *data), void * data );
+
+#if 0
+KLIB_EXTERN uint32_t CC PTrieFindRE ( const PTrie *self, struct String const *re, PTNode *rtn );
+#endif
+
+/* FindAll
+ * PTrieFindAllRE
+ *  find multiple objects within tree
+ *
+ *  "key" [ IN ] - an exact match text string
+ *
+ *  "re" [ IN ] - a regular expression string
+ *
+ *  "buffer" [ OUT ] and "capacity" [ IN ] - a user-supplied
+ *  array of PTNode with a capacity of "capacity" elements.
+ *  if successful, the entire found set will be returned unordered within.
+ *
+ *  "num_found" [ OUT ] - indicates the size of the found set,
+ *  regardless of return value, such that if the supplied
+ *  buffer were to be too small, the required size is returned.
+ *
+ *  "custom_cmp" [ IN, NULL OKAY ] and "data" [ OPAQUE ] - optional
+ *  comparison function
+ *
+ *  returns status codes:
+ *    EINVAL  => an invalid parameter
+ *    ENOENT  => the found set was empty
+ *    ENOBUFS => the found set was too large
+ */
+#if 0
+KLIB_EXTERN rc_t CC PTrieFindAll ( const PTrie *self, struct String const *key,
+    PTNode buffer [], uint32_t capacity, uint32_t *num_found,
+    int ( CC * custom_cmp ) ( const void *item, const PBSTNode *n, void *data ), void *data );
+KLIB_EXTERN rc_t CC PTrieFindAllRE ( const PTrie *self, struct String const *re,
+    PTNode buffer [], uint32_t capacity, uint32_t *num_found );
+#endif
+
+/* ForEach
+ *  executes a function on each tree element
+ *
+ *  "f" [ IN ] and "data" [ IN ] - iteration callback function for
+ *  examining each TNode in the tree
+ */
+KLIB_EXTERN void CC PTrieForEach ( const PTrie *self,
+    void ( CC * f ) ( PTNode *n, void *data ), void *data );
+
+/* DoUntil
+ *  executes a function on each tree element
+ *  until the function returns true
+ *
+ *  "f" [ IN ] and "data" [ IN ] - iteration callback function for
+ *  examining each TNode in the tree. the function returns "true"
+ *  to halt iteration.
+ *
+ *  return values:
+ *    the last value returned by "f" or false if never invoked
+ */
+KLIB_EXTERN bool CC PTrieDoUntil ( const PTrie *self,
+    bool ( CC * f ) ( PTNode *n, void *data ), void *data );
+
+/* Whack
+ *  tears down internal structure
+ */
+KLIB_EXTERN void CC PTrieWhack ( PTrie *self );
+
+
+/*--------------------------------------------------------------------------
+ * Trie
+ */
+
+/* Persist
+ *  much like BSTreePersist but operates on a Trie
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] -  returns parameter for the number
+ *  of bytes written as a result of persisting the b-tree. this will
+ *  be the actual bytes written regardless of return status.
+ *
+ *  "ext_keys" [ IN ] - if true, does not store key data internally.
+ *  key text gets encoded into the tree structure in all cases. when
+ *  stored internally, any key text not represented by the tree will
+ *  be explicitly written by this function. otherwise, the caller will
+ *  be expected to store the text as desired. while internal storage
+ *  will probably be more efficient, it will cause this function to
+ *  fail if the Trie was built with ambiguous key transitions, i.e.
+ *  if initialized with "cs_expand" false and keys were added having
+ *  characters not included within the "accept" character set. this
+ *  is because the tree channels all unrecognized characters through
+ *  a single code, making their recovery impossible without being
+ *  stored externally.
+ *
+ *  "write" [ IN, NULL OKAY ] and "write_param" [ IN ] -  a generic
+ *  output streaming function used for all operations. if NULL, then
+ *  the function will exit after its first pass with the number of
+ *  bytes required in "num_writ".
+ *
+ *  "aux" [ IN ] and "aux_param" [ IN ] - a specialized function for
+ *  streaming auxiliary node data to output using the supplied "write"
+ *  function. it is invoked during the first pass with a NULL write
+ *  function for gathering size data, and during the third pass with
+ *  a non-NULL write function.
+ */
+KLIB_EXTERN rc_t CC TriePersist ( struct Trie const *self, size_t *num_writ, bool ext_keys,
+    PTWriteFunc write, void *write_param, PTAuxFunc aux, void *aux_param );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_ptrie_ */
diff --git a/interfaces/klib/rc.h b/interfaces/klib/rc.h
new file mode 100644
index 0000000..5972170
--- /dev/null
+++ b/interfaces/klib/rc.h
@@ -0,0 +1,201 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_rc_
+#define _h_klib_rc_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#if _DEBUGGING
+
+#ifndef _h_compiler_
+#include <compiler.h>
+#endif
+
+#include <assert.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * RC
+ *  upon success, all functions will return code 0
+ *  other codes indicate failure or additional status information
+ */
+
+#if _DEBUGGING && ! defined RECORD_RC_FILE_LINE
+#define RECORD_RC_FILE_LINE 1
+#elif ! defined RECORD_RC_FILE_LINE
+#define RECORD_RC_FILE_LINE 0
+#endif
+
+/* actual code declarations are in <kfc/rc.h> */
+#include <kfc/rc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if RC_EMIT
+
+KLIB_EXTERN const char * CC GetRCFilename ( void );
+KLIB_EXTERN const char * CC GetRCFunction ( void );
+KLIB_EXTERN uint32_t CC GetRCLineno ( void );
+KLIB_EXTERN rc_t CC SetRCFileFuncLine ( rc_t rc, const char *filename, const char *funcname, uint32_t lineno );
+KLIB_EXTERN bool CC GetUnreadRCInfo ( rc_t *rc, const char **filename, const char **funcname, uint32_t *lineno );
+
+#if RECORD_RC_FILE_LINE
+
+    #if defined(__SUNPRO_CC)  &&  __SUNPRO_CC <= 0x590  &&  defined(__cplusplus)
+    
+        #define SET_RC_FILE_FUNC_LINE( rc ) \
+            SetRCFileFuncLine ( ( rc ), __FILE__, "(unknown)", __LINE__ )
+    
+    #else
+    
+        #define SET_RC_FILE_FUNC_LINE( rc ) \
+            SetRCFileFuncLine ( ( rc ), __FILE__, __func__, __LINE__ )
+    
+    #endif
+
+#else
+
+    #define SET_RC_FILE_FUNC_LINE( rc ) \
+        ( rc_t ) ( rc )
+
+#endif
+
+#ifdef assert
+#define ASSERT_MOD_TARG_CTX()                                    \
+    assert ( ( int ) rcKFG == ( int ) rcSRA + 1 ),               \
+    assert ( ( int ) rcProduction == ( int ) rcExpression + 1 ), \
+    assert ( ( int ) rcFlushing == ( int ) rcInflating + 1 ),    \
+    assert ( ( int ) rcLastModule_v1_1  <= ( 1 << 5 ) ),         \
+    assert ( ( int ) rcLastTarget_v1_1  <= ( 1 << 6 ) ),         \
+    assert ( ( int ) rcLastContext_v1_1  <= ( 1 << 7 ) )
+
+#define ASSERT_OBJ_STATE() \
+    assert ( ( int ) rcLink == ( int ) rcUri + 1 ),              \
+    assert ( ( int ) rcItem == ( int ) rcLibrary + 1 ),          \
+    assert ( ( int ) rcOpen == ( int ) rcOutofrange + 1 ),       \
+    assert ( ( int ) rcLastObject_v1_1  <= ( 1 << 8 ) ),         \
+    assert ( ( int ) rcLastState_v1_1  <= ( 1 << 6 ) )
+#else
+#define ASSERT_MOD_TARG_CTX() ( void ) 0
+
+#define ASSERT_OBJ_STATE() ( void ) 0
+#endif
+
+/* CTX
+ *  form a context from parts
+ */
+#define CTX( mod, targ, ctx )                                \
+    ( rc_t ) ( ASSERT_MOD_TARG_CTX (),                       \
+               RAW_CTX ( mod, targ, ctx ) )
+
+/* RC
+ *  form a complete return code from parts
+ */
+#define SILENT_RC( mod, targ, ctx, obj, state )              \
+    ( rc_t ) ( ASSERT_OBJ_STATE (),                          \
+        CTX ( mod, targ, ctx )    | /* 18 bits */            \
+        ( ( rc_t ) ( obj ) << 6 ) | /*  8 bits */            \
+        ( ( rc_t ) ( state ) ) )    /*  6 bits */
+
+#define RC( mod, targ, ctx, obj, state )                     \
+    ( rc_t ) ( ASSERT_OBJ_STATE (),                          \
+    SET_RC_FILE_FUNC_LINE (                                  \
+        CTX ( mod, targ, ctx )    | /* 18 bits */            \
+        ( ( rc_t ) ( obj ) << 6 ) | /*  8 bits */            \
+        ( ( rc_t ) ( state ) ) ) )  /*  6 bits */
+
+/* RC_FROM_CTX
+ *  form an rc but take input from existing CTX()
+ */
+#define RC_FROM_CTX( ctx, obj, state )                       \
+    ( rc_t ) ( ASSERT_OBJ_STATE (),                          \
+    SET_RC_FILE_FUNC_LINE (                                  \
+        ( ctx )                   | /* 18 bits */            \
+        ( ( rc_t ) ( obj ) << 6 ) | /*  8 bits */            \
+        ( ( rc_t ) ( state ) ) ) )  /*  6 bits */
+
+/* ResetRCContext
+ *  rewrite rc to reflect different context
+ *  typically used to pass out return codes
+ */
+#define ResetRCContext( rc, mod, targ, ctx ) \
+    ( ( ( rc ) & 0x3FFF ) | CTX ( mod, targ, ctx ) )
+
+/* ResetRCState
+ *  rewrite rc to reflect different state
+ *  typically used to pass out return codes
+ */
+#define ResetRCState( rc, obj, state ) \
+    ( ( ( rc ) & 0xFFFFFFC0 ) | ( rc_t ) ( state ) )
+
+#endif /* __cplusplus */
+
+/* GetRCModule
+ *  extract the module portion
+ */
+#define GetRCModule( rc ) \
+    ( enum RCModule ) ( ( ( rc ) >> 27 ) & 0x1F )
+
+/* GetRCTarget
+ *  extract the target portion
+ */
+#define GetRCTarget( rc ) \
+    ( enum RCTarget ) ( ( ( rc ) >> 21 ) & 0x3F )
+
+/* GetRCContext
+ *  extract the context portion
+ */
+#define GetRCContext( rc ) \
+    ( enum RCContext ) ( ( ( rc ) >> 14 ) & 0x7F )
+
+/* GetRCObject
+ *  extract the target object portion
+ */
+#define GetRCObject( rc ) \
+    ( enum RCObject ) ( ( ( rc ) >> 6 ) & 0xFF )
+
+/* GetRCState
+ *  extract the state portion
+ */
+#define GetRCState( rc ) \
+    ( enum RCState ) ( ( rc ) & 0x3F )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_klib_rc_ */
diff --git a/interfaces/klib/refcount.h b/interfaces/klib/refcount.h
new file mode 100644
index 0000000..7951765
--- /dev/null
+++ b/interfaces/klib/refcount.h
@@ -0,0 +1,102 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_refcount_
+#define _h_klib_refcount_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_kfc_refcount_
+#include <kfc/refcount.h>
+#endif
+
+#ifndef FORCE_TRACK_REFERENCES
+#define FORCE_TRACK_REFERENCES 0
+#endif
+
+/* normally turned off */
+#if FORCE_TRACK_REFERENCES
+#undef TRACK_REFERENCES
+#define TRACK_REFERENCES 1
+#elif ! defined TRACK_REFERENCES
+#define TRACK_REFERENCES 0
+#endif
+
+/* include logging interface */
+#if TRACK_REFERENCES
+
+#include <klib/debug.h>
+
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KRefcount inline implementation
+ */
+
+#if TRACK_REFERENCES
+
+#undef REFNEW
+#undef CNTMSG
+#undef REFMSG
+#undef REFNEW_COMMA
+#undef REFMSG_COMMA
+
+#ifndef REFMOD
+#define REFMOD DBG_REF
+#endif
+
+#ifndef REFCOND
+#define REFCOND DBG_REF_ANY
+#endif
+
+#define REFNEW( clsname, op, name, instance, refcount )                 \
+    DBGMSG ( REFMOD, REFCOND, ( "created %s, operation %s, name '%s', " \
+                                "instance 0x%zX: initial refcount %d\n",  \
+                                clsname, op, name, instance, refcount ))
+#define CNTMSG( clsname, op, instance, refcount )                       \
+    DBGMSG ( REFMOD, REFCOND, ( "about to %s instance 0x%zX: prior refcount = %d for %s\n", \
+                                op, instance, refcount, clsname ))
+#define REFMSG( clsname, op, instance ) \
+    CNTMSG ( clsname, op, instance, atomic32_read ( instance ) )
+#define REFNEW_COMMA( clsname, op, name, instance, refcount ) \
+    REFNEW ( clsname, op, name, instance, refcount ),
+#define REFMSG_COMMA( clsname, op, instance ) \
+    REFMSG ( clsname, op, instance ),
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_refcount_ */
diff --git a/interfaces/klib/report.h b/interfaces/klib/report.h
new file mode 100644
index 0000000..4f00232
--- /dev/null
+++ b/interfaces/klib/report.h
@@ -0,0 +1,103 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_report_
+#define _h_klib_report_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * An unrecoverable error happened.
+ * We can help to solve it
+ * by reporting information about known application execution environment.
+ */
+
+
+/* Init
+ *  initialize with common information
+ *
+ *  "argc" [ IN ] and "argv" [ IN ] - intact command line
+ *
+ *  "tool_version" [ IN ] - version of tool
+ */
+KLIB_EXTERN void CC ReportInit ( int argc, char *argv [],
+    ver_t tool_version );
+
+
+/* BuildDate
+ *  set the build date of the tool
+ *
+ *  "date" [ IN ] - pre-processor __DATE__
+ */
+KLIB_EXTERN void CC ReportBuildDate ( const char *date );
+
+
+/* Silence
+ *  tell report to be silent at exit
+ *  useful especially in response to ^C
+ */
+KLIB_EXTERN void CC ReportSilence ( void );
+
+
+/* Finalize
+ *  perform cleanup
+ *  optionally report error condition
+ *
+ *  "rc" [ IN ] - report environment information if not zero
+ */
+KLIB_EXTERN rc_t CC ReportFinalize ( rc_t rc );
+
+/* ForceFinalize
+ *  Finalize forcing report generation to stdout
+ */
+KLIB_EXTERN rc_t CC ReportForceFinalize ( void );
+
+
+/* ResetObject
+ *  Resets the name of the current object beeing processes(path or accession),
+ *  usually from command line.
+ *  Should be called each time
+ *  when starting next command line argument processing.
+ */
+KLIB_EXTERN rc_t CC ReportResetObject ( const char *path );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_report_ */
diff --git a/interfaces/klib/sort.h b/interfaces/klib/sort.h
new file mode 100644
index 0000000..2057c5d
--- /dev/null
+++ b/interfaces/klib/sort.h
@@ -0,0 +1,123 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_sort_
+#define _h_klib_sort_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_ksort_macro_
+#include <klib/ksort-macro.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * ksort
+ *  qsort with a function data pointer
+ */
+KLIB_EXTERN void CC ksort ( void *pbase, size_t total_elems, size_t size,
+    int64_t ( CC * cmp ) ( const void*, const void*, void *data ), void *data );
+
+
+/* various custom ksort operations
+ *  structures will generally want their own functions
+ *  these fundamental types can be standardized
+ */
+KLIB_EXTERN void CC ksort_int32_t ( int32_t *pbase, size_t total_elems );
+KLIB_EXTERN void CC ksort_uint32_t ( uint32_t *pbase, size_t total_elems );
+KLIB_EXTERN void CC ksort_int64_t ( int64_t *pbase, size_t total_elems );
+KLIB_EXTERN void CC ksort_uint64_t ( uint64_t *pbase, size_t total_elems );
+
+
+/* KSORT
+ *  macro ( see <klib/ksort-macro.h> )
+ *  allows creation of a custom qsort with inlined compare and swap
+ *  MUCH faster than normal qsort or ksort.
+ *
+ *  basically you need to define a macro CMP() and another SWAP(),
+ *  and the KSORT macro will fill in the rest.
+ *
+ *  CMP() needs to evaluate to a signed 32-bit integer.
+ *  THIS WILL CHANGE TO BECOME LESS_THAN( a, b ).
+ *
+ *  SWAP() will generally be a custom operation, but can be
+ *  defined in terms of a default operation similar to qsort.
+ *
+ *  an example usage follows:
+ */
+#if 0
+static
+void ksort_int64_t ( int64_t *base, size_t count )
+{
+    /* swap is performed on full element, not byte-for-byte */
+#define SWAP( a, b, off, size )                             \
+    do                                                      \
+    {                                                       \
+        int64_t tmp = * ( const int64_t* ) ( a );           \
+        * ( int64_t* ) ( a ) = * ( const int64_t* ) ( b );  \
+        * ( int64_t* ) ( b ) = tmp;                         \
+    }                                                       \
+    while ( 0 )
+
+    /* 64-bit comparison producing a signed 32-bit result */
+#define CMP( a, b )                                                     \
+    ( ( * ( const int64_t* ) ( a ) < * ( const int64_t* ) ( b ) ) ? -1 : \
+      ( * ( const int64_t* ) ( a ) > * ( const int64_t* ) ( b ) ) )
+}
+
+    /* let the macro fill out the remainder */
+    KSORT ( base, count, sizeof * base, 0, sizeof * base );
+
+    /* free up macros for future use */
+#undef SWAP
+#undef CMP
+
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * kbsearch
+ *  bsearch with a function data pointer
+ */
+KLIB_EXTERN void* CC kbsearch ( const void *key, const void *base, size_t nmemb, size_t size,
+    int64_t ( CC * cmp ) ( const void*, const void*, void *data ), void *data );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_sort_ */
diff --git a/interfaces/klib/sra-release-version.h b/interfaces/klib/sra-release-version.h
new file mode 100644
index 0000000..470a054
--- /dev/null
+++ b/interfaces/klib/sra-release-version.h
@@ -0,0 +1,100 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_sra_release_version_
+#define _h_klib_sra_release_version_
+
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* major . minor . release [ - [ type - ] revision ]
+ *
+ * Examples:
+ *  "2.3.4-a0"
+ *  "2.3.4-b3"
+ *  "2.3.4-rc1"
+ *  "2.3.4"
+ *  "2.3.4-2"
+ */
+typedef struct SraReleaseVersion SraReleaseVersion;
+struct SraReleaseVersion
+{
+    ver_t version;     /* major . minor . release */
+    uint32_t revision;
+    enum {
+        eSraReleaseVersionTypeDev, /* developmemt */
+        eSraReleaseVersionTypeAlpha,
+        eSraReleaseVersionTypeBeta,
+        eSraReleaseVersionTypeRC,  /* release candidate */
+        eSraReleaseVersionTypeFinal,
+    } type;
+};
+
+
+/* Get
+ *  Get release version of this build of SRA Toolkit */
+KLIB_EXTERN rc_t CC SraReleaseVersionGet ( SraReleaseVersion *version );
+
+/* Cmp
+ *  Compare two release versions
+ *  result return values:
+ *       0 - the versions are the same 
+ *       1 - version2 is more recent than self
+ *      -1 - self is more recent than version2
+ */
+KLIB_EXTERN rc_t CC SraReleaseVersionCmp ( const SraReleaseVersion *self,
+    const SraReleaseVersion *version2, int32_t *result );
+
+/* Parse
+ *  Initialize SraReleaseVersion from char version[size]
+ */
+KLIB_EXTERN rc_t CC SraReleaseVersionInit ( SraReleaseVersion *self,
+    const char *version, size_t size );
+
+/* Print
+ *  Convert SraReleaseVersion to version[size]
+ */
+KLIB_EXTERN rc_t CC SraReleaseVersionPrint ( const SraReleaseVersion *self,
+    char *version, size_t size, size_t *num_writ );
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _h_klib_sra_release_version_ */
diff --git a/interfaces/klib/status.h b/interfaces/klib/status.h
new file mode 100644
index 0000000..f56489a
--- /dev/null
+++ b/interfaces/klib/status.h
@@ -0,0 +1,147 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_status_
+#define _h_klib_status_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_writer_
+#include <klib/writer.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef uint32_t KStsLevel;
+
+enum
+{
+    STAT_USR = 1,       /* normal user verbosity  */
+    STAT_PWR,           /* power-user verbosity   */
+    STAT_QA,            /* qa-level description   */
+    STAT_PRG,           /* programmer description */
+    STAT_GEEK           /* absurdly verbose       */
+};
+
+KLIB_EXTERN KStsLevel CC KStsLevelGet( void );
+KLIB_EXTERN void CC KStsLevelSet( KStsLevel level );
+KLIB_EXTERN void CC KStsLevelAdjust( int32_t adjust );
+
+/* -----
+ * Handlers for application and library writers.
+ */
+KLIB_EXTERN KWrtHandler* CC KStsHandlerGet (void);
+KLIB_EXTERN KWrtHandler* CC KStsLibHandlerGet (void);
+
+KLIB_EXTERN KWrtWriter CC KStsWriterGet (void);
+KLIB_EXTERN KWrtWriter CC KStsLibWriterGet (void);
+
+KLIB_EXTERN void* CC KStsDataGet (void);
+KLIB_EXTERN void* CC KStsLibDataGet (void);
+
+/*
+ * Init()
+ * Initialize the status messages module to a known state
+ */
+KLIB_EXTERN rc_t CC KStsInit (void);
+
+KLIB_EXTERN rc_t CC KStsMsg (const char * fmt, ...);
+KLIB_EXTERN rc_t CC KStsLibMsg (const char * fmt, ...);
+
+/* Set
+ */
+KLIB_EXTERN rc_t CC KStsHandlerSet    (KWrtWriter writer, void * data);
+KLIB_EXTERN rc_t CC KStsLibHandlerSet (KWrtWriter writer, void * data);
+
+KLIB_EXTERN rc_t CC KStsHandlerSetStdOut    ( void );
+KLIB_EXTERN rc_t CC KStsLibHandlerSetStdOut ( void );
+KLIB_EXTERN rc_t CC KStsHandlerSetStdErr    ( void );
+KLIB_EXTERN rc_t CC KStsLibHandlerSetStdErr ( void );
+
+/* formatting */
+typedef uint32_t KStsFmtFlags;
+enum KStsFmtFlagsEnum
+{
+    kstsFmtTimestamp = 0x00000001,
+    kstsFmtPid = 0x00000002,
+    kstsFmtAppName = 0x00000004,
+    kstsFmtAppVersion = 0x00000008,
+    kstsFmtMessage = 0x00000010, /* actual message */
+    kstsFmtLocalTimestamp = 0x00000020 /* print time stamp in local time, if both bits set local takes over */
+};
+
+KLIB_EXTERN KFmtHandler* CC KStsFmtHandlerGet (void);
+KLIB_EXTERN KFmtHandler* CC KStsLibFmtHandlerGet (void);
+
+KLIB_EXTERN KStsFmtFlags CC KStsFmtFlagsGet ( void );
+KLIB_EXTERN KStsFmtFlags CC KStsLibFmtFlagsGet ( void );
+
+KLIB_EXTERN KFmtWriter CC KStsFmtWriterGet (void);
+KLIB_EXTERN KFmtWriter CC KStsLibFmtWriterGet (void);
+KLIB_EXTERN void* CC KStsFmtDataGet (void);
+KLIB_EXTERN void* CC KStsLibFmtDataGet (void);
+
+KLIB_EXTERN rc_t CC KStsFmtFlagsSet    (KStsFmtFlags flags);
+KLIB_EXTERN rc_t CC KStsLibFmtFlagsSet (KStsFmtFlags flags);
+
+KLIB_EXTERN rc_t CC KStsFmtHandlerSet    (KFmtWriter formatter, KStsFmtFlags flags, void * data);
+KLIB_EXTERN rc_t CC KStsLibFmtHandlerSet (KFmtWriter formatter, KStsFmtFlags flags, void * data);
+
+KLIB_EXTERN rc_t CC KStsFmtHandlerSetDefault(void);
+KLIB_EXTERN rc_t CC KStsLibFmtHandlerSetDefault(void);
+
+/*
+ * A usage could look like
+ *
+ *  STSMSG(4, ("Current Status Level is %d\n", KStsLevelGet()));
+ *
+ */
+#ifdef _LIBRARY
+
+#define STSMSG(lvl,msg) \
+    (void)((((unsigned)lvl) <= KStsLevelGet()) ? KStsLibMsg msg : 0)
+#define STATUS( lvl, ... ) \
+    ( void ) ( ( ( lvl ) <= KStsLevelGet () ) ? KStsLibMsg ( __VA_ARGS__ ) : 0 )
+
+#else
+
+#define STSMSG(lvl,msg) \
+    (void)((((unsigned)lvl) <= KStsLevelGet()) ? KStsMsg msg : 0)
+
+#define STATUS( lvl, ... ) \
+    ( void ) ( ( ( lvl ) <= KStsLevelGet () ) ? KStsMsg ( __VA_ARGS__ ) : 0 )
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_klib_status_ */
diff --git a/interfaces/klib/symbol.h b/interfaces/klib/symbol.h
new file mode 100644
index 0000000..7df9d41
--- /dev/null
+++ b/interfaces/klib/symbol.h
@@ -0,0 +1,146 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_symbol_
+#define _h_klib_symbol_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KSymbol
+ *  a name to object mapping
+ */
+typedef struct KSymbol KSymbol;
+struct KSymbol
+{
+    /* currently kept in a BSTree
+       this could change, though */
+    BSTNode n;
+
+    union
+    {
+        /* external object
+           neither known, nor owned,
+           i.e. just a borrowed reference */
+        const void *obj;
+
+        /* if object is a namespace, its scope */
+        BSTree scope;
+
+        /* unresolved forward decl id */
+        struct { uint32_t ctx, id; } fwd;
+
+    } u;
+
+    /* enclosing namespace
+       for name traceback */
+    KSymbol *dad;
+
+    /* symbol name */
+    String name;
+
+    /* symbol type */
+    uint32_t type;
+};
+
+
+/* Make
+ *  create a symbol
+ *
+ *  "sym" [ OUT ] - return parameter for symbol
+ *
+ *  "name" [ IN ] - symbol name
+ *
+ *  "type" [ IN ] - symbol type
+ *
+ *  "obj" [ IN, NULL OKAY ] - optional object mapping
+ *
+ * This make will allocate storage for the KSymbol and
+ * it's name.
+ */
+KLIB_EXTERN rc_t CC KSymbolMake ( KSymbol **sym,
+    const String *name, uint32_t type, const void *obj );
+
+
+/* Init
+ *  initialize a symbol without allocating space
+ *
+ *  "self" [ IN ] - where to initialize
+ *
+ *  "name" [ IN ] - symbol name
+ *
+ *  "type" [ IN ] - symbol type
+ *
+ *  "obj" [ IN, NULL OKAY ] - optional object mapping
+ *
+ */
+KLIB_EXTERN rc_t CC KSymbolInit ( KSymbol * self, 
+    const String * name, uint32_t type, const void * obj);
+
+
+
+/* Whack
+ *  from BSTree
+ */
+KLIB_EXTERN void CC KSymbolWhack ( BSTNode *n, void *ignore );
+
+/* there is currently no need for a real Destroy function 
+ * but a macro to do nothing is included for orthogonality.
+ */
+#define KSymbolDestroy(s,i) ((void)0)
+
+/* Cmp
+ *  compare String* against KSymbol*
+ */
+KLIB_EXTERN int64_t CC KSymbolCmp ( const void *item, const BSTNode *n );
+
+
+/* Sort
+ *  compare KSymbol* against KSymbol*
+ */
+KLIB_EXTERN int64_t CC KSymbolSort ( const BSTNode *item, const BSTNode *n );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_symbol_ */
diff --git a/interfaces/klib/symtab.h b/interfaces/klib/symtab.h
new file mode 100644
index 0000000..fd2d406
--- /dev/null
+++ b/interfaces/klib/symtab.h
@@ -0,0 +1,225 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_symtab_
+#define _h_klib_symtab_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct BSTree;
+struct String;
+struct KSymbol;
+
+
+/*--------------------------------------------------------------------------
+ * KSymTable
+ *  scoped stack of BSTrees
+ */
+typedef struct KSymTable KSymTable;
+struct KSymTable
+{
+    /* head of open namespace stack */
+    struct KSymbol *ns;
+
+    /* scope stack */
+    Vector stack;
+
+    /* intrinsic scope count */
+    uint32_t intrinsic;
+};
+
+
+/* Init
+ *  create an empty symbol table
+ *
+ *  "intrinsic" [ IN, NULL OKAY ] - initial protected scope
+ *  if not NULL, will be used as initial non-modifiable scope
+ */
+KLIB_EXTERN rc_t CC KSymTableInit ( KSymTable *self, struct BSTree const *intrinsic );
+
+
+/* Whack
+ *  must be called to clean up stack
+ */
+#if NOT_MACRO
+KLIB_EXTERN void CC KSymTableWhack ( KSymTable *self );
+#endif
+#define KSymTableWhack( self ) \
+    VectorWhack ( & ( self ) -> stack, NULL, NULL )
+
+
+/* PushScope
+ *  pushes a tree onto stack
+ *
+ *  "scope" [ IN ] - current top scope
+ */
+KLIB_EXTERN rc_t CC KSymTablePushScope ( const KSymTable *self, struct BSTree *scope );
+
+
+/* PopScope
+ *  removes a tree from stack
+ *  noop if count <= self->intrinsic,
+ *  because stack bottom will be intrinsic scope
+ */
+KLIB_EXTERN void CC KSymTablePopScope ( const KSymTable *self );
+
+
+/* PushNamespace
+ *  pushes a namespace scope onto stack
+ */
+KLIB_EXTERN rc_t CC KSymTablePushNamespace ( const KSymTable *self, struct KSymbol *ns );
+
+
+/* PopNamespace
+ */
+KLIB_EXTERN void CC KSymTablePopNamespace ( const KSymTable *self );
+
+
+/* CreateNamespace
+ *  given a name, make it into a namespace,
+ *
+ *  "name" [ IN ] - name of namespace. if being created within
+ *  another namespace, it will be linked to the parent.
+ */
+KLIB_EXTERN rc_t CC KSymTableCreateNamespace ( KSymTable *self,
+    struct KSymbol **ns, struct String const *name );
+
+
+/* CreateSymbol
+ *  given a name, create an object reference
+ *
+ *  "sym" [ OUT, NULL OKAY ] - optional return parameter for
+ *  newly created symbol, which is entered into the top scope
+ *  and only returned for convenience.
+ *
+ *  "name" [ IN ] - symbol name. if being created within a
+ *  namespace, the symbol will be linked to the parent.
+ *
+ *  "id" [ IN ] - if the symbol type
+ *
+ *  "obj" [ IN, NULL OKAY ] - if the object has been created
+ *  at the point of symbol definition, it may be provided.
+ */
+KLIB_EXTERN rc_t CC KSymTableCreateSymbol ( KSymTable *self, struct KSymbol **sym,
+    struct String const *name, uint32_t id, const void *obj );
+#define KSymTableCreateConstSymbol( self, sym, name, id, obj ) \
+    KSymTableCreateSymbol ( self, ( struct KSymbol** ) ( sym ), name, id, obj )
+
+
+/* DupSymbol
+ *  given a symbol, create a duplicate
+ *
+ *  "dup" [ OUT, NULL OKAY ] - optional return parameter for
+ *  newly created symbol, which is entered into the top scope
+ *  and only returned for convenience.
+ *
+ *  "sym" [ IN ] - symbol to copy.
+ *
+ *  "id" [ IN ] - if the symbol type
+ *
+ *  "obj" [ IN, NULL OKAY ] - if the object has been created
+ *  at the point of symbol definition, it may be provided.
+ */
+KLIB_EXTERN rc_t CC KSymTableDupSymbol ( KSymTable *self, struct KSymbol **dup,
+    struct KSymbol const *sym, uint32_t id, const void *obj );
+
+
+/* RemoveSymbol
+ *  removes symbol from table
+ *
+ *  "sym" [ IN ] - symbol to be removed
+ */
+KLIB_EXTERN rc_t CC KSymTableRemoveSymbol ( KSymTable *self, struct KSymbol const *sym );
+
+
+/* Find
+ *  finds a symbol within the scope stack
+ */
+KLIB_EXTERN struct KSymbol* CC KSymTableFind ( const KSymTable *self,
+    struct String const *name );
+KLIB_EXTERN struct KSymbol* CC KSymTableFindSymbol ( const KSymTable *self,
+    struct KSymbol const *sym );
+
+
+/* FindIntrinsic
+ *  find an intrinsic symbol
+ *  looks in stack scopes <= self->intrinsic
+ */
+KLIB_EXTERN struct KSymbol* CC KSymTableFindIntrinsic ( const KSymTable *self,
+    struct String const *name );
+
+
+/* FindGlobal
+ *  find a symbol at global scope
+ */
+KLIB_EXTERN struct KSymbol* CC KSymTableFindGlobal ( const KSymTable *self,
+    struct String const *name );
+
+
+/* FindShallow
+ *  find a symbol in top scope
+ */
+KLIB_EXTERN struct KSymbol* CC KSymTableFindShallow ( const KSymTable *self,
+    struct String const *name );
+
+
+/* FindNext
+ *  given a symbol that was found in nearest scope
+ *  find next symbol of the same simple name in
+ *  farther scopes
+ *
+ *  "sym" [ IN ] - previously found symbol
+ *
+ *  "scope" [ IN/OUT, NULL OKAY ] - if NULL or value is 0,
+ *  the scope id for "sym" is dynamically located. otherwise,
+ *  the value on input is used for continuing a search. on
+ *  output and if not NULL, the value is set to the scope id
+ *  where the returned symbol was found, or 0 if not found.
+ */
+KLIB_EXTERN struct KSymbol* CC KSymTableFindNext ( const KSymTable *self,
+    struct KSymbol const *sym, uint32_t *scope );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_symtab_ */
diff --git a/interfaces/klib/text.h b/interfaces/klib/text.h
new file mode 100644
index 0000000..cf554f7
--- /dev/null
+++ b/interfaces/klib/text.h
@@ -0,0 +1,563 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_text_
+#define _h_klib_text_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+#include <string.h> /* memcmp */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * String
+ *  pseudo-intrinsic string
+ */
+typedef struct String String;
+struct String
+{
+    const char *addr;
+    size_t size;
+    uint32_t len;
+};
+
+/* StringInit
+ *  initializes a String object
+ */
+#define StringInit( s, val, sz, length ) \
+    ( void ) \
+        ( ( s ) -> addr = ( val ), \
+          ( s ) -> size = ( sz ), \
+          ( s ) -> len = ( length ) )
+
+#define StringInitCString( s, cstr ) \
+    ( void ) \
+        ( ( s ) -> len = string_measure \
+          ( ( s ) -> addr = ( cstr ), & ( s ) -> size ) )
+
+/* CONST_STRING
+ *  initialize a string from a manifest constant
+ */
+#define CONST_STRING( s, val ) \
+    StringInit ( s, val, sizeof val - 1, sizeof val - 1 )
+
+/* StringSize
+ *  size of string in bytes
+ */
+#define StringSize( s ) \
+    ( s ) -> size
+
+/* StringLength
+ *  length of string in characters
+ */
+#define StringLength( s ) \
+    ( s ) -> len
+
+/* StringCopy
+ *  allocates a copy of a string
+ */
+KLIB_EXTERN rc_t CC StringCopy ( const String **cpy, const String *str );
+
+/* StringConcat
+ *  concatenate one string onto another
+ */
+KLIB_EXTERN rc_t CC StringConcat ( const String **cat,
+    const String *a, const String *b );
+
+/* StringSubstr
+ *  creates a substring of an existing one
+ *  note that the substring is always a non-allocated copy
+ *  and is dependent upon the lifetime of its source
+ *
+ *  returns "sub" if "idx" was valid
+ *  or NULL otherwise
+ *
+ *  "len" may be 0 to indicate infinite length
+ *  or may extend beyond end of source string.
+ */
+KLIB_EXTERN String* CC StringSubstr ( const String *str,
+    String *sub, uint32_t idx, uint32_t len );
+
+/* StringTrim
+ *  trims ascii white-space from both ends
+ *  returns trimmed string in "trimmed"
+ */
+KLIB_EXTERN String * CC StringTrim ( const String * str, String * trimmed );
+
+/* StringHead
+ *  access the first character
+ *
+ *  this is an efficient enough function to be included.
+ *  the generic functions of accessing characters by index
+ *  are apt to be extremely inefficient with UTF-8, and
+ *  as such are not included.
+ *
+ *  returns EINVAL if the character is bad,
+ *  or ENODATA if the string is empty
+ */
+KLIB_EXTERN rc_t CC StringHead ( const String *str, uint32_t *ch );
+
+/* StringPopHead
+ *  remove and return the first character
+ *
+ *  returns EINVAL if the character is bad,
+ *  or ENODATA if the string is empty
+ */
+KLIB_EXTERN rc_t CC StringPopHead ( String *str, uint32_t *ch );
+
+/* StringEqual
+ *  compare strings for equality
+ *  not lexical for all characters
+ */
+#define StringEqual( a, b ) \
+    ( ( a ) -> len == ( b ) -> len && \
+    memcmp ( ( a ) -> addr, ( b ) -> addr, ( a ) -> len ) == 0 )
+
+/* StringCompare
+ *  compare strings for relative ordering
+ *  not strictly lexical - generally orders by character code
+ */
+KLIB_EXTERN int CC StringCompare ( const String *a, const String *b );
+
+/* StringCaseEqual
+ *  compare strings for case-insensitive equality
+ */
+KLIB_EXTERN bool CC StringCaseEqual ( const String *a, const String *b );
+
+/* StringCaseCompare
+ *  compare strings for relative case-insensitive ordering
+ */
+KLIB_EXTERN int CC StringCaseCompare ( const String *a, const String *b );
+
+/* StringOrder
+ * StringOrderNoNullCheck
+ *  compares strings as quickly as possible for
+ *  deterministic ordering: first by length, then
+ *  by binary ( byte-wise ) content.
+ *
+ *  performs more quickly than StringCompare for cases
+ *  where only deterministic ordering is needed ( e.g. symbol table ).
+ *
+ *  the "NoNullCheck" version will crash if either a or b are NULL
+ *  but avoids the overhead of checking when both are known to be good
+ */
+KLIB_EXTERN int64_t CC StringOrder ( const String *a, const String *b );
+KLIB_EXTERN int64_t CC StringOrderNoNullCheck ( const String *a, const String *b );
+
+/* StringMatch
+ *  creates a substring of "a" in "match"
+ *  for all of the sequential matching characters between "a" and "b"
+ *  starting from character [ 0 ].
+ *
+ *  returns the number of characters that match.
+ */
+KLIB_EXTERN uint32_t CC StringMatch ( String *match,
+    const String *a, const String *b );
+
+/* StringMatchExtend
+ *  extends a substring of "a" in "match"
+ *  for all of the sequential matching characters between "a" and "b"
+ *  starting from character [ match -> len ].
+ *
+ *  returns the number of matching characters that were extended.
+ */
+KLIB_EXTERN uint32_t CC StringMatchExtend ( String *match,
+    const String *a, const String *b );
+
+/* StringHash
+ *  hash value for string
+ */
+#define StringHash( s ) \
+    string_hash ( ( s ) -> addr, ( s ) -> size )
+
+/* StringCopyUTF...
+ *  creates a String from UTF16 or UTF32 UNICODE input
+ *  wchar_t is one or the other, depending upon OS and compiler.
+ */
+KLIB_EXTERN rc_t CC StringCopyUTF16 ( const String **cpy,
+    const uint16_t *text, size_t bytes );
+KLIB_EXTERN rc_t CC StringCopyUTF32 ( const String **cpy,
+    const uint32_t *text, size_t bytes );
+
+/* StringCopyWChar_t
+ *  wchar_t is alternately defined as 16 or 32 bits
+ */
+#define StringCopyWChar_t( cpy, text, bytes ) \
+    ( ( sizeof ( wchar_t ) == sizeof ( uint16_t ) ) ? \
+      StringCopyUTF16 ( cpy, ( const uint16_t* ) ( text ), bytes ) : \
+      StringCopyUTF32 ( cpy, ( const uint32_t* ) ( text ), bytes ) )
+
+/* StringWhack
+ *  deallocates a string
+ *  ignores strings not allocated by this library
+ */
+KLIB_EXTERN void CC StringWhack ( const String* self );
+
+
+/* StringToInt
+ *  simple string conversion functions
+ *
+ *  these functions are defined to consume the entire string.
+ *  leading spaces are tolerated, repeated signs are accepted for signed conversion,
+ *  decimal and hex encodings are accepted for unsigned conversion,
+ *  decimal only for signed conversion.
+ *
+ *  "optional_rc" [ OUT, NULL OKAY ] - if non-null, user is interested
+ *  in error conditions. if the parameter is present, the string must be
+ *  completely consumed without overflow.
+ *
+ *  optional return values ( with { GetRCObject ( rc ), GetRCState ( rc ) }:
+ *   0                            : no error
+ *   { rcRange, rcExcessive }     : integer overflow
+ *   { rcTransfer, rcIncomplete } : extra characters remain in string
+ *   { rcData, rcInsufficient }   : no numeric text was found
+ *
+ *  return values - regardless of "optional_rc":
+ *    val             : when no error
+ *    val             : on incomplete transfer
+ *    +/- max int64_t : when signed overflow occurs ( StringToI64 only )
+ *    max uint64_t    : when unsigned overflow occurs ( StringToU64 only )
+ *    0               : when no input text is found
+ */
+KLIB_EXTERN int64_t StringToI64 ( const String * self, rc_t * optional_rc );
+KLIB_EXTERN uint64_t StringToU64 ( const String * self, rc_t * optional_rc );
+
+
+/*--------------------------------------------------------------------------
+ * raw text strings
+ *  the internal representation of text strings is implementation
+ *  dependent. it is assumed to be ASCII-7 or UTF-8, although
+ *  this is determined by the implementation library of these functions.
+ *
+ * NB - ASCII implementations are no longer being provided
+ *  all text handling is UTF-8 unless explictly stated otherwise
+ */
+
+/* string_size
+ *  length of string in bytes
+ */
+KLIB_EXTERN size_t CC string_size ( const char *str );
+
+/* string_len
+ *  length of string in characters, when the size is known
+ */
+KLIB_EXTERN uint32_t CC string_len ( const char *str, size_t size );
+
+/* string_measure
+ *  measures length of string in both characters and bytes
+ */
+KLIB_EXTERN uint32_t CC string_measure ( const char *str, size_t *size );
+
+/* string_copy
+ *  copies whole character text into a buffer
+ *  terminates with NUL byte if possible
+ *  returns the number of bytes copied
+ */
+KLIB_EXTERN size_t CC string_copy ( char *dst, size_t dst_size,
+    const char *src, size_t src_size );
+
+/* string_copy_measure
+ *  copies whole character text into a buffer
+ *  terminates with NUL byte if possible
+ *  returns the number of bytes copied
+ */
+KLIB_EXTERN size_t CC string_copy_measure ( char *dst, size_t dst_size, const char *src );
+
+/* string_dup
+ *  replaces the broken C library strndup
+ *  creates a NUL-terminated malloc'd string
+ */
+KLIB_EXTERN char* CC string_dup ( const char *str, size_t size );
+
+/* string_dup_measure
+ *  replaces the broken C library strdup
+ *  creates a NUL-terminated malloc'd string
+ *  returns size of string unless "size" is NULL
+ */
+KLIB_EXTERN char* CC string_dup_measure ( const char *str, size_t *size );
+
+/* string_printf
+ *  NOW IN <klib/printf.h>
+ */
+
+/* tolower_copy
+ *  copies whole character text in lower-case
+ *  terminates with NUL byte if possible
+ *  returns the number of bytes copied
+ */
+KLIB_EXTERN size_t CC tolower_copy ( char *dst, size_t dst_size,
+    const char *src, size_t src_size );
+
+/* toupper_copy
+ *  copies whole character text in upper-case
+ *  terminates with NUL byte if possible
+ *  returns the number of bytes copied
+ */
+KLIB_EXTERN size_t CC toupper_copy ( char *dst, size_t dst_size,
+    const char *src, size_t src_size );
+
+/* string_cmp
+ *  performs a safe strncmp
+ *
+ *  "max_chars" limits the extent of the comparison
+ *  to not exceed supplied value, i.e. the number of
+ *  characters actually compared will be the minimum
+ *  of asize, bsize and max_chars.
+ *
+ *  if either string size ( or both ) < max_chars and
+ *  all compared characters match, then the result will
+ *  be a comparison of asize against bsize.
+ */
+KLIB_EXTERN int CC string_cmp ( const char *a, size_t asize,
+    const char *b, size_t bsize, uint32_t max_chars );
+
+/* strcase_cmp
+ *  like string_cmp except case insensitive
+ */
+KLIB_EXTERN int CC strcase_cmp ( const char *a, size_t asize,
+    const char *b, size_t bsize, uint32_t max_chars );
+
+/* string_match
+ *  returns the number of matching characters
+ *
+ *  "max_chars" limits the extent of the comparison
+ *  to not exceed supplied value, i.e. the number of
+ *  characters actually compared will be the minimum
+ *  of asize, bsize and max_chars.
+ *
+ *  "msize" will be set to the size of the matched string
+ *  if not NULL
+ */
+KLIB_EXTERN uint32_t CC string_match ( const char *a, size_t asize,
+    const char *b, size_t bsize, uint32_t max_chars, size_t *msize );
+
+/* strcase_match
+ *  like string_match except case insensitive
+ */
+KLIB_EXTERN uint32_t CC strcase_match ( const char *a, size_t asize,
+    const char *b, size_t bsize, uint32_t max_chars, size_t *msize );
+
+/* string_chr
+ *  performs a safe strchr
+ *  "ch" is in UTF32
+ */
+KLIB_EXTERN char* CC string_chr ( const char *str, size_t size, uint32_t ch );
+
+/* string_rchr
+ *  performs a safe strrchr
+ */
+KLIB_EXTERN char* CC string_rchr ( const char *str, size_t size, uint32_t ch );
+
+/* string_brk
+ *  performs a safe strpbrk
+ */
+#if 0
+KLIB_EXTERN char* CC string_brk ( const char *str, size_t size,
+    const char *accept, size_t asize );
+#endif
+
+/* string_rbrk
+ */
+#if 0
+KLIB_EXTERN char* CC string_rbrk ( const char *str, size_t size,
+    const char *accept, size_t asize );
+#endif
+
+/* string_hash
+ *  hashes a string
+ */
+KLIB_EXTERN uint32_t CC string_hash ( const char *str, size_t size );
+
+/* string_idx
+ *  seek an indexed character
+ *
+ *  the efficiency is based upon chosen internal
+ *  string representation, which, when using single byte chars,
+ *  is simple and efficient.
+ *
+ *  on the other hand, UTF-8 has a variable character width,
+ *  requiring scanning of the entire string until the indexed
+ *  character is found.
+ */
+KLIB_EXTERN char* CC string_idx ( const char *str, size_t size, uint32_t idx );
+
+
+/* string_to_int
+ *  simple string conversion functions
+ *
+ *  these functions are defined to consume the entire string.
+ *  leading spaces are tolerated, repeated signs are accepted for signed conversion,
+ *  decimal and hex encodings are accepted for unsigned conversion,
+ *  decimal only for signed conversion.
+ *
+ *  "optional_rc" [ OUT, NULL OKAY ] - if non-null, user is interested
+ *  in error conditions. if the parameter is present, the string must be
+ *  completely consumed without overflow.
+ *
+ *  optional return values ( with { GetRCObject ( rc ), GetRCState ( rc ) }:
+ *   0                            : no error
+ *   { rcRange, rcExcessive }     : integer overflow
+ *   { rcTransfer, rcIncomplete } : extra characters remain in string
+ *   { rcData, rcInsufficient }   : no numeric text was found
+ *
+ *  return values - regardless of "optional_rc":
+ *    val             : when no error
+ *    val             : on incomplete transfer
+ *    +/- max int64_t : when signed overflow occurs ( StringToI64 only )
+ *    max uint64_t    : when unsigned overflow occurs ( StringToU64 only )
+ *    0               : when no input text is found
+ */
+KLIB_EXTERN int64_t string_to_I64 ( const char * str, size_t size, rc_t * optional_rc );
+KLIB_EXTERN uint64_t string_to_U64 ( const char * str, size_t size, rc_t * optional_rc );
+
+
+/*--------------------------------------------------------------------------
+ * conversion between UTF-32 and UTF-8 UNICODE
+ */
+
+/* utf8_utf32
+ *  converts UTF-8 text to a single UTF-32 character
+ *  returns the number of UTF8 bytes consumed, such that:
+ *    return > 0 means success
+ *    return == 0 means insufficient input
+ *    return < 0 means bad input
+ */
+KLIB_EXTERN int CC utf8_utf32 ( uint32_t *ch, const char *begin, const char *end );
+
+/* utf32_utf8
+ *  converts a single UTF-32 character to UTF-8 text
+ *  returns the number of UTF8 bytes generated, such that:
+ *    return > 0 means success
+ *    return == 0 means insufficient output
+ *    return < 0 means bad character
+ */
+KLIB_EXTERN int CC utf32_utf8 ( char *begin, char *end, uint32_t ch );
+
+
+/*--------------------------------------------------------------------------
+ * support for 16 and 32-bit UTF formats
+ */
+
+/* utf16_string_size/len/measure
+ *  measures UTF-16 strings
+ */
+KLIB_EXTERN size_t CC utf16_string_size ( const uint16_t *str );
+KLIB_EXTERN uint32_t CC utf16_string_len ( const uint16_t *str, size_t size );
+KLIB_EXTERN uint32_t CC utf16_string_measure ( const uint16_t *str, size_t *size );
+
+/* utf32_string_size/len/measure
+ */
+KLIB_EXTERN size_t CC utf32_string_size ( const uint32_t *str );
+KLIB_EXTERN uint32_t CC utf32_string_len ( const uint32_t *str, size_t size );
+KLIB_EXTERN uint32_t CC utf32_string_measure ( const uint32_t *str, size_t *size );
+
+/* wchar_string_size/len/measure
+ *  measures wchar_t strings
+ */
+KLIB_EXTERN size_t CC wchar_string_size ( const wchar_t *str );
+KLIB_EXTERN uint32_t CC wchar_string_len ( const wchar_t *str, size_t size );
+KLIB_EXTERN uint32_t CC wchar_string_measure ( const wchar_t *str, size_t *size );
+
+/* conversion from UTF-16 to internal standard */
+KLIB_EXTERN uint32_t CC utf16_cvt_string_len ( const uint16_t *src,
+    size_t src_size, size_t *dst_size );
+KLIB_EXTERN uint32_t CC utf16_cvt_string_measure ( const uint16_t *src,
+    size_t *src_size, size_t *dst_size );
+KLIB_EXTERN size_t CC utf16_cvt_string_copy ( char *dst, size_t dst_size,
+    const uint16_t *src, size_t src_size );
+
+/* conversion from UTF-32 to internal standard */
+KLIB_EXTERN uint32_t CC utf32_cvt_string_len ( const uint32_t *src,
+    size_t src_size, size_t *dst_size );
+KLIB_EXTERN uint32_t CC utf32_cvt_string_measure ( const uint32_t *src,
+    size_t *src_size, size_t *dst_size );
+KLIB_EXTERN size_t CC utf32_cvt_string_copy ( char *dst, size_t dst_size,
+    const uint32_t *src, size_t src_size );
+
+/* conversion from wchar_t to internal standard */
+KLIB_EXTERN uint32_t CC wchar_cvt_string_len ( const wchar_t *src,
+    size_t src_size, size_t *dst_size );
+KLIB_EXTERN uint32_t CC wchar_cvt_string_measure ( const wchar_t *src,
+    size_t *src_size, size_t *dst_size );
+KLIB_EXTERN size_t CC wchar_cvt_string_copy ( char *dst, size_t dst_size,
+    const wchar_t *src, size_t src_size );
+
+/* conversion to wchar_t from internal standard */
+KLIB_EXTERN size_t CC string_cvt_wchar_copy ( wchar_t *dst, size_t dst_size,
+    const char *src, size_t src_size );
+
+/*--------------------------------------------------------------------------
+ * support for ISO-8859-x 8-bit character sets
+ */
+
+/* iso8859_utf32
+ *  converts 8-bit text to a single UTF-32 character
+ *  returns the number of 8-bit bytes consumed, such that:
+ *    return > 0 means success
+ *    return == 0 means insufficient input
+ *    return < 0 means bad input
+ */
+KLIB_EXTERN int CC iso8859_utf32 ( const uint32_t map [ 128 ],
+    uint32_t *ch, const char *begin, const char *end );
+
+/* iso8859_string_size/len/measure
+ *  measures UTF-16 strings
+ */
+KLIB_EXTERN size_t CC iso8859_string_size ( const uint32_t map [ 128 ],
+    const char *str );
+KLIB_EXTERN uint32_t CC iso8859_string_len ( const uint32_t map [ 128 ],
+    const char *str, size_t size );
+KLIB_EXTERN uint32_t CC iso8859_string_measure ( const uint32_t map [ 128 ],
+    const char *str, size_t *size );
+
+/* conversion from ISO-8859-x to internal standard */
+KLIB_EXTERN uint32_t CC iso8859_cvt_string_len ( const uint32_t map [ 128 ],
+    const char *src, size_t src_size, size_t *dst_size );
+KLIB_EXTERN uint32_t CC iso8859_cvt_string_measure ( const uint32_t map [ 128 ],
+    const char *src, size_t *src_size, size_t *dst_size );
+KLIB_EXTERN size_t CC iso8859_cvt_string_copy ( const uint32_t map [ 128 ],
+    char *dst, size_t dst_size, const char *src, size_t src_size );
+
+/* some externally defined character maps */
+KLIB_EXTERN_DATA const uint32_t iso8859_1 [ 128 ];
+KLIB_EXTERN_DATA const uint32_t cp1252 [ 128 ];
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_text_ */
diff --git a/interfaces/klib/time.h b/interfaces/klib/time.h
new file mode 100644
index 0000000..98989f6
--- /dev/null
+++ b/interfaces/klib/time.h
@@ -0,0 +1,100 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_time_
+#define _h_klib_time_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KTime_t
+ *  64 bit time_t
+ */
+
+
+/* Stamp
+ *  current timestamp
+ */
+KLIB_EXTERN KTime_t CC KTimeStamp ( void );
+KLIB_EXTERN KTimeMs_t CC KTimeMsStamp ( void );
+
+/*--------------------------------------------------------------------------
+ * KTime
+ *  simple time structure
+ */
+typedef struct KTime KTime;
+struct KTime
+{
+    uint32_t year;        /* full year                                */
+    uint16_t month;       /* 0 .. 11                                  */
+    uint16_t day;         /* 0 .. 30                                  */
+    uint16_t weekday;     /* 0 .. 6 : 0 is Sunday                     */
+    int16_t tzoff;        /* -719 .. +719 minutes from Prime Meridian */
+    uint8_t hour;         /* 0 .. 23                                  */
+    uint8_t minute;       /* 0 .. 59                                  */
+    uint8_t second;       /* 0 .. 61 :  61 used for leap seconds      */
+    bool dst;             /* true if Daylight Savings Time in effect  */
+};
+
+
+/* Local
+ *  populate "kt" from "ts" in local time zone
+ */
+KLIB_EXTERN const KTime* CC KTimeLocal ( KTime *kt, KTime_t ts );
+
+
+/* Global
+ *  populate "kt" from "ts" in GMT
+ */
+KLIB_EXTERN const KTime* CC KTimeGlobal ( KTime *kt, KTime_t ts );
+
+
+/* MakeTime
+ *  make a KTime_t from KTime
+ */
+KLIB_EXTERN KTime_t CC KTimeMakeTime ( const KTime *self );
+
+
+KLIB_EXTERN rc_t CC KSleep( uint32_t seconds );
+KLIB_EXTERN rc_t CC KSleepMs( uint32_t milliseconds );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_klib_time_ */
diff --git a/interfaces/klib/token.h b/interfaces/klib/token.h
new file mode 100644
index 0000000..80bf714
--- /dev/null
+++ b/interfaces/klib/token.h
@@ -0,0 +1,254 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_token_
+#define _h_klib_token_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KSymbol;
+
+
+/*--------------------------------------------------------------------------
+ * KTokenText
+ *  named text
+ *
+ *  it's likely that the name will need to become a refcounted object...
+ */
+typedef struct KTokenText KTokenText;
+struct KTokenText
+{
+    String str;
+    String path;
+
+    rc_t ( CC * read ) ( void *self, KTokenText *tt, size_t save );
+    void *data;
+};
+
+
+/* Init
+ *  initialize structure
+ */
+#define KTokenTextInit( tt, text, fpath ) \
+    ( void ) ( ( tt ) -> str = * ( text ), \
+               ( tt ) -> path = * ( fpath ), \
+               ( tt ) -> read = NULL, \
+               ( tt ) -> data = NULL )
+#ifndef KTokenTextInit
+KLIB_EXTERN void CC KTokenTextInit ( KTokenText *tt, const String *text, const String *path );
+#endif
+
+#define KTokenTextInitCString( tt, text, fpath ) \
+    ( void ) ( StringInitCString ( & ( tt ) -> str, text ), \
+               StringInitCString ( & ( tt ) -> path, fpath ), \
+               ( tt ) -> read = NULL, \
+               ( tt ) -> data = NULL )
+#ifndef KTokenTextInitCString
+KLIB_EXTERN void CC KTokenTextInitCString ( KTokenText *tt, const char *text, const char *path );
+#endif
+
+/*--------------------------------------------------------------------------
+ * KTokenID
+ *  pre-defined ids for text tokens
+ *  not every tokenizer will return all tokens
+ */
+enum KTokenID
+{
+    eEndOfInput, eUnrecognized, eUntermComment,
+
+    /* space separators */
+    eWhiteSpace, eEndOfLine,
+
+    /* numeric */
+    eDecimal, eHex, eOctal, eFloat, eExpFloat, eMajMinRel,
+
+    /* string */
+    eUntermString, eString, eUntermEscapedString, eEscapedString,
+
+    /* names */
+    eIdent, eName,
+
+    /* punctuation */
+    ePeriod, eComma, eColon, eSemiColon, eQuestion, eTilde, eExclam,
+    eAtSign, eHash, eDollar, ePercent, eCaret, eAmpersand, eAsterisk,
+    ePlus, eMinus, eAssign, eFwdSlash, eBackSlash, ePipe,
+
+    /* paired punctuation */
+    eLeftParen, eRightParen,
+    eLeftCurly, eRightCurly,
+    eLeftAngle, eRightAngle,
+    eLeftSquare, eRightSquare,
+
+    /* compound tokens */
+    eDblPeriod, eDblColon, eEllipsis, eLogAnd, eLogOr,
+    eEqual, eNotEqual, eColonAssign, ePlusAssign, eOverArrow,
+
+    eDblLeftAngle, eDblRightAngle,
+    eDblLeftSquare, eDblRightSquare,
+
+    /* first free id */
+    eNumTokenIDs,
+
+    /* namespace type - needed by KSymTable */
+    eNamespace = eNumTokenIDs,
+    eNumSymtabIDs
+};
+
+
+/*--------------------------------------------------------------------------
+ * KToken
+ *  a string with an id and source information
+ */
+typedef struct KToken KToken;
+struct KToken
+{
+    const KTokenText *txt;
+    struct KSymbol *sym;
+    String str;
+    uint32_t id;
+    uint32_t lineno;
+};
+
+
+/* conversion operators
+ *  since the constants have a type id, the entire token is used
+ */
+KLIB_EXTERN rc_t CC KTokenToI32 ( const KToken *self, int32_t *i );
+KLIB_EXTERN rc_t CC KTokenToU32 ( const KToken *self, uint32_t *i );
+KLIB_EXTERN rc_t CC KTokenToI64 ( const KToken *self, int64_t *i );
+KLIB_EXTERN rc_t CC KTokenToU64 ( const KToken *self, uint64_t *i );
+KLIB_EXTERN rc_t CC KTokenToF64 ( const KToken *self, double *d );
+KLIB_EXTERN rc_t CC KTokenToVersion ( const KToken *self, uint32_t *v );
+KLIB_EXTERN rc_t CC KTokenToString ( const KToken *self, char *buffer, size_t bsize, size_t *size );
+KLIB_EXTERN rc_t CC KTokenToWideString ( const KToken *self, uint32_t *buffer, uint32_t blen, uint32_t *len );
+
+
+/*--------------------------------------------------------------------------
+ * KTokenSource
+ *  a modifiable source of tokens
+ */
+typedef struct KTokenSource KTokenSource;
+struct KTokenSource
+{
+    const KTokenText *txt;
+    String str;
+    uint32_t lineno;
+};
+
+/* Init
+ */
+#define KTokenSourceInit( self, tt ) \
+    ( void ) ( ( self ) -> str = ( tt ) -> str, \
+               ( self ) -> txt = ( tt ), \
+               ( self ) -> lineno = 1 )
+#ifndef KTokenSourceInit
+KLIB_EXTERN void CC KTokenSourceInit ( KTokenSource *self, const KTokenText *txt );
+#endif
+
+/* Return
+ *  returns token to source
+ */
+KLIB_EXTERN void CC KTokenSourceReturn ( KTokenSource *self, const KToken *t );
+
+
+/* Consume
+ *  consumes all remaining data
+ */
+KLIB_EXTERN void CC KTokenSourceConsume ( KTokenSource *self );
+
+
+/* Avail
+ *  the number of characters available
+ */
+#define KTokenSourceAvail( self ) \
+    ( ( ( const KTokenSource* ) ( self ) ) -> str . len )
+#ifndef KTokenSourceAvail
+KLIB_EXTERN uint32_t CC KTokenSourceAvail ( const KTokenSource *self );
+#endif
+
+/*--------------------------------------------------------------------------
+ * KTokenizer
+ *  an encapsulation of the tokenizer code
+ */
+typedef struct KTokenizer KTokenizer;
+
+
+/* Next
+ *  scan for next token
+ *
+ *  "src" [ IN ] - source of token text
+ *
+ *  "t" [ OUT ] - scanned token
+ *
+ *  returns a pointer to "t" for convenience
+ */
+KLIB_EXTERN KToken* CC KTokenizerNext ( const KTokenizer *self, KTokenSource *src, KToken *t );
+
+
+/* kDefaultTokenizer
+ *  a constant KTokenizer* to obtain default behavior
+ */
+#define kDefaultTokenizer ( ( const KTokenizer* ) 0 )
+
+
+/* kLineTokenizer
+ *  behaves like default tokenizer
+ *  except that eEndOfLine tokens are returned
+ */
+#define kLineTokenizer ( ( const KTokenizer* ) 1 )
+
+
+/* kPOSIXPathTokenizer
+ *  tokenizes a POSIX path string
+ */
+#define kPOSIXPathTokenizer ( ( const KTokenizer* ) 2 )
+
+/* kKfgTokenizer
+ * tokenizes a KFG config file 
+ * with its name value pairs and comments
+ */
+#define kKfgTokenizer  ( ( const KTokenizer* ) 3 )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_token_ */
diff --git a/interfaces/klib/trie.h b/interfaces/klib/trie.h
new file mode 100644
index 0000000..0532c6a
--- /dev/null
+++ b/interfaces/klib/trie.h
@@ -0,0 +1,293 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_trie_
+#define _h_klib_trie_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * TNode
+ *  a node within trie
+ */
+typedef struct TNode TNode;
+struct TNode
+{
+    BSTNode n;
+    String key;
+};
+
+/* TNodeMake
+ *  creates a TNode of variable size
+ *
+ *  "n" will contain the returned node
+ *
+ *  "size" must be at least the size of a TNode
+ */
+KLIB_EXTERN rc_t CC TNodeMake ( TNode **n, size_t size );
+
+/* TNodeWhack
+ *  performs final whacking of node
+ */
+KLIB_EXTERN void CC TNodeWhack ( TNode *self );
+
+
+/*--------------------------------------------------------------------------
+ * Trie
+ *  a tree of text nodes
+ *
+ *  this is a collection of { key, value } pairs, where a many-value
+ *  to one key paradigm is naturally supported, as in the b-tree.
+ *
+ *  the desired insertion operations are:
+ *   a) key -> value
+ *   b) key -> { value, ... }
+ *
+ *  the desired retrieval operations are:
+ *   a) key -> value
+ *   b) key -> { value, ... }
+ *   c) RE -> key : value
+ *   d) RE -> { key : value, ... }
+ *   e) iteration across { key : value, ... }
+ *
+ *  the reverse retrieval operation is externally managed by virtue of
+ *  externalization of the TNode, which bundles together key and value.
+ *  any external mechanism allowing access to the TNode will perform a
+ *  reverse lookup.
+ */
+typedef struct Trie Trie;
+struct Trie
+{
+    /* root node in the tree */
+    struct TTrans *root;
+
+    /* forward and reverse UTF-32 character maps */
+    const uint16_t *map;
+    const uint32_t *rmap;
+
+    /* range of acceptable UTF-32 input characters */
+    uint32_t first_char;
+    uint32_t last_char;
+
+    /* width of transition array */
+    uint16_t width;
+
+    /* limit to the number of values */
+    uint16_t limit;
+
+    /* automatically expand character set */
+    uint8_t cs_expand;
+
+#if _DEBUGGING
+    /* post-validate tree after every insert */
+    uint8_t validate;
+
+    uint8_t align1 [ 2 ];
+#else
+    uint8_t align1 [ 3 ];
+#endif
+};
+
+/* TrieInit
+ *  initialize a text-tree structure
+ *
+ *  "accept" [ IN ] -  a character-set string where each character
+ *  represents itself. the only exception is the '-' character,
+ *  which - when sandwiched between two other characters - is
+ *  interpreted en tot as a range expression. an example would be
+ *  "-0-9" is identical to "-0123456789"
+ *
+ *  "limit" [ IN ] - sets the number of values to be accumulated in
+ *  any container. if this limit would be exceeded by any insertion,
+ *  the node is expanded and its values are re-distributed among
+ *  its children.
+ *
+ *  "cs_expand" [ IN ] - if true, then any valid characters observed
+ *  during insertions are automatically added to the accept character
+ *  set. doing so will ensure that there are no ambiguous transitions.
+ *
+ *  returns status codes:
+ *    EINVAL => an invalid parameter
+ *    ENOMEM => failed to allocate internal structures
+ */
+KLIB_EXTERN rc_t CC TrieInit ( Trie *tt, const char *accept,
+    uint32_t limit, bool cs_expand );
+
+/* TrieInsert
+ *  inserts an item into tree
+ *
+ *  "item" [ IN ] -  a TNode forming the { key, value } pair.
+ *
+ *  returns status codes:
+ *    EINVAL => an invalid parameter
+ *    ENOMEM => failed to allocate internal structures
+ */
+KLIB_EXTERN rc_t CC TrieInsert ( Trie *self, TNode *item );
+
+/* TrieInsertUnique
+ *  behaves like TrieInsert if the key does not already have an
+ *  associated value. fails otherwise, returning the existing node.
+ *
+ *  "item" [ IN ] - { key, value } pair
+ *
+ *  "exist" [ OUT, NULL OKAY ] - return parameter for existing node
+ *  if insert failed due to unique constraint. NULL otherwise.
+ *
+ *  returns status codes:
+ *    EINVAL => an invalid parameter
+ *    EEXIST => the key is already bound to a value
+ *    ENOMEM => failed to allocate internal structures
+ */
+KLIB_EXTERN rc_t CC TrieInsertUnique ( Trie *self, TNode *item, TNode **exist );
+
+/* TrieUnlink
+ *  remove an object from the tree
+ *
+ *  "item" [ IN ] - an actual TNode presumed to be held within tree.
+ *
+ *  return value:
+ *    true  => node belonged to tree and was removed
+ *    false => node does not belong to tree
+ */
+KLIB_EXTERN bool CC TrieUnlink ( Trie *self, TNode *item );
+
+/* TrieValidate
+ *  run validation check on tree structure
+ *
+ *  return status codes:
+ *    ?
+ *
+ * TEMPORARY
+ */
+#if 0
+KLIB_EXTERN int CC TrieValidate ( const Trie *self );
+#endif
+
+/* TrieFind
+ * TrieFindRE
+ *  find a single object within tree
+ *
+ *  "key" [ IN ] - an exact match text string
+ *
+ *  "re" [ IN ] - a regular expression string
+ *
+ *  return value:
+ *    NULL    => no match
+ *    TNode* => arbitrarily chosen matching node
+ */
+KLIB_EXTERN TNode* CC TrieFind ( const Trie *self, const String *key );
+#if 0
+KLIB_EXTERN TNode* CC TrieFindRE ( const Trie *self, const String *re );
+#endif
+
+/* TrieFindAll
+ * TrieFindAllRE
+ *  find multiple objects within tree
+ *
+ *  "key" [ IN ] - an exact match text string
+ *
+ *  "re" [ IN ] - a regular expression string
+ *
+ *  "buffer" [ OUT ] and "capacity" [ IN ] - a user-supplied
+ *  array of TNode* with a capacity of "capacity" elements.
+ *  if successful, the entire found set will be returned unordered within.
+ *
+ *  "num_found" [ OUT ] - indicates the size of the found set,
+ *  regardless of return value, such that if the supplied
+ *  buffer were to be too small, the required size is returned.
+ *
+ *  returns status codes:
+ *    EINVAL  => an invalid parameter
+ *    ENOENT  => the found set was empty
+ *    ENOBUFS => the found set was too large
+ */
+KLIB_EXTERN rc_t CC TrieFindAll ( const Trie *self, const String *key,
+    TNode *buffer [], uint32_t capacity, uint32_t *num_found );
+#if 0
+KLIB_EXTERN rc_t CC TrieFindAllRE ( const Trie *self, const String *re,
+    TNode *buffer [], uint32_t capacity, uint32_t *num_found );
+#endif
+
+/* TrieForEach
+ *  executes a function on each tree element
+ *
+ *  "f" [ IN ] and "data" [ IN ] - iteration callback function for
+ *  examining each TNode in the tree
+ */
+KLIB_EXTERN void CC TrieForEach ( const Trie *self,
+    void ( CC * f ) ( TNode *n, void *data ), void *data );
+
+/* TrieDoUntil
+ *  executes a function on each tree element
+ *  until the function returns true
+ *
+ *  "f" [ IN ] and "data" [ IN ] - iteration callback function for
+ *  examining each TNode in the tree. the function returns "true"
+ *  to halt iteration.
+ *
+ *  return values:
+ *    the last value returned by "f" or false if never invoked
+ */
+KLIB_EXTERN bool CC TrieDoUntil ( const Trie *self,
+    bool ( CC * f ) ( TNode *n, void *data ), void *data );
+
+/* TrieExplore
+ *  executes a function on each element in the path of the key
+ *  from furthest node to closest node
+ *  until the function returns true or end of chain
+ */
+KLIB_EXTERN bool CC TrieExplore ( const Trie *self, const String *key,
+    bool ( CC * f ) ( TNode *n, void *data ), void *data );
+
+/* TrieWhack
+ *  tears down internal structure
+ *
+ *  "whack" [ IN, NULL OKAY ] and "data" [ IN ] - optional function
+ *  to be invoked on TNode objects contained within. if NULL, the
+ *  nodes will be whacked via "TNodeWhack"
+ */
+KLIB_EXTERN void CC TrieWhack ( Trie *self,
+    void ( CC * whack ) ( TNode *n, void *data ), void *data );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_trie_ */
diff --git a/interfaces/klib/vector.h b/interfaces/klib/vector.h
new file mode 100644
index 0000000..e615a5a
--- /dev/null
+++ b/interfaces/klib/vector.h
@@ -0,0 +1,539 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_vector_
+#define _h_klib_vector_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KVector
+ *  encapsulated vector interface
+ *
+ *  a vector obeys a particular set of messages
+ *  it may be implemented as an array, but not necessarily.
+ *
+ *  the principal property of a vector is that it acts as a map
+ *  between an integer key and a value of some type. in this case,
+ *  we only accept unsigned integers as keys.
+ */
+typedef struct KVector KVector;
+
+
+/* Make
+ *  create an empty vector
+ */
+KLIB_EXTERN rc_t CC KVectorMake ( KVector **v );
+
+
+/* AddRef
+ * Release
+ */
+KLIB_EXTERN rc_t CC KVectorAddRef ( const KVector *self );
+KLIB_EXTERN rc_t CC KVectorRelease ( const KVector *self );
+
+
+/* Get
+ *  get an untyped value
+ *  returns rc_t state of rcNull if index is not set
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "value_buffer" [ OUT ] and "bsize" [ IN ] - return buffer for value
+ *
+ *  "bytes" [ OUT ] - return parameter for bytes in value
+ *
+ * NB - if rc_t state is rcInsufficient, "bytes" will contain
+ *  the number of bytes required to access the indexed value
+ */
+KLIB_EXTERN rc_t CC KVectorGet ( const KVector *self, uint64_t key,
+    void *value_buffer, size_t bsize, size_t *bytes );
+
+/* Get
+ *  get typed values
+ *  returns rc_t state of rcNull if index is not set
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "value" [ OUT ] - return parameter for value
+ */
+KLIB_EXTERN rc_t CC KVectorGetBool ( const KVector *self, uint64_t key, bool *value );
+KLIB_EXTERN rc_t CC KVectorGetBoolOld ( const KVector *self, uint64_t key, bool *value );
+
+KLIB_EXTERN rc_t CC KVectorGetI8 ( const KVector *self, uint64_t key, int8_t *value );
+KLIB_EXTERN rc_t CC KVectorGetI16 ( const KVector *self, uint64_t key, int16_t *value );
+KLIB_EXTERN rc_t CC KVectorGetI32 ( const KVector *self, uint64_t key, int32_t *value );
+KLIB_EXTERN rc_t CC KVectorGetI64 ( const KVector *self, uint64_t key, int64_t *value );
+
+KLIB_EXTERN rc_t CC KVectorGetU8 ( const KVector *self, uint64_t key, uint8_t *value );
+KLIB_EXTERN rc_t CC KVectorGetU16 ( const KVector *self, uint64_t key, uint16_t *value );
+KLIB_EXTERN rc_t CC KVectorGetU32 ( const KVector *self, uint64_t key, uint32_t *value );
+KLIB_EXTERN rc_t CC KVectorGetU64 ( const KVector *self, uint64_t key, uint64_t *value );
+
+KLIB_EXTERN rc_t CC KVectorGetF32 ( const KVector *self, uint64_t key, float *value );
+KLIB_EXTERN rc_t CC KVectorGetF64 ( const KVector *self, uint64_t key, double *value );
+
+KLIB_EXTERN rc_t CC KVectorGetPtr ( const KVector *self, uint64_t key, void **value );
+
+
+/* GetFirst
+ *  get first non-null element
+ *  returns key of found element in "first"
+ */
+KLIB_EXTERN rc_t CC KVectorGetFirst ( const KVector *self, uint64_t *first,
+    void *value_buffer, size_t bsize, size_t *bytes );
+
+KLIB_EXTERN rc_t CC KVectorGetFirstBool ( const KVector *self, uint64_t *first, bool *value );
+
+KLIB_EXTERN rc_t CC KVectorGetFirstI8 ( const KVector *self, uint64_t *first, int8_t *value );
+KLIB_EXTERN rc_t CC KVectorGetFirstI16 ( const KVector *self, uint64_t *first, int16_t *value );
+KLIB_EXTERN rc_t CC KVectorGetFirstI32 ( const KVector *self, uint64_t *first, int32_t *value );
+KLIB_EXTERN rc_t CC KVectorGetFirstI64 ( const KVector *self, uint64_t *first, int64_t *value );
+
+KLIB_EXTERN rc_t CC KVectorGetFirstU8 ( const KVector *self, uint64_t *first, uint8_t *value );
+KLIB_EXTERN rc_t CC KVectorGetFirstU16 ( const KVector *self, uint64_t *first, uint16_t *value );
+KLIB_EXTERN rc_t CC KVectorGetFirstU32 ( const KVector *self, uint64_t *first, uint32_t *value );
+KLIB_EXTERN rc_t CC KVectorGetFirstU64 ( const KVector *self, uint64_t *first, uint64_t *value );
+
+KLIB_EXTERN rc_t CC KVectorGetFirstF32 ( const KVector *self, uint64_t *first, float *value );
+KLIB_EXTERN rc_t CC KVectorGetFirstF64 ( const KVector *self, uint64_t *first, double *value );
+
+KLIB_EXTERN rc_t CC KVectorGetFirstPtr ( const KVector *self, uint64_t *first, void **value );
+
+
+/* GetPrev
+ *  given a starting key, get first previous non-null element
+ *  returns key of found element in "prev"
+ */
+KLIB_EXTERN rc_t CC KVectorGetPrev ( const KVector *self, uint64_t *prev,
+    uint64_t key, void *value_buffer, size_t bsize, size_t *bytes );
+
+KLIB_EXTERN rc_t CC KVectorGetPrevBool ( const KVector *self,
+    uint64_t *prev, uint64_t key, bool *value );
+KLIB_EXTERN rc_t CC KVectorGetPrevBoolOld ( const KVector *self,
+    uint64_t *prev, uint64_t key, bool *value );
+
+KLIB_EXTERN rc_t CC KVectorGetPrevI8 ( const KVector *self,
+    uint64_t *prev, uint64_t key, int8_t *value );
+KLIB_EXTERN rc_t CC KVectorGetPrevI16 ( const KVector *self,
+    uint64_t *prev, uint64_t key, int16_t *value );
+KLIB_EXTERN rc_t CC KVectorGetPrevI32 ( const KVector *self,
+    uint64_t *prev, uint64_t key, int32_t *value );
+KLIB_EXTERN rc_t CC KVectorGetPrevI64 ( const KVector *self,
+    uint64_t *prev, uint64_t key, int64_t *value );
+
+KLIB_EXTERN rc_t CC KVectorGetPrevU8 ( const KVector *self,
+    uint64_t *prev, uint64_t key, uint8_t *value );
+KLIB_EXTERN rc_t CC KVectorGetPrevU16 ( const KVector *self,
+    uint64_t *prev, uint64_t key, uint16_t *value );
+KLIB_EXTERN rc_t CC KVectorGetPrevU32 ( const KVector *self,
+    uint64_t *prev, uint64_t key, uint32_t *value );
+KLIB_EXTERN rc_t CC KVectorGetPrevU64 ( const KVector *self,
+    uint64_t *prev, uint64_t key, uint64_t *value );
+
+KLIB_EXTERN rc_t CC KVectorGetPrevF32 ( const KVector *self,
+    uint64_t *prev, uint64_t key, float *value );
+KLIB_EXTERN rc_t CC KVectorGetPrevF64 ( const KVector *self,
+    uint64_t *prev, uint64_t key, double *value );
+
+KLIB_EXTERN rc_t CC KVectorGetPrevPtr ( const KVector *self,
+    uint64_t *prev, uint64_t key, void **value );
+
+
+/* GetNext
+ *  given a starting key, get first following non-null element
+ *  returns key of found element in "next"
+ */
+KLIB_EXTERN rc_t CC KVectorGetNext ( const KVector *self, uint64_t *next,
+    uint64_t key, void *value_buffer, size_t bsize, size_t *bytes );
+
+KLIB_EXTERN rc_t CC KVectorGetNextBool ( const KVector *self,
+    uint64_t *next, uint64_t key, bool *value );
+KLIB_EXTERN rc_t CC KVectorGetNextBoolOld ( const KVector *self,
+    uint64_t *next, uint64_t key, bool *value );
+
+KLIB_EXTERN rc_t CC KVectorGetNextI8 ( const KVector *self,
+    uint64_t *next, uint64_t key, int8_t *value );
+KLIB_EXTERN rc_t CC KVectorGetNextI16 ( const KVector *self,
+    uint64_t *next, uint64_t key, int16_t *value );
+KLIB_EXTERN rc_t CC KVectorGetNextI32 ( const KVector *self,
+    uint64_t *next, uint64_t key, int32_t *value );
+KLIB_EXTERN rc_t CC KVectorGetNextI64 ( const KVector *self,
+    uint64_t *next, uint64_t key, int64_t *value );
+
+KLIB_EXTERN rc_t CC KVectorGetNextU8 ( const KVector *self,
+    uint64_t *next, uint64_t key, uint8_t *value );
+KLIB_EXTERN rc_t CC KVectorGetNextU16 ( const KVector *self,
+    uint64_t *next, uint64_t key, uint16_t *value );
+KLIB_EXTERN rc_t CC KVectorGetNextU32 ( const KVector *self,
+    uint64_t *next, uint64_t key, uint32_t *value );
+KLIB_EXTERN rc_t CC KVectorGetNextU64 ( const KVector *self,
+    uint64_t *next, uint64_t key, uint64_t *value );
+
+KLIB_EXTERN rc_t CC KVectorGetNextF32 ( const KVector *self,
+    uint64_t *next, uint64_t key, float *value );
+KLIB_EXTERN rc_t CC KVectorGetNextF64 ( const KVector *self,
+    uint64_t *next, uint64_t key, double *value );
+
+KLIB_EXTERN rc_t CC KVectorGetNextPtr ( const KVector *self,
+    uint64_t *next, uint64_t key, void **value );
+
+
+/* Set
+ *  set an untyped value
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "value" [ IN ] and "bytes" [ IN ] - value buffer
+ */
+KLIB_EXTERN rc_t CC KVectorSet ( KVector *self, uint64_t key,
+    const void *value, size_t bytes );
+
+/* Set
+ *  set typed values
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "data" [ IN ] - value
+ */
+KLIB_EXTERN rc_t CC KVectorSetBool ( KVector *self, uint64_t key, bool value );
+KLIB_EXTERN rc_t CC KVectorSetBoolOld ( KVector *self, uint64_t key, bool value );
+
+KLIB_EXTERN rc_t CC KVectorSetI8 ( KVector *self, uint64_t key, int8_t value );
+KLIB_EXTERN rc_t CC KVectorSetI16 ( KVector *self, uint64_t key, int16_t value );
+KLIB_EXTERN rc_t CC KVectorSetI32 ( KVector *self, uint64_t key, int32_t value );
+KLIB_EXTERN rc_t CC KVectorSetI64 ( KVector *self, uint64_t key, int64_t value );
+
+KLIB_EXTERN rc_t CC KVectorSetU8 ( KVector *self, uint64_t key, uint8_t value );
+KLIB_EXTERN rc_t CC KVectorSetU16 ( KVector *self, uint64_t key, uint16_t value );
+KLIB_EXTERN rc_t CC KVectorSetU32 ( KVector *self, uint64_t key, uint32_t value );
+KLIB_EXTERN rc_t CC KVectorSetU64 ( KVector *self, uint64_t key, uint64_t value );
+
+KLIB_EXTERN rc_t CC KVectorSetF32 ( KVector *self, uint64_t key, float value );
+KLIB_EXTERN rc_t CC KVectorSetF64 ( KVector *self, uint64_t key, double value );
+
+KLIB_EXTERN rc_t CC KVectorSetPtr ( KVector *self, uint64_t key, const void *value );
+
+
+/* Unset
+ *  unset an entry
+ *  returns rc_t state rcNull if index is not set
+ *
+ *  "key" [ IN ] - vector index
+ */
+KLIB_EXTERN rc_t CC KVectorUnset ( KVector *self, uint64_t key );
+
+
+/* Visit
+ *  executes a function on each key/value pair
+ *  returns early if "f" returns non-zero rc_t
+ *
+ *  "reverse" [ IN ] - if true, execute in reverse order
+ *
+ *  "f" [ IN ] and "user_data" [ IN, OPAQUE ] - function to be
+ *  executed on each vector element or until the function
+ *  returns true.
+ */
+KLIB_EXTERN rc_t CC KVectorVisit ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, const void *value, size_t bytes, void *user_data ),
+    void *user_data );
+
+/* Visit
+ *  visit typed values
+ *  returns early if "f" returns non-zero rc_t
+ *
+ *  "reverse" [ IN ] - if true, execute in reverse order
+ *
+ *  "f" [ IN ] and "user_data" [ IN, OPAQUE ] - function to be
+ *  executed on each vector element or until the function
+ *  returns true.
+ */
+KLIB_EXTERN rc_t CC KVectorVisitBool ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, bool value, void *user_data ),
+    void *user_data );
+KLIB_EXTERN rc_t CC KVectorVisitBoolOld ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, bool value, void *user_data ),
+    void *user_data );
+KLIB_EXTERN rc_t CC KVectorVisitI64 ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, int64_t value, void *user_data ),
+    void *user_data );
+KLIB_EXTERN rc_t CC KVectorVisitU64 ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, uint64_t value, void *user_data ),
+    void *user_data );
+KLIB_EXTERN rc_t CC KVectorVisitU32 ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, uint32_t value, void *user_data ),
+    void *user_data );
+KLIB_EXTERN rc_t CC KVectorVisitF64 ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, double value, void *user_data ),
+    void *user_data );
+KLIB_EXTERN rc_t CC KVectorVisitPtr ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, const void *value, void *user_data ),
+    void *user_data );
+
+
+
+/*--------------------------------------------------------------------------
+ * Vector
+ *  simple vector of void*
+ */
+typedef struct Vector Vector;
+struct Vector
+{
+    void **v;
+    uint32_t start;
+    uint32_t len;
+    uint32_t mask;
+};
+
+/* Init
+ *  initialize vector
+ *
+ *  "start" [ IN ] - initial index to vector, normally 0
+ *
+ *  "block" [ IN ] - selects the number of elements in
+ *  a vector block; used for allocating and extending
+ */
+KLIB_EXTERN void CC VectorInit ( Vector *self, uint32_t start, uint32_t block );
+
+
+/* Copy
+ *  initialize a new vector from an existing one
+ *  performs a shallow copy
+ */
+KLIB_EXTERN rc_t CC VectorCopy ( const Vector *self, Vector *copy );
+
+
+/* Start
+ *  returns the starting index
+ */
+#define VectorStart( self ) \
+    ( * ( const uint32_t* ) & ( ( self ) -> start ) )
+
+
+/* Length
+ *  return the vector length
+ */
+#define VectorLength( self ) \
+    ( * ( const uint32_t* ) & ( ( self ) -> len ) )
+
+
+/* Block
+ *  return the vector expansion block size
+ */
+#define VectorBlock( self ) \
+    ( * ( const uint32_t* ) & ( ( self ) -> mask ) + 1 )
+
+
+/* Get
+ *  retrieve an indexed element
+ */
+KLIB_EXTERN void* CC VectorGet ( const Vector *self, uint32_t idx );
+
+
+/* Set
+ *  sets an indexed element
+ *  extends vector as required
+ *
+ *  "idx" [ IN ] - item index
+ *
+ *  "item" [ IN, OPAQUE ] - item to be appended to vector
+ *
+ *  returns rcExists if element is not NULL
+ */
+KLIB_EXTERN rc_t CC VectorSet ( Vector *self, uint32_t idx, const void *item );
+
+
+/* Swap
+ *  swaps value of an indexed element
+ *  behaves like Set except that it allows overwrite
+ *
+ *  "idx" [ IN ] - item index
+ *
+ *  "item" [ IN, OPAQUE ] - new element value
+ *
+ *  "prior" [ OUT ] - prior element value
+ */
+KLIB_EXTERN rc_t CC VectorSwap ( Vector *self, uint32_t idx,
+    const void *item, void **prior );
+
+
+/* Append
+ *  appends item to end of vector
+ *
+ *  "idx" [ OUT, NULL OKAY ] - optional return parameter for item index
+ *
+ *  "item" [ IN, OPAQUE ] - item to be appended to vector
+ */
+KLIB_EXTERN rc_t CC VectorAppend ( Vector *self, uint32_t *idx, const void *item );
+
+
+/* First
+ * Last
+ *  get item at either end of vector
+ */
+KLIB_EXTERN void* CC VectorFirst ( const Vector *self );
+KLIB_EXTERN void* CC VectorLast ( const Vector *self );
+
+
+/* Find
+ *  find an object within ordered vector
+ *
+ *  "key" [ IN ] - find criteria
+ *
+ *  "idx" [ OUT, NULL OKAY ] - optional return parameter for item index
+ *
+ *  "cmp" [ IN ] - comparison function that returns
+ *  equivalent of "key" - "n"
+ */
+KLIB_EXTERN void* CC VectorFind ( const Vector *self, const void *key, uint32_t *idx,
+    int64_t ( CC * cmp ) ( const void *key, const void *n ) );
+
+
+/* Insert
+ *  insert an object to vector, even if duplicate
+ *
+ *  "item" [ IN ] - object to insert
+ *
+ *  "idx" [ OUT, NULL OKAY ] - optional return parameter for item index
+ *
+ *  "sort" [ IN ] - comparison function that returns
+ *  equivalent of "item" - "n"
+ *
+ *  the treatment of order for items reported as identical
+ *  i.e. sort function returns zero when they are compared,
+ *  is undefined.
+ *
+ *  the current implementation treats '<=' as '<' such
+ *  that all inserts are converted to a '<' or '>' comparison,
+ *  but this should not be relied upon.
+ */
+KLIB_EXTERN rc_t CC VectorInsert ( Vector *self, const void *item, uint32_t *idx,
+    int64_t ( CC * sort ) ( const void *item, const void *n ) );
+
+
+/* InsertUnique
+ *  insert an object to vector, but only if unique.
+ *
+ *  "item" [ IN ] - object to insert
+ *
+ *  "idx" [ OUT, NULL OKAY ] - optional return parameter for
+ *  item index. when return code state is rcExists, this value
+ *  will be that of the existing item.
+ *
+ *  "sort" [ IN ] - comparison function that returns
+ *  equivalent of "item" - "n"
+ */
+KLIB_EXTERN rc_t CC VectorInsertUnique ( Vector *self, const void *item, uint32_t *idx,
+    int64_t ( CC * sort ) ( const void *item, const void *n ) );
+
+
+/* Merge
+ *  merge a sorted vector into an existing, sorted vector
+ *
+ *  "unique" [ IN ] - eliminate duplicates if true
+ *
+ *  "v" [ IN ] - sorted vector of elements to merge
+ *
+ *  "sort" [ IN ] - comparison function that returns
+ *  equivalent of "item" - "n"
+ */
+KLIB_EXTERN rc_t CC VectorMerge ( Vector *self, bool unique, const Vector *v,
+    int64_t ( CC * sort ) ( const void *item, const void *n ) );
+
+
+/* Remove
+ *  retrieves value at given index
+ *  shifts all elements to right of index toward start,
+ *  preserving order and decrements length by 1
+ *  return removed item
+ *
+ *  "idx" [ IN ] - item index
+ *
+ *  "removed" [ OUT ] - removed element value
+ */
+KLIB_EXTERN rc_t CC VectorRemove ( Vector *self, uint32_t idx, void **removed );
+
+
+/* Reorder
+ *  execute ksort on vector with provided function
+ */
+KLIB_EXTERN void CC VectorReorder ( Vector *self,
+    int64_t ( CC * cmp ) ( const void**, const void**, void *data ), void *data );
+
+
+/* ForEach
+ *  executes a function on each vector element
+ *
+ *  "reverse" [ IN ] - if true, execute in reverse order
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to be
+ *  executed on each vector element
+ */
+KLIB_EXTERN void CC VectorForEach ( const Vector *self, bool reverse,
+    void ( CC * f ) ( void *item, void *data ), void *data );
+
+
+/* DoUntil
+ *  executes a function on each element
+ *  until the function returns true
+ *
+ *  "reverse" [ IN ] - if true, execute in reverse order
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to be
+ *  executed on each vector element or until the function
+ *  returns true.
+ *
+ *  return values:
+ *    false unless "f" returns true
+ */
+KLIB_EXTERN bool CC VectorDoUntil ( const Vector *self, bool reverse,
+    bool ( CC * f ) ( void *item, void *data ), void *data );
+
+
+/* Whack
+ *  removes entries from vector and
+ *  executes a user provided destructor
+ */
+KLIB_EXTERN void CC VectorWhack ( Vector *self,
+    void ( CC * whack ) ( void *item, void *data ), void *data );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_vector_ */
diff --git a/interfaces/klib/vlen-encode.h b/interfaces/klib/vlen-encode.h
new file mode 100644
index 0000000..c6527dc
--- /dev/null
+++ b/interfaces/klib/vlen-encode.h
@@ -0,0 +1,161 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_klib_vlen_encode_
+#define _h_klib_vlen_encode_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*****************************************************************************
+ * This encoding is very similar to X.690's BER and/or Perl's pack('w').
+ * It differs in that it handles signed values.
+ * It uses bit 6 (of 7..0) of the first byte to store the sign.
+ * The layout of bits from 7 to 0, from MSB to LSB is
+ *  CSXXXXXX(CXXXXXXX)*
+ * where:
+ *  C is the continuation flag
+ *  S is the sign flag, and
+ *  X are the digits of the absolute value of the encoded number.
+ * Thus a number x: |x| <
+ *  0x40 is encoded in 1 byte,
+ *  0x2000 in 2,
+ *  0x80000000000000 (i.e. a 55 bit number) in 8, etc.
+ * The worst case requires 10 bytes to encode.
+ */
+
+/*****************************************************************************
+ * encode 1 value into buffer
+ *
+ * Parameters:
+ *  dst, dsize: buffer to write into of length dsize, can be null, 0
+ *  act_size: (optional) number of bytes needed to encode
+ *  x: the value to encode
+ */
+KLIB_EXTERN rc_t CC vlen_encode1 ( void *dst, uint64_t dsize, uint64_t *act_size, int64_t x );
+
+/*****************************************************************************
+ * encode array into buffer
+ *
+ * Parameters:
+ *  dst, dsize: buffer to write into of length dsize, can be null, 0
+ *  act_size: (optional) number of bytes needed to encode
+ *  x, xcount: the array of xcount elements to encode
+ */
+KLIB_EXTERN rc_t CC vlen_encode ( void *dst, uint64_t dsize, uint64_t *act_size, 
+        const int64_t x[], uint32_t xcount );
+
+/*****************************************************************************
+ * decode 1 value from buffer
+ *
+ * Parameters:
+ *  y: result
+ *  src, ssize: buffer to read from of length ssize
+ *  consumed: (optional) number of bytes used from src
+ */
+KLIB_EXTERN rc_t CC vlen_decode1 ( int64_t *y, const void *src,
+        uint64_t ssize, uint64_t *consumed );
+
+/*****************************************************************************
+ * decode array from buffer
+ *
+ * Parameters:
+ *  y, count: result array of ycount elements
+ *  src, ssize: buffer to read from of length ssize
+ *  consumed: (optional) number of bytes used from src
+ */
+KLIB_EXTERN rc_t CC vlen_decode ( int64_t *y, uint64_t ycount, const void *src,
+        uint64_t ssize, uint64_t *consumed );
+
+
+/*****************************************************************************
+ * This encoding is very similar to X.690's BER and/or Perl's pack('w').
+ * The layout of bits from 7 to 0, from MSB to LSB is
+ *  CXXXXXXX(CXXXXXXX)*
+ * where:
+ *  C is the continuation flag
+ *  X are the digits of the encoded number.
+ * The worst case requires 10 bytes to encode.
+ */
+
+/*****************************************************************************
+ * encode 1 value into buffer
+ *
+ * Parameters:
+ *  dst, dsize: buffer to write into of length dsize, can be null, 0
+ *  act_size: (optional) number of bytes needed to encode
+ *  x: the value to encode
+ */
+KLIB_EXTERN rc_t CC vlen_encodeU1 ( void *dst, uint64_t dsize,
+        uint64_t *act_size, uint64_t x );
+
+/*****************************************************************************
+ * encode array into buffer
+ *
+ * Parameters:
+ *  dst, dsize: buffer to write into of length dsize, can be null, 0
+ *  act_size: (optional) number of bytes needed to encode
+ *  x, xcount: the array of xcount elements to encode
+ */
+KLIB_EXTERN rc_t CC vlen_encodeU ( void *dst, uint64_t dsize, uint64_t *act_size,
+        const uint64_t x[], uint32_t xcount );
+
+/*****************************************************************************
+ * decode 1 value from buffer
+ *
+ * Parameters:
+ *  y: result
+ *  src, ssize: buffer to read from of length ssize
+ *  consumed: (optional) number of bytes used from src
+ */
+KLIB_EXTERN rc_t CC vlen_decodeU1 ( uint64_t *y, const void *src, 
+        uint64_t ssize, uint64_t *consumed );
+
+/*****************************************************************************
+ * decode array from buffer
+ *
+ * Parameters:
+ *  y, count: result array of ycount elements
+ *  src, ssize: buffer to read from of length ssize
+ *  consumed: (optional) number of bytes used from src
+ */
+KLIB_EXTERN rc_t CC vlen_decodeU ( uint64_t *y, uint64_t ycount, const void *src, 
+        uint64_t ssize, uint64_t *consumed );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_vlen_encode_ */
diff --git a/interfaces/klib/writer.h b/interfaces/klib/writer.h
new file mode 100644
index 0000000..4c8c175
--- /dev/null
+++ b/interfaces/klib/writer.h
@@ -0,0 +1,170 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_klib_writer_
+#define _h_klib_writer_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_logfmt_
+#include <klib/logfmt.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* ----------
+ * The writer module (which contains the log, status, out, and debug sub-modules)
+ * is an ecapsulation and virtualization of standard output.
+ *
+ *  this logging API - like most others - attempts to remain isolated
+ *  from any actual logging implementation, such that output may be
+ *  routed in several ways.
+ *
+ *  the default handler
+ *
+ *  the path from unstructured text to formatted XML is difficult in that
+ *  it requires parsing, and is therefore error prone.
+ *
+ *  the path from structured reports to XML as well as less or unstructured
+ *  text is simple to implement, but generally more of a burden to use.
+ *
+ *  the challenge is therefore to present an API that makes structured
+ *  logging less painful than it might be.
+ *
+ *
+ * There are two parts with an unfortunate legacy quirky combination.
+ *  There is a formater that will be shared by all sub-modules.
+ *  There is the actual stream writer.
+ *
+ * Each submodule will have one or more calls that call the formatter and writer functions.
+ */
+KLIB_EXTERN rc_t CC KWrtInit ( const char * appname, uint32_t vers );
+
+/* -----
+ * The writer module core file/stream output function:
+ *
+ * The function's prototype matches as much as possible the KFS file writer prototype.
+ *
+ * If the self structure contained a KFile * and a position it could use the KFS file write
+ */
+
+typedef rc_t ( CC * KWrtWriter ) ( void * self, const char * buffer, size_t bufsize, size_t * num_writ );
+
+/* ----
+ * a Writer handler combines the function and its self object
+ */
+typedef struct KWrtHandler
+{
+    KWrtWriter writer;
+    void *     data;    /* the actual type depends upon the writer function */
+} KWrtHandler;
+
+
+/*--------------------------------------------------------------------------
+ * nvp - name/value pair
+ */
+typedef struct wrt_nvp_t_struct {
+    const char *name;
+    const char *value;
+} wrt_nvp_t;
+
+KLIB_EXTERN void CC wrt_nvp_sort(size_t argc, wrt_nvp_t argv[]);
+KLIB_EXTERN const wrt_nvp_t* CC wrt_nvp_find( size_t argc, const wrt_nvp_t argv[], const char* key );
+KLIB_EXTERN const char* CC wrt_nvp_find_value( size_t argc, const wrt_nvp_t argv[], const char* key );
+
+/* -----
+ * The formatter module core file/stream output function:
+ *
+ */
+
+typedef rc_t ( CC * KFmtWriter ) ( void* self, KWrtHandler* writer,
+                                   size_t argc, const wrt_nvp_t args[],
+                                   size_t envc, const wrt_nvp_t envs[]);
+/* ----
+ * a formatter handler combines the function and custom data
+ */
+typedef struct KFmtHandler KFmtHandler;
+struct KFmtHandler
+{
+    KFmtWriter formatter;
+    void* data;    /* the actual type depends upon the writer function */
+};
+
+
+/* kprintf
+ *  performs a printf to our output writer
+ */
+KLIB_EXTERN rc_t CC kprintf ( size_t *num_writ, const char * fmt, ... );
+KLIB_EXTERN rc_t CC vkprintf ( size_t *num_writ, const char * fmt, va_list args );
+
+
+/* kfprintf
+ *  performs a printf to a KWrtHandler
+ */
+KLIB_EXTERN rc_t CC kfprintf ( const KWrtHandler *out,
+    size_t *num_writ, const char * fmt, ... );
+KLIB_EXTERN rc_t CC vkfprintf ( const KWrtHandler *out,
+    size_t *num_writ, const char * fmt, va_list args );
+
+
+/* RCExplain
+ *  explains rc code in "English'ish" language
+ */
+KLIB_EXTERN rc_t CC RCExplain ( rc_t rc, char *buffer, size_t bsize, size_t *num_writ );
+
+KLIB_EXTERN rc_t CC LogInsertSpace(const char *spacer, char *buffer, size_t bsize, size_t *num_writ);
+
+/* generates a timestamp-string in GMT-time */
+KLIB_EXTERN rc_t CC LogTimestamp ( char *buffer, size_t bsize, size_t *num_writ );
+
+/* generates a timestamp-string in local time */
+KLIB_EXTERN rc_t CC LogSimpleTimestamp ( char *buffer, size_t bsize, size_t *num_writ );
+
+KLIB_EXTERN rc_t CC LogPID ( char *buffer, size_t bsize, size_t *num_writ );
+KLIB_EXTERN rc_t CC LogAppName ( char *buffer, size_t bsize, size_t *num_writ );
+KLIB_EXTERN rc_t CC LogAppVersion ( char *buffer, size_t bsize, size_t *num_writ );
+
+/* FlushLine
+ *  flushes a buffer through output handler
+ */
+KLIB_EXTERN rc_t CC LogFlush ( const KWrtHandler * handler, const char *buffer, const size_t bsize );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_klib_writer_ */
diff --git a/interfaces/kns/adapt.h b/interfaces/kns/adapt.h
new file mode 100644
index 0000000..dd6d2c3
--- /dev/null
+++ b/interfaces/kns/adapt.h
@@ -0,0 +1,89 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kns_adapt_
+#define _h_kns_adapt_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct KStream;
+
+
+/*--------------------------------------------------------------------------
+ * KStream
+ *  adapters between KFile and KStream
+ */
+
+/* FromKFilePair
+ *  create a KStream from a pair of KFiles
+ *  maintains a "pos" marker for input and output files
+ *
+ *  "strm" [ OUT ] - resultant KStream
+ *
+ *  "read" [ IN, NULL OKAY ] - file to use for stream reading
+ *
+ *  "write" [ IN, NULL OKAY ] - file to use for stream writing
+ *
+ * NB - EITHER "read" or "write" may be NULL, but not both.
+ */
+KNS_EXTERN rc_t CC KStreamFromKFilePair ( struct KStream **strm,
+    struct KFile const *read, struct KFile *write );
+
+/* FromKStreamPair
+ *  create a KStream from a pair of KStreams
+ *
+ *  "strm" [ OUT ] - resultant KStream
+ *
+ *  "read" [ IN, NULL OKAY ] - stream to use for input
+ *
+ *  "write" [ IN, NULL OKAY ] - stream to use for output
+ *
+ * NB - EITHER "read" or "write" may be NULL, but not both.
+ */
+KNS_EXTERN rc_t CC KStreamFromKStreamPair ( struct KStream **strm,
+    struct KStream const *read, struct KStream *write );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kns_adapt_ */
diff --git a/interfaces/kns/ascp.h b/interfaces/kns/ascp.h
new file mode 100644
index 0000000..d79c9c8
--- /dev/null
+++ b/interfaces/kns/ascp.h
@@ -0,0 +1,101 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kns_ascp_
+#define _h_kns_ascp_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum
+{
+    eAscpStateRunning,
+    eAscpStateExitSuccess,
+    eAscpStateExitWriteFailure,
+    eAscpStateExitFailure
+};
+
+typedef rc_t TQuitting ( void );
+typedef bool TProgress ( uint64_t id,
+    uint64_t state, uint64_t size, uint64_t percentage );
+
+typedef struct AscpOptions AscpOptions;
+struct AscpOptions
+{
+    uint64_t src_size;
+
+    uint64_t heartbeat;       /* in milliseconds */
+
+    uint64_t id; /* to pass to the callback */
+
+    const char *host;
+    const char *user;
+    char target_rate[512];
+       /* -l MAX-RATE Set the target transfer rate in Kbps */
+
+    const char *ascp_options; /* any arbitrary options to pass to ascp */
+
+/* progress logging */
+    const char *name;
+
+    TProgress *callback;
+
+    TQuitting *quitting;
+
+    bool status; /* whether to call STSMSG */
+
+    bool cache_key; /* Add the server's host key to PuTTY's cache */
+
+    bool disabled; /* output parameter for aspera_options */
+};
+
+/**  status - whether to print STSMSG(1-2) - information messages
+    ascp_bin and private_file should be freed by the caller */
+KNS_EXTERN rc_t CC ascp_locate ( const char **ascp_bin, const char **private_file,
+    bool use_config, bool status );
+
+/** Get a file by running aspera ascp binary */
+KNS_EXTERN rc_t CC aspera_get ( const char *ascp_bin, const char *private_file,
+    const char *src, const char *dest, AscpOptions *opt );
+
+/** Fill AscpOptions members initialized by ascp library */
+KNS_EXTERN rc_t CC aspera_options ( AscpOptions *opt );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/interfaces/kns/endpoint.h b/interfaces/kns/endpoint.h
new file mode 100644
index 0000000..0e4c29c
--- /dev/null
+++ b/interfaces/kns/endpoint.h
@@ -0,0 +1,148 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_kns_endpoint_
+#define _h_kns_endpoint_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct String;
+struct KNSManager;
+
+
+/*--------------------------------------------------------------------------
+ * KEndPoint
+ *  describe a socket endpoint
+ */
+ 
+typedef uint32_t KEndPointType;
+enum
+{
+    epInvalid,
+    epIPV4,
+    epIPV6,
+    epIPC
+};
+
+#define IPC_NAME_MAX 256
+
+typedef struct KEndPoint KEndPoint;
+struct KEndPoint
+{
+	union 
+	{
+		struct
+		{
+			uint32_t addr;
+			uint16_t port;
+		} ipv4;
+
+        struct
+        {
+            uint8_t addr[ 16 ];
+			uint16_t port;
+        } ipv6;
+
+		char ipc_name [ IPC_NAME_MAX ];
+	} u;
+
+    KEndPointType type;
+};
+
+
+/* InitIPv4Endpoint
+ *  initialize the endpoint with an IPv4 address and port
+ *
+ *  "ep" [ OUT ] - address of endpoint block to be intialized
+ *
+ *  "ipv4" [ IN, DEFAULT 0 ] - binary IPv4 address in native integer byte order
+ *   i.e. 0x7F000001 represents 127.0.0.1. if the special address 0 is given, it
+ *   represents any host-local interface address.
+ *
+ *  "port" [ IN, DEFAULT 0 ] - binary port number in native integer byte order.
+ *   if the special port number 0 is given, it represents any available port.
+ */
+KNS_EXTERN rc_t CC KNSManagerInitIPv4Endpoint ( struct KNSManager const *self,
+    KEndPoint *ep, uint32_t ipv4, uint16_t port );
+
+
+/* InitIPv6Endpoint
+ *  initialize the endpoint with an IPv6 address and port
+ *
+ *  "ep" [ OUT ] - address of endpoint block to be intialized
+ *
+ *  "ipv6" [ IN, DEFAULT NULL ] - binary IPv6 address in native integer byte order
+ *   has to point to a 16-byte long array ( = 128 bit ). The function will make
+ *   a copy of this array. 0x1 represents 0:0:0:0:0:0:0:1 the loopback-device.
+ *   If the special address ::0 is given, it represents any host-local interface
+ *   address. ( in6addr_any is a 16-byte array with all bytes set to zero )
+ *   If a NULL-pointer is passed in, the function treats it as in6addr_any.
+ *
+ *  "port" [ IN, DEFAULT 0 ] - binary port number in native integer byte order.
+ *   if the special port number 0 is given, it represents any available port.
+ */
+KNS_EXTERN rc_t CC KNSManagerInitIPv6Endpoint ( struct KNSManager const *self,
+    KEndPoint *ep, uint8_t *ipv6, uint16_t port );
+
+
+/* InitDNSEndpoint
+ *  initialize the endpoint with a DNS name and a port number
+ *
+ *  "ep" [ OUT ] - address of endpoint block to be intialized
+ *
+ *  "dns" [ IN ] - textual DNS address.
+ *
+ *  "port" [ IN, DEFAULT 0 ] - binary port number in native integer byte order.
+ *   if the special port number 0 is given, it represents any available port.
+ */
+KNS_EXTERN rc_t CC KNSManagerInitDNSEndpoint ( struct KNSManager const *self,
+    KEndPoint *ep, struct String const *dns, uint16_t port );
+
+/* InitIPCEndpoint
+ *  initialize the endpoint for interprocess communication
+ *
+ *  "ep" [ OUT ] - address of endpoint block to be intialized
+ *
+ *  "name" [ IN ] - IPC channel name
+ *   ( a POSIX path to a Unix socket, or a name of a Windows pipe )
+ */
+KNS_EXTERN rc_t CC KNSManagerInitIPCEndpoint ( struct KNSManager const *self,
+    KEndPoint *ep, struct String const * name );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kns_endpoint_ */
diff --git a/interfaces/kns/extern.h b/interfaces/kns/extern.h
new file mode 100644
index 0000000..afd5c00
--- /dev/null
+++ b/interfaces/kns/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kns_extern_
+#define _h_kns_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define KNS_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define KNS_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_kns_extern_ */
diff --git a/interfaces/kns/http-priv.h b/interfaces/kns/http-priv.h
new file mode 100644
index 0000000..fa42c08
--- /dev/null
+++ b/interfaces/kns/http-priv.h
@@ -0,0 +1,63 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#ifndef _h_kns_http_priv_
+#define _h_kns_http_priv_
+
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h> /* rc_t */
+#endif
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h> /* KNS_EXTERN */
+#endif
+
+
+struct KClientHttpResult;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+KNS_EXTERN rc_t CC KClientHttpRequestFormatMsg (
+    const struct KClientHttpRequest * self, char * buffer,
+    size_t bsize, const char * method, size_t * len );
+
+KNS_EXTERN rc_t CC KClientHttpResultFormatMsg (
+    const struct KClientHttpResult * self, char * buffer,
+    size_t bsize, size_t * len, const char * bol, const char * eol );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _h_kns_http_priv_ */
diff --git a/interfaces/kns/http.h b/interfaces/kns/http.h
new file mode 100644
index 0000000..75b7b18
--- /dev/null
+++ b/interfaces/kns/http.h
@@ -0,0 +1,407 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kns_http_
+#define _h_kns_http_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct String;
+struct KStream;
+struct KNSManager;
+
+
+/*--------------------------------------------------------------------------
+ * KNSManager
+ */
+
+/* SetHTTPTimeouts
+ *  sets default read/write timeouts to supply to HTTP connections
+ *
+ *  "readMillis" [ IN ] and "writeMillis" - when negative, infinite timeout
+ *   when 0, return immediately, positive gives maximum wait time in mS
+ *   for reads and writes respectively.
+ */
+KNS_EXTERN rc_t CC KNSManagerSetHTTPTimeouts ( struct KNSManager * self,
+    int32_t readMillis, int32_t writeMillis );
+
+
+/* GetHTTPProxyPath
+ *  returns path to HTTP proxy server ( if set ) or NULL.
+ *  return status is 0 if the path is valid, non-zero otherwise
+ *
+ *  returned reference to String must be freed via StringWhack.
+ *
+ * DEPRECATED : THIS FUNCTION IS INCORRECT !!!
+ */
+KNS_EXTERN rc_t CC KNSManagerGetHTTPProxyPath ( struct KNSManager const * self,
+    struct String const ** proxy );
+
+
+/* SetHTTPProxyPath
+ *  sets a path to HTTP proxy server.
+ *  a NULL path format value removes all proxy settings.
+ */
+KNS_EXTERN rc_t CC KNSManagerSetHTTPProxyPath ( struct KNSManager * self,
+    const char * fmt, ... );
+KNS_EXTERN rc_t CC KNSManagerVSetHTTPProxyPath ( struct KNSManager * self,
+    const char * fmt, va_list args );
+
+
+/* GetHTTPProxyEnabled
+ *  returns true iff a non-NULL proxy path exists and user wants to use it
+ *  users indicate desire to use proxy through configuration or SetHTTPProxyEnabled
+ */
+KNS_EXTERN bool CC KNSManagerGetHTTPProxyEnabled ( struct KNSManager const * self );
+
+
+/* SetHTTPProxyEnabled
+ *  sets http-proxy enabled state to supplied value
+ *  returns the prior value as a convenience
+ */
+KNS_EXTERN bool CC KNSManagerSetHTTPProxyEnabled ( struct KNSManager * self, bool enabled );
+
+
+/*------------------------------------------------------------------------------
+ * KFile
+ *  a KFile over HTTP
+ */
+
+/* Make
+ */
+KNS_EXTERN rc_t CC KNSManagerMakeHttpFile ( struct KNSManager const *self,
+    struct KFile const **file, struct KStream *conn, ver_t vers, const char *url, ... );
+KNS_EXTERN rc_t CC KNSManagerVMakeHttpFile ( struct KNSManager const *self,
+    struct KFile const **file, struct KStream *conn, ver_t vers, const char *url, va_list args );
+
+
+/*--------------------------------------------------------------------------
+ * KClientHttp
+ *  hyper text transfer protocol
+ */
+typedef struct KClientHttp KClientHttp, KHttp;
+
+
+/* MakeClientHttp
+ *  create an HTTP protocol
+ *
+ *  "http" [ OUT ] - return parameter for HTTP object
+ *
+ *  "opt_conn" [ IN, NULL OKAY ] - previously opened stream for communications.
+ *
+ *  "vers" [ IN ] - http version
+ *   the only legal types are 1.0 ( 0x01000000 ) and 1.1 ( 0x01010000 )
+ *
+ *  "readMillis" [ IN ] and "writeMillis" - when negative, infinite timeout
+ *   when 0, return immediately, positive gives maximum wait time in mS
+ *   for reads and writes respectively.
+ *
+ *  "host" [ IN ] - parameter to give the host dns name for the connection
+ *
+ *  "port" [ IN, DEFAULT ZERO ] - if zero, defaults to standard for scheme
+ *   if non-zero, is taken as explicit port specification
+ */
+KNS_EXTERN rc_t CC KNSManagerMakeClientHttp ( struct KNSManager const *self,
+    KClientHttp **http, struct KStream *conn, ver_t vers,
+    struct String const *host, uint32_t port );
+
+KNS_EXTERN rc_t CC KNSManagerMakeTimedClientHttp ( struct KNSManager const *self,
+    KClientHttp **http, struct KStream *opt_conn, ver_t vers,
+    int32_t readMillis, int32_t writeMillis,
+    struct String const *host, uint32_t port );
+
+
+/* MakeClientHttps
+ *  create an HTTPS protocol
+ *
+ *  "https" [ OUT ] - return parameter for HTTPS object
+ *
+ *  "opt_conn" [ IN, NULL OKAY ] - previously opened stream for communications.
+ *
+ *  "vers" [ IN ] - https version
+ *   the only legal types are 1.0 ( 0x01000000 ) and 1.1 ( 0x01010000 )
+ *
+ *  "readMillis" [ IN ] and "writeMillis" - when negative, infinite timeout
+ *   when 0, return immediately, positive gives maximum wait time in mS
+ *   for reads and writes respectively.
+ *
+ *  "host" [ IN ] - parameter to give the host dns name for the connection
+ *
+ *  "port" [ IN, DEFAULT ZERO ] - if zero, defaults to standard for scheme
+ *   if non-zero, is taken as explicit port specification
+ */
+KNS_EXTERN rc_t CC KNSManagerMakeClientHttps ( struct KNSManager const *self,
+    KClientHttp **https, struct KStream *conn, ver_t vers,
+    struct String const *host, uint32_t port );
+
+KNS_EXTERN rc_t CC KNSManagerMakeTimedClientHttps ( struct KNSManager const *self,
+    KClientHttp **https, struct KStream *opt_conn, ver_t vers,
+    int32_t readMillis, int32_t writeMillis,
+    struct String const *host, uint32_t port );
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KNS_EXTERN rc_t CC KClientHttpAddRef ( const KClientHttp *self );
+KNS_EXTERN rc_t CC KClientHttpRelease ( const KClientHttp *self );
+
+/* compatibility for existing code */
+#define KNSManagerMakeHttp KNSManagerMakeClientHttp
+#define KNSManagerMakeTimedHttp KNSManagerMakeTimedClientHttp
+#define KHttpAddRef KClientHttpAddRef
+#define KHttpRelease KClientHttpRelease
+
+
+/*------------------------------------------------------------------------------
+ * KClientHttpRequest
+ *  hyper text transfer protocol
+ *  a client request
+ */
+typedef struct KClientHttpRequest KClientHttpRequest, KHttpRequest;
+
+
+/* MakeRequest
+ *  create a request that can be used to contact HTTP server
+ *
+ *  "req" [ OUT ] - return parameter for HTTP request object
+ *
+ *  "vers" [ IN ] - http version
+ *
+ *  "conn" [ IN, NULL OKAY ] - previously opened stream for communications.
+ *
+ *  "url" [ IN ] - full resource identifier. if "conn" is NULL,
+ *   the url is parsed for remote endpoint and is opened by mgr.
+ */
+KNS_EXTERN rc_t CC KClientHttpMakeRequest ( const KClientHttp *self,
+    KClientHttpRequest **req, const char *url, ... );
+
+KNS_EXTERN rc_t CC KNSManagerMakeClientRequest ( struct KNSManager const *self,
+    KClientHttpRequest **req, ver_t version, struct KStream *conn, const char *url, ... );
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KNS_EXTERN rc_t CC KClientHttpRequestAddRef ( const KClientHttpRequest *self );
+KNS_EXTERN rc_t CC KClientHttpRequestRelease ( const KClientHttpRequest *self );
+
+
+/* Connection
+ *  sets connection management headers
+ *
+ *  "close" [ IN ] - if "true", inform the server to close the connection
+ *   after its response ( default for version 1.0 ). when "false" ( default
+ *   for version 1.1 ), ask the server to keep the connection open.
+ *
+ * NB - the server is not required to honor the request
+ */
+KNS_EXTERN rc_t CC KClientHttpRequestConnection ( KClientHttpRequest *self, bool close );
+
+
+/* SetNoCache
+ *  guard against over-eager proxies that try to cache entire files
+ *  and handle byte-ranges locally.
+ */
+KNS_EXTERN rc_t CC KClientHttpRequestSetNoCache ( KClientHttpRequest *self );
+
+
+/* ByteRange
+ *  set requested byte range of response
+ *
+ *  "pos" [ IN ] - beginning offset within remote entity
+ *
+ *  "bytes" [ IN ] - the number of bytes being requested
+ */
+KNS_EXTERN rc_t CC KClientHttpRequestByteRange ( KClientHttpRequest *self, uint64_t pos, size_t bytes );
+
+
+/* AddHeader
+ *  allow addition of an arbitrary HTTP header to message
+ */
+KNS_EXTERN rc_t CC KClientHttpRequestAddHeader ( KClientHttpRequest *self,
+    const char *name, const char *val, ... );
+
+
+/* AddPostParam
+ *  adds a parameter for POST
+ */
+KNS_EXTERN rc_t CC KClientHttpRequestAddPostParam ( KClientHttpRequest *self, const char *fmt, ... );
+KNS_EXTERN rc_t CC KClientHttpRequestVAddPostParam ( KClientHttpRequest *self, const char *fmt, va_list args );
+
+/* compatibility for existing code */
+#define KHttpMakeRequest KClientHttpMakeRequest
+#define KNSManagerMakeRequest KNSManagerMakeClientRequest
+#define KHttpRequestAddRef KClientHttpRequestAddRef
+#define KHttpRequestRelease KClientHttpRequestRelease
+#define KHttpRequestConnection KClientHttpRequestConnection
+#define KHttpRequestByteRange KClientHttpRequestByteRange
+#define KHttpRequestAddHeader KClientHttpRequestAddHeader
+#define KHttpRequestAddPostParam KClientHttpRequestAddPostParam
+#define KHttpRequestVAddPostParam KClientHttpRequestVAddPostParam
+
+/*--------------------------------------------------------------------------
+ * KClientHttpResult
+ *  hyper text transfer protocol
+ */
+typedef struct KClientHttpResult KClientHttpResult, KHttpResult;
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KNS_EXTERN rc_t CC KClientHttpResultAddRef ( const KClientHttpResult *self );
+KNS_EXTERN rc_t CC KClientHttpResultRelease ( const KClientHttpResult *self );
+
+
+/* HEAD
+ *  send HEAD message
+ */
+KNS_EXTERN rc_t CC KClientHttpRequestHEAD ( KClientHttpRequest *self, KClientHttpResult **rslt ); 
+
+/* GET
+ *  send GET message
+ *  all query AND post parameters are combined in URL
+ */
+KNS_EXTERN rc_t CC KClientHttpRequestGET ( KClientHttpRequest *self, KClientHttpResult **rslt ); 
+
+/* POST
+ *  send POST message
+ *  query parameters are sent in URL
+ *  post parameters are sent in body
+ */
+KNS_EXTERN rc_t CC KClientHttpRequestPOST ( KClientHttpRequest *self, KClientHttpResult **rslt ); 
+
+
+/* Status
+ *  access the response status code
+ *  and optionally the message
+ *
+ *  "code" [ OUT ] - return parameter for status code
+ *
+ *  "msg_buff" [ IN, NULL OKAY ] and "buff_size" [ IN, ZERO OKAY ] -
+ *   buffer for capturing returned message
+ *
+ *  "msg_size" [ OUT, NULL OKAY ] - size of returned message in bytes
+ */
+KNS_EXTERN rc_t CC KClientHttpResultStatus ( const KClientHttpResult *self, uint32_t *code,
+    char *msg_buff, size_t buff_size, size_t *msg_size );
+
+
+/* KeepAlive
+ *  retrieves keep-alive property of response
+ *  requires HTTP/1.1
+ */
+KNS_EXTERN bool CC KClientHttpResultKeepAlive ( const KClientHttpResult *self );
+
+
+/* Range
+ *  retrieves position and partial size for partial requests
+ *
+ *  "pos" [ OUT ] - offset to beginning portion of response
+ *
+ *  "bytes" [ OUT ] - size of range
+ */
+KNS_EXTERN rc_t CC KClientHttpResultRange ( const KClientHttpResult *self, uint64_t *pos, size_t *bytes );
+
+
+/* Size
+ *  retrieves overall size of entity, if known
+ *
+ *  "response_size" [ OUT ] - size in bytes of response
+ *   this is the number of bytes that may be expected from the input stream
+ */
+KNS_EXTERN bool CC KClientHttpResultSize ( const KClientHttpResult *self, uint64_t *size );
+
+
+/* AddHeader
+ *  allow addition of an arbitrary HTTP header to RESPONSE
+ *  this can be used to repair or normalize odd server behavior
+ */
+KNS_EXTERN rc_t CC KClientHttpResultAddHeader ( KClientHttpResult *self,
+    const char *name, const char *val, ... );
+
+
+/* GetHeader
+ *  retrieve named header if present
+ *  this cand potentially return a comma separated value list
+ */
+KNS_EXTERN rc_t CC KClientHttpResultGetHeader ( const KClientHttpResult *self, const char *name,
+    char *buffer, size_t bsize, size_t *num_read );
+
+
+/* GetInputStream
+ *  access the body of response as a stream
+ *  only reads are supported
+ *
+ *  "s" [ OUT ] - return parameter for input stream reference
+ *   must be released via KStreamRelease
+ */
+KNS_EXTERN rc_t CC KClientHttpResultGetInputStream ( KClientHttpResult *self,
+    struct KStream  ** s );
+
+KNS_EXTERN bool CC KFileIsKHttpFile ( const struct KFile * self );
+
+    /* compatibility defines */
+#define KHttpResultAddRef KClientHttpResultAddRef
+#define KHttpResultRelease KClientHttpResultRelease
+#define KHttpRequestHEAD KClientHttpRequestHEAD
+#define KHttpRequestGET KClientHttpRequestGET
+#define KHttpRequestPOST KClientHttpRequestPOST
+#define KHttpResultStatus KClientHttpResultStatus
+#define KHttpResultKeepAlive KClientHttpResultKeepAlive
+#define KHttpResultRange KClientHttpResultRange
+#define KHttpResultSize KClientHttpResultSize
+#define KHttpResultAddHeader KClientHttpResultAddHeader
+#define KHttpResultGetHeader KClientHttpResultGetHeader
+#define KHttpResultGetInputStream KClientHttpResultGetInputStream
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kns_http_ */
diff --git a/interfaces/kns/impl.h b/interfaces/kns/impl.h
new file mode 100644
index 0000000..f04ad86
--- /dev/null
+++ b/interfaces/kns/impl.h
@@ -0,0 +1,111 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kns_impl_
+#define _h_kns_impl_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifndef _h_kns_stream_
+#include <kns/stream.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+typedef union KStream_vt KStream_vt;
+
+
+/*--------------------------------------------------------------------------
+ * KStream
+ *  a virtual stream
+ */
+struct KStream
+{
+    const KStream_vt *vt;
+    KRefcount refcount;
+    uint8_t read_enabled;
+    uint8_t write_enabled;
+    uint8_t align [ 2 ];
+};
+
+#ifndef KSTREAM_IMPL
+#define KSTREAM_IMPL struct KStream
+#endif
+
+typedef struct KStream_vt_v1 KStream_vt_v1;
+struct KStream_vt_v1
+{
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t ( CC * destroy ) ( KSTREAM_IMPL *self );
+    rc_t ( CC * read ) ( const KSTREAM_IMPL *self,
+        void *buffer, size_t bsize, size_t *num_read );
+    rc_t ( CC * write ) ( KSTREAM_IMPL *self,
+        const void *buffer, size_t size, size_t *num_writ );
+    /* end minor version == 0 */
+
+    /* start minor version == 1 */
+    rc_t ( CC * timed_read ) ( const KSTREAM_IMPL *self,
+        void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm );
+    rc_t ( CC * timed_write ) ( KSTREAM_IMPL *self,
+        const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm );
+    /* end minor version == 1 */
+};
+
+union KStream_vt
+{
+    KStream_vt_v1 v1;
+};
+
+
+/* Init
+ *  initialize a newly allocated stream object
+ */
+KNS_EXTERN rc_t CC KStreamInit ( KStream *self, const KStream_vt *vt,
+    const char *classname, const char *strname,
+    bool read_enabled, bool write_enabled );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kns_impl_ */
diff --git a/interfaces/kns/kns-mgr-priv.h b/interfaces/kns/kns-mgr-priv.h
new file mode 100644
index 0000000..c6404ff
--- /dev/null
+++ b/interfaces/kns/kns-mgr-priv.h
@@ -0,0 +1,149 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_kns_mgr_priv_
+#define _h_kns_mgr_priv_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KStream;
+struct KHttpFile;
+struct KNSManager;
+struct KFile;
+struct KConfig;
+struct KClientHttpRequest;
+
+/************************** HTTP-retry-related stuff **************************/
+struct HttpRetrySchedule;
+
+struct HttpRetrySpecs
+{
+    struct HttpRetrySchedule** codes;
+    uint8_t count;
+};
+typedef struct HttpRetrySpecs HttpRetrySpecs;
+
+rc_t CC HttpRetrySpecsDestroy ( HttpRetrySpecs* self );
+
+rc_t CC HttpRetrySpecsInit ( HttpRetrySpecs* self, struct KConfig* kfg);
+
+bool HttpGetRetryCodes ( const HttpRetrySpecs* self, uint16_t code, uint8_t * max_retries, const uint16_t ** sleep_before_retry, bool * open_ended );
+
+/* MakeConfig
+ *  create a manager instance using a custom configuration, for testing
+ */
+KNS_EXTERN rc_t CC KNSManagerMakeConfig ( struct KNSManager **mgr, struct KConfig* kfg );
+
+/** MakeReliableHttpFile, KNSManagerMakeReliableClientRequest:
+ * Make HTTP file/request from a reliable URL:
+ * we will try harder to recover upon any error
+ * (make more retries)
+ */
+KNS_EXTERN rc_t CC KNSManagerMakeReliableHttpFile(
+    struct KNSManager const *self, struct KFile const **file,
+    struct KStream *conn, ver_t vers, const char *url, ...);
+KNS_EXTERN rc_t CC KNSManagerMakeReliableClientRequest ( 
+    struct KNSManager const *self, struct KClientHttpRequest **req, 
+    ver_t version, struct KStream *conn, const char *url, ... );
+
+typedef struct {
+    const char *url;
+    
+    const struct KNSManager * kns; /* used to retrieve HttpRetrySpecs */
+    uint32_t last_sleep;
+    uint32_t total_wait_ms;
+    uint32_t max_total_wait_ms;
+    
+    uint32_t last_status;
+    
+    uint8_t max_retries;    
+    uint8_t retries_count;    
+} KHttpRetrier;
+
+rc_t KHttpRetrierInit ( KHttpRetrier * self, const char * url, const struct KNSManager * kns );
+bool KHttpRetrierWait ( KHttpRetrier * self, uint32_t status );
+rc_t KHttpRetrierDestroy ( KHttpRetrier * self );
+
+
+typedef struct HttpProxy HttpProxy;
+const HttpProxy * KNSManagerGetHttpProxy ( const struct KNSManager * self );
+const HttpProxy * HttpProxyGetNextHttpProxy ( const HttpProxy * self );
+
+/* N.B.: DO NOT WHACK THE RETURNED http_proxy String !!! */
+void HttpProxyGet ( const HttpProxy * self,
+    const String ** http_proxy, uint16_t * http_proxy_port );
+
+
+/*--------------------------------------------------------------------------
+ * URLBlock
+ *  RFC 3986
+ */
+typedef enum
+{
+    st_NONE,
+    st_HTTP,
+    st_HTTPS,
+    st_S3
+} SchemeType;
+
+typedef struct URLBlock URLBlock;
+struct URLBlock
+{
+    String scheme;
+    String host;
+    String path; /* Path includes any parameter portion */
+    String query;
+    String fragment;
+
+    uint32_t port;
+
+    SchemeType scheme_type;
+    bool tls;
+
+    bool port_dflt;
+};
+extern void URLBlockInit ( URLBlock *self );
+extern rc_t ParseUrl ( URLBlock * b, const char * url, size_t url_size );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kns_mgr_priv_ */
diff --git a/interfaces/kns/manager-ext.h b/interfaces/kns/manager-ext.h
new file mode 100644
index 0000000..cdab1d5
--- /dev/null
+++ b/interfaces/kns/manager-ext.h
@@ -0,0 +1,59 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_kns_manager_ext_
+#define _h_kns_manager_ext_
+
+#ifndef _h_kns_manager_
+#include <kns/manager.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct SraReleaseVersion;
+
+
+/*--------------------------------------------------------------------------
+ * KNSManager Extension
+ */
+
+/* NewReleaseVersion
+ *  Get release version of the new (latest available) public SRA Toolkit
+ */
+KNS_EXTERN rc_t CC KNSManagerNewReleaseVersion ( const KNSManager *self,
+    struct SraReleaseVersion *newVersion );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kns_manager_ext_ */
diff --git a/interfaces/kns/manager.h b/interfaces/kns/manager.h
new file mode 100644
index 0000000..6fc6bf4
--- /dev/null
+++ b/interfaces/kns/manager.h
@@ -0,0 +1,103 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_kns_manager_
+#define _h_kns_manager_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+
+/*--------------------------------------------------------------------------
+ * KNSManager
+ *  manages the network system
+ */
+typedef struct KNSManager KNSManager;
+
+
+/* Make
+ *  create a manager instance
+ */
+KNS_EXTERN rc_t CC KNSManagerMake ( KNSManager **mgr );
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KNS_EXTERN rc_t CC KNSManagerAddRef ( const KNSManager *self );
+KNS_EXTERN rc_t CC KNSManagerRelease ( const KNSManager *self );
+
+
+/* SetVerbose
+ *  set/clear verbosity flag of manager ( dflt is false )...
+ *  the network-code has to request it
+ */
+KNS_EXTERN void CC KNSManagerSetVerbose ( KNSManager *self, bool verbosity );
+
+
+/* IsVerbose
+ *  request the verbosity flag of manager ( dflt is false )...
+ */
+KNS_EXTERN bool CC KNSManagerIsVerbose ( const KNSManager *self );
+
+
+/* SetConnectionTimeouts
+ *  sets default connect/read/write timeouts to supply to sockets
+ *
+ *  "connectMillis", "readMillis", "writeMillis" [ IN ] - when negative, infinite timeout
+ *  when 0, return immediately, positive gives maximum wait time in sec/mS
+ *  for connects, reads and writes respectively.
+ */
+KNS_EXTERN rc_t CC KNSManagerSetConnectionTimeouts ( KNSManager *self,
+    int32_t connectMillis, int32_t readMillis, int32_t writeMillis );
+
+
+/* Set/Get UserAgent
+ *  for http connections
+ */
+KNS_EXTERN rc_t CC KNSManagerSetUserAgent ( KNSManager *self, const char * fmt, ... );
+KNS_EXTERN rc_t CC KNSManagerGetUserAgent ( const char ** user_agent );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kns_manager_ */
diff --git a/interfaces/kns/socket.h b/interfaces/kns/socket.h
new file mode 100644
index 0000000..1baee5e
--- /dev/null
+++ b/interfaces/kns/socket.h
@@ -0,0 +1,151 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_kns_socket_
+#define _h_kns_socket_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct timeout_t;
+struct KStream;
+struct KEndPoint;
+struct KNSManager;
+
+/*--------------------------------------------------------------------------
+ * KSocket
+ */
+typedef struct KSocket KSocket;
+
+
+/* MakeConnection
+ *  create a connection-oriented stream
+ * MakeTimedConnection
+ *  create a connection-oriented stream having specific read/write timeouts
+ * MakeRetryConnection
+ *  create a connection-oriented stream before stated timeout, retrying as necessary
+ * MakeRetryTimedConnection
+ *  create a connection-oriented stream having specific read/write timeouts,
+ *  before stated timeout, retrying as necessary
+ *
+ *  "conn" [ OUT ] - a stream for communication with the server
+ *
+ *  "retryTimeout" [ IN ] - the connect request should be repeated upon failure
+ *   until this timeout expires.
+ *
+ *  "readMillis" [ IN ] and "writeMillis" - when negative, infinite timeout
+ *   when 0, return immediately, positive gives maximum wait time in mS
+ *   for reads and writes respectively.
+ *
+ *  "from" [ IN ] - client endpoint
+ *
+ *  "to" [ IN ] - server endpoint 
+ *
+ *  both endpoints have to be of type epIP; creates a TCP connection
+ */
+KNS_EXTERN rc_t CC KNSManagerMakeConnection ( struct KNSManager const * self,
+    struct KSocket ** conn, struct KEndPoint const * from, struct KEndPoint const * to );
+
+KNS_EXTERN rc_t CC KNSManagerMakeTimedConnection ( struct KNSManager const * self,
+    struct KSocket ** conn, int32_t readMillis, int32_t writeMillis,
+    struct KEndPoint const * from, struct KEndPoint const * to );
+
+KNS_EXTERN rc_t CC KNSManagerMakeRetryConnection ( struct KNSManager const * self,
+    struct KSocket ** conn, struct timeout_t * retryTimeout,
+    struct KEndPoint const * from, struct KEndPoint const * to );
+
+KNS_EXTERN rc_t CC KNSManagerMakeRetryTimedConnection ( struct KNSManager const * self,
+    struct KSocket ** conn, struct timeout_t * retryTimeout,
+    int32_t readMillis, int32_t writeMillis,
+    struct KEndPoint const * from, struct KEndPoint const * to );
+
+
+/* AddRef
+ * Release
+ */
+KNS_EXTERN rc_t CC KSocketAddRef ( const KSocket *self );
+KNS_EXTERN rc_t CC KSocketRelease ( const KSocket *self );
+
+
+/* GetStream
+ */
+KNS_EXTERN rc_t CC KSocketGetStream ( const KSocket * self, struct KStream ** s );
+
+
+/* Query endpoints
+ */
+KNS_EXTERN rc_t CC KSocketGetRemoteEndpoint ( const KSocket * self, struct KEndPoint * ep );
+KNS_EXTERN rc_t CC KSocketGetLocalEndpoint ( const KSocket * self, struct KEndPoint * ep );
+
+/*--------------------------------------------------------------------------
+ * KListener
+ */
+typedef struct KListener KListener;
+
+/* MakeListener
+ *  create a listener socket for accepting incoming connections
+ *  enter listening state upon first use,
+ *
+ *  "ep" [ IN ] - a local endpoint
+ *
+ *  "listener" [ IN ] - a listener socket
+ */
+KNS_EXTERN rc_t CC KNSManagerMakeListener ( struct KNSManager const *self,
+    KListener **listener, struct KEndPoint const * ep );
+
+
+/* AddRef
+ * Release
+ */
+KNS_EXTERN rc_t CC KListenerAddRef ( const KListener *self );
+KNS_EXTERN rc_t CC KListenerRelease ( const KListener *self );
+
+
+/* Accept
+ *  wait for an incoming connection
+ *
+ *  "conn" [ OUT ] - a stream for communication with the client 
+ */
+KNS_EXTERN rc_t CC KListenerAccept ( KListener *self, struct KSocket **conn );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kns_socket_ */
diff --git a/interfaces/kns/stream.h b/interfaces/kns/stream.h
new file mode 100644
index 0000000..7935767
--- /dev/null
+++ b/interfaces/kns/stream.h
@@ -0,0 +1,222 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kns_stream_
+#define _h_kns_stream_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct timeout_t;
+
+
+/*--------------------------------------------------------------------------
+ * KStream
+ *  the stream is defined to have no concept of size,
+ *  and to not support any form of random access
+ */
+typedef struct KStream KStream;
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KNS_EXTERN rc_t CC KStreamAddRef ( const KStream *self );
+KNS_EXTERN rc_t CC KStreamRelease ( const KStream *self );
+
+
+/* Read
+ * TimedRead
+ *  read data from stream
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of stream.
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KNS_EXTERN rc_t CC KStreamRead ( const KStream *self,
+    void *buffer, size_t bsize, size_t *num_read );
+KNS_EXTERN rc_t CC KStreamTimedRead ( const KStream *self,
+    void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm );
+
+/* ReadAll
+ * TimedReadAll
+ *  read from stream until "bsize" bytes have been retrieved
+ *  or until end-of-input
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of stream.
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KNS_EXTERN rc_t CC KStreamReadAll ( const KStream *self,
+    void *buffer, size_t bsize, size_t *num_read );
+KNS_EXTERN rc_t CC KStreamTimedReadAll ( const KStream *self,
+    void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm );
+
+/* ReadExactly
+ * TimedReadExactly
+ *  read from stream until "bytes" have been retrieved
+ *  or return incomplete transfer
+ *
+ *  "buffer" [ OUT ] and "bytes" [ IN ] - return buffer for read
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KNS_EXTERN rc_t CC KStreamReadExactly ( const KStream *self,
+    void *buffer, size_t bytes );
+KNS_EXTERN rc_t CC KStreamTimedReadExactly ( const KStream *self,
+    void *buffer, size_t bytes, struct timeout_t *tm );
+
+
+/* Write
+ * TimedWrite
+ *  send data to stream
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed writes. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KNS_EXTERN rc_t CC KStreamWrite ( KStream *self,
+    const void *buffer, size_t size, size_t *num_writ );
+KNS_EXTERN rc_t CC KStreamTimedWrite ( KStream *self,
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm );
+
+/* WriteAll
+ * TimedWriteAll
+ *  write to stream until "size" bytes have been transferred
+ *  or until no further progress can be made
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed writes. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KNS_EXTERN rc_t CC KStreamWriteAll ( KStream *self,
+    const void *buffer, size_t size, size_t *num_writ );
+KNS_EXTERN rc_t CC KStreamTimedWriteAll ( KStream *self,
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm );
+
+/* WriteExactly
+ * TimedWriteExactly
+ *  write to stream until "bytes" have been transferred
+ *  or return incomplete transfer error
+ *
+ *  "buffer" [ IN ] and "bytes" [ IN ] - data to be written
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed writes. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+KNS_EXTERN rc_t CC KStreamWriteExactly ( KStream *self,
+    const void *buffer, size_t bytes );
+KNS_EXTERN rc_t CC KStreamTimedWriteExactly ( KStream *self,
+    const void *buffer, size_t bytes, struct timeout_t *tm );
+
+
+/* MakeStdIn
+ *  creates a read-only stream on stdin
+ */
+KNS_EXTERN rc_t CC KStreamMakeStdIn ( const KStream **std_in );
+
+/* MakeStdOut
+ * MakeStdErr
+ *  creates a write-only stream on stdout or stderr
+ */
+KNS_EXTERN rc_t CC KStreamMakeStdOut ( KStream **std_out );
+KNS_EXTERN rc_t CC KStreamMakeStdErr ( KStream **std_err );
+
+
+/* MakeBuffered
+ *  makes a one or two-way stream buffer
+ *  either "in" or "out" may be NULL, but not both
+ *  if neither are NULL, then the stream is two-way
+ *
+ *  each non-NULL stream will get a fixed-sized buffer
+ *  of the size indicated, or default value if size == 0
+ */
+KNS_EXTERN rc_t CC KStreamMakeBuffered ( KStream ** buffered,
+    const KStream * in, KStream * out, size_t bufer_size );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kns_stream_ */
diff --git a/interfaces/kns/tls.h b/interfaces/kns/tls.h
new file mode 100644
index 0000000..0f51dc6
--- /dev/null
+++ b/interfaces/kns/tls.h
@@ -0,0 +1,100 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_kns_tls_
+#define _h_kns_tls_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct String;
+struct KSocket;
+struct KStream;
+struct KNSManager;
+
+
+/*--------------------------------------------------------------------------
+ * KTLSStream
+ *  a stream encrypted with TLS
+ */
+typedef struct KTLSStream KTLSStream;
+
+
+/* MakeTLSStream
+ *  create a TLS wrapper upon an existing KSocket
+ *
+ *  data read from or written to TLS stream is in plaintext
+ *  data from to or wrapped stream is in ciphertext
+ *
+ *  "plaintext" [ OUT ] - return parameter for TLS stream
+ *
+ *  "ciphertext" [ IN ] - existing stream of ciphertext
+ *
+ *  "host" [ IN ] - host dns name
+ */
+KNS_EXTERN rc_t CC KNSManagerMakeTLSStream ( struct KNSManager const * self,
+    KTLSStream ** plaintext, struct KSocket const * ciphertext,
+    struct String const * host );
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KNS_EXTERN rc_t CC KTLSStreamAddRef ( const KTLSStream * self );
+KNS_EXTERN rc_t CC KTLSStreamRelease ( const KTLSStream * self );
+
+
+/* VerifyCACert
+ */
+KNS_EXTERN rc_t CC KTLSStreamVerifyCACert ( const KTLSStream * self );
+
+
+/* GetStream
+ *  reference-counted cast operation
+ *  creates a reference to a KStream from a KTLSStream
+ */
+KNS_EXTERN rc_t CC KTLSStreamGetStream ( const KTLSStream * self,
+    struct KStream ** strm );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kns_tls_ */
diff --git a/interfaces/kproc/barrier.h b/interfaces/kproc/barrier.h
new file mode 100644
index 0000000..877e38f
--- /dev/null
+++ b/interfaces/kproc/barrier.h
@@ -0,0 +1,75 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_barrier_
+#define _h_kproc_barrier_
+
+#ifndef _h_kproc_extern_
+#include <kproc/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * KBarrier
+ *  a thread synchronization device
+ *  detains all callers until the required number has been reached
+ */
+typedef struct KBarrier KBarrier;
+
+
+/* Make
+ *  create a barrier
+ *
+ *  "count" [ IN ] - the number of threads to block
+ */
+KPROC_EXTERN rc_t CC KBarrierMake ( KBarrier **b, uint32_t count );
+
+
+/* AddRef
+ * Release
+ */
+KPROC_EXTERN rc_t CC KBarrierAddRef ( const KBarrier *self );
+KPROC_EXTERN rc_t CC KBarrierRelease ( const KBarrier *self );
+
+
+/* Wait
+ *  block until the required number of callers has been reached
+ */
+KPROC_EXTERN rc_t CC KBarrierWait ( KBarrier *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kproc_barrier_ */
diff --git a/interfaces/kproc/barrier.hpp b/interfaces/kproc/barrier.hpp
new file mode 100644
index 0000000..38fde17
--- /dev/null
+++ b/interfaces/kproc/barrier.hpp
@@ -0,0 +1,79 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_kproc_barrier_
+#define _hpp_kproc_barrier_
+
+#ifndef _h_kproc_barrier_
+#include <kproc/barrier.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KBarrier
+ *  a thread synchronization device
+ *  detains all callers until the required number has been reached
+ */
+struct KBarrier
+{
+    /* Make
+     *  create a barrier
+     *
+     *  "count" [ IN ] - the number of threads to block
+     */
+    static inline rc_t Make ( KBarrier **b, uint32_t count )
+        throw ()
+    { return KBarrierMake ( b, count ); }
+
+
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const
+        throw ()
+    { return KBarrierAddRef ( this ); }
+
+    inline rc_t Release () const
+        throw ()
+    { return KBarrierRelease ( this ); }
+
+
+    /* Wait
+     *  block until the required number of callers has been reached
+     */
+    inline rc_t Wait ()
+        throw ()
+    { return KBarrierWait ( this ); }
+
+private:
+    KBarrier ();
+    ~ KBarrier ();
+    KBarrier ( const KBarrier& );
+    KBarrier &operator = ( const KBarrier& );
+};
+
+
+#endif // _hpp_kproc_barrier_
diff --git a/interfaces/kproc/cond.h b/interfaces/kproc/cond.h
new file mode 100644
index 0000000..c5938ac
--- /dev/null
+++ b/interfaces/kproc/cond.h
@@ -0,0 +1,103 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_cond_
+#define _h_kproc_cond_
+
+#ifndef _h_kproc_extern_
+#include <kproc/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KLock;
+struct timeout_t;
+
+
+/*--------------------------------------------------------------------------
+ * KCondition
+ *  a POSIX-style condition object
+ *  ( requires an external lock object )
+ *
+ *  usage: the user first acquires an external lock. then, depending upon
+ *  the operation, will either test for a condition or establish it, where
+ *  the former involves the potential to wait for a signal and the latter
+ *  to generate a signal using the external lock for blocking.
+ */
+typedef struct KCondition KCondition;
+
+
+/* Make
+ *  create a condition
+ */
+KPROC_EXTERN rc_t CC KConditionMake ( KCondition **cond );
+
+
+/* AddRef
+ * Release
+ */
+KPROC_EXTERN rc_t CC KConditionAddRef ( const KCondition *self );
+KPROC_EXTERN rc_t CC KConditionRelease ( const KCondition *self );
+
+
+/* Wait
+ *  block on external lock until signalled
+ */
+KPROC_EXTERN rc_t CC KConditionWait ( KCondition *self, struct KLock *lock );
+KPROC_EXTERN rc_t CC KConditionTimedWait ( KCondition *self, struct KLock *lock, struct timeout_t *tm );
+
+
+/* Signal
+ *  signal waiting threads
+ *  awaken at most a single thread
+ *
+ * NB - external lock used for synchronization must be locked by current thread
+ */
+KPROC_EXTERN rc_t CC KConditionSignal ( KCondition *self );
+
+
+/* Broadcast
+ *  signal waiting threads
+ *  awaken all waiting thread
+ *
+ * NB - external lock used for synchronization must be locked by current thread
+ */
+KPROC_EXTERN rc_t CC KConditionBroadcast ( KCondition *self );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kproc_cond_ */
diff --git a/interfaces/kproc/cond.hpp b/interfaces/kproc/cond.hpp
new file mode 100644
index 0000000..c1ff6b8
--- /dev/null
+++ b/interfaces/kproc/cond.hpp
@@ -0,0 +1,107 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_kproc_cond_
+#define _hpp_kproc_cond_
+
+#ifndef _h_kproc_cond_
+#include <kproc/cond.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KCondition
+ *  a POSIX-style condition object
+ *  ( requires an external lock object )
+ *
+ *  usage: the user first acquires an external lock. then, depending upon
+ *  the operation, will either test for a condition or establish it, where
+ *  the former involves the potential to wait for a signal and the latter
+ *  to generate a signal using the external lock for blocking.
+ */
+struct KCondition
+{
+    /* Make
+     *  create a condition
+     */
+    static inline rc_t Make ( KCondition **cond )
+        throw ()
+    { return KConditionMake ( cond ); }
+
+
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const
+        throw ()
+    { return KConditionAddRef ( this ); }
+
+    inline rc_t Release () const
+        throw ()
+    { return KConditionRelease ( this ); }
+
+
+    /* Wait
+     *  block on external lock until signaled
+     */
+    inline rc_t Wait ( struct KLock *lock )
+        throw ()
+    { return KConditionWait ( this, lock ); }
+
+    inline rc_t Wait ( struct KLock *lock, struct timeout_t *tm )
+        throw ()
+    { return KConditionTimedWait ( this, lock, tm ); }
+
+    inline rc_t TimedWait ( struct KLock *lock, struct timeout_t *tm )
+        throw ()
+    { return KConditionTimedWait ( this, lock, tm ); }
+
+
+    /* Signal
+     *  signal waiting threads
+     *  awaken at most a single thread
+     */
+    inline rc_t Signal ()
+        throw ()
+    { return KConditionSignal ( this ); }
+
+
+    /* Broadcast
+     *  signal waiting threads
+     *  awaken all waiting thread
+     */
+    inline rc_t Broadcast ()
+        throw ()
+    { return KConditionBroadcast ( this ); }
+
+private:
+    KCondition ();
+    ~ KCondition ();
+    KCondition ( const KCondition& );
+    KCondition &operator = ( const KCondition& );
+};
+
+#endif // _hpp_kproc_cond_
diff --git a/interfaces/kproc/extern.h b/interfaces/kproc/extern.h
new file mode 100644
index 0000000..874d6f2
--- /dev/null
+++ b/interfaces/kproc/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_extern_
+#define _h_kproc_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define KPROC_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define KPROC_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_kproc_extern_ */
diff --git a/interfaces/kproc/impl.h b/interfaces/kproc/impl.h
new file mode 100644
index 0000000..4d99b04
--- /dev/null
+++ b/interfaces/kproc/impl.h
@@ -0,0 +1,104 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_impl_
+#define _h_kproc_impl_
+
+#ifndef _h_kproc_extern_
+#include <kproc/extern.h>
+#endif
+
+#ifndef _h_kproc_task_
+#include <kproc/task.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+typedef union KTask_vt KTask_vt;
+
+
+/*--------------------------------------------------------------------------
+ * KTask
+ *  a deferred task abstraction
+ *  specific task objects are constructed with required parameters
+ *  and implement the Execute method to perform their operation
+ */
+struct KTask
+{
+    const KTask_vt *vt;
+    KRefcount refcount;
+    uint8_t align [ 4 ];
+};
+
+#ifndef KTASK_IMPL
+#define KTASK_IMPL struct KTask
+#endif
+
+typedef struct KTask_vt_v1 KTask_vt_v1;
+struct KTask_vt_v1
+{
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t ( CC * destroy ) ( KTASK_IMPL *self );
+    rc_t ( CC * execute ) ( KTASK_IMPL * self );
+    /* end minor version == 0 */
+};
+
+union KTask_vt
+{
+    KTask_vt_v1 v1;
+};
+
+/* Init
+ *  initialize a newly allocated task object
+ */
+KPROC_EXTERN rc_t CC KTaskInit ( KTask *self, const KTask_vt *vt, const char *clsname, const char *name );
+
+
+/* Destroy
+ *  destroy task
+ */
+KPROC_EXTERN rc_t CC KTaskDestroy ( KTask *self, const char *clsname );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kproc_impl_ */
diff --git a/interfaces/kproc/lock.h b/interfaces/kproc/lock.h
new file mode 100644
index 0000000..17109e1
--- /dev/null
+++ b/interfaces/kproc/lock.h
@@ -0,0 +1,144 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_lock_
+#define _h_kproc_lock_
+
+#ifndef _h_kproc_extern_
+#include <kproc/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct timeout_t;
+
+
+/*--------------------------------------------------------------------------
+ * KLock
+ * KTimedLock
+ *  a POSIX-style mutual exclusion lock
+ *
+ *  Mac/BSD doesn't supply proper support for timed pthread_mutex,
+ *  so we have to provide additional structure to support it.
+ *  in doing so, the timed version has become incompatible with
+ *  the KCondition interface.
+ *
+ *  For reasons given above, we are dividing KLock into two classes
+ *  to separate out support for timed acquire.
+ */
+typedef struct KLock KLock;
+typedef struct KTimedLock KTimedLock;
+
+
+/* Make
+ *  make a simple mutex
+ */
+KPROC_EXTERN rc_t CC KLockMake ( KLock **lock );
+KPROC_EXTERN rc_t CC KTimedLockMake ( KTimedLock **lock );
+
+
+/* AddRef
+ * Release
+ */
+KPROC_EXTERN rc_t CC KLockAddRef ( const KLock *self );
+KPROC_EXTERN rc_t CC KLockRelease ( const KLock *self );
+KPROC_EXTERN rc_t CC KTimedLockAddRef ( const KTimedLock *self );
+KPROC_EXTERN rc_t CC KTimedLockRelease ( const KTimedLock *self );
+
+
+/* Acquire
+ *  acquires lock
+ *
+ *  a NULL "tm" parameter should mean infinite
+ */
+KPROC_EXTERN rc_t CC KLockAcquire ( KLock *self );
+KPROC_EXTERN rc_t CC KTimedLockAcquire ( KTimedLock *self, struct timeout_t *tm );
+
+/* Unlock
+ *  releases lock
+ */
+KPROC_EXTERN rc_t CC KLockUnlock ( KLock *self );
+KPROC_EXTERN rc_t CC KTimedLockUnlock ( KTimedLock *self );
+
+
+/*--------------------------------------------------------------------------
+ * KRWLock
+ *  a POSIX-style read/write lock
+ */
+typedef struct KRWLock KRWLock;
+
+
+/* Make
+ *  make a simple read/write lock
+ */
+KPROC_EXTERN rc_t CC KRWLockMake ( KRWLock **lock );
+
+
+/* AddRef
+ * Release
+ */
+KPROC_EXTERN rc_t CC KRWLockAddRef ( const KRWLock *self );
+KPROC_EXTERN rc_t CC KRWLockRelease ( const KRWLock *self );
+
+
+/* AcquireShared
+ *  acquires read ( shared ) lock
+ *
+ *  a NULL "tm" parameter should mean infinite
+ */
+KPROC_EXTERN rc_t CC KRWLockAcquireShared ( KRWLock *self );
+KPROC_EXTERN rc_t CC KRWLockTimedAcquireShared ( KRWLock *self, struct timeout_t *tm );
+
+
+/* AcquireExcl
+ *  acquires write ( exclusive ) lock
+ *
+ *  a NULL "tm" parameter should mean infinite
+ */
+KPROC_EXTERN rc_t CC KRWLockAcquireExcl ( KRWLock *self );
+KPROC_EXTERN rc_t CC KRWLockTimedAcquireExcl ( KRWLock *self, struct timeout_t *tm );
+
+
+/* Unlock
+ *  releases lock
+ */
+KPROC_EXTERN rc_t CC KRWLockUnlock ( KRWLock *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kproc_lock_ */
diff --git a/interfaces/kproc/lock.hpp b/interfaces/kproc/lock.hpp
new file mode 100644
index 0000000..9e4c1bc
--- /dev/null
+++ b/interfaces/kproc/lock.hpp
@@ -0,0 +1,163 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_lock_
+#define _h_kproc_lock_
+
+#ifndef _h_kproc_lock_
+#include <kproc/lock.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KLock
+ *  a POSIX-style mutual exclusion lock
+ */
+struct KLock
+{
+    /* Make
+     *  make a simple mutex
+     */
+    static inline rc_t Make ( KLock **lock )
+        throw ()
+    { return KLockMake ( lock ); }
+
+
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const
+        throw ()
+    { return KLockAddRef ( this ); }
+
+    inline rc_t Release () const
+        throw ()
+    { return KLockRelease ( this ); }
+
+
+    /* Acquire
+     *  acquires lock
+     */
+    inline rc_t Acquire ()
+        throw ()
+    { return KLockAcquire ( this ); }
+
+    inline rc_t Acquire ( struct timeout_t *tm )
+        throw ()
+    { return KLockTimedAcquire ( tthis, tm ); }
+
+    inline rc_t TimedAcquire ( struct timeout_t *tm )
+        throw ()
+    { return KLockTimedAcquire ( tthis, tm ); }
+
+    /* Unlock
+     *  releases lock
+     */
+    inline rc_t Unlock ()
+        throw ()
+    { return KLockUnlock ( this ): }
+
+private:
+    KLock ();
+    ~ KLock ();
+    KLock ( const KLock& );
+    KLock &operator = ( const KLock& );
+};
+
+
+/*--------------------------------------------------------------------------
+ * KRWLock
+ *  a POSIX-style read/write lock
+ */
+struct KRWLock
+{
+    /* Make
+     *  make a simple read/write lock
+     */
+    static inline rc_t Make ( KRWLock **lock )
+        throw ()
+    { return KRWLockMake ( lock ): }
+
+
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const
+        throw ()
+    { return KRWLockAddRef ( this ); }
+
+    inline rc_t Release () const
+        throw ()
+    { return KRWLockRelease ( this ); }
+
+
+    /* AcquireShared
+     *  acquires read ( shared ) lock
+     */
+    inline rc_t AcquireShared ()
+        throw ()
+    { return KRWLockAcquireShared ( this ); }
+
+    inline rc_t AcquireShared ( struct timeout_t *tm )
+        throw ()
+    { return KRWLockTimedAcquireShared ( this, tm ); }
+
+    inline rc_t TimedAcquireShared ( struct timeout_t *tm )
+        throw ()
+    { return KRWLockTimedAcquireShared ( this, tm ); }
+
+
+    /* AcquireExcl
+     *  acquires write ( exclusive ) lock
+     */
+    inline rc_t AcquireExcl ()
+        throw ()
+    { return KRWLockAcquireExcl ( this ); }
+
+    inline rc_t AcquireExcl ( struct timeout_t *tm )
+        throw ()
+    { return KRWLockTimedAcquireExcl ( this, tm ); }
+
+    inline rc_t TimedAcquireExcl ( struct timeout_t *tm )
+        throw ()
+    { return KRWLockTimedAcquireExcl ( this, tm ); }
+
+
+    /* Unlock
+     *  releases lock
+     */
+    inline rc_t Unlock ()
+        throw ()
+    { return KRWLockUnlock ( this ); }
+
+private:
+    KRWLock ();
+    ~ KRWLock ();
+    KRWLock ( const KRWLock& );
+    KRWLock &operator = ( const KRWLock& );
+};
+
+#endif // _hpp_kproc_lock_
diff --git a/interfaces/kproc/procmgr.h b/interfaces/kproc/procmgr.h
new file mode 100644
index 0000000..4162322
--- /dev/null
+++ b/interfaces/kproc/procmgr.h
@@ -0,0 +1,120 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_procmgr_
+#define _h_kproc_procmgr_
+
+#ifndef _h_kproc_extern_
+#include <kproc/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KTask;
+struct KTaskTicket;
+
+/*--------------------------------------------------------------------------
+ * KProcMgr
+ */
+typedef struct KProcMgr KProcMgr;
+
+
+/* Init
+ *  initialize the proc mgr
+ *  creates the singleton object
+ */
+KPROC_EXTERN rc_t CC KProcMgrInit ( void );
+
+/* Whack
+ *  tear down proc mgr
+ *  runs any outstanding cleanup tasks
+ *  deletes the singleton object
+ *  intended to be called from an "atexit()" or similar task
+ */
+KPROC_EXTERN rc_t CC KProcMgrWhack ( void );
+
+
+/* MakeSingleton
+ *  access singleton process manager
+ *  returns a new reference
+ *  or an error code if not initialized
+ *  VDB-2 ONLY
+ */
+KPROC_EXTERN rc_t CC KProcMgrMakeSingleton ( KProcMgr ** mgr );
+
+
+/* AddRef
+ * Release
+ *  here to support refcounting API
+ *  not generally useful in that the proc mgr
+ *  will stay around until process exit
+ */
+KPROC_EXTERN rc_t CC KProcMgrAddRef ( const KProcMgr *self );
+KPROC_EXTERN rc_t CC KProcMgrRelease ( const KProcMgr *self );
+
+
+/* AddCleanupTask
+ *  add a task to be performed at process exit time
+ *
+ *  "ticket" [ OUT ] - an id that can be used later to remove task
+ *
+ *  "task" [ IN ] - task object that will be executed at process
+ *   exit, unless previously removed ( see RemoveCleanupTask ).
+ *   NB - a new reference to "task" will be created
+ */
+KPROC_EXTERN rc_t CC KProcMgrAddCleanupTask ( KProcMgr *self,
+    struct KTaskTicket *ticket, struct KTask *task );
+
+
+/* RemoveCleanupTask
+ *  remove a task from exit queue
+ *  releases reference to task object
+ *  returns an rcNotFound code if task no longer exists
+ */
+KPROC_EXTERN rc_t CC KProcMgrRemoveCleanupTask ( KProcMgr *self,
+    struct KTaskTicket const *ticket );
+
+
+/* OnMainThread
+ *  returns true if running on main thread
+ */
+KPROC_EXTERN bool CC KProcMgrOnMainThread ( void );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kproc_procmgr_ */
diff --git a/interfaces/kproc/q-extern.h b/interfaces/kproc/q-extern.h
new file mode 100644
index 0000000..96f01d4
--- /dev/null
+++ b/interfaces/kproc/q-extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_q_extern_
+#define _h_kproc_q_extern_
+
+#if ! defined EXPORT_LATCH && _LIBRARY
+#define KQ_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define KQ_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_kproc_q_extern_ */
diff --git a/interfaces/kproc/queue.h b/interfaces/kproc/queue.h
new file mode 100644
index 0000000..32533a4
--- /dev/null
+++ b/interfaces/kproc/queue.h
@@ -0,0 +1,116 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_queue_
+#define _h_kproc_queue_
+
+#include <kproc/q-extern.h>
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct timeout_t;
+
+
+/*--------------------------------------------------------------------------
+ * KQueue
+ *  a simple thread-safe queue structure supporting push/pop operation
+ *  makes use of semaphore objects for synchronization
+ */
+typedef struct KQueue KQueue;
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KQ_EXTERN rc_t CC KQueueAddRef ( const KQueue *self );
+KQ_EXTERN rc_t CC KQueueRelease ( const KQueue *self );
+
+/* Make
+ * create an empty queue object
+ *
+ *  "capacity" [ IN ] - minimum queue length
+ *  always expands to a power of 2, i.e. providing
+ *  a length of 10 will result in a length of 16.
+ */
+KQ_EXTERN rc_t CC KQueueMake ( KQueue **q, uint32_t capacity );
+
+/* Push
+ *  add an object to the queue
+ *
+ *  "item" [ IN, OPAQUE ] - pointer to item being queued
+ *
+ *  "tm" [ IN, NULL OKAY ] - pointer to system specific timeout
+ *  structure. if the queue is full, wait for indicated period
+ *  of time for space to become available, or return status
+ *  code indicating a timeout. when NULL and queue is full,
+ *  Push will time out immediately and return status code.
+ */
+KQ_EXTERN rc_t CC KQueuePush ( KQueue *self, const void *item, struct timeout_t *tm );
+
+/* Pop
+ *  pop an object from queue
+ *
+ *  "item" [ OUT, OPAQUE* ] - return parameter for popped item
+ *
+ *  "tm" [ IN, NULL OKAY ] - pointer to system specific timeout
+ *  structure. if the queue is empty, wait for indicated period
+ *  of time for an object to become available, or return status
+ *  code indicating a timeout. when NULL and queue is empty,
+ *  Pop will time out immediately and return status code.
+ */
+KQ_EXTERN rc_t CC KQueuePop ( KQueue *self, void **item, struct timeout_t *tm );
+
+/* Sealed
+ *  ask if the queue has been closed off
+ *  meaning there will be no further push operations
+ *
+ *  NB - if "self" is NULL, the return value is "true"
+ *  since a NULL queue cannot accept items via push
+ */
+KQ_EXTERN bool CC KQueueSealed ( const KQueue *self );
+
+/* Seal
+ *  indicate that the queue has been closed off
+ *  meaning there will be no further push operations
+ */
+KQ_EXTERN rc_t CC KQueueSeal ( KQueue *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kproc_queue_ */
diff --git a/interfaces/kproc/sem.h b/interfaces/kproc/sem.h
new file mode 100644
index 0000000..423fa0c
--- /dev/null
+++ b/interfaces/kproc/sem.h
@@ -0,0 +1,138 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_sem_
+#define _h_kproc_sem_
+
+#ifndef _h_kproc_extern_
+#include <kproc/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KLock;
+struct timeout_t;
+
+
+/*--------------------------------------------------------------------------
+ * KSemaphore
+ *  a metering device
+ */
+typedef struct KSemaphore KSemaphore;
+
+
+/* Make
+ *
+ *  "count" [ IN ] - initial count value
+ */
+KPROC_EXTERN rc_t CC KSemaphoreMake ( KSemaphore **sem, uint64_t count );
+
+
+/* AddRef
+ * Release
+ */
+KPROC_EXTERN rc_t CC KSemaphoreAddRef ( const KSemaphore *self );
+KPROC_EXTERN rc_t CC KSemaphoreRelease ( const KSemaphore *self );
+
+
+/* Wait
+ *  block until a count becomes available
+ *
+ *  "lock" [ IN ] - externally acquired lock
+ *
+ *  "tm" [ IN, NULL OKAY ] - optional timeout where
+ *  NULL means timeout value of 0
+ */
+KPROC_EXTERN rc_t CC KSemaphoreWait ( KSemaphore *self, struct KLock *lock );
+KPROC_EXTERN rc_t CC KSemaphoreTimedWait ( KSemaphore *self,
+    struct KLock *lock, struct timeout_t *tm );
+
+
+/* Cancel
+ *  signal that the count will never increase
+ *
+ * NB - external lock used for synchronization must be locked by current thread
+ */
+KPROC_EXTERN rc_t CC KSemaphoreCancel ( KSemaphore *self );
+
+
+/* Signal
+ *  signal that a count has become available
+ *
+ * NB - external lock used for synchronization must be locked by current thread
+ */
+KPROC_EXTERN rc_t CC KSemaphoreSignal ( KSemaphore *self );
+
+
+/* Alloc
+ *  allocate a count
+ *  used for resource metering
+ *
+ *  "lock" [ IN ] - externally acquired lock
+ *
+ *  "count" [ IN ] - the resource count
+ *
+ *  "tm" [ IN, NULL OKAY ] - optional timeout where
+ *  NULL means timeout value of 0
+ */
+KPROC_EXTERN rc_t CC KSemaphoreAlloc ( KSemaphore *self,
+    struct KLock *lock, uint64_t count );
+KPROC_EXTERN rc_t CC KSemaphoreTimedAlloc ( KSemaphore *self,
+    struct KLock *lock, uint64_t count, struct timeout_t *tm );
+
+
+/* Free
+ *  signal that resources have become available
+ *
+ * NB - external lock used for synchronization must be locked by current thread
+ */
+KPROC_EXTERN rc_t CC KSemaphoreFree ( KSemaphore *self, uint64_t count );
+
+
+/* Count
+ *  request the current resource usage
+ *
+ *  "count" [ OUT ] - return parameter for current count
+ *
+ * NB - external lock used for synchronization must be locked by current thread
+ */
+KPROC_EXTERN rc_t CC KSemaphoreCount ( const KSemaphore *self, uint64_t *count );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kproc_sem_ */
diff --git a/interfaces/kproc/sem.hpp b/interfaces/kproc/sem.hpp
new file mode 100644
index 0000000..05b3178
--- /dev/null
+++ b/interfaces/kproc/sem.hpp
@@ -0,0 +1,134 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_kproc_sem_
+#define _hpp_kproc_sem_
+
+#ifndef _h_kproc_sem_
+#include <kproc/sem.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KSemaphore
+ *  a metering device
+ */
+struct KSemaphore
+{
+    /* Make
+     *
+     *  "count" [ IN ] - initial count value
+     */
+    static inline rc_t Make ( KSemaphore **sem, uint64_t count )
+        throw ()
+    { return KSemaphoreMake ( sem, count ); }
+
+
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const
+        throw ()
+    { return KSemaphoreAddRef ( this ); }
+
+    inline rc_t Release () const
+        throw ()
+    { return KSemaphoreRelease ( this ); }
+
+
+    /* Wait
+     *  block until a count becomes available
+     *
+     *  "lock" [ IN ] - externally acquired lock
+     */
+    inline rc_t Wait ( struct KLock *lock )
+        throw ()
+    { return KSemaphoreWait ( this, lock ); }
+
+    inline rc_t Wait ( struct KLock *lock, struct timeout_t *tm )
+        throw ()
+    { return KSemaphoreTimedWait ( this, lock, tm ); }
+
+    inline rc_t TimedWait ( struct KLock *lock, struct timeout_t *tm )
+        throw ()
+    { return KSemaphoreTimedWait ( this, lock, tm ); }
+
+
+    /* Signal
+     *  signal that a count has become available
+     */
+    inline rc_t Signal ()
+        throw ()
+    { return KSemaphoreSignal ( this ); }
+
+
+    /* Alloc
+     *  allocate a count
+     *  used for resource metering
+     *
+     *  "lock" [ IN ] - externally acquired lock
+     *
+     *  "count" [ IN ] - the resource count
+     */
+    inline rc_t Alloc ( struct KLock *lock, uint64_t count )
+        throw ()
+    { return KSemaphoreAlloc ( this, lock, count ); }
+
+    inline rc_t Alloc ( struct KLock *lock, uint64_t count, struct timeout_t *tm )
+        throw ()
+    { return KSemaphoreTimedAlloc ( this, lock, count, tm ); }
+
+    inline rc_t TimedAlloc ( struct KLock *lock, uint64_t count, struct timeout_t *tm )
+        throw ()
+    { return KSemaphoreTimedAlloc ( this, lock, count, tm ); }
+
+
+    /* Free
+     *  signal that resources have become available
+     */
+    inline rc_t Free ( uint64_t count )
+        throw ()
+    { return KSemaphoreFree ( this, count ); }
+
+
+    /* Count
+     *  request the current resource usage
+     *  valid only within lock
+     *
+     *  "count" [ OUT ] - return parameter for current count
+     */
+    inline rc_t Count ( uint64_t *count ) const
+        throw ()
+    { return KSemaphoreCount ( this, count ); }
+
+private:
+    KSemaphore ();
+    ~ KSemaphore ();
+    KSemaphore ( const KSemaphore& );
+    KSemaphore &operator = ( const KSemaphore& );
+};
+
+#endif // _hpp_kproc_sem_
diff --git a/interfaces/kproc/task.h b/interfaces/kproc/task.h
new file mode 100644
index 0000000..5e49547
--- /dev/null
+++ b/interfaces/kproc/task.h
@@ -0,0 +1,83 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_task_
+#define _h_kproc_task_
+
+#ifndef _h_kproc_extern_
+#include <kproc/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+
+/*--------------------------------------------------------------------------
+ * KTask
+ *  a deferred task abstraction
+ *  specific task objects are constructed with required parameters
+ *  and implement the Execute method to perform their operation
+ */
+typedef struct KTask KTask;
+
+
+/* AddRef
+ * Release
+ */
+KPROC_EXTERN rc_t CC KTaskAddRef ( const KTask *self );
+KPROC_EXTERN rc_t CC KTaskRelease ( const KTask *self );
+KPROC_EXTERN rc_t CC KTaskDestroy ( KTask *self, const char *clsname );
+
+/* Execute
+ *  perform deferred operation
+ */
+KPROC_EXTERN rc_t CC KTaskExecute ( KTask *self );
+
+/*--------------------------------------------------------------------------
+ * KTaskTicket
+ *  an opaque object holding task identification
+ */
+typedef struct KTaskTicket KTaskTicket;
+struct KTaskTicket
+{
+    uint64_t info [ 2 ];
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kproc_task_ */
diff --git a/interfaces/kproc/thread.h b/interfaces/kproc/thread.h
new file mode 100644
index 0000000..f82676a
--- /dev/null
+++ b/interfaces/kproc/thread.h
@@ -0,0 +1,91 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_thread_
+#define _h_kproc_thread_
+
+#ifndef _h_kproc_extern_
+#include <kproc/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KThread
+ *  a CPU execution thread
+ */
+typedef struct KThread KThread;
+
+/* Make
+ *  create and run a thread
+ *
+ *  "run_thread" [ IN ] - thread entrypoint
+ *
+ *  "data" [ IN, OPAQUE ] - user-supplied thread data
+ */
+KPROC_EXTERN rc_t CC KThreadMake ( KThread **t,
+    rc_t ( CC * run_thread ) ( const KThread *self, void *data ), void *data );
+
+
+/* AddRef
+ * Release
+ */
+KPROC_EXTERN rc_t CC KThreadAddRef ( const KThread *self );
+KPROC_EXTERN rc_t CC KThreadRelease ( const KThread *self );
+
+
+/* Cancel
+ *  signal the thread to finish
+ */
+KPROC_EXTERN rc_t CC KThreadCancel ( KThread *self );
+
+
+/* Wait
+ *  waits for a thread to exit
+ *
+ *  "status" [ OUT, NULL OKAY ] - return parameter for thread's exit code
+ */
+KPROC_EXTERN rc_t CC KThreadWait ( KThread *self, rc_t *status );
+
+
+/* Detach
+ *  allow thread to run independently of group
+ */
+KPROC_EXTERN rc_t CC KThreadDetach ( KThread *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kproc_thread_ */
diff --git a/interfaces/kproc/thread.hpp b/interfaces/kproc/thread.hpp
new file mode 100644
index 0000000..53b9510
--- /dev/null
+++ b/interfaces/kproc/thread.hpp
@@ -0,0 +1,98 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_kproc_thread_
+#define _hpp_kproc_thread_
+
+#ifndef _h_kproc_thread_
+#include <kproc/thread.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KThread
+ *  a CPU execution thread
+ */
+struct KThread
+{
+    /* Make
+     *  create and run a thread
+     *
+     *  "run_thread" [ IN ] - thread entrypoint
+     *
+     *  "data" [ IN, OPAQUE ] - user-supplied thread data
+     */
+    static inline rc_t Make ( KThread **t,
+             rc_t ( CC * run_thread ) ( const KThread *, void * ), void * data )
+        throw ()
+    { return KThreadMake ( t, run_thread, data ); }
+
+
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const
+        throw ()
+    { return KThreadAddRef ( this ); }
+
+    inline rc_t Release () const
+        throw ()
+    { return KThreadRelease ( this ); }
+
+
+    /* Cancel
+     *  signal the thread to finish
+     */
+    inline rc_t Cancel ()
+        throw ()
+    { return KThreadCancel ( this ); }
+
+
+    /* Wait
+     *  waits for a thread to exit
+     *
+     *  "status" [ OUT ] - return parameter for thread's exit code
+     */
+    inline rc_t Wait ( rc_t *status )
+        throw ()
+    { return KThreadWait ( this, status ); }
+
+
+    /* Detach
+     *  allow thread to run independently of group
+     */
+    inline rc_t Detach ()
+        throw ()
+    { return KThreadDetach ( this ); }
+
+private:
+    KThread ();
+    ~ KThread ();
+    KThread ( const KThread& );
+    KThread &operator = ( const KThread& );
+};
+
+#endif // _hpp_kproc_thread_
diff --git a/interfaces/kproc/timeout.h b/interfaces/kproc/timeout.h
new file mode 100644
index 0000000..7ba6084
--- /dev/null
+++ b/interfaces/kproc/timeout.h
@@ -0,0 +1,74 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kproc_timeout_
+#define _h_kproc_timeout_
+
+#ifndef _h_kproc_extern_
+#include <kproc/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_os_native_
+#include <os-native.h> /* struct timeout_t */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * system specific timeout object
+ */
+typedef struct timeout_t timeout_t;
+
+
+/* Init
+ *  initialize a timeout in milliseconds
+ */
+KPROC_EXTERN rc_t CC TimeoutInit ( timeout_t * tm, uint32_t msec );
+
+
+/* Prepare
+ *  ensures that a timeout is prepared with an absolute value
+*/
+KPROC_EXTERN rc_t CC TimeoutPrepare ( timeout_t * tm );
+
+
+/* Remaining
+ *  ask how many milliseconds remain before timeout expires
+ */
+KPROC_EXTERN uint32_t TimeoutRemaining ( timeout_t * tm );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kproc_timeout_ */
diff --git a/interfaces/krypto/aes-priv.h b/interfaces/krypto/aes-priv.h
new file mode 100644
index 0000000..3511bc0
--- /dev/null
+++ b/interfaces/krypto/aes-priv.h
@@ -0,0 +1 @@
+#error "OBSOLETE: DO NOT USE"
diff --git a/interfaces/krypto/cipher-impl.h b/interfaces/krypto/cipher-impl.h
new file mode 100644
index 0000000..02214d4
--- /dev/null
+++ b/interfaces/krypto/cipher-impl.h
@@ -0,0 +1 @@
+#error "OBSOLETE do not use"
diff --git a/interfaces/krypto/cipher-priv.h b/interfaces/krypto/cipher-priv.h
new file mode 100644
index 0000000..328ba6d
--- /dev/null
+++ b/interfaces/krypto/cipher-priv.h
@@ -0,0 +1 @@
+#error "Obsolete do not use"
diff --git a/interfaces/krypto/cipher-test.h b/interfaces/krypto/cipher-test.h
new file mode 100644
index 0000000..f123525
--- /dev/null
+++ b/interfaces/krypto/cipher-test.h
@@ -0,0 +1,49 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#ifndef _h_krypto_cipher_test_
+#define _h_krypto_cipher_test_
+
+#include <krypto/extern.h>
+#include <klib/defs.h>
+
+#include <krypto/ciphermgr.h>
+
+KRYPTO_EXTERN rc_t KCipherTestVecAesNiMake (struct KCipher ** new_cipher,
+                                            kcipher_type type);
+KRYPTO_EXTERN rc_t KCipherTestVecRegMake   (struct KCipher ** new_cipher,
+                                            kcipher_type type);
+KRYPTO_EXTERN rc_t KCipherTestVecMake      (struct KCipher ** new_cipher,
+                                            kcipher_type type);
+KRYPTO_EXTERN rc_t KCipherTestByteMake     (struct KCipher ** new_cipher,
+                                            kcipher_type type);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* #ifndef _h_krypto_cipher_test_ */
diff --git a/interfaces/krypto/cipher.h b/interfaces/krypto/cipher.h
new file mode 100644
index 0000000..2f22733
--- /dev/null
+++ b/interfaces/krypto/cipher.h
@@ -0,0 +1,208 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#ifndef _h_krypto_cipher_
+#define _h_krypto_cipher_
+
+#include <krypto/extern.h>
+#include <klib/defs.h>
+
+typedef struct KCipher KCipher;
+
+KRYPTO_EXTERN 
+rc_t CC KCipherAddref (const KCipher * self);
+
+KRYPTO_EXTERN rc_t CC KCipherRelease (const KCipher * self);
+
+KRYPTO_EXTERN rc_t CC KCipherBlockSize (const KCipher * self, size_t * bytes);
+
+KRYPTO_EXTERN rc_t CC KCipherSetEncryptKey (KCipher * self,
+                                            const void * user_key,
+                                            size_t user_key_size);
+
+KRYPTO_EXTERN rc_t CC KCipherSetDecryptKey (KCipher * self,
+                                            const void * user_key,
+                                            size_t user_key_size);
+
+/*
+ * Set the ivec (Initialization vector or feedback) for the cipher
+ * this is done automatically for the longer runs defined below.
+ *
+ * the size of ivec  must match KCipherBlockSize
+ *
+ * the ivec is copied into the cipher not used in place
+ */
+KRYPTO_EXTERN
+ rc_t CC KCipherSetEncryptIVec (KCipher * self, const void * ivec);
+
+KRYPTO_EXTERN
+ rc_t CC KCipherSetDecryptIVec (KCipher * self, const void * ivec);
+
+
+typedef void (*cipher_ctr_func)(void * ivec);
+
+KRYPTO_EXTERN rc_t CC KCipherSetEncryptCtrFunc (KCipher * self, cipher_ctr_func func);
+
+KRYPTO_EXTERN rc_t CC KCipherSetDecryptCtrFunc (KCipher * self, cipher_ctr_func func);
+
+/*
+ * 'in' can equal 'out'
+ */
+KRYPTO_EXTERN rc_t CC KCipherEncrypt (KCipher * self, const void * in, void * out);
+
+KRYPTO_EXTERN rc_t CC KCipherDecrypt (KCipher * self, const void * in, void * out);
+
+
+/* ====================
+ * longer runs of multiple blocks.
+ *
+ * The algorithms are well defined and standard in most cases.
+ *
+ * PT: plain text block
+ * CT: cipher text block
+ * EK: encryption key
+ * DK: decryption key (might be sthe same as EK)
+ * ENC: encrypt cipher function on a block using a key
+ * DEC: decrypt cipher function on a block using a key
+ * IV: initialization vector - used as feedback for chaining
+ * N:  number used once (nonce)
+ * FB: feedback is the next IV in a chained/feedback mode
+ */
+
+/* -----
+ * NOTE:
+ * 'in' can be the same as 'out' but other overlaps are dangers as a block at a
+ * time is written. The code does not look for overlaps at this point.
+ */
+
+/* ----------
+ * Electronic Code Book - simple cipher with no chaining feedback  just iterate
+ * simple encrypt/decrypt with the plain, text, cipher text and key/
+ *
+ * CT = ENC (PT,EK)
+ * PT = DEC (CT,DK)
+ */
+
+/* -----
+ * NOTE: currently an implmentation detail limits us to 8192 bit cipher block
+ * size.  Changing MAX_BLOCK_SIZE in cipher.c can up that limit without 
+ * causing any other compatibility issues. 
+ *
+ * Two local byte arrays are defined on the stack of 1024 bytes or 8192 bits.
+ */
+KRYPTO_EXTERN rc_t CC KCipherEncryptECB (KCipher * self, const void * in, void * out,
+                                         uint32_t block_count);
+
+KRYPTO_EXTERN rc_t CC KCipherDecryptECB (KCipher * self, const void * in, void * out,
+                                         uint32_t block_count);
+
+/* ----------
+ * Cipher-Block Chaining
+ * CT = (FB = ENC (PT^IV, EK))
+ * PT = DEC ((FB = CT), DK)
+ *
+ */
+KRYPTO_EXTERN rc_t CC KCipherEncryptCBC (KCipher * self, const void * in, void * out,
+                                         uint32_t block_count);
+
+KRYPTO_EXTERN rc_t CC KCipherDecryptCBC (KCipher * self, const void * in, void * out,
+                                         uint32_t block_count);
+
+/* ----------
+ * Propagating cipher-block chaining
+ * FB = PT ^ (CT = ENC ((PT^IV), EK))
+ * FB = CT ^ (PT = DEC (CT,DK) ^ IV)
+ */
+
+/* not yet implemented */
+
+/* ----------
+ * Cipher Feedback
+ * CT = (FB = PT) ^ ENC (IV, EK))
+ * PT = (FB = CT) ^ ENC (IV, DK)
+ *
+ * NOTE the use of the encrypt function for decryption
+ *
+ * Not implemented as the openssl does something different
+ */
+KRYPTO_EXTERN
+rc_t CC KCipherEncryptCFB (KCipher * self, const void * in, void * out,
+                           uint32_t block_count);
+
+KRYPTO_EXTERN
+rc_t CC KCipherDecryptCFB (KCipher * self, const void * in, void * out,
+                           uint32_t block_count);
+
+KRYPTO_EXTERN
+rc_t CC KCipherEncryptPCFB (KCipher * self, const void * in, void * out,
+                            uint32_t block_count);
+
+KRYPTO_EXTERN
+rc_t CC KCipherDecryptPCFB (KCipher * self, const void * in, void * out,
+                            uint32_t block_count);
+
+/* ----------
+ * Output Feedback
+ * CT = PT ^ (FB = ENC (IV, EK))
+ * PT = CT ^ (FB = ENC (IV, DK))
+ *
+ * NOTE the use of the encrypt function for decryption
+ *
+ * Not implemented as the openssl does something different
+ */
+KRYPTO_EXTERN
+rc_t CC KCipherEncryptOFB (KCipher * self, const void * in, void * out,
+                           uint32_t block_count);
+
+KRYPTO_EXTERN
+rc_t CC KCipherDecryptOFB (KCipher * self, const void * in, void * out,
+                           uint32_t block_count);
+
+/* ----------
+ * Counter
+ * IV is a nonce and not re-used as FB
+ * CT = PT ^ ENC (N, EK)
+ * PT = CT ^ ENC (N, DK)
+ *
+ * NOTE the use of the encrypt function for decryption
+ *
+ * nonce is a function that given an iv generates the next iv
+ *
+ */
+KRYPTO_EXTERN
+rc_t CC KCipherEncryptCTR (KCipher * self, const void * in,
+                           void * out, uint32_t block_count);
+KRYPTO_EXTERN
+rc_t CC KCipherDecryptCTR (KCipher * self, const void * in,
+                           void * out, uint32_t block_count);
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* #ifndef _h_krypto_cipher_ */
diff --git a/interfaces/krypto/ciphermgr-priv.h b/interfaces/krypto/ciphermgr-priv.h
new file mode 100644
index 0000000..943e067
--- /dev/null
+++ b/interfaces/krypto/ciphermgr-priv.h
@@ -0,0 +1,38 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+
+
+#ifdef  __cplusplus
+}
+#endif
+
+
+
+#endif /* #ifndef _h_krypto_manager_priv_ */
diff --git a/interfaces/krypto/ciphermgr.h b/interfaces/krypto/ciphermgr.h
new file mode 100644
index 0000000..2534400
--- /dev/null
+++ b/interfaces/krypto/ciphermgr.h
@@ -0,0 +1,98 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_krypto_manager_
+#define _h_krypto_manager_
+
+#ifndef _h_krypto_extern_
+#include <krypto/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+
+#ifndef _h_kfs_defs_
+#include <kfs/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* enabled/disable a set of in-house clean;y written aes ciphers. some optimize
+ * for certain c processors */
+
+#define USE_NCBI_AES 1
+
+
+/*--------------------------------------------------------------------------
+ * KCipherManager
+ */
+struct KCipher;
+
+typedef struct KCipherManager KCipherManager;
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KRYPTO_EXTERN
+rc_t CC KCipherManagerAddRef (const KCipherManager *self);
+
+KRYPTO_EXTERN
+rc_t CC KCipherManagerRelease (const KCipherManager *self);
+
+
+/* MakeCipher
+ */
+typedef uint32_t kcipher_type;
+enum
+{
+    kcipher_null, /* no encryption = just a copy */
+    kcipher_AES,
+    kcipher_count
+};
+
+
+KRYPTO_EXTERN
+rc_t CC KCipherManagerMakeCipher (const KCipherManager * self,
+                                  struct KCipher ** cipher,
+                                  kcipher_type type);
+
+/* Make
+ */
+KRYPTO_EXTERN
+rc_t CC KCipherManagerMake (KCipherManager ** pmanager);
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_manager_ */
diff --git a/interfaces/krypto/encfile-priv.h b/interfaces/krypto/encfile-priv.h
new file mode 100644
index 0000000..84deaf7
--- /dev/null
+++ b/interfaces/krypto/encfile-priv.h
@@ -0,0 +1,250 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_krypto_encfile_priv_
+#define _h_krypto_encfile_priv_
+
+#ifndef _h_krypto_extern_
+#include <krypto/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <krypto/encfile.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define DEBUG_STS(msg)     DBGMSG(DBG_KRYPTO,DBG_FLAG(DBG_KRYPTO_STS),msg)
+#define DEBUG_CFG(msg)     DBGMSG(DBG_KRYPTO,DBG_FLAG(DBG_KRYPTO_CFG_,msg)
+#define DEBUG_ENCRYPT(msg) DBGMSG(DBG_KRYPTO,DBG_FLAG(DBG_KRYPTO_ENCRYPT),msg)
+#define DEBUG_DECRYPT(msg) DBGMSG(DBG_KRYPTO,DBG_FLAG(DBG_KRYPTO_DECRYPT),msg)
+
+/* -----
+ * Encrypted file structure:
+ *   - File Header
+ *   - zero or more data blocks
+ *   - file footer
+ *
+ * File Header:
+ *   - file signature "NCBInenc"
+ *   - byte order flag 
+ *   - version
+ *
+ * Data Block:
+ *   - rkey - randomly generated 32 byte key for this block (encrypted using user key)
+ *   - encrypted block of 32768 bytes size above says how many are really used (encrypted using rkey and salt above)
+ *   - block-offset + (valid bytes in block % 32768)
+ *   - crc-32 (includes phantom block start offset as initial seed)
+ *
+ * File Footer:
+ *   - footer signature "foot"
+ *   - checksum of crcs
+ */
+
+
+/* ----------------------------------------------------------------------
+ * Header - the file header
+ * all constant values for the first version
+ */
+typedef char KEncFileSig [8];
+typedef uint32_t Endian_t;
+typedef uint32_t KEncFileVersion;
+
+
+typedef struct KEncFileHeader KEncFileHeader;
+struct KEncFileHeader
+{
+    KEncFileSig     file_sig;   /* "NCBInenc" or "NCBIkenc" */
+    Endian_t        byte_order; /* do we byte swap on read? */
+    KEncFileVersion version;    /* simple incrementation starting at 1 */
+};
+
+
+/* ----------------------------------------------------------------------
+ * KEncFileBlock
+ *    The body of the file is blocks containing a portion of the decrypted
+ *    file.  These are an ordered sequence with the last block being the
+ *    same size as the rest but with only some of the data portion being
+ *    a part of the file.
+ *
+ *    An encrypted file is longer than an unencrypted file by 
+ *       a constant: the lengths of the header and the footer
+ *       proportionally by the length of the block key and crc
+ */
+
+/* -----
+ * Key  the header for an encrypted block
+ *
+ * when initialized the first 38 bytes should be set to random data.
+ * valid is a count of how many bytes in the block are valid data
+ * offset is the offset of this block with in the decrypted file
+ */
+typedef uint8_t KEncFileKey [32];
+
+
+/* -----
+ * We sized the data portion of a block to match the KPageFile
+ * structure allowing a KBufFile in front of a KEncFile to
+ * operate in a fairly efficient manner
+ */
+#define ENC_DATA_BLOCK_SIZE     (32*1024)
+typedef uint8_t KEncFileData [ENC_DATA_BLOCK_SIZE];
+
+typedef uint16_t KEncFileOffValid;
+
+typedef uint64_t KEncFileBlockId;
+typedef uint16_t KEncFileBlockValid;
+
+/* -----
+ * we use the same 32 bit CRC as the rest of the project
+ */
+typedef uint32_t KEncFileCRC;
+
+
+/*
+ * NOTE:
+ * The size of data + u + id + crc + crc_copy must remain divisible
+ * by the size of key
+ */
+typedef struct KEncFileBlock KEncFileBlock;
+struct KEncFileBlock
+{
+    KEncFileKey         key;  /* encrypted with the user key */
+    KEncFileData        data; /* encrypted with block key */
+    union
+    {
+        KEncFileBlockValid  valid; /* obscured and encrypted */
+        uint8_t bytes [16];        /* mostly fill */
+    } u;
+    KEncFileBlockId     id;        /* plain text */
+    KEncFileCRC         crc;       /* plain text */
+    KEncFileCRC         crc_copy;  /* plain text */
+};
+
+
+/* ----------------------------------------------------------------------
+ * Foot - the ending of an encrypted file: 
+ *   these are in plan text for non-decryption validation of the whole file
+ *
+ * In Version 1 the crc_checksum is required.
+ * In Version 2 the crc_checksum is optional - if 0 it is not computed.
+ */
+typedef uint64_t KEncFileFooter_t;
+typedef struct KEncFileFooter KEncFileFooter;
+struct KEncFileFooter
+{
+    KEncFileFooter_t block_count;  /* how many blocks do we have? */
+    KEncFileFooter_t crc_checksum; /* sum of crcs of all blocks */
+};
+
+
+/* ----------
+ * Read mode is fully seekable if the underlying KFile is seekable some
+ * integrity checking will not be performed in allowing this seeking.
+ */
+KRYPTO_EXTERN rc_t CC KEncFileMakeRead_v1 (const struct KFile ** pself,
+                                           const struct KFile * encrypted_input,
+                                           const struct KKey * key);
+
+KRYPTO_EXTERN rc_t CC KEncFileMakeRead_v2 (const struct KFile ** pself,
+                                           const struct KFile * encrypted_input,
+                                           const struct KKey * key);
+
+
+/* ----------
+ * Write mode encrypted file can only be written straight through from the
+ * first byte to the last.
+ */
+KRYPTO_EXTERN rc_t CC KEncFileMakeWrite_v1 (struct KFile ** pself,
+                                            struct KFile * encrypted_output,
+                                            const struct KKey * key);
+
+KRYPTO_EXTERN rc_t CC KEncFileMakeWrite_v2 (struct KFile ** pself,
+                                            struct KFile * encrypted_output,
+                                            const struct KKey * key);
+
+
+/* ----------
+ * Update mode is read/write mode where seeking within the file is allowed.
+ *
+ * NOTE this is in the private interface because it is not actually working
+ * yet.
+ */
+KRYPTO_EXTERN rc_t CC KEncFileMakeUpdate_v1 (struct KFile ** pself, 
+                                             struct KFile * encrypted,
+                                             const struct KKey * key);
+
+KRYPTO_EXTERN rc_t CC KEncFileMakeUpdate_v2 (struct KFile ** pself, 
+                                             struct KFile * encrypted,
+                                             const struct KKey * key);
+
+
+/* ----------
+ * Validate mode can not be read or written.
+ * Upon open the whole file is read from beginning to end and all CRC
+ * and other integrity checks are performed immediately
+ */
+KRYPTO_EXTERN rc_t CC KEncFileValidate_v1 (const struct KFile * encrypted);
+
+KRYPTO_EXTERN rc_t CC KEncFileValidate_v2 (const struct KFile * encrypted);
+
+
+/* ----------
+ * Identify whether a file is a KEncFile type encrypted file by the header.
+ * read the header into a buffer and pass it into this function.  
+ * The buffer_size needs to be at least 8 but more bytes lead to a better
+ * check up to the size of the header of a KEncFile type encrypted file.
+ * As the header may change in the future (in a backwards compatible way)
+ * that size might change from the current 16.
+ *
+ * Possible returns:
+ * 0:
+ *      the file is an identified KEncFile type file.  False positives are
+ *      possible if a file happens to match at 8 or more bytes
+ *
+ * RC (rcFS, rcFile, rcIdentifying, rcFile, rcWrongType)
+ *      the file is definitely not a KEncFIle type encrypted file.
+ *     
+ * RC (rcFS, rcFile, rcIdentifying, rcParam, rcNull)
+ *      bad parameters in the call
+ *
+ * RC (rcFS, rcFile, rcIdentifying, rcBuffer, rcInsufficient)
+ *      not a large enough buffer to make an identification
+ */
+KRYPTO_EXTERN rc_t CC KFileIsEnc_v1 (const char * buffer, size_t buffer_size);
+
+KRYPTO_EXTERN rc_t CC KFileIsEnc_v2 (const char * buffer, size_t buffer_size);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_krypto_encfile_priv_ */
diff --git a/interfaces/krypto/encfile.h b/interfaces/krypto/encfile.h
new file mode 100644
index 0000000..df8efe1
--- /dev/null
+++ b/interfaces/krypto/encfile.h
@@ -0,0 +1,134 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*
+ * This needs to be changed to true in about the middle of summer 2013
+ *
+ * When re-enabling this feature also fix test/kreypto/Makefile
+ */
+#define SENC_IS_NENC_FOR_WRITER 0
+
+
+#ifndef _h_krypto_encfile_
+#define _h_krypto_encfile_
+
+#ifndef _h_krypto_extern_
+#include <krypto/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFile;
+struct KKey;
+
+typedef struct KEncFile KEncFile;
+
+/* ----------
+ * Read mode is fully seekable if the underlying KFile is seekable some
+ * integrity checking will not be performed in allowing this seeking.
+ *
+ * One difference between update and read mode is the handling of
+ * "missing blocks". Open for update will read a missing block as all
+ * zero while 
+ */
+KRYPTO_EXTERN rc_t CC KEncFileMakeRead (const struct KFile ** pself,
+                                        const struct KFile * encrypted_input,
+                                        const struct KKey * key);
+
+
+/* ----------
+ * Write mode encrypted file can only be written straight through from the
+ * first byte to the last.
+ */
+KRYPTO_EXTERN rc_t CC KEncFileMakeWrite (struct KFile ** pself,
+                                         struct KFile * encrypted_output,
+                                         const struct KKey * key);
+
+
+/* ----------
+ * Update mode is read/write mode where seeking within the file is allowed.
+ * 
+ * One difference between update and read mode is the handling of
+ * "missing blocks". Open for update will read a missing block as all
+ * zero while 
+ */
+KRYPTO_EXTERN rc_t CC KEncFileMakeUpdate (struct KFile ** pself, 
+                                          struct KFile * encrypted,
+                                          const struct KKey * key);
+
+
+/* ----------
+ * Validate mode can not be read or written.
+ * Upon open the whole file is read from begining to end and all CRC
+ * and other integrity checks are performed immedaitely
+ */
+KRYPTO_EXTERN rc_t CC KEncFileValidate (const struct KFile * encrypted);
+
+
+/* ----------
+ * Identify whether a file is a KEncFile type encrypted file by the header.
+ * read the header into a buffer and pass it into this function.  
+ * The buffer_size needs to be at least 8 but more bytes lead to a better
+ * check up to the size of the header of a KEncFile type encrypted file.
+ * As the header may change in the future (in a backwards compatible way)
+ * that size might change from the current 16.
+ *
+ * Possible returns:
+ * 0:
+ *      the file is an identified KEncFile type file.  False positives are
+ *      possible if a file happens to match at 8 or more bytes
+ *
+ * RC (rcFS, rcFile, rcIdentifying, rcFile, rcWrongType)
+ *      the file is definitely not a KEncFIle type encrypted file.
+ *     
+ * RC (rcFS, rcFile, rcIdentifying, rcParam, rcNull)
+ *      bad parameters in the call
+ *
+ * RC (rcFS, rcFile, rcIdentifying, rcBuffer, rcInsufficient)
+ *      not a large enough buffer to make an identification
+ */
+
+/* requires NCBInenc or NCBIsenc or signature but if available
+ * checks the byte order and version fields
+ */
+KRYPTO_EXTERN rc_t CC KFileIsEnc (const char * buffer, size_t buffer_size);
+
+/* same as above but requires NCBIsenc signature only */
+KRYPTO_EXTERN rc_t CC KFileIsSraEnc (const char * buffer, size_t buffer_size);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_krypto_encfile_ */
diff --git a/interfaces/krypto/extern.h b/interfaces/krypto/extern.h
new file mode 100644
index 0000000..70c1b0c
--- /dev/null
+++ b/interfaces/krypto/extern.h
@@ -0,0 +1,48 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_krypto_extern_
+#define _h_krypto_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define KRYPTO_EXTERN LIB_EXPORT
+#define KRYPTO_EXTERN_DATA extern LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define KRYPTO_EXTERN LIB_IMPORT
+#ifdef __cplusplus
+#define KRYPTO_EXTERN_DATA extern /* LIB_IMPORT_DATA */
+#else
+#define KRYPTO_EXTERN_DATA LIB_IMPORT_DATA
+#endif
+
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_krypto_extern_ */
diff --git a/interfaces/krypto/key.h b/interfaces/krypto/key.h
new file mode 100644
index 0000000..f170d7d
--- /dev/null
+++ b/interfaces/krypto/key.h
@@ -0,0 +1,103 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_key_
+#define _h_kfs_key_
+
+#ifndef _h_krypto_extern_
+#include <krypto/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct KKey KKey;
+
+
+typedef uint32_t KKeyType;
+enum eKKeyType
+{
+    kkeyNone,
+    kkeyAES128,
+    kkeyAES192,
+    kkeyAES256,
+    kkeyTypeCount
+};
+
+#define KKeyTypeDefault (kkeyAES128)
+
+struct KKey
+{
+    KKeyType type;
+    uint8_t  text [32]; /* might be more, might be less */
+};
+
+enum eKKeySize
+{
+    kkeyMinimumSize = 6
+};
+
+KRYPTO_EXTERN_DATA KKey KKeyEncrypt;
+KRYPTO_EXTERN_DATA KKey KKeyDecrypt;
+
+/* WGA ncryption passwords are only significant to 32 characters */
+#define WGA_MAX_PASSWORD (32)
+KRYPTO_EXTERN_DATA char WGAEncryptPassword[WGA_MAX_PASSWORD];
+KRYPTO_EXTERN_DATA char WGADecryptPassword[WGA_MAX_PASSWORD];
+
+typedef char KryptoKeyMapNCBI [32*2];
+typedef char KryptoKeyMapWGA  [2 + 32*2];
+typedef char KryptoKeyMap [(2*sizeof(KryptoKeyMapNCBI))+(2*sizeof(KryptoKeyMapWGA))+1];
+enum
+{
+    KryptoKeyMapEncrypt = 0,
+    KryptoKeyMapDecrypt = sizeof(KryptoKeyMapNCBI),
+    KryptoKeyMapWGAEncrypt = KryptoKeyMapDecrypt + sizeof(KryptoKeyMapNCBI),
+    KryptoKeyMapWGADecrypt = KryptoKeyMapWGAEncrypt + sizeof(KryptoKeyMapWGA),
+    KryptoKeyMapNul = KryptoKeyMapWGADecrypt + sizeof(KryptoKeyMapWGA)
+};
+
+KRYPTO_EXTERN  rc_t CC KKeyInitRead (KKey * self, KKeyType key_type, 
+                                     const void * password, size_t password_size);
+
+KRYPTO_EXTERN rc_t CC KKeyInitUpdate (KKey * key, KKeyType key_type, 
+                                      const void * password, size_t password_size);
+
+
+#define FAIL_SHORT_PASSWORD (false)
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_key_ */
diff --git a/interfaces/krypto/manager-priv.h b/interfaces/krypto/manager-priv.h
new file mode 100644
index 0000000..f2f3346
--- /dev/null
+++ b/interfaces/krypto/manager-priv.h
@@ -0,0 +1,26 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#error "OBSOLETE do not use"
diff --git a/interfaces/krypto/manager.h b/interfaces/krypto/manager.h
new file mode 100644
index 0000000..0581659
--- /dev/null
+++ b/interfaces/krypto/manager.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_krypto_manager_
+#define _h_krypto_manager_
+
+
+DO NOT USE
+
+#endif /* _h_krypto_manager_ */
diff --git a/interfaces/krypto/reencfile.h b/interfaces/krypto/reencfile.h
new file mode 100644
index 0000000..ebef56a
--- /dev/null
+++ b/interfaces/krypto/reencfile.h
@@ -0,0 +1,94 @@
+
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_krypto_reencfile_
+#define _h_krypto_reencfile_
+
+#ifndef _h_krypto_extern_
+#include <krypto/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Currently only the read version is implmented
+ */
+#define REENCFILE_WRITE_SUPPORTED 0
+/*
+ * Currently the input encrypted KFile must respond to KFileSize
+ * with the size of the encrypted file. 
+ */
+#define REENCFILE_STREAM_SUPPORTED 0
+
+
+struct KFile;
+struct KKey;
+
+typedef struct KReencFile KReencFile;
+
+/* ----------
+ * Read mode is fully seekable if the underlying KFile is seekable some
+ * integrity checking will not be performed in allowing this seeking.
+ */
+KRYPTO_EXTERN rc_t CC KReencFileMakeRead (const struct KFile ** pself, 
+                                          const struct KFile * encrypted,
+                                          const struct KKey * deckey,
+                                          const struct KKey * enckey);
+/* ----------
+ * The same operation as above, but as input it accepts a plain text,
+ * not encrypted file and encrypts it with enckey
+ */
+KRYPTO_EXTERN rc_t CC KEncryptFileMakeRead (const struct KFile ** pself, 
+                                            const struct KFile * encrypted,
+                                            const struct KKey * enckey);
+
+
+/* ----------
+ * Write mode encrypted file can only be written straight through form the
+ * first byte to the last.
+ */
+#if REENCFILE_WRITE_SUPPORTED
+KRYPTO_EXTERN rc_t CC KReencFileMakeWrite (struct KFile ** pself, 
+                                           struct KFile * encrypted,
+                                           const struct KKey * deckey,
+                                           const struct KKey * enckey);
+#endif
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_krypto_reencfile_ */
diff --git a/interfaces/krypto/rng-impl.h b/interfaces/krypto/rng-impl.h
new file mode 100644
index 0000000..96d03fe
--- /dev/null
+++ b/interfaces/krypto/rng-impl.h
@@ -0,0 +1,86 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kryptoimpl_
+#define _h_kryptoimpl_
+
+#include <krypto/extern.h>
+#include <krypto/rng.h>
+#include <klib/refcount.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+typedef union KRng_vt KRng_vt;
+
+struct KRng
+{
+    const union KRng_vt *vt;
+    KRefcount refcount;
+};
+
+#ifndef KRNG_IMPL
+#define KRNG_IMPL KRng
+#endif
+
+typedef struct KRng_vt_v1 KRng_vt_v1;
+struct KRng_vt_v1
+{
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t (CC * destroy) (KRNG_IMPL * self);
+    rc_t (CC * seed)    (KRNG_IMPL * self);
+    rc_t (CC * reseed)  (KRNG_IMPL * self, const void * buff, size_t buff_size);
+    rc_t (CC * read)    (const KRNG_IMPL *self, void * buff, uint32_t buff_len,
+                         uint32_t * num_read);
+    /* end minor version == 0 */
+    /* start minor version == 1 */
+    /* end minor version == 1 */
+    /* end version == 1.x */
+};
+
+union KRng_vt
+{
+    KRng_vt_v1 v1;
+};
+
+KRYPTO_EXTERN rc_t CC KRngInit (KRng * self, union KRng_vt * vt, const char * type);
+KRYPTO_EXTERN rc_t CC KRngSysEntropy (KRng * self, uint8_t * buffer, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kryptoimpl_ */
diff --git a/interfaces/krypto/rng.h b/interfaces/krypto/rng.h
new file mode 100644
index 0000000..32b0d47
--- /dev/null
+++ b/interfaces/krypto/rng.h
@@ -0,0 +1,68 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_krypto_rng_
+#define _h_krypto_rng_
+
+#ifndef _h_krypto_extern_
+#include <krypto/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct KRng KRng;
+
+/* attach a new 'ownership' reference */
+KRYPTO_EXTERN rc_t CC KRngAddRef (const KRng * self);
+
+/* release an 'ownership' reference */
+KRYPTO_EXTERN rc_t CC KRngRelease (const KRng * self);
+
+/* call to the system entropy function and [re-]seed the rng */
+KRYPTO_EXTERN rc_t CC KRngSeed (KRng * self);
+
+/* fill a buffer of a given size with random values: type sepcific as to the meaning or size of elements
+ * return the number of elements actually written to the buffer */
+KRYPTO_EXTERN rc_t CC KRngRead (const KRng * self, void * buffer, uint32_t bsize, uint32_t * num_read);
+
+
+/*
+ * Cryptographically secure pseudo-random number generator
+ * elements are 8 bits long
+ */
+KRYPTO_EXTERN rc_t CC KCSPRngMake (KRng ** pself);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_krypto_rng_ */
diff --git a/interfaces/krypto/testciphermgr.h b/interfaces/krypto/testciphermgr.h
new file mode 100644
index 0000000..ffaa35a
--- /dev/null
+++ b/interfaces/krypto/testciphermgr.h
@@ -0,0 +1,58 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_krypto_manager_test_
+#define _h_krypto_manager_test_
+
+#include <krypto/ciphermgr.h>
+
+/* MakeCipher
+ */
+typedef int32_t kcipher_subtype;
+enum
+{
+    ksubcipher_none = -1,
+    ksubcipher_byte,
+    ksubcipher_vec,
+    ksubcipher_vecreg,
+    ksubcipher_accelerated, /* for example AES-NI */ 
+    ksubcipher_count
+};
+
+extern kcipher_subtype KCipherSubType;
+
+
+KRYPTO_EXTERN
+rc_t CC KCipherManagerTestMakeCipher (const KCipherManager * self,
+                                      struct KCipher ** cipher,
+                                      kcipher_type type,
+                                      kcipher_subtype subtype);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_manager_ */
diff --git a/interfaces/krypto/wgaencrypt.h b/interfaces/krypto/wgaencrypt.h
new file mode 100644
index 0000000..b8cfeeb
--- /dev/null
+++ b/interfaces/krypto/wgaencrypt.h
@@ -0,0 +1,128 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_krypto_wgaencryptfile_
+#define _h_krypto_wgaencryptfile_
+
+#ifndef _h_krypto_extern_
+#include <krypto/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+
+/*--------------------------------------------------------------------------
+ * KFile
+ *  wga extensions
+ */
+
+/* MakeWGAEncRead
+ *
+ * Parameters:
+ *   pself is a KFile that will represent the unencrypted side of operations.
+ *
+ *   encrypted is a KFile that will represent the encrypted side of operations.
+ *
+ *   key is an arbitrary array of characters
+ *
+ *   key_size is how many bytes to use from key.  Maximum used is 256.
+ *
+ *   encoding is one of the three values defined by FER_ENCODING above.  Any
+ *   other values will cause a failure.
+ *
+ * KFileMakeWGAEncRead
+ *   A file opened for read can only read and decrypt an encrypted file.  Seeks
+ *   within the file are allowed if the KFile for the encrypted file allows
+ *    seeks.
+ * 
+ * KFileMakeWGAEncUpdate
+ *   A file opened for update must be able to read and write from the encrypted
+ *   file.  Seeks within the file are allowed if the KFile for the encrypted 
+ *   file allows seeks.
+ *
+ * KFileMakeWGAEncRead
+ *   A Write opened file can only be written.  Seeks backwards are not allowed.
+ *   Seeks forward will cause NUL data bytes to be inserted before encryption.
+ *   An attempt will be made to truncate the encrypted file but failure of that
+ *   operation will not fail this call.  Writes will begin at position 0.  If
+ *   the file already existed and could not be truncated a corrupt file will
+ *   result if the whole of the old contents are not over-written.
+ *
+ *
+ * NOTE: cipher must be of type kcipherAES
+ *
+ */
+KRYPTO_EXTERN rc_t CC KFileMakeWGAEncRead (const struct KFile ** pself, 
+                                           const struct KFile * encrypted,
+                                           const char * key,
+                                           size_t key_size);
+
+
+/* IsWGAEnc
+ *  identify whether a file is a KFileWGAEnc type encrypted file by the header.
+ *  read the header into a buffer and pass it into this function.  
+ *  The buffer_size needs to be at least 8 but more bytes lead to a better
+ *  check up to the size of the header of a KFileWGAEnc type encrypted file.
+ *  This file type is deprecated and is not versioned.  Hopefully we won't
+ *  have to deal with changes to the format.
+ *
+ * Possible returns:
+ *  0:
+ *      the file is an identified KFileWGAEnc type file.  False positives are
+ *      possible if a file happens to match at 8 or more bytes
+ *
+ *  RC (rcFS, rcFile, rcIdentifying, rcFile, rcWrongType)
+ *      the file is definitely not a KFileWGAEnc type encrypted file.
+ *     
+ *  RC (rcFS, rcFile, rcIdentifying, rcParam, rcNull)
+ *      bad parameters in the call
+ *
+ *  RC (rcFS, rcFile, rcIdentifying, rcBuffer, rcInsufficient)
+ *      not a large enough buffer to make an identification
+ */
+KRYPTO_EXTERN rc_t CC KFileIsWGAEnc (const void * buffer, size_t buffer_size);
+
+KRYPTO_EXTERN rc_t CC WGAEncValidate (const struct KFile * file, 
+                                      const char * password,
+                                      size_t password_size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_wgaencryptfile_ */
diff --git a/interfaces/ktst/test_tools.hpp b/interfaces/ktst/test_tools.hpp
new file mode 100644
index 0000000..2e46d54
--- /dev/null
+++ b/interfaces/ktst/test_tools.hpp
@@ -0,0 +1,22 @@
+#ifndef _h_ktst_test_tools_
+#define _h_ktst_test_tools_
+
+////////////////////////////////////////////////////////////////////////////////
+// these macros are available outside of test cases' code
+
+#define LOG(log_level, msg) \
+    (log_level >= ncbi::NK::TestEnv::verbosity ? (std::cerr << msg) : std::cerr)
+
+#define TEST_MESSAGE(M) \
+{ ncbi_NK_saveLocation(__FILE__,__LINE__); \
+    LOG(ncbi::NK::LogLevel::e_message, M << std::endl); }
+
+#define TEST_CHECKPOINT(M) TEST_MESSAGE(M)
+
+// report failure from a fixture
+#define FAIL( msg_ )     \
+      _REPORT_CRITICAL_ERROR_( (msg_), __FILE__, __LINE__, true )
+
+#define GET_TEST_SUITE ncbi::NK::GetTestSuite
+
+#endif// _h_ktst_test_tools_
diff --git a/interfaces/ktst/unit_test.hpp b/interfaces/ktst/unit_test.hpp
new file mode 100644
index 0000000..5b12cba
--- /dev/null
+++ b/interfaces/ktst/unit_test.hpp
@@ -0,0 +1,260 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ktst_unit_test_
+#define _h_ktst_unit_test_
+
+#include <ktst/unit_test_suite.hpp>
+
+////////////////////////////////////////////////////////////////////////////////
+namespace ncbi { namespace NK {
+
+// a utility template used to pass test character string case names to FixtureTestCase
+template<class T>
+struct TestCaseTraits
+{
+    static const char* name;
+};
+
+// create an executable test case class with the given fixture.
+template <class TCaseTraits, class TFixture>
+class FixtureTestCase : public ncbi::NK::TestCase, public TFixture { 
+public:
+    typedef TCaseTraits Traits;
+
+    // Represents the global test fixture. Cast to the correct data type in the test code
+    typedef void AUTO_TEST_CASE_FIXTURE;
+
+public: 
+    FixtureTestCase(void* globalFixture) 
+    : TestCase(TCaseTraits::name), _globalFixture (static_cast<AUTO_TEST_CASE_FIXTURE*>(globalFixture)) 
+    {
+    }
+
+protected: 
+    AUTO_TEST_CASE_FIXTURE* GET_GLOBAL_FIXTURE(void) const { return _globalFixture; } 
+    AUTO_TEST_CASE_FIXTURE* _globalFixture; 
+
+    const TFixture* GET_FIXTURE(void) const { return this; } 
+    TFixture* GET_FIXTURE(void) { return this; } 
+}; 
+
+// Create an invoker object for a test case with a given fixture.
+// The invoker object is static and registers itself with the global test suite during initialization.
+// When executed, the invoker will instantiate a fixture and a test case object and execute object's test method 
+// on the current thread.
+template <class TCase, class TFixture>
+class TestCaseInvoker : ncbi::NK::TestInvoker { 
+public: 
+    TestCaseInvoker() : TestInvoker(TCase::Traits::name) 
+    { 
+        ncbi::NK::GetTestSuite()->Add(this); 
+    } 
+private: 
+    virtual void Run(void* globalFixture) throw ()
+    { 
+        try
+        { 
+            TCase t(globalFixture); 
+            t.test_method(); 
+            SetErrorCounter(t.GetErrorCounter()); 
+        }
+        catch (const execution_aborted&)
+        {
+            SetErrorCounter(1);
+        } 
+        catch (const std::exception& ex)
+        {
+            if (!ncbi::NK::TestEnv::lastLocation.empty())
+            {
+                LOG(ncbi::NK::LogLevel::e_fatal_error, ncbi::NK::TestEnv::lastLocation << ": last checkpoint before exception \"" << ex.what() << "\"\n");
+            }        
+            SetErrorCounter(1);
+        } 
+        catch (...) // a non-framework exception escaped
+        { 
+            if (!ncbi::NK::TestEnv::lastLocation.empty())
+            {
+                LOG(ncbi::NK::LogLevel::e_fatal_error, ncbi::NK::TestEnv::lastLocation << ": last checkpoint before an unknown exception\n");
+            }        
+            SetErrorCounter(1);
+        } 
+    } 
+    static TestCaseInvoker instance;
+}; 
+
+// Create an out-of-thread invoker object for a test case with a given fixture.
+// The invoker object is static and registers itself with the global test suite during initialization.
+// When executed, the invoker will instantiate a fixture and a test case object and execute object's test method 
+// as a child process (Unix) or on a separate thread(Windows).
+template <class TCase, class TFixture, int rc, int timeout>
+class ProcessTestCaseInvoker : ncbi::NK::TestInvoker { 
+public: 
+    ProcessTestCaseInvoker() : TestInvoker(TCase::Traits::name) 
+    { 
+        ncbi::NK::GetTestSuite()->Add(this); 
+    } 
+private: 
+    virtual void Run(void* globalFixture) throw ()
+    { 
+        try
+        {
+            TCase t(globalFixture); 
+            TestCase :: TestMethod method = static_cast <TestCase :: TestMethod> ( & TCase::test_method );
+            if (ncbi::NK::TestEnv::RunProcessTestCase(t, method, timeout) != rc)
+            {
+                SetErrorCounter(1);
+            }
+            else
+            {
+                SetErrorCounter(t.GetErrorCounter());
+            }
+        }
+        catch (const execution_aborted&)
+        {
+            SetErrorCounter(1);
+        } 
+        catch (const std::exception& ex)
+        {
+            if (!ncbi::NK::TestEnv::lastLocation.empty())
+            {
+                LOG(ncbi::NK::LogLevel::e_fatal_error, ncbi::NK::TestEnv::lastLocation << ": last checkpoint before exception \"" << ex.what() << "\"\n");
+            }        
+            SetErrorCounter(1);
+        } 
+        catch (...) // a non-framework exception escaped
+        { 
+            if (!ncbi::NK::TestEnv::lastLocation.empty())
+            {
+                LOG(ncbi::NK::LogLevel::e_fatal_error, ncbi::NK::TestEnv::lastLocation << ": last checkpoint before an unknown exception\n");
+            }        
+            SetErrorCounter(1);
+        } 
+    }
+}; 
+
+}} // namespace
+
+// macros to be used to instantiate test cases
+
+// user code should not not use this directly. 
+#define DEFINE_TEST_CASE(testcase, F, rc, timeout) \
+    struct testcase { \
+        class dummy{}; \
+        typedef ncbi::NK::FixtureTestCase< ::ncbi::NK::TestCaseTraits<dummy>, F> Case;\
+        struct Instance : public Case { \
+            Instance(void* g) : Case(g) { ncbi::NK::saveLocation(__FILE__,__LINE__); }\
+            ~Instance() { ncbi::NK::saveLocation(__FILE__,__LINE__); }\
+            void test_method(); } ; \
+        class Invoker : public ::ncbi::NK::TestCaseInvoker<Instance, F> {}; \
+        class ProcessInvoker : public ::ncbi::NK::ProcessTestCaseInvoker<Instance, F, rc, timeout> {}; \
+    };\
+    namespace ncbi { namespace NK { template<> const char* TestCaseTraits< ::testcase::dummy > :: name = #testcase; } }
+
+// define an in-thread test case with a fixture
+#define FIXTURE_TEST_CASE(testcase, F) \
+    DEFINE_TEST_CASE(testcase, F, 0, 0) \
+    static testcase::Invoker testcase##Invoker;\
+    void testcase::Instance::test_method()
+
+// define an in-thread test case without a fixture
+#define TEST_CASE(test_name) FIXTURE_TEST_CASE(test_name, ncbi::NK::Empty)
+
+// define an out-of-thread test case with a fixture, expected exit code, and a timeout (in seconds)
+#define PROCESS_FIXTURE_TEST_CASE(testcase, F, rc, timeout) \
+    DEFINE_TEST_CASE(testcase, F, rc, timeout) \
+    static testcase::ProcessInvoker testcase##Invoker;\
+    void testcase::Instance::test_method()
+
+// define an out-of-thread test case with an expected exit code and a timeout (in seconds), no fixture
+#define PROCESS_TEST_CASE(test_name, rc, timeout) PROCESS_FIXTURE_TEST_CASE(test_name, ncbi::NK::Empty, rc, timeout)
+
+// fix param type
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+#define DECLARE_EXTERN_C_ENTRYPOINTS                             \
+    extern "C"                                                   \
+    {                                                            \
+        rc_t CC UsageSummary ( const char *progname )            \
+        { return ncbi::NK::TestEnv::UsageSummary ( progname ); } \
+                                                                 \
+        rc_t CC Usage ( const Args *args )                       \
+        { return ncbi::NK::TestEnv::Usage ( args ); }            \
+    }
+#else
+#define DECLARE_EXTERN_C_ENTRYPOINTS
+#endif
+
+// define a suite of test cases with a global fixture 
+// Note: Typed access to global fixture from the test cases' code is not currently implemented
+#define FIXTURE_TEST_SUITE( suite_name, F ) \
+DECLARE_EXTERN_C_ENTRYPOINTS \
+typedef F AUTO_TEST_CASE_FIXTURE; \
+int suite_name(int argc, char* argv[]) { \
+    try { \
+        ncbi::NK::TestEnv args(argc, argv); \
+        if (args.catch_system_errors) { \
+            args.set_handlers(); \
+        } \
+    } catch (...) { return 1; } \
+    ncbi::NK::counter_t ec = ncbi::NK::Main<AUTO_TEST_CASE_FIXTURE>(argc, argv, #suite_name); \
+    return ec == 0 ? 0 : -ec; /* positive rc represents the signal that killed the process */ \
+} 
+
+// define a suite of test cases with a global fixture
+// with callback to handle application command line arguments
+#define FIXTURE_TEST_SUITE_WITH_ARGS_HANDLER( suite_name, F, Handler ) \
+DECLARE_EXTERN_C_ENTRYPOINTS \
+typedef F AUTO_TEST_CASE_FIXTURE; \
+int suite_name(int argc, char* argv[]) { \
+    try { \
+        ncbi::NK::TestEnv args(argc, argv, Handler); \
+        if (args.catch_system_errors) { \
+            args.set_handlers(); \
+        } \
+    } catch (...) { return 1; } \
+    ncbi::NK::counter_t ec = ncbi::NK::Main<AUTO_TEST_CASE_FIXTURE>(argc, argv, #suite_name); \
+    return ec == 0 ? 0 : -ec; /* positive rc represents the signal that killed the process */ \
+}
+
+// define a suite of test cases with a global fixture; command line parsing, Usage and UsageSummary functions are supplied by the user's code
+#define FIXTURE_TEST_SUITE_WITH_USAGE( suite_name, F ) \
+typedef F AUTO_TEST_CASE_FIXTURE; \
+int suite_name(int argc, char* argv[]) { \
+    try { \
+        ncbi::NK::TestEnv args(argc, argv); \
+        if (args.catch_system_errors) { \
+            args.set_handlers(); \
+        } \
+    } catch (...) { return 1; } \
+    ncbi::NK::counter_t ec = ncbi::NK::Main<AUTO_TEST_CASE_FIXTURE>(argc, argv, #suite_name); \
+    return ec == 0 ? 0 : -ec; /* positive rc represents the signal that killed the process */ \
+} 
+
+#define TEST_SUITE( suite_name ) FIXTURE_TEST_SUITE(suite_name, ncbi::NK::Empty)
+#define TEST_SUITE_WITH_USAGE( suite_name ) FIXTURE_TEST_SUITE_WITH_USAGE(suite_name, ncbi::NK::Empty)
+#define TEST_SUITE_WITH_ARGS_HANDLER( suite_name, Handler ) FIXTURE_TEST_SUITE_WITH_ARGS_HANDLER(suite_name, ncbi::NK::Empty, Handler)
+
+#endif// _h_ktst_unit_test_
diff --git a/interfaces/ktst/unit_test_suite.hpp b/interfaces/ktst/unit_test_suite.hpp
new file mode 100644
index 0000000..88e686e
--- /dev/null
+++ b/interfaces/ktst/unit_test_suite.hpp
@@ -0,0 +1,515 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef NCBI_NK_UNIT_TEST__SUITE_HPP
+#define NCBI_NK_UNIT_TEST__SUITE_HPP
+
+// turn on INT64_C, UINT64_C etc.
+#define __STDC_CONSTANT_MACROS
+#include <klib/defs.h>
+#undef memcpy
+
+#include <string>
+#include <vector>
+#include <cassert>
+#include <iostream>
+#include <stdexcept>
+
+// it's generally a bad idea to make the test suite rely upon code under test
+#define ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED 0
+
+////////////////////////////////////////////////////////////////////////////////
+// these macros are available outside of test cases' code
+
+#define LOG(log_level, msg) \
+    (log_level >= ncbi::NK::TestEnv::verbosity ? (std::cerr << msg) : std::cerr)
+
+/*#define TESTMESSAGE(M) \
+{ ncbi::NK::saveLocation(__FILE__,__LINE__); \
+    LOG(ncbi::NK::LogLevel::e_message, M); }*/
+
+#define TEST_MESSAGE(M) \
+{ ncbi::NK::saveLocation(__FILE__,__LINE__); \
+    LOG(ncbi::NK::LogLevel::e_message, M << std::endl); }
+
+#define TEST_CHECKPOINT(M) TEST_MESSAGE(M)
+
+// report failure from a fixture
+#define FAIL( msg_ )     \
+      ncbi::NK::_REPORT_CRITICAL_ERROR_( (msg_), __FILE__, __LINE__, true )
+
+#define GET_TEST_SUITE ncbi::NK::GetTestSuite
+
+#define REQUIRE_THROW(code) \
+    do {   \
+        bool threw = false; \
+        try { code; } catch(...) { threw = true; } \
+        if (!threw) FAIL("expected exception not thrown"); \
+    } while (0)
+
+#define THROW_ON_RC(call) \
+    do { \
+        if ( ( rc_t ) ( call ) != ( rc_t ) 0 ) \
+            throw std::logic_error ( std::string ( __func__ ) + #call + " failed" ); \
+    } while (0)
+   
+////////////////////////////////////////////////////////////////////////////////
+
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+struct Args;
+#endif
+
+namespace ncbi { namespace NK { 
+
+typedef int counter_t; 
+
+class Empty {};
+
+class execution_aborted {};
+
+class LogLevel {
+public:
+    enum E {
+        e_undefined,
+        e_all,
+        e_test_suite,
+        e_message,
+        e_warning,
+        e_error,
+        e_fatal_error,
+        e_nothing
+    };
+};
+
+extern void saveLocation(const char* file, int line);
+extern void _REPORT_CRITICAL_ERROR_(const std::string& msg, const char* file, int line, bool is_msg);
+
+template<class T> const T abs(const T& a) { return a >= 0 ? a : -a; }
+
+class TestCase;
+
+class TestEnv {
+public:
+    typedef rc_t ArgsHandler(int argc, char* argv[]);
+
+    TestEnv(int argc, char* argv[], ArgsHandler *argsHandler = NULL);
+    ~TestEnv(void);
+
+    static void set_handlers(void);
+
+    static std::string lastLocation;
+    static LogLevel::E verbosity;
+    static bool verbositySet;
+    bool catch_system_errors;
+
+    static int RunProcessTestCase(TestCase&, void(TestCase::*)(), int);
+    
+    // Sleep functions return false if sleep was interrupted
+    static bool Sleep(unsigned int seconds);
+    static bool SleepMs(unsigned int milliseconds);
+    
+    static const int TEST_CASE_TIMED_OUT=14;
+    static const int TEST_CASE_FAILED=255;
+
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+    static struct Args* GetArgs() { return args; }
+#endif
+
+    static rc_t UsageSummary(const char* progname);
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+    static rc_t Usage(const Args* args);
+#else
+    static rc_t Usage(const char *progname);
+#endif
+
+    static bool in_child_process;
+    static std::string GetPidString();
+    
+    static std::string FormatLocation(const std::string& p_file, uint64_t p_line);
+
+    static void SetVerbosity(LogLevel::E v)
+    {   verbosity = v; verbositySet = true; }
+
+private:
+    static void TermHandler();
+
+    static void SigHandler(int sig);
+
+    rc_t process_args(int argc, char* argv[], ArgsHandler* argsHandler);
+
+    int argc2;
+    char** argv2;
+
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+    static struct Args* args;
+#endif
+};
+
+class TestCase {
+    void Init(const char* name);
+
+public:
+    typedef void ( TestCase ::* TestMethod ) ();
+
+protected:
+    TestCase(const std::string &name) { Init(name.c_str()); }
+    TestCase(const char* name)        { Init(name); }
+
+public:    
+    // explicit destruction, to be used before calling exit() in out-of-process test runner
+    virtual void clear() {}
+
+public:
+    ncbi::NK::counter_t GetErrorCounter(void) { return _ec; }
+    const char* GetName(void) const { return _name; }
+    void ErrorCounterAdd(ncbi::NK::counter_t ec) { _ec += ec; }
+
+protected:
+    void report_error(const char* msg, const char* file, int line, bool is_msg = false, bool isCritical = false);
+
+    void report_passed(const char* msg, const char* file, int line);
+
+    template<class T1>
+    void report_error2(const char* e1, const char* e2, T1 t1, T1 t2,
+        const char* file, int line, const char* eq, const char* ne,
+        bool isCritical = false)
+    {
+        ncbi::NK::saveLocation(file, line);
+        ++_ec;
+        LOG(LogLevel::e_error, TestEnv::FormatLocation(file, line));
+        if (isCritical) {
+            LOG(LogLevel::e_error, "fatal ");
+        }
+        LOG(LogLevel::e_error, "error in \"" << _name << "\": ");
+        if (isCritical) {
+            LOG(LogLevel::e_error, "critical ");
+        }
+        LOG(LogLevel::e_error, "check " << e1 << " " << eq << " " << e2
+            << " failed [" << t1 << " " << ne << " " << t2 << "]");
+        LOG(LogLevel::e_error, std::endl);
+        if (isCritical)
+        { throw ncbi::NK::execution_aborted(); }
+    }
+    // pointers reported as ints (otherwise << may crash if given an invalid pointer)
+    template<class T1>
+    void report_error2(const char* e1, const char* e2, const T1* t1, const T1* t2,
+        const char* file, int line, const char* eq, const char* ne,
+        bool isCritical = false)
+    {
+        report_error2(e1, e2, (uint64_t)t1, (uint64_t)t2,file, line, eq, ne,isCritical);
+    }
+    template<class T1>
+    void report_error2(const char* e1, const char* e2, T1* t1, T1* t2,
+        const char* file, int line, const char* eq, const char* ne,
+        bool isCritical = false)
+    {
+        report_error2(e1, e2, (uint64_t)t1, (uint64_t)t2,file, line, eq, ne,isCritical);
+    }
+
+
+    template<class T1, class T2>
+    void report_passed2(const char* e1, const char* e2,
+        const T1& t1, const T2& t2,
+        const char* file, int line, const char* eq, const char* ne)
+    {
+        ncbi::NK::saveLocation(file, line);
+        LOG(LogLevel::e_all, file << "(" << line << "): info: "
+            "check " << e1 << " " << eq << " " << e2 << " passed" << std::endl);
+    }
+
+    template<class T1, class T2, class T3>
+    void report_passed_close(const char* e1, const char* e2,
+        const T1& t1, const T2& t2, const T3& tolerance,
+        const char* file, int line)
+    {
+        ncbi::NK::saveLocation(file, line);
+        LOG(LogLevel::e_all, file << "(" << line << "): "
+            "info: difference between "
+            << e1 << "{" << t1 << "} and " << e2 << "{" << t2 << "} "
+            "doesn't exceed " << tolerance << std::endl);
+    }
+
+    template<class T1, class T2, class T3, class T4>
+    void report_error_close(const char* e1, const char* e2,
+        const T1& t1, const T2& t2, const T3& tolerance, const T4& diff,
+        const char* file, int line, bool isCritical = false)
+    {
+        ncbi::NK::saveLocation(file, line);
+        ++_ec;
+        LOG(LogLevel::e_error, file << "(" << line << "): ");
+        if (isCritical) {
+            LOG(LogLevel::e_error, "fatal ");
+        }
+        LOG(LogLevel::e_error, "error in \"" << _name << "\": "
+            "difference{" << diff << "} between "
+            << e1 << "{" << t1 << "} and " << e2 << "{" << t2 << "} "
+            "exceeds " << tolerance << std::endl);
+        if (isCritical)
+        { throw ncbi::NK::execution_aborted(); }
+    }
+
+    void _REPORT_CRITICAL_ERROR_(const std::string& msg, const char* file, int line, bool is_msg = false);
+
+#define CHECK(exp)       \
+  ( (exp)                      \
+      ? report_passed((#exp), __FILE__, __LINE__) \
+      : report_error ((#exp), __FILE__, __LINE__) )
+
+#define REPORT_ERROR(exp)       \
+        report_error (exp, __FILE__, __LINE__)
+
+/* TODO #define CHECK_MESSAGE(exp, M)       \
+  std::ostringstream s, s << M, \
+  ( (exp)                      \
+      ? report_passed(s.str(),__FILE__,__LINE__) \
+      : report_error (s.str(),__FILE__,__LINE__) )*/
+
+#define REQUIRE(exp)     \
+  ( (exp)                      \
+      ? report_passed        ((#exp), __FILE__, __LINE__) \
+      : _REPORT_CRITICAL_ERROR_((#exp), __FILE__, __LINE__) )
+
+#define CHECK_CLOSE(left, right, tolerance) \
+( (ncbi::NK::abs((left) - (right)) < (tolerance)) \
+?report_passed_close(#left,#right,(left),(right),(tolerance),__FILE__,__LINE__)\
+: report_error_close(#left,#right,(left),(right),(tolerance), \
+    ncbi::NK::abs((left) - (right)), __FILE__, __LINE__) )
+
+#define REQUIRE_CLOSE(left, right, tolerance) \
+( (ncbi::NK::abs((left) - (right)) < (tolerance)) \
+?report_passed_close(#left,#right,(left),(right),(tolerance),__FILE__,__LINE__)\
+: report_error_close(#left,#right,(left),(right),(tolerance), \
+    ncbi::NK::abs((left) - (right)), __FILE__, __LINE__, true) )
+
+    template<class T>
+    void AssertEqual(const T& e1, const T& e2, const char* e1str, const char* e2str, const char* file, unsigned int line, bool critical=false)
+    {
+        if (e1 == e2)
+        {
+            report_passed2(e1str, e2str, e1, e2, file, line, "==", "!=");
+        }
+        else
+        {
+            report_error2 (e1str, e2str, e1, e2, file, line, "==", "!=", critical);
+        }
+    }
+#define CHECK_EQUAL(e1, e2)     AssertEqual((e1),(e2),#e1,#e2,__FILE__,__LINE__, false)
+#define CHECK_EQ(e1, e2)        CHECK_EQUAL(e1,e2)
+#define REQUIRE_EQUAL(e1, e2)   AssertEqual((e1),(e2),#e1,#e2,__FILE__,__LINE__, true)
+#define REQUIRE_EQ(e1, e2)      REQUIRE_EQUAL(e1,e2)
+
+    template<class T>
+    void AssertNotEqual(const T& e1, const T& e2, const char* e1str, const char* e2str, const char* file, unsigned int line, bool critical=false)
+    {
+        if (e1 != e2)
+        {
+            report_passed2(e1str, e2str, e1, e2, file, line, "!=", "==");
+        }
+        else
+        {
+            report_error2 (e1str, e2str, e1, e2, file, line, "!=", "==", critical);
+        }
+    }
+#define CHECK_NE(e1, e2)     AssertNotEqual((e1),(e2),#e1,#e2,__FILE__,__LINE__, false)
+#define REQUIRE_NE(e1, e2)   AssertNotEqual((e1),(e2),#e1,#e2,__FILE__,__LINE__, true)
+
+    template<class T>
+    void AssertGreaterOrEqual(const T& e1, const T& e2, const char* e1str, const char* e2str, const char* file, unsigned int line, bool critical=false)
+    {
+        if (e1 >= e2)
+        {
+            report_passed2(e1str, e2str, e1, e2, file, line, ">=", "<");
+        }
+        else
+        {
+            report_error2 (e1str, e2str, e1, e2, file, line, ">=", "<", critical);
+        }
+    }
+#define CHECK_GE(e1, e2)    AssertGreaterOrEqual((e1),(e2),#e1,#e2,__FILE__,__LINE__, false)
+#define REQUIRE_GE(e1, e2)  AssertGreaterOrEqual((e1),(e2),#e1,#e2,__FILE__,__LINE__, true)
+
+    template<class T>
+    void AssertGreater(const T& e1, const T& e2, const char* e1str, const char* e2str, const char* file, unsigned int line, bool critical=false)
+    {
+        if (e1 > e2)
+        {
+            report_passed2(e1str, e2str, e1, e2, file, line, ">", "<=");
+        }
+        else
+        {
+            report_error2 (e1str, e2str, e1, e2, file, line, ">", "<=", critical);
+        }
+    }
+#define CHECK_GT(e1, e2)    AssertGreater((e1),(e2),#e1,#e2,__FILE__,__LINE__, false)
+#define REQUIRE_GT(e1, e2)  AssertGreater((e1),(e2),#e1,#e2,__FILE__,__LINE__, true)
+
+    template<class T>
+    void AssertLessOrEqual(const T& e1, const T& e2, const char* e1str, const char* e2str, const char* file, unsigned int line, bool critical=false)
+    {
+        if (e1 <= e2)
+        {
+            report_passed2(e1str, e2str, e1, e2, file, line, "<=", ">");
+        }
+        else
+        {
+            report_error2 (e1str, e2str, e1, e2, file, line, "<=", ">", critical);
+        }
+    }
+#define CHECK_LE(e1, e2)    AssertLessOrEqual((e1),(e2),#e1,#e2,__FILE__,__LINE__, false)
+#define REQUIRE_LE(e1, e2)  AssertLessOrEqual((e1),(e2),#e1,#e2,__FILE__,__LINE__, true)
+
+    template<class T>
+    void AssertLess(const T& e1, const T& e2, const char* e1str, const char* e2str, const char* file, unsigned int line, bool critical=false)
+    {
+        if (e1 < e2)
+        {
+            report_passed2(e1str, e2str, e1, e2, file, line, "<", ">=");
+        }
+        else
+        {
+            report_error2 (e1str, e2str, e1, e2, file, line, "<", ">=", critical);
+        }
+    }
+#define CHECK_LT(e1, e2)    AssertLess((e1),(e2),#e1,#e2,__FILE__,__LINE__, false)
+#define REQUIRE_LT(e1, e2)  AssertLess((e1),(e2),#e1,#e2,__FILE__,__LINE__, true)
+
+    void report_rc(rc_t rc, const char* callStr, const char* file, int line, int successExpected, bool isCritical = false);
+
+#define CHECK_RC(exp)   report_rc((exp), #exp, __FILE__, __LINE__, true, false)
+#define REQUIRE_RC(exp) report_rc((exp), #exp, __FILE__, __LINE__, true, true)
+#define CHECK_RC_FAIL(exp)   report_rc((exp), #exp, __FILE__, __LINE__, false, false)
+#define REQUIRE_RC_FAIL(exp) report_rc((exp), #exp, __FILE__, __LINE__, false, true)
+
+    template<class T>
+    void AssertNull(const T* e1, const char* e1str,const char* file, unsigned int line, bool critical=false)
+    {
+        if (e1 == 0)
+        {
+            report_passed2(e1str, "NULL", e1, (const T*)0, file, line, "==", "!=");
+        }
+        else
+        {
+            report_error2 (e1str, "NULL", e1, (const T*)0, file, line, "==", "!=", critical);
+        }
+    }
+#define CHECK_NULL(e1)   AssertNull((e1), #e1, __FILE__,__LINE__, false)
+#define REQUIRE_NULL(e1) AssertNull((e1), #e1, __FILE__,__LINE__, true)
+
+    template<class T>
+    void AssertNotNull(const T* e1, const char* e1str,const char* file, unsigned int line, bool critical=false)
+    {
+        if (e1 != 0)
+        {
+            report_passed2(e1str, "NULL", e1, (const T*)0, file, line, "!=", "==");
+        }
+        else
+        {
+            report_error2 (e1str, "NULL", e1, (const T*)0, file, line, "!=", "==", critical);
+        }
+    }
+#define CHECK_NOT_NULL(e1)   AssertNotNull((e1), #e1, __FILE__,__LINE__, false)
+#define REQUIRE_NOT_NULL(e1) AssertNotNull((e1), #e1, __FILE__,__LINE__, true)
+
+private:
+    const char* _name;
+    ncbi::NK::counter_t _ec;
+};
+
+class TestInvoker {
+protected:
+    TestInvoker(const std::string& name) : _name(name), _ec(0) {}
+    virtual ~TestInvoker(void) {}
+public:
+    virtual void Run(void* globalFixtute) throw () = 0;
+    const std::string& GetName(void) const { return _name; }
+    ncbi::NK::counter_t GetErrorCounter(void) { return _ec; }
+protected:
+    void SetErrorCounter(ncbi::NK::counter_t ec)
+    { _ec = ec; }
+private:
+    const std::string _name;
+    ncbi::NK::counter_t _ec;
+};
+
+class TestRunner {
+    typedef std::vector<ncbi::NK::TestInvoker*> T;
+    typedef T::const_iterator TCI;
+
+public:
+    TestRunner();
+
+    int    argc;
+    char** argv;
+
+    void ReportTestNumber(void);
+    void SetArgs(int argc, char* argv[]);
+    void Add(ncbi::NK::TestInvoker* t);
+    counter_t Run(void* globalFixtute) const throw ();
+
+private:
+    T _cases;
+};
+
+extern ncbi::NK::TestRunner* GetTestSuite();
+
+template<class TFixture>
+ncbi::NK::counter_t Main(int argc, char* argv[],
+                         const char* suite_name)
+{
+    ncbi::NK::counter_t ec = 0;
+    ncbi::NK::TestRunner* t = ncbi::NK::GetTestSuite();
+    assert(t);
+    t->SetArgs(argc, argv);
+    t->ReportTestNumber();
+
+    TFixture globalFixtute;
+    LOG(ncbi::NK::LogLevel::e_test_suite,
+        "Entering test suite \"" << suite_name << "\"\n");
+    ec = t->Run(&globalFixtute);
+    LOG(ncbi::NK::LogLevel::e_test_suite,
+        "Leaving test suite \"" << suite_name << "\"\n");
+
+    switch (ec) 
+    {
+        case 0:
+          LOG(ncbi::NK::LogLevel::e_nothing, "\n*** No errors detected\n");
+          break;
+        case 1:
+          LOG(ncbi::NK::LogLevel::e_nothing, "\n*** " << ec <<
+           " failure detected in test suite \"" << suite_name << "\"\n");
+          break;
+        default:
+          LOG(ncbi::NK::LogLevel::e_nothing, "\n*** " << ec <<
+           " failures detected in test suite \"" << suite_name << "\"\n");
+          break;
+    }
+    return ec;
+}
+
+} } // namespace ncbi::NK
+
+
+#endif// NCBI_NK_UNIT_TEST__SUITE_HPP
diff --git a/interfaces/kxml/xml.h b/interfaces/kxml/xml.h
new file mode 100644
index 0000000..2f42564
--- /dev/null
+++ b/interfaces/kxml/xml.h
@@ -0,0 +1,382 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kxml_xml_
+#define _h_kxml_xml_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#include <klib/defs.h>
+
+#include <stdarg.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct KNamelist;
+struct KXMLNodeset;
+
+
+/*--------------------------------------------------------------------------
+ * XML node
+ */
+typedef struct KXMLNode KXMLNode;
+
+/* AddRef
+ * Release
+ */
+KLIB_EXTERN rc_t CC KXMLNodeAddRef ( const KXMLNode *self );
+KLIB_EXTERN rc_t CC KXMLNodeRelease ( const KXMLNode *self );
+
+/* GetName
+ * Get node path from parent nodeset
+ */
+KLIB_EXTERN rc_t CC KXMLNodeGetName ( const KXMLNode *self, const char **name );
+
+/* Get element name (tag)
+ */
+KLIB_EXTERN rc_t CC KXMLNodeElementName ( const KXMLNode *self, const char **name );
+
+/* Read
+ */
+KLIB_EXTERN rc_t CC KXMLNodeRead ( const KXMLNode *self,
+    size_t offset, void *buffer, size_t size,
+    size_t *num_read, size_t *remaining );
+
+/* Write
+ */
+KLIB_EXTERN rc_t CC KXMLNodeWrite ( KXMLNode *self,
+    size_t offset, const void *buffer, size_t size );
+
+/* Append
+ */
+KLIB_EXTERN rc_t CC KXMLNodeAppend ( KXMLNode *self,
+    const void *buffer, size_t bsize );
+
+
+/* ReadAs ( formatted )
+ *  reads as integer or float value in native byte order
+ *  casts smaller-sized values to desired size, e.g.
+ *    uint32_t to uint64_t
+ *
+ *  "i" [ OUT ] - return parameter for signed integer
+ *  "u" [ OUT ] - return parameter for unsigned integer
+ *  "f" [ OUT ] - return parameter for double float
+ */
+KLIB_EXTERN rc_t CC KXMLNodeReadAsI16 ( const KXMLNode *self, int16_t *i );
+KLIB_EXTERN rc_t CC KXMLNodeReadAsU16 ( const KXMLNode *self, uint16_t *u );
+KLIB_EXTERN rc_t CC KXMLNodeReadAsI32 ( const KXMLNode *self, int32_t *i );
+KLIB_EXTERN rc_t CC KXMLNodeReadAsU32 ( const KXMLNode *self, uint32_t *u );
+KLIB_EXTERN rc_t CC KXMLNodeReadAsI64 ( const KXMLNode *self, int64_t *i );
+KLIB_EXTERN rc_t CC KXMLNodeReadAsU64 ( const KXMLNode *self, uint64_t *u );
+KLIB_EXTERN rc_t CC KXMLNodeReadAsF64 ( const KXMLNode *self, double *f );
+
+
+/* ReadCString ( formatted )
+ *  reads as C-string
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated string.
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+KLIB_EXTERN rc_t CC KXMLNodeReadCString ( const KXMLNode *self,
+    char *buffer, size_t bsize, size_t *size );
+
+/* ReadCStr
+ *  reads node value as C-string
+ *
+ *  "str" [ IN ] - returned pointer to a NULL terminated string.
+ *                 Caller responsible to dealloc (free)!
+ *  "default_value" [IN] - default value used in case node value is empty, NULL - none
+ */
+KLIB_EXTERN rc_t CC KXMLNodeReadCStr( const KXMLNode *self, char** str, const char* default_value );
+
+/* Write ( formatted )
+ *  writes string
+ *
+ *  "str" [ IN ] - NULL terminated string.
+ */
+KLIB_EXTERN rc_t CC KXMLNodeWriteCString ( KXMLNode *self, const char *str );
+
+
+/* OpenNodesetRead
+ *
+ * NB. OpenNodesetRead could return Nodeset with 0 elements.
+ *  To make sure the node exists you should verify that (KXMLNodesetCount > 0)
+ */
+KLIB_EXTERN rc_t CC KXMLNodeOpenNodesetRead ( const KXMLNode *self,
+    struct KXMLNodeset const **ns, const char *path, ... );
+KLIB_EXTERN rc_t CC KXMLNodeVOpenNodesetRead ( const KXMLNode *self,
+    struct KXMLNodeset const **ns, const char *path, va_list args );
+
+/* OpenNodesetUpdate
+ */
+KLIB_EXTERN rc_t CC KXMLNodeOpenNodesetUpdate ( KXMLNode *self,
+    struct KXMLNodeset **ns, const char *path, ... );
+KLIB_EXTERN rc_t CC KXMLNodeVOpenNodesetUpdate ( KXMLNode *self,
+    struct KXMLNodeset **ns, const char *path, va_list args );
+
+/* ReadAttr
+ */
+KLIB_EXTERN rc_t CC KXMLNodeReadAttr ( const KXMLNode *self,
+     const char *attr, void *buffer, size_t bsize,
+     size_t *num_read, size_t *remaining );
+
+/* WriteAttr
+ */
+KLIB_EXTERN rc_t CC KXMLNodeWriteAttr ( KXMLNode *self,
+     const char *attr, const void *buffer, size_t size );
+
+
+/* ReadAttrAs ( formatted )
+ *  reads as integer or float value in native byte order
+ *  casts smaller-sized values to desired size, e.g.
+ *    uint32_t to uint64_t
+ *
+ *  "i" [ OUT ] - return parameter for signed integer
+ *  "u" [ OUT ] - return parameter for unsigned integer
+ *  "f" [ OUT ] - return parameter for double float
+ */
+KLIB_EXTERN rc_t CC KXMLNodeReadAttrAsI16 ( const KXMLNode *self, const char *attr, int16_t *i );
+KLIB_EXTERN rc_t CC KXMLNodeReadAttrAsU16 ( const KXMLNode *self, const char *attr, uint16_t *u );
+KLIB_EXTERN rc_t CC KXMLNodeReadAttrAsI32 ( const KXMLNode *self, const char *attr, int32_t *i );
+KLIB_EXTERN rc_t CC KXMLNodeReadAttrAsU32 ( const KXMLNode *self, const char *attr, uint32_t *u );
+KLIB_EXTERN rc_t CC KXMLNodeReadAttrAsI64 ( const KXMLNode *self, const char *attr, int64_t *i );
+KLIB_EXTERN rc_t CC KXMLNodeReadAttrAsU64 ( const KXMLNode *self, const char *attr, uint64_t *u );
+KLIB_EXTERN rc_t CC KXMLNodeReadAttrAsF64 ( const KXMLNode *self, const char *attr, double *f );
+
+
+/* ReadAttrCString ( formatted )
+ *  reads as C-string
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated string.
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+KLIB_EXTERN rc_t CC KXMLNodeReadAttrCString ( const KXMLNode *self, const char *attr,
+    char *buffer, size_t bsize, size_t *size );
+
+/* ReadAttrCStr
+ *  reads attribute as C-string
+ *
+ *  "str" [ IN ] - returned pointer to a NULL terminated string.
+ *                 Caller responsible to dealloc (free)!
+ *  "default_value" [IN] - default value used in case node value is empty, NULL - none
+ */
+KLIB_EXTERN rc_t CC KXMLNodeReadAttrCStr( const KXMLNode *self, const char *attr, char** str, const char* default_value);
+
+/* CountChildNodes
+ *  count child nodes
+ */
+KLIB_EXTERN rc_t CC KXMLNodeCountChildNodes(const KXMLNode *self,
+    uint32_t *count);
+
+/* GetNodeRead
+ *  access indexed node
+ *  "idx" [ IN ] - a zero-based index
+ */
+KLIB_EXTERN rc_t CC KXMLNodeGetNodeRead ( const KXMLNode *self,
+    const KXMLNode **node, uint32_t idx );
+
+/* ListAttr
+ *  list all named attributes
+ */
+KLIB_EXTERN rc_t CC KXMLNodeListAttr ( const KXMLNode *self,
+    struct KNamelist const **names );
+
+/* ListChild
+ *  list all named children
+ */
+KLIB_EXTERN rc_t CC KXMLNodeListChild ( const KXMLNode *self,
+    struct KNamelist const **names );
+
+
+/* GetFirstChildNodeRead
+ *  Returns the first(with index 0) sub-node of self using path.
+ *  Is equivalent to:
+ *          KXMLNodeOpenNodesetRead(self, &nc, path, ...);
+ *          KXMLNodesetGetNodeRead(ns, node, 0);
+ *  It will return NotFound error if any node exists
+ */
+KLIB_EXTERN rc_t CC KXMLNodeGetFirstChildNodeRead ( const KXMLNode *self,
+    const KXMLNode **node, const char *path, ... );
+KLIB_EXTERN rc_t CC KXMLNodeVGetFirstChildNodeRead ( const KXMLNode *self,
+    const KXMLNode **node, const char *path, va_list args );
+
+
+/*--------------------------------------------------------------------------
+ * XML node set
+ */
+typedef struct KXMLNodeset KXMLNodeset;
+
+/* AddRef
+ * Release
+ */
+KLIB_EXTERN rc_t CC KXMLNodesetAddRef ( const KXMLNodeset *self );
+KLIB_EXTERN rc_t CC KXMLNodesetRelease ( const KXMLNodeset *self );
+
+/* Count
+ *  retrieve the number of nodes in set
+ */
+KLIB_EXTERN rc_t CC KXMLNodesetCount ( const KXMLNodeset *self, uint32_t *count );
+
+/* GetNode
+ *  access indexed node
+ *  "idx" [ IN ] - a zero-based index
+ */
+KLIB_EXTERN rc_t CC KXMLNodesetGetNodeRead ( const KXMLNodeset *self,
+    const KXMLNode **node, uint32_t idx );
+
+
+/*--------------------------------------------------------------------------
+ * XML document
+ */
+typedef struct KXMLDoc KXMLDoc;
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KLIB_EXTERN rc_t CC KXMLDocAddRef ( const KXMLDoc *self );
+KLIB_EXTERN rc_t CC KXMLDocRelease ( const KXMLDoc *self );
+
+/* OpenNodesetRead
+ *  opens a node set with given path
+ */
+KLIB_EXTERN rc_t CC KXMLDocOpenNodesetRead ( const KXMLDoc *self,
+    const KXMLNodeset **ns, const char *path, ... );
+KLIB_EXTERN rc_t CC KXMLDocVOpenNodesetRead ( const KXMLDoc *self,
+    const KXMLNodeset **ns, const char *path, va_list args );
+
+/* OpenNodesetUpdate
+ *  opens a node set with given path
+ */
+KLIB_EXTERN rc_t CC KXMLDocOpenNodesetUpdate ( KXMLDoc *self,
+    KXMLNodeset **ns, const char *path, ... );
+KLIB_EXTERN rc_t CC KXMLDocVOpenNodesetUpdate ( KXMLDoc *self,
+    KXMLNodeset **ns, const char *path, va_list args );
+
+
+/*--------------------------------------------------------------------------
+ * XML manager
+ */
+typedef struct KXMLMgr KXMLMgr;
+
+/* Make
+ *  make an XML manager object
+ */
+KLIB_EXTERN rc_t CC KXMLMgrMakeRead ( const KXMLMgr **mgr );
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KLIB_EXTERN rc_t CC KXMLMgrAddRef ( const KXMLMgr *self );
+KLIB_EXTERN rc_t CC KXMLMgrRelease ( const KXMLMgr *self );
+
+/* MakeDoc
+ *  create a document object from source file
+ */
+KLIB_EXTERN rc_t CC KXMLMgrMakeDocRead ( const KXMLMgr *self,
+    const KXMLDoc **doc, struct KFile const *src );
+
+/* MakeDoc
+ *  create a document object from memory
+ */
+KLIB_EXTERN rc_t KXMLMgrMakeDocReadFromMemory ( const KXMLMgr *self,
+    const KXMLDoc **result, const char* buffer, uint64_t size );
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ *  this will probably be relocated later on
+ */
+struct KDirectory;
+struct KFile;
+struct String;
+struct VFSManager;
+struct VPath;
+
+/* OpenXTocDirRead
+ *  open copycat XML as a chroot'd directory
+ *  XML data comes from a KFile in this case
+ *
+ *  "dir" [ OUT ] - return parameter for directory object
+ *
+ *  "base_path" [ IN ] - NUL terminated string giving the path
+ *   of the new directory relative to "self". NB - can be absolute
+ *   or relative, but is always interpreted by "self".
+ *
+ *  "xml" [ IN ] - file containing XML data produced by copycat tool
+ */
+rc_t CC KDirectoryOpenXTocDirRead (const struct KDirectory * self,
+                                   const struct KDirectory ** pnew_dir,
+                                   bool chroot,
+                                   const struct KFile * xml,
+                                   const char * path, ... );
+rc_t CC KDirectoryVOpenXTocDirRead (const struct KDirectory * self,
+                                    const struct KDirectory ** pnew_dir,
+                                    bool chroot,
+                                    const struct KFile * xml,
+                                    const char * _path,
+                                    va_list args );
+rc_t CC KDirectoryOpenXTocDirRead (const struct KDirectory * self,
+                                   const struct KDirectory ** pnew_dir,
+                                   bool chroot,
+                                   const struct KFile * xml,
+                                   const char * path, ... );
+rc_t CC KDirectoryOpenXTocDirReadDir (const struct KDirectory * self,
+                                      const struct KDirectory ** pnew_dir,
+                                      const struct KFile * xml,
+                                      const struct String * spath);
+
+rc_t CC VFSManagerOpenXTocDirRead (const struct VFSManager * self,
+                                   const struct KDirectory ** pnew_dir,
+                                   const struct KFile * xml,
+                                   const struct VPath * path);
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kxml_xml_ */
diff --git a/interfaces/kxml/xml.hpp b/interfaces/kxml/xml.hpp
new file mode 100644
index 0000000..9d7ce11
--- /dev/null
+++ b/interfaces/kxml/xml.hpp
@@ -0,0 +1,198 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_klib_xml_
+#define _hpp_klib_xml_
+
+#ifndef _h_klib_xml_
+#include <kxml/xml.h>
+#endif
+
+/*--------------------------------------------------------------------------
+ * XML node
+ */
+struct KXMLNode
+{
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef ( void ) const
+    { return KXMLNodeAddRef ( this ); }
+    inline rc_t Release ( void ) const
+    { return KXMLNodeRelease ( this ); }
+
+    /* GetName
+     */
+    inline rc_t GetName ( const char **name ) const
+    { return KXMLNodeGetName ( this, name ); }
+
+    /* OpenNodesetRead
+     */
+    inline rc_t OpenNodesetRead ( struct KXMLNodeset const **ns,
+        const char *path, ... ) const
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t status = KXMLNodeVOpenNodesetRead ( this, ns, path, args );
+        va_end ( args );
+        return status;
+    }
+
+    /* ReadAttr
+     */
+    inline rc_t ReadAttr ( const char *attr, void *buffer, size_t bsize,
+         size_t *num_read, size_t *remaining ) const
+    {
+        return KXMLNodeReadAttr
+            ( this, attr, buffer, bsize, num_read, remaining );
+    }
+
+    /* CountNodes
+     *  count child nodes
+     */
+    inline rc_t CountChildNodes ( uint32_t *count ) const
+    { return KXMLNodeCountChildNodes ( this, count ); }
+
+    /* GetNodeRead
+     *  access indexed node
+     *  "idx" [ IN ] - a zero-based index
+     */
+    inline rc_t GetNodeRead ( const KXMLNode **node,
+        uint32_t idx ) const 
+    { return KXMLNodeGetNodeRead ( this, node, idx ); }
+
+    /* ListChild
+     *  list all named children
+     */
+    inline rc_t ListChild ( struct KNamelist const **names ) const
+    { return KXMLNodeListChild ( this, names ); }
+
+    inline rc_t GetFirstChildNodeRead ( const KXMLNode **node,
+        const char *path, ... ) const
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = KXMLNodeVGetFirstChildNodeRead ( this, node, path, args );
+        va_end ( args );
+        return rc;
+    }
+
+    inline rc_t Read ( int32_t *i ) const
+    { return KXMLNodeReadAsI32 ( this, i ); }
+
+    inline rc_t Read ( char *buffer, size_t bsize, size_t *size ) const
+    { return KXMLNodeReadCString ( this, buffer, bsize, size ); }
+
+    inline rc_t ReadAttr ( const char *attr, int32_t *i ) const 
+    { return KXMLNodeReadAttrAsI32 ( this, attr, i ); }
+
+    inline rc_t ReadAttr ( const char *attr,
+        char *buffer, size_t bsize, size_t *size ) const
+    { return KXMLNodeReadAttrCString ( this, attr, buffer, bsize, size ); }
+};
+
+/*--------------------------------------------------------------------------
+ * XML node set
+ */
+struct KXMLNodeset
+{
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef ( void ) const
+    { return KXMLNodesetAddRef ( this ); }
+    inline rc_t Release ( void ) const
+    { return KXMLNodesetRelease ( this ); }
+
+    /* Count
+     *  retrieve the number of nodes in set
+     */
+    inline rc_t Count ( uint32_t *count ) const
+    { return KXMLNodesetCount ( this, count ); }
+
+    /* GetNode
+     *  access indexed node
+     */
+    inline rc_t GetNodeRead ( const KXMLNode **node, uint32_t idx ) const
+    { return KXMLNodesetGetNodeRead ( this, node, idx ); }
+};
+
+/*--------------------------------------------------------------------------
+ * XML document
+ */
+struct KXMLDoc
+{
+    /* AddRef
+     * Release
+     *  ignores NULL references
+     */
+    inline rc_t AddRef ( void ) const
+    { return KXMLDocAddRef ( this ); }
+    inline rc_t Release ( void ) const
+    { return KXMLDocRelease ( this ); }
+
+    /* OpenNodesetRead
+     *  opens a node set with given path
+     */
+    inline rc_t OpenNodesetRead ( const KXMLNodeset **ns, const char *path, ... ) const
+    {
+        va_list args;
+        va_start ( args, path );
+        int status = KXMLDocVOpenNodesetRead ( this, ns, path, args );
+        va_end ( args );
+        return status;
+    }
+};
+
+/*--------------------------------------------------------------------------
+ * XML manager
+ */
+struct KXMLMgr
+{
+    /* Make
+     *  make an XML manager object
+     */
+    static inline rc_t MakeRead ( const KXMLMgr **mgr )
+    { return KXMLMgrMakeRead ( mgr ); }
+
+    /* AddRef
+     * Release
+     *  ignores NULL references
+     */
+    inline rc_t AddRef ( void ) const
+    { return KXMLMgrAddRef ( this ); }
+    inline rc_t Release ( void ) const
+    { return KXMLMgrRelease ( this ); }
+
+    /* MakeDoc
+     *  create a document object from source file
+     */
+    inline rc_t MakeDocRead ( const KXMLDoc **doc, struct KFile const *src ) const
+    { return KXMLMgrMakeDocRead ( this, doc, src ); }
+
+};
+
+#endif /* _hpp_klib_xml_ */
diff --git a/interfaces/loader/alignment-writer.h b/interfaces/loader/alignment-writer.h
new file mode 100644
index 0000000..5495c91
--- /dev/null
+++ b/interfaces/loader/alignment-writer.h
@@ -0,0 +1,108 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef BAM_LOAD_ALIGNMENT_WRITER_H_
+#define BAM_LOAD_ALIGNMENT_WRITER_H_ 1
+
+#include <klib/text.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <insdc/insdc.h>
+
+#include <align/writer-alignment.h>
+
+typedef struct AlignmentWriter AlignmentWriter;
+typedef struct AlignmentRecord AlignmentRecord;
+
+struct AlignmentRecord {
+    KDataBuffer buffer;
+    TableWriterAlgnData data;
+    int64_t alignId;
+    bool isPrimary;
+
+    INSDC_coord_one read_id;
+    int64_t ref_id;
+    INSDC_coord_zero ref_start;
+    uint64_t global_ref_start;
+    bool ref_orientation;
+    uint32_t mapq;
+    uint64_t tmp_key_id;
+
+    INSDC_coord_zero read_start;
+    INSDC_coord_len read_len;
+
+    bool mate_ref_orientation;
+    int64_t mate_ref_id;
+    INSDC_coord_zero mate_ref_pos;
+    int64_t mate_align_id;
+    int32_t template_len;
+};
+
+#define AR_REF_ID(X) ((X).ref_id)
+#define AR_REF_START(X) ((X).global_ref_start)
+#define AR_REF_LEN(X) ((X).ref_len)
+#define AR_REF_ORIENT(X) ((X).ref_orientation)
+#define AR_READNO(X) ((X).read_id)
+#define AR_MAPQ(X) ((X).mapq)
+#define AR_KEY(X) ((X).tmp_key_id)
+
+#define AR_BASECOUNT(X) ((X).data.has_mismatch.elements)
+#define AR_HAS_MISMATCH(X) ((bool *)((X).data.has_mismatch.buffer))
+#define AR_HAS_OFFSET(X) ((bool *)((X).data.has_ref_offset.buffer))
+
+#define AR_NUM_MISMATCH(X) ((X).data.mismatch.elements)
+#define AR_MISMATCH(X) ((char *)((X).data.mismatch.buffer))
+
+#define AR_NUM_MISMATCH_QUAL(X) ((X).data.mismatch_qual.elements)
+#define AR_MISMATCH_QUAL(X) ((uint8_t *)((X).data.mismatch_qual.buffer))
+
+#define AR_NUM_OFFSET(X) ((X).data.ref_offset.elements)
+#define AR_OFFSET(X) ((INSDC_coord_zero *)((X).data.ref_offset.buffer))
+#define AR_OFFSET_TYPE(X) ((uint8_t *)((X).data.ref_offset_type.buffer))
+
+AlignmentWriter *AlignmentMake(VDatabase *db);
+
+rc_t AlignmentWriteRecord(AlignmentWriter * const self, AlignmentRecord * const data, bool expectUnsorted);
+
+rc_t AlignmentStartUpdatingSpotIds(AlignmentWriter * const self);
+
+rc_t AlignmentGetSpotKey(AlignmentWriter * const self, uint64_t *keyId, int64_t *alignId, bool *isPrimary);
+
+rc_t AlignmentGetRefPos(AlignmentWriter *const self, int64_t row, ReferenceStart *const rslt);
+
+rc_t AlignmentUpdateInfo(AlignmentWriter *const self, int64_t const spotId,
+                         int64_t const mateId, ReferenceStart const *const mateRefPos);
+
+rc_t AlignmentWhack(AlignmentWriter * const self, bool const commit);
+
+rc_t AlignmentRecordInit(AlignmentRecord *self, unsigned readlen,
+                         bool expectUnsorted,
+                         bool hasMismatchQual
+                         );
+
+#endif
diff --git a/interfaces/loader/common-reader-priv.h b/interfaces/loader/common-reader-priv.h
new file mode 100644
index 0000000..26a8e19
--- /dev/null
+++ b/interfaces/loader/common-reader-priv.h
@@ -0,0 +1,300 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_common_reader_priv_
+#define _h_common_reader_priv_
+
+#include <loader/common-reader.h>
+
+#include <klib/refcount.h>
+#include <klib/text.h>
+#include <klib/data-buffer.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*TODO: add module rcLoader to rc.h? */
+#define RC_MODULE rcAlign
+
+/*--------------------------------------------------------------------------
+ ReaderFile
+ */
+#ifndef READERFILE_IMPL
+    #define READERFILE_IMPL struct ReaderFile
+#endif
+
+typedef struct ReaderFile_vt_v1_struct {
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t ( *destroy   )                 ( READERFILE_IMPL* self );
+    rc_t ( *getRecord )                 ( const READERFILE_IMPL *self, const Record** result );
+    float ( *getProportionalPosition )  ( const READERFILE_IMPL *self );
+    rc_t ( *getReferenceInfo )          ( const READERFILE_IMPL *self, const ReferenceInfo** result );
+    /* end minor version == 0 */
+
+} ReaderFile_vt_v1;
+
+typedef union ReaderFile_vt {
+    ReaderFile_vt_v1* v1;
+} ReaderFile_vt;
+
+struct ReaderFile
+{
+    ReaderFile_vt vt;
+    KRefcount refcount;
+    char* pathname;
+};
+
+/* Init
+ *  polymorphic parent constructor
+ */
+rc_t CC ReaderFileInit ( READERFILE_IMPL *self );
+
+/* Whack
+ *  destructor
+ */
+rc_t CC ReaderFileWhack ( ReaderFile *self );
+
+/*--------------------------------------------------------------------------
+ Record
+ */
+#ifndef RECORD_IMPL
+    #define RECORD_IMPL struct Record
+#endif
+
+typedef struct Record_vt_v1_struct {
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t ( *addRef  ) ( const RECORD_IMPL* self );
+    rc_t ( *release ) ( const RECORD_IMPL* self );
+    rc_t ( *getSequence  ) ( const RECORD_IMPL *self, const Sequence** result );
+    rc_t ( *getAlignment ) ( const RECORD_IMPL *self, const Alignment** result );
+    rc_t ( *getRejected  ) ( const RECORD_IMPL *self, const Rejected** result );
+    /* end minor version == 0 */
+
+} Record_vt_v1;
+
+typedef union Record_vt {
+    Record_vt_v1* v1;
+} Record_vt;
+
+struct Record
+{
+    Record_vt vt;
+};
+
+/*--------------------------------------------------------------------------
+ Sequence
+ */
+#ifndef SEQUENCE_IMPL
+    #define SEQUENCE_IMPL struct Sequence
+#endif
+
+typedef struct Sequence_vt_v1_struct {
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t ( *addRef  ) ( const SEQUENCE_IMPL* self );
+    rc_t ( *release ) ( const SEQUENCE_IMPL* self );
+
+    rc_t ( *getReadLength   )   ( const SEQUENCE_IMPL *self, uint32_t *length );
+    rc_t ( *getRead         )   ( const SEQUENCE_IMPL *self, char *sequence );
+    rc_t ( *getRead2        )   ( const SEQUENCE_IMPL *self, char *sequence, uint32_t start, uint32_t stop );
+    rc_t ( *getQuality      )   ( const SEQUENCE_IMPL *self, const int8_t **quality, uint8_t *offset, int *qualType );
+    rc_t ( *getSpotGroup    )   ( const SEQUENCE_IMPL *self, const char **name, size_t *length );
+    rc_t ( *getSpotName     )   ( const SEQUENCE_IMPL *self, const char **name, size_t *length );
+    bool ( *isColorSpace    )   ( const SEQUENCE_IMPL *self );
+    rc_t ( *getCSKey        )   ( const SEQUENCE_IMPL *self, char cskey[1] );
+    rc_t ( *getCSReadLength )   ( const SEQUENCE_IMPL *self, uint32_t *length );
+    rc_t ( *getCSRead       )   ( const SEQUENCE_IMPL *self, char *sequence );
+    rc_t ( *getCSQuality    )   ( const SEQUENCE_IMPL *self, const int8_t **quality, uint8_t *offset, int *qualType );
+                          
+    bool ( *wasPaired     )     ( const SEQUENCE_IMPL *self );
+    int  ( *orientationSelf )   ( const SEQUENCE_IMPL *self );
+    int  ( *orientationMate )   ( const SEQUENCE_IMPL *self );
+    bool ( *isFirst       )     ( const SEQUENCE_IMPL *self );
+    bool ( *isSecond      )     ( const SEQUENCE_IMPL *self );
+    bool ( *isDuplicate   )     ( const SEQUENCE_IMPL *self ); 
+    bool ( *isLowQuality   )    ( const SEQUENCE_IMPL *self ); 
+
+    rc_t ( *getTI ) ( const SEQUENCE_IMPL *self, uint64_t *ti );
+    
+    /* end minor version == 0 */
+
+} Sequence_vt_v1;
+
+typedef union Sequence_vt {
+    Sequence_vt_v1* v1;
+} Sequence_vt;
+
+struct Sequence
+{
+    Sequence_vt vt;
+};
+
+/*--------------------------------------------------------------------------
+ Alignment
+ */
+#ifndef ALIGNMENT_IMPL
+    #define ALIGNMENT_IMPL struct Alignment
+#endif
+
+typedef struct Alignment_vt_v1_struct {
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    
+    rc_t ( *addRef  ) ( const ALIGNMENT_IMPL* self );
+    rc_t ( *release ) ( const ALIGNMENT_IMPL* self );
+    
+    rc_t ( *getRefSeqId         )   ( const ALIGNMENT_IMPL *self, int32_t *refSeqId );
+    rc_t ( *getMateRefSeqId     )   ( const ALIGNMENT_IMPL *self, int32_t *refSeqId );
+    rc_t ( *getPosition         )   ( const ALIGNMENT_IMPL *self, int64_t *pos );
+    rc_t ( *getMatePosition     )   ( const ALIGNMENT_IMPL *self, int64_t *pos );
+    rc_t ( *getMapQuality       )   ( const ALIGNMENT_IMPL *self, uint8_t *qual );
+    rc_t ( *getAlignmentDetail  )   ( const ALIGNMENT_IMPL *self, AlignmentDetail *rslt, uint32_t count, uint32_t *actual, int32_t *firstMatch, int32_t *lastMatch );
+    rc_t ( *getAlignOpCount     )   ( const ALIGNMENT_IMPL *self, uint32_t *n );
+    rc_t ( *getInsertSize       )   ( const ALIGNMENT_IMPL *self, int64_t *size );
+    rc_t ( *getCG               )   ( const ALIGNMENT_IMPL *self, const CGData** result );
+    rc_t ( *getBAMCigar         )   ( const ALIGNMENT_IMPL *self, uint32_t const **rslt, uint32_t *length );
+    
+    bool ( *isSecondary ) ( const ALIGNMENT_IMPL *self ); 
+    
+    /* end minor version == 0 */
+
+} Alignment_vt_v1;
+
+typedef union Alignment_vt {
+    Alignment_vt_v1* v1;
+} Alignment_vt;
+
+struct Alignment
+{
+    Alignment_vt vt;
+};
+
+/*--------------------------------------------------------------------------
+ CGData
+ */
+#ifndef CGDATA_IMPL
+    #define CGDATA_IMPL struct CGData
+#endif
+
+typedef struct CGData_vt_v1_struct {
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    
+    rc_t ( *addRef  ) ( const CGDATA_IMPL* self );
+    rc_t ( *release ) ( const CGDATA_IMPL* self );
+
+    rc_t ( * getSeqQual )       ( const CGDATA_IMPL* self, char sequence[/* 35 */], uint8_t quality[/* 35 */] );
+    rc_t ( * getCigar )         ( const CGDATA_IMPL* self, uint32_t *cigar, uint32_t cig_max, uint32_t *cig_act );
+    rc_t ( * getAlignGroup )    ( const CGDATA_IMPL* self, char buffer[], size_t max_size, size_t *act_size);
+    /* end minor version == 0 */
+
+} CGData_vt_v1;
+
+typedef union CGData_vt {
+    CGData_vt_v1* v1;
+} CGData_vt;
+
+struct CGData
+{
+    CGData_vt vt;
+};
+
+/*--------------------------------------------------------------------------
+ Rejected
+ */
+
+struct Rejected {
+    KRefcount   refcount;
+
+    String      source;
+    const char* message;
+    uint64_t    line;
+    uint64_t    column;
+    bool        fatal;
+};
+
+rc_t CC RejectedInit ( Rejected *self );
+
+/*--------------------------------------------------------------------------
+ ReferenceInfo
+ */
+
+#ifndef REFERENCEINFO_IMPL
+    #define REFERENCEINFO_IMPL struct ReferenceInfo
+#endif
+
+typedef struct ReferenceInfo_vt_v1_struct {
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    
+    rc_t ( *addRef  ) ( const REFERENCEINFO_IMPL* self );
+    rc_t ( *release ) ( const REFERENCEINFO_IMPL* self );
+
+    rc_t ( *getRefSeqCount )        ( const REFERENCEINFO_IMPL* self, uint32_t* count );
+    rc_t ( *getRefSeq )             ( const REFERENCEINFO_IMPL* self, uint32_t n, ReferenceSequence* result );
+    rc_t ( *getReadGroupCount )     ( const REFERENCEINFO_IMPL* self, uint32_t* count );
+    rc_t ( *getReadGroup )          ( const REFERENCEINFO_IMPL* self, unsigned n, ReadGroup* result );
+    rc_t ( *getReadGroupByName )    ( const REFERENCEINFO_IMPL* self, const char* name, ReadGroup* result );
+
+    /* end minor version == 0 */
+
+} ReferenceInfo_vt_v1;
+
+typedef union ReferenceInfo_vt {
+    ReferenceInfo_vt_v1* v1;
+} ReferenceInfo_vt;
+
+struct ReferenceInfo
+{
+    ReferenceInfo_vt vt;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_common_reader_priv_ */
diff --git a/interfaces/loader/common-reader.h b/interfaces/loader/common-reader.h
new file mode 100644
index 0000000..b6cd796
--- /dev/null
+++ b/interfaces/loader/common-reader.h
@@ -0,0 +1,486 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_common_reader_
+#define _h_common_reader_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+typedef struct ReaderFile           ReaderFile;
+typedef struct Record               Record;
+typedef struct Sequence             Sequence;
+typedef struct Alignment            Alignment;
+typedef struct CGData               CGData;  
+typedef struct Rejected             Rejected;
+typedef struct ReferenceInfo        ReferenceInfo;
+
+/*--------------------------------------------------------------------------
+ ReaderFile
+ */
+rc_t CC ReaderFileAddRef ( const ReaderFile *self );
+rc_t CC ReaderFileRelease ( const ReaderFile *self );
+
+/* GetRecord
+ * Parses the next record from the source. At the end of the file, rc == 0, *result == 0.
+ */
+rc_t CC ReaderFileGetRecord( const ReaderFile *self, const Record** result);
+
+/* GetPathname
+ * Returns input's pathname, if applicable.
+ */
+const char* CC ReaderFileGetPathname ( const ReaderFile *self );
+
+/* GetProportionalPosition
+ *  get the aproximate proportional position in the input file
+ *  this is intended to be useful for computing progress
+ *
+ * NB - does not return rc_t
+ */
+float CC ReaderFileGetProportionalPosition ( const ReaderFile *self );
+
+/* GetReferenceInfo
+ *
+ */
+rc_t CC ReaderFileGetReferenceInfo ( const ReaderFile *self, const ReferenceInfo** result );
+
+/*--------------------------------------------------------------------------
+ Record
+ */
+
+/* AddRef
+ * Release
+ */
+rc_t CC RecordAddRef ( const Record *self );
+rc_t CC RecordRelease ( const Record *self );
+
+rc_t CC RecordGetRejected ( const Record *self, const Rejected** result);
+rc_t CC RecordGetSequence ( const Record *self, const Sequence** result);
+rc_t CC RecordGetAlignment( const Record *self, const Alignment** result);
+
+/*--------------------------------------------------------------------------
+ Sequence
+ */
+
+/* AddRef
+ * Release
+ */
+rc_t CC SequenceAddRef ( const Sequence *self );
+rc_t CC SequenceRelease ( const Sequence *self );
+
+/* GetReadLength
+ *  get the sequence length
+ *  i.e. the number of elements of both sequence and quality
+ *
+ *  "length" [ OUT ] - length in bases of query sequence and quality
+ */
+rc_t CC SequenceGetReadLength ( const Sequence *self, uint32_t *length );
+
+/* GetRead
+ *  get the sequence data [0..ReadLength)
+ *  caller provides buffer of ReadLength bytes
+ *
+ *  "sequence" [ OUT ] - pointer to a buffer of at least ReadLength bytes
+ */
+rc_t CC SequenceGetRead( const Sequence *self, char *sequence );
+
+/* GetRead2
+ *  get the sequence data [0..ReadLength)
+ *  caller provides buffer of ReadLength bytes
+ *
+ *  "sequence" [ OUT ] - pointer to a buffer of at least ReadLength bytes
+ *
+ *  "start" [ IN ] and "stop" [ IN ] - zero-based coordinates, half-closed interval; both have to be within ReadLength
+ */
+rc_t CC SequenceGetRead2 ( const Sequence *self, char *sequence, uint32_t start, uint32_t stop);
+
+enum QualityType {
+    QT_Unknown = 0,
+    QT_Phred,
+    QT_LogOdds
+};
+/* GetQuality
+ *  get the raw quality data [0..ReadLength) from OQ if possible else from QUAL
+ *  values are unsigned with 0xFF == missing
+ *
+ *  "quality" [ OUT ] - return param for quality sequence
+ *   held internally, validity is guaranteed for the life of the sequence
+ *  
+ *  "offset" [ OUT ] - the zero point of quality (33, 64; 0 for binary)
+ *  
+ *  "qualType" [ OUT ] - quality type (phred, log-odds, unknown)
+ */
+rc_t CC SequenceGetQuality(const Sequence *self, const int8_t **quality, uint8_t *offset, int *qualType);
+
+/* SequenceGetSpotGroup
+ *  get the name of the spot group (e.g. accession)
+ *
+ *  "name" [ OUT ] - return param for group name
+ *   held internally, validity is guaranteed for the life of the sequence
+ *
+ *  "length" [ OUT ] - return the number of bytes in "name"
+ */
+rc_t CC SequenceGetSpotGroup ( const Sequence *self, const char **name, size_t *length );
+
+
+/* SequenceGetSpotName
+ *  get the read name and length in bytes
+ *
+ *  "name" [ OUT ] - return param for read group name
+ *   held internally, validity is guaranteed for the life of the sequence
+ *
+ *  "length" [ OUT ] - return the number of bytes in "name"
+ */
+rc_t CC SequenceGetSpotName ( const Sequence *self, const char **name, size_t *length );
+
+/* IsColorSpace
+ *  Does the sequence have colorspace info
+ */
+bool CC SequenceIsColorSpace ( const Sequence *self );
+
+/* GetCSKey
+ *  get the colorspace key
+ *
+ *  "cskey" [ OUT ] - return param 
+ *
+ *  return: if no colorspace info, RC is 0 but the value of cskey is undefined
+ */
+rc_t CC SequenceGetCSKey ( const Sequence *self, char cskey[1] );
+
+/* GetCSReadLength
+ *  get the color space sequence length
+ *  i.e. the number of elements of both sequence and quality
+ *
+ *  "length" [ OUT ] - length in bases of query sequence and quality
+ */
+rc_t CC SequenceGetCSReadLength ( const Sequence *self, uint32_t *length );
+
+/* GetCSRead
+ *  get the color space sequence data [0..ReadLength)
+ *  caller provides buffer of ReadLength bytes
+ *
+ *  "sequence" [ OUT ] - pointer to a buffer of at least ReadLength bytes
+ */
+rc_t CC SequenceGetCSRead( const Sequence *self, char *sequence );
+
+/* GetCSQuality
+ *  get the color spaqce sequence's raw quality data [0..ReadLength) from OQ if possible else from QUAL
+ *  values are unsigned with 0xFF == missing
+ *
+ *  "quality" [ OUT ] - return param for quality sequence
+ *   held internally, validity is guaranteed for the life of the sequence
+ *  
+ *  "offset" [ OUT ] - the zero point of quality (33, 64; 0 for binary)
+ *  
+ *  "qualType" [ OUT ] - quality type (phred, log-odds, unknown)
+ */
+rc_t CC SequenceGetCSQuality(const Sequence *self, const int8_t **quality, uint8_t *offset, int *qualType);
+
+
+/* WasPaired
+ * true if read number is present and not 0 
+ */ 
+bool CC SequenceWasPaired     ( const Sequence *self ); 
+
+enum ReadOrientation {
+    ReadOrientationUnknown,
+    ReadOrientationForward,
+    ReadOrientationReverse
+};
+/* SequenceGetOrientationSelf
+ */ 
+int CC SequenceGetOrientationSelf( const Sequence *self ); 
+/* SequenceGetOrientationMate
+ */ 
+int CC SequenceGetOrientationMate( const Sequence *self ); 
+
+/* IsFirst
+ * fastq: read number is present and equal to 1
+ */ 
+bool CC SequenceIsFirst       ( const Sequence *self ); 
+/* IsSecond
+ * fastq: read number is present and equal to 2
+ */
+bool CC SequenceIsSecond      ( const Sequence *self ); 
+/* IsDuplicate
+ * 
+ */
+bool CC SequenceIsDuplicate( const Sequence *self ); 
+/* IsLowQuality
+ * 
+ */
+bool CC SequenceIsLowQuality( const Sequence *self ); 
+
+/*  RecordGetTI
+ *
+ */
+rc_t SequenceGetTI(Sequence const *self, uint64_t *ti);
+
+/*--------------------------------------------------------------------------
+ Alignment
+ */
+
+/* AddRef
+ * Release
+ */
+rc_t CC AlignmentAddRef ( const Alignment *self );
+rc_t CC AlignmentRelease ( const Alignment *self );
+
+/* GetRefSeqId
+ *  get id of reference sequence
+ *  pass result into BAMFileGetRefSeqById to get the Reference Sequence record
+ *
+ *  "refSeqId" [ OUT ] - zero-based id of reference sequence
+ *   returns -1 if set is invalid within BAM ( rc may be zero )
+ */
+rc_t CC AlignmentGetRefSeqId ( const Alignment *self, int32_t *refSeqId );
+
+/* GetMateRefSeqId
+ *  get id of mate's reference sequence
+ *  pass result into BAMFileGetRefSeqById to get the Reference Sequence record
+ *
+ *  "refSeqId" [ OUT ] - zero-based id of reference sequence
+ *   returns -1 if invalid
+ */
+rc_t CC AlignmentGetMateRefSeqId ( const Alignment *self, int32_t *refSeqId );
+
+/* GetPosition
+ *  get the aligned position on the ref. seq.
+ *
+ *  "n" [ IN ] - zero-based position index for cases of multiple alignments
+ *
+ *  "pos" [ OUT ] - zero-based position on reference sequence
+ *  returns -1 if invalid
+ */
+rc_t CC AlignmentGetPosition ( const Alignment *self, int64_t *pos );
+
+/* GetMatePosition
+ *  starting coordinate of mate's alignment on ref. seq.
+ *
+ *  "pos" [ OUT ] - zero-based position on reference sequence
+ *  returns -1 if invalid
+ */
+rc_t CC AlignmentGetMatePosition ( const Alignment *self, int64_t *pos );
+
+/* GetMapQuality
+ *  return the quality score of mapping
+ *
+ *  "qual" [ OUT ] - return param for quality score
+ */
+rc_t CC AlignmentGetMapQuality ( const Alignment *self, uint8_t *qual );
+
+/* GetAlignmentDetail
+ *  get the alignment details
+ *
+ *  "rslt" [ OUT, NULL OKAY ] and "count" [ IN ] - array to hold detail records
+ *
+ *  "actual" [ OUT, NULL OKAY ] - number of elements written to "rslt"
+ *   required if "rslt" is NULL
+ *
+ *  "firstMatch" [ OUT, NULL OKAY ] - zero-based index into "rslt" of the first match to the refSeq
+ *   or < 0 if invalid
+ *
+ *  "lastMatch" [ OUT, NULL OKAY ] - zero-based index into "rslt" of the last match to the refSeq
+ *   or < 0 if invalid
+ */
+typedef uint32_t AlignOpType;
+enum AlignOpTypes
+{
+    align_Match    = 'M', /* 0 */
+    align_Insert   = 'I', /* 1 */
+    align_Delete   = 'D', /* 2 */
+    align_Skip     = 'N', /* 3 */
+    align_SoftClip = 'S', /* 4 */
+    align_HardClip = 'H', /* 5 */
+    align_Padded   = 'P', /* 6 */
+    align_Equal    = '=', /* 7 */
+    align_NotEqual = 'X', /* 8 */
+    align_Overlap  = 'B' /* Complete Genomics extension */
+};
+
+typedef struct AlignmentDetail AlignmentDetail;
+struct AlignmentDetail
+{
+    int64_t refSeq_pos; /* position on refSeq where this alignment region starts or -1 if NA */
+    int32_t read_pos;   /* position on read where this alignment region starts or -1 if NA */
+    uint32_t length;    /* length of alignment region */
+    AlignOpType type;  /* type of alignment */
+};
+
+rc_t CC AlignmentGetAlignmentDetail ( const Alignment *self,
+                                      AlignmentDetail *rslt, 
+                                      uint32_t count, 
+                                      uint32_t *actual,
+                                      int32_t *firstMatch, 
+                                      int32_t *lastMatch );
+
+
+/* GetCigarCount
+ *  the number of CIGAR elements
+ *  a CIGAR element consists of the pair of matching op code and op length
+ *
+ *  "n" [ OUT ] - return param for cigar count
+ */
+rc_t CC AlignmentGetAlignOpCount ( const Alignment *self, uint32_t *n );
+
+
+/* GetInsertSize
+ *  distance in bases to start of mate's alignment on ref. seq.
+ *
+ *  "size" [ OUT ] - >0 for first in pair, <0 for second
+ */
+rc_t CC AlignmentGetInsertSize ( const Alignment *self, int64_t *size );
+
+/* GetBAMCigar
+ *
+ */
+rc_t CC AlignmentGetBAMCigar(const Alignment *cself, uint32_t const **rslt, uint32_t *length);
+
+/* IsSecondary
+ * 
+ */
+bool CC AlignmentIsSecondary( const Alignment *self ); 
+
+
+/* AlignmentGetCG
+ * rc_t == 0, result == 0 if no CG data 
+ */
+rc_t CC AlignmentGetCGData ( const Alignment *self, const CGData** result);
+
+/*--------------------------------------------------------------------------
+ * CGData
+ */
+rc_t CC CGDataAddRef ( const CGData *self );
+rc_t CC CGDataRelease ( const CGData *self );
+
+/* CGGetSeqQual
+ */
+rc_t CC CGDataGetSeqQual ( const CGData* self,
+                           char sequence[/* 35 */],
+                           uint8_t quality[/* 35 */] );
+
+/* CGGetCigar
+ */
+rc_t CC CGDataGetCigar ( const CGData* self,
+                         uint32_t *cigar,
+                         uint32_t cig_max,
+                         uint32_t *cig_act );
+
+/* CGGetAlignGroup
+ */
+rc_t CC CGDataGetAlignGroup ( const CGData* self,
+                              char buffer[],
+                              size_t max_size,
+                              size_t *act_size );
+
+/*--------------------------------------------------------------------------
+ * Rejected
+ */
+
+/* AddRef
+ * Release
+ */
+rc_t CC RejectedAddRef ( const Rejected *self );
+rc_t CC RejectedRelease ( const Rejected *self );
+
+/* GetError
+ *  "text" [ OUT ] - NUL-terminated error message, held internally
+ *  "line" [ OUT ] - 1-based line # in the source (0 for binary formats)
+ *  "column" [ OUT ] - 1-based column # in the source (offset from the start of the file for binary formats)
+ *  "fatal" [ OUT ] - no further parsing should be done (likely an unsupported format)
+ */
+rc_t CC RejectedGetError( const Rejected* self, const char** text, uint64_t* line, uint64_t* column, bool* fatal );
+
+/* GetData
+ *  "data" [ OUT ] - raw input representing the rejected record. held internally
+ *  "length" [ OUT ] - size of the data buffer
+ */
+rc_t CC RejectedGetData( const Rejected* self, const void** text, size_t* length );
+
+/*--------------------------------------------------------------------------
+ * ReferenceInfo
+ */
+typedef struct ReferenceSequence 
+{
+    uint64_t length;
+    const char *name; /* not null unique */
+    const uint8_t *checksum;
+} ReferenceSequence;
+
+typedef struct ReadGroup
+{
+    const char *name; /* not null unique, accession e.g. SRR001138 */
+    const char *platform; /* e.g. ILLUMINA */
+} ReadGroup;
+
+rc_t CC ReferenceInfoAddRef ( const ReferenceInfo *self );
+rc_t CC ReferenceInfoRelease ( const ReferenceInfo *self );
+
+/* GetRefSeqCount
+ *  get the number of Reference Sequences refered to in the header
+ *  this is not necessarily the number of Reference Sequences referenced
+ *  by the alignments
+ */
+rc_t CC ReferenceInfoGetRefSeqCount ( const ReferenceInfo *self, uint32_t* count );
+
+/* GetRefSeq
+ *  get the n'th Ref. Seq. where n is [0..RefSeqCount)
+ *  the result is populated with pointers that are good for precisely at long as the ReferenceInfo exists.
+ */
+rc_t CC ReferenceInfoGetRefSeq ( const ReferenceInfo *self, uint32_t n, ReferenceSequence *result );
+
+/* GetReadGroupCount
+ *  get the number of Read Groups (accessions, etc.) refered to in the header
+ *  this is not necessarily the number of Read Groups referenced
+ *  by the alignments
+ */
+rc_t CC ReferenceInfoGetReadGroupCount ( const ReferenceInfo *self, uint32_t *count );
+
+/* GetReadGroup
+ *  get the n'th Read Group where n is [0..ReadGroupCount)
+ *  the result is populated with pointers that are good for precisely at long as the ReferenceInfo exists.
+ */
+rc_t CC ReferenceInfoGetReadGroup ( const ReferenceInfo *self, unsigned n, ReadGroup *result );
+
+/* GetReadGroupByName
+ *  get a Read Group by its name
+ *  the result is populated with pointers that are good for precisely at long as the ReferenceInfo exists.
+ */
+rc_t CC ReferenceInfoGetReadGroupByName ( const ReferenceInfo *self, const char *name, ReadGroup *result );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_common_reader_ */
diff --git a/interfaces/loader/common-writer.h b/interfaces/loader/common-writer.h
new file mode 100644
index 0000000..cf94231
--- /dev/null
+++ b/interfaces/loader/common-writer.h
@@ -0,0 +1,192 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_common_writer_
+#define _h_common_writer_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_insdc_sra_
+#include <insdc/sra.h>
+#endif
+
+#ifndef _h_mmarray_
+#include <loader/mmarray.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+struct VDBManager;
+struct VDatabase;
+struct KMemBank;
+struct KBTree;
+struct KLoadProgressbar;
+struct ReaderFile;
+struct CommonWriter;
+struct SequenceWriter;
+struct AlignmentWriter;
+struct Reference;
+
+/*--------------------------------------------------------------------------
+ * CommonWriterSettings
+ */
+enum LoaderModes {
+    mode_Archive,
+    mode_Analysis
+};
+
+typedef struct CommonWriterSettings
+{
+    uint64_t numfiles;
+    char const *inpath;
+    char const *outpath;
+    char const *tmpfs;
+    
+    struct KFile *noMatchLog;
+    
+    char const *schemaPath;
+    char const *schemaIncludePath;
+    
+    char const *refXRefPath;
+    
+    char const *QualQuantizer;
+    
+    char const *refFilter;
+
+    char const** refFiles; /* NULL-terminated array pointing to argv */
+    
+    char const *headerText;
+    
+    uint64_t maxAlignCount;
+    size_t cache_size;
+
+    uint64_t errCount;
+    uint64_t maxErrCount;
+    uint64_t maxErrPct;
+    uint64_t maxWarnCount_NoMatch;
+    uint64_t maxWarnCount_DupConflict;
+    uint64_t pid;
+    uint64_t minMatchCount; /* minimum number of matches to count as an alignment */
+    int minMapQual;
+    enum LoaderModes mode;
+    uint32_t maxSeqLen;
+    bool omit_aligned_reads;
+    bool omit_reference_reads;
+    bool no_real_output;
+    bool expectUnsorted;
+    bool noVerifyReferences;
+    bool onlyVerifyReferences;
+    bool useQUAL;
+    bool limit2config;
+    bool editAlignedQual;
+    bool keepMismatchQual;
+    bool acceptBadDups; /* accept spots with inconsistent PCR duplicate flags */
+    bool acceptNoMatch; /* accept without any matching bases */
+    uint8_t alignedQualValue;
+    bool allUnaligned; /* treat all records as unaligned */
+    bool noColorSpace;
+    bool noSecondary;
+    bool hasTI;
+    bool acceptHardClip;
+    INSDC_SRA_platform_id platform;
+    bool parseSpotName;
+    bool compressQuality;
+    uint64_t maxMateDistance;
+} CommonWriterSettings;
+
+/*--------------------------------------------------------------------------
+ * SpotAssembler
+ */
+
+#define FRAG_CHUNK_SIZE (128)
+
+typedef struct SpotAssembler {
+    const struct KLoadProgressbar *progress[4];
+    struct KBTree *key2id[NUM_ID_SPACES];
+    char *key2id_names;
+    struct MMArray *id2value;
+    struct KMemBank *fragsBoth; /*** mate will be there soon ***/
+    struct KMemBank *fragsOne;  /*** mate may not be found soon or even show up ***/
+    int64_t spotId;
+    int64_t primaryId;
+    int64_t secondId;
+    uint64_t alignCount;
+    
+    uint32_t idCount[NUM_ID_SPACES];
+    uint32_t key2id_hash[NUM_ID_SPACES];
+    
+    size_t key2id_max;
+    size_t key2id_name_max;
+    size_t key2id_name_alloc;
+    size_t key2id_count;
+    
+    size_t key2id_name[NUM_ID_SPACES];
+    /* this array is kept in name order */
+    /* this maps the names to key2id and idCount */
+    size_t key2id_oid[NUM_ID_SPACES];
+    
+    unsigned pass;
+    bool isColorSpace;
+    
+} SpotAssembler;
+
+INSDC_SRA_platform_id PlatformToId(const char* name);
+
+/*--------------------------------------------------------------------------
+ * CommonWriter
+ */
+typedef struct CommonWriter {
+    CommonWriterSettings settings;
+    SpotAssembler ctx;
+    struct Reference* ref;
+    struct SequenceWriter* seq;
+    struct AlignmentWriter* align;
+    bool had_alignments;
+    bool had_sequences;
+    unsigned err_count;
+    bool commit;
+} CommonWriter;
+
+rc_t CommonWriterInit(CommonWriter* self, struct VDBManager *mgr, struct VDatabase *db, const CommonWriterSettings* settings);
+
+rc_t CommonWriterArchive(CommonWriter* self, const struct ReaderFile *);
+rc_t CommonWriterComplete(CommonWriter* self, bool quitting, uint64_t maxDistance);
+
+rc_t CommonWriterWhack(CommonWriter* self);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_common_writer_ */
diff --git a/interfaces/loader/mmarray.h b/interfaces/loader/mmarray.h
new file mode 100644
index 0000000..7786b81
--- /dev/null
+++ b/interfaces/loader/mmarray.h
@@ -0,0 +1,50 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_mmarray_
+#define _h_mmarray_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+struct KFile;
+
+#define NUM_ID_SPACES (256u)
+
+struct MMArray;
+
+rc_t MMArrayMake(struct MMArray **rslt, struct KFile *fp, uint32_t elemSize);
+
+rc_t MMArrayGet(struct MMArray *const self, void **const value, uint64_t const element);
+
+void MMArrayWhack(struct MMArray *self);
+
+#endif
diff --git a/interfaces/loader/reference-writer.h b/interfaces/loader/reference-writer.h
new file mode 100644
index 0000000..2ce29f0
--- /dev/null
+++ b/interfaces/loader/reference-writer.h
@@ -0,0 +1,80 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef LOADER_REFERENCE_WRITER_H_
+#define LOADER_REFERENCE_WRITER_H_ 1
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <klib/data-buffer.h>
+
+#include <align/writer-reference.h>
+#include "alignment-writer.h"
+
+typedef struct Reference {
+    const ReferenceMgr *mgr;
+    const ReferenceSeq *rseq;
+    int64_t lastRefId;
+    int32_t lastOffset;
+    unsigned curPos;
+    unsigned endPos;
+    unsigned length;
+    KDataBuffer coverage;
+    KDataBuffer mismatches;
+    KDataBuffer indels;
+    KDataBuffer pri_align;
+    KDataBuffer sec_align;
+    KDataBuffer pri_overlap;
+    KDataBuffer sec_overlap;
+    bool out_of_order;
+    bool acceptHardClip;
+    char last_id[256];
+} Reference;
+
+rc_t ReferenceInit(Reference *self, const VDBManager *mgr, VDatabase *db, 
+                   bool expectUnsorted,
+                   bool acceptHardClip,
+                   char const *refXRefPath,
+                   char const *inpath,
+                   uint32_t maxSeqLen,  /*TODO: save in Reference object, reuse in other functions*/
+                   char const** refFiles
+                   );
+rc_t ReferenceSetFile(Reference *self, const char *id, uint64_t length, uint8_t const md5[16], uint32_t maxSeqLen, bool *shouldUnmap);
+rc_t ReferenceVerify(Reference const *self, char const id[], uint64_t length, uint8_t const md5[16]);
+rc_t ReferenceGet1stRow(Reference const *self, int64_t *refID, char const refName[]);
+rc_t ReferenceAddAlignId(Reference *self,
+                         int64_t align_id,
+                         bool is_primary
+                         );
+rc_t ReferenceRead(Reference *self, AlignmentRecord *data, uint64_t const pos,
+                   uint32_t const rawCigar[], uint32_t const cigCount,
+                   char const seqDNA[], uint32_t const seqLen,
+                   uint8_t rna_orient, uint32_t *matches,
+                   bool acceptNoMatch, unsigned minMatchCount, uint32_t maxSeqLen);
+rc_t ReferenceWhack(Reference *self, bool commit, uint32_t maxSeqLen, rc_t (*const quitting)(void));
+
+#endif
diff --git a/interfaces/loader/sequence-writer.h b/interfaces/loader/sequence-writer.h
new file mode 100644
index 0000000..510a361
--- /dev/null
+++ b/interfaces/loader/sequence-writer.h
@@ -0,0 +1,93 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef BAM_LOAD_SEQUENCE_WRITER_H_
+#define BAM_LOAD_SEQUENCE_WRITER_H_ 1
+
+#include <insdc/sra.h>
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <klib/text.h>
+#include <klib/data-buffer.h>
+
+struct TableWriterSeq;
+
+typedef struct s_sequence_record {
+    char *seq;
+    uint8_t *qual;
+    uint32_t *readStart;
+    uint32_t *readLen;
+    uint8_t *orientation;
+    uint8_t *is_bad;
+    uint8_t *alignmentCount;
+    char *spotGroup;
+    bool *aligned;
+    char *cskey;
+    uint64_t *ti;
+    char *spotName;
+    uint64_t keyId;
+    unsigned spotGroupLen;
+    unsigned spotNameLen;
+    KDataBuffer storage;
+    uint8_t numreads;
+} SequenceRecord;
+
+
+rc_t SequenceRecordInit(SequenceRecord *self,
+                        unsigned numreads, unsigned readLen[]);
+
+rc_t SequenceRecordAppend(SequenceRecord *self,
+                          const SequenceRecord *other);
+
+typedef struct SequenceWriter {
+    VDatabase *db;
+    struct TableWriterSeq const *tbl;
+} SequenceWriter;
+
+SequenceWriter *SequenceWriterInit(SequenceWriter *self, VDatabase *db);
+
+rc_t SequenceWriteRecord(SequenceWriter *self, SequenceRecord const *rec,
+                         bool color, bool isDup, INSDC_SRA_platform_id platform,
+                         bool keepMismatchQual,
+                         bool no_real_output,
+                         bool hasTI,
+                         char const *QualQuantizer
+                         );
+
+rc_t SequenceDoneWriting(SequenceWriter *self);
+rc_t SequenceReadKey(const SequenceWriter *self, int64_t row, uint64_t *key);
+rc_t SequenceUpdateAlignData(SequenceWriter *self, int64_t row, unsigned nreads,
+                             const int64_t primeId[/* nreads */],
+                             const uint8_t alignCount[/* nreads */]);
+
+void SequenceWhack(SequenceWriter *self, bool commit);
+
+
+#endif /* ndef BAM_LOAD_SEQUENCE_WRITER_H_ */
diff --git a/interfaces/ncbi/clip.vschema b/interfaces/ncbi/clip.vschema
new file mode 100644
index 0000000..46f8466
--- /dev/null
+++ b/interfaces/ncbi/clip.vschema
@@ -0,0 +1,147 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * NCBI Sequence Read Archive schema
+ */
+version 1;
+
+include 'ncbi/sra.vschema';
+include 'ncbi/spotname.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:tbl:clip
+ *  common clip column processing
+ *  shared by 454 and ion-torrent
+ *
+ *  uses spotdesc because it has a dependency upon spot_len
+ *
+ * history:
+ *  1.0.1 - base explicitly upon spotdesc #1.0.1
+ *  1.0.2 - base explicitly upon spotdesc #1.0.2
+ */
+table NCBI:SRA:tbl:clip #1.0.2 = INSDC:SRA:tbl:spotdesc #1.0.2
+{
+    /* CLIP_ADAPTER_LEFT, CLIP_ADAPTER_RIGHT
+     *  adapter clips in 1-based coordinates
+     *  when value is 0, implies that they are NOT SET
+     */
+    column INSDC:coord:one CLIP_ADAPTER_LEFT = out_clip_adapt_left;
+    column INSDC:coord:one CLIP_ADAPTER_RIGHT = out_clip_adapt_right;
+
+    // casts are required to allow multple storage formats
+    INSDC:coord:one out_clip_adapt_left = cast ( .CLIP_ADAPTER_LEFT );
+    INSDC:coord:one out_clip_adapt_right = cast ( .CLIP_ADAPTER_RIGHT );
+
+
+    /* CLIP_QUALITY_LEFT, CLIP_QUALITY_RIGHT
+     *  quality clips in 1-based coordinates
+     *  when value is 0, implies that they are NOT SET
+     */
+    column INSDC:coord:one CLIP_QUALITY_LEFT = out_clip_qual_left;
+    column INSDC:coord:one CLIP_QUALITY_RIGHT = out_clip_qual_right;
+
+    // casts are required to allow multple storage formats
+    INSDC:coord:one out_clip_qual_left
+        = cast ( .CLIP_QUALITY_LEFT )
+        | < INSDC:coord:one > echo < 1 > ();
+    INSDC:coord:one out_clip_qual_right
+        = cast ( .CLIP_QUALITY_RIGHT )
+        | cast ( spot_len );
+
+    // support for reading 16-bit clips, as in v1 schema
+    readonly column U16 CLIP_ADAPTER_LEFT
+        = .CLIP_ADAPTER_LEFT
+        | cast ( out_clip_adapt_left );
+    readonly column U16 CLIP_ADAPTER_RIGHT
+        = .CLIP_ADAPTER_RIGHT
+        | cast ( out_clip_adapt_right );
+    readonly column U16 CLIP_QUALITY_LEFT = cast ( out_clip_qual_left );
+    readonly column U16 CLIP_QUALITY_RIGHT = cast ( out_clip_qual_right );
+
+
+    /* CLIP-MANIA
+     */
+
+    // 1-based fully-closed right edge is row-length
+    INSDC:coord:one spot_right = ( INSDC:coord:one ) spot_len;
+
+    // processed 1-based coordinates >= 1
+    INSDC:coord:one lim_clip_adapt_left
+        = < INSDC:coord:one > clip < 1, 0x7FFFFFFF > ( out_clip_adapt_left );
+    INSDC:coord:one max_clip_adapt_right
+        = < INSDC:coord:one, INSDC:coord:one > map < 0, 0x7FFFFFFF > ( out_clip_adapt_right );
+    INSDC:coord:one lim_clip_adapt_right
+        = < INSDC:coord:one > min ( spot_right, max_clip_adapt_right );
+    INSDC:coord:one lim_clip_qual_left
+        = < INSDC:coord:one > clip < 1, 0x7FFFFFFF > ( out_clip_qual_left );
+    INSDC:coord:one max_clip_qual_right
+        = < INSDC:coord:one, INSDC:coord:one > map < 0, 0x7FFFFFFF > ( out_clip_qual_right );
+    INSDC:coord:one lim_clip_qual_right
+        = < INSDC:coord:one > min ( spot_right, max_clip_qual_right );
+
+    // read-only columns with 0-based coordinates
+    readonly column INSDC:coord:zero CLIP_ADAPTER_LEFT
+        = ( INSDC:coord:zero ) < I32 > diff < 1 > ( lim_clip_adapt_left );
+    readonly column INSDC:coord:zero CLIP_ADAPTER_RIGHT
+        = ( INSDC:coord:zero ) < I32 > diff < 1 > ( lim_clip_adapt_right );
+    readonly column INSDC:coord:zero CLIP_QUALITY_LEFT
+        = ( INSDC:coord:zero ) < I32 > diff < 1 > ( lim_clip_qual_left );
+    readonly column INSDC:coord:zero CLIP_QUALITY_RIGHT
+        = ( INSDC:coord:zero ) < I32 > diff < 1 > ( lim_clip_qual_right );
+
+    // combined clips
+    INSDC:coord:one max_clip_left
+        = < INSDC:coord:one > max ( lim_clip_adapt_left, lim_clip_qual_left )
+        | lim_clip_adapt_left
+        | lim_clip_qual_left;
+    INSDC:coord:zero max_zclip_left
+        = ( INSDC:coord:zero ) < I32 > diff < 1 > ( max_clip_left );
+    INSDC:coord:one min_clip_right
+        = < INSDC:coord:one > min ( lim_clip_adapt_right, lim_clip_qual_right )
+        | lim_clip_adapt_right
+        | lim_clip_qual_right;
+
+
+    /* TRIMMED SEQUENCE
+     *  need to find the 0-based trim_start and trim_len
+     */
+    INSDC:coord:zero bio_start
+        = NCBI:SRA:bio_start ( out_read_start, out_read_type );
+    INSDC:coord:zero trim_start
+        = < INSDC:coord:zero > max ( bio_start, max_zclip_left )
+        | bio_start;
+
+    INSDC:coord:zero bio_end
+        = NCBI:SRA:bio_end < false > ( out_read_start, out_read_type, out_read_len );
+
+    I32 trim_stop
+        = < I32 > max ( min_clip_right, trim_start )
+        | spot_right;
+    INSDC:coord:len trim_len
+        = ( INSDC:coord:len ) < I32 > diff ( trim_stop, trim_start );
+};
diff --git a/interfaces/ncbi/extern.h b/interfaces/ncbi/extern.h
new file mode 100644
index 0000000..278f394
--- /dev/null
+++ b/interfaces/ncbi/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ncbi_extern_
+#define _h_ncbi_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define NCBI_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define NCBI_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_ncbi_extern_ */
diff --git a/interfaces/ncbi/kimpl-sra-cgi.h b/interfaces/ncbi/kimpl-sra-cgi.h
new file mode 100644
index 0000000..d1b871a
--- /dev/null
+++ b/interfaces/ncbi/kimpl-sra-cgi.h
@@ -0,0 +1,91 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * =============================================================================
+ *
+ */
+
+#ifndef _h_ncbi_impl_sra_cgi_
+#define _h_ncbi_impl_sra_cgi_
+
+#include <stdint.h> // uint32_t
+#include <unistd.h> // ssize_t
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef union SraCgiRequest_vt SraCgiRequest_vt;
+struct SraCgiRequest {
+    int err;
+    const SraCgiRequest_vt *vt;
+};
+typedef struct SraCgiRequest SraCgiRequest;
+
+#ifndef SRA_CGI_REQUEST
+#define SRA_CGI_REQUEST SraCgiRequest
+#endif
+
+typedef struct SraCgiRequest_vt_v1 SraCgiRequest_vt_v1;
+struct SraCgiRequest_vt_v1 {
+    uint32_t maj, min;
+    ssize_t (*read) (SRA_CGI_REQUEST *self,
+        void *buffer, size_t buffer_size);
+};
+union SraCgiRequest_vt {
+    SraCgiRequest_vt_v1 v1;
+};
+int SraCgiRequestInit(SraCgiRequest *self, const SraCgiRequest_vt *vt);
+
+
+typedef union SraCgiResponse_vt SraCgiResponse_vt;
+struct SraCgiResponse {
+    int err;
+    const SraCgiResponse_vt *vt;
+};
+typedef struct SraCgiResponse SraCgiResponse;
+#ifndef SRA_CGI_RESPONSE
+#define SRA_CGI_RESPONSE SraCgiResponse
+#endif
+
+typedef struct SraCgiResponse_vt_v1 SraCgiResponse_vt_v1;
+struct SraCgiResponse_vt_v1 {
+    uint32_t maj, min;
+    void (*status) (SRA_CGI_RESPONSE *self, unsigned int code);
+    void (*header) (SRA_CGI_RESPONSE *self,
+        const char *name, const void *buffer, size_t bytes);
+    ssize_t (*write) (SRA_CGI_RESPONSE *self,
+        const void *buffer, size_t bytes);
+};
+
+union SraCgiResponse_vt {
+    SraCgiResponse_vt_v1 v1;
+};
+int SraCgiResponseInit(SraCgiResponse *self, const SraCgiResponse_vt *vt);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ncbi_impl_sra_cgi_ */
+
diff --git a/interfaces/ncbi/ksra-cgi-lib.h b/interfaces/ncbi/ksra-cgi-lib.h
new file mode 100644
index 0000000..8b62638
--- /dev/null
+++ b/interfaces/ncbi/ksra-cgi-lib.h
@@ -0,0 +1,52 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * =============================================================================
+ *
+ */
+
+#ifndef _h_ncbi_ksra_cgi_lib_
+#define _h_ncbi_ksra_cgi_lib_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct SraCgiRequest;
+struct SraCgiResponse;
+
+/*------------------------------------------------------------------------------
+ * VdbCgiFunction
+ *
+ * An entry point of the sra toolkit dynamic library
+ * Is called by a CGI application
+ */
+typedef
+int TVdbCgiFunction(struct SraCgiRequest *req, struct SraCgiResponse *resp);
+
+TVdbCgiFunction VdbCgiFunction;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ncbi_sra_cgi_ */
diff --git a/interfaces/ncbi/ksra-cgi.h b/interfaces/ncbi/ksra-cgi.h
new file mode 100644
index 0000000..0f33c92
--- /dev/null
+++ b/interfaces/ncbi/ksra-cgi.h
@@ -0,0 +1,111 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * =============================================================================
+ *
+ */
+
+#ifndef _h_ncbi_sra_cgi_
+#define _h_ncbi_sra_cgi_
+
+#include <stdint.h> /* uint32_t */
+#include <unistd.h> /* ssize_t */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*------------------------------------------------------------------------------
+ * SraCgiRequest
+ */
+
+struct SraCgiRequest;
+
+/* Read
+ *  Read() attempts to read up to buffer_size bytes
+ *  from CGI request into the buffer.
+ *
+ * Return value:
+ *  On success, the number of bytes read is returned (zero indicates end of
+ *  file).
+ *
+ *  On error, negative value is returned
+ *  and SraCgiRequest->err is set appropriately.
+ */
+ssize_t SraCgiRequestRead(struct SraCgiRequest *self,
+    void *buffer, size_t buffer_size);
+
+
+/*------------------------------------------------------------------------------
+ * SraCgiResponse
+ */
+
+struct SraCgiResponse;
+
+/* Status
+ *
+ * Set HTTP Response Status
+ */
+void SraCgiResponseStatus(struct SraCgiResponse *self, unsigned int code);
+
+
+/* Header
+ *
+ * Set an HTTP Response Header
+ *
+ * "name" - header name
+ * "buffer" contains the header string value
+ * "bytes" - its size
+ *
+ * Return value:
+ *  On success, the number of header bytes written are returned.
+ *
+ *  On error, negative value is returned
+ *  and SraCgiResponse->err is set appropriately.
+ */
+ssize_t SraCgiResponseHeader(struct SraCgiResponse *self,
+    const char *name, const void *buffer, size_t bytes);
+
+
+/* ALL HEADERS SHOULD BE SET BEFORE CALLING WRITE() */
+
+
+/* Write
+ *  Write() writes up to count bytes to CGI output stream from the buffer.
+ *
+ * Return value:
+ *  On success, the number of bytes written are returned (zero indicates nothing
+ *  was written).
+ *
+ *  On error, negative value is returned
+ *  and SraCgiResponse->err is set appropriately.
+ */
+ssize_t SraCgiResponseWrite(struct SraCgiResponse *self,
+    const void *buffer, size_t bytes);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ncbi_sra_cgi_ */
diff --git a/interfaces/ncbi/ncbi.h b/interfaces/ncbi/ncbi.h
new file mode 100644
index 0000000..94b3c0e
--- /dev/null
+++ b/interfaces/ncbi/ncbi.h
@@ -0,0 +1,73 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ncbi_ncbi_
+#define _h_ncbi_ncbi_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*==========================================================================
+ * NCBI types, constants
+ */
+
+
+/* 16-bit integer sample data
+ */
+typedef int16_t NCBI_isamp1;
+
+/* 32-bit floating point sample data
+ */
+typedef float NCBI_fsamp1, NCBI_fsamp4 [ 4 ];
+
+/* ASN.1
+ */
+typedef uint8_t NCBI_asn_binary; 
+typedef char NCBI_asn_text;
+
+/* GenInfo id - 64 bit because we are almost out of 32 bit ids
+ */
+typedef uint64_t NCBI_gi;
+
+/* Taxonomy id
+ */
+typedef uint32_t NCBI_taxid;
+
+/* Genbank status
+ */
+typedef uint32_t NCBI_gb_state;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ncbi_ncbi_ */
diff --git a/interfaces/ncbi/ncbi.vschema b/interfaces/ncbi/ncbi.vschema
new file mode 100644
index 0000000..97601a0
--- /dev/null
+++ b/interfaces/ncbi/ncbi.vschema
@@ -0,0 +1,195 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * VDB Schema intrinsic types and functions
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'insdc/insdc.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * data types
+ */
+
+// N-encoded phred has values limited to 1..63 and 0 used for N
+typedef INSDC:quality:phred NCBI:quality:n_encoded:phred;
+// N-encoded log-odds has values limite to -5..40 and -6 for N
+typedef INSDC:quality:log_odds NCBI:quality:n_encoded:log_odds;
+
+// these types have been restated
+alias INSDC:dna:text INSDC:fasta;
+alias INSDC:4na:packed INSDC:dna:4na;
+alias INSDC:2na:packed INSDC:dna:2na;
+alias INSDC:2na:packed NCBI:2na;
+alias INSDC:2cs:packed INSDC:color:2cs;
+alias INSDC:2cs:packed NCBI:2cs;
+alias INSDC:quality:phred NCBI:qual1;
+alias NCBI:quality:n_encoded:phred NCBI:SRA:enc_qual1;
+
+// 16-bit integer sample data
+typedef I16 NCBI:isamp1, NCBI:isamp4 [ 4 ];
+
+// 32-bit floating point sample data
+typedef F32 NCBI:fsamp1, NCBI:fsamp4 [ 4 ];
+
+// ASN.1
+typedef B8 NCBI:asn:binary; 
+typedef ascii NCBI:asn:text;
+
+// GenInfo id - 64 bit because we are almost out of 32 bit ids
+typedef U64 NCBI:gi;
+
+// Taxonomy id
+typedef U32 NCBI:taxid;
+
+// Genbank status
+typedef U32 NCBI:gb_state;
+
+
+/*--------------------------------------------------------------------------
+ * formats
+ *  many of these formats are older than the current corresponding vdb fmts
+ */
+
+fmtdef merged_t;
+fmtdef fp_encoded_t;
+fmtdef rl_encoded_t;
+fmtdef NCBI:zlib_encoded_t;
+fmtdef NCBI:fp_encoded_t;
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+
+/* merge
+ * split
+ *  the original versions of these functions
+ *  used a slightly different format giving them
+ *  a different signature from their vdb counterparts.
+ *
+ *  here to maintain backward compatibility for
+ *  column schema functions
+ */
+extern function
+merged_t NCBI:merge #1.0 ( any in, ... );
+
+extern function
+any NCBI:split #1.0 < U32 idx > ( merged_t in )
+    = vdb:split;
+
+
+/* cut
+ * paste
+ *  these have no compiler type-checking
+ */
+extern function
+any NCBI:cut #1.0 < U32 idx, ... > ( any in )
+    = vdb:cut;
+
+extern function
+any NCBI:paste #1.0 ( any in, ... )
+    = vdb:paste;
+
+
+/* pack
+ * unpack
+ *  wildcard typed
+ */
+extern function
+any NCBI:pack #1.0 < U32 from, U32 to > ( any in );
+
+extern function
+any NCBI:unpack #1.0 < U32 from, U32 to > ( any in );
+
+
+/* fp_decode
+ *  OBSOLETE
+ *  here to handle anything encoded with fp_encode
+ */
+extern function
+any NCBI:fp_decode #1.0 ( fp_encoded_t in );
+
+
+/* fp_extend
+ *  OBSOLETE
+ *  here to handle anything encoded with fp_truncate
+ */
+extern function
+any NCBI:fp_extend #1.0 < U32 bits > ( NCBI:fp_encoded_t in );
+
+
+/* run_length_encode
+ * run_length_decode
+ */
+extern function
+rl_encoded_t NCBI:run_length_encode #1.0 ( any in )
+    = vdb:rlencode;
+
+extern function
+any NCBI:run_length_decode #1.0 ( rl_encoded_t in )
+    = vdb:rldecode;
+
+
+/* zlib
+ * unzip
+ *  variation on the formatting
+ */
+extern function
+NCBI:zlib_encoded_t NCBI:zlib #1.0 < * I32 strategy, I32 level > ( any in )
+    = vdb:zip;
+
+extern function
+any NCBI:unzip #1.0 ( NCBI:zlib_encoded_t in );
+
+
+/* zlib_huffman_compress
+ *  invokes zlib in huffman + rle mode
+ */
+schema function
+NCBI:zlib_encoded_t NCBI:zlib_huffman_compress #1.0 ( any in )
+{
+    // named as Huffman, but apply RLE as well
+    return NCBI:zlib < Z_RLE > ( in );
+}
+
+/* zlib_compress
+ *  standard zlib
+ */
+schema function
+NCBI:zlib_encoded_t NCBI:zlib_compress #1.0 ( any in )
+{
+    return NCBI:zlib < Z_DEFAULT_STRATEGY > ( in );
+}
+
+/* zlib_decompress
+ *  alternate name for unzip
+ */
+alias NCBI:unzip NCBI:zlib_decompress;
diff --git a/interfaces/ncbi/pnbrdb.vschema b/interfaces/ncbi/pnbrdb.vschema
new file mode 100644
index 0000000..e0b1775
--- /dev/null
+++ b/interfaces/ncbi/pnbrdb.vschema
@@ -0,0 +1,98 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+version 1;
+include 'vdb/vdb.vschema';
+
+/* PNBRDB
+ *  the original flat-file pnbrdb structure was divided into two forks:
+ *   1 - "hsp" containing full blastp hsps
+ *   2 - "nbr" containing only pig->pig relationships with max score
+ *
+ *  each fork was organized into bin directories by "query" ( left-hand ) pig
+ *  each bin contained entries for up to 1M query pigs with a numeric
+ *  4 digit 1-based name generated as "( ( qpig - 1 ) / 1024 ) / 1024 + 1".
+ *  this bin approach served as a primitive index.
+ *
+ *  within each bin directory, there are 1024 data files, where each data file
+ *  represented 1024 query pigs. the file name incorporated a 4 digit 1-based
+ *  file id generated as "( ( qpig - 1 ) / 1024 ) % 1024 + 1" making it possible
+ *  to locate any entry by query pig within a 1024 entry neighborhood by using
+ *  filesystem path alone.
+ *
+ *  within each data file, a fixed-size 1024-entry header gave the location of
+ *  entries ordered according to the most common queries.
+ *
+ *  all basic data are contained within the "hsp" fork. the "nbr" fork served
+ *  as a pre-calculated result of the query selecting all unique pig->pig pairs
+ *  with their maximum score value.
+ */
+
+/* The vdb representation of the pnbrdb has two tables
+ *  1. table with one row per qpig (i.e. qpig = row_id) and two columns:
+ *     offset and count. Offset indicates row_id in the second table where the
+ *     hsps for the qpig are stored and count indicates the number of these rows.
+ *  2. table with these coulmns: spig, max_score and blob. The blob contains all
+ *     segments for given (qpig, spig) pair.
+ */
+
+table NCBI:pnbr:table:qpig #1
+{
+    /* OFFSET
+     *  start position of hsps for qpig = row_id in the hsp table.
+     */
+    extern column <U64> izip_encoding OFFSET;
+
+    /* COUNT
+     *  number of hsps for qpig = row_id in the hsp table.
+     */
+    extern column <U64> izip_encoding COUNT;
+};
+
+table NCBI:pnbr:table:hsp #1
+{
+    /* SPIG
+     *  the subject pig column
+     */
+    extern column <U32> izip_encoding SPIG;
+
+    /* MAX_SCORE
+     *  max score between given query pig and subject pig
+     */
+    extern column <I32> izip_encoding MAX_SCORE;
+
+    /* SEGMENTS
+     *  blob for storing hsps for given qpig and spig.
+     */
+    extern column <B8> zip_encoding SEGMENTS;
+};
+
+database NCBI:pnbr:db:pnbr #1
+{
+    table NCBI:pnbr:table:qpig #1 QPIG_REFERENCE;
+    table NCBI:pnbr:table:hsp #1 HSP;
+};
+
diff --git a/interfaces/ncbi/seq-graph.vschema b/interfaces/ncbi/seq-graph.vschema
new file mode 100644
index 0000000..9a2962e
--- /dev/null
+++ b/interfaces/ncbi/seq-graph.vschema
@@ -0,0 +1,180 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * seq-graph style named annotations
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * types
+ * constants
+ */
+
+// example usage of data type:
+typedef utf8 NCBI:SeqGraph:sid;
+typedef utf8 NCBI:SeqGraph:name;
+typedef U32 NCBI:SeqGraph:len;
+typedef U32 NCBI:SeqGraph:scale;
+typedef I64 NCBI:SeqGraph:value;
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:start;
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:gr_q0;   // min
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:gr_q10;  // 10th quantile
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:gr_q50;  // median
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:gr_q90;  // 90th quantile
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:gr_q100; // max
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:gr_zoom_q0;   // min zoomed to 100bp segment
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:gr_zoom_q10;  // 10th quantile zoomed to 100bp segment
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:gr_zoom_q50;  // median zoomed to 100bp segment
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:gr_zoom_q90;  // 90th quantile zoomed to 100bp segment
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:gr_zoom_q100; // max zoomed to 100bp segment
+typedef NCBI:SeqGraph:value NCBI:SeqGraph:gr_num_switches; // number of value switches in graph
+
+
+/*-------------------------------------------------------------------------- 
+ * tables
+ */
+table NCBI:SeqGraph:tbl:seqgraph #1.0
+{
+    /* SID
+     * Sequence id (Accession.version).
+     * Indexed.
+     */
+    extern column NCBI:SeqGraph:sid SID
+        = ( NCBI:SeqGraph:sid ) idx:text:project #1.0 < 'sid' > ( .SID );
+    physical column < NCBI:SeqGraph:sid > zip_encoding .SID
+        = ( NCBI:SeqGraph:sid ) idx:text:insert #1.0 < 'sid' > ( SID );
+
+    /* NAME
+     * Sequence name (which resolves into SID using assembly information)
+     * Indexed.
+     */
+    extern column NCBI:SeqGraph:name NAME
+        = ( NCBI:SeqGraph:name ) idx:text:project #1.0 < 'name' > ( .NAME );
+    physical column < NCBI:SeqGraph:name > zip_encoding .NAME
+        = ( NCBI:SeqGraph:name ) idx:text:insert #1.0 < 'name' > ( NAME );
+
+    /* START
+     * Sequence offset for the segment saved in this row. 
+     * In most cases this can be calculated from row id and LEN below.
+     */
+    extern column < NCBI:SeqGraph:start > izip_encoding START;
+
+    /* LEN
+     *  MAX_SEQ_LEN is used in our refseq schema
+     *  CHUNK_SIZE might be preferred
+     *  Mostly a constant ( = 5000), except for the last row for each sequence.
+     */
+    extern column < NCBI:SeqGraph:len > izip_encoding LEN;
+
+    /* SCALE
+     * Scaling factor for graph values.
+     * Mostly needed in order to store values as integers when actual values
+     * are real with a certain precision.
+     */
+    extern column < NCBI:SeqGraph:scale > izip_encoding SCALE;
+
+    /* GRAPH
+     * intensity values
+     */
+    extern column < NCBI:SeqGraph:value > izip_encoding GRAPH;
+
+
+    /* GR_Q0
+     * Minimal value for the row
+     */
+    extern column < NCBI:SeqGraph:gr_q0 > izip_encoding GR_Q0;
+
+
+    /* GR_Q10
+     * 10th quantile value for the row 
+     */
+    extern column < NCBI:SeqGraph:gr_q10 > izip_encoding GR_Q10;
+
+
+    /* GR_Q50
+     * Median value for the row 
+     */
+    extern column < NCBI:SeqGraph:gr_q50 > izip_encoding GR_Q50;
+
+
+    /* GR_Q90
+     * 90th quantile value for the row  
+     */
+    extern column < NCBI:SeqGraph:gr_q90 > izip_encoding GR_Q90;
+
+
+    /* GR_Q100
+     * Maximal value for the row
+     */
+    extern column < NCBI:SeqGraph:gr_q100 > izip_encoding GR_Q100;
+
+    /* GR_ZOOM_Q0
+     * Minimal values for 100bp segments of the graph chunk
+     */
+    extern column < NCBI:SeqGraph:gr_zoom_q0 > izip_encoding GR_ZOOM_Q0;
+
+
+    /* GR_ZOOM_Q10
+     * 10th quantile values for 100bp segments of the graph chunk
+     */
+    extern column < NCBI:SeqGraph:gr_zoom_q10 > izip_encoding GR_ZOOM_Q10;
+
+
+    /* GR_ZOOM_Q50
+     * Median values for 100bp segments of the graph chunk 
+     */
+    extern column < NCBI:SeqGraph:gr_zoom_q50 > izip_encoding GR_ZOOM_Q50;
+
+
+    /* GR_ZOOM_Q90
+     * 90th quantile values for 100bp segments of the graph chunk 
+     */
+    extern column < NCBI:SeqGraph:gr_zoom_q90 > izip_encoding GR_ZOOM_Q90;
+
+
+    /* GR_ZOOM_Q100
+     * Maximal values for 100bp segments of the graph chunk 
+     */
+    extern column < NCBI:SeqGraph:gr_zoom_q100 > izip_encoding GR_ZOOM_Q100;
+
+    /* NUM_SWITCHES
+     * Number of value switches within the graph. Helps client make the decision how better to
+     * represent the graph in ASN.1 (Seq-graph or Seq-table).
+     */
+    extern column < NCBI:SeqGraph:gr_num_switches > izip_encoding NUM_SWITCHES;
+};
+
+
+database NCBI:SeqGraph:database:kmergraph #1.0
+{
+    table NCBI:SeqGraph:tbl:seqgraph #1.0 LEFT;
+    table NCBI:SeqGraph:tbl:seqgraph #1.0 RIGHT;
+    table NCBI:SeqGraph:tbl:seqgraph #1.0 SUM;
+}
diff --git a/interfaces/ncbi/seq.vschema b/interfaces/ncbi/seq.vschema
new file mode 100644
index 0000000..403f8f0
--- /dev/null
+++ b/interfaces/ncbi/seq.vschema
@@ -0,0 +1,894 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * Sequence schema implementation tables
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'ncbi/ncbi.vschema';
+include 'insdc/sra.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * n_encoding - implementation
+ *  introduces common virtual productions
+ */
+table NCBI:tbl:n_encoding #1
+{
+    U8 n_encoding_dummy
+        = read_unpack
+        | read_ndecode;
+};
+
+
+/*--------------------------------------------------------------------------
+ * seqloc
+ *  NCBI sequence locator table
+ */
+table NCBI:tbl:seqloc #1.0
+{
+    /* SEQ_ID
+     *  a FASTA-style SeqId
+     */
+    extern column < ascii > zip_encoding SEQ_ID;
+
+    /* SEQ_START
+     *  provided in both 1 ( default ) and 0-based coordinates
+     */
+    extern default column < INSDC:coord:one > izip_encoding SEQ_START;
+    readonly column INSDC:coord:zero SEQ_START
+        = ( INSDC:coord:zero ) < INSDC:coord:one > diff < 1 > ( .SEQ_START );
+
+    /* SEQ_LEN
+     */
+    extern column < INSDC:coord:len > izip_encoding SEQ_LEN;
+};
+
+
+/*--------------------------------------------------------------------------
+ * base_space - implementation
+ *  READ column rules
+ */
+
+/* color_from_dna
+ *  use starting keys and color matrix to convert individual reads
+ *  to base space.
+ */
+extern function
+INSDC:x2cs:bin NCBI:color_from_dna #1 ( INSDC:x2na:bin bin_x2na,
+    INSDC:coord:zero read_start, INSDC:coord:len read_len,
+    INSDC:dna:text cs_key, U8 color_matrix );
+
+
+/* dcmp_base_space
+ *  table to introduce common virtual productions
+ */
+table NCBI:tbl:dcmp_base_space #1
+{
+    // rules to introduce purely virtual productions
+    // never expected to resolve...
+    INSDC:dna:text dcmp_virtual_productions
+        = out_dcmp_4na_bin
+        | out_dcmp_x2na_bin
+        | out_dcmp_2na_bin
+        | out_dcmp_2na_packed;
+}
+
+/* history:
+ *  1.0.1 - base explicitly upon sequence #1.0.1, spotdesc #1.0.1
+ *  1.0.2 - spotdesc #1.0.2
+ *  1.0.3 - base upon dcmp_base_space for "out_dcmp_2na_bin"
+ */
+table NCBI:tbl:base_space_common #1.0.3
+    = INSDC:tbl:sequence #1.0.1
+    , INSDC:SRA:tbl:spotdesc #1.0.2
+    , INSDC:SRA:tbl:stats #1.1.0
+    , NCBI:tbl:dcmp_base_space #1.0.0
+{
+	/* INSDC:tbl:sequence inherited virtual productions
+     */
+
+    // cs_native - tells user color space is not native
+    bool cs_native = < bool > echo < false > ();
+
+    // in_cs_key is not writable in base_space
+
+    // color-space key is completely artificial
+    INSDC:dna:text out_cs_key
+        = .CS_KEY
+        | < INSDC:dna:text > echo < 'T' > ( out_read_type )
+        | < INSDC:dna:text > echo < 'T' > ( out_read_len )
+        | < INSDC:dna:text > echo < 'T' > ();
+
+    // unambiguous synthesized 2cs
+    INSDC:2cs:bin out_2cs_bin
+        = < INSDC:x2cs:bin, INSDC:2cs:bin > map < INSDC:x2cs:map:BINSET, [ 0, 1, 2, 3, 0 ] > ( out_x2cs_bin );
+
+    // unambiguous unpacked 2na
+    INSDC:2na:bin out_2na_bin
+        = out_dcmp_2na_bin
+        | ( INSDC:2na:bin ) unpack ( out_2na_packed );
+
+    // synthesized color sequence
+    INSDC:x2cs:bin out_x2cs_bin
+        = NCBI:color_from_dna ( out_x2na_bin, out_read_start, out_read_len, out_cs_key, out_color_matrix );
+
+    // synthesized packed 2cs
+    INSDC:2cs:packed out_2cs_packed
+        = ( INSDC:2cs:packed ) pack ( out_2cs_bin );
+
+    // synthesized packed 4na
+    INSDC:4na:packed out_4na_packed
+        = ( INSDC:4na:packed ) pack ( out_4na_bin );
+
+    // synthesized color text
+    INSDC:color:text out_color_text
+        = < INSDC:x2cs:bin, INSDC:color:text > map <  INSDC:x2cs:map:BINSET, INSDC:x2cs:map:CHARSET > ( out_x2cs_bin );
+
+    // published color matrix
+    U8 out_color_matrix
+        = < U8 > echo < INSDC:color:default_matrix > ();
+
+    // spot_len and fixed_spot_len
+    INSDC:coord:len base_space_spot_len
+        = ( INSDC:coord:len ) row_len ( out_2na_packed );
+    INSDC:coord:len base_space_fixed_spot_len
+        = ( INSDC:coord:len ) fixed_row_len ( out_2na_packed );
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_signal
+	 *  in_dna_text
+	 *  out_4na_bin
+	 *  out_dna_text
+	 *  out_x2na_bin
+	 *  out_2na_packed
+	 */
+
+	/* INSDC:SRA:tbl:stats inherited productions
+	 *  in_stats_bin
+	 */
+
+	/* NCBI:tbl:dcmp_base_space inherited productions
+	 *  out_dcmp_2na_bin
+	 *  out_dcmp_4na_bin
+	 *  out_dcmp_x2na_bin
+	 *  out_dcmp_2na_packed
+	 */
+};
+
+
+/* base_space_nocol
+ *  this table describes viewing rules
+ *  but omits writing rules and physical column description
+ *  in order to support older tables
+ *
+ * history:
+ *  1.0.1 - base explicitly upon base_space_common #1.0.1
+ *  1.0.2 - base explicitly upon base_space_common #1.0.2
+ *  1.0.3 - " " 1.0.3
+ */
+table NCBI:tbl:base_space_nocol #1.0.3
+    = NCBI:tbl:base_space_common #1.0.3
+    , NCBI:tbl:n_encoding #1
+{
+    // incoming is disabled
+
+    // synthesized dna text
+    INSDC:dna:text out_dna_text
+        = < INSDC:x2na:bin, INSDC:dna:text > map < INSDC:x2na:map:BINSET, INSDC:x2na:map:CHARSET > ( out_x2na_bin );
+
+    // synthesized 4na
+    INSDC:4na:bin out_4na_bin
+        = < INSDC:x2na:bin, INSDC:4na:bin > map < INSDC:x2na:map:BINSET, [ 1, 2, 4, 8, 15 ] > ( out_x2na_bin );
+
+    // unpacked 2na with ambiguities
+    INSDC:x2na:bin out_x2na_bin
+        = ( INSDC:x2na:bin ) read_ndecode;
+
+    // interface with n-encoded qualities
+    U8 read_unpack = out_2na_bin;
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_signal
+	 *  out_2na_packed
+	 */
+
+	/* NCBI:tbl:n_encoding inherited productions
+	 *  read_ndecode
+	 */
+};
+
+/* base_space #1
+ *  this schema brings in standard .READ column for v1 tables
+ *
+ * history:
+ *  1.0.1 - base explicitly upon base_space_nocol #1.0.1
+ *  1.0.2 - base explicitly upon base_space_nocol #1.0.2
+ *  1.0.3 - base explicitly upon base_space_nocol #1.0.3
+ */
+table NCBI:tbl:base_space #1.0.3 = NCBI:tbl:base_space_nocol #1.0.3
+{
+    // 2-bit 2na representation (0..3)
+    INSDC:2na:packed out_2na_packed = .READ;
+
+    // no rules for writing to .READ
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_signal
+	 */
+
+	/* NCBI:tbl:n_encoding inherited productions
+	 *  read_ndecode
+	 */
+};
+
+
+/* base_space #2
+ *  standard current base-space table
+ *
+ * history:
+ *  2.0.2 - base_space_common #1.0.2
+ *  2.0.3 - base_space_common #1.0.3 now has dcmp_base_space as well
+ */
+table NCBI:tbl:base_space #2.0.3
+    = NCBI:tbl:base_space_common #1.0.3
+    , NCBI:tbl:dcmp_base_space #1
+{
+    /* input rules
+     */
+
+    // input text
+    INSDC:dna:text in_dna_text
+        = < INSDC:dna:text, INSDC:dna:text > map < '.acmgrsvtwyhkdbn','NACMGRSVTWYHKDBN' > ( READ );
+
+    // input 4na bin
+    INSDC:4na:bin in_4na_bin
+        = < INSDC:4na:bin > range_validate < 0, 15 > ( READ )
+        | ( INSDC:4na:bin ) unpack ( in_4na_packed )
+        | < INSDC:dna:text, INSDC:4na:bin > map < INSDC:4na:map:CHARSET, INSDC:4na:map:BINSET > ( in_dna_text )
+        | < INSDC:x2na:bin, INSDC:4na:bin > map < INSDC:x2na:map:BINSET, [ 1, 2, 4, 8, 15 ] > ( in_x2na_bin );
+
+    // input 4na packed
+    INSDC:4na:packed in_4na_packed = READ;
+
+    // input x2na bin
+    INSDC:x2na:bin in_x2na_bin
+        = < INSDC:x2na:bin > range_validate < 0, 4 > ( READ )
+        | < INSDC:4na:bin, INSDC:x2na:bin > map < INSDC:4na:map:BINSET, [ 4,0,1,4,2,4,4,4,3,4,4,4,4,4,4,4 ] > ( in_4na_bin );
+
+    // input 2na bin
+    INSDC:2na:bin in_2na_bin
+        = < INSDC:2na:bin > range_validate < 0, 3 > ( READ )
+        | ( INSDC:2na:bin ) unpack ( in_2na_packed )
+        | INSDC:SEQ:rand_4na_2na ( in_4na_bin );
+
+    // input 2na packed
+    INSDC:2na:packed in_2na_packed = READ;
+
+    // input 4na alt-read ( ambiguities )
+    INSDC:4na:bin in_alt_4na_bin
+        = < INSDC:4na:bin, INSDC:4na:bin > map < INSDC:4na:map:BINSET, [ 15,0,0,3,0,5,6,7,0,9,10,11,12,13,14,15 ] > ( in_4na_bin );
+
+    // preparing a feed into stats column
+    U8 in_stats_bin = in_2na_bin;
+
+
+    /* physical columns
+     */
+
+    physical column INSDC:2na:packed .READ
+        = in_2na_packed
+        | ( INSDC:2na:packed ) pack ( in_2na_bin );
+
+    physical column < INSDC:4na:bin > zip_encoding .ALTREAD
+        = < INSDC:4na:bin > trim < 0, 0 > ( in_alt_4na_bin );
+
+
+    /* output rules
+     */
+
+    // output 2na packed
+    INSDC:2na:packed out_2na_packed
+        = .READ
+        | out_dcmp_2na_packed;
+
+    // output x2na bin
+    INSDC:x2na:bin out_x2na_bin
+        = out_dcmp_x2na_bin
+        | < INSDC:4na:bin, INSDC:x2na:bin > map < INSDC:4na:map:BINSET, [ 4,0,1,4,2,4,4,4,3,4,4,4,4,4,4,4 ] > ( out_4na_bin );
+
+    // output 2na->4na bin
+    INSDC:4na:bin out_2na_4na_bin
+        = < INSDC:2na:bin, INSDC:4na:bin > map < INSDC:2na:map:BINSET, [ 1, 2, 4, 8 ] > ( out_2na_bin );
+
+    // output 4na bin
+    INSDC:4na:bin out_4na_bin
+        = < INSDC:4na:bin > bit_or < ALIGN_RIGHT > ( out_2na_4na_bin, .ALTREAD )
+        | out_dcmp_4na_bin
+        | out_2na_4na_bin;
+
+    // output text
+    INSDC:dna:text out_dna_text
+        = < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_4na_bin );
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_signal
+	 */
+
+	/* NCBI:tbl:dcmp_base_space inherited productions
+	 *  out_dcmp_2na_bin
+	 *  out_dcmp_4na_bin
+	 *  out_dcmp_x2na_bin
+	 *  out_dcmp_2na_packed
+	 */
+};
+
+
+
+
+/*--------------------------------------------------------------------------
+ * color_space - implementation
+ *  nucleotide sequences in color space
+ */
+
+extern function
+INSDC:x2na:bin NCBI:dna_from_color #1 ( INSDC:x2cs:bin color_bin,
+     INSDC:coord:zero read_start, INSDC:coord:len read_len,
+     INSDC:dna:text cs_key, U8 color_matrix );
+
+
+/* dcmp_color_space
+ *  declares common virtual productions
+ */
+table NCBI:tbl:dcmp_color_space #1
+{
+    // rules to introduce purely virtual productions
+    // never expected to resolve...
+    INSDC:dna:text dcmp_virtual_productions
+        = out_dcmp_x2cs_bin
+        | out_dcmp_2cs_bin
+        | out_dcmp_2cs_packed;
+}
+
+/* history:
+ *  1.0.1 - base explicitly upn sequence #1.0.1, spotdesc #1.0.1
+ *  1.0.2 - spotdesc #1.0.2
+ *  1.0.3 - base upon dcmp_color_space for "out_dcmp_2cs_bin"
+ */
+table NCBI:tbl:color_space_common #1.0.3
+    = INSDC:tbl:sequence #1.0.1
+    , INSDC:SRA:tbl:spotdesc #1.0.2
+    , INSDC:SRA:tbl:stats #1.1.0
+    , NCBI:tbl:dcmp_color_space #1.0.0
+{
+    // cs_native - tells user color space is native
+    bool cs_native = < bool > echo < true > ();
+
+     // unambiguous unpacked 2cs
+    INSDC:2cs:bin out_2cs_bin
+        = out_dcmp_2cs_bin
+        | ( INSDC:2cs:bin ) unpack ( out_2cs_packed );
+
+     // unambiguous synthesized 2na
+    INSDC:2na:bin out_2na_bin
+        = < INSDC:x2na:bin, INSDC:2na:bin > map < INSDC:x2na:map:BINSET, [ 0, 1, 2, 3, 0 ] > ( out_x2na_bin );
+
+     // synthesized unpacked 4na
+    INSDC:4na:bin out_4na_bin
+        = < INSDC:x2na:bin, INSDC:4na:bin > map < INSDC:x2na:map:BINSET, [ 1, 2, 4, 8, 15 ] > ( out_x2na_bin );
+
+    // synthesized dna text
+    INSDC:dna:text out_dna_text
+        = < INSDC:x2na:bin, INSDC:dna:text > map < INSDC:x2na:map:BINSET, INSDC:x2na:map:CHARSET > ( out_x2na_bin );
+
+    // synthesized dna sequence
+    INSDC:x2na:bin out_x2na_bin
+        = NCBI:dna_from_color ( out_x2cs_bin, out_read_start, out_read_len, out_cs_key, out_color_matrix );
+
+    // synthesized packed 2na
+    INSDC:2na:packed out_2na_packed
+        = ( INSDC:2na:packed ) pack ( out_2na_bin );
+
+    // synthesized packed 4na
+    INSDC:4na:packed out_4na_packed
+        = ( INSDC:4na:packed ) pack ( out_4na_bin );
+
+    // synthesized color text
+    INSDC:color:text out_color_text
+        = < INSDC:x2cs:bin, INSDC:color:text > map <  INSDC:x2cs:map:BINSET, INSDC:x2cs:map:CHARSET > ( out_x2cs_bin );
+
+    // spot_len and fixed_spot_len
+    INSDC:coord:len color_space_spot_len
+        = ( INSDC:coord:len ) row_len ( out_2cs_packed );
+    INSDC:coord:len color_space_fixed_spot_len
+        = ( INSDC:coord:len ) fixed_row_len ( out_2cs_packed );
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  in_cs_key
+	 *  out_cs_key
+	 *  out_signal
+	 *  out_x2cs_bin
+	 *  in_color_text
+	 *  out_2cs_packed
+	 *  out_color_matrix
+	 */
+
+	/* INSDC:SRA:tbl:stats inherited productions
+	 *  in_stats_bin
+	 */
+
+	/* NCBI:tbl:dcmp_color_space inherited productions
+	 *  out_dcmp_2cs_bin
+	 *  out_dcmp_x2cs_bin
+	 *  out_dcmp_2cs_packed
+	 */
+};
+
+/* color_space_nocol
+ *  this table describes viewing rules
+ *  but omits writing rules and physical column description
+ *  in order to support older tables
+ *
+ * history:
+ *  1.0.1 - base explicitly upon color_space_common #1.0.1
+ *  1.0.2 - color_space_common #1.0.2
+ *  1.0.3 - color_space_common #1.0.3
+ */
+table NCBI:tbl:color_space_nocol #1.0.3
+    = NCBI:tbl:color_space_common #1.0.3
+    , NCBI:tbl:n_encoding #1
+{
+    // incoming is disabled
+
+    // v1 color matrix was stored in metadata
+    U8 out_color_matrix
+        = < U8 > meta:read < "COLOR_MATRIX" > ()
+        | < U8 > echo < INSDC:color:default_matrix > ();
+
+    // unpacked 2cs with ambiguities
+    INSDC:x2cs:bin out_x2cs_bin
+        = ( INSDC:x2cs:bin ) read_ndecode;
+
+    // interface with n-encoded qualities
+    U8 read_unpack = out_2cs_bin;
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_cs_key
+	 *  out_signal
+	 *  out_2cs_packed
+	 */
+
+	/* NCBI:tbl:n_encoding inherited productions
+	 *  read_ndecode
+	 */
+};
+
+/* color_space #1
+ *  this schema brings in .CSREAD and .CS_KEY columns for v1 tables
+ *
+ * history:
+ *  1.0.1 - base explicitly upon color_space_nocol #1.0.1
+ *  1.0.2 - color_space_nocol #1.0.2
+ *  1.0.3 - color_space_nocol #1.0.3
+ */
+table NCBI:tbl:color_space #1.0.3 = NCBI:tbl:color_space_nocol #1.0.3
+{
+    // stored as text
+    INSDC:dna:text out_cs_key = .CS_KEY;
+
+    // stored color sequence
+    INSDC:2cs:packed out_2cs_packed = .CSREAD;
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_signal
+	 */
+
+	/* NCBI:tbl:n_encoding inherited productions
+	 *  read_ndecode
+	 */
+};
+
+/* color_space #2
+ *  standard current color-space table
+ *
+ * history:
+ *  2.0.1 - base explicitly upon color_space_common #1.0.1
+ *  2.0.2 - base explicitly upon color_space_common #1.0.2
+ *  2.1.0 - introduce hooks for compressed color space
+ */
+table NCBI:tbl:color_space #2.1
+    = NCBI:tbl:color_space_common #1.0.3
+    , NCBI:tbl:dcmp_color_space #1.0.0
+{
+    /* input rules
+     */
+
+    // input text is not modified
+    // illegal values are not detected here
+    INSDC:color:text in_color_text = CSREAD;
+
+    // input x2cs bin
+    // illegal values will be caught here
+    INSDC:x2cs:bin in_x2cs_bin
+        = < INSDC:x2cs:bin > range_validate < 0, 4 > ( CSREAD )
+        | < INSDC:color:text, INSDC:x2cs:bin > map < INSDC:x2cs:map:CHARSET, INSDC:x2cs:map:BINSET > ( in_color_text );
+
+    // input 2cs bin
+    INSDC:2cs:bin in_2cs_bin
+        = < INSDC:2cs:bin > range_validate < 0, 3 > ( CSREAD )
+        | ( INSDC:2cs:bin ) unpack ( in_2cs_packed )
+        | < INSDC:x2cs:bin, INSDC:2cs:bin > map < INSDC:x2cs:map:BINSET, [ 0, 1, 2, 3, 0 ] > ( in_x2cs_bin );
+
+    // input 2cs packed
+    INSDC:2cs:packed in_2cs_packed = CSREAD;
+
+    // input x2cs alt-csread ( ambiguity )
+    INSDC:x2cs:bin in_alt_x2cs_bin
+        = < INSDC:x2cs:bin, INSDC:x2cs:bin > map < INSDC:x2cs:map:BINSET, [ 0, 0, 0, 0, 4 ] > ( in_x2cs_bin );
+
+    // color-space keys ARE modified on input
+    INSDC:dna:text in_cs_key
+        = < INSDC:dna:text, INSDC:dna:text > map < 'acgt', 'ACGT' > ( CS_KEY );
+
+    // color matrix
+    U8 in_color_matrix = < U8 > range_validate < 0, 4 > ( COLOR_MATRIX );
+
+    // prepairing a feed into stats column
+    U8 in_stats_bin = in_2cs_bin;
+
+
+    /* physical columns
+     */
+
+    physical column INSDC:2cs:packed .CSREAD
+        = in_2cs_packed
+        | ( INSDC:2cs:packed ) pack ( in_2cs_bin );
+
+    physical column < INSDC:x2cs:bin > zip_encoding .ALTCSREAD
+        = < INSDC:x2cs:bin > trim < 0, 0 > ( in_alt_x2cs_bin );
+
+    physical column < INSDC:dna:text > zip_encoding .CS_KEY = in_cs_key;
+
+    physical column < U8 > zip_encoding .COLOR_MATRIX = in_color_matrix;
+
+
+    /* output rules
+     */
+
+    // output 2cs packed
+    INSDC:2cs:packed out_2cs_packed
+        = .CSREAD
+        | out_dcmp_2cs_packed;
+
+    // unpacked 2cs with ambiguity
+    INSDC:x2cs:bin out_x2cs_bin
+        = ( INSDC:x2cs:bin ) < U8 > bit_or < ALIGN_RIGHT > ( out_2cs_bin, .ALTCSREAD )
+        | out_dcmp_x2cs_bin
+        | ( INSDC:x2cs:bin ) out_2cs_bin;
+
+    // read directly from physical column
+    INSDC:dna:text out_cs_key = .CS_KEY;
+
+    // color matrix may be synthesized
+    U8 out_color_matrix
+        = .COLOR_MATRIX
+        | < U8 > echo < INSDC:color:default_matrix > ();
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_signal
+	 */
+
+	/* NCBI:tbl:dcmp_color_space inherited productions
+	 *  out_dcmp_2cs_bin
+	 *  out_dcmp_x2cs_bin
+	 *  out_dcmp_2cs_packed
+	 */
+};
+
+
+/*--------------------------------------------------------------------------
+ * protein
+ */
+table NCBI:tbl:protein #1 = INSDC:tbl:protein
+{
+    /* upper-case letters */
+    INSDC:protein:text in_protein_text = < INSDC:protein:text, INSDC:protein:text >
+        map < 'abcdefghijklmnopqrstvwxyzu','ABCDEFGHIJKLMNOPQRSTVWXYZU' > ( PROTEIN );
+
+    /* std aa */
+    INSDC:aa:bin in_aa_bin
+        = < INSDC:aa:bin > range_validate < 1, 27 > ( PROTEIN )
+        | < INSDC:protein:text, INSDC:aa:bin > map < INSDC:aa:map:CHARSET, INSDC:aa:map:BINSET > ( in_protein_text );
+
+    /* physical column */
+    physical column < INSDC:aa:bin > zip_encoding .PROTEIN = in_aa_bin;
+
+    /* output rules */
+    INSDC:aa:bin out_aa_bin = .PROTEIN;
+    INSDC:protein:text out_protein_text = < INSDC:aa:bin, INSDC:protein:text >
+        map < INSDC:aa:map:BINSET, INSDC:aa:map:CHARSET > ( out_aa_bin );
+};
+
+
+/*--------------------------------------------------------------------------
+ * phred
+ *  standard phred quality representation
+ *  limits values on input to 1..63
+ *  reserves value 0 as ambiguity symbol for reads
+ */
+
+
+/* history:
+ *  1.0.1 - base explicitly upon sequence #1.0.1
+ */
+table NCBI:tbl:phred_quality_nocol #1.0.1 = INSDC:tbl:sequence #1.0.1, NCBI:tbl:n_encoding #1
+{
+    /* [CS]READ - decoding
+     */
+    U8 read_ndecode
+        = < INSDC:quality:phred, U8 > map < 0, 4 > ( out_qual_phred, read_unpack );
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_qual_phred
+	 *  out_qual_text_phred_33
+	 *  out_qual_text_phred_64
+	 */
+
+	/* NCBI:tbl:n_encoding inherited productions
+	 *  read_unpack
+	 */
+};
+
+/* history:
+ *  1.0.1 - base explicitly upon phred_quality_nocol #1.0.1
+ */
+table NCBI:tbl:phred_quality #1.0.1 = NCBI:tbl:phred_quality_nocol #1.0.1
+{
+    // read directly as n-encoded phred is compatible with phred
+    NCBI:quality:n_encoded:phred out_qual_phred = .QUALITY;
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_qual_text_phred_33
+	 *  out_qual_text_phred_64
+	 */
+
+	/* NCBI:tbl:n_encoding inherited productions
+	 *  read_unpack
+	 */
+};
+
+/* history:
+ *  2.0.1 - added feed of in_stats_qual
+ *  2.0.2 - added input of text encodings
+ *  2.0.3 - base explicitly upon sequence #1.0.1
+ *  2.0.4 - change compression from izip to zip
+ *  2.0.5 - change from zip to delta_average_zip
+ */
+table NCBI:tbl:phred_quality #2.0.4 = INSDC:tbl:sequence #1.0.1
+{
+    // read directly quality as  phred
+    INSDC:quality:phred out_qual_phred = .QUALITY;
+
+    // input rules
+    INSDC:quality:text:phred_33 in_qual_text_phred_33 = QUALITY;
+    INSDC:quality:text:phred_64 in_qual_text_phred_64 = QUALITY;
+
+    INSDC:quality:phred in_qual_phred
+        = QUALITY
+        | ( INSDC:quality:phred ) < B8 > diff < 33 > ( in_qual_text_phred_33 )
+        | ( INSDC:quality:phred ) < B8 > diff < 64 > ( in_qual_text_phred_64 );
+
+    // physical storage
+/*** next line is  for future change in production, but we have to wait until supporting code is released to the public ***/
+// physical column < INSDC:quality:phred > delta_average_zip_encoding .QUALITY = in_qual_phred;
+/*** NB *** MUST change table version to 2.0.5 and propagate to all derived tables ***/
+    physical column < INSDC:quality:phred > zip_encoding .QUALITY = in_qual_phred;
+
+    // feed to compressed statistics
+    INSDC:quality:phred in_stats_qual = in_qual_phred;
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_qual_text_phred_33
+	 *  out_qual_text_phred_64
+	 */
+};
+
+
+
+/*--------------------------------------------------------------------------
+ * log_odds
+ *  log-odds quality score support
+ *
+ *  conversion from log-odds to phred is via formula
+ *    10 * log ( 1 + pow ( 10, x / 10 ) ) / log ( 10 ) + 0.499
+ *  for x = -4..40 : when x = -5, phred = 0
+ */
+
+// the map function requires two lookup tables:
+// the first table detects every legal value...
+const INSDC:quality:log_odds NCBI:quality:from:log_odds =
+[
+             -6,-5,-4,-3,-2,-1, 0,
+     1, 2, 3, 4, 5, 6, 7, 8, 9,10,
+    11,12,13,14,15,16,17,18,19,20,
+    21,22,23,24,25,26,27,28,29,30,
+    31,32,33,34,35,36,37,38,39,40
+];
+
+// ...the second table gives positional translations
+const INSDC:quality:phred NCBI:quality:to:phred =
+[
+              0, 1, 1, 2, 2, 3, 3,
+     4, 4, 5, 5, 6, 7, 8, 9,10,10,
+    11,12,13,14,15,16,17,18,19,20,
+    21,22,23,24,25,26,27,28,29,30,
+    31,32,33,34,35,36,37,38,39,40
+];
+
+function
+INSDC:quality:phred NCBI:log_odds_to_phred #1 ( INSDC:quality:log_odds qual_log_odds )
+{
+    // this range enforcement may not be required
+    INSDC:quality:log_odds log_odds_clip
+        = < INSDC:quality:log_odds > clip < -6, 40 > ( qual_log_odds );
+
+    // use the tables above to map from log-odds to phred
+    return < INSDC:quality:log_odds, INSDC:quality:phred >
+        map < NCBI:quality:from:log_odds, NCBI:quality:to:phred > ( log_odds_clip );
+}
+
+/* history:
+ *  1.0.1 - base explicitly upon sequence #1.0.1
+ */
+table NCBI:tbl:log_odds_quality_nocol #1.0.1 = INSDC:tbl:sequence #1.0.1, NCBI:tbl:n_encoding #1
+{
+    /* READ - decoding
+     */
+    U8 read_ndecode
+        = < INSDC:quality:log_odds, U8 > map < -6, 4 > ( out_qual_log_odds, read_unpack );
+
+    /* QUALITY
+     *  declared in INSDC:tbl:sequence as phred
+     *  introduce here as log-odds
+     */
+    extern column INSDC:quality:log_odds QUALITY = out_qual_log_odds;
+
+    // resolve for phred
+    INSDC:quality:phred out_qual_phred
+        = out_qual2_phred
+        | NCBI:log_odds_to_phred ( out_qual_log_odds );
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_qual_text_phred_33
+	 *  out_qual_text_phred_64
+	 */
+
+	/* NCBI:tbl:n_encoding inherited productions
+	 *  read_unpack
+	 */
+
+	/* NCBI:tbl:log_odds_quality_nocol productions
+	 *  out_qual2_phred
+	 *  out_qual_log_odds
+	 */
+};
+
+/* history:
+ *  1.0.1 - base explicitly upon log_odds_quality_nocol #1.0.1
+ */
+table NCBI:tbl:log_odds_quality #1.0.1 = NCBI:tbl:log_odds_quality_nocol #1.0.1
+{
+    // read directly as n-encoded log_odds is compatible with log_odds
+    NCBI:quality:n_encoded:log_odds out_qual_log_odds = .QUALITY;
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_qual_text_phred_33
+	 *  out_qual_text_phred_64
+	 */
+
+	/* NCBI:tbl:n_encoding inherited productions
+	 *  read_unpack
+	 */
+
+	/* NCBI:tbl:log_odds_quality_nocol inherited productions
+	 *  out_qual2_phred
+	 */
+};
+
+/* history:
+ *  2.0.1 - base explicitly upon sequence #1.0.1
+ *  2.1.0 - added production of in_qual_phred
+ */
+table NCBI:tbl:log_odds_quality_nocol #2.1.0 = INSDC:tbl:sequence #1.0.1
+{
+    /* QUALITY
+     *  declared in INSDC:tbl:sequence as phred
+     *  introduce here as log-odds
+     */
+    extern column INSDC:quality:log_odds QUALITY
+        = out_qual_log_odds;
+
+    // resolve for phred
+    INSDC:quality:phred in_qual_phred
+        = NCBI:log_odds_to_phred ( in_qual_log_odds );
+
+    INSDC:quality:phred out_qual_phred
+        = NCBI:log_odds_to_phred ( out_qual_log_odds );
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_qual_text_phred_33
+	 *  out_qual_text_phred_64
+	 */
+
+	/* NCBI:tbl:log_odds_quality_nocol productions
+	 *  out_qual_log_odds
+	 */
+};
+
+/* history:
+ *  2.0.1 - added feed of in_stats_qual
+ *  2.0.2 - added input of text encodings
+ *  2.0.3 - base explicitly upon log_odds_quality_nocol #2.0.1
+ *  2.0.4 - changed compression from izip to zip
+ *  2.1.0 - base explicitly upon log_odds_quality_nocol #2.1.0
+ */
+table NCBI:tbl:log_odds_quality #2.1.0 = NCBI:tbl:log_odds_quality_nocol #2.1.0
+{
+    INSDC:quality:log_odds out_qual_log_odds= .QUALITY;
+
+    extern column INSDC:quality:text:log_odds_64 QUALITY
+        = out_qual_text_log_odds_64
+        | ( INSDC:quality:text:log_odds_64 ) < B8 > sum < 64 > ( out_qual_log_odds );
+
+    // input rules
+    INSDC:quality:text:log_odds_64 in_qual_text_log_odds_64 = QUALITY;
+
+    INSDC:quality:log_odds in_qual_log_odds
+        = QUALITY
+        | ( INSDC:quality:log_odds ) < B8 > diff < 64 > ( in_qual_text_log_odds_64 );
+
+    physical column < INSDC:quality:log_odds > zip_encoding .QUALITY
+        = in_qual_log_odds;
+
+    // feed to compressed statistics
+    INSDC:quality:log_odds in_stats_qual = in_qual_log_odds;
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  out_qual_text_phred_33
+	 *  out_qual_text_phred_64
+	 */
+
+	/* NCBI:tbl:log_odds_quality productions
+	 *  out_qual_text_log_odds_64
+	 */
+};
diff --git a/interfaces/ncbi/spotname.h b/interfaces/ncbi/spotname.h
new file mode 100644
index 0000000..9c7ee81
--- /dev/null
+++ b/interfaces/ncbi/spotname.h
@@ -0,0 +1,150 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ncbi_spotname_
+#define _h_ncbi_spotname_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*==========================================================================
+ * NCBI Sequence Read Archive schema
+ */
+
+
+/*--------------------------------------------------------------------------
+ * types
+ */
+
+/* spot_name_token
+ *  a vector describing tokens recognized within a spot name
+ *
+ * COMPONENTS:
+ *  0 - token id
+ *  1 - token starting coordinate
+ *  2 - token length
+ */
+typedef uint16_t NCBI_SRA_spot_name_token [ 3 ];
+
+/* token values
+ *
+ *  tokens are produced by a schema-specific tokenizer function
+ *  this function is purposely abstract because it may rely upon
+ *  whatever information it needs to perform its task. the only
+ *  requirement is that it produce these tokens as its output.
+ *
+ *  an empty name input must produce no tokens. in this case,
+ *  there is no name to tokenize or data to produce.
+ *
+ *  a non-empty name must produce 1 or more tokens of output.
+ *  all tokens must be ordered by starting character position.
+ *
+ *  if a name does not conform to any pattern recognized by the
+ *  tokenizer, then the tokenizer emits a single token of "unrecognized"
+ *
+ *  if a name conforms to some pattern but does not have any
+ *  substitution tokens, the tokenizer emits a single token of "recognized"
+ *
+ *  if a name may be tokenized, then the resulting tokens should
+ *  describe only the portions of the string that should be removed
+ *  from the name, e.g. "X" or "Y".
+ *
+ *  the standard coordinates "X".."L" are given in unsigned decimal.
+ *  alternate representations are contained within their respective
+ *  namespaces: "signed", "hex" and "octal".
+ *
+ *  the special coordinate "Q" represents the 454-specific encoding
+ *  of X and Y into base-36, where the formula for Q is:
+ *    Q = 4096 * X + Y
+ *  and ASCII encoding:
+ *    0..25 => "A-Z", 26..35 => "0-9"
+ */
+enum
+{
+    NCBI_SRA_name_token_unrecognized =  1,
+    NCBI_SRA_name_token_recognized   =  2,
+    NCBI_SRA_name_token_Q            =  3,
+    NCBI_SRA_name_token_X            =  4,
+    NCBI_SRA_name_token_Y            =  5,
+    NCBI_SRA_name_token_T            =  6,
+    NCBI_SRA_name_token_L            =  7,
+    NCBI_SRA_name_token_signed_X     =  8,
+    NCBI_SRA_name_token_signed_Y     =  9,
+    NCBI_SRA_name_token_signed_T     = 10,
+    NCBI_SRA_name_token_signed_L     = 11,
+    NCBI_SRA_name_token_octal_X      = 12,
+    NCBI_SRA_name_token_octal_Y      = 13,
+    NCBI_SRA_name_token_octal_T      = 14,
+    NCBI_SRA_name_token_octal_L      = 15,
+    NCBI_SRA_name_token_hex_upper_X  = 16,
+    NCBI_SRA_name_token_hex_upper_Y  = 17,
+    NCBI_SRA_name_token_hex_upper_T  = 18,
+    NCBI_SRA_name_token_hex_upper_L  = 19,
+    NCBI_SRA_name_token_hex_lower_X  = 20,
+    NCBI_SRA_name_token_hex_lower_Y  = 21,
+    NCBI_SRA_name_token_hex_lower_T  = 22,
+    NCBI_SRA_name_token_hex_lower_L  = 23
+};
+
+
+/* token symbols
+ *  when a name matches some pattern and tokens are recognized,
+ *  the tokens are extracted from the name and sent to individual
+ *  columns, and replaced with the symbols below to create a
+ *  formatted name.
+ */
+enum
+{
+    NCBI_SRA_name_symbol_Q           = 'Q',
+    NCBI_SRA_name_symbol_X           = 'X',
+    NCBI_SRA_name_symbol_Y           = 'Y',
+    NCBI_SRA_name_symbol_T           = 'T',
+    NCBI_SRA_name_symbol_L           = 'L',
+    NCBI_SRA_name_symbol_octal_X     = 'a',
+    NCBI_SRA_name_symbol_octal_Y     = 'b',
+    NCBI_SRA_name_symbol_octal_T     = 'c',
+    NCBI_SRA_name_symbol_octal_L     = 'd',
+    NCBI_SRA_name_symbol_hex_upper_X = 'e',
+    NCBI_SRA_name_symbol_hex_upper_Y = 'f',
+    NCBI_SRA_name_symbol_hex_upper_T = 'g',
+    NCBI_SRA_name_symbol_hex_upper_L = 'h',
+    NCBI_SRA_name_symbol_hex_lower_X = 'x',
+    NCBI_SRA_name_symbol_hex_lower_Y = 'y',
+    NCBI_SRA_name_symbol_hex_lower_T = 't',
+    NCBI_SRA_name_symbol_hex_lower_L = 'l'
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_ncbi_spotname_ */
diff --git a/interfaces/ncbi/spotname.vschema b/interfaces/ncbi/spotname.vschema
new file mode 100644
index 0000000..289f9c4
--- /dev/null
+++ b/interfaces/ncbi/spotname.vschema
@@ -0,0 +1,377 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * NCBI Sequence Read Archive schema
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'insdc/sra.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * types
+ */
+
+/* spot_name_token
+ *  a vector describing tokens recognized within a spot name
+ *
+ * COMPONENTS:
+ *  0 - token id
+ *  1 - token starting coordinate
+ *  2 - token length
+ */
+alias text:token NCBI:SRA:spot_name_token;
+
+
+/* token values
+ *
+ *  tokens are produced by a schema-specific tokenizer function
+ *  this function is purposely abstract because it may rely upon
+ *  whatever information it needs to perform its task. the only
+ *  requirement is that it produce these tokens as its output.
+ *
+ *  an empty name input must produce no tokens. in this case,
+ *  there is no name to tokenize or data to produce.
+ *
+ *  a non-empty name must produce 1 or more tokens of output.
+ *  all tokens must be ordered by starting character position.
+ *
+ *  if a name does not conform to any pattern recognized by the
+ *  tokenizer, then the tokenizer emits a single token of "unrecognized"
+ *
+ *  if a name conforms to some pattern but does not have any
+ *  substitution tokens, the tokenizer emits a single token of "recognized"
+ *
+ *  if a name may be tokenized, then the resulting tokens should
+ *  describe only the portions of the string that should be removed
+ *  from the name, e.g. "X" or "Y".
+ *
+ *  the standard coordinates "X".."L" are given in unsigned decimal.
+ *  alternate representations are contained within their respective
+ *  namespaces: "signed", "hex" and "octal".
+ *
+ *  the special coordinate "Q" represents the 454-specific encoding
+ *  of X and Y into base-36, where the formula for Q is:
+ *    Q = 4096 * X + Y
+ *  and ASCII encoding:
+ *    0..25 => "A-Z", 26..35 => "0-9"
+ */
+const U16 NCBI:SRA:name_token:unrecognized =  1;
+const U16 NCBI:SRA:name_token:recognized   =  2;
+const U16 NCBI:SRA:name_token:Q            =  3;
+const U16 NCBI:SRA:name_token:X            =  4;
+const U16 NCBI:SRA:name_token:Y            =  5;
+const U16 NCBI:SRA:name_token:T            =  6;
+const U16 NCBI:SRA:name_token:L            =  7;
+const U16 NCBI:SRA:name_token:signed:X     =  8;
+const U16 NCBI:SRA:name_token:signed:Y     =  9;
+const U16 NCBI:SRA:name_token:signed:T     = 10;
+const U16 NCBI:SRA:name_token:signed:L     = 11;
+const U16 NCBI:SRA:name_token:octal:X      = 12;
+const U16 NCBI:SRA:name_token:octal:Y      = 13;
+const U16 NCBI:SRA:name_token:octal:T      = 14;
+const U16 NCBI:SRA:name_token:octal:L      = 15;
+const U16 NCBI:SRA:name_token:hex:upper:X  = 16;
+const U16 NCBI:SRA:name_token:hex:upper:Y  = 17;
+const U16 NCBI:SRA:name_token:hex:upper:T  = 18;
+const U16 NCBI:SRA:name_token:hex:upper:L  = 19;
+const U16 NCBI:SRA:name_token:hex:lower:X  = 20;
+const U16 NCBI:SRA:name_token:hex:lower:Y  = 21;
+const U16 NCBI:SRA:name_token:hex:lower:T  = 22;
+const U16 NCBI:SRA:name_token:hex:lower:L  = 23;
+
+
+/* token symbols
+ *  when a name matches some pattern and tokens are recognized,
+ *  the tokens are extracted from the name and sent to individual
+ *  columns, and replaced with the symbols below to create a
+ *  formatted name.
+ */
+const ascii NCBI:SRA:name_symbol:Q           = '$Q';
+const ascii NCBI:SRA:name_symbol:X           = '$X';
+const ascii NCBI:SRA:name_symbol:Y           = '$Y';
+const ascii NCBI:SRA:name_symbol:T           = '$T';
+const ascii NCBI:SRA:name_symbol:L           = '$L';
+const ascii NCBI:SRA:name_symbol:octal:X     = '$a';
+const ascii NCBI:SRA:name_symbol:octal:Y     = '$b';
+const ascii NCBI:SRA:name_symbol:octal:T     = '$c';
+const ascii NCBI:SRA:name_symbol:octal:L     = '$d';
+const ascii NCBI:SRA:name_symbol:hex:upper:X = '$e';
+const ascii NCBI:SRA:name_symbol:hex:upper:Y = '$f';
+const ascii NCBI:SRA:name_symbol:hex:upper:T = '$g';
+const ascii NCBI:SRA:name_symbol:hex:upper:L = '$h';
+const ascii NCBI:SRA:name_symbol:hex:lower:X = '$x';
+const ascii NCBI:SRA:name_symbol:hex:lower:Y = '$y';
+const ascii NCBI:SRA:name_symbol:hex:lower:T = '$t';
+const ascii NCBI:SRA:name_symbol:hex:lower:L = '$l';
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+/* extract_spot_name
+ *  generates input to .SPOT_NAME column
+ *
+ *  on NCBI:SRA:name_token:unrecognized, produces the entire spot name row
+ *  otherwise, produces an empty row
+ *
+ *  "name" [ DATA ] - raw spot names from NAME column
+ *
+ *  "tok" [ DATA ] - delimiting tokens produced by sub-table
+ */
+function ascii
+    NCBI:SRA:extract_spot_name #1 ( ascii name, NCBI:SRA:spot_name_token tok );
+
+
+/* extract_name_fmt
+ *  generates input to .NAME_FMT column and/or updates skey index
+ *
+ *  on NCBI:SRA:name_token:unrecognized, produces an empty row
+ *  otherwise, it creates a temporary "name_fmt" string from name row
+ *
+ *  an attempt is made to insert name_fmt into indicated text index
+ *  ( normally 'skey' ). if the insert succeeds, i.e. associates "name_fmt"
+ *  with a row_id, then the output for the row is empty.
+ *
+ *  if the insert fails due to key duplication, an attempt is made to
+ *  extend the id range of associated rows. depending upon the type of index,
+ *  this may succeed or fail, e.g. if the existing row range for "name_fmt" is
+ *  n..m where m = row_id - 1, the range can be extended to n..row_id and
+ *  the update succeeds. if the index supports discontiguous id ranges, the
+ *  update will also succeed. upon any success updating the index, the output
+ *  row will be empty.
+ *
+ *  finally, if the temporary "name_fmt" cannot be inserted into the index
+ *  nor the existing id range updated, the output for the row will be "name_fmt".
+ *
+ *  "name" [ DATA ] - raw spot names from NAME column
+ *
+ *  "tok" [ DATA ] - delimiting tokens produced by sub-table
+ */
+function ascii
+    NCBI:SRA:extract_name_fmt #1 < ascii idx > ( ascii name, NCBI:SRA:spot_name_token tok );
+
+
+/* extract_name_coord
+ *  generates inputs to .X and .Y and possibly other columns
+ *
+ *  if no tokens match "coord"constant, produces an empty row
+ *  otherwise, produces binary coordinate value
+ *  if multiple tokens match criteria, all values must be equivalent
+ *  because only a single value will be output per row
+ *
+ *  "coord" [ CONST ] - either NCBI:SRA:name_token:X or NCBI:SRA:name_token:Y
+ *  both of these values also match the token NCBI:SRA:name_token:Q and extract
+ *  contents appropriately.
+ *
+ *  "name" [ DATA ] - raw spot names from NAME column
+ *
+ *  "tok" [ DATA ] - delimiting tokens produced by sub-table
+ */
+function INSDC:coord:val
+    NCBI:SRA:extract_name_coord #1 < U16 coord > ( ascii name, NCBI:SRA:spot_name_token tok );
+
+
+/* lookup
+ */
+function INSDC:SRA:spot_ids_found NCBI:SRA:lookup #1.0
+    < ascii index_name, ascii query_by_name, U8 name_fmt_version > ( * ascii name_prefix );
+
+
+/*--------------------------------------------------------------------------
+ * spotcoord
+ *  spot coordinate table implementation
+ */
+table NCBI:SRA:tbl:spotcoord #1 = INSDC:SRA:tbl:spotcoord #1
+{
+    // X and Y stored as I32
+    INSDC:coord:val out_x_coord = .X;
+    INSDC:coord:val out_y_coord = .Y;
+
+    // T and L are usually present but optional
+    INSDC:coord:val out_t_coord = .T;
+    INSDC:coord:val out_l_coord = .L;
+
+    // .X, .Y, .T and .L get either empty coordinate or proper coordinate
+    physical column < INSDC:coord:val > izip_encoding .X
+        = in_x_coord
+        | in_name_x_coord;
+    physical column < INSDC:coord:val > izip_encoding .Y
+        = in_y_coord
+        | in_name_y_coord;
+    physical column < INSDC:coord:val > izip_encoding .T
+        = in_t_coord
+        | in_name_t_coord;
+    physical column < INSDC:coord:val > izip_encoding .L
+        = in_l_coord
+        | in_name_l_coord;
+};
+
+
+/*--------------------------------------------------------------------------
+ * skeyname
+ *  spot name table implementation built upon prefix-tree skey index
+ *
+ * v1 - maintains a 1->1 key=>spot_id relationship
+ *      with unique constraint on key. it does NOT
+ *      implement name_fmt or x_coord or y_coord.
+ *
+ * v2 - maintains a 1->1 key=>spot_id-range relationship
+ *      with unique constraint on key. it does NOT
+ *      implement spot_name. X and Y are stored using
+ *      16-bit unsigned quantities.
+ *
+ * v3 - maintains a flexible naming approach
+ *      retrieves name directly from column if so stored
+ *      synthesizes name from name_fmt, X and Y otherwise
+ *      name_fmt is either retrieved directly from column
+ *      or from skey index. X and Y are stored as 32-bit
+ *      signed quantities.
+ *
+ * history:
+ *  1.0.1 - explicitly account for spotname #1.0.1 ancestry
+ *  2.0.1 - " "
+ *  3.0.1 - moved .X and .Y to spotcoord table
+ */
+table NCBI:SRA:tbl:skeyname #1.0.1 = INSDC:SRA:tbl:spotname #1.0.1
+{
+    // read the skey entry
+    ascii out_skey = ( ascii ) idx:text:project #1.0 < 'skey' > ();
+
+    // spot_name
+    ascii out_spot_name
+        = rewritten_spot_name
+        | out_skey;
+
+    // search skey entry
+    INSDC:SRA:spot_ids_found spot_ids_found
+        = ( INSDC:SRA:spot_ids_found ) NCBI:SRA:lookup #1 < 'skey' , 'QUERY_BY_NAME', 1 > ( out_slx_prefix ) 
+        | ( INSDC:SRA:spot_ids_found ) NCBI:SRA:lookup #1 < 'skey' , 'QUERY_BY_NAME', 0 > ();
+
+
+	/* INSDC:SRA:tbl:spotname inherited productions
+	 *  out_x_coord
+	 *  out_y_coord
+	 *  out_name_fmt
+	 */
+
+	/* NCBI:SRA:tbl:skeyname productions
+	 *  out_slx_prefix
+	 *  rewritten_spot_name
+	 */
+};
+
+table NCBI:SRA:tbl:skeyname_nocol #2.0.1 = INSDC:SRA:tbl:spotname #1.0.1
+{
+    // name_fmt
+    //  perform reverse lookup through index to get key
+    ascii out_name_fmt = ( ascii ) idx:text:project #1.0 < 'skey' > ();
+
+    // search skey entry
+    INSDC:SRA:spot_ids_found spot_ids_found
+        = ( INSDC:SRA:spot_ids_found ) NCBI:SRA:lookup #1 < 'skey' , 'QUERY_BY_NAME', 2 > ( out_slx_prefix ) 
+        | ( INSDC:SRA:spot_ids_found ) NCBI:SRA:lookup #1 < 'skey' , 'QUERY_BY_NAME', 2 > ();
+
+    // X and Y stored as U16
+    INSDC:coord:val out_x_coord = cast ( .X );
+    INSDC:coord:val out_y_coord = cast ( .Y );
+
+
+	/* NCBI:SRA:tbl:skeyname_nocol virtual productions
+	 *  out_slx_prefix
+	 */
+};
+
+table NCBI:SRA:tbl:skeyname #2.0.1 = NCBI:SRA:tbl:skeyname_nocol #2.0.1
+{
+    // spot_name_tok comes from a platform-specific tokenizer
+    // and must be of type 'NCBI:SRA:spot_name_token'
+    physical column < INSDC:coord:val > izip_encoding #1 .X
+        = NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:X > ( NAME, in_spot_name_tok );
+    physical column < INSDC:coord:val > izip_encoding .Y
+        = NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:Y > ( NAME, in_spot_name_tok );
+
+	/* NCBI:SRA:tbl:skeyname_nocol inherited virtual productions
+	 *  out_slx_prefix
+	 */
+
+	/* NCBI:SRA:tbl:skeyname virtual productions
+	 *  in_spot_name_tok
+	 */
+};
+
+table NCBI:SRA:tbl:skeyname #3.0.1 = INSDC:SRA:tbl:spotname #1.0.1, NCBI:SRA:tbl:spotcoord #1
+{
+    // spot_name
+    //  retrieve from hard column
+    ascii out_spot_name = .SPOT_NAME;
+
+    // name_fmt
+    //  retrieve from hard column or reverse lookup through index
+    ascii out_name_fmt = ( ascii ) idx:text:project #1.0 < 'skey' > ( .NAME_FMT );
+
+    INSDC:SRA:spot_ids_found  spot_ids_found
+        = ( INSDC:SRA:spot_ids_found ) NCBI:SRA:lookup #1 < 'skey' , 'QUERY_BY_NAME', 2 > ();
+
+
+    /* encoding rules
+     *  the sub-table will provide a platform-specific parser that
+     *  produces as its output a series of NCBI:SRA:spot_name_token
+     *  for each input row in the virtual production "spot_name_tok"
+     *
+     *  the tokenizer will look for X, Y or Q (combined) coordinates
+     *  within the spot name and issue tokens when found, or in the
+     *  case that none are found, an "unrecognized" token is issued.
+     *
+     *  the tokens are then processed here by common rules
+     */
+
+    // .SPOT_NAME gets either empty strings or unrecognized strings
+    physical column < ascii > zip_encoding .SPOT_NAME
+        = NCBI:SRA:extract_spot_name ( NAME, in_spot_name_tok );
+
+    // .NAME_FMT gets either empty strings or unindexed but recognized strings
+    physical column < ascii > zip_encoding .NAME_FMT
+        = NCBI:SRA:extract_name_fmt < 'skey' > ( NAME, in_spot_name_tok );
+
+    // .X, .Y, .T and .L get either empty coordinate or proper coordinate
+    INSDC:coord:val in_name_x_coord
+        = NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:X > ( NAME, in_spot_name_tok );
+    INSDC:coord:val in_name_y_coord
+        = NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:Y > ( NAME, in_spot_name_tok );
+    INSDC:coord:val in_name_t_coord
+        = NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:T > ( NAME, in_spot_name_tok );
+    INSDC:coord:val in_name_l_coord
+        = NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:L > ( NAME, in_spot_name_tok );
+
+
+	/* NCBI:SRA:tbl:skeyname virtual productions
+	 *  in_spot_name_tok
+	 */
+};
diff --git a/interfaces/ncbi/sra.vschema b/interfaces/ncbi/sra.vschema
new file mode 100644
index 0000000..2ad8f94
--- /dev/null
+++ b/interfaces/ncbi/sra.vschema
@@ -0,0 +1,758 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * NCBI Sequence Read Archive schema
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'ncbi/seq.vschema';
+include 'ncbi/spotname.vschema';
+include 'insdc/sra.vschema';
+include 'ncbi/stats.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * types
+ */
+
+
+/* Segment - DEPRECATED
+ *  a ( start, len ) pair where start is a zero-based, unsigned coordinate
+ */
+typedef U16 NCBI:SRA:Segment [ 2 ];
+
+
+/* SpotDesc - DEPRECATED
+ *   uint16_t spot_len;
+ *   uint16_t fixed_len;
+ *   uint16_t signal_len;
+ *   uint16_t clip_qual_right;
+ *   uint8_t num_reads;
+ *   uint8_t align [ 7 ];
+ */
+typedef B8 NCBI:SRA:SpotDesc [ 16 ];
+
+
+/* ReadDesc - DEPRECATED
+ *   SRASegment { uint16_t start, len; } seg;
+ *   uint8_t type;
+ *   char cs_key;
+ *   char label [ 74 ];
+ */
+typedef B8 NCBI:SRA:ReadDesc [ 80 ];
+
+
+// some types have been moved to INSDC
+alias INSDC:SRA:platform_id NCBI:SRA:platform_id;
+alias INSDC:SRA:read_type NCBI:SRA:read_type;
+alias INSDC:SRA:read_filter NCBI:SRA:read_filter;
+
+typedef NCBI:fsamp4 NCBI:SRA:rotated_fsamp4, NCBI:SRA:swapped_fsamp4;
+
+// 16-bit POSITION type
+typedef U16 NCBI:SRA:pos16;
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+/* bio_start
+ *  searches through read_type vector
+ *  returns the 0-based starting coordinate of first biological read
+ *
+ *  "read_start" [ DATA ] - vector of read start coordinates
+ *
+ *  "read_type" [ DATA ] - vector of read types
+ */
+extern function INSDC:coord:zero
+    NCBI:SRA:bio_start #1 ( INSDC:coord:zero read_start, INSDC:SRA:xread_type read_type );
+
+
+/* bio_end
+ *  searcehes through read_type vector
+ *  returns the 0 based ending coording (either inclusive or exclusive) of last
+ *  biological read
+ *
+ *  "read_start" [ DATA ] - vector of read start coordinates
+ *
+ *  "read_type" [ DATA ] - vector of read types
+ *
+ *  "read_len" [ DATA ] - vector of read lengths
+ */
+extern function INSDC:coord:zero
+    NCBI:SRA:bio_end #1 < bool inclusive > ( INSDC:coord:zero read_start, INSDC:SRA:xread_type read_type, INSDC:coord:len read_len );
+
+
+/* fix_read_seg
+ */
+extern function INSDC:coord:len [ 2 ]
+    NCBI:SRA:fix_read_seg #1 ( U16 [ 2 ] rd_seg, INSDC:coord:len spot_len );
+
+
+/* make_spot_desc
+ *  assembles several bits of information together into a "C" structure
+ *
+ *  "spot_len" [ DATA ] - computed spot length value
+ *
+ *  "fixed_len" [ DATA, DFLT ZERO ] - the stated fixed length of all spots
+ *  or zero if not fixed length
+ *
+ *  "sig_len" [ DATA, DFLT ZERO ] - the length of signal/intensity data
+ *  or zero if not present
+ *
+ *  "trim_start" [ DATA ] - the first base included in the trim segment
+ *
+ *  "trim_len" [ DATA ] - the length of the trim segment
+ *
+ *  "num_reads" [ DATA ] - 1..n value
+ */
+extern function NCBI:SRA:SpotDesc NCBI:SRA:make_spot_desc #1 ( INSDC:coord:len spot_len,
+    INSDC:coord:len fixed_len,  INSDC:coord:len sig_len, INSDC:coord:zero trim_start,
+    INSDC:coord:len trim_len, U8 num_reads );
+
+
+/* make_read_desc
+ *  assembles several bits of information together into a "C" structure
+ *  in theory resultant segments may intersect other read segments or leave holes in spot.
+ *
+ *  "num_reads" [ DATA ] - value indicating the resulting row-length of output
+ *
+ *  "read_start" [ DATA ] - ordered starting coordinates for each read
+ *  not required to be sequential.
+ *
+ *  "read_len" [ DATA ] - ordered lengths of each read. may be zero when
+ *  read has been described but is not identified in spot.
+ *
+ *  "read_type" [ DATA ] - ordered type id describing each read
+ *
+ *  "read_filt" [ DATA ] - ordered read filters
+ *
+ *  "cs_key" [ DATA ] - ordered color-space keys
+ *
+ *  "label_start" [ DATA ] - ordered starting coordinates for each label
+ *  "label_len" [ DATA ] - ordered lengths of each label
+ *
+ *  "label" [ DATA ] - complete sequence of label characters, possibly empty
+ *  individual read labels are identified as {start,len} pairs
+ */
+extern function NCBI:SRA:ReadDesc NCBI:SRA:make_read_desc #1 ( U8 num_reads,
+    INSDC:coord:zero read_start, INSDC:coord:len read_len, INSDC:SRA:xread_type read_type,
+    INSDC:SRA:read_filter read_filt, INSDC:dna:text cs_key,
+    INSDC:coord:zero label_start, INSDC:coord:len label_len, ascii label );
+
+
+/* rotate
+ *  rotate a quadruple by called base
+ *  now normally replaced by swap
+ *
+ *  "T" [ TYPE ] - element type of quadruple to be rotated
+ *
+ *  "encoding" [ CONST ] - when true, rotate input left until corresponding
+ *  element is in slot 0. when false, rotate input right to restore original
+ *  order.
+ *
+ *  "in" [ DATA ] - data to be rotated, qualities, signal, intensities...
+ *
+ *  "called" [ DATA ] - {0..3} or {0..4} binary representation of called bases or colors
+ */
+extern function < type T >
+T NCBI:SRA:rotate #1 < bool encoding > ( T in, U8 called );
+
+
+/* swap
+ *  swap element 0 and the called element
+ *  used to ensure that the called element is in slot 0
+ *
+ *  "T" [ TYPE ] - element type of quadruple to be swapped
+ *
+ *  "in" [ DATA ] - data to be swapped, qualities, signal, intensities...
+ *
+ *  "called" [ DATA ] - {0..3} or {0..4} binary representation of called bases or colors
+ */
+extern function < type T >
+T NCBI:SRA:swap #1 ( T in, U8 called );
+
+
+/* normalize
+ * denormalize
+ *
+ *  "T" [ TYPE ] - element type of quadruple to be [de]normalized
+ *
+ *  "intensity" [ DATA ] - intensity data
+ *
+ *  "called" [ DATA ] - {0..3} or {0..4} binary representation of called bases or colors
+ */
+extern function < type T >
+T NCBI:SRA:normalize #1 ( T intensity, U8 called );
+
+extern function < type T >
+T NCBI:SRA:denormalize #1 ( T intensity, U8 called );
+
+
+/* make_position
+ *  return a synthesized position row with 1-1 correspondence
+ *
+ *  "T" [ TYPE ] - position type being generated
+ *
+ *  "start" [ CONST ] - either 0 or 1, depending upon the coordinate system
+ *
+ *  "bases" [ DATA ] - the actual row of bases. the output row
+ *  will be the same length, but with synthesized data
+ */
+extern function < type T >
+T NCBI:SRA:make_position #1 < T start > ( any bases );
+
+/* fsamp4 compression
+ *  performs compression individually
+ *  on called channel and alternate channels
+ */
+function NCBI:SRA:swapped_fsamp4 NCBI:SRA:fsamp4:decode #2 ( merged_fmt in )
+{
+    fzip_fmt cmp0 = split < 0 > ( in );
+    fzip_fmt cmp123 = split < 1 > ( in );
+    F32 ch0 = funzip ( cmp0 );
+    F32 ch123a = funzip ( cmp123 );
+    F32[3] ch123 = redimension ( ch123a );
+    return ( NCBI:SRA:swapped_fsamp4 ) < F32 > paste ( ch0, ch123 );
+}
+
+function merged_fmt NCBI:SRA:fsamp4:encode #2 < U32 called, U32 alt > ( NCBI:SRA:swapped_fsamp4 in )
+{
+    F32 ch0 = < F32 > cut < 0 > ( in );
+    F32[3] ch123 = < F32 > cut < 1, 2, 3 > ( in );
+    fzip_fmt cmp0 = fzip < called > ( ch0 );
+    F32 ch123a = redimension ( ch123 );
+    fzip_fmt cmp123 = fzip < alt > ( ch123a );
+    return merge ( cmp0, cmp123 );
+}
+
+
+/*--------------------------------------------------------------------------
+ * spotdesc
+ *  NCBI implementation productions
+ */
+
+/* history:
+ *  1.0.1 - base explicitly upon sequence #1.0.1, spotdesc #1.0.1
+ *  1.0.2 - spotdesc #1.0.2
+ */
+table NCBI:SRA:tbl:spotdesc_nocol #1.0.2 = INSDC:tbl:sequence #1.0.1, INSDC:SRA:tbl:spotdesc #1.0.2
+{
+    /* LABEL_SEG
+     */
+    readonly column NCBI:SRA:Segment LABEL_SEG
+        = out_label_seg
+        | cast ( out_label_seg32 )
+        | cast ( _out_label_seg32 );
+    U32 _out_label_startU32 = ( U32 ) out_label_start;
+    U32 [ 2 ] _out_label_seg32 = < U32 > paste ( _out_label_startU32, out_label_len );
+
+
+    /* READ_SEG
+     */
+    readonly column NCBI:SRA:Segment READ_SEG
+        = out_read_seg
+        | cast ( out_read_seg32 )
+        | cast ( _out_read_seg32 );
+    U32 _out_read_startU32 = ( U32 ) out_read_start;
+    U32 [ 2 ] _out_read_seg32 = < U32 > paste ( _out_read_startU32, out_read_len );
+
+
+    /* READ_DESC
+     */
+    readonly column NCBI:SRA:ReadDesc READ_DESC
+        = NCBI:SRA:make_read_desc ( out_nreads, out_read_start, out_read_len,
+              out_read_type, _out_rd_filter, out_cs_key, _out_label_start, _out_label_len, _out_label );
+    INSDC:SRA:read_filter _out_rd_filter
+        = out_rd_filter
+        | < INSDC:SRA:read_filter > echo < SRA_READ_FILTER_PASS > ( out_read_start );
+    ascii _out_label
+        = out_label
+        | < ascii > echo < '' > ();
+    INSDC:coord:zero _out_label_start
+        = out_label_start
+        | < INSDC:coord:zero > echo < 0 > ( out_read_start );
+    INSDC:coord:len _out_label_len
+        = out_label_len
+        | < INSDC:coord:len > echo < 0 > ( out_read_start );
+
+    /* SPOT_DESC
+     */
+    readonly column NCBI:SRA:SpotDesc SPOT_DESC
+        = NCBI:SRA:make_spot_desc ( spot_len, fixed_spot_len, signal_len,
+              trim_start, trim_len, out_nreads );
+
+    /* SIGNAL_LEN
+     *  normally the same as spot length when present,
+     *  but in some cases ( e.g. 454 ) it may be different
+     */
+    readonly column INSDC:coord:len SIGNAL_LEN
+        = signal_len;
+    readonly column U16 SIGNAL_LEN
+        = cast ( signal_len );
+
+
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  trim_len
+	 *  out_label
+	 *  out_nreads
+	 *  trim_start
+	 *  out_read_len
+	 *  out_label_len
+	 *  out_rd_filter
+	 *  out_read_type
+	 *  out_read_start
+	 *  out_label_start
+	 *  static_fixed_spot_len
+	 */
+
+	/* NCBI:SRA:tbl:spotdesc_nocol productions
+	 *  out_read_seg
+	 *  out_label_seg
+	 *  out_read_seg32
+	 *  out_label_seg32
+	 */
+};
+
+/* history:
+ *  1.0.1 - base explicitly upon spotdesc_nocol #1.0.1
+ *  1.0.2 - base explicitly upon spotdesc_nocol #1.0.2
+ */
+table NCBI:SRA:tbl:spotdesc_nophys #1.0.2 = NCBI:SRA:tbl:spotdesc_nocol #1.0.2
+{
+    // resolve virtual productions
+    U8 out_nreads = .NREADS; 
+    ascii out_label = .LABEL;
+    INSDC:SRA:xread_type out_read_type = .READ_TYPE;
+    INSDC:SRA:read_filter out_rd_filter  = .RD_FILTER;
+
+    INSDC:coord:zero out_label_start
+        = .LABEL_START
+        | ( INSDC:coord:zero ) < U32 > cut < 0 > ( out_label_seg32 );
+    INSDC:coord:len out_label_len
+        = .LABEL_LEN
+        | ( INSDC:coord:len ) < U32 > cut < 1 > ( out_label_seg32 );
+    U32 [ 2 ] out_label_seg32
+        = cast ( .LABEL_SEG );
+
+    INSDC:coord:zero out_read_start
+        = .READ_START
+        | ( INSDC:coord:zero ) < U32 > cut < 0 > ( out_read_seg32 );
+    INSDC:coord:len out_read_len
+        = .READ_LEN
+        | ( INSDC:coord:len ) < U32 > cut < 1 > ( out_read_seg32 );
+    U32 [ 2 ] out_read_seg32
+        = NCBI:SRA:fix_read_seg ( .READ_SEG, spot_len );
+
+
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  trim_len
+	 *  trim_start
+	 *  out_read_type
+	 *  static_fixed_spot_len
+	 */
+
+	/* NCBI:SRA:tbl:spotdesc_nocol inherited productions
+	 *  out_read_seg
+	 *  out_label_seg
+	 */
+
+	/* NCBI:SRA:tbl:spotdesc_nophys productions
+	 *  .LABEL
+	 *  .NREADS
+	 *  .READ_LEN
+	 *  .READ_SEG
+	 *  .LABEL_LEN
+	 *  .LABEL_SEG
+	 *  .RD_FILTER
+	 *  .READ_TYPE
+	 *  .READ_START
+	 *  .LABEL_START
+	 */
+}
+
+/* history:
+ *  1.0.1 - base explicitly upon spotdesc_nophys #1.0.1
+ *  1.0.2 - base explicitly upon spotdesc_nophys #1.0.2
+ */
+table NCBI:SRA:tbl:spotdesc #1.0.2 = NCBI:SRA:tbl:spotdesc_nophys #1.0.2
+{
+    // physical column encodings
+    // TBD - this has to be looked at, where dynamic segmentation is involved
+    physical column < U8 > zip_encoding .NREADS = NREADS;
+    physical column < ascii > zip_encoding .LABEL = LABEL;
+    physical column < INSDC:coord:zero > izip_encoding .LABEL_START = LABEL_START;
+    physical column < INSDC:coord:len > izip_encoding .LABEL_LEN = LABEL_LEN;
+    physical column < INSDC:coord:zero > izip_encoding .READ_START = READ_START;
+    physical column < INSDC:coord:len > izip_encoding .READ_LEN = in_read_len;
+    physical column < INSDC:SRA:xread_type > zip_encoding .READ_TYPE = in_read_type;
+    physical column < INSDC:SRA:read_filter > zip_encoding .RD_FILTER = READ_FILTER;
+
+
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  trim_len
+	 *  trim_start
+	 *  out_read_type
+	 *  static_fixed_spot_len
+	 */
+
+	/* NCBI:SRA:tbl:spotdesc_nocol inherited productions
+	 *  out_read_seg
+	 *  out_label_seg
+	 */
+};
+
+
+/*--------------------------------------------------------------------------
+ * pos
+ *  synthetic POSITION column on read
+ *
+ * history:
+ *  1.0.1 - base explicitly upon sequence #1.0.1
+ */
+
+table NCBI:SRA:tbl:pos #1.0.1 = INSDC:tbl:sequence #1.0.1
+{
+    INSDC:position:one out_position
+        = < INSDC:position:one > NCBI:SRA:make_position < 1 > ( out_2na_packed )
+        | < INSDC:position:one > NCBI:SRA:make_position < 1 > ( out_2cs_packed );
+    NCBI:SRA:pos16 out_position16
+        = < NCBI:SRA:pos16 > NCBI:SRA:make_position < 1 > ( out_2na_packed )
+        | < NCBI:SRA:pos16 > NCBI:SRA:make_position < 1 > ( out_2cs_packed );
+};
+
+
+/*--------------------------------------------------------------------------
+ * sra
+ *  the NCBI SRA table
+ */
+
+/* history:
+ *  1.0.1 - base explicitly upon sra #1.0.1
+ *  1.0.2 - base explicitly upon sra #1.0.2, spotdesc_nocol #1.0.1
+ *  1.0.3 - base explicitly upon sra #1.0.3, spotdesc_nocol #1.0.2
+ */
+table NCBI:SRA:tbl:sra_nopos #1.0.3 = INSDC:SRA:tbl:sra #1.0.3, NCBI:SRA:tbl:spotdesc_nocol #1.0.2
+{
+    // v1 declares the POSITION column for all tables
+    // but leaves all physical columns unstated
+
+    /* POSITION
+     *  1-based coordinates
+     *  describes a base's position on signal
+     */
+    column INSDC:position:one POSITION = out_position;
+    readonly column NCBI:SRA:pos16 POSITION = out_position16;
+
+    // zero-based coordinates available upon request
+    readonly column INSDC:position:zero POSITION
+        = ( INSDC:position:zero ) < I32 > diff < 1 > ( out_position );
+
+    // statistics
+    U64 base_count
+        = < U64 > meta:value < "BASE_COUNT" > ();
+    U64 spot_count
+        = < U64 > meta:value < ".seq/spot" > ()
+        | < U64 > meta:value < ".seq" > () ;
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  cs_native
+	 *  in_cs_key
+	 *  out_cs_key
+	 *  out_signal
+	 *  in_dna_text
+	 *  out_2cs_bin
+	 *  out_2na_bin
+	 *  out_4na_bin
+	 *  out_dna_text
+	 *  out_x2cs_bin
+	 *  out_x2na_bin
+	 *  in_color_text
+	 *  out_2cs_packed
+	 *  out_2na_packed
+	 *  out_4na_packed
+	 *  out_color_text
+	 *  out_qual_phred
+	 *  out_color_matrix
+	 */
+
+	/* INSDC:SRA:tbl:spotname inherited productions
+	 *  out_x_coord
+	 *  out_y_coord
+	 *  out_name_fmt
+	 *  out_spot_name
+	 *  spot_ids_found
+	 */
+
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  trim_len
+	 *  out_label
+	 *  out_nreads
+	 *  trim_start
+	 *  out_read_len
+	 *  out_label_len
+	 *  out_rd_filter
+	 *  out_read_type
+	 *  out_read_start
+	 *  out_label_start
+	 *  static_fixed_spot_len
+	 */
+
+	/* INSDC:SRA:tbl:stats inherited productions
+	 *  max_spot_id
+	 *  min_spot_id
+	 *  in_stats_bin
+	 *  bio_base_count
+	 */
+
+	/* INSDC:SRA:tbl:sra inherited productions
+	 *  out_platform
+	 *  platform_name
+	 */
+
+	/* NCBI:SRA:tbl:spotdesc_nocol inherited productions
+	 *  out_read_seg
+	 *  out_label_seg
+	 *  out_read_seg32
+	 *  out_label_seg32
+	 */
+
+	/* NCBI:SRA:tbl:sra_nopos productions
+	 *  out_position
+	 *  out_position16
+	 */
+};
+
+/* history:
+ *  1.0.1 - base explicitly upon sra #1.0.1
+ *  1.0.2 - base explicitly upon sra_nopos #1.0.2, pos #1.0.1
+ *  1.0.3 - base explicitly upon sra_nopos #1.0.3
+ */
+table NCBI:SRA:tbl:sra #1.0.3 = NCBI:SRA:tbl:sra_nopos #1.0.3, NCBI:SRA:tbl:pos #1.0.1
+{
+    // the POSITION column is synthesized for all contemporary platforms but 454
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  cs_native
+	 *  in_cs_key
+	 *  out_cs_key
+	 *  out_signal
+	 *  in_dna_text
+	 *  out_2cs_bin
+	 *  out_2na_bin
+	 *  out_4na_bin
+	 *  out_dna_text
+	 *  out_x2cs_bin
+	 *  out_x2na_bin
+	 *  in_color_text
+	 *  out_2cs_packed
+	 *  out_2na_packed
+	 *  out_4na_packed
+	 *  out_color_text
+	 *  out_qual_phred
+	 *  out_color_matrix
+	 */
+
+	/* INSDC:SRA:tbl:spotname inherited productions
+	 *  out_x_coord
+	 *  out_y_coord
+	 *  out_name_fmt
+	 *  out_spot_name
+	 *  spot_ids_found
+	 */
+
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  trim_len
+	 *  out_label
+	 *  out_nreads
+	 *  trim_start
+	 *  out_read_len
+	 *  out_label_len
+	 *  out_rd_filter
+	 *  out_read_type
+	 *  out_read_start
+	 *  out_label_start
+	 *  static_fixed_spot_len
+	 */
+
+	/* INSDC:SRA:tbl:stats inherited productions
+	 *  max_spot_id
+	 *  min_spot_id
+	 *  in_stats_bin
+	 *  bio_base_count
+	 */
+
+	/* INSDC:SRA:tbl:sra inherited productions
+	 *  out_platform
+	 *  platform_name
+	 */
+
+	/* NCBI:SRA:tbl:spotdesc_nocol inherited productions
+	 *  out_read_seg
+	 *  out_label_seg
+	 *  out_read_seg32
+	 *  out_label_seg32
+	 */
+};
+
+
+/* v2 consolidates many of the auxiliary columns into a single treatment
+ * left out are reads, qualities and platform-specific columns
+ *
+ * history:
+ * 2.1.2 - base upon sra #1.0.3, spotdesc #1.0.2, stats #1.1.2
+ */
+table NCBI:SRA:tbl:sra_nopos #2.1.3 = INSDC:SRA:tbl:sra #1.0.3,
+    NCBI:SRA:tbl:skeyname #3.0.1, NCBI:SRA:tbl:spotdesc #1.0.2, NCBI:SRA:tbl:stats #1.2.0
+{
+    // this is already specified in INSDC:SRA:tbl:sra #1
+    // but putting it here will quiet down outputs
+    INSDC:SRA:platform_id out_platform = .PLATFORM;
+    
+    column INSDC:position:one POSITION
+        = out_position;
+    readonly column NCBI:SRA:pos16 POSITION
+        = cast ( _clip_position );
+    INSDC:position:one _clip_position
+        = < INSDC:position:one > clip < 0, 0xFFFF > ( out_position );
+    readonly column INSDC:position:zero POSITION
+        = ( INSDC:position:zero ) < I32 > diff < 1 > ( out_position );
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  cs_native
+	 *  in_cs_key
+	 *  out_cs_key
+	 *  out_signal
+	 *  in_dna_text
+	 *  out_2cs_bin
+	 *  out_2na_bin
+	 *  out_4na_bin
+	 *  out_dna_text
+	 *  out_x2cs_bin
+	 *  out_x2na_bin
+	 *  in_color_text
+	 *  out_2cs_packed
+	 *  out_2na_packed
+	 *  out_4na_packed
+	 *  out_color_text
+	 *  out_qual_phred
+	 *  out_color_matrix
+	 */
+
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  trim_len
+	 *  trim_start
+	 *  out_read_type
+	 *  static_fixed_spot_len
+	 */
+
+	/* INSDC:SRA:tbl:stats inherited productions
+	 *  in_stats_bin
+	 */
+
+	/* INSDC:SRA:tbl:sra inherited productions
+	 *  out_platform
+	 *  platform_name
+	 */
+
+	/* NCBI:SRA:tbl:skeyname inherited productions
+	 *  in_spot_name_tok
+	 */
+
+	/* NCBI:SRA:tbl:spotdesc_nocol inherited productions
+	 *  out_read_seg
+	 *  out_label_seg
+	 */
+
+	/* NCBI:SRA:tbl:sra_nopos productions
+	 *  out_position
+	 */
+};
+
+/* most platforms don't have a native POSITION
+ * mix in "pos" table to synthesize it
+ *
+ * history:
+ *  2.1.2 - base upon sra#1.0.3, spotdesc #1.0.2, stats #1.1.2
+ */
+table NCBI:SRA:tbl:sra #2.1.3 = INSDC:SRA:tbl:sra #1.0.3,
+    NCBI:SRA:tbl:skeyname #3.0.1, NCBI:SRA:tbl:spotdesc #1.0.2,
+    NCBI:SRA:tbl:stats #1.2.0, NCBI:SRA:tbl:pos #1.0.1
+{
+    readonly column INSDC:position:one POSITION
+        = out_position;
+    readonly column NCBI:SRA:pos16 POSITION
+        = out_position16;
+    readonly column INSDC:position:zero POSITION
+        = ( INSDC:position:zero ) < I32 > diff < 1 > ( out_position );
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  cs_native
+	 *  in_cs_key
+	 *  out_cs_key
+	 *  out_signal
+	 *  in_dna_text
+	 *  out_2cs_bin
+	 *  out_2na_bin
+	 *  out_4na_bin
+	 *  out_dna_text
+	 *  out_x2cs_bin
+	 *  out_x2na_bin
+	 *  in_color_text
+	 *  out_2cs_packed
+	 *  out_2na_packed
+	 *  out_4na_packed
+	 *  out_color_text
+	 *  out_qual_phred
+	 *  out_color_matrix
+	 */
+
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  trim_len
+	 *  trim_start
+	 *  out_read_type
+	 *  static_fixed_spot_len
+	 */
+
+	/* INSDC:SRA:tbl:stats inherited productions
+	 *  in_stats_bin
+	 */
+
+	/* INSDC:SRA:tbl:sra inherited productions
+	 *  out_platform
+	 *  platform_name
+	 */
+
+	/* NCBI:SRA:tbl:skeyname inherited productions
+	 *  in_spot_name_tok
+	 */
+};
diff --git a/interfaces/ncbi/stats.vschema b/interfaces/ncbi/stats.vschema
new file mode 100644
index 0000000..c462a8a
--- /dev/null
+++ b/interfaces/ncbi/stats.vschema
@@ -0,0 +1,119 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * NCBI Sequence Read Archive schema
+ */
+version 1;
+
+include 'insdc/sra.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * types
+ */
+typeset NCBI:SRA:stats:qual_type
+{
+    INSDC:quality:phred,
+    INSDC:quality:log_odds,
+    INSDC:quality:log_odds [ 4 ]
+};
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+/*
+   trigger to build meta statistics: spot count, base count, etc.
+ */
+extern function U8 NCBI:SRA:stats_trigger #1
+    ( U8 read_bin, U32 read_len, INSDC:SRA:xread_type read_type * ascii spot_group );
+
+/* trigger to build meta statistics from compressed reads
+ */
+extern function
+U8 NCBI:SRA:cmp_stats_trigger #1 ( B8 cmp_read_bin, NCBI:SRA:stats:qual_type qual_bin,
+    U32 read_len, INSDC:SRA:xread_type read_type * ascii spot_group );
+
+extern function
+U8 NCBI:SRA:cmpf_stats_trigger #1 ( B8 cmp_read_bin, U32 spot_len,
+    U32 read_len, INSDC:SRA:xread_type read_type * ascii spot_group );
+
+
+/* trigger to build phred_quality statistics in meta
+ */
+extern function
+U8 NCBI:SRA:phred_stats_trigger #1 ( INSDC:quality:phred qual_bin );
+
+/*--------------------------------------------------------------------------
+ * table
+ */
+
+/* stats
+ *  holds sequence statistics
+ *
+ * history:
+ *  1.0.1 - explicitly interit from sra #1.0.1
+ *  1.1.0 - incorporate stats from compressed read
+ *  1.1.1 - sra #1.0.2
+ *  1.1.2 - sra #1.0.3 + cmp_base_count or to base_count
+ */
+table NCBI:SRA:tbl:stats #1.2.0 = INSDC:SRA:tbl:stats #1.1, INSDC:SRA:tbl:sra #1.0.3
+{
+    INSDC:SRA:spotid_t min_spot_id
+        = < INSDC:SRA:spotid_t > meta:value < "STATS/TABLE/SPOT_MIN" > ();
+
+    INSDC:SRA:spotid_t max_spot_id
+        = < INSDC:SRA:spotid_t > meta:value < "STATS/TABLE/SPOT_MAX" > ();
+
+    U64 spot_count
+        = < U64 > meta:value < "STATS/TABLE/SPOT_COUNT" > ();
+
+    U64 base_count
+        = < U64 > meta:value < "STATS/TABLE/BASE_COUNT" > ();
+
+    U64 bio_base_count
+        = < U64 > meta:value < "STATS/TABLE/BIO_BASE_COUNT" > ();
+
+    U64 cmp_base_count
+        = < U64 > meta:value < "STATS/TABLE/CMP_BASE_COUNT" > () | base_count;
+
+    trigger meta_stats
+        = NCBI:SRA:stats_trigger ( in_stats_bin, in_read_len, in_read_type, in_spot_group )
+        | NCBI:SRA:stats_trigger ( in_stats_bin, in_read_len, in_read_type )
+        | NCBI:SRA:cmp_stats_trigger ( in_cmp_stats_bin, in_stats_qual, in_read_len, in_read_type, in_spot_group )
+        | NCBI:SRA:cmp_stats_trigger ( in_cmp_stats_bin, in_stats_qual, in_read_len, in_read_type )
+        | NCBI:SRA:cmpf_stats_trigger ( in_cmp_stats_bin, in_spot_len, in_read_len, in_read_type, in_spot_group )
+        | NCBI:SRA:cmpf_stats_trigger ( in_cmp_stats_bin, in_spot_len, in_read_len, in_read_type );
+        
+    trigger qual_stats
+        = NCBI:SRA:phred_stats_trigger #1 ( in_qual_phred );
+
+	/* INSDC:SRA:tbl:stats inherited virtual productions
+	 *  in_stats_bin
+	 */
+};
diff --git a/interfaces/ncbi/varloc.vschema b/interfaces/ncbi/varloc.vschema
new file mode 100644
index 0000000..aad5bd1
--- /dev/null
+++ b/interfaces/ncbi/varloc.vschema
@@ -0,0 +1,204 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * VarLoc table
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'insdc/insdc.vschema';
+include 'ncbi/ncbi.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * types
+ *  http://www.ncbi.nlm.nih.gov/IEB/ToolBox/CPP_DOC/asn_spec/Variation-inst.html
+ */
+typedef U8 NCBI:var:inst:type;
+const NCBI:var:inst:type NCBI:var:inst:value:unknown          = 0;
+const NCBI:var:inst:type NCBI:var:inst:value:identity         = 1;
+const NCBI:var:inst:type NCBI:var:inst:value:inv              = 2;
+const NCBI:var:inst:type NCBI:var:inst:value:snv              = 3;
+const NCBI:var:inst:type NCBI:var:inst:value:mnp              = 4;
+const NCBI:var:inst:type NCBI:var:inst:value:delins           = 5;
+const NCBI:var:inst:type NCBI:var:inst:value:del              = 6;
+const NCBI:var:inst:type NCBI:var:inst:value:ins              = 7;
+const NCBI:var:inst:type NCBI:var:inst:value:microsatellite   = 8;
+const NCBI:var:inst:type NCBI:var:inst:value:transposon       = 9;
+const NCBI:var:inst:type NCBI:var:inst:value:cnv              = 10;
+const NCBI:var:inst:type NCBI:var:inst:value:direct_copy      = 11;
+const NCBI:var:inst:type NCBI:var:inst:value:rev_direct_copy  = 12;
+const NCBI:var:inst:type NCBI:var:inst:value:inverted_copy    = 13;
+const NCBI:var:inst:type NCBI:var:inst:value:everted_copy     = 14;
+const NCBI:var:inst:type NCBI:var:inst:value:translocation    = 15;
+const NCBI:var:inst:type NCBI:var:inst:value:prot_missense    = 16;
+const NCBI:var:inst:type NCBI:var:inst:value:prot_nonsense    = 17;
+const NCBI:var:inst:type NCBI:var:inst:value:prot_neutral     = 18;
+const NCBI:var:inst:type NCBI:var:inst:value:prot_silent      = 19;
+const NCBI:var:inst:type NCBI:var:inst:value:prot_other       = 20;
+const NCBI:var:inst:type NCBI:var:inst:value:other            = 255;
+
+typedef U8 NCBI:var:source:type;
+const NCBI:var:source:type NCBI:var:source:value:dbSNP        = 1;
+const NCBI:var:source:type NCBI:var:source:value:dbVar        = 2;
+const NCBI:var:source:type NCBI:var:source:value:ClinVar      = 3;
+const NCBI:var:source:type NCBI:var:source:value:other        = 10;
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+/* tokenize_var_id
+ *   splits into 2 tokens
+ *   0 - prefix
+ *   1 - suffix
+ */
+extern function
+text:token NCBI:var:tokenize_var_id #1 ( ascii var_id );
+
+
+/*--------------------------------------------------------------------------
+ * varloc
+ *  this name is questionable
+ */
+table NCBI:var:tbl:varloc #1
+{
+    /* SQL schema:
+       var_id             varchar(50),
+       parent_var_id      varchar(50) NULL OKAY,
+       var_type           int,
+       var_source         int,
+       gi                 int,
+       pos_from           int,
+       pos_to             int,
+       entrez_id          int,
+       score              int
+    */
+
+    /* VAR_ID
+     *  example: "rs5852452"
+     */
+    extern column ascii VAR_ID = out_var_id;
+
+    // on input, separate into 3 columns
+    ascii in_var_id = VAR_ID;
+    text:token in_var_id_tok = NCBI:var:tokenize_var_id ( in_var_id );
+    ascii in_var_id_prefix = extract_token < 0 > ( in_var_id, in_var_id_tok );
+    ascii in_var_id_suffix_text = extract_token < 1 > ( in_var_id, in_var_id_tok );
+    U32 in_var_id_suffix = strtonum ( in_var_id_suffix_text );
+
+    // prefix column
+    physical column < ascii > zip_encoding .VAR_ID_PREFIX = in_var_id_prefix;
+    physical column < U32 > izip_encoding .VAR_ID_SUFFIX_LEN = row_len ( in_var_id_suffix_text );
+    physical column < U32 > izip_encoding .VAR_ID_SUFFIX = in_var_id_suffix;
+
+    // on output, restore original id
+    U32 out_var_id_suffix = .VAR_ID_SUFFIX;
+    U32 out_var_id_suffix_len = .VAR_ID_SUFFIX_LEN;
+    ascii out_var_id_prefix = .VAR_ID_PREFIX;
+    ascii out_var_id = sprintf < "%s%0*u" > ( out_var_id_prefix, out_var_id_suffix_len, out_var_id_suffix );
+
+    /* PARENT_VAR_ID
+     *  example: "rs5852452"
+     *  may be EMPTY
+     */
+    extern column ascii PARENT_VAR_ID = out_parent_var_id;
+
+    // same treatment as VAR_ID
+    ascii in_parent_var_id = PARENT_VAR_ID;
+    text:token in_parent_var_id_tok = NCBI:var:tokenize_var_id ( in_parent_var_id );
+    ascii in_parent_var_id_prefix = extract_token < 0 > ( in_parent_var_id, in_parent_var_id_tok );
+    ascii in_parent_var_id_suffix_text = extract_token < 1 > ( in_parent_var_id, in_parent_var_id_tok );
+    U32 in_parent_var_id_suffix = strtonum ( in_parent_var_id_suffix_text );
+    physical column < ascii > zip_encoding .PARENT_VAR_ID_PREFIX = in_parent_var_id_prefix;
+    physical column < U32 > izip_encoding .PARENT_VAR_ID_SUFFIX_LEN = row_len ( in_parent_var_id_suffix_text );
+    physical column < U32 > izip_encoding .PARENT_VAR_ID_SUFFIX = in_parent_var_id_suffix;
+    U32 out_parent_var_id_suffix = .PARENT_VAR_ID_SUFFIX;
+    U32 out_parent_var_id_suffix_len = .PARENT_VAR_ID_SUFFIX_LEN;
+    ascii out_parent_var_id_prefix = .PARENT_VAR_ID_PREFIX;
+    ascii out_parent_var_id = sprintf < "%s%.*u" > ( out_parent_var_id_prefix, out_parent_var_id_suffix_len, out_parent_var_id_suffix );
+
+    /* VAR_TYPE
+     */
+    extern column < NCBI:var:inst:type > zip_encoding VAR_TYPE;
+
+    /* VAR_SOURCE
+     */
+    extern column < NCBI:var:source:type > zip_encoding VAR_SOURCE;
+
+    /* GI
+     */
+    extern column < NCBI:gi > izip_encoding GI;
+
+    /* POS_FROM
+     *  starting position
+     */
+    extern column < INSDC:coord:zero > izip_encoding POS_FROM;
+
+    INSDC:coord:zero in_pos_from = POS_FROM;
+    INSDC:coord:zero out_pos_from = .POS_FROM;
+
+    /* POS_TO
+     *  ending position
+     */
+    extern column INSDC:coord:zero POS_TO = out_pos_to;
+
+    INSDC:coord:zero in_pos_to = POS_TO;
+    INSDC:coord:len in_pos_len = ( INSDC:coord:len ) < I32 > diff < -1 > ( in_pos_to, in_pos_from );
+
+    physical column < INSDC:coord:len > izip_encoding .POS_LEN = in_pos_len;
+
+    INSDC:coord:zero out_pos_len = ( INSDC:coord:zero ) .POS_LEN;
+    INSDC:coord:zero out_pos_to = < INSDC:coord:zero > sum < -1 > ( out_pos_from, out_pos_len );
+
+    /* ENTREZ_ID
+     *  do we need this?
+     */
+    extern column < I32 > izip_encoding ENTREZ_ID;
+
+    /* SCORE
+     */
+    extern column < I32 > izip_encoding SCORE;
+};
+
+table NCBI:var:tbl:hitmap #1
+{
+    extern column U32 MAX_SEQ_LEN;    /* must be static                          */
+    extern column bool_encoding HITS; /* places on the reference with variations */
+};
+
+
+/*--------------------------------------------------------------------------
+ * varloc
+ *  contains the varloc table and hit table
+ */
+database NCBI:var:db:varloc #1
+{
+    table NCBI:var:tbl:varloc VARLOC;
+    table NCBI:var:tbl:hitmap HITMAP;
+};
diff --git a/interfaces/ncbi/vdb-blast-priv.h b/interfaces/ncbi/vdb-blast-priv.h
new file mode 100644
index 0000000..6d4ede6
--- /dev/null
+++ b/interfaces/ncbi/vdb-blast-priv.h
@@ -0,0 +1,53 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ncbi_vdb_blast_priv_
+#define _h_ncbi_vdb_blast_priv_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#include <stddef.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+struct VdbBlast2naReader;
+
+VDB_EXTERN uint64_t CC _VdbBlast2naReaderRead(
+    const struct VdbBlast2naReader *self,
+    uint32_t *status, uint64_t *read_id, size_t *starting_base,
+    uint8_t *buffer, size_t buffer_size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ncbi_vdb_blast_priv_ */
diff --git a/interfaces/ncbi/vdb-blast.h b/interfaces/ncbi/vdb-blast.h
new file mode 100644
index 0000000..165b82c
--- /dev/null
+++ b/interfaces/ncbi/vdb-blast.h
@@ -0,0 +1,606 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ncbi_vdb_blast_
+#define _h_ncbi_vdb_blast_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * defines
+ */
+#ifdef __cplusplus
+#define VDB_BLAST_DECLARE( cls ) \
+    struct cls
+#else
+#define VDB_BLAST_DECLARE( cls ) \
+    typedef struct cls cls
+#endif
+
+/*--------------------------------------------------------------------------
+ * status codes
+ *  NB - TO BE COMPLETED DURING DEVELOPMENT OF TESTS AND INITIAL CODE
+ */
+typedef uint32_t VdbBlastStatus;
+enum
+{
+    eVdbBlastNoErr,
+    eVdbBlastErr,
+    eVdbBlastMemErr,
+    eVdbBlastRunErr,
+    eVdbBlastEndOfSequence,
+    eVdbBlastChunkedSequence,  /* can't hand out direct pointer into cache */
+    eVdbBlastCircularSequence, /* chunked, where the 2nd chunk is a repeat of first */
+    eVdbBlastTooExpensive,
+    eVdbBlastInvalidId, /* an invalid read_id was used as an input parameter:
+                          usually accessing a filtered read via 4naReader */
+    eVdbBlastNotImplemented,
+};
+
+/*------------------------------------------------------------------------------
+ * VdbBlastMgr
+ */
+VDB_BLAST_DECLARE ( VdbBlastMgr );
+
+
+/* Init
+ *  initialize library
+ *
+ *  "status" [ OUT ] - return parameter for status code
+ */
+VDB_EXTERN VdbBlastMgr* CC VdbBlastInit ( VdbBlastStatus *status );
+
+
+/* AddRef
+ *  attach a reference to existing object
+ * Release
+ *  drop reference to object
+ *  deletes object when last reference is gone
+ */
+VDB_EXTERN VdbBlastMgr* CC VdbBlastMgrAddRef ( VdbBlastMgr *self );
+VDB_EXTERN void CC VdbBlastMgrRelease ( VdbBlastMgr *self );
+
+
+/* IsCSraRun
+ *  calls through to VDatabaseIsCSRA
+ *  expensive...
+ */
+VDB_EXTERN bool CC VdbBlastMgrIsCSraRun ( const VdbBlastMgr * self, const char *rundesc );
+
+
+/* OTHER FUNCTIONS FOR CONFIGURING SESSION BEHAVIOR */
+
+
+/*------------------------------------------------------------------------------
+ * VdbBlastRunSet
+ */
+VDB_BLAST_DECLARE ( VdbBlastRunSet );
+
+
+/* MakeRunSet
+ *  create an empty run set
+ *
+ *  "status" [ OUT ] - return parameter for status code
+ *
+ *  "min_read_length" [ IN ] - min-length parameter for filtering
+ *
+ *  "protein" [ IN ] - if true, run set will contain only protein sequences
+ *
+ *  returns NULL upon any error
+ */
+VDB_EXTERN VdbBlastRunSet* CC VdbBlastMgrMakeRunSet ( const VdbBlastMgr *self,
+    VdbBlastStatus *status, uint32_t min_read_length, bool protein );
+
+
+/* AddRef
+ *  attach a reference to existing object
+ * Release
+ *  drop reference to object
+ *  deletes object when last reference is gone
+ */
+VDB_EXTERN VdbBlastRunSet* CC VdbBlastRunSetAddRef ( VdbBlastRunSet *self );
+VDB_EXTERN void CC VdbBlastRunSetRelease ( VdbBlastRunSet *self );
+
+
+/* AddRun
+ *  add a run by accession or path
+ *
+ *  "rundesc" [ IN ] - NUL-terminated UTF-8 string
+ *  giving run accession or path
+ *
+ *  returns status code
+ */
+VDB_EXTERN VdbBlastStatus CC VdbBlastRunSetAddRun ( VdbBlastRunSet *self,
+    const char *rundesc );
+
+
+/* GetNumSequences
+ *  returns the total number of biological sequences in run set
+ * GetNumSequencesApprox
+ *  returns a calculated estimate of the number of biological
+ *  sequences in run set. may be used if the exact count function
+ *  returns "eVdbBlastTooExpensive".
+ */
+VDB_EXTERN uint64_t CC VdbBlastRunSetGetNumSequences
+    ( const VdbBlastRunSet *self, VdbBlastStatus *status );
+VDB_EXTERN uint64_t CC VdbBlastRunSetGetNumSequencesApprox
+    ( const VdbBlastRunSet *self );
+
+
+/* GetTotalLength
+ *  returns the total number of bases in run set
+ * GetTotalLengthApprox
+ *  returns a calculated estimate of the total number
+ *  of bases in run set. may be used if the exact length function
+ *  returns "eVdbBlastTooExpensive".
+ */
+VDB_EXTERN uint64_t CC VdbBlastRunSetGetTotalLength
+    ( const VdbBlastRunSet *self, VdbBlastStatus *status );
+VDB_EXTERN uint64_t CC VdbBlastRunSetGetTotalLengthApprox
+    ( const VdbBlastRunSet *self );
+
+
+/* GetMinSeqLen
+ * GetMaxSeqLen
+ * GetAvgSeqLen
+ *  returns metrics of biological reads
+ *  may be the result of estimated calculations ( see above )
+ */
+VDB_EXTERN uint64_t CC VdbBlastRunSetGetMaxSeqLen
+    ( const VdbBlastRunSet *self );
+VDB_EXTERN uint64_t CC VdbBlastRunSetGetMinSeqLen
+    ( const VdbBlastRunSet *self );
+VDB_EXTERN uint64_t CC VdbBlastRunSetGetAvgSeqLen
+    ( const VdbBlastRunSet *self );
+
+
+/* GetName
+ *  returns the total number of bytes needed for name
+ *  which, if > bsize, means insufficient buffer error
+ *  and if == bsize, means the name is NOT NUL-terminated
+ *  otherwise, the buffer is NUL-terminated as well.
+ */
+VDB_EXTERN size_t CC VdbBlastRunSetGetName ( const VdbBlastRunSet *self,
+    VdbBlastStatus *status, char *name_buffer, size_t bsize );
+
+
+/* IsProtein
+ *  return the boolean value given when the set was created
+ */
+VDB_EXTERN bool CC VdbBlastRunSetIsProtein ( const VdbBlastRunSet *self );
+
+
+#if NOT_DEFERRED
+/* LastUpdatedDate
+ *  request the modification date of the SEQUENCE data
+ *  or the READ DESCRIPTOR data, whichever is more recent
+ */
+VDB_EXTERN time_t CC VdbBlastRunSetLastUpdatedDate ( const VdbBlastRunSet *self );
+#endif
+
+/* GetReadName
+ *  returns the total number of bytes needed for name
+ */
+VDB_EXTERN size_t CC VdbBlastRunSetGetReadName ( const VdbBlastRunSet *self,
+    uint64_t read_id, char *name_buffer, size_t bsize );
+
+/* GetReadId
+ * Inverse function to GetReadName
+ *
+ *  returns status code
+ */
+VDB_EXTERN VdbBlastStatus CC VdbBlastRunSetGetReadId ( const VdbBlastRunSet *self,
+    const char *name_buffer, size_t bsize, uint64_t *read_id );
+
+#if NOT_DEFERRED
+/* GetReadLength
+ *  this API bothers me, because it has the potential of blowing up the cache
+ *  and subverts the guarantee of the readers exclusive use of caches.
+ *  Note that by getting a read and its length using the "Data" functions
+ *  below, you can get the length as cheaply as you would here, at least in
+ *  VDB-2.
+ */
+uint64_t VdbBlastRunSetGetReadLength ( const VdbBlastRunSet *self,
+    uint64_t read_id );
+#endif
+
+
+/*------------------------------------------------------------------------------
+ * VdbBlastReferenceSet
+ */
+VDB_BLAST_DECLARE ( VdbBlastReferenceSet );
+
+
+/* GetReferenceSet
+ *  return a set of all reference ( chromosome ) sequences within run set
+ *  can be empty
+ */
+VDB_EXTERN VdbBlastReferenceSet* CC VdbBlastRunSetMakeReferenceSet
+    ( const VdbBlastRunSet *self, VdbBlastStatus *status );
+
+
+/* AddRef
+ *  attach a reference to existing object
+ * Release
+ *  drop reference to object
+ *  deletes object when last reference is gone
+ */
+VDB_EXTERN VdbBlastReferenceSet* CC VdbBlastReferenceSetAddRef
+    ( VdbBlastReferenceSet *self );
+VDB_EXTERN void CC VdbBlastReferenceSetRelease ( VdbBlastReferenceSet *self );
+
+
+/* GetNumSequences
+ *  Returns the total number of biological sequences in reference set.
+ *  Always returns the exact count.
+ *  Never returns "eVdbBlastTooExpensive".
+ */
+VDB_EXTERN uint64_t CC VdbBlastReferenceSetGetNumSequences
+    ( const VdbBlastReferenceSet *self, VdbBlastStatus *status );
+
+/* GetTotalLength
+ *  Returns the total number of bases in reference set.
+ *  Always returns the exact length.
+ *  Never returns "eVdbBlastTooExpensive".
+ */
+VDB_EXTERN uint64_t CC VdbBlastReferenceSetGetTotalLength
+    ( const VdbBlastReferenceSet *self, VdbBlastStatus *status );
+
+/* GetReadName
+ *  returns the total number of bytes needed for name
+ */
+VDB_EXTERN size_t CC VdbBlastReferenceSetGetReadName (
+    const VdbBlastReferenceSet *self,
+    uint64_t read_id, char *name_buffer, size_t bsize );
+
+VDB_EXTERN VdbBlastStatus CC VdbBlastReferenceSetGetReadId (
+    const VdbBlastReferenceSet *self,
+    const char *name_buffer, size_t bsize, uint64_t *read_id );
+
+/* GetReadLength
+ *  returns the number of bases in reference sequence
+ *
+ * Upon success
+ * the status is set to eVdbBlastNoErr when the reference is not circular
+ * otherwise - to eVdbBlastCircularSequence 
+ */
+VDB_EXTERN uint64_t CC VdbBlastReferenceSetGetReadLength (
+    const VdbBlastReferenceSet *self,
+    uint64_t read_id, VdbBlastStatus *status );
+
+
+/*------------------------------------------------------------------------------
+ * VdbBlastReadSet
+ */
+VDB_BLAST_DECLARE ( VdbBlastReadSet );
+
+
+#if 0
+/* MapHSP
+ *  map a single HSP from result of ReferenceSet blast
+ *  to a slice of all reads within ReadSet that align to the same region
+ */
+VDB_EXTERN VdbBlastReadSet* CC VdbBlastReferenceSetMapHSP ( const VdbBlastReferenceSet * self, ... );
+#endif
+
+
+/* AddRef
+ *  attach a reference to existing object
+ * Release
+ *  drop reference to object
+ *  deletes object when last reference is gone
+ */
+VDB_EXTERN VdbBlastReadSet* CC VdbBlastReadSetAddRef ( VdbBlastReadSet *self );
+VDB_EXTERN void CC VdbBlastReadSetRelease ( VdbBlastReadSet *self );
+
+
+/*------------------------------------------------------------------------------
+ * VdbBlast2naReader
+ */
+VDB_BLAST_DECLARE ( VdbBlast2naReader );
+
+
+/* Make2naReader
+ *  create a reader onto the run set
+ *
+ *  "status" [ OUT ] - return parameter for status code
+ *
+ *  "initial_read_id" [ IN ] - starting position for reader
+ */
+VDB_EXTERN VdbBlast2naReader* CC VdbBlastRunSetMake2naReader
+    ( const VdbBlastRunSet *self, VdbBlastStatus *status,
+      uint64_t initial_read_id );
+
+VDB_EXTERN VdbBlast2naReader* CC VdbBlastReferenceSetMake2naReader
+    ( const VdbBlastReferenceSet *self, VdbBlastStatus *status,
+      uint64_t initial_read_id );
+
+VDB_EXTERN VdbBlast2naReader* CC VdbBlastReadSetMake2naReader
+    ( const VdbBlastReadSet *self, VdbBlastStatus *status,
+      uint64_t initial_read_id );
+
+
+/* AddRef
+ *  attach a reference to existing object
+ * Release
+ *  drop reference to object
+ *  deletes object when last reference is gone
+ */
+VDB_EXTERN VdbBlast2naReader* CC VdbBlast2naReaderAddRef
+    ( VdbBlast2naReader *self );
+VDB_EXTERN void CC VdbBlast2naReaderRelease ( VdbBlast2naReader *self );
+
+
+/* Read
+ *  read a single sequence in packed 2na
+ *
+ *  "status" [ OUT ] - return parameter for status code
+ *
+ *  "read_id" [ OUT ] - id of read that was read
+ *
+ *  "buffer" [ OUT ] and "buffer_size" [ IN ] - externally provided buffer
+ *  for single sequence in packed 2na, where buffer_size is in bytes.
+ *
+ *  returns number of bases read or 0 if no further bases could be read
+ */
+VDB_EXTERN uint64_t CC VdbBlast2naReaderRead ( const VdbBlast2naReader *self,
+    VdbBlastStatus *status, uint64_t *read_id,
+    uint8_t *buffer, size_t buffer_size );
+
+
+/* Data
+ *  read as many sequences as are available
+ *
+ *  "status" [ OUT ] - return parameter for status code
+ *
+ *  "buffer" [ OUT ] and "buffer_len" [ IN ] - externally provided buffer
+ *  for biological read sequences
+ *
+ *  returns number of sequences available in "buffer"
+ *  or 0 if nothing could be read
+ */
+typedef struct Packed2naRead Packed2naRead;
+struct Packed2naRead
+{
+    uint64_t read_id;
+    void *starting_byte;
+    uint32_t offset_to_first_bit;
+    uint32_t length_in_bases;
+};
+
+VDB_EXTERN uint32_t CC VdbBlast2naReaderData ( VdbBlast2naReader *self,
+    VdbBlastStatus *status, Packed2naRead *buffer, uint32_t buffer_length );
+
+
+/*------------------------------------------------------------------------------
+ * VdbBlast4naReader
+ */
+VDB_BLAST_DECLARE ( VdbBlast4naReader );
+
+
+/* Make4naReader
+ *  create a reader onto the run set
+ *
+ *  "status" [ OUT ] - return parameter for status code
+ */
+VDB_EXTERN VdbBlast4naReader* CC VdbBlastRunSetMake4naReader
+    ( const VdbBlastRunSet *self, VdbBlastStatus *status );
+
+VDB_EXTERN VdbBlast4naReader* CC VdbBlastReferenceSetMake4naReader
+    ( const VdbBlastReferenceSet *self, VdbBlastStatus *status );
+
+VDB_EXTERN VdbBlast4naReader* CC VdbBlastReadSetMake4naReader
+    ( const VdbBlastReadSet *self, VdbBlastStatus *status );
+
+
+/* AddRef
+ *  attach a reference to existing object
+ * Release
+ *  drop reference to object
+ *  deletes object when last reference is gone
+ */
+VDB_EXTERN VdbBlast4naReader* CC VdbBlast4naReaderAddRef
+    ( VdbBlast4naReader *self );
+VDB_EXTERN void CC VdbBlast4naReaderRelease ( VdbBlast4naReader *self );
+
+
+/* Read
+ *  read a single sequence in unpacked, std 4na
+ *
+ *  "status" [ OUT ] - return parameter for status code
+ *
+ *  "read_id" [ IN ] - id of read to be read
+ *
+ *  "starting_base" [ IN ] - zero-based starting index into the sequence
+ *
+ *  "buffer" [ OUT ] and "buffer_len" [ IN ] - externally provided buffer
+ *  for single sequence in unpacked 4na
+ *
+ *  returns number of bases read or 0 if no further bases could be read
+ */
+VDB_EXTERN size_t CC VdbBlast4naReaderRead ( const VdbBlast4naReader *self,
+    VdbBlastStatus *status, uint64_t read_id, size_t starting_base,
+    uint8_t *buffer, size_t buffer_length );
+
+
+/* Data
+ *  access cached data
+ *
+ *  "status" [ OUT ] - return parameter for status code
+ *
+ *  "read_id" [ IN ] - id of read to be accessed
+ *
+ *  "length" [ OUT ] - return parameter for sequence length
+ *
+ *  returns pointer to data or NULL upon error
+ */
+VDB_EXTERN const uint8_t* CC VdbBlast4naReaderData
+    ( const VdbBlast4naReader *self,
+      VdbBlastStatus *status, uint64_t read_id, size_t *length );
+
+
+/*------------------------------------------------------------------------------
+ * VdbBlastStdaaReader
+ */
+VDB_BLAST_DECLARE ( VdbBlastStdaaReader );
+
+
+/* MakeStdaaReader
+ *  create a reader onto the run set
+ */
+VDB_EXTERN VdbBlastStdaaReader* CC VdbBlastRunSetMakeStdaaReader
+    ( const VdbBlastRunSet *self, VdbBlastStatus *status );
+
+
+/* AddRef
+ *  attach a reference to existing object
+ * Release
+ *  drop reference to object
+ *  deletes object when last reference is gone
+ */
+VDB_EXTERN VdbBlastStdaaReader* CC VdbBlastStdaaReaderAddRef
+    ( VdbBlastStdaaReader *self );
+VDB_EXTERN void CC VdbBlastStdaaReaderRelease ( VdbBlastStdaaReader *self );
+
+
+/* Read
+ *  read a single sequence in stdaa
+ *
+ *  "status" [ OUT ] - return parameter for status code
+ *
+ *  "pig" [ IN ] - protein id
+ *
+ *  "buffer" [ OUT ] and "buffer_len" [ IN ] - externally provided buffer
+ *  for single sequence in unpacked Stdaa
+ *
+ *  returns number of residues read or 0 upon error
+ */
+VDB_EXTERN size_t CC VdbBlastStdaaReaderRead ( const VdbBlastStdaaReader *self,
+    VdbBlastStatus *status, uint64_t pig,
+    uint8_t *buffer, size_t buffer_length );
+
+
+/* Data
+ *  access cached data
+ *
+ *  "status" [ OUT ] - return parameter for status code
+ *
+ *  "length" [ OUT ] - return parameter for sequence length
+ *
+ *  returns pointer to data or NULL upon error
+ */
+VDB_EXTERN const uint8_t* CC VdbBlastStdaaReaderData
+    ( const VdbBlastStdaaReader *self,
+      VdbBlastStatus *status, uint64_t pig, size_t *length );
+
+
+/* FUNCTIONS TO CONTROL VDB-LIBRARIES LOG GENERATION */
+
+/* KLogLevelSet
+ * set log level of VDB-libraries
+ *
+ * returns status code
+ */
+VDB_EXTERN VdbBlastStatus CC
+VdbBlastMgrKLogLevelSetInfo ( const VdbBlastMgr *self );
+
+VDB_EXTERN VdbBlastStatus CC
+VdbBlastMgrKLogLevelSetWarn ( const VdbBlastMgr *self );
+
+/* for level description see klib/log.h */
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKLogLevelSet ( const VdbBlastMgr *self,
+    uint32_t level );
+
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKStsLevelSet ( const VdbBlastMgr *self,
+    uint32_t level );
+
+/* KLogHandlerSet, KLogLibHandlerSet, KStsHandlerSet, KOutHandlerSet
+ * set logging output handlers for different channels
+ *
+ * returns status code
+ */
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKLogHandlerSetStdOut
+    ( const VdbBlastMgr *self );
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKLogLibHandlerSetStdOut
+    ( const VdbBlastMgr *self );
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKStsHandlerSetStdOut
+    ( const VdbBlastMgr *self );
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKOutHandlerSetStdOut
+    ( const VdbBlastMgr *self );
+
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKLogHandlerSetStdErr
+    ( const VdbBlastMgr *self );
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKLogLibHandlerSetStdErr
+    ( const VdbBlastMgr *self );
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKStsHandlerSetStdErr
+    ( const VdbBlastMgr *self );
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKOutHandlerSetStdErr
+    ( const VdbBlastMgr *self );
+
+
+/*  upon success, the writer will return code 0 */
+typedef uint32_t ( CC * VdbBlastKWrtWriter )
+    ( void * self, const char * buffer, size_t bufsize, size_t * num_writ );
+
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKLogHandlerSet (const VdbBlastMgr *self,
+    VdbBlastKWrtWriter writer, void *data );
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKLogLibHandlerSet
+    ( const VdbBlastMgr *self, VdbBlastKWrtWriter writer, void *data );
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKOutHandlerSet (const VdbBlastMgr *self,
+    VdbBlastKWrtWriter writer, void *data );
+
+
+/* KDbgSetString 
+ * set a string used to turn on debug messages
+ *
+ * returns status code
+ */
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKDbgSetString ( const VdbBlastMgr *self,
+    const char *string );
+
+/* KConfigPrint
+ * print current configuration to the output handler
+ *
+ * returns status code
+ */
+VDB_EXTERN VdbBlastStatus CC VdbBlastMgrKConfigPrint ( const VdbBlastMgr *self );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ncbi_vdb_blast_ */
diff --git a/interfaces/ncbi/wgs-contig.h b/interfaces/ncbi/wgs-contig.h
new file mode 100644
index 0000000..cc547be
--- /dev/null
+++ b/interfaces/ncbi/wgs-contig.h
@@ -0,0 +1,183 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ncbi_wgs_contig_
+#define _h_ncbi_wgs_contig_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*==========================================================================
+ * WGS Contig
+ */
+
+
+/*--------------------------------------------------------------------------
+ * types
+ * constants
+ */
+
+/* component_props
+ *  a signed value describing either contigs or gaps
+ *  where values >= 0 refer to contigs
+ *  and negatives describe gaps
+ */
+typedef int16_t NCBI_WGS_component_props;
+
+/* component description
+ *  the sequencing status of the component
+ *
+ *  These typically correspond to keywords in the INSDC submission.
+ *  Current acceptable values are_
+ *    A           Active Finishing
+ *    D           Draft HTG (often phase1 and phase2 are called Draft,
+ *                whether or not they have the draft keyword).
+ *    F           Finished HTG (phase3)
+ *    G           Whole Genome Finishing
+ *    O           Other sequence (typically means no HTG keyword)
+ *    P           Pre Draft
+ *    W           WGS contig
+ */
+enum
+{
+    NCBI_WGS_component_WGS                  = 0,
+    NCBI_WGS_component_ActiveFinishing      = 1,
+    NCBI_WGS_component_DraftHTG             = 2,
+    NCBI_WGS_component_FinishedHTG          = 3,
+    NCBI_WGS_component_WholeGenomeFinishing = 4,
+    NCBI_WGS_component_OtherSequence        = 5,
+    NCBI_WGS_component_PreDraft             = 6
+};
+
+/* strand
+ *  specifies the orientation of the component relative to scaffold
+ *  values given allow strand to be determined as "prop / 16"
+ *  yielding_
+ *    0           unknown orientation
+ *    1           plus strand
+ *    2           negative strand
+ */
+enum
+{
+    NCBI_WGS_strand_plus                    = 1 * 16,
+    NCBI_WGS_strand_minus                   = 2 * 16
+};
+
+
+/* gap description
+ *  These typically correspond to keywords in the INSDC submission.
+ *  Current acceptable values are_
+ *    N           gap with specified size
+ *    U           gap of unknown size, defaulting to 100 bases.
+ */
+enum
+{
+    NCBI_WGS_gap_known                      = 1 * -1,
+    NCBI_WGS_gap_unknown                    = 2 * -1
+};
+
+/* gap_linkage
+ * Describes linkage and linkage evidence
+ */
+typedef int32_t NCBI_WGS_gap_linkage;
+
+/* gap type
+ *  scaffold          a gap between two sequence contigs in a scaffold
+ *  contig            an unspanned gap between two sequence contigs
+ *  centromere        a gap inserted for the centromere
+ *  short_arm         a gap inserted at the start of an acrocentric chromosome
+ *  heterochromatin   a gap inserted for an especially large region of heterochromatic sequence
+ *  telomere          a gap inserted for the telomere
+ *  repeat            an unresolvable repeat
+ */
+enum
+{
+    NCBI_WGS_gap_scaffold                   = 1 * -4,
+    NCBI_WGS_gap_contig                     = 2 * -4,
+    NCBI_WGS_gap_centromere                 = 3 * -4,
+    NCBI_WGS_gap_short_arm                  = 4 * -4,
+    NCBI_WGS_gap_heterochromatin            = 5 * -4,
+    NCBI_WGS_gap_telomere                   = 6 * -4,
+    NCBI_WGS_gap_repeat                     = 7 * -4
+};
+
+/* gap linkage evidence
+ *  paired-ends       paired sequences from the two ends of a DNA fragment
+ *  align_genus       alignment to a reference genome within the same genus
+ *  align_xgenus      alignment to a reference genome within another genus
+ *  align_trnscpt     alignment to a transcript from the same species
+ *  within_clone      sequence on both sides of the gap is derived from
+ *                    the same clone, but the gap is not spanned by paired-ends
+ *  clone_contig      linkage is provided by a clone contig in the tiling path
+ *  map               linkage asserted using a non-sequence based map
+ *                    such as RH, linkage, fingerprint or optical
+ *  strobe            strobe sequencing (PacBio)
+ *  unspecified
+ */
+enum
+{
+    NCBI_WGS_gap_linkage_linked                      = 1,
+    NCBI_WGS_gap_linkage_evidence_paired_ends        = 2,
+    NCBI_WGS_gap_linkage_evidence_align_genus        = 4,
+    NCBI_WGS_gap_linkage_evidence_align_xgenus       = 8,
+    NCBI_WGS_gap_linkage_evidence_align_trnscpt      = 16,
+    NCBI_WGS_gap_linkage_evidence_within_clone       = 32,
+    NCBI_WGS_gap_linkage_evidence_clone_contig       = 64,
+    NCBI_WGS_gap_linkage_evidence_map                = 128,
+    NCBI_WGS_gap_linkage_evidence_strobe             = 256,
+    NCBI_WGS_gap_linkage_evidence_unspecified        = 512,
+    NCBI_WGS_gap_linkage_evidence_pcr                = 1024
+};
+
+
+/*--------------------------------------------------------------------------
+ * accession tokenization constants
+ */
+
+/* tokenize_nuc_accession
+ * tokenize_prot_accession
+ *  scans name on input
+ *  tokenizes into parts
+ */
+enum
+{
+    NCBI_WGS_acc_token_unrecognized =  1,
+    NCBI_WGS_acc_token_prefix       =  2,
+    NCBI_WGS_acc_token_contig       =  3
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ncbi_wgs_contig_ */
diff --git a/interfaces/ncbi/wgs-contig.vschema b/interfaces/ncbi/wgs-contig.vschema
new file mode 100644
index 0000000..457df81
--- /dev/null
+++ b/interfaces/ncbi/wgs-contig.vschema
@@ -0,0 +1,695 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * WGS Contig
+ */
+version 1;
+
+include 'vdb/vdb.vschema';
+include 'ncbi/ncbi.vschema';
+include 'ncbi/seq.vschema';
+include 'ncbi/spotname.vschema';
+include 'ncbi/stats.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * types
+ * constants
+ */
+
+/* component_props
+ *  a signed value describing contig or gap components of scaffolds, or
+ *  gaps in contig sequences.
+ *  Positive values refer to contigs and negatives describe gaps
+ */
+typedef I16 NCBI:WGS:component_props;
+
+/* component description
+ *  the sequencing status of the component
+ *
+ *  These typically correspond to keywords in the INSDC submission.
+ *  Current acceptable values are:
+ *    A           Active Finishing
+ *    D           Draft HTG (often phase1 and phase2 are called Draft,
+ *                whether or not they have the draft keyword).
+ *    F           Finished HTG (phase3)
+ *    G           Whole Genome Finishing
+ *    O           Other sequence (typically means no HTG keyword)
+ *    P           Pre Draft
+ *    W           WGS contig
+ */
+const NCBI:WGS:component_props NCBI:WGS:component:WGS                  = 0;
+const NCBI:WGS:component_props NCBI:WGS:component:ActiveFinishing      = 1;
+const NCBI:WGS:component_props NCBI:WGS:component:DraftHTG             = 2;
+const NCBI:WGS:component_props NCBI:WGS:component:FinishedHTG          = 3;
+const NCBI:WGS:component_props NCBI:WGS:component:WholeGenomeFinishing = 4;
+const NCBI:WGS:component_props NCBI:WGS:component:OtherSequence        = 5;
+const NCBI:WGS:component_props NCBI:WGS:component:PreDraft             = 6;
+
+/* strand
+ *  specifies the orientation of the component relative to scaffold
+ *  values given allow strand to be determined as "prop / 16"
+ *  yielding:
+ *    0           unknown orientation
+ *    1           plus strand
+ *    2           negative strand
+ */
+const NCBI:WGS:component_props NCBI:WGS:strand:plus                    = 16;
+const NCBI:WGS:component_props NCBI:WGS:strand:minus                   = 32;
+
+
+/* gap description
+ *  These typically correspond to keywords in the INSDC submission.
+ *  Current acceptable values are:
+ *    N           gap with specified size
+ *    U           gap of unknown size, defaulting to 100 bases.
+ */
+const NCBI:WGS:component_props NCBI:WGS:gap:known                      = -1;
+const NCBI:WGS:component_props NCBI:WGS:gap:unknown                    = -2;
+
+/* gap type
+ *  scaffold          a gap between two sequence contigs in a scaffold
+ *  contig            an unspanned gap between two sequence contigs
+ *  centromere        a gap inserted for the centromere
+ *  short_arm         a gap inserted at the start of an acrocentric chromosome
+ *  heterochromatin   a gap inserted for an especially large region of heterochromatic sequence
+ *  telomere          a gap inserted for the telomere
+ *  repeat            an unresolvable repeat
+ */
+const NCBI:WGS:component_props NCBI:WGS:gap:scaffold                   = -4;
+const NCBI:WGS:component_props NCBI:WGS:gap:contig                     = -8;
+const NCBI:WGS:component_props NCBI:WGS:gap:centromere                 = -12;
+const NCBI:WGS:component_props NCBI:WGS:gap:short_arm                  = -16;
+const NCBI:WGS:component_props NCBI:WGS:gap:heterochromatin            = -20;
+const NCBI:WGS:component_props NCBI:WGS:gap:telomere                   = -24;
+const NCBI:WGS:component_props NCBI:WGS:gap:repeat                     = -28;
+
+/* gap_linkage
+ */
+typedef I32 NCBI:WGS:gap_linkage;
+
+/* gap linkage and linkage evidence 
+ * There can be multiple linkage evidences or linkage with no evidence
+ * 
+ *  paired-ends       paired sequences from the two ends of a DNA fragment
+ *  align_genus       alignment to a reference genome within the same genus
+ *  align_xgenus      alignment to a reference genome within another genus
+ *  align_trnscpt     alignment to a transcript from the same species
+ *  within_clone      sequence on both sides of the gap is derived from
+ *                    the same clone, but the gap is not spanned by paired-ends
+ *  clone_contig      linkage is provided by a clone contig in the tiling path
+ *  map               linkage asserted using a non-sequence based map
+ *                    such as RH, linkage, fingerprint or optical
+ *  strobe            strobe sequencing (PacBio)
+ *  unspecified
+ *  pcr               PCR
+ */
+const NCBI:WGS:gap_linkage NCBI:WGS:gap:linkage:linked                 = 1;
+const NCBI:WGS:gap_linkage NCBI:WGS:gap:linkage_evidence:paired_ends   = 2;
+const NCBI:WGS:gap_linkage NCBI:WGS:gap:linkage_evidence:align_genus   = 4;
+const NCBI:WGS:gap_linkage NCBI:WGS:gap:linkage_evidence:align_xgenus  = 8;
+const NCBI:WGS:gap_linkage NCBI:WGS:gap:linkage_evidence:align_trnscpt = 16;
+const NCBI:WGS:gap_linkage NCBI:WGS:gap:linkage_evidence:within_clone  = 32;
+const NCBI:WGS:gap_linkage NCBI:WGS:gap:linkage_evidence:clone_contig  = 64;
+const NCBI:WGS:gap_linkage NCBI:WGS:gap:linkage_evidence:map           = 128;
+const NCBI:WGS:gap_linkage NCBI:WGS:gap:linkage_evidence:strobe        = 256;
+const NCBI:WGS:gap_linkage NCBI:WGS:gap:linkage_evidence:unspecified   = 512;
+const NCBI:WGS:gap_linkage NCBI:WGS:gap:linkage_evidence:pcr           = 1024;
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+/* tokenize_nuc_accession
+ * tokenize_prot_accession
+ *  scans name on input
+ *  tokenizes into parts
+ */
+extern function text:token
+    NCBI:WGS:tokenize_nuc_accession #1 ( ascii acc );
+extern function text:token
+    NCBI:WGS:tokenize_prot_accession #1 ( ascii acc );
+
+const U16 NCBI:WGS:acc_token:unrecognized =  1;
+const U16 NCBI:WGS:acc_token:prefix       =  2;
+const U16 NCBI:WGS:acc_token:contig       =  3;
+
+
+/* build_scaffold_read
+ *  assembles contigs and gaps into a single row
+ *  transcribes + strand contigs as they are,
+ *  performs reverse complement of - strand contigs,
+ *  fills gaps with stated number of N
+ *
+ * build_scaffold_quality
+ *  assembles contig and gap qualities into a single row
+ *  contig qualities are taken as they are,
+ *  gap qualities are assigned a constant
+ *
+ *  "component_start" [ DATA ] - starting locations on each
+ *   component or 0 for gaps. normal starting point is 0,
+ *   but offsets are supported.
+ *  NB - ONE-BASED COORDINATES
+ *
+ *  "component_len" [ DATA ] - length of contig sequence
+ *   from component_start, or length of gap, projected onto
+ *   scaffold at scaffold_start.
+ *
+ *  "component_props" [ DATA ] - see discussion of type
+ *   distinguish between contigs and gaps, indicate strand
+ *
+ *  "component_id" [ DATA ] - foreign keys into SEQUENCE table
+ *   row_len ( component_id ) == count-of-contigs ( component_props )
+ */
+extern function INSDC:4na:bin NCBI:WGS:build_scaffold_read #1
+    ( INSDC:coord:one component_start, INSDC:coord:len component_len,
+      NCBI:WGS:component_props component_props, I64 component_id );
+
+extern function INSDC:quality:phred NCBI:WGS:build_scaffold_qual #1
+    ( INSDC:coord:one component_start, INSDC:coord:len component_len,
+      NCBI:WGS:component_props component_props, I64 component_id );
+
+
+/* build_read_type
+ *  generate standard SRA read type from component properties
+ *  contigs are biological, gaps are technical
+ *
+ *  "component_props" [ DATA ] - see discussion of type
+ *   distinguish between contigs and gaps, indicate strand
+ */
+extern function INSDC:SRA:xread_type
+    NCBI:WGS:build_read_type #1 ( NCBI:WGS:component_props component_props );
+
+
+/*--------------------------------------------------------------------------
+ * nucleotide
+ */
+table NCBI:WGS:tbl:nucleotide #1.1
+    = NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.4
+    , NCBI:SRA:tbl:stats #1.2.0
+{
+    /* ACCESSION
+     *  [<opt-prefix>]<4-letter-prefix><2-digit-version><6-or-7-digit-contig>
+     */
+    extern column ascii ACCESSION = out_accession;
+    extern column U32   ACC_VERSION = .ACC_VERSION | <U32> echo <1> ();
+
+    // input
+    ascii in_accession = ACCESSION;
+
+    // parsed input
+    text:token in_acc_token
+        = NCBI:WGS:tokenize_nuc_accession ( in_accession );
+    //  [<opt-prefix>]<4-letter-prefix><2-digit-version>
+    ascii in_acc_prefix
+        = extract_token < 0 > ( in_accession, in_acc_token );
+    // <6-or-7-digit-contig>
+    ascii in_contig_text
+        = extract_token < 1 > ( in_accession, in_acc_token );
+    U32 in_contig_len
+        = row_len ( in_contig_text );
+    U64 in_contig_bin
+        = strtonum ( in_contig_text );
+
+    // physical storage
+    physical column < ascii > zip_encoding .ACC_PREFIX = in_acc_prefix;
+    physical column < U32 > izip_encoding .ACC_CONTIG_LEN = in_contig_len;
+    physical column < U64 > izip_encoding .ACC_CONTIG = in_contig_bin;
+    physical column < U32 > izip_encoding .ACC_VERSION = ACC_VERSION; //needed to back-fill WGS data from ID where version may be > 1
+
+    // output
+    ascii out_acc_prefix
+        = .ACC_PREFIX
+        | < ascii > meta:read < 'ACC_PREFIX', true > ()
+        ;
+    U32 out_acc_contig_len
+        = .ACC_CONTIG_LEN
+        | < U32 > meta:value < 'ACC_CONTIG_LEN', true > ()
+        ;
+    U64 out_acc_contig
+        = .ACC_CONTIG
+        | ( U64 ) row_id ()
+        ;
+    ascii out_accession
+        = sprintf < "%s%0*u" > ( out_acc_prefix, out_acc_contig_len, out_acc_contig );
+
+    readonly column ascii ACC_PREFIX
+        = .ACC_PREFIX
+        | < ascii > meta:read < 'ACC_PREFIX', true > ()
+        ;
+    readonly column U32 ACC_CONTIG_LEN
+        = .ACC_CONTIG_LEN
+        | < U32 > meta:value < 'ACC_CONTIG_LEN', true > ()
+        ;
+
+    /* CONTIG_NAME
+     *  principal name
+     */
+    extern column utf8 CONTIG_NAME
+        = idx:text:project #1.0 < 'contig_name' > ( .CONTIG_NAME );
+
+    physical column < utf8 > zip_encoding .CONTIG_NAME
+        = idx:text:insert #1.0 < 'contig_name' > ( CONTIG_NAME );
+
+    ascii out_contig_name = cast ( CONTIG_NAME );
+
+    // NB - this is only useful if CONTIG_NAME is unique
+    // or if clustered by CONTIG_NAME
+    readonly column vdb:row_id_range CONTIG_NAME_ROW_RANGE
+        = idx:text:lookup #1.0 < 'contig_name', 'NAME_QUERY' > ();
+
+    /* EXTRA_SEQIDS
+     *  pipe-separated list of additional names
+     */
+    extern column < ascii > zip_encoding EXTRA_SEQIDS;
+
+    /* TITLE
+     */
+    extern column < ascii > zip_encoding TITLE;
+
+    /* GI
+     *  gi is indexed in a parallel table
+     */
+    extern column < NCBI:gi > izip_encoding GI;
+
+    /* TAXID
+     *  taxonomy id
+     */
+    extern column < NCBI:taxid > izip_encoding TAXID;
+
+    /* GB_STATE
+     *  genbank state
+     */
+    extern column < NCBI:gb_state > izip_encoding GB_STATE;
+
+    /* DESCR
+     *  ASN.1 description
+     */
+    extern column < NCBI:asn:binary > zip_encoding DESCR;
+
+    /* ANNOT
+     *  ASN.1 annotation
+     */
+    extern column < NCBI:asn:binary > zip_encoding ANNOT;
+
+    /* GAP_START
+     *  Starting position of a gap
+     */
+    extern column < INSDC:coord:zero > izip_encoding GAP_START;
+
+    /* GAP_LEN
+     *  Length of a gap
+     */
+    extern column < INSDC:coord:len > izip_encoding GAP_LEN;
+
+    /* GAP_PROPS
+     *  See description of type
+     */
+    extern column < NCBI:WGS:component_props > zip_encoding GAP_PROPS;
+
+    /* GAP_LINKAGE
+     *  See description of type
+     */
+    extern column < NCBI:WGS:gap_linkage> zip_encoding GAP_LINKAGE;
+
+
+    ascii out_seqid_gi = sprintf < "gi|%u" > ( .GI );
+    ascii out_seqid_gb = sprintf < "gb|%s.%u|" > ( out_accession, ACC_VERSION )
+                       | sprintf < "gb|%s.1|" > ( out_accession );
+    ascii out_seqid_gnl = sprintf < "gnl|WGS:%s|%s" > (.ACC_PREFIX, out_contig_name ) | <ascii> echo < '' > ();
+
+
+    /* outputs to spotname */
+    ascii out_seqid_name
+        = sprintf < "%s|%s" > ( out_seqid_gi , out_seqid_gb )
+		| sprintf < "%s" > ( out_seqid_gb );
+
+    ascii out_spot_name = sprintf < "%s %s" > ( out_seqid_name, .TITLE );
+
+    readonly column ascii SEQ_ID = out_seqid_name;
+    readonly column ascii SEQ_ID_GNL = out_seqid_gnl;
+
+    /* outputs to spotdesc */
+    // INSDC:coord:len in_read_len  = (INSDC:coord:len) row_len ( in_2na_bin );
+    INSDC:coord:len  out_read_len = (INSDC:coord:len) row_len ( out_2na_bin );
+    INSDC:coord:len  trim_len = (INSDC:coord:len) row_len ( out_2na_bin );
+    INSDC:coord:zero out_read_start = <INSDC:coord:zero> echo < 0 > ();
+    INSDC:coord:zero trim_start = <INSDC:coord:zero> echo < 0 > ();
+    INSDC:SRA:read_filter out_rd_filter = < INSDC:SRA:read_filter > echo < SRA_READ_FILTER_PASS > ();
+    INSDC:SRA:xread_type  out_read_type = < INSDC:SRA:xread_type > echo < SRA_READ_TYPE_BIOLOGICAL > ();
+    // help trigger statistics
+    INSDC:SRA:xread_type  _alt_in_read_type = < INSDC:SRA:xread_type > echo < SRA_READ_TYPE_BIOLOGICAL > ();
+    INSDC:coord:len       _alt_in_read_len  = (INSDC:coord:len) row_len ( in_2na_bin );
+
+    ascii out_label = < ascii > echo < "contig" > ();
+    INSDC:coord:len out_label_len = < INSDC:coord:len > echo < 6 > ();
+    INSDC:coord:zero out_label_start = < INSDC:coord:zero > echo < 0 > ();
+
+    INSDC:SRA:platform_id out_platform = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_UNDEFINED > ();
+};
+
+
+/*--------------------------------------------------------------------------
+ * protein
+ *  contig
+ */
+table NCBI:WGS:tbl:protein #1
+    = NCBI:tbl:protein #1.0.0
+{
+    /* ACCESSION
+     *  [<opt-prefix>]<4-letter-prefix><2-digit-version><6-or-7-digit-contig>
+     */
+    extern column ascii ACCESSION = out_accession;
+
+    // input
+    ascii in_accession = ACCESSION;
+
+    // parsed input
+    text:token in_acc_token
+        = NCBI:WGS:tokenize_prot_accession ( in_accession );
+    //  [<opt-prefix>]<4-letter-prefix><2-digit-version>
+    ascii in_acc_prefix
+        = extract_token < 0 > ( in_accession, in_acc_token );
+    // <6-or-7-digit-contig>
+    ascii in_contig_text
+        = extract_token < 1 > ( in_accession, in_acc_token );
+    U32 in_contig_len
+        = row_len ( in_contig_text );
+    I64 in_contig_bin
+        = strtonum ( in_contig_text );
+
+    // physical storage
+    physical column < ascii > zip_encoding .ACC_PREFIX = in_acc_prefix;
+    physical column < U32 > izip_encoding .ACC_CONTIG_LEN = in_contig_len;
+    physical column < U64 > izip_encoding .ACC_CONTIG = in_contig_bin;
+
+    // output
+    ascii out_acc_prefix
+        = .ACC_PREFIX
+        | < ascii > meta:read < 'ACC_PREFIX', true > ()
+        ;
+    U32 out_acc_contig_len
+        = .ACC_CONTIG_LEN
+        | < U32 > meta:value < 'ACC_CONTIG_LEN', true > ()
+        ;
+    U64 out_acc_contig
+        = .ACC_CONTIG
+        | ( U64 ) row_id ()
+        ;
+    ascii out_accession
+        = sprintf < "%s%0*u" > ( out_acc_prefix, out_acc_contig_len, out_acc_contig );
+
+    /* TITLE
+     */
+    extern column < ascii > zip_encoding TITLE;
+
+    /* GI
+     *  gi is indexed in a parallel table
+     */
+    extern column < NCBI:gi > izip_encoding GI;
+
+    /* GB_STATE
+     *  genbank state
+     */
+    extern column < NCBI:gb_state > izip_encoding GB_STATE;
+
+    /* DESCR
+     *  ASN.1 description
+     */
+    extern column < NCBI:asn:binary > zip_encoding DESCR;
+
+    /* ANNOT
+     *  ASN.1 annotation
+     */
+    extern column < NCBI:asn:binary > zip_encoding ANNOT;
+
+    /* outputs to spotname */
+    ascii out_seqid_name = sprintf < "TBD" > ( .ACC_PREFIX, out_accession );
+    ascii out_spot_name = sprintf < "%s %s" > ( out_seqid_name, .TITLE );
+
+    /* TBD
+     *  need to create an extension to NCBI:tbl:protein
+     *  that satisfies fastq-dump requirements for READ and QUALITY
+     */
+};
+
+
+/*--------------------------------------------------------------------------
+ * gi_idx
+ *  gi is row-id
+ */
+table NCBI:WGS:tbl:gi_idx #1
+{
+    /* NUC_ROW_ID
+     *  row-id in nucleotide table
+     */
+    extern column < I64 > izip_encoding NUC_ROW_ID;
+
+    /* PROT_ROW_ID
+     *  row-id in protein table
+     */
+    extern column < I64 > izip_encoding PROT_ROW_ID;
+};
+
+
+/*--------------------------------------------------------------------------
+ * scaffold
+ *  records AGP data
+ */
+table NCBI:WGS:tbl:scaffold #1
+{
+    /* SCAFFOLD_NAME
+     *  This is the identifier for the object being assembled.
+     *  This can be a chromosome, scaffold or contig.
+     *  If an accession.version identifier is not used to describe
+     *  the object the naming convention is to precede chromosome numbers
+     *  (e.g. chr1) and linkage group numbers  (e.g. LG3).
+     *  Contigs or scaffolds may have any identifier that is unique
+     *  within the assembly
+     */
+    extern column utf8 SCAFFOLD_NAME
+        = out_scaffold_name;
+    extern column ascii SCAFFOLD_NAME = cast (out_scaffold_name);
+    utf8 out_scaffold_name
+        = idx:text:project #1.0 < 'scaffold_name' > ( .SCAFFOLD_NAME );
+    physical column < utf8 > zip_encoding .SCAFFOLD_NAME
+        = idx:text:insert #1.0 < 'scaffold_name' > ( SCAFFOLD_NAME );
+
+    /* COMPONENT_START
+     *  starting position within the component sequence
+     */
+    extern column < INSDC:coord:one > izip_encoding COMPONENT_START;
+
+    /* COMPONENT_LEN
+     *  length of the component/gap projected onto the scaffold
+     */
+    extern column < INSDC:coord:len > izip_encoding COMPONENT_LEN;
+
+    /* COMPONENT_PROPS
+     *  see description of type
+     */
+    extern column < NCBI:WGS:component_props > zip_encoding COMPONENT_PROPS;
+
+    /* COMPONENT_ID
+     *  one row-id for each non-gap component
+     */
+    extern column < I64 > izip_encoding COMPONENT_ID;
+
+    /* COMPONENT_LINKAGE
+     *  see description of type
+     *  one row-id for each gap component
+     */
+    extern column < NCBI:WGS:gap_linkage > zip_encoding COMPONENT_LINKAGE;
+}
+
+table NCBI:WGS:view:scaffold #1 = NCBI:WGS:tbl:scaffold #1
+{
+    /* ACCESSION
+     *  scaffold accession
+     */
+    readonly column ascii ACCESSION
+        = out_accession;
+    I64 scaffold_row_id
+        = row_id ();
+    I64 acc_row_id
+        = < I64 > echo < 1 > ();
+    ascii acc_prefix
+        = < ascii > simple_sub_select < 'SEQUENCE', 'ACC_PREFIX' > ( acc_row_id );
+    U32 acc_contig_len
+        = < U32 > simple_sub_select < 'SEQUENCE', 'ACC_CONTIG_LEN' > ( acc_row_id );
+    ascii out_accession
+        = sprintf < "%sS%0*d" > ( acc_prefix, acc_contig_len, scaffold_row_id );
+
+    /* READ
+     *  base space construction of entire scaffold
+     */
+
+    // construct the read from contigs and gaps
+    INSDC:4na:bin out_4na_bin = NCBI:WGS:build_scaffold_read
+        ( .COMPONENT_START, .COMPONENT_LEN, .COMPONENT_PROPS, .COMPONENT_ID );
+
+    // various READ columns
+    default readonly column INSDC:dna:text READ
+        = < INSDC:4na:bin, INSDC:dna:text > map < INSDC:4na:map:BINSET, INSDC:4na:map:CHARSET > ( out_4na_bin );
+    readonly column INSDC:4na:bin READ
+        = out_4na_bin;
+    readonly column INSDC:4na:packed READ
+        = pack ( out_4na_bin );
+    readonly column INSDC:x2na:bin READ
+        = out_x2na_bin;
+    INSDC:x2na:bin out_x2na_bin
+        = < INSDC:4na:bin, INSDC:x2na:bin > map < INSDC:4na:map:BINSET, [ 4,0,1,4,2,4,4,4,3,4,4,4,4,4,4,4 ] > ( out_4na_bin );
+    readonly column INSDC:2na:bin READ
+        = out_2na_bin;
+    INSDC:2na:bin out_2na_bin
+        = < INSDC:x2na:bin, INSDC:2na:bin > map < INSDC:x2na:map:BINSET, [ 0, 1, 2, 3, 0 ] > ( out_x2na_bin );
+    readonly column INSDC:2na:packed READ
+        = pack ( out_2na_bin );
+
+
+    /* CSREAD
+     *  base space converted to color space
+     */
+    default readonly column INSDC:color:text CSREAD
+        = < INSDC:x2cs:bin, INSDC:color:text > map <  INSDC:x2cs:map:BINSET, INSDC:x2cs:map:CHARSET > ( out_x2cs_bin );
+    readonly column INSDC:x2cs:bin CSREAD
+        = out_x2cs_bin;
+    INSDC:x2cs:bin out_x2cs_bin
+        = NCBI:color_from_dna ( out_x2na_bin, out_read_start, .COMPONENT_LEN, out_cs_key, out_color_matrix );
+    readonly column INSDC:2cs:bin CSREAD
+        = out_2cs_bin;
+    INSDC:2cs:bin out_2cs_bin
+        = < INSDC:x2cs:bin, INSDC:2cs:bin > map < INSDC:x2cs:map:BINSET, [ 0, 1, 2, 3, 0 ] > ( out_x2cs_bin );
+    readonly column INSDC:2cs:packed CSREAD
+        = pack ( out_2cs_bin );
+
+    /* CS_NATIVE
+     *  is color-space the native sequence space
+     */
+    readonly column bool CS_NATIVE
+        = < bool > echo < false > ();
+
+    /* CS_KEY
+     *  leading call given in base-space
+     */
+    readonly column INSDC:dna:text CS_KEY
+        = out_cs_key;
+    INSDC:dna:text out_cs_key
+        = < INSDC:dna:text > echo < 'T' > ( .COMPONENT_LEN );
+
+    /* COLOR_MATRIX
+     *  matrix used for color-space conversions
+     */
+    readonly column U8 COLOR_MATRIX
+        = out_color_matrix;
+    U8 out_color_matrix
+        = < U8 > echo < INSDC:color:default_matrix > ();
+
+
+    /* QUALITY
+     *  base or color call qualities
+     */
+    INSDC:quality:phred out_qual_phred = NCBI:WGS:build_scaffold_qual
+        ( .COMPONENT_START, .COMPONENT_LEN, .COMPONENT_PROPS, .COMPONENT_ID );
+
+    // PHRED is default
+    default readonly column INSDC:quality:phred QUALITY
+        = out_qual_phred;
+
+    // textual encodings
+    readonly column INSDC:quality:text:phred_33 QUALITY
+        = ( INSDC:quality:text:phred_33 ) < B8 > sum < 33 > ( out_qual_phred );
+    readonly column INSDC:quality:text:phred_64 QUALITY
+        = ( INSDC:quality:text:phred_64 ) < B8 > sum < 64 > ( out_qual_phred );
+
+
+    /* PLATFORM
+     *  sequencing platform, if known
+     */
+    INSDC:SRA:platform_id out_platform
+        = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_UNDEFINED > ();
+    readonly column INSDC:SRA:platform_id PLATFORM
+        = out_platform;
+
+    /* SPOT_ID
+     *  support for libsra
+     */
+    INSDC:SRA:spotid_t out_spot_id
+        = cast ( scaffold_row_id );
+    readonly column INSDC:SRA:spotid_t SPOT_ID
+        = out_spot_id;
+
+    /* NAME
+     *  spot name
+     */
+    readonly column ascii NAME
+        = out_scaffold_name;
+
+    /* SPOT_LEN
+     * TRIM_START
+     * TRIM_LEN
+     *  spot descriptor
+     */
+    readonly column INSDC:coord:len SPOT_LEN
+        = out_spot_len;
+    INSDC:coord:len out_spot_len
+        = < INSDC:coord:len > vec_sum ( .COMPONENT_LEN );
+    readonly column INSDC:coord:zero TRIM_START
+        = < INSDC:coord:zero > echo < 0 > ();
+    readonly column INSDC:coord:len TRIM_LEN
+        = out_spot_len;
+
+
+    /* READ_START
+     * READ_LEN
+     * READ_TYPE
+     *  read descriptor portion
+     */
+    readonly column INSDC:coord:zero READ_START
+        = out_read_start;
+    INSDC:coord:zero out_read_start
+        = ( INSDC:coord:zero ) < U32 > integral ( .COMPONENT_LEN );
+    readonly column INSDC:coord:len READ_LEN
+        = .COMPONENT_LEN;
+    readonly column INSDC:SRA:xread_type READ_TYPE
+        = out_read_type;
+    INSDC:SRA:xread_type out_read_type
+        = NCBI:WGS:build_read_type ( .COMPONENT_PROPS );
+}
+
+
+/*--------------------------------------------------------------------------
+ * contig
+ */
+database NCBI:WGS:db:contig #1.1
+{
+    table NCBI:WGS:tbl:nucleotide SEQUENCE;
+    table NCBI:WGS:tbl:protein PROTEIN;
+    table NCBI:WGS:tbl:gi_idx GI_IDX;
+    table NCBI:WGS:view:scaffold SCAFFOLD;
+};
diff --git a/interfaces/ngs/Model.graphml b/interfaces/ngs/Model.graphml
new file mode 100644
index 0000000..4d724c5
--- /dev/null
+++ b/interfaces/ngs/Model.graphml
@@ -0,0 +1,801 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yFiles for Java 2.11-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="353.0" width="218.0" x="187.0" y="347.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="73.17041015625" x="72.414794921875" y="3.0">Alignment<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>AlignmentId
+ReferenceSpec
+MappingQuality
+ReadGroup
+ReadId
+AlignmentCategory
+AlignmentPosition
+AlignmentLength
+IsReversedOrientation
+TemplateLength
+MateAlignmentId
+MateReferenceSpec
+MateIsReversedOrientation</y:AttributeLabel>
+            <y:MethodLabel>getReferenceBases ()
+getFragment ()
+getFragmentBases ( clipped )
+getFragmentQualities ( clipped )
+getSoftClip ( edge )
+getShortCigar ( clipped )
+getLongCigar ( clipped )
+getMateAlignment ()</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="175.0" width="290.0" x="-211.0" y="577.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="67.62255859375" x="111.188720703125" y="3.0">Fragment<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>FragmentId
+ReadGroup
+ReadId
+FragmentName</y:AttributeLabel>
+            <y:MethodLabel>getFragmentBases ()
+getSubFragmentBases ( offset, length )
+getFragmentQualities ()
+getSubFragmentQualities ( offset, length )</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="198.0" width="266.0" x="-161.0" y="315.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="36.8427734375" x="114.57861328125" y="3.0">Read<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>ReadId
+ReadCategory
+NumFragments
+ReadGroup
+ReadName</y:AttributeLabel>
+            <y:MethodLabel>getIndexedFragment ( index )
+getReadBases ()
+getSubReadBases ( offset, length )
+getReadQualities ()
+getSubReadQualities ( offset length )
+</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="116.0" width="266.0" x="554.0" y="295.5"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="45.1962890625" x="110.40185546875" y="3.0">Pileup<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>ReferenceSpec
+ReferencePosition
+PileupDepth</y:AttributeLabel>
+            <y:MethodLabel>getPileupEvents ()</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="264.0" width="229.0" x="478.0" y="464.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="82.1396484375" x="73.43017578125" y="3.0">PileupEvent<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>ReferenceSpec
+ReferencePosition
+MappingQuality
+AlignmentId
+Alignment
+AlignmentPosition
+FirstAlignmentPosition
+LastAlignmentPosition
+EventType</y:AttributeLabel>
+            <y:MethodLabel>getAlignmentBase ()
+getAlignmentQuality ()
+getInsertionBases ()
+getInsertionQualities ()
+getDeletionCount ()</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="86.0" width="194.0" x="755.0" y="464.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="132.36865234375" x="30.815673828125" y="3.0">PileupEventIterator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>[PileupEvent]</y:AttributeLabel>
+            <y:MethodLabel>nextPileupEvent ()</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="86.0" width="202.0" x="195.0" y="110.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="123.3994140625" x="39.30029296875" y="3.0">AlignmentIterator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>[Alignment]</y:AttributeLabel>
+            <y:MethodLabel>nextAlignment ()</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="77.0" width="155.0" x="-169.5" y="157.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="87.07177734375" x="33.964111328125" y="3.0">ReadIterator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>[Read]</y:AttributeLabel>
+            <y:MethodLabel>nextRead ()</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="77.0" width="123.0" x="769.0" y="178.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="95.42529296875" x="13.787353515625" y="3.0">PileupIterator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>[Pileup]</y:AttributeLabel>
+            <y:MethodLabel>nextPileup ()</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="97.0" width="176.0" x="-414.5" y="110.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="77.8994140625" x="49.05029296875" y="3.0">ReadGroup<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>Name</y:AttributeLabel>
+            <y:MethodLabel>getRead ( readId )
+getReads ( categories )</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="86.0" width="162.0" x="-302.5" y="-56.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="128.12841796875" x="16.935791015625" y="3.0">ReadGroupIterator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>[ReadGroup]</y:AttributeLabel>
+            <y:MethodLabel>nextReadGroup ()</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="159.0" width="238.0" x="488.0" y="73.5"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="70.193359375" x="83.9033203125" y="3.0">Reference<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>CommonName
+CanonicalName
+IsCircular</y:AttributeLabel>
+            <y:MethodLabel>getReferenceBases ( offset, length )
+getReferenceChunk ( offset, length )
+getAlignment ( alignmentId )
+getAlignments ( categories )
+getPileups ( categories )</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="77.0" width="202.0" x="271.0" y="-66.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="120.42236328125" x="40.788818359375" y="3.0">ReferenceIterator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>[Reference]</y:AttributeLabel>
+            <y:MethodLabel>nextReference ()</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n13">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="198.0" width="194.0" x="-26.0" y="-139.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="103.734375" x="45.1328125" y="3.0">ReadCollection<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel>Name</y:AttributeLabel>
+            <y:MethodLabel>getReadGroups ()
+getReadGroup ( name )
+getReferences ()
+getReference ( spec )
+getAlignment ( alignmentId )
+getAlignments ( categories )
+getRead ( readId )
+getReads ( categories )</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n14">
+      <data key="d4"/>
+      <data key="d5"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="91.19999999999999" width="209.79999999999967" x="383.60000000000014" y="-229.29999999999998"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="66.07373046875" x="71.86313476562484" y="3.0">NCBI.NGS<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="( implementation-specific )" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel>static openReadCollection ( spec )</y:MethodLabel>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n2" target="n1">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n4" target="n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n3" target="n5">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n5" target="n4">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n6" target="n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-32.0" y="73.48907470703125">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n0" target="n2">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-41.73501226999932" y="-47.09593372623726">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n7" target="n2">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n8" target="n3">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n9" target="n7">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="32.47662353515625" y="33.810942563487714">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n9" target="n2">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="39.1661330500778" y="72.7249867775106">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n10" target="n9">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-59.01310904658317" y="33.66708175385955">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n11" target="n6">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n11" target="n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n11" target="n8">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n12" target="n11">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e16" source="n13" target="n10">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-59.23797607421875" y="-26.844034061519977">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e17" source="n13" target="n9">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-121.63126501968361" y="24.207806803793524">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e18" source="n13" target="n12">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="49.5347900390625" y="30.16600686402702">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e19" source="n13" target="n11">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="156.41876389649815" y="86.92812830870787">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e20" source="n13" target="n7">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-66.00308831124255" y="37.75768475141834">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e21" source="n13" target="n2">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-60.61519740735096" y="125.9923095703125">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e22" source="n13" target="n6">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="0.0826200123946137" y="39.3111572265625">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e23" source="n13" target="n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="24.010842195850415" y="144.04399338679">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e24" source="n14" target="n13">
+      <data key="d8"/>
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-111.17167211091464" y="3.848688046464474">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources/>
+  </data>
+</graphml>
diff --git a/interfaces/ngs/NOTES.txt b/interfaces/ngs/NOTES.txt
new file mode 100644
index 0000000..2371e2f
--- /dev/null
+++ b/interfaces/ngs/NOTES.txt
@@ -0,0 +1,9 @@
+NGS API NOTES
+
+Alignments have ID numbers
+
+Reads (spots) have ID numbers
+
+Fragments (reads) have ID numbers
+  Andrew already did something like this for blast
+
diff --git a/interfaces/ngs/SimpleModel.graphml b/interfaces/ngs/SimpleModel.graphml
new file mode 100644
index 0000000..d4b6e7e
--- /dev/null
+++ b/interfaces/ngs/SimpleModel.graphml
@@ -0,0 +1,395 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.12-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="38.0" width="148.0" x="64.5" y="73.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="73.17041015625" x="37.414794921875" y="3.0">Alignment<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="38.0" width="109.0" x="-74.5" y="141.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="67.62255859375" x="20.688720703125" y="3.0">Fragment<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="38.0" width="100.0" x="-60.0" y="21.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="36.8427734375" x="31.57861328125" y="3.0">Read<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="38.0" width="118.0" x="235.0" y="21.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="45.1962890625" x="36.40185546875" y="3.0">Pileup<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="38.0" width="126.0" x="173.0" y="165.5"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="82.1396484375" x="21.93017578125" y="3.0">PileupEvent<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="38.0" width="124.5" x="-165.5" y="-71.5"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="77.8994140625" x="23.30029296875" y="3.0">ReadGroup<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="38.0" width="137.0" x="105.5" y="-71.5"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="70.193359375" x="33.4033203125" y="3.0">Reference<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="47.0" width="132.0" x="-26.0" y="-159.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="103.734375" x="14.1328125" y="3.0">ReadCollection<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n2" target="n1">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n4" target="n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n0" target="n2">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-14.19148897834745" y="-38.055172526208324">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n5" target="n2">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-4.007963733963948" y="38.26432184694302">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n6" target="n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n7" target="n5">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-60.71504909969883" y="-2.652013919268711">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n7" target="n6">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="0.40478052236488793" y="34.778252383897694">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n7" target="n2">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-51.95935901388586" y="63.8672135966746">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n7" target="n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="6.413753975550506" y="92.93783252936389">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n6" target="n3">
+      <data key="d8"/>
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="3.528034544234771" y="40.1394934807687">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n3" target="n4">
+      <data key="d8"/>
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="white_diamond" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="-54.85623314421002" y="49.14751957888981">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources/>
+  </data>
+</graphml>
diff --git a/interfaces/ngs/cstdint b/interfaces/ngs/cstdint
new file mode 100644
index 0000000..9a6118b
--- /dev/null
+++ b/interfaces/ngs/cstdint
@@ -0,0 +1 @@
+#include <stdint.h>
diff --git a/interfaces/ngs/ncbi/NGS.hpp b/interfaces/ngs/ncbi/NGS.hpp
new file mode 100644
index 0000000..950c4f8
--- /dev/null
+++ b/interfaces/ngs/ncbi/NGS.hpp
@@ -0,0 +1,95 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_ngs_ncbi_NGS_
+#define _hpp_ngs_ncbi_NGS_
+
+#ifndef _hpp_ngs_read_collection_
+#include <ngs/ReadCollection.hpp>
+#endif
+
+#ifndef _hpp_ngs_reference_sequence_
+#include <ngs/ReferenceSequence.hpp>
+#endif
+
+
+/*==========================================================================
+ * NCBI NGS Engine
+ *  this class binds the NGS interface to NCBI's NGS implementation
+ *  all of the code operates natively on SRA files
+ */
+namespace ncbi
+{
+
+    /*----------------------------------------------------------------------
+     * typedefs used to import names from ngs namespace
+     */
+    typedef :: ngs :: String String;
+    typedef :: ngs :: ErrorMsg ErrorMsg;
+    typedef :: ngs :: ReadCollection ReadCollection;
+    typedef :: ngs :: ReferenceSequence ReferenceSequence;
+
+
+    /*======================================================================
+     * NGS
+     *  static implementation root
+     */
+    class NGS
+    {
+    public:
+
+        /* setAppVersionString
+         *  updates User-Agent header in HTTP communications
+         *
+         *  example usage:
+         *    ncbi::NGS::setAppVersionString ( "pileup-stats.1.0.0" );
+         */
+        static
+        void setAppVersionString ( const String & app_version )
+            throw ();
+
+        /* openReadCollection
+         *  create an object representing a named collection of reads
+         *  "spec" may be a path to an object
+         *  or may be an id, accession, or URL
+         */
+        static 
+        ReadCollection openReadCollection ( const String & spec )
+            throw ( ErrorMsg );
+
+        /* openReferenceSequence
+         *  create an object representing a named reference
+         *  "spec" may be a path to an object
+         *  or may be an id, accession, or URL
+         */
+        static 
+        ReferenceSequence openReferenceSequence ( const String & spec )
+            throw ( ErrorMsg );
+    };
+
+} // ncbi
+
+#endif // _hpp_ngs_ncbi_NGS_
diff --git a/interfaces/os/linux/os-native.h b/interfaces/os/linux/os-native.h
new file mode 100644
index 0000000..7dc63e8
--- /dev/null
+++ b/interfaces/os/linux/os-native.h
@@ -0,0 +1,43 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_os_native_
+#define _h_os_native_
+
+#ifndef _h_unix_native_
+#include "../unix/unix-native.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_os_native_ */
diff --git a/interfaces/os/unix/oserror.h b/interfaces/os/unix/oserror.h
new file mode 100644
index 0000000..b703ebf
--- /dev/null
+++ b/interfaces/os/unix/oserror.h
@@ -0,0 +1,38 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_oserror_
+#define _h_oserror_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_oserror_ */
diff --git a/interfaces/os/unix/sysalloc.h b/interfaces/os/unix/sysalloc.h
new file mode 100644
index 0000000..2207943
--- /dev/null
+++ b/interfaces/os/unix/sysalloc.h
@@ -0,0 +1,40 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sysalloc_
+#define _h_sysalloc_
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sysalloc_ */
diff --git a/interfaces/os/unix/unix-native.h b/interfaces/os/unix/unix-native.h
new file mode 100644
index 0000000..236806a
--- /dev/null
+++ b/interfaces/os/unix/unix-native.h
@@ -0,0 +1,58 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_unix_native_
+#define _h_unix_native_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <time.h>
+#include <sys/time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * timeout_t
+ *  a structure for communicating a timeout
+ *  which under Unix converts to an absolute time once prepared
+ */
+struct timeout_t
+{
+    struct timespec ts;
+    uint32_t mS;
+    uint32_t prepared;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_unix_native_ */
diff --git a/interfaces/rdbms/rdbms.h b/interfaces/rdbms/rdbms.h
new file mode 100644
index 0000000..791e0ae
--- /dev/null
+++ b/interfaces/rdbms/rdbms.h
@@ -0,0 +1,362 @@
+#ifndef _h_rdbms_rdbms_
+#define _h_rdbms_rdbms_
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* logdberr
+ *  like logerr, but interprets error code as a db error code
+ */
+void logdberr ( int err, const char *fmt, ... );
+
+/* strdberror
+ *  a version of strerror that operates within db error code space
+ *  returned string is owned by library
+ */
+const char *strdberror ( int dberr );
+
+/* strdberror_r
+ *  a version of strerror_r that operates within db error code space
+ *  returns 0 on success, EINVAL if "dberr" is invalid, and
+ *  ERANGE if insufficient space was provided to copy the data.
+ */
+int strdberror_r ( int dberr, char *buf, size_t n );
+
+/*--------------------------------------------------------------------------
+ * DBColumnType
+ *  for discovering column type at runtime
+ */
+enum
+{
+    colUnsupported,
+    colBool,
+    colI8,
+    colU8,
+    colI16,
+    colU16,
+    colI32,
+    colU32,
+    colI64,
+    colU64,
+    colF32,
+    colF64,
+    colText,
+    colBlob
+};
+
+
+/*--------------------------------------------------------------------------
+ * DBRow
+ */
+typedef struct DBBlob DBBlob;
+struct DBBlob
+{
+    /* the blob is in here */
+    void *addr;
+    size_t size;
+
+    /* when finished with the blob, whack it thus */
+    void *priv;
+    void ( * whack ) ( void *priv );
+};
+
+/* DBBlobWhack
+ */
+#define DBBlobWhack( blob ) \
+    ( ( blob ) -> priv != NULL ? \
+      ( * ( blob ) -> whack ) ( ( blob ) -> priv ) : ( void ) 0 )
+
+typedef struct DBRow DBRow;
+typedef struct DBRow_vt DBRow_vt;
+struct DBRow_vt
+{
+    rc_t ( * whack ) ( DBRow *self );
+    rc_t ( * numColumns ) ( const DBRow *self, unsigned int *num_cols );
+    rc_t ( * colInfo ) ( const DBRow *self, unsigned int idx,
+        int *col_type, const String **name );
+    rc_t ( * colIdx ) ( const DBRow *self, const String *name,
+        unsigned int *idx );
+    bool ( * isNull ) ( const DBRow *self, unsigned int idx );
+
+    rc_t ( * getAsNum ) ( const DBRow *self, unsigned int idx, int64_t *i, double *d, bool *is_floating );
+    rc_t ( * getAsString ) ( const DBRow *self, unsigned int idx,
+        const String **value );
+    rc_t ( * getAsBlob ) ( const DBRow *self, unsigned int idx,
+        const void **value, size_t *bytes );
+    rc_t ( * stealBlob ) ( DBRow *self, unsigned int idx, DBBlob *blob );
+};
+struct DBRow
+{
+    const DBRow_vt *vt;
+};
+
+/* DBRowNumColumns
+ *  read the number of columns in row
+ */
+#define DBRowNumColumns( row, num_cols ) \
+    ( * ( row ) -> vt -> numColumns ) ( row, num_cols )
+
+/* DBRowColumnInfo
+ *  read the type for indexed column as DBColumnType
+ *  index is zero-based
+ *  optionally reads column name if "name" is not NULL
+ */
+#define DBRowColumnInfo( row, idx, col_type, name ) \
+    ( * ( row ) -> vt -> colInfo ) ( row, idx, col_type, name )
+
+/* DBRowColumnIdx
+ *  determine zero-based index for named column
+ */
+#define DBRowColumnIdx( row, name, idx ) \
+    ( * ( row ) -> vt -> colIdx ) ( row, name, idx )
+
+/* DBRowIsNull
+ *  determine whether an indexed column value is NULL
+ *  index is zero-based
+ *  returns true only if row and column are valid,
+ *  and column is NULL, obviously
+ */
+#define DBRowIsNull( row, idx ) \
+    ( * ( row ) -> vt -> isNull ) ( row, idx )
+
+/* DBRowGetAs...
+ *  column access functions
+ *  all indices are zero-based
+ */
+rc_t DBRowGetAsBool ( const DBRow *row, unsigned int idx, bool *value );
+rc_t DBRowGetAsI8 ( const DBRow *row, unsigned int idx, int8_t *value );
+rc_t DBRowGetAsU8 ( const DBRow *row, unsigned int idx, uint8_t *value );
+rc_t DBRowGetAsI16 ( const DBRow *row, unsigned int idx, int16_t *value );
+rc_t DBRowGetAsU16 ( const DBRow *row, unsigned int idx, uint16_t *value );
+rc_t DBRowGetAsI32 ( const DBRow *row, unsigned int idx, int32_t *value );
+rc_t DBRowGetAsU32 ( const DBRow *row, unsigned int idx, uint32_t *value );
+rc_t DBRowGetAsI64 ( const DBRow *row, unsigned int idx, int64_t *value );
+rc_t DBRowGetAsU64 ( const DBRow *row, unsigned int idx, uint64_t *value );
+rc_t DBRowGetAsF32 ( const DBRow *row, unsigned int idx, float *value );
+rc_t DBRowGetAsF64 ( const DBRow *row, unsigned int idx, double *value );
+#define DBRowGetAsString( row, idx, value ) \
+    ( * ( row ) -> vt -> getAsString ) ( row, idx, value )
+
+/* DBRowGetAsBlob
+ *  special access that returns direct pointer to internal data
+ *  only guaranteed to live while row exists
+ *  ( here's where reference counting saves the day... )
+ */
+#define DBRowGetAsBlob( row, idx, value, bytes ) \
+    ( * ( row ) -> vt -> getAsBlob ) ( row, idx, value, bytes )
+
+/* DBRowStealBlob
+ *  even more special access that steals internal data from row
+ *  or at least returns an allocation that is no longer associated
+ *  with the column.
+ *
+ *  intended to invalidate the column and cause it to be NULL,
+ *  but this is implementation dependent.
+ */
+#define DBRowStealBlob( row, idx, blob ) \
+    ( * ( row ) -> vt -> stealBlob ) ( row, idx, blob )
+
+/* DBRowWhack
+ *  whacks the row
+ */
+#define DBRowWhack( row ) \
+    ( ( row ) == NULL ? 0 : ( * ( row ) -> vt -> whack ) ( row ) )
+
+
+/*--------------------------------------------------------------------------
+ * DBResultSet
+ */
+typedef struct DBResultSet DBResultSet;
+typedef struct DBResultSet_vt DBResultSet_vt;
+struct DBResultSet_vt
+{
+    rc_t ( * whack ) ( DBResultSet *self );
+    rc_t ( * numColumns ) ( const DBResultSet *self, unsigned int *num_cols );
+    rc_t ( * colInfo ) ( const DBResultSet *self, unsigned int idx,
+        int *col_type, const String **name );
+    rc_t ( * colIdx ) ( const DBResultSet *self, const String *name,
+        unsigned int *idx );
+
+    rc_t ( * getStatus ) ( const DBResultSet *self, int32_t *status );
+    rc_t ( * nextRow ) ( DBResultSet *self, DBRow **row );
+};
+struct DBResultSet
+{
+    const DBResultSet_vt *vt;
+};
+
+/* DBResultSetNumColumns
+ *  read the number of columns in result
+ */
+#define DBResultSetNumColumns( rs, num_cols ) \
+    ( * ( rs ) -> vt -> numColumns ) ( rs, num_cols )
+
+/* DBResultSetColumnInfo
+ *  read the type for indexed column as DBColumnType
+ *  index is zero-based
+ *  optionally reads column name if "name" is not NULL
+ */
+#define DBResultSetColumnInfo( rs, idx, col_type, name ) \
+    ( * ( rs ) -> vt -> colInfo ) ( rs, idx, col_type, name )
+
+/* DBResultSetColumnIdx
+ *  determine zero-based index for named column
+ */
+#define DBResultSetColumnIdx( rs, name, idx ) \
+    ( * ( rs ) -> vt -> colIdx ) ( rs, name, idx )
+
+/* DBResultSetGetStatus
+ */
+#define DBResultSetGetStatus( rs, status ) \
+    ( * ( rs ) -> vt -> getStatus ) ( rs, status )
+
+/* DBResultSetNextRow
+ *  returns dbNoErr if row was created
+ *  returns dbEndData if no more rows were available
+ *  returns something more sinister if an error occurred
+ */
+#define DBResultSetNextRow( rs, row ) \
+    ( * ( rs ) -> vt -> nextRow ) ( rs, row )
+
+/* DBResultSetForEach
+ *  iterates across all rows
+ */
+rc_t DBResultSetForEach ( DBResultSet *rs,
+    void ( * f ) ( DBRow *row, void *data ), void * data );
+
+/* DBResultSetDoUntil
+ *  iterates across all rows
+ *  until the function returns true
+ */
+rc_t DBResultSetDoUntil ( DBResultSet *rs,
+    bool ( * f ) ( DBRow *row, void *data ), void * data );
+
+/* DBResultSetWhack
+ *  whacks the result set
+ */
+#define DBResultSetWhack( rs ) \
+    ( ( rs ) == NULL ? 0 : ( * ( rs ) -> vt -> whack ) ( rs ) )
+
+
+/*--------------------------------------------------------------------------
+ * Database
+ */
+typedef struct Database Database;
+typedef struct Database_vt Database_vt;
+struct Database_vt
+{
+    rc_t ( * whack ) ( Database *self );
+    rc_t ( * setReturnSize ) ( Database *self, size_t max_size );
+    rc_t ( * execute ) ( Database *self, DBResultSet **rs, char *sql );
+};
+struct Database
+{
+    const Database_vt *vt;
+};
+
+/* DatabaseSetReturnSize
+ *  sets maximum size for returns
+ */
+#define DatabaseSetReturnSize( db, max_size ) \
+    ( * ( db ) -> vt -> setReturnSize ) ( db, max_size )
+
+/* DatabaseExecute
+ *  issue an sql request
+ */
+rc_t DatabaseExecute ( Database *db, DBResultSet **rs, const char *sql, ... );
+
+/* DatabaseGetStatus
+ *  executes a stored procedure and returns status code
+ */
+rc_t DatabaseGetStatus ( Database *db, int32_t *status, const char *sql, ... );
+
+/* DatabaseGetAs...
+ *  column access functions on first row of a query
+ *  all indices are zero-based
+ */
+rc_t DatabaseGetAsBool ( Database *db, unsigned int idx,
+    bool *value, const char *sql, ... );
+rc_t DatabaseGetAsI8 ( Database *db, unsigned int idx,
+    int8_t *value, const char *sql, ... );
+rc_t DatabaseGetAsU8 ( Database *db, unsigned int idx,
+    uint8_t *value, const char *sql, ... );
+rc_t DatabaseGetAsI16 ( Database *db, unsigned int idx,
+    int16_t *value, const char *sql, ... );
+rc_t DatabaseGetAsU16 ( Database *db, unsigned int idx,
+    uint16_t *value, const char *sql, ... );
+rc_t DatabaseGetAsI32 ( Database *db, unsigned int idx,
+    int32_t *value, const char *sql, ... );
+rc_t DatabaseGetAsU32 ( Database *db, unsigned int idx,
+    uint32_t *value, const char *sql, ... );
+rc_t DatabaseGetAsI64 ( Database *db, unsigned int idx,
+    int64_t *value, const char *sql, ... );
+rc_t DatabaseGetAsU64 ( Database *db, unsigned int idx,
+    uint64_t *value, const char *sql, ... );
+rc_t DatabaseGetAsF32 ( Database *db, unsigned int idx,
+    float *value, const char *sql, ... );
+rc_t DatabaseGetAsF64 ( Database *db, unsigned int idx,
+    double *value, const char *sql, ... );
+rc_t DatabaseGetAsString ( Database *db, unsigned int idx,
+    const String **value, const char *sql, ... );
+
+/* DatabaseWhack
+ *  tear down a connection
+ */
+#define DatabaseWhack( db ) \
+    ( ( db ) == NULL ? 0 : ( * ( db ) -> vt -> whack ) ( db ) )
+
+
+/*--------------------------------------------------------------------------
+ * DBManager
+ *  something such as Sybase, ORACLE, etc.
+ */
+typedef struct DBManager DBManager;
+struct DBManager
+{
+    rc_t ( * whack ) ( DBManager *self );
+    rc_t ( * connect ) ( const DBManager *self, const char *server,
+        const char *dbname, const char *user, const char *pass, Database **db );
+};
+
+/* DBManagerInit
+ *  initialize object reference
+ *  returns 0 if manager has been registered
+ */
+rc_t DBManagerInit ( const DBManager **mgr, const char *name );
+
+
+/* DBManagerRegister
+ *  makes an object known to DBManager
+ */
+rc_t DBManagerRegister ( const DBManager *mgr, const char *name );
+
+
+/* DBManagerUnregister
+ *  makes an object unknown to DBManager
+ */
+rc_t DBManagerUnregister ( const DBManager *mgr, const char *name );
+
+
+/* DBManagerConnect
+ *  establish a connection
+ */
+#define DBManagerConnect( mgr, server, dbname, user, pass, db ) \
+    ( * ( mgr ) -> connect ) ( mgr, server, dbname, user, pass, db )
+
+/* DBManagerWhack
+ */
+#define DBManagerWhack( mgr ) \
+    ( ( mgr ) == NULL ? 0 : ( * ( mgr ) -> whack ) ( mgr ) )
+
+rc_t DBManagerRelease(const DBManager *mgr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_rdbms_rdbms_ */
diff --git a/interfaces/rdbms/sybase.h b/interfaces/rdbms/sybase.h
new file mode 100644
index 0000000..5bb932e
--- /dev/null
+++ b/interfaces/rdbms/sybase.h
@@ -0,0 +1,52 @@
+#ifndef _h_rdbms_sybase_
+#define _h_rdbms_sybase_
+
+#ifndef _h_rdbms_rdbms_
+#include <rdbms/rdbms.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * Sybase
+ */
+
+/* constants
+ */
+#ifndef CS_VERSION_100
+#define CS_VERSION_100 112
+#endif
+
+#ifndef CS_VERSION_110
+#define CS_VERSION_110 1100
+#endif
+
+#ifndef CS_VERSION_125
+#define CS_VERSION_125 12500
+#endif
+
+#ifndef CS_VERSION_150
+#define CS_VERSION_150 15001
+#endif
+
+#ifndef MIN_CS_VERSION
+#define MIN_CS_VERSION CS_VERSION_125
+#endif
+
+#ifndef OS_CS_VERSION
+#define OS_CS_VERSION CS_VERSION_125
+#endif
+
+/* SybaseInit
+ *  initializes the sybase rdbms
+ */
+rc_t SybaseInit ( int version );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_rdbms_sybase_ */
diff --git a/interfaces/search/extern.h b/interfaces/search/extern.h
new file mode 100644
index 0000000..453811a
--- /dev/null
+++ b/interfaces/search/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_search_extern_
+#define _h_search_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define SEARCH_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define SEARCH_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_search_extern_ */
diff --git a/interfaces/search/grep.h b/interfaces/search/grep.h
new file mode 100644
index 0000000..d8aeed6
--- /dev/null
+++ b/interfaces/search/grep.h
@@ -0,0 +1,268 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_search_grep_
+#define _h_search_grep_
+
+#ifndef _h_search_extern_
+#include <search/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_insdc_insdc_
+#include <insdc/insdc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * Fgrep
+ */
+typedef struct Fgrep Fgrep;
+
+
+/* MatchCallback
+ *
+ *  "matchinfo" [ IN ] -
+ *
+ *  "flag" [ OUT ] -
+ */
+typedef uint8_t FgrepContinueFlag;
+enum
+{
+    FGREP_CONTINUE = 1,
+    FGREP_STOP = 2
+};
+
+typedef struct FgrepMatch FgrepMatch;
+struct FgrepMatch
+{
+    int32_t position;
+    int32_t length;
+    int32_t whichpattern;
+};
+
+typedef rc_t ( CC * FgrepMatchCallback ) ( void *cbinfo,
+    const FgrepMatch *matchinfo, FgrepContinueFlag *flag );
+
+
+/* Make
+ *
+ *  "fg" [ OUT ] -
+ *
+ *  "mode" [ IN ]
+ *
+ *  "strings" [ IN ] and "numstrings" [ IN ] -
+ */
+typedef uint8_t FgrepFlags;
+enum
+{
+    FGREP_MODE_ASCII = 1,
+    FGREP_MODE_ACGT = 2,
+    FGREP_TEXT_EXPANDED_2NA = 4,
+    FGREP_ALG_DUMB = 8,
+    FGREP_ALG_BOYERMOORE = 0x10,
+    FGREP_ALG_AHOCORASICK = 0x20
+};
+
+SEARCH_EXTERN rc_t CC FgrepMake ( Fgrep **fg, FgrepFlags mode,
+    const char *strings[], uint32_t numstrings );
+
+/* Whack
+ */
+ #if 0
+SEARCH_EXTERN void CC FgrepWhack ( Fgrep *self );
+#endif
+SEARCH_EXTERN void CC FgrepFree ( Fgrep *self );
+
+/* FindFirst
+ *  Pass a matchinfo structure to get the info.
+ *  Returns nonzero if found, 0 if nothing found.
+ *
+ *   "buf" [ IN ] and "len" [ IN ]
+ *
+ *  "matchinfo" [ OUT ]
+ */
+SEARCH_EXTERN uint32_t CC FgrepFindFirst ( const Fgrep *self,
+    const char *buf, size_t len, FgrepMatch *matchinfo );
+
+
+/* FindAll
+ * TBD - should this return rc_t?
+ */
+ #if 0
+SEARCH_EXTERN void CC FgrepFindAll ( const Fgrep *self, const char *buf, size_t len,
+    FgrepMatchCallback cb, void *cbinfo );
+#endif
+
+/*----------------------------------------------------------------
+ * Fgrep appendix 
+ */
+
+/*
+ * Sees if a suffix of the pattern exact matches a prefix of the buffer.
+ */
+SEARCH_EXTERN uint32_t CC has_left_exact_match(char *pattern, char *buf, size_t buflen,
+                              int32_t *length);
+
+SEARCH_EXTERN uint32_t CC has_right_exact_match(char *pattern, char *buf, size_t buflen, 
+                               int32_t *bestpos);
+
+SEARCH_EXTERN uint32_t CC has_inside_exact_match(char *pattern, char *buf, size_t buflen, 
+                                int32_t *skip);
+
+/*--------------------------------------------------------------------------
+ * Agrep
+ */
+typedef struct Agrep Agrep;
+
+
+/* MatchCallback
+ */
+typedef struct AgrepMatch AgrepMatch;
+struct AgrepMatch
+{
+    int32_t position;
+    int32_t length;
+    int32_t score;
+};
+
+typedef uint8_t AgrepContinueFlag;
+enum
+{
+    AGREP_STOP = 1,
+    AGREP_CONTINUE = 2,
+    AGREP_MOREINFO = 4
+};
+
+typedef rc_t ( CC * AgrepMatchCallback ) ( const void *cbinfo, const AgrepMatch *matchinfo, AgrepContinueFlag *flag );
+
+
+/* Make
+ */
+typedef uint32_t AgrepFlags;
+enum
+{
+    AGREP_MODE_ASCII = 0x0001, /* simple text grep */
+    AGREP_PATTERN_4NA = 0x0002, /* pattern is 4na - bio mode */
+    /* text flags */
+    AGREP_IGNORE_CASE = 0x0004, /* ignore case in ascii mode, bio mode always ignores case */
+    /* bio mode flags */
+    AGREP_TEXT_EXPANDED_2NA = 0x0008, /* search string can have 2na */
+    AGREP_ANYTHING_ELSE_IS_N = 0x0010, /* periods, dashes in 4na pattern treated as N */
+    
+    /* algorithm choice */
+    AGREP_ALG_DP = 0x0020,
+    AGREP_ALG_WUMANBER = 0x0040,
+    AGREP_ALG_MYERS = 0x0080, /* shoud be same, internally detect algo based on pattern size */
+    AGREP_ALG_MYERS_UNLTD = 0x0100, /* very faulty, at least will crash on low memory */
+
+    AGREP_EXTEND_SAME = 0x200,
+    AGREP_EXTEND_BETTER = 0x400,
+    AGREP_LEFT_MAINTAIN_SCORE = 0x800, /* Only supported in DP for now */
+    AGREP_ANCHOR_LEFT = 0x1000 /* Only supported in DP for now */
+};
+
+SEARCH_EXTERN rc_t CC AgrepMake(Agrep **self, AgrepFlags mode, const char *pattern);
+
+/* Whack
+ */
+SEARCH_EXTERN void CC AgrepWhack ( Agrep *self );
+
+/* FindFirst
+ *  Pass in a pointer to an AgrepMatch, and it will be filled out.
+ *  Returns nonzero if something found, zero if nothing found.
+ */
+SEARCH_EXTERN uint32_t CC AgrepFindFirst( const Agrep *self, int32_t threshold, const char *buf, size_t len, AgrepMatch *matchinfo);
+
+SEARCH_EXTERN uint32_t CC AgrepFindBest( const Agrep *self, int32_t threshold, const char *buf, int32_t len, AgrepMatch *match);
+
+/* FindAll
+ */
+typedef struct AgrepCallArgs AgrepCallArgs;
+struct AgrepCallArgs
+{
+    const Agrep *self;
+
+    const char *buf;
+    size_t buflen;
+
+    AgrepMatchCallback cb;
+    void *cbinfo;
+
+    /*
+      This threshold is really intended for algorithms like DP and MYERS
+      that do not require the threshold to be part of the initial setup.
+      We may use this to override the one specified in the setup,
+      but we may not; if you want to use the one in the setup function,
+      pass -1 as the threshold.
+    */
+    int32_t threshold;
+};
+
+SEARCH_EXTERN void CC AgrepFindAll ( const AgrepCallArgs *args );
+
+/*--------------------------------------------------------------------------
+ * Agrep appendix
+ */
+
+SEARCH_EXTERN uint32_t CC has_left_approx_match(char *pattern, uint32_t errors, 
+                               char *buf, size_t buflen, 
+                               uint32_t *length, uint32_t *errcnt);
+
+SEARCH_EXTERN uint32_t CC has_right_approx_match(char *pattern, uint32_t errors, 
+                                char *buf, size_t buflen, 
+                                uint32_t *bestpos, uint32_t *errcnt);
+
+SEARCH_EXTERN uint32_t CC has_inside_approx_match(char *pattern, uint32_t plen, uint32_t errors, 
+                                 char *buf, size_t buflen, 
+                                 uint32_t *skip, uint32_t *errcnt);
+
+typedef struct LeftMatch LeftMatch;
+struct LeftMatch
+{
+    int32_t position;
+    int32_t hits;
+    int32_t misses;
+};
+
+typedef rc_t ( CC * LeftMatchCallback ) ( void *cbinfo, const LeftMatch *matchinfo, AgrepContinueFlag *flag );
+
+SEARCH_EXTERN size_t CC FindLongestCommonSubstring (
+    char const* pS1, char const* pS2, size_t const nLen1, size_t const nLen2,
+    size_t* pRetStart1, size_t* pRetStart2);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_search_grep_ */
diff --git a/interfaces/search/nucstrstr.h b/interfaces/search/nucstrstr.h
new file mode 100644
index 0000000..095bcf4
--- /dev/null
+++ b/interfaces/search/nucstrstr.h
@@ -0,0 +1,153 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==============================================================================
+
+  search/nucstrstr.h
+
+    nucleotide k-mer searching facility
+ */
+
+
+#ifndef _h_search_nucstrstr_
+#define _h_search_nucstrstr_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <search/extern.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* set to 1 if buffer supplied to NucStrstrSearch is
+   always at least 16 bytes beyond than the sequence */
+#ifndef ENDLESS_BUFFER
+#define ENDLESS_BUFFER 1
+#endif
+
+/* normally used for test only */
+#ifndef ENABLE_AT_EXPR
+#define ENABLE_AT_EXPR 0
+#endif
+
+/* positional returns make little sense with Boolean logic */
+#ifndef ALLOW_POSITIONAL_OPERATOR_MIX
+#define ALLOW_POSITIONAL_OPERATOR_MIX 1
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * NucStrstr
+ *  prepared handle for nucleotide k-mer strstr
+ */
+typedef union NucStrstr NucStrstr;
+
+/* NucStrstrMake
+ *  prepares search by parsing expression query string
+ *  returns error if conversion was not possible.
+ *
+ *  "nss" [ OUT ] - return parameter for one-time search handle
+ *
+ *  "positional" [ IN ] - if non-zero, build an expression tree
+ *  to return found position rather than simply a Boolean found.
+ *  see NucStrstrSearch. if ENABLE_AT_EXPR is defined as non-zero,
+ *  the <position_expr> production can switch this flag to true
+ *  for the immediately following fasta_expr from within the
+ *  expression string itself. if ALLOW_POSITIONAL_OPERATOR_MIX
+ *  is defined as non-zero, operators '!', '&&' and '||' will
+ *  be allowed when generating positional results. they will make
+ *  no sense otherwise.
+ *
+ *  "query" [ IN ] and "len" [ IN ] - query string expression, such that:
+ *       expr           : <unary_expr>
+ *                      | <unary_expr> <boolean_op> <expr>
+ *       unary_expr     : <primary_expr>
+ *                      | '!' <unary_expr>
+ *       primary_expr   : <position_expr>
+ *                      | '^' <position_expr>
+ *                      | <position_expr> '$'
+ *                      | '(' <expr> ')'
+ *       position_expr  : <fasta_expr>
+ *                      | '@' <fasta_expr>
+ *       fasta_expr     : FASTA
+ *                      | "'" FASTA "'"
+ *                      | '"' FASTA '"'
+ *       boolean_op     : '&', '|', '&&', '||'
+ *
+ *    where the '@' operator may be used to force the "positional"
+ *    flag to be true - conditionally enabled.
+ *
+ *  return values:
+ *    EINVAL - invalid parameter or invalid expression
+ */
+SEARCH_EXTERN int CC NucStrstrMake ( NucStrstr **nss, int positional,
+    const char *query, unsigned int len );
+
+/* NucStrstrWhack
+ *  discard structure when no longer needed
+ */
+SEARCH_EXTERN void CC NucStrstrWhack ( NucStrstr *self );
+
+/* NucStrstrSearch
+ *  search buffer from starting position
+ *
+ *  "ncbi2na" [ IN ] - pointer to 2na data
+ *
+ *    N.B. - "ncbi2na" must be at least long enough to allow for
+ *    full 16-byte loads at the tail of the search sequence:
+ *
+ *    - technically, the size requirement is:
+ *     ( ( pos + len + 3 ) / 4 ) == bytes,
+ *     ( ( bytes + 15 ) / 16 ) * 16 == min data size
+ *
+ *    - practically, if "ncbi2na" points to a data buffer
+ *      that is at least 16 bytes longer than "bytes" above,
+ *      then it is always sufficient, and sometimes excessive.
+ *
+ *  "pos" [ IN ] - starting base position for search,
+ *  relative to "ncbi2na". may be >= 4.
+ *
+ *  "len" [ IN ] - the number of bases to include in
+ *  the search, relative to "pos".
+ *
+ *  return values:
+ *    0 if the pattern was not found
+ *    1..N indicating starting position if "self" was
+ *      prepared for positional return
+ *   !0 if "self" was prepared normally by NucStrstrMake
+ */
+SEARCH_EXTERN int CC NucStrstrSearch ( const NucStrstr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len,unsigned int* selflen );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_search_nucstrstr_ */
+
diff --git a/interfaces/search/ref-variation.h b/interfaces/search/ref-variation.h
new file mode 100644
index 0000000..3d67970
--- /dev/null
+++ b/interfaces/search/ref-variation.h
@@ -0,0 +1,159 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_search_ref_variation_
+#define _h_search_ref_variation_
+
+#ifndef _h_search_extern_
+#include <search/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_insdc_insdc_
+#include <insdc/insdc.h>
+#endif
+
+#ifndef REF_VAR_ALG
+#define REF_VAR_ALG 1
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if REF_VAR_ALG
+/*--------------------------------------------------------------------------
+ * RefVarAlg
+ *  while experimenting with algorithms...
+ */
+typedef uint32_t RefVarAlg;
+enum
+{
+    refvarAlgSW = 1,
+    refvarAlgRA
+};
+
+#endif
+
+/*--------------------------------------------------------------------------
+ * RefVariation
+ */
+typedef struct RefVariation RefVariation;
+
+
+/* IUPACMake
+ *  make a RefVarition object from IUPAC sequence data
+ *
+ *  "obj" [ OUT ] - return parameter for object
+ *
+ *  "ref" [ IN ] and "ref_len" [ IN ] - reference sequence
+ *  against which the variation is expressed
+ *
+ *  "deletion_pos" [ IN ] and "deletion_len" [ IN, ZERO OKAY ] - location
+ *  and length of deletion portion of variation, as expressed against "ref".
+ *  these describe the portion of "ref" to be replaced.
+ *
+ *  "insertion" [ IN ] and "insertion_len" [ IN, ZERO OKAY ] - sequence to
+ *  be inserted at "deletion_pos" as a substitution for deleted bases.
+ *
+ *  for a pure insertion, "deletion_len" should be zero and "insertion_len"
+ *  should be non-zero. for a pure deletion, "deletion_len" should be non-zero
+ *  and "insertion_len" should be zero. otherwise, the operation describes a
+ *  substitution.
+ */
+SEARCH_EXTERN rc_t CC RefVariationIUPACMake ( RefVariation ** obj,
+        INSDC_dna_text const* ref, size_t ref_len,
+        size_t deletion_pos, size_t deletion_len,
+        INSDC_dna_text const* insertion, size_t insertion_len
+#if REF_VAR_ALG
+        , RefVarAlg alg
+#endif
+    );
+
+
+/* AddRef
+ * Release
+ *  accepts NULL for self
+ */
+SEARCH_EXTERN rc_t CC RefVariationAddRef ( RefVariation const* self );
+SEARCH_EXTERN rc_t CC RefVariationRelease ( RefVariation const* self );
+
+
+/* GetIUPACSearchQuery
+ *  returns a minimum query string in IUPAC alphabet
+ *  this string contains sufficient bounding bases to encompass
+ *  all deletions and insertions
+ *
+ *  "query" [ OUT ] and "query_len" [ OUT, NULL OKAY ] - return parameter
+ *  for query sequence.
+ *
+ * NB - "query" is owned by object, and cannot be freed by caller.
+ *
+ *  "query_start" [ OUT, NULL OKAY ] - return parameter for start of
+ *  query sequence on ( original ) reference used to create object.
+ */
+SEARCH_EXTERN rc_t CC RefVariationGetIUPACSearchQuery ( RefVariation const* self,
+    INSDC_dna_text const ** query, size_t * query_len, size_t * query_start );
+
+
+/* GetSearchQueryLenOnRef
+ *  returns projected length of query sequence on reference
+ *
+ *  "query_len_on_ref" [ OUT ] - projected length of query sequence on reference
+ */
+SEARCH_EXTERN rc_t CC RefVariationGetSearchQueryLenOnRef ( RefVariation const* self, size_t * query_len_on_ref );
+
+
+/* GetAllele
+ *
+ *  "allele" [ OUT ] and "allele_len" [ OUT ] - return parameter
+ *  for allele sequence
+ *
+ * NB - "allele" is owned by object, and cannot be freed by caller.
+ *
+ *  "allele_start" [ OUT, NULL OKAY ] - return parameter for start of
+ *  allele sequence on ( original ) reference used to create object.
+ */
+SEARCH_EXTERN rc_t CC RefVariationGetAllele ( RefVariation const* self,
+    INSDC_dna_text const ** allele, size_t * allele_len, size_t * allele_start );
+
+
+/* GetAlleleLenOnRef
+ *  returns projected length of allele on reference
+ *
+ *  "allele_len_on_ref" [ OUT ] - projected length of allele on reference
+ */
+SEARCH_EXTERN rc_t CC RefVariationGetAlleleLenOnRef ( RefVariation const* self, size_t * allele_len_on_ref );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_search_ref_variation_ */
diff --git a/interfaces/search/smith-waterman.h b/interfaces/search/smith-waterman.h
new file mode 100644
index 0000000..0e2b236
--- /dev/null
+++ b/interfaces/search/smith-waterman.h
@@ -0,0 +1,72 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_search_smith_waterman_
+#define _h_search_smith_waterman_
+
+#ifndef _h_search_extern_
+#include <search/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct SmithWaterman SmithWaterman;
+
+typedef struct SmithWatermanMatch SmithWatermanMatch;
+struct SmithWatermanMatch
+{
+    int32_t position;
+    int32_t length;
+    int32_t score;
+};
+
+/* Make
+ */
+SEARCH_EXTERN rc_t CC SmithWatermanMake ( SmithWaterman **self, const char *query );
+
+/* Whack
+ */
+SEARCH_EXTERN void CC SmithWatermanWhack ( SmithWaterman *self );
+
+/* FindFirst
+ *  threshold - minimum matching score: 0 will match anything, 2*strlen(query) and higher will only report perfect match
+ *  Returns:    0 a match is found (details in the matchinfo, NULL is OK), 
+ *              RC(rcText, rcString, rcSearching, rcQuery, rcNotFound) if nothing found, 
+ *              other RC in case of an error.
+ */
+SEARCH_EXTERN rc_t CC SmithWatermanFindFirst ( SmithWaterman *self, uint32_t threshold, const char *buf, size_t buf_size, SmithWatermanMatch* matchinfo );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
diff --git a/interfaces/simple/extern.h b/interfaces/simple/extern.h
new file mode 100644
index 0000000..a3298ee
--- /dev/null
+++ b/interfaces/simple/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_simple_extern_
+#define _h_simple_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define SIMPLE_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define SIMPLE_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_simple_extern_ */
diff --git a/interfaces/simple/sra.hpp b/interfaces/simple/sra.hpp
new file mode 100644
index 0000000..3463bbf
--- /dev/null
+++ b/interfaces/simple/sra.hpp
@@ -0,0 +1,1127 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_simple_sra_
+#define _hpp_simple_sra_
+
+#include <stdint.h>
+#include <string>
+#include <vector>
+#include <exception>
+
+/* NOTES
+
+   01. may need our own String abstraction to represent
+       pointers into cursor cache rather than copies.
+       std::string may be too heavyweight, but then
+       the same problem exists in Java... then again,
+       maybe it's just that we shouldn't use String for
+       bases...
+
+ */
+
+extern "C"
+{
+    /*----------------------------------------------------------------------
+     * forwards and typedefs
+     */
+    struct SRA_Spot;
+    struct SRA_Object;
+    struct SRA_Sequence;
+    struct SRA_Reference;
+    struct SRA_Alignment;
+    struct SAM_Flags;
+    struct SAM_Headers;
+    struct SAM_Alignment;
+}
+
+namespace sra
+{
+
+    /*----------------------------------------------------------------------
+     * forwards and typedefs
+     */
+    typedef :: std :: string String;
+    typedef :: std :: exception Exception;
+    typedef :: SRA_Spot * SRASpotRef;
+    typedef :: SRA_Object * SRAObjectRef;
+    typedef :: SRA_Sequence * SRASequenceRef;
+    typedef :: SRA_Reference * SRAReferenceRef;
+    typedef :: SRA_Alignment * SRAAlignmentRef;
+    typedef :: SAM_Flags * SAMFlagsRef;
+    typedef :: SAM_Headers * SAMHeadersRef;
+    typedef :: SAM_Alignment * SAMAlignmentRef;
+
+
+    /*----------------------------------------------------------------------
+     * SRAException
+     *  all exceptions generated within sra :: simple are subclasses
+     */
+    class SRAException : public :: std :: exception
+    {
+    public:
+
+        const char * what () const
+            throw ();
+        
+        SRAException ()
+            throw ();
+
+        SRAException ( const String & message )
+            throw ();
+
+        SRAException ( const char * fmt, ... )
+            throw ();
+
+    public:
+
+        // C++ support
+
+        SRAException ( const SRAException & x )
+            throw ();
+        SRAException & operator = ( const SRAException & x )
+            throw ();
+
+        virtual ~ SRAException ()
+            throw ();
+
+    private:
+
+        String msg;
+    };
+
+
+    /*----------------------------------------------------------------------
+     * StringRef
+     *  behaves similarly to a String except that it points to
+     *  data held within a cache whenever possible.
+     */
+    class StringRef
+    {
+    public:
+
+        const char * data () const
+            throw ();
+
+        size_t length () const
+            throw ();
+
+        String toString () const
+            throw ( SRAException );
+
+    public:
+        StringRef ( const StringRef & s )
+            throw ();
+        StringRef & operator = ( const StringRef & s )
+            throw ();
+
+        virtual ~ StringRef ()
+            throw ();
+
+    private:
+
+        const char * str;
+        size_t len;
+
+        // TBD - additional opaque stuff for C object references
+    };
+
+    /*----------------------------------------------------------------------
+     * SRASequence
+     * SRASequenceIterator
+     *  a nucleotide sequence
+     */
+    class SRASequence
+    {
+    public:
+
+        /* name
+         *  returns a textual identifier if available
+         *  or a numeric version otherwise
+         */
+        String name () const
+            throw ( SRAException );
+
+        /* length
+         *  return the number of bases in sequence
+         */
+        uint64_t length () const
+            throw ( SRAException );
+
+        /* bases
+         *  returns bases using IUPAC character representation
+         */
+        String bases () const
+            throw ( SRAException );
+
+        /* isReverse
+         *  true if reverse read
+         */
+        bool isReverse () const
+            throw ( SRAException );
+
+        /* colorSpaceNative
+         *  returns true if the native sequence is in color-space
+         */
+        bool colorSpaceNative () const
+            throw ( SRAException );
+
+        /* hasColorSpace
+         *  returns true if sequence can return color-space
+         */
+        bool hasColorSpace () const
+            throw ();
+
+        /* colorSpaceKey
+         *  returns key ( starting base ) for first read
+         */
+        char colorSpaceKey () const
+            throw ( SRAException );
+
+        /* colorSpace
+         *  returns color-space representation
+         *  NB - may fail on some sequences
+         */
+        String colorSpace () const
+            throw ( SRAException );
+
+        /* qualities
+         *  returns per-base/color phred quality scores
+         */
+        std :: vector < uint8_t > qualities () const
+            throw ( SRAException );
+
+#if 0
+        // THESE ARE QUESTIONABLE...
+        // CONVENIENT PLACES TO ACCUMMULATE CRUFT, BUT
+        // DO WE WANT TO KEEP DRAGGING IT ALONG? AND
+        // HOW MUCH FACTORIZATION DO WE WANT IN API?
+
+        /* isTechnical
+         *  true if the sequence represents a technical read
+         */
+        bool isTechnical () const
+            throw ( SRAException );
+
+        /* hasPrimaryAlignment
+         *  returns true iff any part of sequence is aligned,
+         *  and the sequence is capable of returning an SRAAlignment
+         */
+        bool hasPrimaryAlignment () const
+            throw ();
+
+        /* primaryAlignment
+         *  if the sequence is aligned and the alignment is available
+         *  assign to an SRAAlignment
+         */
+        SRAAlignmentRef primaryAlignment () const
+            throw ( SRAException );
+
+#endif
+
+    public:
+
+        // C++ support
+
+        SRASequence & operator = ( SRASequenceRef s )
+            throw ();
+        SRASequence ( SRASequenceRef s )
+            throw ();
+
+        SRASequence & operator = ( const SRASequence & s )
+            throw ( SRAException );
+        SRASequence ( const SRASequence & s )
+            throw ( SRAException );
+
+        ~ SRASequence ()
+            throw ();
+
+    protected:
+
+        SRASequenceRef self;
+    };
+
+    class SRASequenceIterator : public SRASequence
+    {
+    public:
+
+        /* next
+         *  advance to the next sequence
+         *  returns false if no more sequences are available
+         */
+        bool next ()
+            throw ( SRAException );
+
+
+    public:
+
+        // C++ support
+
+        SRASequenceIterator ( SRASequenceRef r )
+            throw ();
+
+        SRASequenceIterator & operator = ( const SRASequenceIterator & i )
+            throw ( SRAException );
+        SRASequenceIterator ( const SRASequenceIterator & i )
+            throw ( SRAException );
+
+        ~ SRASequenceIterator ()
+            throw ();
+
+    private:
+        SRASequence & operator = ( const SRASequence & s )
+            throw ( SRAException );
+        SRASequenceIterator & operator = ( SRASequenceRef s )
+            throw ();
+    };
+
+
+    /*----------------------------------------------------------------------
+     * SRASpot
+     * SRASpotIterator
+     *  a complete machine read,
+     *  including technical and biological segments
+     */
+    class SRASpot : public SRASequence
+    {
+    public:
+
+        /* platform
+         *  return platform name as string
+         */
+        String platform () const
+            throw ( SRAException );
+
+        /* spotGroup
+         *  returns a spot group name if known
+         *  returns an empty string otherwise
+         */
+        String spotGroup () const
+            throw ( SRAException );
+
+        /* id
+         *  returns the spot's numeric identifier
+         */
+        int64_t id () const
+            throw ( SRAException );
+
+        /* numReads
+         *  return the number of individual sub-sequences
+         */
+        uint32_t numReads () const
+            throw ( SRAException );
+
+        /* reads
+         *  return all reads - mixed technical and biological
+         */
+        SRASequenceIterator reads () const
+            throw ( SRAException );
+
+        /* numBioReads
+         *  the number of biological reads
+         */
+        uint32_t numBioReads () const
+            throw ( SRAException );
+
+        /* bioReads
+         *  return only biological reads
+         *  if "trimmed" is true, apply quality clipping if indicated
+         */
+        SRASequenceIterator bioReads ( bool trimmed = false ) const
+            throw ( SRAException );
+
+    public:
+
+        // C++ support
+
+        SRASpot & operator = ( SRASpotRef r )
+            throw ();
+        SRASpot ( SRASpotRef r )
+            throw ();
+
+        SRASpot & operator = ( const SRASpot & s )
+            throw ( SRAException );
+        SRASpot ( const SRASpot & s )
+            throw ( SRAException );
+
+        ~ SRASpot ()
+            throw ();
+
+    protected:
+        SRASpotRef spot;
+    };
+
+    class SRASpotIterator : public SRASpot
+    {
+    public:
+
+        /* next
+         *  advance to the next spot
+         *  returns false if no more are available
+         */
+        bool next ()
+            throw ( SRAException );
+
+
+        SRASpotIterator ( SRASpotRef r )
+            throw ();
+
+        SRASpotIterator & operator = ( const SRASpotIterator & i )
+            throw ( SRAException );
+        SRASpotIterator ( const SRASpotIterator & i )
+            throw ( SRAException );
+
+        ~ SRASpotIterator ()
+            throw ();
+
+    private:
+        SRASpot & operator = ( const SRASpot & s )
+            throw ( SRAException );
+        SRASpotIterator & operator = ( SRASpotRef r )
+            throw ();
+    };
+
+
+    /*----------------------------------------------------------------------
+     * SRAReference
+     * SRAReferenceIterator
+     *  a reference sequence
+     */
+    class SRAReference : public SRASequence
+    {
+    public:
+
+        /* name
+         *  returns a textual identifier if available
+         *  or a numeric version otherwise
+         */
+        String name () const
+            throw ( SRAException );
+
+        /* accession
+         *  TBD - explain
+         */
+        String accession () const
+            throw ( SRAException );
+
+        /* isCircular
+         */
+        bool isCircular () const
+            throw ( SRAException );
+
+        /* baseCount
+         */
+        uint64_t baseCount () const
+            throw ( SRAException );
+
+        /* bases
+         *  returns bases using IUPAC character representation
+         *
+         *  "first" is a zero-based starting position,
+         *  "length" gives the total number of bases, which will be limited
+         *   to the reference boundaries unless circular
+         */
+        String bases ( uint64_t first, uint64_t length ) const
+            throw ( SRAException );
+
+    public:
+
+        // C++ support
+
+        SRAReference & operator = ( SRAReferenceRef r )
+            throw ();
+        SRAReference ( SRAReferenceRef r )
+            throw ();
+        
+        SRAReference & operator = ( const SRAReference & r )
+            throw ( SRAException );
+        SRAReference ( const SRAReference & r )
+            throw ( SRAException );
+
+        ~ SRAReference ()
+            throw ();
+
+    protected:
+
+        SRAReferenceRef self;
+    };
+
+    class SRAReferenceIterator : public SRAReference
+    {
+    public:
+
+        /* next
+         *  advance to the next reference
+         *  returns false if no more are available
+         */
+        bool next ()
+            throw ( SRAException );
+
+    public:
+
+        // C++ support
+
+        SRAReferenceIterator ( SRAReferenceRef r )
+            throw ();
+
+        SRAReferenceIterator & operator = ( const SRAReferenceIterator & i )
+            throw ( SRAException );
+        SRAReferenceIterator ( const SRAReferenceIterator & i )
+            throw ( SRAException );
+
+        ~ SRAReferenceIterator ()
+            throw ();
+
+    private:
+        SRAReference & operator = ( const SRAReference & r )
+            throw ( SRAException );
+        SRAReferenceIterator & operator = ( SRAReferenceRef r )
+            throw ();
+    };
+
+
+    /*----------------------------------------------------------------------
+     * SRAAlignment
+     * SRAAlignmentIterator
+     *  a relationship between two sequences
+     */
+    class SRAAlignment
+    {
+    public:
+
+        /* querySequence
+         *  get the query sequence
+         *  this is generally the sequence aligned against the reference
+         */
+        SRASequence querySequence () const
+            throw ( SRAException );
+
+        /* reference
+         *  get the reference sequence
+         */
+        SRAReference reference () const
+            throw ( SRAException );
+        
+        /* referenceStart
+         *  returns the alignment's zero-based starting coordinate on reference
+         */
+        uint64_t referenceStart () const
+            throw ( SRAException );
+
+        /* referenceLength
+         *  returns the alignment's projected length upon reference
+         */
+        uint64_t referenceLength () const
+            throw ( SRAException );
+
+        /* mappingQuality
+         *  how closely aligned are the sequences
+         */
+        int64_t mappingQuality () const
+            throw ( SRAException );
+
+        /* hasMate
+         */
+        bool hasMate () const
+            throw ();
+
+        /* mate
+         *  retrieve mate if available
+         */
+        SRAAlignmentRef mate () const
+            throw ( SRAException );
+
+        /* need to tell spot-id and read-idx of sequence
+           this could be available on the sequence object itself, but isn't.
+           it's very cheap in our case.
+        */
+
+        /* OTHER STUFF
+           read group ( should be modeled? should be from sequence? )
+           is read paired
+           is pair proper
+           is read on negative strand
+           is ( or is not ) primary alignment
+           is duplicate
+           is mate unmapped
+           is mate on negative strand
+           mate alignment start
+        */
+
+    public:
+
+        // C++ support
+
+        SRAAlignment & operator = ( SRAAlignmentRef a )
+            throw ();
+        SRAAlignment ( SRAAlignmentRef a )
+            throw ();
+
+        SRAAlignment & operator = ( const SRAAlignment & a )
+            throw ( SRAException );
+        SRAAlignment ( const SRAAlignment & a )
+            throw ( SRAException );
+
+        ~ SRAAlignment ()
+            throw ();
+
+    protected:
+
+        SRAAlignmentRef self;
+    };
+
+    class SRAAlignmentIterator : public SRAAlignment
+    {
+    public:
+
+        /* next
+         *  advance to the next alignment
+         */
+        bool next ()
+            throw ( SRAException );
+
+    public:
+
+        // C++ support
+
+        SRAAlignmentIterator ( SRAAlignmentRef a )
+            throw ();
+
+        SRAAlignmentIterator & operator = ( const SRAAlignmentIterator & i )
+            throw ( SRAException );
+        SRAAlignmentIterator ( const SRAAlignmentIterator & i )
+            throw ( SRAException );
+
+        ~ SRAAlignmentIterator ()
+            throw ();
+
+    private:
+        SRAAlignment & operator = ( const SRAAlignment & a )
+            throw ( SRAException );
+        SRAAlignmentIterator & operator = ( SRAAlignmentRef a )
+            throw ();
+    };
+
+
+    /*----------------------------------------------------------------------
+     * SRAAlignmentDetail
+     *  gives raw information about relationship between sequences
+     *  from the point of view of the query
+     */
+    class SRAAlignmentDetail
+    {
+    public:
+
+        /* hasOffset
+         *  a vector of boolean values corresponding to each query base
+         *  "false" means that there is no offset to apply to alignment
+         *  "true" means that there is an offset that must be applied
+         *  to the sequence alignment.
+         */
+        std :: vector < bool > hasOffset () const
+            throw ( SRAException );
+
+        /* offset
+         *  a packed vector of alignment offsets to be applied to the
+         *  query position before handling mismatches ( see documentation ).
+         *  NB - this is a signed quantity and can produce a negative
+         *  alignment coordinate in certain cases.
+         */
+        std :: vector < int32_t > offset () const
+            throw ( SRAException );
+
+        /* hasMismatch
+         *  a vector of boolean values corresponding to each query base
+         *  "false" means that the query sequence matches the reference
+         *  "true" means there is a mismatch, and the actual query base
+         *  may be obtained from the mismatch vector.
+         */
+        std :: vector < bool > hasMismatch () const
+            throw ( SRAException );
+
+        /* mismatch
+         *  a packed vector of query bases that differ from reference
+         *  there is one base for every "true" value in hasMismatch
+         */
+        std :: vector < char > mismatch () const
+            throw ( SRAException );
+            
+        // C++ constructor from alignment
+
+        SRAAlignmentDetail & operator = ( const SRAAlignment & a )
+            throw ( SRAException );
+        SRAAlignmentDetail ( const SRAAlignment & a )
+            throw ( SRAException );
+
+    public:
+
+        // C++ support
+
+        SRAAlignmentDetail & operator = ( SRAAlignmentRef r )
+            throw ();
+        SRAAlignmentDetail ( SRAAlignmentRef r )
+            throw ();
+
+        SRAAlignmentDetail & operator = ( const SRAAlignmentDetail & d )
+            throw ( SRAException );
+        SRAAlignmentDetail ( const SRAAlignmentDetail & d )
+            throw ( SRAException );
+
+        ~ SRAAlignmentDetail ()
+            throw ();
+
+    private:
+
+        SRAAlignmentRef self;
+    };
+
+
+    /*----------------------------------------------------------------------
+     * SRAObject
+     *  represents an SRA-capable object
+     */
+    class SRAObject
+    {
+    public:
+
+        /* constructor
+         *  tries to locate object described by "spec"
+         *  does not fully OPEN object
+         */
+        SRAObject ( const String & spec )
+            throw ( SRAException );
+
+        /* combine constructor
+         *  combines two objects into a single object
+         */
+        SRAObject ( const SRAObject & a, const SRAObject & b )
+            throw ( SRAException );
+
+        /* slice
+         *  create a sub-selection of object
+         *  the sub-selection is based upon reference spec
+         *  and/or coordinates within a reference
+         */
+        SRAObjectRef slice ( const String & referenceSpec ) const
+            throw ( SRAException );
+        SRAObjectRef slice ( uint64_t reference_start,
+                uint64_t reference_length, bool fully_contained ) const
+            throw ( SRAException );
+
+        /* open - IDEMPOTENT
+         *  causes object to create internal resources
+         */
+        void open ()
+            throw ( SRAException );
+
+        /* close
+         *  releases underlying resources
+         *  does NOT delete object
+         */
+        void close ()
+            throw ();
+
+        /* getReferences
+         *  returns an iterator of all references included within the object
+         */
+        SRAReferenceIterator getReferences () const
+            throw ( SRAException );
+
+        /* primaryAlignments
+         *  return an iterator of primary alignments
+         *  ordering is based upon object properties
+         */
+        SRAAlignmentIterator primaryAlignments () const
+            throw ( SRAException );
+        SRAAlignmentIterator primaryAlignments ( uint64_t startIdx, uint64_t count ) const
+            throw ( SRAException );
+
+        /* secondaryAlignments
+         *  return an iterator of secondary alignments
+         *  ordering is based upon object properties
+         */
+        SRAAlignmentIterator secondaryAlignments () const
+            throw ( SRAException );
+        SRAAlignmentIterator secondaryAlignments ( uint64_t startIdx, uint64_t count ) const
+            throw ( SRAException );
+
+        /* allAlignments
+         *  return an iterator of combined primary and secondary alignments
+         *  ordering is based upon object properties
+         */
+        SRAAlignmentIterator allAlignments () const
+            throw ( SRAException );
+
+
+        /* alignedSequences
+         *  return an iterator of aligned sequences
+         *  ordering is based upon object properties
+         */
+        SRASequenceIterator alignedSequences () const
+            throw ( SRAException );
+        SRASequenceIterator alignedSequences ( uint64_t startIdx, uint64_t count ) const
+            throw ( SRAException );
+
+        /* unalignedSequences
+         *  return an iterator of unaligned sequences
+         */
+        SRASequenceIterator unalignedSequences () const
+            throw ( SRAException );
+        SRASequenceIterator unalignedSequences ( uint64_t startIdx, uint64_t count ) const
+            throw ( SRAException );
+
+        /* allSequences
+         *  return an iterator of all sequences
+         */
+        SRASequenceIterator allSequences () const
+            throw ( SRAException );
+
+
+        /* alignedSpots
+         *  return an iterator of fully or partially aligned spots
+         */
+        SRASpotIterator alignedSpots ( bool partially_aligned ) const
+            throw ( SRAException );
+        SRASpotIterator alignedSpots ( uint64_t startIdx, uint64_t count, bool partially_aligned ) const
+            throw ( SRAException );
+
+        /* unalignedSpots
+         *  return an iterator of fully unaligned spots
+         */
+        SRASpotIterator unalignedSpots () const
+            throw ( SRAException );
+        SRASpotIterator unalignedSpots ( uint64_t startIdx, uint64_t count ) const
+            throw ( SRAException );
+
+        /* allSpots
+         *  return an iterator of all spots
+         */
+        SRASpotIterator allSpots () const
+            throw ( SRAException );
+        SRASpotIterator allSpots ( uint64_t startIdx, uint64_t count ) const
+            throw ( SRAException );
+
+    public:
+
+        // C++ support
+
+        SRAObject & operator = ( SRAObjectRef o )
+            throw ();
+        SRAObject ( SRAObjectRef o )
+            throw ();
+
+        SRAObject & operator = ( const SRAObject & o )
+            throw ( SRAException );
+        SRAObject ( const SRAObject & o )
+            throw ( SRAException );
+
+        ~ SRAObject ()
+            throw ();
+
+    protected:
+
+        SRAObjectRef self;
+    };
+
+
+    /*----------------------------------------------------------------------
+     * SAMAlignment
+     *  represents data in a SAM/BAM record
+     */
+    class SAMAlignment
+    {
+    public:
+
+        /* qName
+         *  query-template name
+         */
+        String qName () const
+            throw ( SRAException );
+
+        /* rName
+         *  reference-sequence name
+         */
+        String rName () const
+            throw ( SRAException );
+
+        /* pos
+         *  1-based leftmost mapping position
+         *  starting position on reference
+         */
+        uint32_t pos () const
+            throw ( SRAException );
+
+        /* mapQ
+         *  mapping quality
+         */
+        uint8_t mapQ () const
+            throw ( SRAException );
+
+        /* cigar
+         *  cigar-string
+         *  a quasi-run-length-encoded representation of alignment traceback
+         */
+        String cigar () const
+            throw ( SRAException );
+
+        /* rNext
+         *  ref. name of the mate/next segment
+         */
+        String rNext () const
+            throw ( SRAException );
+
+        /* pNext
+         *  ref. position of the mate/next segment
+         */
+        uint32_t pNext () const
+            throw ( SRAException );
+
+        /* tLen
+         *  observed template length
+         */
+        int32_t tLen () const
+            throw ( SRAException );
+
+        /* seq
+         *  IUPAC bases or color-space
+         */
+        String seq () const
+            throw ( SRAException );
+
+        /* qual
+         *  returns per-base/color phred-33 quality scores
+         *  NB - phred-33 is an ASCII encoding using offset of 33
+         */
+        String qual () const
+            throw ( SRAException );
+
+
+        // conversion from SRA alignment
+
+        SAMAlignment & operator = ( const SRAAlignment & a )
+            throw ();
+        SAMAlignment ( const SRAAlignment & a )
+            throw ();
+
+    public:
+
+        // C++ support
+
+        SAMAlignment & operator = ( SAMAlignmentRef r )
+            throw ();
+        SAMAlignment ( SAMAlignmentRef r )
+            throw ();
+
+        SAMAlignment & operator = ( const SAMAlignment & a )
+            throw ( SRAException );
+        SAMAlignment ( const SAMAlignment & a )
+            throw ( SRAException );
+
+        ~ SAMAlignment ()
+            throw ();
+
+    protected:
+
+        SAMAlignmentRef self;
+    };
+
+    class SAMAlignmentIterator : public SAMAlignment
+    {
+    public:
+
+        /* next
+         *  advance to the next alignment
+         */
+        bool next ()
+            throw ( SRAException );
+
+        // conversion from SRA alignment iterator
+
+        SAMAlignmentIterator & operator = ( const SRAAlignmentIterator & i )
+            throw ( SRAException );
+        SAMAlignmentIterator ( const SRAAlignmentIterator & i )
+            throw ( SRAException );
+
+    public:
+
+        // C++ support
+
+        SAMAlignmentIterator ( SAMAlignmentRef r )
+            throw ();
+
+        SAMAlignmentIterator & operator = ( const SAMAlignmentIterator & i )
+            throw ( SRAException );
+        SAMAlignmentIterator ( const SAMAlignmentIterator & i )
+            throw ( SRAException );
+
+        ~ SAMAlignmentIterator ()
+            throw ();
+
+    private:
+        SAMAlignment & operator = ( const SRAAlignment & a )
+            throw ();
+        SAMAlignment & operator = ( const SAMAlignment & a )
+            throw ();
+        SAMAlignmentIterator & operator = ( SAMAlignmentRef r )
+            throw ();
+    };
+
+
+    /*----------------------------------------------------------------------
+     * SAMHeaders
+     *  attempts to assemble SAM header information
+     */
+    class SAMHeaders
+    {
+    public:
+
+        /* toString
+         *  generate headers as a text object
+         */
+        String toString () const
+            throw ( SRAException );
+
+        /* TBD
+         * list of readgroups
+         */
+
+        // extraction from an object
+        SAMHeaders & operator = ( const SRAObject & o )
+            throw ( SRAException );
+        SAMHeaders ( const SRAObject & o )
+            throw ( SRAException );
+
+    public:
+
+        // C++ support
+
+        SAMHeaders & operator = ( const SAMHeaders & h )
+            throw ();
+        SAMHeaders ( const SAMHeaders & h )
+            throw ();
+
+        ~ SAMHeaders ()
+            throw ();
+
+    private:
+
+        SAMHeadersRef self;
+    };
+
+
+    /*----------------------------------------------------------------------
+     * SAMFlags
+     *  extract "SAM flags" bits/word from an alignment
+     */
+    class SAMFlags
+    {
+    public:
+
+        /* multipleSegments ( COSTLY )
+         *  template having multiple segments in sequencing
+         */
+        bool multipleSegments () const
+            throw ( SRAException );
+
+        /* properlyAligned ( VERY EXPENSIVE )
+         *  each segment properly aligned according to the aligner
+         *  all the reads are aligned to the same chromosome
+         */
+        bool properlyAligned () const
+            throw ( SRAException );
+
+        /* unmapped
+         *  segment unmapped
+         */
+        bool unmapped () const
+            throw ( SRAException );
+
+        /* mateUnmapped ( COSTLY )
+         *  next segment in the template unmapped
+         */
+        bool mateUnmapped () const
+            throw ( SRAException );
+
+        /* reverseComp
+         *  SEQ being reverse complemented
+         */
+        bool reverseComp () const
+            throw ( SRAException );
+
+        /* mateReverseComp ( VERY EXPENSIVE )
+         *  SEQ of the next segment in the template being reversed
+         */
+        bool mateReverseComp () const
+            throw ( SRAException );
+
+        /* isFirst
+         *  the first segment in the template
+         */
+        bool isFirst () const
+            throw ( SRAException );
+
+        /* isLast
+         *  the last segment in the template
+         */
+        bool isLast () const
+            throw ( SRAException );
+
+        /* isSecondary
+         *  secondary alignment
+         */
+        bool isSecondary () const
+            throw ( SRAException );
+
+        /* failsQualityControl ( COSTLY )
+         *  not passing quality controls
+         */
+        bool failsQualityControl () const
+            throw ( SRAException );
+
+        /* isDuplicate ( COSTLY )
+         *  PCR or optical duplicate
+         */
+        bool isDuplicate () const
+            throw ( SRAException );
+
+        /* bits ( VERY EXPENSIVE )
+         *  access flags as bit-field
+         *  NB - may incur performance penalty
+         *  unless needing all fields, it may be
+         *  cheaper to access bit-fields individually
+         */
+        uint16_t bits () const
+            throw ( SRAException );
+
+    public:
+
+    private:
+
+        SAMAlignmentRef self;
+    };
+}
+
+#endif /* _hpp_simple_sra_ */
diff --git a/interfaces/sra/454.vschema b/interfaces/sra/454.vschema
new file mode 100644
index 0000000..a3f5bc5
--- /dev/null
+++ b/interfaces/sra/454.vschema
@@ -0,0 +1,289 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * NCBI 454 Sequence Read Archive schema
+ */
+version 1;
+
+include 'ncbi/sra.vschema';
+include 'ncbi/spotname.vschema';
+include 'ncbi/clip.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+/* dynamic_read_desc
+ *  uses inputs to determine read type and segmentation
+ *
+ *  "edit_distance" [ CONST, OPTIONAL ] - a tolerance figure for
+ *  linker matching, where 0 requires exact match, 5 is default.
+ *
+ *  "spot" [ DATA ] - bases for entire spot
+ *
+ *  "key" [ DATA, CONTROL ] - bases for key sequence. for version 1,
+ *  the first base following key is taken as biological start
+ *
+ *  "linker" [ DATA, CONTROL, OPTIONAL ] - if present, is used to separate
+ *  all bases following "key" into mate pair biological reads
+ *
+ *  returns a trio for each identified read, with read type, start and length
+ */
+typeset NCBI:SRA:_454_:drdparam_set { ascii, U8, INSDC:2na:packed };
+extern function
+U32 [ 3 ] NCBI:SRA:_454_:dynamic_read_desc #1 < * U32 edit_distance >
+    ( NCBI:SRA:_454_:drdparam_set spot, NCBI:SRA:_454_:drdparam_set key
+      * NCBI:SRA:_454_:drdparam_set linker );
+
+const U32 NCBI:SRA:_454_:dyn_read_type  = 0;
+const U32 NCBI:SRA:_454_:dyn_read_start = 1;
+const U32 NCBI:SRA:_454_:dyn_read_len   = 2;
+
+
+/* tokenize_spot_name
+ *  scans name on input
+ *  tokenizes into parts
+ */
+extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:_454_:tokenize_spot_name #1 ( ascii name );
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:_454_:common
+ *  Roche 454 SRA Platform
+ *
+ * history:
+ *  1.0.1 - explictly base upon sra #1.0.1
+ *  1.0.2 - bring in clip processing from external table
+ *  1.0.3 - base explicitly upon sra #1.0.2, clip #1.0.1
+ *  1.0.4 - base explicitly upon sra #1.0.3, clip #1.0.2
+ */
+table NCBI:SRA:_454_:common #1.0.4 = INSDC:SRA:tbl:sra #1.0.3, NCBI:SRA:tbl:clip #1.0.2
+{
+    /* PLATFORM
+     *  platform name is always 454
+     */
+    ascii platform_name
+        = < ascii > echo < "454" > ();
+
+    /* 454 TECHNICAL SEQUENCES
+     */
+    column INSDC:dna:text FLOW_CHARS = out_flow_chars;
+    INSDC:dna:text in_flow_chars
+        = < INSDC:dna:text, INSDC:dna:text > map < 'acgtn.', 'ACGTNN' > ( FLOW_CHARS );
+    column INSDC:dna:text KEY_SEQUENCE = out_key_sequence;
+    INSDC:dna:text in_key_sequence
+        = < INSDC:dna:text, INSDC:dna:text > map < 'acgtn.', 'ACGTNN' > ( KEY_SEQUENCE );
+    column INSDC:dna:text LINKER_SEQUENCE = out_linker_sequence;
+    INSDC:dna:text in_linker_sequence
+        = < INSDC:dna:text, INSDC:dna:text > map < 'acgtn.', 'ACGTNN' > ( LINKER_SEQUENCE );
+
+    // binary technical sequences
+    INSDC:x2na:bin out_flow_bin
+        = < INSDC:dna:text, INSDC:x2na:bin > map < INSDC:x2na:map:CHARSET, INSDC:x2na:map:BINSET > ( out_flow_chars );
+    INSDC:x2na:bin out_key_bin
+        = < INSDC:dna:text, INSDC:x2na:bin > map < INSDC:x2na:map:CHARSET, INSDC:x2na:map:BINSET > ( out_key_sequence );
+    INSDC:x2na:bin out_linker_bin
+        = < INSDC:dna:text, INSDC:x2na:bin > map < INSDC:x2na:map:CHARSET, INSDC:x2na:map:BINSET > ( out_linker_sequence );
+
+    /* SIGNAL
+     *  single channel integer
+     */
+    column NCBI:isamp1 SIGNAL = out_signal;
+    NCBI:isamp1 out_signal = .SIGNAL;
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  cs_native
+	 *  out_cs_key
+	 *  in_dna_text
+	 *  out_2cs_bin
+	 *  out_2na_bin
+	 *  out_4na_bin
+	 *  out_dna_text
+	 *  out_x2cs_bin
+	 *  out_x2na_bin
+	 *  out_2cs_packed
+	 *  out_2na_packed
+	 *  out_4na_packed
+	 *  out_color_text
+	 *  out_qual_phred
+	 *  out_color_matrix
+	 */
+
+	/* INSDC:SRA:tbl:spotname inherited productions
+	 *  out_x_coord
+	 *  out_y_coord
+	 *  out_name_fmt
+	 *  out_spot_name
+	 *  spot_ids_found
+	 */
+
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  trim_len
+	 *  out_label
+	 *  out_nreads
+	 *  trim_start
+	 *  out_read_len
+	 *  out_label_len
+	 *  out_rd_filter
+	 *  out_read_type
+	 *  out_read_start
+	 *  out_label_start
+	 *  static_fixed_spot_len
+	 */
+
+	/* INSDC:SRA:tbl:stats inherited productions
+	 *  base_count
+	 *  spot_count
+	 *  max_spot_id
+	 *  min_spot_id
+	 *  in_stats_bin
+	 *  bio_base_count
+	 */
+
+	/* NCBI:tbl:n_encoding inherited productions
+	 *  read_unpack
+	 */
+
+	/* NCBI:SRA:_454_:common productions
+	 *  .SIGNAL
+	 *  .CLIP_ADAPTER_LEFT
+	 *  .CLIP_QUALITY_LEFT
+	 *  .CLIP_ADAPTER_RIGHT
+	 *  .CLIP_QUALITY_RIGHT
+	 *  out_flow_chars
+	 *  out_key_sequence
+	 *  out_linker_sequence
+	 */
+};
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:_454_:tbl:v2
+ *  Roche 454 SRA Platform
+ *
+ * history:
+ *  1.0.1 - explictly base upon sra #1.0.1 and related changes
+ *  1.0.2 - respond to change to 454:common base table #1.0.2
+ */
+
+// encodings are declared to have their own version
+// so that they may be changed over time independently
+physical INSDC:coord:one NCBI:SRA:_454_:encoding:CLIP #2
+{
+    decode { return ( INSDC:coord:one ) iunzip ( @ ); }
+    encode { return izip ( @ ); }
+}
+
+physical NCBI:isamp1 NCBI:SRA:_454_:encoding:SIGNAL #2
+{
+    decode { return ( NCBI:isamp1 ) iunzip ( @ ); }
+    encode { return izip ( @ ); }
+}
+
+physical INSDC:position:one NCBI:SRA:_454_:encoding:POSITION #2
+{
+    decode
+    {
+        I32 pos_1st_deriv = iunzip ( @ );
+        return ( INSDC:position:one ) < I32 > integral ( pos_1st_deriv );
+    }
+    encode
+    { 
+        I32 pos_1st_deriv = < I32 > deriv ( @ );
+        return izip ( pos_1st_deriv ); 
+    }
+}
+
+/* normalized v2 table
+ *
+ * history:
+ *  1.0.6 - base upon updated ancestry
+ *  1.0.7 - base upon updated ancestry
+ */
+table NCBI:SRA:_454_:tbl:v2 #1.0.7
+    = NCBI:SRA:tbl:sra_nopos #2.1.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.3
+    , NCBI:SRA:_454_:common #1.0.4
+{
+    /* NAME tokenizing and coordinates
+     *  most work happens in skeyname table
+     *  we still obtain REGION from name
+     */
+    readonly column INSDC:coord:val REGION = ( INSDC:coord:val )
+        NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:T > ( _out_name, out_spot_name_tok );
+    NCBI:SRA:spot_name_token out_spot_name_tok
+        = NCBI:SRA:_454_:tokenize_spot_name ( _out_name );
+
+    NCBI:SRA:spot_name_token in_spot_name_tok
+        = NCBI:SRA:_454_:tokenize_spot_name ( NAME );
+
+    // special sequences
+    INSDC:dna:text out_flow_chars
+        = .FLOW_CHARS
+        | < INSDC:dna:text > echo < 'TACG' > ( .SIGNAL )
+        | < INSDC:dna:text > echo < 'TACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACG' > ();
+
+    physical column < INSDC:dna:text > zip_encoding
+        .FLOW_CHARS = in_flow_chars;
+
+    INSDC:dna:text out_key_sequence
+        = .KEY_SEQUENCE
+        | < INSDC:dna:text > echo < 'TCAG' > ();
+
+    physical column < INSDC:dna:text > zip_encoding
+        .KEY_SEQUENCE = in_key_sequence;
+
+    INSDC:dna:text out_linker_sequence = .LINKER_SEQUENCE;
+    physical column < INSDC:dna:text > zip_encoding
+        .LINKER_SEQUENCE = in_linker_sequence;
+
+// linker needs to be representable by its own table
+// either in metadata or somewhere else
+
+    // position stored as normal 1-based coordinate
+    INSDC:position:one out_position = .POSITION;
+    physical column NCBI:SRA:_454_:encoding:POSITION #2
+        .POSITION = POSITION;
+
+    // clips
+    physical column NCBI:SRA:_454_:encoding:CLIP #2
+        .CLIP_ADAPTER_LEFT = CLIP_ADAPTER_LEFT;
+    physical column NCBI:SRA:_454_:encoding:CLIP #2
+        .CLIP_ADAPTER_RIGHT = CLIP_ADAPTER_RIGHT;
+    physical column NCBI:SRA:_454_:encoding:CLIP #2
+        .CLIP_QUALITY_LEFT = CLIP_QUALITY_LEFT;
+    physical column NCBI:SRA:_454_:encoding:CLIP #2
+        .CLIP_QUALITY_RIGHT = CLIP_QUALITY_RIGHT;
+
+    // signal
+    physical column NCBI:SRA:_454_:encoding:SIGNAL #2
+        .SIGNAL = SIGNAL;
+};
diff --git a/interfaces/sra/abi.h b/interfaces/sra/abi.h
new file mode 100644
index 0000000..5fdc108
--- /dev/null
+++ b/interfaces/sra/abi.h
@@ -0,0 +1,167 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_sra_abi_
+#define _h_sra_abi_
+
+#ifndef _h_sra_rd_extern_
+#include <sra/rd-extern.h>
+#endif
+
+#ifndef _h_sra_sradb_
+#include <sra/sradb.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * AbsolidReader
+ */
+typedef struct AbsolidReader AbsolidReader;
+
+/* Make
+ *  create AbsolidReader reference based
+ *  on opened table and properties:
+ *     table      - SRATable
+ *     accession  - accession
+ *     minReadLen - minimal length of the outputed read, 0 - no minimum (FUSE)
+ *     origFormat - excludes SRR accession & length on defline
+ *     noclip     - don't clip quality left and right
+ *     minSpotId  - starting spot id, 0 - ignored (run information used)
+ *     maxSpotId  - ending spot id, 0 - ignored (run information used)
+ *                  you cannot seek out of range of [minSpotId:maxSpotId]
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReaderMake(const AbsolidReader** self, const SRATable* table,
+                                        const char* accession, bool origFormat,
+                                        bool noClip, uint32_t minReadLen,
+                                        spotid_t minSpotId, spotid_t maxSpotId, bool signal);
+
+/* Whack
+ *  releases object obtained from AbsolidReaderMake
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReaderWhack(const AbsolidReader* self);
+
+/* FirstSpot
+ *  set current spot to first in the run
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReaderFirstSpot(const AbsolidReader* self);
+
+/* SeekSpot
+ *  set current spot
+ * if error occured current spot position becomes 0
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReaderSeekSpot(const AbsolidReader* self, spotid_t spot);
+
+/* NextSpot
+ *  Seek to next spot from current
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReaderNextSpot(const AbsolidReader* self);
+
+/* CurrentSpot
+ *  Get current spot
+ *  sopt [OUT] - pointer to assign value of the current spot
+ * returns GetRCState(rc) == rcExhausted when out of spots
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReaderCurrentSpot(const AbsolidReader* self, spotid_t* spot);
+
+/* SpotInfo
+ *  Get current spot information
+ *  spotname [OUT] - pointer to assign value of the current spot name (can be NULL)
+ *  spotname_sz [OUT] - pointer to assign value of the length of the spot name (can be NULL)
+ *  spot_len [OUT] - pointer to assign value of the current spot length (can be NULL)
+ *  num_reads[OUT] - pointer to assign value of the number of reads in current spot (can be NULL)
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReader_SpotInfo(const AbsolidReader* self,
+                                             const char** spotname, size_t* spotname_sz,
+                                             uint32_t* spot_len, uint32_t* num_reads);
+/* SpotReadInfo
+ *  Get read information for current spot
+ *  readid    [IN]  - 1-based read id
+ *  read_type [OUT] - pointer to assign value of the read type (can be NULL)
+ *  read_label[OUT] - pointer to assign value of the read label (can be NULL)
+ *  read_label_sz [OUT] - pointer to assign value of the length of the read label (can be NULL)
+ *  read_start[OUT] - pointer to assign value of the read start in spot (can be NULL)
+ *  read_len  [OUT] - pointer to assign value of the read length (can be NULL)
+ *  cskey     [OUT] - pointer to assign value of the read color space key (can be NULL)
+ *  if start and len is == 0 read is empty
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReader_SpotReadInfo(const AbsolidReader* self, uint32_t readId, SRAReadTypes* read_type, 
+                                                 const char** read_label, INSDC_coord_len* read_label_sz,
+                                                 INSDC_coord_zero* read_start, INSDC_coord_len* read_len);
+
+/* SpotPrefix
+ *  retrieve current spot name prefix
+ *  prefix [OUT] - pointer to assign value of the spot name prefix
+ *  prefix_sz [OUT] - pointer to assign value of the length of the spot name prefix
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReaderSpotName(const AbsolidReader* self,
+                                            const char** prefix, size_t* prefix_sz,
+                                            const char** suffix, size_t* suffix_sz);
+
+/* BaseName
+ *  retrieve name string for the spot, result always has '\0' at the and (asciiz string)
+ *  readid [IN] - 1-based, if <= 0 than the whole spot, otherwise particular read
+ *  label  [IN] - overrides read label appending (printLabel), set to NULL by default
+ *  data   [IN] - pointer to buffer for printing
+ *  dsize  [IN] - data buffer size
+ *  written [IN,OUT] - optional number of bytes occupied by string
+ *                     (not including the trailing '\0' used to end output), may by more than dsize
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReaderHeader(const AbsolidReader* self, uint32_t readId,
+                                          char* data, size_t dsize, size_t* written);
+
+/* Base
+ *  retrieve bases for the spot
+ *  other parameters see description for AbsolidReaderBaseName above
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReaderBase(const AbsolidReader* self, uint32_t readId,
+                                        char* data, size_t dsize, size_t* written);
+
+/* Quality
+ *  retrieve quality string for the spot
+ *  other parameters see description for AbsolidReaderBaseName above
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReaderQuality(const AbsolidReader* self, uint32_t readId,
+                                           char* data, size_t dsize, size_t* written);
+
+/* Signals
+ *  retrieve signal string for the spot
+ *  other parameters see description for AbsolidReaderBaseName above
+ */
+SRA_RD_EXTERN rc_t CC AbsolidReaderSignalFTC(const AbsolidReader* self, uint32_t readId,
+                                             char* data, size_t dsize, size_t* written);
+SRA_RD_EXTERN rc_t CC AbsolidReaderSignalCY3(const AbsolidReader* self, uint32_t readId,
+                                             char* data, size_t dsize, size_t* written);
+SRA_RD_EXTERN rc_t CC AbsolidReaderSignalTXR(const AbsolidReader* self, uint32_t readId,
+                                             char* data, size_t dsize, size_t* written);
+SRA_RD_EXTERN rc_t CC AbsolidReaderSignalCY5(const AbsolidReader* self, uint32_t readId,
+                                             char* data, size_t dsize, size_t* written);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_abi_ */
diff --git a/interfaces/sra/abi.vschema b/interfaces/sra/abi.vschema
new file mode 100644
index 0000000..b4588d9
--- /dev/null
+++ b/interfaces/sra/abi.vschema
@@ -0,0 +1,241 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * NCBI ABI Sequence Read Archive schema
+ */
+version 1;
+
+include 'ncbi/sra.vschema';
+include 'ncbi/spotname.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:ABI
+ *  ABI SRA Platform
+ */
+
+/* tokenize_spot_name
+ *  scans name on input
+ *  tokenizes into parts
+ */
+extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:ABI:tokenize_spot_name #1 ( ascii name );
+
+
+/* NCBI:SRA:ABI:common
+ *  basic table interface based upon ABI's pipelines
+ *
+ * history:
+ *  1.0.1 - base explicitly upon changes to sra #1.0.1
+ *  1.0.2 - base explicitly upon sra #1.0.2
+ *  1.0.3 - base explicitly upon sra #1.0.3
+ */
+table NCBI:SRA:ABI:common #1.0.3 = INSDC:SRA:tbl:sra #1.0.3
+{
+    // platform name is always 'ABSOLID'
+    ascii platform_name
+        = < ascii > echo < "ABSOLID" > ();
+
+    /* TRIMMED SEQUENCE
+     *  need to find the 0-based trim_start and trim_len
+     */
+    INSDC:coord:zero bio_start = NCBI:SRA:bio_start ( out_read_start, out_read_type );
+    INSDC:coord:zero trim_start = bio_start;
+    U32 trim_left = ( U32 ) trim_start;
+    INSDC:coord:len trim_len = ( INSDC:coord:len ) < U32 > diff ( spot_len, trim_left );
+
+    /* COORDINATES
+     *  in addition to X and Y,
+     *  ABI has PANEL
+     */
+    column INSDC:coord:val PANEL = out_panel_coord;
+
+    // signal
+    column NCBI:fsamp4 SIGNAL
+        = out_signal;
+
+    NCBI:fsamp4 out_signal = ( NCBI:fsamp4 )
+        < NCBI:SRA:swapped_fsamp4 > NCBI:SRA:swap ( out_signal_swapped, out_x2cs_bin );
+
+
+	/* INSDC:tbl:sequence inherited productions
+	 *  cs_native
+	 *  in_cs_key
+	 *  out_cs_key
+	 *  out_signal_swapped
+	 *  out_2cs_bin
+	 *  out_2na_bin
+	 *  out_4na_bin
+	 *  out_dna_text
+	 *  out_x2cs_bin
+	 *  out_x2na_bin
+	 *  in_color_text
+	 *  out_2cs_packed
+	 *  out_2na_packed
+	 *  out_4na_packed
+	 *  out_color_text
+	 *  out_qual_phred
+	 *  out_color_matrix
+	 */
+
+	/* INSDC:SRA:tbl:spotname inherited productions
+	 *  out_x_coord
+	 *  out_y_coord
+	 *  out_name_fmt
+	 *  out_spot_name
+	 *  spot_ids_found
+	 */
+
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  out_label
+	 *  out_nreads
+	 *  out_read_len
+	 *  out_label_len
+	 *  out_rd_filter
+	 *  out_read_type
+	 *  out_read_start
+	 *  out_label_start
+	 *  static_fixed_spot_len
+	 */
+
+	/* INSDC:SRA:tbl:stats inherited productions
+	 *  base_count
+	 *  spot_count
+	 *  max_spot_id
+	 *  min_spot_id
+	 *  in_stats_bin
+	 *  bio_base_count
+	 */
+
+	/* INSDC:SRA:tbl:sra inherited productions
+	 *  out_platform
+	 */
+
+	/* NCBI:SRA:ABI:common productions
+	 *  out_panel_coord
+	 */
+};
+
+
+/* NCBI:SRA:ABI:tbl:v2 #1
+ *  normalized v2 table
+ *
+ * history:
+ *  1.0.1 - changes to sra #1.0.1
+ *  1.0.2 - changes to common #1.0.2
+ *  1.0.3 - sra #2.1.2, color_space #2.0.2, common #1.0.3
+ *  1.0.4 - updated ancestry
+ */
+physical NCBI:SRA:swapped_fsamp4 NCBI:SRA:ABI:encoding:SIGNAL #2
+{
+    decode { return NCBI:SRA:fsamp4:decode #2 ( @ ); }
+    encode { return NCBI:SRA:fsamp4:encode #2 < 14, 10 > ( @ ); }
+}
+
+table NCBI:SRA:ABI:tbl:v2 #1.0.4
+    = NCBI:SRA:tbl:sra #2.1.3
+    , NCBI:tbl:color_space #2.1.0
+    , NCBI:tbl:phred_quality #2.0.4
+    , NCBI:SRA:ABI:common #1.0.3
+{
+    /* NAME tokenizing and coordinates
+     *  most work happens in skeyname table
+     *  we still obtain PANEL from name
+     */
+    INSDC:coord:val out_panel_coord = ( INSDC:coord:val )
+        NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:T > ( _out_name, out_spot_name_tok );
+    NCBI:SRA:spot_name_token out_spot_name_tok
+        = NCBI:SRA:ABI:tokenize_spot_name ( _out_name );
+
+    NCBI:SRA:spot_name_token in_spot_name_tok
+        = NCBI:SRA:ABI:tokenize_spot_name ( NAME );
+
+
+    /* SIGNAL
+     *  optional, no longer archived
+     */
+
+    // support for individual color inputs
+    extern column NCBI:fsamp1 FTC
+    {
+        read = out_ftc;
+        validate = < F32 > no_compare #1 ( in_ftc, out_ftc );
+    }
+    NCBI:fsamp1 in_ftc = FTC;
+    NCBI:fsamp1 out_ftc
+        = ( NCBI:fsamp1 ) < F32 > cut < 0 > ( out_signal );
+
+    extern column NCBI:fsamp1 FAM
+    {
+        read = out_fam;
+        validate = < F32 > no_compare #1 ( in_fam, out_fam );
+    }
+    NCBI:fsamp1 in_fam = FAM;
+    NCBI:fsamp1 out_fam
+        = ( NCBI:fsamp1 ) < F32 > cut < 0 > ( out_signal );
+
+    extern column NCBI:fsamp1 CY3
+    {
+        read = out_cy3;
+        validate = < F32 > no_compare #1 ( in_cy3, out_cy3 );
+    }
+    NCBI:fsamp1 in_cy3 = CY3;
+    NCBI:fsamp1 out_cy3
+        = ( NCBI:fsamp1 ) < F32 > cut < 1 > ( out_signal );
+
+    extern column NCBI:fsamp1 TXR
+    {
+        read = out_txr;
+        validate = < F32 > no_compare #1 ( in_txr, out_txr );
+    }
+    NCBI:fsamp1 in_txr = TXR;
+    NCBI:fsamp1 out_txr
+        = ( NCBI:fsamp1 ) < F32 > cut < 2 > ( out_signal );
+
+    extern column NCBI:fsamp1 CY5
+    {
+        read = out_cy5;
+        validate = < F32 > no_compare #1 ( in_cy5, out_cy5 );
+    }
+    NCBI:fsamp1 in_cy5 = CY5;
+    NCBI:fsamp1 out_cy5
+        = ( NCBI:fsamp1 ) < F32 > cut < 3 > ( out_signal );
+
+    // intermediate input (writing) production
+    NCBI:fsamp4 in_signal
+        = SIGNAL
+        | ( NCBI:fsamp4 ) < F32 > paste ( in_ftc, in_cy3, in_txr, in_cy5 )
+        | ( NCBI:fsamp4 ) < F32 > paste ( in_fam, in_cy3, in_txr, in_cy5 );
+
+    // overridden output production
+    NCBI:SRA:swapped_fsamp4 out_signal_swapped = .SIGNAL;
+
+    // rule for writing SIGNAL
+    physical column NCBI:SRA:ABI:encoding:SIGNAL #2 .SIGNAL
+        = ( NCBI:SRA:swapped_fsamp4 ) < NCBI:fsamp4 > NCBI:SRA:swap ( in_signal, in_x2cs_bin )
+        | ( NCBI:SRA:swapped_fsamp4 ) < NCBI:fsamp4 > NCBI:SRA:swap ( in_signal, in_2cs_bin );
+};
diff --git a/interfaces/sra/extern.h b/interfaces/sra/extern.h
new file mode 100644
index 0000000..aa32b37
--- /dev/null
+++ b/interfaces/sra/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_extern_
+#define _h_sra_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define SRA_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define SRA_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_sra_extern_ */
diff --git a/interfaces/sra/fastq.h b/interfaces/sra/fastq.h
new file mode 100644
index 0000000..b53c3b3
--- /dev/null
+++ b/interfaces/sra/fastq.h
@@ -0,0 +1,191 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_sra_fastq_
+#define _h_sra_fastq_
+
+#ifndef _h_sra_rd_extern_
+#include <sra/rd-extern.h>
+#endif
+
+#ifndef _h_sra_sradb_
+#include <sra/sradb.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * FastqReader
+ */
+typedef struct FastqReader FastqReader;
+
+/* Make
+ *  create FastqReader reference based
+ *  on opened table and properties:
+ *     table      - SRATable
+ *     accession  - accession
+ *     minReadLen - minimal length of the outputed read, 0 - no minimum (FUSE)
+ *     colorSpace - color space sequence
+ *     origFormat - excludes SRR accession & length on defline
+ *     fasta      - prepare only reads, no qualities
+ *     readLabel  - prints read label on the name line
+ *     readId     - prints .read in spot id on the name line (not in origFormat)
+ *     noclip     - don't clip quality left and right
+ *     offset     - offset to use for quality conversion (default is 33)
+ *     csKey      - desired color space key, '\0' - do not convert
+ *     minSpotId  - starting spot id, 0 - ignored (run information used)
+ *     maxSpotId  - ending spot id, 0 - ignored (run information used)
+ *                  you cannot seek out of range of [minSpotId:maxSpotId]
+ */
+SRA_RD_EXTERN rc_t CC FastqReaderMake(const FastqReader** self, const SRATable* table, const char* accession,
+                                      bool colorSpace, bool origFormat, bool fasta,
+                                      bool printLabel, bool printReadId,
+                                      bool noClip, bool SuppressQualForCSKey, uint32_t minReadLen,
+                                      char offset, char csKey,
+                                      spotid_t minSpotId, spotid_t maxSpotId);
+
+/* Whack
+ *  releases object obtained from FastqReaderMake
+ */
+SRA_RD_EXTERN rc_t CC FastqReaderWhack(const FastqReader* self);
+
+/* FirstSpot
+ *  set current spot to first in the run
+ */
+SRA_RD_EXTERN rc_t CC FastqReaderFirstSpot(const FastqReader* self);
+
+/* SeekSpot
+ *  set current spot
+ * if error occured current spot position becomes 0
+ */
+SRA_RD_EXTERN rc_t CC FastqReaderSeekSpot(const FastqReader* self, spotid_t spot);
+
+/* NextSpot
+ *  Seek to next spot from current
+ */
+SRA_RD_EXTERN rc_t CC FastqReaderNextSpot(const FastqReader* self);
+
+/* CurrentSpot
+ *  Get current spot
+ *  sopt [OUT] - pointer to assign value of the current spot
+ * returns GetRCState(rc) == rcExhausted when out of spots
+ */
+SRA_RD_EXTERN rc_t CC FastqReaderCurrentSpot(const FastqReader* self, spotid_t* spot);
+
+/* SpotInfo
+ *  Get current spot information
+ *  spotname [OUT] - pointer to assign value of the current spot name (can be NULL)
+ *  spotname_sz [OUT] - pointer to assign value of the length of the spot name (can be NULL)
+ *  spotgroup [OUT] - pointer to assign value of the current spot group (can be NULL)
+ *  spotgroup_sz [OUT] - pointer to assign value of the length of the spot group (can be NULL)
+ *  spot_len [OUT] - pointer to assign value of the current spot length (can be NULL)
+ *  num_reads[OUT] - pointer to assign value of the number of reads in current spot (can be NULL)
+ */
+SRA_RD_EXTERN rc_t CC FastqReader_SpotInfo(const FastqReader* self,
+                                           const char** spotname, size_t* spotname_sz,
+                                           const char** spotgroup, size_t* spotgroup_sz,
+                                           uint32_t* spot_len, uint32_t* num_reads);
+
+/* SpotReadInfo
+ *  Get read information for current spot
+ *  readid    [IN]  - 1-based read id
+ *  read_type [OUT] - pointer to assign value of the read type (can be NULL)
+ *  read_label[OUT] - pointer to assign value of the read label (can be NULL)
+ *  read_label_sz [OUT] - pointer to assign value of the length of the read label (can be NULL)
+ *  read_start[OUT] - pointer to assign value of the read start in spot (can be NULL)
+ *  read_len  [OUT] - pointer to assign value of the read length (can be NULL)
+ *  cskey     [OUT] - pointer to assign value of the read color space key (can be NULL)
+ *  if start and len is == 0 read is empty
+ */
+SRA_RD_EXTERN rc_t CC FastqReader_SpotReadInfo(const FastqReader* self, uint32_t readId, SRAReadTypes* read_type, 
+                                               const char** read_label, INSDC_coord_len* read_label_sz,
+                                               INSDC_coord_zero* read_start, INSDC_coord_len* read_len);
+
+/* BaseName
+ *  retrieve name string for the spot, result always has '\0' at the and (asciiz string)
+ *  readid [IN] - 1-based, if <= 0 than the whole spot, otherwise particular read
+ *  label  [IN] - overrides read label appending (printLabel), set to NULL by default
+ *  data   [IN] - pointer to buffer for printing
+ *  dsize  [IN] - data buffer size
+ *  written [IN,OUT] - optional number of bytes occupied by string
+ *                     (not including the trailing '\0' used to end output), may by more than dsize
+ */
+SRA_RD_EXTERN rc_t CC FastqReaderBaseName(const FastqReader* self, uint32_t readId,
+                                          bool* label, char* data, size_t dsize, size_t* written);
+
+/* Base
+ *  retrieve bases for the spot
+ *  other parameters see description for FastqReaderBaseName above
+ */
+SRA_RD_EXTERN rc_t CC FastqReaderBase(const FastqReader* self, uint32_t readId,
+                                      char* data, size_t dsize, size_t* written);
+
+/* QualityName
+ *  retrieve quality name string for the spot
+ *  other parameters see description for FastqReaderBaseName above
+ */
+SRA_RD_EXTERN rc_t CC FastqReaderQualityName(const FastqReader* self, uint32_t readId,
+                                             bool* label, char* data, size_t dsize, size_t* written);
+
+/* Quality
+ *  retrieve quality string for the spot
+ *  other parameters see description for FastqReaderBaseName above
+ */
+SRA_RD_EXTERN rc_t CC FastqReaderQuality(const FastqReader* self, uint32_t readId,
+                                         char* data, size_t dsize, size_t* written);
+
+/* GetCurrentSpotData
+ *  retrieve current spot data as a blob
+ *  other parameters see description for FastqReaderBaseName above
+ */
+SRA_RD_EXTERN rc_t CC FastqReader_GetCurrentSpotData(const FastqReader* self,
+                                                     char* data, size_t dsize, size_t* written);
+
+/* GetCurrentSpotSplitData
+ * same as above but split spot into line with individual reads
+ */
+SRA_RD_EXTERN rc_t CC FastqReader_GetCurrentSpotSplitData(const FastqReader* self,
+                                                          char* data, size_t dsize, size_t* written);
+
+/* GetNextSpotData (streaming function)
+ *  move to the next spot and retrieve current spot data as a blob
+ *  other parameters see description for FastqReaderBaseName above
+ */
+SRA_RD_EXTERN rc_t CC FastqReader_GetNextSpotData(const FastqReader* self,
+                                                  char* data, size_t dsize, size_t* written);
+
+/* GetNextSpotSplitData (streaming function)
+ * same as above but split spot into line with individual reads
+ */
+SRA_RD_EXTERN rc_t CC FastqReader_GetNextSpotSplitData(const FastqReader* self,
+                                                       char* data, size_t dsize, size_t* written);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_fastq_ */
diff --git a/interfaces/sra/generic-fastq.vschema b/interfaces/sra/generic-fastq.vschema
new file mode 100644
index 0000000..2c29d13
--- /dev/null
+++ b/interfaces/sra/generic-fastq.vschema
@@ -0,0 +1,265 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/*==========================================================================
+ * NCBI Generic Fastq Sequence Read Archive schema
+ */
+version 1;
+
+include 'insdc/sra.vschema';
+include 'ncbi/sra.vschema';
+include 'ncbi/clip.vschema';
+include 'ncbi/spotname.vschema';
+
+/* tokenize_spot_name - currently ascii only capability */
+
+extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:GenericFastq:tokenize_spot_name #1 ( ascii name );
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:GenericFastq:sequence
+ *  Generic Fastq SRA Platform
+ */
+table NCBI:SRA:GenericFastq:sequence #1
+    = NCBI:SRA:tbl:sra #2.1.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.4
+    , NCBI:SRA:tbl:clip #1.0.2
+{
+    ascii platform_name
+        = < ascii > echo < "UNDEFINED" > ();
+
+    INSDC:SRA:platform_id out_platform
+        = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_UNDEFINED > ();
+
+	/* ascii only spot name tokenizer */
+
+    NCBI:SRA:spot_name_token out_spot_name_tok
+        = NCBI:SRA:GenericFastq:tokenize_spot_name ( _out_name );
+
+    NCBI:SRA:spot_name_token in_spot_name_tok
+        = NCBI:SRA:GenericFastq:tokenize_spot_name ( NAME );
+
+    /* clips */
+
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_ADAPTER_LEFT = CLIP_ADAPTER_LEFT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_ADAPTER_RIGHT = CLIP_ADAPTER_RIGHT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_QUALITY_LEFT = CLIP_QUALITY_LEFT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_QUALITY_RIGHT = CLIP_QUALITY_RIGHT;
+}
+
+database NCBI:SRA:GenericFastq:db #1
+{
+    table NCBI:SRA:GenericFastq:sequence #1.0 SEQUENCE;
+};
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:GenericFastq:sequence_no_name
+ *  Generic Fastq SRA Platform (without name)
+ */
+table NCBI:SRA:GenericFastq:sequence_no_name #1
+    = NCBI:SRA:tbl:sra #2.1.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.4
+    , NCBI:SRA:tbl:clip #1.0.2
+{
+    ascii platform_name
+        = < ascii > echo < "UNDEFINED" > ();
+
+    INSDC:SRA:platform_id out_platform
+        = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_UNDEFINED > ();
+
+    /* clips */
+
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_ADAPTER_LEFT = CLIP_ADAPTER_LEFT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_ADAPTER_RIGHT = CLIP_ADAPTER_RIGHT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_QUALITY_LEFT = CLIP_QUALITY_LEFT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_QUALITY_RIGHT = CLIP_QUALITY_RIGHT;
+}
+
+database NCBI:SRA:GenericFastqNoNames:db #1
+{
+    table NCBI:SRA:GenericFastq:sequence_no_name #1.0 SEQUENCE;
+};
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:GenericFastq:sequence_log_odds
+ *  Generic Fastq SRA Platform (for log_odds)
+ */
+table NCBI:SRA:GenericFastq:sequence_log_odds #1
+    = NCBI:SRA:tbl:sra #2.1.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:log_odds_quality #2.1.0
+    , NCBI:SRA:tbl:clip #1.0.2
+{
+    ascii platform_name
+        = < ascii > echo < "UNDEFINED" > ();
+
+    INSDC:SRA:platform_id out_platform
+        = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_UNDEFINED > ();
+
+	/* ascii only spot name tokenizer */
+
+    NCBI:SRA:spot_name_token out_spot_name_tok
+        = NCBI:SRA:GenericFastq:tokenize_spot_name ( _out_name );
+
+    NCBI:SRA:spot_name_token in_spot_name_tok
+        = NCBI:SRA:GenericFastq:tokenize_spot_name ( NAME );
+
+    /* clips */
+
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_ADAPTER_LEFT = CLIP_ADAPTER_LEFT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_ADAPTER_RIGHT = CLIP_ADAPTER_RIGHT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_QUALITY_LEFT = CLIP_QUALITY_LEFT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_QUALITY_RIGHT = CLIP_QUALITY_RIGHT;
+}
+
+database NCBI:SRA:GenericFastqLogOdds:db #1
+{
+    table NCBI:SRA:GenericFastq:sequence_log_odds #1.0 SEQUENCE;
+};
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:GenericFastq:sequence_nanopore
+ *  Oxford Nanopore SRA Platform
+ */
+table NCBI:SRA:GenericFastq:sequence_nanopore #1
+    = NCBI:SRA:tbl:sra #2.1.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.4
+{
+    ascii platform_name
+        = < ascii > echo < "OXFORD_NANOPORE" > ();
+        
+    INSDC:SRA:platform_id out_platform
+        = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_OXFORD_NANOPORE > ();
+
+	/* ascii only spot name tokenizer */
+
+    NCBI:SRA:spot_name_token out_spot_name_tok
+        = NCBI:SRA:GenericFastq:tokenize_spot_name ( _out_name );
+
+    NCBI:SRA:spot_name_token in_spot_name_tok
+        = NCBI:SRA:GenericFastq:tokenize_spot_name ( NAME );
+
+	/* channel and read number columns */
+
+    extern column < U32 > izip_encoding #1 CHANNEL;
+    extern column < U32 > izip_encoding #1 READ_NUMBER;
+}
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:GenericFastq:consensus_nanopore
+ *  Oxford Nanopore SRA Platform
+ */
+table NCBI:SRA:GenericFastq:consensus_nanopore #1
+    = NCBI:SRA:tbl:sra #2.1.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.4
+{
+    ascii platform_name
+        = < ascii > echo < "OXFORD_NANOPORE" > ();
+        
+    INSDC:SRA:platform_id out_platform
+        = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_OXFORD_NANOPORE > ();
+
+	/* ascii only spot name tokenizer */
+
+    NCBI:SRA:spot_name_token out_spot_name_tok
+        = NCBI:SRA:GenericFastq:tokenize_spot_name ( _out_name );
+
+    NCBI:SRA:spot_name_token in_spot_name_tok
+        = NCBI:SRA:GenericFastq:tokenize_spot_name ( NAME );
+
+	/* channel and read number columns */
+
+    extern column < U32 > izip_encoding #1 CHANNEL;
+    extern column < U32 > izip_encoding #1 READ_NUMBER;
+}
+
+database NCBI:SRA:GenericFastqNanopore:db #1
+{
+    table NCBI:SRA:GenericFastq:sequence_nanopore #1.0 SEQUENCE;
+    table NCBI:SRA:GenericFastq:consensus_nanopore #1.0 CONSENSUS;
+};
+
+database NCBI:SRA:GenericFastqNanoporeConsensusOnly:db #1
+{
+    table NCBI:SRA:GenericFastq:consensus_nanopore #1.0 CONSENSUS;
+};
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:GenericFastq:absolid
+ *  Generic fastq for AB Solid platform
+ */
+table NCBI:SRA:GenericFastq:absolid #1
+    = NCBI:SRA:tbl:sra #2.1.3
+    , NCBI:tbl:color_space #2.1.0
+    , NCBI:tbl:phred_quality #2.0.4
+    , NCBI:SRA:tbl:clip #1.0.2
+{
+    ascii platform_name
+        = < ascii > echo < "UNDEFINED" > ();
+
+    INSDC:SRA:platform_id out_platform
+        = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_UNDEFINED > ();
+
+	/* ascii only spot name tokenizer */
+
+    NCBI:SRA:spot_name_token out_spot_name_tok
+        = NCBI:SRA:GenericFastq:tokenize_spot_name ( _out_name );
+
+    NCBI:SRA:spot_name_token in_spot_name_tok
+        = NCBI:SRA:GenericFastq:tokenize_spot_name ( NAME );
+
+    /* clips */
+
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_ADAPTER_LEFT = CLIP_ADAPTER_LEFT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_ADAPTER_RIGHT = CLIP_ADAPTER_RIGHT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_QUALITY_LEFT = CLIP_QUALITY_LEFT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_QUALITY_RIGHT = CLIP_QUALITY_RIGHT;
+}
+
+database NCBI:SRA:GenericFastqAbsolid:db #1
+{
+    table NCBI:SRA:GenericFastq:absolid #1.0 SEQUENCE;
+};
diff --git a/interfaces/sra/helicos.vschema b/interfaces/sra/helicos.vschema
new file mode 100644
index 0000000..e758a0b
--- /dev/null
+++ b/interfaces/sra/helicos.vschema
@@ -0,0 +1,85 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * NCBI Helicos Sequence Read Archive schema
+ */
+version 1;
+
+include 'ncbi/sra.vschema';
+include 'ncbi/spotname.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+/* tokenize_spot_name
+ *  scans name on input
+ *  tokenizes into parts
+ */
+extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:Helicos:tokenize_spot_name #1 ( ascii name );
+
+
+/* Helicos:tbl
+ *
+ * history:
+ *  1.0.1 - explictly base upon ancestry
+ *  1.0.2 - base explicitly upon latest ancestry
+ *  1.0.3 - base explicitly upon latest ancestry
+ *  1.0.4 - base explicitly upon latest ancestry
+ */
+table NCBI:SRA:Helicos:tbl:v2 #1.0.4
+    = NCBI:SRA:tbl:sra #2.1.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.3
+{
+    ascii platform_name
+        = < ascii > echo < "HELICOS" > ();
+
+    /* NAME tokenizing and coordinates
+     *  most work happens in skeyname table
+     *  we still obtain REGION from name
+     */
+
+    readonly column INSDC:coord:val CHANNEL = ( INSDC:coord:val )
+        NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:L > ( _out_name, out_spot_name_tok );
+    readonly column INSDC:coord:val FIELD = ( INSDC:coord:val )
+        NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:T > ( _out_name, out_spot_name_tok );
+    NCBI:SRA:spot_name_token out_spot_name_tok
+        = NCBI:SRA:Helicos:tokenize_spot_name ( _out_name );
+
+    readonly column INSDC:coord:val CAMERA = out_x_coord;
+    readonly column INSDC:coord:val POS = out_y_coord;
+
+    NCBI:SRA:spot_name_token in_spot_name_tok
+        = NCBI:SRA:Helicos:tokenize_spot_name ( NAME );
+
+    INSDC:coord:zero trim_start
+        = < INSDC:coord:zero > echo < 0 > ();
+    INSDC:coord:len trim_len = spot_len;
+};
diff --git a/interfaces/sra/illumina.h b/interfaces/sra/illumina.h
new file mode 100644
index 0000000..73062f8
--- /dev/null
+++ b/interfaces/sra/illumina.h
@@ -0,0 +1,170 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_sra_illumina_
+#define _h_sra_illumina_
+
+#ifndef _h_sra_rd_extern_
+#include <sra/rd-extern.h>
+#endif
+
+#ifndef _h_sra_sradb_
+#include <sra/sradb.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * IlluminaReader
+ */
+typedef struct IlluminaReader IlluminaReader;
+
+/* Make
+ *  create IlluminaReader reference based
+ *  on opened table and properties:
+ *     table      - SRATable
+ *     accession  - accession
+ *     read       - output reads
+ *     qual1      - output quality1
+ *     qual4      - output quality4
+ *     intensity  - output intensity
+ *     noise      - output noise
+ *     signal     - output signal
+ *     qseq       - output QSEQ format
+ *     minSpotId  - starting spot id, 0 - ignored (run information used)
+ *     maxSpotId  - ending spot id, 0 - ignored (run information used)
+ *                  you cannot seek out of range of [minSpotId:maxSpotId]
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderMake(const IlluminaReader** self, const SRATable* table, const char* accession,
+                                         bool read, bool qual1, bool qual4,
+                                         bool intensity, bool noise, bool signal, bool qseq,
+                                         spotid_t minSpotId, spotid_t maxSpotId);
+/* Whack
+ *  releases object obtained from IlluminaReaderMake
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderWhack(const IlluminaReader* self);
+
+/* FirstSpot
+ *  set current spot to first in the run
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderFirstSpot(const IlluminaReader* self);
+
+/* SeekSpot
+ *  set current spot
+ * if error occured current spot position becomes 0
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderSeekSpot(const IlluminaReader* self, spotid_t spot);
+
+/* NextSpot
+ *  Seek to next spot from current
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderNextSpot(const IlluminaReader* self);
+
+/* CurrentSpot
+ *  Get current spot
+ *  sopt [OUT] - pointer to assign value of the current spot
+ * returns GetRCState(rc) == rcExhausted when out of spots
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderCurrentSpot(const IlluminaReader* self, spotid_t *spot);
+
+/* SpotInfo
+ *  Get current spot information
+ *  spotname [OUT] - pointer to assign value of the current spot name (can be NULL)
+ *  spot_len [OUT] - pointer to assign value of the current spot length (can be NULL)
+ *  num_reads[OUT] - pointer to assign value of the number of reads in current spot (can be NULL)
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReader_SpotInfo(const IlluminaReader* self,
+                                              const char** spotname, size_t* spotname_sz,
+                                              INSDC_coord_val* lane, INSDC_coord_val* tile, 
+                                              INSDC_coord_val* x, INSDC_coord_val* y,
+                                              uint32_t* spot_len, uint32_t* num_reads);
+/* SpotReadInfo
+ *  Get read information for current spot
+ *  readid    [IN]  - 1-based read id
+ *  read_label[OUT] - pointer to assign value of the read label (can be NULL)
+ *  read_type [OUT] - pointer to assign value of the read type (can be NULL)
+ *  read_start[OUT] - pointer to assign value of the read start in spot (can be NULL)
+ *  read_len  [OUT] - pointer to assign value of the read length (can be NULL)
+ *  cskey     [OUT] - pointer to assign value of the read color space key (can be NULL)
+ *  if start and len is == 0 read is empty
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReader_SpotReadInfo(const IlluminaReader* self, uint32_t readId, SRAReadTypes* read_type,
+                                                  const char** read_label, INSDC_coord_len* read_label_sz,
+                                                  INSDC_coord_zero* read_start, INSDC_coord_len* read_len);
+
+/* Base
+ *  retrieve bases for the spot, result always has '\0' at the and (asciiz string)
+ *  data   [IN] - pointer to buffer for printing
+ *  dsize  [IN] - data buffer size
+ *  written [IN,OUT] - optional number of bytes occupied by string
+ *                     (not including the trailing '\0' used to end output), may by more than dsize
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderBase(const IlluminaReader* self, char* data, size_t dsize, size_t* written);
+
+/* Noise
+ *  retrieve noise in 4 floats per base format
+ *  other parameters see description for IlluminaReaderBase above
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderNoise(const IlluminaReader* self, char* data, size_t dsize, size_t* written);
+
+/* Intensity
+ *  retrieve intensity in 4 floats per base format
+ *  other parameters see description for IlluminaReaderBase above
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderIntensity(const IlluminaReader* self, char* data, size_t dsize, size_t* written);
+
+/* Signal
+ *  retrieve signal in 4 floats per base format
+ *  other parameters see description for IlluminaReaderBase above
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderSignal(const IlluminaReader* self, char* data, size_t dsize, size_t* written);
+
+/* Quality (BINARY)
+ *  retrieve quality as single bytes per bases
+ *  readid [IN] - 1-based, if <= 0 than the whole spot, otherwise particular read
+ *  other parameters see description for IlluminaReaderBase above
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderQuality1(const IlluminaReader* self, uint32_t readId, char* data, size_t dsize, size_t* written);
+
+/* Quality
+ *  retrieve quality in 4 integers per base format
+ *  other parameters see description for IlluminaReaderBase above
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderQuality4(const IlluminaReader* self, char* data, size_t dsize, size_t* written);
+
+/* QSeq
+ *  spot information as in QSEQ format
+ *  other parameters see description for IlluminaReaderBase above
+ */
+SRA_RD_EXTERN rc_t CC IlluminaReaderQSeq(const IlluminaReader* self, uint32_t readId, bool spot_group,
+                                         char* data, size_t dsize, size_t* written);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_illumina_ */
diff --git a/interfaces/sra/illumina.vschema b/interfaces/sra/illumina.vschema
new file mode 100644
index 0000000..84d65aa
--- /dev/null
+++ b/interfaces/sra/illumina.vschema
@@ -0,0 +1,408 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * NCBI Illumina Sequence Read Archive schema
+ */
+version 1;
+
+include 'ncbi/sra.vschema';
+include 'ncbi/spotname.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * types
+ */
+
+typedef INSDC:quality:log_odds NCBI:qual4 [ 4 ];
+typedef NCBI:qual4 NCBI:SRA:rotated_qual4, NCBI:SRA:swapped_qual4;
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+/* tokenize_spot_name
+ *  scans name on input
+ *  tokenizes into parts
+ */
+extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:Illumina:tokenize_spot_name #1 ( ascii name );
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:Illumina:qual4
+ *  4-channel log-odds-ish quality
+ */
+
+/* history:
+ *  1.0.1 - base explicitly upon updated ancestry
+ */
+table NCBI:SRA:Illumina:qual4_nocol #1.0.1
+    = INSDC:tbl:sequence #1.0.1
+    , NCBI:tbl:log_odds_quality_nocol #1.0.1
+{
+    /* QUALITY
+     *  4-channel quality column
+     */
+    readonly column NCBI:qual4 QUALITY = out_qual4;
+
+    NCBI:qual4 out_qual4
+        = < NCBI:qual4 > NCBI:SRA:swap ( out_qual4_swapped, read_unpack )
+        | < NCBI:qual4 > NCBI:SRA:rotate < false > ( out_qual4_rotated, read_unpack );
+
+
+    /* single-channel output
+     *  convert 4-channel log-odds to single channel
+     *  must retain n-encoding, which was intended to be the 4-channel pattern
+     *  ( -5, -5, -5, -5 ) and a base of 'A'
+     */
+
+    // first, extract quality for called base
+    INSDC:quality:log_odds out_qual1_ch0
+        = < INSDC:quality:log_odds> cut < 0 > ( out_qual4_swapped )
+        | < INSDC:quality:log_odds> cut < 0 > ( out_qual4_rotated );
+
+    // clip it to -5 and above
+    INSDC:quality:log_odds out_qual1_clip
+        = < INSDC:quality:log_odds > clip < -5, 127 > ( out_qual1_ch0 );
+
+    // convert 4 channel to single 32-bit value
+    U32 out_qual4_32
+        = redimension ( out_qual4_swapped )
+        | redimension ( out_qual4_rotated );
+
+    // detect ( -5, -5, -5, -5 ) and introduce a -6 value into log-odds
+    // this is treated as an 'N', but still not ready
+    INSDC:quality:log_odds out_qual1_fives
+        = < U32, INSDC:quality:log_odds > map < 0xFBFBFBFB, -6 > ( out_qual4_32, out_qual1_clip );
+
+    // now slam zeros into anything that doesn't correspond to an A
+    // essentially this leaves all of the A qualities. any having -6 are really N.
+    INSDC:quality:log_odds out_qual1_n
+        = < U8, INSDC:quality:log_odds > map < [ 1, 2, 3 ], [ 0, 0, 0 ] > ( read_unpack, out_qual1_fives );
+
+    // finally, produce log-odds with n-encoded as -6
+    INSDC:quality:log_odds out_qual_log_odds
+        = < INSDC:quality:log_odds, INSDC:quality:log_odds > map < -6, -6 > ( out_qual1_n, out_qual1_clip );
+
+
+	/* NCBI:tbl:n_encoding inherited productions
+	 *  read_unpack
+	 */
+
+	/* NCBI:SRA:Illumina:qual4_nocol productions
+	 *  out_qual4_rotated
+	 *  out_qual4_swapped
+	 */
+};
+
+
+/* 4-channel log-odds compression
+ */
+
+// encoded type - a single byte code for 4-channel pattern
+typedef B8 NCBI:SRA:encoded_qual4;
+
+// decoding function
+extern function
+NCBI:SRA:swapped_qual4 NCBI:SRA:qual4_decode #1 ( NCBI:SRA:encoded_qual4 in );
+
+// encoding function
+extern function
+NCBI:SRA:encoded_qual4 NCBI:SRA:qual4_encode #1 ( NCBI:SRA:swapped_qual4 in );
+
+// compression rules
+physical NCBI:SRA:swapped_qual4 NCBI:SRA:qual4_encoding #1
+{
+    encode
+    {
+        // produce codes
+        NCBI:SRA:encoded_qual4 encoded = NCBI:SRA:qual4_encode ( @ );
+
+        // gzip
+        return zip < Z_RLE, Z_BEST_SPEED > ( encoded );
+    }
+
+    decode
+    {
+        // gunzip
+        NCBI:SRA:encoded_qual4 unzipped = unzip ( @ );
+        
+        // inflate to swapped
+        return NCBI:SRA:qual4_decode ( unzipped );
+    }
+}
+
+/* history:
+ *  1.0.1 - base upon updated qual4_nocol
+ */
+table NCBI:SRA:Illumina:qual4 #1.0.1 = NCBI:SRA:Illumina:qual4_nocol #1.0.1
+{
+    // read directly as swapped, n-encoded log_odds
+    NCBI:SRA:swapped_qual4 out_qual4_swapped = .QUALITY;
+
+	/* NCBI:tbl:n_encoding inherited virtual productions
+	 *  read_unpack
+	 */
+};
+
+/* history:
+ *  2.0.2 - base upon updated ancestry
+ *  2.0.3 - base upon updated ancestry
+ *  2.0.4 - base upon updated ancestry
+ *  2.1.0 - base upon updated ancestry, added in_qual_log_odds
+ */
+table NCBI:SRA:Illumina:qual4 #2.1.0
+    = NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:log_odds_quality_nocol #2.1.0
+{
+    /* QUALITY
+     *  4-channel log-odds
+     */
+    extern column NCBI:qual4 QUALITY = out_qual4;
+
+    NCBI:SRA:swapped_qual4 in_qual4
+        = ( NCBI:SRA:swapped_qual4 ) < NCBI:qual4 > NCBI:SRA:swap ( QUALITY, in_x2na_bin )
+        | ( NCBI:SRA:swapped_qual4 ) < NCBI:qual4 > NCBI:SRA:swap ( QUALITY, in_2na_bin );
+
+    NCBI:qual4 out_qual4
+        = < NCBI:SRA:swapped_qual4 > NCBI:SRA:swap ( .QUALITY, out_x2na_bin );
+
+    physical column NCBI:SRA:qual4_encoding .QUALITY = in_qual4;
+
+    // feed to compressed statistics
+    NCBI:qual4 in_stats_qual = in_qual4;
+
+    // single channel
+    INSDC:quality:log_odds in_qual_log_odds
+        = < INSDC:quality:log_odds > cut < 0 > ( in_qual4 );
+    INSDC:quality:log_odds out_qual_log_odds
+        = < INSDC:quality:log_odds > cut < 0 > ( .QUALITY );
+};
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:Illumina
+ *  Illumina SRA Platform
+ */
+
+
+/* NCBI:SRA:Illumina:common #1
+ *  basic table interface based upon Illumina's pipelines
+ *
+ * history:
+ *  1.0.1 - explictly base upon sra #1.0.1
+ *  1.0.2 - base explicitly upon sra #1.0.2
+ *  1.0.3 - base explicitly upon sra #1.0.3
+ */
+table NCBI:SRA:Illumina:common #1.0.3 = INSDC:SRA:tbl:sra #1.0.3
+{
+    // platform name is always 'ILLUMINA'
+    ascii platform_name
+        = < ascii > echo < "ILLUMINA" > ();
+
+    /* TRIMMED SEQUENCE
+     *  need to find the 0-based trim_start and trim_len
+     */
+    INSDC:coord:zero bio_start = NCBI:SRA:bio_start ( out_read_start, out_read_type );
+    INSDC:coord:zero trim_start = bio_start;
+    U32 trim_left = ( U32 ) trim_start;
+    INSDC:coord:len trim_len = (INSDC:coord:len) < U32 > diff ( spot_len, trim_left );
+
+    /* COORDINATES
+     *  in addition to X and Y,
+     *  Illumina has LANE and TILE
+     */
+    readonly column INSDC:coord:val LANE = out_lane_coord;
+    readonly column INSDC:coord:val TILE = out_tile_coord;
+};
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:Illumina:tbl:v2 #1
+ *  normalized v2 table
+ *  still has variants based upon quality type
+ *
+ * history:
+ *  1.0.1 - explictly base upon sra #1.0.1 and related tables
+ *  1.0.2 - updated ancestry
+ *  1.0.3 - updated ancestry
+ */
+
+physical NCBI:SRA:swapped_fsamp4 NCBI:SRA:Illumina:encoding:SIGNAL #2
+{
+    decode { return NCBI:SRA:fsamp4:decode #2 ( @ ); }
+    encode { return NCBI:SRA:fsamp4:encode #2 < 14, 10 > ( @ ); }
+}
+
+physical NCBI:fsamp4 NCBI:SRA:Illumina:encoding:NOISE #2
+{
+    decode
+    {
+        F32 dcmp = funzip ( @ );
+        return redimension ( dcmp );
+    }
+    encode
+    {
+	F32 ncmp = redimension ( @ );
+        return fzip < 10 > ( ncmp );
+    }
+}
+
+physical NCBI:SRA:swapped_fsamp4 NCBI:SRA:Illumina:encoding:INTENSITY #2
+{
+    decode { return NCBI:SRA:fsamp4:decode #2 ( @ ); }
+    encode { return NCBI:SRA:fsamp4:encode #2 < 14, 10 > ( @ ); }
+}
+
+// v2 base table
+table NCBI:SRA:Illumina:tbl:v2 #1.0.4
+    = NCBI:SRA:tbl:sra #2.1.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:SRA:Illumina:common #1.0.3
+{
+    /* NAME tokenizing and coordinates
+     *  most work happens in skeyname table
+     *  we still obtain LANE and TILE from name
+     */
+    INSDC:coord:val out_lane_coord = ( INSDC:coord:val )
+        NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:L > ( _out_name, out_spot_name_tok );
+    INSDC:coord:val out_tile_coord = ( INSDC:coord:val )
+        NCBI:SRA:extract_name_coord < NCBI:SRA:name_token:T > ( _out_name, out_spot_name_tok );
+    NCBI:SRA:spot_name_token out_spot_name_tok
+        = NCBI:SRA:Illumina:tokenize_spot_name ( _out_name );
+
+    NCBI:SRA:spot_name_token in_spot_name_tok
+        = NCBI:SRA:Illumina:tokenize_spot_name ( NAME );
+
+    /* SIGNAL
+     *  optional, no longer archived
+     */
+    extern column NCBI:fsamp4 SIGNAL
+    {
+        read = out_signal;
+        validate = < NCBI:fsamp4 > no_compare #1 ( in_signal, out_signal );
+    }
+    NCBI:fsamp4 in_signal = SIGNAL;
+    NCBI:fsamp4 out_signal
+        = < NCBI:SRA:swapped_fsamp4 > NCBI:SRA:swap ( .SIGNAL, out_x2na_bin );
+
+    physical column NCBI:SRA:Illumina:encoding:SIGNAL #2 .SIGNAL
+        = ( NCBI:SRA:swapped_fsamp4 ) < NCBI:fsamp4 > NCBI:SRA:swap ( in_signal, in_x2na_bin )
+        | ( NCBI:SRA:swapped_fsamp4 ) < NCBI:fsamp4 > NCBI:SRA:swap ( in_signal, in_2na_bin );
+
+    /* NOISE
+     *  optional, no longer archived
+     */
+    extern column NCBI:fsamp4 NOISE
+    {
+        read = out_noise;
+        validate = < NCBI:fsamp4 > no_compare #1 ( in_noise, out_noise );
+    }
+    NCBI:fsamp4 in_noise = NOISE;
+    NCBI:fsamp4 out_noise = .NOISE;
+
+    physical column NCBI:SRA:Illumina:encoding:NOISE #2 .NOISE = in_noise;
+
+    /* INTENSITY
+     *  optional, no longer archived
+     */
+    extern column NCBI:fsamp4 INTENSITY
+    {
+        read = out_intensity;
+        validate = < NCBI:fsamp4 > no_compare #1 ( in_intensity, out_intensity );
+    }
+    NCBI:fsamp4 in_intensity = INTENSITY;
+    NCBI:fsamp4 out_intensity
+        = < NCBI:fsamp4 > NCBI:SRA:denormalize ( out_norm_intensity, out_x2na_bin );
+    NCBI:fsamp4 out_norm_intensity
+        = ( NCBI:fsamp4 ) < NCBI:SRA:swapped_fsamp4 > NCBI:SRA:swap ( .INTENSITY, out_x2na_bin );
+    NCBI:fsamp4 in_norm_intensity
+        = < NCBI:fsamp4 > NCBI:SRA:normalize ( in_intensity, in_x2na_bin )
+        | < NCBI:fsamp4 > NCBI:SRA:normalize ( in_intensity, in_2na_bin );
+    physical column NCBI:SRA:Illumina:encoding:INTENSITY #2 .INTENSITY
+        = ( NCBI:SRA:swapped_fsamp4 ) < NCBI:fsamp4 > NCBI:SRA:swap ( in_norm_intensity, in_x2na_bin )
+        | ( NCBI:SRA:swapped_fsamp4 ) < NCBI:fsamp4 > NCBI:SRA:swap ( in_norm_intensity, in_2na_bin );
+
+	/* INSDC:tbl:sequence inherited virtual productions
+	 *  out_qual_phred
+	 */
+
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  static_fixed_spot_len
+	 */
+};
+
+/* 4-channel log-odds qualities
+ *
+ * history:
+ *  1.0.2 - updated ancestry
+ *  1.0.3 - updated ancestry
+ *  1.0.4 - updated ancestry
+ *  1.1.0 - updated ancestry
+ */
+table NCBI:SRA:Illumina:tbl:q4:v2 #1.1.0
+    = NCBI:SRA:Illumina:tbl:v2 #1.0.4
+    , NCBI:SRA:Illumina:qual4 #2.1.0
+{
+	/* INSDC:SRA:tbl:spotdesc inherited virtual productions
+	 *  static_fixed_spot_len
+	 */
+};
+
+/* 1-channel log-odds qualities
+ *
+ * history:
+ *  1.0.2 - updated ancestry
+ *  1.0.3 - updated ancestry
+ *  1.0.4 - updated ancestry
+ *  1.1.0 - updated ancestry
+ */
+table NCBI:SRA:Illumina:tbl:q1:v2 #1.1
+    = NCBI:SRA:Illumina:tbl:v2 #1.0.4
+    , NCBI:tbl:log_odds_quality #2.1.0
+{
+	/* INSDC:SRA:tbl:spotdesc inherited productions
+	 *  static_fixed_spot_len
+	 */
+};
+
+/* phred qualities
+ *
+ * history:
+ *  1.0.2 - updated ancestry
+ *  1.0.3 - updated ancestry
+ *  1.0.4 - updated ancestry
+ */
+table NCBI:SRA:Illumina:tbl:phred:v2 #1.0.4
+    = NCBI:SRA:Illumina:tbl:v2 #1.0.4
+    , NCBI:tbl:phred_quality #2.0.3
+{
+	/* INSDC:SRA:tbl:spotdesc inherited virtual productions
+	 *  static_fixed_spot_len
+	 */
+};
diff --git a/interfaces/sra/impl.h b/interfaces/sra/impl.h
new file mode 100644
index 0000000..815d5a6
--- /dev/null
+++ b/interfaces/sra/impl.h
@@ -0,0 +1,121 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_impl_h_
+#define _h_sra_impl_h_
+
+#ifndef _h_sra_path_extern_
+#include <sra/path-extern.h>
+#endif
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KNamelist;
+struct KDirectory;
+typedef union SRAPath_vt SRAPath_vt;
+typedef struct SRAPath_vt_v1 SRAPath_vt_v1;
+typedef struct SRAPath_vt_v2 SRAPath_vt_v2;
+
+
+/*--------------------------------------------------------------------------
+ * SRAPath
+ */
+struct SRAPath
+{
+    const SRAPath_vt *vt;
+};
+
+#ifndef SRAPATH_IMPL
+#define SRAPATH_IMPL struct SRAPath
+#endif
+
+struct SRAPath_vt_v1
+{
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    rc_t ( CC *addref ) ( const SRAPATH_IMPL *self );
+    rc_t ( CC *release ) ( const SRAPATH_IMPL *self );
+    rc_t ( CC *version ) ( const SRAPATH_IMPL *self, uint32_t *version );
+    rc_t ( CC *clear ) ( SRAPATH_IMPL *self );
+    rc_t ( CC *addRepPath ) ( SRAPATH_IMPL *self, const char *path );
+    rc_t ( CC *addVolPath ) ( SRAPATH_IMPL *self, const char *path );
+    rc_t ( CC *fullPath ) ( const SRAPATH_IMPL *self, const char *rep, const char *vol,
+			 const char *acc, char *path, size_t path_max );
+    bool ( CC *testPath ) ( const SRAPATH_IMPL *self, const char *path );
+    rc_t ( CC *findPath ) ( const SRAPATH_IMPL *self, const char *acc, char *path, size_t path_max, size_t *rep_len );
+    rc_t ( CC *listPath ) ( const SRAPATH_IMPL *self, struct KNamelist **runs, bool deep );
+};
+
+struct SRAPath_vt_v2
+{
+    /* version == 2.x */
+    uint32_t maj;
+    uint32_t min;
+
+    rc_t ( CC *addref ) ( const SRAPATH_IMPL *self );
+    rc_t ( CC *release ) ( const SRAPATH_IMPL *self );
+    rc_t ( CC *version ) ( const SRAPATH_IMPL *self, uint32_t *version );
+    rc_t ( CC *clear ) ( SRAPATH_IMPL *self );
+    rc_t ( CC *addRepPath ) ( SRAPATH_IMPL *self, const char *path );
+    rc_t ( CC *addVolPath ) ( SRAPATH_IMPL *self, const char *path );
+    rc_t ( CC *fullPath ) ( const SRAPATH_IMPL *self, const char *rep, const char *vol,
+			 const char *acc, char *path, size_t path_max );
+    bool ( CC *testPath ) ( const SRAPATH_IMPL *self, const char *path );
+    rc_t ( CC *findPath ) ( const SRAPATH_IMPL *self, const char *acc, char *path, size_t path_max, size_t *rep_len );
+};
+
+union SRAPath_vt
+{
+    SRAPath_vt_v1 v1;
+    SRAPath_vt_v2 v2;
+};
+
+
+/* SRAPathMakeImpl
+ *  make the SRAPath object within a shared library called "libsra-path"
+ */
+MOD_EXPORT rc_t CC SRAPathMakeImpl ( struct SRAPath **pm, struct KDirectory const *dir );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_impl_h_ */
diff --git a/interfaces/sra/ion-torrent.vschema b/interfaces/sra/ion-torrent.vschema
new file mode 100644
index 0000000..ed0d97c
--- /dev/null
+++ b/interfaces/sra/ion-torrent.vschema
@@ -0,0 +1,117 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * NCBI Ion Torrent Sequence Read Archive schema
+ */
+version 1;
+
+include 'ncbi/sra.vschema';
+include 'ncbi/spotname.vschema';
+include 'ncbi/clip.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+
+/* tokenize_spot_name
+ *  scans name on input
+ *  tokenizes into parts
+ */
+extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:IonTorrent:tokenize_spot_name #1 ( ascii name );
+
+
+/*--------------------------------------------------------------------------
+ * table
+ */
+
+physical INSDC:position:one NCBI:SRA:IonTorrent:encoding:POSITION #1
+{
+    decode
+    {
+        I32 pos_1st_deriv = iunzip ( @ );
+        return ( INSDC:position:one ) < I32 > integral ( pos_1st_deriv );
+    }
+    encode
+    { 
+        I32 pos_1st_deriv = < I32 > deriv ( @ );
+        return izip ( pos_1st_deriv ); 
+    }
+}
+
+/* IonTorrent:tbl
+ *
+ * history:
+ *  1.0.1 - updated ancestry
+ *  1.0.2 - updated ancestry
+ *  1.0.3 - updated ancestry
+ */
+table NCBI:SRA:IonTorrent:tbl:v2 #1.0.3
+    = INSDC:SRA:tbl:sra #1.0.3
+    , NCBI:SRA:tbl:sra_nopos #2.1.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.3
+    , NCBI:SRA:tbl:clip #1.0.2
+{
+    /* PLATFORM is always ION_TORRENT */
+    ascii platform_name
+        = < ascii > echo < "ION_TORRENT" > ();
+
+    /* NAME tokenizing and coordinates
+     *  most work happens in skeyname table
+     */
+    NCBI:SRA:spot_name_token out_spot_name_tok
+        = NCBI:SRA:IonTorrent:tokenize_spot_name ( _out_name );
+
+    NCBI:SRA:spot_name_token in_spot_name_tok
+        = NCBI:SRA:IonTorrent:tokenize_spot_name ( NAME );
+
+    // special sequences
+    column < INSDC:dna:text > zip_encoding FLOW_CHARS;
+    column < INSDC:dna:text > zip_encoding KEY_SEQUENCE;
+
+    // position stored as normal 1-based coordinate
+    INSDC:position:one out_position = .POSITION;
+    physical column NCBI:SRA:IonTorrent:encoding:POSITION
+        .POSITION = POSITION;
+
+
+    // clips
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_ADAPTER_LEFT = CLIP_ADAPTER_LEFT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_ADAPTER_RIGHT = CLIP_ADAPTER_RIGHT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_QUALITY_LEFT = CLIP_QUALITY_LEFT;
+    physical column < INSDC:coord:one > izip_encoding
+        .CLIP_QUALITY_RIGHT = CLIP_QUALITY_RIGHT;
+
+    // signal
+    column < NCBI:isamp1 > izip_encoding SIGNAL;
+};
diff --git a/interfaces/sra/nanopore.vschema b/interfaces/sra/nanopore.vschema
new file mode 100644
index 0000000..c1643f5
--- /dev/null
+++ b/interfaces/sra/nanopore.vschema
@@ -0,0 +1,84 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/*==========================================================================
+ * NCBI Oxford Nanopore Sequence Read Archive schema
+ */
+version 1;
+
+include 'insdc/sra.vschema';
+include 'ncbi/sra.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:Nanopore:consensus
+ *  Oxford Nanopore SRA Platform
+ */
+table NCBI:SRA:Nanopore:consensus #1
+    = NCBI:SRA:tbl:sra #2.1.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.3
+{
+    extern column < U32 > izip_encoding #1 CHANNEL;
+
+    extern column < U32 > izip_encoding #1 READ_NUMBER;
+
+    extern column bool_encoding #1 HIGH_QUALITY;
+    
+    ascii platform_name
+        = < ascii > echo < "OXFORD_NANOPORE" > ();
+        
+    INSDC:SRA:platform_id out_platform
+        = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_OXFORD_NANOPORE > ();
+}
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:Nanopore:sequence
+ *  Oxford Nanopore SRA Platform
+ */
+table NCBI:SRA:Nanopore:sequence #1
+    = NCBI:SRA:tbl:sra #2.1.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.3
+{
+    extern column < U32 > izip_encoding #1 CHANNEL;
+
+    extern column < U32 > izip_encoding #1 READ_NUMBER;
+
+    ascii platform_name
+        = < ascii > echo < "OXFORD_NANOPORE" > ();
+        
+    INSDC:SRA:platform_id out_platform
+        = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_OXFORD_NANOPORE > ();
+}
+
+
+database NCBI:SRA:Nanopore:db #1
+{
+    table NCBI:SRA:Nanopore:sequence #1.0 SEQUENCE;
+    table NCBI:SRA:Nanopore:consensus #1.0 CONSENSUS;
+};
diff --git a/interfaces/sra/pacbio.h b/interfaces/sra/pacbio.h
new file mode 100644
index 0000000..0c3ea64
--- /dev/null
+++ b/interfaces/sra/pacbio.h
@@ -0,0 +1,66 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_pacbio_
+#define _h_sra_pacbio_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*==========================================================================
+ * PACBIO types, constants
+ */
+
+
+/* hole status for pacbio spots
+ */
+#define sra_read_filter_t "INSDC:SRA:read_filter"
+typedef uint8_t PACBIO_HOLE_STATUS;
+enum
+{
+    SRA_PACBIO_HOLE_SEQUENCING = 0,
+    SRA_PACBIO_HOLE_ANTIHOLE = 1,
+    SRA_PACBIO_HOLE_FIDUCIAL = 2,
+    SRA_PACBIO_HOLE_SUSPECT = 3,
+    SRA_PACBIO_HOLE_ANTIMIRROR = 4,
+    SRA_PACBIO_HOLE_FDZMW = 5,
+    SRA_PACBIO_HOLE_FBZMW = 6,
+    SRA_PACBIO_HOLE_ANTIBEAMLET = 7,
+    SRA_PACBIO_HOLE_OUTSIDEFOV = 8
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_sra_pacbio_ */
diff --git a/interfaces/sra/pacbio.vschema b/interfaces/sra/pacbio.vschema
new file mode 100644
index 0000000..e118e25
--- /dev/null
+++ b/interfaces/sra/pacbio.vschema
@@ -0,0 +1,307 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/*==========================================================================
+ * NCBI PacBio Fastq Sequence Read Archive schema
+ */
+version 1;
+
+include 'insdc/sra.vschema';
+include 'ncbi/sra.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:PacBio
+ *  Pacific Biotech SRA Platform
+ *
+ * history:
+ *  1.0.2 - updated ancestry
+ *  1.0.3 - updated ancestry
+ */
+table NCBI:SRA:PacBio:common #1.0.3 = NCBI:SRA:tbl:sra #2.1.3
+{
+}
+
+/* history:
+ *  1.0.2 - updated ancestry
+ *  1.0.3 - updated ancestry
+ */
+table NCBI:SRA:PacBio:smrt:fastq #1.0.3
+    = NCBI:SRA:PacBio:common #1.0.3
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.3
+{
+    /* PLATFORM
+     *  platform name is always "PACBIO_SMRT"
+     */
+    ascii platform_name
+        = < ascii > echo < "PACBIO_SMRT" > ();
+
+    /* TRIMMED SEQUENCE
+     *  need to find the 0-based trim_start and trim_len
+     */
+    INSDC:coord:zero bio_start
+        = NCBI:SRA:bio_start ( out_read_start, out_read_type );
+
+    INSDC:coord:zero trim_start = bio_start;
+
+    U32 trim_left = ( U32 ) trim_start;
+    INSDC:coord:len trim_len = ( INSDC:coord:len )
+        < U32 > diff ( spot_len, trim_left );
+}
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:PacBio:smrt:db
+ *  Pacific Biotech SRA Platform
+ */
+table NCBI:SRA:PacBio:smrt:indelsubst #1
+{
+    // probability that the current base is an insertion
+    column < U8 > zip_encoding INSERTION_QV;
+
+    // probability of a deletion error following current base
+    // and identity of deleted base, if it exists
+    column < U8 > zip_encoding DELETION_QV;
+    column < INSDC:dna:text > zip_encoding DELETION_TAG;
+
+    // probability of a substitution error
+    // and most likely alternative base call
+    column < U8 > zip_encoding SUBSTITUTION_QV;
+    column < INSDC:dna:text > zip_encoding SUBSTITUTION_TAG;
+};
+
+typedef U8 PacBio:hole:status;
+const PacBio:hole:status PacBio:hole:SEQUENCING  = 0;
+const PacBio:hole:status PacBio:hole:ANTIHOLE    = 1;
+const PacBio:hole:status PacBio:hole:FIDUCIAL    = 2;
+const PacBio:hole:status PacBio:hole:SUSPECT     = 3;
+const PacBio:hole:status PacBio:hole:ANTIMIRROR  = 4;
+const PacBio:hole:status PacBio:hole:FDZMW       = 5;
+const PacBio:hole:status PacBio:hole:FBZMW       = 6;
+const PacBio:hole:status PacBio:hole:ANTIBEAMLET = 7;
+const PacBio:hole:status PacBio:hole:OUTSIDEFOV  = 8;
+
+/* history:
+ *  1.0.1 - updated ancestry
+ *  1.0.2 - updated ancestry
+ */
+table NCBI:SRA:PacBio:smrt:basecalls #1.0.2
+    = INSDC:SRA:tbl:spotcoord #1
+    , NCBI:tbl:base_space #2.0.3
+    , NCBI:tbl:phred_quality #2.0.3
+    , NCBI:SRA:PacBio:smrt:indelsubst #1
+{
+    /* PLATFORM
+     *  platform name is always "PACBIO_SMRT"
+     */
+    ascii platform_name
+        = < ascii > echo < "PACBIO_SMRT" > ();
+
+    // basecalls will be routed to READ column
+    readonly column INSDC:dna:text BASECALL
+        = out_dna_text;
+
+    // quality value for each base
+    readonly column INSDC:quality:phred QUALITY_VALUE
+        = out_qual_phred;
+
+    // zero-based hole number
+    column < U32 > izip_encoding HOLE_NUMBER;
+
+    // hole status
+    column < PacBio:hole:status > zip_encoding HOLE_STATUS;
+
+    // optional column pair to describe hole status
+    // when/if it does not line up with our constants above
+    column < ascii > zip_encoding HOLE_STATUS_VALUE;
+    column < INSDC:coord:len > izip_encoding HOLE_STATUS_VALUE_LEN;
+
+    // hole ( X,Y ) pair will be split and sent to X and Y columns
+    column I16 [ 2 ] HOLE_XY
+        = < I16 > paste ( x_clip_I16, y_clip_I16 );
+    I16 x_clip_I16 = cast ( out_x_coord );
+    I16 y_clip_I16 = cast ( out_y_coord );
+
+    I16 in_x16_coord = < I16 > cut < 0 > ( HOLE_XY );
+    I16 in_y16_coord = < I16 > cut < 1 > ( HOLE_XY );
+
+    INSDC:coord:val in_x_coord = cast ( in_x16_coord );
+    INSDC:coord:val in_y_coord = cast ( in_y16_coord );
+
+    // the number of bases in ZMW
+    readonly column INSDC:coord:len NUM_EVENT
+        = base_space_spot_len;
+};
+
+/* history:
+ *  1.0.1 - updated ancestry
+ *  1.0.2 - updated ancestry
+ */
+table NCBI:SRA:PacBio:smrt:sequence #1.0.2
+    = NCBI:SRA:PacBio:smrt:basecalls #1.0.2
+    , NCBI:SRA:tbl:sra_nopos #2.1.3
+{
+    // pulse information
+    column < U16 > izip_encoding PRE_BASE_FRAMES;
+    column < U16 > izip_encoding WIDTH_IN_FRAMES;
+
+    // spot to pulse map
+    default column INSDC:position:zero PULSE_INDEX
+        = .PULSE_INDEX;
+    readonly column INSDC:position:one PULSE_INDEX
+        = out_position;
+    INSDC:position:one out_position
+        = ( INSDC:position:one ) < INSDC:position:zero > sum < 1 > ( .PULSE_INDEX );
+
+    column NCBI:SRA:pos16 PULSE_INDEX
+        = cast ( .PULSE_INDEX );
+    NCBI:SRA:pos16 in_pulse_index16
+        = PULSE_INDEX;
+
+    INSDC:position:zero in_pulse_index32
+        = PULSE_INDEX
+        | cast ( in_pulse_index16 );
+
+    physical column < INSDC:position:zero > izip_encoding .PULSE_INDEX
+        = in_pulse_index32;
+
+    /* clip quality */
+    extern column < INSDC:coord:zero > izip_encoding CLIP_QUALITY_LEFT;
+    extern column < INSDC:coord:one > izip_encoding CLIP_QUALITY_RIGHT;
+
+    /* TRIMMED SEQUENCE
+     *  need to find the 0-based trim_start and trim_len
+     */
+    INSDC:coord:zero trim_start
+        = .CLIP_QUALITY_LEFT
+        | NCBI:SRA:bio_start ( out_read_start, out_read_type );
+
+    U32 trim_right
+        = ( U32 ) .CLIP_QUALITY_RIGHT
+        | spot_len;
+
+    U32 trim_left = ( U32 ) trim_start;
+    INSDC:coord:len trim_len = ( INSDC:coord:len )
+        < U32 > diff ( trim_right, trim_left );
+};
+
+/* history:
+ *  1.0.1 - updated ancestry
+ *  1.0.2 - updated ancestry
+ */
+table NCBI:SRA:PacBio:smrt:cons #1.0.2
+    = NCBI:SRA:PacBio:smrt:basecalls #1.0.2
+    , NCBI:SRA:tbl:sra #2.1.3
+{
+    // documented in both hdf5 and xsd as signed...
+    column < I32 > izip_encoding NUM_PASSES;
+
+    /* TRIMMED SEQUENCE
+     *  need to find the 0-based trim_start and trim_len
+     */
+    INSDC:coord:zero trim_start
+        = NCBI:SRA:bio_start ( out_read_start, out_read_type );
+
+    U32 trim_left = ( U32 ) trim_start;
+    INSDC:coord:len trim_len = ( INSDC:coord:len )
+        < U32 > diff ( spot_len, trim_left );
+};
+
+/* these encoding rules attempt to compress the channels individually,
+   although they may compress fine interleaved as they are... */
+physical
+F32 [ 4 ] NCBI:SRA:PacBio:smrt:F32_4ch_encoding #1.0 < U32 mantissa >
+{
+    decode
+    {
+        fzip_fmt cmp0 = split < 0 > ( @ );
+        fzip_fmt cmp1 = split < 1 > ( @ );
+        fzip_fmt cmp2 = split < 2 > ( @ );
+        fzip_fmt cmp3 = split < 3 > ( @ );
+
+        F32 ch0 = funzip ( cmp0 );
+        F32 ch1 = funzip ( cmp1 );
+        F32 ch2 = funzip ( cmp2 );
+        F32 ch3 = funzip ( cmp3 );
+
+        return < F32 > paste ( ch0, ch1, ch2, ch3 );
+    }
+
+    encode
+    {
+        F32 ch0 = < F32 > cut < 0 > ( @ );
+        F32 ch1 = < F32 > cut < 1 > ( @ );
+        F32 ch2 = < F32 > cut < 2 > ( @ );
+        F32 ch3 = < F32 > cut < 3 > ( @ );
+
+        fzip_fmt cmp0 = fzip < mantissa > ( ch0 );
+        fzip_fmt cmp1 = fzip < mantissa > ( ch1 );
+        fzip_fmt cmp2 = fzip < mantissa > ( ch2 );
+        fzip_fmt cmp3 = fzip < mantissa > ( ch3 );
+
+        return merge ( cmp0, cmp1, cmp2, cmp3 );
+    }
+}
+
+table NCBI:SRA:PacBio:smrt:zmw_metrics #1
+{
+    column NCBI:SRA:PacBio:smrt:F32_4ch_encoding < 24 > BASE_FRACTION;
+    column < F32 > fzip_encoding < 24 > BASE_IPD;
+    column < F32 > fzip_encoding < 24 > BASE_RATE;
+    column < F32 > fzip_encoding < 24 > BASE_WIDTH;
+    column NCBI:SRA:PacBio:smrt:F32_4ch_encoding < 24 > CHAN_BASE_QV;
+    column NCBI:SRA:PacBio:smrt:F32_4ch_encoding < 24 > CHAN_DEL_QV;
+    column NCBI:SRA:PacBio:smrt:F32_4ch_encoding < 24 > CHAN_INS_QV;
+    column NCBI:SRA:PacBio:smrt:F32_4ch_encoding < 24 > CHAN_SUB_QV;
+    column < F32 > fzip_encoding < 24 > LOCAL_BASE_RATE;
+    column < F32 > fzip_encoding < 24 > DARK_BASE_RATE;
+    column < F32 > fzip_encoding < 24 > HQ_RGN_START_TIME;
+    column < F32 > fzip_encoding < 24 > HQ_RGN_END_TIME;
+    column NCBI:SRA:PacBio:smrt:F32_4ch_encoding < 24 > HQ_RGN_SNR;
+    column < I8 > zip_encoding PRODUCTIVITY;
+    column < F32 > fzip_encoding < 24 > READ_SCORE;
+    column < F32 > fzip_encoding < 24 > READ_BASE_QV;
+    column < F32 > fzip_encoding < 24 > READ_DEL_QV;
+    column < F32 > fzip_encoding < 24 > READ_INS_QV;
+    column < F32 > fzip_encoding < 24 > READ_SUB_QV;
+};
+
+table NCBI:SRA:PacBio:smrt:passes #1
+{
+    column < U8 > zip_encoding ADAPTER_HIT_BEFORE;
+    column < U8 > zip_encoding ADAPTER_HIT_AFTER;
+    column < U8 > zip_encoding PASS_DIRECTION;
+    column < I32 > izip_encoding PASS_NUM_BASES;
+    column < I32 > izip_encoding PASS_START_BASE;
+};
+
+database NCBI:SRA:PacBio:smrt:db #1.0.1
+{
+    table NCBI:SRA:PacBio:smrt:sequence #1.0 SEQUENCE;
+    table NCBI:SRA:PacBio:smrt:cons #1.0 CONSENSUS;
+    table NCBI:SRA:PacBio:smrt:passes #1.0 PASSES;
+    table NCBI:SRA:PacBio:smrt:zmw_metrics #1.0 ZMW_METRICS;
+};
diff --git a/interfaces/sra/path-extern.h b/interfaces/sra/path-extern.h
new file mode 100644
index 0000000..26f671c
--- /dev/null
+++ b/interfaces/sra/path-extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_path_extern_
+#define _h_sra_path_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define SRA_PATH_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define SRA_PATH_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_sra_path_extern_ */
diff --git a/interfaces/sra/pevents.vschema b/interfaces/sra/pevents.vschema
new file mode 100644
index 0000000..8072810
--- /dev/null
+++ b/interfaces/sra/pevents.vschema
@@ -0,0 +1,91 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * NCBI Likelihood & Event schema
+ */
+version 1;
+include 'vdb/vdb.vschema';
+
+typedef U8 INSDC:phred;
+typedef ascii INSDC:event:text;
+const INSDC:event:text INSDC:event:CHARSET = "ACGT0123B+-";
+const INSDC:event:text INSDC:event:ACCEPTSET = "ACGTacgt0123B+-";
+
+extern function < U32 dim >
+U32 NCBI:SRA:sort_order #1.0 ( F32[dim] likelihoods );
+
+extern function < U32 dim >
+F32 NCBI:SRA:reorder #1.0 ( U32 sort_order, F32[dim] likelihoods );
+
+extern function < U32 dim >
+F32 NCBI:SRA:restore_order #1.0 ( U32 sort_order, F32[dim] likelihoods );
+
+extern function < U32 sdim, U32 rdim >
+INSDC:phred[rdim] NCBI:SRA:likelihood_to_phred #1.0 ( F32 like_scale, F32[sdim] likelihoods );
+
+extern function < U32 sdim, U32 rdim >
+F32[rdim] NCBI:SRA:phred_to_likelihood #1.0 ( F32 like_scale, F32[sdim] phred );
+
+table NCBI:SRA:tbl:pevents #1.0
+{
+    // event labels - single character events
+    extern column
+        INSDC:event:text PEVENTS = .PEVENTS;
+
+    physical column < INSDC:event:text >
+        zip_encoding #1.0 .PEVENTS = PEVENTS;
+
+    // likelihoods
+    extern default column
+        F32[4] LIKELIHOODS = likelihoods;
+    extern readonly column
+        INSDC:phred[4] LIKELIHOODS = phred;
+
+    U32 sort_encode = NCBI:SRA:sort_order < 4 > ( LIKELIHOODS );
+
+    physical column < U32 >
+        zip_encoding #1.0 < Z_RLE > .SORT_ORDER = sort_encode;
+
+    F32 reorder = NCBI:SRA:reorder < 4 > ( sort_encode, LIKELIHOODS );
+    F32 like_scale = vdb:fixed_vec_sum < F32, 4 > ( reorder );
+
+    physical column < F32 >
+        fzip_encoding #1.0 < 4 > .SCALE = like_scale;
+
+    INSDC:phred cut_phred = NCBI:SRA:likelihood_to_phred #1.0 < 4, 3 > ( like_scale, reorder );
+
+    physical column < INSDC:phred >
+        zip_encoding #1.0 < 5 > .PHRED = cut_phred;
+
+    // normalization scaling factors
+    extern readonly column
+        F32 LIKELIHOOD_NORM = .SCALE;
+
+    // phred scores
+    extern readonly column
+        INSDC:phred[4] PHRED = phred;
+};
diff --git a/interfaces/sra/rd-extern.h b/interfaces/sra/rd-extern.h
new file mode 100644
index 0000000..02c2984
--- /dev/null
+++ b/interfaces/sra/rd-extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_rd_extern_
+#define _h_sra_rd_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define SRA_RD_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define SRA_RD_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_sra_rd_extern_ */
diff --git a/interfaces/sra/sch-extern.h b/interfaces/sra/sch-extern.h
new file mode 100644
index 0000000..37d38b8
--- /dev/null
+++ b/interfaces/sra/sch-extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_sch_extern_
+#define _h_sra_sch_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define SRA_SCH_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define SRA_SCH_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_sra_sch_extern_ */
diff --git a/interfaces/sra/sff-file.h b/interfaces/sra/sff-file.h
new file mode 100644
index 0000000..4b36bc3
--- /dev/null
+++ b/interfaces/sra/sff-file.h
@@ -0,0 +1,110 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_sra_sff_file_
+#define _h_sra_sff_file_
+
+#include <klib/defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ======================================================================
+ * SFF defines an 8 bit value in the file that tells of the format of the 
+ * data signal (flowgrams in Roche 454 SFF parlance).
+ *
+ * The only currently defined format is a 16 bit unsigned integer in
+ * units one hundredths. This enum is to easily allow us to add other
+ * formats if ever required.
+ */
+typedef enum SFFFormatCode
+{
+    SFFFormatCodeUnset = 0,
+    /* values are 16 integers of hundreths of units: 0 = 0.00, 1 = 0.01, 2 = 0.02, ... */
+    SFFFormatCodeUI16Hundreths,
+    /* currently (SFF (00000001) yet this is the only one SFFFormatCode is defined */
+    SFFFormatCodeUndefined
+}	SFFFormatCode;
+
+/* ----------------------------------------------------------------------
+ * Common Header Section 
+ * (Genome Sequencer Data Analysis Software Manual Section 13.3.8.1)
+ */
+#define SFFCommonHeader_size 31
+
+typedef struct SFFCommonHeader_struct
+{
+    uint32_t magic_number;         /* four bytes ".sff" as string: with wrong endian it would be "ffs." */
+    uint32_t version;              /* four bytes 0x00000001 */
+    uint64_t index_offset;         /* index_offset and index_length are the offset and length of an */
+    uint32_t index_length;         /* optional index of the reads in the file. If no index both are 0 */
+    uint32_t number_of_reads;      /* The number of reads in the file (not individual datum) */
+    uint16_t header_length;        /* length of all headers in this set.  31 + flow_length + key_length + pad to 8 byte boundary */
+    uint16_t key_length;           /* length of the key sequence for these reads */
+    uint16_t num_flows_per_read;   /* the number of flows for each read in this file */
+    uint8_t  flowgram_format_code; /* SFFFormatCode between (SFFFormatCodeUnset..FormateCodeUndefined) exclusive */
+    /* not included variable length portion of header:
+        flow chars   - sequence of uint8_t, actual length is num_flows_per_read above
+        key sequence - sequence of uint8_t, actual length is key_length above
+        padding      - sequence of zeroed uint8_t to make total length of file header 8-byte padded
+    */
+} SFFCommonHeader;
+
+/* ----------------------------------------------------------------------
+ * Read Header Section 
+ * (Genome Sequencer Data Analysis Software Manual Section 13.3.8.2)
+ */
+#define SFFReadHeader_size 16
+
+typedef struct SFFReadHeader_struct
+{
+    uint16_t    header_length;            /* length in bytes of the full section including padding */
+    uint16_t    name_length;            /* length of the name of this spot */
+    uint32_t    number_of_bases;
+    uint16_t    clip_quality_left;
+    uint16_t    clip_quality_right;
+    uint16_t    clip_adapter_left;
+    uint16_t    clip_adapter_right;
+    /* not included variable length portion of header:
+        name    - sequence of uint8_t, actual length is name_length above
+        padding - sequence of zeroed uint8_t to make total length of read header 8-byte padded
+
+        read data section:
+
+        signal - sequence of uint16_t (if flowgram_format_code == SFFFormatCodeUI16Hundreths, see enum above),
+                 actual length is num_flows_per_read from file header above
+        flow_index_per_base (position) - sequence of uint8_t, actual length in number_of_bases above
+        bases - sequence of uint8_t, actual length in number_of_bases above
+        quality_scores - sequence of uint8_t, actual length in number_of_bases above
+        padding - sequence of zeroed uint8_t to make total length of read data section 8-byte padded
+    */
+} SFFReadHeader;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_sff_file_ */
diff --git a/interfaces/sra/sff.h b/interfaces/sra/sff.h
new file mode 100644
index 0000000..b958d49
--- /dev/null
+++ b/interfaces/sra/sff.h
@@ -0,0 +1,147 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_sra_sff_
+#define _h_sra_sff_
+
+#ifndef _h_sra_rd_extern_
+#include <sra/rd-extern.h>
+#endif
+
+#ifndef _h_sra_sradb_
+#include <sra/sradb.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SFFReader
+ */
+typedef struct SFFReader SFFReader;
+
+/* Make
+ *  create SFFReader reference based
+ *  on table and properties:
+ *     table      - SRATable
+ *     accession  - accession
+ *     minSpotId  - starting spot id, 0 - ignored (run information used)
+ *     maxSpotId  - ending spot id, 0 - ignored (run information used)
+ *                  you cannot seek out of range of [minSpotId:maxSpotId]
+ */
+SRA_RD_EXTERN rc_t CC SFFReaderMake(const SFFReader** self, const SRATable* table, const char* accession,
+                                    spotid_t minSpotId, spotid_t maxSpotId);
+
+/* Whack
+ *  releases object obtained from SFFReaderMake
+ */
+SRA_RD_EXTERN rc_t CC SFFReaderWhack(const SFFReader* self);
+
+/* FirstSpot
+ *  set current spot to first in the run
+ */
+SRA_RD_EXTERN rc_t CC SFFReaderFirstSpot(const SFFReader* self);
+
+/* SeekSpot
+ *  set current spot
+ * if error occured current spot position becomes 0
+ */
+SRA_RD_EXTERN rc_t CC SFFReaderSeekSpot(const SFFReader* self, spotid_t spot);
+
+/* NextSpot
+ *  Seek to next spot from current
+ */
+SRA_RD_EXTERN rc_t CC SFFReaderNextSpot(const SFFReader* self);
+
+/* CurrentSpot
+ *  Get current spot
+ *  sopt [OUT] - pointer to assign value of the current spot
+ * returns GetRCState(rc) == rcExhausted when out of spots
+ */
+SRA_RD_EXTERN rc_t CC SFFReaderCurrentSpot(const SFFReader* self, spotid_t* spot);
+
+/* SpotInfo
+ *  Get current spot information
+ *  spotname [OUT] - pointer to assign value of the current spot name (can be NULL)
+ *  spot_len [OUT] - pointer to assign value of the current spot length (can be NULL)
+ *  num_reads[OUT] - pointer to assign value of the number of reads in current spot (can be NULL)
+ */
+SRA_RD_EXTERN rc_t CC SFFReader_SpotInfo(const SFFReader* self, const char** spotname, size_t* spotname_sz,
+                                         uint32_t* spot_len, uint32_t* num_reads);
+
+/* SpotReadInfo
+ *  Get read information for current spot
+ *  readid    [IN]  - 1-based read id
+ *  read_label[OUT] - pointer to assign value of the read label (can be NULL)
+ *  read_type [OUT] - pointer to assign value of the read type (can be NULL)
+ *  read_start[OUT] - pointer to assign value of the read start in spot (can be NULL)
+ *  read_len  [OUT] - pointer to assign value of the read length (can be NULL)
+ *  cskey     [OUT] - pointer to assign value of the read color space key (can be NULL)
+ *  if start and len is == 0 read is empty
+ */
+SRA_RD_EXTERN rc_t CC SFFReader_SpotReadInfo(const SFFReader* self, uint32_t readId, SRAReadTypes* read_type,
+                                             const char** read_label, INSDC_coord_len* read_label_sz,
+                                             INSDC_coord_zero* read_start, INSDC_coord_len* read_len);
+
+/* Header
+ *  retrieve binary file header
+ *  spots [IN,OPT]   - sets number of reads in header, ignored if spots == 0
+ *  data [IN]        - pointer to buffer for printing
+ *  dsize [IN]       - data buffer size
+ *  written [IN,OUT] - number of bytes occupied by data, may by more than dsize
+ */
+SRA_RD_EXTERN rc_t CC SFFReaderHeader(const SFFReader* self, spotid_t spots, char* data, size_t dsize, size_t* written);
+
+/* Base
+ *  retrieve bases for the spot
+ *  other parameters see description for SFFReaderHeader above
+ */
+SRA_RD_EXTERN rc_t CC SFFReaderReadHeader(const SFFReader* self, char* data, size_t dsize, size_t* written);
+
+/* QualityName
+ *  retrieve quality name string for the spot
+ *  other parameters see description for SFFReaderHeader above
+ */
+SRA_RD_EXTERN rc_t CC SFFReaderReadData(const SFFReader* self, char* data, size_t dsize, size_t* written);
+
+/* GetCurrentSpotData
+ *  retrieve current spot data as a blob
+ *  other parameters see description for SFFReaderHeader above
+ */
+SRA_RD_EXTERN rc_t CC SFFReader_GetCurrentSpotData(const SFFReader* self, char* data, size_t dsize, size_t* written);
+
+/* GetNextSpotData (streaming function)
+ *  move to the next spot and retrieve current spot data as a blob
+ *  other parameters see description for SFFReaderHeader above
+ */ 
+SRA_RD_EXTERN rc_t CC SFFReader_GetNextSpotData(const SFFReader* self, char* data, size_t dsize, size_t* written);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_sff_ */
diff --git a/interfaces/sra/sradb-priv.h b/interfaces/sra/sradb-priv.h
new file mode 100644
index 0000000..8fdf027
--- /dev/null
+++ b/interfaces/sra/sradb-priv.h
@@ -0,0 +1,407 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_sradb_priv_
+#define _h_sra_sradb_priv_
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_text
+#include <klib/text.h>
+#endif
+
+#ifndef _h_klib_vector
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_sra_sradb_
+#include <sra/sradb.h>
+#endif
+
+#ifndef _h_sra_srapath_
+#include <sra/srapath.h>
+#endif
+
+#ifndef _h_sra_path_extern_
+#include <sra/path-extern.h>
+#endif
+
+#ifndef _h_sra_sch_extern_
+#include <sra/sch-extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct KDirectory;
+struct KDBManager;
+struct KTable;
+struct KLock;
+struct KConfig;
+struct VDBManager;
+struct VTable;
+struct VSchema;
+struct SRAPath;
+struct SRACacheUsage;
+struct SRACacheMetrics;
+/*--------------------------------------------------------------------------
+ * SRAMgr
+ *  opaque handle to SRA library
+ */
+ 
+/*  SRAMgrResolve
+ *  Convert accession name into a file system path
+ */
+ 
+SRA_EXTERN rc_t CC SRAMgrResolve( const SRAMgr *self, const char* acc, char* buf, size_t buf_size );
+
+/* Flush
+ *  flushes least recently used accessions until the cache size is under the specified threshold
+ */
+SRA_EXTERN rc_t CC SRAMgrFlush ( struct SRAMgr const *self, const struct SRACacheMetrics* );
+
+/* RunBGTasks
+ *  perform single pass of garbage collection tasks and exit.
+ *  also retrieves and processes update messages.
+ */
+SRA_EXTERN rc_t CC SRAMgrRunBGTasks ( struct SRAMgr const *self );
+
+/* GetVDBManager
+ *  returns a new reference to VDBManager used by SRAMgr
+ */
+SRA_EXTERN rc_t CC SRAMgrGetVDBManagerRead ( const SRAMgr *self, struct VDBManager const **vmgr );
+SRA_EXTERN rc_t CC SRAMgrGetVDBManagerUpdate ( SRAMgr *self, struct VDBManager **vmgr );
+
+/* GetKDBManager
+ *  returns a new reference to KDBManager used indirectly by SRAMgr
+ */
+SRA_EXTERN rc_t CC SRAMgrGetKDBManagerRead ( const SRAMgr *self, struct KDBManager const **kmgr );
+SRA_EXTERN rc_t CC SRAMgrGetKDBManagerUpdate ( SRAMgr *self, struct KDBManager **kmgr );
+
+/* ModDate
+ *  return a modification timestamp for table
+ */
+SRA_EXTERN rc_t CC SRAMgrVGetTableModDate ( const SRAMgr *self,
+    KTime_t *mtime, const char *spec, va_list args );
+
+SRA_EXTERN rc_t CC SRAMgrGetTableModDate ( const SRAMgr *self,
+    KTime_t *mtime, const char *spec, ... );
+
+/* ConfigReload
+ *  update SRAPath object
+ */
+SRA_EXTERN rc_t CC SRAMgrConfigReload( const SRAMgr *self, struct KDirectory const *wd );
+
+/* 
+ *  Accession Cache usage stats
+ */
+SRA_EXTERN rc_t CC SRAMgrGetCacheUsage( const SRAMgr *self, struct SRACacheUsage* stats );
+
+/* 
+ *  Configure Accession Cache 
+ *  soft_threshold, hard_threshold - new threshold values ( -1 : do not change; < -1 invalid )
+ */
+SRA_EXTERN rc_t CC SRAMgrConfigureCache( const SRAMgr *self,  int32_t soft_threshold, int32_t hard_threshold );
+
+/*--------------------------------------------------------------------------
+ * SRATable
+ */
+
+/* OpenAltTableRead
+ *  opens a table within a database structure with a specific name
+ */
+SRA_EXTERN rc_t CC SRAMgrOpenAltTableRead ( const SRAMgr *self,
+    const SRATable **tbl, const char *altname, const char *spec, ... );
+
+/* GetVTable
+ *  returns a new reference to underlying VTable
+ */
+SRA_EXTERN rc_t CC SRATableGetVTableRead ( const SRATable *self, struct VTable const **vtbl );
+SRA_EXTERN rc_t CC SRATableGetVTableUpdate ( SRATable *self, struct VTable **vtbl );
+
+/* GetKTable
+ *  returns a new reference to underlying KTable
+ */
+SRA_EXTERN rc_t CC SRATableGetKTableRead ( const SRATable *self, struct KTable const **ktbl );
+SRA_EXTERN rc_t CC SRATableGetKTableUpdate ( SRATable *self, struct KTable **ktbl );
+
+
+/* MakeSingleFileArchive
+ *  makes a single-file-archive file from an SRA table
+ *
+ *  contents are ordered by frequency and necessity of access
+ *
+ *  "lightweight" [ IN ] - when true, include only those components
+ *  required for read and quality operations.
+ *
+ *  "ext" [OUT,NULL] - optional file name extension to use for file
+ */
+SRA_EXTERN rc_t CC SRATableMakeSingleFileArchive ( const SRATable *self,
+    struct KFile const **sfa, bool lightweight, const char** ext );
+
+/* SingleFileArchiveExt
+ *  retrieve archive extension based on object in the spec
+ */
+SRA_EXTERN rc_t CC SRAMgrSingleFileArchiveExt(const SRAMgr *self,
+    const char* spec, const bool lightweight, const char** ext);
+/*--------------------------------------------------------------------------
+ * SRAPath
+ */
+
+/* FindWithRepLen
+ *  finds location of run within rep-server/volume matrix
+ *  returns length of rep-server portion
+ */
+SRA_EXTERN rc_t CC SRAPathFindWithRepLen ( struct SRAPath const *self,
+    const char *accession, char *path, size_t path_max, size_t *rep_len );
+
+
+
+/*--------------------------------------------------------------------------
+ * SRASchema
+ */
+
+SRA_SCH_EXTERN rc_t CC SRASchemaMake ( struct VSchema **schema, struct VDBManager const *mgr );
+
+
+#if 0
+
+/*--------------------------------------------------------------------------
+ * SRATableData  - DEPRECATED
+ *  a collection of spots with several data series, minimally including
+ *  base or color calls and their quality ( confidence ) values, and
+ *  optionally signal-related values ( signal, intensity, noise, ... ).
+ */
+union NucStrstr;
+
+typedef struct SRASpotStructure SRASpotStructure;
+struct SRASpotStructure
+{ 
+    /* preformatted query expression
+       for fixed_seq when search is needed */
+    union NucStrstr *q_str;
+
+    /* read of fixed len if != 0
+       either teminated by fixed_seq or by the end */
+    uint16_t fixed_len;
+
+    /* SRAReadTypes */
+	uint8_t read_type;
+
+    /* colorspace key */
+    char cs_key;
+
+    char fixed_seq [ 1024 ];
+
+    /* label for the read */
+    char read_label [ 54 ];
+
+};
+
+typedef struct SRASpotCoord SRASpotCoord;
+struct SRASpotCoord
+{
+    uint32_t x, y, tile;
+	uint32_t  lane;
+	spotid_t id;
+
+    /* prefix part of spotname */
+	uint32_t platename_len;
+	char spotname [ 1024 ];
+
+};
+
+typedef struct SRATableData SRATableData;
+struct SRATableData
+{
+	uint64_t base_count;
+	uint64_t spot_count;
+	uint64_t bad_spot_count;
+	spotid_t max_spotid;
+
+    /* the spot is always fixed len read */
+	uint32_t fixed_len;
+
+    /* number of reads per spot */
+	uint32_t num_reads;
+
+    /* read mask containing bio reads */
+	uint32_t read_mask_bio;
+
+    /* read description */
+	SRASpotStructure read_descr [ 32 ];
+    uint16_t read_len [ 32 ];
+
+    /* platform type and name */
+	uint8_t platform;
+	char platform_str [ 31 ];
+
+	uint16_t prefix_len;
+
+    /* spot coordinates */
+	SRASpotCoord coord;
+
+};
+
+/* GetTableData
+ *  returns a pointer to internal table data
+ *  or NULL if "self" is invalid
+ *
+ * NB - THIS OBJECT IS NOT REFERENCE COUNTED
+ */
+SRA_EXTERN const SRATableData *CC SRATableGetTableData ( const SRATable *self );
+
+#endif
+
+/*--------------------------------------------------------------------------
+ * SRA Accession Cache
+ */
+struct SRACacheIndex;
+
+typedef struct SRACacheMetrics
+{   
+    uint32_t elements; /* open accessions */
+    
+    /* not in use currently: */
+    uint64_t bytes; /* expanded cache bytes, i.e. cursor */
+    uint32_t threads;
+    uint32_t fds;
+} SRACacheMetrics;
+
+#define SRACacheThresholdSoftBytesDefault       ((uint64_t)0)
+#define SRACacheThresholdSoftElementsDefault    ((uint32_t)1000)
+#define SRACacheThresholdSoftThreadsDefault     ((uint32_t)0)
+#define SRACacheThresholdSoftFdsDefault         ((uint32_t)0)
+
+#define SRACacheThresholdHardBytesDefault       ((uint64_t)0)
+#define SRACacheThresholdHardElementsDefault    ((uint32_t)10000)
+#define SRACacheThresholdHardThreadsDefault     ((uint32_t)0)
+#define SRACacheThresholdHardFdsDefault         ((uint32_t)0)
+
+SRA_EXTERN bool CC SRACacheMetricsLessThan(const SRACacheMetrics* a, const SRACacheMetrics* b);
+
+typedef struct SRACacheElement 
+{
+    DLNode dad;
+    
+    SRATable*   object;
+    
+    KTime_t lastAccessed;
+    
+    struct SRACacheIndex* index;
+    uint32_t key;
+
+    SRACacheMetrics metrics;
+} SRACacheElement;
+
+SRA_EXTERN rc_t CC SRACacheElementMake(SRACacheElement**        self, 
+                                       SRATable*                object, 
+                                       struct SRACacheIndex*    index, 
+                                       uint32_t                 key, 
+                                       const SRACacheMetrics*   metrics);
+SRA_EXTERN rc_t CC SRACacheElementDestroy(SRACacheElement* self);
+
+typedef struct SRACacheIndex
+{
+    BSTNode dad;
+    
+    String* prefix;
+    KVector* body; /* KVector<SRACacheElement*> */
+} SRACacheIndex;
+
+SRA_EXTERN rc_t CC SRACacheIndexMake(SRACacheIndex** self, String* prefix);
+SRA_EXTERN rc_t CC SRACacheIndexDestroy(SRACacheIndex* self);
+
+typedef struct SRACacheUsage {
+    /* config */
+    uint32_t soft_threshold;
+    uint32_t hard_threshold;    
+    /* usage stats */ 
+    uint32_t elements;
+    uint64_t requests;
+    uint64_t hits;
+    uint64_t misses;
+    uint64_t busy;
+} SRACacheUsage;
+
+typedef struct SRACache
+{
+    BSTree indexes; /* grows as needed */
+
+    DLList lru; /* DLList<SRACacheElement*>;  head is the oldest */
+    
+    struct KLock* mutex; 
+
+    SRACacheMetrics softThreshold;
+    SRACacheMetrics hardThreshold;
+    SRACacheMetrics current;
+    
+    uint64_t requests;
+    uint64_t hits;
+    uint64_t misses;
+    uint64_t busy;
+} SRACache;
+
+SRA_EXTERN rc_t CC SRACacheInit(SRACache**, struct KConfig*);
+
+SRA_EXTERN rc_t CC SRACacheGetSoftThreshold(SRACache* self, SRACacheMetrics* metrics);
+SRA_EXTERN rc_t CC SRACacheSetSoftThreshold(SRACache* self, const SRACacheMetrics* metrics);
+
+SRA_EXTERN rc_t CC SRACacheGetHardThreshold(SRACache* self, SRACacheMetrics* metrics);
+SRA_EXTERN rc_t CC SRACacheSetHardThreshold(SRACache* self, const SRACacheMetrics* metrics);
+
+SRA_EXTERN rc_t CC SRACacheGetUsage(SRACache* self, SRACacheUsage* usage);
+
+/* flush tables until usage is lower than specified in self->softThreshold */
+SRA_EXTERN rc_t CC SRACacheFlush(SRACache* self); 
+
+/* 
+    if found, moves element to the back of the list; return NULL object if not in the cache 
+    if found but the refcount is not 1, returns RC( rcSRA, rcData, rcAccessing, rcParam, rcBusy)
+*/
+SRA_EXTERN rc_t CC SRACacheGetTable(SRACache* self, const char* acc, const SRATable** object); 
+
+/* 
+ * fails if table is already in the cache.
+ * Does not affect usage stats.
+ */
+SRA_EXTERN rc_t CC SRACacheAddTable(SRACache* self, const char* acc, SRATable*); 
+
+SRA_EXTERN rc_t CC SRACacheWhack(SRACache* self);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_sradb_priv_ */
diff --git a/interfaces/sra/sradb.h b/interfaces/sra/sradb.h
new file mode 100644
index 0000000..747a109
--- /dev/null
+++ b/interfaces/sra/sradb.h
@@ -0,0 +1,545 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_sradb_
+#define _h_sra_sradb_
+
+#ifndef _h_sra_extern_
+#include <sra/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_insdc_insdc_
+#include <insdc/insdc.h>
+#endif
+
+#ifndef _h_insdc_sra_
+#include <insdc/sra.h>
+#endif
+
+#include <stdarg.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VSchema;
+struct VTypedef;
+struct VTypedecl;
+struct VDatatypes;
+struct KMDataNode;
+struct KDirectory;
+struct SRANamelist;
+
+
+/*--------------------------------------------------------------------------
+ * version
+ *  current API version is 3.1
+ */
+#define SRADB_CURRENT_VERSION 0x03010000
+
+
+/*--------------------------------------------------------------------------
+ * spotid_t
+ *  a 1-based integer spot identifier
+ *  unique within table
+ *  see <insdc/sra.h>
+ */
+typedef INSDC_SRA_spotid_t spotid_t;
+
+
+/*--------------------------------------------------------------------------
+ * REFERENCE COUNTING
+ *  most objects used in the API are reference counted.
+ *
+ *  all functions that return an object return an original reference
+ *  to that object ( unless otherwise noted ).
+ *
+ *  *Release functions are used to discard a reference. under normal
+ *  operation objects will be returned by an API function and freed via
+ *  the corresponding release.
+ *
+ *  *AddRef functions are used to attach an additional reference to
+ *  an object, which increases the number of *Release messages needed
+ *  to actually free an object. manipulating the reference count of an
+ *  object is not normally required.
+ */
+
+
+/*--------------------------------------------------------------------------
+ * SRAMgr
+ *  opaque handle to SRA library
+ */
+typedef struct SRAMgr SRAMgr;
+
+
+/* MakeRead
+ *  create library reference for read-only access
+ *
+ *  "wd" [ IN, NULL OKAY ] - optional working directory for
+ *  accessing the file system. mgr will attach its own reference
+ *
+ *  NB - not implemented in update libary
+ *  and the read-only library may not be mixed with read/write
+ */
+SRA_EXTERN rc_t CC SRAMgrMakeRead ( const SRAMgr **mgr );
+SRA_EXTERN rc_t CC SRAMgrMakeReadWithDir ( const SRAMgr **mgr, struct KDirectory const *wd );
+
+
+/* Release
+ *  releases reference to object
+ *  obtained from MakeRead, MakeUpdate,
+ *  or AddRef ( see above )
+ */
+SRA_EXTERN rc_t CC SRAMgrRelease ( const SRAMgr *self );
+
+
+/* AddRef
+ *  attach a new reference to an existing object
+ *  ( see above )
+ */
+SRA_EXTERN rc_t CC SRAMgrAddRef ( const SRAMgr *self );
+
+
+/* Version
+ *  returns the library version
+ */
+SRA_EXTERN rc_t CC SRAMgrVersion ( const SRAMgr *self, uint32_t *version );
+
+
+/* OpenDatatypes - DEPRECATED
+ *  open datatype registry object for requested access
+ *
+ *  "dt" [ OUT ] - return parameter for datatypes object
+ */
+SRA_EXTERN rc_t CC SRAMgrOpenDatatypesRead ( const SRAMgr *self,
+    struct VDatatypes const **dt );
+
+
+/* GetSchema
+ *  get a reference to the schema used to create new tables
+ *
+ *  "schema" [ OUT ] - return parameter for reference to SRA schema
+ *
+ * NB - returns a new reference that must be released via VSchemaRelease
+ */
+SRA_EXTERN rc_t CC SRAMgrGetSchemaRead ( const SRAMgr *self, struct VSchema const **schema );
+
+
+/* UseSchema
+ *  allows SRA schema to be entirely replaced
+ *  affects creation/update of all subsequent tables
+ *
+ *  "schema" [ IN ] - new schema to be applied
+ *
+ * NB - manager will attach a new reference to schema object,
+ *  you are still responsible for releasing it via VSchemaRelease
+ */
+SRA_EXTERN rc_t CC SRAMgrUseSchemaRead ( const SRAMgr *self, struct VSchema const *schema );
+
+
+/* Writable
+ *  returns 0 if table is writable
+ *  rcLocked if locked, rcReadonly if read-only
+ *  other code upon error
+ *
+ *  "path" [ IN ] - NUL terminated table path
+ */
+SRA_EXTERN rc_t CC SRAMgrWritable ( const SRAMgr *self, const char *path, ... );
+SRA_EXTERN rc_t CC SRAMgrVWritable ( const SRAMgr *self, const char *path, va_list args );
+
+
+/*--------------------------------------------------------------------------
+ * SRANamelist
+ */
+typedef struct SRANamelist SRANamelist;
+
+/* AddRef
+ * Release
+ *  see REFERENCE COUNTING, above
+ */
+SRA_EXTERN rc_t CC SRANamelistAddRef ( const SRANamelist *self );
+SRA_EXTERN rc_t CC SRANamelistRelease ( const SRANamelist *self );
+
+
+/* Count
+ *  gets the number of names
+ *
+ *  "count" [ OUT ] - return value
+ */
+SRA_EXTERN rc_t CC SRANamelistCount ( const SRANamelist *self, uint32_t *count );
+
+
+/* Get
+ *  gets an indexed name
+ *
+ *  "idx" [ IN ] - zero-based name index
+ *
+ *  "name" [ OUT ] - return parameter for NUL terminated name
+ */
+SRA_EXTERN rc_t CC SRANamelistGet ( const SRANamelist *self,
+    uint32_t idx, const char **name );
+    
+    
+/*--------------------------------------------------------------------------
+ * SRATable
+ *  a collection of spots with several data series, minimally including
+ *  base or color calls and their quality ( confidence ) values, and
+ *  optionally signal-related values ( signal, intensity, noise, ... ).
+ *
+ *  to discover the series available, use "SRATableListCol" to get
+ *  the names, and "SRATableColDatatypes" to list data types available
+ *  for each name.
+ *
+ *  see below for standard readable columns
+ */
+typedef struct SRATable SRATable;
+
+/* AddRef
+ * Release
+ *  see REFERENCE COUNTING, above
+ */
+SRA_EXTERN rc_t CC SRATableAddRef ( const SRATable *self );
+SRA_EXTERN rc_t CC SRATableRelease ( const SRATable *self );
+
+
+/* OpenRead
+ *  open an existing table
+ *
+ *  "tbl" [ OUT ] - return parameter for table
+ *
+ *  "spec" [ IN ] - NUL terminated UTF-8 string giving path
+ *  to table.
+ */
+SRA_EXTERN rc_t CC SRAMgrOpenTableRead ( const SRAMgr *self,
+    const SRATable **tbl, const char *spec, ... );
+SRA_EXTERN rc_t CC SRAMgrVOpenTableRead ( const SRAMgr *self,
+    const SRATable **tbl, const char *spec, va_list args );
+
+/* Locked
+ *  returns true if locked
+ */
+SRA_EXTERN bool CC SRATableLocked ( const SRATable *self );
+
+
+/* BaseCount
+ *  get the number of stored bases
+ *
+ *  "num_bases" [ OUT ] - return parameter for base count
+ */
+SRA_EXTERN rc_t CC SRATableBaseCount ( const SRATable *self, uint64_t *num_bases );
+
+
+/* SpotCount
+ *  get the number of stored spots
+ *
+ *  "spot_count" [ OUT ] - return parameter for spot count
+ */
+SRA_EXTERN rc_t CC SRATableSpotCount ( const SRATable *self, uint64_t *spot_count );
+
+
+/* MinSpotId
+ *  returns the minimum spot id
+ *
+ *  a table will contain a collection of spots with ids from
+ *  min(spot_id) to max(spot_id) unless empty.
+ *
+ *  "id" [ OUT ] - return parameter of last spot id
+ *  or zero if the table is empty.
+ */
+SRA_EXTERN rc_t CC SRATableMinSpotId ( const SRATable *self, spotid_t *id );
+
+/* MaxSpotId
+ *  returns the maximum spot id
+ *
+ *  a table will contain a collection of spots with ids from
+ *  1 to max ( spot_id ) unless empty.
+ *
+ *  "id" [ OUT ] - return parameter of last spot id
+ *  or zero if the table is empty.
+ */
+SRA_EXTERN rc_t CC SRATableMaxSpotId ( const SRATable *self, spotid_t *id );
+
+
+/* GetSpotId
+ *  convert spot name to spot id
+ *  may fail if original textual spot name is not present
+ *
+ *  "id" [ OUT ] - return parameter for 1-based spot id
+ *
+ *  "spot_name" [ IN ] - external spot name string
+ *  in platform canonical format.
+ */
+SRA_EXTERN rc_t CC SRATableGetSpotId ( const SRATable *self,
+    spotid_t *id, const char *spot_name );
+
+
+/* ListCol
+ *  returns a list of simple column names
+ *  each name represents at least one typed column
+ *
+ *  "names" [ out ] - return parameter for names list
+ */
+SRA_EXTERN rc_t CC SRATableListCol ( const SRATable *self, SRANamelist **names );
+
+
+/* ColDatatypes
+ *  returns list of typedecls for named column
+ *
+ *  "col" [ IN ] - column name
+ *
+ *  "dflt_idx" [ OUT, NULL OKAY ] - returns the zero-based index
+ *  into "typedecls" of the default datatype for the named column
+ *
+ *  "typedecls" [ OUT ] - list of datatypes available for named column
+ */
+SRA_EXTERN rc_t CC SRATableColDatatypes ( const SRATable *self, const char *col,
+    uint32_t *dflt_idx, SRANamelist **typedecls );
+
+
+/* MetaRevision
+ *  returns current revision number
+ *  where 0 ( zero ) means tip
+ */
+SRA_EXTERN rc_t CC SRATableMetaRevision ( const SRATable *self, uint32_t *revision );
+
+
+/* MaxRevision
+ *  returns the maximum revision available
+ */
+SRA_EXTERN rc_t CC SRATableMaxMetaRevision ( const SRATable *self, uint32_t *revision );
+
+
+/* UseMetaRevision
+ *  opens indicated revision of metadata
+ *  all non-zero revisions are read-only
+ */
+SRA_EXTERN rc_t CC SRATableUseMetaRevision ( const SRATable *self, uint32_t revision );
+
+
+/* OpenMDataNode
+ *  open a metadata node
+ *
+ *  "node" [ OUT ] - return parameter for metadata node
+ *
+ *  "path" [ IN ] - simple or hierarchical NUL terminated
+ *  path to node
+ */
+SRA_EXTERN rc_t CC SRATableOpenMDataNodeRead ( const SRATable *self,
+    struct KMDataNode const **node, const char *path, ... );
+SRA_EXTERN rc_t CC SRATableVOpenMDataNodeRead ( const SRATable *self,
+    struct KMDataNode const **node, const char *path, va_list args );
+
+
+/*  SRATableGetSchema
+ *  returns current schema of the open cursor
+ */
+SRA_EXTERN struct VSchema const* CC SRATableGetSchema ( const SRATable *self );
+
+
+
+/*--------------------------------------------------------------------------
+ * SRAColumn
+ *  represents a spot data column, where the column is configured as
+ *  a sequence of blobs, and each blob is a sequence of records,
+ *  indexed by spot id.
+ */
+typedef struct SRAColumn SRAColumn;
+
+/* AddRef
+ * Release
+ *  see REFERENCE COUNTING, above
+ */
+SRA_EXTERN rc_t CC SRAColumnAddRef ( const SRAColumn *self );
+SRA_EXTERN rc_t CC SRAColumnRelease ( const SRAColumn *self );
+
+
+/* OpenColumnRead
+ *  open a column for read
+ *
+ *  "col" [ OUT ] - return parameter for newly opened column
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving column name
+ *
+ *  "datatype" [ IN, NULL OKAY ] - optional NUL terminated typedecl
+ *  string describing fully qualified column data type, or if NULL
+ *  the default type for column.
+ */
+SRA_EXTERN rc_t CC SRATableOpenColumnRead ( const SRATable *self,
+    const SRAColumn **col, const char *name, const char *datatype );
+
+
+/* Datatype
+ *  access data type
+ *
+ *  "type" [ OUT, NULL OKAY ] - returns the column type declaration
+ *
+ *  "def" [ OUT, NULL OKAY ] - returns the definition of the type
+ *  returned in "type_decl"
+ *
+ * NB - one of "type" and "def" must be non-NULL
+ */
+SRA_EXTERN rc_t CC SRAColumnDatatype ( const SRAColumn *self,
+    struct VTypedecl *type, struct VTypedef *def );
+
+
+/* GetRange
+ *  get a contiguous range around a spot id, e.g. tile for Illumina
+ *
+ *  "id" [ IN ] - return parameter for 1-based spot id
+ *
+ *  "first" [ OUT, NULL OKAY ] and "last" [ OUT, NULL OKAY ] -
+ *  id range is returned in these output parameters, where
+ *  at least ONE must be NOT-NULL
+ */
+SRA_EXTERN rc_t CC SRAColumnGetRange ( const SRAColumn *self,
+    spotid_t id, spotid_t *first, spotid_t *last );
+
+
+/* Read
+ *  read row data
+ *
+ *  "id" [ IN ] - spot row id between 1 and max ( spot id )
+ *
+ *  "base" [ OUT ] and "offset" [ OUT ] - pointer and bit offset
+ *  to start of spot row data.
+ *
+ *  "size" [ OUT ] - size in bits of row data
+ */
+SRA_EXTERN rc_t CC SRAColumnRead ( const SRAColumn *self, spotid_t id,
+    const void **base, bitsz_t *offset, bitsz_t *size );
+
+
+
+/*--------------------------------------------------------------------------
+ * SRA column formatted type descriptions
+ *
+ *  most datatypes are constructed as vectors, rather than structures.
+ *  this permits flexibility in data transformations and removes compiler
+ *  dependency in layout.
+ */
+
+
+/* SRAPlatforms
+ *  see <insdc/sra.h>
+ */
+typedef INSDC_SRA_platform_id SRAPlatforms;
+
+
+/* SRAReadTypes
+ *  read type bits
+ *  see <insdc/sra.h>
+ */
+typedef INSDC_SRA_xread_type SRAReadTypes;
+
+
+/* SRAReadFilter
+ *  read filter attribute bits
+ *  see <insdc/sra.h>
+ */
+typedef INSDC_SRA_read_filter SRAReadFilter;
+
+
+/* SRASpotDesc - DEPRECATED
+ *  a structure returned by SPOT_DESC column
+ */
+#define sra_spot_desc_t "NCBI:SRA:SpotDesc"
+typedef struct SRASpotDesc SRASpotDesc;
+struct SRASpotDesc
+{
+    /* lengths in bases */
+    uint16_t spot_len;
+    uint16_t fixed_len;
+    uint16_t signal_len;
+
+    /* quality clips */
+    uint16_t clip_qual_right;
+
+    /* number of reads per spot */
+    uint8_t num_reads;
+
+    /* pad out to have 16 byte structure size */
+    uint8_t align [ 7 ];
+};
+
+/* SRASegment - DEPRECATED
+ *  a paired starting coordinate and length
+ */
+#define sra_segment_t "NCBI:SRA:Segment"
+typedef struct SRASegment SRASegment;
+struct SRASegment
+{
+    uint16_t start;
+    uint16_t len;
+};
+
+/* SRAReadDesc - DEPRECATED
+ *  a structure 
+ */
+#define sra_read_desc_t "NCBI:SRA:ReadDesc"
+typedef struct SRAReadDesc SRAReadDesc;
+struct SRAReadDesc
+{
+    /* location and length in bases of read
+       within READ and QUALITY columns */
+    SRASegment seg;
+
+    /* read type from SRAReadTypes */
+    uint8_t type;
+
+    /* optional color space key */
+    char cs_key;
+
+    /* NUL terminated read label */
+    char label [ 74 ];
+};
+
+/* SRAPhredPair
+ *  pairs an event character with a phred score
+ *  event characters are "ACGT0123B+-"
+ */
+#define sra_phred_pair_t "NCBI:SRA:PhredPair"
+typedef struct SRAPhredPair SRAPhredPair;
+struct SRAPhredPair
+{
+    char event;
+    INSDC_quality_phred phred;
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_sradb_ */
diff --git a/interfaces/sra/sradb.hpp b/interfaces/sra/sradb.hpp
new file mode 100644
index 0000000..2bb3b5b
--- /dev/null
+++ b/interfaces/sra/sradb.hpp
@@ -0,0 +1,441 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_sra_sradb_
+#define _hpp_sra_sradb_
+
+#ifdef _hpp_sra_wsradb_
+#error "read and update libraries are mutually exclusive"
+#endif
+
+#ifndef _h_sra_sradb_
+#include <sra/sradb.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SRAMgr
+ *  opaque handle to SRA library
+ */
+struct SRAMgr
+{
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const throw ()
+    { return SRAMgrAddRef ( this ); }
+
+    inline rc_t Release () const throw ()
+    { return SRAMgrRelease ( this ); }
+
+
+    /* Make
+     *  create library handle for read-only access
+     *
+     *  NB - not implemented in read/write library,
+     *  and the read-only library may not be mixed with read/write
+     */
+    static inline rc_t Make ( const SRAMgr **mgr ) throw ()
+    { return SRAMgrMakeRead ( mgr ); }
+    static inline rc_t Make ( const SRAMgr **mgr, const KDirectory *wd ) throw ()
+    { return SRAMgrMakeReadWithDir ( mgr, wd ); }
+
+
+    /* Version
+     *  returns the library version
+     */
+    inline rc_t Version ( uint32_t *version ) const throw ()
+    { return SRAMgrVersion ( this, version ); }
+
+
+    /* OpenDatatypes
+     *  open datatype registry object for requested access
+     *  see <vdb/types.hpp> for VDatatypes
+     *
+     *  "dt" [ OUT ] - return parameter for datatypes object
+     */
+    inline rc_t OpenDatatypes ( const VDatatypes **dt ) const throw ()
+    { return SRAMgrOpenDatatypesRead ( this, dt ); }
+
+
+    /* GetSchema
+     *  get a reference to the schema used to create new tables
+     *
+     *  "schema" [ OUT ] - return parameter for reference to SRA schema
+     *
+     * NB - returns a new reference that must be released via VSchemaRelease
+     */
+    inline rc_t GetSchemaRead ( const VSchema **schema ) const throw ()
+    { return SRAMgrGetSchemaRead ( this, schema ); }
+
+
+    /* UseSchema
+     *  allows SRA schema to be entirely replaced
+     *  affects creation/update of all subsequent tables
+     *
+     *  "schema" [ IN ] - new schema to be applied
+     *
+     * NB - manager will attach a new reference to schema object,
+     *  you are still responsible for releasing it via VSchemaRelease
+     */
+    inline rc_t UseSchemaRead ( const VSchema *schema ) const throw ()
+    { return SRAMgrUseSchemaRead ( this, schema ); }
+
+
+    /* Writable
+     *  returns 0 if table is writable
+     *  rcLocked if locked, rcReadonly if read-only
+     *  other code upon error
+     *
+     *  "path" [ IN ] - NUL terminated table path
+     */
+    inline bool Writable ( const char *path, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        bool locked = SRAMgrVWritable ( this, path, args );
+        va_end ( args );
+        return locked;
+    }
+    inline bool Writable ( const char *path, va_list args ) const throw ()
+    { return SRAMgrVWritable ( this, path, args ); }
+
+
+    /* OpenTable
+     *  open an existing table for read
+     *
+     *  "tbl" [ OUT ] - return parameter for table
+     *
+     *  "path" [ IN ] - NUL terminated run name
+     */
+    inline rc_t OpenTable ( const SRATable **tbl,
+        const char *path, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = SRAMgrVOpenTableRead ( this, tbl, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenTable ( const SRATable **tbl, const char *path,
+        va_list args ) const throw ()
+    { return SRAMgrVOpenTableRead ( this, tbl, path, args ); }
+    
+private:
+    SRAMgr ();
+    ~ SRAMgr ();
+    SRAMgr ( const SRAMgr& );
+    SRAMgr &operator = ( const SRAMgr& );
+};
+
+
+/*--------------------------------------------------------------------------
+ * SRATable
+ *  a collection of spots with several data series, minimally including
+ *  base or color calls and their quality ( confidence ) values, and
+ *  optionally signal-related values ( signal, intensity, noise, ... ).
+ */
+struct SRATable
+{
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const throw ()
+    { return SRATableAddRef ( this ); }
+
+    inline rc_t Release () const throw ()
+    { return SRATableRelease ( this ); }
+
+
+    /* Locked
+     *  returns true if locked
+     */
+    inline bool Locked () const throw ()
+    { return SRATableLocked ( this ); }
+
+
+    /* BaseCount
+     *  get the number of stored bases
+     *
+     *  "num_bases" [ OUT ] - return parameter for base count
+     */
+    inline rc_t BaseCount ( uint64_t *num_bases ) const throw ()
+    { return SRATableBaseCount ( this, num_bases ); }
+
+
+    /* SpotCount
+     *  get the number of stored spots
+     *
+     *  "spot_count" [ OUT ] - return parameter for spot count
+     */
+    inline rc_t SpotCount ( uint64_t *spot_count ) const throw ()
+    { return SRATableSpotCount ( this, spot_count ); }
+
+
+    /* MaxSpotId
+     *  returns the maximum spot id
+     *
+     *  a table will contain a collection of spots with ids from
+     *  1 to max ( spot_id ).
+     *
+     *  "id" [ OUT ] - return parameter of last spot id
+     */
+    inline rc_t MaxSpotId ( spotid_t *id ) const throw ()
+    { return SRATableMaxSpotId ( this, id ); }
+
+
+    /* MinSpotId
+     *  returns the minimum spot id
+     *
+     *  a table will contain a collection of spots with ids from
+     *  min to max ( spot_id ).
+     *
+     *  "id" [ OUT ] - return parameter of last spot id
+     */
+    inline rc_t MinSpotId ( spotid_t *id ) const throw ()
+    { return SRATableMinSpotId ( this, id ); }
+
+    /* GetSpotId
+     *  project a spot id from a spot name
+     *
+     *  "id" [ OUT ] - return parameter for 1-based spot id
+     *
+     *  "spot_name" [ IN ] - external spot name string
+     */
+    inline rc_t GetSpotId ( spotid_t *id, const char *spot_name ) const throw ()
+    { return SRATableGetSpotId ( this, id, spot_name ); }
+
+
+    /* ListCol
+     *  returns a list of column names
+     *
+     *  "names" [ out ] - return parameter for names list
+     */
+    inline rc_t ListCol ( SRANamelist **names ) const throw ()
+    { return SRATableListCol ( this, names ); }
+
+
+    /* ColDatatypes
+     *  returns list of typedecls for named column
+     *
+     *  "col" [ IN ] - column name
+     *
+     *  "dflt_idx" [ OUT, NULL OKAY ] - returns the zero-based index
+     *  into "typedecls" of the default datatype for the named column
+     *
+     *  "typedecls" [ OUT ] - list of datatypes available for named column
+     */
+    inline rc_t ColDatatypes ( const char *col,
+        uint32_t *dflt_idx, SRANamelist **typedecls ) const throw ()
+    { return SRATableColDatatypes ( this, col, dflt_idx, typedecls ); }
+
+
+    /* OpenColumn
+     *  open a column for read
+     *
+     *  "col" [ OUT ] - return parameter for newly opened column
+     *
+     *  "name" [ IN ] - NUL terminated string in UTF-8 giving column name
+     *
+     *  "datatype" [ IN - NULL OKAY ] - optional NUL terminated
+     *   string describing fully qualified column data type in ASCII
+     */
+    inline rc_t OpenColumn ( const SRAColumn **col,
+        const char *name, const char *datatype = 0 ) const throw ()
+    { return SRATableOpenColumnRead ( this, col, name, datatype ); }
+
+
+    /* MetaRevision
+     *  returns current revision number
+     *  where 0 ( zero ) means tip
+     */
+    inline rc_t MetaRevision ( uint32_t *revision ) const throw ()
+    { return SRATableMetaRevision ( this, revision ); }
+
+
+    /* MaxRevision
+     *  returns the maximum revision available
+     */
+    inline rc_t MaxMetaRevision ( uint32_t *revision ) const throw ()
+    { return SRATableMaxMetaRevision ( this, revision ); }
+
+
+    /* UseMetaRevision
+     *  opens indicated revision of metadata
+     *  all non-zero revisions are read-only
+     */
+    inline rc_t UseMetaRevision ( uint32_t revision ) const throw ()
+    { return SRATableUseMetaRevision ( this, revision ); }
+
+
+    /* OpenMDataNode
+     *  open a metadata node
+     *
+     *  "node" [ OUT ] - return parameter for metadata node
+     *
+     *  "path" [ IN ] - simple or hierarchical NUL terminated
+     *  path to node
+     */
+    inline rc_t OpenMDataNode ( const KMDataNode **node,
+        const char *path, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = SRATableVOpenMDataNodeRead ( this, node, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenMDataNode ( const KMDataNode **node,
+        const char *path, va_list args ) const throw ()
+    { return SRATableVOpenMDataNodeRead ( this, node, path, args ); }
+
+
+    /*  GetSchema
+    *  returns current schema of the open cursor
+    */
+    inline struct VSchema const* GetSchema () const throw ()
+    { return SRATableGetSchema ( this ); }
+
+private:
+    SRATable ();
+    ~ SRATable ();
+    SRATable ( const SRATable& );
+    SRATable &operator = ( const SRATable& );
+};
+
+
+/*--------------------------------------------------------------------------
+ * SRAColumn
+ *  represents a spot data column, where the column is configured as
+ *  a sequence of blobs, and each blob is a sequence of records,
+ *  indexed by spot id.
+ */
+struct SRAColumn
+{
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const throw ()
+    { return SRAColumnAddRef ( this ); }
+
+    inline rc_t Release () const throw ()
+    { return SRAColumnRelease ( this ); }
+
+
+    /* Datatype
+     *  access data type
+     *
+     *  "type" [ OUT, NULL OKAY ] - returns the column type declaration
+     *
+     *  "def" [ OUT, NULL OKAY ] - returns the definition of the type
+     *  returned in "type_decl"
+     *
+     * NB - one of "type" and "def" must be non-NULL
+     */
+    inline int Datatype ( struct VTypedecl *type, struct VTypedef *def ) const throw ()
+    { return SRAColumnDatatype ( this, type, def ); }
+
+
+    /* GetRange
+     *  get a contiguous range around a spot id, e.g. tile for Illumina
+     *
+     *  "id" [ IN ] - return parameter for 1-based spot id
+     *
+     *  "first" [ OUT, NULL OKAY ] and "last" [ OUT, NULL OKAY ] -
+     *  id range is returned in these output parameters, where
+     *  at least ONE must be NOT-NULL
+     */
+    inline rc_t GetRange ( spotid_t id, spotid_t *first, spotid_t *last ) const throw ()
+    { return SRAColumnGetRange ( this, id, first, last ); }
+
+
+    /* Read
+     *  read row data
+     *
+     *  "id" [ IN ] - spot row id between 1 and max ( spot id )
+     *
+     *  "base" [ OUT ] and "offset" [ OUT ] - pointer and bit offset
+     *  to start of spot row data.
+     *
+     *  "size" [ OUT ] - size in bits of row data
+     */
+    inline rc_t Read ( spotid_t id,
+        const void **base, bitsz_t *offset, bitsz_t *size ) const throw ()
+    { return SRAColumnRead ( this, id, base, offset, size ); }
+
+
+private:
+    SRAColumn ();
+    ~ SRAColumn ();
+    SRAColumn ( const SRAColumn& );
+    SRAColumn &operator = ( const SRAColumn& );
+};
+
+
+/*--------------------------------------------------------------------------
+ * SRANamelist
+ *  a list of names, types or other strings
+ */
+struct SRANamelist
+{
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const throw ()
+    { return SRANamelistAddRef ( this ); }
+
+    inline rc_t Release () const throw ()
+    { return SRANamelistRelease ( this ); }
+
+
+    /* Count
+     *  gets the number of names
+     *
+     *  "count" [ OUT ] - return value
+     */
+    inline rc_t Count ( uint32_t *count ) const throw ()
+    { return SRANamelistCount ( this, count ); }
+
+
+    /* Get
+     *  gets an indexed name
+     *
+     *  "idx" [ IN ] - zero-based name index
+     *
+     *  "name" [ OUT ] - return parameter for NUL terminated name
+     */
+    inline rc_t Get ( uint32_t idx, const char **name ) const throw ()
+    { return SRANamelistGet ( this, idx, name ); }
+
+
+private:
+    SRANamelist ();
+    ~ SRANamelist ();
+    SRANamelist ( const SRANamelist& );
+    SRANamelist &operator = ( const SRANamelist& );
+};
+
+#endif // _hpp_sra_sradb_
diff --git a/interfaces/sra/srapath.h b/interfaces/sra/srapath.h
new file mode 100644
index 0000000..9965e8d
--- /dev/null
+++ b/interfaces/sra/srapath.h
@@ -0,0 +1,181 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_srapath_
+#define _h_sra_srapath_
+
+#ifndef _h_sra_extern_
+#include <sra/extern.h>
+#endif
+
+#ifndef _h_klib_callconv_
+#include <klib/callconv.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TOOLS_USE_SRAPATH 0
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KNamelist;
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * SRAPath
+ *  manages accession -> path conversion
+ */
+typedef struct SRAPath SRAPath;
+
+
+/* Make
+ *  create path manager
+ *
+ *  the path manager should already be configured with
+ *  standard search paths, but can be augmented by using
+ *  the Add*Path messages.
+ *
+ *  "dir" [ IN, NULL OKAY ] - optional root directory to use
+ *  attaches a new reference
+ */
+SRA_EXTERN rc_t CC SRAPathMake ( SRAPath **pm, struct KDirectory const *dir );
+
+
+/* AddRef
+ * Release
+ */
+SRA_EXTERN rc_t CC SRAPathAddRef ( const SRAPath *self );
+SRA_EXTERN rc_t CC SRAPathRelease ( const SRAPath *self );
+
+/* Version
+ *  returns the library version
+ */
+SRA_EXTERN rc_t CC SRAPathVersion ( const SRAPath *self, uint32_t *version );
+
+
+/* Clear
+ *  forget existing server and volume paths for the default repository
+ */
+SRA_EXTERN rc_t CC SRAPathClear ( SRAPath *self );
+
+
+/* AddRepPath
+ *  add a replication path to the default repository
+ *
+ *  "rep" [ IN ] - NUL-terminated server search path
+ *  may be a compound path with ':' separator characters, e.g.
+ *  "/panfs/traces01:/panfs/traces31"
+ *
+ *  NB - servers are searched in the order provided,
+ *  first to last, until one of them satisfies a request,
+ *  at which time the successful server is placed at the
+ *  head of the search path.
+ */
+SRA_EXTERN rc_t CC SRAPathAddRepPath ( SRAPath *self, const char *rep );
+
+
+/* AddVolPath
+ *  add a volume path to the default repository
+ *
+ *  "vol" [ IN ] - NUL-terminated volume search path
+ *  may be a compound path with ':' separator characters, e.g.
+ *  "sra2:sra1:sra0"
+ *
+ *  NB - volumes are searched in the order provided,
+ *  first to last. they are never re-ordered.
+ */
+SRA_EXTERN rc_t CC SRAPathAddVolPath ( SRAPath *self, const char *vol );
+
+
+/* Full
+ *  creates full path from server, volume & accession
+ *
+ *  "rep" [ IN ] - NUL terminated full path of replication
+ *  server, e.g. "/panfs/traces01"
+ *
+ *  "vol" [ IN ] - NUL terminated relative path of volume,
+ *  e.g. "sra2"
+ *
+ *  "accession" [ IN ] - NUL terminated run accession,
+ *  e.g. "SRR000001"
+ *
+ *  "path" [ OUT ] and "path_max" [ IN ] - return buffer for
+ *  NUL-terminated full path to accession.
+ */
+SRA_EXTERN rc_t CC SRAPathFull ( const SRAPath *self, const char *rep,
+    const char *vol, const char *accession, char *path, size_t path_max );
+
+
+/* Test
+ *  returns true if path appears to be accession
+ *  the test is a heuristic, and may return false positives
+ *
+ *  "path" [ IN ] - NUL terminated path to run
+ */
+SRA_EXTERN bool CC SRAPathTest ( const SRAPath *self, const char *path );
+
+
+/* Find
+ *  finds location of run within rep-server/volume matrix
+ *
+ *  "accession" [ IN ] - NUL terminated run accession,
+ *   e.g. "SRR000001"
+ *
+ *  "path" [ OUT ] and "path_max" [ IN ] - return buffer for
+ *  NUL-terminated full path to accession.
+ *
+ *  returns 0 if path exists, rc state rcNotFound if
+ *  path cannot be found, and rcInsufficient if buffer is
+ *  too small.
+ */
+SRA_EXTERN rc_t CC SRAPathFind ( const SRAPath *self,
+    const char *accession, char *path, size_t path_max );
+
+
+/* List
+ *  list all runs known to SRAPath
+ *  this can be VERY SLOW due to the large number of runs
+ *
+ *  "runs" [ OUT ] - return parameter for ordered list of accessions
+ *
+ *  "deep" [ IN ] - when false, list only first responding server
+ */
+SRA_EXTERN rc_t CC SRAPathList ( const SRAPath *self, struct KNamelist **runs, bool deep );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_srapath_ */
diff --git a/interfaces/sra/srapath.hpp b/interfaces/sra/srapath.hpp
new file mode 100644
index 0000000..a863dfa
--- /dev/null
+++ b/interfaces/sra/srapath.hpp
@@ -0,0 +1,176 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_sra_srapath_
+#define _hpp_sra_srapath_
+
+#ifndef _h_sra_srapath_
+#include <sra/srapath.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SRAPath
+ *  archive specific path manager
+ */
+struct SRAPath
+{
+    /* Make
+     *  create path manager
+     *
+     *  the path manager should already be configured with
+     *  standard search paths, but can be augmented by using
+     *  the Add*Path messages.
+     *
+     *  "dir" [ IN, NULL OKAY ] - optional root directory to use
+     *  attaches a new reference
+     */
+    static inline rc_t Make ( SRAPath **pm,
+        struct KDirectory const *dir = NULL ) throw()
+    { return SRAPathMake ( pm, dir ); }
+
+
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const  throw()
+    { return SRAPathAddRef ( this ); }
+
+    inline rc_t Release () const  throw()
+    { return SRAPathRelease ( this ); }
+
+
+    /* Version
+     *  returns the library version
+     */
+    inline rc_t Version ( uint32_t *version ) const  throw()
+    { return SRAPathVersion ( this, version ); }
+
+
+    /* Clear
+     *  forget all existing server and volume paths
+     */
+    inline rc_t Clear () throw()
+    { return SRAPathClear ( this ); }
+
+    /* AddRepPath
+     *  add a replication path
+     *
+     *  "rep" [ IN ] - NUL-terminated server search path
+     *  may be a compound path with ':' separator characters, e.g.
+     *  "/panfs/traces01:/panfs/traces31"
+     *
+     *  NB - servers are searched in the order provided,
+     *  first to last, until one of them satisfies a request,
+     *  at which time the successful server is placed at the
+     *  head of the search path.
+     */
+    inline rc_t AddRepPath ( const char *rep )  throw()
+    { return SRAPathAddRepPath ( this, rep ); }
+
+
+    /* AddVolPath
+     *  add a volume path
+     *
+     *  "vol" [ IN ] - NUL-terminated volume search path
+     *  may be a compound path with ':' separator characters, e.g.
+     *  "sra2:sra1:sra0"
+     *
+     *  NB - volumes are searched in the order provided,
+     *  first to last. they are never re-ordered.
+     */
+    inline rc_t AddVolPath ( const char *vol )  throw()
+    { return SRAPathAddVolPath ( this, vol ); }
+
+
+    /* Full
+     *  creates full path from server, volume & accession
+     *
+     *  "rep" [ IN ] - NUL terminated full path of replication
+     *  server, e.g. "/panfs/traces01"
+     *
+     *  "vol" [ IN ] - NUL terminated relative path of volume,
+     *  e.g. "sra2"
+     *
+     *  "accession" [ IN ] - NUL terminated run accession,
+     *  e.g. "SRR000001"
+     *
+     *  "path" [ OUT ] and "path_max" [ IN ] - return buffer for
+     *  NUL-terminated full path to accession.
+     */
+    inline rc_t Full ( const char *rep, const char *vol,
+        const char *accession, char *path, size_t path_max ) const  throw()
+    { return SRAPathFull ( this, rep, vol, accession, path, path_max ); }
+
+
+    /* Test
+     *  returns true if path appears to be accession
+     *  the test is a heuristic, and may return false positives
+     *
+     *  "path" [ IN ] - NUL terminated path to run
+     */
+    inline bool Test ( const char *path ) const  throw()
+    { return SRAPathTest ( this, path ); }
+
+
+    /* Find
+     *  finds location of run within rep-server/volume matrix
+     *
+     *  "accession" [ IN ] - NUL terminated run accession,
+     *   e.g. "SRR000001"
+     *
+     *  "path" [ OUT ] and "path_max" [ IN ] - return buffer for
+     *  NUL-terminated full path to accession.
+     *
+     *  returns 0 if path exists, rc state rcNotFound if
+     *  path cannot be found, and rcInsufficient if buffer is
+     *  too small.
+     */
+    inline rc_t Find ( const char *accession, char *path,
+        size_t path_max ) const throw()
+    { return SRAPathFind ( this, accession, path, path_max ); }
+
+
+    /* List
+     *  list all runs known to SRAPath
+     *  this can be VERY SLOW due to the large number of runs
+     *
+     *  "runs" [ OUT ] - return parameter for ordered list of accessions
+     *
+     *  "deep" [ IN ] - when false, list only first responding server
+     */
+    inline rc_t List ( struct KNamelist **runs,
+        bool deep = false ) const  throw()
+    { return SRAPathList ( this, runs, deep ); }
+
+private:
+    SRAPath ();
+    ~ SRAPath ();
+    SRAPath ( const SRAPath& );
+    SRAPath &operator = ( const SRAPath& );
+};
+
+#endif // _hpp_sra_srapath_
diff --git a/interfaces/sra/sraschema.h b/interfaces/sra/sraschema.h
new file mode 100644
index 0000000..428061c
--- /dev/null
+++ b/interfaces/sra/sraschema.h
@@ -0,0 +1,72 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_sraschema_
+#define _h_sra_sraschema_
+
+#ifndef _h_sra_extern_
+#include <sra/extern.h>
+#endif
+
+#ifndef _h_klib_callconv_
+#include <klib/callconv.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct SRAMgr;
+struct VSchema;
+struct VDBManager;
+
+
+/*--------------------------------------------------------------------------
+ * SRASchema
+ *  a schema object pre-loaded with default SRA schema
+ */
+
+
+/* Make
+ *  create an instance of the default SRA schema
+ */
+SRA_EXTERN rc_t CC SRAMgrMakeSRASchema ( struct SRAMgr const *self, struct VSchema **schema );
+SRA_EXTERN rc_t CC VDBManagerMakeSRASchema ( struct VDBManager const *self, struct VSchema **schema );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_sraschema_ */
diff --git a/interfaces/sra/types.h b/interfaces/sra/types.h
new file mode 100644
index 0000000..5cfa126
--- /dev/null
+++ b/interfaces/sra/types.h
@@ -0,0 +1,350 @@
+/*=======================================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_types_
+#define _h_sra_types_
+
+#ifndef _h_sra_extern_
+#include <sra/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * logical intrinsics
+ *  CS101 datatypes
+ *
+ *  logical types are intrinsic and have no signed property. they exist
+ *  mainly to support bit manipulation operations. actual numeric types
+ *  inherit their size and byte-swapping from logical types.
+ */
+
+#define vdb_bit1_t          "B1"
+#define vdb_bit8_t          "B8"
+#define vdb_bit16_t        "B16"
+#define vdb_bit32_t        "B32"
+#define vdb_bit64_t        "B64"
+#define vdb_bit128_t      "B128"
+
+
+/*--------------------------------------------------------------------------
+ * numeric types
+ *  CS101 datatypes
+ *
+ *  in general, all numbers are named type + size in bits, where
+ *  type = "U" for unsigned, "I" for signed, and "F" for floats.
+ */
+
+#define vdb_uint1_t         "U1"       /* supertype "B1"      */
+#define vdb_int8_t          "I8"       /* supertype "B8"      */
+#define vdb_uint8_t         "U8"       /* supertype "B8"      */
+#define vdb_int16_t        "I16"       /* supertype "B16"     */
+#define vdb_uint16_t       "U16"       /* supertype "B16"     */
+#define vdb_int32_t        "I32"       /* supertype "B32"     */
+#define vdb_uint32_t       "U32"       /* supertype "B32"     */
+#define vdb_int64_t        "I64"       /* supertype "B64"     */
+#define vdb_uint64_t       "U64"       /* supertype "B64"     */
+#define vdb_int128_t      "I128"       /* supertype "B128"    */
+#define vdb_uint128_t     "U128"       /* supertype "B128"    */
+#define vdb_float32_t      "F32"       /* supertype "B32"     */
+#define vdb_float64_t      "F64"       /* supertype "B64"     */
+
+
+/*--------------------------------------------------------------------------
+ * boolean
+ */
+
+#define vdb_bool_t      "bool"          /* supertype "U8"     */
+
+
+/*--------------------------------------------------------------------------
+ * character types
+ */
+
+#define vdb_utf8_t      "utf8"          /* supertype "B8"     */
+#define vdb_utf16_t     "utf16"         /* supertype "B16"    */
+#define vdb_utf32_t     "utf32"         /* supertype "B32"    */
+#define vdb_ascii_t     "ascii"         /* supertype "utf8"   */
+
+
+/*--------------------------------------------------------------------------
+ * INSDC types
+ */
+#define insdc_fasta_t   "INSDC:dna:text"        /* supertype "ascii"  */
+#define insdc_csfasta_t "INSDC:color:text"      /* supertype "ascii"  */
+#define insdc_2na_t     "INSDC:2na:packed"      /* supertype "B1[2]"  */
+#define insdc_4na_t     "INSDC:4na:packed"      /* supertype "B1[4]"  */
+#define insdc_2cs_t     "INSDC:2cs:packed"      /* supertype "B1[2]"  */
+#define insdc_phred_t   "INSDC:quality:phred"   /* supertype "U8"     */
+#define insdc_logodds_t "INSDC:quality:log_odds"/* supertype "I8"     */
+
+
+/*--------------------------------------------------------------------------
+ * NCBI types
+ *  types common within NCBI.
+ *
+ *  partial byte sized types do not have a registered supertype,
+ *  but are commented to indicate their size
+ */
+
+#define ncbi_qual4_t    "NCBI:qual4"         /* supertype "I8[4]"  */
+#define ncbi_isamp1_t   "NCBI:isamp1"        /* supertype "I16"    */
+#define ncbi_isamp4_t   "NCBI:isamp4"        /* supertype "I16[4]" */
+#define ncbi_fsamp1_t   "NCBI:fsamp1"        /* supertype "F32"    */
+#define ncbi_fsamp4_t   "NCBI:fsamp4"        /* supertype "F32[4]" */
+
+
+/* alias names */
+#define ncbi_2na_t      insdc_2na_t
+#define ncbi_4na_t      insdc_4na_t
+#define ncbi_2cs_t      insdc_2cs_t
+#define ncbi_qual1_t    insdc_phred_t
+
+
+/*--------------------------------------------------------------------------
+ * VTypedef
+ *  used to describe properties of a type
+ *
+ *  when properly filled out, the structure indicates
+ *  the 1-based runtime id of type, that of its supertype
+ *  or 0 if none, the size in bits of type, the size in
+ *  bits of the supertype ( or element type, when dim > 1 )
+ *  and the vector dimension given when type was introduced,
+ *  as well as whether the type is a signed numeric.
+ *
+ *  example: "typedef I8 NCBI:qual4 [ 4 ]" translates to:
+ *    type_id   = runtime type id of NCBI:qual4
+ *    super_id  = runtime type id of I8
+ *    size      = 8
+ *    dim       = 4
+ *    sign      = true
+ */
+typedef struct VTypedef VTypedef;
+struct VTypedef
+{
+    /* runtime type id */
+    uint32_t type_id;
+
+    /* supertype id */
+    uint32_t super_id;
+
+    /* size of type element */
+    bitsz_t type_size;
+
+    /* vector dimension */
+    uint32_t dim;
+
+    /* signed property */
+    uint32_t sign;
+};
+
+
+/* Sizeof
+ *  returns the bit size of declared type
+ *
+ *  technically, this is self -> size * self -> dim.
+ */
+/* bitsz_t VTypedefSizeof ( const VTypedef *self ); */
+#define VTypedefSizeof(T) ((bitsz_t)(((T)->type_size) * ((T)->dim)))
+
+
+/*--------------------------------------------------------------------------
+ * VDatatypes
+ */
+typedef struct VDatatypes VDatatypes;
+
+
+/* forward */
+struct VTypedecl;
+
+
+/* AddRef
+ * Release
+ */
+SRA_EXTERN rc_t CC VDatatypesAddRef ( const VDatatypes *self );
+SRA_EXTERN rc_t CC VDatatypesRelease ( const VDatatypes *self );
+
+
+/* RegisterOpaque
+ * RegisterSubtype
+ *  registers new datatypes
+ *
+ *  "newtype" [ IN ] - NUL terminated fully qualified type name
+ *
+ *  "supertype" [ IN ] and "dim" [ IN ] - NUL terminated fully
+ *  qualified parent equivalency type and vector dimension
+ *  -OR-
+ *  "bits" [ IN ] - size in bits of element.
+ *
+ *  "byte_swap" [ IN, CONDITIONALLY NULL OKAY ] - a byte swapping function
+ *  required when size > 8 and and integral multiple of 8.
+ */
+#if 0
+SRA_EXTERN rc_t CC VDatatypesRegisterOpaque ( VDatatypes *self,
+    const char *newtype, uint16_t bits,
+    void ( CC * byte_swap ) ( void *elem ) );
+SRA_EXTERN rc_t CC VDatatypesRegisterSubtype ( VDatatypes *self,
+    const char *newtype, const char *supertype, uint16_t dim,
+    void ( CC * byte_swap ) ( void *elem ) );
+#endif
+
+/* DefineSubtype
+ *  creates a subtype definition
+ *
+ *    typedef = [ 'typedef' ] <supertype> <typedecl>
+ */
+#if 0
+SRA_EXTERN rc_t CC VDatatypesDefineSubtype ( VDatatypes *self,
+    const char *definition, ... );
+SRA_EXTERN rc_t CC VDatatypesVDefineSubtype ( VDatatypes *self,
+    const char *definition, va_list args );
+#endif
+
+/* ResolveTypedecl
+ *  converts a typedecl string to type id and vector dimension
+ *
+ *  "resolved" [ OUT ] - resolved type declaration
+ *
+ *  "typedecl" [ IN ] - type declaration
+ */
+SRA_EXTERN rc_t CC VDatatypesResolveTypedecl ( const VDatatypes *self,
+    struct VTypedecl *resolved, const char *typedecl, ... );
+SRA_EXTERN rc_t CC VDatatypesVResolveTypedecl ( const VDatatypes *self,
+    struct VTypedecl *resolved, const char *typedecl, va_list args );
+
+
+/* ResolveTypename
+ *  convert a type id into its type definition
+ *
+ *  "resolved" [ OUT ] - resolved type definition
+ *
+ *  "typname" [ IN ] - NUL-terminated type name
+ */
+SRA_EXTERN rc_t CC VDatatypesResolveTypename ( const VDatatypes *self,
+    VTypedef *resolved, const char *typname );
+
+
+/* ResolveTypeid
+ *  convert a type id into its type definition
+ *
+ *  "resolved" [ OUT ] - resolved type definition
+ *
+ *  "type_id" [ IN ] - 1-based runtime type id
+ */
+SRA_EXTERN rc_t CC VDatatypesResolveTypeid ( const VDatatypes *self,
+    VTypedef *resolved, uint32_t type_id );
+
+
+/* SizeofTypedecl
+ *  returns the bit size of type declaration
+ */
+SRA_EXTERN rc_t CC VDatatypesSizeofTypedecl ( const VDatatypes *self,
+    bitsz_t *type_size, struct VTypedecl const *td );
+
+
+/* SizeofTypeid
+ *  returns the bit size of typeid
+ *
+ *  "type_size" [ OUT ] - bit size of a type
+ *
+ *  "type_id" [ IN ] - numerical index of a type
+ *
+ *  "all_elements" [ IN ] - for multi-dimesional types
+ *  return the sum of sizes, otherwise - only for a single element
+ */
+SRA_EXTERN rc_t CC VDatatypesSizeofTypeid ( const VDatatypes *self,
+    bitsz_t *type_size, uint32_t type_id, bool all_elements );
+
+
+/* MakeTypedecl
+ *  convert a VTypedecl into canonical text
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated type declaration string
+ *
+ *  "typedecl" [ IN ] - binary representation of typedecl
+ */
+SRA_EXTERN rc_t CC VDatatypesMakeTypedecl ( const VDatatypes *self,
+    char *buffer, size_t bsize, struct VTypedecl const *typedecl );
+
+
+/* ToSupertype
+ *  cast a typedecl to a size-equivalent supertype decl
+ *  returns not-found and leaves "typedecl" unchanged
+ *  if no supertype exists
+ *
+ *  "typedecl" [ IN, OUT ] - populated with a correct
+ *  type id and vector dimension on input, will be updated
+ *  to contain a supertype and equivalent dimension on
+ *  output. e.g.:
+ *
+ *    IN -  { type_id NCBI:qual4, dim 1 }
+ *    OUT - { type_id I8, dim 4 }
+ */
+SRA_EXTERN rc_t CC VDatatypesToSupertype ( const VDatatypes *self, struct VTypedecl *typedecl );
+
+
+/* ToIntrinsic
+ *  cast a typedecl ( if necessary ) to a size-equivalent
+ *  intrinsic typedecl.
+ *
+ *  returns not-found and leaves "typedecl" unchanged
+ *  if no intrinsic supertype exists
+ *
+ *  leaves "typedecl" unchanged if it is already intrinsic.
+ *
+ *  "typedecl" [ IN, OUT ] - populated with a correct
+ *  type id and vector dimension on input, will be updated
+ *  to contain a supertype and equivalent dimension on
+ *  output. e.g.:
+ *
+ *    IN -  { type_id NCBI:qual4, dim 1 }
+ *    OUT - { type_id I8, dim 4 }
+ */
+SRA_EXTERN rc_t CC VDatatypesToIntrinsic ( const VDatatypes *self, struct VTypedecl *typedecl );
+
+
+/* ToAncestor
+ *  cast a typedecl to a size-equivalent ancestor decl
+ *  returns true if cast can be performed
+ */
+SRA_EXTERN bool CC VDatatypesToAncestor ( const VDatatypes *self,
+    struct VTypedecl const *to, struct VTypedecl const *from );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_sra_types_ */
diff --git a/interfaces/sra/wsradb.h b/interfaces/sra/wsradb.h
new file mode 100644
index 0000000..70baa6b
--- /dev/null
+++ b/interfaces/sra/wsradb.h
@@ -0,0 +1,242 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_wsradb_
+#define _h_sra_wsradb_
+
+#ifndef _h_sra_extern_
+#include <sra/extern.h>
+#endif
+
+#ifndef _h_sra_sradb_
+#include <sra/sradb.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VSchema;
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * SRAMgr
+ *  opaque handle to SRA library
+ */
+
+
+/* MakeUpdate
+ *  create library handle for read/write access
+ *
+ *  "wd" [ IN, NULL OKAY ] - optional working directory for
+ *  accessing the file system. mgr will attach its own reference.
+ *
+ *  NB - not implemented in read-only library,
+ *  and the read-only library may not be mixed with read/write
+ */
+SRA_EXTERN rc_t CC SRAMgrMakeUpdate ( SRAMgr **mgr, struct KDirectory *wd );
+
+
+/* SetMD5Mode
+ *  sets default MD5 file mode for all objects
+ *  opened for update under manager
+ */
+SRA_EXTERN rc_t CC SRAMgrSetMD5Mode ( SRAMgr *self, bool useMD5 );
+
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+SRA_EXTERN rc_t CC SRAMgrLock ( SRAMgr *self, const char *path, ... );
+SRA_EXTERN rc_t CC SRAMgrVLock ( SRAMgr *self, const char *path, va_list args );
+
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+SRA_EXTERN rc_t CC SRAMgrUnlock ( SRAMgr *self, const char *path, ... );
+SRA_EXTERN rc_t CC SRAMgrVUnlock ( SRAMgr *self, const char *path, va_list args );
+
+
+/* DropTable
+ *  drop an existing table
+ *
+ *  "force" [ IN ] - if true, make every attempt to remove table
+ *
+ *  "path" [ IN ]  - NUL terminated table name
+ */
+ SRA_EXTERN rc_t CC SRAMgrDropTable ( SRAMgr *self, bool force, const char *path, ... );
+ SRA_EXTERN rc_t CC SRAMgrVDropTable ( SRAMgr *self, bool force, const char *path, va_list args );
+
+
+/*--------------------------------------------------------------------------
+ * SRATable
+ *  a collection of spots with several data series, minimally including
+ *  base or color calls and their quality ( confidence ) values, and
+ *  optionally signal-related values ( signal, intensity, noise, ... ).
+ */
+
+/* Create
+ *  creates a new table
+ *
+ *  "tbl" [ OUT ] - return parameter for table
+ *
+ *  "typespec" [ IN ] - type and optionally version of table schema,
+ *  e.g. 'MY_NAMESPACE:MyTable' or 'MY_NAMESPACE:MyTable#1.1'
+ *
+ *  "path" [ IN ] - NUL terminated table name
+ */
+SRA_EXTERN rc_t CC SRAMgrCreateTable ( SRAMgr *self, SRATable **tbl,
+    const char *typespec, const char *path, ... );
+SRA_EXTERN rc_t CC SRAMgrVCreateTable ( SRAMgr *self, SRATable **tbl,
+    const char *typespec, const char *path, va_list args );
+
+
+/* OpenUpdate
+ *  open an existing table
+ *
+ *  "run" [ OUT ] - return parameter for table
+ *
+ *  "path" [ IN ] - NUL terminated table name
+ */
+SRA_EXTERN rc_t CC SRAMgrOpenTableUpdate ( SRAMgr *self,
+    SRATable **tbl, const char *path, ... );
+SRA_EXTERN rc_t CC SRAMgrVOpenTableUpdate ( SRAMgr *self,
+    SRATable **tbl, const char *path, va_list args );
+
+
+/* NewSpot
+ *  creates a new spot record, returns spot id.
+ *
+ *  "id" [ OUT ] - return parameter for id of newly created spot
+ */
+SRA_EXTERN rc_t CC SRATableNewSpot ( SRATable *self, spotid_t *id );
+
+
+/* OpenSpot
+ *  opens an existing spot record from id
+ *
+ *  "id" [ IN ] - 1-based spot id
+ */
+SRA_EXTERN rc_t CC SRATableOpenSpot ( SRATable *self, spotid_t id );
+
+
+/* CloseSpot
+ *  closes a spot opened with either NewSpot or OpenSpot
+ */
+SRA_EXTERN rc_t CC SRATableCloseSpot ( SRATable *self );
+
+
+/* Commit
+ *  commit all changes
+ */
+SRA_EXTERN rc_t CC SRATableCommit ( SRATable *self );
+
+
+/* OpenColumnWrite
+ *  open a column for write
+ *
+ *  "idx" [ OUT ] - return parameter for 1-based column index.
+ *
+ *  "col" [ OUT, NULL OKAY ] - optional return parameter for
+ *  newly opened column.
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving column name
+ *
+ *  "datatype" [ IN ] - NUL terminated string in ASCII
+ *   describing fully qualified column data type
+ */
+SRA_EXTERN rc_t CC SRATableOpenColumnWrite ( SRATable *self, uint32_t *idx,
+    SRAColumn **col, const char *name, const char *datatype );
+
+
+/* SetIdxColumnDefault
+ *  give a default value for column
+ *
+ *  if no value gets written to a column within an open spot,
+ *  this value is substituted.
+ *
+ *  "idx" [ IN ] - 1-based column index
+ *
+ *  "base" [ IN ] and "offset" [ IN ] - pointer and bit offset
+ *  to start of row data
+ *
+ *  "size" [ IN ] - size in bits of row data
+ */
+SRA_EXTERN rc_t CC SRATableSetIdxColumnDefault ( SRATable *self, uint32_t idx,
+    const void *base, bitsz_t offset, bitsz_t size );
+
+
+/* WriteIdxColumn
+ *  write row data to an indexed column
+ *
+ *  "idx" [ IN ] - 1-based column index
+ *
+ *  "base" [ IN ] and "offset" [ IN ] - pointer and bit offset
+ *  to start of row data
+ *
+ *  "size" [ IN ] - size in bits of row data
+ */
+SRA_EXTERN rc_t CC SRATableWriteIdxColumn ( SRATable *self, uint32_t idx,
+    const void *base, bitsz_t offset, bitsz_t size );
+
+
+/* MetaFreeze
+ *  freezes current metadata revision
+ *  further modification will begin on a copy
+ */
+SRA_EXTERN rc_t CC SRATableMetaFreeze ( SRATable *self );
+
+
+/* OpenMDataNode
+ *  open a metadata node
+ */
+SRA_EXTERN rc_t CC SRATableOpenMDataNodeUpdate ( SRATable *self,
+    struct KMDataNode **node, const char *path, ... );
+SRA_EXTERN rc_t CC SRATableVOpenMDataNodeUpdate ( SRATable *self,
+    struct KMDataNode **node, const char *path, va_list args );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_wsradb_ */
diff --git a/interfaces/sra/wsradb.hpp b/interfaces/sra/wsradb.hpp
new file mode 100644
index 0000000..cd69111
--- /dev/null
+++ b/interfaces/sra/wsradb.hpp
@@ -0,0 +1,591 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_sra_wsradb_
+#define _hpp_sra_wsradb_
+
+#ifdef _hpp_sra_sradb_
+#error "read and update libraries are mutually exclusive"
+#endif
+
+#ifndef _h_sra_wsradb_
+#include <sra/wsradb.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SRAMgr
+ *  opaque handle to SRA library
+ */
+struct SRAMgr
+{
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const throw()
+    { return SRAMgrAddRef ( this ); }
+
+    inline rc_t Release () const throw()
+    { return SRAMgrRelease ( this ); }
+
+
+    /* Make
+     *  create library handle for read/write access
+     *
+     *  NB - not implemented in read-only library,
+     *  and the read-only library may not be mixed with read/write
+     */
+    static inline rc_t Make ( SRAMgr **mgr, struct KDirectory *wd = 0 )  throw()
+    { return SRAMgrMakeUpdate ( mgr, wd ); }
+
+
+
+    /* SetMD5Mode
+     *  sets default MD5 file mode for all objects
+     *  opened for update under manager
+     */
+    inline rc_t SetMD5Mode ( bool useMD5 )  throw()
+    { return SRAMgrSetMD5Mode ( this, useMD5 ); }
+
+
+    /* Lock
+     *  apply lock
+     *
+     *  if table is already locked, the operation is idempotent
+     *  and returns an rc state of rcLocked
+     *
+     *  "path" [ IN ] - NUL terminated table path
+     */
+    inline rc_t Lock ( const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = SRAMgrVLock ( this, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t Lock ( const char *path, va_list args ) throw()
+    { return SRAMgrVLock ( this, path, args ); }
+
+
+    /* Unlock
+     *  remove lock
+     *
+     *  if table is already unlocked, the operation is idempotent
+     *  and returns an rc state of rcUnlocked
+     *
+     *  "path" [ IN ] - NUL terminated table path
+     */
+    inline rc_t SRAMgrUnlock ( SRAMgr *self, const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = SRAMgrVUnlock ( this, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t SRAMgrUnlock ( SRAMgr *self, const char *path, 
+        va_list args ) throw()
+    { return SRAMgrVUnlock ( this, path, args ); }
+
+
+    /* DropTable
+     *  drop an existing table
+     *
+     *  "force" [ IN ] - if true, make every attempt to remove table
+     *
+     *  "path" [ IN ]  - NUL terminated table name
+     */
+    inline rc_t DropTable ( bool force, const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = SRAMgrVDropTable ( this, force, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t DropTable ( bool force, const char *path, va_list args ) throw()
+    { return SRAMgrVDropTable ( this, force, path, args ); }
+
+
+    /* OpenDatatypes
+     *  open datatype registry object for requested access
+     *  see <vdb/types.hpp> for VDatatypes
+     *
+     *  "dt" [ OUT ] - return parameter for datatypes object
+     */
+    inline rc_t OpenDatatypes ( struct VDatatypes const **dt ) const throw()
+    { return SRAMgrOpenDatatypesRead ( this, dt ); }
+
+
+    /* GetSchema
+     *  get a reference to the schema used to create new tables
+     *
+     *  "schema" [ OUT ] - return parameter for reference to SRA schema
+     *
+     * NB - returns a new reference that must be released via VSchemaRelease
+     */
+    inline rc_t GetSchemaRead ( struct VSchema const **schema ) const throw()
+    { return SRAMgrGetSchemaRead ( this, schema ); }
+
+
+    /* UseSchema
+     *  allows SRA schema to be entirely replaced
+     *  affects creation/update of all subsequent tables
+     *
+     *  "schema" [ IN ] - new schema to be applied
+     *
+     * NB - manager will attach a new reference to schema object,
+     *  you are still responsible for releasing it via VSchemaRelease
+     */
+    inline rc_t UseSchemaRead ( struct VSchema const *schema ) const throw()
+    { return SRAMgrUseSchemaRead ( this, schema ); }
+
+
+    /* Writable
+     *  returns 0 if table is writable
+     *  rcLocked if locked, rcReadonly if read-only
+     *  other code upon error
+     *
+     *  "path" [ IN ] - NUL terminated table path
+     */
+    inline bool Writable ( const char *path, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        bool locked = SRAMgrVWritable ( this, path, args );
+        va_end ( args );
+        return locked;
+    }
+    inline bool Writable ( const char *path, va_list args ) const throw()
+    { return SRAMgrVWritable ( this, path, args ); }
+
+    /* Create
+     *  creates a new table
+     *
+     *  "tbl" [ OUT ] - return parameter for table
+     *
+     *  "typespec" [ IN ] - type and optionally version of table schema,
+     *  e.g. 'MY_NAMESPACE:MyTable' or 'MY_NAMESPACE:MyTable#1.1'
+     *
+     *  "path" [ IN ] - NUL terminated table name
+     */
+    inline rc_t CreateTable ( SRATable **tbl, const char *typespec,
+        const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = SRAMgrVCreateTable ( this, tbl, typespec, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t CreateTable ( SRATable **tbl, const char *typespec,
+        const char *path, va_list args ) throw()
+    { return SRAMgrVCreateTable ( this, tbl, typespec, path, args ); }
+
+
+    /* OpenTable
+     *  open an existing table for read
+     *
+     *  "tbl" [ OUT ] - return parameter for table
+     *
+     *  "path" [ IN ] - NUL terminated run name
+     */
+    inline rc_t OpenTable ( const SRATable **tbl,
+        const char *path, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = SRAMgrVOpenTableRead ( this, tbl, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenTable ( const SRATable **tbl, const char *path,
+        va_list args ) const throw()
+    { return SRAMgrVOpenTableRead ( this, tbl, path, args ); }
+
+
+    inline rc_t OpenTable ( SRATable **tbl, const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = SRAMgrVOpenTableUpdate ( this, tbl, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenTable ( SRATable **tbl, const char *path, va_list args ) throw()
+    { return SRAMgrVOpenTableUpdate ( this, tbl, path, args ); }
+
+
+private:
+    SRAMgr ();
+    ~ SRAMgr ();
+    SRAMgr ( const SRAMgr& );
+    SRAMgr &operator = ( const SRAMgr& );
+};
+
+
+/*--------------------------------------------------------------------------
+ * SRATable
+ *  a collection of spots with several data series, minimally including
+ *  base or color calls and their quality ( confidence ) values, and
+ *  optionally signal-related values ( signal, intensity, noise, ... ).
+ */
+struct SRATable
+{
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const throw()
+    { return SRATableAddRef ( this ); }
+
+    inline rc_t Release () const throw()
+    { return SRATableRelease ( this ); }
+
+
+    /* Locked
+     *  returns true if locked
+     */
+    inline bool Locked () const throw()
+    { return SRATableLocked ( this ); }
+
+
+    /* BaseCount
+     *  get the number of stored bases
+     *
+     *  "num_bases" [ OUT ] - return parameter for base count
+     */
+    inline rc_t BaseCount ( uint64_t *num_bases ) const throw()
+    { return SRATableBaseCount ( this, num_bases ); }
+
+
+    /* SpotCount
+     *  get the number of stored spots
+     *
+     *  "spot_count" [ OUT ] - return parameter for spot count
+     */
+    inline rc_t SpotCount ( uint64_t *spot_count ) const throw()
+    { return SRATableSpotCount ( this, spot_count ); }
+
+
+    /* MaxSpotId
+     *  returns the maximum spot id
+     *
+     *  a table will contain a collection of spots with ids from
+     *  min to max ( spot_id ).
+     *
+     *  "id" [ OUT ] - return parameter of last spot id
+     */
+    inline rc_t MaxSpotId ( spotid_t *id ) const throw()
+    { return SRATableMaxSpotId ( this, id ); }
+
+    /* MinSpotId
+     *  returns the minimum spot id
+     *
+     *  a table will contain a collection of spots with ids from
+     *  min to max ( spot_id ).
+     *
+     *  "id" [ OUT ] - return parameter of last spot id
+     */
+    inline rc_t MinSpotId ( spotid_t *id ) const throw()
+    { return SRATableMinSpotId ( this, id ); }
+
+    /* GetSpotId
+     *  project a spot id from a spot name
+     *
+     *  "id" [ OUT ] - return parameter for 1-based spot id
+     *
+     *  "spot_name" [ IN ] - external spot name string
+     */
+    inline rc_t GetSpotId ( spotid_t *id, const char *spot_name ) const throw()
+    { return SRATableGetSpotId ( this, id, spot_name ); }
+
+
+    /* NewSpot
+     *  creates a new spot record, returning spot id.
+     *
+     *  "id" [ OUT ] - return parameter for id of newly created spot
+     */
+    inline rc_t NewSpot ( spotid_t *id ) throw()
+    { return SRATableNewSpot ( this, id ); }
+
+
+    /* OpenSpot
+     *  opens an existing spot record from id
+     *
+     *  "id" [ IN ] - 1-based spot id
+     */
+    inline rc_t OpenSpot ( spotid_t id ) throw()
+    { return SRATableOpenSpot ( this, id ); }
+
+
+    /* CloseSpot
+     *  closes a spot opened with either NewSpot or OpenSpot
+     */
+    inline rc_t CloseSpot () throw()
+    { return SRATableCloseSpot ( this ); }
+
+
+    /* Commit
+     *  commit all changes
+     */
+    inline rc_t Commit () throw()
+    { return SRATableCommit ( this ); }
+
+
+    /* ListCol
+     *  returns a list of column names
+     *
+     *  "names" [ out ] - return parameter for names list
+     */
+    inline rc_t ListCol ( SRANamelist **names ) const throw()
+    { return SRATableListCol ( this, names ); }
+
+
+    /* ColDatatypes
+     *  returns list of typedecls for named column
+     *
+     *  "col" [ IN ] - column name
+     *
+     *  "dflt_idx" [ OUT, NULL OKAY ] - returns the zero-based index
+     *  into "typedecls" of the default datatype for the named column
+     *
+     *  "typedecls" [ OUT ] - list of datatypes available for named column
+     */
+    inline rc_t ColDatatypes ( const char *col,
+        uint32_t *dflt_idx, SRANamelist **typedecls ) const throw()
+    { return SRATableColDatatypes ( this, col, dflt_idx, typedecls ); }
+
+
+    /* OpenColumn
+     *  open a column for read
+     *
+     *  "col" [ OUT ] - return parameter for newly opened column
+     *
+     *  "name" [ IN ] - NUL terminated string in UTF-8 giving column name
+     *
+     *  "datatype" [ IN - NULL OKAY ] - optional NUL terminated
+     *   string describing fully qualified column data type in ASCII
+     */
+    inline rc_t OpenColumn ( const SRAColumn **col,
+        const char *name, const char *datatype = 0 ) const throw()
+    { return SRATableOpenColumnRead ( this, col, name, datatype ); }
+
+
+    /* OpenColumn
+     *  open a column for write
+     *
+     *  "idx" [ OUT ] - return parameter for 1-based column index.
+     *
+     *  "col" [ OUT, NULL OKAY ] - optional return parameter for
+     *  newly opened column.
+     *
+     *  "name" [ IN ] - NUL terminated string in UTF-8 giving column name
+     *
+     *  "datatype" [ IN ] - NUL terminated string in ASCII
+     *   describing fully qualified column data type
+     */
+    inline rc_t OpenColumn ( uint32_t *idx, SRAColumn **col,
+        const char *name, const char *datatype ) throw()
+    { return SRATableOpenColumnWrite ( this, idx, col, name, datatype ); }
+
+
+    /* SetIdxColumnDefault
+     *  give a default value for column
+     *
+     *  if no value gets written to a column within an open spot,
+     *  this value is substituted.
+     *
+     *  "idx" [ IN ] - 1-based column index
+     *
+     *  "base" [ IN ] and "offset" [ IN ] - pointer and bit offset
+     *  to start of row data
+     *
+     *  "size" [ IN ] - size in bits of row data
+     */
+    inline rc_t SetIdxColumnDefault ( uint32_t idx,
+        const void *base, bitsz_t offset, bitsz_t size ) throw()
+    { return SRATableSetIdxColumnDefault ( this, idx, base, offset, size ); }
+
+
+    /* WriteIdxColumn
+     *  write row data to an indexed column
+     *
+     *  "idx" [ IN ] - 1-based column index
+     *
+     *  "base" [ IN ] and "offset" [ IN ] - pointer and bit offset
+     *  to start of row data
+     *
+     *  "size" [ IN ] - size in bits of row data
+     */
+    inline rc_t WriteIdxColumn ( uint32_t idx,
+        const void *base, bitsz_t offset, bitsz_t size ) throw()
+    { return SRATableWriteIdxColumn ( this, idx, base, offset, size ); }
+
+
+    /* MetaRevision
+     *  returns current revision number
+     *  where 0 ( zero ) means tip
+     */
+    inline rc_t MetaRevision ( uint32_t *revision ) const throw()
+    { return SRATableMetaRevision ( this, revision ); }
+
+
+    /* MaxRevision
+     *  returns the maximum revision available
+     */
+    inline rc_t MaxMetaRevision ( uint32_t *revision ) const throw()
+    { return SRATableMaxMetaRevision ( this, revision ); }
+
+
+    /* UseMetaRevision
+     *  opens indicated revision of metadata
+     *  all non-zero revisions are read-only
+     */
+    inline rc_t UseMetaRevision ( uint32_t revision ) const throw()
+    { return SRATableUseMetaRevision ( this, revision ); }
+
+
+    /* MetaFreeze
+     *  freezes current metadata revision
+     *  further modification will begin on a copy
+     */
+    inline rc_t MetaFreeze () throw()
+    { return SRATableMetaFreeze ( this ); }
+
+
+    /* OpenMDataNode
+     *  open a metadata node
+     *
+     *  "node" [ OUT ] - return parameter for metadata node
+     *
+     *  "path" [ IN ] - simple or hierarchical NUL terminated
+     *  path to node
+     */
+    inline rc_t OpenMDataNode ( struct KMDataNode const **node,
+        const char *path, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = SRATableVOpenMDataNodeRead ( this, node, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenMDataNode ( struct KMDataNode const **node,
+        const char *path, va_list args ) const throw()
+    { return SRATableVOpenMDataNodeRead ( this, node, path, args ); }
+
+    inline rc_t OpenMDataNode ( struct KMDataNode **node,
+        const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = SRATableVOpenMDataNodeUpdate ( this, node, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenMDataNode ( struct KMDataNode **node,
+        const char *path, va_list args ) throw()
+    { return SRATableVOpenMDataNodeUpdate ( this, node, path, args ); }
+
+
+private:
+    SRATable ();
+    ~ SRATable ();
+    SRATable ( const SRATable& );
+    SRATable &operator = ( const SRATable& );
+};
+
+
+/*--------------------------------------------------------------------------
+ * SRAColumn
+ *  represents a spot data column, where the column is configured as
+ *  a sequence of blobs, and each blob is a sequence of records,
+ *  indexed by spot id.
+ */
+struct SRAColumn
+{
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const throw()
+    { return SRAColumnAddRef ( this ); }
+
+    inline rc_t Release () const throw()
+    { return SRAColumnRelease ( this ); }
+
+
+    /* Datatype
+     *  access data type
+     *
+     *  "type" [ OUT, NULL OKAY ] - returns the column type declaration
+     *
+     *  "def" [ OUT, NULL OKAY ] - returns the definition of the type
+     *  returned in "type_decl"
+     *
+     * NB - one of "type" and "def" must be non-NULL
+     */
+    inline int Datatype ( struct VTypedecl *type,
+        struct VTypedef *def ) const throw()
+    { return SRAColumnDatatype ( this, type, def ); }
+
+
+    /* GetRange
+     *  get a contiguous range around a spot id, e.g. tile for Illumina
+     *
+     *  "id" [ IN ] - return parameter for 1-based spot id
+     *
+     *  "first" [ OUT, NULL OKAY ] and "last" [ OUT, NULL OKAY ] -
+     *  id range is returned in these output parameters, where
+     *  at least ONE must be NOT-NULL
+     */
+    inline rc_t GetRange ( spotid_t id, spotid_t *first,
+        spotid_t *last ) const throw()
+    { return SRAColumnGetRange ( this, id, first, last ); }
+
+
+    /* Read
+     *  read row data
+     *
+     *  "id" [ IN ] - spot row id between 1 and max ( spot id )
+     *
+     *  "base" [ OUT ] and "offset" [ OUT ] - pointer and bit offset
+     *  to start of spot row data.
+     *
+     *  "size" [ OUT ] - size in bits of row data
+     */
+    inline rc_t Read ( spotid_t id,
+        const void **base, bitsz_t *offset, bitsz_t *size ) const throw()
+    { return SRAColumnRead ( this, id, base, offset, size ); }
+
+private:
+    SRAColumn ();
+    ~ SRAColumn ();
+    SRAColumn ( const SRAColumn& );
+    SRAColumn &operator = ( const SRAColumn& );
+};
+
+#endif // _hpp_sra_sradb_
diff --git a/interfaces/svdb/extern.h b/interfaces/svdb/extern.h
new file mode 100644
index 0000000..6a8b940
--- /dev/null
+++ b/interfaces/svdb/extern.h
@@ -0,0 +1,47 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_svdb_extern_
+#define _h_svdb_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define SVDB_EXTERN MOD_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define SVDB_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#if defined _MSC_VER && ! defined _STATIC
+#define MOD_EXPORT __declspec ( dllexport )
+#else
+#define MOD_EXPORT
+#endif
+
+#endif /* _h_svdb_extern_ */
diff --git a/interfaces/svdb/svdb.h b/interfaces/svdb/svdb.h
new file mode 100644
index 0000000..3f12d2e
--- /dev/null
+++ b/interfaces/svdb/svdb.h
@@ -0,0 +1,531 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_svdb_
+#define _h_svdb_
+
+#ifndef _h_svdb_extern_
+#include <svdb/extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ALL_COLUMNS 0
+#define STATIC_COLUMNS 1
+#define NON_STATIC_COLUMNS 2
+#define VISIBLE_COLUMNS 3
+#define NON_VISIBLE_COLUMNS 4
+
+/*****************************************************************************
+    (1)
+    translate an accession into a path ( if possible )
+
+    returns:    NULL, if accession is not an accession
+                path, if the accession is an accession
+
+    ! path has to be free'd by caller !
+*/
+SVDB_EXTERN const char * CC svdb_accession_2_path( const char * accession );
+
+
+/*****************************************************************************
+    (2)
+    opens a vdb-object by path ( an accession has to be translated into a path )
+
+    returns:    NULL,   if path cannot be opened
+                handle, if the path can be opened ( as db or as table )
+
+    ! handle has to be closed by caller with svdb_close() !
+*/
+SVDB_EXTERN void * CC svdb_open_path( const char * path );
+
+
+/*****************************************************************************
+    (3)
+    closes an open vdb-object
+
+    ! NULL ptr will be ignored !
+*/
+SVDB_EXTERN void CC svdb_close( void * self );
+
+
+/*****************************************************************************
+    (4)
+    returns the last error as plain-text if one occured
+
+    ! NULL ptr will be ignored !
+    returns empty string if no error occured or self == NULL
+*/
+SVDB_EXTERN const char * CC svdb_last_err( void );
+
+
+/*****************************************************************************
+    (5)
+    returns if the svdb-object is a database
+
+    ! NULL ptr will be ignored !
+*/
+SVDB_EXTERN int CC svdb_is_db( void * self );
+
+
+/*****************************************************************************
+    (6)
+    returns how many tables are if the svdb-object
+
+    ! NULL ptr will be ignored !
+*/
+SVDB_EXTERN int CC svdb_count_tabs( void * self );
+
+
+/*****************************************************************************
+    (7)
+    returns the name of a table, indexed by tab_id
+
+    ! NULL ptr in self will be ignored !
+    ! returns NULL if tab_id is out of bounds !
+*/
+SVDB_EXTERN const char * CC svdb_tabname( void * self, const int tab_id );
+
+
+/*****************************************************************************
+    (8)
+    returns the index of a table, found by name-lookup
+
+    ! NULL ptr in self will be ignored !
+    ! returns -1 if the given name is not in the svdb-object !
+*/
+SVDB_EXTERN int CC svdb_tab_idx( void * self, const char * name );
+
+
+/*****************************************************************************
+    (9)
+    returns how many columns a table has
+
+    ! NULL ptr in self will be ignored !
+    ! returns 0 if tab_id is out of bounds !
+*/
+SVDB_EXTERN int CC svdb_count_cols( void * self, const int tab_id,
+            const int selection );
+
+
+/*****************************************************************************
+    (10)
+    returns the name of a column in a table
+
+    ! NULL ptr in self will be ignored !
+    ! returns NULL if tab_id/col_id is out of bounds !
+*/
+SVDB_EXTERN const char * CC svdb_colname( void * self, const int tab_id,
+            const int selection, const int col_id );
+
+
+/*****************************************************************************
+    (11)
+    returns the index of a column in a table, found by name-lookup
+
+    ! NULL ptr in self will be ignored !
+    ! returns -1 if tab_id is out of bounds !
+    ! returns -1 if the given name is not in the svdb-object !
+*/
+SVDB_EXTERN int CC svdb_col_idx( void * self, const int tab_id,
+            const int selection, const char * name );
+
+
+/*****************************************************************************
+    (12)
+    changes the visibility of a column
+
+    ! NULL ptr in self will be ignored !
+    ! returns 0 if tab_id or col_id is out of bounds !
+    ! returns 1 if suceessful !
+*/
+SVDB_EXTERN int CC svdb_set_column_visibility( void * self, const int tab_id,
+            const int selection, const int col_id, const int visible );
+
+
+/*****************************************************************************
+    (13)
+    returns the index of the default-type of a column in a table
+
+    ! NULL ptr in self will be ignored !
+    ! returns -1 if tab_id/col_id is out of bounds !
+*/
+SVDB_EXTERN int CC svdb_dflt_type_idx( void * self, const int tab_id,
+            const int selection, const int col_id );
+
+
+/*****************************************************************************
+    (14)
+    returns how many types a column in a table has
+
+    ! NULL ptr in self will be ignored !
+    ! returns 0 if tab_id/col_id is out of bounds !
+*/
+SVDB_EXTERN int CC svdb_count_types( void * self, const int tab_id,
+            const int selection, const int col_id );
+
+
+/*****************************************************************************
+    (15)
+    returns the name of the type of a column in a table
+
+    ! NULL ptr in self will be ignored !
+    ! returns NULL if tab_id/col_id/type_id is out of bounds !
+*/
+SVDB_EXTERN const char * CC svdb_typename( void * self, const int tab_id,
+            const int selection, const int col_id, const int type_id );
+
+
+/*****************************************************************************
+    (16)
+    returns the index of a type in a column/table, found by name-lookup
+
+    ! NULL ptr in self will be ignored !
+    ! returns -1 if tab_id/col_id is out of bounds !
+    ! returns -1 if the given type is not a type of this column !
+*/
+SVDB_EXTERN int CC svdb_type_idx( void * self, const int tab_id,
+            const int selection, const int col_id, const char * name );
+
+
+/*****************************************************************************
+    (17)
+    returns the domain-id of a type of a column in a table
+
+    ! NULL ptr in self will be ignored !
+    ! returns -1 if tab_id/col_id/type_id is out of bounds !
+*/
+SVDB_EXTERN int CC svdb_typedomain( void * self, const int tab_id,
+            const int selection, const int col_id, const int type_id );
+
+
+/*****************************************************************************
+    (18)
+    returns the bitsize of a type of a column in a table
+
+    ! NULL ptr in self will be ignored !
+    ! returns -1 if tab_id/col_id/type_id is out of bounds !
+*/
+SVDB_EXTERN int CC svdb_typebits( void * self, const int tab_id,
+            const int selection, const int col_id, const int type_id );
+
+
+/*****************************************************************************
+    (19)
+    returns the dimensionality of a type of a column in a table
+
+    ! NULL ptr in self will be ignored !
+    ! returns -1 if tab_id/col_id/type_id is out of bounds !
+*/
+SVDB_EXTERN int CC svdb_typedim( void * self, const int tab_id,
+            const int selection, const int col_id, const int type_id );
+
+
+/*****************************************************************************
+    (20)
+    opens a table of a svdb-object
+
+    ! NULL ptr in self will be ignored !
+    ! returns -1 if tab_id is out of bounds !
+    NULL or empty string as defline opens all readable columns without a cast
+    defline = "READ,QUALITY" opens only these 2 columns (if the table has them)
+    defline = "(INSDC:2na:bin)READ" opens columns with a cast
+*/
+SVDB_EXTERN int CC svdb_open_table( void * self, const int tab_id,
+            const char *defline );
+
+
+/*****************************************************************************
+    (21)
+    returns the length of the longest column-name that is enabled
+
+    ! NULL ptr in self will be ignored !
+    ! returns 0 if tab_id is out of bounds !
+*/
+SVDB_EXTERN int CC svdb_max_colname_length( void * self, const int tab_id,
+            const int selection );
+
+
+/*****************************************************************************
+    (22)
+    sets the element-separator-string
+
+    ! NULL ptr in self will be ignored !
+    tab_id = -1 ... for all tables
+    col_id = -1 ... for all columns
+    s      = separator-string to set
+*/
+SVDB_EXTERN void CC svdb_set_elem_separator( void * self, const int tab_id,
+            const int selection, const int col_id, const char * s );
+
+
+/*****************************************************************************
+    (23)
+    sets the dimension-separator-string
+
+    ! NULL ptr in self will be ignored !
+    tab_id = -1 ... for all tables
+    col_id = -1 ... for all columns
+    s      = separator-string to set
+*/
+SVDB_EXTERN void CC svdb_set_dim_separator( void * self, const int tab_id,
+            const int selection, const int col_id, const char * s );
+
+
+/*****************************************************************************
+    (24)
+    returns if a column is enabled...
+
+    ! NULL ptr in self will be ignored !
+*/
+SVDB_EXTERN int CC svdb_is_enabled( void * self, const int tab_id,
+            const int selection, const int col_id );
+
+
+/*****************************************************************************
+    (25)
+    returns how many rows a table has
+
+    ! NULL ptr in self will be ignored !
+    ! returns 0 if tab_id is out of bounds !
+*/
+SVDB_EXTERN unsigned long long int CC svdb_row_range( void * self,
+            const int tab_id );
+
+
+/*****************************************************************************
+    (26)
+    returns the offset of the first row ( offset to zero )
+
+    ! NULL ptr in self will be ignored !
+    ! returns 0 if tab_id is out of bounds !
+*/
+SVDB_EXTERN signed long long int CC svdb_first_row( void * self,
+            const int tab_id );
+
+
+/*****************************************************************************
+    (27)
+    returns a data-cell as text
+
+    ! NULL ptr in self/buf will be ignored !
+    ! returns 0 if tab_id, col_id, row is out of bounds !
+    returns the numbers of characters written into buf, if successful
+*/
+SVDB_EXTERN int CC svdb_cell( void * self, char * buf, int buflen,
+            const int tab_id, const int selection, const int col_id,
+            const unsigned long long int row );
+
+
+/*****************************************************************************
+    (28/29)
+    returns the row-number of the row where the pattern was found in col
+
+    ! NULL ptr in self/pattern will be ignored !
+    ! returns 0xFFFFFFFFFFFFFFFF if tab_id, col_id, row is out of bounds !
+    ! returns 0xFFFFFFFFFFFFFFFF if pattern not found... !
+*/
+SVDB_EXTERN unsigned long long int CC svdb_find_fwd( void * self, const int tab_id,
+            const int selection, const int col_id, const unsigned long long int row,
+            const int chunksize, const char * pattern );
+SVDB_EXTERN unsigned long long int CC svdb_find_bwd( void * self, const int tab_id,
+            const int selection, const int col_id, const unsigned long long int row,
+            const int chunksize, const char * pattern );
+
+
+/*****************************************************************************
+    (30)
+    returns a the id of the meta-root-node of a table
+
+    ! NULL ptr in self will be ignored !
+    ! returns -1 if tab_id is out of bounds, or no metadata found !
+*/
+SVDB_EXTERN int CC svdb_tab_meta_root( void * self, const int tab_id );
+
+
+/*****************************************************************************
+    (31)
+    returns the name of a meta-node
+
+    ! NULL ptr in self/buf will be ignored !
+    ! returns 0 if tab_id, meta_id is out of bounds !
+    returns the numbers of characters written into buf, if successful
+*/
+SVDB_EXTERN int CC svdb_tab_meta_name( void * self, const int tab_id,
+            const int meta_id, char * buf, int buflen );
+
+
+/*****************************************************************************
+    (32)
+    returns the length of the value of a meta-node ( in bytes )
+
+    ! NULL ptr in self will be ignored !
+    ! returns 0 if tab_id, meta_id is out of bounds !
+*/
+SVDB_EXTERN int CC svdb_tab_meta_value_len( void * self, const int tab_id,
+            const int meta_id );
+
+
+/*****************************************************************************
+    (33)
+    returns if the meta-value contains only printable chars
+
+    ! NULL ptr in self will be ignored !
+    ! returns 0 if tab_id, meta_id is out of bounds !
+*/
+SVDB_EXTERN int CC svdb_tab_meta_value_printable( void * self,
+            const int tab_id, const int meta_id );
+
+
+/*****************************************************************************
+    (34)
+    returns a ptr to the meta-node-value
+
+    ! NULL ptr in self will be ignored !
+    ! returns 0 if tab_id, meta_id is out of bounds !
+*/
+SVDB_EXTERN const char * CC svdb_tab_meta_value_ptr( void * self, const int tab_id,
+                                              const int meta_id );
+
+
+/*****************************************************************************
+    (35)
+    returns the value of a meta-node as ascii-text (this is a guess)
+
+    ! NULL ptr in self/buf will be ignored !
+    ! returns 0 if tab_id, meta_id is out of bounds !
+    returns the numbers of characters written into buf, if successful
+*/
+SVDB_EXTERN int CC svdb_tab_meta_value( void * self, const int tab_id,
+            const int meta_id, char * buf, int buflen, int trim );
+
+
+/*****************************************************************************
+    (36)
+    returns the number of childs of a meta-node
+
+    ! NULL ptr in self will be ignored !
+    ! returns -1 if tab_id, meta_id is out of bounds !
+*/
+SVDB_EXTERN int CC svdb_tab_meta_child_count( void * self,
+            const int tab_id, const int meta_id );
+
+
+/*****************************************************************************
+    (37)
+    returns the id of a meta-node child
+
+    ! NULL ptr in self will be ignored !
+    ! returns -1 if tab_id, meta_id, child_idx is out of bounds !
+*/
+SVDB_EXTERN int CC svdb_tab_meta_child_id( void * self, const int tab_id,
+            const int meta_id, const int child_idx );
+
+
+
+
+
+/*****************************************************************************
+    (38)
+
+*/
+SVDB_EXTERN void * CC svdb_open_fastq( const char * path );
+
+
+/*****************************************************************************
+    (39)
+
+*/
+SVDB_EXTERN void CC svdb_close_fastq( void * self );
+
+
+/*****************************************************************************
+    (40)
+    returns what the fastq-obj can produce
+    0 ... nothing, handle invalid
+    1 ... only READ ( that means fasta )
+    2 ... READ and QUALITY ( but not spot splitting )
+    3 ... READ, QUALITY and READ_START/READ_LEN ( splitted spots )
+*/
+SVDB_EXTERN int CC svdb_fastq_scope( void * self );
+
+
+/*****************************************************************************
+    (41)
+    returns how many reads a fastq-row has
+*/
+SVDB_EXTERN int CC svdb_fastq_readcount( void * self, const unsigned long long int row );
+
+
+/*****************************************************************************
+    (42)
+    produces a fastq-name ( without the prefix... @/+ ) into a buffer
+    seq ... 0 the whole unsplitted spot
+    seq >   0 the read/part of the spot 1,2
+    returns the number of bytes written
+*/
+SVDB_EXTERN int CC svdb_fastq_name( void * self, char * buf, int buflen,
+                                   int seq, const unsigned long long int row );
+
+
+/*****************************************************************************
+    (43)
+    produces a fastq-sequence into a buffer
+    seq ... 0 the whole unsplitted spot
+    seq >   0 the read/part of the spot 1,2
+    returns the number of bytes written
+*/
+SVDB_EXTERN int CC svdb_fastq_sequence( void * self, char * buf, int buflen,
+                                       int seq, const unsigned long long int row );
+
+/*****************************************************************************
+    (44)
+    produces a fastq-quality into a buffer
+    seq ... 0 the whole unsplitted spot
+    seq >   0 the read/part of the spot 1,2
+    returns the number of bytes written
+*/
+SVDB_EXTERN int CC svdb_fastq_quality( void * self, char * buf, int buflen,
+                                      int seq, const unsigned long long int row );
+
+
+SVDB_EXTERN int CC svdb_fastq_rd_type_available( void * self );
+
+SVDB_EXTERN int CC svdb_fastq_rd_filter_available( void * self );
+
+SVDB_EXTERN int CC svdb_fastq_read_type_is_bio( void * self, int seq, const unsigned long long int row );
+
+SVDB_EXTERN int CC svdb_fastq_read_filter_is_pass( void * self, int seq, const unsigned long long int row );
+
+SVDB_EXTERN unsigned long long int CC svdb_fastq_row_count( void * self );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/interfaces/tui/extern.h b/interfaces/tui/extern.h
new file mode 100644
index 0000000..65b326f
--- /dev/null
+++ b/interfaces/tui/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_tui_extern_
+#define _h_tui_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define TUI_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define TUI_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_tui_extern_ */
diff --git a/interfaces/tui/tui.h b/interfaces/tui/tui.h
new file mode 100644
index 0000000..f9a47fb
--- /dev/null
+++ b/interfaces/tui/tui.h
@@ -0,0 +1,297 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_tui_
+#define _h_tui_
+
+#ifndef _h_tui_extern_
+#include <tui/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KTUIMgr
+ *  the manager that creates a KTUI instance...
+ */
+typedef struct KTUIMgr KTUIMgr;
+
+
+
+/*--------------------------------------------------------------------------
+ * KTUI
+ *  a handle to platform specific details of a text user interface
+ */
+struct KTUI;
+
+
+/*--------------------------------------------------------------------------
+ * KTUI_event_type
+ */
+typedef uint32_t KTUI_event_type;
+enum
+{
+    ktui_event_none = 0,
+    ktui_event_kb,
+    ktui_event_mouse,
+    ktui_event_window
+};
+
+
+typedef uint32_t KTUI_key;
+enum
+{
+    ktui_down = 1,
+    ktui_up,
+    ktui_left,
+    ktui_right,
+    ktui_home,
+    ktui_end,
+    ktui_bksp,
+    ktui_F1,
+    ktui_F2,
+    ktui_F3,
+    ktui_F4,
+    ktui_F5,
+    ktui_F6,
+    ktui_F7,
+    ktui_F8,
+    ktui_F9,
+    ktui_F10,
+    ktui_F11,
+    ktui_F12,
+    ktui_del,
+    ktui_ins,
+    ktui_pgdn,
+    ktui_pgup,
+    ktui_enter,
+    ktui_tab,
+    ktui_shift_tab,
+    ktui_alpha,
+	ktui_none
+};
+
+/*--------------------------------------------------------------------------
+ * open sturcture for event
+ */
+
+typedef struct KTUI_kb_data
+{
+    KTUI_key code;
+    uint32_t key;
+} KTUI_kb_data;
+
+
+typedef uint32_t KTUI_mouse_button;
+enum
+{
+    ktui_mouse_button_none = 1,
+    ktui_mouse_button_left,
+    ktui_mouse_button_middle,
+    ktui_mouse_button_right,
+	ktui_mouse_button_up
+};
+
+typedef uint32_t KTUI_mouse_action;
+enum
+{
+    ktui_mouse_action_none = 1,
+    ktui_mouse_action_button,
+	ktui_mouse_action_move,
+	ktui_mouse_action_scroll
+};
+
+typedef struct KTUI_mouse_data
+{
+    uint32_t x, y, raw_event;
+    KTUI_mouse_button button;
+	KTUI_mouse_action action;
+} KTUI_mouse_data;
+
+
+typedef struct KTUI_win_data
+{
+    uint32_t w, h;
+} KTUI_win_data;
+
+
+union tui_event_data
+{
+    KTUI_kb_data     kb_data;
+    KTUI_mouse_data  mouse_data;
+    KTUI_win_data    win_data;
+};
+
+typedef struct tui_event
+{
+    SLNode node;
+    KTUI_event_type event_type;
+    union tui_event_data data;
+} tui_event;
+
+
+/*--------------------------------------------------------------------------
+ * open sturcture for command
+ */
+
+typedef uint32_t KTUI_color;
+enum
+{
+    KTUI_c_black = 0,
+    KTUI_c_gray,
+    KTUI_c_red,
+    KTUI_c_dark_red,
+    KTUI_c_green,
+    KTUI_c_dark_green,
+    KTUI_c_yellow,
+    KTUI_c_brown,
+    KTUI_c_blue,
+    KTUI_c_dark_blue,
+    KTUI_c_magenta,
+    KTUI_c_dark_magenta,
+    KTUI_c_cyan,
+    KTUI_c_dark_cyan,
+    KTUI_c_white,
+    KTUI_c_light_gray
+};
+
+
+typedef uint32_t KTUI_attrib;
+enum
+{
+    KTUI_a_none = 0,
+    KTUI_a_bold = 1,
+    KTUI_a_underline = 2,
+    KTUI_a_blink = 4,
+    KTUI_a_inverse = 8
+};
+
+
+typedef struct tui_point
+{
+    uint32_t x, y;
+} tui_point;
+
+
+typedef struct tui_rect
+{
+    tui_point top_left;
+    uint32_t w, h;
+} tui_rect;
+
+
+/* attribute and color */
+typedef struct tui_ac
+{
+    KTUI_attrib attr;
+    KTUI_color fg;
+    KTUI_color bg;
+} tui_ac;
+
+
+/* Make
+ *  creates a platform specific TUI object
+ */
+TUI_EXTERN rc_t CC KTUIMake ( const KTUIMgr * mgr, struct KTUI ** self, uint32_t timeout );
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+TUI_EXTERN rc_t CC KTUIAddRef ( const struct KTUI * self );
+TUI_EXTERN rc_t CC KTUIRelease ( const struct KTUI * self );
+
+
+/* SetTimeout
+ *  changes the timeout value...
+ */
+TUI_EXTERN rc_t CC KTUISetTimeout ( struct KTUI * self, uint32_t timeout );
+
+
+/* Read
+ *  reads one event ( keyboard, mouse or window event )
+ */
+TUI_EXTERN rc_t CC KTUIGet ( struct KTUI * self, tui_event * event );
+
+
+/* Rect
+ *  Print a string into the internal screen buffer with the given coordinates and attribute
+ */
+LIB_EXPORT rc_t CC KTUIPrint( struct KTUI * self, const tui_point * p, const tui_ac * ac, const char * s, uint32_t l );
+
+
+/* Rect
+ *  Fill a rectangle of the internal screen buffer with the given attribute and char
+ *  if r == NULL it fills the whole screen buffer ( effectivly clear-screen )
+ */
+TUI_EXTERN rc_t CC KTUIRect ( struct KTUI * self, const tui_rect * r, const tui_ac * ac, const char c );
+
+
+/* Flush
+ *  flush the content of the internal screen buffer out to the console
+ */
+TUI_EXTERN rc_t CC KTUIFlush ( struct KTUI * self, bool forced );
+
+
+/* GetExtent
+ *  query how many rows/columns the terminal has
+ */
+TUI_EXTERN rc_t CC KTUIGetExtent ( struct KTUI * self, int * cols, int * lines );
+
+
+/* ClrScr
+ *  calls GetExtend, then clears the whole screen
+ */
+TUI_EXTERN rc_t CC KTUIClrScr( struct KTUI * self, KTUI_color bg );
+
+
+TUI_EXTERN void CC set_ac( tui_ac * dst, KTUI_attrib attr, KTUI_color fg, KTUI_color bg );
+TUI_EXTERN void CC copy_ac( tui_ac * dst, const tui_ac * src );
+TUI_EXTERN void CC inverse_ac( tui_ac * dst, const tui_ac * src );
+
+TUI_EXTERN void CC set_rect( tui_rect * dst, int x, int y, int w, int h );
+TUI_EXTERN void CC copy_rect( tui_rect * dst, const tui_rect * src );
+
+TUI_EXTERN bool CC is_alpha_key( tui_event * event, char c );
+TUI_EXTERN bool CC is_key_code( tui_event * event, KTUI_key k );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_tui_ */
diff --git a/interfaces/tui/tui.hpp b/interfaces/tui/tui.hpp
new file mode 100644
index 0000000..71a596c
--- /dev/null
+++ b/interfaces/tui/tui.hpp
@@ -0,0 +1,739 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_tui_
+#define _hpp_tui_
+
+#ifndef _h_tui_
+#include <tui/tui.h>
+#endif
+
+#ifndef _h_tui_dlg_
+#include <tui/tui_dlg.h>
+#endif
+
+#ifndef _h_klib_printf_
+#include <klib/printf.h>
+#endif
+
+#include <string>
+#include <cstring>
+
+namespace tui {
+
+typedef int tui_coord;
+typedef int tui_id;
+typedef long long int tui_long;
+
+class Tui;  // forward decl because of beeing friend with Point, Rect and Ac 
+class Dlg;
+class Std_Dlg_Base;  
+class Std_Dlg_Pick;
+class Std_Dlg_File_Pick;
+class Std_Dlg_Dir_Pick;
+class Dlg_Runner;
+
+class Tui_Point
+{
+    private :
+        tui_point p_;     // open struct from interfaces/tui/tui.h
+
+    public :
+        Tui_Point( const tui_coord x, const tui_coord y ) { set( x, y ); }; // ctor from 2 coordinates
+        Tui_Point( const Tui_Point &other ) { set( other.get_x(), other.get_y() ); };      // copy-ctor
+
+        Tui_Point & operator= ( const Tui_Point & other )  // assignment operator
+            { if ( this != &other ) set( other.get_x(), other.get_y() ); return *this; }
+
+        const tui_coord get_x( void ) const { return p_.x; };
+        const tui_coord get_y( void ) const { return p_.y; };
+        void set_x( const tui_coord x ) { p_.x = x; };
+        void set_y( const tui_coord y ) { p_.y = y; };
+        void set( const tui_coord x, const tui_coord y ) { p_.x = x; p_.y = y; };
+
+        friend class Tui;   // so the Tui-class can access the private struct of this class
+};
+
+
+class Tui_Rect
+{
+    private :
+        tui_rect r_;     // open struct from interfaces/tui/tui.h
+
+    public :
+        Tui_Rect( const tui_coord x, const tui_coord y, const tui_coord w, const tui_coord h ) { set( x, y, w, h ); };
+        Tui_Rect( void ) { set( 0, 0, 1, 1 ); };
+        Tui_Rect( const Tui_Rect &other ) { set( other ); };      // copy-ctor
+
+        Tui_Rect & operator= ( const Tui_Rect & other )  // assignment operator
+            { if ( this != &other ) set( other ); return *this; }
+
+        const tui_coord get_x( void ) const { return r_.top_left.x; };
+        const tui_coord get_y( void ) const { return r_.top_left.y; };
+        const tui_coord get_w( void ) const { return r_.w; };
+        const tui_coord get_h( void ) const { return r_.h; };
+        void get( tui_coord &x, tui_coord &y, tui_coord &w, tui_coord &h ) const
+        { x = r_.top_left.x; y = r_.top_left.y; w = r_.w; h = r_.h; }
+
+        void set_x( const tui_coord x ) { r_.top_left.x = x; };
+        void set_y( const tui_coord y ) { r_.top_left.y = y; };
+        void set_w( const tui_coord w ) { r_.w = w; };
+        void set_h( const tui_coord h ) { r_.h = h; };
+        void set( const tui_coord x, const tui_coord y, const tui_coord w, const tui_coord h )
+            { r_.top_left.x = x; r_.top_left.y = y; r_.w = w; r_.h = h; };
+        void set( Tui_Rect const &other )
+            { r_.top_left.x = other.r_.top_left.x; r_.top_left.y = other.r_.top_left.y; r_.w = other.r_.w; r_.h = other.r_.h; };
+        void change( const tui_coord dx, const tui_coord dy, const tui_coord dw, const tui_coord dh )
+            { r_.top_left.x += dx; r_.top_left.y += dy, r_.w += dw, r_.h += dh; };
+
+        friend class Tui;   // so the Tui-class can access the private struct of this class
+        friend class Dlg;
+        friend class Std_Dlg_Pick;
+        friend class Std_Dlg_File_Pick;
+        friend class Std_Dlg_Dir_Pick;
+};
+
+class Tui_Ac
+{
+    private :
+        tui_ac ac_;     // open struct from interfaces/tui/tui.h
+
+    public :
+        Tui_Ac( const KTUI_attrib attr, const KTUI_color fg, const KTUI_color bg ) { set( attr, fg, bg ); };
+        Tui_Ac( const Tui_Ac &other ) { set( other ); };      // copy-ctor
+
+        Tui_Ac & operator= ( const Tui_Ac & other )  // assignment operator
+            { if ( this != &other ) set( other ); return *this; }
+
+        const KTUI_attrib get_attrib( void ) const { return ac_.attr; };
+        const KTUI_color get_fg( void ) const { return ac_.fg; };
+        const KTUI_color get_bg( void ) const { return ac_.bg; };
+        void set_attrib( const KTUI_attrib attr ) { ac_.attr = attr; };
+        void set_fg( const KTUI_color fg ) { ac_.fg = fg; };
+        void set_bg( const KTUI_color bg ) { ac_.bg = bg; };
+        void set( const KTUI_attrib attr, const KTUI_color fg, const KTUI_color bg ) { ac_.attr = attr; ac_.fg = fg; ac_.bg = bg; };
+        void set( const Tui_Ac &other ) { ac_.attr = other.ac_.attr; ac_.fg = other.ac_.fg; ac_.bg = other.ac_.bg; };
+
+        friend class Tui;   // so the Tui-class can access the private struct of this class
+};
+
+
+class Tui_Event
+{
+    private :
+        tui_event ev_;     // open struct from interfaces/tui/tui.h
+
+    public :
+        Tui_Event( void ) { ev_.event_type = ktui_event_none; };
+
+        bool get_from_tui( void );
+
+        KTUI_event_type get_type( void ) const { return ev_.event_type; };
+
+        KTUI_key get_key_type( void ) const { return ev_.data.kb_data.code; };
+        int get_key( void ) const { return ev_.data.kb_data.key; };
+
+        tui_coord get_mouse_x( void ) const { return ev_.data.mouse_data.x; };
+        tui_coord get_mouse_y( void ) const { return ev_.data.mouse_data.y; };
+        KTUI_mouse_button get_mouse_button( void ) const { return ev_.data.mouse_data.button; };
+
+        tui_coord get_window_width( void ) const { return ev_.data.win_data.w; };
+        tui_coord get_window_height( void ) const { return ev_.data.win_data.h; };
+
+        bool empty( void ) const { return ( get_type() == ktui_event_none ); };
+
+        friend class Tui;   // so the Tui-class can access the private struct of this class
+        friend class Dlg;
+};
+
+
+class Tui
+{
+    private :
+        struct KTUI * tui_;    // opaque struct from interfaces/tui/tui.h
+        static Tui * instance;
+
+        Tui( const int timeout = 10000 ) { KTUIMake ( NULL, &tui_, timeout ); };    // private constructor
+        Tui( const Tui & );     // prevent copy construction
+        Tui& operator=( const Tui& );   // prevent assignment
+        ~Tui( void ) { KTUIRelease ( tui_ ); };
+
+    public :
+        static Tui * getInstance( void );
+        static void clean_up( void );
+
+        bool SetTimeout( const int timeout ) { return ( KTUISetTimeout ( tui_, timeout ) == 0 ); };
+
+        bool Print ( const Tui_Point &p, const Tui_Ac &ac, const std::string &s, const int l = 0 )
+            { return ( KTUIPrint( tui_, &( p.p_ ), &( ac.ac_ ), s.c_str(), ( l == 0 ) ? (int)s.length() : l ) == 0 ); };
+
+        bool PaintRect( const Tui_Rect &r, const Tui_Ac &ac, const char c = ' ' )
+            { return ( KTUIRect( tui_, &( r.r_ ), &( ac.ac_ ), c ) == 0 ); }
+
+        bool Flush( bool forced = false ) { return ( KTUIFlush ( tui_, forced ) == 0 ); };
+
+        bool GetExtent ( tui_coord * cols, tui_coord * lines ) const { return ( KTUIGetExtent ( tui_, cols, lines ) == 0 ); };
+        bool GetExtent ( Tui_Rect &r )
+        {
+            tui_coord cols, lines;
+            bool res = ( KTUIGetExtent ( tui_, &cols, &lines ) == 0 );
+            if ( res ) r.set( 0, 0, cols, lines );
+            return res;
+        }
+
+        bool ClrScr( const KTUI_color bg ) { return ( KTUIClrScr( tui_, bg ) == 0 ); };
+
+        friend class Tui_Event;
+        friend class Dlg;
+        friend class Std_Dlg_Base;
+};
+
+
+class Tui_Dlg_Event
+{
+    private :
+        tuidlg_event ev_;     // open struct from interfaces/tui/tui_dlg.h
+
+    public :
+        Tui_Dlg_Event( void ) { ev_.event_type = ktuidlg_event_none; };
+
+        const KTUIDlg_event_type get_type( void ) const { return ev_.event_type; };
+        const tui_id get_widget_id( void ) const { return ev_.widget_id; };
+        const tui_long get_value_1( void ) const { return ev_.value_1; };
+        const tui_long get_value_2( void ) const { return ev_.value_2; };
+        const void * get_ptr_value( void ) const { return ev_.ptr_0; };
+        const bool empty( void ) const { return ( ev_.event_type == ktuidlg_event_none ); };
+
+        friend class Dlg_Runner;
+};
+
+
+class Tui_Menu
+{
+    private :
+        struct KTUI_Menu * menu_;
+
+    public :
+        Tui_Menu( void ) { KTUI_Menu_Make ( &menu_ ); };
+        ~Tui_Menu( void ) { KTUI_Menu_Release ( menu_ ); };
+
+        bool Add( const char * path, tui_id id, char shortcut ) { return ( KTUI_Menu_Add ( menu_, path, id, shortcut ) == 0 ); }
+        bool Remove( tui_id id ) { return ( KTUI_Menu_Remove ( menu_, id ) == 0 ); };
+
+        struct KTUI_Menu * get( bool inc_ref_count )
+        {
+            if ( inc_ref_count )
+            {
+                if ( KTUI_Menu_AddRef ( menu_ ) == 0 ) return menu_; else return NULL;
+            }
+            else
+                return menu_;
+        };
+};
+
+
+class Grid
+{
+    private :
+        TUIWGrid_data grid_data_;
+        char buffer[ 1024 ];
+
+        static void static_str_cb( TUIWGridStr what, uint64_t col, uint64_t row,
+                                   uint32_t col_width, const char ** value, void * data, void * instance )
+        {
+            Grid *g = static_cast< Grid* >( instance );
+            g->buffer[ 0 ] = 0;
+            switch( what )
+            {
+                case kGrid_Col   : g->Col_Hdr_Request( col, col_width, data, g->buffer, sizeof g->buffer ); break; 
+                case kGrid_Row   : g->Row_Hdr_Request( row, col_width, data, g->buffer, sizeof g->buffer ); break; 
+                case kGrid_Cell  : g->Cell_Request( col, row, col_width, data, g->buffer, sizeof g->buffer ); break;
+            }
+            *value = g->buffer;
+        };
+
+        static void static_int_cb( TUIWGridInt what, uint64_t col, uint32_t widget_width,
+                                   uint64_t * value, void * data, void * instance )
+        {
+            Grid *g = static_cast< Grid* >( instance );
+            switch( what )
+            {
+                case kGrid_Get_Width    : *value = g->Get_Col_Width( col, widget_width, data ); break;
+                case kGrid_Set_Width    : g->Set_Col_Width( col, widget_width, data, *value ); break;
+                case kGrid_Get_ColCount : *value = g->Get_Col_Count( widget_width, data ); break;
+                case kGrid_Get_RowCount : *value = g->Get_Row_Count( widget_width, data ); break;
+                case kGrid_Prepare_Page : g->Prepare_Page( col, widget_width, data ); break;
+                case kGrid_Next_Row     : g->Next_Row( col, data ); break;
+                default : *value = 0;
+            }
+        };
+
+    public :
+        Grid( void * data );
+        virtual ~Grid() {};
+
+        void show_header( bool show ) { grid_data_.show_header = show; };
+        void show_row_header( int width ) { grid_data_.row_hdr_width = width; grid_data_.show_row_header = ( width > 0 ); };
+        void show_h_scroll( bool show ) { grid_data_.show_h_scroll = show; };
+        void show_v_scroll( bool show ) { grid_data_.show_v_scroll = show; };
+
+        TUIWGrid_data * get_ptr( void ) { return &grid_data_; };
+
+        /* overwrite these in derived classes */
+        virtual void Col_Hdr_Request( tui_long col, uint32_t col_width, void * data, char * buffer, size_t buffer_size )
+            { string_printf ( buffer, buffer_size, NULL, "C %lu", col+1 ); };
+
+        virtual void Row_Hdr_Request( tui_long row, uint32_t col_width, void * data, char * buffer, size_t buffer_size )
+            { string_printf ( buffer, buffer_size, NULL, "R %lu", row+1 ); };
+
+        virtual void Cell_Request( tui_long col, tui_long row, uint32_t col_width, void * data, char * buffer, size_t buffer_size )
+            { string_printf ( buffer, buffer_size, NULL, "Z %lu-%lu", col + 1, row + 1 ); };
+
+        virtual tui_long Get_Col_Width( tui_long col, uint32_t widget_width, void * data ) { return 12; };
+        virtual void Set_Col_Width( tui_long col, uint32_t widget_width, void * data, tui_long value ) {};
+        virtual tui_long Get_Col_Count( uint32_t widget_width, void * data ) { return 8; };
+        virtual tui_long Get_Row_Count( uint32_t widget_width, void * data ) { return 32; };
+        virtual void Prepare_Page( uint64_t row, uint32_t row_count, void * data ) { ; };
+        virtual void Next_Row( uint64_t row, void * data ) { ; };
+};
+
+
+class Dlg
+{
+    private :
+        struct KTUIDlg * dlg_;  // opaque struct from interfaces/tui/tui_dlg.h
+
+    public :
+        Dlg( void )
+        {
+            Tui * instance = Tui::getInstance();
+            KTUIDlgMake ( instance->tui_, &dlg_, /*parent*/ NULL, /*palette*/ NULL, /*rect*/ NULL );
+        };
+
+        ~Dlg( void ) { KTUIDlgRelease ( dlg_ ); };
+
+        bool SetCaption( const char * s ) { return ( KTUIDlgSetCaption ( dlg_, s ) == 0 ); };
+        bool SetCaption( std::string &s ) { return ( KTUIDlgSetCaption ( dlg_, s.c_str() ) == 0 ); };
+        bool SetCaptionF( const char * fmt, ... );
+
+        Tui_Rect center( uint32_t x_margin, uint32_t y_margin )
+        {
+            Tui_Rect r;
+            GetRect( r );
+            r.set_w( r.get_w() - ( 2 * x_margin ) );
+            r.set_x( r.get_x() + x_margin );
+            r.set_h( r.get_h() - ( 2 * y_margin ) );
+            r.set_y( r.get_y() + y_margin );
+            return r;
+        };
+
+        void center( Tui_Rect &r )
+        {
+            Tui_Rect rd;
+            GetRect( rd );
+            if ( r.get_w() > ( rd.get_w() - 2 ) ) r.set_w( rd.get_w() - 2 );
+            if ( r.get_h() > ( rd.get_h() -2 ) ) r.set_h( rd.get_h() - 2 );
+            r.set_x( rd.get_x() + ( ( rd.get_w() - r.get_w() ) / 2 ) );
+            r.set_y( rd.get_y() + ( ( rd.get_h() - r.get_h() ) / 2 ) );
+        };
+
+
+        void SetData( void * data ) { KTUIDlgSetData ( dlg_, data ); };
+        void * GetData( void ) { return KTUIDlgGetData ( dlg_ ); };
+
+        void SetDone( bool done ) { KTUIDlgSetDone ( dlg_, done ); };
+        bool IsDone( void ) { return KTUIDlgGetDone ( dlg_ ); };
+
+        void SetChanged( void ) { KTUIDlgSetChanged ( dlg_ ); };
+        void ClearChanged( void ) { KTUIDlgClearChanged ( dlg_ ); };
+        bool IsChanged( void ) { return KTUIDlgGetChanged ( dlg_ ); };
+
+        bool GetRect( Tui_Rect &r ) { return ( KTUIDlgGetRect ( dlg_, &( r.r_ ) ) == 0 ); };
+        bool SetRect( Tui_Rect const &r, bool redraw ) { return ( KTUIDlgSetRect ( dlg_, &( r.r_ ), redraw ) == 0 ); };
+        virtual bool Resize( Tui_Rect const &r );
+
+        bool IsMenuActive( void ) { return KTUIDlgGetMenuActive ( dlg_ ); };
+        bool SetMenuActive( bool active ) { return ( KTUIDlgSetMenuActive ( dlg_, active ) == 0 ); };
+        bool SetMenu( Tui_Menu &menu ) { return ( KTUIDlgSetMenu ( dlg_, menu.get( true ) ) == 0 ); };
+        bool ToggleMenu( void ) { return SetMenuActive( !IsMenuActive() ); };
+
+        bool SetWidgetCaption( tui_id id, const char * caption ) { return ( KTUIDlgSetWidgetCaption ( dlg_, id, caption ) == 0 ); };
+        bool SetWidgetCaption( tui_id id, std::string caption ) { return ( KTUIDlgSetWidgetCaption ( dlg_, id, caption.c_str() ) == 0 ); };
+        bool SetWidgetCaptionF( tui_id id, const char * fmt, ... );
+        bool GetWidgetRect( tui_id id, Tui_Rect &r ) { return ( KTUIDlgGetWidgetRect ( dlg_, id, &( r.r_ ) ) == 0 ); };
+        bool SetWidgetRect( tui_id id, Tui_Rect const &r, bool redraw ) { return ( KTUIDlgSetWidgetRect ( dlg_, id, &( r.r_ ), redraw ) == 0 ); };
+
+        bool SetWidgetCanFocus( tui_id id, bool can_focus ) { return ( KTUIDlgSetWidgetCanFocus ( dlg_, id, can_focus ) == 0 ); };
+
+        bool IsWidgetVisisble( tui_id id ) { return KTUIDlgGetWidgetVisible ( dlg_, id ); };
+        bool SetWidgetVisible( tui_id id, bool visible ) { return ( KTUIDlgSetWidgetVisible ( dlg_, id, visible ) == 0 ); };
+
+        bool HasWidgetChanged( tui_id id ) { return KTUIDlgGetWidgetChanged ( dlg_, id ); };
+        bool SetWidgetChanged( tui_id id, bool changed ) { return ( KTUIDlgSetWidgetChanged ( dlg_, id, changed ) == 0 ); };
+
+        bool GetWidgetBoolValue( tui_id id ) { return KTUIDlgGetWidgetBoolValue ( dlg_, id ); };
+        bool SetWidgetBoolValue( tui_id id, bool value ) { return ( KTUIDlgSetWidgetBoolValue ( dlg_, id, value ) == 0 ); };
+
+        bool SetWidgetBackground( tui_id id, KTUI_color value ) { return ( KTUIDlgSetWidgetBg ( dlg_, id, value ) == 0 ); };
+        bool ReleaseWidgetBackground( tui_id id ) { return ( KTUIDlgReleaseWidgetBg ( dlg_, id ) == 0 ); };
+
+		bool SetWidgetForeground( tui_id id, KTUI_color value ) { return ( KTUIDlgSetWidgetFg ( dlg_, id, value ) == 0 ); };
+        bool ReleaseWidgetForeground( tui_id id ) { return ( KTUIDlgReleaseWidgetFg ( dlg_, id ) == 0 ); };
+
+        tui_long GetWidgetInt64Value( tui_id id ) { return KTUIDlgGetWidgetInt64Value ( dlg_, id ); };
+        bool SetWidgetInt64Value( tui_id id, tui_long value ) { return ( KTUIDlgSetWidgetInt64Value ( dlg_, id, value ) == 0 ); };
+
+        tui_long GetWidgetInt64Min( tui_id id ) { return KTUIDlgGetWidgetInt64Min ( dlg_, id ); };
+        bool SetWidgetInt64Min( tui_id id, tui_long value ) { return ( KTUIDlgSetWidgetInt64Min ( dlg_, id, value ) == 0 ); };
+
+        tui_long GetWidgetInt64Max( tui_id id ) { return KTUIDlgGetWidgetInt64Max ( dlg_, id ); };
+        bool SetWidgetInt64Max( tui_id id, tui_long value ) { return ( KTUIDlgSetWidgetInt64Max ( dlg_, id, value ) == 0 ); };
+
+        int GetWidgetPercent( tui_id id ) { return KTUIDlgGetWidgetPercent ( dlg_, id ); };
+        bool SetWidgetPercent( tui_id id, int value ) { return ( KTUIDlgSetWidgetPercent ( dlg_, id, value ) == 0 ); };
+
+        int GetWidgetPrecision( tui_id id ) { return KTUIDlgGetWidgetPrecision ( dlg_, id ); };
+        bool SetWidgetPrecision( tui_id id, int value ) { return ( KTUIDlgSetWidgetPrecision( dlg_, id, value ) == 0 ); };
+        int CalcPercent( tui_long value, tui_long max, int precision ) { return KTUIDlgCalcPercent ( value, max, precision ); };
+
+        const char * GetWidgetText( tui_id id ) { return KTUIDlgGetWidgetText( dlg_, id ); };
+        std::string GetWidgetString( tui_id id ) { return std::string( KTUIDlgGetWidgetText( dlg_, id ) ); };
+        bool SetWidgetText( tui_id id, const char * value ) { return ( KTUIDlgSetWidgetText ( dlg_, id, value ) == 0 ); };
+        bool SetWidgetText( tui_id id, std::string &s ) { return ( KTUIDlgSetWidgetText ( dlg_, id, s.c_str() ) == 0 ); };
+        bool SetWidgetTextF( tui_id id, const char * fmt, ... );
+        size_t GetWidgetTextLength( tui_id id ) { return KTUIDlgGetWidgetTextLength( dlg_, id ); };
+        bool SetWidgetTextLength( tui_id id, size_t value ) { return ( KTUIDlgSetWidgetTextLength ( dlg_, id, value ) == 0 ); };
+
+        bool AddWidgetString( tui_id id, const char * txt ) { return ( KTUIDlgAddWidgetString ( dlg_, id, txt ) == 0 ); };
+        bool AddWidgetString( tui_id id, std::string &s ) { return ( KTUIDlgAddWidgetString ( dlg_, id, s.c_str() ) == 0 ); };
+        bool AddWidgetStringN( tui_id id, int n, ... );
+        bool AddWidgetStringF( tui_id id, const char * fmt, ... );
+        bool AddWidgetStrings( tui_id id, VNamelist * src ) { return ( KTUIDlgAddWidgetStrings ( dlg_, id, src ) == 0 ); };
+        const char * GetWidgetStringByIdx( tui_id id, tui_id idx ) { return KTUIDlgGetWidgetStringByIdx ( dlg_, id, idx ); };
+        bool RemoveWidgetStringByIdx( tui_id id, tui_id idx ) { return ( KTUIDlgRemoveWidgetStringByIdx ( dlg_, id, idx ) == 0 ); };
+        bool RemoveAllWidgetStrings( tui_id id ) { return ( KTUIDlgRemoveAllWidgetStrings ( dlg_, id ) == 0 ); };
+        tui_id GetWidgetStringCount( tui_id id ) { return KTUIDlgGetWidgetStringCount ( dlg_, id ); };
+        tui_id HasWidgetString( tui_id id, const char * txt ) { return KTUIDlgHasWidgetString( dlg_, id, txt ); };
+        tui_id HasWidgetString( tui_id id, std::string &txt ) { return KTUIDlgHasWidgetString( dlg_, id, txt.c_str() ); };
+        tui_id GetWidgetSelectedString( tui_id id ) { return KTUIDlgGetWidgetSelectedString( dlg_, id ); };
+        bool SetWidgetSelectedString( tui_id id, tui_id idx ) { return ( KTUIDlgSetWidgetSelectedString ( dlg_, id, idx ) == 0 ); };
+
+        bool AddLabel( tui_id id, Tui_Rect const &r, const char * s ) { return ( KTUIDlgAddLabel( dlg_, id, &( r.r_ ), s ) == 0 ); };
+        bool AddButton( tui_id id, Tui_Rect const &r, const char * s ) { return ( KTUIDlgAddBtn ( dlg_, id, &( r.r_ ), s ) == 0 ); };
+
+        bool AddCheckBox( tui_id id, Tui_Rect const &r, const char * s, bool enabled )
+        {
+            bool res = ( KTUIDlgAddCheckBox ( dlg_, id, &( r.r_ ), s ) == 0 );
+            if ( res ) res = SetWidgetBoolValue( id, enabled );
+            return res;
+        };
+
+        bool AddInput( tui_id id, Tui_Rect const &r, const char * s, size_t length ) { return ( KTUIDlgAddInput ( dlg_, id, &( r.r_ ), s, length ) == 0 ); };
+        bool AddRadioBox( tui_id id, Tui_Rect const &r ) { return ( KTUIDlgAddRadioBox ( dlg_, id, &( r.r_ ) ) == 0 ); };
+        bool AddList( tui_id id, Tui_Rect const &r ) { return ( KTUIDlgAddList ( dlg_, id, &( r.r_ ) ) == 0 ); };
+        bool SetHScroll( tui_id id, bool enabled ) { return ( KTUIDlgSetHScroll ( dlg_, id, enabled ) == 0 ); };
+        bool AddProgress( tui_id id, Tui_Rect const &r, int percent, int precision ) { return ( KTUIDlgAddProgress ( dlg_, id, &( r.r_ ), percent, precision ) == 0 ); };
+        bool AddSpinEdit( tui_id id, Tui_Rect const &r, tui_long value, tui_long min, tui_long max ) { return ( KTUIDlgAddSpinEdit ( dlg_, id, &( r.r_ ), value, min, max ) == 0 ); };
+        bool AddGrid( tui_id id, Tui_Rect const &r, Grid &grid, bool cached ) { return( KTUIDlgAddGrid ( dlg_, id, &( r.r_ ), grid.get_ptr(), cached ) == 0 ); };
+
+        bool HasWidget( tui_id id ) { return KTUIDlgHasWidget ( dlg_, id ); };
+
+        tui_long GetGridCol( tui_id id ) { uint64_t col = 0; KTUIDlgGetGridCol( dlg_, id, &col ); return col; };
+        bool SetGridCol( tui_id id, tui_long col ) { return ( KTUIDlgSetGridCol( dlg_, id, col ) == 0 ); };
+        tui_long GetGridRow( tui_id id ) { uint64_t row = 0; KTUIDlgGetGridRow( dlg_, id, &row ); return row; };
+        bool SetGridRow( tui_id id, tui_long row ) { return ( KTUIDlgSetGridRow( dlg_, id, row ) == 0 ); };
+
+        bool RemoveWidget( tui_id id ) { return ( KTUIDlgRemove ( dlg_, id ) == 0 ); };
+        bool Draw( bool forced = false ) { return ( KTUIDlgDraw( dlg_, forced ) == 0 ); };
+        bool DrawWidget( tui_id id ) { return ( KTUIDlgDrawWidget( dlg_, id ) == 0 ); };
+        bool DrawCaption( void ) { return ( KTUIDlgDrawCaption( dlg_ ) == 0 ); };
+
+        bool SetFocus( tui_id id ) { return ( KTUIDlgSetFocus( dlg_, id ) == 0 ); };
+        bool MoveFocus( bool forward ) { return ( KTUIDlgMoveFocus( dlg_, forward ) == 0 ); };
+        bool FocusValid( void ) { return KTUIDlgFocusValid( dlg_ ); };
+        tui_id GetFocusId( void ) { return KTUIDlgGetFocusId( dlg_ ); };
+
+        bool HandleEvent( Tui_Event &ev ) { return ( KTUIDlgHandleEvent( dlg_, &( ev.ev_ ) ) == 0 ); };
+        bool GetDlgEvent( tuidlg_event * event ) { return ( KTUIDlgGet ( dlg_, event ) == 0 ); };
+
+        friend class Std_Dlg_Base;
+};
+
+class Dlg_Runner
+{
+    private :
+        Dlg &dlg_;
+        void * data_;
+
+        bool handle_dlg_event_loop( void );
+        bool handle_tui_event( Tui_Event &ev );
+        bool handle_dlg_event( Tui_Event &ev );
+
+
+    public :
+        Dlg_Runner( Dlg &dlg, void * data ) : dlg_( dlg ), data_( data ) { };
+        virtual ~Dlg_Runner() {};
+
+        void run( void );
+
+        virtual bool on_kb_alpha( Dlg &dlg, void * data, int code )               { return false; };
+        virtual bool on_kb_special_key( Dlg &dlg, void * data, KTUI_key key )     { return false; };
+        virtual bool on_mouse( Dlg &dlg, void * data, tui_coord x, tui_coord y, KTUI_mouse_button button ) { return false; };
+        virtual bool on_win( Dlg &dlg, void * data, tui_coord w, tui_coord h )    { return dlg_.Resize( tui::Tui_Rect( 0, 0, w, h ) ); };
+        virtual bool on_focus( Dlg &dlg, void * data, Tui_Dlg_Event &dev )        { return false; };
+        virtual bool on_focus_lost( Dlg &dlg, void * data, Tui_Dlg_Event &dev )   { return false; };
+        virtual bool on_select( Dlg &dlg, void * data, Tui_Dlg_Event &dev )       { return false; };
+        virtual bool on_changed( Dlg &dlg, void * data, Tui_Dlg_Event &dev )      { return false; };
+        virtual bool on_menu( Dlg &dlg, void * data, Tui_Dlg_Event &dev )         { return false; };
+};
+
+
+class Std_Dlg_Base
+{
+    protected :
+        Dlg * parent_;
+        KTUI_color bg1_, bg2_;
+        bool allow_dir_create_;
+        Tui_Rect R_;
+        char buffer[ 1024 ];
+        char caption[ 256 ];
+
+        void prepare( struct KTUI ** tui, struct KTUIDlg ** parent_dlg )
+        {
+            *tui = NULL;
+            *parent_dlg = NULL;
+            if ( parent_ != NULL )
+                *parent_dlg = parent_->dlg_;
+            else
+            {
+                Tui * instance = Tui::getInstance();
+                *tui = instance->tui_;
+            }
+        }
+
+        void post_process( void )
+        {
+            if ( parent_ != NULL )
+                parent_->Draw();
+        }
+
+    public :
+        Std_Dlg_Base( void ) : parent_( NULL ), bg1_( KTUI_c_brown ), bg2_( KTUI_c_dark_green ),
+                               allow_dir_create_( false ), R_( 0, 0, 35, 1 )
+        {
+			buffer[ 0 ] = 0;
+			caption[ 0 ] = 0;
+		};
+
+        void set_parent( Dlg * parent ) { parent_ = parent; };
+        void set_location( Tui_Rect const &r ) { R_.set( r ); };
+        void set_colors( const KTUI_color c1, const KTUI_color c2 ) { bg1_ = c1; bg2_ = c2; };
+        void set_color1( const KTUI_color c ) { bg1_ = c; };
+        void set_color2( const KTUI_color c ) { bg2_ = c; };
+        void allow_dir_create() { allow_dir_create_ = true; };
+
+        void set_caption( const char * txt ) { if ( txt != NULL ) string_printf ( caption, sizeof caption, NULL, "%s", txt ); };
+        void set_caption2( const std::string &txt ) { set_caption( txt.c_str() ); };
+
+        void set_text( const char * txt ) { if ( txt != NULL ) string_printf ( buffer, sizeof buffer, NULL, "%s", txt ); };
+        void set_text2( std::string &txt ) { set_text( txt.c_str() ); };
+        const char * get_text( void ) { return buffer; };
+        std::string get_text2( void ) { return buffer; };
+
+        Tui_Rect center( void )
+        {
+            tui_coord w = R_.get_w();
+            tui_coord cols, lines;
+            Tui::getInstance()->GetExtent( &cols, &lines );
+            return Tui_Rect( ( cols / 2 ) - ( w / 2 ), ( lines / 2 ) - 3, w, 1 );
+        };
+};
+
+
+class Std_Dlg_Info_Line : public Std_Dlg_Base
+{
+    private :
+
+        bool execute_int( void )
+        {
+            struct KTUI * tui = NULL;
+            struct KTUIDlg * parent_dlg = NULL;
+            prepare( &tui, &parent_dlg ); /* get either tui-ptr or parent_dlg-ptr for calling actual dlg-function */
+
+            rc_t rc = TUI_ShowMessage ( tui, parent_dlg, caption, buffer, 
+                                        R_.get_x(), R_.get_y(), R_.get_w(), bg1_, bg2_ );
+
+            post_process(); /* draw the parent */
+            return ( rc == 0 );
+        }
+
+    public :
+        bool execute( void ) { return execute_int(); };
+};
+
+
+class Std_Dlg_Input : public Std_Dlg_Base
+{
+    private :
+
+        bool execute_int( void )
+        {
+            struct KTUI * tui = NULL;
+            struct KTUIDlg * parent_dlg = NULL;
+            prepare( &tui, &parent_dlg ); /* get either tui-ptr or parent_dlg-ptr for calling actual dlg-function */
+
+            bool selected;
+
+            rc_t rc = TUI_EditBuffer( tui, parent_dlg, caption, buffer, sizeof buffer,
+                                      R_.get_x(), R_.get_y(), R_.get_w(),
+                                      &selected, bg1_, bg2_ );
+
+            post_process(); /* draw the parent */
+            return ( rc == 0 && selected );
+        }
+
+    public :
+        bool execute( void ) { return execute_int(); };
+};
+
+
+class Std_Dlg_Question : public Std_Dlg_Base
+{
+    private :
+
+        bool execute_int( void )
+        {
+            struct KTUI * tui = NULL;
+            struct KTUIDlg * parent_dlg = NULL;
+            prepare( &tui, &parent_dlg ); /* get either tui-ptr or parent_dlg-ptr for calling actual dlg-function */
+
+            bool yes;
+
+            rc_t rc = TUI_YesNoDlg ( tui, parent_dlg, caption, buffer,
+                                     R_.get_x(), R_.get_y(), R_.get_w(), &yes, bg1_, bg2_ );
+
+            post_process(); /* draw the parent */
+            return ( rc == 0 && yes );
+        }
+
+    public :
+
+        bool execute( void ) { return execute_int(); };
+};
+
+
+class Std_Dlg_Pick : public Std_Dlg_Base
+{
+    private :
+        VNamelist * list_;
+
+        bool execute_int( unsigned int * selection )
+        {
+            struct KTUI * tui = NULL;
+            struct KTUIDlg * parent_dlg = NULL;
+            prepare( &tui, &parent_dlg ); /* get either tui-ptr or parent_dlg-ptr for calling actual dlg-function */
+
+            bool selected;
+            if ( R_.get_h() < 6 ) R_.set_h( 6 );
+
+            rc_t rc = TUI_PickFromList( tui, parent_dlg, caption, list_, selection,
+                                        &( R_.r_ ), &selected, bg1_, bg2_ );
+
+            post_process(); /* draw the parent */
+            return ( rc == 0 && selected );
+        }
+
+    public :
+        Std_Dlg_Pick( void ) { VNamelistMake ( &list_, 100 ); };
+        virtual ~Std_Dlg_Pick( void ) { VNamelistRelease( list_ ); };
+
+        void add_entry( const char * txt ) { VNamelistAppend ( list_, txt ); };
+        bool execute( unsigned int * selection ) { return execute_int( selection ); };
+};
+
+
+class Std_Dlg_File_Pick : public Std_Dlg_Base
+{
+    private :
+        char ext[ 32 ];
+        uint32_t dir_h;
+
+        bool execute_int( void )
+        {
+            struct KTUI * tui = NULL;
+            struct KTUIDlg * parent_dlg = NULL;
+            prepare( &tui, &parent_dlg ); /* get either tui-ptr or parent_dlg-ptr for calling actual dlg-function */
+
+            bool done;
+            if ( R_.get_h() < 12 ) R_.set_h( 12 );
+            if ( dir_h == 0 ) dir_h = ( R_.get_h() - 6 ) / 2 ;
+
+            rc_t rc = FileDlg ( tui, parent_dlg, buffer, sizeof buffer, ext, &done,
+                                &( R_.r_ ), dir_h, bg1_, bg2_ );
+
+            post_process(); /* draw the parent */
+            return ( rc == 0 && done );
+        }
+
+    public :
+        Std_Dlg_File_Pick( void ) { ext[ 0 ] = 0; dir_h = 0; };
+
+        void set_ext( const char * txt ) { if ( txt != NULL ) string_printf ( ext, sizeof ext, NULL, "%s", txt ); };
+        void set_ext2( const std::string &txt ) { set_ext( txt.c_str() ); };
+        void set_dir_h( uint32_t value ) { dir_h = value; };
+
+        bool execute( void ) { return execute_int(); };
+};
+
+
+class Std_Dlg_Dir_Pick : public Std_Dlg_Base
+{
+    private :
+        bool execute_int( void )
+        {
+            struct KTUI * tui = NULL;
+            struct KTUIDlg * parent_dlg = NULL;
+            prepare( &tui, &parent_dlg ); /* get either tui-ptr or parent_dlg-ptr for calling actual dlg-function */
+
+            bool done;
+            if ( R_.get_h() < 12 ) R_.set_h( 12 );
+
+            rc_t rc = DirDlg ( tui, parent_dlg, buffer, sizeof buffer, &done,
+                               &( R_.r_ ), bg1_, bg2_, allow_dir_create_ );
+
+            post_process(); /* draw the parent */
+            return ( rc == 0 && done );
+        }
+
+    public :
+        Std_Dlg_Dir_Pick( void ) { };
+        bool execute( void ) { return execute_int(); };
+};
+
+
+} // namespace tui
+
+#endif // _hpp_tui_
\ No newline at end of file
diff --git a/interfaces/tui/tui_dlg.h b/interfaces/tui/tui_dlg.h
new file mode 100644
index 0000000..e9a65a0
--- /dev/null
+++ b/interfaces/tui/tui_dlg.h
@@ -0,0 +1,367 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_tui_dlg_
+#define _h_tui_dlg_
+
+#ifndef _h_tui_extern_
+#include <tui/extern.h>
+#endif
+
+#ifndef _h_klib_namelist_
+#include <klib/namelist.h>
+#endif
+
+#ifndef _h_tui_
+#include <tui/tui.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * KTUIPalette
+ */
+typedef uint32_t KTUIPa_entry;
+enum
+{
+    ktuipa_dlg = 1,
+    ktuipa_dlg_caption,
+    ktuipa_dlg_focus,
+
+    ktuipa_label,
+    ktuipa_button,
+    ktuipa_checkbox,
+    ktuipa_input,
+    ktuipa_input_hint,
+    ktuipa_radiobox,
+    ktuipa_list,
+    ktuipa_progress,
+    ktuipa_spinedit,
+    ktuipa_grid,
+    ktuipa_grid_col_hdr,
+    ktuipa_grid_row_hdr,
+    ktuipa_grid_cursor,
+
+    ktuipa_menu,
+    ktuipa_menu_sel,
+    ktuipa_menu_hi,
+
+    ktuipa_last
+};
+
+
+struct KTUIPalette;
+
+TUI_EXTERN rc_t CC KTUIPaletteMake ( struct KTUIPalette ** self );
+TUI_EXTERN rc_t CC KTUIPaletteAddRef ( const struct KTUIPalette * self );
+TUI_EXTERN rc_t CC KTUIPaletteRelease ( const struct KTUIPalette * self );
+
+TUI_EXTERN const tui_ac * CC KTUIPaletteGet ( const struct KTUIPalette * self, KTUIPa_entry what );
+TUI_EXTERN rc_t CC KTUIPaletteSet ( struct KTUIPalette * self, KTUIPa_entry what, const tui_ac * ac );
+TUI_EXTERN rc_t CC KTUIPaletteDefault ( struct KTUIPalette * self );
+TUI_EXTERN rc_t CC KTUIPaletteCopy ( struct KTUIPalette * dst, const struct KTUIPalette * src );
+
+LIB_EXPORT rc_t CC KTUIPaletteSet_fg ( struct KTUIPalette * self, KTUIPa_entry what, KTUI_color fg );
+LIB_EXPORT rc_t CC KTUIPaletteSet_bg ( struct KTUIPalette * self, KTUIPa_entry what, KTUI_color bg );
+
+/*--------------------------------------------------------------------------
+ * The Menu of a Dialog
+ */
+struct KTUI_Menu;
+
+TUI_EXTERN rc_t CC KTUI_Menu_Make ( struct KTUI_Menu ** self );
+TUI_EXTERN rc_t CC KTUI_Menu_AddRef ( const struct KTUI_Menu * self );
+TUI_EXTERN rc_t CC KTUI_Menu_Release ( struct KTUI_Menu * self );
+
+TUI_EXTERN rc_t CC KTUI_Menu_Add ( struct KTUI_Menu * self, const char * path, uint32_t cmd, char shortcut );
+TUI_EXTERN rc_t CC KTUI_Menu_Remove ( struct KTUI_Menu * self, uint32_t cmd );
+
+
+/*--------------------------------------------------------------------------
+ * KTUIDlg_event_type
+ */
+typedef uint32_t KTUIDlg_event_type;
+enum
+{
+    ktuidlg_event_none = 0,
+    ktuidlg_event_focus,
+    ktuidlg_event_focus_lost,
+    ktuidlg_event_select,
+    ktuidlg_event_changed,
+    ktuidlg_event_menu
+};
+
+
+/*--------------------------------------------------------------------------
+ * KTUIDlg_event
+ */
+typedef struct tuidlg_event
+{
+    SLNode node;                        /* needed internally */
+    KTUIDlg_event_type event_type;      /* what has happened */
+    uint32_t widget_id;                 /* which widget did it happen to */
+    uint64_t value_1;                   /* what was selected in case of ktuidlg_event_select */
+    uint64_t value_2;                   /* what was selected in case of ktuidlg_event_select */
+    void * ptr_0;                       /* depends on the widget type... */
+} tuidlg_event;
+
+
+/*--------------------------------------------------------------------------
+ * KTUIDlg
+ *  a handle to a TUI-Dialog
+ */
+struct KTUIDlg;
+
+TUI_EXTERN rc_t CC KTUIDlgMake ( struct KTUI * tui, struct KTUIDlg ** self, struct KTUIDlg * parent,
+                   struct KTUIPalette * palette, tui_rect * r );
+TUI_EXTERN rc_t CC KTUIDlgAddRef ( const struct KTUIDlg * self );
+TUI_EXTERN rc_t CC KTUIDlgRelease ( const struct KTUIDlg * self );
+
+TUI_EXTERN struct KTUI * CC KTUIDlgGetTui ( struct KTUIDlg * self );
+TUI_EXTERN struct KTUIPalette * CC KTUIDlgGetPalette ( struct KTUIDlg * self );
+TUI_EXTERN struct KTUIDlg * CC KTUIDlgGetParent ( struct KTUIDlg * self );
+
+TUI_EXTERN rc_t CC KTUIDlgAbsoluteRect ( struct KTUIDlg * self, tui_rect * dst, tui_rect * src );
+TUI_EXTERN rc_t CC KTUIDlgSetCaption ( struct KTUIDlg * self, const char * caption );
+
+TUI_EXTERN void CC KTUIDlgSetData ( struct KTUIDlg * self, void * data );
+TUI_EXTERN void * CC KTUIDlgGetData ( struct KTUIDlg * self );
+
+TUI_EXTERN void CC KTUIDlgSetDone ( struct KTUIDlg * self, bool done );
+TUI_EXTERN bool CC KTUIDlgGetDone ( struct KTUIDlg * self );
+
+TUI_EXTERN void CC KTUIDlgSetChanged ( struct KTUIDlg * self );
+TUI_EXTERN void CC KTUIDlgClearChanged ( struct KTUIDlg * self );
+TUI_EXTERN bool CC KTUIDlgGetChanged ( struct KTUIDlg * self );
+
+TUI_EXTERN rc_t CC KTUIDlgGetRect ( struct KTUIDlg * self, tui_rect * r );
+TUI_EXTERN rc_t CC KTUIDlgSetRect ( struct KTUIDlg * self, const tui_rect * r, bool redraw );
+
+TUI_EXTERN bool CC KTUIDlgGetMenuActive ( const struct KTUIDlg * self );
+TUI_EXTERN rc_t CC KTUIDlgSetMenuActive ( struct KTUIDlg * self, bool active );
+TUI_EXTERN rc_t CC KTUIDlgSetMenu ( struct KTUIDlg * self, struct KTUI_Menu * menu );
+
+TUI_EXTERN const char * CC KTUIDlgGetWidgetCaption ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetCaption ( struct KTUIDlg * self, uint32_t id, const char * caption );
+
+TUI_EXTERN struct KTUIPalette * CC KTUIDlgNewWidgetPalette ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgReleaseWidgetPalette ( struct KTUIDlg * self, uint32_t id );
+
+TUI_EXTERN rc_t CC KTUIDlgGetWidgetRect ( struct KTUIDlg * self, uint32_t id, tui_rect * r );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetRect ( struct KTUIDlg * self, uint32_t id, const tui_rect * r, bool redraw );
+
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetCanFocus ( struct KTUIDlg * self, uint32_t id, bool can_focus );
+
+TUI_EXTERN bool CC KTUIDlgGetWidgetVisible ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetVisible ( struct KTUIDlg * self, uint32_t id, bool visible );
+
+TUI_EXTERN bool CC KTUIDlgGetWidgetChanged ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetChanged ( struct KTUIDlg * self, uint32_t id, bool changed );
+
+TUI_EXTERN bool CC KTUIDlgGetWidgetBoolValue ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetBoolValue ( struct KTUIDlg * self, uint32_t id, bool value );
+
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetBg ( struct KTUIDlg * self, uint32_t id, KTUI_color value );
+TUI_EXTERN rc_t CC KTUIDlgReleaseWidgetBg ( struct KTUIDlg * self, uint32_t id );
+
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetFg ( struct KTUIDlg * self, uint32_t id, KTUI_color value );
+TUI_EXTERN rc_t CC KTUIDlgReleaseWidgetFg ( struct KTUIDlg * self, uint32_t id );
+
+TUI_EXTERN int64_t CC KTUIDlgGetWidgetInt64Value ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetInt64Value ( struct KTUIDlg * self, uint32_t id, int64_t value );
+
+TUI_EXTERN int64_t CC KTUIDlgGetWidgetInt64Min ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetInt64Min ( struct KTUIDlg * self, uint32_t id, int64_t value );
+
+TUI_EXTERN int64_t CC KTUIDlgGetWidgetInt64Max ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetInt64Max ( struct KTUIDlg * self, uint32_t id, int64_t value );
+
+TUI_EXTERN int32_t CC KTUIDlgGetWidgetPercent ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetPercent ( struct KTUIDlg * self, uint32_t id, int32_t value );
+TUI_EXTERN int32_t CC KTUIDlgGetWidgetPrecision ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetPrecision( struct KTUIDlg * self, uint32_t id, int32_t value );
+TUI_EXTERN int32_t CC KTUIDlgCalcPercent ( int64_t value, int64_t max, uint32_t precision );
+
+TUI_EXTERN const char * CC KTUIDlgGetWidgetText( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetText ( struct KTUIDlg * self, uint32_t id, const char * value );
+TUI_EXTERN size_t CC KTUIDlgGetWidgetTextLength( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetTextLength ( struct KTUIDlg * self, uint32_t id, size_t value );
+
+TUI_EXTERN rc_t CC KTUIDlgAddWidgetString ( struct KTUIDlg * self, uint32_t id, const char * txt );
+TUI_EXTERN rc_t CC KTUIDlgAddWidgetStrings ( struct KTUIDlg * self, uint32_t id, VNamelist * src );
+TUI_EXTERN const char * CC KTUIDlgGetWidgetStringByIdx ( struct KTUIDlg * self, uint32_t id, uint32_t idx );
+TUI_EXTERN rc_t CC KTUIDlgRemoveWidgetStringByIdx ( struct KTUIDlg * self, uint32_t id, uint32_t idx );
+TUI_EXTERN rc_t CC KTUIDlgRemoveAllWidgetStrings ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN uint32_t CC KTUIDlgGetWidgetStringCount ( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN uint32_t CC KTUIDlgHasWidgetString( struct KTUIDlg * self, uint32_t id, const char * txt );
+TUI_EXTERN uint32_t CC KTUIDlgGetWidgetSelectedString( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetSelectedString ( struct KTUIDlg * self, uint32_t id, uint32_t selection );
+
+TUI_EXTERN rc_t CC KTUIDlgAddLabel( struct KTUIDlg * self, uint32_t id, const tui_rect * r, const char * caption );
+TUI_EXTERN rc_t CC KTUIDlgAddLabel2( struct KTUIDlg * self, uint32_t id, uint32_t x, uint32_t y, uint32_t w,
+                                     const char * caption );
+
+TUI_EXTERN rc_t CC KTUIDlgAddBtn ( struct KTUIDlg * self, uint32_t id, const tui_rect * r, const char * caption );
+TUI_EXTERN rc_t CC KTUIDlgAddBtn2 ( struct KTUIDlg * self, uint32_t id, uint32_t x, uint32_t y, uint32_t w,
+                                    const char * caption );
+
+TUI_EXTERN rc_t CC KTUIDlgAddCheckBox ( struct KTUIDlg * self, uint32_t id, const tui_rect * r, const char * caption );
+
+TUI_EXTERN rc_t CC KTUIDlgAddInput ( struct KTUIDlg * self, uint32_t id, const tui_rect * r, const char * txt, size_t length );
+
+TUI_EXTERN rc_t CC KTUIDlgAddRadioBox ( struct KTUIDlg * self, uint32_t id, const tui_rect * r );
+
+TUI_EXTERN rc_t CC KTUIDlgAddList ( struct KTUIDlg * self, uint32_t id, const tui_rect * r );
+
+TUI_EXTERN rc_t CC KTUIDlgSetHScroll ( struct KTUIDlg * self, uint32_t id, bool enabled );
+
+
+TUI_EXTERN rc_t CC KTUIDlgAddProgress ( struct KTUIDlg * self, uint32_t id,
+                                        const tui_rect * r, int32_t percent, int32_t precision );
+
+TUI_EXTERN rc_t CC KTUIDlgAddSpinEdit ( struct KTUIDlg * self, uint32_t id,
+                                        const tui_rect * r, int64_t value, int64_t min, int64_t max );
+
+TUI_EXTERN bool CC KTUIDlgHasWidget ( struct KTUIDlg * self, uint32_t id );
+
+
+/* ****************************************************************************************** */
+
+typedef uint32_t TUIWGridStr;
+enum
+{
+    kGrid_Col = 1,
+    kGrid_Row,
+    kGrid_Cell
+};
+
+typedef void ( * TUIWGridCallbackStr  ) ( TUIWGridStr what,
+                                           uint64_t col, uint64_t row, uint32_t col_width,
+                                           const char ** value, void * data, void * instance );
+
+typedef uint32_t TUIWGridInt;
+enum
+{
+    kGrid_Get_Width = 1,
+    kGrid_Set_Width,
+    kGrid_Get_ColCount,
+    kGrid_Get_RowCount,
+    kGrid_Prepare_Page,
+    kGrid_Next_Row
+};
+
+typedef void ( * TUIWGridCallbackInt  ) ( TUIWGridInt what,
+                                           uint64_t col, uint32_t widget_width,
+                                           uint64_t * value, void * data, void * instance );
+
+typedef struct TUIWGrid_data
+{
+    TUIWGridCallbackStr  cb_str;
+    TUIWGridCallbackInt  cb_int;
+    void * data;
+    void * instance;
+    void * int_string_cache;
+    uint64_t col, row, col_offset, row_offset;
+    bool show_header, show_row_header, show_h_scroll, show_v_scroll, row_offset_changed;
+    uint32_t default_col_width, row_hdr_width;
+} TUIWGrid_data;
+
+
+TUI_EXTERN rc_t CC KTUIDlgAddGrid ( struct KTUIDlg * self, uint32_t id,
+                                    const tui_rect * r, TUIWGrid_data * grid_data, bool cached );
+
+TUI_EXTERN TUIWGrid_data * CC KTUIDlgGetWidgetGridData( struct KTUIDlg * self, uint32_t id );
+TUI_EXTERN rc_t CC KTUIDlgSetWidgetGridData( struct KTUIDlg * self, uint32_t id, TUIWGrid_data * grid_data, bool cached );
+
+
+TUI_EXTERN rc_t CC KTUIDlgGetGridCol( struct KTUIDlg * self, uint32_t id, uint64_t *col );
+TUI_EXTERN rc_t CC KTUIDlgSetGridCol( struct KTUIDlg * self, uint32_t id, uint64_t col );
+TUI_EXTERN rc_t CC KTUIDlgGetGridRow( struct KTUIDlg * self, uint32_t id, uint64_t *row );
+TUI_EXTERN rc_t CC KTUIDlgSetGridRow( struct KTUIDlg * self, uint32_t id, uint64_t row );
+
+/* ****************************************************************************************** */
+
+
+TUI_EXTERN rc_t CC KTUIDlgRemove ( struct KTUIDlg * self, uint32_t id );
+
+TUI_EXTERN rc_t CC KTUIDlgDraw( struct KTUIDlg * self, bool forced );
+
+TUI_EXTERN rc_t CC KTUIDlgDrawWidget( struct KTUIDlg * self, uint32_t id );
+
+TUI_EXTERN rc_t CC KTUIDlgDrawCaption( struct KTUIDlg * self );
+
+
+TUI_EXTERN rc_t CC KTUIDlgSetFocus( struct KTUIDlg * self, uint32_t id );
+
+TUI_EXTERN rc_t CC KTUIDlgMoveFocus( struct KTUIDlg * self, bool forward );
+
+TUI_EXTERN bool CC KTUIDlgFocusValid( struct KTUIDlg * self );
+
+TUI_EXTERN uint32_t CC KTUIDlgGetFocusId( struct KTUIDlg * self );
+
+TUI_EXTERN void KTUIDlgPushEvent( struct KTUIDlg * self,
+                       KTUIDlg_event_type event_type, uint32_t widget_id,
+                       uint64_t value_1, uint64_t value_2, void * ptr_0 );
+
+TUI_EXTERN rc_t CC KTUIDlgHandleEvent( struct KTUIDlg * self, tui_event * event );
+
+TUI_EXTERN rc_t CC KTUIDlgGet ( struct KTUIDlg * self, tuidlg_event * event );
+
+
+/* ****************************************************************************************** */
+
+TUI_EXTERN rc_t CC TUI_ShowMessage ( struct KTUI * tui, struct KTUIDlg * parent, const char * caption,
+                       const char * txt, uint32_t x, uint32_t y, uint32_t w, KTUI_color bg1, KTUI_color bg2 );
+
+TUI_EXTERN rc_t CC TUI_YesNoDlg ( struct KTUI * tui, struct KTUIDlg * parent, const char * caption,
+                    const char * question, uint32_t x, uint32_t y, uint32_t w, bool * yes, KTUI_color bg1, KTUI_color bg2 );
+
+TUI_EXTERN rc_t CC TUI_ShowFile( struct KTUI * tui, struct KTUIDlg * parent, const char * caption,
+                   const char * filename, tui_rect * r, KTUI_color bg1, KTUI_color bg2 );
+
+TUI_EXTERN rc_t CC TUI_EditBuffer( struct KTUI * tui, struct KTUIDlg * parent, const char * caption,
+                     char * buffer, size_t buflen, uint32_t x, uint32_t y, uint32_t w, bool * selected,
+                     KTUI_color bg1, KTUI_color bg2 );
+
+TUI_EXTERN rc_t CC TUI_PickFromList( struct KTUI * tui, struct KTUIDlg * parent,
+        const char * caption, const VNamelist * list,
+        uint32_t * selection, tui_rect * r, bool * selected, KTUI_color bg1, KTUI_color bg2 );
+
+TUI_EXTERN rc_t CC FileDlg ( struct KTUI * tui, struct KTUIDlg * parent,
+        char * buffer, uint32_t buffer_size, const char * extension, bool * done, tui_rect * r,
+        uint32_t dir_h, KTUI_color bg1, KTUI_color bg2 );
+
+TUI_EXTERN rc_t CC DirDlg ( struct KTUI * tui, struct KTUIDlg * parent,
+        char * buffer, uint32_t buffer_size, bool * done, tui_rect * r,
+        KTUI_color bg1, KTUI_color bg2, bool allow_dir_create );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_tui_dlg_ */
diff --git a/interfaces/vdb/blob.h b/interfaces/vdb/blob.h
new file mode 100644
index 0000000..2474091
--- /dev/null
+++ b/interfaces/vdb/blob.h
@@ -0,0 +1,154 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_blob_
+#define _h_vdb_blob_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+
+/*--------------------------------------------------------------------------
+ * VBlob
+ *  a collection of data cells
+ */
+typedef struct VBlob VBlob;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+VDB_EXTERN rc_t CC VBlobAddRef ( const VBlob *self );
+VDB_EXTERN rc_t CC VBlobRelease ( const VBlob *self );
+
+
+/* IdRange
+ *  returns id range for blob
+ *
+ *  "first" [ OUT, NULL OKAY ] and "count" [ OUT, NULL OKAY ] -
+ *  id range is returned in these output parameters, where
+ *  at least ONE must be NOT-NULL
+ */
+VDB_EXTERN rc_t CC VBlobIdRange ( const VBlob *self,
+    int64_t *first, uint64_t *count );
+
+/* Size
+ *  returns the size of a blob in bytes
+ *
+ *  AVAILABILITY: version 2.7
+ */
+VDB_EXTERN rc_t CC VBlobSize ( const VBlob * self, size_t * bytes );
+
+
+/* Read
+ *  read entire single cell of byte-aligned data into a buffer
+ *
+ *  "row_id" [ IN ] - allows ReadDirect random access to any cell
+ *  in column
+ *
+ *  "elem_bits" [ IN ] - expected element size in bits, required
+ *  to be compatible with the actual element size, and be a multiple
+ *  of 8 ( byte-aligned ). for non-byte-aligned data, see ReadBits
+ *
+ *  "buffer" [ OUT ] and "blen" [ IN ] - return buffer for row data
+ *  where "blen" gives buffer capacity in elements. the total buffer
+ *  size in bytes == ( "elem_bits" * "blen" + 7 ) / 8.
+ *
+ *  "row_len" [ OUT ] - return parameter for the number of elements
+ *  in the requested row.
+ *
+ *  when the return code is 0, "row_len" will contain the number of
+ *  elements read into buffer. if the return code indicates that the
+ *  buffer is too small, "row_len" will give the required buffer length.
+ */
+VDB_EXTERN rc_t CC VBlobRead ( const VBlob *self, int64_t row_id,
+    uint32_t elem_bits, void *buffer, uint32_t blen, uint32_t *row_len );
+
+
+/* ReadBits
+ *  read single row of potentially bit-aligned cell data into a buffer
+ *
+ *  "elem_bits" [ IN ] - expected element size in bits, required to be
+ *  compatible with the actual element size, and may ( or may not ) be
+ *  a multiple of 8 ( byte aligned ).
+ *
+ *  "start" [ IN ] - zero-based starting index to first element,
+ *  valid from 0 .. row_len - 1
+ *
+ *  "buffer" [ IN ], "boff" [ IN ] and "blen" [ IN ] -
+ *  return buffer for row data, where "boff" is in BITS
+ *  and "blen" is in ELEMENTS.
+ *
+ *  "num_read" [ OUT ] - return parameter for the number of elements
+ *  read, which is <= "blen"
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of elements remaining to be read. specifically,
+ *  "start" + "num_read" + "remaining" == row length, assuming that
+ *  "start" <= row length.
+ */
+VDB_EXTERN rc_t CC VBlobReadBits ( const VBlob *self, int64_t row_id,
+    uint32_t elem_bits, uint32_t start, void *buffer, uint32_t boff,
+    uint32_t blen, uint32_t *num_read, uint32_t *remaining );
+
+
+/* CellData
+ *  access pointer to single cell of potentially bit-aligned cell data
+ *
+ *  "elem_bits" [ OUT, NULL OKAY ] - optional return parameter for
+ *  element size in bits
+ *
+ *  "base" [ OUT ] and "boff" [ OUT, NULL OKAY ] -
+ *  compound return parameter for pointer to row starting bit
+ *  where "boff" is in BITS
+ *
+ *  "row_len" [ OUT, NULL OKAY ] - the number of elements in cell
+ */
+VDB_EXTERN rc_t CC VBlobCellData ( const VBlob *self, int64_t row_id,
+    uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_vdb_blob_ */
diff --git a/interfaces/vdb/built-in.vschema b/interfaces/vdb/built-in.vschema
new file mode 100644
index 0000000..25cb28b
--- /dev/null
+++ b/interfaces/vdb/built-in.vschema
@@ -0,0 +1,412 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * VDB built-in functions, formats and types
+ */
+version 1;
+
+
+/*--------------------------------------------------------------------------
+ * types
+ */
+
+// Row id range consist of row_id_start and row_id_stop
+typedef I64 vdb:row_id_range [ 2 ];
+
+
+/*--------------------------------------------------------------------------
+ * typesets
+ */
+typeset integer_set { I8, U8, I16, U16, I32, U32, I64, U64 };
+typeset float_set { F32, F64 };
+typeset numeric_set { integer_set, float_set };
+typeset text_set { utf8, utf16, utf32, ascii };
+typeset text8_set { utf8, ascii };
+typeset transpose_set { B8, B16, B32, B64 };
+
+
+/*--------------------------------------------------------------------------
+ * formats
+ */
+fmtdef merged_fmt;
+fmtdef transposed_fmt;
+fmtdef delta_averaged_fmt;
+
+
+/*--------------------------------------------------------------------------
+ * constants
+ */
+const U8 ALIGN_LEFT = 0;
+const U8 ALIGN_RIGHT = 1;
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+
+/* cast
+ *  performs a "C++ reinterpret_cast" style cast
+ *  rewrites input as required to produce output
+ *
+ *  legal operations include numeric_set -> numeric_set,
+ *  numeric <-> character, etc.
+ */
+function
+any cast #1.0 ( any in )
+    = vdb:cast;
+
+/* bit_or
+ *  performs a bitwise operation 'OR' for every byte in A and B
+ *  A and B are not neccesarily have the same size
+ *  the resulting row will have the size of B while OR operation is done for portion of A overlapping B
+ *  For different sizes of A and B 'align' parameter provides what edge of A and B are aligned
+ *  possible values ALIGN_LEFT, ALIGN_RIGHT
+ * 
+ */
+function < type T >
+T  bit_or #1 < U8 align > ( T  A, T B  )
+    = vdb:bit_or;
+
+/* trim
+ * performs trimming of value val from column A
+ * align provides left- or right- trimming
+ */
+function < type T >
+T trim #1 < U8 align, T val > ( T A )
+    = vdb:trim;
+
+
+/* redimension
+ *  performs a change of dimension without changing bit pattern
+ */
+function
+any redimension #1.0 ( any in )
+    = vdb:redimension;
+
+
+/* row_id
+ *  returns the row id of a request
+ */
+function
+I64 row_id #1.0 ()
+    = vdb:row_id;
+
+
+/* row_len
+ *  returns the number of elements in a row
+ *
+ *  "in" [ DATA ] - column supplying row. if row does not exist
+ *  in column, the resultant length is 0.
+ */
+function
+U32 row_len #1.0 ( any in )
+    = vdb:row_len;
+
+
+/* fixed_row_len
+ *  returns non-zero if the entire page
+ *  has a uniform row-length, zero otherwise
+ *
+ *  "in" [ DATA ] - column to query
+ */
+function
+U32 fixed_row_len #1.0 ( any in )
+    = vdb:fixed_row_len;
+
+
+/* compare
+ *  evaluates src [ i ] == cmp [ i ]
+ *  causes writing exception if unequal.
+ *
+ *  For whole types, equality is bitwise equal
+ *  for floating point types see below.
+ *
+ *  "T" [ TYPE ] - base element type to be processed
+ *
+ *  "sig_bits" [ OPTIONAL CONST >= 1 ] - for floating point types, ignored
+ *  otherwise, the number of significant binary digits in the mantissas to
+ *  compare such that |x - y| <= 1, for corresponding numbers x (in a) and
+ *  y (in b) both scaled according to sig_bits and their common magnitude.
+ *  "sig_bits" may be an array, if so "sel" is required (see below).
+ *
+ *  "src" [ DATA ] - standard input data derived from source
+ *
+ *  "cmp" [ DATA ] - feedback data after being written and re-read
+ *
+ */
+validate function < type T >
+void compare #1.0 < * U32 sig_bits > ( T src, T cmp )
+    = vdb:compare;
+
+validate function < type T >
+void no_compare #1.0 ( T src, T cmp )
+    = vdb:no_compare;
+
+
+/* compare2f
+ *  evaluates src [ i ] == cmp [ i ]
+ *  causes writing exception if unequal.
+ *
+ *  "T" [ TYPE ] - base element type to be processed
+ *
+ *  "sig_bits" [ CONST >= 1 ] - for floating point types, ignored otherwise,
+ *  array containing the number of significant binary digits in the mantissas
+ *  to compare such that |x - y| <= 1, for corresponding numbers x (in a) and
+ *  y (in b) both scaled according to sig_bits and their common magnitude.
+ *
+ *  "src" [ DATA ] - standard input data derived from source
+ *
+ *  "cmp" [ DATA ] - feedback data after being written and re-read
+ *
+ *  "sel" [ DATA ] - data to select which element of "sig_bits" to
+ *  use for the comparison.  The valid values of "sel" are
+ *  [0 .. length sig_bits).
+ *
+validate function < type T >
+void compare2f #1.0 < U32 sig_bits > ( float_set src, float_set cmp, T sel )
+    = vdb:compare2f;
+*/
+
+/* range_validate
+ *  passes input through if all values fall between lower and
+ *  upper bounds, INCLUSIVE
+ *
+ *  "T" [ TYPE ] - type to be validated
+ *
+ *  "lower" [ CONST ] and "upper" [ CONST ] - inclusive
+ *  bounds on input values
+ *
+ *  "in" [ DATA ] - data to be validated
+ */
+function < type T >
+T range_validate #1.0 < T lower, T upper > ( T in )
+    = vdb:range_validate;
+
+
+/* select
+ *  return first non-empty input for id
+ *  inputs are taken from first to last
+ *
+ *  "T" [ TYPE ] - data type of selection
+ *
+ *  "first" [ DATA ] - first of N inputs
+ *
+ *  "second" [ DATA ] - second of N inputs
+ *  all other inputs are optional and must
+ *  be compatible with type "T"
+ */
+function < type T >
+T select #1.0 ( T first, T second, ... )
+    = vdb:select;
+
+
+/* transpose
+ *  transpose a page of unformatted data
+ *
+ *  for example - convert a simple page of values,
+ *  where vertical scale is row id and horizontal element index:
+ *
+ *        1   2   3
+ *      +---+---+---+
+ *    1 | a | b | c |
+ *      +---+---+---+
+ *    2 | d | e | f |
+ *      +---+---+---+
+ *    3 | g | h | i |
+ *      +---+---+---+
+ *    4 | j | k | l |
+ *      +---+---+---+
+ *
+ *  into:
+ *
+ *        1   2   3   4
+ *      +---+---+---+---+
+ *    1 | a | d | g | j |
+ *      +---+---+---+---+
+ *    2 | b | e | h | k |
+ *      +---+---+---+---+
+ *    3 | c | f | i | l |
+ *      +---+---+---+---+
+ *
+ *  variable row-lengths are supported. The output blob is
+ *  formatted, meaning that the result can no longer be addressed
+ *  as a matrix, but the transposition has be applied to data.
+ *
+ *  "in" [ DATA ] - unformatted data to be transposed
+ */
+function
+transposed_fmt transpose #1 ( transpose_set in )
+    = vdb:transpose;
+
+
+/* detranspose
+ *  pardoning the awful name, apply a transposition on the result
+ *  of "transpose" to produce the original blob. "transpose"
+ *  itself cannot be reused because of its signature.
+ */
+function
+transpose_set detranspose #1 ( transposed_fmt in )
+    = vdb:detranspose;
+
+/*
+ * delta_average computes average representation of the maximium 
+ * lengh row and deltas every row against it
+ */
+function
+delta_averaged_fmt delta_average #1 ( any in ) 
+     = vdb:delta_average;
+
+function
+any undelta_average #1 ( delta_averaged_fmt in )
+    = vdb:undelta_average;
+
+/* merge
+ *  merges all input blobs of any format/type into a single blob
+ */
+function
+merged_fmt merge #1.0 ( any in, ... )
+    = vdb:merge;
+
+
+/* split
+ *  extracts a single blob from a merged blob by index
+ *
+ *  "idx" [ CONST ] - blob index
+ */
+
+function
+any split #1.0 < U32 idx > ( merged_fmt in )
+    = vdb:split;
+
+
+/* meta:read
+ *  reads table metadata node as a row
+ * meta:value
+ *  reads metadata node as single value,
+ *  performing size conversion if necessary,
+ *  e.g. I8 TO I64, I32 TO I16
+ *
+ *  "T" [ TYPE ] - cast data type of metadata node
+ *
+ *  "node" [ CONST ] - path to metadata node
+ */
+function < type T >
+T meta:read #1.0 < ascii node, * bool deterministic > ();
+
+function < type T >
+T meta:value #1.0 < ascii node, * bool deterministic > ();
+
+
+/* meta:write
+ *  writes row data to table metadata node
+ *
+ *  "T" [ TYPE ] - cast data type of metadata node
+ *
+ *  "node" [ CONST ] - path to metadata node
+ *
+ *  "in" [ DATA ] - source of row data
+ */
+function < type T >
+T meta:write #1.0 < ascii node > ( T in );
+
+
+/* meta:attr:read
+ *  reads table metadata attribute as a row
+ *
+ *  "node" [ CONST ] - path to metadata node
+ *
+ *  "attr" [ CONST ] - attribute name on node
+ */
+function
+ascii meta:attr:read #1.0 < ascii node, ascii attr, * bool deterministic > ();
+
+
+/* meta:attr:write
+ *  write row data as table metadata attribute
+ *
+ *  "node" [ CONST ] - path to metadata node
+ *
+ *  "attr" [ CONST ] - attribute name on node
+ */
+function
+ascii meta:attr:write #1.0 < ascii node, ascii attr > ( ascii in );
+
+
+/* parameter:read
+ *  reads named cursor parameter text
+ *
+ *  "name" [ CONST ] - parameter name
+ */
+function
+text8_set parameter:read #1.0 < ascii name, * bool deterministic > ();
+
+
+/* environment:read
+ *  reads named environment variable text
+ *
+ *  "name" [ CONST ] - environment variable name
+ */
+function
+text8_set environment:read #1.0 < ascii name > ();
+
+// case sensivity mode
+const U8 CASE_SENSITIVE         =  0;
+const U8 CASE_INSENSITIVE_LOWER =  1;
+const U8 CASE_INSENSITIVE_UPPER =  2;
+
+/* idx:text:project
+ *  perform a reverse lookup in an index
+ *  if key not found then use substitute
+ *
+ *  "index_name" [ CONST ] - name of text index
+ *
+ *  "substitute" [ DATA, OPTIONAL ] - source
+ *  of values to substitute for values not
+ *  found in the index.
+ *
+ *  Version 1.1: look into "substitute" (if available) first and then to the index,
+ *  added parameter "case_sensitivity"
+ */
+function text8_set idx:text:project #1.1 < ascii index_name, * U8 case_sensitivity > ( * text8_set substitute );
+
+
+/* idx:text:insert
+ *  inserts "key" into index. returns key if insertion into index failed or
+ *  when "case_insensitive" is true
+ *
+ *  Version 1.1: added parameter "case_sensitivity"
+ */
+function text8_set idx:text:insert #1.1 < ascii index_name, * U8 case_sensitivity > ( text8_set key );
+
+
+/* idx:text:lookup
+ *  perform a lookup in an index
+ *  returns vdb:row_id_range associated with the
+ *
+ *  Version 1.1: added parameter "case_sensitivity"
+ */
+function vdb:row_id_range  idx:text:lookup #1.1 < ascii index_name , ascii query_by_name, * U8 case_sensitivity > ();
diff --git a/interfaces/vdb/cursor.h b/interfaces/vdb/cursor.h
new file mode 100644
index 0000000..e596be6
--- /dev/null
+++ b/interfaces/vdb/cursor.h
@@ -0,0 +1,490 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_cursor_
+#define _h_vdb_cursor_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_namelist_
+#include <klib/namelist.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VBlob;
+struct VTable;
+struct VTypedesc;
+struct VTypedecl;
+
+
+/*--------------------------------------------------------------------------
+ * KCreateMode
+ *  mode definitions for cursor creation
+ *
+ *  NB - typedef'd as uint32_t in <klib/defs.h> to ensure uniformly
+ *  predictable binary representation.
+ */
+enum
+{
+    kcmUpdate,          /* kcmOpen   */
+    kcmReplace,         /* kcmInit   */
+    kcmInsert           /* kcmCreate */
+};
+
+/*--------------------------------------------------------------------------
+ * VCursor
+ *  a row cursor onto a VTable
+ */
+typedef struct VCursor VCursor;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+VDB_EXTERN rc_t CC VCursorAddRef ( const VCursor *self );
+VDB_EXTERN rc_t CC VCursorRelease ( const VCursor *self );
+
+
+/* CreateCursor
+ *  creates a cursor object onto table
+ *  multiple read cursors are allowed
+ *  only a single write cursor is allowed
+ *
+ *  "curs" [ OUT ] - return parameter for newly created cursor
+ *
+ *  "mode" [ IN ] - describes update behavior
+ *    kcmUpdate   : allow inserts or updates
+ *    kcmReplace  : replace all existing rows with newly written rows
+ *    kcmInsert   : allow only inserts, i.e. new rows
+ *
+ *  NB - CreateCursorRead will be deprecated in future releases
+ *  use CreateCachedCursorRead instead.
+ */
+VDB_EXTERN rc_t CC VTableCreateCursorRead ( struct VTable const *self, const VCursor **curs );
+VDB_EXTERN rc_t CC VTableCreateCursorWrite ( struct VTable *self, VCursor **curs, KCreateMode mode );
+
+
+/* CreateCachedCursorRead
+ *  creates a read cursor object onto table with a cache limit in bytes
+ *
+ *  AVAILABILITY: version 2.1
+ *
+ *  "curs" [ OUT ] - return parameter for newly created cursor
+ *
+ *  "capacity" [ IN ] - the maximum bytes to cache on the cursor before
+ *  dropping least recently used blobs
+ */
+VDB_EXTERN rc_t CC VTableCreateCachedCursorRead ( struct VTable const *self,
+    const VCursor **curs, size_t capacity );
+
+
+/* AddColumn
+ *  add a column to an unopened cursor
+ *
+ *  "idx" [ OUT ] - return parameter for column index
+ *
+ *  "name" [ IN ] - NUL terminated column name spec.
+ *  to identify a column by name, provide the column name
+ *  by itself. if there are multiple types available under
+ *  that name, the default type for that column will be
+ *  selected. to select a specific type, the name may
+ *  be cast to that type using a cast expression, e.g.
+ *    "( type ) name"
+ *
+ * NB - may return a non-zero status code of rcColumn, rcExists
+ *  if the column was not added. the return "idx" will still
+ *  be set properly and this does NOT indicate an error.
+ */
+VDB_EXTERN rc_t CC VCursorAddColumn ( const VCursor *self,
+    uint32_t *idx, const char *name, ... );
+VDB_EXTERN rc_t CC VCursorVAddColumn ( const VCursor *self,
+    uint32_t *idx, const char *name, va_list args );
+
+
+/* GetColumnIdx
+ *  retrieve column index by name spec
+ *
+ *  "idx" [ OUT ] - return parameter for column index
+ *
+ *  "name" [ IN ] - NUL terminated column name spec.
+ */
+VDB_EXTERN rc_t CC VCursorGetColumnIdx ( const VCursor *self,
+    uint32_t *idx, const char *name, ... );
+VDB_EXTERN rc_t CC VCursorVGetColumnIdx ( const VCursor *self,
+    uint32_t *idx, const char *name, va_list args );
+
+
+/* Datatype
+ *  returns typedecl and/or typedef for column data
+ *
+ *  "idx" [ IN ] - column index
+ *
+ *  "type" [ OUT, NULL OKAY ] - returns the column type declaration
+ *
+ *  "def" [ OUT, NULL OKAY ] - returns the definition of the type
+ *  returned in "type_decl"
+ *
+ * NB - one of "type" and "def" must be non-NULL
+ */
+VDB_EXTERN rc_t CC VCursorDatatype ( const VCursor *self, uint32_t idx,
+    struct VTypedecl *type, struct VTypedesc *desc );
+
+
+/* IdRange
+ *  returns id range for column
+ *
+ *  "idx" [ IN, DEFAULT ZERO ] - single column index or
+ *  zero to indicate the range for all columns in cursor
+ *
+ *  "id" [ IN ] - page containing this row id is target
+ *
+ *  "first" [ OUT, NULL OKAY ] and "count" [ OUT, NULL OKAY ] -
+ *  id range is returned in these output parameters, where
+ *  at least ONE must be NOT-NULL
+ */
+VDB_EXTERN rc_t CC VCursorIdRange ( const VCursor *self, uint32_t idx,
+    int64_t *first, uint64_t *count );
+
+
+/* Open
+ *  open cursor, resolving schema for the set of opened columns
+ *
+ *  when cursor is created for read, its initial row id
+ *  is set to first row available in any contained column.
+ *
+ *  when cursor is created for write, its initial row id
+ *  is set for inserts ( appending ). when empty, initial
+ *  row id is set to 1. otherwise, it is set to 1 beyond
+ *  the last row available in any contained column.
+ *
+ *  NB - there is no corresponding "Close"
+ *  use "Release" instead.
+ */
+VDB_EXTERN rc_t CC VCursorOpen ( const VCursor *self );
+
+
+/* RowId
+ *  report current row id
+ * SetRowId
+ *  seek to given row id
+ */
+VDB_EXTERN rc_t CC VCursorRowId ( const VCursor *self, int64_t *row_id );
+VDB_EXTERN rc_t CC VCursorSetRowId ( const VCursor *self, int64_t row_id );
+
+
+/* FindNextRowId
+ * FindNextRowIdDirect
+ *  returns next non-empty row given either the cursor's current row-id + 1,
+ *  or a direct "start_id" provided as a parameter.
+ *
+ *  if the starting row-id has a non-null cell, that row-id will be returned.
+ *  otherwise, the first row-id following the starting id that has a non-null cell
+ *  will be returned. in the event that no non-null cells can be found, the returned
+ *  rc_t will have RCState of rcNotFound.
+ *
+ *  "idx" [ IN, ZERO OKAY ] - when non-zero, represents the one-based index of a
+ *  particular column. when zero, represents all columns simultaneously.
+ *
+ *  "start_id" [ IN ] - when specified directly, gives a starting row id to
+ *  use when starting the search for non-null cells. if the row "start_id"
+ *  contains non-null cells, it will be returned immediately.
+ *
+ *  when "start_id" is not used ( VCursorFindNextRowId ), the cursor's current
+ *  row-id + 1 will be substituted. the meaning is that if the last accessed
+ *  row was valid, this will find the next valid row. if the last accessed row
+ *  was not valid ( null cell ), then it is known to be invalid and the search
+ *  starts with the following row.
+ *
+ *  "next" [ OUT ] - return parameter for found row-id. when the "rc_t" is 0
+ */
+VDB_EXTERN rc_t CC VCursorFindNextRowId ( const VCursor *self,
+    uint32_t idx, int64_t * next );
+VDB_EXTERN rc_t CC VCursorFindNextRowIdDirect ( const VCursor *self,
+    uint32_t idx, int64_t start_id, int64_t * next );
+
+
+/* OpenRow
+ *  open currently closed row indicated by row id
+ */
+VDB_EXTERN rc_t CC VCursorOpenRow ( const VCursor *self );
+
+/* CommitRow
+ *  commit row after writing
+ *  prevents further writes
+ */
+VDB_EXTERN rc_t CC VCursorCommitRow ( VCursor *self );
+
+/* RepeatRow
+ *  repeats the current row by the count provided
+ *  row must have been committed
+ *
+ *  AVAILABILITY: version 2.6
+ *
+ *  "count" [ IN ] - the number of times to repeat
+ *  the current row.
+ */
+VDB_EXTERN rc_t CC VCursorRepeatRow ( VCursor *self, uint64_t count );
+
+/* CloseRow
+ *  balances OpenRow message
+ *  if there are uncommitted modifications,
+ *  discard all changes. otherwise,
+ *  advance to next row
+ */
+VDB_EXTERN rc_t CC VCursorCloseRow ( const VCursor *self );
+
+
+/* FlushPage
+ *  forces flush of all buffered page data
+ *  fails if row is open
+ *
+ *  pages are normally auto-committed based upon
+ *  size and column affinity
+ */
+VDB_EXTERN rc_t CC VCursorFlushPage ( VCursor *self );
+
+
+/* GetBlob
+ *  retrieve a blob of data containing the current row id
+ * GetBlobDirect
+ *  retrieve a blob of data containing the requested row id
+ *
+ *  "blob" [ OUT ] - return parameter for a new reference
+ *  to VBlob containing requested cell. NB - must be released
+ *  via VBlobRelease when no longer needed.
+ *
+ *  "row_id" [ IN ] - allows ReadDirect random access to any cell
+ *  in column
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ */
+VDB_EXTERN rc_t CC VCursorGetBlob ( const VCursor *self,
+    struct VBlob const **blob, uint32_t col_idx );
+VDB_EXTERN rc_t CC VCursorGetBlobDirect ( const VCursor *self,
+    struct VBlob const **blob, int64_t row_id, uint32_t col_idx );
+
+
+/* Read
+ *  read entire single row of byte-aligned data into a buffer
+ * ReadDirect
+ *  bypass the need to use SetRowId/OpenRow/CloseRow for addressing
+ *
+ *  "row_id" [ IN ] - allows ReadDirect random access to any cell
+ *  in column
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ *
+ *  "elem_bits" [ IN ] - expected element size in bits, required
+ *  to be compatible with the actual element size, and be a multiple
+ *  of 8 ( byte-aligned ). for non-byte-aligned data, see ReadBits
+ *
+ *  "buffer" [ OUT ] and "blen" [ IN ] - return buffer for row data
+ *  where "blen" gives buffer capacity in elements. the total buffer
+ *  size in bytes == ( "elem_bits" * "blen" + 7 ) / 8.
+ *
+ *  "row_len" [ OUT ] - return parameter for the number of elements
+ *  in the requested row.
+ *
+ *  when the return code is 0, "row_len" will contain the number of
+ *  elements read into buffer. if the return code indicates that the
+ *  buffer is too small, "row_len" will give the required buffer length.
+ */
+VDB_EXTERN rc_t CC VCursorRead ( const VCursor *self, uint32_t col_idx,
+    uint32_t elem_bits, void *buffer, uint32_t blen, uint32_t *row_len );
+VDB_EXTERN rc_t CC VCursorReadDirect ( const VCursor *self, int64_t row_id, uint32_t col_idx,
+    uint32_t elem_bits, void *buffer, uint32_t blen, uint32_t *row_len );
+
+
+/* ReadBits
+ *  read single row of potentially bit-aligned column data into a buffer
+ * ReadBitsDirect
+ *  bypass the need to use SetRowId/OpenRow/CloseRow for addressing
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ *
+ *  "elem_bits" [ IN ] - expected element size in bits, required to be
+ *  compatible with the actual element size, and may ( or may not ) be
+ *  a multiple of 8 ( byte aligned ).
+ *
+ *  "start" [ IN ] - zero-based starting index to first element,
+ *  valid from 0 .. row_len - 1
+ *
+ *  "buffer" [ IN ], "boff" [ IN ] and "blen" [ IN ] -
+ *  return buffer for row data, where "boff" is in BITS
+ *  and "blen" is in ELEMENTS.
+ *
+ *  "num_read" [ OUT ] - return parameter for the number of elements
+ *  read, which is <= "blen"
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of elements remaining to be read. specifically,
+ *  "start" + "num_read" + "remaining" == row length, assuming that
+ *  "start" <= row length.
+ */
+VDB_EXTERN rc_t CC VCursorReadBits ( const VCursor *self, uint32_t col_idx,
+    uint32_t elem_bits, uint32_t start, void *buffer, uint32_t boff,
+    uint32_t blen, uint32_t *num_read, uint32_t *remaining );
+VDB_EXTERN rc_t CC VCursorReadBitsDirect ( const VCursor *self, int64_t row_id, uint32_t col_idx,
+    uint32_t elem_bits, uint32_t start, void *buffer, uint32_t boff,
+    uint32_t blen, uint32_t *num_read, uint32_t *remaining );
+
+
+/* CellData
+ *  access pointer to single cell of potentially bit-aligned column data
+ * CellDataDirect
+ *  bypass the need to use SetRowId/OpenRow/CloseRow for addressing
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ *
+ *  "elem_bits" [ OUT, NULL OKAY ] - optional return parameter for
+ *  element size in bits
+ *
+ *  "base" [ OUT ] and "boff" [ OUT, NULL OKAY ] -
+ *  compound return parameter for pointer to row starting bit
+ *  where "boff" is in BITS
+ *
+ *  "row_len" [ OUT, NULL OKAY ] - the number of elements in cell
+ */
+VDB_EXTERN rc_t CC VCursorCellData ( const VCursor *self, uint32_t col_idx,
+    uint32_t *elem_bits, const void **base, uint32_t *boff,
+    uint32_t *row_len );
+VDB_EXTERN rc_t CC VCursorCellDataDirect ( const VCursor *self, int64_t row_id,
+    uint32_t col_idx, uint32_t *elem_bits, const void **base,
+    uint32_t *boff, uint32_t *row_len );
+
+
+/* VCursorDataPrefetch
+ * -- will prefecth rows into CursorCache (if it exists)
+ * -- no OUT parameters - just primes the cache 
+ * -- will cache every produced blob (even a small one)
+ * -- will suspend flushing the cache after inserting first row
+ * -- conducts sort-unique on row_ids to linearize data access
+ *
+ * "row_ids" [ IN ] - rows to be prefetched
+ * 
+ * "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ * 
+ * "num_rows" [ IN ] -  number of rows in row_ids
+ *
+ * "min/max_valid_row_id [IN] - ignor all row_ids[i] which will not hit this range
+ * 
+ * "continue_on_error" [ IN ] - whether to continue on a failure to prefetch a rows
+ */
+
+LIB_EXPORT rc_t CC VCursorDataPrefetch ( const VCursor * self,
+    const int64_t * row_ids, uint32_t col_idx, uint32_t num_rows,
+    int64_t min_valid_row_id, int64_t max_valid_row_id, bool continue_on_error );
+
+
+/* Default
+ *  give a default row value for cell
+ *  TBD - document full cell data, not append
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ *
+ *  "elem_bits" [ IN ] - stated element size in bits, required
+ *  to be compatible with the actual element size
+ *
+ *  "buffer" [ IN ] and "boff" [ IN ] - compound pointer and offset
+ *  to start of default row data where "boff" is in BITS
+ *
+ *  "row_len" [ IN ] - the number of elements in default row
+ */
+VDB_EXTERN rc_t CC VCursorDefault ( VCursor *self, uint32_t col_idx,
+    bitsz_t elem_bits, const void *buffer, bitsz_t boff,
+    uint64_t row_len );
+
+
+/* Write
+ *  append bit-aligned column data to cell
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ *
+ *  "elem_bits" [ IN ] - stated element size in bits, required
+ *  to be compatible with the actual element size
+ *
+ *  "buffer" [ IN ] and "boff" [ IN ] - compound pointer and offset
+ *  to start of default row data where "boff" is in BITS
+ *
+ *  "count" [ IN ] - the number of elements to append
+ */
+VDB_EXTERN rc_t CC VCursorWrite ( VCursor *self, uint32_t col_idx,
+    bitsz_t elem_bits, const void *buffer, bitsz_t boff,
+    uint64_t count );
+
+
+/* Commit
+ *  commit changes made to cursor
+ *  fails if row is open
+ */
+VDB_EXTERN rc_t CC VCursorCommit ( VCursor *self );
+
+
+/* OpenParent
+ *  duplicate reference to parent table
+ *  NB - returned reference must be released
+ */
+VDB_EXTERN rc_t CC VCursorOpenParentRead ( const VCursor *self, struct VTable const **tbl );
+VDB_EXTERN rc_t CC VCursorOpenParentUpdate ( VCursor *self, struct VTable **tbl );
+
+
+/* GetUserData
+ * SetUserData
+ *  store/retrieve an opaque pointer to user data
+ *
+ *  "data" [ OUT ] - return parameter for getting data
+ *  "data" [ IN ] - parameter for setting data
+ *
+ *  "destroy" [ IN, NULL OKAY ] - optional destructor param
+ *  invoked from destructor of "self"
+ */
+VDB_EXTERN rc_t CC VCursorGetUserData ( const VCursor *self, void **data );
+VDB_EXTERN rc_t CC VCursorSetUserData ( const VCursor *self,
+    void *data, void ( CC * destroy ) ( void *data ) );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_vdb_cursor_ */
diff --git a/interfaces/vdb/cursor.hpp b/interfaces/vdb/cursor.hpp
new file mode 100644
index 0000000..ba89e2d
--- /dev/null
+++ b/interfaces/vdb/cursor.hpp
@@ -0,0 +1,388 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb_cursor_
+#define _hpp_vdb_cursor_
+
+#ifndef _h_vdb_cursor_
+#include <vdb/cursor.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * VCursor
+ *  a row cursor onto a VTable
+ */
+struct VCursor
+{
+    /* AddRef
+     * Release
+     *  all objects are reference counted
+     *  NULL references are ignored
+     */
+    inline rc_t AddRef () const throw()
+    { return VCursorAddRef ( this ); }
+
+    inline rc_t Release () const throw()
+    { return VCursorRelease ( this ); }
+
+
+    /* AddColumn
+     *  add a column to an unopened cursor
+     *
+     *  "idx" [ OUT ] - return parameter for column index
+     *
+     *  "name" [ IN ] - NUL terminated column name spec.
+     *  to identify a column by name, provide the column name
+     *  by itself. if there are multiple types available under
+     *  that name, the default type for that column will be
+     *  selected. to select a specific type, the name may
+     *  be cast to that type using a cast expression, e.g.
+     *    "( type ) name"
+     *  the special name "*" may be added to a read cursor.
+     */
+    inline rc_t AddColumn ( uint32_t *idx,
+        const char *name, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VCursorVAddColumn ( this, idx, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t AddColumn ( uint32_t *idx,
+        const char *name, va_list args ) const throw()
+    { return VCursorVAddColumn ( this, idx, name, args ); }
+
+
+    /* GetColumnIdx
+     *  retrieve column index by name spec
+     *
+     *  "idx" [ OUT ] - return parameter for column index
+     *
+     *  "name" [ IN ] - NUL terminated column name spec.
+     */
+    inline rc_t GetColumnIdx ( uint32_t *idx,
+        const char *name, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VCursorVGetColumnIdx ( this, idx, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t GetColumnIdx ( uint32_t *idx,
+        const char *name, va_list args ) const throw()
+    { return  VCursorVGetColumnIdx ( this, idx, name, args ); }
+
+
+    /* Datatype
+     *  returns typedecl and/or typedef for column data
+     *
+     *  "idx" [ IN ] - column index
+     *
+     *  "type" [ OUT, NULL OKAY ] - returns the column type declaration
+     *
+     *  "def" [ OUT, NULL OKAY ] - returns the definition of the type
+     *  returned in "type_decl"
+     *
+     * NB - one of "type" and "def" must be non-NULL
+     */
+    inline rc_t Datatype ( uint32_t idx, VTypedecl *type, 
+        VTypedesc *desc ) const throw()
+    { return VCursorDatatype ( this, idx, type, desc ); }
+
+
+    /* IdRange
+     *  returns id range for column
+     *
+     *  "idx" [ IN, OPTIONAL ] - single column index or
+     *  zero to indicate the range for all columns in cursor
+     *
+     *  "id" [ IN ] - page containing this row id is target
+     *
+     *  "first" [ OUT, NULL OKAY ] and "last" [ OUT, NULL OKAY ] -
+     *  id range is returned in these output parameters, where
+     *  at least ONE must be NOT-NULL
+     */
+    inline rc_t IdRange ( int64_t *first, uint64_t *count ) const throw()
+    { return VCursorIdRange ( this, 0, first, count ); }
+
+    inline rc_t IdRange ( uint32_t idx, int64_t *first,
+        uint64_t *count ) const throw()
+    { return VCursorIdRange ( this, idx, first, count ); }
+
+
+    /* Open
+     *  open cursor, resolving schema for the set of opened columns
+     *
+     *  when cursor is created for read, its initial row id
+     *  is set to first row available in any contained column.
+     *
+     *  when cursor is created for write, its initial row id
+     *  is set for inserts ( appending ). when empty, initial
+     *  row id is set to 1. otherwise, it is set to 1 beyond
+     *  the last row available in any contained column.
+     *
+     *  NB - there is no corresponding "Close"
+     *  use "Release" instead.
+     */
+    inline rc_t Open () const throw()
+    { return VCursorOpen ( this ); }
+
+
+    /* RowId
+     *  report current row id
+     * SetRowId
+     *  seek to given row id
+     */
+    inline rc_t RowId ( int64_t *row_id ) const throw()
+    { return VCursorRowId ( this, row_id ); }
+
+    inline rc_t SetRowId ( int64_t row_id ) const throw()
+    { return VCursorSetRowId ( this, row_id ); }
+
+
+    /* OpenRow
+     *  open currently closed row indicated by row id
+     */
+    inline rc_t OpenRow () const throw()
+    { return VCursorOpenRow ( this ); }
+
+
+    /* CommitRow
+     *  commit row after writing
+     *  prevents further writes
+     */
+    inline rc_t CommitRow () throw()
+    { return VCursorCommitRow ( this ); }
+
+
+    /* CloseRow
+     *  balances OpenRow message
+     *  if there are uncommitted modifications,
+     *  discard all changes. otherwise,
+     *  advance to next row
+     */
+    inline rc_t CloseRow () const throw()
+    { return VCursorCloseRow ( this ); }
+
+
+    /* FlushPage
+     *  forces flush of all buffered page data
+     *  fails if row is open
+     *
+     *  pages are normally auto-committed based upon
+     *  size and column affinity
+     */
+    inline rc_t FlushPage () throw()
+    { return VCursorFlushPage ( this ); }
+
+
+    /* Read
+     *  read entire single row of byte-aligned data into a buffer
+     *
+     *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+     *
+     *  "elem_bits" [ IN ] - expected element size in bits, required
+     *  to be compatible with the actual element size, and be a multiple
+     *  of 8 ( byte-aligned ). for non-byte-aligned data, see ReadBits
+     *
+     *  "buffer" [ OUT ] and "blen" [ IN ] - return buffer for row data
+     *  where "blen" gives buffer capacity in elements. the total buffer
+     *  size in bytes == ( "elem_bits" * "blen" + 7 ) / 8.
+     *
+     *  "row_len" [ OUT ] - return parameter for the number of elements
+     *  in the requested row.
+     *
+     *  when the return code is 0, "row_len" will contain the number of
+     *  elements read into buffer. if the return code indicates that the
+     *  buffer is too small, "row_len" will give the required buffer length.
+     */
+    inline rc_t Read ( uint32_t col_idx, uint32_t elem_bits,
+        void *buffer, uint32_t blen, uint32_t *row_len ) const throw()
+    {
+        return VCursorRead ( this, col_idx, elem_bits, buffer, blen,  row_len );
+    }
+    inline rc_t Read ( int64_t row_id, uint32_t col_idx, uint32_t elem_bits,
+        void *buffer, uint32_t blen, uint32_t *row_len ) const throw()
+    {
+        return VCursorReadDirect ( this, row_id, col_idx, elem_bits, buffer, blen, row_len );
+    }
+
+
+    /* ReadBits
+     *  read single row of potentially bit-aligned column data into a buffer
+     *
+     *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+     *
+     *  "elem_bits" [ IN ] - expected element size in bits, required to be
+     *  compatible with the actual element size, and may ( or may not ) be
+     *  a multiple of 8 ( byte aligned ).
+     *
+     *  "start" [ IN ] - zero-based starting index to first element,
+     *  valid from 0 .. row_len - 1
+     *
+     *  "buffer" [ IN ], "boff" [ IN ] and "blen" [ IN ] -
+     *  return buffer for row data, where "boff" is in BITS
+     *  and "blen" is in ELEMENTS.
+     *
+     *  "num_read" [ OUT ] - return parameter for the number of elements
+     *  read, which is <= "blen"
+     *
+     *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+     *  the number of elements remaining to be read. specifically,
+     *  "start" + "num_read" + "remaining" == row length, assuming that
+     *  "start" <= row length.
+     */
+    inline rc_t ReadBits ( const VCursor *self, uint32_t col_idx,
+        uint32_t elem_bits, uint32_t start, void *buffer, uint32_t boff,
+        uint32_t blen, uint32_t *num_read, uint32_t *remaining ) const throw()
+    {
+        return VCursorReadBits ( this, col_idx, elem_bits, start,
+            buffer, boff, blen, num_read, remaining );
+    }
+    inline rc_t ReadBits ( const VCursor *self, int64_t row_id, uint32_t col_idx,
+        uint32_t elem_bits, uint32_t start, void *buffer, uint32_t boff,
+        uint32_t blen, uint32_t *num_read, uint32_t *remaining ) const throw()
+    {
+        return VCursorReadBitsDirect ( this, row_id, col_idx, elem_bits, 
+            start, buffer, boff, blen, num_read, remaining );
+    }
+
+
+    /* CellData
+     *  access pointer to single cell of potentially bit-aligned column data
+     *  can fail if row is dynamically generated
+     *
+     *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+     *
+     *  "elem_bits" [ OUT, NULL OKAY ] - optional return parameter for
+     *  element size in bits
+     *
+     *  "base" [ OUT ] and "boff" [ OUT, NULL OKAY ] -
+     *  compound return parameter for pointer to row starting bit
+     *  where "boff" is in BITS
+     *
+     *  "row_len" [ OUT, NULL OKAY ] - the number of elements in cell
+     */
+    inline rc_t CellData ( uint32_t col_idx, uint32_t *elem_bits,
+        const void **base, uint32_t *boff, uint32_t *row_len ) const throw()
+    {
+        return VCursorCellData ( this, col_idx, elem_bits, base, boff, row_len );
+    }
+    inline rc_t CellData ( int64_t row_id, uint32_t col_idx, uint32_t *elem_bits,
+        const void **base, uint32_t *boff, uint32_t *row_len ) const throw()
+    {
+        return VCursorCellDataDirect ( this, row_id, col_idx, elem_bits,
+            base, boff, row_len );
+    }
+
+    /* Default
+     *  give a default row value for column
+     *
+     *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+     *
+     *  "elem_bits" [ IN ] - stated element size in bits, required
+     *  to be compatible with the actual element size
+     *
+     *  "buffer" [ IN ] and "boff" [ IN ] - compound pointer and offset
+     *  to start of default row data where "boff" is in BITS
+     *
+     *  "row_len" [ IN ] - the number of elements in default row
+     */
+    inline rc_t Default ( uint32_t col_idx, uint32_t elem_bits,
+        const void *buffer, uint32_t boff, uint32_t row_len ) throw()
+    {
+        return VCursorDefault ( this, col_idx, elem_bits, buffer, boff, row_len );
+    }
+
+
+    /* Write
+     *  append bit-aligned column data to row
+     *
+     *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+     *
+     *  "elem_bits" [ IN ] - stated element size in bits, required
+     *  to be compatible with the actual element size
+     *
+     *  "buffer" [ IN ] and "boff" [ IN ] - compound pointer and offset
+     *  to start of default row data where "boff" is in BITS
+     *
+     *  "count" [ IN ] - the number of elements to append
+     */
+    inline rc_t Write ( uint32_t col_idx, uint32_t elem_bits,
+        const void *buffer, uint32_t boff, uint32_t count ) throw()
+    {
+        return VCursorWrite ( this, col_idx, elem_bits, buffer, boff, count );
+    }
+
+
+    /* Commit
+     *  commit changes made to cursor
+     *  fails if row is open
+     */
+    inline rc_t Commit () throw()
+    { return VCursorCommit ( this ); }
+
+
+    /* OpenParent
+     *  duplicate reference to parent table
+     *  NB - returned reference must be released
+     */
+    inline rc_t OpenParent ( const VTable **tbl ) const throw()
+    { return VCursorOpenParentRead ( this, tbl ); }
+
+    inline rc_t OpenParent ( VTable **tbl ) throw()
+    { return VCursorOpenParentUpdate ( this, tbl ); }
+
+
+    /* GetUserData
+     * SetUserData
+     *  store/retrieve an opaque pointer to user data
+     *
+     *  "data" [ OUT ] - return parameter for getting data
+     *  "data" [ IN ] - parameter for setting data
+     *
+     *  "destroy" [ IN, NULL OKAY ] - optional destructor param
+     *  invoked from destructor of "self"
+     */
+    inline rc_t GetUserData ( void **data ) const throw()
+    { return VCursorGetUserData ( this, data ); }
+
+    inline rc_t SetUserData ( void *data,
+        void ( CC * destroy ) ( void *data ) = 0 ) const throw()
+    { return VCursorSetUserData ( this, data, destroy ); }
+
+
+private:
+    VCursor ();
+    ~ VCursor ();
+    VCursor ( const VCursor& );
+    VCursor &operator = ( const VCursor& );
+};
+
+#endif // _hpp_vdb_cursor_
diff --git a/interfaces/vdb/database.h b/interfaces/vdb/database.h
new file mode 100644
index 0000000..2753eee
--- /dev/null
+++ b/interfaces/vdb/database.h
@@ -0,0 +1,334 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_database_
+#define _h_vdb_database_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_kdb_column_
+#include <kdb/column.h>
+#endif
+
+#ifndef _h_klib_namelist_
+#include <klib/namelist.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VSchema;
+struct KMetadata;
+struct VDBManager;
+
+
+/*--------------------------------------------------------------------------
+ * VDatabase
+ *  opaque connection to a database within file system
+ */
+typedef struct VDatabase VDatabase;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+VDB_EXTERN rc_t CC VDatabaseAddRef ( const VDatabase *self );
+VDB_EXTERN rc_t CC VDatabaseRelease ( const VDatabase *self );
+
+
+/* CreateDB
+ *  create a new or open an existing database using manager
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "schema" [ IN ] - schema object containg database
+ *  declaration to be used in creating db.
+ *
+ *  "typespec" [ IN ] - type and optionally version of db schema,
+ *  e.g. 'MY_NAMESPACE:MyDatabase' or 'MY_NAMESPACE:MyDatabase#1.1'
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+VDB_EXTERN rc_t CC VDBManagerCreateDB ( struct VDBManager *self, VDatabase **db,
+    struct VSchema const *schema, const char *typespec,
+    KCreateMode cmode, const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVCreateDB ( struct VDBManager *self, VDatabase **db,
+    struct VSchema const *schema, const char *typespec,
+    KCreateMode cmode, const char *path, va_list args );
+
+
+/* CreateDB
+ *  create a new or open an existing database under parent database
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "member" [ IN ] - name of database member template under parent
+ *  the named member is a db template rather than a named database.
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "name" [ IN ] - NUL terminated string in
+ *  db-native character set giving actual table name
+ */
+VDB_EXTERN rc_t CC VDatabaseCreateDB ( VDatabase *self, VDatabase **db,
+    const char *member, KCreateMode cmode, const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVCreateDB ( VDatabase *self, VDatabase **db,
+    const char *member, KCreateMode cmode, const char *name, va_list args );
+
+VDB_EXTERN rc_t CC VDatabaseDropDB ( VDatabase *self, const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVDropDB ( VDatabase *self, const char *name, va_list args );
+
+VDB_EXTERN rc_t CC VDatabaseDropTable ( VDatabase *self, const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVDropTable ( VDatabase *self, const char *name, va_list args );
+    
+
+/* OpenDBRead
+ *  open a database for read using manager
+ * OpenDBUpdate
+ *  open a database for read/write using manager
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "schema" [ IN, NULL OKAY ] - schema object containg database
+ *  declaration to be used in creating db [ needed by manager ].
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+VDB_EXTERN rc_t CC VDBManagerOpenDBRead ( struct VDBManager const *self,
+    const VDatabase **db, struct VSchema const *schema,
+    const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVOpenDBRead ( struct VDBManager const *self,
+    const VDatabase **db, struct VSchema const *schema,
+    const char *path, va_list args );
+
+VDB_EXTERN rc_t CC VDBManagerOpenDBUpdate ( struct VDBManager *self,
+    VDatabase **db, struct VSchema const *schema,
+    const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVOpenDBUpdate ( struct VDBManager *self,
+    VDatabase **db, struct VSchema const *schema,
+    const char *path, va_list args );
+
+
+/* OpenDBRead
+ *  open a database for read under parent db
+ * OpenDBUpdate
+ *  open or create a database for read/write under parent db
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "name" [ IN ] - NUL terminated string in
+ *  db-native character set giving name of database member
+ */
+VDB_EXTERN rc_t CC VDatabaseOpenDBRead ( const VDatabase *self,
+    const VDatabase **db, const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVOpenDBRead ( const VDatabase *self,
+    const VDatabase **db, const char *name, va_list args );
+
+VDB_EXTERN rc_t CC VDatabaseOpenDBUpdate ( VDatabase *self,
+    VDatabase **db, const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVOpenDBUpdate ( VDatabase *self,
+    VDatabase **db, const char *name, va_list args );
+
+
+/* Typespec
+ *  retrieve database typespec
+ *
+ *  AVAILABILITY: version 2.2
+ *
+ *  "ts_buff" [ IN ] and "ts_size" [ IN ] - buffer for return of NUL-terminated
+ *  database typespec, e.g. 'NCBI:db:abc #1.1'
+ */
+VDB_EXTERN rc_t CC VDatabaseTypespec ( const VDatabase *self,
+    char *ts_buff, size_t ts_size );
+
+
+/* Locked
+ *  returns true if locked
+ */
+VDB_EXTERN bool CC VDatabaseLocked ( const VDatabase *self );
+
+
+/* IsAlias
+ *  returns true if object name is an alias
+ *  returns path to fundamental name if it was aliased
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - optional output buffer
+ *  for fundamenta object name if "alias" is not a fundamental name, 
+ *
+ *  "name" [ IN ] - NUL terminated object name
+ */
+VDB_EXTERN bool CC VDatabaseIsAlias ( const VDatabase *self, uint32_t type,
+    char *resolved, size_t rsize, const char *name );
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+VDB_EXTERN rc_t CC VDatabaseWritable ( const VDatabase *self, uint32_t type,
+    const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVWritable ( const VDatabase *self, uint32_t type,
+    const char *name, va_list args );
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+VDB_EXTERN rc_t CC VDatabaseLock ( VDatabase *self, uint32_t type,
+    const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVLock ( VDatabase *self, uint32_t type,
+    const char *name, va_list args );
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+VDB_EXTERN rc_t CC VDatabaseUnlock ( VDatabase *self, uint32_t type,
+    const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVUnlock ( VDatabase *self, uint32_t type,
+    const char *name, va_list args );
+
+
+/* OpenMetadataRead
+ * OpenMetadataUpdate
+ *  opens metadata file
+ *
+ *  "meta" [ OUT ] - return parameter for metadata
+ */
+VDB_EXTERN rc_t CC VDatabaseOpenMetadataRead ( const VDatabase *self, struct KMetadata const **meta );
+VDB_EXTERN rc_t CC VDatabaseOpenMetadataUpdate ( VDatabase *self, struct KMetadata **meta );
+
+
+/* ColumnCreateParams
+ *  sets the creation parameters for physical columns
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "checksum" [ IN ] - the type of checksum information to
+ *  apply when writing blobs
+ *
+ *  "pgsize" [ IN, DEFAULT ZERO ] - size of internal column "pages"
+ *  the default value is indicated by 0 ( zero ).
+ *  NB - CURRENTLY THE ONLY SUPPORTED PAGE SIZE IS 1 ( ONE ) BYTE.
+ */
+VDB_EXTERN rc_t CC VDatabaseColumnCreateParams ( VDatabase *self,
+    KCreateMode cmode, KChecksum checksum, size_t pgsize );
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+VDB_EXTERN rc_t CC VDatabaseOpenManagerRead ( const VDatabase *self, struct VDBManager const **mgr );
+VDB_EXTERN rc_t CC VDatabaseOpenManagerUpdate ( VDatabase *self, struct VDBManager **mgr );
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+VDB_EXTERN rc_t CC VDatabaseOpenParentRead ( const VDatabase *self, const VDatabase **par );
+VDB_EXTERN rc_t CC VDatabaseOpenParentUpdate ( VDatabase *self, VDatabase **par );
+
+
+/* OpenSchema
+ *  duplicate reference to db schema
+ *  NB - returned reference must be released
+ */
+VDB_EXTERN rc_t CC VDatabaseOpenSchema ( const VDatabase *self, struct VSchema const **schema );
+
+
+/* lists the tables of the database
+ *
+ * "names" [ OUT ] - return parameter for table 
+ */
+VDB_EXTERN rc_t CC VDatabaseListTbl ( const VDatabase *self, KNamelist **names );
+
+/* lists the sub-databases of the database
+ *
+ * "names" [ OUT ] - return parameter for databases
+ */
+VDB_EXTERN rc_t CC VDatabaseListDB ( const VDatabase *self, KNamelist **names );
+
+/* GetUserData
+ * SetUserData
+ *  store/retrieve an opaque pointer to user data
+ *
+ *  "data" [ OUT ] - return parameter for getting data
+ *  "data" [ IN ] - parameter for setting data
+ *
+ *  "destroy" [ IN, NULL OKAY ] - optional destructor param
+ *  invoked from destructor of "self"
+ */
+VDB_EXTERN rc_t CC VDatabaseGetUserData ( const VDatabase *self, void **data );
+VDB_EXTERN rc_t CC VDatabaseSetUserData ( const VDatabase *self,
+    void *data, void ( CC * destroy ) ( void *data ) );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vdb_database_ */
diff --git a/interfaces/vdb/database.hpp b/interfaces/vdb/database.hpp
new file mode 100644
index 0000000..6edaa48
--- /dev/null
+++ b/interfaces/vdb/database.hpp
@@ -0,0 +1,347 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb_database_
+#define _hpp_vdb_database_
+
+#ifndef _h_vdb_database_
+#include <vdb/database.h>
+#endif
+
+#ifndef _h_vdb_table_
+#include <vdb/table.h>
+#endif
+
+/*--------------------------------------------------------------------------
+ * VDatabase
+ *  opaque connection to a database within file system
+ */
+struct VDatabase
+{
+
+    /* AddRef
+     * Release
+     *  all objects are reference counted
+     *  NULL references are ignored
+    */
+    inline rc_t AddRef () const throw ()
+    { return VDatabaseAddRef ( this ); }
+    inline rc_t Release () const throw ()
+    { return VDatabaseRelease ( this ); }
+
+
+    /* CreateDB
+     *  create a new or open an existing database under parent database
+     *
+     *  "db" [ OUT ] - return parameter for newly opened database
+     *
+     *  "member" [ IN ] - name of database member template under parent
+     *  the named member is a db template rather than a named database.
+     *
+     *  "cmode" [ IN ] - creation mode
+     *
+     *  "name" [ IN ] - NUL terminated string in
+     *  db-native character set giving actual table name
+    */
+    inline rc_t CreateDB ( VDatabase **db, const char *member,
+        KCreateMode cmode, const char *name, ... ) throw ()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VDatabaseVCreateDB ( this, db, member, cmode, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t CreateDB ( VDatabase **db, const char *member,
+        KCreateMode cmode, const char *name, va_list args ) throw ()
+    { return VDatabaseVCreateDB ( this, db, member, cmode, name, args ); }
+
+
+    /* OpenDBRead
+     *  open a database for read under parent db
+     * OpenDBUpdate
+     *  open or create a database for read/write under parent db
+     *
+     *  "db" [ OUT ] - return parameter for newly opened database
+     *
+     *  "name" [ IN ] - NUL terminated string in
+     *  db-native character set giving name of database member
+     */
+    inline rc_t OpenDB ( const VDatabase **db, const char *name, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VDatabaseVOpenDBRead ( this, db, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenDB ( const VDatabase **db, const char *name, va_list args ) const throw ()
+    { return VDatabaseVOpenDBRead ( this, db, name, args ); }
+
+    inline rc_t OpenDB ( VDatabase **db, const char *name, ... ) throw ()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VDatabaseVOpenDBUpdate ( this, db, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenDB ( VDatabase **db, const char *name, va_list args ) throw ()
+    { return VDatabaseVOpenDBUpdate ( this, db, name, args ); }
+
+
+    /* CreateTable
+     *  create a new or open an existing table under database
+     *
+     *  "tbl" [ OUT ] - return parameter for newly opened table
+     *
+     *  "member" [ IN ] - name of table member template under database
+     *  the named member is a table template rather than a named table.
+     *
+     *  "cmode" [ IN ] - creation mode
+     *
+     *  "cmode_mask" [ IN ] - if a bit of "cmode_mask" is set (1) then
+     *  the corresponding bit of "cmode" is used for the table,
+     *  otherwise (0) the corresponding bit is taken from db and "cmode"'s
+     *  bit is ignored
+     *  the mask for setting mode (kcmOpen, kcmInit, kcmCreate) is at least
+     *  one bit set in the mask kcmValueMask.
+     *
+     *  "name" [ IN ] - NUL terminated string in
+     *  db-native character set giving actual table name
+     */
+    /* DEPRECATED */ inline rc_t CreateTable ( VTable **tbl, const char *member,
+        KCreateMode cmode, const char *name, ... ) throw ()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VDatabaseVCreateTable ( this, tbl, member, cmode, name, args );
+        va_end ( args );
+        return rc;
+    }
+    /* DEPRECATED */ inline rc_t CreateTable ( VTable **tbl, const char *member,
+        KCreateMode cmode, const char *name, va_list args ) throw ()
+    { return VDatabaseVCreateTable ( this, tbl, member, cmode, name, args ); }
+
+    inline rc_t CreateTable ( VTable **tbl, const char *member, const char *name, ... ) throw ()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VDatabaseVCreateTableDefault ( this, tbl, member, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t CreateTable ( VTable **tbl, const char *member, const char *name, va_list args ) throw ()
+    { return VDatabaseVCreateTableDefault ( this, tbl, member, name, args ); }
+
+    inline rc_t CreateTable ( VTable **tbl, const char *member,
+        KCreateMode cmode, KCreateMode cmode_mask, const char *name, ... ) throw ()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VDatabaseVCreateTableByMask ( this, tbl, member, cmode, cmode_mask, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t CreateTable ( VTable **tbl, const char *member,
+        KCreateMode cmode, KCreateMode cmode_mask, const char *name, va_list args ) throw ()
+    { return VDatabaseVCreateTableByMask ( this, tbl, member, cmode, cmode_mask, name, args ); }
+
+
+    /* OpenTableRead
+     *  open a table for read under database
+     * OpenTableUpdate
+     *  open or create a table for read/write under database
+     *
+     *  "tbl" [ OUT ] - return parameter for newly opened table
+     *
+     *  "name" [ IN ] - NUL terminated string in
+     *  db-native character set giving name of table member
+     */
+    inline rc_t OpenTable( const VTable **tbl,
+        const char *name, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VDatabaseVOpenTableRead ( this, tbl, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenTable( const VTable **tbl,
+        const char *name, va_list args ) const throw ()
+    { return VDatabaseVOpenTableRead ( this, tbl, name, args ); }
+
+    inline rc_t OpenTable( VTable **tbl, const char *name, ... ) throw ()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VDatabaseVOpenTableUpdate ( this, tbl, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenTable( VTable **tbl, const char *name, va_list args ) throw ()
+    { return VDatabaseVOpenTableUpdate ( this, tbl, name, args ); }
+
+
+    /* Locked
+     *  returns true if locked
+     */
+    inline bool Locked ( ) const throw ()
+    { return VDatabaseLocked ( this ); }
+
+
+    /* Writable
+     *  returns 0 if object is writable
+     *  or a reason why if not
+     *
+     *  "type" [ IN ] - a KDBPathType
+     *  valid values are kptDatabase, kptTable and kptIndex
+     *
+     *  "path" [ IN ] - NUL terminated path
+     */
+    inline rc_t Writable ( uint32_t type, const char *name, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VDatabaseVWritable ( this, type, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t Writable ( uint32_t type, const char *name, va_list args ) const throw ()
+    { return VDatabaseVWritable ( this, type, name, args ); }
+
+
+    /* Lock
+     *  apply lock
+     *
+     *  if object is already locked, the operation is idempotent
+     *  and returns an rc state of rcLocked
+     *
+     *  "type" [ IN ] - a KDBPathType
+     *  valid values are kptDatabase, kptTable and kptIndex
+     *
+     *  "path" [ IN ] - NUL terminated path
+     */
+    inline rc_t CC Lock ( uint32_t type, const char *name, ... ) throw ()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VDatabaseVLock ( this, type, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t CC Lock ( uint32_t type, const char *name, va_list args ) throw ()
+    { return VDatabaseVLock ( this, type, name, args ); }
+
+
+    /* Unlock
+     *  remove lock
+     *
+     *  if object is already unlocked, the operation is idempotent
+     *  and returns an rc state of rcUnlocked
+     *
+     *  "type" [ IN ] - a KDBPathType
+     *  valid values are kptDatabase, kptTable and kptIndex
+     *
+     *  "path" [ IN ] - NUL terminated path
+     */
+    inline rc_t CC Unlock ( uint32_t type, const char *name, ... ) throw ()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VDatabaseVUnlock ( this, type, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t CC Unlock ( uint32_t type, const char *name, va_list args ) throw ()
+    { return VDatabaseVUnlock ( this, type, name, args ); }
+
+
+    /* OpenMetadataRead
+     * OpenMetadataUpdate
+     *  opens metadata file
+     *
+     *  "meta" [ OUT ] - return parameter for metadata
+     */
+    inline rc_t OpenMetadata ( const KMetadata **meta ) const throw ()
+    { return VDatabaseOpenMetadataRead ( this, meta ); }
+    inline rc_t OpenMetadata ( KMetadata **meta ) throw ()
+    { return VDatabaseOpenMetadataUpdate ( this, meta ); }
+
+
+    /* OpenManager
+     *  duplicate reference to manager
+     *  NB - returned reference must be released
+     */
+    inline rc_t OpenManager ( const VDBManager **mgr ) const throw ()
+    { return VDatabaseOpenManagerRead ( this, mgr ); }
+    inline rc_t OpenManager ( VDBManager **mgr ) throw ()
+    { return VDatabaseOpenManagerUpdate ( this, mgr ); }
+
+
+    /* OpenParent
+     *  duplicate reference to parent database
+     *  NB - returned reference must be released
+     */
+    inline rc_t OpenParent ( const VDatabase **par ) const throw ()
+    { return VDatabaseOpenParentRead ( this, par ); }
+    inline rc_t OpenParent ( VDatabase **par ) throw ()
+    { return VDatabaseOpenParentUpdate ( this, par ); }
+
+
+    /* lists the tables of the database
+     *
+     * "names" [ OUT ] - return parameter for table 
+     */
+    inline rc_t ListTbl( KNamelist **names ) const throw ()
+    { return VDatabaseListTbl( this, names ); }
+
+
+    /* GetUserData
+     * SetUserData
+     *  store/retrieve an opaque pointer to user data
+     *
+     *  "data" [ OUT ] - return parameter for getting data
+     *  "data" [ IN ] - parameter for setting data
+     *
+     *  "destroy" [ IN, NULL OKAY ] - optional destructor param
+     *  invoked from destructor of "self"
+     */
+    inline rc_t GetUserData ( void **data ) const throw ()
+    { return VDatabaseGetUserData ( this, data ); }
+    inline rc_t SetUserData ( void *data,
+        void ( CC * destroy ) ( void *data ) ) throw ()
+    { return VDatabaseSetUserData ( this, data, destroy ); }
+
+
+private:
+    VDatabase ();
+    ~ VDatabase ();
+    VDatabase ( const VDatabase& );
+    VDatabase &operator = ( const VDatabase& );
+};
+
+#endif
diff --git a/interfaces/vdb/dependencies.h b/interfaces/vdb/dependencies.h
new file mode 100644
index 0000000..353ecb7
--- /dev/null
+++ b/interfaces/vdb/dependencies.h
@@ -0,0 +1,231 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#ifndef _h_vdb_dependencies_
+#define _h_vdb_dependencies_
+
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VDatabase;
+struct VTable;
+
+
+/*--------------------------------------------------------------------------
+ * VDBDependencies
+ *  information about VDatabase dependencies
+ *
+ *  object contains zero or more dependencies
+ *
+ *  each dependency has a number of properties, accessible via index
+ */
+typedef struct VDBDependencies VDBDependencies;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored */
+VDB_EXTERN rc_t CC VDBDependenciesAddRef ( const VDBDependencies *self );
+VDB_EXTERN rc_t CC VDBDependenciesRelease ( const VDBDependencies *self );
+
+/* ListDependencies
+ *  create dependencies object: list dependencies
+ *
+ *  Cache could be updated after the fuction call, if caching is enabled.
+ *
+ *  "dep" [ OUT ] - return for VDBDependencies object
+ *
+ *  "missing" [ IN ] - if true, list only missing dependencies
+ *  otherwise, list all dependencies
+ */
+VDB_EXTERN rc_t CC VDatabaseListDependencies ( struct VDatabase const *self,
+    const VDBDependencies **dep, bool missing );
+
+/* ListDependenciesWithCaching
+ *  create dependencies object: list dependencies
+ *
+ *  Allows to control cache update inside the function.
+ *
+ *  "dep" [ OUT ] - return for VDBDependencies object
+ *
+ *  "missing" [ IN ] - if true, list only missing dependencies
+ *  otherwise, list all dependencies
+ *
+ *  "disableCaching" [ IN ] - if true, disable caching inside of the function
+ *  otherwise, do not change the caching state
+ */
+VDB_EXTERN rc_t CC VDatabaseListDependenciesWithCaching (
+    struct VDatabase const *self,
+    const VDBDependencies **dep, bool missing,
+    bool disableCaching );
+
+/* Count
+ *  retrieve the number of dependencies
+ *
+ *  "count" [ OUT ] - return parameter for dependencies count
+ */
+VDB_EXTERN rc_t CC VDBDependenciesCount ( const VDBDependencies *self,
+    uint32_t *count );
+
+
+/* Type
+ *  describe the dependency object type ( see kbd/manager.h )
+ *
+ *  "type" [ OUT ] - a KDBPathType
+ *
+ *  "idx" [ IN ] - zero-based index of dependency
+ */
+VDB_EXTERN rc_t CC VDBDependenciesType ( const VDBDependencies *self,
+    uint32_t *type, uint32_t idx );
+
+
+/* Local
+ *  retrieve local property
+ *
+ *  "local" [ OUT ] - true if object is stored internally
+ *
+ *  "idx" [ IN ] - zero-based index of dependency
+ */
+VDB_EXTERN rc_t CC VDBDependenciesLocal ( const VDBDependencies *self,
+    bool *local, uint32_t idx );
+
+
+/* SeqId
+ *  retrieve sequence id of object
+ *
+ *  "seq_id" [ OUT ] - returned pointer should not be freed.
+ *   becomes invalid after VDBDependenciesRelease
+ *
+ *  "idx" [ IN ] - zero-based index of dependency
+ */
+VDB_EXTERN rc_t CC VDBDependenciesSeqId ( const VDBDependencies *self,
+    const char **seq_id, uint32_t idx );
+
+
+/* Name
+ *  retrieve object name
+ *
+ * "name" [ OUT ] - returner pointed should not be freed.
+ *  it becomes invalid after VDBDependenciesRelease
+ *
+ *  "idx" [ IN ] - zero-based index of dependency
+ */
+VDB_EXTERN rc_t CC VDBDependenciesName ( const VDBDependencies *self,
+    const char **name, uint32_t idx );
+
+
+/* Circular
+ *  retrieve circular property
+ *  reference sequences may be circular
+ *
+ *  "circular" [ OUT ] - true if dependency is a circular reference table
+ *
+ *  "idx" [ IN ] - zero-based index of dependency
+ */
+VDB_EXTERN rc_t CC VDBDependenciesCircular ( const VDBDependencies *self,
+    bool *circular, uint32_t idx );
+
+
+/* Path
+ *  returns [Local] path for resolved dependency,
+ *  returns NULL for local and missing dependency.
+ *
+ *  "path" [ OUT ] - returned pointer should not be freed.
+ *   it becomes invalid after VDBDependenciesRelease
+ *
+ *  "idx" [ IN ] - zero-based index of dependency
+ */
+VDB_EXTERN rc_t CC VDBDependenciesPath ( const VDBDependencies *self,
+    const char **path, uint32_t idx );
+
+/* PathRemote
+ *  returns Remote path for dependency,
+ *  returns NULL for not found dependency.
+ *
+ *  "path" [ OUT ] - returned pointer should not be freed.
+ *   it becomes invalid after VDBDependenciesRelease
+ *
+ *  "idx" [ IN ] - zero-based index of dependency
+ */
+VDB_EXTERN rc_t CC VDBDependenciesPathRemote ( const VDBDependencies *self,
+    const char **path, uint32_t idx );
+
+/* PathCache
+ *  returns Cache path for dependency,
+ *  returns NULL for not found dependency.
+ *
+ *  "path" [ OUT ] - returned pointer should not be freed.
+ *   it becomes invalid after VDBDependenciesRelease
+ *
+ *  "idx" [ IN ] - zero-based index of dependency
+ */
+VDB_EXTERN rc_t CC VDBDependenciesPathCache ( const VDBDependencies *self,
+    const char **path, uint32_t idx );
+
+/* Error
+ *  trying to analyze rc code and object
+ *  in order to recognize dependencies error
+ *
+ *  db OR table - only one is required
+ */
+VDB_EXTERN bool CC UIError( rc_t rc,
+    struct VDatabase const *db, struct VTable const *table);
+
+/* report error(s) via PLOGERR based on an object
+ * log_list - if true logs the missing items list also
+ */
+VDB_EXTERN void CC UIDatabaseLOGError( rc_t rc,
+    struct VDatabase const *db, bool log_list );
+VDB_EXTERN void CC UITableLOGError( rc_t rc,
+    struct VTable const *table, bool log_list );
+
+/* return human-readable string explaining rc code.
+ * the string should not be freed
+ */
+VDB_EXTERN const char* CC UIDatabaseGetErrorString(rc_t rc);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _h_vdb_dependencies_ */
diff --git a/interfaces/vdb/extern.h b/interfaces/vdb/extern.h
new file mode 100644
index 0000000..7f4fa98
--- /dev/null
+++ b/interfaces/vdb/extern.h
@@ -0,0 +1,47 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_extern_
+#define _h_vdb_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define VDB_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define VDB_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#if defined _MSC_VER && ! defined _STATIC
+#define MOD_EXPORT __declspec ( dllexport )
+#else
+#define MOD_EXPORT
+#endif
+
+#endif /* _h_vdb_extern_ */
diff --git a/interfaces/vdb/manager.h b/interfaces/vdb/manager.h
new file mode 100644
index 0000000..bf94a3a
--- /dev/null
+++ b/interfaces/vdb/manager.h
@@ -0,0 +1,234 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_manager_
+#define _h_vdb_manager_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDirectory;
+struct VPath;
+
+/*--------------------------------------------------------------------------
+ * VDBManager
+ *  opaque handle to library
+ */
+typedef struct VDBManager VDBManager;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+VDB_EXTERN rc_t CC VDBManagerAddRef ( const VDBManager *self );
+VDB_EXTERN rc_t CC VDBManagerRelease ( const VDBManager *self );
+
+
+/* MakeRead
+ * MakeUpdate
+ *  create library handle for specific use
+ *  NB - only one of the functions will be implemented
+ *
+ *  "wd" [ IN, NULL OKAY ] - optional working directory for
+ *  accessing the file system. mgr will attach its own reference.
+ */
+VDB_EXTERN rc_t CC VDBManagerMakeRead ( const VDBManager **mgr, struct KDirectory const *wd );
+VDB_EXTERN rc_t CC VDBManagerMakeUpdate ( VDBManager **mgr, struct KDirectory *wd );
+
+
+/* Version
+ *  returns the library version
+ */
+VDB_EXTERN rc_t CC VDBManagerVersion ( const VDBManager *self, uint32_t *version );
+
+
+/* Writable
+ *  returns 0 if table is writable
+ *  rcLocked if locked, rcReadonly if read-only
+ *  other code upon error
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+VDB_EXTERN rc_t CC VDBManagerWritable ( const VDBManager *self,
+    const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVWritable ( const VDBManager *self,
+    const char *path, va_list args );
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+VDB_EXTERN rc_t CC VDBManagerLock ( VDBManager *self, const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVLock ( VDBManager *self, const char *path, va_list args );
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+VDB_EXTERN rc_t CC VDBManagerUnlock ( VDBManager *self, const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVUnlock ( VDBManager *self, const char *path, va_list args );
+
+
+/* Drop
+ *  drop an object based on its path
+ *
+ *  "path" [ IN ] - NUL terminated string in UTF-8 giving path to the vdb object
+ */
+VDB_EXTERN rc_t CC VDBManagerDrop ( VDBManager *self, uint32_t obj_type, const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVDrop ( VDBManager *self, uint32_t obj_type, const char *path, va_list args );
+
+
+/* AddSchemaIncludePath
+ *  add a path to schema for locating input files
+ */
+VDB_EXTERN rc_t CC VDBManagerAddSchemaIncludePath ( const VDBManager *self,
+    const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVAddSchemaIncludePath ( const VDBManager *self,
+    const char *path, va_list args );
+
+
+/* AddLoadLibraryPath
+ *  add a path to loader for locating dynamic libraries
+ */
+VDB_EXTERN rc_t CC VDBManagerAddLoadLibraryPath ( const VDBManager *self,
+    const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVAddLoadLibraryPath ( const VDBManager *self,
+    const char *path, va_list args );
+
+
+/* GetUserData
+ * SetUserData
+ *  store/retrieve an opaque pointer to user data
+ *
+ *  "data" [ OUT ] - return parameter for getting data
+ *  "data" [ IN ] - parameter for setting data
+ *
+ *  "destroy" [ IN, NULL OKAY ] - optional destructor param
+ *  invoked from destructor of "self"
+ */
+VDB_EXTERN rc_t CC VDBManagerGetUserData ( const VDBManager *self, void **data );
+VDB_EXTERN rc_t CC VDBManagerSetUserData ( const VDBManager *self,
+    void *data, void ( CC * destroy ) ( void *data ) );
+
+
+/* GetObjVersion
+ *  returns the vdb-version of the given object
+ *
+ *  "version" [ OUT ] - discovered vdb-version
+ *
+ *  "path"    [ IN ] - path to the object to be examined ( database or table )
+ */
+VDB_EXTERN rc_t CC VDBManagerGetObjVersion ( const VDBManager *self,
+    ver_t * version, const char *path );
+
+
+/* GetObjModDate
+ *  returns the load/modification timestamp of the given object
+ *
+ *  "ts" [ OUT ] - discovered modification timestamp written in object,
+ *  or from filesystem
+ *
+ *  "path"    [ IN ] - path to the object to be examined ( database or table )
+ */
+VDB_EXTERN rc_t CC VDBManagerGetObjModDate ( const VDBManager *self,
+    KTime_t * ts, const char *path );
+
+
+/* PathType
+ *  check the path type of an object/directory path.
+ *
+ *  this is an extension of the KDirectoryPathType ( see <kdb/manager.h> )
+ *  and will return the KDirectory values if a path type is not specifically
+ *  a VDB or KDB object.
+ */
+VDB_EXTERN int CC VDBManagerPathType ( const VDBManager * self,
+    const char *path, ... );
+VDB_EXTERN int CC VDBManagerVPathType ( const VDBManager * self,
+    const char *path, va_list args );
+
+
+/* GetCacheRoot
+ *  query the cache-root
+ *
+ *  path [ OUT ] - VPath of location of current cache-root
+ */
+VDB_EXTERN rc_t CC VDBManagerGetCacheRoot ( const VDBManager * self,
+    struct VPath const ** path );
+
+
+/* SetCacheRoot
+ *  set a new cache-root
+ *
+ *  path [ IN ] - VPath of new location of cache-root
+ *  
+ *  The change to the cache-root is temporary, it is not automatically stored
+ *  in the configuration-file. If the manager is released, the change will be
+ *  forgotten. If the user wants to make the change permanent, he has to obtain
+ *  a reference to the config-manager 'KConfig' and call KConfigCommit().
+ */
+VDB_EXTERN rc_t CC VDBManagerSetCacheRoot ( const VDBManager * self,
+    struct VPath const * path );
+
+/* DeleteCacheOlderThan
+ *  delete old cached files
+ *
+ *  days [ IN ] - files older than this will be deleted
+ *  
+ */
+VDB_EXTERN rc_t CC VDBManagerDeleteCacheOlderThan ( const VDBManager * self,
+    uint32_t days );
+    
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vdb_manager_ */
diff --git a/interfaces/vdb/manager.hpp b/interfaces/vdb/manager.hpp
new file mode 100644
index 0000000..e5d8248
--- /dev/null
+++ b/interfaces/vdb/manager.hpp
@@ -0,0 +1,386 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb_manager_
+#define _hpp_vdb_manager_
+
+#ifndef _h_vdb_manager_
+#include <vdb/manager.h>
+#endif
+
+#ifndef _h_vdb_table_
+#include <vdb/table.h>
+#endif
+
+#ifndef _h_vdb_schema_
+#include <vdb/schema.h>
+#endif
+
+#ifndef _h_vdb_database_
+#include <vdb/database.h>
+#endif
+
+/*--------------------------------------------------------------------------
+ * forward decl. for CreateDB
+ */
+struct VDatabase;
+struct VSchema;
+struct VPath;
+
+/*--------------------------------------------------------------------------
+ * VDBManager
+ *  opaque handle to library
+ */
+struct VDBManager
+{
+    /* AddRef
+     * Release
+     *  all objects are reference counted
+     *  NULL references are ignored
+     */
+    inline rc_t AddRef () const throw()
+    { return VDBManagerAddRef ( this ); }
+
+    inline rc_t Release () const throw()
+    { return VDBManagerRelease ( this ); }
+
+
+    /* CreateDB
+     *  create a new or open an existing database using manager
+     *
+     *  "db" [ OUT ] - return parameter for newly opened database
+     *
+     *  "schema" [ IN ] - schema object containg database
+     *  declaration to be used in creating db.
+     *
+     *  "typespec" [ IN ] - type and optionally version of db schema,
+     *  e.g. 'MY_NAMESPACE:MyDatabase' or 'MY_NAMESPACE:MyDatabase#1.1'
+     *
+     *  "cmode" [ IN ] - creation mode
+     *
+     *  "path" [ IN ] - NUL terminated string in
+     *  wd-native character set giving path to database
+     */
+    inline rc_t CreateDB ( VDatabase **db, struct VSchema const *schema,
+        const char *typespec, KCreateMode cmode, const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVCreateDB ( this, db, schema, typespec, cmode, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t CreateDB ( VDatabase **db, struct VSchema const *schema,
+        const char *typespec, KCreateMode cmode, const char *path, va_list args ) throw()
+    { return VDBManagerVCreateDB ( this, db, schema, typespec, cmode, path, args ); }
+
+
+    /* OpenDBRead
+     *  open a database for read using manager
+     * OpenDBUpdate
+     *  open a database for read/write using manager
+     *
+     *  "db" [ OUT ] - return parameter for newly opened database
+     *
+     *  "schema" [ IN, NULL OKAY ] - schema object containg database
+     *  declaration to be used in creating db [ needed by manager ].
+     *
+     *  "path" [ IN ] - NUL terminated string in
+     *  wd-native character set giving path to database
+     */
+    inline rc_t OpenDB( const VDatabase **db, struct VSchema const *schema,
+        const char *path, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVOpenDBRead ( this, db, schema, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenDB( const VDatabase **db, struct VSchema const *schema,
+        const char *path, va_list args ) const throw()
+    { return VDBManagerVOpenDBRead ( this, db, schema, path, args ); }
+
+    inline rc_t OpenDB( VDatabase **db, struct VSchema const *schema,
+        const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVOpenDBUpdate ( this, db, schema, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenDB( VDatabase **db, struct VSchema const *schema,
+        const char *path, va_list args ) throw()
+    { return VDBManagerVOpenDBUpdate ( this, db, schema, path, args ); }
+
+
+    /* CreateTable
+     *  create a new or open an existing table using manager
+     *
+     *  "tbl" [ OUT ] - return parameter for newly opened table
+     *
+     *  "schema" [ IN ] - schema object containg table
+     *  declaration to be used in creating tbl.
+     *
+     *  "typespec" [ IN ] - type and optionally version of table schema,
+     *  e.g. 'MY_NAMESPACE:MyTable' or 'MY_NAMESPACE:MyTable#1.1'
+     *
+     *  "cmode" [ IN ] - creation mode
+     *
+     *  "path" [ IN ] - NUL terminated string in
+     *  wd-native character set giving path to table
+     */
+    inline rc_t CreateTable ( VTable **tbl, struct VSchema const *schema,
+        const char *typespec, KCreateMode cmode, const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVCreateTable ( this, tbl, schema, typespec, cmode, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t CreateTable ( VTable **tbl, struct VSchema const *schema,
+        const char *typespec, KCreateMode cmode, const char *path, va_list args ) throw()
+    { return VDBManagerVCreateTable ( this, tbl, schema, typespec, cmode, path, args ); }
+
+
+    /* OpenTableRead
+     *  open a table for read using manager
+     * OpenTableUpdate
+     *  open a table for read/write using manager
+     *
+     *  "tbl" [ OUT ] - return parameter for newly opened table
+     *
+     *  "schema" [ IN, NULL OKAY ] - optional schema object with
+     *  latest versions of table schema.
+     *
+     *  "path" [ IN ] - NUL terminated string in
+     *  wd-native character set giving path to table
+     */
+    inline rc_t OpenTable ( const VTable **tbl, struct VSchema const *schema,
+        const char *path, ... ) const throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVOpenTableRead ( this, tbl, schema, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenTable ( const VTable **tbl, struct VSchema const *schema,
+        const char *path, va_list args ) const throw ()
+    { return VDBManagerVOpenTableRead ( this, tbl, schema, path, args ); }
+
+    inline rc_t OpenTable ( VTable **tbl, struct VSchema const *schema,
+        const char *path, ... ) throw ()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVOpenTableUpdate ( this, tbl, schema, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenTable ( VTable **tbl, struct VSchema const *schema,
+        const char *path, va_list args ) throw ()
+    { return VDBManagerVOpenTableUpdate ( this, tbl, schema, path, args ); }
+
+
+    /* MakeSchema
+     *  create a schema object
+     */
+    inline rc_t MakeSchema ( VSchema **schema ) const throw()
+    { return VDBManagerMakeSchema ( this, schema ); }
+
+
+    /* MakeRead
+     * MakeUpdate
+     *  create library handle for specific use
+     *  NB - only one of the functions will be implemented
+     *
+     *  "wd" [ IN, NULL OKAY ] - optional working directory for
+     *  accessing the file system. mgr will attach its own reference.
+     */
+    static inline rc_t MakeRead ( const VDBManager **mgr,
+        const KDirectory *wd = 0 ) throw()
+    { return VDBManagerMakeRead ( mgr, wd ); }
+
+    static inline rc_t MakeUpdate ( VDBManager **mgr,
+        KDirectory *wd = 0 ) throw()
+    { return VDBManagerMakeUpdate ( mgr, wd ); }
+
+
+    /* Version
+     *  returns the library version
+     */
+    inline rc_t Version ( uint32_t *version ) const throw()
+    { return VDBManagerVersion ( this, version ); }
+
+
+    /* Writable
+     *  returns 0 if object is writable
+     *  or a reason why if not
+     *
+     *  "path" [ IN ] - NUL terminated path
+     */
+    inline rc_t Writable ( const char *path, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVWritable ( this, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t Writable ( const char *path, va_list args ) const throw()
+    { return VDBManagerVWritable ( this, path, args ); }
+
+
+    /* Lock
+     *  apply lock
+     *
+     *  if object is already locked, the operation is idempotent
+     *  and returns an rc state of rcLocked
+     *
+     *  "path" [ IN ] - NUL terminated path
+     */
+    inline rc_t Lock ( const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVLock ( this, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t Lock ( const char *path, va_list args ) throw()
+    { return VDBManagerVLock ( this, path, args ); }
+
+
+    /* Unlock
+     *  remove lock
+     *
+     *  if object is already unlocked, the operation is idempotent
+     *  and returns an rc state of rcUnlocked
+     *
+     *  "path" [ IN ] - NUL terminated path
+     */
+    inline rc_t Unlock ( const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVUnlock ( this, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t Unlock ( const char *path, va_list args ) throw()
+    { return VDBManagerVUnlock ( this, path, args ); }
+
+
+    /* Drop
+     *  drop an object based on its path
+     *
+     *  "path" [ IN ] - NUL terminated string in UTF-8 giving path to the vdb object
+     */
+    inline rc_t Drop( uint32_t obj_type, const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVDrop ( this, obj_type, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t Drop( uint32_t obj_type, const char *path, va_list args ) throw()
+    { return VDBManagerVDrop ( this, obj_type, path, args ); }
+
+
+    /* AddSchemaIncludePath
+     *  add a path to schema for locating input files
+     */
+    inline rc_t AddSchemaIncludePath ( const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVAddSchemaIncludePath ( this, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t AddSchemaIncludePath ( const char *path, va_list args ) throw()
+    { return VDBManagerVAddSchemaIncludePath ( this, path, args ); }
+
+
+    /* AddLoadLibraryPath
+     *  add a path to loader for locating dynamic libraries
+     */
+    inline rc_t AddLoadLibraryPath ( const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VDBManagerVAddLoadLibraryPath ( this, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t AddLoadLibraryPath ( const char *path, va_list args ) throw()
+    { return VDBManagerVAddLoadLibraryPath ( this, path, args ); }
+
+
+    /* GetUserData
+     * SetUserData
+     *  store/retrieve an opaque pointer to user data
+     *
+     *  "data" [ OUT ] - return parameter for getting data
+     *  "data" [ IN ] - parameter for setting data
+     *
+     *  "destroy" [ IN, NULL OKAY ] - optional destructor param
+     *  invoked from destructor of "self"
+     */
+    inline rc_t GetUserData ( void **data ) const throw()
+    { return VDBManagerGetUserData ( this, data ); }
+
+    inline rc_t SetUserData ( void *data,
+        void ( CC * destroy ) ( void *data ) = 0 ) const throw()
+    { return VDBManagerSetUserData ( this, data, destroy ); }
+
+    /* GetCacheRoot
+     * SetCacheRoot
+     * get/set CacheRoot ( location for user-repo/dbgap-repo )
+     *
+     * "path" [ OUT ] - VPath pointing to current location
+     * "path" [ IN ]  - VPath of new location
+     *
+     */
+    inline rc_t GetCacheRoot ( struct VPath const ** path ) const throw()
+    { return VDBManagerGetCacheRoot ( this, path ); }
+
+    inline rc_t SetCacheRoot ( struct VPath const * path ) const throw()
+    { return VDBManagerSetCacheRoot ( this, path ); }
+
+
+private:
+    VDBManager ();
+    ~ VDBManager ();
+    VDBManager ( const VDBManager& );
+    VDBManager &operator = ( const VDBManager& );
+};
+
+#endif // _hpp_vdb_manager_
diff --git a/interfaces/vdb/report.h b/interfaces/vdb/report.h
new file mode 100644
index 0000000..90d3695
--- /dev/null
+++ b/interfaces/vdb/report.h
@@ -0,0 +1,92 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_report_
+#define _h_vdb_report_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VDBManager;
+struct VDatabase;
+struct VTable;
+
+
+/*--------------------------------------------------------------------------
+ * An unrecoverable error happened.
+ * We can help to solve it
+ * by reporting information about known application execution environment.
+ */
+
+
+/* SetVDBManager
+ *  remember the manager in use
+ */
+VDB_EXTERN rc_t CC ReportSetVDBManager ( struct VDBManager const *mgr );
+
+
+/* SetDatabase
+ *  To be called after application successfully opened Database
+ *  specified in command line.
+ *  If the application supports multiple objects passed in command line
+ *  to be processed in a loop: should be called for each argument database.
+ *
+ *  "path" [ IN ] - path to the database that is used to access it
+ */
+VDB_EXTERN rc_t CC ReportResetDatabase ( const char *path,
+    struct VDatabase const *db );
+
+
+/* SetTable
+ *  To be called after application successfully opened Table
+ *  specified in command line.
+ *  If the application supports multiple objects passed in command line
+ *  to be processed in a loop: should be called for each argument table.
+ *
+ *  "path" [ IN ] - path to the table that is used to access it
+ */
+VDB_EXTERN rc_t CC ReportResetTable ( const char *path,
+    struct VTable const *tbl );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vdb_report_ */
diff --git a/interfaces/vdb/schema.h b/interfaces/vdb/schema.h
new file mode 100644
index 0000000..e0db467
--- /dev/null
+++ b/interfaces/vdb/schema.h
@@ -0,0 +1,460 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_schema_
+#define _h_vdb_schema_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KNamelist;
+struct VDBManager;
+
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ *  a virtual table schema
+ *
+ *  a schema is built from column, type and sub-schema declarations. The
+ *  pseudo-BNF below gives a simplified description of the structure,
+ *  with certain contextual constraints omitted.
+ *
+ *  at the global level, both read and write column declarations are permitted.
+ *  type declarations are permitted at any level but always enter into global
+ *  scope.
+ *
+ *  column names may be overloaded to allow for multiple data types under a
+ *  single name. a column is identified by its ( name, datatype ) pair. the
+ *  pairing ( name, NULL ) identifies the default type for name.
+ *
+ *  column declarations are intentionally created by assignment ( '=' ) or
+ *  are updated with additional productions by appending ( '+=' ). this
+ *  distinction is intended to prevent unintended consequences.
+ *
+ *  column productions come in the form of a simple column assignment, a
+ *  data conversion function, or a sub-schema function. the simple column
+ *  production takes a column name, the functions take some combination of
+ *  constant and column name parameters.
+ *
+ *  a column assignment source ( column, function or sub-schema ) will have
+ *  its own data type. when assigned directly, it must match the destination
+ *  type either exactly or as the result of implicit type promotion. as an
+ *  alternative, an explicit up or down cast ( or casts ) may be performed as
+ *  an aid in source resolution.
+ *
+ *  read column declarations introduce a virtual column by ( name, datatype ).
+ *  globally, they may be declared as "extern" to make them accessible via the
+ *  API. extern columns may have any of their productions tagged as "default"
+ *  to assign significance to the pair ( name, NULL ). when more than one type
+ *  for a name is tagged as default, the most recently resolved is arbitrarily
+ *  chosen. read source columns may be virtual or physical if the latter is
+ *  within scope.
+ *
+ *  write column declarations introduce virtual columns by ( name, datatype ),
+ *  and define physical column ( encoding, decoding ) bindings. virtual columns
+ *  may be introduced as "extern" at global scope, where they have no source
+ *  productions given that they take their input from the API. non-extern
+ *  write columns are virtual and allow normal column productions with the
+ *  exception that they may not be sourced by physical columns.
+ *
+ *  one special write column declaration introduces physical columns by
+ *  name only ( name overloading cannot exist in the physical layer ) and
+ *  requires a special production that binds together two sub-schema functions;
+ *  one for encoding and the other for decoding.
+ */
+typedef struct VSchema VSchema;
+
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+VDB_EXTERN rc_t CC VSchemaAddRef ( const VSchema *self );
+VDB_EXTERN rc_t CC VSchemaRelease ( const VSchema *self );
+
+
+/* Make
+ *  create a schema object
+ */
+VDB_EXTERN rc_t CC VDBManagerMakeSchema ( struct VDBManager const *self, VSchema **schema );
+
+
+/* AddIncludePath
+ *  add an include path to schema for locating input files
+ */
+VDB_EXTERN rc_t CC VSchemaAddIncludePath ( VSchema *self, const char *path, ... );
+VDB_EXTERN rc_t CC VSchemaVAddIncludePath ( VSchema *self, const char *path, va_list args );
+
+
+/* ParseText
+ *  parse schema text
+ *  add productions to existing schema
+ *
+ *  "name" [ IN, NULL OKAY ] - optional name
+ *  representing text, e.g. filename
+ *
+ *  "text" [ IN ] and "bytes" [ IN ] - input buffer of text
+ */
+VDB_EXTERN rc_t CC VSchemaParseText ( VSchema *self, const char *name,
+    const char *text, size_t bytes );
+
+
+/* ParseFile
+ *  parse schema file
+ *  add productions to existing schema
+ *
+ *  "name" [ IN ] - filename, absolute or valid relative to
+ *  working directory or within an include path
+ */
+VDB_EXTERN rc_t CC VSchemaParseFile ( VSchema *self, const char *name, ... );
+VDB_EXTERN rc_t CC VSchemaVParseFile ( VSchema *self, const char *name, va_list args );
+
+
+/* Dump
+ *  dump schema as text
+ *
+ *  "mode" [ IN ] - selects textual conversion mode ( see VSchemaDumpMode )
+ *
+ *  "decl" [ IN, NULL OKAY ] - selects a declaration to dump
+ *
+ *  "flush" [ IN ] and "dst" [ IN, OPAQUE ] - callback for delivering
+ *  buffered schema text
+ */
+enum VSchemaDumpMode
+{
+    sdmPrint,            /* standard display for reading and printing */
+    sdmCompact           /* compacted white-space representation      */
+};
+
+VDB_EXTERN rc_t CC VSchemaDump ( const VSchema *self, uint32_t mode, const char *decl,
+    rc_t ( CC * flush ) ( void *dst, const void *buffer, size_t bsize ), void *dst );
+
+
+/* IncludeFiles
+ *  generates a list of paths to include file
+ */
+VDB_EXTERN rc_t CC VSchemaIncludeFiles ( const VSchema *self, struct KNamelist const **list );
+
+
+/*--------------------------------------------------------------------------
+ * VTypedecl
+ *  a runtime type id and vector dimension
+ *
+ *  describes the general form of a type declaration: "TYPE [ DIM ]"
+ */
+typedef struct VTypedecl VTypedecl;
+struct VTypedecl
+{
+    /* runtime type id */
+    uint32_t type_id;
+
+    /* vector dimension */
+    uint32_t dim;
+};
+
+
+/* Resolve
+ *  converts a typedecl string to type id and vector dimension
+ *
+ *  "resolved" [ OUT ] - resolved type declaration
+ *
+ *  "typedecl" [ IN ] - type declaration
+ */
+VDB_EXTERN rc_t CC VSchemaResolveTypedecl ( const VSchema *self,
+    VTypedecl *resolved, const char *typedecl, ... );
+VDB_EXTERN rc_t CC VSchemaVResolveTypedecl ( const VSchema *self,
+    VTypedecl *resolved, const char *typedecl, va_list args );
+
+
+/* ToText
+ *  convert a VTypedecl into canonical text
+ *
+ *  "schema" [ IN ] - schema object that would know about this type
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated type declaration string
+ */
+VDB_EXTERN rc_t CC VTypedeclToText ( const VTypedecl *self,
+    const VSchema *schema, char *buffer, size_t bsize );
+
+
+/* ToSupertype
+ *  attempt to cast a typedecl to a size-equivalent supertype decl
+ *
+ *  "schema" [ IN ] - schema object that would know about this type
+ *
+ *  "cast" [ OUT ] - return parameter for supertype decl
+ *  valid only if function returns true.
+ *
+ *  returns true if cast succeeded
+ */
+VDB_EXTERN bool CC VTypedeclToSupertype ( const VTypedecl *self,
+    const VSchema *schema, VTypedecl *cast );
+
+
+/* ToType
+ *  attempt to cast a typedecl to a size-equivalent ancestor decl
+ *
+ *  "schema" [ IN ] - schema object that would know about this type
+ *
+ *  "ancestor" [ IN ] - target type or typeset for cast
+ *
+ *  "cast" [ OUT ] - return parameter for ancestor decl
+ *  valid only if function returns true. if "ancestor" was a typeset,
+ *  the value of "cast" will be the closest matching ancestral type.
+ *
+ *  "distance" [ OUT, NULL OKAY ] - optional linear measure of casting
+ *  generations. valid only if function returns true. a value of 0 means
+ *  that "self" is a direct match with "ancestor", a value of 1 means that
+ *  "self" is an immediate subtype of "ancestor", etc.
+ *
+ *  returns true if cast succeeded
+ */
+VDB_EXTERN bool CC VTypedeclToType ( const VTypedecl *self,
+    const VSchema *schema,  uint32_t ancestor,
+    VTypedecl *cast, uint32_t *distance );
+
+
+/* ToTypedecl
+ *  attempt to cast a typedecl to a size-equivalent ancestor decl
+ *
+ *  "schema" [ IN ] - schema object that would know about this type
+ *
+ *  "ancestor" [ IN ] - target typedecl or typeset for cast
+ *
+ *  "cast" [ OUT, NULL OKAY ] - return parameter for ancestor decl
+ *  valid only if function returns true. if "ancestor" was a typeset,
+ *  the value of "cast" will be the closest matching ancestral type.
+ *
+ *  "distance" [ OUT, NULL OKAY ] - optional linear measure of casting
+ *  generations. valid only if function returns true. a value of 0 means
+ *  that "self" is a direct match with "ancestor", a value of 1 means that
+ *  "self" is an immediate subtype of "ancestor", etc.
+ *
+ *  returns true if cast succeeded
+ */
+VDB_EXTERN bool CC VTypedeclToTypedecl ( const VTypedecl *self,
+    const VSchema *schema, const VTypedecl *ancestor,
+    VTypedecl *cast, uint32_t *distance );
+
+
+/* CommonAncestor
+ *  find a common ancestor between "self" and "peer"
+ *  returns distance as sum of distances from each to "ancestor"
+ *
+ *  "schema" [ IN ] - schema object that would know about this type
+ *
+ *  "peer" [ IN ] - typedecl or typeset to compare against self
+ *
+ *  "ancestor" [ OUT, NULL OKAY ] - return parameter for closest
+ *  common ancestor decl. valid only if function returns true.
+ *
+ *  "distance" [ OUT, NULL OKAY ] - optional linear measure of casting
+ *  generations. valid only if function returns true. a value of 0 means
+ *  that "self" is a direct match with "peer", a value of 1 means that
+ *  "self" is an immediate subtype of "peer", or vice-versa, etc.
+ *  measured as the sum of distances self=>ancestor and peer=>ancestor
+ */
+VDB_EXTERN bool CC VTypedeclCommonAncestor ( const VTypedecl *self, const VSchema *schema,
+    const VTypedecl *peer, VTypedecl *ancestor, uint32_t *distance );
+
+
+/*--------------------------------------------------------------------------
+ * VTypedesc
+ *  describes the fundamental properties of a VTypedecl
+ *  replaces the deprecated structure VTypedef
+ *
+ *  VTypedecl describes an element in terms of the element's
+ *  super-type id and vector dimension.
+ *
+ *  VTypedesc describes an element in terms of the element's
+ *  intrinsic type domain and size, and the vector dimension
+ *  is adjusted to reflect the intrinsic super-type.
+ *
+ *  the effect is as if a VTypedecl were cast toward its most
+ *  fundamental supertype using "VTypedeclToSupertype", and
+ *  the final size and dimension are taken from there:
+ *
+ *    given - VTypedecl td; const VSchema *schema;
+ *    while ( VTypedeclToSupertype ( & td, schema, & td ) )
+ *        ( void ) 0;
+ *
+ *    then -
+ *    VTypedesc desc =
+ *    {
+ *      bit_sizeof_type ( td . type_id ),
+ *      td . dim,
+ *      domain_of_type ( td . type_id )
+ *    }
+ */
+enum
+{
+    /* boolean domain */
+    vtdBool = 1,
+
+    /* numeric domains */
+    vtdUint, vtdInt, vtdFloat,
+
+    /* textual domains */
+    vtdAscii, vtdUnicode
+};
+
+typedef struct VTypedesc VTypedesc;
+struct VTypedesc
+{
+    /* sizeof intrinsic supertype */
+    uint32_t intrinsic_bits;
+
+    /* recalculated vector dimension */
+    uint32_t intrinsic_dim;
+
+    /* data domain */
+    uint32_t domain;
+};
+
+
+/* Sizeof
+ */
+VDB_EXTERN uint32_t CC VTypedescSizeof ( const VTypedesc *self );
+
+
+/* DescribeTypedecl
+ *  produce a description of typedecl properties
+ */
+VDB_EXTERN rc_t CC VSchemaDescribeTypedecl ( const VSchema *self,
+    VTypedesc *desc, const VTypedecl *td );
+
+
+
+/*--------------------------------------------------------------------------
+ * VSchemaRuntimeTable
+ *  an object that represents a table ( or sub-table ) created at runtime
+ *  that can be used to create a VTable object
+ */
+typedef struct VSchemaRuntimeTable VSchemaRuntimeTable;
+
+
+/* Make
+ *  make a table in the schema provided
+ *
+ *  "tbl" [ OUT ] - return parameter for new schema table object
+ *
+ *  "type_name" [ IN ] - NUL terminated string giving desired typename of table
+ *   may include version spec - otherwise, a version of #1.0 will be assigned.
+ *
+ *  "supertype_spec" [ IN, NULL OKAY ] - optional supertype spec, giving
+ *   either a single super-table type string or multiple comma-separated tables
+ */
+VDB_EXTERN rc_t CC VSchemaMakeRuntimeTable ( VSchema *self,
+    VSchemaRuntimeTable **tbl, const char *type_name, const char *supertype_spec );
+
+
+/* Close
+ *  close the schema table handle
+ *  discards any uncomitted data
+ */
+VDB_EXTERN rc_t CC VSchemaRuntimeTableClose ( VSchemaRuntimeTable *self );
+
+
+/* Commit
+ *  commits table data
+ *  closes object to further modification
+ */
+VDB_EXTERN rc_t CC VSchemaRuntimeTableCommit ( VSchemaRuntimeTable *self );
+
+
+/* AddColumn
+ *  add a simple column to the table
+ *
+ *  "td" [ IN ] - data type of column, obtained from schema object
+ *
+ *  "encoding" [ IN, NULL OKAY ] - optional compression/encoding type
+ *  specified as a NUL-terminated string
+ *
+ *  "name" [ IN ] - NUL-terminated simple ASCII name
+ *   conforming to column name requirements
+ */
+VDB_EXTERN rc_t CC VSchemaRuntimeTableAddColumn ( VSchemaRuntimeTable *self, 
+    const VTypedecl *td, const char *encoding, const char *name, ... );
+VDB_EXTERN rc_t CC VSchemaRuntimeTableVAddColumn ( VSchemaRuntimeTable *self, 
+    const VTypedecl *td, const char *encoding, const char *name, va_list args );
+
+
+/* AddTypedColumn
+ *  Gerber versions of AddColumn
+ *
+ *  AddBooleanColumn - simple boolean column with default compression
+ *                     provides both packed ( single bit ) and byte versions
+ *  AddIntegerColumn - sized integer column with appropriate sign, size and compression
+ *  AddFloatColumn   - sized floating point column with lossy compression
+ *  AddAsciiColumn   - 8-bit ASCII text column with standard compression
+ *  AddUnicodeColumn - UTF8, UTF16, or UTF32 text column with standard compression
+ */
+VDB_EXTERN rc_t CC VSchemaRuntimeTableAddBooleanColumn ( VSchemaRuntimeTable *self,
+    const char *name, ... );
+VDB_EXTERN rc_t CC VSchemaRuntimeTableAddIntegerColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, bool has_sign,  const char *name, ... );
+VDB_EXTERN rc_t CC VSchemaRuntimeTableAddFloatColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, uint32_t significant_mantissa_bits,  const char *name, ... );
+VDB_EXTERN rc_t CC VSchemaRuntimeTableAddAsciiColumn ( VSchemaRuntimeTable *self,
+    const char *name, ... );
+VDB_EXTERN rc_t CC VSchemaRuntimeTableAddUnicodeColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, const char *name, ... );
+
+VDB_EXTERN rc_t CC VSchemaRuntimeTableVAddBooleanColumn ( VSchemaRuntimeTable *self,
+    const char *name, va_list args );
+VDB_EXTERN rc_t CC VSchemaRuntimeTableVAddIntegerColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, bool has_sign,  const char *name, va_list args );
+VDB_EXTERN rc_t CC VSchemaRuntimeTableVAddFloatColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, uint32_t significant_mantissa_bits,  const char *name, va_list args );
+VDB_EXTERN rc_t CC VSchemaRuntimeTableVAddAsciiColumn ( VSchemaRuntimeTable *self,
+    const char *name, va_list args );
+VDB_EXTERN rc_t CC VSchemaRuntimeTableVAddUnicodeColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, const char *name, va_list args );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_vdb_schema_ */
diff --git a/interfaces/vdb/schema.hpp b/interfaces/vdb/schema.hpp
new file mode 100644
index 0000000..e1ac4a4
--- /dev/null
+++ b/interfaces/vdb/schema.hpp
@@ -0,0 +1,252 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb_schema_
+#define _hpp_vdb_schema_
+
+#ifndef _h_vdb_schema_
+#include <vdb/schema.h>
+#endif
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ *  a virtual table schema
+ */
+struct VSchema
+{
+    /* AddRef
+     * Release
+     *  all objects are reference counted
+     *  NULL references are ignored
+     */
+    inline rc_t AddRef () const throw()
+    { return VSchemaAddRef ( this ); }
+    inline rc_t Release () const throw()
+    { return VSchemaRelease ( this ); }
+
+
+    /* AddIncludePath
+     *  add an include path to schema for locating input files
+     */
+    inline rc_t AddIncludePath ( const char *path, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, path );
+        rc_t rc = VSchemaVAddIncludePath ( this, path, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t AddIncludePath ( const char *path, va_list args ) throw()
+    { return VSchemaVAddIncludePath ( this, path, args ); }
+
+
+    /* ParseText
+     *  parse schema text
+     *  add productions to existing schema
+     *
+     *  "name" [ IN, NULL OKAY ] - optional name
+     *  representing text, e.g. filename
+     *
+     *  "text" [ IN ] and "bytes" [ IN ] - input buffer of text
+     */
+    inline rc_t ParseText ( const char *name, const char *text, size_t bytes ) throw()
+    { return VSchemaParseText ( this, name, text, bytes ); }
+
+
+    /* ParseFile
+     *  parse schema file
+     *  add productions to existing schema
+     *
+     *  "name" [ IN ] - filename, absolute or valid relative to
+     *  working directory or within an include path
+     */
+    inline rc_t ParseFile ( const char *name, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VSchemaVParseFile ( this, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t ParseFile ( const char *name, va_list args ) throw()
+    { return VSchemaVParseFile ( this, name, args ); }
+
+
+    /* Dump
+     *  dump schema as text
+     *
+     *  "mode" [ IN ] - selects textual conversion mode ( see VSchemaDumpMode )
+     *
+     *  "decl" [ IN, NULL OKAY ] - selects a declaration to dump
+     *
+     *  "flush" [ IN ] and "dst" [ IN, OPAQUE ] - callback for delivering
+     *  buffered schema text
+     */
+    inline rc_t Dump ( uint32_t mode, const char *decl,
+        rc_t ( CC * flush ) ( void *dst, const void *buffer, size_t bsize ), 
+        void *dst ) const throw()
+    { return VSchemaDump ( this, mode, decl, flush, dst ); }
+
+
+    /* IncludeFiles
+     *  generates a list of paths to include file
+     */
+    inline rc_t IncludeFiles ( struct KNamelist const **list ) const throw()
+    { return VSchemaIncludeFiles ( this, list ); }
+
+
+    /* Resolve
+     *  converts a typedecl string to type id and vector dimension
+     *
+     *  "resolved" [ OUT ] - resolved type declaration
+     *
+     *  "typedecl" [ IN ] - type declaration
+     */
+    inline rc_t ResolveTypedecl ( VTypedecl *resolved,
+        const char *typedecl, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, typedecl );
+        rc_t rc = VSchemaVResolveTypedecl ( this, resolved, typedecl, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t ResolveTypedecl ( VTypedecl *resolved,
+        const char *typedecl, va_list args ) const throw()
+    { return VSchemaVResolveTypedecl ( this, resolved, typedecl, args ); }
+
+
+    /* ToText
+     *  convert a VTypedecl into canonical text
+     *
+     *  "schema" [ IN ] - schema object that would know about this type
+     *
+     *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+     *  NUL terminated type declaration string
+     */
+    inline bool TypedeclToText ( const VTypedecl *decl, char *buffer,
+        size_t bsize ) const throw()
+    { return VTypedeclToText ( decl, this, buffer, bsize ); }
+
+
+    /* ToSupertype
+     *  attempt to cast a typedecl to a size-equivalent supertype decl
+     *
+     *  "schema" [ IN ] - schema object that would know about this type
+     *
+     *  "cast" [ OUT ] - return parameter for supertype decl
+     *  valid only if function returns true.
+     *
+     *  returns true if cast succeeded
+     */
+    inline bool TypedeclToSupertype ( const VTypedecl *decl,
+        VTypedecl *cast ) const throw()
+    { return VTypedeclToSupertype ( decl, this, cast ); }
+
+
+    /* ToType
+     *  attempt to cast a typedecl to a size-equivalent ancestor decl
+     *
+     *  "schema" [ IN ] - schema object that would know about this type
+     *
+     *  "ancestor" [ IN ] - target type or typeset for cast
+     *
+     *  "cast" [ OUT ] - return parameter for ancestor decl
+     *  valid only if function returns true. if "ancestor" was a typeset,
+     *  the value of "cast" will be the closest matching ancestral type.
+     *
+     *  "distance" [ OUT, NULL OKAY ] - optional linear measure of casting
+     *  generations. valid only if function returns true. a value of 0 means
+     *  that "self" is a direct match with "ancestor", a value of 1 means that
+     *  "self" is an immediate subtype of "ancestor", etc.
+     *
+     *  returns true if cast succeeded
+     */
+    inline bool TypedeclToType ( const VTypedecl *decl, uint32_t ancestor,
+        VTypedecl *cast, uint32_t *distance ) const throw()
+    { return VTypedeclToType ( decl, this, ancestor, cast, distance ); }
+
+
+    /* ToTypedecl
+     *  attempt to cast a typedecl to a size-equivalent ancestor decl
+     *
+     *  "schema" [ IN ] - schema object that would know about this type
+     *
+     *  "ancestor" [ IN ] - target typedecl or typeset for cast
+     *
+     *  "cast" [ OUT, NULL OKAY ] - return parameter for ancestor decl
+     *  valid only if function returns true. if "ancestor" was a typeset,
+     *  the value of "cast" will be the closest matching ancestral type.
+     *
+     *  "distance" [ OUT, NULL OKAY ] - optional linear measure of casting
+     *  generations. valid only if function returns true. a value of 0 means
+     *  that "self" is a direct match with "ancestor", a value of 1 means that
+     *  "self" is an immediate subtype of "ancestor", etc.
+     *
+     *  returns true if cast succeeded
+     */
+    inline bool TypedeclToTypedecl ( const VTypedecl *decl, const VTypedecl *ancestor,
+        VTypedecl *cast, uint32_t *distance ) const throw()
+    { return VTypedeclToTypedecl ( decl, this, ancestor, cast, distance ); }
+
+
+    /* CommonAncestor
+     *  find a common ancestor between "self" and "peer"
+     *  returns distance as sum of distances from each to "ancestor"
+     *
+     *  "schema" [ IN ] - schema object that would know about this type
+     *
+     *  "peer" [ IN ] - typedecl or typeset to compare against self
+     *
+     *  "ancestor" [ OUT, NULL OKAY ] - return parameter for closest
+     *  common ancestor decl. valid only if function returns true.
+     *
+     *  "distance" [ OUT, NULL OKAY ] - optional linear measure of casting
+     *  generations. valid only if function returns true. a value of 0 means
+     *  that "self" is a direct match with "peer", a value of 1 means that
+     *  "self" is an immediate subtype of "peer", or vice-versa, etc.
+     *  measured as the sum of distances self=>ancestor and peer=>ancestor
+     */
+    inline bool TypedeclCommonAncestor ( const VTypedecl *decl, const VTypedecl *peer,
+        VTypedecl *ancestor, uint32_t *distance ) const throw()
+    { return VTypedeclCommonAncestor ( decl, this, peer, ancestor, distance ); }
+
+
+    /* DescribeTypedecl
+     *  produce a description of typedecl properties
+     */
+    inline rc_t DescribeTypedecl ( VTypedesc *desc, const VTypedecl *td ) const throw()
+    { return VSchemaDescribeTypedecl ( this, desc, td ); }
+
+
+private:
+    VSchema ();
+    ~ VSchema ();
+    VSchema ( const VSchema& );
+    VSchema &operator = ( const VSchema& );
+};
+
+#endif
\ No newline at end of file
diff --git a/interfaces/vdb/table.h b/interfaces/vdb/table.h
new file mode 100644
index 0000000..c08f0b7
--- /dev/null
+++ b/interfaces/vdb/table.h
@@ -0,0 +1,424 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_table_
+#define _h_vdb_table_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_kdb_column_
+#include <kdb/column.h>
+#endif
+
+#ifndef _h_kdb_index_
+#include <kdb/index.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VSchema;
+struct KMetadata;
+struct KNamelist;
+struct VDatabase;
+struct VDBManager;
+
+
+/*--------------------------------------------------------------------------
+ * VTable
+ *  a collection of columns indexed by row id, metadata, indices
+ */
+typedef struct VTable VTable;
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+VDB_EXTERN rc_t CC VTableAddRef ( const VTable *self );
+VDB_EXTERN rc_t CC VTableRelease ( const VTable *self );
+
+
+/* CreateTable
+ *  create a new or open an existing table using manager
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "schema" [ IN ] - schema object containg table
+ *  declaration to be used in creating tbl.
+ *
+ *  "typespec" [ IN ] - type and optionally version of table schema,
+ *  e.g. 'MY_NAMESPACE:MyTable' or 'MY_NAMESPACE:MyTable#1.1'
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to table
+ */
+VDB_EXTERN rc_t CC VDBManagerCreateTable ( struct VDBManager *self, VTable **tbl,
+    struct VSchema const *schema, const char *typespec,
+    KCreateMode cmode, const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVCreateTable ( struct VDBManager *self, VTable **tbl,
+    struct VSchema const *schema, const char *typespec,
+    KCreateMode cmode, const char *path, va_list args );
+
+
+/* CreateTable
+ *  create a new or open an existing table under database
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "member" [ IN ] - name of table member template under database
+ *  the named member is a table template rather than a named table.
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "cmode_mask" [ IN ] - if a bit of "cmode_mask" is set (1) then
+ *  the corresponding bit of "cmode" is used for the table,
+ *  otherwise (0) the corresponding bit is taken from db and "cmode"'s
+ *  bit is ignored.
+ *  the mask for setting mode (kcmOpen, kcmInit, kcmCreate) is at least
+ *  one bit set in the mask kcmValueMask.
+ *
+ *  "name" [ IN ] - NUL terminated string in
+ *  db-native character set giving actual table name
+ */
+/*VDB_EXTERN rc_t CC VDatabaseCreateTableDefault ( struct VDatabase *self, VTable **tbl,
+    const char *member, const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVCreateTableDefault ( VDatabase *self, VTable **tbl,
+    const char *member, const char *name, va_list args )
+*/
+VDB_EXTERN rc_t CC VDatabaseCreateTableByMask ( struct VDatabase *self, VTable **tbl,
+    const char *member, KCreateMode cmode, KCreateMode cmode_mask, const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVCreateTableByMask ( struct VDatabase *self, VTable **tbl,
+    const char *member, KCreateMode cmode, KCreateMode cmode_mask, const char *name, va_list args );
+/* the following function is DEPRECATED, it's left for backward compatibility only */
+VDB_EXTERN rc_t CC VDatabaseCreateTable ( struct VDatabase *self, VTable **tbl,
+    const char *member, KCreateMode cmode, const char *name, ... );
+/* the following function is DEPRECATED, it's left for backward compatibility only */
+VDB_EXTERN rc_t CC VDatabaseVCreateTable ( struct VDatabase *self, VTable **tbl,
+    const char *member, KCreateMode cmode, const char *name, va_list args );
+
+
+/* OpenTableRead
+ *  open a table for read using manager
+ * OpenTableUpdate
+ *  open a table for read/write using manager
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "schema" [ IN, NULL OKAY ] - optional schema object with
+ *  latest versions of table schema.
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to table
+ */
+VDB_EXTERN rc_t CC VDBManagerOpenTableRead ( struct VDBManager const *self,
+    const VTable **tbl, struct VSchema const *schema,
+    const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVOpenTableRead ( struct VDBManager const *self,
+    const VTable **tbl, struct VSchema const *schema,
+    const char *path, va_list args );
+
+VDB_EXTERN rc_t CC VDBManagerOpenTableUpdate ( struct VDBManager *self,
+    VTable **tbl, struct VSchema const *schema,
+    const char *path, ... );
+VDB_EXTERN rc_t CC VDBManagerVOpenTableUpdate ( struct VDBManager *self,
+    VTable **tbl, struct VSchema const *schema,
+    const char *path, va_list args );
+
+
+/* OpenTableRead
+ *  open a table for read under database
+ * OpenTableUpdate
+ *  open or create a table for read/write under database
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "name" [ IN ] - NUL terminated string in
+ *  db-native character set giving name of table member
+ */
+VDB_EXTERN rc_t CC VDatabaseOpenTableRead ( struct VDatabase const *self,
+    const VTable **tbl, const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVOpenTableRead ( struct VDatabase const *self,
+    const VTable **tbl, const char *name, va_list args );
+
+VDB_EXTERN rc_t CC VDatabaseOpenTableUpdate ( struct VDatabase *self,
+    VTable **tbl, const char *name, ... );
+VDB_EXTERN rc_t CC VDatabaseVOpenTableUpdate ( struct VDatabase *self,
+    VTable **tbl, const char *name, va_list args );
+
+
+/* Typespec
+ *  retrieve table typespec
+ *
+ *  AVAILABILITY: version 2.1
+ *
+ *  "ts_buff" [ IN ] and "ts_size" [ IN ] - buffer for return of NUL-terminated
+ *  table typespec, e.g. 'NCBI:tbl:abc #1.1'
+ */
+VDB_EXTERN rc_t CC VTableTypespec ( const VTable *self,
+    char *ts_buff, size_t ts_size );
+
+
+/* Locked
+ *  returns true if locked
+ */
+VDB_EXTERN bool CC VTableLocked ( const VTable *self );
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+VDB_EXTERN rc_t CC VTableWritable ( const VTable *self, uint32_t type,
+    const char * name, ... );
+VDB_EXTERN rc_t CC VTableVWritable ( const VTable *self, uint32_t type,
+    const char * name, va_list args );
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+VDB_EXTERN rc_t CC VTableLock ( VTable *self, uint32_t type,
+    const char * name, ... );
+VDB_EXTERN rc_t CC VTableVLock ( VTable *self, uint32_t type,
+    const char * name, va_list args );
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+VDB_EXTERN rc_t CC VTableUnlock ( VTable *self, uint32_t type,
+    const char * name, ... );
+VDB_EXTERN rc_t CC VTableVUnlock ( VTable *self, uint32_t type,
+    const char * name, va_list args );
+
+
+/* OpenMetadataRead
+ * OpenMetadataUpdate
+ *  opens metadata file
+ *
+ *  "meta" [ OUT ] - return parameter for metadata
+ */
+VDB_EXTERN rc_t CC VTableOpenMetadataRead ( const VTable *self, struct KMetadata const **meta );
+VDB_EXTERN rc_t CC VTableOpenMetadataUpdate ( VTable *self, struct KMetadata **meta );
+
+
+/* ColumnCreateParams
+ *  sets the creation parameters for physical columns
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "checksum" [ IN ] - the type of checksum information to
+ *  apply when writing blobs
+ *
+ *  "pgsize" [ IN, DEFAULT ZERO ] - size of internal column "pages"
+ *  the default value is indicated by 0 ( zero ).
+ *  NB - CURRENTLY THE ONLY SUPPORTED PAGE SIZE IS 1 ( ONE ) BYTE.
+ */
+VDB_EXTERN rc_t CC VTableColumnCreateParams ( VTable *self,
+    KCreateMode cmode, KChecksum checksum, size_t pgsize );
+
+
+/* CreateIndex
+ * VCreateIndex
+ *  create a new or open an existing index
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "type" [ IN ] - type of index to create
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+VDB_EXTERN rc_t CC VTableCreateIndex ( VTable *self, KIndex **idx,
+    KIdxType type, KCreateMode cmode, const char *name, ... );
+VDB_EXTERN rc_t CC VTableVCreateIndex ( VTable *self, KIndex **idx,
+    KIdxType type, KCreateMode cmode, const char *name, va_list args );
+
+
+/* OpenIndexRead
+ * VOpenIndexRead
+ *  open an index for read
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+VDB_EXTERN rc_t CC VTableOpenIndexRead ( const VTable *self,
+    const KIndex **idx, const char *name, ... );
+VDB_EXTERN rc_t CC VTableVOpenIndexRead ( const VTable *self,
+    const KIndex **idx, const char *name, va_list args );
+
+
+/* OpenIndexUpdate
+ * VOpenIndexUpdate
+ *  open an index for read/write
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+
+VDB_EXTERN rc_t CC VTableOpenIndexUpdate ( VTable *self,
+    KIndex **idx, const char *name, ... );
+VDB_EXTERN rc_t CC VTableVOpenIndexUpdate ( VTable *self,
+    KIndex **idx, const char *name, va_list args );
+
+
+/* ListColumns
+ *  list readable or writable column names
+ *
+ *  "names" [ OUT ] - return parameter for namelist
+ *
+ *  availability: v2.1
+ */
+VDB_EXTERN rc_t CC VTableListReadableColumns ( const VTable *self, struct KNamelist **names );
+VDB_EXTERN rc_t CC VTableListWritableColumns ( VTable *self, struct KNamelist **names );
+
+
+/* ListCol
+ *  alias for VTableListReadableColumns
+ *
+ *  availability: v2.0
+ */
+VDB_EXTERN rc_t CC VTableListCol ( const VTable *self, struct KNamelist **names );
+
+
+/* ListDatatypes
+ *  returns list of typedecls for named column
+ *
+ *  "col" [ IN ] - column name
+ *
+ *  "dflt_idx" [ OUT, NULL OKAY ] - returns the zero-based index
+ *  into "typedecls" of the default datatype for the named column
+ *
+ *  "typedecls" [ OUT ] - list of datatypes available for named column
+ *
+ *  availability: v2.1
+ */
+VDB_EXTERN rc_t CC VTableListReadableDatatypes ( const VTable *self, const char *col,
+    uint32_t *dflt_idx, struct KNamelist **typedecls );
+VDB_EXTERN rc_t CC VTableListWritableDatatypes ( VTable *self,
+    const char *col, struct KNamelist **typedecls );
+
+
+/* ColumnDatatypes
+ *  alias for VTableListReadableDatatypes
+ *
+ *  availability: v2.0
+ */
+VDB_EXTERN rc_t CC VTableColumnDatatypes ( const VTable *self, const char *col,
+    uint32_t *dflt_idx, struct KNamelist **typedecls );
+
+
+/* Reindex
+ *  optimize column indices
+ */
+VDB_EXTERN rc_t CC VTableReindex ( VTable *self );
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+VDB_EXTERN rc_t CC VTableOpenManagerRead ( const VTable *self, struct VDBManager const **mgr );
+VDB_EXTERN rc_t CC VTableOpenManagerUpdate ( VTable *self, struct VDBManager **mgr );
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+VDB_EXTERN rc_t CC VTableOpenParentRead ( const VTable *self, struct VDatabase const **db );
+VDB_EXTERN rc_t CC VTableOpenParentUpdate ( VTable *self, struct VDatabase **db );
+
+
+/* OpenSchema
+ *  duplicate reference to table schema
+ *  NB - returned reference must be released
+ */
+VDB_EXTERN rc_t CC VTableOpenSchema ( const VTable *self, struct VSchema const **schema );
+
+
+/* GetUserData
+ * SetUserData
+ *  store/retrieve an opaque pointer to user data
+ *
+ *  "data" [ OUT ] - return parameter for getting data
+ *  "data" [ IN ] - parameter for setting data
+ *
+ *  "destroy" [ IN, NULL OKAY ] - optional destructor param
+ *  invoked from destructor of "self"
+ */
+VDB_EXTERN rc_t CC VTableGetUserData ( const VTable *self, void **data );
+VDB_EXTERN rc_t CC VTableSetUserData ( const VTable *self,
+    void *data, void ( CC * destroy ) ( void *data ) );
+
+
+/* IsEmpty
+ *  check if the table is empty
+ */
+VDB_EXTERN rc_t CC VTableIsEmpty( const VTable *self, bool * empty );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_vdb_table_ */
diff --git a/interfaces/vdb/table.hpp b/interfaces/vdb/table.hpp
new file mode 100644
index 0000000..3270a22
--- /dev/null
+++ b/interfaces/vdb/table.hpp
@@ -0,0 +1,328 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb_table_
+#define _hpp_vdb_table_
+
+#ifndef _h_vdb_table_
+#include <vdb/table.h>
+#endif
+
+#ifndef _h_vdb_cursor_
+#include <vdb/cursor.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * VTable
+ *  a collection of columns indexed by row id, metadata, indices
+ */
+struct VTable
+{
+    /* AddRef
+     * Release
+     *  all objects are reference counted
+     *  NULL references are ignored
+     */
+    inline rc_t AddRef ( const VTable *self ) const throw()
+    { return VTableAddRef ( this ); }
+    inline rc_t Release ( const VTable *self ) const throw()
+    { return VTableRelease ( this ); }
+
+    /* Locked
+     *  returns true if locked
+     */
+    inline bool Locked () const throw()
+    { return VTableLocked ( this ); }
+
+
+    /* Writable
+     *  returns 0 if object is writable
+     *  or a reason why if not
+     *
+     *  "type" [ IN ] - a KDBPathType
+     *  valid values are kptIndex and kptColumn
+     *
+     *  "path" [ IN ] - NUL terminated path
+     */
+     inline rc_t Writable ( uint32_t type, 
+        const char * name, ... ) const throw()
+     {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VTableVWritable ( this, type, name, args );
+        va_end ( args );
+        return rc;
+     }
+     inline rc_t Writable ( uint32_t type, 
+        const char * name, va_list args ) const throw()
+    { return VTableVWritable ( this, type, name, args ); }
+
+
+    /* Lock
+     *  apply lock
+     *
+     *  if object is already locked, the operation is idempotent
+     *  and returns an rc state of rcLocked
+     *
+     *  "type" [ IN ] - a KDBPathType
+     *  valid values are kptIndex and kptColumn
+     *
+     *  "name" [ IN ] - NUL terminated path
+     */
+    inline rc_t Lock ( uint32_t type, const char * name, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VTableVLock ( this, type, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t Lock ( uint32_t type, const char * name, va_list args ) throw()
+    { return VTableVLock ( this, type, name, args ); }
+
+    
+    /* Unlock
+     *  remove lock
+     *
+     *  if object is already unlocked, the operation is idempotent
+     *  and returns an rc state of rcUnlocked
+     *
+     *  "type" [ IN ] - a KDBPathType
+     *  valid values are kptIndex and kptColumn
+     *
+     *  "name" [ IN ] - NUL terminated path
+     */
+     inline rc_t Unlock ( uint32_t type, const char * name, ... ) throw()
+     {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VTableVUnlock ( this, type, name, args );
+        va_end ( args );
+        return rc;
+     }
+    inline rc_t UnLock ( uint32_t type, const char * name, va_list args ) throw()
+    { return VTableVUnlock ( this, type, name, args ); }
+
+
+    /* OpenMetadataRead
+     * OpenMetadataUpdate
+     *  opens metadata file
+     *
+     *  "meta" [ OUT ] - return parameter for metadata
+     */
+    inline rc_t OpenMetadataRead ( struct KMetadata const **meta ) const throw()
+    { return VTableOpenMetadataRead ( this, meta ); }
+    inline rc_t OpenMetadataUpdate ( struct KMetadata **meta ) throw()
+    { return VTableOpenMetadataUpdate ( this, meta ); }
+    
+
+    /* ColumnCreateParams
+     *  sets the creation parameters for physical columns
+     *
+     *  "cmode" [ IN ] - creation mode
+     *
+     *  "checksum" [ IN ] - the type of checksum information to
+     *  apply when writing blobs
+     *
+     *  "pgsize" [ IN, DEFAULT ZERO ] - size of internal column "pages"
+     *  the default value is indicated by 0 ( zero ).
+     *  NB - CURRENTLY THE ONLY SUPPORTED PAGE SIZE IS 1 ( ONE ) BYTE.
+     */
+    inline rc_t ColumnCreateParams ( KCreateMode cmode, 
+        KChecksum checksum, size_t pgsize ) throw()
+    { return VTableColumnCreateParams ( this, cmode, checksum, pgsize ); }
+
+
+    /* CreateIndex
+     * VCreateIndex
+     *  create a new or open an existing index
+     *
+     *  "idx" [ OUT ] - return parameter for newly opened index
+     *
+     *  "type" [ IN ] - type of index to create
+     *
+     *  "cmode" [ IN ] - creation mode
+     *
+     *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+     */
+    inline rc_t CreateIndex ( KIndex **idx,
+        KIdxType type, KCreateMode cmode, const char *name, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VTableVCreateIndex ( this, idx, type, cmode, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t CreateIndex ( KIndex **idx,
+        KIdxType type, KCreateMode cmode, const char *name, va_list args ) throw()
+    { return VTableVCreateIndex ( this, idx, type, cmode, name, args ); }
+
+
+    /* OpenIndexRead
+     * VOpenIndexRead
+     *  open an index for read
+     *
+     *  "idx" [ OUT ] - return parameter for newly opened index
+     *
+     *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+     */
+    inline rc_t OpenIndexRead ( const KIndex **idx,
+        const char *name, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VTableVOpenIndexRead ( this, idx, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenIndexRead ( const KIndex **idx,
+        const char *name, va_list args ) const throw()
+    { return VTableVOpenIndexRead ( this, idx, name, args ); }
+
+
+    /* OpenIndexUpdate
+     * VOpenIndexUpdate
+     *  open an index for read/write
+     *
+     *  "idx" [ OUT ] - return parameter for newly opened index
+     *
+     *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+     */
+    inline rc_t OpenIndexUpdate ( KIndex **idx,
+        const char *name, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, name );
+        rc_t rc = VTableVOpenIndexUpdate ( this, idx, name, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t OpenIndexUpdate ( KIndex **idx,
+        const char *name, va_list args ) throw()
+    { return VTableVOpenIndexUpdate ( this, idx, name, args ); }
+
+
+    /* List
+     *  create table listings
+     */
+    inline rc_t ListCol ( struct KNamelist **names ) const throw()
+    { return VTableListCol ( this, names ); }
+
+
+    /* ColumnDatatypes
+     *  returns list of typedecls for named column
+     *
+     *  "col" [ IN ] - column name
+     *
+     *  "dflt_idx" [ OUT, NULL OKAY ] - returns the zero-based index
+     *  into "typedecls" of the default datatype for the named column
+     *
+     *  "typedecls" [ OUT ] - list of datatypes available for named column
+     */
+    inline rc_t ColumnDatatypes ( const char *col,
+        uint32_t *dflt_idx, struct KNamelist **typedecls ) const throw()
+    { return VTableColumnDatatypes ( this, col, dflt_idx, typedecls ); }
+
+
+    /* Reindex
+     *  optimize column indices
+     */
+    inline rc_t Reindex () throw()
+    { return VTableReindex ( this ); }
+
+
+    /* OpenManager
+     *  duplicate reference to manager
+     *  NB - returned reference must be released
+     */
+    inline rc_t OpenManager ( struct VDBManager const **mgr ) const throw()
+    { return VTableOpenManagerRead ( this, mgr ); }
+    inline rc_t OpenManager ( struct VDBManager **mgr ) throw()
+    { return VTableOpenManagerUpdate ( this, mgr ); }
+
+
+    /* OpenParent
+     *  duplicate reference to parent database
+     *  NB - returned reference must be released
+     */
+    inline rc_t OpenParent ( struct VDatabase const **db ) const throw()
+    { return VTableOpenParentRead ( this, db ); }
+    inline rc_t OpenParent ( struct VDatabase **db ) throw()
+    { return VTableOpenParentUpdate ( this, db ); }
+
+
+    /* OpenSchema
+     *  duplicate reference to table schema
+     *  NB - returned reference must be released
+     */
+    inline rc_t OpenSchema ( struct VSchema const **schema ) const throw()
+    { return  VTableOpenSchema ( this, schema ); }
+
+
+    /* GetUserData
+     * SetUserData
+     *  store/retrieve an opaque pointer to user data
+     *
+     *  "data" [ OUT ] - return parameter for getting data
+     *  "data" [ IN ] - parameter for setting data
+     *
+     *  "destroy" [ IN, NULL OKAY ] - optional destructor param
+     *  invoked from destructor of "self"
+     */
+    inline rc_t GetUserData ( void **data ) const throw()
+    { return VTableGetUserData ( this, data ); }
+    inline rc_t SetUserData ( void *data,
+        void ( CC * destroy ) ( void *data ) ) const throw()
+    { return VTableSetUserData ( this, data, destroy ); }
+
+
+    /* CreateCursor
+     *  creates a cursor object onto table
+     *  multiple read cursors are allowed
+     *  only a single write cursor is allowed
+     *
+     *  "curs" [ OUT ] - return parameter for newly created cursor
+     *
+     *  "mode" [ IN ] - describes update behavior
+     *    kcmUpdate   : allow inserts or updates
+     *    kcmReplace  : replace all existing rows with newly written rows
+     *    kcmInsert   : allow only inserts, i.e. new rows
+     */
+    inline rc_t CreateCursor ( const VCursor **curs ) const throw()
+    { return VTableCreateCursorRead ( this, curs ); }
+    inline rc_t CreateCursor ( VCursor **curs, KCreateMode mode ) throw()
+    { return VTableCreateCursorWrite ( this, curs, mode ); }
+
+private:
+    VTable ();
+    ~ VTable ();
+    VTable ( const VTable& );
+    VTable &operator = ( const VTable& );
+};
+
+#endif //  _hpp_vdb_table_
diff --git a/interfaces/vdb/types.h b/interfaces/vdb/types.h
new file mode 100644
index 0000000..9e79909
--- /dev/null
+++ b/interfaces/vdb/types.h
@@ -0,0 +1,39 @@
+/*=======================================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/* THIS FILE IS DEPRECATED. */
+#if _DEBUGGING && defined __GNUC__
+#warning "this file is deprecated"
+#endif
+
+#ifndef _h_vdb_types_
+#define _h_vdb_types_
+
+#ifndef _h_sra_types_
+#include <sra/types.h>
+#endif
+
+#endif /*  _h_vdb_types_ */
diff --git a/interfaces/vdb/types.hpp b/interfaces/vdb/types.hpp
new file mode 100644
index 0000000..1865964
--- /dev/null
+++ b/interfaces/vdb/types.hpp
@@ -0,0 +1,230 @@
+/*=======================================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb_types_
+#define _hpp_vdb_types_
+
+// types are defined here
+#ifndef _h_vdb_types_
+#include <vdb/types.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * VDatatypes
+ */
+struct VDatatypes
+{
+    /* AddRef
+     * Release
+     */
+    inline rc_t AddRef () const throw()
+    { return VDatatypesAddRef ( this ); }
+
+    inline rc_t Release () const throw()
+    { return VDatatypesRelease ( this ); }
+
+
+    /* RegisterOpaque
+     * RegisterSubtype
+     *  registers new datatypes
+     *
+     *  "newtype" [ IN ] - NUL terminated fully qualified type name
+     *
+     *  "supertype" [ IN ] and "dim" [ IN ] - NUL terminated fully
+     *  qualified parent equivalency type and vector dimension
+     *  -OR-
+     *  "bits" [ IN ] - size in bits of element.
+     *
+     *  "byte_swap" [ IN, CONDITIONALLY NULL OKAY ] - a byte swapping function
+     *  required when size > 8 and and integral multiple of 8.
+     */
+#if 0 /* is omitted in sra/types.h too */
+    inline rc_t RegisterOpaque ( const char *newtype,
+       uint16_t bits, void ( CC *byte_swap ) ( void *elem ) ) throw()
+    { return VDatatypesRegisterOpaque ( this, newtype, bits, byte_swap ); }
+
+    inline rc_t RegisterSubtype ( const char *newtype, const char *supertype,
+        uint16_t dim, void ( CC *byte_swap ) ( void *elem ) ) throw()
+    { return VDatatypesRegisterSubtype ( this, newtype, supertype, dim, byte_swap ); }
+#endif
+
+
+    /* DefineSubtype
+     *  creates a subtype definition
+     *
+     *    typedef = [ 'typedef' ] <supertype> <typedecl>
+     */
+#if 0 /* is omitted in sra/types.h too */
+     inline rc_t DefineSubtype ( const char *definition, ... ) throw()
+    {
+        va_list args;
+        va_start ( args, definition );
+        rc_t rc = VDatatypesVDefineSubtype ( this, definition, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t DefineSubtype ( const char *definition, va_list args ) throw()
+    { return VDatatypesVDefineSubtype ( this, definition, args ); }
+#endif
+
+
+    /* ResolveTypedecl
+     *  converts a typedecl string to type id and vector dimension
+     *
+     *  "resolved" [ OUT ] - resolved type declaration
+     *
+     *  "typedecl" [ IN ] - type declaration
+     */
+    inline rc_t ResolveTypedecl ( VTypedecl *resolved,
+        const char *typedecl, ... ) const throw()
+    {
+        va_list args;
+        va_start ( args, typedecl );
+        rc_t rc = VDatatypesVResolveTypedecl ( this, resolved, typedecl, args );
+        va_end ( args );
+        return rc;
+    }
+    inline rc_t ResolveTypedecl ( VTypedecl *resolved,
+        const char *typedecl, va_list args ) const throw()
+    { return VDatatypesVResolveTypedecl ( this, resolved, typedecl, args ); }
+
+
+    /* ResolveTypename
+     *  convert a type id into its type definition
+     *
+     *  "resolved" [ OUT ] - resolved type definition
+     *
+     *  "typname" [ IN ] - NUL-terminated type name
+     */
+    inline rc_t ResolveTypename ( VTypedef *resolved,
+        const char *typname ) const throw()
+    { return VDatatypesResolveTypename ( this, resolved, typname ); }
+
+
+    /* ResolveTypeid
+     *  convert a type id into its type definition
+     *
+     *  "resolved" [ OUT ] - resolved type definition
+     *
+     *  "type_id" [ IN ] - 1-based runtime type id
+     */
+    inline rc_t ResolveTypeid ( VTypedef *resolved,
+        uint32_t type_id ) const throw()
+    { return VDatatypesResolveTypeid ( this, resolved, type_id ); }
+
+
+    /* SizeofTypedecl
+     *  returns the bit size of type declaration
+     */
+    inline rc_t SizeofTypedecl ( bitsz_t *type_size,
+        const VTypedecl *td ) const throw()
+    { return VDatatypesSizeofTypedecl ( this, type_size, td ); }
+
+
+    /* SizeofTypeid
+     *  returns the bit size of typeid
+     *
+     *  "type_size" [ OUT ] - bit size of a type
+     *
+     *  "type_id" [ IN ] - numerical index of a type
+     *
+     *  "all_elements" [ IN ] - for multi-dimesional types
+     *  return the sum of sizes, otherwise - only for a single element
+     */
+    inline rc_t SizeofTypeid ( bitsz_t *type_size, uint32_t type_id,
+        bool all_elements ) const throw()
+    { return VDatatypesSizeofTypeid ( this, type_size, type_id, all_elements ); }
+
+
+    /* MakeTypedecl
+     *  convert a VTypedecl into canonical text
+     *
+     *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+     *  NUL terminated type declaration string
+     *
+     *  "typedecl" [ IN ] - binary representation of typedecl
+     */
+    inline rc_t MakeTypedecl ( char *buffer, size_t bsize,
+        const VTypedecl *typedecl ) const throw()
+    { return VDatatypesMakeTypedecl ( this, buffer, bsize, typedecl ); }
+
+
+    /* ToSupertype
+     *  cast a typedecl to a size-equivalent supertype decl
+     *  returns not-found and leaves "typedecl" unchanged
+     *  if no supertype exists
+     *
+     *  "typedecl" [ IN, OUT ] - populated with a correct
+     *  type id and vector dimension on input, will be updated
+     *  to contain a supertype and equivalent dimension on
+     *  output. e.g.:
+     *
+     *    IN -  { type_id NCBI:qual4, dim 1 }
+     *    OUT - { type_id I8, dim 4 }
+     */
+    inline rc_t ToSupertype ( VTypedecl *typedecl ) const throw()
+    { return VDatatypesToSupertype ( this,  typedecl ); }
+
+
+    /* ToIntrinsic
+     *  cast a typedecl ( if necessary ) to a size-equivalent
+     *  intrinsic typedecl.
+     *
+     *  returns not-found and leaves "typedecl" unchanged
+     *  if no intrinsic supertype exists
+     *
+     *  leaves "typedecl" unchanged if it is already intrinsic.
+     *
+     *  "typedecl" [ IN, OUT ] - populated with a correct
+     *  type id and vector dimension on input, will be updated
+     *  to contain a supertype and equivalent dimension on
+     *  output. e.g.:
+     *
+     *    IN -  { type_id NCBI:qual4, dim 1 }
+     *    OUT - { type_id I8, dim 4 }
+     */
+    inline rc_t ToIntrinsic ( VTypedecl *typedecl ) const throw()
+    { return VDatatypesToIntrinsic ( this, typedecl ); }
+
+
+    /* ToAncestor
+     *  cast a typedecl to a size-equivalent ancestor decl
+     *  returns true if cast can be performed
+     */
+    inline bool ToAncestor ( const VTypedecl *to,
+        const VTypedecl *from ) const throw()
+    { return VDatatypesToAncestor ( this, to, from ); }
+
+
+private:
+    VDatatypes ();
+    ~ VDatatypes ();
+    VDatatypes ( const VDatatypes& );
+    VDatatypes &operator = ( const VDatatypes& );
+};
+
+#endif //  _hpp_vdb_types_
diff --git a/interfaces/vdb/vdb-priv.h b/interfaces/vdb/vdb-priv.h
new file mode 100644
index 0000000..b130bb4
--- /dev/null
+++ b/interfaces/vdb/vdb-priv.h
@@ -0,0 +1,342 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_vdb_priv_
+#define _h_vdb_vdb_priv_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDatabase;
+struct KTable;
+struct KMetadata;
+struct KDBManager;
+struct KDirectory;
+struct VDBManager;
+struct VFSManager;
+struct VResolver;
+struct VSchema;
+struct VTypedef;
+struct VDatabase;
+struct VTable;
+struct VCursor;
+struct VCursorParams;
+struct VXformInfo;
+struct KDataBuffer;
+struct KNamelist;
+
+
+/*--------------------------------------------------------------------------
+ * VDBManager
+ */
+
+
+/* MakeRsrc
+ *  common make, regardless of library
+ */
+VDB_EXTERN rc_t CC VDBManagerMakeRsrc ( struct VDBManager **mgr, struct VFSManager * vfs );
+
+
+/* OpenKDBManager
+ *  returns a new reference to KDBManager used by VDBManager
+ */
+VDB_EXTERN rc_t CC VDBManagerOpenKDBManagerRead ( struct VDBManager const *self,
+    struct KDBManager const **kmgr );
+VDB_EXTERN rc_t CC VDBManagerOpenKDBManagerUpdate ( struct VDBManager *self,
+    struct KDBManager **kmgr );
+
+#define VDBManagerGetKDBManagerRead VDBManagerOpenKDBManagerRead
+#define VDBManagerGetKDBManagerUpdate VDBManagerOpenKDBManagerUpdate
+
+
+/* ListExternalSchemaModules
+ */
+VDB_EXTERN rc_t CC VDBManagerListExternalSchemaModules ( struct VDBManager const *self,
+    struct KNamelist **list );
+
+/* DisablePagemapThread
+ *  this can cause difficulties for some clients
+ */
+VDB_EXTERN rc_t CC VDBManagerDisablePagemapThread ( struct VDBManager const *self );
+
+/* DisableFlushThread
+ *  Disable the background cursor flush thread, may be useful when debugging
+ */
+VDB_EXTERN rc_t CC VDBManagerDisableFlushThread ( struct VDBManager *self );
+
+
+/* Make with custom VFSManager */
+VDB_EXTERN rc_t CC VDBManagerMakeReadWithVFSManager (
+    struct VDBManager const **mgr,
+    struct KDirectory const *wd, struct VFSManager *vmgr );
+VDB_EXTERN rc_t CC VDBManagerMakeUpdateWithVFSManager (
+    struct VDBManager **mgr, struct KDirectory *wd, struct VFSManager *vmgr );
+
+
+/** Reset VResolver to set protected repository context */
+VDB_EXTERN rc_t CC VDBManagerSetResolver
+    ( struct VDBManager const * self, struct VResolver * resolver );
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ */
+
+/* DescribeTypedef - PRIVATE
+ *  a type is defined as either:
+ */
+VDB_EXTERN rc_t CC VSchemaDescribeTypedef ( struct VSchema const *self,
+    struct VTypedef *def, uint32_t type_id );
+
+/* LastIntrinsicTypeId - PRIVATE
+ *  used to allow cast to intrinsics
+ */
+VDB_EXTERN uint32_t CC VSchemaLastIntrinsicTypeId ( struct VSchema const *self );
+
+/* ListLegacyTables - PRIVATE
+ *  scan all tables defined in schema
+ *  return the fully-qualified and versioned name of each legacy SRA table
+ */
+VDB_EXTERN rc_t CC VSchemaListLegacyTables ( struct VSchema const *self, struct KNamelist **list );
+
+
+/*--------------------------------------------------------------------------
+ * VDatabase
+ */
+
+/* OpenKDatabase
+ *  returns a new reference to underlying KDatabase
+ */
+VDB_EXTERN rc_t CC VDatabaseOpenKDatabaseRead ( struct VDatabase const *self, struct KDatabase const **kdb );
+VDB_EXTERN rc_t CC VDatabaseOpenKDatabaseUpdate ( struct VDatabase *self, struct KDatabase **kdb );
+
+
+/* IsCSRA
+ *  ask an open database if it conforms to cSRA schema
+ */
+VDB_EXTERN bool CC VDatabaseIsCSRA ( struct VDatabase const *self );
+
+
+/*--------------------------------------------------------------------------
+ * VTable
+ */
+
+/* OpenKTable
+ *  returns a new reference to underlying KTable
+ */
+VDB_EXTERN rc_t CC VTableOpenKTableRead ( struct VTable const *self, struct KTable const **ktbl );
+VDB_EXTERN rc_t CC VTableOpenKTableUpdate ( struct VTable *self, struct KTable **ktbl );
+
+#define VTableGetKTableRead VTableOpenKTableRead
+#define VTableGetKTableUpdate VTableOpenKTableUpdate
+
+
+/* DropColumn
+ */
+VDB_EXTERN rc_t CC VTableDropColumn ( struct VTable *self, const char *name, ... );
+VDB_EXTERN rc_t CC VTableVDropColumn ( struct VTable *self, const char *name, va_list args );
+
+/* RenameColumn
+ */
+VDB_EXTERN rc_t CC VTableRenameColumn ( struct VTable *self, bool force,
+    const char *from, const char *to );
+
+/* ListPhysColumns
+ * ListSeededWritableColumns
+ *  avail: 2.4
+ */
+VDB_EXTERN rc_t CC VTableListPhysColumns ( struct VTable const *self, struct KNamelist **names );
+VDB_EXTERN rc_t CC VTableListSeededWritableColumns ( struct VTable *self,
+    struct KNamelist **names, struct KNamelist const *seed );
+
+
+/* HasStaticColumn
+ *  given a physical column name, report whether it exists
+ *  and is ( currently ) static
+ *  avail: 2.5
+ */
+VDB_EXTERN bool CC VTableHasStaticColumn ( struct VTable const *self, const char *name );
+VDB_EXTERN bool CC VTableVHasStaticColumn ( struct VTable const *self, const char *name, va_list args );
+
+
+/* VUntypedTableTest
+ *  support for tables created before embedded schema
+ *
+ *  "ktbl" [ IN ] - physical table to recognize
+ *
+ *  "meta" [ IN ] - open metadata for table
+ *
+ *  returns true if table is recognized
+ */
+typedef bool ( CC * VUntypedTableTest )
+   ( struct KTable const *ktbl, struct KMetadata const *meta );
+
+
+/* StoreSchema
+ *  stores current schema definition in metadata
+ *
+ *  useful if table was opened using a later version of schema than
+ *  was used for its creation.
+ */
+VDB_EXTERN rc_t VTableStoreSchema ( struct VTable *self );
+
+
+/*--------------------------------------------------------------------------
+ * VCursor
+ */
+
+
+/* CreateCursorView
+ *  creates a read-only cursor onto table
+ *  uses table schema as base
+ *  uses view described in viewspec as view
+ *
+ *  AVAILABILITY: version 2.3
+ *
+ *  for pre-vdb-2.3 tables, defaults to CreateCursorRead, ignoring
+ *  schema specification
+ *
+ *  "curs" [ OUT ] - return parameter for newly created cursor
+ *
+ *  "viewspec" [ IN ] - NUL terminated string describing the view schema
+ */
+VDB_EXTERN rc_t CC VTableCreateCursorView ( struct VTable const *self,
+    struct VCursor const **curs, const char *viewspec );
+
+/* PermitPostOpenAdd
+ *  allows columns to be added to open cursor
+ *  for write cursor, the effect lasts until the first row commit
+ */
+VDB_EXTERN rc_t CC VCursorPermitPostOpenAdd ( struct VCursor const *self );
+/*  SuspendTriggers
+ *  blocks resolution of schema-based triggers
+ *
+ */
+VDB_EXTERN rc_t CC VCursorSuspendTriggers ( struct VCursor const *self );
+
+/*  VCursorGetSchema
+ *  returns current schema of the open cursor
+ */
+VDB_EXTERN struct VSchema const* CC VCursorGetSchema ( struct VCursor const *self);
+
+/* PageIdRange
+ *  returns id range for page
+ *
+ *  "id" [ IN ] - page containing this row id is target
+ *
+ *  "first" [ OUT, NULL OKAY ] and "last" [ OUT, NULL OKAY ] -
+ *  id range is returned in these output parameters, where
+ *  at least ONE must be NOT-NULL
+ */
+VDB_EXTERN rc_t CC VCursorPageIdRange ( struct VCursor const *self,
+    uint32_t idx, int64_t id, int64_t *first, int64_t *last );
+
+
+/* IsStaticColumn
+ *  answers question: "does this column have the same value for every cell?"
+ */
+VDB_EXTERN rc_t CC VCursorIsStaticColumn ( struct VCursor const *self,
+    uint32_t col_idx, bool *is_static );
+
+
+VDB_EXTERN rc_t CC VCursorLinkedCursorGet(const struct VCursor *cself,const char *tbl, struct VCursor const **curs);
+VDB_EXTERN rc_t CC VCursorLinkedCursorSet(const struct VCursor *cself,const char *tbl, struct VCursor const *curs);
+
+VDB_EXTERN uint64_t CC VCursorSetCacheCapacity(struct VCursor *self,uint64_t capacity);
+VDB_EXTERN uint64_t CC VCursorGetCacheCapacity(const struct VCursor *self);
+
+
+/*--------------------------------------------------------------------------
+ * VCursorParams
+ */
+
+/* Get
+ *  return KDataBuffer value by reference
+ */
+VDB_EXTERN rc_t CC VCursorParamsGet ( struct VCursorParams const *self,
+    const char *name, struct KDataBuffer **value );
+
+/* Set
+ *  set a textual parameter value
+ */
+VDB_EXTERN rc_t CC VCursorParamsSet( struct VCursorParams const *self,
+    const char *name, const char *fmt, ... );
+VDB_EXTERN rc_t CC VCursorParamsVSet ( struct VCursorParams const *self,
+    const char *name, const char *fmt, va_list args );
+
+/* Unset
+ *  set the value of a named parameter to "undefined"
+ */
+VDB_EXTERN rc_t CC VCursorParamsUnset ( struct VCursorParams const *self, const char *name );
+
+
+/*--------------------------------------------------------------------------
+ * xform
+ */
+
+/*
+  uses vftReserved code
+  returns little-endian data, no row-wise rle
+  fixed row-length is calculated as dst->elem_count / num_rows
+ */
+#define vftLegacyBlob vftReserved
+
+typedef struct VLegacyBlobResult VLegacyBlobResult;
+struct VLegacyBlobResult
+{
+    struct KDataBuffer *dst;
+    uint8_t byte_order;
+};
+
+typedef rc_t ( CC * VNoHdrBlobFunc ) ( void *self,
+    struct VXformInfo const *info, VLegacyBlobResult *rslt,
+    struct KDataBuffer const *src );
+
+/* function to call to test table against schema */
+typedef bool ( CC * VUntypedFunc )
+    ( struct KTable const *tbl, struct KMetadata const *meta );
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vdb_vdb_priv_ */
diff --git a/interfaces/vdb/vdb.h b/interfaces/vdb/vdb.h
new file mode 100644
index 0000000..910b214
--- /dev/null
+++ b/interfaces/vdb/vdb.h
@@ -0,0 +1,62 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_vdb_
+#define _h_vdb_vdb_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*==========================================================================
+ * VDB schema
+ */
+
+/* bit align for packed data */
+enum
+{
+    ALIGN_LEFT  =  0,
+    ALIGN_RIGHT =  1
+};
+    
+/* case sensivity mode */
+enum
+{
+    CASE_SENSITIVE          = 0,
+    CASE_INSENSITIVE_LOWER  = 1,
+    CASE_INSENSITIVE_UPPER  = 2
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_vdb_vdb_ */
diff --git a/interfaces/vdb/vdb.vschema b/interfaces/vdb/vdb.vschema
new file mode 100644
index 0000000..be3225d
--- /dev/null
+++ b/interfaces/vdb/vdb.vschema
@@ -0,0 +1,859 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * VDB external functions, formats and types
+ */
+version 1;
+
+// built-in functions should be known to all
+include 'vdb/built-in.vschema';
+
+
+/*--------------------------------------------------------------------------
+ * types
+ */
+
+/* text_token
+ *  a vector describing tokens recognized within a text string
+ *
+ * COMPONENTS:
+ *  0 - token id
+ *  1 - token starting coordinate
+ *  2 - token length
+ */
+typedef U16 text:token [ 3 ];
+
+
+/*--------------------------------------------------------------------------
+ * typesets
+ */
+typeset pack_set { B8, B16, B32, B64, integer_set };
+typeset izip_set { integer_set };
+typeset fzip_set { F32 };
+
+
+/*--------------------------------------------------------------------------
+ * formats
+ */
+fmtdef izip_fmt;
+fmtdef fzip_fmt;
+fmtdef rle_fmt;
+fmtdef zlib_fmt;
+fmtdef bzip2_fmt;
+
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+/* echo
+ *  returns single or repeated constant value
+ *
+ *  "T" [ TYPE ] - type of constant data to return
+ *
+ *  "val" [ CONST ] - a data constant
+ *
+ *  "row_len" [ DATA, OPTIONAL ] - if omitted, "val" will be
+ *  issued once and the resultant row-length will be the length
+ *  of "val". otherwise, "val" will be repeated and/or truncated
+ *  as necessary to produce a row-length equal to that of input.
+ *
+ * USAGE:
+ *  to echo a single constant value
+ *    U16 len = row_len ( col ) | < U16 > echo < 0 > ();
+ *
+ *  to create a row of repeated values
+ *    ascii allN = < ascii > echo < 'N' > ( col );
+ */
+function < type T >
+T echo #1.0 < T val > ( * any row_len )
+    = vdb:echo;
+
+
+/* exists
+ *  returns constant or dynamic value if predicate input exists
+ *
+ *  "T" [ TYPE ] - type of data to return
+ *
+ *  "cval" [ CONST, OPTIONAL ] - a data constant. when present,
+ *  the function will behave like "echo" ( see below )
+ *
+ *  "predicate" [ DATA ] - an input whose existence determines
+ *  whether the function will operate or not.
+ *
+ *  "dval" [ DATA, OPTIONAL ] - data value, either passed through
+ *  or used to determine a repeat count of "cval" ( see below )
+ *
+ * USAGE:
+ *  when "cval" is omitted, "dval" must be present and will be
+ *  passed through depending upon the existence of "predicate"
+ *    U8 count = < U8 > exists ( col, count2 );
+ *
+ *  when "cval" is present, "dval" may be omitted, and "cval" will
+ *  be passed through just like echo depending upon "predicate"
+ *   U8 count = < U8 > exists < 2 > ( col2 ) | < U8 > echo < 1 > ();
+ *
+ *  when "cval" and "dval" are both present, the behavior is
+ *  like echo, but gated with "predicate"
+ *    ascii poly = < ascii > exists < 'a' > ( col, repeat );
+ */
+function < type T >
+T exists #1.0 < * T cval > ( any predicate, * T dval )
+    = vdb:exists;
+
+
+/* map
+ *  translate input elements
+ *  behaves much like the Unix "tr" command
+ *  except that charsets are not [currently] supported
+ *
+ *  "A" [ TYPE ] - input data type, e.g. "ascii"
+ *
+ *  "B" [ TYPE ] - output data type, e.g. "ascii" or "U8"
+ *
+ *  "from" [ CONST ] - set of key values.
+ *
+ *  "to" [ CONST ] - set of mapped values,
+ *  where length ( from ) === length ( to )
+ *
+ *  "in" [ DATA ] - input data to be matched against keys
+ *  in "from". also serves as source data when "src" is omitted
+ *
+ *  "src" [ DATA, OPTIONAL ] - source data to be edited by
+ *  substituting "to" values when corresponding "in" value
+ *  matches key in "from". if omitted, "in" is used.
+ *
+ * USAGE:
+ *  to upper case letters from a given alphabet
+ *    ascii upper = < ascii, ascii > map < 'acgtn', 'ACGTN' > ( in );
+ *
+ *  to translate from ascii to binary
+ *    U8 bin = < ascii, U8 > map < 'ACGTN', [ 0, 1, 2, 3, 0 ] > ( in );
+ *
+ *  to alter certain values of a column based upon values in another
+ *    U8 n_encoded = < ascii, U8 > map < 'N', 0 > ( read, quality );
+ *
+ * CAVEATS:
+ *  the full canonical mode of operation uses separate inputs
+ *  for key matching and output source.
+ *
+ *  when a single input is specified:
+ *   - sizeof ( A ) must equal sizeof ( B )
+ *   - A must be a proper subset of B -OR-
+ *   - "from" keys must match every possible "in" value ( total substitution )
+ */
+function < type A, type B >
+B map #1.0 < A from, B to > ( A in, * B src )
+    = vdb:map;
+
+
+/* clip
+ *  limit data values to given bounds
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *
+ *  "dim" [ CONST >= 1 ] - fixed dimension on
+ *  input and output vectors
+ *
+ *  "lower" [ CONST ] - lower bound, inclusive
+ *
+ *  "upper" [ CONST ] - upper bounds, inclusive
+ *
+ *  "in" [ DATA ] - data to be clipped
+ */
+function < type T >
+T clip #1.0 < T lower, T upper > ( T in )
+    = vdb:clip;
+
+function < type T, U32 dim >
+T [ dim ] vclip #1.0 < T lower, T upper > ( T [ dim ] in )
+    = vdb:clip;
+
+
+/* ceil
+ *  round up to the nearest integer
+ *
+ *  "in" [ DATA ] - data to be processed
+ */
+function
+numeric_set ceil #1.0 ( float_set in )
+    = vdb:ceil;
+
+/* floor
+ *  round down to the nearest integer
+ *
+ *  "in" [ DATA ] - data to be processed
+ */
+function
+numeric_set floor #1.0 ( float_set in )
+    = vdb:floor;
+
+/* round
+ *  round to nearest integer away from zero
+ *
+ *  "T" [ TYPE = { F32, F64 } ] - input and output data type
+ *
+ *  "in" [ DATA ] - data to be processed
+ */
+function
+numeric_set round #1.0 ( float_set in )
+    = vdb:round;
+
+/* trunc
+ *  round to the nearest integer not larger in absolute value
+ *
+ *  "T" [ TYPE = { F32, F64 } ] - input and output data type
+ *
+ *  "in" [ DATA ] - data to be processed
+ */
+function
+numeric_set trunc #1.0 ( float_set in )
+    = vdb:trunc;
+
+
+/* min
+ *  return the minimum value of each element
+ * max
+ *  return the maximum value of each element
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *
+ *  "a" [ DATA ] - first operand
+ *
+ *  "b" [ DATA ] - second operand
+ *
+ * SYNOPSIS:
+ *  compares two inputs element by element
+ *  returns min or max element of each
+ *
+ * USAGE:
+ *  intersections
+ *    U32 left = < U32 > max ( left_a, left_b );
+ *    U32 right = < U32 > min ( right_a, right_b );
+ */
+function < type T >
+T min #1.0 ( T a, T b )
+    = vdb:min;
+
+function < type T >
+T max #1.0 ( T a, T b )
+    = vdb:max;
+
+
+/* sum
+ *  return the sum of inputs
+ * diff
+ *  return the difference of inputs
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be member of numeric_set
+ *
+ *  "k" [ CONST, DEFAULT 0 ] - optional constant
+ *  to be added or subtracted
+ *
+ *  "a" [ DATA ] - left-most operand
+ *
+ *  "b" [ DATA ] - optional subtractand
+ *
+ * SYNOPSIS:
+ *  incorporates "k" into expression for every row
+ *  returns sum or difference of inputs for all rows
+ *
+ * USAGE:
+ *  length of half-closed interval
+ *    U32 len = < U32 > diff ( stop, start );
+ *  convert one-based coordinate to zero based
+ *    U32 zero_based = < U32 > diff < 1 > ( one_based );
+ */
+function < type T >
+T sum #1.0 < * T k > ( T a, ... )
+    = vdb:sum;
+
+function < type T >
+T diff #1.0 < * T k > ( T a * T b )
+    = vdb:diff;
+
+/* deriv
+ *  return the 1st derivative of an input row
+ * integral
+ *  return the "integral" of an input row
+ *   integral   -> starts with 1st value
+ *   integral_0 -> starts with 0
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be signed integer of any size
+ *
+ *  "in" [ DATA ] - input to be modified
+ *
+ * SYNOPSIS:
+ *  derivative function is ( in [ i ] - in [ i - 1 ] )
+ *    for i = 0 .. length ( in ) - 1,
+ *    assuming in [ 0 - 1 ] = 0 ( i.e. leaves in [ 0 ] intact ).
+ *
+ *  integral function is sum ( in [ 0 ] .. in [ i ] )
+ *    for i = 0 .. length ( in ) - 1.
+ *
+ *  integral_0 function is sum ( in [ 0 ] .. in [ i - 1 ] )
+ *    for i = 1 .. length ( in ) - 1,
+ *    setting output [ 0 ] = 0.
+ *
+ * USAGE:
+ *  "deriv" and "integral" are reciprocal functions.
+ *  the oddity is that "deriv" creates an output series
+ *  with the same length as the input series, causing the
+ *  first element of input to be copied to first element
+ *  of output.
+ *
+ *  "integral_0" always creates an output with the first
+ *  element being 0. the oddity here is again that the output
+ *  series is the same length as the input, dropping the effect
+ *  from the last element of input. its utility is primarily in
+ *  operations such as creating absolute offsets from a series of
+ *  lengths.
+ *
+ * EXAMPLES:
+ *  given an input series ( 15, 17, 12, 315 ):
+ *  "deriv" produces ( 15, 2, -5, 303 ) [ NOTICE first element ]
+ *  integrating ( 15, 2, -5, 303 ):
+ *  "integral" produces ( 15, 17, 12, 315 ), while
+ *  "integral_0" produces ( 0, 15, 17, 12 ).
+ *
+ *  generating starting offsets from a series of lengths ( 15, 17, 12, 315 ):
+ *  "integral_0" produces ( 0, 15, 32, 44 ) which can be used
+ *  to accompany the input series for starts and lengths.
+ */
+
+function < type T >
+T deriv #1.0 ( T in )
+    = vdb:deriv;
+function < type T >
+T integral #1.0 ( T in )
+    = vdb:integral;
+function < type T >
+T integral_0 #1.1 ( T in )
+    = vdb:integral_0;
+
+/* delta
+ *  return the 1st derivative of a whole blob
+ * undelta
+ *  return the integral of a whole blob
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be signed integer of any size
+ *
+ *  "in" [ DATA ] - input to be modified
+ *
+ * SYNOPSIS:
+ *  similar to deriv/integral but operates on full blob
+ */
+
+function < type T > T delta #1.0  ( T in ) = vdb:delta;
+function < type T > T undelta #1.0  ( T in ) = vdb:undelta;
+
+
+/* outlier_encode
+ *  removes a given outlier from a data series
+ * outlier_decode
+ *  removes the effect of outlier_encode
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be an integer of any size
+ *
+ *  "in" [ DATA ] - input to be modified
+ *
+ * SYNOPSIS:
+ *  The encode replaces every element that is equal to the
+ *  outlier with (the value of the previous element) * 2 + 1
+ *  and the remaining elements are replaced with their value * 2.
+ */
+
+function < type T > T outlier_encode #1.0 < T outlier > ( T in ) = vdb:outlier_encode;
+function < type T > T outlier_decode #1.0 < T outlier > ( T in ) = vdb:outlier_decode;
+
+/* add_row_id
+ *  return the sum of an input and its row-id
+ * sub_row_id
+ *  return the difference of an input and its row-id
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be member of numeric_set
+ *
+ *  "in" [ DATA ] - input to be modified
+ *
+ * SYNOPSIS:
+ *  adjusts for relationship between input and row-id
+ *  used primarily to reduce serial ids to constants
+ */
+function < type T >
+T add_row_id #1.0 ( T in )
+    = vdb:add_row_id;
+
+function < type T >
+T sub_row_id #1.0 ( T in )
+    = vdb:sub_row_id;
+
+
+/* cut
+ *  extract one or more elements from input vector
+ *  to form an output vector of equal or less dimension
+ *
+ *  "T" [ TYPE ] - base element type to be processed
+ *
+ *  "idx" [ CONST ] - mandatory initial element index
+ *  count of parameters must equal dimension of output type
+ *
+ *  "in" [ DATA ] - source of input vectors where the vector
+ *  element type is known, but any dimension is accepted.
+ *
+ * USAGE:
+ *  extracting a single channel from a 4 channel vector
+ *    F32 [ 4 ] vect ...
+ *    F32 chan = < F32 > cut < 0 > ( vect );
+ *
+ *  extracting multiple channels
+ *    U8 [ 16 ] in ...
+ *    U8 [ 3 ] out = < U8 > cut < 5, 1, 3 > ( in );
+ *
+ *  reversing channels
+ *    I16 [ 2 ] norm ...
+ *    I16 [ 2 ] rev = < I16 > cut < 1, 0 > ( norm );
+ */
+function < type T >
+T [ * ] cut #1.0 < U32 idx, ... > ( T [ * ] in )
+    = vdb:cut;
+
+
+/* paste
+ *  combine all elements of all inputs into a single vector
+ *  output dimension is sum of all input dimensions after type normalization
+ *
+ *  "T" [ TYPE ] - base element type to be processed
+ *
+ *  "in" [ DATA ] - first of an arbitrary number of columns
+ *  the total of input elements produces an output of "T [ total ]"
+ */
+function < type T >
+T [ * ] paste #1.0 ( T [ * ] in, ... )
+    = vdb:paste;
+
+
+/* vec_sum
+ *  compute the sum of all the elements of the row
+ *
+ *  "T" [ TYPE ] - base element type to be processed
+ *
+ *  "in" [ DATA ] - the input
+ */
+function < type T >
+T vec_sum #1.0 ( T [ * ] in )
+    = vdb:vec_sum;
+
+/* vec_sum
+ *  compute the sum of all the elements of the input vector
+ *
+ *  "T" [ TYPE ] - base element type to be processed
+ *
+ *  "in" [ DATA ] - the input
+ */
+function < type T >
+T fixed_vec_sum #1.0 ( T [ * ] in )
+    = vdb:fixed_vec_sum;
+
+
+/* checksum
+ *  compute a checksum ( hash ) of all of the input bytes
+ *  to be used in a trigger production
+ *
+ *  "node" [ CONST ] - path to metadata node where checksum
+ *   will be stored.
+ *
+ *  "algorithm" [ CONST ] - type of checksum to perform:
+ *    'crc-32'  # match against POSIX cksum
+ *    'md5'     #  "   "  md5sum
+ *    'sha-1'   #  "   "  sha1sum
+ *    'sha-256' #  "   "  sha256sum
+ *    'sha-384' #  "   "  sha384sum
+ *    'sha-512' #  "   "  sha512sum
+ *
+ *  "in" [ DATA ] - the octet-stream to be checksummed
+ */
+function
+bool checksum #1.0 < ascii node, ascii algorithm > ( B8 in )
+    = vdb:checksum;
+
+/* md5sum
+ *  compute an md5 checksum of all of the input bytes
+ */
+function
+bool md5sum #1.0 < ascii node > ( B8 in )
+{
+    return checksum < node, 'md5' > ( in );
+}
+
+
+/* pack
+ *  packs words into bit-aligned units
+ *  words are expected in architecture native byte-order
+ *  and returned in "big-bit-endian" order
+ *
+ *  the packed size is determined by the dimension of the
+ *  left-hand assignment value.
+ *
+ *  "in" [ DATA ] - B8, B16, B32 or B64 data
+ */
+function
+B1 [ * ] pack #1.0 ( pack_set in )
+    = vdb:pack;
+
+
+/* unpack
+ *  unpacks bit-aligned units into words
+ *  input is expected in "big-bit-endian" order
+ *  and returned in architecture native byte-order
+ *
+ *  the unpacked type is determined from the left-hand
+ *  assignment value.
+ *
+ *  "in" [ DATA ] - B[1]..B[64]
+ */
+function
+pack_set unpack #1.0 ( B1 [ * ] in )
+    = vdb:unpack;
+
+
+/* izip
+ * iunzip
+ *  integer compression
+ */
+function
+izip_fmt izip #2.1 ( izip_set in )
+    = vdb:izip;
+
+function
+izip_set iunzip #2.1 ( izip_fmt in )
+    = vdb:iunzip;
+
+physical < type T >
+T izip_encoding #1.0
+{
+    decode { return ( T ) iunzip ( @ ); }
+    encode { return izip ( @ ); }
+};
+
+
+/* fzip
+ * funzip
+ *  floating point compression
+ *
+ *  "mantissa" [ CONST ] - the number of mantissa bits
+ *  to preserve
+ */
+function
+fzip_fmt fzip #1.0 < U32 mantissa > ( fzip_set in )
+    = vdb:fzip;
+
+function
+fzip_set funzip #1.0 ( fzip_fmt in )
+    = vdb:funzip;
+
+physical < type T >
+T fzip_encoding #1.0 < U32 mantissa >
+{
+    decode { return funzip ( @ ); }
+    encode { return fzip < mantissa > ( @ ); }
+};
+
+
+/* rlencode
+ * rldecode
+ *  run-length encoding
+ */
+function
+rle_fmt rlencode #1.0 ( any in )
+    = vdb:rlencode;
+
+function
+any rldecode #1.0 ( rle_fmt in )
+    = vdb:rldecode;
+
+
+/* zip
+ * unzip
+ *  run things through zlib
+ *
+ *  "strategy" [ CONST, OPTIONAL ] - set the compression strategy
+ *
+ *  "level" [ CONST, OPTIONAL ] - set the amount of compression
+ *  from 0..9 ( none to best compression ), or use -1 for zlib
+ *  default behavior.
+ */
+
+// zlib strategy
+const I32 Z_FILTERED            =  1;
+const I32 Z_HUFFMAN_ONLY        =  2;
+const I32 Z_RLE                 =  3;
+const I32 Z_DEFAULT_STRATEGY    =  0;
+
+// zlib level
+const I32 Z_NO_COMPRESSION      =  0;
+const I32 Z_BEST_SPEED          =  1;
+const I32 Z_BEST_COMPRESSION    =  9;
+const I32 Z_DEFAULT_COMPRESSION = -1;
+
+function
+zlib_fmt zip #1.0 < * I32 strategy, I32 level > ( any in )
+    = vdb:zip;
+
+function
+any unzip #1.0 ( zlib_fmt in )
+    = vdb:unzip;
+
+physical < type T >
+T zip_encoding #1.0 < * I32 strategy, I32 level >
+{
+    decode { return unzip ( @ ); }
+    encode { return zip < strategy, level > ( @ ); }
+};
+
+physical
+bool bool_encoding #1.0
+{
+    decode
+    {
+        B1 bit = unzip ( @ );
+        return ( bool ) unpack ( bit );
+    }
+
+    encode
+    {
+        U8 lim = < U8 > clip < 0, 1 > ( @ );
+        B1 bit = pack ( lim );
+        return zip < Z_RLE, Z_BEST_SPEED > ( bit );
+    }
+}
+
+physical < type T >
+T delta_izip_encoding #1.0
+{
+    decode
+    {
+        T dlt = iunzip ( @ );
+        return < T > undelta ( dlt );
+    }
+
+    encode
+    {
+        T dlt = <T> delta ( @ );
+        return izip ( dlt );
+    }
+}
+physical < type T >
+T delta_zip_encoding #1.0
+{
+    decode
+    {
+        T dlt = unzip ( @ );
+        return < T > undelta ( dlt );
+    }
+
+    encode
+    {
+        T dlt = <T> delta ( @ );
+        return zip < Z_RLE, Z_BEST_SPEED > ( dlt );
+    }
+}
+physical < type T >
+T delta_average_zip_encoding #1.0
+{
+    decode
+    {
+        delta_averaged_fmt t = unzip ( @ );
+        return undelta_average ( t );
+    }
+
+    encode
+    {
+        delta_averaged_fmt t = delta_average ( @ );
+        return zip < Z_RLE, Z_BEST_SPEED > ( t );
+    }
+}
+
+/* bzip
+ * bunzip
+ *  run things through bzip2
+ *
+ *  "blockSize100k" [ CONST, OPTIONAL ] - set the compression workspace size
+ *  from 1..9 inclusive, produces a workspace of blockSize100K * 100000 bytes
+ *  default is 5
+ *
+ *  "workFactor" [ CONST, OPTIONAL ] - set compression level
+ *  from 0..250 inclusive, where 0 means bzip2 default, currently 30
+ */
+
+function
+bzip2_fmt bzip #1.0 < * U32 blockSize100k, U32 workFactor > ( any in )
+    = vdb:bzip;
+
+function
+any bunzip #1.0 ( bzip2_fmt in )
+    = vdb:bunzip;
+
+physical < type T >
+T bzip_encoding #1.0 < * U32 blockSize100k, U32 workFactor >
+{
+    decode { return bunzip ( @ ); }
+    encode { return bzip < blockSize100k, workFactor > ( @ ); }
+};
+
+
+/* simple_sub_select
+ *  project a column from another table within database
+ *
+ *  "T" [ TYPE ] - data type of column
+ *   must be compatible with source column
+ *
+ *  "tbl" [ CONST ] - name of table within parent
+ *
+ *  "col" [ CONST ] - column spec, i.e. simple name or
+ *   typed name spec
+ *
+ *  "row" [ DATA ] - row to select
+ *
+ *  "idx" [ DATA ] - one-based indexing of what element to pick, defaults to all if not given
+ */
+function < type T >
+T simple_sub_select #1.0 < ascii tbl, ascii col > ( I64 row *  I32 idx )
+    = vdb:simple_sub_select_1;
+
+
+/* extract_token
+ *  extract a textual token from an input string
+ *
+ *  "idx" [ CONST ] - a zero-based index of the token
+ *  if value < row_len ( tok ), then the substring of
+ *  indexed token is returned. otherwise, returns empty.
+ *
+ *  "str" [ DATA ] - input text. type must be compatible with
+ *  output production, meaning types must be same, or ascii input
+ *  with utf8 output.
+ *
+ *  "tok" [ DATA ] - results of tokenizing "str"
+ */
+function
+text_set extract_token #1.0 < U32 idx > ( text_set str, text:token tok )
+    = vdb:extract_token;
+
+
+/* strtonum
+ *  convert string to number
+ *
+ *  "radix" [ CONST, DEFAULT 10 ]
+ *   if not specified, or if given as 0, the default will be 10
+ *   unless the string begins with "0x" or "0X", in which case radix will be 16
+ *   octal is NOT inferred ( i.e. leading "0" does not imply octal )
+ *
+ *  "str" [ DATA ] - text to be converted
+ */
+function
+numeric_set strtonum #1.0 < * U32 radix > ( text_set str )
+    = vdb:strtonum;
+
+
+/* sprintf
+ *  formatted print to a string
+ *
+ *  formatting rules differ somewhat from C sprintf:
+ *
+ *        '%' [ <flags> ] [ <field-width> ] [ '.' <precision> ] [ ':' <index> ] <storage-class>
+ *
+ *  where:
+ *
+ *    flags
+ *        = ' '           : prepend space to a numeral if it does not have a sign
+ *        | '+'           : always produce a sign on numeric conversion
+ *        | '-'           : left-align parameter within field
+ *        | '0'           : left-pad with zeroes rather than spaces
+ *        | '#'           : use "alternate" representation
+ *        | ','           : produce comma-separated triples
+ *        ;
+ *
+ *    field-width
+ *        = DECIMAL       : a base-10 numeral
+ *        | '*'           : take field width from args
+ *        ;
+ *
+ *    precision
+ *        = DECIMAL       : a base-10 numeral
+ *        | '*'           : take precision from args
+ *        |               : an empty precision means 0
+ *        ;
+ *
+ *    index
+ *        = idx           : a single, zero-based vector element
+ *        | idx '-' idx   : a fully-closed, zero-based interval
+ *        | idx '/' len   : a start index plus length
+ *        ;
+ *
+ *    idx
+ *        = DECIMAL       : an unsigned base-10 numeral
+ *        | '*'           : take index from args
+ *        | '$'           : last element in cell
+ *        |               : an empty index means 0 or $
+ *        ;
+ *
+ *    len
+ *        = DECIMAL       : a base-10 numeral
+ *        | '*'           : take length from args
+ *        | '$'           : row-length of ( cell )
+ *        |               : an empty length means $
+ *        ;
+ *
+ *
+ *    storage-class
+ *        = 'd' | 'i'     : general decimal integer
+ *        | 'u'           : decimal unsigned integer
+ *        | 'x'           : lower-case hex
+ *        | 'X'           : upper-case hex
+ *        | 'o'           : octal
+ *        | 'b'           : binary
+ *        | 'f'           : floating point
+ *        | 'e'           : scientific notation
+ *        | 'g'           : general floating point
+ *        | 'c' | 's'     : character
+ *        ;
+ *
+ *
+ *  "fmt" [ CONST ] - constant format string, adhering to
+ *  the description above
+ *
+ *  "p1" [ DATA ] - first param
+ *  this and any subsequent params must correspond to format
+ *  in type/position/number.
+ */
+function
+text_set sprintf #1.0 < ascii fmt > ( any p1, ... )
+    = vdb:sprintf;
diff --git a/interfaces/vdb/xform.h b/interfaces/vdb/xform.h
new file mode 100644
index 0000000..402f351
--- /dev/null
+++ b/interfaces/vdb/xform.h
@@ -0,0 +1,826 @@
+/*=======================================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_xform_
+#define _h_vdb_xform_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_vdb_schema_
+#include <vdb/schema.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDataBuffer;
+struct VCursorParams;
+
+/*--------------------------------------------------------------------------
+ * VFormatdecl
+ */
+typedef struct VFormatdecl VFormatdecl;
+struct VFormatdecl
+{
+    VTypedecl td;
+    uint32_t fmt;
+};
+
+
+/* Resolve
+ *  converts a fmtdecl string to fmt id, type id and vector dimension
+ *
+ *  "resolved" [ OUT ] - resolved fmtdecl
+ *
+ *  "fmtdecl" [ IN ] - type declaration
+ */
+VDB_EXTERN rc_t CC VSchemaResolveFmtdecl ( struct VSchema const *self,
+    VFormatdecl *resolved, const char *fmtdecl, ... );
+VDB_EXTERN rc_t CC VSchemaVResolveFmtdecl ( struct VSchema const *self,
+    VFormatdecl *resolved, const char *fmtdecl, va_list args );
+
+
+/* ToText
+ *  convert a VFormatdecl into canonical text
+ *
+ *  "schema" [ IN ] - schema object that would know about this type
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated type declaration string
+ */
+VDB_EXTERN rc_t CC VFormatdeclToText ( const VFormatdecl *self,
+    struct VSchema const *schema, char *buffer, size_t bsize );
+
+
+/* ToFormatdecl
+ *  attempt to cast a fmtdecl to a size-equivalent ancestor decl
+ *
+ *  "schema" [ IN ] - schema object that would know about this type
+ *
+ *  "ancestor" [ IN ] - target fmtdecl or typespec for cast
+ *
+ *  "cast" [ OUT, NULL OKAY ] - return parameter for ancestor decl
+ *  valid only if function returns true. if "ancestor" contained a typeset,
+ *  the value of "cast" will be the closest matching ancestral type.
+ *
+ *  "distances" [ OUT, NULL OKAY ] - optional linear measure of independent
+ *  casting generations for format ( 0 ) and type ( 1 ). valid only if function
+ *  returns true. a value of 0 means that "self" is a direct match with "ancestor",
+ *  a value of 1 means that "self" is an immediate subtype of "ancestor", etc.
+ *
+ *  returns true if cast succeeded
+ */
+VDB_EXTERN bool CC VFormatdeclToFormatdecl ( const VFormatdecl *self,
+    const VSchema *schema, const VFormatdecl *ancestor,
+    VFormatdecl *cast, uint32_t distances [ 2 ] );
+
+
+/*--------------------------------------------------------------------------
+ * VBlobHeader
+ *  opaque blob header
+ *  used by external functions to read and populate blob headers
+ */
+typedef struct VBlobHeader VBlobHeader;
+
+
+/* Release
+ *  used to release forked headers
+ */
+VDB_EXTERN rc_t CC VBlobHeaderRelease ( const VBlobHeader *self );
+
+
+/* Version
+ *  returns previously written blob format version
+ */
+VDB_EXTERN uint8_t CC VBlobHeaderVersion ( const VBlobHeader *self );
+VDB_EXTERN void CC VBlobHeaderSetVersion ( VBlobHeader *self, uint8_t version );
+
+
+/* OpPushTail
+ * OpPopHead
+ * OpPopTail
+ *  op-code stack interface
+ *
+ *  functions that apply encoding to a blob may use this stack to
+ *  record one or more "op-codes" that may be useful to decoders
+ *  when used in combination with the argument (operand) stack.
+ *
+ *  the op-code values and significance is entirely defined by the
+ *  external functions, and their use is optional (a trivial example
+ *  is described below in the argument stack comment).
+ *
+ *  during update operations, the stack may be pushed as well as popped.
+ *  during read-only operations, only pop is permitted.
+ */
+VDB_EXTERN rc_t CC VBlobHeaderOpPushTail ( VBlobHeader *self, uint8_t op );
+VDB_EXTERN rc_t CC VBlobHeaderOpPopHead ( const VBlobHeader *self, uint8_t *op );
+VDB_EXTERN rc_t CC VBlobHeaderOpPopTail ( const VBlobHeader *self, uint8_t *op );
+
+
+/* ArgPushTail
+ * ArgPopHead
+ * ArgPopTail
+ *  argument (operand) stack interface
+ *
+ *  provides arguments to accompany encoding and decoding operations,
+ *  where the operation may be implicit or indicated via a related
+ *  op-code.
+ *
+ *  here is a trivial example for a hypothetical function that performs
+ *  bit-packing on a series of signed integers. it has two possible
+ *  operations: translation and pack. it translates the values by subtracting
+ *  the MIN(x) value, converting the sequence into unsigned values starting
+ *  at 0. pack will left-truncate bits if the translated MAX(x) can be represented
+ *  with fewer bits than in use:
+ *
+ *    1. calculate min/max
+ *    2. if MIN(x) != 0
+ *       2a. ArgPushTail ( MIN ( x ) )
+ *       2b. OpPushTail ( TRANSLATE-OPCODE ) # e.g. 1
+ *       2c. translate sequence by - min
+ *       2d. translate MAX ( x )
+ *    3. calculate bits required for MAX(x)
+ *    4. if bits-required < bits-used
+ *       4a. ArgPushTail ( bits-required )
+ *       4b. OpPushTail ( PACK-OPCODE )      # e.g. 2
+ *       4c. pack sequence
+ *
+ *  on decode, the process would be reversed:
+ *
+ *    1. OpPopTail ( & op-code )
+ *    2. if op-code == PACK-OPCODE
+ *       2a. ArgPopTail ( & packed-bits )
+ *       2b. unpack sequence from packed-bits to current size
+ *       2c. OpPopTail ( & op-code )
+ *    3. if op-code == TRANSLATE-OPCODE
+ *       3a. ArgPopTail ( & offset )
+ *       3b. translate sequence by + offset
+ *
+ *  during update operations, the stack may be pushed as well as popped.
+ *  during read-only operations, only pop is permitted.
+ */
+VDB_EXTERN rc_t CC VBlobHeaderArgPushTail ( VBlobHeader *self, int64_t arg );
+VDB_EXTERN rc_t CC VBlobHeaderArgPopHead ( const VBlobHeader *self, int64_t *arg );
+VDB_EXTERN rc_t CC VBlobHeaderArgPopTail ( const VBlobHeader *self, int64_t *arg );
+
+
+/* CreateFork
+ *  create a parallel, writable blob header
+ *
+ *  blob headers are designed to record operations and arguments
+ *  that are serially applied to data. some functions may need to
+ *  run operations in parallel ( e.g. compresion ) where each fork
+ *  is allowed to compete for best performance.
+ *
+ *  this function creates an alternate, parallel header object that
+ *  may be used to replace the actual headers associated with the blob.
+ *
+ * NB - returned object must ALWAYS be released before exiting function
+ */
+VDB_EXTERN rc_t CC VBlobHeaderCreateFork ( const VBlobHeader *self, VBlobHeader **rslt );
+
+
+/*==========================================================================
+ * transformation functions
+ *
+ *  transformation functions are declared in schema and provided in
+ *  dynamically loadable shared libraries. the types described in the
+ *  following section will be used during data processing.
+ */
+
+
+/* VFormatdesc
+ *  combines VFormatdecl and VTypedesc
+ */
+typedef struct VFormatdesc VFormatdesc;
+struct VFormatdesc
+{
+    VFormatdecl fd;
+    VTypedesc desc;
+};
+
+
+/* XformInfo
+ *  constant input parameter block
+ *
+ *  "mgr" [ IN ] - db mgr object
+ *
+ *  "schema" [ IN ] - cursor schema
+ *
+ *  "tbl" [ IN ] - owning table. can be used
+ *   to access enclosing database
+ */
+#define VTABLE_PASSED_TO_XFORM 1
+#define VPRODUCTION_PASSED_TO_XFORM 1
+
+struct VProduction;
+typedef struct VXformInfo VXformInfo;
+struct VXformInfo
+{
+#if VMGR_PASSED_TO_XFORM
+    struct VDBManager const *mgr;
+#endif
+#if VSCHEMA_PASSED_TO_XFORM
+    struct VSchema const *schema;
+#endif
+#if VTABLE_PASSED_TO_XFORM
+    struct VTable const *tbl;
+#endif
+#if VPRODUCTION_PASSED_TO_XFORM
+    struct VProduction const *prod;
+#endif
+    VFormatdesc fdesc;
+};
+
+
+/* VRowData
+ *  row function input block
+ *
+ *  "base" [ IN ] and "first_elem" [ IN ] - first element in row
+ *  i.e. for any row of type "T", "( ( const T* ) base ) [ first_elem ]"
+ *  is the first element.
+ *
+ *  "elem_count" [ IN ] - the number of elements in this row
+ *
+ *  "element_bits" [ IN ] - the number of bits in each element
+ *
+ *  "variant" [ IN ] - describes variant of union "u"
+ */
+typedef uint8_t VRowDataVariant;
+enum { vrdData, vrdControl };
+
+typedef struct VRowData VRowData;
+struct VRowData
+{
+    union
+    {
+        struct
+        {
+            /* the number of elements in this row */
+            uint64_t elem_count;
+
+            /* element size in bits */
+            uint64_t elem_bits;
+
+            /* page data base address plus
+               offset to first element of row */
+            uint64_t first_elem;
+            const void *base;
+			uint64_t base_elem_count; /*** the number of elements memory is valid from base; needed for prefetch***/
+        } data;
+
+    } u;
+    int64_t blob_stop_id;
+
+    /* describes variant of "u" */
+    VRowDataVariant variant;
+};
+
+
+/* VRowResult
+ *  row function output block
+ *
+ *  for functions that operate on a single row of input
+ *  but generate an output of independent length.
+ *
+ *  "data" [ IN/OUT ] - externally allocated data buffer
+ *  may be resized or replaced, and must be checked for
+ *  adequate capacity before writing.
+ *
+ *  "elem_count" [ OUT, DEFAULT ZERO ] - return parameter for
+ *  the number of elements in result
+ *
+ *  "elem_bits" [ IN ] - element size in bits
+ *
+ *  "no_cache" [ OUT, DEFAULT ZERO ] - to indicate whether this result is
+ *  cache-able
+ */
+typedef struct VRowResult VRowResult;
+struct VRowResult
+{
+    /* return slot for number of elements written */
+    uint64_t elem_count;
+
+    /* size of elements in bits */
+    uint64_t elem_bits;
+
+    /* externally allocated data buffer
+       NB - must be checked for storage capacity before writing */
+    struct KDataBuffer *data;
+    
+    uint8_t no_cache;
+};
+
+
+/* VFixedRowResult
+ *  fixed row function output block
+ *
+ *  for functions that operate on a single row of input
+ *  and generate an output row of the same length.
+ *
+ *  NB. These functions are considered to be deterministic.
+ *
+ *  "base" [ IN ] and "first_element" [ IN ] - first element in row
+ *  i.e. for any row of type "T", "( ( const T* ) base ) [ row_start ]"
+ *  is the first element.
+ *
+ *  "elem_count" [ IN ] - fixed length of output row
+ *
+ *  "elem_bits" [ IN ] - element size in bits
+ */
+typedef struct VFixedRowResult VFixedRowResult;
+struct VFixedRowResult
+{
+    /* fixed row length */
+    uint64_t elem_count;
+
+    /* size of elements in bits */
+    uint64_t elem_bits;
+
+    /* externally allocated buffer of fixed length */
+    uint64_t first_elem;
+    void *base;
+};
+
+
+/* VByteOrder
+ *  single byte indicator of byte order
+ *
+ *  "vboNone" - data are byte order independent
+ *
+ *  "vboNative" - data are in native byte order
+ *
+ *  "vboLittleEndian" - specific byte orders
+ *  "vboBigEndian"
+ */
+typedef uint8_t VByteOrder;
+enum
+{
+    vboNone,
+    vboNative,
+    vboLittleEndian,
+    vboBigEndian
+};
+
+
+/* VBlobData
+ *  blob function input block
+ *
+ *  describes entire blob of input without row boundaries
+ *  the size of the blob in bits will be "elem_count" * "elem_bits"
+ *
+ *  "data" [ IN ] - pointer to first byte in blob
+ *
+ *  "elem_count" [ IN ] - the number of elements in blob
+ *
+ *  "elem_bits" [ IN ] - element size in bits
+ *
+ *  "byte_order" [ IN ] - byte order of input data
+ */
+typedef struct VBlobData VBlobData;
+struct VBlobData
+{
+    /* element size in bits */
+    uint64_t elem_bits;
+
+    /* blob data buffer */
+    uint64_t elem_count;
+    const void *data;
+
+    /* byte order of data */
+    VByteOrder byte_order;
+};
+
+
+/* VBlobResult
+ *  blob function output block
+ *
+ *  describes entire blob of output without row boundaries
+ *
+ *  "header" [ OUT, NULL OKAY ] - optional return parameter
+ *  for substituted header when encoding
+ *
+ *  "data" [ IN ] - pointer to output buffer
+ *
+ *  "elem_count" [ IN/OUT ] - the maximum number
+ *  of elements in blob ( at the current elem_bits )
+ *
+ *  "elem_bits" [ IN/OUT ] - element size in bits
+ *
+ *  "byte_order" [ IN/OUT ] - byte order of input data
+ */
+typedef struct VBlobResult VBlobResult;
+struct VBlobResult
+{
+    /* element size in bits */
+    uint64_t elem_bits;
+
+    /* blob data buffer */
+    uint64_t elem_count;
+    void *data;
+
+    /* optional replacement header */
+    VBlobHeader *header;
+
+    /* byte order of data */
+    VByteOrder byte_order;
+};
+
+
+/* VBlobFunc
+ *  functions that create blobs from a single input
+ *
+ *  "info" [ IN ] - runtime objects and information
+ *
+ *  "dst" [ IN ] - return parameter block
+ *
+ *  "src" [ IN ] - single input parameter
+ *
+ *  "hdr" [ IN ] - blob header belonging to either the "src"
+ *  or "dst" blob depending upon activity. when encoding, "hdr"
+ *  pertains to the "dst" blob, and should be populated with
+ *  information needed when decoding, when "hdr" will pertain
+ *  to "src".
+ *
+ *  return values:
+ *    0 for no error
+ *    RC ( *, rcFunction, rcExecuting, rcBuffer, rcInsufficient )
+ *      when output buffer is insufficient. this condition is an
+ *      error on decompression, but not on compress. on compress,
+ *      the size of input buffer == size of output buffer. if no
+ *      compression is possible, the library will store data as is.
+ *    RC ( *, rcFunction, rcExecuting, *, * )
+ *      general errors have this RC format, where your module
+ *      and proper object and state defines are substituted.
+ */
+typedef rc_t ( CC * VBlobFunc ) ( void *self, const VXformInfo *info,
+    VBlobResult *dst, const VBlobData *src, VBlobHeader *hdr );
+
+
+/* VArrayFunc
+ *  functions that perform element-wise transforms
+ *
+ *  "info" [ IN ] - runtime objects and information
+ *
+ *  "dst" [ IN ] - return buffer
+ *
+ *  "src" [ IN ] - input buffer
+ *
+ *  "elem_count" [ IN ] - the number of elements
+ *  in both input and output
+ */
+typedef rc_t ( CC * VArrayFunc ) ( void *self, const VXformInfo *info,
+    void *dst, const void *src, uint64_t elem_count );
+
+
+/* VNonDetRowFunc
+ *  functions that operate on a single row of input data
+ *  and produce a single row of output data, where the
+ *  number of elements in the output row is unrelated to
+ *  the number of elements of input.
+ *  NB. these functions are considered non-deterministic.
+ *
+ *  "info" [ IN ] - runtime objects and information
+ *
+ *  "row_id" [ IN ] - specific row id being processed
+ *
+ *  "rslt" [ IN ] - return parameter block
+ *
+ *  "argc" [ IN ] and "argv" [ IN ] - zero or more input
+ *  parameter blocks
+ */
+typedef rc_t ( CC * VNonDetRowFunc ) ( void *self,
+    const VXformInfo *info, int64_t row_id, VRowResult *rslt,
+    uint32_t argc, const VRowData argv [] );
+
+
+/* VRowFunc
+ *  functions that operate on a single row of input data
+ *  and produce a single row of output data, where the
+ *  number of elements in the output row is unrelated to
+ *  the number of elements of input.  The results are
+ *  cached.
+ *
+ *  "info" [ IN ] - runtime objects and information
+ *
+ *  "row_id" [ IN ] - specific starting row id being processed
+ *
+ *  "rslt" [ IN ] - return parameter block
+ *
+ *  "argc" [ IN ] and "argv" [ IN ] - zero or more input
+ *  parameter blocks
+ */
+typedef rc_t ( CC * VRowFunc ) ( void *self,
+     const VXformInfo *info, int64_t row_id, VRowResult *rslt,
+     uint32_t argc, const VRowData argv [] );
+
+    
+/* VFixedRowFunc
+ *  functions that operate on a single row of input data
+ *  and produce a single row of output data, where the
+ *  number of elements in the output row is known to be
+ *  equal to the number of elements of input.
+ *
+ *  "info" [ IN ] - runtime objects and information
+ *
+ *  "row_id" [ IN ] - specific row id being processed
+ *
+ *  "rslt" [ IN ] - return parameter block
+ *
+ *  "argc" [ IN ] and "argv" [ IN ] - zero or more input
+ *  parameter blocks
+ */
+typedef rc_t ( CC * VFixedRowFunc ) ( void *self,
+    const VXformInfo *info, int64_t row_id, const VFixedRowResult *rslt,
+    uint32_t argc, const VRowData argv [] );
+
+
+
+/*==========================================================================
+ * factory functions
+ *
+ *  factory functions are declared in schema - normally implicitly but
+ *  sometimes explicitly - and provided in dynamically loadable shared
+ *  libraries. the types described in the following section will be used
+ *  during cursor open to generate optimized code for data processing.
+ */
+
+
+/* XfactInfo
+ *  constant input parameter block
+ *  holds references to managers and container hierarchy
+ *  as well as transform return type information
+ *
+ *  "mgr" [ IN ] - db mgr object
+ *
+ *  "dt" [ IN ] - type system mgr
+ *
+ *  "tbl" [ IN ] - owning table. can be used
+ *   to access enclosing database
+ *
+ *  "desc" [ IN ] - description of return data type
+ */
+typedef struct VXfactInfo VXfactInfo;
+struct VXfactInfo
+{
+    struct VDBManager const *mgr;
+    struct VSchema const *schema;
+    struct VTable const *tbl;
+    struct VCursorParams const *parms;
+    VFormatdesc fdesc;
+};
+
+
+/* VFactoryParams
+ *  block of parameters to be evaluated by factory
+ *  used to "templatize" runtime function
+ *
+ *  "argc" [ IN ] and "argv" [ IN, DYNAMIC ] - variable
+ *  length array of input parameter description blocks:
+ *
+ *    "desc" [ IN ] - type descriptor tells data domain
+ *    and size information for a single element of input
+ *
+ *    "count" [ IN ] - gives the dimensionality of
+ *    data vector.
+ *
+ *    "data" [ IN, UNION ] - array of input elements
+ *    selected by "desc.domain" and "desc.intrinsic_bits"
+ */
+typedef struct VFactoryParams VFactoryParams;
+struct VFactoryParams
+{
+    uint32_t argc;
+    uint32_t align;
+
+    struct
+    {
+        /* describes constant element,
+           i.e. sizeof ( arg typedecl ) */
+        VTypedesc desc;
+
+        /* describes length of param vector:
+           bool, numeric: count of [ elem, elem, ... ]
+           utf8: number of bytes
+           other text: number of characters */
+        uint32_t count;
+
+        union
+        {
+            /* boolean */
+            const bool *b;
+
+            /* integer */
+            const int8_t *i8;
+            const int16_t *i16;
+            const int32_t *i32;
+            const int64_t *i64;
+
+            /* unsigned integer */
+            const uint8_t *u8;
+            const uint16_t *u16;
+            const uint32_t *u32;
+            const uint64_t *u64;
+
+            /* floating point */
+            const float *f32;
+            const double *f64;
+
+            /* ascii */
+            const char *ascii;
+
+            /* unicode */
+            const char *utf8;
+            const uint16_t *utf16;
+            const uint32_t *utf32;
+
+            /* missing function pointer */
+
+        } data;
+
+    } argv [ 16 ];
+};
+
+
+/* FunctionParams
+ *  block of parameter typedecls to be evaluated by factory
+ *  used to "templatize" runtime function
+ *
+ *  "argc" [ IN ] and "argv" [ IN, DYNAMIC ] - description
+ *  of runtime parameters. actual dimension is given by "argc"
+ */
+typedef struct VFunctionParams VFunctionParams;
+struct VFunctionParams
+{
+    uint32_t argc;
+    uint32_t align;
+    VFormatdesc argv [ 16 ];
+};
+
+
+/* FuncDesc
+ *  parameter block for describing runtime function
+ *  guaranteed to be zeroed on input
+ *
+ *  "self"  [ OUT, OPAQUE ] - optional object or
+ *  data pointer for function.
+ *
+ *  "whack" [ OUT, NULL OKAY ] - optional destructor
+ *  called with "self" when function is released
+ *
+ *  "u" [ OUT ] - several variants of function
+ *
+ *  "variant" [ OUT ] - selects variant of "u"
+ */
+typedef uint32_t VFuncType;
+enum
+{
+    vftInvalid,
+    vftReserved,
+    vftRow,
+	vftRowFast,  /*** function is fast, so window can be stretched to the max **/
+    vftIdDepRow, /*** function dependent on row_id ***/
+    vftFixedRow,
+    vftNonDetRow,
+    vftArray,
+    vftBlob
+};
+
+typedef struct VFuncDesc VFuncDesc;
+struct VFuncDesc
+{
+    /* object and optional destructor */
+    void *self;
+    void ( CC * whack ) ( void *self );
+    
+    /* runtime function */
+    union
+    {
+        VRowFunc rf;
+        VNonDetRowFunc ndf;
+        VFixedRowFunc pf;
+        VArrayFunc af;
+        VBlobFunc bf;
+    } u;
+    
+    VFuncType variant;
+};
+
+
+/* TransformFactory
+ *  unified typedef for row, page and blob transformation function factories
+ *
+ *  "self" [ IN, OPAQUE ] - NULL or const object pointer
+ *  value registered with the manager
+ *
+ *  "info" [ IN ] - managers and table for the column,
+ *  plus column type information
+ *
+ *  "rslt" [ IN ] - return value parameter block for resolved function
+ *
+ *  "cp" [ IN ] - constant template parameters
+ *
+ *  "dp" [ IN ] - type information for runtime parameters
+ */
+typedef
+rc_t ( CC * VTransformFactory ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp );
+
+
+/* VTransDesc
+ *  describes a transform factory
+ */
+typedef struct VTransDesc VTransDesc;
+struct VTransDesc
+{
+    /* opaque factory data object */
+    void *fself;
+    void ( CC * whack ) ( void *fself );
+
+    /* factory entrypoint */
+    VTransformFactory factory;
+
+    /* interface version */
+    uint32_t itf_version;
+};
+
+#define VTRANSVERS( maj, min, rel ) \
+    ( ( ( maj ) << 24 ) | ( ( min ) << 16 ) | ( rel ) )
+
+/* actual factory function implementation name */
+#define VTRANSFACT_NAME( fact ) \
+    fact ## _fact
+
+/* exported factory name */
+#define VTRANSFACT_DECL( fact ) \
+    rc_t CC fact ( VTransDesc *desc )
+
+/* factory declaration with no self parameter */
+#define VTRANSFACT_IMPL( fact, maj, min, rel ) \
+    VTRANSFACT_IMPL_SELF( fact, maj, min, rel, NULL )
+
+/* factory declaration with static or constant self parameter */
+#define VTRANSFACT_IMPL_SELF( fact, maj, min, rel, self ) \
+    static rc_t CC VTRANSFACT_NAME ( fact ) ( const void*, \
+        const VXfactInfo*, VFuncDesc*, const VFactoryParams*, const VFunctionParams* ); \
+    rc_t CC fact ( VTransDesc *desc ) \
+    { \
+        desc -> fself = ( self ); \
+        desc -> whack = NULL; \
+        desc -> factory = VTRANSFACT_NAME ( fact ); \
+        desc -> itf_version = VTRANSVERS ( maj, min, rel ); \
+        return 0; \
+    } \
+    static rc_t CC VTRANSFACT_NAME ( fact )
+
+/* factory declaration with dynamically allocated self parameter */
+#define VTRANSFACT_IMPL_CONSTRUCT( fact, maj, min, rel, construct, destroy ) \
+    static rc_t CC VTRANSFACT_NAME ( fact ) ( const void*, \
+        const VXfactInfo*, VFuncDesc*, const VFactoryParams*, const VFunctionParams* ); \
+    rc_t CC fact ( VTransDesc *desc ) \
+    { \
+        desc -> whack = ( destroy ); \
+        desc -> factory = VTRANSFACT_NAME ( fact ); \
+        desc -> itf_version = VTRANSVERS ( maj, min, rel ); \
+        return construct ( & desc -> fself ); \
+    } \
+    static rc_t CC VTRANSFACT_NAME ( fact )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vdb_xform_ */
diff --git a/interfaces/vfs/extern.h b/interfaces/vfs/extern.h
new file mode 100644
index 0000000..fd1731a
--- /dev/null
+++ b/interfaces/vfs/extern.h
@@ -0,0 +1,47 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vfs_extern_
+#define _h_vfs_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define VFS_EXTERN LIB_EXPORT
+#define VFS_EXTERN_DATA extern LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define VFS_EXTERN LIB_IMPORT
+#ifdef __cplusplus
+#define VFS_EXTERN_DATA extern /* LIB_IMPORT_DATA */
+#else
+#define VFS_EXTERN_DATA LIB_IMPORT_DATA
+#endif
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_vfs_extern_ */
diff --git a/interfaces/vfs/keyring-priv.h b/interfaces/vfs/keyring-priv.h
new file mode 100644
index 0000000..b88c722
--- /dev/null
+++ b/interfaces/vfs/keyring-priv.h
@@ -0,0 +1,52 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_keyring_priv_
+#define _h_keyring_priv_
+
+#ifndef _h_vfs_extern_
+#include <vfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define KEYRING_IPC_NAME "vdb-keyring"
+
+VFS_EXTERN_DATA const char* KeyRingDefaultDataDir;
+
+VFS_EXTERN rc_t StartKeyRing(const char* dataDir);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_keyring_priv_ */
diff --git a/interfaces/vfs/manager-priv.h b/interfaces/vfs/manager-priv.h
new file mode 100644
index 0000000..f76003f
--- /dev/null
+++ b/interfaces/vfs/manager-priv.h
@@ -0,0 +1,161 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_vfs_manager_priv_
+#define _h_vfs_manager_priv_
+
+#ifndef _h_vfs_extern_
+#include <vfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+
+#ifndef _h_kfs_defs_
+#include <kfs/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct VFSManager;
+struct KDirectory;
+struct KFile;
+struct VPath;
+struct VResolver;
+struct SRAPath;
+struct KConfig;
+
+/* this resembles the interface functions in manager.h
+ * but allows the use of a KDirectory for the base instead of a VPath
+ * of a directory
+ *
+ * this is expected to be more temporary if this code base continues.
+ * much longer
+ */
+VFS_EXTERN rc_t CC VFSManagerResolvePathRelativeDir (const struct VFSManager * self,
+                                                     uint32_t flags,
+                                                     const struct  KDirectory * base_dir,
+                                                     const struct  VPath * in_path,
+                                                     struct VPath ** out_path);
+
+
+
+/* bad interface.  Bad! Bad!
+ * but needed to hack VFS into KDB
+ * MORE THAN BAD. REFLECTS A TOTAL MISUNDERSTANDING OF FS.
+ */
+VFS_EXTERN rc_t CC VFSManagerOpenFileReadDirectoryRelative (const struct VFSManager *self, 
+    const struct KDirectory * dir, struct KFile const **f, const struct VPath * path);
+
+VFS_EXTERN rc_t CC VFSManagerOpenFileReadDirectoryRelativeDecrypt (const struct VFSManager *self, 
+    const struct KDirectory * dir, struct KFile const **f, const struct VPath * path);
+
+VFS_EXTERN rc_t CC VFSManagerOpenDirectoryReadDirectoryRelative ( const struct VFSManager *self,
+    struct KDirectory const * dir, struct KDirectory const **d, const struct VPath * path );
+
+VFS_EXTERN rc_t CC VFSManagerOpenDirectoryReadDirectoryRelativeDecrypt ( const struct VFSManager *self,
+    struct KDirectory const * dir, struct KDirectory const **d, const struct VPath * path );
+
+VFS_EXTERN rc_t CC VFSManagerOpenDirectoryUpdateDirectoryRelative ( const struct VFSManager *self,
+    struct KDirectory const * dir, struct KDirectory **d, const struct VPath * path );
+
+#define VPathMakeDirectoryRelative LegacyVPathMakeDirectoryRelative
+VFS_EXTERN rc_t CC VPathMakeDirectoryRelative ( struct VPath ** new_path,
+    struct KDirectory const * dir, const char * posix_path);
+
+
+VFS_EXTERN rc_t CC VFSManagerOpenFileReadDecrypt (const struct VFSManager *self,
+                                                  struct KFile const **f,
+                                                  const struct VPath * path);
+
+
+/*
+ * quick hack for vdb-validate for immediate testing release
+ */
+VFS_EXTERN rc_t CC VFSManagerWGAValidateHack (const struct VFSManager * self, 
+                                              const struct KFile * file,
+                                              const char * path); /* we'll move this to a vpath */
+
+/*
+ * Access to VFSManager's instance of configuration object, for testing purposes
+ */
+VFS_EXTERN const struct KConfig* CC VFSManagerGetConfig(const struct VFSManager * self);
+
+/* Make using a custom KConfig
+ */
+VFS_EXTERN rc_t CC VFSManagerMakeFromKfg ( struct VFSManager ** pmanager,
+    struct KConfig * cfg );
+
+/*
+ * Set/get pathname of the object_id/object_name bindings file (used for testing; should go away when the functionality
+ *  is rolled into KeyRing server)
+ * Set to NULL to use the default location ("~/.ncbi/objid.mapping")
+ */
+VFS_EXTERN void VFSManagerSetBindingsFile(struct VFSManager * self, const char* path);
+VFS_EXTERN const char* VFSManagerGetBindingsFile(struct VFSManager * self);
+
+
+/** Reset VResolver when we need to change protected repository context */
+VFS_EXTERN rc_t CC VFSManagerSetResolver
+    ( struct VFSManager * self, struct VResolver * resolver );
+
+
+/* GetCacheRoot
+ *  query the cache-root
+ *
+ *  path [ OUT ] - VPath of location of current cache-root
+ */
+VFS_EXTERN rc_t CC VFSManagerGetCacheRoot ( const struct VFSManager * self,
+    struct VPath const ** path );
+
+
+/* SetCacheRoot
+ *  set a new cache-root
+ *
+ *  path [ IN ] - VPath of new location of cache-root
+ */
+
+VFS_EXTERN rc_t CC VFSManagerSetCacheRoot ( const struct VFSManager * self,
+    struct VPath const * path );
+    
+/* DeleteCacheOlderThan
+ *  delete old cached files
+ *
+ *  days [ IN ] - files older than this will be deleted
+ *  
+ */
+VFS_EXTERN rc_t CC VFSManagerDeleteCacheOlderThan ( const struct VFSManager * self,
+    uint32_t days );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vfs_manager_priv_ */
diff --git a/interfaces/vfs/manager.h b/interfaces/vfs/manager.h
new file mode 100644
index 0000000..9779ef3
--- /dev/null
+++ b/interfaces/vfs/manager.h
@@ -0,0 +1,322 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_vfs_manager_
+#define _h_vfs_manager_
+
+#ifndef _h_vfs_extern_
+#include <vfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+
+#ifndef _h_kfs_defs_
+#include <kfs/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct VPath;
+struct VResolver;
+struct KDirectory;
+struct KNSManager;
+struct VPath;
+
+/* temporary */
+
+
+/*--------------------------------------------------------------------------
+ * VFSManager
+ */
+typedef struct VFSManager VFSManager;
+
+#define VFS_KRYPTO_PASSWORD_MAX_SIZE 4096
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+VFS_EXTERN rc_t CC VFSManagerAddRef ( const VFSManager *self );
+VFS_EXTERN rc_t CC VFSManagerRelease ( const VFSManager *self );
+
+/* OpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] VPath representing the path, URL or URN of the desired file
+ */
+VFS_EXTERN rc_t CC VFSManagerOpenFileRead (const VFSManager *self, 
+                                           struct KFile const **f,
+                                           const struct VPath * path);
+
+VFS_EXTERN rc_t CC VFSManagerOpenDirectoryRead ( const VFSManager *self,
+    struct KDirectory const **d, const struct VPath * path );
+
+/* it forces decryption to be used for kdb */
+VFS_EXTERN rc_t CC VFSManagerOpenDirectoryReadDecrypt ( const VFSManager *self,
+    struct KDirectory const **d, const struct VPath * path );
+
+/* VPath has already been resolved to a URL and an optional cache file */
+VFS_EXTERN rc_t CC VFSManagerOpenDirectoryReadDecryptRemote (const struct VFSManager *self,
+    struct KDirectory const **d, const struct VPath * path, const struct VPath * cache);
+
+VFS_EXTERN rc_t CC VFSManagerOpenDirectoryUpdate ( const VFSManager *self,
+    struct KDirectory **d, const struct VPath * path );
+
+/* OpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "path" [ IN ] VPath representing the path, URL or URN of the desired file
+ */
+VFS_EXTERN rc_t CC VFSManagerOpenFileWrite (const VFSManager *self,
+                                            struct KFile **f,
+                                            bool update,
+                                            const struct VPath * path);
+
+/* CreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] VPath representing the path, URL or URN of the desired file
+ */
+VFS_EXTERN rc_t CC VFSManagerCreateFile (const VFSManager *self, 
+                                         struct KFile **f,
+                                         bool update, uint32_t access,
+                                         KCreateMode mode,
+                                         const struct VPath * path );
+
+
+/* Remove
+ *  remove an accessible object from its directory
+ *
+ *  "force" [ IN ] - if true and target is a directory,
+ *  remove recursively
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+VFS_EXTERN rc_t CC VFSManagerRemove (const VFSManager *self, bool force,
+                                     const struct VPath * path );
+
+
+/* Make
+ */
+VFS_EXTERN rc_t CC VFSManagerMake ( VFSManager ** pmanager );
+
+/* GetCWD
+ */
+VFS_EXTERN rc_t CC VFSManagerGetCWD (const VFSManager * self, struct KDirectory ** cwd);
+
+VFS_EXTERN rc_t CC VFSManagerGetResolver ( const VFSManager * self, struct VResolver ** resolver );
+
+VFS_EXTERN rc_t CC VFSManagerGetKNSMgr ( const VFSManager * self, struct KNSManager ** kns );
+
+
+VFS_EXTERN rc_t CC VFSManagerGetKryptoPassword (const VFSManager * self, char * new_password, size_t max_size, size_t * size);
+
+/*
+  NULL value for self
+  RC (rcVFS, rcEncryptionKey, rcUpdating, rcSelf, rcNull);
+
+  NULL value for password or 0 value for size
+  RC (rcVFS, rcEncryptionKey, rcUpdating, rcParam, rcNull);
+
+  size greater than VFS_KRYPTO_PASSWORD_MAX_SIZE
+  RC (rcVFS, rcEncryptionKey, rcUpdating, rcSize, rcExcessive);
+
+  illegal CR or LF (NL) in the password
+  RC (rcVFS, rcEncryptionKey, rcUpdating, rcEncryptionKey, rcInvalid);
+
+  path/file name for password too long for function as written
+  RC (rcVFS, rcEncryptionKey, rcUpdating, rcPath, rcExcessive);
+
+  existing password path/file name is not a file
+  RC (rcVFS, rcEncryptionKey, rcUpdating, rcPath, rcIncorrect);
+
+  unknown file type for configured path/file name
+  RC (rcVFS, rcEncryptionKey, rcUpdating, rcPath, rcCorrupt);
+
+  incomplete writes to temporary password file
+  RC (rcVFS, rcEncryptionKey, rcWriting, rcFile, rcInsufficient);
+
+  other errors from KFS and KLIB
+*/
+
+/* pwd_dir[pwd_dir_size] -
+    Output parameters for path to directory containing the password file.
+    pwd_dir is not updated if pwd_dir == NULL or pwd_dir_size == 0
+                  or pwd_dir_size is insufficient to copy the path
+ */
+VFS_EXTERN rc_t CC VFSManagerUpdateKryptoPassword (const VFSManager * self, 
+                                                   const char * password,
+                                                   size_t size,
+                                                   char * pwd_dir,
+                                                   size_t pwd_dir_size);
+
+
+VFS_EXTERN rc_t CC VFSManagerResolveSpec ( const VFSManager * self,
+                                           const char * spec,
+                                           struct VPath ** path_to_build,
+                                           const struct KFile ** remote_file,
+                                           const struct VPath ** local_cache,
+                                           bool resolve_acc );
+
+struct KDirectory;
+
+VFS_EXTERN rc_t CC VFSManagerResolveSpecIntoDir ( const VFSManager * self,
+                                                  const char * spec,
+                                                  const struct KDirectory ** dir,
+                                                  bool resolve_acc );
+
+/*--------------------------------------------------------------------------
+ * KConfig
+ *  placing some KConfig code that relies upon VFS here
+ */
+struct KConfig;
+struct KConfigNode;
+
+/* ReadVPath
+ *  read a VPath node value
+ *
+ * self [ IN ] - KConfig object
+ * path [ IN ] - path to the node
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+VFS_EXTERN rc_t CC KConfigReadVPath ( struct KConfig const* self, const char* path, struct VPath** result );
+
+/* ReadVPath
+ *  read a VPath node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+VFS_EXTERN rc_t CC KConfigNodeReadVPath ( struct KConfigNode const *self, struct VPath** result );
+
+/* ResolvePath
+ *
+ * take a VPath and resolve to a final form apropriate for KDB
+ *
+ * that is take a relative path and resolve it against the CWD
+ * or take an accession and resolve into the local or remote 
+ * VResolver file based on config. It is just a single resolution percall
+ *
+ * flags
+ *      can disable all Accession resolution
+ *      can let VPath With no scheme be treated as a possible accession
+ *
+ */
+
+/* bit values for flags */
+    /* allow no local accession resolution */
+#define vfsmgr_rflag_no_acc_local (1<<0)
+    /* allow no remote accession resolution */
+#define vfsmgr_rflag_no_acc_remote (1<<1)
+    /* never do VResolver Accession resolution */
+#define vfsmgr_rflag_no_acc  (vfsmgr_rflag_no_acc_local|vfsmgr_rflag_no_acc_remote)
+    /* use VResolver Accession resolution for simple names with no scheme */
+
+#define vfsmgr_rflag_kdb_acc (1<<2)
+    /* over ridden by vfsmgr_rflag_no_acc */
+
+
+VFS_EXTERN rc_t CC VFSManagerResolvePath (const VFSManager * self,
+                                          uint32_t flags,
+                                          const struct  VPath * in_path,
+                                          struct VPath ** out_path);
+
+VFS_EXTERN rc_t CC VFSManagerResolvePathRelative (const VFSManager * self,
+                                                  uint32_t flags,
+                                                  const struct  VPath * base_path,
+                                                  const struct  VPath * in_path,
+                                                  struct VPath ** out_path);
+
+/*
+ * Registering bindings between dbGaP object Ids and object names
+ */                                                  
+
+/* VFSManagerRegisterObject
+ *  registers a binding between an object Id and an object name (object = accession or dbGaP file) 
+ * 
+ * self [ IN ] - VFSManager object
+ * oid [ IN ] - object id
+ * obj [ IN ] - Vpath representing the object's name (scheme is "ncbi-acc" for accessions, "ncbi-file" for dbGaP files; 
+ *              the name itself is the 'path' component
+ */
+VFS_EXTERN rc_t CC VFSManagerRegisterObject(struct VFSManager* self, uint32_t oid, const struct VPath* obj);
+
+/* VFSManagerGetObjectId
+ *  look up an object id by an object name 
+ * 
+ * self [ IN ] - VFSManager object
+ * obj [ IN ] - Vpath representing the object's name (scheme is "ncbi-acc" for accessions, "ncbi-file" for dbGaP files; 
+ *              the name itself is the 'path' component
+ * oid [ OUT ] - object id
+ */
+VFS_EXTERN rc_t CC VFSManagerGetObjectId(const struct VFSManager* self, const struct VPath* obj, uint32_t* oid);
+
+/* VFSManagerGetObject
+ *  look up an object name by an object id
+ * 
+ * self [ IN ] - VFSManager object
+ * oid [ IN ] - object id
+ * obj [ OUT ] - Vpath representing the object's name (scheme is "ncbi-acc" for accessions, "ncbi-file" for dbGaP files; 
+ *              the name itself is the 'path' component
+ */
+VFS_EXTERN rc_t CC VFSManagerGetObject(const struct VFSManager* self, uint32_t oid, struct VPath** obj);
+
+
+                                                  
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_manager_ */
diff --git a/interfaces/vfs/path-priv.h b/interfaces/vfs/path-priv.h
new file mode 100644
index 0000000..66c3fb3
--- /dev/null
+++ b/interfaces/vfs/path-priv.h
@@ -0,0 +1,266 @@
+/*===========================================================================
+*
+*                            Public Domain Notice
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vfs_path_priv_
+#define _h_vfs_path_priv_
+
+#ifndef _h_vfs_extern_
+#include <vfs/extern.h>
+#endif
+
+#ifndef _h_vfs_path_
+#include <vfs/path.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct String;
+
+
+#define NCBI_FILE_SCHEME       "ncbi-file"
+#define NCBI_ACCESSION_SCHEME  "ncbi-acc"
+#define HTTP_SCHEME            "http"
+#define FTP_SCHEME             "ftp"
+#define FASP_SCHEME            "fasp"
+#define NCBI_LEGREFSEQ_SCHEME  "x-ncbi-legrefseq"
+#define NCBI_OBJECT_SCHEME     "ncbi-obj"
+
+/* options for a VPath possibly obtained from a query string on an URI */
+typedef uint32_t VPOption_t;
+enum eVPOption_t
+{
+    vpopt_encrypted,
+    vpopt_pwpath,
+    vpopt_pwfd,
+    vpopt_readgroup,
+#if 0    
+    vpopt_temporary_pw_hack,
+#endif    
+    vpopt_vdb_ctx,
+    vpopt_gap_ticket, 
+    vpopt_count
+};
+
+
+/* =====
+ * Much of what follows is expected to move into the interface vfs/path.h
+ * once it becomes supported.
+ */
+
+/* MakeFmt
+ *  make a path object from a format string plus arguments
+ *
+ *  "new_path" [ OUT ] - a reference to the new object.
+ *
+ *  "fmt" [ IN ] and "args" [ IN ] - arguments to string_printf
+ *  ( see <klib/text.h> ) to build a NUL-terminated string
+ *  that conforms with the rules for "posix_path"
+ *
+ * NB - SECURITY RISK IF USED DIRECTLY FROM EXTERNAL STRINGS.
+ *      ALSO, FMT IS **NOT** PRINTF COMPATIBLE - see string_printf.
+ */
+
+#if 0
+VFS_EXTERN rc_t CC VPathMakeRelative ( VPath ** new_path, const VPath * base_path,
+                                       const char * relative_path );
+VFS_EXTERN rc_t CC VPathMakeRelativeFmt ( VPath ** new_path, const VPath * base_path,
+                                          const char * fmt, ... );
+VFS_EXTERN rc_t CC VPathVMakeRelativeFmt ( VPath ** new_path, const VPath * base_path,
+                                           const char * fmt, va_list args );
+VFS_EXTERN rc_t CC VPathMakeCurrentPath ( VPath ** new_path );
+
+VFS_EXTERN rc_t CC VPathMakeURI ( VPath ** new_path, const char * uri );
+#endif
+
+
+/* Option
+ *  rc == 0 if the option has been specified
+ *  for options with a parameter, the value of the parameter is copied to buffer
+ */
+VFS_EXTERN rc_t CC VPathOption ( const VPath * self, VPOption_t option,
+                                char * buffer, size_t buffer_size,
+                                size_t * num_read);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vfs_path_priv_ */
+
+/*--------------------------------------------------------------------------
+ *
+ * The ABNF form described in RFC5234 will be used to define URLS and paths
+ * with some handwaving instead of complete character definitions for case 
+ * insensitivity.  CORE definitions from RFC5234 will be used again handwaving
+ * case insensitivity.
+ *
+ * --------------------
+ *
+ * URL for a VPath
+ *
+ *  as per RFC 3986, an URI consists of:
+ *
+ *    URI           = scheme ":" heir-part [ "?" query ] [ "#" fragment ]
+ *
+ *  We will support however something intbetween an URI and an IRI in that we'll
+ *  all UTF-8 rather than limit certain characters to ASCII.
+ *
+ *  For the NCBI path  URL:  The hier-part is intended to be compatible with the 
+ *                    "file:" scheme  Authority on any of the Unix-like operating
+ *                    systems must either be empty or "localhost".  For Windows
+ *                    it must  be a host that can be used if the "file" url is
+ *                    translated into a UNC style Windows path.  Also in a
+ *                    Windows vfs: URL a single colon ':' will be allowed only at
+ *                    the end of a single character rive letter for the first
+ *                    sub-part of the path.
+ *
+ *    scheme        = "ncbi-file" ; ( case insensitive )
+ *
+ *    hier-part     = "//" authority path-abempty
+ *                  / path-absolute
+ *                  / path-relative
+ *                  / path-empty
+ *
+ * by RFC 3986 authority is
+ *    authority     = [ userinfo "@" ] host [ ":" port]
+ * but at this point we only recognize
+ *    authority     = host
+ *
+ * by RFC 3986 host is
+ *    host          = IP-literal / IPv4address / reg-name
+ * but at this point we only recognize
+ *    host          = reg-name
+ *
+ *    reg-name      = *( unreserved / pct-encoded / sub-delims )
+ *
+ *    path          = path-abempty
+ *                  / path-absolute
+ *                  / path-noscheme
+ *                  / path-rootless
+ *                  / path-empty
+ *
+ *    path-abempty  = * ( "/" segment )
+ *
+ *    path-absolute = "/" segment-nz *( "/" segment )
+ *
+ *    path-noscheme = segment-nz-nc *( "/" segment )
+ *
+ *    path-rootless = segment-nz *( "/" segment )
+ *
+ *    path-empty    = ""
+ *
+ *    segment       = *pchar       ; can be empty
+ *    segment-nz    = 1*pchar      ; can't be empty
+ *    segment-nz-nc = 1*pchar-nz   ; can't be empty
+ *
+ *    pchar         = ":" / pchar-nc
+ *
+ *    pchar-nc      = unreserved / pct-encoded / sub-delims ? "@"
+ *
+ *    pct-encoded   = "%" HEXDIG HEXDIG ; hex digits are 0-9, a-f or A-F
+ *
+ *    authority   = "localhost" / host-name ; the host name is an O/S specific 
+ *                                          ; name of a remote host 
+ *
+ *    query       = query_entry [ * ( "&" query_entry ) ]
+ *
+ *    query_entry = "encrypt" / "enc" / ( "pwfile=" hier-part ) / ( "pwfd=" fd )
+ *
+ *    fd          = 1* DIGIT
+ *
+ *    unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~" / UTF-8
+ *
+ *    reserved    = gen-delims / subdelims
+ *
+ *    gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
+ *
+ *    sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*"
+ *                / "+" / "," / ";" / "="
+ *
+ * Handwaving on the UTF-8.  We'll accept it rather than requiring percent encoding
+ * in most cases.
+
+ * Examples:
+ *         "ncbi-file://home/my-name/data-files"
+ *         "ncbi-file://win-server/archive/secure/read12345?encrypted"
+ *         "ncbi-file:///c:/scanned-data/0001/file.sra?enc?pwd-file=c:/Users/JamesMcCoy/ncbi.pwd"
+ *
+ *  We allow an implied scheme of "vfs" if none present.
+ *  'host-name' is partially implemented for Windows.  Not currently for any the
+ *  of the supported Unix systems.  We do not support IP addresses instead of 
+ *  host names.
+ *
+ *  'path' can be either absolute or relative and must be posix style as per 
+ *  RFC 3986 and matches the "file" scheme.
+ *
+ *  'fragment' is not yet implemented or defined.
+ *
+ *  'fd' is a system specific file handle.  Not yet supported on Windows.
+ *
+ * --------------------
+ *
+ * VFS posix_path representation:
+ *
+ * The internal representation of a path for VFS resembles very closely the
+ * POSIX pathname crossed with the Windows UNC path.  Only the Unix "/" 
+ * separator is allowed not the "\" for paths.
+ *
+ * posix-path     = full-path / relative-path
+ *
+ * full-path      = ["//" host] "/" [ directory-path "/" ] resource
+ *
+ * relative-path  = [ directory-path "/" ] resource
+ *
+ * directory-path = resource [ "/" directory-path ]
+ *
+ * resource       = string ; (UTF-8 O/S specific name for a directory or a file)
+ *
+ * host           = string ; (UTF-8 O/S specific name for the local or remote host)
+ *
+ * For a host "localhost" is a synonym for the current host.
+ * The "//host" is not guaranteed to work for all systems except "//localhost"
+ *
+ * The resource "." is assumed to mean the local directory and will be stripped
+ * when a path is made canonical.
+ *
+ * The resource ".." is assumed to mean the containing directory and when made 
+ * canonical it will be left in at the begining for relative paths or removed along 
+ * with the preceding resource name.
+ *
+ * For Windows the device is handled in a unique way with some potential for ambiguity.
+ * The UNC approach for a named drive "C:" becomes "/c".  So "C:\" becomes "/c/".
+ *
+ * In the future the complex approach from the "file:" URL should be adopted 
+ * with the ":" allowed only in the first directory name in a path.  RFC 3986 
+ * notes though that this complex approach puts some five variants into the ABNF
+ * to describe the path portion of an URL.
+ */
diff --git a/interfaces/vfs/path.h b/interfaces/vfs/path.h
new file mode 100644
index 0000000..33f9c11
--- /dev/null
+++ b/interfaces/vfs/path.h
@@ -0,0 +1,294 @@
+/*===========================================================================
+*
+*                            Public Domain Notice
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vfs_path_
+#define _h_vfs_path_
+
+#ifndef _h_vfs_extern_
+#include <vfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct String;
+struct VFSManager;
+
+
+/*--------------------------------------------------------------------------
+ * VPath
+ *  represents an unbound object query key
+ *  may be created from a simple file-system path,
+ *  a more formal URN or URL,
+ *  or other modes of creation
+ *
+ *  a path will have these parts:
+ *    scheme       : a scheme for retrieval
+ *    auth         : login name for authentication
+ *    host         : authoritative source
+ *    port         : port for connecting with host
+ *    path         : host-relative path
+ *    query        : parameters for interpretation
+ *    fragment     : internal component of object
+ *    proj         : project id
+ *    name         : alternate or primary name
+ *
+ *  file-system paths with no modifying parameters
+ *  will be given standard "file" scheme. paths having
+ *  parameters will be given the scheme "ncbi-file".
+ *
+ *  standard networking schemes ( "http", "ftp", etc. )
+ *  are supported.
+ *
+ *  NCBI accessions are given the scheme "ncbi-acc".
+ *
+ *  NCBI remote object id paths receive scheme "ncbi-obj".
+ */
+typedef struct VPath VPath;
+
+
+/* MakePath
+ *  make a path object from a string conforming to
+ *  either a standard POSIX path or a URI
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "path_str" [ IN ] - a UTF-8 NUL-terminated string
+ *  representing a POSIX path or URI, or
+ *  a string_printf compatible format string
+ *
+ *  "path_fmt" [ IN ] and "args" [ IN ] - a UTF-8 NUL-terminated fmt string
+ *  compatible with string_vprintf, plus argument list
+ *
+ *  Examples:
+ *      "ncbi-file:/home/my-name/data-files"
+ *      "ncbi-file://win-server/archive/secure/read12345?encrypted"
+ *      "ncbi-file:///c/scanned-data/0001/file.sra?enc&pwfile=/c/Users/JamesMcCoy/ncbi.pwd"
+ */
+VFS_EXTERN rc_t CC VFSManagerMakePath ( struct VFSManager const * self,
+    VPath ** new_path, const char * path_str, ... );
+VFS_EXTERN rc_t CC VFSManagerVMakePath ( struct VFSManager const * self,
+    VPath ** new_path, const char * path_fmt, va_list args );
+
+
+/* MakeSysPath
+ *  make a path object from an OS native filesystem path string
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "sys_path" [ IN ] - a UTF-8 NUL-terminated string
+ *  representing a native filesystem path
+ *
+ *  "wide_sys_path" [ IN ] - a wide NUL-terminated string
+ *  representing a native filesystem path, where
+ *  wchar_t is either USC-2 or UTF-32 depending upon libraries
+ */
+VFS_EXTERN rc_t CC VFSManagerMakeSysPath ( struct VFSManager const * self,
+    VPath ** new_path, const char * sys_path );
+VFS_EXTERN rc_t CC VFSManagerWMakeSysPath ( struct VFSManager const * self,
+    VPath ** new_path, const wchar_t * wide_sys_path );
+
+
+/* MakeAccPath - TEMPORARY
+ *  takes a textual accession representation
+ *  creates a VPath representing an accession
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "acc" [ IN ] - a NUL-terminated ASCII fmt string
+ */
+VFS_EXTERN rc_t CC VFSManagerMakeAccPath ( struct VFSManager const * self,
+    VPath ** new_path, const char * acc, ... );
+VFS_EXTERN rc_t CC VFSManagerVMakeAccPath ( struct VFSManager const * self,
+    VPath ** new_path, const char * fmt, va_list args );
+
+
+/* MakeOidPath - TEMPORARY
+ *  takes an integer oid
+ *  creates a VPath representing an obj-id
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "oid" [ IN ] - a non-zero object id
+ */
+VFS_EXTERN rc_t CC VFSManagerMakeOidPath ( struct VFSManager const * self,
+    VPath ** new_path, uint32_t oid );
+
+
+/* MakePathWithExtension
+ *  makes a copy of original path
+ *  appends an extension to path portion of orig
+ */
+VFS_EXTERN rc_t CC VFSManagerMakePathWithExtension ( struct VFSManager const * self,
+    VPath ** new_path, const VPath * orig, const char * extension );
+
+
+/* ExtractAccessionOrOID
+ *  given an arbitrary path, possibly with extensions,
+ *  extract the portion of the leaf qualifying as an
+ *  accession or OID
+ */
+VFS_EXTERN rc_t CC VFSManagerExtractAccessionOrOID ( struct VFSManager const * self,
+    VPath ** acc_or_oid, const VPath * orig );
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+VFS_EXTERN rc_t CC VPathAddRef ( const VPath *self );
+VFS_EXTERN rc_t CC VPathRelease ( const VPath *self );
+
+
+/* IsAcessionOrOID
+ *  asks if the path pattern could possibly be an accession or oid
+ */
+VFS_EXTERN bool CC VPathIsAccessionOrOID ( const VPath * self );
+
+
+/* IsFSCompatible
+ *  asks if the path can be used with the OS' filesystems
+ */
+VFS_EXTERN bool CC VPathIsFSCompatible ( const VPath * self );
+
+
+/* FromUri
+ *  asks if the path was created from a formal URI
+ */
+VFS_EXTERN bool CC VPathFromUri ( const VPath * self );
+
+
+/* MarkHighReliability
+ *  mark a path as representing either a reliable URL
+ *  or one where the reliability is unknown.
+ *
+ *  a highly-reliable URL is one that should be expected
+ *  to work. this property makes errors more suspicious,
+ *  and more likely to be temporary, leading to harder work
+ *  within the networking module.
+ *
+ *  "high_reliability" [ IN ] - set to true for high reliability
+ */
+VFS_EXTERN rc_t CC VPathMarkHighReliability ( VPath * self, bool high_reliability );
+
+/* IsHighlyReliable
+ *  returns "true" if the path represents a high-reliability URL
+ */
+VFS_EXTERN bool CC VPathIsHighlyReliable ( const VPath * self );
+
+
+/* Read*
+ *  read the various parts
+ *  copies out data into user-supplied buffer
+ *
+ *  "buffer" [ OUT ] and "buffer_size" [ IN ] - output buffer
+ *  for data read. if sufficient space is available, the copy
+ *  will be NUL-terminated.
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  for the number of valid bytes in "buffer" after a successful
+ *  read. on failure due to insufficient buffer, contains the
+ *  number of bytes required for transfer.
+ */
+VFS_EXTERN rc_t CC VPathReadUri ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read );
+VFS_EXTERN rc_t CC VPathReadScheme ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read );
+VFS_EXTERN rc_t CC VPathReadAuth ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read );
+VFS_EXTERN rc_t CC VPathReadHost ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read );
+VFS_EXTERN rc_t CC VPathReadPortName ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read );
+VFS_EXTERN rc_t CC VPathReadPath ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read );
+VFS_EXTERN rc_t CC VPathReadSysPath ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read );
+VFS_EXTERN rc_t CC VPathReadQuery ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read );
+VFS_EXTERN rc_t CC VPathReadParam ( const VPath * self, const char * param,
+    char * buffer, size_t buffer_size, size_t * num_read );
+VFS_EXTERN rc_t CC VPathReadFragment ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read );
+
+
+/* MakeUri
+ *  convert a VPath into a URI
+ */
+VFS_EXTERN rc_t CC VPathMakeUri ( const VPath * self,
+    struct String const ** uri );
+
+
+/* MakeSysPath
+ *  convert a VPath into an OS-specific path string
+ */
+VFS_EXTERN rc_t CC VPathMakeSysPath ( const VPath * self,
+    struct String const ** sys_path );
+
+
+/* MakeString
+ *  convert a VPath into a String
+ *  respects original source of path,
+ *  i.e. does not add scheme unnecessarily
+ */
+VFS_EXTERN rc_t CC VPathMakeString ( const VPath * self,
+    struct String const ** str );
+
+
+/* Get*
+ *  retrieves internal parts
+ *  returns pointers to internal String data
+ *  Strings remain valid while "self" is valid
+ */
+VFS_EXTERN rc_t CC VPathGetScheme ( const VPath * self, struct String * str );
+VFS_EXTERN rc_t CC VPathGetAuth ( const VPath * self, struct String * str );
+VFS_EXTERN rc_t CC VPathGetHost ( const VPath * self, struct String * str );
+VFS_EXTERN rc_t CC VPathGetPortName ( const VPath * self, struct String * str );
+VFS_EXTERN uint16_t CC VPathGetPortNum ( const VPath * self );
+VFS_EXTERN rc_t CC VPathGetPath ( const VPath * self, struct String * str );
+VFS_EXTERN rc_t CC VPathGetQuery ( const VPath * self, struct String * str );
+VFS_EXTERN rc_t CC VPathGetParam ( const VPath * self, const char * param, struct String * str );
+VFS_EXTERN rc_t CC VPathGetFragment ( const VPath * self, struct String * str );
+/* TEMPORARY */
+VFS_EXTERN uint32_t CC VPathGetOid ( const VPath * self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vfs_path_ */
diff --git a/interfaces/vfs/resolver.h b/interfaces/vfs/resolver.h
new file mode 100644
index 0000000..4611165
--- /dev/null
+++ b/interfaces/vfs/resolver.h
@@ -0,0 +1,311 @@
+/*===========================================================================
+*
+*                            Public Domain Notice
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vfs_resolver_
+#define _h_vfs_resolver_
+
+#ifndef _h_vfs_extern_
+#include <vfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct VPath;
+struct String;
+struct KConfig;
+struct KRepository;
+struct VFSManager;
+
+
+/*--------------------------------------------------------------------------
+ * VResolver
+ */
+typedef struct VResolver VResolver;
+
+
+/* Make
+ *  ask the VFS manager to make a resolver
+ */
+VFS_EXTERN rc_t CC VFSManagerMakeResolver ( struct VFSManager const * self,
+    VResolver ** new_resolver, struct KConfig const * cfg );
+VFS_EXTERN rc_t CC KRepositoryMakeResolver ( struct KRepository const * self,
+    VResolver ** new_resolver, struct KConfig const * cfg );
+
+
+/* AddRef
+ * Release
+ */
+VFS_EXTERN rc_t CC VResolverAddRef ( const VResolver * self );
+VFS_EXTERN rc_t CC VResolverRelease ( const VResolver * self );
+
+
+/* VRemoteProtocols
+ *  accepted protocol list
+ *  there is a simple set of protocols
+ *  where multiple protocols are involved,
+ *  they are ordered by preference from LSB toward MSB
+ */
+typedef uint32_t VRemoteProtocols;
+enum
+{
+    /* version 1.1 protocols */
+      eProtocolNone  = 0
+    , eProtocolHttp  = 1
+    , eProtocolFasp  = 2
+
+      /* version 1.2 protocols */
+    , eProtocolHttps = 3
+
+      /* values 3..7 are available for future */
+
+    , eProtocolLast
+    , eProtocolMax   = eProtocolLast - 1
+    , eProtocolMask  = 7
+
+    , eProtocolMaxPref = 3
+
+      /* macros for building multi-protocol constants
+         ordered by preference from least to most significant bits */
+#define VRemoteProtocolsMake2( p1, p2 )                                     \
+      ( ( ( VRemoteProtocols ) ( p1 ) & eProtocolMask ) |                   \
+        ( ( ( VRemoteProtocols ) ( p2 ) & eProtocolMask ) << ( 3 * 1 ) ) )
+
+#define VRemoteProtocolsMake3( p1, p2, p3 )                                 \
+      ( VRemoteProtocolsMake2 ( p1, p2 ) |                                  \
+        ( ( ( VRemoteProtocols ) ( p3 ) & eProtocolMask ) << ( 3 * 2 ) ) )
+
+    , eProtocolFaspHttp         = VRemoteProtocolsMake2 ( eProtocolFasp,  eProtocolHttp  )
+    , eProtocolHttpFasp         = VRemoteProtocolsMake2 ( eProtocolHttp,  eProtocolFasp  )
+    , eProtocolHttpsHttp        = VRemoteProtocolsMake2 ( eProtocolHttps, eProtocolHttp  )
+    , eProtocolHttpHttps        = VRemoteProtocolsMake2 ( eProtocolHttp,  eProtocolHttps )
+    , eProtocolFaspHttps        = VRemoteProtocolsMake2 ( eProtocolFasp,  eProtocolHttps )
+    , eProtocolHttpsFasp        = VRemoteProtocolsMake2 ( eProtocolHttps, eProtocolFasp  )
+    , eProtocolFaspHttpHttps    = VRemoteProtocolsMake3 ( eProtocolFasp,  eProtocolHttp,  eProtocolHttps )
+    , eProtocolHttpFaspHttps    = VRemoteProtocolsMake3 ( eProtocolHttp,  eProtocolFasp,  eProtocolHttps )
+    , eProtocolFaspHttpsHttp    = VRemoteProtocolsMake3 ( eProtocolFasp,  eProtocolHttps, eProtocolHttp  )
+    , eProtocolHttpHttpsFasp    = VRemoteProtocolsMake3 ( eProtocolHttp,  eProtocolHttps, eProtocolFasp  )
+    , eProtocolHttpsFaspHttp    = VRemoteProtocolsMake3 ( eProtocolHttps, eProtocolFasp,  eProtocolHttp  )
+    , eProtocolHttpsHttpFasp    = VRemoteProtocolsMake3 ( eProtocolHttps, eProtocolHttp,  eProtocolFasp  )
+};
+
+/* Parse
+ *  parses a comma-separated list of case-insensitive protocols:
+ *    'http', 'https', 'fasp'
+ *
+ *  trims white-space, ignores unrecognized and empty terms
+ *
+ *  returns an ordered list of valid protocols
+ */
+VFS_EXTERN VRemoteProtocols CC  VRemoteProtocolsParse ( struct String const * protos );
+
+/* Query
+ *  resolve object location to either an existing local path,
+ *  or a pair of remote URL + local cache location.
+ *
+ *  "protocols" [ IN ] - the desired protocols for remote resolution
+ *
+ *  "query" [ IN ] - a path that can represent:
+ *     accession : a recognizable accession from NCBI or known organization
+ *     obj-id    : a dbGaP object id
+ *     name      : a dbGaP filename
+ *     path      : a filesystem path
+ *     url       : a remote location
+ *
+ *  "local" [ OUT, NULL OKAY ] - optional return parameter for local path:
+ *     accession : resolve to local user or site path
+ *     obj-id    : resolve to local user protected path
+ *     name      : resolve to local user protected path
+ *     url       : set to NULL
+ *
+ *  "remote" [ OUT, NULL OKAY ] - optional return parameter for remote path:
+ *     accession : resolve to URL
+ *     obj-id    : resolve to URL
+ *     name      : resolve to URL
+ *     url       : set to duplicate
+ *
+ *  "cache" [ OUT, NULL OKAY ] - optional return parameter for cache path:
+ *     accession : resolve to user cache path
+ *     obj-id    : resolve to user cache path
+ *     path      : set to NULL
+ *     url       : resolve to user cache path
+ *
+ *  any of the output parameters may be NULL, but not all, i.e. there
+ *  must be at least one non-NULL return parameter.
+ *
+ *  if you DON'T want local resolution, pass NULL for "local" and
+ *  the query will be resolved remotely. if you don't want remote
+ *  resolution, pass NULL for "remote".
+ *
+ *  a query that is resolved locally will always return NULL for
+ *  "remote" and "cache", if the parameters are provided.
+ */
+VFS_EXTERN rc_t CC VResolverQuery ( const VResolver * self,
+    VRemoteProtocols protocols, struct VPath const * query,
+    struct VPath const ** local, struct VPath const ** remote,
+    struct VPath const ** cache );
+
+
+/* Local - DEPRECATED
+ *  Find an existing local file/directory that is named by the accession.
+ *  rcState of rcNotFound means it does not exist.
+ *
+ *  other rc code for failure are possible.
+ *
+ *  Accession must be an ncbi-acc scheme or a simple name with no 
+ *  directory paths.
+ */
+VFS_EXTERN rc_t CC VResolverLocal ( const VResolver * self,
+    struct VPath const * accession, struct VPath const ** path );
+
+
+/* Remote - DEPRECATED
+ *  Find an existing remote file that is named by the accession.
+ *
+ *  rcState of rcNotFound means it did not exist and can not be 
+ *  downloaded. Probably a bad accession name.
+ *
+ *  Need a specific rc for no network configured.
+ *  Need a specific rc for network access permitted.
+ *
+ *  Other rc code for failure are possible.
+ *
+ *  Accession must be an ncbi-acc scheme or a simple name with no 
+ *  directory paths.
+ *
+ */
+VFS_EXTERN rc_t CC VResolverRemote ( const VResolver * self,
+    VRemoteProtocols protocols, struct VPath const * accession,
+    struct VPath const ** path /* , struct KFile const ** opt_file_rtn */ );
+
+/* Cache - DEPRECATED
+ *  Find a cache directory that might or might not contain a partially
+ *  downloaded file.
+ *
+ *  Accession must be an ncbi-acc scheme, an http url or a simple name with no 
+ *  directory paths. All three should return the same directory URL as a VPath. (?)
+ *  Or should it be a directory or a file url depending upon finding a partial
+ *  download? This would require co-ordination with all download mechanisms that
+ *  we permit.
+ *
+ *  With refseq holding wgs objects we have a case were the downloaded file is not
+ *  named the same as the original accession as the file archive you want is a
+ *  container for other files.
+ *
+ *  Find local will give a path that has a special scheme in these cases. 
+ *  Find remote will give the url for the container that contains the accession
+ *  so using the returned VPath from resolve remote is better than the original
+ *  accession in this one case.  I think...
+ */
+VFS_EXTERN rc_t CC VResolverCache ( const VResolver * self,
+    struct VPath const * url, struct VPath const ** path, uint64_t file_size );
+
+
+/* EnableState
+ *  modifies how the various properties are interpreted
+ */
+typedef uint32_t VResolverEnableState;
+enum
+{
+    vrUseConfig = 0,            /* take enable/disable state from KConfig */
+    vrAlwaysEnable = 1,         /* always enable, regardless of KConfig   */
+    vrAlwaysDisable = 2         /* always disable, regardless of KConfig  */
+};
+
+
+/* LocalEnable
+ *  modify settings for using local repositories,
+ *  meaning site, user-public and user-protected.
+ *
+ *  "enable" [ IN ] - enable or disable local access,
+ *  or follow settings in KConfig
+ *
+ *  returns the previous state of "remote-enabled" property
+ *
+ * NB - in VDB-2, the state is associated with library code
+ *  shared libraries in separate closures will have separate
+ *  state. this can only occur if dynamic ( manual ) loading of
+ *  shared libraries is used, and will not occur with normal
+ *  usage. in VDB-3 the state will be stored with the process,
+ *  not the library.
+ */
+VFS_EXTERN VResolverEnableState CC VResolverLocalEnable ( const VResolver * self,
+    VResolverEnableState enable );
+
+
+/* RemoteEnable
+ *  modify settings for using remote repositories
+ *
+ *  "enable" [ IN ] - enable or disable remote access,
+ *  or follow settings in KConfig
+ *
+ *  returns the previous state of "remote-enabled" property
+ *
+ * NB - in VDB-2, the state is associated with library code
+ *  shared libraries in separate closures will have separate
+ *  state. this can only occur if dynamic ( manual ) loading of
+ *  shared libraries is used, and will not occur with normal
+ *  usage. in VDB-3 the state will be stored with the process,
+ *  not the library.
+ */
+VFS_EXTERN VResolverEnableState CC VResolverRemoteEnable ( const VResolver * self,
+    VResolverEnableState enable );
+
+
+/* CacheEnable
+ *  modify settings for caching files in user repositories
+ *
+ *  "enable" [ IN ] - enable or disable user repository cache,
+ *  or follow settings in KConfig
+ *
+ *  returns the previous state of "cache-enabled" property
+ *
+ * NB - in VDB-2, the state is associated with library code
+ *  shared libraries in separate closures will have separate
+ *  state. this can only occur if dynamic ( manual ) loading of
+ *  shared libraries is used, and will not occur with normal
+ *  usage. in VDB-3 the state will be stored with the process,
+ *  not the library.
+ */
+VFS_EXTERN VResolverEnableState CC VResolverCacheEnable ( const VResolver * self,
+    VResolverEnableState enable );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vfs_resolver_ */
diff --git a/interfaces/xfs/doc.h b/interfaces/xfs/doc.h
new file mode 100644
index 0000000..745b32f
--- /dev/null
+++ b/interfaces/xfs/doc.h
@@ -0,0 +1,123 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _doc_h_
+#define _doc_h_
+
+#include <klib/refcount.h>
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*  Forwards and others
+ */
+struct KRefcount;
+struct KFile;
+
+struct XFSDoc;
+union XFSDoc_vt;
+
+/******************************************************************
+ * Another awkward structure which should represent memory buffer
+ * with file interface. Will be used for implementing virtual files
+ * like README.txt, etc ...
+ * There are two general interfaces :
+ *      XFSDoc - buffer
+ *      XFSDocFile - file
+ * Also, we are providing some generic TEXT Doc functionality
+ ******************************************************************/
+
+/*))    Just a buffer interface and some methods
+ ((*/
+struct XFSDoc_vt_v1 {
+        /* version for pension */
+    uint32_t maj;
+    uint32_t min;
+
+    rc_t ( CC * dispose ) ( struct XFSDoc * self );
+
+    rc_t ( CC * get ) ( const struct XFSDoc * self, const char ** B );
+    rc_t ( CC * size ) ( const struct XFSDoc * self, uint64_t * S ); 
+};
+
+union XFSDoc_vt {
+    struct XFSDoc_vt_v1 v1;
+};
+
+XFS_EXTERN rc_t CC XFSDocInit (
+                            const struct XFSDoc * self,
+                            const union XFSDoc_vt * VT
+                            );
+XFS_EXTERN rc_t CC XFSDocDispose (
+                            const struct XFSDoc * self
+                            );
+XFS_EXTERN rc_t CC XFSDocAddRef (
+                            const struct XFSDoc * self
+                            );
+XFS_EXTERN rc_t CC XFSDocRelease (
+                            const struct XFSDoc * self
+                            );
+XFS_EXTERN rc_t CC XFSDocGet (
+                            const struct XFSDoc * self,
+                            const char ** B
+                            );
+XFS_EXTERN rc_t CC XFSDocSize (
+                            const struct XFSDoc * self,
+                            uint64_t * Size
+                            );
+
+/*))    Just a file to make. Name is OK to be NULL
+ ((*/
+XFS_EXTERN rc_t CC XFSDocFileMake (
+                            const char * Name,      /* Ok to be NULL */
+                            const struct XFSDoc * Doc,
+                            struct KFile ** File
+                            );
+
+/*))    Usefull TextDoc interface
+ ((*/
+XFS_EXTERN rc_t CC XFSTextDocMake (
+                            struct XFSDoc ** TextDoc
+                            );
+XFS_EXTERN rc_t CC XFSTextDocAppend (
+                            struct XFSDoc * self,
+                            const char * Fmt,
+                            ...
+                            );
+XFS_EXTERN rc_t CC XFSTextDocVAppend (
+                            struct XFSDoc * self,
+                            const char * Fmt,
+                            va_list args
+                            );
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _doc_h_ */
diff --git a/interfaces/xfs/editors.h b/interfaces/xfs/editors.h
new file mode 100644
index 0000000..b8092f2
--- /dev/null
+++ b/interfaces/xfs/editors.h
@@ -0,0 +1,310 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xfs_editors_h_
+#define _xfs_editors_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*))
+ ||   Lyrics.
+ ++   That file contains editor interfaces for XFSNode: File, Dir, Attr
+ ||
+((*/
+
+/*)))
+ ///   And other forwards.
+(((*/
+struct XFSHandle;
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))  Base editor for all types of editors
+ ((*/
+struct XFSEditor {
+
+        /* Victim node for editor
+         */
+    const struct XFSNode * Node;
+
+        /* Data - some editor related data
+         */
+    void * Data;
+
+        /* Mandatary method to dispose editor
+         */
+    rc_t ( CC * dispose ) ( const struct XFSEditor * self );
+};
+
+XFS_EXTERN rc_t CC XFSEditorInit (
+                            const struct XFSEditor * self,
+                            const struct XFSNode * Node,
+                            rc_t ( CC * dispose )
+                                    ( const struct XFSEditor * self )
+                            );
+
+XFS_EXTERN rc_t CC XFSEditorDispose ( const struct XFSEditor * self );
+XFS_EXTERN const struct XFSNode * CC XFSEditorNode (
+                            const struct XFSEditor * self
+                            );
+XFS_EXTERN void * CC XFSEditorData ( const struct XFSEditor * self );
+XFS_EXTERN rc_t CC XFSEditorSetData (
+                            const struct XFSEditor * self,
+                            void * Data
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))   Editors, which are Dir, File and Attr
+ ((*/
+
+/*)))
+ (((    Directory editor, and relative methods
+  )))
+ (((*/
+struct XFSDirEditor {
+    struct XFSEditor Papahen;
+
+    rc_t ( CC * list ) (
+                        const struct XFSDirEditor * self,
+                        const struct KNamelist ** List
+                        );
+    rc_t ( CC * find ) (
+                        const struct XFSDirEditor * self,
+                        const char * Name,
+                        const struct XFSNode ** Node
+                        );
+        /*) Creates and opens file with write access
+         (*/
+    rc_t ( CC * create_file ) (
+                        const struct XFSDirEditor * self,
+                        const char * Name,
+                        XFSNMode Mode,
+                        const struct XFSHandle ** Handle
+                        );
+        /*) Creates and directory no mode or access involved
+         (*/
+    rc_t ( CC * create_dir ) (
+                        const struct XFSDirEditor * self,
+                        const char * Name
+                        );
+        /*) Deletes both file or directory
+         (*/
+    rc_t ( CC * delete ) (
+                        const struct XFSDirEditor * self,
+                        const char * Name
+                        );
+        /*) Move is always happens within filesystem
+         (*/
+    rc_t ( CC * move ) (
+                        const struct XFSDirEditor * self,
+                        const char * OldName,
+                        const struct XFSNode * NewDir,
+                        const char * NewName
+                        );
+};
+
+XFS_EXTERN rc_t CC XFSDirEditorList (
+                                const struct XFSDirEditor * self,
+                                const struct KNamelist ** List
+                                );
+XFS_EXTERN rc_t CC XFSDirEditorFind (
+                                const struct XFSDirEditor * self,
+                                const char * Name,
+                                const struct XFSNode ** Node
+                                );
+XFS_EXTERN rc_t CC XFSDirEditorCreate (
+                                const struct XFSDirEditor * self,
+                                const char * Name,
+                                XFSNMode Mode,
+                                const struct XFSHandle ** Handle
+                                );
+XFS_EXTERN rc_t CC XFSDirEditorCreateDir (
+                                const struct XFSDirEditor * self,
+                                const char * Name
+                                );
+XFS_EXTERN rc_t CC XFSDirEditorDelete (
+                                const struct XFSDirEditor * self,
+                                const char * Name
+                                );
+XFS_EXTERN rc_t CC XFSDirEditorMove (
+                                const struct XFSDirEditor * self,
+                                const char * OldName,
+                                const struct XFSNode * NewDir,
+                                const char * NewName
+                                );
+
+/*)))
+ (((    File editor, and relative methods
+  )))
+ (((*/
+struct XFSFileEditor {
+    struct XFSEditor Papahen;
+
+    rc_t ( CC * open ) (
+                    const struct XFSFileEditor * self,
+                    XFSNMode Mode
+                    );
+
+    rc_t ( CC * close ) (
+                    const struct XFSFileEditor * self
+                    );
+
+    rc_t ( CC * read ) (
+                    const struct XFSFileEditor * self,
+                    uint64_t Offset,
+                    void * Buffer,
+                    size_t SizeToRead,
+                    size_t * NumReaded
+                    );
+
+    rc_t ( CC * write ) (
+                    const struct XFSFileEditor * self,
+                    uint64_t Offset,
+                    const void * Buffer,
+                    size_t SizeToWrite,
+                    size_t * NumWritten
+                    );
+
+    rc_t ( CC * size ) (
+                    const struct XFSFileEditor * self,
+                    uint64_t * Size
+                    );
+    rc_t ( CC * set_size ) (
+                    const struct XFSFileEditor * self,
+                    uint64_t Size
+                    );
+
+};
+
+XFS_EXTERN rc_t CC XFSFileEditorOpen (
+                                const struct XFSFileEditor * self,
+                                XFSNMode Mode
+                                );
+
+XFS_EXTERN rc_t CC XFSFileEditorClose (
+                                const struct XFSFileEditor * self
+                                );
+
+XFS_EXTERN rc_t CC XFSFileEditorRead (
+                                const struct XFSFileEditor * self,
+                                uint64_t Offset,
+                                void * Buffer,
+                                size_t SizeToRead,
+                                size_t * NumReaded
+                                );
+
+XFS_EXTERN rc_t CC XFSFileEditorWrite (
+                                const struct XFSFileEditor * self,
+                                uint64_t Offset,
+                                const void * Buffer,
+                                size_t SizeToWrite,
+                                size_t * NumWritten
+                                );
+
+XFS_EXTERN rc_t CC XFSFileEditorSize (
+                                    const struct XFSFileEditor * self,
+                                    uint64_t * Size
+                                    );
+
+XFS_EXTERN rc_t CC XFSFileEditorSetSize (
+                                    const struct XFSFileEditor * self,
+                                    uint64_t Size
+                                    );
+
+/*)))
+ (((    Attribute editor, and relative methods
+  )))
+ (((*/
+
+struct XFSAttrEditor {
+    struct XFSEditor Papahen;
+
+    rc_t ( CC * permissions ) (
+                    const struct XFSAttrEditor * self,
+                    const char ** Permissions
+                    );
+    rc_t ( CC * set_permissions ) (
+                    const struct XFSAttrEditor * self,
+                    const char * Permissions
+                    );
+
+    rc_t ( CC * date ) (
+                    const struct XFSAttrEditor * self,
+                    KTime_t * Time
+                    );
+    rc_t ( CC * set_date ) (
+                    const struct XFSAttrEditor * self,
+                    KTime_t Time
+                    );
+
+    rc_t ( CC * type ) (
+                    const struct XFSAttrEditor * self,
+                    XFSNType * Type
+                    );
+};
+
+XFS_EXTERN rc_t CC XFSAttrEditorPermissions (
+                                    const struct XFSAttrEditor * self,
+                                    const char ** Permissions
+                                    );
+
+XFS_EXTERN rc_t CC XFSAttrEditorDate (
+                                    const struct XFSAttrEditor * self,
+                                    KTime_t * Time
+                                    );
+
+XFS_EXTERN rc_t CC XFSAttrEditorType (
+                                    const struct XFSAttrEditor * self,
+                                    XFSNType * Type
+                                    );
+
+XFS_EXTERN rc_t CC XFSAttrEditorSetPermissions (
+                                    const struct XFSAttrEditor * self,
+                                    const char * Permissions
+                                    );
+
+XFS_EXTERN rc_t CC XFSAttrEditorSetDate (
+                                    const struct XFSAttrEditor * self,
+                                    KTime_t Time
+                                    );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _xfs_editors_h_ */
diff --git a/interfaces/xfs/extern.h b/interfaces/xfs/extern.h
new file mode 100644
index 0000000..fc23112
--- /dev/null
+++ b/interfaces/xfs/extern.h
@@ -0,0 +1,48 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+ /* Like a monkey in a fish bowl */
+
+#ifndef _h_xfs_extern_
+#define _h_xfs_extern_
+
+#if defined _LIBRARY
+ #define XFS_EXTERN LIB_EXPORT
+ #define XFS_EXTERN_DATA extern LIB_EXPORT
+
+  #if ! defined EXPORT_LATCH
+  #define EXPORT_LATCH 1
+  #endif /* EXPORT_LATCH */
+#else
+ #define XFS_EXTERN LIB_IMPORT
+#endif /* _LIBRARY */
+
+ #ifndef _h_klib_extern_
+ #include <klib/extern.h>
+ #endif
+
+ #endif /* _h_xfs_extern_ */
+
diff --git a/interfaces/xfs/handle.h b/interfaces/xfs/handle.h
new file mode 100644
index 0000000..15ae5ad
--- /dev/null
+++ b/interfaces/xfs/handle.h
@@ -0,0 +1,106 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _handle_h_
+#define _handle_h_
+
+#include <klib/refcount.h>
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*  Forwards and others
+ */
+struct XFSNode;
+struct XFSHandle;
+
+/******************************************************************
+ * Very awkward structure which need to be reimplemented
+ * To avoid such things like getting list of files under Windows
+ * which looks like :
+ *    Handle = CreateFile ( file_name, open_existing, other_flags );
+ *    GetFileInformation ( Handle, FILEINFO );
+ *    FindFiles ( Handle );
+ * Apparently it need to keep referrenced Node, and last file handle
+ * for XFSFileEditor, which is only used to read/write data.
+ * All other editors suppose to work on-place only
+ ******************************************************************/
+XFS_EXTERN rc_t CC XFSHandleMake (
+                            const struct XFSNode * Node,
+                            const struct XFSHandle ** Handle
+                            );
+
+/*))
+ // Here we are deleting Handle
+((*/
+XFS_EXTERN rc_t CC XFSHandleDestroy (
+                            const struct XFSHandle * self
+                            );
+
+/*))
+ // This method will add referrence to XFSHandle
+((*/
+XFS_EXTERN rc_t CC XFSHandleAddRef (
+                            const struct XFSHandle * self
+                            );
+
+/*))
+ // This method will release referrence or destroy XFSHandle
+((*/
+XFS_EXTERN rc_t CC XFSHandleRelease (
+                            const struct XFSHandle * self
+                            );
+
+/*))
+ // That method will return handle on hanlde
+((*/
+XFS_EXTERN void * CC XFSHandleGet (
+                            const struct XFSHandle * self
+                            );
+
+/*))
+ // That method will set handle on handle
+((*/
+XFS_EXTERN rc_t CC XFSHandleSet (
+                            const struct XFSHandle * self,
+                            void * Handle
+                            );
+
+/*))
+ // That method will return node for handle
+((*/
+XFS_EXTERN const struct XFSNode * CC XFSHandleNode (
+                            const struct XFSHandle * self
+                            );
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _handle_h_ */
diff --git a/interfaces/xfs/model.h b/interfaces/xfs/model.h
new file mode 100644
index 0000000..809ce56
--- /dev/null
+++ b/interfaces/xfs/model.h
@@ -0,0 +1,248 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xfs_model_h_
+#define _xfs_model_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*))
+ ||   Lyrics.
+ ++   That file contains interfaces for model which contains formal
+ ||   description for XFS Tree.
+((*/
+
+/*)))
+ ///   XFSModel and other forwards.
+(((*/
+struct XFSModel;
+struct XFSModelNode;
+struct KNamelist;
+
+/*))    Common name defines for model property names
+ ((*/
+#define XFS_MODEL_ROOT      "root"       /* the only mandatory node
+                                            to have */
+#define XFS_MODEL_AS        "as"         /* use this node as template
+                                            overridden properties */
+#define XFS_MODEL_TYPE      "type"       /* mandatory, used for tree
+                                            rendering */
+#define XFS_MODEL_LABEL     "label"      /* name which will be used at
+                                            rendered tree, could be
+                                            overriden by alias */
+#define XFS_MODEL_SECURITY  "security"   /* in real life those are
+                                            permissions */
+#define XFS_MODEL_CHILDREN  "children"   /* usually any container, it
+                                            is list of names of children
+                                            with labels */
+
+#define XFS_MODEL_SOURCE    "source"
+#define XFS_MODEL_TEXT      "text"
+#define XFS_MODEL_PASSWD    "password"
+#define XFS_MODEL_ENCTYPE   "enctype"
+#define XFS_MODEL_MODE      "mode"
+#define XFS_MODEL_MODE_RO   "RO"
+#define XFS_MODEL_MODE_RW   "RW"
+#define XFS_MODEL_PROJECTID "project-id"
+#define XFS_MODEL_OBJECTID  "object-id"
+#define XFS_MODEL_ACCESSION "accession"
+
+/*)))
+ ///   Methods
+(((*/
+XFS_EXTERN
+const char * CC
+XFSModelNodeName ( const struct XFSModelNode * self );
+
+XFS_EXTERN
+const char * CC
+XFSModelNodeType ( const struct XFSModelNode * self );
+
+XFS_EXTERN
+bool CC
+XFSModelNodeReadOnly ( const struct XFSModelNode * self );
+
+XFS_EXTERN
+const char * CC
+XFSModelNodeAs ( const struct XFSModelNode * self );
+
+XFS_EXTERN
+const char * CC
+XFSModelNodeLabel ( const struct XFSModelNode * self );
+
+XFS_EXTERN
+const char * CC
+XFSModelNodeSecurity ( const struct XFSModelNode * self );
+
+XFS_EXTERN
+bool CC
+XFSModelNodeIsRoot ( const struct XFSModelNode * self );
+
+XFS_EXTERN
+rc_t CC
+XFSModelNodePropertyNames (
+                    const struct XFSModelNode * self,
+                    const struct KNamelist ** Properties
+                    );
+
+XFS_EXTERN
+const char * CC
+XFSModelNodeProperty (
+                    const struct XFSModelNode * self,
+                    const char * PropertyName
+                    );
+
+XFS_EXTERN
+rc_t CC
+XFSModelNodeChildrenNames (
+                    const struct XFSModelNode * self,
+                    const struct KNamelist ** Children
+                    );
+
+XFS_EXTERN
+const char * CC
+XFSModelNodeChildAlias (
+                    const struct XFSModelNode * self,
+                    const char * ChildName
+                    );
+
+XFS_EXTERN
+rc_t CC
+XFSModelMake (
+            struct XFSModel ** Model,
+            const char * Resource,      /* OK to be NULL */
+            const char * Version        /* OK to be NULL */
+            );
+
+XFS_EXTERN
+rc_t CC
+XFSModelDispose ( struct XFSModel * self );
+
+XFS_EXTERN
+rc_t CC
+XFSModelAddRef ( const struct XFSModel * self );
+
+XFS_EXTERN
+rc_t CC
+XFSModelRelease ( const struct XFSModel * self );
+
+XFS_EXTERN
+const struct XFSModelNode * CC
+XFSModelRootNode ( const struct XFSModel * self );
+
+XFS_EXTERN
+const struct XFSModelNode * CC
+XFSModelLookupNode ( const struct XFSModel * self, const char * Name );
+
+XFS_EXTERN
+const char * CC
+XFSModelResource ( const struct XFSModel * self );
+
+XFS_EXTERN
+const char * CC
+XFSModelVersion ( const struct XFSModel * self );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* Model Editing methods                                             */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+XFS_EXTERN
+rc_t CC
+XFSModelFromScratch (
+            struct XFSModel ** Model,
+            const char * Version
+            );
+
+XFS_EXTERN
+rc_t CC
+XFSModelAddNode (
+            struct XFSModel * self,
+            const char * NodeName,  /* not null */
+            const char * Type       /* not null */
+            );
+
+XFS_EXTERN
+rc_t CC
+XFSModelAddRootNode (
+            struct XFSModel * self,
+            const char * Type       /* not null */
+            );
+
+XFS_EXTERN
+rc_t CC
+XFSModelNodeSetProperty (
+            struct XFSModelNode * self,
+            const char * Key,       /* not null */
+            const char * Value      /* could be null */
+            );
+
+XFS_EXTERN
+rc_t CC
+XFSModelNodeSetLabel (
+            struct XFSModelNode * self,
+            const char * Label      /* could be null */
+            );
+
+XFS_EXTERN
+rc_t CC
+XFSModelNodeSetSecurity (
+            struct XFSModelNode * self,
+            const char * Security   /* could be null */
+            );
+
+XFS_EXTERN
+rc_t CC
+XFSModelNodeSetSource (
+            struct XFSModelNode * self,
+            const char * Source     /* could be null */
+            );
+
+XFS_EXTERN
+rc_t CC
+XFSModelNodeSetChildren (
+            struct XFSModelNode * self,
+            const char * CommaSeparChildrenNames    /* could be null */
+            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+XFS_EXTERN
+void CC
+XFSModelNodeDDump ( const struct XFSModelNode * self );
+
+XFS_EXTERN
+void CC
+XFSModelDDump ( const struct XFSModel * self );
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _xfs_model_h_ */
diff --git a/interfaces/xfs/node.h b/interfaces/xfs/node.h
new file mode 100644
index 0000000..b2324f9
--- /dev/null
+++ b/interfaces/xfs/node.h
@@ -0,0 +1,217 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xfs_node_h_
+#define _xfs_node_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*))
+ ||   Lyrics.
+ ++   That file contains interfaces for XFS Tree
+ ||
+((*/
+
+/*)))
+ ///   XFSModel and other forwards.
+(((*/
+struct XFSTree;
+struct XFSNode;
+struct XFSModel;
+struct XFSPath;
+struct KRefcount;
+
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))   Node itself
+ ((*/
+union XFSNode_vt;
+
+struct XFSDirEditor;
+struct XFSFileEditor;
+struct XFSAttrEditor;
+
+struct XFSNode {
+    const union XFSNode_vt * vt;
+
+    KRefcount refcount;
+
+    char * Name;
+};
+
+struct XFSNode_vt_v1 {
+        /* version, as is */
+    uint32_t maj;
+    uint32_t min;
+
+        /* needed for authomatic node recognition */
+    uint32_t ( CC * flavor ) ( const struct XFSNode * self );
+
+        /* needed for authomatic node dipsosal */
+    rc_t ( CC * dispose ) ( const struct XFSNode * self );
+
+        /* will return node for path */
+    rc_t ( CC * findnode ) (
+                    const struct XFSNode * self, 
+                    const struct XFSPath * Path,
+                    uint32_t PathIndex,
+                    const struct XFSNode ** Node
+                    );
+
+        /* returns interface to node as a directory, if exists */
+    rc_t ( CC * dir ) (
+                    const struct XFSNode * self,
+                    const struct XFSDirEditor ** Dir
+                    );
+
+        /* returns interface to node as a file, if exists */
+    rc_t ( CC * file ) (
+                    const struct XFSNode * self,
+                    const struct XFSFileEditor ** File
+                    );
+
+        /* returns interface which allows access node attributes */
+    rc_t ( CC * attr ) (
+                    const struct XFSNode * self,
+                    const struct XFSAttrEditor ** Attr
+                    );
+
+        /* quite stupid method which will print some info about node */
+    rc_t ( CC * describe ) (
+                    const struct XFSNode * self,
+                    char * Buffer,
+                    size_t BufferSize
+                    );
+};
+
+union XFSNode_vt {
+    struct XFSNode_vt_v1 v1;
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+XFS_EXTERN rc_t CC XFSNodeInit (
+                            const struct XFSNode * self,
+                            const char * NodeName
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeInitVT (
+                            const struct XFSNode * self,
+                            const char * NodeName,
+                            const union XFSNode_vt * VT /*  Could be
+                                                            NULL */
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeMake (
+                            const struct XFSModel * ModelNode,
+                            const char * NodeName,
+                            const char * NameAlias,   /* NULL is OK */
+                            const struct XFSNode ** Node
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeDispose ( const struct XFSNode * self );
+
+XFS_EXTERN rc_t CC XFSNodeAddRef ( const struct XFSNode * self );
+
+XFS_EXTERN rc_t CC XFSNodeRelease ( const struct XFSNode * self );
+
+XFS_EXTERN rc_t CC XFSNodeFindNode (
+                            const struct XFSNode * self, 
+                            const struct XFSPath * Path,
+                            uint32_t PathIndex,
+                            const struct XFSNode ** Node
+                            );
+
+    /*  That method checks values and inits useful variables
+     */
+XFS_EXTERN rc_t CC XFSNodeFindNodeCheckInitStandard (
+                            const struct XFSNode * self, 
+                            const struct XFSPath * Path,
+                            uint32_t PathIndex,
+                            const struct XFSNode ** Node,
+                            const char ** NodeName,
+                            uint32_t * PathCount,
+                            bool * IsLast
+                            );
+
+        /* returns interface to node as a directory, if exists */
+XFS_EXTERN rc_t CC XFSNodeDirEditor (
+                            const struct XFSNode * self,
+                            const struct XFSDirEditor ** Dir
+                            );
+
+        /* returns interface to node as a file, if exists */
+XFS_EXTERN rc_t CC XFSNodeFileEditor (
+                            const struct XFSNode * self,
+                            const struct XFSFileEditor ** File
+                            );
+
+        /* returns interface which allows access node attributes */
+XFS_EXTERN rc_t CC XFSNodeAttrEditor (
+                            const struct XFSNode * self,
+                            const struct XFSAttrEditor ** Attr
+                            );
+
+        /* describes node content */
+XFS_EXTERN rc_t CC XFSNodeDescribe (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+XFS_EXTERN rc_t CC XFSNodeDump ( const struct XFSNode * self );
+
+XFS_EXTERN const char * CC XFSNodeName ( const struct XFSNode * self );
+
+XFS_EXTERN uint32_t CC XFSNodeFlavor ( const struct XFSNode * self );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+    /*)))   Way to make special Bogus nodes
+     (((*/
+XFS_EXTERN rc_t CC XFSNodeNotFoundMake (
+                            const char * NodeName,
+                            const struct XFSNode ** Node
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeBadPathMake (
+                            const char * NodeName,
+                            const struct XFSNode ** Node
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _xfs_node_h_ */
diff --git a/interfaces/xfs/path.h b/interfaces/xfs/path.h
new file mode 100644
index 0000000..3e93983
--- /dev/null
+++ b/interfaces/xfs/path.h
@@ -0,0 +1,227 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _path_h_
+#define _path_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   another and hope more successifull attempt to create
+  ))))  good usable interface to a Path
+ ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))  Universal method which should load config from resource
+ ((*/
+
+struct XFSPath;
+
+XFS_EXTERN rc_t CC XFSPathMake (
+                                const struct XFSPath ** Out,
+                                bool AddPrecedingSlash,
+                                const char * Format,
+                                ...
+                                );
+
+XFS_EXTERN rc_t CC XFSPathVMake (
+                                const struct XFSPath ** Out,
+                                bool AddPrecedingSlash,
+                                const char * Format,
+                                va_list Args
+                                );
+
+    /*)) These two methods are requireing KDirectory,
+     //  and I am not sure if those should be here ... later
+    ((*/
+XFS_EXTERN rc_t CC XFSPathMakeAbsolute (
+                                const struct XFSPath ** Out,
+                                bool AddPrecedingSlash,
+                                const char * Format,
+                                ...
+                                );
+
+XFS_EXTERN rc_t CC XFSPathVMakeAbsolute (
+                                const struct XFSPath ** Out,
+                                bool AddPrecedingSlash,
+                                const char * Format,
+                                va_list Args
+                                );
+
+XFS_EXTERN rc_t CC XFSPathDup (
+                                const struct XFSPath * In,
+                                const struct XFSPath ** Out
+                                );
+
+XFS_EXTERN rc_t CC XFSPathAddRef ( const struct XFSPath * self );
+XFS_EXTERN rc_t CC XFSPathRelease ( const struct XFSPath * self );
+
+
+XFS_EXTERN rc_t CC XFSPathSet (
+                                const struct XFSPath * self,
+                                bool AddPrecedingSlash,
+                                const char * Format,
+                                ...
+                                );
+XFS_EXTERN rc_t CC XFSPathSetPath (
+                                const struct XFSPath * self,
+                                const struct XFSPath * Path
+                                );
+XFS_EXTERN rc_t CC XFSPathAppend (
+                                const struct XFSPath * self,
+                                const char * Format,
+                                ...
+                                );
+XFS_EXTERN rc_t CC XFSPathAppendPath (
+                                const struct XFSPath * self,
+                                const struct XFSPath * Path
+                                );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+XFS_EXTERN bool CC XFSPathIsAbsolute (
+                                const struct XFSPath * self
+                                );
+
+XFS_EXTERN uint32_t CC XFSPathPartCount (
+                                const struct XFSPath * self
+                                );
+
+XFS_EXTERN const char * CC XFSPathPartGet (
+                                const struct XFSPath * self,
+                                uint32_t Index
+                                );
+
+XFS_EXTERN const char * CC XFSPathGet (
+                                const struct XFSPath * self
+                                );
+
+XFS_EXTERN const char * CC XFSPathOrig (
+                                const struct XFSPath * self
+                                );
+
+XFS_EXTERN rc_t CC XFSPathParent (
+                                const struct XFSPath * self,
+                                const struct XFSPath ** Parent
+                            );
+
+    /*) Don'd frorget to free Name after calling */
+XFS_EXTERN const char *  CC XFSPathName (
+                                const struct XFSPath * self
+                                );
+
+
+XFS_EXTERN bool CC XFSPathEqual (
+                                const struct XFSPath * Path1,
+                                const struct XFSPath * Path2
+                                );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+    /*) These methods will allow to compose part of the path.
+      | NOTE: there are two positions : From - inclusive, and To -
+      |       exclusive
+      | NOTE: these methods will allocate string, and caller should
+      |       free it.
+      (*/
+XFS_EXTERN rc_t CC XFSPathSub (
+                            const struct XFSPath * self,
+                            size_t From,
+                            size_t To,
+                            const struct XFSPath ** Path
+                            );
+
+XFS_EXTERN rc_t CC XFSPathFrom (
+                            const struct XFSPath * self,
+                            size_t From,
+                            const struct XFSPath ** Path
+                            );
+
+XFS_EXTERN rc_t CC XFSPathTo (
+                            const struct XFSPath * self,
+                            size_t To,
+                            const struct XFSPath ** Path
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+    /*) That method will check if Path is base path for 'self'. i.e.
+      | self could be composed as concatenation of Path and RelPath
+      | RelPath could be zero, in that case it will be not returned
+      (*/
+XFS_EXTERN bool CC XFSPathIsBase (
+                                const struct XFSPath * self,
+                                const struct XFSPath * Path,
+                                const struct XFSPath ** RelPath
+                                );
+XFS_EXTERN bool CC XFSPathSIsBase (
+                                const char * self,
+                                const char * Path,
+                                const struct XFSPath ** RelPath
+                                );
+
+    /*) That method will check if Path is child ( sub ) path for 'self'.
+      | i.e. Path could be composed as concatenation of self and RelPath
+      | RelPath could be zero, in that case it will be not returned
+      (*/
+XFS_EXTERN bool CC XFSPathIsChild (
+                                const struct XFSPath * self,
+                                const struct XFSPath * Path,
+                                const struct XFSPath ** RelPath
+                                );
+XFS_EXTERN bool CC XFSPathSIsChild (
+                                const char * self,
+                                const char * Path,
+                                const struct XFSPath ** RelPath
+                                );
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+XFS_EXTERN void CC XFSPathDump ( const struct XFSPath * self );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _path_h_ */
diff --git a/interfaces/xfs/perm.h b/interfaces/xfs/perm.h
new file mode 100644
index 0000000..c8d24bb
--- /dev/null
+++ b/interfaces/xfs/perm.h
@@ -0,0 +1,173 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _perm_h_
+#define _perm_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*))
+ ||   Lyrics: XFSPerm - permissions for filesystem objects
+ ||
+ ||   The permissions are stored as string in format :
+ ||
+ ||         rwxrwxrwx[ user[:group[:other]]]
+ ||         oooggguuu
+ ||
+ ||   Where first mandatary part is standard unix permissions string,
+ ||   and first three characters are read-write-execute permitions for
+ ||   others, second three characters are read-write-execute permissions
+ ||   for group, and third three characters are read-write-execute
+ ||   permissions for user. The rest of a string is a triplet for
+ ||   of names for 'user', 'group' and 'other' ( which is for windows )
+ ||
+ ||   BTW that primitive is storeing data in char format, no gid or uid
+ ||   because it should work well on different platforms. The final 
+ ||   transformation to native format will be implemented on each 
+ ||   platform.
+ ||
+ ||   So, righot now there is XFSPerm structure, which contains three
+ ||   XFSAuth structures which represents user/group/other
+ ||
+((*/
+
+/*)))
+ ///   And other forwards.
+(((*/
+
+struct XFSPerm;
+struct XFSAuth;
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))   XFSPerm make/dispose
+ ((*/
+
+/*))
+ //    Currently used types
+(*/
+
+/*))
+ //    Parses permission string and makes XFSPerm 
+(*/
+XFS_EXTERN rc_t CC XFSPermMake (
+                            const char * PermAsString,
+                            const struct XFSPerm ** Permissions
+                            );
+
+/*))
+ //    Disposes XFSPerm
+(*/
+XFS_EXTERN rc_t CC XFSPermDispose (
+                            const struct XFSPerm * self
+                            );
+
+/*))
+ //    Returns Authority by it's type
+(*/
+XFS_EXTERN const struct XFSAuth * CC XFSPermAuth (
+                            const struct XFSPerm * self,
+                            XFSAType Type
+                            );
+
+
+/*))
+ //    Generates string which represents XFSPerm object
+(*/
+XFS_EXTERN rc_t CC XFSPermToString (
+                            const struct XFSPerm * self,
+                            char * Buffer,
+                            size_t BufferSize
+                            );
+
+/*))
+ //    Some defaults Don't yet know for what ... to make configurable ?
+((*/
+XFS_EXTERN const char * CC XFSPermDefaultName ( XFSAType Type );
+XFS_EXTERN rc_t CC XFSPermSetDefaultName (
+                            XFSAType Type,
+                            const char * Name
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))   XFSAuth
+ ((*/
+
+/*))
+ //     Returns name of authority, which could be defaulted
+((*/
+XFS_EXTERN const char * CC XFSAuthName ( const struct XFSAuth * self );
+
+/*))
+ //     These three methods will return permissions for authority
+((*/
+XFS_EXTERN bool CC XFSAuthCanRead ( const struct XFSAuth * self );
+XFS_EXTERN bool CC XFSAuthCanWrite ( const struct XFSAuth * self );
+XFS_EXTERN bool CC XFSAuthCanExecute ( const struct XFSAuth * self );
+
+/*))
+ //     That method will convert XFSPerm to unix like access uint32_t
+((*/
+XFS_EXTERN rc_t CC XFSPermToNum (
+                                    const char * Perm,
+                                    uint32_t * Access
+                                    );
+
+XFS_EXTERN rc_t CC XFSPermToChar (
+                                    uint32_t Access,
+                                    char * Buf,
+                                    size_t BufSize
+                                    );
+
+/*))
+ //     Some usefull defaults ... not sure
+((*/
+XFS_EXTERN const char * CC XFSPermRODefContChar ();
+XFS_EXTERN const char * CC XFSPermRODefNodeChar ();
+XFS_EXTERN uint32_t CC XFSPermRODefContNum ();
+XFS_EXTERN uint32_t CC XFSPermRODefNodeNum ();
+
+XFS_EXTERN const char * CC XFSPermRWDefContChar ();
+XFS_EXTERN const char * CC XFSPermRWDefNodeChar ();
+XFS_EXTERN uint32_t CC XFSPermRWDefContNum ();
+XFS_EXTERN uint32_t CC XFSPermRWDefNodeNum ();
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _perm_h_ */
diff --git a/interfaces/xfs/tree.h b/interfaces/xfs/tree.h
new file mode 100644
index 0000000..3a87e8c
--- /dev/null
+++ b/interfaces/xfs/tree.h
@@ -0,0 +1,176 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xfs_tree_h_
+#define _xfs_tree_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*))
+ ||   Lyrics.
+ ++   That file contains interfaces for XFS Tree and TreeDepot
+ ||
+((*/
+
+/*)))
+ ///   XFSModel and other forwards.
+(((*/
+struct XFSTree;
+struct XFSTreeDepot;
+struct XFSNode;
+struct XFSModel;
+struct KNamelist;
+struct VPath;
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ ((    Really I will introduce separate TreeMake and Verify methods
+  ))   I think it is more convinient than checking model on Make stage
+ ((*/
+
+/*))   Verification flags, here would be more then
+ //    Will think about it later
+((*/
+#define XFS_CHECK_INTEGRITY      (1 << 0)
+#define XFS_CHECK_REMOTE_CONTENT (1 << 1)
+#define XFS_CHECK_LOOCAL_CONTENT (1 << 2)
+
+XFS_EXTERN
+rc_t CC
+XFSTreeVerifyModel ( const struct XFSModel * Model, uint32_t Flags );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+XFS_EXTERN
+rc_t CC
+XFSTreeMake ( const struct XFSModel * Model, struct XFSTree ** Tree );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeDispose ( struct XFSTree * self );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeAddRef ( const struct XFSTree * self );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeRelease ( const struct XFSTree * self );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeFindNode (
+                const struct XFSTree * self,
+                const char * Path,
+                const struct XFSNode ** Node
+                );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeFindNodeForPath (
+                const struct XFSTree * self,
+                const struct VPath * Path,
+                const struct XFSNode ** Node
+                );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))))
+ ((((   Lyrics. That is a place for storeing and retrieving current
+  ))))           version of tree, and it is almost thread safe :lol:
+ ((((*/
+
+XFS_EXTERN
+rc_t CC
+XFSTreeDepotMake ( const struct XFSTreeDepot ** Depot );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeDepotDispose ( const struct XFSTreeDepot * self );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeDepotGet (
+            const struct XFSTreeDepot * self,
+            const struct XFSTree ** Tree
+            );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeDepotSet (
+            const struct XFSTreeDepot * self,
+            const struct XFSTree * Tree
+            );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeDepotVersion (
+                    const struct XFSTreeDepot * self,
+                    char * Buffer,
+                    size_t BufferSize
+                    );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeDepotResource (
+                    const struct XFSTreeDepot * self,
+                    char * Buffer,
+                    size_t BufferSize
+                    );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeDepotFindNode (
+                    const struct XFSTreeDepot * self,
+                    const char * Path,
+                    const struct XFSNode ** Node
+                    );
+
+XFS_EXTERN
+rc_t CC
+XFSTreeDepotFindNodeForPath (
+                    const struct XFSTreeDepot * self,
+                    const struct VPath * Path,
+                    const struct XFSNode ** Node
+                    );
+
+/* Enuff for today */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _xfs_tree_h_ */
diff --git a/interfaces/xfs/xfs-defs.h b/interfaces/xfs/xfs-defs.h
new file mode 100644
index 0000000..0b117b0
--- /dev/null
+++ b/interfaces/xfs/xfs-defs.h
@@ -0,0 +1,125 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_xfs_defs_
+#define _h_xfs_defs_
+
+#include <klib/rc.h>
+
+#ifndef _h_xfs_extern_
+#include <xfs/extern.h>
+#endif /* _h_xfs_extern_ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#define XFS_SIZE_8192       8192
+#define XFS_SIZE_4096       4096
+#define XFS_SIZE_2048       2048
+#define XFS_SIZE_1024       1024
+#define XFS_SIZE_512         512 
+#define XFS_SIZE_128         128 
+#define XFS_SIZE_64           64
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*  Another great masterpiece lol
+ */
+#define XFS_RC(State)   RC(rcFS, rcNoTarg, rcProcessing, rcNoObj, State)
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+    /* Something to do :
+     *      XFS_CA   - XFS Check Arg
+     *      XFS_CAN  - XFS Check Arg Null
+     *      XFS_CSA  - XFS Check Set Arg
+     *      XFS_CSAN - XFS Check Set Arg Null
+     */
+
+#define XFS_CA(Var,Value)    if ( ( Var ) == Value ) { return XFS_RC ( rcInvalid ); }
+
+#define XFS_CAN(Var)         if ( ( Var ) == NULL ) { return XFS_RC ( rcNull ); }
+
+#define XFS_CSA(Var,Value)   if ( ( Var ) != NULL ) { * ( Var ) = Value; }
+
+#define XFS_CSAN(Var)        if ( ( Var ) != NULL ) { * ( Var ) = NULL; }
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*\
+ *  That enum is used for opening files mode only. I'll put it here
+\*/
+typedef enum XFSNMode {
+    kxfsNone  = 00,
+    kxfsRead  = 01,
+    kxfsWrite = 02,
+    kxfsReadWrite = kxfsRead | kxfsWrite
+} XFSNMode;
+
+/*\
+ *  All types of file XFS recognises as good standing
+\*/
+typedef enum XFSNType {
+    kxfsNotFound = 0,
+    kxfsBadPath,
+    kxfsFile,
+    kxfsDir,
+    kxfsLink
+} XFSNType;
+
+/*\
+ *  All authority types recognised by XFS on good will
+\*/
+typedef enum XFSAType {
+    kxfsUser = 0,
+    kxfsGroup,
+    kxfsOther
+} XFSAType;
+
+/*\
+ *  Wery useful enum used for describing state of object
+\*/
+typedef enum XFSStatus {
+    kxfsInvalid = 0,
+    kxfsReady,
+    kxfsComplete,
+    kxfsGood = kxfsComplete,    /* kinda Good and Complete are same */
+    kxfsBroken
+} XFSStatus;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* _h_xfs_defs_ */
diff --git a/interfaces/xfs/xfs.h b/interfaces/xfs/xfs.h
new file mode 100644
index 0000000..8ccb072
--- /dev/null
+++ b/interfaces/xfs/xfs.h
@@ -0,0 +1,165 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_xfs_
+#define _h_xfs_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*  Lyrics - that part should be used in client programs.
+ *  There are no any data handling, just filesystem start and stop.
+ *  Client should create instance of XFSControl structure by calling
+ *  XFSControlMake method. File system will start and mounted by call
+ *  XFSStart method. To stop filesystem, XFSStop method
+ *  should be called, and mount should be destroyed by XFSControlDipsose
+ *  method.
+ *
+ *  The typical scheme of usage is :
+ *
+ *      struct XFSModel * TheModel;
+ *      struct XFSTree * TheTree;
+ *      XFSControl TheControl;
+ *      
+ *      XFSModelMake ( & TheModel );
+ *      XFSTreeMake ( Model, & TheTree );
+ *      XFSControlMake ( TheTree, & TheControl );
+ *          ... here some initialisation action, like arg settings
+ *      XFSControlSetArg ( TheControl, Arg, Value );
+ *      XFSStart ( TheControl, true/false );
+ *          ... here some action
+ *      XFSStop ( TheControl );
+ *      XFSControlDispose ( TheControl );
+ *      XFSPeerDestroyDummy(Peer);
+ */
+
+/*  Struct XFSControl. Apparently need to have XFS arguments, which
+ *  are different on Dokan and Fuse, and may be some handle
+ */
+struct XFSControl;
+struct XFSTree;
+
+/*  Init/Destroy XFSControl structure
+ */
+XFS_EXTERN rc_t CC XFSControlMake(
+                            const struct XFSTree * Tree,
+                            struct XFSControl ** Control
+                            );
+XFS_EXTERN rc_t CC XFSControlDispose( struct XFSControl * self );
+
+/*  Started filesystem, and creating mount point.
+ */
+XFS_EXTERN rc_t CC XFSStart( struct XFSControl * self );
+/*  Unmount and stoping filesystem
+ */
+XFS_EXTERN rc_t CC XFSStop( struct XFSControl * self ); 
+
+/*  Returns current XFSTree structure from control
+ */
+XFS_EXTERN rc_t CC XFSControlGetTree (
+                                    struct XFSControl * self,
+                                    const struct XFSTree ** Tree
+                                    );
+
+/*  Very special platform specific metnod which allows to unmount
+ *  Fuse/Dokan without calling external program
+ */
+XFS_EXTERN rc_t CC XFSUnmountAndDestroy ( const char * MountPoint );
+
+/*  Control argumenting, not sure it will be left in the same way
+    These methods will not take affect after XFSStart
+ */
+XFS_EXTERN rc_t CC XFSControlSetArg (
+                    struct XFSControl * self,
+                    const char * Arg,
+                    const char * Value
+                    );
+XFS_EXTERN const char * CC XFSControlGetArg (
+                    struct XFSControl * self,
+                    const char * Arg
+                    );
+XFS_EXTERN bool CC XFSControlHasArg (
+                    struct XFSControl * self,
+                    const char * Arg
+                    );
+
+XFS_EXTERN rc_t CC XFSControlSetAppName(
+                    struct XFSControl * self,
+                    const char * AppName
+                    );
+XFS_EXTERN const char * CC XFSControlGetAppName(
+                    struct XFSControl * self
+                    );
+
+XFS_EXTERN rc_t CC XFSControlSetMountPoint(
+                    struct XFSControl * self,
+                    const char * MountPoint
+                    );
+XFS_EXTERN const char * CC XFSControlGetMountPoint(
+                    struct XFSControl * self
+                    );
+
+/*  If You will call that method with LogFile = NULL, it will
+    redirect log to some undisclosured standard place.
+ */
+XFS_EXTERN rc_t CC XFSControlSetLogFile (
+                    struct XFSControl * self,
+                    const char * LogFile
+                    );
+XFS_EXTERN const char * CC XFSControlGetLogFile (
+                    struct XFSControl * self
+                    );
+
+/*  By default it always run in foreground, but could be set once
+ *  as a daemon at the begining of application ... and no way back.
+ */
+XFS_EXTERN rc_t CC XFSControlDaemonize (
+                    struct XFSControl * self
+                    );
+XFS_EXTERN bool CC XFSControlIsDaemonize (
+                    struct XFSControl * self
+                    );
+
+/*  That method setup a label which will be shown in /etc/mtab entry
+    You may use NULL, and in that case label will be "XFS"
+ */
+XFS_EXTERN rc_t CC XFSControlSetLabel(
+                    struct XFSControl * self,
+                    const char * Label
+                    );
+XFS_EXTERN const char * CC XFSControlGetLabel(
+                    struct XFSControl * self
+                    );
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* _h_xfs_ */
diff --git a/interfaces/xfs/xlog.h b/interfaces/xfs/xlog.h
new file mode 100644
index 0000000..3930a52
--- /dev/null
+++ b/interfaces/xfs/xlog.h
@@ -0,0 +1,54 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xlog_h_
+#define _xlog_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*) Fowards, and others
+ (*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ |||    Log init/dispose
+(((*/
+
+XFS_EXTERN rc_t CC XFSLogInit ( const char * LogFile );
+XFS_EXTERN rc_t CC XFSLogDestroy ( );
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _xlog_h_ */
diff --git a/libs/Makefile b/libs/Makefile
new file mode 100644
index 0000000..65e06d4
--- /dev/null
+++ b/libs/Makefile
@@ -0,0 +1,89 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+by_default: default
+
+TOP ?= $(abspath ..)
+MODULE = libs
+
+include $(TOP)/build/Makefile.shell
+
+include $(TOP)/build/Makefile.config
+
+#-------------------------------------------------------------------------------
+# default
+#
+SUBDIRS =    \
+	ext      \
+	kfc      \
+	klib     \
+	kproc    \
+	kfs      \
+	kns      \
+	kfg      \
+	krypto   \
+	vfs      \
+	kapp     \
+	kdb      \
+	vdb      \
+	vxf      \
+	search   \
+	sraxf    \
+	align    \
+	axf      \
+	wgsxf    \
+	ktst     \
+	loader   \
+	blast    \
+	ascp     \
+	sra      \
+	ngs      \
+	ngs-c++  \
+	ngs-jni  \
+	ngs-py   \
+	kxml     \
+	hdf5     \
+	ncbi-vdb \
+	tui
+
+# common targets for non-leaf Makefiles; must follow a definition of SUBDIRS
+include $(TOP)/build/Makefile.targets
+
+$(SUBDIRS):
+	@ $(MAKE) -C $@
+	
+ncbi-vdb: $(patsubst ncbi-vdb,,$(SUBDIRS))	
+
+test:
+	@true
+    
+.PHONY: default $(SUBDIRS) test
+
+#-------------------------------------------------------------------------------
+# pass-through
+#
+out debug profile release GCC ICC VC++:
+	@ $(MAKE) TOP=$(TOP) -f $(TOP)/build/Makefile.env $@
+
+.PHONY: out debug profile release GCC ICC VC++
diff --git a/libs/align/.gitignore b/libs/align/.gitignore
new file mode 100644
index 0000000..c253038
--- /dev/null
+++ b/libs/align/.gitignore
@@ -0,0 +1 @@
+*.def
diff --git a/libs/align/Makefile b/libs/align/Makefile
new file mode 100644
index 0000000..8351953
--- /dev/null
+++ b/libs/align/Makefile
@@ -0,0 +1,163 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/align
+
+INT_LIBS = \
+	libncbi-bam \
+	libalign-writer \
+	libalign-access \
+	libalign-reader
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES =              \
+	$(BAM_OBJ)          \
+	$(ALIGN_ACCESS_OBJ) \
+	$(ALIGN_READER_OBJ) \
+	$(ALIGN_WRITER_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# libncbi-bam
+#
+$(ILIBDIR)/libncbi-bam: $(addprefix $(ILIBDIR)/libncbi-bam.,$(ILIBEXT))
+
+BAM_SRC = \
+	bam
+
+BAM_OBJ = \
+	$(addsuffix .$(LOBX),$(BAM_SRC))
+
+BAM_LIB = 
+
+$(ILIBDIR)/libncbi-bam.$(LIBX): $(BAM_OBJ)
+	$(LD) --slib -o $@ $^ $(BAM_LIB)
+
+
+#-------------------------------------------------------------------------------
+# align-access
+#
+$(ILIBDIR)/libalign-access: $(addprefix $(ILIBDIR)/libalign-access.,$(ILIBEXT))
+
+ALIGN_ACCESS_SRC = \
+	align-access
+
+ALIGN_ACCESS_OBJ = \
+	$(addsuffix .$(LOBX),$(ALIGN_ACCESS_SRC))
+
+ALIGN_ACCESS_LIB = 
+
+$(ILIBDIR)/libalign-access.$(LIBX): $(ALIGN_ACCESS_OBJ)
+	$(LD) --slib -o $@ $^ $(ALIGN_ACCESS_LIB)
+
+#-------------------------------------------------------------------------------
+# align-reader
+#
+$(ILIBDIR)/libalign-reader: $(addprefix $(ILIBDIR)/libalign-reader.,$(ILIBEXT))
+
+ALIGN_READER_SRC = \
+	align_mgr \
+	al_iterator \
+	ref_iterator \
+	pl_iterator \
+	dna-reverse-cmpl \
+	reference-cmn \
+	reader-cmn \
+	reader-refseq \
+	reader-wgs \
+	reference \
+	refseq-mgr \
+	quality-quantizer
+
+ALIGN_READER_OBJ = \
+	$(addsuffix .$(LOBX),$(ALIGN_READER_SRC))
+
+ALIGN_READER_LIB = 
+
+$(ILIBDIR)/libalign-reader.$(LIBX): $(ALIGN_READER_OBJ)
+	$(LD) --slib -o $@ $^ $(ALIGN_READER_LIB)
+
+#-------------------------------------------------------------------------------
+# align-writer
+#
+$(ILIBDIR)/libalign-writer: $(addprefix $(ILIBDIR)/libalign-writer.,$(LIBX))
+
+ALIGN_WRITER_SRC = \
+    dna-reverse-cmpl \
+	reader-cmn \
+	reference-cmn \
+	reader-refseq \
+	reader-wgs \
+	refseq-mgr \
+	writer-cmn \
+	writer-refseq \
+	writer-alignment \
+	writer-sequence \
+	writer-ref \
+	writer-reference
+
+ALIGN_WRITER_OBJ = \
+	$(addsuffix .$(LOBX),$(ALIGN_WRITER_SRC))
+
+ALIGN_WRITER_LIB = 
+
+$(ILIBDIR)/libalign-writer.$(LIBX): $(ALIGN_WRITER_OBJ)
+	$(LD) --slib -o $@ $^ $(ALIGN_WRITER_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/align/al_iterator.c b/libs/align/al_iterator.c
new file mode 100644
index 0000000..caefd7d
--- /dev/null
+++ b/libs/align/al_iterator.c
@@ -0,0 +1,565 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/sort.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <insdc/insdc.h>
+#include <align/iterator.h>
+#include <align/manager.h>
+#include <vdb/cursor.h>
+#include <sysalloc.h>
+
+#include "debug.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#define COL_READ "READ"
+#define COL_HAS_MISMATCH "HAS_MISMATCH"
+#define COL_HAS_REF_OFFSET "HAS_REF_OFFSET"
+#define COL_REF_OFFSET "REF_OFFSET"
+
+typedef struct pos_offset
+{
+    uint32_t pos;
+    int32_t offset;
+} pos_offset;
+
+
+struct AlignmentIterator
+{
+    struct AlignMgr const *amgr;   /* the alignment-manager... */
+
+    /* data to walk */
+    bool * has_mismatch;    /* copy of HAS_MISMATCH */
+    INSDC_4na_bin * read;   /* copy of READ */
+    uint32_t read_len;      /* length of READ */
+    uint32_t ref_len;       /* length of projection on reference */
+
+    INSDC_coord_zero ref_window_start;  /* where the requested window on the reference starts */
+    INSDC_coord_len  ref_window_len;    /* how long the requested window on the reference is */
+
+    pos_offset * pos_ofs;   /* computed by walking HAS_REF_OFFSET, REF_OFFSET ( method 1 ) */
+    uint32_t pos_ofs_idx;   /* current index into pos_ofs[] */
+    uint32_t pos_ofs_cnt;   /* how many pos_ofs-values are there */
+
+    int32_t abs_ref_start;  /* absolute reference-related start-position   */
+    int32_t rel_ref_pos;    /* relative reference-related position ( relative to start of sequence )  */
+    uint32_t seq_pos;       /* position on the sequence, as the reference sees it */
+    uint32_t skip;          /* how many bases to skip if we are in DELETE */
+    uint32_t flags;         /* flags it, when we are in INSERT/DELETE */
+    uint32_t inserts;       /* how many inserts */
+
+    KRefcount refcount;
+    bool free_on_whack;     /* true if allocated and allowing references */
+    uint8_t align [ 3 ];
+};
+
+
+/* forward decl. for private helper functions */
+static rc_t compute_posofs(  AlignmentIterator * self,
+    const bool * has_ref_offset,
+    const int32_t * ref_offset,
+    uint32_t ref_offset_len );
+
+static void al_iter_adjust_next( AlignmentIterator * self );
+
+LIB_EXPORT void CC AlignIteratorRecordDestroy ( void *obj, void *data )
+{
+    /* nothing to do, because there are no sub-allocations etc. ... */
+}
+
+
+static rc_t get_idx_and_read( struct VCursor const *curs,
+                              const char * name,
+                              int64_t row_id,
+                              const void ** base,
+                              uint32_t * len )
+{
+    uint32_t column_idx;
+    rc_t rc = VCursorGetColumnIdx ( curs, &column_idx, "%s", name );
+    if ( rc != 0 )
+        LOGERR( klogInt, rc, "VCursorGetColumnIdx() failed" );
+    else
+    {
+        uint32_t elem_bits, boff, len_intern;
+        const void * ptr;
+        rc = VCursorCellDataDirect ( curs, row_id, column_idx, 
+                                     &elem_bits, &ptr, &boff, &len_intern );
+        if ( rc != 0 )
+            LOGERR( klogInt, rc, "VCursorCellDataDirect() failed" );
+        else
+        {
+            assert( boff == 0 );
+            if ( len != NULL ) *len = len_intern;
+            if ( base != NULL ) *base = ptr;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC AlignIteratorRecordPopulate ( void *obj,
+    const PlacementRecord *placement, struct VCursor const *curs, 
+    INSDC_coord_zero ref_window_start, INSDC_coord_len ref_window_len, void *data )
+{
+    /* read the data required to build a Alignment-Iterator,
+       then create the Alignment-Iterator into the already allocated memory */
+    const void * base;
+    const void * base_has_ref_offset;
+    const void * base_ref_offset;
+
+    INSDC_coord_len data_len;
+    uint32_t ref_offset_len;
+    rc_t rc;
+
+    AlignmentIterator *iter = ( AlignmentIterator * ) obj;
+    AlignMgr *almgr = ( AlignMgr * ) data;
+
+    uint8_t * ptr = ( void* ) iter;
+    ptr += ( sizeof *iter );
+
+    rc = get_idx_and_read( curs, COL_HAS_MISMATCH, placement->id, &base, &data_len );
+    if ( rc == 0 )
+    {
+        /* copy HAS_MISMATCH into place, point the header-value to it, advance */
+        memmove( ptr, base, data_len );
+        iter->has_mismatch = (bool *)ptr;
+        ptr += data_len;
+    }
+
+    if ( rc == 0 )
+    {
+        rc = get_idx_and_read( curs, COL_READ, placement->id, &base, &data_len );
+        /* copy READ into place, point the header-value to it, advance */
+        if ( rc == 0 )
+        {
+            memmove( ptr, base, data_len );
+            iter->read = ( INSDC_4na_bin * )ptr;
+            iter->read_len = data_len;
+            iter->abs_ref_start = placement->pos;
+            iter->ref_len = placement->len;
+            iter->rel_ref_pos = 0;
+            iter->seq_pos = 0;
+            ptr += data_len;
+            iter->pos_ofs = (pos_offset *)ptr;
+            iter->ref_window_start = ref_window_start;
+            iter->ref_window_len = ref_window_len;
+            iter->free_on_whack = false;
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        rc = get_idx_and_read( curs, COL_HAS_REF_OFFSET, placement->id, &base_has_ref_offset, &data_len );
+    }
+    if ( rc == 0 )
+    {
+        rc = get_idx_and_read( curs, COL_REF_OFFSET, placement->id, &base_ref_offset, &ref_offset_len );
+    }
+    if ( rc == 0 )
+    {
+        rc = compute_posofs( iter,
+                             ( const bool * )base_has_ref_offset, 
+                             ( const int32_t * )base_ref_offset, 
+                             ref_offset_len );
+    }
+    if ( rc == 0 )
+    {
+        if ( iter->pos_ofs_idx == 0 )
+            al_iter_adjust_next( iter );
+        KRefcountInit( &iter->refcount, 1, "AlignmentIterator", "Make", "align" );
+        data_len = 0;
+        while( ( iter->abs_ref_start + iter->rel_ref_pos ) < ref_window_start && rc == 0 )
+        {
+            rc = AlignmentIteratorNext ( iter );
+            data_len++;
+        }
+    }
+    if ( rc == 0 )  {   rc = AlignMgrAddRef ( almgr );  }
+    if ( rc == 0 )  {   iter->amgr = almgr;  }
+
+/*
+    if ( rc == 0 )
+    {
+        OUTMSG(( "placement[%lu] at %u (w=%u) next(%u) \n", 
+                 placement->id, iter->abs_ref_start, ref_window_start, data_len ));
+    }
+*/
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC AlignIteratorRecordSize ( struct VCursor const *curs, int64_t row_id, size_t *size, void *data )
+{
+    uint32_t ref_offset_len, read_len;
+
+    rc_t rc = get_idx_and_read( curs, COL_REF_OFFSET, row_id, NULL, &ref_offset_len );
+    if ( rc == 0 )
+        rc = get_idx_and_read( curs, COL_READ, row_id, NULL, &read_len );
+
+    if ( rc == 0 )
+    {
+        AlignmentIterator * ali = NULL;
+        size_t po_size = ( ( sizeof *(ali->pos_ofs) ) * ( ref_offset_len ) );
+        *size = ( ( sizeof *ali ) + ( read_len * 2 ) + po_size );
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC AlignMgrMakeAlignmentIterator ( struct AlignMgr const *self,
+    AlignmentIterator **iter,
+    bool copy,
+    INSDC_coord_zero ref_pos,
+    INSDC_coord_len ref_len,
+    const INSDC_4na_bin *read,
+    INSDC_coord_len read_len,
+    const bool *has_mismatch,
+    const bool *has_ref_offset,
+    const int32_t *ref_offset,
+    uint32_t ref_offset_len,
+    INSDC_coord_zero ref_window_start,
+    INSDC_coord_len ref_window_len )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        if ( iter == NULL || has_mismatch == NULL || has_ref_offset == NULL ||
+             read == NULL || read_len == 0 )
+            rc = RC( rcAlign, rcIterator, rcConstructing, rcParam, rcNull );
+        else
+        {
+            AlignmentIterator * ali = NULL;
+            size_t po_size = ( ( sizeof *(ali->pos_ofs) ) * ( ref_offset_len ) );
+            size_t full_size = ( sizeof *ali ) + ( read_len * 2 ) + po_size;
+      
+            uint8_t * ptr = calloc( full_size, 1 );
+            *iter = NULL;
+            if ( ptr == NULL )
+                rc = RC( rcAlign, rcIterator, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                ali = ( AlignmentIterator * )ptr;
+                ptr += ( sizeof *ali );
+
+                KRefcountInit( &ali->refcount, 1, "AlignmentIterator", "Make", "align" );
+
+                /* copy HAS_MISMATCH into place, point the header-value to it, advance */
+                memmove( ptr, has_mismatch, read_len );
+                ali->has_mismatch = (bool *)ptr;
+                ptr += read_len;
+
+                /* copy READ into place, point the header-value to it, advance */
+                memmove( ptr, read, read_len );
+                ali->read = ( INSDC_4na_bin * )ptr;
+                ptr += read_len;
+
+                ali->read_len = read_len;
+                ali->ref_len = ref_len;
+                ali->abs_ref_start = ref_pos;
+                ali->pos_ofs = (pos_offset *)ptr;
+                ali->ref_window_start = ref_window_start;
+                ali->ref_window_len = ref_window_len;
+                ali->free_on_whack = true;
+
+                rc = compute_posofs( ali, has_ref_offset, ref_offset, ref_offset_len );
+                if ( ali->pos_ofs_idx == 0 )
+                    al_iter_adjust_next( ali );
+
+                if ( rc == 0 )
+                {
+                    rc = AlignMgrAddRef ( self );
+                    if ( rc == 0 )
+                        ali->amgr = self;
+                }
+            }
+
+            if ( rc == 0 )
+                *iter = ali;
+            else
+                free( ali );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC AlignmentIteratorAddRef( const AlignmentIterator * cself )
+{
+    rc_t rc = 0;
+    if ( cself == NULL )
+        rc = RC( rcAlign, rcIterator, rcAttaching, rcSelf, rcNull );
+    else
+    {
+        if ( KRefcountAdd( &cself->refcount, "AlignmentIterator" ) != krefOkay )
+        {
+            rc = RC( rcAlign, rcIterator, rcAttaching, rcError, rcUnexpected );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC AlignmentIteratorRelease( const AlignmentIterator * cself )
+{
+    rc_t rc = 0;
+    if ( cself == NULL )
+        rc = RC( rcAlign, rcIterator, rcReleasing, rcSelf, rcNull );
+    else
+    {
+        if ( KRefcountDrop( &cself->refcount, "AlignmentIterator" ) == krefWhack )
+        {
+            AlignmentIterator * self = ( AlignmentIterator * ) cself;
+            AlignMgrRelease ( self->amgr );
+            if ( self->free_on_whack )
+                free( self );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC AlignmentIteratorNext ( AlignmentIterator *self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcPositioning, rcSelf, rcNull );
+    else
+    {
+        self->flags = 0;
+        self->rel_ref_pos++;
+
+        if ( self->rel_ref_pos >= self->ref_len )
+            rc = SILENT_RC( rcAlign, rcIterator, rcPositioning, rcItem, rcDone );
+        else
+        {
+            if ( self->skip > 0 )
+            {
+                self->flags |=  align_iter_skip;
+                self->skip--;
+            }
+            else if ( self->inserts > 0 )
+            {
+                self->seq_pos += ( self->inserts + 1 );
+                self->inserts = 0;
+            }
+            else
+            {
+                self->seq_pos++;
+            }
+            al_iter_adjust_next( self );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT int32_t CC AlignmentIteratorState ( const AlignmentIterator *self,
+                                               INSDC_coord_zero *seq_pos )
+{
+    uint32_t res = align_iter_invalid;
+    if ( self != NULL )
+    {
+        INSDC_coord_zero pos = self->seq_pos;
+        if ( pos < self->read_len )
+        {
+            res = ( self->read[ pos ] & 0x0F );
+
+            if ( self->rel_ref_pos < 1 )
+                res |= align_iter_first;
+
+            if ( self->rel_ref_pos == ( self->ref_len - 1 ) )
+                res |= align_iter_last;
+
+            if ( !self->has_mismatch[ pos ] )
+                res |= align_iter_match;
+
+            res |= self->flags;
+
+            if ( seq_pos != NULL )
+                *seq_pos = pos;
+        }
+    }
+    return res;
+}
+
+
+LIB_EXPORT rc_t CC AlignmentIteratorPosition ( const AlignmentIterator *self,
+                                               INSDC_coord_zero *pos )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcPositioning, rcSelf, rcNull );
+    else
+    {
+        if ( pos == NULL )
+            rc = RC( rcAlign, rcIterator, rcPositioning, rcParam, rcNull );
+        else
+        {
+            *pos = ( self->abs_ref_start + self->rel_ref_pos );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT uint32_t CC AlignmentIteratorBasesInserted
+    ( const AlignmentIterator *self, const INSDC_4na_bin **bases )
+{
+    uint32_t res = 0;
+    if ( ( self != NULL )&&( bases != NULL ) )
+    {
+        res = self->inserts;
+        *bases = &( self->read[ self->seq_pos + 1 ] );
+    }
+    return res;
+}
+
+
+LIB_EXPORT uint32_t CC AlignmentIteratorBasesDeleted
+    ( const AlignmentIterator *self, INSDC_coord_zero *pos )
+{
+    uint32_t res = 0;
+    if ( ( self != NULL )&&( pos != NULL ) )
+    {
+        res = ( self->skip );
+        *pos = ( self->abs_ref_start + self->rel_ref_pos + 1 ); 
+    }
+    return res;
+}
+
+
+/* ============ private static functions ============ */
+static rc_t compute_posofs(  AlignmentIterator * self,
+    const bool * has_ref_offset, const int32_t * ref_offset, uint32_t ref_offset_len )
+{
+    rc_t rc = 0;
+
+    self->pos_ofs_idx = 0;
+    self->pos_ofs_cnt = ref_offset_len;
+    if ( ref_offset_len > 0 )
+    {
+        int32_t shift = 0;
+        uint32_t seq_position;
+        uint32_t src = 0;
+        uint32_t dst = 0;
+
+        if ( has_ref_offset[ 0 ] && ( ref_offset[ 0 ] < 0 ) )
+        {
+            shift = ref_offset[ src++ ];
+            self->seq_pos = -( shift );
+            self->pos_ofs_cnt--;
+        }
+
+        seq_position = self->seq_pos;
+        while( seq_position < self->read_len && rc == 0 )
+        {
+            if ( has_ref_offset[ seq_position ] )
+            {
+                /* we do have to process a reference-offset ! */
+                if ( src < ref_offset_len )
+                {
+                    /* we do have a ref-offset value available... */
+                    int32_t ro = ref_offset[ src++ ];
+                    if ( ro == 0 )
+                    {
+                        /* zero-values in REF_OFFSET are an error ! */
+                        rc = RC( rcAlign, rcIterator, rcConstructing, rcItem, rcNull );
+                    }
+                    else
+                    {
+                        /* ref-offset is positive: DELETE against the reference */
+                        self->pos_ofs[ dst ].pos = ( seq_position + shift - 1 );
+                        self->pos_ofs[ dst++ ].offset = ro;
+                        shift += ro;
+
+                        /* !!! CHANGE on May 04 2012 !!!
+                           the unused bits in has_ref_offset after an insert ( negative ro )
+                           are used now to hint the position of a "B"-cigar-string-case
+                           for cSRA-files created Complete-Genomic-Submissions
+                           that means we have to jump forward with seq_position in this case!
+                        */
+                        if ( ro < 0 )
+                        {
+							/* Jan 15 2015 */
+							/* fix the increment in case of 2 subsequent inserts ( which should be merged, but are not ) */
+							
+                            seq_position -= ( ro + 1 );
+                        }
+                    }
+                }
+                else
+                {
+                    /* if has_ref_offset has more flags than ref_offset has values... */
+                    rc = RC( rcAlign, rcIterator, rcConstructing, rcItem, rcTooBig );
+                }
+            }
+            ++seq_position;
+        }
+
+/*      OUTMSG(( "pos_ofs:" ));
+        for ( src = 0; src < self->pos_ofs_cnt; ++src )
+        {
+            OUTMSG(( "[%u/%u]", self->pos_ofs[ src ].pos, self->pos_ofs[ src ].offset ));
+        }
+        OUTMSG(( "\n" )); */
+    }
+    return rc;
+}
+
+
+static void al_iter_adjust_next( AlignmentIterator * self )
+{
+    if ( self->pos_ofs_idx < self->pos_ofs_cnt )
+    {
+        if ( self->rel_ref_pos == self->pos_ofs[ self->pos_ofs_idx ].pos )
+        {
+            /* we have to adjust... */
+            int32_t ro = self->pos_ofs[ self->pos_ofs_idx++ ].offset;
+            if ( ro < 0 )
+            {
+                self->flags |= align_iter_insert;
+                self->inserts = (-ro);
+            }
+            else
+            {
+                self->flags |= align_iter_delete;
+                self->skip = ro;
+            }
+        }
+    }
+}
diff --git a/libs/align/align-access.c b/libs/align/align-access.c
new file mode 100644
index 0000000..350d007
--- /dev/null
+++ b/libs/align/align-access.c
@@ -0,0 +1,812 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <align/extern.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <align/align-access.h>
+#include <atomic32.h>
+
+#include <vfs/path.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "bam-priv.h"
+
+struct AlignAccessMgr
+{
+    atomic32_t refcount;
+};
+
+LIB_EXPORT rc_t CC AlignAccessMgrMake(const AlignAccessMgr **mgr) {
+    AlignAccessMgr *self = malloc(sizeof(*self));
+
+    *mgr = self;
+    if (self != NULL) {
+        atomic32_set(&self->refcount, 1);
+        return 0;
+    }
+    return RC(rcAlign, rcMgr, rcConstructing, rcMemory, rcExhausted);
+}
+
+LIB_EXPORT rc_t CC AlignAccessMgrAddRef( const AlignAccessMgr *self ) {
+    if (self != NULL)
+        atomic32_inc(&((AlignAccessMgr *)self)->refcount);
+    return 0;
+}
+
+static
+rc_t CC AlignAccessMgrWhack(AlignAccessMgr *self) {
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessMgrRelease(const AlignAccessMgr *cself) {
+    rc_t rc = 0;
+    AlignAccessMgr *self = (AlignAccessMgr *)cself;
+    
+    if (cself != NULL) {
+        if (atomic32_dec_and_test(&self->refcount)) {
+            rc = AlignAccessMgrWhack(self);
+            if (rc)
+                atomic32_set(&self->refcount, 1);
+            else
+                free(self);
+        }
+    }
+    return rc;
+}
+
+struct AlignAccessDB {
+    atomic32_t refcount;
+    const AlignAccessMgr *mgr;
+    const BAMFile *innerSelf;
+};
+
+LIB_EXPORT rc_t CC AlignAccessMgrMakeBAMDB(const AlignAccessMgr *self, const AlignAccessDB **db, const VPath *bam) {
+    AlignAccessDB *lhs = malloc(sizeof(*lhs));
+    rc_t rc;
+
+    if (lhs == NULL)
+        return RC(rcAlign, rcMgr, rcConstructing, rcMemory, rcExhausted);
+    
+    rc = BAMFileMakeWithVPath(&lhs->innerSelf, bam);
+    if (rc) {
+        free(lhs);
+        return rc;
+    }
+    lhs->mgr = self;
+    AlignAccessMgrAddRef(lhs->mgr);
+    atomic32_set(&lhs->refcount, 1);
+    
+    *db = lhs;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessMgrMakeIndexBAMDB(const AlignAccessMgr *self, const AlignAccessDB **db, const VPath *bam, const VPath *bam_index) {
+    rc_t rc = AlignAccessMgrMakeBAMDB(self, db, bam);
+    if (rc == 0) {
+        rc = BAMFileOpenIndexWithVPath((**db).innerSelf, bam_index);
+        if (rc == 0)
+            return 0;
+        AlignAccessDBRelease(*db);
+        *db = NULL;
+    }
+    return rc;
+}
+
+
+/* ExportBAMFile
+ *  export the BAMFile object in use by the AlignAccessDB, if any
+ *  must be released via BAMFileRelease
+ */
+LIB_EXPORT rc_t CC AlignAccessDBExportBAMFile ( const AlignAccessDB *self, const BAMFile **result )
+{
+    rc_t rc;
+
+    if ( result == NULL )
+        rc = RC ( rcAlign, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcAlign, rcTable, rcAccessing, rcSelf, rcNull );
+        else if ( self -> innerSelf == NULL )
+            rc = RC ( rcAlign, rcTable, rcAccessing, rcType, rcIncorrect );
+        else
+        {
+            rc = BAMFileAddRef ( * result = self -> innerSelf );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        * result = NULL;
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC AlignAccessDBAddRef(const AlignAccessDB *cself) {
+    if (cself != NULL)
+        atomic32_inc(&((AlignAccessDB *)cself)->refcount);
+    return 0;
+}
+
+static rc_t CC AlignAccessDBWhack(AlignAccessDB *self) {
+    rc_t rc;
+    
+    rc = BAMFileRelease(self->innerSelf);
+    if (rc)
+        return rc;
+    return AlignAccessMgrRelease(self->mgr);
+}
+
+LIB_EXPORT rc_t CC AlignAccessDBRelease(const AlignAccessDB *cself) {
+    rc_t rc = 0;
+    AlignAccessDB *self = (AlignAccessDB *)cself;
+    
+    if (cself != NULL) {
+        if (atomic32_dec_and_test(&self->refcount)) {
+            rc = AlignAccessDBWhack(self);
+            if (rc)
+                atomic32_set(&self->refcount, 1);
+            else
+                free(self);
+        }
+    }
+    return rc;
+}
+
+struct AlignAccessRefSeqEnumerator {
+    atomic32_t refcount;
+    const AlignAccessDB *parent;
+    int cur, end;
+};
+
+LIB_EXPORT rc_t CC AlignAccessDBEnumerateRefSequences(const AlignAccessDB *self, AlignAccessRefSeqEnumerator **refseq_enum) {
+    AlignAccessRefSeqEnumerator *lhs;
+    unsigned cur = 0;
+    unsigned end;
+    
+    BAMFileGetRefSeqCount(self->innerSelf, &end);
+    if (BAMFileIsIndexed(self->innerSelf)) {
+        while (cur != end && BAMFileIndexHasRefSeqId(self->innerSelf, cur) == 0)
+            ++cur;
+        if (cur == end)
+            return AlignAccessRefSeqEnumeratorEOFCode;
+    }
+    lhs = malloc(sizeof(*lhs));
+    *refseq_enum = lhs;
+    if (lhs != NULL) {
+        lhs->parent = self;
+        AlignAccessDBAddRef(lhs->parent);
+        lhs->cur = cur;
+        lhs->end = end;
+        atomic32_set(&lhs->refcount, 1);
+        return 0;
+    }
+    return RC(rcAlign, rcDatabase, rcConstructing, rcMemory, rcExhausted);
+}
+
+LIB_EXPORT rc_t CC AlignAccessRefSeqEnumeratorAddRef(const AlignAccessRefSeqEnumerator *self) {
+    if (self != NULL)
+        atomic32_inc(&((AlignAccessRefSeqEnumerator *)self)->refcount);
+    return 0;
+}
+
+static
+rc_t CC AlignAccessRefSeqEnumeratorWhack(AlignAccessRefSeqEnumerator *self) {
+    return AlignAccessDBRelease(self->parent);
+}
+
+LIB_EXPORT rc_t CC AlignAccessRefSeqEnumeratorRelease(const AlignAccessRefSeqEnumerator *cself) {
+    rc_t rc = 0;
+    AlignAccessRefSeqEnumerator *self = (AlignAccessRefSeqEnumerator *)cself;
+    
+    if (cself != NULL) {
+        if (atomic32_dec_and_test(&self->refcount)) {
+            rc = AlignAccessRefSeqEnumeratorWhack(self);
+            if (rc)
+                atomic32_set(&self->refcount, 1);
+            else
+                free(self);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC AlignAccessRefSeqEnumeratorGetID(const AlignAccessRefSeqEnumerator *cself, char *id_buffer, size_t buffer_size, size_t *id_size) {
+    rc_t rc = 0;
+    const BAMRefSeq *cur;
+    size_t id_act_size;
+    
+    if (cself == NULL)
+        return 0;
+    if (id_buffer == NULL && id_size == NULL)
+        return RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+    rc = BAMFileGetRefSeq(cself->parent->innerSelf, cself->cur, &cur);
+    if (rc)
+        return rc;
+    id_act_size = string_size( cur->name ) + 1;
+    if (id_size != NULL)
+        *id_size = id_act_size;
+    if (id_buffer != NULL) {
+        if (buffer_size >= id_act_size)
+            memmove(id_buffer, cur->name, id_act_size);
+        else
+            rc = RC(rcAlign, rcTable, rcAccessing, rcBuffer, rcInsufficient);
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC AlignAccessRefSeqEnumeratorGetLength ( const AlignAccessRefSeqEnumerator *cself,
+                                           uint64_t *length )
+{
+    rc_t rc = 0;
+    const BAMRefSeq *cur;
+    
+    if (cself == NULL)
+        return 0;
+    if (length == NULL)
+        return RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+    rc = BAMFileGetRefSeq(cself->parent->innerSelf, cself->cur, &cur);
+    if (rc)
+        return rc;
+    *length = cur->length;
+    
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessRefSeqEnumeratorNext(const AlignAccessRefSeqEnumerator *cself) {
+    AlignAccessRefSeqEnumerator *self = (AlignAccessRefSeqEnumerator *)cself;
+    
+    if (cself->cur + 1 >= cself->end)
+        return AlignAccessRefSeqEnumeratorEOFCode;
+    
+    ++self->cur;
+    if (!BAMFileIsIndexed(cself->parent->innerSelf))
+    	return 0;
+	if (BAMFileIndexHasRefSeqId(cself->parent->innerSelf, cself->cur))
+		return 0;
+	return AlignAccessRefSeqEnumeratorNext(cself);
+}
+
+struct AlignAccessAlignmentEnumerator {
+    const AlignAccessDB *parent;
+    const BAMAlignment *innerSelf;
+    uint64_t endpos;
+    uint64_t startpos;
+    BAMFilePosition pos;
+    atomic32_t refcount;
+    int atend;
+    int refSeqID;
+};
+
+static rc_t CC AlignAccessDBMakeEnumerator(const AlignAccessDB *self, AlignAccessAlignmentEnumerator **align_enum) {
+    AlignAccessAlignmentEnumerator *lhs = malloc(sizeof(*lhs));
+    
+    *align_enum = lhs;
+    if (lhs == NULL)
+        return RC(rcAlign, rcTable, rcConstructing, rcMemory, rcExhausted);
+    
+    lhs->innerSelf = NULL;
+    lhs->parent = self;
+    AlignAccessDBAddRef(lhs->parent);
+    atomic32_set(&lhs->refcount, 1);
+    lhs->atend = 0;
+    lhs->refSeqID = -1;
+    lhs->endpos = 0;
+    lhs->startpos = 0;
+    
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessDBEnumerateAlignments(const AlignAccessDB *self, AlignAccessAlignmentEnumerator **align_enum) {
+    rc_t rc;
+    
+    *align_enum = NULL;
+
+    rc = BAMFileRewind(self->innerSelf);
+    if (rc)
+        return rc;
+    rc = AlignAccessDBMakeEnumerator(self, align_enum);
+    if (rc)
+        return rc;
+    return AlignAccessAlignmentEnumeratorNext(*align_enum);
+}
+
+LIB_EXPORT rc_t CC AlignAccessDBWindowedAlignments(
+                                     const AlignAccessDB *self,
+                                     AlignAccessAlignmentEnumerator **align_enum,
+                                     const char *refSeqName, uint64_t pos, uint64_t wsize
+) {
+    AlignAccessAlignmentEnumerator *lhs;
+    unsigned i, n;
+    const BAMRefSeq *rs;
+    uint64_t endpos = pos + wsize;
+    rc_t rc;
+    
+    *align_enum = NULL;
+
+    BAMFileGetRefSeqCount(self->innerSelf, &n);
+    for (i = 0; i != n; ++i) {
+        BAMFileGetRefSeq(self->innerSelf, i, &rs);
+        if (strcmp(refSeqName, rs->name) == 0)
+            break;
+    }
+    if (i == n || pos >= rs->length) {
+        return RC(rcAlign, rcTable, rcConstructing, rcParam, rcInvalid);
+    }
+
+    if (wsize == 0 || endpos > rs->length)
+        endpos = rs->length;
+
+    rc = BAMFileSeek(self->innerSelf, i, pos, endpos);
+    if ( rc != 0 )
+    {
+        if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == (enum RCObject)rcData )
+            rc = AlignAccessAlignmentEnumeratorEOFCode;
+        return rc;
+    }
+    rc = AlignAccessDBMakeEnumerator(self, &lhs);
+    if (rc)
+        return rc;
+
+    lhs->refSeqID = i;
+    lhs->endpos = endpos;
+    lhs->startpos = pos;
+
+    *align_enum = lhs;
+    return AlignAccessAlignmentEnumeratorNext(*align_enum);
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorNext(const AlignAccessAlignmentEnumerator *cself) {
+    rc_t rc;
+    AlignAccessAlignmentEnumerator *self = (AlignAccessAlignmentEnumerator *)cself;
+    int32_t refSeqID;
+
+AGAIN:
+    if (self->innerSelf != NULL) {
+        BAMAlignmentRelease(self->innerSelf);
+        self->innerSelf = NULL;
+    }
+    if (self->atend != 0)
+        return AlignAccessAlignmentEnumeratorEOFCode;
+    
+    BAMFileGetPosition(self->parent->innerSelf, &self->pos);
+    rc = BAMFileRead2(self->parent->innerSelf, &self->innerSelf);
+    if (rc) {
+        if (GetRCState(rc) == rcNotFound && GetRCObject(rc) == rcRow) {
+            self->atend = 1;
+            rc = AlignAccessAlignmentEnumeratorEOFCode;
+        }
+        return rc;
+    }
+    if (self->refSeqID == -1)
+        return 0;
+    
+    BAMAlignmentGetRefSeqId(self->innerSelf, &refSeqID);
+    if (self->refSeqID != refSeqID) {
+        self->atend = 1;
+        rc = AlignAccessAlignmentEnumeratorEOFCode;
+    }
+    else if (self->endpos != 0) {
+        int64_t pos;
+        uint32_t length;
+        uint64_t endpos;
+        
+        BAMAlignmentGetPosition2(self->innerSelf, &pos, &length);
+        if (pos < 0 || pos >= (int64_t)self->endpos) {
+            self->atend = 1;
+            rc = AlignAccessAlignmentEnumeratorEOFCode;
+        }
+        else {
+            endpos = (uint64_t)pos + length;
+            if (endpos <= self->startpos)
+                goto AGAIN;
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorAddRef ( const AlignAccessAlignmentEnumerator *self ) {
+    if (self != NULL)
+        atomic32_inc(&((AlignAccessAlignmentEnumerator *)self)->refcount);
+    return 0;
+}
+
+static
+rc_t CC AlignAccessAlignmentEnumeratorWhack(AlignAccessAlignmentEnumerator *self) {
+    if (self->innerSelf)
+        BAMAlignmentRelease(self->innerSelf);
+    AlignAccessDBRelease(self->parent);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorRelease ( const AlignAccessAlignmentEnumerator *cself ) {
+    rc_t rc = 0;
+    AlignAccessAlignmentEnumerator *self = (AlignAccessAlignmentEnumerator *)cself;
+    
+    if (cself != NULL) {
+        if (atomic32_dec_and_test(&self->refcount)) {
+            rc = AlignAccessAlignmentEnumeratorWhack(self);
+            if (rc)
+                atomic32_set(&self->refcount, 1);
+            else
+                free(self);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetRefSeqID(
+                                               const AlignAccessAlignmentEnumerator *self,
+                                               char *id_buffer, size_t buffer_size, size_t *id_size
+) {
+    rc_t rc = 0;
+    int32_t id;
+    const BAMRefSeq *cur;
+    size_t id_act_size;
+    
+    if (self == NULL)
+        return 0;
+    if (id_buffer == NULL && id_size == NULL)
+        return RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+    rc = BAMAlignmentGetRefSeqId(self->innerSelf, &id);
+    if (rc)
+        return rc;
+    if (id < 0)
+        return RC(rcAlign, rcTable, rcAccessing, rcData, rcNotFound);
+    rc = BAMFileGetRefSeq(self->parent->innerSelf, id, &cur);
+    if (rc)
+        return rc;
+    id_act_size = string_size( cur->name ) + 1;
+    if (id_size != NULL)
+        *id_size = id_act_size;
+    if (id_buffer != NULL) {
+        if (buffer_size >= id_act_size)
+            memmove(id_buffer, cur->name, id_act_size);
+        else
+            rc = RC(rcAlign, rcTable, rcAccessing, rcBuffer, rcInsufficient);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetRefSeqPos(
+                                                const AlignAccessAlignmentEnumerator *self,
+                                                uint64_t *start_pos
+) {
+    rc_t rc;
+    int64_t pos;
+    
+    rc = BAMAlignmentGetPosition(self->innerSelf, &pos);
+    if (rc)
+        return rc;
+    if (pos < 0)
+        return RC(rcAlign, rcTable, rcAccessing, rcData, rcNotFound);
+
+    *start_pos = pos;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetRefSeqLen(
+                                                              const AlignAccessAlignmentEnumerator *self,
+                                                              uint32_t *reflen
+                                                              )
+{
+    rc_t rc;
+    uint32_t length;
+    int64_t pos;
+    
+    rc = BAMAlignmentGetPosition2(self->innerSelf, &pos, &length);
+    if (rc)
+        return rc;
+    if (pos < 0)
+        return RC(rcAlign, rcTable, rcAccessing, rcData, rcNotFound);
+    
+    *reflen = length;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetMapQuality(
+                                                 const AlignAccessAlignmentEnumerator *self,
+                                                 uint8_t *score
+) {
+    uint8_t y = 0;
+    
+    if (self && self->innerSelf) {
+        uint16_t flags;
+    
+        BAMAlignmentGetFlags(self->innerSelf, &flags);
+        if ((flags & BAMFlags_SelfIsUnmapped) == 0)
+            BAMAlignmentGetMapQuality(self->innerSelf, &y);
+	}
+    if (score) *score = y;
+    
+    return 0;
+}
+
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetShortSeqAccessionID(
+                                                        const AlignAccessAlignmentEnumerator *self,
+                                                        char *id_buffer, size_t buffer_size, size_t *id_size
+) {
+    rc_t rc;
+    size_t id_act_size;
+    const char *readGroupName;
+    
+    if (self == NULL)
+        return 0;
+    if (id_buffer == NULL && id_size == NULL)
+        return RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+    
+    rc = BAMAlignmentGetReadGroupName(self->innerSelf, &readGroupName);
+    if (rc)
+        return rc;
+    if (readGroupName == 0)
+        *id_size = 0;
+    else {
+        id_act_size = string_size( readGroupName ) + 1;
+        if (id_size != NULL)
+            *id_size = id_act_size;
+        if (id_buffer != NULL) {
+            if (buffer_size >= id_act_size)
+                memmove(id_buffer, readGroupName, id_act_size);
+            else
+                rc = RC(rcAlign, rcTable, rcAccessing, rcBuffer, rcInsufficient);
+        }
+    }
+    return rc;    
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetShortSeqID(
+                                                 const AlignAccessAlignmentEnumerator *self,
+                                                 char *id_buffer, size_t buffer_size, size_t *id_size
+) {
+    rc_t rc;
+    size_t id_act_size;
+    const char *readName;
+    
+    if (self == NULL)
+        return 0;
+    if (id_buffer == NULL && id_size == NULL)
+        return RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+    
+    rc = BAMAlignmentGetReadName(self->innerSelf, &readName);
+    if (rc)
+        return rc;
+
+    id_act_size = string_size( readName ) + 1;
+    if (id_size != NULL)
+        *id_size = id_act_size;
+    if (id_buffer != NULL) {
+        if (buffer_size >= id_act_size)
+            memmove(id_buffer, readName, id_act_size);
+        else
+            rc = RC(rcAlign, rcTable, rcAccessing, rcBuffer, rcInsufficient);
+    }
+    return rc;    
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetCIGAR(
+    const AlignAccessAlignmentEnumerator *self,
+    uint64_t *start_pos, char *cigar_buffer, size_t buffer_size, size_t *cigar_size
+) {
+    int i;
+    unsigned n;
+    rc_t rc;
+    uint32_t sp = 0;
+    char *cigbuf = cigar_buffer;
+    const char *const endp = cigar_buffer + buffer_size;
+    
+    if (cigar_buffer == NULL && cigar_size == NULL) {
+        /* no result can be returned */
+        rc = RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+    }
+    
+    rc = BAMAlignmentGetCigarCount(self->innerSelf, &n);
+    if (rc)
+        return rc;
+    if (n == 0) {
+        if (cigar_size != NULL)
+            *cigar_size = 0;
+        if (start_pos != NULL)
+            *start_pos = 0;
+        cigbuf[0] = 0;
+        return 0;
+    }
+    for (i = 0; i != n; ++i) {
+        char cig1[20];
+        BAMCigarType op;
+        uint32_t len;
+        int cig1len;
+        
+        BAMAlignmentGetCigar(self->innerSelf, i, &op, &len);
+        if (i == 0 && op == ct_SoftClip) {
+            sp = len;
+            continue;
+        }
+        if (i == 0 && op == ct_HardClip)
+            continue;
+        if (i == n - 1 && (op == ct_SoftClip || op == ct_HardClip))
+            continue;
+        
+        cig1len = sprintf(cig1, "%c%u", op, len);
+        if (cigbuf + cig1len < endp) {
+            if (cigar_buffer != NULL) {
+                memmove(cigbuf, cig1, cig1len);
+                cigbuf[cig1len] = 0;
+            }
+        }
+        else
+            rc = RC(rcAlign, rcTable, rcAccessing, rcBuffer, rcInsufficient);
+        cigbuf += cig1len;
+    }
+    if (cigar_size != NULL)
+        *cigar_size = cigbuf - cigar_buffer + 1;
+    if (start_pos != NULL)
+        *start_pos = sp;
+    return rc;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetShortSequence(
+                                                    const AlignAccessAlignmentEnumerator *self,
+                                                    char *seq_buffer, size_t buffer_size, size_t *seq_size
+) {
+    rc_t rc;
+    uint32_t act_size;
+
+    if (self == NULL)
+        return 0;
+    if (seq_buffer == NULL && seq_size == NULL)
+        return RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+    
+    rc = BAMAlignmentGetReadLength(self->innerSelf, &act_size);
+    if (rc)
+        return rc;
+    
+    ++act_size;
+    if (seq_size != NULL)
+        *seq_size = act_size;
+    
+    if (seq_buffer != NULL) {
+        if (buffer_size >= act_size) {
+            rc = BAMAlignmentGetSequence(self->innerSelf, seq_buffer);
+            seq_buffer[act_size - 1] = 0;
+        }
+        else
+            rc = RC(rcAlign, rcTable, rcAccessing, rcBuffer, rcInsufficient);
+    }
+    return rc;    
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetStrandDirection(
+                                                      const AlignAccessAlignmentEnumerator *self,
+                                                      AlignmentStrandDirection *result
+) {
+    uint16_t flags;
+    rc_t rc;
+    
+    if (result == NULL)
+        return RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+
+    *result = asd_Unknown;
+    if (self == NULL)
+        return 0;
+    
+    rc = BAMAlignmentGetFlags(self->innerSelf, &flags);
+    if (rc)
+        return rc;
+    
+    *result = ((flags & BAMFlags_SelfIsReverse) == BAMFlags_SelfIsReverse) ? asd_Reverse : asd_Forward;
+    
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetIsPaired(const AlignAccessAlignmentEnumerator *self,
+                                               bool *result)
+{
+    uint16_t flags;
+    rc_t rc;
+    
+    if (result == NULL)
+        return RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+    
+    *result = asd_Unknown;
+    if (self == NULL)
+        return 0;
+    
+    rc = BAMAlignmentGetFlags(self->innerSelf, &flags);
+    if (rc)
+        return rc;
+    
+    *result = ((flags & BAMFlags_IsMappedAsPair) == 0) ? false : true;
+    
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetIsFirstInPair(const AlignAccessAlignmentEnumerator *self,
+                                                    bool *result)
+{
+    uint16_t flags;
+    rc_t rc;
+    
+    if (result == NULL)
+        return RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+    
+    if (self == NULL)
+        return 0;
+    
+    rc = BAMAlignmentGetFlags(self->innerSelf, &flags);
+    if (rc)
+        return rc;
+    
+    *result = ((flags & BAMFlags_IsFirst) == 0) ? false : true;
+    
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetIsSecondInPair(const AlignAccessAlignmentEnumerator *self,
+                                                     bool *result)
+{
+    uint16_t flags;
+    rc_t rc;
+    
+    if (result == NULL)
+        return RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+    
+    if (self == NULL)
+        return 0;
+    
+    rc = BAMAlignmentGetFlags(self->innerSelf, &flags);
+    if (rc)
+        return rc;
+    
+    *result = ((flags & BAMFlags_IsSecond) == 0) ? false : true;
+    
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetRecordID(const AlignAccessAlignmentEnumerator *self, uint64_t *result)
+{
+    if (result == NULL)
+        return RC(rcAlign, rcTable, rcAccessing, rcParam, rcNull);
+    
+    if (self == NULL)
+        return 0;
+    
+    *(BAMFilePosition *)result = self->pos;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AlignAccessAlignmentEnumeratorGetBAMAlignment(const AlignAccessAlignmentEnumerator *self, const BAMAlignment **result)
+{
+    *result = self->innerSelf;
+    return BAMAlignmentAddRef(self->innerSelf);
+}
diff --git a/libs/align/align_mgr.c b/libs/align/align_mgr.c
new file mode 100644
index 0000000..c700463
--- /dev/null
+++ b/libs/align/align_mgr.c
@@ -0,0 +1,108 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/sort.h>
+#include <insdc/insdc.h>
+#include <align/iterator.h>
+#include <align/manager.h>
+#include <sysalloc.h>
+
+#include "debug.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+struct AlignMgr
+{
+    KRefcount refcount;
+    /* what else will be here ? */
+};
+
+
+LIB_EXPORT rc_t CC AlignMgrMakeRead ( const struct AlignMgr **self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        AlignMgr * alm = calloc( sizeof * alm, 1 );
+        if ( alm == NULL )
+            rc = RC( rcAlign, rcIterator, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            KRefcountInit( &alm->refcount, 1, "AlignMgr", "Make", "align" );
+        }
+
+        if ( rc == 0 )
+            *self = alm;
+        else
+            free( alm );
+    }
+    return rc;
+
+}
+
+
+LIB_EXPORT rc_t CC AlignMgrAddRef ( const AlignMgr *self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcAttaching, rcSelf, rcNull );
+    else
+    {
+        if ( KRefcountAdd( &self->refcount, "AlignMgr" ) != krefOkay )
+        {
+            rc = RC( rcAlign, rcIterator, rcAttaching, rcError, rcUnexpected );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC AlignMgrRelease ( const AlignMgr *cself )
+{
+    rc_t rc = 0;
+    if ( cself == NULL )
+        rc = RC( rcAlign, rcIterator, rcReleasing, rcSelf, rcNull );
+    else
+    {
+        if ( KRefcountDrop( &cself->refcount, "AlignMgr" ) == krefWhack )
+        {
+            AlignMgr * self = ( AlignMgr * ) cself;
+            free( self );
+        }
+    }
+    return rc;
+
+}
diff --git a/libs/align/bam-priv.h b/libs/align/bam-priv.h
new file mode 100644
index 0000000..1b2d37c
--- /dev/null
+++ b/libs/align/bam-priv.h
@@ -0,0 +1,48 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_bam_priv_
+#define _h_bam_priv_
+
+#ifndef _h_align_bam_
+#include <align/bam.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Get the aligned position on the Ref. Seq.
+ */
+rc_t BAMAlignmentGetNthPosition(const BAMAlignment *cself, uint32_t n, int64_t *pos);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_bam_priv_ */
diff --git a/libs/align/bam.c b/libs/align/bam.c
new file mode 100644
index 0000000..678d0af
--- /dev/null
+++ b/libs/align/bam.c
@@ -0,0 +1,5055 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <align/extern.h>
+#include <klib/defs.h>
+#include <klib/debug.h>
+#include <klib/sort.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/mmap.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <sysalloc.h>
+
+#include <atomic32.h>
+#include <strtol.h>
+
+#include <align/bam.h>
+#include "bam-priv.h"
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+#if 1
+/*_DEBUGGING*/
+#include <stdio.h>
+#endif
+
+#include <endian.h>
+#include <byteswap.h>
+
+#include <zlib.h>
+
+#include <os-native.h>
+
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+static uint16_t LE2HUI16(void const *X) { uint16_t y; memmove(&y, X, sizeof(y)); return y; }
+static uint32_t LE2HUI32(void const *X) { uint32_t y; memmove(&y, X, sizeof(y)); return y; }
+static uint64_t LE2HUI64(void const *X) { uint64_t y; memmove(&y, X, sizeof(y)); return y; }
+static  int16_t  LE2HI16(void const *X) {  int16_t y; memmove(&y, X, sizeof(y)); return y; }
+static  int32_t  LE2HI32(void const *X) {  int32_t y; memmove(&y, X, sizeof(y)); return y; }
+/* static  int64_t  LE2HI64(void const *X) {  int64_t y; memmove(&y, X, sizeof(y)); return y; } */
+#endif
+#if __BYTE_ORDER == __BIG_ENDIAN
+static uint16_t LE2HUI16(void const *X) { uint16_t y; memmove(&y, X, sizeof(y)); return (uint16_t)bswap_16(y); }
+static uint32_t LE2HUI32(void const *X) { uint32_t y; memmove(&y, X, sizeof(y)); return (uint32_t)bswap_32(y); }
+static uint64_t LE2HUI64(void const *X) { uint64_t y; memmove(&y, X, sizeof(y)); return (uint64_t)bswap_64(y); }
+static  int16_t  LE2HI16(void const *X) {  int16_t y; memmove(&y, X, sizeof(y)); return ( int16_t)bswap_16(y); }
+static  int32_t  LE2HI32(void const *X) {  int32_t y; memmove(&y, X, sizeof(y)); return ( int32_t)bswap_32(y); }
+static  int64_t  LE2HI64(void const *X) {  int64_t y; memmove(&y, X, sizeof(y)); return ( int64_t)bswap_64(y); }
+#endif
+
+typedef struct BAMIndex BAMIndex;
+typedef struct BGZFile BGZFile;
+
+/* MARK: BGZFile *** Start *** */
+
+#define VALIDATE_BGZF_HEADER 1
+#if (ZLIB_VERNUM < 0x1230)
+#undef VALIDATE_BGZF_HEADER
+#warning "zlib too old, inflateGetHeader not available, not validating BGZF headers"
+#else
+#endif
+
+#define ZLIB_BLOCK_SIZE ( 64 * 1024 )
+typedef uint8_t zlib_block_t[ZLIB_BLOCK_SIZE];
+
+#define MEM_ALIGN_SIZE ( 64 * 1024 )
+/* MEM_CHUNK_SIZE must be an integer multiple of ZLIB_BLOCK_SIZE.
+ * The multiple must be >= 2 shouldn't be < 3.
+ */
+#define MEM_CHUNK_SIZE ( 256 * ZLIB_BLOCK_SIZE )
+#define CG_NUM_SEGS 4
+
+typedef struct BGZFile_vt_s {
+    rc_t (*FileRead)(void *, zlib_block_t, unsigned *);
+    uint64_t (*FileGetPos)(void const *);
+    float (*FileProPos)(void const *);
+    uint64_t (*FileGetSize)(void const *);
+    rc_t (*FileSetPos)(void *, uint64_t);
+    void (*FileWhack)(void *);
+} BGZFile_vt;
+
+struct BGZFile {
+    uint64_t fsize;
+    uint64_t fpos;  /* position in file of first byte in buffer */
+    const uint8_t *buf;   /* page aligned or memmapped */
+    const KFile *kfp;
+    uint8_t *_buf;  /* allocated */
+    unsigned malign;
+    size_t bcount;  /* number of valid bytes in buffer */
+    uint32_t bpos;  /* position in buffer of read head */
+    z_stream zs;
+};
+
+static
+rc_t BGZFileGetMoreBytes(BGZFile *self)
+{
+    rc_t rc;
+    
+    self->fpos += self->bpos;
+    self->bpos &= (MEM_ALIGN_SIZE - 1);
+    self->fpos -= self->bpos;
+
+    rc = KFileRead(self->kfp, self->fpos, self->_buf + self->malign,
+                   MEM_CHUNK_SIZE, &self->bcount);
+    if (rc) {
+        DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("Error reading BAM file: %R\n", rc));
+        return rc;
+    }
+    if (self->bcount == 0 || self->bcount == self->bpos)
+        return RC(rcAlign, rcFile, rcReading, rcData, rcInsufficient);
+
+    self->zs.avail_in = (uInt)(self->bcount - self->bpos);
+    self->zs.next_in = (Bytef *)&self->buf[self->bpos];
+    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("Read %u bytes from BAM file at position %lu\n", self->zs.avail_in, self->fpos));
+    
+    return 0;
+}
+
+static
+rc_t BGZFileRead(BGZFile *self, zlib_block_t dst, unsigned *pNumRead)
+{
+#if VALIDATE_BGZF_HEADER
+    uint8_t extra[256];
+    gz_header head;
+#endif
+    rc_t rc = 0;
+    unsigned loops;
+    int zr;
+    
+    *pNumRead = 0;
+    if (self->bcount == 0 || self->zs.avail_in == 0) {
+        rc = BGZFileGetMoreBytes(self);
+        if (rc)
+            return rc;
+    }
+
+#if VALIDATE_BGZF_HEADER
+    memset(&head, 0, sizeof(head));
+    head.extra = extra;
+    head.extra_max = sizeof(extra);
+    
+    zr = inflateGetHeader(&self->zs, &head);
+    assert(zr == Z_OK);
+#endif
+    
+    self->zs.next_out = (Bytef *)dst;
+    self->zs.avail_out = sizeof(zlib_block_t);
+
+    for (loops = 0; loops != 2; ++loops) {
+        {
+            uLong const initial = self->zs.total_in;
+            
+            zr = inflate(&self->zs, Z_FINISH);
+            {
+                uLong const final = self->zs.total_in;
+                uLong const len = final - initial;
+                
+                self->bpos += len;
+            }
+        }
+        assert(self->zs.avail_in == self->bcount - self->bpos);
+        
+        switch (zr) {
+        case Z_OK:
+        case Z_BUF_ERROR:
+            rc = BGZFileGetMoreBytes(self);
+            if ( rc != 0 )
+            {
+                if ( GetRCObject( rc ) == (enum RCObject)rcData && GetRCState( rc ) == rcInsufficient )
+                {
+                    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("EOF in Zlib block after %lu bytes\n", self->fpos + self->bpos));
+                    rc = RC( rcAlign, rcFile, rcReading, rcFile, rcTooShort );
+                }
+                return rc;
+            }
+            break;
+        case Z_STREAM_END:
+            DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("Zlib block size (before/after): %u/%u\n", self->zs.total_in, self->zs.total_out));
+#if VALIDATE_BGZF_HEADER
+            if (head.done) {
+                unsigned const extra_len = head.extra_len;
+                unsigned i;
+                unsigned bsize = 0;
+                
+                DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("GZIP Header extra length: %u\n", extra_len));
+                for (i = 0; i < extra_len; ) {
+                    uint8_t const si1 = extra[i + 0];
+                    uint8_t const si2 = extra[i + 1];
+                    unsigned const slen = LE2HUI16(&extra[i + 2]);
+                    
+                    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("GZIP Header extra: %c%c(%u)\n", si1, si2, slen));
+                    if (si1 == 'B' && si2 == 'C') {
+                        bsize = 1 + LE2HUI16(&extra[i + 4]);
+                        DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("BGZF Header extra field BC: bsize %u\n", bsize));
+                        break;
+                    }
+                    i += slen + 4;
+                }
+                if (bsize == 0 || bsize != self->zs.total_in) {
+                    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("BGZF Header extra field BC not found\n"));
+                    rc = RC(rcAlign, rcFile, rcReading, rcFormat, rcInvalid); /* not BGZF */
+                }
+            }
+            else {
+                DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("GZIP Header not found\n"));
+                rc = RC(rcAlign, rcFile, rcReading, rcFile, rcCorrupt);
+            }
+#endif
+            *pNumRead = (unsigned)self->zs.total_out; /* <= 64k */
+            zr = inflateReset(&self->zs);
+            assert(zr == Z_OK);
+            return rc;
+        default:
+            DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("Unexpected Zlib result %i\n", zr));
+            return RC(rcAlign, rcFile, rcReading, rcFile, rcCorrupt);
+        }
+    }
+    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("Failed reading BAM file after %lu bytes\n", self->fpos + self->bpos));
+    return RC(rcAlign, rcFile, rcReading, rcFile, rcTooShort);
+}
+
+static uint64_t BGZFileGetPos(const BGZFile *self)
+{
+    return self->fpos + self->bpos;
+}
+
+/* returns the position as proportion of the whole file */ 
+static float BGZFileProPos(BGZFile const *const self)
+{
+    return BGZFileGetPos(self) / (double)self->fsize;
+}
+
+static rc_t BGZFileSetPos(BGZFile *const self, uint64_t const pos)
+{
+    if (self->fpos > pos || pos >= self->fpos + self->bcount) {
+        /* desired position is outside of current buffer */
+        self->fpos = pos ^ (pos & ((uint64_t)(MEM_ALIGN_SIZE - 1)));
+        self->bpos = (unsigned)(pos - self->fpos);
+        self->bcount = 0; /* force re-read */
+    }
+    else {
+        /* desired position is inside of current buffer */
+        unsigned const bpos = (unsigned)(pos - self->fpos); /* < 64k */
+
+        self->bpos = bpos; /* pos - self->fpos; */
+        self->zs.avail_in = (uInt)(self->bcount - bpos);
+        self->zs.next_in = (Bytef *)&self->buf[bpos];
+    }
+    return 0;
+}
+
+typedef rc_t (*BGZFileWalkBlocks_cb)(void *ctx, const BGZFile *file,
+                                     rc_t rc, uint64_t fpos,
+                                     const zlib_block_t data, unsigned dsize);
+
+/* Without Decompression */
+static rc_t BGZFileWalkBlocksND(BGZFile *const self, BGZFileWalkBlocks_cb const cb, void *const ctx)
+{
+    rc_t rc = 0;
+#if VALIDATE_BGZF_HEADER
+    uint8_t extra[256];
+    char dummy[64];
+    gz_header head;
+    int zr;
+
+    memset(&head, 0, sizeof(head));
+    head.extra = extra;
+    head.extra_max = sizeof(extra);
+    
+    do {
+        unsigned loops;
+        unsigned hsize = 0;
+        unsigned bsize = 0;
+        unsigned bsize2;
+        uint64_t const fpos = self->fpos + self->bpos;
+        
+        self->zs.next_out = (Bytef *)dummy;
+        self->zs.avail_out = sizeof(dummy);
+        
+        zr = inflateGetHeader(&self->zs, &head);
+        assert(zr == Z_OK);
+        
+        for (loops = 0; loops != 2; ++loops) {
+            {
+                uLong const orig = self->zs.total_in;
+                
+                zr = inflate(&self->zs, Z_BLOCK); /* Z_BLOCK stops at end of header */
+                {
+                    uLong const final = self->zs.total_in;
+                    uLong const bytes = final - orig;
+                    
+                    self->bpos += bytes;
+                    hsize += bytes;
+                }
+            }
+            if (head.done) {
+                unsigned i;
+                
+                for (i = 0; i < head.extra_len; ) {
+                    if (extra[i] == 'B' && extra[i + 1] == 'C') {
+                        bsize = 1 + LE2HUI16(&extra[i + 4]);
+                        break;
+                    }
+                    i += LE2HUI16(&extra[i + 2]);
+                }
+                break;
+            }
+            else if (self->zs.avail_in == 0) {
+                rc = BGZFileGetMoreBytes(self);
+                if (rc) {
+                    rc = RC(rcAlign, rcFile, rcReading, rcFile, rcTooShort);
+                    goto DONE;
+                }
+            }
+            else {
+                rc = RC(rcAlign, rcFile, rcReading, rcFile, rcCorrupt);
+                goto DONE;
+            }
+        }
+        if (bsize == 0) {
+            rc = RC(rcAlign, rcFile, rcReading, rcFormat, rcInvalid); /* not BGZF */
+            break;
+        }
+        bsize2 = bsize;
+        bsize -= hsize;
+        for ( ; ; ) {
+            unsigned const max = (unsigned)(self->bcount - self->bpos); /* <= 64k */
+            unsigned const len = bsize > max ? max : bsize;
+            
+            self->bpos += len;
+            bsize -= len;
+            if (self->bpos == self->bcount) {
+                rc = BGZFileGetMoreBytes(self);
+                if (rc) {
+                    if (bsize)
+                        rc = RC(rcAlign, rcFile, rcReading, rcFile, rcTooShort);
+                    goto DONE;
+                }
+            }
+            else {
+                zr = inflateReset(&self->zs);
+                assert(zr == Z_OK);
+                self->zs.avail_in = (uInt)(self->bcount - self->bpos);
+                self->zs.next_in = (Bytef *)&self->buf[self->bpos];
+                rc = cb(ctx, self, 0, fpos, NULL, bsize2);
+                break;
+            }
+        }
+    } while (rc == 0);
+DONE:
+    if ( GetRCState( rc ) == rcInsufficient && GetRCObject( rc ) == (enum RCObject)rcData )
+        rc = 0;
+    rc = cb( ctx, self, rc, self->fpos + self->bpos, NULL, 0 );
+#endif
+    return rc;
+}
+
+static rc_t BGZFileWalkBlocksUnzip(BGZFile *const self, zlib_block_t *const bufp, BGZFileWalkBlocks_cb const cb, void *const ctx)
+{
+    rc_t rc;
+    rc_t rc2;
+    
+    do {
+        uint64_t const fpos = self->fpos + self->bpos;
+        unsigned dsize;
+        
+        rc2 = BGZFileRead(self, *bufp, &dsize);
+        rc = cb(ctx, self, rc2, fpos, *bufp, dsize);
+    } while (rc == 0 && rc2 == 0);
+    if ( GetRCState( rc2 ) == rcInsufficient && GetRCObject( rc2 ) == (enum RCObject)rcData )
+        rc2 = 0;
+    rc = cb( ctx, self, rc2, self->fpos + self->bpos, NULL, 0 );
+    return rc ? rc : rc2;
+}
+
+static rc_t BGZFileWalkBlocks(BGZFile *self, bool decompress, zlib_block_t *bufp,
+                              BGZFileWalkBlocks_cb cb, void *ctx)
+{
+    rc_t rc;
+    
+#if VALIDATE_BGZF_HEADER
+#else
+    decompress = true;
+#endif
+    self->fpos = 0;
+    self->bpos = 0;
+    
+    rc = BGZFileGetMoreBytes(self);
+    if (rc)
+        return rc;
+    
+    if (decompress)
+        return BGZFileWalkBlocksUnzip(self, bufp, cb, ctx);
+    else
+        return BGZFileWalkBlocksND(self, cb, ctx);
+}
+
+static uint64_t BGZFileGetSize(BGZFile const *const self)
+{
+    return self->fsize;
+}
+
+static void BGZFileWhack(BGZFile *self)
+{
+    inflateEnd(&self->zs);
+    KFileRelease(self->kfp);
+    if (self->_buf)
+        free(self->_buf);
+}
+
+static rc_t BGZFileInit(BGZFile *self, const KFile *kfp, BGZFile_vt *vt)
+{
+    int i;
+    rc_t rc;
+    static BGZFile_vt const my_vt = {
+        (rc_t (*)(void *, zlib_block_t, unsigned *))BGZFileRead,
+        (uint64_t (*)(void const *))BGZFileGetPos,
+        (float (*)(void const *))BGZFileProPos,
+        (uint64_t (*)(void const *))BGZFileGetSize,
+        (rc_t (*)(void *, uint64_t))BGZFileSetPos,
+        (void (*)(void *))BGZFileWhack
+    };
+    
+    memset(self, 0, sizeof(*self));
+    memset(vt, 0, sizeof(*vt));
+    
+    i = inflateInit2(&self->zs, MAX_WBITS + 16); /* max + enable gzip headers */
+    switch (i) {
+    case Z_OK:
+        break;
+    case Z_MEM_ERROR:
+        return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+    default:
+        return RC(rcAlign, rcFile, rcConstructing, rcNoObj, rcUnexpected);
+    }
+    
+    rc = KFileSize(kfp, &self->fsize);
+    if (rc)
+        return rc;
+    
+    self->_buf = malloc(MEM_CHUNK_SIZE + MEM_ALIGN_SIZE);
+    if (self->_buf == NULL)
+        return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+    self->malign = (MEM_ALIGN_SIZE - ((intptr_t)self->_buf & (MEM_ALIGN_SIZE - 1))) & (MEM_ALIGN_SIZE - 1);
+    self->buf = self->_buf + self->malign;
+    
+    self->kfp = kfp;
+    KFileAddRef(kfp);
+
+    *vt = my_vt;
+    
+    return 0;
+}
+
+#ifndef WINDOWS
+
+/* MARK: BGZThreadFile *** Start *** */
+
+#include <kproc/thread.h>
+#include <kproc/lock.h>
+#include <kproc/cond.h>
+
+typedef struct BGZThreadFile_s BGZThreadFile;
+
+#define BUFFER_COUNT (3)
+
+typedef struct BGZThreadFileWorkQElem_s BGZThreadFileWorkQElem;
+
+struct BGZThreadFileWorkQElem_s {
+    uint8_t *buf;
+    uint64_t pos;
+    unsigned bsz;
+};
+
+struct BGZThreadFile_s {
+    BGZFile file;
+    KLock *lock;
+    KCondition *have_data;
+    KCondition *need_data;
+    KThread *th;
+    uint64_t pos;
+    BGZThreadFileWorkQElem que[BUFFER_COUNT];
+    rc_t volatile rc;
+    unsigned volatile nque;
+    bool eof;
+    uint8_t buffer[sizeof(zlib_block_t) * BUFFER_COUNT];
+};
+
+static rc_t BGZThreadFileRead(BGZThreadFile *self, zlib_block_t dst, unsigned *pNumRead)
+{
+    rc_t rc;
+    
+    *pNumRead = 0;
+    
+    KLockAcquire(self->lock);
+    if ((rc = self->rc) == 0) {
+        while (self->nque == 0 && (rc = self->rc) == 0)
+            KConditionWait(self->have_data, self->lock);
+        if (rc == 0) {
+            BGZThreadFileWorkQElem const work = self->que[0];
+            
+            self->pos = work.pos;
+            if (work.buf) {
+                memmove(dst, work.buf, *pNumRead = work.bsz);
+                memmove(&self->que[0], &self->que[1], --self->nque * sizeof(self->que[0]));
+                KConditionSignal(self->need_data);
+            }
+            else {
+                self->eof = true;
+                self->rc = rc = RC(rcAlign, rcFile, rcReading, rcData, rcInsufficient);
+            }
+        }
+    }
+    KLockUnlock(self->lock);
+    return rc;
+}
+
+static rc_t CC BGZThreadFileMain(KThread const *const th, void *const vp)
+{
+    BGZThreadFile *const self = (BGZThreadFile *)vp;
+    rc_t rc = 0;
+    unsigned bufno;
+    
+    KLockAcquire(self->lock);
+    for (bufno = 0; ; bufno = (bufno + 1) % BUFFER_COUNT) {
+        while (self->nque == BUFFER_COUNT)
+            KConditionWait(self->need_data, self->lock);
+        {
+            BGZThreadFileWorkQElem work;
+            
+            work.pos = BGZFileGetPos(&self->file);
+            work.buf = &self->buffer[bufno * sizeof(zlib_block_t)];
+            rc = BGZFileRead(&self->file, work.buf, &work.bsz);
+            if ( GetRCObject( rc ) == (enum RCObject)rcData && GetRCState( rc ) == rcInsufficient )
+                work.buf = NULL;
+            else if ( rc != 0 )
+                break;
+            self->que[self->nque++] = work;
+            KConditionSignal(self->have_data);
+        }
+    }
+    self->rc = rc;
+    KLockUnlock(self->lock);
+    return 0;
+}
+
+static uint64_t BGZThreadFileGetPos(BGZThreadFile const *const self)
+{
+    return self->pos;
+}
+
+/* returns the position as proportion of the whole file */ 
+static float BGZThreadFileProPos(BGZThreadFile const *const self)
+{
+    return BGZThreadFileGetPos(self) / (double)self->file.fsize;
+}
+
+static uint64_t BGZThreadFileGetSize(BGZThreadFile const *const self)
+{
+    return BGZFileGetSize(&self->file);
+}
+
+static rc_t BGZThreadFileSetPos(BGZThreadFile *const self)
+{
+    return RC(rcAlign, rcFile, rcPositioning, rcFunction, rcUnsupported);
+}
+
+static void BGZThreadFileWhack(BGZThreadFile *const self)
+{
+    KThreadCancel(self->th);
+    KThreadWait(self->th, NULL);
+    BGZFileWhack(&self->file);
+    KConditionRelease(self->need_data);
+    KConditionRelease(self->have_data);
+    KLockRelease(self->lock);
+    KThreadRelease(self->th);
+}
+
+static rc_t BGZThreadFileInit(BGZThreadFile *self, const KFile *kfp, BGZFile_vt *vt)
+{
+    rc_t rc;
+    static BGZFile_vt const my_vt = {
+        (rc_t (*)(void *, zlib_block_t, unsigned *))BGZThreadFileRead,
+        (uint64_t (*)(void const *))BGZThreadFileGetPos,
+        (float (*)(void const *))BGZThreadFileProPos,
+        (uint64_t (*)(void const *))BGZThreadFileGetSize,
+        (rc_t (*)(void *, uint64_t))BGZThreadFileSetPos,
+        (void (*)(void *))BGZThreadFileWhack
+    };
+    
+    memset(self, 0, sizeof(*self));
+    
+    rc = BGZFileInit(&self->file, kfp, vt);
+    if (rc == 0) {
+        rc = KLockMake(&self->lock);
+        if (rc == 0) {
+            rc = KConditionMake(&self->have_data);
+            if (rc == 0) {
+                rc = KConditionMake(&self->need_data);
+                if (rc == 0) {
+                    rc = KThreadMake(&self->th, BGZThreadFileMain, self);
+                    if (rc == 0) {
+                        *vt = my_vt;
+                        return 0;
+                    }
+                    KConditionRelease(self->need_data);
+                }
+                KConditionRelease(self->have_data);
+            }
+            KLockRelease(self->lock);
+        }
+        BGZFileWhack(&self->file);
+    }
+    memset(self, 0, sizeof(*self));
+    memset(vt, 0, sizeof(*vt));
+    return rc;
+}
+
+#endif
+
+/* MARK: BAMFile structures */
+
+struct BAMIndex {
+    BAMFilePosition *refSeq[1];
+};
+
+struct BAMFile {
+    uint64_t fpos_first;
+    uint64_t fpos_cur;
+    
+    union {
+        BGZFile plain;
+#ifndef WINDOWS
+        BGZThreadFile thread;
+#endif
+    } file;
+    BGZFile_vt vt;
+    
+    BAMRefSeq *refSeq;          /* pointers into headerData1 except name points into headerData2 */ 
+    BAMReadGroup *readGroup;    /* pointers into headerData1 */
+    char const *version;
+    char const *header;
+    char    *headerData1;       /* gets used for refSeq and readGroup */
+    uint8_t *headerData2;       /* gets used for refSeq */
+    BAMAlignment *bufLocker;
+    BAMAlignment *nocopy;       /* used to hold current record for BAMFileRead2 */
+    BAMIndex const *ndx;
+    
+    size_t nocopy_size;
+    
+    unsigned refSeqs;
+    unsigned readGroups;
+    
+    KRefcount refcount;
+    unsigned ucfirst;           /* offset of first record in uncompressed buffer */
+    unsigned bufSize;           /* current size of uncompressed buffer */
+    unsigned bufCurrent;        /* location in uncompressed buffer of read head */
+    bool eof;
+    bool threaded;
+    zlib_block_t buffer;        /* uncompressed buffer */
+};
+
+/* MARK: Alignment structures */
+
+struct bam_alignment_s {
+    uint8_t rID[4];
+    uint8_t pos[4];
+    uint8_t read_name_len;
+    uint8_t mapQual;
+    uint8_t bin[2];
+    uint8_t n_cigars[2];
+    uint8_t flags[2];
+    uint8_t read_len[4];
+    uint8_t mate_rID[4];
+    uint8_t mate_pos[4];
+    uint8_t ins_size[4];
+    char read_name[1 /* read_name_len */];
+/* if you change length of read_name,
+ * adjust calculation of offsets in BAMAlignmentSetOffsets */
+/*  uint32_t cigar[n_cigars];
+ *  uint8_t seq[(read_len + 1) / 2];
+ *  uint8_t qual[read_len];
+ *  uint8_t extra[...];
+ */
+};
+
+typedef union bam_alignment_u {
+    struct bam_alignment_s cooked;
+    uint8_t raw[sizeof(struct bam_alignment_s)];
+} bam_alignment;
+
+struct offset_size_s {
+    unsigned offset;
+    unsigned size; /* this is the total length of the tag; length of data is size - 3 */
+};
+
+struct BAMAlignment {
+    KRefcount refcount;
+    
+    BAMFile *parent;
+    bam_alignment const *data;
+    uint8_t *storage;
+    unsigned datasize;
+        
+    unsigned cigar;
+    unsigned seq;
+    unsigned qual;
+    unsigned numExtra;
+    unsigned hasColor;
+    struct offset_size_s extra[1];
+};
+
+static const char cigarChars[] = {
+    ct_Match,
+    ct_Insert,
+    ct_Delete,
+    ct_Skip,
+    ct_SoftClip,
+    ct_HardClip,
+    ct_Padded,
+    ct_Equal,
+    ct_NotEqual
+    /* ct_Overlap must not appear in actual BAM file */
+};
+
+/* MARK: Alignment accessors */
+
+static int32_t getRefSeqId(const BAMAlignment *cself) {
+    return LE2HI32(cself->data->cooked.rID);
+}
+
+static int32_t getPosition(const BAMAlignment *cself) {
+    return LE2HI32(cself->data->cooked.pos);
+}
+
+static uint8_t getReadNameLength(const BAMAlignment *cself) {
+    return cself->data->cooked.read_name_len;
+}
+
+static uint16_t getBin(const BAMAlignment *cself) {
+    return LE2HUI16(cself->data->cooked.bin);
+}
+
+static uint8_t getMapQual(const BAMAlignment *cself) {
+    return cself->data->cooked.mapQual;
+}
+
+static uint16_t getCigarCount(const BAMAlignment *cself) {
+    return LE2HUI16(cself->data->cooked.n_cigars);
+}
+
+static uint16_t getFlags(const BAMAlignment *cself) {
+    return LE2HUI16(cself->data->cooked.flags);
+}
+
+static uint32_t getReadLen(const BAMAlignment *cself) {
+    return LE2HUI32(cself->data->cooked.read_len);
+}
+
+static int32_t getMateRefSeqId(const BAMAlignment *cself) {
+    return LE2HI32(cself->data->cooked.mate_rID);
+}
+
+static int32_t getMatePos(const BAMAlignment *cself) {
+    return LE2HI32(cself->data->cooked.mate_pos);
+}
+
+static int32_t getInsertSize(const BAMAlignment *cself) {
+    return LE2HI32(cself->data->cooked.ins_size);
+}
+
+static char const *getReadName(const BAMAlignment *cself) {
+    return &cself->data->cooked.read_name[0];
+}
+
+static void const *getCigarBase(BAMAlignment const *cself)
+{
+    return &cself->data->raw[cself->cigar];
+}
+
+static int opt_tag_cmp(uint8_t const a[2], uint8_t const b[2])
+{
+    int const d0 = (int)a[0] - (int)b[0];
+    return d0 ? d0 : ((int)a[1] - (int)b[1]);
+}
+
+static int64_t CC OptTag_sort(void const *A, void const *B, void *ctx)
+{
+    BAMAlignment const *const self = ctx;
+    unsigned const a_off = ((struct offset_size_s const *)A)->offset;
+    unsigned const b_off = ((struct offset_size_s const *)B)->offset;
+    uint8_t const *const a = &self->data->raw[a_off];
+    uint8_t const *const b = &self->data->raw[b_off];
+    int const diff = opt_tag_cmp(a, b);
+    
+    return diff ? (int64_t)diff : (int64_t)a - (int64_t)b;
+}
+
+static unsigned tag_findfirst(BAMAlignment const *const self, char const tag[2])
+{
+    unsigned f = 0;
+    unsigned e = self->numExtra;
+    
+    while (f < e) {
+        unsigned const m = (f + e) >> 1;
+        char const *const mtag = &self->data->raw[self->extra[m].offset];
+        int const d = opt_tag_cmp(tag, mtag);
+        
+        if (d > 0)
+            f = m + 1;
+        else
+            e = m;
+    }
+    return f;
+}
+
+static unsigned tag_runlength(BAMAlignment const *const self,
+                              char const tag[2],
+                              unsigned const at)
+{
+    unsigned n;
+    
+    for (n = 0; n + at < self->numExtra; ++n) {
+        if (opt_tag_cmp(tag, &self->data->raw[self->extra[n + at].offset]) != 0)
+            break;
+    }
+    return n;
+}
+
+static struct offset_size_s const *tag_search(BAMAlignment const *const self,
+                                              char const tag[2],
+                                              int const which)
+{
+    unsigned const fnd = tag_findfirst(self, tag);
+    unsigned const run = tag_runlength(self, tag, fnd);
+    unsigned const want = which < 0 ? (run + which) : which;
+    
+    return run == 0 ? NULL : &self->extra[fnd + (want % run)];
+}
+
+static char const *get_RG(BAMAlignment const *cself)
+{
+    struct offset_size_s const *const x = tag_search(cself, "RG", 0);
+    return (char const *)(x && cself->data->raw[x->offset + 2] == 'Z' ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static struct offset_size_s const *get_CS_info(BAMAlignment const *cself)
+{
+    return tag_search(cself, "CS", 0);
+}
+
+static struct offset_size_s const *get_CQ_info(BAMAlignment const *cself)
+{
+    return tag_search(cself, "CQ", 0);
+}
+
+static char const *get_CS(BAMAlignment const *cself)
+{
+    struct offset_size_s const *const x = get_CS_info(cself);
+    return (char const *)(x && cself->data->raw[x->offset + 2] == 'Z' ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static uint8_t const *get_CQ(BAMAlignment const *cself)
+{
+    struct offset_size_s const *const x = get_CQ_info(cself);
+    return (uint8_t const *)(x && cself->data->raw[x->offset + 2] == 'Z' ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static struct offset_size_s const *get_OQ_info(BAMAlignment const *cself)
+{
+    return tag_search(cself, "OQ", 0);
+}
+
+static uint8_t const *get_OQ(BAMAlignment const *cself)
+{
+    struct offset_size_s const *const x = get_OQ_info(cself);
+    return (uint8_t const *)(x && cself->data->raw[x->offset + 2] == 'Z' ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static char const *get_XT(BAMAlignment const *cself)
+{
+    struct offset_size_s const *const x = tag_search(cself, "XT", 0);
+    return (char const *)(x && cself->data->raw[x->offset + 2] == 'Z' ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static uint8_t const *get_XS(BAMAlignment const *cself)
+{
+    struct offset_size_s const *const x = tag_search(cself, "XS", -1); /* want last one */
+    return (uint8_t const *)(x && cself->data->raw[x->offset + 2] == 'A' ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static struct offset_size_s const *get_CG_ZA_info(BAMAlignment const *cself)
+{
+    struct offset_size_s const *const x = tag_search(cself, "ZA", 0);
+    return x;
+}
+
+static struct offset_size_s const *get_CG_ZI_info(BAMAlignment const *cself)
+{
+    struct offset_size_s const *const x = tag_search(cself, "ZI", 0);
+    return x;
+}
+
+static struct offset_size_s const *get_CG_GC_info(BAMAlignment const *cself)
+{
+    struct offset_size_s const *const x = tag_search(cself, "GC", 0);
+    return x;
+}
+
+static struct offset_size_s const *get_CG_GS_info(BAMAlignment const *cself)
+{
+    struct offset_size_s const *const x = tag_search(cself, "GS", 0);
+    return x;
+}
+
+static struct offset_size_s const *get_CG_GQ_info(BAMAlignment const *cself)
+{
+    struct offset_size_s const *const x = tag_search(cself, "GQ", 0);
+    return x;
+}
+
+/* MARK: BAMFile Reading functions */
+
+/* returns (rcData, rcInsufficient) if eof */
+static rc_t BAMFileFillBuffer(BAMFile *self)
+{
+    rc_t const rc = self->vt.FileRead(&self->file, self->buffer, &self->bufSize);
+    if (rc)
+        return rc;
+    if (self->bufSize == 0 || self->bufSize <= self->bufCurrent)
+        return SILENT_RC(rcAlign, rcFile, rcReading, rcData, rcInsufficient);
+    return 0;
+}
+
+static rc_t BAMFileReadn(BAMFile *self, const unsigned len, uint8_t dst[/* len */]) {
+    rc_t rc;
+    unsigned cur;
+    unsigned n = 0;
+    
+    if (len == 0)
+        return 0;
+    
+    for (cur = 0; ; cur += n) {
+        if (self->bufSize > self->bufCurrent) {
+            n = self->bufSize - self->bufCurrent;
+            if (cur + n > len)
+                n = len - cur;
+            memmove(&dst[cur], &self->buffer[self->bufCurrent], n);
+            self->bufCurrent += n;
+        }
+        if (self->bufCurrent != self->bufSize && self->bufSize != 0)
+            return 0;
+        if (self->bufSize != 0) {
+            /* a seek has not just been done so update the file position.
+             * if we didn't and a request for the position is made before the
+             * next read, we will not have the position of the next read.
+             *
+             * if a seek had just been done then
+             *    self->fpos_cur == BGZFileGetPos(&self->file)
+             * is already true.
+             */
+            self->fpos_cur = self->vt.FileGetPos(&self->file);
+            self->bufCurrent = 0;
+            self->bufSize = 0;
+            if (cur + n == len)
+                return 0;
+        }
+
+        rc = BAMFileFillBuffer(self);
+        if (rc)
+            return rc;
+    }
+}
+
+static void const *BAMFilePeek(BAMFile const *const self, unsigned const offset)
+{
+    return &self->buffer[self->bufCurrent + offset];
+}
+
+static unsigned BAMFileMaxPeek(BAMFile const *self)
+{
+    return self->bufSize > self->bufCurrent ? self->bufSize - self->bufCurrent : 0;
+}
+
+static int32_t BAMFilePeekI32(BAMFile *self)
+{
+    return LE2HI32(BAMFilePeek(self, 0));
+}
+
+static rc_t BAMFileReadI32(BAMFile *self, int32_t *rhs)
+{
+    uint8_t buf[sizeof(int32_t)];
+    rc_t rc = BAMFileReadn(self, sizeof(int32_t), buf);
+    
+    if (rc == 0)
+        *rhs = LE2HI32(buf);
+    return rc;
+}
+
+/* MARK: BAM File header parsing functions */
+
+static int64_t CC comp_ReadGroup(const void *a, const void *b, void *ignored) {
+    return strcmp(((BAMReadGroup const *)a)->name, ((BAMReadGroup const *)b)->name);
+}
+
+static rc_t ParseHD(BAMFile *self, char hdata[], size_t hlen, unsigned *used)
+{
+    unsigned i;
+    unsigned tag;
+    unsigned value;
+    int st = 0;
+    int ws = 1;
+
+    for (i = 0; i < hlen; ++i) {
+        char const cc = hdata[i];
+        
+        if (ws && isspace(cc))
+            continue;
+        ws = 0;
+        
+        switch (st) {
+        case 0:
+            tag = i;
+            ++st;
+            break;
+        case 1:
+            if (isspace(cc))
+                return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+            ++st;
+            break;
+        case 2:
+            if (cc != ':')
+                return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+            hdata[i] = '\0';
+            value = i + 1;
+            ++st;
+            break;
+        case 3:
+            if (cc == '\t' || cc == '\r' || cc == '\n') {
+                hdata[i] = '\0';
+                
+                if (strcmp(&hdata[tag], "VN") == 0)
+                    self->version = &hdata[value];
+                
+                ++st;
+                ws = 1;
+            }
+            break;
+        case 4:
+            if (cc == '@')
+                goto DONE;
+            tag = i;
+            st = 1;
+            break;
+        }
+    }
+    if (st == 4) {
+DONE:
+        *used = i;
+        return 0;
+    }
+    return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+}
+
+static rc_t ParseSQ(BAMFile *self, char hdata[], size_t hlen, unsigned *used, unsigned const rs_by_name[])
+{
+    unsigned i;
+    unsigned tag;
+    unsigned value;
+    int st = 0;
+    int ws = 1;
+    BAMRefSeq rs;
+    
+    memset(&rs, 0, sizeof(rs));
+    
+    for (i = 0; i < hlen; ++i) {
+        char const cc = hdata[i];
+        
+        if (ws && isspace(cc))
+            continue;
+        ws = 0;
+        
+        switch (st) {
+        case 0:
+            tag = i;
+            ++st;
+            break;
+        case 1:
+            if (isspace(cc))
+                return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+            ++st;
+            break;
+        case 2:
+#define HACKAMATIC 1
+#if HACKAMATIC
+            if (cc != ':') {
+                if (i + 1 >= hlen || hdata[i+1] != ':')
+                    return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+                else
+                    ++i;
+            }
+#else
+            if (cc != ':')
+                return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+#endif
+            hdata[i] = '\0';
+            value = i + 1;
+            ++st;
+            break;
+        case 3:
+            if (cc == '\t' || cc == '\r' || cc == '\n') {
+                unsigned j;
+                
+                hdata[i] = '\0';
+                
+                while (value < i && isspace(hdata[value]))
+                    ++value;
+                for (j = i; value < j && isspace(hdata[j - 1]); )
+                    hdata[--j] = '\0';
+                
+                if (strcmp(&hdata[tag], "SN") == 0)
+                    rs.name = &hdata[value];
+                else if (strcmp(&hdata[tag], "LN") == 0)
+                    rs.length = strtou64(&hdata[value], NULL, 10);
+                else if (strcmp(&hdata[tag], "AS") == 0)
+                    rs.assemblyId = &hdata[value];
+#if HACKAMATIC
+                else if (strcmp(&hdata[tag], "M5") == 0 || strcmp(&hdata[tag], "MD5") == 0)
+#else
+                else if (strcmp(&hdata[tag], "M5") == 0)
+#endif
+#undef HACKAMATIC
+                {
+                    unsigned len = j - value;
+                    
+                    if ((hdata[value] == '\'' || hdata[value] == '"') && hdata[value + len - 1] == hdata[value]) {
+                        ++value;
+                        len -= 2;
+                    }
+                    if (len == 32) {
+                        rs.checksum = &rs.checksum_array[0];
+                        for (j = 0; j != 16; ++j) {
+                            int const ch1 = toupper(hdata[value + j * 2 + 0]);
+                            int const ch2 = toupper(hdata[value + j * 2 + 1]);
+                            
+                            if (isxdigit(ch1) && isxdigit(ch2)) {
+                                rs.checksum_array[j] =
+                                    ((ch1 > '9' ? (ch1 - ('A' - 10)) : (ch1 - '0')) << 4) +
+                                     (ch2 > '9' ? (ch2 - ('A' - 10)) : (ch2 - '0'));
+                            }
+                            else {
+                                rs.checksum = NULL;
+                                break;
+                            }
+                        }
+                    }
+                }
+                else if (strcmp(&hdata[tag], "UR") == 0)
+                    rs.uri = &hdata[value];
+                else if (strcmp(&hdata[tag], "SP") == 0)
+                    rs.species = &hdata[value];
+                
+                ++st;
+                ws = 1;
+            }
+            break;
+        case 4:
+            if (cc == '@')
+                goto DONE;
+            tag = i;
+            st = 1;
+            break;
+        }
+    }
+DONE:
+    if (st == 4) {
+        unsigned f = 0;
+        unsigned e = self->refSeqs;
+        
+        if (rs.name == NULL) /* required tags */
+            return RC(rcAlign, rcFile, rcParsing, rcConstraint, rcViolated);
+        
+        while (f < e) {
+            unsigned const m = (f + e) >> 1;
+            BAMRefSeq *const x = &self->refSeq[rs_by_name[m]];
+            int const cmp = strcmp(rs.name, x->name);
+            
+            if (cmp < 0)
+                e = m;
+            else if (cmp > 0)
+                f = m + 1;
+            else {
+                x->assemblyId = rs.assemblyId;
+                x->uri = rs.uri;
+                x->species = rs.species;
+                if (rs.checksum) {
+                    x->checksum = &x->checksum_array[0];
+                    memmove(x->checksum_array, rs.checksum_array, 16);
+                }
+                else
+                    x->checksum = NULL;
+                break;
+            }
+        }
+        *used = i;
+        return 0;
+    }
+    return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+}
+
+static rc_t ParseRG(BAMFile *self, char hdata[], size_t hlen, unsigned *used, BAMReadGroup *dst)
+{
+    unsigned i;
+    unsigned tag;
+    unsigned value;
+    int st = 0;
+    int ws = 1;
+#if _DEBUGGING
+/*    char const *cur = hdata; */
+#endif
+    
+    memset(dst, 0, sizeof(*dst));
+    
+    for (i = 0; i < hlen; ++i) {
+        char const cc = hdata[i];
+        
+        if (ws && isspace(cc))
+            continue;
+        ws = 0;
+        
+        switch (st) {
+        case 0:
+            tag = i;
+            ++st;
+            break;
+        case 1:
+            if (isspace(cc))
+                return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+            ++st;
+            break;
+        case 2:
+            if (cc != ':')
+                return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+#if _DEBUGGING
+            /* cur = hdata + i + 1; */
+#endif
+            hdata[i] = '\0';
+            value = i + 1;
+            ++st;
+            break;
+        case 3:
+            if (cc == '\t' || cc == '\r' || cc == '\n') {
+                unsigned j = i;
+#if _DEBUGGING
+                /* cur = hdata + i + 1; */
+#endif
+                hdata[i] = '\0';
+
+                while (value < i && isspace(hdata[value]))
+                    ++value;
+                while (value < j && isspace(hdata[j - 1]))
+                    hdata[--j] = '\0';
+                
+                if ((hdata[value] == '\"' || hdata[value] == '\'') && hdata[value] == hdata[j - 1]) {
+                    ++value;
+                    hdata[j - 1] = '\0';
+                }
+                if (strcmp(&hdata[tag], "ID") == 0)
+                    dst->name = &hdata[value];
+                else if (strcmp(&hdata[tag], "SM") == 0)
+                    dst->sample = &hdata[value];
+                else if (strcmp(&hdata[tag], "LB") == 0)
+                    dst->library = &hdata[value];
+                else if (strcmp(&hdata[tag], "DS") == 0)
+                    dst->description = &hdata[value];
+                else if (strcmp(&hdata[tag], "PU") == 0)
+                    dst->unit = &hdata[value];
+                else if (strcmp(&hdata[tag], "PI") == 0)
+                    dst->insertSize = &hdata[value];
+                else if (strcmp(&hdata[tag], "CN") == 0)
+                    dst->center = &hdata[value];
+                else if (strcmp(&hdata[tag], "DT") == 0)
+                    dst->runDate = &hdata[value];
+                else if (strcmp(&hdata[tag], "PL") == 0)
+                    dst->platform = &hdata[value];
+                
+                ++st;
+                ws = 1;
+            }
+            break;
+        case 4:
+            if (cc == '@')
+                goto DONE;
+            tag = i;
+            st = 1;
+            break;
+        }
+    }
+    if (st == 4) {
+DONE:
+        *used = i;
+        if (dst->name == NULL) /* required */
+            return RC(rcAlign, rcFile, rcParsing, rcConstraint, rcViolated);
+        return 0;
+    }
+    return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+}
+
+static rc_t ParseHeader(BAMFile *self, char hdata[], size_t hlen, unsigned const rs_by_name[]) {
+    unsigned rg = 0;
+    unsigned i;
+    unsigned tag;
+    int st = 0;
+    int ws = 1;
+    unsigned used;
+    rc_t rc;
+    
+    for (i = 0; i < hlen; ++i) {
+        char const cc = hdata[i];
+        
+        if (ws && isspace(cc))
+            continue;
+        ws = 0;
+        
+        switch (st) {
+        case 0:
+            if (cc == '@')
+                ++st;
+            else
+                return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+            break;
+        case 1:
+            if (isspace(cc))
+                return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+            tag = i;
+            ++st;
+            break;
+        case 2:
+            if (isspace(cc)) {
+                hdata[i] = '\0';
+                if (i - tag == 2) {
+                    if (strcmp(&hdata[tag], "HD") == 0) {
+                        rc = ParseHD(self, &hdata[i + 1], hlen - i - 1, &used);
+                        if (rc) return rc;
+                        i += used;
+                        st = 0;
+                    }
+                    else if (strcmp(&hdata[tag], "SQ") == 0) {
+                        rc = ParseSQ(self, &hdata[i + 1], hlen - i - 1, &used, rs_by_name);
+                        if (rc) return rc;
+                        i += used;
+                        st = 0;
+                    }
+                    else if (strcmp(&hdata[tag], "RG") == 0) {
+                        rc = ParseRG(self, &hdata[i + 1], hlen - i - 1, &used, &self->readGroup[rg]);
+                        if (GetRCObject(rc) == rcConstraint && GetRCState(rc) == rcViolated) {
+                            (void)LOGERR(klogWarn, rc, "Read Group is missing ID in BAM header");
+                            rc = 0;
+                            if (self->readGroups) --self->readGroups;
+                        }
+                        else if (rc)
+                            return rc;
+                        else
+                            ++rg;
+                        i += used;
+                        st = 0;
+                    }
+                }
+                if (st == 2) {
+                    ++st;
+                    ws = 0;
+                }
+            }
+            else if (i - tag > 2)
+                ++st;
+            break;
+        case 3:
+            if (cc == '\r' || cc == '\n') {
+                st = 0;
+                ws = 1;
+            }
+            break;
+        }
+    }
+    ksort( self->readGroup, self->readGroups, sizeof(self->readGroup[0]), comp_ReadGroup, NULL );
+    for (rg = 0; rg != self->readGroups; ++rg) {
+        if (rg > 0 && strcmp(self->readGroup[rg - 1].name, self->readGroup[rg].name) == 0)
+            return RC(rcAlign, rcFile, rcParsing, rcConstraint, rcViolated);  /* name must be unique */
+        self->readGroup[rg].id = rg;
+    }
+    for (i = 0; i < self->refSeqs; ++i) {
+        if (self->refSeq[i].length == 0) {
+            (void)PLOGMSG(klogWarn, (klogWarn, "Reference '$(ref)' has zero length", "ref=%s", self->refSeq[i].name));
+        }
+    }
+    
+    return 0;
+}
+
+static rc_t CountReadGroups(char const txt[], size_t len, unsigned *reads) {
+    const char *const endp = txt + len;
+    
+    *reads = 0;
+    
+    do {
+        while (txt != endp && isspace(*txt))
+            ++txt;
+        if (txt == endp || txt + 3 >= endp)
+            break;
+        
+        if (txt[0] == '@' && txt[1] == 'R' && txt[2] == 'G')
+            ++*reads;
+        
+        txt = memchr(txt, '\n', endp - txt);
+    } while (txt);
+    return 0;
+}
+
+static rc_t ReadMagic(BAMFile *self)
+{
+    uint8_t sig[4];
+    rc_t rc = BAMFileReadn(self, 4, sig);
+    
+    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("BAM signature: '%c%c%c' %u\n", sig[0], sig[1], sig[2], sig[3]));
+    if (rc == 0 && (sig[0] != 'B' || sig[1] != 'A' || sig[2] != 'M' || sig[3] != 1))
+        rc = RC(rcAlign, rcFile, rcReading, rcHeader, rcBadVersion);
+    return rc;
+}
+
+static rc_t ReadHeaders(BAMFile *self,
+                        char **headerText, size_t *headerTextLen,
+                        uint8_t **refData, unsigned *numrefs)
+{
+    unsigned hlen;
+    char *htxt = NULL;
+    unsigned nrefs;
+    uint8_t *rdat = NULL;
+    unsigned rdsz;
+    unsigned rdms;
+    unsigned i;
+    int32_t i32;
+    rc_t rc = BAMFileReadI32(self, &i32);
+    
+    if (rc) return rc;
+
+    if (i32 < 0) {
+        rc = RC(rcAlign, rcFile, rcReading, rcHeader, rcInvalid);
+        goto BAILOUT;
+    }
+    hlen = i32;
+    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("BAM Header text size: %u\n", hlen));
+    if (hlen) {
+        htxt = malloc(hlen + 1);
+        if (htxt == NULL) {
+            rc = RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+            goto BAILOUT;
+        }
+        
+        rc = BAMFileReadn(self, hlen, (uint8_t *)htxt); if (rc) goto BAILOUT;
+        htxt[hlen] = '\0';
+    }
+    rc = BAMFileReadI32(self, &i32); if (rc) goto BAILOUT;
+    if (i32 < 0) {
+        rc = RC(rcAlign, rcFile, rcReading, rcHeader, rcInvalid);
+        goto BAILOUT;
+    }
+    nrefs = i32;
+    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("BAM Header reference count: %u\n", nrefs));
+    if (nrefs) {
+        rdms = nrefs * 16;
+        if (rdms < 4096)
+            rdms = 4096;
+        rdat = malloc(rdms);
+        if (rdat == NULL) {
+            rc = RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+            goto BAILOUT;
+        }
+        for (i = rdsz = 0; i < nrefs; ++i) {
+            rc = BAMFileReadI32(self, &i32); if (rc) goto BAILOUT;
+            if (i32 <= 0) {
+                rc = RC(rcAlign, rcFile, rcReading, rcHeader, rcInvalid);
+                goto BAILOUT;
+            }
+            if (rdsz + i32 + 8 > rdms) {
+                void *tmp;
+                
+                do { rdms <<= 1; } while (rdsz + i32 + 8 > rdms);
+                tmp = realloc(rdat, rdms);
+                if (tmp == NULL) {
+                    rc = RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+                    goto BAILOUT;
+                }
+                rdat = tmp;
+            }
+            memmove(rdat + rdsz, &i32, 4);
+            rdsz += 4;
+            rc = BAMFileReadn(self, i32, &rdat[rdsz]); if (rc) goto BAILOUT;
+            rdsz += i32;
+            rc = BAMFileReadI32(self, &i32); if (rc) goto BAILOUT;
+            memmove(rdat + rdsz, &i32, 4);
+            rdsz += 4;
+        }
+    }
+    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("BAM Header reference size: %u\n", rdsz));
+    
+    *headerText = htxt;
+    *headerTextLen = hlen;
+    *refData = rdat;
+    *numrefs = nrefs;
+    return 0;
+    
+BAILOUT:
+    if (htxt)
+        free(htxt);
+    if (rdat)
+        free(rdat);
+    
+    return rc;
+}
+
+static int64_t CC comp_RefSeqName(const void *A, const void *B, void *ignored) {
+    BAMFile const *self = (BAMFile const *)ignored;
+    unsigned const a = *(unsigned const *)A;
+    unsigned const b = *(unsigned const *)B;
+    
+    return strcmp(self->refSeq[a].name, self->refSeq[b].name);
+}
+
+static rc_t ProcessHeader(BAMFile *self, char const headerText[])
+{
+    unsigned *rs_by_name = NULL;
+    unsigned i;
+    unsigned cp;
+    char *htxt;
+    uint8_t *rdat;
+    size_t hlen;
+    unsigned nrefs;
+    rc_t rc = ReadMagic(self);
+
+    if (rc) return rc;
+
+    rc = ReadHeaders(self, &htxt, &hlen, &rdat, &nrefs);
+    if (rc) return rc;
+    
+    self->fpos_first = self->fpos_cur;
+    self->ucfirst = self->bufCurrent;
+    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("BAM Data records start at: %lu+%u\n", self->ucfirst, self->fpos_first));
+
+    if (headerText) {
+        free(htxt);
+        hlen = string_size( headerText );
+        htxt = malloc(hlen + 1);
+        if (htxt == NULL) {
+            free(rdat);
+            return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+        }
+        memmove(htxt, headerText, hlen + 1);
+    }
+    
+    self->headerData2 = rdat;
+    if (hlen) {
+        self->header = htxt;
+        self->headerData1 = malloc(hlen + 1);
+        if (self->headerData1 == NULL)
+            return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+        memmove(self->headerData1, self->header, hlen + 1);
+    }
+    else {
+        htxt = malloc(1);
+        htxt[0] = '\0';
+        self->header = htxt;
+        self->headerData1 = NULL;
+    }
+    self->refSeqs = nrefs;
+    if (nrefs) {
+        self->refSeq = calloc(nrefs, sizeof(self->refSeq[0]));
+        if (self->refSeq == NULL)
+            return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+        
+        rs_by_name = calloc(nrefs, sizeof(rs_by_name[0]));
+        if (rs_by_name == NULL)
+            return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+        
+        for (i = cp = 0; i < nrefs; ++i) {
+            uint32_t nlen;
+            uint32_t rlen;
+            
+            rs_by_name[i] = i;
+            self->refSeq[i].id = i;
+            memmove(&nlen, &self->headerData2[cp], 4);
+            cp += 4;
+            self->refSeq[i].name = (char const *)&self->headerData2[cp];
+            cp += nlen;
+            memmove(&rlen, &self->headerData2[cp], 4);
+            self->headerData2[cp] = 0;
+            cp += 4;
+            self->refSeq[i].length = rlen;
+        }
+        ksort((void *)rs_by_name, self->refSeqs, sizeof(rs_by_name[0]), comp_RefSeqName, self);
+    }
+    if (self->headerData1) {
+        rc = CountReadGroups(self->headerData1, hlen, &self->readGroups);
+        if (rc == 0) {
+            self->readGroup = calloc(self->readGroups, sizeof(self->readGroup[0]));
+            if (self->readGroup != NULL)
+                rc = ParseHeader(self, self->headerData1, hlen, rs_by_name);
+            else
+                rc = RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+        }
+    }
+    if (rs_by_name != NULL)
+        free((void *)rs_by_name);
+    
+    return rc;
+}
+
+/* MARK: BAM File destructor */
+
+static rc_t BAMIndexWhack(const BAMIndex *);
+
+static rc_t BAMFileWhack(BAMFile *self) {
+    if (self->refSeq)
+        free(self->refSeq);
+    if (self->readGroup)
+        free(self->readGroup);
+    if (self->header)
+        free((void *)self->header);
+    if (self->headerData1)
+        free((void *)self->headerData1);
+    if (self->headerData2)
+        free((void *)self->headerData2);
+    if (self->ndx)
+        BAMIndexWhack(self->ndx);
+    if (self->nocopy)
+        free(self->nocopy);
+    if (self->vt.FileWhack)
+        self->vt.FileWhack(&self->file);
+
+    return 0;
+}
+
+/* MARK: BAM File constructors */
+
+/* file is retained */
+static rc_t BAMFileMakeWithKFileAndHeader(BAMFile const **cself,
+                                          KFile const *file,
+                                          char const *headerText,
+                                          bool threaded)
+{
+    BAMFile *self = calloc(1, sizeof(*self));
+    rc_t rc;
+    
+    if (self == NULL)
+        return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+    
+    KRefcountInit(&self->refcount, 1, "BAMFile", "new", "");
+#ifndef WINDOWS
+    if (threaded)
+        rc = BGZThreadFileInit(&self->file.thread, file, &self->vt);
+    else
+#endif
+        rc = BGZFileInit(&self->file.plain, file, &self->vt);
+
+    if (rc == 0) {
+        rc = ProcessHeader(self, headerText);
+        if (rc == 0) {
+            *cself = self;
+            return 0;
+        }
+    }
+    BAMFileWhack(self);
+    return rc;
+}
+
+/* file is retained */
+LIB_EXPORT rc_t CC BAMFileMakeWithKFile(const BAMFile **cself, const KFile *file)
+{
+    return BAMFileMakeWithKFileAndHeader(cself, file, NULL, false);
+}
+
+LIB_EXPORT rc_t CC BAMFileVMakeWithDir(const BAMFile **result,
+                                         const KDirectory *dir,
+                                         const char *path,
+                                         va_list args
+                                         )
+{
+    rc_t rc;
+    const KFile *kf;
+    
+    if (result == NULL)
+        return RC(rcAlign, rcFile, rcOpening, rcParam, rcNull);
+    *result = NULL;
+    rc = KDirectoryVOpenFileRead(dir, &kf, path, args);
+    if (rc == 0) {
+        rc = BAMFileMakeWithKFile(result, kf);
+        KFileRelease(kf);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC BAMFileMakeWithDir(const BAMFile **result,
+                                        const KDirectory *dir,
+                                        const char *path, ...
+                                        )
+{
+    va_list args;
+    rc_t rc;
+    
+    va_start(args, path);
+    rc = BAMFileVMakeWithDir(result, dir, path, args);
+    va_end(args);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC BAMFileMake(const BAMFile **cself, const char *path, ...)
+{
+    KDirectory *dir;
+    va_list args;
+    rc_t rc;
+    
+    if (cself == NULL)
+        return RC(rcAlign, rcFile, rcOpening, rcParam, rcNull);
+    *cself = NULL;
+    
+    rc = KDirectoryNativeDir(&dir);
+    if (rc) return rc;
+    va_start(args, path);
+    rc = BAMFileVMakeWithDir(cself, dir, path, args);
+    va_end(args);
+    KDirectoryRelease(dir);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC BAMFileMakeWithHeader ( const BAMFile **cself,
+                                          char const headerText[],
+                                          char const path[], ... )
+{
+    KDirectory *dir;
+    va_list args;
+    rc_t rc;
+    const KFile *kf;
+    
+    if (cself == NULL)
+        return RC(rcAlign, rcFile, rcOpening, rcParam, rcNull);
+    *cself = NULL;
+    
+    rc = KDirectoryNativeDir(&dir);
+    if (rc) return rc;
+    va_start(args, path);
+    rc = KDirectoryVOpenFileRead(dir, &kf, path, args);
+    if (rc == 0) {
+        rc = BAMFileMakeWithKFileAndHeader(cself, kf, headerText, false);
+        KFileRelease(kf);
+    }
+    va_end(args);
+    KDirectoryRelease(dir);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC BAMFileMakeWithVPath(const BAMFile **cself, const VPath *path)
+{
+    VFSManager *vfs = NULL;
+    KFile const *fp = NULL;
+    rc_t rc = 0;
+
+    rc = VFSManagerMake(&vfs);
+    if (rc) return rc;
+
+    rc = VFSManagerOpenFileRead(vfs, &fp, path);
+    VFSManagerRelease(vfs);
+    if (rc) return rc;
+
+    rc = BAMFileMakeWithKFile(cself, fp);
+    if (rc) return rc;
+
+    KFileRelease(fp);
+    return 0;
+}
+
+/* MARK: BAM File ref-counting */
+
+LIB_EXPORT rc_t CC BAMFileAddRef(const BAMFile *cself) {
+    if (cself != NULL)
+        KRefcountAdd(&cself->refcount, "BAMFile");
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMFileRelease(const BAMFile *cself) {
+    rc_t rc = 0;
+    BAMFile *self = (BAMFile *)cself;
+    
+    if (cself != NULL) {
+        if (KRefcountDrop(&self->refcount, "BAMFile") == krefWhack) {
+            rc = BAMFileWhack(self);
+            free(self);
+        }
+    }
+    return rc;
+}
+
+/* MARK: BAM File positioning */
+
+LIB_EXPORT float CC BAMFileGetProportionalPosition(const BAMFile *self)
+{
+    return self->vt.FileProPos(&self->file);
+}
+
+LIB_EXPORT rc_t CC BAMFileGetPosition(const BAMFile *self, BAMFilePosition *pos) {
+    *pos = (self->fpos_cur << 16) | self->bufCurrent;
+    return 0;
+}
+
+static rc_t BAMFileSetPositionInt(const BAMFile *cself, uint64_t fpos, uint16_t bpos)
+{
+    rc_t rc;
+    BAMFile *self = (BAMFile *)cself;
+    
+    if (cself->fpos_first > fpos || fpos > cself->vt.FileGetSize(&cself->file) ||
+        (fpos == cself->fpos_first && bpos < cself->ucfirst))
+    {
+        return RC(rcAlign, rcFile, rcPositioning, rcParam, rcInvalid);
+    }
+    if (cself->fpos_cur == fpos) {
+        if (bpos <= cself->bufSize) {
+            self->eof = false;
+            self->bufCurrent = bpos;
+            return 0;
+        }
+        return RC(rcAlign, rcFile, rcPositioning, rcParam, rcInvalid);
+    }
+    rc = self->vt.FileSetPos(&self->file, fpos);
+    if (rc == 0) {
+        self->eof = false;
+        self->bufSize = 0; /* force re-read */
+        self->bufCurrent = bpos;
+        self->fpos_cur = fpos;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC BAMFileSetPosition(const BAMFile *cself, const BAMFilePosition *pos)
+{
+    return BAMFileSetPositionInt(cself, *pos >> 16, (uint16_t)(*pos));
+}
+
+LIB_EXPORT rc_t CC BAMFileRewind(const BAMFile *cself)
+{
+    return BAMFileSetPositionInt(cself, cself->fpos_first, cself->ucfirst);
+}
+
+static void BAMFileAdvance(BAMFile *const self, unsigned distance)
+{
+    self->bufCurrent += distance;
+    if (self->bufCurrent == self->bufSize) {
+        self->fpos_cur = self->vt.FileGetPos(&self->file);
+        self->bufCurrent = 0;
+        self->bufSize = 0;
+    }
+}
+
+/* MARK: BAM Alignment contruction */
+
+static int TagTypeSize(int const type)
+{
+    switch (type) {
+        case dt_ASCII:      /* A */
+        case dt_INT8:       /* c */
+        case dt_UINT8:      /* C */
+            return 1;
+
+        case dt_INT16:      /* s */
+        case dt_UINT16:     /* S */
+            return 2;
+
+        case dt_INT:        /* i */
+        case dt_UINT:       /* I */
+        case dt_FLOAT32:    /* f */
+            return 4;
+#if 0
+        case dt_FLOAT64:    /* d */
+            return 8;
+#endif
+        case dt_CSTRING:    /* Z */
+        case dt_HEXSTRING:  /* H */
+            return -'S';
+
+        case dt_NUM_ARRAY:  /* B */
+            return -'A';
+    }
+    return 0;
+}
+
+static void ColorCheck(BAMAlignment *const self, char const tag[2], unsigned const len)
+{
+    if (tag[0] == 'C' && len != 0) {
+        int const ch = tag[1];
+        int const flag = ch == 'Q' ? 2 : ch == 'S' ? 1 : 0;
+        
+        if (flag)
+            self->hasColor ^= (len << 2) | flag;
+    }
+}
+
+static rc_t ParseOptData(BAMAlignment *const self, size_t const maxsize,
+                         size_t const xtra, size_t const datasize)
+{
+    size_t const maxExtra = (maxsize - (sizeof(*self) - sizeof(self->extra))) / sizeof(self->extra[0]);
+    char const *const base = (char const *)self->data->raw;
+    unsigned i = 0;
+    unsigned len;
+    unsigned offset;
+    
+    self->numExtra = 0;
+    for (len = 0, offset = (unsigned)xtra; offset < datasize; offset += len) {
+        int const valuelen1 = TagTypeSize(base[offset + 2]);
+        unsigned valuelen;
+        
+        if (valuelen1 < 0) {
+            char const *const value = &base[offset + 3];
+            
+            if (-valuelen1 == 'S') {
+                valuelen = 0;
+                while (value[valuelen] != '\0') {
+                    ++valuelen;
+                    if (offset + valuelen >= datasize) {
+                        rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+                        return rc;
+                    }
+                }
+                ColorCheck(self, base + offset, valuelen);
+                ++valuelen;
+            }
+            else {
+                int const elem_size = TagTypeSize(value[0]);
+                
+                assert(-valuelen1 == 'A');
+                if (elem_size <= 0) {
+                    rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcUnexpected);
+                    return rc;
+                }
+                else {
+                    int const elem_count = LE2HI32(&value[1]);
+                    
+                    valuelen = elem_size * elem_count + 1 + 4;
+                    if (offset + valuelen >= datasize) {
+                        rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+                        return rc;
+                    }
+                }
+            }
+        }
+        else if (valuelen1 == 0) {
+            rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcUnexpected);
+            return rc;
+        }
+        else
+            valuelen = valuelen1;
+        
+        len = valuelen + 3;
+        if (i < maxExtra) {
+            self->extra[i].offset = offset;
+            self->extra[i].size   = len;
+        }
+        ++i;
+    }
+    self->numExtra = i;
+    if (2 <= i && i <= maxExtra)
+        ksort(self->extra, i, sizeof(self->extra[0]), OptTag_sort, self);
+
+    return 0;
+}
+
+static rc_t ParseOptDataLog(BAMAlignment *const self, unsigned const maxsize,
+                            unsigned const xtra, unsigned const datasize)
+{
+    unsigned const maxExtra = (maxsize - (sizeof(*self) - sizeof(self->extra))) / sizeof(self->extra[0]);
+    char const *const base = (char const *)self->data->raw;
+    unsigned i = 0;
+    unsigned len;
+    unsigned offset;
+    
+    self->numExtra = 0;
+    for (len = 0, offset = (unsigned)xtra; offset < datasize; offset += len) {
+        int const type = base[offset + 2];
+        int const valuelen1 = TagTypeSize(type);
+        unsigned valuelen;
+        
+        if (valuelen1 > 0)
+            valuelen = valuelen1;
+        else if (valuelen1 < 0) {
+            char const *const value = &base[offset + 3];
+            
+            if (-valuelen1 == 'S') {
+                valuelen = 0;
+                while (value[valuelen] != '\0') {
+                    ++valuelen;
+                    if (offset + valuelen >= datasize) {
+                        rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+                        (void)LOGERR(klogErr, rc,
+                                     "Parsing BAM optional fields: "
+                                     "unterminated string");
+                        return rc;
+                    }
+                }
+                ColorCheck(self, base + offset, valuelen);
+                ++valuelen;
+            }
+            else {
+                int const elem_type = value[0];
+                int const elem_size = TagTypeSize(elem_type);
+                
+                assert(-valuelen1 == 'A');
+                if (elem_size <= 0) {
+                    rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcUnexpected);
+                    (void)LOGERR(klogErr, rc,
+                                 "Parsing BAM optional fields: "
+                                 "unknown array type");
+                    return rc;
+                }
+                else {
+                    int const elem_count = LE2HI32(&value[1]);
+                    
+                    valuelen = elem_size * elem_count + 1 + 4;
+                    if (offset + valuelen >= datasize) {
+                        rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+                        (void)LOGERR(klogErr, rc,
+                                     "Parsing BAM optional fields: "
+                                     "array too big");
+                        return rc;
+                    }
+                }
+            }
+        }
+        else {
+            rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcUnexpected);
+            (void)LOGERR(klogErr, rc,
+                                    "Parsing BAM optional fields: "
+                                    "unknown type");
+            return rc;
+        }
+        
+        len = valuelen + 3;
+        if (i < maxExtra) {
+            self->extra[i].offset = offset;
+            self->extra[i].size   = len;
+        }
+        ++i;
+    }
+    self->numExtra = i;
+    if (2 <= i && i <= maxExtra)
+        ksort(self->extra, i, sizeof(self->extra[0]), OptTag_sort, self);
+    
+    return 0;
+}
+
+static unsigned CC BAMAlignmentSize(unsigned const max_extra_tags)
+{
+    BAMAlignment const *const y = NULL;
+    
+    return sizeof(*y) + (max_extra_tags ? max_extra_tags - 1 : 0) * sizeof(y->extra);
+}
+
+static unsigned BAMAlignmentSetOffsets(BAMAlignment *const self)
+{
+    unsigned const nameLen = getReadNameLength(self);
+    unsigned const cigCnt  = getCigarCount(self);
+    unsigned const readLen = getReadLen(self);
+    unsigned const cigar   = (unsigned)(&((struct bam_alignment_s const *)NULL)->read_name[nameLen] - (const char *)NULL);
+    unsigned const seq     = cigar + 4 * cigCnt;
+    unsigned const qual    = seq + (readLen + 1) / 2;
+    unsigned const xtra    = qual + readLen;
+    
+    self->cigar = cigar;
+    self->seq   = seq;
+    self->qual  = qual;
+    
+    return xtra;
+}
+
+static bool BAMAlignmentInit(BAMAlignment *const self, unsigned const maxsize,
+                             unsigned const datasize, void const *const data)
+{
+    memset(self, 0, sizeof(*self));
+    self->data = data;
+    self->datasize = datasize;
+    {
+        unsigned const xtra = BAMAlignmentSetOffsets(self);
+        
+        if (   datasize >= xtra
+            && datasize >= self->cigar
+            && datasize >= self->seq
+            && datasize >= self->qual)
+        {
+            rc_t const rc = ParseOptData(self, maxsize, xtra, datasize);
+
+            if (rc == 0)
+                return true;
+        }
+        return false;
+    }
+}
+
+static bool BAMAlignmentInitLog(BAMAlignment *const self, unsigned const maxsize,
+                                unsigned const datasize, void const *const data)
+{
+    memset(self, 0, sizeof(*self));
+    self->data = data;
+    self->datasize = datasize;
+    {
+        unsigned const xtra = BAMAlignmentSetOffsets(self);
+        
+        if (   datasize >= xtra
+            && datasize >= self->cigar
+            && datasize >= self->seq
+            && datasize >= self->qual)
+        {
+            rc_t const rc = ParseOptDataLog(self, maxsize, xtra, datasize);
+            
+            if (rc == 0) {
+                DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("{"
+                                                                "\"BAM record\": "
+                                                                "{ "
+                                                                    "\"size\": %u, "
+                                                                    "\"name length\": %u, "
+                                                                    "\"cigar count\": %u, "
+                                                                    "\"read length\": %u, "
+                                                                    "\"extra count\": %u "
+                                                                "}"
+                                                            "}\n",
+                                                            (unsigned)datasize,
+                                                            (unsigned)getReadNameLength(self),
+                                                            (unsigned)getCigarCount(self),
+                                                            (unsigned)getReadLen(self),
+                                                            (unsigned)self->numExtra));
+                return true;
+            }
+        }
+        DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("{"
+                                                        "\"BAM record\": "
+                                                        "{ "
+                                                            "\"size\": %u, "
+                                                            "\"name length\": %u, "
+                                                            "\"cigar count\": %u, "
+                                                            "\"read length\": %u "
+                                                        "}"
+                                                    "}\n",
+                                                    (unsigned)datasize,
+                                                    (unsigned)getReadNameLength(self),
+                                                    (unsigned)getCigarCount(self),
+                                                    (unsigned)getReadLen(self)));
+        return false;
+    }
+}
+
+static void BAMAlignmentLogParseError(BAMAlignment const *self)
+{
+    char const *const reason = self->cigar > self->datasize ? "BAM Record CIGAR too long"
+                             : self->seq   > self->datasize ? "BAM Record SEQ too long"
+                             : self->qual  > self->datasize ? "BAM Record QUAL too long"
+                             : self->qual + getReadLen(self) > self->datasize ? "BAM Record EXTRA too long"
+                             : "BAM Record EXTRA parsing failure";
+    
+    LOGERR(klogErr, SILENT_RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid), reason);
+}
+
+/* MARK: BAM Alignment readers */
+
+/* returns
+ *  (rcAlign, rcFile, rcReading, rcBuffer, rcNotAvailable)
+ * or
+ *  (rcAlign, rcFile, rcReading, rcBuffer, rcInsufficient)
+ * if should read with copy
+ */
+static
+rc_t BAMFileReadNoCopy(BAMFile *const self, unsigned actsize[], BAMAlignment rhs[],
+                       unsigned const maxsize)
+{
+    unsigned const maxPeek = BAMFileMaxPeek(self);
+    bool isgood;
+
+    *actsize = 0;
+    
+    if (maxPeek == 0) {
+        rc_t const rc = BAMFileFillBuffer(self);
+
+        if (rc == 0)
+            return BAMFileReadNoCopy(self, actsize, rhs, maxsize);
+
+        if ( GetRCObject( rc ) == (enum RCObject)rcData && GetRCState( rc ) == rcInsufficient )
+        {
+            self->eof = true;
+            return SILENT_RC(rcAlign, rcFile, rcReading, rcRow, rcNotFound);
+        }
+        return rc;
+    }
+    if (maxPeek < 4)
+        return SILENT_RC(rcAlign, rcFile, rcReading, rcBuffer, rcNotAvailable);
+    else {
+        int32_t const i32 = BAMFilePeekI32(self);
+
+        if (i32 <= 0)
+            return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+        
+        if (maxPeek < ( uint32_t ) i32 + 4)
+            return SILENT_RC(rcAlign, rcFile, rcReading, rcBuffer, rcNotAvailable);
+        
+        isgood = BAMAlignmentInitLog(rhs, maxsize, i32, BAMFilePeek(self, 4));
+        rhs[0].parent = self;
+        KRefcountInit(&rhs->refcount, 1, "BAMAlignment", "ReadNoCopy", "");
+    }
+    *actsize = BAMAlignmentSize(rhs[0].numExtra);
+    if (isgood && *actsize > maxsize)
+        return SILENT_RC(rcAlign, rcFile, rcReading, rcBuffer, rcInsufficient);
+
+    BAMFileAdvance(self, 4 + rhs->datasize);
+    return isgood ? 0 : RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid);
+}
+
+static
+unsigned BAMAlignmentSizeFromData(unsigned const datasize, void const *data)
+{
+    BAMAlignment temp;
+    
+    BAMAlignmentInit(&temp, sizeof(temp), datasize, data);
+    
+    return BAMAlignmentSize(temp.numExtra);
+}
+
+static bool BAMAlignmentIsEmpty(BAMAlignment const *const self)
+{
+    if (getReadNameLength(self) == 0)
+        return true;
+    if (self->hasColor == 3)
+        return false;
+    if (getReadLen(self) != 0)
+        return false;
+    if (getCigarCount(self) != 0)
+        return false;
+    return true;
+}
+
+static
+rc_t BAMFileReadCopy(BAMFile *const self, BAMAlignment const *rslt[], bool const log)
+{
+    void *storage;
+    void const *data;
+    unsigned datasize;
+    rc_t rc;
+    
+    rslt[0] = NULL;
+    {
+        int32_t i32;
+
+        rc = BAMFileReadI32(self, &i32);
+        if ( rc != 0 )
+        {
+            if ( GetRCObject( rc ) == (enum RCObject)rcData && GetRCState( rc ) == rcInsufficient )
+            {
+                self->eof = true;
+                rc = RC( rcAlign, rcFile, rcReading, rcRow, rcNotFound );
+            }
+            return rc;
+        }
+        if (i32 <= 0)
+            return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+        
+        datasize = i32;
+    }
+    if (BAMFileMaxPeek(self) < datasize) {
+        data = storage = malloc(datasize);
+        if (storage == NULL)
+            return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+        
+        rc = BAMFileReadn(self, datasize, storage);
+    }
+    else {
+        storage = NULL;
+        data = (bam_alignment *)&self->buffer[self->bufCurrent];
+        
+        BAMFileAdvance(self, datasize);
+    }
+    if (rc == 0) {
+        unsigned const rsltsize = BAMAlignmentSizeFromData(datasize, data);
+        BAMAlignment *const y = malloc(rsltsize);
+
+        if (y) {
+            if ((log ? BAMAlignmentInitLog : BAMAlignmentInit)(y, rsltsize, datasize, data)) {
+                if (storage == NULL)
+                    self->bufLocker = y;
+                else
+                    y->storage = storage;
+
+                y->parent = self;
+                KRefcountInit(&y->refcount, 1, "BAMAlignment", "ReadCopy", "");
+                BAMFileAddRef(self);
+                rslt[0] = y;
+
+                if (BAMAlignmentIsEmpty(y))
+                    return RC(rcAlign, rcFile, rcReading, rcRow, rcEmpty);
+                return 0;
+            }
+            rc = RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid);
+            free(y);
+        }
+        else
+            rc = RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+    }
+    free(storage);
+
+    return rc;
+}
+
+static
+rc_t BAMFileBreakLock(BAMFile *const self)
+{
+    if (self->bufLocker != NULL) {
+        if (self->bufLocker->storage == NULL)
+            self->bufLocker->storage = malloc(self->bufLocker->datasize);
+        if (self->bufLocker->storage == NULL)
+            return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+        
+        memmove(self->bufLocker->storage, self->bufLocker->data, self->bufLocker->datasize);
+        self->bufLocker->data = (bam_alignment *)&self->bufLocker->storage[0];
+        self->bufLocker = NULL;
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMFileRead2(const BAMFile *cself, const BAMAlignment **rhs)
+{
+    BAMFile *const self = (BAMFile *)cself;
+    unsigned actsize = 0;
+    rc_t rc;
+    
+    if (self == NULL || rhs == NULL)
+        return RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+    
+    *rhs = NULL;
+    
+    if (self->bufCurrent >= self->bufSize && self->eof)
+        return RC(rcAlign, rcFile, rcReading, rcRow, rcNotFound);
+
+    rc = BAMFileBreakLock(self);
+    if (rc)
+        return rc;
+
+    if (self->nocopy_size == 0) {
+        size_t const size = 4096u;
+        void *const temp = malloc(size);
+
+        if (temp == NULL)
+            return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+
+        self->nocopy = temp;
+        self->nocopy_size = size;
+    }
+
+AGAIN:
+    rc = BAMFileReadNoCopy(self, &actsize, self->nocopy, (unsigned)self->nocopy_size);
+    if (rc == 0) {
+        *rhs = self->nocopy;
+        if (BAMAlignmentIsEmpty(self->nocopy)) {
+            rc = RC(rcAlign, rcFile, rcReading, rcRow, rcEmpty);
+            LOGERR(klogWarn, rc, "BAM Record contains no alignment or sequence data");
+        }
+    }
+    else if ( GetRCObject( rc ) == (enum RCObject)rcBuffer && GetRCState( rc ) == rcInsufficient )
+    {
+        unsigned const size = (actsize + 4095u) & ~4095u;
+        void *const temp = realloc(self->nocopy, size);
+
+        if (temp == NULL)
+            return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+        
+        self->nocopy = temp;
+        self->nocopy_size = size;
+
+        goto AGAIN;
+    }
+    else if ( GetRCObject( rc ) == (enum RCObject)rcBuffer && GetRCState( rc ) == rcNotAvailable )
+    {
+        rc = BAMFileReadCopy( self, rhs, true );
+    }
+    else if (GetRCObject(rc) == rcRow && GetRCState(rc) == rcInvalid) {
+        BAMAlignmentLogParseError(self->nocopy);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC BAMFileRead(const BAMFile *cself, const BAMAlignment **rhs)
+{
+    BAMFile *const self = (BAMFile *)cself;
+    
+    if (self == NULL || rhs == NULL)
+        return RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+    
+    *rhs = NULL;
+    
+    if (self->bufCurrent >= self->bufSize && self->eof)
+        return RC(rcAlign, rcFile, rcReading, rcRow, rcNotFound);
+    else {
+        rc_t const rc = BAMFileBreakLock(self);
+        if (rc)
+            return rc;
+    }
+    return BAMFileReadCopy(self, rhs, false);
+}
+
+/* MARK: BAM File header info accessor */
+
+LIB_EXPORT rc_t CC BAMFileGetRefSeqById(const BAMFile *cself, int32_t id, const BAMRefSeq **rhs)
+{
+    *rhs = NULL;
+    if (id >= 0 && id < cself->refSeqs)
+        *rhs = &cself->refSeq[id];
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMFileGetReadGroupByName(const BAMFile *cself, const char *name, const BAMReadGroup **rhs)
+{
+    BAMReadGroup rg;
+    
+    *rhs = NULL;
+
+    rg.name = name;
+    if (rg.name != NULL)
+        *rhs = kbsearch(&rg, cself->readGroup, cself->readGroups, sizeof(rg), comp_ReadGroup, NULL);
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMFileGetRefSeqCount(const BAMFile *cself, unsigned *rhs)
+{
+    *rhs = cself->refSeqs;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMFileGetRefSeq(const BAMFile *cself, unsigned i, const BAMRefSeq **rhs)
+{
+    *rhs = NULL;
+    if (i < cself->refSeqs)
+        *rhs = &cself->refSeq[i];
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMFileGetReadGroupCount(const BAMFile *cself, unsigned *rhs)
+{
+    *rhs = cself->readGroups;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMFileGetReadGroup(const BAMFile *cself, unsigned i, const BAMReadGroup **rhs)
+{
+    *rhs = NULL;
+    if (i < cself->readGroups)
+        *rhs = &cself->readGroup[i];
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMFileGetHeaderText(BAMFile const *cself, char const **header, size_t *header_len)
+{
+    *header = cself->header;
+    *header_len = *header ? string_size( *header ) : 0;
+    return 0;
+}
+
+/* MARK: BAM Alignment destructor */
+
+static rc_t BAMAlignmentWhack(BAMAlignment *self)
+{
+    if (self->parent->bufLocker == self)
+        self->parent->bufLocker = NULL;
+    if (self != self->parent->nocopy) {
+        BAMFileRelease(self->parent);
+        free(self->storage);
+        free(self);
+    }
+    return 0;
+}
+
+/* MARK: BAM Alignment ref-counting */
+
+LIB_EXPORT rc_t CC BAMAlignmentAddRef(const BAMAlignment *cself)
+{
+    if (cself != NULL)
+        KRefcountAdd(&cself->refcount, "BAMAlignment");
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentRelease(const BAMAlignment *cself)
+{
+    if (cself && KRefcountDrop(&cself->refcount, "BAMAlignment") == krefWhack)
+        BAMAlignmentWhack((BAMAlignment *)cself);
+
+    return 0;
+}
+
+#if 0
+LIB_EXPORT uint16_t CC BAMAlignmentIffyFields(const BAMAlignment *self)
+{
+}
+
+LIB_EXPORT uint16_t CC BAMAlignmentBadFields(const BAMAlignment *self)
+{
+}
+#endif
+
+/* MARK: BAM Alignment accessors */
+
+static uint32_t BAMAlignmentGetCigarElement(const BAMAlignment *self, unsigned i)
+{
+    return LE2HUI32(&((uint8_t const *)getCigarBase(self))[i * 4]);
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetRefSeqId(const BAMAlignment *cself, int32_t *rhs)
+{
+    *rhs = getRefSeqId(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetPosition(const BAMAlignment *cself, int64_t *rhs)
+{
+    *rhs = getPosition(cself);
+    return 0;
+}
+
+LIB_EXPORT bool CC BAMAlignmentIsMapped(const BAMAlignment *cself)
+{
+    if (((getFlags(cself) & BAMFlags_SelfIsUnmapped) == 0) && getRefSeqId(cself) >= 0 && getPosition(cself) >= 0)
+        return true;
+    return false;
+}
+
+/* static bool BAMAlignmentIsMateMapped(const BAMAlignment *cself)
+{
+    if (((getFlags(cself) & BAMFlags_MateIsUnmapped) == 0) && getMateRefSeqId(cself) >= 0 && getMatePos(cself) >= 0)
+        return true;
+    return false;
+} */
+
+LIB_EXPORT rc_t CC BAMAlignmentGetAlignmentDetail(
+                                                  const BAMAlignment *self,
+                                                  BAMAlignmentDetail *rslt, uint32_t count, uint32_t *actual,
+                                                  int32_t *pfirst, int32_t *plast
+                                                  )
+{
+    unsigned i;
+    unsigned ccnt; /* cigar count */
+    int32_t  gpos; /* refSeq pos in global coordinates */
+    unsigned rpos; /* read pos (always local coordinates) */
+    uint32_t rlen; /* read length */
+    int32_t first = -1;
+    int32_t last = -1;
+
+    if (!self)
+        return RC(rcAlign, rcFile, rcReading, rcSelf, rcNull);
+
+    rlen = getReadLen(self);
+    ccnt = getCigarCount(self);
+    gpos = getPosition(self);
+    
+    if (gpos < 0)
+        ccnt = 0;
+    
+    if (actual)
+        *actual = ccnt;
+    
+    if (pfirst)
+        *pfirst = -1;
+
+    if (plast)
+        *plast = -1;
+
+    if (ccnt == 0)
+        return 0;
+    
+    if (rslt == NULL) {
+        if (actual == NULL)
+            return RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+        count = 0;
+    }
+    
+    if (count < ccnt)
+        return RC(rcAlign, rcFile, rcReading, rcBuffer, rcInsufficient);
+        
+    for (rpos = 0, i = 0; i != ccnt; ++i) {
+        uint32_t len = BAMAlignmentGetCigarElement(self, i);
+        int op = len & 0x0F;
+        
+        if (op > sizeof(cigarChars))
+            return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+        
+        op = cigarChars[op];
+        len >>= 4;
+        
+        rslt[i].refSeq_pos = gpos;
+        rslt[i].read_pos = rpos;
+        rslt[i].length = len;
+        rslt[i].type = (BAMCigarType)op;
+        
+        switch ((BAMCigarType)op) {
+        case ct_Match:
+        case ct_Equal:
+            if (first == -1)
+                first = i;
+            last = i;
+            gpos += len;
+            rpos += len;
+            break;
+        case ct_Insert:
+        case ct_SoftClip:
+            gpos += len;
+            break;
+        case ct_Delete:
+        case ct_Skip:
+            rpos += len;
+            break;
+        case ct_HardClip:
+        case ct_Padded:
+            rslt[i].refSeq_pos = -1;
+            rslt[i].read_pos = -1;
+            break;
+        default:
+            break;
+        }
+        
+        if (rslt[i].read_pos > rlen)
+            return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+    }
+    if (pfirst)
+        *pfirst = first;
+    
+    if (plast)
+        *plast = last;
+    
+    return 0;
+}
+
+static
+unsigned ReferenceLengthFromCIGAR(const BAMAlignment *self)
+{
+    unsigned i;
+    unsigned n = getCigarCount(self);
+    unsigned y;
+    
+    for (i = 0, y = 0; i != n; ++i) {
+        uint32_t const len = BAMAlignmentGetCigarElement(self, i);
+        
+        switch (cigarChars[len & 0x0F]) {
+        case ct_Match:
+        case ct_Equal:
+        case ct_NotEqual:
+        case ct_Delete:
+        case ct_Skip:
+            y += len >> 4;
+            break;
+        default:
+            break;
+        }
+    }
+    return y;
+}
+
+static
+unsigned SequenceLengthFromCIGAR(const BAMAlignment *self)
+{
+    unsigned i;
+    unsigned n = getCigarCount(self);
+    unsigned y;
+    
+    for (i = 0, y = 0; i != n; ++i) {
+        uint32_t const len = BAMAlignmentGetCigarElement(self, i);
+        
+        switch (cigarChars[len & 0x0F]) {
+        case ct_Match:
+        case ct_Equal:
+        case ct_NotEqual:
+        case ct_Insert:
+        case ct_SoftClip:
+            y += len >> 4;
+            break;
+        default:
+            break;
+        }
+    }
+    return y;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetPosition2(const BAMAlignment *cself, int64_t *rhs, uint32_t *length)
+{
+    *rhs = getPosition(cself);
+    if (*rhs >= 0)
+        *length = ReferenceLengthFromCIGAR(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetReadGroupName(const BAMAlignment *cself, const char **rhs)
+{
+    *rhs = get_RG(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetReadName(const BAMAlignment *cself, const char **rhs)
+{
+    *rhs = getReadName(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetReadName2(const BAMAlignment *cself, const char **rhs, size_t *length)
+{
+    *length = getReadNameLength(cself) - 1;
+    *rhs = getReadName(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetReadName3(const BAMAlignment *cself, const char **rhs, size_t *length)
+{
+    char const *const name = getReadName(cself);
+    size_t len = getReadNameLength(cself);
+    size_t i;
+    
+    for (i = len; i; ) {
+        int const ch = name[--i];
+        
+        if (ch == '/') {
+            len = i;
+            break;
+        }
+        if (!isdigit(ch))
+            break;
+    }
+    *rhs = name;
+    *length = len;
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetFlags(const BAMAlignment *cself, uint16_t *rhs)
+{
+    *rhs = getFlags(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetMapQuality(const BAMAlignment *cself, uint8_t *rhs)
+{
+    *rhs = getMapQual(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetCigarCount(const BAMAlignment *cself, unsigned *rhs)
+{
+    *rhs = getCigarCount(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetRawCigar(const BAMAlignment *cself, uint32_t const *rslt[], uint32_t *length)
+{
+    *rslt = getCigarBase(cself);
+    *length = getCigarCount(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetCigar(const BAMAlignment *cself, uint32_t i, BAMCigarType *type, uint32_t *length)
+{
+    uint32_t x;
+    
+    if (i >= getCigarCount(cself))
+        return RC(rcAlign, rcFile, rcReading, rcParam, rcInvalid);
+
+    x = BAMAlignmentGetCigarElement(cself, i);
+    *type = (BAMCigarType)(cigarChars[x & 0x0F]);
+    *length = x >> 4;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetReadLength(const BAMAlignment *cself, uint32_t *rhs)
+{
+    *rhs = getReadLen(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetSequence2(const BAMAlignment *cself, char *rhs, uint32_t start, uint32_t stop)
+{
+    /*
+     *   =    A    C    M    G    R    S    V    T    W    Y    H    K    D    B    N
+     * 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
+     * 1111 1000 0100 1100 0010 1010 0110 1110 0001 1001 0101 1101 0011 1011 0111 0000
+     *   N    T    G    K    C    Y    S    B    A    W    R    D    M    H    V    =
+     */
+    static const char  tr[16] = "=ACMGRSVTWYHKDBN";
+ /* static const char ctr[16] = "=TGKCYSBAWRDMHVN"; */
+    unsigned const n = getReadLen(cself);
+    const uint8_t * const seq = &cself->data->raw[cself->seq];
+    unsigned si, di;
+    
+    if (stop == 0 || stop > n)
+        stop = n;
+    
+    for (di = 0, si = start; si != stop; ++si, ++di) {
+        unsigned const b4na2 = seq[si >> 1];
+        unsigned const b4na = (si & 1) == 0 ? (b4na2 >> 4) : (b4na2 & 0x0F);
+        
+        rhs[di] = tr[b4na];
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetSequence(const BAMAlignment *cself, char *rhs)
+{
+    return BAMAlignmentGetSequence2(cself, rhs, 0, 0);
+}
+
+LIB_EXPORT bool CC BAMAlignmentHasColorSpace(BAMAlignment const *cself)
+{
+    return get_CS(cself) != NULL;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetCSKey(BAMAlignment const *cself, char rhs[1])
+{
+    char const *const vCS = get_CS(cself);
+    
+    if (vCS)
+        rhs[0] = vCS[0];
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetCSSeqLen(BAMAlignment const *cself, uint32_t *rhs)
+{
+    struct offset_size_s const *const vCS = get_CS_info(cself);
+    
+    *rhs = vCS ? vCS->size - 5 : 0;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetCSSequence(BAMAlignment const *cself, char rhs[], uint32_t seqlen)
+{
+    char const *const vCS = get_CS(cself);
+    
+    if (vCS) {
+        unsigned i;
+        
+        for (i = 0;i != seqlen; ++i) {
+            char const ch = vCS[i+1];
+            
+            rhs[i] = (ch == '4') ? '.' : ch;
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetQuality(const BAMAlignment *cself, const uint8_t **rhs)
+{
+    *rhs = &cself->data->raw[cself->qual];
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetQuality2(BAMAlignment const *cself, uint8_t const **rhs, uint8_t *offset)
+{
+    uint8_t const *const OQ = get_OQ(cself);
+    
+    if (OQ) {
+        struct offset_size_s const *const oq = get_OQ_info(cself);
+        
+        if (oq->size - 4 == getReadLen(cself)) {
+            *offset = 33;
+            *rhs = OQ;
+        }
+        else
+            return RC(rcAlign, rcRow, rcReading, rcData, rcInconsistent);
+    }
+    else {
+        *offset = 0;
+        *rhs = &cself->data->raw[cself->qual];
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetCSQuality(BAMAlignment const *cself, uint8_t const **rhs, uint8_t *offset)
+{
+    struct offset_size_s const *const cs = get_CS_info(cself);
+    struct offset_size_s const *const cq = get_CQ_info(cself);
+    uint8_t const *const CQ = get_CQ(cself);
+    
+    if (cs && cq && CQ) {
+        if (cs->size == cq->size) {
+            *offset = 33;
+            *rhs = CQ + 1;
+            return 0;
+        }
+        if (cs->size == cq->size + 1) {
+            *offset = 33;
+            *rhs = CQ;
+            return 0;
+        }
+        return RC(rcAlign, rcRow, rcReading, rcData, rcInconsistent);
+    }
+    *offset = 0;
+    *rhs = &cself->data->raw[cself->qual];
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetMateRefSeqId(const BAMAlignment *cself, int32_t *rhs)
+{
+    *rhs = getMateRefSeqId(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetMatePosition(const BAMAlignment *cself, int64_t *rhs)
+{
+    *rhs = getMatePos(cself);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentGetInsertSize(const BAMAlignment *cself, int64_t *rhs)
+{
+    *rhs = getInsertSize(cself);
+    return 0;
+}
+
+static int FormatOptData(BAMAlignment const *const self,
+                         size_t const maxsize,
+                         char buffer[])
+{
+    char const *const base = (char const *)&self->data->raw[self->qual + getReadLen(self)];
+    unsigned i;
+    unsigned offset;
+    unsigned cur = 0;
+    int j;
+    
+    for (i = 0, offset = 0; i < self->numExtra; ++i) {
+        int type;
+        union { float f; uint32_t i; } fi;
+        
+        if (cur + 7 > maxsize)
+            return -1;
+        buffer[cur++] = '\t';
+        buffer[cur++] = base[offset++];
+        buffer[cur++] = base[offset++];
+        buffer[cur++] = ':';
+        type = base[offset++];
+
+        switch (type) {
+            case dt_ASCII:      /* A */
+                buffer[cur++] = 'A';
+                buffer[cur++] = ':';
+                buffer[cur++] = base[offset++];
+                break;
+
+            case dt_INT8:       /* c */
+                buffer[cur++] = 'i';
+                buffer[cur++] = ':';
+                j = snprintf(buffer + cur, maxsize - cur, "%i", (int)*((int8_t const *)(base + offset)));
+                if ((cur += j) >= maxsize)
+                    return -1;
+                offset += 1;
+                break;
+
+            case dt_UINT8:      /* C */
+                buffer[cur++] = 'i';
+                buffer[cur++] = ':';
+                j = snprintf(buffer + cur, maxsize - cur, "%u", (unsigned)*((uint8_t const *)(base + offset)));
+                if ((cur += j) >= maxsize)
+                    return -1;
+                offset += 1;
+                break;
+                
+            case dt_INT16:      /* s */
+                buffer[cur++] = 'i';
+                buffer[cur++] = ':';
+                j = snprintf(buffer + cur, maxsize - cur, "%i", (int)LE2HI16(base + offset));
+                if ((cur += j) >= maxsize)
+                    return -1;
+                offset += 2;
+                break;
+
+            case dt_UINT16:     /* S */
+                buffer[cur++] = 'i';
+                buffer[cur++] = ':';
+                j = snprintf(buffer + cur, maxsize - cur, "%u", (unsigned)LE2HUI16(base + offset));
+                if ((cur += j) >= maxsize)
+                    return -1;
+                offset += 2;
+                break;
+                
+            case dt_INT:        /* i */
+                buffer[cur++] = 'i';
+                buffer[cur++] = ':';
+                j = snprintf(buffer + cur, maxsize - cur, "%i", (int)LE2HI32(base + offset));
+                if ((cur += j) >= maxsize)
+                    return -1;
+                offset += 4;
+                break;
+
+            case dt_UINT:       /* I */
+                buffer[cur++] = 'i';
+                buffer[cur++] = ':';
+                j = snprintf(buffer + cur, maxsize - cur, "%i", (int)LE2HI32(base + offset));
+                if ((cur += j) >= maxsize)
+                    return -1;
+                offset += 4;
+                break;
+
+            case dt_FLOAT32:    /* f */
+                buffer[cur++] = 'f';
+                buffer[cur++] = ':';
+                fi.i = LE2HUI32(base + offset);
+                j = snprintf(buffer + cur, maxsize - cur, "%f", fi.f);
+                if ((cur += j) >= maxsize)
+                    return -1;
+                offset += 4;
+                break;
+
+            case dt_HEXSTRING:  /* H */
+            case dt_CSTRING:    /* Z */
+                buffer[cur++] = type == dt_CSTRING ? 'Z' : 'H';
+                buffer[cur++] = ':';
+                for ( ; ; ) {
+                    int const ch = base[offset++];
+                    
+                    if (ch == '\0')
+                        break;
+                    if (cur >= maxsize)
+                        return -1;
+                    buffer[cur++] = ch;
+                }
+                break;
+
+            case dt_NUM_ARRAY:  /* B */
+                buffer[cur++] = 'B';
+                buffer[cur++] = ':';
+                {
+                    int const elemtype = base[offset++];
+                    unsigned const elemcount = LE2HUI32(base + offset);
+                    unsigned k;
+
+                    if (cur + 2 >= maxsize)
+                        return -1;
+                    buffer[cur++] = elemtype;
+                    offset += 4;
+                    for (k = 0; k < elemcount; ++k) {
+                        buffer[cur++] = ',';
+                        switch (elemtype) {
+                            case dt_INT8:
+                                j = snprintf(buffer + cur, maxsize - cur, "%i", (int)*((int8_t const *)(base + offset)));
+                                if ((cur += j) >= maxsize)
+                                    return -1;
+                                offset += 1;
+                                break;
+                                
+                            case dt_UINT8:
+                                j = snprintf(buffer + cur, maxsize - cur, "%u", (unsigned)*((uint8_t const *)(base + offset)));
+                                if ((cur += j) >= maxsize)
+                                    return -1;
+                                offset += 1;
+                                break;
+                                
+                            case dt_INT16:
+                                j = snprintf(buffer + cur, maxsize - cur, "%i", (int)LE2HI16(base + offset));
+                                if ((cur += j) >= maxsize)
+                                    return -1;
+                                offset += 2;
+                                break;
+                                
+                            case dt_UINT16:
+                                j = snprintf(buffer + cur, maxsize - cur, "%u", (unsigned)LE2HUI16(base + offset));
+                                if ((cur += j) >= maxsize)
+                                    return -1;
+                                offset += 2;
+                                break;
+                                
+                            case dt_INT:
+                                j = snprintf(buffer + cur, maxsize - cur, "%i", (int)LE2HI32(base + offset));
+                                if ((cur += j) >= maxsize)
+                                    return -1;
+                                offset += 4;
+                                break;
+                                
+                            case dt_UINT:
+                                j = snprintf(buffer + cur, maxsize - cur, "%u", (unsigned)LE2HUI32(base + offset));
+                                if ((cur += j) >= maxsize)
+                                    return -1;
+                                offset += 4;
+                                break;
+                                
+                            case dt_FLOAT32:
+                                fi.i = LE2HUI32(base + offset);
+                                j = snprintf(buffer + cur, maxsize - cur, "%f", fi.f);
+                                if ((cur += j) >= maxsize)
+                                    return -1;
+                                offset += 4;
+
+                            default:
+                                return -1;
+                                break;
+                        }
+                    }
+                }
+                break;
+
+            default:
+                return -1;
+                break;
+        }
+    }
+    return cur;
+}
+
+static rc_t FormatSAM(BAMAlignment const *self,
+                      size_t *const actsize,
+                      size_t const maxsize,
+                      char *const buffer)
+{
+    int i = 0;
+    size_t cur = 0;
+    unsigned j;
+    int const refSeqId = getRefSeqId(self);
+    int const refPos = getPosition(self);
+    unsigned const cigCount = getCigarCount(self);
+    uint32_t const *const cigar = getCigarBase(self);
+    int const mateRefSeqId = getMateRefSeqId(self);
+    int const mateRefPos = getMatePos(self);
+    unsigned const readlen = getReadLen(self);
+
+    i = snprintf(&buffer[cur], maxsize - cur,
+                 "%s\t%i\t%s\t%i\t%i\t",
+                 getReadName(self),
+                 getFlags(self),
+                 refSeqId < 0 ? "*" : self->parent->refSeq[refSeqId].name,
+                 refPos < 0 ? 0 : refPos + 1,
+                 getMapQual(self)
+                 );
+    if ((cur += i) > maxsize)
+        return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+
+    if (cigCount > 0) {
+        for (j = 0; j < cigCount; ++j) {
+            uint32_t const el = cigar[j];
+            BAMCigarType const type = (BAMCigarType)(cigarChars[el & 0x0F]);
+            unsigned const length = el >> 4;
+
+            i = snprintf(&buffer[cur], maxsize - cur, "%u%c", length, type);
+            if ((cur += i) > maxsize)
+                return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+        }
+    }
+    else {
+        if ((cur + 1) > maxsize)
+            return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+        buffer[cur++] = '*';
+    }
+    i = snprintf(&buffer[cur], maxsize - cur,
+                 "\t%s\t%i\t%i\t",
+                 mateRefSeqId < 0 ? "*" : mateRefSeqId == refSeqId ? "=" : self->parent->refSeq[mateRefSeqId].name,
+                 mateRefPos < 0 ? 0 : mateRefPos + 1,
+                 getInsertSize(self)
+                 );
+    if ((cur += i) > maxsize)
+        return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+    if (readlen) {
+        uint8_t const *const qual = &self->data->raw[self->qual];
+        
+        if (cur + 2 * readlen + 1 > maxsize)
+            return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+        BAMAlignmentGetSequence(self, &buffer[cur]);
+        cur += readlen;
+        buffer[cur] = '\t';
+        ++cur;
+        
+        for (j = 0; j < readlen; ++j) {
+            if (qual[j] != 0xFF)
+                goto HAS_QUAL;
+        }
+        if (1) {
+            buffer[cur++] = '*';
+        }
+        else {
+    HAS_QUAL:
+            for (j = 0; j < readlen; ++j)
+                buffer[cur++] = qual[j] + 33;
+        }
+    }
+    else {
+        i = snprintf(&buffer[cur], maxsize - cur, "*\t*");
+        if ((cur += i) > maxsize)
+            return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+    }
+    i = FormatOptData(self, maxsize - cur, &buffer[cur]);
+    if (i < 0)
+        return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+    if ((cur += i) + 2 > maxsize)
+        return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+    buffer[cur++] = '\n';
+    buffer[cur] = '\0';
+    *actsize = cur;
+
+    return 0;
+}
+
+#define FORMAT_SAM_SCRATCH_SIZE ((size_t)(64u * 1024u))
+static rc_t FormatSAMBuffer(BAMAlignment const *self,
+                            size_t actSize[],
+                            size_t const maxsize,
+                            char *const buffer)
+{
+    char scratch[FORMAT_SAM_SCRATCH_SIZE];
+    size_t actsize = 0;
+    rc_t const rc = FormatSAM(self, &actsize, FORMAT_SAM_SCRATCH_SIZE, scratch);
+
+    actSize[0] = actsize;
+    if (rc) return rc;
+    
+    if (actsize > maxsize)
+        return RC(rcAlign, rcReading, rcRow, rcBuffer, rcInsufficient);
+
+    memmove(buffer, scratch, actsize);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentFormatSAM(BAMAlignment const *self,
+                                         size_t *const actSize,
+                                         size_t const maxsize,
+                                         char *const buffer)
+{
+    if (self == NULL)
+        return RC(rcAlign, rcReading, rcRow, rcSelf, rcNull);
+    if (buffer == NULL)
+        return RC(rcAlign, rcReading, rcRow, rcParam, rcNull);
+    else {
+        size_t actsize = 0;
+        rc_t const rc = (maxsize < FORMAT_SAM_SCRATCH_SIZE ? FormatSAMBuffer : FormatSAM)(self, &actsize, maxsize, buffer);
+
+        if (actSize)
+            *actSize = actsize;
+        return rc;
+    }
+}
+
+typedef struct OptForEach_ctx_s {
+    BAMOptData *val;
+    BAMOptData **alloced;
+    size_t valsize;
+    rc_t rc;
+    BAMOptionalDataFunction user_f;
+    void *user_ctx;
+} OptForEach_ctx_t;
+
+static bool i_OptDataForEach(BAMAlignment const *cself, void *Ctx, char const tag[2], BAMOptDataValueType type, unsigned count, void const *value, unsigned size)
+{
+    OptForEach_ctx_t *ctx = (OptForEach_ctx_t *)Ctx;
+    size_t const need = (size_t)&((BAMOptData const *)NULL)->u.f64[(count * size + sizeof(double) - 1)/sizeof(double)];
+    
+    if (need > ctx->valsize) {
+        void *const temp = realloc(ctx->alloced, need);
+        if (temp == NULL) {
+            ctx->rc = RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+            return true;
+        }
+        *ctx->alloced = ctx->val = temp;
+        ctx->valsize = need;
+    }
+    ctx->val->type = type;
+    ctx->val->element_count = (type == dt_CSTRING || type == dt_HEXSTRING) ? size - 1 : count;
+    
+    memmove(ctx->val->u.u8, value, size * count);
+#if __BYTE_ORDER == __BIG_ENDIAN
+    {{
+        unsigned di;
+        uint32_t elem_count = ctx->val->element_count;
+        
+        switch (size) {
+        case 2:
+            for (di = 0; di != elem_count; ++di)
+                ctx->val->u.u16[di] = LE2HUI16(&ctx->val->u.u16[di]);
+            break;
+        case 4:
+            for (di = 0; di != elem_count; ++di)
+                ctx->val->u.u32[di] = LE2HUI32(&ctx->val->u.u32[di]);
+            break;
+        case 8:
+            for (di = 0; di != elem_count; ++di)
+                ctx->val->u.u64[di] = LE2HUI64(&ctx->val->u.u64[di]);
+            break;
+        }
+    }}
+#endif
+    ctx->rc = ctx->user_f(ctx->user_ctx, tag, ctx->val);
+    return ctx->rc != 0;
+}
+
+LIB_EXPORT rc_t CC BAMAlignmentOptDataForEach(const BAMAlignment *cself, void *user_ctx, BAMOptionalDataFunction f)
+{
+    union u {
+        BAMOptData value;
+        uint8_t storage[4096];
+    } value_auto;
+    OptForEach_ctx_t ctx;
+    rc_t rc = 0;
+    unsigned i;
+    
+    ctx.val = &value_auto.value;
+    ctx.alloced = NULL;
+    ctx.valsize = sizeof(value_auto);
+    ctx.rc = 0;
+    ctx.user_f = f;
+    ctx.user_ctx = user_ctx;
+    
+    for (i = 0; i != cself->numExtra; ++i) {
+        char const *const tag = (char const *)&cself->data->raw[cself->extra[i].offset];
+        uint8_t type = tag[2];
+        uint8_t const *const vp = (uint8_t const *)&tag[3];
+        unsigned len = cself->extra[i].size - 3;
+        unsigned size = cself->extra[i].size - 3;
+        unsigned count = 1;
+        unsigned offset = 0;
+        
+        if (type == dt_NUM_ARRAY) {
+            unsigned elem_size = 0;
+            uint32_t elem_count = 0;
+            
+            offset = len = 5;
+            switch (vp[0]) {
+            case dt_INT8:
+            case dt_UINT8:
+                elem_size = 1;
+                break;
+            case dt_INT16:
+            case dt_UINT16:
+                elem_size = 2;
+                break;
+            case dt_FLOAT32:
+            case dt_INT:
+            case dt_UINT:
+                elem_size = 4;
+                break;
+#if 0
+            case dt_FLOAT64:
+                elem_size = 8;
+                break;
+#endif
+            default:
+                rc = RC(rcAlign, rcFile, rcReading, rcData, rcUnexpected);
+                break;
+            }
+            if (rc)
+                break;
+            elem_count = LE2HUI32(&vp[1]);
+            len += elem_size * elem_count;
+            type = vp[0];
+            count = elem_count;
+            size = elem_size;
+            break;
+        }
+        if (i_OptDataForEach(cself, &ctx, tag, type, count, &vp[offset], size))
+            break;
+    }
+    rc = rc ? rc : ctx.rc;
+    if (ctx.alloced)
+        free(ctx.alloced);
+    return rc;
+}
+
+/* MARK: Complete Genomics stuff */
+
+LIB_EXPORT bool CC BAMAlignmentHasCGData(BAMAlignment const *self)
+{
+    return get_CG_GC_info(self) && get_CG_GS_info(self) && get_CG_GQ_info(self);
+}
+
+static bool BAMAlignmentParseCGTag(BAMAlignment const *self, size_t const max_cg_segs, unsigned cg_segs[/* max_cg_segs */])
+{
+    /*** patern in cg_segs should be nSnGnSnG - no more then 7 segments **/
+    struct offset_size_s const *const GCi = get_CG_GC_info(self);
+    char const *cg  = (char const *)&self->data->raw[GCi->offset + 3];
+    char const *const end = cg + GCi->size - 4;
+    unsigned iseg = 0;
+    char last_op = 'S';
+
+    memset(cg_segs, 0, max_cg_segs * sizeof(cg_segs[0]));
+    
+    while (cg < end && iseg < max_cg_segs) {
+        char *endp;
+        long const op_len = strtol(cg, &endp, 10);
+        char const op = *(cg = endp);
+        
+        ++cg;
+        if (op==last_op) {
+            cg_segs[iseg] += op_len;
+        }
+        else {
+            last_op = op;
+            ++iseg;
+            cg_segs[iseg] = (unsigned)op_len;
+        }
+    }
+    return true;
+}
+
+static
+rc_t ExtractInt32(BAMAlignment const *self, int32_t *result,
+                  struct offset_size_s const *const tag)
+{
+    int64_t y;
+    int const type = self->data->raw[tag->offset + 2];
+    void const *const pvalue = &self->data->raw[tag->offset + 3];
+    
+    switch (type) {
+    case 'c':
+        if (tag->size == 4)
+            y = *((int8_t const *)pvalue);
+        else
+            return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+        break;
+    case 'C':
+        if (tag->size == 4)
+            y = *((uint8_t const *)pvalue);
+        else
+            return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+        break;
+    case 's':
+        if (tag->size == 5)
+            y = LE2HI16(pvalue);
+        else
+            return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+        break;
+    case 'S':
+        if (tag->size == 5)
+            y = LE2HUI16(pvalue);
+        else
+            return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+        break;
+    case 'i':
+        if (tag->size == 7)
+            y = LE2HI32(pvalue);
+        else
+            return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+        break;
+    case 'I':
+        if (tag->size == 7)
+            y = LE2HUI32(pvalue);
+        else
+            return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+        break;
+    default:
+        return RC(rcAlign, rcRow, rcReading, rcData, rcNotFound);
+    }
+    if (INT32_MIN <= y && y <= INT32_MAX) {
+        *result = (int32_t)y;
+        return 0;
+    }
+    return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+}
+
+LIB_EXPORT
+rc_t CC BAMAlignmentGetCGAlignGroup(BAMAlignment const *self,
+                                    char buffer[],
+                                    size_t max_size,
+                                    size_t *act_size)
+{
+    struct offset_size_s const *const ZA = get_CG_ZA_info(self);
+    struct offset_size_s const *const ZI = get_CG_ZI_info(self);
+    
+    if (ZA && ZI) {
+        rc_t rc;
+        int32_t za;
+        int32_t zi;
+        
+        rc = ExtractInt32(self, &za, ZA); if (rc) return rc;
+        rc = ExtractInt32(self, &zi, ZI); if (rc) return rc;
+        return string_printf(buffer, max_size, act_size, "%i_%i", zi, za);
+    }
+    return RC(rcAlign, rcRow, rcReading, rcData, rcNotFound);
+}
+
+LIB_EXPORT
+rc_t CC BAMAlignmentGetCGSeqQual(BAMAlignment const *self,
+                                 char sequence[],
+                                 uint8_t quality[])
+{
+    struct offset_size_s const *const GCi = get_CG_GC_info(self);
+    struct offset_size_s const *const GSi = get_CG_GS_info(self);
+    struct offset_size_s const *const GQi = get_CG_GQ_info(self);
+    
+    if (GCi && GSi && GQi) {
+        char const *const vGS = (char const *)&self->data->raw[GSi->offset + 3];
+        char const *const GQ  = (char const *)&self->data->raw[GQi->offset + 3];
+        unsigned const GSsize = GSi->size - 4;
+        unsigned const sn = getReadLen(self);
+        unsigned cg_segs[2*CG_NUM_SEGS-1]; /** 4 segments + 3gaps **/
+        unsigned i,G,S;
+        
+        if (GSi->size != GQi->size)
+            return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+        
+        if (SequenceLengthFromCIGAR(self) != sn)
+            return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+
+        if (!BAMAlignmentParseCGTag(self, 2*CG_NUM_SEGS-1, cg_segs))
+            return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+        
+        for (S = cg_segs[0], G = 0, i = 1; i < CG_NUM_SEGS; ++i) { /** sum all S and G **/
+            S += cg_segs[2*i];
+            G += cg_segs[2*i-1];
+        }
+        if (G + G != GSsize || S + G > sn || sn + G != 35) {
+            /*fprintf(stderr, "GSsize: %u; sn: %u; S: %u; G: %u\n", GSsize, sn, S, G);*/
+            return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+        }
+        if (G > 0) {
+            unsigned nsi = cg_segs[0];   /** new index into sequence */
+            unsigned osi = nsi + G;      /** old index into sequence */
+            unsigned k;                  /** index into inserted sequence **/
+            
+            /***make room for inserts **/
+            memmove(sequence + osi, sequence + nsi, sn - nsi);
+            memmove(quality  + osi, quality  + nsi, sn - nsi);
+            
+            for (i = 1, k = 0; i < CG_NUM_SEGS && nsi < osi; ++i) {/*** when osi and nsi meet we are done ***/
+                unsigned j;
+                
+                for (j = cg_segs[2*i-1]; j > 0; --j) { /** insert mode **/
+                    sequence[nsi] = vGS[k];
+                    quality [nsi] = GQ[k] - 33;
+                    ++nsi; ++k;
+                    sequence[nsi] = vGS[k];
+                    quality [nsi] = GQ[k] - 33;
+                    ++nsi;
+                    ++osi;
+                    ++k;
+                }
+                if (nsi < osi){
+                    for (j = cg_segs[2*i]; j > 0; --j) { /** copy mode **/
+                        sequence[nsi] = sequence[osi];
+                        quality[nsi]  = quality[osi];
+                        ++nsi;
+                        ++osi;
+                    }
+                }
+            }
+        }
+        return 0;
+    }
+    return RC(rcAlign, rcRow, rcReading, rcData, rcNotFound);
+}
+
+
+static unsigned splice(uint32_t cigar[], unsigned n, unsigned at, unsigned out, unsigned in, uint32_t const new_values[/* in */])
+{
+    assert(at + out <= n);
+    memmove(&cigar[at + in], &cigar[at + out], (n - at - out) * 4);
+    if (in)
+        memmove(&cigar[at], new_values, in * 4);
+    return n + in - out;
+}
+
+#define OPCODE_2_FIX (0xF)
+
+static unsigned insert_B(unsigned S, unsigned G, unsigned const n, uint32_t cigar[/* n */])
+{
+    unsigned i;
+    unsigned pos;
+    unsigned const T = S + G;
+    
+    for (pos = i = 0; i < n; ++i) {
+        int const opcode = cigar[i] & 0xF;
+        
+        switch (opcode) {
+        case 0:
+        case 1:
+        case 4:
+        case 7:
+        case 8:
+            {{
+                unsigned const len = cigar[i] >> 4;
+                unsigned const nxt = pos + len;
+                
+                if (pos <= T && T <= nxt) {
+                    unsigned const l = T - pos;
+                    unsigned const r = len - l;
+                    unsigned B = i + 2;
+                    unsigned in = 4;
+                    uint32_t Ops[4];
+                    uint32_t *ops = Ops;
+                    
+                    Ops[0] = (l << 4) | opcode;
+                    Ops[1] = (G << 4) | 9; /* B */
+                    Ops[2] = (G << 4) | 0; /* M this is not backwards */
+                    Ops[3] = (r << 4) | opcode;
+                    
+                    if (r == 0)
+                        --in;
+                    if (l == 0) {
+                        ++ops;
+                        --in;
+                        --B;
+                    }
+                    return splice(cigar, n, i, 1, in, ops);
+                }
+                pos = nxt;
+            }}
+            break;
+        default:
+            break;
+        }
+    }
+    return n;
+}
+
+#if 0
+static unsigned fix_I(uint32_t cigar[], unsigned n)
+{
+    unsigned i;
+    /* int last_b = 0; */
+    
+    for (i = 0; i < n; ++i) {
+        unsigned const opcode = cigar[i] & 0xF;
+        
+        if (opcode == 0xF) {
+            unsigned const oplen = cigar[i] >> 4;
+            uint32_t ops[2];
+            
+            if (0/*last_b*/) {
+                ops[0] = (oplen << 4) | 0; /* M */
+                ops[1] = (oplen << 4) | 9; /* B */
+            }
+            else {
+                ops[0] = (oplen << 4) | 9; /* B */
+                ops[1] = (oplen << 4) | 0; /* M */
+            }
+            
+            n = splice(cigar, n, i, 1, 2, ops);
+            ++i;
+        }
+/*      else if (opcode == 9)
+            last_b = 1;
+        else
+            last_b = 0; */
+    }
+    return n;
+}
+
+static unsigned fix_IN(uint32_t cigar[], unsigned n)
+{
+    unsigned i;
+    
+    for (i = 1; i < n; ++i) {
+        unsigned const opL = cigar[i-1] & 0xF;
+        unsigned const opI = cigar[ i ] & 0xF;
+        
+        if (opL == 1 && opI == 3) {
+            unsigned const oplen = cigar[i-1] >> 4;
+            uint32_t ops[2];
+            
+            ops[0] = (oplen << 4) | 9; /* B */
+            ops[1] = (oplen << 4) | 0; /* M */
+            
+            n = splice(cigar, n, i-1, 1, 2, ops);
+            ++i;
+        }
+        else if (opL == 3 && opI == 1) {
+            unsigned const oplen = cigar[i] >> 4;
+            uint32_t ops[2];
+            
+            ops[0] = (oplen << 4) | 9; /* M */
+            ops[1] = (oplen << 4) | 0; /* B */
+            
+            n = splice(cigar, n, i, 1, 2, ops);
+            ++i;
+        }
+    }
+    return n;
+}
+#endif
+
+static unsigned canonicalize(uint32_t cigar[], unsigned n)
+{
+    unsigned i;
+    
+    for (i = n; i > 0; ) {
+        --i;
+        if (cigar[i] >> 4 == 0 || (cigar[i] & 0xF) == 6)
+            n = splice(cigar, n, i, 1, 0, NULL);
+    }
+    for (i = 1; i < n; ) {
+        unsigned const opL = cigar[i-1] & 0xF;
+        unsigned const opI = cigar[ i ] & 0xF;
+        
+        if (opI == opL) {
+            unsigned const oplen = (cigar[i] >> 4) + (cigar[i-1] >> 4);
+            uint32_t const op = (oplen << 4) | opI;
+
+            n = splice(cigar, n, i-1, 2, 1, &op);
+        }
+        else
+            ++i;
+    }
+#if 0
+    if ((cigar[0] & 0xF) == 1)
+        cigar[0] = (cigar[0] & ~(uint32_t)0xF) | 4; /* I -> S */
+    if ((cigar[n - 1] & 0xF) == 1)
+        cigar[n - 1] = (cigar[n - 1] & ~(uint32_t)0xF) | 4; /* I -> S */
+#endif
+    return n;
+}
+
+/* static void reverse(uint32_t cigar[], unsigned n)
+{
+    unsigned i;
+    unsigned j;
+    
+    for (j = n - 1, i = 0; i < j; ++i, --j) {
+        uint32_t const tmp = cigar[i];
+        cigar[i] = cigar[j];
+        cigar[j] = tmp;
+    }
+} */
+
+static unsigned GetCGCigar(BAMAlignment const *self, unsigned const N, uint32_t cigar[/* N */])
+{
+    unsigned i;
+    unsigned G;
+    unsigned S;
+    unsigned n = getCigarCount(self);
+    unsigned cg_segs[2*CG_NUM_SEGS-1]; /** 4 segments + 3 gaps **/
+    
+    if (!BAMAlignmentParseCGTag(self, 2*CG_NUM_SEGS-1, cg_segs))
+        return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+    
+    if (N < n + 5)
+        return RC(rcAlign, rcRow, rcReading, rcBuffer, rcInsufficient);
+    
+    memmove(cigar, getCigarBase(self), n * 4);
+    n = canonicalize(cigar, n); /* just in case */
+    for (i = 0, S = 0; i < CG_NUM_SEGS - 1; ++i) {
+        S += cg_segs[2*i];
+        G  = cg_segs[2*i+1];
+        if (G > 0) {
+            n = insert_B(S, G, n, cigar);
+            S += G;
+        }
+    }
+    return n;
+}
+
+LIB_EXPORT
+rc_t CC BAMAlignmentGetCGCigar(BAMAlignment const *self,
+                               uint32_t *cigar,
+                               uint32_t cig_max,
+                               uint32_t *cig_act)
+{
+    struct offset_size_s const *const GCi = get_CG_GC_info(self);
+    
+    *cig_act = 0;
+    
+    if (GCi) {
+        *cig_act = GetCGCigar(self, cig_max, cigar);
+        return 0;
+    }
+    return RC(rcAlign, rcRow, rcReading, rcData, rcNotFound);
+}
+
+/* MARK: end CG stuff */
+
+LIB_EXPORT rc_t BAMAlignmentGetTI(BAMAlignment const *self, uint64_t *ti)
+{
+    char const *const TI = get_XT(self);
+    long long unsigned temp;
+    
+    if (TI && sscanf(TI, "ti|%llu", &temp) == 1) {
+        *ti = (uint64_t)temp;
+        return 0;
+    }
+    return RC(rcAlign, rcRow, rcReading, rcData, rcNotFound);
+}
+
+LIB_EXPORT rc_t BAMAlignmentGetRNAStrand(BAMAlignment const *const self, uint8_t *const rslt)
+{
+    if (rslt) {
+        uint8_t const *const XS = get_XS(self);
+        
+	    *rslt = XS ? XS[0] : ' ';
+    }
+    return 0;
+}
+
+/* MARK: BAMIndex stuff */
+
+static uint64_t get_pos(uint8_t const buf[])
+{
+    return LE2HUI64(buf);
+}
+
+#define MAX_BIN 37449
+static uint16_t bin2ival(uint16_t bin)
+{
+    if (bin < 1)
+        return 0; /* (bin - 0) << 15; */
+    
+    if (bin < 9)
+        return (bin - 1) << 12;
+    
+    if (bin < 73)
+        return (bin - 9) << 9;
+    
+    if (bin < 585)
+        return (bin - 73) << 6;
+    
+    if (bin < 4681)
+        return (bin - 585) << 3;
+    
+    if (bin < 37449)
+        return (bin - 4681) << 0;
+    
+    return 0;
+}
+
+static uint16_t bin_ival_count(uint16_t bin)
+{
+    if (bin < 1)
+        return 1 << 15;
+    
+    if (bin < 9)
+        return 1 << 12;
+    
+    if (bin < 73)
+        return 1 << 9;
+    
+    if (bin < 585)
+        return 1 << 6;
+    
+    if (bin < 4681)
+        return 1 << 3;
+    
+    if (bin < 37449)
+        return 1;
+    
+    return 0;
+}
+
+enum BAMIndexStructureTypes {
+    bai_StartStopPairs,
+    bai_16kIntervals
+};
+
+typedef rc_t (*WalkIndexStructureCallBack)(const uint8_t data[], size_t dlen,
+                                           unsigned refNo,
+                                           unsigned refs,
+                                           enum BAMIndexStructureTypes type,
+                                           unsigned binNo,
+                                           unsigned bins,
+                                           unsigned elements,
+                                           void *ctx);
+
+static
+rc_t WalkIndexStructure(uint8_t const buf[], size_t const blen,
+                        WalkIndexStructureCallBack func,
+                        void *ctx
+                        )
+{
+    unsigned cp = 0;
+    int32_t nrefs;
+    unsigned i;
+    rc_t rc;
+    
+    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("Index data length: %u", blen));
+
+    if (cp + 4 > blen)
+        return RC(rcAlign, rcIndex, rcReading, rcData, rcInsufficient);
+    
+    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("Index signature: '%c%c%c%u'", buf[cp+0], buf[cp+1], buf[cp+2], buf[cp+3]));
+    if (memcmp(buf + cp, "BAI\1", 4) != 0)
+        return RC(rcAlign, rcIndex, rcReading, rcFormat, rcUnknown);
+    
+    cp += 4;
+    if (cp + 4 > blen)
+        return RC(rcAlign, rcIndex, rcReading, rcData, rcInsufficient);
+
+    nrefs = LE2HI32(buf + cp); cp += 4;
+    DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("Index reference count: %i", nrefs));
+    
+    if (nrefs == 0)
+        return RC(rcAlign, rcIndex, rcReading, rcData, rcEmpty);
+    
+    for (i = 0; i < nrefs; ++i) {
+        int32_t bins;
+        int32_t chunks;
+        int32_t intervals;
+        unsigned di;
+        
+        DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("Index reference %u: starts at %u", i, cp));
+        if (cp + 4 > blen)
+            return RC(rcAlign, rcIndex, rcReading, rcData, rcInsufficient);
+        
+        bins = LE2HI32(buf + cp); cp += 4;
+        DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("Index reference %u: %i bins", i, nrefs));
+
+        for (di = 0; di < bins; ++di) {
+            uint32_t binNo;
+            
+            if (cp + 8 > blen)
+                return RC(rcAlign, rcIndex, rcReading, rcData, rcInsufficient);
+
+            binNo = LE2HUI32(buf + cp); cp += 4;
+            chunks = LE2HI32(buf + cp); cp += 4;
+            DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("Index reference %u, bin %u: %i chunks", i, binNo, chunks));
+            
+            if (cp + 16 * chunks > blen)
+                return RC(rcAlign, rcIndex, rcReading, rcData, rcInsufficient);
+            rc = func(&buf[cp], 16 * chunks, i, nrefs, bai_StartStopPairs, binNo, bins, chunks, ctx);
+            if (rc)
+                return rc;
+            cp += 16 * chunks;
+        }
+        if (cp + 4 > blen)
+            return RC(rcAlign, rcIndex, rcReading, rcData, rcInsufficient);
+
+        intervals = LE2HI32(buf + cp); cp += 4;
+        DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("Index reference %u: %i intervals", i, intervals));
+
+        if (cp + 8 * intervals > blen)
+            return RC(rcAlign, rcIndex, rcReading, rcData, rcInsufficient);
+        rc = func(&buf[cp], 8 * intervals, i, nrefs, bai_16kIntervals, ~(unsigned)0, bins, intervals, ctx);
+        if (rc)
+            return rc;
+        cp += 8 * intervals;
+    }
+    if (cp > blen)
+        return RC(rcAlign, rcIndex, rcReading, rcData, rcInsufficient);
+    return 0;
+}
+
+struct LoadIndex1_s {
+    const BAMFile *self;
+    int refNo;
+    unsigned refs;
+    unsigned intervals;
+    unsigned total_interval_count;
+};
+
+static
+rc_t LoadIndex1(const uint8_t data[], size_t dlen, unsigned refNo,
+                unsigned refs, enum BAMIndexStructureTypes type,
+                unsigned binNo, unsigned bins,
+                unsigned elements, void *Ctx)
+{
+    struct LoadIndex1_s *ctx = (struct LoadIndex1_s *)Ctx;
+    
+    ctx->refs = refs;
+    if (refNo != ctx->refNo) {
+        ctx->total_interval_count += ctx->intervals;
+        ctx->intervals = 0;
+        ctx->refNo = refNo;
+    }
+    if (elements != 0) {
+        if (refNo > ctx->self->refSeqs)
+            return RC(rcAlign, rcIndex, rcReading, rcData, rcInvalid);
+        ctx->intervals = (ctx->self->refSeq[refNo].length + 16383) >> 14;
+        if (type == bai_16kIntervals && elements > ctx->intervals)
+            return RC(rcAlign, rcIndex, rcReading, rcData, rcExcessive);
+        if (type == bai_StartStopPairs && bin2ival(binNo) > ctx->intervals)
+            return RC(rcAlign, rcIndex, rcReading, rcData, rcExcessive);
+    }
+    return 0;
+}
+
+struct LoadIndex2_s {
+    const BAMFile *self;
+    BAMFilePosition **refSeq;
+    BAMFilePosition *cur;
+#if _DEBUGGING
+    BAMFilePosition *end;
+#endif
+    const uint8_t *base;
+    unsigned bins[MAX_BIN + 1];
+    bool hasData;
+};
+
+static
+rc_t LoadIndex2a(const uint8_t data[], size_t dlen, unsigned refNo,
+                 unsigned refs, enum BAMIndexStructureTypes type,
+                 unsigned binNo, unsigned bins,
+                 unsigned elements, struct LoadIndex2_s *ctx)
+{
+    const unsigned max_ival = (ctx->self->refSeq[refNo].length + 16383) >> 14;
+    unsigned i;
+    unsigned cp;
+    unsigned k;
+    uint32_t chunk_count;
+    uint64_t minOffset[1u << 15];
+
+    assert(ctx->refSeq[refNo] == NULL);
+    ctx->refSeq[refNo] = ctx->cur;
+    ctx->cur += max_ival;
+    
+#if _DEBUGGING
+    assert(refNo < ctx->self->refSeqs);
+    assert(ctx->cur <= ctx->end);
+    assert(elements <= max_ival);
+#endif
+    /* get the positions of the first records in the 16kbp intervals */
+    for (cp = i = 0; i != elements; ++i, cp += 8)
+        ctx->refSeq[refNo][i] = get_pos(&data[cp]);
+    /* get the positions of the first records in the 16kbp bins */
+    for (i = MAX_BIN; i != 0; ) {
+        const unsigned ival = bin2ival(--i);
+        const unsigned n_ival = bin_ival_count(i);
+        uint64_t found;
+        
+        cp = ctx->bins[i];
+        if (cp == 0)
+            continue;
+        if (n_ival > 1)
+            break;
+        
+        assert(i == LE2HI32(ctx->base + cp));
+        cp += 4;
+        chunk_count = LE2HI32(ctx->base + cp); cp += 4;
+        found = ctx->refSeq[refNo][ival];
+        for (k = 0; k < chunk_count; ++k) {
+            const uint64_t start = get_pos(ctx->base + cp);
+            
+            cp += 16;
+            if (found == 0 || start < found)
+                found = start;
+        }
+        ctx->refSeq[refNo][ival] = found;
+    }
+    /* The interval list now contains the offsets to the first alignment
+     * that starts at or after the interval's starting position.
+     * An interval's starting position is 16kpb * interval number.
+     *
+     * We will now use the information from the bigger bins to find the
+     * offsets of the first chunk of alignments that ends after an
+     * interval's first alignment.
+     */
+    memset(minOffset, 0, sizeof(minOffset));
+    for (i = 0; i != MAX_BIN; ++i) {
+        const unsigned ival = bin2ival(i);
+        unsigned const n_ival = bin_ival_count(i);
+        
+        cp = ctx->bins[i];
+        if (cp == 0)
+            continue;
+        if (n_ival <= 1)
+            break;
+        
+        chunk_count = LE2HI32(ctx->base + cp + 4); cp += 8;
+        for (k = 0; k < chunk_count; ++k) {
+            const uint64_t start = get_pos(ctx->base + cp);
+            const uint64_t end   = get_pos(ctx->base + cp + 8);
+            unsigned l;
+            
+            cp += 16;
+            for (l = 0; ival + l < max_ival; ++l) {
+                if (start < ctx->refSeq[refNo][ival + l] &&
+                    ctx->refSeq[refNo][ival + l] <= end &&
+                    (start < minOffset[ival + l] ||
+                     minOffset[ival + l] == 0
+                     )
+                    )
+                {
+                    minOffset[ival + l] = start;
+                }
+            }
+        }
+    }
+    /* update the intervals to the new earlier offsets if any */
+    for (i = 0; i != max_ival; ++i) {
+        if (minOffset[i] != 0)
+            ctx->refSeq[refNo][i] = minOffset[i];
+    }
+    memset(ctx->bins, 0, sizeof(ctx->bins));
+    ctx->hasData = false;
+    return 0;
+}
+
+static
+rc_t LoadIndex2(const uint8_t data[], size_t dlen, unsigned refNo,
+                unsigned refs, enum BAMIndexStructureTypes type,
+                unsigned binNo, unsigned bins,
+                unsigned elements, void *Ctx)
+{
+    struct LoadIndex2_s *ctx = (struct LoadIndex2_s *)Ctx;
+    
+    if (type == bai_StartStopPairs) {
+        if (binNo < MAX_BIN && elements != 0) {
+            ctx->bins[binNo] = &data[-8] - ctx->base;
+            ctx->hasData = true;
+        }
+    }
+    else if (elements != 0 || ctx->hasData)
+        return LoadIndex2a(data, dlen, refNo, refs, type, binNo, bins,
+                           elements, (struct LoadIndex2_s *)Ctx);
+    return 0;
+}    
+
+static
+rc_t LoadIndex(BAMFile *self, const uint8_t buf[], size_t blen)
+{
+    BAMIndex *idx;
+    rc_t rc;
+    struct LoadIndex1_s loadIndex1ctx;
+    unsigned const posArray = ((uintptr_t)&((const BAMFilePosition **)(NULL))[self->refSeqs]) / sizeof(BAMFilePosition *);
+
+    memset(&loadIndex1ctx, 0, sizeof(loadIndex1ctx));
+    loadIndex1ctx.refNo = -1;
+    loadIndex1ctx.self = self;
+    
+    rc = WalkIndexStructure(buf, blen, LoadIndex1, &loadIndex1ctx);
+    if (rc == 0) {
+        loadIndex1ctx.total_interval_count += loadIndex1ctx.intervals;
+        idx = calloc(1, posArray * sizeof(BAMFilePosition *) +
+                     loadIndex1ctx.total_interval_count * sizeof(BAMFilePosition));
+        if (idx == NULL)
+            rc = RC(rcAlign, rcIndex, rcReading, rcMemory, rcExhausted);
+        else {
+            struct LoadIndex2_s *loadIndex2ctx;
+            
+            if (self->ndx)
+                BAMIndexWhack(self->ndx);
+            self->ndx = idx;
+            
+            loadIndex2ctx = malloc(sizeof(*loadIndex2ctx));
+            if (loadIndex2ctx == NULL) {
+                rc = RC(rcAlign, rcIndex, rcReading, rcMemory, rcExhausted);
+                free(idx);
+                self->ndx = NULL;
+            }
+            else {
+                memset(loadIndex2ctx->bins, 0, sizeof(loadIndex2ctx->bins));
+                loadIndex2ctx->self = self;
+                loadIndex2ctx->refSeq = &idx->refSeq[0];
+                loadIndex2ctx->base = buf;
+                loadIndex2ctx->hasData = false;
+                loadIndex2ctx->cur = (BAMFilePosition *)&idx->refSeq[posArray];
+#if _DEBUGGING
+                loadIndex2ctx->end = loadIndex2ctx->cur + loadIndex1ctx.total_interval_count;
+#endif
+                
+                WalkIndexStructure(buf, blen, LoadIndex2, loadIndex2ctx);
+                free(loadIndex2ctx);
+            }
+        }
+    }
+    return rc;
+}
+
+static
+rc_t BAMFileOpenIndexKFile(const BAMFile *self, KFile const *kf)
+{
+    rc_t rc;
+    size_t fsize;
+    uint8_t *buf;
+    {
+        uint64_t u64;
+
+        rc = KFileSize(kf, &u64);
+        if (sizeof(size_t) < sizeof(u64) && (size_t)u64 != u64) {
+            return RC(rcAlign, rcIndex, rcReading, rcData, rcExcessive);
+        }
+        fsize = u64;
+    }
+    if (rc == 0) {
+        buf = malloc(fsize);
+        if (buf != NULL) {
+            size_t nread;
+            
+            rc = KFileReadAll(kf, 0, buf, fsize, &nread);
+            if (rc == 0) {
+                if (nread == fsize) {
+                    rc = LoadIndex((BAMFile *)self, buf, nread);
+                    free(buf);
+                    return rc;
+                }
+                rc = RC(rcAlign, rcIndex, rcReading, rcData, rcInvalid);
+            }
+            free(buf);
+        }
+        else
+            rc = RC(rcAlign, rcIndex, rcReading, rcMemory, rcExhausted);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC BAMFileOpenIndex(const BAMFile *self, const char *path)
+{
+    const KFile *kf;
+    rc_t rc;
+    KDirectory *dir;
+    
+    rc = KDirectoryNativeDir(&dir);
+    if (rc) return rc;
+    rc = KDirectoryOpenFileRead(dir, &kf, "%s", path);
+    KDirectoryRelease(dir);
+    if (rc) return rc;
+    rc = BAMFileOpenIndexKFile(self, kf);
+    KFileRelease(kf);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC BAMFileOpenIndexWithVPath(const BAMFile *self, const VPath *path)
+{
+    VFSManager *vfs = NULL;
+    KFile const *fp = NULL;
+    rc_t rc = 0;
+
+    rc = VFSManagerMake(&vfs);
+    if (rc) return rc;
+
+    rc = VFSManagerOpenFileRead(vfs, &fp, path);
+    VFSManagerRelease(vfs);
+    if (rc) return rc;
+
+    rc = BAMFileOpenIndexKFile(self, fp);
+    KFileRelease(fp);
+    return rc;
+}
+
+LIB_EXPORT bool CC BAMFileIsIndexed(const BAMFile *self)
+{
+	if (self && self->ndx)
+		return true;
+	return false;
+}
+
+LIB_EXPORT bool CC BAMFileIndexHasRefSeqId(const BAMFile *self, uint32_t refSeqId)
+{
+	if (self && self->ndx && self->ndx->refSeq[refSeqId])
+		return true;
+	return false;
+}
+
+static void BAMAlignmentAlignInfo(BAMAlignment *const self,
+                                  int32_t ref[],
+                                  int32_t beg[],
+                                  int32_t end[])
+{
+    (void)BAMAlignmentSetOffsets(self);
+    
+    ref[0] = getRefSeqId(self);
+    end[0] = (beg[0] = getPosition(self)) + ReferenceLengthFromCIGAR(self);
+}
+
+static
+rc_t BAMFileGetAlignPosAtFilePos(BAMFile *const self,
+                                 BAMFilePosition const *const fpos,
+                                 int32_t ref[],
+                                 int32_t beg[],
+                                 int32_t end[])
+{
+    rc_t rc = BAMFileSetPosition(self, fpos);
+    
+    if (rc == 0) {
+        BAMAlignment x;
+        int32_t i32;
+        
+        rc = BAMFileReadI32(self, &i32); if (rc) return rc;
+        if (i32 <= 0)
+            return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+
+        memset(&x, 0, sizeof(x));
+        x.datasize = i32;
+        if (x.datasize <= BAMFileMaxPeek(self)) {
+            x.data = (void *)&self->buffer[self->bufCurrent];
+            BAMFileAdvance(self, x.datasize);
+
+            BAMAlignmentAlignInfo(&x, ref, beg, end);
+        }
+        else {
+            void *const temp = malloc(x.datasize);
+            
+            if (temp) {
+                x.data = temp;
+                
+                rc = BAMFileReadn(self, x.datasize, temp);
+                if (rc == 0)
+                    BAMAlignmentAlignInfo(&x, ref, beg, end);
+                
+                free(temp);
+            }
+            else
+                rc = RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC BAMFileSeek(const BAMFile *self, uint32_t refSeqId, uint64_t alignStart, uint64_t alignEnd)
+{
+    BAMFilePosition rpos = 0;
+    rc_t rc;
+    int32_t prev_alignPos;
+    int32_t alignPos;
+    int32_t alignEndPos;
+    int32_t refSeq;
+    
+    if (self->ndx == NULL)
+        return RC(rcAlign, rcFile, rcPositioning, rcIndex, rcNotFound);
+    if (refSeqId >= self->refSeqs)
+        return RC(rcAlign, rcFile, rcPositioning, rcData, rcNotFound);
+    if (self->ndx->refSeq[refSeqId] == NULL)
+        return RC(rcAlign, rcFile, rcPositioning, rcData, rcNotFound);
+    if (alignStart >= self->refSeq[refSeqId].length)
+        return RC(rcAlign, rcFile, rcPositioning, rcData, rcNotFound);
+    if (alignEnd > self->refSeq[refSeqId].length)
+        alignEnd = self->refSeq[refSeqId].length;
+    
+    {
+        unsigned adjust = 0;
+        uint32_t ival_start = (uint32_t)(alignStart >> 14);
+        {
+            uint32_t const ival_end = (uint32_t)((alignEnd + 16383) >> 14);
+            
+            /* find the first interval >= alignStart that has an alignment */
+            while (ival_start != ival_end && (rpos = self->ndx->refSeq[refSeqId][ival_start]) == 0)
+                ++ival_start;
+        }
+        if (rpos == 0)
+            return RC(rcAlign, rcFile, rcPositioning, rcData, rcNotFound);
+        do {
+            rc = BAMFileGetAlignPosAtFilePos((BAMFile *)self, &rpos, &refSeq, &alignPos, &alignEndPos);
+            if (rc)
+                return RC(rcAlign, rcFile, rcPositioning, rcIndex, rcInvalid);
+            if (refSeq != refSeqId)
+                return RC(rcAlign, rcFile, rcPositioning, rcData, rcNotFound);
+            if (alignPos <= alignEnd)
+                break; /* we found the interval we were looking for */
+            
+            /* we over-shot */
+            if (++adjust >= ival_start)
+                return RC(rcAlign, rcFile, rcPositioning, rcData, rcNotFound);
+            if ((rpos = self->ndx->refSeq[refSeqId][ival_start - adjust]) == 0)
+                return RC(rcAlign, rcFile, rcPositioning, rcData, rcNotFound);
+        } while (1);
+    }
+    prev_alignPos = alignPos;
+    
+    do {
+        if (alignPos > alignEnd)
+            return RC(rcAlign, rcFile, rcPositioning, rcData, rcNotFound);
+        
+        /* if the alignment overlaps the target range then we are done */
+        if (alignPos >= alignStart || alignEndPos >= alignStart)
+            return BAMFileSetPosition(self, &rpos);
+        
+        /* start linear scan */
+        BAMFileGetPosition(self, &rpos);
+        rc = BAMFileGetAlignPosAtFilePos((BAMFile *)self, &rpos, &refSeq, &alignPos, &alignEndPos);
+        if ((int)GetRCObject(rc) == rcData && (int)GetRCState(rc) == rcInsufficient)
+            return RC(rcAlign, rcFile, rcPositioning, rcData, rcNotFound);
+        if (rc) return rc;
+        if (refSeq != refSeqId)
+            return RC(rcAlign, rcFile, rcPositioning, rcData, rcNotFound);
+        
+        /*  indexed BAM must be sorted by position
+         *  so verify that we are not out of order
+         *  whether this means that the index is bad
+         *  or the file is bad, likely both
+         *  fix the file and regenerate the index
+         */
+        if (prev_alignPos > alignPos)
+            return RC(rcAlign, rcFile, rcPositioning, rcIndex, rcInvalid);
+        prev_alignPos = alignPos;
+    } while (1);
+}
+
+static rc_t BAMIndexWhack(const BAMIndex *cself) {
+    free((void *)cself);
+    return 0;
+}
+
+/* MARK: BAM Validation Stuff */
+
+static rc_t OpenVPathRead(const KFile **fp, struct VPath const *path)
+{
+    char buffer[4096];
+    size_t blen;
+    rc_t rc = VPathReadPath(path, buffer, sizeof(buffer), &blen);
+    
+    if (rc == 0) {
+        KDirectory *dir;
+        
+        rc = KDirectoryNativeDir(&dir);
+        if (rc == 0) {
+            rc = KDirectoryOpenFileRead(dir, fp, "%.*s", (int)blen, buffer);
+            KDirectoryRelease(dir);
+        }
+    }
+    return rc;
+}
+
+static rc_t ReadVPath(void **data, size_t *dsize, struct VPath const *path)
+{
+    const KFile *fp;
+    rc_t rc = OpenVPathRead(&fp, path);
+    
+    if (rc == 0) {
+        uint8_t *buff;
+        uint64_t fsz;
+        size_t bsz = 0;
+        
+        rc = KFileSize(fp, &fsz);
+        if (rc == 0) {
+            if ((size_t)fsz != fsz)
+                return RC(rcAlign, rcFile, rcReading, rcFile, rcTooBig);
+            buff = malloc(fsz);
+            if (buff == NULL)
+                return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+            do {
+                size_t nread;
+                
+                rc = KFileRead(fp, 0, buff + bsz, fsz - bsz, &nread);
+                if (rc)
+                    break;
+                bsz += nread;
+            } while (bsz < (size_t)fsz);
+            if (rc == 0) {
+                *data = buff;
+                *dsize = bsz;
+                return 0;
+            }
+            free(buff);
+        }
+    }
+    return rc;
+}
+
+static rc_t VPath2BGZF(BGZFile *bgzf, struct VPath const *path)
+{
+    const KFile *fp;
+    BGZFile_vt dummy;
+    rc_t rc = OpenVPathRead(&fp, path);
+    
+    if (rc == 0) {
+        rc = BGZFileInit(bgzf, fp, &dummy);
+        KFileRelease(fp);
+    }
+    return rc;
+}
+
+struct index_data {
+    uint64_t position;
+    unsigned refNo;
+    unsigned binNo;
+    bool found;
+};
+
+struct buffer_data {
+    uint64_t position;
+    size_t size;
+};
+
+typedef struct BAMValidate_ctx_s BAMValidate_ctx_t;
+struct BAMValidate_ctx_s {
+    BAMValidateCallback callback;
+    void *ctx;
+    BAMValidateStats *stats;
+    const uint8_t *bai;
+    int32_t *refLen;
+    struct index_data *position;
+    uint8_t *buf;
+    uint8_t *nxt;
+    size_t bsize;
+    size_t alloced;
+    size_t dnext;
+    uint32_t options;
+    uint32_t lastRefId;
+    uint32_t lastRefPos;
+    unsigned npositions;
+    unsigned mpositions;
+    unsigned nrefs;
+    bool cancelled;
+};
+
+static
+rc_t IndexValidateStructure(const uint8_t data[], size_t dlen,
+                            unsigned refNo,
+                            unsigned refs,
+                            enum BAMIndexStructureTypes type,
+                            unsigned binNo,
+                            unsigned bins,
+                            unsigned elements,
+                            void *Ctx)
+{
+    BAMValidate_ctx_t *ctx = Ctx;
+    rc_t rc = 0;
+    
+    ctx->stats->baiFilePosition = data - ctx->bai;
+    rc = ctx->callback(ctx->ctx, 0, ctx->stats);
+    if (rc)
+        ctx->cancelled = true;
+    return rc;
+}
+
+static int64_t CC comp_index_data(const void *A, const void *B, void *ignored)
+{
+    const struct index_data *a = A;
+    const struct index_data *b = B;
+    
+    if (a->position < b->position)
+        return -1;
+    else if (a->position > b->position)
+        return 1;
+    else
+        return 0;
+}
+
+static
+rc_t BAMValidateLoadIndex(const uint8_t data[], size_t dlen,
+                          unsigned refNo,
+                          unsigned refs,
+                          enum BAMIndexStructureTypes type,
+                          unsigned binNo,
+                          unsigned bins,
+                          unsigned elements,
+                          void *Ctx)
+{
+    BAMValidate_ctx_t *ctx = Ctx;
+    unsigned const n = type == bai_16kIntervals ? elements : elements * 2;
+    unsigned i;
+    unsigned j;
+    
+    if (type == bai_StartStopPairs && binNo >= MAX_BIN)
+        return 0;
+    
+    if (ctx->npositions + elements > ctx->mpositions) {
+        void *temp;
+        
+        do { ctx->mpositions <<= 1; } while (ctx->npositions + elements > ctx->mpositions);
+        temp = realloc(ctx->position, ctx->mpositions * sizeof(ctx->position[0]));
+        if (temp == NULL)
+            return RC(rcAlign, rcIndex, rcReading, rcMemory, rcExhausted);
+        ctx->position = temp;
+    }
+    for (j = i = 0; i != n; ++i) {
+        uint64_t const pos = get_pos(&data[i * 8]);
+        
+        if (type == bai_StartStopPairs && (i & 1) != 0)
+            continue;
+        
+        if (pos) {
+            ctx->position[ctx->npositions + j].refNo = refNo;
+            ctx->position[ctx->npositions + j].binNo = binNo;
+            ctx->position[ctx->npositions + j].position = pos;
+            ++j;
+        }
+    }
+    ctx->npositions += j;
+    return 0;
+}
+
+static
+rc_t BAMValidateHeader(const uint8_t data[],
+                       unsigned dsize,
+                       unsigned *header_len,
+                       unsigned *refs_start,
+                       unsigned *nrefs,
+                       unsigned *data_start
+                       )
+{
+    int32_t hlen;
+    int32_t refs;
+    unsigned i;
+    unsigned cp;
+    
+    if (dsize < 8)
+        return RC(rcAlign, rcFile, rcValidating, rcData, rcIncomplete);
+    
+    if (memcmp(data, "BAM\1", 4) != 0)
+        return RC(rcAlign, rcFile, rcValidating, rcFormat, rcUnrecognized);
+    
+    hlen = LE2HI32(&data[4]);
+    if (hlen < 0)
+        return RC(rcAlign, rcFile, rcValidating, rcData, rcInvalid);
+    
+    if (dsize < hlen + 12)
+        return RC(rcAlign, rcFile, rcValidating, rcData, rcIncomplete);
+    
+    refs = LE2HI32(&data[hlen + 8]);
+    if (refs < 0)
+        return RC(rcAlign, rcFile, rcValidating, rcData, rcInvalid);
+    
+    for (cp = hlen + 12, i = 0; i != refs; ++i) {
+        int32_t nlen;
+        
+        if (dsize < cp + 4)
+            return RC(rcAlign, rcFile, rcValidating, rcData, rcIncomplete);
+        
+        nlen = LE2HI32(&data[cp]);
+        if (nlen < 0)
+            return RC(rcAlign, rcFile, rcValidating, rcData, rcInvalid);
+        
+        if (dsize < cp + nlen + 4)
+            return RC(rcAlign, rcFile, rcValidating, rcData, rcIncomplete);
+        
+        cp += nlen + 4;
+    }
+    
+    *nrefs = refs;
+    *refs_start = 12 + (*header_len = hlen);
+    *data_start = cp;
+    return 0;
+}
+
+static rc_t BAMValidateIndex(struct VPath const *bampath,
+                             struct VPath const *baipath,
+                             BAMValidateOption options,
+                             BAMValidateCallback callback,
+                             void *callbackContext
+                             )
+{
+    rc_t rc = 0;
+    BGZFile bam;
+    uint8_t *bai = NULL;
+    size_t bai_size;
+    BAMValidateStats stats;
+    BAMValidate_ctx_t ctx;
+    uint8_t data[2 * ZLIB_BLOCK_SIZE];
+    uint32_t dsize = 0;
+    uint64_t pos = 0;
+    uint32_t temp;
+    int32_t ref = -1;
+    int32_t rpos = -1;
+    
+    if ((options & bvo_IndexOptions) == 0)
+        return callback(callbackContext, 0, &stats);
+
+    rc = ReadVPath((void **)&bai, &bai_size, baipath);
+    if (rc)
+        return rc;
+    
+    memset(&stats, 0, sizeof(stats));
+    memset(&ctx, 0, sizeof(ctx));
+    
+    ctx.bai = bai;
+    ctx.stats = &stats;
+    ctx.options = options;
+    ctx.ctx = callbackContext;
+    ctx.callback = callback;
+    
+    if ((options & bvo_IndexOptions) == bvo_IndexStructure)
+        return WalkIndexStructure(bai, bai_size, IndexValidateStructure, &ctx);
+
+    rc = VPath2BGZF(&bam, bampath);
+    if (rc == 0) {
+        ctx.mpositions = 1024 * 32;
+        ctx.position = malloc(ctx.mpositions * sizeof(ctx.position[0]));
+        if (ctx.position == NULL)
+            return RC(rcAlign, rcIndex, rcReading, rcMemory, rcExhausted);
+        
+        rc = WalkIndexStructure(bai, bai_size, BAMValidateLoadIndex, &ctx);
+        free(bai);
+        if (rc) {
+            stats.indexStructureIsBad = true;
+            rc = callback(callbackContext, rc, &stats);
+        }
+        else {
+            unsigned i = 0;
+            
+            stats.indexStructureIsGood = true;
+            stats.baiFileSize = ctx.npositions;
+            
+            ksort(ctx.position, ctx.npositions, sizeof(ctx.position[0]), comp_index_data, 0);
+            
+            stats.bamFileSize = bam.fsize;
+            
+            while (i < ctx.npositions) {
+                uint64_t const ifpos = ctx.position[i].position >> 16;
+                uint16_t const bpos = (uint16_t)ctx.position[i].position;
+                
+                stats.baiFilePosition = i;
+                if (i == 0 || ifpos != pos) {
+                    stats.bamFilePosition = pos = ifpos;
+                    rc = BGZFileSetPos(&bam, pos);
+                    if (rc == 0)
+                        rc = BGZFileRead(&bam, data, &dsize);
+                    if (rc) {
+                        ++stats.indexFileOffset.error;
+                        do {
+                            ++i;
+                            if (i == ctx.npositions)
+                                break;
+                            if (ctx.position[i].position >> 16 != pos)
+                                break;
+                            ++stats.indexFileOffset.error;
+                        } while (1);
+                    }
+                    else
+                        ++stats.indexFileOffset.good;
+
+                    rc = callback(callbackContext, rc, &stats);
+                    if (rc)
+                        break;
+                }
+                else
+                    ++stats.indexFileOffset.good;
+                if ((options & bvo_IndexOptions) > bvo_IndexOffsets1) {
+                    int32_t rsize = 0;
+                    BAMAlignment algn;
+                    
+                    if (bpos >= dsize)
+                        goto BAD_BLOCK_OFFSET;
+                    if (dsize - bpos < 4) {
+                    READ_MORE:
+                        if (dsize > ZLIB_BLOCK_SIZE)
+                            goto BAD_BLOCK_OFFSET;
+
+                        rc = BGZFileRead(&bam, data + dsize, &temp);
+                        if (rc) {
+                            ++stats.blockCompression.error;
+                            goto BAD_BLOCK_OFFSET;
+                        }
+                        dsize += temp;
+                        if (dsize - bpos < 4 || dsize - bpos < rsize)
+                            goto BAD_BLOCK_OFFSET;
+                    }
+                    rsize = LE2HI32(data + bpos);
+                    if (rsize <= 0)
+                        goto BAD_BLOCK_OFFSET;
+                    if (rsize > 0xFFFF) {
+                        ++stats.indexBlockOffset.warning;
+                        ++i;
+                        continue;
+                    }
+                    if (dsize - bpos < rsize)
+                        goto READ_MORE;
+/*                    rc = BAMAlignmentParse(&algn, data + bpos + 4, rsize); */
+                    if (rc)
+                        goto BAD_BLOCK_OFFSET;
+                    ++stats.indexBlockOffset.good;
+                    if ((options & bvo_IndexOptions) > bvo_IndexOffsets2) {
+                        int32_t const refSeqId = getRefSeqId(&algn);
+                        uint16_t const binNo = getBin(&algn);
+                        int32_t const position = getPosition(&algn);
+                        
+                        if (ctx.position[i].refNo == refSeqId &&
+                            (ctx.position[i].binNo == binNo ||
+                             ctx.position[i].binNo == ~((unsigned)0)
+                        ))
+                            ++stats.indexBin.good;
+                        else if (ctx.position[i].refNo == refSeqId)
+                            ++stats.indexBin.warning;
+                        else
+                            ++stats.indexBin.error;
+                        
+                        if (refSeqId < ref || position < rpos)
+                            ++stats.inOrder.error;
+                        
+                        ref = refSeqId;
+                        rpos = position;
+                    }
+                }
+                if (0) {
+                BAD_BLOCK_OFFSET:
+                    ++stats.indexBlockOffset.error;
+                }
+                ++i;
+            }
+        }
+        
+        free(ctx.position);
+        BGZFileWhack(&bam);
+    }
+    stats.bamFilePosition = stats.bamFileSize;
+    return callback(callbackContext, rc, &stats);
+}
+
+static rc_t BAMValidate3(BAMValidate_ctx_t *ctx,
+                         BAMAlignment const *algn
+                         )
+{
+    rc_t rc = 0;
+    uint16_t const flags = getFlags(algn);
+    int32_t const refSeqId = getRefSeqId(algn);
+    int32_t const refPos = getPosition(algn);
+    unsigned const mapQ = getMapQual(algn);
+    bool const aligned =
+        ((flags & BAMFlags_SelfIsUnmapped) == 0) && 
+        (refSeqId >= 0) && (refSeqId < ctx->nrefs) &&
+        (refPos >= 0) && (refPos < ctx->refLen[refSeqId]) && (mapQ > 0);
+    
+    if (ctx->options & bvo_ExtraFields) {
+    }
+    if (aligned) {
+        if ((ctx->options & bvo_Sorted) != 0) {
+            if (ctx->lastRefId < refSeqId || (ctx->lastRefId == refSeqId && ctx->lastRefPos <= refPos))
+                ++ctx->stats->inOrder.good;
+            else
+                ++ctx->stats->inOrder.error;
+            ctx->lastRefId = refSeqId;
+            ctx->lastRefPos = refPos;
+        }
+        if (ctx->options & bvo_CIGARConsistency) {
+        }
+        if (ctx->options & bvo_BinConsistency) {
+        }
+    }
+    if (ctx->options & bvo_FlagsConsistency) {
+    }
+    if (ctx->options & bvo_QualityValues) {
+    }
+    if (ctx->options & bvo_MissingSequence) {
+    }
+    if (ctx->options & bvo_MissingQuality) {
+    }
+    if (ctx->options & bvo_FlagsStats) {
+    }
+    return rc;
+}
+
+static rc_t BAMValidate2(void *Ctx, const BGZFile *file,
+                         rc_t rc, uint64_t fpos,
+                         const zlib_block_t data, unsigned dsize)
+{
+    BAMValidate_ctx_t *ctx = Ctx;
+    rc_t rc2;
+    bool fatal = false;
+    
+    ctx->stats->bamFilePosition = fpos;
+    if (rc) {
+        if (ctx->options == bvo_BlockHeaders)
+            ++ctx->stats->blockHeaders.error;
+        else
+            ++ctx->stats->blockCompression.error;
+    }
+    else if (ctx->options == bvo_BlockHeaders) {
+        ++ctx->stats->blockHeaders.good;
+    }
+    else if (ctx->options == bvo_BlockCompression) {
+        ++ctx->stats->blockHeaders.good;
+        ++ctx->stats->blockCompression.good;
+    }
+    else if (dsize) {
+        ctx->bsize += dsize;
+        if (!ctx->stats->bamHeaderIsBad && !ctx->stats->bamHeaderIsGood) {
+            unsigned header_len;
+            unsigned refs_start;
+            unsigned nrefs;
+            unsigned data_start;
+            
+            rc2 = BAMValidateHeader(ctx->buf, ctx->bsize,
+                                       &header_len, &refs_start,
+                                       &nrefs, &data_start);
+            
+            if (rc2 == 0) {
+                ctx->stats->bamHeaderIsGood = true;
+                if (ctx->options & bvo_BinConsistency) {
+                    ctx->refLen = malloc(nrefs * sizeof(ctx->refLen[0]));
+                    if (ctx->refLen == NULL) {
+                        rc = RC(rcAlign, rcFile, rcValidating, rcMemory, rcExhausted);
+                        fatal = true;
+                    }
+                    else {
+                        unsigned cp;
+                        unsigned i;
+                        
+                        ctx->nrefs = nrefs;
+                        for (i = 0, cp = refs_start; cp != data_start; ++i) {
+                            int32_t len;
+                            
+                            memmove(&len, &ctx->buf[cp], 4);
+                            memmove(&ctx->refLen[i], &ctx->buf[cp + 4 + len], 4);
+                            cp += len + 8;
+                        }
+                    }
+                }
+                ctx->dnext = data_start;
+            }
+            else if ( GetRCState( rc2 ) != rcIncomplete || GetRCObject( rc2 ) != (enum RCObject)rcData)
+            {
+                ctx->stats->bamHeaderIsBad = true;
+                ctx->options = bvo_BlockCompression;
+                rc = rc2;
+            }
+            else
+                ctx->dnext = ctx->bsize;
+        }
+        if (rc == 0) {
+            if (ctx->stats->bamHeaderIsGood) {
+                unsigned cp = ctx->dnext;
+                
+                while (cp + 4 < ctx->bsize) {
+                    int32_t rsize;
+                    
+                    rsize = LE2HI32(&ctx->buf[cp]);
+                    if (rsize < 0) {
+                        ++ctx->stats->blockStructure.error;
+                        ctx->options = bvo_BlockStructure;
+                        
+                        /* throw away the rest of the current buffer */
+                        if (cp >= ctx->bsize - dsize)
+                            cp = ctx->bsize;
+                        else
+                            cp = ctx->bsize - dsize;
+                        
+                        rc = RC(rcAlign, rcFile, rcValidating, rcData, rcInvalid);
+                        break;
+                    }
+                    else if (cp + 4 + rsize < ctx->bsize) {
+                        if (rsize > UINT16_MAX)
+                            ++ctx->stats->blockStructure.warning;
+                        else
+                            ++ctx->stats->blockStructure.good;
+                        if (ctx->options > bvo_BlockStructure) {
+                            BAMAlignment algn;
+                            
+/*                            rc = BAMAlignmentParse(&algn, &ctx->buf[cp + 4], rsize); */
+                            if (rc == 0) {
+                                ++ctx->stats->recordStructure.good;
+                                if (ctx->options > bvo_RecordStructure)
+                                    rc = BAMValidate3(ctx, &algn);
+                            }
+                            else
+                                ++ctx->stats->recordStructure.error;
+                        }
+                        cp += 4 + rsize;
+                    }
+                    else
+                        break;
+                }
+                if (&ctx->buf[cp] >= data) {
+                    if (cp < ctx->bsize) {
+                        ctx->bsize -= cp;
+                        memmove(ctx->buf, &ctx->buf[cp], ctx->bsize);
+                        cp = ctx->bsize;
+                    }
+                    else {
+                        assert(cp == ctx->bsize);
+                        cp = ctx->bsize = 0;
+                    }
+                }
+                ctx->dnext = cp;
+            }
+            if (ctx->alloced < ctx->bsize + ZLIB_BLOCK_SIZE) {
+                void *temp;
+                
+                temp = realloc(ctx->buf, ctx->alloced + ZLIB_BLOCK_SIZE);
+                if (temp == NULL) {
+                    rc = RC(rcAlign, rcFile, rcValidating, rcMemory, rcExhausted);
+                    fatal = true;
+                }
+                else {
+                    ctx->buf = temp;
+                    ctx->alloced += ZLIB_BLOCK_SIZE;
+                }
+            }
+            ctx->nxt = &ctx->buf[ctx->dnext];
+        }
+    }
+    rc2 = ctx->callback(ctx->ctx, rc, ctx->stats);
+    ctx->cancelled |= rc2 != 0;
+    return fatal ? rc : rc2;
+}
+
+static rc_t BAMValidateBAM(struct VPath const *bampath,
+                           BAMValidateOption options,
+                           BAMValidateCallback callback,
+                           void *callbackContext
+                           )
+{
+    rc_t rc;
+    BGZFile bam;
+    BAMValidate_ctx_t ctx;
+    BAMValidateStats stats;
+
+    if (bampath == NULL)
+        return RC(rcAlign, rcFile, rcValidating, rcParam, rcNull);
+    
+    memset(&ctx, 0, sizeof(ctx));
+    memset(&stats, 0, sizeof(stats));
+    
+    ctx.callback = callback;
+    ctx.ctx = callbackContext;
+    ctx.options = options;
+    ctx.stats = &stats;
+    
+    if (options > bvo_BlockCompression) {
+        ctx.alloced = ZLIB_BLOCK_SIZE * 2;
+        ctx.nxt = ctx.buf = malloc(ctx.alloced);
+        
+        if (ctx.buf == NULL)
+            return RC(rcAlign, rcFile, rcValidating, rcMemory, rcExhausted);
+    }
+    
+    if (options > bvo_RecordStructure)
+        options = bvo_RecordStructure | (options & 0xFFF0);
+    
+    rc = VPath2BGZF(&bam, bampath);
+    if (rc == 0) {
+        stats.bamFileSize = bam.fsize;
+        if ((options & 7) > bvo_BlockHeaders)
+            rc = BGZFileWalkBlocks(&bam, true, (zlib_block_t *)&ctx.nxt, BAMValidate2, &ctx);
+        else
+            rc = BGZFileWalkBlocks(&bam, false, NULL, BAMValidate2, &ctx);
+    }
+    BGZFileWhack(&bam);
+    return rc;
+}
+
+static rc_t CC dummy_cb(void *ctx, rc_t result, const BAMValidateStats *stats)
+{
+    return 0;
+}
+
+LIB_EXPORT rc_t CC BAMValidate(struct VPath const *bampath,
+                               struct VPath const *baipath,
+                               BAMValidateOption options,
+                               BAMValidateCallback callback,
+                               void *callbackContext
+                               )
+{
+    if (callback == NULL)
+        callback = dummy_cb;
+    if (bampath == NULL)
+        return RC(rcAlign, rcFile, rcValidating, rcParam, rcNull);
+    if (baipath == NULL) {
+        if (options & bvo_IndexOptions)
+            return RC(rcAlign, rcFile, rcValidating, rcParam, rcNull);
+        return BAMValidateBAM(bampath, options, callback, callbackContext);
+    }
+    return BAMValidateIndex(bampath, baipath, options, callback, callbackContext);
+}
diff --git a/libs/align/debug.h b/libs/align/debug.h
new file mode 100644
index 0000000..7c03771
--- /dev/null
+++ b/libs/align/debug.h
@@ -0,0 +1,77 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_align_debug_
+#define _h_align_debug_
+
+#include <klib/debug.h>
+
+#if _DEBUGGING
+
+#define ALIGN_DBGF(msg) DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_WRITER), msg)
+#define ALIGN_DBG(fmt, ...) ALIGN_DBGF(("%s:%u: " fmt "\n", __func__, __LINE__, __VA_ARGS__))
+#define ALIGN_DBGERR(rc) if(rc != 0) {ALIGN_DBGF(("%s:%u: %R\n", __func__, __LINE__, rc));}
+#define ALIGN_DBGERRP(fmt, rc, ...) if(rc != 0) {ALIGN_DBGF(("%s:%u: %R " fmt "\n", __func__, __LINE__, rc, __VA_ARGS__));}
+
+#define ALIGN_C_DBGF(msg) DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_COMPRESS), msg)
+#define ALIGN_C_DBG(fmt, ...) ALIGN_C_DBGF(("%s:%u: " fmt "\n", __func__, __LINE__, __VA_ARGS__))
+#define ALIGN_C_DBGERR(rc) if(rc != 0) {ALIGN_C_DBGF(("%s:%u: %R\n", __func__, __LINE__, rc));}
+#define ALIGN_C_DBGERRP(fmt, rc, ...) if(rc != 0) {ALIGN_C_DBGF(("%s:%u: %R " fmt "\n", __func__, __LINE__, rc, __VA_ARGS__));}
+
+#define ALIGN_R_DBGF(msg) DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_COVERAGE), msg)
+#define ALIGN_R_DBG(fmt, ...) ALIGN_R_DBGF(("%s:%u: " fmt "\n", __func__, __LINE__, __VA_ARGS__))
+#define ALIGN_R_DBGERR(rc) if(rc != 0) {ALIGN_R_DBGF(("%s:%u: %R\n", __func__, __LINE__, rc));}
+#define ALIGN_R_DBGERRP(fmt, rc, ...) if(rc != 0) {ALIGN_R_DBGF(("%s:%u: %R " fmt "\n", __func__, __LINE__, rc, __VA_ARGS__));}
+
+#define ALIGN_CF_DBGF(msg) DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_CFG), msg)
+#define ALIGN_CF_DBG(fmt, ...) ALIGN_CF_DBGF(("%s:%u: " fmt "\n", __func__, __LINE__, __VA_ARGS__))
+#define ALIGN_CF_DBGERR(rc) if(rc != 0) {ALIGN_CF_DBGF(("%s:%u: %R\n", __func__, __LINE__, rc));}
+#define ALIGN_CF_DBGERRP(fmt, rc, ...) if(rc != 0) {ALIGN_CF_DBGF(("%s:%u: %R " fmt "\n", __func__, __LINE__, rc, __VA_ARGS__));}
+
+#else
+
+#define ALIGN_DBGF(msg) ((void)0)
+#define ALIGN_DBG(fmt, ...) ((void)0)
+#define ALIGN_DBGERR(rc) ((void)0)
+#define ALIGN_DBGERRP(fmt, rc, ...) ((void)0)
+
+#define ALIGN_C_DBGF(msg) ((void)0)
+#define ALIGN_C_DBG(fmt, ...) ((void)0)
+#define ALIGN_C_DBGERR(rc) ((void)0)
+#define ALIGN_C_DBGERRP(fmt, rc, ...) ((void)0)
+
+#define ALIGN_R_DBGF(msg) ((void)0)
+#define ALIGN_R_DBG(fmt, ...) ((void)0)
+#define ALIGN_R_DBGERR(rc) ((void)0)
+#define ALIGN_R_DBGERRP(fmt, rc, ...) ((void)0)
+
+#define ALIGN_CF_DBGF(msg) ((void)0)
+#define ALIGN_CF_DBG(fmt, ...) ((void)0)
+#define ALIGN_CF_DBGERR(rc) ((void)0)
+#define ALIGN_CF_DBGERRP(fmt, rc, ...) ((void)0)
+
+#endif
+
+#endif /* _h_align_debug_ */
diff --git a/libs/align/dna-reverse-cmpl.c b/libs/align/dna-reverse-cmpl.c
new file mode 100644
index 0000000..c9cbb83
--- /dev/null
+++ b/libs/align/dna-reverse-cmpl.c
@@ -0,0 +1,80 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <insdc/insdc.h>
+#include <sysalloc.h>
+
+#include "debug.h"
+#include <align/dna-reverse-cmpl.h>
+#include <string.h>
+
+LIB_EXPORT rc_t CC DNAReverseCompliment(const INSDC_dna_text* seq, INSDC_dna_text* cmpl, uint32_t len)
+{
+    rc_t rc = 0;
+    uint32_t i;
+    static INSDC_dna_text compl[256] = "~";
+
+    if( seq == NULL || cmpl == NULL ) {
+        rc = RC( rcAlign, rcType, rcConverting, rcParam, rcNull);
+    } else {
+        if( compl[0] == '~' ) {
+            INSDC_dna_text* x = (INSDC_dna_text*)&compl[0];
+            memset(x, 0, sizeof(compl));
+            x['A'] = x['a'] = 'T';
+            x['T'] = x['t'] = 'A';
+            x['U'] = x['u'] = 'A';
+            x['G'] = x['g'] = 'C';
+            x['C'] = x['c'] = 'G';
+            x['Y'] = x['y'] = 'R';
+            x['R'] = x['r'] = 'Y';
+            x['S'] = x['s'] = 'S';
+            x['W'] = x['w'] = 'W';
+            x['K'] = x['k'] = 'M';
+            x['M'] = x['m'] = 'K';
+            x['B'] = x['b'] = 'V';
+            x['D'] = x['d'] = 'H';
+            x['H'] = x['h'] = 'D';
+            x['V'] = x['v'] = 'B';
+            x['N'] = x['n'] = 'N';
+            x['0'] = '0';
+            x['1'] = '1';
+            x['2'] = '2';
+            x['3'] = '3';
+        }
+        cmpl += len;
+        for(i = 0; i < len; i++) {
+            *--cmpl= compl[(int)seq[i]];
+            if( *cmpl == '\0' ) {
+                rc = RC(rcAlign, rcFormatter, rcWriting, rcData, rcInvalid);
+                break;
+            }
+        }
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
diff --git a/libs/align/pl_iterator.c b/libs/align/pl_iterator.c
new file mode 100644
index 0000000..0e62d85
--- /dev/null
+++ b/libs/align/pl_iterator.c
@@ -0,0 +1,689 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <klib/vector.h>
+#include <klib/refcount.h>
+#include <klib/sort.h>
+#include <klib/text.h>
+#include <klib/out.h>
+#include <insdc/insdc.h>
+#include <align/manager.h>
+#include <align/iterator.h>
+#include <sysalloc.h>
+
+#include "debug.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+typedef struct window
+{
+    INSDC_coord_zero first;
+    INSDC_coord_len len;
+} window;
+
+
+typedef struct pi_entry
+{
+    DLNode n;                       /* to have it in a DLList */
+    PlacementIterator *pi;          /* the placement-iterator we have added */
+    window nxt_avail;               /* the next available position of the placement-iterator */
+} pi_entry;
+
+
+typedef struct pi_window
+{
+    DLNode n;                       /* to have it in a DLList */
+    window w;                       /* the window of the placement-iterator */
+    DLList pi_entries;              /* it has a DLList of pi_entry-struct's */
+    uint32_t count;                 /* how many entries do we have */
+} pi_window;
+
+
+typedef struct pi_ref
+{
+    DLNode n;                       /* to have it in a DLList */
+    char * name;                    /* the name of the reference it referes to */
+    window outer;                   /* the sum of all windows it has... */
+    bool outer_initialized;         /* has the outer-window been initialized */
+    DLList pi_windows;              /* it has a DLList of pi_window-struct's */
+} pi_ref;
+
+
+struct PlacementSetIterator
+{
+    KRefcount refcount;
+    struct AlignMgr const *amgr;    /* the alignment-manager... ( right now: we store it, but that's it )*/
+    DLList pi_refs;                 /* a list of references we have to iterate over... */
+    pi_ref * current_ref;           /* what is the current reference, we are handling ? */
+    pi_window * current_window;     /* what is the current window, we are handling ? */
+    pi_entry * current_entry;       /* what is the current pi-entry, we are handling ? */
+};
+
+
+/* =================================================================================================== */
+
+
+LIB_EXPORT rc_t CC AlignMgrMakePlacementSetIterator ( struct AlignMgr const *self,
+    PlacementSetIterator **iter )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        if ( iter == NULL  )
+            rc = RC( rcAlign, rcIterator, rcConstructing, rcParam, rcNull );
+        else
+        {
+            PlacementSetIterator * psi = calloc( sizeof * psi, 1 );
+            if ( psi == NULL )
+                rc = RC( rcAlign, rcIterator, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = AlignMgrAddRef ( self );
+                if ( rc == 0 )
+                {
+                    KRefcountInit( &psi->refcount, 1, "PlacementSetIterator", "Make", "align" );
+                    psi->amgr = self;
+                    psi->current_ref = NULL;          /* we don't know that yet */
+                    psi->current_window = NULL;
+                    psi->current_entry = NULL;
+                    DLListInit( &psi->pi_refs );
+                }
+            }
+            if ( rc == 0 )
+                *iter = psi;
+            else
+                free( psi );
+        }
+    }
+
+    return rc;
+}
+
+
+/* =================================================================================================== */
+
+
+static int cmp_pchar( const char * a, const char * b )
+{
+    int res = 0;
+    if ( ( a != NULL )&&( b != NULL ) )
+    {
+        size_t len_a = string_size( a );
+        size_t len_b = string_size( b );
+        res = string_cmp ( a, len_a, b, len_b, ( len_a < len_b ) ? len_b : len_a );
+    }
+    return res;
+}
+
+
+/* =================================================================================================== */
+
+
+typedef struct pi_ref_cb_ctx
+{
+    const char * name;
+    pi_ref *res;
+} pi_ref_cb_ctx;
+
+
+static bool CC find_pi_ref_callback( DLNode *n, void *data )
+{
+    pi_ref_cb_ctx *ctx = ( pi_ref_cb_ctx * )data;
+    pi_ref * pr = ( pi_ref * ) n;
+    bool res = ( cmp_pchar( ctx->name, pr->name ) == 0 );
+    if ( res )
+    {
+        ctx->res = pr;
+    }
+    return res;
+}
+
+
+static pi_ref * find_pi_ref( const DLList * list, const char * name )
+{
+    pi_ref_cb_ctx ctx;
+    ctx.res = NULL;
+    ctx.name = name;
+    DLListDoUntil ( list, false, find_pi_ref_callback, &ctx );
+    return ctx.res;
+}
+
+
+/* =================================================================================================== */
+
+typedef struct pi_window_cb_ctx
+{
+    window *w;
+    pi_window *res;
+} pi_window_cb_ctx;
+
+
+static bool CC find_pi_window_callback( DLNode *n, void *data )
+{
+    pi_window_cb_ctx *ctx = ( pi_window_cb_ctx * )data;
+    pi_window * pw = ( pi_window * ) n;
+    bool res = ( pw->w.first == ctx->w->first && pw->w.len == ctx->w->len );
+    if ( res )
+        ctx->res = pw;
+    return res;
+}
+
+
+static pi_window * find_pi_window( const DLList * list, window * w )
+{
+    pi_window_cb_ctx ctx;
+    ctx.res = NULL;
+    ctx.w = w;
+    DLListDoUntil ( list, false, find_pi_window_callback, &ctx );
+    return ctx.res;
+}
+
+
+/* =================================================================================================== */
+
+
+static rc_t make_pi_window( pi_window ** pw, DLList * list, window * w )
+{
+    rc_t rc = 0;
+    *pw = calloc( 1, sizeof ** pw );
+    if ( *pw == NULL )
+        rc = RC( rcAlign, rcIterator, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        (*pw)->w.first = w->first;
+        (*pw)->w.len = w->len;
+        DLListInit( &( (*pw)->pi_entries ) );
+        DLListPushTail ( list, ( DLNode * )(*pw) );
+    }
+    return rc;
+}
+
+
+static rc_t add_to_pi_window( pi_window * pw, PlacementIterator *pi )
+{
+    rc_t rc = 0;
+    pi_entry * pie = calloc( 1, sizeof *pie );
+    if ( pie == NULL )
+        rc = RC( rcAlign, rcIterator, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = PlacementIteratorNextAvailPos ( pi, &(pie->nxt_avail.first), &(pie->nxt_avail.len) );
+        if ( rc == 0 )
+        {
+            pie->pi = pi;  /* store the placement-iterator in it's entry-struct */
+            DLListPushTail ( &pw->pi_entries, ( DLNode * )pie );
+            pw->count += 1;
+        }
+        else
+        {
+            free( pie );
+            ALIGN_DBG( "PlacementIter has no placements...", 0 );
+        }
+    }
+    return rc;
+}
+
+
+/* =================================================================================================== */
+
+
+static rc_t make_pi_ref( pi_ref ** pr, DLList * list, const char * name )
+{
+    rc_t rc = 0;
+    *pr = calloc( 1, sizeof ** pr );
+    if ( *pr == NULL )
+        rc = RC( rcAlign, rcIterator, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        (*pr)->name = string_dup_measure ( name, NULL );
+        DLListInit( &( (*pr)->pi_windows ) );
+        DLListPushTail ( list, ( DLNode * )(*pr) );
+    }
+    return rc;
+}
+
+
+static rc_t add_to_pi_ref( pi_ref * pr, window * w, PlacementIterator *pi )
+{
+    rc_t rc = 0;
+    pi_window * pw = find_pi_window( &pr->pi_windows, w );
+
+    if ( pw == NULL )
+        rc = make_pi_window( &pw, &pr->pi_windows, w );
+    if ( rc == 0 )
+        rc = add_to_pi_window( pw, pi );
+
+    if ( rc == 0 )
+    {
+        /* keep track of the outer window... */
+        if ( DLListHead( &pr->pi_windows ) == NULL )
+        {
+            /* first window ?*/
+            pr->outer.first = w->first;
+            pr->outer.len = w->len;
+        }
+        else
+        {
+            if ( w->first < pr->outer.first )
+                pr->outer.first = w->first;
+            if ( w->first + w->len > pr->outer.first + pr->outer.len )
+                pr->outer.len = ( ( w->first + w->len ) - pr->outer.first ) + 1;
+        }
+    }
+    else if ( ( pw != NULL )&&( GetRCState( rc ) == rcDone ) )
+    {
+        /* add_to_pi_window() was not successful because iterator has no
+           alignments int the requested window, that means we have to delete
+           the window if it is empty */
+        if ( pw->count == 0 )
+        {
+            /* first we have to take the pw out of the pr->pi_windows - list...
+               it was pushed at the tail of it, so we pop it from there */
+            DLListPopTail( &pr->pi_windows );
+            /* because it is empty ( count == 0 ) we can just free it now */
+            free( pw );
+        }
+    }
+    return rc;
+}
+
+
+/* =================================================================================================== */
+
+
+LIB_EXPORT rc_t CC PlacementSetIteratorAddPlacementIterator ( PlacementSetIterator *self,
+    PlacementIterator *pi )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        if ( pi == NULL  )
+            rc = RC( rcAlign, rcIterator, rcConstructing, rcParam, rcNull );
+        else
+        {
+            const char * name;      /* what reference are we aligning against */
+            window w;               /* where does the pi start/end, against said reference */
+
+            /* to find the name of the reference used, important for adding the iterator */
+            rc = PlacementIteratorRefWindow ( pi, &name, &(w.first), &(w.len) );
+            if ( rc == 0 )
+            {
+                pi_ref * pr = find_pi_ref( &self->pi_refs, name );
+                /* if we do not have a pi_ref yet with this name: make one! */
+                if ( pr == NULL )
+                    rc = make_pi_ref( &pr, &self->pi_refs, name );
+                /* add the placement-iterator to the newly-made or existing pi_ref! */
+                if ( rc == 0 )
+                    rc = add_to_pi_ref( pr, &w, pi );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC PlacementSetIteratorAddRef ( const PlacementSetIterator *cself )
+{
+    rc_t rc = 0;
+    if ( cself == NULL )
+        rc = RC( rcAlign, rcIterator, rcAttaching, rcSelf, rcNull );
+    else
+    {
+        if ( KRefcountAdd( &cself->refcount, "PlacementSetIterator" ) != krefOkay )
+        {
+            rc = RC( rcAlign, rcIterator, rcAttaching, rcError, rcUnexpected );
+        }
+    }
+    return rc;
+}
+
+
+/* =================================================================================================== */
+
+
+static void CC pi_entry_whacker( DLNode *n, void *data )
+{
+    pi_entry * pie = ( pi_entry * )n;
+    if ( pie->pi != NULL )
+    {
+        PlacementIteratorRelease ( pie->pi );
+        pie->pi = NULL;
+    }
+    free( pie );
+}
+
+static void CC pi_window_whacker( DLNode *n, void *data )
+{
+    pi_window * pw = ( pi_window * )n;
+    DLListWhack ( &pw->pi_entries, pi_entry_whacker, NULL );
+    free( pw );
+}
+
+static void CC pi_ref_whacker( DLNode *n, void *data )
+{
+    pi_ref * pr = ( pi_ref * )n;
+    DLListWhack ( &pr->pi_windows, pi_window_whacker, NULL );
+    free( pr->name );
+    free( pr );
+}
+
+
+static void pl_set_iter_clear_curr_ref_window( PlacementSetIterator *self )
+{
+    if ( self->current_window != NULL )
+    {
+        pi_window_whacker( (DLNode *)self->current_window, NULL );
+        self->current_window = NULL;
+    }
+}
+
+
+static void pl_set_iter_clear_curr_ref( PlacementSetIterator *self )
+{
+    if ( self->current_ref != NULL )
+    {
+        pi_ref_whacker( (DLNode *)self->current_ref, NULL );
+        self->current_ref = NULL;
+    }
+}
+
+/* =================================================================================================== */
+
+
+LIB_EXPORT rc_t CC PlacementSetIteratorRelease ( const PlacementSetIterator *cself )
+{
+    rc_t rc = 0;
+    if ( cself == NULL )
+        rc = RC( rcAlign, rcIterator, rcReleasing, rcSelf, rcNull );
+    else
+    {
+        if ( KRefcountDrop( &cself->refcount, "PlacementSetIterator" ) == krefWhack )
+        {
+            PlacementSetIterator * self = ( PlacementSetIterator * ) cself;
+
+            pl_set_iter_clear_curr_ref_window( self );
+            pl_set_iter_clear_curr_ref( self );
+
+            /* release the DLList of pi-ref's and the pi's in it... */
+            DLListWhack ( &self->pi_refs, pi_ref_whacker, NULL );
+
+            AlignMgrRelease ( self->amgr );
+
+            free( self );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC PlacementSetIteratorNextReference ( PlacementSetIterator *self,
+    INSDC_coord_zero *first_pos, INSDC_coord_len *len, struct ReferenceObj const ** refobj )
+{
+    rc_t rc = 0;
+    if ( refobj != NULL ) { *refobj = NULL; }
+
+    if ( self == NULL )
+        return RC( rcAlign, rcIterator, rcReleasing, rcSelf, rcNull );
+
+    pl_set_iter_clear_curr_ref_window( self );
+    pl_set_iter_clear_curr_ref( self );
+    self->current_entry = NULL;     /* what is the current pi-entry, we are handling ? */
+
+    /* !!! here we are taking the next reference from the top of the list */
+    self->current_ref = ( pi_ref * )DLListPopHead ( &self->pi_refs );
+
+    if ( self->current_ref == NULL )
+    {
+        return SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+    }
+
+    if ( first_pos != NULL ) *first_pos = self->current_ref->outer.first;
+    if ( len != NULL) *len = self->current_ref->outer.len;
+
+    /* if the caller wants to know the ref-obj... */
+    if ( refobj != NULL )
+    {
+        pi_window *pw = ( pi_window * )DLListHead( &(self->current_ref->pi_windows) );
+        if ( pw != NULL )
+        {
+            pi_entry * pie = ( pi_entry * )DLListHead( &(pw->pi_entries) );
+            if ( pie != NULL )
+            {
+                rc = PlacementIteratorRefObj( pie->pi, refobj );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC PlacementSetIteratorNextWindow ( PlacementSetIterator *self,
+    INSDC_coord_zero *first_pos, INSDC_coord_len *len )
+{
+    rc_t rc = 0;
+    if ( first_pos != NULL ) { *first_pos = 0; }
+    if ( len != NULL ) { *len = 0; }
+
+    if ( self == NULL )
+        return RC( rcAlign, rcIterator, rcReleasing, rcSelf, rcNull );
+
+    self->current_entry = NULL;     /* what is the current pi-entry, we are handling ? */
+
+    if ( self->current_ref == NULL )
+    {
+        return SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+    }
+
+    pl_set_iter_clear_curr_ref_window( self );
+
+    /* !!! here we are taking the next window from the top of the list */
+    self->current_window = ( pi_window * )DLListPopHead ( &(self->current_ref->pi_windows) );
+
+    /* check if we have reached the last window on this reference... */
+    if ( self->current_window == NULL )
+    {
+        return SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+    }
+
+    /* point to the first entry in this window... */
+    self->current_entry = ( pi_entry * )DLListHead( &(self->current_window->pi_entries) );
+
+    /* if the caller wants to know first_pos / len */
+    if ( first_pos != NULL )
+    {
+        *first_pos = self->current_window->w.first;
+    }
+    if ( len != NULL )
+    {
+        *len = self->current_window->w.len;
+    }
+
+    return rc;
+}
+
+typedef struct pi_ref_nxt_avail_pos_ctx
+{
+    uint32_t count;
+    INSDC_coord_zero min_pos;
+    INSDC_coord_len min_len;
+    bool min_pos_initialized;
+    rc_t rc;
+} pi_ref_nxt_avail_pos_ctx;
+
+static void CC nxt_avail_pos_cb( DLNode * n, void * data )
+{
+    pi_ref_nxt_avail_pos_ctx * ctx = ( pi_ref_nxt_avail_pos_ctx * ) data;
+    if ( ctx->rc == 0 )
+    {
+        pi_entry * pie = ( pi_entry * )n;
+        rc_t rc = PlacementIteratorNextAvailPos ( pie->pi, &(pie->nxt_avail.first), &(pie->nxt_avail.len) );
+        if ( rc == 0 )
+        {
+/*            OUTMSG(( "nxt_avail.first=%u w.last=%u\n", pie->nxt_avail.first, pie->w.last )); */
+            ( ctx->count )++;
+            if ( ctx->min_pos_initialized )
+            {
+                if ( pie->nxt_avail.first < ctx->min_pos )
+                {
+                    ctx->min_pos = pie->nxt_avail.first;
+                    ctx->min_len = pie->nxt_avail.len;
+                }
+            }
+            else
+            {
+                ctx->min_pos = pie->nxt_avail.first;
+                ctx->min_len = pie->nxt_avail.len;
+                ctx->min_pos_initialized = true;
+            }
+        }
+        else
+        {
+            if ( GetRCState( rc ) != rcDone )
+                ctx->rc = rc;
+        }
+    }
+}
+
+
+LIB_EXPORT rc_t CC PlacementSetIteratorNextAvailPos ( const PlacementSetIterator *cself,
+    INSDC_coord_zero *pos, INSDC_coord_len *len )
+{
+    rc_t rc = 0;
+    if ( cself == NULL )
+        rc = RC( rcAlign, rcIterator, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        if ( pos == NULL )
+            rc = RC( rcAlign, rcIterator, rcAccessing, rcParam, rcNull );
+        else
+        {
+            PlacementSetIterator *self = ( PlacementSetIterator * )cself;
+            if ( self->current_ref == NULL || self->current_window == NULL )
+            {
+                rc = SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+            }
+            else
+            {
+                /* loop through all the pi_entry int the current_pi_ref */
+                pi_ref_nxt_avail_pos_ctx ctx;
+                ctx.count = 0;
+                ctx.rc = 0;
+                ctx.min_pos = 0;
+                ctx.min_len = 0;
+                ctx.min_pos_initialized = false;
+                DLListForEach ( &(self->current_window->pi_entries),
+                                false, nxt_avail_pos_cb, &ctx );
+                rc = ctx.rc;
+                if ( ctx.count == 0 )
+                {
+                    rc = SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+                }
+                else
+                {
+                    *pos = ctx.min_pos;
+                    if ( len != NULL )
+                    {
+                        *len = ctx.min_len;
+                    }
+                }
+            } 
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC PlacementSetIteratorNextRecordAt ( PlacementSetIterator *self,
+    INSDC_coord_zero pos, const PlacementRecord **rec )
+{
+    rc_t rc = 0;
+    pi_window * pw;
+    bool done;
+
+    if ( rec == NULL )
+        return RC( rcAlign, rcIterator, rcAccessing, rcParam, rcNull );
+    *rec = NULL;
+    if ( self == NULL )
+        return RC( rcAlign, rcIterator, rcAccessing, rcSelf, rcNull );
+    if ( self->current_ref == NULL )
+    {
+        /* no more reference to iterator over! the iterator is done! */
+        return SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+    }
+    if ( self->current_window == NULL )
+    {
+        /* no more windows to iterator over! the iterator is done! */
+        return SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+    }
+
+    pw = self->current_window;
+    done = false;
+    do
+    {
+        if ( self->current_entry == NULL )
+        {
+            self->current_entry = ( pi_entry * )DLListHead( &(pw->pi_entries) );
+        }
+        done = ( self->current_entry == NULL );
+        rc = ( done ? SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone ) : 0 );
+        if ( rc == 0 )
+        {
+            rc = PlacementIteratorNextRecordAt ( self->current_entry->pi, pos, rec );
+            done = ( GetRCState( rc ) != rcDone );
+            if ( !done )
+            {
+                self->current_entry = ( pi_entry * )DLNodeNext( ( DLNode * )self->current_entry );
+                done = ( self->current_entry == NULL );
+                rc = ( done ? SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone ) : 0 );
+            }
+        }
+    } while ( !done );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC PlacementSetIteratorNextIdAt ( PlacementSetIterator *self,
+    INSDC_coord_zero pos, int64_t *row_id, INSDC_coord_len *len )
+{
+    const PlacementRecord *rec;
+    rc_t rc = PlacementSetIteratorNextRecordAt ( self, pos, &rec );
+    if ( rc == 0 )
+    {
+        if ( row_id != NULL ) *row_id = rec->id;
+        if ( len != NULL ) *len = rec->len;
+    }
+    return rc;
+}
diff --git a/libs/align/quality-quantizer.c b/libs/align/quality-quantizer.c
new file mode 100644
index 0000000..f1a57d7
--- /dev/null
+++ b/libs/align/quality-quantizer.c
@@ -0,0 +1,109 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <align/extern.h>
+#include <klib/defs.h>
+#include <align/quality-quantizer.h>
+
+#include <stdint.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <os-native.h>
+
+
+LIB_EXPORT
+bool CC QualityQuantizerInitMatrix(uint8_t dst[256], char const quant[])
+{
+    unsigned i = 0;
+    unsigned limit = 0;
+    unsigned value = 0;
+    unsigned cur;
+    int ws = 1;
+    int st = 0;
+    
+    memset(dst, 0, 256);
+    for (cur = 0; quant[cur] != 0; ++cur) {
+        int const ch = quant[cur];
+        
+        if (ws) {
+            if (isspace(ch))
+                continue;
+            ws = false;
+        }
+        switch (st) {
+        case 0:
+            if (isdigit(ch)) {
+                value = (value * 10) + ch - '0';
+                break;
+            }
+            else if (isspace(ch)) {
+                ++st;
+                ws = true;
+                break;
+            }
+            ++st;
+            /* no break */
+        case 1:
+            if (ch != ':')
+                return false;
+            ws = true;
+            ++st;
+            break;
+        case 2:
+            if (isdigit(ch)) {
+                limit  = (limit * 10) + ch - '0';
+                break;
+            }
+            else if (isspace(ch)) {
+                ++st;
+                ws = true;
+                break;
+            }
+            else if (ch == '-' && limit == 0) {
+                memset(dst + i, value, 256 - i);
+                return true;
+            }
+            ++st;
+            /* no break */
+        case 3:
+            if (ch != ',')
+                return false;
+            ws = true;
+            st = 0;
+            if (i > limit)
+                return false;
+            /* set from dst[i..(limit - 1)] = value
+             * not inclusive of the endpoint
+             */
+            memset(dst + i, value, limit - i);
+            i = limit;
+            limit = value = 0;
+            break;
+        }
+    }
+    return false;
+}
diff --git a/libs/align/reader-cmn.c b/libs/align/reader-cmn.c
new file mode 100644
index 0000000..ae0c22d
--- /dev/null
+++ b/libs/align/reader-cmn.c
@@ -0,0 +1,317 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was readten as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+
+#include "reader-cmn.h"
+#include "debug.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+struct TableReader
+{
+    const VCursor* curs;
+    const TableReaderColumn* cols;
+    int64_t curr;
+};
+
+
+rc_t CC TableReader_Make( const TableReader** cself, const VTable* table,
+                          TableReaderColumn* cols, size_t cache )
+{
+    rc_t rc = 0;
+    const VCursor* curs;
+
+    if ( table == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcConstructing, rcParam, rcInvalid );
+    }
+    else
+    {
+        rc = VTableCreateCachedCursorRead( table, &curs, cache );
+        if ( rc == 0 )
+        {
+            rc = TableReader_MakeCursor( cself, curs, cols );
+            VCursorRelease( curs );
+        }
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+rc_t CC TableReader_MakeCursor( const TableReader** cself, const VCursor* cursor,
+                                TableReaderColumn* cols )
+{
+    rc_t rc = 0;
+    TableReader* obj = NULL;
+
+    if ( cself == NULL || cursor == NULL || cols == NULL || cols->name == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcConstructing, rcParam, rcInvalid );
+    }
+    else if ( ( obj = calloc( 1, sizeof( *obj ) ) ) == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        rc = VCursorAddRef( cursor );
+        if ( rc == 0 )
+        {
+            obj->curs = cursor;
+/*            obj->cursor_open = false; */
+            obj->cols = cols;
+            while ( rc == 0 && cols->name != NULL)
+            {
+                if ( !( cols->flags & ercol_Skip ) )
+                {
+                    rc = VCursorAddColumn( obj->curs, &cols->idx, "%s", cols->name );
+                    if ( rc != 0 )
+                    {
+                        if ( ( rc != 0 && ( cols->flags & ercol_Optional ) ) || GetRCState( rc ) == rcExists )
+                        {
+                            rc = 0;
+                        }
+                        else
+                        {
+                            ALIGN_DBGERRP( "cannot add column '%s' to cursor", rc, cols->name );
+                        }
+                    }
+                }
+                cols++;
+            }
+            if ( rc == 0 )
+            {
+                rc = VCursorOpen( obj->curs );
+            }
+        }
+    }
+
+
+    if( rc == 0 )
+    {
+        *cself = obj;
+/*        ALIGN_DBG("ok%c", '!'); */
+    }
+    else
+    {
+        TableReader_Whack( obj );
+        ALIGN_DBGERRP( "TableReader_MakeCursor() failed", rc, 0 );
+    }
+    return rc;
+}
+
+
+void CC TableReader_Whack( const TableReader* cself )
+{
+    if ( cself != NULL )
+    {
+        VCursorRelease( cself->curs );
+        free( ( TableReader* ) cself );
+    }
+}
+
+/*
+rc_t CC TableReader_OpenCursor( const TableReader* cself )
+{
+    TableReader * tr = ( TableReader * )cself;
+    VCursor * curs = ( VCursor * )tr->curs;
+    rc_t rc = VCursorOpen( curs );
+    tr->cursor_open = ( rc == 0 );
+    return rc;
+}
+*/
+
+rc_t CC TableReader_ReadRow( const TableReader* cself, int64_t rowid )
+{
+    rc_t rc = 0;
+	TableReaderColumn * c = NULL;
+	
+    if ( cself == NULL )
+    {
+        rc = RC(rcAlign, rcType, rcOpening, rcSelf, rcNull);
+    }
+    else if ( cself->curr != rowid )
+    {
+/*
+        if ( !cself->cursor_open )
+            rc = TableReader_OpenCursor( cself );
+*/
+        if ( rc == 0 )
+        {
+            rc = VCursorCloseRow( cself->curs );
+            if ( rc == 0 )
+            {
+                rc = VCursorSetRowId( cself->curs, rowid );
+                if ( rc == 0 )
+                {
+                    rc = VCursorOpenRow( cself->curs );
+                    if ( rc == 0 )
+                    {
+                        uint32_t boff = 0;
+                        c = ( TableReaderColumn* )( cself->cols );
+                        while ( c->name != NULL && rc == 0 )
+                        {
+                            if ( c->idx != 0 )
+                            {
+                                /* TBD - FIX ME
+                                   this can be dangerous, since VCursorCellData
+                                   can cause cache flushes, invalidating previous
+                                   reads. THESE MUST BE FETCHED UPON DEMAND, NOT
+                                   PREFETCHED!!
+                                */
+                                rc = VCursorCellData( cself->curs, c->idx, NULL, (const void**)&c->base.var, &boff, &c->len );
+                                if ( rc != 0 )
+                                {
+                                    if ( c->flags & ercol_Optional )
+                                        rc = 0;
+                                    c->base.var = NULL;
+                                    c->len = 0;
+                                }
+                                else if ( boff != 0 )
+                                {
+                                    rc = RC( rcAlign, rcType, rcReading, rcData, rcUnsupported );
+                                }
+                            }
+                            c++;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if ( rc != 0 )
+    {
+        ALIGN_DBGERRP( "column %s row %ld", rc, c ? c->name : "<none>", rowid );
+    }
+    else
+    {
+        ( ( TableReader* )cself )->curr = rowid;
+    }
+    return rc;
+}
+
+
+rc_t CC TableReader_IdRange( const TableReader* cself, int64_t* first, uint64_t* count )
+{
+    rc_t rc = 0;
+    if ( cself == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcRetrieving, rcSelf, rcNull );
+    }
+    else
+    {
+/*
+        if ( !cself->cursor_open )
+            rc = TableReader_OpenCursor( cself );
+        if ( rc == 0 )
+*/
+            rc = VCursorIdRange( cself->curs, 0, first, count );
+    }
+    return rc;
+}
+
+
+rc_t CC TableReader_OpenIndex( const TableReader* cself, const char* name, const KIndex** idx )
+{
+    rc_t rc = 0;
+
+    if ( cself == NULL || name == NULL || idx == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcNull );
+    }
+    else
+    {
+/*
+        if ( !cself->cursor_open )
+            rc = TableReader_OpenCursor( cself );
+        if ( rc == 0 )
+        {
+*/
+            const VTable* tbl;
+            rc = VCursorOpenParentRead( cself->curs, &tbl );
+            if ( rc == 0 )
+            {
+                rc = VTableOpenIndexRead( tbl, idx, "%s", name );
+                VTableRelease( tbl );
+            }
+/*        } */
+    }
+    return rc;
+}
+
+
+rc_t CC TableReader_PageIdRange( const TableReader *cself, int64_t rowid,
+                                 int64_t *pfirst, int64_t *plast )
+{
+    rc_t rc = 0;
+    
+    if ( cself == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcOpening, rcSelf, rcNull );
+    }
+    else
+    {
+/*
+        if ( !cself->cursor_open )
+            rc = TableReader_OpenCursor( cself );
+        if ( rc == 0 )
+        {
+*/
+            if ( pfirst != NULL || plast != NULL )
+            {
+                int64_t first = INT64_MAX;
+                int64_t last = INT64_MIN;
+                unsigned i;
+                
+                for ( i = 0; cself->cols[ i ].name != NULL; ++i )
+                {
+                    if ( cself->cols[i].idx != 0 )
+                    {
+                        int64_t tfirst;
+                        int64_t tlast;
+                        
+                        rc = VCursorPageIdRange( cself->curs, cself->cols[ i ].idx, rowid, &tfirst, &tlast );
+                        if ( rc == 0 )
+                        {
+                            if ( first > tfirst ) { first = tfirst; }
+                            if ( last < tlast ) { last = tlast; }
+                        }
+                    }
+                }
+                if ( pfirst != NULL ) { *pfirst = first; }
+                if ( plast  != NULL ) { *plast  = last; }
+            }
+/*        } */
+    }
+    return rc;
+}
diff --git a/libs/align/reader-cmn.h b/libs/align/reader-cmn.h
new file mode 100644
index 0000000..3310999
--- /dev/null
+++ b/libs/align/reader-cmn.h
@@ -0,0 +1,81 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was readten as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_align_reader_cmn_
+#define _h_align_reader_cmn_
+
+#include <insdc/insdc.h>
+#include <insdc/sra.h>
+
+enum TableReaderColumn_Array {
+    ercol_Optional = 0x01,
+    ercol_Skip = 0x02
+};
+
+/* use ercol_Ignore to skip optional column when cursor is created */
+typedef struct TableReaderColumn_struct {
+    uint32_t idx;
+    const char* name;
+    union {
+        const void* var;
+        const char* str;
+        const bool* buul;
+        const uint8_t* u8;
+        const int16_t* i16;
+        const uint16_t* u16;
+        const int32_t* i32;
+        const uint32_t* u32;
+        const int64_t* i64;
+        const uint64_t* u64;
+        const INSDC_coord_one* coord1;
+        const INSDC_coord_zero* coord0;
+        const INSDC_coord_len* coord_len;
+        const INSDC_coord_val* coord_val;
+        const INSDC_SRA_xread_type* read_type;
+        const INSDC_SRA_read_filter* read_filter;
+    } base;
+    uint32_t len;
+    uint32_t flags;
+} TableReaderColumn;
+
+typedef struct TableReader TableReader;
+
+rc_t CC TableReader_Make(const TableReader** cself, const VTable* table, TableReaderColumn* cols, size_t cache);
+
+rc_t CC TableReader_MakeCursor(const TableReader** cself, const VCursor* cursor, TableReaderColumn* cols );
+
+rc_t CC TableReader_OpenCursor( const TableReader* cself );
+
+void CC TableReader_Whack(const TableReader* cself);
+
+rc_t CC TableReader_ReadRow(const TableReader* cself, int64_t rowid);
+
+rc_t CC TableReader_IdRange(const TableReader* cself, int64_t* first, uint64_t* count);
+
+rc_t CC TableReader_OpenIndex(const TableReader* cself, const char* name, const KIndex** idx);
+
+rc_t CC TableReader_PageIdRange(const TableReader *cself, int64_t rowid, int64_t *first, int64_t *last);
+
+#endif /* _h_align_reader_cmn_ */
diff --git a/libs/align/reader-refseq.c b/libs/align/reader-refseq.c
new file mode 100644
index 0000000..0c0cdc4
--- /dev/null
+++ b/libs/align/reader-refseq.c
@@ -0,0 +1,279 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was readten as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <insdc/insdc.h>
+#include <vdb/manager.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <align/reader-refseq.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include "reader-cmn.h"
+#include "reference-cmn.h"
+#include "debug.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+static const TableReaderColumn TableReaderRefSeq_cols[] =
+{
+    /* order important, see code below! */
+    {0, "(INSDC:dna:text)READ", {NULL}, 0, 0},
+    {0, "(INSDC:4na:bin)READ", {NULL}, 0, ercol_Skip},
+    {0, "QUALITY", {NULL}, 0, ercol_Skip | ercol_Optional},
+    {0, "SEQ_LEN", {NULL}, 0, 0},
+    {0, NULL, {NULL}, 0, 0}
+};
+
+struct TableReaderRefSeq {
+    const TableReader* base;
+    TableReaderColumn cols[sizeof(TableReaderRefSeq_cols)/sizeof(TableReaderRefSeq_cols[0])];
+    char seq_id[256];
+    uint32_t max_seq_len;
+    INSDC_coord_len total_seq_len;
+    bool circular;
+    bool has_md5;
+    uint8_t md5[16];
+    const TableReaderColumn* read;
+    const TableReaderColumn* seq_len;
+};
+
+LIB_EXPORT rc_t CC TableReaderRefSeq_MakeTable(const TableReaderRefSeq** cself, const VDBManager* vmgr,
+                                               const VTable* table, uint32_t options, size_t cache)
+{
+    rc_t rc = 0;
+    TableReaderRefSeq* self = NULL;
+
+    if( cself == NULL || table == NULL ) {
+        rc = RC(rcAlign, rcType, rcConstructing, rcParam, rcNull);
+    } else if( (self = calloc(1, sizeof(*self))) == NULL ) {
+        rc = RC(rcAlign, rcType, rcConstructing, rcMemory, rcExhausted);
+    } else {
+        const TableReader* tmp;
+        TableReaderColumn static_cols[] = {
+            /* order important, see code below! */
+            {0, "MAX_SEQ_LEN", {NULL}, 0, 0},
+            {0, "SEQ_ID", {NULL}, 0, 0},
+            {0, "TOTAL_SEQ_LEN", {NULL}, 0, 0},
+            {0, "CIRCULAR", {NULL}, 0, 0},
+            {0, "MD5", {NULL}, 0, ercol_Optional},
+            {0, NULL, {NULL}, 0, 0}
+        };
+        if( (rc = TableReader_Make(&tmp, table, static_cols, 0)) == 0 ) {
+            if( (rc = TableReader_ReadRow(tmp, 1)) == 0 ) {
+                self->max_seq_len = static_cols[0].base.u32[0];
+                self->total_seq_len = static_cols[2].base.u64[0];
+                if( self->total_seq_len != static_cols[2].base.u64[0] ) {
+                    rc = RC(rcAlign, rcType, rcConstructing, rcData, rcOutofrange);
+                }
+                if( static_cols[1].base.var != NULL ) {
+                    if ( static_cols[ 1 ].len > sizeof( self->seq_id ) - 1 )
+                    {
+                        rc = RC( rcAlign, rcType, rcConstructing, rcBuffer, rcInsufficient );
+                    }
+                    else
+                    {
+                        string_copy( self->seq_id, ( sizeof self->seq_id ) -  1, static_cols[1].base.str, static_cols[1].len );
+                        self->seq_id[ static_cols[ 1 ].len ] = '\0';
+                    }
+                }
+                self->circular = static_cols[3].base.buul[0];
+                if( static_cols[4].base.var != NULL ) {
+                    memmove(self->md5, static_cols[4].base.var, sizeof(self->md5));
+                    self->has_md5 = true;
+                }
+            }
+            TableReader_Whack(tmp);
+        }
+
+        memmove(self->cols, TableReaderRefSeq_cols, sizeof(TableReaderRefSeq_cols));
+        if( options & errefseq_4NA) {
+            self->cols[0].flags |= ercol_Skip;
+            self->cols[1].flags &= ~ercol_Skip;
+            self->read = &self->cols[1];
+        } else {
+            self->read = &self->cols[0];
+        }
+        self->seq_len = &self->cols[3];
+        rc = TableReader_Make(&self->base, table, self->cols, cache);
+    }
+    if( rc == 0 ) {
+        *cself = self;
+        /* ALIGN_DBG("table 0x%p opened 0x%p", table, self); */
+    } else {
+        TableReaderRefSeq_Whack(self);
+        ALIGN_DBGERRP("table for 0x%p", rc, table);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableReaderRefSeq_MakePath(const TableReaderRefSeq** cself, const VDBManager* vmgr,
+                                              const char* path, uint32_t options, size_t cache)
+{
+    rc_t rc = 0;
+    const VTable* tbl = NULL;
+
+    if( vmgr == NULL || path == NULL ) {
+        rc = RC(rcAlign, rcType, rcConstructing, rcParam, rcNull);
+    } else if( (rc = VDBManagerOpenTableRead(vmgr, &tbl, NULL, "%s", path)) == 0 ) {
+        rc = TableReaderRefSeq_MakeTable(cself, vmgr, tbl, options, cache);
+        VTableRelease(tbl);
+    }
+    if( rc == 0 ) {
+        /* ALIGN_DBG("table %s opened 0x%p", path, *cself); */
+    } else {
+        ALIGN_DBGERRP("table for %s", rc, path);
+    }
+    return rc;
+}
+
+LIB_EXPORT void CC TableReaderRefSeq_Whack(const TableReaderRefSeq* cself)
+{
+    if( cself != NULL ) {
+        /* ALIGN_DBG("table 0x%p closed", cself); */
+        TableReader_Whack(cself->base);
+        free((TableReaderRefSeq*)cself);
+    }
+}
+
+LIB_EXPORT rc_t CC TableReaderRefSeq_SeqId(const TableReaderRefSeq* cself, const char** id, uint32_t* id_sz)
+{
+    rc_t rc = 0;
+    if( cself == NULL || id == NULL || id_sz == NULL ) {
+        rc = RC(rcAlign, rcType, rcReading, rcParam, rcNull);
+    } else {
+        *id = cself->seq_id;
+        *id_sz = string_size(cself->seq_id);
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableReaderRefSeq_SeqLength(const TableReaderRefSeq* cself, INSDC_coord_len* len)
+{
+    rc_t rc = 0;
+    if( cself == NULL || len == NULL ) {
+        rc = RC(rcAlign, rcType, rcReading, rcParam, rcNull);
+    } else {
+        *len = cself->total_seq_len;
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableReaderRefSeq_Circular(const TableReaderRefSeq* cself, bool* circular)
+{
+    rc_t rc = 0;
+    if( cself == NULL || circular == NULL ) {
+        rc = RC(rcAlign, rcType, rcReading, rcParam, rcNull);
+    } else {
+        *circular = cself->circular;
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableReaderRefSeq_MD5(const TableReaderRefSeq* cself, const uint8_t** md5)
+{
+    rc_t rc = 0;
+    if( cself == NULL || md5 == NULL ) {
+        rc = RC(rcAlign, rcType, rcReading, rcParam, rcNull);
+    } else {
+        *md5 = cself->has_md5 ? cself->md5 : NULL;
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableReaderRefSeq_Read(const TableReaderRefSeq* cself, INSDC_coord_zero offset, INSDC_coord_len len,
+                                          uint8_t* buffer, INSDC_coord_len* written)
+{
+    rc_t rc = 0;
+
+    if ( cself == NULL || buffer == NULL || written == NULL )
+	{
+        rc = RC( rcAlign, rcType, rcReading, rcParam, rcNull );
+    }
+	else if( len == 0 )
+	{
+        *written = 0;
+    }
+	else
+	{
+		rc = ReferenceSeq_ReOffset( cself->circular, cself->total_seq_len, &offset );
+		if ( rc == 0 )
+		{
+			INSDC_coord_len q = 0;
+			*written = 0;
+			do
+			{
+				int64_t rowid = offset / cself->max_seq_len + 1;
+				INSDC_coord_zero s = offset % cself->max_seq_len;
+				
+				rc = TableReader_ReadRow( cself->base, rowid );
+				if ( rc == 0 && ( cself->read->len == 0 || cself->read->base.str == NULL ) )
+				{
+					/* TableReader_ReadRow() can return rc == 0 for an optional column!
+					   in these cases len/base.str are zero/NULL */
+					rc = RC( rcAlign, rcType, rcReading, rcItem, rcNull );			
+				}
+				
+				if ( rc == 0 )
+				{
+					q = cself->seq_len->base.coord_len[0] - s;
+					if ( q > len )
+					{
+						q = len;
+					}
+					memmove( &buffer[*written], cself->read->base.str + s, q );
+					*written += q;
+					offset += q;
+					len -= q;
+				}
+				
+				/* SEQ_LEN < MAX_SEQ_LEN is last row unless it is CIRCULAR */
+				if ( rc == 0 && ( cself->seq_len->base.coord_len[ 0 ] < cself->max_seq_len ) )
+				{
+					if ( !cself->circular )
+					{
+						break;
+					}
+					offset = 0;
+				}
+			} while( rc == 0 && q > 0 && len > 0 );
+		}
+	}
+    ALIGN_DBGERR( rc );
+    return rc;
+}
diff --git a/libs/align/reader-wgs.c b/libs/align/reader-wgs.c
new file mode 100644
index 0000000..214e542
--- /dev/null
+++ b/libs/align/reader-wgs.c
@@ -0,0 +1,169 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was readten as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <insdc/insdc.h>
+#include <vdb/manager.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include "reader-cmn.h"
+#include "reference-cmn.h"
+#include "reader-wgs.h"
+#include "debug.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+static const TableReaderColumn TableReaderWGS_cols[] =
+{
+    /* order important, see code below! */
+    {0, "(INSDC:dna:text)READ", {NULL}, 0, 0},
+    {0, "(INSDC:4na:bin)READ", {NULL}, 0, ercol_Skip},
+    {0, NULL, {NULL}, 0, 0}
+};
+
+struct TableReaderWGS {
+    TableReader const *base;
+    TableReaderColumn cols[sizeof(TableReaderWGS_cols)/sizeof(TableReaderWGS_cols[0])];
+    TableReaderColumn const *read;
+};
+
+rc_t TableReaderWGS_MakeTable(TableReaderWGS const **const pself,
+                              VDBManager const *vmgr,
+                              VTable const *const table,
+                              uint32_t const options,
+                              size_t const cache)
+{
+    assert(pself != NULL);
+    assert(table != NULL);
+    {
+        TableReaderWGS *const self = calloc(1, sizeof(*self));
+    
+        memmove(self->cols, TableReaderWGS_cols, sizeof(TableReaderWGS_cols));
+        self->read = &self->cols[0];
+    
+        if (options != 0) {
+            self->cols[0].flags |=  ercol_Skip;
+            self->cols[1].flags &= ~ercol_Skip;
+            self->read = &self->cols[1];
+        }
+        {
+            rc_t const rc = TableReader_Make(&self->base, table, self->cols, cache);
+            if (rc == 0) {
+                *pself = self;
+                return 0;
+            }
+            free(self);
+
+            return rc;
+        }
+    }
+}
+
+void TableReaderWGS_Whack(TableReaderWGS const *const self)
+{
+    if (self) {
+        TableReader_Whack(self->base);
+        free((TableReaderWGS *)self);
+    }
+}
+
+rc_t TableReaderWGS_SeqLength(TableReaderWGS const *const self, int64_t row, INSDC_coord_len *const result)
+{
+    assert(self != NULL);
+    assert(result != NULL);
+    {
+        rc_t const rc = TableReader_ReadRow(self->base, row);
+        if (rc == 0)
+            *result = self->read->len;
+
+        ALIGN_DBGERR(rc);
+        return rc;
+    }
+}
+
+rc_t TableReaderWGS_Circular(TableReaderWGS const *const self, int64_t row, bool *const result)
+{
+    assert(self != NULL);
+    assert(result != NULL);
+    
+    *result = false;
+
+    return 0;
+}
+
+rc_t TableReaderWGS_MD5(TableReaderWGS const *const self, int64_t row, uint8_t const **const result)
+{
+    assert(self != NULL);
+    assert(result != NULL);
+    
+    *result = NULL;
+    
+    return 0;
+}
+
+rc_t TableReaderWGS_Read(TableReaderWGS const *const self, int64_t const row,
+                         INSDC_coord_zero const offset,
+                         INSDC_coord_len const len,
+                         uint8_t *const buffer,
+                         INSDC_coord_len *const written)
+{
+    assert(self != NULL);
+    assert(buffer != NULL);
+    assert(written != NULL);
+    
+    *written = 0;
+    if (len == 0)
+        return 0;
+    {
+        rc_t const rc = TableReader_ReadRow(self->base, row);
+        if (rc == 0) {
+            INSDC_coord_len const max = self->read->len;
+
+            if (offset >= max)
+                return 0;
+            {
+                uint8_t const *const src = self->read->base.u8 + offset;
+                INSDC_coord_len const end = offset + len;
+                INSDC_coord_len const N = end < max ? (end - offset) : (max - offset);
+        
+                *written = N;
+                memmove(buffer, src, N);
+            }
+        }
+        ALIGN_DBGERR(rc);
+        return rc;
+    }
+}
diff --git a/libs/align/reader-wgs.h b/libs/align/reader-wgs.h
new file mode 100644
index 0000000..93d7c83
--- /dev/null
+++ b/libs/align/reader-wgs.h
@@ -0,0 +1,58 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was readten as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct VDBManager;
+struct VTable;
+
+typedef struct TableReaderWGS TableReaderWGS;
+
+rc_t TableReaderWGS_MakeTable(const TableReaderWGS ** cself,
+                              const struct VDBManager* vmgr,
+                              const struct VTable* table,
+                              uint32_t options, size_t cache);
+
+void TableReaderWGS_Whack(const TableReaderWGS* cself);
+
+rc_t TableReaderWGS_SeqLength(const TableReaderWGS* cself, int64_t row, INSDC_coord_len* len);
+
+rc_t TableReaderWGS_Circular(const TableReaderWGS* cself, int64_t row, bool* circular);
+
+/* *md5 is NULL if not present */
+rc_t CC TableReaderWGS_MD5(const TableReaderWGS* cself, int64_t row, const uint8_t** md5);
+
+/* read a chunk of refseq into buffer from offset up to offset + len
+   if offset is beyond non-circular refseq size error is returned
+ */
+rc_t CC TableReaderWGS_Read(const TableReaderWGS* cself, int64_t row,
+                            INSDC_coord_zero offset, INSDC_coord_len len,
+                            uint8_t* buffer, INSDC_coord_len* written);
+#ifdef __cplusplus
+}
+#endif
diff --git a/libs/align/ref_iterator.c b/libs/align/ref_iterator.c
new file mode 100644
index 0000000..65e8f9a
--- /dev/null
+++ b/libs/align/ref_iterator.c
@@ -0,0 +1,863 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/sort.h>
+#include <klib/text.h>
+#include <klib/out.h>
+#include <insdc/insdc.h>
+#include <align/reference.h>
+#include <align/iterator.h>
+#include <align/manager.h>
+#include <sysalloc.h>
+
+#include "debug.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#define COL_READ "(INSDC:4na:bin)READ"
+#define COL_HAS_MISMATCH "(bool)HAS_MISMATCH"
+#define COL_HAS_REF_OFFSET "(bool)HAS_REF_OFFSET"
+#define COL_REF_OFFSET "(I32)REF_OFFSET"
+#define COL_READ_GROUP "(ascii)SEQ_SPOT_GROUP"
+
+
+typedef struct spot_group
+{
+    DLNode n;                       /* to have it in a DLList */
+    char * name;                    /* the name of the read-group, can be NULL */
+    size_t len;                     /* the length of the name */
+    DLList records;                 /* has list of PlacementRecords... */
+} spot_group;
+
+
+static rc_t make_spot_group( spot_group ** sg, DLList * list, const char * name, size_t len )
+{
+    rc_t rc = 0;
+    *sg = calloc( 1, sizeof ** sg );
+    if ( *sg == NULL )
+        rc = RC( rcAlign, rcIterator, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        if ( len > 0 && name != NULL )
+        {
+            (*sg)->name = string_dup( name, len );
+            if ( (*sg)->name != NULL )
+            {
+                (*sg)->len = len;
+            }
+        }
+        /* if name is NULL, the spot-group is initialized with 0 via calloc() */
+        DLListInit( &( (*sg)->records ) );
+        DLListPushTail ( list, ( DLNode * )(*sg) );
+    }
+    return rc;
+}
+
+
+static void CC whack_the_placement_record( DLNode *n, void *data )
+{    PlacementRecordWhack ( ( PlacementRecord * )n );   }
+
+static void free_spot_group( spot_group *sg )
+{
+    if ( sg->name != NULL ) free( sg->name );
+    DLListWhack ( &sg->records, whack_the_placement_record, NULL );
+    free( sg );
+}
+
+
+static void CC whack_the_spot_group( DLNode *n, void *data )
+{    free_spot_group ( ( spot_group * )n );   }
+
+static void clear_spot_group_list( DLList * list )
+{
+    DLListWhack ( list, whack_the_spot_group, NULL );
+}
+
+
+typedef struct find_spot_group_cb_ctx
+{
+    const char * name;
+    size_t len;
+    spot_group *res;
+} find_spot_group_cb_ctx;
+
+
+static bool CC find_spot_group_callback( DLNode *n, void *data )
+{
+    find_spot_group_cb_ctx *ctx = ( find_spot_group_cb_ctx * )data;
+    spot_group * sg = ( spot_group * ) n;
+    bool res = false;
+
+    if ( ctx->name == NULL || sg->name == NULL )
+    {
+        res = true;
+    }
+    else
+    {
+        res = ( string_cmp ( sg->name, sg->len, 
+                             ctx->name, ctx->len, 
+                             ( sg->len < ctx->len ) ? ctx->len : sg->len ) == 0 );
+    }
+
+    if ( res )
+    {
+        ctx->res = sg;
+    }
+    return res;
+}
+
+static spot_group * find_spot_group( DLList * list, const char * name, size_t len )
+{
+    find_spot_group_cb_ctx ctx;
+    ctx.res = NULL;
+    ctx.name = name;
+    ctx.len = len;
+    DLListDoUntil ( list, false, find_spot_group_callback, &ctx );
+    return ctx.res;
+}
+
+static rc_t add_to_spot_groups( DLList * list, const PlacementRecord *rec )
+{
+    rc_t rc = 0;
+    spot_group * sg = find_spot_group( list, rec->spot_group, rec->spot_group_len );
+    if ( sg == NULL )
+    {
+        rc = make_spot_group( &sg, list, rec->spot_group, rec->spot_group_len );
+    }
+    if ( rc == 0 )
+    {
+        DLListPushTail ( &sg->records, ( DLNode * )(rec) );
+    }
+    return rc;
+}
+
+
+static uint32_t remove_invalid_records( const struct ReferenceObj * const refobj,
+                                        DLList * list, INSDC_coord_zero pos )
+{
+    uint32_t res = 0;
+    spot_group * sg = ( spot_group * )DLListHead( list );
+    while ( sg != NULL )
+    {
+        spot_group *nxt = ( spot_group * )DLNodeNext( ( DLNode * )sg );
+        PlacementRecord *rec = ( PlacementRecord * )DLListHead( &sg->records );
+        while ( rec != NULL )
+        {
+            PlacementRecord *nxt_rec = ( PlacementRecord * )DLNodeNext( ( DLNode * )rec );
+            INSDC_coord_zero end_pos = ( rec->pos + rec->len );
+            bool remove = ( end_pos <= pos );
+            if ( !remove )
+            {
+                AlignmentIterator * al_iter = PlacementRecordCast ( rec, placementRecordExtension0 );
+                int32_t state = AlignmentIteratorState ( al_iter, NULL );
+                remove = ( ( state & align_iter_invalid ) == align_iter_invalid );
+            }
+            if ( remove )
+            {
+                DLListUnlink ( &sg->records, ( DLNode * )rec );
+                PlacementRecordWhack ( rec );
+            }
+            else
+            {
+                res++;
+            }
+            rec = nxt_rec;
+        }
+        sg = nxt;
+    }
+    return res;
+}
+
+
+static void inc_alignment_iterators( DLList * list, INSDC_coord_zero pos )
+{
+    spot_group * sg = ( spot_group * )DLListHead( list );
+    while ( sg != NULL )
+    {
+        spot_group *nxt = ( spot_group * )DLNodeNext( ( DLNode * )sg );
+        PlacementRecord *rec = ( PlacementRecord * )DLListHead( &sg->records );
+        while ( rec != NULL )
+        {
+            PlacementRecord *nxt_rec = ( PlacementRecord * )DLNodeNext( ( DLNode * )rec );
+            AlignmentIterator * al_iter = PlacementRecordCast ( rec, placementRecordExtension0 );
+            if ( rec->pos <= pos && al_iter != NULL )
+            {
+                AlignmentIteratorNext ( al_iter );
+            }
+            rec = nxt_rec;
+        }
+        sg = nxt;
+    }
+}
+
+/* ======================================================================================== */
+
+
+struct ReferenceIterator
+{
+    KRefcount refcount;
+    struct AlignMgr const *amgr;
+
+    DLList spot_groups;                     /* has a list of spot-groups... */
+
+    int32_t min_mapq;                       /* has a minimum mapq-value... */
+    PlacementRecordExtendFuncs ext_func;    /* has a struct with record-extension-functions from client*/
+    PlacementRecordExtendFuncs int_func;    /* has a struct with record-extension-functions for itself*/
+
+    uint32_t depth;                         /* how many records are in the list */
+    INSDC_coord_zero current_pos;           /* what is the current ref-position on the current ref. */
+    INSDC_coord_zero last_pos;              /* what is the current ref-position on the current ref. */
+    INSDC_coord_zero nxt_avail_pos;         /* what is the next available ref-position on the current ref. */
+    spot_group *current_spot_group;         /* what is the next spot-group to be handled */
+    PlacementRecord *current_rec;           /* the current-record at the current position */
+    bool need_init;                         /* do we need to init for the first next()-call */
+    PlacementSetIterator * pl_set_iter;     /* holds a list of placement-iterators */
+    struct ReferenceObj const * refobj;     /* cached result of ReferenceIteratorNextReference(...) */
+};
+
+
+LIB_EXPORT void CC RefIterRecordDestroy ( void *obj, void *data )
+{
+    /* nothing to do, because there are no sub-allocations etc. ... */
+}
+
+
+LIB_EXPORT rc_t CC RefIterRecordSize ( struct VCursor const *curs,
+    int64_t row_id, size_t * size, void *data, void * placement_ctx )
+{
+    /* discover the size of the ref-iter-part to be allocated... */
+    return AlignIteratorRecordSize ( curs, row_id, size, data );
+}
+
+
+LIB_EXPORT rc_t CC RefIterRecordPopulate ( void *obj,
+    const PlacementRecord *placement, struct VCursor const *curs,
+    INSDC_coord_zero ref_window_start, INSDC_coord_len ref_window_len, void *data, void * placement_ctx )
+{
+    return AlignIteratorRecordPopulate ( obj, placement, curs, ref_window_start, ref_window_len, data );
+}
+
+
+static void CC RefIterDestroyRecPart( void *obj, void *data )
+{
+    AlignmentIterator *iter = ( AlignmentIterator * )obj;
+    if ( iter != NULL )
+        AlignmentIteratorRelease( iter );
+}
+
+LIB_EXPORT rc_t CC AlignMgrMakeReferenceIterator ( struct AlignMgr const *self,
+    ReferenceIterator **iter, const PlacementRecordExtendFuncs *ext_1, int32_t min_mapq )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        if ( iter == NULL  )
+            rc = RC( rcAlign, rcIterator, rcConstructing, rcParam, rcNull );
+        else
+        {
+            ReferenceIterator * refi = calloc( sizeof * refi, 1 );
+            if ( refi == NULL )
+                rc = RC( rcAlign, rcIterator, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                KRefcountInit( &refi->refcount, 1, "ReferenceIterator", "Make", "align" );
+                refi->min_mapq = min_mapq;
+                if ( ext_1 != NULL )
+                {
+                    refi->ext_func.data = ext_1->data;
+                    refi->ext_func.destroy = ext_1->destroy;
+                    refi->ext_func.populate = ext_1->populate;
+                    refi->ext_func.alloc_size = ext_1->alloc_size;
+                    refi->ext_func.fixed_size = ext_1->fixed_size;
+                }
+
+                refi->int_func.data = ( void * )self;
+                refi->int_func.destroy = RefIterDestroyRecPart;
+                refi->int_func.populate = RefIterRecordPopulate;
+                refi->int_func.alloc_size = RefIterRecordSize; 
+
+                DLListInit( &(refi->spot_groups) );
+                rc = AlignMgrMakePlacementSetIterator ( self, &refi->pl_set_iter );
+                refi->need_init = true;
+            }
+
+            if ( rc == 0 )
+                rc = AlignMgrAddRef ( self );
+
+            if ( rc == 0 )
+            {
+                refi->amgr = self;
+                *iter = refi;
+            }
+            else
+                free( refi );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceIteratorAddRef ( const ReferenceIterator *self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcAttaching, rcSelf, rcNull );
+    else
+    {
+        if ( KRefcountAdd( &self->refcount, "ReferenceIterator" ) != krefOkay )
+        {
+            rc = RC( rcAlign, rcIterator, rcAttaching, rcError, rcUnexpected );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceIteratorRelease ( const ReferenceIterator *cself )
+{
+    rc_t rc = 0;
+    if ( cself == NULL )
+        rc = RC( rcAlign, rcIterator, rcReleasing, rcSelf, rcNull );
+    else
+    {
+        if ( KRefcountDrop( &cself->refcount, "ReferenceIterator" ) == krefWhack )
+        {
+            ReferenceIterator * self = ( ReferenceIterator * ) cself;
+            /* we 'own' the records! - we have to destroy them, if some are left in here */
+            clear_spot_group_list( &self->spot_groups );
+            rc = PlacementSetIteratorRelease ( self->pl_set_iter );
+            AlignMgrRelease ( self->amgr );
+            free( self );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceIteratorAddPlacementIterator( ReferenceIterator *self,
+    PlacementIterator *pi )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        if ( pi == NULL )
+            rc = RC( rcAlign, rcIterator, rcConstructing, rcParam, rcNull );
+        else
+        {
+            rc = PlacementSetIteratorAddPlacementIterator ( self->pl_set_iter, pi );
+        }
+    }
+    return rc;
+}
+
+
+#define ALIGN_COL_COUNT 4
+
+static const char * align_cols[ ALIGN_COL_COUNT ] = 
+{ COL_REF_OFFSET, COL_HAS_REF_OFFSET, COL_HAS_MISMATCH, COL_READ };
+
+
+static rc_t prepare_align_cursor( struct VCursor const *align )
+{
+    rc_t rc = 0;
+    uint32_t i, throw_away_idx;
+
+    for ( i = 0; i < ALIGN_COL_COUNT && rc == 0; ++i ) {
+        rc =VCursorAddColumn ( align, &throw_away_idx, "%s", align_cols[ i ] );
+        if( GetRCState(rc) == rcExists ) {
+            rc = 0;
+        }
+    }
+        
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceIteratorAddPlacements( ReferenceIterator *self,
+     struct ReferenceObj const *ref_obj, INSDC_coord_zero ref_pos, INSDC_coord_len ref_len,
+     struct VCursor const *ref, struct VCursor const *align, align_id_src ids,
+     const char * spot_group, void * placement_ctx )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        if ( ref_obj == NULL )
+            rc = RC( rcAlign, rcIterator, rcConstructing, rcParam, rcNull );
+        else
+        {
+            if ( align != NULL )
+                rc = prepare_align_cursor( align );
+
+            if ( rc == 0 )
+            {
+                PlacementIterator *pi;
+
+                rc = ReferenceObj_MakePlacementIterator ( ref_obj, &pi, ref_pos, ref_len, self->min_mapq,
+                        ref, align, ids, &self->int_func, &self->ext_func, spot_group, placement_ctx );
+                if ( rc == 0 )
+                {
+                    rc = PlacementSetIteratorAddPlacementIterator ( self->pl_set_iter, pi );
+                    if ( GetRCState( rc ) == rcDone ) { rc = 0; }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+static rc_t fill_recordlist( ReferenceIterator *self, INSDC_coord_zero pos )
+{
+    rc_t rc;
+    do
+    {
+        const PlacementRecord *rec;
+        /* from the placement-set-iterator into our list... */
+        rc = PlacementSetIteratorNextRecordAt ( self->pl_set_iter, pos, &rec );
+        if ( rc == 0 )
+        {
+            if ( rec->pos == pos )
+            {
+                self->depth++;
+                rc = add_to_spot_groups( &self->spot_groups, rec );
+            }
+            else
+                PlacementRecordWhack ( rec );
+        }
+    } while( rc == 0 );
+
+    if ( GetRCState( rc ) == rcDone ) { rc = 0; }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceIteratorNextReference ( ReferenceIterator *self,
+    INSDC_coord_zero *first_pos, INSDC_coord_len *len, struct ReferenceObj const ** refobj )
+{
+    rc_t rc = 0;
+
+    if ( refobj != NULL )
+        *refobj = NULL;
+
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        struct ReferenceObj const * robj;
+        rc = PlacementSetIteratorNextReference ( self->pl_set_iter, first_pos, len, &robj );
+        clear_spot_group_list( &self->spot_groups );
+        if ( rc == 0 )
+        {
+            /* cache the returned refobj in order to get to reference-bases later... */
+            self->refobj = robj;
+            self->need_init = true;
+        }
+        else
+        {
+            self->refobj = NULL;
+        }
+
+        if ( refobj != NULL )
+        {
+            *refobj = self->refobj;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceIteratorNextWindow ( ReferenceIterator *self,
+    INSDC_coord_zero *first_pos, INSDC_coord_len *len )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        rc = PlacementSetIteratorNextWindow ( self->pl_set_iter, first_pos, len );
+        clear_spot_group_list( &self->spot_groups );
+        if ( rc == 0 )
+        {
+            self->need_init = true;
+            self->current_pos = *first_pos;
+            self->current_spot_group = NULL;
+            self->last_pos = self->current_pos + *len - 1;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceIteratorNextSpotGroup ( ReferenceIterator *self,
+    const char ** name, size_t * len )
+{
+    rc_t rc = 0;
+
+    if ( self->current_spot_group == NULL )
+    {
+        self->current_spot_group = ( spot_group * )DLListHead( &self->spot_groups );
+        if ( self->current_spot_group == NULL )
+        {
+            rc = SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+        }
+    }
+    else
+    {
+        spot_group *nxt  = ( spot_group * )DLNodeNext( ( DLNode * ) self->current_spot_group );
+        if ( nxt == NULL )
+        {
+            rc = SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+        }
+        else
+        {
+            self->current_spot_group = nxt;
+        }
+    }
+    self->current_rec = NULL;
+
+    if ( rc == 0 && self->current_spot_group != NULL )
+    {
+        if ( name != NULL )
+        {
+            *name = self->current_spot_group->name;
+        }
+        if ( len != NULL )
+        {
+            *len = self->current_spot_group->len;
+        }
+    }
+    return rc;
+}
+
+
+/* iterates the PlacementSetIterator forward to reach self->current_pos on the reference */
+static rc_t first_ref_iter_nxt_pos( ReferenceIterator *self, bool skip_empty )
+{
+    rc_t rc;
+    bool loop;
+    self->need_init = false;
+    do
+    {
+        rc = PlacementSetIteratorNextAvailPos ( self->pl_set_iter, &self->nxt_avail_pos, NULL );
+        loop = ( rc == 0 );
+        if ( loop )
+        {
+            loop = ( self->nxt_avail_pos <= self->current_pos );
+            if ( loop )
+            {
+                rc = fill_recordlist( self, self->nxt_avail_pos );
+                self->depth = remove_invalid_records( self->refobj, &self->spot_groups, self->nxt_avail_pos - 1 );
+            }
+        }
+    } while ( loop );
+
+    if ( skip_empty && self->nxt_avail_pos > self->current_pos && self->depth == 0 )
+    {
+        self->current_pos = self->nxt_avail_pos;
+    }
+    self->depth = remove_invalid_records( self->refobj, &self->spot_groups, self->current_pos );
+
+    if ( GetRCState( rc ) == rcDone ) rc = 0;
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceIteratorNextPos ( ReferenceIterator *self, bool skip_empty )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        self->current_rec = NULL;
+        if ( self->need_init )
+        {
+            rc = first_ref_iter_nxt_pos( self, skip_empty );
+        }
+        else
+        {
+            /* increment the current position */
+            self->current_pos++;
+
+            if ( self->current_pos <= self->last_pos )
+            {
+                /* jump over gaps, if requested ... */
+                if ( self->depth == 0 && skip_empty )
+                {
+                    self->current_pos = self->nxt_avail_pos;
+                }
+
+                /* increment the internal alignment-iterator of every placement-record */
+                inc_alignment_iterators( &self->spot_groups, self->current_pos );
+
+                /* loop through the list to look if we have to remove records,
+                   that do end before this new position */
+                self->depth = remove_invalid_records( self->refobj, &self->spot_groups, self->current_pos );
+
+                rc = fill_recordlist( self, self->current_pos );
+                if ( rc == 0 )
+                {
+                    self->current_spot_group = NULL;
+                    /* set our sights to the next position... */
+                    rc = PlacementSetIteratorNextAvailPos ( self->pl_set_iter, &self->nxt_avail_pos, NULL );
+                    if ( GetRCState( rc ) == rcDone )
+                    {
+                        if ( self->depth > 0 )
+                        {
+                            rc = 0;
+                        }
+                        else if ( !skip_empty )
+                        {
+                            if ( self->current_pos <= self->last_pos ) rc = 0;
+                        }
+                    }
+                }
+            }
+            else
+            {
+                rc = SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+                clear_spot_group_list( &self->spot_groups );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceIteratorPosition ( const ReferenceIterator *self,
+    INSDC_coord_zero *pos, uint32_t * depth, INSDC_4na_bin * base )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcAlign, rcIterator, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        /* return position, many records our record-list, and the base at this position */
+        if ( pos != NULL )
+        {
+            *pos = self->current_pos;
+        }
+
+        if ( depth != NULL )
+        {
+            *depth = self->depth;
+        }
+
+        if ( base != NULL )
+        {
+            uint32_t written;
+            *base = 0;
+            /* problem! how to get the base if depth == 0 */
+            if ( self->current_rec != NULL )
+            {
+                rc = ReferenceObj_Read( self->current_rec->ref, self->current_pos, 1, base, &written );
+            }
+            else if ( self->refobj != NULL )
+            {
+                rc = ReferenceObj_Read( self->refobj, self->current_pos, 1, base, &written );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceIteratorNextPlacement ( ReferenceIterator *self,
+    const PlacementRecord **rec )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+    {
+        rc = RC( rcAlign, rcIterator, rcAccessing, rcSelf, rcNull );
+    }
+    else if ( rec == NULL )
+    {
+        rc = RC( rcAlign, rcIterator, rcAccessing, rcParam, rcNull );
+    }
+    else
+    {
+        if ( self->current_spot_group == NULL )
+        {
+            rc = SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+        }
+        else
+        {
+            if ( self->current_rec == NULL )
+            {
+                self->current_rec = ( PlacementRecord * )DLListHead( &self->current_spot_group->records );
+            }
+            else
+            {
+                self->current_rec = ( PlacementRecord * )DLNodeNext( ( DLNode * )self->current_rec );
+            }
+
+            if ( self->current_rec == NULL )
+            {
+                rc = SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+            }
+            else
+            {
+                *rec = self->current_rec;
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceIteratorGetPlacement ( ReferenceIterator *self,
+    const PlacementRecord **rec )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+    {
+        rc = RC( rcAlign, rcIterator, rcAccessing, rcSelf, rcNull );
+    }
+    else if ( rec == NULL )
+    {
+        rc = RC( rcAlign, rcIterator, rcAccessing, rcParam, rcNull );
+    }
+    else
+    {
+        if ( self->current_spot_group == NULL )
+        {
+            rc = SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+        }
+        else
+        {
+            if ( self->current_rec != NULL )
+            {
+                /* remove the 'previous' current-rec! */
+                DLListPopHead ( &self->current_spot_group->records );
+                PlacementRecordWhack ( self->current_rec );
+                self->depth--;
+                self->current_rec = NULL;
+            }
+
+            self->current_rec = ( PlacementRecord * )DLListHead( &self->current_spot_group->records );
+            if ( self->current_rec == NULL )
+            {
+                rc = SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone );
+            }
+            else
+            {
+                *rec = self->current_rec;
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT int32_t CC ReferenceIteratorState ( const ReferenceIterator *self,
+    INSDC_coord_zero *seq_pos )
+{
+    int32_t res = align_iter_invalid;
+    if ( seq_pos != NULL )
+    {
+        *seq_pos = 0;
+    }
+    if ( self != NULL )
+    {
+        /* PlacementRecordCast returns NULL if self->current_rec is NULL */
+        AlignmentIterator * al_iter = PlacementRecordCast ( self->current_rec, placementRecordExtension0 );
+        if ( al_iter != NULL )
+            res = AlignmentIteratorState ( al_iter, seq_pos );
+    }
+    return res;
+}
+
+
+LIB_EXPORT uint32_t CC ReferenceIteratorBasesInserted ( const ReferenceIterator *self,
+    const INSDC_4na_bin **bases )
+{
+    uint32_t res = align_iter_invalid;
+    if ( bases != NULL )
+    {
+        *bases = NULL;
+    }
+    if ( self != NULL )
+    {
+        /* PlacementRecordCast returns NULL if self->current_rec is NULL */
+        AlignmentIterator * al_iter = PlacementRecordCast ( self->current_rec, placementRecordExtension0 );
+        if ( al_iter != NULL )
+            res = AlignmentIteratorBasesInserted( al_iter, bases );
+    }
+    return res;
+}
+
+
+LIB_EXPORT uint32_t CC ReferenceIteratorBasesDeleted ( const ReferenceIterator *self,
+    INSDC_coord_zero *pos, const INSDC_4na_bin **bases )
+{
+    uint32_t res = align_iter_invalid;
+    if ( bases != NULL )
+    {
+        *bases = NULL;
+    }
+    if ( self != NULL )
+    {
+        /* PlacementRecordCast returns NULL if self->current_rec is NULL */
+        AlignmentIterator * al_iter = PlacementRecordCast ( self->current_rec, placementRecordExtension0 );
+        if ( al_iter != NULL )
+        {
+            INSDC_coord_zero temp_pos;
+            res = AlignmentIteratorBasesDeleted( al_iter, &temp_pos );
+            if ( ( res & align_iter_invalid ) != align_iter_invalid )
+            {
+                if ( pos != NULL ) { *pos = temp_pos; }
+                /* where to get the reference-bases from ? PlacementRecord.ref ! */
+                if ( res > 0 && bases != NULL )
+                {
+                    uint8_t * buffer = malloc( res );
+                    if ( buffer != NULL )
+                    {
+                        INSDC_coord_len written;
+                        rc_t rc = ReferenceObj_Read( self->current_rec->ref, temp_pos, res, buffer, &written );
+                        if ( rc == 0 )
+                        {
+                            *bases = buffer;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return res;
+}
diff --git a/libs/align/reference-cmn.c b/libs/align/reference-cmn.c
new file mode 100644
index 0000000..59e7c3d
--- /dev/null
+++ b/libs/align/reference-cmn.c
@@ -0,0 +1,43 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <insdc/insdc.h>
+
+#include "reference-cmn.h"
+#include <sysalloc.h>
+
+rc_t CC ReferenceSeq_ReOffset(bool circular, INSDC_coord_len seq_len, INSDC_coord_zero* offset)
+{
+    if( !circular && (*offset < 0 || *offset >= seq_len) ) {
+        return RC(rcAlign, rcType, rcReading, rcOffset, rcOutofrange);
+    } else if( *offset < 0 ) {
+        *offset = seq_len - ((-(*offset)) % seq_len);
+    } else if( circular && *offset > seq_len ) {
+        *offset %= seq_len;
+    }
+    return 0;
+}
diff --git a/libs/align/reference-cmn.h b/libs/align/reference-cmn.h
new file mode 100644
index 0000000..76fac49
--- /dev/null
+++ b/libs/align/reference-cmn.h
@@ -0,0 +1,38 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was readten as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_align_reference_cmn_
+#define _h_align_reference_cmn_
+
+#include <klib/defs.h>
+
+/* Validates and adjusts offset for a RefSeq based on its attributes
+ * circular [IN]
+ * seq_len [IN]
+ * offset [IN,OUT] always be >= 0 upon return
+ */
+rc_t CC ReferenceSeq_ReOffset(bool circular, INSDC_coord_len seq_len, INSDC_coord_zero* offset);
+
+#endif /* _h_align_reference_cmn_ */
diff --git a/libs/align/reference.c b/libs/align/reference.c
new file mode 100644
index 0000000..f4af5aa
--- /dev/null
+++ b/libs/align/reference.c
@@ -0,0 +1,1943 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was readten as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/vector.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <insdc/insdc.h>
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/cursor.h>
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+#include <align/iterator.h>
+#include <align/reference.h>
+#include <align/refseq-mgr.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include "reader-cmn.h"
+#include "reference-cmn.h"
+#include "debug.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+/* This is a temporary define, used to test code to deal with
+   circular references and new means of tracking window end */
+
+enum EReferenceList_ColNames
+{
+    ereflst_cn_READ_dna,
+    ereflst_cn_READ_4na,
+    ereflst_cn_SEQ_LEN,
+    ereflst_cn_PRIMARY_ALIGNMENT_IDS,
+    ereflst_cn_SECONDARY_ALIGNMENT_IDS,
+    ereflst_cn_EVIDENCE_INTERVAL_IDS,
+    ereflst_cn_OVERLAP_REF_POS,
+    ereflst_cn_OVERLAP_REF_LEN
+};
+
+const TableReaderColumn ReferenceList_cols[] =
+{
+    { 0, "(INSDC:dna:text)READ",    { NULL }, 0, 0 },
+    { 0, "(INSDC:4na:bin)READ",     { NULL }, 0, ercol_Skip },
+    { 0, "SEQ_LEN",                 { NULL }, 0, 0 },
+    { 0, "PRIMARY_ALIGNMENT_IDS",   { NULL }, 0, ercol_Skip },
+    { 0, "SECONDARY_ALIGNMENT_IDS", { NULL }, 0, ercol_Skip | ercol_Optional },
+    { 0, "EVIDENCE_INTERVAL_IDS",   { NULL }, 0, ercol_Skip | ercol_Optional },
+    { 0, "OVERLAP_REF_POS",         { NULL }, 0, ercol_Optional },
+    { 0, "OVERLAP_REF_LEN",         { NULL }, 0, ercol_Optional },
+    { 0, NULL,                      { NULL }, 0, 0 }
+};
+
+enum EPlacementIterator_ColNames
+{
+    eplacementiter_cn_REF_POS,
+    eplacementiter_cn_REF_LEN,
+    eplacementiter_cn_MAPQ,
+    eplacementiter_cn_READ_GROUP
+};
+
+const TableReaderColumn PlacementIterator_cols[] =
+{
+    { 0, "REF_POS",     { NULL }, 0, 0 },
+    { 0, "REF_LEN",     { NULL }, 0, 0 },
+    { 0, "MAPQ",        { NULL }, 0, 0 },
+    { 0, "SPOT_GROUP",  { NULL }, 0, 0 },
+    { 0, NULL,          { NULL }, 0, 0 }
+};
+
+struct ReferenceList
+{
+    KRefcount refcount;
+    const RefSeqMgr* refseqmgr;
+    const VCursor* cursor;
+    BSTree name_tree;
+    BSTree seqid_tree;
+    uint32_t options;
+    size_t cache;
+    uint32_t max_seq_len;
+    uint32_t nodes_qty;
+    uint32_t nodes_max_qty;
+    const TableReader* reader;
+    TableReaderColumn reader_cols[ sizeof( ReferenceList_cols ) / sizeof( ReferenceList_cols[ 0 ] ) ];
+    const TableReader* iter;
+    TableReaderColumn iter_cols[ sizeof( PlacementIterator_cols ) / sizeof( PlacementIterator_cols[ 0 ] ) ];
+    /* last are children using realloc!! */
+    ReferenceObj* nodes[ 2 ];
+};
+
+struct ReferenceObj
+{
+    /* we use this in 2 lists so we need to adjust results of Find, etc calls for name tree!! */
+    BSTNode by_seqid; /* primary key */
+    BSTNode by_name; /* struct addr will be by_name[-1]; */
+    ReferenceList* mgr;
+    uint32_t id;
+    uint32_t bin;
+    char* name;
+    char* seqid;
+    bool circular;
+    bool read_present;
+    int64_t start_rowid;
+    int64_t end_rowid;
+    INSDC_coord_len seq_len;
+};
+
+
+static int64_t CC ReferenceObj_CmpSeqId( const void *item, const BSTNode *n )
+{
+    return strcasecmp( ( const char* )item, ( ( const ReferenceObj* )n )->seqid );
+}
+
+
+static int64_t CC ReferenceObj_SortSeqId( const BSTNode *item, const BSTNode *n )
+{
+    return ReferenceObj_CmpSeqId( ( ( const ReferenceObj* )item )->seqid, n );
+}
+
+
+static int64_t CC ReferenceObj_CmpName( const void *item, const BSTNode *n )
+{
+    return strcasecmp( ( const char* )item, ( ( const ReferenceObj* )&n[ -1 ] )->name );
+}
+
+
+static int64_t CC ReferenceObj_SortName( const BSTNode *item, const BSTNode *n )
+{
+    return ReferenceObj_CmpName( ( ( const ReferenceObj* )&item[ -1 ] )->name, n );
+}
+
+static rc_t ReferenceObj_Alloc( ReferenceObj** self, const char* seqid, size_t seqid_sz,
+                                const char* name, size_t name_sz)
+{
+    rc_t rc = 0;
+    if ( self == NULL || seqid == NULL || seqid_sz == 0 || name == NULL || name_sz == 0 )
+    {
+        rc = RC( rcAlign, rcIndex, rcConstructing, rcParam, rcNull );
+    }
+    else
+    {
+        ReferenceObj* obj = calloc( 1,  sizeof( *obj ) + seqid_sz + 1 + name_sz + 1 );
+        if ( obj == NULL )
+        {
+            rc = RC( rcAlign, rcIndex, rcConstructing, rcMemory, rcExhausted );
+        }
+        else
+        {
+            obj->seqid = ( char* )&obj[ 1 ];
+            obj->name = obj->seqid;
+            obj->name += seqid_sz + 1;
+            memmove( obj->seqid, seqid, seqid_sz );
+            obj->seqid[ seqid_sz ] = '\0';
+            memmove( obj->name, name, name_sz );
+            obj->name[ name_sz ] = '\0';
+            *self = obj;
+        }
+    }
+    return rc;
+}
+
+
+/* helper function for ReferenceList_MakeCursor() */
+static rc_t ReferenceList_handle_filter( const KIndex* iname, const char * filt_name, uint32_t bin_size,
+                                         int64_t *start, int64_t tbl_start, uint64_t *count, int *bin_num,
+                                         TableReaderColumn *h, const TableReader* tmp )
+{
+    rc_t rc = 0;
+    if ( strncmp( filt_name, "START_ROW:", 10 ) )
+    {
+        if ( bin_size == 0 || strncmp( filt_name, "BIN_NUM:", 8 ) )
+        {
+            rc = KIndexFindText( iname, filt_name, start, count, NULL, NULL );
+            if( rc == 0 && bin_size > 0 )
+            {
+                /** change start to the beginning of the bin **/
+                *bin_num = ( *start - tbl_start ) / bin_size;
+            }
+        }
+        else
+        {
+            *bin_num = atoi( filt_name + 8 );
+        }
+        if ( bin_size > 0 )
+        {
+            *start = tbl_start + ( bin_size * (*bin_num) );
+            rc = TableReader_ReadRow( tmp, *start );
+            if ( rc == 0 )
+            {
+                int64_t r_start;
+                char name[ 4096 ];
+                if ( h[ 0 ].len < sizeof( name ) )
+                {
+                    memmove( name, h[ 0 ].base.str, h[ 0 ].len );
+                    name[ h[ 0 ].len ] = '\0';
+                    rc = KIndexFindText( iname, name, &r_start, count, NULL, NULL );
+                    if ( rc == 0 && *start > r_start )
+                    { /*** move start to the beginning of the fully contained sequence **/
+                        *start = r_start + *count;
+                    }
+                }
+                else
+                {
+                    rc = RC( rcAlign, rcType, rcConstructing, rcName, rcTooLong );
+                }
+            }
+        }
+    }
+    else
+    {
+        int64_t req_start = atoi( filt_name + 10 );
+        if ( req_start >= *start && req_start < *start + *count )
+        {
+            int64_t delta = req_start - *start;
+            *start = req_start;
+            *count -= delta;
+        }
+        else
+        {
+            rc = RC( rcAlign, rcType, rcConstructing, rcId, rcOutofrange );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceList_MakeCursor( const ReferenceList** cself, const VCursor* cursor, uint32_t options,
+                                             const char* filt_name, const uint32_t numbins )
+{
+    rc_t rc = 0;
+    ReferenceList* self = NULL;
+
+    if ( cself == NULL || cursor == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcConstructing, rcParam, rcNull );
+    }
+    else if ( ( self = calloc( 1, sizeof( *self ) ) ) == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        const TableReader* tmp = NULL;
+        uint32_t bin_size;
+        int bin_num = -1;
+        TableReaderColumn h[] =
+        {
+            { 0, "NAME",        {NULL}, 0, 0 }, /*0*/
+            { 0, "SEQ_ID",      {NULL}, 0, 0 }, /*1*/
+            { 0, "SEQ_LEN",     {NULL}, 0, 0 }, /*2*/
+            { 0, "CIRCULAR",    {NULL}, 0, 0 }, /*3*/
+            { 0, "MAX_SEQ_LEN", {NULL}, 0, 0 }, /*4*/
+            { 0, "SEQ_START",   {NULL}, 0, 0 }, /*5*/
+            { 0, "CMP_READ",    {NULL}, 0, 0 }, /*6*/
+            { 0, NULL,          {NULL}, 0, 0 }
+        };
+        KRefcountInit( &self->refcount, 1, "ReferenceList", "Make", "align" );
+        BSTreeInit( &self->name_tree );
+        BSTreeInit( &self->seqid_tree );
+        self->options = options;
+        self->nodes_max_qty = sizeof( self->nodes ) / sizeof( self->nodes[ 0 ] );
+
+        rc = VCursorAddRef( self->cursor = cursor );
+        if ( rc == 0 )
+        {
+            rc = TableReader_MakeCursor( &tmp, cursor, h );
+            if ( rc == 0 )
+            {
+                int64_t start, tbl_start, tbl_stop;
+                uint64_t count;
+                const KIndex* iname = NULL;
+                bool only_one = false;
+
+                /* index is optional */
+                rc_t rctmp = TableReader_OpenIndex( tmp, "i_name", &iname );
+                ALIGN_DBGERRP( "index '%s' was not found", rctmp, "i_name" );
+
+                rc = TableReader_IdRange( tmp, &start, &count );
+                assert( rc == 0 );
+                tbl_start = start;
+                tbl_stop  = start + count -1;
+                if ( numbins > 0 )
+                {
+                    bin_size = ( count + numbins -1 ) / numbins;
+                }
+                else
+                {
+                    bin_size = 0;
+                }
+
+                if ( iname && filt_name )
+                {
+                    if ( bin_size == 0 )
+                    {
+                        only_one = true;
+                    }
+                    rc = ReferenceList_handle_filter( iname, filt_name, bin_size, &start, tbl_start,
+                                                      &count, &bin_num, h, tmp );
+                }
+
+                if ( rc == 0 )
+                {
+                    ReferenceObj* node = NULL;
+                    uint32_t last_name_len = 0;
+                    bool read_determination_done = false;
+
+                    while ( rc == 0  && start <= tbl_stop )
+                    {
+                        if ( bin_num < 0 && count == 0 )
+                        {
+                            /*** normal loop without binning ***/
+                            break;
+                        }
+                        rc = TableReader_ReadRow( tmp, start );
+                        if ( rc == 0 )
+                        {
+                            if ( node == NULL || last_name_len != h[0].len ||
+                                 strncmp( h[ 0 ].base.str, node->name, h[ 0 ].len) != 0 )
+                            {
+                                uint32_t cur_bin = ( bin_size > 0 ) ? ( start-tbl_start ) / bin_size : 0;
+                                if ( only_one && self->nodes_qty == 1 )
+                                {
+                                    break;
+                                }
+                                if ( bin_num >= 0 && cur_bin != bin_num )
+                                {
+                                    break;
+                                }
+                                if ( node == NULL && h[ 4 ].len > 0 )
+                                {
+                                    self->max_seq_len = h[ 4 ].base.u32[ 0 ];
+                                }
+                                if ( self->nodes_qty == self->nodes_max_qty )
+                                {
+                                    ReferenceList* tmp = realloc( self, sizeof( *self ) + sizeof( node ) * self->nodes_max_qty );
+                                    if ( tmp == NULL )
+                                    {
+                                        rc = RC(rcAlign, rcType, rcConstructing, rcMemory, rcExhausted);
+                                    }
+                                    else
+                                    {
+                                        self = tmp;
+                                        self->nodes_max_qty += sizeof( self->nodes ) / sizeof( self->nodes[ 0 ] );
+                                    }
+                                }
+                                if ( rc == 0 )
+                                {
+                                    rc = ReferenceObj_Alloc( &node, h[ 1 ].base.str, h[ 1 ].len, h[ 0 ].base.str, h[ 0 ].len );
+                                    if ( rc == 0 )
+                                    {
+                                        node->id = self->nodes_qty;
+                                        self->nodes[ self->nodes_qty++ ] = node;
+                                        last_name_len = h[ 0 ].len;
+                                        node->circular = h[ 3 ].len ? h[ 3 ].base.buul[ 0 ] : false;
+                                        node->start_rowid = start;
+                                        node->seq_len = 0;
+                                        node->bin = cur_bin;
+                                        read_determination_done = false;
+                                        rc = BSTreeInsertUnique( &self->seqid_tree, &node->by_seqid, NULL, ReferenceObj_SortSeqId );
+                                        if ( rc == 0 )
+                                        {
+                                            rc = BSTreeInsertUnique( &self->name_tree, &node->by_name, NULL, ReferenceObj_SortName );
+                                        }
+                                    }
+                                }
+                            }
+                            if ( rc == 0 )
+                            {
+                                INSDC_coord_len cur_seq_len = h[ 2 ].base.coord_len[ 0 ];
+                                if ( cur_seq_len == 0 )
+                                {
+                                    /* assign it to max-seq-len */
+                                    cur_seq_len = h[ 4 ].base.coord_len[ 0 ];
+                                }
+
+                                if ( h[ 6 ].len > 0 )
+                                {/** CMP_READ > 0 -- truly local ***/
+                                    node->read_present = true; 
+                                    read_determination_done = true;
+                                }
+                                else if ( h[ 5 ].base.coord1[ 0 ] != 0 )
+                                { /*** truly remote ***/
+                                    node->read_present = false;
+                                    read_determination_done = true;
+                                } /*** else still not sure **/
+
+                                if ( read_determination_done && iname != NULL )
+                                {
+                                    /* scroll to last row for this reference projecting the seq_len */
+                                    int64_t r_start;
+                                    uint64_t r_count;
+                                    if ( KIndexFindText( iname, node->name, &r_start, &r_count, NULL, NULL ) == 0 )
+                                    {
+                                        assert( node->start_rowid == r_start );
+                                        /* not last ref row */
+                                        if ( start != r_start + r_count - 1 )
+                                        {
+                                            /* we need to pickup last row SEQ_LEN for this reference
+                                            so we step back 2 rows in table from this ref end row
+                                            and also skip rows already scanned for read presence */
+                                            r_count -= ( start - r_start ) + 2;
+                                            node->seq_len += cur_seq_len * r_count;
+                                            start += r_count;
+                                            count -= r_count;
+                                        }
+                                    }
+                                }
+                                node->seq_len += cur_seq_len;
+                                node->end_rowid = start;
+                            }
+                        }
+                        else if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == rcRow )
+                        {
+                            rc = 0;
+                        }
+                        start++;
+                        count--;
+                    }
+                    for ( start = 0; rc == 0 && start < self->nodes_qty; start++ )
+                    {
+                        self->nodes[ start ]->mgr = self;
+                    }
+                    if ( rc == 0 && self->max_seq_len == 0 )
+                    {
+                        rc = RC(rcAlign, rcType, rcConstructing, rcData, rcCorrupt);
+                    }
+                }
+                KIndexRelease( iname );
+            }
+        }
+        TableReader_Whack( tmp );
+    }
+
+    if ( rc == 0 )
+    {
+        *cself = self;
+        /* ALIGN_DBG("created 0x%p with cursor 0x%p", self, cursor); */
+    }
+    else
+    {
+        *cself = NULL;
+        ReferenceList_Release( self );
+        /* ALIGN_DBGERRP( "failed for cursor 0x%p", rc, cursor ); */
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceList_MakeTable( const ReferenceList** cself, const VTable* table, uint32_t options,
+                                            size_t cache, const char* filt_name, const uint32_t numbins )
+{
+    rc_t rc = 0;
+    const VCursor* curs;
+
+    if ( table == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcConstructing, rcParam, rcNull );
+    }
+    else
+    {
+        rc = VTableCreateCachedCursorRead( table, &curs, cache );
+        if ( rc == 0 )
+        {
+            rc = VCursorPermitPostOpenAdd( curs );
+            if ( rc == 0 )
+            {
+                rc = ReferenceList_MakeCursor( cself, curs, options, filt_name, numbins );
+                if ( rc == 0 )
+                {
+                    ( (ReferenceList*)(*cself))->cache = cache;
+                }
+                VCursorRelease(curs);
+            }
+        }
+    }
+    ALIGN_DBGERRP( "failed for table 0x%p", rc, table );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceList_MakeDatabase( const ReferenceList** cself, const VDatabase* db, uint32_t options,
+                                               size_t cache, const char* name, const uint32_t numbins )
+{
+    rc_t rc = 0;
+    const VTable* tbl = NULL;
+    const char* nm = "REFERENCE";
+    /*const char* nm = (options & ereferencelist_useEvidence) ? "EVIDENCE_INTERVAL" : "REFERENCE";*/
+
+    if ( db == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcConstructing, rcParam, rcNull );
+    }
+    else
+    {
+        rc = VDatabaseOpenTableRead( db, &tbl, nm );
+        if ( rc == 0 )
+        {
+            rc = ReferenceList_MakeTable( cself, tbl, options, cache, name, numbins );
+            VTableRelease( tbl );
+        }
+    }
+    ALIGN_DBGERRP( "failed for database 0x%p", rc, db );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceList_MakePath( const ReferenceList** cself, const VDBManager* vmgr, const char* dbpath,
+                                           uint32_t options, size_t cache, const char* name, const uint32_t numbins )
+{
+    rc_t rc = 0;
+    const VDatabase* db = NULL;
+
+    if ( vmgr == NULL || dbpath == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcConstructing, rcParam, rcNull );
+    }
+    else
+    {
+        rc = VDBManagerOpenDBRead( vmgr, &db, NULL, "%s", dbpath );
+        if ( rc == 0 )
+        {
+            rc = ReferenceList_MakeDatabase( cself, db, options, cache, name, numbins );
+            VDatabaseRelease( db );
+        }
+    }
+    ALIGN_DBGERRP( "failed for database %s", rc, dbpath );
+    return rc;
+}
+
+
+static rc_t ReferenceList_OpenCursor( ReferenceList* self )
+{
+    rc_t rc = 0;
+
+    assert( self != NULL );
+
+    memmove( self->reader_cols, ReferenceList_cols, sizeof( ReferenceList_cols ) );
+
+    if ( self->options & ereferencelist_4na )
+    {
+        self->reader_cols[ ereflst_cn_READ_dna ].flags |= ercol_Skip;
+        self->reader_cols[ ereflst_cn_READ_4na ].flags &= ~ercol_Skip;
+    }
+
+    if ( self->options & ereferencelist_usePrimaryIds )
+    {
+        self->reader_cols[ ereflst_cn_PRIMARY_ALIGNMENT_IDS ].flags &= ~ercol_Skip;
+    }
+
+    if ( self->options & ereferencelist_useSecondaryIds )
+    {
+        self->reader_cols[ ereflst_cn_SECONDARY_ALIGNMENT_IDS ].flags &= ~ercol_Skip;
+    }
+
+    if ( self->options & ereferencelist_useEvidenceIds )
+    {
+        self->reader_cols[ ereflst_cn_EVIDENCE_INTERVAL_IDS ].flags &= ~ercol_Skip;
+    }
+
+    if ( !( self->options &
+          ( ereferencelist_usePrimaryIds | ereferencelist_useSecondaryIds | ereferencelist_useEvidenceIds ) ) )
+    {
+        self->reader_cols[ ereflst_cn_OVERLAP_REF_POS ].flags |= ercol_Skip;
+        self->reader_cols[ ereflst_cn_OVERLAP_REF_LEN ].flags |= ercol_Skip;
+    }
+    rc = TableReader_MakeCursor( &self->reader, self->cursor, self->reader_cols );
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+static rc_t ReferenceList_OpenCursor2( ReferenceList* self, align_id_src ids )
+{
+    rc_t rc = 0;
+
+    assert( self != NULL );
+    if ( ids != primary_align_ids && ids != secondary_align_ids && ids != evidence_align_ids )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcOutofrange );
+    }
+    else if ( ids == primary_align_ids && !( self->options & ereferencelist_usePrimaryIds ) )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else if ( ids == secondary_align_ids && !( self->options & ereferencelist_useSecondaryIds ) )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else if ( ids == evidence_align_ids && !( self->options & ereferencelist_useEvidenceIds ) )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        const VTable* vtbl = NULL;
+        rc = VCursorOpenParentRead( self->cursor, &vtbl );
+        if ( rc == 0 )
+        {
+            if ( rc == 0 )
+            {
+                const VDatabase* db = NULL;
+                rc = VTableOpenParentRead( vtbl, &db );
+                if ( rc == 0 )
+                {
+                    rc = VDatabaseOpenTableRead( db, &vtbl, ids == primary_align_ids ? "PRIMARY_ALIGNMENT" :
+                           ( ids == secondary_align_ids ? "SECONDARY_ALIGNMENT" : "EVIDENCE_INTERVAL" ) );
+                    if ( rc == 0 )
+                    {
+                        memmove( self->iter_cols, PlacementIterator_cols, sizeof( PlacementIterator_cols ) );
+                        rc = TableReader_Make( &self->iter, vtbl, self->iter_cols, self->cache );
+                    }
+                    VDatabaseRelease( db );
+                }
+            }
+            VTableRelease( vtbl );
+        }
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+static rc_t ReferenceList_RefSeqMgr( const ReferenceList* cself, const RefSeqMgr** rmgr )
+{
+    rc_t rc = 0;
+
+    assert( rmgr != NULL );
+
+    if ( cself->refseqmgr == NULL )
+    {
+        const VTable* vtbl = NULL;
+        rc = VCursorOpenParentRead( cself->cursor, &vtbl );
+        if ( rc == 0 )
+        {
+            const VDBManager* vmgr;
+            rc = VTableOpenManagerRead( vtbl, &vmgr );
+            if ( rc == 0 )
+            {
+                rc = RefSeqMgr_Make( &( (ReferenceList*)cself )->refseqmgr, vmgr,
+                                     ( cself->options & ereferencelist_4na ) ? errefseq_4NA : 0, cself->cache, 2 );
+                VDBManagerRelease( vmgr );
+            }
+            VTableRelease( vtbl );
+        }
+    }
+    *rmgr = cself->refseqmgr;
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceList_AddRef( const ReferenceList *cself )
+{
+    rc_t rc = 0;
+    if ( cself != NULL )
+    {
+        if ( KRefcountAdd( &cself->refcount, "ReferenceList" ) != krefOkay )
+        {
+            rc = RC( rcAlign, rcType, rcAttaching, rcError, rcUnexpected );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT void CC ReferenceList_Release( const ReferenceList* cself )
+{
+    if ( cself != NULL )
+    {
+        if ( KRefcountDrop(&cself->refcount, "ReferenceList") == krefWhack )
+        {
+            ReferenceList* self = ( ReferenceList* )cself;
+            TableReader_Whack( self->reader );
+            TableReader_Whack( cself->iter );
+            RefSeqMgr_Release( self->refseqmgr );
+            while( self->nodes_qty-- > 0 )
+            {
+                free( self->nodes[ self->nodes_qty ] );
+            }
+            VCursorRelease( cself->cursor );
+            KRefcountWhack( &self->refcount, "ReferenceList" );
+            free( self );
+        }
+    }
+}
+
+
+LIB_EXPORT rc_t CC ReferenceList_Count(const ReferenceList* cself, uint32_t* count)
+{
+    rc_t rc = 0;
+    if ( cself == NULL || count == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcNull );
+    }
+    else
+    {
+        *count = cself->nodes_qty;
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceList_Find( const ReferenceList* cself, const ReferenceObj** obj,
+                                       const char* key, size_t key_sz )
+{
+    rc_t rc = 0;
+    char buf[4096], *b = buf;
+
+    if ( cself == NULL || obj == NULL || key == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcSearching, rcParam, rcNull );
+    }
+    else if ( key_sz >= sizeof( buf ) && ( b = malloc( key_sz + 1 ) ) == NULL )
+    {
+        rc = RC(rcAlign, rcType, rcSearching, rcMemory, rcExhausted);
+    }
+    else
+    {
+        memmove( b, key, key_sz );
+        b[ key_sz ] = '\0';
+        *obj = ( ReferenceObj* )BSTreeFind( &cself->seqid_tree, b, ReferenceObj_CmpSeqId );
+        if ( *obj == NULL )
+        {
+            const BSTNode* n = BSTreeFind( &cself->name_tree, b, ReferenceObj_CmpName );
+            if ( n != NULL )
+            {
+                *obj = ( ReferenceObj* )&n[ -1 ];
+            }
+        }
+        if ( *obj == NULL )
+        {
+            rc = RC( rcAlign, rcType, rcSearching, rcItem, rcNotFound );
+        }
+        else
+        {
+            rc = ReferenceList_AddRef( cself );
+            if ( rc != 0 )
+            {
+                *obj = NULL;
+            }
+        }
+
+        if ( b != buf )
+        {
+            free( b );
+        }
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceList_Get( const ReferenceList* cself, const ReferenceObj** obj, uint32_t idx )
+{
+    rc_t rc = 0;
+    if ( cself == NULL || obj == NULL || idx >= cself->nodes_qty )
+    {
+        rc = RC( rcAlign, rcType, rcRetrieving, rcParam, rcInvalid );
+    }
+    else
+    {
+        rc = ReferenceList_AddRef( cself );
+        if ( rc == 0 )
+        {
+            *obj = cself->nodes[ idx ];
+        }
+        else
+        {
+            *obj = NULL;
+        }
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t ReferenceObj_AddRef( const ReferenceObj *cself )
+{
+    if ( cself == NULL )
+    {
+        return RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    } 
+    else
+    {
+        return ReferenceList_AddRef( cself->mgr );
+    }
+}
+
+
+LIB_EXPORT void ReferenceObj_Release( const ReferenceObj *cself )
+{
+    ReferenceList_Release( cself ? cself->mgr : NULL );
+}
+
+
+LIB_EXPORT rc_t CC ReferenceObj_Idx( const ReferenceObj* cself, uint32_t* idx )
+{
+    rc_t rc = 0;
+    if ( cself == NULL || idx == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        *idx = cself->id;
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceObj_IdRange( const ReferenceObj* cself, int64_t* start, int64_t* stop )
+{
+    rc_t rc = 0;
+    if ( cself == NULL || (start == NULL && stop == NULL) )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        if ( start != NULL )
+        {
+            *start = cself->start_rowid;
+        }
+        if ( stop != NULL )
+        {
+            *stop = cself->end_rowid;
+        }
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceObj_Bin( const ReferenceObj* cself, uint32_t* bin )
+{
+    rc_t rc = 0;
+    if ( cself == NULL || bin == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        *bin = cself->bin;
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+
+}
+
+
+LIB_EXPORT rc_t CC ReferenceObj_SeqId( const ReferenceObj* cself, const char** seqid )
+{
+    rc_t rc = 0;
+    if ( cself == NULL || seqid == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        *seqid = cself->seqid;
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceObj_Name( const ReferenceObj* cself, const char** name )
+{
+    rc_t rc = 0;
+    if ( cself == NULL || name == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        *name = cself->name;
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceObj_SeqLength( const ReferenceObj* cself, INSDC_coord_len* len )
+{
+    rc_t rc = 0;
+    if ( cself == NULL || len == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        *len = cself->seq_len;
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceObj_Circular( const ReferenceObj* cself, bool* circular )
+{
+    rc_t rc = 0;
+    if ( cself == NULL || circular == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        *circular = cself->circular;
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceObj_External( const ReferenceObj* cself, bool* external, char** path )
+{
+    rc_t rc = 0;
+
+    if ( cself == NULL || external == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        const RefSeqMgr* rmgr;
+        *external = !cself->read_present;
+        if ( path != NULL && !cself->read_present )
+        {
+            rc = ReferenceList_RefSeqMgr( cself->mgr, &rmgr );
+            if ( rc == 0 )
+            {
+                *path = NULL;
+                rc = RefSeqMgr_Exists( rmgr, cself->seqid, string_size( cself->seqid ), NULL );
+                if ( GetRCObject( rc ) == (enum RCObject)rcTable && GetRCState( rc ) == rcNotFound )
+                {
+                    rc = 0;
+                }
+            }
+        }
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceObj_Read( const ReferenceObj* cself, INSDC_coord_zero offset, INSDC_coord_len len,
+                                      uint8_t* buffer, INSDC_coord_len* written )
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || buffer == NULL || written == NULL )
+    {
+        rc = RC ( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        rc = ReferenceSeq_ReOffset( cself->circular, cself->seq_len, &offset );
+        if ( rc == 0 )
+        {
+            if ( cself->mgr->reader != NULL || ( rc = ReferenceList_OpenCursor( cself->mgr ) ) == 0 )
+            {
+                int cid = ( cself->mgr->options & ereferencelist_4na ) ? ereflst_cn_READ_4na : ereflst_cn_READ_dna;
+                INSDC_coord_len q = 0;
+                *written = 0;
+                do
+                {
+                    int64_t rowid = cself->start_rowid + offset / cself->mgr->max_seq_len;
+                    INSDC_coord_zero s = offset % cself->mgr->max_seq_len;
+                    rc = TableReader_ReadRow( cself->mgr->reader, rowid );
+                    if ( rc == 0 )
+                    {
+                        q = cself->mgr->reader_cols[ereflst_cn_SEQ_LEN].base.coord_len[0] - s;
+                        if ( q > len ) { q = len; }
+                        memmove( &buffer[ *written ], &cself->mgr->reader_cols[ cid ].base.str[ s ], q );
+                        *written += q;
+                        offset += q;
+                        len -= q;
+                    }
+                    /* SEQ_LEN < MAX_SEQ_LEN is last row unless it is CIRCULAR */
+                    if ( cself->mgr->reader_cols[ ereflst_cn_SEQ_LEN ].base.coord_len[ 0 ] < cself->mgr->max_seq_len )
+                    {
+                        if ( !cself->circular ) { break; }
+                        offset = 0;
+                    }
+                } while ( rc == 0 && q > 0 && len > 0 );
+            }
+        }
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceObj_GetIdCount( const ReferenceObj* cself, int64_t row_id, uint32_t *count )
+{
+    rc_t rc = 0;
+
+    if ( cself == NULL || count == NULL )
+    {
+        rc = RC ( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else if ( cself->mgr == NULL )
+    {
+        rc = RC ( rcAlign, rcType, rcAccessing, rcItem, rcInvalid );
+    }
+    else
+    {
+        *count = 0;
+
+        if ( cself->mgr->reader == NULL )
+            rc = ReferenceList_OpenCursor( cself->mgr );
+
+        if ( rc == 0 )
+        {
+            rc = TableReader_ReadRow( cself->mgr->reader, row_id );
+            if ( rc == 0 )
+            {
+                TableReaderColumn *col = &( cself->mgr->reader_cols[ ereflst_cn_PRIMARY_ALIGNMENT_IDS ] );
+                count[ 0 ] = col->len;
+                col = &( cself->mgr->reader_cols[ ereflst_cn_SECONDARY_ALIGNMENT_IDS ] );
+                count[ 1 ] = col->len;
+                col = &( cself->mgr->reader_cols[ ereflst_cn_EVIDENCE_INTERVAL_IDS ] );
+                count[ 2 ] = col->len;
+            }
+        }
+    }
+    return rc;
+}
+
+
+typedef struct PlacementRecExtensionInfo PlacementRecExtensionInfo;
+struct PlacementRecExtensionInfo
+{
+    /* data, destructor and size for extension 1 */
+    void * data;
+    void ( CC * destroy ) ( void *obj, void *data );
+    size_t size;
+};
+
+
+LIB_EXPORT void * CC PlacementRecordCast ( const PlacementRecord *self, uint32_t ext )
+{
+    void * res = NULL;
+    if ( self != NULL )
+    {
+        uint8_t * ptr = ( uint8_t * ) self;
+        PlacementRecExtensionInfo * ext_info;
+
+/**********************************************
+    +---------------+
+    | core          |   PlacementRecord *
+    +---------------+
+    | read_group    |   char *
+    +---------------+
+    | ext_info1     |   PlacementRecExtensionInfo *
+    | ext_info2     |   PlacementRecExtensionInfo *
+    +---------------+
+    | ext1          |   ??? *
+    +---------------+
+    | ext2          |   ??? *
+    +---------------+
+**********************************************/
+        ptr += ( sizeof * self );
+        ptr += self->spot_group_len;
+        ext_info = ( PlacementRecExtensionInfo * )( ptr );
+        ptr += ( 2 * ( sizeof * ext_info ) );
+        switch( ext )
+        {
+            case placementRecordExtension0 : res = ( void * ) ptr;
+                                             break;
+
+            case placementRecordExtension1 : res = ( void * ) ( ptr + ext_info->size );
+                                             break;
+        }
+    }
+    return res;
+}
+
+
+LIB_EXPORT void * CC PlacementRecord_get_ext_data_ptr ( const PlacementRecord *self, uint32_t ext )
+{
+    void * res = NULL;
+    if ( self != NULL )
+    {
+        uint8_t * ptr = ( uint8_t * ) self;
+        PlacementRecExtensionInfo * ext_info;
+        ptr += ( sizeof * self );
+        ptr += self->spot_group_len;    /* ptr points now to the 1st ext-info-block */
+        ext_info = ( PlacementRecExtensionInfo * )( ptr );
+        switch( ext )
+        {
+        case placementRecordExtension0 : res = ext_info[ 0 ].data; break;
+        case placementRecordExtension1 : res = ext_info[ 1 ].data; break;
+        }
+    }
+    return res;
+}
+
+
+LIB_EXPORT void CC PlacementRecordWhack( const PlacementRecord *cself )
+{
+    if ( cself != NULL ) 
+    {
+        PlacementRecord * self = ( PlacementRecord * )cself;
+        PlacementRecExtensionInfo * ext_info;
+        uint8_t * ptr = ( uint8_t * )self;
+        ptr += sizeof( *self );
+        ptr += self->spot_group_len;
+        ext_info = ( PlacementRecExtensionInfo * ) ptr;
+
+        /* destroy from the outer callback-block beginning */
+        if ( ext_info[ 1 ].destroy != NULL )
+        {
+            void *obj = PlacementRecordCast ( self, placementRecordExtension1 );
+            ext_info[ 1 ].destroy( obj, ext_info[ 1 ].data );
+        }
+
+        if ( ext_info[ 0 ].destroy != NULL )
+        {
+            void *obj = PlacementRecordCast ( self, placementRecordExtension0 );
+            ext_info[ 0 ].destroy( obj, ext_info[ 0 ].data );
+        }
+        /* now deallocate ( or put back into pool ) */
+        free( self );
+    }
+}
+
+struct PlacementIterator
+{
+    const ReferenceObj* obj;
+    INSDC_coord_zero ref_window_start;
+    INSDC_coord_len ref_window_len;
+
+    int64_t last_ref_row_of_window_rel;     /* relative to start of reference, not window */
+    int64_t cur_ref_row_rel;                /* current row relative to start of reference */
+    int64_t rowcount_of_ref;                /* precomputed: how many rows does this reference has */
+
+    /* own reader in case of ref cursor based construction */
+    const TableReader* ref_reader;
+    TableReaderColumn* ref_cols;
+    TableReaderColumn ref_cols_own[sizeof(ReferenceList_cols)/sizeof(ReferenceList_cols[0])];
+
+    /* own reader in case of align cursor based construction */
+    const TableReader* align_reader;
+    TableReaderColumn* align_cols;
+    TableReaderColumn align_cols_own[sizeof(PlacementIterator_cols)/sizeof(PlacementIterator_cols[0])];
+
+    /* current reference table row */
+    int64_t current_reftable_row;
+
+    const TableReaderColumn* ids_col;
+    Vector ids;
+    /* PlacementRecord c-tor params */
+    PlacementRecordExtendFuncs ext_0;
+    PlacementRecordExtendFuncs ext_1;
+
+    /* if this field is :
+     * NULL ... group by original read-group from the source-file
+     * points to empty string ... do not perform grouping at all
+     * point to non-empty string ... group by this string
+    */
+    const char * spot_group;
+    size_t spot_group_len;
+    int32_t min_mapq;
+
+    const VCursor* align_curs;
+    void * placement_ctx;           /* source-specific context */
+};
+
+
+static void enter_spotgroup ( PlacementIterator *iter, const char * spot_group )
+{
+    if ( spot_group == NULL )
+    {
+        iter->spot_group = NULL;
+        iter->spot_group_len = 0;
+    }
+    else
+    {
+        iter->spot_group_len = string_size ( spot_group );
+        if ( iter->spot_group_len > 0 )
+        {
+            iter->spot_group = string_dup_measure ( spot_group, NULL );
+        }
+        else
+        {
+            iter->spot_group = calloc( 1, 1 );
+        }
+    }
+}
+
+
+static int64_t calc_overlaped( PlacementIterator * o, align_id_src ids )
+{
+    int64_t res = o->ref_window_start;
+    bool from_ref_table = false;
+
+/*
+    uint32_t ofs = 0;
+    switch ( ids )
+    {
+        case primary_align_ids   : ofs = 0; break;
+        case secondary_align_ids : ofs = 1; break;
+        case evidence_align_ids  : ofs = 2; break;
+    }
+
+    if ( o->ref_cols[ ereflst_cn_OVERLAP_REF_LEN ].idx != 0 && 
+         o->ref_cols[ ereflst_cn_OVERLAP_REF_LEN ].len > ofs )
+    {
+        INSDC_coord_len overlap_ref_len = o->ref_cols[ ereflst_cn_OVERLAP_REF_LEN ].base.coord_len[ ofs ];
+        if ( overlap_ref_len < o->obj->mgr->max_seq_len )
+        {
+            if ( o->ref_cols[ ereflst_cn_OVERLAP_REF_POS ].idx != 0 && 
+                 o->ref_cols[ ereflst_cn_OVERLAP_REF_POS ].len > ofs )
+            {
+                res = o->ref_cols[ereflst_cn_OVERLAP_REF_POS].base.coord0[ ofs ];
+                from_ref_table = true;
+            }
+        }
+    }
+*/
+
+    if ( !from_ref_table )
+    {
+        /* default is step back 10 rows/50k bases */
+        int64_t ref_pos_lookback = ( 10 * o->obj->mgr->max_seq_len );
+        if ( o->obj->circular )
+        {
+            int64_t const half = ( o->obj->seq_len / 2 );
+
+            if ( ref_pos_lookback > half )
+            {
+                /* go back no more than one full length */
+                ref_pos_lookback = half;
+            }
+            res = ( o->ref_window_start - ref_pos_lookback ); /* could become negative */
+        }
+        else
+        {
+            res = ( o->ref_window_start < ref_pos_lookback ? 0 : ( o->ref_window_start - ref_pos_lookback ) );
+        }
+    }
+    return res;
+}
+
+
+LIB_EXPORT rc_t CC ReferenceObj_MakePlacementIterator ( const ReferenceObj* cself,
+    PlacementIterator **iter,
+    INSDC_coord_zero ref_window_start, INSDC_coord_len ref_window_len,
+    int32_t min_mapq,
+    struct VCursor const *ref_cur, struct VCursor const *align_cur, align_id_src ids,
+    const PlacementRecordExtendFuncs *ext_0, const PlacementRecordExtendFuncs *ext_1,
+    const char * spot_group, void * placement_ctx )
+{
+    rc_t rc = 0;
+    PlacementIterator* o = NULL;
+
+    if ( cself == NULL || iter == NULL || ref_window_len < 1 )
+    {
+        rc = RC(rcAlign, rcType, rcAccessing, rcParam, rcInvalid);
+    }
+    else if ( ( rc = ReferenceSeq_ReOffset( cself->circular, cself->seq_len, &ref_window_start ) ) != 0 )
+    {
+    }
+    else if ( ( o = calloc( 1, sizeof( *o ) ) ) == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        rc = ReferenceList_AddRef( cself->mgr );
+        if ( rc == 0 )
+        {
+            ReferenceList* mgr = cself->mgr;
+            o->obj = cself;
+            /* o->wrapped_around = false; */
+            ReferenceObj_AddRef( o->obj );
+            o->min_mapq = min_mapq;
+            o->placement_ctx = placement_ctx;
+
+            if ( ext_0 != NULL )
+            {
+                o->ext_0.data = ext_0->data;
+                o->ext_0.destroy = ext_0->destroy;
+                o->ext_0.populate = ext_0->populate;
+                o->ext_0.alloc_size = ext_0->alloc_size;
+                o->ext_0.fixed_size = ext_0->fixed_size;
+            }
+
+            if ( ext_1 != NULL )
+            {
+                o->ext_1.data = ext_1->data;
+                o->ext_1.destroy = ext_1->destroy;
+                o->ext_1.populate = ext_1->populate;
+                o->ext_1.alloc_size = ext_1->alloc_size;
+                o->ext_1.fixed_size = ext_1->fixed_size;
+            }
+
+            if ( ref_cur == NULL )
+            {
+                if ( mgr->reader == NULL )
+                {
+                    rc = ReferenceList_OpenCursor( mgr );
+                }
+                if ( rc == 0 )
+                {
+                    o->ref_reader = mgr->reader;
+                    o->ref_cols = mgr->reader_cols;
+                }
+            }
+            else
+            {
+                memmove( o->ref_cols_own, ReferenceList_cols, sizeof( o->ref_cols_own ) );
+                o->ref_cols = o->ref_cols_own;
+                rc = TableReader_MakeCursor( &o->ref_reader, ref_cur, o->ref_cols_own );
+            }
+
+            if ( align_cur == NULL )
+            {
+                bool b_assign = ( mgr->iter != NULL );
+                if ( !b_assign )
+                {
+                    rc = ReferenceList_OpenCursor2( mgr, ids );
+                    b_assign = ( rc == 0 );
+                }
+                if ( b_assign )
+                {
+                    o->align_reader = mgr->iter;
+                    o->align_cols = mgr->iter_cols;
+                }
+            }
+            else
+            {
+                memmove( o->align_cols_own, PlacementIterator_cols, sizeof( o->align_cols_own ) );
+                o->align_cols = o->align_cols_own;
+                o->align_curs = align_cur;
+                rc = TableReader_MakeCursor( &o->align_reader, align_cur, o->align_cols );
+            }
+
+            if ( rc == 0 )
+            {
+                int64_t first_ref_row_of_window_rel = ( ref_window_start / mgr->max_seq_len );
+                int64_t first_ref_row_of_window_abs = ( cself->start_rowid + first_ref_row_of_window_rel );
+
+                /* in bases */
+                o->ref_window_start = ref_window_start;
+                o->ref_window_len = ref_window_len;
+
+                /* in reference-rows */
+                o->last_ref_row_of_window_rel = ref_window_start;
+                o->last_ref_row_of_window_rel += ( ref_window_len - 1 );
+                o->last_ref_row_of_window_rel /= mgr->max_seq_len;
+                o->rowcount_of_ref = ( cself->end_rowid - cself->start_rowid ) + 1;
+
+                /* get effective starting offset based on overlap
+                   from alignments which started before the requested pos */
+                rc = TableReader_ReadRow( o->ref_reader, first_ref_row_of_window_abs );
+                if ( rc == 0 )
+                {
+                    int64_t ref_pos_overlapped = calc_overlaped( o, ids );
+                    ALIGN_DBG( "ref_pos_overlapped: %,li", ref_pos_overlapped );
+
+                    /* the absolute row where we are reading from */
+                    o->cur_ref_row_rel = ( ref_pos_overlapped / mgr->max_seq_len ) - 1;
+
+                    VectorInit( &o->ids, 0, 100 );
+
+                    o->ids_col = &o->ref_cols[ids == primary_align_ids ? ereflst_cn_PRIMARY_ALIGNMENT_IDS :
+                            ( ids == secondary_align_ids ? ereflst_cn_SECONDARY_ALIGNMENT_IDS : ereflst_cn_EVIDENCE_INTERVAL_IDS ) ];
+
+                    ALIGN_DBG( "iter.last_ref_row_of_window_rel: %,li", o->last_ref_row_of_window_rel );
+                    ALIGN_DBG( "iter.rowcount_of_ref: %,li", o->rowcount_of_ref );
+                    ALIGN_DBG( "iter.cur_ref_row_rel: %,li", o->cur_ref_row_rel );
+                }
+            }
+
+            if ( rc != 0 )
+            {
+                ReferenceObj_Release( o->obj );
+            }
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        enter_spotgroup ( o, spot_group );
+        *iter = o;
+        ALIGN_DBG( "iter for %s:%s opened 0x%p", cself->seqid, cself->name, o );
+    }
+    else
+    {
+        *iter = NULL;
+        PlacementIteratorRelease( o );
+        ALIGN_DBGERRP( "iter for %s:%s", rc, cself->seqid, cself->name );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC PlacementIteratorAddRef ( const PlacementIterator *cself )
+{
+    return ReferenceList_AddRef(cself ? cself->obj->mgr : NULL);
+}
+
+
+static void CC PlacementIterator_whack_recs( void *item, void *data )
+{
+    PlacementRecordWhack( ( PlacementRecord * ) item );
+}
+
+
+LIB_EXPORT rc_t CC PlacementIteratorRelease ( const PlacementIterator *cself )
+{
+    if ( cself != NULL )
+    {
+        PlacementIterator* self = ( PlacementIterator* )cself;
+
+        VectorWhack( &self->ids, PlacementIterator_whack_recs, NULL );
+
+        if ( self->ref_reader != self->obj->mgr->reader )
+        {
+            TableReader_Whack( self->ref_reader );
+        }
+        if ( self->align_reader != self->obj->mgr->iter )
+        {
+            TableReader_Whack( self->align_reader );
+        }
+        ReferenceObj_Release( self->obj );
+        ReferenceList_Release( self->obj->mgr );
+        if ( self->spot_group != NULL )
+        {
+            free( ( void * )self->spot_group );
+        }
+        free( self );
+    }
+    return 0;
+}
+
+
+LIB_EXPORT rc_t CC PlacementIteratorRefWindow( const PlacementIterator *self,
+                                               const char **idstr, INSDC_coord_zero* pos, INSDC_coord_len* len )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL || (idstr == NULL || pos == NULL || len == NULL ) )
+    {
+        rc = RC(rcAlign, rcType, rcAccessing, rcParam, rcInvalid);
+    }
+    else
+    {
+        if ( idstr != NULL ) { *idstr = self->obj->seqid; }
+        if ( pos != NULL )   { *pos = self->ref_window_start; }
+        if ( len != NULL )   { *len = self -> ref_window_len; }
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC PlacementIteratorRefObj( const PlacementIterator * self,
+                                            struct ReferenceObj const ** refobj )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL || refobj == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        *refobj = self->obj;
+    }
+    ALIGN_DBGERR( rc );
+    return rc;
+}
+
+
+#if _DEBUGGING
+/*
+static void CC PlacementRecordVector_dump( void *item, void *data )
+{
+    const PlacementRecord* i = ( const PlacementRecord* )item;
+    ALIGN_DBG( " {pos:%,u, len:%,u, id:%,li}", i->pos, i->len, i->id );
+}
+*/
+#endif
+
+
+/* this comparison function performs last-to-first
+   ordering in the Vector. for this reason, all
+   comparisons and return values are reversed. */
+static int64_t CC PlacementRecordVector_cmp( const void** left, const void** right, void* data )
+{
+    const PlacementRecord* l = *( ( const PlacementRecord** )left );
+    const PlacementRecord* r = *( ( const PlacementRecord** )right );
+
+    /* order by pos desc
+       return right - left rather than
+       normal left - right to reverse result */
+    int32_t d = r -> pos - l -> pos;
+    if ( d != 0 )
+        return d;
+
+    /* ...len asc */
+    if ( l -> len != r -> len )
+        return (int64_t)l -> len - (int64_t)r -> len;
+
+    /* ...id desc */
+    return r -> id < l -> id ? -1 : r -> id > l -> id;
+}
+
+
+static rc_t allocate_populate_rec( const PlacementIterator *cself,
+                                   PlacementRecord **rec,
+                                   struct VCursor const *curs,
+                                   int64_t id,
+                                   INSDC_coord_zero apos,
+                                   INSDC_coord_len alen )
+{
+    rc_t rc = 0;
+
+    {
+        PlacementRecExtensionInfo * ext_info;
+        size_t spot_group_len, size0, size1, total_size;
+
+        if ( cself->spot_group_len > 0 )
+        {
+            /* use the read-group from the PlacementIterator as an fix override ... */
+            spot_group_len = cself->spot_group_len;
+        }
+        else
+        {
+            if ( cself->spot_group != NULL )
+            {
+                /* iterator has an empty (not NULL) spot-group: use the orignal data! */
+                spot_group_len = cself->align_cols[eplacementiter_cn_READ_GROUP].len;
+            }
+            else
+            {
+                /* do not use spotgroups at all ! */
+                spot_group_len = 0;
+            }
+        }
+
+        /* use callback or fixed size to discover the size of portions 0 and 1 */
+        if ( cself->ext_0.alloc_size != NULL )
+        {
+            rc = cself->ext_0.alloc_size( curs, id, &size0, cself->ext_0.data, cself->placement_ctx );
+            if ( rc != 0 )
+                return rc;
+        }
+        else
+            size0 = cself->ext_0.fixed_size;
+
+        if ( cself->ext_1.alloc_size != NULL )
+        {
+            rc = cself->ext_1.alloc_size( curs, id, &size1, cself->ext_1.data, cself->placement_ctx );
+            if ( rc != 0 )
+                return rc;
+        }
+        else
+            size1 = cself->ext_1.fixed_size;
+        
+        /* allocate the record ( or take it from a pool ) */
+        total_size = ( sizeof **rec ) + spot_group_len + ( 2 * ( sizeof *ext_info ) ) + size0 + size1;
+        *rec = calloc( 1, total_size );
+        if ( *rec == NULL )
+        {
+            rc = RC( rcAlign, rcType, rcAccessing, rcMemory, rcExhausted );
+        }
+        else
+        {
+            PlacementRecord *pr = * rec;
+            uint8_t * ptr = ( uint8_t * )( * rec );
+            ptr += sizeof ( **rec );
+            pr->spot_group = (char *)ptr;
+            ptr += spot_group_len ;
+            ext_info = ( PlacementRecExtensionInfo * )ptr;
+
+            /* prepopulate the core-record : */
+            pr->id  = id;               /* the row-id */
+            pr->ref = cself->obj;       /* the ReferenceObj it refers to */
+            pr->pos = apos;             /* the positon on the reference */
+            pr->len = alen;             /* the length on the reference */
+            pr->mapq = cself->align_cols[eplacementiter_cn_MAPQ].base.i32[ 0 ]; /* mapq */
+
+            /* populate the spot-group : (with the values discovered at the "size-phase" ) */
+            pr->spot_group_len = spot_group_len;
+            if ( cself->spot_group_len > 0 )
+            {
+                /* we make a copy of the spot-group-override commin from the iterator */
+                string_copy ( pr->spot_group, spot_group_len, cself->spot_group, spot_group_len );
+            }
+            else
+            {
+                if ( cself->spot_group != NULL )
+                {
+                    /* iterator has an empty (not NULL) spot-group: use the orignal data! */
+                    string_copy( pr->spot_group, spot_group_len,
+                                 cself->align_cols[eplacementiter_cn_READ_GROUP].base.str, spot_group_len );
+                }
+            }
+
+            ext_info[ 0 ].data = cself->ext_0.data;          /* the opt. context ptr. */
+            ext_info[ 0 ].destroy = cself->ext_0.destroy;    /* the opt. destructor */
+            ext_info[ 0 ].size = size0;                      /* discovered size from above */
+
+            ext_info[ 1 ].data = cself->ext_1.data;          /* the opt. context ptr. */
+            ext_info[ 1 ].destroy = cself->ext_1.destroy;    /* the opt. destructor */
+            ext_info[ 1 ].size = size1;                      /* discovered size from above */
+
+            /* pass the record now to the opt. populate-callbacks */
+            if ( cself->ext_0.populate != NULL )
+            {
+                void * obj = PlacementRecordCast ( pr, placementRecordExtension0 );
+                rc = cself->ext_0.populate( obj, pr, curs,
+                                            cself->ref_window_start,
+                                            cself->ref_window_len,
+                                            cself->ext_0.data,
+                                            cself->placement_ctx );
+                if ( rc != 0 && cself->ext_0.destroy != NULL )
+                {
+                    void *obj = PlacementRecordCast ( pr, placementRecordExtension0 );
+                    cself->ext_0.destroy( obj, cself->ext_0.data );
+                }
+            }
+
+            if ( rc == 0 && cself->ext_1.populate != NULL )
+            {
+                void * obj = PlacementRecordCast ( pr, placementRecordExtension1 );
+                rc = cself->ext_1.populate( obj, pr, curs, 
+                                            cself->ref_window_start,
+                                            cself->ref_window_len,
+                                            cself->ext_1.data,
+                                            cself->placement_ctx );
+                if ( rc != 0 )
+                {
+                    if ( cself->ext_1.destroy != NULL )
+                    {
+                        void *obj = PlacementRecordCast ( pr, placementRecordExtension1 );
+                        cself->ext_1.destroy( obj, cself->ext_1.data );
+                    }
+                    if ( cself->ext_0.destroy != NULL )
+                    {
+                        void *obj = PlacementRecordCast ( pr, placementRecordExtension0 );
+                        cself->ext_0.destroy( obj, cself->ext_0.data );
+                    }
+
+                }
+            }
+
+            if ( rc != 0 )
+            {
+                /* free */
+                free( *rec );
+                *rec = NULL;
+            }
+        }
+    }
+    return rc;
+}
+
+
+static rc_t make_alignment( PlacementIterator *self, int64_t align_id,
+                            INSDC_coord_zero apos, INSDC_coord_len alen )
+{
+    PlacementRecord *rec;
+    rc_t rc = allocate_populate_rec( self, &rec, self->align_curs, align_id, apos, alen );
+    if ( rc == 0 )
+    {
+        /*ALIGN_DBG("align %p: {%li, %u, %u} - added[%u]", rec, cself->ids_col->base.i64[i],
+            apos, alen, VectorLength(&cself->ids));*/
+        rc = VectorAppend( &self->ids, NULL, rec );
+        if ( rc != 0 )
+            PlacementRecordWhack( rec );
+    }
+    else
+    {
+        if ( GetRCState( rc ) == rcIgnored )
+            rc = 0; /* do not break the loop if a record is filtered out! */
+    }
+    return rc;
+}
+
+
+/*
+  we have read a single row from REFERENCE, including the
+  alignment ids. use each alignment id from this row to
+  populate internal vector
+*/
+static rc_t read_alignments( PlacementIterator *self )
+{
+    rc_t rc = 0;
+    uint32_t i;
+    /* fill out vector */
+    /*ALIGN_DBG("align rows: %u", cself->ids_col->len);*/
+    for ( i = 0; rc == 0 && i < self->ids_col->len; i++ )
+    {
+        int64_t row_id = self->ids_col->base.i64[ i ];
+        rc = TableReader_ReadRow( self->align_reader, row_id );
+        if ( rc == 0 )
+        {
+            INSDC_coord_zero apos = self->align_cols[ eplacementiter_cn_REF_POS ].base.coord0[ 0 ];
+            INSDC_coord_len alen  = self->align_cols[ eplacementiter_cn_REF_LEN ].base.coord_len[ 0 ];
+
+#if 0
+            ALIGN_DBG( "alignment read: {row_id:%,li, apos:%,d, alen:%u}", row_id, apos, alen );
+#endif
+
+            /* at this point we have the position of the alignment.
+               we want it to intersect with the window */
+
+            /* test mapq */
+            if ( self->align_cols[eplacementiter_cn_MAPQ].base.i32[ 0 ] < self->min_mapq )
+                continue;
+
+            /* case 1: alignment, which is expressed in
+               linear coordinates, is entirely to left of
+               window. */
+            if ( (INSDC_coord_zero)( apos + alen ) <= self -> ref_window_start )
+            {
+                /* ignore this alignment */
+                continue;
+            }
+
+            /* case 2: alignment is to the right of window */
+            if ( apos >= ( self -> ref_window_start + self -> ref_window_len ) )
+            {
+                /* if not circular, it cannot intersect */
+                if ( ! self -> obj -> circular )
+                {
+                    /* this seems like it indicates end of window,
+                       however there is no guarantee that the ids
+                       being fetched are in reference order. they are
+                       supposed to be in row order ( cluster ) to
+                       reduce random access to cursor. unless row
+                       order is guaranteed to be reference order,
+                       we cannot know that the loop can be terminated. */
+                    continue;
+                }
+
+                /* circular, but still within linear range
+                   means it cannot wrap around to intersect */
+                if ( (INSDC_coord_zero)( apos + alen ) <= self->obj->seq_len )
+                    continue;
+
+            }
+            else if ( ( self->obj->circular )&&
+                       ( apos + alen > self->obj->seq_len )&&
+                       ( self->cur_ref_row_rel < 0 ) ) 
+            {
+                /* the end of the alignment sticks over the end of the reference! 
+                   ---> we have the rare case of an alignment that wraps arround !
+                   let as insert the alignment 2 times!
+                   ( one with neg. position, one at real position ) */
+                rc =  make_alignment( self, row_id, apos - self->obj->seq_len, alen );
+            }
+
+            /* having arrived here, we know the alignment intersects our window
+               apos MAY be < 0 if the alignment wrapped around */
+            if ( rc == 0 && self->cur_ref_row_rel >= 0 )
+                rc =  make_alignment( self, row_id, apos, alen );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC PlacementIteratorNextAvailPos( const PlacementIterator *cself,
+    INSDC_coord_zero *pos, INSDC_coord_len *len )
+{
+    rc_t rc = 0;
+    PlacementIterator* self = (PlacementIterator*)cself;
+
+    if ( self == NULL || ( pos == NULL && len == NULL ) )
+    {
+        rc = RC( rcAlign, rcType, rcSelecting, rcParam, rcInvalid );
+    }
+    else
+    {
+        while ( rc == 0 && VectorLength( &self->ids ) == 0 )
+        {
+            /* read ids */
+
+            self->cur_ref_row_rel++;   /* increment row offset */
+
+#if 0
+            ALIGN_DBG( "ref row: ref-start-row-id:%,li - curr-rel-row:%,li - of:%,li",
+                       self->obj->start_rowid, self->cur_ref_row_rel, self->last_ref_row_of_window_rel );
+#endif
+
+            if ( self->cur_ref_row_rel > self->last_ref_row_of_window_rel )
+                rc = SILENT_RC( rcAlign, rcType, rcSelecting, rcRange, rcDone );
+            else
+            {
+                int64_t row = ( self->obj->start_rowid + self->cur_ref_row_rel );
+                if ( self->cur_ref_row_rel < 0 )
+                    row += self->rowcount_of_ref;
+
+                rc = TableReader_ReadRow( self->ref_reader, row );
+                if ( rc == 0 )
+                    rc = read_alignments( self );
+
+                if ( ( rc == 0 || GetRCState( rc ) == rcDone) && VectorLength( &cself->ids ) > 0 )
+                {
+                    VectorReorder( &self->ids, PlacementRecordVector_cmp, NULL );
+#if _DEBUGGING && 0
+                    ALIGN_DBG( "REFERENCE row %li %u recs order by pos asc, len desc, id asc",
+                                row, VectorLength( &cself->ids ) );
+                    VectorForEach( &self->ids, true, PlacementRecordVector_dump, NULL );
+#endif
+                }
+            }
+        }
+
+        if ( rc == 0 || GetRCState( rc ) == rcDone )
+        {
+            uint32_t count = VectorLength( &cself->ids );
+            if ( count > 0 )
+            {
+                PlacementRecord * r = VectorLast( &cself->ids );
+                rc = 0;
+                if ( pos != NULL ) { *pos = r->pos; }
+                if ( len != NULL ) { *len = r->len; }
+
+#if 0
+                ALIGN_DBG( "PlacementIteratorNextAvailPos( id=%,li, pos=%,d, len=%,u, n=%,u )", r->id, r->pos, r->len, count );
+#endif
+
+                if ( !( cself->obj->circular ) && ( r->pos >= ( cself->ref_window_start + cself->ref_window_len ) ) )
+                {
+                    /* the alignment !starts! after the end of the of the requested window! */
+                    rc = SILENT_RC( rcAlign, rcType, rcSelecting, rcRange, rcDone );
+                }
+            }
+            else
+            {
+                ALIGN_DBG( "PlacementIteratorNextAvailPos( no placements )", 0 );
+            }
+        }
+    }
+
+    if ( rc != 0 && GetRCState(rc) != rcDone )
+        ALIGN_DBGERR( rc );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC PlacementIteratorNextRecordAt( PlacementIterator *cself,
+    INSDC_coord_zero pos, const PlacementRecord **rec )
+{
+    rc_t rc = 0;
+    if ( cself == NULL || rec == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        uint32_t vlen = VectorLength( &cself->ids );
+        *rec = NULL;
+        if ( vlen > 0 )
+        {
+            PlacementRecord* r = VectorLast( &cself->ids );
+            if ( r->pos == pos )
+            {
+                VectorRemove( &cself->ids, vlen - 1, (void**)rec );
+            }
+        }
+    }
+
+    if ( rc == 0 && *rec == NULL )
+    {
+        rc = SILENT_RC( rcAlign, rcType, rcSelecting, rcOffset, rcDone );
+    }
+    else
+    {
+        ALIGN_DBGERR( rc );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC PlacementIteratorNextIdAt( PlacementIterator *cself,
+                                              INSDC_coord_zero pos, int64_t *row_id, INSDC_coord_len *len )
+{
+    rc_t rc = 0;
+    const PlacementRecord* r = NULL;
+
+    if ( cself == NULL || row_id == NULL )
+    {
+        rc = RC( rcAlign, rcType, rcAccessing, rcParam, rcInvalid );
+    }
+    else
+    {
+        rc = PlacementIteratorNextRecordAt( cself, pos, &r );
+        if ( rc  == 0 )
+        {
+            *row_id = r->id;
+            if ( len != NULL ) { *len = r->len; }
+            PlacementRecordWhack( r );
+        }
+    }
+
+    if ( GetRCState( rc ) != rcDone )
+    {
+        ALIGN_DBGERR( rc );
+    }
+    return rc;
+}
diff --git a/libs/align/refseq-mgr-priv.h b/libs/align/refseq-mgr-priv.h
new file mode 100644
index 0000000..4e746c7
--- /dev/null
+++ b/libs/align/refseq-mgr-priv.h
@@ -0,0 +1,35 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was readten as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_align_refseq_mgr_priv_
+#define _h_align_refseq_mgr_priv_
+
+#include <align/refseq-mgr.h>
+
+typedef bool (*RefSeqMgr_ForEachVolume_callback)(char const server[], char const volume[], void *data);
+
+rc_t RefSeqMgr_ForEachVolume(const RefSeqMgr* cself, RefSeqMgr_ForEachVolume_callback cb, void *data);
+
+#endif /* _h_align_refseq_mgr_priv_ */
diff --git a/libs/align/refseq-mgr.c b/libs/align/refseq-mgr.c
new file mode 100644
index 0000000..36cdbf4
--- /dev/null
+++ b/libs/align/refseq-mgr.c
@@ -0,0 +1,1273 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was readten as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+#include <kdb/manager.h>
+#include <kdb/meta.h>
+#include <kfg/config.h>
+#include <insdc/insdc.h>
+#include <vdb/database.h>
+#include <vdb/vdb-priv.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <align/refseq-mgr.h>
+#include <sysalloc.h>
+
+#include "refseq-mgr-priv.h"
+#include "reader-wgs.h"
+#include "debug.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+struct RefSeqMgr {
+    KConfig *kfg;
+    VDBManager const *vmgr;
+    RefSeq *mru;
+    RefSeq *lru;
+    RefSeq **refSeq;
+    size_t cache;
+    uint32_t reader_options;
+    unsigned num_open_max;
+    unsigned num_open;
+    unsigned nRefSeqs;
+    unsigned maxRefSeqs;
+};
+
+typedef struct RefSeq_VT RefSeq_VT;
+
+enum {
+    refSeqType_RefSeq = 1,
+    refSeqType_RefSeq_odd, /* for some weirdos, like hs37d5, that aren't accessioned */
+    refSeqType_WGS,
+    refSeqType_MAX
+};
+
+struct RefSeq_RefSeq {
+    TableReaderRefSeq const *reader;
+    char name[1];
+};
+
+struct RefSeq_WGS {
+    TableReaderWGS const *reader;
+    int64_t row;
+    unsigned prefixLen; /* e.g. AFNW01000001; common prefix is 'AFNW01' */
+    char name[1];
+};
+
+struct RefSeq {
+    RefSeq_VT const *vt;
+    RefSeqMgr const *mgr;
+    struct RefSeq *newer;
+    struct RefSeq *older;
+    union {
+        struct RefSeq_RefSeq refSeq;
+        struct RefSeq_WGS wgs;
+    } u;
+};
+
+struct RefSeq_VT {
+    RefSeq *(*init)(RefSeq *self, RefSeqMgr const *mgr, unsigned namelen, char const name[]);
+    char const *(*name)(RefSeq const *self);
+    bool (*isopen)(RefSeq const *self);
+    rc_t (*open)(RefSeq *self, RefSeqMgr const *mgr);
+    void (*close)(RefSeq *self);
+    rc_t (*setRow)(RefSeq *self, unsigned N, char const full[]);
+    rc_t (*read)(RefSeq const *self, INSDC_coord_zero offset,
+                 INSDC_coord_len len, uint8_t *buffer,
+                 INSDC_coord_len *written);
+    rc_t (*circular)(RefSeq const *self, bool *result);
+    rc_t (*length)(RefSeq const *self, INSDC_coord_len *result);
+    rc_t (*checksum)(RefSeq const *self, uint8_t const **result);
+    int (*compare)(RefSeq const *self, unsigned qlen, char const qry[]);
+};
+
+static RefSeq *RefSeq_RefSeq_init(RefSeq *self,
+                                   RefSeqMgr const *mgr,
+                                   unsigned namelen,
+                                   char const name[]);
+static char const *RefSeq_RefSeq_name(RefSeq const *self);
+static bool RefSeq_RefSeq_isopen(RefSeq const *self);
+static rc_t RefSeq_RefSeq_open(RefSeq *self, RefSeqMgr const *mgr);
+static rc_t RefSeq_RefSeq_odd_open(RefSeq *self, RefSeqMgr const *mgr);
+static void RefSeq_RefSeq_close(RefSeq *self);
+static rc_t RefSeq_RefSeq_setRow(RefSeq *self, unsigned N, char const name[]);
+static rc_t RefSeq_RefSeq_read(RefSeq const *self,
+                               INSDC_coord_zero offset,
+                               INSDC_coord_len len,
+                               uint8_t *buffer,
+                               INSDC_coord_len *written);
+static rc_t RefSeq_RefSeq_circular(RefSeq const *self,
+                                   bool *result);
+static rc_t RefSeq_RefSeq_length(RefSeq const *self,
+                                INSDC_coord_len *result);
+static rc_t RefSeq_RefSeq_checksum(RefSeq const *self,
+                                   uint8_t const **result);
+static int RefSeq_RefSeq_compare(RefSeq const *self, unsigned const qlen,
+                                 char const qry[]);
+
+static RefSeq_VT const RefSeq_RefSeq_VT = {
+    RefSeq_RefSeq_init,
+    RefSeq_RefSeq_name,
+    RefSeq_RefSeq_isopen,
+    RefSeq_RefSeq_open,
+    RefSeq_RefSeq_close,
+    RefSeq_RefSeq_setRow,
+    RefSeq_RefSeq_read,
+    RefSeq_RefSeq_circular,
+    RefSeq_RefSeq_length,
+    RefSeq_RefSeq_checksum,
+    RefSeq_RefSeq_compare
+};
+
+static RefSeq_VT const RefSeq_RefSeq_odd_VT = {
+    RefSeq_RefSeq_init,
+    RefSeq_RefSeq_name,
+    RefSeq_RefSeq_isopen,
+    RefSeq_RefSeq_odd_open,
+    RefSeq_RefSeq_close,
+    RefSeq_RefSeq_setRow,
+    RefSeq_RefSeq_read,
+    RefSeq_RefSeq_circular,
+    RefSeq_RefSeq_length,
+    RefSeq_RefSeq_checksum,
+    RefSeq_RefSeq_compare
+};
+
+static RefSeq *RefSeq_WGS_init(RefSeq *self,
+                                RefSeqMgr const *mgr,
+                                unsigned const namelen,
+                                char const name[]);
+static char const *RefSeq_WGS_name(RefSeq const *self);
+static bool RefSeq_WGS_isopen(RefSeq const *self);
+static rc_t RefSeq_WGS_open(RefSeq *self, RefSeqMgr const *mgr);
+static void RefSeq_WGS_close(RefSeq *self);
+static rc_t RefSeq_WGS_setRow(RefSeq *self, unsigned N, char const name[]);
+static rc_t RefSeq_WGS_read(RefSeq const *const self,
+                            INSDC_coord_zero const offset,
+                            INSDC_coord_len const len,
+                            uint8_t *const buffer,
+                            INSDC_coord_len *const written);
+static rc_t RefSeq_WGS_circular(RefSeq const *const self,
+                                bool *const result);
+static rc_t RefSeq_WGS_length(RefSeq const *const self,
+                              INSDC_coord_len *const result);
+static rc_t RefSeq_WGS_checksum(RefSeq const *const self,
+                                uint8_t const **const result);
+static int RefSeq_WGS_compare(RefSeq const *self, unsigned const qlen,
+                              char const qry[]);
+
+
+static RefSeq_VT const RefSeq_WGS_VT = {
+    RefSeq_WGS_init,
+    RefSeq_WGS_name,
+    RefSeq_WGS_isopen,
+    RefSeq_WGS_open,
+    RefSeq_WGS_close,
+    RefSeq_WGS_setRow,
+    RefSeq_WGS_read,
+    RefSeq_WGS_circular,
+    RefSeq_WGS_length,
+    RefSeq_WGS_checksum,
+    RefSeq_WGS_compare
+};
+
+static RefSeq *RefSeq_RefSeq_alloc(unsigned const namelen)
+{
+    RefSeq *const self = calloc(1, sizeof(RefSeq) + namelen);
+    if (self)
+        self->vt = &RefSeq_RefSeq_VT;
+    return self;
+}
+
+static RefSeq *RefSeq_RefSeq_odd_alloc(unsigned const namelen)
+{
+    RefSeq *const self = RefSeq_RefSeq_alloc(namelen);
+    if (self)
+        self->vt = &RefSeq_RefSeq_odd_VT;
+    return self;
+}
+
+static RefSeq *RefSeq_WGS_alloc(unsigned const namelen)
+{
+    RefSeq *const self = calloc(1, sizeof(RefSeq) + namelen);
+    if (self)
+        self->vt = &RefSeq_WGS_VT;
+    return self;
+}
+
+static RefSeq *RefSeq_RefSeq_init(RefSeq *const super,
+                                   RefSeqMgr const *const mgr,
+                                   unsigned const namelen,
+                                   char const name[])
+{
+    struct RefSeq_RefSeq *const self = &super->u.refSeq;
+    
+    memmove(self->name, name, namelen);
+    self->name[namelen] = '\0';
+    super->mgr = mgr;
+    
+    return super;
+}
+
+static RefSeq *RefSeq_WGS_init(RefSeq *const super,
+                                RefSeqMgr const *const mgr,
+                                unsigned const namelen,
+                                char const name[])
+{
+    struct RefSeq_WGS *const self = &super->u.wgs;
+    unsigned prefixLen = 0;
+    unsigned digits = 0;
+    
+    while (prefixLen < namelen && digits < 2) {
+        int const ch = name[prefixLen];
+        if (isdigit(ch))
+            ++digits;
+        else
+            digits = 0;
+        ++prefixLen;
+    }
+    assert(digits == 2);
+    assert(prefixLen > 0);
+    assert(prefixLen < namelen);
+
+    memmove(self->name, name, namelen);
+    self->name[prefixLen] = '\0';
+    self->prefixLen = prefixLen;
+    super->mgr = mgr;
+
+    return super;
+}
+
+static char const *RefSeq_RefSeq_name(RefSeq const *super)
+{
+    return super->u.refSeq.name;
+}
+
+static char const *RefSeq_WGS_name(RefSeq const *super)
+{
+    return super->u.wgs.name;
+}
+
+static bool RefSeq_RefSeq_isopen(RefSeq const *const super)
+{
+    return (super->u.refSeq.reader == NULL) ? false : true;
+}
+
+static bool RefSeq_WGS_isopen(RefSeq const *const super)
+{
+    return (super->u.wgs.reader == NULL) ? false : true;
+}
+
+static void RefSeq_RefSeq_close(RefSeq *const super)
+{
+    TableReaderRefSeq const *const reader = super->u.refSeq.reader;
+    
+    super->u.refSeq.reader = NULL;
+    TableReaderRefSeq_Whack(reader);
+}
+
+static void RefSeq_WGS_close(RefSeq *const super)
+{
+    TableReaderWGS const *const reader = super->u.wgs.reader;
+    
+    super->u.wgs.reader = NULL;
+    TableReaderWGS_Whack(reader);
+}
+
+static rc_t RefSeq_RefSeq_setRow(RefSeq *const super,
+                                 unsigned const N, char const name[])
+{
+    return 0;
+}
+
+static rc_t RefSeq_WGS_setRow(RefSeq *const super,
+                              unsigned const N, char const name[])
+{
+    struct RefSeq_WGS *const self = &super->u.wgs;
+    unsigned i;
+    int64_t row = 0;
+
+    assert(strncmp(name, self->name, self->prefixLen) == 0);
+    for (i = self->prefixLen; i < N; ++i) {
+        int const ch = name[i];
+        
+        if (isdigit(ch))
+            row = (row * 10) + (ch - '0');
+        else if (ch == '.')
+            break;
+        else {
+            row = 0;
+            break;
+        }
+    }
+    if (row) {
+        self->row = row;
+        return 0;
+    }
+    return RC(rcAlign, rcTable, rcAccessing, rcRow, rcInvalid);
+}
+
+static rc_t RefSeq_RefSeq_read(RefSeq const *const super,
+                               INSDC_coord_zero const offset,
+                               INSDC_coord_len const length,
+                               uint8_t *const buffer,
+                               INSDC_coord_len *const written)
+{
+    return TableReaderRefSeq_Read(super->u.refSeq.reader, offset, length, buffer, written);
+}
+
+static rc_t RefSeq_WGS_read(RefSeq const *const super,
+                            INSDC_coord_zero const offset,
+                            INSDC_coord_len const length,
+                            uint8_t *const buffer,
+                            INSDC_coord_len *const written)
+{
+    return TableReaderWGS_Read(super->u.wgs.reader, super->u.wgs.row, offset, length, buffer, written);
+}
+
+static rc_t RefSeq_RefSeq_circular(RefSeq const *const super, bool *const result)
+{
+    return TableReaderRefSeq_Circular(super->u.refSeq.reader, result);
+}
+
+static rc_t RefSeq_WGS_circular(RefSeq const *const super, bool *const result)
+{
+    return TableReaderWGS_Circular(super->u.wgs.reader, super->u.wgs.row, result);
+}
+
+static rc_t RefSeq_RefSeq_length(RefSeq const *const super, INSDC_coord_len *const result)
+{
+    return TableReaderRefSeq_SeqLength(super->u.refSeq.reader, result);
+}
+
+static rc_t RefSeq_WGS_length(RefSeq const *const super, INSDC_coord_len *const result)
+{
+    return TableReaderWGS_SeqLength(super->u.wgs.reader, super->u.wgs.row, result);
+}
+
+static rc_t RefSeq_RefSeq_checksum(RefSeq const *const super, uint8_t const **const result)
+{
+    return TableReaderRefSeq_MD5(super->u.refSeq.reader, result);
+}
+
+static rc_t RefSeq_WGS_checksum(RefSeq const *const super, uint8_t const **const result)
+{
+    return TableReaderWGS_MD5(super->u.wgs.reader, super->u.wgs.row, result);
+}
+
+static int RefSeq_RefSeq_compare(RefSeq const *super,
+                                 unsigned const qlen, char const qry[])
+{
+    char const *const fnd = super->u.refSeq.name;
+    unsigned i;
+    
+    for (i = 0; ; ++i) {
+        int const a = i == qlen ? '\0' : qry[i];
+        int const b = fnd[i];
+        
+        if (a < b)
+            return -1;
+        
+        if (b < a)
+            return 1;
+        
+        if (a == 0)
+            break;
+    }
+    return 0;
+}
+
+static int RefSeq_WGS_compare(RefSeq const *super, unsigned const qlen, char const qry[])
+{
+    struct RefSeq_WGS const *const self = &super->u.wgs;
+    char const *const fnd = self->name;
+    unsigned const prefixLen = self->prefixLen;
+    unsigned i;
+
+    for (i = 0; i < prefixLen && i < qlen; ++i) {
+        int const a = qry[i];
+        int const b = fnd[i];
+        int const diff = a - b;
+
+        if (diff != 0)
+            return diff;
+    }
+    return i == prefixLen ? 0 : qry[i];
+}
+
+static unsigned FindAccession(unsigned const N,
+                              RefSeq const * const *const refSeq,
+                              unsigned const qlen, char const qry[],
+                              bool *matched)
+{
+    unsigned f = 0;
+    unsigned e = N;
+    
+    while (f < e) {
+        unsigned const m = f + ((e - f) >> 1);
+        int const diff = refSeq[m]->vt->compare(refSeq[m], qlen, qry);
+
+        if (diff == 0) {
+            *matched = true;
+            return m;
+        }
+        if (diff < 0)
+            e = m;
+        else
+            f = m + 1;
+    }
+    *matched = false;
+    return f;
+}
+
+static rc_t get_schema_info(KMetadata const *const meta,
+                            unsigned const bsz, char buffer[])
+{
+    KMDataNode const *node;
+    rc_t rc = KMetadataOpenNodeRead(meta, &node, "schema");
+    
+    if (rc == 0) {
+        size_t sz;
+        
+        rc = KMDataNodeReadAttr(node, "name", buffer, bsz - 1, &sz);
+        KMDataNodeRelease(node);
+        if (rc == 0) {
+            buffer[sz] = '\0';
+            while (sz) {
+                --sz;
+                if (buffer[sz] == '#') {
+                    buffer[sz] = '\0';
+                    break;
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+static rc_t get_tbl_schema_info(VTable const *const tbl,
+                                unsigned const bsz, char buffer[])
+{
+    KMetadata const *meta;
+    rc_t rc = VTableOpenMetadataRead(tbl, &meta);
+    
+    buffer[0] = '\0';
+    if (rc == 0) rc = get_schema_info(meta, bsz, buffer);
+    KMetadataRelease(meta);
+    return rc;
+}
+
+static rc_t get_db_schema_info(VDatabase const *db,
+                               unsigned const bsz, char buffer[])
+{
+    KMetadata const *meta;
+    rc_t rc = VDatabaseOpenMetadataRead(db, &meta);
+    
+    buffer[0] = '\0';
+    if (rc == 0) rc = get_schema_info(meta, bsz, buffer);
+    KMetadataRelease(meta);
+    return rc;
+}
+
+static rc_t RefSeq_RefSeq_open(RefSeq *const super, RefSeqMgr const *const mgr)
+{
+    struct RefSeq_RefSeq *const self = &super->u.refSeq;
+    VTable const *tbl;
+    rc_t rc = VDBManagerOpenTableRead(mgr->vmgr, &tbl, NULL, self->name);
+    
+    if (tbl) {
+        char scheme[1024];
+        
+        get_tbl_schema_info(tbl, sizeof(scheme), scheme);
+        if (strcmp(scheme, "NCBI:refseq:tbl:reference") == 0) {
+            rc = TableReaderRefSeq_MakeTable(&self->reader, mgr->vmgr, tbl,
+                                             mgr->reader_options, mgr->cache);
+        }
+        else {
+            rc = RC(rcAlign, rcTable, rcOpening, rcType, rcInvalid);
+        }
+        VTableRelease(tbl);
+    }
+    return rc;
+}
+
+static rc_t RefSeq_RefSeq_odd_open(RefSeq *const super, RefSeqMgr const *const mgr)
+{
+    struct RefSeq_RefSeq *const self = &super->u.refSeq;
+    VTable const *tbl;
+    rc_t rc = VDBManagerOpenTableRead(mgr->vmgr, &tbl, NULL, "ncbi-acc:%s?vdb-ctx=refseq", self->name);
+    
+    if (tbl) {
+        char scheme[1024];
+        
+        get_tbl_schema_info(tbl, sizeof(scheme), scheme);
+        if (strcmp(scheme, "NCBI:refseq:tbl:reference") == 0) {
+            rc = TableReaderRefSeq_MakeTable(&self->reader, mgr->vmgr, tbl,
+                                             mgr->reader_options, mgr->cache);
+        }
+        else {
+            rc = RC(rcAlign, rcTable, rcOpening, rcType, rcInvalid);
+        }
+        VTableRelease(tbl);
+    }
+    return rc;
+}
+
+static rc_t RefSeq_WGS_open(RefSeq *const super, RefSeqMgr const *const mgr)
+{
+    struct RefSeq_WGS *const self = &super->u.wgs;
+    VDatabase const *db;
+    rc_t rc = VDBManagerOpenDBRead(mgr->vmgr, &db, NULL, self->name);
+
+    if (db) {
+        char scheme[1024];
+        
+        get_db_schema_info(db, sizeof(scheme), scheme);
+        if (strcmp(scheme, "NCBI:WGS:db:contig") == 0) {
+            VTable const *tbl;
+            
+            rc = VDatabaseOpenTableRead(db, &tbl, "SEQUENCE");
+            if (tbl) {
+                rc = TableReaderWGS_MakeTable(&self->reader, mgr->vmgr, tbl,
+                                                 mgr->reader_options, mgr->cache);
+                VTableRelease(tbl);
+            }
+        }
+        else {
+            rc = RC(rcAlign, rcTable, rcOpening, rcType, rcInvalid);
+        }
+        VDatabaseRelease(db);
+    }
+    return rc;
+}
+
+static int AccessionType(VDBManager const *const mgr,
+                         unsigned const N, char const accession[],
+                         rc_t *const rc)
+{
+    char scheme[1024];
+    bool isOdd = false;
+
+    scheme[0] = '\0';
+    {
+        KMetadata const *meta = NULL;
+        {
+            VDatabase const *db = NULL;
+
+            *rc = VDBManagerOpenDBRead(mgr, &db, NULL, "%.*s", (int)N, accession);
+            if (db) {
+                *rc = VDatabaseOpenMetadataRead(db, &meta);
+                VDatabaseRelease(db);
+            }
+            else {
+                VTable const *tbl = NULL;
+
+                *rc = VDBManagerOpenTableRead(mgr, &tbl, NULL, "%.*s", (int)N, accession);
+                if (tbl) {
+                    *rc = VTableOpenMetadataRead(tbl, &meta);
+                    VTableRelease(tbl);
+                }
+                else {
+                    isOdd = true;
+                    *rc = VDBManagerOpenTableRead(mgr, &tbl, NULL, "ncbi-acc:%.*s?vdb-ctx=refseq", (int)N, accession);
+                    if (tbl) {
+                        *rc = VTableOpenMetadataRead(tbl, &meta);
+                        VTableRelease(tbl);
+                    }
+                }
+            }
+        }
+        if (meta) {
+            KMDataNode const *node = NULL;
+
+            *rc = KMetadataOpenNodeRead(meta, &node, "schema");
+            KMetadataRelease(meta);
+            if (node) {
+                size_t sz = 0;
+
+                *rc = KMDataNodeReadAttr(node, "name", scheme, sizeof(scheme) - 1, &sz);
+                KMDataNodeRelease(node);
+                scheme[sz] = '\0';
+                while (sz) {
+                    --sz;
+                    if (scheme[sz] == '#') {
+                        scheme[sz] = '\0';
+                        break;
+                    }
+                }
+            }
+        }
+    }
+    if (strcmp(scheme, "NCBI:WGS:db:contig") == 0)
+        return refSeqType_WGS;
+    if (strcmp(scheme, "NCBI:refseq:tbl:reference") == 0)
+        return isOdd ? refSeqType_RefSeq_odd : refSeqType_RefSeq;
+    return 0;
+}
+
+static void WhackAllReaders(RefSeqMgr *const mgr);
+
+LIB_EXPORT rc_t CC RefSeqMgr_SetCache(RefSeqMgr const *const cself, size_t cache, uint32_t keep_open_num)
+{
+    if (cself) {
+        RefSeqMgr *const self = (RefSeqMgr *)cself;
+        
+        WhackAllReaders(self);
+        assert(self->num_open == 0);
+        self->cache = cache;
+        self->num_open_max = keep_open_num;
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC RefSeqMgr_Make( const RefSeqMgr** cself, const VDBManager* vmgr,
+                                   uint32_t reader_options, size_t cache, uint32_t keep_open_num )
+{
+    rc_t rc = 0;
+    RefSeqMgr* obj = NULL;
+    
+    if ( cself == NULL || vmgr == NULL )
+    {
+        rc = RC( rcAlign, rcIndex, rcConstructing, rcParam, rcNull );
+    }
+    else
+    {
+        obj = calloc( 1, sizeof( *obj ) );
+        if ( obj == NULL )
+        {
+            rc = RC( rcAlign, rcIndex, rcConstructing, rcMemory, rcExhausted );
+        }
+        else
+        {
+            rc = KConfigMake( &obj->kfg, NULL );
+            if ( rc == 0 )
+            {
+                rc = VDBManagerAddRef( vmgr );
+                if ( rc == 0 )
+                {
+                    obj->vmgr = vmgr;
+                    obj->cache = cache;
+                    obj->num_open_max = keep_open_num;
+                    obj->reader_options = reader_options;
+                }
+            }
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        *cself = obj;
+/*        ALIGN_DBG( "max_open: %u", obj->num_open_max ); */
+    }
+    else
+    {
+        RefSeqMgr_Release( obj );
+        ALIGN_DBGERR( rc );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC RefSeqMgr_Release(const RefSeqMgr* cself)
+{
+    if( cself != NULL ) {
+        RefSeqMgr* self = (RefSeqMgr*)cself;
+        unsigned i;
+
+        WhackAllReaders(self);
+        for (i = 0; i < self->nRefSeqs; ++i)
+            free(self->refSeq[i]);
+        free(self->refSeq);
+        VDBManagerRelease(self->vmgr);
+        KConfigRelease(self->kfg);
+        free(self);
+    }
+    return 0;
+}
+
+static rc_t NewRefSeq(RefSeqMgr *const self,
+                                int const type,
+                                unsigned const at,
+                                unsigned const N,
+                                char const accession[])
+{
+    if (self->nRefSeqs + 1 > self->maxRefSeqs) {
+        unsigned const maxRefSeqs = (self->maxRefSeqs == 0) ? 32 : (self->maxRefSeqs << 1);
+        void *tmp = realloc(self->refSeq, maxRefSeqs * sizeof(self->refSeq[0]));
+        
+        if (tmp == NULL)
+            return RC(rcAlign, rcTable, rcAccessing, rcMemory, rcExhausted);
+        
+        self->maxRefSeqs = maxRefSeqs;
+        self->refSeq = tmp;
+    }
+    ALIGN_CF_DBG("Inserting '%.*s' at %u", N, accession, at);
+    memmove(&self->refSeq[at + 1], &self->refSeq[at], sizeof(self->refSeq[0]) * (self->nRefSeqs - at));
+    ++self->nRefSeqs;
+    {
+        RefSeq *rs = NULL;
+    
+        switch (type) {
+        case refSeqType_RefSeq:
+            rs = RefSeq_RefSeq_alloc(N);
+            break;
+        case refSeqType_RefSeq_odd:
+            rs = RefSeq_RefSeq_odd_alloc(N);
+            break;
+        case refSeqType_WGS:
+            rs = RefSeq_WGS_alloc(N);
+            break;
+        default:
+            assert("unknown type of RefSeq object");
+            break;
+        }
+        self->refSeq[at] = rs;
+    
+        if (rs == NULL)
+            return RC(rcAlign, rcTable, rcAccessing, rcMemory, rcExhausted);
+
+        rs->vt->init(rs, self, N, accession);
+    }
+    return 0;
+}
+
+static rc_t exists(RefSeqMgr *const self, unsigned const N, char const accession[])
+{
+    rc_t rc = 0;
+    bool matched = false;
+    unsigned const at = FindAccession(self->nRefSeqs,
+                                      (RefSeq const **)self->refSeq,
+                                      N, accession, &matched);
+    if (matched)
+        return 0;
+    {
+        int const type = AccessionType(self->vmgr, N, accession, &rc);
+        if (type)
+            rc = 0;
+        else if (rc == 0)
+            rc = RC(rcAlign, rcTable, rcAccessing, rcType, rcUnexpected);
+        if (rc == 0)
+            rc = NewRefSeq(self, type, at, N, accession);
+        else {
+            ALIGN_CF_DBG("failed to open %.*s", N, accession);
+            ALIGN_DBGERR(rc);
+        }
+    }    
+    return rc;
+}
+
+static void MakeNewest(RefSeqMgr *const self, RefSeq *const rs)
+{
+    if (self->mru == rs) /* is already newest */
+        return;
+
+    {   /* unlink rs from list */
+        RefSeq *const older = rs->older;
+        RefSeq *const newer = rs->newer;
+
+        if (older) older->newer = newer;
+        if (newer) newer->older = older;
+    }
+    /* make rs be head of list */
+    {
+        RefSeq *const prev = self->mru;
+
+        if (prev) prev->newer = rs;
+        rs->older = prev;
+        rs->newer = NULL;
+    }
+    self->mru = rs;
+    if (self->lru == NULL)
+        self->lru = rs;
+}
+
+static rc_t GetSeq(RefSeqMgr *const self, RefSeq **result,
+                               unsigned const N, char const accession[])
+{
+    rc_t rc = 0;
+    bool matched = false;
+    unsigned const at = FindAccession(self->nRefSeqs,
+                                      (RefSeq const **)self->refSeq,
+                                      N, accession, &matched);
+    
+    if (!matched) {
+        int const type = AccessionType(self->vmgr, N, accession, &rc);
+        if (type)
+            rc = 0;
+        else if (rc == 0)
+            rc = RC(rcAlign, rcTable, rcAccessing, rcType, rcUnexpected);
+        if (rc == 0)
+            rc = NewRefSeq(self, type, at, N, accession);
+        else {
+            ALIGN_CF_DBG("failed to open %.*s", N, accession);
+            ALIGN_DBGERR(rc);
+        }
+    }
+    if (rc)
+        return rc;
+    {
+        RefSeq *const fnd = self->refSeq[at];
+
+        *result = fnd;
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t RefSeqMgr_Exists(const RefSeqMgr* cself, const char* accession, uint32_t accession_sz, char** path)
+{
+    if (cself == NULL || accession == NULL || accession_sz == 0) {
+        return RC(rcAlign, rcIndex, rcAccessing, rcParam, rcNull);
+    }
+    else {
+        return exists((RefSeqMgr *)cself, accession_sz, accession);
+    }
+}
+
+LIB_EXPORT rc_t CC RefSeqMgr_Read(const RefSeqMgr* cself, const char* seq_id, uint32_t seq_id_sz,
+                                  INSDC_coord_zero offset, INSDC_coord_len len,
+                                  uint8_t* buffer, INSDC_coord_len* written)
+{
+    RefSeq const *obj;
+    rc_t rc = 0;
+
+    if( (rc = RefSeqMgr_GetSeq(cself, &obj, seq_id, seq_id_sz)) == 0 ) {
+        rc = RefSeq_Read(obj, offset, len, buffer, written);
+        RefSeq_Release(obj);
+    }
+    return rc;
+}
+
+static void WhackAllReaders(RefSeqMgr *const self)
+{
+    unsigned i;
+    
+    for (i = 0; i < self->nRefSeqs; ++i) {
+        RefSeq *const rs = self->refSeq[i];
+
+        if (rs->vt->isopen(rs)) {
+            ALIGN_CF_DBG("closing %s", rs->vt->name(rs));
+            rs->vt->close(rs);
+            --self->num_open;
+        }
+        rs->newer = rs->older = NULL;
+    }
+    self->mru = self->lru = NULL;
+}
+
+static rc_t GetReader(RefSeqMgr *const self, RefSeq *const obj)
+{
+    if (obj->vt->isopen(obj))
+        return 0;
+    {
+        unsigned const max_open = self->num_open_max;
+
+        while (max_open > 0 && self->num_open >= max_open) {
+            RefSeq *const lru = self->lru;
+
+            assert(lru);
+            ALIGN_CF_DBG("closing %s", lru->vt->name(lru));
+            self->lru = lru->newer;
+            --self->num_open;
+            lru->vt->close(lru);
+            lru->newer = lru->older = NULL;
+        }
+    }
+    {
+        rc_t const rc = obj->vt->open(obj, self);
+
+        if (rc) return rc;
+    }
+    MakeNewest(self, obj);
+    ++self->num_open;
+    ALIGN_CF_DBG("opened %s", obj->vt->name(obj));
+
+    return 0;
+}
+
+static rc_t GetSeqInternal(RefSeqMgr *const self,
+                              RefSeq const **const result,
+                              unsigned const seq_id_sz,
+                              char const seq_id[])
+{
+    RefSeq *obj = NULL;
+    
+    if (self->mru == NULL || self->mru->vt->compare(self->mru, seq_id_sz, seq_id) != 0) {
+        rc_t const rc = GetSeq(self, &obj, seq_id_sz, seq_id);
+        if (rc)
+            return rc;
+    }
+    else
+        obj = self->mru;
+    {
+        rc_t const rc = GetReader(self, obj);
+        if (rc)
+            return rc;
+    }
+    obj->vt->setRow(obj, seq_id_sz, seq_id);
+    *result = obj;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC RefSeqMgr_GetSeq(RefSeqMgr const *const cmgr,
+                                    RefSeq const **result,
+                                    char const *seq_id,
+                                    uint32_t seq_id_sz)
+{
+    rc_t rc;
+
+    if (cmgr == NULL || result == NULL || seq_id == NULL)
+        rc = RC(rcAlign, rcIndex, rcConstructing, rcParam, rcNull);
+    else
+        rc = GetSeqInternal((RefSeqMgr *)cmgr, result, seq_id_sz, seq_id);
+
+    if (rc)
+        ALIGN_DBGERRP("SEQ_ID: '%.*s'", rc, seq_id_sz, seq_id);
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC RefSeq_Read(const RefSeq* cself, INSDC_coord_zero offset, INSDC_coord_len len,
+                               uint8_t* buffer, INSDC_coord_len* written)
+{
+    rc_t rc = 0;
+
+    if (cself == NULL || buffer == NULL || written == NULL)
+        rc = RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+    else {
+        RefSeq *const self = (RefSeq *)cself;
+        RefSeqMgr *const mgr = (RefSeqMgr *)self->mgr;
+        
+        rc = GetReader(mgr, self);
+        if (rc == 0)
+            rc = self->vt->read(self, offset, len, buffer, written);
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC RefSeq_Circular(const RefSeq* cself, bool* circular)
+{
+    rc_t rc = 0;
+
+    if (cself == NULL)
+        rc = RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+    else {
+        RefSeq const *const self = (RefSeq *)cself;
+        
+        rc = self->vt->circular(self, circular);
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC RefSeq_SeqLength(const RefSeq* cself, INSDC_coord_len* len)
+{
+    rc_t rc = 0;
+
+    if (cself == NULL)
+        rc = RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+    else {
+        RefSeq const *const self = (RefSeq *)cself;
+        
+        rc = self->vt->length(self, len);
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC RefSeq_MD5(const RefSeq* cself, const uint8_t** md5)
+{
+    rc_t rc = 0;
+
+    if (cself == NULL)
+        rc = RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+    else {
+        RefSeq const *const self = (RefSeq *)cself;
+        
+        rc = self->vt->checksum(self, md5);
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC RefSeq_Name(const RefSeq* cself, const char** name)
+{
+    rc_t rc = 0;
+    
+    if (cself == NULL)
+        rc = RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+    else {
+        RefSeq const *const self = (RefSeq *)cself;
+        
+        *name = self->vt->name(self);
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC RefSeq_Release(const RefSeq* cself)
+{
+    return 0;
+}
+
+static
+rc_t RefSeqMgr_ConfigValue ( const KConfig *kfg, const char *node_path, char *value, size_t value_size )
+{
+    const KConfigNode *node;
+    rc_t rc = KConfigOpenNodeRead ( kfg, & node, "%s", node_path );
+    if ( rc == 0 )
+    {
+        size_t num_read, remaining;
+        rc = KConfigNodeRead ( node, 0, value, value_size - 1, & num_read,  & remaining );
+        if ( rc == 0 )
+        {
+            if ( remaining != 0 )
+                rc = RC ( rcSRA, rcMgr, rcConstructing, rcString, rcExcessive );
+            else
+                value [ num_read ] = 0;
+        }
+        
+        KConfigNodeRelease ( node );
+    }
+    return rc;
+}
+
+static
+rc_t RefSeqMgr_KfgReadRepositories(const KConfig* kfg, char* paths, size_t paths_sz)
+{
+    /* servers are children of refseq/repository, e.g.:             /refseq/repository/main="..." */
+    /* volumes are in refseq/repository/<serverName>/volumes, e.g.: /refseq/repository/main/volumes="..." */
+    /* all server/volume combinations are returned in paths separated by ':' */
+    
+    rc_t rc = 0;
+    const KConfigNode *node;
+#define KFG_PATH "/refseq/repository/"
+    paths[0] = 0;
+    
+    rc = KConfigOpenNodeRead ( kfg, & node, KFG_PATH );
+    if ( rc == 0 )
+    {
+        KNamelist* children;
+        rc = KConfigNodeListChild ( node, &children );
+        if ( rc == 0 )
+        {
+            uint32_t count;
+            rc = KNamelistCount ( children, &count );
+            if ( rc == 0 )
+            {
+                uint32_t i;
+                for (i = 0; i < count; ++i) /* for all servers */
+                {
+                    const char* name;
+                    rc = KNamelistGet ( children, i, &name );
+                    if ( rc == 0 )
+                    {
+#define BufSize 4096
+                        char server[ BufSize ];
+                        char buf[ BufSize ];
+                        size_t num_writ;
+                        
+                        rc = string_printf(buf, BufSize, &num_writ, KFG_PATH "%s", name);
+                        if (rc == 0)
+                        {
+                            rc = RefSeqMgr_ConfigValue ( kfg, buf, server, sizeof(server) );
+                            if (rc == 0)
+                            {
+                                rc = string_printf(buf, BufSize, &num_writ, KFG_PATH "%s/volumes", name);
+                                if (rc == 0)
+                                {
+                                    char volumes[ BufSize ];
+                                    rc = RefSeqMgr_ConfigValue ( kfg, buf, volumes, sizeof(volumes) );
+                                    if (rc == 0)
+                                    {   /* create a server/volume pair for every combination, append to paths, ':' - separate */
+                                        char *vol_rem = volumes;
+                                        char *vol_sep;
+                                        
+                                        do {
+                                            char const *volume = vol_rem;
+                                            vol_sep = string_chr(volume, string_size(volume), ':');
+                                            if(vol_sep) {
+                                                vol_rem = vol_sep + 1;
+                                                *vol_sep = 0;
+                                            }
+                                            string_copy(paths + string_size(paths), paths_sz - string_size(paths), server, string_size(server));
+                                            if (paths[string_size(paths)-1] != '/')
+                                            {
+                                                string_copy(paths + string_size(paths), paths_sz - string_size(paths), "/", 1);
+                                            }
+                                            string_copy(paths + string_size(paths), paths_sz - string_size(paths), volume, string_size(volume));
+                                            string_copy(paths + string_size(paths), paths_sz - string_size(paths), ":", 1);
+                                        } while(vol_sep);
+                                    }
+                                }
+                            }
+                        }
+#undef BufSize
+                    }
+                    if ( rc != 0 )
+                    {
+                        break;
+                    }
+                }
+            }
+            KNamelistRelease ( children );
+        }
+        
+        KConfigNodeRelease ( node );
+    }
+    if (GetRCState(rc) == rcNotFound)
+    {
+        paths[0] = '\0';
+        return 0;
+    }
+    return 0;
+}
+
+static
+rc_t RefSeqMgr_KfgReadStr(const KConfig* kfg, const char* path, char* value, size_t value_sz)
+{
+    rc_t rc = 0;
+    const KConfigNode *node;
+    
+    if ( (rc = KConfigOpenNodeRead(kfg, &node, "%s", path)) == 0 ) {
+        size_t num_read, remaining;
+        if( (rc = KConfigNodeRead(node, 0, value, value_sz - 1, &num_read, &remaining)) == 0 ) {
+            if( remaining != 0 ) {
+                rc = RC(rcAlign, rcIndex, rcConstructing, rcString, rcTooLong);
+            } else {
+                value[num_read] = '\0';
+            }
+        }
+        KConfigNodeRelease(node);
+    } else if( GetRCState(rc) == rcNotFound ) {
+        rc = 0;
+        value[0] = '\0';
+    }
+    return rc;
+}
+
+rc_t RefSeqMgr_ForEachVolume(const RefSeqMgr* cself, RefSeqMgr_ForEachVolume_callback cb, void *data)
+{
+    rc_t rc = 0;
+    char servers[4096];
+    char volumes[4096];
+    
+    if( cself == NULL || cb == NULL ) {
+        rc = RC(rcAlign, rcType, rcConstructing, rcParam, rcNull);
+    } else if( cb(".", NULL, data) ) {
+        /* found in local dir */
+    } else if( (rc = RefSeqMgr_KfgReadStr(cself->kfg, "refseq/paths", servers, sizeof(servers))) != 0 ) {
+        ALIGN_DBGERRP("%s", rc, "RefSeqMgr_KfgReadStr(paths)");
+    } else {
+        bool found = false;
+        if( servers[0] != '\0' ) {
+            char *srv_sep;
+            char *srv_rem = servers;
+            do {
+                char const* server = srv_rem;
+                
+                srv_sep = strchr(server, ':');
+                if(srv_sep) {
+                    srv_rem = srv_sep + 1;
+                    *srv_sep = 0;
+                }
+                if( cb(server, NULL, data) ) {
+                    found = true;
+                    break;
+                }
+            } while(srv_sep);
+        }
+        if( !found ) {
+            /* locate refseq servers/volumes in possibly multiple repositories */
+            if( (rc = RefSeqMgr_KfgReadRepositories(cself->kfg, servers, sizeof(servers))) != 0 ) {
+                ALIGN_DBGERRP("%s", rc, "RefSeqMgr_KfgReadStr(refseq/repository/*)");
+            };
+            if( servers[0] != '\0' ) {
+                char *srv_sep;
+                char *srv_rem = servers;
+                do {
+                    char const* server = srv_rem;
+                    
+                    srv_sep = strchr(server, ':');
+                    if(srv_sep) {
+                        srv_rem = srv_sep + 1;
+                        *srv_sep = 0;
+                    }
+                    if( cb(server, NULL, data) ) {
+                        found = true;
+                        break;
+                    }
+                } while(srv_sep);
+            }
+        }
+        if( !found ) {
+            if ( (rc = RefSeqMgr_KfgReadStr(cself->kfg, "refseq/servers", servers, sizeof(servers))) != 0 ||
+                (rc = RefSeqMgr_KfgReadStr(cself->kfg, "refseq/volumes", volumes, sizeof(volumes))) != 0 ) {
+                ALIGN_DBGERRP("%s", rc, "RefSeqMgr_KfgReadStr(servers/volumes)");
+            }
+            /* servers and volumes are deprecated and optional */
+            if( rc == 0 && (servers[0] != '\0' || volumes[0] != '\0') ) {
+                char *srv_sep;
+                char *srv_rem = servers;
+                do {
+                    char vol[ 4096 ];
+                    char const *server = srv_rem;
+                    char *vol_rem = vol;
+                    char *vol_sep;
+                    
+                    string_copy ( vol, sizeof vol, volumes, string_size( volumes ) );
+                    srv_sep = strchr(server, ':');
+                    if(srv_sep) {
+                        srv_rem = srv_sep + 1;
+                        *srv_sep = 0;
+                    }
+                    do {
+                        char const *volume = vol_rem;
+                        
+                        vol_sep = strchr(volume, ':');
+                        if(vol_sep) {
+                            vol_rem = vol_sep + 1;
+                            *vol_sep = 0;
+                        }
+                        found = cb(server, volume, data);
+                    } while(!found && vol_sep);
+                } while(!found && srv_sep);
+            }
+        }
+    }
+    return rc;
+}
diff --git a/libs/align/writer-alignment.c b/libs/align/writer-alignment.c
new file mode 100644
index 0000000..eb3bdb5
--- /dev/null
+++ b/libs/align/writer-alignment.c
@@ -0,0 +1,440 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <insdc/insdc.h>
+#include <vdb/database.h>
+#include <vdb/cursor.h>
+#include <align/writer-alignment.h>
+#include "writer-priv.h"
+#include "reader-cmn.h"
+#include "debug.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+static const TableWriterColumn TableWriterAlgn_cols[ewalgn_cn_Last] =
+{
+    /* order is important, see enum in .h !!! */
+    {0, "TMP_KEY_ID", sizeof(uint64_t) * 8, ewcol_Temporary | ewcol_Ignore},
+    {0, "PLOIDY", sizeof(uint32_t) * 8, ewcol_Ignore},
+    {0, "SEQ_SPOT_ID", sizeof(int64_t) * 8, ewcol_IsArray | ewcol_Ignore},
+    {0, "SEQ_READ_ID", sizeof(INSDC_coord_one) * 8, ewcol_IsArray },
+    {0, "READ_START", sizeof(INSDC_coord_zero) * 8, ewcol_IsArray | ewcol_Ignore},
+    {0, "READ_LEN", sizeof(INSDC_coord_len) * 8, ewcol_IsArray | ewcol_Ignore},
+    {0, "REF_ID", sizeof(int64_t) * 8, ewcol_Ignore},
+    {0, "REF_START", sizeof(INSDC_coord_zero) * 8, ewcol_Ignore},
+    {0, "GLOBAL_REF_START", sizeof(uint64_t) * 8, 0},
+    {0, "REF_LEN", sizeof(INSDC_coord_len) * 8, 0},
+    {0, "REF_ORIENTATION", sizeof(bool) * 8, 0},
+    {0, "REF_PLOIDY", sizeof(uint32_t) * 8, ewcol_IsArray | ewcol_Ignore},
+    {0, "MATE_REF_ORIENTATION", sizeof(bool) * 8, ewcol_Ignore},
+    {0, "MATE_REF_ID", sizeof(int64_t) * 8, ewcol_Ignore},
+    {0, "MATE_REF_POS", sizeof(INSDC_coord_zero) * 8, ewcol_Ignore},
+    {0, "MATE_ALIGN_ID", sizeof(int64_t) * 8, ewcol_Ignore},
+    {0, "TEMPLATE_LEN", sizeof(INSDC_coord_zero) * 8, ewcol_Ignore},
+    {0, "MAPQ", sizeof(int32_t) * 8, 0},
+    {0, "HAS_MISMATCH", sizeof(bool) * 8, ewcol_IsArray},
+    {0, "(bool)HAS_REF_OFFSET", sizeof(bool) * 8, ewcol_IsArray},
+    {0, "MISMATCH", sizeof(INSDC_dna_text) * 8, ewcol_IsArray},
+    {0, "REF_OFFSET", sizeof(int32_t) * 8, ewcol_IsArray},
+    {0, "REF_OFFSET_TYPE", sizeof(uint8_t) * 8, ewcol_IsArray},
+    {0, "EVIDENCE_ALIGNMENT_IDS", sizeof(int64_t) * 8, ewcol_IsArray | ewcol_Ignore},
+    {0, "ALIGN_GROUP", sizeof(char) * 8, ewcol_IsArray | ewcol_Ignore },
+    {0, "LINKAGE_GROUP", sizeof(char) * 8, ewcol_IsArray | ewcol_Ignore },
+    {0, "MISMATCH_QUALITY", sizeof(uint8_t) * 8, ewcol_IsArray | ewcol_Ignore},
+    {0, "MATE_GLOBAL_REF_START", sizeof(uint64_t) * 8, ewcol_Ignore},
+    {0, "MATE_REF_START", sizeof(INSDC_coord_zero) * 8, ewcol_Ignore}
+};
+
+static const TableReaderColumn TableAlgnReadTmpKey_cols[] = {
+    {0, "TMP_KEY_ID", {NULL}, 0, 0},
+    {0, "GLOBAL_REF_START", {NULL}, 0, ercol_Skip},
+    {0, "REF_ID", {NULL}, 0, ercol_Skip},
+    {0, "REF_START", {NULL}, 0, ercol_Skip},
+    {0, NULL, {NULL}, 0, 0}
+};
+
+struct TableWriterAlgn {
+    uint32_t options;
+    const TableWriter* base;
+    const char* ref_table_name;
+    uint8_t cursor_id;
+    TableWriterColumn cols[ewalgn_cn_Last];
+    uint8_t spotid_cursor_id;
+    TableWriterColumn cols_spotid[5];
+    const TableReader* tmpkey_reader;
+    TableReaderColumn cols_read_tmpkey[sizeof(TableAlgnReadTmpKey_cols) / sizeof(TableAlgnReadTmpKey_cols[0])];
+};
+
+LIB_EXPORT rc_t CC TableWriterAlgn_Make(const TableWriterAlgn** cself, VDatabase* db,
+                                        ETableWriterAlgn_TableType type, uint32_t options)
+{
+    rc_t rc = 0;
+    TableWriterAlgn* self = NULL;
+    const char* tbl_nm = __func__;
+
+    if( cself == NULL || db == NULL ) {
+        rc = RC(rcAlign, rcFormatter, rcConstructing, rcParam, rcNull);
+    } else {
+        self = calloc(1, sizeof(*self));
+        if( self == NULL ) {
+            rc = RC(rcAlign, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+        } else {
+            self->ref_table_name = "REFERENCE";
+            memmove(self->cols, TableWriterAlgn_cols, sizeof(TableWriterAlgn_cols));
+            switch(type) {
+            case ewalgn_tabletype_PrimaryAlignment:
+                tbl_nm = "PRIMARY_ALIGNMENT";
+                self->cols[ewalgn_cn_ALIGN_GROUP].flags &= ~ewcol_Ignore;
+                self->cols[ewalgn_cn_LINKAGE_GROUP].flags &= ~ewcol_Ignore;
+                if (options & ewalgn_co_MISMATCH_QUALITY)
+                    self->cols[ewalgn_cn_MISMATCH_QUALITY].flags &= ~ewcol_Ignore;
+                break;
+            case ewalgn_tabletype_SecondaryAlignment:
+                tbl_nm = "SECONDARY_ALIGNMENT";
+#if 0
+                self->cols[ewalgn_cn_HAS_MISMATCH].flags |= ewcol_Ignore;
+                self->cols[ewalgn_cn_MISMATCH].flags |= ewcol_Ignore;
+#else
+                self->cols[ewalgn_cn_MISMATCH].name = "TMP_MISMATCH";
+                self->cols[ewalgn_cn_HAS_MISMATCH].name = "TMP_HAS_MISMATCH";
+#endif
+                self->cols[ewalgn_cn_MATE_REF_ORIENTATION].flags &= ~ewcol_Ignore;
+                self->cols[ewalgn_cn_MATE_REF_ID].flags &= ~ewcol_Ignore;
+                self->cols[ewalgn_cn_MATE_REF_POS].flags &= ~ewcol_Ignore;
+                self->cols[ewalgn_cn_MATE_ALIGN_ID].flags &= ~ewcol_Ignore;
+                self->cols[ewalgn_cn_TEMPLATE_LEN].flags &= ~ewcol_Ignore;
+                /* self->cols[ewalgn_cn_ALIGN_GROUP].flags &= ~ewcol_Ignore; why? */
+                self->cols[ewalgn_cn_LINKAGE_GROUP].flags &= ~ewcol_Ignore;
+                break;
+            case ewalgn_tabletype_EvidenceInterval:
+                tbl_nm = "EVIDENCE_INTERVAL";
+                options |= ewalgn_co_unsorted;
+                options |= ewalgn_co_PLOIDY;
+                self->cols[ewalgn_cn_SEQ_SPOT_ID].flags |= ewcol_Ignore;
+                self->cols[ewalgn_cn_SEQ_READ_ID].flags |= ewcol_Ignore;
+                self->cols[ewalgn_cn_EVIDENCE_ALIGNMENT_IDS].flags &= ~ewcol_Ignore;
+                break;
+            case ewalgn_tabletype_EvidenceAlignment:
+                tbl_nm = "EVIDENCE_ALIGNMENT";
+                self->ref_table_name = "EVIDENCE_INTERVAL";
+                self->cols[ewalgn_cn_REF_PLOIDY].flags &= ~ewcol_Ignore;
+#if 0
+                self->cols[ewalgn_cn_HAS_MISMATCH].flags |= ewcol_Ignore;
+                self->cols[ewalgn_cn_MISMATCH].flags |= ewcol_Ignore;
+#else
+                self->cols[ewalgn_cn_MISMATCH].name = "TMP_MISMATCH";
+                self->cols[ewalgn_cn_HAS_MISMATCH].name = "TMP_HAS_MISMATCH";
+#endif
+                options |= ewalgn_co_unsorted;
+                break;
+            default:
+                rc = RC(rcAlign, rcFormatter, rcConstructing, rcType, rcUnrecognized);
+            }
+            if( options & ewalgn_co_SEQ_SPOT_ID ) {
+                self->cols[ewalgn_cn_SEQ_SPOT_ID].flags &= ~ewcol_Ignore;
+            }
+            if( options & ewalgn_co_TMP_KEY_ID ) {
+                self->cols[ewalgn_cn_TMP_KEY_ID].flags &= ~ewcol_Ignore;
+            }
+            if( options & ewalgn_co_PLOIDY ) {
+                self->cols[ewalgn_cn_PLOIDY].flags &= ~ewcol_Ignore;
+                self->cols[ewalgn_cn_READ_START].flags &= ~ewcol_Ignore;
+                self->cols[ewalgn_cn_READ_LEN].flags &= ~ewcol_Ignore;
+            }
+            if( options & ewalgn_co_unsorted ) {
+                self->cols[ewalgn_cn_REF_ID].flags &= ~ewcol_Ignore;
+                self->cols[ewalgn_cn_REF_START].flags &= ~ewcol_Ignore;
+                self->cols[ewalgn_cn_GLOBAL_REF_START].flags |= ewcol_Ignore;
+                if( type == ewalgn_tabletype_SecondaryAlignment ) {
+                    self->cols[ewalgn_cn_MISMATCH].name = "TMP_MISMATCH";
+                    self->cols[ewalgn_cn_MISMATCH].flags &= ~ewcol_Ignore;
+                    self->cols[ewalgn_cn_HAS_MISMATCH].name = "TMP_HAS_MISMATCH";
+                    self->cols[ewalgn_cn_HAS_MISMATCH].flags &= ~ewcol_Ignore;
+                }
+            }
+            if( options & ewalgn_co_MATE_ALIGN_ID_only ) {
+                self->cols[ewalgn_cn_MATE_REF_ORIENTATION].flags |= ewcol_Ignore;
+                self->cols[ewalgn_cn_MATE_REF_ID].flags |= ewcol_Ignore;
+                self->cols[ewalgn_cn_MATE_REF_POS].flags |= ewcol_Ignore;
+                self->cols[ewalgn_cn_TEMPLATE_LEN].flags |= ewcol_Ignore;
+            }
+            if( (rc = TableWriter_Make(&self->base, db, tbl_nm, NULL)) == 0 ) {
+                static TableWriterData const d = { "", 0 };
+
+                rc = TableWriter_AddCursor(self->base, self->cols, sizeof(self->cols)/sizeof(self->cols[0]), &self->cursor_id);
+                TW_COL_WRITE_DEF(self->base, self->cursor_id, self->cols[ewalgn_cn_LINKAGE_GROUP], d);
+                self->options = options;
+            }
+        }
+    }
+    if( rc == 0 ) {
+        *cself = self;
+        ALIGN_DBG("table %s created", tbl_nm);
+    } else {
+        TableWriterAlgn_Whack(self, false, NULL);
+        ALIGN_DBGERR(rc);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterAlgn_Whack(const TableWriterAlgn* cself, bool commit, uint64_t* rows)
+{
+    rc_t rc = 0;
+    if( cself != NULL ) {
+        VTable* vtbl;
+
+        TableReader_Whack(cself->tmpkey_reader);
+        if( (rc = TableWriter_GetVTable(cself->base, &vtbl)) == 0 ) {
+            KMetadata* meta;
+            if( (rc = VTableOpenMetadataUpdate(vtbl, &meta)) == 0 ) {
+                KMDataNode* node;
+                if( (rc = KMetadataOpenNodeUpdate(meta, &node, "CONFIG/REF_TABLE")) == 0 ) {
+                    rc = KMDataNodeWriteCString(node, cself->ref_table_name);
+                    KMDataNodeRelease(node);
+                }
+                KMetadataRelease(meta);
+            }
+        }
+        rc = TableWriter_Whack(cself->base, commit, rows);
+        free((TableWriterAlgn*)cself);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterAlgn_WriteDefault(const TableWriterAlgn* cself, enum ETableWriterAlgn_ColNames col, const TableWriterData* data)
+{
+    return TableWriter_ColumnDefault(cself->base, 0, &cself->cols[col], data);
+}
+
+LIB_EXPORT rc_t CC TableWriterAlgn_GetNextRowId(const TableWriterAlgn* cself, int64_t* rowid)
+{
+    return TableWriter_GetNextRowId(cself->base, rowid, cself->cursor_id);
+}
+
+LIB_EXPORT rc_t CC TableWriterAlgn_Write(const TableWriterAlgn* cself, const TableWriterAlgnData* data, int64_t* rowid)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || data == NULL ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( (rc = TableWriter_OpenRow(cself->base, rowid, cself->cursor_id)) == 0 ) {
+        TW_COL_WRITE_VAR(cself->base, cself->cols[ewalgn_cn_PLOIDY], data->ploidy);
+
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_SEQ_SPOT_ID], data->seq_spot_id);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_SEQ_READ_ID], data->seq_read_id);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_READ_START], data->read_start);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_READ_LEN], data->read_len);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_TMP_KEY_ID], data->tmp_key_id);
+
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_HAS_REF_OFFSET], data->has_ref_offset);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_REF_OFFSET], data->ref_offset);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_REF_OFFSET_TYPE], data->ref_offset_type);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_REF_ID], data->ref_id);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_REF_START], data->ref_start);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_GLOBAL_REF_START], data->global_ref_start);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_HAS_MISMATCH], data->has_mismatch);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_MISMATCH], data->mismatch);
+        TW_COL_WRITE_VAR(cself->base, cself->cols[ewalgn_cn_REF_LEN], data->ref_len);
+
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_REF_ORIENTATION], data->ref_orientation);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_REF_PLOIDY], data->ref_ploidy);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_MAPQ], data->mapq);
+
+        if( data->mate_align_id.elements != 1 ) {
+            TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_MATE_ALIGN_ID], data->mate_align_id);
+        } else {
+            TW_COL_WRITE_BUF(cself->base, cself->cols[ewalgn_cn_MATE_ALIGN_ID], data->mate_align_id.buffer,
+                             ((const int64_t*)(data->mate_align_id.buffer))[0] ? 1 : 0);
+        }
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_MATE_REF_ORIENTATION], data->mate_ref_orientation);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_MATE_REF_ID], data->mate_ref_id);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_MATE_REF_POS], data->mate_ref_pos);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_TEMPLATE_LEN], data->template_len);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_EVIDENCE_ALIGNMENT_IDS], data->alingment_ids);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_ALIGN_GROUP], data->align_group);
+        TW_COL_WRITE(cself->base, cself->cols[ewalgn_cn_LINKAGE_GROUP], data->linkageGroup);
+
+        if( rc == 0 ) {
+            rc = TableWriter_CloseRow(cself->base);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterAlgn_TmpKeyStart(const TableWriterAlgn* cself)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( (cself->options & ewalgn_co_SEQ_SPOT_ID) || !(cself->options & ewalgn_co_TMP_KEY_ID) ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcParam, rcViolated);
+        ALIGN_DBGERR(rc);
+    } else if( (rc = TableWriter_CloseCursor(cself->base, cself->cursor_id, NULL)) == 0 ) {
+        TableWriterAlgn* self = (TableWriterAlgn*)cself;
+        VTable* vtbl = NULL;
+        
+        memmove(&self->cols_read_tmpkey, &TableAlgnReadTmpKey_cols, sizeof(TableAlgnReadTmpKey_cols));
+        if (self->cols[ewalgn_cn_GLOBAL_REF_START].flags & ewcol_Ignore) {
+            self->cols_read_tmpkey[2].flags = 0;
+            self->cols_read_tmpkey[3].flags = 0;
+        }
+        else
+            self->cols_read_tmpkey[1].flags = 0;
+
+        if( (rc = TableWriter_GetVTable(self->base, &vtbl)) == 0 &&
+            (rc = TableReader_Make(&self->tmpkey_reader, vtbl, self->cols_read_tmpkey, 50 * 1024 * 1024)) == 0 ) {
+            int64_t v = 0;
+            
+            memmove(self->cols_spotid + 0, &TableWriterAlgn_cols[ewalgn_cn_SEQ_SPOT_ID], sizeof(self->cols_spotid[0]));
+            memmove(self->cols_spotid + 1, &TableWriterAlgn_cols[ewalgn_cn_MATE_GLOBAL_REF_START], sizeof(self->cols_spotid[0]));
+            memmove(self->cols_spotid + 2, &TableWriterAlgn_cols[ewalgn_cn_MATE_REF_ID], sizeof(self->cols_spotid[0]));
+            memmove(self->cols_spotid + 3, &TableWriterAlgn_cols[ewalgn_cn_MATE_REF_START], sizeof(self->cols_spotid[0]));
+            memmove(self->cols_spotid + 4, &TableWriterAlgn_cols[ewalgn_cn_MATE_ALIGN_ID], sizeof(self->cols_spotid[0]));
+            
+            self->cols_spotid[0].flags &= ~ewcol_Ignore;
+            if (self->options & ewalgn_co_MATE_POSITION) {
+                if (self->cols[ewalgn_cn_GLOBAL_REF_START].flags & ewcol_Ignore) {
+                    self->cols_spotid[2].flags &= ~ewcol_Ignore;
+                    self->cols_spotid[3].flags &= ~ewcol_Ignore;
+                }
+                else
+                    self->cols_spotid[1].flags &= ~ewcol_Ignore;
+                self->cols_spotid[4].flags &= ~ewcol_Ignore;
+            }
+            else {
+                self->cols_spotid[1].flags |= ewcol_Ignore;
+                self->cols_spotid[2].flags |= ewcol_Ignore;
+                self->cols_spotid[3].flags |= ewcol_Ignore;
+                self->cols_spotid[4].flags |= ewcol_Ignore;
+            }
+            rc = TableWriter_AddCursor(self->base, self->cols_spotid,
+                                       sizeof(self->cols_spotid) / sizeof(self->cols_spotid[0]),
+                                       &self->spotid_cursor_id);
+
+            TW_COL_WRITE_DEF_VAR(self->base, self->spotid_cursor_id, self->cols_spotid[0], v);
+            TW_COL_WRITE_DEF_VAR(self->base, self->spotid_cursor_id, self->cols_spotid[1], v);
+            TW_COL_WRITE_DEF_VAR(self->base, self->spotid_cursor_id, self->cols_spotid[2], v);
+            TW_COL_WRITE_DEF_VAR(self->base, self->spotid_cursor_id, self->cols_spotid[3], v);
+            TW_COL_WRITE_DEF_VAR(self->base, self->spotid_cursor_id, self->cols_spotid[4], v);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterAlgn_TmpKey(const TableWriterAlgn* cself, int64_t rowid, uint64_t* key_id)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || rowid == 0 || key_id == NULL ) {
+        rc = RC( rcAlign, rcType, rcReading, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->tmpkey_reader == NULL ) {
+        rc = RC( rcAlign, rcType, rcReading, rcMode, rcNotOpen);
+        ALIGN_DBGERR(rc);
+    } else if( (rc = TableReader_ReadRow(cself->tmpkey_reader, rowid)) == 0 ) {
+        memmove(key_id, cself->cols_read_tmpkey[0].base.var, sizeof(*key_id));
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterAlgn_RefStart(const TableWriterAlgn* cself, int64_t rowid, ReferenceStart *const rslt)
+{
+    rc_t rc = 0;
+    
+    if( cself == NULL || rowid == 0 || rslt == NULL ) {
+        rc = RC( rcAlign, rcType, rcReading, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->tmpkey_reader == NULL ) {
+        rc = RC( rcAlign, rcType, rcReading, rcMode, rcNotOpen);
+        ALIGN_DBGERR(rc);
+    } else if( (rc = TableReader_ReadRow(cself->tmpkey_reader, rowid)) == 0 ) {
+        if (cself->cols_read_tmpkey[1].flags & ewcol_Ignore) {
+            memmove(&rslt->local.ref_id, cself->cols_read_tmpkey[2].base.var, sizeof(rslt->local.ref_id));
+            memmove(&rslt->local.ref_start, cself->cols_read_tmpkey[3].base.var, sizeof(rslt->local.ref_start));
+        }
+        else
+            memmove(&rslt->global_ref_start, cself->cols_read_tmpkey[1].base.var, sizeof(rslt->global_ref_start));
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterAlgn_Write_SpotId(const TableWriterAlgn* cself, int64_t rowid, int64_t spot_id)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || rowid == 0 ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->options & ewalgn_co_SEQ_SPOT_ID ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcViolated);
+        ALIGN_DBGERR(rc);
+    } else if( (rc = TableWriter_OpenRowId(cself->base, rowid, cself->spotid_cursor_id)) == 0 ) {
+        TW_COL_WRITE_VAR(cself->base, cself->cols_spotid[0], spot_id);
+        if( rc == 0 ) {
+            rc = TableWriter_CloseRow(cself->base);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterAlgn_Write_SpotInfo(const TableWriterAlgn* cself,
+                                                  int64_t rowid,
+                                                  int64_t spot_id,
+                                                  int64_t mate_id,
+                                                  ReferenceStart const *ref_start)
+{
+    rc_t rc = 0;
+    
+    if( cself == NULL || rowid == 0 ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->options & ewalgn_co_SEQ_SPOT_ID ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcViolated);
+        ALIGN_DBGERR(rc);
+    } else if( (rc = TableWriter_OpenRowId(cself->base, rowid, cself->spotid_cursor_id)) == 0 ) {
+        TW_COL_WRITE_VAR(cself->base, cself->cols_spotid[0], spot_id);
+        TW_COL_WRITE_VAR(cself->base, cself->cols_spotid[1], ref_start->global_ref_start);
+        TW_COL_WRITE_VAR(cself->base, cself->cols_spotid[2], ref_start->local.ref_id);
+        TW_COL_WRITE_VAR(cself->base, cself->cols_spotid[3], ref_start->local.ref_start);
+        TW_COL_WRITE_VAR(cself->base, cself->cols_spotid[4], mate_id);
+        
+        if( rc == 0 ) {
+            rc = TableWriter_CloseRow(cself->base);
+        }
+    }
+    return rc;
+}
diff --git a/libs/align/writer-cmn.c b/libs/align/writer-cmn.c
new file mode 100644
index 0000000..128b8a4
--- /dev/null
+++ b/libs/align/writer-cmn.c
@@ -0,0 +1,589 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <kdb/meta.h>
+#include <kapp/main.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <align/writer-cmn.h>
+#include "writer-priv.h"
+#include "debug.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#define TW_MAX_CURSORS 8
+
+struct TableWriter {
+    /* db OR mgr not both */
+    VDatabase* vdb;
+    VDBManager* vmgr;
+    char* table_path;
+    VSchema* vschema;
+    bool is_update;
+
+    VTable* vtbl;
+    char* table;
+    struct {
+        uint32_t col_qty; /* != 0 cursor is used */
+        const TableWriterColumn* cols;
+        VCursor* cursor; /* != NULL cursor is opened */
+        uint64_t rows;
+    } *curr, cursors[TW_MAX_CURSORS];
+};
+
+static
+rc_t TableWriter_Init(TableWriter** self, const char* table, const char* table_path)
+{
+    rc_t rc = 0;
+
+    if( self == NULL || table == NULL ) {
+        rc = RC(rcAlign, rcType, rcConstructing, rcParam, rcNull);
+    } else if( (*self = calloc(1, sizeof(**self))) == NULL ) {
+        rc = RC(rcAlign, rcType, rcConstructing, rcMemory, rcExhausted);
+    } else {
+        (*self)->table = string_dup( table, string_size( table ) );
+        if( (*self)->table == NULL ) {
+            rc = RC(rcAlign, rcType, rcConstructing, rcMemory, rcExhausted);
+        } else if( table_path != NULL ) {
+            (*self)->table_path = string_dup( table_path, string_size( table_path ) );
+            if( (*self)->table_path == NULL ) {
+                rc = RC(rcAlign, rcType, rcConstructing, rcMemory, rcExhausted);
+            }
+        }
+    }
+    return rc;
+}
+
+static
+rc_t TableWriter_OpenCursor(const TableWriter* cself, uint8_t cursor_id)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || cursor_id >= TW_MAX_CURSORS || cself->cursors[cursor_id].col_qty == 0 ) {
+        rc = RC(rcAlign, rcType, rcConstructing, rcParam, rcInvalid);
+    } else if( cself->cursors[cursor_id].cursor == NULL ) {
+        TableWriter* self = (TableWriter*)cself;
+
+        if( self->vtbl == NULL ) {
+            if( self->vmgr != NULL ) {
+                rc = VDBManagerCreateTable(self->vmgr, &self->vtbl, self->vschema, self->table, kcmCreate | kcmMD5, "%s", self->table_path);
+            } else if( self->is_update ) {
+                rc = VDatabaseOpenTableUpdate(self->vdb, &self->vtbl, "%s", self->table);
+            } else {
+                rc = VDatabaseCreateTable(self->vdb, &self->vtbl, self->table, kcmCreate | kcmMD5, "%s", self->table_path);
+            }
+        }
+
+        if( rc == 0 &&
+            (rc = VTableColumnCreateParams(self->vtbl, kcmCreate, kcsCRC32, 0)) == 0 &&
+            (rc = VTableCreateCursorWrite(self->vtbl, &self->cursors[cursor_id].cursor, kcmInsert)) == 0 ) {
+            uint32_t i;
+            for(i = 0; rc == 0 && i < self->cursors[cursor_id].col_qty; i++) {
+                if( !(self->cursors[cursor_id].cols[i].flags & ewcol_Ignore) ) {
+                    if( (rc = VCursorAddColumn(self->cursors[cursor_id].cursor,
+                                               (uint32_t*)&self->cursors[cursor_id].cols[i].idx,
+                                               "%s", self->cursors[cursor_id].cols[i].name)) == 0 ) {
+                        ALIGN_DBG("column %s opened", self->cursors[cursor_id].cols[i].name);
+                    } else {
+                        (void)PLOGERR(klogErr, (klogErr, rc, "table $(table) failed to create column '$(column)'",
+                                                             "table=%s,column=%s", self->table, self->cursors[cursor_id].cols[i].name));
+                    }
+                }
+            }
+            if( rc == 0 ) {
+                rc = VCursorOpen(self->cursors[cursor_id].cursor);
+            }
+        }
+        if( rc == 0 ) {
+            ALIGN_DBG("table %s opened cursor %u for writing", self->table, cursor_id);
+        } else {
+            ALIGN_DBGERRP("table %s failed to open cursor %u for writing", rc, self->table, cursor_id);
+        }
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_Make(const TableWriter** cself, VDatabase *db, const char* table, const char* table_path)
+{
+    rc_t rc = 0;
+    TableWriter* obj = NULL;
+
+    if( cself == NULL ) {
+        rc = RC(rcAlign, rcType, rcConstructing, rcParam, rcNull);
+    } else if( (rc = TableWriter_Init(&obj, table, table_path ? table_path : table)) == 0 &&
+               (rc = VDatabaseAddRef(db)) == 0 ) {
+        obj->vdb = db;
+    }
+    if( rc == 0 ) {
+        *cself = obj;
+        ALIGN_DBG("table %s opened for writing", (*cself)->table);
+    } else {
+        TableWriter_Whack(obj, false, NULL);
+        ALIGN_DBGERRP("table %s at %s", rc, table, table_path);
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_MakeMgr(const TableWriter** cself, VDBManager* mgr, const char* schema_path,
+                            const char* type, const char* table_path)
+{
+    rc_t rc = 0;
+    TableWriter* obj = NULL;
+
+    if( cself == NULL || mgr == NULL || schema_path == NULL || type == NULL || table_path == NULL) {
+        rc = RC(rcAlign, rcType, rcConstructing, rcParam, rcNull);
+    } else if( (rc = TableWriter_Init(&obj, type, table_path)) == 0 &&
+               (rc = VDBManagerMakeSchema(mgr, &obj->vschema)) == 0 &&
+               (rc = VSchemaParseFile(obj->vschema, "%s", schema_path)) == 0 &&
+               (rc = VDBManagerAddRef(mgr)) == 0 ) {
+       obj->vmgr = mgr;
+    }
+    if( rc == 0 ) {
+        *cself = obj;
+        ALIGN_DBG("table %s at %s opened for writing", (*cself)->table, (*cself)->table_path);
+    } else {
+        TableWriter_Whack(obj, false, NULL);
+        ALIGN_DBGERRP("table %s at %s", rc, type, table_path);
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_MakeUpdate(const TableWriter** cself, VDatabase *db, const char* table)
+{
+    rc_t rc = 0;
+    TableWriter* obj = NULL;
+
+    if( cself == NULL || db == NULL ) {
+        rc = RC(rcAlign, rcType, rcConstructing, rcParam, rcNull);
+    } else if( (rc = TableWriter_Init(&obj, table, NULL)) == 0 &&
+               (rc = VDatabaseAddRef(db)) == 0 ) {
+        obj->is_update = true;
+        obj->vdb = db;
+    }
+    if( rc == 0 ) {
+        *cself = obj;
+        ALIGN_DBG("table %s opened for update", (*cself)->table);
+    } else {
+        TableWriter_Whack(obj, false, NULL);
+        ALIGN_DBGERRP("table %s", rc, table);
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_GetVTable(const TableWriter* cself, VTable** vtbl)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || vtbl == NULL ) {
+        rc = RC(rcAlign, rcType, rcAccessing, rcParam, rcNull);
+    } else {
+        *vtbl = cself->vtbl;
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_Sign(const TableWriter *const cself,
+                         const char loader_name[],
+                         const ver_t loader_version,
+                         const char loader_date[],
+                         const char app_name[],
+                         const ver_t app_version)
+{
+    rc_t rc = 0;
+    KMetadata* meta = NULL;
+    KMDataNode* root = NULL;
+
+    if( cself == NULL || loader_name == NULL || loader_date == NULL || app_name == NULL || app_version == 0 ) {
+        rc = RC(rcAlign, rcMetadata, rcWriting, rcParam, rcNull);
+    } else if( (rc = VTableOpenMetadataUpdate(cself->vtbl, &meta)) == 0 &&
+               (rc = KMetadataOpenNodeUpdate(meta, &root, "/")) == 0 ) {
+        KMDataNode *node = NULL;
+        if( (rc = KMDataNodeOpenNodeUpdate(root, &node, "SOFTWARE")) == 0 ) {
+            char str_vers[64];
+            KMDataNode *subNode = NULL;
+            if( (rc = KMDataNodeOpenNodeUpdate(node, &subNode, "loader")) == 0 ) {
+                if( (rc = string_printf(str_vers, sizeof(str_vers), NULL, "%V", loader_version)) == 0 ) {
+                    rc = KMDataNodeWriteAttr(subNode, "vers", str_vers);
+                }
+                if(rc == 0) {
+                    rc = KMDataNodeWriteAttr(subNode, "date", loader_date);
+                }
+                if(rc == 0) {
+                    const char* tool_name = strrchr(loader_name, '/');
+                    const char* r = strrchr(loader_name, '\\');
+                    if( tool_name != NULL && r != NULL && tool_name < r ) {
+                        tool_name = r;
+                    }
+                    if( tool_name++ == NULL) {
+                        tool_name = loader_name;
+                    }
+                    rc = KMDataNodeWriteAttr(subNode, "name", tool_name);
+                }
+                KMDataNodeRelease(subNode);
+            }
+            if(rc == 0 && (rc = KMDataNodeOpenNodeUpdate(node, &subNode, "formatter")) == 0 ) {
+                if( (rc = string_printf(str_vers, sizeof(str_vers), NULL, "%V", app_version)) == 0 ) {
+                    rc = KMDataNodeWriteAttr(subNode, "vers", str_vers);
+                }
+                if(rc == 0) {
+                    rc = KMDataNodeWriteAttr(subNode, "name", app_name);
+                }
+                KMDataNodeRelease(subNode);
+            }
+            KMDataNodeRelease(node);
+        }
+        if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(root, &node, "LOAD")) == 0 ) {
+            KMDataNode *subNode = NULL;
+            if( (rc = KMDataNodeOpenNodeUpdate(node, &subNode, "timestamp")) == 0 ) {
+                time_t t = time(NULL);
+                rc = KMDataNodeWrite(subNode, &t, sizeof(t));
+                KMDataNodeRelease(subNode);
+            }
+            KMDataNodeRelease(node);
+        }
+    }
+    KMDataNodeRelease(root);
+    KMetadataRelease(meta);
+    return rc;
+}
+
+rc_t CC TableWriter_Whack(const TableWriter* cself, bool commit, uint64_t* rows)
+{
+    rc_t rc = 0;
+
+    if( rows != NULL ) {
+        *rows = 0;
+    }
+    if( cself != NULL ) {
+        TableWriter* self = (TableWriter*)cself;
+        uint32_t i, j;
+        
+        for(i = 0; i < TW_MAX_CURSORS; i++) {
+            if( self->cursors[i].col_qty > 0 ) {
+                self->curr = &self->cursors[i];
+                if( self->curr->cursor != NULL ) {
+                    rc_t rc1 = 0, rc2;
+                    if( commit ) {
+                        rc1 = VCursorCommit(self->curr->cursor);
+                    }
+                    rc2 = VCursorRelease(self->curr->cursor);
+                    rc = rc ? rc : (rc1 ? rc1 : rc2);
+                    self->curr->cursor = NULL;
+                }
+                if( i == 0 && rows != NULL ) {
+                    *rows = self->curr->rows;
+                }
+            }
+        }
+        for(i = 0; i < TW_MAX_CURSORS; i++) {
+            if( self->cursors[i].col_qty > 0 ) {
+                self->curr = &self->cursors[i];
+                for(j = 0; j < self->curr->col_qty; j++) {
+                    if( self->curr->cols[j].idx != 0 && (self->curr->cols[j].flags & ewcol_Temporary) ) {
+                        rc_t rc1;
+                        if( (rc1 = VTableDropColumn(self->vtbl, "%s", self->curr->cols[j].name)) != 0 ) {
+                            (void)PLOGERR(klogWarn, (klogWarn, rc1,
+                                "table $(table) failed to drop temporary column '$(column)'",
+                                "table=%s,column=%s", self->table, self->curr->cols[j].name));
+                        } else {
+                            ALIGN_DBG("table %s dropped tmp col %s", self->table, self->curr->cols[j].name);
+                        }
+                    }
+                }
+            }
+        }
+        if( commit && rc == 0 && self->vtbl != NULL ) {
+            rc = VTableReindex(self->vtbl);
+        }
+        VTableRelease(self->vtbl);
+        VSchemaRelease(self->vschema);
+        VDBManagerRelease(self->vmgr);
+        VDatabaseRelease(self->vdb);
+        if( rc == 0 ) {
+            ALIGN_DBG("table %s%s%s", self->table, self->table_path ? " at " : "", self->table_path ? self->table_path : "");
+        } else {
+            ALIGN_DBGERRP("table %s%s%s", rc, self->table, self->table_path ? " at " : "", self->table_path ? self->table_path : "");
+        }
+        free(self->table);
+        free(self->table_path);
+        free(self);
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_AddCursor(const TableWriter* cself, TableWriterColumn* cols, uint32_t col_qty, uint8_t* cursor_id)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || cols == NULL || col_qty == 0 || cursor_id == NULL ) {
+        rc = RC(rcAlign, rcType, rcOpening, rcParam, rcInvalid);
+        ALIGN_DBGERR(rc);
+    } else {
+        uint32_t i;
+        TableWriter* self = (TableWriter*)cself;
+
+        *cursor_id = TW_MAX_CURSORS;
+        for(i = 0; i < TW_MAX_CURSORS; i++) {
+            if( self->cursors[i].col_qty == 0 ) {
+                self->cursors[i].col_qty = col_qty;
+                self->cursors[i].cols = cols;
+                self->cursors[i].cursor = NULL;
+                self->cursors[i].rows = 0;
+                *cursor_id = i;
+                break;
+            }
+        }
+        if( *cursor_id >= TW_MAX_CURSORS ) {
+            rc = RC(rcAlign, rcType, rcOpening, rcConstraint, rcExhausted);
+        }
+    }
+    if( rc != 0 ) {
+        ALIGN_DBGERRP("table %s", rc, cself->table);
+    } else {
+        ALIGN_DBG("table %s added cursor %hu", cself->table, *cursor_id);
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_CloseCursor(const TableWriter* cself, uint8_t cursor_id, uint64_t* rows)
+{
+    rc_t rc = 0;
+
+    assert(cself != NULL);
+    assert(cursor_id < TW_MAX_CURSORS);
+    if (cself == NULL) abort();
+    if (cursor_id >= TW_MAX_CURSORS) abort();
+
+    if (cself->cursors[cursor_id].cursor == NULL)
+        return 0;
+    else {
+        rc_t rc2 = 0;
+        TableWriter* self = (TableWriter*)cself;
+        uint64_t r = 0;
+
+        if( rows == NULL ) {
+            rows = &r;
+        }
+        self->curr = &self->cursors[cursor_id];
+        rc = VCursorCommit(self->curr->cursor);
+        *rows = cself->curr->rows;
+        rc2 = VCursorRelease(self->curr->cursor);
+        self->curr->cursor = NULL;
+        rc = rc ? rc : rc2;
+    }
+    if( rc == 0 ) {
+        ALIGN_DBG("table %s closed cursor %hu rows %ld", cself->table, cursor_id, *rows);
+    } else {
+        ALIGN_DBGERRP("table %s cursor %hu row %ld", rc, cself->table, cursor_id, *rows);
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_Flush(const TableWriter *cself, const uint8_t cursor_id)
+{
+    rc_t rc = 0;
+    
+    if( cself == NULL || cursor_id >= TW_MAX_CURSORS || cself->cursors[cursor_id].col_qty == 0 ) {
+        rc = RC(rcAlign, rcType, rcOpening, rcParam, rcInvalid);
+        ALIGN_DBGERR(rc);
+    }
+    else if( cself->cursors[cursor_id].cursor != NULL ) {
+        rc = VCursorFlushPage(cself->cursors[cursor_id].cursor);
+        if( rc == 0 ) {
+            ALIGN_DBG("table %s cursor %hu flushed", cself->table, cursor_id);
+        } else {
+            ALIGN_DBGERRP("table %s cursor %hu flushing", rc, cself->table, cursor_id);
+        }
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_OpenRow(const TableWriter* cself, int64_t* rowid, const uint8_t cursor_id)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || cursor_id >= TW_MAX_CURSORS || cself->cursors[cursor_id].col_qty == 0 ) {
+        rc = RC(rcAlign, rcType, rcOpening, rcParam, rcInvalid);
+        ALIGN_DBGERR(rc);
+    }
+    else if( cself->cursors[cursor_id].cursor != NULL || (rc = TableWriter_OpenCursor(cself, cursor_id)) == 0 ) {
+        TableWriter* self = (TableWriter*)cself;
+
+        self->curr = &self->cursors[cursor_id];
+        if( (rc = VCursorOpenRow(self->curr->cursor)) == 0 && rowid != NULL ) {
+            rc = VCursorRowId(self->curr->cursor, rowid);
+        }
+        if( rc == 0 ) {
+            ALIGN_DBG("table %s cursor %hu opened row %ld", self->table, cursor_id, self->curr->rows + 1);
+        } else {
+            ALIGN_DBGERRP("table %s cursor %hu row %ld", rc, self->table, cursor_id, self->curr->rows + 1);
+        }
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_OpenRowId(const TableWriter* cself, const int64_t rowid, const uint8_t cursor_id)
+{
+    rc_t rc = 0;
+    
+    if( cself == NULL || cursor_id >= TW_MAX_CURSORS || cself->cursors[cursor_id].col_qty == 0 ) {
+        rc = RC(rcAlign, rcType, rcOpening, rcParam, rcInvalid);
+        ALIGN_DBGERR(rc);
+    } else if( cself->cursors[cursor_id].cursor != NULL || (rc = TableWriter_OpenCursor(cself, cursor_id)) == 0 ) {
+        TableWriter* self = (TableWriter*)cself;
+
+        self->curr = &self->cursors[cursor_id];
+        /* loop through missed rows to assign default values */
+        if( rowid > self->curr->rows + 1 ) {
+            int64_t r;
+            for(r = self->curr->rows + 1; rc == 0 && r < rowid; r++) {
+                if( (rc = VCursorOpenRow(self->curr->cursor)) == 0 &&
+                    (rc = VCursorCommitRow(self->curr->cursor)) == 0 ) {
+                    ALIGN_DBG("table %s written default row for cursor %hu row %ld", self->table, cursor_id, r);
+                    rc = VCursorCloseRow(self->curr->cursor);
+                }
+            }
+        }
+        if( rc == 0 /* && (rc = VCursorSetRowId(cself->curr->cursor, rowid)) == 0 */ ) {
+            rc = VCursorOpenRow(cself->curr->cursor);
+        }
+        if( rc == 0 ) {
+            if( rowid > self->curr->rows + 1) {
+                self->curr->rows = rowid - 1;
+            }
+            ALIGN_DBG("table %s cursor %hu opened row %ld", self->table, cursor_id, rowid);
+        } else {
+            ALIGN_DBGERRP("table %s cursor %hu row %ld", rc, self->table, cursor_id, rowid);
+        }
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_GetNextRowId(const TableWriter* cself, int64_t* rowid, const uint8_t cursor_id)
+{
+    rc_t rc = 0;
+    
+    if( cself == NULL || cursor_id >= TW_MAX_CURSORS || cself->cursors[cursor_id].col_qty == 0 ) {
+        rc = RC(rcAlign, rcType, rcOpening, rcParam, rcInvalid);
+        ALIGN_DBGERR(rc);
+    } else {
+        *rowid = cself->cursors[cursor_id].rows + 1;
+        ALIGN_DBG("table %s next rowid %li", cself->table, *rowid);
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_ColumnDefault(const TableWriter* cself, const uint8_t cursor_id,
+                                  const TableWriterColumn* column, const TableWriterData *data)
+{
+    rc_t rc = 0;
+    if( cself == NULL || cursor_id >= TW_MAX_CURSORS || cself->cursors[cursor_id].col_qty == 0 ||
+        column == NULL || data == NULL ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcNull);
+    } else if( !(column->flags & ewcol_IsArray) && data->elements != 1 ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcData, rcTooLong);
+        ALIGN_DBGERRP("column %s is not an array of values", rc, column->name);
+    } else if( cself->cursors[cursor_id].cursor != NULL || (rc = TableWriter_OpenCursor(cself, cursor_id)) == 0 ) {
+        if( column->idx != 0 ) {
+            rc = VCursorDefault(cself->cursors[cursor_id].cursor, column->idx, column->element_bits, data->buffer, 0, data->elements);
+        }
+    }
+    if( rc != 0 ) {
+        ALIGN_DBGERRP("table %s column %s default value", rc, cself->table, column->name);
+    } else {
+        ALIGN_DBG("table %s column %s default value %lu elements", cself->table, column->name, data->elements);
+    }
+    return rc;
+}
+
+rc_t CC TableWriter_ColumnWrite(const TableWriter* cself,
+    const TableWriterColumn* column, const TableWriterData *data)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || column == NULL || data == NULL ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcInvalid);
+    }
+    else if( cself->curr == NULL || cself->curr->cursor == NULL ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcMode, rcInvalid);
+    }
+    else if( !(column->flags & ewcol_IsArray) && data->elements > 1 ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcData, rcTooLong);
+        ALIGN_DBGERRP("column %s is not an array of values", rc, column->name);
+    }
+    else if (column->idx != 0) {
+        const char platform[] = "PLATFORM";
+        /* Do not try to write PLATFORM column when it is empty
+          (e.g. cg-load writes PLATFORM defult) */
+        if (data->buffer != NULL || data-> elements != 0 ||
+            string_cmp(platform, sizeof platform - 1, column->name,
+                string_measure(column->name, NULL), sizeof platform - 1) != 0)
+        {
+            rc = VCursorWrite(cself->curr->cursor, column->idx,
+                column->element_bits, data->buffer, 0, data->elements);
+        }
+    }
+
+    if( rc != 0 ) {
+        ALIGN_DBGERRP("table %s column %s row %ld", rc, cself->table, column->name, cself->curr->rows + 1);
+    }
+    else {
+        ALIGN_DBG("table %s column %s value %lu elements", cself->table, column->name, data->elements);
+    }
+
+    return rc;
+}
+
+rc_t CC TableWriter_CloseRow(const TableWriter* cself)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL ) {
+        rc = RC(rcAlign, rcType, rcClosing, rcSelf, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->curr == NULL || cself->curr->cursor == NULL ) {
+        rc = RC( rcAlign, rcType, rcClosing, rcMode, rcInvalid);
+    } else {
+        if( (rc = VCursorCommitRow(cself->curr->cursor)) == 0 ) {
+            rc = VCursorCloseRow(cself->curr->cursor);
+        }
+        if( rc == 0 ) {
+            cself->curr->rows++;
+        } else {
+            ALIGN_DBGERRP("table %s row %ld", rc, cself->table, cself->curr->rows + 1);
+        }
+        ((TableWriter*)cself)->curr = NULL;
+    }
+    return rc;
+}
diff --git a/libs/align/writer-priv.h b/libs/align/writer-priv.h
new file mode 100644
index 0000000..dab67f5
--- /dev/null
+++ b/libs/align/writer-priv.h
@@ -0,0 +1,151 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_align_writer_priv_
+#define _h_align_writer_priv_
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <kdb/meta.h>
+
+#include <align/writer-cmn.h>
+
+enum TableWriterColumn_Array {
+    ewcol_Ignore = 0x01,
+    ewcol_IsArray = 0x02,
+    ewcol_Temporary = 0x04
+};
+
+/* use ewcol_Ignore to skip optional column when cursor is created */
+typedef struct TableWriterColumn_struct {
+    uint32_t idx;
+    const char* name;
+    bitsz_t element_bits;
+    uint32_t flags;
+} TableWriterColumn;
+
+typedef struct TableWriter TableWriter;
+
+rc_t CC TableWriter_Make(const TableWriter** cself, VDatabase *db, const char* table, const char* table_path /* NULL */);
+
+rc_t CC TableWriter_MakeMgr(const TableWriter** cself, VDBManager* mgr, const char* schema_path, const char* type, const char* table_path);
+
+rc_t CC TableWriter_MakeUpdate(const TableWriter** cself, VDatabase *db, const char* table);
+
+/* add scursor based on column list */
+rc_t CC TableWriter_AddCursor(const TableWriter* cself, TableWriterColumn* cols, uint32_t col_qty, uint8_t* cursor_id);
+
+rc_t CC TableWriter_GetVTable(const TableWriter* cself, VTable** vtbl);
+
+rc_t CC TableWriter_Sign(const TableWriter *const cself,
+                         const char loader_name[],
+                         const ver_t loader_version,
+                         const char loader_date[],
+                         const char app_name[],
+                         const ver_t app_version);
+
+/* optionally return internal vtbl still open but committed */
+rc_t CC TableWriter_Whack(const TableWriter* cself, bool commit, uint64_t* rows);
+
+/* commits and closes cursor_id, returns number of rows written in cursor, optionally */
+rc_t CC TableWriter_CloseCursor(const TableWriter* cself, uint8_t cursor_id, uint64_t* rows);
+
+/* flushes any pending writes into the table */
+rc_t CC TableWriter_Flush(const TableWriter *cself, const uint8_t cursor_id);
+
+/* CANNOT OPEN ROWS IN MULTIPLE CURSORS AT ONCE
+    Use sequence:
+    OpenRow
+    ColumnWrite - 0 (better set some defaults if not writing to a column!) or more times.
+    CloseRow
+ */
+/* open a row for writing by cursor_id */
+rc_t CC TableWriter_OpenRow(const TableWriter* cself, int64_t* rowid, const uint8_t cursor_id);
+
+/* open a specific row for writing by cursor_id */
+rc_t CC TableWriter_OpenRowId(const TableWriter* cself, const int64_t rowid, const uint8_t cursor_id);
+
+/* return sequentially next rowid which will be created on OpenRow request */
+rc_t CC TableWriter_GetNextRowId(const TableWriter* cself, int64_t* rowid, const uint8_t cursor_id);
+
+/* writes cursor_id cursor default value to column
+   column pointer must use same object as passed into AddCursor
+ */
+rc_t CC TableWriter_ColumnDefault(const TableWriter* cself, const uint8_t cursor_id,
+                                  const TableWriterColumn* column, const TableWriterData *data);
+
+/* writes value to column into cursor last passed to OpenRow*
+   column pointer must use same object as passed into AddCursor
+ */
+rc_t CC TableWriter_ColumnWrite(const TableWriter* cself,
+                                const TableWriterColumn* column, const TableWriterData *data);
+
+/* closes row in cursor last used in OpenRow* */
+rc_t CC TableWriter_CloseRow(const TableWriter* cself);
+
+#define TW_COL_WRITE_DEF(writer, curs, col, data) \
+    if( rc == 0 ) { \
+        rc = TableWriter_ColumnDefault(writer, curs, &(col), &(data)); \
+    }
+
+#define TW_COL_WRITE_DEF_VAR(writer, curs, col, var) \
+    if( rc == 0 ) { \
+        TableWriterData dz; \
+        dz.buffer = &(var); \
+        dz.elements = 1; \
+        TW_COL_WRITE_DEF(writer, curs, col, dz); \
+    }
+
+#define TW_COL_WRITE_DEF_BUF(writer, curs, col, buf, elems) \
+    if( rc == 0 ) { \
+        TableWriterData dz; \
+        dz.buffer = buf; \
+        dz.elements = elems; \
+        TW_COL_WRITE_DEF(writer, curs, col, dz); \
+    }
+
+#define TW_COL_WRITE(writer, col, data) \
+    if( rc == 0 && (col).idx != 0) { \
+        rc = TableWriter_ColumnWrite(writer, &(col), &(data)); \
+    }
+
+#define TW_COL_WRITE_VAR(writer, col, var) \
+    if( rc == 0 && (col).idx != 0) { \
+        TableWriterData dz; \
+        dz.buffer = &(var); \
+        dz.elements = 1; \
+        TW_COL_WRITE(writer, col, dz); \
+    }
+
+#define TW_COL_WRITE_BUF(writer, col, buf, elems) \
+    if( rc == 0 && (col).idx != 0) { \
+        TableWriterData dz; \
+        dz.buffer = buf; \
+        dz.elements = elems; \
+        TW_COL_WRITE(writer, col, dz); \
+    }
+
+#endif /* _h_align_writer_priv_ */
diff --git a/libs/align/writer-ref.c b/libs/align/writer-ref.c
new file mode 100644
index 0000000..f3e0020
--- /dev/null
+++ b/libs/align/writer-ref.c
@@ -0,0 +1,481 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <insdc/insdc.h>
+#include <vdb/table.h>
+#include <align/writer-refseq.h>
+#include "writer-ref.h"
+#include "writer-priv.h"
+#include "debug.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+static const TableWriterColumn TableWriterRefData_cols[ewrefd_cn_Last + 1] =
+{
+    /* order is important, see enum in .h !!! */
+    {0, "MAX_SEQ_LEN", sizeof(uint32_t) * 8, 0},
+    {0, "NAME", sizeof(char) * 8, ewcol_IsArray},
+    {0, "(INSDC:dna:text)CS_KEY", sizeof(char) * 8, 0},
+    {0, "(INSDC:dna:text)CMP_READ", sizeof(char) * 8, ewcol_IsArray},
+    {0, "QUALITY", sizeof(INSDC_quality_phred) * 8, ewcol_IsArray},
+    {0, "SEQ_ID", sizeof(char) * 8, ewcol_IsArray},
+    {0, "SEQ_START", sizeof(INSDC_coord_one) * 8, 0},
+    {0, "SEQ_LEN", sizeof(INSDC_coord_len) * 8, 0},
+    {0, "CIRCULAR", sizeof(bool) * 8, 0}
+};
+
+static const TableWriterColumn TableWriterRefCoverage_cols[ewrefcv_cn_Last + 1] =
+{
+    /* order is important, see enum in .h !!! */
+    {0, "CGRAPH_HIGH", sizeof(uint8_t) * 8, 0},
+    {0, "CGRAPH_LOW", sizeof(uint8_t) * 8, 0},
+    {0, "CGRAPH_MISMATCHES", sizeof(uint32_t) * 8, 0},
+    {0, "CGRAPH_INDELS", sizeof(uint32_t) * 8, 0},
+    {0, "OVERLAP_REF_POS", sizeof(INSDC_coord_zero) * 8, ewcol_IsArray},
+    {0, "OVERLAP_REF_LEN", sizeof(INSDC_coord_len) * 8, ewcol_IsArray},
+    {0, "PRIMARY_ALIGNMENT_IDS", sizeof(int64_t) * 8, ewcol_IsArray},
+    {0, "SECONDARY_ALIGNMENT_IDS", sizeof(int64_t) * 8, ewcol_IsArray},
+    {0, "EVIDENCE_INTERVAL_IDS", sizeof(int64_t) * 8, ewcol_IsArray}
+};
+
+struct TableWriterRef {
+    uint32_t options;
+    const TableWriter* base;
+    uint8_t cursor_id;
+    TableWriterColumn cols_data[sizeof(TableWriterRefData_cols)/sizeof(TableWriterRefData_cols[0])];
+    uint8_t coverage_cursor_id;
+    TableWriterColumn cols_coverage[sizeof(TableWriterRefCoverage_cols)/sizeof(TableWriterRefCoverage_cols[0])];
+    INSDC_coord_one seq_start_last;
+    uint32_t max_seq_len;
+    char last_cs_key;
+    uint64_t last_seq_id_len;
+    char last_seq_id[2048];
+    int64_t last_coverage_row;
+};
+
+rc_t CC TableWriterRef_Make(const TableWriterRef** cself, VDatabase* db, const uint32_t options)
+{
+    rc_t rc = 0;
+    TableWriterRef* self = NULL;
+
+    if( cself == NULL ) {
+        rc = RC(rcAlign, rcFormatter, rcConstructing, rcParam, rcNull);
+    } else {
+        self = calloc(1, sizeof(*self));
+        if( self == NULL ) {
+            rc = RC(rcAlign, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+        } else {
+            memmove(self->cols_data, TableWriterRefData_cols, sizeof(TableWriterRefData_cols));
+            memmove(self->cols_coverage, TableWriterRefCoverage_cols, sizeof(TableWriterRefCoverage_cols));
+            if( !(options & ewref_co_QUALITY) ) {
+                self->cols_data[ewrefd_cn_QUALITY].flags |= ewcol_Ignore;
+            }
+            if( (rc = TableWriter_Make(&self->base, db, "REFERENCE", NULL)) == 0 &&
+                (rc = TableWriter_AddCursor(self->base, self->cols_data,
+                            sizeof(self->cols_data) / sizeof(self->cols_data[0]), &self->cursor_id)) == 0 ) {
+                self->options = options;
+            }
+            if( rc == 0 && (options & ewref_co_Coverage) ) {
+                rc = TableWriter_AddCursor(self->base, self->cols_coverage,
+                    sizeof(self->cols_coverage) / sizeof(self->cols_coverage[0]), &self->coverage_cursor_id);
+            }
+        }
+    }
+    if( rc == 0 ) {
+        *cself = self;
+        ALIGN_DBG("table %s", "created");
+    } else {
+        TableWriterRef_Whack(self, false, NULL);
+        ALIGN_DBGERR(rc);
+    }
+    return rc;
+}
+
+static
+rc_t TableWriterRef_DefaultCoverage(const TableWriterRef* cself, int64_t rowid)
+{
+    rc_t rc = 0;
+    int64_t i;
+    ReferenceSeqCoverage c;
+
+    memset(&c, 0, sizeof(c));
+    for(i = cself->last_coverage_row + 1; rc == 0 && i < rowid; i++) {
+        rc = TableWriterRef_WriteCoverage(cself, i, 0, &c);
+    }
+    return rc;
+}
+
+rc_t CC TableWriterRef_Whack(const TableWriterRef* cself, bool commit, uint64_t* rows)
+{
+    rc_t rc = 0;
+    if( cself != NULL ) {
+        TableWriterRef* self = (TableWriterRef*)cself;
+
+        if( commit && (cself->options & ewref_co_Coverage) ) {
+            int64_t next_row;
+            if( (rc = TableWriter_GetNextRowId(cself->base, &next_row, 0)) == 0 ) {
+                if( (next_row - 1) > cself->last_coverage_row ) {
+                    ALIGN_DBG("adding default coverage to tail of table (%li,%li]", cself->last_coverage_row, next_row);
+                    rc = TableWriterRef_DefaultCoverage(cself, next_row);
+                }
+            }
+        }
+        if( rc == 0 ) {
+            rc = TableWriter_Whack(cself->base, commit, rows);
+        }
+        free(self);
+    }
+    return rc;
+}
+
+static
+rc_t TableWriterRef_WriteDefaults(const TableWriterRef* cself)
+{
+    rc_t rc = 0;
+    if( cself != NULL ) {
+        TableWriterRef* self = (TableWriterRef*)cself;
+        self->max_seq_len = TableWriterRefSeq_MAX_SEQ_LEN;
+        self->seq_start_last = 1;
+        self->last_cs_key = 'T';
+        self->last_seq_id_len = 0;
+        TW_COL_WRITE_DEF_VAR(self->base, cself->cursor_id, self->cols_data[ewrefd_cn_MAX_SEQ_LEN], self->max_seq_len);
+        if( rc == 0 && (cself->options & ewref_co_Coverage) ) {
+            ReferenceSeqCoverage c;
+
+            memset(&c, 0, sizeof(c));
+            TW_COL_WRITE_DEF_VAR(self->base, self->coverage_cursor_id, self->cols_coverage[ewrefcv_cn_CGRAPH_HIGH], c.low);
+            TW_COL_WRITE_DEF_VAR(self->base, self->coverage_cursor_id, self->cols_coverage[ewrefcv_cn_CGRAPH_LOW], c.high);
+            TW_COL_WRITE_DEF_VAR(self->base, self->coverage_cursor_id, self->cols_coverage[ewrefcv_cn_CGRAPH_MISMATCHES], c.mismatches);
+            TW_COL_WRITE_DEF_VAR(self->base, self->coverage_cursor_id, self->cols_coverage[ewrefcv_cn_CGRAPH_INDELS], c.indels);
+            TW_COL_WRITE_DEF_BUF(self->base, self->coverage_cursor_id, self->cols_coverage[ewrefcv_cn_OVERLAP_REF_POS],
+                    c.overlap_ref_pos, sizeof(c.overlap_ref_pos) / sizeof(c.overlap_ref_pos[0]));
+            TW_COL_WRITE_DEF_BUF(self->base, self->coverage_cursor_id, self->cols_coverage[ewrefcv_cn_OVERLAP_REF_LEN],
+                    c.overlap_ref_len, sizeof(c.overlap_ref_len) / sizeof(c.overlap_ref_len[0]));
+            TW_COL_WRITE_DEF(self->base, self->coverage_cursor_id, self->cols_coverage[ewrefcv_cn_PRIMARY_ALIGNMENT_IDS], c.ids[ewrefcov_primary_table]);
+            TW_COL_WRITE_DEF(self->base, self->coverage_cursor_id, self->cols_coverage[ewrefcv_cn_SECONDARY_ALIGNMENT_IDS], c.ids[ewrefcov_secondary_table]);
+            TW_COL_WRITE_DEF(self->base, self->coverage_cursor_id, self->cols_coverage[ewrefcv_cn_EVIDENCE_INTERVAL_IDS], c.ids[ewrefcov_evidence_table]);
+        }
+    }
+    return rc;
+}
+
+rc_t CC TableWriterRef_WriteDefaultData(const TableWriterRef* cself, enum ETableWriterRefData_ColNames col,
+                                        const TableWriterData* data)
+{
+    rc_t rc = 0;
+    if( cself == NULL || data == NULL ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->last_cs_key == '\0' && (rc = TableWriterRef_WriteDefaults(cself)) != 0 ) {
+        ALIGN_DBGERR(rc);
+    } else {
+        TW_COL_WRITE_DEF(cself->base, cself->cursor_id, cself->cols_data[col], (*data));
+        if( col == ewrefd_cn_MAX_SEQ_LEN ) {
+            ((TableWriterRef*)cself)->max_seq_len = *((uint32_t*)data->buffer);
+        }
+    }
+    return rc;
+}
+
+rc_t CC TableWriterRef_WriteDefaultCovarage(const TableWriterRef* cself, enum ETableWriterRefCoverage_ColNames col,
+                                            const TableWriterData* data)
+{
+    rc_t rc = 0;
+    if( cself == NULL || data == NULL ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->last_cs_key == '\0' && (rc = TableWriterRef_WriteDefaults(cself)) != 0 ) {
+        ALIGN_DBGERR(rc);
+    } else {
+        TW_COL_WRITE_DEF(cself->base, cself->coverage_cursor_id, cself->cols_coverage[col], (*data));
+    }
+    return rc;
+}
+
+rc_t CC TableWriterRef_Write(const TableWriterRef* cself, const TableWriterRefData* data, int64_t* rowid)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || data == NULL ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->last_cs_key == '\0' && (rc = TableWriterRef_WriteDefaults(cself)) != 0 ) {
+        ALIGN_DBGERR(rc);
+    } else if( data->read.elements > cself->max_seq_len ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, rcInvalid);
+        ALIGN_DBGERRP("%s is longer than %s", rc, cself->cols_data[ewrefd_cn_READ].name, cself->cols_data[ewrefd_cn_MAX_SEQ_LEN].name);
+    } else if( data->seq_id.elements > sizeof(cself->last_seq_id) ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcBuffer, rcInsufficient);
+        ALIGN_DBGERRP("%s is longer than %s", rc, cself->cols_data[ewrefd_cn_READ].name, cself->cols_data[ewrefd_cn_MAX_SEQ_LEN].name);
+    } else if( (rc = TableWriter_OpenRow(cself->base, rowid, cself->cursor_id)) == 0 ) {
+        const INSDC_dna_text* b = data->read.buffer;
+        INSDC_coord_len const len = data->read.elements;
+        bool write_read = data->seq_id.elements < 1 || data->force_READ_write;
+        INSDC_coord_len trim_len = len;
+        
+        if( cself->last_seq_id_len != data->seq_id.elements ||
+            strncmp(cself->last_seq_id, data->seq_id.buffer, cself->last_seq_id_len) != 0 ) {
+            /* new seq_id: reset counters and mem it */
+            TableWriterRef* self = (TableWriterRef*)cself;
+            self->last_seq_id_len = data->seq_id.elements;
+            memmove(self->last_seq_id, data->seq_id.buffer, cself->last_seq_id_len);
+            self->seq_start_last = 1;
+            self->last_cs_key = 'T';
+        }
+        /* trunc trailing N */
+        b += len - 1;
+        while( trim_len > 0 && (*b == 'N' || *b == 'n' || *b == '.') ) {
+            trim_len--; b--;
+        }
+        TW_COL_WRITE(cself->base, cself->cols_data[ewrefd_cn_NAME], data->name);
+        TW_COL_WRITE_BUF(cself->base, cself->cols_data[ewrefd_cn_READ], data->read.buffer, (write_read ? trim_len : 0));
+        TW_COL_WRITE(cself->base, cself->cols_data[ewrefd_cn_QUALITY], data->quality);
+        TW_COL_WRITE(cself->base, cself->cols_data[ewrefd_cn_SEQ_ID], data->seq_id);
+        if( trim_len == 0 ) {
+            TW_COL_WRITE_VAR(cself->base, cself->cols_data[ewrefd_cn_SEQ_START], trim_len);
+        } else {
+            TW_COL_WRITE_VAR(cself->base, cself->cols_data[ewrefd_cn_SEQ_START], cself->seq_start_last);
+        }
+        TW_COL_WRITE_VAR(cself->base, cself->cols_data[ewrefd_cn_SEQ_LEN], len);
+        TW_COL_WRITE_VAR(cself->base, cself->cols_data[ewrefd_cn_CS_KEY], cself->last_cs_key);
+        TW_COL_WRITE_VAR(cself->base, cself->cols_data[ewrefd_cn_CIRCULAR], data->circular);
+        if( rc == 0 && (rc = TableWriter_CloseRow(cself->base)) == 0 ) {
+            TableWriterRef* self = (TableWriterRef*)cself;
+            
+            self->last_cs_key = ((const char*)(data->read.buffer))[data->read.elements - 1];
+            switch (self->last_cs_key) {
+            case 'A':
+            case 'C':
+            case 'G':
+            case 'T':
+                break;
+            default:
+                self->last_cs_key = 'T';
+                break;
+            }
+            self->seq_start_last += data->read.elements;
+        }
+    }
+    return rc;
+}
+
+rc_t CC TableWriterRef_WriteCoverage(const TableWriterRef* cself, int64_t rowid, INSDC_coord_zero offset, const ReferenceSeqCoverage* coverage)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || coverage == NULL ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->last_cs_key == '\0' && (rc = TableWriterRef_WriteDefaults(cself)) != 0 ) {
+        ALIGN_DBGERR(rc);
+    } else if( !(cself->options & ewref_co_Coverage) ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, rcUnexpected);
+        ALIGN_DBGERRP("coverage %s", rc, "data");
+    } else if( offset > cself->seq_start_last ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, rcInvalid);
+        ALIGN_DBGERRP("%i is beyond last written chunk", rc, offset);
+    } else {
+        if( (rowid + offset / cself->max_seq_len) - cself->last_coverage_row > 1 ) {
+            /* fill in gap in coverage rows with default values */
+            ALIGN_DBG("gap in coverage rows (%li,%li) -> use defaults", cself->last_coverage_row, rowid + offset / cself->max_seq_len);
+            rc = TableWriterRef_DefaultCoverage(cself, rowid + offset / cself->max_seq_len);
+        }
+        if( rc == 0 && (rc = TableWriter_OpenRowId(cself->base, rowid + offset / cself->max_seq_len, cself->coverage_cursor_id)) == 0 ) {
+            TW_COL_WRITE_VAR(cself->base, cself->cols_coverage[ewrefcv_cn_CGRAPH_HIGH], coverage->high);
+            TW_COL_WRITE_VAR(cself->base, cself->cols_coverage[ewrefcv_cn_CGRAPH_LOW], coverage->low);
+            TW_COL_WRITE_VAR(cself->base, cself->cols_coverage[ewrefcv_cn_CGRAPH_MISMATCHES], coverage->mismatches);
+            TW_COL_WRITE_VAR(cself->base, cself->cols_coverage[ewrefcv_cn_CGRAPH_INDELS], coverage->indels);
+            TW_COL_WRITE_BUF(cself->base, cself->cols_coverage[ewrefcv_cn_OVERLAP_REF_POS],
+                    coverage->overlap_ref_pos, sizeof(coverage->overlap_ref_pos) / sizeof(coverage->overlap_ref_pos[0]));
+            TW_COL_WRITE_BUF(cself->base, cself->cols_coverage[ewrefcv_cn_OVERLAP_REF_LEN],
+                    coverage->overlap_ref_len, sizeof(coverage->overlap_ref_len) / sizeof(coverage->overlap_ref_len[0]));
+            TW_COL_WRITE(cself->base, cself->cols_coverage[ewrefcv_cn_PRIMARY_ALIGNMENT_IDS], coverage->ids[ewrefcov_primary_table]);
+            TW_COL_WRITE(cself->base, cself->cols_coverage[ewrefcv_cn_SECONDARY_ALIGNMENT_IDS], coverage->ids[ewrefcov_secondary_table]);
+            TW_COL_WRITE(cself->base, cself->cols_coverage[ewrefcv_cn_EVIDENCE_INTERVAL_IDS], coverage->ids[ewrefcov_evidence_table]);
+            if( rc == 0 ) {
+                TableWriterRef* self = (TableWriterRef*)cself;
+                self->last_coverage_row = rowid + offset / cself->max_seq_len;
+                rc = TableWriter_CloseRow(cself->base);
+            }
+        }
+    }
+    return rc;
+}
+
+struct TableWriterRefCoverage {
+    const TableWriter* base;
+    bool init; /* default written indicator */
+    uint8_t cursor_id;
+    TableWriterColumn cols[ewrefcv_cn_ReCover + 1];
+};
+
+rc_t CC TableWriterRefCoverage_MakeCoverage(const TableWriterRefCoverage** cself, VDatabase* db, const uint32_t options)
+{
+    rc_t rc = 0;
+    TableWriterRefCoverage* self = NULL;
+
+    if( cself == NULL ) {
+        rc = RC(rcAlign, rcFormatter, rcConstructing, rcParam, rcNull);
+    } else {
+        self = calloc(1, sizeof(*self));
+        if( self == NULL ) {
+            rc = RC(rcAlign, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+        } else {
+            memmove(self->cols, TableWriterRefCoverage_cols, sizeof(self->cols));
+            if( (rc = TableWriter_MakeUpdate(&self->base, db, "REFERENCE")) == 0 ) {
+                rc = TableWriter_AddCursor(self->base, self->cols,
+                        sizeof(self->cols) / sizeof(self->cols[0]), &self->cursor_id);
+            }
+        }
+    }
+    if( rc == 0 ) {
+        *cself = self;
+        ALIGN_R_DBG("table %s", "opened");
+    } else {
+        TableWriterRefCoverage_Whack(self, false, NULL);
+        ALIGN_DBGERR(rc);
+    }
+    return rc;
+}
+rc_t CC TableWriterRefCoverage_MakeIds(const TableWriterRefCoverage** cself, VDatabase* db, const char  * col_name)
+{
+    rc_t rc = 0;
+    TableWriterRefCoverage* self = NULL;
+
+    if( cself == NULL ) {
+        rc = RC(rcAlign, rcFormatter, rcConstructing, rcParam, rcNull);
+    } else {
+        self = calloc(1, sizeof(*self));
+        if( self == NULL ) {
+            rc = RC(rcAlign, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+        } else {
+            if( (rc = TableWriter_MakeUpdate(&self->base, db, "REFERENCE")) == 0 ) {
+                self->cols[0].idx = 0;
+                self->cols[0].name = col_name;
+                self->cols[0].element_bits = 8 * sizeof(int64_t);
+                self->cols[0].flags=ewcol_IsArray;
+                rc = TableWriter_AddCursor(self->base, self->cols,1, &self->cursor_id);
+            }
+        }
+    }
+    if( rc == 0 ) {
+        *cself = self;
+        ALIGN_R_DBG("table %s", "opened");
+    } else {
+        TableWriterRefCoverage_Whack(self, false, NULL);
+        ALIGN_DBGERR(rc);
+    }
+    return rc;
+}
+
+
+rc_t CC TableWriterRefCoverage_Whack(const TableWriterRefCoverage* cself, bool commit, uint64_t* rows)
+{
+    rc_t rc = 0;
+    if( cself != NULL ) {
+        TableWriterRefCoverage* self = (TableWriterRefCoverage*)cself;
+        rc = TableWriter_Whack(cself->base, commit, rows);
+        free(self);
+    }
+    return rc;
+}
+
+
+rc_t CC TableWriterRefCoverage_WriteCoverage(const TableWriterRefCoverage* cself, int64_t rowid, const ReferenceSeqCoverage* coverage)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || coverage == NULL ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    }
+    else {
+        if( !cself->init ) {
+            /* set the defaults */
+            ReferenceSeqCoverage c;
+            
+            memset(&c, 0, sizeof(c));
+            TW_COL_WRITE_DEF_VAR(cself->base, cself->cursor_id, cself->cols[ewrefcv_cn_CGRAPH_HIGH], c.low);
+            TW_COL_WRITE_DEF_VAR(cself->base, cself->cursor_id, cself->cols[ewrefcv_cn_CGRAPH_LOW], c.high);
+            TW_COL_WRITE_DEF_VAR(cself->base, cself->cursor_id, cself->cols[ewrefcv_cn_CGRAPH_MISMATCHES], c.mismatches);
+            TW_COL_WRITE_DEF_VAR(cself->base, cself->cursor_id, cself->cols[ewrefcv_cn_CGRAPH_INDELS], c.indels);
+            TW_COL_WRITE_DEF_BUF(cself->base, cself->cursor_id, cself->cols[ewrefcv_cn_OVERLAP_REF_POS],
+                                 c.overlap_ref_pos, sizeof(c.overlap_ref_pos) / sizeof(c.overlap_ref_pos[0]));
+            TW_COL_WRITE_DEF_BUF(cself->base, cself->cursor_id, cself->cols[ewrefcv_cn_OVERLAP_REF_LEN],
+                                 c.overlap_ref_len, sizeof(c.overlap_ref_len) / sizeof(c.overlap_ref_len[0]));
+            
+            ((TableWriterRefCoverage*)cself)->init = true;
+        }
+        if( rc == 0 && (rc = TableWriter_OpenRowId(cself->base, rowid, cself->cursor_id)) == 0 ) {
+            TW_COL_WRITE_VAR(cself->base, cself->cols[ewrefcv_cn_CGRAPH_HIGH], coverage->high);
+            TW_COL_WRITE_VAR(cself->base, cself->cols[ewrefcv_cn_CGRAPH_LOW], coverage->low);
+            TW_COL_WRITE_VAR(cself->base, cself->cols[ewrefcv_cn_CGRAPH_MISMATCHES], coverage->mismatches);
+            TW_COL_WRITE_VAR(cself->base, cself->cols[ewrefcv_cn_CGRAPH_INDELS], coverage->indels);
+            TW_COL_WRITE_BUF(cself->base, cself->cols[ewrefcv_cn_OVERLAP_REF_POS],
+                             coverage->overlap_ref_pos, sizeof(coverage->overlap_ref_pos) / sizeof(coverage->overlap_ref_pos[0]));
+            TW_COL_WRITE_BUF(cself->base, cself->cols[ewrefcv_cn_OVERLAP_REF_LEN],
+                             coverage->overlap_ref_len, sizeof(coverage->overlap_ref_len) / sizeof(coverage->overlap_ref_len[0]));
+            
+            if( rc == 0 ) {
+                rc = TableWriter_CloseRow(cself->base);
+            }
+        }
+    }
+    return rc;
+}
+rc_t CC TableWriterRefCoverage_WriteIds(const TableWriterRefCoverage* cself, int64_t rowid, const int64_t* buf,uint32_t num)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || (buf  == NULL && num > 0)) {
+        rc = RC(rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    }
+    else {
+        if( !cself->init ) {
+            /* set the defaults */
+            TW_COL_WRITE_DEF_BUF(cself->base, cself->cursor_id, cself->cols[0],NULL,0);
+            ((TableWriterRefCoverage*)cself)->init = true;
+        }
+        if( rc == 0 && (rc = TableWriter_OpenRowId(cself->base, rowid, cself->cursor_id)) == 0 ) {
+            TW_COL_WRITE_BUF(cself->base, cself->cols[0],buf,num);
+            if( rc == 0 ) {
+                rc = TableWriter_CloseRow(cself->base);
+            }
+        }
+    }
+    return rc;
+}
+
diff --git a/libs/align/writer-ref.h b/libs/align/writer-ref.h
new file mode 100644
index 0000000..e059a0b
--- /dev/null
+++ b/libs/align/writer-ref.h
@@ -0,0 +1,106 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_align_writer_ref_
+#define _h_align_writer_ref_
+
+#include <vdb/database.h>
+#include <align/writer-alignment.h>
+#include <align/writer-reference.h>
+
+enum ETableWriterRefData_ColNames {
+    ewrefd_cn_MAX_SEQ_LEN, /* static/default value from refseq writer */
+    ewrefd_cn_NAME,
+    ewrefd_cn_CS_KEY, /* handled by writer */
+    ewrefd_cn_READ,
+    ewrefd_cn_QUALITY,
+    ewrefd_cn_SEQ_ID,
+    ewrefd_cn_SEQ_START, /* calculated on fly by writer */
+    ewrefd_cn_SEQ_LEN, /* calculated on fly by writer */
+    ewrefd_cn_CIRCULAR, 
+    ewrefd_cn_Last = ewrefd_cn_CIRCULAR
+};
+
+enum ETableWriterRefCoverage_ColNames {
+    /* coverage data starts here */
+    ewrefcv_cn_CGRAPH_HIGH=0,
+    ewrefcv_cn_CGRAPH_LOW,
+    ewrefcv_cn_CGRAPH_MISMATCHES,
+    ewrefcv_cn_CGRAPH_INDELS,
+    ewrefcv_cn_OVERLAP_REF_POS,
+    ewrefcv_cn_OVERLAP_REF_LEN,
+    ewrefcv_cn_ReCover = ewrefcv_cn_OVERLAP_REF_LEN,
+    ewrefcv_cn_PRIMARY_ALIGNMENT_IDS,
+    ewrefcv_cn_SECONDARY_ALIGNMENT_IDS,
+    ewrefcv_cn_EVIDENCE_INTERVAL_IDS,
+    ewrefcv_cn_Last = ewrefcv_cn_EVIDENCE_INTERVAL_IDS
+};
+
+enum ETableWriterRef_ColOptions {
+    ewref_co_SaveRead = 0x01, /* always write READ */
+    ewref_co_QUALITY = 0x02,  /* use QUALITY column, by default not opened */
+    ewref_co_Coverage = 0x04  /* use coverage columns, by default not opened */
+};
+
+typedef struct TableWriterRefData_struct {
+    TableWriterData name;
+    bool force_READ_write;
+    TableWriterData read;
+    TableWriterData quality;
+    TableWriterData seq_id;
+    bool circular;
+} TableWriterRefData;
+
+typedef struct TableWriterRef TableWriterRef;
+
+rc_t CC TableWriterRef_Make(const TableWriterRef** cself, VDatabase* db, const uint32_t options);
+
+/* rows optional here */
+rc_t CC TableWriterRef_Whack(const TableWriterRef* cself, bool commit, uint64_t* rows);
+
+rc_t CC TableWriterRef_WriteDefaultData(const TableWriterRef* cself, enum ETableWriterRefData_ColNames col,
+                                        const TableWriterData* data);
+
+rc_t CC TableWriterRef_WriteDefaultCovarage(const TableWriterRef* cself, enum ETableWriterRefCoverage_ColNames col,
+                                            const TableWriterData* data);
+
+/* rowid optional here */
+rc_t CC TableWriterRef_Write(const TableWriterRef* cself, const TableWriterRefData* data, int64_t* rowid);
+
+rc_t CC TableWriterRef_WriteCoverage(const TableWriterRef* cself, int64_t rowid, INSDC_coord_zero offset, const ReferenceSeqCoverage* coverage);
+
+
+
+
+typedef struct TableWriterRefCoverage TableWriterRefCoverage;
+
+rc_t CC TableWriterRefCoverage_MakeCoverage(const TableWriterRefCoverage** cself, VDatabase* db, const uint32_t options);
+rc_t CC TableWriterRefCoverage_MakeIds(const TableWriterRefCoverage** cself, VDatabase* db, const char *col_name);
+/* rows optional here */
+rc_t CC TableWriterRefCoverage_Whack(const TableWriterRefCoverage* cself, bool commit, uint64_t* rows);
+rc_t CC TableWriterRefCoverage_WriteCoverage(const TableWriterRefCoverage* cself, int64_t rowid, const ReferenceSeqCoverage* coverage);
+rc_t CC TableWriterRefCoverage_WriteIds(const TableWriterRefCoverage* cself, int64_t rowid, const int64_t* buf,uint32_t num);
+
+#endif /* _h_align_writer_ref_ */
diff --git a/libs/align/writer-reference.c b/libs/align/writer-reference.c
new file mode 100644
index 0000000..0d44dfc
--- /dev/null
+++ b/libs/align/writer-reference.c
@@ -0,0 +1,3186 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+#include <align/extern.h>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/sort.h>
+#include <klib/data-buffer.h>
+#include <klib/container.h>
+#include <klib/checksum.h>
+#include <klib/text.h>
+#include <kfs/mmap.h>
+#include <kfs/file.h>
+#include <kdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+#include <sra/sradb.h>
+
+#include <align/writer-reference.h>
+#include <align/writer-refseq.h>
+#include <align/refseq-mgr.h>
+#include <align/align.h>
+#include "refseq-mgr-priv.h"
+#include "writer-ref.h"
+#include "reader-cmn.h"
+#include "reference-cmn.h"
+#include "debug.h"
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+/*
+ * ReferenceSeq objects:
+ *  ReferenceSeq objects may be unattached, i.e. they might not yet represent an
+ *  actual sequence.
+ *
+ *  ReferenceSeq objects may be attached, i.e. they represent a sequence from
+ *  either RefSeq or a fasta file.
+ *
+ *  A ReferenceSeq object may be refered to by more than one id, but a
+ *  ReferenceSeq object has only one canonical id.
+ *
+ *  More than one ReferenceSeq object may be associated with the same seqId.
+ *
+ *  More than one ReferenceSeq object may be attached to the same sequence.
+ *  This will cause the REFERENCE table to have more than one copy of the
+ *  sequence.
+ *
+ *  ReferenceSeq objects may be created from the config file.  These objects
+ *  will have an id, a seqId, but no fastaSeqId.  These are unattached.
+ *
+ *  ReferenceSeq objects may be created from explicit fasta files.  These
+ *  objects will have a fastaSeqId, but *** NO id OR seqId ***. These are
+ *  attached.
+ *
+ *  ReferenceSeq objects may be created on the fly by requesting an id that
+ *  isn't already in the collection.  These objects will have the requested id.
+ *
+ * When a reference is requested (by id):
+ *  Resolve the id to a ReferenceSeq object.
+ *  If the object is unattached, attach it to a sequence.
+ *  If the sequence is not yet written to the REFERENCE table, write it to the
+ *  REFERENCE table.  NAME gets id; SEQID gets seqId unless seqId is null, then
+ *  SEQID gets id.
+ *
+ * Resolving id's to ReferenceSeq objects:
+ *  Search the id index and if the found object is attached, return it.
+ *  Search the identifiers in the fastaSeqIds or seqIds.
+ *  If different objects were found from both searches, use sequence length and
+ *  MD5 to break the tie (if both match then use RefSeq).  If no sequence length
+ *  or MD5 then fail.
+ *  If no objects were found from either search, then create a new unattached
+ *  ReferenceSeq object.
+ *  If the object's id is null, set it to the id.
+ *  It the object was not found in the id index, add it.
+ *
+ * Attaching ReferenceSeq objects to sequences:
+ *  Search RefSeq for seqId.
+ *  Else search RefSeq for id.
+ *  Else search for seqId in the loaded fasta files.
+ *  Else search data directory for id.fasta or id.fa; load it or fail.
+ *  Else search data directory for seqId.fasta or seqId.fa; load it or fail.
+ *  Else fail.
+ *  If failed, mark the object as dead.
+ *
+ *
+ *
+ * Config file:
+ *  The config file consists of lines containing whitespace (preferably tab)
+ *  seperated fields.  The fields are:
+ *      NAME (unique)
+ *      SEQID
+ *      extra (optional)
+ *
+ *  There is one ReferenceSeq object created per record in the config file.
+ *  NAME is stored in id; SEQID is stored in seqId; if extra contains the word
+ *  'circular' (case-insensitive), true is stored in circular.  These
+ *  ReferenceSeq object are created in the unattached state, i.e. not attached
+ *  to a fasta file or a RefSeq library object.
+ *
+ *  If SEQID is equal to UNMAPPED_SEQID_VALUE (see below) the Reference will be
+ *  considered to be unmapped.
+ *
+ * Fasta files:
+ *  Fasta file consists of one of more sequences.  A sequence in a fasta file
+ *  consists of a seqid line followed by lines containing the bases of the
+ *  sequence.  A seqid line starts with '>' and the next word (whitespace
+ *  delimited) is the seqid.  The seqid may consist of '|' delimited identifiers
+ *  (this is purposely vague).  The fasta seqid is stored in fastaSeqId.
+ *
+ * Fasta files may be loaded explicitly:
+ *  When a fasta file is loaded explicitly, a new ReferenceSeq object is created
+ *  (with id == NULL) for each sequence found in the file.
+ *
+ * Fasta files may be loaded implicitly:
+ *  When an id can't be found in the set of ReferenceSeq objects and can't be
+ *  found as an accession by RefSeq, an attempt is made to load a fasta file
+ *  named <id>.fasta or <id>.fa in the directory given to the constructor.  If
+ *  this succeeds, a new ReferenceSeq object with the given id is attached to
+ *  the sequence.  In this situation, to avoid ambiquity, there can be only one
+ *  sequence in the fasta file.
+ *
+ */
+
+#define UNMAPPED_SEQID_VALUE "*UNMAPPED"
+
+enum ReferenceSeqType {
+    rst_unattached,
+    rst_local,
+    rst_refSeqById,
+    rst_refSeqBySeqId,
+    rst_unmapped,
+    rst_renamed,
+    rst_dead
+};
+
+struct ReferenceSeq {
+    ReferenceMgr *mgr;
+    char *id;
+    char *seqId;
+    char *fastaSeqId;
+
+    char **used;
+    unsigned num_used;
+    
+    /* ref table position */
+    int64_t start_rowid;
+    /* total reference length */
+    INSDC_coord_len seq_len;
+    int type;
+    bool circular;
+    uint8_t md5[16];
+    union {
+        struct {
+            KDataBuffer buf;
+            uint8_t const *data;
+        } local;
+        RefSeq const *refseq;
+    } u;
+};
+
+#define BUCKET_BITS (12U)
+#define BUCKETS (1U << BUCKET_BITS)
+#define BUCKET_MASK (BUCKETS - 1U)
+
+typedef struct {
+    unsigned count;
+    unsigned *index;
+} Bucket;
+
+typedef struct {
+    int length, type;
+} compress_buffer_t;
+
+struct ReferenceMgr {
+    TableWriterRef const *writer;
+    KDirectory const *dir;
+    RefSeqMgr const *rmgr;
+    VDatabase *db;
+    ReferenceSeq *refSeq;       /* == refSeqs.base      */
+    
+    int64_t ref_rowid;
+    
+    size_t cache;
+    
+    uint32_t options;
+    uint32_t num_open_max;
+    uint32_t num_open;
+    uint32_t max_seq_len;
+    
+    KDataBuffer compress;       /* [compress_buffer_t]  */
+    KDataBuffer seq;            /* [byte](max_seq_len)  */
+    KDataBuffer refSeqs;        /* [ReferenceSeq]       */
+
+    Bucket used[BUCKETS];
+    Bucket ht[BUCKETS];
+};
+
+static unsigned hash(unsigned const length, char const key[])
+{
+    /* FNV-1a hash with folding */
+    uint64_t h = 0xcbf29ce484222325ull;
+    unsigned i;
+    
+    for (i = 0; i < length; ++i) {
+        int const ch = key[i];
+        uint64_t const octet = (uint8_t)toupper(ch);
+
+        h = (h ^ octet) * 0x100000001b3ull;
+    }
+    return (unsigned)(((h ^ (h >> 32))) & ((uint64_t)BUCKET_MASK));
+}
+
+static unsigned hash0(char const key[])
+{
+    /* FNV-1a hash with folding */
+    uint64_t h = 0xcbf29ce484222325ull;
+    unsigned i;
+    
+    for (i = 0; ; ++i) {
+        int const ch = key[i];
+        if (ch != '\0') {
+            uint64_t const octet = (uint8_t)toupper(ch);
+            h = (h ^ octet) * 0x100000001b3ull;
+            continue;
+        }
+        break;
+    }
+    return (unsigned)(((h ^ (h >> 32))) & ((uint64_t)BUCKET_MASK));
+}
+
+static void addToHashBucket(Bucket *const bucket, unsigned const index)
+{
+    unsigned i;
+    void *tmp = NULL;
+    
+    for (i = 0; i < bucket->count; ++i) {
+        if (bucket->index[i] == index)
+            return;
+    }
+    
+    tmp = realloc(bucket->index, (1 + bucket->count) * sizeof(bucket->index[0]));
+    assert(tmp != NULL);
+	if (tmp == NULL)
+        abort();
+
+    bucket->index = tmp;
+    bucket->index[bucket->count++] = index;
+}
+
+static void addToHashTable(ReferenceMgr *const self, ReferenceSeq const *const rs)
+{
+    unsigned const index = rs - self->refSeq;
+    
+    if (rs->id)
+        addToHashBucket(&self->ht[hash0(rs->id)], index);
+    if (rs->seqId)
+        addToHashBucket(&self->ht[hash0(rs->seqId)], index);
+}
+
+static
+void CC ReferenceSeq_Whack(ReferenceSeq *self)
+{
+    unsigned i;
+    
+    for (i = 0; i < self->num_used; ++i)
+        free(self->used[i]);
+
+    if (self->type == rst_local) {
+        KDataBufferWhack(&self->u.local.buf);
+    }
+    else if (self->type == rst_refSeqById || self->type == rst_refSeqBySeqId) {
+        RefSeq_Release(self->u.refseq);
+    }
+    free(self->id);
+    free(self->seqId);
+    free(self->fastaSeqId);
+    free(self->used);
+}
+
+struct OpenConfigFile_ctx {
+    char const *name;
+    KDirectory const *dir;
+    KFile const **kfp;
+    rc_t rc;
+};
+
+static
+bool OpenConfigFile(char const server[], char const volume[], void *Ctx)
+{
+    struct OpenConfigFile_ctx *ctx = Ctx;
+    KDirectory const *dir;
+    
+    if(volume == NULL) {
+        ctx->rc = KDirectoryOpenDirRead(ctx->dir, &dir, false, "%s", server);
+    } else {
+        ctx->rc = KDirectoryOpenDirRead(ctx->dir, &dir, false, "%s/%s", server, volume);
+    }
+    if (ctx->rc == 0) {
+        ctx->rc = KDirectoryOpenFileRead(dir, ctx->kfp, "%s", ctx->name);
+        KDirectoryRelease(dir);
+        if (ctx->rc == 0) {
+            return true;
+        }
+    }
+    return false;
+}
+
+static
+rc_t FindAndOpenConfigFile(RefSeqMgr const *const rmgr,
+                           KDirectory const *const dir,
+                           KFile const **const kfp, char const conf[])
+{
+    rc_t rc = KDirectoryOpenFileRead(dir, kfp, "%s", conf);
+    
+    if (rc) {
+        struct OpenConfigFile_ctx ctx;
+
+        ctx.name = conf;
+        ctx.dir = dir;
+        ctx.kfp = kfp;
+        ctx.rc = 0;
+        
+        rc = RefSeqMgr_ForEachVolume(rmgr, OpenConfigFile, &ctx);
+        if (rc == 0 && *kfp == NULL) {
+            rc = RC(rcAlign, rcIndex, rcConstructing, rcFile, rcNotFound);
+        }
+    }
+    return rc;
+}
+
+enum comparison_weights {
+    no_match        = 0,
+    substring_match = (1u << 0),
+    expected_prefix = (1u << 1),
+    exact_match     = (1u << 2),
+    seqId_match     = (1u << 3),
+    id_match        = (1u << 4),
+    seq_len_match   = (1u << 5),
+    md5_match       = (1u << 6),
+    attached        = (1u << 7)
+};
+
+static
+unsigned str_weight(char const str[], char const qry[], unsigned const qry_len)
+{
+    char const *const fnd = strcasestr(str, qry);
+    unsigned wt = no_match;
+    
+    if (fnd) {
+        unsigned const fnd_len = (unsigned)string_size(fnd);
+        unsigned const fndlen = (fnd_len > qry_len && fnd[qry_len] == '|') ? qry_len : fnd_len;
+        
+        if (fndlen == qry_len && (fnd == str || fnd[-1] == '|')) {
+            wt |= substring_match;
+            
+            if (fnd == str) {
+                if (fnd[fndlen] == '\0')
+                    wt |= exact_match;
+            }
+            else {
+                /* check for expected prefices */
+                char const *ns = fnd - 1;
+                
+                while (ns != str && ns[-1] != '|')
+                    --ns;
+                
+                if (   memcmp(ns, "ref|", 4) == 0
+                    || memcmp(ns, "emb|", 4) == 0
+                    || memcmp(ns, "dbj|", 4) == 0
+                    || memcmp(ns, "tpg|", 4) == 0
+                    || memcmp(ns, "tpe|", 4) == 0
+                    || memcmp(ns, "tpd|", 4) == 0
+                    || memcmp(ns, "gpp|", 4) == 0
+                    || memcmp(ns,  "gb|", 3) == 0
+                   )
+                {
+                    wt |= expected_prefix;
+                }
+            }
+        }
+    }
+    return wt;
+}
+
+static void addToIndex(ReferenceMgr *const self, char const ID[],
+                       ReferenceSeq *const rs)
+{
+    unsigned const n = rs->num_used;
+    unsigned i;
+
+    for (i = 0; i < n; ++i) {
+        if (strcmp(ID, rs->used[i]) == 0)
+            goto SKIP_INSERT_ID;
+    }
+    {
+        unsigned const length = (unsigned)string_size(ID);
+        char *id = string_dup(ID, length);
+        void *tmp = realloc(rs->used, (n + 1) * sizeof(rs->used[0]));
+
+        assert(tmp != NULL && id != NULL);
+        if (tmp == NULL || id == NULL) abort();
+
+        ++rs->num_used;
+        rs->used = tmp;
+        rs->used[n] = id;
+    }
+SKIP_INSERT_ID:
+    addToHashBucket(&self->used[hash0(ID)], rs - self->refSeq);
+}
+
+static int findId(ReferenceMgr const *const self, char const id[])
+{
+    unsigned const hv = hash0(id);
+    Bucket const *const bucket = &self->used[hv];
+    unsigned const n = bucket->count;
+    unsigned i;
+    
+    for (i = 0; i < n; ++i) {
+        unsigned const index = bucket->index[i];
+        ReferenceSeq const *rs = &self->refSeq[index];
+        unsigned const m = rs->num_used;
+        unsigned j;
+        
+        if (rs->type == rst_dead)
+            continue;
+        for (j = 0; j < m; ++j) {
+            if (strcmp(id, rs->used[j]) == 0)
+                return index;
+        }
+    }
+    return -1;
+}
+
+static ReferenceSeq *newReferenceSeq(ReferenceMgr *const self, ReferenceSeq const *const template)
+{
+    unsigned const last_rs = (unsigned)self->refSeqs.elem_count;
+    rc_t const rc = KDataBufferResize(&self->refSeqs, last_rs + 1);
+
+    assert(rc == 0);
+    if (rc) abort();
+
+    self->refSeq = self->refSeqs.base;
+    {
+        ReferenceSeq *const rslt = &self->refSeq[last_rs];
+        if (template)
+            *rslt = *template;
+        else
+            memset(rslt, 0, sizeof(*rslt));
+        rslt->mgr = self;
+        return rslt;
+    }
+}
+
+static
+int64_t CC config_cmp(void const *A, void const *B, void *Data)
+{
+    struct {
+        unsigned id;
+        unsigned seqId;
+        unsigned extra;
+        unsigned extralen;
+    } const *const a = A;
+    struct {
+        unsigned id;
+        unsigned seqId;
+        unsigned extra;
+        unsigned extralen;
+    } const *const b = B;
+    char const *const data = Data;
+    
+    return strcmp(&data[a->id], &data[b->id]);
+}
+
+static
+rc_t ReferenceMgr_ProcessConf(ReferenceMgr *const self, char Data[], unsigned const len)
+{
+    rc_t rc;
+    unsigned i;
+    unsigned j;
+    struct {
+        unsigned id;
+        unsigned seqId;
+        unsigned extra;
+        unsigned extralen;
+    } *data, tmp;
+    KDataBuffer buf;
+    
+    memset(&buf, 0, sizeof(buf));
+    buf.elem_bits = sizeof(data[0]) * 8;
+    
+    for (j = i = 0; i < len; ++j) {
+        unsigned lineEnd;
+        unsigned id;
+        unsigned acc;
+        unsigned ii;
+        
+        for (lineEnd = i; lineEnd != len; ++lineEnd) {
+            int const ch = Data[lineEnd];
+            
+            if (ch == '\n')
+                break;
+            if (ch == '\r')
+                break;
+        }
+        if (i == lineEnd) {
+            ++i;
+            continue;
+        }
+        Data[lineEnd] = '\0';
+        for (id = i; id != lineEnd; ++id) {
+            int const ch = Data[id];
+            
+            if (!isspace(ch))
+                break;
+        }
+        for (ii = id; ii != lineEnd; ++ii) {
+            int const ch = Data[ii];
+            
+            if (isspace(ch)) {
+                Data[ii++] = '\0';
+                break;
+            }
+        }
+        for (acc = ii; acc < lineEnd; ++acc) {
+            int const ch = Data[acc];
+            
+            if (!isspace(ch))
+                break;
+        }
+        if (acc >= lineEnd)
+            return RC(rcAlign, rcFile, rcReading, rcFormat, rcInvalid);
+        
+        for (ii = acc; ii != lineEnd; ++ii) {
+            int const ch = Data[ii];
+            
+            if (isspace(ch)) {
+                Data[ii++] = '\0';
+                break;
+            }
+        }
+        tmp.id = id;
+        tmp.seqId = acc;
+        tmp.extra = ii;
+        tmp.extralen = lineEnd > ii ? lineEnd - ii : 0;
+        
+        if ((rc = KDataBufferResize(&buf, buf.elem_count + 1)) != 0) return rc;
+        data = buf.base;
+        
+        data[buf.elem_count-1] = tmp;
+        i = lineEnd + 1;
+    }
+    
+    /* check unique */
+    ksort(data, buf.elem_count, sizeof(data[0]), config_cmp, Data);
+    for (i = 1; i < buf.elem_count; ++i) {
+        if (strcmp(&Data[data[i-1].id], &Data[data[i].id]) == 0)
+            return RC(rcAlign, rcIndex, rcConstructing, rcItem, rcExists);
+    }
+
+    for (i = 0; i != buf.elem_count; ++i) {
+        unsigned const extralen = data[i].extralen;
+        char const *const id    = &Data[data[i].id];
+        char const *const seqId = &Data[data[i].seqId];
+        char const *const extra = extralen ? &Data[data[i].extra] : NULL;
+        bool circular = false;
+        ReferenceSeq *rs;
+        
+        if (extra && extralen >= 8) {
+            char const *const circ = strcasestr(extra, "circular");
+            
+            circular = circ && (circ == extra || isspace(circ[-1])) &&
+                       (circ[8] == '\0' || isspace(circ[8]));
+        }
+        rs = newReferenceSeq(self, NULL);
+
+        rs->id = string_dup(id, string_size(id));
+        if (rs->id == NULL)
+            return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+
+        if (strcmp(seqId, UNMAPPED_SEQID_VALUE) == 0) {
+            rs->type = rst_unmapped;
+        }
+        else {
+            rs->seqId = string_dup(seqId, string_size(seqId));
+            if (rs->seqId == NULL)
+                return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+        }
+        rs->circular = circular;
+        
+        addToHashTable(self, rs);
+    }
+    KDataBufferWhack(&buf);
+    return 0;
+}
+
+static
+rc_t ReferenceMgr_Conf(ReferenceMgr *const self, char const conf[])
+{
+    rc_t rc;
+    const KFile* kf = NULL;
+
+    if (conf == NULL)
+        return 0;
+    
+    rc = FindAndOpenConfigFile(self->rmgr, self->dir, &kf, conf);
+    if (rc == 0) {
+        uint64_t sz;
+        KDataBuffer buf;
+        
+        rc = KFileSize(kf, &sz);
+        assert(rc == 0);
+        if (sz == 0)
+            (void)PLOGMSG(klogWarn, (klogWarn, "Configuration file '$(file)' is empty", "file=%s", conf));
+        else {
+            rc = KDataBufferMakeBytes(&buf, sz + 1);
+            if (rc == 0) {
+                size_t nread;
+                
+                rc = KFileReadAll(kf, 0, buf.base, sz, &nread);
+                if (rc == 0) {
+                    assert(nread == sz);
+                    ((char *)buf.base)[sz] = '\n'; /* make sure that last line is terminated */
+                    rc = ReferenceMgr_ProcessConf(self, buf.base, (unsigned)(sz + 1));
+                }
+                KDataBufferWhack(&buf);
+            }
+        }
+        KFileRelease(kf);
+    }
+    return rc;
+}
+
+static
+rc_t FastaFile_GetSeqIds(KDataBuffer *const buf, char const data[], uint64_t const len)
+{
+    uint64_t pos;
+    int st = 0;
+    
+    for (pos = 0; pos < len; ++pos) {
+        int const ch = data[pos];
+        
+        if (st == 0) {
+            if (ch == '>') {
+                uint64_t const n = buf->elem_count;
+                rc_t rc = KDataBufferResize(buf, n + 1);
+                
+                if (rc)
+                    return rc;
+                ((uint64_t *)buf->base)[n] = pos;
+                st = 1;
+            }
+        }
+        else if (ch == '\r' || ch == '\n') 
+            st = 0;
+    }
+    return 0;
+}
+
+static
+rc_t ImportFasta(ReferenceSeq *const obj, KDataBuffer const *const buf)
+{
+    unsigned seqId;
+    unsigned seqIdLen;
+    unsigned ln;
+    unsigned src;
+    unsigned dst;
+    unsigned start=0;
+    char *const data = buf->base;
+    unsigned const len = buf->elem_count;
+    char *fastaSeqId = NULL;
+    rc_t rc;
+    MD5State mds;
+    
+    if (len == 0)
+        return 0;
+    assert(data[0] == '>');
+    
+    for (ln = 1; ln != len; ++ln) {
+        int const ch = data[ln];
+        
+        if (ch == '\r' || ch == '\n') {
+            data[ln] = '\0';
+            start = ln + 1;
+            break;
+        }
+    }
+    for (seqId = 1; seqId != ln; ++seqId) {
+        if (!isspace(data[seqId]))
+            break;
+    }
+    for (seqIdLen = 0; seqId + seqIdLen < ln; ++seqIdLen) {
+        if (isspace(data[seqId + seqIdLen])) {
+            ln = seqId + seqIdLen;
+            data[ln] = '\0';
+            break;
+        }
+    }
+    if (seqIdLen == 0)
+        return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+    
+    fastaSeqId = string_dup(&data[seqId], string_size(&data[seqId]));
+    if (fastaSeqId == NULL)
+        return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+    
+    MD5StateInit(&mds);
+    for (dst = src = start; src != len; ++src) {
+        int const ch = toupper(data[src]);
+        
+        if (isspace(ch))
+            continue;
+        
+        if (strchr(INSDC_4na_map_CHARSET, ch) == NULL && ch != 'X')
+            return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+        
+        data[dst] = ch == 'X' ? 'N' : ch;
+        MD5StateAppend(&mds, data + dst, 1);
+        ++dst;
+    }
+    MD5StateFinish(&mds, obj->md5);
+    rc = KDataBufferSub(buf, &obj->u.local.buf, start, dst - start);
+    if (rc == 0) {
+        obj->fastaSeqId = fastaSeqId;
+        obj->type = rst_local;
+        obj->seq_len = dst - start;
+    }
+    else
+        obj->type = rst_dead;
+    return rc;
+}
+
+static KDataBuffer subBuffer(KDataBuffer const *const buf, uint64_t const offset, unsigned const length)
+{
+    KDataBuffer sub;
+    memset(&sub, 0, sizeof(sub));
+    KDataBufferSub(buf, &sub, offset, length);
+    return sub;
+}
+
+static int compareSeqIdFields(unsigned const alen, char const a[], unsigned const blen, char const b[])
+{
+    unsigned i;
+
+    for (i = 0; i < alen && i < blen; ++i) {
+        int const cha = a[i];
+        int const chb = b[i];
+        int const diff = toupper(cha) - toupper(chb);
+
+        if (diff < 0)
+            return -1;
+
+        if (diff > 0)
+            return 1;
+
+        if (cha == '\0')
+            return 0;
+    }
+    return alen < blen ? -1 : alen == blen ? 0 : 1;
+}
+
+typedef struct {
+    unsigned length;
+    uint64_t offset;
+} seqIdField_t;
+
+static int64_t cmpSeqIdField(void const *A, void const *B, void *Ctx)
+{
+    char const *const data = Ctx;
+    seqIdField_t const *a = A;
+    seqIdField_t const *b = B;
+    char const *avalue = &data[a->offset];
+    unsigned const alen = a->length;
+    char const *bvalue = &data[b->offset];
+    unsigned const blen = b->length;
+    int const diff = compareSeqIdFields(alen, avalue, blen, bvalue);
+
+    return diff != 0 ? diff : a->offset < b->offset ? -1 : 1;
+}
+
+static bool isInKnownSet(unsigned const len, char const id[])
+{
+    if (len == 2 || len == 3) {
+        int const id1 = id[0];
+        int const id2 = id[1];
+
+        if (len == 3) {
+            int const id3 = id[2];
+
+            if (id1 == 'd' && id2 == 'b' && id3 == 'j') return true;
+            if (id1 == 'e' && id2 == 'm' && id3 == 'b') return true;
+            if (id1 == 'g' && id2 == 'p' && id3 == 'p') return true;
+            if (id1 == 'r' && id2 == 'e' && id3 == 'f') return true;
+            if (id1 == 't' && id2 == 'p') {
+                if (id3 == 'd' || id3 == 'e' || id3 == 'g') return true;
+            }
+            return false;
+        }
+        if (id1 == 'g') {
+            if (id2 == 'b' || id2 == 'i')
+                return true;
+        }
+    }
+    return false;
+}
+
+static rc_t ImportFastaFileMany(ReferenceMgr *const self,
+                                unsigned const seqIds, uint64_t const seqIdOffset[],
+                                KDataBuffer const *const buf)
+{
+    unsigned const datalen = buf->elem_count;
+    char *const data = buf->base;
+    seqIdField_t *found = NULL;
+    seqIdField_t *ignore = NULL;
+    unsigned found_entries = 0;
+    unsigned found_entries_max = seqIds;
+    unsigned ignore_entries = 0;
+    unsigned ignore_entries_max = 0;
+    unsigned i;
+    rc_t rc = 0;
+
+    found = malloc(found_entries_max * sizeof(found[0]));
+    assert(found);
+    if (found == NULL)
+        abort();
+
+    for (i = 0; i < seqIds; ++i) {
+        uint64_t const ofs = seqIdOffset[i];
+        uint64_t const nxt = (i < seqIds - 1) ? seqIdOffset[i + 1] : datalen;
+        unsigned const len = (unsigned)(nxt - ofs);
+        unsigned j = 1;
+        unsigned k;
+
+        for (k = j; k < len; ++k) {
+            int const ch = data[ofs + k];
+
+            if (ch == '|' || isspace(ch)) {
+                char const *const str = &data[ofs + j];
+                unsigned const len = k - j;
+
+                if (len > 0 && (isspace(ch) || !isInKnownSet(len, str))) {
+                    if (found_entries == found_entries_max) {
+                        unsigned const new_max = found_entries_max * 2;
+                        void *const tmp = realloc(found, new_max * sizeof(found[0]));
+
+                        assert(tmp);
+                        if (tmp == NULL)
+                            abort();
+
+                        found = tmp;
+                        found_entries_max = new_max;
+                    }
+                    found[found_entries].length = len;
+                    found[found_entries].offset = ofs + j;
+                    ++found_entries;
+                }
+                j = k + 1;
+            }
+            if (isspace(ch))
+                break;
+        }
+    }
+    ksort(found, found_entries, sizeof(found[0]), cmpSeqIdField, (void *)data);
+
+    for (i = 1; i < found_entries; ++i) {
+        unsigned const llen = ignore_entries_max > 0 ? ignore[ignore_entries - 1].length : 0;
+        char const *const last = ignore_entries_max > 0 ? data + ignore[ignore_entries - 1].offset : 0;
+
+        unsigned const plen = found[i - 1].length;
+        char const *const prv = data + found[i - 1].offset;
+
+        unsigned const qlen = found[i].length;
+        char const *const qry = data + found[i].offset;
+
+        bool const issame = compareSeqIdFields(plen, prv, qlen, qry) == 0;
+        bool const islast = llen > 0 ? compareSeqIdFields(llen, last, qlen, qry) == 0 : false;
+
+        if (issame && !islast) {
+            if (ignore_entries == ignore_entries_max) {
+                unsigned const new_max = ignore_entries_max == 0 ? (4096 / sizeof(ignore[0])) : (ignore_entries_max * 2);
+                void *const tmp = realloc(ignore, new_max * sizeof(ignore[0]));
+
+                assert(tmp);
+                if (tmp == NULL)
+                    abort();
+
+                ignore = tmp;
+                ignore_entries_max = new_max;
+            }
+            ignore[ignore_entries] = found[i - 1];
+            ++ignore_entries;
+        }
+    }
+    free(found);
+
+    for (i = 0; i < seqIds; ++i) {
+        unsigned index = 0;
+        uint64_t const ofs = seqIdOffset[i];
+        uint64_t const nxt = (i < seqIds - 1) ? seqIdOffset[i + 1] : datalen;
+        unsigned const len = (unsigned)(nxt - ofs);
+        unsigned j = 1;
+        unsigned k;
+        char const *const seqId = &data[ofs + 1];
+        {
+            ReferenceSeq new_seq;
+            KDataBuffer sub = subBuffer(buf, ofs, len);
+
+            memset(&new_seq, 0, sizeof(new_seq));
+            rc = ImportFasta(&new_seq, &sub);
+            KDataBufferWhack(&sub);
+            if (rc) {
+                PLOGERR(klogInfo, (klogInfo, rc, "Error reading '$(defline)'; ignored", "defline=%s", seqId));
+                continue;
+            }
+            else {
+                ReferenceSeq *p = newReferenceSeq(self, &new_seq);
+                index = p - self->refSeq;
+                addToHashBucket(&self->ht[hash0(seqId)], index);
+            }
+        }
+        for (k = j; k < len; ++k) {
+            int const ch = data[ofs + k];
+
+            if (ch == '\0' || ch == '|' || isspace(ch)) {
+                unsigned const length = k - j;
+                uint64_t const offset = ofs + j;
+                char const *const value = &data[offset];
+
+                if (length == 0 || (!isspace(ch) && isInKnownSet(length, value)))
+                    goto IGNORED;
+                {
+                    unsigned f = 0;
+                    unsigned e = ignore_entries;
+
+                    while (f < e) {
+                        unsigned const m = f + (e - f) / 2;
+                        unsigned const flen = ignore[m].length;
+                        char const *const fnd = data + ignore[m].offset;
+                        int const diff = compareSeqIdFields(length, value, flen, fnd);
+
+                        if (diff == 0)
+                            goto IGNORED;
+                        if (diff < 0)
+                            e = m;
+                        else
+                            f = m + 1;
+                    }
+                }
+                addToHashBucket(&self->ht[hash(length, value)], index);
+            IGNORED:
+                j = k + 1;
+                if (ch == '\0' || isspace(ch))
+                    break;
+            }
+        }
+    }
+
+    free(ignore);
+    return rc;
+}
+
+#define READ_CHUNK_SIZE (1024 * 1024)
+
+static
+rc_t ImportFastaFile(ReferenceMgr *const self, KFile const *kf,
+                     ReferenceSeq *rslt)
+{
+    uint64_t file_size;
+    rc_t rc = KFileSize(kf, &file_size);
+    
+    if (rc == 0) {
+        KDataBuffer fbuf;
+
+        rc = KDataBufferMakeBytes(&fbuf, file_size);
+        if (rc == 0) {
+            char *const data = fbuf.base;
+            uint64_t inbuf = 0;
+
+            while (inbuf < file_size) {
+                uint64_t const remain = file_size - inbuf;
+                size_t nread = 0;
+                
+                rc = KFileRead(kf, inbuf, &data[inbuf], remain > READ_CHUNK_SIZE ? READ_CHUNK_SIZE : remain, &nread);
+                if (rc != 0 || nread == 0)
+                    break;
+                inbuf += nread;
+            }
+            if (rc == 0) {
+                char const *const base = fbuf.base;
+                KDataBuffer seqIdBuf;
+                
+                memset(&seqIdBuf, 0, sizeof(seqIdBuf));
+                seqIdBuf.elem_bits = sizeof(file_size) * 8;
+                
+                rc = FastaFile_GetSeqIds(&seqIdBuf, base, file_size);
+                if (rc == 0) {
+                    uint64_t const *const seqIdOffset = seqIdBuf.base;
+                    unsigned const seqIds = (unsigned)seqIdBuf.elem_count;
+
+                    if (rslt) {
+                        KDataBuffer sub = subBuffer(&fbuf, seqIdOffset[0], (unsigned)(file_size - seqIdOffset[0]));
+
+                        if (seqIds > 1)
+                            rc = RC(rcAlign, rcFile, rcReading, rcItem, rcUnexpected);
+                        
+                        rc = ImportFasta(rslt, &sub);
+                        KDataBufferWhack(&sub);
+                        if (rc == 0)
+                            addToHashTable(self, rslt);
+                    }
+                    else {
+                        ImportFastaFileMany(self, seqIds, seqIdOffset, &fbuf);
+                    }
+                }
+                KDataBufferWhack(&seqIdBuf);
+            }
+            KDataBufferWhack(&fbuf);
+        }
+    }
+    return rc;
+}
+
+static
+rc_t OpenFastaFile(KFile const **const kf,
+                   KDirectory const *const dir,
+                   char const base[],
+                   unsigned const len)
+{
+    char fname_a[4096];
+    char *fname_h = NULL;
+    char *fname = fname_a;
+    rc_t rc;
+    
+    if (len + 7 >= sizeof(fname_a)) {
+        fname_h = malloc(len + 7);
+        if (fname_h)
+            fname = fname_h;
+        else
+            return RC(rcAlign, rcFile, rcOpening, rcMemory, rcExhausted);
+    }
+    memmove(fname, base, len);
+    memmove(fname + len, ".fasta", 7);
+    
+    ALIGN_CF_DBGF(("trying to open fasta file: %.s\n", fname));
+    rc = KDirectoryOpenFileRead(dir, kf, "%s", fname);
+    if (rc) {
+        fname[len + 3] = '\0'; /* base.fasta -> base.fa */
+        
+        ALIGN_CF_DBGF(("trying to open fasta file: %.s\n", fname));
+        rc = KDirectoryOpenFileRead(dir, kf, "%s", fname);
+    }
+    free(fname_h);
+    return rc;
+}
+
+#if 1
+void ReferenceSeq_Dump(ReferenceSeq const *const rs)
+{
+    static char const *types[] = {
+        "'unattached'",
+        "'fasta'",
+        "'RefSeq-by-id'",
+        "'RefSeq-by-seqid'",
+        "'unmapped'",
+        "'dead'"
+    };
+    unsigned j;
+    
+    ((void)types); /* stupid warning */
+    ALIGN_CF_DBGF(("{ "));
+    ALIGN_CF_DBGF(("type: %s, ", (rs->type < 0 || rs->type > rst_dead) ? "null" : types[rs->type]));
+    
+    if (rs->id)
+        ALIGN_CF_DBGF(("id: '%s', ", rs->id));
+    else
+        ALIGN_CF_DBGF(("id: null, "));
+    
+    if (rs->seqId)
+        ALIGN_CF_DBGF(("seqId: '%s', ", rs->seqId));
+    else
+        ALIGN_CF_DBGF(("seqId: null, "));
+    
+    if (rs->fastaSeqId)
+        ALIGN_CF_DBGF(("fastaSeqId: '%s', ", rs->fastaSeqId));
+    else
+        ALIGN_CF_DBGF(("fastaSeqId: null, "));
+    
+    ALIGN_CF_DBGF(("seq-len: %u, ", rs->seq_len));
+    ALIGN_CF_DBGF(("circular: %s, ", rs->circular ? "true" : "false"));
+    
+    ALIGN_CF_DBGF(("md5: '"));
+    for (j = 0; j != 16; ++j)
+        ALIGN_CF_DBGF(("%02X", rs->md5[j]));
+    ALIGN_CF_DBGF(("', "));
+    
+    ALIGN_CF_DBGF(("keys: [ "));
+    for (j = 0; j != rs->num_used; ++j) {
+        char const *key = rs->used[j];
+        
+        ALIGN_CF_DBGF(("'%s', ", key));
+    }
+    ALIGN_CF_DBGF(("] }"));
+}
+
+LIB_EXPORT void ReferenceMgr_DumpConfig(ReferenceMgr const *const self)
+{
+    unsigned const n = (unsigned)self->refSeqs.elem_count;
+    unsigned i;
+    
+    ALIGN_CF_DBGF(("config: [\n"));
+    for (i = 0; i != n; ++i) {
+        ALIGN_CF_DBGF(("\t"));
+        ReferenceSeq_Dump(&self->refSeq[i]);
+        ALIGN_CF_DBGF((",\n"));
+    }
+    ALIGN_CF_DBGF(("]\n"));
+}
+#endif
+
+static
+rc_t ReferenceSeq_GetRefSeqInfo(ReferenceSeq *const self)
+{
+    rc_t rc;
+    uint8_t const *md5;
+    
+    assert(self != NULL);
+    assert(self->type == rst_refSeqById || self->type == rst_refSeqBySeqId);
+    
+    if ((rc = RefSeq_Circular(self->u.refseq, &self->circular)) != 0)
+        return rc;
+    if ((rc = RefSeq_SeqLength(self->u.refseq, &self->seq_len)) != 0)
+        return rc;
+    if ((rc = RefSeq_MD5(self->u.refseq, &md5)) != 0)
+        return rc;
+    
+    if (md5)
+        memmove(self->md5, md5, 16);
+    else
+        memset(self->md5, 0, 16);
+    return 0;
+}
+
+
+/* Try to attach to a RefSeq or a fasta file */
+static
+rc_t ReferenceSeq_Attach(ReferenceMgr *const self, ReferenceSeq *const rs)
+{
+    unsigned const seqid_len = rs->seqId ? (unsigned)string_size(rs->seqId) : 0;
+    unsigned const id_len = rs->id ? (unsigned)string_size(rs->id) : 0;
+    rc_t rc = 0;
+    KFile const *kf = NULL;
+    
+    assert(rs->type == rst_unattached);
+    assert(id_len != 0 || seqid_len != 0);
+    
+    if (seqid_len) {
+        ALIGN_CF_DBGF(("trying to open refseq: %.*s\n", seqid_len, rs->seqId));
+        if (RefSeqMgr_Exists(self->rmgr, rs->seqId, seqid_len, NULL) == 0) {
+            rc = RefSeqMgr_GetSeq(self->rmgr, &rs->u.refseq, rs->seqId, seqid_len);
+            if (rc == 0) {
+                rs->type = rst_refSeqBySeqId;
+                rc = ReferenceSeq_GetRefSeqInfo(rs);
+            }
+            return rc;
+        }
+    }
+    if (id_len) {
+        ALIGN_CF_DBGF(("trying to open refseq: %.*s\n", id_len, rs->id));
+        if (RefSeqMgr_Exists(self->rmgr, rs->id, id_len, NULL) == 0) {
+            rc = RefSeqMgr_GetSeq(self->rmgr, &rs->u.refseq, rs->id, id_len);
+            if (rc == 0) {
+                rs->type = rst_refSeqById;
+                rc = ReferenceSeq_GetRefSeqInfo(rs);
+            }
+            return rc;
+        }
+    }
+    if (id_len) {
+        ALIGN_CF_DBGF(("trying to open fasta: %.*s\n", id_len, rs->id));
+        rc = OpenFastaFile(&kf, self->dir, rs->id, id_len);
+        if (rc && seqid_len) {
+            ALIGN_CF_DBGF(("trying to open fasta: %.*s\n", seqid_len, rs->seqId));
+            rc = OpenFastaFile(&kf, self->dir, rs->seqId, seqid_len);
+        }
+    }
+    else {
+        ALIGN_CF_DBGF(("trying to open fasta: %.*s\n", seqid_len, rs->seqId));
+        rc = OpenFastaFile(&kf, self->dir, rs->seqId, seqid_len);
+    }
+    if (kf) {
+        ReferenceSeq tmp = *rs;
+        
+        ALIGN_CF_DBGF(("importing fasta"));
+        rc = ImportFastaFile(self, kf, rs);
+        KFileRelease(kf);
+        if (rc != 0)
+            *rs = tmp;
+        return rc;
+    }
+    return 0;
+}
+
+struct Candidate {
+    int weight;
+    unsigned index;
+};
+
+static int64_t CC cmpCandidate(void const *A, void const *B, void *Ctx)
+{
+    struct Candidate const *const a = A;
+    struct Candidate const *const b = B;
+
+    return (int64_t)(a->weight - b->weight);
+}
+
+static void sortCandidateList(unsigned const len, struct Candidate *list)
+{
+    if (len > 1)
+        ksort(list, len, sizeof(list[0]), cmpCandidate, NULL);
+}
+
+static void candidates(ReferenceMgr *const self,
+                       unsigned *const count,
+                       struct Candidate **const rslt,
+                       unsigned const idLen,
+                       char const id[],
+                       unsigned const seq_len,
+                       uint8_t const md5[16])
+{
+    unsigned const hv = hash(idLen, id);
+    Bucket const bucket = self->ht[hv];
+    unsigned num_possible = 0;
+    struct Candidate *possible = malloc(sizeof(possible[0]) * bucket.count);
+    unsigned i;
+
+    assert(possible != NULL);
+    if (possible == NULL)
+        abort();
+    for (i = 0; i < bucket.count; ++i) {
+        unsigned const index = bucket.index[i];
+        ReferenceSeq *const rs = &self->refSeq[index];
+
+        if (rs->type != rst_dead) {
+            bool const sameId = rs->id != NULL && strcmp(rs->id, id) == 0;
+            bool const sameSeqId = rs->seqId != NULL && strcasecmp(rs->seqId, id) == 0;
+            int const sameFastaSeqId = rs->fastaSeqId != NULL ? str_weight(rs->fastaSeqId, id, idLen) : 0;
+            struct Candidate nv;
+
+            nv.weight = (sameId ? id_match : 0) | (sameSeqId ? seqId_match : 0) | sameFastaSeqId;
+            nv.index = index;
+
+            if (nv.weight > 0)
+                possible[num_possible++] = nv;
+        }
+    }
+    if (num_possible == 0) {
+        free(possible);
+        possible = NULL;
+    }
+    *count = num_possible;
+    *rslt = possible;
+}
+
+static rc_t tryFastaOrRefSeq(ReferenceMgr *const self,
+                     ReferenceSeq **const rslt,
+                     unsigned const idLen,
+                     char const id[],
+                     bool *tryAgain)
+{
+    KFile const *kf = NULL;
+    rc_t rc = 0;
+
+    if (OpenFastaFile(&kf, self->dir, id, idLen) == 0) {
+        /* found a fasta file; load it and try again */
+        rc = ImportFastaFile(self, kf, NULL);
+        if (rc == 0) {
+            *tryAgain = true;
+            return 0;
+        }
+    }
+    /* didn't find a fasta file; try RefSeq */
+    ALIGN_CF_DBGF(("trying to open refseq: %s\n", id));
+    if (RefSeqMgr_Exists(self->rmgr, id, idLen, NULL) == 0) {
+        ReferenceSeq *const seq = newReferenceSeq(self, NULL);
+
+        rc = RefSeqMgr_GetSeq(self->rmgr, &seq->u.refseq, id, idLen);
+        if (rc == 0) {
+            unsigned const hv = hash(idLen, id);
+            seq->id = string_dup(id, idLen);
+            seq->type = rst_refSeqById;
+
+            addToHashBucket(&self->ht[hv], seq - self->refSeq);
+
+            ReferenceSeq_GetRefSeqInfo(seq);
+            *rslt = seq;
+        }
+    }
+    else {
+        /* nothing found and out of options */
+        rc = RC(rcAlign, rcFile, rcConstructing, rcId, rcNotFound);
+    }
+    return rc;
+}
+
+static void setSeqLenBit(ReferenceMgr *const self, unsigned const N, struct Candidate *const C, unsigned const seq_len)
+{
+    unsigned i;
+    for (i = 0; i < N; ++i) {
+        unsigned const index = C[i].index;
+        ReferenceSeq const *const rs = &self->refSeq[index];
+
+        if (seq_len == rs->seq_len)
+            C[i].weight |= seq_len_match;
+    }
+}
+
+static void setMD5Bit(ReferenceMgr *const self, unsigned const N, struct Candidate *const C, uint8_t const md5[])
+{
+    unsigned i;
+    for (i = 0; i < N; ++i) {
+        unsigned const index = C[i].index;
+        ReferenceSeq const *const rs = &self->refSeq[index];
+
+        if (memcmp(md5, rs->md5, 16) == 0)
+            C[i].weight |= md5_match;
+    }
+}
+
+static void setAttachedBit(ReferenceMgr *const self, unsigned const N, struct Candidate *const C)
+{
+    unsigned i;
+    for (i = 0; i < N; ++i) {
+        unsigned const index = C[i].index;
+        ReferenceSeq const *const rs = &self->refSeq[index];
+
+        if (rs->type != rst_unattached)
+            C[i].weight |= attached;
+    }
+}
+
+static ReferenceSeq *checkForMultiMapping(ReferenceMgr *const self, ReferenceSeq *const chosen, bool *const wasRenamed)
+{
+    unsigned const hv = hash0(chosen->seqId);
+    Bucket const bucket = self->ht[hv];
+    unsigned i;
+
+    for (i = 0; i < bucket.count; ++i) {
+        ReferenceSeq *qry = &self->refSeq[bucket.index[i]];
+        if (qry == chosen || qry->type == rst_dead || qry->type == rst_unattached || qry->type == rst_renamed || qry->seqId == NULL)
+            continue;
+        if (strcasecmp(chosen->seqId, qry->seqId) == 0) {
+            void *const oldId = chosen->id;
+
+            chosen->type = rst_renamed;
+            chosen->id = string_dup(qry->id, string_size(qry->id));
+            *wasRenamed = true;
+            free(oldId);
+            return qry;
+        }
+    }
+    return chosen;
+}
+
+static rc_t tryFasta(ReferenceMgr *const self,
+                     ReferenceSeq **const rslt,
+                     char const seqId[],
+                     unsigned const seq_len,
+                     uint8_t const md5[16])
+{
+    ReferenceSeq *const seq = *rslt;
+    unsigned const hv = hash0(seqId);
+    Bucket const bucket = self->ht[hv];
+    unsigned best = bucket.count;
+    unsigned best_score = 0;
+    unsigned i;
+
+    for (i = 0; i < bucket.count; ++i) {
+        unsigned score = 0;
+        ReferenceSeq *const qry = &self->refSeq[bucket.index[i]];
+
+        if (qry != seq && qry->fastaSeqId != NULL) {
+            char const *const substr = strcasestr(qry->fastaSeqId, seqId);
+            if (substr != NULL) {
+                unsigned const at = substr - qry->fastaSeqId;
+                unsigned const slen = (unsigned)string_size(seqId);
+                unsigned const qlen = (unsigned)string_size(qry->fastaSeqId);
+                if (at == 0 && slen == qlen)
+                    score |= exact_match;
+                else {
+                    bool const leftEdge = at == 0 || qry->fastaSeqId[at - 1] == '|';
+                    bool const rightEdge = (at + slen) == qlen || qry->fastaSeqId[at + slen] == '|';
+
+                    if (leftEdge && rightEdge)
+                        score |= substring_match;
+                }
+            }
+        }
+        if (score == 0)
+            continue;
+
+        if (seq_len != 0 && qry->seq_len == seq_len)
+            score |= seq_len_match;
+        if (md5 != NULL && memcmp(md5, qry->md5, 16) == 0)
+            score |= md5_match;
+        if (score > best_score) {
+            best = i;
+            best_score = score;
+        }
+    }
+    if (best != bucket.count) {
+        *rslt = &self->refSeq[bucket.index[best]];
+        return 0;
+    }
+    else {
+        return RC(rcAlign, rcFile, rcConstructing, rcId, rcNotFound);
+    }
+}
+
+static rc_t findSeq(ReferenceMgr *const self,
+                    ReferenceSeq **const rslt,
+                    char const id[],
+                    unsigned const seq_len,
+                    uint8_t const md5[16],
+                    bool const allowMultiMapping,
+                    bool wasRenamed[])
+{
+    unsigned const idLen = (unsigned)string_size(id);
+    unsigned num_possible = 0;
+    struct Candidate *possible = NULL;
+    ReferenceSeq *chosen = NULL;
+    rc_t rc = 0;
+
+    candidates(self, &num_possible, &possible, idLen, id, seq_len, md5);
+    if (num_possible == 0) {
+        /* nothing was found; try a fasta file */
+        bool tryAgain = false;
+        rc_t const rc = tryFastaOrRefSeq(self, rslt, idLen, id, &tryAgain);
+
+        if (rc != 0 && !tryAgain)
+            return rc;
+
+        return findSeq(self, rslt, id, seq_len, md5, allowMultiMapping, wasRenamed);
+    }
+    if (num_possible > 1) {
+        if (seq_len != 0)
+            setSeqLenBit(self, num_possible, possible, seq_len);
+        if (md5 != NULL)
+            setMD5Bit(self, num_possible, possible, md5);
+        sortCandidateList(num_possible, possible);
+        setAttachedBit(self, num_possible, possible);
+        sortCandidateList(num_possible - 1, possible);
+    }
+    /* if there is no second best OR the best is better than the second best
+     * then we have a clear choice
+     */
+    if (num_possible == 1 || (possible[num_possible - 1].weight & ~attached) > (possible[num_possible - 2].weight & ~attached)) {
+        unsigned const index = possible[num_possible - 1].index;
+        chosen = &self->refSeq[index];
+    }
+    free(possible);
+    if (chosen == NULL) {
+        /* there was no clear choice */
+        return RC(rcAlign, rcFile, rcConstructing, rcId, rcAmbiguous);
+    }
+    if (chosen->seqId != NULL && !allowMultiMapping) {
+        chosen = checkForMultiMapping(self, chosen, wasRenamed);
+    }
+    if (chosen->type == rst_unattached) {
+        rc = ReferenceSeq_Attach(self, chosen);
+        if (rc == 0 && chosen->type == rst_unattached) {
+            /* still not attached; try seqId fasta */
+            char const *const seqId = chosen->seqId;
+
+            chosen->type = rst_dead;
+            if (seqId)
+                rc = tryFasta(self, &chosen, seqId, seq_len, md5);
+            else
+                rc = RC(rcAlign, rcFile, rcConstructing, rcId, rcNotFound);
+        }
+    }
+    if (rc == 0) {
+        if (chosen->id == NULL)
+            chosen->id = string_dup(id, idLen);
+        if (chosen->seqId == NULL && chosen->fastaSeqId != NULL)
+            chosen->seqId = string_dup(chosen->fastaSeqId, string_size(chosen->fastaSeqId));
+        *rslt = chosen;
+    }
+    if (rc)
+        chosen->type = rst_dead;
+    addToIndex(self, id, chosen);
+    return rc;
+}
+
+static
+rc_t ReferenceMgr_OpenSeq(ReferenceMgr *const self,
+                          ReferenceSeq **const rslt,
+                          char const id[],
+                          unsigned const seq_len,
+                          uint8_t const md5[16],
+                          bool const allowMultiMapping,
+                          bool wasRenamed[])
+{
+    int const fnd = findId(self, id);
+    
+    assert(rslt != NULL);
+    *rslt = NULL;
+    if (fnd >= 0) {
+        ReferenceSeq *const obj = &self->refSeq[fnd];
+        
+        if (obj->type == rst_dead)
+            return RC(rcAlign, rcIndex, rcSearching, rcItem, rcInvalid);
+        if (obj->type == rst_renamed) {
+            bool dummy = false;
+
+            *wasRenamed = true;
+            return ReferenceMgr_OpenSeq(self, rslt, obj->id, seq_len, md5, allowMultiMapping, &dummy);
+        }
+        if (obj->type == rst_refSeqBySeqId || obj->type == rst_refSeqById) {
+            RefSeq const *dummy = NULL;
+            char const *const key = (obj->type == rst_refSeqById) ? obj->id : obj->seqId;
+            rc_t const rc = RefSeqMgr_GetSeq(self->rmgr, &dummy, key, (unsigned)string_size(key));
+            
+            assert(rc == 0);
+            assert(dummy == obj->u.refseq);
+        }
+        *rslt = obj;
+        return 0;
+    }
+    return findSeq(self, rslt, id, seq_len, md5, allowMultiMapping, wasRenamed);
+}
+
+LIB_EXPORT rc_t CC ReferenceMgr_SetCache(ReferenceMgr const *const self, size_t cache, uint32_t num_open)
+{
+    return RefSeqMgr_SetCache(self->rmgr, cache, num_open);
+}
+
+static
+rc_t OpenDataDirectory(KDirectory const **rslt, char const path[])
+{
+    KDirectory *dir;
+    rc_t rc = KDirectoryNativeDir(&dir);
+    
+    if (rc == 0) {
+        if (path) {
+            rc = KDirectoryOpenDirRead(dir, rslt, false, "%s", path);
+            KDirectoryRelease(dir);
+        }
+        else
+            *rslt = dir;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC ReferenceMgr_Make(ReferenceMgr const **cself, VDatabase *db,
+                                     VDBManager const* vmgr,
+                                     const uint32_t options, char const conf[], char const path[],
+                                     uint32_t max_seq_len, size_t cache, uint32_t num_open)
+{
+    rc_t rc;
+    ReferenceMgr *self;
+    uint32_t wopt = 0;
+    
+    if (cself == NULL)
+        return RC(rcAlign, rcIndex, rcConstructing, rcParam, rcNull);
+    
+    wopt |= (options & ewrefmgr_co_allREADs) ? ewref_co_SaveRead : 0;
+    wopt |= (options & ewrefmgr_co_Coverage) ? ewref_co_Coverage : 0;
+
+    if (max_seq_len == 0)
+        max_seq_len = TableWriterRefSeq_MAX_SEQ_LEN;
+    
+    self = calloc(1, sizeof(*self));
+    if (self) {
+        rc = KDataBufferMakeBytes(&self->seq, max_seq_len);
+        if (rc == 0) {
+            self->compress.elem_bits = sizeof(compress_buffer_t) * 8;
+            self->refSeqs.elem_bits = sizeof(ReferenceSeq) * 8;
+            
+            self->options = options;
+            self->cache = cache;
+            self->num_open_max = num_open;
+            self->max_seq_len = max_seq_len;
+            if (db) VDatabaseAddRef(self->db = db);
+            rc = OpenDataDirectory(&self->dir, path);
+            if (rc == 0) {
+                rc = RefSeqMgr_Make(&self->rmgr, vmgr, 0, cache, num_open);
+                if (rc == 0) {
+                    rc = ReferenceMgr_Conf(self, conf);
+                    if (rc == 0) {
+                        *cself = self;
+                        ALIGN_DBG("conf %s, local path '%s'", conf ? conf : "", path ? path : "");
+                        return 0;
+                    }
+                    (void)PLOGERR(klogErr, (klogErr, rc, "failed to open configuration $(file)", "file=%s/%s", path ? path : ".", conf));
+                }
+            }
+        }
+        ReferenceMgr_Release(self, false, NULL, false, NULL);
+    }
+    else
+        rc = RC(rcAlign, rcIndex, rcConstructing, rcMemory, rcExhausted);
+
+    ALIGN_DBGERR(rc);
+
+    return rc;
+}
+
+#define ID_CHUNK_SZ 256
+
+typedef struct TChunk32_struct {
+    struct TChunk32_struct* next;
+    uint32_t id[ID_CHUNK_SZ]; /*** will only work with positive ids **/
+} TChunk32;
+
+typedef struct AlignId32List_struct {
+	TChunk32* head;
+	TChunk32* tail;
+	uint32_t  tail_qty;  /** number elements in the last chunk **/
+	uint32_t  chunk_qty; /** number of chunks */
+} AlignId32List;
+typedef struct AlignIdList_struct {
+	AlignId32List **sub_list;
+	uint32_t        sub_list_count; 
+} AlignIdList;
+
+static uint64_t AlignId32ListCount(AlignId32List *l)
+{ return (l->chunk_qty>0)?ID_CHUNK_SZ*(l->chunk_qty-1)+ l->tail_qty:0;}
+
+static uint64_t AlignIdListCount(AlignIdList *l)
+{
+	uint64_t ret=0;
+	if(l){
+		uint32_t i;
+		for(i=0;i<l->sub_list_count;i++){
+			if(l->sub_list[i]){
+				ret += AlignId32ListCount(l->sub_list[i]);
+			}
+		}
+	}
+	return ret;
+}
+static uint64_t AlignIdListFlatCopy(AlignIdList *l,int64_t *buf,uint64_t num_elem,bool do_sort)
+{
+	uint64_t res=0;
+	uint32_t i,j;
+	AlignId32List* cl;
+	assert(l!=0);
+
+	if((cl = l->sub_list[0])!=NULL){
+		TChunk32* head  = cl->head;
+		while(head !=  cl->tail){
+			for(i=0;i<ID_CHUNK_SZ && res < num_elem;i++,res++){
+				buf[res] = head->id[i];
+			}
+			head = head->next;
+		}
+		for(i=0;i<cl->tail_qty && res < num_elem;i++,res++){
+			buf[res] = head->id[i];
+		}
+	}
+	for(j = 1; j< l->sub_list_count && res < num_elem;j++){
+		if((cl = l->sub_list[j])!=NULL){
+			TChunk32* head  = cl->head;
+			uint64_t  hi = ((uint64_t)j) << 32;
+			while(head !=  cl->tail){
+				for(i=0;i<ID_CHUNK_SZ && res < num_elem;i++,res++){
+					buf[res] = hi | head->id[i];
+				}
+				head = head->next;
+			}
+			for(i=0;i<cl->tail_qty && res < num_elem;i++,res++){
+				buf[res] = hi | head->id[i];
+			}
+		}
+	}
+	if(do_sort && res > 1) 
+		ksort_int64_t(buf,res);
+	return res;
+}
+
+static rc_t AlignId32ListAddId(AlignId32List *l,const uint32_t id)
+{
+	if(l->tail  == NULL){
+		l->head = l->tail = malloc(sizeof(*l->tail));
+		if(l->tail == NULL) return RC(rcAlign, rcTable, rcCommitting, rcMemory, rcExhausted);
+		l->chunk_qty =1;
+		l->tail_qty = 0;	
+	}
+	if(l->tail_qty == ID_CHUNK_SZ){/** chunk is full **/
+		l->tail->next = malloc(sizeof(*l->tail));
+		if(l->tail == NULL) return RC(rcAlign, rcTable, rcCommitting, rcMemory, rcExhausted);
+		l->tail = l->tail->next;
+		l->chunk_qty ++;
+		l->tail_qty = 0;	
+	}
+	l->tail->id[l->tail_qty++]=id;
+	return 0;
+}
+
+static rc_t AlignIdListAddId(AlignIdList *l,const int64_t id)
+{
+	uint32_t  sub_id,id32;
+	if(id < 0) return RC(rcAlign, rcTable, rcCommitting, rcId, rcOutofrange);
+	id32 = (uint32_t) id;
+	sub_id = id >> 32;
+	if(sub_id >= l->sub_list_count) return RC(rcAlign, rcTable, rcCommitting, rcId, rcOutofrange);
+	if(l->sub_list[sub_id] == NULL){
+		l->sub_list[sub_id] = calloc(1,sizeof(AlignId32List));
+		if(l->sub_list[sub_id] == NULL) return RC(rcAlign, rcTable, rcCommitting, rcMemory, rcExhausted);
+	}
+	return AlignId32ListAddId(l->sub_list[sub_id],id32);
+}
+
+static void AlignId32ListRelease(AlignId32List *l)
+{
+	if(l){
+		while(l->head != l->tail){
+			TChunk32* head = l->head;
+			l->head = l->head->next;
+			free(head);
+		}
+		free(l->head);
+		free(l);
+	}
+}
+static void AlignIdListRelease(AlignIdList *l)
+{
+        if(l){
+		uint32_t i;
+		for(i=0;i<l->sub_list_count;i++){
+			AlignId32ListRelease(l->sub_list[i]);
+		}
+		free(l->sub_list);
+		free(l);
+        }
+}
+
+
+typedef struct {
+    AlignIdList*	idlist;
+    ReferenceSeqCoverage cover;
+    INSDC_coord_len bin_seq_len;
+} TCover;
+
+static
+void ReferenceMgr_TCoverRelease(TCover* c)
+{
+	if(c){
+		AlignIdListRelease(c->idlist);
+		c->idlist = NULL;
+	}
+}
+static 
+rc_t ReferenceMgr_TCoverSetMaxId(TCover* c,int64_t id)
+{
+	uint32_t  sub_id;
+	if(id < 0) return RC(rcAlign, rcTable, rcCommitting, rcId, rcOutofrange);
+	sub_id = id >> 32;
+	if(c->idlist == NULL){
+		c->idlist = calloc(1,sizeof(AlignIdList));
+		if(c->idlist==NULL) return RC(rcAlign, rcTable, rcCommitting, rcMemory, rcExhausted);
+		c->idlist->sub_list_count = sub_id+1;
+		c->idlist->sub_list = calloc(c->idlist->sub_list_count,sizeof(c->idlist->sub_list[0]));
+		if(c->idlist->sub_list == NULL) return RC(rcAlign, rcTable, rcCommitting, rcMemory, rcExhausted);
+	} else {
+		return RC(rcAlign, rcTable, rcCommitting, rcParam, rcUnexpected);
+	}
+	return 0;
+}
+
+static
+rc_t CoverageGetSeqLen(ReferenceMgr const *const mgr, TCover data[], uint64_t const rows)
+{
+    TableReaderColumn acols[] =
+    {
+        {0, "(INSDC:coord:len)SEQ_LEN", {NULL}, 0, 0},
+        {0, NULL, {NULL}, 0, 0}
+    };
+    VTable const *tbl;
+    rc_t rc = VDatabaseOpenTableRead(mgr->db, &tbl, "REFERENCE");
+    
+    if (rc == 0) {
+        TableReader const *reader;
+        
+        rc = TableReader_Make(&reader, tbl, acols, 0);
+        if (rc == 0) {
+            uint64_t i;
+            
+            for (i = 0; i != rows; ++i) {
+                rc = TableReader_ReadRow(reader, i + 1);
+                if (rc == 0 && acols->len > 0)
+                    data[i].bin_seq_len = acols->base.coord_len[0];
+            }
+            TableReader_Whack(reader);
+        }
+        VTableRelease(tbl);
+    }
+    return rc;
+}
+
+static
+rc_t ReferenceMgr_ReCover(const ReferenceMgr* cself, uint64_t ref_rows, rc_t (*const quitting)(void))
+{
+    rc_t rc = 0;
+    uint64_t new_rows = 0;
+    const TableWriterRefCoverage* cover_writer = NULL;
+    
+    TableReaderColumn acols[] =
+    {
+        {0, "REF_ID", {NULL}, 0, 0},
+        {0, "REF_START", {NULL}, 0, 0},
+        {0, "CIGAR_LONG",{NULL}, 0, 0},
+        {0, "REF_POS",{NULL}, 0, 0},
+        {0, NULL, {NULL}, 0, 0}
+    };
+    const int64_t** al_ref_id = &acols[0].base.i64;
+    const INSDC_coord_zero** al_ref_start = &acols[1].base.coord0;
+    const TableReaderColumn* cigar =  &acols[2];
+    const INSDC_coord_zero** al_ref_pos = &acols[3].base.coord0;
+    /* order is important see ReferenceSeqCoverage struct */
+    struct {
+        const char* nm;
+	    const char* col;
+        bool ids_only;
+    } tbls[] = { {"PRIMARY_ALIGNMENT", "PRIMARY_ALIGNMENT_IDS",false},
+        {"SECONDARY_ALIGNMENT", "SECONDARY_ALIGNMENT_IDS",false},
+        {"EVIDENCE_INTERVAL", "EVIDENCE_INTERVAL_IDS", true} };
+	int tbls_qty=(sizeof(tbls)/sizeof(tbls[0]));
+    rc_t rc1 = 0;
+    int64_t rr;
+    uint32_t i;
+    uint8_t* hilo=NULL;
+    TCover* data = NULL;
+    
+    /* allocate mem for ref_rows of reference coverage*/
+    if((data = calloc(ref_rows, (sizeof(*data) + cself->max_seq_len))) == NULL) {
+		rc = RC(rcAlign, rcTable, rcCommitting, rcMemory, rcExhausted);
+    } else {
+		/** allocation for both data and hilo was done in 1 shot ***/
+		hilo = (uint8_t *)&data[ref_rows];
+        rc = CoverageGetSeqLen(cself, data, ref_rows);
+    }
+    /* grep through tables for coverage data */
+    ALIGN_R_DBG("covering REFERENCE rowid range [1:%ld]",ref_rows);
+    for(i = 0; rc == 0 && i < tbls_qty; i++) { /* TABLE LOOP STARTS */
+        const VTable* table = NULL;
+        const TableReader* reader = NULL;
+        int64_t al_from;
+        uint64_t al_qty;
+        
+        ALIGN_R_DBG("covering REFERENCE with %s", tbls[i].nm);
+        if((rc = VDatabaseOpenTableRead(cself->db, &table, "%s", tbls[i].nm)) != 0) {
+            if(GetRCState(rc) == rcNotFound) {
+                ALIGN_R_DBG("table %s was not found, ignored", tbls[i].nm);
+                rc = 0;
+                continue;
+            } else {
+                break;
+            }
+        }
+        if((rc = TableReader_Make(&reader, table, acols, cself->cache)) == 0 &&
+           (rc = TableReader_IdRange(reader, &al_from, &al_qty)) == 0) {
+            int64_t al_rowid;
+            
+            for(al_rowid = al_from; rc == 0 && al_rowid < al_from + al_qty; al_rowid++) {
+                if((rc = TableReader_ReadRow(reader, al_rowid)) != 0) {
+                    break;
+                }
+                rr    = **al_ref_id-1;
+                /**** Record ALIGNMENT_IDS ***/
+                if(  data[rr].idlist == NULL 
+                   && (rc = ReferenceMgr_TCoverSetMaxId(data+rr,al_from + al_qty))!=0){
+                    break; /*** out-of-memory ***/
+                }
+                if((rc = AlignIdListAddId(data[rr].idlist,al_rowid))!=0){
+                    break; /*** out-of-memory ***/
+                }
+                /**** Done alignment ids ***/
+                if(!tbls[i].ids_only) { /*** work on statistics ***/
+                    char const *c = cigar->base.str;
+                    const char *c_end = c + cigar->len;
+                    int64_t const global_ref_pos = rr*cself->max_seq_len + **al_ref_start; /** global_ref_start **/
+                    int64_t const global_refseq_start = global_ref_pos -  **al_ref_pos;   /** global_ref_start of current reference **/
+                    unsigned const bin_no = (unsigned)(global_ref_pos / cself->max_seq_len);
+                    TCover *const bin = &data[bin_no];
+                    uint8_t *const cov = &hilo[global_ref_pos];
+                    int64_t ref_offset = 0;
+                    int64_t max_ref_offset = 0;
+                    int64_t min_ref_offset = 0;
+                    int64_t j;
+
+                    while (rc == 0 && c < c_end) {
+                        int op_len = (int)strtol(c, (char **)&c, 10);
+                        int const op = *c++;
+                        
+                        switch (op){
+                        case 'I':/* extra bases in the read **/
+                            ++bin->cover.indels;
+                        case 'S':/* skip in the read */
+                            break;
+                        case 'B':/* back up in the sequence */
+                            if (ref_offset > op_len)
+                                ref_offset -= op_len;
+                            else
+                                ref_offset = 0;
+                            break;
+                        case 'D': /** delete in the reference ***/
+                            ++bin->cover.indels;
+                        case 'N': /** expected skip in the reference ***/
+                            ref_offset += op_len;
+                            break;
+                        case 'X':
+                            bin->cover.mismatches += op_len;
+                        case '=':
+                            ref_offset += op_len;
+                            break;
+                        default:
+                            rc = RC(rcAlign, rcTable, rcCommitting, rcData, rcUnrecognized);
+                        }
+                        if (min_ref_offset > ref_offset)
+                            min_ref_offset = ref_offset;
+                        if (max_ref_offset < ref_offset)
+                            max_ref_offset = ref_offset;
+                    }
+                    for (j = min_ref_offset; j < max_ref_offset; ++j) {
+                        unsigned const hl = cov[j];
+                        
+                        if (hl < UINT8_MAX)
+                            cov[j] = hl + 1;
+                    }
+                    /*** check if OVERLAPS are needed ***/
+                    {
+                        int64_t min_rr = (global_ref_pos + min_ref_offset)/cself->max_seq_len;
+                        int64_t max_rr = (global_ref_pos + max_ref_offset)/cself->max_seq_len;
+                        
+                        if(min_rr < 0) min_rr = 0;
+                        if(max_rr >= ref_rows) max_rr = ref_rows -1;
+                        
+                        assert(min_rr<= max_rr);
+                        
+                        if(min_rr < max_rr){
+                            int64_t  overlap_ref_pos; /** relative the beginning of the reference **/
+                            uint32_t overlap_ref_len = (global_ref_pos + max_ref_offset) % cself->max_seq_len ;
+                            
+                            min_rr++;
+                            if (global_ref_pos + min_ref_offset > global_refseq_start) {
+                                overlap_ref_pos = global_ref_pos + min_ref_offset - global_refseq_start;
+                            }
+                            else {
+                                overlap_ref_pos = 1;
+                            }
+                            for (; min_rr < max_rr; ++min_rr) {
+                                if (  data[min_rr].cover.overlap_ref_pos[i] == 0 /*** NOT SET***/
+                                    || overlap_ref_pos < data[min_rr].cover.overlap_ref_pos[i])
+                                {
+									data[min_rr].cover.overlap_ref_pos[i] = (INSDC_coord_zero)overlap_ref_pos;
+                                }
+                                data[min_rr].cover.overlap_ref_len[i] = cself->max_seq_len; /*** in between chunks get full length of overlap **/
+                            }
+                            if (  data[min_rr].cover.overlap_ref_pos[i] == 0
+                                || overlap_ref_pos < data[min_rr].cover.overlap_ref_pos[i])
+                            {
+								data[min_rr].cover.overlap_ref_pos[i] = (INSDC_coord_zero)overlap_ref_pos;
+                            }
+                            if (overlap_ref_len > data[min_rr].cover.overlap_ref_len[i])
+								data[min_rr].cover.overlap_ref_len[i] = overlap_ref_len;
+                        }
+                    }
+                } /**** DONE WITH WORK ON STATISTICS ***/
+                ALIGN_DBGERR(rc);
+                rc = rc ? rc : quitting();
+            }
+		    /*** HAVE TO RELEASE **/
+		    TableReader_Whack(reader);
+		    VTableRelease(table);
+		    /*** NOW SAVE AND RELEASE THE COLUMN ***/
+		    if((rc = TableWriterRefCoverage_MakeIds(&cover_writer, cself->db, tbls[i].col)) == 0) {
+                for(rr=0; rc ==0 &&  rr < ref_rows; rr ++){
+                    uint64_t num_elem = AlignIdListCount(data[rr].idlist);
+                    uint64_t num_elem_copied = 0;
+                    if(num_elem > 0){
+#define BUF_STACK_COUNT 128 * 1024
+                        int64_t buf_stack[BUF_STACK_COUNT];
+                        int64_t *buf_alloc = NULL;
+                        int64_t *buf = buf_stack;
+                        if(num_elem > BUF_STACK_COUNT){
+                            buf=buf_alloc=malloc(num_elem*sizeof(buf[0]));
+                            if(buf_alloc == NULL) 
+                                rc = RC(rcAlign, rcTable, rcCommitting, rcMemory, rcExhausted);
+                        }
+                        if(rc == 0){
+                            num_elem_copied = AlignIdListFlatCopy(data[rr].idlist,buf,num_elem,true);
+                            assert(num_elem == num_elem_copied);
+                        }
+                        ReferenceMgr_TCoverRelease(data+rr); /** release memory ***/
+                        if(rc == 0){
+                            rc = TableWriterRefCoverage_WriteIds(cover_writer, rr+1, buf, (uint32_t)num_elem);
+                        }
+                        if(buf_alloc) free(buf_alloc);
+                    } else {
+                        rc = TableWriterRefCoverage_WriteIds(cover_writer, rr+1, NULL,0);
+                    }
+                }
+                if(rc == 0){
+                    rc = TableWriterRefCoverage_Whack(cover_writer, rc == 0, &new_rows);
+                    if(rc == 0  && ref_rows != new_rows) {
+                        rc = RC(rcAlign, rcTable, rcCommitting, rcData, rcInconsistent);
+                    }
+                }
+                ALIGN_DBGERR(rc);
+		    }
+		} else {
+			TableReader_Whack(reader);
+			VTableRelease(table);
+		}
+	}/* TABLE LOOP ENDS **/
+    /* prep and write coverage data */
+	if(rc == 0) {
+        uint64_t k;
+        
+		rc = TableWriterRefCoverage_MakeCoverage(&cover_writer, cself->db, 0);
+		for (rr = 0, k = 0; rc == 0 && rr != ref_rows; ++rr, k += cself->max_seq_len) {
+            unsigned hi = 0;
+            unsigned lo = 255;
+            
+		    for (i = 0; i != data[rr].bin_seq_len; ++i) {
+                unsigned const depth = hilo[k + i];
+                
+                if (hi < depth) hi = depth;
+                if (lo > depth) lo = depth;
+		    }
+            data[rr].cover.high = hi;
+            data[rr].cover.low  = lo;
+		    rc = TableWriterRefCoverage_WriteCoverage(cover_writer,rr+1, &data[rr].cover);
+		}
+		free(data);
+		rc1 = TableWriterRefCoverage_Whack(cover_writer, rc == 0, &new_rows);
+		rc = rc ? rc : rc1;
+		if(rc == 0 && ref_rows != new_rows) {
+		    rc = RC(rcAlign, rcTable, rcCommitting, rcData, rcInconsistent);
+		}
+	}
+    ALIGN_DBGERR(rc);
+	return rc;
+}
+
+LIB_EXPORT rc_t CC ReferenceMgr_Release(const ReferenceMgr *cself,
+                                        const bool commit,
+                                        uint64_t *const Rows,
+                                        const bool build_coverage,
+                                        rc_t (*const quitting)(void)
+                                       )
+{
+    rc_t rc = 0;
+
+    if (cself != NULL) {
+        ReferenceMgr *const self = (ReferenceMgr *)cself;
+        uint64_t rows = 0;
+        unsigned i;
+
+        rc = TableWriterRef_Whack(self->writer, commit, &rows);
+        if (Rows) *Rows = rows;
+        KDirectoryRelease(self->dir);
+
+        for (i = 0; i != self->refSeqs.elem_count; ++i)
+            ReferenceSeq_Whack(&self->refSeq[i]);
+
+        KDataBufferWhack(&self->compress);
+        KDataBufferWhack(&self->seq);
+        KDataBufferWhack(&self->refSeqs);
+
+        if (rc == 0 && build_coverage && commit && rows > 0)
+            rc = ReferenceMgr_ReCover(cself, rows, quitting);
+#if 0 
+        {
+            VTable* t = NULL;
+            
+            if (VDatabaseOpenTableUpdate(self->db, &t, "SECONDARY_ALIGNMENT") == 0) {
+                VTableDropColumn(t, "TMP_MISMATCH");
+                VTableDropColumn(t, "TMP_HAS_MISMATCH");
+            }
+            VTableRelease(t);
+        }
+#endif
+        VDatabaseRelease(self->db);
+        RefSeqMgr_Release(self->rmgr);
+        free(self);
+    }
+    return rc;
+}
+
+static
+rc_t ReferenceSeq_ReadDirect(ReferenceSeq *self,
+                             int offset,
+                             unsigned const len,
+                             bool read_circular,
+                             uint8_t buffer[],
+                             unsigned* written,
+                             bool force_linear)
+{
+    *written = 0;
+    if (len == 0)
+        return 0;
+    
+    if (read_circular || self->circular) {
+        if (offset < 0) {
+            unsigned const n = (-offset) / self->seq_len;
+            offset = (self->seq_len * (n + 1) + offset) % self->seq_len;
+        }
+        else if (offset > self->seq_len)
+            offset %= self->seq_len;
+    }
+    else if (offset >= self->seq_len)
+        return RC(rcAlign, rcType, rcReading, rcOffset, rcOutofrange);
+    
+    if (self->type == rst_local) {
+        uint8_t const *const src = self->u.local.buf.base;
+        unsigned dst_off = 0;
+        
+        while (dst_off < len) {
+            unsigned const writable = len - dst_off;
+            unsigned const readable = self->seq_len - offset;
+            unsigned const to_write = readable < writable ? readable : writable;
+            
+            memmove(&buffer[dst_off], &src[offset], to_write);
+            *written += to_write;
+            if (!self->circular)
+                break;
+            offset = 0;
+            dst_off += to_write;
+        }
+        return 0;
+    }
+    else if (self->type == rst_refSeqById || self->type == rst_refSeqBySeqId) {
+        unsigned to_write = len;
+        
+        if (!self->circular || force_linear) {
+            unsigned const readable = self->seq_len - offset;
+            
+            if (to_write > readable)
+                to_write = readable;
+        }
+        return RefSeq_Read(self->u.refseq, offset, to_write, buffer, written);
+    }
+    return RC(rcAlign, rcType, rcReading, rcType, rcInvalid);
+}
+
+static
+rc_t ReferenceMgr_LoadSeq(ReferenceMgr *const self, ReferenceSeq *obj)
+{
+    KDataBuffer readBuf;
+    rc_t rc = KDataBufferMake(&readBuf, 8, self->max_seq_len);
+    
+    if (rc == 0) {
+        char const *const id = obj->id;
+        char const *const seqId = obj->seqId ? obj->seqId : id;
+        TableWriterRefData data;
+        INSDC_coord_zero offset = 0;
+        
+        obj->start_rowid = self->ref_rowid + 1;
+        data.name.buffer = id;
+        data.name.elements = string_size(id);
+        data.read.buffer = readBuf.base;
+        data.seq_id.buffer = seqId;
+        data.seq_id.elements = string_size(seqId);
+        data.force_READ_write = obj->type == rst_local || (self->options & ewrefmgr_co_allREADs);
+        data.circular = obj->circular;
+        
+        if (self->writer == NULL) {
+            uint32_t wopt = 0;
+            
+            wopt |= (self->options & ewrefmgr_co_allREADs) ? ewref_co_SaveRead : 0;
+            wopt |= (self->options & ewrefmgr_co_Coverage) ? ewref_co_Coverage : 0;
+            if((rc = TableWriterRef_Make(&self->writer, self->db, wopt)) == 0) {
+                TableWriterData mlen;
+                
+                mlen.buffer = &self->max_seq_len;
+                mlen.elements = 1;
+                rc = TableWriterRef_WriteDefaultData(self->writer, ewrefd_cn_MAX_SEQ_LEN, &mlen);
+            }
+        }
+        while (rc == 0 && offset < obj->seq_len) {
+            unsigned row_len;
+            
+            rc = ReferenceSeq_ReadDirect(obj, offset, self->max_seq_len, false,
+                                         readBuf.base, &row_len, true);
+            if (rc != 0 || row_len == 0) break;
+            
+            data.read.elements = row_len;
+            rc = TableWriterRef_Write(self->writer, &data, NULL);
+            offset += row_len;
+            ++self->ref_rowid;
+        }
+        KDataBufferWhack(&readBuf);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC ReferenceMgr_GetSeq(ReferenceMgr const *const cself,
+                                       ReferenceSeq const **const seq,
+                                       const char *const id,
+                                       bool *const shouldUnmap,
+                                       bool const allowMultiMapping,
+                                       bool wasRenamed[])
+{
+    ReferenceMgr *const self = (ReferenceMgr *)cself;
+    
+    if  (self == NULL || seq == NULL || id == NULL)
+        return RC(rcAlign, rcFile, rcConstructing, rcParam, rcNull);
+    
+    *seq = NULL;
+    *shouldUnmap = false;
+    {
+        ReferenceSeq *obj;
+        rc_t rc = ReferenceMgr_OpenSeq(self, &obj, id, 0, NULL, allowMultiMapping, wasRenamed);
+        
+        if (rc) return rc;
+        if (obj->type == rst_unmapped) {
+            *shouldUnmap = true;
+            return 0;
+        }
+        if (obj->start_rowid == 0) {
+            rc = ReferenceMgr_LoadSeq(self, obj);
+            if (rc) return rc;
+        }
+        *seq = obj;
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC ReferenceMgr_Verify(ReferenceMgr const *const cself,
+                                       char const id[],
+                                       INSDC_coord_len const length,
+                                       uint8_t const md5[16],
+                                       bool const allowMultiMapping,
+                                       bool wasRenamed[])
+{
+    if (cself == NULL || id == NULL)
+        return RC(rcAlign, rcFile, rcValidating, rcParam, rcNull);
+    {
+        ReferenceMgr *self = (ReferenceMgr *)cself;
+        ReferenceSeq *rseq;
+        rc_t rc = ReferenceMgr_OpenSeq(self, &rseq, id, length, md5, allowMultiMapping, wasRenamed);
+        
+        if (rc) return rc;
+        if (rseq->seq_len != length) {
+            rc = RC(rcAlign, rcFile, rcValidating, rcSize, rcUnequal);
+            ALIGN_DBGERRP("%s->%s SEQ_LEN verification", rc, id, rseq->seqId);
+        }
+        if (md5 && memcmp(md5, rseq->md5, sizeof(rseq->md5)) != 0) {
+            unsigned i;
+            
+            rc = RC(rcAlign, rcTable, rcValidating, rcChecksum, rcUnequal);
+            ALIGN_DBGERRP("%s->%s MD5 verification", rc, id, rseq->seqId);
+            ALIGN_DBGF((" found '"));
+            for(i = 0; i < sizeof(rseq->md5); i++) {
+                ALIGN_DBGF(("%02hx", rseq->md5[i]));
+            }
+            ALIGN_DBGF(("'  != requested '"));
+            for(i = 0; i < sizeof(rseq->md5); i++) {
+                ALIGN_DBGF(("%02hx", md5[i]));
+            }
+            ALIGN_DBGF(("'\n"));
+        } else {
+            ALIGN_DBG("%s->%s MD5 verification ok", id, rseq->seqId);
+        }
+        if(rc == 0) {
+            ALIGN_DBG("%s verification ok", id);
+        } else {
+            ALIGN_DBGERRP("%s verification", rc, id);
+        }
+        return rc;
+    }
+}
+
+LIB_EXPORT rc_t CC ReferenceMgr_FastaPath(const ReferenceMgr* cself, const char* fasta_path)
+{
+    rc_t rc = 0;
+    KDirectory* dir;
+
+    if(cself == NULL || fasta_path == NULL) {
+        rc = RC(rcAlign, rcFile, rcConstructing, rcParam, rcNull);
+    } else if((rc = KDirectoryNativeDir(&dir)) == 0) {
+        const KFile* kf;
+        if((rc = KDirectoryOpenFileRead(dir, &kf, "%s", fasta_path)) == 0) {
+            rc = ReferenceMgr_FastaFile(cself, kf);
+            KFileRelease(kf);
+        }
+        KDirectoryRelease(dir);
+    }
+    ALIGN_DBGERRP("from file %s", rc, fasta_path);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC ReferenceMgr_FastaFile(const ReferenceMgr* cself, const KFile* file)
+{
+    if(cself == NULL || file == NULL) {
+        return RC(rcAlign, rcFile, rcConstructing, rcParam, rcNull);
+    }
+    return ImportFastaFile((ReferenceMgr *)cself, file, NULL);
+}
+
+typedef struct {
+    unsigned length: 28, gentype:4, type: 8, code: 8;
+} cigar_bin_t;
+
+static
+rc_t cigar2offset_2(unsigned const cigar_len,
+                    cigar_bin_t const cigar[],
+                    unsigned const out_sz,
+                    unsigned const out_used,
+                    compress_buffer_t out_offset[],
+                    INSDC_coord_len out_seq_len[],
+                    INSDC_coord_len out_ref_len[],
+                    INSDC_coord_len out_max_ref_len[])
+{
+    unsigned i;
+    INSDC_coord_len seq_len = 0;
+    INSDC_coord_len ref_len = 0;
+    INSDC_coord_len max_ref_len = 0;
+    
+    for (i = 0; i < cigar_len; ++i) {
+        unsigned const op_len = cigar[i].length;
+        char const op = cigar[i].code;
+        uint8_t const type = cigar[i].type;
+        
+        switch(op) {
+            case 'M':
+            case '=':
+            case 'X':
+                seq_len += op_len;
+                ref_len += op_len;
+                if(max_ref_len < ref_len)
+                    max_ref_len = ref_len;
+                break;
+            case 'B':
+                /* Complete Genomics CIGAR style specific:
+                 overlap between consecutive reads
+                 ex: sequence 6 bases: ACACTG, reference 2 bases: ACTG,
+                 cigar will be: 2M2B2M
+                 no need to move sequence position
+                 */
+            case 'S':
+            case 'I':
+                if (seq_len < out_sz) {
+                    out_offset[seq_len].length = -op_len;
+                    out_offset[seq_len].type   = type;
+                    ALIGN_C_DBGF(("%s:%u: seq_pos: %u, ref_pos: %u, offset: %i\n", __func__, __LINE__, seq_len, ref_len, -op_len));
+                    if (op == 'B') ref_len -= op_len;
+                    else           seq_len += op_len;
+                }
+                else
+                    return RC(rcAlign, rcFile, rcProcessing, rcData, rcInconsistent);
+                break;
+            case 'N':
+            case 'D':
+                if (seq_len < out_sz) {
+                    out_offset[seq_len].length = op_len;
+                    out_offset[seq_len].type   = type;
+                    ALIGN_C_DBGF(("%s:%u: seq_pos: %u, ref_pos: %u, offset: %i\n", __func__, __LINE__, seq_len, ref_len, op_len));
+                }
+                else {
+                    out_offset[seq_len-1].length = op_len;
+                    out_offset[seq_len-1].type   = type;
+                    ALIGN_C_DBGF(("%s:%u: seq_pos: %u, ref_pos: %u, offset: %i\n", __func__, __LINE__, seq_len-1, ref_len, op_len));
+                }
+                ref_len += op_len;
+                if(max_ref_len < ref_len)
+                    max_ref_len = ref_len;
+                break;
+            default:
+                break;
+        }
+    }
+    out_seq_len[0] = seq_len;
+    out_ref_len[0] = ref_len;
+    out_max_ref_len[0] = max_ref_len;
+    
+    ALIGN_C_DBGF(("%s:%u: SEQLEN: %u, REFLEN: %u, MAXREFLEN: %u\n", __func__, __LINE__, seq_len, ref_len, max_ref_len));
+    
+    return 0;
+}
+
+static char const cigar_op_codes[] = "MIDNSHP=XB";
+
+static NCBI_align_ro_type const cigar_op_types[] = {
+    NCBI_align_ro_normal,			/* M */
+    NCBI_align_ro_normal,			/* I */
+    NCBI_align_ro_normal,			/* D */
+    NCBI_align_ro_intron_unknown,	/* N */
+    NCBI_align_ro_soft_clip,		/* S */
+    NCBI_align_ro_normal,			/* H */
+    NCBI_align_ro_normal,			/* P */
+    NCBI_align_ro_normal,			/* = */
+    NCBI_align_ro_normal,			/* X */
+    NCBI_align_ro_complete_genomics	/* B */
+};
+
+enum {
+    gen_match_type,
+    gen_insert_type,
+    gen_delete_type,
+    gen_ignore_type
+};
+
+static int const cigar_op_gentypes[] = {
+    gen_match_type,			/* M */
+    gen_insert_type,		/* I */
+    gen_delete_type,		/* D */
+    gen_delete_type,		/* N */
+    gen_insert_type,		/* S */
+    gen_ignore_type,		/* H */
+    gen_ignore_type,		/* P */
+    gen_match_type,			/* = */
+    gen_match_type,			/* X */
+    gen_insert_type			/* B */
+};
+
+static
+rc_t cigar_bin(cigar_bin_t cigar[],
+               unsigned const cigar_len,
+               void const *cigar_in)
+{
+    unsigned i;
+    uint32_t const *const cigar_bin = cigar_in;
+    
+    ALIGN_C_DBGF(("%s:%u: '", __func__, __LINE__));
+    for (i = 0; i < cigar_len; ++i) {
+        uint32_t c;
+        
+        memmove(&c, cigar_bin + i, 4);
+        {
+            int const op = c & 0x0F;
+            int const len = c >> 4;
+            
+            if (op >= sizeof(cigar_op_codes)) {
+                rc_t const rc = RC(rcAlign, rcFile, rcProcessing, rcData, rcUnrecognized);
+                (void)PLOGERR(klogErr, (klogErr, rc, "Invalid or unrecognized CIGAR operation (binary code: $(opbin))", "opbin=%u", op));
+                return rc;
+            }
+            ALIGN_C_DBGF(("%u%c", len, cigar_op_codes[op]));
+            cigar[i].length = len;
+            cigar[i].code = cigar_op_codes[op];
+            cigar[i].type = cigar_op_types[op];
+            cigar[i].gentype = cigar_op_gentypes[op];
+        }
+    }
+    ALIGN_C_DBGF(("'[%u]\n", cigar_len));
+    return 0;
+}
+
+static
+rc_t cigar_string(cigar_bin_t cigar[],
+                  unsigned const cigar_len,
+                  void const *cigar_in)
+{
+    unsigned i;
+    unsigned j;
+    char const *const cigar_string = cigar_in;
+    
+    ALIGN_C_DBGF(("%s:%u: '%s'[%u]\n", __func__, __LINE__, cigar_in, cigar_len));
+    for (i = j = 0; j < cigar_len; ++j) {
+        int len = 0;
+        
+        for (; ;) {
+            int const ch = cigar_string[i++];
+            
+            if (isdigit(ch))
+                len = (len * 10) + (ch - '0');
+            else {
+                int op;
+                
+                for (op = 0; op < sizeof(cigar_op_codes); ++op) {
+                    if (ch == cigar_op_codes[op])
+                        break;
+                }
+                if (op == sizeof(cigar_op_codes)) {
+                    rc_t const rc = RC(rcAlign, rcFile, rcProcessing, rcData, rcUnrecognized);
+                    (void)PLOGERR(klogErr, (klogErr, rc, "Invalid or unrecognized CIGAR operation '$(opcode)'", "opcode=%c", ch));
+                    return rc;
+                }
+                cigar[j].length = len;
+                cigar[j].code = cigar_op_codes[op];
+                cigar[j].type = cigar_op_types[op];
+                cigar[j].gentype = cigar_op_gentypes[op];
+                break;
+            }
+        }
+    }
+    return 0;
+}
+
+static int cigar_string_op_count(char const cigar[])
+{
+    unsigned n = 0;
+    int st = 0;
+    int i = 0;
+    
+    for (; ;) {
+        int const ch = cigar[i];
+        
+        if (ch == '\0')
+        break;
+        
+        switch (st) {
+            case 0:
+                if (!isdigit(ch))
+                return -1;
+                ++st;
+                break;
+            case 1:
+                if (!isdigit(ch)) {
+                    ++n;
+                    --st;
+                }
+                break;
+        }
+        ++i;
+    }
+    return st == 0 ? n : -1;
+}
+
+static unsigned cigar_remove_ignored(unsigned opcount, cigar_bin_t cigar[])
+{
+    unsigned i = opcount;
+    
+    while (i) {
+        unsigned const oi = i;
+        unsigned const type = cigar[--i].gentype;
+        
+        if (type == gen_ignore_type) {
+            memmove(cigar + i, cigar + oi, (opcount - oi) * sizeof(cigar[0]));
+            --opcount;
+        }
+    }
+    return opcount;
+}
+
+static
+rc_t cigar2offset(int const options,
+                  unsigned const cigar_len,
+                  void const *in_cigar,
+                  unsigned const out_sz,
+                  unsigned const out_used,
+                  uint8_t const intron_type,
+                  compress_buffer_t out_offset[],
+                  INSDC_coord_len out_seq_len[],
+                  INSDC_coord_len out_ref_len[],
+                  INSDC_coord_len out_max_ref_len[],
+                  INSDC_coord_len out_adjust[])
+{
+    bool const binary = (options & ewrefmgr_cmp_Binary) ? true : false;
+    int const maxopcount = binary ? cigar_len : cigar_string_op_count(in_cigar);
+
+    memset(out_offset, 0, out_used * sizeof(*out_offset));
+    
+    if (maxopcount > 0) {
+        cigar_bin_t  scigar[256];
+        cigar_bin_t *hcigar = NULL;
+        cigar_bin_t *cigar = scigar;
+        
+        if (maxopcount > sizeof(scigar)/sizeof(scigar[0])) {
+            hcigar = malloc(maxopcount * sizeof(hcigar[0]));
+            
+            if (hcigar == NULL) {
+                rc_t const rc = RC(rcAlign, rcFile, rcProcessing, rcMemory, rcExhausted);
+                (void)PLOGERR(klogErr, (klogErr, rc, "out of memory trying to allocate $(bytes) bytes for CIGAR operations", "bytes=%u", (unsigned)(maxopcount * sizeof(hcigar[0]))));
+                return rc;
+            }
+            cigar = hcigar;
+        }
+        {
+            rc_t const rc = (binary ? cigar_bin : cigar_string)(cigar,
+                                                                maxopcount,
+                                                                in_cigar);
+            if (rc)
+                return rc;
+        }
+        /* check for hard clipping if not accepted */
+        if ((options & ewrefmgr_co_AcceptHardClip) == 0) {
+            unsigned i;
+
+            for (i = 0; i < maxopcount; ++i) {
+                if (cigar[i].code == 'H') {
+                    rc_t const rc = RC(rcAlign, rcFile, rcProcessing, rcData, rcNotAvailable);
+                    (void)LOGERR(klogErr, rc, "Hard clipping of sequence data is not allowed");
+                    return rc;
+                }
+            }
+        }
+        {
+            unsigned first = 0;
+            unsigned opcount = cigar_remove_ignored(maxopcount, cigar);
+            
+            out_adjust[0] = 0;
+            if ((options & ewrefmgr_cmp_Exact) == 0) {
+                /* remove any leading delete operations */
+                for (first = 0; first < opcount; ++first) {
+                    if (cigar[first].gentype != gen_delete_type)
+                        break;
+                    out_adjust[0] += cigar[first].length;
+                }
+                /* make sure any adjacent deletes and inserts are ordered so that
+                 * the delete follows the insert
+                 */
+                {
+                    unsigned i;
+#if 1
+                    for (i = first; i < opcount - 1; ) {
+                        cigar_bin_t const cur = cigar[i + 0];
+                        cigar_bin_t const nxt = cigar[i + 1];
+                        
+                        if (cur.gentype != gen_delete_type)
+                            ;
+                        else if (nxt.gentype == gen_delete_type) {
+                            unsigned const type = (cur.type == NCBI_align_ro_normal && nxt.type == NCBI_align_ro_normal) ? NCBI_align_ro_normal : NCBI_align_ro_intron_unknown;
+                            int const code = type == NCBI_align_ro_normal ? 'D' : 'N';
+                            unsigned const length = cur.length + nxt.length;
+                            
+                            --opcount;
+                            memmove(cigar + i, cigar + i + 1, (opcount - i) * sizeof(cigar[0]));
+                            
+                            cigar[i].type = type;
+                            cigar[i].code = code;
+                            cigar[i].length = length;
+
+                            continue;
+                        }
+                        else if (nxt.gentype == gen_insert_type) {
+                            if (nxt.type == NCBI_align_ro_complete_genomics) {
+                                assert(i + 2 < opcount);
+                                cigar[i + 0] = nxt;
+                                cigar[i + 1] = cigar[i + 2];
+                                cigar[i + 2] = cur;
+                                ++i;
+                            }
+                            else {
+                                cigar[i + 0] = nxt;
+                                cigar[i + 1] = cur;
+                            }
+                        }
+                        ++i;
+                    }
+#else
+                    for (i = first + 1; i < opcount; ) {
+                        if (cigar[i].gentype == gen_insert_type && cigar[i-1].gentype == gen_delete_type) {
+                            cigar_bin_t const prv = cigar[i - 1];
+                            cigar_bin_t const cur = cigar[i];
+                            
+                            cigar[  i] = prv;
+                            cigar[--i] = cur;
+                            if (i <= first + 1)
+                                i  = first + 1;
+                        }
+                        else
+                            ++i;
+                    }
+#endif
+                }
+                /* merge adjacent delete type operations D+D -> D else becomes N */
+                {
+                    unsigned i;
+                    
+                    for (i = first + 1; i < opcount;) {
+                        if (cigar[i].gentype == gen_delete_type && cigar[i-1].gentype == gen_delete_type) {
+                            cigar[i].length += cigar[i-1].length;
+                            if (cigar[i].type == NCBI_align_ro_normal && cigar[i-1].type == NCBI_align_ro_normal) {
+                                cigar[i].type = NCBI_align_ro_normal;
+                                cigar[i].code = 'D';
+                            }
+                            else {
+                                cigar[i].type = NCBI_align_ro_intron_unknown;
+                                cigar[i].code = 'N';
+                            }
+                            memmove(cigar + i - 1, cigar + i, (opcount - i) * sizeof(cigar[0]));
+                            --opcount;
+                        }
+                        else
+                            ++i;
+                    }
+                }
+            }
+            /* remove any ignored operations */
+            {
+                unsigned i = opcount;
+                
+                while (i) {
+                    unsigned const oi = i;
+                    cigar_bin_t const op = cigar[--i];
+                    
+                    if (op.gentype == gen_ignore_type) {
+                        memmove(cigar + i, cigar + oi, (opcount - oi) * sizeof(cigar[0]));
+                        --opcount;
+                    }
+                }
+            }
+            /* make the intron the known type */
+            {
+                unsigned i;
+                
+                for (i = first; i < opcount; ++i) {
+                    if (cigar[i].type == NCBI_align_ro_intron_unknown)
+                        cigar[i].type = intron_type;
+                }
+            }
+            {
+                rc_t const rc = cigar2offset_2(opcount - first,
+                                               cigar + first,
+                                               out_sz,
+                                               out_used,
+                                               out_offset,
+                                               out_seq_len,
+                                               out_ref_len,
+                                               out_max_ref_len);
+                if (hcigar)
+                    free(hcigar);
+                return rc;
+            }
+        }
+        {
+        }
+    }
+    else {
+        rc_t const rc = RC(rcAlign, rcFile, rcProcessing, rcData, rcUnrecognized);
+        (void)PLOGERR(klogErr, (klogErr, rc, "Invalid CIGAR string '$(cigar)'", "cigar=%s", in_cigar));
+        return rc;
+    }
+}
+
+LIB_EXPORT rc_t CC ReferenceSeq_TranslateOffset_int(ReferenceSeq const *const cself,
+                                                    INSDC_coord_zero const offset,
+                                                    int64_t *const ref_id,
+                                                    INSDC_coord_zero *const ref_start,
+                                                    uint64_t *const global_ref_start)
+{
+    if(cself == NULL)
+        return RC(rcAlign, rcFile, rcProcessing, rcSelf, rcNull);
+        
+    if (ref_id)
+        *ref_id = cself->start_rowid + offset / cself->mgr->max_seq_len;
+    
+    if (ref_start)
+        *ref_start = offset % cself->mgr->max_seq_len;
+    
+    if (global_ref_start)
+        *global_ref_start = (cself->start_rowid - 1) * cself->mgr->max_seq_len + offset;
+        
+    return 0;
+}
+
+LIB_EXPORT rc_t CC ReferenceMgr_Compress(const ReferenceMgr* cself,
+                                         uint32_t options,
+                                         const char* id,
+                                         INSDC_coord_zero offset,
+                                         const char* seq,
+                                         INSDC_coord_len seq_len,
+                                         const void* cigar,
+                                         uint32_t cigar_len,
+                                         INSDC_coord_zero allele_offset,
+                                         const char* allele,
+                                         INSDC_coord_len allele_len,
+                                         INSDC_coord_zero offset_in_allele,
+                                         const void* allele_cigar,
+                                         uint32_t allele_cigar_len,
+                                         uint8_t const rna_orient,
+                                         TableWriterAlgnData* data)
+{
+    rc_t rc = 0;
+    bool shouldUnmap = false;
+    bool wasRenamed = false;
+    const ReferenceSeq* refseq;
+
+    if(cself == NULL || id == NULL) {
+        rc = RC(rcAlign, rcFile, rcProcessing, rcParam, rcNull);
+    }
+    else if((rc = ReferenceMgr_GetSeq(cself, &refseq, id, &shouldUnmap, false, &wasRenamed)) == 0) {
+        assert(shouldUnmap == false);
+        assert(wasRenamed == false);
+        rc = ReferenceSeq_Compress(refseq, options, offset, seq, seq_len, cigar, cigar_len,
+                                   allele_offset, allele, allele_len,offset_in_allele,
+                                   allele_cigar, allele_cigar_len, rna_orient, data);
+        ReferenceSeq_Release(refseq);
+    }
+    ALIGN_C_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC ReferenceSeq_Compress(ReferenceSeq const *const cself,
+                                         uint32_t options,
+                                         INSDC_coord_zero offset,
+                                         const char* seq, INSDC_coord_len seq_len,
+                                         const void* cigar, uint32_t cigar_len,
+                                         INSDC_coord_zero allele_offset, const char* allele,
+                                         INSDC_coord_len allele_len,
+                                         INSDC_coord_zero offset_in_allele,
+                                         const void* allele_cigar, uint32_t allele_cigar_len,
+                                         uint8_t const rna_orient,
+                                         TableWriterAlgnData* data)
+{
+    rc_t rc = 0;
+    ReferenceSeq *const self = (ReferenceSeq *)cself;
+
+    if (self == NULL || seq == NULL || cigar == NULL || cigar_len == 0 || data == NULL ||
+        (!(allele == NULL && allele_len == 0 && allele_cigar == NULL && allele_cigar_len == 0) &&
+         !(allele != NULL && allele_cigar != NULL && allele_cigar_len != 0)))
+    {
+        return RC(rcAlign, rcFile, rcProcessing, rcParam, rcInvalid);
+    }
+
+    if (seq_len > self->mgr->compress.elem_count) {
+        rc = KDataBufferResize(&self->mgr->compress, seq_len);
+        if (rc) return rc;
+    }
+    {
+        INSDC_coord_len i, seq_pos = 0, allele_ref_end = 0, ref_len = 0, rl = 0, max_rl = 0;
+        INSDC_coord_zero* read_start = &((INSDC_coord_zero*)(data->read_start.buffer))[data->ploidy];
+        INSDC_coord_len* read_len = &((INSDC_coord_len*)(data->read_len.buffer))[data->ploidy];
+        bool* has_ref_offset, *has_mismatch;
+        int32_t *const ref_offset       = (int32_t *)data->ref_offset.buffer;
+        uint8_t *const ref_offset_type  = (uint8_t *)data->ref_offset_type.buffer;
+        uint8_t *mismatch;
+        uint8_t sref_buf[64 * 1024];
+        void *href_buf = NULL;
+        uint8_t *ref_buf = sref_buf;
+        compress_buffer_t allele_off_buf[1024];
+        INSDC_coord_len position_adjust = 0;
+#if _DEBUGGING
+        uint64_t i_ref_offset_elements, i_mismatch_elements;
+        char x[4096];
+#endif
+
+        if(data->ploidy == 0) {
+            data->has_ref_offset.elements = seq_len;
+            data->ref_offset.elements = 0;
+            data->has_mismatch.elements = seq_len;
+            data->mismatch.elements = 0;
+            *read_start = 0;
+        }
+        else {
+            data->has_ref_offset.elements += seq_len;
+            data->has_mismatch.elements += seq_len;
+            *read_start = read_start[-1] + read_len[-1];
+        }
+        *read_len = seq_len;
+        has_ref_offset = &((bool*)(data->has_ref_offset.buffer))[*read_start];
+        has_mismatch = &((bool*)(data->has_mismatch.buffer))[*read_start];
+        mismatch = (uint8_t*)(data->mismatch.buffer);
+
+#if _DEBUGGING
+        i_ref_offset_elements = data->ref_offset.elements;
+        i_mismatch_elements = data->mismatch.elements;
+        ALIGN_C_DBG("align%s '%.*s'[%u] to '%s:%s' at %i", (options & ewrefmgr_cmp_Exact) ? " EXACT" : "",
+                    seq_len, seq, seq_len, cself->id, cself->seqId, offset);
+#endif
+        if(allele != NULL) {
+            /* determine length of reference for subst by allele */
+            ALIGN_C_DBG("apply allele %.*s[%u] at %i w/cigar below",
+                        allele_len, allele, allele_len, allele_offset);
+            rc = cigar2offset(options|ewrefmgr_cmp_Exact,
+                              allele_cigar_len,
+                              allele_cigar,
+                              sizeof(allele_off_buf) / sizeof(*allele_off_buf),
+                              allele_len,
+                              ' ',
+                              allele_off_buf,
+                              &seq_pos,
+                              &allele_ref_end,
+                              &max_rl,
+                              &position_adjust);
+            /* where allele ends on reference */
+            allele_ref_end += allele_offset;
+        }
+        if(rc == 0) {
+            rc = cigar2offset(options,
+                              cigar_len,
+                              cigar,
+                              (unsigned)self->mgr->compress.elem_count,
+                              seq_len,
+                              rna_orient,
+                              self->mgr->compress.base,
+                              &seq_pos,
+                              &rl,
+                              &max_rl,
+                              &position_adjust);
+            offset += position_adjust;
+        }
+        if (allele != NULL) {
+            if (allele_ref_end < offset || offset + rl < allele_offset) {
+                /* allele and alignment don't intersect             */
+                /* TODO: [VDB-1585] try to make this recoverable    */
+                rc = RC(rcAlign, rcFile, rcProcessing, rcData, rcInvalid);
+                (void)PLOGERR(klogWarn, (klogWarn, rc,
+                    "allele $(a) offset $(ao) $(ac) is not within referenced region in $(id) at offset $(ro) $(rc)",
+                    "a=%.*s,ao=%i,ac=%.*s,id=%s,ro=%i,rc=%.*s",
+                    allele_len, allele, allele_offset, (options & ewrefmgr_cmp_Binary) ? 0 : allele_cigar_len, allele_cigar,
+                    self->seqId, offset, (options & ewrefmgr_cmp_Binary) ? 0 : cigar_len, cigar));
+            }
+        }
+        if(rc == 0) {
+            ref_len = rl;
+            if((offset + max_rl) > self->seq_len && !self->circular) {
+                max_rl = self->seq_len - offset;
+                if(max_rl < rl) {
+                    /* ref_len used for compression cannot be shorter than ref_len derived from cigar,
+                       if there is a shortage it will fail later here */
+                    max_rl = rl;
+                }
+                ALIGN_C_DBG("max_ref_len truncated to %u cause it goes beyond refseq length %lu at offset %i",
+                             max_rl, cself->seq_len, offset);
+            }
+            ALIGN_C_DBG("chosen REF_LEN %u, ref len for match %u", ref_len, max_rl);
+
+            if (seq_len != seq_pos) {
+                rc = RC(rcAlign, rcFile, rcProcessing, rcData, rcInvalid);
+            }
+            if (rc == 0) {
+                if (max_rl > sizeof(sref_buf)) {
+                    if (href_buf)
+                        free(href_buf);
+                    href_buf = malloc(max_rl);
+                    if (href_buf == NULL)
+                        rc = RC(rcAlign, rcFile, rcProcessing, rcMemory, rcExhausted);
+                    ref_buf = href_buf;
+                }
+            }
+            if (rc == 0) {
+                if(allele != NULL) {
+                    /* subst allele in reference */
+                    if(allele_offset <= offset) {
+                        /* move allele start inside referenced chunk */
+                        allele     += offset_in_allele;
+                        allele_len -= offset_in_allele;
+                        rl = 0;
+                    } else {
+                        /* fetch portion of reference which comes before allele */
+                        rl = allele_offset - offset;
+                        rc = ReferenceSeq_ReadDirect(self, offset, rl, true, ref_buf, &i, false);
+                        if(rc == 0 && rl != i) {
+                            /* here we need to test it otherwise excessive portion of allele could be fetch in next if */
+                            rc = RC(rcAlign, rcFile, rcProcessing, rcRange, rcExcessive);
+                        }
+                    }
+                    if(rc == 0 && allele_len < (max_rl - rl)) {
+                        memmove(&ref_buf[rl], allele, allele_len);
+                        rl += allele_len;
+                        /* append tail of actual reference */
+                        rc = ReferenceSeq_ReadDirect(self, allele_ref_end, max_rl - rl, true, &ref_buf[rl], &i, false);
+                        rl += i;
+                    } else if(rc == 0) {
+                        /* allele is longer than needed */
+                        memmove(&ref_buf[rl], allele, max_rl - rl);
+                        rl = max_rl;
+                    }
+                }
+                else {
+                    rc = ReferenceSeq_ReadDirect(self, offset, max_rl, true, ref_buf, &rl, false);
+                }
+                if (rc != 0 || max_rl != rl) {
+                    rc = rc ? rc : RC(rcAlign, rcFile, rcProcessing, rcRange, rcExcessive);
+                    ALIGN_C_DBGERRP("refseq is shorter: at offset %i need %u bases", rc, offset, max_rl);
+                }
+                else {
+                    compress_buffer_t *const compress_buf = self->mgr->compress.base;
+                    unsigned ro = (unsigned)data->ref_offset.elements;
+                    int ref_pos;
+                    
+                    for (seq_pos = 0, ref_pos = 0; seq_pos < seq_len; seq_pos++, ref_pos++) {
+                        int const length = compress_buf[seq_pos].length;
+                        int const type = compress_buf[seq_pos].type;
+
+#if 0
+                        ALIGN_C_DBG("seq_pos: %u, ref_pos: %i, offset: %i, type: %i, ro: %u", seq_pos, ref_pos, length, type, ro);
+#endif
+                        if (length == 0 && type == 0)
+                            has_ref_offset[seq_pos] = 0;
+                        else {
+                            has_ref_offset[seq_pos] = 1;
+                            ref_offset[ro] = length;
+                            ref_offset_type[ro] = type;
+                            ref_pos += length;
+                            ++ro;
+                        }
+                        if (ref_pos < 0 || ref_pos >= max_rl ||
+                            ((toupper(ref_buf[ref_pos]) != toupper(seq[seq_pos])) && (seq[seq_pos] != '=')))
+                        {
+                            has_mismatch[seq_pos] = 1;
+                            mismatch[data->mismatch.elements++] = seq[seq_pos];
+                        }
+                        else {
+                            has_mismatch[seq_pos] = 0;
+                        }
+                    }
+                    data->ref_offset.elements = data->ref_offset_type.elements = ro;
+                }
+            }
+        }
+#if _DEBUGGING
+        if(rc == 0) {
+            int32_t j;
+            memset(x, '-', sizeof(x) - 1);
+            x[sizeof(x) - 2] = '\0';
+
+            ALIGN_C_DBG("ref: %.*s [%u]", max_rl, ref_buf, max_rl);
+            ALIGN_C_DBGF(("%s:%u: ref: ", __func__, __LINE__));
+            for(seq_pos = 0, j = 0, rl = 0, i = 0; seq_pos < seq_len; seq_pos++, j++) {
+                if(has_ref_offset[seq_pos]) {
+                    if(ref_offset[i_ref_offset_elements + rl] > 0) {
+                        ALIGN_C_DBGF(("%.*s", (uint32_t)(ref_offset[i_ref_offset_elements + rl]), &ref_buf[j]));
+                    } else {
+                        i = -ref_offset[i_ref_offset_elements + rl];
+                    }
+                    j += ref_offset[i_ref_offset_elements + rl];
+                    rl++;
+                }
+                ALIGN_C_DBGF(("%c", (j < 0 || j >= max_rl) ? '-' : (i > 0) ? tolower(ref_buf[j]) : ref_buf[j]));
+                if(i > 0 ) {
+                    i--;
+                }
+            }
+            ALIGN_C_DBGF(("\n%s:%u: seq: ", __func__, __LINE__));
+            for(i = 0, j = 0; i < seq_len; i++) {
+                if(has_ref_offset[i] && ref_offset[i_ref_offset_elements + j++] > 0) {
+                    ALIGN_C_DBGF(("%.*s", ref_offset[i_ref_offset_elements + j - 1], x));
+                }
+                ALIGN_C_DBGF(("%c", seq[i]));
+            }
+            ALIGN_C_DBGF((" [%u]\n", seq_len));
+            ALIGN_C_DBGF(("%s:%u: hro: ", __func__, __LINE__));
+            for(i = 0, j = 0; i < seq_len; i++) {
+                if(has_ref_offset[i] && ref_offset[i_ref_offset_elements + j++] > 0) {
+                    ALIGN_C_DBGF(("%.*s", ref_offset[i_ref_offset_elements + j - 1], x));
+                }
+                ALIGN_C_DBGF(("%c", has_ref_offset[i] + '0'));
+            }
+            ALIGN_C_DBGF((", ro:"));
+            for(i = i_ref_offset_elements; i < data->ref_offset.elements; i++) {
+                ALIGN_C_DBGF((" %i,", ref_offset[i]));
+            }
+            ALIGN_C_DBGF(("[%u]\n", data->ref_offset.elements - i_ref_offset_elements));
+            ALIGN_C_DBGF(("%s:%u: hmm: ", __func__, __LINE__));
+            for(i = 0, j = 0; i < seq_len; i++) {
+                if(has_ref_offset[i] && ref_offset[i_ref_offset_elements + j++] > 0) {
+                    ALIGN_C_DBGF(("%.*s", ref_offset[i_ref_offset_elements + j - 1], x));
+                }
+                ALIGN_C_DBGF(("%c", has_mismatch[i] + '0'));
+            }
+            ALIGN_C_DBGF((", mm: '%.*s'[%u]\n", (int)(data->mismatch.elements - i_mismatch_elements),
+                &mismatch[i_mismatch_elements], data->mismatch.elements - i_mismatch_elements));
+        }
+#endif
+        if(rc == 0) {
+            if(data->ploidy == 0) {
+                int64_t *const ref_id = (int64_t *)data->ref_id.buffer;
+                INSDC_coord_zero *const ref_start = (INSDC_coord_zero *)data->ref_start.buffer;
+                uint64_t *const global_ref_start = (uint64_t *)data->global_ref_start.buffer;
+                
+                data->ref_1st_row_id = self->start_rowid;
+                data->effective_offset = offset;
+                data->ref_len = ref_len;
+                ALIGN_C_DBGF(("%s:%u: reference 1st ROW_ID %li OFFSET %i REF_LEN %u",
+                    __func__, __LINE__, data->ref_1st_row_id, data->effective_offset, data->ref_len));
+                
+                ReferenceSeq_TranslateOffset_int(self, offset, ref_id, ref_start, global_ref_start);
+                
+                if (ref_id) {
+                    data->ref_id.elements = 1;
+                    ALIGN_C_DBGF((" REF_ID %li", ref_id[0]));
+                }
+                if (ref_start) {
+                    data->ref_start.elements = 1;
+                    ALIGN_C_DBGF((" REF_START %i", ref_start[0]));
+                }
+                if (global_ref_start) {
+                    data->global_ref_start.elements = 1;
+                    ALIGN_C_DBGF((" GLOBAL_REF_START %lu", global_ref_start[0]));
+                }
+                ALIGN_C_DBGF(("\n"));
+            } else {
+                if(data->ref_1st_row_id != self->start_rowid || data->effective_offset != offset) {
+                    rc = RC(rcAlign, rcFile, rcProcessing, rcData, rcInconsistent);
+                    (void)PLOGERR(klogErr, (klogErr, rc,
+                        "all reads in alignment record must align to same refseq at same location $(r1)@$(o1) <> $(r2):$(a2)@$(o2)",
+                        "r1=%li,o1=%i,r2=%s,a2=%s,o2=%i", data->ref_1st_row_id, data->effective_offset, self->id, self->seqId, offset));
+                } else if(data->ref_len != ref_len) {
+                    rc = RC(rcAlign, rcFile, rcProcessing, rcData, rcInconsistent);
+                    (void)PLOGERR(klogErr, (klogErr, rc,
+                        "all reads in alignment record must have same size projection on refseq $(rl1) <> $(rl2) $(r):$(a)@$(o)",
+                        "rl1=%u,rl2=%u,r=%s,a=%s,o=%i", data->ref_len, ref_len, self->id, self->seqId, offset));
+                }
+            }
+        }
+        if(rc == 0) {
+            data->ploidy++;
+            data->read_start.elements = data->ploidy;
+            data->read_len.elements = data->ploidy;
+        }
+        if (href_buf)
+            free(href_buf);
+    }
+    ALIGN_C_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC ReferenceSeq_Read(const ReferenceSeq* cself, INSDC_coord_zero offset, INSDC_coord_len len,
+                                     uint8_t* buffer, INSDC_coord_len* ref_len)
+{
+    rc_t rc = 0;
+
+    if(cself == NULL || buffer == NULL || ref_len == NULL) {
+        rc = RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+    } else {
+        rc = ReferenceSeq_ReadDirect((ReferenceSeq*)cself, offset, len, true, buffer, ref_len, false);
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC ReferenceSeq_Get1stRow(const ReferenceSeq* cself, int64_t* row_id)
+{
+    rc_t rc = 0;
+
+    if(cself == NULL || row_id == NULL) {
+        rc = RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+    } else {
+        *row_id = cself->start_rowid;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC ReferenceSeq_GetID(ReferenceSeq const *const self, char const **const rslt)
+{
+    assert(self != NULL);
+    assert(rslt != NULL);
+    *rslt = self->id;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC ReferenceSeq_AddCoverage(const ReferenceSeq* cself, INSDC_coord_zero offset, const ReferenceSeqCoverage* data)
+{
+    rc_t rc = 0;
+
+    if(cself == NULL || data == NULL) {
+        rc = RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+    } else if(!(cself->mgr->options & ewrefmgr_co_Coverage)) {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, rcUnexpected);
+        ALIGN_R_DBGERRP("coverage %s", rc, "data");
+    } else if((rc = ReferenceSeq_ReOffset(cself->circular, cself->seq_len, &offset)) == 0) {
+        rc = TableWriterRef_WriteCoverage(cself->mgr->writer, cself->start_rowid, offset, data);
+    }
+    ALIGN_DBGERR(rc);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC ReferenceSeq_Release(const ReferenceSeq *cself)
+{
+    return 0;
+}
diff --git a/libs/align/writer-refseq.c b/libs/align/writer-refseq.c
new file mode 100644
index 0000000..efa81ae
--- /dev/null
+++ b/libs/align/writer-refseq.c
@@ -0,0 +1,179 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <insdc/insdc.h>
+#include <vdb/manager.h>
+#include <align/writer-refseq.h>
+#include "writer-priv.h"
+#include "debug.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+static const TableWriterColumn TableWriterRefSeq_cols[ewrefseq_cn_Last + 1] =
+{
+    /* order is important, see enum in .h !!! */
+    {0, "MAX_SEQ_LEN", sizeof(uint32_t) * 8, 0},
+    {0, "DEF_LINE", sizeof(char) * 8, ewcol_IsArray},
+    {0, "(INSDC:dna:text)CS_KEY", sizeof(char) * 8, 0},
+    {0, "(INSDC:dna:text)READ", sizeof(char) * 8, ewcol_IsArray},
+    {0, "QUALITY", sizeof(INSDC_quality_phred) * 8, ewcol_IsArray},
+    {0, "SEQ_ID", sizeof(char) * 8, ewcol_IsArray},
+    {0, "SEQ_START", sizeof(INSDC_coord_one) * 8, 0},
+    {0, "SEQ_LEN", sizeof(INSDC_coord_len) * 8, 0},
+    {0, "CIRCULAR", sizeof(bool) * 8, 0}
+};
+
+struct TableWriterRefSeq {
+    const TableWriter* base;
+    uint8_t cursorid;
+    TableWriterColumn cols[sizeof(TableWriterRefSeq_cols)/sizeof(TableWriterRefSeq_cols[0])];
+    INSDC_coord_one seq_start_last;
+    uint32_t max_seq_len;
+    INSDC_dna_text last_cs_key;
+};
+
+LIB_EXPORT rc_t CC TableWriterRefSeq_Make(const TableWriterRefSeq** cself, VDBManager* mgr, const char* schema_path,
+                                          const char* table_path, const uint32_t options)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL ) {
+        rc = RC(rcAlign, rcFormatter, rcConstructing, rcParam, rcNull);
+    } else {
+        TableWriterRefSeq* self = calloc(1, sizeof(*self));
+        if( self == NULL ) {
+            rc = RC(rcAlign, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+        } else {
+            memmove(self->cols, TableWriterRefSeq_cols, sizeof(TableWriterRefSeq_cols));
+            if( !(options & ewrefseq_co_QUALITY) ) {
+                self->cols[ewrefseq_cn_QUALITY].flags |= ewcol_Ignore;
+            }
+            if( (rc = TableWriter_MakeMgr(&self->base, mgr, schema_path, "NCBI:refseq:tbl:reference", table_path)) == 0 ) {
+                rc = TableWriter_AddCursor(self->base, self->cols, sizeof(self->cols)/sizeof(self->cols[0]), &self->cursorid);
+            }
+        }
+        if( rc == 0 ) {
+            *cself = self;
+            ALIGN_DBG("table %s created", table_path);
+        } else {
+            TableWriterRefSeq_Whack(self, false, NULL, 0, 0, NULL, NULL, 0);
+            ALIGN_DBGERRP("table %s", rc, table_path);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterRefSeq_Whack(const TableWriterRefSeq* cself,
+                                           bool commit, uint64_t* rows,
+                                           const char loader_name[],
+                                           const ver_t loader_version,
+                                           const char loader_date[],
+                                           const char app_name[],
+                                           const ver_t app_version)
+{
+    rc_t rc = 0;
+
+    if( cself != NULL ) {
+        rc_t rc1;
+        if( commit ) {
+            rc = TableWriter_Sign(cself->base, loader_name, loader_version, loader_date, app_name, app_version);
+        }
+        rc1 = TableWriter_Whack(cself->base, rc ? false : commit, rows);
+        rc = rc ? rc : rc1;
+        free((TableWriterRefSeq*)cself);
+    }
+    return rc;
+}
+
+static
+rc_t TableWriterRefSeq_WriteDefaults(const TableWriterRefSeq* cself)
+{
+    rc_t rc = 0;
+    if( cself != NULL ) {
+        TableWriterRefSeq* self = (TableWriterRefSeq*)cself;
+        self->max_seq_len = TableWriterRefSeq_MAX_SEQ_LEN;
+        self->seq_start_last = 1;
+        self->last_cs_key = 'T';
+        TW_COL_WRITE_DEF_VAR(cself->base, cself->cursorid, cself->cols[ewrefseq_cn_MAX_SEQ_LEN], cself->max_seq_len);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterRefSeq_WriteDefault(const TableWriterRefSeq* cself,
+                                                  enum ETableWriterRefSeq_ColNames col, const TableWriterData* data)
+{
+    rc_t rc = 0;
+    if( cself == NULL || data == NULL ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->last_cs_key == '\0' && (rc = TableWriterRefSeq_WriteDefaults(cself)) != 0 ) {
+        ALIGN_DBGERR(rc);
+    } else {
+        TW_COL_WRITE_DEF(cself->base, cself->cursorid, cself->cols[col], (*data));
+        if( col == ewrefseq_cn_MAX_SEQ_LEN ) {
+            ((TableWriterRefSeq*)cself)->max_seq_len = *((uint32_t*)data->buffer);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterRefSeq_Write(const TableWriterRefSeq* cself, const TableWriterRefSeqData* data, int64_t* rowid)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || data == NULL ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->last_cs_key == '\0' && (rc = TableWriterRefSeq_WriteDefaults(cself)) != 0 ) {
+        ALIGN_DBGERR(rc);
+    } else if( data->read.elements > cself->max_seq_len ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcData, rcInvalid);
+        ALIGN_DBGERRP("%s is longer than %s", rc, cself->cols[ewrefseq_cn_READ].name, cself->cols[ewrefseq_cn_MAX_SEQ_LEN].name);
+    } else if( (rc = TableWriter_OpenRow(cself->base, rowid, cself->cursorid)) == 0 ) {
+        INSDC_coord_len len = data->read.elements;
+        TW_COL_WRITE(cself->base, cself->cols[ewrefseq_cn_READ], data->read);
+        TW_COL_WRITE(cself->base, cself->cols[ewrefseq_cn_QUALITY], data->quality);
+        TW_COL_WRITE_VAR(cself->base, cself->cols[ewrefseq_cn_SEQ_START], cself->seq_start_last);
+        TW_COL_WRITE_VAR(cself->base, cself->cols[ewrefseq_cn_SEQ_LEN], len);
+        TW_COL_WRITE_VAR(cself->base, cself->cols[ewrefseq_cn_CS_KEY], cself->last_cs_key);
+        if( rc == 0 && (rc = TableWriter_CloseRow(cself->base)) == 0 ) {
+            TableWriterRefSeq* self = (TableWriterRefSeq*)cself;
+            
+            self->last_cs_key = ((const INSDC_dna_text*)(data->read.buffer))[data->read.elements - 1];
+            self->seq_start_last += len;
+        }
+    }
+    return rc;
+}
diff --git a/libs/align/writer-sequence.c b/libs/align/writer-sequence.c
new file mode 100644
index 0000000..b01a6e9
--- /dev/null
+++ b/libs/align/writer-sequence.c
@@ -0,0 +1,778 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <align/extern.h>
+
+#include <klib/rc.h>
+#include <klib/vector.h>
+#include <klib/sort.h>
+#include <klib/data-buffer.h>
+#include <klib/printf.h>
+#include <insdc/insdc.h>
+#include <vdb/database.h>
+#include <vdb/cursor.h>
+#include <sra/sradb.h>
+#include <align/writer-sequence.h>
+#include "writer-priv.h"
+#include "reader-cmn.h"
+#include "debug.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+static const TableWriterColumn TableWriterSeq_cols[ewseq_cn_Last + 1] =
+{
+    /* order is important, see Write below!!! */
+    {0, "(INSDC:dna:text)CMP_READ", sizeof(char) * 8, ewcol_IsArray},
+    {0, "(INSDC:color:text)CMP_CSREAD", sizeof(char) * 8, ewcol_IsArray | ewcol_Ignore},
+    {0, "CS_KEY", sizeof(char) * 8, ewcol_IsArray | ewcol_Ignore},
+    {0, "QUALITY", sizeof(INSDC_quality_phred) * 8, ewcol_IsArray},
+    {0, "PRIMARY_ALIGNMENT_ID", sizeof(int64_t) * 8, ewcol_IsArray},
+    {0, "ALIGNMENT_COUNT", sizeof(uint8_t) * 8, ewcol_IsArray},
+    {0, "PLATFORM", sizeof(INSDC_SRA_platform_id) * 8, 0},
+    {0, "LABEL", sizeof(char) * 8, ewcol_IsArray},
+    {0, "LABEL_START", sizeof(INSDC_coord_zero) * 8, ewcol_IsArray},
+    {0, "LABEL_LEN", sizeof(INSDC_coord_len) * 8, ewcol_IsArray},
+    {0, "READ_TYPE", sizeof(SRAReadTypes) * 8, ewcol_IsArray},
+    {0, "READ_START", sizeof(INSDC_coord_zero) * 8, ewcol_IsArray},
+    {0, "READ_LEN", sizeof(INSDC_coord_len) * 8, ewcol_IsArray},
+    {0, "TMP_KEY_ID", sizeof(uint64_t) * 8, ewcol_Temporary},
+    {0, "SPOT_GROUP", sizeof(char) * 8, ewcol_IsArray | ewcol_Ignore},
+    {0, "READ_FILTER", sizeof(uint8_t) * 8, ewcol_IsArray},
+    {0, "TI", sizeof(uint64_t) * 8, ewcol_IsArray | ewcol_Ignore},
+    {0, "NAME", sizeof(char) * 8, ewcol_IsArray | ewcol_Ignore},
+    {0, "CMP_LINKAGE_GROUP", sizeof(char) * 8, ewcol_IsArray},
+};
+
+static const TableReaderColumn TableSeqReadTmpKey_cols[] = {
+    {0, "TMP_KEY_ID", {NULL}, 0, 0},
+    {0, "READ_LEN", {NULL}, 0, 0},
+    {0, NULL, {NULL}, 0, 0}
+};
+
+static const TableReaderColumn TableSeqReadREAD_cols[] = {
+    {0, "(INSDC:dna:text)READ", {NULL}, 0, 0},
+    {0, "READ_START", {NULL}, 0, 0},
+    {0, "READ_LEN", {NULL}, 0, 0},
+    {0, "ALIGNMENT_COUNT", {NULL}, 0, 0},
+    {0, NULL, {NULL}, 0, 0}
+};
+
+struct TableWriterSeq {
+    uint32_t options;
+    const TableWriter* base;
+    uint8_t cursor_id;
+    TableWriterColumn cols[sizeof(TableWriterSeq_cols)/sizeof(TableWriterSeq_cols[0])];
+    int init; /* default written indicator */
+    int64_t qual_buf_sz;
+    uint8_t* qual_buf;
+    uint8_t discrete_qual[256];
+    uint8_t alignd_cursor_id;
+    TableWriterColumn cols_alignd[2];
+    const TableReader* reader;
+    TableReaderColumn cols_read[5];
+    KVector *stats;
+    unsigned statsCount;
+    int64_t tmpKeyIdFirst;
+    int64_t tmpKeyIdLast;
+    bool flush;
+    bool haveFirstHalfAligned;
+    bool haveFirstUnaligned;
+    int64_t firstHalfAligned;
+    int64_t firstUnaligned;
+};
+
+static bool TableWriterSeq_InitQuantMatrix(uint8_t dst[256], char const quant[])
+{
+    unsigned i = 0;
+    unsigned limit = 0;
+    unsigned value = 0;
+    unsigned cur;
+    int ws = 1;
+    int st = 0;
+    
+    memset(dst, 0, 256);
+    for (cur = 0; quant[cur] != 0; ++cur) {
+        int const ch = quant[cur];
+        
+        if (ws) {
+            if (isspace(ch))
+                continue;
+            ws = false;
+        }
+        switch (st) {
+        case 0:
+            if (isdigit(ch)) {
+                value = (value * 10) + ch - '0';
+                break;
+            }
+            else if (isspace(ch)) {
+                ++st;
+                ws = true;
+                break;
+            }
+            ++st;
+            /* no break */
+        case 1:
+            if (ch != ':')
+                return false;
+            ws = true;
+            ++st;
+            break;
+        case 2:
+            if (isdigit(ch)) {
+                limit  = (limit * 10) + ch - '0';
+                break;
+            }
+            else if (isspace(ch)) {
+                ++st;
+                ws = true;
+                break;
+            }
+            else if (ch == '-' && limit == 0) {
+                memset(dst + i, value, 256 - i);
+                return true;
+            }
+            ++st;
+            /* no break */
+        case 3:
+            if (ch != ',')
+                return false;
+            ws = true;
+            st = 0;
+            if (i > limit)
+                return false;
+            memset(dst + i, value, limit - i);
+            i = limit;
+            limit = value = 0;
+            break;
+        }
+    }
+    if (st == 0) {
+        switch (value) {
+        case 1:
+            break;
+        case 2:
+            break;
+        }
+    }
+    return false;
+}
+
+typedef struct { uint64_t distance, count; } stats_pair_t;
+
+typedef struct { 
+    stats_pair_t *stats;
+    unsigned i;
+} pb_t;
+
+static rc_t CC stats_cb(uint64_t key, uint64_t value, void *user_data)
+{
+    pb_t *pb = user_data;
+    
+    pb->stats[pb->i].distance = key;
+    pb->stats[pb->i].count = value;
+    ++pb->i;
+    
+    return 0;
+}
+
+static int64_t CC stats_cmp_count(const void *A, const void *B, void *ignore)
+{
+    if (((stats_pair_t const *)A)->distance == 0)
+        return -1;
+    if (((stats_pair_t const *)B)->distance == 0)
+        return 1;
+    if (((stats_pair_t const *)B)->count < ((stats_pair_t const *)A)->count)
+        return -1;
+    if (((stats_pair_t const *)B)->count > ((stats_pair_t const *)A)->count)
+        return 1;
+    if (((stats_pair_t const *)B)->distance < ((stats_pair_t const *)A)->distance)
+        return 1;
+    if (((stats_pair_t const *)B)->distance > ((stats_pair_t const *)A)->distance)
+        return -1;
+    return 0;
+}
+
+static int64_t CC stats_cmp_distance(const void *A, const void *B, void *ignore)
+{
+    if (((stats_pair_t const *)A)->distance < ((stats_pair_t const *)B)->distance)
+        return -1;
+    if (((stats_pair_t const *)A)->distance > ((stats_pair_t const *)B)->distance)
+        return 1;
+    return 0;
+}
+
+static rc_t TableWriterSeq_WriteStatistics(TableWriterSeq const *cself, KMDataNode *node)
+{
+    pb_t pb;
+    rc_t rc;
+    KDataBuffer buf;
+    
+    rc = KDataBufferMake(&buf, 8 * sizeof(pb.stats[0]), cself->statsCount);
+    if (rc) return rc;
+    
+    pb.stats = buf.base;
+    pb.i = 0;
+    rc = KVectorVisitU64(cself->stats, 0, stats_cb, &pb);
+    if (rc == 0) {
+        unsigned i;
+        unsigned const n = cself->statsCount < 126 ? cself->statsCount : 126;
+        uint64_t *const distance = buf.base;
+        
+        ksort(pb.stats, cself->statsCount, sizeof(pb.stats[0]), stats_cmp_count, NULL);
+        ksort(pb.stats, n, sizeof(pb.stats[0]), stats_cmp_distance, NULL);
+        for (i = 0; i != n; ++i) {
+            distance[i] = pb.stats[i].distance;
+        }
+        rc = KMDataNodeWrite(node, distance, n * sizeof(distance[0]));
+    }
+    KDataBufferWhack(&buf);
+    return rc;
+}
+
+static rc_t TableWriterSeq_CollectStatistics(TableWriterSeq *self, const TableWriterData* primary_alignment_id)
+{
+    rc_t rc;
+    int64_t mate[2] = {0, 0};
+    uint64_t distance = 0;
+    uint64_t count = 0;
+    
+    memmove(mate, primary_alignment_id->buffer, sizeof(mate[0]) * primary_alignment_id->elements);
+    if (mate[0] && mate[1]) {
+        distance = (mate[0] < mate[1]) ? (mate[1] - mate[0]) : (mate[0] - mate[1]);
+    }
+    else
+        return 0;
+    if (self->stats == NULL) {
+        rc = KVectorMake(&self->stats); if (rc) return rc;
+    }
+    rc = KVectorGetU64(self->stats, distance, &count);
+    if (GetRCObject(rc) == rcItem && GetRCState(rc) == rcNotFound) {
+        rc = KVectorSetU64(self->stats, distance, 1);
+        if (rc == 0) ++self->statsCount;
+    }
+    else if (rc == 0) {
+        ++count;
+        rc = KVectorSetU64(self->stats, distance, count);
+    }
+    return rc;
+}
+
+static rc_t MakeSequenceTable(TableWriterSeq *self, VDatabase* db,
+                              char const qual_quantization[])
+{
+    char const *tblName = (self->options & ewseq_co_ColorSpace) ? "CS_SEQUENCE" : "SEQUENCE";
+
+    if (qual_quantization && strcmp(qual_quantization, "0") == 0) {
+        self->options |= ewseq_co_FullQuality;
+    }
+    if( !(self->options & ewseq_co_FullQuality) ) {
+        char const *quant_string = qual_quantization;
+        
+        if (quant_string == NULL || strcmp(quant_string, "1") == 0) {
+            quant_string = "1:10,10:20,20:30,30:-";
+        } else if (strcmp(quant_string, "2") == 0) {
+            quant_string = "1:30,30:-";
+        }
+        if (!TableWriterSeq_InitQuantMatrix(self->discrete_qual, quant_string)) {
+            return RC(rcAlign, rcFormatter, rcConstructing, rcParam, rcInvalid);
+        }
+    }
+    memmove(self->cols, TableWriterSeq_cols, sizeof(TableWriterSeq_cols));
+    if (self->options & ewseq_co_KeepKey) {
+        self->cols[ewseq_cn_TMP_KEY_ID].flags &= ~ewcol_Temporary;
+        if (self->options & ewseq_co_SaveRead)
+            self->cols[ewseq_cn_READ].name = "(INSDC:dna:text)READ";
+    }
+    if( self->options & ewseq_co_AlignData ) {
+        self->cols[ewseq_cn_TMP_KEY_ID].flags |= ewcol_Ignore;
+    } else {
+        self->cols[ewseq_cn_PRIMARY_ALIGNMENT_ID].flags |= ewcol_Ignore;
+        self->cols[ewseq_cn_ALIGNMENT_COUNT].flags |= ewcol_Ignore;
+    }
+    if(self->options & ewseq_co_NoLabelData) {
+        self->cols[ewseq_cn_LABEL].flags |= ewcol_Ignore;
+        self->cols[ewseq_cn_LABEL_LEN].flags |= ewcol_Ignore;
+        self->cols[ewseq_cn_LABEL_START].flags |= ewcol_Ignore;
+    }
+    if(self->options & ewseq_co_ColorSpace) {
+        self->cols[ewseq_cn_READ].flags |= ewcol_Ignore;
+        self->cols[ewseq_cn_CSREAD].flags &= ~ewcol_Ignore;
+        self->cols[ewseq_cn_CSKEY].flags &= ~ewcol_Ignore;
+    }
+    if( self->options & ewseq_co_SpotGroup) {
+        self->cols[ewseq_cn_SPOT_GROUP].flags &= ~ewcol_Ignore;
+    }
+    if( self->options & ewseq_co_TI) {
+        self->cols[ewseq_cn_TI].flags &= ~ewcol_Ignore;
+    }
+    if( self->options & ewseq_co_SpotName) {
+        self->cols[ewseq_cn_NAME].flags &= ~ewcol_Ignore;
+    }
+    return TableWriter_Make(&self->base, db, tblName, "SEQUENCE");
+}
+
+LIB_EXPORT rc_t CC TableWriterSeq_Make(const TableWriterSeq** cself, VDatabase* db,
+                                       uint32_t options, char const qual_quantization[])
+{
+    rc_t rc = 0;
+    TableWriterSeq* self = NULL;
+
+    options |= ewseq_co_SaveQual; /* TODO: remove when ready */
+    if( cself == NULL || db == NULL ) {
+        rc = RC(rcAlign, rcFormatter, rcConstructing, rcParam, rcNull);
+    } else {
+        self = calloc(1, sizeof(*self));
+        if( self == NULL ) {
+            rc = RC(rcAlign, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+        } else {
+            self->options = options;
+            rc = MakeSequenceTable(self, db, qual_quantization);
+        }
+    }
+    if( rc == 0 ) {
+        *cself = self;
+        ALIGN_DBG("table %s", "created");
+    } else {
+        TableWriterSeq_Whack(self, false, NULL);
+        ALIGN_DBGERR(rc);
+    }
+    return rc;
+}
+
+static rc_t CompressREAD(TableWriterSeq *self)
+{
+    rc_t rc = 0;
+    VTable *vtbl = NULL;
+    uint8_t cursor_id = 0;
+    int64_t row = 0;
+    
+    memmove(&self->cols_read, &TableSeqReadREAD_cols, sizeof(self->cols_read));
+    rc = TableWriter_GetVTable(self->base, &vtbl);
+    assert(rc == 0);
+    rc = TableReader_Make(&self->reader, vtbl, self->cols_read, 50 * 1024 * 1024);
+    assert(rc == 0);
+    
+    self->cols[0] = TableWriterSeq_cols[0];
+    rc = TableWriter_AddCursor(self->base, self->cols, 1, &cursor_id);
+    assert(rc == 0);
+    
+    for (row = 1; ; ++row) {
+        rc = TableReader_ReadRow(self->reader, row);
+        if (rc) {
+            if (GetRCState(rc) == rcNotFound) {
+                rc = 0;
+                break;
+            }
+            return rc;
+        }
+        rc = TableWriter_OpenRowId(self->base, row, cursor_id);
+        assert(rc == 0);
+        {
+            char const *const seq = self->cols_read[0].base.str;
+            INSDC_coord_zero const *const start = self->cols_read[1].base.coord0;
+            INSDC_coord_len const *const length = self->cols_read[2].base.coord_len;
+            uint8_t const *const cnt = self->cols_read[3].base.u8;
+            int const nreads = (int)self->cols_read[1].len;
+            int i;
+            
+            TW_COL_WRITE_BUF(self->base, self->cols[0], NULL, 0);
+            for (i = 0; i < nreads; ++i) {
+                if (cnt[i] == 0) {
+                    TW_COL_WRITE_BUF(self->base, self->cols[0], &seq[start[i]], length[i]);
+                }
+            }
+        }
+        rc = TableWriter_CloseRow(self->base);
+        assert(rc == 0);
+    }
+    rc = TableWriter_CloseCursor(self->base, cursor_id, NULL);
+    assert(rc == 0);
+    TableReader_Whack(self->reader);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC TableWriterSeq_Whack(const TableWriterSeq* cself, bool commit, uint64_t* rows)
+{
+    rc_t rc = 0;
+
+    if( cself != NULL ) {
+        TableWriterSeq* self = (TableWriterSeq*)cself;
+        VTable *vtbl;
+        
+        TableReader_Whack(cself->reader);
+        if (commit) {
+            rc = TableWriter_CloseCursor(cself->base, 1, NULL);
+            assert(rc == 0);
+            if ((cself->options & (ewseq_co_KeepKey | ewseq_co_SaveRead)) == (ewseq_co_KeepKey | ewseq_co_SaveRead))
+                CompressREAD(self);
+
+            if ((rc = TableWriter_GetVTable(cself->base, &vtbl)) == 0 ) {
+                KMetadata* meta;
+                
+                if ((rc = VTableOpenMetadataUpdate(vtbl, &meta)) == 0) {
+                    KMDataNode* node = NULL;
+                    
+                    if (cself->stats) {
+                        if ((rc = KMetadataOpenNodeUpdate(meta, &node, "MATE_STATISTICS")) == 0) {
+                            rc = TableWriterSeq_WriteStatistics(cself, node);
+                            KMDataNodeRelease(node);
+                        }
+                    }
+                    if ((rc = KMetadataOpenNodeUpdate(meta, &node, "unaligned")) == 0) {
+                        KMDataNode *sub = NULL;
+                        
+                        KMDataNodeOpenNodeUpdate(node, &sub, "first-unaligned");
+                        KMDataNodeWriteB64(sub, &self->firstUnaligned);
+                        KMDataNodeRelease(sub);
+                        
+                        KMDataNodeOpenNodeUpdate(node, &sub, "first-half-aligned");
+                        KMDataNodeWriteB64(sub, &self->firstHalfAligned);
+                        KMDataNodeRelease(sub);
+
+                        KMDataNodeRelease(node);
+                    }
+                    KMetadataRelease(meta);
+                }
+            }
+        }
+
+        rc = TableWriter_Whack(cself->base, commit && (rc == 0), rows);
+        KVectorRelease(cself->stats);
+        free(self->qual_buf);
+        free(self);
+    }
+    return rc;
+}
+
+static
+rc_t TableWriteSeq_WriteDefaults(TableWriterSeq *const self)
+{
+    static TableWriterData const d = { "", 0 };
+    rc_t rc = 0;
+
+    self->init = 1;
+    rc = TableWriter_AddCursor(self->base, self->cols, sizeof(self->cols)/sizeof(self->cols[0]), &self->cursor_id);
+    if( (self->options & ewseq_co_AlignData) ) {
+        TW_COL_WRITE_DEF(self->base, self->cursor_id, self->cols[ewseq_cn_PRIMARY_ALIGNMENT_ID], d);
+        TW_COL_WRITE_DEF(self->base, self->cursor_id, self->cols[ewseq_cn_ALIGNMENT_COUNT], d);
+    }
+    TW_COL_WRITE_DEF(self->base, self->cursor_id, self->cols[ewseq_cn_LINKAGE_GROUP], d);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriteSeq_WriteDefault(const TableWriterSeq* cself,
+                                              enum ETableWriterSeq_ColNames col, const TableWriterData* data)
+{
+    rc_t rc = 0;
+    if( !cself->init ) {
+        rc = TableWriteSeq_WriteDefaults((TableWriterSeq *)cself);
+    }
+    if( rc == 0 ) {
+        rc = TableWriter_ColumnDefault(cself->base, cself->cursor_id, &cself->cols[col], data);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterSeq_GetNextRowId(const TableWriterSeq* cself, int64_t* rowid)
+{
+    return TableWriter_GetNextRowId(cself->base, rowid, cself->cursor_id);
+}
+
+static void UpdateAlignmentRowStats(TableWriterSeq *const self, int64_t rowid, TableWriterData const *const alignment_count)
+{
+    uint8_t const *const ac = alignment_count->buffer;
+    if (ac) {
+        unsigned const nreads = (unsigned)alignment_count->elements;
+        unsigned naligned = 0;
+        unsigned i;
+
+        for (i = 0; i < nreads; ++i) {
+            if (ac[i] != 0) {
+                ++naligned;
+            }
+        }
+        if (naligned == 0) {
+            if (!self->haveFirstUnaligned) {
+                self->firstUnaligned = rowid;
+                self->haveFirstUnaligned = true;
+            }
+        }
+        else if (naligned < nreads) {
+            if (!self->haveFirstHalfAligned) {
+                self->firstHalfAligned = rowid;
+                self->haveFirstHalfAligned = true;
+            }
+        }
+    }
+}
+
+LIB_EXPORT rc_t CC TableWriterSeq_Write(const TableWriterSeq* cself, const TableWriterSeqData* data, int64_t* rowid)
+{
+    rc_t rc = 0;
+    int lbl;
+
+    if( cself == NULL || data == NULL ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+        return rc;
+    }
+    if( !cself->init && (rc = TableWriteSeq_WriteDefaults((TableWriterSeq *)cself)) != 0 ) {
+        ALIGN_DBGERR(rc);
+    }
+    else if( data->quality.buffer == NULL || data->sequence.elements != data->quality.elements ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, data->quality.buffer ? rcInconsistent : rcEmpty);
+        ALIGN_DBGERRP("sequence and quality length %lu <> %lu", rc, data->sequence.elements, data->quality.elements);
+    }
+    else if( data->read_start.elements != data->nreads ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, rcInconsistent);
+        ALIGN_DBGERRP("nreads and read_start length %u <> %lu", rc, data->nreads, data->read_start.elements);
+    }
+    else if( data->read_len.elements != data->nreads ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, rcInconsistent );
+        ALIGN_DBGERRP("nreads and read_len length %u <> %lu", rc, data->nreads, data->read_len.elements);
+    }
+    else if( (cself->options & ewseq_co_AlignData) && data->primary_alignment_id.elements != data->nreads ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, rcInconsistent);
+        ALIGN_DBGERRP("nreads and primary_alignment_id length %u <> %lu", rc, data->nreads, data->primary_alignment_id.elements);
+    }
+    else if( (cself->options & ewseq_co_AlignData) && data->alignment_count.elements != data->nreads ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, rcInconsistent);
+        ALIGN_DBGERRP("nreads and alignment_count length %u <> %lu", rc, data->nreads, data->alignment_count.elements);
+    }
+    else if( data->no_quantize_mask.buffer && data->no_quantize_mask.elements != data->quality.elements ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, rcInconsistent);
+        ALIGN_DBGERRP("quality and no_quantize_mask length %u <> %lu", rc, data->quality.elements, data->no_quantize_mask.elements);
+    }
+    else if( !(cself->options & ewseq_co_NoLabelData) &&
+               (lbl = ((data->label.buffer ? 1 : 0) + (data->label_start.buffer ? 1 : 0) +
+                                                  (data->label_len.buffer ? 1 : 0))) != 0 && lbl != 3 )
+    {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, rcInconsistent);
+        ALIGN_DBGERRP("LABEL %s", rc, "incomplete");
+    }
+    else if( (rc = TableWriter_OpenRow(cself->base, rowid, cself->cursor_id)) == 0 ) {
+        if( cself->options & ewseq_co_AlignData ) {
+            UpdateAlignmentRowStats((TableWriterSeq *)cself, *rowid, &data->alignment_count);
+            TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_PRIMARY_ALIGNMENT_ID], data->primary_alignment_id);
+            TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_ALIGNMENT_COUNT], data->alignment_count);
+            if (rc == 0) {
+                rc = TableWriterSeq_CollectStatistics((TableWriterSeq *)cself, &data->primary_alignment_id);
+            }
+        }
+        if( cself->options & ewseq_co_SaveRead ) {
+            TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_READ], data->sequence);
+        }
+        else {
+            uint32_t i;
+            const char* seq = data->sequence.buffer;
+            const uint8_t* ac = data->alignment_count.buffer;
+            const INSDC_coord_zero* rs = data->read_start.buffer;
+            const INSDC_coord_len* rl = data->read_len.buffer;
+
+            TW_COL_WRITE_BUF(cself->base, cself->cols[ewseq_cn_READ], NULL, 0);
+            TW_COL_WRITE_BUF(cself->base, cself->cols[ewseq_cn_CSREAD], NULL, 0);
+            for(i = 0; i < data->nreads; i++ ) {
+                if( ac[i] == 0 ) {
+                    TW_COL_WRITE_BUF(cself->base, cself->cols[ewseq_cn_READ], &seq[rs[i]], rl[i]);
+                    TW_COL_WRITE_BUF(cself->base, cself->cols[ewseq_cn_CSREAD], &seq[rs[i]], rl[i]);
+                }
+            }
+        }
+        if( cself->options & ewseq_co_FullQuality ) {
+            TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_QUALITY], data->quality);
+        } else {
+            uint64_t i;
+            const uint8_t* b = data->quality.buffer;
+            if( data->quality.elements > cself->qual_buf_sz ) {
+                uint8_t* p = realloc(cself->qual_buf, data->quality.elements * cself->cols[ewseq_cn_QUALITY].element_bits);
+                if( p == NULL ) {
+                    rc = RC(rcAlign, rcType, rcWriting, rcMemory, rcExhausted);
+                    ALIGN_DBGERRP("quality %s", rc, "discretization");
+                } else {
+                    ((TableWriterSeq*)cself)->qual_buf_sz = data->quality.elements;
+                    ((TableWriterSeq*)cself)->qual_buf = p;
+                }
+            }
+            if (data->no_quantize_mask.buffer) {
+                bool const *mask = data->no_quantize_mask.buffer;
+                
+                for(i = 0; i < data->quality.elements; i++ ) {
+                    uint8_t const q = b[i] & 0x3F;
+                    cself->qual_buf[i] = mask[i] ? q : cself->discrete_qual[q];
+                }
+            }
+            else {
+                for(i = 0; i < data->quality.elements; i++ ) {
+                    cself->qual_buf[i] = cself->discrete_qual[b[i]];
+                }
+            }
+            if (cself->options & ewseq_co_SaveQual) {
+                TW_COL_WRITE_BUF(cself->base, cself->cols[ewseq_cn_QUALITY], cself->qual_buf, data->quality.elements);
+            }
+            else {
+                uint32_t i;
+                uint8_t const *const qual = data->sequence.buffer;
+                uint8_t const *const aligned = data->alignment_count.buffer;
+                INSDC_coord_zero const *const rs = data->read_start.buffer;
+                INSDC_coord_len const *const rl = data->read_len.buffer;
+                
+                TW_COL_WRITE_BUF(cself->base, cself->cols[ewseq_cn_QUALITY], NULL, 0);
+                for (i = 0; i < data->nreads; ++i) {
+                    if (!aligned[i]) {
+                        INSDC_coord_zero const readStart = rs[i];
+                        INSDC_coord_len const readLen = rl[i];
+                        
+                        TW_COL_WRITE_BUF(cself->base, cself->cols[ewseq_cn_QUALITY], &qual[readStart], readLen);
+                    }
+                }
+            }
+        }
+        if( !(cself->options & ewseq_co_NoLabelData) ) {
+            TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_LABEL], data->label);
+            TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_LABEL_START], data->label_start);
+            TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_LABEL_LEN], data->label_len);
+        }
+        TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_READ_TYPE], data->read_type);
+        TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_READ_START], data->read_start);
+        TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_READ_LEN], data->read_len);
+        TW_COL_WRITE_VAR(cself->base, cself->cols[ewseq_cn_TMP_KEY_ID], data->tmp_key_id);
+        TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_SPOT_GROUP], data->spot_group);
+        TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_CSKEY], data->cskey);
+        TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_READ_FILTER], data->read_filter);
+        TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_PLATFORM], data->platform);
+        TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_TI], data->ti);
+        TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_NAME], data->spot_name);
+        if (data->linkageGroup.elements > 0)
+            TW_COL_WRITE(cself->base, cself->cols[ewseq_cn_LINKAGE_GROUP], data->linkageGroup);
+        if( rc == 0 ) {
+            rc = TableWriter_CloseRow(cself->base);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterSeq_TmpKeyStart(const TableWriterSeq* cself)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->options & ewseq_co_AlignData ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcViolated);
+        ALIGN_DBGERR(rc);
+    } else if( (rc = TableWriter_CloseCursor(cself->base, 0, NULL)) == 0 ) {
+        TableWriterSeq* self = (TableWriterSeq*)cself;
+        VTable* vtbl = NULL;
+        
+        self->tmpKeyIdFirst = INT64_MAX;
+        self->tmpKeyIdLast = INT64_MIN;
+        memmove(&self->cols_read, &TableSeqReadTmpKey_cols, sizeof(self->cols_read));
+        if( (rc = TableWriter_GetVTable(cself->base, &vtbl)) == 0 &&
+            (rc = TableReader_Make(&self->reader, vtbl, self->cols_read, 50 * 1024 * 1024)) == 0 ) {
+            memmove(self->cols_alignd, &TableWriterSeq_cols[ewseq_cn_PRIMARY_ALIGNMENT_ID], sizeof(self->cols_alignd));
+            rc = TableWriter_AddCursor(self->base, self->cols_alignd,
+                                       sizeof(self->cols_alignd) / sizeof(self->cols_alignd[0]),
+                                       &self->alignd_cursor_id);
+            self->init = 2;
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterSeq_TmpKey(const TableWriterSeq* cself, int64_t rowid, uint64_t* key_id)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL || rowid == 0 || key_id == NULL ) {
+        rc = RC( rcAlign, rcType, rcReading, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->reader == NULL ) {
+        rc = RC( rcAlign, rcType, rcReading, rcMode, rcNotOpen);
+        ALIGN_DBGERR(rc);
+    } else if( (rc = TableReader_ReadRow(cself->reader, rowid)) == 0 ) {
+        memmove(key_id, cself->cols_read[0].base.var, sizeof(*key_id));
+        if (cself->tmpKeyIdLast < rowid || rowid < cself->tmpKeyIdFirst) {
+            rc = TableReader_PageIdRange(cself->reader, rowid,
+                                        &((TableWriterSeq*)cself)->tmpKeyIdFirst,
+                                        &((TableWriterSeq*)cself)->tmpKeyIdLast);
+            ((TableWriterSeq*)cself)->flush = rc == 0;
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC TableWriterSeq_WriteAlignmentData(const TableWriterSeq* cself, int64_t rowid,
+                                                     const TableWriterData* primary_alignment_id,
+                                                     const TableWriterData* alignment_count)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( cself->options & ewseq_co_AlignData ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcViolated);
+        ALIGN_DBGERR(rc);
+    } else if( rowid == 0 ) {
+        rc = TableWriter_Flush(cself->base, cself->alignd_cursor_id);
+    }
+    else if( primary_alignment_id == NULL || alignment_count == NULL ) {
+        rc = RC( rcAlign, rcType, rcWriting, rcParam, rcNull);
+        ALIGN_DBGERR(rc);
+    } else if( primary_alignment_id->elements != alignment_count->elements ) {
+        rc = RC(rcAlign, rcType, rcWriting, rcData, rcInconsistent);
+        ALIGN_DBGERRP("primary_alignment_id and alignment_count length %u <> %lu",
+            rc, primary_alignment_id->elements, alignment_count->elements);
+    }
+    else {
+        if (cself->flush) {
+            rc = TableWriter_Flush(cself->base, cself->alignd_cursor_id);
+            ((TableWriterSeq*)cself)->flush = false;
+        }
+        if( rc == 0 &&
+           (rc = TableWriter_OpenRowId(cself->base, rowid, cself->alignd_cursor_id)) == 0 )
+        {
+            UpdateAlignmentRowStats((TableWriterSeq *)cself, rowid, alignment_count);
+            TW_COL_WRITE(cself->base, cself->cols_alignd[0], *primary_alignment_id);
+            TW_COL_WRITE(cself->base, cself->cols_alignd[1], *alignment_count);
+            if( rc == 0 ) {
+                rc = TableWriter_CloseRow(cself->base);
+            }
+            if (rc == 0) {
+                rc = TableWriterSeq_CollectStatistics((TableWriterSeq *)cself, primary_alignment_id);
+            }
+        }
+    }
+    return rc;
+}
diff --git a/libs/ascp/Makefile b/libs/ascp/Makefile
new file mode 100644
index 0000000..1e725bb
--- /dev/null
+++ b/libs/ascp/Makefile
@@ -0,0 +1,87 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/ascp
+
+INT_LIBS = \
+    libascp
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# testing framework
+#
+$(ILIBDIR)/libascp: $(addprefix $(ILIBDIR)/libascp.,$(LIBX))
+
+SRC = \
+	ascp \
+	ascp-path \
+	connect
+#	silent-system
+
+OBJ = \
+	$(addsuffix .$(LOBX),$(SRC))
+
+$(ILIBDIR)/libascp.$(LIBX): $(OBJ)
+	$(LD) --slib -o $@ $^ $(LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/ascp/ascp-priv.h b/libs/ascp/ascp-priv.h
new file mode 100644
index 0000000..557adbc
--- /dev/null
+++ b/libs/ascp/ascp-priv.h
@@ -0,0 +1,74 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_libs_ascp_ascp_priv_
+#define _h_libs_ascp_ascp_priv_
+
+#include <kns/ascp.h> /* EAscpState */
+#include <klib/text.h> /* String */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define STS_INFO 1
+#define STS_DBG 2
+
+typedef enum {
+      eUnknown
+    , eChild
+    , eStart
+    , eLog
+    , eKeyStart
+    , eKeyMayBeIn
+    , eKeyIn
+    , eKeyEnd
+    , eProgress
+    , eWriteFailed
+    , eFailed
+    , eCompleted
+    , eEnd
+} EAscpState;
+
+rc_t ascpParse(const char *buf, size_t len, const char *filename,
+    EAscpState *state, String *line);
+
+bool ascp_path(const char **cmd, const char **key);
+
+rc_t run_ascp(const char *ascp_bin, const char *private_file,
+    const char *src, const char *dest, const AscpOptions *opt);
+
+rc_t mkAscpCmd(const char *ascp_bin, const char *private_file,
+    const char *src, const char *dest, const AscpOptions *opt,
+    char *const argv[], size_t argvSz);
+
+int silent_system(const char *command);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libs/ascp/ascp.c b/libs/ascp/ascp.c
new file mode 100644
index 0000000..dbf568a
--- /dev/null
+++ b/libs/ascp/ascp.c
@@ -0,0 +1,840 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+
+#include "ascp-priv.h"
+
+#include <kfg/config.h> /* KConfig */
+
+#include <kfs/directory.h> /* KDirectory */
+
+#include <klib/log.h> /* LOGERR */
+#include <klib/out.h> /* OUTMSG */
+#include <klib/printf.h> /* string_vprintf */
+#include <klib/rc.h>
+#include <klib/status.h> /* STSMSG */
+
+#include <sysalloc.h> /* free */
+
+#include <assert.h>
+#include <stdlib.h> /* free */
+#include <string.h> /* memset */
+
+#include <limits.h>
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#define DISP_RC(rc, err) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, err))
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+#define STS_INFO 1
+#define STS_FIN 3
+
+static bool _StringStartsWith(const String *self, const char *buf) {
+    size_t len = 0;
+    assert(self && buf);
+    len = string_size(buf);
+    assert(len);
+/*printf("_StringStartsWith(%.*s, %s)\n", self->len, self->addr, buf);*/
+    if (self->len < len) {
+        return false;
+    }
+    return string_cmp(self->addr, self->len, buf, len, (uint32_t)len) == 0;
+}
+
+static
+bool _StringHas(const String *self, const char *buf, String *res)
+{
+    String dummy;
+    size_t len = 0;
+    assert(self && buf);
+    if (res == NULL) {
+        res = &dummy;
+    }
+    len = string_size(buf);
+    assert(len);
+    StringInit(res, self->addr, self->size, self->len);
+    while (true) {
+        if (res->len < len) {
+            StringInit(res, NULL, 0, 0);
+            return false;
+        }
+        if (_StringStartsWith(res, buf)) {
+            res->len = (uint32_t)len;
+            res->size = len;
+            return true;
+        }
+        res->size = res->len - 1;
+        res->len = res->len - 1;
+        ++res->addr;
+    }
+}
+
+typedef struct {
+    EAscpState s;
+    char *msg;
+    bool failure;
+} SAscpState;
+static void SAscpStateFini(SAscpState *self) {
+    assert(self);
+
+/* #if ! WINDOWS #endif */
+    free(self->msg);
+
+    memset(self, 0, sizeof *self);
+}
+
+static bool sStatus = false;
+
+static rc_t parseAscpLine(const String *s, SAscpState *state, const char *name)
+{
+    bool debug = true;
+    if (!sStatus) {
+        debug = false;
+    }
+
+    assert(s && state);
+
+    memset(state, 0, sizeof *state);
+
+    if (_StringHas(s, "CHILD: ", NULL)) {
+        if (sStatus) {
+            OUTMSG(("%.*s\n",  s->len, s->addr));
+        }
+        state->s = eChild;
+    }
+    else if (_StringStartsWith(s, "Cannot open log file: ")) {
+        if (debug) OUTMSG(("matched: LOG: '%.*s'\n", s->len, s->addr));
+        state->s = eLog;
+    }
+    else if (_StringStartsWith(s, "The server's host key is not")) {
+        if (debug) OUTMSG(("matched: KeySTART: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyStart;
+    }
+    else if (_StringHas(s, "no guarantee that the server is th", NULL)) {
+        if (debug) OUTMSG(("matched: KeyIN: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyIn;
+    }
+    else if (_StringHas(s, "think it is.", NULL)) {
+        if (debug) OUTMSG(("matched: KeyIN: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyIn;
+    }
+    else if (_StringHas(s, "The server's rsa2 key fingerprint ", NULL)) {
+        if (debug) OUTMSG(("matched: KeyIN: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyIn;
+    }
+    else if (_StringHas(s, "ssh-rsa 1024 ", NULL)) {
+        if (debug) OUTMSG(("matched: KeyIN: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyIn;
+    }
+    else if (_StringHas(s, "If you trust this host, enter ", NULL)) {
+        if (debug) OUTMSG(("matched: KeyIN: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyIn;
+    }
+    else if (_StringHas(s, "PuTTY's cache and carry on connect", NULL)) {
+        if (debug) OUTMSG(("matched: KeyIN: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyIn;
+    }
+    else if (_StringHas(s, "If you want to carry on connecting", NULL)) {
+        if (debug) OUTMSG(("matched: KeyIN: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyIn;
+    }
+    else if (_StringHas(s, "adding the key to the cache, enter", NULL)) {
+        if (debug) OUTMSG(("matched: KeyIN: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyIn;
+    }
+    else if (_StringHas(s, " you do not trust this host, press", NULL)) {
+        if (debug) OUTMSG(("matched: KeyIN: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyIn;
+    }
+    else if (_StringHas(s, "connection.", NULL)) {
+        if (debug) OUTMSG(("matched: KeyIN: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyIn;
+    }
+    else if (_StringHas(s, "Store key in cache? (y/n) ", NULL)) {
+        if (debug) OUTMSG(("matched: KeyEND: '%.*s'\n", s->len, s->addr));
+        state->s = eKeyEnd;
+    }
+    else if (string_chr(s->addr, s->len, '%') != NULL) {
+        if (debug) OUTMSG(("matched: PROGRESS: '%.*s'\n", s->len, s->addr));
+        state->s = eProgress;
+        if ((state->msg = string_dup(s->addr, s->len)) == NULL) {
+            return RC(rcNS, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+    }
+    else if (_StringStartsWith(s, "Completed: ")) {
+        if (debug) OUTMSG(("matched: COMPLETED: '%.*s'\n", s->len, s->addr));
+        state->s = eCompleted;
+        if ((state->msg = string_dup(s->addr, s->len)) == NULL) {
+            return RC(rcNS, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+    }
+    else if (_StringStartsWith(s, "Partial Completion: ")) {
+        if (debug) OUTMSG(("matched: END: '%.*s'\n", s->len, s->addr));
+        state->s = eEnd;
+        if ((state->msg = string_dup(s->addr, s->len)) == NULL) {
+            return RC(rcNS, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+    }    
+    else if (_StringStartsWith(s, "Connection abandoned.")) {
+/* printed in caller     printf("matched: END: '%.*s'\n", s->len, s->addr); */
+        state->s = eFailed;
+        if ((state->msg = string_dup(s->addr, s->len)) == NULL) {
+            return RC(rcNS, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+    }
+    else if (_StringHas(s, "failed to open connection to remot", NULL)) {
+/* printed in caller       printf("matched: END: '%.*s'\n", s->len, s->addr); */
+        state->s = eFailed;
+        if ((state->msg = string_dup(s->addr, s->len)) == NULL) {
+            return RC(rcNS, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+    }
+    else if (_StringHas(s, "exiting", NULL)) {
+        state->s = eFailed;
+        if ((state->msg = string_dup(s->addr, s->len)) == NULL) {
+            return RC(rcNS, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+    }
+    else if (_StringStartsWith(s, "Session Stop  (Error: Disk write ")) {
+   if (debug) OUTMSG(("matched: Disk write failed: '%.*s'\n", s->len, s->addr));
+        state->s = eWriteFailed;
+        if ((state->msg = string_dup(s->addr, s->len)) == NULL) {
+            return RC(rcNS, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+    }
+    else if (_StringStartsWith(s, "Session Stop ")) {
+        if (debug) OUTMSG(("matched: COMPLETED: '%.*s'\n", s->len, s->addr));
+        state->s = eFailed;
+        if ((state->msg = string_dup(s->addr, s->len)) == NULL) {
+            return RC(rcNS, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+    }
+    else if (_StringHas(s, " bits/sec), in 1 file", NULL)) {
+        if (debug) OUTMSG(("matched: END: '%.*s'\n", s->len, s->addr));
+        state->s = eEnd;
+        if ((state->msg = string_dup(s->addr, s->len)) == NULL) {
+            return RC(rcNS, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+    }
+    else if (_StringStartsWith(s, name)) {
+        /* in the beginning:
+           line starting by dest file name, then some white characters */
+        if (debug) OUTMSG(("matched: PROGRESS: '%.*s'\n", s->len, s->addr));
+        state->s = eProgress;
+        if ((state->msg = string_dup(s->addr, s->len)) == NULL) {
+            return RC(rcNS, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+    }
+    else {
+        OUTMSG(("LINE = (%d) '%.*s'\n", s->len, s->len, s->addr));
+/*      assert(0); */
+    }
+    return 0;
+}
+
+rc_t ascpParse(const char *buf, size_t len, const char *filename,
+    EAscpState *state, String *line)
+{
+    bool failure = false;
+    const char *p = buf;
+    int64_t l = len;
+    assert(buf && len && filename && state && line);
+    StringInit(line, NULL, 0, 0);
+    while (true) {
+        const char *n = string_chr(p, l, '\n');
+        const char *r = string_chr(p, l, '\r');
+        if (n == NULL) {
+            if (r != NULL) {
+                n = r;
+            }
+        }
+        else {
+            if (r != NULL) {
+                if (r < n) {
+                    n = r;
+                }
+            }
+        }
+        if (n != NULL) {
+            StringInit(line, p, n - p, (uint32_t)(n - p));
+            l -= n - p + 1;
+        }
+        else {
+            StringInit(line, p, l, (uint32_t)l);
+        }
+        if (line->addr && line->len && line->addr[line->len - 1] == '\r') {
+            line->size = line->len - 1;
+            line->len = line->len - 1;
+        }
+        if (line->addr && line->len && line->addr[0] == '\r') {
+            ++line->addr;
+            line->size = line->len - 1;
+            line->len = line->len - 1;
+        }
+        if (line->len != 0) {
+            SAscpState full;
+            rc_t rc = parseAscpLine(line, &full, filename);
+            if (rc != 0) {
+                return rc;
+            }
+            switch (full.s) {
+                case eChild:
+                    break;
+                case eUnknown:
+                    switch (*state) {
+                        case eKeyStart:
+                        case eKeyMayBeIn:
+                        case eKeyIn:
+                            *state = eKeyMayBeIn;
+                            break;
+                        case eCompleted:
+                        case eFailed:
+                        case eWriteFailed:
+                            *state = eEnd;
+                            /* report to user */
+                            break;
+                        case eProgress:
+                            if (sStatus) {
+                                OUTMSG(("\n"));
+                            }
+/*                          no break; */
+                        default:
+                            *state = eUnknown;
+                            /* report to user */
+                            break;
+                    }
+                    break;
+                case eFailed:
+                    if (*state == eProgress) {
+                        if (sStatus) {
+                            OUTMSG(("\n"));
+                        }
+                    }
+                    failure = true;
+                    *state = full.s;
+                    if (sStatus) {
+                        OUTMSG(("%s\n", full.msg));
+                    }
+/*                  no break; */
+                    break;
+                case eWriteFailed:
+                    if (*state == eProgress) {
+                        if (sStatus) {
+                            OUTMSG(("\n"));
+                        }
+                    }
+                    failure = true;
+                    *state = full.s;
+                    if (sStatus) {
+                        OUTMSG(("%s\n", full.msg));
+                    }
+/*                  no break; */
+                    break;
+                case eCompleted:
+                    if (*state == eProgress) {
+                        if (sStatus) {
+                            OUTMSG(("\n"));
+                        }
+                    }
+                    failure = false;
+                    *state = full.s;
+                    if (sStatus) {
+                        OUTMSG(("%s\n", full.msg));
+                    }
+/*                  no break; */
+                    break;
+                case eProgress:
+                    if (*state == eProgress) {
+                        if (sStatus) {
+                            OUTMSG(("\r"));
+                        }
+                    }
+                    *state = full.s;
+                    if (sStatus) {
+                        OUTMSG(("%s", full.msg));
+                    }
+                    break;
+                case eEnd:
+                    if (*state == eProgress) {
+                        if (sStatus) {
+                            OUTMSG(("\n"));
+                        }
+                    }
+                    *state = full.s;
+                    if (sStatus) {
+                        OUTMSG(("%s\n", full.msg));
+                    }
+                    /* report to user */
+                    break;
+                default:
+                    *state = full.s;
+                    break;
+            }
+            SAscpStateFini(&full);
+        }
+        if (n == NULL || l <= 0) {
+            break;
+        }
+        if (*state == eKeyEnd) {
+            String end;
+            if (_StringHas(line, "Store key in cache? (y/n) ", &end)) {
+                if (n > end.addr + end.len) {
+                    l += n - end.addr + end.len;
+                    n = end.addr + end.len - 1;
+                }
+            }
+        }
+        p = n + 1;
+        if (p >= buf + len) {
+            break;
+        }
+    }
+    if (sStatus) {
+        STSMSG(STS_FIN, ("%.*s", len, buf));
+    }
+    if (failure) {
+        /* ignore it */
+    }
+    return 0;
+}
+
+static bool _KConfigAscpDisabled(const KConfig *self, bool status) {
+    bool disabled = false;
+    const char path[] = "tools/ascp/disabled";
+    rc_t rc = KConfigReadBool(self, path, &disabled);
+    if (rc != 0) {
+        if (rc != SILENT_RC(rcKFG, rcNode, rcOpening, rcPath, rcNotFound)) {
+            DISP_RC(rc, path);
+        }
+        else {
+            if (status) {
+                STSMSG(STS_DBG, ("'%s': not found in configuration", path));
+            }
+        }
+        disabled = false;
+    }
+    else {
+        if (status) {
+            STSMSG(STS_DBG, ("'%s' = '%s'", path, disabled ? "true" : "false"));
+        }
+    }
+    return disabled;
+}
+
+static String* _KConfigAscpString(const KConfig *self,
+    const char *path, const char *name)
+{
+    String *ascp = NULL;
+    rc_t rc = KConfigReadString(self, path, &ascp);
+    if (rc == 0) {
+        assert(ascp);
+/*      STSMSG(STS_INFO, ("Using %s from configuration: '%s'",
+            name, ascp->addr)); */
+        return ascp;
+    }
+    else {
+        if (rc != SILENT_RC(rcKFG, rcNode, rcOpening, rcPath, rcNotFound)) {
+            DISP_RC(rc, path);
+        }
+        else {
+/*          STSMSG(STS_DBG, ("'%s': not found in configuration", path)); */
+        }
+        free(ascp);
+        return NULL;
+    }
+}
+
+/******************************************************************************/
+
+static int _SilentSystem(const char *fmt, ...) {
+    rc_t rc = 0;
+    char buffer[4096];
+    size_t num_writ = 0;
+    va_list args;
+    va_start(args, fmt);
+    rc = string_vprintf(buffer, sizeof buffer, &num_writ, fmt, args);
+    va_end(args);
+    if (rc != 0) {
+        LOGERR(klogInt, rc, "while making ascp command line");
+        return 1;
+    }
+    return silent_system(buffer);
+}
+
+static bool _SystemHelp(const char *command, bool status) {
+    int value = 0;
+    if (status) {
+        STSMSG(STS_DBG, ("Checking '%s'", command));
+    }
+    value = _SilentSystem("\"%s\" -h", command);
+    if (value == 0) {
+        if (status) {
+            STSMSG(STS_INFO, ("Using '%s'", command));
+        }
+        return true;
+    }
+    else {
+        if (status) {
+            STSMSG(STS_DBG, ("'%s': not found", command));
+        }
+        return false;
+    }
+}
+
+static rc_t _KConfigGetAscpRate(const KConfig *self,
+    char *max_rate, size_t max_rate_sz)
+{
+    String *s = NULL;
+
+    assert(self && max_rate && max_rate_sz);
+
+    max_rate[0] = '\0';
+
+    s = _KConfigAscpString(self, "tools/ascp/max_rate", "Aspera max rate");
+    if (s != NULL) {
+        if (s->size == 0) {
+            free(s);
+        }
+        else {
+            size_t sz = string_copy(max_rate, max_rate_sz, s->addr, s->size);
+
+            free(s);
+
+            if (sz >= max_rate_sz) {
+                return RC(rcNS, rcNode, rcReading, rcBuffer, rcInsufficient);
+            }
+        }
+
+        return 0;
+    }
+
+    return 0;
+}
+
+static rc_t _KConfigGetAscp(const KConfig *self,
+    const char **ascp_bin, const char **private_file)
+{
+    String *bin = NULL;
+    String *key = NULL;
+    assert(self && ascp_bin && private_file);
+    *ascp_bin = *private_file = NULL;
+    bin = _KConfigAscpString(self, "tools/ascp/path", "ascp");
+    key = _KConfigAscpString(self, "tools/ascp/key", "Aspera key");
+    if (bin != NULL && key != NULL) {
+        *ascp_bin = string_dup_measure(bin->addr, NULL);
+        *private_file = string_dup_measure(key->addr, NULL);
+        free(bin);
+        free(key);
+        if (*ascp_bin == NULL || *private_file == NULL) {
+            free((void*)*ascp_bin);
+            free((void*)*private_file);
+            *ascp_bin = *private_file = NULL;
+            return RC(rcNS, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+        return 0;
+    }
+    free(bin);
+    free(key);
+    return 0;
+}
+static bool _KDirectoryFileFound(const KDirectory *self,
+    const char *path, bool status)
+{
+    KPathType type = kptNotFound;
+    if (status) {
+        STSMSG(STS_DBG, ("Checking '%s'", path));
+    }
+    type = KDirectoryPathType(self, "%s", path);
+    if ((type & ~kptAlias) == kptFile) {
+        if (status) {
+            STSMSG(STS_DBG, ("'%s': found", path));
+        }
+        return true;
+    }
+    else {
+        if (status) {
+            STSMSG(STS_DBG, ("'%s': not found", path));
+        }
+        return false;
+    }
+}
+
+static rc_t returnAscp(const char *bin, const char *key,
+    const char **ascp_bin, const char **private_file, bool *found)
+{
+    assert(found);
+    *found = false;
+
+    if (bin == NULL || key == NULL) {
+        return 0;
+    }
+
+    *ascp_bin = string_dup_measure(bin, NULL);
+    *private_file = string_dup_measure(key, NULL);
+
+    if (*ascp_bin == NULL || *private_file == NULL) {
+        free((void*)*ascp_bin);
+        free((void*)*private_file);
+        *ascp_bin = *private_file = NULL;
+        return RC(rcNS,
+            rcStorage, rcAllocating, rcMemory, rcExhausted);
+    }
+
+    *found = true;
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC ascp_locate(const char **ascp_bin, const char **private_file,
+    bool use_config, bool status)
+{
+    static const char *bin = NULL;
+    static const char *key = NULL;
+    rc_t rc = 0;
+    KConfig *cfg = NULL;
+    bool found = false;
+    if (ascp_bin == NULL || private_file == NULL) {
+        return RC(rcNS, rcFile, rcCopying, rcParam, rcNull);
+    }
+    *ascp_bin = *private_file = NULL;
+    rc = returnAscp(bin, key, ascp_bin, private_file, &found);
+    if (rc != 0 || found) {
+        return rc;
+    }
+    rc = KConfigMake(&cfg, NULL);
+    if (rc != 0) {
+        return rc;
+    }
+    if (_KConfigAscpDisabled(cfg, status)) {
+        if (status) {
+            STSMSG(STS_INFO, ("Use of Aspera transfer is disabled "
+                "by the configuration, using HTTP transfer"));
+        }
+    }
+    else {
+        KDirectory *dir = NULL;
+        rc = _KConfigGetAscp(cfg, &bin, &key);
+        if (bin != NULL) {
+            assert(key && !rc);
+            RELEASE(KConfig, cfg);
+            rc = returnAscp(bin, key, ascp_bin, private_file, &found);
+            if (rc != 0 || found) {
+                return rc;
+            }
+        }
+        rc = KDirectoryNativeDir(&dir);
+        if (rc != 0) {
+            return rc;
+        }
+        while (ascp_path(&bin, &key)) {
+            if (_SystemHelp(bin, status)) {
+                if (_KDirectoryFileFound(dir, key, status)) {
+                    break;
+                }
+            }
+        }
+        RELEASE(KDirectory, dir);
+    }
+    RELEASE(KConfig, cfg);
+
+    rc = returnAscp(bin, key, ascp_bin, private_file, &found);
+    if (rc != 0 || found) {
+        return rc;
+    }
+    else {
+        return RC(rcNS, rcFile, rcCopying, rcFile, rcNotFound);
+    }
+}
+
+LIB_EXPORT rc_t CC aspera_get(
+    const char *ascp_bin, const char *private_file, const char *aSrc,
+    const char *dest, AscpOptions *opt)
+{
+    char path[PATH_MAX] = "";
+    AscpOptions dummy;
+    bool status = false;
+    int64_t prev = -1;
+    int attempt = 0;
+    KDirectory *dir = NULL;
+    TQuitting *quitting = NULL;
+    const char *src = aSrc;
+    rc_t rc = KDirectoryNativeDir(&dir);
+    if (rc != 0) {
+        return rc;
+    }
+    if (ascp_bin == NULL || private_file == NULL ||
+        src == NULL || dest == NULL)
+    {
+        return RC(rcNS, rcFile, rcCopying, rcParam, rcNull);
+    }
+    if (opt == NULL) {
+        memset(&dummy, 0, sizeof dummy);
+        opt = &dummy;
+    }
+
+    if (opt->ascp_options == NULL && opt->target_rate[0] == '\0') {
+        KConfig *cfg = NULL;
+        rc_t rc = KConfigMake(&cfg, NULL);
+        DISP_RC(rc, "cannot KConfigMake");
+        if (rc == 0) {
+            rc = _KConfigGetAscpRate(cfg,
+                opt->target_rate, sizeof opt->target_rate);
+            DISP_RC(rc, "cannot get aspera max rate");
+        }
+        RELEASE(KConfig, cfg);
+    }
+
+    sStatus = status = opt->status;
+    quitting = opt->quitting;
+
+    {
+        /* remove trailing #... or ?... from src path:
+           it could come from Revolver */
+        size_t s = string_size(aSrc);
+        const char *n = string_chr(aSrc, s, '#');
+        const char *q = string_chr(aSrc, s, '?');
+        if (q != NULL && (n == NULL || q < n)) {
+            n = q;
+        }
+        if (n != NULL) {
+            if (n - aSrc + 1 > sizeof path) {
+                return RC(rcNS, rcFile, rcCopying, rcBuffer, rcInsufficient);
+            }
+            else {
+#if _DEBUGGING
+                size_t s =
+#endif
+                    string_copy(path, sizeof path, aSrc, n - aSrc);
+                assert(s <= sizeof path);
+                src = path;
+            }
+        }
+    }
+
+    while (true) {
+        rc = run_ascp(ascp_bin, private_file, src, dest, opt);
+        if (rc == 0) {
+            if (status) {
+                STSMSG(STS_DBG, ("ascp finished with success"));
+            }
+            break;
+        }
+        else if (rc == SILENT_RC(rcExe,
+            rcProcess, rcExecuting, rcMemory, rcExhausted))
+        {
+            if (status) {
+                STSMSG(STS_DBG, ("ascp failed: %R", rc));
+            }
+            break;
+        }
+        else {
+            rc_t rc2 = 0;
+            uint64_t size = 0;
+            if (quitting != NULL) {
+                rc2 = quitting();
+                if (rc2 != 0) {
+                    break;
+                }
+            }
+            if (status) {
+                STSMSG(STS_DBG, ("ascp failed: %R", rc));
+            }
+            rc2 = KDirectoryFileSize(dir, &size, "%s", dest);
+            if (rc2 ==
+                SILENT_RC(rcFS, rcDirectory, rcAccessing, rcPath, rcNotFound))
+            {
+                if (prev < 0) {
+                    if (status) {
+                        STSMSG(0, ("fasp download failed. "
+                            "File not found. Retrying..."));
+                    }
+                    prev = 0;
+                }
+                else {
+                    if (status) {
+                        STSMSG(0, ("fasp download failed. File not found."));
+                    }
+                    break;
+                }
+            }
+            else if (rc2 != 0 || (int64_t)size < prev) {
+                if (status) {
+                    STSMSG(0, ("fasp download failed. KDirectoryFileSize "
+                        "after ascp run: rc = %ld, size = %ld", rc, size));
+                }
+                break;
+            }
+            else if ((int64_t)size > prev) {
+                if (status) {
+                    STSMSG(STS_INFO, ("  fasp download failed. %ld bytes "
+                        "received so far. Retrying...", size));
+                }
+                attempt = 0;
+                prev = size;
+            }
+            else {
+                if (attempt++ > 3) {
+                    break;
+                }
+                if (status) {
+                    STSMSG(STS_INFO, ("  fasp download failed. %ld bytes "
+                        "received so far. Retrying %d...", size, attempt));
+                }
+            }
+        }
+    }
+
+    RELEASE(KDirectory, dir);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC aspera_options(AscpOptions *opt) {
+    KConfig *cfg = NULL;
+    rc_t rc = 0;
+    if (opt == NULL) {
+        return RC(rcNS, rcFile, rcVisiting, rcParam, rcNull);
+    }
+    memset(opt, 0, sizeof *opt);
+    rc = KConfigMake(&cfg, NULL);
+    if (rc == 0) {
+        rc = _KConfigGetAscpRate(cfg,
+            opt->target_rate, sizeof opt->target_rate);
+        opt->disabled = _KConfigAscpDisabled(cfg, false);
+    }
+    RELEASE(KConfig, cfg);
+    return rc;
+}
+
+/*rc_t mkAscpCmd(const char *ascp_bin, const char *private_file,
+    const char *src, const char *dest, const AscpOptions *opt,
+    char *const argv[], size_t argvSz)
+{
+    rc_t rc = 0;
+    return rc;
+}*/
diff --git a/libs/ascp/linux/ascp-path.c b/libs/ascp/linux/ascp-path.c
new file mode 100644
index 0000000..013812c
--- /dev/null
+++ b/libs/ascp/linux/ascp-path.c
@@ -0,0 +1,119 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+
+#include "ascp-priv.h" /* ascp_path */
+
+#include <klib/printf.h> /* string_printf */
+
+#include <assert.h>
+#include <limits.h> /* PATH_MAX */
+#include <stdlib.h> /* getenv */
+
+static int size_of(const char **array) {
+    int i = 0;
+    while (*(array++) != NULL) {
+        ++i;
+    }
+    return i;
+}
+
+bool ascp_path(const char **cmd, const char **key) {
+    static int idx = 0;
+    static const char *k[] = {
+        "/opt/aspera/etc/asperaweb_id_dsa.openssh",
+        "/opt/aspera/etc/asperaweb_id_dsa.putty",
+
+        "/opt/aspera/etc/asperaweb_id_dsa.openssh",
+        "/opt/aspera/etc/asperaweb_id_dsa.putty",
+
+        "/opt/aspera/etc/asperaweb_id_dsa.openssh",
+        "/opt/aspera/etc/asperaweb_id_dsa.putty",
+        NULL
+    };
+    static const char *c[] = {
+                            "ascp",                 "ascp",
+                   "/usr/bin/ascp",        "/usr/bin/ascp",
+            "/opt/aspera/bin/ascp", "/opt/aspera/bin/ascp",
+            NULL
+        };
+    int size = size_of(c);
+    assert(cmd != NULL && key != NULL);
+    assert(size_of(c) == size_of(k));
+    if (idx < size) {
+        *cmd = c[idx];
+        *key = k[idx];
+        ++idx;
+        return true;
+    }
+    else {
+        rc_t rc = 0;
+        static char k[PATH_MAX] = "";
+        static char c[PATH_MAX] = "";
+        if (idx > size + 1) {
+            *cmd = *key = NULL;
+            idx = 0;
+            return false;
+        }
+        {
+            size_t num_writ = 0;
+            const char* home = getenv("HOME");
+            if (home == NULL) {
+                home = "";
+            }
+            if (idx == size) {
+                rc = string_printf(k, sizeof k, &num_writ,
+                    "%s/.aspera/connect/etc/asperaweb_id_dsa.openssh", home);
+            }
+            else {
+                rc = string_printf(k, sizeof k, &num_writ,
+                    "%s/.aspera/connect/etc/asperaweb_id_dsa.putty"  , home);
+            }
+            if (rc != 0 || num_writ >= PATH_MAX) {
+                assert(0);
+                k[0] = '\0';
+            }
+            else {
+                rc = string_printf(c, sizeof c, &num_writ,
+                    "%s/.aspera/connect/bin/ascp", home);
+                if (rc != 0 || num_writ >= PATH_MAX) {
+                    assert(0);
+                    c[0] = '\0';
+                }
+            }
+        }
+        if (rc != 0) {
+            *cmd = *key = NULL;
+            idx = 0;
+            return false;
+        }
+        else {
+            *cmd = c;
+            *key = k;
+            ++idx;
+            return true;
+        }
+    }
+}
diff --git a/libs/ascp/unix/connect.c b/libs/ascp/unix/connect.c
new file mode 100644
index 0000000..9ca4773
--- /dev/null
+++ b/libs/ascp/unix/connect.c
@@ -0,0 +1,618 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "ascp-priv.h" /* STS_DBG */
+
+#include <kfs/directory.h> /* KDirectory */
+
+#include <klib/time.h> /* KTimeStamp */
+#include <klib/printf.h> /* string_printf */
+#include <klib/text.h> /* string_copy */
+#include <klib/log.h> /* LOGERR */
+#include <klib/status.h> /* STSMSG */
+#include <klib/out.h> /* OUTMSG */
+#include <klib/rc.h> /* RC */
+
+#include <assert.h>
+#include <ctype.h> /* isspace */
+#include <os-native.h>
+#include <errno.h>
+#include <fcntl.h> /* open */
+#include <signal.h> /* kill */
+#include <stdlib.h> /* system */
+#include <stdio.h> /* fflush */
+#include <unistd.h> /* dup */
+#include <sys/wait.h> /* waitpid */
+
+#define DISP_RC(rc, err) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, err))
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+static int logevp(const char *file, char *const argv[]) {
+    int result = 0;
+    if (STS_INFO > KStsLevelGet()) {
+        return 0;
+    }
+    result = printf("%s", file);
+    while (true) {
+        int res = printf(" %s", *argv);
+        if (result >= 0) {
+            if (res < 0) {
+                result = res;
+            }
+            else {
+                result += res;
+            }
+        }
+        if (*(++argv) == NULL) {
+            break;
+        }
+    }
+    printf("\n");
+    return result;
+}
+
+static
+uint64_t humanize(uint64_t number, char *sfx, uint64_t *fraction)
+{
+    assert(sfx);
+    if (fraction != NULL) {
+        *fraction = 0;
+    }
+    *sfx = 'B';
+    if (number > 1024L * 1024L * 1024L) {
+        if (fraction != NULL) {
+            number *= 1000;
+        }
+        number /=     1024L * 1024L * 1024L;
+        if (fraction != NULL) {
+            *fraction = number % 1000;
+            number /= 1000;
+        }
+        *sfx = 'G';
+    }
+    else if (number > 1024L * 1024L) {
+        number /=     1024L * 1024L;
+        *sfx = 'M';
+    }
+    else if (number > 1024) {
+        number /=     1024;
+        *sfx = 'K';
+    }
+    return number;
+}
+
+static void progress(const char *acc, uint64_t sz,
+    uint64_t srcSz, uint64_t hSrc, char sfSrc, KTime_t date)
+{
+    if (sz > 0) {
+        if (srcSz > 0) {
+            uint64_t p = 100 * sz / srcSz;
+            char sf = 'B';
+            uint64_t fr = 0;
+            uint64_t h = humanize(sz, &sf, &fr);
+            if (p > 0) {
+                if (sfSrc != 'B' && sf != 'B') {
+                    if (fr == 0) {
+                        if (date == 0) {
+                            OUTMSG(("%s %,ld/%,ld %ld%c/%,ld%c %ld%%        \r",
+                                    acc, sz, srcSz, h,sf,hSrc,sfSrc,p));
+                        }
+                        else {
+                            OUTMSG(("%s %,ld/%,ld %ld%c/%,ld%c %ld%% %ld    \r",
+                                    acc, sz, srcSz, h,sf,hSrc,sfSrc,p,
+                                    KTimeStamp() - date));
+                        }
+                    }
+                    else {
+                        OUTMSG(("%s %,ld/%,ld %ld.%03ld%c/%,ld%c %ld%%      \r",
+                                acc, sz, srcSz,h,fr,sf,hSrc,sfSrc,p));
+                    }
+                }
+                else {
+                    OUTMSG(("%s %,ld/%,ld %ld%%                             \r",
+                        acc, sz, srcSz, p));
+                }
+            }
+            else {
+                if (sfSrc != 'B' && sf != 'B') {
+                    if (fr == 0) {
+                        OUTMSG((
+                        "%s %,ld/%,ld %ld%c/%ld%c                           \r",
+                         acc, sz,srcSz,h, sf,hSrc,sfSrc));
+                    }
+                    else {
+                        OUTMSG((
+                        "%s %,ld/%,ld %ld.%03ld%c/%ld%c                     \r",
+                         acc, sz,srcSz,h, fr,sf,hSrc,sfSrc));
+                    }
+                }
+                else {
+                    OUTMSG(("%s %,ld/%,ld                 \r", acc, sz, srcSz));
+                }
+            }
+        }
+        else {
+            OUTMSG(("%s %,ld                                     \r", acc, sz));
+        }
+    }
+    else {
+        OUTMSG(("                                                \r%s\r", acc));
+    }
+}
+
+/******************************************************************************/
+rc_t run_ascp(const char *path, const char *key,
+    const char *src, const char *dest, const AscpOptions *opt)
+{
+    const char *host = NULL;
+    const char *user = NULL;
+    const char *maxRate = NULL;
+    bool cache_key = false;
+    uint64_t heartbeat = 0;
+    const char *acc = NULL;
+    uint64_t srcSz = 0;
+    uint64_t id = 0;
+    TProgress *callback = NULL;
+    TQuitting *quitting = NULL;
+    rc_t rc = 0;
+    pid_t nPid = 0;
+    int pipeto[2];      /* pipe to feed the exec'ed program input */
+    int pipefrom[2];    /* pipe to get the exec'ed program output */
+#define ARGV_SZ 64
+    char *argv[ARGV_SZ];
+    char extraOptions[4096] = "";
+
+    int i = 0;
+    int ret = 0;
+    i = 0;
+
+    if (opt != NULL) {
+        acc = opt->name;
+        cache_key = opt->cache_key;
+        callback = opt->callback;
+        heartbeat = opt->heartbeat;
+        host = opt->host;
+        id = opt->id;
+        quitting = opt->quitting;
+        srcSz = opt->src_size;
+        user = opt->user;
+
+        if (opt->ascp_options != NULL) {
+            size_t s = string_size(opt->ascp_options);
+            if (s >= sizeof extraOptions) {
+                LOGERR(klogErr,
+                    RC(rcExe, rcProcess, rcCreating, rcBuffer, rcInsufficient),
+                    "extra ascp options are ignored");
+                
+                maxRate = opt->target_rate;
+            }
+            else {
+                string_copy
+                    (extraOptions, sizeof extraOptions, opt->ascp_options, s);
+            }
+        }
+        else {
+            maxRate = opt->target_rate;
+        }
+    }
+
+    if (acc == NULL) {
+        acc = dest;
+    }
+
+    if (heartbeat > 0) {
+        heartbeat /= 1000;
+        if (heartbeat == 0) {
+            heartbeat = 1;
+        }
+    }
+
+    if (pipe(pipeto) != 0) {
+        perror("pipe() to");
+        rc = RC(rcExe, rcFileDesc, rcCreating, rcFileDesc, rcFailed);
+        LOGERR(klogErr, rc, "while pipe");
+        return rc;
+    }
+    if (pipe(pipefrom) != 0) {
+        perror("pipe() from");
+        rc = RC(rcExe, rcFileDesc, rcCreating, rcFileDesc, rcFailed);
+        LOGERR(klogErr, rc, "while pipe");
+        return rc;
+    }
+
+    argv[i++] = (char*)path;
+    argv[i++] = "-i";
+    argv[i++] = (char*)key;
+    argv[i++] = "-pQTk1";
+    if (maxRate != NULL && maxRate[0] != '\0') {
+        argv[i++] = "-l";
+        argv[i++] = (char*)maxRate;
+    }
+    if (user != NULL) {
+        argv[i++] = "--user";
+        argv[i++] = (char*)user;
+    }
+    if (host != NULL) {
+        argv[i++] = "--host";
+        argv[i++] = (char*)user;
+    }
+
+    if (extraOptions[0] != '\0') {
+        bool done = false;
+        char *c = extraOptions;
+        while (!done) {
+            while (true) {
+                if (*c == '\0') {
+                    break;
+                }
+                else if (isspace(*c)) {
+                    ++c;
+                }
+                else {
+                    break;
+                }
+            }
+            if (*c == '\0') {
+                break;
+            }
+            else {
+                argv[i++] = c;
+            }
+            while (true) {
+                if (*c == '\0') {
+                    done = true;
+                    break;
+                }
+                else if (isspace(*c)) {
+                    *(c++) = '\0';
+                    break;
+                }
+                ++c;
+            }
+            if (i > ARGV_SZ - 4) {
+                LOGERR(klogErr,
+                    RC(rcExe, rcProcess, rcCreating, rcBuffer, rcInsufficient),
+                    "too mary extra ascp options - some of them are ignored");
+                break;
+            }
+        }
+    }
+
+    argv[i++] = (char*)src;
+    argv[i++] = (char*)dest;
+    argv[i++] = NULL;
+
+    logevp(path, argv);
+
+    if (quitting) {
+        rc = quitting();
+    }
+    if (rc != 0) {
+        return rc;
+    }
+
+    nPid = fork();
+    if (nPid < 0 ) {
+        perror("fork() 1");
+        rc = RC(rcExe, rcProcess, rcCreating, rcProcess, rcFailed);
+        LOGERR(klogErr, rc, "after fork");
+        return rc;
+    }
+    else if (nPid == 0) {
+        /* dup pipe read/write to stdin/stdout */
+        dup2(pipeto  [0], STDIN_FILENO);
+        dup2(pipefrom[1], STDOUT_FILENO);
+        dup2(pipefrom[1], STDERR_FILENO);
+        close(pipeto[1]);
+        ret = execvp(path, argv);
+        STSMSG(STS_DBG, ("CHILD: Done %s %s %s = %d", path, src, dest, ret));
+        exit(EXIT_FAILURE);
+    }
+    else {
+        bool progressing = false;
+        bool writeFailed = false;
+        EAscpState state = eStart;
+        const char y[] = "y\n";
+        const char n[] = "n\n";
+        int status = 0;
+        int w = 0;
+        int fd = pipefrom[0];
+        const char *answer = n;
+        String line;
+        StringInit(&line, NULL, 0, 0);
+        if (cache_key) {
+            answer = y;
+        }
+
+        {
+            int flags = fcntl(fd, F_GETFL, 0);
+            fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+        }
+
+        close(pipeto[0]);
+        close(pipefrom[1]);
+        assert(sizeof y == sizeof n);
+
+        {
+            int hang = 0;
+            uint64_t prev = 0;
+            KTime_t tPrev = 0;
+            char sfSrc = 'B';
+            uint64_t hSrc = humanize(srcSz, &sfSrc, NULL);
+            int sig = 0;
+            uint64_t i = 0;
+            KDirectory *dir = NULL;
+            rc_t rc = KDirectoryNativeDir(&dir);
+            DISP_RC(rc, "KDirectoryNativeDir");
+            if (rc != 0) {
+                return rc;
+            }
+            while (w == 0) {
+                bool quit = false;
+                w = waitpid(nPid, &status, WNOHANG);
+                if (w == 0) {
+                    bool got = false;
+                    rc_t rc = 0;
+                    if (quitting) {
+                        rc = quitting();
+                    }
+                    if (rc != 0 || quit) {
+                        if (sig == 0) {
+                            sig = SIGINT;
+                        }
+                        else if (sig >= SIGKILL) {
+                            break;
+                        }
+                        else {
+                            ++sig;
+                        }
+                        if (progressing) {
+                            OUTMSG(("\n"));
+                        }
+                        PLOGMSG(klogInfo, (klogInfo, "^C pressed: "
+                            "Senging $(sgn) to ascp", "sgn=%s", sig));
+                        kill(nPid, sig);
+                    }
+                    while (true) {
+                        char buf[4096];
+                        int s = read(fd, buf, sizeof buf);
+                        if (s == 0) {
+                            break;
+                        }
+                        else if (s < 0) {
+                            if (errno != EAGAIN) {
+                                if (progressing) {
+                                    OUTMSG(("\n"));
+                                }
+                                perror("read(child)");
+                            }
+                            break;
+                        }
+                        ascpParse(buf, s, dest, &state, &line);
+                        switch (state) {
+                            case eKeyEnd:
+                                write(pipeto[1], answer, sizeof y - 1);
+                                break;
+                            case eWriteFailed:
+                                writeFailed = true;
+                                break;
+                            default:
+                                break;
+                        }
+                        got = true;
+                    }
+                    if (!got) {
+                        KSleepMs(1000);
+                        ++i;
+                        if ((heartbeat > 0 && i >= heartbeat) || (i > 99)) {
+                            uint64_t size = 0;
+                            rc_t rc = KDirectoryFileSize(dir, &size, "%s", dest);
+                            if (rc != 0) {
+                                size = 0;
+                            }
+                            else {
+                                if (size != prev) {
+                                   prev = size;
+                                   tPrev = 0;
+                                   hang = 0;
+                                }
+                                else {
+                                    KTime_t date = 0;
+                                    rc_t rc = KDirectoryDate(dir, &date, "%s", dest);
+                                    if (rc == 0) {
+                                        tPrev = date;
+                                        if ((KTimeStamp() - date) > 60 * 99) {
+                                            /* no file update during 99' */
+                                            if (hang == 0) {
+                                                write(pipeto[1],
+                                                    answer, sizeof y - 1);
+                                                ++hang;
+                                            }
+                                            else if (hang < 9) {
+                                                ++hang;
+                                                sig = 0;
+                                            }
+                                            else {
+                                                if (sig == 0) {
+                                                    sig = SIGINT;
+                                                }
+                                                else {
+                                                    ++sig;
+                                                }
+                                                if (progressing) {
+                                                   OUTMSG(("\n"));
+                                                }
+                                                if (sig > SIGKILL) {
+                                                   rc = RC(rcExe,
+                                                       rcProcess, rcExecuting,
+                                                       rcProcess,rcDetached);
+                                                   return rc;
+                                                }
+
+                                                PLOGMSG(klogInfo, (klogInfo,
+                                                    "Senging $(sgn) to ascp",
+                                                    "sgn=%s", sig));
+                                                kill(nPid, sig);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            if (heartbeat > 0) {
+                                if (callback) {
+                                    quit = !callback(id,
+                                        eAscpStateRunning, size, 0);
+                                }
+                                else {
+                                    progress(acc, size, srcSz, hSrc, sfSrc,
+                                        tPrev);
+                                }
+                                progressing = true;
+                            }
+                            i = 0;
+                        }
+                    }
+                }
+            }
+            RELEASE(KDirectory, dir);
+        }
+
+        if (progressing) {
+            OUTMSG(("\n"));
+        }
+
+        while (1) {
+            char buf[4096];
+            int s = read(fd, buf, sizeof buf);
+            if (s == 0) {
+                break;
+            }
+            else if (s < 0) {
+                if (errno != EAGAIN) {
+                    perror("read(child)");
+                    break;
+                }
+                continue;
+            }
+            ascpParse(buf, s, dest, &state, &line);
+            if (state == eWriteFailed) {
+                writeFailed = true;
+            }
+        }
+        STSMSG(    STS_DBG, ("ascp exited with pid=%d status=%d", w, status));
+        if (WIFEXITED(status)) {
+            STSMSG(STS_DBG, ("ascp exited with exit status %d",
+                WEXITSTATUS(status)));
+        }
+        else {
+            STSMSG(STS_DBG, ("ascp has not terminated correctly"));
+        }
+        if (w == -1) {
+            perror("waitpid");
+            rc = RC(rcExe, rcProcess, rcWaiting, rcProcess, rcFailed);
+            LOGERR(klogErr, rc, "after waitpid");
+            exit(EXIT_FAILURE);
+        }
+        if (WIFEXITED(status)) {
+    	    if (WEXITSTATUS(status) == 0) {
+	            STSMSG(STS_DBG, ("ascp succeed"));
+                if (callback) {
+                    callback(id, eAscpStateExitSuccess, 0, 0);
+                }
+            } else if (writeFailed) {
+                rc = RC(rcExe, rcProcess, rcExecuting, rcMemory, rcExhausted);
+                if (callback) {
+                    callback(id, eAscpStateExitWriteFailure, 0, 0);
+                }
+            }
+            else {
+                if (rc == 0) {
+                    rc = RC(rcExe, rcProcess, rcWaiting, rcProcess, rcFailed);
+                }
+                PLOGERR(klogErr, (klogErr, rc,
+                    "ascp failed with $(ret)", "ret=%d", WEXITSTATUS(status)));
+                if (callback) {
+                    callback(id, eAscpStateExitFailure, 0, 0);
+                }
+            }
+        } else if (WIFSIGNALED(status)) {
+            if (rc == 0) {
+                if (quitting) {
+                    rc = quitting();
+                    if (rc == 0) {
+                        rc = RC(rcExe,
+                            rcProcess, rcWaiting, rcProcess, rcFailed);
+                    }
+                }
+            }
+            if (rc != SILENT_RC(rcExe, rcProcess, rcExecuting,
+                rcProcess, rcCanceled))
+            {
+                PLOGERR(klogErr, (klogErr, rc, "ascp killed by signal $(sig)",
+                    "sig=%d", WTERMSIG(status)));
+                if (callback) {
+                    callback(id, eAscpStateExitFailure, 0, 0);
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+int silent_system(const char *command) {
+    int ret = 0;
+
+    int oldOut = 0;
+    int youngOut = 0;
+    int oldErr = 0;
+    int youngErr = 0;
+
+    fflush(stdout);
+    oldOut = dup(STDOUT_FILENO);
+    youngOut = open("/dev/null", O_WRONLY);
+    dup2(youngOut, STDOUT_FILENO);
+    close(youngOut);
+
+    fflush(stderr);
+    oldErr = dup(STDERR_FILENO);
+    youngErr = open("/dev/null", O_WRONLY);
+    dup2(youngErr, STDERR_FILENO);
+    close(youngErr);
+
+    ret = system(command);
+
+    fflush(stdout);
+    dup2(oldOut, STDOUT_FILENO);
+    close(oldOut);    
+
+    fflush(stderr);
+    dup2(oldErr, STDERR_FILENO);
+    close(oldErr);    
+
+    return ret;
+}
diff --git a/libs/axf/.gitignore b/libs/axf/.gitignore
new file mode 100644
index 0000000..c253038
--- /dev/null
+++ b/libs/axf/.gitignore
@@ -0,0 +1 @@
+*.def
diff --git a/libs/axf/Makefile b/libs/axf/Makefile
new file mode 100644
index 0000000..f6e6ec6
--- /dev/null
+++ b/libs/axf/Makefile
@@ -0,0 +1,142 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/axf
+
+INT_LIBS = \
+	libaxf \
+	libwaxf
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES =     \
+	$(AXF_OBJ) \
+	$(WAXF_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(ALL_LIBS): makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(TARGDIR)/,$(ALL_LIBS))
+
+.PHONY: $(TARGDIR)/all $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# alignment transform library
+#
+$(TARGDIR)/libaxf: $(addprefix $(ILIBDIR)/libaxf.,$(ILIBEXT))
+
+AXF_SRC = \
+	ref-tbl-sub-select \
+	ref-restore-read \
+	align-restore-read \
+	raw-restore-read \
+	raw-restore-qual \
+	seq-restore-read \
+	seq-restore-linkage-group \
+	seq-construct-read \
+	cigar \
+	project_read_from_sequence \
+	not-my-row \
+	template-len \
+	get-sam-flags \
+	align-ref-pos \
+	align-ref-name \
+	align-ref-seq-id \
+	align-local_ref_id \
+	align-local_ref_start \
+	generate-mismatch-qual \
+	mismatch-restore-qual \
+	ref-preserve_qual \
+	ref-tbl \
+	make-cmp-read_desc \
+	get_mate_align_ids
+
+AXF_OBJ = \
+	$(addsuffix .$(LOBX),$(AXF_SRC))
+
+AXF_LIB = \
+	-lalign-reader \
+	-dvdb \
+	-dkdb \
+	-dklib \
+	-dm \
+	-dz
+
+$(ILIBDIR)/libaxf.$(LIBX): $(AXF_OBJ)
+	$(LD) --slib -o $@ $^ $(AXF_LIB)
+
+
+#-------------------------------------------------------------------------------
+# alignment transform update library
+#
+$(TARGDIR)/libwaxf: $(addprefix $(ILIBDIR)/libwaxf.,$(ILIBEXT))
+
+WAXF_SRC = \
+	$(AXF_SRC) \
+	refseq-stats
+
+WAXF_OBJ = \
+	$(addsuffix .$(LOBX),$(WAXF_SRC))
+
+WAXF_LIB = \
+	-lalign-reader \
+	-dwvdb \
+	-dwkdb \
+	-lkfg \
+	-dklib \
+	-dm \
+	-dz
+
+$(ILIBDIR)/libwaxf.$(LIBX): $(WAXF_OBJ)
+	$(LD) --slib -o $@ $^ $(WAXF_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/axf/align-local_ref_id.c b/libs/axf/align-local_ref_id.c
new file mode 100644
index 0000000..c1190f0
--- /dev/null
+++ b/libs/axf/align-local_ref_id.c
@@ -0,0 +1,143 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <bitstr.h>
+
+#include "ref-tbl.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+typedef struct LocalRefID LocalRefID;
+struct LocalRefID
+{
+    uint32_t max_seq_len;
+};
+
+static
+void CC LocalRefIDWhack ( void *obj )
+{
+    LocalRefID * self = obj;
+    if ( self != NULL )
+    {
+        free ( self );
+    }
+}
+
+static
+rc_t LocalRefIDMake ( LocalRefID **objp, const VTable *tbl, const VCursor *native_curs)
+{
+    rc_t rc;
+    /* create the object */
+    LocalRefID *obj = malloc ( sizeof * obj );
+    if ( obj == NULL )
+    {
+        rc = RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        const VCursor *curs=NULL;
+        /* open the reference table cursor*/
+        rc = AlignRefTableCursor( tbl, native_curs, &curs, NULL );
+        if ( rc == 0 )
+        {
+            uint32_t itmp;
+            rc = VCursorAddColumn( curs, &itmp, "(U32)MAX_SEQ_LEN" );
+            if ( rc == 0 || GetRCState( rc ) == rcExists )
+            {
+                const void *base;
+                uint32_t row_len;
+                rc = VCursorCellDataDirect( curs, 1, itmp, NULL, &base, NULL, &row_len );
+                if ( rc == 0 )
+                {
+                    assert( row_len == 1 );
+                    memmove( &obj->max_seq_len, base, 4 );
+                }
+            }
+                    
+            if ( ( GetRCObject( rc ) == ( enum RCObject )rcColumn ) && ( GetRCState( rc ) == rcNotFound ) )
+            {
+                obj->max_seq_len = 0;
+                rc = 0;
+            }
+
+            VCursorRelease( curs );
+            if ( rc == 0 )
+            {
+                *objp = obj;
+                return 0;
+            }
+        }
+        free ( obj );
+    }
+    return rc;
+}
+
+/*
+ function I64 NCBI:align:local_ref_id ( U64 global_ref_start )
+ */
+static
+rc_t CC align_local_ref_id ( void *data, const VXformInfo *info, void *Dst, const void *Src, uint64_t elem_count )
+{
+    LocalRefID const *self = ( void const *) data;
+    int64_t *dst=( int64_t* )Dst;
+    uint64_t const *global_ref_start = Src; 
+    uint64_t i;
+
+    for ( i = 0; i != elem_count; ++i )
+    {
+        dst[ i ] = global_ref_start[ i ] / self->max_seq_len + 1;
+    }
+    return 0;
+}
+
+VTRANSFACT_IMPL ( NCBI_align_local_ref_id, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    LocalRefID *fself;
+    rc_t rc = LocalRefIDMake ( & fself, info -> tbl,  (const VCursor*)info->parms );
+    if ( rc == 0 )
+    {
+        rslt -> self = fself;
+        rslt -> whack = LocalRefIDWhack;
+        rslt -> u . af = align_local_ref_id;
+        rslt -> variant = vftArray;
+    }
+
+    return rc;
+}
diff --git a/libs/axf/align-local_ref_start.c b/libs/axf/align-local_ref_start.c
new file mode 100644
index 0000000..dd7f55b
--- /dev/null
+++ b/libs/axf/align-local_ref_start.c
@@ -0,0 +1,148 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <bitstr.h>
+
+#include "ref-tbl.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+typedef struct LocalRefStart LocalRefStart;
+struct LocalRefStart
+{
+    uint32_t max_seq_len;
+};
+
+static
+void CC LocalRefStartWhack ( void *obj )
+{
+    LocalRefStart * self = obj;
+    if ( self != NULL )
+    {
+        free ( self );
+    }
+}
+
+static
+rc_t LocalRefStartMake ( LocalRefStart **objp, const VTable *tbl, const VCursor *native_curs )
+{
+    rc_t rc;
+
+    /* create the object */
+    LocalRefStart *obj = malloc( sizeof * obj );
+    if ( obj == NULL )
+    {
+        rc = RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        const VCursor *curs = NULL;
+
+        /* open the reference table cursor*/
+        rc = AlignRefTableCursor( tbl, native_curs, &curs, NULL );
+        if ( rc == 0 )
+        {
+            uint32_t itmp;
+            rc = VCursorAddColumn( curs, &itmp, "(U32)MAX_SEQ_LEN" );
+            if (  rc == 0 || GetRCState( rc ) == rcExists )
+            {
+                const void *base;
+                uint32_t row_len;
+                rc = VCursorCellDataDirect( curs, 1, itmp, NULL, &base, NULL, &row_len );
+                if( rc == 0 )
+                {
+                    assert( row_len == 1 );
+                    memmove( &obj->max_seq_len, base, 4 );
+                }
+            }
+
+            if ( GetRCObject( rc ) == ( enum RCObject ) rcColumn && GetRCState( rc ) == rcNotFound )
+            {
+                obj->max_seq_len = 0;
+                rc = 0;
+            }
+
+            VCursorRelease( curs );
+
+            if ( rc == 0 )
+            {
+                *objp = obj;
+                return 0;
+            }
+        }
+        free ( obj );
+    }
+    return rc;
+}
+
+
+/*
+ function INSDC:coord:zero NCBI:align:local_ref_start ( U64 global_ref_start )
+ */
+static
+rc_t CC align_local_ref_start ( void *data, const VXformInfo *info, void *Dst, const void *Src, uint64_t elem_count )
+{
+    LocalRefStart const *self = ( void const * )data;
+    INSDC_coord_zero *dst=Dst;
+    uint64_t const *global_ref_start = Src;
+    unsigned i;
+    
+    for ( i = 0; i != elem_count; ++i )
+    {
+        dst[ i ] = global_ref_start[ i ] % self->max_seq_len;
+    }
+    return 0;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_local_ref_start, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    LocalRefStart *fself;
+    rc_t rc = LocalRefStartMake ( & fself, info -> tbl, (const VCursor*)info->parms  );
+    if ( rc == 0 )
+    {
+        rslt -> self = fself;
+        rslt -> whack = LocalRefStartWhack;
+        rslt -> u . af = align_local_ref_start;
+        rslt -> variant = vftArray;
+    }
+
+    return rc;
+}
diff --git a/libs/axf/align-ref-name.c b/libs/axf/align-ref-name.c
new file mode 100644
index 0000000..54df755
--- /dev/null
+++ b/libs/axf/align-ref-name.c
@@ -0,0 +1,191 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+#include <klib/data-buffer.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <bitstr.h>
+
+#include "ref-tbl.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+#ifdef _DEBUGGING
+#define SUB_DEBUG(msg) DBGMSG(DBG_SRA,DBG_FLAG(DBG_SRA_SUB),msg)
+#else
+#define SUB_DEBUG(msg)
+#endif
+
+
+typedef struct RefName RefName;
+struct RefName
+{
+    const VCursor *curs;
+    uint32_t name_idx;
+};
+
+static
+void CC RefNameWhack ( void *obj )
+{
+    RefName * self = obj;
+    if ( self != NULL )
+    {
+        VCursorRelease ( self -> curs );
+        free ( self );
+    }
+}
+
+static
+rc_t RefNameMake ( RefName **objp, const VTable *tbl, const VCursor *native_curs )
+{
+    rc_t rc;
+
+    /* create the object */
+    RefName *obj = malloc ( sizeof * obj );
+    if ( obj == NULL )
+    {
+        rc = RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        obj->curs = NULL;
+        
+        SUB_DEBUG( ( "SUB.Make in 'align-ref-name.c'\n" ) );
+
+        /* open the reference cursor */
+        rc = AlignRefTableCursor( tbl, native_curs, &obj->curs, NULL );
+        if ( rc == 0 )
+        {
+            /* add columns to cursor */
+            rc = VCursorAddColumn( obj->curs, &obj->name_idx, "(utf8)REF_NAME" );
+            if ( GetRCObject( rc ) == ( enum RCObject )rcColumn && GetRCState( rc ) == rcNotFound )
+            {
+                rc = VCursorAddColumn( obj->curs, &obj->name_idx, "(utf8)NAME" );
+            }
+            if ( GetRCState( rc ) == rcExists )
+            {
+                rc = 0;
+            }
+            if ( rc == 0 )
+            {
+                *objp = obj;
+                return 0;
+            }
+            VCursorRelease ( obj -> curs );
+        }
+        free ( obj );
+    }
+    return rc;
+}
+
+
+enum align_ref_name_args {
+    REF_ID
+};
+
+/*
+ function ascii NCBI:align:ref_name ( I64 ref_id );
+*/
+static
+rc_t CC align_ref_name ( void *data, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData argv[] )
+{
+    rc_t rc;
+    RefName const *self = ( void const * )data;
+    char const *name = NULL;
+    uint32_t name_len;
+
+    /* get start and length of reference segment */
+    int64_t const *ref_id = argv[REF_ID].u.data.base;
+
+    if ( argv[ REF_ID ].u.data.elem_count == 0 )
+    {
+        rc = RC( rcAlign, rcFunction, rcExecuting, rcRow, rcNotFound );
+    }
+    else
+    {
+        assert( argv[ REF_ID ].u.data.elem_bits == sizeof( *ref_id ) * 8 );
+
+        ref_id += argv[ REF_ID ].u.data.first_elem;
+        
+        SUB_DEBUG( ( "SUB.Rd in 'align-ref-name.c' at #%lu\n", ref_id[ 0 ] ) );
+
+        rc = VCursorCellDataDirect( self->curs, ref_id[ 0 ], self->name_idx, NULL, (void const **)&name, NULL, &name_len );
+    }
+    
+    if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == rcRow )
+    {
+        name = "";
+        name_len = 0;
+    }
+    else if ( rc != 0 )
+    {
+        return rc;
+    }
+
+    rc = KDataBufferCast( rslt->data, rslt->data, sizeof( name[ 0 ] ) * 8, true );
+    if ( rc != 0 )
+        return rc;
+
+    rc = KDataBufferResize( rslt->data, name_len );
+    if ( rc != 0 )
+        return rc;
+    
+    memmove( rslt->data->base, name, sizeof( name[ 0 ] ) * name_len );
+    rslt->elem_count = name_len;
+    rslt->elem_bits = sizeof( name[ 0 ] ) * 8;
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_ref_name, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    RefName *fself;
+    rc_t rc = RefNameMake ( & fself, info -> tbl, ( const VCursor* )info->parms  );
+    if ( rc == 0 )
+    {
+        rslt -> self = fself;
+        rslt -> whack = RefNameWhack;
+        rslt -> u . rf = align_ref_name;
+        rslt -> variant = vftRow;
+    }
+
+    return rc;
+}
diff --git a/libs/axf/align-ref-pos.c b/libs/axf/align-ref-pos.c
new file mode 100644
index 0000000..066d2c1
--- /dev/null
+++ b/libs/axf/align-ref-pos.c
@@ -0,0 +1,299 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+#include <klib/data-buffer.h>
+#include <klib/container.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+#include <sysalloc.h>
+
+#include <bitstr.h>
+
+#include "ref-tbl.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#ifdef _DEBUGGING
+#define SUB_DEBUG(msg) DBGMSG(DBG_SRA,DBG_FLAG(DBG_SRA_SUB),msg)
+#else
+#define SUB_DEBUG(msg)
+#endif
+
+typedef struct RefPos RefPos;
+
+struct RefPos
+{
+    const VCursor *curs;
+    uint32_t name_idx;
+    uint32_t name_range_idx;
+    uint32_t max_seq_len;
+/***** cache ****/
+    BSTree   tr_range; /** region tree ***/
+};
+
+typedef struct {
+    int64_t start_id;
+    int64_t stop_id;
+}RowRange;
+
+typedef struct {
+    BSTNode  n;
+    RowRange rr;
+}BSTRowRange;
+
+
+static
+int64_t CC row_range_cmp ( const void *a, const BSTNode *b )
+{
+	const int64_t  *key=a;
+	const BSTRowRange *node = ( const BSTRowRange* ) b;
+	if ( key[ 0 ] < node->rr.start_id ) return -1;
+	if ( key[ 0 ] > node->rr.stop_id ) return +1;
+	return 0;
+}
+
+static
+int64_t CC row_range_sort( const BSTNode *a, const BSTNode *b )
+{
+    const BSTRowRange * item = ( const BSTRowRange* ) a;
+    const BSTRowRange * node = ( const BSTRowRange* ) b;
+    return item->rr.start_id < node->rr.start_id ?
+        -1 : item->rr.start_id > node->rr.start_id;
+}    
+
+
+static
+void CC bst_range_free ( BSTNode *n, void *ignore )
+{
+    free( n );
+}
+
+
+static
+void CC RefPosWhack ( void *obj )
+{
+    RefPos * self = obj;
+    if ( self != NULL )
+    {
+    	BSTreeWhack( &self->tr_range, bst_range_free, NULL );
+        VCursorRelease ( self -> curs );
+        free ( self );
+    }
+}
+
+static
+rc_t RefPosMake ( RefPos **objp, const VTable *tbl, const VCursor *native_curs )
+{
+    rc_t rc;
+
+    /* create the object */
+    RefPos *obj = malloc ( sizeof * obj );
+    if ( obj == NULL )
+    {
+        rc = RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        obj->curs=NULL;
+        BSTreeInit( &obj->tr_range );
+        /* open the reference table cursor*/
+
+        SUB_DEBUG( ( "SUB.Make in 'align-ref-pos.c'\n" ) );
+	  
+        rc = AlignRefTableCursor( tbl, native_curs, &obj->curs, NULL );
+        if ( rc == 0 )
+        {
+            uint32_t itmp;
+            rc = VCursorAddColumn( obj->curs, &itmp, "(U32)MAX_SEQ_LEN" );
+            if ( ( rc == 0 ) || GetRCState( rc ) == rcExists )
+            {
+                const void * base;
+                uint32_t row_len;
+                rc = VCursorCellDataDirect( obj->curs, 1, itmp, NULL, &base, NULL, &row_len );
+                if ( rc == 0 )
+                {
+                    assert( row_len == 1 );
+                    memmove( &obj->max_seq_len, base, 4 );
+                }
+            }
+
+            if ( GetRCObject( rc ) == ( enum RCObject )rcColumn && GetRCState( rc ) == rcNotFound )
+            {
+                /*** no MAX_SEQ_LEN means that REF_POS==REF_START **/
+                VCursorRelease( obj->curs );
+                obj->curs = NULL;
+                obj->max_seq_len = 0;
+                obj->name_range_idx = 0;
+                obj->name_idx = 0;
+                rc = 0;
+            }
+            else if ( rc == 0 )
+            {
+                /* add columns to cursor */
+                rc = VCursorAddColumn( obj->curs, &obj->name_idx, "(utf8)NAME" );
+                if ( rc == 0 || GetRCState( rc ) == rcExists )
+                {
+                    rc = VCursorAddColumn( obj->curs, &obj->name_range_idx, "NAME_RANGE" );
+                }
+                if ( GetRCState( rc ) == rcExists )
+                {
+                    rc = 0;
+                }
+            }
+        }
+
+        if ( rc == 0 )
+        {
+            *objp = obj;
+        }
+        else
+        {
+            VCursorRelease( obj->curs );
+            free( obj );
+        }
+    }
+
+    return rc;
+}
+
+enum align_ref_pos_args {
+    REF_ID,
+    REF_START,
+    REF_PLOIDY,
+    PLOIDY
+};
+
+
+/*
+function INSDC:coord:zero NCBI:align:ref_pos ( I64 ref_id, INSDC:coord:zero ref_start );
+*/
+static
+rc_t CC align_ref_pos ( void *data, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData argv[] )
+{
+    rc_t rc = 0;
+    RefPos const *self = ( void const * )data;
+    int64_t ref_row_id = 0;
+    INSDC_coord_zero *ref_pos;
+    unsigned const ploidy = ( unsigned const )argv[ REF_START ].u.data.elem_count;
+    unsigned i;
+
+    /* get start and length of reference segment */
+    int64_t const *ref_id = 0;
+    INSDC_coord_zero const *ref_start;
+
+    assert( argv[ REF_ID ].u.data.elem_bits == sizeof( *ref_id ) * 8 );
+    assert( argv[ REF_START ].u.data.elem_bits == sizeof( *ref_start ) * 8 );
+
+    ref_start = argv[ REF_START ].u.data.base;
+    ref_start += argv[ REF_START ].u.data.first_elem;
+
+    if ( self->curs != NULL )
+    {
+        char const *name = NULL;
+        uint32_t name_len;
+        BSTRowRange *brr;
+
+        ref_id = argv[ REF_ID ].u.data.base;
+        ref_id += argv[ REF_ID ].u.data.first_elem;
+
+        brr = ( BSTRowRange * )BSTreeFind( &self->tr_range, &ref_id[ 0 ], row_range_cmp );
+        if ( brr == NULL )
+        {
+            RowRange *new_rr;
+
+            SUB_DEBUG( ( "SUB.Rd in 'align-ref-pos.c' at #%lu\n", ref_id[ 0 ] ) );
+
+            rc = VCursorCellDataDirect( self->curs, ref_id[ 0 ], self->name_idx, NULL, (void const **)&name, NULL, &name_len );
+            if ( rc != 0 )
+                return rc;
+
+            rc = VCursorParamsSet( ( struct VCursorParams const * )self->curs, "QUERY_SEQ_NAME", "%.*s", name_len, name );
+            if ( rc != 0 )
+                return rc;
+
+            rc = VCursorCellDataDirect( self->curs, ref_id[ 0 ], self->name_range_idx, NULL, (void const **)&new_rr, NULL, NULL );
+            if ( rc != 0 )
+                return rc;
+
+            brr = malloc( sizeof( *brr ) );
+            if ( brr == NULL )
+            {
+                return RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                memmove( &brr->rr, new_rr, sizeof( *new_rr ) );
+                BSTreeInsert( ( BSTree* )&self->tr_range, ( BSTNode* )brr, row_range_sort );
+            }
+        }
+        ref_row_id = brr->rr.start_id;
+    }
+
+    rc = KDataBufferResize( rslt->data, ploidy );
+    if ( rc != 0 )
+        return rc;
+    
+    ref_pos = rslt->data->base;
+    for ( i = 0; i != ploidy; ++i )
+    {
+        ref_pos[ i ] = ref_start[ i ];
+        if ( self->curs != NULL )
+        {
+            ref_pos[ i ] += ( INSDC_coord_zero )( ( ref_id[ 0 ] - ref_row_id ) * self->max_seq_len );
+        }
+    }
+    rslt->elem_count = ploidy;
+    rslt->elem_bits = sizeof( ref_pos[ 0 ] ) * 8;
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_ref_pos, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    RefPos *fself;
+    rc_t rc = RefPosMake( &fself, info -> tbl, ( const VCursor* )info->parms );
+    if ( rc == 0 )
+    {
+        rslt -> self = fself;
+        rslt -> whack = RefPosWhack;
+        rslt -> u . rf = align_ref_pos;
+        rslt -> variant = vftRowFast;
+    }
+
+    return rc;
+}
diff --git a/libs/axf/align-ref-seq-id.c b/libs/axf/align-ref-seq-id.c
new file mode 100644
index 0000000..1d0ffda
--- /dev/null
+++ b/libs/axf/align-ref-seq-id.c
@@ -0,0 +1,188 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+#include <sysalloc.h>
+
+#include <bitstr.h>
+
+#include "ref-tbl.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#ifdef _DEBUGGING
+#define SUB_DEBUG(msg) DBGMSG(DBG_SRA,DBG_FLAG(DBG_SRA_SUB),msg)
+#else
+#define SUB_DEBUG(msg)
+#endif
+
+
+typedef struct RefSeqID RefSeqID;
+struct RefSeqID
+{
+    const VCursor *curs;
+    uint32_t seqID_idx;
+};
+
+static
+void CC RefSeqIDWhack ( void *obj )
+{
+    RefSeqID * self = obj;
+    if ( self != NULL )
+    {
+        VCursorRelease ( self -> curs );
+        free ( self );
+    }
+}
+
+static
+rc_t RefSeqIDMake ( RefSeqID **objp, const VTable *tbl, const VCursor *native_curs )
+{
+    rc_t rc;
+
+    /* create the object */
+    RefSeqID *obj = malloc ( sizeof * obj );
+    if ( obj == NULL )
+    {
+        rc = RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        obj->curs=NULL;
+
+        SUB_DEBUG( ( "SUB.Make in 'align_ref_seq_id.c'\n" ) );
+
+        /* open the reference cursor */
+        rc = AlignRefTableCursor( tbl, native_curs, &obj->curs, NULL );
+        if ( rc == 0 )
+        {
+            /* add columns to cursor */
+            rc = VCursorAddColumn( obj->curs, &obj->seqID_idx, "SEQ_ID" );
+            if ( GetRCObject( rc ) == ( enum RCObject ) rcColumn && GetRCState( rc ) == rcNotFound )
+            {
+                rc = VCursorAddColumn( obj->curs, &obj->seqID_idx, "REF_SEQ_ID" );
+            }
+            
+            if ( GetRCState( rc ) == rcExists )
+            {
+                rc = 0;
+            }
+
+            if ( rc == 0 )
+            {
+                *objp = obj;
+                return 0;
+            }
+
+            VCursorRelease ( obj -> curs );
+        }
+        free ( obj );
+    }
+    return rc;
+}
+
+enum align_ref_name_args {
+    REF_ID
+};
+
+/*
+ function ascii NCBI:align:ref_seq_id ( I64 ref_id );
+*/
+static
+rc_t CC align_ref_seq_id ( void *data, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData argv[] )
+{
+    rc_t rc;
+    RefSeqID const *self = ( void const * )data;
+    char const *name = NULL;
+    uint32_t name_len;
+
+    /* get start and length of reference segment */
+    int64_t const *ref_id = argv[REF_ID].u.data.base;
+
+    assert( argv[ REF_ID ].u.data.elem_bits == sizeof( *ref_id ) * 8) ;
+
+    if ( self->curs == NULL || argv[ REF_ID ].u.data.elem_count == 0 )
+    {
+        rslt->elem_count = 0;
+        return 0;
+    }
+
+    ref_id += argv[ REF_ID] .u.data.first_elem;
+
+    SUB_DEBUG( ( "SUB.Rd in 'align_ref_seq_id.c' at #%lu\n", ref_id[ 0 ] ) );
+    
+    rc = VCursorCellDataDirect( self->curs, ref_id[ 0 ], self->seqID_idx, NULL, (void const **)&name, NULL, &name_len );
+    if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == rcRow )
+    {
+        name = "";
+        name_len = 0;
+    }
+    else if ( rc != 0 )
+    {
+        return rc;
+    }
+
+    rc = KDataBufferCast( rslt->data, rslt->data, sizeof( name[ 0 ] ) * 8, true );
+    if ( rc != 0 )
+        return rc;
+
+    rc = KDataBufferResize( rslt->data, name_len );
+    if ( rc != 0 )
+        return rc;
+    
+    memmove( rslt->data->base, name, sizeof( name[ 0 ] ) * name_len );
+    rslt->elem_count = name_len;
+    rslt->elem_bits = sizeof( name[ 0 ] ) * 8;
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_align_ref_seq_id, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    RefSeqID *fself;
+    rc_t rc = RefSeqIDMake ( & fself, info -> tbl, (const VCursor*)info->parms  );
+    if ( rc == 0 )
+    {
+        rslt -> self = fself;
+        rslt -> whack = RefSeqIDWhack;
+        rslt -> u . rf = align_ref_seq_id;
+        rslt -> variant = vftRow;
+    }
+
+    return rc;
+}
diff --git a/libs/axf/align-restore-read.c b/libs/axf/align-restore-read.c
new file mode 100644
index 0000000..6f97c9d
--- /dev/null
+++ b/libs/axf/align-restore-read.c
@@ -0,0 +1,150 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <insdc/insdc.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+
+static
+rc_t CC align_restore_read_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    int mmi, roi, rri, di, bi;
+    const INSDC_4na_bin	*ref_read 	= argv[ 0 ].u.data.base;
+    const uint32_t	ref_read_len 	= (uint32_t)argv[ 0 ].u.data.elem_count;
+    const uint8_t	*has_mismatch	= argv[ 1 ].u.data.base;
+    const uint32_t	has_mismatch_len= (uint32_t)argv[ 1 ].u.data.elem_count;
+    const INSDC_4na_bin *mismatch	= argv[ 2 ].u.data.base;
+    const uint32_t	mismatch_len	= (uint32_t)argv[ 2 ].u.data.elem_count;
+    const uint8_t	*has_ref_offset	   = argv[ 3 ].u.data.base;
+    const uint32_t	has_ref_offset_len = (uint32_t)argv[ 3 ].u.data.elem_count;
+    const int32_t 	*ref_offset	= argv[ 4 ].u.data.base;
+    const uint32_t	ref_offset_len  = (uint32_t)argv[ 4 ].u.data.elem_count;
+    uint32_t ploidy = 1, rl;
+    const INSDC_coord_len* read_len = &has_mismatch_len;
+
+    INSDC_4na_bin *dst;
+    uint32_t	dst_len;
+    
+    assert( argv[ 0 ].u.data.elem_bits == 8 );
+    assert( argv[ 1 ].u.data.elem_bits == 8 );
+    assert( argv[ 2 ].u.data.elem_bits == 8 );
+    assert( argv[ 3 ].u.data.elem_bits == 8 );
+    assert( argv[ 4 ].u.data.elem_bits == 32 );
+
+    ref_read	   += argv [ 0 ] . u . data . first_elem;
+    has_mismatch   += argv [ 1 ] . u . data . first_elem;
+    mismatch	   += argv [ 2 ] . u . data . first_elem;
+    has_ref_offset += argv [ 3 ] . u . data . first_elem;
+    ref_offset     += argv [ 4 ] . u . data . first_elem;
+
+    if ( has_mismatch_len != has_ref_offset_len )
+		return RC( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+
+    if ( argc > 5 )
+    {
+        assert( argv[ 5 ].u.data.elem_bits == 32 );
+        ploidy = (uint32_t)argv[ 5 ].u.data.elem_count;
+        read_len = argv[ 5 ].u.data.base;
+        read_len += argv[ 5 ].u.data.first_elem;
+    }
+    dst_len = has_mismatch_len;
+
+    /* resize output row for the total number of reads */    
+    rslt -> data -> elem_bits = 8;
+    rc = KDataBufferResize ( rslt -> data, dst_len );
+    if ( rc != 0 ) return rc;
+    rslt -> elem_count = dst_len;
+    dst = rslt -> data -> base;
+
+    /**** MAIN RESTORATION LOOP ***/
+    for ( mmi = roi = rri = di = bi = 0, rl = 1; di < (int)dst_len; di++, rri++, rl++, bi++ )
+    {
+        if ( has_ref_offset[ di ] && bi >= 0 ) /** bi can only become negative on Bs; skip has_ref_offset if Bs are not exhausted ***/
+        {
+            if ( roi >= (int)ref_offset_len )
+                return RC( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+            memmove ( & bi, ref_offset + roi, sizeof bi );
+            rri += bi; /** can lead to negative rri ***/                
+            roi++;
+        }
+
+        if ( has_mismatch[ di ] )
+        {
+            if ( mmi >= (int)mismatch_len )
+                return RC( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+            dst[ di ] = mismatch[ mmi ];
+            mmi++;
+        }
+        else
+        {
+            if ( rri < 0 || rri >= (int)ref_read_len ) /*** can not have match after rolling back off the right edge ***/
+            {
+                return RC( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+            }
+            dst[ di ] = ref_read[ rri ];
+        }
+
+        if ( ploidy > 1 && rl == read_len[ 0 ] )
+        {
+            rri = -1;
+            rl = 0;
+            ploidy--;
+            read_len++;
+        }
+    }
+    return 0;
+}
+
+
+/* 
+ * function
+ * INSDC:4na:bin ALIGN:align_restore_read #1( INSDC:4na:bin ref_read, bool has_mismatch, INSDC:4na:bin mismatch, bool has_ref_offset, I32 ref_offset);
+ */
+VTRANSFACT_IMPL ( ALIGN_align_restore_read, 1, 0, 1 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+
+    rslt->u.rf = align_restore_read_impl;
+    rslt->variant = vftRow;
+    rslt -> whack = NULL;
+    return 0;
+}
diff --git a/libs/axf/cigar.c b/libs/axf/cigar.c
new file mode 100644
index 0000000..e586e29
--- /dev/null
+++ b/libs/axf/cigar.c
@@ -0,0 +1,2578 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+#include <klib/printf.h>
+
+#include <klib/out.h>
+
+#include <align/align.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <os-native.h>
+
+#include <insdc/insdc.h>
+
+#define ARG_BASE(TYPE, N) (((TYPE const *)argv[(N)].u.data.base) + argv[(N)].u.data.first_elem)
+#define ARG_ALIAS(TYPE, NAME, N) TYPE const *const NAME = ARG_BASE(TYPE, N)
+#define ARG_ALIAS_COND(TYPE, NAME, N, ALT) TYPE const *const NAME = ((argc > (N)) ? ARG_BASE(TYPE, N) : ALT)
+
+typedef struct {
+    int version;
+} self_t;
+
+static
+rc_t op2b( KDataBuffer *dst, unsigned const offset, unsigned *const count, int const opcode, unsigned oplen )
+{
+    unsigned digits = 1;
+    unsigned scale = 10;
+    
+    if ( oplen == 0 )
+    {
+        *count = 0;
+        return 0;
+    }
+
+    while ( scale < oplen )
+    {
+        scale *= 10;
+        ++digits;
+    }
+
+    if ( scale == oplen ) /* oplen is whole power of 10 */
+        ++digits;
+
+    *count = digits + 1;
+    
+    if ( dst != NULL )
+    {
+        unsigned const need = offset + digits + 1;
+        
+        if ( need > dst->elem_count )
+        {
+            rc_t rc = KDataBufferResize( dst, need );
+            if ( rc != 0 ) return rc;
+        }
+
+        {
+            char *const base = &( ( char * )dst->base )[ offset ];
+            
+            base[ digits ] = opcode;
+            do
+            {
+                unsigned const digit = oplen % 10;
+                
+                oplen /= 10;
+                base[ --digits ] = digit + '0';
+            } while ( digits );
+        }
+    }
+    return 0;
+}
+
+
+static
+rc_t cigar_string(KDataBuffer *dst, size_t boff,
+                  INSDC_coord_len *const bsize, bool const full,
+                  bool const has_mismatch[], bool const has_ref_offset[],
+                  INSDC_coord_zero const read_start, INSDC_coord_zero const read_end,
+                  int32_t const ref_offset[], unsigned const ro_len, unsigned *ro_offset)
+{
+    size_t bsz = 0;
+    unsigned nwrit;
+    uint32_t i, m, mm;
+    rc_t rc;
+    unsigned cur_off = ro_offset ? *ro_offset : 0;
+    
+#define BUF_WRITE(OP, LEN) if ((rc = op2b(dst, (unsigned const)(bsz + boff), &nwrit, (int const)(OP), (unsigned)(LEN))) != 0) return rc; bsz += nwrit;
+
+#define MACRO_FLUSH_MATCH    { BUF_WRITE('=', m); m = 0; }
+#define MACRO_FLUSH_MISMATCH { BUF_WRITE(i == read_end ? 'S' : 'X', mm); mm = 0; }
+
+#define MACRO_FLUSH_BOTH \
+if(m+mm > 0) { \
+    if(i==read_end && has_ref_offset[i]) { \
+        BUF_WRITE('M', m); BUF_WRITE('S', mm); \
+    } else { \
+        BUF_WRITE('M', m + mm) \
+    } \
+    m=mm=0; \
+}
+
+#define MACRO_FLUSH \
+if(full){ \
+    MACRO_FLUSH_MATCH; \
+    MACRO_FLUSH_MISMATCH; \
+} else { \
+    MACRO_FLUSH_BOTH; \
+}
+
+    for( i = read_start, bsz = m = mm = 0; i < (uint32_t)read_end; i++ )
+    {
+        if( has_ref_offset[ i ] ) /*** No offset in the reference **/
+        {
+            int32_t offset;
+            
+            if ( cur_off >= ro_len ) /*** bad data ***/
+                return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+            
+            offset = ref_offset[ cur_off++ ];
+            
+            if( offset > 0 ) /*** insert in the reference, delete in sequence ***/
+            {
+                if ( i == 0 ) /**** deletes in the beginning are disallowed, REF_START should have been moved and delete converted to insert **/
+                    return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+                MACRO_FLUSH;
+                BUF_WRITE( 'D', offset );
+            }
+            else if ( offset < 0 ) /**** delete from the reference ***/
+            {
+                offset = -offset;
+                if ( i + offset > (uint32_t)read_end )
+                    return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+                if ( i > 0 ) /** normally indels are before the current base ***/
+                {
+                    MACRO_FLUSH;
+                    BUF_WRITE( 'I', offset );
+                }
+                else
+                { /***  this  is a soft clip at the beginning ***/
+                    BUF_WRITE( 'S', offset );
+                }
+                i += offset;
+            }
+            else
+            { /*** Not possible ??? ***/
+                return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+            }
+        }
+
+        if ( i < (uint32_t)read_end )
+        {
+            if ( has_mismatch[ i ] )
+            {
+                if ( full )
+                {
+                    MACRO_FLUSH_MATCH;
+                }
+                mm++;
+            }
+            else
+            {
+                if ( full )
+                {
+                    MACRO_FLUSH_MISMATCH;
+                }
+                else
+                {
+                    m += mm;
+                    mm = 0;
+                }
+                m++;
+            }
+        }
+    }
+    MACRO_FLUSH;
+    *bsize = (INSDC_coord_len)bsz;
+    if ( ro_offset )
+        *ro_offset = cur_off;
+    return 0;
+    
+#undef BUF_WRITE
+#undef MACRO_FLUSH_MATCH
+#undef MACRO_FLUSH_MISMATCH
+#undef MACRO_FLUSH_BOTH
+#undef MACRO_FLUSH
+}
+
+typedef struct {
+    int opcode_M, opcode_X, opcode_S;
+} cigar_opcode_options_t;
+
+static
+rc_t cigar_string_2_0(KDataBuffer *dst,
+                      size_t boff,
+                      INSDC_coord_len *const bsize,
+                      bool const has_mismatch[],
+                      bool const has_ref_offset[],
+                      INSDC_coord_zero const read_start,
+                      INSDC_coord_zero const read_end,
+                      int32_t const ref_offset[],
+                      unsigned const ro_len,
+                      unsigned ro_offset[],
+                      unsigned const reflen,
+                      cigar_opcode_options_t const *ops)
+{
+    int ri;
+    unsigned si;
+    unsigned di;
+    rc_t rc;
+    unsigned nwrit;
+    unsigned cur_off = ro_offset ? *ro_offset : 0;
+    unsigned op_len;
+    int opcode;
+    
+#define BUF_WRITE(OP, LEN) { if ((rc = op2b(dst, (unsigned const)(di + boff), &nwrit, (int const)(OP), (unsigned)(LEN))) != 0) return rc; di += nwrit; }
+    si = read_start;
+    if ( /* !use_S && */ read_start == read_end && reflen > 0 ) /** full delete as a last ploidy ends up written nowhere  **/
+    {
+        di=0;
+        opcode = 'D';
+        op_len = reflen;
+    }
+    else for ( op_len = di = 0, opcode = ri = 0; si < ( unsigned )read_end && ri <= ( int )reflen; )
+    {
+        if ( has_ref_offset[ si ] )
+        {
+            int offs;
+            
+            if ( op_len > 0 )
+            {
+                BUF_WRITE( opcode, op_len );
+                op_len = 0;
+            }
+            if ( cur_off >= ro_len ) /*** bad data ***/
+                return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+            
+            offs = ref_offset[ cur_off++ ];
+            if ( offs < 0 )
+            {
+                unsigned j;
+                for ( j = 1; j < (unsigned)-offs && ( si + j ) < ( unsigned )read_end; )
+                {
+                    if ( has_ref_offset[ si + j ] ) /*** structured insert **/
+                    {
+                        BUF_WRITE( si ? 'I' : ops->opcode_S, j );
+                        offs += j;
+                        si   += j;
+                        j = 1;
+                    }
+                    else
+                    {
+                        j++;
+                    }
+                }
+                if ( offs < 0 )
+                {
+                    BUF_WRITE( si ? 'I' : ops->opcode_S, -offs );
+                    si -= offs;
+                }
+                continue;
+            }
+            else if ( offs > 0 )
+            {
+                BUF_WRITE( 'D', offs );
+                ri += offs;
+            }
+            else
+                return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+        }
+        
+        if ( ri < ( int )reflen )
+        {
+            int const op_nxt = ( has_mismatch[ si ] ? ops->opcode_X : ops->opcode_M );
+            
+            if ( op_len == 0 || opcode == op_nxt )
+                ++op_len;
+            else
+            {
+                BUF_WRITE( opcode, op_len );
+                op_len = 1;
+            }
+            opcode = op_nxt;
+        }
+        else
+            break;
+        ++si;
+        ++ri;
+    }
+    
+    BUF_WRITE( opcode, op_len );
+    if ( si < (unsigned)read_end )
+    {
+        if ( cur_off + 1 < ro_len )
+        {
+            assert( read_end + ref_offset[ cur_off ] == si );
+            cur_off++;
+            BUF_WRITE( 'I', read_end - si );
+        }
+        else
+        {
+            BUF_WRITE( ops->opcode_S, read_end - si );
+        }
+    }
+    *bsize = di;
+    if ( ro_offset != NULL )
+        *ro_offset = cur_off;
+    
+    return 0;
+#undef BUF_WRITE
+}
+
+static
+rc_t cigar_string_2(KDataBuffer *dst, size_t boff,
+                    INSDC_coord_len *bsize, const int version,
+                    bool const has_mismatch[], bool const has_ref_offset[],
+                    INSDC_coord_zero const read_start, INSDC_coord_zero const read_end,
+                    int32_t const ref_offset[], unsigned const ro_len, unsigned * ro_offset,
+                    unsigned const reflen, bool use_S)
+{
+    cigar_opcode_options_t const ops = {
+        version == 1 ? '=' : 'M',
+        version == 1 ? 'X' : 'M',
+        use_S ? 'S' : 'I'
+    };
+    return cigar_string_2_0(dst, boff, bsize, has_mismatch, has_ref_offset, read_start, read_end, ref_offset, ro_len, ro_offset, reflen, &ops);
+}
+
+static
+rc_t cigar_string_2_1(KDataBuffer *dst, size_t boff,
+                      INSDC_coord_len *bsize, const int version,
+                      bool const has_mismatch[], bool const has_ref_offset[],
+                      INSDC_coord_zero const read_start, INSDC_coord_zero const read_end,
+                      int32_t const ref_offset[], unsigned const ro_len, unsigned ro_offset[],
+                      uint8_t const ref_offset_type[],
+                      unsigned const reflen)
+{
+    int ri;
+    unsigned si = read_start;
+    unsigned di;
+    rc_t rc;
+    unsigned nwrit;
+    unsigned cur_off = ro_offset ? *ro_offset : 0;
+    unsigned op_len;
+    int opcode;
+    int const opM = (version & 1) ? '=' : 'M';
+    int const opX = (version & 1) ? 'X' : 'M';
+    
+#define BUF_WRITE(OP, LEN) { if ((rc = op2b(dst, (unsigned const)(di + boff), &nwrit, (int const)(OP), (unsigned)(LEN))) != 0) return rc; di += nwrit; }
+    if (read_start == read_end && reflen > 0) {
+        /** full delete as a last ploidy ends up written nowhere  **/
+        di = 0;
+        opcode = 'D';
+        op_len = reflen;
+    }
+    else for (op_len = di = 0, opcode = ri = 0; si < (unsigned)read_end && ri <= (int)reflen; ) {
+        if (has_ref_offset[si]) {
+            int offs;
+            int type;
+            
+            if (op_len > 0) {
+                BUF_WRITE(opcode, op_len);
+                op_len = 0;
+            }
+            if (cur_off >= ro_len) /*** bad data ***/
+                return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+            
+            type = ref_offset_type[cur_off];
+            offs = ref_offset[cur_off];
+            ++cur_off;
+            
+            if (offs < 0) {
+		unsigned const ins = -offs;
+		if( (version & 1) /*CIGAR_LONG*/ && type == 5 /** complete genomics **/ && ri >= ins /** safety **/){
+			BUF_WRITE('B', ins);
+			ri -= ins;
+		} else {
+			int const opc = (type == 1) ? 'S' : 'I';
+			BUF_WRITE(opc, ins);
+			si += ins;
+			continue;
+		}
+            } else if (offs > 0) {
+                int const opc = type == 0 ? 'D' : 'N';
+                
+                BUF_WRITE(opc, offs);
+                ri += offs;
+            }
+        }
+        if (ri < (int)reflen) {
+            int const op_nxt = (has_mismatch[si] ? opX : opM);
+            
+            if (op_len == 0 || opcode == op_nxt)
+                ++op_len;
+            else {
+                BUF_WRITE(opcode, op_len);
+                op_len = 1;
+            }
+            opcode = op_nxt;
+        }
+        else
+            break;
+        ++si;
+        ++ri;
+    }
+    
+    BUF_WRITE(opcode, op_len);
+    *bsize = di;
+    if (ro_offset != NULL)
+        *ro_offset = cur_off;
+    
+    return 0;
+#undef BUF_WRITE
+}
+
+static INSDC_coord_len right_soft_clip(unsigned seq_len, unsigned ref_len,
+                                       unsigned noffsets,
+                                       int32_t const ref_offset[])
+{
+    INSDC_coord_len a = ref_len;
+    unsigned i;
+    
+    for ( i = 0; i < noffsets; ++i )
+        a -= ref_offset[ i ];
+    return a < seq_len ? seq_len - a : 0;
+}
+
+static
+rc_t CC cigar_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    self_t const *self = data;
+    unsigned const rdln   = ( unsigned const )argv[ 0 ].u.data.elem_count;
+    unsigned const ro_len = ( unsigned const )argv[ 2 ].u.data.elem_count;
+    bool const *has_mismatch   = argv[ 0 ].u.data.base;
+    bool const *has_ref_offset = argv[ 1 ].u.data.base;
+    int32_t const *ref_offset  = argv[ 2 ].u.data.base;
+    rc_t rc;
+    
+    assert( argv[ 0 ].u.data.elem_bits == 8 );
+    assert( argv[ 1 ].u.data.elem_bits == 8 );
+    assert( argv[ 2 ].u.data.elem_bits == 32 );
+
+    assert( rdln == argv[ 1 ].u.data.elem_count );
+
+    has_mismatch   += argv[ 0 ].u.data.first_elem;
+    has_ref_offset += argv[ 1 ].u.data.first_elem;
+    ref_offset     += argv[ 2 ].u.data.first_elem;
+
+    rslt->data->elem_bits = 8;
+    if ( argc == 3 )
+    {
+        INSDC_coord_len count;
+        
+        rc = cigar_string( rslt->data, 0, &count, self->version & 0x1,
+                           has_mismatch, has_ref_offset,
+                           0, rdln, ref_offset, ro_len, NULL);
+        rslt->elem_count = count;
+    }
+    else
+    {
+        int32_t const *const rfln = argv[ 3 ].u.data.base;
+        INSDC_coord_len count;
+        
+        rc = cigar_string_2( rslt->data, 0, &count, self->version & 0x1,
+                            has_mismatch, has_ref_offset,
+                            0, rdln, ref_offset, ro_len, NULL,
+                            rfln[ argv[ 3 ].u.data.first_elem ], true );
+        rslt->elem_count = count;
+    }
+    return rc;
+}
+
+static
+rc_t CC cigar_impl_2 ( void *data, const VXformInfo *info, int64_t row_id,
+                        VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    self_t const *self = data;
+    bool const *has_mismatch        = argv[0].u.data.base;
+    bool const *has_ref_offset      = argv[1].u.data.base;
+    int32_t const *ref_offset       = argv[2].u.data.base;
+    INSDC_coord_len const *read_len = argv[3].u.data.base;
+    uint8_t const *const ref_offset_type = argc >= 6 ? ((uint8_t const *)argv[5].u.data.base) + argv[5].u.data.first_elem : NULL;
+    uint32_t const nreads = (uint32_t const)argv[ 3 ].u.data.elem_count;
+    uint32_t const ro_len = (uint32_t const)argv[ 2 ].u.data.elem_count;
+    uint32_t n;
+    uint32_t ro_offset = 0;
+    rc_t rc = 0;
+    INSDC_coord_zero start;
+    INSDC_coord_len *cigar_len = NULL;
+    KDataBuffer *buf = ( self->version & 0x04 ) ? NULL : rslt->data;
+    
+    assert( argv[ 0 ].u.data.elem_bits == 8 );
+    assert( argv[ 1 ].u.data.elem_bits == 8 );
+    assert( argv[ 2 ].u.data.elem_bits == 32 );
+    assert( argv[ 3 ].u.data.elem_bits == 32 );
+    
+    has_mismatch   += argv[ 0 ].u.data.first_elem;
+    has_ref_offset += argv[ 1 ].u.data.first_elem;
+    ref_offset     += argv[ 2 ].u.data.first_elem;
+    read_len       += argv[ 3 ].u.data.first_elem;
+
+    if (self->version & 0x4) {
+        rslt->data->elem_bits = sizeof(cigar_len[0]) * 8;
+        rslt->elem_count = nreads;
+
+        rc = KDataBufferResize(rslt->data, rslt->elem_count);
+        if (rc != 0)
+            return rc;
+
+        cigar_len = rslt->data->base;
+        if (argv[0].u.data.elem_count == 0 || argv[1].u.data.elem_count == 0) {
+            memset(cigar_len, 0, sizeof(cigar_len[0]) * nreads);
+            return 0;
+        }
+    }
+    else {
+        rslt->data->elem_bits = 8;
+        rslt->elem_count = 0;
+    }
+
+    for (n = 0, start = 0, ro_offset = 0; n < nreads; start += read_len[n], ++n) {
+        INSDC_coord_len cnt;
+        INSDC_coord_len *const count = (self->version & 0x04) ? cigar_len + n : &cnt;
+        
+        if (argc == 4) {
+            rc = cigar_string(buf, (size_t)rslt->elem_count, count, self->version & 0x1,
+                              has_mismatch, has_ref_offset,
+                              start, start + read_len[n],
+                              ref_offset, ro_len, &ro_offset);
+        }
+        else if (argc == 5) {
+            int32_t const *const reflen = argv[4].u.data.base;
+            
+            rc = cigar_string_2(buf, (size_t)rslt->elem_count, count, self->version & 0x1,
+                                has_mismatch, has_ref_offset,
+                                start, start + read_len[n],
+                                ref_offset, ro_len, &ro_offset,
+                                reflen[argv[4].u.data.first_elem], nreads == 1 ? true : false);
+        }
+        else { /* should be new function */
+            int32_t const *const reflen = argv[4].u.data.base;
+            
+            rc = cigar_string_2_1(buf, (size_t)rslt->elem_count, count, self->version & 0x1,
+                                  has_mismatch, has_ref_offset,
+                                  start, start + read_len[n],
+                                  ref_offset, ro_len, &ro_offset,
+                                  ref_offset_type,
+                                  reflen[argv[4].u.data.first_elem]);
+        }
+        if (rc != 0)
+            return rc;
+        if ((self->version & 0x04) == 0)
+            rslt->elem_count += cnt;
+    }
+    return 0;
+}
+
+static
+void CC self_whack( void *ptr )
+{
+    free( ptr );
+}
+
+
+/* 
+ * function
+ * ascii ALIGN:cigar #1 ( bool has_mismatch, bool has_ref_offset, I32 ref_offset);
+ */
+VTRANSFACT_IMPL ( ALIGN_cigar, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    self_t self;
+
+    self.version =cp -> argv [ 0 ] . data . u8 [ 0 ];
+    switch(self.version){
+    case 0:
+    case 1:
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcIncorrect );
+    }
+    rslt->u.rf = cigar_impl;
+    rslt->variant = vftRow;
+    rslt -> self = malloc ( sizeof self );
+    memmove(rslt -> self,&self,sizeof(self));
+    rslt -> whack = self_whack;
+
+    return 0;
+}
+
+VTRANSFACT_IMPL ( ALIGN_cigar_2, 2, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    self_t self;
+    VTypedesc const return_type = info->fdesc.desc;
+    int const version = cp->argv[0].data.u8[0];
+
+    self.version = version;
+    switch (version) {
+    case 0:
+    case 1:
+        break;
+    default:
+        return RC( rcXF, rcFunction, rcConstructing, rcParam, rcIncorrect );
+    }
+
+    if (return_type.domain == vtdAscii && return_type.intrinsic_bits == 8)
+    {
+        self.version |= 0x2;
+    }
+    else if (return_type.domain == vtdUint && return_type.intrinsic_bits == sizeof(INSDC_coord_len) * 8)
+    {
+        self.version |= 0x4;
+    }
+    else
+    {
+        return RC( rcXF, rcFunction, rcConstructing, rcParam, rcIncorrect );
+    }
+
+    rslt->u.rf = cigar_impl_2;
+    rslt->variant = vftRow;
+    rslt->self = malloc(sizeof(self));
+    if (rslt->self == NULL)
+        return RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+
+    memmove(rslt->self, &self, sizeof(self));
+    rslt->whack = self_whack;
+    return 0;
+}
+
+static
+rc_t CC edit_distance_impl ( void *data, const VXformInfo *info, int64_t row_id,
+                             VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint32_t i, roi, mrun;
+    uint32_t len = ( uint32_t ) argv[ 0 ].u.data.elem_count;
+    uint32_t *dst;
+    
+    uint8_t const *has_mismatch   = argv [ 0 ] . u . data . base;
+    uint8_t const *has_ref_offset = argv [ 1 ] . u . data . base;
+    int32_t const *ref_offset     = argv [ 2 ] . u . data . base;
+    
+    assert( argv[ 0 ].u.data.elem_bits == 8 );
+    assert( argv[ 1 ].u.data.elem_bits == 8 );
+    assert( argv[ 2 ].u.data.elem_bits == 32 );
+    
+    assert( len == argv[ 1 ].u.data.elem_count );
+    
+    has_mismatch   += argv [ 0 ] . u . data . first_elem;
+    has_ref_offset += argv [ 1 ] . u . data . first_elem;
+    ref_offset     += argv [ 2 ] . u . data . first_elem;
+    
+    /* resize output row for the total number of reads */    
+    rslt->data->elem_bits = rslt->elem_bits;
+    rc = KDataBufferResize( rslt -> data, 1 );
+    if ( rc != 0 )
+        return rc;
+    
+    rslt -> elem_count = 1;
+    dst = rslt -> data -> base;
+    dst[ 0 ] = 0;
+    if( len == 0 )
+        return 0; /** nothing to do **/
+    
+    if ( has_ref_offset[ 0 ] ) /** skip mismatches from the beginning == soft clip ***/
+    {
+        if ( ref_offset[ 0 ] > 0 )  /**** deletes in the beginning are disallowed, REF_START should have been moved and delete converted to insert **/
+            return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid  );
+
+        i = -( ref_offset [ 0 ] );
+        roi = 1;
+        mrun = 0;
+    }
+    else
+    {
+        i = roi = 0;
+    }
+
+    for ( mrun = 0; i < len; i++ )
+    {
+        if ( has_mismatch[ i ] )
+        {
+            mrun++;
+        }
+        else /*** intentionally skipping last run of mismatches **/
+        {
+            dst[ 0 ] += mrun;
+            mrun = 0;
+        }
+    }
+    return 0;
+}
+
+/*
+ * function
+ * ascii NCBI:align:edit_distance #1 ( bool has_mismatch, bool has_ref_offset, I32 ref_offset);
+ */
+VTRANSFACT_IMPL ( NCBI_align_edit_distance, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = edit_distance_impl;
+    rslt->variant = vftRow;
+    return 0;
+}
+
+
+/*
+ * edit distance = sum of lengths of inserts
+ *               + sum of lengths of deletes
+ *               + number of mismatches
+ * excluding soft clips
+ */
+
+unsigned edit_distance(bool const has_ref_offset[],
+                       bool const has_mismatch[],
+                       unsigned const readlen,
+                       unsigned const reflen,
+                       int32_t const ref_offset[],
+                       unsigned const offsets)
+{
+    if ( readlen == 0 )
+    {
+        /* full delete */
+        return reflen;
+    }
+    else
+    {
+        INSDC_coord_len const rsc = right_soft_clip( readlen, reflen, offsets, ref_offset );
+        unsigned indels = 0;
+        unsigned misses = 0;
+        unsigned i = 0;
+        unsigned j = 0;
+        
+        if ( has_ref_offset[ 0 ] && ref_offset[ j ] < 0 )
+            j = i = 1;
+        
+        /* sum of insert lengths + sum of delete lengths excluding soft clips */
+        for ( ; i < readlen - rsc; ++i )
+        {
+            if ( has_ref_offset[ i ] )
+            {
+                int const offset = ref_offset[ j++ ];
+                
+                if ( offset < 0 )
+                    indels += -offset;
+                else
+                    indels +=  offset;
+            }
+        }
+
+        /* sum of mismatches not in inserts or soft clips */
+        for ( j = i = 0; i < readlen - rsc; )
+        {
+            if ( has_ref_offset[ i ] )
+            {
+                int offset = ref_offset[ j++ ];
+                
+                if ( offset < 0 )
+                {
+                    i += -offset;
+                    continue;
+                }
+            }
+            misses += has_mismatch[ i ] ? 1 : 0;
+            ++i;
+        }
+        return indels + misses;
+    }
+}
+
+
+static
+rc_t CC edit_distance_2_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    unsigned const nreads = argc > 4 ? ( unsigned const )argv[ 4 ].u.data.elem_count : 1;
+    unsigned const len = ( unsigned const )argv[ 0 ].u.data.elem_count;
+    unsigned const noffsets = ( unsigned const )argv[ 2 ].u.data.elem_count;
+    INSDC_coord_len const dummy_rl = len;
+
+    ARG_ALIAS     ( bool           , has_mismatch  , 0 );
+    ARG_ALIAS     ( bool           , has_ref_offset, 1 );
+    ARG_ALIAS     ( int32_t        , ref_offset    , 2 );
+    ARG_ALIAS     ( INSDC_coord_len, ref_len       , 3 );
+    ARG_ALIAS_COND( INSDC_coord_len, readlen       , 4, &dummy_rl );
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( has_mismatch  [ 0 ] ) * 8 );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( has_ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( ref_offset    [ 0 ] ) * 8 );
+    assert( argv[ 3 ].u.data.elem_bits == sizeof( ref_len       [ 0 ] ) * 8 );
+
+    rslt->data->elem_bits = rslt->elem_bits;
+    if ( len == 0 )
+    {
+        return KDataBufferResize( rslt->data, rslt->elem_count = 0 );
+    }
+    
+    assert( len == argv[ 1 ].u.data.elem_count );
+
+    rslt->elem_count = nreads;
+    rc = KDataBufferResize( rslt->data, nreads );
+    if ( rc == 0 )
+    {
+        unsigned i;
+        unsigned start = 0;
+        unsigned offset = 0;
+        uint32_t *const dst = rslt->data->base;
+        
+        for ( i = 0; i < nreads; ++i )
+        {
+            unsigned const rlen = readlen[ i ];
+            unsigned j;
+            unsigned offsets = 0;
+            
+            for ( j = 0; j < rlen; ++j )
+            {
+                if ( has_ref_offset[ start + j ] )
+                    ++offsets;
+            }
+
+            if ( offsets + offset > noffsets )
+                return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+            
+            dst[ i ] = edit_distance( has_ref_offset + start,
+                                   has_mismatch + start,
+                                   rlen,
+                                   ref_len[ 0 ],
+                                   ref_offset + offset,
+                                   offsets );
+            start += rlen;
+            offset += offsets;
+        }
+    }
+    return rc;
+}
+
+
+/*
+ * function
+ * U32 NCBI:align:edit_distance #2 ( bool has_mismatch, bool has_ref_offset,
+ *     I32 ref_offset, INSDC:coord:len ref_len );
+ */
+VTRANSFACT_IMPL ( NCBI_align_edit_distance_2, 2, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = edit_distance_2_impl;
+    rslt->variant = vftRow;
+    return 0;
+}
+
+
+/*
+ * function
+ * U32 NCBI:align:edit_distance #3 ( bool has_mismatch, bool has_ref_offset,
+ *     I32 ref_offset, NCBI:align:ro_type ref_offset_type, INSDC:coord:len read_len );
+ */
+static
+rc_t CC edit_distance_3_impl(void *const data, VXformInfo const info[],
+                             int64_t const row_id,
+                             VRowResult rslt[],
+                             uint32_t const argc,
+                             VRowData const argv[/* argc */])
+{
+    rc_t rc;
+    unsigned const nreads = (unsigned const)argv[4].u.data.elem_count;
+    ARG_ALIAS(              bool, has_mismatch   , 0);
+    ARG_ALIAS(              bool, has_ref_offset , 1);
+    ARG_ALIAS(           int32_t, ref_offset     , 2);
+    ARG_ALIAS(NCBI_align_ro_type, ref_offset_type, 3);
+    ARG_ALIAS(   INSDC_coord_len, read_len       , 4);
+    
+    rslt->data->elem_bits = rslt->elem_bits;
+    rslt->elem_count = nreads;
+    rc = KDataBufferResize(rslt->data, nreads);
+    if (rc == 0) {
+        uint32_t *const result = rslt->data->base;
+        unsigned cur = 0;
+        unsigned cur_ro = 0;
+        unsigned n;
+        
+        for (n = 0; n < nreads; ++n) {
+            unsigned const len = read_len[n];
+            unsigned j;
+            unsigned miss = 0;
+            unsigned indel = 0;
+            unsigned cur_ro2 = cur_ro;
+            
+            for (j = 0; j < len; ) {
+                if (has_ref_offset[cur] != 0) {
+                    int const offset = ref_offset[cur_ro];
+                    
+                    ++cur_ro;
+                    if (offset < 0) {
+                        unsigned const dist = -offset;
+                        
+                        cur += dist;
+                        j += dist;
+                        continue;
+                    }
+                }
+                if (has_mismatch[cur])
+                    ++miss;
+                ++cur;
+                ++j;
+            }
+            while (cur_ro2 < cur_ro) {
+                int const type = ref_offset_type[cur_ro2];
+                
+                if (type == 0) {
+                    int const offset = ref_offset[cur_ro2];
+                    
+                    if (offset < 0)
+                        indel += -offset;
+                    else
+                        indel += +offset;
+                }
+                ++cur_ro2;
+            }
+            result[n] = miss + indel;
+        }
+    }
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_align_edit_distance_3, 3, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+     VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = edit_distance_3_impl;
+    rslt->variant = vftRow;
+    return 0;
+}
+
+
+/*
+ * function bool ALIGN:generate_has_mismatch #1 (INSDC:4na:bin reference,
+ *     INSDC:4na:bin subject, bool has_ref_offset, I32 ref_offset);
+ */
+static
+rc_t CC generate_has_mismatch_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    int32_t si, ri, roi;
+    uint32_t ref_len = ( uint32_t )argv[ 0 ].u.data.elem_count;
+    uint32_t sbj_len = ( uint32_t )argv[ 1 ].u.data.elem_count;
+    uint32_t hro_len = ( uint32_t )argv[ 2 ].u.data.elem_count;
+    uint32_t ro_len  = ( uint32_t )argv[ 3 ].u.data.elem_count;
+    const uint8_t *ref  = argv [ 0 ] . u . data . base;
+    const uint8_t *sbj  = argv [ 1 ] . u . data . base;
+    const uint8_t *has_ref_offset     = argv [ 2 ] . u . data . base;
+    const int32_t *ref_offset = argv [ 3 ] . u . data . base;
+
+    uint8_t * dst;
+    uint32_t  len = 0;
+
+    rslt -> data -> elem_bits = 8;
+    if ( sbj_len == 0 )
+    {
+        rc = KDataBufferResize ( rslt -> data, 0 );
+        if ( rc != 0 )
+            return rc;
+        rslt -> elem_count = 0;
+        return 0;
+    }
+    assert( sbj_len == hro_len );
+    len = sbj_len;
+
+    ref            += argv [ 0 ] . u . data . first_elem;
+    sbj            += argv [ 1 ] . u . data . first_elem;
+    has_ref_offset += argv [ 2 ] . u . data . first_elem;
+    ref_offset     += argv [ 3 ] . u . data . first_elem;
+
+    /* resize output row for the total number of reads */
+    rslt -> data -> elem_bits = 8;
+    rc = KDataBufferResize ( rslt -> data, len );
+    if ( rc != 0 )
+        return rc;
+    rslt -> elem_count = len;
+    dst = rslt -> data->base;
+    for ( si = ri = roi = 0; si < ( int32_t )len; si++, ri++ )
+    {
+        if ( has_ref_offset[ si ] != 0 ) /*** need to offset the reference ***/
+        {
+            if ( roi >= ( int32_t )ro_len )
+            {
+                return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+            }
+            ri += ref_offset[ roi++ ];
+        }
+
+        if ( ri >= 0 && ri < ( int32_t )ref_len && sbj[ si ] == ref[ ri ] )
+            dst[ si ]=0;
+        else
+            dst[ si ]=1;
+    }
+    return 0;
+}
+
+
+VTRANSFACT_IMPL ( ALIGN_generate_has_mismatch, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = generate_has_mismatch_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+/*
+ * function bool ALIGN:generate_mismatch #1 (INSDC:4na:bin reference,INSDC:4na:bin subject, bool has_ref_offset, I32 ref_offset);
+ */
+static
+rc_t CC generate_mismatch_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    int32_t si, ri, roi;
+    uint32_t ref_len = ( uint32_t )argv[ 0 ].u.data.elem_count;
+    uint32_t sbj_len = ( uint32_t )argv[ 1 ].u.data.elem_count;
+    uint32_t hro_len = ( uint32_t )argv[ 2 ].u.data.elem_count;
+    uint32_t ro_len  = ( uint32_t )argv[ 3 ].u.data.elem_count;
+    const uint8_t *ref  = argv [ 0 ] . u . data . base;
+    const uint8_t *sbj  = argv [ 1 ] . u . data . base;
+    const uint8_t *has_ref_offset     = argv [ 2 ] . u . data . base;
+    const int32_t *ref_offset = argv [ 3 ] . u . data . base;
+    uint8_t	buf[ 5 * 1024 ];
+    uint32_t  len;
+
+    rslt -> data -> elem_bits = 8;
+    if ( sbj_len == 0 )
+    {
+        return KDataBufferResize( rslt->data, rslt->elem_count = 0 );
+    }
+    assert( sbj_len == hro_len );
+
+    ref            += argv [ 0 ] . u . data . first_elem;
+    sbj            += argv [ 1 ] . u . data . first_elem;
+    has_ref_offset += argv [ 2 ] . u . data . first_elem;
+    ref_offset     += argv [ 3 ] . u . data . first_elem;
+
+    for ( si = ri = roi = 0, len = 0; si < ( int32_t )sbj_len; si++, ri++ )
+    {
+        if ( has_ref_offset[ si ] != 0 )/*** need to offset the reference ***/
+        {
+            if ( roi >= ( int32_t )ro_len )
+            {
+                return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+            }
+            ri += ref_offset[ roi++ ];
+        }
+
+        if ( ri >=0 && ri < ( int32_t )ref_len && sbj[ si ] == ref[ ri ] )
+        {
+            /*noop*/
+        }
+        else
+        {
+            if ( len > sizeof( buf ) )
+                return RC( rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient );
+
+            buf[ len++ ] = sbj[ si ];
+        }
+    }
+
+    /* resize output row for the total number of reads */
+    rc = KDataBufferResize ( rslt -> data, len );
+    if ( rc != 0 )
+        return rc;
+    rslt -> elem_count = len;
+    memmove( rslt -> data->base, buf, len );
+    return 0;
+}
+
+
+VTRANSFACT_IMPL ( ALIGN_generate_mismatch, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = generate_mismatch_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+
+/*
+ * function INSDC:quality:phred NCBI:align:generate_mismatch_qual #1 (INSDC:quality:phred qual,bool has_mismatch)
+ */
+static
+rc_t CC generate_mismatch_qual_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const uint8_t *q    = argv[ 0 ].u.data.base; 
+    const uint8_t *h_mm = argv[ 1 ].u.data.base;
+    uint8_t	buf[ 5 * 1024 ];
+    uint32_t mm_cnt, i;
+
+    q    += argv[ 0 ].u.data.first_elem;
+    h_mm += argv[ 1 ].u.data.first_elem;
+
+    for ( mm_cnt = 0, i = 0; i < argv[ 0 ].u.data.elem_count; i++ )
+    {
+        if( h_mm[ i ] )
+        {
+            buf[ mm_cnt++ ] = q[ i ];
+        }
+    }
+
+    /* resize output row for the total number of reads */
+    rslt -> data -> elem_bits = 8;
+    rc = KDataBufferResize ( rslt -> data, mm_cnt );
+    if ( rc != 0 )
+        return rc;
+    rslt -> elem_count = mm_cnt;
+    if ( mm_cnt > 0 )
+        memmove( rslt -> data->base, buf, mm_cnt );
+
+    return 0;
+}
+
+
+VTRANSFACT_IMPL ( ALIGN_generate_mismatch_qual, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = generate_mismatch_qual_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+
+/*
+ * function ascii NCBI:align:get_mismatch_read #1
+ *    ( bool has_mismatch, INSDC:dna:text mismatch )
+ */
+static
+rc_t CC get_mismatch_read_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    char *result;
+    unsigned const readlen = ( unsigned const )argv[ 0 ].u.data.elem_count;
+    
+    rslt->data->elem_bits = sizeof( result[ 0 ] ) * 8;
+    rslt->elem_count = readlen;
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc == 0 )
+    {
+        unsigned i;
+        unsigned j;
+        bool const *has_mismatch = argv[ 0 ].u.data.base;
+        char const *mismatch = argv[ 1 ].u.data.base;
+        
+        assert( argv[ 0 ].u.data.elem_bits == sizeof( has_mismatch[ 0 ] ) * 8 );
+        has_mismatch += argv[ 0 ].u.data.first_elem;
+        
+        assert( argv[ 1 ].u.data.elem_bits == sizeof( mismatch[ 0 ] ) * 8 );
+        mismatch += argv[ 1 ].u.data.first_elem;
+        
+        result = rslt->data->base;
+        for ( i = j = 0; i != readlen; ++i )
+        {
+            result[ i ] = has_mismatch[ i ] ? mismatch[ j++ ] : '=';
+        }
+    }
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_mismatch_read, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = get_mismatch_read_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+
+/*
+ * function INSDC:coord:len NCBI:align:get_left_soft_clip #1 (
+ *     bool has_ref_offset, INSDC:coord:zero ref_offset )
+ */
+static
+rc_t CC left_soft_clip_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    INSDC_coord_len result;
+    unsigned const n_offsets = ( unsigned const )argv[ 1 ].u.data.elem_count;
+    
+    result = 0;
+    
+    if ( n_offsets > 0 )
+    {
+        bool const *has_ref_offset = argv[ 0 ].u.data.base;
+        int32_t const *ref_offset = argv[ 1 ].u.data.base;
+        
+        assert( argv[ 0 ].u.data.elem_bits == sizeof( has_ref_offset[ 0 ] ) * 8 );
+        assert( argv[ 1 ].u.data.elem_bits == sizeof( ref_offset[ 0 ] ) * 8 );
+        
+        has_ref_offset += argv[ 0 ].u.data.first_elem;
+        ref_offset += argv[ 1 ].u.data.first_elem;
+        
+        if ( has_ref_offset[ 0 ] && ref_offset[ 0 ] < 0 )
+        {
+            result = -ref_offset[ 0 ];
+        }
+    }
+
+    rslt->data->elem_bits = sizeof( result ) * 8;
+    rslt->elem_count = 1;
+    rc = KDataBufferResize( rslt->data, 1 );
+    if ( rc == 0 )
+        memmove( rslt->data->base, &result, sizeof( result ) );
+
+    return rc;
+}
+
+
+static
+rc_t CC left_soft_clip_impl_2 ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    INSDC_coord_len* result;
+    const bool* has_ref_offset = argv[ 0 ].u.data.base;
+    const int32_t* ref_offset = argv[ 1 ].u.data.base;
+    const uint64_t n_offsets = argv[ 1 ].u.data.elem_count;
+    const INSDC_coord_len* read_len = argv[ 2 ].u.data.base;
+    const uint32_t nreads = ( const uint32_t )argv[ 2 ].u.data.elem_count;
+    uint32_t n, roi;
+    INSDC_coord_zero start;
+
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( has_ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( read_len[ 0 ] ) * 8 );
+    
+    has_ref_offset += argv[ 0 ].u.data.first_elem;
+    ref_offset += argv[ 1 ].u.data.first_elem;
+    read_len += argv[ 2 ].u.data.first_elem;
+
+    rslt->data->elem_bits = sizeof( *result ) * 8;
+    rslt->elem_count = nreads;
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    result = rslt->data->base;
+
+    for ( n = roi = start = 0; rc == 0 && n < nreads; start += read_len[ n++ ] )
+    {
+        if ( has_ref_offset[ start ] && ref_offset[ roi ] < 0 )
+        {
+            if ( roi >= n_offsets )
+            {
+                rc = RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+                break;
+            }
+            result[ n ] = -ref_offset[ roi ];
+        }
+        else
+        {
+            result[ n ] = 0;
+        }
+
+        if ( n < nreads - 1 && roi < n_offsets )
+        {
+            /* scroll through has_ref_offset and consume ref_offsets for this read
+               only if there is next read or more offsets */
+            uint32_t k;
+            for ( k = start; k < start + read_len[ n ]; k++ )
+            {
+                if ( has_ref_offset[ k ] )
+                {
+                    if ( roi >= n_offsets )
+                    {
+                        rc = RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+                        break;
+                    }
+                    roi++;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_left_soft_clip, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = left_soft_clip_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_left_soft_clip_2, 2, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = left_soft_clip_impl_2;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+/*
+ * function INSDC:coord:len NCBI:align:get_right_soft_clip #1 ( 
+ *     bool has_mismatch, INSDC:coord:len left_clip )
+ */
+static
+rc_t CC right_soft_clip_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    INSDC_coord_len result = 0;
+    INSDC_coord_len left = 0;
+    uint32_t right = ( uint32_t )argv[ 0 ].u.data.elem_count;
+    bool const *has_mismatch = argv[ 0 ].u.data.base;
+    bool const *has_ref_offset = NULL;
+    int32_t    last_ref_offset = 0;
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( has_mismatch[ 0 ] ) * 8 );
+    has_mismatch += argv[ 0 ].u.data.first_elem;
+    
+    if ( argc > 2 )
+    {
+        has_ref_offset = argv[ 2 ].u.data.base;
+        has_ref_offset += argv[ 2 ].u.data.first_elem;
+        if ( argc > 3 )
+        {
+            const int32_t *ro = argv[ 3 ].u.data.base;
+            ro += argv[ 3 ].u.data.first_elem;
+            if ( argv[ 3 ].u.data.elem_count > 0 )
+            {
+                last_ref_offset = ro[ argv[ 3 ].u.data.elem_count - 1 ];
+            }
+        }
+    }
+    
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( left ) * 8 );
+    left = ( ( INSDC_coord_len const * )argv[ 1 ].u.data.base )[ argv[ 1 ].u.data.first_elem ];
+    
+    while ( right != left && has_mismatch[ right - 1 ] &&
+            ( has_ref_offset == NULL || has_ref_offset[ right - 1 ] == 0 ) )
+    {
+        ++result;
+        --right;
+    }
+
+    while ( right > 0 && last_ref_offset < 0 && has_ref_offset[ right - 1 ] == 0 ) /*** some mismatches from left needs to be recovered to cover for inserts **/
+    {
+        last_ref_offset++;
+        right--;
+    }
+
+    if ( last_ref_offset < -1 )
+    {
+        last_ref_offset ++;
+        if ( result < (INSDC_coord_len)-last_ref_offset )
+            result=0;
+        else
+            result += last_ref_offset;
+    }
+    else if ( last_ref_offset > 0 )
+    {
+        result += last_ref_offset;
+    }
+    
+    rslt->data->elem_bits = sizeof( result ) * 8;
+    rslt->elem_count = 1;
+    rc = KDataBufferResize( rslt->data, 1 );
+    if ( rc == 0 )
+        memmove( rslt->data->base, &result, sizeof( result ) );
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_right_soft_clip, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = right_soft_clip_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_right_soft_clip_2, 2, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = right_soft_clip_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+/*
+ * function INSDC:coord:len NCBI:align:get_right_soft_clip #3 
+ *     ( bool has_ref_offset, I32 ref_offset, INSDC:coord:len ref_len )
+ */
+static
+rc_t CC right_soft_clip_3_impl ( void *data, const VXformInfo *info, int64_t row_id,
+                              VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    INSDC_coord_len const ref_len = ( ( INSDC_coord_len const * )argv[ 2 ].u.data.base )[ argv[ 2 ].u.data.first_elem ];
+    unsigned const seq_len = ( unsigned const )argv[ 0 ].u.data.elem_count;
+    int32_t const *ref_offset  = &( ( int32_t const * )argv[ 1 ].u.data.base )[ argv[ 1 ].u.data.first_elem ];
+    unsigned const n = ( unsigned const )argv[ 1 ].u.data.elem_count;
+    
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( ref_len         ) * 8 );
+
+    rslt->data->elem_bits = rslt->elem_bits;
+    rslt->elem_count = 1;
+    rc = KDataBufferResize( rslt->data, 1 );
+    if ( rc == 0 )
+    {
+        ( ( INSDC_coord_len * )rslt->data->base )[ 0 ] = right_soft_clip( seq_len, ref_len, n, ref_offset );
+    }
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_right_soft_clip_3, 3, 0, 0 )
+    ( const void *Self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = right_soft_clip_3_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+static
+rc_t CC right_soft_clip_4_impl ( void *data, const VXformInfo *info, int64_t row_id,
+                                 VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    INSDC_coord_len* result;
+    const bool* has_ref_offset = argv[ 0 ].u.data.base;
+    const int32_t* ref_offset = argv[ 1 ].u.data.base;
+#if 0
+    const uint64_t n_offsets = argv[ 1 ].u.data.elem_count;
+#endif
+    const INSDC_coord_len* read_len = argv[ 2 ].u.data.base;
+    const uint32_t nreads = ( const uint32_t )argv[ 2 ].u.data.elem_count;
+    const INSDC_coord_len* ref_len = argv[ 3 ].u.data.base;
+    uint32_t n, roi;
+    INSDC_coord_zero start;
+
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( has_ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( read_len[ 0 ] ) * 8 );
+    assert( argv[ 3 ].u.data.elem_bits == sizeof( ref_len[ 0 ] ) * 8 );
+    assert( argv[ 3 ].u.data.elem_count == 1);
+    
+    has_ref_offset += argv[ 0 ].u.data.first_elem;
+    ref_offset += argv[ 1 ].u.data.first_elem;
+    read_len += argv[ 2 ].u.data.first_elem;
+    ref_len += argv[ 3 ].u.data.first_elem;
+
+    rslt->data->elem_bits = sizeof( *result ) * 8;
+    rslt->elem_count = nreads;
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    result = rslt->data->base;
+
+    for( n = roi = start = 0; rc == 0 && n < nreads; ++n )
+    {
+        INSDC_coord_len const rlen = read_len[ n ];
+        unsigned k;
+        unsigned offset_count;
+        
+        for ( k = offset_count = 0; k < rlen; ++k )
+        {
+            if ( has_ref_offset[ k + start ] )
+                ++offset_count;
+        }
+
+        result[ n ] = right_soft_clip( rlen, ref_len[ 0 ], offset_count, ref_offset );
+        ref_offset += offset_count;
+        start += rlen;
+#if 0
+        result[ n ] = read_len[ n ] - ref_len[ 0 ];
+        for ( k = start; k < start + read_len[ n ]; k++ )
+        {
+            if ( has_ref_offset[ k ] )
+            {
+                if ( roi >= n_offsets )
+                {
+                    rc = RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+                    break;
+                }
+                result[ n ] += ref_offset[ roi++ ];
+            }
+        }
+#endif
+    }
+
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_align_get_right_soft_clip_4, 4, 0, 0 )
+    ( const void *Self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = right_soft_clip_4_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+/* extern function INSDC:coord:len NCBI:align:get_right_soft_clip #5
+ *     ( bool has_ref_offset, I32 ref_offset, NCBI:align:ro_type ref_offset_type,
+ *		 INSDC:coord:len read_len )
+ */
+static
+rc_t CC right_soft_clip_5_impl ( void *data, const VXformInfo *info, int64_t row_id,
+                                VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    unsigned const nreads = argv[3].u.data.elem_count;
+    ARG_ALIAS(              bool,  has_ref_offset, 0);
+    ARG_ALIAS(           int32_t,      ref_offset, 1);
+    ARG_ALIAS(NCBI_align_ro_type, ref_offset_type, 2);
+    ARG_ALIAS(   INSDC_coord_len,        read_len, 3);
+    
+    rslt->data->elem_bits = sizeof(INSDC_coord_len) * 8;
+    rslt->elem_count = nreads;
+    rc = KDataBufferResize(rslt->data, nreads);
+    if (rc == 0) {
+        INSDC_coord_len *const result = rslt->data->base;
+        unsigned cur = 0;
+        unsigned cur_ro = 0;
+        unsigned n;
+        
+        for (n = 0; n < nreads; ++n) {
+            unsigned const len = read_len[n];
+            unsigned clip = 0;
+            unsigned j;
+            
+            for (j = 0; j < len; ++j, ++cur) {
+                if (has_ref_offset[cur] != 0) {
+                    int const offset = ref_offset[cur_ro];
+                    int const type = ref_offset_type[cur_ro];
+                    
+                    ++cur_ro;
+                    if (j > 0 && offset < 0 && type == 1) {
+                        assert(clip == 0);
+                        clip = -offset;
+                    }
+                }
+            }
+            result[n] = clip;
+        }
+    }
+    
+    return rc;
+}
+
+VTRANSFACT_IMPL(NCBI_align_get_right_soft_clip_5, 5, 0, 0 )
+    (const void *Self, const VXfactInfo *info, VFuncDesc *rslt,
+     const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = right_soft_clip_5_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+/*
+ * function ascii NCBI:align:get_clipped_cigar #1 ( ascii cigar )
+ */
+static
+rc_t CC clipped_cigar_impl ( void *data, const VXformInfo *info, int64_t row_id,
+                              VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    char const *cigar = argv[ 0 ].u.data.base;
+    unsigned const ciglen = ( unsigned const )argv[ 0 ].u.data.elem_count;
+    int n;
+    unsigned start = 0;
+    unsigned end = ciglen;
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( cigar[ 0 ] ) * 8 );
+    cigar += argv[ 0 ].u.data.first_elem;
+    
+    for ( n = 0; n != ciglen; ++n )
+    {
+        if ( !isdigit( cigar[ n ] ) )
+            break;
+    }
+
+    if ( cigar[ n ] == 'S' )
+        start = n + 1;
+    
+    if ( cigar[ end - 1 ] == 'S' )
+    {
+        --end;
+        while ( end > start && isdigit( cigar[ end - 1 ] ) )
+            --end;
+    }
+    
+    rslt->data->elem_bits = sizeof( cigar[ 0 ] ) * 8;
+    rslt->elem_count = ( end > start ) ? end - start : 0;
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc == 0 && rslt->elem_count > 0 )
+        memmove( rslt->data->base, &cigar[ start ], ( size_t )rslt->elem_count );
+    
+    return rc;
+}
+
+static
+rc_t CC clipped_cigar_impl_v2 ( void *data, const VXformInfo *info, int64_t row_id,
+                                VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc = 0;
+    const char* cigar = argv[ 0 ].u.data.base;
+    const INSDC_coord_len* cigar_len = argv[ 1 ].u.data.base;
+    const uint32_t nreads = ( const uint32_t )argv[ 1 ].u.data.elem_count;
+    INSDC_coord_len * new_cigar_len;
+    uint32_t n;
+    INSDC_coord_zero rstart;
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( *cigar ) * 8 );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( *cigar_len ) * 8 );
+
+    if ( argv[ 0 ].u.data.elem_count == 0 )
+    {
+        return KDataBufferResize( rslt->data, rslt->elem_count = 0 );
+    }
+    
+    cigar += argv[ 0 ].u.data.first_elem;
+    cigar_len += argv[ 1 ].u.data.first_elem;
+
+    if ( data != NULL )
+    {
+        rslt->data->elem_bits = sizeof( *cigar_len ) * 8;
+        rslt->elem_count = nreads;
+        rc = KDataBufferResize( rslt->data, rslt->elem_count );
+        new_cigar_len = rslt->data->base;
+    }
+    else
+    {
+        rslt->elem_count = 0;
+        rslt->data->elem_bits = sizeof( *cigar ) * 8;
+    }
+
+    for ( n = rstart = 0; n < nreads; rstart += cigar_len[ n++ ] )
+    {
+        INSDC_coord_zero i = rstart, start = rstart;
+        INSDC_coord_zero end = start + cigar_len[ n ];
+
+        /* drop all \d+S groups at head */
+        while ( i < end )
+        {
+            if ( cigar[ i ] == 'S' )
+            {
+                start = i + 1;
+            }
+            else if ( !isdigit( cigar[ i ] ) )
+            {
+                break;
+            }
+            i++;
+        }
+
+        /* drop all \d+S groups at tail */
+        while ( end > start )
+        {
+            end--;
+            if ( cigar[ end ] != 'S' && !isdigit( cigar[ end ] ) )
+            {
+                break;
+            }
+        }
+
+        if ( data == NULL )
+        {
+            int64_t x = end - start + 1;
+            if ( x > 0 )
+            {
+                rc = KDataBufferResize( rslt->data, rslt->elem_count + x );
+                if ( rc == 0 )
+                {
+                    char* b = rslt->data->base;
+                    memmove( &b[ rslt->elem_count ], &cigar[ start ], ( size_t )x );
+                    rslt->elem_count += x;
+                }
+            }
+        }
+        else
+        {
+            new_cigar_len[ n ] = end - start + 1;
+        }
+    }
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_clipped_cigar, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = clipped_cigar_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_clipped_cigar_2, 2, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    const VTypedesc* tp = &info->fdesc.desc;
+
+    if ( tp->domain == vtdAscii && tp->intrinsic_bits == 8 )
+    {
+        rslt->self = NULL;
+    }
+    else if ( tp->domain == vtdUint && tp->intrinsic_bits == sizeof( INSDC_coord_len ) * 8 )
+    {
+        rslt->self = rslt; /* something different from NULL :) */
+    }
+    else
+    {
+        return RC( rcXF, rcFunction, rcConstructing, rcParam, rcIncorrect );
+    }
+    rslt->u.rf = clipped_cigar_impl_v2;
+    rslt->variant = vftRow;
+    rslt->whack = NULL;
+    return 0;
+}
+
+
+
+/*
+ * function I32 NCBI:align:get_clipped_ref_offset #1 (
+ *     bool has_ref_offset, I32 ref_offset )
+ */
+static
+rc_t CC clipped_ref_offset_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    unsigned start = 0;
+    unsigned const n_offsets = ( unsigned const )argv[ 1 ].u.data.elem_count;
+    int32_t const *ref_offset = argv[ 1 ].u.data.base;
+    
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( ref_offset[ 0 ] ) * 8 );
+    ref_offset += argv[ 1 ].u.data.first_elem;
+    
+    if ( n_offsets > 0 )
+    {
+        bool const *has_ref_offset = argv[ 0 ].u.data.base;
+        
+        assert( argv[ 0 ].u.data.elem_bits == sizeof( has_ref_offset[ 0 ] ) * 8 );
+        has_ref_offset += argv[ 0 ].u.data.first_elem;
+        
+        if ( has_ref_offset[ 0 ] && ref_offset[ 0 ] < 0 )
+        {
+            start = 1;
+        }
+    }
+
+    rslt->data->elem_bits = sizeof( ref_offset[ 0 ] ) * 8;
+    rslt->elem_count = n_offsets - start;
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc == 0 )
+        memmove( rslt->data->base,
+                &ref_offset[ start ],
+                ( size_t )( sizeof( ref_offset[ 0 ] ) * rslt->elem_count ) );
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_clipped_ref_offset, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = clipped_ref_offset_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+/*
+ * function INSDC:coord:len NCBI:align:get_ref_len #1 (
+ *     bool has_ref_offset, I32 ref_offset, INSDC:coord:len right_clip )
+ */
+static
+rc_t CC get_ref_len_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    INSDC_coord_len result,right=0;
+    
+    unsigned const read_len = ( unsigned const )argv[ 0 ].u.data.elem_count;
+    unsigned const n_offsets = ( unsigned const )argv[ 1 ].u.data.elem_count;
+    bool const *hro = argv[ 0 ].u.data.base;
+    int32_t const *ref_offset = argv[ 1 ].u.data.base;
+    
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( ref_offset[ 0 ] ) * 8 );
+    
+    hro += argv[ 0 ].u.data.first_elem;
+    ref_offset += argv[ 1 ].u.data.first_elem;
+
+    if ( argc > 2 )
+    {
+        right = ( ( INSDC_coord_len* )argv[ 2 ].u.data.base )[ argv[ 2 ].u.data.first_elem ];
+        
+        assert( argv[ 2 ].u.data.elem_bits == sizeof( right ) * 8 );
+        assert( read_len >= right );
+    }
+
+    if ( n_offsets == 0 )
+    {
+        if ( read_len < right )
+            return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+        result = read_len - right;
+    }
+    else
+    {
+        int32_t  ires, rov;
+        unsigned i;
+        
+        if ( argc > 2 ) /*** clipping ***/
+        {
+            for ( i = 0, ires = read_len - right; i < n_offsets; i++ )
+            {
+                memmove( &rov, ref_offset + i, sizeof rov );
+                ires += rov;
+            }
+        }
+        else
+        {
+            int32_t sum_pos, sum_neg;
+            for ( i = 0, sum_pos = sum_neg = 0; i < n_offsets; i++ )
+            {
+                memmove( &rov, ref_offset + i, sizeof rov );
+                if ( rov > 0 )
+                    sum_pos += rov;
+                else
+                    sum_neg += rov;            
+            }
+
+            if ( sum_pos + sum_neg >= 0 ) /** all offsets may not over-shorten needed reference ***/
+            {
+                ires = read_len + sum_pos + sum_neg;
+            }
+            else /** inefficient case - exact reach into the reference is needed **/
+            {
+                unsigned j;
+                for ( i = 0, j = 0, sum_pos = 0, ires = 0; j < read_len; j++ )
+                {
+                    if ( hro[ i ] )
+                    {
+                        if ( i >= n_offsets )
+                            return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+                        memmove( &rov, ref_offset + i, sizeof rov );
+                        ires += rov;
+                        i++;
+                    }
+                    sum_pos ++;
+                    if ( sum_pos > ires )
+                        ires=sum_pos;
+                }
+            }
+        }
+
+        if ( ires < 0 )
+            return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+        result = ires;
+    }
+
+    rslt->data->elem_bits = sizeof( result ) * 8;
+    rslt->elem_count = 1;
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc == 0 )
+        memmove( rslt->data->base, &result, sizeof( result ) );
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_ref_len, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = get_ref_len_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+/*
+ * function INSDC:coord:len NCBI:align:get_ref_len #2 (
+ *											bool has_ref_offset,
+ *											I32 ref_offset)
+ */
+static
+rc_t CC get_ref_len_2_impl ( void *data, const VXformInfo *info, int64_t row_id,
+                          VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    ARG_ALIAS(int32_t, refOffset, 1);
+    unsigned const n = (unsigned)argv[1].u.data.elem_count;
+    int result = (unsigned)argv[0].u.data.elem_count; 
+    unsigned i;
+
+    for (i = 0; i < n; ++i)
+        result += (int)refOffset[i];
+    
+    rslt->data->elem_bits = sizeof(INSDC_coord_len) * 8;
+    rc = KDataBufferResize(rslt->data, rslt->elem_count = 1);
+    if (rc == 0)
+        ((INSDC_coord_len *)rslt->data->base)[0] = result;
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL(NCBI_align_get_ref_len_2, 2, 0, 0)(const void *Self, const VXfactInfo *info,
+                     VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp)
+{
+    rslt->u.rf = get_ref_len_2_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+/*
+ * function < type T > T NCBI:align:clip #1 ( T value,
+ *     INSDC:coord:len left, INSDC:coord:len right )
+ */
+static
+rc_t CC clip_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    INSDC_coord_len left  = ( ( INSDC_coord_len const * )argv[ 1 ].u.data.base )[ argv[ 1 ].u.data.first_elem ];
+    INSDC_coord_len right = ( ( INSDC_coord_len const * )argv[ 2 ].u.data.base )[ argv[ 2 ].u.data.first_elem ];
+
+    rslt->data->elem_bits = argv[ 0 ].u.data.elem_bits;
+    if ( argv[ 0 ].u.data.elem_count >= left + right )
+    {
+        rslt->elem_count = argv[ 0 ].u.data.elem_count - left - right;
+    }
+    else
+    {
+        rslt->elem_count = 0;
+    }
+
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc == 0 )
+    {
+        if ( ( rslt->data->elem_bits & 7 ) == 0 )
+        {
+            memmove( rslt->data->base,
+                    &( ( char const * )argv[ 0 ].u.data.base )[ ( ( left + argv[ 0 ].u.data.first_elem ) * argv[ 0 ].u.data.elem_bits ) >> 3 ],
+                    ( size_t )( ( rslt->elem_count * rslt->data->elem_bits ) >> 3 ) );
+        }
+        else
+        {
+            bitcpy( rslt->data->base, 
+                    0,
+                    argv[ 0 ].u.data.base,
+                    ( left + argv[ 0 ].u.data.first_elem ) * argv[ 0 ].u.data.elem_bits,
+                    rslt->elem_count * rslt->data->elem_bits );
+        }
+    }
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_clip, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = clip_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+static
+rc_t CC clip_impl_2 ( void *data, const VXformInfo *info, int64_t row_id,
+                      VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const INSDC_coord_len* read_len = argv[ 1 ].u.data.base;
+    const uint32_t nreads = ( const uint32_t )argv[ 1 ].u.data.elem_count;
+    const INSDC_coord_len* left =  argv[ 2 ].u.data.base;
+    const INSDC_coord_len* right = argv[ 3 ].u.data.base;
+    uint32_t n;
+    INSDC_coord_zero start;
+
+    assert( argv[ 1 ].u.data.elem_count == argv[ 2 ].u.data.elem_count );
+    assert( argv[ 1 ].u.data.elem_count == argv[ 3 ].u.data.elem_count );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( read_len[ 0 ] ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( left[ 0 ] ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( right[ 0 ] ) * 8 );
+
+    read_len += argv[ 1 ].u.data.first_elem;
+    left += argv[ 2 ].u.data.first_elem;
+    right += argv[ 3 ].u.data.first_elem;
+
+    rslt->data->elem_bits = argv[ 0 ].u.data.elem_bits;
+    rslt->elem_count = 0;
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc != 0 )
+        return rc;
+    if ( argv[ 0 ].u.data.elem_count == 0 )
+        return 0;
+
+    for ( n = start = 0; rc == 0 && n < nreads; start += read_len[ n++ ] )
+    {
+        uint64_t x = left[n] + right[n];
+
+        if ( argv[ 0 ].u.data.elem_count < start ||
+             argv[ 0 ].u.data.elem_count < start + read_len[ n ] )
+        {
+            rc = RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+        }
+/*
+        assert(argv[0].u.data.elem_count >= start);
+        assert(argv[0].u.data.elem_count >= start + read_len[n]);
+*/
+        else if ( read_len[ n ] > x )
+        {
+            x = read_len[ n ] - x;
+            if ( x > 0 )
+            {
+                rc = KDataBufferResize( rslt->data, rslt->elem_count + x );
+                if ( rc == 0 )
+                {
+                    bitcpy( rslt->data->base,
+                            rslt->elem_count * argv[ 0 ].u.data.elem_bits,
+                            argv[ 0 ].u.data.base,
+                            ( argv[ 0 ].u.data.first_elem + start + left[ n ] ) * argv[ 0 ].u.data.elem_bits,
+                            x * rslt->data->elem_bits );
+                    rslt->elem_count += x;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_clip_2, 2, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = clip_impl_2;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+/*
+ * function bool NCBI:align:get_ref_mismatch #1
+ *     ( bool has_mismatch, bool has_ref_offset, I32 ref_offset,
+ *       INSDC:coord:len ref_len )
+ */
+static
+rc_t CC get_ref_mismatch_impl ( void *data, const VXformInfo *info, int64_t row_id,
+                   VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    bool const *has_mismatch       = argv [ 0 ] . u . data . base;
+    bool const *has_ref_offset     = argv [ 1 ] . u . data . base;
+    int32_t const *ref_offset      = argv [ 2 ] . u . data . base;
+    INSDC_coord_len const *ref_len = argv [ 3 ] . u . data . base; 
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( has_mismatch[ 0 ] ) * 8 );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( has_ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 3 ].u.data.elem_bits == sizeof( ref_len[ 0 ] ) * 8 );
+    
+    has_mismatch   += argv[ 0 ].u.data.first_elem;
+    has_ref_offset += argv[ 1 ].u.data.first_elem;
+    ref_offset     += argv[ 2 ].u.data.first_elem;
+    
+    rslt->data->elem_bits = sizeof( bool ) * 8;
+    rslt->elem_count = ref_len[ argv[ 3 ].u.data.first_elem ];
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc == 0 )
+    {
+        bool *result = ( bool* )rslt->data->base;
+        unsigned j;
+        unsigned ri;
+        unsigned si;
+        
+        memset( result, 0, ( size_t )( sizeof( result[ 0 ] ) * rslt->elem_count ) );
+        for ( j = ri = si = 0; si < argv[ 0 ].u.data.elem_count; )
+        {
+            if ( has_ref_offset[ si ] )
+            {
+                int offset = ref_offset[ j++ ];
+                
+                if ( offset > 0 )
+                    ri += offset;
+                else
+                {
+                    si -= offset;
+                    continue;
+                }
+            }
+            if ( ri >= rslt->elem_count )
+                break;
+            if ( has_mismatch[ si ] )
+            {
+                result[ ri ] = 1;
+            }
+            ++si;
+            ++ri;
+        }
+    }
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_ref_mismatch, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = get_ref_mismatch_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+
+/*
+ * function bool NCBI:align:get_ref_insert #1
+ *     ( bool has_mismatch, bool has_ref_offset, I32 ref_offset,
+ *       INSDC:coord:len ref_len )
+ */
+static
+rc_t CC get_ref_insert_impl ( void *data, const VXformInfo *info, int64_t row_id,
+                               VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    bool const *has_mismatch       = argv [ 0 ] . u . data . base;
+    bool const *has_ref_offset     = argv [ 1 ] . u . data . base;
+    int32_t const *ref_offset      = argv [ 2 ] . u . data . base;
+    INSDC_coord_len const *ref_len = argv [ 3 ] . u . data . base; 
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( has_mismatch[ 0 ] ) * 8 );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( has_ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 3 ].u.data.elem_bits == sizeof( ref_len[ 0 ] ) * 8 );
+    
+    has_mismatch   += argv[ 0 ].u.data.first_elem;
+    has_ref_offset += argv[ 1 ].u.data.first_elem;
+    ref_offset     += argv[ 2 ].u.data.first_elem;
+    
+    rslt->data->elem_bits = sizeof( bool ) * 8;
+    rslt->elem_count = ref_len[ argv[ 3 ].u.data.first_elem ];
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc == 0 )
+    {
+        bool *result = ( bool* )rslt->data->base;
+        unsigned j;
+        unsigned ri;
+        unsigned si;
+        
+        memset( result, 0, ( size_t )( sizeof( result[ 0 ] ) * rslt->elem_count ) );
+        for ( j = ri = si = 0; si < argv[ 0 ].u.data.elem_count; )
+        {
+            if ( has_ref_offset[ si ] )
+            {
+                int offset = ref_offset[ j++ ];
+                
+                if ( offset > 0 )
+                {
+                    ri += offset;
+                }
+                else
+                {
+                    if ( si > 0 )
+                    {
+                        if ( ri >= 1 )
+                            result[ ri - 1 ] = 1;
+                        result[ ri ] = 1;
+                    }
+                    si -= offset;
+                    continue;
+                }
+            }
+            ++si;
+            ++ri;
+        }
+    }
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_ref_insert, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = get_ref_insert_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+
+/*
+ * function bool NCBI:align:get_ref_delete #1
+ *     ( bool has_mismatch, bool has_ref_offset, I32 ref_offset,
+ *       INSDC:coord:len ref_len )
+ */
+static
+rc_t CC get_ref_delete_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    bool const *has_mismatch       = argv [ 0 ] . u . data . base;
+    bool const *has_ref_offset     = argv [ 1 ] . u . data . base;
+    int32_t const *ref_offset      = argv [ 2 ] . u . data . base;
+    INSDC_coord_len const *ref_len = argv [ 3 ] . u . data . base; 
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( has_mismatch[ 0 ] ) * 8 );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( has_ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 3 ].u.data.elem_bits == sizeof( ref_len[ 0 ] ) * 8 );
+    
+    has_mismatch   += argv[ 0 ].u.data.first_elem;
+    has_ref_offset += argv[ 1 ].u.data.first_elem;
+    ref_offset     += argv[ 2 ].u.data.first_elem;
+    
+    rslt->data->elem_bits = sizeof( bool ) * 8;
+    rslt->elem_count = ref_len[ argv[ 3 ].u.data.first_elem ];
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc == 0 )
+    {
+        bool *result = ( bool* )rslt->data->base;
+        unsigned j;
+        unsigned ri;
+        unsigned si;
+        
+        memset( result, 0, ( size_t )( sizeof( result[ 0 ] ) * rslt->elem_count ) );
+        for ( j = ri = si = 0; si < argv[ 0 ].u.data.elem_count; )
+        {
+            if ( has_ref_offset[ si ] )
+            {
+                int offset = ref_offset[ j++ ];
+                
+                if ( offset > 0 )
+                {
+                    memset( &result[ ri ], 1, offset );
+                    ri += offset;
+                }
+                else
+                {
+                    si -= offset;
+                    continue;
+                }
+            }
+            ++si;
+            ++ri;
+        }
+    }
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_ref_delete, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = get_ref_delete_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+
+#define USE_BIGGER_PRESERVE_BORDER 1
+/*
+ * function bool NCBI:align:get_preserve_qual #1
+ *     ( bool has_mismatch, bool has_ref_offset, I32 ref_offset,
+ *       INSDC:coord:len ref_len )
+ */
+static
+rc_t CC get_ref_preserve_qual_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    bool const *has_mismatch       = argv [ 0 ] . u . data . base;
+    bool const *has_ref_offset     = argv [ 1 ] . u . data . base;
+    int32_t const *ref_offset      = argv [ 2 ] . u . data . base;
+    INSDC_coord_len const *ref_len = argv [ 3 ] . u . data . base; 
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( has_mismatch[ 0 ] ) * 8 );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( has_ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 3 ].u.data.elem_bits == sizeof( ref_len[ 0 ] ) * 8 );
+    
+    has_mismatch   += argv[ 0 ].u.data.first_elem;
+    has_ref_offset += argv[ 1 ].u.data.first_elem;
+    ref_offset     += argv[ 2 ].u.data.first_elem;
+    
+    rslt->data->elem_bits = sizeof( bool ) * 8;
+    rslt->elem_count = ref_len[ argv[ 3 ].u.data.first_elem ];
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc == 0 )
+    {
+        bool *result = ( bool* )rslt->data->base;
+        unsigned j;
+        unsigned ri;
+        unsigned si;
+        
+        memset( result, 0, ( size_t )( sizeof( result[ 0 ] ) * rslt->elem_count ) );
+        for ( j = ri = si = 0; si < argv[ 0 ].u.data.elem_count; )
+        {
+            if ( has_ref_offset[ si ] )
+            {
+                int offset = ref_offset[ j++ ];
+                
+                if ( offset > 0 )
+                {
+                    /* Preserve the qualities for deleted bases + plus the border */
+#if USE_BIGGER_PRESERVE_BORDER
+                    if ( ri >= 2 ) result[ ri - 2 ] = 1;
+#endif
+                    if ( ri >= 1 ) result[ ri - 1 ] = 1;
+                    memset( &result[ ri ], 1, offset );
+                    ri += offset;
+                    result[ ri ] = 1;
+#if USE_BIGGER_PRESERVE_BORDER
+                    if ( ri + 1 < rslt->elem_count ) result[ ri + 1 ] = 1;
+#endif
+                }
+                else
+                {
+                    if ( si > 0 )
+                    {
+                        /* Preserve the qualites for the bases bordering the insert */
+#if USE_BIGGER_PRESERVE_BORDER
+                        if ( ri >= 2 ) result[ ri - 2 ] = 1;
+#endif
+                        if ( ri >= 1 ) result[ ri - 1 ] = 1;
+                        result[ ri ] = 1;
+#if USE_BIGGER_PRESERVE_BORDER
+                        if ( ri + 1 < rslt->elem_count ) result[ ri + 1 ] = 1;
+#endif
+                    }
+                    si -= offset;
+                    continue;
+                }
+            }
+            if ( ri >= rslt->elem_count ) break;
+            if ( has_mismatch[ si ] )
+            {
+#if USE_BIGGER_PRESERVE_BORDER
+                if ( ri >= 1 ) result[ ri - 1 ] = 1;
+#endif
+                result[ ri ] = 1;
+#if USE_BIGGER_PRESERVE_BORDER
+                if ( ri + 1 < rslt->elem_count ) result[ ri + 1 ] = 1;
+#endif
+            }
+            ++si;
+            ++ri;
+        }
+    }
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_get_ref_preserve_qual, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = get_ref_preserve_qual_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+
+/*
+ * function bool NCBI:align:get_seq_preserve_qual #1
+ *    ( bool ref_preserve_qual, bool has_ref_offset, I32 ref_offset );
+ */
+static
+rc_t CC get_seq_preserve_qual_impl ( void *data, const VXformInfo *info, int64_t row_id,
+                                    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    bool const *ref_pq             = argv [ 0 ] . u . data . base;
+    bool const *has_ref_offset     = argv [ 1 ] . u . data . base;
+    int32_t const *ref_offset      = argv [ 2 ] . u . data . base;
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( ref_pq[ 0 ] ) * 8 );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( has_ref_offset[ 0 ] ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( ref_offset[ 0 ] ) * 8 );
+    
+    ref_pq         += argv[ 0 ].u.data.first_elem;
+    has_ref_offset += argv[ 1 ].u.data.first_elem;
+    ref_offset     += argv[ 2 ].u.data.first_elem;
+    
+    rslt->data->elem_bits = sizeof( bool ) * 8;
+    rslt->elem_count = argv[ 1 ].u.data.elem_count;
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc == 0 )
+    {
+        bool *result = ( bool* )rslt->data->base;
+        unsigned j;
+        unsigned ri;
+        unsigned si;
+        
+        memset( result, 1, ( size_t )( sizeof( result[ 0 ] ) * rslt->elem_count ) );
+        for ( j = ri = si = 0; si < argv[ 1 ].u.data.elem_count; )
+        {
+            if ( has_ref_offset[ si ] )
+            {
+                int offset = ref_offset[ j++ ];
+                
+                if ( offset > 0 )
+                {
+                    ri += offset;
+                }
+                else
+                {
+                    si -= offset;
+                    continue;
+                }
+            }
+            if ( ri >= argv[ 0 ].u.data.elem_count ) break;
+            result[ si ] = ref_pq[ ri ];
+            ++si;
+            ++ri;
+        }
+    }
+
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_align_get_seq_preserve_qual, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+                                                               VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = get_seq_preserve_qual_impl;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+
+
+/*
+ * function ascii NCBI:align:rna_orientation #1 ( NCBI:align:ro_type *ref_offset_type );
+ */
+static
+rc_t CC get_rna_orientation(void *data, const VXformInfo *info, int64_t row_id,
+                        VRowResult *rslt, uint32_t argc, const VRowData argv [])
+{
+    rc_t rc;
+    uint8_t const *const offset_type = argc == 1 ? ((uint8_t const *)argv[0].u.data.base) + argv[0].u.data.first_elem : NULL;
+    unsigned const count = argc == 1 ? (unsigned)argv[0].u.data.elem_count : 0;
+
+    assert(argv[ 0 ].u.data.elem_bits == sizeof(offset_type[0]) * 8);
+    
+    rslt->data->elem_bits = sizeof(char) * 8;
+    rslt->elem_count = 1;
+    rc = KDataBufferResize(rslt->data, 1);
+    if ( rc == 0 )
+    {
+        unsigned p_count = 0;
+        unsigned m_count = 0;
+    	unsigned i;
+        char *orient = rslt->data->base;
+        
+        for (i = 0; i < count; ++i) {
+            if (offset_type[i] == NCBI_align_ro_intron_plus)
+                ++p_count;
+            else if (offset_type[i] == NCBI_align_ro_intron_minus)
+                ++m_count;
+        }
+        if (p_count > 0 && m_count == 0)
+            *orient = '+';
+        else if (m_count > 0 && p_count == 0)
+            *orient = '-';
+        else
+            rslt->elem_count = 0;
+    }
+    
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_align_rna_orientation, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = get_rna_orientation;
+    rslt->variant = vftRow;
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    return 0;
+}
diff --git a/libs/axf/generate-mismatch-qual.c b/libs/axf/generate-mismatch-qual.c
new file mode 100644
index 0000000..e19c1e7
--- /dev/null
+++ b/libs/axf/generate-mismatch-qual.c
@@ -0,0 +1,152 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <bitstr.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+enum args {
+    QUAL,
+    HAS_MISMATCH,
+    LEFT_CLIP,
+    RIGHT_CLIP
+};
+
+static
+rc_t CC generate_mismatch_qual ( void *data, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData argv[] )
+{
+    INSDC_quality_phred const *qual = argv[ QUAL ].u.data.base;
+    bool const *has_mismatch = argv[ HAS_MISMATCH ].u.data.base;
+    INSDC_coord_len const *left  = argv[ LEFT_CLIP ].u.data.base;
+    INSDC_coord_len const *right = argv[ RIGHT_CLIP ].u.data.base;
+    unsigned const readlen = ( unsigned const )argv[ QUAL ].u.data.elem_count;
+    INSDC_quality_phred *dst;
+    rc_t rc;
+    unsigned i;
+    unsigned j;
+    
+    assert( argv[ QUAL ].u.data.elem_bits == sizeof( qual[ 0 ] ) * 8 );
+    assert( argv[ HAS_MISMATCH ].u.data.elem_bits == sizeof( has_mismatch[ 0 ] ) * 8 );
+    assert( argv[ LEFT_CLIP ].u.data.elem_bits == sizeof( left[ 0 ] ) * 8 );
+    assert( argv[ RIGHT_CLIP ].u.data.elem_bits == sizeof( right[ 0 ] ) * 8 );
+    assert( argv[ HAS_MISMATCH ].u.data.elem_count == readlen );
+    
+    qual += argv[ QUAL ].u.data.first_elem;
+    has_mismatch += argv[ HAS_MISMATCH ].u.data.first_elem;
+    left  += argv[ LEFT_CLIP  ].u.data.first_elem;
+    right += argv[ RIGHT_CLIP ].u.data.first_elem;
+    
+    rslt->data->elem_bits = argv[ QUAL ].u.data.elem_bits;
+    rc = KDataBufferResize( rslt->data, argv[ QUAL ].u.data.elem_count );
+    if ( rc != 0 )
+        return rc;
+    dst = rslt->data->base;
+    
+    for ( j = 0, i = left[ 0 ]; i != readlen - right[ 0 ]; ++i )
+    {
+        if ( has_mismatch[ i ] )
+            dst[ j++ ] = qual[ i ];
+    }
+    rslt->elem_count = j;
+    return 0;
+}
+
+
+/*
+ * function INSDC:quality:phred NCBI:align:generate_mismatch_qual #2 (
+ *    INSDC:quality:phred qual, bool has_mismatch,
+ *    INSDC:coord:len left_clip, INSDC:coord:len right_clip );
+ */
+VTRANSFACT_IMPL ( NCBI_align_generate_mismatch_qual_2, 2, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> u . rf = generate_mismatch_qual;
+    rslt -> variant = vftRow;
+    
+    return 0;
+}
+
+static
+rc_t CC compress_quality_impl ( void *data, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData argv[] )
+{
+    INSDC_quality_phred const *qual = argv[ 0 ].u.data.base;
+    bool const *preserve = argv[ 1 ].u.data.base;
+    unsigned const readlen = ( unsigned const )argv[ 0 ].u.data.elem_count;
+    INSDC_quality_phred *dst;
+    rc_t rc;
+    unsigned i;
+    unsigned j;
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( qual[ 0 ] ) * 8 );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( preserve[ 0 ] ) * 8 );
+    assert( argv[ 1 ].u.data.elem_count == readlen );
+    
+    qual += argv[ 0 ].u.data.first_elem;
+    preserve += argv[ 1 ].u.data.first_elem;
+    
+    rslt->data->elem_bits = argv[ 0 ].u.data.elem_bits;
+    rc = KDataBufferResize( rslt->data, argv[ 0 ].u.data.elem_count );
+    if ( rc != 0 )
+        return rc;
+    dst = rslt->data->base;
+    
+    for ( j = 0, i = 0; i != readlen; ++i )
+    {
+        if ( preserve[ i ] )
+            dst[ j++ ] = qual[ i ];
+    }
+    rslt->elem_count = j;
+    return 0;
+}
+
+
+/*
+ * function INSDC:quality:phred NCBI:align:compress_quality #1
+ *    ( INSDC:quality:phred quality, bool preserved );
+ */
+VTRANSFACT_IMPL ( NCBI_align_compress_quality, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> u . rf = compress_quality_impl;
+    rslt -> variant = vftRow;
+    
+    return 0;
+}
diff --git a/libs/axf/get-sam-flags.c b/libs/axf/get-sam-flags.c
new file mode 100644
index 0000000..632c777
--- /dev/null
+++ b/libs/axf/get-sam-flags.c
@@ -0,0 +1,228 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <insdc/sra.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+
+/* "properly aligned" fragments according to the aligner
+   may mean minimally that the fragments are on the same
+   chromosome. */
+#define PROPER_ALIGNED_MEANS_SAME_CHROMOSOME 1
+
+
+static
+rc_t CC get_sam_flags_impl(void *data, const VXformInfo *info,
+                           int64_t row_id, VRowResult *rslt,
+                           uint32_t nreads,
+                           uint32_t argc, const VRowData argv [] ) 
+{
+    rc_t 	rc;
+    int32_t	*dst;
+    const INSDC_coord_one  *rid = argv[ 1 ].u.data.base; /* SEQ_READ_ID */
+    const int32_t         *tlen = argv[ 2 ].u.data.base; /* TEMPLATE_LEN */
+    const bool	           *ro1 = argv[ 3 ].u.data.base; /* REF_ORIENTATION */
+    const bool             *ro2 = argv[ 4 ].u.data.base; /* MATE_REF_ORIENTATION */
+    const bool             *sec = argv[ 5 ].u.data.base; 
+    const bool             mate_present = ( argv[ 4 ].u.data.elem_count > 0 );
+    const SRAReadFilter    *flt = argc > 6 ? argv[ 6 ].u.data.base : NULL;
+
+    assert( argv[ 1 ].u.data.elem_count == 1 );
+    assert( argv[ 2 ].u.data.elem_count == 1 );
+    assert( argv[ 3 ].u.data.elem_count == 1 );
+    assert( argv[ 5 ].u.data.elem_count == 1 );
+    
+    rc = KDataBufferResize( rslt->data, 1 );
+    if( rc != 0 )
+        return rc;
+    rslt->elem_count=1;
+    dst = rslt->data->base;
+    dst[ 0 ] = 0;
+    if( nreads == 0 )
+        return 0;
+    
+    rid  += argv[ 1 ].u.data.first_elem;
+    tlen += argv[ 2 ].u.data.first_elem;
+    ro1  += argv[ 3 ].u.data.first_elem;
+    ro2  += argv[ 4 ].u.data.first_elem;
+    sec  += argv[ 5 ].u.data.first_elem;
+    if ( flt != NULL )
+        flt += argv[ 6 ].u.data.first_elem;
+    
+    /***************** SAM FLAGS************
+      Bit  Description
+     0x001 template having multiple fragments in sequencing
+     0x002 each fragment properly aligned according to the aligner
+     0x004 fragment unmapped
+     0x008 next fragment in the template unmapped
+     0x010 SEQ being reverse complemented
+     0x020 SEQ of the next fragment in the template being reversed
+     0x040 the first fragment in the template
+     0x080 the last fragment in the template
+     0x100 secondary alignment
+     0x200 not passing quality controls
+     0x400 PCR or optical duplicate
+    ****************************/
+    if ( ro1[ 0 ] )
+        dst[ 0 ] |= 0x10;
+
+    if ( sec[ 0 ] )
+        dst[ 0 ] |= 0x100;
+
+    if ( nreads > 1 )
+    {
+        if ( rid[ 0 ] == 1 )
+            dst[ 0 ] |= 0x40;
+
+        if ( rid[ 0 ] == nreads )
+            dst[ 0 ] |= 0x80;
+
+        dst[ 0 ] |= 0x1;
+
+        if( mate_present )
+        {
+#if PROPER_ALIGNED_MEANS_SAME_CHROMOSOME
+           if ( tlen[ 0 ] != 0 )
+#endif
+                dst[ 0 ] |= 0x2;
+           if ( ro2 [ 0 ] )
+                dst[ 0 ] |= 0x20;
+        }
+        else
+        {
+            dst[ 0 ] |= 0x8;
+        }
+    }
+
+    if ( flt != NULL )
+    {
+        if ( flt[ 0 ] == SRA_READ_FILTER_REJECT )
+        {
+            dst[ 0 ] |= 0x200;
+        }
+        else if ( flt[ 0 ] == SRA_READ_FILTER_CRITERIA )
+        {
+            dst[ 0 ] |= 0x400;
+        }
+    }
+    return rc;	
+}
+
+
+static
+rc_t CC get_sam_flags_impl_v1(  void  *data, const VXformInfo * info, int64_t row_id,
+                                VRowResult * rslt, uint32_t argc, const VRowData argv [] ) 
+{
+	uint32_t nreads = 0;
+    INSDC_coord_len const *read_len = argv[ 0 ].u.data.base;
+    unsigned i;
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( read_len[ 0 ] ) * 8 );
+    read_len += argv[ 0 ].u.data.first_elem;
+   
+#if 1 
+    for ( i = 0, nreads = 0; i != argv[ 0 ].u.data.elem_count; ++i )
+    {
+        if ( read_len[ i ] != 0 )
+            ++nreads;
+    }
+#else
+    nreads = argv[ 0 ].u.data.elem_count;
+#endif
+
+    return get_sam_flags_impl( data, info, row_id, rslt, nreads, argc, argv );
+}
+
+
+static
+rc_t CC get_sam_flags_impl_v2( void * data,const VXformInfo * info, int64_t row_id,
+                               VRowResult * rslt, uint32_t argc, const VRowData argv [] ) 
+{
+	uint32_t nreads = 1;
+    int64_t const *mate_id = argv[ 0 ].u.data.base;
+    unsigned i;
+    
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( mate_id[ 0 ] ) * 8 );
+    mate_id += argv[ 0 ].u.data.first_elem;
+    
+    for ( i = 0; i != argv[ 0 ].u.data.elem_count; ++i )
+    {
+        if ( mate_id[ i ] != 0 )
+            ++nreads;
+    }
+
+    return get_sam_flags_impl( data, info, row_id, rslt, nreads, argc, argv );
+}
+
+
+/*
+ * extern function U32 NCBI:align:get_sam_flags #1 (INSDC:coord:len read_len,
+ *                                                  INSDC:coord:one read_id,
+ *                                                  I32 template_len,
+ *                                                  bool strand,
+ *                                                  bool mate_strand,
+ *                                                  bool is_secondary);
+ *
+ */
+VTRANSFACT_IMPL ( NCBI_align_get_sam_flags, 1, 0, 0 ) ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+                                                 const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftRow;
+    rslt->u.rf = get_sam_flags_impl_v1;
+    return 0;
+}
+
+
+/*
+ * extern function U32 NCBI:align:get_sam_flags #2 (I64 mate_id,
+ *                                                  INSDC:coord:one read_id,
+ *                                                  I32 template_len,
+ *                                                  bool strand,
+ *                                                  bool mate_strand,
+ *                                                  bool is_secondary);
+ *
+ */
+VTRANSFACT_IMPL ( NCBI_align_get_sam_flags_2, 2, 0, 0 ) ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+                                                       const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftRow;
+    rslt->u.rf = get_sam_flags_impl_v2;
+    return 0;
+}
diff --git a/libs/axf/get_mate_align_ids.c b/libs/axf/get_mate_align_ids.c
new file mode 100644
index 0000000..890fa32
--- /dev/null
+++ b/libs/axf/get_mate_align_ids.c
@@ -0,0 +1,332 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+
+#include <kdb/meta.h>
+
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <klib/sort.h>
+#include <klib/vector.h>
+#include <klib/debug.h>
+
+#include <insdc/sra.h>
+#include <insdc/insdc.h>
+
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+
+typedef struct ID_cache_t
+{
+    uint32_t idx;
+    VCursor const *curs;
+    KVector *j_cache;
+    KVector *p_cache;
+}ID_cache_t;
+
+#define MIN_DIFF_TO_CACHE 10000
+#define TMP_CACHE_PAGESIZE (16*1024)
+
+#ifdef _DEBUGGING
+#define SUB_DEBUG(msg) DBGMSG(DBG_SRA,DBG_FLAG(DBG_SRA_SUB),msg)
+#else
+#define SUB_DEBUG(msg)
+#endif
+
+
+#if 0
+static rc_t lookup_mate( ID_cache_t *const self, int64_t const id, int64_t *mateid )
+{
+    return KVectorGetI64( self->j_cache, ( uint64_t )id,mateid );
+}
+
+static rc_t cache_mate( ID_cache_t *self, int64_t id, int64_t mateid )
+{
+    return KVectorSetU64( self->j_cache, ( uint64_t )id, mateid );
+}
+#endif
+
+static rc_t fetch_mates( ID_cache_t *self, int64_t spotid, const int64_t **ids, uint32_t * rlen )
+{
+    rc_t rc = 0;
+    uint32_t elem_bits;
+    uint32_t boff;
+
+    SUB_DEBUG( ( "SUB.Rd in 'get_mate_align_ids.c' at #%lu\n", spotid ) );
+
+    rc = VCursorCellDataDirect( self->curs, spotid, self->idx,&elem_bits, (const void**) ids, &boff, rlen );
+    assert( *rlen == 0 || elem_bits == 64 );
+    assert( boff == 0 );
+    return rc;
+}
+
+static rc_t fetch_mate_id( ID_cache_t *self, int64_t spotid, int64_t const id, int64_t *mateid )
+{
+    rc_t rc = 0;
+    uint32_t rlen;
+    int i;
+    const int64_t *base;
+
+    rc = fetch_mates( self, spotid,&base,&rlen );
+    if ( rc != 0 )
+        return rc;
+    if ( rlen > 2 )
+        return RC( rcXF, rcFunction, rcExecuting, rcConstraint, rcViolated );
+    mateid[ 0 ] = 0;
+    for( i = 0; i < ( int )rlen; i++ )
+    {
+        if ( base[ i ] != id )
+        {
+            mateid[ 0 ] = base[ i ];
+        }
+    }
+    return rc;
+}
+
+
+#if 0
+static rc_t get_mate_algn_id_impl( ID_cache_t *const self,
+                                   int64_t const row,
+                                   int64_t rslt[],
+                                   int64_t const spotid )
+{
+    rc_t rc = 0;
+    bool page_processed = false;
+    int64_t first, first_blob, last, last_blob;
+
+    /** check cache **/
+    rc = lookup_mate( self, row, rslt );
+    if ( rc == 0 )
+        return 0;
+
+    /** Page boundary is defined by the variable "first" **/
+    rc = VCursorPageIdRange( self->curs, self->idx, spotid, &first_blob, &last_blob );
+    if ( rc != 0 )
+        return rc;
+    first = spotid & ~( TMP_CACHE_PAGESIZE - 1 );
+    if ( first < first_blob )
+        first = first_blob;
+    last = first + TMP_CACHE_PAGESIZE -1;
+    if ( last > last_blob )
+        last = last_blob;
+
+    rc = KVectorGetBool( self->p_cache, ( uint64_t )first, &page_processed );
+    if ( rc == 0 && page_processed )
+    {
+        /*** This page was processed before. Row did not need caching. Just fetch Row being asked **/
+        return fetch_mate_id( self, spotid, row, rslt );
+    }
+    else
+    {
+        /** unprocessed page **/
+        int64_t i;
+		rc = KVectorSetBool( self->p_cache, ( uint64_t )first, true ); /** mark as processed **/
+        if( rc != 0 )
+            return rc;
+	
+        for ( i = first; i <= last; i++ )
+        {
+            int64_t	ids[ 2 ] = { 0, 0 };
+            const int64_t *ptr;
+            uint32_t rlen;
+            rc = fetch_mates( self, i, &ptr, &rlen );
+            if ( rc != 0 )
+            {
+                if ( GetRCState ( rc ) == rcNotFound )
+                    rc = 0;
+                else
+                    return rc;
+            }
+            memmove( ids, ptr, rlen * sizeof( *ptr ) );
+            if ( ids[ 0 ] != 0 && ids[ 1 ] != 0 && labs( ids[ 0 ] - ids[ 1 ] ) > MIN_DIFF_TO_CACHE )
+            {
+                rc = cache_mate( ( ID_cache_t* )self, ids[ 0 ], ids[ 1 ] );
+                if( rc != 0 )
+                    return rc;
+                rc = cache_mate( ( ID_cache_t* )self, ids[ 1 ], ids[ 0 ] );
+                if( rc != 0 )
+                    return rc;
+            }
+            if ( i == spotid )
+            {
+                if( ids[ 0 ] == row )
+                {
+                    rslt[ 0 ] = ids[ 1 ];
+                }
+                else if( ids[ 1 ] == row )
+                {
+                    rslt[ 0 ] = ids[ 0 ];
+                }
+                else
+                {
+                    return RC( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+                } 
+            }
+        }
+    }
+    return rc;
+}
+#endif
+
+
+static rc_t CC get_mate_algn_id_drvr( void * Self,
+                                      const VXformInfo * info,
+                                      int64_t row_id,
+                                      VRowResult *rslt,
+                                      uint32_t argc,
+                                      const VRowData argv [] )
+{
+    rc_t rc;
+    ID_cache_t *self = Self;
+
+    rslt->data->elem_bits = rslt->elem_bits;
+    rc = KDataBufferResize( rslt->data, 1 );
+    if ( rc == 0 )
+    {
+#if 0
+        rc = get_mate_algn_id_impl( self,
+                                    row_id,
+                                    rslt->data->base,
+                                    ( ( int64_t const * )argv[ 0 ].u.data.base )[ argv[ 0 ].u.data.first_elem ] );
+#else
+        rc = fetch_mate_id( self,
+                            ( ( int64_t const * )argv[ 0 ].u.data.base )[ argv[ 0 ].u.data.first_elem ],
+                            row_id,
+                            rslt->data->base );
+#endif
+        if ( rc == 0 )
+        {
+            if ( *( int64_t* )rslt->data->base == 0 )
+                rslt->elem_count = 0;
+            else
+                rslt->elem_count = 1;
+        }
+    }
+    return rc;
+}
+
+
+/* open_sub_cursor */
+static rc_t open_sub_cursor( ID_cache_t *self, const VXfactInfo *info, const VCursor *native_curs )
+{
+    rc_t rc;
+
+    rc = VCursorLinkedCursorGet( native_curs, "SEQUENCE", &self->curs );
+    if ( rc != 0 )
+    {
+        const VDatabase *db;
+        const VTable *tbl;
+        /* get at the parent database */
+        rc = VTableOpenParentRead ( info -> tbl, & db );
+        if ( rc != 0 )
+            return rc;
+        /* open the table */
+        rc = VDatabaseOpenTableRead ( db, &tbl, "SEQUENCE" );
+        VDatabaseRelease ( db );
+        if ( rc != 0 )
+            return rc;
+        /* create a cursor */
+        rc = VTableCreateCachedCursorRead( tbl, &self->curs, 32*1024*1024 );
+        VTableRelease( tbl );
+        if ( rc != 0 )
+            return rc;
+        rc = VCursorPermitPostOpenAdd( self->curs );
+        if ( rc != 0 )
+            return rc;
+        rc = VCursorOpen( self->curs );
+        if ( rc != 0 )
+            return rc;
+        rc = VCursorLinkedCursorSet( native_curs, "SEQUENCE", self->curs );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    rc = VCursorAddColumn( self->curs, &self->idx, "(I64)PRIMARY_ALIGNMENT_ID" );
+    if ( rc == 0 )
+    {
+        rc = KVectorMake( &self->j_cache );
+        if ( rc == 0 )
+            rc = KVectorMake( &self->p_cache );
+        if ( rc == 0 )
+            return 0;
+    }
+    VCursorRelease( self->curs );
+    return rc;
+}
+
+
+/* close_sub_cursor
+ */
+static void CC close_sub_cursor( void * data )
+{
+    ID_cache_t *self = data;
+
+    VCursorRelease( self->curs );
+    KVectorRelease( self->j_cache );
+    KVectorRelease( self->p_cache );
+    free( self );
+}
+
+
+/*
+ * extern function I64[2] NCBI:align:get_mate_id #1 (I64 spotId);
+ */
+VTRANSFACT_IMPL( NCBI_align_get_mate_align_id, 1, 0, 0 ) ( const void * Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    ID_cache_t *self = calloc( 1, sizeof( *self ) );
+
+    if ( self == NULL )
+        return RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+
+    SUB_DEBUG( ( "SUB.Make in 'get_mate_align_ids.c'\n" ) );
+
+    rc = open_sub_cursor( self, info, ( const VCursor* )info->parms );
+    if ( rc == 0 ) {
+        rslt->self = self;
+        rslt->u.rf = get_mate_algn_id_drvr;
+        rslt->variant = vftIdDepRow;
+        rslt->whack = close_sub_cursor;
+    }
+    else {
+        free(self);
+    }
+
+    return rc;
+}
diff --git a/libs/axf/make-cmp-read_desc.c b/libs/axf/make-cmp-read_desc.c
new file mode 100644
index 0000000..d84df6b
--- /dev/null
+++ b/libs/axf/make-cmp-read_desc.c
@@ -0,0 +1,176 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <insdc/insdc.h>
+#include <align/refseq-mgr.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <insdc/sra.h>
+
+static void copy( void * dst, size_t doff, void const * src, size_t soff, size_t bits )
+{
+    if ( ( doff & 7 ) == 0 && ( soff & 7 ) == 0 && ( bits & 7 ) == 0 )
+    {
+        memmove( &( ( char * )dst )[ doff >> 3 ], &( ( char const * )src )[ soff >> 3 ], bits >> 3 );
+    }
+    else
+    {
+        bitcpy( dst, doff, src, soff, bits );
+    }
+}
+
+
+static
+rc_t CC make_cmp_read_desc_inv_impl( void *data, const VXformInfo *info, int64_t row_id,
+    VFixedRowResult const *rslt, uint32_t argc, VRowData const argv [] )
+{
+    int64_t const *const alignId = &( ( int64_t const * )argv[ 1 ].u.data.base )[ argv[ 1 ].u.data.first_elem ];
+    void const *const ZERO = data;
+    void const *const base = argv[ 0 ].u.data.base;
+    unsigned src = ( unsigned )( argv[ 0 ].u.data.first_elem * rslt->elem_bits );
+    unsigned dst = ( unsigned )(rslt->first_elem * rslt->elem_bits );
+    unsigned i;
+    
+    for ( i = 0; i != rslt->elem_count; ++i )
+    {
+        bool const aligned = alignId[ i ] != 0;
+
+        copy( rslt->base,
+              dst,
+              !aligned ? base : ZERO,
+              !aligned ? src : 0,
+              ( size_t )rslt->elem_bits );
+
+        src += ( unsigned )rslt->elem_bits;
+        dst += ( unsigned )rslt->elem_bits;
+    }
+    return 0;
+}
+
+
+static
+rc_t CC make_cmp_read_desc_impl( void *data, const VXformInfo *info, int64_t row_id,
+    VFixedRowResult const *rslt, uint32_t argc, VRowData const argv [] )
+{
+    int64_t const *const alignId = &( ( int64_t const * )argv[ 1 ].u.data.base )[ argv[ 1 ].u.data.first_elem ];
+    void const *const ZERO = data;
+    void const *const base = argv[ 0 ].u.data.base;
+    unsigned src = ( unsigned )( argv[ 0 ].u.data.first_elem * rslt->elem_bits );
+    unsigned dst = ( unsigned )( rslt->first_elem * rslt->elem_bits );
+    unsigned i;
+    
+    for ( i = 0; i != rslt->elem_count; ++i )
+    {
+        bool const aligned = alignId[ i ] != 0;
+
+        copy( rslt->base,
+              dst,
+              aligned ? base : ZERO,
+              aligned ? src : 0,
+              ( size_t )rslt->elem_bits );
+
+        src += ( unsigned )rslt->elem_bits;
+        dst += ( unsigned )rslt->elem_bits;
+    }
+    return 0;
+}
+
+
+static
+rc_t CC make_read_start_impl( void *data, const VXformInfo *info, int64_t row_id,
+                              VFixedRowResult const *rslt, uint32_t argc, VRowData const argv [] )
+{
+    INSDC_coord_zero *const dst = &( ( INSDC_coord_zero * )rslt->base )[ rslt->first_elem ];
+    INSDC_coord_len const *const readlen = &( ( INSDC_coord_len const * )argv[ 0 ].u.data.base )[ argv[ 0 ].u.data.first_elem ];
+    INSDC_coord_zero start;
+    unsigned i;
+    
+    for ( start = 0, i = 0; i != rslt->elem_count; ++i )
+    {
+        INSDC_coord_len const rlen = readlen[ i ];
+
+        dst[ i ] = start;
+        start += rlen;
+    }
+    return 0;
+}
+
+
+static rc_t make_cmp_read_desc_factory( const void *Self,
+                                        const VXfactInfo *info,
+                                        VFuncDesc *rslt,
+                                        const VFactoryParams *cp,
+                                        const VFunctionParams *dp )
+{
+    rslt->self = calloc( 1, ( info->fdesc.desc.intrinsic_bits * info->fdesc.desc.intrinsic_bits + 7 ) >> 3 );
+    if ( rslt->self == NULL )
+        return RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    rslt->whack = free;
+    rslt->u.pf = cp->argv[ 0 ].data.b[ 0 ] ? make_cmp_read_desc_inv_impl : make_cmp_read_desc_impl;
+    rslt->variant = vftFixedRow;
+    return 0;
+}
+
+
+/* 
+ * function < type T >
+ * T NCBI:align:make_cmp_read_desc #1 <bool invert>(T operand, I64 align_id);
+ */
+VTRANSFACT_IMPL ( NCBI_align_make_cmp_read_desc, 1, 0, 0 )
+    ( const void *Self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    return make_cmp_read_desc_factory( Self, info, rslt, cp, dp );
+}
+
+/*
+ * extern function INSDC:coord:zero NCBI:align:make_read_start #1
+ *     (INSDC:coord:len read_len, I64 align_id);
+ */
+VTRANSFACT_IMPL ( NCBI_align_make_read_start, 1, 0, 0 )
+    ( const void *Self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.pf = make_read_start_impl;
+    rslt->variant = vftFixedRow;
+    return 0;
+}
diff --git a/libs/axf/mismatch-restore-qual.c b/libs/axf/mismatch-restore-qual.c
new file mode 100644
index 0000000..b3884fc
--- /dev/null
+++ b/libs/axf/mismatch-restore-qual.c
@@ -0,0 +1,135 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <insdc/insdc.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+static
+rc_t CC mismatch_restore_qual_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    unsigned i, j;
+    INSDC_quality_phred const *qual	= argv[ 0 ].u.data.base;
+    unsigned const nqual = ( unsigned const )argv[ 0 ].u.data.elem_count;
+    bool const *mismatch = argv[ 1 ].u.data.base;
+    unsigned const nmis = ( unsigned const )argv[ 1 ].u.data.elem_count;
+    INSDC_quality_phred const rqual = ( INSDC_quality_phred const )( intptr_t )data;
+    INSDC_quality_phred *dst;
+    
+    qual += argv[ 0 ].u.data.first_elem;
+    mismatch += argv[ 1 ].u.data.first_elem;
+    
+    rslt->data->elem_bits = argv[ 0 ].u.data.elem_bits;
+    rc = KDataBufferResize( rslt -> data, nmis );
+    if ( rc != 0 )
+        return rc;
+    rslt -> elem_count = nmis;
+    dst = rslt -> data -> base;
+    
+    for ( j = i = 0; i != nmis; ++i )
+    {
+        dst[ i ] = mismatch[ i ] ? qual[ j++ ] : rqual;
+    }
+    assert( j == nqual );
+    return 0;
+}
+
+
+/* 
+ * function INSDC:quality:phred NCBI:align:mismatch_restore_qual #1 < INSDC:quality:phred matched_qual >
+ *    ( INSDC:quality:phred mismatch_qual, bool has_mismatch );
+ */
+VTRANSFACT_IMPL ( NCBI_align_mismatch_restore_qual, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->self = ( void * )( intptr_t )cp->argv[ 0 ].data.u8[ 0 ];
+    rslt->u.rf = mismatch_restore_qual_impl;
+    rslt->variant = vftRow;
+    rslt -> whack = NULL;
+    return 0;
+}
+
+static
+rc_t CC decompress_quality_impl ( void *data, const VXformInfo *info, int64_t row_id,
+                                  VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    unsigned i, j;
+    INSDC_quality_phred const *qual	= argv[ 0 ].u.data.base;
+    unsigned const nqual = ( unsigned const )argv[ 0 ].u.data.elem_count;
+    bool const *preserved = argv[ 1 ].u.data.base;
+    unsigned const readlen = ( unsigned const )argv[ 1 ].u.data.elem_count;
+    INSDC_quality_phred const rqual = ( INSDC_quality_phred const )( intptr_t )data;
+    INSDC_quality_phred *dst;
+    
+    qual += argv[ 0 ].u.data.first_elem;
+    preserved += argv[ 1 ].u.data.first_elem;
+    
+    rslt->data->elem_bits = argv[ 0 ].u.data.elem_bits;
+    rc = KDataBufferResize( rslt -> data, readlen );
+    if ( rc != 0 )
+        return rc;
+    rslt -> elem_count = readlen;
+    dst = rslt -> data -> base;
+    
+    for ( j = i = 0; i != readlen; ++i )
+    {
+        dst[ i ] = preserved[ i ] ? qual[ j++ ] : rqual;
+    }
+    assert( j == nqual );
+    return 0;
+}
+
+
+/* 
+ * function INSDC:quality:phred NCBI:align:decompress_quality #1
+ *    < INSDC:quality:phred restored_qual_value >
+ *    ( INSDC:quality:phred cmp_quality, bool preserved );
+ */
+VTRANSFACT_IMPL ( NCBI_align_decompress_quality, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+                                                              VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->self = ( void * )( intptr_t )cp->argv[ 0 ].data.u8[ 0 ];
+    rslt->u.rf = decompress_quality_impl;
+    rslt->variant = vftRow;
+    rslt -> whack = NULL;
+    return 0;
+}
diff --git a/libs/axf/not-my-row.c b/libs/axf/not-my-row.c
new file mode 100644
index 0000000..5817276
--- /dev/null
+++ b/libs/axf/not-my-row.c
@@ -0,0 +1,76 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+static
+rc_t CC not_my_row_impl( void * data, const VXformInfo * info, int64_t row_id,
+                         VRowResult * rslt, uint32_t argc, const VRowData argv [] ) 
+{
+	rc_t 	rc;
+	const int64_t* src = argv[ 0 ].u.data.base;
+	uint32_t len = ( uint32_t )argv[ 0 ].u.data.elem_count;
+	
+	src += argv[ 0 ].u.data.first_elem;
+	assert( argv[ 0 ].u.data.elem_bits == 64 );
+	rc = KDataBufferResize( rslt->data, len );
+	if( rc == 0 )
+    {
+		int64_t *dst;
+		int i, j;
+		dst = rslt->data->base;
+		for( i = j = 0; i < ( int )len; i++ )
+        {
+			if ( src[ i ] != row_id && src[i] > 0 ) /**we used alignment is as 0 to indicate no alignmnent**/
+            {
+				dst[ j++ ] = src[ i ];
+			}
+		}
+		rslt->elem_count = j;
+	}
+	return rc;	
+}
+
+VTRANSFACT_IMPL ( NCBI_align_not_my_row, 1, 0, 0 ) ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+                                                 const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftIdDepRow; /*** row_id influences behavior of the function ***/ 
+    rslt->u.ndf = not_my_row_impl;
+    return 0;
+}
diff --git a/libs/axf/project_read_from_sequence.c b/libs/axf/project_read_from_sequence.c
new file mode 100644
index 0000000..c3b10e1
--- /dev/null
+++ b/libs/axf/project_read_from_sequence.c
@@ -0,0 +1,285 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <insdc/insdc.h>
+#include <align/refseq-mgr.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <insdc/sra.h>
+
+#ifdef _DEBUGGING
+#define SUB_DEBUG(msg) DBGMSG(DBG_SRA,DBG_FLAG(DBG_SRA_SUB),msg)
+#else
+#define SUB_DEBUG(msg)
+#endif
+
+typedef struct RestoreRead RestoreRead;
+struct RestoreRead
+{
+    const VCursor *curs;
+    uint32_t col_idx;
+    uint32_t read_len_idx;
+    uint32_t read_start_idx;
+};
+
+static
+void CC RestoreReadWhack ( void *obj )
+{
+    RestoreRead * self = obj;
+    if ( self != NULL )
+    {
+        VCursorRelease ( self -> curs );
+        free ( self );
+    }
+}
+
+static
+rc_t RestoreReadMake ( RestoreRead **objp, const VXfactInfo *info, const VFactoryParams *cp,
+                       const VCursor *native_curs )
+{
+    rc_t rc;
+    RestoreRead * obj;
+
+    SUB_DEBUG( ( "SUB.Make in 'project_read_from_sequence.c'\n" ) );
+
+    /* create the object */
+    obj = malloc ( sizeof ( * obj ) );
+    if ( obj == NULL )
+    {
+        rc = RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        rc = VCursorLinkedCursorGet( native_curs, "SEQUENCE", &obj->curs );
+        if ( rc != 0 )
+        {
+            const VDatabase * db;
+            const VTable * tbl;
+            uint64_t cache_size = 32*1024*1024;
+            uint64_t native_cursor_cache_size = VCursorGetCacheCapacity(native_curs);
+
+            /* get at the parent database */
+            rc = VTableOpenParentRead ( info -> tbl, & db );
+            if ( rc != 0 )
+                return rc;
+
+            /* open the table */
+            rc = VDatabaseOpenTableRead ( db, &tbl, "SEQUENCE" );
+            VDatabaseRelease ( db );
+            if ( rc != 0 )
+                return rc;
+
+            if(native_cursor_cache_size/4 > cache_size){
+                /* share cursor size with native cursor **/
+                cache_size = native_cursor_cache_size/4;
+                native_cursor_cache_size -= cache_size;
+                VCursorSetCacheCapacity((VCursor*)native_curs,native_cursor_cache_size);
+            }
+            /* create a cursor */
+            rc = VTableCreateCachedCursorRead( tbl, &obj->curs, cache_size );
+            VTableRelease( tbl );
+            if ( rc != 0 )
+                return rc;
+
+            rc = VCursorPermitPostOpenAdd( obj->curs );
+            if ( rc != 0 )
+                return rc;
+            rc = VCursorOpen( obj->curs );
+            if ( rc != 0 )
+                return rc;
+            rc = VCursorLinkedCursorSet( native_curs, "SEQUENCE", obj->curs );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        if ( rc == 0 )
+        {
+            /* add columns to cursor */
+            assert ( cp -> argc == 1 );
+            rc = VCursorAddColumn ( obj -> curs, & obj -> col_idx, "%.*s",
+                                    cp -> argv [ 0 ] . count, cp -> argv [ 0 ] . data . ascii );
+            if ( rc == 0 || GetRCState( rc ) == rcExists )
+                rc = VCursorAddColumn ( obj -> curs, & obj -> read_len_idx, "(INSDC:coord:len)READ_LEN" );
+
+            if ( rc == 0 || GetRCState( rc ) == rcExists )
+                rc = VCursorAddColumn ( obj -> curs, & obj -> read_start_idx, "(INSDC:coord:zero)READ_START" );
+
+            if ( rc == 0  || GetRCState( rc ) == rcExists)
+            {
+                VTypedesc src;
+                rc = VCursorDatatype ( obj -> curs, obj -> col_idx, NULL, & src );
+                if ( rc == 0 )
+                {
+                    /* selected column should have same characteristics */
+                    if ( src . domain != info -> fdesc . desc . domain                 ||
+                         src . intrinsic_bits != info -> fdesc . desc . intrinsic_bits ||
+                         src . intrinsic_dim != info -> fdesc . desc. intrinsic_dim )
+                    {
+                        rc = RC ( rcXF, rcFunction, rcConstructing, rcType, rcInconsistent );
+                    }
+                    else if ( ( src . intrinsic_bits & 7 ) != 0 )
+                    {
+                        rc = RC ( rcXF, rcFunction, rcConstructing, rcType, rcUnsupported );
+                    }
+                    else
+                    {
+                        * objp = obj;
+                        return 0;
+                    }
+                }
+            }
+        }
+        free ( obj );
+    }
+    return rc;
+}
+
+
+static
+rc_t CC project_from_sequence_impl ( void *data, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    RestoreRead *self =  data;
+
+    rc_t rc;
+    INSDC_coord_zero read_id;
+    const int64_t *spot_id = argv [ 0 ] . u . data . base;
+    const INSDC_coord_one *read_id_in = argv [ 1 ] . u . data . base;
+    const INSDC_coord_one *read_start;
+    const INSDC_coord_len *read_len;
+    const void *src;
+    uint32_t src_sz;
+    uint32_t src_bits;
+    uint32_t nreads;
+    uint32_t nreads_2;
+    
+    spot_id += argv [ 0 ] . u . data . first_elem;
+    read_id_in += argv [ 1 ] . u . data . first_elem;
+
+    assert( argv[ 0 ].u.data.elem_bits == 64 );
+    assert( argv[ 0 ].u.data.elem_count == 1 );
+
+    assert( argv[ 1 ].u.data.elem_bits == 32 );
+    assert( argv[ 1 ].u.data.elem_count == 1 );
+
+    if ( spot_id[ 0 ] == 0 ) /*** valid case , the projection should be empty ***/
+    {
+        rslt->elem_count = 0;
+        return 0;
+    }
+    assert( read_id_in[ 0 ] > 0 );
+    read_id = read_id_in[ 0 ] - 1; /** make zero - based **/
+
+    SUB_DEBUG( ( "SUB.Rd in 'project_read_from_sequence.c' at #%lu\n", spot_id[ 0 ] ) );
+
+    rc = VCursorCellDataDirect( self->curs, spot_id[ 0 ], self->read_len_idx,
+                                NULL, ( void const ** )&read_len, NULL, &nreads );
+    if ( rc != 0 )
+        return rc;
+    
+    rc = VCursorCellDataDirect( self->curs, spot_id[ 0 ], self->read_start_idx,
+                                NULL, ( void const ** )&read_start, NULL, &nreads_2 );
+    if ( rc != 0 )
+        return rc;
+    
+    if ( nreads != nreads_2 || read_id >= (INSDC_coord_zero)nreads )
+    {
+        return RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+    }
+    
+    rc = VCursorCellDataDirect( self->curs, spot_id[ 0 ], self->col_idx,
+                                &src_bits, &src, NULL, &src_sz );
+    if ( rc != 0 )
+        return rc;
+    
+    if ( src_sz == nreads )
+    {
+        rslt->elem_count = 1;
+        rslt->data->elem_bits = src_bits;
+        rc = KDataBufferResize( rslt->data, 1 );
+        if ( rc == 0 )
+        {
+            memmove( rslt->data->base,
+                    &( ( char const * )src )[ ( read_id * src_bits ) >> 3 ],
+                    src_bits >> 3 );
+        }
+    }
+    else if ( src_sz == read_start[ nreads - 1 ] + read_len[ nreads - 1 ] )
+    {
+        /* like READ or QUALITY */
+        rslt->elem_count = read_len[ read_id ];
+        rslt->data->elem_bits = src_bits;
+        rc = KDataBufferResize( rslt->data, rslt->elem_count );
+        if ( rc == 0 )
+        {
+            memmove( rslt->data->base,
+                    &( ( char const * )src )[ ( read_start[ read_id ] * src_bits ) >> 3 ],
+                    ( size_t )( ( src_bits * rslt->elem_count ) >> 3 ) );
+        }
+    }
+    else
+    {
+        /* don't know how to break up the read or should use simple_sub_select */
+        return RC( rcXF, rcFunction, rcExecuting, rcConstraint, rcViolated );
+    }
+    return 0;
+}
+
+/* 
+ * function
+ * INSDC:4na:bin NCBI:align:project_from_sequence #1 < ascii col > ( I64 seq_spot_id, INSDC:coord:one seq_read_id )
+ *     = ALIGN:project_from_sequence;
+ */
+VTRANSFACT_IMPL ( ALIGN_project_from_sequence, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    RestoreRead *fself;
+    rc_t rc = RestoreReadMake ( & fself, info, cp, (const VCursor*)info->parms  );
+    if ( rc == 0 )
+    {
+        rslt->self = fself;
+        rslt->u.ndf = project_from_sequence_impl;
+        rslt->variant = vftRow;
+        rslt -> whack = RestoreReadWhack;
+    }
+    return rc;
+}
diff --git a/libs/axf/raw-restore-qual.c b/libs/axf/raw-restore-qual.c
new file mode 100644
index 0000000..07fc5ad
--- /dev/null
+++ b/libs/axf/raw-restore-qual.c
@@ -0,0 +1,95 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <insdc/insdc.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+static
+rc_t CC raw_restore_read_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    int i, j;
+    const INSDC_4na_bin	*qual	= argv[ 0 ].u.data.base;
+    const uint32_t	read_len 	= (uint32_t)argv[ 0 ].u.data.elem_count;
+    const uint8_t	*strand		= argv[ 1 ].u.data.base;
+    const uint32_t	strand_len 	= (uint32_t)argv[ 1 ].u.data.elem_count;
+    
+    INSDC_4na_bin *dst;
+    
+    assert( argv[ 0 ].u.data.elem_bits == 8 );
+    assert( argv[ 1 ].u.data.elem_bits == 8 );
+    assert( strand_len == 1 );
+    
+    qual   += argv[ 0 ].u.data.first_elem;
+    strand += argv[ 1 ].u.data.first_elem;
+    
+    /* resize output row for the total number of reads */    
+    rslt -> data -> elem_bits = 8;
+    rc = KDataBufferResize ( rslt -> data, read_len );
+    if ( rc != 0 )
+        return rc;
+    rslt -> elem_count = read_len;
+    dst = rslt -> data -> base;
+    /**** MAIN RESTORATION LOOP ***/
+    if ( strand[ 0 ] == false ) /*** nothing to do **/
+    {
+        memmove( dst, qual, read_len );
+    } else for ( i = 0, j = read_len - 1; i < (int)read_len; i++, j-- )
+    {
+        dst[ i ] = qual[ j ];
+    }
+    return 0;
+}
+
+
+/* 
+ * function
+ * INSDC:quality:phred NCBI:align:raw_restore_qual #1( INSDC:quality:phred align_qual, bool ref_orientation);
+ */
+VTRANSFACT_IMPL ( NCBI_align_raw_restore_qual, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+
+    rslt->u.rf = raw_restore_read_impl;
+    rslt->variant = vftRow;
+    rslt -> whack = NULL;
+    return 0;
+}
diff --git a/libs/axf/raw-restore-read.c b/libs/axf/raw-restore-read.c
new file mode 100644
index 0000000..9330bbe
--- /dev/null
+++ b/libs/axf/raw-restore-read.c
@@ -0,0 +1,119 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <insdc/insdc.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+
+static INSDC_4na_bin  map[]={
+/*0  0000 - 0000*/ 0,
+/*1  0001 - 1000*/ 8,
+/*2  0010 - 0100*/ 4,
+/*3  0011 - 1100*/ 12,
+/*4  0100 - 0010*/ 2,
+/*5  0101 - 1010*/ 10,
+/*6  0110 - 0110*/ 6,
+/*7  0111 - 1110*/ 14,
+/*8  1000 - 0001*/ 1,
+/*9  1001 - 1001*/ 9,
+/*10  1010 - 0101*/ 5,
+/*11  1011 - 1101*/ 13,
+/*12  1100 - 0011*/ 3,
+/*13  1101 - 1011*/ 11,
+/*14  1110 - 0111*/ 7,
+/*15  1111 - 1111*/ 15
+};
+
+
+
+static
+rc_t CC raw_restore_read_impl ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    int i, j;
+    const INSDC_4na_bin	*read 	= argv[ 0 ].u.data.base;
+    const uint32_t	read_len 	= (uint32_t)argv[ 0 ].u.data.elem_count;
+    const uint8_t	*strand		= argv[ 1 ].u.data.base;
+    const uint32_t	strand_len 	= (uint32_t)argv[ 1 ].u.data.elem_count;
+    
+    INSDC_4na_bin *dst;
+    
+    assert( argv[ 0 ].u.data.elem_bits == 8 );
+    assert( argv[ 1 ].u.data.elem_bits == 8 );
+    assert( strand_len == 1 );
+    
+    read   += argv[ 0 ].u.data.first_elem;
+    strand += argv[ 1 ].u.data.first_elem;
+    
+    /* resize output row for the total number of reads */    
+    rslt -> data -> elem_bits = 8;
+    rc = KDataBufferResize ( rslt -> data, read_len );
+    if ( rc != 0 )
+        return rc;
+    rslt -> elem_count = read_len;
+    dst = rslt -> data -> base;
+
+    /**** MAIN RESTORATION LOOP ***/
+    if ( strand[ 0 ] == false ) /*** nothing to do **/
+    {
+        memmove( dst, read, read_len );
+    }
+    else for ( i = 0, j = read_len - 1; i < (int)read_len; i++, j-- )
+    {
+        dst[ i ] = map[ read[ j ]&15 ];
+    }
+    return 0;
+}
+
+
+/* 
+ * function
+ * INSDC:4na:bin ALIGN:raw_restore_read #1( INSDC:4na:bin ref_read, bool ref_orientation);
+ */
+VTRANSFACT_IMPL ( ALIGN_raw_restore_read, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+
+    rslt->u.rf = raw_restore_read_impl;
+    rslt->variant = vftRow;
+    rslt -> whack = NULL;
+    return 0;
+}
diff --git a/libs/axf/ref-preserve_qual.c b/libs/axf/ref-preserve_qual.c
new file mode 100644
index 0000000..52a954a
--- /dev/null
+++ b/libs/axf/ref-preserve_qual.c
@@ -0,0 +1,429 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <insdc/insdc.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <vdb/cursor.h>
+#include <vdb/database.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <klib/pack.h>
+#include <klib/sort.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+struct node {
+    BSTNode link;
+    char const *name;
+    uint8_t *bitmap;
+    int64_t first_row;
+    uint64_t row_count;
+    size_t namelen;
+};
+typedef struct node Node;
+
+static
+int64_t CC NodeNameCmp( void const *a, BSTNode const *n )
+{
+    String b;
+    
+    StringInit( &b, ( ( Node const * )n )->name, ( ( Node const * )n )->namelen,
+                    ( uint32_t )( ( Node const * )n )->namelen );
+    return StringOrderNoNullCheck( a, &b );
+}
+
+static
+int64_t CC NodeCmp( BSTNode const *A, BSTNode const *B )
+{
+    String a;
+    String b;
+    
+    StringInit( &a, ( ( Node const * )A )->name, ( ( Node const * )A )->namelen, 
+                    ( uint32_t )( ( Node const * )A )->namelen );
+    StringInit( &b, ( ( Node const * )B )->name, ( ( Node const * )B )->namelen,
+                    ( uint32_t )( ( Node const * )B )->namelen );
+    return StringOrderNoNullCheck( &a, &b );
+}
+
+static
+void CC NodeWhack( BSTNode *n, void *data )
+{
+    free( n );
+}
+
+
+static
+rc_t NodeProcessIDs( Node *self, unsigned row, VCursor const *curs, uint32_t const cid[],
+                     bool buf[], size_t sz, size_t *bmax, INSDC_coord_len const max_seq_len,
+                     bool isPrimary, int64_t const ID[], unsigned N )
+{
+    rc_t rc = 0;
+    unsigned i;
+    bitsz_t dummy;
+    size_t max = *bmax;
+    
+    for ( i = 0; i != N; ++i )
+    {
+        uint64_t const *globalRefStart;
+        bool const *preserveQual;
+        uint32_t elem_bits;
+        uint32_t boff;
+        uint32_t n;
+        unsigned offset;
+
+        rc = VCursorCellDataDirect( curs, ID[ i ], cid[ 0 ], &elem_bits,
+                                    ( void const ** )&globalRefStart, &boff, &n );
+        if ( rc != 0 )
+            return rc;
+
+        rc = VCursorCellDataDirect( curs, ID[ i ], cid[ 1 ], &elem_bits,
+                                    ( void const ** )&preserveQual, &boff, &n );
+        if ( rc != 0 )
+            return rc;
+        
+        offset = ( globalRefStart[ 0 ] ) % max_seq_len;
+        if ( offset + n > max )
+        {
+            max = offset + n;
+        }
+
+        if ( max >= sz ) 
+        {
+            return RC( rcXF, rcNode, rcConstructing, rcBuffer, rcInsufficient );
+        }
+
+        {
+            unsigned j;
+            
+            for ( j = 0; j != n; ++j )
+            {
+                buf[ j + offset ] |= preserveQual[ j ];
+            }
+        }
+    }
+
+    Pack( 8, 1, buf, max_seq_len, NULL, self->bitmap, ( size_t )row * max_seq_len,
+         ( size_t )self->row_count * max_seq_len, &dummy );
+
+    if ( max > max_seq_len )
+    {
+        max -= max_seq_len;
+        memmove( buf, buf + max_seq_len, max );
+        memset( buf + max, 0, max_seq_len );
+    }
+    else
+    {
+        memset( buf, 0, max );
+        max = 0;
+    }
+    *bmax = max;
+
+    return rc;
+}
+
+
+static
+rc_t OpenAlignCursor( VCursor const **curs, uint32_t cid[], VDatabase const *db, bool isPrimary )
+{
+    char const * tname = isPrimary ? "PRIMARY_ALIGNMENT" : "SECONDARY_ALIGNMENT";
+    VTable const * atbl;
+    rc_t rc = VDatabaseOpenTableRead( db, &atbl, tname );
+    
+    if ( rc == 0 )
+    {
+        VCursor const *acurs;
+        rc = VTableCreateCursorRead( atbl, &acurs );
+        VTableRelease( atbl );
+        
+        while ( rc == 0 )
+        {
+            rc = VCursorAddColumn( acurs, &cid[ 0 ], "(U64)GLOBAL_REF_START" );
+            assert( rc == 0 );
+            if ( rc != 0 )
+                break;
+            
+            rc = VCursorAddColumn( acurs, &cid[ 1 ], "(bool)REF_PRESERVE_QUAL" );
+            assert( rc == 0 );
+            if ( rc != 0 )
+                break;
+            
+            rc = VCursorOpen( acurs );
+            if ( rc != 0 )
+                break;
+
+            *curs = acurs;
+            return 0;
+        }
+        VCursorRelease( acurs );
+    }
+    return rc;
+}
+
+
+static
+rc_t NodeLoadIDs( Node *self, VTable const *tbl, VDatabase const *db, bool buf[],
+                  size_t sz, INSDC_coord_len const max_seq_len, bool isPrimary )
+{
+    char const *cname = isPrimary ? "PRIMARY_ALIGNMENT_IDS" : "SECONDARY_ALIGNMENT_IDS";
+    VCursor const *algn;
+    uint32_t algn_cid[ 2 ];
+    rc_t rc = OpenAlignCursor( &algn, algn_cid, db, isPrimary );
+
+    if ( rc == 0 )
+    {
+        VCursor const *curs;
+        rc = VTableCreateCursorRead( tbl, &curs );
+        
+        if ( rc == 0 )
+        {
+            uint32_t cid;
+            
+            rc = VCursorAddColumn( curs, &cid, cname );
+            if ( rc == 0 )
+            {
+                rc = VCursorOpen( curs );
+                if ( rc == 0 )
+                {
+                    unsigned i;
+                    size_t bmax = 0;
+                    
+                    memset( buf, 0, sz );
+                    for ( i = 0; i != self->row_count; ++i )
+                    {
+                        void const *base;
+                        uint32_t elem_bits;
+                        uint32_t boff;
+                        uint32_t n;
+                        
+                        rc = VCursorCellDataDirect( curs, self->first_row + i, cid,
+                                                    &elem_bits, &base, &boff, &n );
+                        if ( rc != 0 )
+                            break;
+                        if ( n > 0 )
+                        {
+                            rc = NodeProcessIDs( self, i, algn, algn_cid,
+                                                 buf, sz, &bmax, max_seq_len,
+                                                 isPrimary, base, n );
+                            if ( rc != 0 )
+                                break;
+                        }
+                    }
+                }
+            }
+            VCursorRelease( curs );
+        }
+        VCursorRelease( algn );
+    }
+    else if ( !isPrimary )
+        rc = 0;
+    
+    return rc;
+}
+
+
+static
+rc_t NodeLoad( Node *self, VTable const *tbl, VDatabase const *db, bool buf[],
+               size_t sz, INSDC_coord_len const max_seq_len )
+{
+    rc_t rc = NodeLoadIDs( self, tbl, db, buf, sz, max_seq_len, true );
+    if ( rc == 0 )
+    {
+        rc = NodeLoadIDs( self, tbl, db, buf, sz, max_seq_len, false );
+    }
+    return rc;
+}
+
+
+static
+rc_t NodeMake( Node **rslt, VTable const *tbl, String const *refName, INSDC_coord_len const max_seq_len )
+{
+    Node *self;
+    int64_t data[ 2 ];
+    VDatabase const *db;
+    VCursor const *curs;
+    rc_t rc = VTableCreateCursorRead( tbl, &curs );
+    
+    if ( rc == 0 )
+    {
+        uint32_t cid;
+        
+        rc = VCursorAddColumn( curs, &cid, "NAME_RANGE" );
+        if ( rc == 0 )
+        {
+            rc = VCursorParamsSet( ( struct VCursorParams const * )curs, "QUERY_SEQ_NAME", "%.*s",
+                                    refName->len, refName->addr );
+            if ( rc == 0 )
+            {
+                rc = VCursorOpen( curs );
+                if ( rc == 0 )
+                {
+                    rc = VCursorOpenRow( curs );
+                    if ( rc == 0 )
+                    {
+                        uint32_t dummy;
+                        rc = VCursorRead( curs, cid, 64, data, 2, &dummy );
+                    }
+                }
+            }
+        }
+        VCursorRelease( curs );
+    }
+    if ( rc != 0 )
+        return rc;
+    
+    self = malloc( ( size_t )( sizeof( *self ) + refName->len + ( ( ( data[ 1 ] - data[ 0 ] + 1 ) * max_seq_len + 7 ) >> 3 )  ) );
+    if ( self == NULL )
+        return RC( rcXF, rcNode, rcConstructing, rcMemory, rcExhausted );
+    
+    memmove( &self[ 1 ], refName->addr, self->namelen = refName->len );
+    self->name = ( char const * )&self[ 1 ];
+    self->bitmap = ( uint8_t * )&self->name[ refName->len ];
+    self->row_count = data[ 1 ] - ( self->first_row = data[ 0 ] ) + 1;
+    
+    rc = VTableOpenParentRead( tbl, &db );
+    if ( rc == 0 )
+    {
+        void *scratch = malloc( 32 * max_seq_len );
+        if ( scratch != NULL )
+        {
+            rc = NodeLoad( self, tbl, db, scratch, 32 * max_seq_len, max_seq_len );
+            if ( rc == 0 )
+            {
+                VDatabaseRelease( db );
+                free( scratch );
+                *rslt = self;
+                return 0;
+            }
+            free( scratch );
+        }
+        else
+        {
+            rc = RC( rcXF, rcNode, rcConstructing, rcMemory, rcExhausted );
+        }
+        VDatabaseRelease( db );
+    }
+    free( self );
+    *rslt = NULL;
+    
+    return rc;
+}
+
+
+/* generate_preserve_qual
+ *  compute the positions where corresponding qualities should be preserved
+ *  when converting to an analysis database.
+ * Preserve where:
+ *  there is a mismatch
+ *  two positions to each side of an insert
+ *
+ * extern function bool NCBI:align:generate_preserve_qual #1
+ *  ( utf8 ref_name, INSDC:coord:len seq_len, U32 max_seq_len );
+ */
+static
+rc_t CC generate_preserve_qual_impl( void *Self, VXformInfo const *info,
+                                     int64_t row_id, VRowResult *rslt,
+                                     uint32_t argc, VRowData const argv[] )
+{
+    BSTree *tree = Self;
+    Node *map;
+    rc_t rc;
+    String refName;
+    uint32_t const max_seq_len = ( ( uint32_t const * )argv[ 2 ].u.data.base )[ argv[ 2 ].u.data.first_elem ];
+    INSDC_coord_len const seq_len = ( ( INSDC_coord_len const * )argv[ 1 ].u.data.base )[ argv[ 1 ].u.data.first_elem ];
+
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( seq_len ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( max_seq_len ) * 8 );
+    
+    rslt->data->elem_bits = rslt->elem_bits;
+    rslt->elem_count = seq_len;
+    rc = KDataBufferResize( rslt->data, rslt->elem_count );
+    if ( rc != 0 )
+        return rc;
+    memset( rslt->data->base, 0, ( size_t )( ( seq_len * rslt->elem_bits + 7 ) >> 3 ) );
+    return 0;
+
+    /* ??? this code cannot be reached !!! */
+    StringInit( &refName,
+                &( ( char const * )argv[ 0 ].u.data.base )[ argv[ 0 ].u.data.first_elem ],
+                ( size_t )argv[ 0 ].u.data.elem_count,
+                ( uint32_t )argv[ 0 ].u.data.elem_count );
+    map = ( Node * )BSTreeFind( tree, &refName, NodeNameCmp );
+    if ( !map )
+    {
+        rc = NodeMake( &map, info->tbl, &refName, max_seq_len );
+        if ( rc != 0 )
+            return rc;
+        rc = BSTreeInsert( tree, &map->link, NodeCmp );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    {{
+        size_t const start = ( size_t )( ( row_id - map->first_row ) * max_seq_len );
+        size_t dummy;
+        
+        Unpack( 1, 8, map->bitmap, start, seq_len, NULL, rslt->data->base, seq_len, &dummy );
+    }}
+    
+    return 0;
+}
+
+static
+void CC Whack_generate_preserve_qual( void *vp )
+{
+    BSTreeWhack( vp, NodeWhack, NULL );
+    free( vp );
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_generate_preserve_qual, 1, 0, 0 )
+    ( const void *Self, VXfactInfo const *info,
+      VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->self = malloc( sizeof( BSTree ) );
+    if ( rslt->self )
+    {
+        BSTreeInit( ( BSTree * )rslt->self );
+        rslt->u.rf = generate_preserve_qual_impl;
+        rslt->variant = vftIdDepRow;
+        rslt -> whack = Whack_generate_preserve_qual;
+        return 0;
+    }
+    return RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+}
diff --git a/libs/axf/ref-restore-read.c b/libs/axf/ref-restore-read.c
new file mode 100644
index 0000000..aa898bc
--- /dev/null
+++ b/libs/axf/ref-restore-read.c
@@ -0,0 +1,201 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <vdb/cursor.h>
+#include <vdb/manager.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <insdc/insdc.h>
+#include <align/refseq-mgr.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifdef _DEBUGGING
+#define SUB_DEBUG(msg) DBGMSG(DBG_SRA,DBG_FLAG(DBG_SRA_SUB),msg)
+#else
+#define SUB_DEBUG(msg)
+#endif
+
+typedef struct RestoreRead RestoreRead;
+struct RestoreRead
+{
+    const RefSeqMgr* rmgr;
+};
+
+
+static
+void CC RestoreReadWhack ( void *obj )
+{
+    RestoreRead * self = obj;
+    if ( self != NULL )
+    {
+        rc_t rc;
+        rc = RefSeqMgr_Release( self->rmgr );
+        assert( rc == 0 );
+        free( self );
+    }
+}
+
+
+static
+rc_t RestoreReadMake ( RestoreRead **objp, const VDBManager *mgr )
+{
+	rc_t rc = 0;
+	RestoreRead *obj;
+
+	assert( objp != NULL );
+    assert( mgr != NULL );
+
+    obj = calloc( 1, sizeof( *obj ) );
+    if ( obj == NULL )
+    {
+		rc = RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        SUB_DEBUG( ( "SUB.Make in 'ref_restore_read.c'\n" ) );
+
+        rc = RefSeqMgr_Make( &obj->rmgr, mgr, errefseq_4NA, 8 * 1024 * 1024, 5 );
+        if ( rc == 0 )
+        {
+		    *objp = obj;
+        }
+        else
+        {
+            *objp = NULL;
+            RestoreReadWhack( obj );
+        }
+	}
+	return rc;
+}
+
+
+static
+rc_t CC ref_restore_read_impl ( void *data, const VXformInfo *info, int64_t row_id,
+                                VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    RestoreRead* self = data;
+    uint8_t* dst;
+    uint32_t read_len     = (uint32_t)argv[ 0 ].u.data.elem_count;
+    const uint8_t *read   = argv[ 0 ].u.data.base;
+    uint32_t seqid_len    = (uint32_t)argv[ 1 ].u.data.elem_count;
+    const char* seqid     = argv[ 1 ].u.data.base;
+    INSDC_coord_one   seq_start;
+    INSDC_coord_len   seq_len;
+
+    assert( argv[ 0 ].u.data.elem_bits == 8 );
+    assert( argv[ 1 ].u.data.elem_bits == 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( INSDC_coord_one ) * 8 );
+    assert( argv[ 3 ].u.data.elem_bits == sizeof( INSDC_coord_len ) * 8 );
+    assert( argv[ 2 ].u.data.elem_count == 1 );
+    assert( argv[ 3 ].u.data.elem_count == 1 );
+
+    read   += argv [ 0 ] . u . data . first_elem;
+    seqid  += argv [ 1 ] . u . data . first_elem;
+    seq_start = ( ( INSDC_coord_one* )argv[ 2 ].u.data.base )[ argv[ 2 ].u.data.first_elem ];
+    seq_len   = ( ( INSDC_coord_len* )argv[ 3 ].u.data.base )[ argv[ 3 ].u.data.first_elem ];
+
+    if ( seq_len < read_len )
+    {
+        rc = RC( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+    }
+    else
+    {
+        /* resize output row for the total number of reads */    
+        rslt->data->elem_bits = 8;
+        rc = KDataBufferResize( rslt->data, seq_len );
+        if ( rc == 0 )
+        {
+            rslt->elem_count = seq_len;
+            dst = rslt->data->base;
+
+            if ( seq_len > 0 )
+            {
+                if ( read_len > 0 )
+                {
+                    memmove( dst, read, read_len );
+                    if ( read_len < seq_len )
+                    {
+                        memset( dst + read_len, 15, seq_len - read_len ); /* pad with 'N' */
+                    }
+                }
+                else if ( seq_start == 0 )
+                {
+                    memset( dst, 15, seq_len ); /* fill with 'N' */
+                }
+                else
+                {
+                    INSDC_coord_len read = 0;
+
+                    SUB_DEBUG( ( "SUB.Rd in 'ref_restore_read.c' at: %.*s at %u.%u\n", seqid_len, seqid, seq_start, seq_len ) );
+
+                    rc = RefSeqMgr_Read( self->rmgr, seqid, seqid_len, seq_start - 1, seq_len, dst, &read );
+                    if ( rc == 0 )
+                    {
+                        if ( read != seq_len )
+                        {
+                            rc = RC( rcXF, rcFunction, rcExecuting, rcData, read < seq_len ? rcTooShort : rcTooLong );
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+/* 
+ * function
+ * INSDC:4na:bin ALIGN:ref_restore_read #1 (  INSDC:4na:bin rd , ascii seq_id , INSDC:coord:one seq_start, INSDC:coord:len seq_len);
+ */
+VTRANSFACT_IMPL ( ALIGN_ref_restore_read, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+                                                     VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    RestoreRead *fself;
+    rc_t rc = RestoreReadMake ( & fself, info -> mgr);
+    if ( rc == 0 )
+    {
+        rslt->self = fself;
+        rslt->u.ndf = ref_restore_read_impl;
+        rslt->variant = vftRow;
+        rslt -> whack = RestoreReadWhack;
+    }
+    return rc;
+}
diff --git a/libs/axf/ref-tbl-sub-select.c b/libs/axf/ref-tbl-sub-select.c
new file mode 100644
index 0000000..65d1ef4
--- /dev/null
+++ b/libs/axf/ref-tbl-sub-select.c
@@ -0,0 +1,533 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+#include <sysalloc.h>
+
+#include <bitstr.h>
+
+#include "ref-tbl.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+#ifdef _DEBUGGING
+#define SUB_DEBUG(msg) DBGMSG(DBG_SRA,DBG_FLAG(DBG_SRA_SUB),msg)
+#else
+#define SUB_DEBUG(msg)
+#endif
+
+
+typedef struct RefTableSubSelect RefTableSubSelect;
+struct RefTableSubSelect
+{
+    rc_t (*func)(struct RefTableSubSelect* self, int64_t ref_row_id,
+                 INSDC_coord_zero offset, INSDC_coord_len ref_len,
+                 uint32_t ref_ploidy, VRowResult* rslt);
+    const VCursor *curs;
+    uint32_t out_idx;
+    union {
+        struct {
+            uint32_t circular_idx;
+            uint32_t name_idx;
+            uint32_t name_range_idx;
+            uint32_t seq_len_idx;
+            uint32_t max_seq_len_idx;
+            uint32_t cmp_read_idx;
+            /* set once upon 1st call */
+            /* set once per each call, if changed from previous */
+            char* name;
+            int64_t start_id;
+            int64_t stop_id;
+            uint32_t name_len;
+            uint32_t max_seq_len;
+            INSDC_coord_len seq_len;
+            bool circular;
+            bool local;
+        } ref;
+        struct {
+            uint32_t ref_id_idx;
+            uint32_t ref_start_idx;
+            uint32_t ref_len_idx;
+            uint32_t read_start_idx;
+            uint32_t read_len_idx;
+            struct RefTableSubSelect* parent;
+        } mod;
+    } u;
+};
+
+/*
+  ref_ploidy != 0 means that offset here is relative to ref_row_id, so it can be
+    negative or positive and can extend between rows within same refseq
+  ref_ploidy means that offset is normal REF_START
+ */
+
+static
+rc_t CC REFERENCE_TABLE_sub_select( RefTableSubSelect* self, int64_t ref_row_id,
+                                    INSDC_coord_zero offset, INSDC_coord_len ref_len,
+                                    uint32_t ref_ploidy, VRowResult* rslt )
+{
+    rc_t rc = 0;
+    INSDC_coord_len num_read;
+
+    if ( ref_row_id < self->u.ref.start_id || ref_row_id > self->u.ref.stop_id )
+    {
+        /* update cached ref data if ref has changed */
+        const char* n;
+        uint32_t n_len;
+        struct {
+            int64_t start_id;
+            int64_t stop_id;
+        } *out;
+    
+        SUB_DEBUG( ( "SUB.Rd in 'ref-tbl-sub-select.c' (REF) at #%lu offset %lu\n", ref_row_id, offset ) );
+
+        rc = VCursorCellDataDirect( self->curs, ref_row_id, self->u.ref.name_idx, NULL, ( const void** )&n, NULL, &n_len );
+        if ( rc == 0 )
+        {
+            rc = VCursorParamsSet( ( const struct VCursorParams * )(self->curs), "QUERY_SEQ_NAME", "%.*s", n_len, n );
+            if ( rc == 0 )
+            {
+                rc = VCursorCellDataDirect( self->curs, ref_row_id, self->u.ref.name_range_idx, NULL, (const void**)&out, NULL, NULL );
+                if ( rc == 0 )
+                {
+                    if ( self->u.ref.name_len < n_len )
+                    {
+                        void* p = realloc( self->u.ref.name, n_len );
+                        if ( p == NULL )
+                            rc = RC( rcXF, rcFunction, rcSelecting, rcMemory, rcExhausted );
+                        else
+                            self->u.ref.name = ( char* )p;
+                    }
+
+                    if ( rc == 0 )
+                    {
+                        const bool* c;
+                        INSDC_coord_len* sl;
+                        uint32_t* m;
+                        uint32_t cmp_read_len = 0;
+                        int64_t row;
+                        
+                        memmove( self->u.ref.name, n, n_len );
+                        self->u.ref.name_len = n_len;
+                        self->u.ref.start_id = out->start_id;
+                        self->u.ref.stop_id = out->stop_id;
+                        for ( row = out->start_id; row <= out->stop_id && cmp_read_len == 0; ++row )
+                        {
+                            uint32_t tmp_len = 0;
+                            void const *dummy = NULL;
+                            
+                            rc = VCursorCellDataDirect( self->curs, row, self->u.ref.cmp_read_idx, NULL, &dummy, NULL, &tmp_len );
+                            if ( rc != 0 ) break;
+                            cmp_read_len += tmp_len;
+                        }
+
+                        if ( rc == 0 )
+                        {
+                            rc = VCursorCellDataDirect( self->curs, self->u.ref.stop_id, self->u.ref.circular_idx, NULL, (const void**)&c, NULL, NULL );
+                            if ( rc == 0 )
+                            {
+                                rc = VCursorCellDataDirect( self->curs, self->u.ref.stop_id, self->u.ref.seq_len_idx, NULL, (const void**)&sl, NULL, NULL );
+                                if ( rc == 0 )
+                                {
+                                    rc = VCursorCellDataDirect( self->curs, self->u.ref.stop_id, self->u.ref.max_seq_len_idx, NULL, (const void**)&m, NULL, NULL);
+                                    if ( rc == 0 )
+                                    {
+                                        self->u.ref.circular = c[ 0 ] || cmp_read_len != 0;
+                                        self->u.ref.seq_len = m[ 0 ] * (INSDC_coord_len)( self->u.ref.stop_id - self->u.ref.start_id ) + sl[0];
+                                        self->u.ref.max_seq_len = m[ 0 ];
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if ( rc == 0 && ref_ploidy != 0 )
+    {
+        /* convert offset to normal from start of ref relative to current row */
+        offset += self->u.ref.max_seq_len * (INSDC_coord_len)( ref_row_id - self->u.ref.start_id );
+
+        if ( self->u.ref.circular )
+        {
+            /* make offset positive starting from refseq actual start */
+            if ( offset < 0 )
+                offset = self->u.ref.seq_len - ( ( -offset ) % self->u.ref.seq_len );
+            else
+                offset %= self->u.ref.seq_len;
+        }
+        else if ( offset < 0 || offset >= (INSDC_coord_zero)self->u.ref.seq_len )
+            rc = RC( rcXF, rcFunction, rcSelecting, rcData, rcCorrupt );
+
+        ref_row_id = self->u.ref.start_id + offset / self->u.ref.max_seq_len;
+        offset %= self->u.ref.max_seq_len;
+    }
+
+    /* read the data */
+    for ( num_read = 0; rc == 0 && num_read < ref_len && ref_row_id <= self->u.ref.stop_id; offset = 0 )
+    {
+        uint32_t bits;
+        const void* output;
+        uint32_t boff;
+        uint32_t row_len;
+        
+        rc = VCursorCellDataDirect( self->curs, ref_row_id, self->out_idx, &bits, &output, &boff, &row_len );
+        if ( rc == 0 )
+        {
+            /* row_len MUST be > offset */
+            if ( row_len <= (uint32_t)offset )
+                rc = RC(rcXF, rcFunction, rcSelecting, rcData, rcCorrupt);
+            else
+            {
+                row_len -= offset;
+                if ( ref_len < row_len + num_read )
+                    row_len = ref_len - num_read;
+
+                /* copy data */
+                bitcpy( rslt->data->base, rslt->elem_count * bits, output, offset * bits + boff, row_len * bits );
+                rslt->elem_count += row_len;
+                num_read += row_len;
+
+                if ( ++ref_row_id > self->u.ref.stop_id && self->u.ref.circular )
+                    ref_row_id = self->u.ref.start_id;
+            }
+        }
+    }
+
+    /* detect incomplete read */
+    if ( rc == 0 && num_read == 0 )
+        rc = RC( rcXF, rcFunction, rcSelecting, rcTransfer, rcIncomplete );
+
+    return rc;
+}
+
+static
+rc_t CC ALIGN_CMN_TABLE_sub_select(RefTableSubSelect* self, int64_t ref_row_id,
+                                   INSDC_coord_zero offset, INSDC_coord_len ref_len,
+                                   uint32_t ref_ploidy, VRowResult* rslt)
+{
+	rc_t rc=0;
+    INSDC_coord_len num_read = 0;
+    const int64_t* al_ref_id = NULL;
+    int64_t al_ref_id_value;
+    const INSDC_coord_zero* al_ref_start = NULL;
+    
+    SUB_DEBUG( ( "SUB.Rd in 'ref-tbl-sub-select.c' (ALIGN) at #%lu offset %lu\n", ref_row_id, offset ) );
+
+    if ( offset < 0 )
+    {
+        rc = VCursorCellDataDirect( self->curs, ref_row_id, self->u.mod.ref_id_idx, NULL, (void const **)&al_ref_id, NULL, NULL );
+        if ( rc == 0 )
+        {
+            rc = VCursorCellDataDirect( self->curs, ref_row_id, self->u.mod.ref_start_idx, NULL, (void const **)&al_ref_start, NULL, NULL);
+            if ( rc == 0 )
+            {
+                memmove ( &al_ref_id_value, al_ref_id, sizeof *al_ref_id );
+                if ( -offset > (INSDC_coord_zero)ref_len )
+                {
+                    /* requested chunk is to the left and is not using allele data */
+                    rc = RC( rcXF, rcFunction, rcSelecting, rcData, rcCorrupt );
+                }
+                else
+                {
+                    rc = self->u.mod.parent->func( self->u.mod.parent, al_ref_id_value, offset + al_ref_start[0],
+                                                    -offset, ref_ploidy, rslt );
+                    if ( rc == 0 )
+                    {
+                        /* read left portion of underlying reference */
+                        num_read += (INSDC_coord_len)rslt->elem_count;
+                        offset = 0;
+                    }
+                }
+            }
+        }
+    }
+
+    if ( rc == 0 && num_read < ref_len )
+    {
+        /* copy self */
+        void const* output;
+        uint32_t bits, boff, rs_len, rl_len;
+        const INSDC_coord_zero* rs;
+        const INSDC_coord_len* rl;
+        
+        rc = VCursorCellDataDirect( self->curs, ref_row_id, self->out_idx, &bits, &output, &boff, NULL );
+        if ( rc == 0 )
+        {
+            rc = VCursorCellDataDirect( self->curs, ref_row_id, self->u.mod.read_start_idx, NULL, (void const **)&rs, NULL, &rs_len );
+            if ( rc == 0 )
+            {
+                rc = VCursorCellDataDirect( self->curs, ref_row_id, self->u.mod.read_len_idx, NULL, (void const **)&rl, NULL, &rl_len );
+                if ( rc == 0 )
+                {
+                    assert( rs_len == rl_len );
+                    assert( ref_ploidy > 0 && ref_ploidy <= rl_len );
+                    if ( offset > (INSDC_coord_zero)rl[ ref_ploidy - 1 ] )
+                    {
+                        /* requested chunk starts beyond allele */
+                        rc = RC( rcXF, rcFunction, rcSelecting, rcData, rcCorrupt );
+                    }
+                    else
+                    {
+                        INSDC_coord_len left = ref_len - num_read;
+                        if ( ( rl[ ref_ploidy - 1 ] - offset ) < left )
+                        {
+                            left = rl[ ref_ploidy - 1 ] - offset;
+                        }
+                        bitcpy( rslt->data->base, rslt->elem_count * bits, output, ( rs[ref_ploidy - 1] + offset ) * bits + boff, left * bits );
+                        num_read += left;
+                        rslt->elem_count += left;
+                    }
+                }
+            }
+        }
+    }
+
+    if ( rc == 0 && num_read < ref_len )
+    {
+        const INSDC_coord_len* al_ref_len;
+        /* copy right portion of underlying reference */
+        if ( al_ref_id == NULL || al_ref_start == NULL )
+        {
+            rc = VCursorCellDataDirect( self->curs, ref_row_id, self->u.mod.ref_id_idx, NULL, (void const **)&al_ref_id, NULL, NULL );
+            if ( rc == 0 )
+                rc = VCursorCellDataDirect( self->curs, ref_row_id, self->u.mod.ref_start_idx, NULL, (void const **)&al_ref_start, NULL, NULL );
+        }
+
+        if ( rc == 0 )
+            rc = VCursorCellDataDirect( self->curs, ref_row_id, self->u.mod.ref_len_idx, NULL, (void const **)&al_ref_len, NULL, NULL );
+
+        memmove ( & al_ref_id_value, al_ref_id, sizeof *al_ref_id );
+        if ( rc == 0 )
+            rc = self->u.mod.parent->func( self->u.mod.parent, al_ref_id_value, al_ref_start[0] + al_ref_len[0],
+                                            ref_len - num_read, ref_ploidy, rslt );
+
+    }
+    return rc;
+}
+
+
+static
+void CC RefTableSubSelect_Whack ( void *obj )
+{
+    if ( obj != NULL )
+    {
+        RefTableSubSelect* self = ( RefTableSubSelect* )obj;
+        VCursorRelease( self->curs );
+        if ( self->func != REFERENCE_TABLE_sub_select )
+        {
+            RefTableSubSelect_Whack( self->u.mod.parent );
+        }
+        else
+        {
+            free( self->u.ref.name );
+        }
+        free( self );
+    }
+}
+
+/* normal way to do it */
+#define IS_ADDED(c, i, n) ((rc = VCursorAddColumn(c, i, "%s", n)) == 0 || \
+                           (GetRCObject(rc) == (enum RCObject)rcColumn && GetRCState(rc) == rcExists))
+
+static
+rc_t RefTableSubSelect_Make( RefTableSubSelect **objp, const VTable *tbl, const VCursor *native_curs, const char* out_col_name )
+{
+    rc_t rc;
+
+    /* create the object */
+    RefTableSubSelect* obj = ( RefTableSubSelect* )calloc( 1, sizeof( *obj ) );
+    if ( obj == NULL )
+    {
+        rc = RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        const VTable *reftbl = NULL;
+
+        SUB_DEBUG( ( "SUB.Make in 'ref-tbl-sub-select.c' col=%s\n", out_col_name ) );
+
+        /* open the reference table cursor*/
+        rc = AlignRefTableCursor( tbl, native_curs, &obj->curs, &reftbl );
+        if ( rc == 0 )
+        {
+            /* add columns to cursor */
+            if ( IS_ADDED( obj->curs, &obj->u.ref.circular_idx, "CIRCULAR" ) )
+            {
+                /* normal REFERENCE table */
+                if ( IS_ADDED( obj->curs, &obj->u.ref.name_idx, "(utf8)NAME" ) )
+                {
+                    if ( IS_ADDED( obj->curs, &obj->u.ref.name_range_idx, "NAME_RANGE" ) )
+                    {
+                        if ( IS_ADDED( obj->curs, &obj->u.ref.seq_len_idx, "SEQ_LEN" ) )
+                        {
+                            if ( IS_ADDED( obj->curs, &obj->u.ref.max_seq_len_idx, "MAX_SEQ_LEN" ) )
+                            {
+                                if ( IS_ADDED( obj->curs, &obj->u.ref.cmp_read_idx, "CMP_READ" ) )
+                                {
+                                    obj->func = REFERENCE_TABLE_sub_select;
+                                    rc = 0;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            else if ( GetRCObject( rc ) == ( enum RCObject )rcColumn && GetRCState( rc ) == rcNotFound )
+            {
+                /* try as align_cmn */
+                rc = RefTableSubSelect_Make( &obj->u.mod.parent, reftbl, native_curs, out_col_name );
+                if ( rc == 0 )
+                {
+                    if ( IS_ADDED( obj->curs, &obj->u.mod.ref_id_idx, "REF_ID" ) )
+                    {
+                        if ( IS_ADDED( obj->curs, &obj->u.mod.ref_start_idx, "REF_START" ) )
+                        {
+                            if ( IS_ADDED( obj->curs, &obj->u.mod.ref_len_idx, "REF_LEN" ) )
+                            {
+                                if ( IS_ADDED( obj->curs, &obj->u.mod.read_start_idx, "READ_START" ) )
+                                {
+                                    if ( IS_ADDED( obj->curs, &obj->u.mod.read_len_idx, "READ_LEN" ) )
+                                    {
+                                        obj->func = ALIGN_CMN_TABLE_sub_select;
+                                        rc = 0;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            if ( rc == 0 )
+            {
+                if ( IS_ADDED( obj->curs, &obj->out_idx,  out_col_name ) )
+                    rc = 0;
+            }
+
+            if ( rc == 0 )
+            {
+                *objp = obj;
+                VTableRelease( reftbl );
+                return 0;
+            }
+
+            VCursorRelease( obj->curs );
+        }
+        VTableRelease( reftbl );
+        free( obj );
+    }
+    return rc;
+}
+
+static
+rc_t CC reftbl_sub_select ( void *data, const VXformInfo *info,
+                            int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData argv[] )
+{
+    rc_t rc;
+    RefTableSubSelect* self = ( RefTableSubSelect* )data;
+    const int64_t* ref_id = ( const int64_t* )argv[ 0 ].u.data.base;
+    const INSDC_coord_zero* ref_start = ( const INSDC_coord_zero* )argv[ 1 ].u.data.base;
+    const INSDC_coord_len* ref_len = ( const INSDC_coord_len* )argv[ 2 ].u.data.base;
+    const uint32_t* ref_ploidy = NULL;
+    
+    if ( argc > 3 )
+    {
+        ref_ploidy = ( const uint32_t* )argv[ 3 ].u.data.base;
+        ref_ploidy += argv[3].u.data.first_elem;
+        assert( argv[ 3 ].u.data.elem_bits == sizeof( *ref_ploidy ) * 8 );
+    }
+    assert( argv[ 0 ].u.data.elem_bits == sizeof( *ref_id ) * 8 );
+    assert( argv[ 1 ].u.data.elem_bits == sizeof( *ref_start ) * 8 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( *ref_len ) * 8 );
+
+    ref_id += argv[ 0 ].u.data.first_elem;
+    ref_start += argv[ 1 ].u.data.first_elem;
+    ref_len += argv[ 2 ].u.data.first_elem;
+
+    /* get the memory for output row */
+    rslt->data->elem_bits = rslt->elem_bits;
+    rc = KDataBufferResize( rslt->data, ref_len[ 0 ] );
+    if ( rc == 0 )
+    {
+        /* must set it to 0 here - functions above accumulate */
+        rslt->elem_count = 0;
+        if ( ref_len[ 0 ] > 0 )
+        {
+            int64_t ref_id_val;
+            memmove( &ref_id_val, ref_id, sizeof ref_id_val );
+            rc = self->func( self, ref_id_val, ref_start[ 0 ], ref_len[ 0 ], ref_ploidy ? ref_ploidy[ 0 ] : 0, rslt );
+        }
+    }
+
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( ALIGN_ref_sub_select, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    RefTableSubSelect *fself;
+    rc_t rc = RefTableSubSelect_Make( &fself, info -> tbl, ( const VCursor* )info->parms, "(INSDC:4na:bin)READ" );
+    if ( rc == 0 )
+    {
+        rslt -> self = fself;
+        rslt -> whack = RefTableSubSelect_Whack;
+        rslt -> u . ndf = reftbl_sub_select;
+        rslt -> variant = vftRow;
+    }
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_align_ref_sub_select_preserve_qual, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+                                                   VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    RefTableSubSelect *fself;
+    rc_t rc = RefTableSubSelect_Make( & fself, info -> tbl, (const VCursor*)info->parms , "(bool)PRESERVE_QUAL" );
+    if ( rc == 0 )
+    {
+        rslt -> self = fself;
+        rslt -> whack = RefTableSubSelect_Whack;
+        rslt -> u . ndf = reftbl_sub_select;
+        rslt -> variant = vftRow;
+    }
+    return rc;
+}
diff --git a/libs/axf/ref-tbl.c b/libs/axf/ref-tbl.c
new file mode 100644
index 0000000..50de0a8
--- /dev/null
+++ b/libs/axf/ref-tbl.c
@@ -0,0 +1,106 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+#include <vdb/cursor.h>
+#include <kdb/meta.h>
+#include <klib/rc.h>
+
+#include "ref-tbl.h"
+#include <string.h>
+
+rc_t AlignRefTableCursor( const VTable* table, const VCursor *native_curs,
+                          const VCursor** ref_cursor,const VTable **reftbl )
+{
+	rc_t rc = 0;
+	char ref_tbl_name[ 512 ] = "REFERENCE";
+	const KMetadata * meta;
+	const VCursor * curs;
+
+    rc = VTableOpenMetadataRead( table, &meta );
+	if ( rc == 0 )
+    {
+	    const KMDataNode* node;
+        rc = KMetadataOpenNodeRead( meta, &node, "CONFIG/REF_TABLE" );
+        if ( rc == 0 )
+        {
+            size_t sz;
+            rc = KMDataNodeReadCString( node, ref_tbl_name, sizeof( ref_tbl_name ), &sz );
+            ref_tbl_name[ sz ] = '\0';
+            KMDataNodeRelease( node );
+        }
+        KMetadataRelease( meta );
+    }
+
+	rc = VCursorLinkedCursorGet( native_curs,ref_tbl_name,&curs );
+	if ( rc != 0 )
+    {
+		const VDatabase *db;
+        const VTable *tbl;
+
+        /* get at the parent database */
+        rc = VTableOpenParentRead ( table, & db );
+        if ( rc != 0 )
+            return rc;
+
+        /* open the table */
+        rc = VDatabaseOpenTableRead ( db, &tbl, "%s", ref_tbl_name );
+        VDatabaseRelease ( db );
+        if ( rc != 0 )
+            return rc;
+
+        /* create a cursor */
+        rc = VTableCreateCachedCursorRead( tbl, &curs, 1024*1024*1024 );
+		if ( reftbl != NULL )
+        {
+			*reftbl = tbl;
+        }
+        else
+        {
+			VTableRelease( tbl );
+		}
+        if ( rc != 0 )
+            return rc;
+
+        rc = VCursorPermitPostOpenAdd( curs );
+        if ( rc != 0 )
+            return rc;
+
+        rc = VCursorOpen( curs );
+        if ( rc != 0 )
+            return rc;
+
+        if ( native_curs != NULL )
+            rc = VCursorLinkedCursorSet( native_curs, ref_tbl_name, curs );
+        if ( rc != 0 )
+            return rc;
+
+	}
+	*ref_cursor = curs;
+
+	return 0;
+}
diff --git a/libs/axf/ref-tbl.h b/libs/axf/ref-tbl.h
new file mode 100644
index 0000000..24cbf80
--- /dev/null
+++ b/libs/axf/ref-tbl.h
@@ -0,0 +1,32 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_axf_ref_tbl_
+#define _h_axf_ref_tbl_
+
+/* Caller must release ref_cursor */
+rc_t AlignRefTableCursor(const VTable* table, const VCursor *native_curs, const VCursor** ref_cursor, const VTable **reftbl);
+
+#endif /* _h_axf_ref_tbl_ */
diff --git a/libs/axf/refseq-stats.c b/libs/axf/refseq-stats.c
new file mode 100644
index 0000000..b181a78
--- /dev/null
+++ b/libs/axf/refseq-stats.c
@@ -0,0 +1,205 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/checksum.h>
+#include <kdb/meta.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+typedef struct refseq_meta_stats_data_struct {
+    uint64_t total_seq_len;
+    uint32_t crc32;
+    MD5State md5;
+    KMDataNode* stats;
+    uint64_t buf_sz;
+    char* buf;
+} refseq_meta_stats_data;
+
+
+static
+void CC refseq_meta_stats_whack( void* self )
+{
+    if( self != NULL ) {
+        refseq_meta_stats_data* data = self;
+        KMDataNodeRelease(data->stats);
+        free(data->buf);
+        free(data);
+    }
+}
+
+static
+rc_t CC refseq_meta_stats( void *self, const VXformInfo *info, int64_t row_id,
+                           VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc = 0;
+    KMDataNode* node;
+    refseq_meta_stats_data* data = self;
+    uint64_t i, seq_len = argv[ 0 ].u.data.elem_count;
+    const INSDC_4na_bin * seq = argv[ 0 ].u.data.base;
+
+    uint64_t read_len = seq_len;
+   
+    seq +=  argv[0].u.data.first_elem;
+
+    if ( argc > 1 )
+    {
+        const INSDC_coord_len * read_len_ptr = argv [ 1 ] . u . data . base;
+        read_len_ptr += argv [ 1 ] . u . data . first_elem;
+        read_len = * read_len_ptr;
+    }
+
+    assert( data != NULL );
+
+    assert ( seq_len <= read_len );
+
+    if ( data->buf_sz < read_len )
+    {
+        char * x = realloc( data->buf, ( size_t )read_len );
+        if ( x == NULL )
+        {
+            rc = RC( rcVDB, rcFunction, rcUpdating, rcMemory, rcExhausted );
+        }
+        else
+        {
+            data->buf = x;
+            data->buf_sz = read_len;
+        }
+    }
+
+    for ( i = 0; rc == 0 && i < seq_len; ++ i )
+    {
+        data->buf[ i ] = INSDC_4na_map_CHARSET[ seq[ i ] ];
+    }
+
+    for ( ; rc == 0 && i < read_len; ++ i )
+    {
+        data->buf[ i ] = 'N';
+    }
+
+    if ( rc == 0 )
+    {
+        rc = KMDataNodeOpenNodeUpdate( data->stats, &node, "TOTAL_SEQ_LEN" );
+        if ( rc == 0 )
+        {
+            if ( data->total_seq_len + read_len < data->total_seq_len )
+            {
+                rc = RC( rcVDB, rcFunction, rcUpdating, rcMetadata, rcOutofrange );
+            }
+            else
+            {
+                data->total_seq_len += read_len;
+                rc = KMDataNodeWriteB64( node, &data->total_seq_len );
+            }
+            KMDataNodeRelease( node );
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        rc = KMDataNodeOpenNodeUpdate( data->stats, &node, "CRC32" );
+        if ( rc == 0 )
+        {
+            data->crc32 = CRC32( data->crc32, data->buf, ( size_t )read_len );
+            rc = KMDataNodeWriteB32( node, &data->crc32 );
+            KMDataNodeRelease( node );
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        rc = KMDataNodeOpenNodeUpdate( data->stats, &node, "MD5" );
+        if ( rc == 0 )
+        {
+            uint8_t digest[ 16 ];
+            MD5State md5;
+            MD5StateAppend( &data->md5, data->buf, ( size_t )read_len );
+            memmove( &md5, &data->md5, sizeof( md5 ) );
+            MD5StateFinish( &md5, digest );
+            rc = KMDataNodeWrite( node, digest, sizeof( digest ) );
+            KMDataNodeRelease( node );
+        }
+    }
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( NCBI_refSeq_stats, 2, 0, 0 ) ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+                                                 const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+
+    if ( dp->argc < 1 )
+    {
+        rc = RC( rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid );
+    }
+    else
+    {
+        refseq_meta_stats_data * data;
+        data = calloc( 1, sizeof( refseq_meta_stats_data ) );
+        if ( data == NULL )
+        {
+            rc = RC( rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted );
+        }
+        else
+        {
+            KMetadata *meta;
+            rc = VTableOpenMetadataUpdate( ( VTable* )info->tbl, &meta );
+            if ( rc == 0 )
+            {
+                rc = KMetadataOpenNodeUpdate( meta, &data->stats, "STATS" );
+                KMetadataRelease( meta );
+            }
+
+            if ( rc == 0 )
+            {
+                rslt->self = data;
+                rslt->whack = refseq_meta_stats_whack;
+                rslt->variant = vftNonDetRow;
+                rslt->u.rf = refseq_meta_stats;
+                data->crc32 = 0;
+                CRC32Init();
+                MD5StateInit( &data->md5 );
+            }
+            else
+            {
+                refseq_meta_stats_whack( data );
+            }
+        }
+    }
+    return rc;
+}
diff --git a/libs/axf/seq-construct-read.c b/libs/axf/seq-construct-read.c
new file mode 100644
index 0000000..768cb79
--- /dev/null
+++ b/libs/axf/seq-construct-read.c
@@ -0,0 +1,125 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <insdc/insdc.h>
+#include <align/refseq-mgr.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <insdc/sra.h>
+
+
+static
+rc_t CC seq_construct_read ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint8_t *dst;
+
+    /* base pointers to input data */
+    const uint8_t *aligned = argv [ 0 ] . u . data . base;
+    const INSDC_coord_len *aligned_len = argv [ 1 ] . u . data . base;
+    const uint8_t *unaligned = argv [ 2 ] . u . data . base;
+    const INSDC_coord_len *unaligned_len = argv [ 3 ] . u . data . base;
+
+    /* the number of reads */
+    uint32_t i, seqlen, aligned_seqlen, unaligned_seqlen;
+    uint32_t nreads = (uint32_t)argv [ 1 ] . u . data . elem_count;
+
+    /* require the same dimension for both inputs */
+    if ( argv [ 1 ] . u . data . elem_count != argv [ 3 ] . u . data . elem_count )
+        return RC ( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+
+    /* offset base pointers to start of row */
+    aligned += argv [ 0 ] . u . data . first_elem;
+    aligned_len += argv [ 1 ] . u . data . first_elem;
+    unaligned += argv [ 2 ] . u . data . first_elem;
+    unaligned_len += argv [ 3 ] . u . data . first_elem;
+
+    /* calculate new sequence length */
+    for ( i = seqlen = 0; i < nreads; ++ i )
+        seqlen += unaligned_len [ i ] != 0 ? unaligned_len [ i ] : aligned_len [ i ];
+
+    /* set output buffer size */
+    rslt -> data -> elem_bits = 8;
+    rc = KDataBufferResize ( rslt -> data, seqlen );
+    if ( rc != 0 )
+        return rc;
+
+    /* produce final sequence */
+    for ( dst = rslt -> data -> base, i = seqlen = aligned_seqlen = unaligned_seqlen = 0; i < nreads; ++ i )
+    {
+        /* give preference to unaligned */
+        if ( unaligned_len [ i ] != 0 )
+        {
+            memmove ( & dst [ seqlen ], & unaligned [ unaligned_seqlen ], unaligned_len [ i ] );
+            seqlen += unaligned_len [ i ];
+        }
+        else
+        {
+            memmove ( & dst [ seqlen ], & aligned [ aligned_seqlen ], aligned_len [ i ] );
+            seqlen += aligned_len [ i ];
+        }
+
+        aligned_seqlen += aligned_len [ i ];
+        unaligned_seqlen += unaligned_len [ i ];
+    }
+
+    rslt -> elem_count = seqlen;
+
+    return 0;
+}
+
+/* 
+ * function < type T >
+ * T NCBI:align:seq_construct_read #1 (T     read, INSDC:coord:len     read_len,
+ *                                     T cmp_read, INSDC:coord:len cmp_read_len);
+ */
+VTRANSFACT_IMPL ( NCBI_align_seq_construct_read, 1, 0, 0 )
+    ( const void *Self, const VXfactInfo *info,
+      VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    if (info->fdesc.desc.intrinsic_bits * info->fdesc.desc.intrinsic_dim != 8)
+        return RC(rcAlign, rcFunction, rcConstructing, rcType, rcIncorrect);
+    rslt->u.ndf = seq_construct_read;
+    rslt->variant = vftRow;
+    return 0;
+}
diff --git a/libs/axf/seq-restore-linkage-group.c b/libs/axf/seq-restore-linkage-group.c
new file mode 100644
index 0000000..4d76e6e
--- /dev/null
+++ b/libs/axf/seq-restore-linkage-group.c
@@ -0,0 +1,186 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+
+#include <kdb/meta.h>
+
+#include <insdc/insdc.h>
+#include <insdc/sra.h>
+
+#include <align/refseq-mgr.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+#include <klib/time.h>
+#include <klib/vector.h>
+#include <klib/data-buffer.h>
+#include <klib/sort.h>
+
+#include <vdb/vdb-priv.h>
+
+#include <bitstr.h>
+#include <sysalloc.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifdef _DEBUGGING
+#define SUB_DEBUG(msg) DBGMSG(DBG_SRA,DBG_FLAG(DBG_SRA_SUB),msg)
+#else
+#define SUB_DEBUG(msg)
+#endif
+
+typedef struct Restorer Restorer;
+struct Restorer
+{
+    const VCursor *curs;
+    uint32_t colId;
+};
+
+static
+void CC restorerWhack(void *const obj)
+{
+    if (obj != NULL) {
+        Restorer const *const self = obj;
+        VCursorRelease(self->curs);
+    }
+    free(obj);
+}
+
+static
+rc_t CC seqRestoreLinkageGroup(void *const Self,
+                               VXformInfo const *const info,
+                               int64_t const row_id,
+                               VRowResult *const rslt,
+                               uint32_t argc, VRowData const argv[/* argc */])
+{
+    Restorer const *const self = (Restorer const *)Self;
+    int64_t const *const alignId = &((int64_t const *)argv[1].u.data.base)[argv[1].u.data.first_elem];
+    unsigned const n = (unsigned)argv[1].u.data.elem_count;
+    char const *const linkageGroup = &((char const *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    unsigned const linkageGroupLen = (unsigned)argv[0].u.data.elem_count;
+    int64_t foreignKey = 0;
+    unsigned i;
+
+    assert(argv[0].u.data.elem_bits == 8 * sizeof(linkageGroup[0]));
+    assert(argv[1].u.data.elem_bits == 8 * sizeof(alignId[0]));
+
+    rslt->data->elem_bits = 8;
+    for (i = 0; i < n && foreignKey == 0; ++i) {
+        foreignKey = alignId[i];
+    }
+    if (foreignKey == 0) {
+        rc_t const rc = KDataBufferResize(rslt->data, linkageGroupLen);
+        rslt->elem_count = linkageGroupLen;
+        if (rc == 0)
+            memmove(rslt->data->base, linkageGroup, linkageGroupLen);
+        return rc;
+    }
+    else {
+        void const *linkageGroup = NULL;
+        uint32_t linkageGroupLen = 0;
+        uint32_t elem_size = 0;
+        uint32_t offset = 0;
+        rc_t const rc = VCursorCellDataDirect(self->curs, foreignKey, self->colId, &elem_size, &linkageGroup, &offset, &linkageGroupLen);
+
+        if (rc == 0) {
+            rc_t const rc = KDataBufferResize(rslt->data, linkageGroupLen);
+            assert(elem_size == rslt->data->elem_bits);
+            assert(offset == 0);
+            rslt->elem_count = linkageGroupLen;
+            if (rc == 0)
+                memmove(rslt->data->base, linkageGroup, linkageGroupLen);
+            return rc;
+        }
+        return rc;
+    }
+}
+
+
+/* 
+ * function
+   ascii NCBI:align:seq_restore_linkage_group #1 ( ascii cmp_linkage_group,
+                                                   I64 align_id )
+
+ */
+VTRANSFACT_IMPL ( ALIGN_seq_restore_linkage_group, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+                                                     VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    VCursor const *const nativeCurs = (VCursor const *)info->parms;
+
+    VCursor const *myCurs = NULL;
+    uint32_t colId = 0;
+
+    rc_t rc = VCursorLinkedCursorGet(nativeCurs, "PRIMARY_ALIGNMENT", &myCurs);
+    if (GetRCObject(rc) == rcName && GetRCState(rc) == rcNotFound) {
+        VTable const *tbl = NULL;
+        VDatabase const *db = NULL;
+
+        rc = VTableOpenParentRead(info->tbl, &db);
+        assert(rc == 0 && db != NULL);
+        if (rc != 0 || db == NULL) abort();
+
+        rc = VDatabaseOpenTableRead(db, &tbl, "PRIMARY_ALIGNMENT");
+        VDatabaseRelease(db);
+        if (rc == 0) {
+            rc = VTableCreateCachedCursorRead(tbl, &myCurs, 32UL * 1024UL * 1024UL);
+            VTableRelease(tbl);
+        }
+        if (rc == 0)
+            rc = VCursorLinkedCursorSet(nativeCurs, "PRIMARY_ALIGNMENT", myCurs);
+    }
+    if (rc == 0) {
+        rc = VCursorAddColumn(myCurs, &colId, "LINKAGE_GROUP");
+        if (GetRCState(rc) == rcExists)
+            rc = 0;
+        if (rc == 0)
+            rc = VCursorOpen(myCurs);
+    }
+    if (rc == 0)
+    {
+        Restorer *fself = malloc(sizeof(*fself));
+
+        assert(fself);
+        if (fself == NULL) abort();
+
+        fself->curs = myCurs;
+        fself->colId = colId;
+
+        rslt->self = fself;
+        rslt->u.ndf = seqRestoreLinkageGroup;
+        rslt->variant = vftRow;
+        rslt->whack = restorerWhack;
+    }
+    return rc;
+}
diff --git a/libs/axf/seq-restore-read.c b/libs/axf/seq-restore-read.c
new file mode 100644
index 0000000..f077502
--- /dev/null
+++ b/libs/axf/seq-restore-read.c
@@ -0,0 +1,749 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+
+#include <kdb/meta.h>
+
+#include <insdc/insdc.h>
+#include <insdc/sra.h>
+
+#include <align/refseq-mgr.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+#include <klib/time.h>
+#include <klib/vector.h>
+#include <klib/data-buffer.h>
+#include <klib/sort.h>
+
+#include <vdb/vdb-priv.h>
+
+#include <bitstr.h>
+#include <sysalloc.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifdef _DEBUGGING
+#define SUB_DEBUG(msg) DBGMSG(DBG_SRA,DBG_FLAG(DBG_SRA_SUB),msg)
+#else
+#define SUB_DEBUG(msg)
+#endif
+
+/**********************************
+VERSION     effect
+
+1           in case of random-joins oscillation memory usage
+            prefetch of align-id's in the cursor-cache
+                                                                
+2           in case of random-joins steady memroy usage
+            prefetch of align-id's in dedicated cache
+
+**********************************/
+#define READ_RESTORER_VERSION 2
+#define ROW_ID_INC_COUNT 100
+
+#if READ_RESTORER_VERSION == 2
+
+/* --------------------------- id_list --------------------------- */
+
+
+typedef struct id_list
+{
+    int64_t * list;
+    uint32_t count;
+} id_list;
+
+
+static bool sort_align_ids( const id_list * src, id_list * dst )
+{
+    bool res;
+    dst -> count = 0;
+    dst -> list = malloc( src -> count * sizeof( dst -> list[ 0 ] ) );
+    res = ( dst -> list != NULL );
+    if ( res )
+    {
+        uint32_t i;
+        /* filter out the zero id's */
+        for( i = 0; i < src -> count; i++ )
+        {
+            if ( src -> list[ i ] > 0 )
+                dst -> list[ dst -> count ++ ] = src -> list[ i ];
+        }
+        /* now we can sort */
+        if ( dst -> count > 0 )
+            ksort_int64_t( dst -> list, dst -> count );
+    }
+    return res;
+}
+
+
+/* --------------------------- rr_entry --------------------------- */
+
+typedef struct rr_entry
+{
+    uint32_t read_len;
+    INSDC_4na_bin read[ 1 ];
+} rr_entry;
+
+
+static rc_t rr_entry_release ( uint64_t key, const void * item, void * data )
+{
+    if ( item != NULL )
+        free( ( void * ) item );
+    return 0;
+}
+
+static bool rr_entry_make ( rr_entry ** entry, const INSDC_4na_bin * read, uint32_t read_len )
+{
+    bool res = ( entry != NULL && read != NULL );
+    if ( res )
+    {
+        rr_entry * obj = malloc ( ( sizeof * obj ) + read_len - 1 );
+        res = ( obj != NULL );
+        if ( res )
+        {
+            obj -> read_len = read_len;
+            memmove( &( obj -> read[ 0 ] ), read, read_len );
+            *entry = obj;
+        }
+    }
+    return res;
+}
+
+
+/* --------------------------- rr_store --------------------------- */
+
+typedef struct rr_store
+{
+    KVector * v;
+    int64_t first_seq_row_id;
+    int64_t last_seq_row_id;
+} rr_store;
+
+
+static void rr_store_release ( rr_store * rr )
+{
+    if ( rr != NULL )
+    {
+        KVectorVisitPtr( rr->v, false, rr_entry_release, NULL );        
+        KVectorRelease ( rr->v );
+        free( ( void * ) rr );
+    }
+}
+
+static rc_t rr_store_make ( rr_store ** rr )
+{
+    rc_t rc;
+    if ( rr == NULL )
+        rc = RC ( rcXF, rcFunction, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        KVector * v;
+        *rr = NULL;
+        rc = KVectorMake ( &v );
+        if ( rc == 0 )
+        {
+            rr_store * obj = malloc ( sizeof * obj );
+            if ( obj == NULL )
+            {
+                KVectorRelease ( v );
+                rc = RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                obj -> v = v;
+                *rr = obj;
+            }
+        }
+    }
+    return rc;
+}
+
+
+static bool rr_store_alignment( rr_store * rr, int64_t align_id, const VCursor * curs, uint32_t read_idx )
+{
+    bool res = false;
+    const INSDC_4na_bin * read = NULL;
+    uint32_t read_len;
+    rc_t rc = VCursorCellDataDirect( curs, align_id, read_idx, NULL, ( const void** ) &read, NULL, &read_len );
+    if ( rc == 0 )
+    {
+        rr_entry * entry;
+        res = rr_entry_make ( &entry, read, read_len );
+        if ( res )
+        {
+            uint64_t key = ( uint64_t ) align_id;
+            res = ( KVectorSetPtr ( rr -> v, key, entry ) == 0 );
+            if ( !res )
+                rr_entry_release( key, entry, NULL );
+        }
+    }
+    return res;
+}
+
+
+static bool rr_fill_cache( rr_store ** rr, const id_list * ids, const VCursor * curs, uint32_t read_idx,
+    int64_t row_id, int64_t last_row_id )
+{
+    bool res = ( rr_store_make ( rr ) == 0 );
+    if ( res )
+    {
+        id_list sorted;
+        res = sort_align_ids( ids, &sorted );
+        if ( res )
+        {
+            uint32_t i;
+            
+            rr_store * r = * rr;
+            for( i = 0; i < sorted . count; i++ )
+                rr_store_alignment( r, sorted . list[ i ], curs, read_idx );
+            free( ( void * ) sorted . list );
+            
+            r -> first_seq_row_id = row_id;
+            r -> last_seq_row_id = last_row_id;
+        }
+    }
+    return res;
+}
+
+
+static bool rr_get_read ( rr_store * rr, int64_t align_id, rr_entry ** entry )
+{
+    uint64_t key = ( uint64_t ) align_id;
+    bool res = ( KVectorGetPtr ( rr -> v, key, ( void ** )entry ) == 0 );
+    if ( res && ( *entry == NULL ) ) res = false;
+    return res;
+}
+
+#endif
+
+/* ---------------------------------------------------------------- */
+
+typedef struct Read_Restorer Read_Restorer;
+struct Read_Restorer
+{
+    const VCursor *curs;
+    uint32_t read_idx;
+    
+    int64_t  last_row_id;
+    int64_t  first_sequential_row_id;
+    int64_t  prefetch_start_id;
+    int64_t  prefetch_stop_id;
+
+#if READ_RESTORER_VERSION == 2
+    uint32_t row_id_increments;     /* count how often we have an increment of the row_id */
+    rr_store * read_store;          /* if NULL we are not caching... */
+#endif
+};
+
+static
+void CC Read_Restorer_Whack ( void *obj )
+{
+    Read_Restorer * self = obj;
+    if ( self != NULL )
+    {
+        VCursorRelease ( self -> curs );
+#if READ_RESTORER_VERSION == 2
+        rr_store_release ( self -> read_store );
+#endif
+        free ( self );
+    }
+}
+
+
+static
+rc_t open_RR_cursor( Read_Restorer * obj, const VTable *tbl, const VCursor* native_curs, const char * tablename )
+{
+    rc_t rc = VCursorLinkedCursorGet( native_curs, tablename, &obj->curs );
+    if ( rc != 0 )
+    {
+        /* get at the parent database */
+        const VDatabase *db;
+        rc = VTableOpenParentRead ( tbl, & db );
+        if ( rc == 0 )
+        {
+            const VTable *patbl;
+            /* open the primary alignment table */
+            rc = VDatabaseOpenTableRead ( db, & patbl, tablename );
+            VDatabaseRelease ( db );
+            if ( rc == 0 )
+            {
+                /* create a cursor */
+                rc = VTableCreateCachedCursorRead( patbl, &obj->curs, 32*1024*1024UL );
+                /* rc = VTableCreateCursorRead( patbl, &obj->curs ); */
+                VTableRelease ( patbl );
+                if ( rc == 0 )
+                {
+                    /* add columns to cursor */
+                    rc = VCursorAddColumn ( obj -> curs, & obj -> read_idx, "( INSDC:4na:bin ) READ" );
+                    if ( rc == 0 )
+                    {
+                        rc = VCursorOpen ( obj -> curs );
+                        if ( rc == 0 )
+                            rc = VCursorLinkedCursorSet( native_curs, tablename, obj->curs );
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+static
+rc_t Read_Restorer_Make( Read_Restorer **objp, const VTable *tbl, const VCursor* native_curs )
+{
+    rc_t rc;
+
+    /* create the object */
+    Read_Restorer *obj = malloc ( sizeof * obj );
+    if ( obj == NULL )
+    {
+        *objp = NULL;
+        rc = RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        memset( obj, 0, sizeof * obj );
+        rc = open_RR_cursor( obj, tbl, native_curs, "PRIMARY_ALIGNMENT" );
+        if ( rc == 0 )
+        {
+#if READ_RESTORER_VERSION == 2
+            /* - we have no cache to begin with ( obj->read_store is NULL because of memset above )
+               - we make one if sequential access is detected */
+#endif
+            if ( rc == 0 )
+            {
+                SUB_DEBUG( ( "SUB.Make in 'seq-restore-read.c'\n" ) );
+                * objp = obj;
+            }
+        }
+        if ( rc != 0 )
+            free( obj );
+    }
+    return rc;
+}
+
+
+static INSDC_4na_bin  map[]={
+/*0  0000 - 0000*/ 0,
+/*1  0001 - 1000*/ 8,
+/*2  0010 - 0100*/ 4,
+/*3  0011 - 1100*/ 12,
+/*4  0100 - 0010*/ 2,
+/*5  0101 - 1010*/ 10,
+/*  0110 - 0110*/ 6,
+/*7  0111 - 1110*/ 14,
+/*8  1000 - 0001*/ 1,
+/*9  1001 - 1001*/ 9,
+/*10  1010 - 0101*/ 5,
+/*11  1011 - 1101*/ 13,
+/*12  1100 - 0011*/ 3,
+/*13  1101 - 1011*/ 11,
+/*14  1110 - 0111*/ 7,
+/*15  1111 - 1111*/ 15
+};
+
+#if READ_RESTORER_VERSION == 2
+
+
+/* caching strategy for READ_RESTORER_VERSION_2 */
+static void handle_caching( Read_Restorer * self, id_list * ids, int64_t row_id, int64_t last_row_id )
+{
+    bool is_sequential = ( self -> read_store != NULL );
+    if ( is_sequential )
+    {
+        /* we are in sequential mode, because we have a cache,
+           check if we still are in sequential mode, decrement the age of the cache */
+        bool is_in_cache = ( ( row_id >= self -> read_store -> first_seq_row_id ) &&
+                             ( row_id <= self -> read_store -> last_seq_row_id ) );
+        if ( !is_in_cache )
+        {
+            is_sequential = ( row_id == self -> read_store -> last_seq_row_id + 1 );
+            
+            /* blow away the cache no matter if we are sequential or not */
+            rr_store_release ( self -> read_store );
+            self -> read_store = NULL;
+            self -> row_id_increments = 0;
+            
+            if ( is_sequential )
+            {
+                /* fill it again */
+                if ( !rr_fill_cache( & self -> read_store, ids, self -> curs, self -> read_idx, row_id, last_row_id ) )
+                    self -> read_store = NULL;
+            }
+        }
+    }
+    else
+    {
+        /* we are not in sequential mode, because we do not have a cache
+           count how often we incremented the row-id by 1 to enter sequential mode */
+        if ( row_id == ( self -> last_row_id + 1 ) )
+        {
+            self -> row_id_increments ++;
+            is_sequential = ( self -> row_id_increments > ROW_ID_INC_COUNT );
+            if ( is_sequential )
+            {
+                if ( !rr_fill_cache( & self -> read_store, ids, self -> curs, self -> read_idx, row_id, last_row_id ) )
+                    self -> row_id_increments = 0;
+            }
+        }
+        else
+            self -> row_id_increments = 0;
+    }
+
+    self -> last_row_id = row_id;
+}
+
+/* --------------------------------------------------------------------------------------
+    Strategy for impl2:
+
+    ( 1 ) - keep track of are we in sequential mode, is row_id continoulsy increasing?
+          - if not trow away the cache
+          
+    ( 2 ) - when entering sequential mode, create the cache, fill it with k/v-pairs
+            key ... alignment-id
+            value.. READ
+            
+    ( 3 ) - if in sequential mode, keep track of the row_id beeing in the cache-window
+            if end of window reached: throw away the cache
+
+-------------------------------------------------------------------------------------- */
+
+
+/* --------------------------------------------------------------------------------------
+    argv[ 0 ]   ... CMP_READ
+    argv[ 1 ]   ... PRIM_ALIG_ID
+    argv[ 2 ]   ... READ_LEN
+    argv[ 3 ]   ... READ_TYPE
+-------------------------------------------------------------------------------------- */
+static rc_t CC seq_restore_read_impl2 ( void *data, const VXformInfo *info, int64_t row_id,
+                                 VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    Read_Restorer   *self = data;
+    INSDC_4na_bin   *dst;
+    INSDC_coord_len len;
+    id_list align_ids;
+    uint32_t i; 
+    uint32_t src_len                 = (uint32_t)argv[ 0 ] . u . data . elem_count;
+    const INSDC_4na_bin * src        = argv[ 0 ] . u . data.base;
+    const uint32_t num_reads         = (uint32_t)argv[ 1 ]. u . data . elem_count;
+    const INSDC_coord_len * read_len = argv[ 2 ] . u . data.base;
+    const uint8_t *read_type         = argv[ 3 ] . u . data.base;
+    int64_t last_row_id              = argv[ 1 ] . blob_stop_id;
+    
+    align_ids.list  = ( int64_t * )argv[ 1 ].u.data.base;
+    align_ids.count = ( uint32_t )( argv[ 1 ].u.data.base_elem_count - argv[ 1 ].u.data.first_elem );
+    
+    assert( argv[ 0 ].u.data.elem_bits == 8 );
+    assert( argv[ 1 ].u.data.elem_bits == 64 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( INSDC_coord_len ) * 8 );
+    assert( argv[ 2 ].u.data.elem_count == num_reads );
+    assert( argv[ 3 ].u.data.elem_count == num_reads );
+    
+    src   += argv [ 0 ] . u . data . first_elem;
+    align_ids.list += argv [ 1 ] . u . data . first_elem;
+    read_len  += argv [ 2 ] . u . data . first_elem;
+    read_type += argv [ 3 ] . u . data . first_elem;
+
+    handle_caching( self, &align_ids, row_id, last_row_id );
+
+    for ( i = 0, len = 0; i < num_reads; i++ )
+        len += read_len[ i ];
+
+    /* resize output row */    
+    rslt->data->elem_bits = 8;
+    rc = KDataBufferResize( rslt->data, len );
+    rslt->elem_count = len;
+    dst = rslt->data->base;
+    
+    if ( rc == 0 && len > 0 )
+    {
+        if ( len == src_len ) /*** shortcut - all data is local ***/
+            memmove( dst, src, len );
+        else
+        {
+            rr_entry * ep;
+            const INSDC_4na_bin * rd;
+            uint32_t rd_len;
+            bool found_in_cache;
+            
+            for ( i = 0; i < num_reads && rc == 0; i++ ) /*** checking read by read ***/
+            {
+                int64_t align_id = align_ids.list[ i ];
+                if ( align_id > 0 )
+                {
+                    found_in_cache = false;
+                    if ( self -> read_store != NULL )
+                        found_in_cache = rr_get_read ( self -> read_store, align_id, &ep );
+                    if ( found_in_cache )
+                    {
+                        /* we found it in the cache... */
+                        rd = &( ep->read[ 0 ] );
+                        rd_len = ep->read_len;
+                    }
+                    else
+                    {
+                        /* we did not find it in the cache, get it from the alignment-table... */
+                        rc = VCursorCellDataDirect( self -> curs, align_id, self -> read_idx,
+                                                    NULL, ( const void** ) &rd, NULL, &rd_len );
+                    }
+                    
+                    if ( rc == 0 )
+                    {
+                        if ( rd_len == read_len[ i ] )
+                        {
+                            if ( read_type[ i ] & SRA_READ_TYPE_FORWARD )
+                            {
+                                memmove( dst, rd, read_len[ i ] );
+                            }
+                            else if ( read_type[ i ] & SRA_READ_TYPE_REVERSE )
+                            {
+                                int j, k;
+                                for( j = 0, k = read_len[ i ] - 1; j < (int)read_len[ i ]; j++, k-- )
+                                {
+                                    dst[ j ] = map [ rd[ k ] & 15 ];
+                                }
+                            }
+                            else
+                            {
+                                rc = RC( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+                            }
+                        }
+                        else
+                        {
+                            rc = RC( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+                        }
+                    }
+
+                }
+                else /*** data is in READ column **/
+                {
+                    if ( src_len >= read_len[ i ] )
+                    {
+                        memmove( dst, src, read_len[ i ] );
+                        src_len -= read_len[ i ];
+                        src     += read_len[ i ];
+                    }
+                    else
+                    {
+                        return RC( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+                    }
+                }
+                dst += read_len[ i ];
+            }
+        }
+    }
+
+    return rc;
+}
+
+#else
+
+static
+rc_t CC seq_restore_read_impl1 ( void *data, const VXformInfo *info, int64_t row_id,
+                                 VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    int i;
+    Read_Restorer   *self = data;
+    INSDC_4na_bin   *dst;
+    INSDC_coord_len     len;
+    uint32_t        src_len     = (uint32_t)argv[ 0 ].u.data.elem_count;
+    const INSDC_4na_bin *src    = argv[ 0 ].u.data.base;
+    const uint32_t  num_reads   = (uint32_t)argv[ 1 ].u.data.elem_count;
+    const int64_t   *align_id   = argv[ 1 ].u.data.base;
+    const INSDC_coord_len *read_len = argv[ 2 ].u.data.base;
+    const uint8_t   *read_type  = argv[ 3 ].u.data.base;
+    bool is_sequential = false;
+    
+    assert( argv[ 0 ].u.data.elem_bits == 8 );
+    assert( argv[ 1 ].u.data.elem_bits == 64 );
+    assert( argv[ 2 ].u.data.elem_bits == sizeof( INSDC_coord_len ) * 8 );
+    assert( argv[ 2 ].u.data.elem_count == num_reads );
+    assert( argv[ 3 ].u.data.elem_count == num_reads );
+    
+    
+    src   += argv [ 0 ] . u . data . first_elem;
+    align_id  += argv [ 1 ] . u . data . first_elem;
+    read_len  += argv [ 2 ] . u . data . first_elem;
+    read_type += argv [ 3 ] . u . data . first_elem;
+
+    if ( row_id != self->last_row_id  && row_id != self->last_row_id + 1 )
+    {
+        self->first_sequential_row_id = row_id;
+        is_sequential = false;
+    }
+    else if ( row_id > self->first_sequential_row_id + 100 )
+    {
+        is_sequential = true;
+    }
+    self->last_row_id = row_id;
+    
+    
+    /* is_sequential = false; forcing it to false ... Sept. 16th 2015 to analyze prefetching */
+    
+    for ( i = 0, len = 0; i < (int)num_reads; i++ )
+    {
+        len += read_len[ i ];
+    }
+
+    /* resize output row */    
+    rslt->data->elem_bits = 8;
+    rc = KDataBufferResize( rslt->data, len );
+    rslt->elem_count = len;
+    dst = rslt->data->base;
+    if ( rc == 0 && len > 0 )
+    {
+        if ( len == src_len ) /*** shortcut - all data is local ***/
+        {
+            memmove( dst, src, len );
+        }
+        else
+        {
+            if ( is_sequential &&
+                 ( row_id < self->prefetch_start_id || row_id > self->prefetch_stop_id ) )
+            { /* do prefetch */
+                uint32_t num_rows = ( argv[ 1 ].u.data.base_elem_count - argv[ 1 ].u.data.first_elem );
+                
+                /*
+                KTimeMs_t ts = KTimeMsStamp();
+                fprintf( stderr, "\nprefetch row_id #%lu ( start_id #%lu, stop_id #%lu ) num_rows = %d\n", row_id, self->prefetch_start_id, self->prefetch_stop_id, num_rows );
+                */
+                
+                VCursorDataPrefetch( self->curs,
+                                     align_id,
+                                     self->read_idx,
+                                     num_rows,
+                                     1,
+                                     INT64_MAX,
+                                     true );
+                                     
+                /*
+                ts = KTimeMsStamp() - ts;
+                fprintf( stderr, "prefetch done in %lu ms\n", ts );
+                */
+                
+                self->prefetch_start_id=row_id;
+                self->prefetch_stop_id =argv[1].blob_stop_id;
+            }
+            for( i = 0; i < (int)num_reads && rc == 0; i++ ) /*** checking read by read ***/
+            {
+                if ( align_id[ i ] > 0 )
+                {
+                    const INSDC_4na_bin *r_src;
+                    uint32_t             r_src_len;
+
+                    SUB_DEBUG( ( "SUB.Rd in 'seq-restore-read.c' at #%lu\n", align_id[ i ] ) );
+
+                    rc = VCursorCellDataDirect( self -> curs, align_id[ i ], self -> read_idx,
+                                                NULL, ( const void** ) &r_src, NULL, &r_src_len );
+                    if ( rc == 0 )
+                    {
+                        if ( r_src_len == read_len[ i ] )
+                        {
+                            if ( read_type[ i ] & SRA_READ_TYPE_FORWARD )
+                            {
+                                memmove( dst, r_src, read_len[ i ] );
+                            }
+                            else if ( read_type[ i ] & SRA_READ_TYPE_REVERSE )
+                            {
+                                int j, k;
+                                for( j = 0, k = read_len[ i ] - 1; j < (int)read_len[ i ]; j++, k-- )
+                                {
+                                    dst[ j ] = map [ r_src[ k ] & 15 ];
+                                }
+                            }
+                            else
+                            {
+                                rc = RC( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+                            }
+                        }
+                        else
+                        {
+                            rc = RC( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+                        }
+                    }
+                }
+                else /*** data is in READ column **/
+                {
+                    if ( src_len >= read_len[ i ] )
+                    {
+                        memmove( dst, src, read_len[ i ] );
+                        src_len -= read_len[ i ];
+                        src     += read_len[ i ];
+                    }
+                    else
+                    {
+                        return RC( rcXF, rcFunction, rcExecuting, rcData, rcInconsistent );
+                    }
+                }
+                dst += read_len[ i ];
+            }
+        }
+    }
+
+    return rc;
+}
+
+#endif
+
+/* 
+ * function
+   INSDC:4na:bin NCBI:align:seq_restore_read #1 ( INSDC:4na:bin cmp_rd,
+                                                  I64 align_id,
+                                                  INSDC:coord:len read_len,
+                                                  INSDC:SRA:xread_type rd_type )
+
+ */
+VTRANSFACT_IMPL ( ALIGN_seq_restore_read, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+                                                     VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    Read_Restorer * fself;
+    rc_t rc = Read_Restorer_Make ( & fself, info -> tbl,  (const VCursor*)info->parms );
+    if ( rc == 0 )
+    {
+        rslt -> self = fself;
+#if READ_RESTORER_VERSION == 2
+        rslt -> u.ndf = seq_restore_read_impl2;
+#else
+        rslt -> u.ndf = seq_restore_read_impl1;
+#endif
+        rslt -> variant = vftRow;
+        rslt -> whack = Read_Restorer_Whack;
+    }
+    return rc;
+}
diff --git a/libs/axf/template-len.c b/libs/axf/template-len.c
new file mode 100644
index 0000000..5646c61
--- /dev/null
+++ b/libs/axf/template-len.c
@@ -0,0 +1,136 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+static
+rc_t CC template_len_impl( void * data, const VXformInfo * info, int64_t row_id,
+                           VRowResult *rslt, uint32_t argc, const VRowData argv [] ) 
+{
+    rc_t 	rc;
+    int32_t	*dst;
+    const INSDC_coord_zero *p1 = argv[ 0 ].u.data.base;     /* REF_POS */
+    const INSDC_coord_zero *p2 = argv[ 1 ].u.data.base;     /* MATE_REF_POS */
+    const INSDC_coord_len  *l1 = argv[ 2 ].u.data.base;     /* REF_LEN */
+    const INSDC_coord_len  *l2 = argv[ 3 ].u.data.base;     /* MATE_REF_LEN */
+    const char             *n1 = argv[ 4 ].u.data.base;     /* REF_NAME */
+    const char             *n2 = argv[ 5 ].u.data.base;     /* MATE_REF_NAME */
+    const INSDC_coord_one  *r1 = argv[ 6 ].u.data.base;     /* SEQ_READ_ID ( 1 or 2 ) */
+
+    /** primary should have everything defines ***/
+    assert( argv[ 0 ].u.data.elem_count == 1 );
+    assert( argv[ 2 ].u.data.elem_count == 1 );
+    assert( argv[ 4 ].u.data.elem_count > 0 );
+    assert( argv[ 6 ].u.data.elem_count == 1 );
+
+    rc = KDataBufferResize( rslt->data, 1 );
+    if ( rc != 0 )
+        return rc;
+    rslt->elem_count = 1;
+    dst = rslt->data->base;
+    dst[ 0 ] = 0;
+
+    /*** check if the mate is mapped **/
+    if ( argv[ 1 ].u.data.elem_count > 0
+         && argv[ 3 ].u.data.elem_count > 0
+         && argv[ 4 ].u.data.elem_count == argv[ 5 ].u.data.elem_count )
+    {
+        n1 += argv[ 4 ].u.data.first_elem;
+        n2 += argv[ 5 ].u.data.first_elem;
+        r1 += argv[ 6 ].u.data.first_elem;
+        
+        if ( argv[ 4 ].u.data.elem_count == argv[ 5 ].u.data.elem_count
+             && memcmp( n1, n2, ( size_t )( argv[ 4 ].u.data.elem_count ) ) == 0 ) /*** same reference name ***/
+        {
+#if 1
+            unsigned const self_left  = p1[ argv[ 0 ].u.data.first_elem ];
+            unsigned const mate_left  = p2[ argv[ 1 ].u.data.first_elem ];
+            unsigned const self_right = self_left + l1[ argv[ 2 ].u.data.first_elem ];
+            unsigned const mate_right = mate_left + l2[ argv[ 3 ].u.data.first_elem ];
+            unsigned const  leftmost  = ( self_left  < mate_left ) ? self_left  : mate_left;
+            unsigned const rightmost  = ( self_right > mate_right ) ? self_right : mate_right;
+            unsigned const tlen = rightmost - leftmost;
+            
+            /* The standard says, "The leftmost segment has a plus sign and the rightmost has a minus sign." */
+            if (   ( self_left <= mate_left && self_right >= mate_right )     /* mate fully contained within self or */
+                || ( mate_left <= self_left && mate_right >= self_right ) )    /* self fully contained within mate; */
+            {
+                if ( self_left < mate_left || ( r1[ 0 ] == 1 && self_left == mate_left ) )
+                    dst[ 0 ] = tlen;
+                else
+                    dst[ 0 ] = -( ( int32_t )tlen );
+            }
+            else if (   ( self_right == mate_right && mate_left == leftmost ) /* both are rightmost, but mate is leftmost */
+                      || self_right == rightmost )
+            {
+                dst[ 0 ] = -( ( int32_t )tlen );
+            }
+            else
+                dst[ 0 ] = tlen;
+#else
+            dst[ 0 ] = p2[ argv[ 1 ].u.data.first_elem ] -  p1[ argv[ 0 ].u.data.first_elem ];
+            if( dst[ 0 ] < 0 )
+            {
+                dst[ 0 ] -= l1[ argv[ 2 ].u.data.first_elem ];
+            }
+            else if ( dst[ 0 ] > 0 )
+            {
+                dst[ 0 ] += l2[ argv[ 3 ].u.data.first_elem ];
+            }
+            else if ( r1[ 0 ] == 1 ) /*** bam wants to give positive TLEN ***/
+            {
+                dst[ 0 ] = l1[ argv[ 2 ].u.data.first_elem ];
+            }
+            else if ( r1[ 0 ] == 2 ) /*** bam wants to give negative TLEN ***/
+            {
+                dst[ 0 ] = -l2[ argv[ 3 ].u.data.first_elem ];
+            } 
+#endif
+        }
+    }
+    return 0;	
+}
+
+VTRANSFACT_IMPL ( NCBI_align_template_len, 1, 0, 0 ) ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+                                                 const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftRowFast;
+    rslt->u.rf = template_len_impl;
+    return 0;
+}
diff --git a/libs/blast/Makefile b/libs/blast/Makefile
new file mode 100644
index 0000000..08a3d0e
--- /dev/null
+++ b/libs/blast/Makefile
@@ -0,0 +1,91 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: all
+
+TOP ?= $(abspath ../..)
+
+MODULE = libs/blast
+
+INT_LIBS = \
+
+ALL_LIBS = \
+	$(INT_LIBS) \
+	$(EXT_LIBS)
+
+include $(TOP)/build/Makefile.env
+
+ifeq (64,$(BITS))
+	INT_LIBS += libvdb-blast
+	OBJFILES = $(BLAST_OBJ)
+endif    
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# blast
+#
+$(ILIBDIR)/libvdb-blast: $(addprefix $(ILIBDIR)/libvdb-blast.,$(ILIBEXT))
+
+BLAST_SRC = \
+	blast-mgr \
+	reader \
+	reference \
+	run-set \
+
+BLAST_OBJ = \
+	$(addsuffix .$(LOBX),$(BLAST_SRC))
+
+BLAST_LIB = \
+
+$(ILIBDIR)/libvdb-blast.$(LIBX): $(BLAST_OBJ)
+	$(LD) --slib -o $@ $^ $(BLAST_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/blast/blast-mgr.c b/libs/blast/blast-mgr.c
new file mode 100644
index 0000000..12084a1
--- /dev/null
+++ b/libs/blast/blast-mgr.c
@@ -0,0 +1,670 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vdb/extern.h>
+#include "blast-mgr.h" /* BTableType */
+#include <kdb/manager.h> /* KDBManagerRelease */
+#include <kdb/meta.h> /* KMetadataRelease */
+#include <kfg/config.h> /* KConfig */
+#include <kfs/directory.h> /* KDirectoryRelease */
+#include <klib/debug.h> /* KDbgSetString */
+#include <klib/log.h> /* KLogLevel */
+#include <klib/out.h>  /* KOutHandlerSetStdOut */
+#include <klib/refcount.h> /* KRefcount */
+#include <klib/status.h> /* STSMSG */
+#include <sra/sraschema.h> /* VDBManagerMakeSRASchema */
+#include <vdb/database.h> /* VDBManagerOpenDBRead */
+#include <vdb/manager.h> /* VDBManager */
+#include <vdb/schema.h> /* VSchema */
+#include <vdb/table.h> /* VDBManagerOpenTableRead */
+#include <vdb/vdb-priv.h> /* VDBManagerOpenKDBManagerRead */
+
+#include <vfs/manager.h> /* VFSManager */
+#include <vfs/path.h> /* VPath */
+#include <vfs/resolver.h> /* VResolver */
+
+#include <sysalloc.h>
+#include <stdio.h> /* fprintf */
+#include <string.h> /* memset */
+
+#define TOOLKIT "sratoolkit2_8_1"
+
+/******************************************************************************/
+
+static const char VDB_BLAST_MGR[] = "VdbBlastMgr";
+
+struct VdbBlastMgr {
+    KRefcount refcount;
+    VSchema *schema;
+    const VDBManager *mgr;
+    const KDBManager *kmgr;
+    VFSManager * vfs;
+    KDirectory *dir;
+    VResolver *resolver;
+};
+
+rc_t _VdbBlastMgrNativeToPosix(const VdbBlastMgr *self,
+    const char *native, char *posix, size_t size)
+{
+    rc_t rc = 0;
+    VPath *temp_v_path = NULL;
+    assert(self);
+    rc = VFSManagerMakeSysPath(self->vfs, &temp_v_path, native);
+    if (rc == 0) {
+        size_t written = 0;
+        rc = VPathReadPath(temp_v_path, posix, size, &written);
+    }
+    RELEASE(VPath, temp_v_path);
+    return rc;
+}
+
+static
+void _VdbBlastMgrWhack(VdbBlastMgr *self)
+{
+    assert(self);
+
+    VSchemaRelease(self->schema);
+    VDBManagerRelease(self->mgr);
+    KDBManagerRelease(self->kmgr);
+    VFSManagerRelease ( self -> vfs );
+    KDirectoryRelease(self->dir);
+    VResolverRelease(self->resolver);
+
+    memset(self, 0, sizeof *self);
+
+    free(self);
+
+    STSMSG(1, ("Deleted VdbBlastMgr"));
+}
+
+LIB_EXPORT
+VdbBlastMgr* CC VdbBlastInit(uint32_t *status)
+{
+    VdbBlastMgr *item = NULL;
+    rc_t rc = 0;
+
+    uint32_t dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    *status = eVdbBlastErr;
+
+    if (getenv(TOOLKIT) != NULL) {
+#if _DEBUGGING
+fprintf(stderr, "DEBUGNG with " TOOLKIT " release\n");
+#else
+fprintf(stderr, "RELEASE with " TOOLKIT " release\n");
+#endif
+    }
+    item = calloc(1, sizeof *item);
+    if (item == NULL) {
+        *status = eVdbBlastMemErr;
+        return item;
+    }
+
+    if ( rc == 0 )
+    {
+        rc = VFSManagerMake ( & item -> vfs );
+        if ( rc != 0 )
+            LOGERR ( klogInt, rc, "Error in VFSManagerMake" );
+    }
+
+    if (rc == 0) {
+        rc = VFSManagerGetCWD( item -> vfs, &item->dir);
+        if (rc != 0)
+        {   LOGERR(klogInt, rc, "Error in VFSManagerGetCWD"); }
+    }
+
+    if (rc == 0) {
+        rc = VDBManagerMakeRead(&item->mgr, NULL);
+        if (rc != 0)
+        {   LOGERR(klogInt, rc, "Error in VDBManagerMakeRead"); }
+    }
+
+    if (rc == 0) {
+        rc = VDBManagerOpenKDBManagerRead(item->mgr, &item->kmgr);
+        if (rc != 0)
+        {   LOGERR(klogInt, rc, "Error in VDBManagerOpenKDBManagerRead"); }
+    }
+
+    if (rc == 0) {
+        rc = VDBManagerMakeSRASchema(item->mgr, &item->schema);
+        if (rc != 0)
+        {   LOGERR(klogInt, rc, "Error in VDBManagerMakeSRASchema"); }
+    }
+
+    if (rc == 0) {
+        VFSManager* mgr = NULL;
+        KConfig* cfg = NULL;
+        if (rc == 0) {
+            rc = VFSManagerMake(&mgr);
+        }
+        if (rc == 0) {
+            rc = KConfigMake(&cfg, NULL);
+        }
+        if (rc == 0) {
+            rc = VFSManagerMakeResolver(mgr, &item->resolver, cfg);
+        }
+        RELEASE(KConfig, cfg);
+        RELEASE(VFSManager, mgr);
+    }
+
+    if (rc != 0) {
+        _VdbBlastMgrWhack(item);
+        item = NULL;
+        STSMSG(1, ("Error: failed to create VdbBlastMgr"));
+    }
+    else {
+        KRefcountInit(&item->refcount, 1, VDB_BLAST_MGR, __func__, "mgr");
+        *status = eVdbBlastNoErr;
+        STSMSG(1, ("Created VdbBlastMgr"));
+    }
+
+    return item;
+}
+
+LIB_EXPORT
+VdbBlastMgr* CC VdbBlastMgrAddRef(VdbBlastMgr *self)
+{
+    if (self == NULL) {
+        STSMSG(2, ("VdbBlastMgrAddRef(NULL)"));
+        return self;
+    }
+
+    if (KRefcountAdd(&self->refcount, VDB_BLAST_MGR) == krefOkay) {
+        STSMSG(2, ("VdbBlastMgrAddRef"));
+        return self;
+    }
+
+    STSMSG(1, ("Error: failed to VdbBlastMgrAddRef"));
+    return NULL;
+}
+
+LIB_EXPORT
+void CC VdbBlastMgrRelease(VdbBlastMgr *self)
+{
+    if (self == NULL)
+    {   return; }
+
+    STSMSG(2, ("VdbBlastMgrRelease"));
+    if (KRefcountDrop(&self->refcount, VDB_BLAST_MGR) != krefWhack)
+    {   return; }
+
+    _VdbBlastMgrWhack(self);
+}
+
+
+LIB_EXPORT bool CC VdbBlastMgrIsCSraRun(
+    const VdbBlastMgr *self, const char *rundesc)
+{
+    bool csra = false;
+    rc_t rc = 0;
+    const VDBManager *aMgr = NULL;
+    const VDBManager *mgr = NULL;
+    const VDatabase *db = NULL;
+    if (self != NULL) {
+        mgr = self->mgr;
+    }
+    if (mgr == NULL) {
+        rc = VDBManagerMakeRead(&mgr, NULL);
+        if (rc != 0) {
+            return false;
+        }
+        if (self != NULL && self->mgr == NULL) {
+            ((VdbBlastMgr*)self)->mgr = mgr;
+        }
+        else {
+            aMgr = mgr;
+        }
+    }
+    rc = VDBManagerOpenDBRead(mgr, &db,
+        self == NULL ? NULL : self->schema, "%s", rundesc);
+    if (rc == 0) {
+        csra = VDatabaseIsCSRA(db);
+    }
+    RELEASE(VDatabase, db);
+    RELEASE(VDBManager, aMgr);
+    return csra;
+}
+
+
+static bool _VdbBlastMgrSchemaEquals(const VdbBlastMgr *self,
+    const VDatabase *db, const char *rundesc,
+    const char* name, uint32_t max_chars)
+{
+    bool equals = false;
+
+    const KMetadata *meta = NULL;
+    const KMDataNode *node = NULL;
+
+    char buffer[512] = "";
+    size_t size = 0;
+
+    rc_t rc = 0;
+
+    assert(self);
+
+    if (db != NULL) {
+        rc = VDatabaseOpenMetadataRead(db, &meta);
+    }
+    else {
+        const VTable *tbl = NULL;
+        rc = VDBManagerOpenTableRead(self->mgr, &tbl, self->schema, rundesc);
+
+        if (rc == 0) {
+            rc = VTableOpenMetadataRead(tbl, &meta);
+        }
+
+        RELEASE(VTable, tbl);
+    }
+
+    if (rc == 0) {
+        rc = KMetadataOpenNodeRead(meta, &node, "schema");
+    }
+
+    if (rc == 0) {
+        rc = KMDataNodeReadAttr(node, "name", buffer, sizeof buffer, &size);
+    }
+
+    if (rc == 0) {
+        STSMSG(1, ("%s.schema at name='%.*s'", rundesc, (uint32_t)size, buffer));
+
+        if (size >= sizeof name && 
+            string_cmp(buffer, max_chars, name, max_chars, max_chars)
+                == 0)
+        {
+            equals = true;
+        }
+    }
+
+    RELEASE(KMDataNode, node);
+    RELEASE(KMetadata, meta);
+
+    return equals;
+}
+
+BTableType _VdbBlastMgrBTableType(
+    const VdbBlastMgr *self, const char *rundesc)
+{
+    BTableType type = btpSRA;
+
+    rc_t rc = 0;
+
+    const VDatabase *db = NULL;
+
+    assert(self);
+
+    rc = VDBManagerOpenDBRead(self->mgr, &db, NULL, rundesc);
+
+    if (rc == 0) {
+        const char name[] = "NCBI:WGS:db:contig";
+
+        if (_VdbBlastMgrSchemaEquals(self, db, rundesc, name, sizeof name - 1))
+        {
+            STSMSG(1, ("%s is WGS", rundesc));
+            type = btpWGS;
+        }
+
+        RELEASE(VDatabase, db);
+    }
+    else {
+        const char name[] = "NCBI:refseq:tbl:reference";
+
+        if (_VdbBlastMgrSchemaEquals(self, db, rundesc, name, sizeof name - 1))
+        {
+            STSMSG(1, ("%s is REFSEQ", rundesc));
+            type = btpREFSEQ;
+        }
+    }
+
+    if (type == btpSRA) {
+        STSMSG(1, ("%s is SRA", rundesc));
+    }
+
+    return type;
+}
+
+static
+VdbBlastStatus _VdbBlastMgrOpenSequenceTable(const VdbBlastMgr *self,
+    const char *path,
+    const VTable **tbl,
+    const VDatabase **db)
+{
+    KPathType type = kptNotFound;
+    VSchema *schema = NULL;
+
+    assert(self && tbl && db);
+    *tbl = NULL;
+
+    /* Always use VDBManagerMakeSRASchema to VDBManagerOpenTableRead
+       Otherwise CMP_BASE_COUNT column sometimes cannot be found */
+    schema = self->schema;
+
+    type = KDBManagerPathType(self->kmgr, "%s", path);
+    if (type == kptNotFound) {
+        STSMSG(1, ("Error: cannot find '%s'", path));
+        return eVdbBlastErr;
+    }
+
+    if ((type & ~kptAlias) == kptDatabase) {
+        const char *table = "SEQUENCE";
+        rc_t rc = VDBManagerOpenDBRead(self->mgr, db, NULL, "%s", path);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VDBManagerOpenDBRead($(name))", "name=%s", path));
+            STSMSG(1, ("Error: failed to open DB '%s'", path));
+            return eVdbBlastErr;
+        }
+        assert(*db);
+        rc = VDatabaseOpenTableRead(*db, tbl, table);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VDatabaseOpenTableRead($(name), $(tbl))",
+                "name=%s,tbl=%s", path, table));
+            STSMSG(1, ("Error: failed to open DB table '%s/%s'", path, table));
+        }
+        else {
+            STSMSG(1, ("Opened DB table '%s/%s'", path, table));
+        }
+
+        return rc != 0 ? eVdbBlastErr : eVdbBlastNoErr;
+    }
+
+    while (true) {
+        rc_t rc = VDBManagerOpenTableRead(self->mgr, tbl, schema, "%s", path);
+        if (rc == 0) {
+            if (schema == NULL) {
+                STSMSG(1, ("Opened table '%s'(schema=NULL)", path));
+            }
+            else {
+                STSMSG(1, ("Opened table '%s'(SRASchema)", path));
+            }
+            return eVdbBlastNoErr;
+        }
+
+        assert(self->schema);
+
+        if (schema == NULL)
+        {   schema = self->schema; }
+        else {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VDBManagerOpenTableRead($(name))", "name=%s", path));
+            STSMSG(1, ("Error: failed to open table '%s'", path));
+            return eVdbBlastRunErr;
+        }
+    }
+}
+
+VdbBlastStatus _VdbBlastMgrFindNOpenSeqTable(const VdbBlastMgr *self,
+    const char *rundesc,
+    const VTable **tbl,
+    BTableType *type,
+    char **fullpath,
+    const VDatabase **db)
+{
+    VdbBlastStatus status = eVdbBlastNoErr;
+    char *path = (char*) rundesc;
+
+    assert(self && type);
+
+    status = _VdbBlastMgrOpenSequenceTable(self, path, tbl, db);
+    if (status == eVdbBlastNoErr) {
+        STSMSG(1, ("Added run %s(%s)", rundesc, path));
+    }
+    else {
+        STSMSG(1, ("Error: failed to add run %s(%s)", rundesc, path));
+    }
+
+    *type = _VdbBlastMgrBTableType(self, path);
+
+    if (path != rundesc) {
+        free(path);
+        path = NULL;
+    }
+
+    return status;
+}
+
+/******************************************************************************/
+
+/* KConfigPrint
+ * print current configuration to the output handler
+ */
+LIB_EXPORT uint32_t VdbBlastMgrKConfigPrint(const VdbBlastMgr *self) {
+    KConfig *kfg = NULL;
+
+    rc_t rc = KConfigMake(&kfg, NULL);
+
+    if (rc == 0) {
+        rc = KConfigPrint(kfg, 0);
+    }
+
+    {
+        rc_t rc2 = KConfigRelease(kfg);
+        if (rc == 0 && rc2 != 0) {
+            rc = rc2;
+        }
+    }
+
+    if (rc != 0) {
+        LOGERR(klogInt, rc, "An error occured when printing Configiration");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT uint32_t CC VdbBlastMgrKDbgSetString(const VdbBlastMgr *self,
+    const char *string)
+{
+    rc_t rc = KDbgSetString(string);
+
+    if (rc != 0) {
+        LOGERR(klogInt, rc, "An error occured when setting KDbgString");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT uint32_t CC VdbBlastMgrKLogHandlerSet(const VdbBlastMgr *self,
+    KWrtWriter writer, void *data)
+{
+    rc_t rc = KLogHandlerSet(writer, data);
+
+    if (rc != 0) {
+        LOGERR(klogInt, rc, "An error occured when setting KLogHandler");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT uint32_t CC VdbBlastMgrKLogHandlerSetStdErr(
+    const VdbBlastMgr *self)
+{
+    rc_t rc = KLogHandlerSetStdErr();
+
+    if (rc != 0) {
+        LOGERR(
+            klogInt, rc, "An error occured when setting KLogHandler to StdErr");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT uint32_t CC VdbBlastMgrKLogHandlerSetStdOut(
+    const VdbBlastMgr *self)
+{
+    rc_t rc = KLogHandlerSetStdOut();
+
+    if (rc != 0) {
+        LOGERR(
+            klogInt, rc, "An error occured when setting KLogHandler to StdOut");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT uint32_t CC VdbBlastMgrKLogLibHandlerSet(const VdbBlastMgr *self,
+    KWrtWriter writer, void *data)
+{
+    rc_t rc = KLogLibHandlerSet(writer, data);
+
+    if (rc != 0) {
+        LOGERR(klogInt, rc, "An error occured when setting KLogLibHandler");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT
+uint32_t CC VdbBlastMgrKLogLibHandlerSetStdErr(const VdbBlastMgr *self)
+{
+    rc_t rc = KLogLibHandlerSetStdErr();
+
+    if (rc != 0) {
+        LOGERR(klogInt, rc,
+            "An error occured when setting KLogLibHandler to StdErr");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT
+uint32_t CC VdbBlastMgrKLogLibHandlerSetStdOut(const VdbBlastMgr *self)
+{
+    rc_t rc = KLogLibHandlerSetStdOut();
+
+    if (rc != 0) {
+        LOGERR(klogInt, rc,
+            "An error occured when setting KLogLibHandler to StdOut");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT uint32_t CC VdbBlastMgrKOutHandlerSet(const VdbBlastMgr *self,
+    VdbBlastKWrtWriter writer, void *data)
+{
+    rc_t rc = KOutHandlerSet(writer, data);
+
+    if (rc != 0) {
+        LOGERR(klogInt, rc, "An error occured when setting KOutHandler");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT
+uint32_t CC VdbBlastMgrKOutHandlerSetStdErr(const VdbBlastMgr *self)
+{
+    rc_t rc = KOutHandlerSetStdErr();
+
+    if (rc != 0) {
+        LOGERR(
+            klogInt, rc, "An error occured when setting KOutHandler to StdErr");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT
+uint32_t CC VdbBlastMgrKOutHandlerSetStdOut(const VdbBlastMgr *self)
+{
+    rc_t rc = KOutHandlerSetStdOut();
+
+    if (rc != 0) {
+        LOGERR(
+            klogInt, rc, "An error occured when setting KOutHandler to StdOut");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT
+uint32_t CC VdbBlastMgrKStsHandlerSetStdErr(const VdbBlastMgr *self)
+{
+    rc_t rc = KStsHandlerSetStdErr();
+
+    if (rc != 0) {
+        LOGERR(
+            klogInt, rc, "An error occured when setting KStsHandler to StdErr");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT
+uint32_t CC VdbBlastMgrKStsHandlerSetStdOut(const VdbBlastMgr *self)
+{
+    rc_t rc = KStsHandlerSetStdOut();
+
+    if (rc != 0) {
+        LOGERR(
+            klogInt, rc, "An error occured when setting KStsHandler to StdOut");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT uint32_t CC VdbBlastMgrKLogLevelSet(const VdbBlastMgr *self,
+    KLogLevel lvl)
+{
+    rc_t rc = KLogLevelSet(lvl);
+
+    if (rc != 0) {
+        LOGERR(klogInt, rc, "An error occured when setting KLogLevel");
+        return eVdbBlastErr;
+    }
+
+    return eVdbBlastNoErr;
+}
+
+LIB_EXPORT uint32_t CC VdbBlastMgrKLogLevelSetInfo(
+    const VdbBlastMgr *self)
+{   return VdbBlastMgrKLogLevelSet(self, klogInfo); }
+
+LIB_EXPORT uint32_t CC VdbBlastMgrKLogLevelSetWarn(
+    const VdbBlastMgr *self)
+{   return VdbBlastMgrKLogLevelSet(self, klogWarn); }
+
+LIB_EXPORT VdbBlastStatus CC VdbBlastMgrKStsLevelSet(const VdbBlastMgr *self,
+    uint32_t level)
+{
+    KStsLevelSet(level);
+    return eVdbBlastNoErr; 
+}
diff --git a/libs/blast/blast-mgr.h b/libs/blast/blast-mgr.h
new file mode 100644
index 0000000..322290b
--- /dev/null
+++ b/libs/blast/blast-mgr.h
@@ -0,0 +1,78 @@
+#ifndef _h_libs_blast_blast_mgr_
+#define _h_libs_blast_blast_mgr_
+
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_klib_printf_
+#include <klib/printf.h> /* otherwise magic error */
+#endif
+
+#ifndef _h_ncbi_vdb_blast_
+#include <ncbi/vdb-blast.h> /* VdbBlastStatus */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if _DEBUGGING
+#define S STSMSG(9,(""));
+#else
+#define S
+#endif
+
+#define RELEASE(type, thing) do { rc_t rc2 = type##Release(thing); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } thing = NULL; } while (false)
+
+struct VDatabase;
+struct VTable;
+
+typedef uint32_t BTableType;
+enum {
+      btpUndefined
+    , btpSRA
+    , btpWGS
+    , btpREFSEQ
+};
+
+BTableType _VdbBlastMgrBTableType(const struct VdbBlastMgr *self,
+    const char *rundesc);
+
+VdbBlastStatus _VdbBlastMgrFindNOpenSeqTable(const VdbBlastMgr *self,
+    const char *rundesc,
+    const struct VTable **tbl,
+    BTableType *type,
+    char **fullpath,
+    const struct VDatabase **db);
+
+rc_t _VdbBlastMgrNativeToPosix(const VdbBlastMgr *self, const char *native, char *posix, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_libs_blast_blast_mgr_ */
diff --git a/libs/blast/reader.c b/libs/blast/reader.c
new file mode 100644
index 0000000..cd1798f
--- /dev/null
+++ b/libs/blast/reader.c
@@ -0,0 +1,2361 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * =============================================================================
+ *
+ */
+
+#include <vdb/extern.h>
+
+#include "blast-mgr.h" /* BTableType */
+#include "reader.h" /* Data2na */
+#include "reference.h" /* _ReferencesWhack */
+#include "run-set.h" /* VdbBlastRunSet */
+
+#include <ncbi/vdb-blast-priv.h>  /* VDB_READ_DIRECT */
+
+#include <insdc/sra.h> /* SRA_READ_TYPE_BIOLOGICAL */
+
+#include <sra/srapath.h> /* SRAPath */
+
+#include <vdb/manager.h> /* VDBManager */
+#include <vdb/schema.h> /* VSchema */
+#include <vdb/database.h> /* VDatabase */
+#include <vdb/table.h> /* VTable */
+#include <vdb/cursor.h> /* VCursor */
+#include <vdb/blob.h> /* VBlob */
+#include <vdb/vdb-priv.h> /* VCursorPermitPostOpenAdd */
+
+#include <kdb/manager.h> /* kptDatabase */
+#include <kdb/table.h> /* KTable */
+
+#include <vfs/path.h> /* VPath */
+
+#include <kfg/config.h> /* KConfig */
+
+#include <kproc/lock.h> /* KLock */
+
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/log.h> /* PLOGMSG */
+#include <klib/rc.h> /* GetRCState */
+#include <klib/refcount.h> /* KRefcount */
+#include <klib/status.h> /* STSMSG */
+#include <klib/text.h> /* String */
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h> /* calloc */
+#include <string.h> /* memset */
+
+#include <stdio.h> /* fprintf */
+
+/******************************************************************************/
+
+static void *_NotImplementedP(const char *func) {
+    PLOGERR(klogErr, (klogErr, -1,
+        "$(func): is not implemented", "func=%s", func));
+    return 0;
+}
+
+static size_t _NotImplemented(const char *func)
+{   return (size_t)_NotImplementedP(func); }
+
+/******************************************************************************/
+/** Packed2naRead **/
+
+static
+void _Packed2naReadPrint(const Packed2naRead *self, const void *blob)
+{
+    static char *b = NULL;
+    static size_t bsz = 0;
+    int last = 0;
+    unsigned i = 0;
+    size_t num_writ = 0;
+    size_t size = 0;
+    assert(self);
+    fflush(stderr);
+    if (b == NULL) {
+        bsz = self->length_in_bases + 64;
+        b = malloc(bsz);
+        if (b == NULL)
+        {   return; }
+    }
+    else if (bsz < self->length_in_bases + 64) {
+        char *tmp = NULL;
+        bsz = self->length_in_bases + 64;
+        tmp = realloc(b, bsz);
+        if (tmp == NULL)
+        {   return; }
+        b = tmp;
+    }
+    if (string_printf(b, bsz, &num_writ, "%lu\t%p\t", self->read_id, blob))
+    {
+        return;
+    }
+    assert(num_writ < bsz);
+    last = string_measure(b, &size);
+    {
+        unsigned ib = 0;
+        uint32_t offset = self->offset_to_first_bit;
+        for (ib = 0; ib < self->length_in_bases; ++ib) {
+            int j = 0;
+            uint8_t a[4];
+            uint8_t u = 0;
+            if (i >= self->length_in_bases)
+            {   break; }
+            u = ((uint8_t*)self->starting_byte)[ib];
+            a[0] = (u >> 6) & 3;
+            a[1] = (u >> 4) & 3;
+            a[2] = (u >> 2) & 3;
+            a[3] = u & 3;
+            for (j = offset / 2; j < 4; ++j) {
+                const char c[] = "ACGT";
+                uint8_t h = a[j];
+                if (i >= self->length_in_bases)
+                {   break; }
+                assert(h < 4);
+                b[last++] = c[h];
+                ++i;
+            }
+            offset = 0;
+        }
+        b[last++] = '\n';
+        b[last++] = '\0';
+        fprintf(stderr, "%s", b);
+        fflush(stderr);
+    }
+}
+
+/******************************************************************************/
+/** ReaderCols **/
+
+static void ReaderColsReset(ReaderCols *self) {
+    assert(self);
+
+    self   ->col_PRIMARY_ALIGNMENT_ID
+     = self->col_READ_FILTER
+     = self->col_READ_LEN
+     = self->col_TRIM_LEN
+     = self->col_TRIM_START
+     = 0;
+}
+
+static
+void ReaderColsFini(ReaderCols *self)
+{
+    assert(self);
+
+    free(self->primary_alignment_id);
+    free(self->read_filter);
+    free(self->read_len);
+
+    memset(self, 0, sizeof *self);
+}
+
+/* readId is an index in primary_alignment_id : 0-based */
+static bool ReaderColsIsReadCompressed(const ReaderCols *self,
+    uint32_t readId)
+{
+    assert(self);
+
+    if (self->col_PRIMARY_ALIGNMENT_ID == 0) {
+        return false; /* not cSRA */
+    }
+
+    assert(self->primary_alignment_id);
+
+    if (self->primary_alignment_id[readId] != 0) {
+        return true; /* has alignment == compressed */
+    }
+    else {
+        /* does not have alignment == not compressed == is stored in CMP_READ */
+        return false;
+    }
+}
+
+/******************************************************************************/
+
+static
+uint32_t _VCursorReadArray(const VCursor *self,
+    int64_t row_id,
+    uint32_t col,
+    void **buffer,
+    uint8_t elem_size,
+    uint8_t nReads,
+    const char *name)
+{
+    rc_t rc = 0;
+    uint32_t row_len = 0;
+
+    assert(buffer && elem_size && nReads && name);
+
+    if (*buffer == NULL) {
+        *buffer = calloc(nReads, elem_size);
+        if (*buffer == NULL) {
+            return eVdbBlastMemErr;
+        }
+    }
+
+    rc = VCursorReadDirect(self,
+        row_id, col, 8, *buffer, nReads * elem_size * 8, &row_len);
+    if (rc != 0) {
+        PLOGERR(klogInt, (klogInt, rc,
+            "Error in VCursorReadDirect($(name))", "name=%s", name));
+    }
+
+/* TODO: needs to be verified what row_len is expected
+    if (row_len != 1) return eVdbBlastErr; */
+
+    S
+
+    return rc == 0 ? eVdbBlastNoErr : eVdbBlastErr;
+}
+
+static
+uint32_t _VCursorAddReaderCols(const VCursor *self,
+    ReaderCols *cols, bool cSra, uint32_t tableId)
+{
+    rc_t rc = 0;
+
+    assert(self && cols);
+
+    if (rc == 0) {
+        const char name[] = "READ_FILTER";
+        rc = VCursorAddColumn(self, &cols->col_READ_FILTER, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VCursorOpen($(name))", "name=%s", name));
+        }
+        else {
+            assert(cols->col_READ_FILTER);
+        }
+    }
+
+    if (rc == 0) {
+        const char name[] = "READ_LEN";
+        rc = VCursorAddColumn(self, &cols->col_READ_LEN, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VCursorOpen($(name))", "name=%s", name));
+        }
+        else {
+            assert(cols->col_READ_LEN);
+        }
+    }
+
+    if (rc == 0) {
+        const char name[] = "TRIM_LEN";
+        rc = VCursorAddColumn(self, &cols->col_TRIM_LEN, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VCursorOpen($(name))", "name=%s", name));
+        }
+        else {
+            assert(cols->col_TRIM_LEN);
+        }
+    }
+
+    if (rc == 0) {
+        const char name[] = "TRIM_START";
+        rc = VCursorAddColumn(self, &cols->col_TRIM_START, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VCursorOpen($(name))", "name=%s", name));
+        }
+        else {
+            assert(cols->col_TRIM_START);
+        }
+    }
+
+    if (rc == 0 && cSra) {
+        const char name[] = "PRIMARY_ALIGNMENT_ID";
+        rc = VCursorAddColumn(self, &cols->col_PRIMARY_ALIGNMENT_ID, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VCursorOpen($(name))", "name=%s", name));
+        }
+        else {
+            assert(cols->col_PRIMARY_ALIGNMENT_ID);
+        }
+    }
+
+    return rc ? eVdbBlastErr : eVdbBlastNoErr;
+}
+
+static uint32_t _VCursorReadReaderCols(const VCursor *self,
+    const ReadDesc *desc, ReaderCols *cols)
+{
+    uint32_t status = eVdbBlastNoErr;
+    rc_t rc = 0;
+    uint32_t row_len = ~0;
+    int64_t row_id = 0;
+    uint8_t nReads = 0;
+
+    assert(desc && cols && desc->run);
+
+    row_id = desc->spot;
+    nReads = desc->run->rd.nReads;
+    assert(desc->nReads);
+    nReads = desc->nReads;
+
+    if (cols->nReadsAllocated != 0 && cols->nReadsAllocated < nReads) {
+        /* LOG */
+
+        /* TODO: find a better way/place to realloc cols data buffers */
+        free(cols->primary_alignment_id);
+        cols->primary_alignment_id = NULL;
+        free(cols->read_filter);
+        cols->read_filter = NULL;
+        free(cols->read_len);
+        cols->read_len = NULL;
+    }
+
+    status = _VCursorReadArray(self, row_id, cols->col_READ_LEN,
+        (void **)&cols->read_len, sizeof *cols->read_len, nReads,
+        "READ_LEN");
+    if (status != eVdbBlastNoErr)
+    {   return status; }
+
+    status = _VCursorReadArray(self, row_id, cols->col_READ_FILTER,
+        (void **)&cols->read_filter, sizeof *cols->read_filter, nReads,
+        "READ_FILTER");
+    if (status != eVdbBlastNoErr)
+    {   return status; }
+
+    if (cols->col_PRIMARY_ALIGNMENT_ID != 0) {
+        status = _VCursorReadArray(self, row_id, cols->col_PRIMARY_ALIGNMENT_ID,
+            (void **)&cols->primary_alignment_id,
+            sizeof *cols->primary_alignment_id, nReads, "PRIMARY_ALIGNMENT_ID");
+        if (status != eVdbBlastNoErr) {
+            return status;
+        }
+    }
+
+    cols->nReadsAllocated = nReads;
+
+    rc = VCursorReadDirect(self, row_id, cols->col_TRIM_LEN,
+        8 * sizeof cols->TRIM_LEN, &cols->TRIM_LEN, sizeof cols->TRIM_LEN,
+        &row_len);
+    if (rc != 0) {
+        PLOGERR(klogInt, (klogInt, rc, "Error in VCursorReadDirect"
+            " TRIM_LEN, spot=$(spot))", "spot=%ld", row_id));
+        return eVdbBlastErr;
+    }
+    else if (row_len != 1) {
+        STSMSG(1, ("Error: VCursorReadDirect(TRIM_LEN, spot=%lu) "
+            "returned row_len=%u", row_id, row_len));
+/* TODO */ return eVdbBlastErr;
+    }
+
+    rc = VCursorReadDirect(self, row_id, cols->col_TRIM_START,
+        8 * sizeof cols->TRIM_LEN, &cols->TRIM_START, sizeof cols->TRIM_START,
+        &row_len);
+    if (rc != 0) {
+        PLOGERR(klogInt, (klogInt, rc, "Error in VCursorReadDirect"
+            " TRIM_START, spot=$(spot))", "spot=%ld", row_id));
+        return eVdbBlastErr;
+    }
+    else if (row_len != 1) {
+        STSMSG(1, ("Error: VCursorReadDirect(TRIM_START, spot=%lu) "
+            "returned row_len=%u", row_id, row_len));
+/* TODO */ return eVdbBlastErr;
+    }
+
+    return status;
+}
+
+/******************************************************************************/
+
+static
+bool _ReadDescNextRead(ReadDesc *self, VdbBlastStatus *status)
+{
+    uint32_t read = 0;
+    int i = 0;
+    const RunDesc *rd = NULL;
+    uint8_t nReads = 1;
+
+    assert(self && self->run && status);
+
+    rd = &self->run->rd;
+
+    if (_VdbBlastRunVarReadNum(self->run)) {
+        bool found = false;
+        if (_ReadDescFindNextRead(self, &found)) {
+            S
+            return false;
+        }
+        else if (found) {
+            *status = _ReadDescFixReadId(self);
+            S
+            return true;
+        }
+        else {
+            S
+            return false;
+        }
+    }
+
+    if (rd->nBioReads == 0) {
+        S
+        return false;
+    }
+
+    if (self->tableId == VDB_READ_UNALIGNED) {
+        nReads = rd->nReads;
+    }
+
+    for (i = self->read + 1; i <= nReads; ++i) {
+        if (rd->readType[i - 1] & SRA_READ_TYPE_BIOLOGICAL) {
+            S
+            read = i;
+            break;
+        }
+    }
+
+    if (read == 0) {
+        if (++self->spot > rd->spotCount) {
+            S
+            return false;
+        }
+
+        for (i = 1; i <= nReads; ++i) {
+            if (rd->readType[i - 1] & SRA_READ_TYPE_BIOLOGICAL) {
+                S
+                read = i;
+                break;
+            }
+        }
+    }
+
+    if (read > 0) {
+        S
+        self->read = read;
+        ++self->read_id;
+        *status = _ReadDescFixReadId(self);
+    }
+    else
+    {   S }
+
+    return read;
+}
+
+static
+bool _ReadDescSameRun(const ReadDesc *self)
+{
+    assert(self);
+
+    if (self->prev == NULL && self->run == NULL) {
+        S
+        return false;
+    }
+
+    S
+    return self->prev == self->run;
+}
+
+/******************************************************************************/
+
+static uint64_t _Reader2naReset(Reader2na *self,
+    bool *alive, VdbBlastStatus *status)
+{
+    uint32_t mode = 0;
+    VdbBlastRun *run = NULL;
+    uint64_t read_id = 0;
+    uint64_t table_id = 0;
+
+    assert(self && alive);
+
+    mode = self->mode;
+    run = (VdbBlastRun*)self->desc.run;
+    read_id = self->desc.read_id;
+    table_id = self->desc.tableId;
+
+    VCursorRelease(self->curs);
+    ReaderColsFini(&self->cols);
+
+    _ReferencesWhack(self->refs);
+
+    memset(self, 0, sizeof *self);
+
+    if (table_id == VDB_READ_UNALIGNED && self->mode & VDB_READ_ALIGNED) {
+        read_id += _VdbBlastRunGetNumAlignments(run, status);
+        self->desc.tableId = VDB_READ_ALIGNED;
+        *alive = true;
+    }
+    else {
+        *alive = false;
+    }
+
+    self->mode = mode;
+
+    return read_id;
+}
+
+static
+bool _Reader2naEor(const Reader2na *self)
+{
+    assert(self);
+    S
+    return self->eor;
+}
+
+static uint32_t _Reader2naReadReaderCols(Reader2na *self) {
+    assert(self);
+    return _VCursorReadReaderCols(self->curs, &self->desc, &self->cols);
+}
+
+static
+uint32_t _Reader2naGetBlob(Reader2na *self,
+    const VBlob **blob,
+    const ReadDesc *desc,
+    int64_t *first,
+    uint64_t *count)
+{
+    bool fresh = false;
+
+    assert(self && blob && desc && first && count
+        && desc->run && desc->run->path);
+
+    for (fresh = false; ;) {
+        rc_t rc = 0;
+
+        if (*blob == NULL) {
+            rc = VCursorGetBlobDirect
+                (self->curs, blob, desc->spot, self->col_READ);
+            if (rc) {
+                PLOGERR(klogInt, (klogInt, rc, "Error in VCursorGetBlobDirect"
+                    "($(path), READ, spot=$(spot))",
+                    "path=%s,spot=%ld", desc->run->path, desc->spot));
+                return eVdbBlastErr;
+            }
+
+            fresh = true;
+        }
+
+        rc = VBlobIdRange(*blob, first, count);
+        if (rc) {
+            PLOGERR(klogInt, (klogInt, rc, "Error in VBlobIdRange($(path))",
+                "path=%s", desc->run->path));
+            return eVdbBlastErr;
+        }
+
+        if ((int64_t)desc->spot >= *first &&
+            desc->spot < *first + *count) {
+            S
+            return eVdbBlastNoErr;
+        }
+
+        if (fresh) {
+            S
+            return eVdbBlastErr;
+        }
+
+        rc = VBlobRelease(*blob);
+        *blob = NULL;
+        if (rc) {
+            PLOGERR(klogInt, (klogInt, rc, "Error in VBlobRelease($(path))",
+                "path=%s", desc->run->path));
+            return eVdbBlastErr;
+        }
+    }
+
+    S
+    return eVdbBlastErr;
+}
+
+static
+uint32_t _Reader2naCalcReadReaderColsParams(const ReadDesc *desc,
+    const ReaderCols *cols,
+    uint32_t *start,
+    uint32_t min_read_length)
+{
+    uint32_t i = 1;
+    uint32_t to_read = 0;
+    assert(desc && cols && start);
+    assert(desc->run && desc->run->path);
+
+    *start = 0;
+
+    assert(cols->read_len && cols->read_filter);
+    for (i = 1; i < desc->read; ++i) {
+        if (!_VdbBlastRunVarReadNum(desc->run)) {
+            assert(i <= desc->run->rd.nReads);
+        }
+
+        /* do not count CMP_READ-s where primary_alignment_id != 0
+           as are not stored in CMP_READ) */
+        if (!ReaderColsIsReadCompressed(cols, i - 1)) {
+            *start += cols->read_len[i - 1];
+        }
+    }
+    S
+
+    if (cols->read_len[desc->read - 1] == 0) {
+        S
+        DBGMSG(DBG_BLAST, DBG_FLAG(DBG_BLAST_BLAST),
+            ("%s: %s:%d:%d(%d): READ_LEN=0\n",
+            __func__, desc->run->path, desc->spot, desc->read, desc->read_id));
+        return 0;
+    }
+    else if (cols->read_filter[desc->read - 1] != READ_FILTER_PASS) {
+        S
+        DBGMSG(DBG_BLAST, DBG_FLAG(DBG_BLAST_BLAST),
+            ("%s: %s:%d:%d(%d): READ_FILTER != READ_FILTER_PASS\n",
+            __func__, desc->run->path, desc->spot, desc->read, desc->read_id));
+        return 0;
+    }
+    else if (cols->TRIM_LEN > 0
+        && *start >= cols->TRIM_START + cols->TRIM_LEN)
+    {
+        return 0;
+    }
+    else {
+        uint32_t end = 0;
+
+        /* do not count CMP_READ-s where primary_alignment_id != 0
+           as are not stored in CMP_READ) */
+        if (ReaderColsIsReadCompressed(cols, desc->read - 1)) {
+            to_read = 0;
+            S
+            DBGMSG(DBG_BLAST, DBG_FLAG(DBG_BLAST_BLAST),
+                ("%s: %s:%d:%d(%d): PRIMARY_ALIGNMENT_ID != 0\n", __func__,
+                 desc->run->path, desc->spot, desc->read, desc->read_id));
+        }
+        else {
+            to_read = cols->read_len[desc->read - 1];
+            end = *start + to_read;
+            if (cols->TRIM_LEN > 0 && cols->TRIM_START > (int32_t)*start) {
+                uint32_t delta = cols->TRIM_START - *start;
+                if (to_read > delta) {
+                    *start = cols->TRIM_START;
+                    to_read -= delta;
+                    assert(*start + to_read == end);
+                }
+                else {
+                    to_read = 0;
+                }
+            }
+        }
+        if (to_read > 0) {
+            if (cols->TRIM_LEN > 0 &&
+                end > (cols->TRIM_START + cols->TRIM_LEN))
+            {
+                uint32_t delta = end - (cols->TRIM_START + cols->TRIM_LEN);
+                assert(delta < to_read);
+                to_read -= delta;
+            }
+            if (to_read < min_read_length) {
+                S
+                DBGMSG(DBG_BLAST, DBG_FLAG(DBG_BLAST_BLAST),
+                    ("%s: %s:%d:%d(%d): READ_LEN=%d: TOO SHORT (<%d)\n",
+                    __func__, desc->run->path, desc->spot, desc->read,
+                    desc->read_id, cols->read_len[desc->read - 1],
+                    min_read_length));
+                return 0;
+            }
+            else {
+                DBGMSG(DBG_BLAST, DBG_FLAG(DBG_BLAST_BLAST),
+                    ("%s: %s:%d:%d(%d): READ_LEN=%d\n", __func__,
+                    desc->run->path, desc->spot, desc->read,
+                    desc->read_id, cols->read_len[desc->read - 1]));
+            }
+        }
+    }
+
+    return to_read;
+}
+
+static
+bool _Reader2naNextData(Reader2na *self,
+    const VBlob *blob,
+    uint32_t *status,
+    Packed2naRead *out,
+    uint32_t min_read_length)
+{
+    uint32_t start = 0;
+    uint32_t to_read = 0;
+    const ReadDesc *desc = NULL;
+    assert(self && status && out && self->curs);
+    desc = &self->desc;
+    memset(out, 0, sizeof *out);
+
+    *status = _Reader2naReadReaderCols(self);
+    if (*status != eVdbBlastNoErr) {
+        S
+        return false;
+    }
+    if (!self->curs || !desc->run) {
+        S
+        *status = eVdbBlastErr;
+        return false;
+    }
+
+    assert(self->cols.read_len && self->cols.read_filter);
+    if (!_VdbBlastRunVarReadNum(desc->run)) {
+        assert(desc->read <= desc->run->rd.nReads);
+    }
+
+    to_read = _Reader2naCalcReadReaderColsParams(&self->desc, &self->cols,
+        &start, min_read_length);
+    if (to_read == 0) {
+        return true;
+    }
+    else {
+        uint32_t elem_bits = 0;
+        rc_t rc = 0;
+
+        S
+        DBGMSG(DBG_BLAST, DBG_FLAG(DBG_BLAST_BLAST),
+            ("%s: %s:%d:%d(%d): READ_LEN=%d\n", __func__,
+            self->desc.run->path, self->desc.spot, self->desc.read,
+            self->desc.read_id, self->cols.read_len[desc->read - 1]));
+
+        rc = VBlobCellData(blob, desc->spot, &elem_bits,
+            (const void **)&out->starting_byte, &out->offset_to_first_bit,
+            &out->length_in_bases);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc, "Error during CellData "
+                "for $(acc)/READ/$(spot)) /2na",
+                "acc=%s,spot=%zu", self->desc.run->acc, self->desc.spot));
+            DBGMSG(DBG_BLAST, DBG_FLAG(DBG_BLAST_BLAST),
+               ("%s: %s:%d:%d(%d): READ_LEN=%d: "
+                "ERROR WHILE READING: SKIPPED FOR NOW\n", __func__,
+                self->desc.run->path, self->desc.spot, self->desc.read,
+                self->desc.read_id, self->cols.read_len[desc->read - 1]));
+            /* special case */
+            *status = eVdbBlastErr;
+            return true;
+        }
+
+        if (elem_bits != 2) {
+            S
+            *status = eVdbBlastErr;
+            return false;
+        }
+
+        if (out->length_in_bases < start) {
+            S
+            *status = eVdbBlastErr;
+            return false;
+        }
+
+        out->offset_to_first_bit += start * 2;
+        S
+
+        out->length_in_bases = to_read;
+        while (out->offset_to_first_bit >= 8) {
+            out->starting_byte = ((uint8_t*)out->starting_byte) + 1;
+            out->offset_to_first_bit -= 8;
+        }
+        out->read_id = desc->read_id;
+        S
+        return true;
+    }
+}
+
+static
+uint32_t _Reader2naData(Reader2na *self,
+    Data2na *data,
+    VdbBlastStatus *status,
+    Packed2naRead *buffer,
+    uint32_t buffer_length,
+    uint32_t min_read_length)
+{
+    ReadDesc *desc = NULL;
+    uint32_t n = 0;
+    int64_t first = 0;
+    uint64_t count = 0;
+    VdbBlastStatus dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+    *status = eVdbBlastErr;
+    if (buffer_length && buffer == NULL) {
+        S
+        return 0;
+    }
+
+    assert(self && self->curs && data);
+    desc = &self->desc;
+    *status = _Reader2naGetBlob(self, &data->blob, desc, &first, &count);
+    if (*status == eVdbBlastErr) {
+        S
+        return 0;
+    }
+
+    for (n = 0; n < buffer_length; ) {
+        Packed2naRead *p = buffer + n;
+        bool ignorable
+            = _Reader2naNextData(self, data->blob, status, p, min_read_length);
+        if (*status == eVdbBlastErr) {
+            if (ignorable) {
+                /* special case */
+                if (n > 0) { /* let's retry during next call */
+                    S
+                    *status = eVdbBlastNoErr;
+                }
+                else
+                {   S }
+                return n;
+            }
+            S
+            return 0;
+        }
+        if (p->length_in_bases > 0)
+        {   ++n; }
+        if (!_ReadDescNextRead(desc, status)) {
+            if (*status != eVdbBlastNoErr) {
+                return 0;
+            }
+            S
+            self->eor = true;
+            break;
+        }
+        if (desc->spot >= first + count) {
+            S
+            break;
+        }
+    }
+
+    *status = eVdbBlastNoErr;
+    return n;
+}
+/* struct Packed2naRead {
+    uint64_t read_id;
+    void *starting_byte;
+    uint32_t offset_to_first_bit;
+    uint32_t length_in_bases; }; */
+
+static
+uint64_t _Reader2naRead(Reader2na *self,
+    uint32_t *status,
+    uint64_t *read_id,
+    size_t *starting_base,
+    uint8_t *buffer,
+    size_t buffer_size,
+    uint32_t min_read_length)
+{
+    uint32_t num_read = 0;
+    uint32_t to_read = 0;
+    ReadDesc *desc = NULL;
+    uint32_t start = 0;
+    uint32_t remaining = 0;
+    rc_t rc = 0;
+    assert(self && status && read_id && starting_base);
+    desc = &self->desc;
+    *read_id = desc->read_id;
+    *starting_base = self->starting_base;
+
+    if (_Reader2naEor(self)) {
+        S
+        *status = eVdbBlastNoErr;
+        return 0;
+    }
+
+    *status = _Reader2naReadReaderCols(self);
+    if (*status != eVdbBlastNoErr) {
+        S
+        return 0;
+    }
+
+    *status = eVdbBlastErr;
+    if (!self->curs || !desc->run) {
+        S
+        return 0;
+    }
+
+    assert(desc->run->path);
+
+    *status = eVdbBlastNoErr;
+    if (!_VdbBlastRunVarReadNum(desc->run) && desc->run->rd.nBioReads == 0) {
+        S
+        return 0;
+    }
+
+    to_read = _Reader2naCalcReadReaderColsParams(&self->desc, &self->cols,
+        &start, min_read_length);
+    if (to_read <= self->starting_base) {
+        S
+        DBGMSG(DBG_BLAST, DBG_FLAG(DBG_BLAST_BLAST), (
+        "%s: %s:%d:%d(%d): READ_LEN=%d: TOO SHORT (starting_base=%d)\n",
+            __func__, desc->run->path, desc->spot, desc->read,
+            desc->read_id, self->cols.read_len[desc->read - 1],
+            self->starting_base));
+        to_read = 0;
+    }
+    else {
+        to_read -= (uint32_t)self->starting_base;
+        start   += (uint32_t)self->starting_base;
+    }
+    if (to_read > 0) {
+        S
+        rc = VCursorReadBitsDirect(self->curs, desc->spot, self->col_READ, 2,
+            start, buffer, 0, (uint32_t)buffer_size * 4, &num_read, &remaining);
+        if (rc) {
+            if (rc == SILENT_RC
+                (rcVDB, rcCursor, rcReading, rcBuffer, rcInsufficient))
+            {
+                S
+                rc = 0;
+                num_read = (uint32_t)buffer_size * 4;
+            }
+            else {
+                PLOGERR(klogInt, (klogInt, rc,
+                    "Error in VCursorReadBitsDirect"
+                    "($(path), READ, spot=$(spot))", "path=%s,spot=%ld",
+                    desc->run->path, desc->spot));
+                *status = eVdbBlastErr;
+                return 0;
+            }
+        }
+        *status
+            = (num_read == 0 && remaining == 0) ? eVdbBlastErr : eVdbBlastNoErr;
+        S
+    }
+
+    if (num_read >= to_read) {
+        self->starting_base = 0;
+        num_read = to_read;
+        if (!_ReadDescNextRead(desc, status))
+        {   self->eor = true; }
+        S
+    }
+    else {
+        self->starting_base += num_read;
+        S
+    }
+
+    return num_read;
+}
+
+static VdbBlastStatus _VdbBlastRunMakeReaderColsCursor(
+    const VdbBlastRun *self, const VCursor **curs, uint32_t *read_col_idx,
+    bool INSDC2na, ReaderCols *cols, const ReadDesc *desc)
+{
+    rc_t rc = 0;
+    const VTable *tbl = NULL;
+    bool cmpRead = false;
+    const char *read_col_name = INSDC2na ? "(INSDC:2na:packed)READ"
+                                         : "(INSDC:4na:bin)READ";
+    assert(self && self->obj && desc);
+
+    if (desc->tableId == VDB_READ_ALIGNED) {
+        tbl = self->obj->prAlgnTbl;
+    }
+    else {
+        tbl = self->obj->seqTbl;
+        cmpRead = self->cSra;
+    }
+
+    if (cmpRead) {
+        read_col_name = INSDC2na ? "(INSDC:2na:packed)CMP_READ"
+                                 : "(INSDC:4na:bin)CMP_READ";
+    }
+
+    rc = _VTableMakeCursor(tbl, curs, read_col_idx, read_col_name, self->acc);
+
+    if (rc == 0) {
+        assert(*curs);
+        return _VCursorAddReaderCols(*curs, cols, cmpRead, desc->tableId);
+    }
+
+    return eVdbBlastErr;
+}
+
+static VdbBlastStatus _Reader2naOpenCursor(Reader2na *self) {
+    const ReadDesc *desc = NULL;
+    const VdbBlastRun *run = NULL;
+
+    assert(self);
+
+    desc = &self->desc;
+    run = desc->run;
+
+    assert(run && self->curs == NULL && run->obj);
+
+    return _VdbBlastRunMakeReaderColsCursor(run, &self->curs, &self->col_READ,
+        true, &self->cols, desc);
+    /*return _VTableMakeReaderColsCursor(run->obj->seqTbl, &self->curs,
+        &self->col_READ, true, &self->cols, run->cSra);*/
+}
+
+/******************************************************************************/
+
+void _Core2naFini(Core2na *self) {
+    VdbBlastStatus status;
+    bool keep = false;
+    assert(self);
+    _Reader2naReset(&self->reader, &keep, &status);
+    KLockRelease(self->mutex);
+    memset(self, 0, sizeof *self);
+}
+
+static
+uint32_t _Core2naOpen1stRun(Core2na *self,
+    RunSet *runs,
+    uint64_t initial_read_id)
+{
+    Reader2na *reader = NULL;
+    VdbBlastStatus status = eVdbBlastNoErr;
+
+    assert(self && runs);
+
+    reader = &self->reader;
+
+    if (reader->curs) {
+        return eVdbBlastNoErr;
+    }
+
+    if (runs->run && runs->krun) {
+        self->initial_read_id = initial_read_id;
+        if (reader->mode != VDB_READ_REFERENCE) {
+            status = _RunSetFindReadDesc
+                (runs, initial_read_id, &reader->desc);
+            if (status == eVdbBlastNoErr) {
+                status = _Reader2naOpenCursor(reader);
+                if (status != eVdbBlastNoErr) {
+                    bool keep = true;
+                    S
+                    _Reader2naReset(reader, &keep, &status);
+                }
+            }
+            else
+            {   S }
+        }
+        else if (reader->refs == NULL) {
+            reader->refs = _RunSetMakeReferences(runs, &status);
+            if (reader->refs == NULL) {
+                status = eVdbBlastErr;
+            }
+        }
+    }
+    else {
+        S
+        self->eos = true;
+    }
+
+    return status;
+}
+
+static VdbBlastStatus _Core2naOpenNextRunOrTbl
+    (Core2na *core, const RunSet *runs)
+{
+    VdbBlastStatus status = eVdbBlastNoErr;
+    uint64_t read_id = 0;
+    ReadDesc *desc = NULL;
+    Reader2na *reader = NULL;
+    bool keep = true;
+
+    assert(core && runs);
+
+    reader = &core->reader;
+    desc = &reader->desc;
+
+    assert(desc->run);
+
+    read_id = _Reader2naReset(reader, &keep, &status) + 1;
+    if (status != eVdbBlastNoErr) {
+        return status;
+    }
+
+    if (!keep) {
+        if (core->irun >= runs->krun - 1) { /* No more runs to read */
+            S
+            core->eos = true;
+            return eVdbBlastNoErr;
+        }
+        ++core->irun;
+    }
+
+    while (core->irun < runs->krun) {
+        uint32_t status = eVdbBlastNoErr;
+
+        VdbBlastRun *run = &runs->run[core->irun];
+        if (run == NULL) {
+            S
+            return eVdbBlastErr;
+        }
+
+        status = _VdbBlastRunFillReadDesc(run, 0, desc);
+        if (status != eVdbBlastNoErr) {
+            S
+            return status;
+        }
+
+        desc->read_id = read_id;
+        status = _ReadDescFixReadId(desc);
+        if (status != eVdbBlastNoErr) {
+            return status;
+        }
+        status = _Reader2naOpenCursor(reader);
+        if (status == eVdbBlastNoErr) {
+            S
+        }
+        else {
+            S
+        }
+
+        return status;
+    }
+
+    S
+    return eVdbBlastNoErr;
+}
+
+static
+uint32_t _Core2naDataSeq(Core2na *self,
+    Data2na *data,
+    const RunSet *runs,
+    VdbBlastStatus *status,
+    Packed2naRead *buffer,
+    uint32_t buffer_length)
+{
+    uint32_t num_read = 0;
+
+    assert(self && data && status && runs);
+
+    *status = eVdbBlastNoErr;
+
+    while (*status == eVdbBlastNoErr && num_read == 0) {
+        if (_Reader2naEor(&self->reader) || data->irun != self->irun) {
+            S
+            VBlobRelease(data->blob);
+            data->blob = NULL;
+        }
+        if (_Reader2naEor(&self->reader)) {
+            S
+            *status = _Core2naOpenNextRunOrTbl(self, runs);
+            if (*status != eVdbBlastNoErr) {
+                STSMSG(1, ("Error: "
+                    "failed to VdbBlast2naReaderData: cannot open next read"));
+                return 0;
+            }
+        }
+        if (data->irun != self->irun)
+        {   data->irun = self->irun; }
+
+        if (self->eos) {
+            STSMSG(1, ("VdbBlast2naReaderData: End Of Set"));
+            return 0;
+        }
+
+        num_read = _Reader2naData(&self->reader, data, status,
+            buffer, buffer_length, self->min_read_length);
+    }
+
+    if (*status == eVdbBlastNoErr) {
+        STSMSG(3, ("VdbBlast2naReaderData = %ld", num_read));
+    }
+    else {
+        STSMSG(1, ("Error: failed to VdbBlast2naReaderData"));
+    }
+
+    return num_read;
+}
+
+static
+uint32_t _Core2naData(Core2na *self,
+    Data2na *data,
+    const RunSet *runs,
+    VdbBlastStatus *status,
+    Packed2naRead *buffer,
+    uint32_t buffer_length)
+{
+    assert(self);
+
+    if (self->reader.mode != VDB_READ_REFERENCE) {
+        return _Core2naDataSeq(self, data, runs, status, buffer, buffer_length);
+    }
+    else {
+        return _Core2naDataRef(self, data, status, buffer, buffer_length);
+    }
+}
+
+static
+uint64_t _Core2naReadSeq(Core2na *self,
+    const RunSet *runs,
+    uint32_t *status,
+    uint64_t *read_id,
+    size_t *starting_base,
+    uint8_t *buffer,
+    size_t buffer_size)
+{
+    uint64_t num_read = 0;
+
+    assert(self && status && runs);
+
+    if (buffer_size == 0) {
+        S
+        *status = eVdbBlastErr;
+        return 0;
+    }
+
+    *status = eVdbBlastNoErr;
+
+    while (*status == eVdbBlastNoErr && num_read == 0) {
+        if (_Reader2naEor(&self->reader)) {
+            S
+            *status = _Core2naOpenNextRunOrTbl(self, runs);
+            if (*status != eVdbBlastNoErr) {
+                S
+                return 0;
+            }
+        }
+
+        if (self->eos) {
+            S
+            return 0;
+        }
+
+        num_read = _Reader2naRead(&self->reader, status,
+            read_id, starting_base, buffer, buffer_size, self->min_read_length);
+        S
+    }
+
+    return num_read;
+}
+
+uint64_t _Core2naRead(Core2na *self, const RunSet *runs,
+    uint32_t *status, uint64_t *read_id, size_t *starting_base,
+    uint8_t *buffer, size_t buffer_size)
+{
+    assert(self);
+
+    if (self->reader.mode != VDB_READ_REFERENCE) {
+        return _Core2naReadSeq(self, runs, status,
+            read_id, starting_base, buffer, buffer_size);
+    }
+    else {
+        return _Core2naReadRef(self, status, read_id, buffer, buffer_size);
+    }
+}
+
+void _Core4naFini(Core4na *self) {
+    assert(self);
+
+    VCursorRelease(self->curs);
+    VBlobRelease(self->blob);
+    KLockRelease(self->mutex);
+
+    ReaderColsFini(&self->cols);
+
+    memset(self, 0, sizeof *self);
+}
+
+static size_t _Core4naReadSeq(Core4na *self, const RunSet *runs,
+    uint32_t *status, uint64_t read_id, size_t starting_base,
+    uint8_t *buffer, size_t buffer_length)
+{
+    uint32_t num_read = 0;
+    ReadDesc *desc = NULL;
+    assert(self && runs && status);
+    desc = &((Core4na*)self)->desc;
+
+    *status = _RunSetFindReadDesc(runs, read_id, desc);
+    if (*status != eVdbBlastNoErr) {
+        S
+    }
+    else {
+        rc_t rc = 0;
+        if (!_ReadDescSameRun(desc)) {
+            S
+            ReaderColsReset(&self->cols);
+            VCursorRelease(self->curs);
+            ((Core4na*)self)->curs = NULL;
+            assert(desc->run && desc->run->obj);
+            *status = _VdbBlastRunMakeReaderColsCursor(desc->run,
+                &((Core4na*)self)->curs, &((Core4na*)self)->col_READ, false,
+                &(((Core4na*)self)->cols), desc);
+            S
+        }
+
+        if (*status == eVdbBlastNoErr && rc == 0) {
+            uint32_t remaining = 0;
+            uint32_t start = 0;
+            uint32_t to_read = 0;
+            assert(desc->run && desc->read <= desc->run->rd.nReads
+                && desc->run->path);
+            *status = _VCursorReadReaderCols(self->curs,
+                desc, &((Core4na*)self)->cols);
+            if (*status == eVdbBlastNoErr) {
+                assert(self->cols.read_len && self->cols.read_filter);
+                to_read = _Reader2naCalcReadReaderColsParams(&self->desc,
+                    &self->cols, &start, self->min_read_length);
+                if (to_read == 0) {
+                    /* When _Reader2naCalcReadReaderColsParams returns 0
+                    then this read is skipped by 2na reader (usually filtered)
+                    and should not be accessed by 4na reader */
+                    *status = eVdbBlastInvalidId;
+                    S
+                }
+                else {
+                    if (to_read >= starting_base) {
+                        to_read -= (uint32_t)starting_base;
+                        start   += (uint32_t)starting_base;
+                        if (buffer_length < to_read) {
+                            to_read = (uint32_t)buffer_length;
+                        }
+                        S
+                        rc = VCursorReadBitsDirect(self->curs,
+                            desc->spot, self->col_READ, 8,
+                            start, buffer, 0, to_read, &num_read, &remaining);
+                        if (rc != 0) {
+                            PLOGERR(klogInt, (klogInt, rc,
+                                "Error in VCursorReadBitsDirect"
+                                "($(path), READ, spot=$(spot))",
+                                "path=%s,spot=%ld",
+                                desc->run->path, desc->spot));
+                        }
+                    }
+                    else {
+                        S
+                        *status = eVdbBlastErr;
+                    }
+                }
+            }
+        }
+
+        if (*status == eVdbBlastNoErr)
+        {   *status = rc ? eVdbBlastErr : eVdbBlastNoErr; }
+    }
+
+    S
+    return num_read;
+}
+
+static size_t _Core4naRead(Core4na *self, const RunSet *runs,
+    uint32_t *status, uint64_t read_id, size_t starting_base,
+    uint8_t *buffer, size_t buffer_length)
+{
+    assert(self);
+
+    if (self->mode != VDB_READ_REFERENCE) {
+        return _Core4naReadSeq(self, runs, status,
+            read_id, starting_base, buffer, buffer_length);
+    }
+    else {
+        return _Core4naReadRef(self, runs, status,
+            read_id, starting_base, buffer, buffer_length);
+    }
+}
+
+static const uint8_t* _Core4naDataSeq(Core4na *self, const RunSet *runs,
+    uint32_t *status, uint64_t read_id, size_t *length)
+{
+    ReadDesc *desc = NULL;
+    assert(self && runs && status && length);
+    desc = &self->desc;
+
+    *length = 0;
+
+    *status = _RunSetFindReadDesc(runs, read_id, desc);
+    if (*status != eVdbBlastNoErr)
+    {   S }
+    else {
+        rc_t rc = 0;
+        const uint8_t *base = NULL;
+        if (!_ReadDescSameRun(desc)) {
+            S
+            ReaderColsReset(&self->cols);
+            VCursorRelease(self->curs);
+            self->curs = NULL;
+            assert(desc->run && desc->run->obj);
+            *status = _VdbBlastRunMakeReaderColsCursor(desc->run, &self->curs,
+                &self->col_READ, false, &self->cols, desc);
+            S
+        }
+
+        if (*status == eVdbBlastNoErr) {
+            *status = _VCursorReadReaderCols(self->curs, desc, &self->cols);
+            S
+        }
+
+        if (rc == 0 && *status == eVdbBlastNoErr) {
+            assert(self->cols.read_len && self->cols.read_filter
+                && desc->run->path);
+
+            if (self->cols.read_filter[desc->read - 1]
+                != READ_FILTER_PASS)
+            {   /* FILTERed reads are not returned by 2na reader:
+                   4na readed should not ask for them */
+                *status = eVdbBlastInvalidId;
+                S
+            }
+            else if (ReaderColsIsReadCompressed(&self->cols, desc->read - 1)) {
+                /* Compressed CMP_READs are not returned by 2na reader:
+                   4na readed should not ask for them */
+                *status = eVdbBlastInvalidId; /*  */
+                S
+            }
+            else {
+                if (self->blob) {
+                    VBlobRelease(self->blob);
+                    self->blob = NULL;
+                }
+
+                if (rc == 0 && *status == eVdbBlastNoErr) {
+                    rc = VCursorGetBlobDirect
+                        (self->curs, &self->blob, desc->spot, self->col_READ);
+                    if (rc != 0) {
+                        PLOGERR(klogInt, (klogInt, rc,
+                            "Error in VCursorGetBlobDirect"
+                            "($(path), READ, spot=$(spot))",
+                            "path=%s,spot=%ld", desc->run->path, desc->spot));
+                    }
+                }
+
+                if (rc == 0 && *status == eVdbBlastNoErr) {
+                    uint32_t boff = 0;
+                    uint32_t elem_bits = 0;
+                    uint32_t row_len = 0;
+
+                    rc = VBlobCellData(self->blob, desc->spot,
+                        &elem_bits, (const void**)&base, &boff, &row_len);
+                    if (rc != 0) {
+                        PLOGERR(klogInt, (klogInt, rc, "Error in VBlobCellData"
+                            "$(path), READ, spot=$(spot))",
+                            "path=%s,spot=%ld", desc->run->path, desc->spot));
+                    }
+                    else {
+                        if (elem_bits != 8) {
+                            S
+                            *status = eVdbBlastErr;
+                            base = NULL;
+                        }
+                        else {
+                            size_t to_read
+                                = self->cols.read_len[desc->read - 1];
+
+                            if (to_read < self->min_read_length) {
+                                S
+                                /* NOP */
+                            }
+                            else {
+                                uint32_t start = 0;
+                                to_read = _Reader2naCalcReadReaderColsParams(
+                                    &self->desc, &self->cols,
+                                    &start, self->min_read_length);
+                                base += boff + start;
+                                if (row_len >= start) {
+                                    row_len -= start;
+                                    if (to_read > row_len) {
+                                        S
+                                        *status = eVdbBlastErr;
+                                    }
+                                    else {
+                                        S
+                                        *length = to_read;
+                                        *status = eVdbBlastNoErr;
+                                    }
+                                }
+                                else {
+                                    S
+                                    *status = eVdbBlastErr;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        if (*status == eVdbBlastNoErr) {
+            if (rc != 0)
+            {   *status = eVdbBlastErr; }
+        }
+
+        return base;
+    }
+
+    return NULL;
+}
+
+static const uint8_t* _Core4naData(Core4na *self, const RunSet *runs,
+    uint32_t *status, uint64_t read_id, size_t *length)
+{
+    assert(self);
+
+    if (self->mode != VDB_READ_REFERENCE) {
+        return _Core4naDataSeq(self, runs, status, read_id, length);
+    }
+    else {
+        return _Core4naDataRef(self, runs, status, read_id, length);
+    }
+}
+
+/******************************************************************************/
+
+static const char VDB_BLAST_2NA_READER[] = "VdbBlast2naReader";
+
+struct VdbBlast2naReader {
+    KRefcount refcount;
+    VdbBlastRunSet *set;
+    Data2na data;
+    KVdbBlastReadMode mode;
+};
+
+static
+VdbBlast2naReader *_VdbBlastRunSetMake2naReader(VdbBlastRunSet *self,
+    VdbBlastStatus *status,
+    uint64_t initial_read_id,
+    Core2na *core2na,
+    KVdbBlastReadMode mode)
+{
+    VdbBlast2naReader *item = NULL;
+    assert(self && status);
+    if (core2na == NULL) {
+        core2na
+            = mode != VDB_READ_REFERENCE ? &self->core2na : &self->core2naRef;
+    }
+    else {
+        core2na->initial_read_id = initial_read_id;
+    }
+    core2na->reader.mode = mode;
+    if (!core2na->hasReader) {
+        _VdbBlastRunSetBeingRead(self);
+        *status = _Core2naOpen1stRun(core2na, &self->runs, initial_read_id);
+        if (*status != eVdbBlastNoErr) {
+            STSMSG(1, ("Error: failed to create VdbBlast2naReader: "
+                "cannot open the first read"));
+            return NULL;
+        }
+        core2na->initial_read_id = initial_read_id;
+        core2na->reader.mode = mode;
+        core2na->hasReader = true;
+    }
+    else if (core2na->initial_read_id != initial_read_id) {
+        STSMSG(1, ("Error: failed to create VdbBlast2naReader"
+            "(initial_read_id=%ld): allowed initial_read_id=%ld",
+            initial_read_id, core2na->initial_read_id));
+        *status = eVdbBlastErr;
+        return NULL;
+    }
+    else if (core2na->reader.mode != mode) {
+        STSMSG(1, ("Error: failed to create VdbBlast2naReader"
+            "(mode=%d): allowed mode=%d", mode, core2na->reader.mode));
+        *status = eVdbBlastErr;
+        return NULL;
+    }
+    item = calloc(1, sizeof *item);
+    if (item == NULL) {
+        *status = eVdbBlastMemErr;
+        return NULL;
+    }
+
+    item->set = VdbBlastRunSetAddRef((VdbBlastRunSet*)self);
+    item->mode = mode;
+
+    KRefcountInit(&item->refcount, 1,
+        VDB_BLAST_2NA_READER, __func__, "2naReader");
+
+    *status = eVdbBlastNoErr;
+
+    return item;
+}
+
+LIB_EXPORT
+VdbBlast2naReader* CC VdbBlastRunSetMake2naReaderExt(const VdbBlastRunSet *self,
+    VdbBlastStatus *status,
+    uint64_t initial_read_id,
+    KVdbBlastReadMode mode)
+{
+    VdbBlast2naReader *item = NULL;
+    KLock *mutex = NULL;
+
+    VdbBlastStatus dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    if (self) {
+        rc_t rc = 0;
+        mutex = mode != VDB_READ_REFERENCE
+            ? self->core2na.mutex : self->core2naRef.mutex;
+        assert(mutex);
+        rc = KLockAcquire(mutex);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error in KLockAcquire");
+        }
+        else {
+            item = _VdbBlastRunSetMake2naReader
+                ((VdbBlastRunSet*)self, status, initial_read_id, NULL, mode);
+            rc = KLockUnlock(mutex);
+            if (rc != 0) {
+                LOGERR(klogInt, rc, "Error in KLockUnlock");
+                VdbBlast2naReaderRelease(item);
+                item = NULL;
+            }
+        }
+        if (rc != 0) {
+            *status = eVdbBlastErr;
+        }
+    }
+    else {
+        *status = eVdbBlastErr;
+    }
+
+    if (item != NULL) {
+        STSMSG(1, (
+            "Created VdbBlast2naReader(initial_read_id=%ld)", initial_read_id));
+    }
+    else {
+        STSMSG(1, ("Error: failed to create "
+            "VdbBlast2naReader(initial_read_id=%ld)", initial_read_id));
+    }
+
+    return item;
+}
+
+LIB_EXPORT
+VdbBlast2naReader* CC VdbBlastRunSetMake2naReader(const VdbBlastRunSet *self,
+    uint32_t *status,
+    uint64_t initial_read_id)
+{
+    return VdbBlastRunSetMake2naReaderExt(self, status, initial_read_id,
+        VDB_READ_UNALIGNED);
+}
+
+LIB_EXPORT
+VdbBlast2naReader* CC VdbBlast2naReaderAddRef(VdbBlast2naReader *self)
+{
+    if (self == NULL) {
+        STSMSG(1, ("VdbBlast2naReaderAddRef(NULL)"));
+        return self;
+    }
+
+    if (KRefcountAdd(&self->refcount, VDB_BLAST_2NA_READER)
+        == krefOkay)
+    {
+        STSMSG(1, ("VdbBlast2naReaderAddRef"));
+        return self;
+    }
+
+    STSMSG(1, ("Error: failed to VdbBlast2naReaderAddRef"));
+    return NULL;
+}
+
+static
+void _VdbBlast2naReaderWhack(VdbBlast2naReader *self)
+{
+    if (self == NULL) {
+        return;
+    }
+
+    if (self->set != NULL) {
+        STSMSG(1, ("Deleting VdbBlast2naReader(initial_read_id=%ld)",
+            self->set->core2na.initial_read_id));
+    }
+    else {
+        STSMSG(1, ("Deleting VdbBlast2naReader(self->set=NULL)",
+            self->set->core2na.initial_read_id));
+    }
+
+    VBlobRelease(self->data.blob);
+    VdbBlastRunSetRelease(self->set);
+
+    memset(self, 0, sizeof *self);
+
+    free(self);
+}
+
+LIB_EXPORT
+void CC VdbBlast2naReaderRelease(VdbBlast2naReader *self)
+{
+    if (self == NULL) {
+        return;
+    }
+
+    STSMSG(1, ("VdbBlast2naReaderRelease"));
+    if (KRefcountDrop(&self->refcount, VDB_BLAST_2NA_READER) != krefWhack) {
+        return;
+    }
+
+    _VdbBlast2naReaderWhack(self);
+}
+
+LIB_EXPORT
+uint64_t CC _VdbBlast2naReaderRead(const VdbBlast2naReader *self,
+    uint32_t *status,
+    uint64_t *read_id,
+    size_t *starting_base,
+    uint8_t *buffer,
+    size_t buffer_size)
+{
+    uint32_t dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    if (self == NULL) {
+        *status = eVdbBlastErr;
+        return 0;
+    }
+
+    return _VdbBlastRunSet2naRead(self->set, status, read_id,
+        starting_base, buffer, buffer_size, self->mode);
+}
+
+LIB_EXPORT
+uint64_t CC VdbBlast2naReaderRead(const VdbBlast2naReader *self,
+    uint32_t *status,
+    uint64_t *read_id,
+    uint8_t *buffer,
+    size_t buffer_size)
+{
+    size_t starting_base = 0;
+
+    return _VdbBlast2naReaderRead(self,
+        status, read_id, &starting_base, buffer, buffer_size);
+}
+
+LIB_EXPORT
+uint32_t CC VdbBlast2naReaderData(VdbBlast2naReader *self,
+    uint32_t *status,
+    Packed2naRead *buffer,
+    uint32_t buffer_length)
+{
+    bool verbose = false;
+    uint32_t n = 0;
+    rc_t rc = 0;
+    const Core2na *core2na = NULL;
+
+    uint32_t dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    *status = eVdbBlastErr;
+
+    if (self == NULL)
+    {   return 0; }
+
+    if ((buffer_length != 0 && buffer == NULL) || (buffer_length == 0))
+    {   return 0; }
+
+    *status = eVdbBlastNoErr;
+
+    assert(self->set);
+
+    core2na = self->mode != VDB_READ_REFERENCE
+        ? &self->set->core2na : &self->set->core2naRef;
+
+    rc = KLockAcquire(core2na->mutex);
+    if (rc != 0) {
+        LOGERR(klogInt, rc, "Error in KLockAcquire");
+    }
+    if (0 && verbose) {
+        char b[256];
+        string_printf(b, sizeof b, NULL, "KLockAcquire(%p)\n", core2na->mutex);
+        assert(!rc);
+        fprintf(stderr, "%s", b);
+        fflush(stderr);
+    }
+    if (rc == 0) {
+        n = _Core2naData((Core2na*)core2na, &self->data,
+            &self->set->runs, status, buffer, buffer_length);
+        S
+        if (n > 0 && verbose)
+        {   _Packed2naReadPrint(buffer, self->data.blob); }
+        if (0 && verbose) {
+            char b[256];
+            string_printf(b, sizeof b, NULL, "KLockUnlock(%p)\n",
+                core2na->mutex);
+            assert(!rc);
+            fprintf(stderr, "%s", b);
+            fflush(stderr);
+        }
+        rc = KLockUnlock(core2na->mutex);
+        if (rc != 0)
+        {   LOGERR(klogInt, rc, "Error in KLockUnlock"); }
+    }
+    if (rc)
+    {   *status = eVdbBlastErr; }
+
+    S
+    return n;
+}
+
+/******************************************************************************/
+static const char VDB_BLAST_4NA_READER[] = "VdbBlast4naReader";
+
+struct VdbBlast4naReader {
+    KRefcount refcount;
+    VdbBlastRunSet *set;
+    KVdbBlastReadMode mode;
+};
+
+LIB_EXPORT
+VdbBlast4naReader* CC VdbBlastRunSetMake4naReaderExt(const VdbBlastRunSet *self,
+    uint32_t *status,
+    KVdbBlastReadMode mode)
+{
+    uint32_t dummy = eVdbBlastNoErr;
+    if (status == NULL) {
+        status = &dummy;
+    }
+
+    if (self) {
+        VdbBlast4naReader *item = calloc(1, sizeof *item);
+        if (item == NULL) {
+            *status = eVdbBlastMemErr;
+            return NULL;
+        }
+
+        item->set = VdbBlastRunSetAddRef((VdbBlastRunSet*)self);
+        item->mode = mode;
+
+        KRefcountInit(&item->refcount, 1,
+            VDB_BLAST_4NA_READER, __func__, "4naReader");
+
+        _VdbBlastRunSetBeingRead(self);
+
+        *status = eVdbBlastNoErr;
+
+        STSMSG(1, ("Created VdbBlast4naReader"));
+
+        return item;
+    }
+    else {
+        *status = eVdbBlastErr;
+
+        STSMSG(1, ("VdbBlastRunSetMake4naReader(self=NULL)"));
+
+        return NULL;
+    }
+}
+
+LIB_EXPORT
+VdbBlast4naReader* CC VdbBlastRunSetMake4naReader(const VdbBlastRunSet *self,
+    uint32_t *status)
+{
+    return VdbBlastRunSetMake4naReaderExt(self, status, VDB_READ_UNALIGNED);
+}
+
+LIB_EXPORT
+VdbBlast4naReader* CC VdbBlast4naReaderAddRef(VdbBlast4naReader *self)
+{
+    if (self == NULL) {
+        STSMSG(1, ("VdbBlast4naReaderAddRef(NULL)"));
+        return self;
+    }
+
+    if (KRefcountAdd(&self->refcount, VDB_BLAST_4NA_READER)
+        == krefOkay)
+    {
+        STSMSG(1, ("VdbBlast4naReaderAddRef"));
+        return self;
+    }
+
+    STSMSG(1, ("Error: failed to VdbBlast4naReaderAddRef"));
+    return NULL;
+}
+
+LIB_EXPORT
+void CC VdbBlast4naReaderRelease(VdbBlast4naReader *self)
+{
+    if (self == NULL)
+    {   return; }
+
+    STSMSG(1, ("VdbBlast4naReaderRelease"));
+    if (KRefcountDrop(&self->refcount, VDB_BLAST_4NA_READER) != krefWhack)
+    {   return; }
+
+    STSMSG(1, ("Deleting VdbBlast4naReader"));
+
+    VdbBlastRunSetRelease(self->set);
+
+    memset(self, 0, sizeof *self);
+    free(self);
+}
+
+LIB_EXPORT
+size_t CC VdbBlast4naReaderRead(const VdbBlast4naReader *self,
+    uint32_t *status,
+    uint64_t read_id,
+    size_t starting_base,
+    uint8_t *buffer,
+    size_t buffer_length)
+{
+    size_t n = 0;
+    rc_t rc = 0;
+    Core4na *c = NULL;
+
+    uint32_t dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    if (self == NULL) {
+        S
+        *status = eVdbBlastErr;
+        return 0;
+    }
+
+    assert(self->set);
+
+    c = self->mode != VDB_READ_REFERENCE
+        ? &self->set->core4na : &self->set->core4naRef;
+
+    rc = KLockAcquire(c->mutex);
+    if (rc != 0) {
+        LOGERR(klogInt, rc, "Error in KLockAcquire");
+    }
+    else {
+        n = _Core4naRead(c, &self->set->runs, status,
+            read_id, starting_base, buffer, buffer_length);
+        rc = KLockUnlock(c->mutex);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error in KLockUnlock");
+        }
+    }
+    if (rc != 0) {
+        *status = eVdbBlastErr;
+    }
+
+    if (*status == eVdbBlastNoErr) {
+        STSMSG(3, (
+            "VdbBlast4naReaderRead(read_id=%ld, starting_base=%ld) = %ld",
+            read_id, starting_base, n));
+    }
+    else {
+        STSMSG(2, ("Error: failed to "
+            "VdbBlast4naReaderRead(read_id=%ld, starting_base=%ld)",
+            read_id, starting_base));
+    }
+
+    return n;
+}
+
+LIB_EXPORT
+const uint8_t* CC VdbBlast4naReaderData(const VdbBlast4naReader *self,
+    uint32_t *status,
+    uint64_t read_id,
+    size_t *length)
+{
+    const uint8_t *d = NULL;
+    rc_t rc = 0;
+    Core4na *c = NULL;
+
+    uint32_t dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    if (self == NULL || length == NULL) {
+        if (self == NULL)
+        {   STSMSG(1, ("VdbBlast4naReaderData(self=NULL)")); }
+        if (length == NULL)
+        {   STSMSG(1, ("VdbBlast4naReaderData(length=NULL)")); }
+        *status = eVdbBlastErr;
+        return 0;
+    }
+
+    assert(self->set);
+
+    c = self->mode != VDB_READ_REFERENCE
+        ? &self->set->core4na : &self->set->core4naRef;
+
+    rc = KLockAcquire(c->mutex);
+    if (rc != 0) {
+        LOGERR(klogInt, rc, "Error in KLockAcquire");
+    }
+    else {
+        d = _Core4naData(c, &self->set->runs, status, read_id, length);
+        rc = KLockUnlock(c->mutex);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error in KLockUnlock");
+        }
+    }
+    if (rc) {
+        *status = eVdbBlastErr;
+    }
+
+    if (*status == eVdbBlastNoErr) {
+        STSMSG(3, ("VdbBlast4naReaderData(read_id=%ld, length=%ld)",
+            read_id, *length));
+    }
+    else {
+        STSMSG(1, ("Error: failed to VdbBlast4naReaderData(read_id=%ld)",
+            read_id));
+    }
+
+    return d;
+}
+
+/******************************************************************************/
+static const char VDB_BLAST_AA_READER[] = "VdbBlastStdaaReader";
+
+struct VdbBlastStdaaReader {
+    KRefcount refcount;
+};
+
+LIB_EXPORT
+VdbBlastStdaaReader* CC VdbBlastRunSetMakeStdaaReader(
+    const VdbBlastRunSet *self,
+    uint32_t *status)
+{
+    VdbBlastStdaaReader *item = NULL;
+
+    uint32_t dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    item = calloc(1, sizeof *item);
+    if (item == NULL) {
+        *status = eVdbBlastMemErr;
+        STSMSG(1, ("Error: failed to create VdbBlastStdaaReader"));
+        return NULL;
+    }
+
+    KRefcountInit(&item->refcount, 1,
+        VDB_BLAST_AA_READER, __func__, "aaReader");
+
+    _VdbBlastRunSetBeingRead(self);
+
+    *status = eVdbBlastNoErr;
+
+    STSMSG(1, ("Created VdbBlastStdaaReader"));
+
+    return item;
+}
+
+LIB_EXPORT
+VdbBlastStdaaReader* CC VdbBlastStdaaReaderAddRef(
+    VdbBlastStdaaReader *self)
+{
+    if (self == NULL) {
+        STSMSG(1, ("VdbBlastStdaaReaderAddRef(NULL)"));
+        return self;
+    }
+
+    if (KRefcountAdd(&self->refcount, VDB_BLAST_AA_READER) == krefOkay) {
+        STSMSG(1, ("VdbBlastStdaaReaderAddRef"));
+        return self;
+    }
+
+    STSMSG(1, ("Error: failed to VdbBlastStdaaReaderAddRef"));
+    return NULL;
+}
+
+LIB_EXPORT
+void CC VdbBlastStdaaReaderRelease(VdbBlastStdaaReader *self)
+{
+    if (self == NULL)
+    {   return; }
+
+    STSMSG(1, ("VdbBlastStdaaReaderRelease"));
+    if (KRefcountDrop(&self->refcount, VDB_BLAST_AA_READER) != krefWhack)
+    {   return; }
+
+    STSMSG(1, ("Deleting VdbBlastStdaaReader"));
+    free(self);
+    memset(self, 0, sizeof *self);
+}
+
+LIB_EXPORT
+size_t CC VdbBlastStdaaReaderRead(const VdbBlastStdaaReader *self,
+    uint32_t *status,
+    uint64_t pig,
+    uint8_t *buffer,
+    size_t buffer_length)
+{   return _NotImplemented(__func__); }
+
+LIB_EXPORT
+const uint8_t* CC VdbBlastStdaaReaderData(const VdbBlastStdaaReader *self,
+    uint32_t *status,
+    uint64_t pig,
+    size_t *length)
+{   return _NotImplementedP(__func__); }
+
+
+/******************************************************************************/
+
+static const char VDB_BLAST_REFERENCE_SET[] = "VdbBlastReferenceSet";
+
+struct VdbBlastReferenceSet {
+    KRefcount refcount;
+    const VdbBlastRunSet *rs;
+};
+
+
+LIB_EXPORT VdbBlastReferenceSet* CC VdbBlastRunSetMakeReferenceSet(
+    const VdbBlastRunSet *self,
+    VdbBlastStatus *status)
+{
+    VdbBlastReferenceSet *p = calloc(1, sizeof *p);
+
+    VdbBlastStatus dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    if (p == NULL) {
+        *status = eVdbBlastMemErr;
+    }
+    else {
+        KRefcountInit(&p->refcount, 1, VDB_BLAST_REFERENCE_SET,
+            __func__, "referenceSet");
+        *status = eVdbBlastNoErr;
+    }
+
+    p->rs = VdbBlastRunSetAddRef((VdbBlastRunSet*)self);
+
+    return p;
+}
+
+
+static
+void _VdbBlastReferenceSetWhack(VdbBlastReferenceSet *self)
+{
+    if (self == NULL) {
+        return;
+    }
+
+    STSMSG(1, ("Deleting VdbBlastReferenceSet"));
+
+    VdbBlastRunSetRelease((VdbBlastRunSet*)self->rs);
+
+    memset(self, 0, sizeof *self);
+
+    free(self);
+}
+
+
+LIB_EXPORT VdbBlastReferenceSet* CC VdbBlastReferenceSetAddRef
+    (VdbBlastReferenceSet *self)
+{
+    if (self == NULL) {
+        STSMSG(1, ("VdbBlastReferenceSetAddRef(NULL)"));
+        return self;
+    }
+
+    if (KRefcountAdd(&self->refcount, VDB_BLAST_REFERENCE_SET)
+        == krefOkay)
+    {
+        STSMSG(1, ("VdbBlastReferenceSetAddRef"));
+        return self;
+    }
+
+    STSMSG(1, ("Error: failed to VdbBlastReferenceSetAddRef"));
+    return NULL;
+}
+
+
+LIB_EXPORT
+void CC VdbBlastReferenceSetRelease(VdbBlastReferenceSet *self)
+{
+    if (self == NULL) {
+        return;
+    }
+
+    STSMSG(1, ("VdbBlastReferenceSetRelease"));
+    if (KRefcountDrop(&self->refcount, VDB_BLAST_REFERENCE_SET) != krefWhack) {
+        return;
+    }
+
+    _VdbBlastReferenceSetWhack(self);
+}
+
+
+LIB_EXPORT VdbBlast2naReader* CC VdbBlastReferenceSetMake2naReader(
+    const VdbBlastReferenceSet *self,
+    VdbBlastStatus *status,
+    uint64_t initial_read_id)
+{
+    return VdbBlastRunSetMake2naReaderExt
+        (self->rs, status, initial_read_id, VDB_READ_REFERENCE);
+}
+
+
+LIB_EXPORT VdbBlast4naReader* CC VdbBlastReferenceSetMake4naReader(
+    const VdbBlastReferenceSet *self,
+    VdbBlastStatus *status)
+{
+    return VdbBlastRunSetMake4naReaderExt(self->rs, status, VDB_READ_REFERENCE);
+}
+
+
+static const struct References* _VdbBlastReferenceSetCheckReferences(
+
+    const VdbBlastReferenceSet *self, VdbBlastStatus *status)
+{
+    assert(status);
+
+    if (self == NULL || self->rs == NULL ||
+        self->rs->core2naRef.reader.refs == NULL)
+    {
+        *status = eVdbBlastErr;
+        return NULL;
+    }
+
+    _VdbBlastRunSetBeingRead(self->rs);
+
+    *status = eVdbBlastNoErr;
+    return self->rs->core2naRef.reader.refs;
+}
+
+
+static const struct References* _VdbBlastReferenceSetInitReferences(
+    const VdbBlastReferenceSet *self,
+    VdbBlastStatus *status)
+{
+    VdbBlastRunSet *rs = NULL;
+    Reader2na *reader = NULL;
+
+    assert(status);
+
+    if (self == NULL || self->rs == NULL) {
+        *status = eVdbBlastErr;
+        return NULL;
+    }
+
+    rs = (VdbBlastRunSet*)self->rs;
+
+    _VdbBlastRunSetBeingRead(rs);
+
+    reader = &rs->core2naRef.reader;
+
+    *status = eVdbBlastNoErr;
+
+    if (reader->refs == NULL) {
+        rc_t rc = KLockAcquire(rs->core2naRef.mutex);
+        if (rc != 0) {
+            *status = eVdbBlastErr;
+            return NULL;
+        }
+
+        if (reader->refs == NULL) {
+            reader->refs = _RunSetMakeReferences(&rs->runs, status);
+        }
+
+        KLockUnlock(rs->core2naRef.mutex);
+    }
+
+    return reader->refs;
+}
+
+
+LIB_EXPORT uint64_t CC VdbBlastReferenceSetGetNumSequences(
+    const VdbBlastReferenceSet *self,
+    VdbBlastStatus *status)
+{
+    const struct References *refs = NULL;
+
+    VdbBlastStatus dummy = eVdbBlastNoErr;
+    if (status == NULL) {
+        status = &dummy;
+    }
+
+    refs = _VdbBlastReferenceSetInitReferences(self, status);
+    if (*status != eVdbBlastNoErr) {
+        return 0;
+    }
+
+    assert                           (refs);
+    return _ReferencesGetNumSequences(refs, status);
+}
+
+
+LIB_EXPORT uint64_t CC VdbBlastReferenceSetGetTotalLength(
+    const VdbBlastReferenceSet *self,
+    VdbBlastStatus *status)
+{
+    const struct References *refs = NULL;
+
+    VdbBlastStatus dummy = eVdbBlastNoErr;
+    if (status == NULL) {
+        status = &dummy;
+    }
+
+    refs = _VdbBlastReferenceSetInitReferences(self, status);
+    if (*status != eVdbBlastNoErr) {
+        return 0;
+    }
+
+    assert                          (refs);
+    return _ReferencesGetTotalLength(refs, status);
+}
+
+
+LIB_EXPORT size_t CC VdbBlastReferenceSetGetReadName(
+    const VdbBlastReferenceSet *self,
+    uint64_t read_id,
+    char *name_buffer,
+    size_t bsize)
+{
+    if (bsize > 0 && name_buffer != NULL) {
+        name_buffer[0] = '\0';
+    }
+
+    {
+        VdbBlastStatus status = eVdbBlastErr;
+
+        const struct References *refs
+            = _VdbBlastReferenceSetCheckReferences(self, &status);
+        if (status != eVdbBlastNoErr) {
+            return 0;
+        }
+
+        assert                       (refs);
+        return _ReferencesGetReadName(refs, read_id, name_buffer, bsize);
+    }
+}
+
+
+LIB_EXPORT VdbBlastStatus CC VdbBlastReferenceSetGetReadId(
+    const VdbBlastReferenceSet *self,
+    const char *name_buffer,
+    size_t bsize,
+    uint64_t *read_id)
+{
+    VdbBlastStatus status = eVdbBlastErr;
+
+    const struct References *refs
+        = _VdbBlastReferenceSetCheckReferences(self, &status);
+    if (status != eVdbBlastNoErr) {
+        return status;
+    }
+
+    assert                     (refs);
+    return _ReferencesGetReadId(refs, name_buffer, bsize, read_id);
+}
+
+
+LIB_EXPORT uint64_t CC VdbBlastReferenceSetGetReadLength(
+    const VdbBlastReferenceSet *self,
+    uint64_t read_id,
+    VdbBlastStatus *status)
+{
+    VdbBlastStatus dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    *status = eVdbBlastErr;
+
+    {
+        const struct References *refs
+            = _VdbBlastReferenceSetCheckReferences(self, status);
+        if (*status != eVdbBlastNoErr) {
+            return 0;
+        }
+
+        assert                         (refs);
+        return _ReferencesGetReadLength(refs, read_id, status);
+    }
+}
+
+
+/* EOF */
diff --git a/libs/blast/reader.h b/libs/blast/reader.h
new file mode 100644
index 0000000..c215785
--- /dev/null
+++ b/libs/blast/reader.h
@@ -0,0 +1,53 @@
+#ifndef _h_libs_blast_reader_
+#define _h_libs_blast_reader_
+
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <stddef.h> /* size_t */
+#include <stdint.h> /* uint64_t */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Core2na;
+struct RunSet;
+
+typedef struct Data2na {
+    uint32_t irun;
+    const struct VBlob *blob;
+} Data2na;
+
+uint64_t _Core2naRead(struct Core2na *self,
+    const struct RunSet *runs, uint32_t *status, uint64_t *read_id,
+    size_t *starting_base, uint8_t *buffer, size_t buffer_size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_libs_blast_reader_ */
diff --git a/libs/blast/reference.c b/libs/blast/reference.c
new file mode 100644
index 0000000..a6d94be
--- /dev/null
+++ b/libs/blast/reference.c
@@ -0,0 +1,1714 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "reference.h" /* _ReferencesWhack */
+
+#include "blast-mgr.h" /* BTableType */
+#include "reader.h" /* Data2na */
+#include "run-set.h" /* Core4na */
+
+#include <klib/log.h> /* PLOGMSG */
+#include <klib/rc.h> /* SILENT_RC */
+#include <klib/status.h> /* STSMSG */
+
+#include <vdb/blob.h> /* VBlob */
+#include <vdb/cursor.h> /* VCursor */
+#include <vdb/table.h> /* VTable */
+
+#include <string.h> /* strcmp */
+
+/******************************************************************************/
+
+#define MAX_SEQ_LEN 5000
+
+/******************************************************************************/
+
+#define MAX_BIT64 (~((uint64_t)-1 >> 1))
+
+static bool _is_set_read_id_reference_bit(uint64_t read_id) {
+    return read_id & MAX_BIT64;
+}
+
+static
+uint64_t _clear_read_id_reference_bit(uint64_t read_id, bool *bad)
+{
+    assert(bad);
+
+    *bad = false;
+
+    if (! _is_set_read_id_reference_bit(read_id)) {
+        *bad = true;
+        S
+        return read_id;
+    }
+
+    return read_id & ~MAX_BIT64;
+}
+
+static uint64_t _set_read_id_reference_bit
+    (uint64_t read_id, VdbBlastStatus *status)
+{
+    assert(status);
+
+    if (_is_set_read_id_reference_bit(read_id)) {
+        *status = eVdbBlastErr;
+        S
+        return read_id;
+    }
+
+    return read_id | MAX_BIT64;
+}
+
+/******************************************************************************/
+typedef struct {
+    BSTNode n;
+
+    const char *str;
+    uint32_t rfdi;
+} BstNode;
+static void BstNodeInit(BstNode *self, const char *str, uint32_t rfdi) {
+    assert(self && str);
+
+    self->str  = str;
+    self->rfdi = rfdi;
+}
+
+static void CC BstNodeWhack(BSTNode *n, void *ignore) {
+    memset(n, 0, sizeof *n);
+
+    free(n);
+}
+
+static int64_t CC BstNodeCmpStr(const void *item, const BSTNode *n) {
+    const char *c = item;
+    const BstNode *rn = (const BstNode*)n;
+
+    if (c == NULL || rn == NULL || rn->str == NULL) {
+        return 1;
+    }
+
+    return strcmp(c, rn->str);
+}
+
+static int64_t CC BstNodeCmpString(const void *item, const BSTNode *n) {
+    const String *c = item;
+    const BstNode *rn = (const BstNode*)n;
+
+    if (c == NULL || rn == NULL || rn->str == NULL) {
+        return 1;
+    }
+
+    return string_cmp(c->addr, c->size, rn->str, string_size(rn->str),
+                                                 string_size(rn->str));
+}
+
+static int64_t CC RunBstSort(const BSTNode *item, const BSTNode *n) {
+    const BstNode *rn = (const BstNode*)item;
+
+    assert(rn);
+
+    return BstNodeCmpStr(rn->str, n);
+}
+
+/******************************************************************************/
+struct VdbBlastRef {
+    uint32_t iRun;  /* in run table */
+    char *SEQ_ID;
+    uint64_t first; /* spot  in REFERENCE table */
+    uint64_t count; /* spots in REFERENCE table */
+    bool external;  /* reference */
+    bool circular;  /* reference */
+    size_t base_count; /* number of bases in reference */
+};
+static void _VdbBlastRefWhack(VdbBlastRef *self) {
+    assert(self);
+
+    free(self->SEQ_ID);
+
+    memset(self, 0, sizeof *self);
+}
+
+static VdbBlastStatus _VdbBlastRefSetCounts(VdbBlastRef *self, uint64_t cur_row,
+    int64_t first_row, const VCursor *cursor, uint32_t idxREAD_LEN, int64_t idx,
+    uint64_t *base_count)
+{
+    assert(self && base_count);
+
+    *base_count = 0;
+
+    if (self->count != 0) {
+        return eVdbBlastNoErr;
+    }
+
+    assert(cur_row != first_row);
+
+    self->count = cur_row - self->first;
+
+    {
+        uint32_t read_len = 0;
+        uint32_t row_len = 0;
+        rc_t rc = VCursorReadDirect(cursor, self->first + self->count - 1,
+            idxREAD_LEN, 8, &read_len, 4, &row_len);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VCursorReadDirect(READ_LEN, spot=$(spot))",
+                "spot=%ld", self->first + self->count - 1));
+            return eVdbBlastErr;
+        }
+        else if (row_len != 4) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Bad row_len in VCursorReadDirect(READ_LEN, spot=$(spot))",
+                "spot=%ld", self->first + self->count - 1));
+            return eVdbBlastErr;
+        }
+        else {
+            self->base_count = (self->count - 1) * MAX_SEQ_LEN + read_len;
+        }
+
+    }
+
+    STSMSG(1, ("%i) '%s'[%i-%i(%i)][%lu]", idx, self->SEQ_ID, self->first,
+        self->first + self->count - 1, self->count, self->base_count));
+
+    *base_count = self->base_count;
+
+    return eVdbBlastNoErr;
+}
+
+/******************************************************************************/
+void _RefSetFini(RefSet *self) {
+    size_t i = 0;
+
+    if (self == NULL)
+        return;
+
+    BSTreeWhack(&self->tRuns   , BstNodeWhack, NULL);
+    BSTreeWhack(&self->tExtRefs, BstNodeWhack, NULL);
+    BSTreeWhack(&self->tIntRefs, BstNodeWhack, NULL);
+    
+    for (i = 0; i < self->rfdk; ++i)
+        _VdbBlastRefWhack(&self->rfd[i]);
+
+    free(self->rfd);
+
+    memset(self, 0, sizeof *self);
+}
+
+/******************************************************************************/
+typedef struct References {
+    const RunSet *rs;     /* table of runs */
+
+    RefSet       *refs;
+
+    size_t        rfdi; /* refs member being read */
+    size_t        spot; /* next spot to be read in refs member being read */
+    bool      circular; /* for circular references
+                         - if true than the spot is provided the second time */
+
+    const VCursor *curs; /* to REFERENCE table of current refs member ([rfdi])*/
+    uint32_t   idxREAD; /* index of READ column in VCursor */
+    uint64_t   read_id;
+    bool           eos; /* end if set: no more sequences to read */
+} References;
+void _ReferencesWhack(const References *cself) {
+    References *self = (References *)cself;
+
+    if (self == NULL) {
+        return;
+    }
+
+    VCursorRelease(self->curs);
+
+    memset(self, 0, sizeof *self);
+
+    free(self);
+}
+
+const References* _RunSetMakeReferences
+    (RunSet *self, VdbBlastStatus *status)
+{
+    rc_t rc = 0;
+    uint64_t totalLen = 0;
+    uint32_t irun = 0;
+    References *r = NULL;
+    RefSet *refs = NULL;
+    const VCursor *c = NULL;
+    uint32_t iREAD_LEN = 0;
+    assert(self && status);
+    refs = &self->refs;
+    r = calloc(1, sizeof *r);
+    if (r == NULL) {
+        *status = eVdbBlastMemErr;
+        return NULL;
+    }
+    assert(!refs->rfd);
+    refs->rfdn = 512; /* initially allocated number of references */
+    refs->rfd = calloc(1, refs->rfdn * sizeof *refs->rfd);
+    if (refs->rfd == NULL) {
+        *status = eVdbBlastMemErr;
+        return NULL;
+    }
+    BSTreeInit(&refs->tRuns);
+    BSTreeInit(&refs->tExtRefs);
+    BSTreeInit(&refs->tIntRefs);
+    r->rs = self;
+    r->refs = refs;
+    for (irun = 0; irun < self->krun; ++irun) {
+        const void *crntSeqId = NULL;
+        uint32_t iCIRCULAR = 0; 
+        uint32_t iCMP_READ = 0;
+        uint32_t iSEQ_ID   = 0;
+        int64_t first = 0;
+        uint64_t count = 0;
+        uint64_t cur_row = 0;
+        const VdbBlastRun *run = &self->run[irun];
+        if (run->obj == NULL || run->obj->db == NULL)
+            continue;
+
+        {
+            BstNode *n
+                = (BstNode*)BSTreeFind(&refs->tRuns, run->acc, BstNodeCmpStr);
+            if (n != NULL) {
+                continue; /* ignore repeated runs */
+            }
+            else {
+                n = calloc(1, sizeof *n);
+                if (n == NULL) {
+                    *status = eVdbBlastMemErr;
+                    return NULL;
+                }
+            }
+            BstNodeInit(n, run->acc, refs->rfdk);
+            BSTreeInsert(&refs->tRuns, (BSTNode*)n, RunBstSort);
+        }
+        if (run->obj->refTbl == NULL) {
+            rc = VDatabaseOpenTableRead(run->obj->db,
+                &run->obj->refTbl, "REFERENCE");
+            if (rc != 0) {
+          /* Do not log error : this DB does not have any reference - it happens
+                PLOGERR(klogInt, (klogInt, rc,
+                    "Cannot open REFERENCE table for $(acc))",
+                    "acc=%s", run->acc));*/
+                continue;
+            }
+        }
+        rc = VTableCreateCursorRead(run->obj->refTbl, &c);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Cannot create REFERENCE Cursor for $(acc))",
+                "acc=%s", run->acc));
+            continue;
+        }
+        if (rc == 0) {
+            rc = VCursorAddColumn(c, &iCIRCULAR, "CIRCULAR");
+            if (rc != 0) {
+                PLOGERR(klogInt, (klogInt, rc,
+                    "Cannot add REFERENCE/CIRCULAR Column for $(acc))",
+                    "acc=%s", run->acc));
+            }
+        }
+        if (rc == 0) {
+            rc = VCursorAddColumn(c, &iCMP_READ, "CMP_READ");
+            if (rc != 0) {
+                PLOGERR(klogInt, (klogInt, rc,
+                    "Cannot add REFERENCE/CMP_READ Column for $(acc))",
+                    "acc=%s", run->acc));
+            }
+        }
+        if (rc == 0) {
+            rc = VCursorAddColumn(c, &iREAD_LEN, "READ_LEN");
+            if (rc != 0) {
+                PLOGERR(klogInt, (klogInt, rc,
+                    "Cannot add REFERENCE/READ_LEN Column for $(acc))",
+                    "acc=%s", run->acc));
+            }
+        }
+        if (rc == 0) {
+            rc = VCursorAddColumn(c, &iSEQ_ID, "SEQ_ID");
+            if (rc != 0) {
+                PLOGERR(klogInt, (klogInt, rc,
+                    "Cannot add REFERENCE/SEQ_ID Column for $(acc))",
+                    "acc=%s", run->acc));
+            }
+        }
+        if (rc == 0) {
+            rc = VCursorOpen(c);
+            if (rc != 0) {
+                PLOGERR(klogInt, (klogInt, rc,
+                    "Cannot open REFERENCE Cursor for $(acc))",
+                    "acc=%s", run->acc));
+            }
+        }
+        if (rc == 0) {
+            rc = VCursorIdRange(c, iSEQ_ID, &first, &count);
+            if (rc != 0) {
+                PLOGERR(klogInt, (klogInt, rc,
+                    "Cannot get REFERENCE/CursorIdRange for $(acc))",
+                    "acc=%s", run->acc));
+            }
+        }
+
+        for (cur_row = first;
+            cur_row < first + count && rc == 0; ++cur_row)
+        {
+            bool newRef = false;
+
+            const void *base = NULL;
+            uint32_t elem_bits = 0, boff = 0, row_len = 0;
+            char *SEQ_ID = NULL;
+
+            rc = VCursorCellDataDirect(c, cur_row, iSEQ_ID,
+                &elem_bits, &base, &boff, &row_len);
+            if (rc == 0 && (elem_bits != 8 || boff != 0)) {
+                rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+            }
+            if (rc != 0) {
+                PLOGERR(klogInt, (klogInt, rc, "Cannot get "
+                    "CellDataDirect for $(acc)/REFERENCE/SEQ_ID/$(row)",
+                    "acc=%s,row=%lu", run->acc, cur_row));
+                break;
+            }
+            if (crntSeqId == NULL) { /* the first reference in a run */
+                newRef = true;
+            }
+            else if (crntSeqId != base) { /* pointer to SeqId has changed -
+                                             might be a new reference*/
+                newRef = true;
+            }
+
+            if (newRef) {
+                crntSeqId = base;
+                SEQ_ID = string_dup(base, row_len);
+                if (SEQ_ID == NULL) {
+                    *status = eVdbBlastMemErr;
+                    return NULL;
+                }
+                if (refs->rfdk > 0 && /* there are previous references */
+                    cur_row != first) /* not the first reference row in a run */
+                {
+                    const VdbBlastRef *rfd1 = &refs->rfd[refs->rfdk - 1];
+                    if (string_cmp(rfd1->SEQ_ID, string_size(rfd1->SEQ_ID),
+                            SEQ_ID, string_size(SEQ_ID), string_size(SEQ_ID))
+                        == 0)
+                    {
+                     /* a SEQ_ID with a different pointer but the same value:
+                       (e.g. SRR520124/REFERENCE) */
+                        free((void*)SEQ_ID);
+                        SEQ_ID = NULL;
+                        newRef = false;
+                    }
+                }
+            }
+
+            if (newRef) {
+                bool CIRCULAR = false;
+                bool external = false;
+                VdbBlastRef *rfd  = NULL;
+                rc = VCursorCellDataDirect(c, cur_row, iCIRCULAR,
+                    &elem_bits, &base, &boff, &row_len);
+                if (rc == 0 &&
+                    (base == NULL || elem_bits != 8 || boff != 0))
+                {
+                    rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+                }
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc, "Error during "
+                        "CellDataDirect for $(acc)/REFERENCE/CIRCULAR/$(row)",
+                        "acc=%s,row=%lu", run->acc, cur_row));
+                    break;
+                }
+                CIRCULAR = *(bool*)base;
+
+                rc = VCursorCellDataDirect(c, cur_row, iCMP_READ,
+                    &elem_bits, &base, &boff, &row_len);
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc, "Cannot get "
+                        "CellDataDirect for $(acc)/REFERENCE/CMP_READ/$(row)",
+                        "acc=%s,row=%lu", run->acc, cur_row));
+                    break;
+                }
+                else if (base == NULL
+                    || elem_bits == 0 || row_len == 0)
+                {
+                    external = true;
+                }
+
+                if (refs->rfdk >= refs->rfdn) {
+                    void *tmp = NULL;
+                    refs->rfdn *= 2;
+                    tmp = realloc(refs->rfd, refs->rfdn * sizeof *refs->rfd);
+                    if (tmp == NULL) {
+                        *status = eVdbBlastMemErr;
+                        return NULL;
+                    }
+                    refs->rfd = tmp;
+                }
+
+                rfd = &refs->rfd[refs->rfdk];
+
+                if (refs->rfdk != 0) {
+                    uint64_t bc;
+                    *status = _VdbBlastRefSetCounts(&refs->rfd[refs->rfdk - 1],
+                        cur_row, first, c, iREAD_LEN, refs->rfdk - 1, &bc);
+                    if (*status != eVdbBlastNoErr) {
+                        return NULL;
+                    }
+                    totalLen += bc;
+                }
+
+#ifndef UNIQ_INTERNAL_SEQ_ID_REFS
+                if (external)
+#endif
+                {
+                    BSTree * tRefs
+                        = external ? & refs->tExtRefs : & refs->tIntRefs;
+                    BstNode *n = (BstNode*)
+                        BSTreeFind(tRefs, SEQ_ID, BstNodeCmpStr);
+                    if (n != NULL) {  /* we already have this reference */
+                        free(SEQ_ID); /* in one of the previous runs */
+                        SEQ_ID = NULL;
+                    }
+                    else {
+                        n = calloc(1, sizeof *n);
+                        if (n == NULL) {
+                            *status = eVdbBlastMemErr;
+                            return NULL;
+                        }
+                        BstNodeInit(n, SEQ_ID, refs->rfdk);
+                        BSTreeInsert(tRefs, (BSTNode*)n, RunBstSort);
+                    }
+                }
+
+                if (SEQ_ID != NULL) { /* we already have it in refs->tExtRefs */
+                    rfd->iRun     = irun;                /* or refs->tIntRefs */
+                    rfd->SEQ_ID   = SEQ_ID;
+                    rfd->first    = cur_row;
+                    rfd->circular = CIRCULAR;
+                    rfd->external = external;
+
+                    rfd->count      = 0; /* will initialize later */
+                    rfd->base_count = 0; /* uninitialized */
+
+                    ++refs->rfdk;
+                }
+            }
+        }
+        if (refs->rfdk > 0 && refs->rfd[refs->rfdk - 1].count == 0) {
+            uint64_t bc;
+            *status = _VdbBlastRefSetCounts(&refs->rfd[refs->rfdk - 1],
+                cur_row, first, c, iREAD_LEN, refs->rfdk - 1, &bc);
+            if (*status != eVdbBlastNoErr) {
+                return NULL;
+            }
+            totalLen += bc;
+        }
+        RELEASE(VCursor, c);
+    }
+    refs->totalLen = totalLen;
+    *status = eVdbBlastNoErr;
+    return r;
+}
+
+/******************************************************************************/
+uint64_t _ReferencesGetNumSequences
+    (const References *self, VdbBlastStatus *status)
+{
+    assert(status);
+
+    if (self == NULL || self->refs == NULL) {
+        *status = eVdbBlastErr;
+        return 0;
+    }
+
+    *status = eVdbBlastNoErr;
+    return self->refs->rfdk;
+}
+
+uint64_t _ReferencesGetTotalLength
+    (const References *self, VdbBlastStatus *status)
+{
+    assert(status);
+
+    if (self == NULL || self->refs == NULL) {
+        *status = eVdbBlastErr;
+        return 0;
+    }
+
+    *status = eVdbBlastNoErr;
+    return self->refs->totalLen;
+}
+
+
+uint64_t _ReferencesGetReadLength(const struct References *self,
+    uint64_t read_id,
+    VdbBlastStatus *status)
+{
+    bool bad = false;
+    read_id = _clear_read_id_reference_bit(read_id, &bad);
+
+    assert(status);
+
+    if (bad) {
+        *status = eVdbBlastInvalidId;
+        return 0;
+    }
+
+    if (self == NULL || self->refs == NULL ||
+        self->refs->rfdk <= read_id)
+    {
+        return 0;
+    }
+
+    {
+        const VdbBlastRef *r = NULL;
+        assert(self->refs->rfd);
+        r = &self->refs->rfd[read_id];
+
+        if (r->circular) {
+            *status = eVdbBlastCircularSequence;
+        }
+        else {
+            *status = eVdbBlastNoErr;
+        }
+
+        return r->base_count;
+    }
+}
+
+
+#define REF_SEPARATOR '/'
+
+size_t CC _ReferencesGetReadName(const struct References *self,
+    uint64_t read_id, char *name_buffer, size_t bsize)
+{
+    const VdbBlastRef *r = NULL;
+    const char *acc = NULL;
+
+    bool bad = false;
+    read_id = _clear_read_id_reference_bit(read_id, &bad);
+    if (bad) {
+        return 0;
+    }
+
+    if (self == NULL || self->refs == NULL ||
+        self->refs->rfdk <= read_id)
+    {
+        return 0;
+    }
+
+    assert(self->refs->rfd);
+    r = &self->refs->rfd[read_id];
+
+    if (!r->external) {
+        if (self->rs == NULL || self->rs->krun <= r->iRun) {
+            return 0;
+        }
+
+        acc = self->rs->run[r->iRun].acc;
+    }
+
+    {
+        const char *SEQ_ID = self->refs->rfd[read_id].SEQ_ID;
+
+        size_t num_writ = 0;
+        if (acc == NULL) {
+            string_printf(name_buffer, bsize, &num_writ, "%s", SEQ_ID);
+        }
+        else {
+            string_printf(name_buffer, bsize, &num_writ,
+                "%s%c%s", acc, REF_SEPARATOR, SEQ_ID);
+        }
+        return num_writ;
+    }
+}
+
+/******************************************************************************/
+VdbBlastStatus _ReferencesGetReadId(const References *self,
+    const char *name_buffer, size_t bsize, uint64_t *read_id)
+{
+    int32_t rfdi = ~0;
+    const char *sp = name_buffer;
+    const RefSet *refs = NULL;
+    String acc, seq;
+    BstNode *n = NULL;
+    if (self == NULL || self->refs == NULL || self->rs == NULL ||
+        name_buffer == NULL || bsize == 0 || read_id == NULL)
+    {
+        return eVdbBlastErr;
+    }
+    refs = self->refs;
+    memset(&acc, 0 , sizeof acc);
+    memset(&seq, 0 , sizeof seq);
+
+    sp = string_chr(name_buffer, bsize, REF_SEPARATOR);
+    if (sp != NULL) {
+        StringInit(&acc, name_buffer, sp - name_buffer, sp - name_buffer);
+        if ((sp - name_buffer) >= bsize) {
+            return eVdbBlastErr;
+        }
+    }
+
+    if (sp != NULL) {
+        StringInit(&seq, sp + 1, bsize - (sp - name_buffer) - 1,
+                                 bsize - (sp - name_buffer) - 1);
+    }
+    else {
+        StringInit(&seq, name_buffer, bsize, bsize);
+    }
+    if (acc.size != 0) {
+        bool found = false;
+        int32_t iRun = ~0;
+        n = (BstNode*)BSTreeFind(&refs->tRuns, &acc, BstNodeCmpString);
+        if (n == NULL) {
+            return eVdbBlastErr;
+        }
+        iRun = refs->rfd[n->rfdi].iRun;
+        assert(iRun < self->rs->krun);
+        assert(!string_cmp(self->rs->run[iRun].acc,
+               string_size(self->rs->run[iRun].acc),
+               acc.addr, acc.size, acc.size));
+        for (rfdi = n->rfdi; rfdi < refs->rfdk; ++rfdi) {
+            const VdbBlastRef *r = &refs->rfd[rfdi];
+            if (r->iRun != iRun)
+                return eVdbBlastErr;
+            if (string_cmp(seq.addr, seq.size,
+                r->SEQ_ID, string_size(r->SEQ_ID), string_size(r->SEQ_ID)) == 0)
+            {
+                assert(!r->external);
+                found = true;
+                break;
+            }
+        }
+        if (!found)
+            return eVdbBlastErr;
+    }
+    else {
+        n     = (BstNode*)BSTreeFind(&refs->tExtRefs, &seq, BstNodeCmpString);
+        if (n == NULL)
+            n = (BstNode*)BSTreeFind(&refs->tIntRefs, &seq, BstNodeCmpString);
+        if (n == NULL)
+            return eVdbBlastErr;
+        rfdi = n->rfdi;
+        assert(refs->rfd[rfdi].external);
+    }
+    {
+        VdbBlastStatus status = eVdbBlastNoErr;
+        assert(rfdi < refs->rfdk);
+        *read_id = _set_read_id_reference_bit(rfdi, &status);
+        return status;
+    }
+}
+
+/******************************************************************************/
+static uint64_t _ReferencesRead2na(References *self,
+    VdbBlastStatus *status, uint64_t *read_id,
+    size_t *starting_base, uint8_t *buffer, size_t buffer_size)
+{
+    rc_t rc = 0;
+    uint64_t total = 0;
+    const VdbBlastRef *rfd = NULL;
+    uint8_t *begin = buffer;
+    assert(status && self && self->rs && read_id && starting_base);
+    *status = eVdbBlastNoErr;
+    assert(self->refs);
+    rfd = &self->refs->rfd[self->rfdi];
+    while (total < buffer_size * 4) {
+        uint32_t start = 0;
+        uint32_t to_read = 0;
+        uint32_t num_read = 0;
+        uint32_t remaining = 0;
+        if (self->spot == 0 ||
+           /* the very first call: open the first spot of the first reference */
+
+            self->rfdi != self->read_id) /* should switch to a next reference */
+        {
+            const VdbBlastRef *rfd1 = NULL;
+            const VTable *t = NULL;
+            assert(!total);
+            if (self->rfdi != self->read_id) {/* switching to a next reference*/
+                if (self->rfdi + 1 != self->read_id) { /* should never happen */
+                    *status = eVdbBlastErr;
+                    S
+                    return 0;
+                }
+                *starting_base = 0;
+                ++self->rfdi;
+                if (self->rfdi >= self->refs->rfdk) {
+                    self->eos = true;
+                    *status = eVdbBlastNoErr; /* end of set */
+                    S
+                    return 0;
+                }
+                rfd1 = rfd;
+                rfd = &self->refs->rfd[self->rfdi];
+            }
+            if (rfd->iRun >= self->rs->krun) {
+                S
+                return 0;
+            }
+            if (self->rs->run == NULL || self->rs->run[rfd->iRun].obj == NULL ||
+                self->rs->run[rfd->iRun].obj->refTbl == NULL)
+            {
+                S
+                return 0;
+            }
+            if (self->rfdi == 0 || rfd1->iRun != rfd->iRun) {
+                const char *acc = self->rs->run[rfd->iRun].acc;
+                t = self->rs->run[rfd->iRun].obj->refTbl;
+                RELEASE(VCursor, self->curs);
+                rc = VTableCreateCursorRead(t, &self->curs);
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc,
+                        "Cannot create REFERENCE Cursor for $(acc)) /Read2na",
+                        "acc=%s", acc));
+                    return 0;
+                }
+                rc = VCursorAddColumn(self->curs,
+                    &self->idxREAD, "(INSDC:2na:packed)READ");
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc, "Cannot add "
+                        "REFERENCE/READ Column for $(acc)) /Read2na",
+                        "acc=%s", acc));
+                    return 0;
+                }
+                rc = VCursorOpen(self->curs);
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc,
+                        "Cannot open REFERENCE Cursor for $(acc)) /Read2na",
+                        "acc=%s", acc));
+                    return 0;
+                }
+            }
+            else {
+                if (self->curs == NULL || self->idxREAD == 0) {
+                    *status = eVdbBlastErr;
+                    S /* should never happen */
+                    return 0;
+                }
+            }
+            if (self->spot == 0) {
+                self->read_id = 0;
+            }
+            self->spot = rfd->first;
+        }
+        start = (uint32_t)*starting_base;
+        to_read = (uint32_t)(buffer_size * 4 - total);
+        rc = VCursorReadBitsDirect(self->curs, self->spot, self->idxREAD,
+            2, start, begin, 0, to_read, &num_read, &remaining);
+        total += num_read;
+        *status = eVdbBlastNoErr;
+        *read_id = _set_read_id_reference_bit(self->read_id, status);
+        if (*status != eVdbBlastNoErr) {
+            break;
+        }
+        if (rc != 0) {
+            if (rc == SILENT_RC
+                (rcVDB, rcCursor, rcReading, rcBuffer, rcInsufficient))
+            {
+                S
+                if (num_read == 0) {
+                    *status = eVdbBlastErr;
+                    S /* should never happen */
+                }
+                else {
+                    rc = 0;
+                }
+                *starting_base += num_read;
+                break;
+            }
+            else {
+                PLOGERR(klogInt, (klogInt, rc, "Error in VCursorReadBitsDirect"
+                    "($(path), READ, spot=$(spot)) /Read2na",
+                    "path=%s,spot=%ld",
+                    self->rs->run[rfd->iRun].path, self->spot));
+                *status = eVdbBlastErr;
+                return 0;
+            }
+        }
+        else {
+            if (remaining != 0) { /* The buffer is filled. */
+                S     /* There remains more data to read in the current spot. */
+                *starting_base += num_read;
+                break;
+            }
+            ++self->spot;
+            *starting_base = 0;
+            if (self->spot >= rfd->first + rfd->count) {
+                if (rfd->circular && ! self->circular) {
+                       /* end of the first repeat of a circular sequence */
+                    *status = eVdbBlastCircularSequence;
+                    self->circular = true;
+                    self->spot = rfd->first;
+                }
+                else { /* end of sequence */
+                    self->circular = false;
+                    ++self->read_id;
+                }
+                break;
+            }
+            begin += num_read / 4;
+            if ((num_read % 4) != 0) {
+                S
+                *status = eVdbBlastErr;
+                break; /* should never happen */
+            }
+        }
+    }
+    return total;
+}
+
+#if _DEBUGGING
+#define COMPARE
+#endif
+static uint32_t _ReferencesData2na(References *self,
+    Data2na *data, VdbBlastStatus *status,
+    Packed2naRead *buffer, uint32_t buffer_length)
+{
+    uint32_t num_read = 0;
+    assert(data && status && self && self->rs);
+    *status = eVdbBlastNoErr;
+    assert(self->refs);
+    for (num_read = 0; num_read < buffer_length; ) {
+        Packed2naRead *out = NULL;
+        rc_t rc = 0;
+        const VdbBlastRef *rfd = &self->refs->rfd[self->rfdi];
+        const char *acc = self->rs->run[rfd->iRun].acc;
+        int64_t first = 0;
+        uint64_t count = 0;
+        uint64_t last_spot = 0;
+        uint32_t elem_bits = 0;
+#ifdef COMPARE
+        uint32_t row_len = 0;
+#endif
+        size_t first_spot = 0;
+        bool full_scan = false;
+        *status = eVdbBlastErr;
+        assert(buffer);
+        RELEASE(VBlob, data->blob);
+        out = &buffer[num_read];
+        assert(self->refs);
+        if (self->spot == 0 ||
+         /* the very first call: open the first spot of the first reference */
+
+            self->rfdi != self->read_id) /* should switch to a next reference */
+        {
+            const VdbBlastRef *rfd1 = NULL;
+            const VTable *t = NULL;
+            if (self->rfdi != self->read_id) {/* switching to a next reference*/
+                if (self->rfdi + 1 != self->read_id) { /* should never happen */
+                    S
+                    return 0;
+                }
+                ++self->rfdi;
+                if (self->rfdi >= self->refs->rfdk) {
+                    self->eos = true;
+                    *status = eVdbBlastNoErr; /* end of set */
+                    S
+                    return 0;
+                }
+                rfd1 = rfd;
+                rfd = &self->refs->rfd[self->rfdi];
+            }
+            if (rfd->iRun >= self->rs->krun) {
+                S
+                return 0;
+            }
+            if (self->rs->run == NULL || self->rs->run[rfd->iRun].obj == NULL ||
+                self->rs->run[rfd->iRun].obj->refTbl == NULL)
+            {
+                S
+                return 0;
+            }
+            if (self->rfdi == 0 || rfd1->iRun != rfd->iRun) {
+                const char *acc = self->rs->run[rfd->iRun].acc;
+                t = self->rs->run[rfd->iRun].obj->refTbl;
+                RELEASE(VCursor, self->curs);
+                rc = VTableCreateCursorRead(t, &self->curs);
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc,
+                        "Cannot create REFERENCE Cursor for $(acc)) /Data2na",
+                        "acc=%s", acc));
+                    return 0;
+                }
+                rc = VCursorAddColumn(self->curs,
+                    &self->idxREAD, "(INSDC:2na:packed)READ");
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc,
+                        "Cannot add REFERENCE/READ Column for $(acc)) /Data2na",
+                        "acc=%s", acc));
+                    return 0;
+                }
+                rc = VCursorOpen(self->curs);
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc,
+                        "Cannot open REFERENCE Cursor for $(acc) /Data2na)",
+                        "acc=%s", acc));
+                    return 0;
+                }
+            }
+            else {
+                if (self->curs == NULL || self->idxREAD == 0) {
+                    S /* should never happen */
+                    return 0;
+                }
+            }
+            if (self->spot == 0) {
+                self->read_id = 0;
+            }
+            self->spot = rfd->first;
+            data->irun = self->rfdi;
+        }
+        rc = VCursorGetBlobDirect(self->curs,
+            &data->blob, self->spot, self->idxREAD);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Cannot GetBlob REFERENCE/READ for $(acc)/$(spot) /2na)",
+                "acc=%s,spot=%zu", acc, self->spot));
+            return 0;
+        }
+        if (data->blob == NULL) {
+            S
+            return 0;
+        }
+        rc = VBlobIdRange(data->blob, &first, &count);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Cannot BlobIdRange REFERENCE/READ for $(acc)/$(spot) /2na",
+                "acc=%s,spot=%zu", acc, self->spot));
+            return 0;
+        }
+        if (self->spot < first || self->spot >= first + count) {
+            /* requested blob b(spot) but spot < b.first || spot > b.last:
+               should never happen */
+            S /* PLOGERR */
+            return 0;
+        }
+        if (first > rfd->first + rfd->count) { /* should never happen */
+            S /* PLOGERR */
+            return 0;
+        }
+        last_spot = first + count;
+        if (rfd->first + rfd->count < last_spot) {
+            last_spot = rfd->first + rfd->count;
+        }
+        first_spot = self->spot;
+#ifdef COMPARE
+        for (; self->spot < last_spot; ++self->spot) {
+            if (self->spot == first_spot) {
+                rc = VBlobCellData(data->blob, self->spot, &elem_bits,
+                    (const void **)&out->starting_byte,
+                    &out->offset_to_first_bit, &row_len);
+                if (rc == 0 && elem_bits != 2) {
+                    rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+                }
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc, "Error during CellData "
+                        "for $(acc)/REFERENCE/READ/$(spot)) /2na",
+                        "acc=%s,spot=%zu", acc, self->spot));
+                    return 0;
+                }
+                else {
+                    out->length_in_bases = row_len;
+                }
+            }
+            else if (self->spot != last_spot - 1) {
+                out->length_in_bases += row_len;
+            }
+            else {
+                const void *base = NULL;
+                rc = VBlobCellData(data->blob, self->spot,
+                    &elem_bits, &base, NULL, &row_len);
+                if (rc == 0 && elem_bits != 2) {
+                    rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+                }
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc, "Error during CellData "
+                        "for $(acc)/REFERENCE/READ/$(spot)) /2na",
+                        "acc=%s,spot=%zu", acc, self->spot));
+                    return 0;
+                }
+                else {
+                    out->length_in_bases += row_len;
+                }
+            }
+        }
+#endif
+        {
+            const void *base = NULL;
+            uint32_t boff = 0;
+            uint32_t len = 0;
+            rc = VBlobCellData
+                (data->blob, first_spot, &elem_bits, &base, &boff, &len);
+            if (rc == 0 && elem_bits != 2) {
+                rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+            }
+            if (rc != 0) {
+                PLOGERR(klogInt, (klogInt, rc, "Error during CellData "
+                    "for $(acc)/REFERENCE/READ/$(spot)) /2na",
+                    "acc=%s,spot=%zu", acc, first_spot));
+                return 0;
+            }
+            if (first_spot + 1 == last_spot) {
+                /* the only chunk */
+            }
+            else if (len != MAX_SEQ_LEN) {
+                full_scan = true;
+                assert(0);
+            }
+            else {
+                const void *last_base = NULL;
+                uint32_t boff = 0;
+                uint32_t last_len = 0;
+                rc = VBlobCellData(data->blob, last_spot - 1,
+                    &elem_bits, &last_base, &boff, &last_len);
+                if (rc == 0 && elem_bits != 2) {
+                    rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+                }
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc, "Error during CellData "
+                        "for $(acc)/REFERENCE/READ/$(spot)) /2na",
+                        "acc=%s,spot=%zu", acc, last_spot - 1));
+                    return 0;
+                }
+                else {
+                    size_t chunk_len = ((const uint8_t*)last_base
+                                         - (const uint8_t*)base) * 4 + last_len;
+                    size_t num_ref_chunks
+                        = (chunk_len + MAX_SEQ_LEN - 1) / MAX_SEQ_LEN;
+                    if (num_ref_chunks != last_spot - first_spot) {
+                        full_scan = true;
+                    }
+                    else {
+                        len = chunk_len;
+                    }
+                }
+            }
+            if (!full_scan) {
+#ifdef COMPARE
+                assert(out->starting_byte == base);
+                assert(out->offset_to_first_bit == boff);
+                assert(out->length_in_bases == len);
+                assert(self->spot == last_spot);
+#else
+                out->starting_byte = (void*)base;
+                out->offset_to_first_bit = boff;
+                out->length_in_bases = len;
+                self->spot = last_spot;
+#endif
+            }
+        }
+#ifndef COMPARE
+        if (full_scan)
+#endif
+        {
+            const void *starting_byte = NULL;
+            const void *prev_base = NULL;
+            size_t length_in_bases = 0;
+            uint32_t offset_to_first_bit = 0;
+            for (self->spot = first_spot;
+                self->spot < last_spot; ++self->spot)
+            {
+                const void *base = NULL;
+                uint32_t boff = 0;
+                uint32_t len = 0;
+                rc = VBlobCellData(data->blob, self->spot,
+                    &elem_bits, &base, &boff, &len);
+                if (rc == 0 && elem_bits != 2) {
+                    rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+                }
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc, "Error during CellData "
+                        "for $(acc)/REFERENCE/READ/$(spot)) /2na",
+                        "acc=%s,spot=%zu", acc, self->spot));
+                    return 0;
+                }
+                if (self->spot == first_spot) {
+                    starting_byte = base;
+                    offset_to_first_bit = boff;
+                }
+                else {
+                    if ((const uint8_t*)prev_base + MAX_SEQ_LEN / 4 != base) {
+                        assert(full_scan);
+                        break;
+                    }
+                }
+                prev_base = base;
+                length_in_bases += len;
+            }
+#ifdef COMPARE
+            if (!full_scan) {
+                assert(out->starting_byte == starting_byte);
+                assert(out->offset_to_first_bit == offset_to_first_bit);
+                assert(out->length_in_bases == length_in_bases);
+                assert(self->spot == last_spot);
+            }
+#endif
+            if (full_scan) {
+                out->starting_byte = (void*)starting_byte;
+                out->offset_to_first_bit = offset_to_first_bit;
+                out->length_in_bases = length_in_bases;
+            }
+        }
+        *status = eVdbBlastNoErr;
+        out->read_id = _set_read_id_reference_bit(self->read_id, status);
+        if (*status != eVdbBlastNoErr) {
+            break;
+        }
+        if (self->spot < rfd->first + rfd->count) {
+            *status = eVdbBlastChunkedSequence;
+        }
+        else if (rfd->circular && ! self->circular) {
+               /* end of the first repeat of a circular sequence */
+            *status = eVdbBlastCircularSequence;
+            self->circular = true;
+            self->spot = rfd->first;
+        }
+        else { /* end of sequence */
+            *status = eVdbBlastNoErr;
+            self->circular = false;
+            ++self->read_id;
+        }
+        ++num_read;
+        break;
+    }
+    return num_read;
+}
+
+/******************************************************************************/
+uint64_t _Core2naReadRef(Core2na *self, VdbBlastStatus *status,
+    uint64_t *read_id, uint8_t *buffer, size_t buffer_size)
+{
+    uint64_t num_read = 0;
+
+    References *r = NULL;
+
+    assert(status);
+
+    *status = eVdbBlastNoErr;
+
+    if (self == NULL) {
+        *status = eVdbBlastErr;
+        return 0;
+    }
+
+    if (self->reader.refs == NULL) { /* do not have any reference */
+        self->eos = true;
+        return 0;
+    }
+
+    r = (References*)(self->reader.refs);
+
+    assert(r->refs);
+
+    if (r->rfdi > r->refs->rfdk) {
+        self->eos = true;
+    }
+
+    if (self->eos) {
+        return 0;
+    }
+
+    num_read = _ReferencesRead2na(r, status, read_id,
+        &self->reader.starting_base, buffer, buffer_size);
+
+    if (num_read == 0 && *status == eVdbBlastNoErr && r->eos) {
+        self->eos = true;
+    }
+
+    return num_read;
+}
+
+uint32_t _Core2naDataRef(struct Core2na *self,
+    Data2na *data, VdbBlastStatus *status,
+    Packed2naRead *buffer, uint32_t buffer_length)
+{
+    uint32_t num_read = 0;
+
+    References *r = NULL;
+
+    assert(status);
+
+    *status = eVdbBlastNoErr;
+
+    if (self == NULL) {
+        *status = eVdbBlastErr;
+        return 0;
+    }
+
+    if (self->reader.refs == NULL) { /* do not have any reference */
+        self->eos = true;
+        return 0;
+    }
+
+    r = (References*)(self->reader.refs);
+
+    assert(r->refs);
+
+    if (r->rfdi > r->refs->rfdk) {
+        self->eos = true;
+    }
+
+    if (self->eos) {
+        return 0;
+    }
+
+    num_read = _ReferencesData2na(r, data, status, buffer, buffer_length);
+    if (num_read == 0 && *status == eVdbBlastNoErr && r->eos) {
+        self->eos = true;
+    }
+
+    return num_read;
+}
+
+/******************************************************************************/
+size_t _Core4naReadRef(Core4na *self, const RunSet *runs,
+    uint32_t *status, uint64_t read_id, size_t starting_base,
+    uint8_t *buffer, size_t buffer_length)
+{
+    size_t total = 0;
+    uint8_t *begin = buffer;
+    const VdbBlastRef *rfd = NULL;
+    const VdbBlastRun *run = NULL;
+    uint64_t spot = 0;
+
+    bool circular = false;
+                 /* true when returning a circular reference the second time */
+
+    uint32_t start = 0;
+    assert(status);
+    if (self == NULL || runs == NULL ||
+        runs->refs.rfd == NULL || runs->refs.rfdk == 0)
+    {
+        *status = eVdbBlastErr;
+        return 0;
+    }
+    {
+        bool bad = false;
+        read_id = _clear_read_id_reference_bit(read_id, &bad);
+        if (bad) {
+            *status  = eVdbBlastInvalidId;
+            return 0;
+        }
+    }
+    if (read_id >= runs->refs.rfdk) {
+        *status  = eVdbBlastInvalidId;
+        return 0;
+    }
+    rfd = &runs->refs.rfd[read_id];
+    *status = eVdbBlastErr;
+    if (runs->run == NULL) {
+        return 0;
+    }
+    run = &runs->run[rfd->iRun];
+    if (self->curs != NULL) {
+        if (self->desc.tableId != read_id) {
+            VCursorRelease(self->curs);
+            self->curs = NULL;
+        }
+    }
+    if (self->curs == NULL) {
+        rc_t rc = 0;
+        if (rfd->iRun >= runs->krun) {
+            return 0;
+        }
+        if (run->obj == NULL || run->obj->refTbl == NULL) {
+            return 0;
+        }
+        rc = VTableCreateCursorRead(run->obj->refTbl, &self->curs);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Cannot create REFERENCE Cursor for $(acc))",
+                "acc=%s", run->acc));
+            return 0;
+        }
+        rc = VCursorAddColumn(self->curs,
+            &self->col_READ, "(INSDC:4na:bin)READ");
+        if (rc == 0) {
+            rc = VCursorOpen(self->curs);
+        }
+        if (rc != 0) {
+            RELEASE(VCursor, self->curs);
+            PLOGERR(klogInt, (klogInt, rc,
+                "Cannot make REFERENCE/READ Cursor for $(acc)) /Read4na",
+                "acc=%s", run->acc));
+            return 0;
+        }
+        self->desc.tableId = read_id;
+        self->desc.spot = 0;
+    }
+    *status = eVdbBlastNoErr;
+
+    if (rfd->circular) {
+        assert(rfd->base_count);
+        if (starting_base >= rfd->base_count) {
+            starting_base -= rfd->base_count;
+            circular = true;
+        }
+    }
+
+    spot = rfd->first + starting_base / MAX_SEQ_LEN;
+    if (spot >= rfd->first + rfd->count) {
+        return 0;
+    }
+    start = starting_base % MAX_SEQ_LEN;
+    while (total < buffer_length) {
+        rc_t rc = 0;
+        uint32_t num_read = 0;
+        uint32_t remaining = 0;
+        uint32_t to_read = (uint32_t)(buffer_length - total);
+        if (to_read == 0) {
+            S
+            break;
+        }
+        rc = VCursorReadBitsDirect(self->curs, spot, self->col_READ,
+            8, start, begin, 0, to_read, &num_read, &remaining);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VCursorReadBitsDirect($(path), READ, spot=$(spot))",
+                "path=%s,spot=%ld", run->path, spot));
+            *status = eVdbBlastErr;
+            break;
+        }
+        else {
+            total += num_read;
+            if (total > buffer_length) {
+                total = buffer_length;
+            }
+            if (total == buffer_length) {
+                break;
+            }
+            begin += num_read;
+            if (remaining > 0) {
+            }
+            else if (++spot >= rfd->first + rfd->count) {
+                if (rfd->circular && ! circular) {
+                    *status = eVdbBlastCircularSequence;
+                }
+                break; /* end of reference */
+            }
+            else {     /* next spot */
+                start = 0;
+            }
+        }
+    }
+    return total;
+}
+
+const uint8_t* _Core4naDataRef(Core4na *self, const RunSet *runs,
+    uint32_t *status, uint64_t read_id, size_t *length)
+{
+    const void *out = NULL;
+    rc_t rc = 0;
+    const VdbBlastRef *rfd = NULL;
+    const VdbBlastRun *run = NULL;
+    int64_t first = 0;
+    uint64_t count = 0;
+    uint64_t last_spot = 0;
+    size_t first_spot = 0;
+    bool full_scan = false;
+    assert(status);
+    *status = eVdbBlastErr;
+    if (length == NULL || self == NULL || runs == NULL ||
+        runs->refs.rfd == NULL || runs->refs.rfdk == 0)
+    {
+        return NULL;
+    }
+    *length = 0;
+    {
+        bool bad = false;
+        read_id = _clear_read_id_reference_bit(read_id, &bad);
+        if (bad) {
+            *status  = eVdbBlastInvalidId;
+            return NULL;
+        }
+    }
+    if (read_id >= runs->refs.rfdk) {
+        *status  = eVdbBlastInvalidId;
+        return NULL;
+    }
+    rfd = &runs->refs.rfd[read_id];
+    if (runs->run == NULL) {
+        return NULL;
+    }
+    run = &runs->run[rfd->iRun];
+    if (self->curs != NULL) {
+        if (self->desc.tableId != read_id) {
+            RELEASE(VCursor, self->curs);
+        }
+    }
+    if (self->curs == NULL) {
+        rc_t rc = 0;
+        if (rfd->iRun >= runs->krun) {
+            return NULL;
+        }
+        if (run->obj == NULL || run->obj->refTbl == NULL) {
+            return NULL;
+        }
+        rc = VTableCreateCursorRead(run->obj->refTbl, &self->curs);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Cannot create REFERENCE Cursor for $(acc))",
+                "acc=%s", run->acc));
+            return NULL;
+        }
+        rc = VCursorAddColumn(self->curs,
+            &self->col_READ, "(INSDC:4na:bin)READ");
+        if (rc == 0) {
+            rc = VCursorOpen(self->curs);
+        }
+        if (rc != 0) {
+            RELEASE(VCursor, self->curs);
+            PLOGERR(klogInt, (klogInt, rc,
+                "Cannot make REFERENCE/READ Cursor for $(acc)) /Data4na",
+                "acc=%s", run->acc));
+            return NULL;
+        }
+        self->desc.tableId = read_id;
+        self->desc.spot = 0;
+    }
+    if (self->blob) {
+        RELEASE(VBlob, self->blob);
+    }
+    if (self->desc.spot == 0) {
+        self->desc.spot = rfd->first;
+    }
+    else {
+        if (self->desc.spot >= rfd->first + rfd->count) {
+            *status = eVdbBlastNoErr;  /* end of reference */
+            return NULL;
+        }
+    }
+    rc = VCursorGetBlobDirect(self->curs,
+        &self->blob, self->desc.spot, self->col_READ);
+    if (rc != 0) {
+        PLOGERR(klogInt, (klogInt, rc,
+            "Cannot GetBlob REFERENCE/READ for $(acc)/$(spot) /4na)",
+            "acc=%s,spot=%zu", run->acc, self->desc.spot));
+        return 0;
+    }
+    if (self->blob == NULL) {
+        S
+        return 0;
+    }
+    rc = VBlobIdRange(self->blob, &first, &count);
+    if (rc != 0) {
+        PLOGERR(klogInt, (klogInt, rc,
+            "Cannot BlobIdRange REFERENCE/READ for $(acc)/$(spot) /4na",
+            "acc=%s,spot=%zu", run->acc, self->desc.spot));
+        return 0;
+    }
+    if (self->desc.spot < first || self->desc.spot >= first + count) {
+        /* requested blob b(spot) but spot < b.first || spot > b.last:
+           should never happen */
+        S /* PLOGERR */
+        return 0;
+    }
+    if (first > rfd->first + rfd->count) { /* should never happen */
+        S /* PLOGERR */
+        return 0;
+    }
+    last_spot = first + count;
+    if (rfd->first + rfd->count < last_spot) {
+        last_spot = rfd->first + rfd->count;
+    }
+    {
+#ifdef COMPARE
+        uint32_t row_len = 0;
+#endif
+        first_spot = self->desc.spot;
+#ifdef COMPARE
+        for (; self->desc.spot < last_spot; ++self->desc.spot) {
+            uint32_t elem_bits = 0;
+            uint32_t offset_to_first_bit = 0;
+            if (self->desc.spot == first_spot) {
+                rc = VBlobCellData(self->blob, self->desc.spot, &elem_bits,
+                    &out, &offset_to_first_bit, &row_len);
+                if (rc == 0 &&
+                    (elem_bits != 8 || offset_to_first_bit != 0))
+                {
+                    rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+                }
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc, "Error during CellData "
+                        "for $(acc)/REFERENCE/READ/$(spot)) /4na",
+                        "acc=%s,spot=%zu", run->acc, self->desc.spot));
+                    return NULL;
+                }
+                else {
+                    *length = row_len;
+                }
+            }
+            else if (self->desc.spot != last_spot - 1) {
+                *length += row_len;
+            }
+            else {
+                const void *base = NULL;
+                rc = VBlobCellData(self->blob, self->desc.spot,
+                    &elem_bits, &base, NULL, &row_len);
+                if (rc == 0 && elem_bits != 8) {
+                    rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+                }
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc, "Error during CellData "
+                        "for $(acc)/REFERENCE/READ/$(spot)) /4na",
+                        "acc=%s,spot=%zu", run->acc, self->desc.spot));
+                    return NULL;
+                }
+                else {
+                    *length += row_len;
+                }
+            }
+        }
+#endif
+    }
+    {
+        const void *base = NULL;
+        uint32_t boff = 0;
+        uint32_t len = 0;
+        uint32_t elem_bits = 0;
+        rc = VBlobCellData
+            (self->blob, first_spot, &elem_bits, &base, &boff, &len);
+        if (rc == 0 && (elem_bits != 8 || boff != 0)) {
+            rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+        }
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc, "Error during CellData "
+                "for $(acc)/REFERENCE/READ/$(spot)) /4na",
+                "acc=%s,spot=%zu", run->acc, first_spot));
+            return NULL;
+        }
+        if (first_spot + 1 == last_spot) {
+            /* the only chunk */
+        }
+        else if (len != MAX_SEQ_LEN) {
+            full_scan = true;
+            assert(0);
+        }
+        else {
+            const void *last_base = NULL;
+            uint32_t boff = 0;
+            uint32_t last_len = 0;
+            rc = VBlobCellData(self->blob, last_spot - 1,
+                &elem_bits, &last_base, &boff, &last_len);
+            if (rc == 0 && (elem_bits != 8 || boff != 0)) {
+                rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+            }
+            if (rc != 0) {
+                PLOGERR(klogInt, (klogInt, rc, "Error during CellData "
+                    "for $(acc)/REFERENCE/READ/$(spot)) /4na",
+                    "acc=%s,spot=%zu", run->acc, last_spot - 1));
+                return 0;
+            }
+            else {
+                size_t chunk_len = ((const uint8_t*)last_base
+                                     - (const uint8_t*)base) + last_len;
+                size_t num_ref_chunks
+                    = (chunk_len + MAX_SEQ_LEN - 1) / MAX_SEQ_LEN;
+                if (num_ref_chunks != last_spot - first_spot) {
+                    full_scan = true;
+                }
+                else {
+                    len = chunk_len;
+                }
+            }
+        }
+        if (!full_scan) {
+#ifdef COMPARE
+            assert(out == base);
+            assert(*length == len);
+            assert(self->desc.spot == last_spot);
+#else
+            out = base;
+            *length = len;
+            self->desc.spot = last_spot;
+#endif
+        }
+    }
+#ifndef COMPARE
+    if (full_scan)
+#endif
+    {
+            const void *starting_byte = NULL;
+            const void *prev_base = NULL;
+            size_t length_in_bases = 0;
+            uint32_t elem_bits = 0;
+            for (self->desc.spot = first_spot;
+                self->desc.spot < last_spot; ++self->desc.spot)
+            {
+                const void *base = NULL;
+                uint32_t boff = 0;
+                uint32_t len = 0;
+                rc = VBlobCellData(self->blob, self->desc.spot,
+                    &elem_bits, &base, &boff, &len);
+                if (rc == 0 && (elem_bits != 8 || boff != 0)) {
+                    rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+                }
+                if (rc != 0) {
+                    PLOGERR(klogInt, (klogInt, rc, "Error during CellData "
+                        "for $(acc)/REFERENCE/READ/$(spot)) /4na",
+                        "acc=%s,spot=%zu", run->acc, self->desc.spot));
+                    return 0;
+                }
+                if (self->desc.spot == first_spot) {
+                    starting_byte = base;
+                }
+                else {
+                    if ((const uint8_t*)prev_base + MAX_SEQ_LEN != base) {
+                        assert(full_scan);
+                        break;
+                    }
+                }
+                prev_base = base;
+                length_in_bases += len;
+            }
+#ifdef COMPARE
+            if (!full_scan) {
+                assert(out == starting_byte);
+                assert(*length == length_in_bases);
+                assert(self->desc.spot == last_spot);
+            }
+#endif
+            if (full_scan) {
+                out = starting_byte;
+                *length = length_in_bases;
+            }
+    }
+    if (self->desc.spot < rfd->first + rfd->count) {
+        *status = eVdbBlastChunkedSequence;
+    }
+    else if (rfd->circular && ! self->desc.circular) {
+        *status = eVdbBlastCircularSequence;
+        self->desc.circular = true;
+        self->desc.spot = rfd->first;
+    }
+    else {
+        *status = eVdbBlastNoErr;
+        self->desc.circular = false;
+    }
+    return out;
+}
+
+/******************************************************************************/
diff --git a/libs/blast/reference.h b/libs/blast/reference.h
new file mode 100644
index 0000000..0b0272d
--- /dev/null
+++ b/libs/blast/reference.h
@@ -0,0 +1,86 @@
+#ifndef _h_libs_blast_reference_
+#define _h_libs_blast_reference_
+
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_ncbi_vdb_blast_
+#include <ncbi/vdb-blast.h> /* VdbBlastStatus */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+struct Core2na;
+struct Core4na;
+struct Data2na;
+struct References;
+struct RunSet;
+
+
+uint32_t _Core2naDataRef(struct Core2na *self,
+    struct Data2na *data, VdbBlastStatus *status,
+    Packed2naRead *buffer, uint32_t buffer_length);
+
+uint64_t _Core2naReadRef(struct Core2na *self, VdbBlastStatus *status,
+    uint64_t *read_id, uint8_t *buffer, size_t buffer_size);
+
+
+const uint8_t* _Core4naDataRef(struct Core4na *self, const struct RunSet *runs,
+    uint32_t *status, uint64_t read_id, size_t *length);
+
+size_t _Core4naReadRef(struct Core4na *self, const struct RunSet *runs,
+    uint32_t *status, uint64_t read_id, size_t starting_base,
+    uint8_t *buffer, size_t buffer_length);
+
+
+const struct References* _RunSetMakeReferences
+    (struct RunSet *self, VdbBlastStatus *status);
+
+void _ReferencesWhack(const struct References *self);
+
+uint64_t _ReferencesGetNumSequences
+    (const struct References *self, VdbBlastStatus *status);
+
+VdbBlastStatus _ReferencesGetReadId(const struct References *self,
+    const char *name_buffer, size_t bsize, uint64_t *read_id);
+
+size_t CC _ReferencesGetReadName(const struct References *self,
+    uint64_t read_id, char *name_buffer, size_t bsize);
+
+uint64_t _ReferencesGetTotalLength
+    (const struct References *self, VdbBlastStatus *status);
+
+uint64_t _ReferencesGetReadLength
+    (const struct References *self, uint64_t read_id, VdbBlastStatus *status);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_libs_blast_reference_ */
diff --git a/libs/blast/run-set.c b/libs/blast/run-set.c
new file mode 100644
index 0000000..91727fa
--- /dev/null
+++ b/libs/blast/run-set.c
@@ -0,0 +1,3251 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vdb/extern.h>
+
+#include "reader.h" /* _RunSetFindReadDesc */
+#include "blast-mgr.h" /* BTableType */
+#include "run-set.h" /* VdbBlastRunSet */
+
+#include <kdb/kdb-priv.h> /* KTableGetPath */
+#include <kdb/table.h> /* KTable */
+
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/log.h> /* LOGERR */
+#include <klib/rc.h> /* RC */
+#include <klib/refcount.h> /* KRefcount */
+#include <klib/status.h> /* STSMSG */
+
+#include <kproc/lock.h> /* KLockMake */
+
+#include <ncbi/vdb-blast.h> /* VdbBlastRunSet */
+
+#include <vdb/cursor.h> /* VCursor */
+#include <vdb/database.h> /* VDatabase */
+#include <vdb/table.h> /* VTable */
+#include <vdb/vdb-priv.h> /* VTableOpenKTableRead */
+
+#include <sysalloc.h>
+
+#include <string.h> /* memset */
+#include <time.h> /* time_t */
+
+#include <limits.h> /* PATH_MAX */
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+void _Core2naFini(Core2na *self);
+void _Core4naFini(Core4na *self);
+
+/******************************************************************************/
+
+static void *_NotImplementedP(const char *func) {
+    PLOGERR(klogErr, (klogErr, -1,
+        "$(func): is not implemented", "func=%s", func));
+    return 0;
+}
+
+static size_t _NotImplemented(const char *func)
+{   return (size_t)_NotImplementedP(func); }
+
+static uint64_t CC Min(uint64_t cand,
+    uint64_t champ, int64_t minRead, bool *done)
+{
+    assert(done);
+    if (minRead >= 0) {
+        if (cand < minRead) {
+            return champ;
+        }
+        else if (cand == minRead) {
+            *done = true;
+            return minRead;
+        }
+    } 
+    return cand < champ ? cand : champ;
+}
+
+static uint64_t CC Max(uint64_t cand,
+    uint64_t champ, int64_t minRead, bool *done)
+{
+    return cand > champ ? cand : champ;
+}
+
+static char* _CanonocalName(const char *name) {
+    size_t noExtSize = 0;
+    size_t namelen = 0;
+    const char ext[] = ".sra";
+
+    if (name == NULL) {
+        return NULL;
+    }
+
+    noExtSize = namelen = string_size(name);
+
+    if (namelen >= sizeof(ext)) {
+        const char *tail = NULL;
+        noExtSize -= sizeof ext - 1;
+        tail = name + noExtSize;
+        if (string_cmp(ext, sizeof ext - 1, tail, sizeof ext - 1, 99) != 0) {
+            noExtSize = namelen;
+        }
+    }
+
+    return string_dup(name, noExtSize);
+}
+
+/******************************************************************************/
+
+static rc_t _VCursorCellDataDirect(const VCursor *self,
+    int64_t row_id, uint32_t col_idx, uint32_t elemBits,
+    const void **base, uint32_t nreads, const char *name)
+{
+    uint32_t elem_bits = 0;
+    uint32_t row_len = 0;
+    uint32_t boff = 0;
+
+    rc_t rc = VCursorCellDataDirect(self, row_id, col_idx,
+        &elem_bits, base, &boff, &row_len);
+
+    if (rc != 0) {
+        PLOGERR(klogInt, (klogInt, rc,
+            "Error during VCursorCellDataDirect($(name), $(spot))",
+            "name=%s,spot=%lu", name, col_idx));
+    }
+    else if (boff != 0 || elem_bits != elemBits) {
+        rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+        PLOGERR(klogInt, (klogInt, rc,
+            "Bad VCursorCellDataDirect($(name), $(spot)) result: "
+            "boff=$(boff), elem_bits=$(elem_bits)",
+            "name=%s,spot=%lu,boff=%u,elem_bits=%u",
+            name, col_idx, boff, elem_bits));
+    }
+    else if (row_len != nreads) {
+        rc = RC(rcSRA, rcCursor, rcReading, rcData, rcUnexpected);
+        PLOGERR(klogInt, (klogInt, rc,
+            "Bad VCursorCellDataDirect($(name), $(spot)) result: "
+            "row_len=$(row_len)",
+            "name=%s,spot=%lu,row_len=%u", name, col_idx, row_len));
+    }
+
+    return rc;
+}
+
+/******************************************************************************/
+
+static VdbBlastStatus _VDatabaseOpenAlignmentTable(const VDatabase *self,
+    const char *path,
+    const VTable **tbl)
+{
+    const char *table = "PRIMARY_ALIGNMENT";
+
+    rc_t rc = VDatabaseOpenTableRead(self, tbl, table);
+    if (rc != 0) {
+        PLOGERR(klogInt, (klogInt, rc,
+            "Error in VDatabaseOpenTableRead($(name), $(tbl))",
+            "name=%s,tbl=%s", path, table));
+        STSMSG(1, ("Error: failed to open DB table '%s/%s'", path, table));
+    }
+    else {
+        STSMSG(1, ("Opened DB table '%s/%s'", path, table));
+    }
+
+    return rc != 0 ? eVdbBlastErr : eVdbBlastNoErr;;
+}
+
+/******************************************************************************/
+
+typedef struct {
+    const VCursor *curs;
+    uint32_t colREAD_LEN;
+    uint32_t colREAD_TYPE;
+    uint64_t techBasesPerSpot;
+    bool techBasesPerSpotEquals;
+    uint64_t bioBasesCnt;
+} ApprCnt;
+static rc_t _ApprCntInit(ApprCnt *self, const VTable *tbl, const char *acc) {
+    rc_t rc = 0;
+
+    assert(self);
+
+    memset(self, 0, sizeof *self);
+
+    self->techBasesPerSpotEquals = true;
+    self->techBasesPerSpot = ~0;
+
+    if (rc == 0) {
+        rc = VTableCreateCursorRead(tbl, &self->curs);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error during VTableCreateCursorRead for $(acc)",
+                "acc=%s", acc));
+        }
+    }
+
+    if (rc == 0) {
+        const char name[] = "READ_LEN";
+        rc = VCursorAddColumn(self->curs, &self->colREAD_LEN, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error during VCursorAddColumn($(name))", "name=%s", name));
+        }
+    }
+
+    if (rc == 0) {
+        const char name[] = "READ_TYPE";
+        rc = VCursorAddColumn(self->curs, &self->colREAD_TYPE, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error during VCursorAddColumn($(name))", "name=%s", name));
+        }
+    }
+
+    if (rc == 0) {
+        rc = VCursorOpen(self->curs);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error during VCursorOpen");
+        }
+    }
+
+    return rc;
+}
+
+static rc_t _ApprCntFini(ApprCnt *self) {
+    rc_t rc = 0;
+    assert(self);
+    RELEASE(VCursor, self->curs);
+    memset(self, 0, sizeof *self);
+    return rc;
+}
+
+static rc_t _ApprCntChunk(ApprCnt *self,
+    uint64_t chunk, uint64_t l, uint64_t nspots, uint32_t nreads)
+{
+    rc_t rc = 0;
+    uint64_t start = nspots / 10 * chunk + 1;
+    uint64_t spot = 0;
+    uint64_t end = start + l;
+    assert(self);
+    if (end - 1 > nspots) {
+        end = nspots + 1;
+    }
+    for (spot = start; spot < end; ++spot) {
+        uint64_t techBases = 0;
+        uint64_t bioBases = 0;
+        uint32_t read = 0;
+        const uint32_t *readLen = NULL;
+        const INSDC_read_type *readType = NULL;
+        const void *base = NULL;
+        rc = _VCursorCellDataDirect(self->curs, spot, self->colREAD_LEN,
+            32, &base, nreads, "READ_LEN");
+        if (rc != 0) {
+            return rc;
+        }
+        readLen = base;
+        rc = _VCursorCellDataDirect(self->curs, spot, self->colREAD_TYPE,
+            8, &base, nreads, "READ_TYPE");
+        if (rc != 0) {
+            return rc;
+        }
+        readType = base;
+        for (read = 0; read < nreads; ++read) {
+            INSDC_read_type type = readType[read] & 1;
+            if (type == READ_TYPE_BIOLOGICAL) {
+                bioBases += readLen[read];
+            }
+            else {
+                techBases += readLen[read];
+            }
+        }
+        if (self->techBasesPerSpotEquals) {
+            if (self->techBasesPerSpot != techBases) {
+                if (self->techBasesPerSpot == ~0) {
+                    self->techBasesPerSpot = techBases;
+                }
+                else {
+                    self->techBasesPerSpotEquals = false;
+                }
+            }
+        }
+        self->bioBasesCnt += bioBases;
+    }
+    return rc;
+}
+
+/******************************************************************************/
+
+static rc_t _VTableLogRowData(const VTable *self,
+    const char *column, void *buffer, uint32_t blen)
+{
+    rc_t rc = 0;
+
+#if _DEBUGGING
+    if (buffer && blen == 64) {
+        uint64_t data = *((uint64_t*)buffer);
+        const KTable *ktbl = NULL;
+        rc_t rc = VTableOpenKTableRead(self, &ktbl);
+        if (rc == 0) {
+            const char *path = NULL;
+            rc = KTableGetPath(ktbl, &path);
+            if (rc == 0) {
+                DBGMSG(DBG_BLAST, DBG_FLAG(DBG_BLAST_BLAST),
+                    ("%s: %s: %lu\n", path, column, data));
+            }
+        }
+
+        KTableRelease(ktbl);
+    }
+#endif
+
+    if (rc != 0)
+    {   PLOGERR(klogInt, (klogInt, rc, "Error in $(f)", "f=%s", __func__)); }
+
+    return rc;
+}
+
+static rc_t _VTableMakeCursorImpl(const VTable *self, const VCursor **curs,
+    uint32_t *col_idx, const char *col_name, bool canBeMissed, const char *acc)
+{
+    rc_t rc = 0;
+
+    assert(curs && col_name);
+
+    if (rc == 0) {
+        rc = VTableCreateCursorRead(self, curs);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error during VTableCreateCursorRead");
+        }
+    }
+
+    if (rc == 0) {
+        VCursorPermitPostOpenAdd(*curs);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error during VCursorPermitPostOpenAdd");
+        }
+    }
+
+    if (rc == 0) {
+        rc = VCursorOpen(*curs);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VCursorOpen($(name))", "name=%s", col_name));
+        }
+    }
+
+    if (rc == 0) {
+        assert(*curs);
+        rc = VCursorAddColumn(*curs, col_idx, "%s", col_name);
+        if (rc != 0 && !canBeMissed) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VCursorAddColumn($(name))", "name=%s", col_name));
+        }
+    }
+
+    STSMSG(2, ("Prepared a VCursor to read '%s'", col_name));
+
+    return rc;
+}
+
+rc_t _VTableMakeCursor(const VTable *self, const VCursor **curs,
+    uint32_t *col_idx, const char *col_name, const char *acc)
+{
+    return _VTableMakeCursorImpl(self, curs, col_idx, col_name, false, acc);
+}
+
+/*static*/
+uint32_t _VTableReadFirstRowImpl(const VTable *self, const char *name,
+    void *buffer, uint32_t blen, EColType *is_static, bool canBeMissed,
+    uint32_t *row_len, const char *acc)
+{
+    VdbBlastStatus status = eVdbBlastNoErr;
+
+    rc_t rc = 0;
+
+    const VCursor *curs = NULL;
+    uint32_t idx = 0;
+
+    uint32_t dummy = 0;
+    if (row_len == NULL) {
+        row_len = &dummy;
+    }
+
+    assert(self && name);
+
+    blen *= 8;
+
+    rc = _VTableMakeCursorImpl(self, &curs, &idx, name, canBeMissed, acc);
+    if (rc != 0) {
+        if (rc ==
+            SILENT_RC(rcVDB, rcCursor, rcOpening, rcColumn, rcUndefined)
+         || rc ==
+            SILENT_RC(rcVDB, rcCursor, rcUpdating, rcColumn, rcNotFound))
+        {
+            if (!canBeMissed) {
+                PLOGMSG(klogInfo, (klogInfo, "$(f): Column '$(name)' not found",
+                    "f=%s,name=%s", __func__, name));
+            }
+            if (is_static != NULL) {
+                *is_static = eColTypeAbsent;
+            }
+            status = eVdbBlastTooExpensive;
+        }
+        else {
+            status = eVdbBlastErr;
+            if (is_static != NULL) {
+                *is_static = eColTypeError;
+            }
+        }
+    }
+
+    if (status == eVdbBlastNoErr && rc == 0) {
+        rc = VCursorOpenRow(curs);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VCursorOpenRow($(name))", "name=%s", name));
+        }
+    }
+
+    if (status == eVdbBlastNoErr && rc == 0 && buffer != NULL && blen > 0) {
+        rc = VCursorRead(curs, idx, 8, buffer, blen, row_len);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error in VCursorRead($(name))", "name=%s", name));
+        }
+    }
+
+/* TODO: needs to be verified what row_len is expected
+    if (*row_len != 1) return eVdbBlastErr; */
+
+    STSMSG(2, ("Read the first row of '%s'", name));
+
+    if (status == eVdbBlastNoErr && rc == 0) {
+        if (blen == 64) {
+            _VTableLogRowData(self, name, buffer, blen);
+        }
+        if (is_static != NULL) {
+            bool isStatic = false;
+            rc = VCursorIsStaticColumn(curs, idx, &isStatic);
+            if (rc != 0) {
+                PLOGERR(klogInt, (klogInt, rc,
+                    "Error in VCursorIsStaticColumn($(name))",
+                    "name=%s", name));
+            }
+            else {
+                *is_static = isStatic ? eColTypeStatic : eColTypeNonStatic;
+            }
+        }
+    }
+
+    VCursorRelease(curs);
+
+    if (status == eVdbBlastNoErr && rc != 0) {
+        status = eVdbBlastErr;
+    }
+    return status;
+}
+
+static VdbBlastStatus _VTableReadFirstRow(const VTable *self, const char *name,
+    void *buffer, uint32_t blen, EColType *is_static, const char *acc)
+{
+    return _VTableReadFirstRowImpl
+        (self, name, buffer, blen, is_static, false, NULL, acc);
+}
+
+static INSDC_SRA_platform_id _VTableReadPLATFORMoptional
+    (const VTable *self, const char *acc)
+{
+    INSDC_SRA_platform_id platform = SRA_PLATFORM_UNDEFINED;
+
+    VdbBlastStatus status = _VTableReadFirstRowImpl(self,
+        "PLATFORM", &platform, sizeof platform, NULL, true, NULL, acc);
+
+    if (status == eVdbBlastNoErr) {
+        return platform;
+    }
+    else {
+        return SRA_PLATFORM_UNDEFINED;
+    }
+}
+
+static bool _VTableVarReadNum(const VTable *self, const char *acc) {
+    return _VTableReadPLATFORMoptional(self, acc) == SRA_PLATFORM_PACBIO_SMRT;
+}
+
+static uint64_t BIG = 10000 /*11*/; 
+static rc_t _VTableBioBaseCntApprox(const VTable *self,
+    uint64_t nspots, uint32_t nreads, uint64_t *bio_base_count, const char *acc)
+{
+    rc_t rc = 0;
+    uint64_t c = nspots;
+    uint64_t d = 1;
+    ApprCnt ac;
+    rc = _ApprCntInit(&ac, self, acc);
+    assert(bio_base_count);
+    if (rc == 0) {
+        if (nspots < BIG) {
+            STSMSG(2,
+                ("VdbBlastRunSetGetTotalLengthApprox: counting all reads\n"));
+            rc = _ApprCntChunk(&ac, 0, nspots, nspots, nreads);
+        }
+        else {
+            uint64_t i = 0;
+            uint64_t l = 0;
+            uint64_t n = 10 /* 3 */;
+            while (c > BIG) {
+                c /= 2;
+                d *= 2;
+            }
+            l = c / n;
+            if (l == 0) {
+                l = 1;
+            }
+            for (i = 1; i < n - 1 && rc == 0; ++i) {
+                rc = _ApprCntChunk(&ac, i, l, nspots, nreads);
+            }
+        }
+    }
+    if (rc == 0) {
+        VdbBlastStatus status = eVdbBlastNoErr;
+        if (nspots < BIG) {
+            *bio_base_count = ac.bioBasesCnt;
+        }
+        else {
+            if (ac.techBasesPerSpotEquals && ac.techBasesPerSpot == ~0) {
+                ac.techBasesPerSpotEquals = false;
+            }
+            if (ac.techBasesPerSpotEquals ) {
+                uint64_t baseCount = 0;
+                status = _VTableReadFirstRow(self,
+                    "BASE_COUNT", &baseCount, sizeof baseCount, NULL, acc);
+                if (status == eVdbBlastNoErr) {
+                    STSMSG(2, ("VdbBlastRunSetGetTotalLengthApprox: "
+                        "fixed technical reads length\n"));
+                    *bio_base_count = baseCount - nspots * ac.techBasesPerSpot;
+                }
+                else {
+                    STSMSG(1, ("VdbBlastRunSetGetTotalLengthApprox: "
+                        "cannot read BASE_COUNT\n"));
+                }
+            }
+            if (!ac.techBasesPerSpotEquals || status != eVdbBlastNoErr) {
+/*              double dd = nspots / c; */
+                STSMSG(2, ("VdbBlastRunSetGetTotalLengthApprox: "
+                    "extrapolating variable read length\n"));
+                *bio_base_count = ac.bioBasesCnt * d;
+            }
+        }
+    }
+    _ApprCntFini(&ac);
+    return rc;
+}
+
+static
+uint32_t _VTableGetNReads(const VTable *self, uint32_t *nreads, const char *acc)
+{
+    rc_t rc = 0;
+    VdbBlastStatus status = eVdbBlastNoErr;
+    const VCursor *curs = NULL;
+    uint32_t idx = 0;
+
+    const char name[] = "READ_LEN";
+
+    assert(nreads);
+
+    rc = _VTableMakeCursor(self, &curs, &idx, name, acc);
+    if (rc != 0) {
+        status = eVdbBlastErr;
+        if (rc ==
+            SILENT_RC(rcVDB, rcCursor, rcOpening, rcColumn, rcUndefined))
+        {
+            PLOGMSG(klogInfo, (klogInfo, "$(f): Column '$(name)' not found",
+                "f=%s,name=%s", __func__, name));
+        }
+        else {
+            PLOGMSG(klogInfo, (klogInfo, "$(f): Cannot open column '$(name)'",
+                "f=%s,name=%s", __func__, name));
+        }
+    }
+
+    if (status == eVdbBlastNoErr) {
+        uint32_t elem_bits, elem_off, elem_cnt;
+        const void *base = NULL;
+        rc = VCursorCellDataDirect(curs, 1, idx,
+                &elem_bits, &base, &elem_off, &elem_cnt);
+        if (rc != 0) {
+            status = eVdbBlastErr;
+            PLOGMSG(klogInfo, (klogInfo,
+                "$(f): Cannot '$(name)' CellDataDirect",
+                "f=%s,name=%s", __func__, name));
+        }
+        else if (elem_off != 0 || elem_bits != 32) {
+            status = eVdbBlastErr;
+            PLOGERR(klogInt, (klogInt, rc,
+                "Bad VCursorCellDataDirect(READ_LEN) result: "
+                "boff=$(elem_off), elem_bits=$(elem_bits)",
+                "elem_off=%u, elem_bits=%u", elem_off, elem_bits));
+        }
+        else {
+            *nreads = elem_cnt;
+        }
+    }
+    
+    RELEASE(VCursor, curs);
+
+    return status;
+}
+
+static bool _VTableCSra(const VTable *self) {
+    bool cSra = false;
+
+    KNamelist *names = NULL;
+
+    uint32_t i = 0, count = 0;
+
+    rc_t rc = VTableListPhysColumns(self, &names);
+
+    if (rc == 0) {
+        rc = KNamelistCount(names, &count);
+    }
+
+    for (i = 0 ; i < count && rc == 0; ++i) {
+        const char *name = NULL;
+        rc = KNamelistGet(names, i, &name);
+        if (rc == 0) {
+            const char b[] = "CMP_READ";
+            if (string_cmp(name, string_measure(name, NULL),
+                b, sizeof b - 1, sizeof b - 1) == 0)
+            {
+                cSra = true;
+                break;
+            }
+        }
+    }
+
+    RELEASE(KNamelist, names);
+
+    return cSra;
+}
+
+/******************************************************************************/
+
+static void _RunDescFini(RunDesc *self) {
+    assert(self);
+    free(self->readLen);
+    free(self->readType);
+    free(self->rdFilter);
+    memset(self, 0, sizeof *self);
+}
+
+static
+uint64_t _RunDescMakeReadId(const RunDesc *self, uint64_t spot, uint8_t read,
+    uint64_t read_id, VdbBlastStatus *status)
+{
+    bool overflow = false;
+
+    assert(self && status);
+
+    *status = eVdbBlastNoErr;
+
+    if (self->readIdDesc.idType == eFixedReadN) {
+        return read_id;
+    }
+
+    assert(self->readIdDesc.idType == eFactor10);
+
+    read_id = read * self->spotBits + spot;
+    if (read_id < self->spotBits) {
+        overflow = true;
+    }
+
+    if (self->readIdDesc.runBits > 0) {
+        uint64_t prev = read_id;
+        read_id *= self->readIdDesc.runBits;
+        read_id += self->index;
+        if (read_id < prev) {
+            overflow = true;
+        }
+    }
+
+    if (overflow) {
+        *status = eVdbBlastErr;
+    }
+
+    return read_id;
+}
+
+/******************************************************************************/
+/* VdbBlastDb */
+static void _VdbBlastDbWhack(VdbBlastDb *self) {
+    if (self == NULL) {
+        return;
+    }
+
+    VCursorRelease(self->cursACCESSION);
+    VCursorRelease(self->cursSeq);
+
+    VTableRelease(self->prAlgnTbl);
+    VTableRelease(self->refTbl);
+    VTableRelease(self->seqTbl);
+
+    VDatabaseRelease(self->db);
+
+    memset(self, 0, sizeof *self);
+
+    free(self);
+}
+
+static rc_t _VdbBlastDbOpenSeqCurs(VdbBlastDb *self, const char *acc) {
+    rc_t rc = 0;
+    const VCursor *curs = NULL;
+    assert(self);
+    if (self->cursSeq != NULL) {
+        return 0;
+    }
+    rc = VTableCreateCursorRead(self->seqTbl, &self->cursSeq);
+    if (rc != 0) {
+        PLOGERR(klogInt, (klogInt, rc,
+            "Error during VTableCreateCursorRead for $(acc)", "acc=%s", acc));
+    }
+    else {
+        curs = self->cursSeq;
+    }
+    if (rc == 0) {
+        const char name[] = "READ_FILTER";
+        rc = VCursorAddColumn(curs, &self->col_READ_FILTER, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error during VCursorAddColumn($(name))", "name=%s", name));
+        }
+    }
+    if (rc == 0) {
+        const char name[] = "READ_LEN";
+        rc = VCursorAddColumn(curs, &self->col_READ_LEN, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error during VCursorAddColumn($(name))", "name=%s", name));
+        }
+    }
+    if (rc == 0) {
+        const char name[] = "READ_TYPE";
+        rc = VCursorAddColumn(curs, &self->col_READ_TYPE, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error during VCursorAddColumn($(name))", "name=%s", name));
+        }
+    }
+    if (rc == 0) {
+        const char name[] = "TRIM_LEN";
+        rc = VCursorAddColumn(curs, &self->col_TRIM_LEN, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error during VCursorAddColumn($(name))", "name=%s", name));
+        }
+    }
+    if (rc == 0) {
+        const char name[] = "TRIM_START";
+        rc = VCursorAddColumn(curs, &self->col_TRIM_START, name);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error during VCursorAddColumn($(name))", "name=%s", name));
+        }
+    }
+    if (rc == 0) {
+        rc = VCursorOpen(curs);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error during VCursorOpen");
+        }
+    }
+    return rc;
+}
+
+typedef enum {
+    eFirstRead,
+    eNextRead,
+    eAllReads,
+} TReadType;
+static rc_t _VdbBlastDbFindRead
+    (const VdbBlastDb *self, ReadDesc *rd, TReadType type, bool *found)
+{
+    rc_t rc = 0;
+
+    int64_t first = 0;
+    uint64_t count = 0;
+
+    const VCursor *curs = NULL;
+
+    assert(self && rd && found);
+
+    *found = false;
+
+    if (type == eAllReads) {
+        memset(rd, 0, sizeof *rd);
+    }
+
+    curs = self->cursSeq;
+
+    rc = VCursorIdRange(curs, self->col_READ_LEN, &first, &count);
+
+    if (rc == 0) {
+        int64_t i = 0;
+        uint32_t c = 0;
+        if (type == eNextRead) {
+            if (rd->spot < first) {
+                return -1;
+            }
+            i = rd->spot - first;
+            c = rd->read;
+            if (c + 1 >= rd->nReads) {
+                c = 0;
+                ++i;
+            }
+        }
+        for (; i < count; ++i) {
+            int64_t spot = first + i;
+
+            const void *base = NULL;
+            uint32_t elem_bits = 0;
+            uint32_t elem_cnt = 0;
+            uint32_t elem_off = 0;
+            rc = VCursorCellDataDirect(curs, spot, self->col_READ_TYPE,
+                &elem_bits, &base, &elem_off, &elem_cnt);
+            if (rc != 0) {
+                break;
+            }
+            else {
+                INSDC_read_type *aRt = (INSDC_read_type*)base;
+                for (; c < elem_cnt; ++c) {
+                    INSDC_read_type *rt = aRt + c;
+                    assert(rt);
+
+                    if (*rt & SRA_READ_TYPE_BIOLOGICAL) {
+                        *found = true;
+                        if (type == eAllReads) {
+                            ++rd->spot;
+                        }
+                        else {
+                            rd->spot = spot;
+                            rd->read = c + 1;
+                            rd->nReads = elem_cnt;
+                            return rc;
+                        }
+                    }
+                }
+                c = 0;
+            }
+        }
+    }
+
+    return rc;
+}
+
+static rc_t _VdbBlastDbFindFirstRead
+    (const VdbBlastDb *self, ReadDesc *rd, bool *found)
+{   return _VdbBlastDbFindRead(self, rd, eFirstRead, found); }
+static rc_t _VdbBlastDbFindNextRead
+    (const VdbBlastDb *self, ReadDesc *rd, bool *found)
+{   return _VdbBlastDbFindRead(self, rd, eNextRead , found); }
+
+rc_t _ReadDescFindNextRead(ReadDesc *self, bool *found) {
+    assert(self && self->run && self->run);
+    return _VdbBlastDbFindNextRead(self->run->obj, self, found);
+}
+
+static rc_t _VdbBlastDbOpenCursAndGetFirstRead
+    (VdbBlastDb *self, ReadDesc *desc, bool *found, const char *acc)
+{
+    rc_t rc = _VdbBlastDbOpenSeqCurs(self, acc);
+    if (rc == 0) {
+        rc = _VdbBlastDbFindFirstRead(self, desc, found);
+    }
+    return rc;
+}
+
+static rc_t _VdbBlastDbOpenCursAndGetAllReads
+    (VdbBlastDb *self, ReadDesc *desc, const char *acc)
+{
+    rc_t rc = _VdbBlastDbOpenSeqCurs(self, acc);
+    if (rc == 0) {
+        bool found = false;
+        rc = _VdbBlastDbFindRead(self, desc, eAllReads, &found);
+    }
+    return rc;
+}
+
+uint64_t _VdbBlastRunSetGetAllReads
+    (const VdbBlastRunSet *self, uint32_t run)
+{
+    ReadDesc desc;
+
+    assert(self);
+
+    if (run >= self->runs.krun) {
+        return 0;
+    }
+
+    if (_VdbBlastDbOpenCursAndGetAllReads
+        (self->runs.run[run].obj, &desc, self->runs.run[run].acc))
+    {
+        return 0;
+    }
+
+    return desc.spot;
+}
+
+static rc_t _VdbBlastDbGetNReads
+    (VdbBlastDb *self, uint64_t spot, uint32_t *nReads, const char *acc)
+{
+    rc_t rc = _VdbBlastDbOpenSeqCurs(self, acc);
+    assert(self && nReads);
+    *nReads = 0;
+    if (rc == 0) {
+        const void *base = NULL;
+        uint32_t elem_bits = 0;
+        uint32_t elem_cnt = 0;
+        uint32_t elem_off = 0;
+        rc = VCursorCellDataDirect(self->cursSeq, spot, self->col_READ_TYPE,
+            &elem_bits, &base, &elem_off, &elem_cnt);
+        if (rc == 0) {
+            *nReads = elem_cnt;
+        }
+        else {
+            PLOGERR(klogInt, (klogInt, rc, "Cannot get "
+                "CellDataDirect for $(acc)/READ_TYPE/$(spot)",
+                "acc=%s,spot=%lu", acc, spot));
+        }
+    }
+    return rc;
+}
+
+/******************************************************************************/
+/*VdbBlastRun*/
+
+static void _VdbBlastRunFini(VdbBlastRun *self) {
+    if (self == NULL) {
+        return;
+    }
+
+    _VdbBlastDbWhack(self->obj);
+
+    free(self->acc);
+    free(self->path);
+
+    _RunDescFini(&self->rd);
+
+    memset(self, 0, sizeof *self);
+}
+
+static VdbBlastStatus _VdbBlastRunInit(VdbBlastRun *self, VdbBlastDb *obj,
+    const char *rundesc, BTableType type, const KDirectory *dir,
+    char *fullpath, uint32_t min_read_length, uint32_t index)
+{
+    rc_t rc = 0;
+    const char *acc = rundesc;
+    char rbuff[4096] = "";
+    size_t size = 0;
+
+    char slash = '/';
+
+    assert(!dir && self && obj && type != btpUndefined && rundesc);
+
+    {
+        KDirectory *dir = NULL;
+        if (KDirectoryNativeDir(&dir) != 0) {
+            LOGERR(klogInt, rc, "Error during KDirectoryNativeDir");
+            return eVdbBlastErr;
+        }
+/* TODO This is obsolete and incorrect */
+        rc = KDirectoryResolvePath(dir, true,
+            rbuff, sizeof rbuff, "%s", rundesc);
+        KDirectoryRelease(dir);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc,
+                "Error during KDirectoryResolvePath($(path))",
+                "path=%s", rundesc));
+            return eVdbBlastErr;
+        }
+    }
+
+    memset(self, 0, sizeof *self);
+
+    self->rd.index = index;
+    self->obj = obj;
+    self->type = type;
+
+    self->alignments
+        = self->bioBases = self->bioBasesApprox
+        = self->bioReads = self->bioReadsApprox = ~0;
+
+    acc = strrchr(rbuff, slash);
+    if (acc == NULL) {
+        acc = rbuff;
+    }
+    else if (string_measure(acc, &size) > 1) {
+        ++acc;
+    }
+    else {
+        acc = rbuff;
+    }
+
+    if (fullpath == NULL) {
+        self->path = string_dup(rbuff, sizeof(rbuff));
+        if (self->path == NULL) {
+            return eVdbBlastMemErr;
+        }
+    }
+    else {
+        self->path = fullpath;
+    }
+    self->acc = _CanonocalName(acc);
+    if (self->acc == NULL) {
+        return eVdbBlastMemErr;
+    }
+
+    self->min_read_length = min_read_length;
+
+    self->cSra = _VTableCSra(self->obj->seqTbl);
+
+    return eVdbBlastNoErr;
+}
+
+static uint32_t Bits(uint64_t n, EReadIdType idType) {
+    uint32_t bits = 1;
+
+    if (idType == eFixedReadN) {
+        return 0;
+    }
+
+    assert(idType == eFactor10);
+
+    if (n == 0) {
+        return 0;
+    }
+
+    while (n > 0) {
+        bits *= 10;
+        n /= 10;
+    }
+
+    return bits;
+}
+
+/*static*/ VdbBlastStatus _VdbBlastRunFillRunDesc(VdbBlastRun *self) {
+    VdbBlastStatus status = eVdbBlastNoErr;
+    RunDesc *rd = NULL;
+
+    int i = 0;
+    const char *col = NULL;
+
+    assert(self);
+
+    rd = &self->rd;
+
+    if (rd->spotCount || rd->readType || rd->nReads || rd->nBioReads) {
+        if (self->cSra && rd->cmpBaseCount == ~0) {
+            rc_t rc = RC(rcSRA, rcTable, rcReading, rcColumn, rcNotFound);
+            PLOGERR(klogInt, (klogInt, rc,
+                "Cannot read CMP_BASE_COUNT column for $(p)",
+                "p=%s", self->path));
+            STSMSG(1, ("Error: failed to read %s/%s",
+                self->path, "CMP_BASE_COUNT"));
+            return eVdbBlastErr;
+        }
+        else {
+            S
+            return eVdbBlastNoErr;
+        }
+    }
+
+    assert(self->path && self->obj);
+
+    col = "SPOT_COUNT";
+    status = _VTableReadFirstRow(self->obj->seqTbl,
+        col, &rd->spotCount, sizeof rd->spotCount, NULL, self->acc);
+    if (status != eVdbBlastNoErr) {
+        STSMSG(1, ("Error: failed to read %s/%s", self->path, col));
+        return status;
+    }
+
+    rd->spotBits = Bits(rd->spotCount, rd->readIdDesc.idType);
+
+    if (self->type == btpWGS) {
+        S
+        status = eVdbBlastNoErr;
+        rd->nReads = rd->spotCount > 0 ? 1 : 0;
+    }
+    else if (self->type == btpREFSEQ) {
+        S
+        status = eVdbBlastNoErr;
+        rd->nReads = 1;
+    }
+    else {
+        uint32_t nreads = 0;
+        status = _VTableGetNReads(self->obj->seqTbl, &nreads, self->acc);
+        if (status == eVdbBlastNoErr) {
+            rd->nReads = nreads;
+        }
+    }
+
+    switch (self->type) {
+        case btpSRA:
+            col = "PLATFORM";
+            status = _VTableReadFirstRow(self->obj->seqTbl,
+                col, &rd->platform, sizeof rd->platform, NULL, self->acc);
+            if (status != eVdbBlastNoErr) {
+                STSMSG(1, ("Error: failed to read %s/%s", self->path, col));
+                return status;
+            }
+            switch (rd->platform) { /* TODO */
+                case SRA_PLATFORM_ILLUMINA:
+                case SRA_PLATFORM_ABSOLID:
+                case SRA_PLATFORM_COMPLETE_GENOMICS:
+                    rd->varReadLen = false;
+                    break;
+                case SRA_PLATFORM_UNDEFINED:
+                case SRA_PLATFORM_454:
+                case SRA_PLATFORM_HELICOS:
+                case SRA_PLATFORM_PACBIO_SMRT:
+                case SRA_PLATFORM_ION_TORRENT:
+                case SRA_PLATFORM_CAPILLARY:
+                case SRA_PLATFORM_OXFORD_NANOPORE:
+                default:
+                    rd->varReadLen = true;
+                    break;
+            }
+            break;
+        case btpWGS:
+            rd->varReadLen = true;
+            break;
+        case btpREFSEQ:
+            break;
+        default:
+            assert(0);
+            break;
+    }
+
+    col = "READ_TYPE";
+    if (rd->readType == NULL) {
+        rd->readType = calloc(rd->nReads, sizeof *rd->readType);
+        if (rd->readType == NULL)
+        {   return eVdbBlastMemErr; }
+    }
+    {
+        bool optional = self->type == btpREFSEQ;
+        status = _VTableReadFirstRowImpl(self->obj->seqTbl, col, rd->readType,
+            rd->nReads * sizeof *rd->readType, &rd->readTypeStatic,
+            optional, NULL, self->acc);
+    }
+    /* TODO: check case when ($#READ_TYPE == 0 && nreads > 0) */
+    if (status != eVdbBlastNoErr) {
+        if (status == eVdbBlastTooExpensive) {
+            status = eVdbBlastNoErr;
+        }
+        else {
+            STSMSG(1, ("Error: failed to read %s/%s", self->path, col));
+            return status;
+        }
+    }
+
+    col = "READ_LEN";
+    if (rd->readLen == NULL) {
+        rd->readLen = calloc(rd->nReads, sizeof *rd->readLen);
+        if (rd->readLen == NULL)
+        {   return eVdbBlastMemErr; }
+    }
+    status = _VTableReadFirstRow(self->obj->seqTbl, col, rd->readLen,
+        rd->nReads * sizeof *rd->readLen, &rd->readLenStatic, self->acc);
+    /* TODO: check case when ($#READ_TYPE == 0 && nreads > 0) */
+    if (status != eVdbBlastNoErr) {
+        STSMSG(1, ("Error: failed to read %s/%s", self->path, col));
+        return status;
+    }
+
+    col = "READ_FILTER"; /* col = "RD_FILTER"; */
+    if (rd->rdFilter == NULL) {
+        rd->rdFilter = calloc(rd->nReads, sizeof *rd->rdFilter);
+        if (rd->rdFilter == NULL)
+        {   return eVdbBlastMemErr; }
+    }
+    status = _VTableReadFirstRow(self->obj->seqTbl, col, rd->rdFilter,
+        rd->nReads * sizeof *rd->rdFilter, &rd->rdFilterStatic, self->acc);
+    if (status != eVdbBlastNoErr) {
+        if (status == eVdbBlastTooExpensive) {
+            status = eVdbBlastNoErr;
+        }
+        else {
+            STSMSG(1, ("Error: failed to read %s/%s", self->path, col));
+            return status;
+        }
+    }
+
+    col = "BIO_BASE_COUNT";
+    status = _VTableReadFirstRowImpl(self->obj->seqTbl, col, &rd->bioBaseCount,
+        sizeof rd->bioBaseCount, NULL, true, NULL, self->acc);
+     /* Do not generate error message when BIO_BASE_COUNT is not found */
+
+    if (status != eVdbBlastNoErr) {
+        if (status == eVdbBlastTooExpensive) {
+            status = eVdbBlastNoErr;
+            rd->bioBaseCount = ~0;
+        }
+        else {
+            STSMSG(1, ("Error: failed to read %s/%s", self->path, col));
+            return status;
+        }
+    }
+
+    col = "CMP_BASE_COUNT";
+    status = _VTableReadFirstRow(self->obj->seqTbl, col,
+        &rd->cmpBaseCount, sizeof rd->cmpBaseCount, NULL, self->acc);
+    if (status != eVdbBlastNoErr) {
+        if (status == eVdbBlastTooExpensive) {
+            /* CMP_BASE_COUNT should be always found */
+            rc_t rc = RC(rcSRA, rcTable, rcReading, rcColumn, rcNotFound);
+            PLOGERR(klogInt, (klogInt, rc,
+                "Cannot read CMP_BASE_COUNT column for $(p)",
+                "p=%s", self->path));
+            STSMSG(1, ("Error: failed to read %s/%s",
+                self->path, "CMP_BASE_COUNT"));
+            rd->cmpBaseCount = ~0;
+            return eVdbBlastErr;
+        }
+        else {
+            STSMSG(1, ("Error: failed to read %s/%s", self->path, col));
+            return status;
+        }
+    }
+
+    if (self->type == btpREFSEQ) {
+        rd->nBioReads = 1;
+        /* rd->bioLen is set incorrectly for refseq-s */
+    }
+    else {
+        for (rd->nBioReads = 0, i = 0; i < rd->nReads; ++i) {
+            S
+            if (rd->readType[i] & SRA_READ_TYPE_BIOLOGICAL) {
+                if ((rd->rdFilterStatic == eColTypeStatic &&
+                     rd->rdFilter[i] == READ_FILTER_PASS) 
+                    || (rd->rdFilterStatic == eColTypeAbsent))
+                {
+                    ++rd->nBioReads;
+                    rd->bioLen += rd->readLen[i];
+                }
+                else {
+                    ++rd->nBioReads;
+                }
+            }
+        }
+    }
+    S /* LOG nBioReads */
+
+    return status;
+}
+
+bool _VdbBlastRunVarReadNum(const VdbBlastRun *self) {
+    VdbBlastStatus status = _VdbBlastRunFillRunDesc((VdbBlastRun*)self);
+    if (status != eVdbBlastNoErr) {
+        LOGERR(klogInt, 1, "Cannot fill run descriptor");
+    }
+
+    assert(self);
+
+    return self->rd.platform == SRA_PLATFORM_PACBIO_SMRT;
+}
+
+/* _VdbBlastRunGetNumSequences
+    returns (number of spots) * (number of biological reads in spot).
+    If read_filter is not static: some reads could be filtered,
+    so status is set to eVdbBlastTooExpensive */
+/*static*/
+uint64_t _VdbBlastRunGetNumSequences(VdbBlastRun *self,
+    VdbBlastStatus *status)
+{
+    assert(self && status);
+
+    *status = eVdbBlastNoErr;
+
+    if (self->bioReads == ~0) {
+        RunDesc *rd = NULL;
+
+        if (self->type == btpREFSEQ) {
+            S
+            self->bioReads = 1;
+        }
+        else if (_VdbBlastRunVarReadNum(self)) {
+            rc_t rc = 0;
+            ReadDesc desc;
+            memset(&desc, 0, sizeof desc);
+            rc = _VdbBlastDbOpenCursAndGetAllReads(self->obj, &desc, self->acc);
+            if (rc != 0) {
+                *status = eVdbBlastErr;
+            }
+            else {
+                self->bioReads = desc.spot;
+            }
+        }
+        else {
+            *status = _VdbBlastRunFillRunDesc(self);
+            if (*status != eVdbBlastNoErr) {
+                S
+                return 0;
+            }
+
+            rd = &self->rd;
+
+            if (rd->rdFilterStatic != eColTypeStatic) {
+                self->bioReadsTooExpensive = true;
+            }
+
+            if (self->cSra) {
+                self->bioReadsTooExpensive = true;
+            }
+
+            if (_VdbBlastRunVarReadNum(self)) {
+                self->bioReads = 0;
+                S
+            }
+            else {
+                self->bioReads = rd->spotCount * rd->nBioReads;
+                S
+            }
+        }
+    }
+    else {
+        S
+    }
+
+    if (*status == eVdbBlastNoErr && self->bioReadsTooExpensive) {
+        *status = eVdbBlastTooExpensive;
+    }
+    return self->bioReads;
+}
+
+static uint64_t _VdbBlastRunCountBioBaseCount(VdbBlastRun *self,
+    VdbBlastStatus *status)
+{
+    uint64_t bio_base_count = 0;
+
+    rc_t rc = _VTableBioBaseCntApprox(self->obj->seqTbl,
+        self->rd.spotCount, self->rd.nReads, &bio_base_count, self->acc);
+
+    if (rc != 0) {
+        *status = eVdbBlastErr;
+    }
+
+    return bio_base_count;
+}
+
+static uint64_t _VdbBlastSraRunGetLengthApprox(VdbBlastRun *self,
+    VdbBlastStatus *status)
+{
+    assert(self && status);
+
+    *status = eVdbBlastNoErr;
+
+    if (self->bioBasesApprox == ~0) {
+        if (! self->bioBasesTooExpensive && self->bioBases != ~0) {
+            self->bioBasesApprox = self->bioBases;
+        }
+        else {
+            RunDesc *rd = NULL;
+            *status = _VdbBlastRunFillRunDesc(self);
+            if (*status != eVdbBlastNoErr) {
+                S
+                return 0;
+            }
+
+            rd = &self->rd;
+            if (rd->nReads == 0) {
+                S
+                self->bioBasesApprox = 0;
+            }
+            else if (rd->varReadLen) {
+                S
+                self->bioBasesApprox
+                    = _VdbBlastRunCountBioBaseCount(self, status);
+            }
+            else {
+                if (self->type == btpREFSEQ) {
+                    if (rd->bioBaseCount == ~0) {
+                        S
+                        *status = eVdbBlastErr;
+                    }
+                    else {
+                        self->bioBasesApprox = rd->bioBaseCount;
+                    }
+                }
+                else {
+                    uint8_t read = 0;
+                    S
+                    for (read = 0, self->bioBasesApprox = 0;
+                        read < rd->nReads; ++read)
+                    {
+                        if (rd->readType[read] & SRA_READ_TYPE_BIOLOGICAL) {
+                            self->bioBasesApprox += rd->readLen[read];
+                        }
+                    }
+                    self->bioBasesApprox *= rd->spotCount;
+                }
+            }
+        }
+    }
+
+    return self->bioBasesApprox;
+}
+
+static uint64_t _VdbBlastRunGetNumSequencesApprox(VdbBlastRun *self,
+    VdbBlastStatus *status)
+{
+
+    assert(self && status);
+
+    *status = eVdbBlastNoErr;
+
+    if (self->bioReadsApprox == ~0) {
+        RunDesc *rd = NULL;
+
+        if (! self->bioReadsTooExpensive && self->bioReads != ~0) {
+            self->bioReadsApprox = self->bioReads;
+        }
+        else if (self->type == btpREFSEQ) {
+            S
+            self->bioReadsApprox = 1;
+        }
+        else if (self->cSra) {
+/* Number of Bio Reads for cSra == number of CMP reads
+    = Number of all bio reads * CMP_BASE_COUNT / BIO_BASE_COUNT
+   Number of all bio reads = nSpots * n of bio reads per spot */
+            double r = 0;
+            uint64_t n = 0;
+
+            *status = _VdbBlastRunFillRunDesc(self);
+            if (*status != eVdbBlastNoErr) {
+                S
+                return 0;
+            }
+
+            rd = &self->rd;
+
+            n = _VdbBlastSraRunGetLengthApprox(self, status);
+            if (*status != eVdbBlastNoErr) {
+                S
+                return 0;
+            }
+            r = rd->cmpBaseCount * rd->spotCount * rd->nBioReads;
+            r /= n;
+            self->bioReadsApprox = r;
+        }
+        else if (_VdbBlastRunVarReadNum(self)) {
+            self->bioReads = _VdbBlastRunGetNumSequences(self, status);
+        }
+        else {
+            *status = _VdbBlastRunFillRunDesc(self);
+            if (*status != eVdbBlastNoErr) {
+                S
+                return 0;
+            }
+
+            rd = &self->rd;
+
+            self->bioReadsApprox = rd->spotCount * rd->nBioReads;
+            S
+        }
+    }
+
+    return self->bioReadsApprox;
+}
+
+static uint64_t _VdbBlastRunGetLength
+    (VdbBlastRun *self, VdbBlastStatus *status)
+{
+    VdbBlastStatus dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    *status = eVdbBlastNoErr;
+
+    if (self->bioBasesTooExpensive) {
+        *status = eVdbBlastTooExpensive;
+        return 0;
+    }
+    else if (self->bioBases == ~0) {
+        if (self->cSra) {
+            *status = _VdbBlastRunFillRunDesc(self);
+            if (*status != eVdbBlastNoErr) {
+                S
+                return 0;
+            }
+            self->bioBases = self->rd.cmpBaseCount;
+        }
+        else {
+/* if BIO_BASE_COUNT is not found then status is set to eVdbBlastTooExpensive */
+            *status = _VTableReadFirstRowImpl(self->obj->seqTbl,
+                "BIO_BASE_COUNT", &self->bioBases,
+                sizeof self->bioBases, NULL, true, NULL, self->acc);
+            if (*status == eVdbBlastTooExpensive) {
+                self->bioBasesTooExpensive = true;
+            }
+        }
+    }
+
+    if (*status == eVdbBlastNoErr) {
+        S
+        return self->bioBases;
+    }
+    else {
+        S
+        return 0;
+    }
+}
+
+static uint64_t _VdbBlastRunGetLengthApprox(VdbBlastRun *self,
+    VdbBlastStatus *status)
+{
+    if (self->cSra) {
+        return _VdbBlastRunGetLength(self, status);
+    }
+    else {
+        return _VdbBlastSraRunGetLengthApprox(self, status);
+    }
+}
+
+static uint64_t _VdbBlastRunScan(const VdbBlastRun *self,
+    uint64_t (*cmp)
+        (uint64_t cand, uint64_t champ, int64_t minRead, bool *done),
+    uint64_t minRead, uint64_t start, VdbBlastStatus *status)
+{
+    uint64_t res = start;
+    uint64_t bad = start;
+    uint64_t spot = 0;
+    bool done = false;
+    rc_t rc = 0;
+    const VCursor *curs = NULL;
+    uint32_t idxREAD_LEN = 0;
+    uint32_t idxREAD_TYPE = 0;
+    assert(self && status &&
+        (self->rd.spotCount || self->rd.readType ||
+         self->rd.nReads    || self->rd.nBioReads));
+    rc = _VTableMakeCursor
+        (self->obj->seqTbl, &curs, &idxREAD_LEN, "READ_LEN", self->acc);
+    if (rc != 0) {
+        return bad;
+    }
+    if (_VdbBlastRunVarReadNum(self)) {
+        rc = VCursorAddColumn(curs, &idxREAD_TYPE, "READ_TYPE");
+        if (rc != 0) {
+            return bad;
+        }
+    }
+    for (spot = 1;
+        spot <= self->rd.spotCount && *status == eVdbBlastNoErr && !done;
+        ++spot)
+    {
+        uint32_t elem_bits, elem_off, elem_cnt;
+        const void *base = NULL;
+        if (_VdbBlastRunVarReadNum(self)) {
+            rc = VCursorCellDataDirect(curs, spot, idxREAD_TYPE,
+                &elem_bits, &base, &elem_off, &elem_cnt);
+            if (rc != 0) {
+                *status = eVdbBlastErr;
+                PLOGMSG(klogInfo, (klogInfo,
+                    "$(f): Cannot '$(name)' CellDataDirect",
+                    "f=%s,name=%s", __func__, "READ_TYPE"));
+                res = bad;
+                break;
+            }
+            else {
+                INSDC_read_type *aRt = (INSDC_read_type*)base;
+                uint32_t c = 0;
+                for (c = 0; c < elem_cnt; ++c) {
+                    INSDC_read_type *rt = aRt + c;
+                    assert(rt);
+
+                    if (*rt & SRA_READ_TYPE_BIOLOGICAL) {
+                        uint32_t elem_bits, elem_off, elem_cnt;
+                        const void *base = NULL;
+                        rc = VCursorCellDataDirect(curs, spot, idxREAD_LEN,
+                            &elem_bits, &base, &elem_off, &elem_cnt);
+                        if (rc != 0) {
+                            *status = eVdbBlastErr;
+                            PLOGMSG(klogInfo, (klogInfo,
+                                "$(f): Cannot '$(name)' CellDataDirect",
+                                "f=%s,name=%s", __func__, "READ_LEN"));
+                            res = bad;
+                            break;
+                        }
+                        else if (elem_off != 0 || elem_bits != 32) {
+                            *status = eVdbBlastErr;
+                            PLOGERR(klogInt, (klogInt, rc,
+                                "Bad VCursorCellDataDirect(READ_LEN) result: "
+                                "boff=$(elem_off), elem_bits=$(elem_bits)",
+                                "elem_off=%u,elem_bits=%u",
+                                elem_off, elem_bits));
+                            res = bad;
+                            break;
+                        }
+                        else {
+                            uint8_t read = c;
+                            const uint32_t *readLen = base;
+                            res = cmp(readLen[read], res, minRead, &done);
+                        }
+                    }
+                }
+            }
+        }
+        else {
+            rc = VCursorCellDataDirect(curs, spot, idxREAD_LEN,
+                &elem_bits, &base, &elem_off, &elem_cnt);
+            if (rc != 0) {
+                *status = eVdbBlastErr;
+                PLOGMSG(klogInfo, (klogInfo,
+                    "$(f): Cannot '$(name)' CellDataDirect",
+                    "f=%s,name=%s", __func__, "READ_LEN"));
+                res = bad;
+                break;
+            }
+            else if (elem_off != 0 || elem_bits != 32) {
+                *status = eVdbBlastErr;
+                PLOGERR(klogInt, (klogInt, rc,
+                    "Bad VCursorCellDataDirect(READ_LEN) result: "
+                    "boff=$(elem_off), elem_bits=$(elem_bits)",
+                    "elem_off=%u,elem_bits=%u", elem_off, elem_bits));
+                res = bad;
+                break;
+            }
+            else {
+                uint8_t read = 0;
+                const uint32_t *readLen = base;
+                assert(self->rd.readType && self->rd.readLen);
+                assert(self->rd.nReads == elem_cnt);
+                for (read = 0; read < self->rd.nReads; ++read) {
+                    if (self->rd.readType[read] & SRA_READ_TYPE_BIOLOGICAL) {
+                       res = cmp(readLen[read], res, minRead, &done);
+                    }
+                }
+            }
+        }
+    }
+    RELEASE(VCursor, curs);
+    return res;
+}
+
+static
+VdbBlastStatus _VdbBlastRunGetWgsAccession(VdbBlastRun *self, int64_t spot,
+    char *name_buffer, size_t bsize, size_t *num_required)
+{
+    rc_t rc = 0;
+    uint32_t row_len = 0;
+
+    assert(num_required);
+
+    if (self == NULL || spot <= 0 || name_buffer == NULL || bsize == 0) {
+        STSMSG(0, ("Error: some of %s parameters is NULL or 0", __func__));
+        return eVdbBlastErr;
+    }
+    assert(self->obj);
+    if (self->obj->seqTbl == NULL) {
+        STSMSG(0, ("Error: %s: VTable is NULL in VdbBlastRun", __func__));
+        return eVdbBlastErr;
+    }
+
+    if (self->obj->cursACCESSION == NULL) {
+        rc = _VTableMakeCursor(self->obj->seqTbl, &self->obj->cursACCESSION,
+            &self->obj->col_ACCESSION, "ACCESSION", self->acc);
+        if (rc != 0) {
+            VCursorRelease(self->obj->cursACCESSION);
+            self->obj->cursACCESSION = NULL;
+            return eVdbBlastErr;
+        }
+    }
+
+    assert(self->obj->cursACCESSION && rc == 0);
+
+    rc = VCursorReadDirect(self->obj->cursACCESSION, spot,
+        self->obj->col_ACCESSION, 8, name_buffer, bsize, &row_len);
+    *num_required = row_len;
+    if (row_len > 0) /* include ending '\0' */
+    {   ++(*num_required); }
+    if (rc == 0) {
+        if (bsize > row_len)
+        { name_buffer[row_len] = '\0'; }
+        return eVdbBlastNoErr;
+    }
+    else if (rc == SILENT_RC
+        (rcVDB, rcCursor, rcReading, rcBuffer, rcInsufficient))
+    {   return eVdbBlastNoErr; }
+    else {
+        assert(self->path);
+        PLOGERR(klogInt, (klogInt, rc, "Error in VCursorReadDirect"
+            "$(path), ACCESSION, spot=$(spot))",
+            "path=%s,spot=%ld", self->path, spot));
+        return eVdbBlastErr;
+    }
+}
+
+uint64_t _VdbBlastRunGetNumAlignments(VdbBlastRun *self,
+    VdbBlastStatus *status)
+{
+    assert(status);
+
+    *status = eVdbBlastNoErr;
+
+    if (self->alignments == ~0) {
+        assert(self->obj);
+
+        if (self->obj->prAlgnTbl == NULL) {
+            self->alignments = 0;
+        }
+        else {
+            const char col[] = "SPOT_COUNT";
+            *status = _VTableReadFirstRow(self->obj->prAlgnTbl, col,
+                &self->alignments, sizeof self->alignments, NULL, self->acc);
+            if (*status != eVdbBlastNoErr) {
+                STSMSG(1, ("Error: failed to read %s/%s", self->path, col));
+                return 0;
+            }
+        }
+    }
+
+    assert(self->alignments != ~0);
+
+    return self->alignments;
+}
+
+#ifdef TEST_VdbBlastRunFillReadDesc
+LIB_EXPORT
+#endif
+VdbBlastStatus _VdbBlastRunFillReadDesc(VdbBlastRun *self,
+    uint64_t read_id, ReadDesc *desc)
+{
+    VdbBlastStatus status = eVdbBlastNoErr;
+
+    const VdbBlastRun *prev = NULL;
+    const RunDesc *rd = NULL;
+    
+    int bioIdx = 0;
+
+    if (self == NULL || desc == NULL) {
+        S
+        return eVdbBlastErr;
+    }
+
+    prev = desc->run;
+    memset(desc, 0, sizeof *desc);
+    desc->prev = prev;
+    desc->run = self;
+
+    rd = &self->rd;
+
+    if (rd->nReads == 0 || rd->readType == NULL) {
+        status = _VdbBlastRunFillRunDesc(self);
+        if (status != eVdbBlastNoErr)
+        {   return status; }
+        assert(rd->nReads && rd->readType);
+    }
+
+    if (rd->readIdDesc.idType == eFixedReadN || read_id == 0) {
+        if (!_VdbBlastRunVarReadNum(self)) {
+            desc->nReads = rd->nReads;
+            desc->spot = read_id / rd->nBioReads + 1;
+            if (desc->spot <= rd->spotCount) {
+                int idInSpot
+                    = read_id - (desc->spot - 1) * rd->nBioReads; /* 0-based */
+
+                int i = 0;
+                for (i = 0; i < rd->nReads; ++i) {
+                    if (rd->readType[i] & SRA_READ_TYPE_BIOLOGICAL) {
+                        if (bioIdx++ == idInSpot) {
+                            S
+                            desc->tableId = VDB_READ_UNALIGNED;
+                            desc->read = i + 1;
+                            desc->read_id = _RunDescMakeReadId(rd,
+                                desc->spot, desc->read, read_id, &status);
+                            return status;
+                        }
+                    }
+                }
+                S
+            }
+            else {
+                uint64_t alignments = 0;
+                S
+                desc->spot -= rd->spotCount;
+                alignments = _VdbBlastRunGetNumAlignments(self, &status);
+                if (status != eVdbBlastNoErr) {
+                    return status;
+                }
+                if (desc->spot <= alignments) {
+                    desc->tableId = VDB_READ_ALIGNED;
+                    desc->read = 1;
+                    return eVdbBlastNoErr;
+                }
+                S
+            }
+        }
+        else {
+            bool found = false;
+            if (_VdbBlastDbOpenCursAndGetFirstRead
+                (self->obj, desc, &found, self->acc) == 0)
+            {
+                return eVdbBlastNoErr;
+            }
+        }
+    }
+    else if (rd->readIdDesc.idType == eFactor10) {
+        if (rd->readIdDesc.runBits > 0) {
+            read_id /= rd->readIdDesc.runBits;
+        }
+        if (rd->spotBits > 0) {
+            rc_t rc = 0;
+            desc->read = read_id / rd->spotBits;
+            desc->spot = read_id % rd->spotBits;
+            if (desc->read > 0 && desc->spot > 0) {
+                rc = _VdbBlastDbGetNReads
+                    (self->obj, desc->spot, &desc->nReads, self->acc);
+                if (rc == 0) {
+                    desc->tableId = VDB_READ_UNALIGNED;
+                    S
+                    return eVdbBlastNoErr;
+                }
+                else {
+                    S
+                }
+            }
+            else {
+                S
+            }
+        }
+    }
+    else {
+        assert(0);
+    }
+
+    memset(desc, 0, sizeof *desc);
+    return eVdbBlastErr;
+}
+
+VdbBlastStatus _VdbBlastRunSetFindFirstRead(const VdbBlastRunSet *self,
+    uint64_t *read_id, bool useGetFirstRead)
+{
+    VdbBlastStatus status = eVdbBlastErr;
+    const RunSet *rs = NULL;
+    ReadDesc desc;
+    assert(self);
+    memset(&desc, 0, sizeof desc);
+    rs = &self->runs;
+    _VdbBlastRunSetBeingRead(self);
+    if (useGetFirstRead) {
+        bool found = false;
+        uint32_t i = 0;
+        for (i = 0; i < rs->krun; ++i) {
+            VdbBlastRun *run = &rs->run[i];
+            rc_t rc = _VdbBlastDbOpenCursAndGetFirstRead
+                (rs->run[i].obj, &desc, &found, rs->run[i].acc);
+            if (rc != 0) {
+                break;
+            }
+            else if (!found) {
+                continue;
+            }
+
+            if (desc.spot == 0) {
+                if (rs->krun > 1) {
+                    desc.prev = run;
+                }
+            }
+            else {
+                desc.run = run;
+                status = _ReadDescFixReadId(&desc);
+                break;
+            }
+        }
+    }
+    else {
+        status = _RunSetFindReadDesc(rs, 0, &desc);
+        if (status == eVdbBlastNoErr) {
+            status = _ReadDescFixReadId(&desc);
+        }
+    }
+    if (status == eVdbBlastNoErr) {
+        assert(read_id);
+        *read_id = desc.read_id;
+    }
+    return status;
+}
+
+EReadIdType _VdbBlastRunSetGetReadIdType(const VdbBlastRunSet *self) {
+    assert(self);
+
+    return self->readIdDesc.idType;
+}
+
+static VdbBlastStatus _VdbBlastRunGetReadId(VdbBlastRun *self, const char *acc,
+    uint64_t spot, /* 1-based */
+    uint32_t read, /* 1-based */
+    uint64_t *read_id)
+{
+    uint64_t id = ~0;
+    VdbBlastStatus status = eVdbBlastErr;
+    size_t size;
+
+    assert(self && acc && read_id && self->acc);
+    assert(memcmp(self->acc, acc, string_measure(self->acc, &size)) == 0);
+
+    if ((spot <= 0 && read > 0) || (spot > 0 && read <= 0)) {
+        S
+        return eVdbBlastErr;
+    }
+
+    if (spot > 0) {
+        if (self->type != btpSRA) {
+            return eVdbBlastErr;
+        }
+
+        if (self->rd.readIdDesc.idType == eFixedReadN) {
+            for (id = (spot - 1) * self->rd.nBioReads; ; ++id) {
+                ReadDesc desc;
+                status = _VdbBlastRunFillReadDesc(self, id, &desc);
+                if (status != eVdbBlastNoErr)
+                {   return status; }
+                if (desc.spot < spot) {
+                    S
+                    return eVdbBlastErr;
+                }
+                if (desc.spot > spot) {
+                    S
+                    return eVdbBlastErr;
+                }
+                if (desc.read == read) {
+                    *read_id = id;
+                    return eVdbBlastNoErr;
+                }
+            }
+            S
+            return eVdbBlastErr;
+        }
+        else if (self->rd.readIdDesc.idType == eFactor10) {
+            if (spot <= self->rd.spotCount) {
+                if (self->rd.readIdDesc.varReadN) {
+                    /* TODO How to make sure this read exists in this spot?*/
+                }
+                else {
+                    if (read > self->rd.nReads) {
+                        S
+                        return eVdbBlastErr;
+                    }
+                    else {
+                        /* TODO how to check it when READ_TYPE is variable
+                                withing a run (is it possible?) */
+                        if (read == 0) {
+                            S
+                            return eVdbBlastErr;
+                        }
+                        if (! (self->rd.readType[read - 1]
+                                & SRA_READ_TYPE_BIOLOGICAL))
+                        {
+                            S
+                            return eVdbBlastErr;
+                        }
+                    }
+                }
+                id = _RunDescMakeReadId(&self->rd, spot, read, ~0, &status);
+                *read_id = id;
+                return status;
+            }
+            else {
+                S
+                return eVdbBlastErr;
+            }
+        }
+        else {
+            assert(0);
+            return eVdbBlastErr;
+        }
+    }
+    else {
+        uint64_t n = ~0;
+        uint64_t i = ~0;
+        if (self->type == btpSRA)
+        {   return eVdbBlastErr; }
+        else if (self->type == btpREFSEQ) {
+            *read_id = 0;
+            return eVdbBlastNoErr;
+        }
+        else if (self->type == btpWGS) {
+            n = _VdbBlastRunGetNumSequences(self, &status);
+            if (status != eVdbBlastNoErr
+                && status != eVdbBlastTooExpensive)
+            {
+                return status;
+            }
+            /* TODO optimize: avoid full run scan */
+            for (i = 0; i < n ; ++i) {
+                size_t need = ~0;
+#define SZ 4096
+                char name_buffer[SZ + 1];
+                if (string_measure(acc, &size) > SZ) {
+                    S
+                    return eVdbBlastErr;
+                }
+#undef SZ
+                status = _VdbBlastRunGetWgsAccession(
+                    self, i + 1, name_buffer, sizeof name_buffer, &need);
+                if (need > sizeof name_buffer) {
+                    S
+                    return eVdbBlastErr;
+                }
+                if (strcmp(name_buffer, acc) == 0) {
+                    i = _RunDescMakeReadId(&self->rd, i + 1, 1, i, &status);
+                    *read_id = i;
+                    return status;
+                }
+            }
+        }
+        else { assert(0); }
+        return eVdbBlastErr;
+    }
+}
+
+static uint64_t _VdbBlastRunGetSequencesAmount(
+    VdbBlastRun *self, VdbBlastStatus *status)
+{
+    uint64_t n = _VdbBlastRunGetNumSequences(self, status);
+
+    assert(status);
+
+    if (*status == eVdbBlastNoErr) {
+        n += _VdbBlastRunGetNumAlignments(self, status);
+    }
+
+    return n;
+}
+
+/******************************************************************************/
+
+VdbBlastStatus _ReadDescFixReadId(ReadDesc *self) {
+    VdbBlastStatus status = eVdbBlastNoErr;
+
+    assert(self && self->run);
+
+    self->read_id = _RunDescMakeReadId
+        (&self->run->rd, self->spot, self->read, self->read_id, &status);
+
+    return status;
+}
+
+/******************************************************************************/
+
+static  void _RunSetFini(RunSet *self) {
+    assert(self);
+
+    if (self->run) {
+        uint32_t i = 0;
+
+        for (i = 0; i < self->krun; ++i) {
+            _VdbBlastRunFini(&self->run[i]);
+        }
+
+        free(self->run);
+    }
+
+    _RefSetFini(&self->refs);
+    
+    memset(self, 0, sizeof *self);
+}
+
+static VdbBlastStatus _RunSetAllocTbl(RunSet *self) {
+    size_t nmemb = 16;
+
+    if (self == NULL)
+    {   return eVdbBlastErr; }
+
+    if (self->run && self->krun < self->nrun) {
+        return eVdbBlastNoErr;
+    }
+
+    if (self->run == NULL) {
+        self->run = calloc(nmemb, sizeof *self->run);
+        if (self->run == NULL)
+        {   return eVdbBlastMemErr; }
+        S
+    }
+    else {
+        void *p = NULL;
+        nmemb += self->nrun;
+        p = realloc(self->run, nmemb * sizeof *self->run);
+        if (p == NULL)
+        {   return eVdbBlastMemErr; }
+        self->run = p;
+        S
+    }
+
+    self->nrun = nmemb;
+    return eVdbBlastNoErr;
+}
+
+static VdbBlastStatus _RunSetAddObj(RunSet *self, VdbBlastDb *obj,
+    const char *rundesc, BTableType type, const KDirectory *dir,
+    char *fullpath, uint32_t min_read_length)
+{
+
+    VdbBlastRun* run = NULL;
+
+    VdbBlastStatus status = _RunSetAllocTbl(self);
+    if (status != eVdbBlastNoErr) {
+        return status;
+    }
+
+    assert(self && self->run);
+
+    run = &self->run[self->krun];
+
+    status = _VdbBlastRunInit(run,
+        obj, rundesc, type, dir, fullpath, min_read_length, self->krun++);
+
+    return status;
+}
+
+static uint64_t _RunSetGetNumSequences
+    (const RunSet *self, VdbBlastStatus *aStatus)
+{
+    uint64_t num = 0;
+    uint32_t i = 0;
+
+    assert(self && aStatus);
+
+    *aStatus = eVdbBlastNoErr;
+
+    for (i = 0; i < self->krun; ++i) {
+        VdbBlastStatus status = eVdbBlastNoErr;
+        VdbBlastRun *run = NULL;
+
+        assert(self->run);
+
+        run = &self->run[i];
+
+        num += _VdbBlastRunGetNumSequences(run, &status);
+        if (status != eVdbBlastNoErr) {
+            assert(run->path);
+
+            if (*aStatus == eVdbBlastNoErr) {
+                *aStatus = status; 
+            }
+
+            if (status != eVdbBlastTooExpensive) {
+                STSMSG(1, (
+                    "Error: failed to GetNumSequences(on run %s)", run->path));
+                return 0;
+            }
+
+            assert(*aStatus == eVdbBlastTooExpensive);
+        }
+    }
+
+    STSMSG(1, ("_RunSetGetNumSequences = %ld", num));
+
+    return num;
+}
+
+static
+uint64_t _RunSetGetNumSequencesApprox(const RunSet *self,
+    VdbBlastStatus *status)
+{
+    uint64_t num = 0;
+    uint32_t i = 0;
+
+    assert(self && status);
+
+    *status = eVdbBlastNoErr;
+
+    for (i = 0; i < self->krun; ++i) {
+        VdbBlastRun *run = NULL;
+
+        assert(self->run);
+
+        run = &self->run[i];
+
+        num += _VdbBlastRunGetNumSequencesApprox(run, status);
+        if (*status != eVdbBlastNoErr) {
+            assert(run->path);
+
+            STSMSG(1, (
+                "Error: failed to GetNumSequencesApprox(on run %s)",
+                run->path));
+
+            return 0;
+        }
+    }
+
+    STSMSG(1, ("_RunSetGetNumSequencesApprox = %ld", num));
+
+    return num;
+}
+
+static
+uint64_t _RunSetGetTotalLength(const RunSet *self,
+    VdbBlastStatus *status)
+{
+    uint64_t num = 0;
+    uint32_t i = 0;
+    assert(self && status);
+
+    if (self->krun)
+    {   assert(self->run); }
+
+    for (i = 0; i < self->krun; ++i) {
+        VdbBlastRun *run = &self->run[i];
+        assert(run && run->path);
+        num += _VdbBlastRunGetLength(run, status);
+        if (*status != eVdbBlastNoErr) {
+            STSMSG(1, (
+                "Error: failed to _RunSetGetTotalLength(on run %s)",
+                run->path));
+            return 0;
+        }
+    }
+
+    STSMSG(1, ("_RunSetGetTotalLength = %ld", num));
+
+    return num;
+}
+
+static uint64_t _RunSetGetTotalLengthApprox(const RunSet *self,
+    VdbBlastStatus *status)
+{
+    uint64_t num = 0;
+
+    uint32_t i = 0;
+
+    assert(self && status);
+
+    for (num = 0, i = 0; i < self->krun; ++i) {
+        VdbBlastRun *run = NULL;
+
+        assert(self->run);
+
+        run = &self->run[i];
+
+        num += _VdbBlastRunGetLengthApprox(run, status);
+        if (*status != eVdbBlastNoErr) {
+            STSMSG(1, ("Error: failed "
+                "to _VdbBlastRunGetLengthApprox(on run %s)", run->path));
+            return 0;
+        }
+    }
+
+    STSMSG(1, ("VdbBlastRunSetGetTotalLengthApprox = %ld", num));
+
+    return num;
+}
+
+static size_t _RunSetGetName(const RunSet *self,
+    VdbBlastStatus *status, char *name_buffer, size_t bsize)
+{
+    size_t need = 0, idx = 0;
+    int i = 0;
+    size_t size;
+    
+    assert(self && status);
+    for (i = 0; i < self->krun; ++i) {
+        VdbBlastRun *run = &self->run[i];
+        if (run && run->acc) {
+            if (i)
+            {   ++need; }
+            need += string_measure(run->acc, &size);
+        }
+        else {
+            S
+            return 0;
+        }
+    }
+
+    if (name_buffer == NULL || bsize == 0) {
+        S
+        return need;
+    }
+
+    for (i = 0; i < self->krun; ++i) {
+        VdbBlastRun *run = &self->run[i];
+        if (run && run->acc) {
+            if (i)
+            {   name_buffer[idx++] = '|'; }
+            if (idx >= bsize) {
+                S
+                return need;
+            }
+            string_copy(name_buffer + idx, bsize - idx,
+                run->acc, string_size(run->acc));
+            idx += string_measure(run->acc, &size);
+            if (idx >= bsize) {
+                S
+                return need;
+            }
+        }
+    }
+    name_buffer[idx++] = '\0';
+    *status = eVdbBlastNoErr;
+
+    S
+    return need;
+}
+
+typedef struct {
+    uint64_t read_id;
+} ReadId;
+static VdbBlastStatus _RunSetFindReadDescContinuous(
+    const RunSet *self, uint64_t read_id, ReadDesc *desc)
+{
+    uint64_t i = 0;
+    uint64_t prev = 0;
+    uint64_t crnt = 0;
+
+    assert(self && desc);
+
+    for (i = 0, prev = 0; i < self->krun; ++i) {
+        VdbBlastStatus status = eVdbBlastNoErr;
+        VdbBlastRun *run = NULL;
+        uint64_t l = 0;
+
+        if (prev > 0 && i < prev) {
+            S
+            return eVdbBlastErr;
+        }
+
+        run = &self->run[i];
+        if (run == NULL) {
+            S
+            return eVdbBlastErr;
+        }
+
+        l = _VdbBlastRunGetSequencesAmount(run, &status);
+        if (status != eVdbBlastNoErr &&
+            status != eVdbBlastTooExpensive)
+        {
+            S
+            return status;
+        }
+
+        if (crnt + l <= read_id) {
+            crnt += l;
+        }
+        else {
+            uint64_t a_read_id = read_id - crnt;
+            status = _VdbBlastRunFillReadDesc(run, a_read_id, desc);
+            if (status == eVdbBlastNoErr) {
+                S
+                desc->read_id = read_id;
+            }
+            else
+            {   S }
+
+            return status;
+        }
+
+        prev = i;
+    }
+
+    S
+    return eVdbBlastErr;
+}
+
+static VdbBlastStatus _RunSetFindReadDescFactor10(
+    const RunSet *self, uint64_t read_id, ReadDesc *desc)
+{
+    VdbBlastStatus status = eVdbBlastErr;
+
+    VdbBlastRun *run = NULL;
+    uint64_t i = 0;
+
+    assert(self && desc && self->run);
+
+    if (self->run[0].rd.readIdDesc.runBits > 0) {
+        i = read_id % self->run[0].rd.readIdDesc.runBits;
+    }
+    else {
+        i = 0;
+    }
+
+    if (i >= self->krun) {
+        S
+        return eVdbBlastErr;
+    }
+
+    run = &self->run[i];
+
+    status = _VdbBlastRunFillReadDesc(run, read_id, desc);
+    if (status == eVdbBlastNoErr) {
+        S
+        desc->read_id = read_id;
+    }
+    else
+    {   S }
+
+    return status;
+}
+
+VdbBlastStatus _RunSetFindReadDesc(const RunSet *self,
+    uint64_t read_id, ReadDesc *desc)
+{
+    if (self == NULL || desc == NULL || self->krun == 0) {
+        S
+        return eVdbBlastErr;
+    }
+
+    switch (self->run[0].rd.readIdDesc.idType) {
+        case eFixedReadN:
+            return _RunSetFindReadDescContinuous(self, read_id, desc);
+        case eFactor10:
+            return _RunSetFindReadDescFactor10(self, read_id, desc);
+        default:
+            assert(0);
+            return eVdbBlastErr;
+    }
+}
+
+/******************************************************************************/
+
+static const char VDB_BLAST_RUN_SET[] = "VdbBlastRunSet";
+
+static void _VdbBlastRunSetWhack(VdbBlastRunSet *self) {
+    assert(self);
+
+    STSMSG(1, ("Deleting VdbBlastRunSet(min_read_length=%d, protein=%s)",
+        self->core2na.min_read_length, self->protein ? "true" : "false"));
+
+    VdbBlastMgrRelease(self->mgr);
+
+    _RunSetFini(&self->runs);
+    _Core2naFini(&self->core2na);
+    _Core4naFini(&self->core4na);
+    _Core2naFini(&self->core2naRef);
+    _Core4naFini(&self->core4naRef);
+
+    memset(self, 0, sizeof *self);
+    free(self);
+}
+
+LIB_EXPORT
+VdbBlastRunSet *VdbBlastMgrMakeRunSet(const VdbBlastMgr *cself,
+    VdbBlastStatus *status,
+    uint32_t min_read_length,
+    bool protein)
+{
+    rc_t rc = 0;
+    VdbBlastRunSet *item = NULL;
+    VdbBlastMgr *self = (VdbBlastMgr*)cself;
+
+    VdbBlastStatus dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    *status = eVdbBlastNoErr;
+
+    item = calloc(1, sizeof *item);
+    if (item == NULL) {
+        *status = eVdbBlastMemErr;
+        return item;
+    }
+
+    item->protein = protein;
+
+    item->core2na.min_read_length = min_read_length;
+
+    item->core2naRef.min_read_length = min_read_length;
+
+    item->core4na.min_read_length = min_read_length;
+    item->core4na.mode = VDB_READ_UNALIGNED;
+
+    item->core4naRef.min_read_length = min_read_length;
+    item->core4naRef.mode = VDB_READ_REFERENCE;
+
+    item->minSeqLen = ~0;
+    item->avgSeqLen = ~0;
+    item->maxSeqLen = ~0;
+
+    if (rc == 0) {
+        rc = KLockMake(&item->core2na.mutex);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error in KLockMake");
+        }
+    }
+    if (rc == 0) {
+        rc = KLockMake(&item->core2naRef.mutex);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error in KLockMake");
+        }
+    }
+    if (rc == 0) {
+        rc = KLockMake(&item->core4na.mutex);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error in KLockMake");
+        }
+    }
+    if (rc == 0) {
+        rc = KLockMake(&item->core4naRef.mutex);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error in KLockMake");
+        }
+    }
+    if (rc == 0) {
+        item->mgr = VdbBlastMgrAddRef(self);
+        if (item->mgr) {
+            KRefcountInit(&item->refcount,
+                1, VDB_BLAST_RUN_SET, __func__, "set");
+            STSMSG(1, ("Created VdbBlastRunSet(min_read_length=%d, protein=%s)",
+                min_read_length, protein ? "true" : "false"));
+            return item;
+        }
+    }
+
+    STSMSG(1, ("Error: failed to create VdbBlastRunSet"));
+    _VdbBlastRunSetWhack(item);
+
+    *status = eVdbBlastErr;
+
+    return NULL;
+}
+
+LIB_EXPORT void CC VdbBlastRunSetRelease(VdbBlastRunSet *self) {
+    if (self == NULL) {
+        return;
+    }
+
+    STSMSG(1, ("VdbBlastRunSetRelease"));
+    if (KRefcountDrop(&self->refcount, VDB_BLAST_RUN_SET) != krefWhack)
+    {   return; }
+
+    _VdbBlastRunSetWhack(self);
+}
+
+LIB_EXPORT
+VdbBlastRunSet* CC VdbBlastRunSetAddRef(VdbBlastRunSet *self)
+{
+    if (self == NULL) {
+        STSMSG(1, ("VdbBlastRunSetAddRef(NULL)"));
+        return self;
+    }
+
+    if (KRefcountAdd(&self->refcount, VDB_BLAST_RUN_SET) == krefOkay) {
+        STSMSG(1, ("VdbBlastRunSetAddRef"));
+        return self;
+    }
+
+    STSMSG(1, ("Error: failed to VdbBlastRunSetAddRef"));
+    return NULL;
+}
+
+LIB_EXPORT
+VdbBlastStatus CC VdbBlastRunSetAddRun(VdbBlastRunSet *self,
+    const char *native)
+{
+    rc_t rc = 0;
+    char rundesc[PATH_MAX] = "";
+    VdbBlastStatus status = eVdbBlastNoErr;
+    BTableType type = btpUndefined;
+
+    /* allocated in _VdbBlastMgrFindNOpenSeqTable()
+       in _RunSetAddObj() is assigned to VdbBlastRun::path
+       freed during VdbBlastRun release */
+    char *fullpath = NULL;
+
+    VdbBlastDb *obj = NULL;
+    if (self == NULL || self->mgr == NULL || self->beingRead) {
+        S
+        return eVdbBlastErr;
+    }
+
+    obj = calloc(1, sizeof *obj);
+    if (obj == NULL) {
+        return eVdbBlastMemErr;
+    }
+
+    rc = _VdbBlastMgrNativeToPosix(self->mgr, native, rundesc, sizeof rundesc);
+    if (rc != 0) {
+        S
+        status = eVdbBlastErr;
+    }
+
+    status = _VdbBlastMgrFindNOpenSeqTable(self->mgr,
+        rundesc, &obj->seqTbl, &type, &fullpath, &obj->db);
+    if (status != eVdbBlastNoErr) {
+        S
+        PLOGMSG(klogInfo,
+            (klogInfo, "failed to open $(rundesc)", "rundesc=%s", rundesc));
+    }
+    else {
+        S
+        PLOGMSG(klogInfo,
+            (klogInfo, "opened $(rundesc)", "rundesc=%s", rundesc));
+    }
+
+    if (status == eVdbBlastNoErr && _VTableCSra(obj->seqTbl)) {
+        if (obj->db == NULL) {
+            S
+            status = eVdbBlastErr;
+        }
+        else {
+            status = _VDatabaseOpenAlignmentTable(
+                obj->db, rundesc, &obj->prAlgnTbl);
+        }
+    }
+
+    if (status == eVdbBlastNoErr) {
+        if (_VTableVarReadNum(obj->seqTbl, rundesc)) {
+            self->readIdDesc.varReadN = true;
+            self->readIdDesc.idType   = eFactor10;
+        }
+
+        status = _RunSetAddObj(&self->runs, obj, rundesc, type,
+            NULL, fullpath, self->core2na.min_read_length);
+        S
+    }
+
+    return status;
+}
+
+void _VdbBlastRunSetBeingRead(const VdbBlastRunSet *cself) {
+    uint32_t i = 0;
+    uint32_t runBits = 0;
+    VdbBlastRunSet *self = (VdbBlastRunSet*)cself;
+    EReadIdType idType = eFixedReadN;
+
+    if (self == NULL || self->beingRead) {
+        return;
+    }
+
+    idType = self->readIdDesc.idType;
+    runBits = Bits(self->runs.krun - 1, idType);
+
+    for (i = 0; i < self->runs.krun; ++i) {
+        VdbBlastRun *r = &self->runs.run[i];
+        assert(r);
+        r->rd.readIdDesc.idType = idType;
+        r->rd.readIdDesc.runBits = runBits;
+        r->rd.readIdDesc.varReadN = _VdbBlastRunVarReadNum(r);
+    }
+
+    self->beingRead = true;
+}
+
+LIB_EXPORT
+bool CC VdbBlastRunSetIsProtein(const VdbBlastRunSet *self)
+{
+    if (self == NULL) {
+        STSMSG(1, ("VdbBlastRunSetIsProtein(self=NULL)"));
+        return false;
+    }
+
+    STSMSG(1, (
+        "VdbBlastRunSetIsProtein = %s", self->protein ? "true" : "false"));
+
+    return self->protein;
+}
+
+LIB_EXPORT
+uint64_t CC VdbBlastRunSetGetNumSequences(const VdbBlastRunSet *self,
+    VdbBlastStatus *status)
+{
+    VdbBlastStatus dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    if (self == NULL) {
+        *status = eVdbBlastErr;
+        return 0;
+    }
+
+    _VdbBlastRunSetBeingRead(self);
+
+    return _RunSetGetNumSequences(&self->runs, status);
+}
+
+LIB_EXPORT uint64_t CC VdbBlastRunSetGetNumSequencesApprox(
+    const VdbBlastRunSet *self)
+{
+    uint64_t num = 0;
+    VdbBlastStatus status = eVdbBlastNoErr;
+
+    _VdbBlastRunSetBeingRead(self);
+
+    num = _RunSetGetNumSequencesApprox(&self->runs, &status);
+
+    STSMSG(1, ("VdbBlastRunSetGetNumSequencesApprox=%lu", num));
+
+    return num;
+}
+
+LIB_EXPORT
+uint64_t CC VdbBlastRunSetGetTotalLength(const VdbBlastRunSet *self,
+    VdbBlastStatus *status)
+{
+    VdbBlastStatus dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    if (self == NULL) {
+        *status = eVdbBlastErr;
+        return 0;
+    }
+
+    _VdbBlastRunSetBeingRead(self);
+
+    return _RunSetGetTotalLength(&self->runs, status);
+}
+
+LIB_EXPORT
+uint64_t CC VdbBlastRunSetGetTotalLengthApprox(
+    const VdbBlastRunSet *self)
+{
+    VdbBlastStatus status = eVdbBlastNoErr;
+
+    if (self == NULL) {
+        STSMSG(1, ("VdbBlastRunSetGetTotalLengthApprox(self=NULL)"));
+        return 0;
+    }
+
+    _VdbBlastRunSetBeingRead(self);
+
+    return _RunSetGetTotalLengthApprox(&self->runs, &status);
+}
+
+LIB_EXPORT
+uint64_t CC VdbBlastRunSetGetMinSeqLen(const VdbBlastRunSet *self)
+{
+    if (self->minSeqLen == ~0) {
+        bool empty = true;
+        VdbBlastStatus status = eVdbBlastNoErr;
+        uint64_t res = ~0;
+        uint32_t i = 0;
+        _VdbBlastRunSetBeingRead(self);
+        for (i = 0; i < self->runs.krun; ++i) {
+            VdbBlastRun *run = &self->runs.run[i];
+            assert(run);
+            if (run->type == btpREFSEQ) {
+                uint64_t cand = _VdbBlastRunGetLengthApprox(run, &status);
+                if (status != eVdbBlastNoErr) {
+                    S
+                    return ~0;
+                }
+                if (cand < res && cand >= self->core2na.min_read_length) {
+                    res = cand;
+                }
+            }
+            else {
+                status = _VdbBlastRunFillRunDesc(run);
+                if (status != eVdbBlastNoErr) {
+                    S
+                    return ~0;
+                }
+                if (!run->rd.varReadLen) {
+                    uint8_t read = 0;
+                    assert(run->rd.readType && run->rd.readLen);
+                    for (read = 0; read < run->rd.nReads; ++read) {
+                        if (run->rd.readType[i] & SRA_READ_TYPE_BIOLOGICAL) {
+                            if (run->rd.readLen[i]
+                                == self->core2na.min_read_length)
+                            {
+                                ((VdbBlastRunSet*)self)->minSeqLen
+                                    = self->core2na.min_read_length;
+                                return self->minSeqLen;
+                            }
+                            else if (run->rd.readLen[i]
+                                    > self->core2na.min_read_length
+                                && run->rd.readLen[i] < res)
+                            {
+                                res = run->rd.readLen[i];
+                                empty = false;
+                            }
+                        }
+                    }
+                }
+                else {
+                    res = _VdbBlastRunScan(
+                        run, Min, self->core2na.min_read_length, res, &status);
+                    if (status != eVdbBlastNoErr) {
+                        S
+                        return ~0;
+                    }
+                }
+            }
+        }
+        if (empty && res == ~0) {
+            res = 0;
+        }
+        ((VdbBlastRunSet*)self)->minSeqLen = res;
+    }
+    return self->minSeqLen;
+}
+
+LIB_EXPORT
+uint64_t CC VdbBlastRunSetGetMaxSeqLen(const VdbBlastRunSet *self)
+{
+    if (self->maxSeqLen == ~0) {
+        VdbBlastStatus status = eVdbBlastNoErr;
+        uint64_t res = 0;
+        uint32_t i = 0;
+        _VdbBlastRunSetBeingRead(self);
+        for (i = 0; i < self->runs.krun; ++i) {
+            VdbBlastRun *run = &self->runs.run[i];
+            assert(run);
+            if (run->type == btpREFSEQ) {
+                uint64_t cand = _VdbBlastRunGetLengthApprox(run, &status);
+                if (status != eVdbBlastNoErr) {
+                    S
+                    return ~0;
+                }
+                if (cand > res) {
+                    res = cand;
+                }
+            }
+            else {
+                status = _VdbBlastRunFillRunDesc(run);
+                if (status != eVdbBlastNoErr) {
+                    S
+                    return ~0;
+                }
+                if (!run->rd.varReadLen) {
+                    uint8_t read = 0;
+                    assert(run->rd.readType && run->rd.readLen);
+                    for (read = 0; read < run->rd.nReads; ++read) {
+                        if (run->rd.readType[i] & SRA_READ_TYPE_BIOLOGICAL) {
+                            if (run->rd.readLen[i] > res) {
+                                res = run->rd.readLen[i];
+                            }
+                        }
+                    }
+                }
+                else {
+                    res = _VdbBlastRunScan(
+                        run, Max, -1, res, &status);
+                    if (status != eVdbBlastNoErr) {
+                        S
+                        return ~0;
+                    }
+                }
+            }
+        }
+        ((VdbBlastRunSet*)self)->maxSeqLen = res;
+    }
+    return self->maxSeqLen;
+}
+
+LIB_EXPORT
+uint64_t CC VdbBlastRunSetGetAvgSeqLen(const VdbBlastRunSet *self)
+{
+    uint64_t num = 0;
+
+    if (self == NULL) {
+        STSMSG(1, ("VdbBlastRunSetGetAvgSeqLen(self=NULL)"));
+        return 0;
+    }
+
+    if (self->avgSeqLen == ~0) {
+        uint64_t n = 0;
+        _VdbBlastRunSetBeingRead(self);
+
+        n = VdbBlastRunSetGetNumSequencesApprox(self);
+        if (n != 0) {
+            num = VdbBlastRunSetGetTotalLengthApprox(self) / n;
+        }
+        else {
+            num = n;
+        }
+        ((VdbBlastRunSet*)self)->avgSeqLen = num;
+    }
+
+    STSMSG(1, ("VdbBlastRunSetGetAvgSeqLen = %ld", num));
+    return self->avgSeqLen;
+}
+
+LIB_EXPORT size_t CC VdbBlastRunSetGetName(const VdbBlastRunSet *self,
+    VdbBlastStatus *status, char *name_buffer, size_t bsize)
+{
+    size_t sz = 0;
+
+    VdbBlastStatus dummy = eVdbBlastNoErr;
+    if (status == NULL)
+    {   status = &dummy; }
+
+    *status = eVdbBlastErr;
+
+    if (self == NULL)
+    {   return 0; }
+
+    _VdbBlastRunSetBeingRead(self);
+
+    sz = _RunSetGetName(&self->runs, status, name_buffer, bsize);
+
+    STSMSG(1, ("VdbBlastRunSetGetName = '%.*s'", bsize, name_buffer));
+
+    return sz;
+}
+
+LIB_EXPORT
+time_t CC VdbBlastRunSetLastUpdatedDate(const VdbBlastRunSet *self)
+{
+    _VdbBlastRunSetBeingRead(self);
+    return _NotImplemented(__func__);
+}
+
+LIB_EXPORT
+size_t CC VdbBlastRunSetGetReadName(const VdbBlastRunSet *self,
+    uint64_t read_id, /* 0-based in RunSet */
+    char *name_buffer,
+    size_t bsize)
+{
+    rc_t rc = 0;
+    VdbBlastStatus status = eVdbBlastNoErr;
+    size_t need = 0;
+    size_t num_writ = 0;
+
+    ReadDesc desc;
+    memset(&desc, 0, sizeof desc);
+
+    if (name_buffer && bsize)
+    {   name_buffer[0] = '\0'; }
+
+    if (self == NULL) {
+        STSMSG(1, ("VdbBlastRunSetGetReadName(self=NULL)"));
+        return 0;
+    }
+
+    _VdbBlastRunSetBeingRead(self);
+
+    status = _RunSetFindReadDesc(&self->runs, read_id, &desc);
+    if (status != eVdbBlastNoErr) {
+        STSMSG(1, ("Error: failed to VdbBlastRunSetGetReadName: "
+            "cannot find RunSet ReadDesc"));
+        return 0;
+    }
+
+    assert(desc.run && desc.run->path && desc.run->acc && desc.spot
+        && desc.read);
+
+    if (desc.run->type == btpUndefined) {
+        desc.run->type
+            = _VdbBlastMgrBTableType(self->mgr, desc.run->path);
+        assert(desc.run->type != btpUndefined);
+    }
+    if (desc.run->type == btpWGS) {
+        if (desc.read != 1) {
+            STSMSG(1, ("Error: failed to VdbBlastRunSetGetReadName: "
+                "Unexpected read='%u' for run '%s', spot='%lu'",
+                desc.read, desc.run->path, desc.spot));
+            return 0;
+        }
+        status = _VdbBlastRunGetWgsAccession(
+            desc.run, desc.spot, name_buffer, bsize, &need);
+        if (status != eVdbBlastNoErr)
+        {   need = 0; }
+        return need;
+    }
+    else if (desc.run->type == btpREFSEQ) {
+        rc = string_printf(name_buffer, bsize, &num_writ, "%s", desc.run->acc);
+        if (rc == 0) {
+            S
+            need = num_writ;
+        }
+        else if (GetRCObject(rc) == (enum RCObject)rcBuffer
+            && GetRCState(rc) == rcInsufficient)
+        {
+            size_t size;
+            S
+            need = string_measure(desc.run->acc, &size) + 1;
+        }
+    }
+    else {
+        rc = string_printf(name_buffer, bsize, &num_writ,
+            "%s.%lu.%u", desc.run->acc, desc.spot, desc.read);
+        if (rc == 0) {
+            S
+            need = num_writ;
+        }
+        else if (GetRCObject(rc) == (enum RCObject)rcBuffer
+            && GetRCState(rc) == rcInsufficient)
+        {
+            int i = 0;
+            size_t size;
+            S
+            need = string_measure(desc.run->acc, &size) + 2;
+            i = desc.spot;
+            while (i > 0) {
+                ++need;
+                i /= 10;
+            }
+            i = desc.read;
+            while (i > 0) {
+                ++need;
+                i /= 10;
+            }
+        }
+        else
+        {   LOGERR(klogInt, rc, "Unexpecter error in string_printf"); }
+    }
+
+    STSMSG(1, ("VdbBlastRunSetGetName = '%.*s'", bsize, name_buffer));
+    return need;
+}
+
+LIB_EXPORT uint32_t CC VdbBlastRunSetGetReadId(const VdbBlastRunSet *self,
+    const char *name_buffer, size_t bsize, uint64_t *read_id)
+{
+    VdbBlastStatus status = eVdbBlastNoErr;
+    bool found = false;
+
+    uint64_t result = 0;
+    char *acc = NULL;
+    uint64_t spot = 0;
+    uint32_t read = 0;
+    uint32_t i = ~0;
+    if (self == NULL || name_buffer == NULL || name_buffer[0] == '\0' ||
+        bsize == 0 || read_id == 0)
+    {   return eVdbBlastErr; }
+
+    {
+        size_t n = bsize;
+        const char *end = name_buffer + bsize;
+        char *dot2 = NULL;
+        char *dot1 = memchr(name_buffer, '.', bsize);
+        if (dot1 != NULL) {
+            if (dot1 == name_buffer)
+            {   return eVdbBlastErr; }
+            if (dot1 - name_buffer + 1 >= bsize)
+            {   return eVdbBlastErr; }
+            n -= (dot1 - name_buffer + 1);
+            dot2 = memchr(dot1 + 1, '.', n);
+            if (dot2 != NULL) {
+                if (dot2 - name_buffer + 1 >= bsize)
+                {   return eVdbBlastErr; }
+                acc = string_dup(name_buffer, dot1 - name_buffer + 1);
+                if (acc == NULL)
+                {   return eVdbBlastMemErr; }
+                acc[dot1 - name_buffer] = '\0';
+                while (++dot1 < dot2) {
+                    char c = *dot1;
+                    if (c < '0' || c > '9') {
+                        S
+                        status = eVdbBlastErr;
+                        break;
+                    }
+                    spot = spot * 10 + c - '0';
+                }
+                while (status == eVdbBlastNoErr && ++dot2 < end) {
+                    char c = *dot2;
+                    if (c < '0' || c > '9') {
+                        S
+                        status = eVdbBlastErr;
+                        break;
+                    }
+                    read = read * 10 + c - '0';
+                }
+            }
+            else {
+                acc = malloc(bsize + 1);
+                if (acc == NULL)
+                {   return eVdbBlastMemErr; }
+                string_copy(acc, bsize + 1, name_buffer, bsize);
+                acc[bsize] = '\0';
+            }
+        }
+        else {
+            acc = malloc(bsize + 1);
+            if (acc == NULL)
+            {   return eVdbBlastMemErr; }
+            string_copy(acc, bsize + 1, name_buffer, bsize);
+            acc[bsize] = '\0';
+        }
+    }
+
+    _VdbBlastRunSetBeingRead(self);
+
+    for (i = 0; i < self->runs.krun && status == eVdbBlastNoErr; ++i) {
+        uint64_t id = ~0;
+        VdbBlastRun *run = self->runs.run + i;
+        size_t size;
+        assert(run && run->acc);
+        if (string_measure(run->acc, &size)
+            == string_measure(acc, &size))
+        {
+            if (strcmp(run->acc, acc) == 0) {
+                status = _VdbBlastRunGetReadId(run, acc, spot, read, &id);
+                if (status == eVdbBlastNoErr) {
+                    if (run->rd.readIdDesc.idType == eFixedReadN) {
+                        id += result;
+                    }
+                    *read_id = id;
+                    found = true;
+                }
+                break;
+            }
+        }
+        else if ((string_measure(run->acc, &size) < string_measure(acc, &size))
+            && (run->type == btpWGS)
+            && (memcmp(run->acc, acc, string_measure(run->acc, &size))
+                == 0))
+        {
+            status = _VdbBlastRunGetReadId(run, acc, spot, read, &id);
+            if (status == eVdbBlastNoErr) {
+                if (run->rd.readIdDesc.idType == eFixedReadN) {
+                    result += id;
+                }
+                else {
+                    result = id;
+                }
+                *read_id = result;
+                found = true;
+            }
+            break;
+        }
+        result += _VdbBlastRunGetSequencesAmount(run, &status);
+        if (status != eVdbBlastNoErr) {
+            if (status == eVdbBlastTooExpensive) {
+                status = eVdbBlastNoErr;
+            }
+            else {
+                break;
+            }
+        }
+    }
+
+    if (status == eVdbBlastNoErr && !found) {
+        S
+        status = eVdbBlastErr;
+    }
+
+    free (acc);
+    acc = NULL;
+
+    return status;
+}
+
+/* TODO: make sure
+         ReadLength is correct when there are multiple reads in the same spot */
+LIB_EXPORT
+uint64_t CC VdbBlastRunSetGetReadLength(const VdbBlastRunSet *self,
+    uint64_t read_id)
+{
+    rc_t rc = 0;
+    const VCursor *curs = NULL;
+    uint32_t col_idx = 0;
+    char buffer[84] = "";
+    uint32_t row_len = 0;
+    ReadDesc desc;
+    VdbBlastStatus status = eVdbBlastErr;
+
+    if (self == NULL) {
+        STSMSG(1, ("VdbBlastRunSetGetReadLength(self=NULL)"));
+        return 0;
+    }
+
+    status = _RunSetFindReadDesc(&self->runs, read_id, &desc);
+    if (status != eVdbBlastNoErr) {
+        STSMSG(1, ("Error: failed to VdbBlastRunSetGetReadLength: "
+            "cannot find RunSet ReadDesc"));
+        return 0;
+    }
+    assert(desc.run && desc.spot && desc.run->path);
+
+    _VdbBlastRunSetBeingRead(self);
+
+    if (rc == 0) {
+        rc = _VTableMakeCursor
+            (desc.run->obj->seqTbl, &curs, &col_idx, "READ", desc.run->acc);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc, "Error in _VTableMakeCursor"
+                "$(path), READ)", "path=%s", desc.run->path));
+        }
+    }
+    if (rc == 0) {
+        rc = VCursorReadDirect
+            (curs, desc.spot, col_idx, 8, buffer, sizeof buffer, &row_len);
+        if (rc != 0) {
+            PLOGERR(klogInt, (klogInt, rc, "Error in VCursorReadDirect"
+                "$(path), READ, spot=$(spot))",
+                "path=%s,spot=%ld", desc.run->path, desc.spot));
+        }
+    }
+    VCursorRelease(curs);
+    curs = NULL;
+    if (rc == 0) {
+        STSMSG(1, ("VdbBlastRunSetGetReadLength = %ld", row_len));
+        return row_len;
+    }
+    else {
+        STSMSG(1, ("Error: failed to VdbBlastRunSetGetReadLength"));
+        return 0;
+    }
+}
+
+uint64_t _VdbBlastRunSet2naRead(const VdbBlastRunSet *self,
+    VdbBlastStatus *status, uint64_t *read_id, size_t *starting_base,
+    uint8_t *buffer, size_t buffer_size, KVdbBlastReadMode mode)
+{
+    uint64_t n = 0; 
+    rc_t rc = 0;
+    assert(self && status);
+
+    rc = KLockAcquire(self->core2na.mutex);
+    if (rc != 0) {
+        LOGERR(klogInt, rc, "Error in KLockAcquire");
+    }
+    else {
+        const Core2na *c
+            = mode != VDB_READ_REFERENCE ? &self->core2na : &self->core2naRef;
+        n = _Core2naRead((Core2na*)c, &self->runs, status,
+            read_id, starting_base, buffer, buffer_size);
+        if (n == 0 && self->core2na.eos) {
+            *read_id = ~0;
+        }
+        rc = KLockUnlock(self->core2na.mutex);
+        if (rc != 0) {
+            LOGERR(klogInt, rc, "Error in KLockUnlock");
+        }
+    }
+    if (rc != 0) {
+        *status = eVdbBlastErr;
+    }
+
+    if (*status == eVdbBlastNoErr || *status == eVdbBlastCircularSequence) {
+        if (read_id != NULL && starting_base != NULL) {
+            STSMSG(3, (
+                "VdbBlast2naReaderRead(read_id=%ld, starting_base=%ld) = %ld",
+                *read_id, *starting_base, n));
+        }
+        else {
+            STSMSG(2, ("VdbBlast2naReaderRead = %ld", n));
+        }
+    }
+    else {
+        if (read_id != NULL && starting_base != NULL) {
+            STSMSG(1, ("Error: failed to VdbBlast2naReaderRead(%ld)", n));
+        }
+        else {
+            STSMSG(1, ("Error: failed to VdbBlast2naReaderRead"));
+        }
+    }
+    return n;
+}
+
+/******************************************************************************/
diff --git a/libs/blast/run-set.h b/libs/blast/run-set.h
new file mode 100644
index 0000000..060a80e
--- /dev/null
+++ b/libs/blast/run-set.h
@@ -0,0 +1,313 @@
+#ifndef _h_libs_blast_run_set_
+#define _h_libs_blast_run_set_
+
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "blast-mgr.h" /* BTableType */
+
+#ifndef _h_insdc_insdc_
+#include <insdc/insdc.h> /* INSDC_coord_len */
+#endif
+
+#ifndef _h_insdc_sra_
+#include <insdc/sra.h> /* INSDC_SRA_platform_id */
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h> /* BSTree */
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h> /* KRefcount */
+#endif
+
+#ifndef _h_ncbi_vdb_blast_
+#include <ncbi/vdb-blast.h> /* VdbBlastStatus */
+#endif
+
+#include <stdbool.h> /* bool */
+#include <stddef.h> /* size_t */
+#include <stdint.h> /* uint32_t */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+    eColTypeError,
+    eColTypeAbsent,
+    eColTypeStatic,
+    eColTypeNonStatic
+} EColType;
+
+typedef enum {
+    eFixedReadN,
+    eFactor10,
+} EReadIdType;
+
+typedef struct {
+    EReadIdType idType;
+    uint32_t runBits;
+    bool varReadN;
+} ReadIdDesc;
+
+typedef struct {
+    uint32_t index;
+
+    uint64_t spotCount;
+    uint32_t spotBits;
+
+    uint8_t nReads;
+    uint8_t nBioReads; /* knowing filtering (if static) and min_read_len info */
+    uint64_t bioLen; /* per read. is assigned just when allStatic */
+    INSDC_SRA_platform_id platform;
+
+    uint64_t bioBaseCount; /* BIO_BASE_COUNT, ~0 if not found */
+    uint64_t cmpBaseCount; /* CMP_BASE_COUNT, ~0 if not found */
+
+    INSDC_read_type *readType;
+    EColType readTypeStatic;
+
+    uint32_t *readLen;
+    EColType readLenStatic;
+
+    uint8_t *rdFilter;
+    EColType rdFilterStatic;
+
+    bool varReadLen;
+    ReadIdDesc readIdDesc;
+} RunDesc;
+
+typedef struct {
+    const struct VDatabase *db;
+
+    const struct VTable *seqTbl;
+    const struct VTable *prAlgnTbl;
+    const struct VTable *refTbl;
+
+    /* WGS */
+    const struct VCursor *cursACCESSION;
+    uint32_t col_ACCESSION;
+
+    /* SRA_PLATFORM_PACBIO_SMRT : variable read number */
+    const struct VCursor *cursSeq;
+    uint32_t col_READ_FILTER;
+    uint32_t col_READ_LEN;
+    uint32_t col_READ_TYPE;
+    uint32_t col_TRIM_LEN;
+    uint32_t col_TRIM_START;
+} VdbBlastDb;
+
+typedef struct {
+    /* rundesc; */
+    char *acc;
+    char *path;
+
+    VdbBlastDb *obj;
+    BTableType type;
+    bool cSra;
+
+   /* bioReads = numSequences = number-of-spots * number-of-bio-reads-in-spot */
+    uint64_t bioReads;
+
+    uint64_t alignments; /* rows number in PRIMARY_ALIGNMENT table */
+
+    bool bioReadsTooExpensive; /* numSequences is TooExpensive */
+    uint64_t bioReadsApprox;   /* numSequencesApprox; */
+
+    uint64_t bioBases;         /* length; */
+    bool bioBasesTooExpensive; /* totalLength is TooExpensive */
+    uint64_t bioBasesApprox;   /* lengthApprox; */
+
+    RunDesc rd;
+
+    uint32_t min_read_length;
+} VdbBlastRun;
+
+typedef struct VdbBlastRef VdbBlastRef;
+typedef struct {
+    VdbBlastRef  *rfd;
+    size_t        rfdk; /* Number of rfd members */
+    size_t        rfdn; /* Allocated rfd members */
+
+    uint64_t  totalLen; /* Total number of bases in reference set.
+                           Base count for circular references is doubled. */
+
+    BSTree tRuns;       /* rundesc-s */
+    BSTree tExtRefs;    /* SEQ_ID-s of external references */
+    BSTree tIntRefs;    /* SEQ_ID-s of external references */
+} RefSet;
+
+void _RefSetFini(RefSet *self);
+
+typedef struct RunSet {
+    VdbBlastRun *run;
+    uint32_t krun; /* number of run-s */
+    uint32_t nrun; /* sizeof of run-s */
+
+    RefSet refs;
+} RunSet;
+
+typedef struct {
+    const VdbBlastRun *prev;
+
+    VdbBlastRun *run;
+
+    uint32_t tableId;
+ /* VDB_READ_UNALIGNED, VDB_READ_ALIGNED or VDB_READ_DIRECT */
+
+    uint64_t spot; /* 1-based */
+    uint32_t read; /* 1-based */
+    uint32_t nReads; /* is variable in SRA_PLATFORM_PACBIO_SMRT */
+
+    uint64_t read_id; /* BioReadId in RunSet */
+
+    bool circular;
+               /* we are going to return a circular reference the second time */
+} ReadDesc;
+
+typedef struct {
+    uint32_t col_PRIMARY_ALIGNMENT_ID;
+    uint32_t col_READ_FILTER;
+    uint32_t col_READ_LEN;
+    uint32_t col_TRIM_LEN;
+    uint32_t col_TRIM_START;
+
+    int64_t *primary_alignment_id;
+    uint8_t *read_filter;
+    uint32_t *read_len;
+    INSDC_coord_len TRIM_LEN;
+    INSDC_coord_val TRIM_START;
+
+    uint8_t nReadsAllocated;
+} ReaderCols;
+
+/* cSRA READ mode : is ignored for non-cSRA runs */
+typedef uint32_t KVdbBlastReadMode;
+enum {
+    VDB_READ_UNALIGNED =       1, /* return unaligned reads */
+    VDB_READ_ALIGNED   =       2, /* return aligned reads */
+    VDB_READ_REFERENCE =       3, /* return reference sequence */
+};
+
+struct References;
+
+typedef struct {
+    bool eor;
+    ReadDesc desc;
+    uint32_t col_READ;
+    const struct VCursor *curs;
+    size_t starting_base; /* 0-based, in current read */
+    ReaderCols cols;
+    KVdbBlastReadMode mode;
+    const struct References *refs;
+} Reader2na;
+
+typedef struct Core2na {
+    uint32_t min_read_length;
+    bool hasReader;
+    struct KLock *mutex;
+    uint64_t initial_read_id;
+    uint32_t irun; /* index in RunSet */
+    bool eos;
+    Reader2na reader;
+} Core2na;
+
+typedef struct Core4na {
+    uint32_t min_read_length;
+    struct KLock *mutex;
+    ReadDesc desc;
+    const struct VCursor *curs;
+    const struct VBlob *blob; /* TODO */
+    ReaderCols cols;
+    uint32_t col_READ;
+    KVdbBlastReadMode mode;
+} Core4na;
+
+struct VdbBlastRunSet {
+    KRefcount refcount;
+    bool protein;
+    VdbBlastMgr *mgr;
+
+    RunSet runs;
+
+    bool beingRead;
+    ReadIdDesc readIdDesc;
+
+    Core2na core2na;
+    Core4na core4na;
+
+    Core2na core2naRef;
+    Core4na core4naRef;
+
+    uint64_t minSeqLen;
+    uint64_t avgSeqLen;
+    uint64_t maxSeqLen;
+};
+
+rc_t _VTableMakeCursor(const struct VTable *self, const struct VCursor **curs,
+    uint32_t *col_idx, const char *col_name, const char *acc);
+
+rc_t _ReadDescFindNextRead(ReadDesc *self, bool *found);
+VdbBlastStatus _ReadDescFixReadId(ReadDesc *self);
+
+uint64_t _VdbBlastRunAdjustSequencesAmountForAlignments(VdbBlastRun *self,
+    VdbBlastStatus *status);
+
+#ifdef TEST_VdbBlastRunFillReadDesc
+VDB_EXTERN
+#endif
+uint32_t _VdbBlastRunFillReadDesc(VdbBlastRun *self,
+    uint64_t read_id, ReadDesc *desc);
+
+uint64_t _VdbBlastRunGetNumAlignments(VdbBlastRun *self,
+    VdbBlastStatus *status);
+
+bool _VdbBlastRunVarReadNum(const VdbBlastRun *self);
+
+uint32_t _RunSetFindReadDesc(const struct RunSet *self,
+    uint64_t read_id, ReadDesc *desc);
+
+uint64_t _VdbBlastRunSet2naRead(const VdbBlastRunSet *self,
+    VdbBlastStatus *status, uint64_t *read_id, size_t *starting_base,
+    uint8_t *buffer, size_t buffer_size, KVdbBlastReadMode mode);
+
+void _VdbBlastRunSetBeingRead(const VdbBlastRunSet *self);
+
+VdbBlastStatus _VdbBlastRunSetFindFirstRead
+    (const VdbBlastRunSet *self, uint64_t *read_id, bool useGetFirstRead);
+
+uint64_t _VdbBlastRunSetGetAllReads(const VdbBlastRunSet *self, uint32_t run);
+
+EReadIdType _VdbBlastRunSetGetReadIdType(const VdbBlastRunSet *self);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_libs_blast_run_set_ */
diff --git a/libs/cipher/cipher-1.7/PKG-INFO b/libs/cipher/cipher-1.7/PKG-INFO
new file mode 100644
index 0000000..d875d2c
--- /dev/null
+++ b/libs/cipher/cipher-1.7/PKG-INFO
@@ -0,0 +1,13 @@
+Metadata-Version: 1.0
+Name: cipher
+Version: 1.7
+Summary: UNKNOWN
+Home-page: UNKNOWN
+Author: sra-toolkit
+Author-email: sra-toolkit at ncbi.nlm.nih.gov
+License: UNKNOWN
+Description: NCBI encryption wrapper for SRA encryption library
+        ==================================================
+        
+        [Documentation](https://dsubmit.ncbi.nlm.nih.gov/docs/cipher/)
+Platform: UNKNOWN
diff --git a/libs/cipher/cipher-1.7/README.md b/libs/cipher/cipher-1.7/README.md
new file mode 100644
index 0000000..6ed2deb
--- /dev/null
+++ b/libs/cipher/cipher-1.7/README.md
@@ -0,0 +1,4 @@
+NCBI encryption wrapper for SRA encryption library
+==================================================
+
+[Documentation](https://dsubmit.ncbi.nlm.nih.gov/docs/cipher/)
\ No newline at end of file
diff --git a/libs/cipher/cipher-1.7/cipher.egg-info/PKG-INFO b/libs/cipher/cipher-1.7/cipher.egg-info/PKG-INFO
new file mode 100644
index 0000000..9db8ad0
--- /dev/null
+++ b/libs/cipher/cipher-1.7/cipher.egg-info/PKG-INFO
@@ -0,0 +1,13 @@
+Metadata-Version: 1.0
+Name: cipher
+Version: 1.7
+Summary: UNKNOWN
+Home-page: UNKNOWN
+Author: sra-toolkit
+Author-email: sra-toolkit at ncbi.nlm.nih.gov
+License: UNKNOWN
+Description: NCBI encryption wrapper for SRA encryption library
+        ==================================================
+        
+        [Documentation](https://dsubmit.ncbi.nlm.nih.gov/docs/cipher/)
+Platform: UNKNOWN
diff --git a/libs/cipher/cipher-1.7/cipher.egg-info/SOURCES.txt b/libs/cipher/cipher-1.7/cipher.egg-info/SOURCES.txt
new file mode 100644
index 0000000..7464e95
--- /dev/null
+++ b/libs/cipher/cipher-1.7/cipher.egg-info/SOURCES.txt
@@ -0,0 +1,12 @@
+decrypt.py
+encrypt.py
+requirements-test.txt
+setup.cfg
+setup.py
+./README.md
+cipher/__init__.py
+cipher.egg-info/PKG-INFO
+cipher.egg-info/SOURCES.txt
+cipher.egg-info/dependency_links.txt
+cipher.egg-info/not-zip-safe
+cipher.egg-info/top_level.txt
\ No newline at end of file
diff --git a/libs/cipher/cipher-1.7/cipher.egg-info/dependency_links.txt b/libs/cipher/cipher-1.7/cipher.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/libs/cipher/cipher-1.7/cipher.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/libs/cipher/cipher-1.7/cipher.egg-info/not-zip-safe b/libs/cipher/cipher-1.7/cipher.egg-info/not-zip-safe
new file mode 100644
index 0000000..d3f5a12
--- /dev/null
+++ b/libs/cipher/cipher-1.7/cipher.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
diff --git a/libs/cipher/cipher-1.7/cipher.egg-info/top_level.txt b/libs/cipher/cipher-1.7/cipher.egg-info/top_level.txt
new file mode 100644
index 0000000..7c55fd6
--- /dev/null
+++ b/libs/cipher/cipher-1.7/cipher.egg-info/top_level.txt
@@ -0,0 +1 @@
+cipher
diff --git a/libs/cipher/cipher-1.7/cipher/__init__.py b/libs/cipher/cipher-1.7/cipher/__init__.py
new file mode 100644
index 0000000..0768ceb
--- /dev/null
+++ b/libs/cipher/cipher-1.7/cipher/__init__.py
@@ -0,0 +1,393 @@
+from ctypes import (c_int, c_char_p, cdll, Structure, c_uint32, ARRAY,
+                    c_char, POINTER, c_size_t, c_void_p, c_uint64, byref,
+                    create_string_buffer, c_uint)
+import platform
+
+import os
+
+
+def check_rc(rc):
+    if rc:
+        raise RuntimeError("bad rc, %d", rc)
+    return 1
+
+def get_lib_name():
+    if platform.system() == "Windows":
+        return "ncbi-vdb.dll"
+    elif platform.system() == "Darwin":
+        return "libncbi-vdb.dylib"
+    else:
+        return "libncbi-vdb.so"
+
+
+_krypto = _kfs = cdll.LoadLibrary( get_lib_name() )
+
+
+class _KKey(Structure):
+    _fields_ = [("type", c_uint32),
+                ("text", ARRAY(c_char, 32))]
+
+
+def errcheck(result, func, args):
+    return check_rc(result)
+
+# setting up declarations for functions
+KKeyInitRead = _krypto.KKeyInitRead
+KKeyInitRead.restype = c_uint
+KKeyInitRead.argtypes = [POINTER(_KKey), c_int, c_char_p, c_size_t]
+KKeyInitRead.errcheck = errcheck
+
+KEncFileMakeRead = _krypto.KEncFileMakeRead
+KEncFileMakeRead.restype = c_uint
+KEncFileMakeRead.argtypes = (POINTER(c_void_p), c_void_p, POINTER(_KKey))
+KEncFileMakeRead.errcheck = errcheck
+
+KEncryptFileMakeRead = _krypto.KEncryptFileMakeRead
+KEncryptFileMakeRead.restype = c_uint
+KEncryptFileMakeRead.argtypes = (POINTER(c_void_p), c_void_p, POINTER(_KKey))
+KEncryptFileMakeRead.errcheck = errcheck
+
+KEncFileMakeUpdate = _krypto.KEncFileMakeUpdate
+KEncFileMakeUpdate.restype = c_uint
+KEncFileMakeUpdate.argtypes = (POINTER(c_void_p), c_void_p, POINTER(_KKey))
+KEncFileMakeUpdate.errcheck = errcheck
+
+KEncFileMakeWrite = _krypto.KEncFileMakeWrite
+KEncFileMakeWrite.restype = c_uint
+KEncFileMakeWrite.argtypes = (POINTER(c_void_p), c_void_p, POINTER(_KKey))
+KEncFileMakeWrite.errcheck = errcheck
+
+KReencFileMakeRead = _krypto.KReencFileMakeRead
+KReencFileMakeRead.restype = c_uint
+KReencFileMakeRead.argtypes = [POINTER(c_void_p), c_void_p, POINTER(_KKey), POINTER(_KKey)]
+KReencFileMakeRead.errcheck = errcheck
+
+KFileMakeFDFileRead = _kfs.KFileMakeFDFileRead
+KFileMakeFDFileRead.restype = c_uint
+KFileMakeFDFileRead.argtypes = [POINTER(c_void_p), c_int]
+KFileMakeFDFileRead.errcheck = errcheck
+
+KFileMakeFDFileWrite = _kfs.KFileMakeFDFileWrite
+KFileMakeFDFileWrite.restype = c_uint
+KFileMakeFDFileWrite.argtypes = [POINTER(c_void_p), c_int, c_int]
+KFileMakeFDFileWrite.errcheck = errcheck
+
+KFileRelease = _kfs.KFileRelease
+KFileRelease.argtypes = [c_void_p]
+
+KFileReadAll = _kfs.KFileReadAll
+KFileReadAll.restype = c_uint
+KFileReadAll.argtypes = [c_void_p, c_uint64, c_void_p, c_size_t, POINTER(c_size_t)]
+KFileReadAll.errcheck = errcheck
+
+KFileWrite = _kfs.KFileWrite
+KFileWrite.restype = c_uint
+KFileWrite.argtypes = [c_void_p, c_uint64, c_char_p, c_size_t, POINTER(c_size_t)]
+KFileWrite.errcheck = errcheck
+
+KFileWriteAll = _kfs.KFileWriteAll
+KFileWriteAll.restype = c_uint
+KFileWriteAll.argtypes = [c_void_p, c_uint64, c_char_p, c_size_t, POINTER(c_size_t)]
+KFileWriteAll.errcheck = errcheck
+
+KFileSize = _kfs.KFileSize
+KFileSize.restype = c_uint
+KFileSize.argtypes = [c_void_p, POINTER(c_uint64)]
+KFileSize.errcheck = errcheck
+
+KFileSetSize = _kfs.KFileSetSize
+KFileSetSize.restype = c_uint
+KFileSetSize.argtypes = [c_void_p, c_uint64]
+KFileSetSize.errcheck = errcheck
+
+_kkeyAES128 = 1
+
+class _KFile(object):
+    def __init__(self):
+        self._kfile = None
+
+    def __dealloc__(self):
+        if self._kfile:
+            KFileRelease(self._kfile)
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, t, value, traceback):
+        self.close()
+
+    def close(self):
+        if self._kfile:
+            KFileRelease(self._kfile)
+            self._kfile = None
+
+    def write_all(self, buf, offset):
+        """
+        Write `buf` bytes into file at given `offset`
+        :param buf: Byte-string to write.
+        :param offset: Offset position in bytes to start writing at
+        """
+        if not self._kfile:
+            raise ValueError("I/O operation on closed file")
+        written = c_size_t()
+        KFileWriteAll(self._kfile, offset, buf, len(buf), byref(written))
+        return written.value
+
+    def read_all(self, size, offset):
+        """
+        Read `size` bytes from `offset`, might return less than `size` bytes if EOF is reached before.
+
+        :param size: Number of bytes to read
+        :param offset: Offset to start read at
+        :return: A byte-buffer containing read bytes
+        """
+        if not self._kfile:
+            raise ValueError("I/O operation on closed file")
+        read = c_size_t()
+        buf = create_string_buffer(size)
+        KFileReadAll(self._kfile, offset, buf, size, byref(read))
+        # return buf.value[0:read.value]
+        return buf[0:read.value]
+
+    @property
+    def size(self):
+        """ Size of the file in bytes
+        """
+        if not self._kfile:
+            raise ValueError("I/O operation on closed file")
+        sz = c_uint64()
+        KFileSize(self._kfile, byref(sz))
+        return sz.value
+
+
+class _KFileStream(_KFile):
+    def __init__(self):
+        super(_KFileStream, self).__init__()
+        self.pos = 0
+
+    def write(self, buf):
+        """ Write `buf` into current position of the file.
+
+        :param buf: Byte-string to write into file
+        """
+        left = len(buf)
+        total_written = 0
+        while left:
+            written = self.write_all(buf[total_written:], self.pos)
+            self.pos += written
+            total_written += written
+            left -= written
+        return total_written
+
+    def seek(self, pos):
+        """ Sets current position in the file """
+        self.pos = pos
+
+    def read(self, size=-1):
+        """ Read `size` bytes from file
+        """
+        strings = []
+        if not self._kfile:
+            raise ValueError("I/O operation on closed file")
+        if size == -1:
+            strings = []
+            while 1:
+                s = self.read_all(16 * 1024, self.pos)
+                self.pos += len(s)
+                if not s:
+                    break
+                strings.append(s)
+            return b''.join(strings)
+        else:
+            res = self.read_all(size, self.pos)
+            self.pos += len(res)
+            return res
+
+    def truncate(self, size=None):
+        """
+        Truncate file up to current position (default) or up to `size`
+        """
+        if size is None:
+            size = self.pos
+        KFileSetSize(self._kfile, size)
+
+
+class Decryptor(_KFileStream):
+    """
+    Create a read-only file-like object that will decrypt `src_file` using `password`.
+
+    :param password: Byte string with password for decryption.
+    :param src_file: Integer file descriptor of input file.
+    :param close: If true `src_file` will be closed when this object is closed.
+    """
+
+    def __dealloc__(self):
+        if self.src_file:
+            os.close(self.src_file)
+
+    def __init__(self, password, src_file, close=True):
+        super(Decryptor, self).__init__()
+        self.kencfile = c_void_p()
+        self.src_file = src_file
+        self._close = close
+        key = _KKey()
+        kfile = c_void_p()
+        KKeyInitRead(byref(key), _kkeyAES128, password, len(password))
+        KFileMakeFDFileRead(byref(kfile), src_file)
+        kencfile = c_void_p()
+        try:
+            KEncFileMakeRead(byref(kencfile), kfile, byref(key))
+        except:
+            KFileRelease(kfile)
+            raise
+        self._kfile = kencfile
+
+    def close(self):
+        """
+        Releases memory and closes `src_file` if was requested so in constructor.
+        """
+        super(Decryptor, self).close()
+        if self.src_file and self._close:
+            os.close(self.src_file)
+            self.src_file = None
+
+
+class Encryptor(_KFileStream):
+    """
+    Create a file-like object that will encrypt input data and write it into `out_file` file descriptor.
+
+    Call `write` method on this object to write encrypted data into out_file.
+
+    :param password: Byte string with password.
+    :param out_file: Integer file descriptor of output file.
+    :param close: If true `out_file` descriptor will be closed when this object is closed.
+    :param update: If true encrypted file can be appended/modified, otherwise it will be truncated.
+    """
+
+    def __dealloc__(self):
+        if self.src_file and self._close:
+            os.close(self.src_file)
+
+    def __init__(self, password, out_file, close=True, update=False):
+        super(Encryptor, self).__init__()
+        kfile = c_void_p()
+        self.key = _KKey()
+        self.out_file = out_file
+        kencfile = c_void_p()
+        self._close = close
+        KKeyInitRead(byref(self.key), _kkeyAES128, password, len(password))
+        KFileMakeFDFileWrite(byref(kfile), 1 if update else 0, out_file)
+        try:
+            if update:
+                KEncFileMakeUpdate(byref(kencfile), kfile, byref(self.key))
+            else:
+                KEncFileMakeWrite(byref(kencfile), kfile, byref(self.key))
+        except:
+            KFileRelease(kfile)
+            raise
+        self._kfile = kencfile
+
+    def close(self):
+        """ Releases memory and closes `out_file` if was requested so in constructor.
+        """
+        super(Encryptor, self).close()
+        if self.out_file and self._close:
+            os.close(self.out_file)
+            self.out_file = None
+
+    def flush(self):
+        # TODO: implement this
+        pass
+
+
+class Reencryptor(_KFileStream):
+    """
+    Create a read-only file-like object that will decrypt `src_file` using `dec_password` and then
+    encrypt it with `enc_password`.  This objects acts like a decryptor attached to encryptor.
+
+    :param dec_password: Byte-string of decryption password used to decrypt `src_file`.
+    :param enc_password: Byte-string of encryption password used to encrypt returned data.
+    :param src_file: An integer file descriptor of input file, it should have read operation allowed.
+    :param close: If true `src_file` descriptor will be closed when this object is closed.
+    """
+
+    def __init__(self, dec_password, enc_password, src_file, close=True):
+        super(Reencryptor, self).__init__()
+        kfile = c_void_p()
+        dec_key = _KKey()
+        enc_key = _KKey()
+        self.src_file = src_file
+        kencfile = c_void_p()
+        self._close = close
+        KKeyInitRead(byref(dec_key), _kkeyAES128, dec_password, len(dec_password))
+        KKeyInitRead(byref(enc_key), _kkeyAES128, enc_password, len(enc_password))
+        KFileMakeFDFileRead(byref(kfile), src_file)
+        try:
+            KReencFileMakeRead(byref(kencfile), kfile, byref(dec_key), byref(enc_key))
+        except:
+            KFileRelease(kfile)
+            raise
+        self._kfile = kencfile
+
+    def __dealloc__(self):
+        if self.src_file and self._close:
+            os.close(self.src_file)
+
+    def close(self):
+        """
+        Releases memory and closes `src_file` if was requested so in constructor
+        """
+        super(Reencryptor, self).close()
+        if self.src_file and self._close:
+            os.close(self.src_file)
+            self.src_file = None
+
+
+class FDFileReader(_KFileStream):
+    """
+    Deprecated, do not use.  Will be removed in 1.6
+    Create a read-only file-like object that will read `f` file-object
+
+    :param f: Source file-like object, should have `fileno` method.
+    :param close: If true will close `f` when this object is closed
+    """
+
+    def __init__(self, f, close=True):
+        super(FDFileReader, self).__init__()
+        self._f = f
+        kfile = c_void_p()
+        KFileMakeFDFileRead(byref(kfile), f.fileno())
+        self._kfile = kfile
+        self._close = close
+
+    def close(self):
+        super(FDFileReader, self).close()
+        if self._close:
+            self._f.close()
+
+
+class EncryptingReader(_KFileStream):
+    """
+    Create a read-only file-like object that will read and encrypt `src_file` using `password`
+
+    :param src_file: An integer file descriptor to be encrypted.
+    :param password: Byte-string password used to encrypt.
+    :param close: If true `src_file` descriptor will be closed when this object is closed
+    """
+
+    def __init__(self, src_file, password, close=True):
+        enc_key = _KKey()
+        KKeyInitRead(byref(enc_key), _kkeyAES128, password, len(password))
+        kencfile = c_void_p()
+        KEncryptFileMakeRead(byref(kencfile), src_file._kfile, byref(enc_key))
+        self._kfile = kencfile
+        self._close = close
+        self._src_file = src_file
+
+    def close(self):
+        """
+        Releases memory and closes `src_file` if it was requested so in constructor
+        """
+        super(EncryptingReader, self).close()
+        if self._close:
+            self._src_file.close()
diff --git a/libs/cipher/cipher-1.7/decrypt.py b/libs/cipher/cipher-1.7/decrypt.py
new file mode 100644
index 0000000..6933bf9
--- /dev/null
+++ b/libs/cipher/cipher-1.7/decrypt.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+import cipher
+import getpass
+from optparse import OptionParser
+import shutil
+import sys
+
+
+if __name__ == '__main__':
+    version = '%prog 1.0'
+    parser = OptionParser(usage='''usage: %prog [options] INFILE OUTFILE
+    Decrypts file''', version=version)
+    parser.add_option('-P', '--password', dest='password', default=None)
+    args, values = parser.parse_args()
+    if len(values) < 2:
+        parser.print_usage()
+        sys.exit(2)
+    in_file, out_file = values
+    if not args.password:
+        args.password = getpass.getpass()
+
+    with open(in_file, 'rb') as in_f:
+        with open(out_file, 'wb') as out_f:
+            dec = cipher.Decryptor(args.password.encode('ascii'), in_f.fileno(), close=False)
+            shutil.copyfileobj(dec, out_f)
diff --git a/libs/cipher/cipher-1.7/encrypt.py b/libs/cipher/cipher-1.7/encrypt.py
new file mode 100644
index 0000000..e9a85f7
--- /dev/null
+++ b/libs/cipher/cipher-1.7/encrypt.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+import cipher
+import getpass
+from optparse import OptionParser
+import shutil
+import sys
+
+
+if __name__ == '__main__':
+    version = '%prog 1.0'
+    parser = OptionParser(usage='''usage: %prog [options] INFILE OUTFILE
+    Encrypts file''', version=version)
+    parser.add_option('-P', '--password', dest='password', default=None)
+    args, values = parser.parse_args()
+    if len(values) < 2:
+        parser.print_usage()
+        sys.exit(2)
+    in_name, out_file = values
+    if not args.password:
+        args.password = getpass.getpass()
+
+    with open(in_name, 'rb')  as in_f:
+        with open(out_file, 'wb') as out_f:
+            with cipher.Encryptor(args.password.encode('ascii'), out_f.fileno(), close=False, update=False) as enc:
+                shutil.copyfileobj(in_f, enc)
diff --git a/libs/cipher/cipher-1.7/requirements-test.txt b/libs/cipher/cipher-1.7/requirements-test.txt
new file mode 100644
index 0000000..55af511
--- /dev/null
+++ b/libs/cipher/cipher-1.7/requirements-test.txt
@@ -0,0 +1,5 @@
+coverage~=3.6
+pytest~=2.7
+teamcity-messages~=1.12
+pytest-gitignore~=1.1
+pytest-cov~=1.8
\ No newline at end of file
diff --git a/libs/cipher/cipher-1.7/setup.cfg b/libs/cipher/cipher-1.7/setup.cfg
new file mode 100644
index 0000000..c3b20c9
--- /dev/null
+++ b/libs/cipher/cipher-1.7/setup.cfg
@@ -0,0 +1,16 @@
+[metadata]
+name = cipher
+author = sra-toolkit
+author-email = sra-toolkit at ncbi.nlm.nih.gov
+is_pure = false
+
+[files]
+scripts = 
+	decrypt.py
+	encrypt.py
+
+[egg_info]
+tag_build = 
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/libs/cipher/cipher-1.7/setup.py b/libs/cipher/cipher-1.7/setup.py
new file mode 100644
index 0000000..e67c4fe
--- /dev/null
+++ b/libs/cipher/cipher-1.7/setup.py
@@ -0,0 +1,4 @@
+from setuptools import setup
+
+
+setup(setup_requires=['packit'], packit=True)
diff --git a/libs/csra2/Makefile b/libs/csra2/Makefile
new file mode 100644
index 0000000..d49e69f
--- /dev/null
+++ b/libs/csra2/Makefile
@@ -0,0 +1,87 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: all
+
+TOP ?= $(abspath ../..)
+MODULE = libs/csra2
+
+INT_LIBS = \
+	libcsra2
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+include $(TOP)/build/Makefile.env
+
+RWORKDIR = $(TOP)/$(MODULE)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+
+all std: makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# csra2
+#
+$(ILIBDIR)/libcsra2: $(addprefix $(ILIBDIR)/libcsra2.,$(ILIBEXT))
+
+CSRA2_SRC = \
+	blah
+
+CSRA2_OBJ = \
+	$(addsuffix .$(LOBX),$(CSRA2_SRC))
+
+CSRA2_LIB = \
+
+$(ILIBDIR)/libcsra2.$(LIBX): $(CSRA2_OBJ)
+	$(LD) --slib -o $@ $^ $(CSRA2_LIB)
+
+
+#-------------------------------------------------------------------------------
+# white-box test
+#
diff --git a/libs/hdf5/.gitignore b/libs/hdf5/.gitignore
new file mode 100644
index 0000000..09fa285
--- /dev/null
+++ b/libs/hdf5/.gitignore
@@ -0,0 +1,2 @@
+*.vers.h
+*.def
diff --git a/libs/hdf5/Makefile b/libs/hdf5/Makefile
new file mode 100644
index 0000000..c7d3f7d
--- /dev/null
+++ b/libs/hdf5/Makefile
@@ -0,0 +1,122 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: all
+
+TOP ?= $(abspath ../..)
+MODULE = libs/hdf5
+
+INT_LIBS = \
+
+EXT_LIBS = \
+	libkdf5
+
+ALL_LIBS = \
+	$(INT_LIBS) \
+	$(EXT_LIBS)
+
+OBJFILES = \
+	$(KDF5_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+ifdef HDF5_INCDIR
+	INCDIRS += $(addprefix -I,$(HDF5_INCDIR))
+endif
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+ifeq (1,$(HAVE_HDF5))
+
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+$(EXT_LIBS): makedirs
+	@ $(MAKE_CMD) $(LIBDIR)/$@
+
+else
+
+all std: $(ALL_LIBS)
+
+$(INT_LIBS):
+	@ echo "NOTE - internal library $(@F) cannot be built:"         \
+	       "It requires 'libhdf5' and its development headers."
+
+$(EXT_LIBS):
+	@ echo "NOTE - library $(@F) cannot be built:"                  \
+	       "It requires 'libhdf5' and its development headers."
+endif
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+	$(addprefix $(LIBDIR)/,$(EXT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# hdf5
+#
+$(LIBDIR)/libkdf5: $(addprefix $(LIBDIR)/libkdf5.,$(LIBEXT))
+
+KDF5_SRC = \
+	hdf5dir \
+	hdf5file \
+	hdf5arrayfile
+
+KDF5_OBJ = \
+	$(addsuffix .$(LOBX),$(KDF5_SRC))
+
+KDF5_LIB = \
+	-lhdf5 \
+	-lz \
+
+ifdef HDF5_LIBDIR
+	KDF5_LIB += $(addprefix -L,$(HDF5_LIBDIR))
+endif
+
+$(LIBDIR)/libkdf5.$(SHLX): $(KDF5_OBJ)
+	$(LD) --dlib --vers $(SRCDIR)/../ncbi-vdb/libncbi-vdb.vers -o $@ $^ $(KDF5_LIB)
+
+$(LIBDIR)/libkdf5.$(LIBX): $(KDF5_OBJ)
+	$(LD) --slib --vers $(SRCDIR)/../ncbi-vdb/libncbi-vdb.vers -o $@ $^ $(KDF5_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/hdf5/hdf5arrayfile-priv.h b/libs/hdf5/hdf5arrayfile-priv.h
new file mode 100644
index 0000000..00a2cd7
--- /dev/null
+++ b/libs/hdf5/hdf5arrayfile-priv.h
@@ -0,0 +1,79 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_hdf5arrayfile_priv_
+#define _h_hdf5arrayfile_priv_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_kfs_extern_
+#include <kfs/extern.h>
+#endif
+
+#ifndef _h_kfs_impl_
+#include <kfs/impl.h>
+#endif
+
+#ifndef _HDF5_H
+#include <hdf5.h>
+#endif
+
+/* object structure */
+struct HDF5ArrayFile
+{
+    KArrayFile dad;
+
+    KFile * parent;
+    /* the handle of the dataset, equivalent of the file-handle
+       opened in  */
+    hid_t dataset_handle;
+
+    /* the handle of the datatype of the elemens */
+    hid_t datatype_handle;
+    /* the enum of the datatype-class */
+    H5T_class_t datatype_class;
+    /* the actual size in bytes of the datatype */
+    size_t element_size;
+
+    /* the handle of the table-layout of the data in this dataset */
+    hid_t dataspace_handle;
+    uint8_t dimensionality;
+    hsize_t * extents;
+    uint64_t total_elements;
+    uint64_t total_bytes;
+
+    /* the handle of the buffer-layout of the dest. buffer */
+    hid_t dst_dataspace_handle;
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_hdf5arrayfile_priv_ */
\ No newline at end of file
diff --git a/libs/hdf5/hdf5arrayfile.c b/libs/hdf5/hdf5arrayfile.c
new file mode 100644
index 0000000..61d2f81
--- /dev/null
+++ b/libs/hdf5/hdf5arrayfile.c
@@ -0,0 +1,656 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+typedef struct HDF5ArrayFile HDF5ArrayFile;
+#define KARRAYFILE_IMPL HDF5ArrayFile
+
+#include "hdf5arrayfile-priv.h"
+
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <klib/text.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+static
+rc_t HDF5ArrayFile_open ( HDF5ArrayFile * self, hid_t dataset_handle )
+{
+    rc_t rc = 0;
+
+    self -> dataset_handle = dataset_handle;
+
+    /* take care of the datatype */
+    self->datatype_handle = H5Dget_type( self->dataset_handle );
+    if ( self->datatype_handle < 0 )
+        return RC( rcFS, rcFile, rcOpening, rcData, rcInvalid );
+    self->datatype_class = H5Tget_class( self->datatype_handle );
+    if ( self->datatype_class == H5T_NO_CLASS )
+        rc = RC( rcFS, rcFile, rcOpening, rcData, rcInvalid );
+    else
+    {
+        self->element_size  = H5Tget_size( self->datatype_handle );
+        if ( self->element_size == 0 )
+            rc = RC( rcFS, rcFile, rcOpening, rcData, rcInvalid );
+    }
+    if ( rc != 0 )
+    {
+        H5Tclose( self->datatype_handle );
+        return rc;
+    }
+
+    /* detect the dimensions ( dataspace ) */
+    self->dataspace_handle = H5Dget_space( self->dataset_handle );
+    if ( self->dataspace_handle < 0 )
+        return RC( rcFS, rcFile, rcOpening, rcData, rcInvalid );
+    self->dimensionality = H5Sget_simple_extent_ndims( self->dataspace_handle );
+    if ( self->dimensionality < 1 )
+        rc = RC( rcFS, rcFile, rcOpening, rcData, rcInvalid );
+    else
+    {
+        self->extents = malloc( sizeof( hsize_t ) * self->dimensionality );
+        if ( self->extents == NULL )
+            rc = RC( rcFS, rcFile, rcOpening, rcMemory, rcExhausted );
+        else
+        {
+            int h5res = H5Sget_simple_extent_dims( self->dataspace_handle, self->extents, NULL );
+            if ( h5res < 0 )
+                rc = RC( rcFS, rcFile, rcOpening, rcData, rcInvalid );
+            else
+            {
+                int i;
+                self->total_elements = self->extents[ 0 ];
+                for ( i = 1; i < self->dimensionality; ++i )
+                    self->total_elements *= self->extents[ i ];
+                self->total_bytes = self->total_elements * self->element_size;
+            }
+            if ( rc != 0 )
+                free( self->extents );
+        }
+    }
+
+    if ( rc != 0 )
+        H5Dclose( self->dataspace_handle );
+    return rc;
+}
+
+
+static
+rc_t HDF5ArrayFile_close ( HDF5ArrayFile * self )
+{
+    if ( self->extents != NULL )
+        free( self->extents );
+    if ( self->datatype_handle >= 0 )
+        H5Tclose( self->datatype_handle );
+    if ( self->dataspace_handle >= 0 )
+        H5Sclose( self->dataspace_handle );
+    if ( self->dataset_handle >= 0 )
+        H5Dclose( self->dataset_handle );
+    return 0;
+}
+
+
+
+/* Destroy
+ */
+static
+rc_t CC HDF5ArrayFileDestroy ( HDF5ArrayFile *self )
+{
+    HDF5ArrayFile_close ( self );
+    free ( self );
+    return 0;
+}
+
+
+/* Dimensionality
+ *  returns the number of dimensions in the ArrayFile
+ *
+ *  "dim" [ OUT ] - return parameter for number of dimensions
+ */
+static
+rc_t CC HDF5ArrayFileDimensionality ( const HDF5ArrayFile *self, uint8_t *dim )
+{
+    *dim = self->dimensionality;
+    return 0;
+}
+
+
+/* SetDimensionality
+ *  sets the number of dimensions in the ArrayFile
+ *
+ *  "dim" [ IN ] - new number of dimensions; must be > 0
+ */
+static
+rc_t CC HDF5ArrayFileSetDimensionality ( HDF5ArrayFile *self, uint8_t dim )
+{
+    self->dimensionality = dim;
+    return 0;
+}
+
+
+/* DimExtents
+ *  returns the extent of every dimension
+ *
+ *  "dim" [ IN ] - the dimensionality of "extents"
+ *
+ *  "extents" [ OUT ] - returns the extent for every dimension
+ */
+static
+rc_t CC HDF5ArrayFileDimExtents ( const HDF5ArrayFile *self, uint8_t dim, uint64_t *extents )
+{
+    uint8_t i;
+
+    if ( dim != self->dimensionality )
+        return RC( rcFS, rcFile, rcAccessing, rcParam, rcInvalid );
+    for ( i = 0; i < dim; ++i )
+        extents[ i ] = (uint64_t) self->extents[ i ];
+    return 0;
+}
+
+
+/* SetDimExtents
+ *  sets the new extents for every dimension
+ *
+ *  "dim" [ IN ] - the dimensionality of "extents"
+ *
+ *  "extents" [ IN ] - new extents for every dimension
+ */
+static
+rc_t CC HDF5ArrayFileSetDimExtents ( HDF5ArrayFile *self, uint8_t dim, uint64_t *extents )
+{
+    uint8_t i;
+
+    if ( dim != self->dimensionality )
+        return RC( rcFS, rcFile, rcResizing, rcParam, rcInvalid );
+    for ( i = 0; i < dim; ++i )
+        self->extents[ i ] = (hsize_t) extents[ i ];
+    return 0;
+}
+
+
+/* ElementSize
+ *  returns the element size in bits
+ *
+ *  "elem_bits" [ OUT ] - size of each element in bits
+ */
+static
+rc_t CC HDF5ArrayFileElementSize ( const HDF5ArrayFile *self, uint64_t *elem_bits )
+{
+    *elem_bits = ( self->element_size * 8 );
+    return 0;
+}
+
+
+static
+rc_t HDF5ArrayMakeRdWrOfsCnt( uint8_t dim, 
+                              const uint64_t *pos, const uint64_t *elem_count,
+                              hsize_t **ofs, hsize_t **cnt )
+{
+    uint8_t i;
+
+    *ofs = malloc( sizeof ( hsize_t ) * dim );
+    if ( *ofs == NULL )
+        return RC( rcFS, rcFile, rcReading, rcMemory, rcExhausted );
+    *cnt = malloc( sizeof ( hsize_t ) * dim );
+    if ( *cnt == NULL )
+    {
+        free( *ofs );
+        return RC( rcFS, rcFile, rcReading, rcMemory, rcExhausted );
+    }
+    for ( i = 0; i < dim; ++i )
+    {
+        (*ofs)[ i ] = (hsize_t)pos[ i ];
+        (*cnt)[ i ] = (hsize_t)elem_count[ i ];
+    }
+    return 0;
+}
+
+
+static
+hsize_t HDF5ArrayCalcTotal( const uint8_t dim, const hsize_t *count )
+{
+    uint8_t i;
+    hsize_t res = count[ 0 ];
+    for ( i = 1; i < dim; ++i )
+        res *= count[ i ];
+    return res;
+}
+
+
+static
+rc_t HDF5ArrayFileRead_intern ( const HDF5ArrayFile *self,
+    const hsize_t *ofs, void *buffer, const hsize_t *count )
+{
+    rc_t rc = 0;
+    herr_t status;
+
+    /* first we select a hyperslab in the source-dataspace */
+    status = H5Sselect_hyperslab( self->dataspace_handle, 
+                H5S_SELECT_SET, ofs, NULL, count, NULL );
+    if ( status < 0 )
+        rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+    else
+    {
+        /* calculate how many data-elements to read total */
+        hsize_t total = HDF5ArrayCalcTotal( self->dimensionality, count );
+        if ( total < 1 )
+            rc = RC( rcFS, rcFile, rcReading, rcParam, rcInvalid );
+        else
+        {
+            /* then we create a temp. dst-dataspace */
+            hid_t dst_space = H5Screate_simple( 1, &total, NULL );
+            if ( dst_space < 0 )
+                rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+            else
+            {
+                hid_t native_type = H5Tget_native_type( self->datatype_handle, H5T_DIR_ASCEND );
+                status = H5Dread( self->dataset_handle,   /* src dataset */
+                                  native_type,            /* discovered datatype */
+                                  dst_space,              /* temp. 1D dataspace */
+                                  self->dataspace_handle, /* src dataspace */
+                                  H5P_DEFAULT,            /* default transfer property list */
+                                  buffer );               /* dst-buffer */
+                if ( status < 0 )
+                    rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+
+                H5Tclose( native_type );
+                H5Sclose( dst_space );
+            }
+        }
+    }
+    return rc;
+}
+
+/* Read
+ *  read from n-dimensional position
+ *
+ *  "dim" [ IN ] - the dimensionality of all vectors
+ *
+ *  "pos"  [ IN ] - n-dimensional starting position in elements
+ *
+ *  "buffer" [ OUT ] and "elem_count" [ IN ] - return buffer for read
+ *  where "elem_count" is n-dimensional in elements
+ *
+ *  "num_read" [ OUT ] - n-dimensional return parameter giving back
+ *      the number of read elements in every dimension
+ */
+static
+rc_t CC HDF5ArrayFileRead ( const HDF5ArrayFile *self, uint8_t dim,
+    const uint64_t *pos, void *buffer, const uint64_t *elem_count,
+    uint64_t *num_read )
+{
+    rc_t rc;
+    hsize_t * hf_ofs;
+    hsize_t * hf_count;
+
+    if ( dim != self->dimensionality )
+        return RC( rcFS, rcFile, rcReading, rcParam, rcInvalid );
+
+    rc = HDF5ArrayMakeRdWrOfsCnt( dim, pos, elem_count, &hf_ofs, &hf_count );
+    if ( rc != 0 )
+        return rc;
+
+    rc = HDF5ArrayFileRead_intern ( self, hf_ofs, buffer, hf_count );
+    if ( rc == 0 )
+    {
+        uint8_t i;
+        for ( i = 0; i < dim; ++i )
+            num_read[ i ] = elem_count[ i ];
+    }
+
+    free( hf_count );
+    free( hf_ofs );
+
+    return rc;
+}
+
+
+static
+rc_t HDF5ArrayFileRead_v_intern ( const HDF5ArrayFile *self, uint8_t dim,
+    const hsize_t *ofs, char * buffer, const uint64_t buffer_size, uint64_t * num_read )
+{
+    rc_t rc = 0;
+
+    hsize_t * hf_count = malloc( sizeof ( hsize_t ) * dim );
+    if ( hf_count == NULL )
+        return RC( rcFS, rcFile, rcReading, rcMemory, rcExhausted );
+    else
+    {
+        herr_t status;
+        uint8_t i;
+
+        for ( i = 0; i < dim; ++i ) hf_count[ i ] = 1;
+
+        /* first we select a hyperslab in the source-dataspace */
+        status = H5Sselect_hyperslab( self->dataspace_handle, 
+                    H5S_SELECT_SET, ofs, NULL, hf_count, NULL );
+        if ( status < 0 )
+            rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+        else
+        {
+            /* calculate how many data-elements to read total */
+            hsize_t total = HDF5ArrayCalcTotal( self->dimensionality, hf_count );
+            if ( total < 1 )
+                rc = RC( rcFS, rcFile, rcReading, rcParam, rcInvalid );
+            else
+            {
+                /* then we create a temp. dst-dataspace */
+                hid_t dst_space = H5Screate_simple( 1, &total, NULL );
+                if ( dst_space < 0 )
+                    rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+                else
+                {
+                    hid_t memtype = H5Tcopy ( H5T_C_S1 );
+                    status = H5Tset_size ( memtype, H5T_VARIABLE );
+                    if ( status < 0 )
+                        rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+                    else
+                    {
+                        char * rdata[ 1 ];
+                        status = H5Dread ( self->dataset_handle, memtype, dst_space,
+                                           self->dataspace_handle, H5P_DEFAULT, rdata );
+                        if ( status < 0 )
+                            rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+                        else
+                        {
+                            uint32_t len = string_size ( rdata[ 0 ] );
+                            *num_read = string_copy ( buffer, buffer_size, rdata[ 0 ], len );
+                        }
+                        H5Dvlen_reclaim ( memtype, dst_space, H5P_DEFAULT, rdata );
+                    }
+                    H5Tclose( memtype );
+                    H5Sclose( dst_space );
+                }
+            }
+        }
+        free( hf_count );
+    }
+    return rc;
+}
+
+
+/* Read_v
+ *  reads ONE element from n-dimensional position, but the element is of variable length
+ *
+ *  "dim" [ IN ] - the dimensionality of all vectors
+ *
+ *  "pos"  [ IN ] - n-dimensional starting position in elements
+ *
+ *  "buffer" [ OUT ] and "elem_count" [ IN ] - return buffer for read
+ *  where "buffer_size" is the size of the buffer
+ *
+ *  "num_read" [ OUT ] - return parameter giving back the variable length of the one
+ *    element
+ */
+static
+rc_t CC HDF5ArrayFileRead_v ( const HDF5ArrayFile *self, uint8_t dim,
+    const uint64_t *pos, char * buffer, const uint64_t buffer_size,
+    uint64_t *num_read )
+{
+    rc_t rc = 0;
+    hsize_t * hf_ofs;
+    uint8_t i;
+
+    if ( dim != self->dimensionality )
+        return RC( rcFS, rcFile, rcReading, rcParam, rcInvalid );
+
+    *num_read = 0;
+    hf_ofs = malloc( sizeof ( hsize_t ) * dim );
+    if ( hf_ofs == NULL )
+        return RC( rcFS, rcFile, rcReading, rcMemory, rcExhausted );
+
+    for ( i = 0; i < dim; ++i )
+        hf_ofs[ i ] = ( hsize_t )pos[ i ];
+
+    rc = HDF5ArrayFileRead_v_intern ( self, dim, hf_ofs, buffer, buffer_size, num_read );
+
+    free( hf_ofs );
+
+    return rc;
+}
+
+
+static
+rc_t HDF5ArrayFileWrite_intern ( const HDF5ArrayFile *self,
+    const hsize_t *ofs, const void *buffer, const hsize_t *count )
+{
+    rc_t rc = 0;
+    herr_t status;
+
+    /* first we select a hyperslab in the source-dataspace */
+    status = H5Sselect_hyperslab( self->dataspace_handle, 
+                H5S_SELECT_SET, ofs, NULL, count, NULL );
+    if ( status < 0 )
+        rc = RC( rcFS, rcFile, rcWriting, rcTransfer, rcInvalid );
+    else
+    {
+        /* calculate how many data-elements to write total */
+        hsize_t total = HDF5ArrayCalcTotal( self->dimensionality, count );
+        if ( total < 1 )
+            rc = RC( rcFS, rcFile, rcWriting, rcParam, rcInvalid );
+        else
+        {
+            /* then we create a temp. dst-dataspace */
+            hid_t src_space = H5Screate_simple( 1, &total, NULL );
+            if ( src_space < 0 )
+                rc = RC( rcFS, rcFile, rcWriting, rcTransfer, rcInvalid );
+            else
+            {
+                status = H5Dwrite( self->dataset_handle,   /* src dataset */
+                                   self->datatype_handle,  /* discovered datatype */
+                                   src_space,              /* temp. 1D dataspace */
+                                   self->dataspace_handle, /* src dataspace */
+                                   H5P_DEFAULT,            /* default transfer property list */
+                                   buffer );               /* dst-buffer */
+                if ( status < 0 )
+                    rc = RC( rcFS, rcFile, rcWriting, rcTransfer, rcInvalid );
+                H5Sclose( src_space );
+            }
+        }
+    }
+    return rc;
+}
+
+
+/* Write
+ *  write into n-dimensional position
+ *
+ *  "dim" [ IN ] - the dimensionality of all vectors
+ *
+ *  "pos"  [ IN ] - n-dimensional offset where to write to
+ *                   in elements
+ *
+ *  "buffer" [ IN ] and "elem_count" [ IN ] - data to be written
+ *  where "elem_count" is n-dimensional in elements
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of elements actually written per dimension
+ */
+static
+rc_t CC HDF5ArrayFileWrite ( HDF5ArrayFile *self, uint8_t dim,
+    const uint64_t *pos, const void *buffer, const uint64_t *elem_count,
+    uint64_t *num_writ )
+{
+    rc_t rc;
+    hsize_t * hf_ofs;
+    hsize_t * hf_count;
+
+    if ( dim != self->dimensionality )
+        return RC( rcFS, rcFile, rcReading, rcParam, rcInvalid );
+
+    rc = HDF5ArrayMakeRdWrOfsCnt( dim, pos, elem_count, &hf_ofs, &hf_count );
+    if ( rc != 0 )
+        return rc;
+    rc = HDF5ArrayFileWrite_intern ( self, hf_ofs, buffer, hf_count );
+    if ( rc == 0 )
+    {
+        uint8_t i;
+        for ( i = 0; i < dim; ++i )
+            num_writ[ i ] = elem_count[ i ];
+    }
+    free( hf_count );
+    free( hf_ofs );
+    return rc;
+}
+
+
+
+/* GetMeta
+ *  extracts metadata into a string-vector
+ *
+ *  "key"   [ IN ]  - the key which part of the metadata to retrieve
+ *
+ *  "list"  [ OUT ] - the metadata will be filled into this list
+ *
+ */
+static
+rc_t CC HDF5ArrayFileGetMeta ( const HDF5ArrayFile *self, const char *key,
+    const KNamelist **list )
+{
+    rc_t rc;
+    hid_t attr = H5Aopen_by_name( self->dataset_handle, ".", key, H5P_DEFAULT, H5P_DEFAULT );
+    if ( attr < 0 )
+        rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+    else
+    {
+        hid_t datatype = H5Aget_type( attr );
+        if ( datatype < 0 )
+            rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+        else
+        {
+            hid_t space = H5Aget_space( attr );
+            if ( space < 0 )
+                rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+            else
+            {
+                hsize_t dims[1];
+                char ** rdata;
+                H5Sget_simple_extent_dims( space, dims, NULL );
+                rdata = ( char ** )malloc( dims[0] * sizeof( char *) );
+                if ( rdata == NULL )
+                    rc = RC( rcFS, rcFile, rcOpening, rcMemory, rcExhausted );
+                else
+                {
+                    hid_t memtype = H5Tcopy( H5T_C_S1 );
+                    if ( memtype < 0 )
+                        rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+                    else
+                    {
+                        herr_t status = H5Tset_size( memtype, H5T_VARIABLE );
+                        if ( status < 0 )
+                            rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+                        else
+                        {
+                            status = H5Aread( attr, memtype, rdata );
+                            if ( status < 0 )
+                                rc = RC( rcFS, rcFile, rcReading, rcTransfer, rcInvalid );
+                            else
+                            {
+                                VNamelist *names;
+                                rc = VNamelistMake ( &names, 5 );
+                                if ( rc == 0 )
+                                {
+                                    int i;
+                                    for ( i = 0; i < dims[0]; ++i )
+                                        VNamelistAppend ( names, rdata[i] );
+                                    rc = VNamelistToConstNamelist ( names, list );
+                                    VNamelistRelease ( names );
+                                }
+                            }
+                        }
+                        H5Dvlen_reclaim( memtype, space, H5P_DEFAULT, rdata );
+                        H5Tclose( memtype );
+                    }
+                    free( rdata );
+                }
+                H5Sclose( space );
+            }
+            H5Tclose( datatype );
+        }
+        H5Aclose( attr );
+    }
+    return rc;
+}
+
+
+static KArrayFile_vt_v1 vtHDF5ArrayFile =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* start minor version 0 methods */
+    HDF5ArrayFileDestroy,
+    HDF5ArrayFileDimensionality,
+    HDF5ArrayFileSetDimensionality,
+    HDF5ArrayFileDimExtents,
+    HDF5ArrayFileSetDimExtents,
+    HDF5ArrayFileElementSize,
+    HDF5ArrayFileRead,
+    HDF5ArrayFileWrite,
+    HDF5ArrayFileGetMeta,
+    HDF5ArrayFileRead_v
+    /* end minor version 0 methods */
+
+};
+
+
+/* not static because imported by hdf5file.c via forward decl. */
+rc_t HDF5ArrayFileMake ( struct HDF5ArrayFile **fp,
+        KFile * parent, hid_t dataset_handle,
+        bool read_enabled, bool write_enabled )
+{
+    rc_t rc;
+    HDF5ArrayFile *f;
+
+    if ( fp == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcSelf, rcNull );
+    *fp = NULL;
+
+    if ( parent == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+
+    f = malloc ( sizeof *f );
+    if ( f == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+
+    rc = KArrayFileInit ( & f -> dad, ( const KArrayFile_vt * )&vtHDF5ArrayFile, 
+                          read_enabled, write_enabled );
+    if ( rc == 0 )
+    {
+        f -> parent = parent;
+        rc = HDF5ArrayFile_open ( f, dataset_handle );
+        if ( rc == 0 )
+        {
+            * fp = f;
+            return 0;
+        }
+    }
+    free ( f );
+    return rc;
+
+}
\ No newline at end of file
diff --git a/libs/hdf5/hdf5dir.c b/libs/hdf5/hdf5dir.c
new file mode 100644
index 0000000..b459bcf
--- /dev/null
+++ b/libs/hdf5/hdf5dir.c
@@ -0,0 +1,879 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+typedef struct HDF5Dir HDF5Dir;
+#define KDIR_IMPL HDF5Dir
+
+#define H5Gopen_vers 2
+#define H5Eset_auto_vers 2
+
+#include <kfs/extern.h> /* may need to be changed */
+#include <kfs/impl.h>
+#include <hdf5.h>
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/out.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <stdarg.h>
+
+
+#if 0 /* These directives merely serve to limit portability. */
+#define _XOPEN_SOURCE 600
+#include <fcntl.h>
+#include <linux/fadvise.h>
+#include <dirent.h>
+#endif
+
+typedef struct HDF5File HDF5File;
+
+/* import of HDF5FileMake from hdf5file.c */
+rc_t CC HDF5FileMake ( HDF5File **fp, hid_t dataset_handle,
+        bool read_enabled, bool write_enabled );
+
+/* object structure */
+struct HDF5Dir
+{
+    KDirectory dad;
+
+    /* extend here */
+    KDirectory *parent;
+    hid_t hdf5_handle;
+    hid_t file_access_property_list;
+    bool h5root;
+
+    uint32_t root;
+    uint32_t size;
+    char path [ PATH_MAX ];
+};
+
+
+/* KSysDirMake
+ *  allocate an uninialized object
+ */
+static
+HDF5Dir * HDF5DirMake ( size_t path_size )
+{
+    HDF5Dir *dir = malloc ( ( sizeof * dir - sizeof dir -> path + 2 ) + path_size );
+    return dir;
+}
+
+
+/* forward decl. because the real function has to be placed after the vt */
+static
+rc_t HDF5DirInit ( HDF5Dir *self, enum RCContext ctx, uint32_t dad_root,
+    const char *path, uint32_t path_size, bool update, bool chroot );
+
+static
+uint32_t CC HDF5DirPathType ( const HDF5Dir *self,
+    const char *path, va_list args );
+
+
+/* Destroy
+ */
+static
+rc_t CC HDF5DirDestroy ( HDF5Dir *self )
+{
+    KDirectoryRelease ( ( KDirectory* ) self -> parent );
+    if ( self->h5root )
+    {
+        H5Fclose( self->hdf5_handle );
+        H5Pclose( self->file_access_property_list );
+    }
+    else
+        H5Oclose( self->hdf5_handle );
+    free( self );
+    return 0;
+}
+
+
+/* callback context to be passed to the hdf5-callback-function */
+struct dir_list_cb_ctx
+{
+    VNamelist *groups;
+    const HDF5Dir *dir;
+    bool ( CC * f ) ( const KDirectory *dir, const char *name, void *data );
+    void * data;
+};
+
+
+/* callback function to be passed into "H5Literate" */
+static
+herr_t dir_list_cb( hid_t loc_id, const char * name,
+                    const H5L_info_t * linfo, void * data )
+{
+    struct dir_list_cb_ctx * ctx = ( struct dir_list_cb_ctx * )data;
+
+    /* avoid compiler warnings */
+    loc_id = loc_id;
+    linfo = linfo;
+
+    if ( ctx != NULL && ctx->groups != NULL )
+    {
+        if ( ctx->f != NULL )
+        {
+            if ( ctx->f( &(ctx->dir->dad), name, ctx->data ) )
+                VNamelistAppend ( ctx->groups, name );
+        }
+        else
+            VNamelistAppend ( ctx->groups, name );
+    }
+    return 0;
+}
+
+/* List
+ *  create a directory listing
+ *
+ *  "list" [ OUT ] - return parameter for list object
+ *
+ *  "f" [ IN, NULL OKAY ] and "data" [ IN, OPAQUE ] - optional
+ *  filter function to execute on each path. receives a base directory
+ *  and relative path for each entry. if "f" returns true, the name will
+ *  be added to the list.
+ *
+ *  "path" [ IN, NULL OKAY ] - optional parameter for target
+ *  directory. if NULL, interpreted to mean "."
+ */
+static
+rc_t CC HDF5DirList ( const HDF5Dir *self, struct KNamelist **list,
+    bool ( CC * f ) ( const KDirectory *dir, const char *name, void *data ),
+    void *data, const char *path, va_list args )
+{
+    rc_t rc;
+    if ( path[0] == '.' && path[1] == 0 )
+    {
+        struct dir_list_cb_ctx ctx;
+        rc = VNamelistMake ( &ctx.groups, 5 );
+        if ( rc == 0 )
+        {
+            ctx.dir = self;
+            ctx.f = f;
+            ctx.data = data;
+            H5Literate( self->hdf5_handle, H5_INDEX_NAME, H5_ITER_INC,
+                        NULL, dir_list_cb, &ctx );
+            rc = VNamelistToNamelist ( ctx.groups, list );
+            VNamelistRelease ( ctx.groups );
+        }
+    }
+    else
+    {
+        const KDirectory *sub;
+        rc = KDirectoryVOpenDirRead ( &self->dad, &sub, false, path, args );
+        if ( rc == 0 )
+        {
+            rc = KDirectoryList( sub, list, f, data, "." );
+            KDirectoryRelease( sub );
+        }
+    }
+    return rc;
+}
+
+
+static
+rc_t HDF5DirVisitcb( const HDF5Dir *self,
+    rc_t ( CC * f ) ( const KDirectory *dir, uint32_t type, const char *name, void *data ),
+    const uint32_t type, const char * name, void * data )
+{
+    int status;
+    char buffer[ PATH_MAX ];
+
+    if ( self->h5root )
+        status = snprintf ( buffer, sizeof buffer, "/%s", name );
+    else
+        status = snprintf ( buffer, sizeof buffer, "/%s%s", self->path, name );
+
+    if ( status < 0 || ( size_t ) status >= sizeof buffer )
+        return RC ( rcFS, rcDirectory, rcVisiting, rcPath, rcExcessive );
+    
+    return f( &self->dad, type, buffer, data );
+}
+
+/* Visit
+ *  visit each path under designated directory,
+ *  recursively if so indicated
+ *
+ *  "recurse" [ IN ] - if true, recursively visit sub-directories
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to execute
+ *  on each path. receives a base directory and relative path
+ *  for each entry. if "f" returns true, the iteration will
+ *  terminate and that value will be returned. NB - "dir" will not
+ *  be the same as "self".
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ *
+ * VisitFull hits all files types that including those are normally hidden
+ */
+static
+rc_t CC HDF5DirVisit ( const HDF5Dir *self, bool recurse,
+    rc_t ( CC * f ) ( const KDirectory *dir, uint32_t type, const char *name, void *data ),
+    void *data, const char *path, va_list args )
+{
+    KNamelist *objects;
+    rc_t rc = HDF5DirList ( self, &objects, NULL, NULL, path, args );
+    if ( rc == 0 )
+    {
+        uint32_t idx, count;
+        rc = KNamelistCount ( objects, &count );
+        for ( idx = 0; idx < count && rc == 0; ++idx )
+        {
+            const char * name;
+            rc = KNamelistGet ( objects, idx, &name );
+            if ( rc == 0 )
+            {
+                uint32_t type = KDirectoryPathType ( &self->dad, "%s", name );
+                switch ( type )
+                {
+                case kptDataset  :
+                case kptDatatype :
+                case kptDir :
+                    rc = HDF5DirVisitcb( self, f, type, name, data );
+                    break;
+                }
+                if ( recurse && type == kptDir )
+                {
+                    const KDirectory *sub;
+                    rc = KDirectoryOpenDirRead ( &self->dad, &sub, false, "%s", name );
+                    if ( rc == 0 )
+                    {
+                        KDirectoryVisit( sub, true, f, "%s", data );
+                        KDirectoryRelease( sub );
+                    }
+                }
+            }
+        }
+        KNamelistRelease( objects );
+    }
+    return rc;
+}
+
+
+/* VisitUpdate
+ *  like Visit except that the directory passed back to "f"
+ *  is available for update operations
+ */
+static
+rc_t CC HDF5DirVisitUpdate ( HDF5Dir *self, bool recurse,
+    rc_t ( CC * f ) ( KDirectory *dir, uint32_t type, const char *name, void *data ),
+    void *data, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+
+static uint32_t HDF5DirPathTypeOnBuffer( const HDF5Dir *self, const char *buffer )
+{
+    H5O_info_t obj_info;
+    herr_t h5e = H5Oget_info_by_name( self->hdf5_handle, buffer, &obj_info, H5P_DEFAULT );
+    if ( h5e >= 0 )
+    {
+        switch( obj_info.type )
+        {
+        case H5O_TYPE_GROUP : return kptDir; break;
+        case H5O_TYPE_DATASET : return kptDataset; break;
+        case H5O_TYPE_NAMED_DATATYPE : return kptDatatype; break;
+        default : return kptBadPath; break;
+        }
+    }
+    else
+        return kptBadPath;
+}
+
+/* PathType
+ *  returns a KPathType
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+static uint32_t CC HDF5DirPathType ( const HDF5Dir *self, const char *path, va_list args )
+{
+    char buffer[ PATH_MAX ];
+    rc_t rc = string_vprintf ( buffer, sizeof buffer, NULL, path, args );
+    if ( rc != 0 )
+        return kptBadPath;
+
+    return HDF5DirPathTypeOnBuffer( self, buffer );
+}
+
+/* ResolvePath
+ *  resolves path to an absolute or directory-relative path
+ *
+ *  "absolute" [ IN ] - if true, always give a path starting
+ *  with '/'. NB - if the directory is chroot'd, the absolute path
+ *  will still be relative to directory root.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *  the resolved path will be directory relative
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target path. NB - need not exist.
+ */
+static
+rc_t CC HDF5DirResolvePath ( const HDF5Dir *self, bool absolute,
+    char *resolved, size_t rsize, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* ResolveAlias
+ *  resolves an alias path to its immediate target
+ *  NB - the resolved path may be yet another alias
+ *
+ *  "absolute" [ IN ] - if true, always give a path starting
+ *  with '/'. NB - if the directory is chroot'd, the absolute path
+ *  will still be relative to directory root.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *  the resolved path will be directory relative
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting an object presumed to be an alias.
+ */
+static
+rc_t CC HDF5DirResolveAlias ( const HDF5Dir *self, bool absolute,
+    char *resolved, size_t rsize, const char *alias, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* Rename
+ *  rename an object accessible from directory, replacing
+ *  any existing target object of the same type
+ *
+ *  "from" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ *
+ *  "to" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ *
+ *  "force" [ IN ] - not false means try to do more if it fails internally
+ */
+static
+rc_t CC HDF5DirRename ( HDF5Dir *self, bool force, const char *from, const char *to )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* Remove
+ *  remove an accessible object from its directory
+ *
+ *  "force" [ IN ] - if true and target is a directory,
+ *  remove recursively
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+static
+rc_t CC HDF5DirRemove ( HDF5Dir *self, bool force,
+    const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* ClearDir
+ *  remove all directory contents
+ *
+ *  "force" [ IN ] - if true and directory entry is a
+ *  sub-directory, remove recursively
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+static
+rc_t CC HDF5DirClearDir ( HDF5Dir *self, bool force,
+    const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+
+static
+rc_t HDF5DirVAccess ( const HDF5Dir *self,
+    uint32_t *access, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+
+/* SetAccess
+ *  set access to object a la Unix "chmod"
+ *
+ *  "recurse" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ *
+ *  "access" [ IN ] and "mask" [ IN ] - definition of change
+ *  where "access" contains new bit values and "mask defines
+ *  which bits should be changed.
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+static
+rc_t CC HDF5DirSetAccess ( HDF5Dir *self, bool recurse,
+    uint32_t access, uint32_t mask, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+
+static
+rc_t HDF5DirVDate ( const HDF5Dir *self,
+    KTime_t * date, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+
+static
+rc_t HDF5DirVSetDate ( HDF5Dir * self, bool recurse,
+    KTime_t date, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+
+static
+struct KSysDir * HDF5DirGetSysdir ( const HDF5Dir *cself )
+{
+    return NULL;
+}
+
+
+/* CreateAlias
+ *  creates a path alias according to create mode
+ *
+ *  "access" [ IN ] - standard Unix directory access mode
+ *  used when "mode" has kcmParents set and alias path does
+ *  not exist.
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "targ" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target alias
+ */
+static
+rc_t CC HDF5DirCreateAlias ( HDF5Dir *self,
+    uint32_t access, KCreateMode mode,
+    const char *targ, const char *alias )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* OpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+static
+rc_t CC HDF5DirOpenFileRead ( const HDF5Dir *self,
+    struct KFile const **f, const char *path, va_list args )
+{
+    char buffer[ PATH_MAX ];
+    uint32_t path_type;
+    size_t psize;
+    hid_t dataset_handle;
+    rc_t rc;
+    HDF5File *f5p;
+
+    *f = NULL;
+
+    rc = string_vprintf ( buffer, sizeof buffer, &psize, path, args );
+    if ( rc != 0 )
+        return rc;
+
+    path_type = HDF5DirPathTypeOnBuffer( self, buffer );
+    if ( path_type != kptDataset )
+        return RC( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+
+    dataset_handle = H5Dopen2( self->hdf5_handle, buffer, H5P_DEFAULT );
+    if ( dataset_handle < 0 )
+        return RC( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+
+    rc = HDF5FileMake ( &f5p, dataset_handle, true, false );
+    if ( rc == 0 )
+        *f = ( struct KFile const * )f5p;
+
+    return rc;
+}
+
+/* OpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+static
+rc_t CC HDF5DirOpenFileWrite ( HDF5Dir *self,
+    struct KFile **f, bool update, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* CreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+static
+rc_t CC HDF5DirCreateFile ( HDF5Dir *self, struct KFile **f,
+    bool update, uint32_t access, KCreateMode mode, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* FileSize
+ *  returns size in bytes of target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+static
+rc_t CC HDF5DirFileSize ( const HDF5Dir *self,
+    uint64_t *size, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* FilePhysicalSize
+ *  returns physical allocated size in bytes of target file.  It might
+ * or might not differ form FileSize
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+static
+rc_t CC HDF5DirFilePhysicalSize ( const HDF5Dir *self,
+    uint64_t *size, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* SetFileSize
+ *  sets size in bytes of target file
+ *
+ *  "size" [ IN ] - new file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+static
+rc_t CC HDF5DirSetFileSize ( HDF5Dir *self,
+    uint64_t size, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* FileLocator
+ *  returns a 64-bit key pretinent only to the particular file
+ *  system device holding tha file.
+ *
+ *  It can be used as a form of sort key except that it is not 
+ *  guaranteed to be unique.
+ *
+ *  "locator" [ OUT ] - return parameter for file locator
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+static
+rc_t CC HDF5DirFileLocator ( const HDF5Dir *self,
+    uint64_t *locator, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* FileContiguous
+ *  returns size in bytes of target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+static
+rc_t CC HDF5DirFileContiguous ( const HDF5Dir *self,
+    bool *contiguous, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* OpenDirRead
+ * OpenDirUpdate
+ *  opens a sub-directory
+ *
+ *  "chroot" [ IN ] - if true, the new directory becomes
+ *  chroot'd and will interpret paths beginning with '/'
+ *  relative to itself.
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+static
+rc_t CC HDF5DirOpenDirRead ( const HDF5Dir *self,
+    const KDirectory **sub, bool chroot, const char *path, va_list args )
+{
+    rc_t rc;
+    char buffer[ PATH_MAX ];
+    size_t buffer_size;
+    uint32_t type;
+    HDF5Dir * new_dir;
+
+    *sub = NULL;
+
+    rc = string_vprintf ( buffer, sizeof buffer, &buffer_size, path, args );
+    if ( rc != 0 )
+        return rc;
+
+    type = HDF5DirPathTypeOnBuffer( self, buffer );
+    switch( type )
+    {
+    case kptNotFound :
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcNotFound );
+    case kptBadPath :
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcInvalid );
+    case kptDir : break;
+    default :
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcIncorrect );
+    }
+
+    new_dir = HDF5DirMake ( buffer_size );
+    if ( new_dir == NULL )
+        return RC ( rcFS, rcDirectory, rcOpening, rcMemory, rcExhausted );
+
+                    /* self, RCContext, dad_root, path, path_size, update, chroot */
+    rc = HDF5DirInit ( new_dir, rcOpening, 0, buffer, buffer_size, false, false );
+    if ( rc == 0 )
+    {
+        new_dir -> hdf5_handle = H5Gopen( self -> hdf5_handle, buffer, H5P_DEFAULT );
+        if ( new_dir -> hdf5_handle >= 0 )
+        {
+            new_dir -> parent = (KDirectory *)&self->dad;
+            new_dir -> h5root = false;
+            KDirectoryAddRef ( &self->dad );
+            * sub = & new_dir -> dad;
+            return 0;
+        }
+        else
+            rc = RC( rcFS, rcDirectory, rcOpening, rcItem, rcInvalid );
+    }
+    free( new_dir );
+    return rc;
+}
+
+static
+rc_t CC HDF5DirOpenDirUpdate ( HDF5Dir *self,
+    KDirectory **sub, bool chroot, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+/* CreateDir
+ *  create a sub-directory
+ *
+ *  "access" [ IN ] - standard Unix directory mode, e.g.0775
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+static
+rc_t CC HDF5DirCreateDir ( HDF5Dir *self,
+    uint32_t access, KCreateMode mode, const char *path, va_list args )
+{
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcUnsupported );
+}
+
+
+/* vtable & factory */
+static struct KDirectory_vt_v1 HDF5Dir_vt =
+{
+    /* interface version */
+    1, 3,
+
+    HDF5DirDestroy,
+    HDF5DirList,
+    HDF5DirVisit,
+    HDF5DirVisitUpdate,
+    HDF5DirPathType,
+    HDF5DirResolvePath,
+    HDF5DirResolveAlias,
+    HDF5DirRename,
+    HDF5DirRemove,
+    HDF5DirClearDir,
+    HDF5DirVAccess,
+    HDF5DirSetAccess,
+    HDF5DirCreateAlias,
+    HDF5DirOpenFileRead,
+    HDF5DirOpenFileWrite,
+    HDF5DirCreateFile,
+    HDF5DirFileSize,
+    HDF5DirSetFileSize,
+    HDF5DirOpenDirRead,
+    HDF5DirOpenDirUpdate,
+    HDF5DirCreateDir,
+    NULL, /* we don't track files*/
+    /* end minor version 0 methods*/
+
+    /* start minor version 1 methods*/
+    HDF5DirVDate,
+    HDF5DirVSetDate,
+    HDF5DirGetSysdir,
+    /* end minor version 1 methods*/
+
+    /* start minor version 2 methods */
+    HDF5DirFileLocator,
+    HDF5DirFilePhysicalSize,
+    HDF5DirFileContiguous,
+    /* end minor version 2 methods */
+
+    /* start minor version 3 methods */
+    /*
+    HDF5DirOpenDatasetRead,
+    HDF5DirOpenDatasetUpdate
+    */
+};
+
+
+static
+rc_t HDF5DirInit ( HDF5Dir *self, enum RCContext ctx, uint32_t dad_root,
+    const char *path, uint32_t path_size, bool update, bool chroot )
+{
+    rc_t rc = KDirectoryInit ( & self -> dad, ( const KDirectory_vt* ) & HDF5Dir_vt,
+                          "HDF5Dir", path ? path : "(null)", update );
+    if ( rc != 0 )
+        return ResetRCContext ( rc, rcFS, rcDirectory, ctx );
+
+    if ( path != NULL )
+        memmove ( self -> path, path, path_size );
+    self -> root = chroot ? path_size : dad_root;
+    self -> size = path_size + 1;
+    self -> path [ path_size ] = '/';
+    self -> path [ path_size + 1 ] = 0;
+
+    return 0;
+}
+
+
+/* MakeHDF5RootDir
+    - takes a KDirectory and a path
+    - if the path points to a hdf5-file, the object will be created
+ */
+LIB_EXPORT rc_t CC MakeHDF5RootDir ( KDirectory * self, KDirectory ** hdf5_dir,
+                                     bool absolute, const char *path )
+{
+    rc_t rc;
+    char resolved[ PATH_MAX ];
+    uint32_t path_type;
+    HDF5Dir * new_dir;
+    size_t path_size;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcConstructing, rcSelf, rcNull );
+    if ( hdf5_dir == NULL )
+        return RC ( rcFS, rcDirectory, rcConstructing, rcParam, rcNull );
+    * hdf5_dir = NULL;
+
+    rc = KDirectoryResolvePath ( self, absolute, resolved, sizeof resolved, "%s", path );
+    if ( rc != 0 ) return rc;
+    path_size = string_size( resolved );
+
+    path_type = ( KDirectoryPathType ( self, "%s", resolved ) & ~ kptAlias );
+    switch ( path_type )
+    {
+    case kptNotFound :
+        return RC ( rcFS, rcDirectory, rcConstructing, rcPath, rcNotFound );
+    case kptBadPath :
+        return RC ( rcFS, rcDirectory, rcConstructing, rcPath, rcInvalid );
+    case kptFile : break;
+    default :
+        return RC ( rcFS, rcDirectory, rcConstructing, rcPath, rcIncorrect );
+    }
+
+    /* mute the error stack */
+    H5Eset_auto( H5E_DEFAULT, NULL, NULL );
+
+    new_dir = HDF5DirMake ( path_size );
+    if ( new_dir == NULL )
+        return RC ( rcFS, rcDirectory, rcConstructing, rcMemory, rcExhausted );
+
+                     /* self, RCContext, dad_root, path, path_size, update, chroot */
+    rc = HDF5DirInit ( new_dir, rcAccessing, 0, resolved, path_size, false, false );
+    if ( rc == 0 )
+    {
+        /* create a access-property list for file-access */
+        new_dir -> file_access_property_list = H5Pcreate( H5P_FILE_ACCESS );
+        /* set the property-list to use the stdio (buffered) VFL-driver */
+        H5Pset_fapl_stdio ( new_dir -> file_access_property_list );
+        /* open the hdf5-file using the given property-list */
+        new_dir -> hdf5_handle = H5Fopen( resolved, 
+                                          H5F_ACC_RDONLY, 
+                                          new_dir -> file_access_property_list /*H5P_DEFAULT*/ );
+        if ( new_dir -> hdf5_handle >= 0 )
+        {
+            new_dir -> parent = self;
+            new_dir -> h5root = true;
+            * hdf5_dir = & new_dir -> dad;
+            KDirectoryAddRef ( & new_dir -> dad );
+            return 0;
+        }
+        else
+            rc = RC( rcFS, rcDirectory, rcConstructing, rcItem, rcInvalid );
+    }
+    free( new_dir );
+    return rc;
+}
diff --git a/libs/hdf5/hdf5file.c b/libs/hdf5/hdf5file.c
new file mode 100644
index 0000000..f64f62a
--- /dev/null
+++ b/libs/hdf5/hdf5file.c
@@ -0,0 +1,383 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+typedef struct HDF5File HDF5File;
+#define KFILE_IMPL HDF5File
+
+#include <kfs/extern.h> /* may need to be changed */
+#include "hdf5arrayfile-priv.h"
+
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <klib/text.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+/* object structure */
+struct HDF5File
+{
+    KFile dad;
+
+    /* it maintains a inner HDF5ArrayFile */
+    struct HDF5ArrayFile * array_file;
+};
+
+typedef struct KSysFile KSysFile;
+
+/* import of HDF5ArrayFileMake from hdf5arrayfile.c */
+rc_t HDF5ArrayFileMake ( struct HDF5ArrayFile **fp,
+        KFile *parent, hid_t dataset_handle,
+        bool read_enabled, bool write_enabled );
+
+
+/* Destroy
+ */
+static
+rc_t CC HDF5FileDestroy ( HDF5File *self )
+{
+    /* release the ref-counted inner array-file */
+    rc_t rc = KArrayFileRelease( & self -> array_file->dad );
+    free ( self );
+    return rc;
+}
+
+
+/* GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ */
+static
+struct KSysFile * CC HDF5FileGetSysFile ( const HDF5File *self, uint64_t *offset )
+{
+    return NULL;
+}
+
+
+/* RandomAccess
+ *  ALMOST by definition, the file is random access
+ *  certain file types ( notably compressors ) will refuse random access
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t CC HDF5FileRandomAccess ( const HDF5File *self )
+{
+    return 0;
+}
+
+
+/* Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC HDF5FileSize ( const HDF5File *self, uint64_t *size )
+{
+    *size = self->array_file->total_bytes;
+    return 0;
+}
+
+
+/* SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC HDF5FileSetSize ( HDF5File *self, uint64_t size )
+{
+    return RC ( rcFS, rcFile, rcAccessing, rcInterface, rcUnsupported );
+}
+
+
+static
+rc_t CC HDF5FileCalcTotalBytes( const HDF5File *self, const uint8_t dim,
+                                uint64_t * total_elements )
+{
+    rc_t rc;
+    uint64_t * extents;
+
+    *total_elements = 0;
+    extents = malloc( dim * sizeof ( *extents ) );
+    if ( extents == NULL )
+        return RC ( rcFS, rcFile, rcAccessing, rcMemory, rcExhausted );
+    rc = KArrayFileDimExtents ( &( self->array_file->dad ), dim, extents );
+    if ( rc == 0 )
+    {
+        uint8_t i;
+        *total_elements = extents[ 0 ];
+        for ( i = 1; i < dim; ++i )
+            *total_elements *= extents[ i ];
+    }
+    free( extents );
+    return rc;
+}
+
+
+static
+rc_t CC HDF5FileReadDim1( const HDF5File *self, uint64_t elem_size, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    uint64_t af_offset, af_count, af_read;
+    rc_t rc;
+
+    af_offset = ( pos / elem_size );
+    af_count = ( bsize / elem_size );
+    if ( ( af_count % elem_size ) > 0 )
+        af_count++;
+    if ( ( af_count * elem_size ) > bsize )
+        return RC ( rcFS, rcFile, rcReading, rcOffset, rcInvalid );
+
+    rc = KArrayFileRead ( &( self->array_file->dad ), 1,
+                          &af_offset, buffer, &af_count, &af_read );
+    if ( rc != 0 ) return rc;
+    *num_read = ( af_read * elem_size );
+    return 0;
+}
+
+
+static
+bool zero_in_array( uint8_t dim, uint64_t *a )
+{
+    bool res = false;
+    uint8_t i;
+    for ( i = 0; i < dim && res == false; ++i )
+        if ( a[ i ] == 0 )
+            res = true;
+    return res;
+}
+
+/* translates a flat position into a multi-dim coordinate */
+static
+void pos_2_coord( uint8_t dim, uint64_t *extents, 
+                  uint64_t pos, uint64_t *coord )
+{
+    int8_t i;
+    for ( i = dim - 1; i >= 0; --i )
+    {
+        uint64_t ext = extents[ i ];
+        coord[ i ] = pos % ext;
+        pos /= ext;
+    }
+}
+
+
+static
+rc_t CC HDF5FileReadOneElement( const HDF5File *self, uint8_t dim, uint64_t elem_size,
+    uint64_t pos, void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+    uint64_t * extents;
+    uint64_t * coord;
+    uint64_t * elem_count;
+    uint64_t * elem_read;
+    uint8_t i;
+
+    *num_read = 0;
+    extents = malloc( dim * 4 * sizeof ( *extents ) );
+    if ( extents == NULL )
+        return RC ( rcFS, rcFile, rcAccessing, rcMemory, rcExhausted );
+    coord      = ( extents + dim );
+    elem_count = ( coord + dim );
+    elem_read  = ( elem_count + dim );
+
+    rc = KArrayFileDimExtents ( &( self->array_file->dad ), dim, extents );
+    if ( rc != 0 )
+    {
+        free( extents );
+        return rc;
+    }
+    if ( zero_in_array( dim, extents ) )
+    {
+        free( extents );
+        return RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+    }
+
+    pos /= elem_size;
+    pos_2_coord( dim, extents, pos, coord );
+    for ( i = 0; i < dim; ++i )
+        elem_count[ i ] = 1;
+    rc = KArrayFileRead ( &( self->array_file->dad ), dim,
+                          coord, buffer, elem_count, elem_read );
+    if ( rc == 0 )
+        *num_read = elem_size;
+    free( extents );
+    return rc;
+}
+
+
+/* Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t CC HDF5FileRead ( const HDF5File *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+    uint64_t elem_size, total_elements;
+    uint8_t dim;
+
+    *num_read = 0;
+    rc = KArrayFileElementSize ( &( self->array_file->dad ), &elem_size );
+    if ( rc != 0 ) return rc;
+    elem_size >>= 3; /* KArrayFileElementSize() returns value in bits */
+
+    rc = KArrayFileDimensionality ( &( self->array_file->dad ), &dim );
+    if ( rc != 0 ) return rc;
+
+    rc = HDF5FileCalcTotalBytes( self, dim, &total_elements );
+    if ( rc != 0 ) return rc;
+
+    /* dont read behind the end of the data */
+    if ( pos >= ( total_elements * elem_size ) )
+        return RC ( rcFS, rcFile, rcReading, rcOffset, rcInvalid );
+    /* read only at offsets that are multiples of the datatype_size */
+    if ( ( pos % elem_size ) != 0 )
+        return RC ( rcFS, rcFile, rcReading, rcOffset, rcInvalid );
+
+    if ( dim == 1 )
+        rc = HDF5FileReadDim1( self, elem_size, pos, buffer, bsize, num_read );
+    else
+        rc = HDF5FileReadOneElement( self, dim, elem_size, pos, buffer, bsize, num_read );
+
+    return rc;
+}
+
+
+/* Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+static
+rc_t CC HDF5FileWrite ( HDF5File *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ)
+{
+    return RC ( rcFS, rcFile, rcAccessing, rcInterface, rcUnsupported );
+}
+
+
+/* Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC HDF5FileType ( const HDF5File *self )
+{
+    return RC ( rcFS, rcFile, rcAccessing, rcInterface, rcUnsupported );
+}
+
+
+static KFile_vt_v1 vtHDF5File =
+{
+    /* version 1.1 */
+    1, 1,
+
+    /* start minor version 0 methods */
+    HDF5FileDestroy,
+    HDF5FileGetSysFile,
+    HDF5FileRandomAccess,
+    HDF5FileSize,
+    HDF5FileSetSize,
+    HDF5FileRead,
+    HDF5FileWrite,
+    /* end minor version 0 methods */
+
+    /* start minor version == 1 */
+    HDF5FileType
+    /* end minor version == 1 */
+};
+
+
+/* not static because imported by hdf5file.c via forward decl. */
+rc_t HDF5FileMake ( HDF5File **fp, hid_t dataset_handle,
+        bool read_enabled, bool write_enabled )
+{
+    rc_t rc;
+    HDF5File *f;
+
+    if ( dataset_handle < 0 )
+        return RC ( rcFS, rcFile, rcConstructing, rcFileDesc, rcInvalid );
+
+    f = malloc ( sizeof *f );
+    if ( f == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+
+    rc = KFileInit ( & f -> dad, ( const KFile_vt* ) &vtHDF5File,
+                         "HDF5File", "no-name", read_enabled, write_enabled );
+    if ( rc == 0 )
+    {
+        /* make the inner Arrayfile...*/
+        rc = HDF5ArrayFileMake ( & f -> array_file, & f -> dad, dataset_handle,
+                             read_enabled, write_enabled );
+        if ( rc == 0 )
+        {
+            * fp = f;
+            return 0;
+        }
+        KArrayFileRelease( & f -> array_file -> dad );
+    }
+    free ( f );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC MakeHDF5ArrayFile ( const KFile * self, KArrayFile ** f )
+{
+    HDF5File * hdf5_self;
+
+    if ( f == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    *f = NULL;
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcSelf, rcNull );
+    /* check if the addr of the vt is the one in this file
+       if not - then self is not of the type HDF5File */
+    if ( self->vt != ( const KFile_vt* )&vtHDF5File )
+        return RC ( rcFS, rcFile, rcConstructing, rcParam, rcInvalid );
+    hdf5_self = ( HDF5File * )self;
+    *f = ( KArrayFile * ) hdf5_self -> array_file;
+    return KArrayFileAddRef ( *f );
+}
diff --git a/libs/kapp/Makefile b/libs/kapp/Makefile
new file mode 100644
index 0000000..f0fa2bb
--- /dev/null
+++ b/libs/kapp/Makefile
@@ -0,0 +1,152 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/kapp
+
+include $(TOP)/build/Makefile.env
+
+INT_LIBS = \
+	libkapp \
+	libkapp-norsrc \
+    libload
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(KAPP_OBJ) \
+	$(KAPPR_OBJ) \
+	$(LOADLIB_OBJ)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# OS specific application support
+#
+$(ILIBDIR)/libkapp: $(addprefix $(ILIBDIR)/libkapp.,$(LIBX))
+
+KAPP_CMN = \
+	args \
+	args-conv \
+	args-conv-os \
+	tokenizer \
+	sysmain \
+	ram \
+	log-xml
+
+KAPP_SRC = \
+	main \
+	$(KAPP_CMN)
+
+KAPP_OBJ = \
+	$(addsuffix .$(OBJX),$(KAPP_SRC))
+
+KAPP_LIB = \
+	-dvfs \
+	-dklib
+
+$(ILIBDIR)/libkapp.$(LIBX): $(KAPP_OBJ)
+	$(LD) --slib -o $@ $^ $(KAPP_LIB)
+
+
+#-------------------------------------------------------------------------------
+# KMane without KRsrc support
+#
+$(ILIBDIR)/libkapp-norsrc: $(addprefix $(ILIBDIR)/libkapp-norsrc.,$(LIBX))
+
+KAPPR_SRC = \
+	main-norsrc \
+	$(KAPP_CMN)
+
+main-norsrc.$(OBJX): main.c
+	$(CC) -o $@ $(OPT) -DNO_KRSRC=1 $< $(LOC_INFO) -D__file_ext__=c
+
+KAPPR_OBJ = \
+	$(addsuffix .$(OBJX),$(KAPPR_SRC))
+
+KAPPR_LIB = \
+
+$(ILIBDIR)/libkapp-norsrc.$(LIBX): $(KAPPR_OBJ)
+	$(LD) --slib -o $@ $^ $(KAPPR_LIB)
+
+
+#-------------------------------------------------------------------------------
+# loaders common libarary
+#
+$(ILIBDIR)/libload: $(addprefix $(ILIBDIR)/libload.,$(LIBX))
+
+LOADLIB_SRC = \
+	progressbar \
+	loader-file \
+	loader-meta
+
+ifneq (win,$(OS))
+	LOADLIB_SRC += queue-file
+endif
+
+LOADLIB_OBJ = \
+	$(addsuffix .$(LOBX),$(LOADLIB_SRC))
+
+LOADLIB_LIB = \
+	-dkfs \
+	-dklib
+
+ifneq (win,$(OS))
+	LOADLIB_LIB += -dkq
+endif
+
+$(ILIBDIR)/libload.$(LIBX): $(LOADLIB_OBJ)
+	$(LD) --slib -o $@ $^ $(LOADLIB_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/kapp/args-conv.c b/libs/kapp/args-conv.c
new file mode 100644
index 0000000..14d0f87
--- /dev/null
+++ b/libs/kapp/args-conv.c
@@ -0,0 +1,43 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <kapp/args-conv.h>
+
+#include <string.h>
+
+rc_t ArgsConvDefault(const Args * args, uint32_t arg_index, const char * arg, size_t arg_len, void ** result, WhackParamFnP * whack)
+{
+    char * res = (char *)malloc(arg_len + 1);
+    if (!result)
+        return RC(rcRuntime, rcArgv, rcConstructing, rcMemory, rcExhausted);
+    
+    memmove(res, arg, arg_len);
+    res[arg_len] = 0;
+    
+    *result = res;
+    return 0;
+}
diff --git a/libs/kapp/args.c b/libs/kapp/args.c
new file mode 100644
index 0000000..4ad4d98
--- /dev/null
+++ b/libs/kapp/args.c
@@ -0,0 +1,2390 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kapp/extern.h>
+#include <sysalloc.h>
+
+#include <klib/container.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/report.h>
+#include <klib/sra-release-version.h> /* SraReleaseVersionGet */
+#include <klib/status.h>
+#include <klib/text.h>
+#include <klib/vector.h>
+
+#include <kfg/config.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <kapp/args-conv.h>
+
+#include "args_debug.h"
+
+#include <assert.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#define USE_INLINING   0
+#ifndef USE_OPTFILE
+#define USE_OPTFILE    0
+#endif
+#define USE_EARLY_HELP 1
+#define USE_EARLY_VERSION 1
+
+/* many tools acquired some usage for '-q'
+   other than the standard meaning of "be quiet".
+   while we phase this out, allow these tools
+   to replace the default usage. */
+#define HONOR_LEGACY_Q_ALIAS 1
+#if HONOR_LEGACY_Q_ALIAS
+#define LEGACY_Q_ALIAS_DEPRECATED 1
+#define LEGACY_Q_ALIAS_ERROR      0
+#endif
+
+bool CC is_valid_name (const char * string)
+{
+    /* we do not allow leading - or empty names */
+    if ((*string == '\0') || (*string == '-'))
+        return false;
+    /* we do not allow ASCII control or ASCII space
+     * but we do not disallow punctuation.  Use at your own risk */
+    for ( ; *string != '\0'; ++string)
+        if (isspace (*string) || iscntrl (*string))
+            return false;
+    return true;
+}
+
+
+/* ==========
+ * ParamValue
+ *   the value for an option is a NUL terminated ASCII / UTF-8 string
+ */
+typedef void * ParamValueP;
+
+typedef struct ParamValueContainer {
+    uint32_t        param_index;
+    ParamValueP     param_value;
+    ConvertParamFnP convert_fn;
+    WhackParamFnP   whack;
+} ParamValueContainer;
+
+/*
+ * Whack
+ *   undo the Make.  That is free the memory
+ */
+static
+void CC ParamValueNotConvWhack (void * self)
+{
+    assert (self); /* not an absolute requirement but if NULL we got programming error */
+    
+    free (self);
+}
+
+static
+void CC ParamValueVectorWhack (void * self, void * ignored)
+{
+    ParamValueContainer * p_container;
+    assert (self);
+    
+    p_container = (ParamValueContainer *)self;
+    if (p_container->whack)
+        p_container->whack(p_container->param_value);
+    
+    free (self);
+}
+
+/*
+ * Make
+ *   allocated memory for a ASCII/UTF-8 string including one extra for NUL
+ *   the value passed in must be a NUL termintaed string as well
+ */
+static
+rc_t CC ParamValueMake (ParamValueContainer * p_container, uint32_t arg_index, const char * value, size_t value_size, ConvertParamFnP convert_fn)
+{
+    size_t alloc_size;
+    
+    assert (p_container);
+    assert (value);
+    
+    if (value_size == 0)
+        return RC ( rcExe, rcArgv, rcConstructing, rcParam, rcEmpty );
+
+    p_container->param_index = arg_index;
+    p_container->whack = ParamValueNotConvWhack;
+    p_container->convert_fn = convert_fn;
+    
+    alloc_size = value_size + 1;
+    p_container->param_value = malloc (alloc_size);
+
+    if (p_container->param_value == NULL)
+    {
+        fprintf (stderr, "Error allocating memory for option parameter %s\n",
+                 value);
+        return RC (rcExe, rcArgv, rcConstructing, rcMemory, rcExhausted);
+    }
+
+    string_copy (p_container->param_value, alloc_size, value, value_size);
+    return 0;
+}
+
+/* ==========
+ * Option
+ *  this is the primary node ofr an option
+ *  It contains the name of the long option that is also the key to pulling
+ *  out values.  The storage of these nodes is in a BSTree.
+ */
+typedef struct Option
+{
+    BSTNode     n;              /* BSTree node storage */
+
+    size_t      size;           /* name length (size if UTF-8) */
+    Vector      values;         /* Vector of set values */
+    uint32_t    count;          /* count of times option seen on the command line */
+    uint32_t    max_count;      /* if non-zero, how many times is it legal to be seen */
+    bool        needs_value;    /* does this option take/require a value? */
+    bool        required;       
+    bool        deprecated;     /* a warning if used */
+    bool        error;          /* an error if used */
+    ConvertParamFnP  convert_fn;
+    char        name [1];       /* key value The 1 will be the NUL */
+} Option;
+
+static
+rc_t CC OptionMake (Option ** pself, const char * name, size_t size, uint32_t max_count, bool needs_value, bool required, ConvertParamFnP convert_fn)
+{
+    Option *   self;
+    rc_t rc;
+
+    assert (pself);
+    assert (name);
+    assert ((needs_value == true)||(needs_value == false)); /* not really but lets be rigorous */
+    assert ((required == true)||(required == false)); /* not really but lets be rigorous */
+
+    self = malloc (sizeof (*self) + size);
+    if (self == NULL)
+    {
+        rc = RC (rcExe, rcArgv, rcConstructing, rcMemory, rcExhausted);
+        PLOGERR (klogErr, (klogErr, rc, "Error adding option '$(O)'","O=--%s",name));
+    }
+    else 
+    {
+        if ((self->needs_value = needs_value) != false)
+            VectorInit (&self->values,0,4);
+        else
+            memset (&self->values, 0, sizeof(self->values) );
+
+        self->required = required;
+        self->deprecated = self->error = false;
+        self->count = 0;
+        self->max_count = max_count;
+        self->size = size;
+        self->convert_fn = convert_fn;
+        string_copy (self->name, size+1, name, size);
+    }
+    *pself = self;
+    return 0;
+}
+
+static
+void CC OptionWhack (Option * self)
+{
+    assert (self);
+
+    if (self->needs_value)
+        VectorWhack (&self->values, ParamValueVectorWhack, NULL);
+
+    free (self);
+}
+
+static
+void CC OptionTreeWhack (BSTNode * node, void * ignored)
+{
+    OptionWhack ((Option*)node);
+}
+#ifdef OptionGetName_needed
+static
+const char * CC OptionGetName (const Option * self, size_t * size)
+{
+    assert (self);
+    if (size)
+        *size = self->size;
+    return self->name;
+}
+#endif
+/*
+ * NeedsValue
+ *  return bool, does this option require a value
+ */
+static
+bool CC OptionNeedsValue (const Option * self)
+{
+    assert (self);
+
+    return self->needs_value;
+}
+
+/*
+ * GetCount
+ *  return the count of values seen so far.
+ */
+static
+uint32_t CC OptionGetCount (const Option *self)
+{
+    assert (self);
+
+    return self->count;
+}
+
+/* 
+ * GetValue
+ *    returns the address of the Nth value (not a copy of the value)
+ */
+static
+rc_t CC OptionGetValue (const Option * self, uint32_t number, const void ** value)
+{
+    ParamValueContainer * p_container;
+    /* SKH -- not sure why this was here. 
+       const char * pc; */
+    /* uint32_t count; */
+
+    assert (self);
+    assert (value);
+
+    /* count = OptionGetCount(self); */
+
+    p_container = VectorGet (&self->values, number);
+    /* SKH -- this was checking pc, which is uninitialized */
+    if (p_container == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcIndex, rcExcessive);
+    
+    *value = p_container->param_value;
+    
+    return 0;
+}
+
+/*
+ * add a value to this node.  If a value isn't needed this is just incrementing the count
+ */
+static
+rc_t CC OptionAddValue (Option * option, uint32_t arg_index, const char * value, size_t size)
+{
+    rc_t rc = 0;
+
+    assert (option);
+    
+    ++option->count;
+
+/*     KOutMsg ("%s: name %s count %u max_count %u value %s\n", __func__, option->name, option->count, option->max_count, value); */
+    if (option->max_count && (option->count > option->max_count))
+    {
+        --option->count;
+        rc = RC (rcExe, rcArgv, rcInserting, rcData, rcExcessive);
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Too many occurrences of option '$(O)'",
+                  "O=--%s", option->name));
+    }
+    else if (option->needs_value)
+    {
+        ParamValueContainer * p_container;
+
+        assert (value);     /* gotta have a value */
+        /* value can't be a NULL string */
+        if (size == 0)
+        {
+            rc = RC (rcExe, rcArgv, rcConstructing, rcParam, rcEmpty );
+            return rc;
+        }
+
+        p_container = (ParamValueContainer *)malloc( sizeof *p_container );
+        if (p_container == NULL)
+        {
+            rc = RC (rcExe, rcArgv, rcConstructing, rcMemory, rcExhausted);
+            return rc;
+        }
+
+        rc = ParamValueMake (p_container, arg_index, value, size, option->convert_fn);
+        if (rc == 0)
+        {
+            /* NOTE: effectively going in as a char ** though we will 
+             * pull it out as a char* with the same value */
+            rc = VectorAppend (&option->values, NULL, p_container);
+            if (rc)
+            {
+                PLOGERR (klogErr,
+                         (klogErr, rc, "error capturing parameter '$(O)'",
+                          "O=--%s", option->name));
+                p_container->whack (p_container->param_value);
+            }
+            else
+            {
+                ARGS_DBG( "added option-value %s", option->name );
+            }
+        }
+    }
+    return rc;
+}
+
+static
+int64_t CC OptionCmp (const void * item, const BSTNode * n)
+{
+    const char * name;
+    const Option * option;
+    size_t l;
+
+    assert (item);
+    assert (n);
+
+    name = item;
+    option = (Option*)n;
+    l = string_size (name);
+    return string_cmp (name, l, option->name, option->size, (uint32_t)(l + option->size) );
+}
+
+static
+int64_t CC OptionSort (const BSTNode * item, const BSTNode * n)
+{
+    const Option * l = (Option*)item;
+    const Option * r = (Option*)n;
+    return string_cmp (l->name, l->size, r->name, r->size, (uint32_t)(l->size + r->size) );
+}
+
+/* ==========
+ */
+typedef struct OptAlias
+{
+    BSTNode     n;              /* BSTree Node storage */
+
+    Option *   option;          /* full name node for which this is an alias */
+    size_t      size;
+    bool        deprecated;     /* warning if used */
+    bool        error;          /* error if used */
+    char        name[1];        /* utf8 name */
+} OptAlias;
+
+static
+rc_t CC OptAliasMake (OptAlias ** pself, const char * name, size_t size,
+                      Option * option)
+{
+    OptAlias * self;
+
+    assert (pself);
+    assert (name);
+    if (size == 0)
+    {
+        rc_t rc = RC (rcExe, rcArgv, rcConstructing, rcName, rcEmpty);
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Alias name is empty for parameter '$(B)",
+                  "B=%s", option->name));
+        *pself = NULL;
+        return rc;
+    }
+
+    self = malloc (sizeof (*self) + size);
+    if (self == NULL)
+    {
+        rc_t rc = RC (rcExe, rcArgv, rcConstructing, rcMemory, rcExhausted);
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Error creating structure for alias '$(A)' for parameter '$(B)", 
+                  "A=%s,B=%s", name, option->name));
+        *pself = NULL;
+        return rc;
+    }
+    self->option = option;
+    self->size = size;
+    self->deprecated = self->error = false;
+    string_copy (self->name, size + 1, name, size);
+    *pself = self;
+    return 0;
+}
+
+static
+void CC OptAliasWhack (const OptAlias * self)
+{
+    assert (self);
+    free ((void*)self);
+}
+
+static
+void CC OptAliasTreeWhack (BSTNode * node, void * ignored)
+{
+    assert (node); /* catch programming errors; freeing NULL wouldn't hurt */
+
+    OptAliasWhack ((OptAlias*)node);
+}
+
+#if 0
+static
+const char * CC OptAliasName (const OptAlias * self, size_t * size)
+{
+    assert (self);
+
+    if (size)
+        *size = self->size;
+    return self->name;
+}
+#endif
+static
+Option * CC OptAliasOption (const OptAlias *self)
+{
+    assert (self != NULL);
+
+    return self->option;
+}
+
+static
+int64_t CC OptAliasCmp (const void * item, const BSTNode * n)
+{
+    const char * name;
+    const OptAlias * option;
+    size_t l;
+
+    assert (item);
+    assert (n);
+
+    name = item;
+    option = (OptAlias*)n;
+    l = string_size (name);
+    return string_cmp (name, l, option->name, option->size, (uint32_t)( l + option->size ) );
+}
+
+static
+int64_t CC OptAliasSort (const BSTNode * item, const BSTNode * n)
+{
+    const OptAlias * l;
+    const OptAlias * r;
+
+    assert (item);
+    assert (n);
+
+    l = (OptAlias*)item;
+    r = (OptAlias*)n;
+    return string_cmp (l->name, l->size, r->name, r->size, (uint32_t)( l->size + r->size ) );
+}
+
+#if NOT_USED_YET
+static
+rc_t CC OptDefMakeCopy (OptDef ** pself, OptDef * original)
+{
+    OptDef * self;
+    size_t nsize;
+    size_t asize;
+    size_t hsize;
+
+    nsize = string_size (original->name);
+    asize = original->aliases ? string_size (original->aliases) : 0;
+    hsize = original->help ? string_size (original->help) : 0;
+
+    self = malloc (sizeof (*self) + nsize + 1 + asize + 1 + hsize + 1);
+    if (self == NULL)
+    {
+        rc_t rc;
+        /* assuming DebugMsg is stderr equivalent */
+        rc = RC (rcExe, rcArgv, rcConstructing, rcMemory, rcExhausted);
+        LOGERR (klogFatal, rc, "error creating help for option");
+        return rc;
+    }
+    self->name = (char*)(self+1);
+    string_copy (self->name, nsize + 1, original->name, nsize);
+    self->aliases = self->name + nsize + 1;
+    if (original->aliases)
+    {
+        string_copy (self->aliases, asize + 1, original->aliases, asize);
+    }
+    else
+        self->aliases[0] = '\0';
+    self->help = self->aliases + asize + 1;
+    if (original->help)
+    {
+        string_copy (self->help, hsize + 1, original->help, asize);
+    }
+    else
+        self->help[0] = '\0';
+    self->max_count = original->max_count;
+    self->needs_value = original->needs_value;
+    *pself = self;
+    return 0;
+}
+static
+void CC OptDefCopyVectorWhack (void * self, void * ignored)
+{
+    free (self);
+}
+
+#endif
+
+#if NOT_USED_YET
+
+typedef struct HelpGroup
+{
+    rc_t ( CC * header_fmt) (Args * args, const char * header);
+    Vector options;
+    const char header[1];
+} HelpGroup;
+
+
+static
+rc_t CC HelpGroupMake (HelpGroup ** pself, const char * name)
+{
+    HelpGroup * self;
+    size_t size;
+
+    size = string_size (name);
+    self = malloc (sizeof (*self) + size);
+    if (self == NULL)
+    {
+        fprintf (stderr, "Error allocating help group structure %s\n", name);
+        return RC (rcExe, rcArgv, rcConstructing, rcMemory, rcExhausted);
+    }
+    string_copy (self->name, size+1, name, size);
+    VectorInit (&self->optdefs, 0, 16);
+
+    *pself = self;
+    return 0;
+}
+
+
+static
+rc_t CC HelpGroupAddOptDef (HelpGroup * self, OptDef * option)
+{
+    OptDef * opt;
+    rc_t rc;
+
+    rc = OptDefCopy (&opt, option);
+    if (rc)
+        return rc;
+
+    rc = VectorAppend (&self->optdefs, NULL, opt);
+    if (rc)
+    {
+        fprintf (stderr, "Error appending option for help\n");
+        OptDefCopyVectorWhack (opt, NULL);
+        return rc;
+    }
+    return 0;
+}
+
+static
+void CC HelpGroupVectorWhack (void * item, void * ignored)
+{
+    HelpGroup * self = item;
+
+    assert (self);
+    VectorWhack (&self->optdefs, OptDefCopyVectorWhack, NULL);
+    free (self);
+}
+#endif
+
+typedef struct Parameter
+{
+    uint32_t position;
+    ConvertParamFnP  convert_fn;
+} Parameter;
+
+static
+rc_t CC ParamMake (Parameter ** p_parameter, uint32_t position, ConvertParamFnP convert_fn)
+{
+    Parameter * parameter;
+    
+    parameter = malloc (sizeof(Parameter));
+    if (parameter == NULL)
+    {
+        fprintf (stderr, "Error allocating parameter structure\n");
+        return RC (rcExe, rcArgv, rcConstructing, rcMemory, rcExhausted);
+
+    }
+    
+    parameter->position = position;
+    parameter->convert_fn = convert_fn;
+    
+    *p_parameter = parameter;
+    return 0;
+}
+
+static
+void ParamWhack (Parameter * param)
+{
+    assert(param);
+    free(param);
+}
+
+static
+void CC ParamVectorWhack (void * item, void * ignored)
+{
+    ParamWhack(item);
+}
+
+static
+rc_t CC ParamGetValue (const Vector * param_values, uint32_t number, const void ** value)
+{
+    ParamValueContainer * p_container;
+    
+    assert (param_values);
+    assert (value);
+    
+    p_container = VectorGet (param_values, number);
+    if (p_container == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcIndex, rcExcessive);
+    
+    *value = p_container->param_value;
+    
+    return 0;
+}
+
+/*
+ * add a param value to param_values vector.  Calls convert_fn if provided
+ */
+static
+rc_t CC ParamAddValue (Vector * param_values, uint32_t arg_index, const char * value, size_t size, ConvertParamFnP convert_fn)
+{
+    ParamValueContainer * p_container;
+    rc_t rc = 0;
+    
+    assert (param_values);
+    
+    p_container = (ParamValueContainer *)malloc( sizeof *p_container );
+    if (p_container == NULL)
+    {
+        rc = RC (rcExe, rcArgv, rcConstructing, rcMemory, rcExhausted);
+        return rc;
+    }
+
+    assert (value);     /* gotta have a value */
+    /* value can't be a NULL string */
+    if (size == 0)
+    {
+        rc = RC (rcExe, rcArgv, rcConstructing, rcParam, rcEmpty);
+        return rc;
+    }
+    
+    rc = ParamValueMake (p_container, arg_index, value, size, convert_fn);
+    if (rc == 0)
+    {
+        rc = VectorAppend (param_values, NULL, p_container);
+        if (rc)
+        {
+            PLOGERR (klogErr,
+                     (klogErr, rc, "error capturing parameter at index: $(O)",
+                      "O=%u", arg_index));
+            p_container->whack (p_container->param_value);
+        }
+        else
+        {
+            ARGS_DBG( "added param-value at index: %u", arg_index );
+        }
+    }
+
+    return rc;
+}
+
+
+/* ==========
+ */
+struct Args
+{
+    BSTree names;
+    BSTree aliases;
+    Vector params;
+    Vector argv;
+    Vector param_values;
+    Vector help;
+#if NOT_USED_YET
+    HelpGroup * def_help;
+#endif
+#if HONOR_LEGACY_Q_ALIAS
+    bool   qalias_replaced;
+#endif
+};
+
+rc_t CC ArgsMake (Args ** pself)
+{
+    rc_t rc;
+    Args * self;
+
+    assert (pself);
+
+    self = malloc (sizeof (*self));
+    if (self == NULL)
+    {
+        rc = RC (rcExe, rcArgv, rcConstructing, rcMemory, rcExhausted);
+    }
+    else
+    {
+#if NOT_USED_YET
+        HelpGroup * help;
+#endif
+        BSTreeInit (&self->names);
+        BSTreeInit (&self->aliases);
+        VectorInit (&self->params,0,8);
+        VectorInit (&self->argv,0,8);
+        VectorInit (&self->param_values,0,8);
+        VectorInit (&self->help,0,16);
+#if HONOR_LEGACY_Q_ALIAS
+        self -> qalias_replaced = false;
+#endif
+#if NOT_USED_YET
+        rc = HelpGroupMake (&help, "NCBI Options");
+        if (rc)
+        {
+            ArgsWhack (self);
+        }
+        else
+        {
+            self->def_help = help;
+            rc = VectorAppend (&self->help, NULL, help);
+        }
+#else
+        rc = 0;
+#endif
+    }
+    *pself = (rc == 0) ? self : NULL;
+    return rc;
+}
+
+rc_t CC ArgsWhack (Args * self)
+{
+    if (self)
+    {
+        BSTreeWhack (&self->names, OptionTreeWhack, NULL);
+        BSTreeWhack (&self->aliases, OptAliasTreeWhack, NULL);
+        VectorWhack (&self->params, ParamVectorWhack, NULL);
+        VectorWhack (&self->argv, ParamValueVectorWhack, NULL);
+        VectorWhack (&self->param_values, ParamValueVectorWhack, NULL);
+#if NOT_USED_YET
+        VectorWhack (&self->help, HelpGroupVectorWhack, NULL);
+#endif
+        free (self);
+    }
+    return 0;
+}
+
+
+rc_t CC ArgsAddOption (Args * self, const OptDef * option)
+{
+    rc_t rc = 0;
+    Option * node;
+    Option * prev;
+    const char * name;
+    size_t size; /* will be used for the help tree side */
+
+    if (self == NULL)
+    {
+        rc = RC (rcExe, rcArgv, rcConstructing, rcSelf, rcNull);
+        LOGERR (klogInt, rc, "Error adding an opion with no object");
+        return rc;
+    }
+    if (option == NULL)
+    {
+        rc = RC (rcExe, rcArgv, rcConstructing, rcParam, rcNull);
+        LOGERR (klogInt, rc, "Error adding an option with no option name");
+        return rc;
+    }
+    name = option->name;
+    if (! is_valid_name (name))
+    {
+        rc = RC (rcExe, rcArgv, rcConstructing, rcName, rcInvalid);
+        PLOGERR (klogInt, (klogInt, rc, "Error using illegal option name '$(O)'", "O=--%s", name));
+        return rc;
+    }
+    size = string_size (name);
+    rc = OptionMake (&node, name, size, option->max_count, option->needs_value, option->required, option->convert_fn);
+    if (rc)
+        return rc;
+    size ++;
+
+    prev = NULL;
+    rc = BSTreeInsertUnique (&self->names, &node->n, (BSTNode**)&prev, OptionSort);
+    if (rc)
+    {
+        if (GetRCState(rc) == rcBusy)
+        {
+            rc = RC (rcExe, rcArgv, rcConstructing, rcName, rcBusy);
+            PLOGERR (klogInt,
+                     (klogInt, rc, "duplicate option name '$(O)'", "O=--%s", name));
+        }
+        else
+            PLOGERR (klogInt,
+                     (klogInt, rc, "unknown error inserting option name '$(O)'", "O=--%s", name));
+
+        OptionWhack (node);
+        return rc;
+    }
+    if (option->aliases)     /* any single character aliases? */
+    {
+        const char * startc;
+        const char * endc;
+        int incr;
+
+        for ((startc = option->aliases),(endc = startc + string_size (startc));
+             startc < endc; startc += incr)
+        {
+            OptAlias * snode;
+            OptAlias * sprev;
+            uint32_t c;
+            char alias_name [8]; /* 4 should be enough + 1 for NUL */
+
+            incr = utf8_utf32 (&c, startc, endc);
+            if (incr < 0)
+            {
+                rc = RC (rcExe, rcArgv, rcConstructing, rcName, rcCorrupt);
+                PLOGERR (klogInt,
+                         (klogInt, rc, "Error parsing alias string '$(A)' from '$(B)' for '$(C)'",
+                          "A=%s,B=%s,C=%s", startc, option->aliases, name));
+                break;
+            }
+            if (incr > 4)
+            {
+                rc = RC (rcExe, rcArgv, rcConstructing, rcName, rcCorrupt);
+                PLOGERR (klogInt,
+                         (klogInt, rc,"Error parsing UTF-8 string '$(S)'",
+                          "S=%s", startc));
+                break;
+            }
+            size = string_copy (alias_name, sizeof (alias_name), startc, incr);
+            if (! is_valid_name (alias_name))
+            {
+                rc = RC (rcExe, rcArgv, rcConstructing, rcName, rcInvalid);
+                PLOGERR (klogInt,
+                         (klogInt, rc, "Error using invalid alias name '$(S)'",
+                          "S=%s", alias_name));
+                break;
+            }
+#if 0
+            size += incr + 1;
+#endif
+            rc = OptAliasMake (&snode, alias_name, incr, node);
+            if (rc)
+                break;
+            rc = BSTreeInsertUnique (&self->aliases, &snode->n, (BSTNode**)&sprev, OptAliasSort);
+            if (rc)
+            {
+                if (GetRCState(rc) == rcExists)
+                {
+#if HONOR_LEGACY_Q_ALIAS
+                    if ( ! self -> qalias_replaced && size == 1 && alias_name [ 0 ] == 'q' )
+                    {
+                        BSTreeUnlink ( & self -> aliases, & sprev -> n );
+                        rc = BSTreeInsertUnique ( & self -> aliases, & snode -> n, NULL, OptAliasSort );
+                        if ( rc != 0 )
+                            BSTreeInsert ( & self -> aliases, & sprev -> n, OptAliasSort );
+                        else
+                        {
+                            OptAliasWhack ( sprev );
+                            self -> qalias_replaced = true;
+#if LEGACY_Q_ALIAS_DEPRECATED
+                            snode -> deprecated = true;
+#elif LEGACY_Q_ALIAS_ERROR
+                            snode -> error = true;
+#endif
+                            continue;
+                        }
+                    }
+#endif
+                    rc = RC (rcExe, rcArgv, rcConstructing, rcName, rcExists);
+                    PLOGERR (klogInt,
+                             (klogInt, rc, "duplicate alias name '$(S)'",
+                              "S=%s", alias_name));
+                }
+                else
+                {
+                    PLOGERR (klogErr,
+                             (klogErr, rc, "unknown error inserting alias '$(S)'",
+                              "S=%s", alias_name));
+                }
+
+                OptAliasWhack (snode);
+                break;
+            }
+        }
+    }
+    return rc;
+}
+
+rc_t CC ArgsAddLongOption ( Args * self, const char * opt_short_names, const char * long_name,
+    const char * opt_param_names, const char * help_text, uint32_t max_count, bool required )
+{
+    OptDef opt;
+    const char * help [ 2 ];
+
+    if ( max_count > 0xFFFF )
+        return RC ( rcExe, rcArgv, rcConstructing, rcParam, rcExcessive );
+
+    memset ( & opt, 0, sizeof opt );
+    memset ( help, 0, sizeof help );
+
+    help [ 0 ] = help_text;
+
+    opt . name = long_name;
+    opt . aliases = opt_short_names;
+    opt . help = help;
+    opt . max_count = ( uint16_t ) max_count;
+    opt . needs_value = ( bool ) ( opt_param_names != NULL && opt_param_names [ 0 ] != 0 );
+    opt . required = required;
+
+    return ArgsAddOption ( self, & opt );
+}
+
+rc_t CC ArgsAddOptionArray (Args * self, const OptDef * option, uint32_t count
+    /*, rc_t (*header_fmt)(Args * args, const char * header), const char * header */ )
+{
+    rc_t rc;
+#if NOT_USED_YET
+    HelpGroup * hg;
+
+    rc = HelpGroupMake (&hg, header, header_fmt, option, count);
+    if (rc == 0)
+    {
+
+        rc = VectorAppend (&self->help, NULL, hg);
+        if (rc == 0)
+        {
+
+            /* count might be zero for help only sections */
+            for (rc = 0; count > 0; --count, ++option)
+            {
+                rc = ArgsAddOption (self, option);
+                if (rc)
+                    break;
+            }
+            if (rc == 0)
+                return 0;
+        }
+        else
+            HelpGroupVectorWhack (hg, NULL);
+    }
+#else
+    for (rc = 0; (rc == 0) && (count > 0); --count, ++option)
+    {
+        rc = ArgsAddOption (self, option);
+    }
+#endif
+    return rc;
+}
+
+rc_t CC ArgsAddParam ( Args * self, const ParamDef * param_def )
+{
+    rc_t rc;
+    Parameter * param;
+    uint32_t params_count;
+    
+    assert(self);
+    assert(param_def);
+    
+    params_count = VectorLength(&self->params);
+    
+    rc = ParamMake (&param, params_count, param_def->convert_fn);
+    if (rc)
+        return rc;
+    
+    rc = VectorAppend(&self->params, NULL, param);
+    if (rc != 0)
+    {
+        ParamWhack(param);
+    }
+    
+    return rc;
+}
+
+rc_t CC ArgsAddLongParam ( Args * self, const char * param_name, const char * help_text, ConvertParamFnP opt_cvt )
+{
+    ParamDef param;
+
+    memset ( & param, 0, sizeof param );
+
+    param . convert_fn = opt_cvt;
+
+    return ArgsAddParam ( self, & param );
+}
+
+rc_t CC ArgsAddParamArray (Args * self, const ParamDef * param, uint32_t count)
+{
+    rc_t rc;
+    
+    for (rc = 0; (rc == 0) && (count > 0); --count, ++param)
+    {
+        rc = ArgsAddParam (self, param);
+    }
+    
+    return 0;
+}
+
+/*
+ */
+rc_t CC next_arg (const Args * self, int * pix, int max, const char ** pvalue)
+{
+    int ix;
+    ParamValueContainer * p_container;
+
+    if (*pix >= max)
+        return RC (rcApp, rcArgv, rcAccessing, rcString, rcNotFound);
+
+    ix = *pix;
+    ix++;
+    p_container = (ParamValueContainer *) VectorGet (&self->argv, ix);
+    assert(p_container);
+    *pvalue = (const char *) p_container->param_value;
+    *pix = ix;
+    return 0;
+}
+
+typedef struct ArgsReqCheckData
+{
+    Option * missing_option;
+    rc_t rc;
+} ArgsReqCheckData;
+
+static
+void CC ArgsCheckRequiredInt (BSTNode * n, void * _data)
+{
+#if 1
+    ArgsReqCheckData * data;
+    Option * opt;
+    rc_t rc;
+
+    data = _data;
+    opt = (Option*)n;
+    if (opt->required && ! opt->count)
+    {
+        rc = RC( rcExe, rcArgv, rcParsing, rcParam, rcNotFound );
+        PLOGERR (klogWarn, (klogWarn, rc, "Error missing required parameter '$(P)'",
+                            "P=%s", opt->name));
+        if (data->missing_option == NULL)
+        {
+            data->missing_option = opt;
+            data->rc = rc;
+        }
+    }
+#endif
+}
+
+/* check for required parameters */
+rc_t CC ArgsCheckRequired (Args * self)
+{
+    ArgsReqCheckData r = { NULL, false };
+
+    BSTreeForEach ( &self->names, false, ArgsCheckRequiredInt, &r );
+
+    return r.rc;
+}
+
+static
+rc_t CC ProcessArgConversion(Args * self, ParamValueContainer * p_container)
+{
+    rc_t rc = 0;
+    
+    assert(p_container);
+    
+    if (p_container->convert_fn)
+    {
+        char * param_value = (char *)p_container->param_value;
+        WhackParamFnP whack = p_container->whack;
+        
+        p_container->param_value = NULL;
+        p_container->whack = NULL;
+        rc = p_container->convert_fn(self, p_container->param_index, param_value, string_size(param_value), &p_container->param_value, &p_container->whack);
+        whack(param_value);
+        
+        if (rc == 0 && p_container->whack == NULL)
+        {
+            p_container->whack = ParamValueNotConvWhack;
+        }
+    }
+    
+    return rc;
+}
+
+static
+rc_t CC ProcessArgsConversion(Args * self)
+{
+    rc_t rc = 0;
+    uint32_t i, param_count = VectorLength(&self->param_values);
+    ParamValueContainer * p_container;
+    
+    for (i = 0; i < param_count; ++i)
+    {
+        p_container = VectorGet (&self->param_values, i);
+        rc = ProcessArgConversion(self, p_container);
+        if (rc != 0)
+            break;
+    }
+    
+    if (rc == 0)
+    {
+        BSTNode* node = BSTreeFirst(&self->names);
+        while (node)
+        {
+            Option * option = (Option *)node;
+            uint32_t option_values_count = VectorLength(&option->values);
+            if (option->needs_value)
+            {
+                for (i = 0; i < option_values_count; ++i)
+                {
+                    p_container = VectorGet (&option->values, i);
+                    rc = ProcessArgConversion(self, p_container);
+                    if (rc != 0)
+                        break;
+                }
+                
+                if (rc != 0)
+                    break;
+            }
+            
+            node = BSTNodeNext(node);
+        }
+    }
+    
+    return rc;
+    
+}
+
+static
+rc_t ArgsParseInt (Args * self, int argc, char *argv[])
+{
+    rc_t rc = 0;        /* hard fail - quit processing */
+    rc_t orc = 0;       /* soft fail - keep processing but we'll fail in the end */
+    rc_t qrc = 0;       /* transient - if set will move to a previously unset orc */
+    int ix, ix_from, ix_to;
+    size_t jx;
+    Option * node;
+    const char * parg;
+    char * equal_sign;
+    
+    char name [32];
+    const char * value = NULL;
+    size_t value_len;
+    bool needs_value;
+    uint32_t n_in_argv_before;
+
+    n_in_argv_before = VectorLength( &self->argv );
+
+    /* first capture original argument list and store in our format */
+    for ( ix = 0; ix < argc; ++ix )
+    {
+        size_t len;
+        ParamValueContainer * p_container;
+
+        parg = argv[ix];
+        len = string_size ( parg );
+        
+        p_container = (ParamValueContainer *)malloc( sizeof *p_container );
+        if (p_container == NULL)
+        {
+            rc = RC (rcExe, rcArgv, rcConstructing, rcMemory, rcExhausted);
+            break;
+        }
+
+        rc = ParamValueMake ( p_container, ix, parg, len, NULL );
+        if ( rc == 0 )
+            rc = VectorAppend ( &self->argv, NULL, p_container );
+        if ( rc )
+        {
+            if (p_container->whack != NULL)
+                p_container->whack(p_container->param_value);
+            break;
+        }
+        else
+            ARGS_DBG( "ArgsParse: inserted '%s' into self->argv", parg );
+    }
+    
+    if ( rc )
+        return rc;
+
+    if ( n_in_argv_before == 0 )
+    {
+        ix_from = 1;
+        ix_to = argc;
+    }
+    else
+    {
+        ix_from = n_in_argv_before;
+        ix_to = n_in_argv_before + argc;
+    }
+
+    for ( ix = ix_from; ix < ix_to; ++ix )
+    {
+        ParamValueContainer * p_container = (ParamValueContainer *)VectorGet( &self->argv, ix );
+        parg = ( const char * )p_container->param_value;
+
+        ARGS_DBG( "ArgsParse: parsing '%s' from self->argv", parg );
+
+        if ( parg[ 0 ] != '-' )
+        {
+            uint32_t params_count = VectorLength( &self->param_values );
+            Parameter * param = VectorGet( &self->params, params_count );
+            rc = ParamAddValue( &self->param_values, ix, parg, string_size( parg ), param ? param->convert_fn : NULL );
+            if ( rc )
+                break;
+            ARGS_DBG( "ArgsParse: appending to param_values '%s'", parg );
+        }
+        else
+        {
+            node = NULL;
+            if ( parg[ 1 ] == '-' )
+            {
+                size_t nlen = string_copy( name, sizeof( name ), parg + 2, string_size( parg + 2 ) );
+                ARGS_DBG( "ArgsParse: '%s' is a '--' parameter!", parg );
+                equal_sign = string_chr( name, nlen, '=' );
+                if ( equal_sign )
+                    *equal_sign = '\0';
+
+                node = ( Option* )BSTreeFind( &self->names, name, OptionCmp );
+                if ( node == NULL )
+                {
+                    qrc = RC( rcApp, rcArgv, rcParsing, rcParam, rcUnknown );
+                    PLOGERR (klogErr,
+                             (klogErr, qrc,
+                              "Unknown argument '$(O)'", "O=--%s", name ));
+/*                     break; */
+                    if (orc == 0) /* non-fatal */
+                        orc = qrc;
+                }
+                else
+                {
+                    needs_value = OptionNeedsValue( node );
+                    ARGS_DBG( "ArgsParse: found node for parameter '%s'", parg );
+                    if ( needs_value )
+                    {
+                        ARGS_DBG( "ArgsParse: parameter '%s' needs value", parg );
+                        if ( equal_sign != NULL )
+                            value = parg + 2 + ( ( equal_sign + 1 ) - name );
+
+                        else if ( ix + 1 >= ix_to )
+                        {
+                            rc = RC( rcExe, rcArgv, rcParsing, rcParam, rcExhausted );
+                            PLOGERR (klogErr,
+                                     (klogErr, qrc,"Option '$(O)' is missing a value", "O=--%s", node->name ));
+                        }
+                        else
+                        {
+                            ARGS_DBG( "ArgsParse: calling next_arg()", 0 );
+                            rc = next_arg( self, &ix, ix_to, &value );
+                        }
+
+                        if ( rc == 0 )
+                        {
+                            assert ( value != NULL );
+
+                            value_len = string_size( value );
+
+                            rc = OptionAddValue( node, ix, value, value_len );
+                        }
+                    }
+                    else
+                    {
+                        rc = OptionAddValue( node, ix, NULL, 0 );
+                    }
+
+                    if ( rc != 0 )
+                        break;
+
+                    if ( node -> error )
+                    {
+                        rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcUnsupported );
+                        PLOGERR (klogErr,
+                                 (klogErr, rc,
+                                  "Deprecated argument '$(O)' is no longer supported.", "O=--%s", name ));
+                        break;
+                    }
+
+                    if ( node -> deprecated )
+                    {
+                        PLOGMSG (klogWarn,
+                                 (klogWarn,
+                                  "Deprecated argument '$(O)' may not be supported in future releases.", "O=--%s", name ));
+                    }
+                }
+            }
+            else
+            {
+                const char * end;
+                uint32_t name_len;
+
+                end = parg + string_size( parg );
+                ARGS_DBG( "ArgsParse: '%s' is a '-' parameter!", parg );
+                for ( jx = 1; parg[ jx ]; jx += name_len )
+                {
+                    OptAlias *alias;
+                    uint32_t c;
+
+                    name_len = utf8_utf32( &c, parg + jx, end ); 
+                    string_copy( name, sizeof( name ), parg + jx, name_len );
+
+                    alias = ( OptAlias* )BSTreeFind( &self->aliases, name, OptAliasCmp );
+                    if ( alias == NULL )
+                    {
+                        qrc = RC( rcApp, rcArgv, rcParsing, rcParam, rcUnknown );
+                        PLOGERR (klogErr,
+                                 (klogErr, qrc,
+                                  "Unknown argument '$(O)'", "O=-%s", name ));
+
+                        if (orc == 0)
+                            orc = qrc;
+                    }
+                    else
+                    {
+                        bool break_loop = false;
+                        node = OptAliasOption( alias );
+                        if ( OptionNeedsValue( node ) )
+                        {
+                            if ( parg[ jx + name_len ] == '=' )
+                            {
+                                ++jx;
+                                if ( parg[ jx + name_len ] )
+                                    value = parg + jx + name_len;
+                                else
+                                {
+                                    qrc = RC( rcExe, rcArgv, rcParsing, rcParam, rcExhausted );
+                                    LOGERR (klogErr, qrc,
+                                            "Value missing with alias followed by =" );
+                                    if (orc == 0)
+                                        orc = qrc;
+                                    break_loop = true;
+                                }
+                            }
+                            else if ( parg[ jx + name_len ] )
+                            {
+                                value = parg + jx + name_len;
+                            }
+                            else if ( ix + 1 >= ix_to )
+                            {
+                                rc = RC( rcExe, rcArgv, rcParsing, rcParam, rcExhausted );
+                                PLOGERR (klogErr,
+                                         (klogErr, rc,
+                                          "Option '$(O)' ( alias for '$(N)' ) is missing a value",
+                                          "O=-%s,N=--%s", name, node->name ));
+                                break;
+                            }
+                            else
+                            {
+                                ParamValueContainer * next_p_container = (ParamValueContainer *) VectorGet( &self->argv, ++ix );
+                                assert(next_p_container);
+                                value = ( const char * ) next_p_container->param_value;
+                            }
+                            ARGS_DBG( "ArgsParse: the value of '%s' is '%s'", name, value );
+
+                            if ( rc == 0 )
+                                rc = OptionAddValue( node, ix, value, string_size( value ) );
+                            break_loop = true;
+                        }
+                        else
+                        {
+                            rc = OptionAddValue( node, ix, NULL, 0 );
+                        }
+
+                        if ( rc != 0 )
+                            break;
+
+                        if ( node -> error )
+                        {
+                            rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcUnsupported );
+                            PLOGERR (klogErr,
+                                     (klogErr, rc,
+                                      "Deprecated argument '$(O)' ( alias for '$(N)' ) is no longer supported.",
+                                      "O=-%s,N=--%s"
+                                      , name
+                                      , node->name
+                                         ));
+                            break;
+                        }
+
+                        if ( alias -> error )
+                        {
+                            rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcUnsupported );
+                            PLOGERR (klogErr,
+                                     (klogErr, rc,
+                                      "Deprecated argument '$(O)' is no longer supported. "
+                                      "Please use '$(N)' instead.",
+                                      "O=-%s,N=--%s"
+                                      , name
+                                      , node->name
+                                         ));
+                            break;
+                        }
+
+                        if ( node -> error )
+                        {
+                            PLOGMSG (klogWarn,
+                                     (klogWarn,
+                                      "Deprecated argument '$(O)' ( alias for '$(N)' ) may not be supported in future releases.",
+                                      "O=-%s,N=--%s"
+                                      , name
+                                      , node->name
+                                         ));
+                        }
+
+                        else if ( alias -> deprecated )
+                        {
+                            PLOGMSG (klogWarn,
+                                     (klogWarn,
+                                      "Deprecated argument '$(O)' may not be supported in future releases. "
+                                      "Please use '$(N)' instead.",
+                                      "O=-%s,N=--%s"
+                                      , name
+                                      , node->name
+                                         ));
+                        }
+
+                        if ( break_loop )
+                            break;
+                    }
+                }
+            }
+        }
+        if ( rc )
+            break;
+    }
+    
+    if (rc == 0)
+    {
+        rc = ProcessArgsConversion(self);
+    }
+
+#if _DEBUGGING
+    (void)ArgsHandleDebug (self);
+#endif
+#if USE_EARLY_HELP
+    if (rc == 0)
+    {
+        rc = ArgsHandleHelp (self);
+        /* if "help" wasn't found we aren't using standard arguments so don't
+         * call it an error: if OptionGout changes this might have to as well */
+        if (rc == SILENT_RC (rcExe, rcArgv, rcAccessing, rcName, rcNotFound))
+            rc = 0;
+    }
+#endif
+#if USE_EARLY_VERSION
+    if (rc == 0)
+    {
+        rc = ArgsHandleVersion (self);
+        if (rc == SILENT_RC (rcExe, rcArgv, rcAccessing, rcName, rcNotFound))
+            rc = 0;
+    }
+#endif
+    /* now recovery non-fatal errors into final rc */
+    if (rc == 0)
+        rc = orc;
+
+    if ( rc )
+    {
+        ReportSilence();
+    }
+    return rc;
+}
+
+rc_t CC ArgsParse (Args * self, int argc, char *argv[])
+{
+    KLogLevel lvl = KLogLevelGet ();
+    rc_t rc = KLogLevelSet ( klogWarn );
+    rc = ArgsParseInt ( self, argc, argv );
+    KLogLevelSet ( lvl );
+    return rc;
+}
+
+rc_t CC ArgsOptionCount (const Args * self, const char * option_name, uint32_t * count)
+{
+    rc_t rc;
+
+    if (self == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcSelf, rcNull);
+    else if (count == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcParam, rcNull);
+    else
+    {
+        const Option * node;
+
+        node = (const Option*)BSTreeFind (&self->names, option_name, OptionCmp);
+        if (node == NULL)
+        {
+            rc = RC (rcExe, rcArgv, rcAccessing, rcName, rcNotFound);
+/* this was removed to shut up about "help" not being found during tests
+            PLOGERR (klogWarn, (klogWarn, rc, "Option name not found '$(S)'", "S=%s", option_name));
+ */
+            return rc;
+        }
+
+        *count = OptionGetCount (node);
+        return 0;
+    }
+}
+
+rc_t CC ArgsOptionValue (const Args * self, const char * option_name, uint32_t iteration,
+                                     const void ** value_bin)
+{
+    const Option * node;
+    rc_t rc;
+
+    if (self == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcSelf, rcNull);
+
+    if ((option_name == NULL) || (value_bin == NULL))
+        return RC (rcExe, rcArgv, rcAccessing, rcParam, rcNull);
+
+    *value_bin = NULL;
+
+    node = (const Option*)BSTreeFind (&self->names, option_name, OptionCmp);
+    if (node == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcName, rcNotFound);
+    
+    rc = OptionGetValue (node, iteration, value_bin);
+    return rc;
+}
+
+rc_t CC ArgsParamCount (const Args * self, uint32_t * count)
+{
+    if (self == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcSelf, rcNull);
+    else if (count == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcParam, rcNull);
+
+    *count = VectorLength (&self->param_values);
+    return 0;
+}
+
+rc_t CC ArgsParamValue (const Args * self, uint32_t iteration, const void ** value)
+{
+    rc_t rc;
+    
+    if (self == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcSelf, rcNull);
+
+    if (value == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcParam, rcNull);
+
+    if (iteration >= VectorLength (&self->param_values))
+    {
+        *value = NULL;
+        return RC (rcExe, rcArgv, rcAccessing, rcParam, rcExcessive);
+    }
+
+    
+    rc = ParamGetValue (&self->param_values, iteration, value);
+    return rc;
+}
+
+rc_t CC ArgsArgvCount (const Args * self, uint32_t * count)
+{
+    if (self == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcSelf, rcNull);
+    else if (count == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcArgv, rcNull);
+
+    *count = VectorLength (&self->argv);
+    return 0;
+}
+#ifdef ArgsArgc
+#undef ArgsArgc
+#endif
+
+rc_t CC ArgsArgc (const Args * self, uint32_t * count)
+{
+    return ArgsArgvCount (self, count);
+}
+
+rc_t CC ArgsArgvValue (const Args * self, uint32_t iteration, const char ** value_string)
+{
+    ParamValueContainer * p_container;
+    
+    if (self == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcSelf, rcNull);
+
+    if (value_string == NULL)
+        return RC (rcExe, rcArgv, rcAccessing, rcArgv, rcNull);
+
+    if (iteration >= VectorLength (&self->argv))
+    {
+        *value_string = NULL;
+        return RC (rcExe, rcArgv, rcAccessing, rcArgv, rcExcessive);
+    }
+
+    p_container = (ParamValueContainer*) VectorGet (&self->argv, iteration);
+    assert(p_container);
+    
+    *value_string = (const char *)p_container->param_value;
+    return 0;
+}
+
+#define USAGE_MAX_SIZE 81
+static
+const char * verbose_usage[] = 
+{ "Increase the verbosity of the program status messages.",
+  "Use multiple times for more verbosity.","Negates quiet.", NULL };
+static
+const char * quiet_usage[] = 
+{ "Turn off all status messages for the program.",
+  "Negated by verbose.", NULL };
+static
+const char * debug_usage[] = 
+{ "Turn on debug output for module.",
+  "All flags if not specified.", NULL };
+static
+const char * help_usage[] = 
+{ "Output a brief explanation for the program.", NULL };
+static
+const char * report_usage[] = 
+{ "Control program execution environment report generation (if implemented).",
+    "One of (never|error|always). Default is error.", NULL };
+static
+const char * version_usage[] = 
+{ "Display the version of the program then quit.", NULL };
+static
+const char * optfile_usage[] = 
+{ "Read more options and parameters from the file.", NULL};
+static 
+char log0 [USAGE_MAX_SIZE];
+static 
+char log1 [USAGE_MAX_SIZE];
+static
+const char * log_usage[] = 
+{ "Logging level as number or enum string.", log0, log1, NULL };
+static
+const char * no_user_settings_usage[] = 
+{ "Turn off user-specific configuration.", NULL };
+
+static
+void CC gen_log_usage (const char ** _buffers)
+{
+    static const char div[] = "|";
+
+    /* these have to be mutable for this to work */
+    char ** buffers = (char **) _buffers;
+
+    char * pc;
+    char * p0;
+    char * p1;
+    size_t rem;
+    size_t used;
+    KLogLevel level;
+
+    rc_t rc;
+    char buffv[USAGE_MAX_SIZE];
+
+
+    p0 = pc = buffers[1];
+    p1 = pc = buffers[2];
+
+    *p0 = *p1 = '\0';
+
+    rem = USAGE_MAX_SIZE; /* makes an assumption */
+    pc = buffv;
+    for (level = klogLevelMin; level <= klogLevelMax; ++level)
+    {
+        rc = KLogLevelExplain (level, pc, rem, &used);
+        if (rc || used == 0)
+        {
+            p0 = NULL;
+            pc = NULL;
+            break;
+        }
+        pc += used;
+        rem -= used;
+        strcpy (pc, div);
+        pc += sizeof div - 1;
+        rem -= sizeof div - 1;
+    }
+    if (p0)
+    {
+        pc -= sizeof div - 1;
+        rem += sizeof div - 1;
+        *pc = '\0';
+        
+        rc = string_printf (p0, USAGE_MAX_SIZE, & used,
+                            "One of (%s) or (%u-%u)",
+                            buffv, klogLevelMin, klogLevelMax);
+        if (used == 0)
+            p0 = NULL;
+    }
+    rc = KLogLevelExplain (KLogLevelGet(), buffv, sizeof buffv, &used);
+    if (rc || used == 0)
+        p1 = NULL;
+    else
+    {
+        buffv[used] = '\0';
+        rc = string_printf (p1, USAGE_MAX_SIZE, & used,
+                         "Current/default is %s",
+                         buffv);
+        if (used == 0)
+            p1 = NULL;
+    }
+    if (p0 == NULL)
+    {
+        p0 = p1;
+        p1 = NULL;
+    }
+}
+
+
+
+OptDef StandardOptions[]  =
+{
+    {
+        OPTION_HELP            , ALIAS_HELP     , NULL, help_usage,
+        OPT_UNLIM, false, false
+    },
+    {
+        OPTION_VERSION         , ALIAS_VERSION  , NULL, version_usage,
+        OPT_UNLIM, false, false
+    },
+    {
+        OPTION_LOG_LEVEL       , ALIAS_LOG_LEVEL, gen_log_usage,     log_usage,
+        OPT_UNLIM, true, false
+    },
+    {
+        OPTION_VERBOSE         , ALIAS_VERBOSE  , NULL, verbose_usage,
+        OPT_UNLIM, false, false
+    },
+    {
+        OPTION_QUIET           , ALIAS_QUIET    , NULL, quiet_usage,
+        OPT_UNLIM, false, false
+    },
+#if USE_OPTFILE
+    {
+        OPTION_OPTFILE         , ALIAS_OPTFILE  , NULL, optfile_usage,
+        OPT_UNLIM, true , false, ArgsConvFilepath
+    },
+#endif
+    {
+        OPTION_DEBUG           , ALIAS_DEBUG    , NULL, debug_usage, 
+        OPT_UNLIM, true , false
+    },
+    {
+        OPTION_NO_USER_SETTINGS, NULL           , NULL, no_user_settings_usage,
+        OPT_UNLIM, false, false
+    },
+    {   /* OPTION_REPORT is used in klib/report.c */
+        OPTION_REPORT          , NULL           , NULL, report_usage, 
+        OPT_UNLIM, true , false
+    }
+};
+
+rc_t CC ArgsAddStandardOptions(Args * self)
+{
+    return ArgsAddOptionArray (self, StandardOptions,
+                               sizeof (StandardOptions) / sizeof (OptDef)
+                               /*, NULL, NULL */ );
+}
+
+rc_t CC ArgsMakeStandardOptions (Args** pself)
+{
+    Args * self;
+    rc_t rc;
+
+    rc = ArgsMake (&self);
+    if (rc == 0)
+    {
+        rc = ArgsAddStandardOptions (self);
+        if (rc)
+            ArgsWhack (self);
+    }
+    *pself = (rc == 0) ? self : NULL;
+    return rc;
+}
+
+rc_t CC ArgsHandleHelp (Args * self)
+{
+    uint32_t count;
+    rc_t rc;
+
+    rc = ArgsOptionCount (self, OPTION_HELP, &count);
+    if (rc == 0)
+    {
+        if (count)
+        {
+            /* this is a call into the main program code */
+            Usage(self);
+            ArgsWhack (self);
+            exit (0);
+        }
+    }
+    return rc;
+}
+
+
+rc_t CC ArgsHandleVersion (Args * self)
+{
+    uint32_t count;
+    rc_t rc;
+
+    rc = ArgsOptionCount (self, OPTION_VERSION, &count);
+    if (rc == 0)
+    {
+        if (count)
+        {
+            const char * progname = UsageDefaultName;
+            const char * fullpath = UsageDefaultName;
+
+            char cSra [ 512 ] = "";
+            SraReleaseVersion sraVersion;
+            memset ( & sraVersion, 0, sizeof sraVersion );
+            {
+                rc_t rc = SraReleaseVersionGet ( & sraVersion );
+                if ( rc == 0 ) {
+                    rc = SraReleaseVersionPrint
+                        ( & sraVersion, cSra, sizeof cSra, NULL );
+                }
+            }
+
+            if (self)
+                rc = ArgsProgram (self, &fullpath, &progname);
+
+            HelpVersion (fullpath, KAppVersion());
+
+            ArgsWhack (self);
+            exit (0);
+        }
+    }
+    return rc;
+}
+
+rc_t CC ArgsHandleLogLevel (const Args * self)
+{
+    uint32_t count;
+    rc_t rc;
+
+    rc = ArgsOptionCount (self, OPTION_LOG_LEVEL, &count);
+    if (rc == 0)
+    {
+        if (count != 0) {
+            const char * value;
+            uint32_t ix;
+
+            for (ix = 0; ix < count; ++ix)
+            {
+                rc = ArgsOptionValue (self, OPTION_LOG_LEVEL,
+                                      ix, (const void**)&value);
+                if (rc == 0)
+                    rc = LogLevelSet (value);
+                if (rc)
+                    break;
+            }
+        }
+    }
+    return rc;
+}
+
+rc_t CC ArgsHandleStatusLevel (const Args * self)
+{
+    uint32_t vcount, qcount;
+    rc_t rc;
+
+    rc = ArgsOptionCount (self, OPTION_VERBOSE, &vcount);
+    if (rc == 0)
+    {
+        rc = ArgsOptionCount (self, OPTION_QUIET, &qcount);
+        if (rc == 0)
+        {
+            KStsLevel current;
+
+            current = KStsLevelGet();
+
+            if (vcount)
+            {
+                rc_t irc;
+
+                irc = SILENT_RC (rcExe, rcArgv, rcParsing, rcParam, rcIncorrect);
+                if (qcount)
+                {
+                    PLOGERR (klogErr,
+                             (klogErr, irc,
+                              "$(V)($(v)) and $(Q)($(q)) should not be used together",
+                              "V=%s,v=%s,Q=$s,q=%s",
+                              OPTION_VERBOSE,ALIAS_VERBOSE,
+                              OPTION_QUIET,ALIAS_QUIET));
+                }
+                KStsLevelSet (current + vcount);
+            }
+            else if (qcount)
+                KStsLevelSet (0);
+        }
+    }
+    return rc;
+}
+
+rc_t CC ArgsHandleNoUserSettings (const Args * self)
+{
+    uint32_t count = 0;
+    rc_t rc = ArgsOptionCount (self, OPTION_NO_USER_SETTINGS, &count);
+    if (rc == 0 && count != 0)
+        KConfigDisableUserSettings ();
+    return rc;
+}
+
+
+#if USE_OPTFILE
+rc_t CC ArgsHandleOptfile (Args * self)
+{
+    return Args_parse_inf_file (self, OPTION_OPTFILE);
+}
+#endif
+
+
+#if _DEBUGGING
+rc_t CC ArgsHandleDebug (const Args * self)
+{
+    uint32_t count;
+    rc_t rc;
+
+    rc = ArgsOptionCount (self, OPTION_DEBUG, &count);
+    if (rc == 0)
+    {
+        if (count == 0)
+        {
+        }
+        else
+        {
+            const char * value;
+            uint32_t ix;
+
+            for (ix = 0; ix < count; ++ix)
+            {
+                rc = ArgsOptionValue (self, OPTION_DEBUG,
+                                      ix, (const void**)&value);
+                if (rc == 0)
+                    rc = KDbgSetString (value);
+                if (rc)
+                    break;
+            }
+        }
+    }
+    return rc;
+}
+#endif
+
+rc_t CC ArgsHandleStandardOptions (Args * self)
+{
+    rc_t rc = 0;
+
+    do
+    {
+        rc = ArgsHandleHelp (self);
+        if (rc != 0)
+            break;
+
+        rc = ArgsHandleVersion (self);
+        if (rc != 0)
+            break;
+
+        rc = ArgsHandleLogLevel (self);
+        if (rc != 0)
+            break;
+
+        rc = ArgsHandleStatusLevel (self);
+        if (rc != 0)
+            break;
+
+        rc = ArgsHandleNoUserSettings (self);
+        if (rc != 0)
+            break;
+
+#if _DEBUGGING 
+	/* called a second time in case more symbols in in files */
+        rc = ArgsHandleDebug (self);
+        if (rc != 0)
+            break;
+#endif
+    } while (0); /* not a real loop */
+
+    return rc;
+}
+
+/* if pself == NULL
+   then process / initialize standard arguments and release Args */
+static
+rc_t ArgsMakeAndHandleInt ( Args ** pself, int argc, char ** argv,
+    const ParamDef *params, uint32_t param_count, uint32_t optdef_count, va_list ap )
+{
+    rc_t rc;
+    Args * self;
+
+    if ( pself != NULL ) {
+        * pself = NULL;
+    }
+
+    rc = ArgsMakeStandardOptions (&self);
+    if ( rc == 0 && param_count != 0 )
+    {
+        if ( params == NULL )
+            return RC ( rcExe, rcArgv, rcConstructing, rcParam, rcNull );
+
+        rc = ArgsAddParamArray ( self, params, param_count );
+    }
+    if (rc == 0)
+    {
+        for (;;)
+        {
+            /* load added OptDef tables */
+            if (optdef_count != 0)
+            {
+                while (optdef_count--)
+                {
+                    OptDef * options;
+                    uint32_t opt_count;
+
+                    options = va_arg (ap, OptDef *);
+                    opt_count = va_arg (ap, uint32_t);
+
+                    rc = ArgsAddOptionArray (self, options, opt_count /* , NULL, NULL */);
+                    if (rc)
+                        break;
+                }
+
+                if (rc)
+                    break;
+            }
+
+            rc = ArgsParse (self, argc, argv);
+            if (rc)
+                break;
+
+#if USE_OPTFILE
+            /*
+             * recursively check for files full of options
+             * we want this done before flagging missing arguments
+             */
+            rc = ArgsHandleOptfile (self);
+            if (rc)
+                break;
+#endif
+            /*
+             * now handle (maybe even rehandle except the optfile
+             * the standard arguments all applications/tools support
+             */
+            rc = ArgsHandleStandardOptions (self);
+            if (rc)
+                break;
+
+            rc = ArgsCheckRequired (self);
+            if (rc)
+            {
+                MiniUsage(self);
+                break;
+            }
+
+            if ( pself != NULL ) {
+                * pself = self;
+            }
+            else {
+                ArgsWhack ( self );
+            }
+            return 0;
+
+            break;
+        }
+    
+        ArgsWhack (self);
+    }
+    return rc;
+}
+
+rc_t CC ArgsMakeAndHandle (Args ** pself, int argc, char ** argv, uint32_t table_count, ...)
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, table_count );
+    rc = ArgsMakeAndHandleInt ( pself, argc, argv, NULL, 0, table_count, args );
+    va_end ( args );
+    return rc;
+}
+
+rc_t CC ArgsMakeAndHandle2 (Args ** pself, int argc, char ** argv,
+                            ParamDef * params, uint32_t param_count, uint32_t table_count, ...)
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, table_count );
+    rc = ArgsMakeAndHandleInt ( pself, argc, argv, params, param_count, table_count, args );
+    va_end ( args );
+    return rc;
+}
+
+
+/* NOTE:
+ * This needs to move into a unix/win32 seperated file
+ * and quite probably outside of args.
+ */
+
+const char * CC trim_path (const char * full_name)
+{
+    const char * name;
+
+    name = strrchr (full_name, '/');
+    if (name == NULL)
+        name = full_name;
+    else
+        ++name; /* skip past '/' */
+    return name;
+}
+
+
+rc_t CC ArgsProgram (const Args * args, const char ** fullpath, const char ** progname)
+{
+    const char * defaultname = UsageDefaultName;
+    const char * f;
+    rc_t rc;
+
+    rc = ArgsArgvValue (args, 0, &f);
+    if (rc == 0)
+    {
+        if (fullpath)
+            *fullpath = f;
+        if (progname)
+            *progname = trim_path (f);
+    }
+    else
+    {
+        f = defaultname;
+        
+        if (fullpath != NULL)
+        {
+            if (*fullpath == NULL)
+                *fullpath = f;
+            else
+                f = *fullpath;
+        }
+        if (progname)
+        {
+            if (*progname == NULL)
+                *progname = trim_path (f);
+        }
+    }
+    return rc;
+}
+
+void CC HelpVersion (const char * fullpath, ver_t version)
+{
+    rc_t rc = 0;
+    char cSra[512] = "";
+    SraReleaseVersion sraVersion;
+    memset(&sraVersion, 0, sizeof sraVersion);
+    rc = SraReleaseVersionGet(&sraVersion);
+    if (rc == 0) {
+        rc = SraReleaseVersionPrint(&sraVersion, cSra, sizeof cSra, NULL);
+    }
+    if (rc != 0 || cSra[0] == '\0' ||
+        (sraVersion.version == version && sraVersion.revision == 0 &&
+         sraVersion.type == eSraReleaseVersionTypeFinal))
+    {
+        OUTMSG (("\n%s : %.3V\n\n", fullpath, version));
+    }
+    else {
+        OUTMSG (("\n%s : %.3V ( %s )\n\n", fullpath, version, cSra));
+    }
+}
+
+
+static void print_indented( const size_t first_indent, const size_t indent,
+                            const size_t max_line_len, const char ** msgs )
+{
+    const char * msg;
+    size_t line_len;
+
+    if ( *msgs == NULL )
+    {
+        OUTMSG(( "\n" ));
+        return;
+    }
+
+    if ( first_indent < indent )
+    {
+        OUTMSG(( "%*s", indent - first_indent, " " ));
+        line_len = indent;
+    }
+    else
+    {
+        OUTMSG(( "  " ));
+        line_len = first_indent + 2;
+    }
+    while ( ( msg = *msgs++ ) != NULL )
+    {
+        while ( msg != NULL )
+        {
+            const char * space = strchr( msg, ' ' );
+            if ( space != NULL )
+            {
+                /* space found, can we print the word on the current line? */
+                int wordlen = (int) ( space - msg );
+                if ( ( line_len + wordlen + 1 ) < max_line_len )
+                {
+                    if ( wordlen > 1 )
+                        OUTMSG(( "%.*s", wordlen + 1, msg )); /* yes */
+                }
+                else
+                {
+                    OUTMSG(( "\n%*s%.*s", indent, " ", wordlen + 1, msg )); /* no: new line */
+                    line_len = indent;
+                }
+                line_len += ( wordlen + 1 );
+                msg += ( wordlen + 1 );
+            }
+            else
+            {
+                /* no space found, can we print the string on the current line? */
+                size_t remainder = string_size( msg );
+                if ( line_len + remainder < max_line_len )
+                {
+                    OUTMSG(( "%s ", msg )); /* yes */
+                }
+                else
+                {
+                    OUTMSG(( "\n%*s%s ", indent, " ", msg )); /* no: new line */
+                    line_len = indent;
+                }
+                line_len += remainder;
+                msg = NULL; /* we are done with one source-line... */
+            }
+        }
+    }
+    OUTMSG(( "\n" ));
+}
+
+void CC HelpOptionLine(const char * alias, const char * option, const char * param, const char ** msgs)
+{
+/*    const char * msg; */
+#define INDENT 2
+#define MSG_INDENT 35
+#define MSG_MAXLEN 80
+
+    bool has_alias = (alias != NULL && alias[0] != '\0');
+    bool has_opt = (option != NULL && option[0] != '\0');
+
+    if( has_alias || has_opt )
+    {
+        int n = 0, msgc = 0;
+
+        OUTMSG(("%*s%n", INDENT, " ", & msgc ));
+
+        if( has_alias )
+        {
+            OUTMSG(("-%s%n", alias, &n));
+            msgc += n;
+        }
+
+        if( has_alias && has_opt )
+        {
+            OUTMSG(("|"));
+            msgc++;
+        }
+
+        if( has_opt )
+        {
+            OUTMSG(("--%s%n", option, &n));
+            msgc += n;
+        }
+
+        if( param != NULL)
+        {
+            OUTMSG((" <%s>%n", param, &n));
+            msgc += n;
+        }
+
+        print_indented( msgc, MSG_INDENT, MSG_MAXLEN, msgs );
+    }
+}
+
+void CC HelpParamLine (const char * param, const char * const * msgs)
+{
+    int msgc;
+    const char * msg;
+
+    msg = *msgs++;
+
+    if (param)
+    {
+        OUTMSG (("%*s%s%n", INDENT, " ", param, &msgc));
+	if (msg == NULL)
+	    OUTMSG (("\n"));
+	else
+	{
+	    OUTMSG (("%*s%s\n", MSG_INDENT-msgc, " ", msg));
+	}
+    }
+    if (msg != NULL)
+	while ((msg = *msgs++) != NULL)
+	    OUTMSG (("%*s%s\n", MSG_INDENT, " ", msg));
+}
+
+void CC HelpOptionsStandard(void){
+    HelpOptionLine(ALIAS_HELP1    ,OPTION_HELP     , NULL    , help_usage);
+
+    HelpOptionLine(ALIAS_VERSION  ,OPTION_VERSION  , NULL    , version_usage);
+
+    gen_log_usage(log_usage);
+    HelpOptionLine(ALIAS_LOG_LEVEL,OPTION_LOG_LEVEL, "level" , log_usage);
+
+    HelpOptionLine(ALIAS_VERBOSE  ,OPTION_VERBOSE  , NULL    , verbose_usage);
+    HelpOptionLine(ALIAS_QUIET    ,OPTION_QUIET    , NULL    , quiet_usage);
+#if USE_OPTFILE
+    HelpOptionLine(ALIAS_OPTFILE  ,OPTION_OPTFILE  , "file"  , optfile_usage);
+#endif
+#if _DEBUGGING
+    HelpOptionLine(ALIAS_DEBUG    ,OPTION_DEBUG, "Module[-Flag]", debug_usage); 
+#endif
+}
+
+
+void CC HelpOptionsReport (void)
+{
+    HelpOptionLine (ALIAS_REPORT, OPTION_REPORT, "type", report_usage);
+}
+
+
+rc_t CC MiniUsage (const Args * args)
+{
+    KWrtWriter w;
+    void * d;
+    const char * progname;
+    rc_t rc;
+
+    w = KOutWriterGet();
+    d = KOutDataGet();
+
+    rc = ArgsProgram (args, NULL, &progname);
+    if (rc)
+        progname = UsageDefaultName;
+    KOutHandlerSetStdErr();
+    UsageSummary (progname);
+    KOutMsg ("\nUse option --help for more information.\n\n");
+
+    KOutHandlerSet (w,d);
+
+    return rc;
+}
+
+
+bool CC Is32BitAndDisplayMessage( void )
+{
+#if _ARCH_BITS == 32
+    KOutMsg ( "\nThis tool cannot run in a 32-bit environment,\nplease use the 64-bit version of this tool\n\n" );
+    return true;
+#else
+    return false;
+#endif
+}
diff --git a/libs/kapp/args_debug.h b/libs/kapp/args_debug.h
new file mode 100644
index 0000000..ea4c509
--- /dev/null
+++ b/libs/kapp/args_debug.h
@@ -0,0 +1,47 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#ifndef _h_args_priv_libs_
+#define _h_args_priv_libs_
+
+#include <klib/debug.h>
+
+#if _DEBUGGING
+
+#define ARGS_DBGF(msg) DBGMSG(DBG_ARGS, DBG_FLAG(DBG_ARGS_WRITER), msg)
+#define ARGS_DBG(fmt, ...) ARGS_DBGF(("%s:%u: " fmt "\n", __func__, __LINE__, __VA_ARGS__))
+#define ARGS_DBGERR(rc) if(rc != 0) {ARGS_DBGF(("%s:%u: %R\n", __func__, __LINE__, rc));}
+#define ARGS_DBGERRP(fmt, rc, ...) if(rc != 0) {ARGS_DBGF(("%s:%u: %R " fmt "\n", __func__, __LINE__, rc, __VA_ARGS__));}
+
+#else
+
+#define ARGS_DBGF(msg) ((void)0)
+#define ARGS_DBG(fmt, ...) ((void)0)
+#define ARGS_DBGERR(rc) ((void)0)
+#define ARGS_DBGERRP(fmt, rc, ...) ((void)0)
+
+#endif
+
+#endif
diff --git a/libs/kapp/linux/ram.c b/libs/kapp/linux/ram.c
new file mode 100644
index 0000000..47ccfb0
--- /dev/null
+++ b/libs/kapp/linux/ram.c
@@ -0,0 +1,79 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "../main-priv.h"
+#include <kapp/main.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+
+/* KAppGetTotalRam
+ *  Linux specific function of getting amount of RAM
+ */
+rc_t KAppGetTotalRam ( uint64_t * totalRam )
+{
+    rc_t rc;
+
+    long numPages;
+    long pageSize;
+
+    assert ( totalRam != 0 );
+
+    numPages = sysconf( _SC_PHYS_PAGES );
+    if ( numPages < 0 )
+    {
+		int status = errno;
+        rc = RC ( rcApp, rcNoTarg, rcInitializing, rcMemory, rcFailed );
+        PLOGERR ( klogFatal, ( klogFatal, rc,
+					"failed to retrieve number of RAM pages. error code: $(status) - $(msg)"
+                    , "status=%d,msg=%!"
+                    , status, status 
+                        ));
+        return rc;
+    }
+
+    pageSize = sysconf( _SC_PAGESIZE );
+    if ( pageSize < 0 )
+    {
+		int status = errno;
+        rc = RC ( rcApp, rcNoTarg, rcInitializing, rcMemory, rcFailed );
+        PLOGERR ( klogFatal, (klogFatal, rc,
+                    "failed to retrieve RAM page size. error code: $(status) - $(msg)"
+                    , "status=%d,msg=%!"
+                    , status, status
+                        ));
+        return rc;
+    }
+
+    *totalRam = (uint64_t) pageSize * numPages;
+
+    return 0;
+}
diff --git a/libs/kapp/loader-file.c b/libs/kapp/loader-file.c
new file mode 100644
index 0000000..b68b429
--- /dev/null
+++ b/libs/kapp/loader-file.c
@@ -0,0 +1,643 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+#include <kapp/extern.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kfs/bzip.h>
+#include <kfs/gzip.h>
+#include <kapp/progressbar.h>
+#include <kapp/queue-file.h>
+
+#include <kapp/loader-file.h>
+#define KFILE_IMPL KLoaderFile
+#include <kfs/impl.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <os-native.h> /* for strdup on Windows */
+
+#define DBG(msg) DBGMSG(DBG_LOADLIB,DBG_FLAG(DBG_LOADLIB_FILE), msg)
+
+#if _DEBUGGING
+#   ifndef KLoaderFile_BUFFERSIZE
+#       define KLoaderFile_BUFFERSIZE (64 * 1024 * 1024)
+#   endif
+#else
+#   undef KLoaderFile_BUFFERSIZE
+#   define KLoaderFile_BUFFERSIZE (64 * 1024 * 1024)
+#endif
+
+struct KLoaderFile
+{
+    KFile dad;
+    /* physical file */
+    uint64_t kfile_pos;
+    const KFile* kfile;
+    const KLoadProgressbar* job;
+
+    const KFile* file;
+    const KDirectory* dir;
+    char* filename;
+    char* realname;
+    bool has_md5;
+    bool ahead;
+    uint8_t md5_digest[16];
+
+    /* current file */
+    enum {
+        compress_none = 0,
+        compress_gzip,
+        compress_bzip2
+    } compress_type;
+    uint64_t pos;
+    bool eof;
+    uint32_t eol; /* next line start in buffer (next symbol after previously detected eol) */
+    uint64_t line_no;
+
+    /* file buffer */
+    uint8_t *buffer_pos;
+    uint32_t avail;
+    uint8_t *buffer;
+    size_t buffer_size;
+#if _DEBUGGING
+    uint32_t small_reads; /* used to detect ineffective reads from file */
+#endif
+};
+
+static
+rc_t CC KLoaderFile_Destroy(KLoaderFile* self)
+{
+    if( self != NULL ) {
+        DBG(("%s %s\n", __func__, self->realname));
+        KFileRelease(self->kfile);
+        self->kfile = NULL;
+    }
+    return 0;
+}
+
+static
+struct KSysFile* CC KLoaderFile_GetSysFile(const KLoaderFile *self, uint64_t *offset)
+{
+    return KFileGetSysFile(self ? self->kfile : NULL, offset);
+}
+
+static
+rc_t CC KLoaderFile_RandomAccess(const KLoaderFile *self)
+{
+    return KFileRandomAccess(self ? self->kfile : NULL);
+}
+
+static
+uint32_t CC KLoaderFile_Type(const KLoaderFile *self)
+{
+    if( self && self->kfile ) {
+        return KFileType(self->kfile);
+    }
+    return KDirectoryPathType(self ? self->dir : NULL, "%s", self->realname);
+}
+
+static
+rc_t CC KLoaderFile_Size(const KLoaderFile *self, uint64_t *size)
+{
+    if( self && self->kfile ) {
+        return KFileSize(self->kfile, size);
+    }
+    return KDirectoryFileSize(self ? self->dir : NULL, size, "%s", self->realname);
+}
+
+static
+rc_t CC KLoaderFile_SetSize(KLoaderFile *self, uint64_t size)
+{
+    return RC(rcApp, rcFile, rcUpdating, rcInterface, rcUnsupported);
+}
+
+static
+rc_t CC KLoaderFile_ReadKFile(const KLoaderFile* cself, uint64_t pos, void *buffer, size_t size, size_t *num_read)
+{
+    rc_t rc = KFileRead(cself ? cself->kfile : NULL, pos, buffer, size, num_read);
+    DBG(("%s: %s: %lu\n", __func__, cself->realname, *num_read));
+    if( rc == 0 && cself->job != NULL ) {
+        if( pos > cself->kfile_pos ) {
+            rc = KLoadProgressbar_Process(cself->job, pos - cself->kfile_pos, false);
+            ((KLoaderFile*)cself)->kfile_pos = pos;
+        }
+        pos += *num_read;
+        if( pos > cself->kfile_pos ) {
+            rc = KLoadProgressbar_Process(cself->job, pos - cself->kfile_pos, false);
+            ((KLoaderFile*)cself)->kfile_pos= pos;
+        }
+    }
+    return rc;
+}
+
+static
+rc_t CC KLoaderFile_WriteKFile(KLoaderFile *self, uint64_t pos, const void *buffer, size_t size, size_t *num_writ)
+{
+    return RC(rcApp, rcFile, rcWriting, rcInterface, rcUnsupported);
+}
+
+static KFile_vt_v1 KLoaderFile_vtbl = {
+    1, 1,
+    KLoaderFile_Destroy,
+    KLoaderFile_GetSysFile,
+    KLoaderFile_RandomAccess,
+    KLoaderFile_Size,
+    KLoaderFile_SetSize,
+    KLoaderFile_ReadKFile,
+    KLoaderFile_WriteKFile,
+    KLoaderFile_Type
+};
+
+static
+rc_t KLoaderFile_Open(KLoaderFile* self)
+{
+    rc_t rc = 0;
+
+    DBG(("%s opening %s\n", __func__, self->realname));
+    if( (rc = KDirectoryOpenFileRead(self->dir, &self->kfile, "%s", self->realname)) == 0 ) {
+        if( self->has_md5 ) {
+            const KFile *md5File = NULL;
+            DBG(("%s opening as md5 wrapped %s\n", __func__, self->realname));
+            if( (rc = KFileMakeMD5Read(&md5File, self->file, self->md5_digest)) == 0) {
+                self->file = md5File;
+            }
+        }
+        if( rc == 0 ) {
+            const KFile *z = NULL;
+            switch(self->compress_type) {
+                case compress_none:
+                    break;
+                case compress_gzip:
+                    DBG(("%s opening as gzip wrapped %s\n", __func__, self->realname));
+                    if( (rc = KFileMakeGzipForRead(&z, self->file)) == 0 ) {
+                        KFileRelease(self->file);
+                        self->file = z;
+                    }
+                    break;
+                case compress_bzip2:
+                    DBG(("%s opening as bzip2 wrapped %s\n", __func__, self->realname));
+                    if( (rc = KFileMakeBzip2ForRead(&z, self->file)) == 0 ) {
+                        KFileRelease(self->file);
+                        self->file = z;
+                    }
+                    break;
+                default:
+                    rc = RC(rcApp, rcFile, rcOpening, rcType, rcUnexpected);
+                    break;
+            }
+#if ! WINDOWS
+            if( rc == 0 && self->ahead ) {
+                const KFile *z = NULL;
+                if( (rc = KQueueFileMakeRead(&z, self->pos, self->file,
+                                             self->buffer_size * 10,  self->buffer_size, 0)) == 0 ) {
+                    KFileRelease(self->file);
+                    self->file = z;
+                }
+            }
+#endif
+        }
+    }
+    if( rc != 0 ) {
+        PLOGERR(klogErr, (klogErr, rc, "opening $(file)", PLOG_S(file), self->filename));
+        KFileRelease(self->file);
+    }
+    return rc;
+}
+
+/* Fill
+ *  fill buffer as far as possible, shift unread data in buffer to buffer start
+ */
+static
+rc_t KLoaderFile_Fill(KLoaderFile *self)
+{
+    rc_t rc = 0;
+
+    if (self->kfile == NULL) {
+        rc = KLoaderFile_Open(self);
+    }
+    if( rc == 0 ) {
+        /* determine space in buffer available */
+        size_t to_read = self->buffer_size - self->avail;
+        if( to_read > 0 ) {
+#if _DEBUGGING
+            if( to_read < self->buffer_size * 0.5 ) {
+                self->small_reads++;
+                if( self->small_reads > 10 ) {
+                    PLOGMSG(klogWarn, (klogWarn, "$(filename) INEFFECTIVE READING: $(times) times, now $(bytes) bytes",
+                        PLOG_3(PLOG_S(filename),PLOG_U32(times),PLOG_U32(bytes)), self->filename, self->small_reads, to_read));
+                }
+            }
+#endif
+            /* shift left unread data */
+            memmove(self->buffer, self->buffer_pos, self->avail);
+            /* skip read chunk in buffer */
+            self->pos += self->buffer_pos - self->buffer;
+            /* reset pointer */
+            self->buffer_pos = self->buffer;
+            do { /* fill buffer up to eof */
+                size_t num_read = 0;
+                if( (rc = KFileRead(self->file, self->pos + self->avail,
+                                    &self->buffer[self->avail], to_read, &num_read)) == 0 ) {
+                    self->eof = (num_read == 0);
+                    self->avail += (uint32_t) num_read;
+                    to_read -= num_read;
+                    DBG(("KLoaderFile read %s from %lu %u bytes%s\n",
+                         self->filename, self->pos + self->avail - num_read, num_read, self->eof ? " EOF" : ""));
+                }
+            } while( rc == 0 && to_read > 0 && !self->eof );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_IsEof(const KLoaderFile* cself, bool* eof)
+{
+    if( cself == NULL || eof == NULL ) {
+        return RC(rcApp, rcFile, rcConstructing, rcParam, rcNull);
+    }
+    /* end of file is when file is at eof and nothing in buffer or last readline returned the buffer */
+    *eof = cself->eof && ((cself->avail - cself->eol) == 0);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_Close(const KLoaderFile* cself)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL ) {
+        rc = RC(rcApp, rcFile, rcConstructing, rcParam, rcNull);
+    } else {
+        /* TBD possible delays if file has md5 set */
+        DBG(("%s closing %s\n", __func__, cself->realname));
+        rc = KFileRelease(cself->file);
+        KFileAddRef(&cself->dad);
+        ((KLoaderFile*)cself)->file = &cself->dad;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_Reset(const KLoaderFile* cself)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL ) {
+        rc = RC(rcApp, rcFile, rcConstructing, rcParam, rcNull);
+    } else {
+        KLoaderFile* self = (KLoaderFile*)cself;
+        if( cself->pos != 0 && (cself->ahead || cself->compress_type != compress_none) ) {
+            /* threaded buffering || data in buffer is not first portion of the file */
+            rc = KLoaderFile_Close(cself);
+            self->avail = 0;
+            self->buffer[0] = 0;
+            self->eof = false;
+        } else {
+            self->avail += (uint32_t) ( self->buffer_pos - self->buffer );
+        }
+        self->pos = 0;
+        self->eol = 0;
+        self->line_no = 0;
+        self->buffer_pos = self->buffer;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_SetReadAhead(const KLoaderFile* cself, bool read_ahead)
+{
+    if( cself == NULL ) {
+        return RC(rcApp, rcFile, rcConstructing, rcParam, rcNull);
+    }
+#if ! WINDOWS
+    ((KLoaderFile*)cself)->ahead = read_ahead;
+#endif
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_LOG(const KLoaderFile* cself, KLogLevel lvl, rc_t rc, const char *msg, const char *fmt, ...)
+{
+    va_list args;
+    va_start(args, fmt);
+    rc = KLoaderFile_VLOG(cself, lvl, rc, msg, fmt, args);
+    va_end(args);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_VLOG(const KLoaderFile* cself, KLogLevel lvl, rc_t rc, const char *msg, const char *fmt, va_list args)
+{
+    if( cself == NULL || (msg == NULL && rc == 0) ) {
+        rc = RC(rcApp, rcFile, rcAccessing, rcParam, rcInvalid);
+        LOGERR(klogErr, rc, __func__);
+    }  else if( msg == NULL && rc != 0 ) {
+        if( cself->line_no == 0 ) {
+            PLOGERR(lvl, (lvl, rc, "$(file):$(offset)", "file=%s,offset=%lu", cself->filename, cself->pos));
+        } else {
+            PLOGERR(lvl, (lvl, rc, "$(file):$(line)", "file=%s,line=%lu", cself->filename, cself->line_no));
+        }
+    } else {
+        rc_t fmt_rc;
+        char xfmt[4096];
+        const char* f = fmt ? fmt : "";
+        const char* c = fmt ? "," : "";
+
+        if( cself->line_no == 0 ) {
+            fmt_rc = string_printf(xfmt, sizeof xfmt, NULL, "file=%s,offset=%lu%s%s", cself->filename, cself->pos, c, f);
+        } else {
+            fmt_rc = string_printf(xfmt, sizeof xfmt, NULL, "file=%s,line=%lu%s%s", cself->filename, cself->line_no, c, f);
+        }
+        if ( fmt_rc == 0 ) {
+            fmt = xfmt;
+        }
+        if( rc == 0 ) {
+            VLOGMSG(lvl, (lvl, msg, fmt, args));
+        } else {
+            VLOGERR(lvl, (lvl, rc, msg, fmt, args));
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_Offset(const KLoaderFile* cself, uint64_t* offset)
+{
+    if( cself == NULL || offset == NULL ) {
+        return RC(rcApp, rcFile, rcConstructing, rcParam, rcNull);
+    }
+    *offset = cself->pos + (cself->buffer_pos - cself->buffer);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_Line(const KLoaderFile* cself, uint64_t* line)
+{
+    if( cself == NULL || line == NULL ) {
+        return RC(rcApp, rcFile, rcConstructing, rcParam, rcNull);
+    }
+    *line = cself->line_no;
+    return 0;
+}
+
+static
+rc_t KLoaderFile_AllocateBuffer(KLoaderFile *self)
+{
+    self->buffer_size = KLoaderFile_BUFFERSIZE;
+    if( (self->buffer = malloc(self->buffer_size)) == NULL ) {
+        self->buffer_size = 0;
+        return RC(rcApp, rcFile, rcConstructing, rcMemory, rcExhausted);
+    }
+    self->buffer[0] = 0;
+    self->buffer_pos = self->buffer;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_Readline(const KLoaderFile* cself, const void** buffer, size_t* length)
+{
+    rc_t rc = 0;
+
+    if(cself == NULL || buffer == NULL || length == NULL) {
+        rc = RC( rcApp, rcFile, rcAccessing, rcParam, rcNull);
+    } else {
+        KLoaderFile *self = (KLoaderFile*)cself;
+        uint8_t* nl;
+        bool refilled = false;
+        bool eof;
+
+        rc = KLoaderFile_IsEof(cself, &eof);
+        if( rc == 0 && eof ) {
+            *buffer = NULL;
+            return 0;
+        }
+
+        while( rc == 0 ) {
+            bool CR_last = false;
+            int i, cnt = self->avail - self->eol;
+            uint8_t* buf = &self->buffer_pos[self->eol];
+            *buffer = buf;
+            /* find first eol from current position */
+            for(nl = NULL, i = 0; i < cnt && nl == NULL; i++) {
+                if(buf[i] == '\n' || buf[i] == '\r') {
+                    nl = &buf[i];
+                }
+            }
+            if( nl != NULL || refilled ) {
+                break;
+            }
+            refilled = true;
+            /* none found we need to push out processed portion and load full buffer */
+            if( self->eol > 0 ) {
+                /* mark that line ended on buffer end and last char in buffer is \r */
+                CR_last = self->eol == self->avail && self->buffer_pos[self->eol - 1] == '\r';
+                self->buffer_pos += self->eol;
+                self->avail -= self->eol;
+                self->eol = 0;
+            }
+            if( (rc = KLoaderFile_Fill(self)) == 0 ) {
+                if( CR_last && self->buffer_pos[0] == '\n' ) {
+                    /* in previous chunk last char was \r and in next chunk 1st char is \n
+                    this is \r\n seq split by buffer, need to ignore \n */
+                    self->eol++;
+                }
+            }
+        }
+        if( rc == 0 ) {
+            if( nl == NULL ) {
+                self->eol = self->avail;
+                *length = self->avail;
+                if( self->buffer_size == self->avail ) {
+                    /* buffer could be copied and next call will provide tail of line */
+                    rc = RC( rcApp, rcFile, rcReading, rcString, rcTooLong);
+                }
+            } else {
+                *length = nl - (uint8_t*)*buffer;
+                self->eol = (uint32_t) ( nl - self->buffer_pos + 1 );
+                if( *nl == '\r' && nl < &self->buffer[self->buffer_size - 1] && *(nl + 1) == '\n' ) {
+                    /* \r\n */
+                    self->eol++;
+                }
+                self->line_no++;
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_Read(const KLoaderFile* cself, size_t advance, size_t size, const void** buffer, size_t* length)
+{
+    rc_t rc = 0;
+
+    if (cself == NULL || buffer == NULL || length == NULL ) {
+        return RC(rcApp, rcFile, rcPositioning, rcSelf, rcNull);
+    } else {
+        KLoaderFile* self = (KLoaderFile*)cself;
+        if( advance > 0 ) {
+            if(advance >= self->avail) {
+                self->pos += advance;
+                self->avail = 0;
+                self->eol = 0;
+            } else {
+                self->buffer_pos += advance;
+                self->avail -= (uint32_t) advance;
+                self->eol = (uint32_t) ( self->eol > advance ? self->eol - advance : 0 );
+            }
+        }
+        if( size > self->avail || self->avail == 0 ) {
+            rc = KLoaderFile_Fill(self);
+        }
+        if( rc == 0 ) {
+            *buffer = self->buffer_pos;
+            *length = self->avail;
+            if( self->avail == 0 && self->eof ) {
+                *buffer = NULL;
+            } else if( size > self->avail ) {
+                if( !self->eof ) {
+                    rc = RC( rcApp, rcFile, rcReading, rcBuffer, rcInsufficient);
+                }
+            } else if( size > 0 ) {
+                *length = size;
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_Name(const KLoaderFile *self, const char **name)
+{
+    if( self == NULL || name == NULL ) {
+        return RC(rcApp, rcFile, rcAccessing, rcParam, rcNull);
+    }
+    *name = self->filename;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_FullName(const KLoaderFile *self, const char **name)
+{
+    if( self == NULL || name == NULL ) {
+        return RC(rcApp, rcFile, rcAccessing, rcParam, rcNull);
+    } else {
+        *name = self->realname;
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_ResolveName(const KLoaderFile *self, char *resolved, size_t rsize)
+{
+    if( self == NULL || resolved == NULL ) {
+        return RC(rcApp, rcFile, rcAccessing, rcParam, rcNull);
+    }
+    return KDirectoryResolvePath(self->dir, true, resolved, rsize, "%s", self->realname);
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_Release(const KLoaderFile* cself, bool exclude_from_progress)
+{
+    rc_t rc = 0;
+
+    if( cself != NULL ) {
+        KLoaderFile* self = (KLoaderFile*)cself;
+        DBG(("%s: '%s'%s\n", __func__, cself->filename, exclude_from_progress ? " excluded" : ""));
+        /* may return md5 check error here */
+        if( (rc = KFileRelease(self->file)) == 0 && !exclude_from_progress ) {
+            PLOGMSG(klogInt, (klogInfo, "done file $(file) $(bytes) bytes",
+                    "severity=file,file=%s,bytes=%lu",
+                    self->filename, self->pos + (self->buffer_pos - self->buffer)));
+        }
+        KLoadProgressbar_Release(self->job, exclude_from_progress);
+        KDirectoryRelease(self->dir);
+        free(self->filename);
+        free(self->realname);
+        free(self->buffer);
+        free(self);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLoaderFile_Make(const KLoaderFile **file, const KDirectory* dir, const char* filename,
+                                    const uint8_t* md5_digest, bool read_ahead)
+{
+    rc_t rc = 0;
+    KLoaderFile* obj = NULL;
+
+    if( file == NULL || dir == NULL || filename == NULL ) {
+        rc = RC(rcApp, rcFile, rcConstructing, rcParam, rcNull);
+    } else {
+        *file = NULL;
+        if( (obj = calloc(1, sizeof(*obj))) == NULL ||
+            (obj->filename = strdup(filename)) == NULL ) {
+            rc = RC(rcApp, rcFile, rcConstructing, rcMemory, rcExhausted);
+        } else {
+            if( (rc = KDirectoryAddRef(dir)) == 0 ) {
+                obj->dir = dir;
+                if( md5_digest != NULL ) {
+                    obj->has_md5 = true;
+                    memmove(obj->md5_digest, md5_digest, sizeof(obj->md5_digest));
+                }
+                if( (rc = KLoaderFile_AllocateBuffer(obj)) == 0 ) {
+                    char resolved[4096];
+                    char* ext = NULL;
+
+                    strcpy(resolved, filename);
+                    ext = strrchr(resolved, '.');
+                    DBG(("%s adding %s\n", __func__, resolved));
+                    rc = KLoadProgressbar_File(&obj->job, resolved, obj->dir);
+                    if( ext != NULL && strcmp(ext, ".gz") == 0 ) {
+                        obj->compress_type = compress_gzip;
+                    } else if( ext != NULL && strcmp(ext, ".bz2") == 0 ) {
+                        obj->compress_type = compress_bzip2;
+                    }
+                    if( rc != 0 && obj->compress_type != compress_none ) {
+                        *ext = '\0';
+                        DBG(("%s retry adding as %s\n", __func__, resolved));
+                        if( (rc = KLoadProgressbar_File(&obj->job, resolved, obj->dir)) == 0 ) {
+                            obj->has_md5 = false;
+                            obj->compress_type = compress_none;
+                        }
+                    }
+                    if( rc == 0 &&
+                        (rc = KFileInit(&obj->dad, (const KFile_vt*)&KLoaderFile_vtbl, "KLoaderFile", filename, true, false)) == 0 ) {
+                        obj->file = &obj->dad;
+#if WINDOWS
+                        obj->ahead = false;
+#else
+                        obj->ahead = read_ahead;
+#endif
+                        obj->realname = strdup(resolved);
+                        if( obj->realname == NULL ) {
+                            rc = RC(rcApp, rcFile, rcConstructing, rcMemory, rcExhausted);
+                        }
+                    }
+                }
+            }
+        }
+    }
+    if( rc == 0 ) {
+        *file = obj;
+    } else {
+        *file = NULL;
+        KLoaderFile_Release(obj, false);
+    }
+    return rc;
+}
diff --git a/libs/kapp/loader-meta.c b/libs/kapp/loader-meta.c
new file mode 100644
index 0000000..fa45e78
--- /dev/null
+++ b/libs/kapp/loader-meta.c
@@ -0,0 +1,105 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/extern.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <kdb/meta.h>
+#include <kapp/loader-meta.h>
+#include <kapp/main.h>
+
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+
+static
+rc_t MakeVersion(ver_t vers, char* b, size_t bsize)
+{
+    assert(b != NULL && bsize != 0);
+    return string_printf(b, bsize, NULL, "%V", vers);
+}
+
+LIB_EXPORT rc_t CC KLoaderMeta_Write(KMDataNode* root,
+                                     const char* argv0, const char* argv0_date,
+                                     const char* app_name, ver_t app_version)
+{
+    return KLoaderMeta_WriteWithVersion ( root, argv0, argv0_date, KAppVersion(), app_name, app_version );
+}
+
+rc_t CC KLoaderMeta_WriteWithVersion(struct KMDataNode* root,
+                                     const char* argv0, const char* argv0_date, ver_t argv0_version,
+                                     const char* app_name, ver_t app_version)
+{
+    rc_t rc = 0;
+    KMDataNode *node = NULL;
+
+    if( root == NULL || argv0 == NULL || argv0_date == NULL ) {
+        rc = RC(rcApp, rcMetadata, rcWriting, rcParam, rcNull);
+    } else if( (rc = KMDataNodeOpenNodeUpdate(root, &node, "SOFTWARE")) == 0 ) {
+        char str_vers[64];
+        KMDataNode *subNode = NULL;
+        if( (rc = KMDataNodeOpenNodeUpdate(node, &subNode, "loader")) == 0 ) {
+            if( (rc = MakeVersion(argv0_version, str_vers, sizeof(str_vers))) == 0 ) {
+                rc = KMDataNodeWriteAttr(subNode, "vers", str_vers);
+            }
+            if(rc == 0) {
+                rc = KMDataNodeWriteAttr(subNode, "date", argv0_date);
+            }
+            if(rc == 0) {
+                const char* tool_name = strrchr(argv0, '/');
+                const char* r = strrchr(argv0, '\\');
+                if( tool_name != NULL && r != NULL && tool_name < r ) {
+                    tool_name = r;
+                }
+                if( tool_name++ == NULL) {
+                    tool_name = argv0;
+                }
+                rc = KMDataNodeWriteAttr(subNode, "name", tool_name);
+            }
+            KMDataNodeRelease(subNode);
+        }
+        if(rc == 0 && (rc = KMDataNodeOpenNodeUpdate(node, &subNode, "formatter")) == 0 ) {
+            if( (rc = MakeVersion(app_version, str_vers, sizeof(str_vers))) == 0 ) {
+                rc = KMDataNodeWriteAttr(subNode, "vers", str_vers);
+            }
+            if(rc == 0) {
+                rc = KMDataNodeWriteAttr(subNode, "name", app_name ? app_name : "internal");
+            }
+            KMDataNodeRelease(subNode);
+        }
+        KMDataNodeRelease(node);
+    }
+    if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(root, &node, "LOAD")) == 0 ) {
+        KMDataNode *subNode = NULL;
+        if( (rc = KMDataNodeOpenNodeUpdate(node, &subNode, "timestamp")) == 0 ) {
+            time_t t = time(NULL);
+            rc = KMDataNodeWrite(subNode, &t, sizeof(t));
+            KMDataNodeRelease(subNode);
+        }
+        KMDataNodeRelease(node);
+    }
+    return rc;
+}
diff --git a/libs/kapp/log-xml.c b/libs/kapp/log-xml.c
new file mode 100644
index 0000000..feafe0a
--- /dev/null
+++ b/libs/kapp/log-xml.c
@@ -0,0 +1,416 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/extern.h>
+#include <kapp/main.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kxml/xml.h>
+#include <kfs/file.h>
+#include <kfs/kfs-priv.h>
+#include <kfs/directory.h>
+#include <klib/rc.h>
+#include <kapp/log-xml.h>
+
+#include <os-native.h>
+
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <assert.h>
+
+#define DBG(msg) DBGMSG(DBG_LOADLIB,DBG_FLAG(DBG_LOADLIB_XLOG), msg)
+
+enum OptDefIndex {
+    eopt_file = 0,
+    eopt_fd
+};
+
+const char* XMLLogger_file_usage[] = {"produce XML-formatted log file", NULL};
+const char* XMLLogger_fd_usage[] = {NULL, "produce XML-formatted output to given file descriptor", NULL};
+
+const OptDef XMLLogger_Args[] =
+{
+    {"xml-log", "z", NULL, XMLLogger_file_usage, 1, true, false},
+    {"xml-log-fd", NULL, NULL, XMLLogger_fd_usage, 1, true, false}
+};
+const size_t XMLLogger_ArgsQty = sizeof(XMLLogger_Args) / sizeof(XMLLogger_Args[0]);
+
+typedef struct XMLFormatterFile
+{
+    KFile* file;
+    uint64_t pos;
+} XMLFormatterFile;
+
+typedef struct XMLFormatterData
+{
+    XMLFormatterFile* file;
+    KFmtHandler fmt;
+    KWrtHandler wrt;
+} XMLFormatterData;
+
+struct XMLLogger {
+    XMLFormatterFile file;
+    XMLFormatterData log;
+    XMLFormatterData loglib;
+    XMLFormatterData sts;
+    XMLFormatterData stslib;
+};
+
+LIB_EXPORT
+rc_t CC XMLLogger_Encode(const char* src, char *dst, size_t dst_sz, size_t *num_writ)
+{
+    rc_t rc = 0;
+
+    if( src == NULL || dst == NULL || num_writ == NULL ) {
+        rc = RC(rcApp, rcArgv, rcParsing, rcParam, rcNull);
+    } else {
+        *num_writ = 0;
+        do {
+            size_t bytes;
+            const char* p;
+            switch(*src) {
+                case '\'':
+                    bytes = 6;
+                    p = "'";
+                    break;
+                case '"':
+                    bytes = 6;
+                    p = """;
+                    break;
+                case '&':
+                    bytes = 5;
+                    p = "&";
+                    break;
+                case '<':
+                    bytes = 4;
+                    p = "<";
+                    break;
+                case '>':
+                    bytes = 4;
+                    p = ">";
+                    break;
+                default:
+                    bytes = 1;
+                    p = src;
+                    break;
+            }
+            if( (*num_writ + bytes) > dst_sz ) {
+                rc = RC(rcApp, rcLog, rcEncoding, rcBuffer, rcInsufficient);
+                break;
+            } else {
+                memmove(dst, p, bytes);
+                *num_writ = *num_writ + bytes;
+                dst += bytes;
+            }
+        } while(*src++ != '\0');
+        *num_writ = *num_writ - 1;
+    }
+    return rc;
+}
+
+static
+rc_t CC LoaderXMLFormatter( void* data, KWrtHandler* writer,
+                            size_t argc, const wrt_nvp_t args[],
+                            size_t envc, const wrt_nvp_t envs[])
+
+{
+    rc_t rc = 0;
+    size_t i, remaining, num_writ = 0;
+    XMLFormatterData* self = (XMLFormatterData*)data;
+    char buffer[4096];
+    const char* severity, *msg_val = NULL;
+    bool severity_std = false;
+    char* pbuffer;
+    const char* const tag_nvp_name = "severity";
+    const wrt_nvp_t* msg_nvp = NULL;
+    static const char* tags[] = {
+        "fatal",
+        "system",
+        "internal",
+        "error",
+        "warning",
+        "info"
+    };
+
+    msg_nvp = wrt_nvp_find(envc, envs, "message");
+    if( msg_nvp != NULL ) {
+        msg_val = msg_nvp->value;
+    }
+    severity = wrt_nvp_find_value(argc, args, tag_nvp_name);
+    if( severity == NULL ) {
+        severity = wrt_nvp_find_value(envc, envs, tag_nvp_name);
+        if( severity != NULL ) {
+            severity_std = true;
+            /* translate std severity name to full name */
+            for(i = 0; i < sizeof(tags)/sizeof(tags[0]); i++) {
+                if( strncmp(severity, tags[i], strlen(severity)) == 0 ) {
+                    severity = tags[i];
+                    break;
+                }
+            }
+        }
+    }
+    if( severity == NULL ) {
+        severity = "status";
+    }
+
+#define FIX_UP() if(rc != 0){break;} remaining -= num_writ; pbuffer += num_writ
+    
+    pbuffer = buffer;
+    remaining = sizeof(buffer);
+    do {
+        size_t k, pq = envc;
+        const wrt_nvp_t* p = envs;
+        const char* subst = NULL;
+
+        rc = LogInsertSpace("<", pbuffer, remaining, &num_writ);
+        FIX_UP();
+        rc = LogInsertSpace(severity, pbuffer, remaining, &num_writ);
+        FIX_UP();
+        /* print env first and than args! */
+        for(k = 0; rc == 0 && k < 2; k++) {
+            for(i = 0; i < pq; i++ ) {
+                if( strcmp(p[i].name, tag_nvp_name) == 0 ) {
+                    continue;
+                }
+                if( p == args ) {
+                    if( i == 0 && msg_nvp != NULL ) {
+                        /* grab args attr buffer start */
+                        subst = pbuffer;
+                    }
+                    if( severity_std ) {
+                        /* allow only specific attributes from message into xml log
+                           for LOG calls with standard severity */
+                        int x, yes = 0;
+                        static const char* allowed_attr[] = {
+                            "file", "line", "offset",
+                            "spot", "spot_name", "spotname"
+                        };
+                        for(x = 0; x < sizeof(allowed_attr)/sizeof(allowed_attr[0]); x++) {
+                            if( strcasecmp(p[i].name, allowed_attr[x]) == 0 ) {
+                                yes = 1;
+                                break;
+                            }
+                        }
+                        if( !yes ) {
+                            continue;
+                        }
+                    }
+                }
+                rc = LogInsertSpace(" ", pbuffer, remaining, &num_writ);
+                FIX_UP();
+                rc = XMLLogger_Encode(p[i].name, pbuffer, remaining, &num_writ);
+                FIX_UP();
+                rc = LogInsertSpace("=\"", pbuffer, remaining, &num_writ);
+                FIX_UP();
+                rc = XMLLogger_Encode(p[i].value, pbuffer, remaining, &num_writ);
+                FIX_UP();
+                rc = LogInsertSpace("\"", pbuffer, remaining, &num_writ);
+                FIX_UP();
+            }
+            p = args;
+            pq = argc;
+        }
+        if( subst != NULL && subst[0] != '\0' ) {
+            /* hack 'message' to print curr argv to std log as text attr="value" */
+            ((wrt_nvp_t*)msg_nvp)->value = subst + 1; /* \0 terminated pre LogInsertSpace behavior */
+            if( (rc = self->fmt.formatter(self->fmt.data, &self->wrt, 0, NULL, envc, envs)) != 0 ) {
+                break;
+            }
+            ((wrt_nvp_t*)msg_nvp)->value = msg_val;
+        }
+        rc = LogInsertSpace("/>\n", pbuffer, remaining, &num_writ);
+        FIX_UP();
+    } while(false);
+
+    if( self->file->file != NULL ) {
+        if( rc != 0 ) {
+            pbuffer = buffer;
+            remaining = sizeof(buffer);
+            rc = string_printf(pbuffer, remaining, & num_writ, "<error severity=\"err\" message=\"XML log failed: %R\"/>\n", rc);
+            pbuffer += num_writ <= remaining ? num_writ : 0;
+        }
+        rc = KFileWrite(self->file->file, self->file->pos, buffer, pbuffer - buffer, &num_writ);
+        self->file->pos += num_writ;
+    }
+    rc = self->fmt.formatter(self->fmt.data, &self->wrt, argc, args, envc, envs);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC XMLLogger_Make(const XMLLogger** cself, KDirectory* dir, const Args *args)
+{
+    rc_t rc = 0;
+    const char* path = NULL, *sfd = NULL;
+    int fd = -1;
+    uint32_t count;
+
+    if( (rc = ArgsOptionCount(args, XMLLogger_Args[eopt_file].name, &count)) != 0 || count > 1 ) {
+        rc = rc ? rc : RC(rcApp, rcArgv, rcParsing, rcParam, rcExcessive);
+    } else if( count > 0 && (rc = ArgsOptionValue(args, XMLLogger_Args[eopt_file].name, 0, (const void **)&path)) != 0 ) {
+
+    } else if( (rc = ArgsOptionCount(args, XMLLogger_Args[eopt_fd].name, &count)) != 0 || count > 1 ) {
+        rc = rc ? rc : RC(rcApp, rcArgv, rcParsing, rcParam, rcExcessive);
+    } else if( count > 0 && (rc = ArgsOptionValue(args, XMLLogger_Args[eopt_fd].name, 0, (const void **)&sfd)) != 0 ) {
+
+    } else {
+        do {
+            long val = 0;
+            char* end = NULL;
+
+            if( sfd != NULL ) {
+                if( path != NULL ) {
+                    rc = RC(rcApp, rcArgv, rcParsing, rcParam, rcExcessive);
+                    break;
+                }
+                errno = 0;
+                val = strtol(sfd, &end, 10);
+                if( errno != 0 || sfd == end || *end != '\0' || val < 0 || val > INT_MAX ) {
+                    rc = RC(rcApp, rcArgv, rcReading, rcParam, rcInvalid);
+                    break;
+                }
+                fd = val;
+            }
+            rc = XMLLogger_Make2(cself, dir, path, fd);
+        } while( false );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC XMLLogger_Make2(const XMLLogger** self, KDirectory* dir, const char* logpath, const int fd)
+{
+    rc_t rc = 0;
+    XMLLogger* obj;
+    KDirectory* my_dir = NULL;
+
+    const uint32_t lopt = klogFmtTimestamp | klogFmtSeverity |
+                          klogFmtMessage | klogFmtAppName | klogFmtAppVersion | klogFmtReasonShort;
+
+    const uint32_t sopt = kstsFmtTimestamp | kstsFmtMessage | kstsFmtAppName | kstsFmtAppVersion;
+
+    KLogFmtFlagsSet(lopt);
+    KLogLibFmtFlagsSet(lopt);
+    KStsFmtFlagsSet(sopt);
+    KStsLibFmtFlagsSet(sopt);
+
+    obj = calloc(1, sizeof(*obj));
+    if( obj == NULL ) {
+        rc = RC(rcApp, rcLog, rcAllocating, rcMemory, rcExhausted);
+    } else if( fd < 0 && dir == NULL && (rc = KDirectoryNativeDir(&my_dir)) != 0 ) {
+    } else if( fd >= 0 && (rc = KFileMakeFDFileWrite(&obj->file.file, false, fd)) != 0 ) {
+    } else if( logpath != NULL && fd < 0 && (rc = KDirectoryCreateFile(dir ? dir : my_dir, &obj->file.file, false, 0644, kcmInit, "%s", logpath)) != 0 ) {
+    } else {
+    
+        obj->file.pos = 0;
+        obj->log.file = &obj->file;
+        obj->log.fmt.formatter = KLogFmtWriterGet();
+        obj->log.fmt.data = KLogFmtDataGet();
+        obj->log.wrt.writer = KLogWriterGet();
+        obj->log.wrt.data = KLogDataGet();
+
+        obj->loglib.file = &obj->file;
+        obj->loglib.fmt.formatter = KLogLibFmtWriterGet();
+        obj->loglib.fmt.data = KLogLibFmtDataGet();
+        obj->loglib.wrt.writer = KLogLibWriterGet();
+        obj->loglib.wrt.data = KLogLibDataGet();
+
+        obj->sts.file = &obj->file;
+        obj->sts.fmt.formatter = KStsFmtWriterGet();
+        obj->sts.fmt.data = KStsFmtDataGet();
+        obj->sts.wrt.writer = KStsWriterGet();
+        obj->sts.wrt.data = KStsDataGet();
+
+        obj->stslib.file = &obj->file;
+        obj->stslib.fmt.formatter = KStsLibFmtWriterGet();
+        obj->stslib.fmt.data = KStsLibFmtDataGet();
+        obj->stslib.wrt.writer = KStsLibWriterGet();
+        obj->stslib.wrt.data = KStsLibDataGet();
+
+        if( (rc = KLogFmtHandlerSet(LoaderXMLFormatter, lopt, &obj->log)) == 0 &&
+            (rc = KLogLibFmtHandlerSet(LoaderXMLFormatter, lopt, &obj->loglib)) == 0 &&
+            (rc = KStsFmtHandlerSet(LoaderXMLFormatter, sopt, &obj->sts)) == 0 &&
+            (rc = KStsLibFmtHandlerSet(LoaderXMLFormatter, sopt, &obj->stslib)) == 0 ) {
+            /* make log valid XML */
+            if( obj->file.file != NULL ) {
+                size_t num_writ = 0;
+                rc = KFileWrite(obj->file.file, obj->file.pos, "<Log>\n", 6, &num_writ);
+                obj->file.pos += num_writ;
+            }
+        }
+    }
+    KDirectoryRelease(my_dir);
+    if( rc == 0 ) {
+        *self = obj;
+        if( fd >= 0 ) {
+            DBG(("XML Log file set to handle %d\n", fd));
+        } else if( logpath != NULL) {
+            DBG(("XML Log file set to %s\n", logpath));
+        } 
+    } else {
+        XMLLogger_Release(obj);
+        *self = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT void CC XMLLogger_Usage(void)
+{
+    size_t i;
+    for(i = 0; i < XMLLogger_ArgsQty; i++ ) {
+        if( XMLLogger_Args[i].help[0] != NULL ) {
+            HelpOptionLine(XMLLogger_Args[i].aliases, XMLLogger_Args[i].name, "logfile", XMLLogger_Args[i].help);
+        }
+    }
+}
+
+LIB_EXPORT void CC XMLLogger_Release(const XMLLogger* cself)
+{
+    if( cself != NULL ) {
+        XMLLogger* self = (XMLLogger*)cself;
+        KLogFmtHandlerSet(self->log.fmt.formatter, 0, self->log.fmt.data);
+        KLogLibFmtHandlerSet(self->loglib.fmt.formatter, 0, self->loglib.fmt.data);
+        KLogHandlerSet(self->log.wrt.writer, self->log.wrt.data);
+        KLogLibHandlerSet(self->loglib.wrt.writer, self->loglib.wrt.data);
+        KStsFmtHandlerSet(self->sts.fmt.formatter, 0, self->sts.fmt.data);
+        KStsLibFmtHandlerSet(self->stslib.fmt.formatter, 0, self->stslib.fmt.data);
+        KStsHandlerSet(self->sts.wrt.writer, self->sts.wrt.data);
+        KStsLibHandlerSet(self->stslib.wrt.writer, self->stslib.wrt.data);
+        /* make log valid XML */
+        if( self->file.file != NULL ) {
+            if( self->file.pos > 0 ) {
+                KFileWrite(self->file.file, self->file.pos, "</Log>\n", 7, NULL);
+            }
+            KFileRelease(self->file.file);
+        }
+        free(self);
+    }
+}
diff --git a/libs/kapp/main-priv.h b/libs/kapp/main-priv.h
new file mode 100644
index 0000000..7c9c827
--- /dev/null
+++ b/libs/kapp/main-priv.h
@@ -0,0 +1,76 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_main_priv_
+#define _h_main_priv_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_kapp_extern_
+ #include <kapp/extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    
+/*--------------------------------------------------------------------------
+ * KMane
+ *  invoked by platform specific "main" entrypoint
+ */
+
+/* KMane
+ *  executable entrypoint "main" is implemented by
+ *  an OS-specific wrapper that takes care of establishing
+ *  signal handlers, logging, etc.
+ *
+ *  in turn, OS-specific "main" will invoke "KMain" as
+ *  platform independent main entrypoint.
+ *
+ *  "argc" [ IN ] - the number of textual parameters in "argv"
+ *  should never be < 0, but has been left as a signed int
+ *  for reasons of tradition.
+ *
+ *  "argv" [ IN ] - array of NUL terminated strings expected
+ *  to be in the shell-native character set: ASCII or UTF-8
+ *  element 0 is expected to be executable identity or path.
+ */
+rc_t KMane ( int argc, char *argv [] );
+
+/*KAppGetTotalRam
+ * returns total physical RAM installed in the system
+ * in bytes
+ */
+rc_t KAppGetTotalRam ( uint64_t * totalRam );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_main_priv_ */
diff --git a/libs/kapp/main.c b/libs/kapp/main.c
new file mode 100644
index 0000000..1a6ddae
--- /dev/null
+++ b/libs/kapp/main.c
@@ -0,0 +1,516 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/extern.h>
+#include "main-priv.h"
+#include <sysalloc.h>
+#include <kapp/main.h>
+#include <kfg/config.h>
+#include <kproc/procmgr.h>
+#include <klib/report.h>
+#include <klib/writer.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+#include <kns/manager.h>
+
+#if ! NO_KRSRC
+#include <kfc/except.h>
+#include <kfc/rsrc.h>
+#include <kfc/rsrc-global.h>
+#include <kfc/ctx.h>
+#endif
+
+#include <strtol.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+#if 0
+/* NextArg
+ *  extracts the next argument from a switch parameter
+ *
+ *  "arg" is an indirect pointer to somewhere within an
+ *  argument string, representing the last character parsed,
+ *  e.g. "-auv"
+ *         ^    : "arg" indicates the 'a'.
+ *  in the example given, NextArg will advance the pointer
+ *  to point to the 'u'.
+ *
+ *  had "arg" pointed instead to the 'v' above, i.e. there
+ *  are no characters remaining in "arg" to be parsed, then
+ *  an attempt to return the next element of "argv" will be
+ *  made by invoking NextArgh.
+ *
+ *  "arg" [ IN, OUT ] - current argument string as indicated above
+ *
+ *  "i" [ IN, OUT ] - loop counter. required to be < argc,
+ *  advanced if necessary to access next argument in argv.
+ *
+ *  "argc" [ IN ] - number of arguments in argv
+ *
+ *  "argv" [ IN ] - program arguments
+ *
+ *  "handle_null" [ IN, NULL OKAY ] and "data" [ IN, OPAQUE ] -
+ *  optional callback function to handle NULL arguments. default
+ *  behavior is to log error using "logerr" and invoke "exit".
+ */
+const char * CC NextArg ( const char **argp, int *i, int argc, char *argv [],
+    const char * ( CC * handle_null ) ( void *data ), void *data )
+{
+    if ( argp != NULL )
+    {
+        const char *arg = * argp;
+        if ( arg != NULL && arg [ 0 ] != 0 && arg [ 1 ] != 0 )
+        {
+            * argp = "-";
+            return arg + 1;
+        }
+        return NextArgh ( i, argc, argv, handle_null, data );
+    }
+
+    /* report a fatal error if no arg given */
+    if ( handle_null == NULL )
+    {
+        rc_t rc = RC ( rcApp, rcArgv, rcAccessing, rcParam, rcNull );
+        LOGERR ( klogFatal, ( klogFatal, rc, "internal error" ));
+        exit ( 5 );
+    }
+
+    return ( * handle_null ) ( data );
+}
+#endif
+
+rc_t CC KAppCheckEnvironment ( bool require64Bits, uint64_t requireRamSize )
+{
+    rc_t rc;
+    uint64_t totalRam;
+#if _ARCH_BITS != 64
+    if ( require64Bits )
+    {
+        rc = RC ( rcApp, rcNoTarg, rcInitializing, rcResources, rcUnsupported );
+        LOGERR ( klogFatal, rc, "can only be run as 64-bit application" );
+        return rc;
+    }
+#endif
+
+    rc = KAppGetTotalRam ( & totalRam );
+    if ( rc != 0 )
+    {
+        return rc;
+    }
+
+    if ( requireRamSize && totalRam < requireRamSize )
+    {
+        rc = RC ( rcApp, rcNoTarg, rcInitializing, rcResources, rcUnsupported );
+        PLOGERR ( klogFatal, ( klogFatal, rc,  "there is not enough RAM in the system." 
+                                           " required size: $(REQUIRED) B, present: $(PRESENT) B"
+                              , "REQUIRED=%lu,PRESENT=%lu"
+                              , requireRamSize
+                              , totalRam ) );
+        return rc;
+    }
+
+    return 0;
+}
+
+/* AsciiToXXX
+ *  replacement for atoi
+ *  converts NUL terminated string in "arg" to integer
+ *  invokes error handler if there is a format error in string
+ *
+ *  "arg" [ IN ] - NUL terminated textual representation of integer
+ *  obeys standard conversion rules:
+ *    starts with "0x" or "0X" - interpret as hex
+ *    starts with '0' - interpret as octal
+ *    otherwise - interpret as decimal
+ *
+ *  "handler_error" [ IN, NULL OKAY ] and "data" [ IN, OPAQUE ] -
+ *  optional callback function to handle case where "arg" could not
+ *  be processed in its entirety. default behavior is to log error
+ *  using "logerr" and invoke "exit".
+ */
+static
+void CC HandleAsciiToIntError ( const char *arg, void *ignore )
+{
+    rc_t rc;
+
+    if ( arg == NULL )
+        rc = RC ( rcApp, rcNumeral, rcConverting, rcString, rcNull );
+    else if ( arg [ 0 ] == 0 )
+        rc = RC ( rcApp, rcNumeral, rcConverting, rcString, rcEmpty );
+    else
+        rc = RC ( rcApp, rcNumeral, rcConverting, rcString, rcInvalid );
+
+    LOGERR ( klogFatal, rc, "expected numeral" );
+    exit ( 10 );
+}
+
+int32_t CC AsciiToI32 ( const char *arg,
+    void ( CC * handle_error ) ( const char *arg, void *data ), void *data )
+{
+    if ( handle_error == NULL )
+        handle_error = HandleAsciiToIntError;
+
+    if ( arg != NULL && arg [ 0 ] != 0 )
+    {
+        char *end;
+        long int i = strtol ( arg, & end, 0 );
+        if ( end [ 0 ] == 0 )
+        {
+            if ( sizeof i == sizeof ( int32_t ) )
+                return ( int32_t ) i;
+
+            if ( ( ( i < 0 ) && ( ( ( uint64_t ) - i ) >> 32 ) == 0 ) ||
+                 ( ( i > 0 ) && ( ( ( uint64_t ) i ) >> 32 ) == 0 ) )
+                return ( int32_t ) i;
+        }
+    }
+
+    ( * handle_error ) ( arg, data );
+    return 0;
+}
+
+uint32_t CC AsciiToU32 ( const char *arg,
+    void ( CC * handle_error ) ( const char *arg, void *data ), void *data )
+{
+    if ( handle_error == NULL )
+        handle_error = HandleAsciiToIntError;
+
+    if ( arg != NULL && arg [ 0 ] != 0 )
+    {
+        char *end;
+        unsigned long int i = strtoul ( arg, & end, 0 );
+        if ( end [ 0 ] == 0 )
+        {
+            if ( sizeof i == sizeof ( uint32_t ) )
+                return ( uint32_t ) i;
+
+            if ( ( ( ( uint64_t ) i ) >> 32 ) == 0 )
+                return ( uint32_t ) i;
+        }
+    }
+
+    ( * handle_error ) ( arg, data );
+    return 0;
+}
+
+int64_t CC AsciiToI64 ( const char *arg,
+    void ( CC * handle_error ) ( const char *arg, void *data ), void *data )
+{
+    if ( handle_error == NULL )
+        handle_error = HandleAsciiToIntError;
+
+    if ( arg != NULL && arg [ 0 ] != 0 )
+    {
+        char *end;
+        int64_t i = strtoi64 ( arg, & end, 0 );
+
+        if ( end [ 0 ] == 0 )
+            return i;
+    }
+
+    ( * handle_error ) ( arg, data );
+    return 0;
+}
+
+uint64_t CC AsciiToU64 ( const char *arg,
+    void ( CC * handle_error ) ( const char *arg, void *data ), void *data )
+{
+    if ( handle_error == NULL )
+        handle_error = HandleAsciiToIntError;
+
+    if ( arg != NULL && arg [ 0 ] != 0 )
+    {
+        char *end;
+        uint64_t i = strtou64 ( arg, & end, 0 );
+
+        if ( end [ 0 ] == 0 )
+            return i;
+    }
+
+    ( * handle_error ) ( arg, data );
+    return 0;
+}
+
+/* KLogLevelParamStrings
+ *  Used to compare against command line parameters
+ *  These must match KLogLEvel enum in log.h
+ */
+static
+void CC logLevelFromString ( const char * str, void *data )
+{
+    KLogLevel ix;
+    const char ** paramStrings;
+
+    paramStrings = KLogGetParamStrings();
+
+    for ( ix = klogLevelMin; ix <= klogLevelMax; ++ix )
+    {
+        if ( strcmp ( str, paramStrings [ ( int ) ix ] ) == 0 )
+        {
+            * ( int32_t* ) data = ix;
+            return;
+        }
+    }
+
+    /* this RC should reflect an invalid string parameter to set the log level */
+    PLOGERR ( klogFatal, ( klogFatal, RC ( rcApp, rcArgv, rcParsing, rcRange, rcInvalid ),
+                           "log level '$(lvl)' is unrecognized", "lvl=%s", str ));
+    exit ( 10 );
+}
+
+static
+rc_t LogLevelAbsolute ( const char * string )
+{
+    int32_t 	new_level;
+    int32_t	absolute_level = -1;	/* if this remains -1 then we didn't have a good symbolic string */
+
+    /* parse as if integer value but fail over to symbolic strings */
+    new_level = AsciiToU32 ( string, logLevelFromString, & absolute_level );
+
+    return KLogLevelSet( ( KLogLevel ) ( ( absolute_level == -1 ) ? new_level : absolute_level ) );
+}
+
+static
+rc_t LogLevelRelative ( const char * string )
+{
+    int32_t adjust = 0;
+    int i;
+
+    for ( i = 0; string [ i ] != 0; ++ i )
+    {
+        switch ( string [ i ] )
+        {
+        case '+':
+            ++ adjust;
+            break;
+            
+        case '-':
+            -- adjust;
+            break;
+            
+        default:
+            return RC ( rcApp, rcArgv, rcParsing, rcToken, rcUnrecognized );
+        }
+    }
+    KLogLevelAdjust(adjust);
+    return 0;
+}
+
+rc_t CC NextLogLevelCommon ( const char * level_parameter )
+{
+    if ( level_parameter == NULL )
+        return RC ( rcApp, rcArgv, rcParsing, rcString, rcNull );
+
+    if ( ( level_parameter [ 0 ] == '+' ) || ( level_parameter [ 0 ] == '-' ) )
+        return LogLevelRelative ( level_parameter );
+
+    return LogLevelAbsolute ( level_parameter );
+}
+
+#if 0
+static
+void CC HandleLogLevelError ( rc_t rc )
+{
+    LOGERR ( klogFatal, rc, "expected log level" );
+    exit ( 10 );
+}
+
+/* NextLogLevel
+ *  handle a numeric or textual argument to --log-level <level>  The --log-level is not
+ *  specified here and could be any string of the programmers choice
+ */ 
+void CC NextLogLevel ( const char ** argp,
+		    int *ip,
+		    int argc,
+		    char *argv [],
+		    const char* ( CC * handle_null ) ( void *data ), void *data )
+{
+    rc_t rc = NextLogLevelCommon ( NextArg ( argp, ip, argc, argv, handle_null, data ) );
+    if ( rc != 0 )
+    {
+        if ( handle_null != NULL )
+            ( * handle_null ) ( data );
+        else
+            HandleLogLevelError ( rc );
+    }
+}
+
+/* NextLogLevelh
+ *  handle a numeric or textual argument to --log-level <level>  The --log-level is not
+ *  specified here and could be any string of the programmers choice
+ */ 
+void CC NextLogLevelh (int *ip,
+		    int argc,
+		    char *argv [],
+		    const char* ( CC * handle_null ) ( void *data ), void *data )
+{
+    rc_t rc = NextLogLevelCommon ( NextArgh ( ip, argc, argv, handle_null, data ) );
+    if ( rc != 0 )
+    {
+        if ( handle_null != NULL )
+            ( * handle_null ) ( data );
+        else
+            HandleLogLevelError ( rc );
+    }
+}
+#endif
+
+/* KMane
+ *  executable entrypoint "main" is implemented by
+ *  an OS-specific wrapper that takes care of establishing
+ *  signal handlers, logging, etc.
+ *
+ *  in turn, OS-specific "main" will invoke "KMain" as
+ *  platform independent main entrypoint.
+ *
+ *  "argc" [ IN ] - the number of textual parameters in "argv"
+ *  should never be < 0, but has been left as a signed int
+ *  for reasons of tradition.
+ *
+ *  "argv" [ IN ] - array of NUL terminated strings expected
+ *  to be in the shell-native character set: ASCII or UTF-8
+ *  element 0 is expected to be executable identity or path.
+ */
+#if NO_KRSRC
+static
+void CC atexit_task ( void )
+{
+    KProcMgrWhack ();
+}
+#endif
+
+rc_t KMane ( int argc, char *argv [] )
+{
+    rc_t rc;
+    KNSManager * kns;
+#if NO_KRSRC
+    int status;
+#else
+    KCtx local_ctx, * ctx = & local_ctx;
+    DECLARE_FUNC_LOC ( rcExe, rcProcess, rcExecuting );
+#endif
+
+    /* get application version */
+    ver_t vers = KAppVersion ();
+
+    /* initialize error reporting */
+    ReportInit ( argc, argv, vers );
+
+#if NO_KRSRC
+    /* initialize cleanup tasks */
+    status = atexit ( atexit_task );
+    if ( status != 0 )
+        return SILENT_RC ( rcApp, rcNoTarg, rcInitializing, rcFunction, rcNotAvailable );
+
+    /* initialize proc mgr */
+    rc = KProcMgrInit ();
+    if ( rc != 0 )
+        return rc;
+
+    kns = ( KNSManager* ) ( size_t ) -1;
+#else
+    ON_FAIL ( KRsrcGlobalInit ( & local_ctx, & s_func_loc, false ) )
+    {
+        assert ( ctx -> rc != 0 );
+        return ctx -> rc;
+    }
+
+    kns = ctx -> rsrc -> kns;
+#endif
+
+    /* initialize the default User-Agent in the kns-manager to default value - using "vers" and argv[0] above strrchr '/' */
+    {
+        const char * tool = argv[ 0 ];
+        size_t tool_size = string_size ( tool );
+
+        const char * sep = string_rchr ( tool, tool_size, '/' );
+        if ( sep ++ == NULL )
+            sep = tool;
+        else
+            tool_size -= sep - tool;
+
+        sep = string_chr ( tool = sep, tool_size, '.' );
+        if ( sep != NULL )
+            tool_size = sep - tool;
+
+        KNSManagerSetUserAgent ( kns, PKGNAMESTR " sra-toolkit %.*s.%V", ( uint32_t ) tool_size, tool, vers );
+    }
+
+    /* initialize logging */
+    rc = KWrtInit(argv[0], vers);
+    if ( rc == 0 )
+        rc = KLogLibHandlerSetStdErr ();
+    if ( rc == 0 )
+        rc = KStsLibHandlerSetStdOut ();
+
+    if ( rc == 0 )
+    {
+#if KFG_COMMON_CREATION
+        KConfig *kfg;
+        rc = KConfigMake ( & kfg );
+        if ( rc == 0 )
+        {
+#endif
+            rc = KMain ( argc, argv );
+            if ( rc != 0 )
+            {
+
+#if _DEBUGGING
+                rc_t rc2;
+                uint32_t lineno;
+                const char *filename, *function;
+                while ( GetUnreadRCInfo ( & rc2, & filename, & function, & lineno ) )
+                {
+                    pLogErr ( klogWarn, rc2, "$(filename):$(lineno) within $(function)"
+                              , "filename=%s,lineno=%u,function=%s"
+                              , filename
+                              , lineno
+                              , function
+                        );
+                }
+#endif
+
+            }
+#if KFG_COMMON_CREATION
+            KConfigRelease ( kfg );
+        }
+#endif
+    }
+
+    /* finalize error reporting */
+    ReportSilence ();
+    ReportFinalize ( rc );
+
+#if ! NO_KRSRC
+    KRsrcGlobalWhack ( ctx );
+#endif
+
+    return rc;
+}
diff --git a/libs/kapp/progressbar.c b/libs/kapp/progressbar.c
new file mode 100644
index 0000000..4eb07a0
--- /dev/null
+++ b/libs/kapp/progressbar.c
@@ -0,0 +1,199 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+#include <kapp/extern.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+#include <klib/container.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kapp/progressbar.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#define DBG(msg) DBGMSG(DBG_LOADLIB,DBG_FLAG(DBG_LOADLIB_PBAR), msg)
+
+struct KLoadProgressbar
+{
+    SLNode node;
+    bool active;
+    uint64_t used;
+    uint64_t total;
+};
+
+struct KJobs {
+    const char* severity;
+    SLList jobs;
+    uint64_t percent;
+} g_jobs =
+{
+    "status",
+    {NULL, NULL},
+    0
+};
+
+LIB_EXPORT rc_t CC KLoadProgressbar_Make(const KLoadProgressbar** cself, uint64_t size)
+{
+    rc_t rc = 0;
+    KLoadProgressbar* obj = NULL;
+
+    if( cself == NULL ) {
+        rc = RC(rcApp, rcFunction, rcConstructing, rcSelf, rcNull);
+    } else if( (obj = calloc(1, sizeof(*obj))) == NULL ) {
+        *cself = NULL;
+        rc = RC(rcApp, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    } else {
+        DBG(("%s: %p %lu\n", __func__, obj, size));
+        SLListPushTail(&g_jobs.jobs, &obj->node);
+        *cself = obj;
+        obj->active = true;
+        obj->total = size;
+    }
+    return rc;
+}
+
+static
+bool CC job_active( SLNode *n, void *data )
+{
+    return ((KLoadProgressbar*)n)->active;
+}
+
+static
+void CC job_whack( SLNode *n, void *data )
+{
+    free(n);
+}
+
+struct job_data {
+    float percent;
+    uint64_t qty;
+};
+
+static
+void CC job_percent( SLNode *node, void *data )
+{
+    const KLoadProgressbar* n = (const KLoadProgressbar*)node;
+    struct job_data* d = (struct job_data*)data;
+    if (n->used && n->total)
+        d->percent += n->used * 100 / n->total;
+    d->qty++;
+}
+
+static
+void CC job_report(bool force_report, bool final)
+{
+    struct job_data d;
+
+    memset(&d, 0, sizeof(d));
+    SLListForEach(&g_jobs.jobs, job_percent, &d);
+    d.qty = (uint64_t) (d.qty ? d.percent / d.qty : (final ? 100 : 0) );
+    if( force_report || d.qty != g_jobs.percent ) {
+        g_jobs.percent = d.qty;
+        PLOGMSG(klogInfo, (klogInfo, "processed $(percent)%",
+            "severity=%s,percent=%lu", g_jobs.severity, g_jobs.percent));
+    }
+}
+
+LIB_EXPORT void CC KLoadProgressbar_Release(const KLoadProgressbar* cself, bool exclude)
+{
+    if( cself ) {
+        KLoadProgressbar* self = (KLoadProgressbar*)cself;
+        if( exclude ) {
+            SLListUnlink(&g_jobs.jobs, &self->node);
+            free(self);
+        } else {
+            self->active = false;
+        }
+        if( !SLListDoUntil(&g_jobs.jobs, job_active, NULL) ) {
+            /* no more active jobs: make last report and drop whole list */
+            job_report(false, true);
+            SLListWhack(&g_jobs.jobs, job_whack, NULL);
+        }
+    }
+}
+
+LIB_EXPORT rc_t CC KLoadProgressbar_Append(const KLoadProgressbar* cself, uint64_t chunk)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL ) {
+        rc = RC(rcApp, rcFunction, rcWriting, rcSelf, rcNull);
+    } else {
+        uint64_t c = cself->total + chunk;
+        DBG(("%s: +%lu\n", __func__, chunk));
+        if( c >= cself->total ) {
+            ((KLoadProgressbar*)cself)->total += chunk;
+        } else {
+            rc = RC(rcApp, rcFunction, rcResizing, rcData, rcOutofrange);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLoadProgressbar_File(const KLoadProgressbar** cself, const char* filename, const KDirectory* dir)
+{
+    rc_t rc = 0;
+    uint64_t sz;
+    KDirectory* tmp = (KDirectory*)dir;
+
+    if( cself == NULL || filename == NULL ) {
+        rc = RC(rcApp, rcFunction, rcWriting, rcParam, rcNull);
+    } else if( tmp == NULL && (rc = KDirectoryNativeDir(&tmp)) != 0 ) {
+    } else if( (rc = KDirectoryFileSize(tmp, &sz, "%s", filename)) == 0 ) {
+        rc = KLoadProgressbar_Make(cself, sz);
+    }
+    if( tmp != dir ) {
+        KDirectoryRelease(tmp);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLoadProgressbar_KFile(const KLoadProgressbar** cself, const KFile* file)
+{
+    rc_t rc = 0;
+    uint64_t sz;
+
+    if( cself == NULL || file == NULL ) {
+        rc = RC(rcApp, rcFunction, rcWriting, rcParam, rcNull);
+    } else if( (rc = KFileSize(file, &sz)) == 0 ) {
+        rc = KLoadProgressbar_Make(cself, sz);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLoadProgressbar_Process(const KLoadProgressbar* cself, uint64_t chunk, bool force_report)
+{
+    rc_t rc = 0;
+
+    if( cself == NULL ) {
+        rc = RC(rcApp, rcFunction, rcLogging, rcSelf, rcNull);
+    } else {
+        ((KLoadProgressbar*)cself)->used += chunk;
+        DBG(("%s: %p +%lu %lu of %lu\n", __func__, cself, chunk, cself->used, cself->total));
+        job_report(force_report, false);
+    }
+    return rc;
+}
diff --git a/libs/kapp/queue-file.c b/libs/kapp/queue-file.c
new file mode 100644
index 0000000..9817d48
--- /dev/null
+++ b/libs/kapp/queue-file.c
@@ -0,0 +1,925 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+typedef struct KQueueFile KQueueFile;
+#define KFILE_IMPL KQueueFile
+
+#include <kapp/extern.h>
+#include <kapp/queue-file.h>
+#include <kfs/file.h>
+#include <kfs/impl.h>
+#include <kproc/timeout.h>
+#include <kproc/thread.h>
+#include <kproc/queue.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <klib/out.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#if _DEBUGGING && 0
+#define DEFAULT_BLOCK_SIZE 4 * 1024
+#define QFMSG( msg, ... ) \
+    KOutMsg ( msg, __VA_ARGS__ )
+#else
+#define DEFAULT_BLOCK_SIZE 64 * 1024
+#define QFMSG( msg, ... ) \
+    ( void ) 0
+#endif
+
+#define DEFAULT_TIMEOUT_MS 150
+
+/*--------------------------------------------------------------------------
+ * KQueueFileBuffer
+ *  a block that describes its valid bytes and position
+ */
+typedef struct KQueueFileBuffer KQueueFileBuffer;
+struct KQueueFileBuffer
+{
+    uint64_t pos;
+    size_t bytes;
+    rc_t rc;
+    uint32_t align;
+    uint8_t data [ 1 ];
+};
+
+static
+bool KQueueFileBufferContains ( const KQueueFileBuffer *self, uint64_t pos )
+{
+    if ( self != NULL )
+    {
+        if ( self -> pos <= pos && ( self -> pos + self -> bytes ) > pos )
+            return true;
+    }
+    return false;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KQueueFile
+ *  an extension to KFile that runs on a background thread
+ */
+struct KQueueFile
+{
+    KFile dad;
+
+    /* the source file's size on open */
+    uint64_t apparent_size;
+
+    /* starting position for read-ahead */
+    uint64_t start_pos;
+
+    /* the file really being accessed */
+    KFile *f;
+
+    /* buffer info */
+    KQueueFileBuffer *b;
+    size_t bsize;
+
+    /* thread and buffer queue */
+    KThread *t;
+    KQueue *q;
+
+    /* captured upon open */
+    rc_t rc_from_size_on_open;
+
+    /* timeout when queue is not responding */
+    uint32_t timeout_ms;
+};
+
+/* Whack
+ */
+static
+rc_t KQueueFileWhackRead ( KQueueFile *self )
+{
+    void *b;
+
+    /* no more reading */
+    QFMSG ( "%s: sealing queue\n", __func__ );
+    KQueueSeal ( self -> q );
+
+    /* flush the queue */
+    QFMSG ( "%s: popping queue\n", __func__ );
+    while ( KQueuePop ( self -> q, & b, NULL ) == 0 )
+    {
+        QFMSG ( "%s: dousing a buffer\n", __func__ );
+        free ( b );
+    }
+
+    /* wait for thread to exit */
+    QFMSG ( "%s: waiting for bg thread to exit\n", __func__ );
+    KThreadWait ( self -> t, NULL );
+
+    /* tear it down */
+    QFMSG ( "%s: freeing object\n", __func__ );
+    free ( self -> b );
+    KThreadRelease ( self -> t );
+    KQueueRelease ( self -> q );
+    KFileRelease ( self -> f );
+    free ( self );
+
+    return 0;
+}
+
+static
+rc_t KQueueFileFlush ( KQueueFile *self, KQueueFileBuffer *b )
+{
+    rc_t rc;
+
+    /* timeout is in mS */
+    timeout_t tm;
+    QFMSG ( "%s: initializing timeout for %,umS\n", __func__, self->timeout_ms);
+    TimeoutInit ( & tm, self->timeout_ms );
+
+    /* push buffer */
+    QFMSG ( "%s: pushing buffer...\n", __func__ );
+    rc = KQueuePush ( self -> q, b, & tm );
+    QFMSG ( "%s: ...done: rc = %R\n", __func__, rc );
+    if ( rc != 0 )
+    {
+        /* see if the bg thread exited */
+        if ( GetRCState ( rc ) == rcReadonly )
+        {
+            rc = RC ( rcApp, rcFile, rcWriting, rcTransfer, rcIncomplete );
+            QFMSG ( "%s: resetting rc to %R\n", __func__, rc );
+        }
+        return rc;
+    }
+
+    QFMSG ( "%s: forgetting about buffer\n", __func__ );
+    self -> b = NULL;
+    return 0;
+}
+
+static
+rc_t KQueueFileWhackWrite ( KQueueFile *self )
+{
+    void *b;
+    rc_t rc = 0;
+
+    /* flush last buffer */
+    if ( self -> b != NULL )
+    {
+        QFMSG ( "%s: have non-null buffer\n", __func__ );
+        if ( self -> b -> bytes != 0 )
+        {
+            QFMSG ( "%s: buffer has %zu bytes\n", __func__, self -> b -> bytes );
+            rc = KQueueFileFlush ( self, self -> b );
+        }
+
+        free ( self -> b );
+        self -> b = NULL;
+    }
+
+    /* no more writing */
+    QFMSG ( "%s: sealing queue\n", __func__ );
+    KQueueSeal ( self -> q );
+
+    /* wait for thread to exit */
+    QFMSG ( "%s: waiting for bg thread to exit\n", __func__ );
+    KThreadWait ( self -> t, NULL );
+
+    /* the file should be written
+       but flush the queue if bg thread didn't */
+    QFMSG ( "%s: popping queue\n", __func__ );
+    while ( KQueuePop ( self -> q, & b, NULL ) == 0 )
+    {
+        QFMSG ( "%s: dousing a buffer\n", __func__ );
+        free ( b );
+    }
+
+    /* tear it down */
+    QFMSG ( "%s: freeing object\n", __func__ );
+    KThreadRelease ( self -> t );
+    KQueueRelease ( self -> q );
+    KFileRelease ( self -> f );
+    free ( self );
+
+    return rc;
+}
+
+/* GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ */
+static
+struct KSysFile* CC KQueueFileGetSysFile ( const KQueueFile *self, uint64_t *offset )
+{
+    return NULL;
+}
+
+/* RandomAccess
+ *  ALMOST by definition, the file is random access
+ *
+ *  certain file types will refuse random access
+ *  these include FIFO and socket based files, but also
+ *  wrappers that require serial access ( e.g. compression )
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t CC KQueueFileRandomAccess ( const KQueueFile *self )
+{
+    return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+}
+
+/* Type
+ *  returns a KQueueFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KQueueFileType ( const KQueueFile *self )
+{
+    return kptFIFO;
+}
+
+/* Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KQueueFileSize ( const KQueueFile *self, uint64_t *size )
+{
+    * size = self -> apparent_size;
+    return self -> rc_from_size_on_open;
+}
+
+/* SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KQueueFileSetSize ( KQueueFile *self, uint64_t size )
+{
+    return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+}
+
+
+/* RunRead
+ *  runs read loop on background thread
+ */
+static
+rc_t CC KQueueFileRunRead ( const KThread *t, void *data )
+{
+    KQueueFile *self = data;
+
+    rc_t rc;
+    bool loop;
+    uint64_t pos;
+    size_t num_read;
+
+    QFMSG ( "BG: %s: running read-ahead loop\n", __func__ );
+    for ( rc = 0, loop = true, pos = self -> start_pos; loop; pos += num_read )
+    {
+        timeout_t tm;
+
+        KQueueFileBuffer *b = malloc ( sizeof * b - sizeof b -> data + self -> bsize );
+        if ( b == NULL )
+        {
+            rc = RC ( rcApp, rcFile, rcReading, rcMemory, rcExhausted );
+            QFMSG ( "BG: %s: failed to allocate %zu byte buffer\n", __func__, self -> bsize );
+            b = malloc ( sizeof * b );
+            if ( b == NULL )
+                break;
+
+            num_read = 0;
+            b -> rc = rc;
+            QFMSG ( "BG: %s: created empty buffer with rc = %R.\n", __func__, b -> rc );
+            loop = false;
+        }
+        else
+        {
+            QFMSG ( "BG: %s: reading %zu byte buffer\n", __func__, self -> bsize );
+            b -> rc = KFileReadAll ( self -> f, pos, b -> data, self -> bsize, & num_read );
+            QFMSG ( "BG: %s: read %zu bytes, rc = %R\n", __func__, num_read, b -> rc );
+            if ( b -> rc != 0 || num_read == 0 )
+                loop = false;
+        }
+
+        /* update buffer data */
+        b -> pos = pos;
+        b -> bytes = num_read;
+#if _DEBUGGING
+        b -> align = 0;
+#endif
+
+PushAgain:
+        /* timeout is in mS */
+        QFMSG ( "BG: %s: initializing timeout for %,umS\n", __func__, self->timeout_ms );
+        TimeoutInit ( & tm, self->timeout_ms );
+
+        /* push buffer */
+        QFMSG ( "BG: %s: pushing buffer...\n", __func__ );
+        rc = KQueuePush ( self -> q, b, & tm );
+        QFMSG ( "BG: %s: ...done: rc = %R\n", __func__, rc );
+        if ( rc != 0 )
+        {
+            /* if queue has been sealed by fg */
+            if ( GetRCState ( rc ) == rcReadonly )
+            {
+                rc = 0;
+                QFMSG ( "BG: %s: clearing rc\n", __func__ );
+
+            } else if( GetRCObject(rc) == ( enum RCObject )rcTimeout && GetRCState(rc) == rcExhausted ) {
+                goto PushAgain;
+            }
+            QFMSG ( "BG: %s: dousing buffer\n", __func__ );
+            free ( b );
+            break;
+        }
+    }
+    
+    /* going to exit thread */
+    QFMSG ( "BG: %s: sealing thread\n", __func__ );
+    KQueueSeal ( self -> q );
+
+    QFMSG ( "BG: %s: exit with rc = %R\n", __func__, rc );
+    return rc;
+}
+
+/* Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of file.
+ */
+static
+rc_t CC KQueueFileNoRead ( const KQueueFile *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    return RC ( rcFS, rcFile, rcReading, rcFile, rcWriteonly );
+}
+
+static
+rc_t CC KQueueFileRead ( const KQueueFile *cself, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+    size_t to_read;
+    KQueueFile *self = ( KQueueFile* ) cself;
+    KQueueFileBuffer *b = self -> b;
+
+    assert ( num_read != NULL );
+    assert ( * num_read == 0 );
+    assert ( buffer != NULL && bsize != 0 );
+
+    /* detect attempt to back up */
+    if ( b != NULL && pos < b -> pos )
+    {
+        QFMSG ( "%s: detected attempt to back up from %lu to %lu\n", __func__, b -> pos, pos );
+        return RC ( rcApp, rcFile, rcReading, rcConstraint, rcViolated );
+    }
+    
+    QFMSG ( "%s: loop to read %zu bytes at offset %lu\n", __func__, bsize, pos );
+    while ( ! KQueueFileBufferContains ( b, pos ) )
+    {
+        /* fetch next buffer */
+        KQueueFileBuffer *tmp;
+
+        /* timeout is in mS */
+        timeout_t tm;
+        QFMSG ( "%s: initializing timeout for %,umS\n", __func__, self->timeout_ms );
+        TimeoutInit ( & tm, self->timeout_ms );
+
+        /* pop buffer */
+        QFMSG ( "%s: popping buffer...\n", __func__ );
+        rc = KQueuePop ( self -> q, ( void** ) & tmp, & tm );
+        QFMSG ( "%s: ...done: rc = %R\n", __func__, rc );
+        if ( rc != 0 )
+        {
+            /* see if the bg thread is done */
+            if ( GetRCState ( rc ) == rcDone && GetRCObject ( rc ) == ( enum RCObject )rcData )
+            {
+                QFMSG ( "%s: BG thread has exited with end-of-input\n", __func__ );
+                return 0;
+            } else if( GetRCObject(rc) == ( enum RCObject )rcTimeout && GetRCState(rc) == rcExhausted ) {
+                continue; /* timeout is not a problem, try again */
+            }
+
+            QFMSG ( "%s: read failed with rc = %R\n", __func__, rc );
+            return rc;
+        }
+
+        /* queue is not supposed to be able to contain NULL */
+        assert ( tmp != NULL );
+
+        /* buffer may indicate read error or end of input */
+        if ( tmp -> rc != 0 || tmp -> bytes == 0 )
+        {
+            rc = tmp -> rc;
+            QFMSG ( "%s: BG thread has delivered %zu size buffer with rc = %R\n", __func__, tmp -> bytes, rc );
+            free ( tmp );
+            return rc;
+        }
+
+        /* free existing buffer */
+        if ( b != NULL )
+        {
+            QFMSG ( "%s: freeing buffer of %zu bytes at position %lu\n", __func__, b -> bytes, b -> pos );
+            free ( b );
+        }
+
+        /* take new buffer */
+        self -> b = b = tmp;
+        QFMSG ( "%s: caching buffer of %zu bytes at position %lu\n", __func__, b -> bytes, b -> pos );
+    }
+
+    pos -= b -> pos;
+    to_read = b -> bytes - ( size_t ) pos;
+    if ( to_read > bsize )
+        to_read = bsize;
+
+    QFMSG ( "%s: copying %zu bytes from buffer at local offset %lu\n", __func__, to_read, pos );
+    memmove ( buffer, & b -> data [ pos ], to_read );
+
+    QFMSG ( "%s: successful read\n", __func__ );
+    * num_read = to_read;
+    return 0;
+}
+
+
+/* RunWrite
+ *  runs write loop on background thread
+ */
+static
+rc_t CC KQueueFileRunWrite ( const KThread *t, void *data )
+{
+    KQueueFile *self = data;
+
+    rc_t rc;
+    do
+    {
+        size_t num_writ;
+        KQueueFileBuffer *b;
+
+        /* timeout is in mS */
+        timeout_t tm;
+        TimeoutInit ( & tm, self->timeout_ms );
+
+        /* pop buffer */
+        rc = KQueuePop ( self -> q, ( void** ) & b, & tm );
+        if ( rc != 0 )
+        {
+            /* see if the fg thread is done */
+            if ( GetRCState ( rc ) == rcDone && GetRCObject ( rc ) == ( enum RCObject )rcData )
+            {
+                rc = 0;
+            }
+            else if ( GetRCObject(rc) == ( enum RCObject )rcTimeout && GetRCState(rc) == rcExhausted )
+            {
+                rc = 0;
+                continue;
+            }
+
+            break;
+        }
+
+        /* queue won't accept NULL object references */
+        assert ( b != NULL );
+
+        /* look at buffer for end of input */
+        if ( b -> rc != 0 || b -> bytes == 0 )
+        {
+            free ( b );
+            break;
+        }
+
+        /* write to file */
+        rc = KFileWriteAll ( self -> f, b -> pos, b -> data, b -> bytes, & num_writ );
+        assert ( num_writ == b -> bytes || rc != 0 );
+
+        /* TBD - need a better way to deal with this */
+        if ( rc != 0 )
+        {
+            PLOGERR ( klogSys, ( klogSys, rc, "$(func): wrote $(num_writ) of $(bytes) bytes to file",
+                                 "func=%s,num_writ=%zu,bytes=%zu", __func__, num_writ, b -> bytes ) );
+        }
+
+        /* done with buffer */
+        free ( b );
+    }
+    while ( rc == 0 );
+
+    /* going to exit thread */
+    KQueueSeal ( self -> q );
+
+    return rc;
+}
+
+/* Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+static
+rc_t CC KQueueFileNoWrite ( KQueueFile *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    return RC ( rcApp, rcFile, rcWriting, rcFile, rcReadonly );
+}
+
+static
+rc_t CC KQueueFileWrite ( KQueueFile *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    rc_t rc;
+    size_t total, to_write;
+
+    for ( rc = 0, total = 0; total < size; pos += to_write, total += to_write )
+    {
+        /* current buffer */
+        KQueueFileBuffer *b = self -> b;
+
+        /* if we have a buffer, test for a write within bounds */
+        if ( self -> b != NULL )
+        {
+            /* an attempt to write first byte BEFORE
+               current buffer or BEYOND current contents
+               or AT current end while being full provokes
+               a flush of the current buffer */
+            if ( pos < b -> pos ||
+                 pos > b -> pos + b -> bytes ||
+                 pos == b -> pos + self -> bsize )
+            {
+                rc = KQueueFileFlush ( self, b );
+                if ( rc != 0 )
+                {   /* the background thread is probably gone */
+                    break;
+                }
+            }
+        }
+
+        /* if by now we don't have a buffer, allocate one */
+        if ( self -> b == NULL )
+        {
+            b = malloc ( sizeof * b - sizeof b -> data + self -> bsize );
+            if ( b == NULL )
+            {
+                rc = RC ( rcApp, rcFile, rcWriting, rcMemory, rcExhausted );
+                break;
+            }
+
+            self -> b = b;
+            b -> pos = pos/* + total*/;
+            b -> bytes = 0;
+            b -> rc = 0;
+#if _DEBUGGING
+            b -> align = 0;
+#endif
+        }
+
+        assert ( b != NULL );
+        assert ( b == self -> b );
+/*        assert ( pos >= b -> pos ); */
+        assert ( pos <= b -> pos + b -> bytes );
+        assert ( pos < b -> pos + self -> bsize );
+
+        /* write into the buffer */
+        to_write = size - total;
+        if ( b -> bytes + to_write > self -> bsize )
+            to_write = self -> bsize - b -> bytes;
+
+        memmove ( & b -> data [ b -> bytes ], & ( ( const uint8_t* ) buffer ) [ total ], to_write );
+        b -> bytes += to_write;
+    }
+
+
+    * num_writ = total;
+    if ( total != 0 )
+        return 0;
+
+    return rc;
+}
+
+
+static KFile_vt_v1 KQueueFileRead_vt_v1 =
+{
+    /* version 1.1 */
+    1, 1,
+
+    /* v1.0 */
+    KQueueFileWhackRead,
+    KQueueFileGetSysFile,
+    KQueueFileRandomAccess,
+    KQueueFileSize,
+    KQueueFileSetSize,
+    KQueueFileRead,
+    KQueueFileNoWrite,
+
+    /* v1.1 */
+    KQueueFileType
+};
+
+
+static KFile_vt_v1 KQueueFileWrite_vt_v1 =
+{
+    /* version 1.1 */
+    1, 1,
+
+    /* v1.0 */
+    KQueueFileWhackWrite,
+    KQueueFileGetSysFile,
+    KQueueFileRandomAccess,
+    KQueueFileSize,
+    KQueueFileSetSize,
+    KQueueFileNoRead,
+    KQueueFileWrite,
+
+    /* v1.1 */
+    KQueueFileType
+};
+
+
+/* MakeRead
+ *  make a queue file for reading-ahead on background thread
+ *
+ *  when the file is created, a background thread is started
+ *  that begins reading from "src" at position "pos", into
+ *  buffers of size "buffer_size". each buffer is pushed into
+ *  a cross-thread queue where it is consumed by the reading
+ *  thread.
+ *
+ *  the background thread is throttled by queue capacity - determined
+ *  by "queue_bytes" and "block_size", such that if the queue is full,
+ *  the thread will sleep. the consumer thread is also throttled by the
+ *  queue in that it will sleep if the queue is empty with pending data.
+ *
+ *  the background thread will exit upon reaching end of file,
+ *  upon a permanent error, or if the queue is sealed by the consumer
+ *  thread.
+ *
+ *  when the file is collected in response to a release message,
+ *  the queue will be sealed against further inserts, pending buffers
+ *  will be discarded, the background thread will be joined, and
+ *  the source file will be released.
+ *
+ *  the intended usage is serial reading of the file. reads
+ *  may only progress forward, i.e. backing up is not permitted.
+ *
+ *  "qf" [ OUT ] - return parameter for queue file
+ *
+ *  "pos" [ IN ] - starting position for reads from "src".
+ *  NB - "src" must support being addressed at this position.
+ *
+ *  "src" [ IN ] - source file for read-ahead on background thread.
+ *  must have read permissions.
+ *
+ *  "queue_bytes" [ IN ] - the read-ahead limit of the background
+ *  thread, in bytes. this is the amount of data that will be queued
+ *  for the consumer thread before the bg thread sleeps.
+ *
+ *  "block_size" [ IN, DEFAULT ZERO ] - optional parameter giving
+ *  desired block size when reading from "src". this may be used
+ *  to tune reading for source data, e.g. 64K blocks for gzip.
+ */
+LIB_EXPORT rc_t CC KQueueFileMakeRead ( const KFile **qfp, uint64_t pos,
+    const KFile *src, size_t queue_bytes, size_t block_size, uint32_t timeout_ms )
+{
+    rc_t rc;
+
+    if ( qfp == NULL )
+        rc = RC ( rcApp, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( src == NULL )
+            rc = RC ( rcApp, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! src -> read_enabled )
+        {
+            if ( src -> write_enabled )
+                rc = RC ( rcApp, rcFile, rcConstructing, rcFile, rcWriteonly );
+            else
+                rc = RC ( rcApp, rcFile, rcConstructing, rcFile, rcNoPerm );
+        }
+        else if ( pos == 0 || ( rc = KFileRandomAccess ( src ) ) == 0 )
+        {
+            KQueueFile *qf = malloc ( sizeof * qf );
+            if ( qf == NULL )
+                rc = RC ( rcApp, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KFileInit ( & qf -> dad, ( const KFile_vt* ) & KQueueFileRead_vt_v1, "KQueueFile", "no-name", true, false );
+                if ( rc == 0 )
+                {
+                    qf -> f = ( KFile* ) src;
+                    rc = KFileAddRef ( src );
+                    if ( rc == 0 )
+                    {
+                        uint32_t capacity;
+
+                        /* zero block size means default */
+                        if ( block_size == 0 )
+                            block_size = DEFAULT_BLOCK_SIZE;
+
+                        /* queue capacity is expressed in bytes originally
+                           translate to buffer count */
+                        capacity = ( queue_bytes + block_size - 1 ) / block_size;
+                        if ( capacity == 0 )
+                            capacity = 1;
+
+                        /* actual capacity will be a power of 2 */
+                        rc = KQueueMake ( & qf -> q, capacity );
+                        if ( rc == 0 )
+                        {
+                            /* capture current size if supported */
+                            qf -> rc_from_size_on_open = KFileSize ( src, & qf -> apparent_size );
+
+                            /* starting position for read */
+                            qf -> start_pos = pos;
+
+                            /* requested buffer size */
+                            qf -> b = NULL;
+                            qf -> bsize = block_size;
+
+                            /* timeout */
+                            qf -> timeout_ms = timeout_ms == 0 ? DEFAULT_TIMEOUT_MS : timeout_ms;
+
+                            /* finally, start the background thread */
+                            rc = KThreadMake ( & qf -> t, KQueueFileRunRead, qf );
+                            if ( rc == 0 )
+                            {
+                                * qfp = & qf -> dad;
+                                return 0;
+                            }
+
+                            KQueueRelease ( qf -> q );
+                        }
+
+                        KFileRelease ( qf -> f );
+                    }
+                }
+
+                free ( qf );
+            }
+        }
+
+        * qfp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* MakeWrite
+ *  make a queue file for writing-behind on background thread
+ *
+ *  when the file is created, a background thread is started that
+ *  waits for buffers to appear in the cross-thread queue. as the producer
+ *  thread writes, data are accumulated into buffers which are pushed
+ *  into the queue as they fill, and written in turn on the bg thread.
+ *
+ *  the producer thread is throttled by queue capacity - determined by
+ *  "queue_bytes" and "block_size", such that if the queue is full,
+ *  the thread will sleep. the background thread is also throttled by
+ *  the queue in that it will sleep if the queue is empty with pending
+ *  data.
+ *
+ *  the background thread will exit upon a permanent error, or if the
+ *  queue is sealed by the producer thread.
+ *
+ *  when the file is collected in response to a release message,
+ *  the queue will be sealed against further inserts, pending buffers
+ *  will be written, the background thread will be joined, and
+ *  the source file will be released.
+ *
+ *  the intended usage is serial writing of the file. random writes
+ *  will be accepted, but may reduce the queue efficiency.
+ *
+ *  "qf" [ OUT ] - return parameter for queue file
+ *
+ *  "dst" [ IN ] - destination file for write-behind on background thread.
+ *  must have write permissions.
+ *
+ *  "queue_bytes" [ IN ] - the write-behind limit of the producer
+ *  thread, in bytes. this is the amount of data that will be queued
+ *  for the background thread before the producer thread sleeps.
+ *
+ *  "block_size" [ IN, DEFAULT ZERO ] - optional parameter giving
+ *  desired block size when writing to "dst". this may be used
+ *  to tune writing for source data, e.g. 64K blocks for gzip.
+ */
+LIB_EXPORT rc_t CC KQueueFileMakeWrite ( KFile **qfp,
+    KFile *dst, size_t queue_bytes, size_t block_size, uint32_t timeout_ms )
+{
+    rc_t rc;
+
+    if ( qfp == NULL )
+        rc = RC ( rcApp, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( dst == NULL )
+            rc = RC ( rcApp, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! dst -> write_enabled )
+        {
+            if ( dst -> read_enabled )
+                rc = RC ( rcApp, rcFile, rcConstructing, rcFile, rcReadonly );
+            else
+                rc = RC ( rcApp, rcFile, rcConstructing, rcFile, rcNoPerm );
+        }
+        else
+        {
+            KQueueFile *qf = malloc ( sizeof * qf );
+            if ( qf == NULL )
+                rc = RC ( rcApp, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KFileInit ( & qf -> dad, ( const KFile_vt* ) & KQueueFileWrite_vt_v1, "KQueueFile", "no-name", false, true );
+                if ( rc == 0 )
+                {
+                    qf -> f = dst;
+                    rc = KFileAddRef ( dst );
+                    if ( rc == 0 )
+                    {
+                        uint32_t capacity;
+
+                        /* zero block size means default */
+                        if ( block_size == 0 )
+                            block_size = DEFAULT_BLOCK_SIZE;
+
+                        /* queue capacity is expressed in bytes originally
+                           translate to buffer count */
+                        capacity = ( queue_bytes + block_size - 1 ) / block_size;
+                        if ( capacity == 0 )
+                            capacity = 1;
+
+                        /* actual capacity will be a power of 2 */
+                        rc = KQueueMake ( & qf -> q, capacity );
+                        if ( rc == 0 )
+                        {
+                            /* capture current size if supported */
+                            qf -> rc_from_size_on_open = KFileSize ( dst, & qf -> apparent_size );
+
+                            /* starting position not used */
+                            qf -> start_pos = 0;
+
+                            /* requested buffer size */
+                            qf -> b = NULL;
+                            qf -> bsize = block_size;
+
+                            /* timeout */
+                            qf -> timeout_ms = timeout_ms == 0 ? DEFAULT_TIMEOUT_MS : timeout_ms;
+
+                            /* finally, start the background thread */
+                            rc = KThreadMake ( & qf -> t, KQueueFileRunWrite, qf );
+                            if ( rc == 0 )
+                            {
+                                * qfp = & qf -> dad;
+                                return 0;
+                            }
+
+                            KQueueRelease ( qf -> q );
+                        }
+
+                        KFileRelease ( qf -> f );
+                    }
+                }
+
+                free ( qf );
+            }
+        }
+
+        * qfp = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/kapp/tokenizer.c b/libs/kapp/tokenizer.c
new file mode 100644
index 0000000..1184fde
--- /dev/null
+++ b/libs/kapp/tokenizer.c
@@ -0,0 +1,525 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/extern.h>
+#include <sysalloc.h>
+
+#include <kapp/args.h>
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/text.h>
+
+#include <vfs/path.h>
+#include <vfs/manager.h>
+#include <kfs/file.h>
+
+#include <os-native.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+
+#define ARGV_INC 10
+#define TOKEN_INC 512
+
+/*
+   strtok() not used, because we tokenize the content of a file!
+   we do that in chunks of 4096 char's
+   a token can span multiple chunks!
+   we also support quoting and escaping ( a la bash )
+*/
+
+typedef struct tokenzr
+{
+    int * argc;
+    char *** argv;
+    char *token;
+    size_t allocated;
+    size_t used;
+    uint32_t state;
+    uint32_t nargs;
+    char escape[ 3 ];
+    char n_escape;
+    char m_escape;
+} tokenzr;
+
+
+static rc_t make_tokenzr( tokenzr **t, int * argc, char *** argv )
+{
+    rc_t rc = 0;
+    if ( t == NULL )
+    {
+        rc = RC( rcApp, rcNoTarg, rcConstructing, rcSelf, rcNull );
+    }
+    else
+    {
+        tokenzr *t1 = malloc( sizeof *t1 );
+        if ( t1 == NULL )
+        {
+            rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+        }
+        else
+        {
+            t1->token = malloc( TOKEN_INC );
+            if ( t1->token == NULL )
+            {
+                rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                t1->allocated = TOKEN_INC;
+                t1->used = 0;
+                t1->state = 0;
+                t1->nargs = 0;
+                t1->argc = argc;
+                t1->argv = argv;
+                t1->n_escape = 0;
+                t1->m_escape = 0;
+            }
+        }
+        if ( rc == 0 )
+        {
+            *t = t1;
+        }
+    }
+    return rc;
+}
+
+
+static void free_tokenzr( tokenzr *t )
+{
+    if ( t != NULL )
+    {
+        if ( t->token != NULL )
+            free( t->token );
+        free( t );
+    }
+}
+
+
+static rc_t expand_argv( tokenzr *t )
+{
+    rc_t rc = 0;
+    char ** pargv = *(t->argv);
+
+    if ( pargv == NULL )
+    {
+        pargv = malloc( ARGV_INC * ( sizeof pargv[ 0 ] ) );
+        if ( pargv != NULL )
+        {
+            t->nargs = ARGV_INC;
+            ( *(t->argc) ) = 0;
+        }
+        else
+            rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        if ( (uint32_t) ( *(t->argc) ) >= t->nargs )
+        {
+            char ** pargv1 = realloc( pargv, ( ( t->nargs + ARGV_INC ) * ( sizeof pargv[ 0 ] ) ) );
+            if ( pargv1 != NULL )
+            {
+                t->nargs += ARGV_INC;
+                pargv = pargv1;
+            }
+            else
+            {
+                rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+                free( pargv );
+                pargv = NULL;
+            }
+        }
+    }
+    if ( rc == 0 )
+    {
+        *(t->argv) =  pargv;
+    }
+    return rc;
+}
+
+
+static rc_t add_string_to_argv( tokenzr *t, const char * str, size_t len )
+{
+    rc_t rc = expand_argv( t );
+    if ( rc == 0 )
+    {
+        int argc = *(t->argc);
+        char ** pargv = *(t->argv);
+
+        pargv[ argc ] = string_dup ( str, len );
+        if ( pargv[ argc ] == NULL )
+            rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            ( *(t->argc) )++;
+            *(t->argv) =  pargv;
+            t->used = 0;
+        }
+    }
+    return rc;
+}
+
+
+static rc_t add_token_to_argv( tokenzr *t )
+{
+    return add_string_to_argv( t, t->token, t->used );
+}
+
+
+static rc_t add_buffer_to_token( tokenzr *t, const char *buffer, size_t buflen )
+{
+    rc_t rc = 0;
+    if ( t->used + buflen > t->allocated )
+    {
+        size_t new_size = t->used + buflen + TOKEN_INC;
+        char * temp = realloc( t->token, new_size );
+        if ( temp == NULL )
+        {
+            rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+        }
+        else
+        {
+            t->token = temp;
+            t->allocated = new_size;
+        }
+    }
+    if ( rc == 0 )
+    {
+        memmove( t->token + t->used, buffer, buflen );
+        t->used += buflen;
+    }
+    return rc;
+}
+
+
+/* this is the 'normal' state, that the buffer is divided into tokens by white-space */
+const static char delim0[] = " \r\n\f\t\v\\\"";
+static rc_t tokenize_state0( tokenzr *t, bool *done, char ** ptr, const char *buffer, size_t buflen )
+{
+    rc_t rc;
+    char * s = strpbrk ( *ptr, delim0 );
+    if ( s == NULL )
+    {
+        /* delimiting char not found!
+            ---> add everything to the tokenbuffer */
+        size_t to_add = buflen - ( *ptr - buffer );
+        rc = add_buffer_to_token( t, *ptr, to_add );
+        *done = true;
+    }
+    else
+    {
+        /* delimiting char found!
+            ---> add everything from ptr to s to the tokenbuffer
+            ---> then add token to argv
+            ---> then clear token */
+        rc = add_buffer_to_token( t, *ptr, s - *ptr );
+        if ( rc == 0 )
+        {
+            if ( t->used > 0 && *s != '\\' )
+                rc = add_token_to_argv( t );
+            *ptr = s + 1;
+            *done = ( *ptr >= buffer + buflen );
+            switch( *s )
+            {
+                case '"'  : t->state =  1; break;
+                case '\\' : t->state =  2; break;
+            }
+        }
+    }
+    return rc;
+}
+
+
+/* this state, provides 'quoting' ( prevents tokenizing by putting quotes "" around strings
+    which would be otherwise separated by whitespace ) */
+const static char delim1[] = "\"";
+static rc_t tokenize_state1( tokenzr *t, bool *done, char ** ptr, const char *buffer, size_t buflen )
+{
+    rc_t rc;
+    char * s = strpbrk ( *ptr, delim1 );
+    if ( s == NULL )
+    {
+        /* delimiting char not found!
+            ---> add everything to the tokenbuffer */
+        size_t to_add = buflen - ( *ptr - buffer );
+        rc = add_buffer_to_token( t, *ptr, to_add );
+        *done = true;
+    }
+    else
+    {
+        /* delimiting char found!
+            ---> add everything from ptr to s to the tokenbuffer
+            ---> then add token to argv
+            ---> then clear token */
+        rc = add_buffer_to_token( t, *ptr, s - *ptr );
+        if ( rc == 0 )
+        {
+            if ( t->used > 0 )
+                rc = add_token_to_argv( t );
+            *ptr = s + 1;
+            *done = ( *ptr >= buffer + buflen );
+            if ( *s == '"' )
+                t->state = 0;
+        }
+    }
+    return rc;
+}
+
+
+/* this state, provides 'escaping' ( \nnn or \xHH or \' or \" ) */
+static rc_t tokenize_state2( tokenzr *t, bool *done, char ** ptr, const char *buffer, size_t buflen )
+{
+    rc_t rc = 0;
+    char c = **ptr;
+    switch( c )
+    {
+        case '\\' : /* no break intended ! */
+        case '\'' :
+        case '\"' : rc = add_buffer_to_token( t, (*ptr)++, 1 );
+                    break;
+
+        case 't'  : rc = add_buffer_to_token( t, "\t", 1 );
+                    (*ptr)++;
+                    break;
+        case 'n'  : rc = add_buffer_to_token( t, "\n", 1 );
+                    (*ptr)++;
+                    break;
+        case 'r'  : rc = add_buffer_to_token( t, "\r", 1 );
+                    (*ptr)++;
+                    break;
+
+    }
+    t->state = 0;
+    *done = ( *ptr >= buffer + buflen );
+    return rc;
+}
+
+
+static rc_t tokenize_buffer( tokenzr *t, const char *buffer, size_t buflen )
+{
+    rc_t rc = 0;
+    char * ptr = ( char * ) buffer;
+    bool done = false;
+    while ( rc == 0 && !done )
+        switch( t->state )
+        {
+            case 0 : rc = tokenize_state0( t, &done, &ptr, buffer, buflen ); break;
+            case 1 : rc = tokenize_state1( t, &done, &ptr, buffer, buflen ); break;
+            case 2 : rc = tokenize_state2( t, &done, &ptr, buffer, buflen ); break;
+        }
+    return rc;
+}
+
+
+static rc_t tokenize_file_and_progname_into_argv( const char * filename, const char * progname,
+                                                  int * argc, char *** argv )
+{
+    rc_t rc2, rc = 0;
+    VFSManager *vfs_mgr;
+
+    ( *argv ) = NULL;
+    ( *argc ) = 0;
+    rc = VFSManagerMake ( &vfs_mgr );
+    if ( rc != 0 )
+        LOGERR( klogInt, rc, "VFSManagerMake() failed" );
+    else
+    {
+        VPath * vfs_path;
+        rc = VFSManagerMakePath ( vfs_mgr, &vfs_path, "%s", filename );
+        if ( rc != 0 )
+            LOGERR( klogInt, rc, "VPathMake() failed" );
+        else
+        {
+            struct KFile const *my_file;
+            rc = VFSManagerOpenFileRead ( vfs_mgr, &my_file, vfs_path );
+            if ( rc != 0 )
+                LOGERR( klogInt, rc, "VFSManagerOpenFileRead() failed" );
+            else
+            {
+                tokenzr *t;
+                uint64_t pos = 0;
+                char buffer[ 4096 + 1 ];
+                size_t num_read;
+
+                rc = make_tokenzr( &t, argc, argv );
+                if ( rc != 0 )
+                    LOGERR( klogInt, rc, "make_tokenzr() failed" );
+                else
+                {
+                    if ( progname != NULL )
+                        rc = add_string_to_argv( t, progname, string_size( progname ) );
+
+                    if ( rc == 0 )
+                    {
+                        do
+                        {
+                            rc = KFileRead ( my_file, pos, buffer, ( sizeof buffer ) - 1, &num_read );
+                            if ( rc != 0 )
+                                LOGERR( klogInt, rc, "KFileRead() failed" );
+                            else if ( num_read > 0 )
+                            {
+                                buffer[ num_read ]  = 0;
+                                rc = tokenize_buffer( t, buffer, num_read );
+                                if ( rc != 0 )
+                                    LOGERR( klogInt, rc, "tokenize_buffer() failed" );
+                                pos += num_read;
+                            }
+                        } while ( rc == 0 && num_read > 0 );
+                    }
+
+                    if ( rc == 0 && t->used > 0 )
+                    {
+                        rc = add_token_to_argv( t );
+                        if ( rc != 0 )
+                            LOGERR( klogInt, rc, "add_token_to_argv() failed" );
+                    }
+                    free_tokenzr( t );
+                }
+                rc2 = KFileRelease ( my_file );
+                if ( rc2 != 0 )
+                    LOGERR( klogInt, rc2, "KFileRelease() failed" );
+            }
+            rc2 = VPathRelease ( vfs_path );
+            if ( rc2 != 0 )
+                LOGERR( klogInt, rc2, "VPathRelease() failed" );
+        }
+        rc2 = VFSManagerRelease ( vfs_mgr );
+        if ( rc2 != 0 )
+            LOGERR( klogInt, rc2, "VFSManagerRelease() failed" );
+    }
+    return rc;
+}
+
+
+rc_t CC Args_tokenize_file_into_argv( const char * filename, int * argc, char *** argv )
+{
+    return tokenize_file_and_progname_into_argv( filename, NULL, argc, argv );
+}
+
+
+rc_t CC Args_tokenize_file_and_progname_into_argv( const char * filename, const char * progname,
+                                                               int * argc, char *** argv )
+{
+    return tokenize_file_and_progname_into_argv( filename, progname, argc, argv );
+}
+
+
+void CC Args_free_token_argv( int argc, char * argv[] )
+{
+    if ( argv != NULL )
+    {
+        int i;
+        for ( i = 0; i < argc; ++i )
+            free( argv[ i ] );
+        free( argv );
+    }
+}
+
+
+static int sized_str_cmp( const char *a, const char *b )
+{
+    size_t asize = string_size ( a );
+    size_t bsize = string_size ( b );
+    return strcase_cmp ( a, asize, b, bsize, (uint32_t) ( ( asize > bsize ) ? asize : bsize ) );
+}
+
+
+/* get's the filename following a file_option - parameter into the file-name-buffer */
+rc_t CC Args_find_option_in_argv( int argc, char * argv[],
+                                              const char * option_name,
+                                              char * option, size_t option_len )
+{
+    rc_t rc = 0;
+    int i, opt_idx;
+
+    if ( option == NULL )
+        return RC( rcRuntime, rcArgv, rcConstructing, rcParam, rcNull );
+
+    option[ 0 ] = 0;
+
+    if ( argv == NULL || argc < 1 )
+        return RC( rcRuntime, rcArgv, rcConstructing, rcSelf, rcNull );
+    if ( option_name == NULL || option_len == 0 )
+        return RC( rcRuntime, rcArgv, rcConstructing, rcParam, rcNull );
+
+    opt_idx = -1;
+    for ( i = 0; i < argc && ( option[ 0 ] == 0 ); ++i )
+    {
+        if ( sized_str_cmp( (const char *)argv[i], option_name ) == 0 )
+        {
+                opt_idx = ( i + 1 );
+        }
+        else if ( i == opt_idx )
+        {
+            string_copy( option, option_len, argv[i], string_size( argv[i] ) );
+        }
+    }
+    if ( option[ 0 ] == 0 )
+        rc = RC( rcRuntime, rcArgv, rcConstructing, rcParam, rcNotFound );
+    return rc;
+}
+
+
+rc_t CC Args_parse_inf_file( Args * args, const char * file_option )
+{
+    uint32_t count;
+    rc_t rc = ArgsOptionCount( args, file_option, &count );
+    if ( rc != 0 )
+        LOGERR( klogInt, rc, "ArgsOptionCount() failed" );
+    else if ( count > 0 )
+    {
+        uint32_t count2 = 0;
+        do
+        {
+            uint32_t idx;
+            for ( idx = count2; idx < count && rc == 0; ++idx )
+            {
+                const char *filename;
+                rc = ArgsOptionValue( args, file_option, idx, (const void **)&filename );
+                if ( rc != 0 )
+                    LOGERR( klogInt, rc, "ArgsOptionValue() failed" );
+                else if ( filename != NULL )
+                {
+                    int argc;
+                    char ** argv;
+                    rc = Args_tokenize_file_into_argv( filename, &argc, &argv );
+                    if ( rc == 0 && argv != NULL && argc > 0 )
+                    {
+                        rc = ArgsParse ( args, argc, argv );
+                        Args_free_token_argv( argc, argv );
+                    }
+                }
+            }
+            count2 = count;
+            rc = ArgsOptionCount( args, file_option, &count );
+            if ( rc != 0 )
+                LOGERR( klogInt, rc, "ArgsOptionCount() failed" );
+        } while ( rc == 0 && count > count2 );
+    }
+    return rc;
+}
diff --git a/libs/kapp/unix/args-conv-os.c b/libs/kapp/unix/args-conv-os.c
new file mode 100644
index 0000000..bfc9748
--- /dev/null
+++ b/libs/kapp/unix/args-conv-os.c
@@ -0,0 +1,32 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kapp/args-conv.h>
+
+rc_t ArgsConvFilepath(const Args * args, uint32_t arg_index, const char * arg, size_t arg_len, void ** result, WhackParamFnP * whack)
+{
+    return ArgsConvDefault(args, arg_index, arg, arg_len, result, whack);
+}
diff --git a/libs/kapp/unix/sysmain.c b/libs/kapp/unix/sysmain.c
new file mode 100644
index 0000000..15986d3
--- /dev/null
+++ b/libs/kapp/unix/sysmain.c
@@ -0,0 +1,296 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "../main-priv.h"
+#include <sysalloc.h>
+#include <kapp/main.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/status.h>
+#include <klib/report.h>
+#include <klib/rc.h>
+#include <atomic32.h>
+
+#include <unistd.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <assert.h>
+
+#if ! _DEBUGGING && ! defined CATCH_SIGSEGV
+#define CATCH_SIGSEGV 1
+#endif
+
+#if ! defined CATCH_SIGHUP
+#define CATCH_SIGHUP 0
+#endif
+
+#if _DEBUGGING && ! defined PRODUCE_CORE
+#define PRODUCE_CORE 1
+#endif
+ 
+
+/*--------------------------------------------------------------------------
+ * Main
+ */
+
+static bool no_hup;
+static atomic32_t hangup;
+static atomic32_t quitting;
+
+/* Quitting
+ *  is the program supposed to exit
+ */
+rc_t Quitting ( void )
+{
+    if ( atomic32_read ( & quitting ) == 0 )
+        return 0;
+    LOGMSG ( klogInfo, "EXITING..." );
+    return RC ( rcExe, rcProcess, rcExecuting, rcProcess, rcCanceled );
+}
+
+/* SignalQuit
+ *  tell the program to quit
+ */
+rc_t SignalQuit ( void )
+{
+    ReportSilence ();
+
+    if ( kill ( 0, SIGTERM ) != 0 ) switch ( errno )
+    {
+    case EINVAL:
+        return RC ( rcExe, rcProcess, rcSignaling, rcMessage, rcInvalid );
+    case EPERM:
+        return RC ( rcExe, rcProcess, rcSignaling, rcMessage, rcUnauthorized );
+    default:
+        return RC ( rcExe, rcProcess, rcSignaling, rcNoObj, rcUnknown );
+    }
+    return 0;
+}
+
+/* Hangup
+ *  has the program received a SIGHUP
+ */
+rc_t Hangup ( void )
+{
+    if ( atomic32_read ( & hangup ) == 0 )
+        return 0;
+    LOGMSG ( klogInfo, "HANGUP...\n" );
+    return RC ( rcExe, rcProcess, rcExecuting, rcProcess, rcIncomplete );
+}
+
+/* SignalHup
+ *  send the program a SIGHUP
+ */
+rc_t SignalHup ( void )
+{
+    if ( kill ( 0, SIGHUP ) != 0 ) switch ( errno )
+    {
+    case EINVAL:
+        return RC ( rcExe, rcProcess, rcSignaling, rcMessage, rcInvalid );
+    case EPERM:
+        return RC ( rcExe, rcProcess, rcSignaling, rcMessage, rcUnauthorized );
+    default:
+        return RC ( rcExe, rcProcess, rcSignaling, rcNoObj, rcUnknown );
+    }
+    return 0;
+}
+
+/* SignalNoHup
+ *  tell the program to stay alive even after SIGHUP
+ */
+rc_t SignalNoHup ( void )
+{
+    no_hup = true;
+    return 0;
+}
+
+/* SigHupHandler
+ */
+#if CATCH_SIGHUP
+static
+void SigHupHandler ( int sig )
+{
+    ( ( void ) sig );
+    atomic32_inc ( & hangup );
+    if ( ! no_hup )
+        atomic32_inc ( & quitting );
+    PLOGMSG ( klogInfo, (klogInfo, "SIGNAL - $(sig)\n", "sig=HUP" ));
+}
+#endif
+
+/* SigQuitHandler
+ */
+static
+void SigQuitHandler ( int sig )
+{
+    const char *msg;
+
+    ReportSilence ();
+
+    atomic32_inc ( & quitting );
+    switch ( sig )
+    {
+    case SIGINT:
+        msg = "^C";
+        break;
+    case SIGQUIT:
+        msg = "QUIT";
+        break;
+    case SIGTERM:
+        msg = "TERM";
+        break;
+    default:
+        PLOGMSG ( klogWarn, ( klogWarn, "SIGNAL - $(sig)\n", "sig=%d", sig ));
+        return;
+    }
+
+    PLOGMSG ( klogInfo, ( klogInfo, "SIGNAL - $(sig)", "sig=%s", msg ));
+}
+
+/* SigCoreHandler
+ */
+#if ! PRODUCE_CORE
+static
+void SigCoreHandler ( int sig )
+{
+    PLOGMSG ( klogFatal, ( klogFatal, "SIGNAL - $(sig)\n", "sig=%d", sig ));
+    exit ( 1 );
+}
+#endif
+
+/* SigSegvHandler
+ */
+#if CATCH_SIGSEGV
+static
+void SigSegvHandler ( int sig )
+{
+    ( ( void ) sig );
+    PLOGMSG ( klogFatal, ( klogFatal, "SIGNAL - $(sig)\n", "sig=Segmentation fault" ));
+#if PRODUCE_CORE
+    abort ();
+#endif
+    exit ( 1 );
+}
+#endif
+
+/* main
+ *  Unix specific main entrypoint
+ */
+int main ( int argc, char *argv [] )
+{
+    static struct
+    {
+        void ( * handler ) ( int );
+        int sig;
+    } sigs [] =
+    {
+#if CATCH_SIGHUP
+        { SigHupHandler, SIGHUP },
+#endif
+        { SigQuitHandler, SIGINT }, 
+#if CATCH_SIGSEGV
+        { SigSegvHandler, SIGSEGV },
+#endif
+        { SigQuitHandler, SIGTERM }
+    }
+#if ! PRODUCE_CORE
+    , core_sigs [] = 
+    {
+#if ! CATCH_SIGSEGV
+        { SigCoreHandler, SIGSEGV },
+#endif
+        { SigCoreHandler, SIGQUIT },
+        { SigCoreHandler, SIGILL },
+        { SigCoreHandler, SIGABRT },
+        { SigCoreHandler, SIGFPE }
+    }
+#endif
+    ;
+
+    rc_t rc;
+    int i, status;
+    struct sigaction sig_saves [ sizeof sigs / sizeof sigs [ 0 ] ];
+#if ! PRODUCE_CORE    
+    struct sigaction core_sig_saves [ sizeof core_sigs / sizeof core_sigs [ 0 ] ];
+#endif
+
+    /* install signal handlers */
+    for ( i = 0; i < sizeof sigs / sizeof sigs [ 0 ]; ++ i )
+    {
+        struct sigaction act;
+        memset ( & act, 0, sizeof act );
+        act . sa_handler = sigs [ i ] . handler;
+        act . sa_flags = SA_RESETHAND;
+
+        status = sigaction ( sigs [ i ] . sig, & act, & sig_saves [ i ] );
+        if ( status < 0 )
+        {
+            PLOGMSG ( klogFatal, ( klogFatal,
+                     "failed to install handler for signal $(sig) - $(msg)"
+                     , "sig=%d,msg='%s'"
+                     , sigs [ i ] . sig
+                     , strerror ( errno )
+                          ));
+            return 2;
+        }
+    }
+
+    /* install signal handlers to prevent generating core files */
+#if ! PRODUCE_CORE
+    for ( i = 0; i < sizeof core_sigs / sizeof core_sigs [ 0 ]; ++ i )
+    {
+        struct sigaction act;
+        memset ( & act, 0, sizeof act );
+        act . sa_handler = core_sigs [ i ] . handler;
+
+        status = sigaction ( core_sigs [ i ] . sig, & act, & core_sig_saves [ i ] );
+        if ( status < 0 )
+        {
+            PLOGMSG ( klogFatal, ( klogFatal,
+                     "failed to install handler for signal $(sig) - $(msg)"
+                     , "sig=%d,msg='%s'"
+                     , core_sigs [ i ] . sig
+                     , strerror ( errno )
+                          ));
+            return 4;
+        }
+    }
+#endif
+
+    /* run this guy */
+    rc = KMane ( argc, argv );
+
+    /* remove handlers, for what it's worth */
+    for ( i = 0; i < sizeof sigs / sizeof sigs [ 0 ]; ++ i )
+        sigaction ( sigs [ i ] . sig, & sig_saves [ i ], NULL );
+
+    return ( rc == 0 ) ? 0 : 3;
+}
+
diff --git a/src/test/java/htsjdk/samtools/apps/.gitignore b/libs/kdb/.gitignore
similarity index 100%
rename from src/test/java/htsjdk/samtools/apps/.gitignore
rename to libs/kdb/.gitignore
diff --git a/libs/kdb/Makefile b/libs/kdb/Makefile
new file mode 100644
index 0000000..84a66f3
--- /dev/null
+++ b/libs/kdb/Makefile
@@ -0,0 +1,166 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/kdb
+
+INT_LIBS = \
+	libkdb \
+	libwkdb
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(KDB_OBJ) \
+	$(WKDB_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+DEFINES += -DUSE_BSTREE_IN_COLUMN_IDX1
+
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS) $(ALL_DEFS)
+
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# kdb
+#
+$(ILIBDIR)/libkdb: $(addprefix $(ILIBDIR)/libkdb.,$(ILIBEXT))
+
+KDB_CMN = \
+	btree \
+	rowset \
+	rowset-simple \
+	dbmgr-cmn \
+#	database-cmn
+
+KDB_SRC = \
+	$(KDB_CMN) \
+	kdb \
+	dbmgr \
+	dbcc-cmn \
+	database \
+	database-cc \
+	table \
+	table-cc \
+	column \
+	column-cc \
+	coldata \
+	colidx \
+	colidx0 \
+	colidx1 \
+	colidx2 \
+	idxblk \
+	meta \
+	index \
+	idstats \
+	trieidx-v1 \
+	trieval-v1 \
+	ptrieval-v1 \
+	trieidx-v2 \
+	trieval-v2 \
+	ptrieval-v2 \
+	u64idx-v3
+
+KDB_OBJ = \
+	$(addsuffix .$(LOBX),$(KDB_SRC))
+
+KDB_LIB = \
+	-dvfs \
+	-dkrypto \
+	-dkfs \
+	-dklib
+
+$(ILIBDIR)/libkdb.$(LIBX): $(KDB_OBJ)
+	$(LD) --slib -o $@ $^ $(KDB_LIB)
+
+
+#-------------------------------------------------------------------------------
+# wkdb
+#
+$(ILIBDIR)/libwkdb: $(addprefix $(ILIBDIR)/libwkdb.,$(ILIBEXT))
+
+WKDB_SRC = \
+	$(KDB_CMN) \
+	wkdb \
+	wdbmgr \
+	wdatabase \
+	wtable \
+	wcolumn \
+	wcoldata \
+	wcolidx \
+	wcolidx0 \
+	wcolidx1 \
+	wcolidx2 \
+	idxblk \
+	widxblk \
+	wmeta \
+	windex \
+	wtrieidx-v1 \
+	wtrieidx-v2 \
+	wu64idx-v3
+
+WKDB_OBJ = \
+	$(addsuffix .$(LOBX),$(WKDB_SRC))
+
+WKDB_LIB = \
+	-dvfs \
+	-dkrypto \
+	-dkfs \
+	-dklib
+
+$(ILIBDIR)/libwkdb.$(LIBX): $(WKDB_OBJ)
+	$(LD) --slib -o $@ $^ $(WKDB_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/kdb/btree.c b/libs/kdb/btree.c
new file mode 100644
index 0000000..9490dc1
--- /dev/null
+++ b/libs/kdb/btree.c
@@ -0,0 +1,579 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define BTREE_KEY2ID 1
+
+#include <kdb/extern.h>
+#include <kdb/btree.h>
+#include <kfs/file.h>
+#include <kfs/pagefile.h>
+#include <klib/refcount.h>
+#include <klib/btree.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * KBTree
+ *  this implementation is an extremely simplified structure
+ *  meant to provide the ability to create an index for temporary use
+ */
+#define eByteOrderTag 0x05031988
+#define eByteOrderReverse 0x88190305
+
+
+/* v3 does not store values, but stores keys in node pages */
+typedef struct KBTreeHdr_v3 KBTreeHdr_v3;
+struct KBTreeHdr_v3
+{
+    /* last entry id */
+    uint32_t id_seq;
+
+    /* key min/max */
+    uint16_t key_min, key_max;
+
+    /* type [ 0 ] is type
+       type [ 1 ] is non-zero if comparison function was used
+       rest are for alignment */
+    uint8_t type [ 4 ];
+
+    /* tree root */
+    uint32_t root;
+
+    /* next to last */
+    uint32_t version;
+
+    /* last */
+    uint32_t endian;
+};
+
+struct Pager {
+    KPageFile *pager;
+    rc_t rc;
+};
+
+static void const *PagerAlloc(Pager *self, uint32_t *newid)
+{
+    KPage *page = NULL;
+    self->rc = KPageFileAlloc(self->pager, &page, newid);
+    return (void const *)page;
+}
+
+static void const *PagerUse(Pager *self, uint32_t pageid)
+{
+    KPage *page = NULL;
+    self->rc = KPageFileGet(self->pager, &page, pageid);
+    return (void const *)page;
+}
+
+static void const *PagerAccess(Pager *self, void const *page)
+{
+    void const *mem = NULL;
+    self->rc = KPageAccessRead((KPage const *)page, &mem, NULL);
+    return mem;
+}
+
+static void *PagerUpdate(Pager *self, void const *page)
+{
+    void *mem = NULL;
+    self->rc = KPageAccessUpdate((KPage *)page, &mem, NULL);
+    return mem;
+}
+
+static void PagerUnuse(Pager *self, void const *page)
+{
+    KPageRelease((KPage const *)page);
+}
+
+static Pager_vt const KPageFile_vt = {
+    PagerAlloc,
+    PagerUse,
+    PagerAccess,
+    PagerUpdate,
+    PagerUnuse
+};
+
+typedef struct KBTreeHdr_v3 KBTreeHdr;
+
+static
+rc_t KBTreeReadHeader ( KBTreeHdr *hdr, const KFile *f )
+{
+    uint64_t eof;
+    rc_t rc = KFileSize ( f, & eof );
+    if ( rc == 0 )
+    {
+        size_t num_read;
+
+        /* this would be an empty file */
+        if ( eof == 0 )
+        {
+            memset ( hdr, 0, sizeof * hdr );
+            return RC ( rcDB, rcTree, rcConstructing, rcData, rcNotFound );
+        }
+
+        if ( eof < sizeof * hdr )
+            return RC ( rcDB, rcTree, rcConstructing, rcData, rcCorrupt );
+
+        rc = KFileReadAll ( f, eof - sizeof * hdr, hdr, sizeof * hdr, & num_read );
+        if ( rc == 0 && num_read != sizeof * hdr )
+            rc = RC ( rcDB, rcTree, rcConstructing, rcData, rcInsufficient );
+        if ( rc == 0 )
+        {
+            if ( hdr -> endian != eByteOrderTag )
+            {
+                if ( hdr -> endian == eByteOrderReverse )
+                    return RC ( rcDB, rcTree, rcConstructing, rcByteOrder, rcIncorrect );
+                return RC ( rcDB, rcTree, rcConstructing, rcData, rcCorrupt );
+            }
+            if ( hdr -> version != 2 )
+                return RC ( rcDB, rcTree, rcConstructing, rcHeader, rcBadVersion );
+        }
+    }
+    return rc;
+}
+
+struct KBTree
+{
+    /* file itself */
+    KFile *file;
+
+    /* page cache layered on top */
+    Pager pgfile;
+
+    /* "header" is stored at end */
+    KBTreeHdr hdr;
+
+    KRefcount refcount;
+
+    bool read_only;
+};
+
+/* Whack
+ */
+static
+rc_t KBTreeWhack ( KBTree *self )
+{
+    if ( self -> read_only || self -> file == NULL )
+        KPageFileRelease ( self -> pgfile.pager );
+    else
+    {
+        size_t num_writ;
+
+        /* request page file size */
+        uint64_t eof;
+        rc_t rc = KPageFileSize ( self -> pgfile.pager, & eof, NULL, NULL );
+        if ( rc != 0 )
+            return rc;
+
+        /* drop the page file and its cache */
+        KPageFileRelease ( self -> pgfile.pager );
+
+        /* write header to tail */        
+        rc = KFileWrite ( self -> file, eof, & self -> hdr, sizeof self -> hdr, & num_writ );
+        if ( rc == 0 && num_writ != sizeof self -> hdr )
+            rc = RC ( rcDB, rcTree, rcPersisting, rcTransfer, rcIncomplete );
+        if ( rc == 0 )
+            rc = KFileSetSize ( self -> file, eof + sizeof self -> hdr );
+        if ( rc != 0 )
+        {
+            /* TBD - can issue a warning here */
+        }
+    }
+
+    KFileRelease ( self -> file );
+    free ( self );
+    return 0;
+}
+
+
+/* MakeRead
+ * MakeUpdate
+ *  make a b-tree object backed by supplied KFile
+ *
+ *  "backing" [ IN ] - open file with read permissions.
+ *   NB - a reference will be attached to this file.
+ *
+ *  "climit" [ IN ] - cache limit in bytes. the internal cache will
+ *   retain UP TO ( but not exceeding ) the limit specified. a value
+ *   of 0 ( zero ) will disable caching.
+ *
+ *  "cmp" [ IN, NULL OKAY ] - optional comparison callback function for opaque keys.
+ *   specific key types will use internal comparison functions. for opaque keys, a
+ *   NULL function pointer will cause ordering by size and binary comparison.
+ */
+LIB_EXPORT rc_t CC KBTreeMakeRead_1 ( const KBTree **btp,
+    const KFile *backing, size_t climit )
+{
+    rc_t rc;
+
+    if ( btp == NULL )
+        rc = RC ( rcDB, rcTree, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( backing == NULL )
+            rc = RC ( rcDB, rcTree, rcConstructing, rcFile, rcNull );
+        else
+        {
+            KBTree *bt = malloc ( sizeof * bt );
+            if ( bt == NULL )
+                rc = RC ( rcDB, rcTree, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KBTreeReadHeader ( & bt -> hdr, backing );
+                if ( rc == 0 )
+                {
+                    rc = KFileAddRef ( backing );
+                    if ( rc == 0 )
+                    {
+                        /* create page file */
+                        rc = KPageFileMakeRead ( ( const KPageFile** ) & bt -> pgfile.pager, backing, climit );
+                        if ( rc == 0 )
+                        {
+                            /* ready to go */
+                            bt -> file = ( KFile* ) backing;
+                            KRefcountInit ( & bt -> refcount, 1, "KBTree", "make-read", "btree" );
+                            bt -> read_only = true;
+
+                            * btp = bt;
+                            return 0;
+                        }
+
+                        KFileRelease ( backing );
+                    }
+                }
+
+                free ( bt );
+            }
+        }
+
+        * btp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* MakeUpdate
+ *  make a b-tree object backed by supplied KFile
+ *
+ *  "backing" [ IN ] - open file with read & write permissions.
+ *   NB - a reference will be attached to this file.
+ *
+ *  "climit" [ IN ] - cache limit in bytes. the internal cache will
+ *   retain UP TO ( but not exceeding ) the limit specified. a value
+ *   of 0 ( zero ) will disable caching.
+ *
+ *  "write_through" [ IN ] - if true, causes flushing of modified page
+ *   after its value is released
+ *
+ *  "type" [ IN ] - describes the key type ( see above )
+ *
+ *  "key_chunk_size" [ IN ] - the "chunking" ( alignment ) factor for
+ *   storing keys, rounded up to the nearest power of 2.
+ *
+ *  "value_chunk_size" [ IN ] - chunking factor for values
+ *   ( see "key_chunk_size" )
+ *
+ *  "min_key_size" [ IN ] and "max_key_size" [ IN ] - specifies the allowed
+ *   opaque key sizes. min == max implies fixed size. ignored for well
+ *   known fixed size key types.
+ *
+ *  "min_value_size" [ IN ] and "max_value_size" [ IN ] - specifies the allowed
+ *   value sizes. min == max implies fixed size.
+ *
+ *  "cmp" [ IN ] - comparison callback function for opaque keys.
+ */
+LIB_EXPORT rc_t CC KBTreeMakeUpdate_1 ( KBTree **btp, KFile *backing,
+    size_t climit )
+{
+    rc_t rc;
+
+    if ( btp == NULL )
+        rc = RC ( rcDB, rcTree, rcConstructing, rcParam, rcNull );
+    else
+    {
+        {
+            KBTree *bt = calloc ( 1,sizeof * bt );
+            if ( bt == NULL )
+                rc = RC ( rcDB, rcTree, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                if ( backing == NULL || ( rc = KBTreeReadHeader ( & bt -> hdr, backing )) == 0 || GetRCState ( rc ) == rcNotFound )
+                {
+                    /* detect empty file */
+                    if ( bt -> hdr . version == 0 )
+                    {
+                        assert ( bt -> hdr . id_seq == 0 );
+                        bt -> hdr . type [ 0 ] = 0;
+                        bt -> hdr . type [ 1 ] = 0;
+                        bt -> hdr . key_min = 0;
+                        bt -> hdr . key_max = 0;
+                        bt -> hdr . version = 3;
+                        bt -> hdr . endian = eByteOrderTag;
+                        rc = 0;
+                    }
+                    else
+                    {
+                        /* check for parameter equivalence */
+                        if ( bt -> hdr . version < 3 )
+                            rc = RC ( rcDB, rcTree, rcConstructing, rcHeader, rcBadVersion );
+                    }
+
+                    if ( rc == 0 )
+                    {
+                        if(backing) rc = KFileAddRef ( backing );
+                        if ( rc == 0 )
+                        {
+                            /* create page file */
+                            rc = KPageFileMakeUpdate ( & bt -> pgfile.pager, backing, climit, false );
+                            if ( rc == 0 )
+                            {
+                                /* ready to go */
+                                bt -> file = backing;
+                                KRefcountInit ( & bt -> refcount, 1, "KBTree", "make-update", "btree" );
+                                bt -> read_only = false;
+
+                                * btp = bt;
+                                return 0;
+                            }
+
+                            if(backing) KFileRelease ( backing );
+                        }
+                    }
+                }
+
+                free ( bt );
+            }
+        }
+
+        * btp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KBTreeAddRef ( const KBTree *self )
+{
+    if ( self != NULL ) switch ( KRefcountAdd ( & self -> refcount, "KBTree" ) )
+    {
+    case krefOkay:
+        break;
+    default:
+        return RC ( rcDB, rcTree, rcAttaching, rcConstraint, rcViolated );
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KBTreeRelease ( const KBTree *self )
+{
+    if ( self != NULL ) switch ( KRefcountDrop ( & self -> refcount, "KBTree" ) )
+    {
+    case krefOkay:
+        break;
+    case krefWhack:
+        return KBTreeWhack ( ( KBTree* ) self );
+    default:
+        return RC ( rcDB, rcTree, rcReleasing, rcConstraint, rcViolated );
+    }
+    return 0;
+}
+
+
+/* DropBacking
+ *  used immediately prior to releasing
+ *  prevents modified pages from being flushed to disk
+ *  renders object nearly useless
+ */
+LIB_EXPORT rc_t CC KBTreeDropBacking ( KBTree *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTree, rcDetaching, rcSelf, rcNull );
+
+    rc = KPageFileDropBacking ( self -> pgfile.pager );
+    if ( rc == 0 )
+    {
+        rc = KFileRelease ( self -> file );
+        if ( rc == 0 )
+            self -> file = NULL;
+    }
+
+    return rc;
+}
+
+
+/* Size
+ *  returns size in bytes of file and cache
+ *
+ *  "lsize" [ OUT, NULL OKAY ] - return parameter for logical size
+ *
+ *  "fsize" [ OUT, NULL OKAY ] - return parameter for file size
+ *
+ *  "csize" [ OUT, NULL OKAY ] - return parameter for cache size
+ */
+LIB_EXPORT rc_t CC KBTreeSize ( const KBTree *self,
+    uint64_t *lsize, uint64_t *fsize, size_t *csize )
+{
+    size_t dummysz;
+    uint64_t dummy64;
+
+    if ( self != NULL )
+        return KPageFileSize ( self -> pgfile.pager, lsize, fsize, csize );
+
+    if ( lsize == NULL )
+        lsize = & dummy64;
+    if ( fsize == NULL )
+        fsize = & dummy64;
+    if ( csize == NULL )
+        csize = & dummysz;
+
+    * lsize = 0;
+    * fsize = 0;
+    * csize = 0;
+
+    return RC ( rcDB, rcTree, rcAccessing, rcSelf, rcNull );
+}
+
+
+/* Find
+ *  searches for a match
+ *
+ *  "val" [ OUT ] - return parameter for value found
+ *   accessed via KBTreeValueAccess* described above
+ *   must be balanced with a call to KBTreeValueWhack.
+ *
+ *  "key" [ IN ] and "key_size" [ IN ] - describes an
+ *   opaque key
+ */
+LIB_EXPORT rc_t CC KBTreeFind ( const KBTree *self, uint64_t *id,
+    const void *key, size_t key_size )
+{
+    rc_t rc;
+
+    if ( id == NULL )
+        rc = RC ( rcDB, rcTree, rcSelecting, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTree, rcSelecting, rcSelf, rcNull );
+        else if ( key_size == 0 )
+            rc = RC ( rcDB, rcTree, rcSelecting, rcParam, rcEmpty );
+        else if ( key == NULL )
+            rc = RC ( rcDB, rcTree, rcSelecting, rcParam, rcNull );
+        else if ( self -> hdr . root == 0 )
+            rc = RC ( rcDB, rcTree, rcSelecting, rcItem, rcNotFound );
+        else
+        {
+            uint32_t id32 = 0;
+            rc = BTreeFind(self->hdr.root, (Pager *)&self->pgfile, &KPageFile_vt, &id32, key, key_size);
+            if (self->pgfile.rc)
+                rc = self->pgfile.rc;
+            *id = id32;
+        }
+    }
+
+    return rc;
+}
+
+
+/* Entry
+ *  searches for a match or creates a new entry
+ *
+ *  "val" [ OUT ] - return parameter for value found
+ *   accessed via KBTreeValueAccess* described above
+ *   must be balanced with a call to KBTreeValueWhack.
+ *
+ *  "was_inserted" [ OUT ] - if true, the returned value was the result of an
+ *   insertion and can be guaranteed to be all 0 bits. otherwise, the returned
+ *   value will be whatever was there previously.
+ *
+ *  "alloc_size" [ IN ] - the number of value bytes to allocate upon insertion,
+ *   i.e. if the key was not found. this value must agree with the limits
+ *   specified in Make ( see above ).
+ *
+ *  "key" [ IN ] and "key_size" [ IN ] - describes an
+ *   opaque key
+ */
+LIB_EXPORT rc_t CC KBTreeEntry ( KBTree *self, uint64_t *id,
+    bool *was_inserted, const void *key, size_t key_size )
+{
+    rc_t rc;
+
+    bool dummy;
+    if ( was_inserted == NULL )
+        was_inserted = & dummy;
+    * was_inserted = false;
+
+    if ( id == NULL )
+        rc = RC ( rcDB, rcTree, rcUpdating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTree, rcUpdating, rcSelf, rcNull );
+        else if ( key_size == 0 )
+            rc = RC ( rcDB, rcTree, rcUpdating, rcParam, rcEmpty );
+        else if ( key == NULL )
+            rc = RC ( rcDB, rcTree, rcUpdating, rcParam, rcNull );
+        else
+        {
+            uint32_t id32 = *id;
+            rc = BTreeEntry(&self->hdr.root, (Pager *)&self->pgfile, &KPageFile_vt, &id32, was_inserted, key, key_size);
+            if (self->pgfile.rc)
+                rc = self->pgfile.rc;
+            *id = id32;
+        }
+    }
+
+    return rc;
+}
+
+
+/* ForEach
+ *  executes a function on each tree element
+ *
+ *  "reverse" [ IN ] - if true, iterate in reverse order
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - callback function
+ */
+LIB_EXPORT rc_t CC KBTreeForEach ( const KBTree *self, bool reverse, void ( CC * f ) ( const void *key, size_t key_size, uint32_t id, void *data ), void *data )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcTree, rcVisiting, rcSelf, rcNull );
+    else if ( f == NULL )
+        return RC ( rcDB, rcTree, rcVisiting, rcFunction, rcNull );
+    else
+        return BTreeForEach(self->hdr.root, (Pager *)&self->pgfile, &KPageFile_vt, reverse, f, data);
+}
diff --git a/libs/kdb/cc-priv.h b/libs/kdb/cc-priv.h
new file mode 100644
index 0000000..fe25705
--- /dev/null
+++ b/libs/kdb/cc-priv.h
@@ -0,0 +1,51 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ *============================================================================
+ *
+ */
+
+#ifndef _h_cc_priv_
+#define _h_cc_priv_
+
+#ifndef _h_kdb_consistency_check_
+#include <kdb/consistency-check.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDirectory;
+
+
+rc_t DirectoryCheckMD5 ( const KDirectory *dir, const char *name,
+    CCReportInfoBlock *info, CCReportFunc report, void *data );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_cc_priv_ */
diff --git a/libs/kdb/coldata-priv.h b/libs/kdb/coldata-priv.h
new file mode 100644
index 0000000..45e98c0
--- /dev/null
+++ b/libs/kdb/coldata-priv.h
@@ -0,0 +1,126 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_coldata_priv_
+#define _h_coldata_priv_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+typedef union KColumnPageMap KColumnPageMap;
+
+
+/*--------------------------------------------------------------------------
+ * KColumnData
+ *  data fork
+ *
+ *  only handling append-mode today
+ *
+ *  kept 64-bit aligned
+ */
+typedef struct KColumnData KColumnData;
+struct KColumnData
+{
+    /* cached end of data fork */
+    uint64_t eof;
+
+    /* data fork itself */
+    struct KFile const *f;
+
+    /* page size */
+    size_t pgsize;
+};
+
+/* DefaultPageSize
+ *  static method
+ */
+#define KColumnDataDefaultPageSize( reuse_pages ) \
+    ( ( reuse_pages ) ? 4096 : 1 )
+
+/* Open
+ */
+rc_t KColumnDataOpenRead ( KColumnData *self,
+    const KDirectory *dir, uint64_t eof, size_t pgsize );
+
+/* Whack
+ */
+rc_t KColumnDataWhack ( KColumnData *self );
+
+/* Read
+ *  reads from the data fork using a blob map
+ */
+rc_t KColumnDataRead ( const KColumnData *self, const KColumnPageMap *pm,
+    size_t offset, void *buffer, size_t bsize, size_t *num_read );
+
+
+/*--------------------------------------------------------------------------
+ * KColumnPageMap
+ *  map of pages involved in column blob
+ */
+union KColumnPageMap
+{
+    /* for non-paged data forks, a single page id
+       describes the start of the blob, where the
+       remainder is sequential */
+    uint64_t pg;
+};
+
+/* Open
+ *  opens a page map by raw page id and size
+ *
+ *  "pm" [ OUT ] - modifiable parameter for blob page map
+ *
+ *  "pg" [ IN ] and "sz" [ IN ] - identifies pages of data fork included
+ *  within the blob.
+ */
+rc_t KColumnPageMapOpen ( KColumnPageMap *pm,
+    KColumnData *cd, uint64_t pg, size_t sz );
+
+/* Whack
+ *  disposes of memory in the case of a page array
+ */
+void KColumnPageMapWhack ( KColumnPageMap *self, const KColumnData *cd );
+
+/* Id
+ *  captures id of initial page
+ */
+rc_t KColumnPageMapId ( const KColumnPageMap *self,
+    const KColumnData *cd, uint64_t *pg );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_coldata_priv_ */
diff --git a/libs/kdb/coldata.c b/libs/kdb/coldata.c
new file mode 100644
index 0000000..44fecd6
--- /dev/null
+++ b/libs/kdb/coldata.c
@@ -0,0 +1,188 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "coldata-priv.h"
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+#include <kfs/impl.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+
+#define DATA_READ_FILE_BUFFER 0
+
+
+/*--------------------------------------------------------------------------
+ * KColumnData
+ */
+
+
+/* Init
+ */
+static
+rc_t KColumnDataInit ( KColumnData *self, uint64_t pos, size_t pgsize )
+{
+    rc_t rc = KFileSize ( self -> f, & self -> eof );
+    if ( rc == 0 )
+    {
+        if ( self -> eof < pos || pgsize == 0 || ( pos % pgsize ) != 0 )
+            rc = RC ( rcDB, rcColumn, rcConstructing, rcData, rcCorrupt );
+        else
+        {
+            self -> eof = pos;
+            self -> pgsize = pgsize;
+            return 0;
+        }
+    }
+
+    KFileRelease ( self -> f );
+    self -> f = NULL;
+    return rc;
+}
+
+/* Open
+ */
+rc_t KColumnDataOpenRead ( KColumnData *self,
+    const KDirectory *dir, uint64_t eof, size_t pgsize )
+{
+    rc_t rc = KDirectoryOpenFileRead ( dir,
+        & self -> f, "data" );
+#if DATA_READ_FILE_BUFFER
+    if ( rc == 0 )
+    {
+        const KFile * orig = self -> f;
+        rc = KBufFileMakeRead ( & self -> f, self -> f, DATA_READ_FILE_BUFFER );
+        if ( rc == 0 )
+        {
+            KFileRelease ( orig );
+        }
+        else
+        {
+            self -> f = orig;
+            rc = 0;
+        }
+    }
+#endif
+    if ( rc == 0 )
+        rc = KColumnDataInit ( self, eof, pgsize );
+    return rc;
+}
+
+/* Whack
+ */
+rc_t KColumnDataWhack ( KColumnData *self )
+{
+    rc_t rc = KFileRelease ( self -> f );
+    if ( rc == 0 )
+        self -> f = NULL;
+    return rc;
+}
+
+/* Read
+ *  reads from the data fork using a blob map
+ */
+rc_t KColumnDataRead ( const KColumnData *self, const KColumnPageMap *pm,
+    size_t offset, void *buffer, size_t bsize, size_t *num_read )
+{
+    uint64_t pos;
+
+    assert ( self != NULL );
+    assert ( pm != NULL );
+
+    if ( bsize == 0 )
+    {
+        assert ( num_read != NULL );
+        * num_read = 0;
+        return 0;
+    }
+
+    pos = pm -> pg * self -> pgsize;
+    return KFileRead ( self -> f, pos + offset, buffer, bsize, num_read );
+}
+
+
+/*--------------------------------------------------------------------------
+ * KColumnPageMap
+ *  map of pages involved in column blob
+ */
+
+/* Open
+ *  opens an blob by raw page id and size
+ *
+ *  "pm" [ OUT ] - modifiable parameter for blob page map
+ *
+ *  "pg" [ IN ] and "sz" [ IN ] - identifies pages of data fork included
+ *  within the blob.
+ */
+rc_t KColumnPageMapOpen ( KColumnPageMap *self,
+    KColumnData *cd, uint64_t pg, size_t sz )
+{
+    uint64_t pos;
+
+    assert ( cd != NULL );
+    pos = pg * cd -> pgsize;
+    if ( pos + sz > cd -> eof )
+    {
+        if ( pos >= cd -> eof )
+            return RC ( rcDB, rcBlob, rcOpening, rcPagemap, rcExcessive );
+        return RC ( rcDB, rcBlob, rcOpening, rcRange, rcExcessive );
+    }
+
+    assert ( self != NULL );
+    self -> pg = pg;
+
+    return 0;
+}
+
+/* Whack
+ *  disposes of memory in the case of a page array
+ */
+void KColumnPageMapWhack ( KColumnPageMap *self, const KColumnData *cd )
+{
+    assert ( self != NULL );
+    assert ( cd != NULL );
+}
+
+/* Id
+ *  captures id of initial page
+ */
+rc_t KColumnPageMapId ( const KColumnPageMap *self,
+    const KColumnData *cd, uint64_t *pg )
+{
+    assert ( self != NULL );
+    assert ( cd != NULL );
+    assert ( pg != NULL );
+
+    * pg = self -> pg;
+    return 0;
+}
diff --git a/libs/kdb/colfmt-priv.h b/libs/kdb/colfmt-priv.h
new file mode 100644
index 0000000..0564ede
--- /dev/null
+++ b/libs/kdb/colfmt-priv.h
@@ -0,0 +1,339 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_colfmt_priv_
+#define _h_colfmt_priv_
+
+#ifndef _h_kdbfmt_priv_
+#include "kdbfmt-priv.h"
+#endif
+
+#include <endian.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KColLocDesc
+ *  general location descriptor
+ */
+typedef struct KColLocDesc KColLocDesc;
+struct KColLocDesc
+{
+    /* the data fork page id */
+    uint64_t pg;
+
+    union
+    {
+        /* pertains to KColBlobLoc */
+        struct
+        {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+            /* the blob size in bytes */
+            uint32_t size : 31;
+
+            /* used for level-0 journal */
+            uint32_t remove : 1;
+#else
+            uint32_t remove : 1;
+            uint32_t size : 31;
+#endif
+        } blob;
+
+        /* pertains to KColBlockLoc */
+        struct
+        {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+            /* the block size in bytes */
+            uint32_t size : 27;
+
+            /* block type */
+            uint32_t id_type : 2;
+            uint32_t pg_type : 2;
+
+            /* block compression */
+            uint32_t compressed : 1;
+#else
+            uint32_t compressed : 1;
+            uint32_t pg_type : 2;
+            uint32_t id_type : 2;
+            uint32_t size : 27;
+#endif
+        } blk;
+
+        /* the general 32 bits */
+        uint32_t gen;
+
+    } u;
+
+    /* the id range */
+    uint32_t id_range;
+    int64_t start_id;
+};
+
+
+/*--------------------------------------------------------------------------
+ * KColBlobLoc
+ *  a single blob locator
+ *  stored in level-0 index
+ *  and in various compressed forms in level-2
+ */
+typedef struct KColLocDesc KColBlobLoc;
+
+
+/*--------------------------------------------------------------------------
+ * KColBlockLoc
+ *  an index block locator
+ *  stored in level-1 index
+ *
+ *  the type ids pertain to group representation of { start_id, id_range }
+ *  and { pg, size } from KColBlobLoc. An individual KColBlobLoc has no
+ *  context and must represent all data. a KColBlockLoc stores grouped locators
+ *  and can economize on representations.
+ *
+ *  there are 4 types of representations applied to each index and data:
+ *   0) fully specified "random" access - having { id, range } or { pg, size }
+ *      this type can group together locators with no apparent relationship
+ *      whatsoever. they are stored within a b-tree ordered by id.
+ *
+ *   1) uniformly sized discontiguous sequence - any time the range/size is a
+ *      constant, then it needs only to be represented once.
+ *
+ *   2) predictable sequence - when id/pg [ n + 1 ] == id/pg [ n ] +
+ *      range/size [ n ] they need not both be stored since the range/size
+ *      is a delta of id/pg. the storage format is by magnitude while
+ *      the in-core format is by id, with a 32-bit magnitude of the
+ *      final entry in a header.
+ *
+ *   3) uniformly sized contiguous sequence - when the conditions of type #2 apply
+ *      and the range/size is always the same, then all values except for the
+ *      count are known and may be eliminated.
+ *
+ *  the specific interpretation of KColBlockLoc depends upon the combination
+ *  of id and pg types:
+ *
+ *   a) when both are "btypePredictable"
+ *      "pos"       => idx2 offset to 12 byte block
+ *      "size"      => "count", i.e. number of blobs in block
+ *      "start_id"  => first id in block
+ *      "id_range"  => span of ids, evenly divided into "count" blob indices
+ *      "block::pg" => data offset to first blob in block
+ *      "block::sz" => size of each blob in block
+ *
+ *   b) when id type is "btypePredictable":
+ *      "pos"       => idx2 offset to dynamically sized block
+ *      "size"      => size of block
+ *      "start_id"  => first id in block
+ *      "id_range"  => span of ids, evenly divided into "count" blob indices
+ *      "count"     => functionally derived from pg type and "size"
+ *
+ *   c) all other cases:
+ *      "pos"       => idx2 offset to dynamically sized block
+ *      "size"      => size of block
+ *      "start_id"  => first id in block
+ *      "id_range"  => span of ids
+ *      "count"     => functionally derived from id/pg types and "size"
+ */
+enum
+{
+    btypeRandom,       /* { pg/id, span/sz } */
+    btypeUniform,      /* { pg/id }          */
+    btypeMagnitude,    /* { span/sz }        */
+    btypePredictable   /* {}                 */
+};
+
+typedef struct KColLocDesc KColBlockLoc;
+
+
+/* KColumnHdr
+ *  stored in either "idx1" ( under v1 )
+ *  or in "idx" ( v2+ )
+ *
+ *  in ALL cases, "idx1" starts with at least
+ *  a HDBHdr giving the column's current version.
+ *  when this version == 1, then the entire header
+ *  is in idx1.
+ *
+ * - ALL VERSIONS -
+ *  "dad" - gives endian and version information
+ *
+ * - VERSION 1 -
+ *  "data_eof" - official eof of last segment of data fork
+ *
+ *  "idx2_eof" - official eof of idx block fork
+ *
+ *  "num_blocks" - describes the number of idx blocks
+ *  in idx2, as well as the number of block descriptors
+ *  ( KColBlockLoc ) in idx1.
+ *
+ *  "page_size" - number of bytes in data pages.
+ *  when 1 ( in practice anything less than some higher
+ *  power of 2, 64 minimum, 4K typical, 64K etc. ), the
+ *  data fork operates in append mode.
+ *
+ *  "checksum" - one of the blob-wise checksum modes:
+ *  kcsNone, kcsCRC32, kcsMD5, tbd...
+ *
+ *  "align" - round header size out to multiples of 8 bytes
+ *
+ * - VERSION 3 -
+ *  "idx0_count" - a committed entry count on idx0. in v1, this
+ *  was always inferred from the file system. in v2, the code
+ *  was never writing this value, so it's garbage.
+ *
+ * - VERSION 4 -
+ *  idx1 needs to be written in straight-shot mode when MD5
+ *  is involved. in version 3 it had been written in append mode.
+ *
+ * - VERSION 5 -
+ *  "data_limit" - when not zero, imposes a limit for opening
+ *  new blobs in append mode and an absolute file size limit
+ *  in paged mode ( requiring limit to be a multiple of page_size ).
+ *
+ *  "data_total" - total size of all segments of data fork
+ *
+ *  "data_seg" - zero-based id of last data segment
+ */
+#define KCOL_CURRENT_VERSION 3
+#define vCUR v3
+
+typedef struct KColumnHdr KColumnHdr;
+struct KColumnHdr
+{
+    KDBHdr dad;
+
+    union
+    {
+        /* v1 header */
+        struct
+        {
+            uint64_t data_eof;
+            uint64_t idx2_eof;
+            uint32_t num_blocks;
+            uint32_t page_size;
+            uint8_t checksum;
+
+            uint8_t align1 [ 7 ];
+
+        } v1;
+
+        /* v2 header - note one field should be ignored */
+        struct
+        {
+            uint64_t data_eof;
+            uint64_t idx2_eof;
+            uint32_t ignore;
+            uint32_t num_blocks;
+            uint32_t page_size;
+            uint8_t checksum;
+
+            uint8_t align1 [ 3 ];
+
+        } v2;
+
+        /* v3 header - same as v2, except idx2_count is
+           being populated by the implementation */
+
+        /* v4 header - same as v3 in every way
+           except that idx1 is expected to be
+           written without MD5 append-mode information */
+        struct
+        {
+            uint64_t data_eof;
+            uint64_t idx2_eof;
+            uint32_t idx0_count;
+            uint32_t num_blocks;
+            uint32_t page_size;
+            uint8_t checksum;
+
+            uint8_t align1 [ 3 ];
+
+        } v3, v4;
+
+        /* v5 header ( proposed ) - supports multi-file data fork */
+        struct
+        {
+            uint64_t data_limit;
+            uint64_t data_total;
+            uint64_t data_eof;
+            uint64_t idx2_eof;
+            uint32_t idx0_count;
+            uint32_t num_blocks;
+            uint32_t page_size;
+            uint32_t data_seg;
+            uint8_t checksum;
+
+            uint8_t align1 [ 7 ];
+
+        } v5;
+
+    } u;
+};
+
+/* NULL_HDR
+ *  substitute for a variable when needed
+ */
+#define NULL_HDR \
+    ( * ( const KColumnHdr* ) 0 )
+
+/* KColumnHdrOffset
+ *  calculates the idx file offset to beginning of indices
+ */
+#define KColumnHdrOffset( hdr, var ) \
+    ( sizeof ( hdr ) - sizeof ( hdr ) . u + sizeof ( hdr ) . u . var )
+
+/* KColumnHdrMinSize
+ *  calculates the minimum size of a header
+ */
+#define KColumnHdrMinSize( hdr ) \
+    sizeof ( hdr ) . dad
+
+/* KColBlockLocEntryCount - INTERNAL
+ *  returns the number of entries within a block
+ *  uses the original size of the uncompressed block
+ *
+ *  "orig" [ IN, OUT ] - taken as the original size of an
+ *  uncompressed block, but may be updated in the case of
+ *  all predictable types.
+ */
+uint32_t KColBlockLocEntryCount ( const KColBlockLoc *self, size_t *orig );
+
+/* KColBlockLocAllocSize - INTERNAL
+ *  returns a size for the block
+ *  since a type 3 index ( range/size only ) is nice for storage
+ *  but needs to be converted to id/pos for in-memory lookup
+ */
+size_t KColBlockLocAllocSize ( const KColBlockLoc *self,
+    size_t orig, uint32_t count );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_colfmt_priv_ */
diff --git a/libs/kdb/colidx-priv.h b/libs/kdb/colidx-priv.h
new file mode 100644
index 0000000..4c68939
--- /dev/null
+++ b/libs/kdb/colidx-priv.h
@@ -0,0 +1,122 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_colidx_priv_
+#define _h_colidx_priv_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_colfmt_priv_
+#include "colfmt-priv.h"
+#endif
+
+#ifndef _h_colidx0_priv_
+#include "colidx0-priv.h"
+#endif
+
+#ifndef _h_colidx1_priv_
+#include "colidx1-priv.h"
+#endif
+
+#ifndef _h_colidx2_priv_
+#include "colidx2-priv.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx
+ *  the index fork
+ */
+typedef struct KColumnIdx KColumnIdx;
+struct KColumnIdx
+{
+    /* first active id within db
+       and first id on upper limit
+       i.e. outside of db such that
+       id_upper - id_first == num_ids */
+    int64_t id_first;
+    int64_t id_upper;
+
+    /* level 0 index */
+    KColumnIdx0 idx0;
+
+    /* level 1 index */
+    KColumnIdx1 idx1;
+
+    /* level 2 index */
+    KColumnIdx2 idx2;
+};
+
+/* Open
+ */
+rc_t KColumnIdxOpenRead ( KColumnIdx *self, const KDirectory *dir,
+    uint64_t *data_eof, size_t *pgsize, int32_t *checksum );
+
+/* Whack
+ */
+rc_t KColumnIdxWhack ( KColumnIdx *self );
+
+/* Version
+ */
+rc_t KColumnIdxVersion ( const KColumnIdx *self, uint32_t *version );
+#define KColumnIdxVersion( self, version ) \
+    KColumnIdx1Version ( & ( self ) -> idx1, version )
+
+/* ByteOrder
+ */
+rc_t KColumnIdxByteOrder ( const KColumnIdx *self, bool *reversed );
+#define KColumnIdxByteOrder( self, reversed ) \
+    KColumnIdx1ByteOrder ( & ( self ) -> idx1, reversed )
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+rc_t KColumnIdxIdRange ( const KColumnIdx *self,
+    int64_t *first, int64_t *last );
+
+/* FindFirstRowId
+ */
+rc_t KColumnIdxFindFirstRowId ( const KColumnIdx * self,
+    int64_t * found, int64_t start );
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdxLocateBlob ( const KColumnIdx *self,
+    KColBlobLoc *loc, int64_t first, int64_t last );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_colidx_priv_ */
diff --git a/libs/kdb/colidx.c b/libs/kdb/colidx.c
new file mode 100644
index 0000000..7e8a8c0
--- /dev/null
+++ b/libs/kdb/colidx.c
@@ -0,0 +1,243 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "colidx-priv.h"
+#include "idxblk-priv.h"
+#include <kfs/file.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx
+ *  the index fork
+ */
+
+
+/* EstablishIdRange
+ */
+static
+void KColumnIdxEstablishIdRange ( KColumnIdx *self )
+{
+    int64_t first, upper;
+
+    if ( ! KColumnIdx0IdRange ( & self -> idx0, & self -> id_first, & self -> id_upper ) )
+    {
+        if ( ! KColumnIdx1IdRange ( & self -> idx1, & self -> id_first, & self -> id_upper ) )
+            self -> id_first = self -> id_upper = 1;
+    }
+    else if ( KColumnIdx1IdRange ( & self -> idx1, & first, & upper ) )
+    {
+        if ( self -> id_first > first )
+            self -> id_first = first;
+        if ( self -> id_upper < upper )
+            self -> id_upper = upper;
+    }
+}
+
+/* Open
+ */
+rc_t KColumnIdxOpenRead ( KColumnIdx *self, const KDirectory *dir,
+    uint64_t *data_eof, size_t *pgsize, int32_t *checksum )
+{
+    rc_t rc;
+    uint64_t idx2_eof;
+    uint32_t idx0_count;
+
+    assert ( self != NULL );
+
+    rc = KColumnIdx1OpenRead ( & self -> idx1,
+        dir, data_eof, & idx0_count, & idx2_eof, pgsize, checksum );
+    if ( rc == 0 )
+    {
+        rc = ( self -> idx1 . vers < 3 ) ?
+            KColumnIdx0OpenRead_v1 ( & self -> idx0, dir, self -> idx1 . bswap ):
+            KColumnIdx0OpenRead ( & self -> idx0, dir, idx0_count, self -> idx1 . bswap );
+        if ( rc == 0 )
+        {
+            rc = KColumnIdx2OpenRead ( & self -> idx2, dir, idx2_eof );
+            if ( rc == 0 || GetRCState ( rc ) == rcNotFound )
+            {
+                KColumnIdxEstablishIdRange ( self );
+                return 0;
+            }
+
+            KColumnIdx0Whack ( & self -> idx0 );
+        }
+
+        KColumnIdx1Whack ( & self -> idx1 );
+    }
+
+    return 0;
+}
+
+/* Whack
+ */
+rc_t KColumnIdxWhack ( KColumnIdx *self )
+{
+    rc_t rc;
+
+    assert ( self != NULL );
+
+    rc = KColumnIdx1Whack ( & self -> idx1 );
+    if ( rc == 0 )
+    {
+        KColumnIdx0Whack ( & self -> idx0 );
+        KColumnIdx2Whack ( & self -> idx2 );
+    }
+
+    return rc;
+}
+
+/* Version
+ */
+#ifndef KColumnIdxVersion
+rc_t KColumnIdxVersion ( const KColumnIdx *self, uint32_t *version )
+{
+    return KColumnIdx1Version ( & self -> idx1, version );
+}
+#endif
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+rc_t KColumnIdxIdRange ( const KColumnIdx *self,
+    int64_t *first, int64_t *last )
+{
+    assert ( self != NULL );
+    assert ( first != NULL );
+    assert ( last != NULL );
+
+    * first = self -> id_first;
+    * last = self -> id_upper - 1;
+
+    if ( self -> id_first == self -> id_upper )
+        return RC ( rcDB, rcColumn, rcAccessing, rcRange, rcInvalid );
+    return 0;
+}
+
+/* FindFirstRowId
+ */
+rc_t KColumnIdxFindFirstRowId ( const KColumnIdx * self,
+    int64_t * found, int64_t start )
+{
+    rc_t rc0, rc1;
+    KColBlockLoc bloc;
+    int64_t best0, best1;
+
+    assert ( self != NULL );
+    assert ( found != NULL );
+
+    /* global reject */
+    if ( start < self -> id_first || start >= self -> id_upper )
+        return RC ( rcDB, rcColumn, rcSelecting, rcRow, rcNotFound );
+
+    /* look in idx0 */
+    rc0 = KColumnIdx0FindFirstRowId ( & self -> idx0, found, start );
+    if ( rc0 == 0 )
+    {
+        if ( * found == start )
+            return 0;
+
+        best0 = * found;
+        assert ( best0 > start );
+    }
+
+    /* look in main index */
+    /* KColumnIdx1LocateFirstRowIdBlob returns the blob containing 'start', if such blob exists, otherwise the next blob (or RC if there's no next) */
+    rc1 = KColumnIdx1LocateFirstRowIdBlob ( & self -> idx1, & bloc, start );
+    if ( rc1 != 0 )
+    {
+        return rc0;
+    }
+    if ( start >= bloc . start_id )
+    {   /* found inside a blob */
+        best1 = start;
+    }
+    else
+    {   /* not found; pick the start of the next blob */
+        best1 = bloc . start_id;
+    }
+
+    if ( rc0 != 0 )
+    {
+        * found = best1;
+        return 0;
+    }
+
+    /* found in both - return lesser */
+
+    /* "found" already contains 'best0" */
+    assert ( * found == best0 );
+    if ( best1 < best0 )
+        * found = best1;
+
+    return 0;
+}
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdxLocateBlob ( const KColumnIdx *self,
+    KColBlobLoc *loc, int64_t first, int64_t upper )
+{
+    rc_t rc;
+
+    assert ( self != NULL );
+
+    /* convert "last" to "upper" */
+    if ( first >= ++ upper )
+        return RC ( rcDB, rcColumn, rcSelecting, rcRange, rcInvalid );
+
+    /* global reject */
+    if ( first < self -> id_first || upper > self -> id_upper )
+        return RC ( rcDB, rcColumn, rcSelecting, rcBlob, rcNotFound );
+
+    /* look in idx0 */
+    rc = KColumnIdx0LocateBlob ( & self -> idx0, loc, first, upper );
+    if ( GetRCState ( rc ) == rcNotFound )
+    {
+        KColBlockLoc bloc;
+
+        /* find block containing range */
+        rc = KColumnIdx1LocateBlock ( & self -> idx1, & bloc, first, upper );
+        if ( rc == 0 )
+        {
+            /* find location in idx2 */
+            rc = KColumnIdx2LocateBlob ( & self -> idx2,
+                loc, & bloc, first, upper, self -> idx1 . bswap );
+        }
+    }
+
+    return rc;
+}
diff --git a/libs/kdb/colidx0-priv.h b/libs/kdb/colidx0-priv.h
new file mode 100644
index 0000000..0e29158
--- /dev/null
+++ b/libs/kdb/colidx0-priv.h
@@ -0,0 +1,93 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_colidx0_priv_
+#define _h_colidx0_priv_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_colfmt_priv_
+#include "colfmt-priv.h"
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx0
+ *  level 0 index - event journaling
+ */
+typedef struct KColumnIdx0 KColumnIdx0;
+struct KColumnIdx0
+{
+    /* the in-core indices */
+    BSTree bst;
+    size_t count;
+};
+
+
+/* Open
+ */
+rc_t KColumnIdx0OpenRead_v1 ( KColumnIdx0 *self,
+    const KDirectory *dir, bool bswap );
+rc_t KColumnIdx0OpenRead ( KColumnIdx0 *self,
+    const KDirectory *dir, uint32_t count, bool bswap );
+
+/* Whack
+ */
+void KColumnIdx0Whack ( KColumnIdx0 *self );
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+bool KColumnIdx0IdRange ( const KColumnIdx0 *self,
+    int64_t *first, int64_t *upper );
+
+/* FindFirstRowId
+ */
+rc_t KColumnIdx0FindFirstRowId ( const KColumnIdx0 * self,
+    int64_t * found, int64_t start );
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdx0LocateBlob ( const KColumnIdx0 *self,
+    KColBlobLoc *loc, int64_t first, int64_t upper );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_colidx0_priv_ */
diff --git a/libs/kdb/colidx0.c b/libs/kdb/colidx0.c
new file mode 100644
index 0000000..fbdfe10
--- /dev/null
+++ b/libs/kdb/colidx0.c
@@ -0,0 +1,433 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "colidx0-priv.h"
+#include <kfs/file.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <byteswap.h>
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx0Node
+ *  a b-tree node
+ */
+typedef struct KColumnIdx0Node KColumnIdx0Node;
+struct KColumnIdx0Node
+{
+    BSTNode n;
+    KColBlobLoc loc;
+};
+
+/* Find
+ */
+static
+int64_t CC KColumnIdx0NodeFind ( const void *item, const BSTNode *n )
+{
+#define a ( * ( const int64_t* ) item )
+#define b ( ( const KColumnIdx0Node* ) n )
+
+    if ( a < b -> loc . start_id )
+        return -1;
+    return a >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+
+/* Sort
+ */
+static
+int64_t CC KColumnIdx0NodeSort ( const BSTNode *item, const BSTNode *n )
+{
+#define a ( ( const KColumnIdx0Node* ) item )
+#define b ( ( const KColumnIdx0Node* ) n )
+
+    if ( ( a -> loc . start_id + a -> loc . id_range ) <= b -> loc . start_id )
+        return -1;
+    return a -> loc . start_id >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+
+/* Whack
+ */
+static
+void CC KColumnIdx0NodeWhack ( BSTNode *n, void *ignore )
+{
+    free ( n );
+}
+
+/* Next
+ */
+#define KColumnIdx0NodeNext( node ) \
+    ( const KColumnIdx0Node* ) BSTNodeNext ( & ( node ) -> n )
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx0
+ *  level 0 index - event journaling
+ */
+
+/* Init
+ */
+static
+rc_t KColumnIdx0Inflate ( KColumnIdx0 *self,
+     const KColBlobLoc *buffer, uint32_t count )
+{
+    uint32_t i;
+    KColumnIdx0Node *n;
+
+    for ( n = NULL, i = 0; i < count; ++ i )
+    {
+        KColumnIdx0Node *exist;
+
+        if ( n == NULL )
+        {
+            n = malloc ( sizeof * n );
+            if ( n == NULL )
+                return RC ( rcDB, rcColumn, rcConstructing, rcMemory, rcExhausted );
+        }
+
+        n -> loc = buffer [ i ];
+        if ( BSTreeInsertUnique ( & self -> bst,
+             & n -> n, ( BSTNode** ) & exist, KColumnIdx0NodeSort ) )
+        {
+            assert ( n -> loc . start_id == exist -> loc . start_id );
+            assert ( n -> loc . id_range == exist -> loc . id_range );
+
+            assert ( ! n -> loc . u . blob . remove );
+            exist -> loc . pg = n -> loc . pg;
+            exist -> loc . u . blob . size = n -> loc . u . blob . size;
+        }
+        else
+        {
+            ++ self -> count;
+            n = NULL;
+        }
+    }
+
+    free ( n );
+
+    return 0;
+}
+
+static
+void KColumnIdx0Swap ( KColBlobLoc *buffer, uint32_t count )
+{
+    uint32_t i;
+    for ( i = 0; i < count; ++ i )
+    {
+        buffer [ i ] . pg = bswap_64 ( buffer [ i ] . pg );
+        buffer [ i ] . u . gen = bswap_32 ( buffer [ i ] . u . gen );
+        buffer [ i ] . id_range = bswap_32 ( buffer [ i ] . id_range );
+        buffer [ i ] . start_id = bswap_64 ( buffer [ i ] . start_id );
+    }
+}
+
+static
+rc_t KColumnIdx0Init_v1 ( KColumnIdx0 *self, const KFile *f, bool bswap )
+{
+    rc_t rc;
+    KColBlobLoc *buffer = malloc ( 2048 * sizeof * buffer );
+    if ( buffer == NULL )
+        rc = RC ( rcDB, rcColumn, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        uint64_t pos;
+        size_t num_read;
+
+        for ( pos = 0;; pos += num_read )
+        {
+            uint32_t count;
+
+            rc = KFileReadAll ( f, pos,
+                buffer, 2048 * sizeof * buffer, & num_read );
+            if ( rc != 0 )
+                break;
+            if ( num_read == 0 )
+                break;
+            if ( ( num_read % sizeof * buffer ) != 0 )
+            {
+                rc = RC ( rcDB, rcColumn, rcConstructing, rcIndex, rcCorrupt );
+                break;
+            }
+
+            count = (uint32_t)( num_read / sizeof * buffer );
+
+            if ( bswap )
+                KColumnIdx0Swap ( buffer, count );
+
+            rc = KColumnIdx0Inflate ( self, buffer, count );
+            if ( rc != 0 )
+                break;
+        }
+
+        free ( buffer );
+    }
+    return rc;
+}
+
+static
+rc_t KColumnIdx0Init ( KColumnIdx0 *self, const KFile *f, uint32_t total, bool bswap )
+{
+    rc_t rc;
+    KColBlobLoc *buffer = malloc ( 2048 * sizeof * buffer );
+    if ( buffer == NULL )
+        rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        uint32_t i, count;
+
+        for ( rc = 0, i = 0; i < total; i += count )
+        {
+            size_t num_read;
+
+            count = total - i;
+            if ( count > 2048 )
+                count = 2048;
+
+            rc = KFileReadAll ( f, i * sizeof * buffer,
+                buffer, count * sizeof * buffer, & num_read );
+            if ( rc != 0 )
+                break;
+
+            /* detect EOF */
+            if ( num_read == 0 )
+            {
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcData, rcCorrupt );
+                break;
+            }
+
+            /* detect short read -
+               see comment in idx1. */
+            if ( ( num_read % sizeof * buffer ) != 0 )
+            {
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcTransfer, rcIncomplete );
+                break;
+            }
+
+            count = (uint32_t)( num_read / sizeof * buffer );
+
+            if ( bswap )
+                KColumnIdx0Swap ( buffer, count );
+
+            rc = KColumnIdx0Inflate ( self, buffer, count );
+            if ( rc != 0 )
+                break;
+        }
+
+        free ( buffer );
+    }
+    return rc;
+}
+
+/* Open
+ */
+rc_t KColumnIdx0OpenRead_v1 ( KColumnIdx0 *self, const KDirectory *dir, bool bswap )
+{
+    rc_t rc;
+    uint64_t eof;
+
+    BSTreeInit ( & self -> bst );
+    self -> count = 0;
+
+    rc = KDirectoryVFileSize ( dir, & eof, "idx0", NULL );
+    if ( rc == 0 )
+    {
+        if ( eof != 0 )
+        {
+            const KFile *f;
+            rc = KDirectoryVOpenFileRead ( dir, & f, "idx0", NULL );
+            if ( rc == 0 )
+            {
+                rc = KColumnIdx0Init_v1 ( self, f, bswap );
+                KFileRelease ( f );
+            }
+        }
+    }
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {
+        rc = 0;
+    }
+
+    return rc;
+}
+
+rc_t KColumnIdx0OpenRead ( KColumnIdx0 *self, const KDirectory *dir, uint32_t count, bool bswap )
+{
+    BSTreeInit ( & self -> bst );
+    self -> count = 0;
+
+    if ( count != 0 )
+    {
+        const KFile *f;
+        rc_t rc = KDirectoryVOpenFileRead ( dir, & f, "idx0", NULL );
+        if ( rc == 0 )
+        {
+            rc = KColumnIdx0Init ( self, f, count, bswap );
+            KFileRelease ( f );
+        }
+        return rc;
+    }
+
+    return 0;
+}
+
+/* Whack
+ */
+void KColumnIdx0Whack ( KColumnIdx0 *self )
+{
+    BSTreeWhack ( & self -> bst, KColumnIdx0NodeWhack, NULL );
+    BSTreeInit ( & self -> bst );
+}
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+bool KColumnIdx0IdRange ( const KColumnIdx0 *self,
+    int64_t *first, int64_t *upper )
+{
+    const KColumnIdx0Node *a, *z;
+
+    assert ( self != NULL );
+    assert ( first != NULL );
+    assert ( upper != NULL );
+
+    a = ( const KColumnIdx0Node* ) BSTreeFirst ( & self -> bst );
+    if ( a == NULL )
+        return false;
+
+    z = ( const KColumnIdx0Node* ) BSTreeLast ( & self -> bst );
+    assert ( z != NULL );
+
+    * first = a -> loc . start_id;
+    * upper = z -> loc . start_id + z -> loc . id_range;
+    assert ( * first < * upper );
+
+    return true;
+}
+
+
+/* FindFirstRowId
+ */
+typedef struct FindFirstRowIdData FindFirstRowIdData;
+struct FindFirstRowIdData
+{
+    int64_t start;
+    const KColumnIdx0Node * next;
+};
+
+static
+int64_t CC KColumnIdx0NodeFindFirstRowId ( const void * item, const BSTNode * n )
+{
+    FindFirstRowIdData * pb = ( FindFirstRowIdData * ) item;
+
+#define a ( pb -> start )
+#define b ( ( const KColumnIdx0Node * ) n )
+
+    if ( a < b -> loc . start_id )
+    {
+        if ( pb -> next == NULL )
+            pb -> next = b;
+        else if ( b -> loc . start_id < pb -> next -> loc . start_id )
+            pb -> next = b;
+        return -1;
+    }
+
+    return a >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+
+rc_t KColumnIdx0FindFirstRowId ( const KColumnIdx0 * self,
+    int64_t * found, int64_t start )
+{
+    FindFirstRowIdData pb;
+    const KColumnIdx0Node * n;
+
+    assert ( self != NULL );
+    assert ( found != NULL );
+
+    pb . start = start;
+    pb . next = NULL;
+
+    n = ( const KColumnIdx0Node* )
+        BSTreeFind ( & self -> bst, & pb, KColumnIdx0NodeFindFirstRowId );
+
+    if ( n != NULL )
+    {
+        assert ( start >= n -> loc . start_id && start < n -> loc . start_id + n -> loc . id_range );
+        * found = start;
+        return 0;
+    }
+
+    if ( pb . next != 0 )
+    {
+        assert ( pb . next -> loc . start_id > start );
+        * found = pb . next -> loc . start_id;
+        return 0;
+    }
+
+    return SILENT_RC ( rcDB, rcColumn, rcSelecting, rcRow, rcNotFound );
+}
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdx0LocateBlob ( const KColumnIdx0 *self,
+    KColBlobLoc *loc, int64_t first, int64_t upper )
+{
+    const KColumnIdx0Node *n;
+
+    assert ( self != NULL );
+    assert ( loc != NULL );
+    assert ( first < upper );
+
+    n = ( const KColumnIdx0Node* )
+        BSTreeFind ( & self -> bst, & first, KColumnIdx0NodeFind );
+
+    if ( n == NULL )
+        return SILENT_RC ( rcDB, rcColumn, rcSelecting, rcBlob, rcNotFound );
+
+    assert ( first >= n -> loc . start_id );
+    assert ( first < ( n -> loc . start_id + n -> loc . id_range ) );
+
+    if ( upper > ( n -> loc . start_id + n -> loc . id_range ) )
+        return RC ( rcDB, rcColumn, rcSelecting, rcRange, rcInvalid );
+
+    * loc = n -> loc;
+    assert ( ! loc -> u . blob . remove );
+    return 0;
+}
diff --git a/libs/kdb/colidx1-priv.h b/libs/kdb/colidx1-priv.h
new file mode 100644
index 0000000..7844545
--- /dev/null
+++ b/libs/kdb/colidx1-priv.h
@@ -0,0 +1,130 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_colidx1_priv_
+#define _h_colidx1_priv_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_colfmt_priv_
+#include "colfmt-priv.h"
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifndef LAZY_LOAD_COLUMN_IDX1
+#define LAZY_LOAD_COLUMN_IDX1 0
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KColIdxBlock;
+struct KColBlockLocInfo;
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx1
+ *  level 1 index
+ */
+typedef struct KColumnIdx1 KColumnIdx1;
+struct KColumnIdx1
+{
+#if USE_BSTREE_IN_COLUMN_IDX1
+    /* tree of level-2 block locators */
+    BSTree bst;
+#else
+    /***** binary searched array with state *****/
+    uint64_t last_found;
+    const KColBlockLoc *data;
+#endif
+    struct KFile const *f;
+    struct KFile const *fidx;
+    uint32_t count;
+    uint32_t vers;
+#if LAZY_LOAD_COLUMN_IDX1
+    uint32_t load_off;
+    rc_t load_rc;
+#endif
+    bool bswap;
+    bool loaded;
+    uint8_t align [ sizeof ( size_t ) - 2 ];
+};
+
+/* Open
+ */
+rc_t KColumnIdx1OpenRead ( KColumnIdx1 *self, const KDirectory *dir,
+    uint64_t *data_eof, uint32_t *idx0_count, uint64_t *idx2_eof,
+    size_t *pgsize, int32_t *checksum );
+
+/* Whack
+ */
+rc_t KColumnIdx1Whack ( KColumnIdx1 *self );
+
+/* Version
+ */
+rc_t KColumnIdx1Version ( const KColumnIdx1 *self, uint32_t *version );
+#define KColumnIdx1Version( self, version ) \
+    ( * ( version ) = ( self ) -> vers, 0 )
+
+/* ByteOrder
+ */
+rc_t KColumnIdx1ByteOrder ( const KColumnIdx1 *self, bool *reversed );
+#define KColumnIdx1ByteOrder( self, reversed ) \
+    ( * ( reversed ) = ( self ) -> bswap, 0 )
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+bool KColumnIdx1IdRange ( const KColumnIdx1 *self,
+    int64_t *first, int64_t *upper );
+
+/* LocateFirstRowIdBlob
+ */
+rc_t KColumnIdx1LocateFirstRowIdBlob ( const KColumnIdx1 * self,
+    KColBlockLoc * bloc, int64_t start );
+
+/* LocateBlock
+ *  locates an idx2 block by range
+ */
+rc_t KColumnIdx1LocateBlock ( const KColumnIdx1 *self,
+    KColBlockLoc *bloc, int64_t first, int64_t upper );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_colidx1_priv_ */
diff --git a/libs/kdb/colidx1.c b/libs/kdb/colidx1.c
new file mode 100644
index 0000000..46f7759
--- /dev/null
+++ b/libs/kdb/colidx1.c
@@ -0,0 +1,771 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "colidx1-priv.h"
+#include <kfs/file.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <byteswap.h>
+
+#if USE_BSTREE_IN_COLUMN_IDX1
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx1Node
+ *  a binary search tree node
+ */
+typedef struct KColumnIdx1Node KColumnIdx1Node;
+struct KColumnIdx1Node
+{
+    BSTNode n;
+    KColBlockLoc loc;
+};
+
+/* Find
+ */
+static
+int64_t CC KColumnIdx1NodeFind ( const void *item, const BSTNode *n )
+{
+#define a ( * ( const int64_t* ) item )
+#define b ( ( const KColumnIdx1Node* ) n )
+
+    if ( a < b -> loc . start_id )
+        return -1;
+    return a >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+
+/* Sort
+ */
+static
+int64_t CC KColumnIdx1NodeSort ( const BSTNode *item, const BSTNode *n )
+{
+#define a ( ( const KColumnIdx1Node* ) item )
+#define b ( ( const KColumnIdx1Node* ) n )
+
+    if ( ( a -> loc . start_id + a -> loc . id_range ) <= b -> loc . start_id )
+        return -1;
+    return a -> loc . start_id >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+
+/* Whack
+ */
+static
+void CC KColumnIdx1NodeWhack ( BSTNode *n, void *ignore )
+{
+    free ( n );
+}
+
+#endif /* USE_BSTREE_IN_COLUMN_IDX1 */
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx1
+ *  level 1 index
+ */
+
+/* Init
+ */
+#if USE_BSTREE_IN_COLUMN_IDX1
+static
+rc_t KColumnIdx1Inflate ( KColumnIdx1 *self,
+    const KColBlockLoc *buffer, uint32_t count )
+{
+    uint32_t i;
+    for ( i = 0; i < count; ++ i )
+    {
+        KColumnIdx1Node *exist, *n = malloc ( sizeof * n );
+        if ( n == NULL )
+            return RC ( rcDB, rcColumn, rcConstructing, rcMemory, rcExhausted );
+
+        n -> loc = buffer [ i ];
+        if ( BSTreeInsertUnique ( & self -> bst,
+             & n -> n, ( BSTNode** ) & exist, KColumnIdx1NodeSort ) )
+        {
+            free ( n );
+            return RC ( rcDB, rcColumn, rcConstructing, rcIndex, rcCorrupt );
+        }
+
+        ++ self -> count;
+    }
+
+    return 0;
+}
+#endif /* USE_BSTREE_IN_COLUMN_IDX1 */
+
+static
+void KColumnIdx1Swap ( KColBlockLoc *buffer, uint32_t count )
+{
+    uint32_t i;
+    for ( i = 0; i < count; ++ i )
+    {
+        buffer [ i ] . pg = bswap_64 ( buffer [ i ] . pg );
+        buffer [ i ] . u . gen = bswap_32 ( buffer [ i ] . u . gen );
+        buffer [ i ] . id_range = bswap_32 ( buffer [ i ] . id_range );
+        buffer [ i ] . start_id = bswap_64 ( buffer [ i ] . start_id );
+    }
+}
+
+#if ! USE_BSTREE_IN_COLUMN_IDX1
+static
+rc_t KColumnIdx1Init ( KColumnIdx1 *self, uint32_t off, uint32_t count )
+{
+    rc_t rc = 0;
+    KColBlockLoc * data = malloc ( count * sizeof  * data );
+    if ( data == NULL )
+        rc = RC ( rcDB, rcColumn, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        size_t num_read;
+        uint32_t i, cnt;
+        for ( rc = 0, i = 0; i < count; off += ( uint32_t ) num_read, i += cnt )
+        {
+            cnt = count - i;
+            rc = KFileReadAll ( self -> f, off,
+                & data [ i ], cnt * sizeof * data, & num_read );
+            if ( rc != 0 )
+                break;
+            if ( num_read == 0 )
+                break;
+            if ( ( num_read % sizeof * data ) != 0 )
+            {
+                rc = RC ( rcDB, rcColumn, rcConstructing, rcIndex, rcCorrupt );
+                break;
+            }
+            
+            if ( self -> bswap )
+                KColumnIdx1Swap ( & data [ i ], cnt );
+        }
+
+        if ( rc != 0 )
+            free ( data );
+        else
+        {
+            self -> data = data;
+            self -> count = count;
+            self -> loaded = true;
+        }
+    }
+
+    return rc;
+}
+
+#else /* USE_BSTREE_IN_COLUMN_IDX1 */
+static
+rc_t KColumnIdx1Init ( KColumnIdx1 *self, uint32_t off, uint32_t count )
+{
+    rc_t rc;
+    KColBlockLoc *buffer = malloc ( 2048 * sizeof * buffer );
+    if ( buffer == NULL )
+        rc = RC ( rcDB, rcColumn, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        size_t num_read;
+        uint32_t i, cnt;
+        for ( rc = 0, i = 0; i < count; off += ( uint32_t ) num_read, i += cnt )
+        {
+            cnt = count - i;
+            if ( cnt > 2048 )
+                cnt = 2048;
+
+            rc = KFileReadAll ( self -> f, off,
+                buffer, cnt * sizeof * buffer, & num_read );
+            if ( rc != 0 )
+                break;
+            if ( num_read == 0 )
+                break;
+            if ( ( num_read % sizeof * buffer ) != 0 )
+            {
+                rc = RC ( rcDB, rcColumn, rcConstructing, rcIndex, rcCorrupt );
+                break;
+            }
+
+            if ( self -> bswap )
+                KColumnIdx1Swap ( buffer, cnt );
+
+            rc = KColumnIdx1Inflate ( self, buffer, cnt );
+            if ( rc != 0 )
+                break;
+        }
+
+        if ( rc == 0 )
+            self -> loaded = true;
+
+        free ( buffer );
+    }
+    return rc;
+}
+#endif /* USE_BSTREE_IN_COLUMN_IDX1 */
+
+/* Open
+ */
+rc_t KColumnIdx1OpenRead ( KColumnIdx1 *self, const KDirectory *dir,
+    uint64_t *data_eof, uint32_t *idx0_count, uint64_t *idx2_eof,
+    size_t *pgsize, int32_t *checksum )
+{
+    rc_t rc;
+#if USE_BSTREE_IN_COLUMN_IDX1
+    BSTreeInit ( & self -> bst );
+#else
+    self -> last_found = 0;
+    self -> data = NULL;
+#endif
+    self -> fidx = NULL;
+    self -> count = 0;
+    self -> vers = 0;
+#if LAZY_LOAD_COLUMN_IDX1
+    self -> load_off = 0;
+    self -> load_rc = 0;
+#endif
+    self -> bswap = false;
+    self -> loaded = false;
+            
+    rc = KDirectoryVOpenFileRead ( dir, & self -> f, "idx1", NULL );
+    if ( rc == 0 )
+    {
+        KColumnHdr hdr;
+        size_t num_bytes;
+        rc = KFileReadAll ( self -> f, 0, & hdr, sizeof hdr, & num_bytes );
+        if ( rc == 0 )
+        {
+            if ( num_bytes == 0 )
+                rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcNotFound );
+            else if ( num_bytes < KColumnHdrMinSize ( hdr ) )
+                rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+            else
+            {
+                rc = KDBHdrValidate ( & hdr . dad, num_bytes, 1, KCOL_CURRENT_VERSION );
+                if ( GetRCState ( rc ) == rcIncorrect && GetRCObject ( rc ) == rcByteOrder )
+                {
+                    self -> bswap = true;
+                    hdr . dad . endian = bswap_32 ( hdr . dad . endian );
+                    hdr . dad . version = bswap_32 ( hdr . dad . version );
+                    rc = KDBHdrValidate ( & hdr . dad, num_bytes, 1, KCOL_CURRENT_VERSION );
+                }
+                if ( rc == 0 )
+                {
+                    uint32_t off, count;
+
+                    switch ( hdr . dad . version )
+                    {
+                    case 1:
+                        if ( num_bytes < KColumnHdrOffset ( hdr, v1 ) )
+                            rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+                        else
+                        {
+                            if ( self -> bswap )
+                            {
+                                hdr . u . v1 . data_eof = bswap_64 ( hdr . u . v1 . data_eof );
+                                hdr . u . v1 . idx2_eof = bswap_64 ( hdr . u . v1 . idx2_eof );
+                                hdr . u . v1 . num_blocks = bswap_32 ( hdr . u . v1 . num_blocks );
+                                hdr . u . v1 . page_size = bswap_32 ( hdr . u . v1 . page_size );
+                            }
+
+                            * data_eof = hdr . u . v1 . data_eof;
+                            * idx2_eof = hdr . u . v1 . idx2_eof;
+                            * pgsize = hdr . u . v1 . page_size;
+                            * checksum = hdr . u . v1 . checksum;
+                            count = hdr . u . v1 . num_blocks;
+                            off = KColumnHdrOffset ( hdr, v1 );
+
+                            /* not supported in v1 */
+                            * idx0_count = 0;
+                        }
+                        break;
+
+                    default:
+                        rc = KDirectoryVOpenFileRead ( dir, ( const KFile** ) & self -> fidx, "idx", NULL );
+                        if ( rc == 0 )
+                        {
+                            off = sizeof hdr . dad;
+                            rc = KFileReadAll ( self -> fidx, 0, & hdr, sizeof hdr, & num_bytes );
+                            if ( rc == 0 )
+                            {
+                                if ( num_bytes < KColumnHdrOffset ( hdr, v2 ) )
+                                    rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+                                else
+                                {
+                                    rc = KDBHdrValidate ( & hdr . dad,
+                                        num_bytes, 2, KCOL_CURRENT_VERSION );
+                                    if ( GetRCState ( rc ) == rcIncorrect && GetRCObject ( rc ) == rcByteOrder )
+                                    {
+                                        if ( ! self->bswap ) /* catch mis-matched endianess */
+                                            rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+                                        else
+                                        {
+                                            hdr . dad . endian = bswap_32 ( hdr . dad . endian );
+                                            hdr . dad . version = bswap_32 ( hdr . dad . version );
+                                            rc = KDBHdrValidate ( & hdr . dad, num_bytes, 1, KCOL_CURRENT_VERSION );
+                                        }
+                                    }
+                                    else if ( self -> bswap ) /* catch mis-matched endianess */
+                                        rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+
+                                    if ( rc == 0 ) switch ( hdr . dad . version )
+                                    {
+                                    case 2:
+                                        if ( self -> bswap )
+                                        {
+                                            hdr. u . v2 . data_eof = bswap_64 ( hdr. u . v2 . data_eof );
+                                            hdr. u . v2 . idx2_eof = bswap_64 ( hdr. u . v2 . idx2_eof );
+                                            hdr. u . v2 . num_blocks = bswap_32 ( hdr. u . v2 . num_blocks );
+                                            hdr. u . v2 . page_size = bswap_32 ( hdr. u . v2 . page_size );
+                                        }
+
+                                        * data_eof = hdr . u . v2 . data_eof;
+                                        * idx2_eof = hdr . u . v2 . idx2_eof;
+                                        * pgsize = hdr . u . v2 . page_size;
+                                        * checksum = hdr . u . v2 . checksum;
+                                        count = hdr . u . v2 . num_blocks;
+                                        * idx0_count = 0;
+                                        break;
+
+                                    case 3:
+                                        if ( self -> bswap )
+                                        {
+                                            hdr. u . v3 . data_eof = bswap_64 ( hdr. u . v3 . data_eof );
+                                            hdr. u . v3 . idx2_eof = bswap_64 ( hdr. u . v3 . idx2_eof );
+                                            hdr. u . v3 . idx0_count = bswap_32 ( hdr. u . v3 . idx0_count );
+                                            hdr. u . v3 . num_blocks = bswap_32 ( hdr. u . v3 . num_blocks );
+                                            hdr. u . v3 . page_size = bswap_32 ( hdr. u . v3 . page_size );
+                                        }
+
+                                        * data_eof = hdr . u . v3 . data_eof;
+                                        * idx2_eof = hdr . u . v3 . idx2_eof;
+                                        * idx0_count = hdr . u . v3 . idx0_count;
+                                        * pgsize = hdr . u . v3 . page_size;
+                                        * checksum = hdr . u . v3 . checksum;
+                                        count = hdr . u . v3 . num_blocks;
+                                        break;
+
+                                    default:
+                                        rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcBadVersion );
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    if ( rc == 0 )
+                    {
+                        self -> vers = hdr . dad . version;
+#if LAZY_LOAD_COLUMN_IDX1
+                        self -> load_off = off;
+                        self -> count = count;
+#else
+                        rc = KColumnIdx1Init ( self, off, count );
+                        if ( rc == 0 )
+#endif
+                            return rc;
+                    }
+
+                    KFileRelease ( self -> fidx );
+                    self -> fidx = NULL;
+                }
+            }
+        }
+
+        KFileRelease ( self -> f );
+        self -> f = NULL;
+    }
+
+    return rc;
+}
+
+#if LAZY_LOAD_COLUMN_IDX1
+static
+rc_t KColumnIdx1LazyLoad ( const KColumnIdx1 * cself )
+{
+    uint32_t off, count;
+    KColumnIdx1 * self = ( KColumnIdx1* ) cself;
+
+    assert ( self != NULL );
+    if ( self -> loaded )
+        return self -> load_rc;
+
+    count = self -> count;
+    off = self -> load_off;
+    self -> count = 0;
+    self -> load_off = 0;
+
+    if ( count == 0 )
+    {
+        self -> loaded = true;
+        return 0;
+    }
+
+    return self -> load_rc = KColumnIdx1Init ( self, off, count );
+}
+#else
+#define KColumnIdx1LazyLoad( self ) 0
+#endif
+
+
+/* Whack
+ */
+rc_t KColumnIdx1Whack ( KColumnIdx1 *self )
+{
+    rc_t rc = KFileRelease ( self -> fidx );
+    if ( rc == 0 )
+    {
+        self -> fidx = NULL;
+        rc = KFileRelease ( self -> f );
+        if ( rc == 0 )
+        {
+            self -> f = NULL;
+#if USE_BSTREE_IN_COLUMN_IDX1
+            BSTreeWhack ( & self -> bst, KColumnIdx1NodeWhack, NULL );
+            BSTreeInit ( & self -> bst );
+#else
+            free ( ( void * ) self -> data );
+            self -> data = NULL;
+#endif
+        }
+    }
+    return rc;
+}
+
+/* Version
+ */
+#ifndef KColumnIdx1Version
+rc_t KColumnIdx1Version ( const KColumnIdx1 *self, uint32_t *version )
+{
+    * version = ( uint32_t ) self -> vers;
+    return 0;
+}
+#endif
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+bool KColumnIdx1IdRange ( const KColumnIdx1 *self,
+    int64_t *first, int64_t *upper )
+{
+    rc_t rc = KColumnIdx1LazyLoad ( self );
+    if ( rc != 0 )
+        return false;
+
+    assert ( self != NULL );
+    assert ( first != NULL );
+    assert ( upper != NULL );
+#if USE_BSTREE_IN_COLUMN_IDX1
+    {
+        const KColumnIdx1Node *a, *z;
+        a = ( const KColumnIdx1Node* ) BSTreeFirst ( & self -> bst );
+        z = ( const KColumnIdx1Node* ) BSTreeLast ( & self -> bst );
+
+        if ( a == NULL )
+            return false;
+
+        assert ( z != NULL );
+
+        * first = a -> loc . start_id;
+        * upper = z -> loc . start_id + z -> loc . id_range;
+    }
+#else
+    if ( self -> count == 0 )
+        return false;
+
+    *first = self->data[0].start_id ;
+    *upper = self->data[self->count-1].start_id + self->data[self->count-1].id_range;
+#endif
+    assert ( * first < * upper );
+
+    return true;
+}
+
+/* LocateFirstRowIdBlob
+ */
+#if USE_BSTREE_IN_COLUMN_IDX1
+typedef struct FindFirstRowIdData FindFirstRowIdData;
+struct FindFirstRowIdData
+{
+    int64_t start;
+    const KColumnIdx1Node * next;
+};
+
+static
+int64_t CC KColumnIdx1NodeFindFirstRowId ( const void * item, const BSTNode * n )
+{
+    FindFirstRowIdData * pb = ( FindFirstRowIdData * ) item;
+
+#define a ( pb -> start )
+#define b ( ( const KColumnIdx1Node * ) n )
+
+    if ( a < b -> loc . start_id )
+    {
+        if ( pb -> next == NULL )
+            pb -> next = b;
+        else if ( b -> loc . start_id < pb -> next -> loc . start_id )
+            pb -> next = b;
+        return -1;
+    }
+
+    return a >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+#endif /* USE_BSTREE_IN_COLUMN_IDX1 */
+
+rc_t KColumnIdx1LocateFirstRowIdBlob ( const KColumnIdx1 * self,
+    KColBlockLoc * bloc, int64_t start )
+{
+    rc_t rc = KColumnIdx1LazyLoad ( self );
+    if ( rc != 0 )
+        return rc;
+
+    assert ( self != NULL );
+    assert ( bloc != NULL );
+
+#if USE_BSTREE_IN_COLUMN_IDX1
+    {
+        FindFirstRowIdData pb;
+        const KColumnIdx1Node * n;
+
+        pb . start = start;
+        pb . next = NULL;
+
+        n = ( const KColumnIdx1Node* )
+            BSTreeFind ( & self -> bst, & pb, KColumnIdx1NodeFindFirstRowId );
+
+        if ( n != NULL )
+        {
+            assert ( start >= n -> loc . start_id && start < n -> loc . start_id + n -> loc . id_range );
+            * bloc = n -> loc;
+            return 0;
+        }
+
+        if ( pb . next != NULL )
+        {
+            assert ( start < pb . next -> loc . start_id );
+            * bloc = pb . next -> loc;
+            return 0;
+        }
+        
+    }
+#else /* USE_BSTREE_IN_COLUMN_IDX1 */
+    if ( self -> count != 0 )
+    {
+        const KColBlockLoc * data = self -> data;
+        if ( data [ 0 ] . start_id <= start )
+        {
+            uint64_t high = self -> count - 1;
+            if ( data [ high ] . start_id + data [ high ] . id_range > start )
+            {
+                uint64_t low, last_found = self -> last_found;
+                assert ( last_found <= high );
+                if ( data [ last_found ] . start_id <= start )
+                {
+                    if ( data [ last_found ] . start_id + data [ last_found ] . id_range > start )
+                    {
+                        * bloc = data [ last_found ];
+                        return 0;
+                    }
+
+                    if ( last_found < high && data [ last_found + 1 ] . start_id > start )
+                    {
+                        * bloc = data [ last_found + 1 ];
+                        return 0;
+                    }
+
+                    low = last_found;
+                }
+                else
+                {
+                    low = 0;
+                    high = last_found;
+                }
+
+                while ( low < high )
+                {
+                    last_found = ( low + high ) / 2;
+                    if ( data [ last_found ] . start_id > start )
+                        high = last_found;
+                    else if ( data [ last_found + 1 ] . start_id > start )
+                        break;
+                    else
+                        low = last_found + 1;
+
+                    if ( low == high )
+                    {
+                        last_found = high;
+                        break;
+                    }
+                    else
+                    {
+                        int64_t left_diff = start - data [ low ] . start_id;
+                        int64_t right_diff = data [ high ] . start_id - start;
+
+                        if ( left_diff < 0 || right_diff < 0 )
+                            return SILENT_RC ( rcDB, rcColumn, rcSelecting, rcBlob, rcNotFound );
+
+                        assert ( data [ high ] . start_id - data [ low ] . start_id != 0 );
+                        last_found = ( high * left_diff + low * right_diff )
+                            / ( data [ high ] . start_id - data [ low ] . start_id );
+
+                        assert ( last_found <= high );
+                        assert ( last_found >= low );
+                    }
+                }
+
+                /* check what we have at last_found */
+                if ( start >= data [ last_found ] . start_id )
+                {
+                    if ( start < data [ last_found ] . start_id + data [ last_found ] . id_range )
+                    {
+                        * bloc = data [ last_found ];
+                        return 0;
+                    }
+
+                    assert ( last_found < self -> count );
+                    if ( start < data [ last_found + 1 ] . start_id )
+                    {
+                        * bloc = data [ last_found + 1 ];
+                        return 0;
+                    }
+                }
+            }
+        }
+    }
+#endif /* USE_BSTREE_IN_COLUMN_IDX1 */
+
+    return SILENT_RC ( rcDB, rcColumn, rcSelecting, rcBlob, rcNotFound );
+}
+
+/* LocateBlock
+ *  locates an idx2 block by range
+ *  return values:
+ */
+rc_t KColumnIdx1LocateBlock ( const KColumnIdx1 *self,
+    KColBlockLoc *bloc, int64_t first, int64_t upper )
+{
+    rc_t rc = KColumnIdx1LazyLoad ( self );
+    if ( rc != 0 )
+        return rc;
+
+    assert ( self != NULL );
+    assert ( bloc != NULL );
+    assert ( first < upper );
+
+#if USE_BSTREE_IN_COLUMN_IDX1
+    {
+        const KColumnIdx1Node *n = ( const KColumnIdx1Node* )
+            BSTreeFind ( & self -> bst, & first, KColumnIdx1NodeFind );
+
+        if ( n == NULL )
+            return RC ( rcDB, rcColumn, rcSelecting, rcBlob, rcNotFound );
+
+        assert ( first >= n -> loc . start_id );
+        assert ( first < ( n -> loc . start_id + n -> loc . id_range ) );
+
+        if ( upper > ( n -> loc . start_id + n -> loc . id_range ) )
+            return RC ( rcDB, rcColumn, rcSelecting, rcRange, rcInvalid );
+
+        * bloc = n -> loc;
+    }
+#else /* USE_BSTREE_IN_COLUMN_IDX1 */
+    {
+        const KColBlockLoc * data = self->data;
+        uint64_t last_found = self->last_found;
+        uint64_t low;
+        uint64_t high;
+
+        if(   self -> count == 0 /** empty **/
+              || first < data[0].start_id /** out of range **/
+            ) return RC ( rcDB, rcColumn, rcSelecting, rcBlob, rcNotFound );
+
+        high = self -> count-1;
+        if ( first >= data[high].start_id ) /** treat high bin separately ***/
+        {
+            last_found = low = high;
+        }
+        else
+        {
+            low = 0;
+            if( last_found == high)    /** previous search was in high bin, but this one is not ***/
+                last_found = high/2;   /** set in the middle??? **/
+        }
+        while(low < high)
+        {
+            assert (last_found < self -> count-1 ); /** because of operations preceding this loop **/
+            if(first < data[last_found].start_id){/*search to the left*/
+                high= last_found;
+            } else if(first >= data[last_found+1].start_id){ /* seach to the right */
+                low = last_found+1;
+            } else { /** we have a potential answer **/
+                break;
+            }
+#if 1
+            assert ( high >= low );
+#else
+            if ( high < low ) /*** is it still needed???***/
+                return RC ( rcDB, rcColumn, rcSelecting, rcBlob, rcNotFound );
+#endif
+
+            if(high==low){ /** windows is closed **/
+                last_found = high;
+                break;
+            }else { /*** linear approximation of a pivot point ***/
+                int64_t left_diff = first - data[low].start_id;
+                int64_t right_diff = data[high].start_id - first; /* ?? is this right? */
+
+                if ( left_diff < 0 || right_diff < 0 )
+                    return RC ( rcDB, rcColumn, rcSelecting, rcBlob, rcNotFound );
+
+                assert ( data[high].start_id - data[low].start_id != 0 );
+                last_found = ( high*left_diff + low * right_diff )
+                    / ( data[high].start_id - data[low].start_id );
+
+                assert(last_found <= high);
+                assert(last_found >= low);
+            }
+        }
+
+        /** we have an answer **/
+        if((first < data[last_found].start_id) ||
+            (first >=  data[last_found].start_id+data[last_found].id_range))
+            return RC ( rcDB, rcColumn, rcSelecting, rcBlob, rcNotFound );
+
+        if(upper > data[last_found].start_id+data[last_found].id_range)
+            return RC ( rcDB, rcColumn, rcSelecting, rcRange, rcInvalid );
+
+        * bloc = data[last_found];
+        ((KColumnIdx1*)self)->last_found = last_found;
+    }
+#endif /* USE_BSTREE_IN_COLUMN_IDX1 */
+    return 0;
+}
diff --git a/libs/kdb/colidx2-priv.h b/libs/kdb/colidx2-priv.h
new file mode 100644
index 0000000..2e28a65
--- /dev/null
+++ b/libs/kdb/colidx2-priv.h
@@ -0,0 +1,99 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_colidx2_priv_
+#define _h_colidx2_priv_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_colfmt_priv_
+#include "colfmt-priv.h"
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#include <klib/data-buffer.h>
+#include "idxblk-priv.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx2
+ *  level 2 index
+ */
+
+typedef struct KColumnIdx2BlockCache
+{
+    /* single page cache */
+    void *block;
+    int64_t start_id;
+    size_t count;
+    KColIdxBlock iblk;
+} KColumnIdx2BlockCache;
+
+typedef struct KColumnIdx2 KColumnIdx2;
+struct KColumnIdx2
+{
+    /* for adding new blocks */
+    uint64_t eof;
+
+    /* idx2 itself */
+    struct KFile const *f;
+
+    /* full caching mechanism */
+    KDataBuffer cstorage;
+    uint32_t	last;
+};
+
+/* Open
+ */
+rc_t KColumnIdx2OpenRead ( KColumnIdx2 *self,
+    const KDirectory *dir, uint64_t eof );
+
+/* Whack
+ */
+rc_t KColumnIdx2Whack ( KColumnIdx2 *self );
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdx2LocateBlob ( const KColumnIdx2 *self,
+    KColBlobLoc *loc, const KColBlockLoc *bloc,
+    int64_t first, int64_t upper, bool bswap );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_colidx2_priv_ */
diff --git a/libs/kdb/colidx2.c b/libs/kdb/colidx2.c
new file mode 100644
index 0000000..61b49c4
--- /dev/null
+++ b/libs/kdb/colidx2.c
@@ -0,0 +1,219 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "colidx2-priv.h"
+#include "idxblk-priv.h"
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <byteswap.h>
+
+
+#define IDX2_READ_FILE_BUFFER 64 * 1024
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx2
+ *  level 2 index
+ */
+
+/* Init
+ */
+static
+rc_t KColumnIdx2Init ( KColumnIdx2 *self, uint64_t idx2_eof )
+{
+    rc_t rc;
+
+#if 0
+    memset(&self->cstorage,0,sizeof(self->cstorage));
+    self->cstorage.elem_bits = sizeof(KColumnIdx2BlockCache)*8;
+    self->last = 0;
+#endif
+    rc = KFileSize ( self -> f, & self -> eof );
+    if ( rc == 0 )
+    {
+        if ( self -> eof < idx2_eof )
+            rc = RC ( rcDB, rcColumn, rcConstructing, rcIndex, rcCorrupt );
+        else
+        {
+            self -> eof = idx2_eof;
+            return 0;
+        }
+    }
+    
+    KFileRelease ( self -> f );
+
+    self -> f = NULL;
+    return rc;
+}
+
+/* Open
+ */
+rc_t KColumnIdx2OpenRead ( KColumnIdx2 *self,
+    const KDirectory *dir, uint64_t eof )
+{
+    rc_t rc;
+
+    rc = KDataBufferMake ( & self -> cstorage, sizeof ( KColumnIdx2BlockCache ) * 8, 0 );
+    if ( rc != 0 )
+    {
+        memset ( self, 0, sizeof * self );
+        return rc;
+    }
+
+    self -> last = 0;
+
+    if ( eof == 0 )
+    {
+#if 0
+        KDataBufferResize(&self->cstorage,0);
+        self -> last = 0;
+#endif
+        self -> eof = 0;
+        self -> f = NULL;
+        return 0;
+    }
+
+    rc = KDirectoryOpenFileRead ( dir,
+                                  & self -> f, "idx2" );
+#if IDX2_READ_FILE_BUFFER
+    if ( rc == 0 )
+    {
+        const KFile * orig = self -> f;
+
+        rc = KBufFileMakeRead ( & self -> f, self -> f, eof+1);
+	if ( rc == 0 )
+        {
+            KFileRelease ( orig );
+        }
+        else
+        {
+            self -> f = orig;
+            rc = 0;
+        }
+    }
+#endif
+    if ( rc == 0 )
+        rc = KColumnIdx2Init ( self, eof );
+    return rc;
+}
+
+/* Whack
+ */
+rc_t KColumnIdx2Whack ( KColumnIdx2 *self )
+{
+    rc_t rc = KFileRelease ( self -> f );
+    if ( rc == 0 )
+    {
+        int i;
+        KColumnIdx2BlockCache * cache=(KColumnIdx2BlockCache *)self -> cstorage.base;
+        self -> f = NULL;
+        for(i=0;i<self->cstorage.elem_count;i++){
+            free(cache[i].block);
+        }
+        KDataBufferWhack(&self->cstorage);
+    }
+    return rc;
+}
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdx2LocateBlob ( const KColumnIdx2 *self,
+    KColBlobLoc *loc, const KColBlockLoc *bloc,
+    int64_t first, int64_t upper, bool bswap )
+{
+    rc_t rc;
+
+    /* compression not supported */
+    if ( bloc -> u . blk . compressed )
+        rc = RC ( rcDB, rcIndex, rcSelecting, rcNoObj, rcUnsupported );
+    else
+    {
+        uint64_t buffer [ 1024 / 8 ]; /* make sure is uint64_t aligned */
+        void *block = buffer;
+
+        /* determine the number of entries in block */
+        size_t orig = bloc -> u . blk . size;
+        uint32_t count = KColBlockLocEntryCount ( bloc, & orig );
+
+        /* determine the size to allocate */
+        size_t block_size = KColBlockLocAllocSize ( bloc, orig, count );
+
+        /* allocate a block */
+        if ( block_size > sizeof buffer )
+            block = malloc ( block_size );
+        if ( block == NULL )
+            rc = RC ( rcDB, rcIndex, rcSelecting, rcMemory, rcExhausted );
+        else
+        {
+            size_t num_read;
+            rc = KFileReadAll ( self -> f, bloc -> pg, block, orig, & num_read );
+            if ( rc == 0 )
+            {
+                if ( num_read != orig )
+                    rc = RC ( rcDB, rcIndex, rcSelecting, rcTransfer, rcIncomplete );
+                else
+                {
+                    KColIdxBlock iblk;
+                    rc = KColIdxBlockInit ( & iblk, bloc, orig, block, block_size, bswap );
+                    if ( rc == 0 )
+                    {
+                        uint32_t span;
+                        int64_t start_id;
+                        int slot = KColIdxBlockFind ( & iblk,
+                            bloc, count, first, & start_id, & span );
+                        if ( slot < 0 )
+                            rc = RC ( rcDB, rcIndex, rcSelecting, rcRange, rcNotFound );
+                        else if ( upper > ( start_id + span ) )
+                            rc = RC ( rcDB, rcIndex, rcSelecting, rcRange, rcInvalid );
+                        else
+                        {
+                            loc -> start_id = start_id;
+                            loc -> id_range = span;
+
+                            KColIdxBlockGet ( & iblk,
+                                bloc, count, slot, & loc -> pg, & span );
+                            loc -> u . blob . size = span;
+                        }
+                    }
+                }
+            }
+
+            if ( block != buffer )
+                free ( block );
+        }
+    }
+
+    return rc;
+}
diff --git a/libs/kdb/column-cc.c b/libs/kdb/column-cc.c
new file mode 100644
index 0000000..cdb07ed
--- /dev/null
+++ b/libs/kdb/column-cc.c
@@ -0,0 +1,229 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ *============================================================================
+ *
+ */
+
+#include <kdb/extern.h>
+
+#define KONST const
+#include "column-priv.h"
+#undef KONST
+
+#include "cc-priv.h"
+
+#include <klib/rc.h>
+
+#include <string.h>
+
+struct col_check_ctx {
+    CCReportFunc report;
+    void *ctx;
+    int found;
+    rc_t rc;
+    bool failed;
+};
+
+static
+rc_t CC col_check_report(const CCReportInfoBlock *nfo, void *Ctx)
+{
+    struct col_check_ctx *ctx = Ctx;
+    
+    if (nfo->type == ccrpt_MD5) {
+        const char *fname = nfo->info.MD5.file;
+        
+        if (strcmp(fname, "data") == 0)
+            ctx->found |= 1;
+        else if (strcmp(fname, "idx0") == 0)
+            ctx->found |= 2;
+        else if (strcmp(fname, "idx1") == 0)
+            ctx->found |= 4;
+        else if (strcmp(fname, "idx2") == 0)
+            ctx->found |= 8;
+        
+        if (nfo->info.MD5.rc != 0 && !ctx->failed) {
+            ctx->failed = true;
+            ctx->rc = nfo->info.MD5.rc;
+        }
+    }
+    else if (nfo->type == ccrpt_Done && nfo->info.done.rc != 0 && !ctx->failed) {
+        ctx->failed = true;
+        ctx->rc = nfo->info.done.rc;
+    }
+
+    return 0;
+}
+
+static
+rc_t CC CheckExists(const KDirectory *dir, uint32_t type, const char *name, void *Ctx)
+{
+    struct col_check_ctx *ctx = Ctx;
+    
+    if ((type & ~kptAlias) == kptFile) {
+        if (strcmp(name, "data") == 0)
+            ctx->found |= 1;
+        else if (strcmp(name, "idx0") == 0)
+            ctx->found |= 2;
+        else if (strcmp(name, "idx1") == 0)
+            ctx->found |= 4;
+        else if (strcmp(name, "idx2") == 0)
+            ctx->found |= 8;
+    }
+    return 0;
+}
+
+static
+rc_t KColumnCheckMD5(const KColumn *self,
+                     CCReportInfoBlock *nfo,
+                     CCReportFunc report, void *ctx)
+{
+    struct col_check_ctx local_ctx;
+    rc_t rc;
+    
+    local_ctx.report = report;
+    local_ctx.ctx = ctx;
+    local_ctx.found = 0;
+    local_ctx.failed = false;
+    local_ctx.rc = 0;
+    
+    rc = DirectoryCheckMD5(self->dir, "md5", nfo, col_check_report, &local_ctx);
+    if (rc == 0 && !local_ctx.failed && local_ctx.found != 0x0F) {
+        local_ctx.found = 0;
+        KDirectoryVisit(self->dir, false, CheckExists, &local_ctx, NULL);
+        nfo->type = ccrpt_Done;
+        if (local_ctx.found == 0x0F) {
+            nfo->info.done.rc = RC(rcDB, rcColumn, rcValidating, rcChecksum, rcNotFound);
+            nfo->info.done.mesg = "Some files are missing checksums";
+        }
+        else {
+            nfo->info.done.rc = RC(rcDB, rcColumn, rcValidating, rcFile, rcNotFound);
+            nfo->info.done.mesg = "Some files are missing";
+        }
+        rc = report(nfo, ctx);
+    }
+    else if (rc == 0) {
+        nfo->type = ccrpt_Done;
+        nfo->info.done.rc = 0;
+        nfo->info.done.mesg = "md5 ok";
+        rc = report(nfo, ctx);
+    }
+    else {
+        nfo->type = ccrpt_Done;
+        rc = report(nfo, ctx);
+    }
+
+    return rc;
+}
+
+static
+rc_t KColumnCheckBlobs(const KColumn *self,
+                       CCReportInfoBlock *nfo,
+                       CCReportFunc report, void *ctx)
+{
+    int64_t start;
+    uint64_t row;
+    uint64_t rows;
+    rc_t rc;
+    
+    rc = KColumnIdRange(self, &start, &rows);
+    if (rc) {
+        nfo->info.done.rc = rc;
+        nfo->info.done.mesg = "could not be read";
+        nfo->type = ccrpt_Done;
+        return report(nfo, ctx);
+    }
+    for (row = 0; row < rows && rc == 0; ) {
+        const KColumnBlob *blob;
+        int64_t first;
+        uint32_t count;
+        
+        rc = KColumnOpenBlobRead(self, &blob, row + start);
+        if (rc) {
+            if (GetRCObject(rc) == (enum RCObject)rcBlob && GetRCState(rc) == rcNotFound) {
+                rc = 0;
+                ++row; /* try with the next row; linear scan seems wrong */
+                continue;
+            }
+            nfo->info.done.rc = rc;
+            nfo->info.done.mesg = "could not be read";
+            nfo->type = ccrpt_Done;
+            return report(nfo, ctx);
+        }
+        rc = KColumnBlobIdRange(blob, &first, &count);
+        if (rc) {
+            KColumnBlobRelease(blob);
+            nfo->info.done.rc = rc;
+            nfo->info.done.mesg = "could not be read";
+            nfo->type = ccrpt_Done;
+            return report(nfo, ctx);
+        }
+        rc = KColumnBlobValidate(blob);
+        KColumnBlobRelease(blob);
+        if (rc) {
+            nfo->info.done.rc = rc;
+            nfo->info.done.mesg = "contains bad data";
+            nfo->type = ccrpt_Done;
+            return report(nfo, ctx);
+        }
+        nfo->type = ccrpt_Blob;
+        nfo->info.blob.start = first;
+        nfo->info.blob.count = count;
+        rc = report(nfo, ctx);
+
+        row += count;
+    }
+    nfo->info.done.rc = 0;
+    nfo->info.done.mesg = "checksums ok";
+    nfo->type = ccrpt_Done;
+    rc = report(nfo, ctx);
+    return rc;
+}
+
+LIB_EXPORT
+rc_t CC KColumnConsistencyCheck(const KColumn *self,
+    uint32_t level, CCReportInfoBlock *nfo, CCReportFunc report, void *ctx )
+{
+    rc_t rc = 0;
+
+    bool indexOnly = level & CC_INDEX_ONLY;
+    if (indexOnly) {
+        level &= ~CC_INDEX_ONLY;
+    }
+
+    if (KDirectoryPathType(self->dir, "md5") != kptNotFound)
+        rc = level == 0 ? KColumnCheckMD5(self, nfo, report, ctx) : 0;
+    else {
+        nfo->type = ccrpt_Done;
+        nfo->info.done.mesg = "missing md5 file";
+        nfo->info.done.rc = 0; /* RC(rcDB, rcColumn, rcValidating, rcFile, rcNotFound); */
+        
+        rc = report(nfo, ctx);
+        
+        if (level == 0)
+            level = 1;
+    }
+    
+    if (rc == 0 && level > 0)
+        rc = KColumnCheckBlobs(self, nfo, report, ctx);
+    return rc;
+}
diff --git a/libs/kdb/column-priv.h b/libs/kdb/column-priv.h
new file mode 100644
index 0000000..dc9a84f
--- /dev/null
+++ b/libs/kdb/column-priv.h
@@ -0,0 +1,94 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_column_priv_
+#define _h_column_priv_
+
+#ifndef _h_kdb_column_
+#include <kdb/column.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef _h_coldata_priv_
+#include "coldata-priv.h"
+#endif
+
+#ifndef _h_colidx_priv_
+#include "colidx-priv.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KTable;
+struct KDBManager;
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * KColumn
+ */
+struct KColumn
+{
+    struct KTable const *tbl;
+    struct KDBManager const *mgr;
+    struct KDirectory const *dir;
+
+    KColumnIdx idx;
+    KColumnData df;
+
+    KRefcount refcount;
+    uint32_t csbytes;
+    int32_t checksum;
+    char path [ 1 ];
+};
+
+/* Attach
+ * Sever
+ *  like Release, except called internally
+ *  indicates that a child object is letting go...
+ */
+KColumn *KColumnAttach ( const KColumn *self );
+rc_t KColumnSever ( const KColumn *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_column_priv_ */
diff --git a/libs/kdb/column.c b/libs/kdb/column.c
new file mode 100644
index 0000000..11ce321
--- /dev/null
+++ b/libs/kdb/column.c
@@ -0,0 +1,1132 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define KONST const
+#include <kdb/extern.h>
+#include "column-priv.h"
+#include "dbmgr-priv.h"
+#include "table-priv.h"
+#include "kdb-priv.h"
+#include <kdb/kdb-priv.h>
+#include <klib/checksum.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <klib/debug.h>
+#include <atomic32.h>
+#include <sysalloc.h>
+#undef KONST
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <byteswap.h>
+
+
+#ifdef _DEBUGGING
+#define POS_DEBUG(msg) DBGMSG(DBG_KDB,DBG_FLAG(DBG_KDB_POS),msg)
+#else
+#define POS_DEBUG(msg)
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KColumn
+ *  a collection of blobs indexed by oid
+ */
+
+
+/* Whack
+ */
+static
+rc_t KColumnWhack ( KColumn *self )
+{
+    rc_t rc;
+
+    KRefcountWhack ( & self -> refcount, "KColumn" );
+
+    /* shut down index */
+    rc = KColumnIdxWhack ( & self -> idx );
+    if ( rc == 0 )
+    {
+        /* shut down data fork */
+        KColumnDataWhack ( & self -> df );
+
+        /* release owning table
+           should never fail, and our recovery is flawed */
+        if ( self -> tbl != NULL )
+        {
+            rc = KTableSever ( self -> tbl );
+            if ( rc == 0 )
+                self -> tbl = NULL;
+        }
+
+        /* release manager
+           should never fail */
+        if ( rc == 0 )
+            rc = KDBManagerSever ( self -> mgr );
+
+        if ( rc == 0 )
+        {
+            KDirectoryRelease ( self -> dir );
+            free ( self );
+            return 0;
+        }
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "KColumn", "whack", "kcol" );
+    return rc;
+}
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KColumnAddRef ( const KColumn *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KColumn" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcColumn, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KColumnRelease ( const KColumn *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KColumn" ) )
+        {
+        case krefWhack:
+            return KColumnWhack ( ( KColumn* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcColumn, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Attach
+ * Sever
+ */
+KColumn *KColumnAttach ( const KColumn *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KColumn" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KColumn* ) self;
+}
+
+rc_t KColumnSever ( const KColumn *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KColumn" ) )
+        {
+        case krefWhack:
+            return KColumnWhack ( ( KColumn* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcColumn, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make
+ */
+static
+rc_t KColumnMake ( KColumn **colp, const KDirectory *dir, const char *path )
+{
+    KColumn *col = malloc ( sizeof * col + strlen ( path ) );
+    if ( col == NULL )
+        return RC ( rcDB, rcColumn, rcConstructing, rcMemory, rcExhausted );
+
+    memset ( col, 0, sizeof * col );
+    col -> dir = dir;
+    KRefcountInit ( & col -> refcount, 1, "KColumn", "make", path );
+    strcpy ( col -> path, path );
+
+    * colp = col;
+    return 0;
+}
+
+static
+rc_t KColumnMakeRead ( KColumn **colp, const KDirectory *dir, const char *path )
+{
+    rc_t rc = KColumnMake ( colp, dir, path );
+    if ( rc == 0 )
+    {
+        size_t pgsize;
+        uint64_t data_eof;
+        KColumn *self = * colp;
+
+        rc = KColumnIdxOpenRead ( & self -> idx,
+            dir, & data_eof, & pgsize, & self -> checksum );
+        if ( rc == 0 )
+        {
+            rc = KColumnDataOpenRead ( & self -> df,
+                dir, data_eof, pgsize );
+            if ( rc == 0 )
+            {
+                switch ( self -> checksum )
+                {
+                case kcsNone:
+                    break;
+                case kcsCRC32:
+                    self -> csbytes = 4;
+                    break;
+                case kcsMD5:
+                    self -> csbytes = 16;
+                    break;
+                }
+
+                return 0;
+            }
+
+            KColumnIdxWhack ( & self -> idx );
+        }
+
+        free ( self );
+    }
+
+    * colp = NULL;
+    return rc;
+}
+
+
+/* OpenColumnRead
+ * VOpenColumnRead
+ *  open a column for read
+ *
+ *  "col" [ OUT ] - return parameter for newly opened column
+ *
+ *  "path" [ IN ] - NUL terminated string in UTF-8 giving path to col
+ *  where "." acts as a structure name separator, i.e. struct.member
+ */
+static
+rc_t KDBManagerVOpenColumnReadInt ( const KDBManager *self,
+    const KColumn **colp, const KDirectory *wd, bool try_srapath,
+    const char *path, va_list args )
+{
+    char colpath [ 4096 ];
+    rc_t rc;
+    size_t z;
+
+/*    rc = KDirectoryVResolvePath ( wd, 1,
+        colpath, sizeof colpath, path, args ); */
+    rc = string_vprintf( colpath, sizeof colpath, &z, path, args );
+    if ( rc == 0 )
+    {
+        KColumn *col;
+        const KDirectory *dir;
+
+        /* open table directory */
+        rc = KDBOpenPathTypeRead ( self, wd, colpath, &dir, kptColumn, NULL, try_srapath );
+        if ( rc == 0 )
+        {
+            rc = KColumnMakeRead ( & col, dir, colpath );
+            if ( rc == 0 )
+            {
+                col -> mgr = KDBManagerAttach ( self );
+                * colp = col;
+                return 0;
+            }
+
+            KDirectoryRelease ( dir );
+        }
+    }
+    
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDBManagerOpenColumnRead ( const KDBManager *self,
+    const KColumn **col, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVOpenColumnRead ( self, col, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDBManagerVOpenColumnRead ( const KDBManager *self,
+    const KColumn **col, const char *path, va_list args )
+{
+    if ( col == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcParam, rcNull );
+
+    * col = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcSelf, rcNull );
+
+    return KDBManagerVOpenColumnReadInt
+        ( self, col, self -> wd, true, path, args );
+}
+
+
+LIB_EXPORT rc_t CC KTableOpenColumnRead ( const KTable *self,
+    const KColumn **col, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KTableVOpenColumnRead ( self, col, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableVOpenColumnRead ( const KTable *self,
+    const KColumn **colp, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( colp == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcParam, rcNull );
+
+    * colp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcSelf, rcNull );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "col", 3, name, args );
+    if ( rc == 0 )
+    {
+        rc = KDBManagerVOpenColumnReadInt ( self -> mgr,
+                                           colp, self -> dir, false, path, NULL );
+        if ( rc == 0 )
+        {
+            KColumn *col = ( KColumn* ) * colp;
+            col -> tbl = KTableAttach ( self );
+        }
+    }
+    return rc;
+}
+
+
+/* Locked
+ *  returns non-zero if locked
+ */
+LIB_EXPORT bool CC KColumnLocked ( const KColumn *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return false;
+
+    rc = KDBWritable ( self -> dir, "" );
+    return GetRCState ( rc ) == rcLocked;
+}
+
+/* Version
+ *  returns the column format version
+ */
+LIB_EXPORT rc_t CC KColumnVersion ( const KColumn *self, uint32_t *version )
+{
+    if ( version == NULL )
+        return RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * version = 0;
+        return RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+    }
+     
+    return KColumnIdxVersion ( & self -> idx, version );
+}
+
+/* ByteOrder
+ *  indicates whether original byte order is reversed
+ *  under current architecture.
+ *
+ *  the byte order of the column is established by
+ *  the host architecture when created.
+ *
+ *  "reversed" [ OUT ] - if true, the original byte
+ *  order is reversed with regard to host native byte order.
+ */
+LIB_EXPORT rc_t CC KColumnByteOrder ( const KColumn *self, bool *reversed )
+{
+    if ( reversed == NULL )
+        return RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * reversed = false;
+        return RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+    }
+     
+    return KColumnIdxByteOrder ( & self -> idx, reversed );
+}
+
+/* IdRange
+ *  returns id range for column
+ */
+LIB_EXPORT rc_t CC KColumnIdRange ( const KColumn *self, int64_t *first, uint64_t *count )
+{
+    rc_t rc;
+    int64_t dummy, last;
+
+    if ( first == NULL && count == NULL )
+        return RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+
+    if ( first == NULL )
+        first = & dummy;
+    else if ( count == NULL )
+        count = ( uint64_t * ) & dummy;
+
+    if ( self == NULL )
+    {
+        * first = 0;
+        * count = 0;
+        return RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+    }
+
+    rc = KColumnIdxIdRange ( & self -> idx, first, & last );
+    if ( rc != 0 )
+        * count = 0;
+    else
+        * count = last - * first + 1;
+
+    return rc;
+}
+
+
+/* FindFirstRowId
+ *  locates the first valid row-id starting from a given id.
+ *  this will be either the start id provided, or
+ *  the first row from the next blob, if available.
+ *
+ *  "found" [ OUT ] - will contain the value of "start" if this is contained within a blob,
+ *  or the first row-id of the next blob after "start", if any.
+ *
+ *  "start" [ IN ] - starting row-id in search, inclusive. if this id is valid,
+ *  it will be returned in "found"
+ *
+ *  returns 0 if id is found, rcNotFound if no more data were available.
+ *  may return other codes upon error.
+ */
+LIB_EXPORT rc_t CC KColumnFindFirstRowId ( const KColumn * self, int64_t * found, int64_t start )
+{
+    rc_t rc;
+
+    if ( found == NULL )
+        rc = RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KColumnIdxFindFirstRowId ( & self -> idx, found, start );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        * found = 0;
+    }
+
+    return rc;
+}
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KColumnOpenManagerRead ( const KColumn *self, const KDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+
+
+/* OpenParent
+ *  duplicate reference to parent table
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KColumnOpenParentRead ( const KColumn *self, const KTable **tbl )
+{
+    rc_t rc;
+
+    if ( tbl == NULL )
+        rc = RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KTableAddRef ( self -> tbl );
+            if ( rc == 0 )
+            {
+                * tbl = self -> tbl;
+                return 0;
+            }
+        }
+
+        * tbl = NULL;
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KColumnBlob
+ *  one or more rows of column data
+ */
+struct KColumnBlob
+{
+    /* holds existing blob loc */
+    KColBlobLoc loc;
+    KColumnPageMap pmorig;
+
+    /* owning column */
+    const KColumn *col;
+
+    /* refcount */
+    atomic32_t refcount;
+
+    /* captured from idx1 for CRC32 validation */
+    bool bswap;
+};
+
+
+/* Whack
+ */
+static
+rc_t KColumnBlobWhack ( KColumnBlob *self )
+{
+    const KColumn *col = self -> col;
+    assert ( col != NULL );
+
+    KColumnPageMapWhack ( & self -> pmorig, & col -> df );
+
+    /* cannot recover from errors here,
+       since the page maps needed whacking first,
+       and the column is needed for that. */
+    KColumnSever ( col );
+
+    free ( self );
+    return 0;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KColumnBlobAddRef ( const KColumnBlob *cself )
+{
+    if ( cself != NULL )
+    {
+        atomic32_inc ( & ( ( KColumnBlob* ) cself ) -> refcount );
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KColumnBlobRelease ( const KColumnBlob *cself )
+{
+    KColumnBlob *self = ( KColumnBlob* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+            return KColumnBlobWhack ( self );
+    }
+    return 0;
+}
+
+/* OpenRead
+ * OpenUpdate
+ */
+static
+rc_t KColumnBlobOpenRead ( KColumnBlob *self, const KColumn *col, int64_t id )
+{
+    /* locate blob */
+    rc_t rc = KColumnIdxLocateBlob ( & col -> idx, & self -> loc, id, id );
+    if ( rc == 0 )
+    {
+        /* open page map to blob */
+        rc = KColumnPageMapOpen ( & self -> pmorig,
+            ( KColumnData* ) & col -> df, self -> loc . pg, self -> loc . u . blob . size );
+        if ( rc == 0 )
+        {
+            /* existing blob must have proper checksum bytes */
+            if ( self -> loc . u . blob .  size >= col -> csbytes )
+            {
+                /* remove them from apparent blob size */
+                self -> loc . u . blob . size -= col -> csbytes;
+                return 0;
+            }
+
+            /* the blob is corrupt */
+            KColumnPageMapWhack ( & self -> pmorig, & col -> df );
+            rc = RC ( rcDB, rcColumn, rcOpening, rcBlob, rcCorrupt );
+        }
+    }
+
+    return rc;
+}
+
+/* Make
+ */
+static
+rc_t KColumnBlobMake ( KColumnBlob **blobp, bool bswap )
+{
+    KColumnBlob *blob = malloc ( sizeof * blob );
+    if ( blob == NULL )
+        return RC ( rcDB, rcBlob, rcConstructing, rcMemory, rcExhausted );
+
+    memset ( blob, 0, sizeof * blob );
+    atomic32_set ( & blob -> refcount, 1 );
+    blob -> bswap = bswap;
+
+    * blobp = blob;
+    return 0;
+}
+
+/* OpenBlobRead
+ *  opens an existing blob containing row data for id
+ */
+LIB_EXPORT rc_t CC KColumnOpenBlobRead ( const KColumn *self, const KColumnBlob **blobp, int64_t id )
+{
+    rc_t rc;
+    KColumnBlob *blob;
+
+    if ( blobp == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcParam, rcNull );
+
+    * blobp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcSelf, rcNull );
+
+
+    rc = KColumnBlobMake ( & blob, self -> idx . idx1 . bswap );
+    if ( rc == 0 )
+    {
+        rc = KColumnBlobOpenRead ( blob, self, id );
+        if ( rc == 0 )
+        {
+            blob -> col = KColumnAttach ( self );
+            * blobp = blob;
+            return 0;
+        }
+        
+        free ( blob );
+    }
+
+    return rc;
+}
+
+/* IdRange
+ *  returns id range for blob
+ *
+ *  "first" [ OUT ] - return parameter for first id
+ *
+ *  "last" [ OUT ] - return parameter for count
+ */
+LIB_EXPORT rc_t CC KColumnBlobIdRange ( const KColumnBlob *self, int64_t *first, uint32_t *count )
+{
+    rc_t rc;
+
+    if ( first == NULL || count == NULL )
+        rc = RC ( rcDB, rcBlob, rcAccessing, rcParam, rcNull );
+    else if ( self == NULL )
+        rc = RC ( rcDB, rcBlob, rcAccessing, rcSelf, rcNull );
+    else if ( self -> loc . id_range == 0 )
+        rc = RC ( rcDB, rcBlob, rcAccessing, rcRange, rcEmpty );
+    else
+    {
+        * first = self -> loc . start_id;
+        * count = self -> loc . id_range;
+        return 0;
+    }
+
+    if ( first != NULL )
+        * first = 0;
+    if ( count != NULL )
+        * count = 0;
+
+    return rc;
+}
+
+/* KColumnBlobValidate
+ *  runs checksum validation on unmodified blob
+ */
+static
+rc_t KColumnBlobValidateCRC32 ( const KColumnBlob *self )
+{
+    rc_t rc;
+    const KColumn *col = self -> col;
+
+    uint8_t buffer [ 8 * 1024 ];
+    size_t to_read, num_read, total, size;
+
+    uint32_t cs, crc32 = 0;
+
+    /* calculate checksum */
+    for ( size = self -> loc . u . blob . size, total = 0; total < size; total += num_read )
+    {
+        to_read = size - total;
+        if ( to_read > sizeof buffer )
+            to_read = sizeof buffer;
+
+        rc = KColumnDataRead ( & col -> df,
+            & self -> pmorig, total, buffer, to_read, & num_read );
+        if ( rc != 0 )
+            return rc;
+        if ( num_read == 0 )
+            return RC ( rcDB, rcBlob, rcValidating, rcTransfer, rcIncomplete );
+
+        crc32 = CRC32 ( crc32, buffer, num_read );
+    }
+
+    /* read stored checksum */
+    rc = KColumnDataRead ( & col -> df,
+        & self -> pmorig, size, & cs, sizeof cs, & num_read );
+    if ( rc != 0 )
+        return rc;
+    if ( num_read != sizeof cs )
+        return RC ( rcDB, rcBlob, rcValidating, rcTransfer, rcIncomplete );
+
+    if ( self -> bswap )
+        cs = bswap_32 ( cs );
+
+    if ( cs != crc32 )
+        return RC ( rcDB, rcBlob, rcValidating, rcBlob, rcCorrupt );
+
+    return 0;
+}
+
+static
+rc_t KColumnBlobValidateMD5 ( const KColumnBlob *self )
+{
+    rc_t rc;
+    const KColumn *col = self -> col;
+
+    uint8_t buffer [ 8 * 1024 ];
+    size_t to_read, num_read, total, size;
+
+    MD5State md5;
+    uint8_t digest [ 16 ];
+
+    MD5StateInit ( & md5 );
+
+    /* calculate checksum */
+    for ( size = self -> loc . u . blob . size, total = 0; total < size; total += num_read )
+    {
+        to_read = size - total;
+        if ( to_read > sizeof buffer )
+            to_read = sizeof buffer;
+
+        rc = KColumnDataRead ( & col -> df,
+            & self -> pmorig, total, buffer, to_read, & num_read );
+        if ( rc != 0 )
+            return rc;
+        if ( num_read == 0 )
+            return RC ( rcDB, rcBlob, rcValidating, rcTransfer, rcIncomplete );
+
+        MD5StateAppend ( & md5, buffer, num_read );
+    }
+
+    /* read stored checksum */
+    rc = KColumnDataRead ( & col -> df,
+        & self -> pmorig, size, buffer, sizeof digest, & num_read );
+    if ( rc != 0 )
+        return rc;
+    if ( num_read != sizeof digest )
+        return RC ( rcDB, rcBlob, rcValidating, rcTransfer, rcIncomplete );
+
+    /* finish MD5 digest */
+    MD5StateFinish ( & md5, digest );
+
+    if ( memcmp ( buffer, digest, sizeof digest ) != 0 )
+        return RC ( rcDB, rcBlob, rcValidating, rcBlob, rcCorrupt );
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KColumnBlobValidate ( const KColumnBlob *self )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcBlob, rcValidating, rcSelf, rcNull );
+
+    if ( self -> loc . u . blob . size != 0 ) switch ( self -> col -> checksum )
+    {
+    case kcsCRC32:
+        return KColumnBlobValidateCRC32 ( self );
+    case kcsMD5:
+        return KColumnBlobValidateMD5 ( self );
+    }
+
+    return 0;
+}
+
+/* ValidateBuffer
+ *  run checksum validation on buffer data
+ *
+ *  "buffer" [ IN ] - returned blob buffer from ReadAll
+ *
+ *  "cs_data" [ IN ] and "cs_data_size" [ IN ] - returned checksum data from ReadAll
+ */
+static
+rc_t KColumnBlobValidateBufferCRC32 ( const void * buffer, size_t size, uint32_t cs )
+{
+    uint32_t crc32 = CRC32 ( 0, buffer, size );
+
+    if ( cs != crc32 )
+        return RC ( rcDB, rcBlob, rcValidating, rcBlob, rcCorrupt );
+
+    return 0;
+}
+
+static
+rc_t KColumnBlobValidateBufferMD5 ( const void * buffer, size_t size, const uint8_t cs [ 16 ] )
+{
+    MD5State md5;
+    uint8_t digest [ 16 ];
+
+    MD5StateInit ( & md5 );
+
+    /* calculate checksum */
+    MD5StateAppend ( & md5, buffer, size );
+
+    /* finish MD5 digest */
+    MD5StateFinish ( & md5, digest );
+
+    if ( memcmp ( cs, digest, sizeof digest ) != 0 )
+        return RC ( rcDB, rcBlob, rcValidating, rcBlob, rcCorrupt );
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KColumnBlobValidateBuffer ( const KColumnBlob * self,
+    const KDataBuffer * buffer, const KColumnBlobCSData * cs_data, size_t cs_data_size )
+{
+    size_t bsize;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcBlob, rcValidating, rcSelf, rcNull );
+    if ( buffer == NULL || cs_data == NULL )
+        return RC ( rcDB, rcBlob, rcValidating, rcParam, rcNull );
+
+    bsize = KDataBufferBytes ( buffer );
+    if ( bsize < self -> loc . u . blob . size )
+        return RC ( rcDB, rcBlob, rcValidating, rcData, rcInsufficient );
+    if ( bsize > self -> loc . u . blob . size )
+        return RC ( rcDB, rcBlob, rcValidating, rcData, rcExcessive );
+
+    if ( bsize != 0 ) switch ( self -> col -> checksum )
+    {
+    case kcsNone:
+        break;
+    case kcsCRC32:
+        return KColumnBlobValidateBufferCRC32 ( buffer -> base, bsize,
+            self -> bswap ? bswap_32 ( cs_data -> crc32 ) : cs_data -> crc32 );
+    case kcsMD5:
+        return KColumnBlobValidateBufferMD5 ( buffer -> base, bsize, cs_data -> md5_digest );
+    }
+
+    return 0;
+}
+
+
+/* KColumnBlobRead
+ *  read data from blob
+ *
+ *  "offset" [ IN ] - starting offset into blob
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - number of bytes actually read
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of bytes remaining to be read. specifically,
+ *  "offset" + "num_read" + "remaining" == sizeof blob
+ */
+LIB_EXPORT rc_t CC KColumnBlobRead ( const KColumnBlob *self,
+    size_t offset, void *buffer, size_t bsize,
+    size_t *num_read, size_t *remaining )
+{
+    rc_t rc;
+    size_t ignore;
+    if ( remaining == NULL )
+        remaining = & ignore;
+
+    if ( num_read == NULL )
+        rc = RC ( rcDB, rcBlob, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcBlob, rcReading, rcSelf, rcNull );
+        else
+        {
+            size_t size = self -> loc . u . blob . size;
+            const KColumn *col = self -> col;
+
+            if ( offset > size )
+                offset = size;
+
+            if ( bsize == 0 )
+                rc = 0;
+            else if ( buffer == NULL )
+                rc = RC ( rcDB, rcBlob, rcReading, rcBuffer, rcNull );
+            else
+            {
+                size_t to_read = size - offset;
+                if ( to_read > bsize )
+                    to_read = bsize;
+
+                POS_DEBUG(( "KDB: %s,%lu,%lu\n", self->col->path, offset, to_read ));
+
+#ifdef _DEBUGGING
+                if ( KDbgTestModConds ( DBG_KFS, DBG_FLAG( DBG_KFS_POS ) ) ||
+                     KDbgTestModConds ( DBG_KFS, DBG_FLAG( DBG_KFS_PAGE ) ) )
+                {
+                    KDbgSetColName( self->col->path );
+                }
+#endif
+                *num_read = 0;
+                while ( * num_read < to_read )
+                {
+                    size_t nread = 0;
+
+                    rc = KColumnDataRead ( & col -> df, & self -> pmorig, offset - *num_read,
+                        & ( ( char * ) buffer ) [ * num_read ], to_read - * num_read, & nread );
+                    if ( rc != 0 )
+                        break;
+                    if (nread == 0)
+                    {
+                        rc = RC ( rcDB, rcBlob, rcReading, rcFile, rcInsufficient );
+                        break;
+                    }
+
+                    *num_read += nread;
+                }
+#ifdef _DEBUGGING
+                if ( KDbgTestModConds ( DBG_KFS, DBG_FLAG( DBG_KFS_POS ) ) ||
+                     KDbgTestModConds ( DBG_KFS, DBG_FLAG( DBG_KFS_PAGE ) ) )
+                {
+                    KDbgSetColName( NULL );
+                }
+#endif
+
+                if ( rc == 0 )
+                {
+                    * remaining = size - offset - * num_read;
+                    return 0;
+                }
+            }
+
+            * remaining = size - offset;
+            * num_read = 0;
+            return rc;
+        }
+
+        * num_read = 0;
+    }
+
+    * remaining = 0;
+    return rc;
+}
+
+/* ReadAll
+ *  read entire blob, plus any auxiliary checksum data
+ *
+ *  "buffer" [ OUT ] - pointer to a KDataBuffer structure that will be initialized
+ *  and resized to contain the entire blob. upon success, will contain the number of bytes
+ *  in buffer->elem_count and buffer->elem_bits == 8.
+ *
+ *  "opt_cs_data [ OUT, NULL OKAY ] - optional output parameter for checksum data
+ *  associated with the blob in "buffer", if any exist.
+ *
+ *  "cs_data_size" [ IN ] - sizeof of * opt_cs_data if not NULL, 0 otherwise
+ */
+LIB_EXPORT rc_t CC KColumnBlobReadAll ( const KColumnBlob * self, KDataBuffer * buffer,
+    KColumnBlobCSData * opt_cs_data, size_t cs_data_size )
+{
+    rc_t rc = 0;
+
+    if ( opt_cs_data != NULL )
+        memset ( opt_cs_data, 0, cs_data_size );
+
+    if ( buffer == NULL )
+        rc = RC ( rcDB, rcBlob, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcBlob, rcReading, rcSelf, rcNull );
+        else
+        {
+            /* determine blob size */
+            size_t bsize = self -> loc . u . blob . size;
+
+            /* ignore blobs of size 0 */
+            if ( bsize == 0 )
+                rc = 0;
+            else
+            {
+                /* initialize the buffer */
+                rc = KDataBufferMakeBytes ( buffer, bsize );
+                if ( rc == 0 )
+                {
+                    /* read the blob */
+                    size_t num_read, remaining;
+                    rc = KColumnBlobRead ( self, 0, buffer -> base, bsize, & num_read, & remaining );
+                    if ( rc == 0 )
+                    {
+                        /* test that num_read is everything and we have no remaining */
+                        if ( num_read != bsize || remaining != 0 )
+                            rc = RC ( rcDB, rcBlob, rcReading, rcTransfer, rcIncomplete );
+
+                        else
+                        {
+                            /* set for MD5 - just due to switch ordering */
+                            size_t cs_bytes = 16;
+
+                            /* if not reading checksum data, then we're done */
+                            if ( opt_cs_data == NULL )
+                                return 0;
+
+                            /* see what checksumming is in use */
+                            switch ( self -> col -> checksum )
+                            {
+                            case kcsNone:
+                                return 0;
+
+                            case kcsCRC32:
+                                /* reset for CRC32 */
+                                cs_bytes = 4;
+
+                                /* no break */
+
+                            case kcsMD5:
+                                if ( cs_data_size < cs_bytes )
+                                {
+                                    rc = RC ( rcDB, rcBlob, rcReading, rcParam, rcTooShort );
+                                    break;
+                                }
+
+                                /* read checksum information */
+                                rc = KColumnDataRead ( & self -> col -> df,
+                                    & self -> pmorig, bsize, opt_cs_data, cs_bytes, & num_read );
+                                if ( rc == 0 )
+                                {
+                                    if ( num_read != cs_bytes )
+                                        rc = RC ( rcDB, rcBlob, rcReading, rcTransfer, rcIncomplete );
+                                    else
+                                    {
+                                        /* success - read the blob AND the checksum data */
+                                        return 0;
+                                    }
+                                }
+                                break;
+                            }
+                        }
+                    }
+
+                    KDataBufferWhack ( buffer );
+                }
+            }
+        }
+
+        memset ( buffer, 0, sizeof * buffer );
+    }
+
+    return rc;
+}
+
+
+/* GetDirectory
+ */
+LIB_EXPORT rc_t CC KColumnGetDirectoryRead ( const KColumn *self, const KDirectory **dir )
+{
+    rc_t rc;
+
+    if ( dir == NULL )
+        rc = RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * dir = self -> dir;
+            return KDirectoryAddRef ( * dir );
+        }
+
+        * dir = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/kdb/database-cc.c b/libs/kdb/database-cc.c
new file mode 100644
index 0000000..732bc17
--- /dev/null
+++ b/libs/kdb/database-cc.c
@@ -0,0 +1,339 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ *============================================================================
+ *
+ */
+
+#include <kdb/extern.h>
+
+#define KONST const
+#include "index-priv.h"
+#include "dbmgr-priv.h"
+#include "database-priv.h"
+#include "table-priv.h"
+#include "kdb-priv.h"
+#include "column-priv.h"
+#undef KONST
+
+#include "cc-priv.h"
+
+#include <kdb/index.h>
+
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <kdb/namelist.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#undef index
+
+static void KDatabaseGetName(KDatabase const *self, char const **rslt)
+{
+    char *sep;
+    
+    *rslt = self->path;
+    sep = strrchr(self->path, '/');
+    if (sep != NULL)
+        *rslt = sep + 1;
+}
+
+static
+rc_t KDatabaseCheckMD5 (const KDatabase *self, CCReportFunc report, void *ctx)
+{
+    CCReportInfoBlock info;
+    memset (& info, 0, sizeof info);
+
+    info.objType = kptDatabase;
+    KDatabaseGetName(self, &info.objName);
+    
+    return DirectoryCheckMD5 (self -> dir, "md5", & info, report, ctx);
+}
+
+static
+rc_t KDatabaseCheckTables (const KDatabase *self, uint32_t depth, int level, CCReportFunc report, void *ctx)
+{
+    uint32_t n;
+    
+    KNamelist *list;
+    rc_t rc = KDatabaseListTbl (self, & list);
+    if (rc != 0)
+        return rc;
+    
+    rc = KNamelistCount (list, & n);
+    if (rc == 0)
+    {
+        CCReportInfoBlock nfo;
+        memset (& nfo, 0, sizeof nfo);
+        nfo.objType = kptTable;
+        
+        for (nfo.objId = 0; rc == 0 && nfo.objId != (int) n; ++ nfo.objId)
+        {
+            rc = KNamelistGet (list, nfo.objId, &nfo.objName);
+            if (rc == 0)
+            {
+                const KTable *tbl;
+                
+                nfo.type = ccrpt_Visit;
+                nfo.info.visit.depth = depth + 1;
+                rc = report(&nfo, ctx); if (rc) break;
+                
+                rc = KDatabaseOpenTableRead (self, & tbl, "%s", nfo.objName);
+                if (rc == 0)
+                {
+                    rc = KTableConsistencyCheck (tbl, depth + 1, level, report,
+                        ctx, SRA_PLATFORM_UNDEFINED);
+                    KTableRelease (tbl);
+                }
+            }
+        }
+    }
+    
+    KNamelistRelease (list);
+    return rc;
+}
+
+static
+rc_t KDatabaseCheckIndexMD5 (const KDirectory *dir,
+    CCReportInfoBlock *nfo, CCReportFunc report, void *ctx)
+{
+    char md5 [ 4100 ];
+
+    snprintf (md5, sizeof md5, "%s.md5", nfo -> objName);
+    return DirectoryCheckMD5 (dir, md5, nfo, report, ctx);
+}
+
+static
+const KDirectory *KDatabaseFindIndexDir (const KDatabase *self)
+{
+    const KDirectory *idxDir;
+    
+    rc_t rc = KDirectoryOpenDirRead (self -> dir, & idxDir, false, "idx");
+    if (rc == 0)
+        return idxDir;
+
+    return NULL;
+}
+
+static
+rc_t KDatabaseCheckIndices (const KDatabase *self, uint32_t depth, uint32_t level, CCReportFunc report, void *ctx)
+{
+    uint32_t n;
+
+    KNamelist *list;
+    rc_t rc = KDatabaseListIdx (self, & list);
+    if (rc != 0)
+    {
+        if (GetRCState (rc) == rcNotFound)
+            return 0;
+        return rc;
+    }
+
+/* TEST    assert(0); */
+    rc = KNamelistCount (list, & n);
+    if (rc == 0)
+    {
+        const KDirectory *idxDir = KDatabaseFindIndexDir (self);
+        if (idxDir == NULL)
+            rc = RC (rcDB, rcDatabase, rcValidating, rcDirectory, rcNull);
+        else
+        {
+            CCReportInfoBlock nfo;
+            memset (& nfo, 0, sizeof nfo);
+            nfo.objType = kptIndex;
+
+            for (nfo.objId = 0; rc == 0 && nfo.objId != (int) n; ++ nfo.objId)
+            {
+                rc = KNamelistGet(list, nfo.objId, &nfo.objName);
+                if (rc != 0)
+                    break;
+            
+                nfo.type = ccrpt_Visit;
+                nfo.info.visit.depth = depth + 1;
+                rc = report(&nfo, ctx); if (rc) break;
+                
+                rc = KDatabaseCheckIndexMD5 (idxDir, &nfo, report, ctx);
+                if (rc == 0 && level > 0)
+                {
+                    const KIndex *idx;
+                    rc = KDatabaseOpenIndexRead (self, &idx, "%s", nfo.objName);
+                    if (rc != 0)
+                    {
+                        nfo.type = ccrpt_Done;
+                        nfo.info.done.rc = rc;
+                        nfo.info.done.mesg = "could not be opened";
+                    }
+                    else
+                    {
+                        nfo.type = ccrpt_Index;
+                        rc = KIndexConsistencyCheck(idx, level < 3 ? 1 : 3,
+                                                    &nfo.info.index.start_id,
+                                                    &nfo.info.index.id_range,
+                                                    &nfo.info.index.num_keys,
+                                                    &nfo.info.index.num_rows,
+                                                    &nfo.info.index.num_holes);
+                        KIndexRelease(idx);
+                        if (rc != 0)
+                        {
+                            nfo.type = ccrpt_Done;
+                            nfo.info.done.rc = rc;
+                            nfo.info.done.mesg = "could not be validated";
+                        }
+                    }
+
+                    rc = report (& nfo, ctx);
+                }
+            }
+
+            KDirectoryRelease (idxDir);
+        }
+    }
+
+    KNamelistRelease (list);
+    return rc;
+}
+
+static
+rc_t KDatabaseCheckDatabases (const KDatabase *self, uint32_t depth, int level, CCReportFunc report, void *ctx)
+{
+    uint32_t n;
+
+    KNamelist *list;
+    rc_t rc = KDatabaseListDB (self, & list);
+    if (rc != 0)
+    {
+        if (GetRCState (rc) == rcNotFound)
+            return 0;
+        return rc;
+    }
+
+    rc = KNamelistCount (list, & n);
+    if (rc == 0)
+    {
+        CCReportInfoBlock nfo;
+        memset (& nfo, 0, sizeof nfo);
+        nfo.objType = kptDatabase;
+        
+        for (nfo.objId = 0; rc == 0 && nfo.objId != (int) n; ++ nfo.objId)
+        {
+            rc = KNamelistGet (list, nfo.objId, &nfo.objName);
+            if (rc == 0)
+            {
+                const KDatabase *db;
+                
+                nfo.type = ccrpt_Visit;
+                nfo.info.visit.depth = depth + 1;
+                rc = report(&nfo, ctx); if (rc) break;
+                
+                rc = KDatabaseOpenDBRead (self, & db, "%s", nfo.objName);
+                if (rc == 0)
+                {
+                    rc = KDatabaseConsistencyCheck (db, depth + 1, level, report, ctx);
+                    KDatabaseRelease (db);
+                }
+            }
+        }
+    }
+    
+    KNamelistRelease (list);
+    return rc;
+}
+
+LIB_EXPORT
+rc_t CC KDatabaseConsistencyCheck (const KDatabase *self,
+    uint32_t depth, uint32_t level, CCReportFunc report, void *ctx)
+{
+    rc_t rc = 0;
+    uint32_t type;
+
+    uint32_t aLevel = level;
+    bool indexOnly = level & CC_INDEX_ONLY;
+    if (indexOnly) {
+        level &= ~CC_INDEX_ONLY;
+    }
+
+    if (self == NULL)
+        return RC (rcDB, rcDatabase, rcValidating, rcSelf, rcNull);
+    
+    if (depth == 0) {
+        CCReportInfoBlock info;
+        
+        KDatabaseGetName(self, &info.objName);
+        info.objId = 0;
+        info.objType = kptDatabase;
+        info.type = ccrpt_Visit;
+        info.info.visit.depth = 0;
+        
+        rc = report(&info, ctx);
+        if (rc) return rc;
+    }
+    
+    type = KDirectoryPathType(self->dir, "md5");
+    if (type == kptZombieFile) {
+        CCReportInfoBlock info;
+        
+        KDatabaseGetName(self, &info.objName);
+        info.objId = 0;
+        info.objType = kptTable;
+        info.type = ccrpt_Done;
+        info.info.done.mesg = "Database may be truncated";
+        info.info.done.rc = 0;
+        
+        rc = report(&info, ctx);
+    }
+    else if (type != kptNotFound)
+        rc = KDatabaseCheckMD5 (self, report, ctx);
+    else {
+        CCReportInfoBlock info;
+        
+        KDatabaseGetName(self, &info.objName);
+        info.objId = 0;
+        info.objType = kptDatabase;
+        info.type = ccrpt_Done;
+        info.info.done.mesg = "no md5 file";
+        info.info.done.rc = 0;
+        
+        rc = report(&info, ctx);
+    }
+    
+
+    if (rc == 0)
+        rc = KDatabaseCheckTables (self, depth, aLevel, report, ctx);
+
+    if (rc == 0)
+        rc = KDatabaseCheckIndices (self, depth, level, report, ctx);
+
+    if (rc == 0)
+        rc = KDatabaseCheckDatabases (self, depth, level, report, ctx);
+
+    return rc;
+}
diff --git a/libs/kdb/database-cmn.c b/libs/kdb/database-cmn.c
new file mode 100644
index 0000000..4940fa3
--- /dev/null
+++ b/libs/kdb/database-cmn.c
@@ -0,0 +1,496 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define KONST const
+#include "database-priv.h"
+#include "dbmgr-priv.h"
+#include "kdb-priv.h"
+#undef KONST
+
+#include <sysalloc.h>
+#include <klib/namelist.h>
+#include <klib/rc.h>
+#include <kfs/md5.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KDatabase
+ *  connection to a database within file system
+ */
+
+/* Whack
+ */
+static
+rc_t KDatabaseWhack ( KDatabase *self )
+{
+    rc_t rc = 0;
+
+    /* unused: const KDBManager *mgr; */
+
+    KRefcountWhack ( & self -> refcount, "KDatabase" );
+
+    /* shut down md5 fmt file */
+    if ( self -> md5 != NULL )
+    {
+        rc = KMD5SumFmtRelease ( self -> md5 );
+        if ( rc == 0 )
+            self -> md5 = NULL;
+    }
+    if ( rc == 0 )
+    {
+        /* release dad */
+        if ( self -> dad != NULL )
+        {
+            rc = KDatabaseSever ( self -> dad );
+            if ( rc == 0 )
+                self -> dad = NULL;
+        }
+        /* remove from mgr */
+        if ( rc == 0 )
+        {
+            /* rc = KDBManagerSever ( self -> mgr, & self -> sym ); */
+			rc = KDBManagerSever ( self -> mgr );
+
+            /* complete */
+            if ( rc == 0 )
+            {
+                KDirectoryRelease ( self -> dir );
+                free ( self );
+                return 0;
+            }
+        }
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "KDatabase", "whack", "kdb" );
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+rc_t KDatabaseAddRef ( const KDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcDatabase, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+rc_t KDatabaseRelease ( const KDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefWhack:
+            return KDatabaseWhack ( ( KDatabase* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcDatabase, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Sever
+ *  like Release, except called internally
+ *  indicates that a child object is letting go...
+ */
+KDatabase *KDatabaseAttach ( const KDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KDatabase* ) self;
+}
+
+rc_t KDatabaseSever ( const KDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefWhack:
+            return KDatabaseWhack ( ( KDatabase* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcDatabase, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make
+ *  make an initialized structure
+ */
+static
+rc_t KDatabaseMake ( KDatabase **dbp, const KDirectory *dir, const char *path )
+{
+    KDatabase *db;
+
+    assert ( dbp != NULL );
+    assert ( path != NULL );
+
+    db = malloc ( sizeof * db + strlen ( path ) );
+    if ( db == NULL )
+    {
+        * dbp = NULL;
+        return RC ( rcDB, rcDatabase, rcConstructing, rcMemory, rcExhausted );
+    }
+
+    memset ( db, 0, sizeof * db );
+    db -> dir = dir;
+    KRefcountInit ( & db -> refcount, 1, "KDatabase", "make", path );
+    strcpy ( db -> path, path );
+
+    * dbp = db;
+    return 0;
+}
+
+
+/* OpenDBRead
+ * VOpenDBRead
+ *  open a database for read
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+static
+rc_t KDBManagerVOpenDBReadInt ( const KDBManager *self,
+    const KDatabase **dbp, const KDirectory *wd,
+    const char *path, va_list args )
+{
+    /* generate absolute path to db */
+    char dbpath [ 4096 ];
+    rc_t rc = KDirectoryVResolvePath ( wd, true,
+        dbpath, sizeof dbpath, path, args );
+    if ( rc == 0 )
+    {
+        KDatabase *db;
+        const KDirectory *dir;
+
+        /* open the directory if its a database */
+        rc = KDBOpenPathTypeRead ( wd, dbpath, &dir, kptDatabase, NULL );
+        if ( rc == 0 )
+        {
+            /* allocate a new guy */
+            rc = KDatabaseMake ( & db, dir, dbpath );
+            if ( rc == 0 )
+            {
+                db -> mgr = KDBManagerAttach ( self );
+                * dbp = db;
+                return 0;
+            }
+
+            KDirectoryRelease ( dir );
+        }
+    }
+    
+    return rc;
+}
+
+rc_t KDBManagerOpenDBRead ( const KDBManager *self,
+    const KDatabase **db, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVOpenDBRead ( self, db, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+rc_t KDatabaseOpenDBRead ( const KDatabase *self,
+    const KDatabase **db, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVOpenDBRead ( self, db, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+rc_t KDBManagerVOpenDBRead ( const KDBManager *self,
+    const KDatabase **db, const char *path, va_list args )
+{
+    if ( db == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcParam, rcNull );
+
+    * db = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcSelf, rcNull );
+
+    return KDBManagerVOpenDBReadInt ( self, db, self -> wd, path, args );
+}
+
+rc_t KDatabaseVOpenDBRead ( const KDatabase *self,
+    const KDatabase **dbp, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( dbp == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * dbp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "db", 2, name, args );
+    if ( rc == 0 )
+    {
+        rc = KDBManagerOpenDBReadInt ( self -> mgr, dbp,
+                                       self -> dir, "%s", path );
+        if ( rc == 0 )
+        {
+            KDatabase *db = ( KDatabase* ) * dbp;
+            db -> dad = KDatabaseAttach ( self );
+        }
+    }
+
+    return rc;
+}
+
+
+/* Locked
+ *  returns non-zero if locked
+ */
+bool KDatabaseLocked ( const KDatabase *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return false;
+
+    rc = KDBWritable ( self -> dir, "." );
+    return GetRCState ( rc ) == rcLocked;
+}
+
+
+/* Exists
+ *  returns true if requested object exists
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+bool KDatabaseVExists ( const KDatabase *self, uint32_t type, const char *name, va_list args )
+{
+    /* TBD */
+    return false;
+}
+
+bool KDatabaseExists ( const KDatabase *self, uint32_t type, const char *name, ... )
+{
+    bool exists;
+
+    va_list args;
+    va_start ( args, name );
+
+    exists = KDatabaseVExists ( self, type, name, args );
+
+    va_end ( args );
+
+    return exists;
+}
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+rc_t KDatabaseVWritable ( const KDatabase *self, uint32_t type, const char *name, va_list args )
+{
+    /* TBD */
+    return -1;
+}
+
+rc_t KDatabaseWritable ( const KDatabase *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, name );
+
+    rc = KDatabaseVWritable ( self, type, name, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+rc_t KDatabaseOpenManagerRead ( const KDatabase *self, const KDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+rc_t KDatabaseOpenParentRead ( const KDatabase *self, const KDatabase **par )
+{
+    rc_t rc;
+
+    if ( par == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDatabaseAddRef ( self -> dad );
+            if ( rc == 0 )
+            {
+                * par = self -> dad;
+                return 0;
+            }
+        }
+
+        * par = NULL;
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KNameList
+ */
+
+/* List
+ *  create database listings
+ */
+static
+bool KDatabaseListFilter ( const KDirectory *dir, const char *name, void *data )
+{
+    return ( KDBOpenPathTypeRead ( dir, name, NULL, (( long int ) data ), NULL ) == 0 );
+}
+
+rc_t KDatabaseListDB ( const KDatabase *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        return KDirectoryList ( self -> dir,
+            names, KDatabaseListFilter, ( void* ) kptDatabase, "db" );
+    }
+
+    if ( names != NULL )
+        * names = NULL;
+
+    return RC ( rcDB, rcDatabase, rcListing, rcSelf, rcNull );
+}
+
+rc_t KDatabaseListTbl ( struct KDatabase const *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        return KDirectoryList ( self -> dir,
+            names, KDatabaseListFilter, ( void* ) kptTable, "tbl" );
+    }
+
+    if ( names != NULL )
+        * names = NULL;
+
+    return RC ( rcDB, rcDatabase, rcListing, rcSelf, rcNull );
+}
+
+rc_t KDatabaseListIdx ( struct KDatabase const *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        return KDirectoryList ( self -> dir,
+            names, KDatabaseListFilter, ( void* ) kptIndex, "idx" );
+    }
+
+    if ( names != NULL )
+        * names = NULL;
+
+    return RC ( rcDB, rcDatabase, rcListing, rcSelf, rcNull );
+}
+   
diff --git a/libs/kdb/database-priv.h b/libs/kdb/database-priv.h
new file mode 100644
index 0000000..bd15e82
--- /dev/null
+++ b/libs/kdb/database-priv.h
@@ -0,0 +1,115 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_database_priv_
+#define _h_database_priv_
+
+#ifndef _h_kdb_database_
+#include <kdb/database.h>
+#endif
+
+#include <kdb/column.h>
+
+#ifndef _h_klib_symbol_
+#include <klib/symbol.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef KONST
+#define KONST
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDBManager;
+struct KDirectory;
+struct KMD5SumFmt;
+
+
+/*--------------------------------------------------------------------------
+ * KDatabase
+ *  connection to a database within file system
+ */
+struct KDatabase
+{
+    /* manager reference */
+    struct KDBManager KONST *mgr;
+
+    /* if a sub-directory */
+    struct KDatabase KONST *dad;
+
+    /* database directory */
+    struct KDirectory KONST *dir;
+
+    /* MD5 format object */
+    struct KMD5SumFmt *md5;
+
+    /* open references */
+#if 1
+    KRefcount refcount;
+    uint32_t opencount;
+#else
+    KDualRef refcount;
+    uint32_t align;
+#endif
+
+    /* fits into manager symbol table */
+    KSymbol sym;
+
+    /* create and checksum modes for columns */
+    KCreateMode cmode;
+    KChecksum checksum;
+
+    /* true if database was opened read-only */
+    bool read_only;
+
+    /* symbol text space */
+    char path [ 1 ];
+};
+
+/* Attach
+ * Sever
+ *  like AddRef/Release, except called internally
+ *  indicates that a child object is letting go...
+ */
+KDatabase *KDatabaseAttach ( const KDatabase *self );
+rc_t KDatabaseSever ( const KDatabase *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_database_priv_ */
diff --git a/libs/kdb/database.c b/libs/kdb/database.c
new file mode 100644
index 0000000..7278afa
--- /dev/null
+++ b/libs/kdb/database.c
@@ -0,0 +1,807 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define KONST const
+#include <kdb/extern.h>
+#include "database-priv.h"
+#include "dbmgr-priv.h"
+#include "kdb-priv.h"
+#undef KONST
+
+#include <klib/namelist.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <vfs/path.h>
+#include <vfs/manager.h>
+#include <vfs/manager-priv.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KDatabase
+ *  connection to a database within file system
+ */
+
+/* GetPath
+ *  return the absolute path to DB
+ */
+LIB_EXPORT rc_t CC KDatabaseGetPath ( KDatabase const *self,
+    const char **path )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+    if ( path == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+
+    *path = self->path;
+
+    return 0;
+}
+
+/* Whack
+ */
+static
+rc_t KDatabaseWhack ( KDatabase *self )
+{
+    rc_t rc = 0;
+
+    KRefcountWhack ( & self -> refcount, "KDatabase" );
+
+    /* release dad */
+    if ( self -> dad != NULL )
+    {
+        rc = KDatabaseSever ( self -> dad );
+        if ( rc == 0 )
+            self -> dad = NULL;
+    }
+
+    /* remove from mgr */
+    if ( rc == 0 )
+        rc = KDBManagerSever ( self -> mgr );
+
+    /* complete */
+    if ( rc == 0 )
+    {
+        KDirectoryRelease ( self -> dir );
+        free ( self );
+        return 0;
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "KDatabase", "whack", "kdb" );
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KDatabaseAddRef ( const KDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcDatabase, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KDatabaseRelease ( const KDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefWhack:
+            return KDatabaseWhack ( ( KDatabase* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcDatabase, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Sever
+ *  like Release, except called internally
+ *  indicates that a child object is letting go...
+ */
+KDatabase *KDatabaseAttach ( const KDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KDatabase* ) self;
+}
+
+rc_t KDatabaseSever ( const KDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefWhack:
+            return KDatabaseWhack ( ( KDatabase* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcDatabase, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make
+ *  make an initialized structure
+ */
+static
+rc_t KDatabaseMake ( KDatabase **dbp, const KDirectory *dir, const char *path )
+{
+    KDatabase *db;
+
+    assert ( dbp != NULL );
+    assert ( path != NULL );
+
+    db = malloc ( sizeof * db + strlen ( path ) );
+    if ( db == NULL )
+    {
+        * dbp = NULL;
+        return RC ( rcDB, rcDatabase, rcConstructing, rcMemory, rcExhausted );
+    }
+
+    db -> mgr = NULL;
+    db -> dad = NULL;
+    db -> dir = dir;
+
+    /* for open mode we don't care about creation mode or checksum, setting defaults */
+    db -> cmode = kcmOpen;
+    db -> checksum = kcsNone;
+
+    KRefcountInit ( & db -> refcount, 1, "KDatabase", "make", path );
+    strcpy ( db -> path, path );
+
+    * dbp = db;
+    return 0;
+}
+
+static
+rc_t KDatabaseMakeVPath ( KDatabase **dbp, const KDirectory *dir, const VPath* path )
+{
+    const String* dbpathStr;
+    rc_t rc = VPathMakeString ( path, &dbpathStr );    /* NUL-terminated */
+    if ( rc == 0 )
+    {
+        rc = KDatabaseMake ( dbp, dir, dbpathStr->addr );
+        StringWhack(dbpathStr);
+    }
+    return rc;
+}
+
+
+/* OpenDBRead
+ * VOpenDBRead
+ *  open a database for read
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+static
+rc_t KDBManagerVOpenDBReadInt ( const KDBManager *self, const KDatabase **dbp,
+                                const KDirectory *wd, bool try_srapath,
+                                const char *path, va_list args )
+{
+    rc_t rc;
+
+    /* MUST use vsnprintf because the documented behavior of "path"
+       is that of stdc library's printf, not vdb printf */
+    char dbpath [ 4096 ];
+    int z = ( args == NULL ) ?
+        snprintf ( dbpath, sizeof dbpath, "%s", path ):
+        vsnprintf ( dbpath, sizeof dbpath, path, args );
+    if ( z < 0 || ( size_t ) z >= sizeof dbpath )
+        rc = RC ( rcDB, rcMgr, rcOpening, rcPath, rcExcessive );
+    else
+    {
+        const KDirectory *dir;
+
+        /* open the directory if its a database */
+        rc = KDBOpenPathTypeRead ( self, wd, dbpath, &dir, kptDatabase, NULL, try_srapath );
+        if ( rc == 0 )
+        {
+            KDatabase *db;
+
+            /* allocate a new guy */
+            rc = KDatabaseMake ( & db, dir, dbpath );
+            if ( rc == 0 )
+            {
+                db -> mgr = KDBManagerAttach ( self );
+                * dbp = db;
+                return 0;
+            }
+
+            KDirectoryRelease ( dir );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerOpenDBRead ( const KDBManager *self,
+    const KDatabase **db, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVOpenDBRead ( self, db, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenDBRead ( const KDatabase *self,
+    const KDatabase **db, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVOpenDBRead ( self, db, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerVOpenDBRead ( const KDBManager *self,
+    const KDatabase **db, const char *path, va_list args )
+{
+    if ( db == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcParam, rcNull );
+
+    * db = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcSelf, rcNull );
+
+    return KDBManagerVOpenDBReadInt ( self, db, self -> wd, true, path, args );
+}
+
+LIB_EXPORT rc_t CC KDatabaseVOpenDBRead ( const KDatabase *self,
+    const KDatabase **dbp, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( dbp == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * dbp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "db", 2, name, args );
+    if ( rc == 0 )
+    {
+        rc = KDBManagerVOpenDBReadInt ( self -> mgr, dbp,
+                                        self -> dir, false, path, NULL );
+        if ( rc == 0 )
+        {
+            KDatabase *db = ( KDatabase* ) * dbp;
+            db -> dad = KDatabaseAttach ( self );
+        }
+    }
+
+    return rc;
+}
+
+
+/* Locked
+ *  returns non-zero if locked
+ */
+LIB_EXPORT bool CC KDatabaseLocked ( const KDatabase *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return false;
+
+    rc = KDBWritable ( self -> dir, "." );
+    return GetRCState ( rc ) == rcLocked;
+}
+
+/* Exists
+ *  returns true if requested object exists
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT bool CC KDatabaseVExists ( const KDatabase *self, uint32_t type, const char *name, va_list args )
+{
+    if ( self != NULL && name != NULL && name [ 0 ] != 0 )
+    {
+        rc_t rc;
+        uint32_t len;
+        const char *ns;
+        char path [ 256 ];
+
+        switch ( type )
+        {
+        case kptDatabase:
+            ns = "db";
+            len = 2;
+            break;
+
+        case kptTable:
+            ns = "tbl";
+            len = 3;
+            break;
+
+        case kptIndex:
+            ns = "idx";
+            len = 3;
+            break;
+
+        default:
+            return false;
+        }
+
+        rc = KDBVMakeSubPath ( self -> dir, path, sizeof path, ns, len, name, args );
+        if ( rc == 0 )
+        {
+            switch ( KDirectoryPathType ( self -> dir, "%s", path ) )
+            {
+            case kptFile:
+            case kptDir:
+            case kptFile | kptAlias:
+            case kptDir | kptAlias:
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+LIB_EXPORT bool CC KDatabaseExists ( const KDatabase *self, uint32_t type, const char *name, ... )
+{
+    bool exists;
+
+    va_list args;
+    va_start ( args, name );
+
+    exists = KDatabaseVExists ( self, type, name, args );
+
+    va_end ( args );
+
+    return exists;
+}
+
+
+/* IsAlias
+ *  returns true if object name is an alias
+ *  returns path to fundamental name if it was aliased
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - optional output buffer
+ *  for fundamenta object name if "alias" is not a fundamental name, 
+ *
+ *  "name" [ IN ] - NUL terminated object name
+ */
+LIB_EXPORT bool CC KDatabaseIsAlias ( const KDatabase *self, uint32_t type,
+    char *resolved, size_t rsize, const char *name )
+{
+    if ( self != NULL && name != NULL && name [ 0 ] != 0 )
+    {
+        rc_t rc;
+        uint32_t len;
+        const char *ns;
+        char path [ 256 ];
+
+        switch ( type )
+        {
+        case kptDatabase:
+            ns = "db";
+            len = 2;
+            break;
+
+        case kptTable:
+            ns = "tbl";
+            len = 3;
+            break;
+
+        case kptIndex:
+            ns = "idx";
+            len = 3;
+            break;
+
+        default:
+            return false;
+        }
+
+        rc = KDBMakeSubPath ( self -> dir, path, sizeof path, ns, len, name );
+        if ( rc == 0 )
+        {
+            switch ( KDirectoryPathType ( self -> dir, "%s", path ) )
+            {
+            case kptFile | kptAlias:
+            case kptDir | kptAlias:
+                if ( resolved != NULL && rsize != 0 )
+                {
+                    const KDirectory *sub;
+                    rc = KDirectoryOpenDirRead ( self -> dir, & sub, false, "%s", ns );
+                    * resolved = 0;
+                    if ( rc != 0 )
+                        PLOGERR ( klogWarn, ( klogWarn, rc, "failed to open subdirectory '$(sub)'", "sub=%s", ns ) );
+                    else
+                    {
+                        rc = KDirectoryResolveAlias ( sub, false, resolved, rsize, "%s", name );
+                        KDirectoryRelease ( sub );
+                        if ( rc != 0 )
+                            PLOGERR ( klogWarn, ( klogWarn, rc, "failed to resolve alias '$(alias)'", "alias=%s", name ) );
+                    }
+                }
+                return true;
+            }
+        }
+    }
+
+    if ( resolved != NULL && rsize != 0 )
+        * resolved = 0;
+
+    return false;
+}
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC KDatabaseVWritable ( const KDatabase *self, uint32_t type, const char *name, va_list args )
+{
+    /* TBD */
+    return -1;
+}
+
+LIB_EXPORT rc_t CC KDatabaseWritable ( const KDatabase *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, name );
+
+    rc = KDatabaseVWritable ( self, type, name, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KDatabaseOpenManagerRead ( const KDatabase *self, const KDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KDatabaseOpenParentRead ( const KDatabase *self, const KDatabase **par )
+{
+    rc_t rc;
+
+    if ( par == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDatabaseAddRef ( self -> dad );
+            if ( rc == 0 )
+            {
+                * par = self -> dad;
+                return 0;
+            }
+        }
+
+        * par = NULL;
+    }
+
+    return rc;
+}
+
+
+/* GetDirectory
+ *  access the directory in use
+ */
+LIB_EXPORT rc_t CC KDatabaseOpenDirectoryRead ( const KDatabase *self, const KDirectory **dir )
+{
+    rc_t rc;
+
+    if ( dir == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * dir = self -> dir;
+            return KDirectoryAddRef ( * dir );
+        }
+
+        * dir = NULL;
+    }
+
+    return rc;
+}
+
+
+/* ModDate
+ *  get modification date
+ */
+LIB_EXPORT rc_t CC KDatabaseModDate ( const KDatabase *self, KTime_t *mtime )
+{
+    rc_t rc;
+
+    if ( mtime == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            /* HACK ALERT - there needs to be a proper way to record modification times */
+            const KDirectory *dir = self -> dir;
+
+            /* this only tells the last time the table was locked,
+               which may be close to the last time it was modified */
+            rc = KDirectoryDate ( dir, mtime, "lock" );
+            if ( rc == 0 )
+                return 0;
+
+            /* get directory timestamp */
+            rc = KDirectoryDate ( dir, mtime, "." );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        * mtime = 0;
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KNameList
+ */
+
+/* List
+ *  create database listings
+ */
+struct FilterData
+{
+    const KDBManager * mgr;
+    int type;
+};
+
+static
+bool CC KDatabaseListFilter ( const KDirectory *dir, const char *name, void *data_ )
+{
+    struct FilterData * data = data_;
+    return ( KDBOpenPathTypeRead ( data->mgr, dir, name, NULL, data->type, NULL, false ) == 0 );
+}
+
+LIB_EXPORT rc_t CC KDatabaseListDB ( const KDatabase *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        struct FilterData data;
+        data.mgr = self->mgr;
+        data.type = kptDatabase;
+
+        return KDirectoryList ( self -> dir,
+            names, KDatabaseListFilter, &data, "db" );
+    }
+
+    if ( names != NULL )
+        * names = NULL;
+
+    return RC ( rcDB, rcDatabase, rcListing, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC KDatabaseListTbl ( struct KDatabase const *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        struct FilterData data;
+        data.mgr = self->mgr;
+        data.type = kptTable;
+
+        return KDirectoryList ( self -> dir,
+            names, KDatabaseListFilter, &data, "tbl" );
+    }
+
+    if ( names != NULL )
+        * names = NULL;
+
+    return RC ( rcDB, rcDatabase, rcListing, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC KDatabaseListIdx ( struct KDatabase const *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        struct FilterData data;
+        data.mgr = self->mgr;
+        data.type = kptIndex;
+
+        return KDirectoryList ( self -> dir,
+            names, KDatabaseListFilter, &data, "idx" );
+    }
+
+    if ( names != NULL )
+        * names = NULL;
+
+    return RC ( rcDB, rcDatabase, rcListing, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC KDBManagerVPathOpenLocalDBRead ( struct KDBManager const * self,
+    struct KDatabase const ** p_db, struct VPath const * vpath )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+    if ( p_db == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    if ( vpath == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+        
+    {   
+        /* vpath has already been resolved and is known to be a local path. 
+           open it if it is a database; avoid an additional round of resolution */
+        const KDirectory *dir;
+        rc_t rc = VFSManagerOpenDirectoryReadDirectoryRelativeDecrypt ( self -> vfsmgr, self -> wd, &dir, vpath );
+        if ( rc == 0 )
+        {
+            if ( ( (~kptAlias) & KDBPathType ( dir, NULL, "." ) ) != kptDatabase )
+            {
+                rc = RC ( rcDB, rcMgr, rcOpening, rcDatabase, rcIncorrect );
+            }
+            else
+            {   /* allocate a new guy */
+                KDatabase *db;
+                rc = KDatabaseMakeVPath ( & db, dir, vpath );
+                if ( rc == 0 )
+                {
+                    db -> mgr = KDBManagerAttach ( self ); 
+                    * p_db = db;
+                    return 0;
+                }
+            }
+
+            KDirectoryRelease ( dir );
+        }
+        return rc;
+    }
+} 
+
+LIB_EXPORT rc_t CC KDBManagerVPathOpenRemoteDBRead ( struct KDBManager const * self,
+    struct KDatabase const ** p_db, struct VPath const * remote, struct VPath const * cache )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+    if ( p_db == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    if ( remote == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    /* cache == NULL is OK */    
+    
+    {   
+        /*  vpath has already been resolved and is known to be a remote URL. 
+            Open it if it is a database; use the provided cache; avoid an additional round of resolution */
+        const KDirectory *dir;
+        rc_t rc = VFSManagerOpenDirectoryReadDecryptRemote( self -> vfsmgr, &dir, remote, cache );
+        if ( rc == 0 )
+        {
+            if ( ( (~kptAlias) & KDBPathType ( dir, NULL, "." ) ) != kptDatabase )
+            {
+                rc = RC ( rcDB, rcMgr, rcOpening, rcDatabase, rcIncorrect );
+            }
+            else
+            {   /* allocate a new guy */
+                KDatabase *db;
+                rc = KDatabaseMakeVPath ( & db, dir, remote );
+                if ( rc == 0 )
+                {
+                    db -> mgr = KDBManagerAttach ( self ); 
+                    * p_db = db;
+                    return 0;
+                }
+            }
+
+            KDirectoryRelease ( dir );
+        }
+        return rc;
+    }
+}
\ No newline at end of file
diff --git a/libs/kdb/dbcc-cmn.c b/libs/kdb/dbcc-cmn.c
new file mode 100644
index 0000000..99f1205
--- /dev/null
+++ b/libs/kdb/dbcc-cmn.c
@@ -0,0 +1,141 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ *============================================================================
+ *
+ */
+
+#include <kdb/extern.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+
+#include "cc-priv.h"
+#include <os-native.h>
+
+#include <stdio.h> /* for sprintf */
+#include <string.h>
+
+static
+rc_t FileCheckMD5(const KDirectory *dir, const char name[], const uint8_t digest[])
+{
+    rc_t rc;
+    const KFile *fp;
+    const KFile *mds;
+    uint64_t pos;
+    size_t nr;
+    char buf[4096];
+    
+    rc = KDirectoryOpenFileRead(dir, &fp, "%s", name);
+    if (rc)
+        return rc;
+    rc = KFileMakeMD5Read(&mds, fp, digest);
+    if (rc) {
+        KFileRelease(fp);
+        return rc;
+    }
+    for (pos = 0; ; ) {
+        rc = KFileRead(mds, pos, buf, sizeof(buf), &nr);
+        if (rc || nr == 0)
+            break;
+        pos += nr;
+    }
+    KFileRelease(mds);
+
+    return rc;
+}
+
+rc_t DirectoryCheckMD5(const KDirectory *dir, const char name[],
+                       CCReportInfoBlock *nfo,
+                       CCReportFunc report, void *ctx)
+{
+    rc_t rc;
+    rc_t rc2 = 0;
+    const KFile *kf;
+    const KMD5SumFmt *sum;
+    uint32_t i;
+    uint32_t n;
+    uint8_t digest[16];
+    char pathbuf[4096];
+    char mesg[1024];
+    
+    mesg[0] = '\0';
+    
+    nfo->type = ccrpt_Done;
+    nfo->info.done.mesg = mesg;
+    
+    rc = KDirectoryOpenFileRead(dir, &kf, "%s", name);
+    if (rc) {
+        snprintf(mesg, sizeof(mesg), "MD5 file '%s' could not be opened", name);
+        nfo->info.done.rc = rc;
+        return report(nfo, ctx);
+    }
+    rc = KMD5SumFmtMakeRead(&sum, kf);
+    if (rc) {
+        KFileRelease(kf);
+        snprintf(mesg, sizeof(mesg), "MD5 file '%s' could not be read", name);
+        nfo->info.done.rc = rc;
+        return report(nfo, ctx);
+    }
+    rc = KMD5SumFmtCount(sum, &n);
+    if (rc)
+        return rc;
+    for (i = 0; i != n; ++i) {
+        char *path = pathbuf;
+        rc = KMD5SumFmtGet(sum, i, pathbuf, sizeof(pathbuf), digest, NULL);
+        if (rc)
+            break;
+
+        /* catch case where skey.md5 contains full path */
+        if ( path [ 0 ] == '/' )
+        {
+            size_t sz = strlen ( path );
+            if ( sz >= 5 && strcmp ( & path [ sz - 5 ], "/skey" ) == 0 )
+                path = "skey";
+        }
+
+        rc = FileCheckMD5(dir, path, digest);
+        if (rc2 == 0)
+            rc2 = rc;
+        nfo->type = ccrpt_MD5;
+        nfo->info.MD5.rc = rc;
+        nfo->info.MD5.file = path;
+        rc = report(nfo, ctx);
+        if ( rc != 0 )
+            break;
+    }
+    KMD5SumFmtRelease(sum);
+    if (rc)
+        return rc;
+    
+    nfo->type = ccrpt_Done;
+    if (rc2) {
+        nfo->info.done.mesg = "failed md5 validation";
+        nfo->info.done.rc = rc2;
+    }
+    else {
+        nfo->info.done.mesg = "md5 ok";
+        nfo->info.done.rc = 0;
+    }
+    return report(nfo, ctx);
+}
diff --git a/libs/kdb/dbmgr-cmn.c b/libs/kdb/dbmgr-cmn.c
new file mode 100644
index 0000000..fd95b66
--- /dev/null
+++ b/libs/kdb/dbmgr-cmn.c
@@ -0,0 +1,485 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+#include <kdb/extern.h>
+#include "libkdb.vers.h"
+
+#define KONST const
+#include "dbmgr-priv.h"
+#include "kdb-priv.h"
+#undef KONST
+
+#include <vfs/manager.h>
+#include <kfs/directory.h>
+#include <klib/symbol.h>
+#include <klib/checksum.h>
+#include <klib/rc.h>
+#include <kproc/lock.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * KDBManager
+ *  handle to library
+ */
+
+
+/* Whack
+ */
+static
+rc_t KDBManagerWhack ( KDBManager *self )
+{
+    rc_t rc;
+
+    KRefcountWhack ( & self -> refcount, "KDBManager" );
+
+    /* everything should be closed */
+    assert ( self -> open_objs . root == NULL );
+
+    rc = KRWLockRelease ( self -> open_objs_lock );
+
+    rc = VFSManagerRelease ( self -> vfsmgr );
+
+    rc = KDirectoryRelease ( self -> wd );
+    if ( rc == 0 )
+    {
+        free ( self );
+        return 0;
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "KDBManager", "whack", "kmgr" );
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KDBManagerAddRef ( const KDBManager *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KDBManager" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcMgr, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KDBManagerRelease ( const KDBManager *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KDBManager" ) )
+        {
+        case krefWhack:
+            return KDBManagerWhack ( ( KDBManager* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcMgr, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Attach
+ * Sever
+ */
+KDBManager* KDBManagerAttach ( const KDBManager *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KDBManager" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KDBManager* ) self;
+}
+
+rc_t KDBManagerSever ( const KDBManager *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KDBManager" ) )
+        {
+        case krefWhack:
+            return KDBManagerWhack ( ( KDBManager* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcMgr, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make - PRIVATE
+ *
+ *  "wd" [ IN, NULL OKAY ] - optional working directory for
+ *  accessing the file system. mgr will attach its own reference.
+ */
+rc_t KDBManagerMake ( KDBManager **mgrp, const KDirectory *wd, const char *op,
+    VFSManager *vmanager )
+{
+    rc_t rc;
+
+    if ( mgrp == NULL )
+        rc = RC ( rcDB, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KDBManager *mgr = malloc ( sizeof * mgr );
+        if ( mgr == NULL )
+            rc = RC ( rcDB, rcMgr, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            memset ( mgr, 0, sizeof * mgr );
+            mgr -> wd = wd;
+            if ( wd != NULL )
+                rc = KDirectoryAddRef ( wd );
+            else
+                rc = KDirectoryNativeDir ( ( KDirectory** ) & mgr -> wd );
+
+            if ( rc == 0 )
+            {
+                if (vmanager == NULL) {
+                    rc = VFSManagerMake ( & mgr -> vfsmgr );
+                }
+                else {
+                    rc = VFSManagerAddRef ( vmanager );
+                    if (rc == 0) {
+                        mgr -> vfsmgr = vmanager;
+                    }
+                }
+
+                if ( rc == 0 )
+                {
+                    rc = KRWLockMake ( & mgr -> open_objs_lock );
+
+                    if ( rc == 0 )
+                    {
+                        CRC32Init ();
+                        
+                        BSTreeInit ( & mgr -> open_objs );
+                        
+                        KRefcountInit ( & mgr -> refcount, 1, "KDBManager", op, "kmgr" );
+                        
+                        * mgrp = mgr;
+                        return 0;
+                    }
+
+                    VFSManagerRelease ( mgr -> vfsmgr );
+                }
+
+                KDirectoryRelease ( mgr -> wd );
+            }
+
+            free ( mgr );
+        }
+
+        * mgrp = NULL;
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDBManagerGetVFSManager ( const KDBManager *self,
+    const struct VFSManager **vmanager )
+{
+    if (self == NULL) {
+        return RC ( rcDB, rcMgr, rcAccessing, rcSelf, rcNull );
+    }
+    else if (vmanager == NULL) {
+        return RC ( rcDB, rcMgr, rcAccessing, rcParam, rcNull );
+    }
+    else {
+        rc_t rc = VFSManagerAddRef(self -> vfsmgr);
+        if (rc == 0) {
+            * vmanager = self -> vfsmgr;
+        }
+        else {
+            * vmanager = NULL;
+        }
+        return rc;
+    }
+}
+
+
+/* Version
+ *  returns the library version
+ */
+LIB_EXPORT rc_t CC KDBManagerVersion ( const KDBManager *self, uint32_t *version )
+{
+    if ( version == NULL )
+        return RC ( rcDB, rcMgr, rcAccessing, rcParam, rcNull );
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcAccessing, rcSelf, rcNull );
+
+    * version = LIBKDB_VERS;
+    return 0;
+}
+
+
+/* Exists
+ *  returns true if requested object exists
+ *
+ *  "requested" [ IN ] - a KDBPathType
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT bool CC KDBManagerVExists ( const KDBManager *self, uint32_t requested, const char *name, va_list args )
+{
+    int type;
+
+    type = KDBManagerVPathType (self, name, args);
+    switch ( type )
+    {
+    case kptDatabase:
+    case kptTable:
+    case kptIndex:
+    case kptColumn:
+    case kptMetadata:
+        break;
+    case kptPrereleaseTbl:
+        type = kptTable;
+        break;
+    default:
+        return false;
+    }
+    return requested == ( uint32_t ) type;
+}
+
+bool KDBManagerExists ( const KDBManager *self, uint32_t type, const char *name, ... )
+{
+    bool exists;
+
+    va_list args;
+    va_start ( args, name );
+
+    exists = KDBManagerVExists ( self, type, name, args );
+
+    va_end ( args );
+
+    return exists;
+}
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+
+/* TBD - should be in this file */
+
+/* CheckOpen
+ */
+rc_t KDBManagerCheckOpen ( const KDBManager * self, const char *path )
+{
+    /* try to find the open object by path */
+    KSymbol *sym = KDBManagerOpenObjectFind ( self, path );
+
+    /* if not open, return no error */
+    if ( sym == NULL )
+        return 0;
+
+    /* put together an appropriate response */
+    switch ( sym -> type )
+    {
+    case kptDatabase:
+        return RC ( rcDB, rcMgr, rcAccessing, rcDatabase, rcBusy );
+    case kptTable:
+        return RC ( rcDB, rcMgr, rcAccessing, rcTable, rcBusy );
+    case kptColumn:
+        return RC ( rcDB, rcMgr, rcAccessing, rcColumn, rcBusy );
+    case kptIndex:
+        return RC ( rcDB, rcMgr, rcAccessing, rcIndex, rcBusy );
+    case kptMetadata:
+        return RC ( rcDB, rcMgr, rcAccessing, rcMetadata, rcBusy );
+    case kptPrereleaseTbl:
+        return RC ( rcDB, rcMgr, rcAccessing, rcTable, rcBusy );
+    default:
+        break;
+    }
+
+    return RC ( rcDB, rcMgr, rcAccessing, rcUnknown, rcBusy );
+}
+
+
+
+/* OpenObjectFind
+ *  return a pointer to the openobject with path
+ */
+static
+KSymbol *KDBManagerOpenObjectFindInt ( const KDBManager * self, String *s )
+{
+    KSymbol *sym = NULL;
+    rc_t rc = KRWLockAcquireShared ( self -> open_objs_lock );
+    if ( rc == 0 )
+    {
+        sym = ( KSymbol* ) BSTreeFind ( & self -> open_objs, s, KSymbolCmp );
+        KRWLockUnlock ( self -> open_objs_lock );
+    }
+    return sym;
+}
+
+KSymbol *KDBManagerOpenObjectFind ( const KDBManager * self, const char * path )
+{
+    String s;
+    StringInitCString ( & s, path );
+    return KDBManagerOpenObjectFindInt ( self, & s );
+}
+
+
+/* OpenObjectBusy
+ *  Is this path to an object in the OpenObjects list?
+ */
+bool KDBManagerOpenObjectBusy ( const KDBManager *self, const char *path )
+{
+    return KDBManagerOpenObjectFind ( self, path ) != NULL;
+}
+
+
+/* OpenObjectAdd
+ *  Put an object in to the open objects list
+ */
+rc_t KDBManagerOpenObjectAdd ( KDBManager *self, KSymbol *obj )
+{
+    KSymbol *exists;
+    rc_t rc = KRWLockAcquireExcl ( self -> open_objs_lock );
+    if ( rc == 0 )
+    {
+        rc = BSTreeInsertUnique ( & self -> open_objs,
+            & obj -> n, ( BSTNode** ) & exists, KSymbolSort );
+
+        KRWLockUnlock ( self -> open_objs_lock );
+
+        if ( rc != 0 )
+        {
+            switch ( exists -> type )
+            {
+            case kptDatabase:
+                rc = RC ( rcDB, rcMgr, rcInserting, rcDatabase, rcBusy );
+                break;
+            case kptTable:
+            case kptPrereleaseTbl:
+                rc = RC ( rcDB, rcMgr, rcInserting, rcTable, rcBusy );
+                break;
+            case kptColumn:
+                rc = RC ( rcDB, rcMgr, rcInserting, rcColumn, rcBusy );
+                break;
+            case kptIndex:
+                rc = RC ( rcDB, rcMgr, rcInserting, rcIndex, rcBusy );
+                break;
+            case kptMetadata:
+                rc = RC ( rcDB, rcMgr, rcInserting, rcMetadata, rcBusy );
+                break;
+            default:
+                rc = RC ( rcDB, rcMgr, rcInserting, rcUnknown, rcBusy );
+            }
+        }
+    }
+    return rc;
+}
+
+
+/* OpenDelete
+ *  Take an object out of the open objects list
+ */
+rc_t KDBManagerOpenObjectDelete ( KDBManager *self, KSymbol *obj )
+{
+    rc_t rc = 0;
+    if ( obj != NULL )
+    {
+        rc = KRWLockAcquireExcl ( self -> open_objs_lock );
+        if ( rc == 0 )
+        {
+            /* we can expect that the only valid reason for
+               "obj" not being unlinked is that it was not in
+               the tree. other reasons would be that "obj" was
+               corrupt, but in any event, it's not in the tree */
+            if ( ! BSTreeUnlink ( & self -> open_objs, & obj -> n ) )
+
+                /* to be truly weird, we could tell what kind of node
+                   it was that we didn't find */
+                rc = RC ( rcDB, rcMgr, rcRemoving, rcNode, rcNotFound );
+
+            KRWLockUnlock ( self -> open_objs_lock );
+        }
+    }
+
+    return rc;
+}
+
+
+/* ModDate
+ *  return a modification timestamp for table
+ */
+LIB_EXPORT rc_t CC KDBManagerVGetTableModDate ( const KDBManager *self,
+    KTime_t *mtime, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( mtime == NULL )
+        rc = RC ( rcDB, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self != NULL )
+            return KDBVGetPathModDate ( self -> wd, mtime, path, args );
+
+        rc = RC ( rcDB, rcMgr, rcAccessing, rcSelf, rcNull );
+        * mtime = 0;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerGetTableModDate ( const KDBManager *self,
+    KTime_t *mtime, const char *path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+    rc = KDBManagerVGetTableModDate ( self, mtime, path, args );
+    va_end ( args );
+
+    return rc;
+}
diff --git a/libs/kdb/dbmgr-priv.h b/libs/kdb/dbmgr-priv.h
new file mode 100644
index 0000000..37c526b
--- /dev/null
+++ b/libs/kdb/dbmgr-priv.h
@@ -0,0 +1,128 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_dbmgr_priv_
+#define _h_dbmgr_priv_
+
+#ifndef _h_kdb_manager_
+#include <kdb/manager.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef KONST
+#define KONST
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KRWLock;
+struct KSymbol;
+struct KDirectory;
+struct VFSManager;
+
+/*--------------------------------------------------------------------------
+ * KDBManager
+ *  handle to library
+ */
+struct KDBManager
+{
+    /* root directory */
+    struct KDirectory KONST *wd;
+
+    /* open objects */
+    struct KRWLock *open_objs_lock;
+    BSTree open_objs;
+
+    /* open references */
+    KRefcount refcount;
+
+    /* other managers needed by the KDB manager */
+    struct VFSManager * vfsmgr;
+};
+
+
+/* Make - PRIVATE
+ */
+rc_t KDBManagerMake ( KDBManager **mgrp, struct KDirectory const *wd,
+    const char *op, struct VFSManager *vmanager );
+
+/* Attach
+ * Sever
+ */
+#if 1
+KDBManager *KDBManagerAttach ( const KDBManager *self );
+rc_t KDBManagerSever ( const KDBManager *self );
+#else
+KDBManager *KDBManagerAttach ( const KDBManager *self, struct KSymbol *sym );
+rc_t KDBManagerSever ( const KDBManager *self, struct KSymbol *sym );
+#endif
+
+/* CheckOpen
+ *  tests if object is open and returns an error code
+ *  of 0 if not, or <target>, rcBusy if so, where
+ *  <target> is generated from object type.
+ */
+rc_t KDBManagerCheckOpen ( const KDBManager *self, const char *path );
+
+/* OpenObjectBusy
+ *   Does this path reference an object already open?
+ */
+bool KDBManagerOpenObjectBusy ( const KDBManager *self, const char *path );
+
+/* OpenObjectFind
+ *   return a reference to an object with this "symbol" - path
+ */
+struct KSymbol *KDBManagerOpenObjectFind ( const KDBManager *self, const char *path );
+
+/* OpenObjectAdd
+ *   Put this symbol in the list of open objects
+ */
+rc_t KDBManagerOpenObjectAdd ( KDBManager *self, struct KSymbol *obj );
+
+/* OpenObjectDelete
+ *   remove this symbol in the list of open objects
+ */
+rc_t KDBManagerOpenObjectDelete ( KDBManager *self, struct KSymbol *obj );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_dbmgr_priv_ */
diff --git a/libs/kdb/dbmgr.c b/libs/kdb/dbmgr.c
new file mode 100644
index 0000000..2e8b546
--- /dev/null
+++ b/libs/kdb/dbmgr.c
@@ -0,0 +1,420 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+#include <kdb/extern.h>
+
+#include <kdb/kdb-priv.h> /* KDBManagerMakeReadWithVFSManager */
+
+#include "libkdb.vers.h"
+
+#include <vfs/manager.h>
+#include <vfs/resolver.h>
+#include <vfs/path.h>
+#include <vfs/path-priv.h>
+#include <kfs/directory.h>
+
+#define KONST const
+#include "dbmgr-priv.h"
+#include "kdb-priv.h"
+#include "kdbfmt-priv.h"
+#include <klib/checksum.h>
+#include <klib/rc.h>
+#undef KONST
+
+#include <klib/text.h>
+
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * KDBManager
+ *  handle to library
+ */
+
+
+/* MakeRead
+ * MakeReadWithVFSManager
+ *  create library handle for specific use
+ *  NB - only one of the functions will be implemented
+ *
+ *  "wd" [ IN, NULL OKAY ] - optional working directory for
+ *  accessing the file system. mgr will attach its own reference.
+ */
+LIB_EXPORT rc_t CC KDBManagerMakeRead ( const KDBManager **mgrp, const KDirectory *wd )
+{
+    return KDBManagerMakeReadWithVFSManager(mgrp, wd, NULL);
+}
+
+LIB_EXPORT rc_t CC KDBManagerMakeReadWithVFSManager ( const KDBManager **mgrp,
+    const KDirectory *wd, struct VFSManager *vmanager )
+{
+    return KDBManagerMake ( ( KDBManager** ) mgrp, wd, "make-read", vmanager );
+}
+
+/*
+ * Resolve using manager, possibly against this directory, using or not uri
+ * accession resolution of those dangerous formatted path thingies
+ *
+
+
+
+ * 1. If naked accession or uri accession resolve to local, 
+
+
+ * self                         = a kdbmanager
+ * disable_accession_resolution = turn off VResolver usage for accessions
+ *                                read versus create/upate 
+ * resolved+path                = a vpath created based on text path
+ * fmt                          = our scary interface that is 'sprintf'ish
+ * args                         = goes with the fmt
+ *
+ * NOTE: as usual a path with a '%' becomes broken at unsuspected times
+ */
+rc_t KDBManagerResolveVPathInt (const KDBManager * self, 
+                                bool disable_accession_resolution,
+                                VPath ** resolved_path, 
+                                const VPath * path)
+{
+    uint32_t flags;
+
+    assert (self != NULL);
+    assert (resolved_path != NULL);
+    assert (path != NULL);
+
+    flags = disable_accession_resolution
+        ? vfsmgr_rflag_no_acc
+        : vfsmgr_rflag_kdb_acc;
+
+    return VFSManagerResolvePath (self->vfsmgr, 
+                                  flags,
+                                  path, resolved_path);
+}
+
+
+rc_t KDBManagerVResolveVPath (const KDBManager * self, 
+                                bool disable_accession_resolution,
+                                VPath ** resolved_path, 
+                                const VPath * path)
+{
+    return KDBManagerResolveVPathInt (self, disable_accession_resolution,
+                                      resolved_path, path);
+}
+
+
+rc_t KDBManagerVResolvePath (const KDBManager * self, 
+                             bool disable_accession_resolution,
+                             VPath ** resolved_path, 
+                             const char * fmt, va_list args)
+{
+    VPath * p;
+    rc_t rc;
+
+    if (resolved_path == NULL)
+        return RC (rcDB, rcMgr, rcResolving, rcParam, rcNull);
+
+    *resolved_path = NULL;
+
+    if (self == NULL)
+        return RC (rcDB, rcMgr, rcResolving, rcSelf, rcNull);
+
+    if ((fmt == NULL) || (fmt[0] == '\0'))
+        return RC (rcDB, rcMgr, rcResolving, rcParam, rcNull);
+
+    rc = VFSManagerVMakePath ( self -> vfsmgr, &p, fmt, args);
+    if (rc == 0)
+    {
+        rc = KDBManagerVResolveVPath (self, disable_accession_resolution,
+                                      resolved_path, p);
+        VPathRelease (p);
+    }
+    return rc;
+}
+
+rc_t KDBManagerVResolvePathRelativeDir (const KDBManager * self, const KDirectory * dir,
+                                        bool disable_accession_resolution,
+                                        VPath ** resolved_path, 
+                                        const char * fmt, va_list args)
+{
+    VPath * p;
+    rc_t rc;
+
+    if (resolved_path == NULL)
+        return RC (rcDB, rcMgr, rcResolving, rcParam, rcNull);
+
+    *resolved_path = NULL;
+
+    if (self == NULL)
+        return RC (rcDB, rcMgr, rcResolving, rcSelf, rcNull);
+
+    if ((fmt == NULL) || (fmt[0] == '\0'))
+        return RC (rcDB, rcMgr, rcResolving, rcParam, rcNull);
+
+    rc = VFSManagerVMakePath ( self -> vfsmgr, &p, fmt, args);
+    if (rc == 0)
+    {
+        rc = KDBManagerVResolveVPath (self, disable_accession_resolution,
+                                      resolved_path, p);
+        VPathRelease (p);
+    }
+    return rc;
+}
+
+
+rc_t KDBManagerResolvePathRelativeDir (const KDBManager * self,
+                                       const KDirectory * dir,
+                                       bool disable_accession_resolution,
+                                       VPath ** resolved_path, const char * fmt, ...)
+{
+    va_list args;
+    rc_t rc;
+
+    va_start (args, fmt);
+
+    rc = KDBManagerVResolvePathRelativeDir (self, dir, 
+                                            disable_accession_resolution,
+                                            resolved_path, fmt, args);
+    va_end (args);
+    return rc;
+}
+
+
+
+/* KDBHdrValidate
+ *  validates that a header sports a supported byte order
+ *  and that the version is within range
+ */
+rc_t KDBHdrValidate ( const KDBHdr *hdr, size_t size,
+    uint32_t min_vers, uint32_t max_vers )
+{
+    assert ( hdr != NULL );
+
+    if ( size < sizeof * hdr )
+        return RC ( rcDB, rcHeader, rcValidating, rcData, rcCorrupt );
+
+    if ( hdr -> endian != eByteOrderTag )
+    {
+        if ( hdr -> endian == eByteOrderReverse )
+            return RC ( rcDB, rcHeader, rcValidating, rcByteOrder, rcIncorrect );
+        return RC ( rcDB, rcHeader, rcValidating, rcData, rcCorrupt );
+    }
+
+    if ( hdr -> version < min_vers || hdr -> version > max_vers )
+        return RC ( rcDB, rcHeader, rcValidating, rcHeader, rcBadVersion );
+
+    return 0;
+}
+
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC KDBManagerVWritable ( const KDBManager *self, const char * path, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcDB, rcMgr, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        char dbpath [ 4096 ];
+
+        /* get full path to object */
+        rc = KDirectoryVResolvePath ( self -> wd, true, dbpath, sizeof dbpath, path, args );
+        if ( rc == 0 )
+        {
+            int type = KDBPathType ( self -> wd, NULL, path ) & ~ kptAlias;
+            switch ( type )
+            {
+            case kptDatabase:
+            case kptTable:
+            case kptColumn:
+            case kptIndex:
+                rc = KDBWritable ( self -> wd, path );
+                break;
+            case kptNotFound:
+                rc = RC ( rcDB, rcMgr, rcAccessing, rcPath, rcNotFound );
+                break;
+            case kptBadPath:
+                rc = RC ( rcDB, rcMgr, rcAccessing, rcPath, rcInvalid );
+                break;
+            default:
+                rc = RC ( rcDB, rcMgr, rcAccessing, rcPath, rcIncorrect );
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerWritable ( const KDBManager *self, const char * path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+
+    rc = KDBManagerVWritable ( self, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* RunPeriodicTasks
+ *  executes periodic tasks, such as cache flushing
+ */
+LIB_EXPORT rc_t CC KDBManagerRunPeriodicTasks ( const KDBManager *self )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcExecuting, rcSelf, rcNull );
+
+    return 0;
+}
+
+
+/* PathType
+ *  check the path type of an object/directory path.
+ *  this is an extension of the KDirectoryPathType and will return
+ *  the KDirectory values if a path type is not specifically a
+ *  kdb object
+ */
+LIB_EXPORT int CC KDBManagerPathTypeVP ( const KDBManager * self, const VPath * path )
+{
+    VPath * rpath;
+    int path_type;
+    rc_t rc;
+
+    path_type = kptBadPath;
+    if ((self != NULL) && (path != NULL))
+    {
+        /*
+         * resolve the possible relative path or accession into
+         * a final path we can open directly
+         */
+        rc = KDBManagerResolveVPathInt (self, false, &rpath, path);
+        if (rc == 0)
+        {
+            const KDirectory * dir;
+
+            /*
+             * Most KDBPathType values are based on 'directories'
+             * so try to open the resolved path as a directory
+             */
+            rc = VFSManagerOpenDirectoryReadDecrypt (self->vfsmgr, &dir, rpath);
+            if (rc == 0)
+            {
+                path_type = KDBPathTypeDir (dir, kptDir, NULL, ".");
+                KDirectoryRelease (dir);
+            }
+            /*
+             * If we couldn't open the path as a directory we 'might'
+             * have a KDB idx but we will only try that for a limited
+             * set of uri schemes.
+             */
+            else
+            {
+#if 1
+                if ( VPathIsFSCompatible ( rpath ) )
+                {
+                    char buffer [ 4096 ];
+                    rc = VPathReadPath ( rpath, buffer, sizeof buffer, NULL );
+                    if ( rc == 0 )
+                        path_type = KDBPathType ( self -> wd, false, buffer );
+                }
+#else
+                VPUri_t t;
+
+                rc = VPathGetScheme_t (rpath, &t);
+                if (rc == 0)
+                {
+                    switch (t)
+                    {
+                    default:
+                        break;
+                    case vpuri_ncbi_vfs:
+                    case vpuri_file:
+                    case vpuri_none:
+                    {
+                        char b [4 * 1024];
+                        size_t z;
+                        rc = VPathReadPath (path, b, sizeof b, &z);
+                        if (rc == 0)
+                            path_type = KDBPathType (self->wd, false, b);
+                        break;
+                    }}
+                }
+#endif
+            }
+            VPathRelease (rpath);
+        }
+    }
+    return path_type;
+}
+
+
+LIB_EXPORT int CC KDBManagerVPathType ( const KDBManager * self, const char *path, va_list args )
+{
+    int path_type = kptBadPath;
+
+    if ((self != NULL) && (path != NULL))
+    {
+        VPath * vp;
+        rc_t rc;
+
+        rc = VFSManagerVMakePath ( self -> vfsmgr, &vp, path, args);
+        if (rc == 0)
+        {
+            path_type = KDBManagerPathTypeVP (self, vp);
+            VPathRelease (vp);
+        }
+    }
+    return path_type;
+}
+
+
+LIB_EXPORT int CC KDBManagerPathType ( const KDBManager * self, const char *path, ... )
+{
+    int res;
+    va_list args;
+
+    va_start ( args, path );
+
+    res = KDBManagerVPathType ( self, path, args );
+
+    va_end (args);
+    return res;
+}
diff --git a/libs/kdb/idstats-priv.h b/libs/kdb/idstats-priv.h
new file mode 100644
index 0000000..cae6809
--- /dev/null
+++ b/libs/kdb/idstats-priv.h
@@ -0,0 +1,74 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_idstats_priv_
+#define _h_idstats_priv_
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KIdStats
+ *  maintains statistics about id mappings
+ */
+typedef struct KIdStats KIdStats;
+struct KIdStats
+{
+    int64_t i_min_id, x_max_id;
+    uint64_t num_entries;
+    uint64_t num_ids;
+    uint64_t num_holes;
+    BSTree ids;
+};
+
+
+/* Init
+ *  initialize the object
+ */
+void KIdStatsInit ( KIdStats *s );
+
+/* Whack
+ *  tear down the object
+ */
+void KIdStatsWhack ( KIdStats *self );
+
+/* Insert
+ *  add an entry representing 1 or more consecutive ids
+ */
+rc_t KIdStatsInsert ( KIdStats *self, int64_t id, uint64_t count );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_idstats_priv_ */
diff --git a/libs/kdb/idstats.c b/libs/kdb/idstats.c
new file mode 100644
index 0000000..e41b10d
--- /dev/null
+++ b/libs/kdb/idstats.c
@@ -0,0 +1,269 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#include "idstats-priv.h"
+
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KIdStatsNode
+ */
+typedef struct KIdStatsNode KIdStatsNode;
+struct KIdStatsNode
+{
+    BSTNode n;
+    int64_t i_left, x_right;
+};
+
+
+/* Init
+ */
+static
+void KIdStatsNodeInit ( KIdStatsNode *node, int64_t id, uint64_t count )
+{
+    if ( node != NULL )
+    {
+        node -> i_left = id;
+        node -> x_right = id + count;
+    }
+}
+
+
+/* Make
+ */
+static
+KIdStatsNode *KIdStatsNodeMake ( int64_t id, uint64_t count )
+{
+    KIdStatsNode *node = malloc ( sizeof * node );
+    KIdStatsNodeInit ( node, id, count );
+    return node;
+}
+
+/* Whack
+ */
+static
+void CC KIdStatsNodeWhack ( BSTNode *n, void *ignore )
+{
+    free ( n );
+}
+
+/* Cmp
+ * Sort
+ */
+static
+int64_t CC KIdStatsNodeCmp ( const void *item, const BSTNode *n )
+{
+    const KIdStatsNode *a = item;
+    const KIdStatsNode *b = ( const KIdStatsNode* ) n;
+
+    if ( a -> x_right < b -> i_left )
+        return -1;
+    if ( a -> i_left > b -> x_right )
+        return 1;
+    return 0;
+}
+
+static
+int64_t CC KIdStatsNodeSort ( const BSTNode *item, const BSTNode *n )
+{
+    const KIdStatsNode *a = ( const KIdStatsNode* ) item;
+    const KIdStatsNode *b = ( const KIdStatsNode* ) n;
+
+    if ( a -> x_right < b -> i_left )
+        return -1;
+    if ( a -> i_left > b -> x_right )
+        return 1;
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * KIdStats
+ *  maintains statistics about text index mappings
+ */
+
+/* Init
+ *  initialize the object
+ */
+void KIdStatsInit ( KIdStats *s )
+{
+    if ( s != NULL )
+        memset ( s, 0, sizeof * s );
+}
+
+/* Whack
+ *  tear down the object
+ */
+void KIdStatsWhack ( KIdStats *self )
+{
+    if ( self != NULL )
+    {
+        BSTreeWhack ( & self -> ids, KIdStatsNodeWhack, NULL );
+        BSTreeInit ( & self -> ids );
+    }
+}
+
+/* Insert
+ *  add an entry representing 1 or more consecutive ids
+ */
+rc_t KIdStatsInsert ( KIdStats *self, int64_t id, uint64_t count )
+{
+    rc_t rc;
+    KIdStatsNode *node, *existing;
+
+    /* could be an assert - but here we go */
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcValidating, rcParam, rcNull );
+
+    /* if this is not the first entry */
+    if ( self -> num_entries != 0 )
+    {
+        KIdStatsNode item;
+        KIdStatsNodeInit ( & item, id, count );
+        existing = ( KIdStatsNode* ) BSTreeFind ( & self -> ids, & item, KIdStatsNodeCmp );
+        if ( existing != NULL )
+        {
+            /* min/max the range */
+            if ( id < self -> i_min_id )
+                self -> i_min_id = id;
+            if ( ( int64_t ) ( id + count ) > self -> x_max_id )
+                self -> x_max_id = id + count;
+            ++ self -> num_entries;
+
+            /* merge this insert with the returned node */
+            if ( existing -> i_left > item . i_left )
+            {
+                self -> num_ids += existing -> i_left - item . i_left;
+                existing -> i_left = item . i_left;
+
+                /* merge node toward left */
+                for ( node = ( KIdStatsNode* ) BSTNodePrev ( & existing -> n );
+                      node != NULL;
+                      node = ( KIdStatsNode* ) BSTNodePrev ( & existing -> n ) )
+                {
+                    /* exit loop if no intersection */
+                    if ( existing -> i_left > node -> x_right )
+                        break;
+
+                    /* a hole will be closed */
+                    assert ( self -> num_holes > 0 );
+                    -- self -> num_holes;
+
+                    /* remove overlaps from count and extend "existing" */
+                    if ( existing -> i_left <= node -> i_left )
+                        self -> num_ids -= node -> x_right - node -> i_left;
+                    else
+                    {
+                        self -> num_ids -= node -> x_right - existing -> i_left;
+                        existing -> i_left = node -> i_left;
+                    }
+
+                    /* drop old node */
+                    BSTreeUnlink ( & self -> ids, & node -> n );
+                    KIdStatsNodeWhack ( & node -> n, NULL );
+                }
+            }
+
+            /* now merge right edge */
+            if ( item . x_right > existing -> x_right )
+            {
+                self -> num_ids += item . x_right - existing -> x_right;
+                existing -> x_right = item . x_right;
+
+                /* merge node toward right */
+                for ( node = ( KIdStatsNode* ) BSTNodeNext ( & existing -> n );
+                      node != NULL;
+                      node = ( KIdStatsNode* ) BSTNodeNext ( & existing -> n ) )
+                {
+                    /* exit loop if no intersection */
+                    if ( existing -> x_right < node -> i_left )
+                        break;
+
+                    /* a hole will be closed */
+                    assert ( self -> num_holes > 0 );
+                    -- self -> num_holes;
+
+                    /* remove overlaps from count and extend "existing" */
+                    if ( existing -> x_right >= node -> x_right )
+                        self -> num_ids -= node -> x_right - node -> i_left;
+                    else
+                    {
+                        self -> num_ids -= existing -> x_right - node -> i_left;
+                        existing -> x_right = node -> x_right;
+                    }
+
+                    /* drop old node */
+                    BSTreeUnlink ( & self -> ids, & node -> n );
+                    KIdStatsNodeWhack ( & node -> n, NULL );
+                }
+            }
+
+            return 0;
+        }
+    }
+
+    /* create the node */
+    node = KIdStatsNodeMake ( id, count );
+    if ( node == NULL )
+        return RC ( rcDB, rcIndex, rcValidating, rcMemory, rcExhausted );
+
+    /* insert it and be certain there are no collisions */
+    rc = BSTreeInsertUnique ( & self -> ids, & node -> n,
+        ( BSTNode** ) & existing, KIdStatsNodeSort );
+
+    if ( rc != 0 )
+        KIdStatsNodeWhack ( & node -> n, NULL );
+    else if ( self -> num_entries == 0 )
+    {
+        /* initial insert */
+        self -> i_min_id = id;
+        self -> x_max_id = id + count;
+        self -> num_entries = 1;
+        self -> num_ids = count;
+    }
+    else
+    {
+        /* min/max the range */
+        if ( id < self -> i_min_id )
+            self -> i_min_id = id;
+        if ( ( int64_t ) ( id + count ) > self -> x_max_id )
+            self -> x_max_id = id + count;
+        ++ self -> num_entries;
+        self -> num_ids += count;
+
+        /* the insert represents a hole */
+        ++ self -> num_holes;
+    }
+
+    return rc;
+}
diff --git a/libs/kdb/idxblk-priv.h b/libs/kdb/idxblk-priv.h
new file mode 100644
index 0000000..71fc191
--- /dev/null
+++ b/libs/kdb/idxblk-priv.h
@@ -0,0 +1,136 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_idxblk_priv_
+#define _h_idxblk_priv_
+
+#ifndef _h_colfmt_priv_
+#include "colfmt-priv.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KColConstBlockMap
+ *  maps an index or page section of block index
+ */
+typedef struct KColConstBlockMap KColConstBlockMap;
+struct KColConstBlockMap
+{
+    /* types 1-3 have a header section */
+    union
+    {
+        /* for assignment and manipulation */
+        const void *p;
+        const char *c;
+
+        /* type 1 has a constant range/size */
+        const uint32_t *span;
+
+        /* type 2 has a predictable id/pos */
+        const uint64_t *first;
+
+        /* type 3 has a starting page and constant size */
+        const struct
+        {
+            uint64_t pg;
+            uint32_t sz;
+        } *pred;
+
+        /* for rewriting columns */
+        uint32_t *last;
+
+    } h;
+
+    /* types 0 and 1 have explicit id/pos, where id is ordered */
+    const uint64_t *d;
+
+    /* types 0 and 2 have explicit range/size */
+    const uint32_t *s;
+};
+
+
+/*--------------------------------------------------------------------------
+ * KColIdxBlock
+ *  level 2 index reading block
+ *
+ *  each index block has two sections
+ */
+typedef struct KColIdxBlock KColIdxBlock;
+struct KColIdxBlock
+{
+    /* function for locating index */
+    int ( * find ) ( const KColIdxBlock *self,
+        const KColBlockLoc *bloc, uint32_t count,
+        int64_t id, int64_t *first, uint32_t *span );
+
+    /* function for locating blob */
+    void ( * get ) ( const KColIdxBlock *self,
+        const KColBlockLoc *bloc, uint32_t count,
+        uint32_t idx, uint64_t *pos, uint32_t *sz );
+
+    /* index section map */
+    KColConstBlockMap id;
+
+    /* page locator section map */
+    KColConstBlockMap pg;
+};
+
+/* Init
+ */
+rc_t KColIdxBlockInit ( KColIdxBlock *self,
+    const KColBlockLoc *bloc, size_t orig,
+    const void *block, size_t block_size, bool bswap );
+
+/* Find
+ *  find zero-based index of entry into block
+ *  that satisfies request
+ *  returns -1 if not found
+ */
+int KColIdxBlockFind ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    int64_t id, int64_t *first, uint32_t *span );
+#define KColIdxBlockFind( self, bloc, count, id, first, span ) \
+    ( * ( self ) -> find ) ( self, bloc, count, id, first, span )
+
+/* Get
+ *  get blob location information
+ */
+void KColIdxBlockGet ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    uint32_t idx, uint64_t *pg, uint32_t *sz );
+#define KColIdxBlockGet( self, bloc, count, idx, pg, sz ) \
+    ( * ( self ) -> get ) ( self, bloc, count, idx, pg, sz )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_idxblk_priv_ */
diff --git a/libs/kdb/idxblk.c b/libs/kdb/idxblk.c
new file mode 100644
index 0000000..e5c14cf
--- /dev/null
+++ b/libs/kdb/idxblk.c
@@ -0,0 +1,695 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "idxblk-priv.h"
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <byteswap.h>
+
+
+/*--------------------------------------------------------------------------
+ * KColConstBlockMap
+ *  maps an index or page section of block index
+ */
+static
+void KColConstBlockMapSwap ( KColConstBlockMap *self, uint32_t count, int type )
+{
+    uint32_t i;
+
+    switch ( type )
+    {
+    case btypeUniform:
+        ( ( uint32_t* ) self -> h . span ) [ 0 ] = bswap_32 ( self -> h . span [ 0 ] );
+        break;
+    case btypeMagnitude:
+        ( ( uint64_t* ) self -> h . first ) [ 0 ] = bswap_64 ( self -> h . first [ 0 ] );
+        break;
+    case btypePredictable:
+        * ( uint64_t* ) & ( self -> h . pred -> pg ) = bswap_64 ( self -> h . pred -> pg );
+        * ( uint32_t* ) & ( self -> h . pred -> sz ) = bswap_32 ( self -> h . pred -> sz );
+        break;
+    }
+
+    switch ( type )
+    {
+    case btypeRandom:
+    case btypeUniform:
+        for ( i = 0; i < count; ++ i )
+            ( ( uint64_t* ) self -> d ) [ i ] = bswap_64 ( self -> d [ i ] );
+        break;
+    }
+
+    switch ( type )
+    {
+    case btypeRandom:
+    case btypeMagnitude:
+        for ( i = 0; i < count; ++ i )
+            ( ( uint32_t* ) self -> s ) [ i ] = bswap_32 ( self -> s [ i ] );
+        break;
+    }
+}
+
+
+/*--------------------------------------------------------------------------
+ * KColIdxBlock
+ *  level 2 index reading block
+ *
+ *  each index block has two sections
+ */
+
+/* Find
+ */
+static
+int KColIdxBlockFind0 ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    int64_t id, int64_t *first, uint32_t *span )
+{
+    unsigned int left = 0;
+    unsigned int right = count;
+
+    do
+    {
+        unsigned int i = ( left + right ) >> 1;
+        int64_t start_id = ( int64_t ) self -> id . d [ i ];
+        if ( start_id == id )
+        {
+            * first = start_id;
+            * span = self -> id . s [ i ];
+            return ( int ) i;
+        }
+        if ( start_id > id )
+            right = i;
+        else
+        {
+            if ( start_id + self -> id . s [ i ] > id )
+            {
+                * span = self -> id . s [ i ];
+                * first = start_id;
+                return ( int ) i;
+            }
+
+            left = i + 1;
+        }
+    }
+    while ( left < right );
+
+    return -1;
+}
+
+static
+int KColIdxBlockFind1 ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    int64_t id, int64_t *first, uint32_t *span )
+{
+    unsigned int left = 0;
+    unsigned int right = count;
+    unsigned int range = self -> id . h . span [ 0 ];
+
+    do
+    {
+        unsigned int i = ( left + right ) >> 1;
+        int64_t start_id = ( int64_t ) self -> id . d [ i ];
+        if ( start_id == id )
+        {
+            * first = start_id;
+            * span = range;
+            return ( int ) i;
+        }
+        if ( start_id > id )
+            right = i;
+        else
+        {
+            if ( start_id + range > id )
+            {
+                * first = start_id;
+                * span = range;
+                return ( int ) i;
+            }
+
+            left = i + 1;
+        }
+    }
+    while ( left < right );
+
+    return -1;
+}
+
+static
+int KColIdxBlockFind2 ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    int64_t id, int64_t *first, uint32_t *span )
+{
+    /* special case for in-core image
+       the length of an entry is determined
+       by looking at the start of next entry
+       with the last entry having its length
+       stored in header */
+
+    unsigned int left, right;
+
+    /* examine last entry first, since it's the special case */
+    int64_t start_id = ( int64_t ) self -> id . d [ count - 1 ];
+    if ( start_id <= id )
+    {
+        if ( start_id == id ||
+             start_id + self -> id . h . span [ 0 ] > id )
+        {
+            * span = self -> id . h . span [ 0 ];
+            * first = start_id;
+            return ( int ) ( count - 1 );
+        }
+        return -1;
+    }
+
+    /* now perform normal binary search */
+    left = 0;
+    right = count - 1;
+    while ( left < right )
+    {
+        unsigned int i = ( left + right ) >> 1;
+        start_id = ( int64_t ) self -> id . d [ i ];
+        if ( start_id == id )
+        {
+            * first = start_id;
+            * span = ( uint32_t ) ( self -> id . d [ i + 1 ] - ( uint64_t ) start_id );
+            return ( int ) i;
+        }
+        if ( start_id > id )
+            right = i;
+        else
+        {
+            if ( self -> id . d [ i + 1 ] > (uint64_t)id )
+            {
+                * span = ( uint32_t ) ( self -> id . d [ i + 1 ] - ( uint64_t ) start_id );
+                * first = start_id;
+                return ( int ) i;
+            }
+
+            left = i + 1;
+        }
+    }
+
+    return -1;
+}
+
+static
+int KColIdxBlockFind3 ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    int64_t id, int64_t *first, uint32_t *span )
+{
+    int i;
+    unsigned int ids_per;
+
+    assert ( id >= bloc -> start_id );
+    assert ( id < bloc -> start_id + bloc -> id_range );
+    assert ( bloc -> id_range != 0 );
+
+    if ( bloc -> id_range == ( uint32_t ) count )
+    {
+        * first = id;
+        * span = 1;
+        return ( int ) ( id - bloc -> start_id );
+    }
+
+    assert ( count != 0 );
+    ids_per = bloc -> id_range / count;
+    assert ( ids_per * count == bloc -> id_range );
+
+    i = ( int ) ( ( id - bloc -> start_id ) / ids_per );
+    * first = bloc -> start_id + ( i * ids_per );
+    * span = ids_per;
+    return i;
+}
+
+static
+void KColIdxBlockGet0 ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    unsigned int idx, uint64_t *pg, uint32_t *sz )
+{
+    * pg = self -> pg . d [ idx ];
+    * sz = self -> pg . s [ idx ];
+}
+
+static
+void KColIdxBlockGet1 ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    unsigned int idx, uint64_t *pg, uint32_t *sz )
+{
+    * pg = self -> pg . d [ idx ];
+    * sz = self -> pg . h . span [ 0 ];
+}
+
+static
+void KColIdxBlockGet2 ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    unsigned int idx, uint64_t *pg, uint32_t *sz )
+{
+    if ( idx + 1 == count )
+    {
+        * pg = self -> pg . d [ idx ];
+        * sz = self -> pg . h . span [ 0 ];
+    }
+    else
+    {
+        * pg = self -> pg . d [ idx ];
+        * sz = ( uint32_t )
+            ( self -> pg . d [ idx + 1 ] - self -> pg . d [ idx ] );
+    }
+}
+
+static
+void KColIdxBlockGet3 ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    unsigned int idx, uint64_t *pg, uint32_t *sz )
+{
+    * sz = self -> pg . h . pred [ 0 ] . sz;
+    * pg = self -> pg . h . pred [ 0 ] . pg +
+        ( (uint64_t) self -> pg . h . pred [ 0 ] . sz * idx );
+}
+
+/* RewriteColumns
+ *  convert btypeMagnitude columns to id/pg
+ *  for best in-core representation
+ */
+static
+void KColIdxBlockRewriteColumns ( KColIdxBlock *self, size_t size,
+    char *block, size_t block_size, int count,
+    int id_ssz, int id_adj, int pg_ssz, int pg_adj )
+{
+    int i;
+    uint64_t *d;
+    uint32_t last;
+
+    /* the blob size array is last */
+    if ( pg_adj != 0 )
+    {
+        assert ( pg_ssz != 0 );
+
+        d = ( uint64_t* ) ( block + size - pg_ssz - pg_adj );
+
+        /* save the last entry in size array */
+        last = self -> pg . s [ count - 1 ];
+
+        /* transfer sizes, shifted down by 1 slot */
+        for ( i = count; -- i > 0; )
+            d [ i ] = self -> pg . s [ i - 1 ];
+
+        /* set slot zero to be first pg */
+        d [ 0 ] = self -> pg . h . first [ 0 ];
+
+        /* integrate sizes */
+        for ( i = 1; i < count; ++ i )
+            d [ i ] += d [ i - 1 ];
+
+        /* store last size in header */
+        self -> pg . h . last [ 0 ] = last;
+
+        /* update columns */
+        self -> pg . d = d;
+        self -> pg . s = ( const uint32_t* ) d;
+
+        /* now convert to id/pg values */
+    }
+    else if ( pg_ssz != 0 )
+    {
+        /* pg size array trails column needing expansion */
+        uint32_t *s = ( uint32_t* ) ( block + size - pg_ssz );
+        for ( i = count; -- i >= 0; )
+            s [ i ] = self -> pg . s [ i ];
+        
+        self -> pg . d = ( const uint64_t* ) s;
+        self -> pg . s = s;
+    }
+
+    /* the index range array is either last
+       or next to last before size array
+       which, if there, was already moved */
+    if ( id_adj != 0 )
+    {
+        assert ( id_ssz != 0 );
+
+        d = ( uint64_t* ) ( block + size - pg_ssz - pg_adj - id_ssz - id_adj );
+
+        /* save last as above */
+        last = self -> id . s [ count - 1 ];
+
+        /* transfer shifted */
+        for ( i = count; -- i > 0; )
+            d [ i ] = self -> id . s [ i - 1 ];
+
+        /* set slot zero to first id */
+        d [ 0 ] = self -> id . h . first [ 0 ];
+
+        /* integrate spans */
+        for ( i = 1; i < count; ++ i )
+            d [ i ] += d [ i - 1 ];
+
+        /* store last span in header */
+        self -> id . h . last [ 0 ] = last;
+
+        /* update columns */
+        self -> id . d = d;
+        self -> id . s = ( const uint32_t* ) d;
+    }
+}
+
+/* Init
+ */
+rc_t KColIdxBlockInit ( KColIdxBlock *self,
+    const KColBlockLoc *bloc, size_t orig,
+    const void *block, size_t block_size, bool bswap )
+{
+    int id_hsz, id_dsz, id_ssz, id_adj = 0;
+    int pg_hsz, pg_dsz, pg_ssz, pg_adj = 0;
+
+    int count = ( int ) orig;
+
+    switch ( bloc -> u . blk . id_type )
+    {
+    case btypeRandom:
+        self -> find = KColIdxBlockFind0;
+        id_hsz = 0;
+        id_dsz = 8;
+        id_ssz = 4;
+        break;
+    case btypeUniform:
+        self -> find = KColIdxBlockFind1;
+        id_hsz = 4;
+        id_dsz = 8;
+        id_ssz = 0;
+        break;
+    case btypeMagnitude:
+        self -> find = KColIdxBlockFind2;
+        id_hsz = 8;
+        id_dsz = 0;
+        id_ssz = 4;
+        id_adj = 4;
+        break;
+    case btypePredictable:
+    default: /* to quiet unused variable warnings */
+        self -> find = KColIdxBlockFind3;
+        id_hsz = 0;
+        id_dsz = 0;
+        id_ssz = 0;
+        break;
+    }
+
+    switch ( bloc -> u . blk . pg_type )
+    {
+    case btypeRandom:
+        self -> get = KColIdxBlockGet0;
+        pg_hsz = 0;
+        pg_dsz = 8;
+        pg_ssz = 4;
+
+        count -= id_hsz;
+        count /= id_dsz + id_ssz + 12;
+        break;
+
+    case btypeUniform:
+        self -> get = KColIdxBlockGet1;
+        pg_hsz = 4;
+        pg_dsz = 8;
+        pg_ssz = 0;
+
+        count -= id_hsz + 4;
+        count /= id_dsz + id_ssz + 8;
+        break;
+
+    case btypeMagnitude:
+        self -> get = KColIdxBlockGet2;
+        pg_hsz = 8;
+        pg_dsz = 0;
+        pg_ssz = 4;
+        pg_adj = 4;
+
+        count -= id_hsz + 8;
+        count /= id_dsz + id_ssz + 4;
+        break;
+
+    case btypePredictable:
+    default: /* to quiet unused variable warnings */
+        self -> get = KColIdxBlockGet3;
+        pg_hsz = 12;
+
+        if ( bloc -> u . blk . id_type == btypePredictable )
+        {
+            assert ( bloc -> u . blk . compressed == 0 );
+            count = ( int ) bloc -> u . blk . size;
+        }
+        else
+        {
+            assert ( id_dsz + id_ssz != 0 );
+
+            count -= id_hsz + pg_hsz;
+            count /= id_dsz + id_ssz;
+        }
+
+        pg_dsz = 0;
+        pg_ssz = 0;
+        break;
+    }
+
+    id_dsz *= count;
+    id_ssz *= count;
+    id_adj *= count;
+    pg_dsz *= count;
+    pg_ssz *= count;
+    pg_adj *= count;
+
+    /* TBD - check the optimized output on this...
+       some compilers aren't smart enough to recognize
+       that union members are not independent objects */
+    self -> id . h . p = block;
+    self -> pg . h . c = ( const char* ) block + id_hsz;
+/*  self -> pg . h . c = self -> id . h . c + id_hsz; */
+    self -> id . d = ( const uint64_t* )
+        ( self -> pg . h . c + pg_hsz );
+    self -> pg . d = ( const uint64_t* )
+        ( ( const char* ) self -> id . d + id_dsz );
+    self -> id . s = ( const uint32_t * )
+        ( ( const char* ) self -> pg . d + pg_dsz );
+    self -> pg . s = ( const uint32_t * )
+        ( ( const char* ) self -> id . s + id_ssz );
+
+    /* sanity check against block size */
+    if ( ( const char* ) block + orig != ( const char* ) self -> pg . s + pg_ssz )
+        return RC ( rcDB, rcIndex, rcReading, rcData, rcCorrupt );
+
+    /* byte-swap contents if needed */
+    if ( bswap )
+    {
+        KColConstBlockMapSwap ( & self -> id, count, bloc -> u . blk . id_type );
+        if ( self -> pg . h . p != self -> id . h . p )
+            KColConstBlockMapSwap ( & self -> pg, count, bloc -> u . blk . pg_type );
+    }
+
+    /* check for need to rewrite columns */
+    if ( id_adj + pg_adj != 0 )
+    {
+        size_t size = id_hsz + pg_hsz +
+            id_dsz + id_ssz + id_adj +
+            pg_dsz + pg_ssz + pg_adj;
+        
+        if ( size > block_size )
+            return RC ( rcDB, rcIndex, rcReading, rcBuffer, rcInsufficient );
+
+        assert ( id_adj == 0 || id_dsz == 0 );
+        assert ( pg_adj == 0 || pg_dsz == 0 );
+
+        KColIdxBlockRewriteColumns ( self, size,
+            ( char* ) block, block_size, count,
+            id_ssz, id_adj, pg_ssz, pg_adj );
+    }
+
+    return 0;
+}
+
+/* Find
+ *  find zero-based index of entry into block
+ *  that satisfies request
+ *  returns -1 if not found
+ */
+#ifndef KColIdxBlockFind
+LIB_EXPORT int CC KColIdxBlockFind ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    int64_t id, int64_t *first, uint32_t *span )
+{
+    ( * self -> find ) ( self, bloc, count, id, first, span );
+}
+#endif
+
+/* Get
+ *  get blob location information
+ */
+#ifndef KColIdxBlockGet
+LIB_EXPORT void CC KColIdxBlockGet ( const KColIdxBlock *self,
+    const KColBlockLoc *bloc, uint32_t count,
+    unsigned int idx, uint64_t *pg, uint32_t *sz )
+{
+    ( * self -> get ) ( self, bloc, count, idx, pg, sz );
+}
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KColBlockLoc
+ */
+
+/* EntryCount
+ *  returns the number of entries within a block
+ *  uses the original size of the uncompressed block
+ */
+uint32_t KColBlockLocEntryCount ( const KColBlockLoc *self, size_t *orig )
+{
+    uint32_t count;
+
+    /* when everything is predictable, the
+       block size is 12 while the entry count
+       is contained in self -> size */
+    if ( self -> u . blk . id_type == btypePredictable &&
+         self -> u . blk . pg_type == btypePredictable )
+    {
+        count = self -> u . blk . size;
+        * orig = 12;
+    }
+    else
+    {
+        int id_hsz, id_dsz, id_ssz;
+        int pg_hsz, pg_dsz, pg_ssz;
+
+        count = ( uint32_t ) * orig;
+
+        switch ( self -> u . blk . id_type )
+        {
+        case btypeRandom:
+            id_hsz = 0;
+            id_dsz = 8;
+            id_ssz = 4;
+            break;
+        case btypeUniform:
+            id_hsz = 4;
+            id_dsz = 8;
+            id_ssz = 0;
+            break;
+        case btypeMagnitude:
+            id_hsz = 8;
+            id_dsz = 0;
+            id_ssz = 4;
+            break;
+        case btypePredictable:
+        default: /* to quiet unused variable warnings */
+            id_hsz = 0;
+            id_dsz = 0;
+            id_ssz = 0;
+            break;
+        }
+
+        switch ( self -> u . blk . pg_type )
+        {
+        case btypeRandom:
+            pg_hsz = 0;
+            pg_dsz = 8;
+            pg_ssz = 4;
+            break;
+        case btypeUniform:
+            pg_hsz = 4;
+            pg_dsz = 8;
+            pg_ssz = 0;
+            break;
+        case btypeMagnitude:
+            pg_hsz = 8;
+            pg_dsz = 0;
+            pg_ssz = 4;
+            break;
+        case btypePredictable:
+        default: /* to quiet unused variable warnings */
+            pg_hsz = 12;
+            pg_dsz = 0;
+            pg_ssz = 0;
+            break;
+        }
+
+        assert ( id_dsz + id_ssz + pg_dsz + pg_ssz != 0 );
+
+        /* decompose size into number of entries */
+        count -= id_hsz + pg_hsz;
+        count /= id_dsz + id_ssz + pg_dsz + pg_ssz;
+    }
+
+    return count;
+}
+
+/* AllocSize
+ *  returns a size for the block
+ *  since a type 3 index ( range/size only ) is nice for storage
+ *  but needs to be converted to id/pos for in-memory lookup
+ */
+size_t KColBlockLocAllocSize ( const KColBlockLoc *self,
+    size_t orig, uint32_t count )
+{
+    size_t size;
+
+    /* when everything is predictable, the
+       pg information is stored within BlocLoc */
+    if ( self -> u . blk . id_type == btypePredictable &&
+         self -> u . blk . pg_type == btypePredictable )
+        size = 12;
+    else
+    {
+        /* there is something within the idx2 block */
+        size = 0;
+
+        /* if either index or page loc are magnitude only,
+           they'll need to be converted to id/pg when resident */
+        if ( self -> u . blk . id_type == btypeMagnitude )
+            size += 4;
+        if ( self -> u . blk . pg_type == btypeMagnitude )
+            size += 4;
+
+        /* if neither are magnitude only,
+           keep the original size */
+        if ( size == 0 )
+            size = orig;
+        else
+        {
+            /* otherwise, convert the single entry
+               size adjustment to whole block adjustment */
+            size *= count;
+
+            /* add this to the original size */
+            size += orig;
+        }
+    }
+
+    return size;
+}
diff --git a/libs/kdb/index-cmn.h b/libs/kdb/index-cmn.h
new file mode 100644
index 0000000..ff2dc6f
--- /dev/null
+++ b/libs/kdb/index-cmn.h
@@ -0,0 +1,286 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_index_cmn_
+#define _h_index_cmn_
+
+#ifndef _h_kdbfmt_priv_
+#include "kdbfmt-priv.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define KDBINDEXVERS 4
+#define V2FIND_RETURNS_SPAN 1
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KMMap;
+struct PTrie;
+struct BSTNode;
+struct PBSTNode;
+struct KIndex;
+
+
+
+/*--------------------------------------------------------------------------
+ * KIndexFileHeader
+ */
+
+/* v1, v2
+ *  just normal simple kdb header
+ */
+typedef struct KDBHdr KIndexFileHeader_v1, KIndexFileHeader_v2, KIndexFileHeader_v1_v2;
+
+/* v3, v4
+ *  indicates type
+ */
+typedef struct KIndexFileHeader_v3 KIndexFileHeader_v3, KIndexFileHeader_v4, KIndexFileHeader_v3_v4;
+struct KIndexFileHeader_v3
+{
+    KIndexFileHeader_v1_v2 h;
+    uint32_t index_type;
+    uint32_t reserved1;
+};
+
+
+/*--------------------------------------------------------------------------
+ * V1
+ *  version 1 of the trie index was hard-coded to enforce uniqueness of
+ *  both the string, and a 32-bit id. furthermore, the id was unfortunately
+ *  assumed to occupy a mostly contiguous space, such that the projection
+ *  was always implemented as an array of ptrie node ids where the id was
+ *  used to index the array.
+ *
+ *  the introduction of highly sparse ids led to deprecation of this
+ *  implementation. see version 2 for further information.
+ */
+
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndex_v1
+ *  persisted keymap
+ */
+typedef struct KPTrieIndex_v1 KPTrieIndex_v1;
+struct KPTrieIndex_v1
+{
+    struct KMMap const *mm;
+    struct PTrie *key2id;
+    const uint32_t *id2node;
+    uint32_t first;
+    uint32_t last;
+    bool byteswap;
+};
+
+/* initialize an index from file */
+rc_t KPTrieIndexInit_v1 ( KPTrieIndex_v1 *self, struct KMMap const *mm, bool byteswap );
+
+/* whackitywhack */
+void KPTrieIndexWhack_v1 ( KPTrieIndex_v1 *self );
+
+/* consistency check */
+rc_t KPTrieIndexCheckConsistency_v1 ( const KPTrieIndex_v1 *self,
+    int64_t *start_id, uint64_t *id_range, uint64_t *num_keys,
+    uint64_t *num_rows, uint64_t *num_holes,
+    struct KIndex const *outer, bool key2id, bool id2key );
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIndex_v1
+ */
+typedef struct KTrieIndex_v1 KTrieIndex_v1;
+
+/* initialize an index from file - can be NULL */
+rc_t KTrieIndexOpen_v1 ( KTrieIndex_v1 *self, struct KMMap const *mm, bool byteswap );
+
+/* whack whack */
+void KTrieIndexWhack_v1 ( KTrieIndex_v1 *self );
+
+/* map key to id ( was Key2Id ) */
+rc_t KTrieIndexFind_v1 ( const KTrieIndex_v1 *self,
+    const char *key, uint32_t *id,
+    int ( CC * custom_cmp ) ( const void *item, struct PBSTNode const *n, void *data ),
+    void *data );
+
+/* projection index id to key-string ( was Id2Key ) */
+rc_t KTrieIndexProject_v1 ( const KTrieIndex_v1 *self,
+    uint32_t id, char *key_buff, size_t buff_size, size_t *actsize );
+
+/* consistency check */
+rc_t KTrieIndexCheckConsistency_v1 ( const KTrieIndex_v1 *self,
+    int64_t *start_id, uint64_t *id_range, uint64_t *num_keys,
+    uint64_t *num_rows, uint64_t *num_holes,
+    struct KIndex const *outer, bool key2id, bool id2key );
+
+
+/*--------------------------------------------------------------------------
+ * V2
+ *  version 2 of the trie index was introduced to handle sparse ids,
+ *  and to recognize that ids may be 64 bits and/or negative.
+ *
+ *  v2 introduces strategy identifiers to handle various cases.
+ *
+ *  CONSTRAINTS
+ *  - both key and id are unique ( version 1 )
+ *  - key is not unique, but must map to a contiguous range of ids,
+ *    while ids are unique ( the main use case for SRA )
+ *
+ *  INSERTION
+ *  - ids are observed in increasing order
+ *
+ *  PROJECTION
+ *  - id range is contiguous or nearly so ( can use single array )
+ *  - id range is sparse
+ *
+ *  the implementation may be extended by adding new strategies,
+ *  but the moment the implementation supports 1 to many mappings,
+ *  inserted with ids in increasing order, and an unique constraint
+ *  on the ids themselves.
+ *
+ *  the general case for v2 is "key -> id range", where "id range -> key"
+ *  is via contiguous array if avg ( id range ) <= 2, and via sparse
+ *  array otherwise.
+ *
+ *  for the key -> id mappings, this means that the in-core node
+ *  either retains an id range ( when not using a projection index ),
+ *  or it retains a start-id only, since its range can be determined
+ *  from the projection index.
+ *
+ *  for id -> key mappings, the id is first converted to an ordinal, and
+ *  the ordinal to a node. when ids are contiguous, id -> ordinal is simply
+ *  derived by subtracting the initial start id. when sparse, an id -> ord
+ *  array is used in a binary search to produce the ordinal.
+ *
+ *  ids are assumed to be 64 bit, stored as id - start id, and packed to
+ *  a minimum number of bits to represent the id. ptrie node ids are still
+ *  32-bit entities.
+ */
+
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndex_v2
+ *  persisted keymap
+ */
+typedef struct KPTrieIndex_v2 KPTrieIndex_v2;
+struct KPTrieIndex_v2
+{
+    int64_t first, last, maxid;
+    struct KMMap const *mm;
+    struct PTrie *key2id;
+    const uint32_t *ord2node;
+    union
+    {
+        const uint8_t *v8;
+        const uint16_t *v16;
+        const uint32_t *v32;
+        const int64_t *v64;
+    } id2ord;
+    uint32_t count;
+    uint8_t variant;
+    uint8_t id_bits;
+    uint8_t span_bits;
+    uint8_t byteswap;
+};
+
+
+/* initialize an index from file */
+rc_t KPTrieIndexInit_v2 ( KPTrieIndex_v2 *self, struct KMMap const *mm, bool byteswap );
+rc_t KPTrieIndexInit_v3_v4 ( KPTrieIndex_v2 *self, struct KMMap const *mm, bool byteswap, bool ptorig );
+
+/* whackitywhack */
+void KPTrieIndexWhack_v2 ( KPTrieIndex_v2 *self );
+
+/* map a row id to ord */
+uint32_t KPTrieIndexID2Ord_v2 ( const KPTrieIndex_v2 *self, int64_t id );
+
+/* consistency check */
+rc_t KPTrieIndexCheckConsistency_v2 ( const KPTrieIndex_v2 *self,
+    int64_t *start_id, uint64_t *id_range, uint64_t *num_keys,
+    uint64_t *num_rows, uint64_t *num_holes,
+    struct KIndex const *outer, bool key2id, bool id2key, bool all_ids, bool convertFromV1 );
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIndex_v2
+ */
+typedef struct KTrieIndex_v2 KTrieIndex_v2;
+
+/* initialize an index from file */
+rc_t KTrieIndexOpen_v2 ( KTrieIndex_v2 *self, struct KMMap const *mm, bool byteswap );
+
+/* whack whack */
+void KTrieIndexWhack_v2 ( KTrieIndex_v2 *self );
+
+/* map key to id range */
+rc_t KTrieIndexFind_v2 ( const KTrieIndex_v2 *self,
+    const char *key, int64_t *start_id,
+#if V2FIND_RETURNS_SPAN
+    uint32_t *span,
+#endif
+    int ( CC * custom_cmp ) ( const void *item, struct PBSTNode const *n, void *data ),
+    void * data,
+    bool convertFromV1);
+
+/* projection index id to key-string */
+#if V2FIND_RETURNS_SPAN
+rc_t KTrieIndexProject_v2 ( const KTrieIndex_v2 *self,
+    int64_t id, int64_t *start_id, uint32_t *span,
+    char *key_buff, size_t buff_size, size_t *actsize );
+#else
+rc_t KTrieIndexProject_v2 ( const KTrieIndex_v2 *self,
+    int64_t id, char *key_buff, size_t buff_size, size_t *actsize );
+#endif
+
+/* consistency check */
+rc_t KTrieIndexCheckConsistency_v2 ( const KTrieIndex_v2 *self,
+    int64_t *start_id, uint64_t *id_range, uint64_t *num_keys,
+    uint64_t *num_rows, uint64_t *num_holes,
+    struct KIndex const *outer, bool key2id, bool id2key, bool all_ids, bool convertFromV1 );
+
+
+/*--------------------------------------------------------------------------
+ * KU64Index_v3
+ */
+typedef struct KU64Index_v3 KU64Index_v3;
+
+rc_t KU64IndexOpen_v3 ( KU64Index_v3 *self, struct KMMap const *mm, bool byteswap );
+rc_t KU64IndexWhack_v3 ( KU64Index_v3 *self );
+
+rc_t KU64IndexFind_v3 ( const KU64Index_v3 *self, uint64_t offset,
+    uint64_t *key, uint64_t *key_size, int64_t *id, uint64_t *id_qty );
+
+rc_t KU64IndexFindAll_v3 ( const KU64Index_v3 *self, uint64_t offset, 
+    rc_t ( CC * f ) ( uint64_t key, uint64_t key_size, int64_t id, uint64_t id_qty, void* data ),
+    void* data );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_index_priv_ */
diff --git a/libs/kdb/index-priv.h b/libs/kdb/index-priv.h
new file mode 100644
index 0000000..41e2505
--- /dev/null
+++ b/libs/kdb/index-priv.h
@@ -0,0 +1,134 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_index_priv_
+#define _h_index_priv_
+
+#ifndef _h_index_cmn_
+#include "index-cmn.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KMMap;
+struct PBSTree;
+
+
+/*--------------------------------------------------------------------------
+ * V1
+ *  version 1 of the trie index was hard-coded to enforce uniqueness of
+ *  both the string, and a 32-bit id. furthermore, the id was unfortunately
+ *  assumed to occupy a mostly contiguous space, such that the projection
+ *  was always implemented as an array of ptrie node ids where the id was
+ *  used to index the array.
+ *
+ *  the introduction of highly sparse ids led to deprecation of this
+ *  implementation. see version 2 for further information.
+ */
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIndex_v1
+ */
+struct KTrieIndex_v1
+{
+    KPTrieIndex_v1 pt;
+};
+
+
+/*--------------------------------------------------------------------------
+ * V2
+ *  version 2 of the trie index was introduced to handle sparse ids,
+ *  and to recognize that ids may be 64 bits and/or negative.
+ *
+ *  v2 introduces strategy identifiers to handle various cases.
+ *
+ *  CONSTRAINTS
+ *  - both key and id are unique ( version 1 )
+ *  - key is not unique, but must map to a contiguous range of ids,
+ *    while ids are unique ( the main use case for SRA )
+ *
+ *  INSERTION
+ *  - ids are observed in increasing order
+ *
+ *  PROJECTION
+ *  - id range is contiguous or nearly so ( can use single array )
+ *  - id range is sparse
+ *
+ *  the implementation may be extended by adding new strategies,
+ *  but the moment the implementation supports 1 to many mappings,
+ *  inserted with ids in increasing order, and an unique constraint
+ *  on the ids themselves.
+ *
+ *  the general case for v2 is "key -> id range", where "id range -> key"
+ *  is via contiguous array if avg ( id range ) <= 2, and via sparse
+ *  array otherwise.
+ *
+ *  for the key -> id mappings, this means that the in-core node
+ *  either retains an id range ( when not using a projection index ),
+ *  or it retains a start-id only, since its range can be determined
+ *  from the projection index.
+ *
+ *  for id -> key mappings, the id is first converted to an ordinal, and
+ *  the ordinal to a node. when ids are contiguous, id -> ordinal is simply
+ *  derived by subtracting the initial start id. when sparse, an id -> ord
+ *  array is used in a binary search to produce the ordinal.
+ *
+ *  ids are assumed to be 64 bit, stored as id - start id, and packed to
+ *  a minimum number of bits to represent the id. ptrie node ids are still
+ *  32-bit entities.
+ */
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIndex_v2
+ */
+struct KTrieIndex_v2
+{
+    KPTrieIndex_v2 pt;
+};
+
+
+/*--------------------------------------------------------------------------
+ * KU64Index_v3
+ */
+struct KU64Index_v3
+{
+    struct PBSTree *tree;
+    struct KMMap const *mm;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_index_priv_ */
diff --git a/libs/kdb/index.c b/libs/kdb/index.c
new file mode 100644
index 0000000..1ceedc0
--- /dev/null
+++ b/libs/kdb/index.c
@@ -0,0 +1,1006 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#define KONST const
+#include "index-priv.h"
+#include "dbmgr-priv.h"
+#include "database-priv.h"
+#include "table-priv.h"
+#include "kdb-priv.h"
+#undef KONST
+
+#include <kdb/index.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <byteswap.h>
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * KIndex
+ *  an object capable of mapping an object to integer oid
+ */
+struct KIndex
+{
+    const KDBManager *mgr;
+    const KDatabase *db;
+    const KTable *tbl;
+    KRefcount refcount;
+    uint32_t vers;
+    union
+    {
+        KTrieIndex_v1 txt1;
+        KTrieIndex_v2 txt234;
+        KU64Index_v3  u64_3;
+    } u;
+    bool converted_from_v1;
+    uint8_t type;
+    char path [ 1 ];
+};
+
+
+/* Whack
+ */
+static
+rc_t KIndexWhack ( KIndex *self )
+{
+    rc_t rc = 0;
+
+    KRefcountWhack ( & self -> refcount, "KIndex" );
+
+    /* release owner */
+    if ( self -> db != NULL )
+    {
+        rc = KDatabaseSever ( self -> db );
+        if ( rc == 0 )
+            self -> db = NULL;
+    }
+    else if ( self -> tbl != NULL )
+    {
+        rc = KTableSever ( self -> tbl );
+        if ( rc == 0 )
+            self -> tbl = NULL;
+    }
+
+    /* remove from mgr */
+    if ( rc == 0 )
+        rc = KDBManagerSever ( self -> mgr );
+    if ( rc == 0 )
+    {
+        self -> mgr = NULL;
+
+        /* complete */
+        rc = SILENT_RC ( rcDB, rcIndex, rcDestroying, rcIndex, rcBadVersion );
+
+        switch ( self -> type )
+        {
+        case kitText:
+        case kitText | kitProj:
+            switch ( self -> vers )
+            {
+            case 1:
+                KTrieIndexWhack_v1 ( & self -> u . txt1 );
+                rc = 0;
+                break;
+            case 2:
+            case 3:
+            case 4:
+                KTrieIndexWhack_v2 ( & self -> u . txt234 );
+                rc = 0;
+                break;
+            }
+            break;
+
+        case kitU64:
+            switch ( self -> vers )
+            {
+            case 3:
+            case 4:
+                rc = KU64IndexWhack_v3 ( & self -> u . u64_3 );
+                break;
+            }
+            break;
+
+        }
+
+        if ( rc == 0 )
+        {
+            free ( self );
+            return 0;
+        }
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "KIndex", "whack", "kidx" );
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KIndexAddRef ( const KIndex *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KIndex" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcIndex, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KIndexRelease ( const KIndex *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KIndex" ) )
+        {
+        case krefWhack:
+            return KIndexWhack ( ( KIndex* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcIndex, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make
+ */
+static
+rc_t KIndexMake ( KIndex **idxp, const char *path )
+{
+    rc_t rc;
+
+    if ( idxp == NULL )
+        rc = RC ( rcDB, rcIndex, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( path == NULL )
+            rc = RC ( rcDB, rcIndex, rcCreating, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcDB, rcIndex, rcCreating, rcPath, rcEmpty );
+        else
+        {
+            KIndex* idx = malloc ( sizeof *idx + strlen ( path ) );
+            if ( idx == NULL )
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                memset ( idx, 0, sizeof * idx );
+                KRefcountInit ( & idx -> refcount, 1, "KIndex", "make", path );
+                strcpy ( idx -> path, path );
+                * idxp = idx;
+                return 0;
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t KIndexAttach ( KIndex *self, const KMMap *mm, bool *byteswap )
+{
+    size_t size;
+    rc_t rc = KMMapSize ( mm, & size );
+    if ( rc == 0 )
+    {
+        const void *addr;
+        rc = KMMapAddrRead ( mm, & addr );
+        if ( rc == 0 )
+        {
+            union
+            {
+                KIndexFileHeader_v1 v1;
+                KIndexFileHeader_v2 v2;
+                KIndexFileHeader_v3 v3;
+            } hdrs;
+
+            const KDBHdr *hdr = addr;
+            const KIndexFileHeader_v3 *fh = addr;
+
+            * byteswap = false;
+            rc = KDBHdrValidate ( hdr, size, 1, KDBINDEXVERS );
+            if ( GetRCState ( rc ) == rcIncorrect && GetRCObject ( rc ) == rcByteOrder )
+            {
+                hdrs . v1 . endian = bswap_32 ( hdr -> endian );
+                hdrs . v1 . version = bswap_32 ( hdr -> version );
+                rc = KDBHdrValidate ( & hdrs . v1, size, 1, KDBINDEXVERS );
+                if ( rc == 0 )
+                {
+                    * byteswap = true;
+                    switch ( hdrs . v1 . version )
+                    {
+                    case 1:
+                        hdr = & hdrs . v1;
+                        break;
+                    case 2:
+                        hdr = & hdrs . v2;
+                        break;
+                    case 3:
+                    case 4:
+                        hdrs . v3 . index_type = bswap_32 ( fh -> index_type );
+                        hdrs . v3 . reserved1 = bswap_32 ( fh -> reserved1 );
+                        hdr = & hdrs . v3 . h;
+                        fh = & hdrs . v3;
+                        break;
+                    }
+                }
+            }
+            if ( rc == 0 )
+            {
+                self -> vers = hdr -> version;
+                switch ( hdr -> version )
+                {
+                case 1:
+#if KDBINDEXVERS != 1
+                    self -> converted_from_v1 = true;
+#endif
+                case 2:
+                    self -> type = kitText;
+                    break;
+                case 3:
+                case 4:
+                {
+                    self -> type = fh -> index_type;
+                    switch ( self -> type )
+                    {
+                    case kitText:
+                    case kitU64:
+                        break;
+                    default:
+                        rc = RC(rcDB, rcIndex, rcConstructing, rcIndex, rcUnrecognized);
+                    }
+                    break;
+                }
+                default:
+                    rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcBadVersion );
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+static
+rc_t KIndexMakeRead ( KIndex **idxp,
+    const KDirectory *dir, const char *path )
+{
+    const KFile *f;
+    rc_t rc = KDirectoryOpenFileRead ( dir, & f, "%s", path );
+    if ( rc == 0 )
+    {
+        const KMMap *mm;
+        rc = KMMapMakeRead ( & mm, f );
+        if ( rc == 0 )
+        {
+            rc = KIndexMake ( idxp, path );
+            if ( rc == 0 )
+            {
+                bool byteswap;
+                KIndex *idx = * idxp;
+                rc = KIndexAttach ( idx, mm, & byteswap );
+                if ( rc == 0 )
+                {
+                    rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcBadVersion );
+
+                    switch ( idx -> vers )
+                    {
+                    case 1:
+                        /* open using v1 code only if KDBINDEXVERS is 1
+                           if 2 or later, open as a v2 index */
+#if KDBINDEXVERS == 1
+                        rc = KTrieIndexOpen_v1 ( & idx -> u . txt1, mm );
+                        if ( rc == 0 )
+                        {
+                            if ( idx -> u . txt1 . pt . id2node != NULL )
+                                idx -> type = ( uint8_t ) ( kitText | kitProj );
+                            else
+                                idx -> type = ( uint8_t ) kitText;
+                        }
+                        break;
+#else
+                    case 2:
+                        idx -> vers = 3;
+                    case 3:
+                    case 4:
+                        switch ( idx -> type )
+                        {
+                            case kitText:
+                            case kitText | kitProj:
+                                /* will guess version in open */
+                                rc = KTrieIndexOpen_v2 ( & idx -> u . txt234, mm, byteswap );
+                                if( rc == 0 && idx -> u . txt234 . pt . ord2node != NULL )
+                                    idx -> type |= kitProj;
+                                break;
+
+                            case kitU64:
+                                rc = KU64IndexOpen_v3 ( & idx -> u . u64_3, mm, byteswap );
+                                break;
+                        }
+                        break;
+#endif
+                    }
+                }
+
+                if ( rc != 0 )
+                    KIndexWhack ( idx );
+            }
+
+            KMMapRelease ( mm );
+        }
+
+        KFileRelease ( f );
+    }
+    return rc;
+}
+
+
+/* OpenIndexRead
+ * VOpenIndexRead
+ *  open an index for read
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+static
+rc_t KDBManagerOpenIndexReadInt ( const KDBManager *self,
+    KIndex **idxp, const KDirectory *wd, const char *path )
+{
+    char idxpath [ 4096 ];
+    rc_t rc = KDirectoryResolvePath ( wd, true,
+                                      idxpath, sizeof idxpath, "%s", path );
+    if ( rc == 0 )
+    {
+        KIndex *idx;
+
+        switch ( KDirectoryPathType ( wd, "%s", idxpath ) )
+        {
+        case kptNotFound:
+            return RC ( rcDB, rcMgr, rcOpening, rcIndex, rcNotFound );
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcInvalid );
+        case kptFile:
+        case kptFile | kptAlias:
+            break;
+        default:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcIncorrect );
+        }
+
+        rc = KIndexMakeRead ( & idx, wd, idxpath );
+        if ( rc == 0 )
+        {
+            idx -> mgr = KDBManagerAttach ( self );
+            * idxp = idx;
+            return 0;
+        }
+    }
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenIndexRead ( struct KDatabase const *self,
+    const KIndex **idx, const char *name, ... )
+{
+    rc_t rc = 0;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVOpenIndexRead ( self, idx, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVOpenIndexRead ( const KDatabase *self,
+    const KIndex **idxp, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    char path [ 256 ];
+
+    if ( idxp == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * idxp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "idx", 3, name, args );
+    if ( rc == 0 )
+    {
+        KIndex *idx;
+        rc = KDBManagerOpenIndexReadInt ( self -> mgr,
+            & idx, self -> dir, path );
+        if ( rc == 0 )
+        {
+            idx -> db = KDatabaseAttach ( self );
+            * idxp = idx;
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableOpenIndexRead ( struct KTable const *self,
+    const KIndex **idx, const char *name, ... )
+{
+    rc_t rc = 0;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KTableVOpenIndexRead ( self, idx, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableVOpenIndexRead ( const KTable *self,
+    const KIndex **idxp, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    char path [ 256 ];
+
+    if ( idxp == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcParam, rcNull );
+
+    * idxp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcSelf, rcNull );
+
+    if ( self -> prerelease )
+    {
+        int len;
+        if ( args == 0 )
+            len = snprintf ( path, sizeof path, "%s", name );
+        else
+            len = vsnprintf ( path, sizeof path, name, args );
+        if ( len < 0 || ( size_t ) len >= sizeof path )
+            return RC ( rcDB, rcTable, rcOpening, rcPath, rcExcessive );
+        rc = 0;
+    }
+    else
+    {
+        rc = KDBVMakeSubPath ( self -> dir,
+            path, sizeof path, "idx", 3, name, args );
+    }
+
+    if ( rc == 0 )
+    {
+        KIndex *idx;
+        rc = KDBManagerOpenIndexReadInt ( self -> mgr,
+            & idx, self -> dir, path );
+        if ( rc == 0 )
+        {
+            idx -> tbl = KTableAttach ( self );
+            * idxp = idx;
+        }
+    }
+    return rc;
+}
+
+
+/* Locked
+ *  returns non-zero if locked
+ */
+LIB_EXPORT bool CC KIndexLocked ( const KIndex *self )
+{
+    rc_t rc;
+    const KDirectory *dir;
+
+    if ( self == NULL )
+        return false;
+
+    assert ( self -> db != NULL || self -> tbl != NULL );
+    dir = ( self -> db != NULL ) ?
+        self -> db -> dir : self -> tbl -> dir;
+
+    rc = KDBWritable ( dir, self -> path );
+    return GetRCState ( rc ) == rcLocked;
+}
+
+
+/* Version
+ *  returns the format version
+ */
+LIB_EXPORT rc_t CC KIndexVersion ( const KIndex *self, uint32_t *version )
+{
+    if ( version == NULL )
+        return RC ( rcDB, rcIndex, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * version = 0;
+        return RC ( rcDB, rcIndex, rcAccessing, rcSelf, rcNull );
+    }
+    
+    * version = self -> vers;
+    return 0;
+}
+
+
+/* Type
+ *  returns the type of index
+ */
+LIB_EXPORT rc_t CC KIndexType ( const KIndex *self, KIdxType *type )
+{
+    if ( type == NULL )
+        return RC ( rcDB, rcIndex, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * type = ( KIdxType ) 0;
+        return RC ( rcDB, rcIndex, rcAccessing, rcSelf, rcNull );
+    }
+
+    * type = ( KIdxType ) self -> type;
+    return 0;
+}
+
+
+/* CheckConsistency
+ *  run a consistency check on the open index
+ *
+ *  "level" [ IN ] - a measure of rigor of the exercise:
+ *    0 is the lightest
+ *    1 will test all id mappings
+ *    2 will perform key->id retrievals
+ *    3 will perform id->key retrievals if a projection index exists
+ *
+ *  "start_id" [ OUT, NULL OKAY ] - returns the first id in index
+ *
+ *  "id_range" [ OUT, NULL OKAY ] - returns the range of ids from first to last
+ *
+ *  "num_keys" [ OUT, NULL OKAY ] - returns the number of key entries
+ *
+ *  "num_rows" [ OUT, NULL OKAY ] - returns the number of key->id mappings
+ *
+ *  "num_holes" [ OUT, NULL OKAY ] - returns the number of holes in the mapped id range
+ */
+LIB_EXPORT rc_t CC KIndexConsistencyCheck ( const KIndex *self, uint32_t level,
+    int64_t *start_id, uint64_t *id_range, uint64_t *num_keys,
+    uint64_t *num_rows, uint64_t *num_holes )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcDB, rcIndex, rcValidating, rcSelf, rcNull );
+    else
+    {
+        bool key2id, id2key, all_ids;
+        switch ( level )
+        {
+        case 0:
+            key2id = id2key = all_ids = false;
+            break;
+        case 1:
+            key2id = id2key = false;
+            all_ids = true;
+            break;
+        case 2:
+            key2id = id2key = true;
+            all_ids = false;
+            break;
+        default:
+            key2id = id2key = all_ids = true;
+        }
+
+        switch ( self -> type )
+        {
+        case kitText:
+            id2key = false;
+        case kitText | kitProj:
+            switch ( self -> vers )
+            {
+            case 1:
+                rc = KTrieIndexCheckConsistency_v1 ( & self -> u . txt1,
+                    start_id, id_range, num_keys, num_rows, num_holes,
+                    self, key2id, id2key );
+                break;
+            case 2:
+            case 3:
+            case 4:
+                rc = KTrieIndexCheckConsistency_v2 ( & self -> u . txt234,
+                    start_id, id_range, num_keys, num_rows, num_holes,
+                    self, key2id, id2key, all_ids, self -> converted_from_v1 );
+                break;
+            default:
+                return RC ( rcDB, rcIndex, rcValidating, rcIndex, rcBadVersion );
+            }
+            break;
+
+        default:
+            rc = RC ( rcDB, rcIndex, rcValidating, rcFunction, rcUnsupported );
+        }
+    }
+
+    return rc;
+}
+
+
+/* Find
+ *  finds a single mapping from key
+ */
+LIB_EXPORT rc_t CC KIndexFindText ( const KIndex *self, const char *key, int64_t *start_id, uint64_t *id_count,
+    int ( CC * custom_cmp ) ( const void *item, struct PBSTNode const *n, void *data ),
+    void *data )
+{
+    rc_t rc = 0;
+    uint32_t id32, span;
+
+    if ( id_count != NULL )
+        * id_count = 0;
+
+    if ( start_id == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcParam, rcNull );
+
+    * start_id = 0;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcSelf, rcNull );
+
+    if ( key == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcString, rcNull );
+    if ( key [ 0 ] == 0 )
+        return RC ( rcDB, rcIndex, rcSelecting, rcString, rcEmpty );
+
+    span = 1;
+
+    switch ( self -> type )
+    {
+    case kitText:
+    case kitText | kitProj:
+        switch ( self -> vers )
+        {
+        case 1:
+            rc = KTrieIndexFind_v1 ( & self -> u . txt1, key, & id32, custom_cmp, data );
+            if ( rc == 0 )
+                * start_id = id32;
+            break;
+        case 2:
+        case 3:
+        case 4:
+#if V2FIND_RETURNS_SPAN
+            rc = KTrieIndexFind_v2 ( & self -> u . txt234, key, start_id, & span, custom_cmp, data, self -> converted_from_v1 );
+#else
+            rc = KTrieIndexFind_v2 ( & self -> u . txt234, key, start_id, custom_cmp, data, self -> converted_from_v1 );
+#endif
+            break;
+        default:
+            return RC ( rcDB, rcIndex, rcSelecting, rcIndex, rcBadVersion );
+        }
+        break;
+    default:
+        return RC ( rcDB, rcIndex, rcSelecting, rcNoObj, rcUnknown );
+    }
+
+    if ( id_count != NULL )
+        * id_count = span;
+    
+    return rc;
+}
+
+
+/* FindAll
+ *  finds all mappings from key
+ */
+LIB_EXPORT rc_t CC KIndexFindAllText ( const KIndex *self, const char *key,
+    rc_t ( CC * f ) ( int64_t id, uint64_t id_count, void *data ), void *data )
+{
+    rc_t rc = 0;
+    int64_t id64;
+    uint32_t id32, span;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcSelf, rcNull );
+
+    if ( f == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcFunction, rcNull );
+
+    if ( key == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcString, rcNull );
+    if ( key [ 0 ] == 0 )
+        return RC ( rcDB, rcIndex, rcSelecting, rcString, rcEmpty );
+
+    span = 1;
+
+    switch ( self -> type )
+    {
+    case kitText:
+    case kitText | kitProj:
+        switch ( self -> vers )
+        {
+        case 1:
+            rc = KTrieIndexFind_v1 ( & self -> u . txt1, key, & id32, NULL, NULL );
+            if ( rc == 0 )
+                rc = ( * f ) ( id32, 1, data );
+            break;
+        case 2:
+        case 3:
+        case 4:
+#if V2FIND_RETURNS_SPAN
+            rc = KTrieIndexFind_v2 ( & self -> u . txt234, key, & id64, & span, NULL, NULL, self -> converted_from_v1 );
+#else
+            rc = KTrieIndexFind_v2 ( & self -> u . txt234, key, & id64, NULL, NULL, self -> converted_from_v1 );
+#endif
+            if ( rc == 0 )
+                rc = ( * f ) ( id64, span, data );
+            break;
+        default:
+            return RC ( rcDB, rcIndex, rcSelecting, rcIndex, rcBadVersion );
+        }
+        break;
+    default:
+        return RC ( rcDB, rcIndex, rcSelecting, rcNoObj, rcUnknown );
+    }
+    
+    return rc;
+}
+
+
+/* Project
+ *  finds key(s) mapping to value/id if supported
+ */
+LIB_EXPORT rc_t CC KIndexProjectText ( const KIndex *self,
+    int64_t id, int64_t *start_id, uint64_t *id_count,
+    char *key, size_t kmax, size_t *actsize )
+{
+    rc_t rc = 0;
+    int64_t dummy;
+    uint32_t span;
+
+    if ( start_id == NULL )
+        start_id = & dummy;
+
+    * start_id = 0;
+
+    if ( id_count != NULL )
+        * id_count = 0;
+
+    if ( key == NULL && kmax != 0 )
+        return RC ( rcDB, rcIndex, rcProjecting, rcBuffer, rcNull );
+
+    if ( kmax != 0 )
+        key [ 0 ] = 0;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcProjecting, rcSelf, rcNull );
+
+    if ( ( ( KIdxType ) self -> type & kitProj ) == 0 )
+        return RC ( rcDB, rcIndex, rcProjecting, rcIndex, rcIncorrect );
+
+    if ( key == NULL )
+        return RC ( rcDB, rcIndex, rcProjecting, rcBuffer, rcNull );
+
+    span = 1;
+
+    switch ( self -> type )
+    {
+    case kitText | kitProj:
+        switch ( self -> vers )
+        {
+        case 1:
+            /* there is a limit on ids in v1 */
+            if ( id <= 0 || ( id >> 32 ) != 0 )
+                return RC ( rcDB, rcIndex, rcProjecting, rcId, rcNotFound );
+
+            rc = KTrieIndexProject_v1 ( & self -> u . txt1,
+                ( uint32_t ) id, key, kmax, actsize );
+            if ( rc == 0 )
+                * start_id = id;
+            break;
+        case 2:
+        case 3:
+        case 4:
+#if V2FIND_RETURNS_SPAN
+            rc = KTrieIndexProject_v2 ( & self -> u . txt234, id, start_id, & span, key, kmax, actsize );
+#else
+            rc = KTrieIndexProject_v2 ( & self -> u . txt234, id, key, kmax, actsize );
+            if ( rc == 0 )
+                * start_id = id;
+#endif
+            break;
+        default:
+            return RC ( rcDB, rcIndex, rcProjecting, rcIndex, rcBadVersion );
+        }
+        break;
+    default:
+        return RC ( rcDB, rcIndex, rcProjecting, rcNoObj, rcUnknown );
+    }
+
+    if ( id_count != NULL )
+        * id_count = span;
+    
+    return rc;
+}
+
+
+/* ProjectAll
+ *  finds key(s) mapping to value/id if supported
+ */
+LIB_EXPORT rc_t CC KIndexProjectAllText ( const KIndex *self, int64_t id,
+    rc_t ( CC * f ) ( int64_t start_id, uint64_t id_count, const char *key, void *data ),
+    void *data )
+{
+    rc_t rc = 0;
+    char key [ 256 ];
+
+    uint32_t span;
+    int64_t start_id;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcProjecting, rcSelf, rcNull );
+
+    if ( ( ( KIdxType ) self -> type & kitProj ) == 0 )
+        return RC ( rcDB, rcIndex, rcProjecting, rcIndex, rcIncorrect );
+
+    if ( f == NULL )
+        return RC ( rcDB, rcIndex, rcProjecting, rcFunction, rcNull );
+
+    span = 1;
+
+    switch ( self -> type )
+    {
+    case kitText | kitProj:
+        switch ( self -> vers )
+        {
+        case 1:
+            /* there is a limit on ids in v1 */
+            if ( id <= 0 || ( id >> 32 ) != 0 )
+                return RC ( rcDB, rcIndex, rcProjecting, rcId, rcNotFound );
+
+            rc = KTrieIndexProject_v1 ( & self -> u . txt1,
+                ( uint32_t ) id, key, sizeof key, NULL );
+            if ( rc == 0 )
+                rc = ( * f ) ( id, 1, key, data );
+            break;
+
+        case 2:
+        case 3:
+        case 4:
+#if V2FIND_RETURNS_SPAN
+            rc = KTrieIndexProject_v2 ( & self -> u . txt234, id, & start_id, & span, key, sizeof key, NULL );
+#else
+            rc = KTrieIndexProject_v2 ( & self -> u . txt234, start_id = id, key, sizeof key );
+#endif
+            if ( rc == 0 )
+                rc = ( * f ) ( start_id, span, key, data );
+            break;
+            
+        default:
+            return RC ( rcDB, rcIndex, rcProjecting, rcIndex, rcBadVersion );
+        }
+        break;
+    default:
+        return RC ( rcDB, rcIndex, rcProjecting, rcNoObj, rcUnknown );
+    }
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KIndexFindU64( const KIndex* self, uint64_t offset, uint64_t* key, uint64_t* key_size, int64_t* id, uint64_t* id_qty )
+{
+    rc_t rc = 0;
+
+    if( key == NULL || key_size == NULL || id == NULL || id_qty == NULL ) {
+        return RC(rcDB, rcIndex, rcSelecting, rcParam, rcNull);
+    }
+    *key = *key_size = *id = *id_qty = 0;
+    if( self == NULL ) {
+        return RC(rcDB, rcIndex, rcSelecting, rcSelf, rcNull);
+    }
+
+    switch( self->type )
+    {
+    case kitU64:
+        switch( self->vers )
+        {
+        case 3:
+        case 4:
+            rc = KU64IndexFind_v3(&self->u.u64_3, offset, key, key_size, id, id_qty);
+            break;
+        default:
+            return RC(rcDB, rcIndex, rcSelecting, rcIndex, rcBadVersion);
+        }
+        break;
+    default:
+        return RC(rcDB, rcIndex, rcSelecting, rcNoObj, rcUnknown);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KIndexFindAllU64( const KIndex* self, uint64_t offset,
+    rc_t ( CC * f )(uint64_t key, uint64_t key_size, int64_t id, uint64_t id_qty, void* data ), void* data)
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        return RC(rcDB, rcIndex, rcSelecting, rcSelf, rcNull);
+    if ( f == NULL )
+        return RC(rcDB, rcIndex, rcSelecting, rcFunction, rcNull);
+
+    switch ( self->type )
+    {
+    case kitU64:
+        switch ( self->vers )
+        {
+        case 3:
+        case 4:
+            rc = KU64IndexFindAll_v3(&self->u.u64_3, offset, f, data);
+            break;
+        default:
+            return RC(rcDB, rcIndex, rcSelecting, rcIndex, rcBadVersion);
+        }
+        break;
+    default:
+        return RC(rcDB, rcIndex, rcSelecting, rcNoObj, rcUnknown);
+    }
+
+    return rc;
+}
+
+
+/* SetMaxId
+ *  certain legacy versions of skey were built to know only the starting id
+ *  of the NAME_FMT column, but were never given a maximum id. allow them
+ *  to be corrected here.
+ */
+LIB_EXPORT void CC KIndexSetMaxRowId ( const KIndex *cself, int64_t max_row_id )
+{
+    if ( cself != NULL ) switch ( cself -> type )
+    {
+    case kitText:
+    case kitText | kitProj:
+        switch ( cself -> vers )
+        {
+        case 2:
+        case 3:
+        case 4:
+            /* here we can repair the max row id */
+            if ( cself -> u . txt234 . pt . maxid < max_row_id )
+                ( ( KIndex* ) cself ) -> u . txt234 . pt . maxid = max_row_id;
+            break;
+        }
+        break;
+    }
+}
diff --git a/libs/kdb/kdb-priv.h b/libs/kdb/kdb-priv.h
new file mode 100644
index 0000000..f9440f1
--- /dev/null
+++ b/libs/kdb/kdb-priv.h
@@ -0,0 +1,122 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_priv_
+#define _h_kdb_priv_
+
+#ifndef _h_kdb_manager_
+#include <kdb/manager.h>
+#endif
+
+#ifndef _h_kdb_manager_
+#include <kdb/manager.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KDirectory;
+struct KDBManager;
+
+/*
+ * This symbol is inserted where the KDB is being tweaked to allow
+ * VFS URI syntax in opening KDB database objects initially to support
+ * krypto passwords more fully.  By specifying the password source
+ * individually for opens two KDB objects with different passwords can be opened.
+ */
+#define SUPPORT_VFS_URI 1
+
+/*--------------------------------------------------------------------------
+ * KDB utility
+ */
+
+
+/* PathType
+ *  checks type of path
+ */
+int KDBPathTypeDir ( const struct KDirectory *dir, int type,bool *zombies, const char *path );
+int KDBPathType ( const struct KDirectory *dir, bool *zombies, const char *path );
+
+/* OpenPathType
+ * Opens a path if it is of the specified type.  Even if it is an archive file
+ * instead of a directory.
+ *
+ * if dpdir is NULL it will not return with an open Directory but it will have
+ * checked that the type requested is the type present even if in an archive.
+ *
+ * if realpathtype is not NULL the found type will be returned regardless
+ * of a match to request path type.
+ *
+ * the return will be zero only if the path does point to a directory or
+ * archive that is of the requested type.  An archive will have been opened
+ * but reshut if dpdir is NULL.
+ */ 
+rc_t KDBOpenPathTypeRead ( const struct KDBManager * mgr, const struct KDirectory * dir, const char * path, 
+    const struct KDirectory ** dpdir, int pathtype, int * realpathtype, bool try_srapath );
+
+/* Writable
+ *  examines a directory structure for any "lock" files
+ *  examines a file for ( any ) write permission
+ */
+rc_t KDBWritable ( const struct KDirectory *dir, const char *path );
+
+/* GetObjModDate
+ *  extract mod date from a path
+ */
+rc_t KDBGetObjModDate ( const struct KDirectory *dir, KTime_t *mtime );
+
+/* GetPathModDate
+ *  extract mod date from a path
+ */
+rc_t KDBVGetPathModDate ( const struct KDirectory *dir,
+    KTime_t *mtime, const char *path, va_list args );
+
+/* KDBMakeSubPath
+ *  adds a namespace to path spec
+ */
+rc_t KDBMakeSubPath ( struct KDirectory const *dir,
+    char *subpath, size_t subpath_max, const char *ns,
+    uint32_t ns_size, const char *path, ... );
+/* VMakeSubPath
+ *  adds a namespace to path spec
+ */
+rc_t KDBVMakeSubPath ( const struct KDirectory *dir,
+    char *subpath, size_t subpath_max, const char *ns,
+    uint32_t ns_size, const char *path, va_list args );
+
+
+/* KDBIsPathUri
+ * A hack to get some of VFS into KDB that is too tightly bound to KFS
+ */
+bool KDBIsPathUri (const char * path);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kdb_priv_ */
diff --git a/libs/kdb/kdb.c b/libs/kdb/kdb.c
new file mode 100644
index 0000000..204bf29
--- /dev/null
+++ b/libs/kdb/kdb.c
@@ -0,0 +1,951 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#include "kdb-priv.h"
+#include "kdbfmt-priv.h"
+#include "dbmgr-priv.h"
+
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+#include <krypto/wgaencrypt.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/resolver.h>
+#include <vfs/manager-priv.h>
+#include <sra/srapath.h>
+
+#include <kfs/kfs-priv.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/arc.h>
+#include <kfs/tar.h>
+#include <kfs/sra.h>
+#include <kfs/kfs-priv.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <va_copy.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+#include <errno.h>
+
+#ifndef SUPPORT_VFS_URI
+#define SUPPORT_VFS_URI 0
+#endif
+
+#ifndef SUPPORT_KDB_TAR
+#define SUPPORT_KDB_TAR 0
+#endif
+
+/*--------------------------------------------------------------------------
+ * KDB utility
+ */
+
+/* KDBHdrValidate
+ *  validates that a header sports a supported byte order
+ *  and that the version is within range
+ */
+/* this is included to make kdb.c vs. wkdb.c file comparisons easier in [x]emacs.*/
+#if NOT_USED_IN_READ_ONLY_SIDE
+rc_t KDBHdrValidate ( const KDBHdr *hdr, size_t size,
+    uint32_t min_vers, uint32_t max_vers )
+{
+    assert ( hdr != NULL );
+
+    if ( size < sizeof * hdr )
+        return RC ( rcDB, rcHeader, rcValidating, rcData, rcCorrupt );
+
+    if ( hdr -> endian != eByteOrderTag )
+    {
+        if ( hdr -> endian == eByteOrderReverse )
+            return RC ( rcDB, rcHeader, rcValidating, rcByteOrder, rcIncorrect );
+        return RC ( rcDB, rcHeader, rcValidating, rcData, rcCorrupt );
+    }
+
+    if ( hdr -> version < min_vers || hdr -> version > max_vers )
+        return RC ( rcDB, rcHeader, rcValidating, rcHeader, rcBadVersion );
+
+    return 0;
+}
+#endif
+
+/* KDBPathType
+ *  checks type of path
+ */
+enum ScanBits
+{
+    scan_db     = ( 1 <<  0 ),
+    scan_tbl    = ( 1 <<  1 ),
+    scan_idx    = ( 1 <<  2 ),
+    scan_col    = ( 1 <<  3 ),
+    scan_idxN   = ( 1 <<  4 ),
+    scan_data   = ( 1 <<  5 ),
+    scan_dataN  = ( 1 <<  6 ),
+    scan_md     = ( 1 <<  7 ),
+    scan_cur    = ( 1 <<  8 ),
+    scan_rNNN   = ( 1 <<  9 ),
+    scan_lock   = ( 1 << 10 ),
+    scan_odir   = ( 1 << 11 ),
+    scan_ofile  = ( 1 << 12 ),
+    scan_meta   = ( 1 << 13 ),
+    scan_skey   = ( 1 << 14 ),
+    scan_sealed = ( 1 << 15 ),
+    scan_zombie = ( 1 << 16 )
+};
+
+static
+rc_t CC scan_dbdir ( const KDirectory *dir, uint32_t type, const char *name, void *data )
+{
+    uint32_t *bits = data;
+
+    type &= kptAlias - 1;
+
+    if ( type == kptDir )
+    {
+        switch ( name [ 0 ] )
+        {
+        case 'c':
+            if ( strcmp ( name, "col" ) == 0 )
+            { * bits |= scan_col; return 0; }
+            break;
+        case 'm':
+            if ( strcmp ( name, "md" ) == 0 )
+            { * bits |= scan_md; return 0; }
+            break;
+        case 't':
+            if ( strcmp ( name, "tbl" ) == 0 )
+            { * bits |= scan_tbl; return 0; }
+            break;
+        case 'i':
+            if ( strcmp ( name, "idx" ) == 0 )
+            { * bits |= scan_idx; return 0; }
+            break;
+        case 'd':
+            if ( strcmp ( name, "db" ) == 0 )
+            { * bits |= scan_db; return 0; }
+            break;
+        }
+
+        * bits |= scan_odir;
+    }
+    else if ( type == kptFile )
+    {
+        switch ( name [ 0 ] )
+        {
+        case 'l':
+            if ( strcmp ( name, "lock" ) == 0 )
+            { * bits |= scan_lock; return 0; }
+            break;
+        case 'i':
+            if ( memcmp ( name, "idx", 3 ) == 0 )
+            {
+                if ( isdigit ( name [ 3 ] ) )
+                { * bits |= scan_idxN; return 0; }
+            }
+            break;
+        case 'd':
+            if ( memcmp ( name, "data", 4 ) == 0 )
+            {
+                if ( name [ 4 ] == 0 )
+                { * bits |= scan_data; return 0; }
+                if ( isdigit ( name [ 4 ] ) )
+                { * bits |= scan_dataN; return 0; }
+            }
+        case 'c':
+            if ( strcmp ( name, "cur" ) == 0 )
+            { * bits |= scan_cur; return 0; }
+            break;
+        case 'r':
+            if ( isdigit ( name [ 1 ] ) && isdigit ( name [ 2 ] ) &&
+                 isdigit ( name [ 3 ] ) && name [ 4 ] == 0 )
+            { * bits |= scan_rNNN; return 0; }
+            break;
+        case 'm':
+            if ( strcmp ( name, "meta" ) == 0 )
+            { * bits |= scan_meta; return 0; }
+            break;
+        case 's':
+            if ( strcmp ( name, "skey" ) == 0 )
+            { * bits |= scan_skey; return 0; }
+            if ( strcmp ( name, "sealed" ) == 0 )
+            { * bits |= scan_sealed; return 0; }
+            break;
+        }
+
+        * bits |= scan_ofile;
+    }
+    else if (type == kptZombieFile )
+    {
+        * bits |= scan_zombie;
+    }
+    
+    return 0;
+}
+
+
+int KDBPathTypeDir (const KDirectory * dir, int type, bool * pHasZombies, const char * path)
+{
+    const char * leaf, * parent;
+    uint32_t bits;
+    rc_t rc;
+
+    bits = 0;
+
+    assert ((type == kptDir) || (type == (kptDir|kptAlias)));
+
+    rc = KDirectoryVisit ( dir, false, scan_dbdir, & bits, "%s", path );
+    if ( rc == 0 ) do
+    {
+        if ( ( bits & scan_zombie ) != 0 ) {
+            bits &= ~scan_zombie;
+            if (pHasZombies)
+                *pHasZombies = true;
+        }
+        /* look for a column */
+        if ( ( bits & scan_idxN ) != 0 &&
+             ( bits & ( scan_data | scan_dataN ) ) != 0 )
+        {
+            if ( ( bits & ( scan_db | scan_tbl | scan_idx | scan_col ) ) == 0 )
+                type += kptColumn - kptDir;
+            break;
+        }
+
+        /* look for a table */
+        if ( ( bits & scan_col ) != 0 )
+        {
+            /* can't have sub-tables or a db */
+            if ( ( bits & ( scan_db | scan_tbl ) ) == 0 )
+            {
+                /* look for an old-structure table */
+                if ( ( bits & ( scan_meta | scan_md ) ) == scan_meta ||
+                     ( bits & ( scan_skey | scan_idx ) ) == scan_skey )
+                    type += kptPrereleaseTbl - kptDir;
+                else
+                    type += kptTable - kptDir;
+            }
+            break;
+        }
+
+        /* look for metadata */
+        if ( ( bits & ( scan_cur | scan_rNNN ) ) != 0 )
+        {
+            if ( ( bits & ( scan_db | scan_tbl | scan_idx | scan_col ) ) == 0 )
+                type += kptMetadata - kptDir;
+            break;
+        }
+
+        /* look for a database */
+        if ( ( bits & scan_tbl ) != 0 )
+        {
+            if ( ( bits & scan_col ) == 0 )
+                type += kptDatabase - kptDir;
+            break;
+        }
+
+        /* look for a structured column */
+        if ( ( bits & scan_odir ) != 0 )
+        {
+            leaf = strrchr ( path, '/' );
+            if ( leaf != NULL )
+            {
+                parent = string_rchr ( path, leaf - path, '/' );
+                if ( parent ++ == NULL )
+                    parent = path;
+                if ( memcmp ( parent, "col/", 4 ) != 0 )
+                    break;
+
+                bits = 0;
+                if ( KDirectoryVisit ( dir, 1, scan_dbdir, & bits, "%s", path ) == 0 )
+                {
+                    if ( ( bits & scan_idxN ) != 0 &&
+                         ( bits & ( scan_data | scan_dataN ) ) != 0 )
+                    {
+                        if ( ( bits & ( scan_db | scan_tbl | scan_idx | scan_col ) ) == 0 )
+                            type += kptColumn - kptDir;
+                        break;
+                    }
+                }
+            }
+        }
+    } while (0);
+
+    return type;
+}
+
+
+int KDBPathType ( const KDirectory *dir, bool *pHasZombies, const char *path )
+{
+    const char *leaf, *parent;
+
+
+    rc_t rc;
+    int type = KDirectoryPathType ( dir, "%s", path );
+    
+    if (pHasZombies)
+        *pHasZombies = false;
+
+    switch ( type )
+    {
+    case kptDir:
+    case kptDir | kptAlias:
+        type = KDBPathTypeDir (dir, type, pHasZombies, path);
+        break;
+
+    case kptFile:
+    case kptFile | kptAlias:
+    {
+        /* if we hit a file first try it as an archive */
+        const KDirectory * ldir;
+
+        rc = KDirectoryOpenSraArchiveRead_silent ( dir, &ldir, false, "%s", path );
+#if SUPPORT_KDB_TAR
+        if ( rc != 0 )
+            rc = KDirectoryOpenTarArchiveRead_silent ( dir, &ldir, false, "%s", path );
+#endif
+        /* it was an archive so recur */
+        if ( rc == 0 )
+        {
+            /* recheck this newly opened directory for KDB/KFS type */
+            int type2;
+
+            type2 = KDBPathType ( ldir, NULL, "." );
+            if ((type2 != kptDir) || (type != (kptDir|kptAlias)))
+                type = type2;
+
+            KDirectoryRelease (ldir);
+        }
+        /* it was not an archive so see if it it's an idx file */
+        else
+        {
+            leaf = strrchr ( path, '/' );
+            if ( leaf != NULL )
+            {
+                parent = string_rchr ( path, leaf - path, '/' );
+                if ( parent ++ == NULL )
+                    parent = path;
+                if ( memcmp ( parent, "idx/", 4 ) == 0 )
+                    type += kptIndex - kptFile;
+            }
+        }
+        break;
+    }
+    }
+    return type;
+}
+
+
+
+#if SUPPORT_VFS_URI
+#else
+/* return configured password as ASCIZ
+ * opertates on vfs/kfs/kfg objects, not kdb objects */
+static
+rc_t KDBOpenFileGetPassword (char * pw, size_t pwz)
+{
+    VFSManager * mgr;
+    rc_t rc;
+
+    assert (pw);
+    assert (pwz);
+
+    pw[0] = '\0';
+
+    rc = VFSManagerMake (&mgr);
+    if (rc)
+        ;                      /* failure to make VFS manager: pass along rc */
+    else
+    {
+        size_t pwfz;
+        char pwf [4096 + 1];
+
+        rc = VFSManagerGetConfigPWFile (mgr, pwf, sizeof (pwf) - 1, &pwfz);
+        if (rc)
+            /* failure to get password file path: tweak rc */
+            rc = RC (rcDB, rcMgr, rcOpening, rcEncryptionKey, rcNotFound);
+
+        else
+        {
+            VPath * pwp;
+
+            pwf [pwfz] = '\0'; /* force to ASCIZ */
+
+#if 0
+            rc = VPathMakeSysPath (&pwp, pwf);
+#else
+            rc = VFSManagerMakePath (mgr, &pwp, "%s", pwf);
+#endif
+
+            if (rc)
+                ;       /* failure to construct a path from the string */
+            
+            else
+            {
+                const KFile * pwf;
+          
+                rc = VFSManagerOpenFileRead (mgr, &pwf, pwp);
+                if (rc)
+                    /* failure to open password file */
+                    rc = RC (rcDB, rcMgr, rcOpening, rcEncryptionKey, rcNotOpen);
+
+                else
+                {
+                    size_t z;
+                    char pwb [4098]; /* arbitrarily using 4096 as maximum
+                                        allowed length */
+
+                    /* at this point we are only getting the password from a 
+                     * file but in the future if we can get it from a pipe of
+                     * some sort we can't count on the ReadAll to really know
+                     * if we hit end of file and not just a pause in the
+                     * streaming.  VFS/KFS 2 will have to fix this somehow
+                     */
+
+                    rc = KFileReadAll (pwf, 0, pwb, sizeof pwb, &z);
+                    if (rc)
+                        ;       /* failure to read password file: pass along rc */
+                    else
+                    {
+                        /* trim off EOL if present */
+                        char * pc;
+
+                        pwb[z] = '\0';   /* force ASCIZ */
+
+                        pc = string_chr (pwb, z, '\r');
+                        if (pc)
+                        {
+                            *pc = '\0';
+                            z = 1 + pc - pwb;
+                        }
+                        pc = string_chr (pwb, z, '\n');
+                        if (pc)
+                        {
+                            *pc = '\0';
+                            z = 1 + pc - pwb;
+                        }
+                        if (z == 0)
+                            rc = RC (rcDB, rcMgr, rcOpening, rcEncryptionKey, rcTooShort);
+
+                        else if (pwz < z) /* pwz came in as 4096 */
+                            rc = RC (rcDB, rcMgr, rcOpening, rcEncryptionKey, rcTooLong);
+
+                        else
+                        {
+                            memmove (pw, pwb, z+1);
+                        }
+                    }
+                    KFileRelease (pwf);
+                }
+                VPathRelease (pwp);
+            }
+        }
+        VFSManagerRelease (mgr);
+    }
+    return rc;
+}
+
+
+/* not KDB specific - just uses vfs/krypto/kfs objects */
+static
+rc_t KDBOpenFileAsDirectory (const KDirectory * dir,
+                             const char * path, 
+                             const KDirectory ** pdir,
+                             uint32_t rcobj)
+{
+    const KFile * file;
+    const KFile * f;
+    const KDirectory * ldir;
+    bool encrypted = false;
+
+    rc_t rc;
+
+    *pdir = NULL;
+
+    rc = KDirectoryOpenFileRead (dir, &file, "%s", path);
+    if (rc == 0)
+    {
+        rc = KFileRandomAccess(file);
+        if (rc)
+            rc = RC (rcDB, rcMgr, rcOpening, rcobj, rcUnsupported);
+        else
+        {
+            size_t tz;
+            char tbuff [4096];
+            char pbuff [4096 + 1];
+
+            rc = KFileReadAll (file, 0, tbuff, sizeof tbuff, &tz);
+            if (rc == 0)
+            {
+                if (KFileIsEnc (tbuff, tz) == 0)
+                {
+                    encrypted = true;
+
+                    rc = KDBOpenFileGetPassword (pbuff, sizeof (pbuff) - 1);
+                    if (rc == 0)
+                    {
+                        KKey key;
+
+                        rc = KKeyInitRead (&key, kkeyAES128, pbuff, string_size (pbuff));
+                        if (rc == 0)
+                        {
+                            rc = KEncFileMakeRead (&f, file, &key);
+                            if (rc == 0)
+                            {
+                                /* KEncFileMakeRead adds a reference */
+                                KFileRelease (file);
+                                file = f;
+                                rc = KFileReadAll (file, 0, tbuff, sizeof tbuff, &tz);
+                            }
+                        }
+                    }
+                }
+                else if (KFileIsWGAEnc (tbuff, tz) == 0)
+                {
+                    encrypted = true;
+
+                    rc = KDBOpenFileGetPassword (pbuff, sizeof (pbuff) - 1);
+                    if (rc == 0)
+                    {
+                        rc = KFileMakeWGAEncRead (&f, file, pbuff, string_size (pbuff));
+                        if (rc == 0)
+                        {
+                            /* KFileMakeWGAEncRead adds a reference */
+                            KFileRelease (file);
+                            file = f;
+                            rc = KFileReadAll (file, 0, tbuff, sizeof tbuff, &tz);
+                        }
+                    }
+                }
+                /* else not a handled encryption or unencrypted: we can't distinguish too much */
+
+                if (rc == 0)
+                {
+                    if (KFileIsSRA (tbuff, tz) == 0)
+                    {
+                        rc = KDirectoryOpenSraArchiveReadUnbounded_silent_preopened (dir,
+                                                                                     &ldir,
+                                                                                     false,
+                                                                                     file,
+                                                                                     "%s",
+                                                                                     path);
+                    }
+                    else
+                    {
+#if SUPPORT_KDB_TAR
+                        rc = KDirectoryOpenTarArchiveRead_silent_preopened (dir, &ldir, false,
+                                                                            file, "%s", path);
+#else
+                        /* will be reset immediately below */
+                        rc = -1;
+#endif
+                    }
+
+                    /* not an archive type we handle or a bad archive */
+                    if ( rc != 0 )
+                    {
+                        if (encrypted)
+                            rc = RC ( rcDB, rcMgr, rcOpening, rcEncryptionKey, rcIncorrect );
+                        else
+                            rc = RC ( rcDB, rcMgr, rcOpening, rcPath, rcIncorrect );
+                    }
+                    else
+                    {
+                        /*
+                         * release our ownership of the KFile that but archive will 
+                         * keep theirs
+                         */
+                        KFileRelease (file);
+                        *pdir = ldir;
+                        return 0;
+                    }
+                }
+            }
+        }
+        KFileRelease (file);
+    }
+    return rc;
+}
+#endif
+
+
+static rc_t KDBOpenPathTypeReadInt ( const KDBManager * mgr, const KDirectory * dir, const char * path,
+                                     const KDirectory ** pdir, int * type,
+                                     int pathtype, uint32_t rcobj, bool try_srapath )
+{
+    VFSManager * vmgr = mgr->vfsmgr;
+    const KDirectory * ldir = NULL;
+    rc_t rc = 0;
+
+    /* object relative opens can be done using KFS - we hacked in VFS after all */
+    if (! try_srapath)
+    {
+        rc = KDirectoryOpenDirUpdate ((KDirectory*)dir, (KDirectory**)pdir, false, "%s", path);
+        if ((rc) && (GetRCState(rc) != rcNotFound))
+            rc = KDirectoryOpenDirRead (dir, pdir, false, "%s", path);
+    }
+    else
+    {
+        VPath * vpath;
+
+        /*
+         * We've got to decide if the path coming in is a full or relative
+         * path and if relative make it relative to dir or possibly its a srapath
+         * accession
+         *
+         */
+        rc = VPathMakeDirectoryRelative ( &vpath, dir, path );
+        if ( rc == 0 )
+        {
+            rc = VFSManagerOpenDirectoryReadDirectoryRelativeDecrypt ( vmgr, dir, &ldir, vpath );
+
+            if ( rc == 0 )
+            {
+                *type = (~kptAlias) & KDBPathType ( ldir, NULL, "." );
+
+                /* just a directory, not a kdb type */
+                if ( *type == kptDir )
+                    rc = RC (rcDB, rcMgr, rcOpening, rcPath, rcIncorrect);
+
+                else if ( *type != pathtype )
+                {
+                    KDirectoryRelease( ldir );
+                    rc = RC ( rcDB, rcMgr, rcOpening, rcobj, rcIncorrect );
+                }
+                else
+                {
+                    if ( pdir != NULL )
+                        *pdir = ldir;
+                    else
+                        KDirectoryRelease( ldir );
+                }
+            }
+            VPathRelease ( vpath );
+        }
+    }
+    return rc;
+}
+
+rc_t KDBOpenPathTypeRead ( const KDBManager * mgr, const KDirectory * dir, const char * path, 
+    const KDirectory ** pdir, int pathtype, int * ppathtype, bool try_srapath )
+{
+    const KDirectory *ldir;
+    rc_t rc = 0;
+    uint32_t rcobj;
+    int type = kptNotFound; /* bogus? */
+
+/*     KOutMsg ("%s: %s\n", __func__, path); */
+
+    if ( pdir != NULL )
+        *pdir = NULL;
+    if ( ppathtype != NULL )
+        *ppathtype = type;
+
+    switch (pathtype & ~ kptAlias) /* tune the error message based on path type */
+    {
+        /* we'll hit this if we don't track defines in kdb/manager.h */
+    default:
+        rc = RC (rcDB, rcMgr, rcOpening, rcType, rcInvalid);
+        return rc;
+
+    case kptTable:
+    case kptPrereleaseTbl:
+        rcobj = rcTable;
+        break;
+
+    case kptColumn:
+        rcobj = rcColumn;
+        break;
+
+    case kptDatabase:
+    case kptDatabase | kptAlias:
+        rcobj = rcDatabase;
+        break;
+    }
+
+    rc = KDBOpenPathTypeReadInt( mgr, dir, path, &ldir, &type, pathtype, rcobj, try_srapath );
+
+    if (rc == 0)
+    {
+        if ( ppathtype != NULL )
+            *ppathtype = type;
+
+        if (pdir != NULL)
+            *pdir = ldir;
+        else
+            KDirectoryRelease (ldir);
+    }
+
+    return rc;
+}
+
+
+/* Writable
+ *  examines a directory structure for any "lock" files
+ */
+rc_t KDBWritable ( const KDirectory *dir, const char *path )
+{
+    uint32_t access;
+    rc_t rc;
+
+    /* protect us from bad parameters */
+    if (dir == NULL)
+        return RC (rcDB, rcPath, rcAccessing, rcDirectory, rcNull);
+    if (path == NULL)
+        return RC (rcDB, rcPath, rcAccessing, rcPath, rcNull);
+
+    /* we have to be able to check the access if it is to be writable */
+    rc = KDirectoryAccess ( dir, & access, "%s", path );
+    if ( rc == 0 )
+    {
+        /* if there is a lock (or deprecated sealed) file in this directory */
+        switch ( KDirectoryPathType ( dir, "%s/lock", path ) )
+        {
+        case kptFile:
+        case kptFile | kptAlias:
+            rc = RC ( rcDB, rcPath, rcAccessing, rcLock, rcLocked );
+            break;
+        case kptNotFound:
+            /* much simpler handling for the sealed file */
+            switch ( KDirectoryPathType ( dir, "%s/sealed", path ) )
+            {
+            case kptFile:
+            case kptFile | kptAlias:
+                rc = RC ( rcDB, rcPath, rcAccessing, rcLock, rcLocked );
+                break;
+            case kptNotFound:
+                /* check if there are no write permissions */
+                if ( ( access & 0222 ) == 0 )
+                    rc = RC ( rcDB, rcPath, rcAccessing, rcPath, rcReadonly );
+                /* else rc is still 0 from VAccess */
+            }
+            break;
+        case kptBadPath:
+            /* likely to be a non-driectory or something */
+            rc = RC ( rcDB, rcPath, rcAccessing, rcPath, rcInvalid);
+            break;
+        default:
+            /* an illegal type of object named "lock" is in this directory
+             * which will block the ability to lock it
+             */
+            rc = RC ( rcDB, rcPath, rcAccessing, rcPath, rcIncorrect );
+        }
+    }
+    return rc;
+}
+
+
+bool KDBIsLocked ( const KDirectory *dir, const char *path )
+{
+    return ( KDBWritable (dir, path) != 0 );
+}
+
+
+/* GetObjModDate
+ *  extract mod date from a path
+ */
+rc_t KDBGetObjModDate ( const KDirectory *dir, KTime_t *mtime )
+{
+    /* HACK ALERT - there needs to be a proper way to record modification times */
+    
+    /* this only tells the last time the table was locked,
+       which may be close to the last time it was modified */
+    rc_t rc = KDirectoryDate ( dir, mtime, "lock" );
+    if ( rc == 0 )
+        return 0;
+
+    if ( GetRCState ( rc ) == rcNotFound )
+    {
+        rc = KDirectoryDate ( dir, mtime, "sealed" );
+        if ( rc == 0 )
+            return 0;
+    }
+
+    /* get directory timestamp */
+    rc = KDirectoryDate ( dir, mtime, "." );
+    if ( rc == 0 )
+        return 0;
+
+    * mtime = 0;
+    return rc;
+}
+
+/* GetPathModDate
+ *  extract mod date from a path
+ */
+rc_t KDBVGetPathModDate ( const KDirectory *dir,
+    KTime_t *mtime, const char *path, va_list args )
+{
+    rc_t rc;
+    uint32_t ptype;
+    const KDirectory *obj_dir;
+
+    va_list cpy;
+    va_copy ( cpy, args );
+    ptype = KDirectoryVPathType ( dir, path, cpy );
+    va_end ( cpy );
+
+    switch ( ptype )
+    {
+    case kptDir:
+    case kptDir | kptAlias:
+        break;
+
+    default:
+        return KDirectoryVDate ( dir, mtime, path, args );
+    }
+
+    * mtime = 0;
+    rc = KDirectoryVOpenDirRead ( dir, & obj_dir, true, path, args );
+    if ( rc == 0 )
+    {
+        rc = KDBGetObjModDate ( obj_dir, mtime );
+        KDirectoryRelease ( obj_dir );
+    }
+
+    return rc;
+}
+
+
+/* KDBVMakeSubPath
+ *  adds a namespace to path spec
+ */
+rc_t KDBVMakeSubPath ( struct KDirectory const *dir,
+    char *subpath, size_t subpath_max, const char *ns,
+    uint32_t ns_size, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( ns_size > 0 )
+    {
+        subpath += ns_size + 1;
+        subpath_max -= ns_size + 1;
+    }
+
+#if CRUFTY_USE_OF_RESOLVE_PATH
+    /* because this call only builds a path instead of resolving anything
+     * is is okay that we are using the wrong directory */
+    rc = KDirectoryVResolvePath ( dir, false,
+        subpath, subpath_max, path, args );
+#else
+    {
+        int sz = vsnprintf ( subpath, subpath_max, path, args );
+        if ( sz < 0 || ( size_t ) sz >= subpath_max )
+            rc = RC ( rcDB, rcDirectory, rcResolving, rcBuffer, rcInsufficient );
+        else if ( sz == 0 )
+            rc = RC ( rcDB, rcDirectory, rcResolving, rcPath, rcEmpty );
+        else
+        {
+            rc = 0;
+        }
+    }
+#endif
+    switch ( GetRCState ( rc ) )
+    {
+    case 0:
+        assert ( subpath [ 0 ] != 0 );
+        if ( subpath [ 0 ] == '.' || subpath [ 1 ] == '/' )
+            return RC ( rcDB, rcDirectory, rcResolving, rcPath, rcInvalid );
+        break;
+    case rcInsufficient:
+        return RC ( rcDB, rcDirectory, rcResolving, rcPath, rcExcessive );
+    default:
+        return rc;
+    }
+
+    if ( ns_size != 0 )
+    {
+        subpath -= ns_size + 1;
+        memmove ( subpath, ns, ns_size );
+        subpath [ ns_size ] = '/';
+    }
+    return rc;
+}
+
+/* KDBMakeSubPath
+ *  adds a namespace to path spec
+ */
+rc_t KDBMakeSubPath ( struct KDirectory const *dir,
+    char *subpath, size_t subpath_max, const char *ns,
+    uint32_t ns_size, const char *path, ... )
+{
+    rc_t rc = 0;
+    va_list args;
+    va_start(args, path);
+    rc = KDBVMakeSubPath(dir, subpath, subpath_max, ns, ns_size, path, args);
+    va_end(args);
+    return rc;
+}
+
+/* this is included to make kdb.c vs. wkdb.c file comparisons easier in [x]emacs.*/
+#if NOT_USED_IN_READ_ONLY_SIDE
+/* VDrop
+ */
+static
+rc_t KDBDropInt ( KDirectory * dir, const KDBManager * mgr,
+                  const char * path )
+{
+}
+
+rc_t KDBMgrVDrop ( KDirectory * dir, const KDBManager * mgr, uint32_t obj_type,
+                   const char * path, va_list args )
+{
+}
+#endif
+
+/* KDBIsPathUri
+ * A hack to get some of VFS into KDB that is too tightly bound to KFS
+ */
+
+bool KDBIsPathUri (const char * path)
+{
+    const char * pc;
+    size_t z;
+
+    z = string_size (path);
+
+    if (NULL != (pc = string_chr (path, z, ':')))
+        return true;
+
+    if (NULL != (pc = string_chr (path, z, '?')))
+        return true;
+
+    if (NULL != (pc = string_chr (path, z, '#')))
+        return true;
+
+    return false;
+}
diff --git a/libs/kdb/kdbfmt-priv.h b/libs/kdb/kdbfmt-priv.h
new file mode 100644
index 0000000..1ffc30f
--- /dev/null
+++ b/libs/kdb/kdbfmt-priv.h
@@ -0,0 +1,76 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdbfmt_priv_
+#define _h_kdbfmt_priv_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KDBHdr
+ *  the various file types used:
+ *
+ *  a) metadata
+ *  b) key => id
+ *  c) id => key
+ *
+ * will begin with a standard header to tag format
+ */
+#define eByteOrderTag 0x05031988
+#define eByteOrderReverse 0x88190305
+
+typedef struct KDBHdr KDBHdr;
+struct KDBHdr
+{
+    uint32_t endian;
+    uint32_t version;
+};
+
+/* KDBHdrInit
+ *  simple initialization
+ */
+#define KDBHdrInit( hdr, vers ) \
+    ( void ) ( ( hdr ) -> endian = eByteOrderTag, ( hdr ) -> version = vers )
+
+/* KDBHdrValidate
+ *  validates that a header sports a supported byte order
+ *  and that the version is within range
+ */
+rc_t KDBHdrValidate ( const KDBHdr *hdr, size_t size,
+    uint32_t min_vers, uint32_t max_vers );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kdbfmt_priv_ */
diff --git a/libs/kdb/libkdb.vers.h b/libs/kdb/libkdb.vers.h
new file mode 100644
index 0000000..557fb9c
--- /dev/null
+++ b/libs/kdb/libkdb.vers.h
@@ -0,0 +1,27 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define LIBKDB_VERS 0x02070016
diff --git a/libs/kdb/meta.c b/libs/kdb/meta.c
new file mode 100644
index 0000000..efb6282
--- /dev/null
+++ b/libs/kdb/meta.c
@@ -0,0 +1,2141 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+#include <kdb/extern.h>
+
+struct KMDataNodeNamelist;
+#define KNAMELIST_IMPL struct KMDataNodeNamelist
+
+#define KONST const
+#include "kdb-priv.h"
+#include "dbmgr-priv.h"
+#include "database-priv.h"
+#include "table-priv.h"
+#include "column-priv.h"
+#include "kdbfmt-priv.h"
+#undef KONST
+
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <klib/container.h>
+#include <klib/pbstree.h>
+#include <klib/namelist.h>
+#include <klib/impl.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <klib/refcount.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <strtol.h>
+#include <os-native.h>
+#include <sysalloc.h>
+#include <strtol.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <byteswap.h>
+#include <assert.h>
+
+#define KMETADATAVERS 2
+#define NODE_SIZE_LIMIT ( 25 * 1024 * 1024 )
+#define NODE_CHILD_LIMIT ( 100 * 1024 )
+
+
+typedef struct KMDataNodeInflateData KMDataNodeInflateData;
+struct KMDataNodeInflateData
+{
+    const KMetadata *meta;
+    const KMDataNode *par;
+    BSTree *bst;
+    size_t node_size_limit;
+    uint32_t node_child_limit;
+    rc_t rc;
+    bool byteswap;
+};
+
+/*--------------------------------------------------------------------------
+ * KMetadata
+ *  a versioned, hierarchical structure
+ */
+struct KMetadata
+{
+    const KDirectory *dir;
+    const KDBManager *mgr;
+
+    /* owner */
+    const KDatabase *db;
+    const KTable *tbl;
+    const KColumn *col;
+
+    /* root node */
+    KMDataNode *root;
+
+    KRefcount refcount;
+    uint32_t vers;
+    uint32_t rev;
+    bool byteswap;
+    char path [ 1 ];
+};
+
+static
+KMetadata *KMetadataAttach ( const KMetadata *self );
+
+static
+rc_t KMetadataSever ( const KMetadata *self );
+
+
+/*--------------------------------------------------------------------------
+ * KMAttrNode
+ */
+typedef struct KMAttrNode KMAttrNode;
+struct KMAttrNode
+{
+    BSTNode n;
+    void *value;
+    size_t vsize;
+    char name [ 1 ];
+};
+
+static
+int64_t CC KMAttrNodeCmp ( const void *item, const BSTNode *n )
+{
+#define a ( ( const char* ) item )
+#define b ( ( const KMAttrNode* ) n )
+
+    return strcmp ( a, b -> name );
+
+#undef a
+#undef b
+}
+
+static
+int64_t CC KMAttrNodeSort ( const BSTNode *item, const BSTNode *n )
+{
+#define a ( ( const KMAttrNode* ) item )
+#define b ( ( const KMAttrNode* ) n )
+
+    return strcmp ( a -> name, b -> name );
+
+#undef a
+#undef b
+}
+
+static
+void CC KMAttrNodeWhack ( BSTNode *n, void *data )
+{
+    free ( n );
+}
+
+static
+bool CC KMAttrNodeInflate ( PBSTNode *n, void *data )
+{
+    KMAttrNode *b;
+    KMDataNodeInflateData *pb = data;
+
+    const char *name = n -> data . addr;
+    size_t size = strlen ( name );
+    if ( size >= n -> data . size )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+        return true;
+    }
+
+    /* v2 attributes are more easily allocated
+       as a single (name,value) block because
+       there are no other associated structures */
+    b = malloc ( sizeof * b + n -> data . size );
+    if ( b == NULL )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+        return true;
+    }
+
+    b -> value = & b -> name [ 1 + size ];
+    b -> vsize = n -> data . size - size - 1;
+    memmove ( b -> name, name, n -> data . size );
+    BSTreeInsert ( pb -> bst, & b -> n, KMAttrNodeSort );
+    return false;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KMDataNode
+ *  a node with an optional value,
+ *  optional attributes, and optional children
+ *
+ *  nodes are identified by path, relative to a starting node,
+ *  where "/" serves as a path separator.
+ */
+struct KMDataNode
+{
+    BSTNode n;
+    const KMDataNode *par;
+    const KMetadata *meta;
+    void *value;
+    size_t vsize;
+    BSTree attr;
+    BSTree child;
+    KRefcount refcount;
+    char name [ 1 ];
+};
+
+static
+int64_t CC KMDataNodeCmp ( const void *item, const BSTNode *n )
+{
+#define a ( ( const char* ) item )
+#define b ( ( const KMDataNode* ) n )
+
+    return strcmp ( a, b -> name );
+
+#undef a
+#undef b
+}
+
+static
+int64_t CC KMDataNodeSort ( const BSTNode *item, const BSTNode *n )
+{
+#define a ( ( const KMDataNode* ) item )
+#define b ( ( const KMDataNode* ) n )
+
+    return strcmp ( a -> name, b -> name );
+
+#undef a
+#undef b
+}
+
+static
+void CC KMDataNodeWhack ( BSTNode *n, void *data )
+{
+    KMDataNode *self = ( KMDataNode* ) n;
+
+    REFMSG ( "KMDataNode", "flush", & self -> refcount );
+
+    self -> meta = NULL;
+    atomic32_inc ( & self -> refcount );
+    KMDataNodeRelease ( self );
+}
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KMDataNodeAddRef ( const KMDataNode *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KMDataNode" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcMetadata, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeRelease ( const KMDataNode *cself )
+{
+    KMDataNode *self = ( KMDataNode* ) cself;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KMDataNode" ) )
+        {
+        case krefOkay:
+            return KMetadataSever ( self -> meta );
+        case krefWhack:
+
+            if ( self -> meta != NULL )
+                return KMetadataSever ( self -> meta );
+
+            KRefcountWhack ( & self -> refcount, "KMDataNode" );
+
+            BSTreeWhack ( & self -> attr, KMAttrNodeWhack, NULL );
+            BSTreeWhack ( & self -> child, KMDataNodeWhack, NULL );
+            free ( self -> value );
+            free ( self );
+            break;
+
+        case krefNegative:
+            return RC ( rcDB, rcMetadata, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Inflate
+ */
+static
+bool CC KMDataNodeInflate_v1 ( PBSTNode *n, void *data )
+{
+    void *value;
+    KMDataNode *b;
+    KMDataNodeInflateData *pb = data;
+
+    /* v1 metadata are flat, with the name
+       stored as a NUL terminated string
+       followed by value payload */
+    const char *name = n -> data . addr;
+    size_t size = strlen ( name );
+    if ( size >= n -> data . size )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+        return true;
+    }
+
+    b = malloc ( sizeof * b + size );
+    if ( b == NULL )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+        return true;
+    }
+
+    b -> par = pb -> par;
+    b -> meta = pb -> meta;
+    b -> value = ( void* ) ( name + size + 1 );
+    b -> vsize = n -> data . size - size - 1;
+    BSTreeInit ( & b -> attr );
+    BSTreeInit ( & b -> child );
+    KRefcountInit ( & b -> refcount, 0, "KMDataNode", "inflate", name );
+    strcpy ( b -> name, name );
+     
+    /* a name with no associated value */
+    if ( b -> vsize == 0 )
+    {
+        b -> value = NULL;
+        BSTreeInsert ( pb -> bst, & b -> n, KMDataNodeSort );
+        return false;
+    }
+
+    /* allocate value because v2+ code expects this */
+    value = malloc ( b -> vsize );
+    if ( value != NULL )
+    {
+        memmove ( value, b -> value, b -> vsize );
+        b -> value = value;
+        BSTreeInsert ( pb -> bst, & b -> n, KMDataNodeSort );
+        return false;
+    }
+
+    pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+    free ( b );
+    return true;
+}
+
+static
+rc_t KMDataNodeInflateAttr ( KMDataNode *n, bool byteswap )
+{
+    PBSTree *bst;
+    rc_t rc = PBSTreeMake ( & bst, n -> value, n -> vsize, byteswap );
+    if ( rc != 0 )
+        rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+    else
+    {
+        KMDataNodeInflateData pb;
+        size_t bst_size = PBSTreeSize ( bst );
+        
+        pb . meta = n -> meta;
+        pb . par = n;
+        pb . bst = & n -> attr;
+        pb . node_size_limit = NODE_SIZE_LIMIT;
+        pb . node_child_limit = NODE_CHILD_LIMIT;
+        pb . rc = 0;
+        pb . byteswap = byteswap;
+        PBSTreeDoUntil ( bst, 0, KMAttrNodeInflate, & pb );
+        rc = pb . rc;
+        
+        PBSTreeWhack ( bst );
+        
+        n -> value = ( char* ) n -> value + bst_size;
+        n -> vsize -= bst_size;
+    }
+    return rc;
+}
+
+static
+bool CC KMDataNodeInflate ( PBSTNode *n, void *data );
+
+static
+rc_t KMDataNodeInflateChild ( KMDataNode *n,
+    size_t node_size_limit, uint32_t node_child_limit, bool byteswap )
+{
+    PBSTree *bst;
+    rc_t rc = PBSTreeMake ( & bst, n -> value, n -> vsize, byteswap );
+    if ( rc != 0 )
+        rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+    else
+    {
+        uint32_t bst_count = PBSTreeCount ( bst );
+        size_t bst_size = PBSTreeSize ( bst );
+        if ( bst_count > node_child_limit )
+        {
+            PLOGMSG ( klogWarn, ( klogWarn,
+                                  "refusing to inflate metadata node '$(node)' within file '$(path)': "
+                                  "number of children ($(num_children)) exceeds limit ($(limit))."
+                                  , "node=%s,path=%s,num_children=%u,limit=%u"
+                                  , n -> name
+                                  , n -> meta -> path
+                                  , bst_count
+                                  , node_child_limit )
+                );
+        }
+        else if ( bst_size > node_size_limit )
+        {
+            PLOGMSG ( klogWarn, ( klogWarn,
+                                  "refusing to inflate metadata node '$(node)' within file '$(path)': "
+                                 "node size ($(node_size)) exceeds limit ($(limit))."
+                                 , "node=%s,path=%s,node_size=%zu,limit=%zu"
+                                 , n -> name
+                                 , n -> meta -> path
+                                 , bst_size
+                                 , node_size_limit )
+                );
+        }
+        else
+        {
+            KMDataNodeInflateData pb;
+            pb . meta = n -> meta;
+            pb . par = n;        
+            pb . bst = & n -> child;
+            pb . node_size_limit = node_size_limit;
+            pb . node_child_limit = node_child_limit;
+            pb . rc = 0;
+            pb . byteswap = byteswap;
+            PBSTreeDoUntil ( bst, 0, KMDataNodeInflate, & pb );
+            rc = pb . rc;
+        }
+        
+        PBSTreeWhack ( bst );
+        
+        n -> value = ( char* ) n -> value + bst_size;
+        n -> vsize -= bst_size;
+    }
+    return rc;
+}
+
+static
+bool CC KMDataNodeInflate ( PBSTNode *n, void *data )
+{
+    KMDataNode *b;
+    KMDataNodeInflateData *pb = data;
+
+    /* v2 names are preceded by a decremented length byte
+       that has its upper two bits dedicated to
+       signaling existence of attributes & children */
+    const char *name = n -> data . addr;
+    int bits = * ( ( const uint8_t* ) name ++ );
+    size_t size = ( bits >> 2 ) + 1;
+    if ( size >= n -> data . size )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+        return true;
+    }
+
+    b = malloc ( sizeof * b + size );
+    if ( b == NULL )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+        return true;
+    }
+
+    b -> par = pb -> par;
+    b -> meta = pb -> meta;
+    b -> value = ( void* ) ( name + size );
+    b -> vsize = n -> data . size - size - 1;
+    BSTreeInit ( & b -> attr );
+    BSTreeInit ( & b -> child );
+    KRefcountInit ( & b -> refcount, 0, "KMDataNode", "inflate", b -> name );
+    memmove ( b -> name, name, size );
+    b -> name [ size ] = 0;
+
+    pb -> rc = ( bits & 1 ) != 0 ? KMDataNodeInflateAttr ( b, pb -> byteswap ) : 0;
+    if ( pb -> rc == 0 )
+    {
+        pb -> rc = ( bits & 2 ) != 0 ?
+            KMDataNodeInflateChild ( b, pb -> node_size_limit, pb -> node_child_limit, pb -> byteswap ) : 0;
+        if ( pb -> rc == 0 )
+        {
+            void *value;
+
+            if ( b -> vsize == 0 )
+            {
+                b -> value = NULL;
+                BSTreeInsert ( pb -> bst, & b -> n, KMDataNodeSort );
+                return false;
+            }
+
+            value = malloc ( b -> vsize );
+            if ( value != NULL )
+            {
+                memmove ( value, b -> value, b -> vsize );
+                b -> value = value;
+                BSTreeInsert ( pb -> bst, & b -> n, KMDataNodeSort );
+                return false;
+            }
+            pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+
+            BSTreeWhack ( & b -> child, KMDataNodeWhack, NULL );
+        }
+
+        BSTreeWhack ( & b -> attr, KMAttrNodeWhack, NULL );
+    }
+
+    free ( b );
+    return true;
+}
+
+
+/* Find
+ */
+static
+rc_t KMDataNodeFind ( const KMDataNode *self, const KMDataNode **np, char **path )
+{
+    const KMDataNode *found;
+
+    char *end, *name = * path;
+
+    /* interpret leading '/' */
+    if ( name [ 0 ] == '/' )
+    {
+        while ( self -> par != NULL )
+            self = self -> par;
+        ++ name;
+    }
+
+    /* find node */
+    for ( found = self; name != NULL; self = found, name = end )
+    {
+        /* segment path */
+        end = strchr ( name, '/' );
+        if ( end != NULL )
+            * end ++ = 0;
+
+        /* interpret special paths */
+        switch ( name [ 0 ] )
+        {
+        case 0:
+            continue;
+        case '.':
+            switch ( name [ 1 ] )
+            {
+            case 0:
+                continue;
+            case '.':
+                if ( name [ 2 ] == 0 )
+                {
+                    /* this is a backup */
+                    if ( ( self = self -> par ) == NULL )
+                        return RC ( rcDB, rcMetadata, rcSelecting, rcPath, rcInvalid );
+                    continue;
+                }
+                break;
+            }
+            break;
+        }
+
+        /* find actual path */
+        found = ( const KMDataNode* )
+            BSTreeFind ( & self -> child, name, KMDataNodeCmp );
+        if ( found == NULL )
+        {
+            /* not found also gets partially found state */
+            if ( end != NULL )
+                end [ -1 ] = '/';
+            * path = name;
+            * np = self;
+            return SILENT_RC ( rcDB, rcMetadata, rcSelecting, rcPath, rcNotFound );
+        }
+    }
+
+    /* the current self is our guy */
+    * np = self;
+    return 0;
+}
+
+
+/* OpenNodeRead
+ * VOpenNodeRead
+ *  opens a metadata node
+ *
+ *  "node" [ OUT ] - return parameter for indicated metadata node
+ *
+ *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+ *  node within metadata hierarchy. when NULL, empty, ".", or "/",
+ *  return root node in "node". path separator is "/".
+ */
+LIB_EXPORT rc_t CC KMDataNodeVOpenNodeRead ( const KMDataNode *self,
+    const KMDataNode **node, const char *path, va_list args )
+{
+    rc_t rc;
+    KMDataNode *found;
+    char full [ 4096 ], *p = full;
+
+    if ( node == NULL )
+        return RC ( rcDB, rcNode, rcOpening, rcParam, rcNull );
+
+    * node = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcOpening, rcSelf, rcNull );
+
+    /* handle special NULL path */
+    if ( path == NULL )
+        full [ 0 ] = 0;
+    else
+    {
+        int len;
+
+        /* generate full path */
+        if ( args == NULL )
+            len = snprintf ( full, sizeof full, "%s", path );
+        else
+            len = vsnprintf ( full, sizeof full, path, args );
+        if ( len < 0 || len >= sizeof full )
+            return RC ( rcDB, rcNode, rcOpening, rcPath, rcExcessive );
+    }
+
+    rc = KMDataNodeFind ( self, ( const KMDataNode** ) & found, & p );
+    if ( rc == 0 )
+    {
+        KMetadataAttach ( found -> meta );
+        KMDataNodeAddRef ( found );
+        * node = found;
+    }
+
+    DBGMSG(DBG_KDB, DBG_FLAG(DBG_KDB_KDB),
+                ("KMDataNodeVOpenNodeRead(%s) = %d\n", full, rc));
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeOpenNodeRead ( const KMDataNode *self,
+    const KMDataNode **node, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KMDataNodeVOpenNodeRead ( self, node, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMetadataVOpenNodeRead ( const KMetadata *self,
+    const KMDataNode **node, const char *path, va_list args )
+{
+    rc_t rc = 0;
+
+    if ( node == NULL )
+        rc = RC ( rcDB, rcMetadata, rcOpening, rcParam, rcNull );
+    else if ( self == NULL )
+    {
+        * node = NULL;
+        rc = RC ( rcDB, rcMetadata, rcOpening, rcSelf, rcNull );
+    }
+    else
+        rc = KMDataNodeVOpenNodeRead ( self -> root, node, path, args );
+
+    DBGMSG(DBG_KDB, DBG_FLAG(DBG_KDB_KDB),
+                ("KMetadataVOpenNodeRead(%s) = %d\n", path, rc));
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMetadataOpenNodeRead ( const KMetadata *self,
+    const KMDataNode **node, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KMetadataVOpenNodeRead ( self, node, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* ByteOrder
+ *  indicates whether original byte order is reversed
+ *  under current architecture.
+ *
+ *  the byte order of the column is established by
+ *  the host architecture when created.
+ *
+ *  "reversed" [ OUT ] - if true, the original byte
+ *  order is reversed with regard to host native byte order.
+ */
+LIB_EXPORT rc_t CC KMDataNodeByteOrder ( const KMDataNode *self, bool *reversed )
+{
+    if ( self != NULL )
+        return KMetadataByteOrder ( self -> meta, reversed );
+
+    if ( reversed == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+
+    * reversed = false;
+    return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+}
+
+
+/* Read
+ *  read a node value or attribute
+ *
+ *  "offset" [ IN ] - initial offset into metadata
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - number of bytes actually read
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of bytes remaining to be read.
+ *  specifically, "offset" + "num_read" + "remaining" == sizeof node data
+ */
+LIB_EXPORT rc_t CC KMDataNodeRead ( const KMDataNode *self,
+    size_t offset, void *buffer, size_t bsize,
+    size_t *num_read, size_t *remaining )
+{
+    rc_t rc;
+
+    size_t dummy;
+    if ( remaining == NULL )
+        remaining = & dummy;
+
+    if ( num_read == NULL )
+        rc = RC ( rcDB, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcNode, rcReading, rcSelf, rcNull );
+        else if ( buffer == NULL && bsize != 0 )
+            rc = RC ( rcDB, rcNode, rcReading, rcBuffer, rcNull );
+        else
+        {
+            size_t to_read, avail = self -> vsize;
+            if ( offset > avail )
+                offset = avail;
+
+            to_read = avail -= offset;
+            if ( to_read > bsize )
+                to_read = bsize;
+
+            if ( to_read > 0 )
+                memmove ( buffer, ( const char* ) self -> value + offset, to_read );
+
+            * num_read = to_read;
+            * remaining = avail - to_read;
+
+            return 0;
+        }
+
+        * num_read = 0;
+    }
+
+    * remaining = 0;
+    return rc;
+}
+
+
+/* Addr - PRIVATE
+ *  reach into node and get address
+ *  returns raw pointer and node size
+ */
+LIB_EXPORT rc_t CC KMDataNodeAddr ( const KMDataNode *self,
+    const void **addr, size_t *size )
+{
+    rc_t rc;
+
+    size_t dummy;
+    if ( size == NULL )
+        size = & dummy;
+
+    if ( addr == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcMetadata, rcReading, rcSelf, rcNull );
+        else
+        {
+            * addr = self -> value;
+            * size = self -> vsize;
+
+            return 0;
+        }
+
+        * addr = NULL;
+    }
+
+    * size = 0;
+    return rc;
+}
+
+
+/* Read ( formatted )
+ *  reads as integer or float value in native byte order
+ *
+ *  "bXX" [ OUT ] - return parameter for numeric value
+ */
+LIB_EXPORT rc_t CC KMDataNodeReadB8 ( const KMDataNode *self, void *b8 )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, b8, 1,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+        if ( num_read < 1 )
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadB16 ( const KMDataNode *self, void *b16 )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, b16, 2,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+        if ( num_read < 2 )
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+
+        if ( self -> meta -> byteswap )
+            * ( uint16_t* ) b16 = bswap_16 ( * ( const uint16_t* ) b16 );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadB32 ( const KMDataNode *self, void *b32 )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, b32, 4,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+        if ( num_read < 4 )
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+
+        if ( self -> meta -> byteswap )
+            * ( uint32_t* ) b32 = bswap_32 ( * ( const uint32_t* ) b32 );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadB64 ( const KMDataNode *self, void *b64 )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, b64, 8,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+        if ( num_read < 8 )
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+
+        if ( self -> meta -> byteswap )
+            * ( uint64_t* ) b64 = bswap_64 ( * ( const uint64_t* ) b64 );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadB128 ( const KMDataNode *self, void *b128 )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, b128, 16,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+        if ( num_read < 16 )
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+
+        if ( self -> meta -> byteswap )
+        {
+            uint64_t *b64 = b128;
+            uint64_t tmp = bswap_64 ( b64 [ 0 ] );
+            b64 [ 0 ] = bswap_64 ( b64 [ 1 ] );
+            b64 [ 1 ] = tmp;
+        }
+    }
+    return rc;
+}
+
+
+/* ReadAs ( formatted )
+ *  reads as integer or float value in native byte order
+ *  casts smaller-sized values to desired size, e.g.
+ *    uint32_t to uint64_t
+ *
+ *  "i" [ OUT ] - return parameter for signed integer
+ *  "u" [ OUT ] - return parameter for unsigned integer
+ *  "f" [ OUT ] - return parameter for double float
+ */
+LIB_EXPORT rc_t CC KMDataNodeReadAsI16 ( const KMDataNode *self, int16_t *i )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, i, sizeof * i,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * i = ( ( const int8_t* ) i ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * i = bswap_16 ( * i );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsU16 ( const KMDataNode *self, uint16_t *u )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, u, sizeof * u,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * u = ( ( const uint8_t* ) u ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * u = bswap_16 ( * u );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsI32 ( const KMDataNode *self, int32_t *i )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, i, sizeof * i,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * i = ( ( const int8_t* ) i ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * i = bswap_16 ( ( ( const int16_t* ) i ) [ 0 ] );
+            else
+                * i = ( ( const int16_t* ) i ) [ 0 ];
+            break;
+        case 4:
+            if ( self -> meta -> byteswap )
+                * i = bswap_32 ( * i );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsU32 ( const KMDataNode *self, uint32_t *u )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, u, sizeof * u,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * u = ( ( const uint8_t* ) u ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * u = bswap_16 ( ( ( const uint16_t* ) u ) [ 0 ] );
+            else
+                * u = ( ( const uint16_t* ) u ) [ 0 ];
+            break;
+        case 4:
+            if ( self -> meta -> byteswap )
+                * u = bswap_32 ( * u );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsI64 ( const KMDataNode *self, int64_t *i )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, i, sizeof * i,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * i = ( ( const int8_t* ) i ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * i = bswap_16 ( ( ( const int16_t* ) i ) [ 0 ] );
+            else
+                * i = ( ( const int16_t* ) i ) [ 0 ];
+            break;
+        case 4:
+            if ( self -> meta -> byteswap )
+                * i = bswap_32 ( ( ( const int32_t* ) i ) [ 0 ] );
+            else
+                * i = ( ( const int32_t* ) i ) [ 0 ];
+            break;
+        case 8:
+            if ( self -> meta -> byteswap )
+                * i = bswap_64 ( * i );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsU64 ( const KMDataNode *self, uint64_t *u )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, u, sizeof * u,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * u = ( ( const uint8_t* ) u ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * u = bswap_16 ( ( ( const uint16_t* ) u ) [ 0 ] );
+            else
+                * u = ( ( const uint16_t* ) u ) [ 0 ];
+            break;
+        case 4:
+            if ( self -> meta -> byteswap )
+                * u = bswap_32 ( ( ( const uint32_t* ) u ) [ 0 ] );
+            else
+                * u = ( ( const uint32_t* ) u ) [ 0 ];
+            break;
+        case 8:
+            if ( self -> meta -> byteswap )
+                * u = bswap_64 ( * u );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsF64 ( const KMDataNode *self, double *f )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, f, sizeof * f,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 4:
+            if ( self -> meta -> byteswap )
+                * ( uint32_t* ) f = bswap_32 ( * ( const uint32_t* ) f );
+            * f = ( ( const float* ) f ) [ 0 ];
+            break;
+        case 8:
+            if ( self -> meta -> byteswap )
+                * ( uint64_t* ) f = bswap_64 ( * ( const uint64_t* ) f );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+
+/* Read ( formatted )
+ *  reads as C-string
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated string.
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+LIB_EXPORT rc_t CC KMDataNodeReadCString ( const KMDataNode *self,
+    char *buffer, size_t bsize, size_t *size )
+{
+    size_t remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, buffer, bsize - 1, size, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+        {
+            * size += remaining;
+            return RC ( rcDB, rcMetadata, rcReading, rcBuffer, rcInsufficient );
+        }
+
+        buffer [ * size ] = 0;
+    }
+    return rc;
+}
+
+
+/* ReadAttr
+ *  reads as NUL-terminated string
+ *
+ *  "name" [ IN ] - NUL terminated attribute name
+ *
+ *  "buffer" [ OUT ] and "bsize" - return parameter for attribute value
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+LIB_EXPORT rc_t CC KMDataNodeReadAttr ( const KMDataNode *self, const char *name,
+    char *buffer, size_t bsize, size_t *size )
+{
+    rc_t rc;
+
+    if ( size == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcMetadata, rcReading, rcSelf, rcNull );
+        else if ( name == NULL )
+            rc = RC ( rcDB, rcMetadata, rcReading, rcString, rcNull );
+        else if ( name [ 0 ] == 0 )
+            rc = RC ( rcDB, rcMetadata, rcReading, rcString, rcEmpty );
+        else if ( buffer == NULL && bsize != 0 )
+            rc = RC ( rcDB, rcMetadata, rcReading, rcBuffer, rcNull );
+        else
+        {
+            const KMAttrNode *n = ( const KMAttrNode* )
+                BSTreeFind ( & self -> attr, name, KMAttrNodeCmp );
+            if ( n == NULL )
+            {
+                * size = 0;
+                if ( bsize != 0 )
+                    buffer [ 0 ] = 0;
+                rc = SILENT_RC ( rcDB, rcMetadata, rcReading, rcAttr, rcNotFound );
+            }
+            else
+            {
+                * size = n -> vsize;
+                if ( n -> vsize < bsize )
+                {
+                    memmove ( buffer, n -> value, n -> vsize );
+                    buffer [ n -> vsize ] = 0;
+                    return 0;
+                }
+
+                return RC ( rcDB, rcMetadata, rcReading, rcBuffer, rcInsufficient );
+            }
+        }
+
+        * size = 0;
+    }
+
+    return rc;
+}
+
+
+/* ReadAttrAs ( formatted )
+ *  reads as integer or float value in native byte order
+ *  casts smaller-sized values to desired size, e.g.
+ *    uint32_t to uint64_t
+ *
+ *  "i" [ OUT ] - return parameter for signed integer
+ *  "u" [ OUT ] - return parameter for unsigned integer
+ *  "f" [ OUT ] - return parameter for double float
+ */
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsI16 ( const KMDataNode *self, const char *attr, int16_t *i )
+{
+    rc_t rc;
+    if ( i == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            int64_t val = strtoi64 ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else if ( val < SHRT_MIN || val > SHRT_MAX )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcRange, rcExcessive );
+            else
+            {
+                * i = ( int16_t ) val;
+                return 0;
+            }
+        }
+
+        * i = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsU16 ( const KMDataNode *self, const char *attr, uint16_t *u )
+{
+    rc_t rc;
+    if ( u == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            uint64_t val = strtou64 ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else if ( val > USHRT_MAX )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcRange, rcExcessive );
+            else
+            {
+                * u = ( uint16_t ) val;
+                return 0;
+            }
+        }
+
+        * u = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsI32 ( const KMDataNode *self, const char *attr, int32_t *i )
+{
+    rc_t rc;
+    if ( i == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            int64_t val = strtoi64 ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else if ( val < INT_MIN || val > INT_MAX )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcRange, rcExcessive );
+            else
+            {
+                * i = ( int32_t ) val;
+                return 0;
+            }
+        }
+
+        * i = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsU32 ( const KMDataNode *self, const char *attr, uint32_t *u )
+{
+    rc_t rc;
+    if ( u == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            uint64_t val = strtou64 ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else if ( val > UINT_MAX )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcRange, rcExcessive );
+            else
+            {
+                * u = ( uint32_t ) val;
+                return 0;
+            }
+        }
+
+        * u = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsI64 ( const KMDataNode *self, const char *attr, int64_t *i )
+{
+    rc_t rc;
+    if ( i == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            int64_t val =  strtoi64 ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else
+            {
+                * i = val;
+                return 0;
+            }
+        }
+
+        * i = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsU64 ( const KMDataNode *self, const char *attr, uint64_t *u )
+{
+    rc_t rc;
+    if ( u == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            uint64_t val =  strtou64 ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else
+            {
+                * u = val;
+                return 0;
+            }
+        }
+
+        * u = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsF64 ( const KMDataNode *self, const char *attr, double *f )
+{
+    rc_t rc;
+    if ( f == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            double val = strtod ( buffer, & end );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else
+            {
+                * f = val;
+                return 0;
+            }
+        }
+
+        * f = 0.0;
+    }
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KMetadata
+ *  a versioned, hierarchical structure
+ */
+
+/* Whack
+ */
+static
+rc_t KMetadataWhack ( KMetadata *self )
+{
+    rc_t rc = 0;
+
+    KRefcountWhack ( & self -> refcount, "KMetadata" );
+
+    if ( self -> db != NULL )
+    {
+        rc = KDatabaseSever ( self -> db );
+        if ( rc == 0 )
+            self -> db = NULL;
+    }
+    else if ( self -> tbl != NULL )
+    {
+        rc = KTableSever ( self -> tbl );
+        if ( rc == 0 )
+            self -> tbl = NULL;
+    }
+    else if ( self -> col != NULL )
+    {
+        rc = KColumnSever ( self -> col );
+        if ( rc == 0 )
+            self -> col = NULL;
+    }
+
+    if ( rc == 0 )
+        rc = KDBManagerSever ( self -> mgr );
+
+    if ( rc == 0 )
+    {
+        KDirectoryRelease ( self -> dir );
+        KMDataNodeWhack ( ( BSTNode* ) & self -> root -> n, NULL );
+        free ( self );
+        return 0;
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "KMetadata", "whack", "kmeta" );
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KMetadataAddRef ( const KMetadata *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KMetadata" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcMetadata, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KMetadataRelease ( const KMetadata *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KMetadata" ) )
+        {
+        case krefWhack:
+            return KMetadataWhack ( ( KMetadata* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcMetadata, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+static
+KMetadata *KMetadataAttach ( const KMetadata *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KMetadata" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KMetadata* ) self;
+}
+
+static
+rc_t KMetadataSever ( const KMetadata *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KMetadata" ) )
+        {
+        case krefWhack:
+            return KMetadataWhack ( ( KMetadata* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcMetadata, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Make
+ */
+
+static
+rc_t KMetadataPopulate ( KMetadata *self, const KDirectory *dir, const char *path )
+{
+    const KFile *f;
+    rc_t rc = KDirectoryOpenFileRead ( dir, & f, "%s", path );
+    if ( rc == 0 )
+    {
+        const KMMap *mm;
+        rc = KMMapMakeRead ( & mm, f );
+        if ( rc == 0 )
+        {
+            size_t size;
+            const void *addr;
+            rc = KMMapSize ( mm, & size );
+            if ( rc == 0 )
+                rc = KMMapAddrRead ( mm, & addr );
+
+            if ( rc == 0 )
+            {
+                union
+                {
+                    KDBHdr v1;
+                    KDBHdr v2;
+                } hdrs;
+
+                const KDBHdr *hdr = ( const KDBHdr* ) addr;
+                const void *pbstree_src = hdr + 1;
+
+                rc = KDBHdrValidate ( hdr, size, 1, KMETADATAVERS );
+                if ( GetRCState ( rc ) == rcIncorrect && GetRCObject ( rc ) == rcByteOrder )
+                {
+                    hdrs . v1 . endian = bswap_32 ( hdr -> endian );
+                    hdrs . v1 . version = bswap_32 ( hdr -> version );
+                    rc = KDBHdrValidate ( & hdrs . v1, size, 1, KMETADATAVERS );
+                    if ( rc == 0 )
+                    {
+                        self -> byteswap = true;
+                        switch ( hdrs . v1 . version )
+                        {
+                        case 1:
+                            hdr = & hdrs . v1;
+                            break;
+                        case 2:
+                            hdr = & hdrs . v2;
+                            break;
+                        }
+                    }
+                }
+                if ( rc == 0 )
+                {
+                    PBSTree *bst;
+                    rc = PBSTreeMake ( & bst, pbstree_src, size - sizeof * hdr, self -> byteswap );
+                    if ( rc != 0 )
+                        rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+                    else
+                    {
+                        KMDataNodeInflateData pb;
+
+                        pb . meta = self;
+                        pb . par = self -> root;
+                        pb . bst = & self -> root -> child;
+                        pb . node_size_limit = NODE_SIZE_LIMIT;
+                        pb . node_child_limit = NODE_CHILD_LIMIT;
+                        pb . rc = 0;
+                        pb . byteswap = self -> byteswap;
+
+                        if ( hdr -> version == 1 )
+                            PBSTreeDoUntil ( bst, 0, KMDataNodeInflate_v1, & pb );
+                        else
+                            PBSTreeDoUntil ( bst, 0, KMDataNodeInflate, & pb );
+                        rc = pb . rc;
+
+                        self -> vers = hdr -> version;
+
+                        PBSTreeWhack ( bst );
+                    }
+                }
+            }
+
+            KMMapRelease ( mm );
+        }
+
+        KFileRelease ( f );
+    }
+    return rc;
+}
+
+static
+rc_t KMetadataMakeRead ( KMetadata **metap,
+    const KDirectory *dir, const char *path, uint32_t rev )
+{
+    rc_t rc;
+    KMetadata *meta = malloc ( sizeof * meta + strlen ( path ) );
+    if ( meta == NULL )
+        rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        memset ( meta, 0, sizeof * meta );
+        meta -> root = calloc ( 1, sizeof * meta -> root );
+        if ( meta -> root == NULL )
+            rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            meta -> root -> meta = meta;
+            meta -> dir = dir;
+            KRefcountInit ( & meta -> refcount, 1, "KMetadata", "make-read", path );
+            meta -> rev = rev;
+            meta -> byteswap = false;
+            strcpy ( meta -> path, path );
+
+            KRefcountInit ( & meta -> root -> refcount, 0, "KMDataNode", "make-read", "/" );
+
+            rc = KMetadataPopulate ( meta, dir, path );
+            if ( rc == 0 )
+            {
+                KDirectoryAddRef ( dir );
+                * metap = meta;
+                return 0;
+            }
+
+            free ( meta -> root );
+        }
+
+        free ( meta );
+    }
+    * metap = NULL;
+    return rc;
+}
+
+
+/* OpenMetadataRead
+ *  opens metadata for read
+ *
+ *  "meta" [ OUT ] - return parameter for metadata
+ */
+static
+rc_t KDBManagerOpenMetadataReadInt ( const KDBManager *self,
+    KMetadata **metap, const KDirectory *wd, uint32_t rev, bool prerelease )
+{
+    char metapath [ 4096 ];
+    rc_t rc = ( prerelease == 1 ) ?
+        KDirectoryVResolvePath ( wd, true, metapath, sizeof metapath, "meta", NULL ):
+        ( ( rev == 0 ) ?
+          KDirectoryVResolvePath ( wd, true, metapath, sizeof metapath, "md/cur", NULL ):
+          KDirectoryResolvePath ( wd, true, metapath, sizeof metapath, "md/r%.3u", rev ) );
+    if ( rc == 0 )
+    {
+        KMetadata *meta;
+
+        switch ( KDirectoryPathType ( wd, "%s", metapath ) )
+        {
+        case kptNotFound:
+            return RC ( rcDB, rcMgr, rcOpening, rcMetadata, rcNotFound );
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcInvalid );
+        case kptFile:
+        case kptFile | kptAlias:
+            break;
+        default:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcIncorrect );
+        }
+
+        rc = KMetadataMakeRead ( & meta, wd, metapath, rev );
+        if ( rc == 0 )
+        {
+            meta -> mgr = KDBManagerAttach ( self );
+            * metap = meta;
+            return 0;
+        }
+    }
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenMetadataRead ( const KDatabase *self, const KMetadata **metap )
+{
+    rc_t rc;
+    KMetadata *meta;
+
+    if ( metap == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * metap = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    rc = KDBManagerOpenMetadataReadInt ( self -> mgr, & meta, self -> dir, 0, false );
+    if ( rc == 0 )
+    {
+        meta -> db = KDatabaseAttach ( self );
+        * metap = meta;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableOpenMetadataRead ( const KTable *self, const KMetadata **metap )
+{
+    rc_t rc;
+    KMetadata *meta;
+
+    if ( metap == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcParam, rcNull );
+
+    * metap = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcSelf, rcNull );
+
+    rc = KDBManagerOpenMetadataReadInt ( self -> mgr, & meta,
+        self -> dir, 0, self -> prerelease );
+    if ( rc == 0 )
+    {
+        meta -> tbl = KTableAttach ( self );
+        * metap = meta;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnOpenMetadataRead ( const KColumn *self, const KMetadata **metap )
+{
+    rc_t rc;
+    KMetadata *meta;
+
+    if ( metap == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcParam, rcNull );
+
+    * metap = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcSelf, rcNull );
+
+    rc = KDBManagerOpenMetadataReadInt ( self -> mgr, & meta, self -> dir, 0, false );
+    if ( rc == 0 )
+    {
+        meta -> col = KColumnAttach ( self );
+        * metap = meta;
+    }
+
+    return rc;
+}
+
+
+/* Version
+ *  returns the metadata format version
+ */
+LIB_EXPORT rc_t CC KMetadataVersion ( const KMetadata *self, uint32_t *version )
+{
+    if ( version == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * version = 0;
+        return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+    }
+
+    * version = self -> vers;
+    return 0;
+}
+
+
+/* ByteOrder
+ *  indicates whether original byte order is reversed
+ *  under current architecture.
+ *
+ *  the byte order of the column is established by
+ *  the host architecture when created.
+ *
+ *  "reversed" [ OUT ] - if true, the original byte
+ *  order is reversed with regard to host native byte order.
+ */
+LIB_EXPORT rc_t CC KMetadataByteOrder ( const KMetadata *self, bool *reversed )
+{
+    if ( reversed == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * reversed = false;
+        return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+    }
+
+    * reversed = self -> byteswap;
+    return 0;
+}
+
+
+/* Revision
+ *  returns current revision number
+ *  where 0 ( zero ) means tip
+ */
+LIB_EXPORT rc_t CC KMetadataRevision ( const KMetadata *self, uint32_t *revision )
+{
+    if ( revision == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * revision = 0;
+        return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+    }
+
+    * revision = self -> rev;
+    return 0;
+}
+
+
+/* MaxRevision
+ *  returns the maximum revision available
+ */
+LIB_EXPORT rc_t CC KMetadataMaxRevision ( const KMetadata *self, uint32_t *revision )
+{
+    if ( revision == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+
+    * revision = 0;
+
+    if ( self != NULL )
+    {
+        KNamelist *listing;
+        rc_t rc = KDirectoryList ( self -> dir,
+            & listing, NULL, NULL, "md" );
+        if ( rc == 0 )
+        {
+            uint32_t rev_max, count;
+            rc = KNamelistCount ( listing, & count );
+            if ( rc == 0 )
+            {
+                uint32_t idx;
+                for ( rev_max = idx = 0; idx < count; ++ idx )
+                {
+                    const char *name;
+                    
+                    rc = KNamelistGet ( listing, idx, & name );
+                    if ( rc != 0 )
+                        break;
+                    
+                    if ( name [ 0 ] == 'r' )
+                    {
+                        char *end;
+                        uint32_t rev = strtou32 ( name + 1, & end, 10 );
+                        if ( end [ 0 ] == 0 && rev > rev_max )
+                            rev_max = rev;
+                    }
+                }
+
+                * revision = rev_max;
+            }
+                
+            KNamelistRelease ( listing );
+        }
+        else if ( GetRCState ( rc ) == rcNotFound )
+        {
+            rc = 0;
+        }
+
+        return rc;
+    }
+
+    return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+}
+
+
+/* OpenRevision
+ *  opens a read-only indexed revision of metadata
+ */
+LIB_EXPORT rc_t CC KMetadataOpenRevision ( const KMetadata *self,
+    const KMetadata **metap, uint32_t revision )
+{
+    rc_t rc;
+    KMetadata *meta;
+
+    if ( metap == NULL )
+        return RC ( rcDB, rcMetadata, rcOpening, rcParam, rcNull );
+
+    * metap = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMetadata, rcOpening, rcSelf, rcNull );
+
+    rc = KDBManagerOpenMetadataReadInt ( self -> mgr,
+        & meta, self -> dir, revision, false );
+    if ( rc == 0 )
+    {
+        if ( self -> db != NULL )
+            meta -> db = KDatabaseAttach ( self -> db );
+        else if ( self -> tbl != NULL )
+            meta -> tbl = KTableAttach ( self -> tbl );
+        else if ( self -> col != NULL )
+            meta -> col = KColumnAttach ( self -> col );
+
+        * metap = meta;
+    }
+
+    return rc;
+}
+
+
+/* GetSequence
+ *  access a named sequence
+ *
+ *  "seq" [ IN ] - NUL terminated sequence name
+ *
+ *  "val" [ OUT ] - return parameter for sequence value
+ */
+LIB_EXPORT rc_t CC KMetadataGetSequence ( const KMetadata *self,
+    const char *seq, int64_t *val )
+{
+    rc_t rc;
+    const KMDataNode *found;
+
+    if ( val == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+
+    * val = 0;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+
+    if ( seq == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcString, rcNull );
+    if ( seq [ 0 ] == 0 )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcString, rcInvalid );
+
+    rc = KMDataNodeOpenNodeRead
+        ( self -> root, & found, ".seq/%s", seq );
+    if ( rc == 0 )
+    {
+        size_t num_read, remaining;
+        rc = KMDataNodeRead ( found, 0, val, sizeof * val, & num_read, & remaining );
+        assert ( rc != 0 || ( num_read == sizeof * val && remaining == 0 ) );
+        KMDataNodeRelease ( found );
+    }
+
+    return rc;
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * KNamelist
+ */
+typedef struct KMDataNodeNamelist KMDataNodeNamelist;
+struct KMDataNodeNamelist
+{
+    KNamelist dad;
+    const KMDataNode *node;
+    size_t count;
+    const char *namelist [ 1 ];
+};
+
+/* Whack
+ */
+static
+rc_t CC KMDataNodeNamelistWhack ( KMDataNodeNamelist *self )
+{
+    rc_t rc = KMDataNodeRelease ( self -> node );
+    if ( rc == 0 )
+        free ( self );
+    return rc;
+}
+
+/* Count
+ */
+static
+rc_t CC KMDataNodeNamelistCount ( const KMDataNodeNamelist *self, uint32_t *count )
+{
+    * count = ( uint32_t ) self -> count;
+    return 0;
+}
+
+/* Get
+ */
+static
+rc_t CC KMDataNodeNamelistGet ( const KMDataNodeNamelist *self,
+    uint32_t idx, const char **name )
+{
+    if ( ( size_t ) idx >= self -> count )
+        return RC ( rcDB, rcNamelist, rcAccessing, rcParam, rcInvalid );
+    * name = self -> namelist [ idx ];
+    return 0;
+}
+
+/* Make
+ */
+static KNamelist_vt_v1 vtKMDataNodeNamelist =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* start minor version 0 methods */
+    KMDataNodeNamelistWhack,
+    KMDataNodeNamelistCount,
+    KMDataNodeNamelistGet
+    /* end minor version 0 methods */
+};
+
+static
+rc_t KMDataNodeNamelistMake ( KNamelist **names, uint32_t count )
+{
+    rc_t rc;
+    KMDataNodeNamelist *self = calloc ( 1, sizeof * self -
+        sizeof self -> namelist + count * sizeof self -> namelist [ 0 ] );
+    if ( self == NULL )
+        rc = RC ( rcDB, rcMetadata, rcListing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KNamelistInit ( & self -> dad,
+            ( const KNamelist_vt* ) & vtKMDataNodeNamelist );
+        if ( rc == 0 )
+        {
+            * names = & self -> dad;
+            return 0;
+        }
+        
+        free ( self );
+    }
+
+    return rc;
+}
+
+/* List
+ *  create metadata node listings
+ */
+static
+void CC KMDataNodeListCount ( BSTNode *n, void *data )
+{
+    * ( uint32_t* ) data += 1;
+}
+
+static
+void CC KMDataNodeGrabAttr ( BSTNode *n, void *data )
+{
+    KMDataNodeNamelist *list = data;
+    list -> namelist [ list -> count ++ ] = ( ( const KMAttrNode* ) n ) -> name;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeListAttr ( const KMDataNode *self, KNamelist **names )
+{
+    if ( names == NULL )
+        return RC ( rcDB, rcMetadata, rcListing, rcParam, rcNull );
+
+    * names = NULL;
+
+    if ( self != NULL )
+    {
+        rc_t rc;
+
+        uint32_t count = 0;
+        BSTreeForEach ( & self -> attr, 0, KMDataNodeListCount, & count );
+
+        rc = KMDataNodeNamelistMake ( names, count );
+        if ( rc == 0 )
+            BSTreeForEach ( & self -> attr, 0, KMDataNodeGrabAttr, * names );
+
+        return rc;
+    }
+
+    return RC ( rcDB, rcMetadata, rcListing, rcSelf, rcNull );
+}
+
+static
+void CC KMDataNodeGrabName ( BSTNode *n, void *data )
+{
+    KMDataNodeNamelist *list = data;
+    list -> namelist [ list -> count ++ ] = ( ( const KMDataNode* ) n ) -> name;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeListChildren ( const KMDataNode *self, KNamelist **names )
+{
+    if ( names == NULL )
+        return RC ( rcDB, rcMetadata, rcListing, rcParam, rcNull );
+
+    * names = NULL;
+
+    if ( self != NULL )
+    {
+        rc_t rc;
+
+        uint32_t count = 0;
+        BSTreeForEach ( & self -> child, 0, KMDataNodeListCount, & count );
+
+        rc = KMDataNodeNamelistMake ( names, count );
+        if ( rc == 0 )
+            BSTreeForEach ( & self -> child, 0, KMDataNodeGrabName, * names );
+
+        return rc;
+    }
+
+    return RC ( rcDB, rcMetadata, rcListing, rcSelf, rcNull );
+}
diff --git a/libs/kdb/ptrieval-v1.c b/libs/kdb/ptrieval-v1.c
new file mode 100644
index 0000000..5f6634f
--- /dev/null
+++ b/libs/kdb/ptrieval-v1.c
@@ -0,0 +1,265 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#include "index-priv.h"
+#include "idstats-priv.h"
+
+#include <kdb/index.h>
+#include <klib/ptrie.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <endian.h>
+#include <byteswap.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndexCCParms
+ *  consistency check parameter block
+ */
+typedef struct KPTrieIndexCCParms_v1 KPTrieIndexCCParms_v1;
+struct KPTrieIndexCCParms_v1
+{
+    KIdStats stats;
+    rc_t rc;
+    const KPTrieIndex_v1 *self;
+    const KIndex *outer;
+    bool key2id;
+    bool id2key;
+    bool failed;
+};
+
+/* Init
+ */
+static
+void KPTrieIndexCCParmsInit_v1 ( KPTrieIndexCCParms_v1 *pb,
+    const KPTrieIndex_v1 *self, const KIndex *outer, bool key2id, bool id2key )
+{
+    KIdStatsInit ( & pb -> stats );
+    pb -> rc = 0;
+    pb -> self = self;
+    pb -> outer = outer;
+    pb -> key2id = key2id;
+    pb -> id2key = self -> id2node ? id2key : false;
+    pb -> failed = false;
+}
+
+/* Whack
+ */
+static
+void KPTrieIndexCCParmsWhack_v1 ( KPTrieIndexCCParms_v1 *pb )
+{
+    KIdStatsWhack ( & pb -> stats );
+}
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndex_v1
+ *  persisted keymap
+ */
+
+/* CheckConsistency
+ *  runs a consistency check as efficiently as possible
+ *
+ *  in all cases, we make use of "PTrieForEach" to visit each node
+ *  using the natural storage order. each node returned is counted,
+ *  read and inserted into a BSTree whose nodes merge adjacent and
+ *  overlapping ids into existing nodes.
+ *
+ *  if running a deep "key->id" test, then the key is first regenerated
+ *  from the node, and then used to retrieve the id via the KIndex.
+ *
+ *  if the projection index exists, the id is tested against the node
+ *  to ensure that projection works. if "id->key" is true, then use
+ *  the KIndex to produce a key and compare it against the node.
+ */
+static
+bool CC KPTrieIndexCCVisit_v1 ( PTNode *n, void *data )
+{
+    KPTrieIndexCCParms_v1 *pb = data;
+    const KPTrieIndex_v1 *self = pb -> self;
+
+    /* payload of v1 PTNode is a 32-bit spot id */
+    uint32_t id;
+    assert ( n -> data . size == sizeof id );
+    memmove ( & id, n -> data . addr, sizeof id );
+    if ( self -> byteswap )
+        id = bswap_32 ( id );
+
+    /* record the node, row id, and range of 1 */
+    pb -> rc = KIdStatsInsert ( & pb -> stats, id, 1 );
+    if ( pb -> rc != 0 )
+    {
+        PLOGERR ( klogSys, ( klogSys, pb -> rc, "failed when examining node id $(nid) with row id $(rid)",
+                              "nid=0x%08x,rid=%u", n -> id, id ));
+        return true;
+    }
+
+    /* if we have a projection index, test it */
+    if ( self -> id2node != NULL )
+    {
+        if ( id < self -> first || id > self -> last )
+        {
+            PLOGMSG ( klogWarn, ( klogWarn, "node id $(nid) with row id $(rid) is not within projection range of $(min_rid)..$(max_rid)",
+                                 "nid=0x%08x,rid=%u,min_rid=%u,max_rid=%u", n -> id, id, self -> first, self -> last ));
+            pb -> failed = true;
+            return false;
+        }
+        if ( self -> id2node [ id - self -> first ] != n -> id )
+        {
+            PLOGMSG ( klogWarn, ( klogWarn, "node id $(nid) with row id $(rid) does not match projection node id of $(pnid)",
+                                 "nid=0x%08x,rid=%u,pnid=0x%08x", n -> id, id, self -> id2node [ id - self -> first ] ));
+            pb -> failed = true;
+            return false;
+        }
+    }
+
+    /* if performing deeper tests */
+    if ( pb -> key2id || pb -> id2key )
+    {
+        rc_t rc;
+        int64_t start_id;
+        uint64_t id_count;
+
+        /* need to recover key from given node */
+        const String *orig;
+        pb -> rc = PTNodeMakeKey ( n, & orig );
+        if ( pb -> rc != 0 )
+        {
+            PLOGERR ( klogSys, ( klogSys, pb -> rc, "failed when retrieving text for node id $(nid) with row id $(rid)",
+                                 "nid=0x%08x,rid=%u", n -> id, id ));
+            return true;
+        }
+
+        /* key->id test */
+        if ( pb -> key2id )
+        {
+            rc = KIndexFindText ( pb -> outer, orig -> addr, & start_id, & id_count, NULL, NULL );
+            if ( rc != 0 )
+            {
+                PLOGERR ( klogWarn, ( klogWarn, rc, "failed to retrieve start id and count for key '$(key)', row id $(rid)",
+                                      "key=%S,rid=%u", orig, id ) );
+                pb -> failed = true;
+            }
+            else if ( start_id != ( int64_t ) id || id_count != 1 )
+            {
+                PLOGERR ( klogWarn, ( klogWarn, rc, "key '$(key)' maps to start id $(start_id), count $(id_count): expected id $(rid), count 1.",
+                                      "key=%S,rid=%u,start_id=%ld,id_count=%lu", orig, id, start_id, id_count ) );
+                pb -> failed = true;
+            }
+        }
+
+        /* id->key test */
+        if ( pb -> id2key )
+        {
+            char buffer [ 256 ], *key = buffer;
+            size_t key_size, bsize = sizeof buffer;
+            if ( sizeof buffer <= orig -> size )
+            {
+                key = malloc ( bsize = orig -> size + 1 );
+                if ( key == 0 )
+                {
+                    pb -> rc = RC ( rcDB, rcIndex, rcValidating, rcMemory, rcExhausted );
+                    StringWhack ( ( String* ) orig );
+                    return true;
+                }
+            }
+
+            rc = KIndexProjectText ( pb -> outer, id, & start_id, & id_count, key, bsize, & key_size );
+            if ( rc != 0 )
+            {
+                PLOGERR ( klogWarn, ( klogWarn, rc, "failed to retrieve key, start id and count for row id $(rid)",
+                                      "rid=%u", id ) );
+                pb -> failed = true;
+            }
+            else
+            {
+                if ( orig -> size != key_size || memcmp ( orig -> addr, key, key_size ) != 0 )
+                {
+                    PLOGERR ( klogWarn, ( klogWarn, rc, "row $(rid) maps to key '$(key)': expected key '$(orig)'.",
+                                          "rid=%u,key=%.*s,orig=%S", id, ( int ) key_size, key, orig ) );
+                    pb -> failed = true;
+                }
+                if ( start_id != ( int64_t ) id || id_count != 1 )
+                {
+                    PLOGERR ( klogWarn, ( klogWarn, rc, "single row $(rid) maps to start id $(start_id), count $(id_count).",
+                                          "rid=%u,id_count=%u,start_id=%ld", id, id_count, start_id ) );
+                    pb -> failed = true;
+                }
+            }
+
+            if ( key != buffer )
+                free ( key );
+        }
+
+        StringWhack ( ( String* ) orig );
+    }
+
+    return false;
+}
+
+rc_t KPTrieIndexCheckConsistency_v1 ( const KPTrieIndex_v1 *self,
+    int64_t *start_id, uint64_t *id_range, uint64_t *num_keys,
+    uint64_t *num_rows, uint64_t *num_holes,
+    const KIndex *outer, bool key2id, bool id2key )
+{
+    rc_t rc = 0;
+    KPTrieIndexCCParms_v1 pb;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcValidating, rcParam, rcNull );
+
+    if ( ( key2id || id2key ) && outer == NULL )
+        return RC ( rcDB, rcIndex, rcValidating, rcSelf, rcNull );
+
+    KPTrieIndexCCParmsInit_v1 ( & pb, self, outer, key2id, id2key );
+    if ( PTrieDoUntil ( self -> key2id, KPTrieIndexCCVisit_v1, & pb ) )
+        rc = pb . rc;
+    else if ( pb . failed )
+        rc = RC ( rcDB, rcIndex, rcValidating, rcSelf, rcCorrupt );
+
+    if ( start_id != NULL )
+        * start_id = pb . stats . i_min_id;
+    if ( id_range != NULL )
+        * id_range = ( uint32_t ) ( pb . stats . x_max_id - pb . stats . i_min_id );
+    if ( num_keys != NULL )
+        * num_keys = pb . stats . num_entries;
+    if ( num_rows != NULL )
+        * num_rows = pb . stats . num_ids;
+    if ( num_holes != NULL )
+        * num_holes = pb . stats . num_holes;
+
+    KPTrieIndexCCParmsWhack_v1 ( & pb );
+    return rc;
+}
diff --git a/libs/kdb/ptrieval-v2.c b/libs/kdb/ptrieval-v2.c
new file mode 100644
index 0000000..ad7103b
--- /dev/null
+++ b/libs/kdb/ptrieval-v2.c
@@ -0,0 +1,396 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#include "index-priv.h"
+#include "idstats-priv.h"
+
+#include <kdb/index.h>
+#include <klib/ptrie.h>
+#include <klib/pack.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <endian.h>
+#include <byteswap.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndexCCParms
+ *  consistency check parameter block
+ */
+typedef struct KPTrieIndexCCParms_v2 KPTrieIndexCCParms_v2;
+struct KPTrieIndexCCParms_v2
+{
+    KIdStats stats;
+    rc_t rc;
+    const KPTrieIndex_v2 *self;
+    const KIndex *outer;
+    bool key2id;
+    bool id2key;
+    bool all_ids;
+    bool convertFromV1;
+    bool failed;
+};
+
+/* Init
+ */
+static
+void KPTrieIndexCCParmsInit_v2 ( KPTrieIndexCCParms_v2 *pb,
+    const KPTrieIndex_v2 *self, const KIndex *outer, bool key2id, bool id2key, bool all_ids, bool convertFromV1 )
+{
+    KIdStatsInit ( & pb -> stats );
+    pb -> rc = 0;
+    pb -> self = self;
+    pb -> outer = outer;
+    pb -> key2id = key2id;
+    pb -> id2key = self -> ord2node ? id2key : false;
+    pb -> all_ids = all_ids;
+    pb -> convertFromV1 = convertFromV1;
+    pb -> failed = false;
+}
+
+/* Whack
+ */
+static
+void KPTrieIndexCCParmsWhack_v2 ( KPTrieIndexCCParms_v2 *pb )
+{
+    KIdStatsWhack ( & pb -> stats );
+}
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndex_v2
+ *  persisted keymap
+ */
+
+/* CheckConsistency
+ *  runs a consistency check as efficiently as possible
+ *
+ *  in all cases, we make use of "PTrieForEach" to visit each node
+ *  using the natural storage order. each node returned is counted,
+ *  read and inserted into a BSTree whose nodes merge adjacent and
+ *  overlapping ids into existing nodes.
+ *
+ *  if running a deep "key->id" test, then the key is first regenerated
+ *  from the node, and then used to retrieve the id via the KIndex.
+ *
+ *  if the projection index exists, the id is tested against the node
+ *  to ensure that projection works. if "id->key" is true, then use
+ *  the KIndex to produce a key and compare it against the node.
+ */
+static
+bool CC KPTrieIndexCCVisit_v2 ( PTNode *n, void *data )
+{
+    KPTrieIndexCCParms_v2 *pb = (KPTrieIndexCCParms_v2 *)data;
+    const KPTrieIndex_v2 *self = pb -> self;
+
+    rc_t rc;
+    int64_t id;
+    size_t usize;
+    uint64_t span;
+    uint32_t i, ord;
+
+    /* detect conversion from v1 */
+    if ( pb -> convertFromV1 && self -> id_bits == 0 )
+    {
+        uint32_t id32;
+
+        /* payload of v1 PTNode is a 32-bit spot id */
+        assert ( n -> data . size == sizeof id32 );
+        memmove ( & id32, n -> data . addr, sizeof id32 );
+        id = self -> byteswap ? bswap_32 ( id32 ) : id32;
+    }
+    else
+    {
+        /* native v2 */
+        /* TBD - should this pass n -> data . size * 8 ??? */
+        if ( self -> id_bits != 0 )
+        {
+            rc = Unpack ( self -> id_bits, sizeof id * 8,
+                n -> data . addr, 0, self -> id_bits, NULL,
+                & id, sizeof id, & usize );
+            if ( rc != 0 )
+            {
+                PLOGMSG ( klogWarn, ( klogWarn, "could not determine row id of v2 node $(nid)",
+                                 "nid=0x%08x", n -> id ));
+                pb -> failed = true;
+                return false;
+            }
+        }
+        else
+        {
+            id = 0;
+        }
+
+        id += self -> first;
+    }
+
+    /* convert from row-id to 1-based ordinal index */
+    ord = KPTrieIndexID2Ord_v2 ( self, id );
+    if ( ord == 0 )
+    {
+        /* 0 means not found */
+        PLOGMSG ( klogWarn, ( klogWarn, "v2 node $(nid): row id $(rid) not found in trie",
+                              "nid=0x%08x,rid=%ld", n -> id, id ));
+        pb -> failed = true;
+        return false;
+    }
+
+    if ( self -> ord2node != NULL )
+    {
+        /* to calculate span of last entry, where
+           1-based "ord" == the number of nodes,
+           just find the distance between the last row-id
+           in index ( self->maxid ) and the current row-id */
+        if ( ord == self -> count )
+            span = self -> maxid - id + 1;
+        else
+        {
+            /* from here on, we will use "ord" to be the
+               ZERO-BASED index of the slot FOLLOWING the
+               one corresponding to id. we want to find the
+               row-id AFTER the current one and calculate distance */
+            switch ( self -> variant )
+            {
+            /* linear array */
+            case 0:
+                /* starting with the FOLLOWING slot,
+                   count duplicate entries */
+                for ( i = ord; i < self -> count; ++ i )
+                {
+                    if ( n -> id != self -> ord2node [ i ] )
+                        break;
+                }
+                span = self -> first + i - id;
+                break;
+
+            /* packed ordered array of sparse row-ids from here on
+               we already have "id" for this node, so the span will
+               be the distance from NEXT id - 1-based ord is 0-based next */
+            case 1:
+                span = self -> first + self -> id2ord . v8 [ ord ] - id;
+                break;
+            case 2:
+                span = self -> first + self -> id2ord . v16 [ ord ] - id;
+                break;
+            case 3:
+                span = self -> first + self -> id2ord . v32 [ ord ] - id;
+                break;
+            case 4:
+                span = self -> first + self -> id2ord . v64 [ ord ] - id;
+                break;
+            default:
+                PLOGMSG ( klogErr, ( klogErr, "PTrie v2 index has bad variant code: $(variant)",
+                                     "variant=%u", self -> variant ));
+                pb -> rc = RC ( rcDB, rcIndex, rcValidating, rcIndex, rcCorrupt );
+                return true;
+            }
+        }
+    }
+    else if ( self -> span_bits == 0 )
+        span = 1;
+    else
+    {
+        /* TBD - this case is never used in practice.
+           it would be an skey without a projection index */
+        rc = Unpack ( self -> span_bits, sizeof span * 8,
+                      n -> data . addr, 0, self -> id_bits, NULL,
+                      & span, sizeof span, & usize );
+        if ( rc != 0 )
+        {
+            PLOGMSG ( klogWarn, ( klogWarn, "could not determine span of v2 node $(nid), row id $(rid)",
+                                  "nid=0x%08x,rid=%ld", n -> id, id ));
+            pb -> failed = true;
+            return false;
+        }
+    }
+
+    /* record the node, row id, span */
+    pb -> rc = KIdStatsInsert ( & pb -> stats, id, span );
+    if ( pb -> rc != 0 )
+    {
+        PLOGERR ( klogSys, ( klogSys, pb -> rc, "failed when examining node id $(nid) with row id $(rid), span $(span)",
+                             "nid=0x%08x,span=%u,rid=%ld", n -> id, span, id ));
+        return true;
+    }
+
+    /* if we have a projection index, test it */
+    if ( self -> ord2node != NULL )
+    {
+        if ( id < self -> first || id > self -> last )
+        {
+            PLOGMSG ( klogWarn, ( klogWarn, "node id $(nid) with row id $(rid) is not within projection range of $(min_rid)..$(max_rid)",
+                                 "nid=0x%08x,rid=%ld,min_rid=%ld,max_rid=%ld",
+                                  n -> id, id, self -> first, self -> last ));
+            pb -> failed = true;
+            return false;
+        }
+        for ( i = 0; i < span; ++ i )
+        {
+            if ( self -> ord2node [ i + ord - 1 ] != n -> id )
+            {
+                PLOGMSG ( klogWarn, ( klogWarn, "node id $(nid) with row id $(rid) does not match projection node id of $(pnid)",
+                                      "nid=0x%08x,rid=%ld,pnid=0x%08x", n -> id, id + 1, self -> ord2node [ i + ord - 1 ] ));
+                pb -> failed = true;
+                return false;
+            }
+            if ( ! pb -> all_ids || self -> variant != 0 )
+                break;
+        }
+    }
+
+    /* if performing deeper tests */
+    if ( pb -> key2id || pb -> id2key )
+    {
+        int64_t start_id;
+        uint64_t id_count;
+
+        /* need to recover key from given node */
+        const String *orig;
+        pb -> rc = PTNodeMakeKey ( n, & orig );
+        if ( pb -> rc != 0 )
+        {
+            PLOGERR ( klogSys, ( klogSys, pb -> rc, "failed when retrieving text for node id $(nid) with row id $(rid)",
+                                 "nid=0x%08x,rid=%u", n -> id, id ));
+            return true;
+        }
+
+        /* key->id test */
+        if ( pb -> key2id )
+        {
+            rc = KIndexFindText ( pb -> outer, orig -> addr, & start_id, & id_count, NULL, NULL );
+            if ( rc != 0 )
+            {
+                PLOGERR ( klogWarn, ( klogWarn, rc, "failed to retrieve start id and count for key '$(key)', row id $(rid)",
+                                      "key=%S,rid=%u", orig, id ) );
+                pb -> failed = true;
+            }
+            else if ( start_id != ( int64_t ) id || id_count != span )
+            {
+                PLOGERR ( klogWarn, ( klogWarn, rc, "key '$(key)' maps to start id $(start_id), count $(id_count): expected id $(rid), count 1.",
+                                      "key=%S,rid=%u,start_id=%ld,id_count=%lu", orig, id, start_id, id_count ) );
+                pb -> failed = true;
+            }
+        }
+
+        /* id->key test */
+        if ( pb -> id2key )
+        {
+            char buffer [ 256 ], *key = buffer;
+            size_t key_size, bsize = sizeof buffer;
+            if ( sizeof buffer <= orig -> size )
+            {
+                key = (char *)malloc ( bsize = orig -> size + 1 );
+                if ( key == 0 )
+                {
+                    pb -> rc = RC ( rcDB, rcIndex, rcValidating, rcMemory, rcExhausted );
+                    StringWhack ( ( String* ) orig );
+                    return true;
+                }
+            }
+
+            for ( i = 0; i < span; ++ i )
+            {
+                rc = KIndexProjectText ( pb -> outer, id + i, & start_id, & id_count, key, bsize, & key_size );
+                if ( rc != 0 )
+                {
+                    PLOGERR ( klogWarn, ( klogWarn, rc, "failed to retrieve key, start id and count for row id $(rid)",
+                                          "rid=%u", id + i ) );
+                    pb -> failed = true;
+                    break;
+                }
+
+                if ( orig -> size != key_size || memcmp ( orig -> addr, key, key_size ) != 0 )
+                {
+                    PLOGERR ( klogWarn, ( klogWarn, rc, "row $(rid) maps to key '$(key)': expected key '$(orig)'.",
+                                          "rid=%u,key=%.*s,orig=%S", id + i, ( int ) key_size, key, orig ) );
+                    pb -> failed = true;
+                }
+                if ( start_id != id || id_count != ( uint64_t ) span )
+                {
+                    PLOGERR ( klogWarn, ( klogWarn, rc, "row $(rid) maps to start id $(start_id), count $(id_count): expected $(row_start), $(span).",
+                                          "rid=%u,id_count=%lu,start_id=%ld,row_start=%ld,span=%u",
+                                          id, id_count, start_id, id, span ) );
+                    pb -> failed = true;
+                }
+
+                if ( ! pb -> all_ids || pb -> failed )
+                    break;
+            }
+
+            if ( key != buffer )
+                free ( key );
+        }
+
+        StringWhack ( ( String* ) orig );
+    }
+
+    return false;
+}
+
+rc_t KPTrieIndexCheckConsistency_v2 ( const KPTrieIndex_v2 *self,
+    int64_t *start_id, uint64_t *id_range, uint64_t *num_keys,
+    uint64_t *num_rows, uint64_t *num_holes,
+    const KIndex *outer, bool key2id, bool id2key, bool all_ids, bool convertFromV1 )
+{
+    rc_t rc = 0;
+    KPTrieIndexCCParms_v2 pb;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcValidating, rcParam, rcNull );
+
+    if ( ( key2id || id2key ) && outer == NULL )
+        return RC ( rcDB, rcIndex, rcValidating, rcSelf, rcNull );
+
+    KPTrieIndexCCParmsInit_v2 ( & pb, self, outer, key2id, id2key, all_ids, convertFromV1 );
+    if ( PTrieDoUntil ( self -> key2id, KPTrieIndexCCVisit_v2, & pb ) )
+        rc = pb . rc;
+    else if ( pb . failed )
+        rc = RC ( rcDB, rcIndex, rcValidating, rcSelf, rcCorrupt );
+
+    if ( start_id != NULL )
+        * start_id = pb . stats . i_min_id;
+    if ( id_range != NULL )
+        * id_range = pb . stats . x_max_id - pb . stats . i_min_id;
+    if ( num_keys != NULL )
+        * num_keys = pb . stats . num_entries;
+    if ( num_rows != NULL )
+        * num_rows = pb . stats . num_ids;
+    if ( num_holes != NULL )
+        * num_holes = pb . stats . num_holes;
+
+    KPTrieIndexCCParmsWhack_v2 ( & pb );
+    return rc;
+}
diff --git a/libs/kdb/rowset-it.c_old b/libs/kdb/rowset-it.c_old
new file mode 100644
index 0000000..f7c3bff
--- /dev/null
+++ b/libs/kdb/rowset-it.c_old
@@ -0,0 +1,385 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kdb/rowset.h>
+#include "rowset-priv.h"
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/out.h>
+
+#include <string.h>
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * KRowSetIterator
+ */
+
+struct KRowSetIterator
+{
+    KRefcount refcount;
+    const KRowSet * rowset;
+    const KRowSetTreeLeaf * leaf; // will be NULL in empty iterator
+    int64_t current_row_id;
+    ptrdiff_t eol; // end of "list"; will be non-zero when there are no more rows and we moved after valid row-id sequence dimensions
+
+    // only for leaf type RangeArray
+    struct {
+        int8_t current_range_index;
+    } range_array;
+};
+
+static
+void KRowSetIteratorStart ( KRowSetIterator * self )
+{
+    assert ( self != NULL );
+    self->current_row_id = -1;
+    self->leaf = KRowSetTreeGetFirstLeaf ( self->rowset );
+    self->eol = self->leaf == NULL ? -1 : 0;
+}
+
+static
+void KRowSetIteratorEnd ( KRowSetIterator * self )
+{
+    assert ( self != NULL );
+    self->current_row_id = -1;
+    self->leaf = KRowSetTreeGetLastLeaf ( self->rowset );
+    self->eol = self->leaf == NULL ? 1 : 0;
+}
+
+static
+bool CC KRowSetIteratorMove ( KRowSetIterator * iter, bool backward )
+{
+    int step = !backward ? 1 : -1;
+
+    assert ( iter->rowset != NULL );
+
+    if ( iter->eol != 0 )
+    {
+        iter->eol += step;
+        if ( iter->eol == 0 )
+        {
+            if ( !backward )
+                KRowSetIteratorStart ( iter );
+            else
+                KRowSetIteratorEnd ( iter );
+        }
+    }
+
+    if ( iter->eol != 0 )
+        return false;
+
+    assert ( iter->leaf != NULL );
+
+    while ( iter->eol == 0 )
+    {
+        int i;
+        int j;
+        int64_t last_row_id;
+        int last_leaf_bt = -1;
+        int64_t leaf_id;
+        int64_t row_id;
+        const KRowSetTreeLeaf * leaf = iter->leaf;
+
+        last_row_id = iter->current_row_id;
+        if ( last_row_id != -1 )
+            last_leaf_bt = last_row_id & 0xFFFF;
+
+        leaf_id = leaf->header.leaf_id;
+        row_id = leaf_id << 16;
+
+        switch ( leaf->header.type )
+        {
+        case LeafType_Bitmap:
+        {
+            int from_i;
+            int from_j;
+            int to_i;
+            int to_j;
+
+
+            if ( last_row_id != -1 && (last_row_id >> 16) == leaf_id )
+            {
+                assert ( last_leaf_bt != -1 );
+                from_i = last_leaf_bt >> 3;
+                from_j = (last_leaf_bt & 7) + step;
+            }
+            else
+            {
+                from_i = !backward ? 0 : LEAF_DATA_SZ_BT - 1;
+                from_j = !backward ? 0 : 8 - 1;
+            }
+
+            if ( !backward )
+            {
+                to_i = LEAF_DATA_SZ_BT;
+                to_j = 8;
+            }
+            else
+            {
+                to_i = -1;
+                to_j = -1;
+            }
+
+            for ( i = from_i; i != to_i; i += step )
+            {
+                if ( leaf->data.bitmap[i] )
+                {
+                    int64_t new_row_id = row_id | i << 3;
+                    for ( j = from_j; j != to_j; j += step )
+                    {
+                        if ( leaf->data.bitmap[i] & (1 << j) )
+                        {
+                            iter->current_row_id = (int64_t)( new_row_id | j );
+                            return true;
+                        }
+                    }
+                }
+                from_j = !backward ? 0 : 8 - 1;
+            }
+
+            break;
+        }
+        case LeafType_ArrayRanges:
+        {
+            int from_i; // range index
+            int from_j;
+            int to_i;
+            int to_j;
+            int len = leaf->data.array_ranges.len;
+
+            if ( last_row_id != -1 && (last_row_id >> 16) == leaf_id )
+            {
+                assert ( last_leaf_bt != -1 );
+                assert ( iter->range_array.current_range_index != -1 );
+
+                from_i = iter->range_array.current_range_index;
+                from_j = last_leaf_bt + step;
+            }
+            else
+            {
+                from_i = !backward ? 0 : len - 1;
+                from_j = !backward ? leaf->data.array_ranges.ranges[from_i].start : leaf->data.array_ranges.ranges[from_i].end;
+            }
+
+            if ( !backward )
+            {
+                to_i = len;
+            }
+            else
+            {
+                to_i = -1;
+            }
+
+            for ( i = from_i; i != to_i; i += step )
+            {
+                const struct KRowSetTreeLeafRowRange * range = &leaf->data.array_ranges.ranges[i];
+                assert ( range->start <= range->end );
+                to_j = (!backward ? range->end : range->start) + step;
+                // single loop iteration just to check conditions
+                for ( j = from_j; j != to_j; j += step )
+                {
+                    assert ( j == (j & 0xFFFF) );
+                    iter->current_row_id = row_id | j;
+                    iter->range_array.current_range_index = i;
+                    return true;
+                }
+                from_j = !backward ? (range + step)->start : (range + step)->end;
+            }
+            break;
+        }
+        default:
+            assert ( false );
+        }
+
+        if ( !backward )
+            iter->leaf = KRowSetTreeLeafGetNext ( leaf );
+        else
+            iter->leaf = KRowSetTreeLeafGetPrev ( leaf );
+
+        if ( iter->leaf == NULL )
+        {
+            iter->eol = step;
+        }
+    }
+
+    return false;
+}
+
+KDB_EXTERN rc_t CC KRowSetMakeIterator ( const KRowSet * self, KRowSetIterator ** iter )
+{
+    rc_t rc;
+    KRowSetIterator * it;
+    uint64_t num_rows;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIterator, rcConstructing, rcSelf, rcNull );
+
+    if ( iter == NULL )
+        return RC ( rcDB, rcIterator, rcConstructing, rcParam, rcNull );
+
+    rc = KRowSetGetNumRowIds ( self, &num_rows );
+    if ( rc != 0 )
+        return rc;
+
+    if ( num_rows == 0 )
+        return RC ( rcDB, rcIterator, rcConstructing, rcItem, rcNotFound );
+
+    it = calloc ( 1, sizeof *it );
+    if ( it == NULL )
+        rc = RC ( rcDB, rcIterator, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        KRefcountInit ( &it->refcount, 1, "KRowSetIterator", "new", "" );
+
+        rc = KRowSetAddRef ( self );
+        if ( rc == 0 )
+        {
+            it->rowset = self;
+            KRowSetIteratorFirst ( it );
+            assert ( KRowSetIteratorIsValid ( it ) );
+
+            *iter = it;
+            return 0;
+        }
+
+        free ( it );
+    }
+
+    return rc;
+}
+
+/**
+ * Whack
+ */
+static
+rc_t KRowSetIteratorWhack ( KRowSetIterator * iter )
+{
+    assert ( iter != NULL );
+
+    KRowSetRelease ( iter->rowset );
+    iter->rowset = NULL;
+    free ( iter );
+
+    return 0;
+}
+
+KDB_EXTERN rc_t CC KRowSetIteratorAddRef ( const KRowSetIterator * iter )
+{
+    if ( iter != NULL ) switch ( KRefcountAdd ( & iter -> refcount, "KRowSetIterator" ) )
+    {
+        case krefOkay:
+            break;
+        default:
+            return RC ( rcDB, rcRowSet, rcAttaching, rcConstraint, rcViolated );
+    }
+    return 0;
+}
+KDB_EXTERN rc_t CC KRowSetIteratorRelease ( const KRowSetIterator * iter )
+{
+    if ( iter != NULL ) switch ( KRefcountDrop ( & iter -> refcount, "KRowSetIterator" ) )
+    {
+        case krefOkay:
+            break;
+        case krefWhack:
+            return KRowSetIteratorWhack ( ( KRowSetIterator* ) iter );
+        default:
+            return RC ( rcDB, rcRowSet, rcReleasing, rcConstraint, rcViolated );
+    }
+    return 0;
+}
+
+KDB_EXTERN rc_t CC KRowSetIteratorFirst ( KRowSetIterator * self )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcIterator, rcPositioning, rcSelf, rcNull );
+
+    KRowSetIteratorStart ( self );
+    KRowSetIteratorNext ( self );
+
+    return 0;
+}
+
+KDB_EXTERN rc_t CC KRowSetIteratorLast ( KRowSetIterator * self )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcIterator, rcPositioning, rcSelf, rcNull );
+
+    KRowSetIteratorEnd ( self );
+    KRowSetIteratorPrev ( self );
+
+    return 0;
+}
+
+KDB_EXTERN rc_t CC KRowSetIteratorNext ( KRowSetIterator * self )
+{
+    bool moved;
+    if ( self == NULL )
+        return RC ( rcDB, rcIterator, rcPositioning, rcSelf, rcNull );
+
+    moved = KRowSetIteratorMove ( self, false );
+
+    if ( !moved )
+        return RC ( rcDB, rcIterator, rcPositioning, rcItem, rcDone );
+
+    return 0;
+}
+
+KDB_EXTERN rc_t CC KRowSetIteratorPrev ( KRowSetIterator * self )
+{
+    bool moved;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIterator, rcPositioning, rcSelf, rcNull );
+
+    moved = KRowSetIteratorMove ( self, true );
+
+    if ( !moved )
+        return RC ( rcDB, rcIterator, rcPositioning, rcItem, rcDone );
+
+    return 0;
+}
+
+KDB_EXTERN bool CC KRowSetIteratorIsValid ( const KRowSetIterator * self )
+{
+    return self != NULL && !self->eol;
+}
+
+KDB_EXTERN rc_t CC KRowSetIteratorRowId ( const KRowSetIterator * self, int64_t * row_id )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcIterator, rcAccessing, rcSelf, rcNull );
+
+    if ( row_id == NULL )
+        return RC ( rcDB, rcIterator, rcAccessing, rcParam, rcNull );
+
+    if ( !KRowSetIteratorIsValid ( self ) )
+        return RC ( rcDB, rcIterator, rcAccessing, rcSelf, rcInvalid );
+
+    assert ( self->current_row_id != -1 );
+
+    *row_id = self->current_row_id;
+    return 0;
+}
diff --git a/libs/kdb/rowset-priv.h_old b/libs/kdb/rowset-priv.h_old
new file mode 100644
index 0000000..c57f5b7
--- /dev/null
+++ b/libs/kdb/rowset-priv.h_old
@@ -0,0 +1,116 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_kdb_rowset_priv_
+#define _h_kdb_rowset_priv_
+
+#include <klib/container.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if _DEBUGGING
+#define CHECK_NODE_MARKS 1
+#endif
+
+#if CHECK_NODE_MARKS
+#define NODE_MARK 55
+#define LEAF_MARK 99
+#endif
+
+#define LEAF_DEPTH 6 // at which depth leaves are located
+#define LEAF_DATA_SZ_BT 8192
+
+// the maximum value that leaf can represent
+//  (leaf data only stores lowest bytes of row_id)
+#define ROW_LEAF_MAX 0xFFFFLL
+
+/*--------------------------------------------------------------------------
+ * KRowSet
+ */
+typedef enum KRowSetTreeLeafType
+{
+    LeafType_Bitmap,
+    LeafType_ArrayRanges
+} KRowSetTreeLeafType;
+
+// Holds bites of row_id followed by current byte (radix trie compression)
+typedef struct KRowSetTreeNodeTransition
+{
+    int8_t size;
+    uint8_t data[5];
+} KRowSetTreeNodeTransition;
+
+typedef struct KRowSetTreeNode
+{
+    void* children[256];
+    KRowSetTreeNodeTransition transitions[256];
+
+#if CHECK_NODE_MARKS
+    uint8_t node_mark;
+#endif
+} KRowSetTreeNode;
+
+typedef struct KRowSetTreeLeafHeader
+{
+    DLNode dad;
+    int64_t leaf_id; // this is basically a row_id >> 16
+    uint64_t leaf_rows; // number of rows set in this leaf
+    uint8_t type; // types are defined in KRowSetTreeLeafType
+
+#if CHECK_NODE_MARKS
+    uint8_t leaf_mark;
+#endif
+} KRowSetTreeLeafHeader;
+
+
+typedef struct KRowSetTreeLeaf
+{
+    KRowSetTreeLeafHeader header;
+    union u
+    {
+        uint8_t bitmap[LEAF_DATA_SZ_BT];
+        struct KRowSetTreeLeafArrayRanges {
+            struct KRowSetTreeLeafRowRange {
+                uint16_t start;
+                uint16_t end;
+            } ranges[8];
+            uint8_t len;
+        } array_ranges;
+    } data;
+} KRowSetTreeLeaf;
+
+const KRowSetTreeLeaf * KRowSetTreeGetFirstLeaf ( const KRowSet * self );
+const KRowSetTreeLeaf * KRowSetTreeGetLastLeaf ( const KRowSet * self );
+const KRowSetTreeLeaf * KRowSetTreeLeafGetNext ( const KRowSetTreeLeaf * leaf );
+const KRowSetTreeLeaf * KRowSetTreeLeafGetPrev ( const KRowSetTreeLeaf * leaf );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kdb_rowset_priv_ */
diff --git a/libs/kdb/rowset-simple.c b/libs/kdb/rowset-simple.c
new file mode 100644
index 0000000..1914a3d
--- /dev/null
+++ b/libs/kdb/rowset-simple.c
@@ -0,0 +1,434 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#define KROWSET_IT KRowSetSimpleIterator
+
+#include <kdb/extern.h>
+
+#include <kdb/rowset.h>
+#include <kdb/rowset-impl.h>
+#include <kdb/table.h>
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/out.h>
+#include <klib/sort.h>
+
+#include <string.h>
+#include <assert.h>
+
+#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
+#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+typedef struct KRowSetSimpleData KRowSetSimpleData;
+typedef struct KRowSetSimpleIterator KRowSetSimpleIterator;
+
+static
+KRowSetSimpleIterator * CC KRowSetSimpleGetIterator ( const struct KRowSet * self, ctx_t ctx );
+
+/*--------------------------------------------------------------------------
+ * KRowSet
+ */
+
+struct KRowSetSimpleData
+{
+    uint64_t size;
+    uint64_t num_rows;
+    bool sorted;
+    int64_t rows_array[1];
+};
+
+static
+KRowSetSimpleData * KRowSetSimpleAllocateData ( ctx_t ctx, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcAllocating );
+    KRowSetSimpleData * data;
+
+    if ( size <= 0 )
+        INTERNAL_ERROR ( xcParamInvalid, "data size should be greater than zero" );
+    else
+    {
+        data = malloc ( sizeof *data + (size - 1) * sizeof(int64_t) );
+        if ( data == NULL )
+            SYSTEM_ERROR ( xcNoMemory, "out of memory" );
+        else
+        {
+            data -> size = size;
+            data -> num_rows = 0;
+            data -> sorted = true;
+            return data;
+        }
+    }
+
+    return NULL;
+}
+
+static
+KRowSetSimpleData * GetRowSetSimpleData ( KRowSet *self, ctx_t ctx )
+{
+    if ( self == NULL || self -> data == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get rowset data" );
+        return NULL;
+    }
+
+    return self -> data;
+}
+
+static
+void CC KRowSetSimpleDestroyData ( void *data, ctx_t ctx )
+{
+    free ( data );
+}
+
+static
+bool CC KRowSetSimpleHasRowId ( const KRowSet * self, ctx_t ctx, int64_t row_id )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcSearching );
+    const KRowSetSimpleData * data;
+
+    TRY ( data = GetRowSetSimpleData ( (KRowSet *)self, ctx ) )
+    {
+        /* TBD - only want this algorithm when count > some threshold... */
+        if ( data -> sorted )
+        {
+            uint64_t start, end, idx;
+
+            start = 0;
+            end = data -> num_rows;
+            while (start < end)
+            {
+                idx = (start + end) / 2;
+                if (row_id < data -> rows_array[idx])
+                    end = idx;
+                else if (row_id > data -> rows_array[idx])
+                    start = idx + 1;
+                else
+                    return true;
+            }
+        }
+        else
+        {
+            uint64_t i;
+            for ( i = 0; i < data -> num_rows; ++i )
+            {
+                if ( data -> rows_array[i] == row_id )
+                    return true;
+            }
+        }
+    }
+    return false;
+}
+
+static
+void KRowSetSimpleDataSort ( KRowSetSimpleData * data )
+{
+    if ( data == NULL || data -> sorted || data -> num_rows <= 1 )
+        return;
+
+    ksort_int64_t ( data -> rows_array, data -> num_rows );
+    data -> sorted = true;
+}
+
+static
+void AppendRowId ( KRowSet *self, ctx_t ctx, int64_t row_id )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcInserting );
+    KRowSetSimpleData * data;
+    TRY ( data = GetRowSetSimpleData ( self, ctx ) )
+    {
+        if ( data -> size - data -> num_rows == 0 )
+        {
+            KRowSetSimpleData * old_data = data;
+            uint64_t new_size;
+            if ( data -> size == SIZE_MAX )
+            {
+                INTERNAL_ERROR ( xcIntegerOutOfBounds, "cannot allocate bigger simple container for row id insertion" );
+                return;
+            }
+            if ( SIZE_MAX - data -> size > data -> size )
+                new_size = data -> size * 2;
+            else
+                new_size = SIZE_MAX;
+
+            TRY ( data = KRowSetSimpleAllocateData ( ctx, new_size ) )
+            {
+                memmove ( &data -> rows_array, &old_data -> rows_array, old_data -> num_rows * sizeof(int64_t) );
+                data -> num_rows = old_data -> num_rows;
+                data -> sorted = old_data -> sorted;
+                self -> data = data;
+                ON_FAIL ( KRowSetSimpleDestroyData ( old_data, ctx ) )
+                    return;
+            }
+            else
+                return;
+        }
+        if ( data -> sorted )
+            data -> sorted = data -> num_rows == 0 || data -> rows_array[ data -> num_rows - 1 ] <= row_id;
+        data -> rows_array[ data -> num_rows++ ] = row_id;
+    }
+}
+
+static
+void CC KRowSetSimpleAddRowIdRange ( KRowSet *self, ctx_t ctx, int64_t start_row_id, uint64_t count )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcInserting );
+    uint64_t i;
+
+    if ( (uint64_t)INT64_MAX - start_row_id < count )
+    {
+        USER_ERROR ( xcIntegerOutOfBounds, "bad row id range" );
+        return;
+    }
+
+
+    for ( i = 0; i < count; ++i )
+    {
+        int64_t row_id = i + start_row_id;
+        bool row_exists;
+        TRY ( row_exists = KRowSetSimpleHasRowId ( self, ctx, row_id ) )
+        {
+            if ( row_exists )
+                continue;
+
+            ON_FAIL ( AppendRowId ( self, ctx, row_id ) )
+                break;
+        }
+    }
+}
+
+static
+uint64_t CC KRowSetSimpleGetNumRowIds ( const KRowSet * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcAccessing );
+    const KRowSetSimpleData * data;
+    TRY ( data = GetRowSetSimpleData ( (KRowSet *) self, ctx ) )
+    {
+        return data -> num_rows;
+    }
+
+    return 0;
+}
+
+static
+void CC KRowSetSimpleDestroy ( KRefcount_v1 *self_refcount, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcDestroying );
+
+    KRowSet * self = (KRowSet *)self_refcount;
+
+    const KRowSet_v1_vt * vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KRowSet );
+    if ( vt == NULL )
+        INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KRowSet interface" );
+    else
+    {
+        KTableRelease ( self -> table );
+        self -> table = NULL;
+
+        assert ( vt != NULL );
+        assert ( vt -> destroy_data != NULL );
+
+        ( * vt -> destroy_data ) ( self -> data, ctx );
+        self -> data = NULL;
+    }
+}
+
+static KRefcount_v1_vt vtKRowSetSimpleRefCount =
+{
+    KVTABLE_INITIALIZER ( KRowSetSimpleRefCount, KRefcount_v1, 0, NULL ),
+    KRowSetSimpleDestroy,
+    NULL
+};
+
+static KRowSet_v1_vt vtKRowSetSimple =
+{
+    KVTABLE_INITIALIZER ( KRowSetSimple, KRowSet, 0, &vtKRowSetSimpleRefCount.dad ),
+
+    KRowSetSimpleDestroyData,
+    KRowSetSimpleAddRowIdRange,
+    KRowSetSimpleGetNumRowIds,
+    KRowSetSimpleHasRowId,
+    KRowSetSimpleGetIterator
+};
+
+KDB_EXTERN KRowSet * CC KTableMakeRowSetSimple ( struct KTable const * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcConstructing );
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to construct rowset: table is NULL" );
+    else
+    {
+        KRowSet *r;
+
+        r = calloc ( 1, sizeof *r );
+        if ( r == NULL )
+            SYSTEM_ERROR ( xcNoMemory, "out of memory" );
+        else
+        {
+            TRY ( KRowSetInit ( r, ctx, &vtKRowSetSimple.dad, "KRowSetSimple" ) )
+            {
+                TRY ( r -> data = KRowSetSimpleAllocateData ( ctx, 16 ) )
+                {
+                    rc_t rc;
+                    r -> table = self;
+                    rc = KTableAddRef ( r -> table );
+                    if ( rc != 0 )
+                        INTERNAL_ERROR ( xcUnexpected, "unknown result from KTableAddRef: rc = %R", rc );
+                    else
+                        return r;
+                }
+            }
+            free ( r );
+        }
+    }
+
+    return NULL;
+}
+
+/*--------------------------------------------------------------------------
+ * KRowSetSimpleIterator
+ */
+
+struct KRowSetSimpleIterator
+{
+    KRowSetIterator dad;
+    const KRowSet * rowset;
+    const KRowSetSimpleData * rowset_data;
+    uint64_t array_index;
+};
+
+static
+void CC KRowSetSimpleIteratorDestroy ( KRefcount_v1 *self_refcount, ctx_t ctx )
+{
+    KRowSetSimpleIterator * self = (KRowSetSimpleIterator *)self_refcount;
+    if ( self == NULL || self -> rowset == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcDB, rcIterator, rcDestroying );
+        INTERNAL_ERROR ( xcSelfNull, "failed to destroy rowset iterator" );
+    }
+    else
+    {
+        KRowSetRelease ( self -> rowset, ctx );
+    }
+}
+
+static
+bool CC KRowSetSimpleIteratorNext ( struct KRowSetSimpleIterator * self, ctx_t ctx )
+{
+    if ( self == NULL || self -> rowset_data == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcDB, rcIterator, rcPositioning );
+        INTERNAL_ERROR ( xcSelfNull, "failed to move rowset iterator" );
+    }
+    else if ( self -> array_index == self -> rowset_data -> num_rows )
+    {
+        FUNC_ENTRY ( ctx, rcDB, rcIterator, rcPositioning );
+        INTERNAL_ERROR ( xcIteratorExhausted, "failed to move rowset iterator - no more elements" );
+    }
+    else
+        return ++self -> array_index < self -> rowset_data -> num_rows;
+
+    return false;
+}
+
+static
+bool CC KRowSetSimpleIteratorIsValid ( const struct KRowSetSimpleIterator * self )
+{
+    if (self == NULL || self -> rowset_data == NULL || self -> rowset == NULL || self -> rowset_data != self -> rowset -> data )
+        return false;
+
+    return self -> array_index < self -> rowset_data -> num_rows;
+}
+
+static
+int64_t CC KRowSetSimpleIteratorGetRowId ( const struct KRowSetSimpleIterator * self, ctx_t ctx )
+{
+    if ( !KRowSetSimpleIteratorIsValid ( self ) )
+    {
+        FUNC_ENTRY ( ctx, rcDB, rcIterator, rcAccessing );
+        if (self == NULL || self -> rowset_data == NULL || self -> rowset == NULL )
+            INTERNAL_ERROR ( self == NULL ? xcSelfNull : xcSelfInvalid, "cannot get row id from iterator" );
+        else if ( self -> rowset_data != self -> rowset -> data )
+            USER_ERROR ( xcSelfInvalid, "usage of iterator after modifying rowset" );
+        else
+            USER_ERROR ( xcSelfInvalid, "usage of iterator beyond rowset range" );
+        return -1;
+    }
+    return self -> rowset_data -> rows_array[self -> array_index];
+}
+
+static KRefcount_v1_vt vtKRowSetIteratorSimpleRefCount =
+{
+    KVTABLE_INITIALIZER ( KRowSetIteratorSimpleRefCount, KRefcount_v1, 0, NULL ),
+    KRowSetSimpleIteratorDestroy,
+    NULL
+};
+
+static KRowSetIterator_v1_vt vtKRowSetIteratorSimple =
+{
+    KVTABLE_INITIALIZER ( KRowSetIteratorSimple, KRowSetIterator, 0, &vtKRowSetIteratorSimpleRefCount.dad ),
+
+    KRowSetSimpleIteratorNext,
+    KRowSetSimpleIteratorIsValid,
+    KRowSetSimpleIteratorGetRowId
+};
+
+static
+KRowSetSimpleIterator * CC KRowSetSimpleGetIterator ( const struct KRowSet * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcIterator, rcConstructing );
+
+    if ( self == NULL || self -> data == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get rowset data" );
+    else
+    {
+        KRowSetSimpleIterator *r;
+        r = calloc ( 1, sizeof *r );
+        if ( r == NULL )
+            SYSTEM_ERROR ( xcNoMemory, "out of memory" );
+        else
+        {
+            TRY ( KRowSetIteratorInit ( &r -> dad, ctx, &vtKRowSetIteratorSimple.dad, "KRowSetIteratorSimple" ) )
+            {
+                KRowSetSimpleDataSort ( self -> data ); /* make sure rowset is sorted */
+                r -> rowset_data = self -> data;
+                r -> array_index = 0;
+                TRY ( r -> rowset = KRowSetDuplicate ( self, ctx, 0 ) )
+                {
+                    return r;
+                }
+            }
+            free ( r );
+        }
+    }
+
+    return NULL;
+}
+
diff --git a/libs/kdb/rowset.c b/libs/kdb/rowset.c
new file mode 100644
index 0000000..c391917
--- /dev/null
+++ b/libs/kdb/rowset.c
@@ -0,0 +1,494 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kdb/extern.h>
+
+#include <kdb/rowset.h>
+#include <kdb/rowset-impl.h>
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+KITFTOK_DEF ( KRowSet );
+KITFTOK_DEF ( KRowSetIterator );
+
+/* MakeRowSet
+ *  may add others...
+ */
+KDB_EXTERN KRowSet * CC KTableMakeRowSet ( struct KTable const * self, ctx_t ctx )
+{
+    return KTableMakeRowSetSimple ( self, ctx );
+}
+
+/* Init
+ *  initialize a newly allocated rowset object
+ */
+KDB_EXTERN void CC KRowSetInit ( KRowSet *self, ctx_t ctx, const KVTable *kvt,
+    const char *classname )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcInitializing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "KRowSetInit failed" );
+    else if ( kvt == NULL )
+        INTERNAL_ERROR ( xcParamNull, "KRowSetInit failed: vt is NULL" );
+    else
+    {
+        TRY ( KRefcountInit_v1 ( & self -> dad, ctx, kvt, classname ) )
+        {
+            const KRowSet_v1_vt *vt = KVTABLE_CAST ( kvt, ctx, KRowSet );
+            if ( vt == NULL )
+                INTERNAL_ERROR ( xcInterfaceIncorrect, "vtable does not appear to implement KRowSet" );
+            else switch ( vt -> dad . min )
+            {
+            case 0:
+#if _DEBUGGING
+                if ( vt -> destroy_data == NULL         ||
+                     vt -> add_row_id_range == NULL     ||
+                     vt -> get_num_rows == NULL         ||
+                     vt -> has_row_id == NULL           ||
+                     vt -> get_iterator == NULL )
+                {
+                    INTERNAL_ERROR ( xcInterfaceInvalid, "null method pointer(s)" );
+                    return;
+                }
+#endif
+                break;
+            default:
+                INTERNAL_ERROR ( xcInterfaceInvalid, "rowset has an invalid version" );
+            }
+
+        }
+    }
+}
+
+/* AddRowId
+ *  add a single row to set
+ *
+ *  "row_id" [ IN ] - row-id to be added
+ */
+KDB_EXTERN void CC KRowSetAddRowId ( KRowSet * self, ctx_t ctx, int64_t row_id )
+{
+    KRowSetAddRowIdRange ( self, ctx, row_id, 1 );
+}
+
+/* AddRowIdRange
+ *  adds row-ids within specified range
+ *
+ *  "row_id" [ IN ] and "count" [ IN ] - range of row-ids to be added
+ */
+KDB_EXTERN void CC KRowSetAddRowIdRange ( KRowSet * self, ctx_t ctx, int64_t row_id, uint64_t count )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcInserting );
+        INTERNAL_ERROR ( xcSelfNull, "failed to insert rows into rowset" );
+    }
+    else
+    {
+        const KRowSet_v1_vt * vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KRowSet );
+        if ( vt == NULL )
+        {
+            FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcInserting );
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KRowSet interface" );
+        }
+        else
+            vt -> add_row_id_range ( self, ctx, row_id, count );
+    }
+}
+
+/* GetNumRowIds
+ *  return the number of elements in set
+ */
+KDB_EXTERN uint64_t CC KRowSetGetNumRowIds ( const KRowSet * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get number of rows in rowset" );
+    }
+    else
+    {
+        const KRowSet_v1_vt * vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KRowSet );
+        if ( vt == NULL )
+        {
+            FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcAccessing );
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KRowSet interface" );
+        }
+        else
+            return vt -> get_num_rows ( self, ctx );
+    }
+
+    return 0;
+}
+
+/* HasRowId
+ *  checks if element is present in set
+ */
+KDB_EXTERN bool CC KRowSetHasRowId ( const KRowSet * self, ctx_t ctx, int64_t row_id )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to find row in rowset" );
+    }
+    else
+    {
+        const KRowSet_v1_vt * vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KRowSet );
+        if ( vt == NULL )
+        {
+            FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcAccessing );
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KRowSet interface" );
+        }
+        else
+            return vt -> has_row_id ( self, ctx, row_id );
+    }
+
+    return false;
+}
+
+/* Visit
+ *  execute a function on each row-id in set
+ */
+KDB_EXTERN void CC KRowSetVisit ( const KRowSet * self, ctx_t ctx,
+    void ( CC * f ) ( ctx_t ctx, int64_t row_id, void * data ), void * data )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcAccessing );
+    KRowSetIterator * it;
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to iterate over rowset" );
+    else
+    {
+        TRY ( it = KRowSetMakeIterator ( self, ctx ) )
+        {
+            while ( !FAILED() && KRowSetIteratorIsValid ( it ) )
+            {
+                int64_t row_id;
+                ON_FAIL ( row_id = KRowSetIteratorGetRowId ( it, ctx ) )
+                    break;
+
+                ON_FAIL ( f ( ctx, row_id, data ) )
+                    break;
+
+                KRowSetIteratorNext ( it, ctx );
+            }
+
+            KRowSetIteratorRelease ( it, ctx );
+        }
+    }
+}
+
+/* Intersect
+ *  performs an intersection between two sets and returns the result
+ */
+KDB_EXTERN KRowSet * CC KRowSetIntersect ( ctx_t ctx, const KRowSet * a, const KRowSet * b )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcProcessing );
+    KRowSet * result;
+
+    if ( a -> table != b -> table )
+        USER_ERROR ( xcParamIncorrect, "cannot intersect rowsets from different tables" );
+    else
+    {
+        TRY ( result = KTableMakeRowSet ( a -> table, ctx ) )
+        {
+            KRowSetIterator * a_it;
+            KRowSetIterator * b_it;
+            TRY ( a_it = KRowSetMakeIterator ( a, ctx ) )
+            {
+                TRY ( b_it = KRowSetMakeIterator ( b, ctx ) )
+                {
+                    while ( !FAILED() && KRowSetIteratorIsValid ( a_it ) && KRowSetIteratorIsValid ( b_it ) )
+                    {
+                        int64_t a_row_id;
+                        int64_t b_row_id;
+                        ON_FAIL ( a_row_id = KRowSetIteratorGetRowId ( a_it, ctx ) )
+                            break;
+
+                        ON_FAIL ( b_row_id = KRowSetIteratorGetRowId ( b_it, ctx ) )
+                            break;
+
+                        if ( a_row_id < b_row_id )
+                            KRowSetIteratorNext ( a_it, ctx );
+                        else if ( a_row_id > b_row_id )
+                            KRowSetIteratorNext ( b_it, ctx );
+                        else
+                        {
+                            TRY ( KRowSetAddRowId ( result, ctx, a_row_id ) )
+                            {
+                                TRY ( KRowSetIteratorNext ( a_it, ctx ) )
+                                {
+                                    KRowSetIteratorNext ( b_it, ctx );
+                                }
+                            }
+                        }
+                    }
+                    KRowSetIteratorRelease ( b_it, ctx );
+                }
+                KRowSetIteratorRelease ( a_it, ctx );
+            }
+            if ( !FAILED() )
+                return result;
+
+            KRowSetRelease ( result, ctx );
+        }
+    }
+
+    return NULL;
+}
+
+/* Union
+ *  performs a union between two sets and returns the result
+ */
+KDB_EXTERN KRowSet * CC KRowSetUnion ( ctx_t ctx, const KRowSet * a, const KRowSet * b )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcRowSet, rcProcessing );
+    KRowSet * result;
+
+    if ( a -> table != b -> table )
+        USER_ERROR ( xcParamIncorrect, "cannot intersect rowsets from different tables" );
+    else
+    {
+        TRY ( result = KTableMakeRowSet ( a -> table, ctx ) )
+        {
+            KRowSetIterator * a_it;
+            KRowSetIterator * b_it;
+            TRY ( a_it = KRowSetMakeIterator ( a, ctx ) )
+            {
+                TRY ( b_it = KRowSetMakeIterator ( b, ctx ) )
+                {
+                    while ( !FAILED() && KRowSetIteratorIsValid ( a_it ) && KRowSetIteratorIsValid ( b_it ) )
+                    {
+                        int64_t a_row_id;
+                        int64_t b_row_id;
+                        ON_FAIL ( a_row_id = KRowSetIteratorGetRowId ( a_it, ctx ) )
+                            break;
+
+                        ON_FAIL ( b_row_id = KRowSetIteratorGetRowId ( b_it, ctx ) )
+                            break;
+
+                        if ( a_row_id < b_row_id )
+                        {
+                            TRY ( KRowSetAddRowId ( result, ctx, a_row_id ) )
+                            {
+                                KRowSetIteratorNext ( a_it, ctx );
+                            }
+                        }
+                        else if ( a_row_id > b_row_id )
+                        {
+                            TRY ( KRowSetAddRowId ( result, ctx, b_row_id ) )
+                            {
+                                KRowSetIteratorNext ( b_it, ctx );
+                            }
+                        }
+                        else
+                        {
+                            TRY ( KRowSetAddRowId ( result, ctx, a_row_id ) )
+                            {
+                                TRY ( KRowSetIteratorNext ( a_it, ctx ) )
+                                {
+                                    KRowSetIteratorNext ( b_it, ctx );
+                                }
+                            }
+                        }
+                    }
+                    while ( !FAILED() && KRowSetIteratorIsValid ( a_it ) )
+                    {
+                        int64_t a_row_id;
+                        TRY ( a_row_id = KRowSetIteratorGetRowId ( a_it, ctx ) )
+                        {
+                            TRY ( KRowSetAddRowId ( result, ctx, a_row_id ) )
+                            {
+                                KRowSetIteratorNext ( a_it, ctx );
+                            }
+                        }
+                    }
+                    while ( !FAILED() && KRowSetIteratorIsValid ( b_it ) )
+                    {
+                        int64_t b_row_id;
+                        TRY ( b_row_id = KRowSetIteratorGetRowId ( b_it, ctx ) )
+                        {
+                            TRY ( KRowSetAddRowId ( result, ctx, b_row_id ) )
+                            {
+                                KRowSetIteratorNext ( b_it, ctx );
+                            }
+                        }
+                    }
+                    KRowSetIteratorRelease ( b_it, ctx );
+                }
+                KRowSetIteratorRelease ( a_it, ctx );
+            }
+            if ( !FAILED() )
+                return result;
+
+            KRowSetRelease ( result, ctx );
+        }
+    }
+
+    return NULL;
+}
+
+/* MakeIterator
+ *  create an iterator on set
+ *  initially set to first row-id in set
+ */
+KDB_EXTERN KRowSetIterator * CC KRowSetMakeIterator ( const KRowSet * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcDB, rcIterator, rcCreating );
+        INTERNAL_ERROR ( xcSelfNull, "failed to create rowset iterator" );
+    }
+    else
+    {
+        const KRowSet_v1_vt * vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KRowSet );
+        if ( vt == NULL )
+        {
+            FUNC_ENTRY ( ctx, rcDB, rcIterator, rcCreating );
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KRowSet interface" );
+        }
+        else
+            return vt -> get_iterator ( self, ctx );
+    }
+
+    return NULL;
+}
+
+/* Init
+ *  initialize a newly allocated rowset iterator object
+ */
+KDB_EXTERN void CC KRowSetIteratorInit ( KRowSetIterator *self, ctx_t ctx, const KVTable *kvt,
+    const char *classname )
+{
+    FUNC_ENTRY ( ctx, rcDB, rcIterator, rcInitializing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "KRowSetIteratorInit failed" );
+    else if ( kvt == NULL )
+        INTERNAL_ERROR ( xcParamNull, "KRowSetIteratorInit failed: vt is NULL" );
+    else
+    {
+        TRY ( KRefcountInit_v1 ( & self -> dad, ctx, kvt, classname ) )
+        {
+            const KRowSetIterator_v1_vt *vt = KVTABLE_CAST ( kvt, ctx, KRowSetIterator );
+            if ( vt == NULL )
+                INTERNAL_ERROR ( xcInterfaceIncorrect, "vtable does not appear to implement KRowSetIterator" );
+            else switch ( vt -> dad . min )
+            {
+            case 0:
+#if _DEBUGGING
+                if ( vt -> next == NULL            ||
+                     vt -> is_valid == NULL        ||
+                     vt -> get_row_id == NULL )
+                {
+                    INTERNAL_ERROR ( xcInterfaceNull, "KRowSetIteratorInit failed" );
+                    return;
+                }
+#endif
+                break;
+            default:
+                INTERNAL_ERROR ( xcInterfaceBadVersion, "rowset iterator has an invalid version" );
+            }
+
+        }
+    }
+}
+
+/* Next
+ *  advance iterator to next row-id
+
+ *  advance to first row-id on initial invocation
+ *  advance to next row-id subsequently
+ *  returns rcDone if no more row-ids are available.
+ */
+KDB_EXTERN bool CC KRowSetIteratorNext ( KRowSetIterator * self, ctx_t ctx )
+{
+
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcDB, rcIterator, rcPositioning );
+        INTERNAL_ERROR ( xcSelfNull, "failed to move rowset iterator" );
+    }
+    else
+    {
+        const KRowSetIterator_v1_vt * vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KRowSetIterator );
+        if ( vt == NULL )
+        {
+            FUNC_ENTRY ( ctx, rcDB, rcIterator, rcPositioning );
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KRowSetIterator interface" );
+        }
+        else
+            return vt -> next ( self, ctx );
+    }
+
+    return false;
+}
+
+/*IsValid
+ * check if iterator points to a valid row
+ *
+ * returns false when iterator points somewhere outside of a row set
+ */
+KDB_EXTERN bool CC KRowSetIteratorIsValid ( const KRowSetIterator * self )
+{
+    if ( self != NULL )
+    {
+        HYBRID_FUNC_ENTRY ( rcDB, rcIterator, rcAccessing );
+        const KRowSetIterator_v1_vt * vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KRowSetIterator );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KRowSetIterator interface" );
+        else
+            return vt -> is_valid ( self );
+    }
+
+    return false;
+}
+
+/* RowId
+ *  report current row id
+ */
+KDB_EXTERN int64_t CC KRowSetIteratorGetRowId ( const KRowSetIterator * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcDB, rcIterator, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to access rowset iterator" );
+    }
+    else
+    {
+        const KRowSetIterator_v1_vt * vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KRowSetIterator );
+        if ( vt == NULL )
+        {
+            FUNC_ENTRY ( ctx, rcDB, rcIterator, rcAccessing );
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KRowSetIterator interface" );
+        }
+        else
+            return vt -> get_row_id ( self, ctx );
+    }
+
+    return -1;
+}
diff --git a/libs/kdb/rowset.c_old b/libs/kdb/rowset.c_old
new file mode 100644
index 0000000..2d2a2ba
--- /dev/null
+++ b/libs/kdb/rowset.c_old
@@ -0,0 +1,1513 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kdb/rowset.h>
+#include "rowset-priv.h"
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/out.h>
+
+#include <string.h>
+#include <assert.h>
+
+#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
+#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
+
+/*--------------------------------------------------------------------------
+ * KRowSet
+ */
+
+struct KRowSet
+{
+    KRefcount refcount;
+    KRowSetTreeNode * root_node;
+    DLList leaf_nodes;
+
+    uint64_t number_rows;
+    size_t number_leaves;
+};
+
+KDB_EXTERN rc_t CC KTableMakeRowSet ( struct KTable const * self, KRowSet ** rowset )
+{
+    rc_t rc;
+    KRowSet * self_rowset;
+    
+    if ( rowset == NULL )
+        rc = RC ( rcDB, rcRowSet, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        self_rowset = calloc ( 1, sizeof *self_rowset );
+        if ( self_rowset == NULL )
+            rc = RC ( rcDB, rcRowSet, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            KRefcountInit ( &self_rowset->refcount, 1, "KRowSet", "new", "" );
+            DLListInit ( &self_rowset->leaf_nodes );
+
+            *rowset = self_rowset;
+            return 0;
+        }
+    }
+    
+    return rc;
+}
+
+/**
+ * Allocates and initializes single leaf
+ */
+static
+rc_t KRowSetAllocateLeaf ( KRowSetTreeLeafType type, int64_t leaf_id, KRowSetTreeLeaf ** leaf )
+{
+    KRowSetTreeLeaf * allocated_leaf;
+    size_t size = sizeof allocated_leaf->header;
+
+    assert ( leaf != NULL );
+
+    switch ( type )
+    {
+    case LeafType_Bitmap:
+        size += sizeof allocated_leaf->data.bitmap;
+        break;
+    case LeafType_ArrayRanges:
+        size += sizeof allocated_leaf->data.array_ranges;
+        break;
+    default:
+        assert ( false );
+    }
+
+    allocated_leaf = calloc ( 1, size );
+    if ( allocated_leaf == NULL )
+        return RC ( rcDB, rcRowSet, rcInserting, rcMemory, rcExhausted );
+
+#if CHECK_NODE_MARKS
+    allocated_leaf->header.leaf_mark = LEAF_MARK;
+#endif
+    allocated_leaf->header.type = type;
+    allocated_leaf->header.leaf_id = leaf_id;
+
+    *leaf = allocated_leaf;
+    return 0;
+}
+
+/* Whack
+ */
+
+/*
+ * When data is NULL, it means that leaf is freeing during freeing the whole list
+ * and DLListUnlink does not need to be called. Otherwise, we are removing a single leaf
+ */
+static
+void KRowSetLeafWhack ( DLNode * node, void * data )
+{
+    KRowSetTreeLeaf * leaf = (KRowSetTreeLeaf *) node;
+#if CHECK_NODE_MARKS
+    assert ( leaf->header.leaf_mark == LEAF_MARK );
+#endif
+
+    if ( data != NULL )
+    {
+        DLList * leaf_nodes = data;
+        DLListUnlink ( leaf_nodes, node );
+    }
+
+    free ( leaf );
+}
+
+/**
+ * Recursively deallocates all trie nodes and leaves when "free_leaves" is true.
+ *  Otherwise only deallocates nodes.
+ */
+static
+void KRowSetNodeWhack ( KRowSet * self, KRowSetTreeNode * node, int depth, bool free_leaves )
+{
+    int i;
+
+    assert ( self != NULL );
+    assert ( depth < LEAF_DEPTH );
+
+#if CHECK_NODE_MARKS
+    assert ( node->node_mark == NODE_MARK );
+#endif
+    assert ( depth < LEAF_DEPTH );
+
+    for ( i = 0; i < 256; ++i )
+    {
+        assert ( (i & 0xFF) == i );
+
+        if ( node->children[i] )
+        {
+            int new_depth = depth + node->transitions[i].size + 1;
+            assert ( new_depth <= LEAF_DEPTH );
+
+            if ( new_depth < LEAF_DEPTH )
+                KRowSetNodeWhack ( self, node->children[i], new_depth, free_leaves );
+            else if ( free_leaves )
+                KRowSetLeafWhack ( &((KRowSetTreeLeaf*) node->children[i])->header.dad, &self->leaf_nodes );
+        }
+    }
+
+    free ( node );
+}
+
+/**
+ * Whack
+ *   Frees all leaves first and then walks through the trie
+ *   and frees all remaining nodes
+ */
+static
+rc_t KRowSetWhack ( KRowSet * self )
+{
+    assert ( self != NULL );
+
+    if ( self->root_node )
+    {
+        KRowSetNodeWhack ( self, self->root_node, 0, false );
+        DLListWhack ( &self->leaf_nodes, KRowSetLeafWhack, NULL );
+    }
+    free ( self );
+    return 0;
+}
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+KDB_EXTERN rc_t CC KRowSetAddRef ( const KRowSet *self )
+{
+    if ( self != NULL ) switch ( KRefcountAdd ( & self -> refcount, "KRowSet" ) )
+    {
+        case krefOkay:
+            break;
+        default:
+            return RC ( rcDB, rcRowSet, rcAttaching, rcConstraint, rcViolated );
+    }
+    return 0;
+}
+
+KDB_EXTERN rc_t CC KRowSetRelease ( const KRowSet *self )
+{
+    if ( self != NULL ) switch ( KRefcountDrop ( & self -> refcount, "KRowSet" ) )
+    {
+        case krefOkay:
+            break;
+        case krefWhack:
+            return KRowSetWhack ( ( KRowSet* ) self );
+        default:
+            return RC ( rcDB, rcRowSet, rcReleasing, rcConstraint, rcViolated );
+    }
+    return 0;
+}
+
+/**
+ * Get byte of "leaf_id" which represents node's child at "depth"
+ */
+static
+inline uint8_t KRowSetGetLeafIdByte ( int64_t leaf_id, int depth )
+{
+    return leaf_id >> (LEAF_DEPTH - depth - 1) * 8 & 0xFF;
+}
+
+/**
+ * Searches a nearest neighbor of just inserted "leaf",
+ *  by walking through nodes_stack from the most deep node to the root one.
+ *
+ * Is used to inserter newly created "leaf" to a linked list.
+ */
+static
+void KRowSetFindNearestLeaf ( KRowSet * self, KRowSetTreeNode * nodes_stack[], int nodes_depth[], int nodes_stack_size, KRowSetTreeLeaf * leaf, KRowSetTreeLeaf ** result, bool * result_left )
+{
+    assert ( self != NULL );
+    assert ( nodes_stack != NULL );
+    assert ( leaf != NULL );
+    assert ( result != NULL );
+    assert ( result_left != NULL );
+
+    *result = NULL;
+
+    if ( self->number_leaves == 0 )
+        return;
+
+    if ( self->number_leaves == 1 )
+    {
+        *result = (KRowSetTreeLeaf *) DLListHead ( &self->leaf_nodes );
+        *result_left = (*result)->header.leaf_id < leaf->header.leaf_id;
+        return;
+    }
+
+    {
+        int i;
+        int64_t leaf_id = leaf->header.leaf_id;
+        KRowSetTreeLeaf * nearest_leaf = NULL;
+        bool nearest_leaf_left;
+        for ( i = nodes_stack_size - 1; i >= 0; --i )
+        {
+            int depth;
+            int j;
+            int j_max;
+            uint8_t bt;
+            KRowSetTreeNode * current_node = nodes_stack[i];
+            void * nearest_subtree = NULL;
+            bool nearest_subtre_left;
+            int nearest_subtree_depth;
+
+            assert ( current_node != NULL );
+
+            depth = nodes_depth[i];
+            bt = KRowSetGetLeafIdByte ( leaf_id, depth );
+
+            assert ( current_node->children[bt] != NULL );
+
+            if ( 255 - bt > bt )
+                j_max = 255 - bt;
+            else
+                j_max = bt;
+
+            for (j = 1; j <= j_max; ++j)
+            {
+                if ( bt + j <= 255 && current_node->children[bt + j] != NULL )
+                {
+                    nearest_subtre_left = false;
+                    nearest_subtree = current_node->children[bt + j];
+                    nearest_subtree_depth = depth + 1 + current_node->transitions[bt + j].size;
+                    break;
+                }
+
+                if ( bt - j >= 0 && current_node->children[bt - j] != NULL )
+                {
+                    nearest_subtre_left = true;
+                    nearest_subtree = current_node->children[bt - j];
+                    nearest_subtree_depth = depth + 1 + current_node->transitions[bt - j].size;
+                    break;
+                }
+            }
+
+            if ( nearest_subtree != NULL )
+            {
+                for ( j = nearest_subtree_depth; j < LEAF_DEPTH; ++j )
+                {
+                    int search_i;
+                    int search_start = nearest_subtre_left ? 255 : 0;
+                    int search_stop = nearest_subtre_left ? 0 : 255;
+                    int search_step = nearest_subtre_left ? -1 : 1;
+                    void * nearest_subtree_next = NULL;
+                    KRowSetTreeNodeTransition * nearest_subtree_next_tr;
+
+#if CHECK_NODE_MARKS
+                    assert ( ((KRowSetTreeNode *) nearest_subtree)->node_mark == NODE_MARK );
+#endif
+
+                    for ( search_i = search_start; search_step > 0 ? search_i <= search_stop : search_i >= search_stop; search_i += search_step )
+                    {
+                        if ( ((KRowSetTreeNode *) nearest_subtree)->children[search_i] != NULL )
+                        {
+                            nearest_subtree_next = ((KRowSetTreeNode *) nearest_subtree)->children[search_i];
+                            nearest_subtree_next_tr = &((KRowSetTreeNode *) nearest_subtree)->transitions[search_i];
+                            break;
+                        }
+                    }
+
+                    assert ( nearest_subtree_next != NULL );
+                    nearest_subtree = nearest_subtree_next;
+                    j += nearest_subtree_next_tr->size;
+                }
+
+                assert ( j == LEAF_DEPTH );
+
+                nearest_leaf = nearest_subtree;
+                nearest_leaf_left = nearest_subtre_left;
+
+                break;
+            }
+        }
+
+        // empty tree is handled by previous "if"s
+        assert ( nearest_leaf != NULL );
+
+#if CHECK_NODE_MARKS
+        assert ( ((KRowSetTreeLeaf *) nearest_leaf)->header.leaf_mark == LEAF_MARK );
+#endif
+        *result = nearest_leaf;
+        *result_left = nearest_leaf_left;
+    }
+
+    return;
+}
+
+/**
+ * Checks if node's child pointed by "node_depth"'s "leaf_id" byte matches "leaf_id".
+ *  It is possible that transition uses more than one byte of "leaf_id".
+ *  In such case, we have to make sure that those bytes match.
+ */
+static
+bool KRowSetNodeIsTransitionMatches ( int64_t leaf_id, int node_depth, const KRowSetTreeNodeTransition * tr, int * size_matched )
+{
+    int matched;
+
+    assert ( node_depth + tr->size < LEAF_DEPTH );
+
+    for ( matched = 0; matched < tr->size; ++matched )
+    {
+        if ( KRowSetGetLeafIdByte ( leaf_id, matched + node_depth + 1 ) != tr->data[matched] )
+            break;
+    }
+
+    if ( size_matched != NULL )
+        *size_matched = matched;
+
+    return matched == tr->size;
+}
+
+/**
+ * Assigns a new child to a "node".
+ *  It will note create any extra node's even if child_depth - node_depth > 1
+ *  (because of radix trie compression)
+ */
+static
+void KRowSetNodeSetChild ( KRowSetTreeNode * node, void * child, int64_t leaf_id, int node_depth, int child_depth )
+{
+    uint8_t bt = KRowSetGetLeafIdByte ( leaf_id, node_depth );
+    int i;
+
+    node->children[bt] = child;
+    node->transitions[bt].size = child_depth - 1 - node_depth;
+
+    for ( i = node_depth; i < child_depth - 1; ++i )
+    {
+        node->transitions[bt].data[i - node_depth] = KRowSetGetLeafIdByte ( leaf_id, i + 1 );
+    }
+}
+
+/**
+ * Splits the node, by inserting "allocated_interm_node" between "node" and it's child
+ *  Corrects transitions after insertion.
+ *
+ *  NB - To ease error handling and deallocation of resources in case of errors,
+ *       "allocated_interm_node" has to be allocated before calling this function.
+ */
+static
+void KRowSetSplitNode ( KRowSetTreeNode * node, int node_depth, KRowSetTreeNode * allocated_interm_node, int interm_node_depth, int64_t leaf_id )
+{
+    uint8_t bt = KRowSetGetLeafIdByte ( leaf_id, node_depth );
+    uint8_t interm_bt;
+    void * child = node->children[bt];
+    int first_tr_size = interm_node_depth - node_depth - 1;
+
+#if CHECK_NODE_MARKS
+    allocated_interm_node->node_mark = NODE_MARK;
+#endif
+
+    assert ( allocated_interm_node != NULL );
+    assert ( node->children[bt] != NULL );
+
+    interm_bt = node->transitions[bt].data[first_tr_size];
+    allocated_interm_node->transitions[interm_bt].size = node->transitions[bt].size - first_tr_size - 1;
+    for ( int i = 0; i < allocated_interm_node->transitions[interm_bt].size; ++i )
+    {
+        allocated_interm_node->transitions[interm_bt].data[i] = node->transitions[bt].data[first_tr_size + i + 1];
+    }
+    allocated_interm_node->children[interm_bt] = child;
+
+    KRowSetNodeSetChild ( node, allocated_interm_node, leaf_id, node_depth, interm_node_depth );
+}
+
+/**
+ * Collapses node, by linking (parent) "node" to "collapse_node"'s the only child
+ *  and deallocates "collapse_node"
+ */
+static
+void KRowSetCollapseNode ( KRowSetTreeNode * node, int node_depth, KRowSetTreeNode * collapse_node, int collapse_node_depth, uint8_t collapse_node_bt, int64_t leaf_id )
+{
+    int i;
+    uint8_t node_bt = KRowSetGetLeafIdByte ( leaf_id, node_depth );
+
+#if CHECK_NODE_MARKS
+    node->node_mark = NODE_MARK;
+    collapse_node->node_mark = NODE_MARK;
+#endif
+    assert ( node->children[node_bt] == collapse_node );
+    assert ( collapse_node->children[collapse_node_bt] != NULL );
+
+    node->children[node_bt] = collapse_node->children[collapse_node_bt];
+    node->transitions[node_bt].data[node->transitions[node_bt].size++] = collapse_node_bt;
+    for ( i = 0; i < collapse_node->transitions[collapse_node_bt].size; ++i )
+    {
+        node->transitions[node_bt].data[node->transitions[node_bt].size++] = collapse_node->transitions[collapse_node_bt].data[i];
+    }
+
+    free ( collapse_node );
+}
+
+/**
+ * Sets "allocated_leaf" members and inserts it as a child to a previously found "node" that fits leaf_id.
+ *  Also inserts "allocated_leaf" to leaves linked list.
+ *
+ *  NB - To ease error handling and deallocation of resources in case of errors,
+ *       "allocated_leaf" has to be allocated before calling this function.
+ */
+static
+void KRowSetInsertLeaf ( KRowSet * self, int64_t leaf_id, KRowSetTreeNode * node, int node_depth, KRowSetTreeNode * nodes_stack[], int nodes_depth[], int nodes_stack_size, KRowSetTreeLeaf * allocated_leaf )
+{
+    KRowSetTreeLeaf * nearest_leaf;
+    bool nearest_leaf_left;
+    uint8_t bt;
+    bt = KRowSetGetLeafIdByte ( leaf_id, node_depth );
+
+    assert ( allocated_leaf != NULL );
+    assert ( node->children[bt] == NULL );
+
+    KRowSetNodeSetChild ( node, allocated_leaf, leaf_id, node_depth, LEAF_DEPTH );
+    node->children[bt] = allocated_leaf;
+
+    KRowSetFindNearestLeaf ( self, nodes_stack, nodes_depth, nodes_stack_size, allocated_leaf, &nearest_leaf, &nearest_leaf_left );
+    if ( nearest_leaf == NULL )
+        DLListPushTail ( &self->leaf_nodes, &allocated_leaf->header.dad );
+    else if (nearest_leaf_left)
+        DLListInsertNodeAfter ( &self->leaf_nodes, &nearest_leaf->header.dad, &allocated_leaf->header.dad );
+    else
+        DLListInsertNodeBefore ( &self->leaf_nodes, &nearest_leaf->header.dad, &allocated_leaf->header.dad );
+
+    ++self->number_leaves;
+    assert ( KRowSetNodeIsTransitionMatches ( leaf_id, node_depth, &node->transitions[bt], NULL ) );
+}
+
+/**
+ * Searches for a leaf by its id.
+ *  Returns rcNotFound when leaf is not in the tree and "insert_when_needed" is false,
+ *  otherwise inserts a new leaf and returns it in "leaf_found".
+ *
+ *  NB - This function preallocates all required resources
+ * 	     and only after that changes the RowSet data structure.
+ *
+ * 	     Using this approach we can simply return from the function,
+ * 	     since all the resources are being allocated once.
+ */
+static
+rc_t KRowSetGetLeaf ( KRowSet * self, int64_t leaf_id, bool insert_when_needed, KRowSetTreeLeaf ** leaf_found, KRowSetTreeNode * nodes_stack[], int nodes_depth[], int * nodes_stack_size )
+{
+    rc_t rc;
+    KRowSetTreeNode * node;
+    KRowSetTreeLeaf * new_leaf;
+    uint8_t bt;
+    int depth = 0;
+    int nodes_stack_size_int;
+    KRowSetTreeNode * nodes_stack_int[LEAF_DEPTH];
+    int nodes_depth_int[LEAF_DEPTH];
+
+    if ( self == NULL )
+        return RC ( rcDB, rcRowSet, rcSelecting, rcSelf, rcNull );
+
+    if ( leaf_found == NULL )
+        return RC ( rcDB, rcRowSet, rcSelecting, rcParam, rcNull );
+
+    if ( nodes_stack == NULL && nodes_depth == NULL && nodes_stack_size == NULL )
+    {
+        nodes_stack = nodes_stack_int;
+        nodes_depth = nodes_depth_int;
+        nodes_stack_size = &nodes_stack_size_int;
+    }
+    else if ( nodes_stack == NULL || nodes_depth == NULL || nodes_stack_size == NULL )
+        return RC ( rcDB, rcRowSet, rcSelecting, rcParam, rcNull );
+
+    *nodes_stack_size = 0;
+
+    // empty tree
+    if ( self->root_node == NULL )
+    {
+        KRowSetTreeNode * root;
+        if ( !insert_when_needed )
+            return RC ( rcDB, rcRowSet, rcSelecting, rcItem, rcNotFound );
+
+        root = calloc ( 1, sizeof ( KRowSetTreeNode ) );
+        if (root == NULL)
+            return RC ( rcDB, rcRowSet, rcInserting, rcMemory, rcExhausted );
+
+        // pre-allocate leaf here
+        rc = KRowSetAllocateLeaf ( LeafType_ArrayRanges, leaf_id, &new_leaf );
+        if ( rc != 0 )
+        {
+            free ( root );
+            return rc;
+        }
+
+#if CHECK_NODE_MARKS
+        root->node_mark = NODE_MARK;
+#endif
+
+        self->root_node = root;
+
+        node = self->root_node;
+        nodes_stack[*nodes_stack_size] = node;
+        nodes_depth[(*nodes_stack_size)++] = depth;
+
+        KRowSetInsertLeaf ( self, leaf_id, node, depth, nodes_stack, nodes_depth, *nodes_stack_size, new_leaf );
+        *leaf_found = new_leaf;
+        return 0;
+    }
+
+    node = self->root_node;
+    nodes_stack[*nodes_stack_size] = node;
+    nodes_depth[(*nodes_stack_size)++] = depth;
+#if CHECK_NODE_MARKS
+        assert ( node->node_mark == NODE_MARK );
+#endif
+
+    for ( ; depth < LEAF_DEPTH; )
+    {
+        int tr_size_matched;
+        bt = KRowSetGetLeafIdByte ( leaf_id, depth );
+        // no child at a given transition, let's insert leaf here
+        if ( node->children[bt] == NULL )
+        {
+            if ( !insert_when_needed )
+                return RC ( rcDB, rcRowSet, rcSelecting, rcItem, rcNotFound );
+
+            // pre-allocate leaf here
+            rc = KRowSetAllocateLeaf ( LeafType_ArrayRanges, leaf_id, &new_leaf );
+            if ( rc != 0 )
+                return rc;
+
+            KRowSetInsertLeaf ( self, leaf_id, node, depth, nodes_stack, nodes_depth, *nodes_stack_size, new_leaf );
+            *leaf_found = new_leaf;
+            return 0;
+        }
+
+        // transition does not match, split the node
+        if ( !KRowSetNodeIsTransitionMatches ( leaf_id, depth, &node->transitions[bt], &tr_size_matched ) )
+        {
+            KRowSetTreeNode * interm_node;
+            int interm_node_depth = depth + 1 + tr_size_matched;
+
+            if ( !insert_when_needed )
+                return RC ( rcDB, rcRowSet, rcSelecting, rcItem, rcNotFound );
+
+            // pre-allocate node and leaf here
+            interm_node = calloc ( 1, sizeof ( KRowSetTreeNode ) );
+            if ( interm_node == NULL )
+                return RC ( rcDB, rcRowSet, rcInserting, rcMemory, rcExhausted );
+
+            rc = KRowSetAllocateLeaf ( LeafType_ArrayRanges, leaf_id, &new_leaf );
+            if ( rc != 0 )
+            {
+                free ( interm_node );
+                return rc;
+            }
+
+            KRowSetSplitNode ( node, depth, interm_node, interm_node_depth, leaf_id );
+
+            node = interm_node;
+            depth = interm_node_depth;
+#if CHECK_NODE_MARKS
+            assert ( node->node_mark == NODE_MARK );
+#endif
+            assert ( depth < LEAF_DEPTH );
+            nodes_stack[*nodes_stack_size] = node;
+            nodes_depth[(*nodes_stack_size)++] = depth;
+
+            KRowSetInsertLeaf ( self, leaf_id, node, depth, nodes_stack, nodes_depth, *nodes_stack_size, new_leaf );
+            *leaf_found = new_leaf;
+            return 0;
+
+        }
+
+        // check if transition leads to a leaf or follow the transition
+        if ( depth + 1 + tr_size_matched == LEAF_DEPTH )
+        {
+            *leaf_found = node->children[bt];
+            return 0;
+        }
+
+        node = node->children[bt];
+        depth += 1 + tr_size_matched;
+#if CHECK_NODE_MARKS
+        assert ( node->node_mark == NODE_MARK );
+#endif
+        assert ( depth < LEAF_DEPTH );
+        nodes_stack[*nodes_stack_size] = node;
+        nodes_depth[(*nodes_stack_size)++] = depth;
+    }
+
+    // "for" loop iterates up to a maximum possible depth,
+    // so it must come to a leaf
+    assert ( false );
+    return 0;
+}
+
+/**
+ * Transforms leaf from LeafType_ArrayRanges to LeafType_Bitmap
+ */
+static
+rc_t KRowSetTreeLeafTransform ( KRowSet * self, KRowSetTreeLeaf ** p_leaf, KRowSetTreeNode * parent_node, int parent_depth )
+{
+    rc_t rc;
+    int i;
+    int j;
+    int len;
+    uint8_t parent_bt;
+    uint16_t leaf_bt;
+    KRowSetTreeLeaf * leaf;
+    KRowSetTreeLeaf * new_leaf;
+
+    assert ( p_leaf != NULL );
+    leaf = *p_leaf;
+    assert ( leaf != NULL );
+
+    parent_bt = KRowSetGetLeafIdByte ( leaf->header.leaf_id, parent_depth );
+    assert ( KRowSetNodeIsTransitionMatches ( leaf->header.leaf_id, parent_depth, &parent_node->transitions[parent_bt], NULL ) );
+
+    rc = KRowSetAllocateLeaf( LeafType_Bitmap, leaf->header.leaf_id, &new_leaf );
+    if ( rc != 0 )
+        return rc;
+
+    // copy rows to a new leaf
+    len = leaf->data.array_ranges.len;
+    for ( i = 0; i < len; ++i )
+    {
+        struct KRowSetTreeLeafRowRange * range = &leaf->data.array_ranges.ranges[i];
+        for ( j = range->start; j <= range->end; ++j )
+        {
+            leaf_bt = j;
+            new_leaf->data.bitmap[leaf_bt >> 3] |= 1 << (leaf_bt & 7);
+        }
+    }
+    new_leaf->header.leaf_rows = leaf->header.leaf_rows;
+
+    DLListInsertNodeBefore ( &self->leaf_nodes, &leaf->header.dad, &new_leaf->header.dad );
+    KRowSetLeafWhack ( &leaf->header.dad, &self->leaf_nodes );
+    leaf = new_leaf;
+    parent_node->children[parent_bt] = leaf;
+    *p_leaf = leaf;
+
+    return 0;
+}
+
+static
+int KRowSetBitmapByteRows ( uint8_t bt )
+{
+    static int NIBBLE_LOOKUP[] = {
+        0, 1, 1, 2, 1, 2, 2, 3,
+        1, 2, 2, 3, 2, 3, 3, 4
+    };
+    return NIBBLE_LOOKUP[bt & 0x0F] + NIBBLE_LOOKUP[bt >> 4];
+}
+
+
+/**
+ * NB- it may reallocate leaf in case when leaf is transformed,
+ *     so leaf pointer may change as a result of this function
+ */
+static
+rc_t KRowSetTreeLeafAddRows ( KRowSet * self, KRowSetTreeLeaf ** p_leaf, uint16_t leaf_row_start, uint16_t leaf_row_end, KRowSetTreeNode * parent_node, int parent_depth, int * rows_inserted )
+{
+    KRowSetTreeLeaf * leaf = *p_leaf;
+    int i;
+    uint16_t leaf_row;
+
+    assert ( rows_inserted != NULL );
+    assert ( leaf_row_end >= leaf_row_start );
+
+    *rows_inserted = 0;
+
+    switch ( leaf->header.type )
+    {
+    case LeafType_Bitmap:
+    {
+        uint8_t* mem_ptr;
+        size_t mem_size;
+
+        // try to align to the nearest 8 rows from left
+        if ( (leaf_row_start | 7) <  leaf_row_end )
+        {
+            for ( i = leaf_row_start; i <= (leaf_row_start | 7); ++i )
+            {
+                leaf_row = i;
+                if ( ( leaf->data.bitmap[leaf_row >> 3] & (1 << (leaf_row & 7)) ) != 0 )
+                    continue;
+
+                leaf->data.bitmap[leaf_row >> 3] |= 1 << (leaf_row & 7);
+                ++leaf->header.leaf_rows;
+                ++(*rows_inserted);
+            }
+
+            leaf_row_start = (leaf_row_start | 7) + 1;
+        }
+
+        // if we are left aligned and still have more than 8 rows,
+        // then use memset to set multiple rows at once
+        if ( (leaf_row_start & 7) == 0 && leaf_row_end + 1 - leaf_row_start >= 8 )
+        {
+            int range_rows_prev = 0;
+
+            mem_ptr = &leaf->data.bitmap[leaf_row_start >> 3];
+            mem_size = (leaf_row_end + 1 - leaf_row_start) / 8;
+
+            assert ( mem_size > 0 );
+
+            for ( i = 0; i < mem_size; ++i )
+            {
+                range_rows_prev += KRowSetBitmapByteRows ( mem_ptr[i] );
+            }
+
+            memset ( mem_ptr, 0xFF, mem_size );
+            leaf_row_start += mem_size * 8;
+            *rows_inserted += mem_size * 8 - range_rows_prev;
+            leaf->header.leaf_rows += mem_size * 8 - range_rows_prev;
+        }
+
+        // insert all remaining rows
+        {
+            for ( i = leaf_row_start; i <= leaf_row_end; ++i )
+            {
+                leaf_row = i;
+                if ( ( leaf->data.bitmap[leaf_row >> 3] & (1 << (leaf_row & 7)) ) != 0 )
+                    continue;
+
+                leaf->data.bitmap[leaf_row >> 3] |= 1 << (leaf_row & 7);
+                ++leaf->header.leaf_rows;
+                ++(*rows_inserted);
+            }
+            return 0;
+        }
+
+        break;
+    }
+    case LeafType_ArrayRanges:
+    {
+        int j;
+        int insert_i;
+        int len = leaf->data.array_ranges.len;
+        int max_len = 8;
+        for ( i = 0; i < len; ++i )
+        {
+            struct KRowSetTreeLeafRowRange * range = &leaf->data.array_ranges.ranges[i];
+
+            // we can just increase existing range to the left
+            if ( range->start > 0 && leaf_row_end >= range->start - 1 && leaf_row_start < range->start )
+            {
+                if ( i == 0 || (range - 1)->end < leaf_row_start )
+                {
+                    *rows_inserted += range->start - leaf_row_start;
+                    leaf->header.leaf_rows += range->start - leaf_row_start;
+                    range->start = leaf_row_start;
+                }
+            }
+
+            // or to the right
+            // but lets first check next range, maybe we can just merge them both
+            if ( leaf_row_start <= range->end + 1 && leaf_row_end > range->end )
+            {
+                if ( i + 1 < len && leaf_row_end >= (range+1)->start - 1 )
+                {
+                    // just merge two ranges
+                    *rows_inserted += (range+1)->start - range->end - 1;
+
+                    range->end = (range+1)->end;
+
+                    --len;
+                    --leaf->data.array_ranges.len;
+                    for ( j = i + 1; j < len; --j )
+                    {
+                        leaf->data.array_ranges.ranges[j] = leaf->data.array_ranges.ranges[j + 1];
+                    }
+                    --i;
+                    continue;
+                }
+
+                leaf->header.leaf_rows += leaf_row_end - range->end;
+                *rows_inserted += leaf_row_end - range->end;
+                range->end = leaf_row_end;
+            }
+
+            // not found - insert new range
+            if ( range->start > leaf_row_end && ( i == 0 || (range - 1)->end < leaf_row_start ) )
+            {
+                break;
+            }
+        }
+
+        // check if we are done
+        if ( i > 0 && leaf->data.array_ranges.ranges[i-1].end >= leaf_row_end )
+            break;
+
+        // came here because we need to insert a new range
+        // (or transform a leaf to a bitmap)
+        insert_i = i;
+
+        if ( len == max_len )
+        {
+            rc_t rc;
+            rc = KRowSetTreeLeafTransform ( self, p_leaf, parent_node, parent_depth );
+            if ( rc != 0 )
+                return rc;
+
+            return KRowSetTreeLeafAddRows ( self, p_leaf, leaf_row_start, leaf_row_end, parent_node, parent_depth, rows_inserted );
+        }
+
+        ++len;
+        ++leaf->data.array_ranges.len;
+        for ( i = len - 1; i > insert_i; --i )
+        {
+            leaf->data.array_ranges.ranges[i] = leaf->data.array_ranges.ranges[i - 1];
+        }
+
+        leaf->data.array_ranges.ranges[insert_i].start = leaf_row_start;
+        leaf->data.array_ranges.ranges[insert_i].end = leaf_row_end;
+        leaf->header.leaf_rows += leaf_row_end - leaf_row_start + 1;
+        *rows_inserted += leaf_row_end - leaf_row_start + 1;
+
+        break;
+    }
+    default:
+        assert ( false );
+    }
+
+    return 0;
+}
+
+KDB_EXTERN rc_t CC KRowSetAddRowIdRange ( KRowSet * self, int64_t row_id_start,
+    uint64_t row_id_count, uint64_t * optional_inserted )
+{
+    rc_t rc = 0;
+    KRowSetTreeLeaf * leaf;
+    int64_t current_range_start = row_id_start;
+    uint64_t total_inserted = 0;
+    uint16_t leaf_row_start;
+    uint16_t leaf_row_end;
+    int leaf_row_count;
+    int leaf_rows_inserted;
+
+    int nodes_stack_size;
+    KRowSetTreeNode * nodes_stack[LEAF_DEPTH];
+    int nodes_depth[LEAF_DEPTH];
+
+    if ( row_id_start < 0 || row_id_count <= 0 )
+        return RC ( rcDB, rcRowSet, rcInserting, rcParam, rcInvalid );
+
+    if ( row_id_start + row_id_count < row_id_start )
+        return RC ( rcDB, rcRowSet, rcInserting, rcParam, rcOutofrange );
+
+    if ( optional_inserted != NULL )
+        *optional_inserted = 0;
+
+    while ( rc == 0 && current_range_start < row_id_start + row_id_count )
+    {
+        leaf_row_start = current_range_start & ROW_LEAF_MAX;
+        leaf_row_count = ROW_LEAF_MAX - leaf_row_start + 1;
+        if ( current_range_start + leaf_row_count > row_id_start + row_id_count )
+            leaf_row_count = row_id_start + row_id_count - current_range_start;
+
+        assert ( leaf_row_start + leaf_row_count - 1 <= ROW_LEAF_MAX );
+        leaf_row_end = leaf_row_start + leaf_row_count - 1;
+
+        rc = KRowSetGetLeaf ( self, current_range_start >> 16, true, &leaf, nodes_stack, nodes_depth, &nodes_stack_size );
+        if ( rc == 0 )
+        {
+            rc = KRowSetTreeLeafAddRows ( self, &leaf, leaf_row_start, leaf_row_end, nodes_stack[nodes_stack_size-1], nodes_depth[nodes_stack_size-1], &leaf_rows_inserted );
+        }
+
+        if ( rc == 0 )
+            assert ( leaf_row_count >= leaf_rows_inserted );
+        else
+            assert ( leaf_row_count > leaf_rows_inserted );
+
+        current_range_start += leaf_row_count;
+        total_inserted += leaf_rows_inserted;
+    }
+
+    self->number_rows += total_inserted;
+    if ( optional_inserted != NULL )
+        *optional_inserted = total_inserted;
+
+    return rc;
+}
+
+KDB_EXTERN rc_t CC KRowSetAddRowId ( KRowSet * self, int64_t row_id, bool * optional_inserted )
+{
+    rc_t rc;
+    uint64_t num_inserted;
+
+    if ( optional_inserted != NULL )
+        *optional_inserted = false;
+
+    rc = KRowSetAddRowIdRange ( self, row_id, 1, &num_inserted );
+    if ( rc != 0 )
+        return rc;
+
+    if ( optional_inserted != NULL )
+        *optional_inserted = num_inserted > 0;
+
+    return 0;
+}
+
+KDB_EXTERN rc_t CC KRowSetGetNumRowIds ( const KRowSet * self, uint64_t * num_rows )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcRowSet, rcAccessing, rcSelf, rcNull );
+
+    if ( num_rows == NULL )
+        return RC ( rcDB, rcRowSet, rcAccessing, rcParam, rcNull );
+
+    *num_rows = self->number_rows;
+    return 0;
+}
+
+KDB_EXTERN rc_t CC KRowSetVisit ( const KRowSet * self, bool reverse,
+    void ( CC * cb ) ( int64_t row_id, void * data ), void * data )
+{
+    rc_t rc;
+    KRowSetIterator * it;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcRowSet, rcAccessing, rcSelf, rcNull );
+
+    if ( self->number_rows == 0 )
+        return 0;
+
+    rc = KRowSetMakeIterator ( self, &it );
+    if ( rc != 0 )
+        return rc;
+
+    if ( !reverse )
+        rc = KRowSetIteratorFirst ( it );
+    else
+        rc = KRowSetIteratorLast ( it );
+
+    while ( rc == 0 )
+    {
+        int64_t row_id;
+        rc = KRowSetIteratorRowId ( it, &row_id );
+        if ( rc != 0 )
+            break;
+
+        cb ( row_id, data );
+
+        if ( !reverse )
+            rc = KRowSetIteratorNext ( it );
+        else
+            rc = KRowSetIteratorPrev ( it );
+
+        if ( GetRCState ( rc ) == rcDone )
+        {
+            rc = 0;
+            break;
+        }
+    }
+
+    KRowSetIteratorRelease ( it );
+
+    return rc;
+}
+
+/**
+ * Tries to intersect array-range leaf (self) with bitmap leaf (other).
+ * Returns true if succeeds to produce array-range result and stores it in target_ranges/target_rows
+ */
+static
+bool KRowSetIntersectRowRangeAndBitmapLeaves ( KRowSet * self, const KRowSetTreeLeaf * self_leaf, const KRowSetTreeLeaf * other_leaf, struct KRowSetTreeLeafArrayRanges * target_ranges, int * target_rows )
+{
+    const struct KRowSetTreeLeafRowRange * self_range;
+    const struct KRowSetTreeLeafRowRange * self_end_range;
+
+    struct KRowSetTreeLeafRowRange * target_range;
+    const struct KRowSetTreeLeafRowRange * target_first_range;
+    const struct KRowSetTreeLeafRowRange * target_end_range;
+
+    assert ( self_leaf != NULL );
+    assert ( other_leaf != NULL );
+    assert ( target_ranges != NULL );
+    assert ( target_rows != NULL );
+
+#if CHECK_NODE_MARKS
+    assert ( self_leaf->header.leaf_mark == LEAF_MARK );
+    assert ( other_leaf->header.leaf_mark == LEAF_MARK );
+#endif
+
+    assert ( self_leaf->header.type == LeafType_ArrayRanges );
+    assert ( other_leaf->header.type == LeafType_Bitmap );
+
+    self_range = &self_leaf->data.array_ranges.ranges[0];
+    self_end_range = &self_leaf->data.array_ranges.ranges[self_leaf->data.array_ranges.len];
+
+    target_range = &target_ranges->ranges[0];
+    target_first_range = &target_ranges->ranges[0];
+    target_end_range = &target_ranges->ranges[8];
+
+    target_ranges->len = 0;
+    *target_rows = 0;
+
+    int i;
+    for ( i = 0; i < LEAF_DATA_SZ_BT; ++i )
+    {
+        uint16_t bt_first_row = i << 3;
+        uint16_t bt_last_row = bt_first_row | 7;
+        int j;
+
+        if ( other_leaf->data.bitmap[i] == 0 )
+            continue;
+
+        while ( self_range != self_end_range && bt_first_row > self_range->end )
+            ++self_range;
+
+        if ( self_range == self_end_range || bt_first_row > self_range->end )
+        {
+            return true;
+        }
+
+        if ( bt_last_row < self_range->start )
+        {
+            i = (self_range->start >> 3) - 1;
+            continue;
+        }
+
+        for ( j = 0; j < 8; ++j )
+        {
+            uint16_t bt_row = bt_first_row + j;
+            if ( (other_leaf->data.bitmap[i] & (1 << j)) != 0 && bt_row <= self_range->end && bt_row >= self_range->start )
+            {
+                if ( target_range != target_first_range && (target_range-1)->end == bt_row - 1 )
+                {
+                    ++(target_range-1)->end;
+                    ++(*target_rows);
+                    continue;
+                }
+
+                if ( target_range == target_end_range )
+                {
+                    return false;
+                }
+
+                target_range->start = target_range->end = bt_row;
+                ++(*target_rows);
+                ++target_range;
+                ++target_ranges->len;
+            }
+        }
+    }
+
+
+    return true;
+}
+
+/**
+ * Tries to intersect array-range leaf (self) with array-range leaf (other).
+ * Returns true if succeeds to produce array-range result and stores it in target_ranges/target_rows
+ */
+static
+bool KRowSetIntersectRowRangeLeaves ( KRowSet * self, const KRowSetTreeLeaf * self_leaf, const KRowSetTreeLeaf * other_leaf, struct KRowSetTreeLeafArrayRanges * target_ranges, int * target_rows )
+{
+    const struct KRowSetTreeLeafRowRange * self_range;
+    const struct KRowSetTreeLeafRowRange * self_end_range;
+    const struct KRowSetTreeLeafRowRange * other_range;
+    const struct KRowSetTreeLeafRowRange * other_end_range;
+
+    struct KRowSetTreeLeafRowRange * target_range;
+    const struct KRowSetTreeLeafRowRange * target_end_range;
+
+    assert ( self_leaf != NULL );
+    assert ( other_leaf != NULL );
+    assert ( target_ranges != NULL );
+    assert ( target_rows != NULL );
+
+#if CHECK_NODE_MARKS
+    assert ( self_leaf->header.leaf_mark == LEAF_MARK );
+    assert ( other_leaf->header.leaf_mark == LEAF_MARK );
+#endif
+
+    assert ( self_leaf->header.type == LeafType_ArrayRanges );
+    assert ( other_leaf->header.type == LeafType_ArrayRanges );
+
+    self_range = &self_leaf->data.array_ranges.ranges[0];
+    self_end_range = &self_leaf->data.array_ranges.ranges[self_leaf->data.array_ranges.len];
+    other_range = &other_leaf->data.array_ranges.ranges[0];
+    other_end_range = &other_leaf->data.array_ranges.ranges[other_leaf->data.array_ranges.len];
+
+    target_range = &target_ranges->ranges[0];
+    target_end_range = &target_ranges->ranges[8];
+
+    target_ranges->len = 0;
+    *target_rows = 0;
+
+    while ( self_range != self_end_range && other_range != other_end_range )
+    {
+        if ( self_range->end < other_range->start )
+        {
+            ++self_range;
+            continue;
+        }
+
+        if ( other_range->end < self_range->start )
+        {
+            ++other_range;
+            continue;
+        }
+
+        if ( target_range == target_end_range )
+            return false;
+
+        target_range->start = MAX ( self_range->start, other_range->start );
+        target_range->end = MIN ( self_range->end, other_range->end );
+        *target_rows += target_range->end - target_range->start + 1;
+        ++target_range;
+        ++target_ranges->len;
+
+        if ( self_range->end < other_range->end )
+            ++self_range;
+        else if ( other_range->end < self_range->end )
+            ++other_range;
+        else
+        {
+            ++self_range;
+            ++other_range;
+        }
+    }
+
+    return true;
+}
+
+/**
+ * Performs mutable intersection of self_leaf with other_leaf.
+ *  Result of intersection is saved to self_leaf.
+ *
+ * NB - it checks types of self and other leaves and performs intersection depending on types.
+ */
+static
+rc_t KRowSetOpAndIntersectLeaf ( KRowSet * self, KRowSetTreeLeaf ** self_leaf_p, const KRowSetTreeLeaf * other_leaf )
+{
+    KRowSetTreeLeaf * self_leaf;
+    int64_t leaf_id;
+
+    assert ( self_leaf_p != NULL );
+    self_leaf = *self_leaf_p;
+    assert ( self_leaf != NULL );
+    assert ( other_leaf != NULL );
+
+#if CHECK_NODE_MARKS
+    assert ( self_leaf->header.leaf_mark == LEAF_MARK );
+    assert ( other_leaf->header.leaf_mark == LEAF_MARK );
+#endif
+
+    leaf_id = self_leaf->header.leaf_id;
+    assert ( leaf_id == other_leaf->header.leaf_id );
+
+    switch ( self_leaf->header.type )
+    {
+    case LeafType_Bitmap:
+        if ( other_leaf->header.type == LeafType_Bitmap )
+        {
+            int i;
+            for ( i = 0; i < LEAF_DATA_SZ_BT; ++i )
+            {
+                int rows_before = KRowSetBitmapByteRows ( self_leaf->data.bitmap[i] );
+                int rows_after;
+                self_leaf->data.bitmap[i] &= other_leaf->data.bitmap[i];
+                rows_after = KRowSetBitmapByteRows ( self_leaf->data.bitmap[i] );
+                self_leaf->header.leaf_rows -= rows_before - rows_after;
+                self->number_rows -= rows_before - rows_after;
+            }
+            return 0;
+
+        }
+
+        if ( other_leaf->header.type == LeafType_ArrayRanges )
+        {
+            int i;
+            const struct KRowSetTreeLeafRowRange * other_range = &other_leaf->data.array_ranges.ranges[0];
+            const struct KRowSetTreeLeafRowRange * other_end_range = &other_leaf->data.array_ranges.ranges[other_leaf->data.array_ranges.len];
+            for ( i = 0; i < LEAF_DATA_SZ_BT; ++i )
+            {
+                uint16_t bt_first_row = i << 3;
+                uint16_t bt_last_row = bt_first_row | 7;
+                int j;
+
+                if ( self_leaf->data.bitmap[i] == 0 )
+                    continue;
+
+                while ( other_range != other_end_range && bt_first_row > other_range->end )
+                    ++other_range;
+
+                if ( other_range == other_end_range || bt_first_row > other_range->end )
+                {
+                    for ( ; i < LEAF_DATA_SZ_BT; ++i )
+                    {
+                        int bt_rows = KRowSetBitmapByteRows ( self_leaf->data.bitmap[i] );
+                        self_leaf->data.bitmap[i] = 0;
+                        self_leaf->header.leaf_rows -= bt_rows;
+                        self->number_rows -= bt_rows;
+                    }
+                    break;
+                }
+
+                if ( bt_last_row < other_range->start )
+                {
+                    int bt_rows = KRowSetBitmapByteRows ( self_leaf->data.bitmap[i] );
+                    self_leaf->data.bitmap[i] = 0;
+                    self_leaf->header.leaf_rows -= bt_rows;
+                    self->number_rows -= bt_rows;
+                    continue;
+                }
+
+                for ( j = 0; j < 8; ++j )
+                {
+                    uint16_t bt_row = bt_first_row + j;
+                    if ( (self_leaf->data.bitmap[i] & (1 << j))== 0 )
+                        continue;
+
+                    if ( bt_row > other_range->end || bt_row < other_range->start )
+                    {
+                        self_leaf->data.bitmap[i] &= ~(1 << j);
+                        --self_leaf->header.leaf_rows;
+                        --self->number_rows;
+                    }
+                }
+            }
+            return 0;
+        }
+
+        assert ( false );
+        break;
+    case LeafType_ArrayRanges:
+    {
+        struct KRowSetTreeLeafArrayRanges result_ranges;
+        int result_rows;
+        bool can_produce_ranges;
+        if ( other_leaf->header.type == LeafType_Bitmap )
+        {
+            can_produce_ranges = KRowSetIntersectRowRangeAndBitmapLeaves ( self, self_leaf, other_leaf, &result_ranges, &result_rows );
+        }
+        else if ( other_leaf->header.type == LeafType_ArrayRanges )
+        {
+            can_produce_ranges = KRowSetIntersectRowRangeLeaves ( self, self_leaf, other_leaf, &result_ranges, &result_rows );
+        }
+        else
+            assert ( false );
+
+        if ( can_produce_ranges )
+        {
+            int i;
+            self_leaf->data.array_ranges.len = result_ranges.len;
+            for ( i = 0; i < result_ranges.len; ++i )
+            {
+                assert ( result_ranges.ranges[i].start <= result_ranges.ranges[i].end );
+                self_leaf->data.array_ranges.ranges[i] = result_ranges.ranges[i];
+            }
+            self->number_rows += result_rows - self_leaf->header.leaf_rows;
+            self_leaf->header.leaf_rows = result_rows;
+            return 0;
+        }
+
+        // transform array range leaf into bitmap and perform operation once again
+        {
+            rc_t rc;
+
+            int nodes_stack_size;
+            KRowSetTreeNode * nodes_stack[LEAF_DEPTH];
+            int nodes_depth[LEAF_DEPTH];
+            KRowSetTreeLeaf * search_leaf;
+
+            rc = KRowSetGetLeaf ( self, self_leaf->header.leaf_id, false, &search_leaf, nodes_stack, nodes_depth, &nodes_stack_size );
+            if ( GetRCObject ( rc ) == rcItem && GetRCState ( rc ) == rcNotFound )
+                return RC ( rcDB, rcRowSet, rcUpdating, rcItem, rcInconsistent );
+
+            if ( rc != 0 )
+                return rc;
+
+            if ( search_leaf != self_leaf )
+                return RC ( rcDB, rcRowSet, rcUpdating, rcItem, rcInconsistent );
+
+            rc = KRowSetTreeLeafTransform ( self, self_leaf_p, nodes_stack[nodes_stack_size-1], nodes_depth[nodes_stack_size-1] );
+            if ( rc != 0 )
+                return rc;
+
+            self_leaf = *self_leaf_p;
+
+            return KRowSetOpAndIntersectLeaf ( self, self_leaf_p, other_leaf );
+        }
+        break;
+    }
+    default:
+        assert ( false );
+    }
+
+    assert ( false );
+    return 0;
+}
+
+/**
+ * Removes a leaf (and its rows) from the tree and deallocates/collapses intermediate nodes when necessary
+ */
+static
+rc_t KRowSetRemoveLeaf ( KRowSet * self, KRowSetTreeLeaf * leaf )
+{
+    rc_t rc;
+    int i;
+    int64_t leaf_id;
+
+    int nodes_stack_size;
+    KRowSetTreeNode * nodes_stack[LEAF_DEPTH];
+    int nodes_depth[LEAF_DEPTH];
+    KRowSetTreeLeaf * search_leaf;
+
+    assert ( leaf != NULL );
+#if CHECK_NODE_MARKS
+        assert ( leaf->header.leaf_mark == LEAF_MARK );
+#endif
+    leaf_id = leaf->header.leaf_id;
+
+    rc = KRowSetGetLeaf ( self, leaf->header.leaf_id, false, &search_leaf, nodes_stack, nodes_depth, &nodes_stack_size );
+    if ( GetRCObject ( rc ) == rcItem && GetRCState ( rc ) == rcNotFound )
+        return RC ( rcDB, rcRowSet, rcUpdating, rcItem, rcInconsistent );
+
+    if ( rc != 0 )
+        return rc;
+
+    if ( search_leaf != leaf )
+        return RC ( rcDB, rcRowSet, rcUpdating, rcItem, rcInconsistent );
+
+    for ( i = nodes_stack_size - 1; i >= 0; --i )
+    {
+        int number_children;
+        int j;
+        int found_j; // this will be used in case when there is only a single child exists
+        uint8_t bt;
+
+        KRowSetTreeNode * node = nodes_stack[i];
+        assert ( node != NULL );
+#if CHECK_NODE_MARKS
+        assert ( node->node_mark == NODE_MARK );
+#endif
+
+        bt = KRowSetGetLeafIdByte ( leaf_id, nodes_depth[i] );
+
+        assert ( node->children[bt] != NULL );
+
+        node->children[bt] = NULL;
+        node->transitions[bt].size = 0;
+
+        number_children = 0;
+        found_j = -1;
+        for ( j = 0; j < 256; ++j )
+        {
+            if ( node->children[j] != NULL )
+            {
+                ++number_children;
+                found_j = j;
+            }
+        }
+
+        if ( number_children == 0 )
+        {
+            assert ( i != 0 || node == self->root_node );
+            KRowSetNodeWhack ( self, node, nodes_depth[i], false );
+            if ( i == 0 )
+                self->root_node = NULL;
+            continue;
+        }
+
+        // it has only a single child, need to collapse
+        if ( number_children == 1 && i > 0 )
+            KRowSetCollapseNode ( nodes_stack[i-1], nodes_depth[i-1], node, nodes_depth[i], found_j, leaf_id );
+
+        break;
+    }
+
+    self->number_rows -= leaf->header.leaf_rows;
+    --self->number_leaves;
+    KRowSetLeafWhack ( (DLNode *) leaf, &self->leaf_nodes );
+
+    return 0;
+}
+
+KDB_EXTERN rc_t CC KRowSetOpAnd ( KRowSet * self, const KRowSet * other )
+{
+    rc_t rc;
+    KRowSetTreeLeaf * self_leaf;
+    const KRowSetTreeLeaf * other_leaf;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcRowSet, rcUpdating, rcSelf, rcNull );
+
+    if ( other == NULL )
+        return RC ( rcDB, rcRowSet, rcUpdating, rcParam, rcNull );
+
+    self_leaf = (KRowSetTreeLeaf *) KRowSetTreeGetFirstLeaf ( self );
+    other_leaf = KRowSetTreeGetFirstLeaf ( other );
+
+    while ( self_leaf != NULL )
+    {
+        KRowSetTreeLeaf * next_leaf;
+        if ( other_leaf == NULL || other_leaf->header.leaf_id > self_leaf->header.leaf_id )
+        {
+            next_leaf = (KRowSetTreeLeaf *) KRowSetTreeLeafGetNext ( self_leaf );
+            KRowSetRemoveLeaf ( self, self_leaf );
+            self_leaf = next_leaf;
+            continue;
+        }
+
+        if ( other_leaf->header.leaf_id < self_leaf->header.leaf_id )
+        {
+            other_leaf = KRowSetTreeLeafGetNext ( other_leaf );
+            continue;
+        }
+
+        // leafs are aligned
+        assert ( other_leaf->header.leaf_id == self_leaf->header.leaf_id );
+        rc = KRowSetOpAndIntersectLeaf ( self, &self_leaf, other_leaf );
+        if ( rc != 0 )
+            return rc;
+
+        other_leaf = KRowSetTreeLeafGetNext ( other_leaf );
+
+        next_leaf = (KRowSetTreeLeaf *) KRowSetTreeLeafGetNext ( self_leaf );
+        if ( self_leaf->header.leaf_rows == 0 )
+            KRowSetRemoveLeaf ( self, self_leaf );
+        self_leaf = next_leaf;
+    }
+
+    return 0;
+}
+
+const KRowSetTreeLeaf * KRowSetTreeGetFirstLeaf ( const KRowSet * self )
+{
+    assert ( self != NULL );
+    return (const KRowSetTreeLeaf * )DLListHead ( &self->leaf_nodes );
+}
+
+const KRowSetTreeLeaf * KRowSetTreeGetLastLeaf ( const KRowSet * self )
+{
+    assert ( self != NULL );
+    return (const KRowSetTreeLeaf * )DLListTail ( &self->leaf_nodes );
+}
+
+const KRowSetTreeLeaf * KRowSetTreeLeafGetNext ( const KRowSetTreeLeaf * leaf )
+{
+    assert ( leaf != NULL );
+    return (const KRowSetTreeLeaf * ) DLNodeNext ( &leaf->header.dad );
+}
+
+const KRowSetTreeLeaf * KRowSetTreeLeafGetPrev ( const KRowSetTreeLeaf * leaf )
+{
+    assert ( leaf != NULL );
+    return (const KRowSetTreeLeaf * ) DLNodePrev ( &leaf->header.dad );
+}
diff --git a/libs/kdb/table-cc.c b/libs/kdb/table-cc.c
new file mode 100644
index 0000000..13d6f77
--- /dev/null
+++ b/libs/kdb/table-cc.c
@@ -0,0 +1,378 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ *============================================================================
+ *
+ */
+
+#include <kdb/extern.h>
+
+#define KONST const
+#include "index-priv.h"
+#include "dbmgr-priv.h"
+#include "database-priv.h"
+#include "table-priv.h"
+#include "kdb-priv.h"
+#include "column-priv.h"
+#undef KONST
+
+#include "cc-priv.h"
+
+#include <kdb/index.h>
+#include <kdb/meta.h>
+#include <kdb/kdb-priv.h>
+
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <klib/refcount.h>
+#include <klib/log.h> /* PLOGMSG */
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <kdb/namelist.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#undef index
+
+static void KTableGetName(KTable const *self, char const **rslt)
+{
+    char *sep;
+    
+    *rslt = self->path;
+    sep = strrchr(self->path, '/');
+    if (sep != NULL)
+        *rslt = sep + 1;
+}
+
+static
+rc_t KTableCheckMD5 ( const KTable *self, CCReportFunc report, void *ctx )
+{
+    CCReportInfoBlock info;
+    memset ( & info, 0, sizeof info );
+
+    info.objType = kptTable;
+    KTableGetName(self, &info.objName);
+    
+    return DirectoryCheckMD5 ( self->dir, "md5", & info, report, ctx );
+}
+
+#if 0
+static bool KTableCheckColumnsFilter(const KDirectory *dir, const char *name, void *data)
+{
+    return (KDirectoryPathType(dir, "%s", name) & ~kptAlias) == kptDir;
+}
+#endif
+
+typedef struct KTableCheckColumn_pb_s {
+    KTable const *self;
+    CCReportFunc report;
+    void *rpt_ctx;
+    unsigned n;
+    int level;
+    uint32_t depth;
+    INSDC_SRA_platform_id platform;
+} KTableCheckColumn_pb_t;
+
+static rc_t CC KTableCheckColumn(const KDirectory *dir, uint32_t type, const char *name, void *data)
+{
+    KTableCheckColumn_pb_t *pb = (KTableCheckColumn_pb_t *)data;
+    CCReportInfoBlock info;
+    
+    memset(&info, 0, sizeof(info));
+    
+    if ((type & ~kptAlias) != kptDir) {
+        char mesg[4096];
+        
+        snprintf(mesg, sizeof(mesg), "unexpected object '%s'", name);
+        KTableGetName(pb->self, &info.objName);
+        info.objId = 0;
+        info.objType = kptTable;
+        info.type = ccrpt_Done;
+        info.info.done.mesg = mesg;
+        info.info.done.rc = 0;
+        return pb->report(&info, pb->rpt_ctx);
+    }
+    else {
+        bool hasZombies;
+        INSDC_SRA_platform_id platform = pb->platform;
+        uint32_t ktype = KDBPathType(dir, &hasZombies, name);
+        rc_t rc;
+        
+        info.objType = kptColumn;
+        info.objId = pb->n++;
+        info.objName = name;
+        info.type = ccrpt_Visit;
+        info.info.visit.depth = pb->depth + 1;
+        rc = pb->report(&info, pb->rpt_ctx);
+        if (rc) return rc;
+        
+        info.type = ccrpt_Done;
+        
+        if (hasZombies) {
+#if 0
+            info.info.done.rc = RC(rcDB, rcTable, rcValidating, rcFile, rcTooShort);
+#else
+            info.info.done.rc = 0;
+#endif
+            info.info.done.mesg = "Column may be truncated";
+            rc = pb->report(&info, pb->rpt_ctx);
+            if (rc) return rc;
+        }
+        info.info.done.rc = RC(rcDB, rcTable, rcValidating, rcType, rcIncorrect);
+        if ((ktype & ~kptAlias) == kptColumn) {
+            const KColumn *col;
+            
+            info.info.done.rc = KTableOpenColumnRead(pb->self, &col, "%s", name);
+            if (info.info.done.rc == 0) {
+                info.info.done.rc = KColumnConsistencyCheck(col, pb->level, &info, pb->report, pb->rpt_ctx);
+                KColumnRelease(col);
+                return info.info.done.rc;
+            }
+        }
+        if (platform != SRA_PLATFORM_UNDEFINED && platform != SRA_PLATFORM_454
+            && name != NULL && name[0] != '\0' && strcmp(name, "SIGNAL") == 0)
+        {
+            (void)PLOGMSG(klogWarn, (klogWarn, "COLUMN '$(name)' IS INCOMPLETE",
+                "name=%s", name));
+            return 0;
+        }
+        info.info.done.mesg = "Failed to open column";
+        return pb->report(&info, pb->rpt_ctx);
+    }
+}
+
+static
+rc_t KTableCheckColumns ( const KTable *self, uint32_t depth, int level,
+    CCReportFunc report, void *ctx, INSDC_SRA_platform_id platform )
+{
+    KTableCheckColumn_pb_t pb;
+    
+    pb.self = self;
+    pb.report = report;
+    pb.rpt_ctx = ctx;
+    pb.n = 0;
+    pb.level = level;
+    pb.depth = depth;
+    pb.platform = platform;
+    return KDirectoryVVisit(self->dir, false, KTableCheckColumn, &pb, "col", NULL);
+}
+
+static
+rc_t KTableCheckIndexMD5(const KDirectory *dir,
+                         CCReportInfoBlock *nfo,
+                         CCReportFunc report, void *ctx)
+{
+    char md5[4096];
+
+    snprintf(md5, sizeof(md5), "%s.md5", nfo->objName);
+    if (KDirectoryPathType(dir, "%s", md5) != kptNotFound)
+        return DirectoryCheckMD5(dir, md5, nfo, report, ctx);
+    return 0;
+}
+
+static const KDirectory *KTableFindIndexDir(const KTable *self)
+{
+    const KDirectory *idxDir;
+    
+    rc_t rc = KDirectoryOpenDirRead ( self -> dir, & idxDir, false, "idx" );
+    if ( rc == 0 )
+        return idxDir;
+
+    /* some old tables have a single index at table level */
+    KDirectoryAddRef ( self -> dir );
+    return self -> dir;
+}
+
+static
+rc_t KTableCheckIndices(const KTable *self, uint32_t depth, int level, CCReportFunc report, void *ctx)
+{
+    uint32_t n;
+    const KMetadata *meta;
+    int64_t max_row_id = 0;
+
+    KNamelist *list;
+    rc_t rc = KTableListIdx(self, &list);
+    if ( rc != 0 )
+    {
+        if ( GetRCState ( rc ) == rcNotFound )
+            return 0;
+        return rc;
+    }
+
+    rc = KTableOpenMetadataRead ( self, & meta );
+    if ( rc == 0 )
+    {
+        const KMDataNode *seq;
+        rc = KMetadataOpenNodeRead ( meta, & seq, "/.seq/spot" );
+        if ( rc == 0 )
+        {
+            rc = KMDataNodeReadAsI64 ( seq, & max_row_id );
+            if ( rc != 0 )
+                max_row_id = 0;
+            KMDataNodeRelease ( seq );
+        }
+
+        KMetadataRelease ( meta );
+    }
+
+    rc = KNamelistCount(list, &n);
+    if ( rc == 0 )
+    {
+        const KDirectory *idxDir = KTableFindIndexDir ( self );
+        if ( idxDir == NULL )
+            rc = RC ( rcDB, rcTable, rcValidating, rcDirectory, rcNull );
+        else
+        {
+            CCReportInfoBlock nfo;
+            memset(&nfo, 0, sizeof(nfo));
+            nfo.objType = kptIndex;
+
+            for ( nfo . objId = 0; rc == 0 && nfo . objId != (int) n; ++ nfo . objId)
+            {
+                rc = KNamelistGet(list, nfo.objId, &nfo.objName);
+                if ( rc != 0 )
+                    break;
+                
+                nfo.type = ccrpt_Visit;
+                nfo.info.visit.depth = depth + 1;
+                rc = report(&nfo, ctx); if (rc) break;
+                
+                rc = KTableCheckIndexMD5(idxDir, &nfo, report, ctx);
+                if (rc == 0 && level > 0)
+                {
+                    const KIndex *idx;
+                    rc = KTableOpenIndexRead(self, &idx, "%s", nfo.objName);
+
+                    if ( rc != 0 )
+                    {
+                        nfo.type = ccrpt_Done;
+                        nfo.info.done.rc = rc;
+                        nfo.info.done.mesg = "could not be opened";
+                    }
+                    else
+                    {
+                        KIndexSetMaxRowId ( idx, max_row_id );
+
+                        nfo.type = ccrpt_Index;
+                        rc = KIndexConsistencyCheck(idx, level < 3 ? 1 : 3,
+                                                    &nfo.info.index.start_id,
+                                                    &nfo.info.index.id_range,
+                                                    &nfo.info.index.num_keys,
+                                                    &nfo.info.index.num_rows,
+                                                    &nfo.info.index.num_holes);
+                        KIndexRelease ( idx );
+                        if ( rc != 0 )
+                        {
+                            nfo.type = ccrpt_Done;
+                            nfo.info.done.rc = rc;
+                            nfo.info.done.mesg = "could not be validated";
+                        }
+                    }
+
+                    rc = report(&nfo, ctx);
+                }
+            }
+
+            KDirectoryRelease(idxDir);
+        }
+    }
+
+    KNamelistRelease(list);
+
+    return rc;
+}
+
+LIB_EXPORT
+rc_t CC KTableConsistencyCheck(const KTable *self, uint32_t depth, uint32_t level,
+    CCReportFunc report, void *ctx, INSDC_SRA_platform_id platform)
+{
+    rc_t rc = 0;
+    uint32_t type;
+    
+    bool indexOnly = level & CC_INDEX_ONLY;
+    if (indexOnly) {
+        level &= ~CC_INDEX_ONLY;
+    }
+
+    if (self == NULL)
+        return RC(rcDB, rcTable, rcValidating, rcSelf, rcNull);
+    
+    if (depth == 0) {
+        CCReportInfoBlock info;
+        
+        KTableGetName(self, &info.objName);
+        info.objId = 0;
+        info.objType = kptTable;
+        info.type = ccrpt_Visit;
+        info.info.visit.depth = 0;
+        
+        rc = report(&info, ctx);
+        if (rc) return rc;
+    }
+    
+    type = KDirectoryPathType(self->dir, "md5");
+    if (type == kptZombieFile) {
+        CCReportInfoBlock info;
+        
+        KTableGetName(self, &info.objName);
+        info.objId = 0;
+        info.objType = kptTable;
+        info.type = ccrpt_Done;
+        info.info.done.mesg = "Table may be truncated";
+        info.info.done.rc = 0;
+        
+        rc = report(&info, ctx);
+    }
+    else if (type != kptNotFound) {
+        if (!indexOnly) {
+            rc = KTableCheckMD5(self, report, ctx);
+        }
+    }
+    else {
+        CCReportInfoBlock info;
+        
+        KTableGetName(self, &info.objName);
+        info.objId = 0;
+        info.objType = kptTable;
+        info.type = ccrpt_Done;
+        info.info.done.mesg = "missing md5 file";
+        info.info.done.rc = 0;
+        
+        rc = report(&info, ctx);
+    }
+
+    if ( rc == 0 && ! indexOnly )
+        rc = KTableCheckColumns(self, depth, level, report, ctx, platform);
+
+    if ( rc == 0 )    
+        rc = KTableCheckIndices(self, depth, level, report, ctx);
+        
+    return rc;
+}
diff --git a/libs/kdb/table-priv.h b/libs/kdb/table-priv.h
new file mode 100644
index 0000000..7b26462
--- /dev/null
+++ b/libs/kdb/table-priv.h
@@ -0,0 +1,81 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_table_priv_
+#define _h_table_priv_
+
+#ifndef _h_kdb_table_
+#include <kdb/table.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDatabase;
+struct KDBManager;
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * KTable
+ *  represents a table
+ *  normally implemented as a directory
+ *  but may be a single archive file
+ *  in either executable or streamable format
+ */
+struct KTable
+{
+    struct KDirectory const *dir;
+    struct KDBManager const *mgr;
+    struct KDatabase const *db;
+    KRefcount refcount;
+    uint8_t prerelease;
+    char path [ 1 ];
+};
+
+/* Attach
+ * Sever
+ *  like KTableRelease, except called internally
+ *  indicates that a child object is letting go...
+ */
+KTable *KTableAttach ( const KTable *self );
+rc_t KTableSever ( const KTable *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_table_priv_ */
diff --git a/libs/kdb/table.c b/libs/kdb/table.c
new file mode 100644
index 0000000..c77f809
--- /dev/null
+++ b/libs/kdb/table.c
@@ -0,0 +1,721 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+#define KONST const
+#include "table-priv.h"
+#include "dbmgr-priv.h"
+#include "database-priv.h"
+#include "kdb-priv.h"
+#undef KONST
+
+#include <kdb/extern.h>
+#include <klib/namelist.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <kfs/arc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KTable
+ *  a collection of columns indexed by row id, metadata, indices
+ */
+
+/* GetPath
+ *  return the absolute path to table
+ */
+LIB_EXPORT rc_t CC KTableGetPath ( const KTable *self,
+    const char **path )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+    if ( path == NULL )
+        return RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+
+    *path = self->path;
+
+    return 0;
+}
+
+/* Whack
+ */
+static
+rc_t KTableWhack ( KTable *self )
+{
+    rc_t rc = 0;
+
+    KRefcountWhack ( & self -> refcount, "KTable" );
+
+    if ( self -> db != NULL )
+    {
+        rc = KDatabaseSever ( self -> db );
+        if ( rc == 0 )
+            self -> db = NULL;
+    }
+
+    if ( rc == 0 )
+        rc = KDBManagerSever ( self -> mgr );
+
+    if ( rc == 0 )
+    {
+        KDirectoryRelease ( self -> dir );
+        free ( self );
+        return 0;
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "KTable", "whack", "ktbl" );
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KTableAddRef ( const KTable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KTable" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcTable, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KTableRelease ( const KTable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KTable" ) )
+        {
+        case krefWhack:
+            return KTableWhack ( ( KTable* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcTable, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Attach
+ * Sever
+ */
+KTable *KTableAttach ( const KTable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KTable" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KTable* ) self;
+}
+
+/* Sever
+ *  like KTableRelease, except called internally
+ *  indicates that a child object is letting go...
+ */
+rc_t KTableSever ( const KTable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KTable" ) )
+        {
+        case krefWhack:
+            return KTableWhack ( ( KTable* ) self );
+        case krefNegative:
+            return RC ( rcDB, rcTable, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Make
+ *  make an initialized structure
+ *  NB - does NOT attach reference to dir, but steals it
+ */
+static
+rc_t KTableMake ( KTable **tblp, const KDirectory *dir, const char *path )
+{
+    KTable *tbl;
+
+    assert ( tblp != NULL );
+    assert ( path != NULL );
+
+    tbl = malloc ( sizeof * tbl + strlen ( path ) );
+    if ( tbl == NULL )
+    {
+        * tblp = NULL;
+        return RC ( rcDB, rcTable, rcConstructing, rcMemory, rcExhausted );
+    }
+
+    memset ( tbl, 0, sizeof * tbl );
+    tbl -> dir = dir;
+    KRefcountInit ( & tbl -> refcount, 1, "KTable", "make", path );
+    strcpy ( tbl -> path, path );
+
+    * tblp = tbl;
+    return 0;
+}
+
+
+/* OpenTableRead
+ * VOpenTableRead
+ *  open a table for read
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to table
+ */
+static
+rc_t KDBManagerVOpenTableReadInt ( const KDBManager *self,
+    const KTable **tblp, const KDirectory *wd, bool try_srapath,
+    const char *path, va_list args )
+{
+    rc_t rc;
+
+    char tblpath [ 4096 ];
+    int z = ( args == NULL ) ?
+        snprintf ( tblpath, sizeof tblpath, "%s", path ):
+        vsnprintf ( tblpath, sizeof tblpath, path, args );
+    if ( z < 0 || ( size_t ) z >= sizeof tblpath )
+        rc = RC ( rcDB, rcMgr, rcOpening, rcPath, rcExcessive );
+    else
+    {
+        KTable *tbl;
+        const KDirectory *dir;
+        bool prerelease = false;
+
+        rc = KDBOpenPathTypeRead ( self, wd, tblpath, &dir, kptTable, NULL, try_srapath );
+        if ( rc != 0 )
+        {
+            prerelease = true;
+            rc = KDBOpenPathTypeRead ( self, wd, tblpath, &dir, kptPrereleaseTbl, NULL, try_srapath );
+        }
+
+        if ( rc == 0 )
+        {
+            rc = KTableMake ( & tbl, dir, tblpath );
+            if ( rc == 0 )
+            {
+                tbl -> mgr = KDBManagerAttach ( self );
+                tbl -> prerelease = prerelease;
+                * tblp = tbl;
+                return 0;
+            }
+            KDirectoryRelease ( dir );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDBManagerOpenTableRead ( const KDBManager *self,
+    const KTable **tbl, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVOpenTableRead ( self, tbl, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDBManagerVOpenTableRead ( const KDBManager *self,
+    const KTable **tbl, const char *path, va_list args )
+{
+    if ( tbl == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcParam, rcNull );
+
+    * tbl = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcSelf, rcNull );
+
+    return KDBManagerVOpenTableReadInt ( self, tbl, self -> wd, true, path, args);
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenTableRead ( const KDatabase *self,
+    const KTable **tbl, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVOpenTableRead ( self, tbl, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVOpenTableRead ( const KDatabase *self,
+    const KTable **tblp, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( tblp == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * tblp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    if ( name == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "tbl", 3, name, args );
+    if ( rc == 0 )
+    {
+        rc = KDBManagerVOpenTableReadInt ( self -> mgr, tblp,
+                                          self -> dir, false, path, NULL );
+        if ( rc == 0 )
+        {
+            KTable *tbl = ( KTable* ) * tblp;
+            tbl -> db = KDatabaseAttach ( self );
+        }
+    }
+
+    return rc;
+}
+
+
+/* Locked
+ *  returns non-zero if locked
+ */
+LIB_EXPORT bool CC KTableLocked ( const KTable *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return false;
+
+    rc = KDBWritable ( self -> dir, "." );
+    return GetRCState ( rc ) == rcLocked;
+}
+
+
+/* Exists
+ *  returns true if requested object exists
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT bool CC KTableVExists ( const KTable *self, uint32_t type, const char *name, va_list args )
+{
+    if ( self != NULL && name != NULL && name [ 0 ] != 0 )
+    {
+        rc_t rc;
+        const char *ns;
+        char path [ 256 ];
+
+        switch ( type )
+        {
+        case kptIndex:
+            ns = "idx";
+            break;
+
+        case kptColumn:
+            ns = "col";
+            break;
+
+        default:
+            return false;
+        }
+
+        rc = KDBVMakeSubPath ( self -> dir, path, sizeof path, ns, 3, name, args );
+        if ( rc == 0 )
+        {
+            switch ( KDirectoryPathType ( self -> dir, "%s", path ) )
+            {
+            case kptFile:
+            case kptDir:
+            case kptFile | kptAlias:
+            case kptDir | kptAlias:
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+LIB_EXPORT bool CC KTableExists ( const KTable *self, uint32_t type, const char *name, ... )
+{
+    bool exists;
+
+    va_list args;
+    va_start ( args, name );
+
+    exists = KTableVExists ( self, type, name, args );
+
+    va_end ( args );
+
+    return exists;
+}
+
+
+/* IsAlias
+ *  returns true if object name is an alias
+ *  returns path to fundamental name if it was aliased
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - optional output buffer
+ *  for fundamenta object name if "alias" is not a fundamental name, 
+ *
+ *  "name" [ IN ] - NUL terminated object name
+ */
+LIB_EXPORT bool CC KTableIsAlias ( const KTable *self, uint32_t type,
+    char *resolved, size_t rsize, const char *name )
+{
+    if ( self != NULL && name != NULL && name [ 0 ] != 0 )
+    {
+        rc_t rc;
+        const char *ns;
+        char path [ 256 ];
+
+        switch ( type )
+        {
+        case kptIndex:
+            ns = "idx";
+            break;
+
+        case kptColumn:
+            ns = "col";
+            break;
+
+        default:
+            return false;
+        }
+
+        rc = KDBMakeSubPath ( self -> dir, path, sizeof path, ns, 3, name );
+        if ( rc == 0 )
+        {
+            switch ( KDirectoryPathType ( self -> dir, "%s", path ) )
+            {
+            case kptFile | kptAlias:
+            case kptDir | kptAlias:
+                if ( resolved != NULL && rsize != 0 )
+                {
+                    const KDirectory *sub;
+                    rc = KDirectoryOpenDirRead ( self -> dir, & sub, false, "%s", ns );
+                    * resolved = 0;
+                    if ( rc != 0 )
+                        PLOGERR ( klogWarn, ( klogWarn, rc, "failed to open subdirectory '$(sub)'", "sub=%s", ns ) );
+                    else
+                    {
+                        rc = KDirectoryResolveAlias ( sub, false, resolved, rsize, "%s", name );
+                        KDirectoryRelease ( sub );
+                        if ( rc != 0 )
+                            PLOGERR ( klogWarn, ( klogWarn, rc, "failed to resolve alias '$(alias)'", "alias=%s", name ) );
+                    }
+                }
+                return true;
+            }
+        }
+    }
+
+    if ( resolved != NULL && rsize != 0 )
+        * resolved = 0;
+
+    return false;
+}
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC KTableVWritable ( const KTable *self, uint32_t type, const char *name, va_list args )
+{
+    /* TBD */
+    return -1;
+}
+
+LIB_EXPORT rc_t CC KTableWritable ( const KTable *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, name );
+
+    rc = KTableVWritable ( self, type, name, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KTableOpenManagerRead ( const KTable *self, const KDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KTableOpenParentRead ( const KTable *self, const KDatabase **db )
+{
+    rc_t rc;
+
+    if ( db == NULL )
+        rc = RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDatabaseAddRef ( self -> db );
+            if ( rc == 0 )
+            {
+                * db = self -> db;
+                return 0;
+            }
+        }
+
+        * db = NULL;
+    }
+
+    return rc;
+}
+
+
+/* GetDirectory
+ *  access the directory in use
+ */
+LIB_EXPORT rc_t CC KTableOpenDirectoryRead ( const KTable *self, const KDirectory **dir )
+{
+    rc_t rc;
+
+    if ( dir == NULL )
+        rc = RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * dir = self -> dir;
+            return KDirectoryAddRef ( * dir );
+        }
+
+        * dir = NULL;
+    }
+
+    return rc;
+}
+
+
+/* ModDate
+ *  get modification date
+ */
+LIB_EXPORT rc_t CC KTableModDate ( const KTable *self, KTime_t *mtime )
+{
+    rc_t rc;
+
+    if ( mtime == NULL )
+        rc = RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            /* HACK ALERT - there needs to be a proper way to record modification times */
+            const KDirectory *dir = self -> dir;
+
+            /* this only tells the last time the table was locked,
+               which may be close to the last time it was modified */
+            rc = KDirectoryDate ( dir, mtime, "lock" );
+            if ( rc == 0 )
+                return 0;
+
+            if ( GetRCState ( rc ) == rcNotFound )
+            {
+                rc = KDirectoryDate ( dir, mtime, "sealed" );
+                if ( rc == 0 )
+                    return 0;
+            }
+
+            /* get directory timestamp */
+            rc = KDirectoryDate ( dir, mtime, "." );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        * mtime = 0;
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KNamelist
+ */
+
+/* List
+ *  create table listings
+ */
+struct FilterData
+{
+    const KDBManager * mgr;
+    int type;
+};
+
+static
+bool CC KDatabaseListFilter ( const KDirectory *dir, const char *name, void *data_ )
+{
+    struct FilterData * data = data_;
+    return ( KDBOpenPathTypeRead ( data->mgr, dir, name, NULL, data->type, NULL, false ) == 0 );
+}
+
+LIB_EXPORT rc_t CC KTableListCol ( const KTable *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        struct FilterData data;
+
+        data.mgr = self->mgr;
+        data.type = kptColumn;
+
+        return KDirectoryList ( self -> dir,
+            names, KDatabaseListFilter, &data, "col" );
+    }
+
+    if ( names != NULL )
+        * names = NULL;
+
+    return RC ( rcDB, rcTable, rcListing, rcSelf, rcNull );
+}
+
+static
+bool CC KTableListIdxFilter ( const KDirectory *dir, const char *name, void *data )
+{
+    const size_t sz = strlen(name);
+    
+    if (sz > 4 && strcmp(&name[sz - 4], ".md5") == 0)
+        return false;
+    return true;
+}
+
+static
+bool CC KTableListSkeyFilter ( const KDirectory *dir, const char *name, void *data )
+{
+    if ( strcmp ( name, "skey" ) == 0 )
+        return true;
+    return false;
+}
+
+LIB_EXPORT rc_t CC KTableListIdx ( const KTable *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        if ( ! self -> prerelease )
+        {
+            return KDirectoryList ( self -> dir,
+                names, KTableListIdxFilter, NULL, "idx" );
+        }
+
+        return KDirectoryList ( self -> dir,
+            names, KTableListSkeyFilter, NULL, "." );
+    }
+
+    if ( names != NULL )
+        * names = NULL;
+
+    return RC ( rcDB, rcTable, rcListing, rcSelf, rcNull );
+}
+
+/* HasRemoteData
+ *  indicates whether some/all table data comes from network resource
+ *  such as HttpFile or CacheteeFile
+ */
+KDB_EXTERN bool CC KTableHasRemoteData ( const KTable *self )
+{
+    bool result = self != NULL && KDirectoryIsKArcDir ( self -> dir ) &&
+            KArcDirIsFromRemote ( (const KArcDir * ) self -> dir );
+    return result;
+}
diff --git a/libs/kdb/trieidx-priv.h b/libs/kdb/trieidx-priv.h
new file mode 100644
index 0000000..a4174ff
--- /dev/null
+++ b/libs/kdb/trieidx-priv.h
@@ -0,0 +1,74 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_trieidx_priv_
+#define _h_trieidx_priv_
+
+#include "index-priv.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndexHdr_v1
+ */
+typedef KIndexFileHeader_v1_v2 KPTrieIndexHdr_v1;
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndexHdr_v2
+ */
+typedef struct KPTrieIndexHdr_v2 KPTrieIndexHdr_v2;
+struct KPTrieIndexHdr_v2
+{
+    KIndexFileHeader_v1_v2 dad;
+    int64_t first;
+    int64_t last;
+    uint16_t id_bits;
+    uint16_t span_bits;
+    uint16_t align [ 2 ];
+};
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndexHdr_v3
+ */
+typedef struct KPTrieIndexHdr_v3 KPTrieIndexHdr_v3;
+struct KPTrieIndexHdr_v3
+{
+    struct KIndexFileHeader_v3 dad;
+    int64_t first;
+    int64_t last;
+    uint16_t id_bits;
+    uint16_t span_bits;
+    uint16_t align [ 2 ];
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _h_trieidx_priv_ */
diff --git a/libs/kdb/trieidx-v1.c b/libs/kdb/trieidx-v1.c
new file mode 100644
index 0000000..e40f496
--- /dev/null
+++ b/libs/kdb/trieidx-v1.c
@@ -0,0 +1,222 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "index-priv.h"
+#include "kdbfmt-priv.h"
+#include <klib/ptrie.h>
+#include <klib/text.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <byteswap.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndex_v1
+ *  persisted keymap
+ */
+
+/* KPTrieIndexInit
+ *  opens and initializes persisted keymap structure
+ */
+rc_t KPTrieIndexInit_v1 ( KPTrieIndex_v1 *self, const KMMap *mm, bool byteswap )
+{
+    size_t size;
+    rc_t rc = KMMapSize ( mm, & size );
+    if ( rc == 0 )
+    {
+        const KDBHdr *hdr;
+        rc = KMMapAddrRead ( mm, ( const void** ) & hdr );
+        if ( rc == 0 )
+        {
+            /* try to create the pttree */
+            rc = PTrieMakeOrig ( & self -> key2id,
+                hdr + 1, size -= sizeof * hdr, byteswap );
+            if ( rc == 0 )
+            {
+                size_t ptsize = PTrieSize ( self -> key2id );
+                if ( ptsize <= size )
+                {
+                    /* just in case */
+                    self -> mm = NULL;
+
+                    /* record for projection */
+                    self -> byteswap = byteswap;
+
+                    /* it could be stored without projection */
+                    if ( ptsize == size )
+                    {
+                        self -> id2node = NULL;
+                        self -> first = self -> last = 0;
+                        return 0;
+                    }
+                            
+                    /* assume this is projection index */
+                    self -> id2node = ( void* )
+                        ( ( char* ) ( hdr + 1 ) + ptsize );
+                    size -= ptsize;
+                            
+                    /* it must have at least 4 bytes
+                       and be 4 byte aligned */
+                    if ( size >= sizeof ( uint32_t ) && ( size & 3 ) == 0 )
+                    {
+                        /* first entry is starting key
+                           remaining entries are node ids */
+                        self -> first = * self -> id2node ++;
+                        size -= sizeof self -> id2node [ 0 ];
+                        if ( size == 0 )
+                        {
+                            /* forget if empty */
+                            self -> id2node = NULL;
+                            self -> first = self -> last = 0;
+                            return 0;
+                        }
+                        /* remaining entries */
+                        self -> last = self -> first + ( size >> 2 ) - 1;
+                        return 0;
+                    }
+                }
+
+                PTrieWhack ( self -> key2id );
+                self -> key2id = NULL;
+
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* KPTrieIndexWhack_v1
+ *  closes down keymap
+ */
+void KPTrieIndexWhack_v1 ( KPTrieIndex_v1 *self )
+{
+    PTrieWhack ( self -> key2id );
+    KMMapRelease ( self -> mm );
+    memset ( self, 0, sizeof * self );
+}
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIndex_v1
+ */
+
+/* whack whack */
+void KTrieIndexWhack_v1 ( KTrieIndex_v1 *self )
+{
+    KPTrieIndexWhack_v1 ( & self -> pt );
+}
+
+/* initialize an index from file */
+rc_t KTrieIndexOpen_v1 ( KTrieIndex_v1 *self, const KMMap *mm, bool byteswap )
+{
+    rc_t rc;
+
+    memset ( self, 0, sizeof * self );
+
+    rc = KPTrieIndexInit_v1 ( & self -> pt, mm, byteswap );
+    if ( rc == 0 )
+    {
+        rc = KMMapAddRef ( mm );
+        if ( rc == 0 )
+        {
+            self -> pt . mm = mm;
+            return 0;
+        }
+    }
+
+    KTrieIndexWhack_v1 ( self );
+    return rc;
+}
+
+/* map key to id ( was Key2Id ) */
+rc_t KTrieIndexFind_v1 ( const KTrieIndex_v1 *self, const char *str, uint32_t *id,
+    int ( CC * custom_cmp ) ( const void *item, const PBSTNode *n, void *data ), void * data )
+{
+    if ( self -> pt . key2id != NULL )
+    {
+        PTNode n;
+        String key;
+        unsigned int nid;
+
+        StringInitCString ( & key, str );
+        nid = PTrieFind ( self -> pt . key2id, & key, & n, custom_cmp, data );
+        if ( nid != 0 )
+        {
+            assert ( n . data . size == sizeof * id );
+            memmove ( id, n . data . addr, sizeof * id );
+            return 0;
+        }
+    }
+
+    return RC ( rcDB, rcIndex, rcSelecting, rcString, rcNotFound );
+}
+
+/* projection index id to key-string ( was Id2Key ) */
+rc_t KTrieIndexProject_v1 ( const KTrieIndex_v1 *self,
+    uint32_t id, char *key_buff, size_t buff_size, size_t *actsize)
+{
+    if ( self -> pt . id2node != NULL &&
+         id >= self -> pt . first &&
+         id <= self -> pt . last )
+    {
+        PTNode n;
+        uint32_t node = self -> pt . id2node [ id - self -> pt . first ];
+        rc_t rc = PTrieGetNode ( self -> pt . key2id,
+            & n, self -> pt . byteswap ? bswap_32 ( node ) : node );
+        if ( rc == 0 )
+        {
+            const String *key;
+            rc = PTNodeMakeKey ( & n, & key );
+            if ( rc == 0 )
+            {
+                if ( actsize != NULL )
+                    * actsize = key -> size;
+                if ( key -> size >= buff_size )
+                    rc = RC ( rcDB, rcIndex, rcProjecting, rcBuffer, rcInsufficient );
+                else
+                    string_copy ( key_buff, buff_size, key -> addr, key -> size );
+
+                StringWhack ( ( String* ) key );
+            }
+            return rc;
+        }
+    }
+
+    return RC ( rcDB, rcIndex, rcProjecting, rcId, rcNotFound );
+}
diff --git a/libs/kdb/trieidx-v2.c b/libs/kdb/trieidx-v2.c
new file mode 100644
index 0000000..d54eadd
--- /dev/null
+++ b/libs/kdb/trieidx-v2.c
@@ -0,0 +1,1047 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "index-priv.h"
+#include "trieidx-priv.h"
+#include <klib/ptrie.h>
+#include <klib/text.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <klib/pack.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <byteswap.h>
+#include <assert.h>
+
+#define KTRIE_ZEROS_KPTRIE 1
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndex_v2
+ *  persisted keymap
+ */
+
+
+/* Init
+ *  opens and initializes persisted keymap structure
+ */
+static
+rc_t KPTrieIndexInitID2Ord ( KPTrieIndex_v2 *self, size_t in_size,
+    int variant, int span_bits, int elem_bits )
+{
+    rc_t rc;
+    union
+    {
+        uint8_t *v8;
+        uint16_t *v16;
+        uint32_t *v32;
+        uint64_t *v64;
+    } dst;
+    size_t elem_bytes = elem_bits >> 3;
+    uint32_t scount = self -> count - 1;
+
+    assert ( self -> count != 0 );
+
+    if ( span_bits * scount > in_size * 8 )
+        return RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+
+    dst . v8 = malloc ( self -> count * elem_bytes );
+    if ( dst . v8 == NULL )
+        rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        size_t usize;
+        rc = Unpack ( span_bits, elem_bits,
+            & self -> ord2node [ self -> count ], 0,
+            span_bits * scount, NULL, & dst . v8 [ elem_bytes ],
+            scount * elem_bytes, & usize );
+        if ( rc == 0 )
+        {
+            uint32_t i;
+
+            self -> id2ord . v8 = dst . v8;
+            self -> variant = variant;
+
+            /* integrate to simple translation */
+            switch ( variant )
+            {
+            case 1:
+                dst . v8 [ 0 ] = 0;
+                for ( i = 0; i < scount; ++ i )
+                    dst . v8 [ i + 1 ] += dst . v8 [ i ];
+                break;
+            case 2:
+                dst . v16 [ 0 ] = 0;
+                for ( i = 0; i < scount; ++ i )
+                    dst . v16 [ i + 1 ] += dst . v16 [ i ];
+                break;
+            case 3:
+                dst . v32 [ 0 ] = 0;
+                for ( i = 0; i < scount; ++ i )
+                    dst . v32 [ i + 1 ] += dst . v32 [ i ];
+                break;
+            case 4:
+                dst . v64 [ 0 ] = 0;
+                for ( i = 0; i < scount; ++ i )
+                    dst . v64 [ i + 1 ] += dst . v64 [ i ];
+                break;
+            }
+
+            return 0;
+        }
+
+        free ( dst . v8 );
+    }
+
+    return rc;
+}
+
+static
+void CC KPTrieIndexExtractV1Range_v2 ( PTNode *n, void *data )
+{
+    KPTrieIndex_v2 *self = data;
+
+    /* capture node id */
+    uint32_t id;
+    assert ( n -> data . size == sizeof id );
+    memmove ( & id, n -> data . addr, sizeof id );
+
+    /* perform min/max */
+    if ( self -> count == 0 )
+        self -> first = self -> last = id;
+    else if ( id < self -> first )
+        self -> first = id;
+    else if ( id > self -> last )
+        self -> last = id;
+
+    ++ self -> count;
+}
+
+static
+rc_t KPTrieIndexInitFromV1_v2 ( KPTrieIndex_v2 *self, const KMMap *mm, bool byteswap )
+{
+    KPTrieIndex_v1 v1;
+    rc_t rc = KPTrieIndexInit_v1 ( & v1, mm, byteswap );
+    if ( rc == 0 )
+    {
+        uint32_t *ord2node;
+        uint32_t total_id, test_id;
+        uint32_t i, id, id_bits, num_ids;
+
+        /* assume preservation of persisted projection index */
+        self -> byteswap = byteswap;
+
+        /* hopefully we got a projection index */
+        if ( v1 . id2node == NULL )
+        {
+#if ! KTRIE_ZEROS_KPTRIE
+            self -> count = 0;
+#endif
+            /* need to derive first and last from trie */
+            PTrieForEach ( v1 . key2id, KPTrieIndexExtractV1Range_v2, self );
+            if ( self -> count == 0 )
+                KPTrieIndexWhack_v1 ( & v1 );
+            else
+            {
+                /* take trie as-is */
+                self -> key2id = v1 . key2id;
+                self -> maxid = self -> last;
+            }
+
+            /* note that this assumes a span of 1 for
+               each id. there are no known uses of v1 without
+               a projection index, so this is unlikely to be important */
+
+            return 0;
+        }
+
+        /* take id range */
+        self -> first = v1 . first;
+        self -> last = self -> maxid = v1 . last;
+
+        /* count comes from trie as always */
+        self -> count = PTrieCount ( v1 . key2id );
+
+        /* detect empty trie */
+        if ( self -> count == 0 || self -> first > self -> last )
+        {
+            self -> first = self -> last = self -> maxid = 0;
+            return 0;
+        }
+
+        /* take trie as-is */
+        self -> key2id = v1 . key2id;
+
+        /* now decide whether to use 1-1 or sparse projection
+           if the number of slots is less than twice the number of nodes,
+           it is more efficient to store the nodes as a linear array,
+           and represent missing ids as nulls.
+         */
+        if ( ( self -> last - self -> first ) < ( ( int64_t ) self -> count << 1 ) )
+        {
+            /* take the old projection array as-is,
+               treating NULL node ids as holes */
+            self -> ord2node = v1 . id2node;
+            return 0;
+        }
+
+        /* need to create a new projection index */
+        self -> byteswap = false;
+
+        /* convert to sparse
+           calculate id bits - notice that
+           test_id gets left shifted so that
+           the loop is guaranteed to exit */
+        num_ids = ( uint32_t ) ( self -> last - self -> first + 1 );
+        for ( total_id = num_ids >> 1, id_bits = 1, test_id = 1;
+            test_id <= total_id;
+            ++ id_bits, test_id <<= 1 )
+            ( void ) 0;
+
+        /* determine variant */
+        if ( id_bits <= 8 )
+        {
+            /* allocate 4 bytes for new ord2node and 1 for id2ord */
+            uint8_t *id2ord = malloc ( self -> count * 5 );
+            if ( id2ord == NULL )
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                ord2node = ( uint32_t* ) & id2ord [ self -> count ];
+                self -> ord2node = ord2node;
+                self -> id2ord . v8 = id2ord;
+                self -> variant = 1;
+
+                /* walk across v1 table, looking at each id */
+                for ( i = id = 0; id < num_ids; ++ id )
+                {
+                    /* detect non NULL node ids
+                       and pretend they represent a contiguous
+                       span with no holes in id space */
+                    if ( v1 . id2node [ id ] != 0 )
+                    {
+                        /* prevent overwriting */
+                        if ( i == self -> count )
+                        {
+                            rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+                            break;
+                        }
+
+                        /* record id and node for slot */
+                        id2ord [ i ] = ( uint8_t ) id;
+                        ord2node [ i ] = byteswap ? bswap_32 ( v1 . id2node [ id ] ) : v1 . id2node [ id ];
+                        ++ i;
+                    }
+                }
+            }
+        }
+        else if ( id_bits <= 16 )
+        {
+            uint16_t *id2ord = malloc ( self -> count * 6 );
+            if ( id2ord == NULL )
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                ord2node = ( uint32_t* ) & id2ord [ self -> count ];
+                self -> ord2node = ord2node;
+                self -> id2ord . v16 = id2ord;
+                self -> variant = 2;
+
+                for ( i = id = 0; id < num_ids; ++ id )
+                {
+                    if ( v1 . id2node [ id ] != 0 )
+                    {
+                        if ( i == self -> count )
+                        {
+                            rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+                            break;
+                        }
+
+                        id2ord [ i ] = ( uint16_t ) id;
+                        ord2node [ i ] = byteswap ? bswap_32 ( v1 . id2node [ id ] ) : v1 . id2node [ id ];
+                        ++ i;
+                    }
+                }
+            }
+        }
+        else
+        {
+            uint32_t *id2ord = malloc ( self -> count * 8 );
+            if ( id2ord == NULL )
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                ord2node = & id2ord [ self -> count ];
+                self -> ord2node = ord2node;
+                self -> id2ord . v32 = id2ord;
+                self -> variant = 3;
+
+                for ( i = id = 0; id < num_ids; ++ id )
+                {
+                    if ( v1 . id2node [ id ] != 0 )
+                    {
+                        if ( i == self -> count )
+                        {
+                            rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+                            break;
+                        }
+
+                        id2ord [ i ] = id;
+                        ord2node [ i ] = byteswap ? bswap_32 ( v1 . id2node [ id ] ) : v1 . id2node [ id ];
+                        ++ i;
+                    }
+                }
+            }
+        }
+        
+        if ( rc == 0 )
+        {
+            if ( i == self -> count )
+                return 0;
+
+            rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+        }
+
+        KPTrieIndexWhack_v1 ( & v1 );
+    }
+
+    return rc;
+}
+
+rc_t KPTrieIndexInit_v2 ( KPTrieIndex_v2 *self, const KMMap *mm, bool byteswap )
+{
+    /* get size of map, assumed to be size of file */
+    size_t size;
+    rc_t rc = KMMapSize ( mm, & size );
+    if ( rc == 0 )
+    {
+        const KPTrieIndexHdr_v2 *hdr;
+
+#if ! KTRIE_ZEROS_KPTRIE
+        self -> mm = NULL;
+        self -> ord2node = NULL;
+        self -> id2ord . v32 = NULL;
+        self -> variant = 0;
+#endif
+
+        /* ignore empty file */
+        if ( size == 0 )
+        {
+#if ! KTRIE_ZEROS_KPTRIE
+            self -> first = self -> last = self -> maxid = 0;
+            self -> key2id = NULL;
+            self -> count = 0;
+#endif
+            return 0;
+        }
+
+        /* have to have at least the base header */
+        if ( size < sizeof hdr -> dad )
+            return RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+
+        rc = KMMapAddrRead ( mm, ( const void** ) & hdr );
+        if ( rc == 0 )
+        {
+            uint16_t id_bits, span_bits;
+            /* recheck header size */
+            if ( size < sizeof * hdr )
+                return RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+
+            if ( self -> byteswap )
+            {
+                self -> first = bswap_64(hdr -> first);
+                self -> last = self -> maxid = bswap_64(hdr -> last);
+                id_bits = bswap_16(hdr -> id_bits);
+                span_bits = bswap_16(hdr -> span_bits);
+            }
+            else
+            {
+                self -> first = hdr -> first;
+                self -> last = self -> maxid = hdr -> last;
+                id_bits = hdr -> id_bits;
+                span_bits = hdr -> span_bits;
+            }
+            self -> id_bits = ( uint8_t ) id_bits;
+            self -> span_bits = ( uint8_t ) span_bits;
+            self -> byteswap = byteswap;
+
+            /* try to create the pttree */
+            rc = PTrieMakeOrig ( & self -> key2id,
+                hdr + 1, size -= sizeof * hdr, byteswap );
+            if ( rc == 0 )
+            {
+                size_t ptsize = PTrieSize ( self -> key2id );
+                if ( ptsize <= size )
+                {
+                    /* the count covers at least the number of trie nodes */
+                    self -> count = PTrieCount ( self -> key2id );
+
+                    /* it could be stored without projection */
+                    if ( ptsize == size )
+                        return 0;
+
+                    /* calculate remaining bytes */                     
+                    size -= ptsize;
+
+                    /* there must be enough for an array of 4-byte node ids */
+                    if ( size >= ( ( size_t ) self -> count << 2 ) )
+                    {
+                        /* take the persisted array as-is */
+                        self -> ord2node = ( const uint32_t* )
+                            ( ( const char* ) ( hdr + 1 ) + ptsize );
+
+                        /* read the count */
+                        if ( size >= 4 )
+                        {
+                            self -> count = * ( self -> ord2node ) ++;
+                            size -= 4;
+                            if ( byteswap )
+                                self -> count = bswap_32 ( self -> count );
+                        }
+
+                        /* determine strategy from id span and count */
+                        if ( ( self -> last - self -> first ) < ( ( int64_t ) self -> count << 1 ) )
+                        {
+                            /* must be contiguous */
+                            self -> count = ( uint32_t ) ( self -> last - self -> first + 1 );
+
+                            /* size should be exactly this number of slots */
+                            if ( size == ( ( size_t ) self -> count << 2 ) )
+                                return 0;
+
+                            /* fall through to error return */
+                        }
+                        else if ( ( size == 4 && self -> count == 1 ) || size > ( ( size_t ) self -> count << 2 ) )
+                        {
+                            /* sparse */
+                            size -= ( size_t ) self -> count << 2;
+
+                            /* unpack id map */
+                            if ( id_bits <= 8 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 1, span_bits, 8 );
+                            else if ( id_bits <= 16 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 2, span_bits, 16 );
+                            else if ( id_bits <= 32 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 3, span_bits, 32 );
+                            else
+                                rc = KPTrieIndexInitID2Ord ( self, size, 4, span_bits, 64 );
+
+                            /* done */
+                            if ( rc == 0 )
+                                return 0;
+
+                            PTrieWhack ( self -> key2id ), self -> key2id = NULL;
+                            return rc;
+                        }
+                    }
+                }
+
+                PTrieWhack ( self -> key2id ), self -> key2id = NULL;
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+            }
+        }
+    }
+
+    return rc;
+}
+
+rc_t KPTrieIndexInit_v3_v4 ( KPTrieIndex_v2 *self, const KMMap *mm, bool byteswap, bool ptorig )
+{
+    /* get size of map, assumed to be size of file */
+    size_t size;
+    rc_t rc = KMMapSize ( mm, & size );
+    if ( rc == 0 )
+    {
+        const KPTrieIndexHdr_v3 *hdr;
+
+#if ! KTRIE_ZEROS_KPTRIE
+        self -> mm = NULL;
+        self -> ord2node = NULL;
+        self -> id2ord . v32 = NULL;
+        self -> variant = 0;
+#endif
+
+        /* ignore empty file */
+        if ( size == 0 )
+        {
+#if ! KTRIE_ZEROS_KPTRIE
+            self -> first = self -> last = self -> maxid = 0;
+            self -> key2id = NULL;
+            self -> count = 0;
+#endif
+            return 0;
+        }
+
+        /* have to have at least the base header */
+        if ( size < sizeof hdr -> dad )
+            return RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+
+        rc = KMMapAddrRead ( mm, ( const void** ) & hdr );
+        if ( rc == 0 )
+        {
+            uint16_t id_bits, span_bits;
+            /* recheck header size */
+            if ( size < sizeof * hdr )
+                return RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+
+            if ( self -> byteswap )
+            {
+                self -> first = bswap_64(hdr -> first);
+                self -> last = self -> maxid = bswap_64(hdr -> last);
+                id_bits = bswap_16(hdr -> id_bits);
+                span_bits = bswap_16(hdr -> span_bits);
+            }
+            else
+            {
+                self -> first = hdr -> first;
+                self -> last = self -> maxid = hdr -> last;
+                id_bits = hdr -> id_bits;
+                span_bits = hdr -> span_bits;
+            }
+            self -> id_bits = ( uint8_t ) id_bits;
+            self -> span_bits = ( uint8_t ) span_bits;
+            self -> byteswap = byteswap;
+
+            /* try to create the pttree */
+            rc = ( ptorig ? PTrieMakeOrig : PTrieMake )
+                ( & self -> key2id, hdr + 1, size -= sizeof * hdr, byteswap );
+            if ( rc == 0 )
+            {
+                size_t ptsize = PTrieSize ( self -> key2id );
+                if ( ptsize <= size )
+                {
+                    /* the count covers at least the number of trie nodes */
+                    self -> count = PTrieCount ( self -> key2id );
+
+                    /* it could be stored without projection */
+                    if ( ptsize == size )
+                        return 0;
+
+                    /* calculate remaining bytes */                     
+                    size -= ptsize;
+
+                    /* there must be enough for an array of 4-byte node ids */
+                    if ( size >= ( ( size_t ) self -> count << 2 ) )
+                    {
+                        /* take the persisted array as-is */
+                        self -> ord2node = ( const uint32_t* )
+                            ( ( const char* ) ( hdr + 1 ) + ptsize );
+
+                        /* read the count */
+                        if ( size >= 4 )
+                        {
+                            self -> count = * ( self -> ord2node ) ++;
+                            size -= 4;
+                            if ( byteswap )
+                                self -> count = bswap_32 ( self -> count );
+                        }
+
+                        /* determine strategy from id span and count */
+                        if ( ( self -> last - self -> first ) < ( ( int64_t ) self -> count << 1 ) )
+                        {
+                            /* must be contiguous */
+                            self -> count = ( uint32_t ) ( self -> last - self -> first + 1 );
+
+                            /* size should be exactly this number of slots */
+                            if ( size == ( ( size_t ) self -> count << 2 ) )
+                                return 0;
+
+                            /* fall through to error return */
+                        }
+                        else if ( ( size == 4 && self -> count == 1 ) || size > ( ( size_t ) self -> count << 2 ) )
+                        {
+                            /* sparse */
+                            size -= ( size_t ) self -> count << 2;
+
+                            /* unpack id map */
+                            if ( id_bits <= 8 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 1, span_bits, 8 );
+                            else if ( id_bits <= 16 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 2, span_bits, 16 );
+                            else if ( id_bits <= 32 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 3, span_bits, 32 );
+                            else
+                                rc = KPTrieIndexInitID2Ord ( self, size, 4, span_bits, 64 );
+
+                            /* done */
+                            if ( rc == 0 )
+                                return 0;
+
+                            PTrieWhack ( self -> key2id ), self -> key2id = NULL;
+                            return rc;
+                        }
+                    }
+                }
+
+                PTrieWhack ( self -> key2id ), self -> key2id = NULL;
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* Whack
+ *  closes down keymap
+ */
+void KPTrieIndexWhack_v2 ( KPTrieIndex_v2 *self )
+{
+    free ( ( void* ) self -> id2ord . v8 );
+    PTrieWhack ( self -> key2id );
+    KMMapRelease ( self -> mm );
+    memset ( self, 0, sizeof * self );
+}
+
+uint32_t KPTrieIndexID2Ord_v2 ( const KPTrieIndex_v2 *self, int64_t id )
+{
+    if ( id >= self -> first && id <= self -> maxid )
+    {
+        int64_t nid;
+        uint32_t left, right, ord, count = self -> count;
+
+        /* convert id either to a zero-based ord,
+           or else the translated id in id2ord */
+        id -= self -> first;
+
+        /* handle type of projection */
+        switch ( self -> variant )
+        {
+        case 0:
+            /* return one-based ord */
+            return ( uint32_t ) ( id + 1 );
+
+        case 1:
+            for ( left = 1, right = count; left <= right; )
+            {
+                ord = ( left + right ) >> 1;
+                nid = self -> id2ord . v8 [ ord - 1 ];
+                if ( id == nid )
+                    return ord;
+
+                if ( id < nid )
+                {
+                    right = ord - 1;
+                    continue;
+                }
+                if ( ord == count )
+                    return ord;
+
+                nid = self -> id2ord . v8 [ ord ];
+                if ( id < nid )
+                    return ord;
+
+                left = ord + 1;
+            }
+            break;
+
+        case 2:
+            for ( left = 1, right = count; left <= right; )
+            {
+                ord = ( left + right ) >> 1;
+                nid = self -> id2ord . v16 [ ord - 1 ];
+                if ( id == nid )
+                    return ord;
+
+                if ( id < nid )
+                {
+                    right = ord - 1;
+                    continue;
+                }
+                if ( ord == count )
+                    return ord;
+
+                nid = self -> id2ord . v16 [ ord ];
+                if ( id < nid )
+                    return ord;
+
+                left = ord + 1;
+            }
+            break;
+
+        case 3:
+            for ( left = 1, right = count; left <= right; )
+            {
+                ord = ( left + right ) >> 1;
+                nid = self -> id2ord . v32 [ ord - 1 ];
+                if ( id == nid )
+                    return ord;
+
+                if ( id < nid )
+                {
+                    right = ord - 1;
+                    continue;
+                }
+                if ( ord == count )
+                    return ord;
+
+                nid = self -> id2ord . v32 [ ord ];
+                if ( id < nid )
+                    return ord;
+
+                left = ord + 1;
+            }
+            break;
+
+        case 4:
+            for ( left = 1, right = count; left <= right; )
+            {
+                ord = ( left + right ) >> 1;
+                nid = self -> id2ord . v64 [ ord - 1 ];
+                if ( id == nid )
+                    return ord;
+
+                if ( id < nid )
+                {
+                    right = ord - 1;
+                    continue;
+                }
+                if ( ord == count )
+                    return ord;
+
+                nid = self -> id2ord . v64 [ ord ];
+                if ( id < nid )
+                    return ord;
+
+                left = ord + 1;
+            }
+            break;
+        }
+    }
+    return 0;
+}
+
+static
+rc_t KPTrieIndexProject_v2 ( const KPTrieIndex_v2 *self,
+    int64_t id,
+#if V2FIND_RETURNS_SPAN
+    int64_t *start_id, uint32_t *span,
+#endif
+    char *key_buff, size_t buff_size, size_t *actsize )
+{
+    uint32_t nid, ord = KPTrieIndexID2Ord_v2 ( self, id );
+    if ( ord != 0 )
+    {
+        assert ( start_id != NULL );
+        assert ( span != NULL );
+
+        nid = self -> ord2node [ ord - 1 ];
+
+        switch ( self -> variant )
+        {
+        case 0:
+            * start_id = id;
+            for ( ; ord < self -> count; ++ ord )
+            {
+                if ( nid != self -> ord2node [ ord ] )
+                    break;
+            }
+            * span = ( uint32_t ) ( self -> first + ord - * start_id );
+            break;
+        case 1:
+            * start_id = self -> id2ord . v8 [ ord - 1 ];
+            * span = ( uint32_t ) ( ( ( ord == self -> count ) ?
+                ( self -> maxid - self -> first + 1 ) : self -> id2ord . v8 [ ord ] ) - * start_id );
+            *start_id += self -> first;
+            break;
+        case 2:
+            * start_id = self -> id2ord . v16 [ ord - 1 ];
+            * span = ( uint32_t ) ( ( ( ord == self -> count ) ?
+                ( self -> maxid - self -> first + 1 ) : self -> id2ord . v16 [ ord ] ) - * start_id );
+            *start_id += self -> first; 
+            break;
+        case 3:
+            * start_id = self -> id2ord . v32 [ ord - 1 ];
+            * span = ( uint32_t ) ( ( ( ord == self -> count ) ?
+                ( self -> maxid - self -> first + 1 ) : self -> id2ord . v32 [ ord ] ) - * start_id );
+            *start_id += self -> first; 
+            break;
+        case 4:
+            * start_id = self -> id2ord . v64 [ ord - 1 ];
+            * span = ( uint32_t ) ( ( ( ord == self -> count ) ?
+                ( self -> maxid - self -> first + 1 ) : self -> id2ord . v64 [ ord ] ) - * start_id );
+            *start_id += self -> first; 
+            break;
+        }
+
+        if ( nid != 0 )
+        {
+            rc_t rc;
+            PTNode node;
+
+            if ( self -> byteswap )
+                nid = bswap_32 ( nid );
+
+            rc = PTrieGetNode ( self -> key2id, & node, nid );
+            if ( rc == 0 )
+            {
+                const String *key;
+                rc = PTNodeMakeKey ( & node, & key );
+                if ( rc == 0 )
+                {
+                    if ( actsize != NULL )
+                        * actsize = key -> size;
+                    if ( key -> size >= buff_size )
+                        rc = RC ( rcDB, rcIndex, rcProjecting, rcBuffer, rcInsufficient );
+                    else
+                        string_copy ( key_buff, buff_size, key -> addr, key -> size );
+
+                    StringWhack ( ( String* ) key );
+                }
+            }
+            return rc;
+        }
+    }
+
+    return RC ( rcDB, rcIndex, rcProjecting, rcId, rcNotFound );
+}
+
+/* Find
+ */
+static
+rc_t KPTrieIndexFind_v2 ( const KPTrieIndex_v2 *self,
+    const char *str, int64_t *start_id,
+#if V2FIND_RETURNS_SPAN
+    uint32_t *span,
+#endif
+    int ( CC * custom_cmp ) ( const void *item, const PBSTNode *n, void *data ), void *data, bool convertFromV1 )
+{
+    rc_t rc;
+
+    /* search within in-core index */
+    if ( self -> count == 0 )
+        rc = RC ( rcDB, rcIndex, rcSelecting, rcString, rcNotFound );
+    else
+    {
+        uint32_t nid;
+        PTNode pnode;
+
+        String key;
+        StringInitCString ( & key, str );
+
+        nid = PTrieFind ( self -> key2id, & key, & pnode, custom_cmp, data );
+        if ( nid == 0 )
+            rc = RC ( rcDB, rcIndex, rcSelecting, rcString, rcNotFound );
+        else
+        {
+            size_t usize;
+
+            /* detect conversion from v1 */
+            if ( convertFromV1 && self -> id_bits == 0 )
+            {
+                /* v1 stored tree will have just a 32-bit spot id as data */
+                uint32_t id;
+                assert ( pnode . data . size == sizeof id );
+                memmove ( & id, pnode . data . addr, sizeof id );
+                * start_id = id;
+                rc = 0;
+            }
+            else
+            {
+                /* should be native v2 */
+                if ( self -> id_bits > 0 )
+                {
+                    rc = Unpack ( self -> id_bits, sizeof * start_id * 8,
+                        pnode . data . addr, 0, self -> id_bits, NULL,
+                        start_id, sizeof * start_id, & usize );
+                }
+                else
+                {
+                    rc = 0;
+                }
+                * start_id += self -> first;
+            }
+
+            if ( rc == 0 )
+            {
+#if V2FIND_RETURNS_SPAN
+                if ( self -> ord2node != NULL )
+                {
+                    uint32_t ord = KPTrieIndexID2Ord_v2 ( self, * start_id );
+                    if ( ord == 0 )
+                        rc = RC ( rcDB, rcIndex, rcSelecting, rcId, rcNotFound );
+                    else if ( ord == self -> count )
+                        * span = ( uint32_t ) ( self -> maxid - * start_id + 1 );
+                    else switch ( self -> variant )
+                    {
+                    case 0:
+                        for ( ; ord < self -> count; ++ ord )
+                        {
+                            if ( nid != self -> ord2node [ ord ] )
+                                break;
+                        }
+                        * span = ( uint32_t ) ( self -> first + ord - * start_id );
+                        break;
+                    case 1:
+                        * span = ( uint32_t ) ( self -> first + self -> id2ord . v8 [ ord ] - * start_id );
+                        break;
+                    case 2:
+                        * span = ( uint32_t ) ( self -> first + self -> id2ord . v16 [ ord ] - * start_id );
+                        break;
+                    case 3:
+                        * span = ( uint32_t ) ( self -> first + self -> id2ord . v32 [ ord ] - * start_id );
+                        break;
+                    case 4:
+                        * span = ( uint32_t ) ( self -> first + self -> id2ord . v64 [ ord ] - * start_id );
+                        break;
+                    }
+                }
+                else if ( self -> span_bits == 0 )
+                    * span = 1;
+                else
+                {
+                    rc = Unpack ( self -> span_bits, sizeof * span * 8,
+                        pnode . data . addr, 0, self -> id_bits, NULL,
+                        span, sizeof * span, & usize );
+                }
+#endif
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIndex_v2
+ */
+
+
+/* whack whack */
+void KTrieIndexWhack_v2 ( KTrieIndex_v2 *self )
+{
+    KPTrieIndexWhack_v2 ( & self -> pt );
+}
+
+/* initialize an index from file */
+rc_t KTrieIndexOpen_v2 ( KTrieIndex_v2 *self, const KMMap *mm, bool byteswap )
+{
+    rc_t rc;
+    uint32_t version;
+    bool ptorig = false;
+    const KDBHdr *hdr = NULL;
+
+#if ! KTRIE_ZEROS_KPTRIE
+#error "KTrie is supposed to zero KPTrie"
+#endif
+    memset ( self, 0, sizeof * self );
+
+    /* open the prior index in persisted mode, but
+       don't load it into the core-based Trie */
+    rc = KMMapAddrRead ( mm, ( const void** ) & hdr );
+    if ( rc != 0 )
+        return rc;
+
+    self -> pt . byteswap = byteswap;
+    version = byteswap ? bswap_32 ( hdr -> version ) : hdr -> version;
+
+    switch ( version )
+    {
+    case 1:
+        rc = KPTrieIndexInitFromV1_v2 ( & self -> pt, mm, byteswap );
+        break;
+    case 2:
+        rc = KPTrieIndexInit_v2 ( & self -> pt, mm, byteswap );
+        break;
+    case 3:
+        ptorig = true;
+    case 4:
+        rc = KPTrieIndexInit_v3_v4 ( & self -> pt, mm, byteswap, ptorig );
+        break;
+    default:
+        rc = RC(rcDB, rcIndex, rcConstructing, rcIndex, rcBadVersion);
+        break;
+    }
+    if ( rc == 0 )
+    {
+        /* the file existed but was empty */
+        if ( self -> pt . key2id == NULL )
+        {
+            self -> pt . mm = NULL;
+            return 0;
+        }
+
+        /* retain a reference to memory map */
+        rc = KMMapAddRef ( mm );
+        if ( rc == 0 )
+        {
+            self -> pt . mm = mm;
+            return 0;
+        }
+
+        /* self -> pt gets whacked below */
+    }
+
+    KTrieIndexWhack_v2 ( self );
+    return rc;
+}
+
+
+/* map key to id range */
+rc_t KTrieIndexFind_v2 ( const KTrieIndex_v2 *self,
+    const char *str, int64_t *start_id,
+#if V2FIND_RETURNS_SPAN
+    uint32_t *span,
+#endif
+    int ( CC * custom_cmp ) ( const void *item, const PBSTNode *n, void *data ), void *data, bool convertFromV1  )
+{
+    /* search within persisted index */
+    if ( self -> pt . key2id != NULL )
+    {
+        return KPTrieIndexFind_v2 ( & self -> pt, str, start_id,
+#if V2FIND_RETURNS_SPAN
+                                    span,
+#endif
+                                    custom_cmp, data, convertFromV1 );
+    }
+
+    return RC ( rcDB, rcIndex, rcSelecting, rcString, rcNotFound );
+}
+
+rc_t KTrieIndexProject_v2 ( const KTrieIndex_v2 *self,
+    int64_t id,
+#if V2FIND_RETURNS_SPAN
+     int64_t *start_id, uint32_t *span,
+#endif
+    char *key_buff, size_t buff_size, size_t *actsize )
+{
+    if ( self -> pt . ord2node == NULL )
+        return RC ( rcDB, rcIndex, rcProjecting, rcId, rcNotFound );
+
+    return KPTrieIndexProject_v2 ( & self -> pt, id,
+#if V2FIND_RETURNS_SPAN
+       start_id, span,
+#endif
+        key_buff, buff_size, actsize );
+}
diff --git a/libs/kdb/trieval-v1.c b/libs/kdb/trieval-v1.c
new file mode 100644
index 0000000..fff6cff
--- /dev/null
+++ b/libs/kdb/trieval-v1.c
@@ -0,0 +1,49 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#include "index-priv.h"
+
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+
+rc_t KTrieIndexCheckConsistency_v1 ( const KTrieIndex_v1 *self,
+    int64_t *start_id, uint64_t *id_range, uint64_t *num_keys,
+    uint64_t *num_rows, uint64_t *num_holes,
+    struct KIndex const *outer, bool key2id, bool id2key )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcValidating, rcParam, rcNull );
+
+    return KPTrieIndexCheckConsistency_v1 ( & self -> pt,
+        start_id, id_range, num_keys, num_rows, num_holes,
+        outer, key2id, id2key );
+}
diff --git a/libs/kdb/trieval-v2.c b/libs/kdb/trieval-v2.c
new file mode 100644
index 0000000..e3e095b
--- /dev/null
+++ b/libs/kdb/trieval-v2.c
@@ -0,0 +1,49 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#include "index-priv.h"
+
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+
+rc_t KTrieIndexCheckConsistency_v2 ( const KTrieIndex_v2 *self,
+    int64_t *start_id, uint64_t *id_range, uint64_t *num_keys,
+    uint64_t *num_rows, uint64_t *num_holes,
+    struct KIndex const *outer, bool key2id, bool id2key, bool all_ids, bool convertFromV1  )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcValidating, rcParam, rcNull );
+
+    return KPTrieIndexCheckConsistency_v2 ( & self -> pt,
+        start_id, id_range, num_keys, num_rows, num_holes,
+        outer, key2id, id2key, all_ids, convertFromV1 );
+}
diff --git a/libs/kdb/u64idx-v3.c b/libs/kdb/u64idx-v3.c
new file mode 100644
index 0000000..ce5c13f
--- /dev/null
+++ b/libs/kdb/u64idx-v3.c
@@ -0,0 +1,162 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#include "index-priv.h"
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kfs/mmap.h>
+#include <klib/pbstree.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <string.h>
+
+typedef struct KU64Index_PNode KU64Index_PNode;
+struct KU64Index_PNode
+{
+    uint64_t key;
+    uint64_t key_size;
+    int64_t id;
+    uint64_t id_qty;
+};
+
+rc_t KU64IndexOpen_v3( KU64Index_v3* self, const KMMap *mm, bool byteswap )
+{
+    rc_t rc;
+    const KIndexFileHeader_v3 *hdr;
+
+    /* when opened for create, there will be no existing index */
+    if( mm == NULL )
+        return 0;
+
+    /* open the prior index in persisted mode */
+    rc = KMMapAddrRead ( mm, ( const void** ) & hdr );
+    if( rc == 0 )
+    {
+        size_t msize;
+        rc = KMMapSize ( mm, & msize );
+        if ( rc == 0 )
+        {
+            if ( msize == 0 )
+                return 0;
+            if ( msize < sizeof * hdr )
+                return RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+            rc = PBSTreeMake ( & self -> tree, hdr + 1, msize - sizeof * hdr, byteswap);
+            if( rc == 0 )
+            {
+                rc = KMMapAddRef(mm);
+                if ( rc == 0 )
+                {
+                    self -> mm = mm;
+                    return 0;
+                }
+            }
+        }
+    }
+
+    KU64IndexWhack_v3(self);
+    return rc;
+}
+
+rc_t KU64IndexWhack_v3(KU64Index_v3* self)
+{
+    PBSTreeWhack(self->tree);
+    KMMapRelease(self->mm);
+    self->tree = NULL;
+    return 0;
+}
+
+typedef struct KU64Index_GrepData_struct {
+    rc_t rc;
+    rc_t (CC*func)(uint64_t key, uint64_t key_size, int64_t id, uint64_t id_qty, void* data);
+    void* data;
+    KU64Index_PNode search;
+    uint64_t* key;
+    uint64_t* key_size;
+    int64_t* id;
+    uint64_t* id_qty;
+} KU64Index_GrepData;
+
+/*
+ * return true: if found or break DoUntil for FindAll
+ */
+static
+bool CC KU64Index_Grep(PBSTNode *node, void *data)
+{
+    const KU64Index_PNode* n = node->data.addr;
+    KU64Index_GrepData* d = data;
+
+    if( d->search.key >= n->key && (d->search.key - n->key) < n->key_size ) {
+        if( d->func ) {
+            d->rc = (*d->func)(n->key, n->key_size, n->id, n->id_qty, d->data);
+            if( d->rc != 0 ) {
+                return true;
+            }
+        } else {
+            *d->key = n->key;
+            *d->key_size = n->key_size;
+            *d->id = n->id;
+            *d->id_qty = n->id_qty;
+            return true;
+        }
+    }
+    return false;
+}
+
+rc_t KU64IndexFind_v3( const KU64Index_v3* self, uint64_t offset, uint64_t* key, 
+    uint64_t* key_size, int64_t* id, uint64_t* id_qty )
+{
+    KU64Index_GrepData d;
+
+    memset(&d, 0, sizeof(KU64Index_GrepData));
+    d.search.key = offset;
+    d.key = key;
+    d.key_size = key_size;
+    d.id = id;
+    d.id_qty = id_qty;
+    if( !PBSTreeDoUntil(self->tree, false, KU64Index_Grep, &d) ) {
+        d.rc = RC(rcDB, rcIndex, rcSelecting, rcId, rcNotFound);
+    }
+    return d.rc;
+}
+
+
+rc_t KU64IndexFindAll_v3( const KU64Index_v3* self, uint64_t offset, 
+    rc_t (CC*f)(uint64_t key, uint64_t key_size, int64_t id, uint64_t id_qty, void* data), void* data)
+{
+    KU64Index_GrepData d;
+
+    memset(&d, 0, sizeof(KU64Index_GrepData));
+    d.func = f;
+    d.data = data;
+    d.search.key = offset;
+    PBSTreeDoUntil(self->tree, false, KU64Index_Grep, &d);
+    return d.rc;
+}
diff --git a/libs/kdb/wcoldata-priv.h b/libs/kdb/wcoldata-priv.h
new file mode 100644
index 0000000..9d27d09
--- /dev/null
+++ b/libs/kdb/wcoldata-priv.h
@@ -0,0 +1,172 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_coldata_priv_
+#define _h_coldata_priv_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_klib_checksum_
+#include <klib/checksum.h>
+#endif
+
+#include <kfs/file.h>
+#include <kfs/md5.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KMD5SumFmt;
+typedef union KColumnPageMap KColumnPageMap;
+
+
+/*--------------------------------------------------------------------------
+ * KColumnData
+ *  data fork
+ *
+ *  only handling append-mode today
+ *
+ *  kept 64-bit aligned
+ */
+typedef struct KColumnData KColumnData;
+struct KColumnData
+{
+    /* cached end of data fork */
+    uint64_t eof;
+
+    /* data fork itself */
+    KFile *f;
+    KMD5File *fmd5;
+
+    /* page size */
+    size_t pgsize;
+
+};
+
+/* DefaultPageSize
+ *  static method
+ */
+#define KColumnDataDefaultPageSize( reuse_pages ) \
+    ( ( reuse_pages ) ? 4096 : 1 )
+
+/* Create
+ */
+rc_t KColumnDataCreate ( KColumnData *self, KDirectory *dir,
+    KMD5SumFmt *md5, KCreateMode mode, uint64_t eof, size_t pgsize );
+
+/* Open
+ */
+rc_t KColumnDataOpenRead ( KColumnData *self,
+    const KDirectory *dir, uint64_t eof, size_t pgsize );
+rc_t KColumnDataOpenUpdate ( KColumnData *self, KDirectory *dir,
+    KMD5SumFmt *md5, uint64_t eof, size_t pgsize );
+
+/* Whack
+ */
+rc_t KColumnDataWhack ( KColumnData *self );
+
+/* Read
+ *  reads from the data fork using a blob map
+ */
+rc_t KColumnDataRead ( const KColumnData *self, const KColumnPageMap *pm,
+    size_t offset, void *buffer, size_t bsize, size_t *num_read );
+
+/* Write
+ *  writes to the data fork using a blob map
+ */
+rc_t  KColumnDataWrite ( KColumnData *self, KColumnPageMap *pm,
+    size_t offset, const void *buffer, size_t bytes, size_t *num_writ );
+
+/* Commit
+ *  keeps changes indicated by page map and blob size
+ */
+rc_t KColumnDataCommit ( KColumnData *self,
+    const KColumnPageMap *pm, size_t bytes );
+
+/* CommitDone
+ *  finalizes a commit
+ */
+rc_t KColumnDataCommitDone ( KColumnData * self );
+
+/* Free
+ *  frees pages from a map
+ */
+rc_t KColumnDataFree ( KColumnData *self,
+    const KColumnPageMap *pm, size_t bytes );
+
+
+/*--------------------------------------------------------------------------
+ * KColumnPageMap
+ *  map of pages involved in column blob
+ */
+union KColumnPageMap
+{
+    /* for non-paged data forks, a single page id
+       describes the start of the blob, where the
+       remainder is sequential */
+    uint64_t pg;
+};
+
+/* Create
+ *  creates a new page map using the first available page id
+ *  obtains first free data fork page
+ */
+rc_t KColumnPageMapCreate (  KColumnPageMap *self, KColumnData *cd );
+
+/* Open
+ *  opens an blob by raw page id and size
+ *
+ *  "pm" [ OUT ] - modifiable parameter for blob page map
+ *
+ *  "pg" [ IN ] and "sz" [ IN ] - identifies pages of data fork included
+ *  within the blob.
+ */
+rc_t KColumnPageMapOpen ( KColumnPageMap *pm,
+    KColumnData *cd, uint64_t pg, size_t sz );
+
+/* Whack
+ *  disposes of memory in the case of a page array
+ */
+void KColumnPageMapWhack ( KColumnPageMap *self, const KColumnData *cd );
+
+/* Id
+ *  captures id of initial page
+ */
+rc_t KColumnPageMapId ( const KColumnPageMap *self,
+    const KColumnData *cd, uint64_t *pg );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_coldata_priv_ */
diff --git a/libs/kdb/wcoldata.c b/libs/kdb/wcoldata.c
new file mode 100644
index 0000000..f4647e0
--- /dev/null
+++ b/libs/kdb/wcoldata.c
@@ -0,0 +1,342 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "wcoldata-priv.h"
+#include "wcolumn-priv.h"
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+#include <kfs/md5.h>
+#include <kfs/impl.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+
+#define DATA_READ_FILE_BUFFER 256 * 1024
+
+
+/*--------------------------------------------------------------------------
+ * KColumnData
+ */
+
+
+/* Init
+ */
+static
+rc_t KColumnDataInit ( KColumnData *self, uint64_t pos, size_t pgsize )
+{
+    rc_t rc = KFileSize ( self -> f, & self -> eof );
+    if ( rc == 0 )
+    {
+        if ( self -> eof < pos || pgsize == 0 || ( pos % pgsize ) != 0 )
+            rc = RC ( rcDB, rcColumn, rcConstructing, rcData, rcCorrupt );
+        else
+        {
+            self -> eof = pos;
+            self -> pgsize = pgsize;
+            return 0;
+        }
+    }
+
+    KFileRelease ( self -> f );
+    self -> f = NULL;
+    return rc;
+}
+
+/* Create
+ */
+rc_t KColumnDataCreate ( KColumnData *self, KDirectory *dir,
+    KMD5SumFmt *md5, KCreateMode mode, uint64_t eof, size_t pgsize )
+{
+    rc_t rc = KColumnFileCreate ( & self -> f, & self -> fmd5, dir, md5, mode, true, "data" );
+    if ( rc == 0 )
+        rc = KColumnDataInit ( self, eof, pgsize );
+    return rc;
+}
+
+/* Open
+ */
+rc_t KColumnDataOpenRead ( KColumnData *self,
+    const KDirectory *dir, uint64_t eof, size_t pgsize )
+{
+    rc_t rc = KDirectoryOpenFileRead ( dir,
+        ( const KFile** ) & self -> f, "data" );
+#if DATA_READ_FILE_BUFFER
+    if ( rc == 0 )
+    {
+        KFile * orig = self -> f;
+        rc = KBufFileMakeRead ( ( const KFile** ) & self -> f, self -> f, DATA_READ_FILE_BUFFER );
+        if ( rc == 0 )
+	{
+	    KFileRelease ( orig );
+	}
+	else
+        {
+            self -> f = orig;
+            rc = 0;
+        }
+    }
+#endif
+    if ( rc == 0 )
+        rc = KColumnDataInit ( self, eof, pgsize );
+    return rc;
+}
+
+rc_t KColumnDataOpenUpdate ( KColumnData *self, KDirectory *dir,
+    KMD5SumFmt *md5, uint64_t eof, size_t pgsize )
+{
+    rc_t rc = KColumnFileOpenUpdate ( & self -> f, & self -> fmd5, dir, md5, true, "data" );
+    if ( rc == 0 )
+        rc = KColumnDataInit ( self, eof, pgsize );
+    return rc;
+}
+
+/* Whack
+ */
+rc_t KColumnDataWhack ( KColumnData *self )
+{
+    rc_t rc = KFileRelease ( self -> f );
+    if ( rc == 0 )
+    {
+        self -> f = NULL;
+        self -> fmd5 = NULL;
+    }
+    return rc;
+}
+
+/* Read
+ *  reads from the data fork using a blob map
+ */
+rc_t KColumnDataRead ( const KColumnData *self, const KColumnPageMap *pm,
+    size_t offset, void *buffer, size_t bsize, size_t *num_read )
+{
+    uint64_t pos;
+
+    assert ( self != NULL );
+    assert ( pm != NULL );
+
+    if ( bsize == 0 )
+    {
+        assert ( num_read != NULL );
+        * num_read = 0;
+        return 0;
+    }
+
+    pos = pm -> pg * self -> pgsize;
+    return KFileRead ( self -> f, pos + offset, buffer, bsize, num_read );
+}
+
+/* Write
+ *  writes to the data fork using a blob map
+ */
+rc_t KColumnDataWrite ( KColumnData *self, KColumnPageMap *pm,
+    size_t offset, const void *buffer, size_t bytes, size_t *num_writ )
+{
+    uint64_t pos;
+
+    assert ( self != NULL );
+    assert ( pm != NULL );
+
+    if ( bytes == 0 )
+    {
+        assert ( num_writ != NULL );
+        * num_writ = 0;
+        return 0;
+    }
+
+    pos = pm -> pg * self -> pgsize;
+    return KFileWrite ( self -> f, pos + offset, buffer, bytes, num_writ );
+}
+
+/* Commit
+ *  keeps changes indicated by page map and blob size
+ */
+rc_t KColumnDataCommit ( KColumnData *self,
+    const KColumnPageMap *pm, size_t bytes )
+{
+    uint64_t pos;
+    size_t remainder;
+
+    assert ( self != NULL );
+    assert ( pm != NULL );
+
+    if ( self -> pgsize == 1 )
+    {
+        /* can only commit if extending page */
+        if ( pm -> pg != self -> eof )
+            return RC ( rcDB, rcBlob, rcCommitting, rcPagemap, rcInvalid );
+
+        self -> eof += bytes;
+        return 0;
+    }
+
+    assert ( ( self -> eof % self -> pgsize ) == 0 );
+    pos = self -> eof / self -> pgsize;
+
+    /* can only commit if extending page */
+    if ( pm -> pg != pos )
+        return RC ( rcDB, rcBlob, rcCommitting, rcPagemap, rcInvalid );
+
+    /* advance eof */
+    if ( bytes == 0 )
+        return 0;
+
+    pos = self -> eof + bytes;
+
+    /* maintain page boundary */
+    remainder = bytes % self -> pgsize;
+    if ( remainder != 0 )
+    {
+        pos += self -> pgsize - remainder;
+        assert ( ( pos % self -> pgsize ) == 0 );
+    }
+
+    self -> eof = pos;
+    return 0;
+}
+
+rc_t KColumnDataCommitDone ( KColumnData * self )
+{
+    rc_t rc = 0;
+
+    assert ( self != NULL );
+    if ( self -> fmd5 != NULL )
+    {
+	assert ( self -> f == KMD5FileToKFile ( self -> fmd5 ) );
+
+	rc = KMD5FileCommit ( self -> fmd5 );
+    }
+    return rc ;
+}
+
+/* Free
+ *  frees pages from a map
+ */
+rc_t KColumnDataFree ( KColumnData *self,
+    const KColumnPageMap *pm, size_t bytes )
+{
+    uint64_t pos;
+    size_t remainder;
+
+    if ( self -> pgsize == 1 )
+    {
+        if ( pm -> pg + bytes != self -> eof )
+            return RC ( rcDB, rcBlob, rcReleasing, rcPagemap, rcInvalid );
+
+        self -> eof = pm -> pg;
+        return 0;
+    }
+
+    assert ( ( self -> eof % self -> pgsize ) == 0 );
+    pos = pm -> pg * self -> pgsize;
+
+    remainder = bytes % self -> pgsize;
+    if ( pos + bytes + remainder != self -> eof )
+        return RC ( rcDB, rcBlob, rcReleasing, rcPagemap, rcInvalid );
+
+    self -> eof = pos;
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KColumnPageMap
+ *  map of pages involved in column blob
+ */
+
+/* Create
+ *  creates a new page map using the first available page id
+ *  obtains first free data fork page
+ */
+rc_t KColumnPageMapCreate (  KColumnPageMap *self, KColumnData *cd )
+{
+    assert ( cd != NULL );
+    if ( ! cd -> f -> write_enabled )
+        return RC ( rcDB, rcPagemap, rcConstructing, rcColumn, rcReadonly );
+
+    assert ( self != NULL );
+    assert ( ( cd -> eof % cd -> pgsize ) == 0 );
+    self -> pg = cd -> eof / cd -> pgsize;
+
+    return 0;
+}
+
+/* Open
+ *  opens an blob by raw page id and size
+ *
+ *  "pm" [ OUT ] - modifiable parameter for blob page map
+ *
+ *  "pg" [ IN ] and "sz" [ IN ] - identifies pages of data fork included
+ *  within the blob.
+ */
+rc_t KColumnPageMapOpen ( KColumnPageMap *self,
+    KColumnData *cd, uint64_t pg, size_t sz )
+{
+    uint64_t pos;
+
+    assert ( cd != NULL );
+    pos = pg * cd -> pgsize;
+    if ( pos + sz > cd -> eof )
+    {
+        if ( pos >= cd -> eof )
+            return RC ( rcDB, rcColumn, rcOpening, rcParam, rcExcessive );
+        return RC ( rcDB, rcColumn, rcOpening, rcRange, rcExcessive );
+    }
+
+    assert ( self != NULL );
+    self -> pg = pg;
+
+    return 0;
+}
+
+/* Whack
+ *  disposes of memory in the case of a page array
+ */
+void KColumnPageMapWhack ( KColumnPageMap *self, const KColumnData *cd )
+{
+    assert ( self != NULL );
+    assert ( cd != NULL );
+}
+
+/* Id
+ *  captures id of initial page
+ */
+rc_t KColumnPageMapId ( const KColumnPageMap *self,
+    const KColumnData *cd, uint64_t *pg )
+{
+    assert ( self != NULL );
+    assert ( cd != NULL );
+    assert ( pg != NULL );
+
+    * pg = self -> pg;
+    return 0;
+}
diff --git a/libs/kdb/wcolidx-priv.h b/libs/kdb/wcolidx-priv.h
new file mode 100644
index 0000000..e57fe2c
--- /dev/null
+++ b/libs/kdb/wcolidx-priv.h
@@ -0,0 +1,166 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_colidx_priv_
+#define _h_colidx_priv_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#include <kfs/md5.h>
+
+#ifndef _h_colfmt_priv_
+#include "colfmt-priv.h"
+#endif
+
+#ifndef _h_colidx0_priv_
+#include "wcolidx0-priv.h"
+#endif
+
+#ifndef _h_colidx1_priv_
+#include "wcolidx1-priv.h"
+#endif
+
+#ifndef _h_colidx2_priv_
+#include "wcolidx2-priv.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KMD5SumFmt;
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx
+ *  the index fork
+ */
+typedef struct KColumnIdx KColumnIdx;
+struct KColumnIdx
+{
+    /* first active id within db
+       and first id on upper limit
+       i.e. outside of db such that
+       id_upper - id_first == num_ids */
+    int64_t id_first;
+    int64_t id_upper;
+
+/*     struct KFile * f; */
+    uint32_t vers;
+
+    /* level 0 index */
+    KColumnIdx0 idx0;
+
+    /* level 1 index */
+    KColumnIdx1 idx1;
+
+    /* level 2 index */
+    KColumnIdx2 idx2;
+
+    /* commit counter */
+    uint32_t commit_count;
+};
+
+/* Create
+ */
+rc_t KColumnIdxCreate ( KColumnIdx *self,
+    KDirectory *dir, struct KMD5SumFmt *md5, KCreateMode mode,
+    uint64_t *data_eof, size_t pgsize, int32_t checksum );
+
+/* Open
+ */
+rc_t KColumnIdxOpenRead ( KColumnIdx *self, const KDirectory *dir,
+			  uint64_t *data_eof, size_t *pgsize, 
+			  int32_t *checksum );
+rc_t KColumnIdxOpenUpdate ( KColumnIdx *self, KDirectory *dir,
+    KMD5SumFmt *md5, uint64_t *data_eof, size_t *pgsize,
+    int32_t *checksum );
+
+/* Whack
+ */
+rc_t KColumnIdxWhack ( KColumnIdx *self, 
+    uint64_t data_eof, size_t pgsize, int32_t checksum );
+
+/* Version
+ */
+rc_t KColumnIdxVersion ( const KColumnIdx *self, uint32_t *version );
+#define KColumnIdxVersion( self, version ) \
+    KColumnIdx1Version ( & ( self ) -> idx1, version )
+
+/* ByteOrder
+ */
+rc_t KColumnIdxByteOrder ( const KColumnIdx *self, bool *reversed );
+#define KColumnIdxByteOrder( self, reversed ) \
+    KColumnIdx1ByteOrder ( & ( self ) -> idx1, reversed )
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+rc_t KColumnIdxIdRange ( const KColumnIdx *self,
+    int64_t *first, int64_t *last );
+
+/* FindFirstRowId
+ */
+rc_t KColumnIdxFindFirstRowId ( const KColumnIdx * self,
+    int64_t * found, int64_t start );
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdxLocateBlob ( const KColumnIdx *self,
+    KColBlobLoc *loc, int64_t first, int64_t last );
+
+/* Commit
+ *  writes a new blob location to idx0
+ *  updates idx1 with header information
+ *  this should be the final step in committing a write operation
+ */
+rc_t KColumnIdxCommit ( KColumnIdx *self, struct KMD5SumFmt *md5,
+    const KColBlobLoc *loc, uint32_t commit_freq,
+    uint64_t data_eof, size_t pgsize, int32_t checksum );
+
+/* CommitDone
+ *  finalizes a commit
+ */
+rc_t KColumnIdxCommitDone ( KColumnIdx * self );
+
+/* Reindex
+ */
+rc_t KColumnIdxReindex ( KColumnIdx *self, struct KMD5SumFmt *md5,
+    uint32_t commit_freq, uint64_t data_eof, size_t pgsize, int32_t checksum );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_colidx_priv_ */
diff --git a/libs/kdb/wcolidx.c b/libs/kdb/wcolidx.c
new file mode 100644
index 0000000..7411f67
--- /dev/null
+++ b/libs/kdb/wcolidx.c
@@ -0,0 +1,694 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "wcolidx-priv.h"
+#include "widxblk-priv.h"
+#include "werror-priv.h"
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx
+ *  the index fork
+ */
+
+
+/* EstablishIdRange
+ */
+static
+void KColumnIdxEstablishIdRange ( KColumnIdx *self )
+{
+    int64_t first, upper;
+
+    if ( ! KColumnIdx0IdRange ( & self -> idx0, & self -> id_first, & self -> id_upper ) )
+    {
+        if ( ! KColumnIdx1IdRange ( & self -> idx1, & self -> id_first, & self -> id_upper ) )
+            self -> id_first = self -> id_upper = 1;
+    }
+    else if ( KColumnIdx1IdRange ( & self -> idx1, & first, & upper ) )
+    {
+        if ( self -> id_first > first )
+            self -> id_first = first;
+        if ( self -> id_upper < upper )
+            self -> id_upper = upper;
+    }
+}
+
+
+/* Create
+ */
+rc_t KColumnIdxCreate ( KColumnIdx *self, KDirectory *dir,
+    KMD5SumFmt *md5, KCreateMode mode, uint64_t *data_eof,
+    size_t pgsize, int32_t checksum )
+{
+    rc_t rc = 0;
+    uint64_t idx2_eof;
+    uint32_t idx0_count;
+
+    assert ( self != NULL );
+
+    rc = KColumnIdx1Create ( & self -> idx1, dir, md5, mode,
+        data_eof, & idx0_count, & idx2_eof, pgsize, checksum );
+    if ( rc == 0 )
+    {
+        rc = ( self -> idx1 . vers < 3 ) ?
+            KColumnIdx0Create_v1 ( & self -> idx0, dir, md5, mode, self -> idx1 . bswap ):
+            KColumnIdx0Create ( & self -> idx0, dir, idx0_count, md5, mode, self -> idx1 . bswap );
+        if ( rc == 0 )
+        {
+            rc = KColumnIdx2Create ( & self -> idx2, dir, md5, mode, idx2_eof );
+            if ( rc == 0 )
+            {
+                KColumnIdxEstablishIdRange ( self );
+
+                /* successful return */
+                return 0;
+            }
+
+            KColumnIdx0Whack ( & self -> idx0 );
+        }
+
+        KColumnIdx1Whack ( & self -> idx1 );
+    }
+
+    /* failure return */
+    return rc;
+}
+
+/* Open
+ */
+rc_t KColumnIdxOpenRead ( KColumnIdx *self, const KDirectory *dir,
+    uint64_t *data_eof, size_t *pgsize, int32_t *checksum )
+{
+    rc_t rc;
+    uint64_t idx2_eof;
+    uint32_t idx0_count;
+
+    assert ( self != NULL );
+
+    rc = KColumnIdx1OpenRead ( & self -> idx1,
+        dir, data_eof, & idx0_count, & idx2_eof, pgsize, checksum );
+    if ( rc == 0 )
+    {
+        rc = ( self -> idx1 . vers < 3 ) ?
+            KColumnIdx0OpenRead_v1 ( & self -> idx0, dir, self -> idx1 . bswap ):
+            KColumnIdx0OpenRead ( & self -> idx0, dir, idx0_count, self -> idx1 . bswap );
+        if ( rc == 0 )
+        {
+            rc = KColumnIdx2OpenRead ( & self -> idx2, dir, idx2_eof );
+            if ( rc == 0 || GetRCState ( rc ) == rcNotFound )
+            {
+                KColumnIdxEstablishIdRange ( self );
+                return 0;
+            }
+
+            KColumnIdx0Whack ( & self -> idx0 );
+        }
+
+        KColumnIdx1Whack ( & self -> idx1 );
+    }
+
+    return rc;
+}
+
+rc_t KColumnIdxOpenUpdate ( KColumnIdx *self, KDirectory *dir,
+    KMD5SumFmt *md5, uint64_t *data_eof, size_t *pgsize, int32_t *checksum )
+{
+    rc_t rc;
+    uint64_t idx2_eof;
+    uint32_t idx0_count;
+
+    assert ( self != NULL );
+
+    rc = KColumnIdx1OpenUpdate ( & self -> idx1, dir,
+        md5, data_eof, & idx0_count, & idx2_eof, pgsize, checksum );
+    if ( rc == 0 )
+    {
+        rc = ( self -> idx1 . vers < 3 ) ?
+            KColumnIdx0Create_v1 ( & self -> idx0, dir, md5, kcmOpen, self -> idx1 . bswap ):
+            KColumnIdx0Create ( & self -> idx0, dir, idx0_count, md5, kcmOpen, self -> idx1 . bswap );
+        if ( rc == 0 )
+        {
+            rc = KColumnIdx2Create ( & self -> idx2, dir, md5, kcmOpen, idx2_eof );
+            if ( rc == 0 )
+            {
+                KColumnIdxEstablishIdRange ( self );
+                return 0;
+            }
+
+            KColumnIdx0Whack ( & self -> idx0 );
+        }
+        KColumnIdx1Whack ( & self -> idx1 );
+    }
+
+    return rc;
+}
+
+/* Whack
+ */
+rc_t KColumnIdxWhack ( KColumnIdx *self,
+    uint64_t data_eof, size_t pgsize, int32_t checksum )
+{
+    rc_t rc;
+
+    assert ( self != NULL );
+
+    if ( self -> commit_count != 0 )
+    {
+        rc = KColumnIdx1WriteHeader ( & self -> idx1,
+            data_eof, self -> idx0 . count, self -> idx2 . eof,
+            pgsize, checksum );
+        if ( rc != 0 )
+            return rc;
+
+        self -> commit_count = 0;
+    }
+
+    rc = KColumnIdx1Whack ( & self -> idx1 );
+    if ( rc == 0 )
+    {
+        KColumnIdx0Whack ( & self -> idx0 );
+        KColumnIdx2Whack ( & self -> idx2 );
+    }
+
+    return rc;
+}
+
+/* Version
+ */
+#ifndef KColumnIdxVersion
+rc_t KColumnIdxVersion ( const KColumnIdx *self, uint32_t *version )
+{
+    return KColumnIdx1Version ( & self -> idx1, version );
+}
+#endif
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+rc_t KColumnIdxIdRange ( const KColumnIdx *self,
+    int64_t *first, int64_t *last )
+{
+    assert ( self != NULL );
+    assert ( first != NULL );
+    assert ( last != NULL );
+
+    * first = self -> id_first;
+    * last = self -> id_upper - 1;
+
+    if ( self -> id_first == self -> id_upper )
+        return RC ( rcDB, rcColumn, rcAccessing, rcRange, rcInvalid );
+    return 0;
+}
+
+/* FindFirstRowId
+ */
+rc_t KColumnIdxFindFirstRowId ( const KColumnIdx * self,
+    int64_t * found, int64_t start )
+{
+    rc_t rc0, rc1;
+    KColBlockLoc bloc;
+    int64_t best0, best1;
+
+    assert ( self != NULL );
+    assert ( found != NULL );
+
+    /* global reject */
+    if ( start < self -> id_first || start >= self -> id_upper )
+        return RC ( rcDB, rcColumn, rcSelecting, rcRow, rcNotFound );
+
+    /* look in idx0 */
+    rc0 = KColumnIdx0FindFirstRowId ( & self -> idx0, found, start );
+    if ( rc0 == 0 )
+    {
+        if ( * found == start )
+            return 0;
+
+        best0 = * found;
+        assert ( best0 > start );
+    }
+
+    /* look in main index */
+    /* KColumnIdx1LocateFirstRowIdBlob returns the blob containing 'start', if such blob exists, otherwise the next blob (or RC if there's no next) */
+    rc1 = KColumnIdx1LocateFirstRowIdBlob ( & self -> idx1, & bloc, start );
+    if ( rc1 != 0 )
+    {
+        return rc0;
+    }
+    if ( start >= bloc . start_id )
+    {   /* found inside a blob */
+        best1 = start;
+    }
+    else
+    {   /* not found; pick the start of the next blob */
+        best1 = bloc . start_id;
+    }
+
+    if ( rc0 != 0 )
+    {
+        * found = best1;
+        return 0;
+    }
+
+    /* found in both - return lesser */
+
+    /* "found" already contains 'best0" */
+    assert ( * found == best0 );
+    if ( best1 < best0 )
+        * found = best1;
+
+    return 0;
+}
+
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdxLocateBlob ( const KColumnIdx *self,
+    KColBlobLoc *loc, int64_t first, int64_t upper )
+{
+    rc_t rc;
+
+    assert ( self != NULL );
+
+    /* convert "last" to "upper" */
+    if ( first >= ++ upper )
+        return RC ( rcDB, rcColumn, rcSelecting, rcRange, rcInvalid );
+
+    /* global reject */
+    if ( first < self -> id_first || upper > self -> id_upper )
+        return RC ( rcDB, rcColumn, rcSelecting, rcBlob, rcNotFound );
+
+    /* look in idx0 */
+    rc = KColumnIdx0LocateBlob ( & self -> idx0, loc, first, upper );
+    if ( GetRCState ( rc ) == rcNotFound )
+    {
+        KColBlockLoc bloc;
+
+        /* find block containing range */
+        rc = KColumnIdx1LocateBlock ( & self -> idx1, & bloc, first, upper );
+        if ( rc == 0 )
+        {
+            /* find location in idx2 */
+            rc = KColumnIdx2LocateBlob ( & self -> idx2,
+                loc, & bloc, first, upper, self -> idx1 . bswap );
+        }
+    }
+
+    return rc;
+}
+
+/* KColumnIdxCommit
+ *  writes a new blob location to idx0
+ *  updates idx1 with header information
+ *  this should be the final step in committing a write operation
+ */
+rc_t KColumnIdxCommit ( KColumnIdx *self, KMD5SumFmt *md5,
+    const KColBlobLoc *loc, uint32_t commit_freq,
+    uint64_t data_eof, size_t pgsize, int32_t checksum )
+{
+    rc_t idx0rc, rc;
+    KColBlobLoc prior;
+
+    assert ( self != NULL );
+    assert ( loc != NULL );
+
+    /* check index range for wraparound */
+    if ( ( loc -> start_id + loc -> id_range ) <= loc -> start_id )
+        return RC ( rcDB, rcColumn, rcCommitting, rcRange, rcInvalid );
+
+    /* journal to idx0 */
+    rc = idx0rc =
+        KColumnIdx0Commit ( & self -> idx0, loc, & prior, self -> idx1 . bswap );
+    if ( rc == 0 || rc == kdbReindex )
+    {
+        rc = 0;
+
+        if ( ++ self -> commit_count >= commit_freq )
+        {
+            rc = KColumnIdx1WriteHeader ( & self -> idx1,
+                data_eof, self -> idx0 . count, self -> idx2 . eof,
+                pgsize, checksum );
+            if ( rc == 0 )
+                self -> commit_count = 0;
+        }
+
+        if ( rc == 0 )
+        {
+            int64_t upper = loc -> start_id + loc -> id_range;
+
+            /* incorporate index into range */
+            if ( self -> id_first == self -> id_upper )
+            {
+                self -> id_first = loc -> start_id;
+                self -> id_upper = upper;
+            }
+            else
+            {
+                if ( self -> id_first > loc -> start_id )
+                    self -> id_first = loc -> start_id;
+                if ( self -> id_upper < upper )
+                    self -> id_upper = upper;
+            }
+
+            assert ( self -> id_first < self -> id_upper );
+
+            return idx0rc;
+        }
+
+        /* revert idx0 commit */
+        KColumnIdx0Revert ( & self -> idx0, loc, & prior );
+    }
+
+    return rc;
+}
+
+rc_t KColumnIdxCommitDone ( KColumnIdx * self )
+{
+    rc_t rc = 0;
+
+    assert ( self != NULL );
+    rc = KColumnIdx1CommitDone ( & self -> idx1 );
+    if ( rc == 0 )
+	rc = KColumnIdx0CommitDone ( & self -> idx0 );
+    if ( rc == 0 )
+	rc = KColumnIdx2CommitDone ( & self -> idx2 );
+    return rc;
+}
+
+/* KColumnIdxRecordIdx0Edges
+ *  creates tentative idx1 blocks from idx0 entries
+ *  at the block type edges as identified by KColumnIdx0
+ */
+typedef struct Idx0EdgeNode Idx0EdgeNode;
+struct Idx0EdgeNode
+{
+    DLNode n;
+    KColBlockLocInfo loc;
+};
+
+static
+void CC Idx0EdgeNodeWhack ( DLNode *n, void *ignore )
+{
+    free ( n );
+}
+
+static
+rc_t KColumnIdxRecordIdx0Edges ( const KColBlockLocInfo *info, void *edges )
+{
+    Idx0EdgeNode *node;
+
+    assert ( edges != NULL );
+    assert ( info != NULL );
+
+    assert ( info -> start_id < info -> end_id );
+    assert ( info -> start_pg < info -> end_pg );
+    assert ( info -> size != 0 );
+    assert ( info -> count != 0 );
+    assert ( info -> id_type < 4 );
+    assert ( info -> pg_type < 4 );
+
+    assert ( ( ( info -> end_id - info -> start_id ) >> 32 ) == 0 );
+
+    node = malloc ( sizeof * node );
+    if ( node == NULL )
+        return RC ( rcDB, rcColumn, rcReindexing, rcMemory, rcExhausted );
+
+    node -> loc = * info;
+
+    DLListPushTail ( edges, & node -> n );
+
+    return 0;
+}
+
+/* KColumnIdxCollapseBlocks
+ *  scans over blocks, looking for opportunities to
+ *  combine them and collapse their number
+ */
+static
+rc_t KColumnIdxCollapseBlocks ( KColumnIdx *self, DLList *edges )
+{
+    uint32_t count;
+
+    do
+    {
+        Idx0EdgeNode *prior;
+
+        /* merge count */
+        count = 0;
+
+        /* apply collapse */
+        prior = ( Idx0EdgeNode* ) DLListHead ( edges );
+        if ( prior != NULL )
+        {
+            Idx0EdgeNode *next, *cur;
+            for ( cur = ( Idx0EdgeNode* ) DLNodeNext( & prior -> n );
+                  cur != NULL; cur = next )
+            {
+                int64_t cost_left, cost_right;
+                KColBlockLocInfo buffer [ 2 ], *info;
+
+                /* grab next guy right away
+                   now we have prior, current, and next */
+                next = ( Idx0EdgeNode* ) DLNodeNext ( & cur -> n );
+
+                /* calculate a cost of merging prior and current */
+                buffer [ 0 ] = prior -> loc;
+                cost_left = KColBlockLocInfoMerge ( info = & buffer [ 0 ], & cur -> loc );
+
+                /* if there would be some advantage to the merge */
+                if ( cost_left <= 0 )
+                {
+                    /* calculate cost of merging current with next if there */
+                    if ( next != NULL )
+                    {
+                        buffer [ 1 ] = cur -> loc;
+                        cost_right = KColBlockLocInfoMerge
+                            ( info = & buffer [ 1 ], & next -> loc );
+
+                        /* if prev merge beats next,
+                           set info to previous block value */
+                        if ( cost_left <= cost_right )
+                            info = & buffer [ 0 ];
+                        else
+                        {
+                            /* otherwise shift our window
+                               and keep next block value */
+                            prior = cur;
+                            cur = next;
+                            next = ( Idx0EdgeNode* ) DLNodeNext ( & next -> n );
+                        }
+                    }
+
+                    /* merge prior with cur */
+                    prior -> loc = * info;
+                    DLListUnlink ( edges, & cur -> n );
+                    Idx0EdgeNodeWhack ( & cur -> n, NULL );
+                    ++ count;
+                    continue;
+                }
+
+                /* leave block alone */
+                prior = cur;
+            }
+        }
+    }
+    while ( count != 0 );
+
+    return 0;
+}
+
+
+/* KColumnIdxWriteNewBlock
+ *  writes each block into idx1 and idx2
+ */
+typedef struct WriteNewBlockData WriteNewBlockData;
+struct WriteNewBlockData
+{
+    uint64_t data_eof;
+    KColumnIdx *idx;
+    size_t pgsize;
+    uint32_t commit_freq;
+    int32_t checksum;
+    rc_t rc;
+    bool bswap;
+};
+
+static
+bool CC KColumnIdxWriteNewBlock ( DLNode *n, void *data )
+{
+    WriteNewBlockData *pb = data;
+    const Idx0EdgeNode *node = ( const Idx0EdgeNode* ) n;
+    KColumnIdx *self = pb -> idx;
+
+    KColBlockLoc bloc;
+    KColWIdxBlock iblk;
+
+    /* create and map a block of memory */
+    pb -> rc = KColWIdxBlockInit ( & iblk, & node -> loc );
+    if ( pb -> rc == 0 )
+    {
+        size_t to_write;
+
+        /* tell idx0 to fill in block */
+        KColumnIdx0TranscribeBlocks ( & self -> idx0,
+            node -> loc . start_id, node -> loc . end_id, & iblk );
+        if ( iblk . idx != node -> loc . count )
+            pb -> rc = RC ( rcDB, rcColumn, rcCommitting, rcNoObj, rcUnknown );
+        else
+        {
+            /* compress block */
+            pb -> rc = KColWIdxBlockCompress ( & iblk,
+                pb -> bswap, & node -> loc, & bloc, & to_write );
+            if ( pb -> rc == 0 )
+            {
+                /* write block appropriately */
+                pb -> rc = KColumnIdx2Write ( & self -> idx2,
+                    & bloc . pg, KColWIdxBlockPersistPtr ( & iblk, & bloc ), to_write );
+            }
+        }
+
+        KColWIdxBlockWhack ( & iblk );
+
+        if ( pb -> rc == 0 )
+        {
+            /* write idx1 block location information */
+            pb -> rc = KColumnIdx1Commit ( & self -> idx1, & bloc );
+            if ( pb -> rc == 0 )
+            {
+                /* update the header */
+                if ( ++ self -> commit_count >= pb -> commit_freq )
+                {
+                    pb -> rc = KColumnIdx1WriteHeader ( & self -> idx1,
+                        pb -> data_eof, self -> idx0 . count,
+                        self -> idx2 . eof + bloc . u . blk . size,
+                        pb -> pgsize, pb -> checksum );
+
+                    if ( pb -> rc == 0 )
+                        self -> commit_count = 0;
+                }
+                if ( pb -> rc == 0 )
+                {
+                    /* done writing block */
+                    KColumnIdx2Commit ( & self -> idx2, to_write );
+                    return false;
+                }
+
+                /* revert idx1 */
+                KColumnIdx1Revert ( & self -> idx1, bloc . start_id, bloc . id_range );
+            }
+        }
+    }
+
+    return true;
+}
+
+/* KColumnIdxFixIdx1
+ */
+static
+bool CC KColumnIdxFixIdx1 ( DLNode *n, void *data )
+{
+    const Idx0EdgeNode *node = ( const Idx0EdgeNode* ) n;
+    return KColumnIdx1Revert ( data, node -> loc . start_id,
+        ( uint32_t ) ( node -> loc . end_id  - node -> loc . start_id ) );
+}
+
+/* KColumnIdxReindex
+ */
+rc_t KColumnIdxReindex ( KColumnIdx *self, KMD5SumFmt *md5,
+    uint32_t commit_freq, uint64_t data_eof, size_t pgsize, int32_t checksum )
+{
+    rc_t rc;
+    DLList edges;
+
+    assert ( self != NULL );
+    assert ( pgsize > 0 );
+
+    DLListInit ( & edges );
+
+    /* map the new entries */
+    rc = KColumnIdx0DefineBlocks ( & self -> idx0,
+        KColumnIdxRecordIdx0Edges, & edges, pgsize );
+    if ( rc == 0 )
+    {
+        rc = KColumnIdxCollapseBlocks ( self, & edges );
+        if ( rc == 0 )
+        {
+            /* preserve for restoration */
+            uint64_t idx2_eof = self -> idx2 . eof;
+            size_t count = self -> idx1 . count;
+
+            WriteNewBlockData pb;
+            pb . data_eof = data_eof;
+            pb . idx = self;
+            pb . pgsize = pgsize;
+            pb . commit_freq = commit_freq;
+            pb . checksum = checksum;
+            pb . rc = 0;
+            pb . bswap = self -> idx1 . bswap;
+
+            /* write new blocks */
+            DLListDoUntil ( & edges, false, KColumnIdxWriteNewBlock, & pb );
+            if ( ( rc = pb . rc ) == 0 )
+            {
+                /* idx2 is correct,
+                   idx1 has proper count and bst,
+                   idx0 needs to whack bst and file,
+                   idx1 needs to update header */
+                rc = KColumnIdx1WriteHeader ( & self -> idx1,
+                    data_eof, 0, self -> idx2 . eof,
+                    pgsize, checksum );
+                if ( rc == 0 )
+                {
+                    self -> commit_count = 0;
+                    KColumnIdx0Truncate ( & self -> idx0 );
+                    DLListWhack ( & edges, Idx0EdgeNodeWhack, NULL );
+                    return 0;
+                }
+            }
+
+            /* restore idx2 eof */
+            self -> idx2 . eof = idx2_eof;
+
+            /* restore idx1 count and fix bst */
+            DLListDoUntil ( & edges, false, KColumnIdxFixIdx1, & self -> idx1 );
+            self -> idx1 . count = count;
+        }
+    }
+
+    DLListWhack ( & edges, Idx0EdgeNodeWhack, NULL );
+
+    return rc;
+}
diff --git a/libs/kdb/wcolidx0-priv.h b/libs/kdb/wcolidx0-priv.h
new file mode 100644
index 0000000..570628a
--- /dev/null
+++ b/libs/kdb/wcolidx0-priv.h
@@ -0,0 +1,153 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_colidx0_priv_
+#define _h_colidx0_priv_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+#ifndef _h_kfs_file_
+#include <kfs/file.h>
+#endif
+#ifndef _h_kfs_md5_
+#include <kfs/md5.h>
+#endif
+
+#ifndef _h_colfmt_priv_
+#include "colfmt-priv.h"
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KColWIdxBlock;
+struct KColBlockLocInfo;
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx0
+ *  level 0 index - event journaling
+ */
+typedef struct KColumnIdx0 KColumnIdx0;
+struct KColumnIdx0
+{
+    /* always append */
+    uint64_t eof;
+
+    /* the in-core indices */
+    BSTree bst;
+    size_t count;
+
+    /* the on-disk indices */
+    KFile *f;
+    KMD5File *fmd5;
+};
+
+
+/* Create
+ */
+rc_t KColumnIdx0Create_v1 ( KColumnIdx0 *self, KDirectory *dir,
+    struct KMD5SumFmt *md5, KCreateMode mode, bool bswap );
+rc_t KColumnIdx0Create ( KColumnIdx0 *self, KDirectory *dir,
+    uint32_t count, struct KMD5SumFmt *md5, KCreateMode mode, bool bswap );
+
+/* Open
+ */
+rc_t KColumnIdx0OpenRead_v1 ( KColumnIdx0 *self,
+    const KDirectory *dir, bool bswap );
+rc_t KColumnIdx0OpenRead ( KColumnIdx0 *self,
+    const KDirectory *dir, uint32_t count, bool bswap );
+
+/* Whack
+ */
+void KColumnIdx0Whack ( KColumnIdx0 *self );
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+bool KColumnIdx0IdRange ( const KColumnIdx0 *self,
+    int64_t *first, int64_t *upper );
+
+/* FindFirstRowId
+ */
+rc_t KColumnIdx0FindFirstRowId ( const KColumnIdx0 * self,
+    int64_t * found, int64_t start );
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdx0LocateBlob ( const KColumnIdx0 *self,
+    KColBlobLoc *loc, int64_t first, int64_t upper );
+
+/* Commit
+ *  records an index location for addition or removal
+ *  returns any prior value for rollback
+ */
+rc_t KColumnIdx0Commit ( KColumnIdx0 *self,
+    const KColBlobLoc *loc, KColBlobLoc *prior, bool bswap );
+rc_t KColumnIdx0CommitDone ( KColumnIdx0 *self );
+
+/* Revert
+ *  reverses effect of commit
+ */
+void KColumnIdx0Revert ( KColumnIdx0 *self,
+    const KColBlobLoc *loc, const KColBlobLoc *prior );
+
+/* DefineBlocks
+ *  scans existing blob locators
+ *  invokes handler with ranges of ids from similar blob entries
+ */
+rc_t KColumnIdx0DefineBlocks ( const KColumnIdx0 *self,
+    rc_t ( * handle_range ) ( struct KColBlockLocInfo const *info, void *data ),
+    void *data, size_t pgsize );
+
+/* TranscribeBlocks
+ *  writes all blocks within a range
+ */
+void KColumnIdx0TranscribeBlocks ( const KColumnIdx0 *self,
+    int64_t first, int64_t upper, struct KColWIdxBlock *iblk );
+
+/* Truncate
+ *  whacks bt contents and truncates file
+ */
+void KColumnIdx0Truncate ( KColumnIdx0 *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_colidx0_priv_ */
diff --git a/libs/kdb/wcolidx0.c b/libs/kdb/wcolidx0.c
new file mode 100644
index 0000000..9d79b7d
--- /dev/null
+++ b/libs/kdb/wcolidx0.c
@@ -0,0 +1,831 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "wcolumn-priv.h"
+#include "wcolidx0-priv.h"
+#include "widxblk-priv.h"
+#include "werror-priv.h"
+#include <kfs/file.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <byteswap.h>
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx0Node
+ *  a b-tree node
+ */
+typedef struct KColumnIdx0Node KColumnIdx0Node;
+struct KColumnIdx0Node
+{
+    BSTNode n;
+    KColBlobLoc loc;
+};
+
+/* Match
+ */
+static
+int64_t CC KColumnIdx0NodeMatch ( const void *item, const BSTNode *n )
+{
+#define a ( ( const KColBlobLoc* ) item )
+#define b ( ( const KColumnIdx0Node* ) n )
+
+    if ( a -> start_id < b -> loc . start_id )
+        return -1;
+    else if ( a -> start_id > b -> loc . start_id )
+        return 1;
+    else
+        return (int64_t) a -> id_range - (int64_t) b -> loc . id_range;
+
+#undef a
+#undef b
+}
+
+/* Find
+ */
+static
+int64_t CC KColumnIdx0NodeFind ( const void *item, const BSTNode *n )
+{
+#define a ( * ( const int64_t* ) item )
+#define b ( ( const KColumnIdx0Node* ) n )
+
+    if ( a < b -> loc . start_id )
+        return -1;
+    return a >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+
+/* Sort
+ */
+static
+int64_t CC KColumnIdx0NodeSort ( const BSTNode *item, const BSTNode *n )
+{
+#define a ( ( const KColumnIdx0Node* ) item )
+#define b ( ( const KColumnIdx0Node* ) n )
+
+    if ( ( a -> loc . start_id + a -> loc . id_range ) <= b -> loc . start_id )
+        return -1;
+    return a -> loc . start_id >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+
+/* Whack
+ */
+static
+void CC KColumnIdx0NodeWhack ( BSTNode *n, void *ignore )
+{
+    free ( n );
+}
+
+/* Next
+ */
+#define KColumnIdx0NodeNext( node ) \
+    ( const KColumnIdx0Node* ) BSTNodeNext ( & ( node ) -> n )
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx0
+ *  level 0 index - event journaling
+ */
+
+/* Init
+ */
+static
+rc_t KColumnIdx0Inflate ( KColumnIdx0 *self,
+     const KColBlobLoc *buffer, uint32_t count )
+{
+    uint32_t i;
+    KColumnIdx0Node *n;
+
+    for ( n = NULL, i = 0; i < count; ++ i )
+    {
+        KColumnIdx0Node *exist;
+
+        if ( n == NULL )
+        {
+            n = malloc ( sizeof * n );
+            if ( n == NULL )
+                return RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+        }
+
+        n -> loc = buffer [ i ];
+        if ( BSTreeInsertUnique ( & self -> bst,
+             & n -> n, ( BSTNode** ) & exist, KColumnIdx0NodeSort ) )
+        {
+            assert ( n -> loc . start_id == exist -> loc . start_id );
+            assert ( n -> loc . id_range == exist -> loc . id_range );
+
+            assert ( ! n -> loc . u . blob . remove );
+            exist -> loc . pg = n -> loc . pg;
+            exist -> loc . u . blob . size = n -> loc . u . blob . size;
+        }
+        else
+        {
+            ++ self -> count;
+            n = NULL;
+        }
+    }
+
+    free ( n );
+
+    return 0;
+}
+
+static
+void KColumnIdx0Swap ( KColBlobLoc *buffer, uint32_t count )
+{
+    uint32_t i;
+    for ( i = 0; i < count; ++ i )
+    {
+        buffer [ i ] . pg = bswap_64 ( buffer [ i ] . pg );
+        buffer [ i ] . u . gen = bswap_32 ( buffer [ i ] . u . gen );
+        buffer [ i ] . id_range = bswap_32 ( buffer [ i ] . id_range );
+        buffer [ i ] . start_id = bswap_64 ( buffer [ i ] . start_id );
+    }
+}
+
+static
+rc_t KColumnIdx0Init_v1 ( KColumnIdx0 *self, bool bswap )
+{
+    rc_t rc;
+    KColBlobLoc *buffer = malloc ( 2048 * sizeof * buffer );
+    if ( buffer == NULL )
+        rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        size_t num_read;
+
+        BSTreeInit ( & self -> bst );
+        self -> count = 0;
+
+        for ( self -> eof = 0;; self -> eof += num_read )
+        {
+            uint32_t count;
+
+            rc = KFileReadAll ( self -> f, self -> eof,
+                buffer, 2048 * sizeof * buffer, & num_read );
+            if ( rc != 0 )
+                break;
+            if ( num_read == 0 )
+                break;
+            if ( ( num_read % sizeof * buffer ) != 0 )
+            {
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcData, rcCorrupt );
+                break;
+            }
+
+            count = num_read / sizeof * buffer;
+
+            if ( bswap )
+                KColumnIdx0Swap ( buffer, count );
+
+            rc = KColumnIdx0Inflate ( self, buffer, count );
+            if ( rc != 0 )
+                break;
+        }
+
+        free ( buffer );
+    }
+    return rc;
+}
+
+static
+rc_t KColumnIdx0Init ( KColumnIdx0 *self, uint32_t total, bool bswap )
+{
+    rc_t rc;
+    KColBlobLoc *buffer = malloc ( 2048 * sizeof * buffer );
+    if ( buffer == NULL )
+        rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        size_t num_read;
+        uint32_t i, count;
+
+        BSTreeInit ( & self -> bst );
+        self -> count = 0;
+        self -> eof = 0;
+
+        for ( rc = 0, i = 0; i < total; self -> eof += num_read, i += count )
+        {
+            count = total - i;
+            if ( count > 2048 )
+                count = 2048;
+
+            rc = KFileReadAll ( self -> f, i * sizeof * buffer,
+                buffer, count * sizeof * buffer, & num_read );
+            if ( rc != 0 )
+                break;
+
+            /* detect EOF */
+            if ( num_read == 0 )
+            {
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcData, rcCorrupt );
+                break;
+            }
+
+            /* detect short read -
+               see comment in idx1. */
+            if ( ( num_read % sizeof * buffer ) != 0 )
+            {
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcTransfer, rcIncomplete );
+                break;
+            }
+
+            count = num_read / sizeof * buffer;
+
+            if ( bswap )
+                KColumnIdx0Swap ( buffer, count );
+
+            rc = KColumnIdx0Inflate ( self, buffer, count );
+            if ( rc != 0 )
+                break;
+        }
+
+        free ( buffer );
+    }
+    return rc;
+}
+
+/* Create
+ */
+rc_t KColumnIdx0Create_v1 ( KColumnIdx0 *self, KDirectory *dir,
+    struct KMD5SumFmt *md5, KCreateMode mode, bool bswap )
+{
+    rc_t rc = KColumnFileCreate ( & self -> f, & self -> fmd5,
+        dir, md5, mode, true, "idx0" );
+
+    if ( rc == 0 )
+        rc = KColumnIdx0Init_v1 ( self, bswap );
+
+    return rc;
+}
+
+rc_t KColumnIdx0Create ( KColumnIdx0 *self, KDirectory *dir,
+    uint32_t count, struct KMD5SumFmt *md5, KCreateMode mode, bool bswap )
+{
+    rc_t rc = KColumnFileCreate ( & self -> f, & self -> fmd5,
+        dir, md5, mode, true, "idx0" );
+
+    if ( rc == 0 )
+        rc = KColumnIdx0Init ( self, count, bswap );
+
+    return rc;
+}
+
+/* Open
+ */
+rc_t KColumnIdx0OpenRead_v1 ( KColumnIdx0 *self, const KDirectory *dir, bool bswap )
+{
+    rc_t rc;
+    uint64_t eof;
+
+    BSTreeInit ( & self -> bst );
+    self -> count = 0;
+
+    rc = KDirectoryVFileSize ( dir, & eof, "idx0", NULL );
+    if ( rc == 0 )
+    {
+        if ( eof != 0 )
+        {
+            rc = KDirectoryOpenFileRead ( dir,
+                ( const KFile** ) & self -> f, "idx0" );
+
+            if ( rc == 0 )
+                rc = KColumnIdx0Init_v1 ( self, bswap );
+        }
+    }
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {
+        rc = 0;
+    }
+
+    return rc;
+}
+
+rc_t KColumnIdx0OpenRead ( KColumnIdx0 *self,
+    const KDirectory *dir, uint32_t count, bool bswap )
+{
+    BSTreeInit ( & self -> bst );
+    self -> count = 0;
+
+    if ( count != 0 )
+    {
+        rc_t rc = KDirectoryOpenFileRead ( dir,
+            ( const KFile** ) & self -> f, "idx0" );
+
+        if ( rc == 0 )
+            rc = KColumnIdx0Init ( self, count, bswap );
+
+        return rc;
+    }
+
+    return 0;
+}
+
+/* Whack
+ */
+void KColumnIdx0Whack ( KColumnIdx0 *self )
+{
+    KFileRelease ( self -> f );
+    self -> f = NULL;
+    self -> fmd5 = NULL;
+    BSTreeWhack ( & self -> bst, KColumnIdx0NodeWhack, NULL );
+    BSTreeInit ( & self -> bst );
+}
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+bool KColumnIdx0IdRange ( const KColumnIdx0 *self,
+    int64_t *first, int64_t *upper )
+{
+    const KColumnIdx0Node *a, *z;
+
+    assert ( self != NULL );
+    assert ( first != NULL );
+    assert ( upper != NULL );
+
+    a = ( const KColumnIdx0Node* ) BSTreeFirst ( & self -> bst );
+    if ( a == NULL )
+        return false;
+
+    z = ( const KColumnIdx0Node* ) BSTreeLast ( & self -> bst );
+    assert ( z != NULL );
+
+    * first = a -> loc . start_id;
+    * upper = z -> loc . start_id + z -> loc . id_range;
+    assert ( * first < * upper );
+
+    return true;
+}
+
+
+/* FindFirstRowId
+ */
+typedef struct FindFirstRowIdData FindFirstRowIdData;
+struct FindFirstRowIdData
+{
+    int64_t start;
+    const KColumnIdx0Node * next;
+};
+
+static
+int64_t CC KColumnIdx0NodeFindFirstRowId ( const void * item, const BSTNode * n )
+{
+    FindFirstRowIdData * pb = ( FindFirstRowIdData * ) item;
+
+#define a ( pb -> start )
+#define b ( ( const KColumnIdx0Node * ) n )
+
+    if ( a < b -> loc . start_id )
+    {
+        if ( pb -> next == NULL )
+            pb -> next = b;
+        else if ( b -> loc . start_id < pb -> next -> loc . start_id )
+            pb -> next = b;
+        return -1;
+    }
+
+    return a >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+
+rc_t KColumnIdx0FindFirstRowId ( const KColumnIdx0 * self,
+    int64_t * found, int64_t start )
+{
+    FindFirstRowIdData pb;
+    const KColumnIdx0Node * n;
+
+    assert ( self != NULL );
+    assert ( found != NULL );
+
+    pb . start = start;
+    pb . next = NULL;
+
+    n = ( const KColumnIdx0Node* )
+        BSTreeFind ( & self -> bst, & pb, KColumnIdx0NodeFindFirstRowId );
+
+    if ( n != NULL )
+    {
+        assert ( start >= n -> loc . start_id && start < n -> loc . start_id + n -> loc . id_range );
+        * found = start;
+        return 0;
+    }
+
+    if ( pb . next != 0 )
+    {
+        assert ( pb . next -> loc . start_id > start );
+        * found = pb . next -> loc . start_id;
+        return 0;
+    }
+
+    return SILENT_RC ( rcDB, rcColumn, rcSelecting, rcRow, rcNotFound );
+}
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdx0LocateBlob ( const KColumnIdx0 *self,
+    KColBlobLoc *loc, int64_t first, int64_t upper )
+{
+    const KColumnIdx0Node *n;
+
+    assert ( self != NULL );
+    assert ( loc != NULL );
+    assert ( first < upper );
+
+    n = ( const KColumnIdx0Node* )
+        BSTreeFind ( & self -> bst, & first, KColumnIdx0NodeFind );
+
+    if ( n == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcBlob, rcNotFound );
+
+    assert ( first >= n -> loc . start_id );
+    assert ( first < ( n -> loc . start_id + n -> loc . id_range ) );
+
+    if ( upper > ( n -> loc . start_id + n -> loc . id_range ) )
+        return RC ( rcDB, rcIndex, rcSelecting, rcRange, rcInvalid );
+
+    * loc = n -> loc;
+    assert ( ! loc -> u . blob . remove );
+    return 0;
+}
+
+/* Commit
+ *  records an index location for addition or removal
+ *  returns any prior value for rollback
+ */
+rc_t KColumnIdx0Commit ( KColumnIdx0 *self,
+    const KColBlobLoc *loc, KColBlobLoc *prior, bool bswap )
+{
+    rc_t rc = 0;
+    size_t num_writ;
+    KColumnIdx0Node *n;
+
+    assert ( self != NULL );
+    assert ( loc != NULL );
+    assert ( prior != NULL );
+
+    /* this assert tests two things:
+       1) that loc -> id_range != 0
+       2) that loc -> start_id + loc -> id_range does not wrap around */
+    assert ( ( loc -> start_id + loc -> id_range ) > loc -> start_id );
+
+    /* if the index already exists, it's being overwritten */
+    n = ( KColumnIdx0Node* )
+        BSTreeFind ( & self -> bst, loc, KColumnIdx0NodeMatch );
+    if ( n != NULL )
+    {
+        /* just hold onto the prior value */
+        * prior = n -> loc;
+        assert ( n -> loc . u . blob . size != 0 );
+        assert ( ! n -> loc . u . blob . remove );
+        assert ( n -> loc . start_id == loc -> start_id );
+        assert ( n -> loc . id_range == loc -> id_range );
+    }
+    else
+    {
+        /* no prior value */
+        memset ( prior, 0, sizeof * prior );
+
+        /* record an insert/overwrite */
+        if ( ! loc -> u . blob . remove )
+        {
+            n = malloc ( sizeof * n );
+            if ( n == NULL )
+                return RC ( rcDB, rcBlob, rcCommitting, rcMemory, rcExhausted );
+
+            n -> loc . u . blob . remove = 0;
+            n -> loc . start_id = loc -> start_id;
+            n -> loc . id_range = loc -> id_range;
+        }
+    }
+
+    /* journal index to idx0 */
+    if ( ! bswap )
+        rc = KFileWrite ( self -> f, self -> eof, loc, sizeof * loc, & num_writ );
+    else
+    {
+        KColBlobLoc loc_copy;
+        loc_copy . pg = bswap_64 ( loc -> pg );
+        loc_copy . u . gen = bswap_32 ( loc -> u . gen );
+        loc_copy . id_range = bswap_32 ( loc -> id_range );
+        loc_copy . start_id = bswap_64 ( loc -> start_id );
+
+        rc = KFileWrite ( self -> f, self -> eof,
+            & loc_copy, sizeof loc_copy, & num_writ );
+    }
+    if ( rc == 0 )
+    {
+        /* detect complete write */
+        if ( num_writ == sizeof * loc )
+        {
+            self -> eof += sizeof * loc;
+
+            /* detect insert/overwrite */
+            if ( n != NULL )
+            {
+                /* if deleting, "n" is prior value */
+                if ( loc -> u . blob . remove )
+                {
+                    /* perform a delete */
+                    assert ( self -> count > 0 );
+                    BSTreeUnlink ( & self -> bst, & n -> n );
+                    -- self -> count;
+                    free ( n );
+                }
+                else
+                {
+                    /* insert new or overwrite old */
+                    n -> loc . pg = loc -> pg;
+                    n -> loc . u . blob . size = loc -> u . blob . size;
+                    if ( prior -> u . blob . size == 0 )
+                    {
+                        /* complete insertion */
+                        BSTreeInsert ( & self -> bst, & n -> n, KColumnIdx0NodeSort );
+                        if ( ++ self -> count >= 64 * 1024 )
+                            return kdbReindex;
+                    }
+                }
+            }
+
+            /* done */
+            return 0;
+        }
+
+        /* got here due to incomplete write to idx0 */
+        rc = RC ( rcDB, rcBlob, rcCommitting, rcTransfer, rcIncomplete );
+    }
+
+    /* free allocated insertion block */
+    if ( prior -> u . blob . size == 0 )
+        free ( n );
+
+    return rc;
+}
+
+rc_t KColumnIdx0CommitDone ( KColumnIdx0 *self )
+{
+    assert ( self != NULL );
+
+    if ( self -> fmd5 == NULL )
+        return 0;
+
+    assert ( self -> f == KMD5FileToKFile ( self -> fmd5 ) );
+    return KMD5FileCommit ( self -> fmd5 );
+}
+
+/* Revert
+ *  reverses effect of commit
+ */
+void KColumnIdx0Revert ( KColumnIdx0 *self,
+    const KColBlobLoc *loc, const KColBlobLoc *prior )
+{
+    rc_t rc = 0;
+    KColumnIdx0Node *n;
+
+    assert ( self != NULL );
+    assert ( loc != NULL );
+    assert ( prior != NULL );
+
+    /* exit MD5 transaction */
+    if ( self -> fmd5 != NULL )
+        KMD5FileRevert ( self -> fmd5 );
+
+    /* remove the blip from idx0 */
+    assert ( self -> eof >= sizeof * loc );
+    rc = KFileSetSize ( self -> f, self -> eof - sizeof * loc );
+    if ( rc != 0 )
+        exit ( 99 );
+    self -> eof -= sizeof * loc;
+
+    /* next, repair the binary search tree */
+    if ( prior -> u . blob . size != 0 )
+    {
+        if ( ! loc -> u . blob . remove )
+        {
+            /* revert an update */
+            n = ( KColumnIdx0Node* )
+                BSTreeFind ( & self -> bst, prior, KColumnIdx0NodeMatch );
+            if ( n == NULL )
+                rc = RC ( rcDB, rcIndex, rcReverting, rcNoObj, rcUnknown );
+        }
+        else
+        {
+            /* revert a delete */
+            n = malloc ( sizeof * n );
+            if ( n == NULL )
+                rc = RC ( rcDB, rcIndex, rcReverting, rcMemory, rcExhausted );
+            else
+            {
+                n -> loc . u . blob . remove = 0;
+                n -> loc . start_id = prior -> start_id;
+                n -> loc . id_range = prior -> id_range;
+                BSTreeInsert ( & self -> bst, & n -> n, KColumnIdx0NodeSort );
+                ++ self -> count;
+            }
+        }
+
+        if ( n == NULL )
+            exit ( 98 );
+
+        /* put back location information */
+        n -> loc . pg = prior -> pg;
+        n -> loc . u . blob . size = prior -> u . blob . size;
+    }
+    else if ( ! loc -> u . blob . remove )
+    {
+        /* revert an insert */
+        n = ( KColumnIdx0Node* )
+            BSTreeFind ( & self -> bst, loc, KColumnIdx0NodeMatch );
+        if ( n == NULL )
+            exit ( 97 );
+
+        assert ( self -> count > 0 );
+        BSTreeUnlink ( & self -> bst, & n -> n );
+        -- self -> count;
+        free ( n );
+    }
+}
+
+/* DefineBlocks
+ *  scans existing blob locators
+ *  invokes handler with ranges of ids from similar blob entries
+ */
+rc_t KColumnIdx0DefineBlocks ( const KColumnIdx0 *self,
+    rc_t ( * define_block ) ( struct KColBlockLocInfo const *info, void *data ),
+    void *data, size_t pgsize )
+{
+    rc_t rc;
+    const KColumnIdx0Node *start;
+
+    assert ( self != NULL );
+    assert ( pgsize > 0 );
+    assert ( define_block != NULL );
+
+    start = ( const KColumnIdx0Node* ) BSTreeFirst ( & self -> bst );
+    for ( rc = 0; start != NULL; )
+    {
+        KColBlockLocInfo info;
+
+        uint32_t count;
+        uint32_t id_type, pg_type;
+        const KColumnIdx0Node *next, *end;
+
+        id_type = pg_type = btypePredictable;
+
+        /* build a block from start to prior */
+        for ( next = KColumnIdx0NodeNext ( end = start ), count = 1;
+              next != NULL; next = KColumnIdx0NodeNext ( end = next ), ++ count )
+        {
+            size_t pgbytes;
+            int64_t end_id;
+            int id_next, pg_next;
+
+            size_t hdr_size_div4;
+            size_t entry_size_div4;
+
+            /* look at transition from end to next */
+            id_next = pg_next = btypePredictable;
+
+            if ( end -> loc . id_range != next -> loc . id_range )
+                id_next = btypeMagnitude;
+            if ( end -> loc . u . blob . size != next -> loc . u . blob . size )
+                pg_next = btypeMagnitude;
+
+            pgbytes = ( ( end -> loc . u . blob . size + pgsize - 1 ) / pgsize ) * pgsize;
+            if ( end -> loc . start_id + end -> loc . id_range != next -> loc . start_id )
+                id_next -= btypeMagnitude;
+            if ( end -> loc . pg + pgbytes != next -> loc . pg )
+                pg_next -= btypeMagnitude;
+
+            /* check for combine-ability */
+            if ( count != 1 && ( id_type != id_next || pg_type != pg_next ) )
+                break;
+
+            /* can be stopped by excessive id range */
+            end_id = next -> loc . start_id + next -> loc . id_range;
+            if ( ( ( end_id - start -> loc . start_id ) >> 32 ) != 0 )
+                break;
+
+            /* only produces change when count == 1
+               in which case we're confident that
+               block size will not be an issue */
+            id_type &= id_next;
+            pg_type &= pg_next;
+
+            /* calculate block header size based upon types:
+               id = { 0:0, 1:4, 2:8, 3:0  }
+               pg = { 0:0, 1:4, 2:8, 3:12 } */
+            hdr_size_div4 = pg_type;
+            if ( id_type != btypePredictable )
+                hdr_size_div4 += id_type;
+
+            /* calculate block entry size as inverse of types:
+               { 0:12, 1:8, 2:4, 3:0 } */
+            entry_size_div4 = ( id_type ^ 3 ) + ( pg_type ^ 3 );
+
+            /* block size ( div 4 ) cannot exceed 64 ( div 4 ) */
+            if ( ( hdr_size_div4 + entry_size_div4 * ( count + 1 ) ) > ( 0x10000 / 4 ) )
+                break;
+        }
+
+        /* we're at the end of a block */
+        info . start_id = start -> loc . start_id;
+        info . start_pg = start -> loc . pg;
+        info . end_id = end -> loc . start_id + end -> loc . id_range;
+        info . end_pg = end -> loc . pg + end -> loc . u . blob . size;
+        info . size = end -> loc . u . blob . size;
+        info . count = count;
+        info . id_type = ( uint16_t ) id_type;
+        info . pg_type = ( uint16_t ) pg_type;
+
+        /* keep page end on even page boundary */
+        if ( pgsize != 1 )
+            info . end_pg = ( ( info . end_pg + pgsize - 1 ) / pgsize ) * pgsize;
+
+        /* define a block */
+        rc = ( * define_block ) ( & info, data );
+        if ( rc != 0 )
+            break;
+
+        /* the next block becomes our start */
+        start = next;
+    }
+    
+    return rc;
+}
+
+/* TranscribeBlocks
+ *  writes all blocks within a range
+ */
+void KColumnIdx0TranscribeBlocks ( const KColumnIdx0 *self,
+    int64_t first, int64_t upper, struct KColWIdxBlock *iblk )
+{
+    const KColumnIdx0Node *n;
+
+    assert ( self != NULL );
+    assert ( first < upper );
+    assert ( iblk != NULL );
+
+    n = ( const KColumnIdx0Node* )
+        BSTreeFind ( & self -> bst, & first, KColumnIdx0NodeFind );
+    assert ( n != NULL );
+    assert ( n -> loc . start_id == first );
+
+    while ( n != NULL && n -> loc . start_id < upper )
+    {
+        assert ( ( n -> loc . start_id + n -> loc . id_range ) <= upper );
+
+        KColWIdxBlockSetEntry ( iblk,
+            n -> loc . start_id, n -> loc . id_range,
+            n -> loc . pg, n -> loc . u . blob . size );
+
+        n = KColumnIdx0NodeNext ( n );
+    }
+}
+
+/* Truncate
+ *  whacks bst contents and truncates file
+ */
+void KColumnIdx0Truncate ( KColumnIdx0 *self )
+{
+    assert ( self != NULL );
+    KFileSetSize ( self -> f, self -> eof = 0 );
+    BSTreeWhack ( & self -> bst, KColumnIdx0NodeWhack, NULL );
+    self -> count = 0;
+}
diff --git a/libs/kdb/wcolidx1-priv.h b/libs/kdb/wcolidx1-priv.h
new file mode 100644
index 0000000..c90509f
--- /dev/null
+++ b/libs/kdb/wcolidx1-priv.h
@@ -0,0 +1,152 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_colidx1_priv_
+#define _h_colidx1_priv_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#include <kfs/md5.h>
+
+#ifndef _h_colfmt_priv_
+#include "colfmt-priv.h"
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KColIdxBlock;
+struct KColBlockLocInfo;
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx1
+ *  level 1 index
+ */
+typedef struct KColumnIdx1 KColumnIdx1;
+struct KColumnIdx1
+{
+    /* tree of level-2 block locators */
+    BSTree bst;
+    struct KFile *f;
+    struct KFile *fidx;
+    struct KMD5File *fmd5;
+    struct KMD5File *fidxmd5;
+
+    uint32_t count;
+    uint32_t vers;
+    /* might have to switch to bit flags if more needed */
+    bool bswap;
+    bool use_md5;
+#define CONVERT_ON_SAVE_NONE	0
+#define CONVERT_ON_SAVE_V1	1
+    uint8_t convert;
+    uint8_t align [ sizeof ( size_t ) - 3 ];
+};
+
+/* Create
+ */
+rc_t KColumnIdx1Create ( KColumnIdx1 *self,
+    KDirectory *dir, KMD5SumFmt *md5, KCreateMode mode,
+    uint64_t *data_eof, uint32_t *idx0_count, uint64_t *idx2_eof,
+    size_t pgsize, int32_t checksum );
+
+/* Open
+ */
+rc_t KColumnIdx1OpenRead ( KColumnIdx1 *self, const KDirectory *dir,
+    uint64_t *data_eof, uint32_t *idx0_count, uint64_t *idx2_eof,
+    size_t *pgsize, int32_t *checksum );
+rc_t KColumnIdx1OpenUpdate ( KColumnIdx1 *self, KDirectory *dir,
+    KMD5SumFmt *md5, uint64_t *data_eof, uint32_t *idx0_count,
+    uint64_t *idx2_eof, size_t *pgsize, int32_t *checksum );
+
+/* Whack
+ */
+rc_t KColumnIdx1Whack ( KColumnIdx1 *self );
+
+/* Version
+ */
+rc_t KColumnIdx1Version ( const KColumnIdx1 *self, uint32_t *version );
+#define KColumnIdx1Version( self, version ) \
+    ( * ( version ) = ( uint32_t ) ( self ) -> vers, 0 )
+
+/* ByteOrder
+ */
+rc_t KColumnIdx1ByteOrder ( const KColumnIdx1 *self, bool *reversed );
+#define KColumnIdx1ByteOrder( self, reversed ) \
+    ( * ( reversed ) = ( self ) -> bswap, 0 )
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+bool KColumnIdx1IdRange ( const KColumnIdx1 *self,
+    int64_t *first, int64_t *upper );
+
+/* LocateFirstRowIdBlob
+ */
+rc_t KColumnIdx1LocateFirstRowIdBlob ( const KColumnIdx1 * self,
+    KColBlockLoc * bloc, int64_t start );
+
+/* LocateBlock
+ *  locates an idx2 block by range
+ */
+rc_t KColumnIdx1LocateBlock ( const KColumnIdx1 *self,
+    KColBlockLoc *bloc, int64_t first, int64_t upper );
+
+/* WriteHeader
+ */
+rc_t KColumnIdx1WriteHeader ( KColumnIdx1 *self,
+    uint64_t data_eof, uint32_t idx0_count, uint64_t idx2_eof,
+    size_t pgsize, int32_t checksum );
+
+/* Commit
+ *  records a block location
+ */
+rc_t KColumnIdx1Commit ( KColumnIdx1 *self, const KColBlockLoc *bloc );
+rc_t KColumnIdx1CommitDone ( KColumnIdx1 *self );
+
+/* Revert
+ *  reverses effect of commit
+ */
+bool KColumnIdx1Revert ( KColumnIdx1 *self, int64_t start_id, uint32_t id_range );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_colidx1_priv_ */
diff --git a/libs/kdb/wcolidx1.c b/libs/kdb/wcolidx1.c
new file mode 100644
index 0000000..5431249
--- /dev/null
+++ b/libs/kdb/wcolidx1.c
@@ -0,0 +1,921 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "wcolumn-priv.h"
+#include "wcolidx1-priv.h"
+#include "werror-priv.h"
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <byteswap.h>
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx1Node
+ *  a binary search tree node
+ */
+typedef struct KColumnIdx1Node KColumnIdx1Node;
+struct KColumnIdx1Node
+{
+    BSTNode n;
+    KColBlockLoc loc;
+};
+
+/* KColumnIdx1NodeFind
+ */
+static
+int64_t CC KColumnIdx1NodeFind ( const void *item, const BSTNode *n )
+{
+#define a ( * ( const int64_t* ) item )
+#define b ( ( const KColumnIdx1Node* ) n )
+
+    if ( a < b -> loc . start_id )
+        return -1;
+    return a >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+
+/* KColumnIdx1NodeSort
+ */
+static
+int64_t CC KColumnIdx1NodeSort ( const BSTNode *item, const BSTNode *n )
+{
+#define a ( ( const KColumnIdx1Node* ) item )
+#define b ( ( const KColumnIdx1Node* ) n )
+
+    if ( ( a -> loc . start_id + a -> loc . id_range ) <= b -> loc . start_id )
+        return -1;
+    return a -> loc . start_id >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+
+/* KColumnIdx1NodeWhack
+ */
+static
+void CC KColumnIdx1NodeWhack ( BSTNode *n, void *ignore )
+{
+    free ( n );
+}
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx1
+ *  level 1 index
+ */
+
+/* Init
+ */
+static
+rc_t KColumnIdx1Inflate ( KColumnIdx1 *self,
+    const KColBlockLoc *buffer, uint32_t count )
+{
+    uint32_t i;
+    for ( i = 0; i < count; ++ i )
+    {
+        KColumnIdx1Node *exist, *n = malloc ( sizeof * n );
+        if ( n == NULL )
+            return RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+
+        n -> loc = buffer [ i ];
+        if ( BSTreeInsertUnique ( & self -> bst,
+             & n -> n, ( BSTNode** ) & exist, KColumnIdx1NodeSort ) )
+        {
+            free ( n );
+            return RC ( rcDB, rcIndex, rcConstructing, rcData, rcCorrupt );
+        }
+
+        ++ self -> count;
+    }
+
+    return 0;
+}
+
+static
+void KColumnIdx1Swap ( KColBlockLoc *buffer, uint32_t count )
+{
+    uint32_t i;
+    for ( i = 0; i < count; ++ i )
+    {
+        buffer [ i ] . pg = bswap_64 ( buffer [ i ] . pg );
+        buffer [ i ] . u . gen = bswap_32 ( buffer [ i ] . u . gen );
+        buffer [ i ] . id_range = bswap_32 ( buffer [ i ] . id_range );
+        buffer [ i ] . start_id = bswap_64 ( buffer [ i ] . start_id );
+    }
+}
+
+static
+rc_t KColumnIdx1Init ( KColumnIdx1 *self, uint32_t off, uint32_t count )
+{
+    rc_t rc;
+    KColBlockLoc *buffer = malloc ( 2048 * sizeof * buffer );
+    if ( buffer == NULL )
+        rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        size_t num_read;
+        uint32_t i, cnt;
+        for ( rc = 0, i = 0; i < count; off += num_read, i += cnt )
+        {
+            /* maximum number of blocks available
+               that will fit into buffer */
+            cnt = count - i;
+            if ( cnt > 2048 )
+                cnt = 2048;
+
+            /* read into buffer an even number of blocks */
+            rc = KFileReadAll ( self -> f, off,
+                buffer, cnt * sizeof * buffer, & num_read );
+            if ( rc != 0 )
+                break;
+
+            /* detect EOF */
+            if ( num_read == 0 )
+                break;
+
+            /* detect corrupt short read
+               it's not clear how this is intended to work...
+               we either get ALL count blocks, or the file
+               is corrupt. a short read is possible, but
+               is not an error until we hit EOF... */
+            if ( ( num_read % sizeof * buffer ) != 0 )
+            {
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcData, rcCorrupt );
+                break;
+            }
+
+            /* byte-swap entire buffer */
+            if ( self -> bswap )
+                KColumnIdx1Swap ( buffer, cnt );
+
+            /* create master index blocks */
+            rc = KColumnIdx1Inflate ( self, buffer, cnt );
+            if ( rc != 0 )
+                break;
+        }
+
+        free ( buffer );
+    }
+    return rc;
+}
+
+/* Create
+ */
+rc_t KColumnIdx1Create ( KColumnIdx1 *self, KDirectory *dir,
+    struct KMD5SumFmt *md5, KCreateMode mode,
+	uint64_t *data_eof, uint32_t *idx0_count, uint64_t *idx2_eof,
+	size_t pgsize, int32_t checksum )
+{
+    rc_t rc;
+
+    if ( ( mode & kcmValueMask ) == kcmOpen )
+    {
+        size_t f_pgsize;
+        int32_t f_checksum;
+	
+        /* try to open update first */
+        rc = KColumnIdx1OpenUpdate ( self, dir, md5, data_eof, 
+            idx0_count, idx2_eof, &f_pgsize, &f_checksum);
+
+        if ( rc == 0 )
+        {
+            if ( pgsize != f_pgsize || checksum != f_checksum )
+            {
+                KFileRelease ( self -> f );
+                KFileRelease ( self -> fidx );
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcParam, rcIncorrect );
+            }
+            return rc;
+        }
+        if ( GetRCState ( rc ) != rcNotFound )
+            return rc;
+
+        /* if it failed on not found try to create */
+    }
+
+    BSTreeInit ( & self -> bst );
+    self -> count = 0;
+    self -> vers = 0;
+    self -> bswap = false;
+
+    rc = KColumnFileCreate ( & self -> f, & self -> fmd5, dir, md5, mode, true, "idx1" );
+    if ( rc == 0 )
+    {
+#if KCOL_CURRENT_VERSION != 1
+        rc = KColumnFileCreate ( & self -> fidx, & self -> fidxmd5, dir, md5, mode, false, "idx" );
+        if ( rc == 0 )
+        {
+#endif
+            KColumnHdr hdr;
+            size_t num_bytes;
+
+            memset ( & hdr, 0, sizeof hdr );
+            hdr . dad . endian = eByteOrderTag;
+            hdr . dad . version = KCOL_CURRENT_VERSION;
+#if KCOL_CURRENT_VERSION == 1
+            hdr . u . v1 . page_size = ( uint32_t ) pgsize;
+            hdr . u . v1 . checksum = ( uint8_t ) checksum;
+#elif KCOL_CURRENT_VERSION == 2
+            hdr . u . v2 . page_size = ( uint32_t ) pgsize;
+            hdr . u . v2 . checksum = ( uint8_t ) checksum;
+#elif KCOL_CURRENT_VERSION == 3
+            hdr . u . v3 . page_size = ( uint32_t ) pgsize;
+            hdr . u . v3 . checksum = ( uint8_t ) checksum;
+#else
+#error "lack code for current version"
+#endif
+            * data_eof = 0;
+            * idx0_count = 0;
+            * idx2_eof = 0;
+#if KCOL_CURRENT_VERSION == 1
+            rc = KFileWrite ( self -> f, 0, & hdr,
+              KColumnHdrOffset ( hdr, vCUR ),  & num_bytes );
+#else
+            rc = KFileWrite ( self -> f, 0, & hdr, sizeof hdr . dad, & num_bytes );
+            if ( rc == 0 )
+            {
+                if ( num_bytes != sizeof hdr . dad )
+                    rc = RC ( rcDB, rcIndex, rcConstructing, rcTransfer, rcIncomplete );
+                else
+                {
+                    rc = KFileWrite ( self -> fidx, 0, & hdr,
+                        KColumnHdrOffset ( hdr, vCUR ),  & num_bytes );
+#endif
+                    if ( rc == 0 )
+                    {
+                        if ( num_bytes == KColumnHdrOffset ( hdr, vCUR ) )
+                        {
+                            self -> vers = KCOL_CURRENT_VERSION;
+                            /* Here is the exit with two new files */
+                            return 0;
+                        }
+                    }
+#if KCOL_CURRENT_VERSION != 1
+                }
+
+                KFileRelease ( self -> fidx );
+            }
+#endif
+
+            KFileRelease ( self -> f );
+        }
+    }
+
+    return rc;
+}
+
+/* Open
+ */
+rc_t KColumnIdx1OpenRead ( KColumnIdx1 *self, const KDirectory *dir,
+    uint64_t *data_eof, uint32_t *idx0_count, uint64_t *idx2_eof,
+    size_t *pgsize, int32_t *checksum )
+{
+    rc_t rc;
+
+    BSTreeInit ( & self -> bst );
+    self -> count = 0;
+    self -> vers = 0;
+    self -> bswap = false;
+
+    rc = KDirectoryOpenFileRead ( dir,
+        ( const KFile** ) & self -> f, "idx1" );
+    if ( rc == 0 )
+    {
+        KColumnHdr hdr;
+        size_t num_bytes;
+        rc = KFileReadAll ( self -> f, 0, & hdr, sizeof hdr, & num_bytes );
+        if ( rc == 0 )
+        {
+            if ( num_bytes == 0 )
+                rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcEmpty );
+            else if ( num_bytes < KColumnHdrMinSize ( hdr ) )
+                rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+            else
+            {
+                rc = KDBHdrValidate ( & hdr . dad,
+                    num_bytes, 1, KCOL_CURRENT_VERSION );
+                if ( GetRCState ( rc ) == rcIncorrect && GetRCObject ( rc ) == rcByteOrder )
+                {
+                    self -> bswap = true;
+                    hdr . dad . endian = bswap_32 ( hdr . dad . endian );
+                    hdr . dad . version = bswap_32 ( hdr . dad . version );
+                    rc = KDBHdrValidate ( & hdr . dad, num_bytes, 1, KCOL_CURRENT_VERSION );
+                }
+                if ( rc == 0 )
+                {
+                    uint32_t off, count;
+
+                    switch ( hdr . dad . version )
+                    {
+                    case 1:
+                        if ( num_bytes < KColumnHdrOffset ( hdr, v1 ) )
+                            rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+                        else
+                        {
+                            if ( self -> bswap )
+                            {
+                                hdr . u . v1 . data_eof = bswap_64 ( hdr . u . v1 . data_eof );
+                                hdr . u . v1 . idx2_eof = bswap_64 ( hdr . u . v1 . idx2_eof );
+                                hdr . u . v1 . num_blocks = bswap_32 ( hdr . u . v1 . num_blocks );
+                                hdr . u . v1 . page_size = bswap_32 ( hdr . u . v1 . page_size );
+                            }
+
+                            * data_eof = hdr . u . v1 . data_eof;
+                            * idx2_eof = hdr . u . v1 . idx2_eof;
+                            * pgsize = hdr . u . v1 . page_size;
+                            * checksum = hdr . u . v1 . checksum;
+                            count = hdr . u . v1 . num_blocks;
+                            off = KColumnHdrOffset ( hdr, v1 );
+
+                            * idx0_count = 0;
+                        }
+                        break;
+
+                    default:
+                        rc = KDirectoryOpenFileRead ( dir, ( const KFile** ) & self -> fidx, "idx" );
+                        if ( rc == 0 )
+                        {
+                            off = sizeof hdr . dad;
+                            rc = KFileReadAll ( self -> fidx, 0, & hdr, sizeof hdr, & num_bytes );
+                            if ( rc == 0 )
+                            {
+                                if ( num_bytes < KColumnHdrOffset ( hdr, v2 ) )
+                                    rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+                                else
+                                {
+                                    rc = KDBHdrValidate ( & hdr . dad,
+                                        num_bytes, 2, KCOL_CURRENT_VERSION );
+                                    if ( GetRCState ( rc ) == rcIncorrect && GetRCObject ( rc ) == rcByteOrder )
+                                    {
+                                        if ( ! self->bswap ) /* catch mis-matched endianess */
+                                            rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+                                        else
+                                        {
+                                            hdr . dad . endian = bswap_32 ( hdr . dad . endian );
+                                            hdr . dad . version = bswap_32 ( hdr . dad . version );
+                                            rc = KDBHdrValidate ( & hdr . dad, num_bytes, 1, KCOL_CURRENT_VERSION );
+                                        }
+                                    }
+                                    else if ( self -> bswap ) /* catch mis-matched endianess */
+                                        rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+
+                                    if ( rc == 0 ) switch ( hdr . dad . version )
+                                    {
+                                    case 2:
+                                        if ( self -> bswap )
+                                        {
+                                            hdr. u . v2 . data_eof = bswap_64 ( hdr. u . v2 . data_eof );
+                                            hdr. u . v2 . idx2_eof = bswap_64 ( hdr. u . v2 . idx2_eof );
+                                            hdr. u . v2 . num_blocks = bswap_32 ( hdr. u . v2 . num_blocks );
+                                            hdr. u . v2 . page_size = bswap_32 ( hdr. u . v2 . page_size );
+                                        }
+
+                                        * data_eof = hdr . u . v2 . data_eof;
+                                        * idx2_eof = hdr . u . v2 . idx2_eof;
+                                        * pgsize = hdr . u . v2 . page_size;
+                                        * checksum = hdr . u . v2 . checksum;
+                                        count = hdr . u . v2 . num_blocks;
+                                        * idx0_count = 0;
+                                        break;
+
+                                    case 3:
+                                        if ( self -> bswap )
+                                        {
+                                            hdr. u . v3 . data_eof = bswap_64 ( hdr. u . v3 . data_eof );
+                                            hdr. u . v3 . idx2_eof = bswap_64 ( hdr. u . v3 . idx2_eof );
+                                            hdr. u . v3 . idx0_count = bswap_32 ( hdr. u . v3 . idx0_count );
+                                            hdr. u . v3 . num_blocks = bswap_32 ( hdr. u . v3 . num_blocks );
+                                            hdr. u . v3 . page_size = bswap_32 ( hdr. u . v3 . page_size );
+                                        }
+
+                                        * data_eof = hdr . u . v3 . data_eof;
+                                        * idx2_eof = hdr . u . v3 . idx2_eof;
+                                        * idx0_count = hdr . u . v3 . idx0_count;
+                                        * pgsize = hdr . u . v3 . page_size;
+                                        * checksum = hdr . u . v3 . checksum;
+                                        count = hdr . u . v3 . num_blocks;
+                                        break;
+
+                                    default:
+                                        rc = RC ( rcDB, rcColumn, rcOpening, rcColumn, rcBadVersion );
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    if ( rc == 0 )
+                    {
+                        self -> vers = hdr . dad . version;
+                        rc = KColumnIdx1Init ( self, off, count );
+                        if ( rc == 0 )
+                            return rc;
+                    }
+
+                    KFileRelease ( self -> fidx );
+                    self -> fidx = NULL;
+                }
+            }
+        }
+
+        KFileRelease ( self -> f );
+        self -> f = NULL;
+    }
+
+    return rc;
+}
+
+rc_t KColumnIdx1OpenUpdate ( KColumnIdx1 *self, KDirectory *dir,
+    struct KMD5SumFmt *md5, uint64_t *data_eof, uint32_t *idx0_count,
+    uint64_t *idx2_eof, size_t *pgsize, int32_t *checksum )
+{
+    rc_t rc;
+
+    BSTreeInit ( & self -> bst );
+    self -> count = 0;
+    self -> vers = 0;
+    self -> bswap = false;
+
+    rc = KColumnFileOpenUpdate ( & self -> f, & self -> fmd5, dir, md5, true, "idx1" );
+#if 0
+    /* why open a transaction? */
+    if ( rc == 0 && md5 != NULL )
+        rc = KMD5FileBeginTransaction ( self -> fmd5 );
+#endif
+    if ( rc == 0 )
+    {
+        KColumnHdr hdr;
+        size_t num_bytes;
+        rc = KFileReadAll ( self -> f, 0, & hdr, sizeof hdr, & num_bytes );
+        if ( rc == 0 )
+        {
+            /* if file was there, open will pass but if empty should be
+               treated as if it were not there at all */
+            if ( num_bytes == 0 )
+                rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcNotFound );
+            else if ( num_bytes < KColumnHdrMinSize ( hdr ) )
+                rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+            else
+            {
+                /* allow open for update only on compatible architecture and version */
+                rc = KDBHdrValidate ( & hdr . dad,
+                    num_bytes, 1, KCOL_CURRENT_VERSION );
+                if ( rc == 0 )
+                {
+                    uint32_t off, count;
+
+                    switch ( hdr . dad . version )
+                    {
+                    case 1:
+                        /* ensure hdr is minimally v1 size */
+                        if ( num_bytes < KColumnHdrOffset ( hdr, v1 ) )
+                            rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+                        else
+                        {
+#if KCOL_CURRENT_VERSION != 1
+                            /* convert to current version */
+                            rc = KColumnFileCreate ( & self -> fidx, & self -> fidxmd5,
+                                dir, md5, kcmOpen, false, "idx" );
+                            if ( rc == 0 )
+                            {
+#endif
+                                * idx0_count = 0;
+                                * data_eof = hdr . u . v1 . data_eof;
+                                * idx2_eof = hdr . u . v1 . idx2_eof;
+                                * pgsize = hdr . u . v1 . page_size;
+                                * checksum = hdr . u . v1 . checksum;
+                                count = hdr . u . v1 . num_blocks;
+                                off = KColumnHdrOffset ( hdr, v1 );
+#if KCOL_CURRENT_VERSION == 1
+                                self -> convert = CONVERT_ON_SAVE_NONE;
+#else
+                                self -> convert = CONVERT_ON_SAVE_V1;
+                            }
+#endif
+                        }
+                        break;
+
+                    default:
+                        /* hdr should be incomplete - instead open "idx" */
+                        rc = KColumnFileOpenUpdate ( & self -> fidx, & self -> fidxmd5, dir, md5, false, "idx" );
+                        if ( rc == 0 )
+                        {
+                            self -> convert = CONVERT_ON_SAVE_NONE;
+                            off = sizeof hdr . dad; /* where to read in idx1 */
+                            rc = KFileReadAll ( self -> fidx, 0, & hdr, sizeof hdr, & num_bytes );
+                            if ( rc == 0 )
+                            {
+                                if ( num_bytes < KColumnHdrOffset ( hdr, v2 ) )
+                                    rc = RC ( rcDB, rcColumn, rcOpening, rcIndex, rcCorrupt );
+                                else
+                                {
+                                    rc = KDBHdrValidate ( & hdr . dad,
+                                        num_bytes, 2, KCOL_CURRENT_VERSION );
+                                    if ( rc == 0 ) switch ( hdr . dad . version )
+                                    {
+                                    case 2:
+                                        * data_eof = hdr . u . v2 . data_eof;
+                                        * idx2_eof = hdr . u . v2 . idx2_eof;
+                                        * pgsize = hdr . u . v2 . page_size;
+                                        * checksum = hdr . u . v2 . checksum;
+                                        count = hdr . u . v2 . num_blocks;
+                                        * idx0_count = 0;
+                                        break; /* skip to initialize and return */
+
+                                    case 3:
+                                        * data_eof = hdr . u . v3 . data_eof;
+                                        * idx2_eof = hdr . u . v3 . idx2_eof;
+                                        * idx0_count = hdr . u . v3 . idx0_count;
+                                        * pgsize = hdr . u . v3 . page_size;
+                                        * checksum = hdr . u . v3 . checksum;
+                                        count = hdr . u . v3 . num_blocks;
+                                        break; /* skip to initialize and return */
+
+                                    default:
+                                        rc = RC ( rcDB, rcColumn, rcOpening, rcColumn, rcBadVersion );
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    if ( rc == 0 ) /* initialize and return */
+                    {
+                        self -> vers = hdr . dad . version;
+                        rc = KColumnIdx1Init ( self, off, count );
+                        if ( rc == 0 )
+                            return rc;
+                    }
+
+                    KFileRelease ( self -> fidx );
+                    self -> fidx = NULL;
+                }
+            }
+        }
+        
+        KFileRelease ( self -> f );
+        self -> f = NULL;
+    }
+
+    return rc;
+}
+
+
+/* Whack
+ */
+rc_t KColumnIdx1Whack ( KColumnIdx1 *self )
+{
+    rc_t rc = KFileRelease ( self -> fidx );
+    if ( rc == 0 )
+    {
+        self -> fidx = NULL;
+        self -> fidxmd5 = NULL;
+        rc = KFileRelease ( self -> f );
+        if ( rc == 0 )
+        {
+            self -> f = NULL;
+            self -> fmd5 = NULL;
+            BSTreeWhack ( & self -> bst, KColumnIdx1NodeWhack, NULL );
+            BSTreeInit ( & self -> bst );
+        }
+    }
+    return rc;
+}
+
+/* Version
+ */
+#ifndef KColumnIdx1Version
+rc_t KColumnIdx1Version ( const KColumnIdx1 *self, uint32_t *version )
+{
+    * version = ( uint32_t ) self -> vers;
+    return 0;
+}
+#endif
+
+/* IdRange
+ *  returns range of ids contained within
+ */
+bool KColumnIdx1IdRange ( const KColumnIdx1 *self,
+    int64_t *first, int64_t *upper )
+{
+    const KColumnIdx1Node *a, *z;
+
+    assert ( self != NULL );
+    assert ( first != NULL );
+    assert ( upper != NULL );
+
+    a = ( const KColumnIdx1Node* ) BSTreeFirst ( & self -> bst );
+    if ( a == NULL )
+        return false;
+
+    z = ( const KColumnIdx1Node* ) BSTreeLast ( & self -> bst );
+    assert ( z != NULL );
+
+    * first = a -> loc . start_id;
+    * upper = z -> loc . start_id + z -> loc . id_range;
+    assert ( * first < * upper );
+
+    return true;
+}
+
+/* LocateFirstRowIdBlob
+ */
+typedef struct FindFirstRowIdData FindFirstRowIdData;
+struct FindFirstRowIdData
+{
+    int64_t start;
+    const KColumnIdx1Node * next;
+};
+
+static
+int64_t CC KColumnIdx1NodeFindFirstRowId ( const void * item, const BSTNode * n )
+{
+    FindFirstRowIdData * pb = ( FindFirstRowIdData * ) item;
+
+#define a ( pb -> start )
+#define b ( ( const KColumnIdx1Node * ) n )
+
+    if ( a < b -> loc . start_id )
+    {
+        if ( pb -> next == NULL )
+            pb -> next = b;
+        else if ( b -> loc . start_id < pb -> next -> loc . start_id )
+            pb -> next = b;
+        return -1;
+    }
+
+    return a >= ( b -> loc . start_id + b -> loc . id_range );
+
+#undef a
+#undef b
+}
+
+rc_t KColumnIdx1LocateFirstRowIdBlob ( const KColumnIdx1 * self,
+    KColBlockLoc * bloc, int64_t start )
+{
+    FindFirstRowIdData pb;
+    const KColumnIdx1Node * n;
+
+    assert ( self != NULL );
+    assert ( bloc != NULL );
+
+    pb . start = start;
+    pb . next = NULL;
+
+    n = ( const KColumnIdx1Node* )
+        BSTreeFind ( & self -> bst, & pb, KColumnIdx1NodeFindFirstRowId );
+
+    if ( n != NULL )
+    {
+        assert ( start >= n -> loc . start_id && start < n -> loc . start_id + n -> loc . id_range );
+        * bloc = n -> loc;
+        return 0;
+    }
+
+    if ( pb . next != NULL )
+    {
+        assert ( start < pb . next -> loc . start_id );
+        * bloc = pb . next -> loc;
+        return 0;
+    }
+        
+    return SILENT_RC ( rcDB, rcColumn, rcSelecting, rcBlob, rcNotFound );
+}
+
+/* LocateBlock
+ *  locates an idx2 block by range
+ *  return values:
+ */
+rc_t KColumnIdx1LocateBlock ( const KColumnIdx1 *self,
+    KColBlockLoc *bloc, int64_t first, int64_t upper )
+{
+    const KColumnIdx1Node *n;
+
+    assert ( self != NULL );
+    assert ( bloc != NULL );
+    assert ( first < upper );
+
+    n = ( const KColumnIdx1Node* )
+        BSTreeFind ( & self -> bst, & first, KColumnIdx1NodeFind );
+
+    if ( n == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcRange, rcNotFound );
+
+    assert ( first >= n -> loc . start_id );
+    assert ( first < ( n -> loc . start_id + n -> loc . id_range ) );
+
+    if ( upper > ( n -> loc . start_id + n -> loc . id_range ) )
+        return RC ( rcDB, rcIndex, rcSelecting, rcRange, rcInvalid );
+
+    * bloc = n -> loc;
+    return 0;
+}
+
+/* WriteHeader
+ */
+rc_t KColumnIdx1WriteHeader ( KColumnIdx1 *self,
+    uint64_t data_eof, uint32_t idx0_count, uint64_t idx2_eof,
+    size_t pgsize, int32_t checksum )
+{
+    rc_t rc = 0;
+    KColumnHdr hdr;
+    bool write_idx1 = false;
+    size_t off, off1, num_writ, num_writ1;
+
+    off1 = sizeof hdr . dad;
+
+    hdr . dad . endian = eByteOrderTag;
+    hdr . dad . version = ( uint32_t ) self -> vers;
+
+    switch ( self -> vers )
+    {
+    case 1:
+        hdr . u . v1 . data_eof = data_eof;
+        hdr . u . v1 . idx2_eof = idx2_eof;
+        hdr . u . v1 . num_blocks = ( uint32_t ) self -> count;
+        hdr . u . v1 . page_size = ( uint32_t ) pgsize;
+        hdr . u . v1 . checksum = ( uint8_t ) checksum;
+        memset ( hdr . u . v1 . align1, 0, sizeof hdr . u . v1 . align1 );
+        off = off1 = KColumnHdrOffset ( hdr, v1 );
+        write_idx1 = true;
+        break;
+    case 2:
+        hdr . u . v2 . data_eof = data_eof;
+        hdr . u . v2 . idx2_eof = idx2_eof;
+        hdr . u . v2 . ignore = 0;
+        hdr . u . v2 . num_blocks = ( uint32_t ) self -> count;
+        hdr . u . v2 . page_size = ( uint32_t ) pgsize;
+        hdr . u . v2 . checksum = ( uint8_t ) checksum;
+        memset ( hdr . u . v2 . align1, 0, sizeof hdr . u . v2 . align1 );
+        off = KColumnHdrOffset ( hdr, v2 );
+        break;
+    case 3:
+        hdr . u . v3 . data_eof = data_eof;
+        hdr . u . v3 . idx2_eof = idx2_eof;
+        hdr . u . v3 . idx0_count = idx0_count;
+        hdr . u . v3 . num_blocks = ( uint32_t ) self -> count;
+        hdr . u . v3 . page_size = ( uint32_t ) pgsize;
+        hdr . u . v3 . checksum = ( uint8_t ) checksum;
+        memset ( hdr . u . v3 . align1, 0, sizeof hdr . u . v2 . align1 );
+        off = KColumnHdrOffset ( hdr, v3 );
+        break;
+    default:
+        return RC ( rcDB, rcIndex, rcWriting, rcColumn, rcBadVersion );
+    }
+
+#if KCOL_CURRENT_VERSION != 1
+    if ( self -> fidxmd5 != NULL )
+        rc = KMD5FileReset ( self -> fidxmd5 );
+    if ( rc == 0 )
+    {
+        rc = KFileWrite ( self -> fidx, 0, & hdr, off, & num_writ );
+        if ( rc == 0 )
+        {
+            /* don't have a failsafe recover here - no undoing write to idx figured out */
+            if ( write_idx1 )
+            {
+#endif
+                if ( self -> fmd5 != NULL )
+                    rc = KMD5FileReset ( self -> fmd5 );
+                if ( rc == 0 )
+                    rc = KFileWrite ( self -> f, 0, & hdr, off1, & num_writ1 );
+#if KCOL_CURRENT_VERSION != 1
+            }
+        }
+    }
+#endif
+    if ( rc == 0 )
+    {
+#if KCOL_CURRENT_VERSION != 1
+        if ( num_writ != off )
+            rc = RC ( rcDB, rcIndex, rcWriting, rcTransfer, rcIncomplete );
+        else
+#endif
+        if ( write_idx1 && num_writ1 != off1 )
+            rc = RC ( rcDB, rcIndex, rcWriting, rcTransfer, rcIncomplete );
+    }
+
+    return rc;
+}
+
+/* Commit
+ *  records a block location
+ */
+rc_t KColumnIdx1Commit ( KColumnIdx1 *self, const KColBlockLoc *bloc )
+{
+    rc_t rc;
+    uint64_t pos;
+    size_t num_writ;
+
+    switch ( self -> vers )
+    {
+    case 1:
+        pos = KColumnHdrOffset ( NULL_HDR, v1 );
+        break;
+    default:
+        pos = KColumnHdrMinSize ( NULL_HDR );
+    }
+
+    pos += self -> count * sizeof * bloc;
+    rc = KFileWrite ( self -> f, pos, bloc, sizeof * bloc, & num_writ );
+    if ( rc == 0 )
+    {
+        if ( num_writ != sizeof * bloc )
+            rc = RC ( rcDB, rcIndex, rcCommitting, rcTransfer, rcIncomplete );
+        else
+        {
+            KColumnIdx1Node *n, *exist;
+            n = malloc ( sizeof * n );
+            if ( n == NULL )
+                rc = RC ( rcDB, rcIndex, rcCommitting, rcMemory, rcExhausted );
+            else
+            {
+                n -> loc = * bloc;
+                if ( BSTreeInsertUnique ( & self -> bst,
+                     & n -> n, ( BSTNode** ) & exist, KColumnIdx1NodeSort ) )
+                {
+                    free ( n );
+                    rc = RC ( rcDB, rcIndex, rcCommitting, rcRange, rcExists );
+                }
+                else
+                {
+                    ++ self -> count;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+rc_t KColumnIdx1CommitDone ( KColumnIdx1 *self )
+{
+    rc_t rc = 0;
+    if ( self -> fmd5 != NULL )
+    {
+        rc = KMD5FileCommit ( self -> fmd5 );
+        if ( rc == 0 )
+            rc = KMD5FileCommit ( self -> fidxmd5 );
+    }
+    return rc;
+}
+
+/* Revert
+ *  reverses effect of commit
+ *  return value is used to trigger DLListDoUntil exit
+ */
+bool KColumnIdx1Revert ( KColumnIdx1 *self, int64_t start_id, uint32_t id_range )
+{
+    KColumnIdx1Node *n = ( KColumnIdx1Node* )
+        BSTreeFind ( & self -> bst, & start_id, KColumnIdx1NodeFind );
+    if ( n == NULL )
+        return true;
+
+    assert ( n -> loc . start_id == start_id );
+    assert ( n -> loc . id_range == id_range );
+
+    BSTreeUnlink ( & self -> bst, & n -> n );
+    free ( n );
+    -- self -> count;
+
+    if ( self -> fmd5 != NULL )
+    {
+        assert ( self -> f == (KFile*) self -> fmd5 );
+        assert ( self -> fidx == (KFile*) self -> fidxmd5 );
+
+        KMD5FileRevert ( self -> fmd5 );
+    }
+    
+    return false;
+}
diff --git a/libs/kdb/wcolidx2-priv.h b/libs/kdb/wcolidx2-priv.h
new file mode 100644
index 0000000..ee45610
--- /dev/null
+++ b/libs/kdb/wcolidx2-priv.h
@@ -0,0 +1,114 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_colidx2_priv_
+#define _h_colidx2_priv_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_colfmt_priv_
+#include "colfmt-priv.h"
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#include <kfs/md5.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KColIdxBlock;
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx2
+ *  level 2 index
+ */
+typedef struct KColumnIdx2 KColumnIdx2;
+struct KColumnIdx2
+{
+    /* for adding new blocks */
+    uint64_t eof;
+
+    /* idx2 itself */
+    struct KFile *f;
+    struct KMD5File *fmd5;
+};
+
+/* Create
+ */
+rc_t KColumnIdx2Create ( KColumnIdx2 *self,
+    KDirectory *dir, struct KMD5SumFmt *md5, KCreateMode mode, uint64_t eof );
+
+/* Open
+ */
+rc_t KColumnIdx2OpenRead ( KColumnIdx2 *self,
+    const KDirectory *dir, uint64_t eof );
+
+/* Whack
+ */
+rc_t KColumnIdx2Whack ( KColumnIdx2 *self );
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdx2LocateBlob ( const KColumnIdx2 *self,
+    KColBlobLoc *loc, const KColBlockLoc *bloc,
+    int64_t first, int64_t upper, bool bswap );
+
+/* Write
+ *  writes block to idx2 at end of file
+ *
+ *  "pos" [ OUT ] - location at which block was written
+ *
+ *  "buffer" [ IN ] and "bytes" [ IN ] - describes data buffer
+ *
+ *  return values:
+ */
+rc_t KColumnIdx2Write ( KColumnIdx2 *self,
+    uint64_t *pos, const void *buffer, size_t bytes );
+
+/* Commit
+ *  keeps changes indicated by block size
+ */
+rc_t KColumnIdx2Commit ( KColumnIdx2 *self, size_t bytes );
+rc_t KColumnIdx2CommitDone ( KColumnIdx2 *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_colidx2_priv_ */
diff --git a/libs/kdb/wcolidx2.c b/libs/kdb/wcolidx2.c
new file mode 100644
index 0000000..8e15974
--- /dev/null
+++ b/libs/kdb/wcolidx2.c
@@ -0,0 +1,241 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "wcolumn-priv.h"
+#include "wcolidx2-priv.h"
+#include "idxblk-priv.h"
+#include "werror-priv.h"
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+#include <kfs/md5.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#define IDX2_READ_FILE_BUFFER 1024 * 1024
+
+
+/*--------------------------------------------------------------------------
+ * KColumnIdx2
+ *  level 2 index
+ */
+
+/* Init
+ */
+static
+rc_t KColumnIdx2Init ( KColumnIdx2 *self, uint64_t idx2_eof )
+{
+    rc_t rc = KFileSize ( self -> f, & self -> eof );
+    if ( rc == 0 )
+    {
+        if ( self -> eof < idx2_eof )
+            rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+        else
+        {
+            self -> eof = idx2_eof;
+            return 0;
+        }
+    }
+
+    KFileRelease ( self -> f );
+    self -> f = NULL;
+    return rc;
+}
+
+/* Create
+ */
+rc_t KColumnIdx2Create ( KColumnIdx2 *self,
+    KDirectory *dir, KMD5SumFmt *md5, KCreateMode mode, uint64_t eof )
+{
+    rc_t rc = KColumnFileCreate (&self->f, &self->fmd5, dir, md5, mode, true, "idx2");
+    if ( rc == 0 )
+        rc = KColumnIdx2Init ( self, eof );
+    return rc;
+}
+
+/* Open
+ */
+rc_t KColumnIdx2OpenRead ( KColumnIdx2 *self,
+    const KDirectory *dir, uint64_t eof )
+{
+    rc_t rc = KDirectoryOpenFileRead ( dir,
+        ( const KFile** ) & self -> f, "idx2" );
+#if IDX2_READ_FILE_BUFFER
+    if ( rc == 0 )
+    {
+        KFile * orig = self -> f;
+        rc = KBufFileMakeRead ( ( const KFile** ) & self -> f, self -> f, eof + 1 );
+	if ( rc == 0 )
+        {
+            KFileRelease ( orig );
+        }
+        else
+        {
+            self -> f = orig;
+            rc = 0;
+        }
+    }
+#endif
+    if ( rc == 0 )
+        rc = KColumnIdx2Init ( self, eof );
+    return rc;
+}
+
+/* Whack
+ */
+rc_t KColumnIdx2Whack ( KColumnIdx2 *self )
+{
+    rc_t rc = KFileRelease ( self -> f );
+    if ( rc == 0 )
+    {
+        self -> f = NULL;
+        self -> fmd5 = NULL;
+    }
+    return rc;
+}
+
+/* LocateBlob
+ *  locate an existing blob
+ */
+rc_t KColumnIdx2LocateBlob ( const KColumnIdx2 *self,
+    KColBlobLoc *loc, const KColBlockLoc *bloc,
+    int64_t first, int64_t upper, bool bswap )
+{
+    rc_t rc;
+
+    /* compression not supported */
+    if ( bloc -> u . blk . compressed )
+        rc = RC ( rcDB, rcIndex, rcSelecting, rcNoObj, rcUnsupported );
+    else
+    {
+        uint64_t buffer [ 1024 / 8 ]; /* make sure is uint64_t aligned */
+        void *block = buffer;
+
+        /* determine the number of entries in block */
+        size_t orig = bloc -> u . blk . size;
+        uint32_t count = KColBlockLocEntryCount ( bloc, & orig );
+
+        /* determine the size to allocate */
+        size_t block_size = KColBlockLocAllocSize ( bloc, orig, count );
+
+        /* allocate a block */
+        if ( block_size > sizeof buffer )
+            block = malloc ( block_size );
+        if ( block == NULL )
+            rc = RC ( rcDB, rcIndex, rcSelecting, rcMemory, rcExhausted );
+        else
+        {
+            size_t num_read;
+            rc = KFileReadAll ( self -> f, bloc -> pg, block, orig, & num_read );
+            if ( rc == 0 )
+            {
+                if ( num_read != orig )
+                    rc = RC ( rcDB, rcIndex, rcSelecting, rcTransfer, rcIncomplete );
+                else
+                {
+                    KColIdxBlock iblk;
+                    rc = KColIdxBlockInit ( & iblk, bloc, orig, block, block_size, bswap );
+                    if ( rc == 0 )
+                    {
+                        uint32_t span;
+                        int64_t start_id;
+                        int slot = KColIdxBlockFind ( & iblk,
+                            bloc, count, first, & start_id, & span );
+                        if ( slot < 0 )
+                            rc = RC ( rcDB, rcIndex, rcSelecting, rcRange, rcNotFound );
+                        else if ( upper > ( start_id + span ) )
+                            rc = RC ( rcDB, rcIndex, rcSelecting, rcRange, rcInvalid );
+                        else
+                        {
+                            loc -> start_id = start_id;
+                            loc -> id_range = span;
+
+                            KColIdxBlockGet ( & iblk,
+                                bloc, count, slot, & loc -> pg, & span );
+                            loc -> u . blob . size = span;
+                        }
+                    }
+                }
+            }
+
+            if ( block != buffer )
+                free ( block );
+        }
+    }
+
+    return rc;
+}
+
+/* Write
+ *  writes block to idx2 at end of file
+ *
+ *  "pos" [ OUT ] - location at which block was written
+ *
+ *  "buffer" [ IN ] and "bytes" [ IN ] - describes data buffer
+ *
+ *  return values:
+ */
+rc_t KColumnIdx2Write ( KColumnIdx2 *self,
+    uint64_t *pos, const void *buffer, size_t bytes )
+{
+    rc_t rc;
+    size_t num_writ;
+
+    * pos = self -> eof;
+
+    rc = KFileWrite ( self -> f,
+        self -> eof, buffer, bytes, & num_writ );
+    if ( rc == 0 )
+    {
+        if ( num_writ != bytes )
+            rc = RC ( rcDB, rcIndex, rcWriting, rcTransfer, rcIncomplete );
+    }
+
+    return rc;
+}
+
+/* Commit
+ *  keeps changes indicated by block size
+ */
+rc_t KColumnIdx2Commit ( KColumnIdx2 *self, size_t bytes )
+{
+    self -> eof += bytes;
+    return 0;
+}
+
+rc_t KColumnIdx2CommitDone ( KColumnIdx2 *self )
+{
+    assert ( self != NULL );
+
+    if ( self -> fmd5 != NULL )
+        return KMD5FileCommit ( self -> fmd5 );
+
+    return 0;
+}
diff --git a/libs/kdb/wcolumn-priv.h b/libs/kdb/wcolumn-priv.h
new file mode 100644
index 0000000..3360b78
--- /dev/null
+++ b/libs/kdb/wcolumn-priv.h
@@ -0,0 +1,120 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_column_priv_
+#define _h_column_priv_
+
+#ifndef _h_kdb_column_
+#include <kdb/column.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef _h_coldata_priv_
+#include "wcoldata-priv.h"
+#endif
+
+#ifndef _h_colidx_priv_
+#include "wcolidx-priv.h"
+#endif
+
+#include <klib/symbol.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KTable;
+struct KDBManager;
+struct KDirectory;
+struct KMD5SumFmt;
+
+
+/*--------------------------------------------------------------------------
+ * KColumn
+ */
+struct KColumn
+{
+    struct KTable *tbl;
+    struct KDBManager *mgr;
+    struct KDirectory *dir;
+
+    KMD5SumFmt *md5;
+
+    KColumnIdx idx;
+    KColumnData df;
+
+    KRefcount refcount;
+    uint32_t opencount;
+    uint32_t commit_freq;
+    uint32_t csbytes;
+    int32_t checksum;
+    bool read_only;
+
+    KSymbol sym;
+
+    char path [ 1 ];
+};
+
+/* Attach
+ * Sever
+ *  like Release, except called internally
+ *  indicates that a child object is letting go...
+ */
+KColumn *KColumnAttach ( const KColumn *self );
+rc_t KColumnSever ( const KColumn *self );
+
+/* Cmp
+ * Sort
+ */
+int KColumnCmp ( const void *item, struct BSTNode const *n );
+int KColumnSort ( struct BSTNode const *item, struct BSTNode const *n );
+
+
+rc_t KColumnFileCreate ( KFile ** ppf, KMD5File ** ppfmd5, KDirectory * dir, 
+			 KMD5SumFmt * md5, KCreateMode mode,
+			 bool append, const char * name);
+rc_t KColumnFileOpenUpdate ( KFile ** ppf, KMD5File ** ppfmd5, KDirectory * dir, 
+			     KMD5SumFmt * md5, bool append,
+			     const char * name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_column_priv_ */
diff --git a/libs/kdb/wcolumn.c b/libs/kdb/wcolumn.c
new file mode 100644
index 0000000..082e6e1
--- /dev/null
+++ b/libs/kdb/wcolumn.c
@@ -0,0 +1,2681 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "wcolumn-priv.h"
+#include "dbmgr-priv.h"
+#include "wtable-priv.h"
+#include "wkdb-priv.h"
+#include "werror-priv.h"
+#include <kdb/kdb-priv.h>
+#include <klib/symbol.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kfs/impl.h>
+#include <klib/checksum.h>
+#include <klib/data-buffer.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <byteswap.h>
+
+#include <os-native.h>
+
+
+/*--------------------------------------------------------------------------
+ * KColumn
+ *  a collection of blobs indexed by oid
+ */
+
+/* Whack
+ */
+static
+rc_t KColumnWhack ( KColumn *self )
+{
+    rc_t rc;
+    KDBManager *mgr = self -> mgr;
+    KSymbol * symb;
+    assert ( mgr != NULL );
+
+    KRefcountWhack ( & self -> refcount, "KColumn" );
+
+    /* shut down and checkpoint index */
+    rc = KColumnIdxWhack ( & self -> idx, 
+        self -> df . eof, self -> df . pgsize, self -> checksum );
+    if ( rc )
+        return rc;
+
+    /* shut down data fork */
+    KColumnDataWhack ( & self -> df );
+
+    /* shut down md5 sum file if it is open */
+    KMD5SumFmtRelease ( self -> md5 ), self -> md5 = NULL;
+
+    /* release owning table
+       should never fail, and our recovery is flawed */
+    if ( self -> tbl != NULL )
+    {
+        rc = KTableSever ( self -> tbl );
+        if ( rc != 0 )
+            return rc;
+        self -> tbl = NULL;
+    }
+
+    symb = KDBManagerOpenObjectFind (mgr, self->path);
+    if (symb != NULL)
+    {
+        rc = KDBManagerOpenObjectDelete (mgr, symb);
+        if (rc == 0)
+        {
+            /* release manager
+               should never fail */
+            rc = KDBManagerSever ( mgr );
+            if ( rc != 0 )
+                rc = KDBManagerOpenObjectAdd (mgr, symb);
+            else
+            {
+                /* complete */
+                KDirectoryRelease ( self -> dir );
+                free ( self );
+                return 0;
+            }
+        }
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "KColumn", "whack", "kcol" );
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KColumnAddRef ( const KColumn *cself )
+{
+    KColumn *self = ( KColumn* ) cself;
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KColumn" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcColumn, rcAttaching, rcRange, rcExcessive );
+        }
+        ++ self -> opencount;
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KColumnRelease ( const KColumn *cself )
+{
+    KColumn *self = ( KColumn* ) cself;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KColumn" ) )
+        {
+        case krefWhack:
+            return KColumnWhack ( ( KColumn* ) self );
+        case krefLimit:
+            return RC ( rcDB, rcColumn, rcReleasing, rcRange, rcExcessive );
+        }
+        -- self -> opencount;
+    }
+    return 0;
+}
+
+
+/* Attach
+ */
+KColumn *KColumnAttach ( const KColumn *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KColumn" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KColumn* ) self;
+}
+
+/* Sever
+ *  like Release, except called internally
+ *  indicates that a child object is letting go...
+ */
+rc_t KColumnSever ( const KColumn *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KColumn" ) )
+        {
+        case krefWhack:
+            return KColumnWhack ( ( KColumn* ) self );
+        case krefLimit:
+            return RC ( rcDB, rcColumn, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make
+ *  make an initialized structure
+ *  NB - does NOT attach reference to dir, but steals it
+ */
+static
+rc_t KColumnMake ( KColumn **colp, const KDirectory *dir, const char *path,
+		   KMD5SumFmt * md5, bool read_only )
+{
+    rc_t rc;
+    KColumn *col = malloc ( sizeof * col + strlen ( path ) );
+    if ( col == NULL )
+    {
+	* colp = NULL;
+        return RC ( rcDB, rcColumn, rcConstructing, rcMemory, rcExhausted );
+    }
+
+    memset ( col, 0, sizeof * col );
+    col -> dir = ( KDirectory* ) dir;
+    col -> md5 = md5;
+    rc = KMD5SumFmtAddRef ( md5 );
+    KRefcountInit ( & col -> refcount, 1, "KColumn", "make", path );
+    col -> opencount = 1;
+    col -> commit_freq = 1;
+    col -> read_only = read_only;
+
+    strcpy ( col -> path, path );
+
+    col->sym.u.obj = col;
+    StringInitCString (&col->sym.name, col->path);
+    col->sym.type = kptColumn;
+
+    * colp = col;
+    return rc;
+}
+
+
+static
+rc_t KDBManagerInsertColumn ( KDBManager * self, KColumn * col )
+{
+    rc_t rc;
+    rc = KDBManagerOpenObjectAdd (self, &col->sym);
+    if ( rc == 0 )
+        col -> mgr = KDBManagerAttach ( self );
+    return rc;
+}
+
+
+static
+rc_t KColumnMakeRead ( KColumn **colp, const KDirectory *dir, const char *path,
+		       KMD5SumFmt * md5 )
+{
+    rc_t rc = KColumnMake ( colp, dir, path, md5, true );
+    if ( rc == 0 )
+    {
+        size_t pgsize;
+        uint64_t data_eof;
+        KColumn *self = * colp;
+
+        rc = KColumnIdxOpenRead ( & self -> idx,
+            dir, & data_eof, & pgsize, & self -> checksum );
+        if ( rc == 0 )
+        {
+            rc = KColumnDataOpenRead ( & self -> df,
+				       dir, data_eof, pgsize );
+            if ( rc == 0 )
+            {
+                switch ( self -> checksum )
+                {
+                case kcsNone:
+                    break;
+                case kcsCRC32:
+                    self -> csbytes = 4;
+                    break;
+                case kcsMD5:
+                    self -> csbytes = 16;
+                    break;
+                }
+
+                self -> commit_freq = 0;
+                return 0;
+            }
+
+            KColumnIdxWhack ( & self -> idx,
+                data_eof, pgsize, self -> checksum );
+        }
+
+        free ( self );
+    }
+
+    * colp = NULL;
+    return rc;
+}
+
+static
+rc_t KColumnMakeUpdate ( KColumn **colp,
+    KDirectory *dir, const char *path, KMD5SumFmt *md5 )
+{
+    rc_t rc = KColumnMake ( colp, dir, path, md5, false );
+    if ( rc == 0 )
+    {
+        size_t pgsize;
+        uint64_t data_eof;
+        KColumn *self = * colp;
+
+        rc = KColumnIdxOpenUpdate ( & self -> idx, dir,
+            md5, & data_eof, & pgsize, & self -> checksum );
+        if ( rc == 0 )
+        {
+            rc = KColumnDataOpenUpdate ( & self -> df, dir,
+                md5, data_eof, pgsize );
+            if ( rc == 0 )
+            {
+                switch ( self -> checksum )
+                {
+                case kcsNone:
+                    break;
+                case kcsCRC32:
+                    self -> csbytes = 4;
+                    break;
+                case kcsMD5:
+                    self -> csbytes = 16;
+                    break;
+                }
+
+                return 0;
+            }
+
+            /* why is this here? */
+            KColumnDataWhack ( & self -> df );
+
+            KColumnIdxWhack ( & self -> idx,
+                data_eof, pgsize, self -> checksum );
+        }
+
+        free ( self );
+    }
+
+    * colp = NULL;
+    return rc;
+}
+
+
+/* Create
+ * VCreate
+ *  create a new or open an existing column
+ *
+ *  "colp" [ OUT ] - return parameter for newly opened database
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+static
+rc_t KColumnCreate ( KColumn **colp, KDirectory *dir,
+    KCreateMode cmode, KChecksum checksum,
+	size_t pgsize, const char *path, KMD5SumFmt *md5 )
+{
+    rc_t rc;
+
+    /* only supporting pgsize of 1 */
+    if ( pgsize == 0 )
+        pgsize = 1;
+    else if ( pgsize != 1 )
+        return RC ( rcDB, rcColumn, rcConstructing, rcParam, rcInvalid );
+
+    rc = KColumnMake ( colp, dir, path, md5, false );
+
+    if ( rc == 0 )
+    {
+        uint64_t data_eof;
+        KColumn *self = * colp;
+
+        self -> checksum = ( int32_t ) checksum;
+
+        rc = KColumnIdxCreate ( & self -> idx,
+            dir, md5, cmode, & data_eof, pgsize, ( int32_t ) checksum );
+        if ( rc == 0 )
+        {
+            rc = KColumnDataCreate ( & self -> df,
+                dir, md5, cmode, data_eof, pgsize );
+            if ( rc == 0 )
+            {
+                switch ( self -> checksum )
+                {
+                case kcsNone:
+                    break;
+                case kcsCRC32:
+                    self -> csbytes = 4;
+                    break;
+                case kcsMD5:
+                    self -> csbytes = 16;
+                    break;
+                }
+
+                /* successful exit */
+                return 0;
+            }
+
+            /* close data ? redundant? my thoughts exactly */
+            KColumnDataWhack ( & self -> df );
+
+            KColumnIdxWhack ( & self -> idx,
+                data_eof, pgsize, self -> checksum );
+        }
+
+        free ( self );
+    }
+
+    * colp = NULL;
+    return rc;
+}
+
+rc_t KColumnFileCreate ( KFile **ppf,
+    KMD5File **ppfmd5, KDirectory *dir, KMD5SumFmt *md5,
+    KCreateMode mode, bool append, const char *name )
+{
+#if 1
+    rc_t rc;
+
+    KFile *pf = NULL;
+    * ppfmd5 = NULL;
+
+    rc = KDirectoryCreateFile ( dir, & pf, true, 0664, mode, "%s", name );
+    if ( rc == 0 && md5 != NULL )
+    {
+        /* if the file was opened in "open" mode, leave its entry alone
+           if the file was opened in "init" mode, delete any existing entry
+           if the file was opened in "create" mode, it will fail if there
+           was an existing file, but still delete any digest entry */
+        if ( ( mode & kcmValueMask ) != kcmOpen )
+            rc = KMD5SumFmtDelete ( md5, name );
+        if ( rc == 0 || GetRCState ( rc ) == rcNotFound )
+        {
+            KMD5File *md5file;
+            rc = ( append ? KMD5FileMakeAppend : KMD5FileMakeWrite ) ( & md5file, pf, md5, name );
+            if ( rc == 0 )
+            {
+                * ppfmd5 = md5file;
+                pf = KMD5FileToKFile ( md5file );
+            }
+        }
+
+        if ( rc != 0 )
+        {
+            KFileRelease ( pf );
+            pf = NULL;
+        }
+    }
+
+    * ppf = pf;
+
+    return rc;
+#else
+
+    /* this looks like it needs some rethinking */
+    rc_t rc = 0;
+    KFile * pf;
+
+    *ppfmd5 = NULL;
+    *ppf = NULL;
+    /* -----
+     * This is used even when opening for update on some files
+     * so we have extra work
+     *
+     * If mode is kcmOpen try to open with normal open functions
+     * so the MD5 part gets handled correctly
+     */
+    rc = KColumnFileOpenUpdate (ppf, ppfmd5, dir, md5, append, name);
+    if (rc == 0)
+        return 0;
+
+    else if (GetRCState (rc) == rcNotFound)
+        rc = 0; /* this is not a true failure here so go on to create it */
+    if (rc == 0)
+    {
+        rc = KDirectoryVCreateFile (dir, &pf, true, 0664, mode, "%s", name);
+        if ((rc == 0) && (md5 != NULL))
+        {
+            rc = KMD5SumFmtDelete (md5, name);
+            if ((rc == 0) || (GetRCState (rc) == rcNotFound))
+            {
+                KMD5File * md5file;
+
+                rc = (append ? KMD5FileMakeAppend : KMD5FileMakeWrite)
+                    (&md5file, pf, md5, name);
+                if (rc == 0)
+                {
+                    *ppfmd5 = md5file;
+                    pf = KMD5FileToKFile (md5file);
+                }
+                else
+                {
+                    KFileRelease (pf);
+                    pf = NULL;
+                }
+            }
+        }
+    }
+    *ppf = pf;
+    return rc;
+#endif
+}
+
+rc_t KColumnFileOpenUpdate ( KFile **ppf, KMD5File **ppfmd5,
+    KDirectory *dir, KMD5SumFmt *md5, bool append, const char *name )
+{
+    rc_t rc;
+
+    KFile *pf = NULL;
+    * ppfmd5 = NULL;
+
+    rc = KDirectoryOpenFileWrite ( dir, & pf, true, "%s", name );
+    if ( rc == 0 && md5 != NULL )
+    {
+        KMD5File *md5file;
+        rc = ( append ? KMD5FileMakeAppend : KMD5FileMakeWrite ) ( & md5file, pf, md5, name );
+        if ( rc != 0 )
+        {
+            KFileRelease ( pf );
+            pf = NULL;
+        }
+        else
+        {
+            * ppfmd5 = md5file;
+            pf = KMD5FileToKFile ( md5file );
+        }
+    }
+
+    * ppf = pf;
+
+    return rc;
+}
+
+
+/* CreateColumn
+ * VCreateColumn
+ *  create a new or open an existing column
+ *
+ *  "col" [ OUT ] - return parameter for newly opened column
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "checksum" [ IN ] - checksum mode
+ *
+ *  "pgsize" [ IN ] - size of internal column pages
+ *
+ *  "path" [ IN ] - NUL terminated string in UTF-8 giving path to col
+ *  where "." acts as a structure name separator, i.e. struct.member
+ */
+static
+rc_t KDBManagerVCreateColumnInt ( KDBManager *self,
+    KColumn **colp, KDirectory *wd, KCreateMode cmode,
+    KChecksum checksum, size_t pgsize, const char *path, va_list args )
+{
+    char colpath [ 4096 ];
+    rc_t rc = KDirectoryVResolvePath ( wd, true,
+        colpath, sizeof colpath, path, args );
+    if ( rc == 0 )
+    {
+        KDirectory *dir;
+
+        switch ( KDBPathType ( /*NULL,*/ wd, NULL, colpath ) )
+        {
+        case kptNotFound:
+            /* first good path */
+            break;
+
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcCreating, rcPath, rcInvalid );
+        case kptColumn:
+        case kptColumn | kptAlias:
+            /* found so is not good if we want to create new and not
+             * clear/init or open old
+             */
+            if ( ( cmode & kcmValueMask ) == kcmCreate )
+                return RC ( rcDB, rcMgr, rcCreating, rcColumn, rcExists );
+            if (KDBManagerOpenObjectBusy (self, colpath))
+                return RC ( rcDB, rcMgr, rcCreating, rcColumn, rcBusy );
+            /* test now for locked directory */
+            rc = KDBWritable (wd, colpath);
+            if (rc)
+            {
+                switch (GetRCState(rc))
+                {
+                default:
+                    return rc;
+                case rcLocked:
+                    return RC ( rcDB, rcMgr, rcCreating, rcColumn, rcLocked );
+                case rcReadonly:
+                    return RC ( rcDB, rcMgr, rcCreating, rcColumn, rcReadonly );
+                case rcNotFound:
+                    /* not found is good but probably unreachable */
+                    break;
+                case 0:
+                    rc = 0;
+                    break;
+                }
+            }
+            /* second good path */
+            break;
+
+        case kptDatabase:
+        case kptDatabase | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcDatabase, rcExists);
+
+        case kptTable:
+        case kptTable | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcTable, rcExists);
+
+        case kptIndex:
+        case kptIndex | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcIndex, rcExists);
+
+        case kptMetadata:
+        case kptMetadata | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcMetadata, rcExists);
+
+	case kptFile:
+	case kptFile | kptAlias:
+	    /* if we find a file, vary the failure if it is an archive that is a column
+	     * or a non related file */
+	    if ( KDBOpenPathTypeRead ( self, wd, colpath, NULL, kptColumn, NULL, false ) == 0 )
+		return RC ( rcDB, rcMgr, rcCreating, rcDirectory, rcUnauthorized );
+	    /* fall through */
+        default:
+            return RC ( rcDB, rcMgr, rcCreating, rcPath, rcIncorrect );
+        }
+
+        /* [re]create directory */
+        rc = KDirectoryCreateDir ( wd, 0775, cmode, "%s", colpath );
+        if ( rc != 0 )
+            return rc;
+
+        /* create column as a directory */
+        rc = KDirectoryOpenDirUpdate ( wd, & dir, false, "%s", colpath );
+        if ( rc == 0 )
+        {
+            KColumn *col = NULL;
+            KMD5SumFmt *md5 = NULL;
+
+            /* create an MD5 digest file for column */
+            if ( KCOL_CURRENT_VERSION >= 3 && ( cmode & kcmMD5 ) != 0 )
+            {
+                KFile * f;
+                
+                /* create or open the md5 digest file */
+                rc = KDirectoryCreateFile ( wd, &f, true, 0664, kcmOpen, "%s/md5", colpath );
+                if ( rc == 0 )
+                {
+                    /* create a formatter around file
+                       formatter will own "f" afterward */
+                    rc = KMD5SumFmtMakeUpdate ( & md5, f );
+
+                    /* if failed to create formatter, release "f" */
+                    if ( rc != 0 )
+                        KFileRelease ( f );
+                }
+
+            }
+            
+            /* create column - will attach several references to "md5" */
+            if ( rc == 0 )
+                rc = KColumnCreate ( & col, dir, cmode, checksum, pgsize, colpath, md5 );
+
+            /* release our reference to "md5" if NULL then no problem */
+            if (md5)
+                KMD5SumFmtRelease ( md5 );
+
+            if ( rc == 0 )
+            {
+                rc = KDBManagerInsertColumn ( self, col );
+                if (rc == 0 )
+                {
+                    * colp = col;
+                    return 0;
+                }
+                
+                KColumnRelease ( col );                
+            }
+            KDirectoryRelease ( dir );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDBManagerVCreateColumn ( KDBManager *self, KColumn **col,
+    KCreateMode cmode, KChecksum checksum, size_t pgsize,
+    const char *path, va_list args )
+{
+    if ( col == NULL )
+        return RC ( rcDB, rcMgr, rcCreating, rcParam, rcNull );
+
+    * col = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcCreating, rcSelf, rcNull );
+
+    return KDBManagerVCreateColumnInt
+        ( self, col, self -> wd, cmode, checksum, pgsize, path, args );
+}
+
+LIB_EXPORT rc_t CC KDBManagerCreateColumn ( KDBManager *self, KColumn **col,
+    KCreateMode cmode, KChecksum checksum, size_t pgsize, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVCreateColumn ( self, col, cmode, checksum, pgsize, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTableCreateColumn ( KTable *self, KColumn **col,
+    KCreateMode cmode, KChecksum checksum, size_t pgsize, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KTableVCreateColumn ( self, col, cmode, checksum, pgsize, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableVCreateColumn ( KTable *self, KColumn **colp,
+    KCreateMode cmode, KChecksum checksum, size_t pgsize,
+    const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( colp == NULL )
+        return RC ( rcDB, rcTable, rcCreating, rcParam, rcNull );
+
+    * colp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcCreating, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcTable, rcCreating, rcColumn, rcReadonly );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "col", 3, name, args );
+    if ( rc == 0 )
+    {
+        /* set MD5 mode according to table */
+        if ( self -> use_md5 )
+            cmode |= kcmMD5;
+        else
+            cmode &= ~ kcmMD5;
+
+        rc = KDBManagerVCreateColumnInt ( self -> mgr, colp,
+                                          self -> dir, cmode | kcmParents, checksum, pgsize, path, NULL );
+        if ( rc == 0 )
+        {
+            KColumn *col = * colp;
+            col -> tbl = KTableAttach ( self );
+        }
+    }
+    return rc;
+}
+
+
+/* OpenColumnRead
+ * VOpenColumnRead
+ *  open a column for read
+ *
+ *  "col" [ OUT ] - return parameter for newly opened column
+ *
+ *  "path_fmt" + "args" (formatted string with varargs)  [ IN ] - NUL terminated
+ *  string in UTF-8 giving path to col
+ *  where "." acts as a structure name separator, i.e. struct.member
+ */
+static
+rc_t KDBManagerVOpenColumnReadInt ( const KDBManager *cself,
+    const KColumn **colp, const KDirectory *wd,
+    const char *path_fmt, va_list args, bool *cached, bool try_srapath )
+{
+    char colpath [ 4096 ];
+    rc_t rc = KDirectoryVResolvePath ( wd, true,
+        colpath, sizeof colpath, path_fmt, args );
+    if ( rc == 0 )
+    {
+        KSymbol *sym;
+
+        /* if already open */
+        sym = KDBManagerOpenObjectFind (cself, colpath);
+        if (sym != NULL)
+        {
+            const KColumn *ccol;
+            rc_t obj;
+
+            if(cached != NULL ) *cached = true;
+
+            switch (sym->type)
+            {
+            case kptColumn:
+                ccol = (const KColumn*)sym->u.obj;
+                /* if open for update, refuse */
+                if ( ccol -> read_only )
+                {
+                    /* attach a new reference and we're gone */
+                    rc = KColumnAddRef ( ccol );
+                    if ( rc == 0 )
+                        * colp = ccol;
+                    return rc;
+                }
+                obj = rcColumn;
+                break;
+            default:
+                obj = rcPath;
+                break;
+            case kptTable:
+                obj = rcTable;
+                break;
+            case kptDatabase:
+                obj = rcDatabase;
+                break;
+            case kptIndex:
+                obj = rcIndex;
+                break;
+            case kptMetadata:
+                obj = rcMetadata;
+                break;
+            }
+            rc = RC (rcDB, rcMgr, rcOpening, obj, rcBusy);
+        }
+        else
+        {
+            const KDirectory *dir;
+            char path[4096];
+            int size;
+
+            if ( cached != NULL )
+                *cached = false;
+
+            /* TODO: check if colpath is what we want to pass to KDBOpenPathTypeRead
+             * in this case we don't need to vprintf to 'path'
+            */
+            size = (args == NULL) ?
+                snprintf  ( path, sizeof path, "%s", path_fmt) :
+                vsnprintf ( path, sizeof path, path_fmt, args );
+            if (size < 0 || size >= (int) sizeof path)
+                rc = RC ( rcDB, rcMgr, rcOpening, rcPath, rcExcessive );
+
+            if (rc == 0)
+                rc = KDBOpenPathTypeRead ( cself, wd, path, &dir, kptColumn, NULL, try_srapath );
+
+            if ( rc == 0 )
+            { 
+                KColumn *col;
+
+                rc = KColumnMakeRead ( & col, dir, colpath, NULL );
+
+                if ( rc == 0 )
+                {
+                    rc = KDBManagerInsertColumn ( (KDBManager*)cself, col );
+                    if ( rc == 0 )
+                    {
+                        * colp = col;
+                        return 0;
+                    }
+
+                    KColumnRelease ( col );
+                }
+
+                KDirectoryRelease ( dir );
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerOpenColumnRead ( const KDBManager *self,
+    const KColumn **col, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVOpenColumnRead ( self, col, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerVOpenColumnRead ( const KDBManager *self,
+    const KColumn **col, const char *path, va_list args )
+{
+    if ( col == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcParam, rcNull );
+
+    * col = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcSelf, rcNull );
+
+    return KDBManagerVOpenColumnReadInt ( self, col, self -> wd, path, args , NULL, true);
+}
+
+LIB_EXPORT rc_t CC KTableOpenColumnRead ( const KTable *self,
+    const KColumn **col, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KTableVOpenColumnRead ( self, col, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableVOpenColumnRead ( const KTable *self,
+    const KColumn **colp, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( colp == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcParam, rcNull );
+
+    * colp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcSelf, rcNull );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "col", 3, name, args );
+    if ( rc == 0 )
+    {
+	bool col_is_cached;
+        rc = KDBManagerVOpenColumnReadInt ( self -> mgr,
+                                            colp, self -> dir, path, NULL, &col_is_cached, false );
+        if ( rc == 0 )
+        {
+            KColumn *col = ( KColumn* ) * colp;
+            if(!col_is_cached) col -> tbl = KTableAttach ( self );
+        }
+    }
+    return rc;
+}
+
+
+/* OpenColumnUpdate
+ * VOpenColumnUpdate
+ *  open a column for read/write
+ *
+ *  "col" [ OUT ] - return parameter for newly opened column
+ *
+ *  "path_fmt" formatted with "args" [ IN ] - NUL terminated string in UTF-8 giving path to col
+ *  where "." acts as a structure name separator, i.e. struct.member
+ */
+static
+rc_t KDBManagerVOpenColumnUpdateInt ( KDBManager *self,
+    KColumn **colp, KDirectory *wd, bool try_srapath,
+    const char *path_fmt, va_list args )
+{
+    char colpath [ 4096 ];
+    rc_t rc = 0;
+    int z;
+
+/*    rc = KDirectoryVResolvePath ( wd, 1,
+        colpath, sizeof colpath, path_fmt, args ); */
+    z = (args == NULL) ?
+        snprintf  ( colpath, sizeof colpath, "%s", path_fmt) :
+        vsnprintf ( colpath, sizeof colpath, path_fmt, args );
+    if (z < 0 || z >= (int) sizeof colpath)
+        rc = RC ( rcDB, rcMgr, rcOpening, rcPath, rcExcessive );
+    if ( rc == 0 )
+    {
+        KSymbol * sym;
+/*         KFile *f; */
+/*         KMD5SumFmt * md5 = NULL; */
+        KDirectory *dir;
+
+        /* if already open, refuse */
+        sym = KDBManagerOpenObjectFind (self, colpath);
+        if (sym != NULL)
+        {
+            rc_t obj;
+            switch (sym->type)
+            {
+            default:
+                obj = rcPath;
+                break;
+            case kptDatabase:
+                obj = rcDatabase;
+                break;
+            case kptTable:
+                obj = rcTable;
+                break;
+            case kptColumn:
+                obj = rcColumn;
+                break;
+            case kptIndex:
+                obj = rcIndex;
+                break;
+            case kptMetadata:
+                obj = rcMetadata;
+                break;
+            }
+            return RC ( rcDB, rcMgr, rcOpening, obj, rcBusy );
+        }
+        /* only open existing dbs */
+        switch (KDBPathType ( /*NULL,*/ wd, NULL, colpath ) )
+        {
+        case kptNotFound:
+            return RC ( rcDB, rcMgr, rcOpening, rcColumn, rcNotFound );
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcInvalid );
+	case kptFile:
+	case kptFile | kptAlias:
+	    /* if we find a file, vary the failure if it is an archive that is a table
+	     * or a non related file
+	     * this should be changed to a readonly as it is not possible not 
+	     * disallowed.  rcReadonly not rcUnauthorized
+	     */
+	    if ( KDBOpenPathTypeRead ( self, wd, colpath, NULL, kptColumn, NULL, try_srapath ) == 0 )
+		return RC ( rcDB, rcMgr, rcOpening, rcDirectory, rcUnauthorized );
+	    /* fall through */
+        default:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcIncorrect );
+        case kptColumn:
+        case kptColumn | kptAlias:
+            break;
+        }
+
+        /* test now for locked directory */
+        rc = KDBWritable (wd, colpath);
+        switch (GetRCState(rc))
+        {
+        default:
+            return RC ( rcDB, rcMgr, rcOpening, rcColumn, rcUnexpected );
+        case rcLocked:
+            return RC ( rcDB, rcMgr, rcOpening, rcColumn, rcLocked );
+        case rcReadonly:
+            return RC ( rcDB, rcMgr, rcOpening, rcColumn, rcReadonly );
+        case 0:
+            rc = 0;
+            break;
+        }
+
+
+        rc = KDirectoryOpenDirUpdate ( wd, & dir, 0, "%s", colpath );
+        if ( rc == 0 )
+        {
+            KColumn *col;
+            KMD5SumFmt *md5 = NULL;
+            /* open existing md5 digest file */
+            KFile * f;
+            rc = KDirectoryVOpenFileWrite ( dir, & f, true, "md5", NULL );
+            if ( rc == 0 )
+            {
+                rc = KMD5SumFmtMakeUpdate ( &md5, f );
+                if ( rc != 0 )
+                    KFileRelease ( f );
+            }
+            else if ( GetRCState ( rc ) == rcNotFound )
+                rc = 0;
+
+            /* make column - will attach several references to "md5" */
+            if ( rc == 0 )
+                rc = KColumnMakeUpdate ( & col, dir, colpath, md5 );
+
+            /* release our reference to "md5" */
+            KMD5SumFmtRelease ( md5 );
+
+            if ( rc == 0 )
+            {
+                rc = KDBManagerInsertColumn ( self, col );
+                if ( rc == 0 )
+                {
+                    * colp = col;
+                    return 0;
+                }
+                
+                KColumnRelease ( col );                
+            }
+            KDirectoryRelease ( dir );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerOpenColumnUpdate ( KDBManager *self,
+    KColumn **col, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVOpenColumnUpdate ( self, col, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerVOpenColumnUpdate ( KDBManager *self,
+    KColumn **col, const char *path, va_list args )
+{
+    if ( col == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcParam, rcNull );
+
+    * col = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcSelf, rcNull );
+
+    return KDBManagerVOpenColumnUpdateInt
+        ( self, col, self -> wd, true, path, args );
+}
+
+LIB_EXPORT rc_t CC KTableOpenColumnUpdate ( KTable *self,
+    KColumn **col, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KTableVOpenColumnUpdate ( self, col, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableVOpenColumnUpdate ( KTable *self,
+    KColumn **colp, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( colp == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcParam, rcNull );
+
+    * colp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcTable, rcOpening, rcColumn, rcReadonly );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "col", 3, name, args );
+    if ( rc == 0 )
+    {
+        rc = KDBManagerVOpenColumnUpdateInt ( self -> mgr,
+                                              colp, self -> dir, false, path, NULL );
+        if ( rc == 0 )
+        {
+            KColumn *col = * colp;
+            col -> tbl = KTableAttach ( self );
+        }
+    }
+    return rc;
+}
+
+bool KTableColumnNeedsReindex ( KTable *self, const char *colname )
+{
+    if ( self != NULL )
+    {
+        char path [ 256 ];
+        rc_t rc = KDBMakeSubPath ( self -> dir,
+            path, sizeof path, "col", 3, colname );
+        if ( rc == 0 )
+        {
+            uint64_t idx0_size;
+            rc = KDirectoryFileSize ( self -> dir, & idx0_size, "%s/idx0", path );
+            if ( rc == 0 && idx0_size > 0 )
+                return true;
+        }
+    }
+
+    return false;
+}
+
+
+/* Locked
+ *  returns non-zero if locked
+ */
+LIB_EXPORT bool CC KColumnLocked ( const KColumn *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return false;
+
+    rc = KDBWritable ( self -> dir, "." );
+    return GetRCState ( rc ) == rcLocked;
+}
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptMetadata and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+static
+rc_t KColumnLockInt (const KColumn  * self, char * path, size_t path_size,
+                        int type, const char * name, va_list args )
+{
+    rc_t rc;
+
+    if (self == NULL)
+        rc = RC ( rcDB, rcMgr, rcAccessing, rcSelf, rcNull );
+
+    else if (name == NULL)
+        rc =  RC (rcDB, rcMgr, rcAccessing, rcPath, rcNull);
+
+    else
+    {
+        const char * ns;
+        char path [ 256 ];
+
+        ns = KDBGetNamespaceString (type);
+
+        switch (type)
+        {
+        default:
+            rc = RC (rcDB, rcMgr, rcAccessing, rcParam, rcInvalid);
+            break;
+        case kptIndex:
+        case kptMetadata:
+/*         case kptIndex: */
+            rc = KDBVMakeSubPath (self->dir, path, sizeof path, ns, strlen (ns),
+                                  name, args);
+            break;
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnVWritable ( const KColumn *self, uint32_t type, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    rc = KColumnLockInt (self, path, sizeof path, type, name, args);
+    if (rc == 0)
+        rc = KDBWritable (self->dir, path);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnWritable ( const KColumn *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KColumnVWritable ( self, type, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptMetadata and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC KColumnVLock ( KColumn *self, uint32_t type, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    char path [ 256 ];
+
+    rc = KColumnLockInt (self, path, sizeof path, type, name, args);
+    if (rc == 0)
+        rc = KDBLockDir (self->dir, path);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnLock ( KColumn *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KColumnVLock (self, type, name, args);
+    va_end (args);
+    return rc;
+}
+
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptMetadata and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC KColumnVUnlock ( KColumn *self, uint32_t type, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    char path [ 256 ];
+
+    rc = KColumnLockInt (self, path, sizeof path, type, name, args);
+    if (rc == 0)
+        rc = KDBUnlockDir (self->dir, path);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnUnlock ( KColumn *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, name );
+    rc = KColumnVUnlock (self, type, name, args);
+    va_end (args);
+    return rc;
+}
+
+
+/* Version
+ *  returns the column format version
+ */
+LIB_EXPORT rc_t CC KColumnVersion ( const KColumn *self, uint32_t *version )
+{
+    if ( version == NULL )
+        return RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    if ( self == NULL )
+        return RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+    return KColumnIdxVersion ( & self -> idx, version );
+}
+
+/* ByteOrder
+ *  indicates whether original byte order is reversed
+ *  under current architecture.
+ *
+ *  the byte order of the column is established by
+ *  the host architecture when created.
+ *
+ *  "reversed" [ OUT ] - if true, the original byte
+ *  order is reversed with regard to host native byte order.
+ */
+LIB_EXPORT rc_t CC KColumnByteOrder ( const KColumn *self, bool *reversed )
+{
+    if ( reversed == NULL )
+        return RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * reversed = false;
+        return RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+    }
+     
+    return KColumnIdxByteOrder ( & self -> idx, reversed );
+}
+
+/* IdRange
+ *  returns id range for column
+ */
+LIB_EXPORT rc_t CC KColumnIdRange ( const KColumn *self, int64_t *first, uint64_t *count )
+{
+    rc_t rc;
+    int64_t dummy, last;
+
+    if ( first == NULL && count == NULL )
+        return RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+
+    if ( first == NULL )
+        first = & dummy;
+    else if ( count == NULL )
+        count = ( uint64_t * ) & dummy;
+
+    if ( self == NULL )
+    {
+        * first = 0;
+        * count = 0;
+        return RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+    }
+
+    rc = KColumnIdxIdRange ( & self -> idx, first, & last );
+    if ( rc != 0 )
+        * count = 0;
+    else
+        * count = last - * first + 1;
+
+    return rc;
+}
+
+
+/* FindFirstRowId
+ *  locates the first valid row-id starting from a given id.
+ *  this will be either the start id provided, or
+ *  the first row from the next blob, if available.
+ *
+ *  "found" [ OUT ] - will contain the value of "start" if this is contained within a blob,
+ *  or the first row-id of the next blob after "start", if any.
+ *
+ *  "start" [ IN ] - starting row-id in search, inclusive. if this id is valid,
+ *  it will be returned in "found"
+ *
+ *  returns 0 if id is found, rcNotFound if no more data were available.
+ *  may return other codes upon error.
+ */
+LIB_EXPORT rc_t CC KColumnFindFirstRowId ( const KColumn * self, int64_t * found, int64_t start )
+{
+    rc_t rc;
+
+    if ( found == NULL )
+        rc = RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KColumnIdxFindFirstRowId ( & self -> idx, found, start );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        * found = 0;
+    }
+
+    return rc;
+}
+
+
+/* Reindex
+ *  optimize indices
+ */
+LIB_EXPORT rc_t CC KColumnReindex ( KColumn *self )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcColumn, rcReindexing, rcSelf, rcNull );
+    if ( self -> read_only )
+        return RC ( rcDB, rcColumn, rcReindexing, rcColumn, rcReadonly );
+    return KColumnIdxReindex ( & self -> idx, self -> md5, self -> commit_freq,
+        self -> df . eof, self -> df . pgsize, self -> checksum );
+}
+
+
+/* CommitFreq
+ * SetCommitFreq
+ *  manage frequency of commits
+ */
+LIB_EXPORT rc_t CC KColumnCommitFreq ( KColumn *self, uint32_t *freq )
+{
+    if ( freq == NULL )
+        return RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * freq = 0;
+        return RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+    }
+
+    * freq = self -> commit_freq;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KColumnSetCommitFreq ( KColumn *self, uint32_t freq )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcColumn, rcUpdating, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcColumn, rcUpdating, rcColumn, rcReadonly );
+
+    self -> commit_freq = freq;
+    return 0;
+}
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KColumnOpenManagerRead ( const KColumn *self, const KDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnOpenManagerUpdate ( KColumn *self, KDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent table
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KColumnOpenParentRead ( const KColumn *self, const KTable **tbl )
+{
+    rc_t rc;
+
+    if ( tbl == NULL )
+        rc = RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KTableAddRef ( self -> tbl );
+            if ( rc == 0 )
+            {
+                * tbl = self -> tbl;
+                return 0;
+            }
+        }
+
+        * tbl = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnOpenParentUpdate ( KColumn *self, KTable **tbl )
+{
+    rc_t rc;
+
+    if ( tbl == NULL )
+        rc = RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else if ( self -> tbl != NULL && self -> tbl -> read_only )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcTable, rcReadonly );
+        else
+        {
+            rc = KTableAddRef ( self -> tbl );
+            if ( rc == 0 )
+            {
+                * tbl = self -> tbl;
+                return 0;
+            }
+        }
+
+        * tbl = NULL;
+    }
+
+    return rc;
+}
+
+/* OpenDirectory
+ *  duplicate reference to the directory in use
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KColumnOpenDirectoryRead ( const KColumn *self, const KDirectory **dir )
+{
+    rc_t rc;
+
+    if ( dir == NULL )
+        rc = RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDirectoryAddRef ( self -> dir );
+            if ( rc == 0 )
+            {
+                * dir = self -> dir;
+                return 0;
+            }
+        }
+
+        * dir = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnOpenDirectoryUpdate ( KColumn *self, KDirectory **dir )
+{
+    rc_t rc;
+
+    if ( dir == NULL )
+        rc = RC ( rcDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else if ( self -> dir != NULL && self -> dir -> read_only )
+            rc = RC ( rcDB, rcColumn, rcAccessing, rcDirectory, rcReadonly );
+        else
+        {
+            rc = KDirectoryAddRef ( self -> dir );
+            if ( rc == 0 )
+            {
+                * dir = self -> dir;
+                return 0;
+            }
+        }
+
+        * dir = NULL;
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KColumnBlob
+ *  one or more rows of column data
+ */
+struct KColumnBlob
+{
+    /* holds either an existing blob loc
+       or new blob index range */
+    KColBlobLoc loc;
+
+    /* holds old and new page maps */
+    KColumnPageMap pmorig;
+    KColumnPageMap pmnew;
+
+    /* owning column */
+    KColumn *col;
+
+    /* refcount */
+    atomic32_t refcount;
+
+    /* number of bytes written to blob */
+    uint32_t num_writ;
+
+    /* checksums */
+    uint32_t crc32;
+    MD5State md5;
+
+    /* open mode */
+    uint8_t read_only;
+
+    /* for validation */
+    bool bswap;
+};
+
+
+/* Whack
+ */
+static
+rc_t KColumnBlobWhack ( KColumnBlob *self )
+{
+    KColumn *col = self -> col;
+    assert ( col != NULL );
+
+    KColumnPageMapWhack ( & self -> pmorig, & col -> df );
+    if ( ! self -> read_only )
+        KColumnPageMapWhack ( & self -> pmnew, & col -> df );
+
+    /* cannot recover from errors here,
+       since the page maps needed whacking first,
+       and the column is needed for that. */
+    KColumnSever ( col );
+
+    free ( self );
+    return 0;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KColumnBlobAddRef ( const KColumnBlob *cself )
+{
+    if ( cself != NULL )
+    {
+        atomic32_inc ( & ( ( KColumnBlob* ) cself ) -> refcount );
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KColumnBlobRelease ( const KColumnBlob *cself )
+{
+    KColumnBlob *self = ( KColumnBlob* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+            return KColumnBlobWhack ( self );
+    }
+    return 0;
+}
+
+/* OpenRead
+ * OpenUpdate
+ */
+static
+rc_t KColumnBlobOpenRead ( KColumnBlob *self, const KColumn *col, int64_t id )
+{
+    /* locate blob */
+    rc_t rc = KColumnIdxLocateBlob ( & col -> idx, & self -> loc, id, id );
+    if ( rc == 0 )
+    {
+        /* indicates not written */
+        /*assert ( self -> num_writ == 0 );*/
+
+        /* open page map to blob */
+        rc = KColumnPageMapOpen ( & self -> pmorig,
+            ( KColumnData* ) & col -> df, self -> loc . pg, self -> loc . u . blob . size );
+        if ( rc == 0 )
+        {
+            /* existing blob must have proper checksum bytes */
+            if ( self -> loc . u . blob . size >= col -> csbytes )
+            {
+                /* remove them from apparent blob size */
+                self -> loc . u . blob . size -= col -> csbytes;
+                return 0;
+            }
+
+            /* the blob is corrupt */
+            KColumnPageMapWhack ( & self -> pmorig, & col -> df );
+            rc = RC ( rcDB, rcBlob, rcOpening, rcBlob, rcCorrupt );
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t KColumnBlobOpenUpdate ( KColumnBlob *self, KColumn *col, int64_t id )
+{
+    /* open existing blob */
+    rc_t rc = KColumnBlobOpenRead ( self, col, id );
+    if ( rc == 0 )
+    {
+        /* create a new page map for replacement */
+        rc = KColumnPageMapCreate ( & self -> pmnew, & col -> df );
+        if ( rc == 0 )
+        {
+            /* initialize for writing checksums */
+            switch ( col -> checksum )
+            {
+            case kcsCRC32:
+                self -> crc32 = 0;
+                break;
+            case kcsMD5:
+                MD5StateInit ( & self -> md5 );
+                break;
+            }
+        }
+
+        /* tear down results of opening for read */
+        KColumnPageMapWhack ( & self -> pmorig, & col -> df );
+    }
+
+    return rc;
+}
+
+/* Create
+ */
+static
+rc_t KColumnBlobCreate ( KColumnBlob *self, KColumn *col )
+{
+    rc_t rc;
+
+    if ( col -> md5 != NULL )
+    {
+	/* this perhaps should be split into wcoldat.c and wcolidx.c */
+	rc = KMD5FileBeginTransaction ( col -> df . fmd5 );
+	if ( rc == 0 )
+	{
+	    rc = KMD5FileBeginTransaction ( col -> idx . idx2 . fmd5 );
+	    if ( rc == 0 )
+	    {
+		rc = KMD5FileBeginTransaction ( col -> idx . idx0 . fmd5 );
+		if ( rc == 0 )
+		{
+		    rc = KMD5FileBeginTransaction ( col -> idx . idx1 . fmd5 );
+		    if ( rc == 0 )
+		    {
+			rc = KMD5FileBeginTransaction ( col -> idx . idx1 . fidxmd5 );
+			if ( rc != 0 )
+			    KMD5FileCommit ( col -> idx . idx1 .  fmd5 );
+		    }
+		    if ( rc != 0 )
+			KMD5FileCommit ( col -> idx . idx0 .  fmd5 );
+		}
+		if ( rc != 0 )
+		    KMD5FileCommit ( col -> idx . idx2 .  fmd5 );
+	    }
+	    if ( rc != 0 )
+		KMD5FileCommit ( col -> df . fmd5 );
+	}
+	if ( rc != 0 )
+	    return rc;
+    }
+
+    /* no location yet */
+    memset ( & self -> loc, 0, sizeof self -> loc );
+
+    /* invalid existing page map */
+    memset ( & self -> pmorig, 0, sizeof self -> pmorig );
+
+    /* create a new page map */
+    rc = KColumnPageMapCreate ( & self -> pmnew, & col -> df );
+    if ( rc == 0 )
+    {
+        /* initialize for writing checksums */
+        switch ( col -> checksum )
+        {
+        case kcsCRC32:
+            self -> crc32 = 0;
+            break;
+        case kcsMD5:
+            MD5StateInit ( & self -> md5 );
+            break;
+        }
+    }
+
+    return rc;
+}
+
+/* Make
+ */
+static
+rc_t KColumnBlobMake ( KColumnBlob **blobp, bool bswap )
+{
+    KColumnBlob *blob = malloc ( sizeof * blob );
+    if ( blob == NULL )
+        return RC ( rcDB, rcBlob, rcConstructing, rcMemory, rcExhausted );
+
+    memset ( blob, 0, sizeof * blob );
+    atomic32_set ( & blob -> refcount, 1 );
+    blob -> bswap = bswap;
+
+    * blobp = blob;
+    return 0;
+}
+
+/* OpenBlobRead
+ * OpenBlobUpdate
+ *  opens an existing blob containing row data for id
+ */
+LIB_EXPORT rc_t CC KColumnOpenBlobRead ( const KColumn *self, const KColumnBlob **blobp, int64_t id )
+{
+    rc_t rc;
+    KColumnBlob *blob;
+
+    if ( blobp == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcParam, rcNull );
+    * blobp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcSelf, rcNull );
+
+    rc = KColumnBlobMake ( & blob, self -> idx . idx1 . bswap );
+    if ( rc == 0 )
+    {
+        rc = KColumnBlobOpenRead ( blob, self, id );
+        if ( rc == 0 )
+        {
+            blob -> col = KColumnAttach ( self );
+            blob -> read_only = true;
+            * blobp = blob;
+            return 0;
+        }
+        
+        free ( blob );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnOpenBlobUpdate ( KColumn *self, KColumnBlob **blobp, int64_t id )
+{
+    rc_t rc;
+
+    if ( blobp == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcParam, rcNull );
+    * blobp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcSelf, rcNull );
+    if ( self -> read_only )
+        return RC ( rcDB, rcColumn, rcOpening, rcColumn, rcReadonly );
+
+    rc = KColumnBlobMake ( blobp, self -> idx . idx1 . bswap );
+    if ( rc == 0 )
+    {
+        KColumnBlob *blob = * blobp;
+        rc = KColumnBlobOpenUpdate ( blob, self, id );
+        if ( rc == 0 )
+        {
+            blob -> col = KColumnAttach ( self );
+            * blobp = blob;
+            return 0;
+        }
+                    
+        free ( blob );
+    }
+
+    return rc;
+}
+
+/* CreateBlob
+ *  creates a new, unassigned blob
+ */
+LIB_EXPORT rc_t CC KColumnCreateBlob ( KColumn *self, KColumnBlob **blobp )
+{
+    rc_t rc;
+
+    if ( blobp == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcParam, rcNull );
+    * blobp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcSelf, rcNull );
+    if ( self -> read_only )
+        return RC ( rcDB, rcColumn, rcOpening, rcColumn, rcReadonly );
+
+    rc = KColumnBlobMake ( blobp, self -> idx . idx1 . bswap );
+    if ( rc == 0 )
+    {
+        KColumnBlob *blob = * blobp;
+        rc = KColumnBlobCreate ( blob, self );
+        if ( rc == 0 )
+        {
+            blob -> col = KColumnAttach ( self );
+            * blobp = blob;
+            return 0;
+        }
+                    
+        free ( blob );
+    }
+
+    return rc;
+}
+
+/* IdRange
+ *  returns id range for blob
+ *
+ *  "first" [ OUT, NULL OKAY ] - optional return parameter for first id
+ *
+ *  "last" [ OUT, NULL OKAY ] - optional return parameter for last id
+ */
+LIB_EXPORT rc_t CC KColumnBlobIdRange ( const KColumnBlob *self, int64_t *first, uint32_t *count )
+{
+    rc_t rc;
+
+    if ( first == NULL || count == NULL )
+        rc = RC ( rcDB, rcBlob, rcAccessing, rcParam, rcNull );
+    else if ( self == NULL )
+        rc = RC ( rcDB, rcBlob, rcAccessing, rcSelf, rcNull );
+    else if ( self -> loc . id_range == 0 )
+        rc = RC ( rcDB, rcBlob, rcAccessing, rcRange, rcEmpty );
+    else
+    {
+        * first = self -> loc . start_id;
+        * count = self -> loc . id_range;
+        return 0;
+    }
+
+    if ( first != NULL )
+        * first = 0;
+    if ( count != NULL )
+        * count = 0;
+
+    return rc;
+}
+
+/* KColumnBlobValidate
+ *  runs checksum validation on unmodified blob
+ */
+static
+rc_t KColumnBlobValidateCRC32 ( const KColumnBlob *self )
+{
+    rc_t rc;
+    const KColumn *col = self -> col;
+
+    uint8_t buffer [ 8 * 1024 ];
+    size_t to_read, num_read, total, size;
+
+    uint32_t cs, crc32 = 0;
+
+    /* calculate checksum */
+    for ( size = self -> loc . u . blob. size, total = 0; total < size; total += num_read )
+    {
+        to_read = size - total;
+        if ( to_read > sizeof buffer )
+            to_read = sizeof buffer;
+
+        rc = KColumnDataRead ( & col -> df,
+            & self -> pmorig, total, buffer, to_read, & num_read );
+        if ( rc != 0 )
+            return rc;
+        if ( num_read == 0 )
+            return RC ( rcDB, rcBlob, rcValidating, rcTransfer, rcIncomplete );
+
+        crc32 = CRC32 ( crc32, buffer, num_read );
+    }
+
+    /* read stored checksum */
+    rc = KColumnDataRead ( & col -> df,
+        & self -> pmorig, size, & cs, sizeof cs, & num_read );
+    if ( rc != 0 )
+        return rc;
+    if ( num_read != sizeof cs )
+        return RC ( rcDB, rcBlob, rcValidating, rcTransfer, rcIncomplete );
+
+    if ( self -> bswap )
+        cs = bswap_32 ( cs );
+
+    if ( cs != crc32 )
+        return RC ( rcDB, rcBlob, rcValidating, rcBlob, rcCorrupt );
+
+    return 0;
+}
+
+static
+rc_t KColumnBlobValidateMD5 ( const KColumnBlob *self )
+{
+    rc_t rc;
+    const KColumn *col = self -> col;
+
+    uint8_t buffer [ 8 * 1024 ];
+    size_t to_read, num_read, total, size;
+
+    MD5State md5;
+    uint8_t digest [ 16 ];
+
+    MD5StateInit ( & md5 );
+
+    /* calculate checksum */
+    for ( size = self -> loc . u . blob . size, total = 0; total < size; total += num_read )
+    {
+        to_read = size - total;
+        if ( to_read > sizeof buffer )
+            to_read = sizeof buffer;
+
+        rc = KColumnDataRead ( & col -> df,
+            & self -> pmorig, total, buffer, to_read, & num_read );
+        if ( rc != 0 )
+            return rc;
+        if ( num_read == 0 )
+            return RC ( rcDB, rcBlob, rcValidating, rcTransfer, rcIncomplete );
+
+        MD5StateAppend ( & md5, buffer, num_read );
+    }
+
+    /* read stored checksum */
+    rc = KColumnDataRead ( & col -> df,
+        & self -> pmorig, size, buffer, sizeof digest, & num_read );
+    if ( rc != 0 )
+        return rc;
+    if ( num_read != sizeof digest )
+        return RC ( rcDB, rcBlob, rcValidating, rcTransfer, rcIncomplete );
+
+    /* finish MD5 digest */
+    MD5StateFinish ( & md5, digest );
+
+    if ( memcmp ( buffer, digest, sizeof digest ) != 0 )
+        return RC ( rcDB, rcBlob, rcValidating, rcBlob, rcCorrupt );
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KColumnBlobValidate ( const KColumnBlob *self )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcBlob, rcValidating, rcSelf, rcNull );
+
+    if ( self -> num_writ != 0 )
+        return RC ( rcDB, rcBlob, rcValidating, rcBlob, rcBusy );
+
+    if ( self -> loc . u . blob . size != 0 ) switch ( self -> col -> checksum )
+    {
+    case kcsCRC32:
+        return KColumnBlobValidateCRC32 ( self );
+    case kcsMD5:
+        return KColumnBlobValidateMD5 ( self );
+    }
+
+    return 0;
+}
+
+/* ValidateBuffer
+ *  run checksum validation on buffer data
+ *
+ *  "buffer" [ IN ] - returned blob buffer from ReadAll
+ *
+ *  "cs_data" [ IN ] and "cs_data_size" [ IN ] - returned checksum data from ReadAll
+ */
+static
+rc_t KColumnBlobValidateBufferCRC32 ( const void * buffer, size_t size, uint32_t cs )
+{
+    uint32_t crc32 = CRC32 ( 0, buffer, size );
+
+    if ( cs != crc32 )
+        return RC ( rcDB, rcBlob, rcValidating, rcBlob, rcCorrupt );
+
+    return 0;
+}
+
+static
+rc_t KColumnBlobValidateBufferMD5 ( const void * buffer, size_t size, const uint8_t cs [ 16 ] )
+{
+    MD5State md5;
+    uint8_t digest [ 16 ];
+
+    MD5StateInit ( & md5 );
+
+    /* calculate checksum */
+    MD5StateAppend ( & md5, buffer, size );
+
+    /* finish MD5 digest */
+    MD5StateFinish ( & md5, digest );
+
+    if ( memcmp ( cs, digest, sizeof digest ) != 0 )
+        return RC ( rcDB, rcBlob, rcValidating, rcBlob, rcCorrupt );
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KColumnBlobValidateBuffer ( const KColumnBlob * self,
+    const KDataBuffer * buffer, const KColumnBlobCSData * cs_data, size_t cs_data_size )
+{
+    size_t bsize;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcBlob, rcValidating, rcSelf, rcNull );
+    if ( buffer == NULL || cs_data == NULL )
+        return RC ( rcDB, rcBlob, rcValidating, rcParam, rcNull );
+
+    bsize = KDataBufferBytes ( buffer );
+    if ( bsize < self -> loc . u . blob . size )
+        return RC ( rcDB, rcBlob, rcValidating, rcData, rcInsufficient );
+    if ( bsize > self -> loc . u . blob . size )
+        return RC ( rcDB, rcBlob, rcValidating, rcData, rcExcessive );
+
+    if ( bsize != 0 ) switch ( self -> col -> checksum )
+    {
+    case kcsNone:
+        break;
+    case kcsCRC32:
+        return KColumnBlobValidateBufferCRC32 ( buffer -> base, bsize,
+            self -> bswap ? bswap_32 ( cs_data -> crc32 ) : cs_data -> crc32 );
+    case kcsMD5:
+        return KColumnBlobValidateBufferMD5 ( buffer -> base, bsize, cs_data -> md5_digest );
+    }
+
+    return 0;
+}
+
+/* KColumnBlobRead
+ *  read data from blob
+ *
+ *  "offset" [ IN ] - starting offset into blob
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - number of bytes actually read
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of bytes remaining to be read. specifically,
+ *  "offset" + "num_read" + "remaining" == sizeof blob
+ */
+LIB_EXPORT rc_t CC KColumnBlobRead ( const KColumnBlob *self,
+    size_t offset, void *buffer, size_t bsize,
+    size_t *num_read, size_t *remaining )
+{
+    rc_t rc;
+    const KColumnPageMap *pm;
+
+    size_t ignore;
+    if ( remaining == NULL )
+        remaining = & ignore;
+
+    if ( num_read == NULL )
+        rc = RC ( rcDB, rcBlob, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcBlob, rcReading, rcSelf, rcNull );
+        else
+        {
+            size_t size = self -> num_writ;
+            const KColumn *col = self -> col;
+
+            if ( size != 0 )
+                pm = & self -> pmnew;
+            else
+            {
+                pm = & self -> pmorig;
+                size = self -> loc . u . blob . size;
+            }
+
+            if ( offset > size )
+                offset = size;
+
+            if ( bsize == 0 )
+                rc = 0;
+            else if ( buffer == NULL )
+                rc = RC ( rcDB, rcBlob, rcReading, rcBuffer, rcNull );
+            else
+            {
+                size_t to_read = size - offset;
+                if ( to_read > bsize )
+                    to_read = bsize;
+
+                *num_read = 0;
+                while (*num_read < to_read) {
+                    size_t nread = 0;
+
+                    rc = KColumnDataRead ( & col -> df, pm, offset - *num_read, (void *)((char *)buffer + *num_read), to_read - *num_read, &nread );
+                    if (rc) break;
+                    if (nread == 0) {
+                        rc = RC ( rcDB, rcBlob, rcReading, rcFile, rcInsufficient );
+                        break;
+                    }
+                    *num_read += nread;
+                }
+
+                if ( rc == 0 )
+                {
+                    * remaining = size - offset - * num_read;
+                    return 0;
+                }
+            }
+
+            * remaining = size - offset;
+            * num_read = 0;
+            return rc;
+        }
+
+        * num_read = 0;
+    }
+
+    * remaining = 0;
+    return rc;
+}
+
+/* ReadAll
+ *  read entire blob, plus any auxiliary checksum data
+ *
+ *  "buffer" [ OUT ] - pointer to a KDataBuffer structure that will be initialized
+ *  and resized to contain the entire blob. upon success, will contain the number of bytes
+ *  in buffer->elem_count and buffer->elem_bits == 8.
+ *
+ *  "opt_cs_data [ OUT, NULL OKAY ] - optional output parameter for checksum data
+ *  associated with the blob in "buffer", if any exist.
+ *
+ *  "cs_data_size" [ IN ] - sizeof of * opt_cs_data if not NULL, 0 otherwise
+ */
+LIB_EXPORT rc_t CC KColumnBlobReadAll ( const KColumnBlob * self, KDataBuffer * buffer,
+    KColumnBlobCSData * opt_cs_data, size_t cs_data_size )
+{
+    rc_t rc = 0;
+
+    if ( opt_cs_data != NULL )
+        memset ( opt_cs_data, 0, cs_data_size );
+
+    if ( buffer == NULL )
+        rc = RC ( rcDB, rcBlob, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcBlob, rcReading, rcSelf, rcNull );
+        else
+        {
+            /* determine blob size */
+            size_t bsize = self -> loc . u . blob . size;
+
+            /* ignore blobs of size 0 */
+            if ( bsize == 0 )
+                rc = 0;
+            else
+            {
+                /* initialize the buffer */
+                rc = KDataBufferMakeBytes ( buffer, bsize );
+                if ( rc == 0 )
+                {
+                    /* read the blob */
+                    size_t num_read, remaining;
+                    rc = KColumnBlobRead ( self, 0, buffer -> base, bsize, & num_read, & remaining );
+                    if ( rc == 0 )
+                    {
+                        /* test that num_read is everything and we have no remaining */
+                        if ( num_read != bsize || remaining != 0 )
+                            rc = RC ( rcDB, rcBlob, rcReading, rcTransfer, rcIncomplete );
+
+                        else
+                        {
+                            /* set for MD5 - just due to switch ordering */
+                            size_t cs_bytes = 16;
+
+                            /* if not reading checksum data, then we're done */
+                            if ( opt_cs_data == NULL )
+                                return 0;
+
+                            /* see what checksumming is in use */
+                            switch ( self -> col -> checksum )
+                            {
+                            case kcsNone:
+                                return 0;
+
+                            case kcsCRC32:
+                                /* reset for CRC32 */
+                                cs_bytes = 4;
+
+                                /* no break */
+
+                            case kcsMD5:
+                                if ( cs_data_size < cs_bytes )
+                                {
+                                    rc = RC ( rcDB, rcBlob, rcReading, rcParam, rcTooShort );
+                                    break;
+                                }
+
+                                /* read checksum information */
+                                rc = KColumnDataRead ( & self -> col -> df,
+                                    & self -> pmorig, bsize, opt_cs_data, cs_bytes, & num_read );
+                                if ( rc == 0 )
+                                {
+                                    if ( num_read != cs_bytes )
+                                        rc = RC ( rcDB, rcBlob, rcReading, rcTransfer, rcIncomplete );
+                                    else
+                                    {
+                                        /* success - read the blob AND the checksum data */
+                                        return 0;
+                                    }
+                                }
+                                break;
+                            }
+                        }
+                    }
+
+                    KDataBufferWhack ( buffer );
+                }
+            }
+        }
+
+        memset ( buffer, 0, sizeof * buffer );
+    }
+
+    return rc;
+}
+
+/* KColumnBlobAppend
+ *  append data to open blob
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - blob data
+ */
+LIB_EXPORT rc_t CC KColumnBlobAppend ( KColumnBlob *self, const void *buffer, size_t size )
+{
+    KColumn *col;
+    size_t total, num_writ;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcBlob, rcWriting, rcSelf, rcNull );
+
+    /* data fork will refuse write anyway, but... */
+    if ( self -> read_only )
+        return RC ( rcDB, rcBlob, rcWriting, rcBlob, rcReadonly );
+
+    col = self -> col;
+
+    for ( total = 0; total < size; total += num_writ )
+    {
+        rc_t rc = KColumnDataWrite ( & col -> df,
+            & self -> pmnew, self -> num_writ + total,
+            ( const char* ) buffer + total, size - total, & num_writ );
+        if ( rc != 0 )
+            return rc;
+        if ( num_writ == 0 )
+            return RC ( rcDB, rcBlob, rcWriting, rcTransfer, rcIncomplete );
+    }
+
+    self -> num_writ += size;
+
+    switch ( col -> checksum )
+    {
+    case kcsCRC32:
+        self -> crc32 = CRC32 ( self -> crc32, buffer, size );
+        break;
+    case kcsMD5:
+        MD5StateAppend ( & self -> md5, buffer, size );
+        break;
+    }
+    
+    return 0;
+}
+
+/* KColumnBlobAssignRange
+ *  assign a total id range to blob at any time before commit
+ *
+ *  "first" [ IN ] and "count" [ IN ] - range parameters for assign
+ */
+LIB_EXPORT rc_t CC KColumnBlobAssignRange ( KColumnBlob *self, int64_t first, uint32_t count )
+{
+    rc_t rc;
+    const KColumn *col;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcBlob, rcUpdating, rcSelf, rcNull );
+
+    if ( count == 0 )
+        return RC ( rcDB, rcBlob, rcUpdating, rcRange, rcEmpty );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcBlob, rcUpdating, rcBlob, rcReadonly );
+
+    if ( self -> loc . id_range != 0 )
+    {
+        /* allow benign reassignment */
+        if ( self -> loc . start_id == first &&
+             self -> loc . id_range == count )
+            return 0;
+
+        /* can't be reset */
+        return RC ( rcDB, rcBlob, rcUpdating, rcBlob, rcBusy );
+    }
+
+    col = self -> col;
+
+    /* try to open read map */
+    rc = KColumnBlobOpenRead ( self, col, first );
+    if ( rc == 0 )
+    {
+        /* blob already exists
+           again, allow benign reassignment */                    
+        if ( self -> loc . start_id == first &&
+             self -> loc . id_range == count )
+            return 0;
+
+        /* conflicting assignment */
+        KColumnPageMapWhack ( & self -> pmorig, & col -> df );
+        memset ( & self -> loc, 0, sizeof self -> loc );
+        memset ( & self -> pmorig, 0, sizeof self -> pmorig );
+        return RC ( rcDB, rcBlob, rcUpdating, rcRange, rcIncorrect );
+    }
+
+    /* expect status of not found */
+    if ( GetRCState ( rc ) != rcNotFound )
+        return rc;
+
+    /* assign the range */
+    self -> loc . pg = 0;
+    self -> loc . u . blob . remove = 0;
+    self -> loc . start_id = first;
+    self -> loc . id_range = count;
+    return 0;
+}
+
+/* KColumnBlobCommit
+ *  commit changes to blob
+ *  close to further updates
+ */
+static
+char zero [ 4096 ];
+
+static
+rc_t KColumnBlobZeroPad ( KColumnBlob *self )
+{
+    KColumn *col = self -> col;
+    size_t pad_bytes = self -> num_writ % col -> df . pgsize;
+    if ( pad_bytes != 0 )
+    {
+        size_t total, num_writ;
+
+        pad_bytes = col -> df . pgsize - pad_bytes;
+        for ( total = 0; total < pad_bytes; total += num_writ )
+        {
+            rc_t rc;
+
+            size_t to_write = pad_bytes - total;
+            if ( to_write > sizeof zero )
+                to_write = sizeof zero;
+
+            rc = KColumnDataWrite ( & col -> df,
+                & self -> pmnew, self -> num_writ + total,
+                zero, to_write, & num_writ );
+            if ( rc != 0 )
+                return rc;
+            if ( num_writ == 0 )
+                return RC ( rcDB, rcBlob, rcCommitting, rcTransfer, rcIncomplete );
+        }
+    }
+    return 0;
+}
+
+static
+rc_t KColumnBlobDoCommit ( KColumnBlob *self )
+{
+    rc_t rc;
+    KColBlobLoc loc;
+    KColumn *col = self -> col;
+
+    /* finish checksum */
+    if ( col -> csbytes != 0 )
+    {
+        MD5State md5;
+        uint32_t crc32;
+        uint8_t digest [ 16 ];
+
+        void *cs;
+        size_t num_writ;
+
+        switch ( col -> checksum )
+        {
+        case kcsCRC32:
+            crc32 = self -> crc32;
+            if ( self -> bswap )
+                crc32 = bswap_32 ( crc32 );
+            cs = & crc32;
+            break;
+        case kcsMD5:
+        default: /* to quiet compiler warnings */
+            /* work on copy in case of failure */
+            md5 = self -> md5;
+            MD5StateFinish ( & md5, digest );
+            cs = digest;
+            break;
+        }
+
+        rc = KColumnDataWrite ( & col -> df,
+            & self -> pmnew, self -> num_writ,
+            cs, col -> csbytes, & num_writ );
+        if ( rc != 0 )
+            return rc;
+        if ( num_writ != col -> csbytes )
+            return RC ( rcDB, rcBlob, rcCommitting, rcTransfer, rcIncomplete );
+
+        self -> num_writ += num_writ;
+    }
+
+    /* extract index information */
+    rc = KColumnPageMapId ( & self -> pmnew, & col -> df, & loc . pg );
+    if ( rc == 0 )
+    {
+        loc . u . blob . size = ( uint32_t ) self -> num_writ;
+        loc . u . blob . remove = 0;
+        loc . start_id = self -> loc . start_id;
+        loc . id_range = self -> loc . id_range;
+
+        /* pad out rest of page */
+        if ( col -> df . pgsize > 1 )
+            rc = KColumnBlobZeroPad ( self );
+        if ( rc == 0 )
+        {
+            /* commit data fork */
+            rc = KColumnDataCommit ( & col -> df,
+                & self -> pmnew, self -> num_writ );
+            if ( rc == 0 )
+            {
+                /* commit index fork */
+                rc = KColumnIdxCommit ( & col -> idx, col -> md5,
+                    & loc, col -> commit_freq, col -> df . eof,
+                    col -> df . pgsize, col -> checksum );
+                if ( rc == 0 || rc == kdbReindex )
+                {
+                    rc_t status = rc;
+
+                    /* release old pages */
+                    if ( self -> loc . u . blob . size == 0 )
+                        rc = 0;
+                    else
+                    {
+                        rc = KColumnDataFree ( & col -> df,
+                            & self -> pmorig, self -> loc . u . blob . size + col -> csbytes );
+                        if ( GetRCState ( rc ) == rcInvalid )
+                            rc = 0;
+                    }
+
+                    if ( rc == 0 )
+                    {
+                        /* transfer new map */
+                        self -> pmorig = self -> pmnew;
+                        memset ( & self -> pmnew, 0, sizeof self -> pmnew );
+
+                        /* fill out location */
+                        loc . u . blob . size -= col -> csbytes;
+                        self -> loc = loc;
+
+                        /* HACK - should open new pm on demand
+                           but since the code does not yet support it,
+                           disallow further writes */
+                        self -> read_only = true;
+                        
+                        /* mark blob as clean */
+                        self -> num_writ = 0;
+
+			/* these must not be a point of failure 
+			   The only failure from the KMD5FileCommit
+			   behind these is on NULL parameter */
+			rc = KColumnDataCommitDone ( & col -> df );
+			if ( rc == 0 )
+			    rc = KColumnIdxCommitDone ( & col -> idx );
+
+                        return status;
+                    }
+                }
+
+                /* revert data fork */
+                KColumnDataFree ( & col -> df,
+                    & self -> pmnew, self -> num_writ );
+		KMD5FileRevert ( self -> col -> df . fmd5 );
+            }
+        }
+    }
+
+    /* remove checksum bytes */
+    self -> num_writ -= col -> csbytes;
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnBlobCommit ( KColumnBlob *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcBlob, rcCommitting, rcSelf, rcNull );
+
+    if ( self -> loc . id_range == 0 )
+        return RC ( rcDB, rcBlob, rcCommitting, rcRange, rcInvalid );
+
+    if ( self -> num_writ == 0 && self -> loc . u . blob . size != 0 )
+        return 0;
+
+    assert ( self -> read_only == false );
+
+    rc = KColumnBlobDoCommit ( self );
+
+    if ( rc == kdbReindex )
+        rc = KColumnReindex ( self -> col );
+
+    return rc;
+}
diff --git a/libs/kdb/wdatabase-priv.h b/libs/kdb/wdatabase-priv.h
new file mode 100644
index 0000000..958089e
--- /dev/null
+++ b/libs/kdb/wdatabase-priv.h
@@ -0,0 +1,95 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_database_priv_
+#define _h_database_priv_
+
+#ifndef _h_kdb_manager_
+#include <kdb/manager.h>
+#endif
+
+#ifndef _h_kdb_database_
+#include <kdb/database.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#include <klib/symbol.h>
+#include <kfs/md5.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KDatabase
+ *  connection to a database within file system
+ */
+struct KDatabase
+{
+    /* manager reference */
+    KDBManager *mgr;
+
+    /* if a sub-directory */
+    KDatabase *dad;
+
+    /* database directory */
+    KDirectory *dir;
+
+    KMD5SumFmt *md5;
+
+    /* open references */
+    KRefcount refcount;
+    uint32_t opencount;
+    bool use_md5;
+    bool read_only;
+
+    KSymbol sym;
+
+    char path [1];
+};
+
+/* Attach
+ * Sever
+ *  like AddRef/Release, except called internally
+ *  indicates that a child object is letting go...
+ */
+KDatabase *KDatabaseAttach ( const KDatabase *self );
+rc_t KDatabaseSever ( const KDatabase *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_database_priv_ */
diff --git a/libs/kdb/wdatabase.c b/libs/kdb/wdatabase.c
new file mode 100644
index 0000000..e35b41b
--- /dev/null
+++ b/libs/kdb/wdatabase.c
@@ -0,0 +1,1642 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "database-priv.h"
+#include "dbmgr-priv.h"
+#include "wtable-priv.h"
+#include "windex-priv.h"
+#include "wkdb-priv.h"
+#include <klib/namelist.h>
+#include <klib/symbol.h>
+#include <klib/log.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/impl.h>
+#include <kfs/md5.h>
+#include <vfs/manager.h>
+#include <vfs/manager-priv.h>
+#include <vfs/path.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KDatabase
+ *  connection to a database within file system
+ */
+
+/* GetPath
+ *  return the absolute path to DB
+ */
+LIB_EXPORT rc_t CC KDatabaseGetPath ( struct KDatabase const *self,
+    const char **path )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+    if ( path == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    *path = self->path;
+    return 0;
+}
+
+/* Whack
+ */
+static
+rc_t KDatabaseWhack ( KDatabase *self )
+{
+    rc_t rc = 0;
+    KDBManager *mgr = self -> mgr;
+    KSymbol * symb;
+    assert ( mgr != NULL );
+
+    KRefcountWhack ( & self -> refcount, "KDatabase" );
+
+    /* release dad */
+    if ( self -> dad != NULL )
+    {
+        rc = KDatabaseSever ( self -> dad );
+        if ( rc != 0 )
+            return rc;
+        self -> dad = NULL;
+    }
+
+    /* shut down md5 sum file if it is open */
+    KMD5SumFmtRelease ( self -> md5 ), self -> md5 = NULL;
+
+    /* remove from mgr */
+    symb = KDBManagerOpenObjectFind (mgr, self->path);
+    if (symb != NULL)
+    {
+        rc = KDBManagerOpenObjectDelete (mgr, symb);
+        if (rc == 0)
+        {
+            /* release manager
+               should never fail */
+            rc = KDBManagerSever ( mgr );
+            if ( rc != 0 )
+                rc = KDBManagerOpenObjectAdd (mgr, symb);
+            else
+            {
+                /* complete */
+                KDirectoryRelease ( self -> dir );
+                free ( self );
+                return 0;
+            }
+        }
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "KDatabase", "whack", "kdb" );
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KDatabaseAddRef ( const KDatabase *cself )
+{
+    KDatabase *self = ( KDatabase* ) cself;
+    if ( cself != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcDatabase, rcAttaching, rcRange, rcExcessive );
+        }
+        ++ self -> opencount;
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KDatabaseRelease ( const KDatabase *cself )
+{
+    KDatabase *self = ( KDatabase* ) cself;
+    if ( cself != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefWhack:
+            return KDatabaseWhack ( ( KDatabase* ) self );
+        case krefLimit:
+            return RC ( rcDB, rcDatabase, rcReleasing, rcRange, rcExcessive );
+        }
+        -- self -> opencount;
+    }
+    return 0;
+}
+
+
+/* Attach
+ */
+KDatabase *KDatabaseAttach ( const KDatabase *cself )
+{
+    KDatabase *self = ( KDatabase* ) cself;
+    if ( cself != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return self;
+}
+
+/* Sever
+ *  like Release, except called internally
+ *  indicates that a child object is letting go...
+ */
+rc_t KDatabaseSever ( const KDatabase *cself )
+{
+    KDatabase *self = ( KDatabase* ) cself;
+    if ( cself != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KDatabase" ) )
+        {
+        case krefWhack:
+            return KDatabaseWhack ( ( KDatabase* ) self );
+        case krefLimit:
+            return RC ( rcDB, rcDatabase, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make
+ *  make an initialized structure
+ *  NB - does NOT attach reference to dir, but steals it
+ */
+static
+rc_t KDatabaseMake ( KDatabase **dbp, const KDirectory *dir,
+    const char *path, KMD5SumFmt *md5, bool read_only )
+{
+    KDatabase *db;
+    rc_t rc = 0;
+
+    assert ( dbp != NULL );
+    assert ( path != NULL );
+
+    db = malloc ( sizeof * db + strlen ( path ) );
+    if ( db == NULL )
+    {
+        * dbp = NULL;
+        return RC ( rcDB, rcDatabase, rcConstructing, rcMemory, rcExhausted );
+    }
+
+    memset ( db, 0, sizeof * db );
+    db -> dir = ( KDirectory* ) dir;
+    db -> md5 = md5;
+    rc = KMD5SumFmtAddRef ( md5 );
+    db -> cmode = kcmOpen; /* to be set later by the caller */
+    db -> checksum = kcsNone; /* to be set later in VTableColumnCreateParams */
+
+    if ( md5 != NULL )
+        db -> cmode |= kcmMD5;
+
+    KRefcountInit ( & db -> refcount, 1, "KDatabase", "make", path );
+    db -> opencount = 1;
+    db -> read_only = read_only;
+
+    strcpy ( db -> path, path );
+
+    db->sym.u.obj = db;
+    StringInitCString (&db->sym.name, db->path);
+    db->sym.type = kptDatabase;
+
+    * dbp = db;
+    return rc;
+}
+
+static
+rc_t KDatabaseMakeVPath ( KDatabase **dbp, const KDirectory *dir,
+    const VPath *path, KMD5SumFmt *md5, bool read_only )
+{
+    const String* dbpathStr;
+    rc_t rc = VPathMakeString ( path, &dbpathStr );    /* NUL-terminated */
+    if ( rc == 0 )
+    {
+        rc = KDatabaseMake ( dbp, dir, dbpathStr->addr, md5, read_only );
+        StringWhack(dbpathStr);
+    }
+    return rc;
+}
+
+static
+rc_t KDBManagerInsertDatabase ( KDBManager * self, KDatabase * db )
+{
+    rc_t rc;
+    rc = KDBManagerOpenObjectAdd (self, &db->sym);
+    if ( rc == 0 )
+        db -> mgr = KDBManagerAttach ( self );
+    return rc;
+}
+
+
+static
+rc_t KDBManagerMakeDBUpdate ( KDBManager *self,
+    KDatabase **dbp, KDirectory *wd, const char *path, KMD5SumFmt *md5 )
+{
+    rc_t rc;
+    KDirectory *dir;
+
+    rc = KDirectoryOpenDirUpdate ( wd, & dir, false, "%s", path );
+    if ( rc == 0 )
+    {
+        KDatabase *db;
+	    
+        /* Make the base object */
+        rc = KDatabaseMake ( & db, dir, path, md5, false );
+        if ( rc == 0 )
+        {
+            rc = KDBManagerInsertDatabase ( self, db );
+
+            if ( rc == 0 )
+            {
+                * dbp = db;
+                return 0;   /* successful exit */
+            }
+
+            rc = RC ( rcDB, rcMgr, rcOpening, rcDatabase, rcBusy );
+                
+            free ( db );
+        }
+        KDirectoryRelease ( dir );
+    }
+    return rc;
+}
+
+
+/* CreateDB
+ * VCreateDB
+ *  create a new or open an existing database
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+static
+rc_t KDBManagerVCreateDBInt ( KDBManager *self,
+    KDatabase **db, KDirectory *wd, KCreateMode cmode,
+    const char *path, va_list args )
+{
+    char dbpath [ 4096 ];
+    rc_t rc = KDirectoryVResolvePath ( wd, true,
+        dbpath, sizeof dbpath, path, args );
+    if ( rc == 0 )
+    {
+        /* we won't try accession resolution here */
+        int type = KDBPathType ( /*NULL,*/ wd, NULL, dbpath );
+        switch ( type )
+        {
+        case kptNotFound:
+            /* first good path */
+            break;
+
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcCreating, rcPath, rcInvalid );
+
+        case kptDatabase:
+        case kptDatabase | kptAlias:
+            /* found so is not good if we want to create new and not
+             * clear/init or open old
+             */
+            if ((cmode & kcmValueMask) == kcmCreate)
+                return RC ( rcDB, rcMgr, rcCreating, rcDatabase, rcExists );
+            if (KDBManagerOpenObjectBusy (self, dbpath))
+                return RC ( rcDB, rcMgr, rcCreating, rcDatabase, rcBusy );
+            /* test now for locked directory */
+            rc = KDBWritable ( wd, dbpath );
+            if (rc)
+            {
+                switch (GetRCState(rc))
+                {
+                default:
+                    return rc;
+                case rcLocked:
+                    return RC ( rcDB, rcMgr, rcCreating, rcDatabase, rcLocked );
+                case rcReadonly:
+                    return RC ( rcDB, rcMgr, rcCreating, rcDatabase, rcReadonly );
+                case rcNotFound:
+                    /* not found is good but probably unreachable */
+                    break;
+                case 0:
+                    rc = 0;
+                    break;
+                }
+            }
+            /* second good path */
+            break;
+
+        case kptTable:
+        case kptTable | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcTable, rcExists);
+
+        case kptColumn:
+        case kptColumn | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcColumn, rcExists);
+
+        case kptIndex:
+        case kptIndex | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcIndex, rcExists);
+
+        case kptMetadata:
+        case kptMetadata | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcMetadata, rcExists);
+
+	case kptFile:
+	case kptFile | kptAlias:
+	    /* if we find a file, vary the failure if it is an archive that is a database
+	     * or a non related file */
+	    if ( KDBOpenPathTypeRead ( self, wd, dbpath, NULL, kptDatabase, NULL, false ) == 0 )
+		return RC ( rcDB, rcMgr, rcCreating, rcDirectory, rcUnauthorized );
+	    /* fall through */
+        default:
+            return RC ( rcDB, rcMgr, rcCreating, rcPath, rcIncorrect );
+        }
+
+        /* [re]create directory */
+        rc = KDirectoryCreateDir ( wd, 0775, cmode, "%s", dbpath );
+        if (rc == 0)
+            /* create tbl subdirectory as required for db */
+            rc = KDirectoryCreateDir ( wd, 0775, kcmOpen, "%s/tbl", dbpath );
+
+        if ( rc == 0 )
+        {
+            KMD5SumFmt *md5 = NULL;
+
+            if ( ( cmode & kcmMD5 ) != 0 )
+            {
+                KFile * f;
+
+                /* if needed create the md5 digest file */
+                rc = KDirectoryCreateFile ( wd, &f, true, 0664, kcmOpen, "%s/md5", dbpath );
+                if ( rc == 0 )
+                {
+                    /* create a formatter around file
+                       formatter will own "f" afterward */
+                    rc = KMD5SumFmtMakeUpdate ( & md5, f );
+
+                    /* if failed to create formatter, release "f" */
+                    if ( rc != 0 )
+                        KFileRelease ( f );
+                }
+            }
+
+            if ( rc == 0 )
+                rc = KDBManagerMakeDBUpdate ( self, db, wd, dbpath, md5 );
+            /* TODO: for now set cmode here, externally to KDatabaseMake
+                maybe it's needed to refactor the whole chain from exported
+                Open/Create DB functions to the KDatabaseMake
+            */
+            if ( rc == 0 )
+                KDatabaseSetCmode ( *db, cmode );
+
+            KMD5SumFmtRelease ( md5 );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerVCreateDB ( KDBManager *self,
+    KDatabase **db, KCreateMode cmode, const char *path, va_list args )
+{
+    if ( db == NULL )
+        return RC ( rcDB, rcMgr, rcCreating, rcParam, rcNull );
+
+    * db = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcCreating, rcSelf, rcNull );
+
+    return KDBManagerVCreateDBInt ( self, db, self -> wd, cmode, path, args );
+}
+
+
+LIB_EXPORT rc_t CC KDBManagerCreateDB ( KDBManager *self,
+    KDatabase **db, KCreateMode cmode, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVCreateDB ( self, db, cmode, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* =====
+ * create a KDatabase as a sub of another KDatabase
+ */
+LIB_EXPORT rc_t CC KDatabaseCreateDB ( KDatabase *self,
+    KDatabase **db, KCreateMode cmode, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVCreateDB ( self, db, cmode, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVCreateDB ( KDatabase *self,
+    KDatabase **dbp, KCreateMode cmode, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( dbp == NULL )
+        return RC ( rcDB, rcDatabase, rcCreating, rcParam, rcNull );
+
+    * dbp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcCreating, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcDatabase, rcCreating, rcDatabase, rcReadonly );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "db", 2, name, args );
+    if ( rc == 0 )
+    {
+        /* ensure that the "db" namespace directory is there */
+        rc = KDirectoryCreateDir ( self -> dir,
+            0775, kcmOpen, "db" );
+        if ( rc == 0 )
+        {
+            rc = KDBManagerVCreateDBInt ( self -> mgr, dbp,
+                                          self -> dir, cmode, path, NULL );
+            if ( rc == 0 )
+            {
+                KDatabase *db = ( KDatabase* ) * dbp;
+                db -> dad = self;
+                atomic32_inc ( & self -> refcount );
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* OpenDBRead
+ * VOpenDBRead
+ *  open a database for read
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+static
+rc_t KDBManagerVOpenDBReadInt ( const KDBManager *cself,
+    const KDatabase **dbp, KDirectory *wd,
+    const char *path, va_list args, bool *cached, bool try_srapath )
+{
+    char key_path[ 4096 ];
+	char short_path[ 4096 ];
+	size_t z;
+	rc_t rc = string_vprintf( short_path, sizeof short_path, &z, path, args );
+	if ( rc == 0 )
+		rc = KDirectoryResolvePath ( wd, true, key_path, sizeof key_path, short_path );
+    if ( rc == 0 )
+    {
+        KSymbol *sym;
+
+        /* if already open */
+        sym = KDBManagerOpenObjectFind( cself, key_path );
+        if ( sym != NULL )
+        {
+            const KDatabase *cdb;
+            rc_t obj;
+
+            if ( cached != NULL )
+                * cached = true;
+
+            switch (sym->type)
+            {
+            case kptDatabase:
+                cdb = (KDatabase*)sym->u.obj;
+                /* if open for update, refuse */
+                if ( cdb -> read_only )
+                {
+                    /* attach a new reference and we're gone */
+                    rc = KDatabaseAddRef ( cdb );
+                    if ( rc == 0 )
+                        * dbp = cdb;
+                    return rc;
+                }
+                obj = rcDatabase;
+                break;
+
+            default:
+                obj = rcPath;
+                break;
+            case kptTable:
+                obj = rcTable;
+                break;
+            case kptColumn:
+                obj = rcColumn;
+                break;
+            case kptIndex:
+                obj = rcIndex;
+                break;
+            case kptMetadata:
+                obj = rcMetadata;
+                break;
+            }
+            rc = RC (rcDB, rcMgr, rcOpening, obj, rcBusy);
+        }
+        else
+        {
+			const KDirectory *dir;
+
+			if ( cached != NULL )
+				* cached = false;
+
+			/* open the directory if its a database */
+			rc = KDBOpenPathTypeRead ( cself, wd, short_path, &dir, kptDatabase, NULL, try_srapath );
+			if ( rc == 0 )
+			{
+				KDatabase *db;
+
+				rc = KDatabaseMake ( &db, dir, key_path, NULL, true );
+				if ( rc == 0 )
+				{
+					KDBManager *self = ( KDBManager* ) cself;
+
+					rc = KDBManagerInsertDatabase ( self, db );
+					if ( rc == 0 )
+					{
+						* dbp = db;
+						return 0;
+					}
+					free (db);
+				}
+				KDirectoryRelease (dir);
+			}
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDBManagerOpenDBRead ( const KDBManager *self,
+    const KDatabase **db, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVOpenDBRead ( self, db, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerVOpenDBRead ( const KDBManager *self,
+    const KDatabase **db, const char *path, va_list args )
+{
+    if ( db == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcParam, rcNull );
+
+    * db = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcSelf, rcNull );
+
+    return KDBManagerVOpenDBReadInt ( self, db, self -> wd, path, args, NULL, true );
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenDBRead ( const KDatabase *self,
+    const KDatabase **db, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVOpenDBRead ( self, db, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVOpenDBRead ( const KDatabase *self,
+    const KDatabase **dbp, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( dbp == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * dbp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "db", 2, name, args );
+    if ( rc == 0 )
+    {
+        bool is_cached;
+        rc = KDBManagerVOpenDBReadInt ( self -> mgr, dbp,
+                                        self -> dir, path, NULL, & is_cached, false );
+        if ( rc == 0 && ! is_cached )
+        {
+            KDatabase *db = ( KDatabase* ) * dbp;
+            db -> dad = KDatabaseAttach ( self );
+        }
+    }
+
+    return rc;
+}
+
+
+/* OpenDBUpdate
+ * VOpenDBUpdate
+ *  open a database for read/write
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+static
+rc_t KDBManagerVOpenDBUpdateInt ( KDBManager *self,
+    KDatabase **db, KDirectory *wd, const char *path, va_list args )
+{
+    char dbpath [ 4096 ];
+    rc_t rc = KDirectoryVResolvePath ( wd, true,
+        dbpath, sizeof dbpath, path, args );
+    if ( rc == 0 )
+    {
+        KSymbol * sym;
+        KFile *f;
+        KMD5SumFmt * md5 = NULL;
+
+        /* if already open, refuse */
+        sym = KDBManagerOpenObjectFind (self, dbpath);
+        if (sym != NULL)
+        {
+            rc_t obj;
+            switch (sym->type)
+            {
+            default:
+                obj = rcPath;
+                break;
+            case kptDatabase:
+                obj = rcDatabase;
+                break;
+            case kptTable:
+                obj = rcTable;
+                break;
+            case kptColumn:
+                obj = rcColumn;
+                break;
+            case kptIndex:
+                obj = rcIndex;
+                break;
+            case kptMetadata:
+                obj = rcMetadata;
+                break;
+            }
+            return RC ( rcDB, rcMgr, rcOpening, obj, rcBusy );
+        }
+        /* only open existing dbs */
+        switch (KDBPathType ( /*self,*/ wd, NULL, dbpath ) )
+        {
+        case kptNotFound:
+            return RC ( rcDB, rcMgr, rcOpening, rcDatabase, rcNotFound );
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcInvalid );
+	case kptFile:
+	case kptFile | kptAlias:
+	    /* if we find a file, vary the failure if it is an archive that is a database
+	     * or a non related file */
+	    if ( KDBOpenPathTypeRead ( self, wd, dbpath, NULL, kptDatabase, NULL, false ) == 0 )
+		return RC ( rcDB, rcMgr, rcOpening, rcDirectory, rcUnauthorized );
+	    /* fall through */
+        default:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcIncorrect );
+        case kptDatabase:
+        case kptDatabase | kptAlias:
+            break;
+        }
+
+        /* test now for locked directory */
+        rc = KDBWritable (wd, dbpath);
+        switch (GetRCState (rc))
+        {
+        default:
+#if 0
+            return RC ( rcDB, rcMgr, rcOpening, rcDatabase, rcNoPerm ); /* TBD: better state? */
+#endif
+
+        case rcLocked:
+            return RC ( rcDB, rcMgr, rcOpening, rcDatabase, rcLocked );
+
+        case rcReadonly:
+            return RC ( rcDB, rcMgr, rcOpening, rcDatabase, rcReadonly );
+
+
+        case 0:
+            rc = 0;
+            break;
+        }
+
+        rc = KDirectoryOpenFileWrite ( wd, &f, true, "%s/md5", dbpath );
+        if ( rc == 0 )
+        {
+            rc = KMD5SumFmtMakeUpdate ( & md5, f );
+            if ( rc != 0 )
+                KFileRelease ( f );
+        }
+        else if ( GetRCState ( rc ) == rcNotFound )
+            rc = 0;
+
+        if ( rc == 0 )
+            rc = KDBManagerMakeDBUpdate ( self, db, wd, dbpath, md5 );
+
+        KMD5SumFmtRelease ( md5 );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerOpenDBUpdate ( KDBManager *self,
+    KDatabase **db, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVOpenDBUpdate ( self, db, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerVOpenDBUpdate ( KDBManager *self,
+    KDatabase **db, const char *path, va_list args )
+{
+    if ( db == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcParam, rcNull );
+
+    * db = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcSelf, rcNull );
+
+    return KDBManagerVOpenDBUpdateInt ( self, db, self -> wd, path, args );
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenDBUpdate ( KDatabase *self,
+    KDatabase **db, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVOpenDBUpdate ( self, db, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVOpenDBUpdate ( KDatabase *self,
+    KDatabase **dbp, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( dbp == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * dbp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcDatabase, rcOpening, rcDatabase, rcReadonly );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "db", 2, name, args );
+    if ( rc == 0 )
+    {
+        rc = KDBManagerVOpenDBUpdateInt ( self -> mgr, dbp,
+                                         self -> dir, path, NULL );
+        if ( rc == 0 )
+        {
+            KDatabase *db = ( KDatabase* ) * dbp;
+            db -> dad = self;
+            atomic32_inc ( & self -> refcount );
+        }
+    }
+
+    return rc;
+}
+
+
+/* Locked
+ *  returns non-zero if locked
+ */
+LIB_EXPORT bool CC KDatabaseLocked ( const KDatabase *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return false;
+
+    rc = KDBWritable ( self -> dir, "." );
+    return GetRCState ( rc ) == rcLocked;
+}
+
+/* Exists
+ *  returns true if requested object exists
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptTable
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT bool CC KDatabaseVExists ( const KDatabase *self, uint32_t type, const char *name, va_list args )
+{
+    if ( self != NULL && name != NULL && name [ 0 ] != 0 )
+    {
+        rc_t rc;
+        size_t len;
+        const char *ns;
+        char path [ 256 ];
+
+        switch ( type )
+        {
+        case kptDatabase:
+            ns = "db";
+            len = 2;
+            break;
+
+        case kptTable:
+            ns = "tbl";
+            len = 3;
+            break;
+
+        case kptIndex:
+            ns = "idx";
+            len = 3;
+            break;
+
+        default:
+            return false;
+        }
+
+        rc = KDBVMakeSubPath ( self -> dir, path, sizeof path, ns, len, name, args );
+        if ( rc == 0 )
+        {
+            switch ( KDirectoryPathType ( self -> dir, "%s", path ) )
+            {
+            case kptFile:
+            case kptDir:
+            case kptFile | kptAlias:
+            case kptDir | kptAlias:
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+LIB_EXPORT bool CC KDatabaseExists ( const KDatabase *self, uint32_t type, const char *name, ... )
+{
+    bool exists;
+
+    va_list args;
+    va_start ( args, name );
+
+    exists = KDatabaseVExists ( self, type, name, args );
+
+    va_end ( args );
+
+    return exists;
+}
+
+
+/* IsAlias
+ *  returns true if object name is an alias
+ *  returns path to fundamental name if it was aliased
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - optional output buffer
+ *  for fundamenta object name if "alias" is not a fundamental name, 
+ *
+ *  "name" [ IN ] - NUL terminated object name
+ */
+LIB_EXPORT bool CC KDatabaseIsAlias ( const KDatabase *self, uint32_t type,
+    char *resolved, size_t rsize, const char *name )
+{
+    if ( self != NULL && name != NULL && name [ 0 ] != 0 )
+    {
+        rc_t rc;
+        size_t len;
+        const char *ns;
+        char path [ 256 ];
+
+        switch ( type )
+        {
+        case kptDatabase:
+            ns = "db";
+            len = 2;
+            break;
+
+        case kptTable:
+            ns = "tbl";
+            len = 3;
+            break;
+
+        case kptIndex:
+            ns = "idx";
+            len = 3;
+            break;
+
+        default:
+            return false;
+        }
+
+        rc = KDBMakeSubPath ( self -> dir, path, sizeof path, ns, len, name );
+        if ( rc == 0 )
+        {
+            switch ( KDirectoryPathType ( self -> dir, "%s", path ) )
+            {
+            case kptFile | kptAlias:
+            case kptDir | kptAlias:
+                if ( resolved != NULL && rsize != 0 )
+                {
+                    const KDirectory *sub;
+                    rc = KDirectoryOpenDirRead ( self -> dir, & sub, false, "%s", ns );
+                    * resolved = 0;
+                    if ( rc != 0 )
+                        PLOGERR ( klogWarn, ( klogWarn, rc, "failed to open subdirectory '$(sub)'", "sub=%s", ns ) );
+                    else
+                    {
+                        rc = KDirectoryResolveAlias ( sub, false, resolved, rsize, "%s", name );
+                        KDirectoryRelease ( sub );
+                        if ( rc != 0 )
+                            PLOGERR ( klogWarn, ( klogWarn, rc, "failed to resolve alias '$(alias)'", "alias=%s", name ) );
+                    }
+                }
+                return true;
+            }
+        }
+    }
+
+    if ( resolved != NULL && rsize != 0 )
+        * resolved = 0;
+
+    return false;
+}
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+static
+rc_t KDatabaseLockInt (const KDatabase  * self, char * path, size_t path_size,
+                        int type, const char * name, va_list args )
+{
+    rc_t rc;
+
+    if (self == NULL)
+        rc = RC ( rcDB, rcMgr, rcAccessing, rcSelf, rcNull );
+
+    else if (name == NULL)
+        rc =  RC (rcDB, rcMgr, rcAccessing, rcPath, rcNull);
+
+    else
+    {
+        const char * ns;
+        char path [ 256 ];
+
+        ns = KDBGetNamespaceString (type);
+
+        switch (type)
+        {
+        default:
+            rc = RC (rcDB, rcMgr, rcAccessing, rcParam, rcInvalid);
+            break;
+        case kptDatabase:
+        case kptTable:
+/*         case kptIndex: */
+            rc = KDBVMakeSubPath (self->dir, path, sizeof path, ns, strlen (ns),
+                                  name, args);
+            break;
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVWritable ( const KDatabase *self, uint32_t type, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    rc = KDatabaseLockInt (self, path, sizeof path, type, name, args);
+    if (rc == 0)
+        rc = KDBWritable (self->dir, path);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseWritable ( const KDatabase *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVWritable ( self, type, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC KDatabaseVLock ( KDatabase *self, uint32_t type, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    char path [ 256 ];
+
+    rc = KDatabaseLockInt (self, path, sizeof path, type, name, args);
+    if (rc == 0)
+        rc = KDBLockDir (self->dir, path);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseLock ( KDatabase *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVLock (self, type, name, args);
+    va_end (args);
+    return rc;
+}
+
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC KDatabaseVUnlock ( KDatabase *self, uint32_t type, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    char path [ 256 ];
+
+    rc = KDatabaseLockInt (self, path, sizeof path, type, name, args);
+    if (rc == 0)
+        rc = KDBUnlockDir (self->dir, path);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseUnlock ( KDatabase *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, name );
+    rc = KDatabaseVUnlock (self, type, name, args);
+    va_end (args);
+    return rc;
+}
+
+
+/* Rename
+ */
+LIB_EXPORT rc_t CC KDatabaseRenameDB ( KDatabase *self, bool force, const char *from, const char *to )
+{
+    return KDBRename ( self -> dir, self -> mgr, kptDatabase, force, from, to );
+}
+
+LIB_EXPORT rc_t CC KDatabaseRenameTable ( KDatabase *self, bool force, const char *from, const char *to )
+{
+    return KDBRename ( self -> dir, self -> mgr, kptTable, force, from, to );
+}
+
+#if 1
+LIB_EXPORT rc_t CC KDatabaseRenameIndex ( KDatabase *self, bool force, const char *from, const char *to )
+{
+    return KDBRename ( self -> dir, self -> mgr, kptIndex, force, from, to );
+}
+#endif
+
+/* Alias
+ */
+LIB_EXPORT rc_t CC KDatabaseAliasDB ( KDatabase *self, const char *db, const char *alias )
+{
+    return KDBAlias ( self -> dir, kptDatabase, db, alias );
+}
+
+LIB_EXPORT rc_t CC KDatabaseAliasTable ( KDatabase *self, const char *tbl, const char *alias )
+{
+    return KDBAlias ( self -> dir, kptTable, tbl, alias );
+}
+
+LIB_EXPORT rc_t CC KDatabaseAliasIndex ( KDatabase *self, const char *idx, const char *alias )
+{
+    return KDBAlias ( self -> dir, kptIndex, idx, alias );
+}
+
+/* Drop
+ */
+
+LIB_EXPORT rc_t CC KDatabaseDropDB ( KDatabase *self, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVDropDB ( self, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVDropDB ( KDatabase *self, const char *name, va_list args )
+{
+    return KDBVDrop ( self -> dir, self -> mgr, kptDatabase, name, args );
+}
+
+LIB_EXPORT rc_t CC KDatabaseDropTable ( KDatabase *self, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVDropTable ( self, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVDropTable ( KDatabase *self, const char *name, va_list args )
+{
+    return KDBVDrop ( self -> dir, self -> mgr, kptTable, name, args );
+}
+
+#if 1
+LIB_EXPORT rc_t CC KDatabaseDropIndex ( KDatabase *self, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVDropIndex ( self, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVDropIndex ( KDatabase *self, const char *name, va_list args )
+{
+    return KDBVDrop ( self -> dir, self -> mgr, kptIndex, name, args );
+}
+#endif
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KDatabaseOpenManagerRead ( const KDatabase *self, const KDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenManagerUpdate ( KDatabase *self, KDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KDatabaseOpenParentRead ( const KDatabase *self, const KDatabase **par )
+{
+    rc_t rc;
+
+    if ( par == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDatabaseAddRef ( self -> dad );
+            if ( rc == 0 )
+            {
+                * par = self -> dad;
+                return 0;
+            }
+        }
+
+        * par = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenParentUpdate ( KDatabase *self, KDatabase **par )
+{
+    rc_t rc;
+
+    if ( par == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else if ( self -> dad != NULL && self -> dad -> read_only )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcDatabase, rcReadonly );
+        else
+        {
+            rc = KDatabaseAddRef ( self -> dad );
+            if ( rc == 0 )
+            {
+                * par = self -> dad;
+                return 0;
+            }
+        }
+
+        * par = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenDirectory
+ *  access the directory in use
+ */
+LIB_EXPORT rc_t CC KDatabaseOpenDirectoryRead ( const KDatabase *self, const KDirectory **dir )
+{
+    rc_t rc;
+
+    if ( dir == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * dir = self -> dir;
+            return KDirectoryAddRef ( * dir );
+        }
+
+        * dir = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenDirectoryUpdate ( KDatabase *self, KDirectory **dir )
+{
+    rc_t rc;
+
+    if ( dir == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+         else if ( self -> dir != NULL && self -> dir -> read_only )
+             rc = RC ( rcDB, rcDatabase, rcAccessing, rcDirectory, rcReadonly );
+        else
+        {
+            * dir = self -> dir;
+            return KDirectoryAddRef ( * dir );
+        }
+
+        * dir = NULL;
+    }
+
+    return rc;
+}
+
+
+/* ModDate
+ *  get modification date
+ */
+LIB_EXPORT rc_t CC KDatabaseModDate ( const KDatabase *self, KTime_t *mtime )
+{
+    rc_t rc;
+
+    if ( mtime == NULL )
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self != NULL )
+            return KDBGetObjModDate ( self -> dir, mtime );
+
+        rc = RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        * mtime = 0;
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KNamelist
+ */
+
+/* List
+ *  create database listings
+ */
+struct FilterData
+{
+    const KDBManager * mgr;
+    int type;
+};
+
+static
+bool CC KDatabaseListFilter ( const KDirectory *dir, const char *name, void *data_ )
+{
+    struct FilterData * data = data_;
+    return ( KDBOpenPathTypeRead ( data->mgr, dir, name, NULL, data->type, NULL, false ) == 0 );
+}
+
+LIB_EXPORT rc_t CC KDatabaseListDB ( const KDatabase *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        struct FilterData data;
+        data.mgr = self->mgr;
+        data.type = kptDatabase;
+
+        return KDirectoryList ( self -> dir,
+            names, KDatabaseListFilter, &data, "db" );
+    }
+
+    if ( names != NULL )
+        * names = NULL;
+
+    return RC ( rcDB, rcDatabase, rcListing, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC KDatabaseListTbl ( struct KDatabase const *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        struct FilterData data;
+        data.mgr = self->mgr;
+        data.type = kptTable;
+
+        return KDirectoryList ( self -> dir,
+            names, KDatabaseListFilter, &data, "tbl" );
+    }
+
+    if ( names != NULL )
+        * names = NULL;
+
+    return RC ( rcDB, rcDatabase, rcListing, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC KDatabaseListIdx ( struct KDatabase const *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        struct FilterData data;
+        data.mgr = self->mgr;
+        data.type = kptIndex;
+
+        return KDirectoryList ( self -> dir,
+            names, KDatabaseListFilter, &data, "idx" );
+    }
+
+    if ( names != NULL )
+        * names = NULL;
+
+    return RC ( rcDB, rcDatabase, rcListing, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC KDBManagerVPathOpenLocalDBRead ( struct KDBManager const * self,
+    struct KDatabase const ** p_db, struct VPath const * vpath )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+    if ( p_db == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    if ( vpath == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+        
+    {   
+        /* vpath has already been resolved and is known to be a local path. 
+           open it if it is a database; avoid an additional round of resolution */
+        const KDirectory *dir;
+        rc_t rc = VFSManagerOpenDirectoryReadDirectoryRelativeDecrypt ( self -> vfsmgr, self -> wd, &dir, vpath );
+        if ( rc == 0 )
+        {
+            if ( ( (~kptAlias) & KDBPathType ( dir, NULL, "." ) ) != kptDatabase )
+            {
+                rc = RC ( rcDB, rcMgr, rcOpening, rcDatabase, rcIncorrect );
+            }
+            else
+            {
+                KDatabase *db;
+
+                rc = KDatabaseMakeVPath ( & db, dir, vpath, NULL, true );
+                if ( rc == 0 )
+                {
+                    rc = KDBManagerInsertDatabase ( ( KDBManager* ) self, db );
+                    if ( rc == 0 )
+                    {
+                        * p_db = db;
+                        return 0;
+                    }
+                    free (db);
+                }
+            }
+
+            KDirectoryRelease ( dir );
+        }
+        return rc;
+    }
+} 
+
+LIB_EXPORT rc_t CC KDBManagerVPathOpenRemoteDBRead ( struct KDBManager const * self,
+    struct KDatabase const ** p_db, struct VPath const * remote, struct VPath const * cache )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+    if ( p_db == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    if ( remote == NULL )
+        return RC ( rcDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    /* cache == NULL is OK */    
+    
+    {   
+        /*  vpath has already been resolved and is known to be a remote URL. 
+            Open it if it is a database; use the provided cache; avoid an additional round of resolution */
+        const KDirectory *dir;
+        rc_t rc = VFSManagerOpenDirectoryReadDecryptRemote( self -> vfsmgr, &dir, remote, cache );
+        if ( rc == 0 )
+        {
+            if ( ( (~kptAlias) & KDBPathType ( dir, NULL, "." ) ) != kptDatabase )
+            {
+                rc = RC ( rcDB, rcMgr, rcOpening, rcDatabase, rcIncorrect );
+            }
+            else
+            {
+                KDatabase *db;
+
+                /* allocate a new guy */
+                rc = KDatabaseMakeVPath ( & db, dir, remote, NULL, true );
+                if ( rc == 0 )
+                {
+                    rc = KDBManagerInsertDatabase ( ( KDBManager* ) self, db );
+                    if ( rc == 0 )
+                    {
+                        * p_db = db;
+                        return 0;
+                    }
+                    free (db);
+                }
+            }
+
+            KDirectoryRelease ( dir );
+        }
+        return rc;
+    }
+}
+
+KCreateMode KDatabaseGetCmode ( const KDatabase *self)
+{
+    return self -> cmode;
+}
+KCreateMode KDatabaseSetCmode ( KDatabase *self, KCreateMode new_val)
+{
+    KCreateMode old_val = self -> cmode;
+    self -> cmode = new_val;
+    return old_val;
+}
+
+KChecksum KDatabaseGetChecksum ( const KDatabase *self)
+{
+    return self -> checksum;
+}
+KChecksum KDatabaseSetChecksum ( KDatabase *self, KChecksum new_val)
+{
+    KCreateMode old_val = self -> checksum;
+    self -> checksum = new_val;
+    return old_val;
+}
diff --git a/libs/kdb/wdbmgr.c b/libs/kdb/wdbmgr.c
new file mode 100644
index 0000000..045dab8
--- /dev/null
+++ b/libs/kdb/wdbmgr.c
@@ -0,0 +1,421 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+#include <kdb/extern.h>
+#include "libkdb.vers.h"
+#include "dbmgr-priv.h"
+#include "wkdb-priv.h"
+#include <kfs/impl.h>
+
+#include <vfs/manager.h>
+#include <vfs/resolver.h>
+#include <vfs/path.h>
+#include <vfs/path-priv.h>
+
+#include <klib/symbol.h>
+#include <klib/checksum.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * KDBManager
+ *  handle to library
+ */
+
+
+/* MakeUpdate
+ *  create library handle
+ */
+LIB_EXPORT rc_t CC KDBManagerMakeUpdate ( KDBManager **mgrp, KDirectory *wd )
+{
+    if ( wd == NULL || ! wd -> read_only )
+        return KDBManagerMake ( mgrp, wd, "make-update", NULL );
+
+    if ( mgrp != NULL )
+        * mgrp = NULL;
+
+    return RC ( rcDB, rcMgr, rcConstructing, rcDirectory, rcReadonly );
+}
+
+LIB_EXPORT rc_t CC KDBManagerMakeUpdateWithVFSManager (
+    KDBManager ** mgrp, KDirectory * wd, struct VFSManager * vfs )
+{
+    if ( wd == NULL || ! wd -> read_only )
+        return KDBManagerMake ( mgrp, wd, "make-update", vfs );
+
+    if ( mgrp != NULL )
+        * mgrp = NULL;
+
+    return RC ( rcDB, rcMgr, rcConstructing, rcDirectory, rcReadonly );
+}
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "path" [ IN ] - NUL terminated path
+ *
+ * TBD: Better reasons for non local paths
+ */
+static
+rc_t KDBManagerWritableInt ( const KDirectory * dir, const char * path )
+{
+    rc_t rc;
+
+    int type = KDBPathType ( /*NULL,*/ dir, NULL, path ) & ~ kptAlias;
+    switch ( type )
+    {
+    case kptDatabase:
+    case kptTable:
+    case kptPrereleaseTbl:
+    case kptColumn:
+        rc = KDBWritable ( dir, path );
+        break;
+
+    case kptIndex:
+    case kptMetadata:
+        /* a wrong database type */
+        rc = RC ( rcDB, rcMgr, rcAccessing, rcPath, rcIncorrect );
+        break;
+#if 0
+        /*TBD - eventually we need to check for an archive here */
+    case kptFile: 
+        /* check if this is an archive .tar or .sra and return rcReadonly if it is */
+#endif
+    case kptNotFound:
+        rc = RC ( rcDB, rcMgr, rcAccessing, rcPath, rcNotFound );
+        break;
+    case kptBadPath:
+        rc = RC ( rcDB, rcMgr, rcAccessing, rcPath, rcInvalid );
+        break;
+    default:
+        rc = RC ( rcDB, rcMgr, rcAccessing, rcPath, rcIncorrect );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerVWritable ( const KDBManager *self, const char * path, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcDB, rcMgr, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        char dbpath [ 4096 ];
+
+        /* get full path to object */
+        rc = KDirectoryVResolvePath ( self -> wd, true, dbpath, sizeof dbpath, path, args );
+        if ( rc == 0 )
+            rc = KDBManagerWritableInt ( self -> wd, dbpath );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerWritable ( const KDBManager *self, const char * path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+
+    rc = KDBManagerVWritable ( self, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC KDBManagerVLock ( KDBManager *self, const char *path, va_list args )
+{
+    rc_t rc;
+    char full [ 4096 ];
+
+    if ( self == NULL )
+        rc =  RC ( rcDB, rcMgr, rcLocking, rcSelf, rcNull );
+    else
+    {
+        /* TBD:
+           Add code to validate that this path is not in a container
+           object's control.  That is the last facet in the path
+           is the name of the object.  To be valid the facet before
+           must not be "col", "tbl", or "db" as in those cases
+           the KDBManager should not be called for this object but 
+           its containing object
+        */
+
+        /* get full path to object */
+        rc = KDirectoryVResolvePath ( self -> wd, true,
+            full, sizeof full, path, args );
+        if ( rc == 0 )
+        {
+            /* if the path is not writable because it is already locked
+             * the return from this will contain "rcLocked" and the 
+             * caller will be forced to check for zero or RCState(rcLocked)
+             *
+             * a side effect is that if the call does not return 0 it will
+             * be a wrong type to lock with the DBManager
+             */
+            rc = KDBManagerWritableInt ( self -> wd, full );
+            if ( rc == 0 )
+            {
+                rc = KDBManagerCheckOpen ( self, full );
+                if ( rc == 0 )
+                    rc = KDBLockDir ( self -> wd, full );
+            }
+        }
+
+        /* return dbmgr context */
+        if ( rc != 0 )
+            rc = ResetRCContext ( rc, rcDB, rcMgr, rcLocking );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerLock ( KDBManager *self, const char *path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+
+    rc = KDBManagerVLock ( self, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC KDBManagerVUnlock ( KDBManager *self, const char *path, va_list args )
+{
+    rc_t rc;
+    char full [ 4096 ];
+
+    if ( self == NULL )
+        rc =  RC ( rcDB, rcMgr, rcUnlocking, rcSelf, rcNull );
+    else
+    {
+        /* get full path to object */
+        rc = KDirectoryVResolvePath ( self -> wd, true,
+            full, sizeof full, path, args );
+        if ( rc == 0 )
+        {
+            /* TBD:
+               Add code to validate that this path is not in a container
+               object's control.  That is the last facet in the path
+               is the name of the object.  To be valid the facet before
+               must not be "col", "tbl", or "db" as in those cases
+               the KDBManager should not be called for this object but 
+               its containing object
+            */
+
+            /* if the path is not writable because it is already locked
+             * we attempt to unlock it.
+             *
+             * if the return is 0 from Writable than it was already 
+             * unlocked so we say so and thus again the
+             * the return from this will contain "rcLocked" and the 
+             * caller will be forced to check for zero or RCState(rcUnlocked)
+             *
+             * a side effect is that if the call does not return 0 it will
+             * be a wrong type to lock with the DBManager
+             */
+            rc = KDBManagerWritableInt ( self -> wd, full );
+            if ( rc == 0 )
+                rc = RC ( rcDB, rcMgr, rcUnlocking, rcLock, rcUnlocked );
+            else if ( GetRCState ( rc ) == rcLocked )
+            {
+                rc = KDBManagerCheckOpen ( self, full );
+                if ( rc == 0 )
+                    rc = KDBUnlockDir ( self -> wd, full );
+            }
+        }
+
+        if ( rc != 0 )
+            rc = ResetRCContext ( rc, rcDB, rcMgr, rcUnlocking );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerUnlock ( KDBManager *self, const char *path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+
+    rc = KDBManagerVUnlock ( self, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerVDrop ( KDBManager *self, uint32_t obj_type, const char *path, va_list args )
+{
+    return KDBMgrVDrop ( self -> wd, self, obj_type, path, args );
+}
+
+LIB_EXPORT rc_t CC KDBManagerDrop ( KDBManager *self, uint32_t obj_type, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVDrop ( self, obj_type, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+
+/* RunPeriodicTasks
+ *  executes periodic tasks, such as cache flushing
+ */
+LIB_EXPORT rc_t CC KDBManagerRunPeriodicTasks ( const KDBManager *self )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcExecuting, rcSelf, rcNull );
+
+    return 0;
+}
+
+/* PathType
+ * check the path type of an object/directory path.
+ * this is an extension of the KDirectoryPathType and will return
+ * the KDirectory values if a path type is not specifically a
+ * kdb object
+ */
+LIB_EXPORT int CC KDBManagerPathTypeVP( const KDBManager * self, const VPath * path )
+{
+    int path_type = kptBadPath;
+    if ( self != NULL && path != NULL )
+    {
+        /*
+         * resolve the possible relative path or accession into
+         * a final path we can open directly
+         */
+		VPath * rpath;
+		rc_t rc = VFSManagerResolvePath( self->vfsmgr, vfsmgr_rflag_kdb_acc, path, &rpath );
+        if ( rc == 0 )
+        {
+            const KDirectory * dir;
+
+            /*
+             * Most KDBPathType values are based on 'directories'
+             * so try to open the resolved path as a directory
+             */
+            rc = VFSManagerOpenDirectoryReadDecrypt( self->vfsmgr, &dir, rpath );
+            if ( rc == 0 )
+            {
+                path_type = KDBPathTypeDir( dir, kptDir, NULL, "." );
+                KDirectoryRelease( dir );
+            }
+            /*
+             * If we couldn't open the path as a directory we 'might'
+             * have a KDB idx but we will only try that for a limited
+             * set of uri schemes.
+             */
+            else
+            {
+                if ( VPathIsFSCompatible( rpath ) )
+                {
+                    char buffer [ 4096 ];
+                    rc = VPathReadPath( rpath, buffer, sizeof buffer, NULL );
+                    if ( rc == 0 )
+                        path_type = KDBPathType( self -> wd, false, buffer );
+                }
+            }
+            VPathRelease( rpath );
+        }
+    }
+    return path_type;
+}
+
+
+LIB_EXPORT int CC KDBManagerVPathType ( const KDBManager * self, const char *path, va_list args )
+{
+    int path_type = kptBadPath;
+
+    if ( self != NULL && path != NULL )
+    {
+        VPath * vp;
+        rc_t rc;
+
+        rc = VFSManagerVMakePath( self -> vfsmgr, &vp, path, args );
+        if ( rc == 0 )
+        {
+            path_type = KDBManagerPathTypeVP( self, vp );
+            VPathRelease( vp );
+        }
+    }
+    return path_type;
+}
+
+
+LIB_EXPORT int CC KDBManagerPathType ( const KDBManager * self, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+
+    rc = KDBManagerVPathType ( self, path, args );
+
+    va_end (args);
+    return rc;
+}
+
diff --git a/libs/kdb/werror-priv.h b/libs/kdb/werror-priv.h
new file mode 100644
index 0000000..a9ae5b0
--- /dev/null
+++ b/libs/kdb/werror-priv.h
@@ -0,0 +1,59 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_werror_priv_
+#define _h_werror_priv_
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * RC
+ */
+
+/*
+AK: TODO check the fix is correct
+#define kdbReindex RC ( rcDB, rcNoObj, rcCommitting, rcIndex, rcExcessive )
+*/
+
+#define kdbReindex RC ( rcDB, rcNoTarg, rcCommitting, rcIndex, rcExcessive )
+
+#if 0
+    kdbBadBlockSize,
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_werror_priv_ */
diff --git a/libs/kdb/widxblk-priv.h b/libs/kdb/widxblk-priv.h
new file mode 100644
index 0000000..2187210
--- /dev/null
+++ b/libs/kdb/widxblk-priv.h
@@ -0,0 +1,195 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_widxblk_priv_
+#define _h_widxblk_priv_
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_colfmt_priv_
+#include "colfmt-priv.h"
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KColIdxBlock;
+
+
+/*--------------------------------------------------------------------------
+ * KColBlockMap
+ *  maps an index or page section of block index
+ */
+typedef struct KColBlockMap KColBlockMap;
+struct KColBlockMap
+{
+    void ( * trans ) ( KColBlockMap *self, uint32_t idx,
+        uint64_t first, uint32_t span );
+
+    union
+    {
+        /* for assignment and manipulation */
+        void *p;
+        char *c;
+
+        /* type 1 has a constant range/size */
+        uint32_t *span;
+
+        /* type 2 has a predictable id/pos */
+        uint64_t *first;
+
+        /* type 3 has a predictable id/pos and constant range/size */
+        struct
+        {
+            uint64_t pg;
+            uint32_t sz;
+        } *pred;
+
+    } h;
+
+    /* types 0 and 1 have explicit id/pos, where id is ordered */
+    uint64_t *d;
+
+    /* type 2 has explicit range/size */
+    uint32_t *s;
+};
+
+/* SetEntry
+ *  sets an entry
+ */
+void KColBlockMapSetEntry ( KColBlockMap *self,
+    uint32_t slot, uint64_t first, uint32_t span );
+#define KColBlockMapSetEntry( self, slot, first, span ) \
+    ( * ( self ) -> trans ) ( self, slot, first, span )
+
+
+/*--------------------------------------------------------------------------
+ * KColBlockLocInfo
+ *  extensions for defining prospective idx2 blocks
+ */
+typedef struct KColBlockLocInfo KColBlockLocInfo;
+struct KColBlockLocInfo
+{
+    /* the range of ids in a block */
+    int64_t start_id;
+    int64_t end_id;
+
+    /* the range of data pages */
+    uint64_t start_pg;
+    uint64_t end_pg;
+
+    /* the size of the last blob in block
+       which is the size of them all in the
+       case of pg_type == 2 or 3 */
+    uint32_t size;
+
+    /* the number of entries in block */
+    uint32_t count;
+
+    /* the types */
+    uint16_t id_type;
+    uint16_t pg_type;
+};
+
+/* Merge
+ *  calculates the cost of merging two blocks
+ *  returns the cost in bytes where a benefit is negative
+ *  merges right into left
+ */
+int64_t KColBlockLocInfoMerge ( KColBlockLocInfo *left,
+    const KColBlockLocInfo *right );
+
+
+/*--------------------------------------------------------------------------
+ * KColWIdxBlock
+ *  level 2 index building block
+ *
+ *  each index block has two sections
+ */
+typedef struct KColWIdxBlock KColWIdxBlock;
+struct KColWIdxBlock
+{
+    KColBlockMap id;
+    KColBlockMap pg;
+
+    uint32_t count;
+    uint32_t size;
+
+    /* for assigning */
+    uint32_t idx;
+};
+
+/* Init
+ */
+rc_t KColWIdxBlockInit ( KColWIdxBlock *iblk, const KColBlockLocInfo *info );
+
+/* Whack
+ */
+void KColWIdxBlockWhack ( KColWIdxBlock *self );
+
+/* SetEntry
+ *  sets index and page location information
+ */
+void KColWIdxBlockSetEntry ( KColWIdxBlock *self,
+    int64_t start_id, uint32_t span,
+    uint64_t pg, uint32_t sz );
+#if 0
+#define KColWIdxBlockSetEntry( self, start_id, span, pos, sz ) \
+    ( KColBlockMapSetEntry ( & ( self ) -> id, ( self ) -> idx, start_id, span ), \
+      KColBlockMapSetEntry ( & ( self ) -> pg, ( self ) -> idx, pos, sz ), \
+      ( void ) ++ ( self ) -> idx )
+#endif
+
+/* Compress
+ *  compress the block
+ *  update the BlockLoc
+ */
+rc_t KColWIdxBlockCompress ( KColWIdxBlock *self, bool bswap,
+    const KColBlockLocInfo *info, KColBlockLoc *bloc, size_t *to_write );
+
+/* PersistPtr
+ *  access the pointer for persisting to disk
+ */
+const void *KColWIdxBlockPersistPtr ( const KColWIdxBlock *self,
+    const KColBlockLoc *bloc );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_colidx2_priv_ */
diff --git a/libs/kdb/widxblk.c b/libs/kdb/widxblk.c
new file mode 100644
index 0000000..edac6de
--- /dev/null
+++ b/libs/kdb/widxblk.c
@@ -0,0 +1,546 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "widxblk-priv.h"
+#include "werror-priv.h"
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <byteswap.h>
+
+
+/*--------------------------------------------------------------------------
+ * KColBlockMap
+ *  maps an index or page section of block index
+ */
+
+/* KColBlockMapSetEntry
+ *  sets an entry
+ */
+#ifndef KColBlockMapSetEntry
+LIB_EXPORT void CC KColBlockMapSetEntry ( KColBlockMap *self,
+    uint32_t slot, uint64_t first, uint32_t span )
+{
+    ( * self -> trans ) ( self, slot, first, span );
+}
+#endif
+
+static
+void KColBlockMapTrans0 ( KColBlockMap *self, uint32_t idx,
+    uint64_t first, uint32_t span )
+{
+    self -> d [ idx ] = first;
+    self -> s [ idx ] = span;
+}
+
+static
+void KColBlockMapTrans1 ( KColBlockMap *self, uint32_t idx,
+    uint64_t first, uint32_t span )
+{
+    self -> d [ idx ] = first;
+    assert ( idx == 0 || self -> h . span [ 0 ] == span );
+    if ( idx == 0 )
+        self -> h . span [ 0 ] = span;
+}
+
+static
+void KColBlockMapTrans2 ( KColBlockMap *self, uint32_t idx,
+    uint64_t first, uint32_t span )
+{
+    self -> s [ idx ] = span;
+    if ( idx == 0 )
+        self -> h . first [ 0 ] = first;
+}
+
+static
+void KColBlockMapTrans3 ( KColBlockMap *self, uint32_t idx,
+    uint64_t first, uint32_t span )
+{
+    assert ( idx == 0 || self -> h . pred -> sz == span );
+    if ( idx == 0 )
+    {
+        self -> h . pred -> pg = first;
+        self -> h . pred -> sz = span;
+    }
+}
+
+static
+void KColBlockMapTransNull ( KColBlockMap *self, uint32_t idx,
+    uint64_t first, uint32_t span )
+{
+}
+
+static
+void KColBlockMapSwap ( KColBlockMap *self, uint32_t count, int type )
+{
+    uint32_t i;
+
+    switch ( type )
+    {
+    case btypeUniform:
+        self -> h . span [ 0 ] = bswap_32 ( self -> h . span [ 0 ] );
+        break;
+    case btypeMagnitude:
+        self -> h . first [ 0 ] = bswap_64 ( self -> h . first [ 0 ] );
+        break;
+    case btypePredictable:
+        self -> h . pred -> pg = bswap_64 ( self -> h . pred -> pg );
+        self -> h . pred -> sz = bswap_32 ( self -> h . pred -> sz );
+        break;
+    }
+
+    switch ( type )
+    {
+    case btypeRandom:
+    case btypeUniform:
+        for ( i = 0; i < count; ++ i )
+            self -> d [ i ] = bswap_64 ( self -> d [ i ] );
+        break;
+    }
+
+    switch ( type )
+    {
+    case btypeRandom:
+    case btypeMagnitude:
+        for ( i = 0; i < count; ++ i )
+            self -> s [ i ] = bswap_32 ( self -> s [ i ] );
+        break;
+    }
+}
+
+
+/*--------------------------------------------------------------------------
+ * KColBlockLocInfo
+ *  extensions for defining prospective idx2 blocks
+ */
+
+/* MergeIDTest
+ *  tests viability of merging two blocks with same id type
+ *  returns the required type for merge
+ */
+static
+uint32_t KColBlockLocInfoMergeIDTest ( uint32_t id_type,
+    const KColBlockLocInfo *left, const KColBlockLocInfo *right )
+{
+    switch ( id_type )
+    {
+    case btypeRandom:
+        break;
+
+    case btypeUniform:
+        assert ( left -> count != 0 );
+        assert ( right -> count != 0 );
+        if ( ( left -> end_id - left -> start_id ) / left -> count ==
+             ( right -> end_id - right -> start_id ) / right -> count )
+            return btypeUniform;
+        break;
+
+    case btypeMagnitude:
+        if ( left -> end_id == right -> start_id )
+            return btypeMagnitude;
+        break;
+
+    case btypePredictable:
+        assert ( left -> count != 0 );
+        assert ( right -> count != 0 );
+
+        if ( ( left -> end_id - left -> start_id ) / left -> count ==
+             ( right -> end_id - right -> start_id ) / right -> count )
+        {
+            if ( left -> end_id == right -> start_id )
+                return btypePredictable;
+            return btypeUniform;
+        }
+
+        if ( left -> end_id == right -> start_id )
+            return btypeMagnitude;
+        break;
+    }
+
+    return btypeRandom;
+}
+
+/* MergePGTest
+ *  tests viability of merging two blocks with same id type
+ */
+static
+uint32_t KColBlockLocInfoMergePGTest ( uint32_t pg_type,
+    const KColBlockLocInfo *left, const KColBlockLocInfo *right )
+{
+    switch ( pg_type )
+    {
+    case btypeRandom:
+        break;
+
+    case btypeUniform:
+        if ( left -> size == right -> size )
+            return btypeUniform;
+        break;
+
+    case btypeMagnitude:
+        if ( left -> end_pg == right -> start_pg )
+            return btypeMagnitude;
+        break;
+
+    case btypePredictable:
+        if ( left -> size == right -> size )
+        {
+            if ( left -> end_pg == right -> start_pg )
+                return btypePredictable;
+            return btypeUniform;
+        }
+        if ( left -> end_pg == right -> start_pg )
+            return btypeMagnitude;
+        break;
+    }
+
+    return btypeRandom;
+}
+
+/* ConvertIDCost
+ *  measures cost of converting an id type
+ */
+static
+int64_t KColBlockLocInfoConvertIDCost ( const KColBlockLocInfo *bloc, uint32_t id_type )
+{
+    size_t cost;
+
+    if ( bloc -> id_type == ( uint16_t ) id_type )
+        return 0;
+
+    switch ( ( id_type << 2 ) | bloc -> id_type )
+    {
+        /* conversions to most expensive type */
+    case ( ( btypeRandom << 2 ) | btypeUniform ):
+        cost = ( ( size_t ) bloc -> count << 2 ) - 4;
+        break;
+    case ( ( btypeRandom << 2 ) | btypeMagnitude ):
+        cost = ( ( size_t ) bloc -> count << 3 ) - 8;
+        break;
+    case ( ( btypeRandom << 2 ) | btypePredictable ):
+        cost = ( size_t ) bloc -> count * 12;
+        break;
+
+        /* other supported conversions */
+    case ( ( btypeUniform << 2 ) | btypePredictable ):
+        cost = ( size_t ) bloc -> count << 3;
+        break;
+    case ( ( btypeMagnitude << 2 ) | btypePredictable ):
+        cost = ( size_t ) bloc -> count << 2;
+        break;
+
+        /* no other conversions are supported */
+    default:
+        return 0xFFFFFFFF;
+    }
+
+    /* consider the conversion done */
+    return cost;
+}
+
+/* ConvertPGCost
+ *  measures cost of converting a pg type
+ */
+static
+int64_t KColBlockLocInfoConvertPGCost ( const KColBlockLocInfo *bloc, uint32_t pg_type )
+{
+    int64_t cost;
+
+    if ( bloc -> pg_type == ( uint16_t ) pg_type )
+        return 0;
+
+    switch ( ( pg_type << 2 ) | bloc -> pg_type )
+    {
+        /* conversion to most expensive type */
+    case ( ( btypeRandom << 2 ) | btypeUniform ):
+        cost = ( ( uint32_t ) bloc -> count << 2 ) - 4;
+        break;
+    case ( ( btypeRandom << 2 ) | btypeMagnitude ):
+        cost = ( ( uint32_t ) bloc -> count << 3 ) - 8;
+        break;
+    case ( ( btypeRandom << 2 ) | btypePredictable ):
+        cost = ( uint32_t ) ( bloc -> count - 1 ) * 12;
+        break;
+
+        /* other supported conversions */
+    case ( ( btypeUniform << 2 ) | btypePredictable ):
+        cost = ( ( int64_t ) bloc -> count << 3 ) - 12;
+        break;
+    case ( ( btypeMagnitude << 2 ) | btypePredictable ):
+        cost = ( ( int64_t ) bloc -> count << 2 ) - 12;
+        break;
+
+        /* no other conversions are supported */
+    default:
+        return 0xFFFFFFFF;
+    }
+
+    /* consider the conversion done */
+    return cost;
+}
+
+/* Merge
+ *  calculates the cost of merging two blocks
+ *  returns the cost in bytes where a benefit is negative
+ *  merges right into left
+ */
+int64_t KColBlockLocInfoMerge ( KColBlockLocInfo *a, const KColBlockLocInfo *b )
+{
+    int64_t cost;
+    uint32_t id_type, pg_type;
+
+    /* calculate optimistic lowest-common types */
+    id_type = ( uint32_t ) a -> id_type & ( uint32_t ) b -> id_type;
+    pg_type = ( uint32_t ) a -> pg_type & ( uint32_t ) b -> pg_type;
+
+    /* test merge of b into a */
+    id_type = KColBlockLocInfoMergeIDTest ( id_type, a, b );
+    pg_type = KColBlockLocInfoMergePGTest ( pg_type, a, b );
+
+    /* calculate cost of type conversion */
+    cost = KColBlockLocInfoConvertIDCost ( a, id_type );
+    cost += KColBlockLocInfoConvertPGCost ( a, pg_type );
+    cost += KColBlockLocInfoConvertIDCost ( b, id_type );
+    cost += KColBlockLocInfoConvertPGCost ( b, pg_type );
+
+    /* perform the merge */
+    a -> end_id = b -> end_id;
+    a -> end_pg = b -> end_pg;
+    a -> count += b -> count;
+    a -> id_type = id_type;
+    a -> pg_type = pg_type;
+
+    /* the resultant block cannot be too large */
+    if ( ( ( a -> end_id - a -> start_id ) >> 32 ) == 0 )
+    {
+        size_t hdr_size_div4 = pg_type;
+        size_t entry_size_div4 = ( id_type ^ 3 ) + ( pg_type ^ 3 );
+        if ( id_type != 3 )
+            hdr_size_div4 += id_type;
+
+        if ( ( hdr_size_div4 + entry_size_div4 * a -> count ) <= ( 0x10000 / 4 ) )
+            return cost - sizeof ( KColBlockLoc );
+    }
+
+    /* too big */
+    return 0xFFFFFFFF;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KColWIdxBlock
+ *  level 2 index building block
+ *
+ *  each index block has two sections
+ */
+
+/* Init
+ */
+rc_t KColWIdxBlockInit ( KColWIdxBlock *iblk, const KColBlockLocInfo *info )
+{
+    /* start out with entry count */
+    int block_size = ( int ) info -> count;
+
+    /* determine block size and write funcs */
+    int id_hsz, id_dsz, id_ssz;
+    int pg_hsz, pg_dsz, pg_ssz;
+    switch ( info -> id_type )
+    {
+    case btypeRandom:
+        iblk -> id . trans = KColBlockMapTrans0;
+        id_hsz = 0;
+        id_dsz = 8;
+        id_ssz = 4;
+        break;
+    case btypeUniform:
+        iblk -> id . trans = KColBlockMapTrans1;
+        id_hsz = 4;
+        id_dsz = 8;
+        id_ssz = 0;
+        break;
+    case btypeMagnitude:
+        iblk -> id . trans = KColBlockMapTrans2;
+        id_hsz = 8;
+        id_dsz = 0;
+        id_ssz = 4;
+        break;
+    case btypePredictable:
+    default: /* to quiet compiler warnings */
+        iblk -> id . trans = KColBlockMapTransNull;
+        id_hsz = 0;
+        id_dsz = 0;
+        id_ssz = 0;
+        break;
+    }
+
+    switch ( info -> pg_type )
+    {
+    case btypeRandom:
+        iblk -> pg . trans = KColBlockMapTrans0;
+        pg_hsz = 0;
+        pg_dsz = 8;
+        pg_ssz = 4;
+        break;
+    case btypeUniform:
+        iblk -> pg . trans = KColBlockMapTrans1;
+        pg_hsz = 4;
+        pg_dsz = 8;
+        pg_ssz = 0;
+        break;
+    case btypeMagnitude:
+        iblk -> pg . trans = KColBlockMapTrans2;
+        pg_hsz = 8;
+        pg_dsz = 0;
+        pg_ssz = 4;
+        break;
+    case btypePredictable:
+    default: /* to quiet compiler warnings */
+        iblk -> pg . trans = KColBlockMapTrans3;
+        pg_hsz = 12;
+        pg_dsz = 0;
+        pg_ssz = 0;
+        break;
+    }
+
+    /* record count */
+    iblk -> count = block_size;
+
+    /* account for the number of entries */
+    id_dsz *= block_size;
+    id_ssz *= block_size;
+    pg_dsz *= block_size;
+    pg_ssz *= block_size;
+
+    /* allocate a block with compression buffer */
+    block_size = id_hsz + id_dsz + id_ssz +
+        pg_hsz + pg_dsz + pg_ssz;
+    iblk -> id . h . p = malloc ( block_size + block_size );
+    if ( iblk -> id . h . p == NULL )
+        return RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+
+    /* record uncompressed block size */
+    iblk -> size = block_size;
+
+    /* map the block */
+    iblk -> pg . h . c = iblk -> id . h . c + id_hsz;
+    iblk -> id . d = ( uint64_t* ) ( iblk -> pg . h . c + pg_hsz );
+    iblk -> pg . d = ( uint64_t* ) ( ( char* ) iblk -> id . d + id_dsz );
+    iblk -> id . s = ( uint32_t * ) ( ( char* ) iblk -> pg . d + pg_dsz );
+    iblk -> pg . s = ( uint32_t * ) ( ( char* ) iblk -> id . s + id_ssz );
+
+    /* prepare index */
+    iblk -> idx = 0;
+
+    return 0;
+}
+
+/* Whack
+ */
+void KColWIdxBlockWhack ( KColWIdxBlock *self )
+{
+    if ( self != NULL )
+        free ( self -> id . h . p );
+}
+
+/* SetEntry
+ *  sets index and page location information
+ */
+#ifndef KColWIdxBlockSetEntry
+void KColWIdxBlockSetEntry ( KColWIdxBlock *self,
+    int64_t start_id, uint32_t span,
+    uint64_t pg, uint32_t sz )
+{
+    KColBlockMapSetEntry ( & self -> id, self -> idx, start_id, span );
+    KColBlockMapSetEntry ( & self -> pg, self -> idx, pg, sz );
+    ++ self -> idx;
+}
+#endif
+
+/* Compress
+ *  compress the block
+ *  update the KColBlockLoc
+ */
+rc_t KColWIdxBlockCompress ( KColWIdxBlock *self, bool bswap,
+    const KColBlockLocInfo *info, KColBlockLoc *bloc, size_t *to_write )
+{
+    assert ( info -> id_type < 4 );
+    bloc -> u . blk . id_type = ( uint32_t ) info -> id_type;
+
+    assert ( info -> pg_type < 4 );
+    bloc -> u . blk . pg_type = ( uint32_t ) info -> pg_type;
+
+    assert ( ( ( info -> end_id - info -> start_id ) >> 32 ) == 0 );
+    bloc -> id_range = ( uint32_t ) ( info -> end_id - info -> start_id );
+
+    bloc -> start_id = info -> start_id;
+
+    bloc -> pg = 0;
+
+    if ( info -> id_type == btypePredictable &&
+         info -> pg_type == btypePredictable )
+    {
+        assert ( ( self -> count >> 27 ) == 0 );
+        bloc -> u . blk . size = self -> count;
+        bloc -> u . blk . compressed = 0;
+        * to_write = 12;
+
+        if ( bswap )
+        {
+            KColBlockMapSwap ( & self -> id, self -> count, info -> id_type );
+            KColBlockMapSwap ( & self -> pg, self -> count, info -> pg_type );
+        }
+
+        return 0;
+    }
+
+    assert ( ( self -> size >> 27 ) == 0 );
+    bloc -> u . blk . size = self -> size;
+    * to_write = self -> size;
+
+    if ( bswap )
+    {
+        KColBlockMapSwap ( & self -> id, self -> count, info -> id_type );
+        KColBlockMapSwap ( & self -> pg, self -> count, info -> pg_type );
+    }
+
+    /* not compressing today */
+    bloc -> u . blk . compressed = 0;
+    return 0;
+}
+
+/* PersistPtr
+ *  access the pointer for persisting to disk
+ */
+const void *KColWIdxBlockPersistPtr ( const KColWIdxBlock *self,
+    const KColBlockLoc *bloc )
+{
+    assert ( bloc -> u . blk . compressed == 0 );
+    return self -> id . h . p;
+}
diff --git a/libs/kdb/windex-priv.h b/libs/kdb/windex-priv.h
new file mode 100644
index 0000000..5b9847d
--- /dev/null
+++ b/libs/kdb/windex-priv.h
@@ -0,0 +1,230 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_index_priv_
+#define _h_index_priv_
+
+#ifndef _h_index_cmn_
+#include "index-cmn.h"
+#endif
+
+#ifndef _h_klib_trie_
+#include <klib/trie.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct BSTNode;
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * V1
+ *  version 1 of the trie index was hard-coded to enforce uniqueness of
+ *  both the string, and a 32-bit id. furthermore, the id was unfortunately
+ *  assumed to occupy a mostly contiguous space, such that the projection
+ *  was always implemented as an array of ptrie node ids where the id was
+ *  used to index the array.
+ *
+ *  the introduction of highly sparse ids led to deprecation of this
+ *  implementation. see version 2 for further information.
+ */
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIdxNode_v1
+ */
+typedef struct KTrieIdxNode_v1 KTrieIdxNode_v1;
+struct KTrieIdxNode_v1
+{
+    TNode n;
+    uint32_t id;
+    char key [ 1 ];
+};
+
+/*--------------------------------------------------------------------------
+ * KTrieIndex_v1
+ */
+struct KTrieIndex_v1
+{
+    KPTrieIndex_v1 pt;
+    Trie key2id;
+    KTrieIdxNode_v1 **id2node;
+    uint32_t first;
+    uint32_t last;
+    uint32_t len;
+};
+
+/* insert string into trie, mapping to 32 bit id */
+rc_t KTrieIndexInsert_v1 ( KTrieIndex_v1 *self,
+    bool proj, const char *key, uint32_t id );
+
+/* drop string from trie and all mappings */
+rc_t KTrieIndexDelete_v1 ( KTrieIndex_v1 *self,
+    bool proj, const char *key );
+
+/* persist index to file */
+rc_t KTrieIndexPersist_v1 ( const KTrieIndex_v1 *self,
+    bool proj, struct KDirectory *dir, const char *path, bool use_md5 );
+
+
+/*--------------------------------------------------------------------------
+ * V2
+ *  version 2 of the trie index was introduced to handle sparse ids,
+ *  and to recognize that ids may be 64 bits and/or negative.
+ *
+ *  v2 introduces strategy identifiers to handle various cases.
+ *
+ *  CONSTRAINTS
+ *  - both key and id are unique ( version 1 )
+ *  - key is not unique, but must map to a contiguous range of ids,
+ *    while ids are unique ( the main use case for SRA )
+ *
+ *  INSERTION
+ *  - ids are observed in increasing order
+ *
+ *  PROJECTION
+ *  - id range is contiguous or nearly so ( can use single array )
+ *  - id range is sparse
+ *
+ *  the implementation may be extended by adding new strategies,
+ *  but the moment the implementation supports 1 to many mappings,
+ *  inserted with ids in increasing order, and an unique constraint
+ *  on the ids themselves.
+ *
+ *  the general case for v2 is "key -> id range", where "id range -> key"
+ *  is via contiguous array if avg ( id range ) <= 2, and via sparse
+ *  array otherwise.
+ *
+ *  for the key -> id mappings, this means that the in-core node
+ *  either retains an id range ( when not using a projection index ),
+ *  or it retains a start-id only, since its range can be determined
+ *  from the projection index.
+ *
+ *  for id -> key mappings, the id is first converted to an ordinal, and
+ *  the ordinal to a node. when ids are contiguous, id -> ordinal is simply
+ *  derived by subtracting the initial start id. when sparse, an id -> ord
+ *  array is used in a binary search to produce the ordinal.
+ *
+ *  ids are assumed to be 64 bit, stored as id - start id, and packed to
+ *  a minimum number of bits to represent the id. ptrie node ids are still
+ *  32-bit entities.
+ */
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIdxNode_v2_s1
+ *  strategy 1 - store only start id, derive range from proj index
+ */
+typedef struct KTrieIdxNode_v2_s1 KTrieIdxNode_v2_s1;
+struct KTrieIdxNode_v2_s1
+{
+    TNode n;
+    int64_t start_id;
+    char key [ 1 ];
+};
+
+/*--------------------------------------------------------------------------
+ * KTrieIdxNode_v2_s2
+ *  strategy 2 - store complete range when not using proj index
+ */
+typedef struct KTrieIdxNode_v2_s2 KTrieIdxNode_v2_s2;
+struct KTrieIdxNode_v2_s2
+{
+    TNode n;
+    int64_t start_id;
+    uint32_t span;
+    char key [ 1 ];
+};
+
+/*--------------------------------------------------------------------------
+ * KTrieIndex_v2
+ */
+struct KTrieIndex_v2
+{
+    int64_t first, last;
+    KPTrieIndex_v2 pt;
+    Trie key2id;
+    KTrieIdxNode_v2_s1 **ord2node;
+    uint32_t count;
+    uint32_t max_span;
+};
+
+/* cause persisted tree to be loaded into trie */
+rc_t KTrieIndexAttach_v2 ( KTrieIndex_v2 *self, bool proj );
+
+/* insert string into trie, mapping to 64 bit id */
+rc_t KTrieIndexInsert_v2 ( KTrieIndex_v2 *self,
+    bool proj, const char *key, int64_t id );
+
+/* drop string from trie and all mappings */
+rc_t KTrieIndexDelete_v2 ( KTrieIndex_v2 *self,
+    bool proj, const char *key );
+
+/* persist index to file */
+rc_t KTrieIndexPersist_v2 ( const KTrieIndex_v2 *self,
+    bool proj, struct KDirectory *dir, const char *path, bool use_md5 );
+
+
+/*--------------------------------------------------------------------------
+ * KU64Index_v3
+ */
+struct KU64Index_v3
+{
+    BSTree tree;
+    rc_t rc;
+};
+
+rc_t KU64IndexInsert_v3(KU64Index_v3* self, bool unique, uint64_t key, uint64_t key_size, int64_t id, uint64_t id_qty);
+rc_t KU64IndexDelete_v3(KU64Index_v3* self, uint64_t key);
+
+rc_t KU64IndexPersist_v3(KU64Index_v3* self, bool proj, struct KDirectory *dir, const char *path, bool use_md5);
+
+
+
+/*--------------------------------------------------------------------------
+ * KIndex
+ *  represents an index
+ */
+
+/* Cmp
+ * Sort
+ */
+int KIndexCmp ( const void *item, struct BSTNode const *n );
+int KIndexSort ( struct BSTNode const *item, struct BSTNode const *n );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_index_priv_ */
diff --git a/libs/kdb/windex.c b/libs/kdb/windex.c
new file mode 100644
index 0000000..efdfb8c
--- /dev/null
+++ b/libs/kdb/windex.c
@@ -0,0 +1,1889 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#include "windex-priv.h"
+#include "dbmgr-priv.h"
+#include "database-priv.h"
+#include "wtable-priv.h"
+#include "wkdb-priv.h"
+#include "kdbfmt-priv.h"
+
+#include <kdb/kdb-priv.h>
+#include <kdb/index.h>
+#include <klib/symbol.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <byteswap.h>
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * KIndex
+ *  an object capable of mapping an object to integer oid
+ */
+
+struct KIndex
+{
+    BSTNode n;
+
+    KDBManager *mgr;
+    KDatabase *db;
+    KTable *tbl;
+    KDirectory *dir;
+
+    KRefcount refcount;
+    uint32_t opencount;
+    uint32_t vers;
+    union
+    {
+        KTrieIndex_v1 txt1;
+        KTrieIndex_v2 txt2;
+        KU64Index_v3  u64_3;
+    } u;
+    bool converted_from_v1;
+    uint8_t type;
+    uint8_t read_only;
+    uint8_t dirty;
+    bool use_md5;
+
+    KSymbol sym;
+
+    char path [ 1 ];
+};
+
+
+/* Whack
+ */
+static
+rc_t KIndexWhack ( KIndex *self )
+{
+    rc_t rc;
+    KDBManager *mgr = self -> mgr;
+    KSymbol * symb;
+
+    KRefcountWhack ( & self -> refcount, "KIndex" );
+
+    rc = KIndexCommit( self );
+    if ( rc == 0 )
+    {
+        /* release owner */
+        if ( self -> db != NULL )
+        {
+            rc = KDatabaseSever ( self -> db );
+            if ( rc != 0 )
+                return rc;
+            self -> db = NULL;
+        }
+        else if ( self -> tbl != NULL )
+        {
+            rc = KTableSever ( self -> tbl );
+            if ( rc != 0 )
+                return rc;
+            self -> tbl = NULL;
+        }
+    }
+
+    /* remove from mgr */
+    symb = KDBManagerOpenObjectFind (mgr, self->path);
+    if (symb != NULL)
+    {
+        rc = KDBManagerOpenObjectDelete (mgr, symb);
+        if (rc == 0)
+        {
+            /* release manager
+               should never fail */
+            rc = KDBManagerSever ( mgr );
+            if ( rc != 0 )
+                rc = KDBManagerOpenObjectAdd (mgr, symb);
+            else
+            {
+                self -> mgr = NULL;
+
+                rc = SILENT_RC ( rcDB, rcIndex, rcDestroying, rcIndex, rcBadVersion );
+
+                /* complete */
+                switch ( self -> type )
+                {
+                case kitText:
+                case kitText | kitProj:
+                    switch ( self -> vers )
+                    {
+                    case 1:
+                        KTrieIndexWhack_v1 ( & self -> u . txt1 );
+                        rc = 0;
+                        break;
+                    case 2:
+                    case 3:
+                    case 4:
+                        KTrieIndexWhack_v2 ( & self -> u . txt2 );
+                        rc = 0;
+                        break;
+                    }
+                    break;
+
+                case kitU64:
+                    switch ( self -> vers )
+                    {
+                    case 3:
+                    case 4:
+                        rc = KU64IndexWhack_v3 ( & self -> u . u64_3 );
+                        break;
+                    }
+                    break;
+                }
+            }
+        }
+    }
+    if ( rc == 0 )
+    {
+        KDirectoryRelease ( self -> dir );
+        free ( self );
+    }
+    else
+        KRefcountInit ( & self -> refcount, 1, "KIndex", "whack", "kidx" );
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KIndexAddRef ( const KIndex *cself )
+{
+    KIndex *self = ( KIndex* ) cself;
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KIndex" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcIndex, rcAttaching, rcRange, rcExcessive );
+        }
+        ++ self -> opencount;
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KIndexRelease ( const KIndex *cself )
+{
+    KIndex *self = ( KIndex* ) cself;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KIndex" ) )
+        {
+        case krefWhack:
+            return KIndexWhack ( ( KIndex* ) self );
+        case krefLimit:
+            return RC ( rcDB, rcIndex, rcReleasing, rcRange, rcExcessive );
+        }
+        -- self -> opencount;
+    }
+    return 0;
+}
+
+
+/* Attach
+ */
+static
+rc_t KIndexAttach ( KIndex *self, const KMMap *mm, bool *byteswap )
+{
+    size_t size;
+    rc_t rc = KMMapSize ( mm, & size );
+    if ( rc == 0 )
+    {
+        const void *addr;
+        rc = KMMapAddrRead ( mm, & addr );
+        if ( rc == 0 )
+        {
+            union
+            {
+                KIndexFileHeader_v1 v1;
+                KIndexFileHeader_v2 v2;
+                KIndexFileHeader_v3 v3;
+            } hdrs;
+
+            const KDBHdr *hdr = addr;
+            const KIndexFileHeader_v3 *fh = addr;
+
+            * byteswap = false;
+            rc = KDBHdrValidate ( hdr, size, 1, KDBINDEXVERS );
+            if ( GetRCState ( rc ) == rcIncorrect && GetRCObject ( rc ) == rcByteOrder )
+            {
+                hdrs . v1 . endian = bswap_32 ( hdr -> endian );
+                hdrs . v1 . version = bswap_32 ( hdr -> version );
+                rc = KDBHdrValidate ( & hdrs . v1, size, 1, KDBINDEXVERS );
+                if ( rc == 0 )
+                {
+                    * byteswap = true;
+                    switch ( hdrs . v1 . version )
+                    {
+                    case 1:
+                        hdr = & hdrs . v1;
+                        break;
+                    case 2:
+                        hdr = & hdrs . v2;
+                        break;
+                    case 3:
+                    case 4:
+                        hdrs . v3 . index_type = bswap_32 ( fh -> index_type );
+                        hdrs . v3 . reserved1 = bswap_32 ( fh -> reserved1 );
+                        hdr = & hdrs . v3 . h;
+                        fh = & hdrs . v3;
+                        break;
+                    }
+                }
+            }
+            if ( rc == 0 )
+            {
+                self -> vers = hdr -> version;
+                switch ( hdr -> version )
+                {
+                case 1:
+#if KDBINDEXVERS != 1
+                    self -> converted_from_v1 = true;
+#endif
+                case 2:
+                    self -> type = kitText;
+                    break;
+                case 3:
+                case 4:
+                {
+                    self -> type = fh -> index_type;
+                    switch( self->type )
+                    {
+                    case kitText:
+                    case kitU64:
+                        break;
+                    default:
+                        rc = RC(rcDB, rcIndex, rcConstructing, rcIndex, rcUnrecognized);
+                    }
+                    break;
+                }
+                default:
+                    rc = RC(rcDB, rcIndex, rcConstructing, rcIndex, rcBadVersion);
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+/* Sever
+ * there is no KIndexSever()
+ */
+
+/* Make
+ *  make an initialized structure
+ *  NB - does NOT attach reference to dir, but steals it
+ */
+static
+rc_t KIndexMake ( KIndex **idxp, KDirectory *dir, const char *path )
+{
+    rc_t rc;
+    char fullpath[4096];
+
+    if ( idxp == NULL )
+        rc = RC ( rcDB, rcIndex, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( dir == NULL )
+            rc = RC ( rcDB, rcIndex, rcCreating, rcDirectory, rcNull );
+        else if ( path == NULL )
+            rc = RC ( rcDB, rcIndex, rcCreating, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcDB, rcIndex, rcCreating, rcPath, rcEmpty );
+        else
+        {
+            rc = KDirectoryResolvePath(dir, true, fullpath, sizeof(fullpath), "%s", path);
+            if (rc == 0)
+            {
+                KIndex* idx = malloc ( sizeof *idx + strlen ( fullpath ) );
+                if ( idx == NULL )
+                    rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+                else
+                {
+                    memset ( idx, 0, sizeof * idx );
+                    rc = KDirectoryAddRef ( dir );
+                    if ( rc == 0 )
+                    {
+                        idx -> dir = dir;
+                        KRefcountInit ( & idx -> refcount, 1, "KIndex", "make", fullpath );
+                        idx -> opencount = 1;
+
+                        strcpy ( idx -> path, fullpath );
+
+                        idx->sym.u.obj = idx;
+                        idx->sym.dad = NULL;   /* not strictly needed */
+                        StringInitCString (&idx->sym.name, idx->path);
+                        idx->sym.type = kptIndex;
+
+                        * idxp = idx;
+                        return 0;
+                    }
+
+                    free ( idx );
+                }
+            }
+        }
+
+        * idxp = NULL;
+    }
+
+    return rc;
+}
+
+static
+rc_t KDBManagerInsertIndex ( KDBManager * self, KIndex * idx)
+{
+    rc_t rc;
+    rc = KDBManagerOpenObjectAdd (self, &idx->sym);
+    if (rc == 0)
+        idx->mgr = KDBManagerAttach (self);
+    return rc;
+}
+
+static
+rc_t KIndexMakeRead ( KIndex **idxp, const KDirectory *dir, const char *path )
+{
+    const KFile *f;
+    rc_t rc = KDirectoryOpenFileRead ( dir, & f, "%s", path );
+    if ( rc == 0 )
+    {
+        const KMMap *mm;
+        rc = KMMapMakeRead ( & mm, f );
+        if ( rc == 0 )
+        {
+            rc = KIndexMake ( idxp, ( KDirectory* ) dir, path );
+            if ( rc == 0 )
+            {
+                bool byteswap;
+                KIndex *idx = * idxp;
+                rc = KIndexAttach ( idx, mm, & byteswap );
+                if ( rc == 0 )
+                {
+                    rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcBadVersion );
+                    idx -> read_only = true;
+                    switch ( idx -> vers )
+                    {
+                    case 1:
+                        /* open using v1 code only if KDBINDEXVERS is 1
+                           if 2 or later, open as a v2 index */
+#if KDBINDEXVERS == 1
+                        rc = KTrieIndexOpen_v1 ( & idx -> u . txt1, mm );
+                        if ( rc == 0 )
+                        {
+                            if ( idx -> u . txt1 . pt . id2node != NULL )
+                                idx -> type = ( uint8_t ) ( kitText | kitProj );
+                            else
+                                idx -> type = ( uint8_t ) kitText;
+                        }
+                        break;
+#else
+                    case 2:
+                    case 3:
+                    case 4:
+                        switch(idx->type) {
+                            case kitText:
+                            case kitText | kitProj:
+                                /* will guess version in open */
+                                rc = KTrieIndexOpen_v2 ( & idx -> u . txt2, mm, byteswap );
+                                if( rc == 0 && idx -> u.txt2.pt.ord2node != NULL ) {
+                                    idx -> type |= kitProj;
+                                }
+                                idx -> vers = 3;
+                                break;
+
+                            case kitU64:
+                                rc = KU64IndexOpen_v3(&idx->u.u64_3, mm, byteswap);
+                                break;
+                        }
+                        break;
+#endif
+                    }
+                }
+
+                if ( rc != 0 )
+                    KIndexWhack ( idx );
+            }
+
+            KMMapRelease ( mm );
+        }
+
+        KFileRelease ( f );
+    }
+    return rc;
+}
+
+static
+rc_t KIndexMakeUpdate ( KIndex **idxp, KDirectory *dir, const char *path )
+{
+    const KFile *f;
+    rc_t rc = KDirectoryOpenFileRead ( dir, & f, "%s", path );
+
+    if ( rc == 0 )
+    {
+        const KMMap *mm;
+        rc = KMMapMakeRead ( & mm, f );
+        if ( rc == 0 )
+        {
+            rc = KIndexMake ( idxp, dir, path );
+            if ( rc == 0 )
+            {
+                bool byteswap;
+                KIndex *idx = * idxp;
+                rc = KIndexAttach ( idx, mm, & byteswap );
+                if ( rc == 0 )
+                {
+                    switch ( idx -> vers )
+                    {
+                    case 1:
+                        /* open using v1 code only if KDBINDEXVERS is 1
+                           if 2 or later, open as a v2 index */
+#if KDBINDEXVERS == 1
+                        rc = KTrieIndexOpen_v1 ( & idx -> u . txt1, mm, byteswap );
+                        if ( rc == 0 )
+                        {
+                            if ( idx -> u . txt1 . pt . id2node != NULL )
+                                idx -> type = ( uint8_t ) ( kitText | kitProj );
+                            else
+                                idx -> type = ( uint8_t ) kitText;
+                        }
+                        break;
+#else
+                    case 2:
+                    case 3:
+                    case 4:
+                        switch(idx->type) {
+                            case kitText:
+                            case kitText | kitProj:
+                                /* will guess version in open */
+                                rc = KTrieIndexOpen_v2 ( & idx -> u . txt2, mm, byteswap );
+                                if ( rc == 0 )
+                                {
+                                    if( idx -> u . txt2 . pt . ord2node != NULL ) {
+                                        idx -> type |= kitProj;
+                                    }
+                                    /* v3 takes over v1 and v2 */
+                                    if( idx->vers < 3 ) {
+                                        idx -> vers = 3;
+                                        /* check for a sparse id space */
+                                        if( idx -> u . txt2 . pt . variant != 0 ) {
+                                            /* try to load existing guy */
+                                            rc = KTrieIndexAttach_v2 ( & idx -> u . txt2,
+                                                          idx -> type != ( uint8_t ) kitText );
+                                            if ( rc == 0 )
+                                                idx -> dirty = true;
+                                        }
+                                    }
+                                }
+                                break;
+
+                            case kitU64:
+                                rc = KU64IndexOpen_v3(&idx->u.u64_3, mm, byteswap);
+                                break;
+                        }
+                        break;
+#endif
+                    default:
+                        rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcBadVersion );
+                    }
+                }
+
+                if ( rc != 0 )
+                    KIndexWhack ( idx );
+            }
+
+            KMMapRelease ( mm );
+        }
+
+        KFileRelease ( f );
+    }
+    return rc;
+}
+
+/* MarkModified
+ *  make the index think it has been modified, such that it may be committed
+ *  useful when forcing conversion from an older version
+ */
+#if KDBINDEXVERS > 1
+LIB_EXPORT rc_t CC KIndexMarkModified ( KIndex *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcDB, rcIndex, rcUpdating, rcSelf, rcNull );
+    else if ( self -> read_only )
+        rc = RC ( rcDB, rcIndex, rcUpdating, rcIndex, rcReadonly );
+    else if ( self -> dirty )
+        rc = 0;
+    else switch ( self -> type )
+    {
+    case kitText:
+    case kitText | kitProj:
+        switch ( self -> vers )
+        {
+        default:
+            rc = RC ( rcDB, rcIndex, rcUpdating, rcIndex, rcBadVersion );
+            break;
+        case 1:
+        case 2:
+        case 3:
+        case 4:
+            rc = KTrieIndexAttach_v2 ( & self -> u . txt2,
+                self -> type != ( uint8_t ) kitText );
+            if ( rc == 0 )
+                self -> dirty = true;
+        }
+        break;
+    default:
+        rc = RC ( rcDB, rcIndex, rcUpdating, rcIndex, rcInvalid );
+    }
+
+    return rc;
+}
+#endif
+
+static
+rc_t KIndexCreate ( KIndex **idxp, KDirectory *dir,
+    KIdxType type, KCreateMode cmode, const char *path, int ptype )
+{
+    rc_t rc = 0;
+    KIndex *idx;
+
+    if ( ptype != kptNotFound )
+    {
+        switch ( cmode & kcmValueMask )
+        {
+        case kcmOpen:
+            rc = KIndexMakeUpdate ( idxp, dir, path );
+            if ( rc == 0 )
+            {
+                idx = * idxp;
+                if ( ( KIdxType ) idx -> type != type )
+                {
+                    * idxp = NULL;
+                    KIndexWhack ( idx );
+                    rc = RC ( rcDB, rcIndex, rcConstructing, rcType, rcIncorrect );
+                }
+            }
+            return rc;
+
+        case kcmInit:
+            break;
+
+        case kcmCreate:
+            return RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcExists );
+        }
+    }
+#if KDBINDEXVERS == 1 || KDBIDXVERS == 2
+    else if ( type != kitText && type != ( kitText | kitProj ) )
+    {
+        * idxp = NULL;
+        return RC ( rcDB, rcIndex, rcConstructing, rcType, rcUnsupported );
+    }
+#endif
+
+    rc = KIndexMake ( idxp, dir, path );
+    if ( rc == 0 )
+    {
+        idx = * idxp;
+
+        switch ( type )
+        {
+        case kitText:
+        case kitText | kitProj:
+#if KDBINDEXVERS == 1
+            rc = KTrieIndexOpen_v1 ( & idx -> u . txt1, NULL, false );
+#else
+            rc = KTrieIndexOpen_v2 ( & idx -> u . txt2, NULL, false );
+#endif
+            break;
+
+        case kitU64:
+            rc = KU64IndexOpen_v3 ( & idx->u.u64_3, NULL, false );
+            break;
+
+        default:
+            rc = RC ( rcDB, rcIndex, rcConstructing, rcType, rcUnsupported );
+        }
+
+        if ( rc != 0 )
+        {
+            * idxp = NULL;
+            KIndexWhack ( idx );
+        }
+        else
+        {
+            idx -> vers = KDBINDEXVERS;
+            idx -> type = ( uint8_t ) type;
+        }
+    }
+
+    return rc;
+}
+
+/* CreateIndex
+ * VCreateIndex
+ *  create a new or open an existing index
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+static
+rc_t KDBManagerCreateIndexInt ( KDBManager *self, KIndex **idxp,
+    KDirectory *wd, KIdxType type, KCreateMode cmode, const char *path, bool use_md5 )
+{
+    rc_t rc;
+    int ptype;
+    char idxpath [ 4096 ];
+
+    rc = KDirectoryResolvePath ( wd, true,
+                                  idxpath, sizeof idxpath, "%s", path );
+    if ( rc == 0 )
+    {
+        KIndex *idx;
+        switch ( ptype = KDBPathType ( wd, NULL, idxpath ) )
+        {
+        case kptNotFound:
+            /* first good path */
+            break;
+
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcCreating, rcPath, rcInvalid );
+
+        case kptIndex:
+        case kptIndex | kptAlias:
+            /* found so is not good if we want to create new and not
+             * clear/init or open old
+             */
+            if ((cmode & kcmValueMask) == kcmCreate)
+                return RC ( rcDB, rcMgr, rcCreating, rcIndex, rcExists );
+            if (KDBManagerOpenObjectBusy (self, idxpath))
+                return RC ( rcDB, rcMgr, rcCreating, rcIndex, rcBusy );
+
+            /* test now for locked file */
+            rc = KDBWritable ( wd, idxpath );
+            if (rc)
+            {
+                switch (GetRCState(rc))
+                {
+                default:
+                    return rc;
+                case rcLocked:
+                    return RC ( rcDB, rcMgr, rcCreating, rcDatabase, rcLocked );
+                case rcReadonly:
+                    return RC ( rcDB, rcMgr, rcCreating, rcDatabase, rcReadonly );
+                case rcNotFound:
+                    /* not found is good but probably unreachable */
+                    break;
+                case 0:
+                    rc = 0;
+                    break;
+                }
+            }
+            /* second good path */
+            break;
+
+        case kptTable:
+        case kptTable | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcTable, rcExists);
+
+        case kptColumn:
+        case kptColumn | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcColumn, rcExists);
+
+        case kptDatabase:
+        case kptDatabase | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcDatabase, rcExists);
+
+        case kptMetadata:
+        case kptMetadata | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcMetadata, rcExists);
+
+        default:
+            return RC ( rcDB, rcMgr, rcCreating, rcPath, rcIncorrect );
+        }
+
+        rc = KIndexCreate ( & idx, wd, type, cmode, path, ptype );
+        if ( rc == 0 )
+        {
+            rc = KDBManagerInsertIndex (self, idx);
+            if ( rc == 0 )
+            {
+                idx -> use_md5 = use_md5;
+                * idxp = idx;
+                return 0;
+            }
+            
+            KIndexRelease ( idx );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseCreateIndex ( struct KDatabase *self, KIndex **idx,
+    KIdxType type, KCreateMode cmode, const char *name, ... )
+{
+    rc_t rc = 0;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVCreateIndex ( self, idx, type, cmode, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVCreateIndex ( KDatabase *self, KIndex **idxp,
+    KIdxType type, KCreateMode cmode, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    KDirectory *dir;
+
+    if ( idxp == NULL )
+        return RC ( rcDB, rcDatabase, rcCreating, rcParam, rcNull );
+
+    * idxp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcCreating, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcDatabase, rcCreating, rcDatabase, rcReadonly );
+
+    rc = KDirectoryVCreateDir ( self -> dir, 0777, kcmOpen, "idx", NULL );
+    if ( rc == 0 )
+        rc = KDirectoryVOpenDirUpdate ( self -> dir, & dir, false, "idx", NULL );
+    if ( rc == 0 )
+    {
+        char path [ 256 ];
+        rc = KDirectoryVResolvePath ( dir, false, path, sizeof path, name, args );
+        if ( rc == 0 )
+        {
+            rc = KDBManagerCreateIndexInt ( self -> mgr, idxp, dir,
+                type, cmode | kcmParents, path, (self -> cmode & kcmMD5) != 0 );
+            if ( rc == 0 )
+            {
+                KIndex *idx = * idxp;
+                idx -> db = KDatabaseAttach ( self );
+            }
+        }
+
+        KDirectoryRelease ( dir );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableCreateIndex ( struct KTable *self, KIndex **idx,
+    KIdxType type, KCreateMode cmode, const char *name, ... )
+{
+    rc_t rc = 0;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KTableVCreateIndex ( self, idx, type, cmode, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableVCreateIndex ( KTable *self, KIndex **idxp,
+    KIdxType type, KCreateMode cmode, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    KDirectory *dir;
+
+    if ( idxp == NULL )
+        return RC ( rcDB, rcTable, rcCreating, rcParam, rcNull );
+
+    * idxp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcCreating, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcTable, rcCreating, rcTable, rcReadonly );
+
+    rc = KDirectoryVCreateDir ( self -> dir, 0777, kcmOpen, "idx", NULL );
+    if ( rc == 0 )
+        rc = KDirectoryVOpenDirUpdate ( self -> dir, & dir, false, "idx", NULL );
+    if ( rc == 0 )
+    {
+        char path [ 256 ];
+        rc = KDirectoryVResolvePath ( dir, false, path, sizeof path, name, args );
+        if ( rc == 0 )
+        {
+            rc = KDBManagerCreateIndexInt ( self -> mgr, idxp, dir,
+                type, cmode | kcmParents, path, self -> use_md5 );
+            if ( rc == 0 )
+            {
+                KIndex *idx = * idxp;
+                idx -> tbl = KTableAttach ( self );
+            }
+        }
+
+        KDirectoryRelease ( dir );
+    }
+
+    return rc;
+}
+
+
+/* OpenIndexRead
+ * VOpenIndexRead
+ *  open an index for read
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+static
+rc_t KDBManagerOpenIndexReadInt ( KDBManager *self,
+    const KIndex **idxp, const KDirectory *wd, const char *path )
+{
+    char idxpath [ 4096 ];
+    rc_t rc = KDirectoryResolvePath ( wd, true,
+                                      idxpath, sizeof idxpath, "%s", path );
+    if ( rc == 0 )
+    {
+        KIndex *idx;
+        KSymbol * sym;
+
+        /* if already open */
+        sym = KDBManagerOpenObjectFind (self, idxpath);
+        if (sym != NULL)
+        {
+            const KIndex * cidx;
+            rc_t obj;
+            
+            switch (sym->type)
+            {
+            case kptIndex:
+                cidx = (const KIndex *)sym->u.obj;
+#if 0
+                /* if open for update, refuse */
+                if ( cidx -> read_only )
+#endif
+#if 0
+                if (cidx is coherent)
+#endif
+                {
+                    /* attach a new reference and we're gone */
+                    rc = KIndexAddRef ( cidx );
+                    if ( rc == 0 )
+                        * idxp = cidx;
+                    return rc;
+                }
+                obj = rcDatabase;
+                break;
+                
+            default:
+                obj = rcPath;
+                break;
+            case kptTable:
+                obj = rcTable;
+                break;
+            case kptColumn:
+                obj = rcColumn;
+                break;
+            case kptDatabase:
+                obj = rcDatabase;
+                break;
+            case kptMetadata:
+                obj = rcMetadata;
+                break;
+            }
+            return  RC (rcDB, rcMgr, rcOpening, obj, rcBusy);
+        }
+        
+        switch ( KDirectoryPathType ( wd, "%s", idxpath ) )
+        {
+        case kptNotFound:
+            return RC ( rcDB, rcMgr, rcOpening, rcIndex, rcNotFound );
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcInvalid );
+        case kptFile:
+        case kptFile | kptAlias:
+            break;
+        default:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcIncorrect );
+        }
+
+        rc = KIndexMakeRead ( & idx, wd, idxpath );
+        if ( rc == 0 )
+        {
+            idx -> read_only = true;
+            rc = KDBManagerInsertIndex (self, idx);
+            if ( rc == 0 )
+            {
+                * idxp = idx;
+                return 0;
+            }
+
+            KIndexRelease ( idx );
+        }
+    }
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenIndexRead ( struct KDatabase const *self,
+    const KIndex **idx, const char *name, ... )
+{
+    rc_t rc = 0;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVOpenIndexRead ( self, idx, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVOpenIndexRead ( const KDatabase *cself,
+    const KIndex **idxp, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    char path [ 256 ];
+
+    if ( idxp == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * idxp = NULL;
+
+    if ( cself == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    rc = KDBVMakeSubPath ( cself -> dir,
+        path, sizeof path, "idx", 3, name, args );
+    if ( rc == 0 )
+    {
+        KIndex *idx;
+        rc = KDBManagerOpenIndexReadInt ( cself -> mgr, (const KIndex **)& idx,
+                                          cself -> dir, path );
+        if ( rc == 0 )
+        {
+            KDatabase *self = ( KDatabase* ) cself;
+            idx -> db = KDatabaseAttach ( self );
+            * idxp = idx;
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableOpenIndexRead ( struct KTable const *self,
+    const KIndex **idx, const char *name, ... )
+{
+    rc_t rc = 0;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KTableVOpenIndexRead ( self, idx, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableVOpenIndexRead ( const KTable *self,
+    const KIndex **idxp, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    char path [ 256 ];
+
+    const char *ns = "idx";
+    uint32_t ns_size = 3;
+
+    if ( idxp == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcParam, rcNull );
+
+    * idxp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcSelf, rcNull );
+
+    if ( self -> prerelease )
+    {
+        ns = "";
+        ns_size = 0;
+    }
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, ns, ns_size, name, args );
+    if ( rc == 0 )
+    {
+        KIndex *idx;
+        rc = KDBManagerOpenIndexReadInt ( self -> mgr, (const KIndex**)& idx,
+                                          self -> dir, path );
+        if ( rc == 0 )
+        {
+            if (idx->tbl != self)
+                idx -> tbl = KTableAttach ( self );
+            * idxp = idx;
+        }
+    }
+    return rc;
+}
+
+
+/* OpenIndexUpdate
+ * VOpenIndexUpdate
+ *  open an index for read/write
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+static
+rc_t KDBManagerOpenIndexUpdate ( KDBManager *self,
+    KIndex **idxp, KDirectory *wd, const char *path )
+{
+    char idxpath [ 4096 ];
+    rc_t rc = KDirectoryResolvePath ( wd, true,
+                                      idxpath, sizeof idxpath, "%s", path );
+    if ( rc == 0 )
+    {
+        KSymbol * sym;
+        KIndex *idx;
+
+        sym =  KDBManagerOpenObjectFind (self, idxpath);
+        if (sym != NULL)
+        {
+            rc_t obj;
+            switch (sym->type)
+            {
+            default:
+                obj = rcPath;
+                break;
+            case kptDatabase:
+                obj = rcDatabase;
+                break;
+            case kptTable:
+                obj = rcTable;
+                break;
+            case kptColumn:
+                obj = rcColumn;
+                break;
+            case kptIndex:
+                obj = rcIndex;
+                break;
+            case kptMetadata:
+                obj = rcMetadata;
+                break;
+            }
+            return RC ( rcDB, rcMgr, rcOpening, obj, rcBusy );
+        }
+        /* only open existing indices
+         * this seems wrong but its because the KDBPathType seems wrong
+         */
+        switch ( KDirectoryPathType ( wd, "%s", idxpath ) )
+        {
+        case kptNotFound:
+            return RC ( rcDB, rcMgr, rcOpening, rcIndex, rcNotFound );
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcInvalid );
+        case kptFile:
+        case kptFile | kptAlias:
+            break;
+        default:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcIncorrect );
+        }
+
+        rc = KIndexMakeUpdate ( & idx, wd, path );
+        if ( rc == 0 )
+        {
+            rc = KDBManagerInsertIndex (self, idx);
+            if ( rc == 0 )
+            {
+                * idxp = idx;
+                return 0;
+            }
+            
+            KIndexRelease ( idx );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenIndexUpdate ( struct KDatabase *self,
+    KIndex **idx, const char *name, ... )
+{
+    rc_t rc = 0;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVOpenIndexUpdate ( self, idx, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVOpenIndexUpdate ( KDatabase *self,
+    KIndex **idxp, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    KDirectory *dir;
+
+    if ( idxp == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * idxp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcDatabase, rcOpening, rcDatabase, rcReadonly );
+
+    rc = KDirectoryVOpenDirUpdate ( self -> dir, & dir, false, "idx", NULL );
+    if ( rc == 0 )
+    {
+        char path [ 256 ];
+        rc = KDirectoryVResolvePath ( dir, false, path, sizeof path, name, args );
+        if ( rc == 0 )
+        {
+            rc = KDBManagerOpenIndexUpdate ( self -> mgr, idxp, dir, path );
+            if ( rc == 0 )
+            {
+                KIndex *idx = * idxp;
+                idx -> db = KDatabaseAttach ( self );
+            }
+        }
+
+        KDirectoryRelease ( dir );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableOpenIndexUpdate ( struct KTable *self,
+    KIndex **idx, const char *name, ... )
+{
+    rc_t rc = 0;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KTableVOpenIndexUpdate ( self, idx, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableVOpenIndexUpdate ( KTable *self,
+    KIndex **idxp, const char *name, va_list args )
+{
+    rc_t rc = 0;
+    KDirectory *dir;
+
+    if ( idxp == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcParam, rcNull );
+
+    * idxp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcTable, rcOpening, rcTable, rcReadonly );
+
+    rc = KDirectoryVOpenDirUpdate ( self -> dir, & dir, false, "idx", NULL );
+    if ( rc == 0 )
+    {
+        char path [ 256 ];
+        rc = KDirectoryVResolvePath ( dir, false, path, sizeof path, name, args );
+        if ( rc == 0 )
+        {
+            rc = KDBManagerOpenIndexUpdate ( self -> mgr, idxp, dir, path );
+            if ( rc == 0 )
+            {
+                KIndex *idx = * idxp;
+                idx -> tbl = KTableAttach ( self );
+            }
+        }
+
+        KDirectoryRelease ( dir );
+    }
+    return rc;
+}
+
+
+/* Locked
+ *  returns non-zero if locked
+ */
+LIB_EXPORT bool CC KIndexLocked ( const KIndex *self )
+{
+    if ( self != NULL )
+    {
+        rc_t rc = KDBWritable ( self -> dir, "" );
+        if (GetRCState ( rc ) == rcLocked)
+            return true;
+    }
+    return false;
+}
+
+
+/* Version
+ *  returns the format version
+ */
+LIB_EXPORT rc_t CC KIndexVersion ( const KIndex *self, uint32_t *version )
+{
+    if ( version == NULL )
+        return RC ( rcDB, rcIndex, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * version = 0;
+        return RC ( rcDB, rcIndex, rcAccessing, rcSelf, rcNull );
+    }
+
+    * version = self -> vers;
+    return 0;
+}
+
+
+/* Type
+ *  returns the type of index
+ */
+LIB_EXPORT rc_t CC KIndexType ( const KIndex *self, KIdxType *type )
+{
+    if ( type == NULL )
+        return RC ( rcDB, rcIndex, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * type = ( KIdxType ) 0;
+        return RC ( rcDB, rcIndex, rcAccessing, rcSelf, rcNull );
+    }
+
+    * type = ( KIdxType ) self -> type;
+    return 0;
+}
+
+/* Commit
+ *  ensure any changes are committed to disk
+ */
+LIB_EXPORT rc_t CC KIndexCommit ( KIndex *self )
+{
+    rc_t rc = 0;
+    bool proj;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcCommitting, rcSelf, rcNull );
+
+    if ( ! self -> dirty )
+        return 0;
+
+    rc = RC ( rcDB, rcIndex, rcCommitting, rcType, rcUnsupported );
+
+    proj = ( self -> type & kitProj ) != 0;
+
+    switch ( self -> type )
+    {
+        case kitText:
+        case kitText | kitProj:
+            switch ( self -> vers )
+            {
+            case 1:
+                rc = KTrieIndexPersist_v1 ( & self -> u . txt1,
+                    proj, self -> dir, self -> path, self -> use_md5 );
+                break;
+            case 2:
+            case 3:
+            case 4:
+                rc = KTrieIndexPersist_v2 ( & self -> u . txt2,
+                    proj, self -> dir, self -> path, self -> use_md5 );
+                break;
+            }
+            break;
+
+        case kitU64:
+            switch(self -> vers) {
+            case 3:
+            case 4:
+                rc = KU64IndexPersist_v3(&self->u.u64_3, proj, self->dir,
+                                         self->path, self->use_md5);
+                break;
+            }
+            break;
+    }
+
+    if ( rc == 0 )
+        self -> dirty = false;
+
+    return rc;
+}
+
+/* Insert
+ *  creates a mapping from key to id
+ *  and potentially from id to key if supported
+ *
+ *  "unique" [ IN ] - if non zero, key must be unique
+ *
+ *  "key" [ IN ] - NUL terminated string for text
+ *
+ *  "id" [ IN ] - id
+ */
+LIB_EXPORT rc_t CC KIndexInsertText ( KIndex *self, bool unique,
+    const char *key, int64_t id )
+{
+    rc_t rc = 0;
+    bool proj;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcInserting, rcSelf, rcNull );
+    if ( key == NULL )
+        return RC ( rcDB, rcIndex, rcInserting, rcString, rcNull );
+    if ( key [ 0 ] == 0 )
+        return RC ( rcDB, rcIndex, rcInserting, rcString, rcInvalid );
+    if ( self -> read_only )
+        return RC ( rcDB, rcIndex, rcInserting, rcIndex, rcReadonly );
+
+    proj = false;
+    switch ( self -> type )
+    {
+    case kitText | kitProj:
+        proj = true;
+    case kitText:
+        switch ( self -> vers )
+        {
+        case 1:
+            /* there is a limit on ids in v1 */
+            if ( id <= 0 || ( id >> 32 ) != 0 )
+                return RC ( rcDB, rcIndex, rcInserting, rcId, rcExcessive );
+
+            rc = KTrieIndexInsert_v1 ( & self -> u . txt1,
+                proj, key, ( uint32_t ) id );
+            break;
+        case 2:
+        case 3:
+        case 4:
+            rc = KTrieIndexInsert_v2 ( & self -> u . txt2,
+                proj, key, id );
+            break;
+        default:
+            return RC ( rcDB, rcIndex, rcInserting, rcIndex, rcBadVersion );
+        }
+        break;
+    default:
+        return RC ( rcDB, rcIndex, rcInserting, rcType, rcUnsupported );
+    }
+
+    switch ( GetRCState ( rc ) )
+    {
+    case 0:
+        self -> dirty = true;
+        break;
+    case rcExists:
+        if ( ! unique )
+            rc = RC ( rcDB, rcIndex, rcInserting, rcConstraint, rcViolated );
+    default:
+        break;
+    }
+
+    return rc;
+}
+
+
+/* Delete
+ *  deletes all mappings from key
+ */
+LIB_EXPORT rc_t CC KIndexDeleteText ( KIndex *self, const char *key )
+{
+    rc_t rc;
+    bool proj;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcRemoving, rcSelf, rcNull );
+    if ( key == NULL )
+        return RC ( rcDB, rcIndex, rcRemoving, rcString, rcNull );
+    if ( key [ 0 ] == 0 )
+        return RC ( rcDB, rcIndex, rcRemoving, rcString, rcInvalid );
+    if ( self -> read_only )
+        return RC ( rcDB, rcIndex, rcRemoving, rcIndex, rcReadonly );
+
+    proj = false;
+    switch ( self -> type )
+    {
+    case kitText | kitProj:
+        proj = true;
+    case kitText:
+        switch ( self -> vers )
+        {
+        case 1:
+            rc = KTrieIndexDelete_v1 ( & self -> u . txt1, proj, key );
+            break;
+        case 2:
+        case 3:
+        case 4:
+            rc = KTrieIndexDelete_v2 ( & self -> u . txt2, proj, key );
+            break;
+        default:
+            return RC ( rcDB, rcIndex, rcRemoving, rcIndex, rcBadVersion );
+        }
+        break;
+    default:
+        return RC ( rcDB, rcIndex, rcRemoving, rcType, rcUnsupported );
+    }
+
+    if ( rc == 0 )
+        self -> dirty = true;
+
+    return rc;
+}
+
+
+/* Find
+ *  finds a single mapping from key
+ */
+LIB_EXPORT rc_t CC KIndexFindText ( const KIndex *self, const char *key, int64_t *start_id, uint64_t *id_count,
+    int ( CC * custom_cmp ) ( const void *item, struct PBSTNode const *n, void *data ),
+    void *data )
+{
+    rc_t rc = 0;
+    uint32_t id32, span;
+
+    if ( id_count != NULL )
+        * id_count = 0;
+
+    if ( start_id == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcParam, rcNull );
+
+    * start_id = 0;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcSelf, rcNull );
+    if ( key == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcString, rcNull );
+    if ( key[ 0 ] == 0 )
+        return RC ( rcDB, rcIndex, rcSelecting, rcString, rcInvalid );
+
+    span = 1;
+
+    switch ( self -> type )
+    {
+    case kitText:
+    case kitText | kitProj:
+        switch ( self -> vers )
+        {
+        case 1:
+            rc = KTrieIndexFind_v1 ( & self -> u . txt1, key, & id32, custom_cmp, data );
+            if ( rc == 0 )
+                * start_id = id32;
+            break;
+        case 2:
+        case 3:
+        case 4:
+#if V2FIND_RETURNS_SPAN
+            rc = KTrieIndexFind_v2 ( & self -> u . txt2, key, start_id, & span, custom_cmp, data, self -> converted_from_v1 );
+#else
+            ( void ) ( span = 0 );
+            rc = KTrieIndexFind_v2 ( & self -> u . txt2, key, start_id, custom_cmp, data, self -> converted_from_v1  );
+#endif
+            break;
+        default:
+            return RC ( rcDB, rcIndex, rcSelecting, rcIndex, rcBadVersion );
+        }
+        break;
+    default:
+        return RC ( rcDB, rcIndex, rcSelecting, rcType, rcUnsupported );
+    }
+
+    if ( id_count != NULL )
+        * id_count = span;
+    
+    return rc;
+}
+
+
+/* FindAll
+ *  finds all mappings from key
+ */
+LIB_EXPORT rc_t CC KIndexFindAllText ( const KIndex *self, const char *key,
+    rc_t ( CC * f ) ( int64_t id, uint64_t id_count, void *data ), void *data )
+{
+    rc_t rc = 0;
+    int64_t id64;
+    uint32_t id32, span;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcSelf, rcNull );
+    if ( f == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcFunction, rcNull );
+    if ( key == NULL )
+        return RC ( rcDB, rcIndex, rcSelecting, rcString, rcNull );
+    if ( key[ 0 ] == 0 )
+        return RC ( rcDB, rcIndex, rcSelecting, rcString, rcInvalid );
+
+    span = 1;
+
+    switch ( self -> type )
+    {
+    case kitText:
+    case kitText | kitProj:
+        switch ( self -> vers )
+        {
+        case 1:
+            rc = KTrieIndexFind_v1 ( & self -> u . txt1, key, & id32, NULL, NULL );
+            if ( rc == 0 )
+                rc = ( * f ) ( id32, 1, data );
+            break;
+        case 2:
+        case 3:
+        case 4:
+#if V2FIND_RETURNS_SPAN
+            rc = KTrieIndexFind_v2 ( & self -> u . txt2, key, & id64, & span, NULL, NULL, self -> converted_from_v1 );
+#else
+            rc = KTrieIndexFind_v2 ( & self -> u . txt2, key, & id64, NULL, NULL, self -> converted_from_v1 );
+#endif
+            if ( rc == 0 )
+                rc = ( * f ) ( id64, span, data );
+            break;
+        default:
+            return RC ( rcDB, rcIndex, rcSelecting, rcIndex, rcBadVersion );
+        }
+        break;
+    default:
+        return RC ( rcDB, rcIndex, rcSelecting, rcType, rcUnsupported );
+    }
+    
+    return rc;
+}
+
+
+/* Project
+ *  finds key(s) mapping to value/id if supported
+ */
+LIB_EXPORT rc_t CC KIndexProjectText ( const KIndex *self,
+    int64_t id, int64_t *start_id, uint64_t *id_count,
+    char *key, size_t kmax, size_t *actsize )
+{
+    rc_t rc = 0;
+    int64_t dummy;
+    uint32_t span;
+
+    if ( start_id == NULL )
+        start_id = & dummy;
+
+    * start_id = 0;
+
+    if ( id_count != NULL )
+        * id_count = 0;
+
+    if ( key == NULL && kmax != 0 )
+        return RC ( rcDB, rcIndex, rcProjecting, rcBuffer, rcNull );
+
+    if ( kmax != 0 )
+        key [ 0 ] = 0;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcProjecting, rcSelf, rcNull );
+        
+    if ( ( ( KIdxType ) self -> type & kitProj ) == 0 )
+        return RC ( rcDB, rcIndex, rcProjecting, rcFunction, rcInvalid );
+
+    span = 1;
+
+    switch ( self -> type )
+    {
+    case kitText:
+    case kitText | kitProj:
+        switch ( self -> vers )
+        {
+        case 1:
+            /* there is a limit on ids in v1 */
+            if ( id <= 0 || ( id >> 32 ) != 0 )
+                return RC ( rcDB, rcIndex, rcProjecting, rcId, rcNotFound );
+
+            rc = KTrieIndexProject_v1 ( & self -> u . txt1,
+                    ( uint32_t ) id, key, kmax, actsize );
+            if ( rc == 0 )
+                * start_id = id;
+            break;
+        case 2:
+        case 3:
+        case 4:
+#if V2FIND_RETURNS_SPAN
+            rc = KTrieIndexProject_v2 ( & self -> u . txt2, id, start_id, & span, key, kmax, actsize );
+#else
+            rc = KTrieIndexProject_v2 ( & self -> u . txt2, id, key, kmax, actsize );
+            if ( rc == 0 )
+                * start_id = id;
+#endif
+            break;
+        default:
+            return RC ( rcDB, rcIndex, rcProjecting, rcIndex, rcBadVersion );
+        }
+        break;
+    default:
+        return RC ( rcDB, rcIndex, rcProjecting, rcType, rcUnsupported );
+    }
+
+    if ( id_count != NULL )
+        * id_count = span;
+        
+    return rc;
+}
+
+
+/* ProjectAll
+ *  finds key(s) mapping to value/id if supported
+ */
+LIB_EXPORT rc_t CC KIndexProjectAllText ( const KIndex *self, int64_t id,
+    rc_t ( CC * f ) ( int64_t start_id, uint64_t id_count, const char *key, void *data ),
+    void *data )
+{
+    rc_t rc = 0;
+    char key [ 256 ];
+
+    uint32_t span;
+    int64_t start_id;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcIndex, rcProjecting, rcSelf, rcNull );
+    if ( f == NULL )
+        return RC ( rcDB, rcIndex, rcProjecting, rcFunction, rcNull );
+    if ( ( ( KIdxType ) self -> type & kitProj ) == 0 )
+        return RC ( rcDB, rcIndex, rcProjecting, rcFunction, rcInvalid );
+        
+    span = 1;
+
+    switch ( self -> type )
+    {
+    case kitText:
+    case kitText | kitProj:
+        switch ( self -> vers )
+        {
+        case 1:
+            /* there is a limit on ids in v1 */
+            if ( id <= 0 || ( id >> 32 ) != 0 )
+                return RC ( rcDB, rcIndex, rcProjecting, rcId, rcNotFound );
+
+            rc = KTrieIndexProject_v1 ( & self -> u . txt1,
+                ( uint32_t ) id, key, sizeof key, NULL );
+            if ( rc == 0 )
+                rc = ( * f ) ( id, 1, key, data );
+            break;
+            
+        case 2:
+        case 3:
+        case 4:
+#if V2FIND_RETURNS_SPAN
+            rc = KTrieIndexProject_v2 ( & self -> u . txt2, id, & start_id, & span, key, sizeof key, NULL );
+#else
+            rc = KTrieIndexProject_v2 ( & self -> u . txt2, id, key, sizeof key, NULL );
+#endif
+            if ( rc == 0 )
+                rc = ( * f ) ( start_id, span, key, data );
+            break;
+            
+        default:
+            return RC ( rcDB, rcIndex, rcProjecting, rcIndex, rcBadVersion );
+        }
+        break;
+    default:
+        return RC ( rcDB, rcIndex, rcProjecting, rcType, rcUnsupported );
+    }
+        
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KIndexInsertU64( KIndex *self, bool unique, uint64_t key, 
+    uint64_t key_size, int64_t id, uint64_t id_qty )
+{
+    rc_t rc = 0;
+
+    if( self == NULL ) {
+        return RC(rcDB, rcIndex, rcInserting, rcSelf, rcNull);
+    }
+    if( self->read_only ) {
+        return RC(rcDB, rcIndex, rcInserting, rcIndex, rcReadonly);
+    }
+
+    switch( self->type )
+    {
+    case kitU64:
+        switch( self->vers )
+        {
+        case 3:
+        case 4:
+            rc = KU64IndexInsert_v3(&self->u.u64_3, unique, key, key_size, id, id_qty );
+            break;
+        default:
+            return RC(rcDB, rcIndex, rcInserting, rcIndex, rcBadVersion);
+        }
+        break;
+        
+    default:
+        return RC(rcDB, rcIndex, rcInserting, rcType, rcUnsupported);
+    }
+
+    switch( GetRCState(rc) ) {
+        case 0:
+            self->dirty = true;
+            break;
+        case rcExists:
+            if( !unique ) {
+                rc = RC(rcDB, rcIndex, rcInserting, rcConstraint, rcViolated);
+            }
+        default:
+            break;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KIndexDeleteU64( KIndex *self, uint64_t key )
+{
+    rc_t rc = 0;
+
+    if( self == NULL ) {
+        return RC(rcDB, rcIndex, rcRemoving, rcSelf, rcNull);
+    }
+    if( self->read_only ) {
+        return RC(rcDB, rcIndex, rcRemoving, rcIndex, rcReadonly);
+    }
+
+    switch( self->type )
+    {
+    case kitU64:
+        switch( self->vers )
+        {
+        case 3:
+        case 4:
+            rc = KU64IndexDelete_v3(&self->u.u64_3, key);
+            break;
+        default:
+            return RC(rcDB, rcIndex, rcRemoving, rcIndex, rcBadVersion);
+        }
+        break;
+    default:
+        return RC(rcDB, rcIndex, rcRemoving, rcType, rcUnsupported);
+    }
+
+    if( rc == 0 ) {
+        self -> dirty = true;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KIndexFindU64( const KIndex* self, uint64_t offset, uint64_t* key, 
+    uint64_t* key_size, int64_t* id, uint64_t* id_qty )
+{
+    rc_t rc = 0;
+
+    if( key == NULL || key_size == NULL || id == NULL || id_qty == NULL ) {
+        return RC(rcDB, rcIndex, rcSelecting, rcParam, rcNull);
+    }
+    *key = *key_size = *id = *id_qty = 0;
+    if( self == NULL ) {
+        return RC(rcDB, rcIndex, rcSelecting, rcSelf, rcNull);
+    }
+
+    switch( self->type )
+    {
+    case kitU64:
+        switch( self->vers )
+        {
+        case 3:
+        case 4:
+            rc = KU64IndexFind_v3(&self->u.u64_3, offset, key, key_size, id, id_qty);
+            break;
+        default:
+            return RC(rcDB, rcIndex, rcSelecting, rcIndex, rcBadVersion);
+        }
+        break;
+    default:
+        return RC(rcDB, rcIndex, rcSelecting, rcType, rcUnsupported);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KIndexFindAllU64( const KIndex* self, uint64_t offset,
+    rc_t ( CC * f )(uint64_t key, uint64_t key_size, int64_t id, uint64_t id_qty, void* data ), void* data)
+{
+    rc_t rc = 0;
+
+    if( self == NULL ) {
+        return RC(rcDB, rcIndex, rcSelecting, rcSelf, rcNull);
+    }
+    if( f == NULL ) {
+        return RC(rcDB, rcIndex, rcSelecting, rcFunction, rcNull);
+    }
+
+    switch( self->type )
+    {
+    case kitU64:
+        switch( self->vers )
+        {
+        case 3:
+        case 4:
+            rc = KU64IndexFindAll_v3(&self->u.u64_3, offset, f, data);
+            break;
+        default:
+            return RC(rcDB, rcIndex, rcSelecting, rcIndex, rcBadVersion);
+        }
+        break;
+    default:
+        return RC(rcDB, rcIndex, rcSelecting, rcType, rcUnsupported);
+    }
+    return rc;
+}
+
+
+/* SetMaxId
+ *  certain legacy versions of skey were built to know only the starting id
+ *  of the NAME_FMT column, but were never given a maximum id. allow them
+ *  to be corrected here.
+ */
+LIB_EXPORT void CC KIndexSetMaxRowId ( const KIndex *cself, int64_t max_row_id )
+{
+    if ( cself != NULL ) switch ( cself -> type )
+    {
+    case kitText:
+    case kitText | kitProj:
+        switch ( cself -> vers )
+        {
+        case 2:
+        case 3:
+        case 4:
+            /* here we can repair the max row id */
+            if ( cself -> u . txt2 . pt . maxid < max_row_id )
+                ( ( KIndex* ) cself ) -> u . txt2 . pt . maxid = max_row_id;
+            break;
+        }
+        break;
+    }
+}
diff --git a/libs/kdb/wkdb-priv.h b/libs/kdb/wkdb-priv.h
new file mode 100644
index 0000000..5f18aba
--- /dev/null
+++ b/libs/kdb/wkdb-priv.h
@@ -0,0 +1,160 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kdb_priv_
+#define _h_kdb_priv_
+
+#ifndef _h_kdb_manager_
+#include <kdb/manager.h>
+#endif
+
+#ifndef _h_kdb_manager_
+#include <kdb/manager.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This symbol is inserted where the KDB is being tweaked to allow
+ * VFS URI syntax in opening KDB database objects initially to support
+ * krypto passwords more fully.  By specifying the password source
+ * individually for opens two KDB objects with different passwords can be opened.
+ */
+#define SUPPORT_VFS_URI 1
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct BSTree;
+struct BSTNode;
+struct KDirectory;
+struct KDBManager;
+
+/*--------------------------------------------------------------------------
+ * KDB utility
+ */
+
+
+/* PathType
+ *  checks type of path
+ *
+ * if mgr != NULL we will try accession and uri resolution on path
+ */
+int KDBPathTypeDir ( const struct KDirectory *dir, int type,bool *zombies, const char *path );
+int KDBPathType ( const struct KDirectory *dir, bool *zombies, const char *path );
+
+/* OpenPathType
+ * Opens a path if it is of the specified type.  Even if it is an archive file
+ * instead of a directory.
+ *
+ * if dpdir is NULL it will not return with an open Directory but it will have
+ * checked that the type requested is the type present even if in an archive.
+ *
+ * if realpathtype is not NULL the found type will be returned regardless
+ * of a match to request path type.
+ *
+ * the return will be zero only if the path does point to a directory or
+ * archive that is of the requested type.  An archive will have been opened
+ * but reshut if dpdir is NULL.
+ */ 
+rc_t KDBOpenPathTypeRead ( const struct KDBManager * mgr, const struct KDirectory * dir, const char * path, 
+    const struct KDirectory ** dpdir, int pathtype, int * realpathtype, bool try_srapath );
+
+/* Writable
+ *  examines a directory structure for any "lock" files
+ *  examines a file for ( any ) write permission
+ */
+bool KDBIsLocked ( const struct KDirectory *dir, const char *path );
+rc_t KDBWritable ( const struct KDirectory *dir, const char *path );
+
+/* Lock
+ *  performs directory locking
+ */
+rc_t KDBLockDir ( struct KDirectory *dir, const char *path );
+rc_t KDBLockFile ( struct KDirectory *dir, const char *path );
+
+/* Unlock
+ *  performs directory unlocking
+ */
+rc_t KDBUnlockDir ( struct KDirectory *dir, const char *path );
+rc_t KDBUnlockFile ( struct KDirectory *dir, const char *path );
+
+/* GetObjModDate
+ *  extract mod date from a path
+ */
+rc_t KDBGetObjModDate ( const struct KDirectory *dir, KTime_t *mtime );
+
+/* GetPathModDate
+ *  extract mod date from a path
+ */
+rc_t KDBVGetPathModDate ( const struct KDirectory *dir,
+    KTime_t *mtime, const char *path, va_list args );
+
+/* GetNamespaceString
+ *  return a static const reference to a string representing 
+ *  a namespace for the given kpt<database> type in namespace
+ */
+const char * KDBGetNamespaceString ( int namespace );
+
+/* KDBMakeSubPath
+ *  adds a namespace to path spec
+ */
+rc_t KDBMakeSubPath ( struct KDirectory const *dir,
+    char *subpath, size_t subpath_max, const char *ns,
+    uint32_t ns_size, const char *path, ... );
+/* VMakeSubPath
+ *  adds a namespace to path spec
+ */
+rc_t KDBVMakeSubPath ( const struct KDirectory *dir,
+    char *subpath, size_t subpath_max, const char *ns,
+    uint32_t ns_size, const char *path, va_list args );
+
+/* VDrop
+ */
+rc_t KDBMgrVDrop ( struct KDirectory * dir, const struct KDBManager * mgr, uint32_t obj_type,
+                   const char * path, va_list args );
+rc_t KDBVDrop ( struct KDirectory *dir, const struct KDBManager * mgr,
+    uint32_t type, const char *name, va_list args );
+
+/* Rename
+ */
+rc_t KDBRename ( struct KDirectory *dir, struct KDBManager *mgr,
+                 uint32_t type, bool force, const char *from, const char *to );
+
+/* Alias
+ */
+rc_t KDBAlias ( struct KDirectory *dir, uint32_t type,
+    const char *targ, const char *alias );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kdb_priv_ */
diff --git a/libs/kdb/wkdb.c b/libs/kdb/wkdb.c
new file mode 100644
index 0000000..1dfb697
--- /dev/null
+++ b/libs/kdb/wkdb.c
@@ -0,0 +1,1430 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#include "wkdb-priv.h"
+#include "kdbfmt-priv.h"
+#include "dbmgr-priv.h"
+
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+#include <krypto/wgaencrypt.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/resolver.h>
+#include <vfs/manager-priv.h>
+#include <sra/srapath.h>
+
+#include <kfs/kfs-priv.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/arc.h>
+#include <kfs/tar.h>
+#include <kfs/sra.h>
+#include <kfs/kfs-priv.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <va_copy.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+#include <errno.h>
+
+#ifndef SUPPORT_VFS_URI
+#define SUPPORT_VFS_URI 0
+#endif
+
+#ifndef SUPPORT_WKDB_TAR
+#define SUPPORT_WKDB_TAR 0
+#endif
+
+/*--------------------------------------------------------------------------
+ * (W)KDB utility
+ */
+
+/* KDBHdrValidate
+ *  validates that a header sports a supported byte order
+ *  and that the version is within range
+ */
+rc_t KDBHdrValidate ( const KDBHdr *hdr, size_t size,
+    uint32_t min_vers, uint32_t max_vers )
+{
+    assert ( hdr != NULL );
+
+    if ( size < sizeof * hdr )
+        return RC ( rcDB, rcHeader, rcValidating, rcData, rcCorrupt );
+
+    if ( hdr -> endian != eByteOrderTag )
+    {
+        if ( hdr -> endian == eByteOrderReverse )
+            return RC ( rcDB, rcHeader, rcValidating, rcByteOrder, rcIncorrect );
+        return RC ( rcDB, rcHeader, rcValidating, rcData, rcCorrupt );
+    }
+
+    if ( hdr -> version < min_vers || hdr -> version > max_vers )
+        return RC ( rcDB, rcHeader, rcValidating, rcHeader, rcBadVersion );
+
+    return 0;
+}
+
+/* KDBPathType
+ *  checks type of path
+ */
+enum ScanBits
+{
+    scan_db     = ( 1 <<  0 ),
+    scan_tbl    = ( 1 <<  1 ),
+    scan_idx    = ( 1 <<  2 ),
+    scan_col    = ( 1 <<  3 ),
+    scan_idxN   = ( 1 <<  4 ),
+    scan_data   = ( 1 <<  5 ),
+    scan_dataN  = ( 1 <<  6 ),
+    scan_md     = ( 1 <<  7 ),
+    scan_cur    = ( 1 <<  8 ),
+    scan_rNNN   = ( 1 <<  9 ),
+    scan_lock   = ( 1 << 10 ),
+    scan_odir   = ( 1 << 11 ),
+    scan_ofile  = ( 1 << 12 ),
+    scan_meta   = ( 1 << 13 ),
+    scan_skey   = ( 1 << 14 ),
+    scan_sealed = ( 1 << 15 ),
+    scan_zombie = ( 1 << 16 )
+};
+
+static
+rc_t CC scan_dbdir ( const KDirectory *dir, uint32_t type, const char *name, void *data )
+{
+    uint32_t *bits = data;
+
+    type &= kptAlias - 1;
+
+    if ( type == kptDir )
+    {
+        switch ( name [ 0 ] )
+        {
+        case 'c':
+            if ( strcmp ( name, "col" ) == 0 )
+            { * bits |= scan_col; return 0; }
+            break;
+        case 'm':
+            if ( strcmp ( name, "md" ) == 0 )
+            { * bits |= scan_md; return 0; }
+            break;
+        case 't':
+            if ( strcmp ( name, "tbl" ) == 0 )
+            { * bits |= scan_tbl; return 0; }
+            break;
+        case 'i':
+            if ( strcmp ( name, "idx" ) == 0 )
+            { * bits |= scan_idx; return 0; }
+            break;
+        case 'd':
+            if ( strcmp ( name, "db" ) == 0 )
+            { * bits |= scan_db; return 0; }
+            break;
+        }
+
+        * bits |= scan_odir;
+    }
+    else if ( type == kptFile )
+    {
+        switch ( name [ 0 ] )
+        {
+        case 'l':
+            if ( strcmp ( name, "lock" ) == 0 )
+            { * bits |= scan_lock; return 0; }
+            break;
+        case 'i':
+            if ( memcmp ( name, "idx", 3 ) == 0 )
+            {
+                if ( isdigit ( name [ 3 ] ) )
+                { * bits |= scan_idxN; return 0; }
+            }
+            break;
+        case 'd':
+            if ( memcmp ( name, "data", 4 ) == 0 )
+            {
+                if ( name [ 4 ] == 0 )
+                { * bits |= scan_data; return 0; }
+                if ( isdigit ( name [ 4 ] ) )
+                { * bits |= scan_dataN; return 0; }
+            }
+        case 'c':
+            if ( strcmp ( name, "cur" ) == 0 )
+            { * bits |= scan_cur; return 0; }
+            break;
+        case 'r':
+            if ( isdigit ( name [ 1 ] ) && isdigit ( name [ 2 ] ) &&
+                 isdigit ( name [ 3 ] ) && name [ 4 ] == 0 )
+            { * bits |= scan_rNNN; return 0; }
+            break;
+        case 'm':
+            if ( strcmp ( name, "meta" ) == 0 )
+            { * bits |= scan_meta; return 0; }
+            break;
+        case 's':
+            if ( strcmp ( name, "skey" ) == 0 )
+            { * bits |= scan_skey; return 0; }
+            if ( strcmp ( name, "sealed" ) == 0 )
+            { * bits |= scan_sealed; return 0; }
+            break;
+        }
+
+        * bits |= scan_ofile;
+    }
+    else if (type == kptZombieFile )
+    {
+        * bits |= scan_zombie;
+    }
+    
+    return 0;
+}
+
+const char *KDBGetNamespaceString ( int namespace )
+{
+    static const char * ns_array [] = { NULL, "db", "tbl", "col", "idx", "md" };
+
+    switch (namespace)
+    {
+    default:
+        return ns_array [0];
+    case kptDatabase:
+        return ns_array [1];
+    case kptTable:
+        return ns_array [2];
+    case kptColumn:
+        return ns_array [3];
+    case kptIndex:
+        return ns_array [4];
+    case kptMetadata:
+        return ns_array [5];
+    }
+}
+
+
+int KDBPathTypeDir (const KDirectory * dir, int type, bool * pHasZombies, const char * path)
+{
+    const char * leaf, * parent;
+    uint32_t bits;
+    rc_t rc;
+
+    bits = 0;
+
+    assert ((type == kptDir) || (type == (kptDir|kptAlias)));
+
+    rc = KDirectoryVisit ( dir, false, scan_dbdir, & bits, "%s", path );
+    if ( rc == 0 ) do
+    {
+        if ( ( bits & scan_zombie ) != 0 ) {
+            bits &= ~scan_zombie;
+            if (pHasZombies)
+                *pHasZombies = true;
+        }
+        /* look for a column */
+        if ( ( bits & scan_idxN ) != 0 &&
+             ( bits & ( scan_data | scan_dataN ) ) != 0 )
+        {
+            if ( ( bits & ( scan_db | scan_tbl | scan_idx | scan_col ) ) == 0 )
+                type += kptColumn - kptDir;
+            break;
+        }
+
+        /* look for a table */
+        if ( ( bits & scan_col ) != 0 )
+        {
+            /* can't have sub-tables or a db */
+            if ( ( bits & ( scan_db | scan_tbl ) ) == 0 )
+            {
+                /* look for an old-structure table */
+                if ( ( bits & ( scan_meta | scan_md ) ) == scan_meta ||
+                     ( bits & ( scan_skey | scan_idx ) ) == scan_skey )
+                    type += kptPrereleaseTbl - kptDir;
+                else
+                    type += kptTable - kptDir;
+            }
+            break;
+        }
+
+        /* look for metadata */
+        if ( ( bits & ( scan_cur | scan_rNNN ) ) != 0 )
+        {
+            if ( ( bits & ( scan_db | scan_tbl | scan_idx | scan_col ) ) == 0 )
+                type += kptMetadata - kptDir;
+            break;
+        }
+
+        /* look for a database */
+        if ( ( bits & scan_tbl ) != 0 )
+        {
+            if ( ( bits & scan_col ) == 0 )
+                type += kptDatabase - kptDir;
+            break;
+        }
+
+        /* look for a structured column */
+        if ( ( bits & scan_odir ) != 0 )
+        {
+            leaf = strrchr ( path, '/' );
+            if ( leaf != NULL )
+            {
+                parent = string_rchr ( path, leaf - path, '/' );
+                if ( parent ++ == NULL )
+                    parent = path;
+                if ( memcmp ( parent, "col/", 4 ) != 0 )
+                    break;
+
+                bits = 0;
+                if ( KDirectoryVisit ( dir, 1, scan_dbdir, & bits, "%s", path ) == 0 )
+                {
+                    if ( ( bits & scan_idxN ) != 0 &&
+                         ( bits & ( scan_data | scan_dataN ) ) != 0 )
+                    {
+                        if ( ( bits & ( scan_db | scan_tbl | scan_idx | scan_col ) ) == 0 )
+                            type += kptColumn - kptDir;
+                        break;
+                    }
+                }
+            }
+        }
+    } while (0);
+
+    return type;
+}
+
+
+int KDBPathType ( const KDirectory *dir, bool *pHasZombies, const char *path )
+{
+    const char *leaf, *parent;
+
+
+    rc_t rc;
+    int type = KDirectoryPathType ( dir, "%s", path );
+    
+    if (pHasZombies)
+        *pHasZombies = false;
+
+    switch ( type )
+    {
+    case kptDir:
+    case kptDir | kptAlias:
+        type = KDBPathTypeDir (dir, type, pHasZombies, path);
+        break;
+
+    case kptFile:
+    case kptFile | kptAlias:
+    {
+        /* if we hit a file first try it as an archive */
+        const KDirectory * ldir;
+
+        rc = KDirectoryOpenSraArchiveRead_silent ( dir, &ldir, false, "%s", path );
+#if SUPPORT_WKDB_TAR
+        if ( rc != 0 )
+            rc = KDirectoryOpenTarArchiveRead_silent ( dir, &ldir, false, "%s", path );
+#endif
+        /* it was an archive so recur */
+        if ( rc == 0 )
+        {
+            /* recheck this newly opened directory for KDB/KFS type */
+            int type2;
+
+            type2 = KDBPathType ( ldir, NULL, "." );
+            if ((type2 != kptDir) || (type != (kptDir|kptAlias)))
+                type = type2;
+
+            KDirectoryRelease (ldir);
+        }
+        /* it was not an archive so see if it it's an idx file */
+        else
+        {
+            leaf = strrchr ( path, '/' );
+            if ( leaf != NULL )
+            {
+                parent = string_rchr ( path, leaf - path, '/' );
+                if ( parent ++ == NULL )
+                    parent = path;
+                if ( memcmp ( parent, "idx/", 4 ) == 0 )
+                    type += kptIndex - kptFile;
+            }
+        }
+        break;
+    }
+    }
+    return type;
+}
+
+
+
+#if SUPPORT_VFS_URI
+#else
+/* return configured password as ASCIZ
+ * opertates on vfs/kfs/kfg objects, not kdb objects */
+static
+rc_t KDBOpenFileGetPassword (char * pw, size_t pwz)
+{
+    VFSManager * mgr;
+    rc_t rc;
+
+    assert (pw);
+    assert (pwz);
+
+    pw[0] = '\0';
+
+    rc = VFSManagerMake (&mgr);
+    if (rc)
+        ;                      /* failure to make VFS manager: pass along rc */
+    else
+    {
+        size_t pwfz;
+        char pwf [4096 + 1];
+
+        rc = VFSManagerGetConfigPWFile (mgr, pwf, sizeof (pwf) - 1, &pwfz);
+        if (rc)
+            /* failure to get password file path: tweak rc */
+            rc = RC (rcDB, rcMgr, rcOpening, rcEncryptionKey, rcNotFound);
+
+        else
+        {
+            VPath * pwp;
+
+            pwf [pwfz] = '\0'; /* force to ASCIZ */
+
+#if 0
+            rc = VPathMakeSysPath (&pwp, pwf);
+#else
+            rc = VFSManagerMakePath (mgr, &pwp, "%s", pwf);
+#endif
+
+            if (rc)
+                ;       /* failure to construct a path from the string */
+            
+            else
+            {
+                const KFile * pwf;
+          
+                rc = VFSManagerOpenFileRead (mgr, &pwf, pwp);
+                if (rc)
+                    /* failure to open password file */
+                    rc = RC (rcDB, rcMgr, rcOpening, rcEncryptionKey, rcNotOpen);
+
+                else
+                {
+                    size_t z;
+                    char pwb [4098]; /* arbitrarily using 4096 as maximum
+                                        allowed length */
+
+                    /* at this point we are only getting the password from a 
+                     * file but in the future if we can get it from a pipe of
+                     * some sort we can't count on the ReadAll to really know
+                     * if we hit end of file and not just a pause in the
+                     * streaming.  VFS/KFS 2 will have to fix this somehow
+                     */
+
+                    rc = KFileReadAll (pwf, 0, pwb, sizeof pwb, &z);
+                    if (rc)
+                        ;       /* failure to read password file: pass along rc */
+                    else
+                    {
+                        /* trim off EOL if present */
+                        char * pc;
+
+                        pwb[z] = '\0';   /* force ASCIZ */
+
+                        pc = string_chr (pwb, z, '\r');
+                        if (pc)
+                        {
+                            *pc = '\0';
+                            z = 1 + pc - pwb;
+                        }
+                        pc = string_chr (pwb, z, '\n');
+                        if (pc)
+                        {
+                            *pc = '\0';
+                            z = 1 + pc - pwb;
+                        }
+                        if (z == 0)
+                            rc = RC (rcDB, rcMgr, rcOpening, rcEncryptionKey, rcTooShort);
+
+                        else if (pwz < z) /* pwz came in as 4096 */
+                            rc = RC (rcDB, rcMgr, rcOpening, rcEncryptionKey, rcTooLong);
+
+                        else
+                        {
+                            memmove (pw, pwb, z+1);
+                        }
+                    }
+                    KFileRelease (pwf);
+                }
+                VPathRelease (pwp);
+            }
+        }
+        VFSManagerRelease (mgr);
+    }
+    return rc;
+}
+
+
+/* not KDB specific - just uses vfs/krypto/kfs objects */
+static
+rc_t KDBOpenFileAsDirectory (const KDirectory * dir,
+                             const char * path, 
+                             const KDirectory ** pdir,
+                             uint32_t rcobj)
+{
+    const KFile * file;
+    const KFile * f;
+    const KDirectory * ldir;
+    bool encrypted = false;
+
+    rc_t rc;
+
+    *pdir = NULL;
+
+    rc = KDirectoryOpenFileRead (dir, &file, "%s", path);
+    if (rc == 0)
+    {
+        rc = KFileRandomAccess(file);
+        if (rc)
+            rc = RC (rcDB, rcMgr, rcOpening, rcobj, rcUnsupported);
+        else
+        {
+            size_t tz;
+            char tbuff [4096];
+            char pbuff [4096 + 1];
+
+            rc = KFileReadAll (file, 0, tbuff, sizeof tbuff, &tz);
+            if (rc == 0)
+            {
+                if (KFileIsEnc (tbuff, tz) == 0)
+                {
+                    encrypted = true;
+
+                    rc = KDBOpenFileGetPassword (pbuff, sizeof (pbuff) - 1);
+                    if (rc == 0)
+                    {
+                        KKey key;
+
+                        rc = KKeyInitRead (&key, kkeyAES128, pbuff, string_size (pbuff));
+                        if (rc == 0)
+                        {
+                            rc = KEncFileMakeRead (&f, file, &key);
+                            if (rc == 0)
+                            {
+                                /* KEncFileMakeRead adds a reference */
+                                KFileRelease (file);
+                                file = f;
+                                rc = KFileReadAll (file, 0, tbuff, sizeof tbuff, &tz);
+                            }
+                        }
+                    }
+                }
+                else if (KFileIsWGAEnc (tbuff, tz) == 0)
+                {
+                    encrypted = true;
+
+                    rc = KDBOpenFileGetPassword (pbuff, sizeof (pbuff) - 1);
+                    if (rc == 0)
+                    {
+                        rc = KFileMakeWGAEncRead (&f, file, pbuff, string_size (pbuff));
+                        if (rc == 0)
+                        {
+                            /* KFileMakeWGAEncRead adds a reference */
+                            KFileRelease (file);
+                            file = f;
+                            rc = KFileReadAll (file, 0, tbuff, sizeof tbuff, &tz);
+                        }
+                    }
+                }
+                /* else not a handled encryption or unencrypted: we can't distinguish too much */
+
+                if (rc == 0)
+                {
+                    if (KFileIsSRA (tbuff, tz) == 0)
+                    {
+                        rc = KDirectoryOpenSraArchiveReadUnbounded_silent_preopened (dir,
+                                                                                     &ldir,
+                                                                                     false,
+                                                                                     file,
+                                                                                     "%s", 
+                                                                                     path);
+                    }
+                    else
+                    {
+#if SUPPORT_WKDB_TAR
+                        rc = KDirectoryOpenTarArchiveRead_silent_preopened (dir, &ldir, false,
+                                                                            file, "%s", path);
+                        if (rc == 0)
+                            KFileRelease (file);
+#else
+                        /* will be reset immediately below */
+                        rc = -1;
+#endif
+                    }
+
+                    /* not an archive type we handle or a bad archive */
+                    if (rc)
+                    {
+                        if (encrypted)
+                            rc = RC ( rcDB, rcMgr, rcOpening, rcEncryptionKey, rcIncorrect );
+                        else
+                            rc = RC ( rcDB, rcMgr, rcOpening, rcPath, rcIncorrect );
+                    }
+                    else
+                    {
+                        /*
+                         * release our ownership of the KFile that but archive will 
+                         * keep theirs
+                         */
+                        KFileRelease (file);
+                        *pdir = ldir;
+                        return 0;
+                    }
+                }
+            }
+        }
+        KFileRelease (file);
+    }
+    return rc;
+}
+#endif
+
+
+static rc_t KDBOpenPathTypeReadInt ( const KDBManager * mgr, const KDirectory * dir, const char * path,
+                                     const KDirectory ** pdir, int * type,
+                                     int pathtype, uint32_t rcobj, bool try_srapath )
+{
+    VFSManager * vmgr = mgr->vfsmgr;
+    const KDirectory * ldir = NULL;
+    rc_t rc = 0;
+
+    /* object relative opens can be done using KFS - we hacked in VFS after all */
+    if (! try_srapath)
+    {
+        rc = KDirectoryOpenDirUpdate ((KDirectory*)dir, (KDirectory**)pdir, false, "%s", path);
+        if ((rc) && (GetRCState(rc) != rcNotFound))
+            rc = KDirectoryOpenDirRead (dir, pdir, false, "%s", path);
+    }
+    else
+    {
+        VPath * vpath;
+
+        /*
+         * We've got to decide if the path coming in is a full or relative
+         * path and if relative make it relative to dir or possibly its a srapath
+         * accession
+         *
+         */
+        rc = VPathMakeDirectoryRelative ( &vpath, dir, path );
+        if ( rc == 0 )
+        {
+            rc = VFSManagerOpenDirectoryReadDirectoryRelativeDecrypt ( vmgr, dir, &ldir, vpath );
+
+            if ( rc == 0 )
+            {
+                *type = (~kptAlias) & KDBPathType ( ldir, NULL, "." );
+
+                /* just a directory, not a kdb type */
+                if ( *type == kptDir )
+                    rc = RC (rcDB, rcMgr, rcOpening, rcPath, rcIncorrect);
+
+                else if ( *type != pathtype )
+                {
+                    KDirectoryRelease( ldir );
+                    rc = RC ( rcDB, rcMgr, rcOpening, rcobj, rcIncorrect );
+                }
+                else
+                {
+                    if ( pdir != NULL )
+                        *pdir = ldir;
+                    else
+                        KDirectoryRelease( ldir );
+                }
+            }
+            VPathRelease ( vpath );
+        }
+    }
+    return rc;
+}
+
+rc_t KDBOpenPathTypeRead ( const KDBManager * mgr, const KDirectory * dir, const char * path, 
+    const KDirectory ** pdir, int pathtype, int * ppathtype, bool try_srapath )
+{
+    const KDirectory *ldir;
+    rc_t rc = 0;
+    uint32_t rcobj;
+    int type = kptNotFound; /* bogus? */
+
+/*     KOutMsg ("%s: %s\n", __func__, path); */
+
+    if ( pdir != NULL )
+        *pdir = NULL;
+    if ( ppathtype != NULL )
+        *ppathtype = type;
+
+    switch (pathtype & ~ kptAlias) /* tune the error message based on path type */
+    {
+        /* we'll hit this if we don't track defines in kdb/manager.h */
+    default:
+        rc = RC (rcDB, rcMgr, rcOpening, rcType, rcInvalid);
+        return rc;
+
+    case kptTable:
+    case kptPrereleaseTbl:
+        rcobj = rcTable;
+        break;
+
+    case kptColumn:
+        rcobj = rcColumn;
+        break;
+
+    case kptDatabase:
+    case kptDatabase | kptAlias:
+        rcobj = rcDatabase;
+        break;
+    }
+
+    rc = KDBOpenPathTypeReadInt( mgr, dir, path, &ldir, &type, pathtype, rcobj, try_srapath );
+
+    if (rc == 0)
+    {
+        if ( ppathtype != NULL )
+            *ppathtype = type;
+
+        if (pdir != NULL)
+            *pdir = ldir;
+        else
+            KDirectoryRelease (ldir);
+    }
+
+    return rc;
+}
+
+
+/* Writable
+ *  examines a directory structure for any reason it can't be opened for update
+ *  NOTE: will not currently check for archive
+ */
+rc_t KDBWritable ( const KDirectory *dir, const char *path )
+{
+    uint32_t access;
+    rc_t rc;
+
+    /* protect us from bad parameters */
+    if (dir == NULL)
+        return RC (rcDB, rcPath, rcAccessing, rcDirectory, rcNull);
+    if (path == NULL)
+        return RC (rcDB, rcPath, rcAccessing, rcPath, rcNull);
+
+    /* we have to be able to check the access if it is to be writable */
+    rc = KDirectoryAccess ( dir, & access, "%s", path );
+    if ( rc == 0 )
+    {
+        int kpt;
+
+        /* we could use KDBPathType with some modifications */
+        kpt = KDirectoryPathType (dir, "%s", path) & ~kptAlias;
+        switch (kpt)
+        {
+        case kptDir:
+            /* if there is a lock (or deprecated sealed) file in this directory */
+            switch ( KDirectoryPathType ( dir, "%s/lock", path ) )
+            {
+            case kptFile:
+            case kptFile | kptAlias:
+                rc = RC (rcDB, rcPath, rcAccessing, rcLock, rcLocked );
+                break;
+            case kptNotFound:
+                /* much simpler handling for the sealed file */
+                switch ( KDirectoryPathType ( dir, "%s/sealed", path ) )
+                {
+                case kptFile:
+                case kptFile | kptAlias:
+                    rc = RC (rcDB, rcPath, rcAccessing, rcLock, rcLocked );
+                    break;
+                case kptNotFound:
+                    if ( ( access & 0222 ) == 0 )
+                        rc = RC (rcDB, rcPath, rcAccessing, rcPath, rcReadonly );
+                    /* else rc is still 0 from VAccess */
+                }
+                break;
+            case kptBadPath:
+                /* likely to be a non-directory or something */
+                rc = RC (rcDB, rcPath, rcAccessing, rcPath, rcInvalid);
+                break;
+            default:
+                /* an illegal type of object named "lock" is in this directory
+                 * which will block the ability to lock it
+                 */
+                rc = RC (rcDB, rcPath, rcAccessing, rcPath, rcUnexpected);
+            }
+            break;
+        case kptFile:
+            /* if there is a lock (or deprecated sealed) file in this directory */
+            switch ( KDirectoryPathType ( dir, "%s.lock", path ) )
+            {
+            case kptFile:
+            case kptFile | kptAlias:
+                rc = RC ( rcDB, rcPath, rcAccessing, rcLock, rcLocked );
+                break;
+            case kptNotFound:
+                break;
+            case kptBadPath:
+                /* unlikely */
+                rc = RC (rcDB, rcPath, rcAccessing, rcPath, rcInvalid);
+                break;
+            default:
+                /* an illegal type of object named "lock" is in this directory
+                 * which will block the ability to lock it
+                 */
+                rc = RC (rcDB, rcPath, rcAccessing, rcPath, rcUnexpected);
+            }
+            break;
+        case kptBadPath:
+            /* likely to be a non-driectory or something */
+            rc = RC ( rcDB, rcPath, rcAccessing, rcPath, rcInvalid);
+            break;
+        default:
+            /* an illegal type of object named "lock" is in this directory
+             * which will block the ability to lock it
+             */
+            rc = RC (rcDB, rcPath, rcAccessing, rcPath, rcUnexpected);
+        }
+    }
+    return rc;
+}
+
+
+bool KDBIsLocked ( const KDirectory *dir, const char *path )
+{
+
+    rc_t rc = KDBWritable (dir, path);
+    if (GetRCState (rc) == rcLocked)
+        return true;
+    return false;
+}
+
+
+/* Lock
+ *  performs directory locking
+ */
+rc_t KDBLockDir ( KDirectory *dir, const char *path )
+{
+    KFile *f;
+    rc_t rc;
+
+    if (dir == NULL)
+        return RC (rcDB, rcLock, rcLocking, rcDirectory, rcNull);
+    if (path == NULL)
+        return RC (rcDB, rcLock, rcLocking, rcPath, rcNull);
+
+    rc = KDirectoryCreateFile ( dir, & f, 0, 0444, kcmOpen, "%s/lock", path );
+    if ( rc == 0 )
+    {
+        KFileRelease ( f );
+        rc = KDirectorySetAccess ( dir, 1, 0, 0222, "%s", path );
+    }
+    return rc;
+}
+
+rc_t KDBLockFile ( KDirectory *dir, const char *path )
+{
+    KFile *f;
+    rc_t rc;
+
+    if (dir == NULL)
+        return RC (rcDB, rcLock, rcLocking, rcDirectory, rcNull);
+    if (path == NULL)
+        return RC (rcDB, rcLock, rcLocking, rcPath, rcNull);
+
+    rc = KDirectoryCreateFile ( dir, & f, false, 0444, kcmOpen, "%s.lock", path );
+    if ( rc == 0 )
+    {
+        KFileRelease ( f );
+        rc = KDirectorySetAccess ( dir, 0, 0, 0222, "%s", path );
+    }
+    return rc;
+}
+
+/* Unlock
+ *  performs directory unlocking
+ */
+static
+rc_t CC KDBUnlockVisitor ( KDirectory *dir, uint32_t type, const char *name, void *data )
+{
+    switch ( type )
+    {
+    case kptFile:
+    case kptFile | kptAlias:
+
+        /* don't ever unlock frozen metadata revisions */
+        if ( name [ 0 ] == 'r' )
+        {
+            char *end;
+            strtoul ( name + 1, & end, 10 );
+            if ( end [ 0 ] == 0 )
+                return 0;
+        }
+
+        return KDirectorySetAccess ( dir, false, 0220, 0222, "%s", name );
+
+    case kptDir:
+    case kptDir | kptAlias:
+        if ( KDirectoryPathType ( dir, "%s/lock", name ) == kptNotFound )
+        {
+            rc_t rc = KDirectorySetAccess ( dir, 0, 0220, 0222, "%s", name );
+            if ( rc == 0 )
+            {
+                rc = KDirectoryVisitUpdate ( dir, false,
+                                              KDBUnlockVisitor, NULL, "%s", name );
+            }
+            return rc;
+        }
+        break;
+    }
+
+    return 0;
+}
+
+rc_t KDBUnlockDir ( KDirectory *dir, const char *path )
+{
+    /* change directory access bits */
+    rc_t rc;
+
+    if (dir == NULL)
+        return RC (rcDB, rcLock, rcLocking, rcDirectory, rcNull);
+    if (path == NULL)
+        return RC (rcDB, rcLock, rcLocking, rcPath, rcNull);
+
+    rc = KDirectorySetAccess ( dir, false, 0220, 0222, "%s", path );
+    if ( rc == 0 )
+    {
+        /* remove lock file */
+        rc = KDirectoryRemove ( dir, false, "%s/lock", path );
+        if ( rc == 0 || GetRCState ( rc ) == rcNotFound )
+            rc = KDirectoryRemove ( dir, false, "%s/sealed", path );
+
+        /* recursively unlock everything underneath
+           that is not itself explicitly locked */
+        if ( rc == 0 || GetRCState ( rc ) == rcNotFound )
+            rc = KDirectoryVisitUpdate ( dir, false, KDBUnlockVisitor, NULL, "%s", path );
+    }
+    return rc;
+
+}
+
+rc_t KDBUnlockFile ( KDirectory *dir, const char *path )
+{
+    rc_t rc;
+
+    if (dir == NULL)
+        return RC (rcDB, rcLock, rcLocking, rcDirectory, rcNull);
+    if (path == NULL)
+        return RC (rcDB, rcLock, rcLocking, rcPath, rcNull);
+
+    rc = KDirectoryRemove ( dir, true, "%s.lock", path );
+    if ( rc == 0 )
+    {
+        rc = KDirectorySetAccess ( dir, false, 0220, 0222, "%s", path );
+    }
+    return rc;
+}
+
+
+/* GetObjModDate
+ *  extract mod date from a path
+ */
+rc_t KDBGetObjModDate ( const KDirectory *dir, KTime_t *mtime )
+{
+    /* HACK ALERT - there needs to be a proper way to record modification times */
+    
+    /* this only tells the last time the table was locked,
+       which may be close to the last time it was modified */
+    rc_t rc = KDirectoryDate ( dir, mtime, "lock" );
+    if ( rc == 0 )
+        return 0;
+
+    if ( GetRCState ( rc ) == rcNotFound )
+    {
+        rc = KDirectoryDate ( dir, mtime, "sealed" );
+        if ( rc == 0 )
+            return 0;
+    }
+
+    /* get directory timestamp */
+    rc = KDirectoryDate ( dir, mtime, "." );
+    if ( rc == 0 )
+        return 0;
+
+    * mtime = 0;
+    return rc;
+}
+
+/* GetPathModDate
+ *  extract mod date from a path
+ */
+rc_t KDBVGetPathModDate ( const KDirectory *dir,
+    KTime_t *mtime, const char *path, va_list args )
+{
+    rc_t rc;
+    uint32_t ptype;
+    const KDirectory *obj_dir;
+
+    va_list cpy;
+    va_copy ( cpy, args );
+    ptype = KDirectoryVPathType ( dir, path, cpy );
+    va_end ( cpy );
+
+    switch ( ptype )
+    {
+    case kptDir:
+    case kptDir | kptAlias:
+        break;
+
+    default:
+        return KDirectoryVDate ( dir, mtime, path, args );
+    }
+
+    * mtime = 0;
+    rc = KDirectoryVOpenDirRead ( dir, & obj_dir, true, path, args );
+    if ( rc == 0 )
+    {
+        rc = KDBGetObjModDate ( obj_dir, mtime );
+        KDirectoryRelease ( obj_dir );
+    }
+
+    return rc;
+}
+
+
+/* KDBVMakeSubPath
+ *  adds a namespace to path spec
+ */
+rc_t KDBVMakeSubPath ( struct KDirectory const *dir,
+    char *subpath, size_t subpath_max, const char *ns,
+    uint32_t ns_size, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( ns_size > 0 )
+    {
+        subpath += ns_size + 1;
+        subpath_max -= ns_size + 1;
+    }
+
+#if CRUFTY_USE_OF_RESOLVE_PATH
+    /* because this call only builds a path instead of resolving anything
+     * is is okay that we are using the wrong directory */
+    rc = KDirectoryVResolvePath ( dir, false,
+        subpath, subpath_max, path, args );
+#else
+    {
+        int sz = vsnprintf ( subpath, subpath_max, path, args );
+        if ( sz < 0 || ( size_t ) sz >= subpath_max )
+            rc = RC ( rcDB, rcDirectory, rcResolving, rcBuffer, rcInsufficient );
+        else if ( sz == 0 )
+            rc = RC ( rcDB, rcDirectory, rcResolving, rcPath, rcEmpty );
+        else
+        {
+            rc = 0;
+        }
+    }
+#endif
+    switch ( GetRCState ( rc ) )
+    {
+    case 0:
+        assert ( subpath [ 0 ] != 0 );
+        if ( subpath [ 0 ] == '.' || subpath [ 1 ] == '/' )
+            return RC ( rcDB, rcDirectory, rcResolving, rcPath, rcInvalid );
+        break;
+    case rcInsufficient:
+        return RC ( rcDB, rcDirectory, rcResolving, rcPath, rcExcessive );
+    default:
+        return rc;
+    }
+
+    if ( ns_size != 0 )
+    {
+        subpath -= ns_size + 1;
+        memmove ( subpath, ns, ns_size );
+        subpath [ ns_size ] = '/';
+    }
+    return 0;
+}
+
+/* KDBMakeSubPath
+ *  adds a namespace to path spec
+ */
+rc_t KDBMakeSubPath ( struct KDirectory const *dir,
+    char *subpath, size_t subpath_max, const char *ns,
+    uint32_t ns_size, const char *path, ... )
+{
+    rc_t rc = 0;
+    va_list args;
+    va_start(args, path);
+    rc = KDBVMakeSubPath(dir, subpath, subpath_max, ns, ns_size, path, args);
+    va_end(args);
+    return rc;
+}
+
+/* VDrop
+ */
+static
+rc_t KDBDropInt ( KDirectory * dir, const KDBManager * mgr,
+                  const char * path )
+{
+    if (KDBManagerOpenObjectBusy (mgr, path))
+        return RC ( rcDB, rcDirectory, rcRemoving, rcPath, rcBusy );
+
+    return KDirectoryRemove ( dir, 1, "%s", path );
+}
+
+rc_t KDBMgrVDrop ( KDirectory * dir, const KDBManager * mgr, uint32_t obj_type,
+                   const char * path, va_list args )
+{
+    rc_t rc;
+    char full_path [ 4096 ];
+
+    rc = KDirectoryVResolvePath ( dir, true, full_path, sizeof (full_path),
+                                  path, args );
+    if (rc == 0)
+    {
+        int pt = KDBPathType ( /*mgr,*/ dir, NULL, full_path );
+        switch ( pt )
+        {
+        case kptNotFound:
+            return RC ( rcDB, rcDirectory, rcRemoving, rcPath, rcNotFound );
+        case kptBadPath:
+            return RC ( rcDB, rcDirectory, rcRemoving, rcPath, rcInvalid );
+
+        case kptDatabase | kptAlias:
+        case kptTable | kptAlias:
+        case kptIndex | kptAlias:
+        case kptColumn | kptAlias:
+        case kptDatabase:
+        case kptTable:
+        case kptIndex:
+        case kptColumn:
+            /* this really needs a new rcWrongType or similar RCState */
+            if ((obj_type != kptAny) && (obj_type != (pt & ~kptAlias)))
+                return RC ( rcDB, rcDirectory, rcRemoving, rcPath, rcIncorrect );
+            break;
+
+        case kptFile | kptAlias:
+        case kptFile:
+	    /* can we get here?  Will we have needed to open for update to get here? */
+/* 	    rc = KDBOpenPathTypeRead ( dir, path, NULL, type, NULL ); */
+/* 	    if ( rc == 0 ) */
+/*                 return RC ( rcDB, rcDirectory, rcRemoving, rcPath, rcReadonly ); */
+            /* fall through */
+        default:
+            return RC ( rcDB, rcDirectory, rcRemoving, rcPath, rcIncorrect );
+        }
+        if (rc == 0)
+        {
+            rc = KDBDropInt ( dir, mgr, full_path );
+        }
+    }
+    return rc;
+}
+
+
+rc_t KDBVDrop ( KDirectory *dir, const KDBManager * mgr,
+    uint32_t type, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 4096 ];
+
+    int ns_size;
+    const char *ns;
+
+    switch ( type )
+    {
+    case kptDatabase:
+        ns = "db"; ns_size = 2; break;
+    case kptTable:
+        ns = "tbl"; ns_size = 3; break;
+    case kptIndex:
+        ns = "idx"; ns_size = 3; break;
+    case kptColumn:
+        ns = "col"; ns_size = 3; break;
+    default:
+        return RC ( rcDB, rcDirectory, rcRemoving, rcType, rcIncorrect );
+    }
+
+    rc = KDBVMakeSubPath ( dir,
+        path, sizeof path, ns, ns_size, name, args );
+    if ( rc == 0 )
+    {
+        int pt = KDBPathType ( /*mgr,*/ dir, NULL, path );
+        switch ( pt )
+        {
+        case kptNotFound:
+            return RC ( rcDB, rcDirectory, rcRemoving, rcPath, rcNotFound );
+        case kptBadPath:
+            return RC ( rcDB, rcDirectory, rcRemoving, rcPath, rcInvalid );
+
+        case kptDatabase | kptAlias:
+        case kptTable | kptAlias:
+        case kptIndex | kptAlias:
+        case kptColumn | kptAlias:
+            pt -= kptAlias;
+
+        case kptDatabase:
+        case kptTable:
+        case kptIndex:
+        case kptColumn:
+            if ( pt == type )
+                break;
+
+        case kptFile | kptAlias:
+        case kptFile:
+	    /* can we get here?  Will we have needed to open for update to get here? */
+	    rc = KDBOpenPathTypeRead ( mgr, dir, path, NULL, type, NULL, false );
+	    if ( rc == 0 )
+                return RC ( rcDB, rcDirectory, rcRemoving, rcPath, rcReadonly );
+            /* fall through */
+        default:
+            return RC ( rcDB, rcDirectory, rcRemoving, rcPath, rcIncorrect );
+        }
+
+        rc = KDirectoryResolvePath ( dir, true, path, sizeof path, "%s", path );
+        if ( rc == 0 )
+        {
+            rc = KDBWritable ( dir, "." );
+            switch (GetRCState(rc))
+            {
+            default:
+                rc = RC ( rcDB, rcDirectory, rcRemoving, rcTable, rcUnexpected );
+                break;
+            case rcLocked:
+                rc = RC ( rcDB, rcDirectory, rcRemoving, rcTable, rcLocked );
+                break;
+            case rcReadonly:
+                rc = RC ( rcDB, rcDirectory, rcRemoving, rcTable, rcReadonly );
+                break;
+            case 0:
+                rc = KDBDropInt ( dir, mgr, path );                
+                break;
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* Rename
+ */
+rc_t KDBRename ( KDirectory *dir, KDBManager *mgr, uint32_t type, bool force,
+    const char *from, const char *to )
+{
+    rc_t rc;
+    char src [ 4096 ];
+
+    int ns_size;
+    const char *ns;
+
+    switch ( type )
+    {
+    case kptDatabase:
+        ns = "db"; ns_size = 2; break;
+    case kptTable:
+        ns = "tbl"; ns_size = 3; break;
+    case kptIndex:
+        ns = "idx"; ns_size = 3; break;
+    case kptColumn:
+        ns = "col"; ns_size = 3; break;
+    default:
+        return RC ( rcDB, rcDirectory, rcRenaming, rcType, rcIncorrect );
+    }
+
+    rc = KDBMakeSubPath ( dir,
+        src, sizeof src, ns, ns_size, from);
+    if ( rc == 0 )
+    {
+        char dst [ 256 ];
+        int pt = KDBPathType ( /*mgr,*/ dir, NULL, src );
+        switch ( pt )
+        {
+        case kptNotFound:
+            return RC ( rcDB, rcDirectory, rcRenaming, rcPath, rcNotFound );
+        case kptBadPath:
+            return RC ( rcDB, rcDirectory, rcRenaming, rcPath, rcInvalid );
+
+        case kptDatabase | kptAlias:
+        case kptTable | kptAlias:
+        case kptIndex | kptAlias:
+        case kptColumn | kptAlias:
+            pt -= kptAlias;
+
+        case kptDatabase:
+        case kptTable:
+        case kptIndex:
+        case kptColumn:
+            if ( pt == type )
+                break;
+
+        default:
+            return RC ( rcDB, rcDirectory, rcRenaming, rcPath, rcIncorrect );
+        }
+
+        rc = KDBMakeSubPath ( dir,
+            dst, sizeof dst, ns, ns_size, to );
+        if ( rc == 0 )
+        {
+            if ( KDirectoryPathType ( dir, "%s", dst ) != kptNotFound )
+                return RC ( rcDB, rcDirectory, rcRenaming, rcPath, rcIncorrect );
+
+            rc = KDirectoryResolvePath ( dir, 1, src, sizeof src, "%s", src );
+            if ( rc == 0 )
+            {
+                if (KDBManagerOpenObjectBusy (mgr, src))
+                    return RC ( rcDB, rcDirectory, rcRenaming, rcPath, rcBusy );
+                if (KDBManagerOpenObjectBusy (mgr, dst))
+                    return RC ( rcDB, rcDirectory, rcRenaming, rcPath, rcBusy );
+
+                rc = KDBWritable ( dir, "." );
+                switch (GetRCState(rc))
+                {
+                default:
+                    rc = RC ( rcDB, rcDirectory, rcRenaming, rcTable, rcUnexpected );
+                    break;
+                case rcLocked:
+                    rc = RC ( rcDB, rcDirectory, rcRenaming, rcTable, rcLocked );
+                    break;
+                case rcReadonly:
+                    rc = RC ( rcDB, rcDirectory, rcRenaming, rcTable, rcReadonly );
+                    break;
+                case 0:
+                    rc = KDirectoryRename ( dir, force, src, dst );
+                    break;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* Alias
+ */
+rc_t KDBAlias ( KDirectory *dir, uint32_t type,
+    const char *targ, const char *alias )
+{
+    rc_t rc;
+    char src [ 256 ];
+
+    int ns_size;
+    const char *ns;
+
+    switch ( type )
+    {
+    case kptDatabase:
+        ns = "db"; ns_size = 2; break;
+    case kptTable:
+        ns = "tbl"; ns_size = 3; break;
+    case kptIndex:
+        ns = "idx"; ns_size = 3; break;
+    case kptColumn:
+        ns = "col"; ns_size = 3; break;
+    default:
+        return RC ( rcDB, rcDirectory, rcAliasing, rcType, rcIncorrect );
+    }
+
+    rc = KDBMakeSubPath ( dir,
+        src, sizeof src, ns, ns_size, targ );
+    if ( rc == 0 )
+    {
+        char dst [ 256 ];
+        int pt = KDBPathType ( /*NULL,*/ dir, NULL, src );
+        switch ( pt )
+        {
+        case kptNotFound:
+            return RC ( rcDB, rcDirectory, rcAliasing, rcPath, rcNotFound );
+        case kptBadPath:
+            return RC ( rcDB, rcDirectory, rcAliasing, rcPath, rcInvalid );
+
+        case kptDatabase | kptAlias:
+        case kptTable | kptAlias:
+        case kptIndex | kptAlias:
+        case kptColumn | kptAlias:
+            pt &= ~ kptAlias;
+
+        case kptDatabase:
+        case kptTable:
+        case kptIndex:
+        case kptColumn:
+            if ( pt == type )
+                break;
+
+        default:
+            return RC ( rcDB, rcDirectory, rcAliasing, rcPath, rcIncorrect );
+        }
+
+        rc = KDBMakeSubPath ( dir,
+            dst, sizeof dst, ns, ns_size, alias );
+        if ( rc == 0 )
+        {
+            rc = KDirectoryCreateAlias ( dir,
+                0775, kcmCreate, src, dst );
+        }
+    }
+
+    return rc;
+}
+
+
+/* KDBIsPathUri
+ * A hack to get some of VFS into KDB that is too tightly bound to KFS
+ */
+
+bool KDBIsPathUri (const char * path)
+{
+    const char * pc;
+    size_t z;
+
+    z = string_size (path);
+
+    if (NULL != (pc = string_chr (path, z, ':')))
+        return true;
+
+    if (NULL != (pc = string_chr (path, z, '?')))
+        return true;
+
+    if (NULL != (pc = string_chr (path, z, '#')))
+        return true;
+
+    return false;
+}
diff --git a/libs/kdb/wmeta.c b/libs/kdb/wmeta.c
new file mode 100644
index 0000000..3213aef
--- /dev/null
+++ b/libs/kdb/wmeta.c
@@ -0,0 +1,3526 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+struct KMDataNodeNamelist;
+#define KNAMELIST_IMPL struct KMDataNodeNamelist
+
+#include <kdb/extern.h>
+#include "wkdb-priv.h"
+#include "dbmgr-priv.h"
+#include "database-priv.h"
+#include "wtable-priv.h"
+#include "wcolumn-priv.h"
+#include "kdbfmt-priv.h"
+
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <klib/container.h>
+#include <klib/pbstree.h>
+#include <klib/namelist.h>
+#include <klib/impl.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <kfs/md5.h>
+#include <klib/symbol.h>
+#include <klib/refcount.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <atomic.h>
+#include <os-native.h>
+#include <sysalloc.h>
+#include <strtol.h>
+
+#ifndef TRACK_REFERENCES
+#define TRACK_REFERENCES 0
+#endif
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <byteswap.h>
+#include <assert.h>
+
+#define KMETADATAVERS 2
+#define NODE_SIZE_LIMIT ( 25 * 1024 * 1024 )
+#define NODE_CHILD_LIMIT ( 100 * 1024 )
+
+
+typedef struct KMDataNodeInflateData KMDataNodeInflateData;
+struct KMDataNodeInflateData
+{
+    KMetadata *meta;
+    KMDataNode *par;
+    BSTree *bst;
+    size_t node_size_limit;
+    uint32_t node_child_limit;
+    rc_t rc;
+    bool byteswap;
+};
+
+/*--------------------------------------------------------------------------
+ * KMetadata
+ *  a versioned, hierarchical structure
+ */
+struct KMetadata
+{
+    BSTNode n;
+
+    KDirectory *dir;
+    KDBManager *mgr;
+
+    /* owner */
+    KDatabase *db;
+    KTable *tbl;
+    KColumn *col;
+
+    KMD5SumFmt * md5;
+
+    /* root node */
+    KMDataNode *root;
+
+    KSymbol sym;
+
+    KRefcount refcount;
+    uint32_t opencount;
+    uint32_t vers;
+    uint32_t rev;
+    uint8_t read_only;
+    uint8_t dirty;
+    bool byteswap;
+
+    char path [ 1 ];
+};
+
+static
+KMetadata *KMetadataAttach ( const KMetadata *self );
+
+static
+rc_t KMetadataSever ( const KMetadata *self );
+
+
+/*--------------------------------------------------------------------------
+ * KMAttrNode
+ */
+typedef struct KMAttrNode KMAttrNode;
+struct KMAttrNode
+{
+    BSTNode n;
+    void *value;
+    size_t vsize;
+    char name [ 1 ];
+};
+
+static
+int64_t CC KMAttrNodeCmp ( const void *item, const BSTNode *n )
+{
+#define a ( ( const char* ) item )
+#define b ( ( const KMAttrNode* ) n )
+
+    return strcmp ( a, b -> name );
+
+#undef a
+#undef b
+}
+
+static
+int64_t CC KMAttrNodeSort ( const BSTNode *item, const BSTNode *n )
+{
+#define a ( ( const KMAttrNode* ) item )
+#define b ( ( const KMAttrNode* ) n )
+
+    return strcmp ( a -> name, b -> name );
+
+#undef a
+#undef b
+}
+
+static
+void CC KMAttrNodeWhack ( BSTNode *n, void *data )
+{
+    free ( n );
+}
+
+static
+bool CC KMAttrNodeInflate ( PBSTNode *n, void *data )
+{
+    KMAttrNode *b;
+    KMDataNodeInflateData *pb = data;
+
+    const char *name = n -> data . addr;
+    size_t size = strlen ( name );
+    if ( size >= n -> data . size )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+        return true;
+    }
+
+    /* v2 attributes are more easily allocated
+       as a single (name,value) block because
+       there are no other associated structures */
+    b = malloc ( sizeof * b + n -> data . size );
+    if ( b == NULL )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+        return true;
+    }
+
+    b -> value = & b -> name [ 1 + size ];
+    b -> vsize = n -> data . size - size - 1;
+    memmove ( b -> name, name, n -> data . size );
+    BSTreeInsert ( pb -> bst, & b -> n, KMAttrNodeSort );
+    return false;
+}
+
+static
+rc_t KMAttrNodeRename ( const KMAttrNode *self,
+    KMAttrNode **renamed, const char *name )
+{
+    size_t size = strlen ( name );
+    KMAttrNode *b = malloc ( sizeof * b + self -> vsize + size );
+    if ( b == NULL )
+        return RC ( rcDB, rcNode, rcRenaming, rcMemory, rcExhausted );
+
+    b -> value = & b -> name [ 1 + size ];
+    b -> vsize = self -> vsize;
+    strcpy ( b -> name, name );
+    memmove ( b -> value, self -> value, self -> vsize );
+    * renamed = b;
+    return 0;
+}
+
+static
+rc_t KMAttrNodeMake ( KMAttrNode **np,
+    const char *name, const void *value, size_t vsize )
+{
+    size_t size = strlen ( name );
+    KMAttrNode *n = malloc ( sizeof * n + vsize + size );
+    if ( n == NULL )
+        return RC ( rcDB, rcNode, rcConstructing, rcMemory, rcExhausted );
+
+    n -> value = & n -> name [ 1 + size ];
+    n -> vsize = vsize;
+    strcpy ( n -> name, name );
+    if ( vsize != 0 )
+        memmove ( n -> value, value, vsize );
+    * np = n;
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KMDataNode
+ *  a node with an optional value,
+ *  optional attributes, and optional children
+ *
+ *  nodes are identified by path, relative to a starting node,
+ *  where "/" serves as a path separator.
+ */
+struct KMDataNode
+{
+    BSTNode n;
+    KMDataNode *par;
+    KMetadata *meta;
+    void *value;
+    size_t vsize;
+    BSTree attr;
+    BSTree child;
+    KRefcount refcount;
+    uint8_t read_only;
+    char name [ 1 ];
+};
+
+static
+int64_t CC KMDataNodeCmp ( const void *item, const BSTNode *n )
+{
+#define a ( ( const char* ) item )
+#define b ( ( const KMDataNode* ) n )
+
+    return strcmp ( a, b -> name );
+
+#undef a
+#undef b
+}
+
+static
+int64_t CC KMDataNodeSort ( const BSTNode *item, const BSTNode *n )
+{
+#define a ( ( const KMDataNode* ) item )
+#define b ( ( const KMDataNode* ) n )
+
+    return strcmp ( a -> name, b -> name );
+
+#undef a
+#undef b
+}
+
+static
+void CC KMDataNodeWhack ( BSTNode *n, void *data )
+{
+    KMDataNode *self = ( KMDataNode* ) n;
+
+    REFMSG ( "KMDataNode", "flush", & self -> refcount );
+
+    self -> meta = NULL;
+    atomic32_inc ( & self -> refcount );
+    KMDataNodeRelease ( self );
+}
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KMDataNodeAddRef ( const KMDataNode *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KMDataNode" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcMetadata, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeRelease ( const KMDataNode *cself )
+{
+    KMDataNode *self = ( KMDataNode* ) cself;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KMDataNode" ) )
+        {
+        case krefOkay:
+            return KMetadataSever ( self -> meta );
+        case krefWhack:
+
+            if ( self -> meta != NULL )
+            {
+                self -> read_only = 0;
+                return KMetadataSever ( self -> meta );
+            }
+
+            KRefcountWhack ( & self -> refcount, "KMDataNode" );
+
+            BSTreeWhack ( & self -> attr, KMAttrNodeWhack, NULL );
+            BSTreeWhack ( & self -> child, KMDataNodeWhack, NULL );
+            free ( self -> value );
+            free ( self );
+            break;
+
+        case krefLimit:
+            return RC ( rcDB, rcMetadata, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Inflate
+ */
+static
+bool CC KMDataNodeInflate_v1 ( PBSTNode *n, void *data )
+{
+    void *value;
+    KMDataNode *b;
+    KMDataNodeInflateData *pb = data;
+
+    /* v1 metadata are flat, with the name
+       stored as a NUL terminated string
+       followed by value payload */
+    const char *name = n -> data . addr;
+    size_t size = strlen ( name );
+    if ( size >= n -> data . size )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+        return true;
+    }
+
+    b = malloc ( sizeof * b + size );
+    if ( b == NULL )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+        return true;
+    }
+     
+    b -> par = pb -> par;
+    b -> meta = pb -> meta;
+    b -> value = ( void* ) ( name + size + 1 );
+    b -> vsize = n -> data . size - size - 1;
+    BSTreeInit ( & b -> attr );
+    BSTreeInit ( & b -> child );
+    KRefcountInit ( & b -> refcount, 0, "KMDataNode", "inflate", name );
+    b -> read_only = 0;
+    strcpy ( b -> name, name );
+     
+    /* a name with no associated value */
+    if ( b -> vsize == 0 )
+    {
+        b -> value = NULL;
+        BSTreeInsert ( pb -> bst, & b -> n, KMDataNodeSort );
+        return false;
+    }
+
+    /* allocate value because v2+ code expects this */
+    value = malloc ( b -> vsize );
+    if ( value != NULL )
+    {
+        memmove ( value, b -> value, b -> vsize );
+        b -> value = value;
+        BSTreeInsert ( pb -> bst, & b -> n, KMDataNodeSort );
+        return false;
+    }
+
+    pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+    free ( b );
+    return true;
+}
+
+static
+rc_t KMDataNodeInflateAttr ( KMDataNode *n, bool byteswap )
+{
+    PBSTree *bst;
+    rc_t rc = PBSTreeMake ( & bst, n -> value, n -> vsize, byteswap );
+    if ( rc != 0 )
+        rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+    else
+    {
+        KMDataNodeInflateData pb;
+        size_t bst_size = PBSTreeSize ( bst );
+        
+        pb . meta = n -> meta;
+        pb . par = n;
+        pb . bst = & n -> attr;
+        pb . node_size_limit = 0;
+        pb . node_child_limit = 0;
+        pb . rc = 0;
+        pb . byteswap = byteswap;
+        PBSTreeDoUntil ( bst, 0, KMAttrNodeInflate, & pb );
+        rc = pb . rc;
+        
+        PBSTreeWhack ( bst );
+        
+        n -> value = ( char* ) n -> value + bst_size;
+        n -> vsize -= bst_size;
+    }
+    return rc;
+}
+
+static
+bool CC KMDataNodeInflate ( PBSTNode *n, void *data );
+
+static
+rc_t KMDataNodeInflateChild ( KMDataNode *n,
+    size_t node_size_limit, uint32_t node_child_limit, bool byteswap )
+{
+    PBSTree *bst;
+    rc_t rc = PBSTreeMake ( & bst, n -> value, n -> vsize, byteswap );
+    if ( rc != 0 )
+        rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+    else
+    {
+        uint32_t bst_count = PBSTreeCount ( bst );
+        size_t bst_size = PBSTreeSize ( bst );
+        bool inflate = node_child_limit == 0;
+        if ( ! inflate ) {
+            if ( bst_count > node_child_limit )
+            {
+                PLOGMSG ( klogWarn, ( klogWarn,
+                                      "refusing to inflate metadata node '$(node)' "
+                                      "within file '$(path)': "
+                                      "number of children ($(num_children)) "
+                                      "exceeds limit ($(limit))."
+                                      , "node=%s,path=%s,num_children=%u,limit=%u"
+                                      , n -> name
+                                      , n -> meta -> path
+                                      , bst_count
+                                      , node_child_limit )
+                    );
+            }
+            else if ( bst_size > node_size_limit )
+            {
+                PLOGMSG ( klogWarn, ( klogWarn,
+                                      "refusing to inflate metadata node '$(node)' "
+                                      "within file '$(path)': "
+                                      "node size ($(node_size)) exceeds limit ($(limit))."
+                                     , "node=%s,path=%s,node_size=%zu,limit=%zu"
+                                     , n -> name
+                                     , n -> meta -> path
+                                     , bst_size
+                                     , node_size_limit )
+                    );
+            }
+            else {
+                inflate = true;
+            }
+        }
+
+        if ( inflate ) {
+            KMDataNodeInflateData pb;
+
+            pb . meta = n -> meta;
+            pb . par = n;        
+            pb . bst = & n -> child;
+            pb . node_size_limit = node_size_limit;
+            pb . node_child_limit = node_child_limit;
+            pb . rc = 0;
+            pb . byteswap = byteswap;
+            PBSTreeDoUntil ( bst, 0, KMDataNodeInflate, & pb );
+            rc = pb . rc;
+        }
+        
+        PBSTreeWhack ( bst );
+        
+        n -> value = ( char* ) n -> value + bst_size;
+        n -> vsize -= bst_size;
+    }
+    return rc;
+}
+
+static
+bool CC KMDataNodeInflate ( PBSTNode *n, void *data )
+{
+    KMDataNode *b;
+    KMDataNodeInflateData *pb = data;
+
+    /* v2 names are preceded by a decremented length byte
+       that has its upper two bits dedicated to
+       signaling existence of attributes & children */
+    const char *name = n -> data . addr;
+    int bits = * ( ( const uint8_t* ) name ++ );
+    size_t size = ( bits >> 2 ) + 1;
+    if ( size >= n -> data . size )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+        return true;
+    }
+
+    b = malloc ( sizeof * b + size );
+    if ( b == NULL )
+    {
+        pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+        return true;
+    }
+
+    b -> par = pb -> par;
+    b -> meta = pb -> meta;
+    b -> value = ( void* ) ( name + size );
+    b -> vsize = n -> data . size - size - 1;
+    BSTreeInit ( & b -> attr );
+    BSTreeInit ( & b -> child );
+    memmove ( b -> name, name, size );
+    b -> name [ size ] = 0;
+    KRefcountInit ( & b -> refcount, 0, "KMDataNode", "inflate", b -> name );
+    b -> read_only = 0;
+
+    pb -> rc = ( bits & 1 ) != 0 ? KMDataNodeInflateAttr ( b, pb -> byteswap ) : 0;
+    if ( pb -> rc == 0 )
+    {
+        pb -> rc = ( bits & 2 ) != 0 ?
+            KMDataNodeInflateChild ( b, pb -> node_size_limit, pb -> node_child_limit, pb -> byteswap ) : 0;
+        if ( pb -> rc == 0 )
+        {
+            void *value;
+
+            if ( b -> vsize == 0 )
+            {
+                b -> value = NULL;
+                BSTreeInsert ( pb -> bst, & b -> n, KMDataNodeSort );
+                return false;
+            }
+
+            value = malloc ( b -> vsize );
+            if ( value != NULL )
+            {
+                memmove ( value, b -> value, b -> vsize );
+                b -> value = value;
+                BSTreeInsert ( pb -> bst, & b -> n, KMDataNodeSort );
+                return false;
+            }
+            pb -> rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+
+            BSTreeWhack ( & b -> child, KMDataNodeWhack, NULL );
+        }
+
+        BSTreeWhack ( & b -> attr, KMAttrNodeWhack, NULL );
+    }
+
+    free ( b );
+    return true;
+}
+
+
+/* Find
+ */
+static
+rc_t KMDataNodeFind ( const KMDataNode *cself, KMDataNode **np, char **path )
+{
+    KMDataNode *found, *self= ( KMDataNode* ) cself;
+
+    char *end, *name = * path;
+
+    /* interpret leading '/' */
+    if ( name [ 0 ] == '/' )
+    {
+        while ( self -> par != NULL )
+            self = self -> par;
+        ++ name;
+    }
+
+    /* find node */
+    for ( found = self; name != NULL; self = found, name = end )
+    {
+        /* segment path */
+        end = strchr ( name, '/' );
+        if ( end != NULL )
+            * end ++ = 0;
+
+        /* interpret special paths */
+        switch ( name [ 0 ] )
+        {
+        case 0:
+            continue;
+        case '.':
+            switch ( name [ 1 ] )
+            {
+            case 0:
+                continue;
+            case '.':
+                if ( name [ 2 ] == 0 )
+                {
+                    /* this is a backup */
+                    if ( ( self = self -> par ) == NULL )
+                    {
+                        * np = NULL;
+                        return RC ( rcDB, rcMetadata, rcSelecting, rcPath, rcInvalid );
+                    }
+                    continue;
+                }
+                break;
+            }
+            break;
+        }
+
+        /* find actual path */
+        found = ( KMDataNode* ) BSTreeFind ( & self -> child, name, KMDataNodeCmp );
+        if ( found == NULL )
+        {
+            /* not found also gets partially found state */
+            if ( end != NULL )
+                end [ -1 ] = '/';
+            * path = name;
+            * np = self;
+            return SILENT_RC ( rcDB, rcMetadata, rcSelecting, rcPath, rcNotFound );
+        }
+    }
+
+    /* the current self is our guy */
+    * np = self;
+    return 0;
+}
+
+/* Make
+ */
+static
+rc_t KMDataNodeMake ( KMDataNode *self, KMDataNode **np, char *name )
+{
+    rc_t rc;
+    char *end;
+
+    /* create nodes */
+    for ( ; name != NULL; name = end )
+    {
+        BSTNode *x;
+        size_t size;
+        KMDataNode *n;
+
+        /* segment path */
+        end = strchr ( name, '/' );
+        if ( end != NULL )
+            * end ++ = 0;
+
+        /* interpret special paths */
+        switch ( name [ 0 ] )
+        {
+        case 0:
+            continue;
+        case '.':
+            switch ( name [ 1 ] )
+            {
+            case 0:
+                continue;
+            case '.':
+                if ( name [ 2 ] == 0 )
+                {
+                    /* this is a backup */
+                    if ( ( self = self -> par ) == NULL )
+                        return RC ( rcDB, rcMetadata, rcInserting, rcPath, rcInvalid );
+                    continue;
+                }
+                break;
+            }
+            break;
+        case '*':
+            if ( name [ 1 ] == 0 )
+                return RC ( rcDB, rcMetadata, rcInserting, rcPath, rcInvalid );
+        }
+
+        /* we use 2 bits of a size byte to indicate
+           whether a node has attributes and/or children,
+           so limit the node leaf name size to 6 bits.
+           since empty names are not allowed, subtract
+           one from length to give range 0..64 => 1..64 */
+        size = strlen ( name );
+        if ( size > ( 0x3F + 1 ) )
+            return RC ( rcDB, rcMetadata, rcInserting, rcPath, rcExcessive );
+
+        n = malloc ( sizeof * n + size );
+        if ( n == NULL )
+            return RC ( rcDB, rcMetadata, rcInserting, rcMemory, rcExhausted );
+        n -> par = self;
+        n -> meta = self -> meta;
+        n -> value = NULL;
+        n -> vsize = 0;
+        BSTreeInit ( & n -> attr );
+        BSTreeInit ( & n -> child );
+        strcpy ( n -> name, name );
+        KRefcountInit ( & n -> refcount, 0, "KMDataNode", "make", n -> name );
+        n -> read_only = 0;
+
+        /* insert */
+        rc = BSTreeInsertUnique ( & self -> child,
+            & n -> n, & x, KMDataNodeSort );
+        if ( rc != 0 )
+        {
+            free ( n );
+            n = ( KMDataNode* ) x;
+        }
+
+        /* transition */
+        self = n;
+    }
+
+    /* the current self is our guy */
+    * np = self;
+    return 0;
+}
+
+
+/* OpenNodeRead
+ * VOpenNodeRead
+ *  opens a metadata node
+ *
+ *  "node" [ OUT ] - return parameter for indicated metadata node
+ *
+ *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+ *  node within metadata hierarchy. when NULL, empty, ".", or "/",
+ *  return root node in "node". path separator is "/".
+ */
+LIB_EXPORT rc_t CC KMetadataOpenNodeRead ( const KMetadata *self,
+    const KMDataNode **node, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KMetadataVOpenNodeRead ( self, node, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMetadataVOpenNodeRead ( const KMetadata *self,
+    const KMDataNode **node, const char *path, va_list args )
+{
+    rc_t rc = 0;
+
+    if ( node == NULL )
+        rc = RC ( rcDB, rcMetadata, rcOpening, rcParam, rcNull );
+    else if ( self == NULL )
+    {
+        * node = NULL;
+        rc = RC ( rcDB, rcMetadata, rcOpening, rcSelf, rcNull );
+    }
+    else
+        rc = KMDataNodeVOpenNodeRead ( self -> root, node, path, args );
+
+    DBGMSG(DBG_KDB, DBG_FLAG(DBG_KDB_KDB),
+            ("KMetadataVOpenNodeRead(%s) = %d\n", path, rc));
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeOpenNodeRead ( const KMDataNode *self,
+    const KMDataNode **node, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KMDataNodeVOpenNodeRead ( self, node, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeVOpenNodeRead ( const KMDataNode *self,
+    const KMDataNode **node, const char *path, va_list args )
+{
+    rc_t rc;
+    KMDataNode *found;
+    char full [ 4096 ], *p = full;
+
+    if ( node == NULL )
+        return RC ( rcDB, rcNode, rcOpening, rcParam, rcNull );
+
+    * node = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcOpening, rcSelf, rcNull );
+
+    /* handle special NULL path */
+    if ( path == NULL )
+        full [ 0 ] = 0;
+    else
+    {
+        int len;
+
+        /* generate full path */
+        if ( args == NULL )
+            len = snprintf ( full, sizeof full, "%s", path );
+        else
+            len = vsnprintf ( full, sizeof full, path, args );
+        if ( len < 0 || len >= sizeof full )
+            return RC ( rcDB, rcNode, rcOpening, rcPath, rcExcessive );
+    }
+    
+    rc = KMDataNodeFind ( self, & found, & p );
+    if ( rc == 0 )
+    {
+        /* check if the node is not open */
+        if ( atomic32_read ( & found -> refcount ) == 0 )
+        {
+            /* mark as read-only, since we're the first to open */
+            found -> read_only = 1;
+        }
+        /* disallow open if already open for write */
+        else if ( ! found -> read_only )
+        {
+            return RC ( rcDB, rcNode, rcOpening, rcNode, rcBusy );
+        }
+
+        KMetadataAttach ( found -> meta );
+        KMDataNodeAddRef ( found );
+        * node = found;
+    }
+
+    DBGMSG(DBG_KDB, DBG_FLAG(DBG_KDB_KDB),
+            ("KMDataNodeVOpenNodeRead(%s) = %d\n", full, rc));
+
+    return rc;
+}
+
+
+/* OpenNodeUpdate
+ * VOpenNodeUpdate
+ *  opens a metadata node
+ *
+ *  "node" [ OUT ] - return parameter for indicated metadata node
+ *
+ *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+ *  node within metadata hierarchy. when NULL, empty, ".", or "/",
+ *  return root node in "node". path separator is "/".
+ */
+LIB_EXPORT rc_t CC KMetadataOpenNodeUpdate ( KMetadata *self,
+    KMDataNode **node, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KMetadataVOpenNodeUpdate ( self, node, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMetadataVOpenNodeUpdate ( KMetadata *self,
+    KMDataNode **node, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( node == NULL )
+        rc = RC ( rcDB, rcMetadata, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcMetadata, rcOpening, rcSelf, rcNull );
+        else if ( self -> read_only )
+            rc = RC ( rcDB, rcMetadata, rcOpening, rcNode, rcReadonly );
+        else {
+            rc = KMDataNodeVOpenNodeUpdate ( self -> root, node, path, args );
+            DBGMSG(DBG_KDB, DBG_FLAG(DBG_KDB_KDB),
+                        ("KMetadataVOpenNodeUpdate(%s) = %d\n", path, rc));
+            return rc;
+        }
+
+        * node = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeOpenNodeUpdate ( KMDataNode *self,
+    KMDataNode **node, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KMDataNodeVOpenNodeUpdate ( self, node, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeVOpenNodeUpdate ( KMDataNode *self,
+    KMDataNode **node, const char *path, va_list args )
+{
+    rc_t rc = 0;
+    KMDataNode *found;
+    char full [ 4096 ], *p = full;
+
+    if ( node == NULL )
+        return RC ( rcDB, rcNode, rcOpening, rcParam, rcNull );
+
+    * node = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcOpening, rcSelf, rcNull );
+
+    /* handle special NULL path */
+    if ( path == NULL )
+        full [ 0 ] = 0;
+    else
+    {
+        int len;
+
+        /* generate full path */
+        if ( args == NULL )
+            len = snprintf ( full, sizeof full, "%s", path );
+        else
+            len = vsnprintf ( full, sizeof full, path, args );
+        if ( len < 0 || len >= sizeof full )
+            return RC ( rcDB, rcNode, rcOpening, rcPath, rcExcessive );
+    }
+
+    /* don't allow update when open for read */
+    if ( self -> read_only ) {
+        rc = RC ( rcDB, rcNode, rcOpening, rcNode, rcReadonly );
+        DBGMSG(DBG_KDB, DBG_FLAG(DBG_KDB_KDB),
+                    ("KMDataNodeVOpenNodeUpdate(%s) = %d\n", full, rc));
+        return rc;
+    }
+
+    /* find an existing one */
+    rc = KMDataNodeFind ( self, & found, & p );
+    if ( rc == 0 )
+    {
+        if ( atomic32_read ( & found -> refcount ) != 0 )
+            return RC ( rcDB, rcNode, rcOpening, rcNode, rcBusy );
+    }
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {
+        rc = KMDataNodeMake ( found, & found, p );
+        if ( rc != 0 )
+            return rc;
+    }
+    else
+    {
+        return rc;
+    }
+
+    KMetadataAttach ( found -> meta );
+    KMDataNodeAddRef ( found );
+    found -> read_only = false;
+    * node = found;
+
+    DBGMSG(DBG_KDB, DBG_FLAG(DBG_KDB_KDB),
+                ("KMDataNodeVOpenNodeUpdate(%s) = %d\n", full, rc));
+
+    return rc;
+}
+
+
+/* ByteOrder
+ *  indicates whether original byte order is reversed
+ *  under current architecture.
+ *
+ *  the byte order of the column is established by
+ *  the host architecture when created.
+ *
+ *  "reversed" [ OUT ] - if true, the original byte
+ *  order is reversed with regard to host native byte order.
+ */
+LIB_EXPORT rc_t CC KMDataNodeByteOrder ( const KMDataNode *self, bool *reversed )
+{
+    if ( self != NULL )
+        return KMetadataByteOrder ( self -> meta, reversed );
+
+    if ( reversed == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+
+    * reversed = false;
+    return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+}
+
+
+/* Read
+ *  read a node value or attribute
+ *
+ *  "offset" [ IN ] - initial offset into metadata
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - number of bytes actually read
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of bytes remaining to be read.
+ *  specifically, "offset" + "num_read" + "remaining" == sizeof node data
+ */
+LIB_EXPORT rc_t CC KMDataNodeRead ( const KMDataNode *self,
+    size_t offset, void *buffer, size_t bsize,
+    size_t *num_read, size_t *remaining )
+{
+    rc_t rc;
+
+    size_t dummy;
+    if ( remaining == NULL )
+        remaining = & dummy;
+
+    if ( num_read == NULL )
+        rc = RC ( rcDB, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcNode, rcReading, rcSelf, rcNull );
+        else if ( buffer == NULL && bsize != 0 )
+            rc = RC ( rcDB, rcNode, rcReading, rcBuffer, rcNull );
+        else
+        {
+            size_t to_read, avail = self -> vsize;
+            if ( offset > avail )
+                offset = avail;
+
+            to_read = avail -= offset;
+            if ( to_read > bsize )
+                to_read = bsize;
+
+            if ( to_read > 0 )
+                memmove ( buffer, ( const char* ) self -> value + offset, to_read );
+
+            * num_read = to_read;
+            * remaining = avail - to_read;
+
+            return 0;
+        }
+
+        * num_read = 0;
+    }
+
+    * remaining = 0;
+    return rc;
+}
+
+
+/* Addr - PRIVATE
+ *  reach into node and get address
+ *  returns raw pointer and node size
+ */
+LIB_EXPORT rc_t CC KMDataNodeAddr ( const KMDataNode *self,
+    const void **addr, size_t *size )
+{
+    rc_t rc;
+
+    size_t dummy;
+    if ( size == NULL )
+        size = & dummy;
+
+    if ( addr == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcMetadata, rcReading, rcSelf, rcNull );
+        else
+        {
+            * addr = self -> value;
+            * size = self -> vsize;
+
+            return 0;
+        }
+
+        * addr = NULL;
+    }
+
+    * size = 0;
+    return rc;
+}
+
+
+/* Write
+ *  write a node value or attribute
+ *  overwrites anything already there
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - new value data
+ */
+LIB_EXPORT rc_t CC KMDataNodeWrite ( KMDataNode *self, const void *buffer, size_t size )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcWriting, rcSelf, rcNull );
+    if ( self -> meta == NULL )
+        return RC ( rcDB, rcNode, rcWriting, rcMetadata, rcNull );
+    if ( buffer == NULL && size != 0 )
+        return RC ( rcDB, rcNode, rcWriting, rcBuffer, rcNull );
+
+    /* don't allow update when open for read or root node */
+    if ( self -> read_only || self -> par == NULL )
+        return RC ( rcDB, rcNode, rcWriting, rcNode, rcReadonly );
+
+    if ( size == self -> vsize )
+    {
+        if ( size == 0 )
+            return 0;
+
+        memmove ( self -> value, buffer, size );
+    }
+    else
+    {
+        void *value;
+
+        if ( buffer == NULL || size == 0 )
+        {
+            value = NULL;
+            size = 0;
+        }
+        else
+        {
+            value = malloc ( size );
+            if ( value == NULL )
+                return RC ( rcDB, rcNode, rcWriting, rcMemory, rcExhausted );
+            memmove ( value, buffer, size );
+        }
+            
+        if ( self -> value != NULL )
+            free ( self -> value );
+
+        self -> value = value;
+        self -> vsize = size;
+    }
+    
+    self -> meta -> dirty = true;
+
+    return 0;
+}
+
+
+/* Append
+ *  append data to value
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - value data to be appended
+ */
+LIB_EXPORT rc_t CC KMDataNodeAppend ( KMDataNode *self, const void *buffer, size_t size )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcWriting, rcSelf, rcNull );
+    if ( self -> meta == NULL )
+        return RC ( rcDB, rcNode, rcWriting, rcMetadata, rcNull );
+    if ( buffer == NULL && size != 0 )
+        return RC ( rcDB, rcNode, rcWriting, rcBuffer, rcNull );
+
+    /* don't allow update when open for read or root node */
+    if ( self -> read_only || self -> par == NULL )
+        return RC ( rcDB, rcNode, rcWriting, rcNode, rcReadonly );
+
+    if ( size != 0 )
+    {
+        void *value = realloc ( self -> value, self -> vsize + size );
+        if ( value == NULL )
+            return RC ( rcDB, rcNode, rcWriting, rcMemory, rcExhausted );
+        memmove ( ( char* ) value + self -> vsize, buffer, size );
+        self -> value = value;
+        self -> vsize += size;
+        self -> meta -> dirty = true;
+    }
+    return 0;
+}
+
+
+/* Read ( formatted )
+ *  reads as integer or float value in native byte order
+ *
+ *  "bXX" [ OUT ] - return parameter for numeric value
+ */
+LIB_EXPORT rc_t CC KMDataNodeReadB8 ( const KMDataNode *self, void *b8 )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, b8, 1,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+        if ( num_read < 1 )
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadB16 ( const KMDataNode *self, void *b16 )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, b16, 2,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+        if ( num_read < 2 )
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+
+        if ( self -> meta -> byteswap )
+            * ( uint16_t* ) b16 = bswap_16 ( * ( const uint16_t* ) b16 );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadB32 ( const KMDataNode *self, void *b32 )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, b32, 4,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+        if ( num_read < 4 )
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+
+        if ( self -> meta -> byteswap )
+            * ( uint32_t* ) b32 = bswap_32 ( * ( const uint32_t* ) b32 );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadB64 ( const KMDataNode *self, void *b64 )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, b64, 8,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+        if ( num_read < 8 )
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+
+        if ( self -> meta -> byteswap )
+            * ( uint64_t* ) b64 = bswap_64 ( * ( const uint64_t* ) b64 );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadB128 ( const KMDataNode *self, void *b128 )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, b128, 16,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+        if ( num_read < 16 )
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+
+        if ( self -> meta -> byteswap )
+        {
+            uint64_t *b64 = b128;
+            uint64_t tmp = bswap_64 ( b64 [ 0 ] );
+            b64 [ 0 ] = bswap_64 ( b64 [ 1 ] );
+            b64 [ 1 ] = tmp;
+        }
+    }
+    return rc;
+}
+
+
+/* ReadAs ( formatted )
+ *  reads as integer or float value in native byte order
+ *  casts smaller-sized values to desired size, e.g.
+ *    uint32_t to uint64_t
+ *
+ *  "i" [ OUT ] - return parameter for signed integer
+ *  "u" [ OUT ] - return parameter for unsigned integer
+ *  "f" [ OUT ] - return parameter for double float
+ */
+LIB_EXPORT rc_t CC KMDataNodeReadAsI16 ( const KMDataNode *self, int16_t *i )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, i, sizeof * i,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * i = ( ( const int8_t* ) i ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * i = bswap_16 ( * i );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsU16 ( const KMDataNode *self, uint16_t *u )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, u, sizeof * u,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * u = ( ( const uint8_t* ) u ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * u = bswap_16 ( * u );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsI32 ( const KMDataNode *self, int32_t *i )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, i, sizeof * i,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * i = ( ( const int8_t* ) i ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * i = bswap_16 ( ( ( const int16_t* ) i ) [ 0 ] );
+            else
+                * i = ( ( const int16_t* ) i ) [ 0 ];
+            break;
+        case 4:
+            if ( self -> meta -> byteswap )
+                * i = bswap_32 ( * i );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsU32 ( const KMDataNode *self, uint32_t *u )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, u, sizeof * u,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * u = ( ( const uint8_t* ) u ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * u = bswap_16 ( ( ( const uint16_t* ) u ) [ 0 ] );
+            else
+                * u = ( ( const uint16_t* ) u ) [ 0 ];
+            break;
+        case 4:
+            if ( self -> meta -> byteswap )
+                * u = bswap_32 ( * u );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsI64 ( const KMDataNode *self, int64_t *i )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, i, sizeof * i,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * i = ( ( const int8_t* ) i ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * i = bswap_16 ( ( ( const int16_t* ) i ) [ 0 ] );
+            else
+                * i = ( ( const int16_t* ) i ) [ 0 ];
+            break;
+        case 4:
+            if ( self -> meta -> byteswap )
+                * i = bswap_32 ( ( ( const int32_t* ) i ) [ 0 ] );
+            else
+                * i = ( ( const int32_t* ) i ) [ 0 ];
+            break;
+        case 8:
+            if ( self -> meta -> byteswap )
+                * i = bswap_64 ( * i );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsU64 ( const KMDataNode *self, uint64_t *u )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, u, sizeof * u,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 1:
+            * u = ( ( const uint8_t* ) u ) [ 0 ];
+            break;
+        case 2:
+            if ( self -> meta -> byteswap )
+                * u = bswap_16 ( ( ( const uint16_t* ) u ) [ 0 ] );
+            else
+                * u = ( ( const uint16_t* ) u ) [ 0 ];
+            break;
+        case 4:
+            if ( self -> meta -> byteswap )
+                * u = bswap_32 ( ( ( const uint32_t* ) u ) [ 0 ] );
+            else
+                * u = ( ( const uint32_t* ) u ) [ 0 ];
+            break;
+        case 8:
+            if ( self -> meta -> byteswap )
+                * u = bswap_64 ( * u );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAsF64 ( const KMDataNode *self, double *f )
+{
+    size_t num_read, remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, f, sizeof * f,
+        & num_read, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+            return RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+
+        switch ( num_read )
+        {
+        case 4:
+            if ( self -> meta -> byteswap )
+                * ( uint32_t* ) f = bswap_32 ( * ( const uint32_t* ) f );
+            * f = ( ( const float* ) f ) [ 0 ];
+            break;
+        case 8:
+            if ( self -> meta -> byteswap )
+                * ( uint64_t* ) f = bswap_64 ( * ( const uint64_t* ) f );
+            break;
+        default:
+            return RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+        }
+    }
+    return rc;
+}
+
+
+/* Read ( formatted )
+ *  reads as C-string
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated string.
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+LIB_EXPORT rc_t CC KMDataNodeReadCString ( const KMDataNode *self,
+    char *buffer, size_t bsize, size_t *size )
+{
+    size_t remaining;
+    rc_t rc = KMDataNodeRead ( self, 0, buffer, bsize - 1, size, & remaining );
+    if ( rc == 0 )
+    {
+        if ( remaining != 0 )
+        {
+            * size += remaining;
+            return RC ( rcDB, rcMetadata, rcReading, rcBuffer, rcInsufficient );
+        }
+
+        buffer [ * size ] = 0;
+    }
+    return rc;
+}
+
+
+/* Write ( formatted )
+ *  writes integer or float value in metadata byte order
+ *
+ *  "bXX" [ IN ] - numeric value
+ *
+ * NB - we do not currently ( and maybe never ) support
+ *  writing in non-native byte-order.
+ */
+LIB_EXPORT rc_t CC KMDataNodeWriteB8 ( KMDataNode *self, const void *b8 )
+{
+    return KMDataNodeWrite ( self, b8, 1 );
+}
+
+LIB_EXPORT rc_t CC KMDataNodeWriteB16 ( KMDataNode *self, const void *b16 )
+{
+    return KMDataNodeWrite ( self, b16, 2 );
+}
+
+LIB_EXPORT rc_t CC KMDataNodeWriteB32 ( KMDataNode *self, const void *b32 )
+{
+    return KMDataNodeWrite ( self, b32, 4 );
+}
+
+LIB_EXPORT rc_t CC KMDataNodeWriteB64 ( KMDataNode *self, const void *b64 )
+{
+    return KMDataNodeWrite ( self, b64, 8 );
+}
+
+LIB_EXPORT rc_t CC KMDataNodeWriteB128 ( KMDataNode *self, const void *b128 )
+{
+    return KMDataNodeWrite ( self, b128, 16 );
+}
+
+
+/* Write ( formatted )
+ *  writes C-string
+ *
+ *  "str" [ IN ] - NUL terminated string.
+ */
+LIB_EXPORT rc_t CC KMDataNodeWriteCString ( KMDataNode *self, const char *str )
+{
+    if ( str != NULL )
+        return KMDataNodeWrite ( self, str, strlen ( str ) );
+
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcWriting, rcSelf, rcNull );
+
+    return RC ( rcDB, rcNode, rcWriting, rcString, rcNull );
+}
+
+
+/* ReadAttr
+ *  reads as NUL-terminated string
+ *
+ *  "name" [ IN ] - NUL terminated attribute name
+ *
+ *  "buffer" [ OUT ] and "bsize" - return parameter for attribute value
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+LIB_EXPORT rc_t CC KMDataNodeReadAttr ( const KMDataNode *self, const char *name,
+    char *buffer, size_t bsize, size_t *size )
+{
+    rc_t rc;
+
+    if ( size == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcMetadata, rcReading, rcSelf, rcNull );
+        else if ( name == NULL )
+            rc = RC ( rcDB, rcMetadata, rcReading, rcString, rcNull );
+        else if ( name [ 0 ] == 0 )
+            rc = RC ( rcDB, rcMetadata, rcReading, rcString, rcEmpty );
+        else if ( buffer == NULL && bsize != 0 )
+            rc = RC ( rcDB, rcMetadata, rcReading, rcBuffer, rcNull );
+        else
+        {
+            const KMAttrNode *n = ( const KMAttrNode* )
+                BSTreeFind ( & self -> attr, name, KMAttrNodeCmp );
+            if ( n == NULL )
+            {
+                * size = 0;
+                if ( bsize != 0 )
+                    buffer [ 0 ] = 0;
+                rc = RC ( rcDB, rcMetadata, rcReading, rcAttr, rcNotFound );
+            }
+            else
+            {
+                * size = n -> vsize;
+                if ( n -> vsize < bsize )
+                {
+                    memmove ( buffer, n -> value, n -> vsize );
+                    buffer [ n -> vsize ] = 0;
+                    return 0;
+                }
+
+                return RC ( rcDB, rcMetadata, rcReading, rcBuffer, rcInsufficient );
+            }
+        }
+
+        * size = 0;
+    }
+
+    return rc;
+}
+
+
+/* WriteAttr
+ *  writes NUL-terminated string
+ *
+ *  "name" [ IN ] - NUL terminated attribute name
+ *
+ *  "value" [ IN ] - NUL terminated attribute value
+ */
+LIB_EXPORT rc_t CC KMDataNodeWriteAttr ( KMDataNode *self,
+    const char *name, const char *value )
+{
+    rc_t rc;
+    size_t size;
+    KMAttrNode *n;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcWriting, rcSelf, rcNull );
+    if ( self -> meta == NULL )
+        return RC ( rcDB, rcNode, rcWriting, rcMetadata, rcNull );
+    if ( name == NULL )
+        return RC ( rcDB, rcNode, rcWriting, rcPath, rcNull );
+    if ( name [ 0 ] == 0 )
+        return RC ( rcDB, rcNode, rcWriting, rcPath, rcInvalid );
+
+    /* don't allow update when open for read or root node */
+    if ( self -> read_only || self -> par == NULL )
+        return RC ( rcDB, rcNode, rcWriting, rcNode, rcReadonly );
+
+    size = ( value == NULL ) ? 0 : strlen ( value );
+    rc = KMAttrNodeMake ( & n, name, value, size );
+    if ( rc == 0 )
+    {
+        BSTNode *x;
+        if ( BSTreeInsertUnique ( & self -> attr,
+             & n -> n, & x, KMAttrNodeSort ) != 0 )
+        {
+            BSTreeUnlink ( & self -> attr, x );
+            KMAttrNodeWhack ( x, NULL );
+            BSTreeInsert ( & self -> attr, & n -> n, KMAttrNodeSort );
+        }
+
+        self -> meta -> dirty = true;
+    }
+    return rc;
+}
+
+
+/* ReadAttrAs ( formatted )
+ *  reads as integer or float value in native byte order
+ *  casts smaller-sized values to desired size, e.g.
+ *    uint32_t to uint64_t
+ *
+ *  "i" [ OUT ] - return parameter for signed integer
+ *  "u" [ OUT ] - return parameter for unsigned integer
+ *  "f" [ OUT ] - return parameter for double float
+ */
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsI16 ( const KMDataNode *self, const char *attr, int16_t *i )
+{
+    rc_t rc;
+    if ( i == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            long val = strtol ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else if ( val < -32768 || val > 32767 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcRange, rcExcessive );
+            else
+            {
+                * i = ( int16_t ) val;
+                return 0;
+            }
+        }
+
+        * i = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsU16 ( const KMDataNode *self, const char *attr, uint16_t *u )
+{
+    rc_t rc;
+    if ( u == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            unsigned long val = strtoul ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else if ( val > 0xFFFF )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcRange, rcExcessive );
+            else
+            {
+                * u = ( uint16_t ) val;
+                return 0;
+            }
+        }
+
+        * u = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsI32 ( const KMDataNode *self, const char *attr, int32_t *i )
+{
+    rc_t rc;
+    if ( i == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            long val = strtol ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else if ( val < (-2147483647 - 1) || val > 2147483647 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcRange, rcExcessive );
+            else
+            {
+                * i = ( int32_t ) val;
+                return 0;
+            }
+        }
+
+        * i = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsU32 ( const KMDataNode *self, const char *attr, uint32_t *u )
+{
+    rc_t rc;
+    if ( u == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            unsigned long val = strtoul ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else if ( val > 0xFFFFFFFF )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcRange, rcExcessive );
+            else
+            {
+                * u = ( uint32_t ) val;
+                return 0;
+            }
+        }
+
+        * u = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsI64 ( const KMDataNode *self, const char *attr, int64_t *i )
+{
+    rc_t rc;
+    if ( i == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            int64_t val =  strtoi64 ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else
+            {
+                * i = val;
+                return 0;
+            }
+        }
+
+        * i = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsU64 ( const KMDataNode *self, const char *attr, uint64_t *u )
+{
+    rc_t rc;
+    if ( u == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            uint64_t val =  strtou64 ( buffer, & end, 0 );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else
+            {
+                * u = val;
+                return 0;
+            }
+        }
+
+        * u = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeReadAttrAsF64 ( const KMDataNode *self, const char *attr, double *f )
+{
+    rc_t rc;
+    if ( f == NULL )
+        rc = RC ( rcDB, rcMetadata, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t size;
+        char buffer [ 256 ];
+        rc = KMDataNodeReadAttr ( self, attr, buffer, sizeof buffer, & size );
+        if ( rc == 0 )
+        {
+            char *end;
+            double val = strtod ( buffer, & end );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcDB, rcMetadata, rcReading, rcNode, rcIncorrect );
+            else
+            {
+                * f = val;
+                return 0;
+            }
+        }
+
+        * f = 0.0;
+    }
+    return rc;
+}
+
+
+/* Drop
+ * VDrop
+ *  drop some or all node content
+ */
+LIB_EXPORT rc_t CC KMDataNodeDropAll ( KMDataNode *self )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcClearing, rcSelf, rcNull );
+    if ( self -> meta == NULL )
+        return RC ( rcDB, rcNode, rcClearing, rcMetadata, rcNull );
+    if ( self -> read_only )
+        return RC ( rcDB, rcNode, rcClearing, rcNode, rcReadonly );
+
+    BSTreeWhack ( & self -> attr, KMAttrNodeWhack, NULL );
+    BSTreeInit ( & self -> attr );
+
+    BSTreeWhack ( & self -> child, KMDataNodeWhack, NULL );
+    BSTreeInit ( & self -> child );
+
+    free ( self -> value );
+    self -> value = NULL;
+    self -> vsize = 0;
+    self -> meta -> dirty = true;
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeDropAttr ( KMDataNode *self, const char *attr )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcUpdating, rcSelf, rcNull );
+    if ( self -> meta == NULL )
+        return RC ( rcDB, rcNode, rcUpdating, rcMetadata, rcNull );
+    if ( attr == NULL )
+        return RC ( rcDB, rcNode, rcUpdating, rcPath, rcNull );
+    if ( attr [ 0 ] == 0 )
+        return RC ( rcDB, rcNode, rcUpdating, rcPath, rcInvalid );
+    if ( self -> read_only )
+        return RC ( rcDB, rcNode, rcUpdating, rcNode, rcReadonly );
+
+    /* recognize wildcard */
+    if ( attr [ 0 ] == '*' && attr [ 1 ] == 0 )
+    {
+        BSTreeWhack ( & self -> attr, KMAttrNodeWhack, NULL );
+        BSTreeInit ( & self -> attr );
+    }
+    else
+    {
+        KMAttrNode *found = ( KMAttrNode* )
+            BSTreeFind ( & self -> attr, attr, KMAttrNodeCmp );
+        if ( found == NULL )
+            return RC ( rcDB, rcNode, rcUpdating, rcAttr, rcNotFound );
+
+        BSTreeUnlink ( & self -> attr, & found -> n );
+        KMAttrNodeWhack ( & found -> n, NULL );
+    }
+
+    self -> meta -> dirty = true;
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeDropChild ( KMDataNode *self, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KMDataNodeVDropChild ( self, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeVDropChild ( KMDataNode *self, const char *path, va_list args )
+{
+    int len;
+    rc_t rc;
+    KMDataNode *found;
+    char full [ 4096 ], *p = full;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcUpdating, rcSelf, rcNull );
+    if ( self -> meta == NULL )
+        return RC ( rcDB, rcNode, rcUpdating, rcMetadata, rcNull );
+    if ( path == NULL )
+        return RC ( rcDB, rcNode, rcUpdating, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcDB, rcNode, rcUpdating, rcPath, rcInvalid );
+
+    /* generate full path */
+    if ( args == NULL )
+        len = snprintf ( full, sizeof full, "%s", path );
+    else
+        len = vsnprintf ( full, sizeof full, path, args );
+    if ( len < 0 || len >= sizeof full )
+        return RC ( rcDB, rcNode, rcUpdating, rcPath, rcExcessive );
+
+    /* don't allow update when open for read */
+    if ( self -> read_only )
+        return RC ( rcDB, rcNode, rcUpdating, rcNode, rcReadonly );
+
+    rc = KMDataNodeFind ( self, & found, & p );
+    if ( GetRCState ( rc ) == rcNotFound )
+    {
+        if ( p [ 0 ] != '*' || p [ 1 ] != 0 )
+            return rc;
+
+        BSTreeWhack ( & found -> child, KMDataNodeWhack, NULL );
+        BSTreeInit ( & found -> child );
+    }
+    else
+    {
+        BSTreeUnlink ( & self -> child, & found -> n );
+        KMDataNodeWhack ( & found -> n, NULL );
+    }
+
+    self -> meta -> dirty = true;
+
+    return 0;
+}
+
+
+/* Rename
+ *  renames a contained object
+ *
+ *  "from" [ IN ] - NUL terminated string in UTF-8
+ *  giving simple name of existing attr
+ *
+ *  "to" [ IN ] - NUL terminated string in UTF-8
+ *  giving new simple attr name
+ */
+LIB_EXPORT rc_t CC KMDataNodeRenameAttr ( KMDataNode *self, const char *from, const char *to )
+{
+    rc_t rc;
+    KMAttrNode *found, *renamed;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcRenaming, rcSelf, rcNull );
+    if ( self -> meta == NULL )
+        return RC ( rcDB, rcNode, rcRenaming, rcMetadata, rcNull );
+    if ( from == NULL || to == NULL )
+        return RC ( rcDB, rcNode, rcRenaming, rcPath, rcNull );
+    if ( from [ 0 ] == 0 || to [ 0 ] == 0 )
+        return RC ( rcDB, rcNode, rcRenaming, rcPath, rcInvalid );
+    if ( self -> read_only )
+        return RC ( rcDB, rcNode, rcRenaming, rcNode, rcReadonly );
+
+    found = ( KMAttrNode* )
+        BSTreeFind ( & self -> attr, from, KMAttrNodeCmp );
+    if ( found == NULL )
+        return RC ( rcDB, rcNode, rcRenaming, rcAttr, rcNotFound );
+
+    rc = KMAttrNodeRename ( found, & renamed, to );
+    if ( rc == 0 )
+    {
+        BSTNode *x;
+        rc = BSTreeInsertUnique ( & self -> attr,
+            & renamed -> n, & x, KMAttrNodeSort );
+        if ( rc != 0 )
+        {
+            KMAttrNodeWhack ( & renamed -> n, NULL );
+            if ( x == & found -> n )
+                return 0;
+            return RC ( rcDB, rcNode, rcRenaming, rcAttr, rcExists );
+        }
+
+        BSTreeUnlink ( & self -> attr, & found -> n );
+        KMAttrNodeWhack ( & found -> n, NULL );
+        self -> meta -> dirty = true;
+    }
+
+    return rc;
+}
+
+static
+void CC KMDataNodeRelinkParent ( BSTNode *n, void *data )
+{
+    ( ( KMDataNode* ) n ) -> par = data;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeRenameChild ( KMDataNode *self, const char *from, const char *to )
+{
+    int len;
+    rc_t rc;
+    KMDataNode *found;
+    char full [ 4096 ], *p = full;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcRenaming, rcSelf, rcNull );
+    if ( self -> meta == NULL )
+        return RC ( rcDB, rcNode, rcRenaming, rcMetadata, rcNull );
+    if ( from == NULL || to == NULL )
+        return RC ( rcDB, rcNode, rcRenaming, rcPath, rcNull );
+    if ( from [ 0 ] == 0 || to [ 0 ] == 0 )
+        return RC ( rcDB, rcNode, rcRenaming, rcPath, rcInvalid );
+    if ( self -> read_only )
+        return RC ( rcDB, rcNode, rcRenaming, rcNode, rcReadonly );
+
+    /* generate full path */
+    len = snprintf ( full, sizeof full, "%s", from );
+    if ( len < 0 || len >= sizeof full )
+        return RC ( rcDB, rcNode, rcRenaming, rcPath, rcExcessive );
+
+    rc = KMDataNodeFind ( self, & found, & p );
+    if ( rc == 0 )
+    {
+        KMDataNode *renamed;
+
+        if ( atomic32_read ( & found -> refcount ) != 0 )
+            return RC ( rcDB, rcNode, rcRenaming, rcNode, rcBusy );
+
+        len = snprintf ( p = full, sizeof full, "%s", to );
+        if ( len < 0 || len >= sizeof full )
+            return RC ( rcDB, rcNode, rcRenaming, rcPath, rcExcessive );
+
+        rc = KMDataNodeFind ( self, & renamed, & p );
+        if ( GetRCState ( rc ) == rcNotFound )
+        {
+            rc = KMDataNodeMake ( renamed, & renamed, p );
+            if ( rc == 0 )
+            {
+                BSTreeUnlink ( & found -> par -> child, & found -> n );
+
+                renamed -> attr = found -> attr;
+                BSTreeInit ( & found -> attr );
+
+                renamed -> child = found -> child;
+                BSTreeInit ( & found -> child );
+                BSTreeForEach ( & renamed -> child,
+                    false, KMDataNodeRelinkParent, renamed );
+
+                renamed -> value = found -> value;
+                renamed -> vsize = found -> vsize;
+                found -> value = NULL;
+                found -> vsize = 0;
+
+                KMDataNodeWhack ( & found -> n, NULL );
+                self -> meta -> dirty = true;
+            }
+        }
+        else if ( rc == 0 )
+            rc = RC ( rcDB, rcNode, rcRenaming, rcNode, rcExists );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KMetadata
+ *  a versioned, hierarchical structure
+ */
+
+/* Flush
+ */
+typedef struct KMDFlushData KMDFlushData;
+struct KMDFlushData
+{
+    uint64_t pos;
+    KFile *f;
+    KMD5File *fmd5;
+    uint8_t *buffer;
+    size_t bsize;
+    size_t marker;
+    rc_t rc;
+};
+
+static
+rc_t CC KMDWriteFunc ( void *param, const void *buffer, size_t size, size_t *num_writ )
+{
+    KMDFlushData *pb = param;
+    size_t total, to_write;
+
+    for ( total = 0; total < size; total += to_write )
+    {
+        to_write = size - total;
+        if ( pb -> marker + to_write > pb -> bsize )
+            to_write = pb -> bsize - pb -> marker;
+
+        if ( to_write > 0 )
+        {
+            memmove ( pb -> buffer + pb -> marker,
+                ( const uint8_t* ) buffer + total, to_write );
+            pb -> marker += to_write;
+        }
+
+        if ( pb -> marker == pb -> bsize )
+        {
+            size_t num_flushed;
+            pb -> rc = KFileWrite ( pb -> f, pb -> pos,
+                pb -> buffer, pb -> bsize, & num_flushed );
+            if ( pb -> rc != 0 )
+            {
+                * num_writ = 0;
+                return pb -> rc;
+            }
+
+            if ( num_flushed == 0 )
+            {
+                * num_writ = total + to_write;
+                return pb -> rc = RC ( rcDB, rcMetadata, rcPersisting, rcTransfer, rcIncomplete );
+            }
+
+            pb -> marker -= num_flushed;
+            pb -> pos += num_flushed;
+
+            if ( pb -> marker != 0 )
+                memmove ( pb -> buffer, pb -> buffer + num_flushed, pb -> marker );
+        }
+    }
+
+    * num_writ = total;
+    return 0;
+}
+
+static
+rc_t CC KMAttrNodeAuxFunc ( void *param, const void *node, size_t *num_writ,
+    PTWriteFunc write, void *write_param )
+{
+    const KMAttrNode *n = node;
+    size_t nsize = strlen ( n -> name );
+
+    if ( write != NULL )
+        return ( * write ) ( write_param, n -> name, nsize + n -> vsize + 1, num_writ );
+
+    * num_writ = nsize + n -> vsize + 1;
+    return 0;
+}
+
+static
+rc_t CC KMDataNodeAuxFunc ( void *param, const void *node, size_t *num_writ,
+    PTWriteFunc write, void *write_param )
+{
+    rc_t rc;
+    const KMDataNode *n = node;
+    size_t nsize = strlen ( n -> name );
+    size_t auxsize = 0;
+
+    /* first write node name */
+    if ( write != NULL )
+    {
+        uint8_t bits = ( uint8_t ) ( nsize - 1 ) << 2;
+        if ( n -> attr . root != NULL )
+            bits |= 1;
+        if ( n -> child . root != NULL )
+            bits |= 2;
+        rc = ( * write ) ( write_param, & bits, 1, num_writ );
+        if ( rc == 0 )
+            rc = ( * write ) ( write_param, n -> name, nsize, num_writ );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* if there are any attributes */
+    if ( n -> attr . root != NULL )
+    {
+        rc = BSTreePersist ( & n -> attr, num_writ,
+            write, write_param, KMAttrNodeAuxFunc, NULL );
+        if ( rc != 0 )
+            return rc;
+        auxsize += * num_writ;
+    }
+
+    /* if there are any children */
+    if ( n -> child . root != NULL )
+    {
+        rc = BSTreePersist ( & n -> child, num_writ,
+            write, write_param, KMDataNodeAuxFunc, NULL );
+        if ( rc != 0 )
+            return rc;
+        auxsize += * num_writ;
+    }
+
+    /* finally write value */
+    if ( write == NULL )
+    {
+        * num_writ = nsize + 1 + auxsize + n -> vsize;
+        return 0;
+    }
+
+    rc = ( * write ) ( write_param, n -> value, n -> vsize, num_writ );
+    * num_writ += nsize + 1 + auxsize;
+    return rc;
+}
+
+static
+rc_t KMetadataFlush ( KMetadata *self )
+{
+    rc_t rc;
+    KMDFlushData pb;
+    memset ( & pb, 0, sizeof pb );
+
+    /* allocate buffer */
+    pb . buffer = malloc ( pb . bsize = 32 * 1024 );
+    if ( pb . buffer == NULL )
+        rc = RC ( rcDB, rcMetadata, rcPersisting, rcMemory, rcExhausted );
+    else
+    {
+        /* open output file */
+        rc = KColumnFileCreate ( & pb . f, & pb . fmd5, self -> dir, self -> md5,
+                                 kcmInit | kcmParents, false, "md/cur.tmp" );
+        /* ZZZZ do we need a "KMD5FileReset ( pb -> fmd5 )" ? I don't think so */
+        if ( rc == 0 )
+        {
+            /* write header */
+            KDBHdr *hdr = ( KDBHdr* ) pb . buffer;
+            hdr -> endian = eByteOrderTag;
+            hdr -> version = KMETADATAVERS;
+            pb . marker = sizeof * hdr;
+
+            /* persist root node */
+            rc = BSTreePersist ( & self -> root -> child, NULL,
+                KMDWriteFunc, & pb, KMDataNodeAuxFunc, NULL );
+            if ( rc == 0 && pb . marker != 0 )
+            {
+                size_t num_flushed;
+                rc = KFileWrite ( pb . f, pb . pos,
+                                  pb . buffer, pb . marker, & num_flushed );
+                if ( rc == 0 && num_flushed != pb . marker )
+                    rc = RC ( rcDB, rcMetadata, rcPersisting, rcTransfer, rcIncomplete );
+            }
+            pb . rc = KFileRelease ( pb . f );
+            if ( pb . rc  ==  0 )
+                pb . fmd5 = NULL;
+            if ( rc == 0 && ( rc = pb . rc ) == 0 )
+            {
+                /* rename file */
+                rc = KDirectoryRename ( self -> dir, true, "md/cur.tmp", "md/cur" );
+
+                if ( self->md5 != NULL && rc == 0 )
+                    rc = KMD5SumFmtRename ( self -> md5, "md/cur.tmp", "md/cur" );
+
+                if ( rc == 0 )
+                    self -> dirty = false;
+            }
+        }
+
+        free ( pb . buffer );
+    }
+    return rc;
+}
+
+/* Whack
+ */
+static
+rc_t KMetadataWhack ( KMetadata *self )
+{
+    rc_t rc = 0;
+    KSymbol * symb;
+    KDBManager *mgr = self -> mgr;
+    assert ( mgr != NULL );
+
+    KRefcountWhack ( & self -> refcount, "KMetadata" );
+
+    if ( self -> dirty )
+    {
+        /* if this was a version 1 file,
+           first freeze it */
+        if ( self -> vers == 1 )
+        {
+            rc = KMetadataFreeze ( self );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        /* flush it */
+        rc = KMetadataFlush ( self );
+        if ( rc != 0 )
+            return rc;
+        self -> dirty = false;
+    }
+
+    if ( self -> db != NULL )
+    {
+        rc = KDatabaseSever ( self -> db );
+        if ( rc != 0 )
+            return rc;
+        self -> db = NULL;
+    }
+    else if ( self -> tbl != NULL )
+    {
+        rc = KTableSever ( self -> tbl );
+        if ( rc != 0 )
+            return rc;
+        self -> tbl = NULL;
+    }
+    else if ( self -> col != NULL )
+    {
+        rc = KColumnSever ( self -> col );
+        if ( rc != 0 )
+            return rc;
+        self -> col = NULL;
+    }
+
+    if ( self -> md5 != NULL )
+    {
+	rc = KMD5SumFmtRelease ( self -> md5 );
+	if ( rc != 0 )
+	    return rc;
+	self -> md5 = NULL;
+    }
+
+    /* remove from mgr */
+    symb = KDBManagerOpenObjectFind (mgr, self->path);
+    if (symb != NULL)
+    {
+        rc = KDBManagerOpenObjectDelete (mgr, symb);
+        if (rc == 0)
+        {
+            /* release manager
+               should never fail */
+            rc = KDBManagerSever ( mgr );
+            if ( rc != 0 )
+                KDBManagerOpenObjectAdd (mgr, symb);
+            else
+            {
+                /* complete */
+                KDirectoryRelease ( self -> dir );
+                atomic32_set ( & self -> refcount, 0 );
+                KMDataNodeWhack ( & self -> root -> n, NULL );
+                free ( self );
+                return 0;
+            }
+        }
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "KMetadata", "whack", "kmeta" );
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KMetadataAddRef ( const KMetadata *cself )
+{
+    KMetadata *self = ( KMetadata* ) cself;
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KMetadata" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcMetadata, rcAttaching, rcRange, rcExcessive );
+        }
+        ++ self -> opencount;
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KMetadataRelease ( const KMetadata *cself )
+{
+    KMetadata *self = ( KMetadata* ) cself;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KMetadata" ) )
+        {
+        case krefWhack:
+            return KMetadataWhack ( ( KMetadata* ) self );
+        case krefLimit:
+            return RC ( rcDB, rcMetadata, rcReleasing, rcRange, rcExcessive );
+        }
+        -- self -> opencount;
+    }
+    return 0;
+}
+
+static
+KMetadata *KMetadataAttach ( const KMetadata *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KMetadata" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KMetadata* ) self;
+}
+
+static
+rc_t KMetadataSever ( const KMetadata *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KMetadata" ) )
+        {
+        case krefWhack:
+            return KMetadataWhack ( ( KMetadata* ) self );
+        case krefLimit:
+            return RC ( rcDB, rcMetadata, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Make
+ */
+
+static
+rc_t KMetadataPopulate ( KMetadata *self, const KDirectory *dir, const char *path, bool read_only )
+{
+    const KFile *f;
+    rc_t rc = KDirectoryOpenFileRead ( dir, & f, "%s", path );
+    if ( rc == 0 )
+    {
+        const KMMap *mm;
+        rc = KMMapMakeRead ( & mm, f );
+        if ( rc == 0 )
+        {
+            size_t size;
+            const void *addr;
+            rc = KMMapSize ( mm, & size );
+            if ( rc == 0 )
+                rc = KMMapAddrRead ( mm, & addr );
+
+            if ( rc == 0 )
+            {
+                union
+                {
+                    KDBHdr v1;
+                    KDBHdr v2;
+                } hdrs;
+
+                const KDBHdr *hdr = ( const KDBHdr* ) addr;
+                const void *pbstree_src = hdr + 1;
+
+                rc = KDBHdrValidate ( hdr, size, 1, KMETADATAVERS );
+                if ( self -> read_only && GetRCState ( rc ) == rcIncorrect && GetRCObject ( rc ) == rcByteOrder )
+                {
+                    hdrs . v1 . endian = bswap_32 ( hdr -> endian );
+                    hdrs . v1 . version = bswap_32 ( hdr -> version );
+                    rc = KDBHdrValidate ( & hdrs . v1, size, 1, KMETADATAVERS );
+                    if ( rc == 0 )
+                    {
+                        self -> byteswap = true;
+                        switch ( hdrs . v1 . version )
+                        {
+                        case 1:
+                            hdr = & hdrs . v1;
+                            break;
+                        case 2:
+                            hdr = & hdrs . v2;
+                            break;
+                        }
+                    }
+                }
+                if ( rc == 0 )
+                {
+                    PBSTree *bst;
+                    rc = PBSTreeMake ( & bst, pbstree_src, size - sizeof * hdr, self -> byteswap );
+                    if ( rc != 0 )
+                        rc = RC ( rcDB, rcMetadata, rcConstructing, rcData, rcCorrupt );
+                    else
+                    {
+                        KMDataNodeInflateData pb;
+
+                        pb . meta = self;
+                        pb . par = self -> root;
+                        pb . bst = & self -> root -> child;
+                        pb . node_size_limit = read_only ? NODE_SIZE_LIMIT : 0;
+                        pb . node_child_limit = read_only ? NODE_CHILD_LIMIT : 0;
+                        pb . rc = 0;
+                        pb . byteswap = self -> byteswap;
+
+                        if ( hdr -> version == 1 )
+                            PBSTreeDoUntil ( bst, false, KMDataNodeInflate_v1, & pb );
+                        else
+                            PBSTreeDoUntil ( bst, false, KMDataNodeInflate, & pb );
+                        rc = pb . rc;
+
+                        self -> vers = hdr -> version;
+
+                        PBSTreeWhack ( bst );
+                    }
+                }
+            }
+
+            KMMapRelease ( mm );
+        }
+
+        KFileRelease ( f );
+    }
+    return rc;
+}
+
+
+static
+rc_t KDBManagerInsertMetadata ( KDBManager * self, KMetadata * meta )
+{
+    rc_t rc;
+    rc = KDBManagerOpenObjectAdd (self, &meta->sym);
+    if ( rc == 0 )
+        meta -> mgr = KDBManagerAttach ( self );
+    return rc;
+}
+
+
+static
+rc_t KMetadataMake ( KMetadata **metap,
+    KDirectory *dir, const char *path, uint32_t rev,
+    bool populate, bool read_only )
+{
+    rc_t rc;
+    KMetadata *meta = malloc ( sizeof * meta + strlen ( path ) );
+    if ( meta == NULL )
+        rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        memset ( meta, 0, sizeof * meta );
+        meta -> root = calloc ( 1, sizeof * meta -> root );
+        if ( meta -> root == NULL )
+            rc = RC ( rcDB, rcMetadata, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            meta -> root -> meta = meta;
+            meta -> dir = dir;
+            KRefcountInit ( & meta -> refcount, 1, "KMetadata", "make-update", path );
+            meta -> opencount = 1;
+            meta -> rev = rev;
+            meta -> read_only = read_only;
+
+            strcpy ( meta -> path, path );
+
+            meta->sym.u.obj = meta;
+            StringInitCString (&meta->sym.name, meta->path);
+            meta->sym.type = kptMetadata;
+
+            KRefcountInit ( & meta -> root -> refcount, 0, "KMDataNode", "make-read", "/" );
+
+            if ( ! populate )
+            {
+                meta -> vers = KMETADATAVERS;
+                KDirectoryAddRef ( dir );
+                * metap = meta;
+                return 0;
+            }
+            
+            rc = KMetadataPopulate ( meta, dir, path, read_only );
+            if ( rc == 0 )
+            {
+                KDirectoryAddRef ( dir );
+                * metap = meta;
+                return 0;
+            }
+
+            free ( meta -> root );
+        }
+
+        free ( meta );
+    }
+    * metap = NULL;
+    return rc;
+}
+
+#if 0
+static
+rc_t KMetadataMakeRead ( KMetadata **meta,
+    const KDirectory *dir, const char *path, uint32_t rev )
+{
+    rc_t rc = KMetadataMakeUpdate ( meta,
+        ( KDirectory* ) dir, path, rev, true );
+    if ( rc == 0 )
+        ( * meta ) -> read_only = true;
+    return rc;
+}
+#endif
+
+
+/* OpenMetadataRead
+ *  opens metadata for read
+ *
+ *  "meta" [ OUT ] - return parameter for metadata
+ */
+static
+rc_t KDBManagerOpenMetadataReadInt ( KDBManager *self,
+    const KMetadata **metap, const KDirectory *wd, uint32_t rev, bool prerelease,bool *cached )
+{
+    char metapath [ 4096 ];
+    rc_t rc = ( prerelease == 1 ) ?
+        KDirectoryVResolvePath ( wd, true, metapath, sizeof metapath, "meta", NULL ):
+        ( ( rev == 0 ) ?
+          KDirectoryVResolvePath ( wd, true, metapath, sizeof metapath, "md/cur", NULL ):
+          KDirectoryResolvePath ( wd, true, metapath, sizeof metapath, "md/r%.3u", rev ) );
+    if(cached != NULL ) *cached = false;
+    if ( rc == 0 )
+    {
+        KMetadata * meta;
+        KSymbol * sym;
+
+        /* if already open */
+        sym = KDBManagerOpenObjectFind (self, metapath);
+        if (sym != NULL)
+        {
+            const KMetadata * cmeta;
+            rc_t obj;
+
+	    if(cached != NULL ) *cached = true;
+            switch (sym->type)
+            {
+            case kptMetadata:
+                cmeta = (KMetadata*)sym->u.obj;
+                /* if open for update, refuse */
+                if ( cmeta -> read_only )
+                {
+                    /* attach a new reference and we're gone */
+                    rc = KMetadataAddRef ( cmeta );
+                    if ( rc == 0 )
+                        * metap = cmeta;
+                    return rc;
+                }
+                obj = rcMetadata;
+                break;
+
+            default:
+                obj = rcPath;
+                break;
+            case kptTable:
+                obj = rcTable;
+                break;
+            case kptColumn:
+                obj = rcColumn;
+                break;
+            case kptIndex:
+                obj = rcIndex;
+                break;
+            case kptDatabase:
+                obj = rcDatabase;
+                break;
+            }
+            return  RC (rcDB, rcMgr, rcOpening, obj, rcBusy);
+	}
+
+
+        switch ( KDirectoryPathType ( wd, "%s", metapath ) )
+        {
+        case kptNotFound:
+            rc = RC ( rcDB, rcMgr, rcOpening, rcMetadata, rcNotFound );
+            break;
+        case kptBadPath:
+            rc = RC ( rcDB, rcMgr, rcOpening, rcPath, rcInvalid );
+            break;
+        case kptFile:
+        case kptFile | kptAlias:
+            break;
+        default:
+            rc = RC ( rcDB, rcMgr, rcOpening, rcPath, rcIncorrect );
+            break;
+        }
+
+        if ( rc == 0 )
+        {
+            rc = KMetadataMake ( & meta, ( KDirectory* ) wd, metapath, rev, true, true );
+            
+            if ( rc == 0 )
+            {
+                rc = KDBManagerInsertMetadata (self, meta );
+                if ( rc == 0 )
+                {
+                    * metap = meta;
+                    return 0;
+                }
+
+                KMetadataRelease ( meta );
+            }
+
+/*             rc = RC ( rcDB, rcMgr, rcOpening, rcMetadata, rcExists ); */
+        }
+    }
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenMetadataRead ( const KDatabase *self, const KMetadata **metap )
+{
+    rc_t rc;
+    const KMetadata *meta;
+    bool  meta_is_cached;
+
+    if ( metap == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * metap = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    rc = KDBManagerOpenMetadataReadInt ( self -> mgr, & meta, self -> dir, 0, false, &meta_is_cached );
+    if ( rc == 0 )
+    {
+        if(!meta_is_cached) ((KMetadata*)meta) -> db = KDatabaseAttach ( self );
+        * metap = meta;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableOpenMetadataRead ( const KTable *self, const KMetadata **metap )
+{
+    rc_t rc;
+    const KMetadata *meta;
+    bool  meta_is_cached;
+
+    if ( metap == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcParam, rcNull );
+
+    * metap = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcSelf, rcNull );
+
+    rc = KDBManagerOpenMetadataReadInt ( self -> mgr, & meta, self -> dir, 0, self -> prerelease, &meta_is_cached );
+    if ( rc == 0 )
+    {
+        if(!meta_is_cached) ((KMetadata*)meta) -> tbl = KTableAttach ( self );
+        * metap = meta;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnOpenMetadataRead ( const KColumn *self, const KMetadata **metap )
+{
+    rc_t rc;
+    const KMetadata *meta;
+    bool  meta_is_cached;
+
+    if ( metap == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcParam, rcNull );
+
+    * metap = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcSelf, rcNull );
+
+    rc = KDBManagerOpenMetadataReadInt ( self -> mgr, & meta, self -> dir, 0, false, &meta_is_cached );
+    if ( rc == 0 )
+    {
+        if(!meta_is_cached) ((KMetadata*)meta) -> col = KColumnAttach ( self );
+        * metap = meta;
+    }
+
+    return rc;
+}
+
+/* OpenMetadataUpdate
+ *  open metadata for read/write
+ *
+ *  "meta" [ OUT ] - return parameter for metadata
+ */
+static
+rc_t KDBManagerOpenMetadataUpdateInt ( KDBManager *self,
+    KMetadata **metap, KDirectory *wd, KMD5SumFmt * md5 )
+{
+/* WAK
+ * NEEDS MD5 UPDATE???
+ */
+    char metapath [ 4096 ];
+    rc_t rc = KDirectoryResolvePath ( wd, true,
+        metapath, sizeof metapath, "md/cur" );
+    if ( rc == 0 )
+    {
+        KSymbol * sym;
+        KMetadata *meta;
+        bool populate = true;
+
+        switch ( KDirectoryPathType ( wd, "%s", metapath ) )
+        {
+        case kptNotFound:
+            populate = false;
+            break;
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcInvalid );
+        case kptFile:
+        case kptFile | kptAlias:
+            break;
+        default:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcIncorrect );
+        }
+
+        /* if already open */
+        sym = KDBManagerOpenObjectFind (self, metapath);
+        if (sym != NULL)
+        {
+            rc_t obj;
+            switch (sym->type)
+            {
+            default:
+                obj = rcPath;
+                break;
+            case kptDatabase:
+                obj = rcDatabase;
+                break;
+            case kptTable:
+                obj = rcTable;
+                break;
+            case kptColumn:
+                obj = rcColumn;
+                break;
+            case kptIndex:
+                obj = rcIndex;
+                break;
+            case kptMetadata:
+                obj = rcMetadata;
+                break;
+            }
+            return RC ( rcDB, rcMgr, rcOpening, obj, rcBusy );
+        }
+
+        rc = KMetadataMake ( & meta, wd, metapath, 0, populate, false );
+        if ( rc == 0 )
+        {
+            rc = KDBManagerInsertMetadata (self, meta);
+            if (rc == 0)
+            {
+                if ( md5 != NULL )
+                {
+                    meta -> md5 = md5;
+                    rc = KMD5SumFmtAddRef ( md5 );
+                }
+
+                if ( rc == 0 )
+                {
+                    * metap = meta;
+                    return 0;
+                }
+            }
+
+            KMetadataRelease ( meta );
+        }
+    }
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenMetadataUpdate ( KDatabase *self, KMetadata **metap )
+{
+    rc_t rc;
+    KMetadata *meta;
+
+    if ( metap == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * metap = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcDatabase, rcOpening, rcDatabase, rcReadonly );
+
+    rc = KDBManagerOpenMetadataUpdateInt ( self -> mgr, & meta, self -> dir, self -> md5 );
+    if ( rc == 0 )
+    {
+        meta -> db = KDatabaseAttach ( self );
+        * metap = meta;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableOpenMetadataUpdate ( KTable *self, KMetadata **metap )
+{
+    rc_t rc;
+    KMetadata *meta;
+
+    if ( metap == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcParam, rcNull );
+
+    * metap = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcOpening, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcTable, rcOpening, rcTable, rcReadonly );
+
+    rc = KDBManagerOpenMetadataUpdateInt ( self -> mgr, & meta, self -> dir, self -> md5 );
+    if ( rc == 0 )
+    {
+        meta -> tbl = KTableAttach ( self );
+        * metap = meta;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KColumnOpenMetadataUpdate ( KColumn *self, KMetadata **metap )
+{
+    rc_t rc;
+    KMetadata *meta;
+
+    if ( metap == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcParam, rcNull );
+
+    * metap = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcColumn, rcOpening, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcColumn, rcOpening, rcColumn, rcReadonly );
+
+    rc = KDBManagerOpenMetadataUpdateInt ( self -> mgr, & meta, self -> dir, self -> md5 );
+    if ( rc == 0 )
+    {
+        meta -> col = KColumnAttach ( self );
+        * metap = meta;
+    }
+
+    return rc;
+}
+
+
+/* Version
+ *  returns the metadata format version
+ */
+LIB_EXPORT rc_t CC KMetadataVersion ( const KMetadata *self, uint32_t *version )
+{
+    if ( version == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * version = 0;
+        return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+    }
+
+    * version = self -> vers;
+    return 0;
+}
+
+
+/* ByteOrder
+ *  indicates whether original byte order is reversed
+ *  under current architecture.
+ *
+ *  the byte order of the column is established by
+ *  the host architecture when created.
+ *
+ *  "reversed" [ OUT ] - if true, the original byte
+ *  order is reversed with regard to host native byte order.
+ */
+LIB_EXPORT rc_t CC KMetadataByteOrder ( const KMetadata *self, bool *reversed )
+{
+    if ( reversed == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * reversed = false;
+        return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+    }
+
+    * reversed = self -> byteswap;
+    return 0;
+}
+
+
+/* Revision
+ *  returns current revision number
+ *  where 0 ( zero ) means tip
+ */
+LIB_EXPORT rc_t CC KMetadataRevision ( const KMetadata *self, uint32_t *revision )
+{
+    if ( revision == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+
+    if ( self == NULL )
+    {
+        * revision = 0;
+        return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+    }
+
+    * revision = self -> rev;
+    return 0;
+}
+
+
+/* MaxRevision
+ *  returns the maximum revision available
+ */
+LIB_EXPORT rc_t CC KMetadataMaxRevision ( const KMetadata *self, uint32_t *revision )
+{
+    rc_t rc;
+    KNamelist *listing;
+
+    if ( revision == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+
+    * revision = 0;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+
+    rc = KDirectoryList ( self -> dir,
+        & listing, NULL, NULL, "md" );
+    if ( rc == 0 )
+    {
+        uint32_t rev_max, count;
+        rc = KNamelistCount ( listing, & count );
+        if ( rc == 0 )
+        {
+            uint32_t idx;
+            for ( rev_max = idx = 0; idx < count; ++ idx )
+            {
+                const char *name;
+                    
+                rc = KNamelistGet ( listing, idx, & name );
+                if ( rc != 0 )
+                    break;
+                    
+                if ( name [ 0 ] == 'r' )
+                {
+                    char *end;
+                    uint32_t rev = strtou32 ( name + 1, & end, 10 );
+                    if ( end [ 0 ] == 0 && rev > rev_max )
+                        rev_max = rev;
+                }
+            }
+
+            * revision = rev_max;
+        }
+                
+        KNamelistRelease ( listing );
+    }
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {
+        rc = 0;
+    }
+
+    return rc;
+}
+
+
+/* Commit
+ *  ensure any changes are committed to disk
+ */
+LIB_EXPORT rc_t CC KMetadataCommit ( KMetadata *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMetadata, rcCommitting, rcSelf, rcNull );
+
+    /* only flush if dirty */
+    if ( ! self -> dirty )
+        return 0;
+
+    /* if this was a version 1 file,
+       first freeze it */
+    if ( self -> vers == 1 )
+    {
+        rc = KMetadataFreeze ( self );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* flush it */
+    rc = KMetadataFlush ( self );
+    if ( rc == 0 )
+        self -> dirty = false;
+
+    return rc;
+}
+
+
+/* Freeze
+ *  freezes current metadata revision
+ *  further modification will begin on a copy
+ */
+LIB_EXPORT rc_t CC KMetadataFreeze ( KMetadata *self )
+{
+    rc_t rc;
+    uint32_t rev_max;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMetadata, rcFreezing, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcMetadata, rcFreezing, rcMetadata, rcReadonly );
+
+    switch ( KDirectoryVPathType ( self -> dir, "md/cur", NULL ) )
+    {
+    case kptFile:
+        break;
+    case kptFile | kptAlias:
+        return 0;
+    default:
+        return RC ( rcDB, rcMetadata, rcFreezing, rcPath, rcInvalid );
+    }
+
+    /* find max revision */
+    rc = KMetadataMaxRevision ( self, & rev_max );
+    if ( rc == 0 )
+    {
+        int len;
+        char revision [ 16 ];	/* nice even stack (could have been 8) */
+
+        /* rename tip to new version */
+        len = snprintf ( revision, sizeof revision, "md/r%.3u", rev_max + 1 );
+        if ( len < 0 || len >= sizeof revision )
+            return RC ( rcDB, rcMetadata, rcFreezing, rcPath, rcInvalid );
+
+        rc = KDirectoryRename ( self -> dir, false, "md/cur", revision );
+        if ( rc == 0 )
+        {
+            /* now create link to this guy */
+            rc = KDirectoryCreateAlias ( self -> dir,
+                0777, kcmCreate, revision, "md/cur" );
+
+            if ( rc == 0 )
+            {
+                if ( self -> md5 != NULL )
+                {
+                    rc = KMD5SumFmtRename ( self -> md5, "md/cur", revision );
+                    if ( rc != 0 )	/* attempt to recover */
+                        KDirectoryRemove ( self -> dir, false, "md/cur" );
+                }
+            }
+            if ( rc != 0 )                /* attempt to recover */
+                KDirectoryRename ( self -> dir, false, revision, "md/cur" );
+        }
+    }
+        
+    return rc;
+}
+
+
+/* OpenRevision
+ *  opens a read-only indexed revision of metadata
+ */
+LIB_EXPORT rc_t CC KMetadataOpenRevision ( const KMetadata *self,
+    const KMetadata **metap, uint32_t revision )
+{
+    rc_t rc;
+    const KMetadata *meta;
+    bool  meta_is_cached;
+
+    if ( metap == NULL )
+        return RC ( rcDB, rcMetadata, rcOpening, rcParam, rcNull );
+
+    * metap = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMetadata, rcOpening, rcSelf, rcNull );
+
+    rc = KDBManagerOpenMetadataReadInt ( self -> mgr,
+        & meta, self -> dir, revision, false, &meta_is_cached  );
+    if ( rc == 0 )
+    {
+        if(!meta_is_cached)
+	{
+	    if ( self -> db != NULL )
+                ((KMetadata*)meta) -> db = KDatabaseAttach ( self -> db );
+            else if ( self -> tbl != NULL )
+                ((KMetadata*)meta) -> tbl = KTableAttach ( self -> tbl );
+            else if ( self -> col != NULL )
+                ((KMetadata*)meta) -> col = KColumnAttach ( self -> col );
+	}
+
+        * metap = meta;
+    }
+
+    return rc;
+}
+
+
+/* GetSequence
+ * SetSequence
+ * NextSequence
+ *  access a named sequence
+ *
+ *  "seq" [ IN ] - NUL terminated sequence name
+ *
+ *  "val" [ OUT ] - return parameter for sequence value
+ *  "val" [ IN ] - new sequence value
+ */
+LIB_EXPORT rc_t CC KMetadataGetSequence ( const KMetadata *self,
+    const char *seq, int64_t *val )
+{
+    rc_t rc;
+    const KMDataNode *found;
+
+    if ( val == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcParam, rcNull );
+    * val = 0;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcSelf, rcNull );
+    if ( seq == NULL )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcPath, rcNull );
+    if ( seq [ 0 ] == 0 )
+        return RC ( rcDB, rcMetadata, rcAccessing, rcPath, rcInvalid );
+
+    rc = KMDataNodeOpenNodeRead ( self -> root, & found, ".seq/%s", seq );
+    if ( rc == 0 )
+    {
+        rc = KMDataNodeReadB64 ( found, val );
+        KMDataNodeRelease ( found );
+    }
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMetadataSetSequence ( KMetadata *self,
+    const char *seq, int64_t val )
+{
+    rc_t rc;
+    KMDataNode *found;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMetadata, rcUpdating, rcSelf, rcNull );
+    if ( seq == NULL )
+        return RC ( rcDB, rcMetadata, rcUpdating, rcPath, rcNull );
+    if ( seq [ 0 ] == 0 )
+        return RC ( rcDB, rcMetadata, rcUpdating, rcPath, rcInvalid );
+
+    rc = KMDataNodeOpenNodeUpdate ( self -> root, & found, ".seq/%s", seq );
+    if ( rc == 0 )
+    {
+        rc = KMDataNodeWriteB64 ( found, & val );
+        KMDataNodeRelease ( found );
+    }
+        
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMetadataNextSequence ( KMetadata *self,
+    const char *seq, int64_t *val )
+{
+    rc_t rc;
+    KMDataNode *found;
+
+    if ( val == NULL )
+        return RC ( rcDB, rcMetadata, rcUpdating, rcParam, rcNull );
+    * val = 0;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMetadata, rcUpdating, rcSelf, rcNull );
+    if ( seq == NULL )
+        return RC ( rcDB, rcMetadata, rcUpdating, rcPath, rcNull );
+    if ( seq [ 0 ] == 0 )
+        return RC ( rcDB, rcMetadata, rcUpdating, rcPath, rcInvalid );
+
+    rc = KMDataNodeOpenNodeUpdate ( self -> root, & found, ".seq/%s", seq );
+    if ( rc == 0 )
+    {
+        rc = KMDataNodeReadB64 ( found, val );
+        if ( rc == 0 || GetRCState ( rc ) == rcIncomplete )
+        {
+            * val += 1;
+            rc = KMDataNodeWriteB64 ( found, val );
+        }
+
+        KMDataNodeRelease ( found );
+    }
+
+    return rc;
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * KNamelist
+ */
+typedef struct KMDataNodeNamelist KMDataNodeNamelist;
+struct KMDataNodeNamelist
+{
+    KNamelist dad;
+    const KMDataNode *node;
+    size_t count;
+    const char *namelist [ 1 ];
+};
+
+/* Whack
+ */
+static
+rc_t CC KMDataNodeNamelistWhack ( KMDataNodeNamelist *self )
+{
+    rc_t rc = KMDataNodeRelease ( self -> node );
+    if ( rc == 0 )
+        free ( self );
+    return rc;
+}
+
+/* Count
+ */
+static
+rc_t CC KMDataNodeNamelistCount ( const KMDataNodeNamelist *self, uint32_t *count )
+{
+    * count = ( uint32_t ) self -> count;
+    return 0;
+}
+
+/* Get
+ */
+static
+rc_t CC KMDataNodeNamelistGet ( const KMDataNodeNamelist *self,
+    uint32_t idx, const char **name )
+{
+    if ( ( size_t ) idx >= self -> count )
+        return RC ( rcDB, rcNamelist, rcAccessing, rcParam, rcExcessive );
+    * name = self -> namelist [ idx ];
+    return 0;
+}
+
+/* Make
+ */
+static KNamelist_vt_v1 vtKMDataNodeNamelist =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* start minor version 0 methods */
+    KMDataNodeNamelistWhack,
+    KMDataNodeNamelistCount,
+    KMDataNodeNamelistGet
+    /* end minor version 0 methods */
+};
+
+static
+rc_t KMDataNodeNamelistMake ( KNamelist **names, unsigned int count )
+{
+    rc_t rc;
+    KMDataNodeNamelist *self = calloc ( 1, sizeof * self -
+        sizeof self -> namelist + count * sizeof self -> namelist [ 0 ] );
+    if ( self == NULL )
+        rc = RC ( rcDB, rcNamelist, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KNamelistInit ( & self -> dad,
+            ( const KNamelist_vt* ) & vtKMDataNodeNamelist );
+        if ( rc == 0 )
+        {
+            * names = & self -> dad;
+            return 0;
+        }
+        
+        free ( self );
+    }
+
+    return rc;
+}
+
+/* List
+ *  create metadata node listings
+ */
+static
+void CC KMDataNodeListCount ( BSTNode *n, void *data )
+{
+    * ( unsigned int* ) data += 1;
+}
+
+static
+void CC KMDataNodeGrabAttr ( BSTNode *n, void *data )
+{
+    KMDataNodeNamelist *list = data;
+    list -> namelist [ list -> count ++ ] = ( ( const KMAttrNode* ) n ) -> name;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeListAttr ( const KMDataNode *self, KNamelist **names )
+{
+    rc_t rc;
+    unsigned int count;
+
+    if ( names == NULL )
+        return RC ( rcDB, rcNode, rcListing, rcParam, rcNull );
+    * names = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcListing, rcSelf, rcNull );
+
+    count = 0;
+    BSTreeForEach ( & self -> attr, 0, KMDataNodeListCount, & count );
+
+    rc = KMDataNodeNamelistMake ( names, count );
+    if ( rc == 0 )
+        BSTreeForEach ( & self -> attr, false, KMDataNodeGrabAttr, * names );
+
+    return rc;
+}
+
+static
+void CC KMDataNodeGrabName ( BSTNode *n, void *data )
+{
+    KMDataNodeNamelist *list = data;
+    list -> namelist [ list -> count ++ ] = ( ( const KMDataNode* ) n ) -> name;
+}
+
+LIB_EXPORT rc_t CC KMDataNodeListChildren ( const KMDataNode *self, KNamelist **names )
+{
+    rc_t rc;
+    unsigned int count;
+
+    if ( names == NULL )
+        return RC ( rcDB, rcNode, rcListing, rcParam, rcNull );
+    * names = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcNode, rcListing, rcSelf, rcNull );
+
+    count = 0;
+    BSTreeForEach ( & self -> child, 0, KMDataNodeListCount, & count );
+
+    rc = KMDataNodeNamelistMake ( names, count );
+    if ( rc == 0 )
+        BSTreeForEach ( & self -> child, false, KMDataNodeGrabName, * names );
+
+    return rc;
+}
diff --git a/libs/kdb/wtable-priv.h b/libs/kdb/wtable-priv.h
new file mode 100644
index 0000000..cda3fa5
--- /dev/null
+++ b/libs/kdb/wtable-priv.h
@@ -0,0 +1,106 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_table_priv_
+#define _h_table_priv_
+
+#ifndef _h_kdb_table_
+#include <kdb/table.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#include <klib/symbol.h>
+#include <kfs/md5.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDatabase;
+struct KDBManager;
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * KTable
+ *  represents a table
+ *  normally implemented as a directory
+ *  but may be a single archive file
+ *  in either executable or streamable format
+ */
+struct KTable
+{
+    struct KDirectory *dir;
+    struct KDBManager *mgr;
+    struct KDatabase *db;
+    struct KMD5SumFmt *md5;
+
+    KRefcount refcount;
+    uint32_t opencount;
+    bool use_md5;
+    bool read_only;
+    bool prerelease;
+    uint8_t align [ 5 ];
+
+    KSymbol sym;
+
+    char path [ 1 ];
+};
+
+/* Attach
+ * Sever
+ *  like KTableRelease, except called internally
+ *  indicates that a child object is letting go...
+ */
+KTable *KTableAttach ( const KTable *self );
+rc_t KTableSever ( const KTable *self );
+
+/* Cmp
+ * Sort
+ */
+int KTableCmp ( const void *item, const BSTNode *n );
+int KTableSort ( const BSTNode *item, const BSTNode *n );
+
+/* check a disk-resident column for needing re-indexing */
+bool KTableColumnNeedsReindex ( KTable *self, const char *colname );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_table_priv_ */
diff --git a/libs/kdb/wtable.c b/libs/kdb/wtable.c
new file mode 100644
index 0000000..5bb6f87
--- /dev/null
+++ b/libs/kdb/wtable.c
@@ -0,0 +1,1641 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+#include <kdb/extern.h>
+#include "wtable-priv.h"
+#include "dbmgr-priv.h"
+#include "database-priv.h"
+#include "wcolumn-priv.h"
+#include "windex-priv.h"
+#include "wkdb-priv.h"
+
+#include <klib/namelist.h>
+#include <klib/symbol.h>
+#include <kdb/namelist.h>
+#include <klib/log.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kfs/impl.h>
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* keep file system structure compatible with v0 code */
+#define V0_BACKWARD_COMPAT 0
+
+/*--------------------------------------------------------------------------
+ * KTable
+ *  a collection of columns indexed by row id, metadata, indices
+ */
+
+/* GetPath
+ *  return the absolute path to table
+ */
+LIB_EXPORT rc_t CC KTableGetPath ( const KTable *self,
+    const char **path )
+{
+    if ( self == NULL )
+        return RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+    if ( path == NULL )
+        return RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+
+    *path = self->path;
+
+    return 0;
+}
+
+/* Whack
+ */
+static
+rc_t KTableWhack ( KTable *self )
+{
+    rc_t rc = 0;
+    KDBManager *mgr = self -> mgr;
+    KSymbol * symb;
+    assert ( mgr != NULL );
+
+    KRefcountWhack ( & self -> refcount, "KTable" );
+
+    if ( self -> db != NULL )
+    {
+        rc = KDatabaseSever ( self -> db );
+        if ( rc != 0 )
+            return rc;
+        self -> db = NULL;
+    }
+
+    /* shut down md5 sum file if it is open */
+    KMD5SumFmtRelease ( self -> md5 ), self -> md5 = NULL;
+
+    /* remove from mgr */
+    symb = KDBManagerOpenObjectFind (mgr, self->path);
+    if (symb != NULL)
+    {
+        rc = KDBManagerOpenObjectDelete (mgr, symb);
+        if (rc == 0)
+        {
+            rc = KDBManagerSever ( mgr );
+            if ( rc != 0 )
+                rc = KDBManagerOpenObjectAdd (mgr, symb);
+            else
+            {
+                /* complete */
+                KDirectoryRelease ( self -> dir );
+                free ( self );
+                return 0;
+            }
+        }
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "KTable", "whack", "ktbl" );
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KTableAddRef ( const KTable *cself )
+{
+    KTable *self = ( KTable* ) cself;
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KTable" ) )
+        {
+        case krefLimit:
+            return RC ( rcDB, rcTable, rcAttaching, rcRange, rcExcessive );
+        }
+        ++ self -> opencount;
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KTableRelease ( const KTable *cself )
+{
+    KTable *self = ( KTable* ) cself;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KTable" ) )
+        {
+        case krefWhack:
+            return KTableWhack ( ( KTable* ) self );
+        case krefLimit:
+            return RC ( rcDB, rcTable, rcReleasing, rcRange, rcExcessive );
+        }
+        -- self -> opencount;
+    }
+    return 0;
+}
+
+
+/* Attach
+ * Sever
+ */
+KTable *KTableAttach ( const KTable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KTable" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KTable* ) self;
+}
+
+/* Sever
+ *  like KTableRelease, except called internally
+ *  indicates that a child object is letting go...
+ */
+rc_t KTableSever ( const KTable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KTable" ) )
+        {
+        case krefWhack:
+            assert ( self -> opencount == 0 );
+            return KTableWhack ( ( KTable* ) self );
+        case krefLimit:
+            return RC ( rcDB, rcTable, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make
+ *  make an initialized structure
+ *  NB - does NOT attach reference to dir, but steals it
+ */
+static
+rc_t KTableMake ( KTable **tblp, const KDirectory *dir, const char *path,
+		  KMD5SumFmt * md5, bool read_only )
+{
+    KTable *tbl;
+
+    assert ( tblp != NULL );
+    assert ( path != NULL );
+
+    tbl = malloc ( sizeof * tbl + strlen ( path ) );
+    if ( tbl == NULL )
+    {
+        * tblp = NULL;
+        return RC ( rcDB, rcTable, rcConstructing, rcMemory, rcExhausted );
+    }
+
+    memset ( tbl, 0, sizeof * tbl );
+    tbl -> dir = ( KDirectory* ) dir;
+    KRefcountInit ( & tbl -> refcount, 1, "KTable", "make", path );
+    tbl -> opencount = 1;
+    tbl -> md5 = md5;
+    KMD5SumFmtAddRef ( md5 );
+    tbl -> use_md5 = ( md5 == NULL ) ? false : true;
+    tbl -> read_only = read_only;
+    strcpy ( tbl -> path, path );
+
+    tbl->sym.u.obj = tbl;
+    StringInitCString (&tbl->sym.name, tbl->path);
+    tbl->sym.type = kptTable;
+
+    * tblp = tbl;
+    return 0;
+}
+
+static
+rc_t KDBManagerInsertTable ( KDBManager * self, KTable * tbl )
+{
+    rc_t rc;
+    rc = KDBManagerOpenObjectAdd (self, &tbl->sym);
+    if ( rc == 0 )
+        tbl -> mgr = KDBManagerAttach ( self );
+    return rc;
+}
+
+
+static
+rc_t KDBManagerMakeTableUpdate ( KDBManager *self,
+    KTable **tblp, KDirectory *wd, const char *path, bool convert, KMD5SumFmt * md5 )
+{
+    rc_t rc;
+    KDirectory *dir;
+
+    rc = KDirectoryOpenDirUpdate ( wd, & dir, false, "%s", path );
+    if ( rc == 0 )
+    {
+        KTable * tbl;
+
+        if ( convert )
+        {
+            /* the old table layout:
+               <tbl>/
+               col/...
+               meta
+               sealed
+               skey
+            */
+            rc = KDirectoryVSetAccess ( dir, true, 0220, 0222, ".", NULL );
+            if ( rc == 0 )
+                rc = KDirectoryVCreateDir ( dir, 0775, kcmCreate, "md", NULL );
+            if ( rc == 0 )
+            {
+                rc = KDirectoryRename ( dir, false, "meta", "md/r001" );
+                if ( GetRCState ( rc ) == rcNotFound )
+                    rc = 0;
+                else if ( rc == 0 )
+                {
+                    rc = KDirectoryCreateAlias ( dir, 0777, kcmCreate, "md/r001", "md/cur" );
+#if V0_BACKWARD_COMPAT
+                    if ( rc == 0 )
+                        rc = KDirectoryCreateAlias ( dir, 0777, kcmCreate, "md/r001", "meta" );
+#endif
+                    if( rc == 0 ) {
+                        KFile* md5_file = NULL;
+                        if( (rc = KDirectoryOpenFileWrite(dir, &md5_file, true, "md5")) == 0 ) {
+                            KMD5SumFmt* fmd5 = NULL;
+                            if( (rc = KMD5SumFmtMakeUpdate(&fmd5, md5_file)) == 0 ) {
+                                if( (rc = KMD5SumFmtRename(fmd5, "meta", "md/r001")) == 0 ) {
+                                    rc = KMD5SumFmtFlush(fmd5);
+                                }
+                                KMD5SumFmtRelease(fmd5);
+                            } else {
+                                KFileRelease(md5_file);
+                            }
+                        }
+                    }
+                }
+            }
+            if ( rc == 0 )
+                rc = KDirectoryVCreateDir ( dir, 0775, kcmCreate, "idx", NULL );
+            if ( rc == 0 )
+            {
+                rc = KDirectoryRename ( dir, false, "skey", "idx/skey" );
+                if ( GetRCState ( rc ) == rcNotFound )
+                    rc = 0;
+                else if ( rc == 0 )
+                {
+                    KDirectoryRename ( dir, false, "skey.md5", "idx/skey.md5" );
+#if V0_BACKWARD_COMPAT
+                    rc = KDirectoryCreateAlias ( dir, 0777, kcmCreate, "idx/skey", "skey" );
+#endif
+                }
+            }
+            if ( rc == 0 )
+            {
+                if ( KDirectoryVPathType ( dir, "sealed", NULL ) == kptFile )
+                {
+                    rc = KDBLockDir ( dir, "." );
+#if ! V0_BACKWARD_COMPAT
+                    if ( rc == 0 )
+                        KDirectoryVRemove ( dir, true, "sealed", NULL );
+#endif
+                }
+            }
+            
+            if ( rc != 0 )
+                return rc;
+        }
+
+        /* Make the base object */
+        rc = KTableMake ( & tbl, dir, path, md5, false );
+        if ( rc == 0 )
+        {
+            rc = KDBManagerInsertTable ( self, tbl );
+
+            if ( rc == 0 )
+            {
+                * tblp = tbl;
+                return 0;
+            }
+
+            rc = RC ( rcDB, rcMgr, rcOpening, rcTable, rcBusy );
+                
+            free ( tbl );
+        }
+            
+        KDirectoryRelease ( dir );
+    }
+
+    return rc;
+}
+
+
+/* CreateTable
+ * VCreateTable
+ *  create a new or open an existing table
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to table
+ */
+static
+rc_t KDBManagerVCreateTableInt ( KDBManager *self,
+    KTable **tbl, KDirectory *wd, KCreateMode cmode, const char *path, va_list args )
+{
+    char tblpath [ 4096 ];
+    rc_t rc = KDirectoryVResolvePath ( wd, true,
+        tblpath, sizeof tblpath, path, args );
+    if ( rc == 0 )
+    {
+        bool convert = false;
+        bool not_found = false;
+
+        switch ( KDBPathType ( /*NULL,*/ wd, NULL, tblpath ) )
+        {
+        case kptNotFound:
+            not_found = true;
+            /* first good path */
+            break;
+
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcCreating, rcPath, rcInvalid );
+
+        case kptTable:
+        case kptTable | kptAlias:
+            break;
+
+        case kptPrereleaseTbl:
+        case kptPrereleaseTbl | kptAlias:
+            convert = true;
+            break;
+
+        case kptDatabase:
+        case kptDatabase | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcDatabase, rcExists);
+
+        case kptColumn:
+        case kptColumn | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcColumn, rcExists);
+
+        case kptIndex:
+        case kptIndex | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcIndex, rcExists);
+
+        case kptMetadata:
+        case kptMetadata | kptAlias:
+            return RC (rcDB, rcMgr, rcCreating, rcMetadata, rcExists);
+
+        case kptFile:
+        case kptFile | kptAlias:
+            /* if we find a file, vary the failure if it is an archive that is a table
+             * or a non related file */
+            if (( KDBOpenPathTypeRead ( self, wd, tblpath, NULL, kptTable, NULL, false ) == 0 ) ||
+                ( KDBOpenPathTypeRead ( self, wd, tblpath, NULL, kptPrereleaseTbl, NULL, false ) == 0 ) )
+                return RC ( rcDB, rcMgr, rcCreating, rcTable, rcReadonly );
+            /* fall through */
+        default:
+            return RC ( rcDB, rcMgr, rcCreating, rcPath, rcIncorrect );
+        }
+
+        if (not_found == false)
+        {
+            /* found so is not good if we want to create new and not
+             * clear/init or open old
+             */
+            if ((cmode & kcmValueMask) == kcmCreate)
+                return RC ( rcDB, rcMgr, rcCreating, rcTable, rcExists );
+            if (KDBManagerOpenObjectBusy (self, tblpath))
+                return RC ( rcDB, rcMgr, rcCreating, rcTable, rcBusy );
+            /* test now for locked directory */
+            rc = KDBWritable ( wd, tblpath );
+            switch (GetRCState(rc))
+            {
+            default:
+                return rc;
+            case rcLocked:
+                return RC ( rcDB, rcMgr, rcCreating, rcTable, rcLocked );
+            case rcReadonly:
+                return RC ( rcDB, rcMgr, rcCreating, rcTable, rcReadonly );
+            case rcNotFound:
+                /* not found is good but probably unreachable */
+                break;
+            case 0:
+                break;
+            }
+        }
+
+        /* [re]create directory */
+        rc = KDirectoryCreateDir ( wd, 0775, cmode, "%s", tblpath );
+        if ( rc == 0 )
+        {
+            KMD5SumFmt *md5 = NULL;
+
+            /* create column sub-directory */
+            rc = KDirectoryCreateDir ( wd, 0775, kcmOpen, "%s/col", tblpath );
+            if ( rc == 0 && ( cmode & kcmMD5 ) != 0 )
+            {
+                KFile * f;
+
+                /* create the md5 digest file */
+                rc = KDirectoryCreateFile ( wd, &f, true, 0664, kcmOpen, "%s/md5", tblpath );
+                if ( rc == 0 )
+                {
+                    rc = KMD5SumFmtMakeUpdate ( & md5, f );
+                    if ( rc != 0 )
+                        KFileRelease ( f );
+                }
+            }
+            
+            if ( rc == 0 )
+                rc = KDBManagerMakeTableUpdate ( self, tbl, wd, tblpath, convert, md5 );
+
+            KMD5SumFmtRelease ( md5 );
+        }
+    }
+    return rc;
+}
+
+/* Default function is added only to make tools/kqsh build possible since
+   it requires 1 to 1 mapping between K- and V-functions
+*/
+
+LIB_EXPORT rc_t CC KDatabaseCreateTableDefault ( struct KDatabase *self,
+    KTable **tbl, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVCreateTableByMask ( self, tbl, 0, 0, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerCreateTable ( KDBManager *self,
+    KTable **tbl, KCreateMode cmode, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVCreateTable ( self, tbl, cmode, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerVCreateTable ( KDBManager *self,
+    KTable **tbl, KCreateMode cmode, const char *path, va_list args )
+{
+    if ( tbl == NULL )
+        return RC ( rcDB, rcMgr, rcCreating, rcParam, rcNull );
+
+    * tbl = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcCreating, rcSelf, rcNull );
+
+    return KDBManagerVCreateTableInt ( self, tbl, self -> wd, cmode, path, args );
+}
+
+LIB_EXPORT rc_t CC KDatabaseCreateTable ( KDatabase *self,
+    KTable **tbl, KCreateMode cmode, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVCreateTable ( self, tbl, cmode, name, args );
+    va_end ( args );
+
+    return rc;
+}
+LIB_EXPORT rc_t CC KDatabaseVCreateTable ( KDatabase *self,
+    KTable **tblp, KCreateMode cmode, const char *name, va_list args )
+{
+    return KDatabaseVCreateTableByMask ( self, tblp, cmode, -1, name, args );
+}
+
+LIB_EXPORT rc_t CC KDatabaseCreateTableByMask ( KDatabase *self,
+    KTable **tbl, KCreateMode cmode, KCreateMode cmode_mask, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVCreateTableByMask ( self, tbl, cmode, cmode_mask, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVCreateTableByMask ( KDatabase *self,
+    KTable **tblp, KCreateMode cmode, KCreateMode cmode_mask,
+    const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( tblp == NULL )
+        return RC ( rcDB, rcDatabase, rcCreating, rcParam, rcNull );
+
+    * tblp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcCreating, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcDatabase, rcCreating, rcDatabase, rcReadonly );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "tbl", 3, name, args );
+    if ( rc == 0 )
+    {
+        /* ensure that the "tbl" namespace directory is there */
+        rc = KDirectoryCreateDir ( self -> dir,
+            0775, kcmOpen, "tbl" );
+        if ( rc == 0 )
+        {
+            KCreateMode table_cmode;
+            /* fix mask */
+            if ( (cmode_mask & kcmValueMask) != 0 )
+                cmode_mask |= kcmValueMask;
+            table_cmode = (self->cmode & ~cmode_mask) | (cmode & cmode_mask);
+            rc = KDBManagerVCreateTableInt ( self -> mgr, tblp,
+                                             self -> dir, table_cmode, path, NULL );
+            if ( rc == 0 )
+            {
+                KTable *tbl = ( KTable* ) * tblp;
+                tbl -> db = KDatabaseAttach ( self );
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* OpenTableRead
+ * VOpenTableRead
+ *  open a table for read
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to table
+ */
+static
+rc_t KDBManagerVOpenTableReadInt ( const KDBManager *cself,
+    const KTable **tblp, const KDirectory *wd, bool try_srapath,
+    const char *path, va_list args )
+{
+    char key_path[ 4096 ];
+    char short_path[ 4096 ];
+	size_t z;
+	rc_t rc = string_vprintf( short_path, sizeof short_path, &z, path, args );
+	if ( rc == 0 )
+		rc = KDirectoryResolvePath ( wd, true, key_path, sizeof key_path, short_path );
+    if ( rc == 0 )
+    {
+        KSymbol *sym;
+        
+        /* if already open */
+        sym = KDBManagerOpenObjectFind( cself, key_path );
+        if (sym != NULL)
+        {
+            const KTable * ctbl;
+            rc_t obj;
+
+            switch (sym->type)
+            {
+            case kptTable:
+                ctbl = (KTable*)sym->u.obj;
+                /* if open for update, refuse */
+                if ( ctbl -> read_only )
+                {
+                    /* attach a new reference and we're gone */
+                    rc = KTableAddRef ( ctbl );
+                    if ( rc == 0 )
+                        * tblp = ctbl;
+                    return rc;
+                }
+                obj = rcTable;
+                break;
+                
+            default:
+                obj = rcPath;
+                break;
+            case kptDatabase:
+                obj = rcDatabase;
+                break;
+            case kptColumn:
+                obj = rcColumn;
+                break;
+            case kptIndex:
+                obj = rcIndex;
+                break;
+            case kptMetadata:
+                obj = rcMetadata;
+                break;
+            }
+            rc = RC (rcDB, rcMgr, rcOpening, obj, rcBusy);
+        }
+        else
+        {
+			KTable * tbl;
+			const KDirectory *dir;
+			bool prerelease = false;
+
+			rc = KDBOpenPathTypeRead ( cself, wd, short_path, &dir, kptTable, NULL, try_srapath );
+			if ( rc != 0 )
+			{
+				prerelease = true;
+				rc = KDBOpenPathTypeRead ( cself, wd, short_path, &dir, kptPrereleaseTbl, NULL, try_srapath );
+			}        
+			if ( rc == 0 )
+			{
+				rc = KTableMake ( & tbl, dir, key_path, NULL, true );
+				if ( rc == 0 )
+				{
+					KDBManager * self = (KDBManager *)cself;
+
+					rc = KDBManagerInsertTable( self, tbl );
+
+					if (rc == 0)
+					{
+						tbl -> prerelease = prerelease;
+						* tblp = tbl;
+						return 0;
+					}
+					free ( tbl );
+				}
+				KDirectoryRelease ( dir );
+			}
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerOpenTableRead ( const KDBManager *self,
+    const KTable **tbl, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVOpenTableRead ( self, tbl, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerVOpenTableRead ( const KDBManager *self,
+    const KTable **tbl, const char *path, va_list args )
+{
+    if ( tbl == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcParam, rcNull );
+
+    * tbl = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcSelf, rcNull );
+
+    return KDBManagerVOpenTableReadInt ( self, tbl, self -> wd, true, path, args );
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenTableRead ( const KDatabase *self,
+    const KTable **tbl, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVOpenTableRead ( self, tbl, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVOpenTableRead ( const KDatabase *self,
+    const KTable **tblp, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( tblp == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * tblp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    if ( name == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "tbl", 3, name, args );
+    if ( rc == 0 )
+    {
+        rc = KDBManagerVOpenTableReadInt ( self -> mgr, tblp,
+                                           self -> dir, false, path, NULL );
+        if ( rc == 0 )
+        {
+            KTable *tbl = ( KTable* ) * tblp;
+            tbl -> db = KDatabaseAttach ( self );
+        }
+    }
+
+    return rc;
+}
+
+
+/* OpenTableUpdate
+ * VOpenTableUpdate
+ *  open a table for read/write
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving name of table
+ */
+static
+rc_t KDBManagerVOpenTableUpdateInt ( KDBManager *self,
+    KTable **tbl, KDirectory *wd, const char *path, va_list args )
+{
+    char tblpath [ 4096 ];
+    rc_t rc = KDirectoryVResolvePath ( wd, true,
+        tblpath, sizeof tblpath, path, args );
+    if ( rc == 0 )
+    {
+        KSymbol * sym;
+        KFile *f;
+        KMD5SumFmt * md5 = NULL;
+        bool convert = false;
+
+        /* if already open, refuse */
+        sym = KDBManagerOpenObjectFind (self, tblpath);
+        if (sym != NULL)
+        {
+            rc_t obj;
+            switch (sym->type)
+            {
+            default:
+                obj = rcPath;
+                break;
+            case kptDatabase:
+                obj = rcDatabase;
+                break;
+            case kptTable:
+                obj = rcTable;
+                break;
+            case kptColumn:
+                obj = rcColumn;
+                break;
+            case kptIndex:
+                obj = rcIndex;
+                break;
+            case kptMetadata:
+                obj = rcMetadata;
+                break;
+            }
+            return RC ( rcDB, rcMgr, rcOpening, obj, rcBusy );
+        }
+        /* only open existing tbls */
+        switch ( KDBPathType ( /*NULL,*/ wd, NULL, tblpath ) )
+        {
+        case kptNotFound:
+            return RC ( rcDB, rcMgr, rcOpening, rcTable, rcNotFound );
+
+        case kptBadPath:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcInvalid );
+
+        case kptFile:
+        case kptFile | kptAlias:
+            /* if we find a file, vary the failure if it is an archive that is a table
+             * or a non related file */
+            if (( KDBOpenPathTypeRead ( self, wd, tblpath, NULL, kptTable, NULL, false ) == 0 ) ||
+                ( KDBOpenPathTypeRead ( self, wd, tblpath, NULL, kptPrereleaseTbl, NULL, false ) == 0 ) )
+                return RC ( rcDB, rcMgr, rcCreating, rcTable, rcUnauthorized );
+            /* fall through */
+        default:
+            return RC ( rcDB, rcMgr, rcOpening, rcPath, rcIncorrect );
+        case kptTable:
+        case kptTable | kptAlias:
+            break;
+
+        case kptPrereleaseTbl:
+        case kptPrereleaseTbl | kptAlias:
+            convert = true;
+            break;
+        }
+
+        /* test now for locked directory */
+        rc = KDBWritable ( wd, tblpath );
+        switch (GetRCState(rc))
+        {
+        default:
+            return RC ( rcDB, rcMgr, rcOpening, rcTable, rcNoPerm );
+
+        case rcLocked:
+            return RC ( rcDB, rcMgr, rcOpening, rcTable, rcLocked );
+
+        case rcReadonly:
+            return RC ( rcDB, rcMgr, rcOpening, rcTable, rcReadonly );
+
+        case 0:
+            rc = 0;
+            break;
+        }
+
+        rc = KDirectoryOpenFileWrite ( wd, &f, true, "%s/md5", tblpath );
+        if ( rc == 0 )
+        {
+            rc = KMD5SumFmtMakeUpdate ( & md5, f );
+            if ( rc != 0 )
+                KFileRelease ( f );
+        }
+        else if ( GetRCState ( rc ) == rcNotFound )
+            rc = 0;
+#if 0
+        else if ( GetRCState ( rc ) == rcUnauthorized )
+            return RC ( rcDB, rcMgr, rcCreating, rcTable, rUnauthorized );
+#endif
+
+        if ( rc == 0 )
+            rc = KDBManagerMakeTableUpdate ( self, tbl, wd, tblpath, convert, md5 );
+
+        KMD5SumFmtRelease ( md5 );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerOpenTableUpdate ( KDBManager *self,
+    KTable **tbl, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDBManagerVOpenTableUpdate ( self, tbl, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDBManagerVOpenTableUpdate ( KDBManager *self,
+    KTable **tbl, const char *path, va_list args )
+{
+    if ( tbl == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcParam, rcNull );
+
+    * tbl = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcMgr, rcOpening, rcSelf, rcNull );
+
+    return KDBManagerVOpenTableUpdateInt ( self, tbl, self -> wd, path, args );
+}
+
+LIB_EXPORT rc_t CC KDatabaseOpenTableUpdate ( KDatabase *self,
+    KTable **tbl, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KDatabaseVOpenTableUpdate ( self, tbl, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDatabaseVOpenTableUpdate ( KDatabase *self,
+    KTable **tblp, const char *name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    if ( tblp == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull );
+
+    * tblp = NULL;
+
+    if ( self == NULL )
+        return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcDB, rcDatabase, rcOpening, rcDatabase, rcReadonly );
+
+    rc = KDBVMakeSubPath ( self -> dir,
+        path, sizeof path, "tbl", 3, name, args );
+    if ( rc == 0 )
+    {
+        rc = KDBManagerVOpenTableUpdateInt ( self -> mgr, tblp,
+                                             self -> dir, path, NULL );
+        if ( rc == 0 )
+        {
+            KTable *tbl = ( KTable* ) * tblp;
+            tbl -> db = KDatabaseAttach ( self );
+        }
+    }
+
+    return rc;
+}
+
+
+/* Locked
+ *  returns non-zero if locked
+ */
+LIB_EXPORT bool CC KTableLocked ( const KTable *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return false;
+
+    rc = KDBWritable ( self -> dir, "." );
+    return GetRCState ( rc ) == rcLocked;
+}
+
+
+/* Exists
+ *  returns true if requested object exists
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT bool CC KTableVExists ( const KTable *self, uint32_t type, const char *name, va_list args )
+{
+    if ( self != NULL && name != NULL && name [ 0 ] != 0 )
+    {
+        rc_t rc;
+        const char *ns;
+        char path [ 256 ];
+
+        switch ( type )
+        {
+        case kptIndex:
+            ns = "idx";
+            break;
+
+        case kptColumn:
+            ns = "col";
+            break;
+
+        default:
+            return false;
+        }
+
+        rc = KDBVMakeSubPath ( self -> dir, path, sizeof path, ns, 3, name, args );
+        if ( rc == 0 )
+        {
+            switch ( KDirectoryPathType ( self -> dir, "%s", path ) )
+            {
+            case kptFile:
+            case kptDir:
+            case kptFile | kptAlias:
+            case kptDir | kptAlias:
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+LIB_EXPORT bool CC KTableExists ( const KTable *self, uint32_t type, const char *name, ... )
+{
+    bool exists;
+
+    va_list args;
+    va_start ( args, name );
+
+    exists = KTableVExists ( self, type, name, args );
+
+    va_end ( args );
+
+    return exists;
+}
+
+
+/* IsAlias
+ *  returns true if object name is an alias
+ *  returns path to fundamental name if it was aliased
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - optional output buffer
+ *  for fundamenta object name if "alias" is not a fundamental name, 
+ *
+ *  "name" [ IN ] - NUL terminated object name
+ */
+LIB_EXPORT bool CC KTableIsAlias ( const KTable *self, uint32_t type,
+    char *resolved, size_t rsize, const char *name )
+{
+    if ( self != NULL && name != NULL && name [ 0 ] != 0 )
+    {
+        rc_t rc;
+        const char *ns;
+        char path [ 256 ];
+
+        switch ( type )
+        {
+        case kptIndex:
+            ns = "idx";
+            break;
+
+        case kptColumn:
+            ns = "col";
+            break;
+
+        default:
+            return false;
+        }
+
+        rc = KDBMakeSubPath ( self -> dir, path, sizeof path, ns, 3, name );
+        if ( rc == 0 )
+        {
+            switch ( KDirectoryPathType ( self -> dir, "%s", path ) )
+            {
+            case kptFile | kptAlias:
+            case kptDir | kptAlias:
+                if ( resolved != NULL && rsize != 0 )
+                {
+                    const KDirectory *sub;
+                    rc = KDirectoryOpenDirRead ( self -> dir, & sub, false, "%s", ns );
+                    * resolved = 0;
+                    if ( rc != 0 )
+                        PLOGERR ( klogWarn, ( klogWarn, rc, "failed to open subdirectory '$(sub)'", "sub=%s", ns ) );
+                    else
+                    {
+                        rc = KDirectoryResolveAlias ( sub, false, resolved, rsize, "%s", name );
+                        KDirectoryRelease ( sub );
+                        if ( rc != 0 )
+                            PLOGERR ( klogWarn, ( klogWarn, rc, "failed to resolve alias '$(alias)'", "alias=%s", name ) );
+                    }
+                }
+                return true;
+            }
+        }
+    }
+
+    if ( resolved != NULL && rsize != 0 )
+        * resolved = 0;
+
+    return false;
+}
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+static
+rc_t KTableLockInt (const KTable  * self, char * path, size_t path_size,
+                        int type, const char * name, va_list args )
+{
+    rc_t rc;
+
+    if (self == NULL)
+        rc = RC ( rcDB, rcMgr, rcAccessing, rcSelf, rcNull );
+
+    else if (name == NULL)
+        rc =  RC (rcDB, rcMgr, rcAccessing, rcPath, rcNull);
+
+    else
+    {
+        const char * ns;
+
+        ns = KDBGetNamespaceString (type);
+
+        switch (type)
+        {
+        default:
+            rc = RC (rcDB, rcMgr, rcAccessing, rcParam, rcInvalid);
+            break;
+        case kptColumn:
+        case kptIndex:
+            rc = KDBVMakeSubPath (self->dir, path, path_size, ns, strlen (ns),
+                                  name, args);
+            break;
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableVWritable (const KTable *self, uint32_t type, const char * name, va_list args )
+{
+    rc_t rc;
+    char path [ 256 ];
+
+    rc = KTableLockInt (self, path, sizeof path, type, name, args);
+    if (rc == 0)
+        rc = KDBWritable (self->dir, path);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableWritable ( const KTable *self, uint32_t type, const char * name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KTableVWritable ( self, type, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC KTableVLock ( KTable *self, uint32_t type, const char * name, va_list args )
+{
+    rc_t rc = 0;
+    char path [ 256 ];
+
+    rc = KTableLockInt (self, path, sizeof path, type, name, args);
+    if (rc == 0)
+        rc = KDBLockDir (self->dir, path);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableLock ( KTable *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KTableVLock (self, type, name, args);
+    va_end (args);
+    return rc;
+}
+
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC KTableVUnlock ( KTable *self, uint32_t type, const char * name, va_list args )
+{
+    rc_t rc = 0;
+    char path [ 256 ];
+
+    rc = KTableLockInt (self, path, sizeof path, type, name, args);
+    if (rc == 0)
+        rc = KDBUnlockDir (self->dir, path);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableUnlock ( KTable *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, name );
+    rc = KTableVUnlock ( self, type, name, args );
+    va_end ( args );
+    return rc;
+}
+
+
+/* Rename
+ */
+LIB_EXPORT rc_t CC KTableRenameColumn ( KTable *self, bool force, const char *from, const char *to )
+{
+    return KDBRename ( self -> dir, self -> mgr, kptColumn, force, from, to );
+}
+
+LIB_EXPORT rc_t CC KTableRenameIndex ( KTable *self, bool force, const char *from, const char *to )
+{
+    return KDBRename ( self -> dir, self -> mgr, kptIndex, force, from, to );
+}
+
+/* Alias
+ */
+LIB_EXPORT rc_t CC KTableAliasColumn ( KTable *self, const char *col, const char *alias )
+{
+    return KDBAlias ( self -> dir, kptColumn, col, alias );
+}
+
+LIB_EXPORT rc_t CC KTableAliasIndex ( KTable *self, const char *idx, const char *alias )
+{
+    return KDBAlias ( self -> dir, kptIndex, idx, alias );
+}
+
+/* Drop
+ */
+LIB_EXPORT rc_t CC KTableDropColumn ( KTable *self, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KTableVDropColumn ( self, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableVDropColumn ( KTable *self, const char *name, va_list args )
+{
+    return KDBVDrop ( self -> dir, self -> mgr, kptColumn, name, args );
+}
+
+LIB_EXPORT rc_t CC KTableDropIndex ( KTable *self, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = KTableVDropIndex ( self, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableVDropIndex ( KTable *self, const char *name, va_list args )
+{
+    return KDBVDrop ( self -> dir, self -> mgr, kptIndex, name, args );
+}
+
+
+/* Reindex
+ *  optimize column indices
+ */
+LIB_EXPORT rc_t CC KTableReindex ( KTable *self )
+{
+    if ( self != NULL )
+    {
+        KNamelist *names;
+        rc_t rc = KTableListCol ( self, & names );
+        if ( rc == 0 )
+        {
+            uint32_t count;
+            rc = KNamelistCount ( names, & count );
+            if ( rc == 0 )
+            {
+                uint32_t i;
+                for ( i = 0; i < count; ++ i )
+                {
+                    KColumn *col;
+
+                    const char *name;
+                    rc = KNamelistGet ( names, i, & name );
+                    if ( rc != 0 )
+                        break;
+
+                    /* check it the column has idx0 data
+                       TBD - this whole operation goes away when
+                       idx0 is used for cursor sessions */
+                    if ( KTableColumnNeedsReindex ( self, name ) )
+                    {
+                        rc = KTableOpenColumnUpdate ( self, & col, "%s", name );
+                        if ( rc != 0 )
+                        {
+                            if ( GetRCState ( rc ) == rcBusy )
+                                continue;
+                            break;
+                        }
+
+                        rc = KColumnReindex ( col );
+                        KColumnRelease ( col );
+                        if ( rc != 0 )
+                            break;
+                    }
+                }
+            }
+
+            KNamelistRelease ( names );
+        }
+        return rc;
+    }
+    return RC ( rcDB, rcTable, rcReindexing, rcSelf, rcNull );
+}
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KTableOpenManagerRead ( const KTable *self, const KDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableOpenManagerUpdate ( KTable *self, KDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC KTableOpenParentRead ( const KTable *self, const KDatabase **db )
+{
+    rc_t rc;
+
+    if ( db == NULL )
+        rc = RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDatabaseAddRef ( self -> db );
+            if ( rc == 0 )
+            {
+                * db = self -> db;
+                return 0;
+            }
+        }
+
+        * db = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableOpenParentUpdate ( KTable *self, KDatabase **db )
+{
+    rc_t rc;
+
+    if ( db == NULL )
+        rc = RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else if ( self -> db != NULL && self -> db -> read_only )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcDatabase, rcReadonly );
+        else
+        {
+            rc = KDatabaseAddRef ( self -> db );
+            if ( rc == 0 )
+            {
+                * db = self -> db;
+                return 0;
+            }
+        }
+
+        * db = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenDirectory
+ *  access the directory in use
+ */
+LIB_EXPORT rc_t CC KTableOpenDirectoryRead ( const KTable *self, const KDirectory **dir )
+{
+    rc_t rc;
+
+    if ( dir == NULL )
+        rc = RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * dir = self -> dir;
+            return KDirectoryAddRef ( * dir );
+        }
+
+        * dir = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTableOpenDirectoryUpdate ( KTable *self, KDirectory **dir )
+{
+    rc_t rc;
+
+    if ( dir == NULL )
+        rc = RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+         else if ( self -> dir != NULL && self -> dir -> read_only )
+             rc = RC ( rcDB, rcTable, rcAccessing, rcDirectory, rcReadonly );
+        else
+        {
+            * dir = self -> dir;
+            return KDirectoryAddRef ( * dir );
+        }
+
+        * dir = NULL;
+    }
+
+    return rc;
+}
+
+
+/* ModDate
+ *  get modification date
+ */
+LIB_EXPORT rc_t CC KTableModDate ( const KTable *self, KTime_t *mtime )
+{
+    rc_t rc;
+
+    if ( mtime == NULL )
+        rc = RC ( rcDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self != NULL )
+            return KDBGetObjModDate ( self -> dir, mtime );
+
+        rc = RC ( rcDB, rcTable, rcAccessing, rcSelf, rcNull );
+        * mtime = 0;
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KNamelist
+ */
+
+/* List
+ *  create table listings
+ */
+struct FilterData
+{
+    const KDBManager * mgr;
+    int type;
+};
+
+static
+bool CC KDatabaseListFilter ( const KDirectory *dir, const char *name, void *data_ )
+{
+    struct FilterData * data = data_;
+
+    return KDBOpenPathTypeRead(data->mgr, dir, name, NULL, data->type, NULL, false) == 0;
+}
+
+LIB_EXPORT rc_t CC KTableListCol ( const KTable *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        struct FilterData data;
+        data.mgr = self->mgr;
+        data.type = kptColumn;
+
+        return KDirectoryList ( self -> dir,
+            names, KDatabaseListFilter, &data, "col" );
+    }
+    
+    if ( names != NULL )
+        * names = NULL;
+    
+    return RC ( rcDB, rcTable, rcListing, rcSelf, rcNull );
+}
+
+static
+bool CC KTableListIdxFilter ( const KDirectory *dir, const char *name, void *data )
+{
+    const size_t sz = strlen(name);
+    
+    if (sz > 4 && strcmp(&name[sz - 4], ".md5") == 0)
+        return false;
+    return true;
+}
+
+static
+bool CC KTableListSkeyFilter ( const KDirectory *dir, const char *name, void *data )
+{
+    if ( strcmp ( name, "skey" ) == 0 )
+        return true;
+    return false;
+}
+
+LIB_EXPORT rc_t CC KTableListIdx ( const KTable *self, KNamelist **names )
+{
+    if ( self != NULL )
+    {
+        if ( ! self -> prerelease )
+        {
+            return KDirectoryList ( self -> dir,
+                                    names, KTableListIdxFilter, NULL, "idx" );
+        }
+        
+        return KDirectoryList ( self -> dir,
+                                names, KTableListSkeyFilter, NULL, "." );
+    }
+    
+    if ( names != NULL )
+        * names = NULL;
+    
+    return RC ( rcDB, rcTable, rcListing, rcSelf, rcNull );
+}
+
+/* HasRemoteData
+ *  indicates whether some/all table data comes from network resource
+ *  such as HttpFile or CacheteeFile
+ */
+KDB_EXTERN bool CC KTableHasRemoteData ( const KTable *self )
+{
+    return true;
+}
diff --git a/libs/kdb/wtrieidx-v1.c b/libs/kdb/wtrieidx-v1.c
new file mode 100644
index 0000000..ff78ba1
--- /dev/null
+++ b/libs/kdb/wtrieidx-v1.c
@@ -0,0 +1,1100 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+#include "windex-priv.h"
+#include "kdbfmt-priv.h"
+#include <klib/ptrie.h>
+#include <klib/text.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kfs/mmap.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <byteswap.h>
+#include <assert.h>
+
+#define DISABLE_PROJ 0
+#define LIMIT_INSERTS 0
+
+#if LIMIT_INSERTS
+#define INSERT_LIMIT 100000000
+#endif
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndex_v1
+ *  persisted keymap
+ */
+
+/* KPTrieIndexInit
+ *  opens and initializes persisted keymap structure
+ */
+rc_t KPTrieIndexInit_v1 ( KPTrieIndex_v1 *self, const KMMap *mm, bool byteswap )
+{
+    size_t size;
+    rc_t rc = KMMapSize ( mm, & size );
+    if ( rc == 0 )
+    {
+        const KDBHdr *hdr;
+        rc = KMMapAddrRead ( mm, ( const void** ) & hdr );
+        if ( rc == 0 )
+        {
+            /* try to create the pttree */
+            rc = PTrieMakeOrig ( & self -> key2id,
+                hdr + 1, size -= sizeof * hdr, byteswap );
+            if ( rc == 0 )
+            {
+                size_t ptsize = PTrieSize ( self -> key2id );
+                if ( ptsize <= size )
+                {
+                    /* just in case */
+                    self -> mm = NULL;
+
+                    /* record for projection */
+                    self -> byteswap = byteswap;
+
+                    /* it could be stored without projection */
+                    if ( ptsize == size )
+                    {
+                        self -> id2node = NULL;
+                        self -> first = self -> last = 0;
+                        return 0;
+                    }
+                            
+                    /* assume this is projection index */
+                    self -> id2node = ( void* )
+                        ( ( char* ) ( hdr + 1 ) + ptsize );
+                    size -= ptsize;
+                            
+                    /* it must have at least 4 bytes
+                       and be 4 byte aligned */
+                    if ( size >= sizeof ( uint32_t ) && ( size & 3 ) == 0 )
+                    {
+                        /* first entry is starting key
+                           remaining entries are node ids */
+                        self -> first = * self -> id2node ++;
+                        size -= sizeof self -> id2node [ 0 ];
+                        if ( size == 0 )
+                        {
+                            /* forget if empty */
+                            self -> id2node = NULL;
+                            self -> first = self -> last = 0;
+                            return 0;
+                        }
+                        /* remaining entries */
+                        self -> last = self -> first + ( size >> 2 ) - 1;
+                        return 0;
+                    }
+                }
+
+                PTrieWhack ( self -> key2id );
+                self -> key2id = NULL;
+
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* KPTrieIndexWhack_v1
+ *  closes down keymap
+ */
+void KPTrieIndexWhack_v1 ( KPTrieIndex_v1 *self )
+{
+    PTrieWhack ( self -> key2id );
+    KMMapRelease ( self -> mm );
+    memset ( self, 0, sizeof * self );
+}
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIdxNode_v1
+ */
+
+static
+void CC KTrieIdxNodeWhack_v1 ( TNode *n, void *data )
+{
+    TNodeWhack ( n );
+}
+
+static
+void CC KTrieIdxNodeUnlink_v1 ( TNode *n, void *data )
+{
+    if ( TrieUnlink ( data, n ) )
+        TNodeWhack ( n );
+}
+
+static
+void CC KTrieIdxNodeCaptureID_v1 ( TNode *n, void *data )
+{
+    KTrieIndex_v1 *self = data;
+    KTrieIdxNode_v1 *node = ( KTrieIdxNode_v1* ) n;
+    self -> id2node [ node -> id - self -> first ] = node;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIndex_v1
+ */
+
+/* KTrieIndexWrite_v1
+ */
+typedef struct PersistTrieData PersistTrieData;
+struct PersistTrieData
+{
+    uint64_t pos;
+    KFile *f;
+    uint8_t *buffer;
+    size_t bsize;
+    size_t marker;
+
+    size_t ptt_size;
+    uint32_t first;
+    uint32_t last;
+    rc_t rc;
+};
+
+static
+rc_t CC KTrieIndexWrite_v1 ( void *param,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    PersistTrieData *pb = param;
+    size_t total, to_write;
+
+    for ( total = 0; total < size; total += to_write )
+    {
+        to_write = size - total;
+        if ( pb -> marker + to_write > pb -> bsize )
+            to_write = pb -> bsize - pb -> marker;
+
+        if ( to_write > 0 )
+        {
+            memmove ( pb -> buffer + pb -> marker,
+                ( const uint8_t* ) buffer + total, to_write );
+            pb -> marker += to_write;
+        }
+
+        if ( pb -> marker == pb -> bsize )
+        {
+            size_t num_flushed;
+            pb -> rc = KFileWrite ( pb -> f, pb -> pos,
+                pb -> buffer, pb -> bsize, & num_flushed );
+            if ( pb -> rc != 0 )
+            {
+                * num_writ = 0;
+                return pb -> rc;
+            }
+
+            if ( num_flushed == 0 )
+            {
+                * num_writ = total + to_write;
+                return pb -> rc = RC ( rcDB, rcIndex, rcPersisting, rcTransfer, rcIncomplete );
+            }
+
+            pb -> marker -= num_flushed;
+            pb -> pos += num_flushed;
+
+            if ( pb -> marker != 0 )
+                memmove ( pb -> buffer, pb -> buffer + num_flushed, pb -> marker );
+        }
+    }
+
+    * num_writ = total;
+    return 0;
+}
+
+/* KTrieIndexAux_v1
+ */
+static
+rc_t CC KTrieIndexAux_v1 ( void *param, const void *node, size_t *num_writ,
+    PTWriteFunc write, void *write_param )
+{
+    const KTrieIdxNode_v1 *n = node;
+
+    if ( write != NULL )
+    {
+        PersistTrieData *pb = param;
+        if ( n -> id < pb -> first )
+            pb -> first = n -> id;
+        if ( n -> id > pb -> last )
+            pb -> last = n -> id;
+
+        return ( * write ) ( write_param, & n -> id, sizeof n -> id, num_writ );
+    }
+
+    * num_writ = sizeof n -> id;
+    return 0;
+}
+
+/* KTrieIndexPersist_v1
+ *  write keymap to indicated location
+ */
+static
+rc_t KTrieIndexPersistTrie_v1 ( const KTrieIndex_v1 *self, PersistTrieData *pb )
+{
+    rc_t rc;
+    KDBHdr *hdr;
+
+    pb -> pos = 0;
+
+    hdr = ( KDBHdr* ) pb -> buffer;
+    KDBHdrInit ( hdr, 1 );
+    pb -> marker = sizeof * hdr;
+
+    /* persist the trie to file,
+       using tree-internal key storage,
+       capture the image size in pb */
+    rc = TriePersist ( & self -> key2id, & pb -> ptt_size,
+        false, KTrieIndexWrite_v1, pb, KTrieIndexAux_v1, pb );
+    if ( rc == 0 && pb -> marker != 0 )
+    {
+        size_t num_writ;
+        rc = KFileWrite ( pb -> f, pb -> pos,
+            pb -> buffer, pb -> marker, & num_writ );
+        if ( rc == 0 && num_writ != pb -> marker )
+            rc = RC ( rcDB, rcIndex, rcPersisting, rcTransfer, rcIncomplete );
+    }
+
+    return rc;
+}
+
+
+typedef struct PersistReverseData PersistReverseData;
+struct PersistReverseData
+{
+    PTrie *tt;
+    uint32_t *a;
+    uint32_t first;
+    uint32_t count;
+    uint32_t notfound;
+};
+
+static
+void CC KTrieIndexRecordNodeId_v1 ( TNode *node, void *data )
+{
+    PTNode pn;
+    PersistReverseData *pb = data;
+    const KTrieIdxNode_v1 *n = ( const KTrieIdxNode_v1* ) node;
+
+    /* lookup up the persisted node within image */
+    uint32_t id = PTrieFind ( pb -> tt, & n -> n . key, & pn, NULL, NULL );
+
+    /* write it into array */
+    pb -> a [ n -> id - pb -> first ] = ( uint32_t ) id;
+
+    if ( id == 0 )
+        ++ pb -> notfound;
+    else
+        ++ pb -> count;
+}
+
+static
+rc_t KTrieIndexPersistProj_v1 ( const KTrieIndex_v1 *self, PersistTrieData *pb )
+{
+#if 0
+    rc_t rc;
+    KMMap *mmr;
+    size_t map_size;
+
+    /* there must be something to do */
+    if ( pb -> first > pb -> last )
+        return 0;
+
+
+    /* open a read-write map onto file
+       start at offset 0, which is the header,
+       followed by pb -> ptt_size bytes which is the tree,
+       and add on a slot for first id,
+       followed by last - first + 1 slots for id to node id map */
+    map_size = pb -> ptt_size + ( ( pb -> last - pb -> first + 2 ) << 2 );
+
+    rc = KMMapMakeRgnUpdate ( & mmr, pb -> f, sizeof ( KDBHdr ), map_size );
+    if ( rc == 0 )
+    {
+        void *addr;
+        PersistReverseData pb2;
+
+        rc = KMMapAddrUpdate ( mmr, & addr );
+        if ( rc == 0 )
+        {
+            rc = PTrieMakeOrig ( & pb2 . tt, addr, pb -> ptt_size );
+            if ( rc == 0 )
+            {
+                assert ( pb -> ptt_size == PTrieSize ( pb2 . tt ) );
+                pb2 . a = ( void* ) ( ( char* ) addr + pb -> ptt_size );
+                assert ( ( ( size_t ) pb2 . a & 3 ) == 0 );
+
+                /* record first id */
+                * pb2 . a ++ = pb -> first;
+                pb2 . first = pb -> first;
+                pb2 . count = pb2 . notfound = 0;
+
+                /* record all id to node mappings */
+                TrieForEach ( & self -> key2id, KTrieIndexRecordNodeId_v1, & pb2 );
+
+                /* check for having written ids */
+                assert ( pb2 . count == PTrieCount ( pb2 . tt ) );
+
+                /* done with pttree */
+                PTrieWhack ( pb2 . tt );
+
+                /* if there were nodes not found,
+                   the initial persist was bad */
+                if ( pb2 . notfound != 0 )
+                    rc = RC ( rcDB, rcIndex, rcPersisting, rcTransfer, rcIncomplete );
+            }
+        }
+
+        /* done with map - commits changes to disk */
+        KMMapRelease ( mmr );
+
+        /* truncate file to desired size */
+        KFileSetSize ( pb -> f, map_size + sizeof ( KDBHdr ) );
+    }
+
+    return rc;
+#else
+    rc_t rc;
+    void * addr;
+    uint64_t file_size;
+    size_t num_to_read;
+    size_t map_size;
+
+    /* there must be something to do */
+    if ( pb -> first > pb -> last )
+        return 0;
+
+    /* open a read-write map onto file
+       start at offset 0, which is the header,
+       followed by pb -> ptt_size bytes which is the tree,
+       and add on a slot for first id,
+       followed by last - first + 1 slots for id to node id map */
+    map_size = pb -> ptt_size + ( ( pb -> last - pb -> first + 2 ) << 2 );
+
+    rc = KFileSize ( pb -> f, & file_size );
+    if ( rc == 0 )
+    {
+        addr = malloc ( map_size );
+        if ( addr == NULL )
+            rc = RC ( rcDB, rcIndex, rcPersisting, rcMemory, rcExhausted );
+        else
+        {
+            size_t num_read;
+            num_to_read = file_size - sizeof ( KDBHdr );
+            rc = KFileReadAll ( pb -> f, sizeof ( KDBHdr ),
+                addr, num_to_read, & num_read );
+            if ( rc != 0 )
+                free ( addr );
+            else if ( num_read != num_to_read )
+            {
+                free ( addr );
+                rc = RC ( rcDB, rcIndex, rcPersisting, rcHeader, rcInsufficient );
+            }
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        size_t num_writ;
+        PersistReverseData pb2;
+
+        rc = PTrieMakeOrig ( & pb2 . tt, addr, pb -> ptt_size, false );
+        if ( rc == 0 )
+        {
+            assert ( pb -> ptt_size == PTrieSize ( pb2 . tt ) );
+            pb2 . a = ( void* ) ( ( char* ) addr + pb -> ptt_size );
+            assert ( ( ( size_t ) pb2 . a & 3 ) == 0 );
+
+            /* record first id */
+            * pb2 . a ++ = pb -> first;
+            pb2 . first = pb -> first;
+            pb2 . count = pb2 . notfound = 0;
+
+            /* record all id to node mappings */
+            TrieForEach ( & self -> key2id, KTrieIndexRecordNodeId_v1, & pb2 );
+
+            /* check for having written ids */
+            assert ( pb2 . count == PTrieCount ( pb2 . tt ) );
+
+            /* done with pttree */
+            PTrieWhack ( pb2 . tt );
+
+            /* if there were nodes not found,
+               the initial persist was bad */
+            if ( pb2 . notfound != 0 )
+                rc = RC ( rcDB, rcIndex, rcPersisting, rcTransfer, rcIncomplete );
+            else
+            {
+                rc = KFileWrite ( pb -> f, file_size, ( uint8_t* ) addr + num_to_read,
+                    map_size - num_to_read, & num_writ );
+                if ( rc == 0  && num_writ != map_size - num_to_read )
+                    rc = RC ( rcDB, rcIndex, rcPersisting, rcHeader, rcInsufficient );
+            }
+        }
+
+        /* done with map - commits changes to disk */
+        free ( addr );
+
+        /* truncate file to desired size */
+        KFileSetSize ( pb -> f, map_size + sizeof ( KDBHdr ) );
+    }
+
+    return rc;
+#endif
+}
+
+rc_t KTrieIndexPersist_v1 ( const KTrieIndex_v1 *self,
+    bool proj, KDirectory *dir, const char *path, bool use_md5 )
+{
+    rc_t rc;
+    PersistTrieData pb;
+
+    assert ( self != NULL );
+
+    pb . buffer = malloc ( pb . bsize = 32 * 1024 );
+    if ( pb . buffer == NULL )
+        rc = RC ( rcDB, rcIndex, rcPersisting, rcMemory, rcExhausted );
+    else
+    {
+        char tmpname [ 256 ];
+        char tmpmd5name [ 256 ];
+        char md5path [ 256 ];
+        rc = KDirectoryResolvePath ( dir, false,
+            tmpname, sizeof tmpname, "%s.tmp", path );
+        if ( rc == 0 )
+        {
+            rc = KDirectoryCreateFile ( dir, & pb . f,
+                                         true, 0664, kcmInit, "%s", tmpname );
+
+	    if (use_md5 && rc == 0 )
+	    {
+		size_t tmplen = snprintf ( tmpmd5name, sizeof tmpmd5name, "%s.md5", tmpname );
+		KFile * kf;
+		KMD5SumFmt *km;
+		if ( tmplen >= sizeof ( tmpmd5name ) ) /* can't be == or no NUL */
+		{
+		    rc = RC ( rcDB, rcIndex, rcPersisting, rcName, rcExcessive );
+		}
+		else
+		{
+		    tmplen = snprintf ( md5path, sizeof md5path, "%s.md5", path );
+		    
+		    if ( tmplen >= sizeof ( md5path ) ) /* can't be == or no NUL */
+		    {
+			rc = RC ( rcDB, rcIndex, rcPersisting, rcName, rcExcessive );
+		    }
+		    else
+		    {
+			rc = KDirectoryCreateFile ( dir, &kf, true, 0664, 
+                                         kcmInit, "%s", tmpmd5name );
+			if ( rc == 0 )
+			{
+			    rc = KMD5SumFmtMakeUpdate ( &km, kf );
+			    if ( rc == 0 )
+			    {
+				KMD5File * k5f;
+				kf = NULL;
+				rc = KMD5FileMakeWrite ( &k5f, pb . f, km, path );
+				if ( rc == 0 )
+				{
+				    pb . f = KMD5FileToKFile ( k5f );
+				}
+				/* release pass or fail */
+				KMD5SumFmtRelease ( km );
+			    }
+			    else
+				KFileRelease ( kf );
+			}
+			else
+			    KFileRelease ( kf );
+		    }
+		}
+		if ( rc != 0 )
+		    KFileRelease ( pb . f );
+	    }
+
+            if ( rc == 0 )
+            {
+                pb . ptt_size = 0;
+                pb . first = ~ 0;
+                pb . last = 0;
+
+                rc = KTrieIndexPersistTrie_v1 ( self, & pb );
+                if ( rc == 0 )
+                {
+                    if ( proj )
+                        rc = KTrieIndexPersistProj_v1 ( self, & pb );
+                }
+                
+                KFileRelease ( pb . f );
+                pb . f = NULL;
+            }
+        }
+        
+        free ( pb . buffer );
+        pb . buffer = NULL;
+        
+        if ( rc == 0 )
+        {
+            rc = KDirectoryRename ( dir, false, tmpname, path );                        
+            if ( rc == 0 )
+            {
+		if ( use_md5 )
+		    rc = KDirectoryRename ( dir, false, tmpmd5name, md5path );                        
+		if ( rc == 0 )
+		{
+		    /* done */
+		    return 0;
+		}
+            }
+        }
+        
+        /* whack temporary file */
+        KDirectoryRemove ( dir, false, "%s", tmpname );
+	if ( use_md5 )
+	    KDirectoryRemove ( dir, false, "%s", tmpmd5name );
+    }
+    
+    return rc;
+}
+
+
+/* whack whack */
+void KTrieIndexWhack_v1 ( KTrieIndex_v1 *self )
+{
+    KPTrieIndexWhack_v1 ( & self -> pt );
+    TrieWhack ( & self -> key2id, KTrieIdxNodeWhack_v1, NULL );
+}
+
+/* initialize an index from file - can be NULL */
+rc_t KTrieIndexOpen_v1 ( KTrieIndex_v1 *self, const KMMap *mm, bool byteswap )
+{
+    rc_t rc;
+
+    memset ( self, 0, sizeof * self );
+    rc = TrieInit ( & self -> key2id, "0-9", 512, true );
+    if ( rc != 0 )
+        return rc;
+
+    self -> first = ~ 0;
+
+    if ( mm == NULL )
+        return 0;
+
+    rc = KPTrieIndexInit_v1 ( & self -> pt, mm, byteswap );
+    if ( rc == 0 )
+    {
+        rc = KMMapAddRef ( mm );
+        if ( rc == 0 )
+        {
+            self -> pt . mm = mm;
+            return 0;
+        }
+    }
+
+    KTrieIndexWhack_v1 ( self );
+    return rc;
+}
+
+/* KTrieIndexPopulate_v1
+ */
+typedef struct KTrieIndexPopulateData_v1 KTrieIndexPopulateData_v1;
+struct KTrieIndexPopulateData_v1
+{
+    KTrieIndex_v1 *idx;
+    uint32_t id;
+    rc_t rc;
+};
+
+static
+bool CC KTrieIndexPopulate_v1 ( PTNode *n, void *data )
+{
+    const String *key;
+    KTrieIndexPopulateData_v1 *pb = data;
+
+    /* capture node id */
+    uint32_t id;
+    assert ( n -> data . size == sizeof id );
+    memmove ( & id, n -> data . addr, sizeof id );
+
+    /* reject already mapped */
+    if ( id == pb -> id )
+    {
+        pb -> rc = RC ( rcDB, rcIndex, rcConstructing, rcNode, rcExists );
+        return true;
+    }
+
+    pb -> rc = PTNodeMakeKey ( n, & key );
+    if ( pb -> rc == 0 )
+    {
+        KTrieIdxNode_v1 *node;
+        pb -> rc = TNodeMake ( ( TNode** ) & node,
+            sizeof * node + key -> size );
+        if ( pb -> rc == 0 )
+        {
+            KTrieIndex_v1 *self = pb -> idx;
+
+            StringInit ( & node -> n . key, node -> key, key -> size, key -> len );
+            node -> id = id;
+            string_copy ( node -> key, key -> size + 1,
+                key -> addr, key -> size );
+
+            pb -> rc = TrieInsert ( & self -> key2id, & node -> n );
+            if ( pb -> rc == 0 )
+            {
+                free ( ( void* ) key );
+    
+                /* if copying projection index */
+                if ( self -> id2node != NULL )
+                {
+                    if ( self -> pt . id2node != NULL )
+                        self -> id2node [ node -> id - self -> pt . first ] = node;
+                    else
+                    {
+                        if ( node -> id < self -> first )
+                            self -> first = node -> id;
+                        if ( node -> id > self -> last )
+                            self -> last = node -> id;
+                    }
+                }
+                return 0;
+            }
+
+            TNodeWhack ( & node -> n );
+        }
+
+        StringWhack ( ( String* ) key );
+    }
+
+    return true;
+}
+
+/* KTrieIndexAttach_v1
+ *  attach a keymap to an existing table
+ *
+ *  "pkm" [ IN ] - a persisted keymap
+ */
+static
+rc_t KTrieIndexAttach_v1 ( KTrieIndex_v1 *self, bool proj, uint32_t id )
+{
+    uint32_t proj_len;
+    KTrieIndexPopulateData_v1 pb;
+
+#if LIMIT_INSERTS
+    proj_len = self -> pt . last - self -> pt . first + 1;
+#endif
+
+    /* see if we can use existing projection index */
+    if ( proj && self -> pt . id2node != NULL )
+    {
+        /* reject if already mapped */
+        if ( id != 0 &&
+             id >= self -> pt . first &&
+             id <= self -> pt . last &&
+             self -> pt . id2node [ id - self -> pt . first ] != 0 )
+        {
+            return RC ( rcDB, rcIndex, rcUpdating, rcId, rcExists );
+        }
+
+        /* allocate index array */
+#if LIMIT_INSERTS
+        if ( proj_len > INSERT_LIMIT )
+            return RC ( rcDB, rcIndex, rcUpdating, rcRange, rcExcessive );
+#else
+        proj_len = self -> pt . last - self -> pt . first + 1;
+#endif
+        proj_len = ( proj_len + 4095 ) & - 4096;
+        self -> id2node = calloc ( proj_len, sizeof self -> id2node [ 0 ] );
+        if ( self -> id2node == NULL )
+            return RC ( rcDB, rcIndex, rcUpdating, rcMemory, rcExhausted );
+
+        /* record known dimensions */
+        self -> first = self -> pt . first;
+        self -> last = self -> pt . last;
+        self -> len = proj_len;
+    }
+
+#if LIMIT_INSERTS
+    else if ( proj_len > INSERT_LIMIT )
+        return RC ( rcDB, rcIndex, rcUpdating, rcRange, rcExcessive );
+#endif
+
+    /* inflate persisted trie */
+    pb . idx = self;
+    pb . id = id;
+    pb . rc = 0;
+    PTrieDoUntil ( self -> pt . key2id, KTrieIndexPopulate_v1, & pb );
+
+    /* if successful but needing to add projection index */
+    if ( pb . rc == 0 && proj && self -> id2node == NULL )
+    {
+        proj_len = self -> last - self -> first + 1;
+        proj_len = ( proj_len + 4095 ) & - 4096;
+        self -> id2node = calloc ( proj_len, sizeof self -> id2node [ 0 ] );
+        if ( self -> id2node == NULL )
+            pb . rc = RC ( rcDB, rcIndex, rcUpdating, rcMemory, rcExhausted );
+        else
+        {
+            self -> len = proj_len;
+            TrieForEach ( & self -> key2id, KTrieIdxNodeCaptureID_v1, self );
+        }
+    }
+
+    if ( pb . rc == 0 )
+        KPTrieIndexWhack_v1 ( & self -> pt );
+    else if ( self -> id2node != NULL )
+    {
+        TrieForEach ( & self -> key2id,
+            KTrieIdxNodeUnlink_v1, & self -> key2id );
+        free ( self -> id2node );
+        self -> id2node = NULL;
+        self -> first = ~0;
+        self -> last = 0;
+        self -> len = 0;
+    }
+    return pb . rc;
+}
+
+/* insert string into trie, mapping to 32 bit id */
+static
+rc_t KTrieIndexExpandId2Node_v1 ( KTrieIndex_v1 *self, uint32_t range )
+{
+    KTrieIdxNode_v1 **id2node;
+    range = ( range + 4095 ) & - 4096;
+    id2node = realloc ( self -> id2node, range * sizeof id2node [ 0 ] );
+    if ( id2node == NULL )
+        return RC ( rcDB, rcIndex, rcInserting, rcMemory, rcExhausted );
+
+    self -> id2node = id2node;
+
+#if ZERO_ID2NODE
+    /* why zero this when it is known to be invalid? */
+    memset ( id2node + self -> len, 0,
+        ( range - self -> len ) * sizeof id2node [ 0 ] );
+#endif
+
+    self -> len = range;
+
+    return 0;
+}
+
+rc_t KTrieIndexInsert_v1 ( KTrieIndex_v1 *self,
+    bool proj, const char *str, uint32_t id )
+{
+    rc_t rc;
+
+    String key;
+    KTrieIdxNode_v1 *node;
+
+#if DISABLE_PROJ
+    proj = false;
+#endif
+
+    /* detect first modification */
+    if ( self -> last < self -> first )
+    {
+        /* detect persisted data */
+        if ( self -> pt . key2id != NULL )
+        {
+            rc = KTrieIndexAttach_v1 ( self, proj, id );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        /* create empty projection array */
+        else if ( proj )
+        {
+            self -> id2node = malloc ( 4096 * sizeof self -> id2node [ 0 ] );
+            if ( self -> id2node == NULL )
+                return RC ( rcDB, rcIndex, rcInserting, rcMemory, rcExhausted );
+            self -> first = self -> last = id;
+            self -> len = 4096;
+        }
+    }
+
+    /* reject if already mapped */
+    else if ( self -> id2node != NULL &&
+              id >= self -> first &&
+              id <= self -> last &&
+              self -> id2node [ id - self -> first ] != NULL )
+    {
+        return RC ( rcDB, rcIndex, rcInserting, rcId, rcExists );
+    }
+#if LIMIT_INSERTS && INSERT_LIMIT > 0
+    else if ( ( self -> last - self -> first ) >= ( INSERT_LIMIT - 1 ) )
+    {
+        return RC ( rcDB, rcIndex, rcUpdating, rcRange, rcExcessive );
+    }
+#endif
+
+    StringInitCString ( & key, str );
+    rc = TNodeMake ( ( TNode** ) & node, sizeof * node + key . size );
+    if ( rc != 0 )
+        rc = RC ( rcDB, rcIndex, rcInserting, rcMemory, rcExhausted );
+    else
+    {
+        StringInit ( & node -> n . key, node -> key, key . size, key . len );
+        node -> id = id;
+        strcpy ( node -> key, str );
+
+        rc = TrieInsertUnique ( & self -> key2id, & node -> n, NULL );
+        if ( rc != 0 )
+            TNodeWhack ( & node -> n );
+        else if ( proj )
+        {
+            uint32_t range, offset;
+
+            if ( id < self -> first )
+            {
+                range = self -> last - id + 1;
+                if ( range > self -> len )
+                {
+                    rc = KTrieIndexExpandId2Node_v1 ( self, range );
+                    if ( rc != 0 )
+                    {
+                        TrieUnlink ( & self -> key2id, & node -> n );
+                        KTrieIdxNodeWhack_v1 ( & node -> n, NULL );
+                        return rc;
+                    }
+                }
+
+                offset = self -> first - id;
+                memmove ( & self -> id2node [ offset ], self -> id2node,
+                    ( self -> last - self -> first + 1 ) * sizeof self -> id2node [ 0 ] );
+                memset ( & self -> id2node [ 1 ], 0,
+                    ( offset - 1 ) * sizeof self -> id2node [ 0 ] );
+
+                self -> first = id;
+            }
+            else if ( id > self -> last )
+            {
+                range = id - self -> first + 1;
+                if ( range > self -> len )
+                {
+                    rc = KTrieIndexExpandId2Node_v1 ( self, range );
+                    if ( rc != 0 )
+                    {
+                        TrieUnlink ( & self -> key2id, & node -> n );
+                        KTrieIdxNodeWhack_v1 ( & node -> n, NULL );
+                        return rc;
+                    }
+                }
+
+                offset = id - 1 - self -> last;
+                if ( offset > 0 )
+                {
+                    memset ( & self -> id2node [ self -> last - self -> first + 1 ],
+                        0, offset * sizeof self -> id2node [ 0 ] );
+                }
+
+                self -> last = id;
+            }
+
+            assert ( self -> id2node != NULL );
+            self -> id2node [ id - self -> first ] = node;
+        }
+    }
+
+    return rc;
+}
+
+/* drop string from trie and all mappings */
+rc_t KTrieIndexDelete_v1 ( KTrieIndex_v1 *self, bool proj, const char *str )
+{
+    rc_t rc;
+
+    String key;
+    KTrieIdxNode_v1 *node;
+
+#if DISABLE_PROJ
+    proj = 0;
+#endif
+
+    /* detect first modification */
+    if ( self -> last < self -> first )
+    {
+        /* detect persisted data */
+        if ( self -> pt . key2id != NULL )
+        {
+            rc = KTrieIndexAttach_v1 ( self, proj, 0 );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        /* create empty projection array */
+        else if ( proj )
+        {
+            self -> id2node = malloc ( 4096 * sizeof self -> id2node [ 0 ] );
+            if ( self -> id2node == NULL )
+                return RC ( rcDB, rcIndex, rcRemoving, rcMemory, rcExhausted );
+            self -> first = self -> last = 0;
+            self -> len = 4096;
+        }
+    }
+
+    /* interface states that all objects are dropped.
+       however, this implementation only allows unique
+       mappings, so a simple find is sufficient */
+    StringInitCString ( & key, str );
+    node = ( KTrieIdxNode_v1* ) TrieFind ( & self -> key2id, & key );
+    if ( node == NULL )
+        return RC ( rcDB, rcIndex, rcRemoving, rcString, rcNotFound );
+
+    /* drop from projection index */
+    if ( self -> id2node != NULL &&
+         node -> id >= self -> first &&
+         node -> id <= self -> last )
+    {
+        assert ( self -> id2node [ node -> id - self -> first ] == node );
+        if ( node -> id == self -> last )
+        {
+            if ( -- self -> last < self -> first )
+            {
+                free ( self -> id2node );
+                self -> id2node = NULL;
+                self -> len = 0;
+            }
+        }
+        else if ( node -> id == self -> first )
+        {
+            memmove ( self -> id2node, self -> id2node + 1,
+                ( self -> last - self -> first ) * sizeof self -> id2node [ 0 ] );
+            ++ self -> first;
+        }
+        else
+        {
+            self -> id2node [ node -> id - self -> first ] = NULL;
+        }
+    }
+
+    TrieUnlink ( & self -> key2id, & node -> n );
+    KTrieIdxNodeWhack_v1 ( & node -> n, NULL );
+
+    return 0;
+}
+
+/* map key to id ( was Key2Id ) */
+rc_t KTrieIndexFind_v1 ( const KTrieIndex_v1 *self, const char *str, uint32_t *id,
+    int ( CC * custom_cmp ) ( const void *item, const PBSTNode *n, void *data ), void * data )
+{
+    String key;
+
+    if ( self -> last < self -> first )
+    {
+        if ( self -> pt . key2id != NULL )
+        {
+            PTNode n;
+            uint32_t nid;
+            StringInitCString ( & key, str );
+            nid = PTrieFind ( self -> pt . key2id, & key, & n, custom_cmp ,data);
+            if ( nid != 0 )
+            {
+                assert ( n . data . size == sizeof * id );
+                memmove ( id, n . data . addr, sizeof * id );
+                return 0;
+            }
+        }
+    }
+    else
+    {
+        const KTrieIdxNode_v1 *n;
+
+        StringInitCString ( & key, str );
+        n = ( const KTrieIdxNode_v1* ) TrieFind ( & self -> key2id, & key );
+        if ( n != NULL )
+        {
+            * id = n -> id;
+            return 0;
+        }
+    }
+
+    return RC ( rcDB, rcIndex, rcSelecting, rcString, rcNotFound );
+}
+
+/* projection index id to key-string ( was Id2Key ) */
+rc_t KTrieIndexProject_v1 ( const KTrieIndex_v1 *self,
+    uint32_t id, char *key_buff, size_t buff_size, size_t *actsize )
+{
+    if ( self -> last < self -> first )
+    {
+        if ( self -> pt . id2node != NULL &&
+             id >= self -> pt . first &&
+             id <= self -> pt . last )
+        {
+            PTNode n;
+            uint32_t node = self -> pt . id2node [ id - self -> pt . first ];
+            rc_t rc = PTrieGetNode ( self -> pt . key2id,
+                & n, self -> pt . byteswap ? bswap_32 ( node ) : node );
+            if ( rc == 0 )
+            {
+                const String *key;
+                rc = PTNodeMakeKey ( & n, & key );
+                if ( rc == 0 )
+                {
+                    if (actsize)
+                        *actsize = key -> size;
+                    
+                    if ( key -> size >= buff_size )
+                        rc = RC ( rcDB, rcIndex, rcProjecting, rcBuffer, rcInsufficient );
+                    else
+                        string_copy ( key_buff, buff_size, key -> addr, key -> size );
+
+                    StringWhack ( ( String* ) key );
+                    return rc;
+                }
+            }
+        }
+    }
+    else
+    {
+        if ( self -> id2node != NULL &&
+             id >= self -> first &&
+             id <= self -> last )
+        {
+            const KTrieIdxNode_v1 *n = self -> id2node [ id - self -> first ];
+            if ( n != NULL )
+            {
+                if ( n -> n . key . size >= buff_size )
+                    return RC ( rcDB, rcIndex, rcProjecting, rcBuffer, rcInsufficient );
+                string_copy ( key_buff, buff_size,
+                    n -> n . key . addr, n -> n . key . size );
+                return 0;
+            }
+        }
+    }
+
+    return RC ( rcDB, rcIndex, rcProjecting, rcId, rcNotFound );
+}
diff --git a/libs/kdb/wtrieidx-v2.c b/libs/kdb/wtrieidx-v2.c
new file mode 100644
index 0000000..bf835ba
--- /dev/null
+++ b/libs/kdb/wtrieidx-v2.c
@@ -0,0 +1,2560 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#include "windex-priv.h"
+#include "trieidx-priv.h"
+
+#include <kdb/index.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kfs/mmap.h>
+#include <klib/ptrie.h>
+#include <klib/text.h>
+#include <klib/pack.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <byteswap.h>
+
+#include <stdlib.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#define KTRIE_ZEROS_KPTRIE 1
+
+/*--------------------------------------------------------------------------
+ * KPTrieIndex_v2
+ *  persisted keymap
+ */
+
+
+/* Init
+ *  opens and initializes persisted keymap structure
+ */
+static
+rc_t KPTrieIndexInitID2Ord ( KPTrieIndex_v2 *self, size_t in_size,
+    int variant, int span_bits, int elem_bits )
+{
+    rc_t rc;
+    union
+    {
+        uint8_t *v8;
+        uint16_t *v16;
+        uint32_t *v32;
+        uint64_t *v64;
+    } dst;
+    size_t elem_bytes = elem_bits >> 3;
+    uint32_t scount = self -> count - 1;
+
+    assert ( self -> count != 0 );
+
+    if ( span_bits * scount > in_size * 8 )
+        return RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+
+    dst . v8 = malloc ( self -> count * elem_bytes );
+    if ( dst . v8 == NULL )
+        rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        size_t usize;
+        rc = Unpack ( span_bits, elem_bits,
+            & self -> ord2node [ self -> count ], 0,
+            span_bits * scount, NULL, & dst . v8 [ elem_bytes ],
+            scount * elem_bytes, & usize );
+        if ( rc == 0 )
+        {
+            uint32_t i;
+
+            self -> id2ord . v8 = dst . v8;
+            self -> variant = variant;
+
+            /* integrate to simple translation */
+            switch ( variant )
+            {
+            case 1:
+                dst . v8 [ 0 ] = 0;
+                for ( i = 0; i < scount; ++ i )
+                    dst . v8 [ i + 1 ] += dst . v8 [ i ];
+                break;
+            case 2:
+                dst . v16 [ 0 ] = 0;
+                for ( i = 0; i < scount; ++ i )
+                    dst . v16 [ i + 1 ] += dst . v16 [ i ];
+                break;
+            case 3:
+                dst . v32 [ 0 ] = 0;
+                for ( i = 0; i < scount; ++ i )
+                    dst . v32 [ i + 1 ] += dst . v32 [ i ];
+                break;
+            case 4:
+                dst . v64 [ 0 ] = 0;
+                for ( i = 0; i < scount; ++ i )
+                    dst . v64 [ i + 1 ] += dst . v64 [ i ];
+                break;
+            }
+
+            return 0;
+        }
+
+        free ( dst . v8 );
+    }
+
+    return rc;
+}
+
+static
+void CC KPTrieIndexExtractV1Range_v2 ( PTNode *n, void *data )
+{
+    KPTrieIndex_v2 *self = data;
+
+    /* capture node id */
+    uint32_t id;
+    assert ( n -> data . size == sizeof id );
+    memmove ( & id, n -> data . addr, sizeof id );
+
+    /* perform min/max */
+    if ( self -> count == 0 )
+        self -> first = self -> last = id;
+    else if ( id < self -> first )
+        self -> first = id;
+    else if ( id > self -> last )
+        self -> last = id;
+
+    ++ self -> count;
+}
+
+static
+rc_t KPTrieIndexInitFromV1_v2 ( KPTrieIndex_v2 *self, const KMMap *mm, bool byteswap )
+{
+    KPTrieIndex_v1 v1;
+    rc_t rc = KPTrieIndexInit_v1 ( & v1, mm, byteswap );
+    if ( rc == 0 )
+    {
+        uint32_t *ord2node;
+        uint32_t total_id, test_id;
+        uint32_t i, id, id_bits, num_ids;
+
+        /* hopefully we got a projection index */
+        if ( v1 . id2node == NULL )
+        {
+#if ! KTRIE_ZEROS_KPTRIE
+            self -> count = 0;
+#endif
+            /* need to derive first and last from trie */
+            PTrieForEach ( v1 . key2id, KPTrieIndexExtractV1Range_v2, self );
+            if ( self -> count == 0 )
+                KPTrieIndexWhack_v1 ( & v1 );
+            else
+            {
+                /* take trie as-is */
+                self -> key2id = v1 . key2id;
+                self -> maxid = self -> last;
+            }
+
+            /* note that this assumes a span of 1 for
+               each id. there are no known uses of v1 without
+               a projection index, so this is unlikely to be important */
+
+            return 0;
+        }
+
+        /* take id range */
+        self -> first = v1 . first;
+        self -> last = self -> maxid = v1 . last;
+
+        /* count comes from trie as always */
+        self -> count = PTrieCount ( v1 . key2id );
+
+        /* detect empty trie */
+        if ( self -> count == 0 || self -> first > self -> last )
+        {
+            self -> first = self -> last = self -> maxid = 0;
+            return 0;
+        }
+
+        /* take trie as-is */
+        self -> key2id = v1 . key2id;
+
+        /* now decide whether to use 1-1 or sparse projection */
+        if ( ( self -> last - self -> first ) < ( ( int64_t ) self -> count << 1 ) )
+        {
+            /* take the old projection array as-is,
+               treating NULL node ids as holes */
+            self -> ord2node = v1 . id2node;
+            return 0;
+        }
+
+        /* convert to sparse
+           calculate id bits - notice that
+           total_id gets right shifted so that
+           the loop is guaranteed to exit */
+        num_ids = ( uint32_t ) ( self -> last - self -> first + 1 );
+        for ( total_id = num_ids >> 1, id_bits = 1, test_id = 1;
+            test_id <= total_id;
+            ++ id_bits, test_id <<= 1 )
+            ( void ) 0;
+
+        /* determine variant */
+        if ( id_bits <= 8 )
+        {
+            /* allocate 4 bytes for new ord2node and 1 for id2ord */
+            uint8_t *id2ord = malloc ( self -> count * 5 );
+            if ( id2ord == NULL )
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                ord2node = ( uint32_t* ) & id2ord [ self -> count ];
+                self -> ord2node = ord2node;
+                self -> id2ord . v8 = id2ord;
+                self -> variant = 1;
+
+                /* walk across v1 table, looking at each id */
+                for ( i = id = 0; id < num_ids; ++ id )
+                {
+                    /* detect non NULL node ids
+                       and pretend they represent a contiguous
+                       span with no holes in id space */
+                    if ( v1 . id2node [ id ] != 0 )
+                    {
+                        /* prevent overwriting */
+                        if ( i == self -> count )
+                        {
+                            rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+                            break;
+                        }
+
+                        /* record id and node for slot */
+                        id2ord [ i ] = ( uint8_t ) id;
+                        ord2node [ i ] = v1 . id2node [ id ];
+                        ++ i;
+                    }
+                }
+            }
+        }
+        else if ( id_bits <= 16 )
+        {
+            uint16_t *id2ord = malloc ( self -> count * 6 );
+            if ( id2ord == NULL )
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                ord2node = ( uint32_t* ) & id2ord [ self -> count ];
+                self -> ord2node = ord2node;
+                self -> id2ord . v16 = id2ord;
+                self -> variant = 2;
+
+                for ( i = id = 0; id < num_ids; ++ id )
+                {
+                    if ( v1 . id2node [ id ] != 0 )
+                    {
+                        if ( i == self -> count )
+                        {
+                            rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+                            break;
+                        }
+
+                        id2ord [ i ] = ( uint16_t ) id;
+                        ord2node [ i ] = v1 . id2node [ id ];
+                        ++ i;
+                    }
+                }
+            }
+        }
+        else
+        {
+            uint32_t *id2ord = malloc ( self -> count * 8 );
+            if ( id2ord == NULL )
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                ord2node = & id2ord [ self -> count ];
+                self -> ord2node = ord2node;
+                self -> id2ord . v32 = id2ord;
+                self -> variant = 3;
+
+                for ( i = id = 0; id < num_ids; ++ id )
+                {
+                    if ( v1 . id2node [ id ] != 0 )
+                    {
+                        if ( i == self -> count )
+                        {
+                            rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+                            break;
+                        }
+
+                        id2ord [ i ] = id;
+                        ord2node [ i ] = v1 . id2node [ id ];
+                        ++ i;
+                    }
+                }
+            }
+        }
+
+        if ( rc == 0 )
+        {        
+            if ( i == self -> count )
+                return 0;
+            rc = RC ( rcDB, rcIndex, rcConstructing, rcIndex, rcCorrupt );
+        }
+
+        KPTrieIndexWhack_v1 ( & v1 );
+    }
+
+    return rc;
+}
+
+rc_t KPTrieIndexInit_v2 ( KPTrieIndex_v2 *self, const KMMap *mm, bool byteswap )
+{
+    /* get size of map, assumed to be size of file */
+    size_t size;
+    rc_t rc = KMMapSize ( mm, & size );
+    if ( rc == 0 )
+    {
+        const KPTrieIndexHdr_v2 *hdr;
+
+#if ! KTRIE_ZEROS_KPTRIE
+        self -> mm = NULL;
+        self -> ord2node = NULL;
+        self -> id2ord . v32 = NULL;
+        self -> variant = 0;
+#endif
+
+        /* ignore empty file */
+        if ( size == 0 )
+        {
+#if ! KTRIE_ZEROS_KPTRIE
+            self -> first = self -> last = self -> maxid = 0;
+            self -> key2id = NULL;
+            self -> count = 0;
+#endif
+            return 0;
+        }
+
+        /* have to have at least the base header */
+        if ( size < sizeof hdr -> dad )
+            return RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+
+        rc = KMMapAddrRead ( mm, ( const void** ) & hdr );
+        if ( rc == 0 )
+        {
+            /* recheck header size */
+            if ( size < sizeof * hdr )
+                return RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+
+            self -> first = hdr -> first;
+            self -> last = self -> maxid = hdr -> last;
+            self -> id_bits = ( uint8_t ) hdr -> id_bits;
+            self -> span_bits = ( uint8_t ) hdr -> span_bits;
+            self -> byteswap = byteswap;
+
+            /* try to create the pttree */
+            rc = PTrieMakeOrig ( & self -> key2id,
+                hdr + 1, size -= sizeof * hdr, byteswap );
+            if ( rc == 0 )
+            {
+                size_t ptsize = PTrieSize ( self -> key2id );
+                if ( ptsize <= size )
+                {
+                    /* the count covers at least the number of trie nodes */
+                    self -> count = PTrieCount ( self -> key2id );
+
+                    /* it could be stored without projection */
+                    if ( ptsize == size )
+                        return 0;
+
+                    /* calculate remaining bytes */                     
+                    size -= ptsize;
+
+                    /* there must be enough for an array of 4-byte node ids */
+                    if ( size >= ( ( size_t ) self -> count << 2 ) )
+                    {
+                        /* take the persisted array as-is */
+                        self -> ord2node = ( const uint32_t* )
+                            ( ( const char* ) ( hdr + 1 ) + ptsize );
+
+                        /* read the count */
+                        if ( size >= 4 )
+                        {
+                            self -> count = * ( self -> ord2node ) ++;
+                            size -= 4;
+                        }
+
+                        /* determine strategy from id span and count */
+                        if ( ( self -> last - self -> first ) < ( ( int64_t ) self -> count << 1 ) )
+                        {
+                            /* must be contiguous */
+                            self -> count = ( uint32_t ) ( self -> last - self -> first + 1 );
+
+                            /* size should be exactly this number of slots */
+                            if ( size == ( ( size_t ) self -> count << 2 ) )
+                                return 0;
+
+                            /* fall through to error return */
+                        }
+                        else if ( ( size == 4 && self -> count == 1 ) || size > ( ( size_t ) self -> count << 2 ) )
+                        {
+                            /* sparse */
+                            size -= ( size_t ) self -> count << 2;
+
+                            /* unpack id map */
+                            if ( hdr -> id_bits <= 8 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 1, hdr -> span_bits, 8 );
+                            else if ( hdr -> id_bits <= 16 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 2, hdr -> span_bits, 16 );
+                            else if ( hdr -> id_bits <= 32 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 3, hdr -> span_bits, 32 );
+                            else
+                                rc = KPTrieIndexInitID2Ord ( self, size, 4, hdr -> span_bits, 64 );
+
+                            /* done */
+                            if ( rc == 0 )
+                                return 0;
+
+                            PTrieWhack ( self -> key2id ), self -> key2id = NULL;
+                            return rc;
+                        }
+                    }
+                }
+
+                PTrieWhack ( self -> key2id ), self -> key2id = NULL;
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+            }
+        }
+    }
+
+    return rc;
+}
+
+rc_t KPTrieIndexInit_v3_v4 ( KPTrieIndex_v2 *self, const KMMap *mm, bool byteswap, bool ptorig )
+{
+    /* get size of map, assumed to be size of file */
+    size_t size;
+    rc_t rc = KMMapSize ( mm, & size );
+    if ( rc == 0 )
+    {
+        const KPTrieIndexHdr_v3 *hdr;
+
+#if ! KTRIE_ZEROS_KPTRIE
+        self -> mm = NULL;
+        self -> ord2node = NULL;
+        self -> id2ord . v32 = NULL;
+        self -> variant = 0;
+#endif
+
+        /* ignore empty file */
+        if ( size == 0 )
+        {
+#if ! KTRIE_ZEROS_KPTRIE
+            self -> first = self -> last = self -> maxid = 0;
+            self -> key2id = NULL;
+            self -> count = 0;
+#endif
+            return 0;
+        }
+
+        /* have to have at least the base header */
+        if ( size < sizeof hdr -> dad )
+            return RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+
+        rc = KMMapAddrRead ( mm, ( const void** ) & hdr );
+        if ( rc == 0 )
+        {
+            /* recheck header size */
+            if ( size < sizeof * hdr )
+                return RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+
+            self -> first = hdr -> first;
+            self -> last = self -> maxid = hdr -> last;
+            self -> id_bits = ( uint8_t ) hdr -> id_bits;
+            self -> span_bits = ( uint8_t ) hdr -> span_bits;
+            self -> byteswap = byteswap;
+
+            /* try to create the pttree */
+            rc = ( ptorig ? PTrieMakeOrig : PTrieMake )
+                ( & self -> key2id, hdr + 1, size -= sizeof * hdr, byteswap );
+            if ( rc == 0 )
+            {
+                size_t ptsize = PTrieSize ( self -> key2id );
+                if ( ptsize <= size )
+                {
+                    /* the count covers at least the number of trie nodes */
+                    self -> count = PTrieCount ( self -> key2id );
+
+                    /* it could be stored without projection */
+                    if ( ptsize == size )
+                        return 0;
+
+                    /* calculate remaining bytes */                     
+                    size -= ptsize;
+
+                    /* there must be enough for an array of 4-byte node ids */
+                    if ( size >= ( ( size_t ) self -> count << 2 ) )
+                    {
+                        /* take the persisted array as-is */
+                        self -> ord2node = ( const uint32_t* )
+                            ( ( const char* ) ( hdr + 1 ) + ptsize );
+
+                        /* read the count */
+                        if ( size >= 4 )
+                        {
+                            self -> count = * ( self -> ord2node ) ++;
+                            size -= 4;
+                        }
+
+                        /* determine strategy from id span and count */
+                        if ( ( self -> last - self -> first ) < ( ( int64_t ) self -> count << 1 ) )
+                        {
+                            /* must be contiguous */
+                            self -> count = ( uint32_t ) ( self -> last - self -> first + 1 );
+
+                            /* size should be exactly this number of slots */
+                            if ( size == ( ( size_t ) self -> count << 2 ) )
+                                return 0;
+
+                            /* fall through to error return */
+                        }
+                        else if ( ( size == 4 && self -> count == 1 ) || size > ( ( size_t ) self -> count << 2 ) )
+                        {
+                            /* sparse */
+                            size -= ( size_t ) self -> count << 2;
+
+                            /* unpack id map */
+                            if ( hdr -> id_bits <= 8 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 1, hdr -> span_bits, 8 );
+                            else if ( hdr -> id_bits <= 16 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 2, hdr -> span_bits, 16 );
+                            else if ( hdr -> id_bits <= 32 )
+                                rc = KPTrieIndexInitID2Ord ( self, size, 3, hdr -> span_bits, 32 );
+                            else
+                                rc = KPTrieIndexInitID2Ord ( self, size, 4, hdr -> span_bits, 64 );
+
+                            /* done */
+                            if ( rc == 0 )
+                                return 0;
+
+                            PTrieWhack ( self -> key2id ), self -> key2id = NULL;
+                            return rc;
+                        }
+                    }
+                }
+
+                PTrieWhack ( self -> key2id ), self -> key2id = NULL;
+                rc = RC ( rcDB, rcIndex, rcConstructing, rcTrie, rcCorrupt );
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* Whack
+ *  closes down keymap
+ */
+void KPTrieIndexWhack_v2 ( KPTrieIndex_v2 *self )
+{
+    free ( ( void* ) self -> id2ord . v8 );
+    PTrieWhack ( self -> key2id );
+    KMMapRelease ( self -> mm );
+    memset ( self, 0, sizeof * self );
+}
+
+uint32_t KPTrieIndexID2Ord_v2 ( const KPTrieIndex_v2 *self, int64_t id )
+{
+    if ( id >= self -> first && id <= self -> maxid )
+    {
+        int64_t nid;
+        uint32_t left, right, ord, count = self -> count;
+
+        /* convert id either to a zero-based ord,
+           or else the translated id in id2ord */
+        id -= self -> first;
+
+        /* handle type of projection */
+        switch ( self -> variant )
+        {
+        case 0:
+            /* return one-based ord */
+            return ( uint32_t ) ( id + 1 );
+
+        case 1:
+            for ( left = 1, right = count; left <= right; )
+            {
+                ord = ( left + right ) >> 1;
+                nid = self -> id2ord . v8 [ ord - 1 ];
+                if ( id == nid )
+                    return ord;
+
+                if ( id < nid )
+                {
+                    right = ord - 1;
+                    continue;
+                }
+                if ( ord == count )
+                    return ord;
+
+                nid = self -> id2ord . v8 [ ord ];
+                if ( id < nid )
+                    return ord;
+
+                left = ord + 1;
+            }
+            break;
+
+        case 2:
+            for ( left = 1, right = count; left <= right; )
+            {
+                ord = ( left + right ) >> 1;
+                nid = self -> id2ord . v16 [ ord - 1 ];
+                if ( id == nid )
+                    return ord;
+
+                if ( id < nid )
+                {
+                    right = ord - 1;
+                    continue;
+                }
+                if ( ord == count )
+                    return ord;
+
+                nid = self -> id2ord . v16 [ ord ];
+                if ( id < nid )
+                    return ord;
+
+                left = ord + 1;
+            }
+            break;
+
+        case 3:
+            for ( left = 1, right = count; left <= right; )
+            {
+                ord = ( left + right ) >> 1;
+                nid = self -> id2ord . v32 [ ord - 1 ];
+                if ( id == nid )
+                    return ord;
+
+                if ( id < nid )
+                {
+                    right = ord - 1;
+                    continue;
+                }
+                if ( ord == count )
+                    return ord;
+
+                nid = self -> id2ord . v32 [ ord ];
+                if ( id < nid )
+                    return ord;
+
+                left = ord + 1;
+            }
+            break;
+
+        case 4:
+            for ( left = 1, right = count; left <= right; )
+            {
+                ord = ( left + right ) >> 1;
+                nid = self -> id2ord . v64 [ ord - 1 ];
+                if ( id == nid )
+                    return ord;
+
+                if ( id < nid )
+                {
+                    right = ord - 1;
+                    continue;
+                }
+                if ( ord == count )
+                    return ord;
+
+                nid = self -> id2ord . v64 [ ord ];
+                if ( id < nid )
+                    return ord;
+
+                left = ord + 1;
+            }
+            break;
+        }
+    }
+    return 0;
+}
+
+static
+rc_t KPTrieIndexProject_v2 ( const KPTrieIndex_v2 *self,
+    int64_t id,
+#if V2FIND_RETURNS_SPAN
+    int64_t *start_id, uint32_t *span,
+#endif
+    char *key_buff, size_t buff_size, size_t *actsize )
+{
+    uint32_t nid, ord = KPTrieIndexID2Ord_v2 ( self, id );
+    if ( ord != 0 )
+    {
+        assert ( start_id != NULL );
+        assert ( span != NULL );
+
+        nid = self -> ord2node [ ord - 1 ];
+
+        switch ( self -> variant )
+        {
+        case 0:
+            * start_id = id;
+            for ( ; ord < self -> count; ++ ord )
+            {
+                if ( nid != self -> ord2node [ ord ] )
+                    break;
+            }
+            * span = self -> first + ord - * start_id;
+            break;
+        case 1:
+            * start_id = self -> id2ord . v8 [ ord - 1 ];
+            * span = ( uint32_t ) ( ( ( ord == self -> count ) ?
+                ( self -> maxid  - self -> first + 1 ) : self -> id2ord . v8 [ ord ] ) - * start_id );
+            *start_id += self->first; 
+            break;
+        case 2:
+            * start_id = self -> id2ord . v16 [ ord - 1 ];
+            * span = ( uint32_t ) ( ( ( ord == self -> count ) ?
+                ( self -> maxid  - self -> first + 1 ) : self -> id2ord . v16 [ ord ] ) - * start_id );
+            *start_id += self->first; 
+            break;
+        case 3:
+            * start_id = self -> id2ord . v32 [ ord - 1 ];
+            * span = ( uint32_t ) ( ( ( ord == self -> count ) ?
+                ( self -> maxid  - self -> first + 1 ) : self -> id2ord . v32 [ ord ] ) - * start_id );
+            *start_id += self->first; 
+            break;
+        case 4:
+            * start_id = self -> id2ord . v64 [ ord - 1 ];
+            * span = ( uint32_t ) ( ( ( ord == self -> count ) ?
+                ( self -> maxid  - self -> first + 1 ) : self -> id2ord . v64 [ ord ] ) - * start_id );
+            *start_id += self->first; 
+            break;
+        }
+
+        if ( nid != 0 )
+        {
+            rc_t rc;
+            PTNode node;
+
+            if ( self -> byteswap )
+                nid = bswap_32 ( nid );
+
+            rc = PTrieGetNode ( self -> key2id, & node, nid );
+            if ( rc == 0 )
+            {
+                const String *key;
+                rc = PTNodeMakeKey ( & node, & key );
+                if ( rc == 0 )
+                {
+                    if (actsize)
+                        *actsize = key -> size;
+                    if ( key -> size >= buff_size )
+                        rc = RC ( rcDB, rcIndex, rcProjecting, rcBuffer, rcInsufficient );
+                    else
+                        string_copy ( key_buff, buff_size, key -> addr, key -> size );
+
+                    StringWhack ( ( String* ) key );
+                }
+            }
+            return rc;
+        }
+    }
+
+    return RC ( rcDB, rcIndex, rcProjecting, rcId, rcNotFound );
+}
+
+/* Find
+ */
+static
+rc_t KPTrieIndexFind_v2 ( const KPTrieIndex_v2 *self,
+    const char *str, int64_t *start_id,
+#if V2FIND_RETURNS_SPAN
+    uint32_t *span,
+#endif
+    int ( CC * custom_cmp ) ( const void *item, const PBSTNode *n, void *data ), void *data, bool convertFromV1 )
+{
+    rc_t rc;
+
+    /* detect empty index */
+    if ( self -> count == 0 )
+        rc = RC ( rcDB, rcIndex, rcSelecting, rcString, rcNotFound );
+    else
+    {
+        uint32_t nid;
+        PTNode pnode;
+
+        String key;
+        StringInitCString ( & key, str );
+
+        /* try to find string */
+        nid = PTrieFind ( self -> key2id, & key, & pnode, custom_cmp, data );
+        if ( nid == 0 )
+            rc = RC ( rcDB, rcIndex, rcSelecting, rcString, rcNotFound );
+        else
+        {
+            size_t usize;
+
+            /* detect conversion from v1 */
+            if ( convertFromV1 && self -> id_bits == 0 )
+            {
+                /* v1 stored tree will have just a 32-bit spot id as data */
+                uint32_t id;
+                assert ( pnode . data . size == sizeof id );
+                memmove ( & id, pnode . data . addr, sizeof id );
+                * start_id = id;
+                rc = 0;
+            }
+            else
+            {
+                /* should be native v2 */
+                rc = Unpack ( self -> id_bits, sizeof * start_id * 8,
+                    pnode . data . addr, 0, self -> id_bits, NULL,
+                    start_id, sizeof * start_id, & usize );
+                * start_id += self -> first;
+            }
+
+            if ( rc == 0 )
+            {
+#if V2FIND_RETURNS_SPAN
+                if ( self -> ord2node != NULL )
+                {
+                    uint32_t ord = KPTrieIndexID2Ord_v2 ( self, * start_id );
+                    if ( ord == 0 )
+                        rc = RC ( rcDB, rcIndex, rcSelecting, rcId, rcNotFound );
+                    else if ( ord == self -> count )
+                        * span = self -> maxid - * start_id + 1;
+                    else switch ( self -> variant )
+                    {
+                    case 0:
+                        for ( ; ord < self -> count; ++ ord )
+                        {
+                            if ( nid != self -> ord2node [ ord ] )
+                                break;
+                        }
+                        * span = self -> first + ord - * start_id;
+                        break;
+                    case 1:
+                        * span = self -> first + self -> id2ord . v8 [ ord ] - * start_id;
+                        break;
+                    case 2:
+                        * span = self -> first + self -> id2ord . v16 [ ord ] - * start_id;
+                        break;
+                    case 3:
+                        * span = self -> first + self -> id2ord . v32 [ ord ] - * start_id;
+                        break;
+                    case 4:
+                        * span = self -> first + self -> id2ord . v64 [ ord ] - * start_id;
+                        break;
+                    }
+                }
+                else if ( self -> span_bits == 0 )
+                    * span = 1;
+                else
+                {
+                    rc = Unpack ( self -> span_bits, sizeof * span * 8,
+                        pnode . data . addr, 0, self -> id_bits, NULL,
+                        span, sizeof * span, & usize );
+                }
+#endif
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIdxNode_v2
+ */
+
+static
+rc_t KTrieIdxNodeMake_v2_s1 ( KTrieIdxNode_v2_s1 **n, const String *key, int64_t id )
+{
+    rc_t rc = TNodeMake ( ( TNode** ) n, sizeof ** n + key -> size );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcDB, rcIndex, rcInserting );
+    else
+    {
+        KTrieIdxNode_v2_s1 *node = * n;
+        string_copy ( node -> key, key -> size + 1, key -> addr, key -> size);
+        StringInit ( & node -> n . key, node -> key, key -> size, key -> len );
+        node -> start_id = id;
+    }
+
+    return rc;
+}
+
+static
+rc_t KTrieIdxNodeMakeHole_v2_s1 ( KTrieIdxNode_v2_s1 **n, int64_t id )
+{
+    rc_t rc = TNodeMake ( ( TNode** ) n, sizeof ** n );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcDB, rcIndex, rcInserting );
+    else
+    {
+        KTrieIdxNode_v2_s1 *node = * n;
+        node -> key [ 0 ] = 0;
+        StringInit ( & node -> n . key, node -> key, 0, 0 );
+        node -> start_id = id;
+    }
+
+    return rc;
+}
+
+static
+rc_t KTrieIdxNodeMake_v2_s2 ( KTrieIdxNode_v2_s2 **n, const String *key, int64_t id )
+{
+    rc_t rc = TNodeMake ( ( TNode** ) n, sizeof ** n + key -> size );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcDB, rcIndex, rcInserting );
+    else
+    {
+        KTrieIdxNode_v2_s2 *node = * n;
+        string_copy ( node -> key, key -> size + 1, key -> addr, key -> size);
+        StringInit ( & node -> n . key, node -> key, key -> size, key -> len );
+        node -> start_id = id;
+        node -> span = 1;
+    }
+    return rc;
+}
+
+static
+void CC KTrieIdxNodeWhack_v2 ( TNode *n, void *data )
+{
+    TNodeWhack ( n );
+}
+
+#if 0
+static
+void CC KTrieIdxNodeUnlink_v2 ( TNode *n, void *data )
+{
+    if ( TrieUnlink ( data, n ) )
+        TNodeWhack ( n );
+}
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KTrieIndex_v2
+ */
+
+static
+uint32_t KTrieIndexID2Ord_v2 ( const KTrieIndex_v2 *self, int64_t id )
+{
+    if ( id >= self -> first && id <= self -> last )
+    {
+        uint32_t left, right, count = self -> count;
+        for ( left = 1, right = count; left <= right; )
+        {
+            uint32_t ord = ( left + right ) >> 1;
+            const KTrieIdxNode_v2_s1 *node = self -> ord2node [ ord - 1 ];
+            if ( id == node -> start_id )
+                return ord;
+
+            if ( id < node -> start_id )
+            {
+                right = ord - 1;
+                continue;
+            }
+
+            if ( ord == count )
+                return ord;
+
+            node = self -> ord2node [ ord ];
+            if ( id < node -> start_id )
+                return ord;
+
+            left = ord + 1;
+        }
+    }
+    return 0;
+}
+
+static
+uint32_t KTrieIndexNode2Ord_v2 ( const KTrieIndex_v2 *self, const KTrieIdxNode_v2_s1 *node )
+{
+    if ( self -> ord2node != NULL )
+        return KTrieIndexID2Ord_v2 ( self, node -> start_id );
+    return 0;
+}
+
+/* KTrieIndexWrite_v2
+ */
+typedef struct PersistTrieData PersistTrieData;
+struct PersistTrieData
+{
+    uint64_t pos;
+    KFile *f;
+    KMD5File *fmd5;
+    uint8_t *buffer;
+    size_t bsize;
+    size_t marker;
+
+    int64_t first;
+    size_t ptt_size;
+    size_t node_data_size;
+    uint16_t id_bits;
+    uint16_t span_bits;
+    rc_t rc;
+};
+
+static
+rc_t CC KTrieIndexWrite_v2 ( void *param,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    PersistTrieData *pb = param;
+    size_t total, to_write;
+
+    for ( total = 0; total < size; total += to_write )
+    {
+        to_write = size - total;
+        if ( pb -> marker + to_write > pb -> bsize )
+            to_write = pb -> bsize - pb -> marker;
+
+        if ( to_write > 0 )
+        {
+            memmove ( pb -> buffer + pb -> marker,
+                ( const uint8_t* ) buffer + total, to_write );
+            pb -> marker += to_write;
+        }
+
+        if ( pb -> marker == pb -> bsize )
+        {
+            size_t num_flushed;
+            pb -> rc = KFileWrite ( pb -> f, pb -> pos,
+                pb -> buffer, pb -> bsize, & num_flushed );
+            if ( pb -> rc != 0 )
+            {
+                * num_writ = 0;
+                return pb -> rc;
+            }
+
+            if ( num_flushed == 0 )
+            {
+                * num_writ = total + to_write;
+                return pb -> rc = RC ( rcDB, rcIndex, rcPersisting, rcTransfer, rcIncomplete );
+            }
+
+            pb -> marker -= num_flushed;
+            pb -> pos += num_flushed;
+
+            if ( pb -> marker != 0 )
+                memmove ( pb -> buffer, pb -> buffer + num_flushed, pb -> marker );
+        }
+    }
+
+    * num_writ = total;
+    return 0;
+}
+
+/* KTrieIndexAux_v2
+ */
+static
+rc_t CC KTrieIndexAux_v2_s1 ( void *param, const void *node, size_t *num_writ,
+    PTWriteFunc write, void *write_param )
+{
+    PersistTrieData *pb = param;
+
+    if ( write != NULL && pb -> node_data_size != 0 )
+    {
+        char buffer [ 8 ];
+        const KTrieIdxNode_v2_s1 *n = node;
+
+        /* pack from 64 possible bits down to total id span */
+        if ( pb -> id_bits != 0 )
+        {
+            /* store name->id mapping as a simple translation
+               from first, because we don't have easy access to
+               neighboring nodes for storage as 1st derivative. */
+            uint64_t idd = n -> start_id - pb -> first;
+
+            bitsz_t psize;
+            rc_t rc = Pack ( 64, pb -> id_bits, & idd,
+                sizeof idd, NULL, buffer, 0, sizeof buffer * 8, & psize );
+            if ( rc != 0 )
+                return rc;
+
+            /* the packing should produce a single unit */
+            if ( psize != pb -> id_bits )
+                return RC ( rcDB, rcIndex, rcPacking, rcData, rcCorrupt );
+        }
+
+        /* write out the node */
+        return ( * write ) ( write_param, buffer, pb -> node_data_size, num_writ );
+    }
+
+    /* will always store an integral number of bytes */
+    * num_writ = pb -> node_data_size;
+    return 0;
+}
+
+static
+rc_t CC KTrieIndexAux_v2_s2 ( void *param, const void *node, size_t *num_writ,
+    PTWriteFunc write, void *write_param )
+{
+    PersistTrieData *pb = param;
+
+    if ( write != NULL && pb -> node_data_size != 0 )
+    {
+        const KTrieIdxNode_v2_s2 *n = node;
+
+        rc_t rc;
+        char buffer [ 12 ];
+        bitsz_t psize, offset;
+
+        if ( pb -> id_bits == 0 )
+            offset = 0;
+        else
+        {
+            /* again store name->id mapping as a simple translation
+               from first, but pack bits tightly */
+            uint64_t idd = n -> start_id - pb -> first;
+            rc = Pack ( 64, pb -> id_bits, & idd,
+                sizeof idd, NULL, buffer, 0, sizeof buffer * 8, & offset );
+            if ( rc != 0 )
+                return rc;
+            if ( offset != pb -> id_bits )
+                return RC ( rcDB, rcIndex, rcPacking, rcData, rcCorrupt );
+        }
+
+        /* now pack id span down to a minimal number of bits
+           6/8/09 - this is known to fail because Pack hasn't been
+           updated to start on a non-0 bit offset */
+        if ( pb -> span_bits != 0 )
+        {
+            rc = Pack ( 32, pb -> span_bits, & n -> span, sizeof n -> span,
+                NULL, buffer, offset, sizeof buffer * 8 - offset, & psize );
+            if ( rc != 0 )
+                return rc;
+            if ( psize != pb -> span_bits )
+                return RC ( rcDB, rcIndex, rcPacking, rcData, rcCorrupt );
+        }
+
+        /* write out packed combination */
+        return ( * write ) ( write_param, buffer, pb -> node_data_size, num_writ );
+    }
+
+    * num_writ = pb -> node_data_size;
+    return 0;
+}
+
+/* KTrieIndexPersist_v*
+ *  write keymap to indicated location
+ */
+#if KDBINDEXVERS == 2
+
+static
+void KTrieIndexPersistHdr_v2 ( KTrieIndex_v2 *self, PersistTrieData *pb )
+{
+    KPTrieIndexHdr_v2 *hdr;
+
+    uint64_t total_id, test_id;
+    uint32_t total_span, test_span;
+
+    pb -> pos = 0;
+
+    hdr = ( KPTrieIndexHdr_v2* ) pb -> buffer;
+    pb -> marker = sizeof * hdr;
+
+    /* stamp version header */
+    KDBHdrInit(&hdr->dad, 2);
+
+    /* store first and last ids */
+    pb -> first = self -> first;
+    hdr -> first = self -> first;
+    hdr -> last = self -> last;
+
+    /* calculate id bits - notice that
+       total_id gets right shifted so that
+       the loop is guaranteed to exit */
+    total_id = self -> last - self -> first;
+    if ( total_id == 0 )
+        pb -> id_bits = 0;
+    else for ( total_id >>= 1, pb -> id_bits = 1, test_id = 1;
+          test_id <= total_id;
+          ++ pb -> id_bits, test_id <<= 1 )
+        ( void ) 0;
+
+    /* if we have maintained a projection index,
+       calculate max span now */
+    if ( self -> ord2node != NULL )
+    {
+        uint32_t i, span, max_span;
+        int64_t cur, prev = self -> first;
+        for ( i = max_span = 1; i < self -> count; prev = cur, ++ i )
+        {
+            cur = self -> ord2node [ i ] -> start_id;
+            span = ( uint32_t ) ( cur - prev );
+            if ( span > max_span )
+                max_span = span;
+        }
+        
+        span = ( uint32_t ) ( self -> last - prev );
+        if ( span > max_span )
+            max_span = span;
+
+        self -> max_span = max_span;
+    }
+
+    /* calculate span bits */
+    total_span = self -> max_span;
+    if ( total_span == 0 )
+        pb -> span_bits = 0;
+    else for ( total_span >>= 1, pb -> span_bits = 1, test_span = 1;
+          test_span <= total_span;
+          ++ pb -> span_bits, test_span <<= 1 )
+        ( void ) 0;
+
+    /* record these as header data */
+    hdr -> id_bits = pb -> id_bits;
+    hdr -> span_bits = pb -> span_bits;
+
+    /* zero trailing junk */
+    hdr -> align [ 0 ] = hdr -> align [ 1 ] = 0;
+}
+
+#else
+
+static
+void KTrieIndexPersistHdr_v3_v4 ( KTrieIndex_v2 *self, PersistTrieData *pb )
+{
+    KPTrieIndexHdr_v3 *hdr;
+
+    uint64_t total_id, test_id;
+    uint32_t total_span, test_span;
+
+    pb -> pos = 0;
+
+    hdr = ( KPTrieIndexHdr_v3* ) pb -> buffer;
+    pb -> marker = sizeof * hdr;
+
+    /* stamp version header */
+    KDBHdrInit(&hdr->dad.h, KDBINDEXVERS);
+    hdr->dad.index_type = kitText;
+
+    /* store first and last ids */
+    pb -> first = self -> first;
+    hdr -> first = self -> first;
+    hdr -> last = self -> last;
+
+    /* calculate id bits - notice that
+       total_id gets right shifted so that
+       the loop is guaranteed to exit */
+    total_id = self -> last - self -> first;
+    if ( total_id == 0 )
+        pb -> id_bits = 0;
+    else for ( total_id >>= 1, pb -> id_bits = 1, test_id = 1;
+          test_id <= total_id;
+          ++ pb -> id_bits, test_id <<= 1 )
+        ( void ) 0;
+
+    /* if we have maintained a projection index,
+       calculate max span now */
+    if ( self -> ord2node != NULL )
+    {
+        uint32_t i, span, max_span;
+        int64_t cur, prev = self -> first;
+        for ( i = max_span = 1; i < self -> count; prev = cur, ++ i )
+        {
+            cur = self -> ord2node [ i ] -> start_id;
+            span = ( uint32_t ) ( cur - prev );
+            if ( span > max_span )
+                max_span = span;
+        }
+        
+        span = ( uint32_t ) ( self -> last - prev );
+        if ( span > max_span )
+            max_span = span;
+
+        self -> max_span = max_span;
+    }
+
+    /* calculate span bits */
+    total_span = self -> max_span;
+    if ( total_span == 0 )
+        pb -> span_bits = 0;
+    else for ( total_span >>= 1, pb -> span_bits = 1, test_span = 1;
+          test_span <= total_span;
+          ++ pb -> span_bits, test_span <<= 1 )
+        ( void ) 0;
+
+    /* record these as header data */
+    hdr -> id_bits = pb -> id_bits;
+    hdr -> span_bits = pb -> span_bits;
+
+    /* zero trailing junk */
+    hdr -> align [ 0 ] = hdr -> align [ 1 ] = 0;
+}
+
+#endif 
+
+static
+rc_t KTrieIndexPersistTrie_v2 ( const KTrieIndex_v2 *self, PersistTrieData *pb )
+{
+    rc_t rc;
+
+    /* persist the trie to file,
+       using tree-internal key storage,
+       capture the image size in pb */
+    if ( self -> ord2node != NULL )
+    {
+        pb -> node_data_size = ( pb -> id_bits + 7 ) >> 3;
+        rc = TriePersist ( & self -> key2id, & pb -> ptt_size,
+            false, KTrieIndexWrite_v2, pb, KTrieIndexAux_v2_s1, pb );
+    }
+    else
+    {
+        pb -> node_data_size = ( pb -> id_bits + pb -> span_bits + 7 ) >> 3;
+        rc = TriePersist ( & self -> key2id, & pb -> ptt_size,
+            false, KTrieIndexWrite_v2, pb, KTrieIndexAux_v2_s2, pb );
+    }
+
+    if ( rc == 0 && pb -> marker != 0 )
+    {
+        size_t num_writ;
+        rc = KFileWrite ( pb -> f, pb -> pos,
+            pb -> buffer, pb -> marker, & num_writ );
+        if ( rc == 0 && num_writ != pb -> marker )
+            rc = RC ( rcDB, rcIndex, rcPersisting, rcTransfer, rcIncomplete );
+    }
+
+    return rc;
+}
+
+
+static
+rc_t KTrieIndexPersistProjContig_v2 ( const KTrieIndex_v2 *self,
+    PersistTrieData *pb, PTrie *tt, uint32_t *ord2node )
+{
+    uint32_t i, j, nid;
+    int64_t id = self -> first;
+    for ( i = j = nid = 0; i < self -> count; ++ id, ++ j, ++ i )
+    {
+        const KTrieIdxNode_v2_s1 *node = self -> ord2node [ i ];
+
+        /* back fill repeats */
+        for ( ; id < node -> start_id; ++ id )
+            ord2node [ j ++ ] = nid;
+
+        /* check for a hole in id space */
+        if ( node -> n . key . size == 0 )
+            nid = 0;
+        else
+        {
+            PTNode pn;
+            nid = PTrieFind ( tt, & node -> n . key, & pn, NULL, NULL );
+            if ( nid == 0 )
+                return RC ( rcDB, rcIndex, rcPersisting, rcTransfer, rcIncomplete );
+        }
+
+        /* record nid for i at j */
+        ord2node [ j ] = nid;
+    }
+
+    /* finish off trailing span */
+    for ( ; id <= self -> last; ++ id )
+        ord2node [ j ++ ] = nid;
+
+    return 0;
+}
+
+static
+rc_t KTrieIndexPersistProjSparse_v2 ( const KTrieIndex_v2 *self,
+    PersistTrieData *pb, PTrie *tt, uint32_t *ord2node, bitsz_t *psize )
+{
+    uint32_t i, nid;
+    int64_t *id2ord = ( void* ) & ord2node [ self -> count ];
+    for ( i = 0; i < self -> count; ++ i )
+    {
+        const KTrieIdxNode_v2_s1 *node = self -> ord2node [ i ];
+
+        /* record negated id for i - see 1st derivative below */
+        id2ord [ i ] = - node -> start_id;
+
+        /* check for a hole in id space */
+        if ( node -> n . key . size == 0 )
+            nid = 0;
+        else
+        {
+            PTNode pn;
+            nid = PTrieFind ( tt, & node -> n . key, & pn, NULL, NULL );
+            if ( nid == 0 )
+                return RC ( rcDB, rcIndex, rcPersisting, rcTransfer, rcIncomplete );
+        }
+
+        /* record nid for i */
+        ord2node [ i ] = nid;
+    }
+
+    /* produce first derivative of ids
+       for any given pair, the 1st derivative is generally
+       right - left, which is usually stored right, such that
+       we start at the end and move left toward the start, i.e.
+
+       right -= left and move left
+
+       in this case, we want to eliminate the leading 0
+       and shift everything down, so we produce the result
+       to the left side and move right toward end, but this
+       requires more complicated arithmetic in order to preserve
+       right - left, i.e.
+
+       left = right - left and move right
+
+       to avoid this arithmetic, the ids were stored negated above
+       which converts the operation into
+
+       left -= right and move right
+    */
+    for ( i = 1; i < self -> count; ++ i )
+        id2ord [ i - 1 ] -= id2ord [ i ];
+
+    /* pack from 64 to span-bits */
+    return Pack ( 64, pb -> span_bits, id2ord, ( size_t ) ( self -> count - 1 ) << 3,
+                NULL, id2ord, 0, ( bitsz_t ) self -> count << 6, psize );
+}
+
+#if KDBINDEXVERS == 2
+
+static
+rc_t KTrieIndexPersistProj_v2 ( const KTrieIndex_v2 *self, PersistTrieData *pb )
+{
+    rc_t rc = 0;
+    void * addr;
+    size_t map_size;
+    uint64_t file_size;
+    size_t num_to_read;
+    uint64_t num_ids;
+    bool is_sparse;
+
+    /* there must be something to do */
+    if ( self -> count == 0 || self -> ord2node == NULL )
+        return 0;
+
+    /* calculate what kind of projection strategy to use:
+       when avg ( id span ) <= 2.0, just use a straight array.
+       otherwise, use two arrays: first for node ids and last
+       being 1st derivative of positional start_ids.
+
+       the calculation of the ratio would be
+         num_ids = self -> last - self -> first + 1;
+         ratio = num_ids / self -> count;
+         if ( ratio <= 2.0 )
+             use 1-1
+         else
+             use sparse
+
+       by reorganizing the comparison, we get
+         if ( num_ids <= 2 * self -> count )...
+    */
+    num_ids = self -> last - self -> first + 1;
+    if ( num_ids <= ( ( uint64_t ) self -> count << 1 ) )
+    {
+        /* store 1-1 projection index */
+        is_sparse = false;
+
+        /* map size is 4 bytes per id */
+        map_size = pb -> ptt_size + ( ( size_t ) num_ids << 2 );
+    }
+    else
+    {
+        /* store sparse projection index */
+        is_sparse = true;
+
+        /* map size for node ids is 4 bytes per slot */
+        map_size = pb -> ptt_size + ( ( size_t ) self -> count << 2 );
+
+        /* map size for 1st derivative ids is initially 8 bytes per slot
+           used initially to store full ids and then reduced 1st deriv. */
+        map_size += ( size_t ) self -> count << 3;
+    }
+
+    /* add in 4 bytes for count */
+    map_size += 4;
+
+    /* create an updatable region spanning from end of header,
+       starting from PTrie and extending to end of projection index */
+    addr = malloc ( map_size );
+    if ( addr == NULL )
+        rc = RC ( rcDB, rcIndex, rcPersisting, rcMemory, rcExhausted );
+    else
+    {
+        size_t num_read;
+
+        rc = KFileSize ( pb -> f, & file_size );
+        num_to_read = file_size - sizeof ( KPTrieIndexHdr_v2 );
+        if ( rc == 0 )
+        {
+            rc = KFileReadAll ( pb -> f, sizeof ( KPTrieIndexHdr_v2 ), addr,
+			     num_to_read, & num_read );
+            if ( rc == 0 )
+            {
+                if ( num_read != num_to_read )
+                {
+                    rc = RC ( rcDB, rcIndex, rcPersisting, rcHeader, rcInsufficient );
+                }
+            }
+        }
+        if ( rc != 0 )
+            free ( addr );
+    }
+
+    if ( rc == 0 )
+    {
+        size_t num_writ;
+        /* inflate the PTrie */
+        PTrie *tt;
+        rc = PTrieMakeOrig ( & tt, addr, pb -> ptt_size );
+        if ( rc == 0 )
+        {
+            uint32_t *ord2node;
+            assert ( pb -> ptt_size == PTrieSize ( tt ) );
+            assert ( self -> count >= PTrieCount ( tt ) );
+            ord2node = ( void* ) ( ( char* ) addr + pb -> ptt_size );
+            assert ( ( ( size_t ) ord2node & 3 ) == 0 );
+            
+            /* set count */
+            * ord2node ++ = self -> count;
+
+            if ( ! is_sparse )
+                rc = KTrieIndexPersistProjContig_v2 ( self, pb, tt, ord2node );
+            else
+            {
+                bitsz_t psize;
+                rc = KTrieIndexPersistProjSparse_v2 ( self, pb, tt, ord2node, & psize );
+                if ( rc == 0 )
+                {
+                    map_size -= ( size_t ) self -> count << 3;
+                    map_size += ( psize + 7 ) >> 3;
+                }
+            }
+
+            /* done with pttree */
+            PTrieWhack ( tt );
+        }
+        rc = KFileWrite ( pb -> f, file_size, 
+			  (uint8_t*)addr + num_to_read,  map_size - num_to_read, & num_writ );
+        if ( rc == 0  &&  num_writ != map_size - num_to_read )
+            rc = RC ( rcDB, rcIndex, rcPersisting, rcHeader, rcInsufficient );
+        free ( addr );
+    }
+
+    return rc;
+}
+
+#else
+
+static
+rc_t KTrieIndexPersistProj_v3 ( const KTrieIndex_v2 *self, PersistTrieData *pb )
+{
+    rc_t rc = 0;
+    void * addr;
+    size_t map_size;
+    uint64_t file_size;
+    size_t num_to_read;
+    uint64_t num_ids;
+    bool is_sparse;
+
+    /* there must be something to do */
+    if ( self -> count == 0 || self -> ord2node == NULL )
+        return 0;
+
+    /* calculate what kind of projection strategy to use:
+       when avg ( id span ) <= 2.0, just use a straight array.
+       otherwise, use two arrays: first for node ids and last
+       being 1st derivative of positional start_ids.
+
+       the calculation of the ratio would be
+         num_ids = self -> last - self -> first + 1;
+         ratio = num_ids / self -> count;
+         if ( ratio <= 2.0 )
+             use 1-1
+         else
+             use sparse
+
+       by reorganizing the comparison, we get
+         if ( num_ids <= 2 * self -> count )...
+    */
+    num_ids = self -> last - self -> first + 1;
+    if ( num_ids <= ( ( uint64_t ) self -> count << 1 ) )
+    {
+        /* store 1-1 projection index */
+        is_sparse = false;
+
+        /* map size is 4 bytes per id */
+        map_size = pb -> ptt_size + ( ( size_t ) num_ids << 2 );
+    }
+    else
+    {
+        /* store sparse projection index */
+        is_sparse = true;
+
+        /* map size for node ids is 4 bytes per slot */
+        map_size = pb -> ptt_size + ( ( size_t ) self -> count << 2 );
+
+        /* map size for 1st derivative ids is initially 8 bytes per slot
+           used initially to store full ids and then reduced 1st deriv. */
+        map_size += ( size_t ) self -> count << 3;
+    }
+
+    /* add in 4 bytes for count */
+    map_size += 4;
+
+    rc = KFileSize ( pb -> f, & file_size );
+    if ( rc == 0 )
+    {
+        /* create an updatable region spanning from end of header,
+           starting from PTrie and extending to end of projection index */
+        addr = malloc ( map_size );
+        if ( addr == NULL )
+            rc = RC ( rcDB, rcIndex, rcPersisting, rcMemory, rcExhausted );
+        else
+        {
+            size_t num_read;
+            num_to_read = file_size - sizeof ( KPTrieIndexHdr_v3 );
+            rc = KFileReadAll ( pb -> f, sizeof ( KPTrieIndexHdr_v3 ),
+                addr, num_to_read, & num_read );
+            if ( rc != 0 )
+                free ( addr );
+            else if ( num_read != num_to_read )
+            {
+                free ( addr );
+                rc = RC ( rcDB, rcIndex, rcPersisting, rcHeader, rcInsufficient );
+            }
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        size_t num_writ;
+        /* inflate the PTrie */
+        PTrie *tt;
+#if KDBINDEXVERS > 3
+        rc = PTrieMake ( & tt, addr, pb -> ptt_size, self -> pt . byteswap );
+#else
+        rc = PTrieMakeOrig ( & tt, addr, pb -> ptt_size, self -> pt . byteswap );
+#endif
+        if ( rc == 0 )
+        {
+            uint32_t *ord2node;
+            assert ( pb -> ptt_size == PTrieSize ( tt ) );
+            assert ( self -> count >= PTrieCount ( tt ) );
+            ord2node = ( void* ) ( ( char* ) addr + pb -> ptt_size );
+            assert ( ( ( size_t ) ord2node & 3 ) == 0 );
+            
+            /* set count */
+            * ord2node ++ = self -> count;
+
+            if ( ! is_sparse )
+                rc = KTrieIndexPersistProjContig_v2 ( self, pb, tt, ord2node );
+            else
+            {
+                bitsz_t psize;
+                rc = KTrieIndexPersistProjSparse_v2 ( self, pb, tt, ord2node, & psize );
+                if ( rc == 0 )
+                {
+                    map_size -= ( size_t ) self -> count << 3;
+                    map_size += ( psize + 7 ) >> 3;
+                }
+            }
+
+            /* done with pttree */
+            PTrieWhack ( tt );
+
+            if ( rc == 0 )
+            {
+                rc = KFileWrite ( pb -> f, file_size, 
+                     ( uint8_t* ) addr + num_to_read,  map_size - num_to_read, & num_writ );
+
+                if ( rc == 0  &&  num_writ != map_size - num_to_read )
+                    rc = RC ( rcDB, rcIndex, rcPersisting, rcHeader, rcInsufficient );
+            }
+        }
+
+        free ( addr );
+    }
+
+    return rc;
+}
+
+#endif
+
+static
+rc_t KTrieIndexCreateMD5Wrapper ( KDirectory *dir, KFile ** fp, KMD5File ** wrapper,
+    char relpath [ 256 ], const char md5_relpath [ 260 ] )
+{
+    /* create the md5 file for read/write */
+    KFile *f;
+    rc_t rc = KDirectoryCreateFile ( dir, & f, true,
+                                      0664, kcmInit, "%s", md5_relpath );
+    if ( rc == 0 )
+    {
+        /* create an md5sum formatter */
+        KMD5SumFmt *fmt;
+        rc = KMD5SumFmtMakeUpdate ( & fmt, f );
+        if ( rc == 0 )
+        {
+            int dot_pos;
+
+            /* convert relative path to a leaf */
+            char *leaf = strrchr ( relpath, '/' );
+            if ( leaf ++ == NULL )
+                leaf = relpath;
+
+            /* trim off ".tmp" from "leaf"
+               so that the format string reflects final name
+               without the need to rename later */
+            dot_pos = strlen ( leaf ) - 4;
+            assert ( dot_pos > 0 );
+            assert ( strcmp ( & leaf [ dot_pos ], ".tmp" ) == 0 );
+            leaf [ dot_pos ] = 0;
+
+            /* "fmt" now owns "f" */
+            f = NULL;
+
+            /* create a file wrapper that calculates and prints md5 */
+            rc = KMD5FileMakeWrite ( wrapper, * fp, fmt, leaf );
+
+            /* "wrapper" attaches a reference to "fmt", so we have to
+               dump our reference regardless of "rc" */
+            KMD5SumFmtRelease ( fmt );
+
+            /* restore dot */
+            leaf [ dot_pos ] = '.';
+
+            /* if we succeeded, swap the "wrapper" for input file */
+            if ( rc == 0 )
+            {
+                * fp = KMD5FileToKFile ( * wrapper );
+                return 0;
+            }
+        }
+
+        /* failed */
+        KFileRelease ( f );
+    }
+
+    return rc;
+}
+
+rc_t KTrieIndexPersist_v2 ( const KTrieIndex_v2 *self,
+    bool proj, KDirectory *dir, const char *path, bool use_md5 )
+{
+    rc_t rc;
+    PersistTrieData pb;
+
+    assert ( self != NULL );
+    if ( self -> count == 0 )
+        return 0;
+
+    pb . fmd5 = NULL;
+
+    /** Trie may have holes in serialization due to memory alignments ***/
+    pb . buffer = calloc ( pb . bsize = 32 * 1024, 1 );
+    if ( pb . buffer == NULL )
+        rc = RC ( rcDB, rcIndex, rcPersisting, rcMemory, rcExhausted );
+    else
+    {
+        /* determine the name of the file:
+           it is created under a temporary name
+           relative to the directory provided */
+        char tmpname [ 256 ];
+        rc = KDirectoryResolvePath ( dir, false,
+            tmpname, sizeof tmpname, "%s.tmp", path );
+        if ( rc == 0 )
+        {
+            /* create the name of temporary md5 file */
+            char tmpmd5name [ 260 ];
+            sprintf ( tmpmd5name, "%s.md5", tmpname );
+
+            /* create the output file under temporary name
+               ? why does it need read/write capabilities? */
+            rc = KDirectoryCreateFile ( dir, & pb . f,
+                                         true, 0664, kcmInit, "%s", tmpname );
+            if ( rc == 0 )
+            {
+                /* if using md5, wrap output file */
+                if ( use_md5 )
+                    rc = KTrieIndexCreateMD5Wrapper ( dir, & pb . f, & pb . fmd5, tmpname, tmpmd5name );
+                if ( rc == 0 )
+                {
+                    /* initial size */
+                    pb . ptt_size = 0;
+#if KDBINDEXVERS == 2
+                    KTrieIndexPersistHdr_v2 ( ( KTrieIndex_v2* ) self, & pb );
+#else
+                    KTrieIndexPersistHdr_v3_v4 ( ( KTrieIndex_v2* ) self, & pb );
+#endif
+
+                    /* persist tree */
+                    rc = KTrieIndexPersistTrie_v2 ( self, & pb );
+                    if ( rc == 0 )
+                    {
+                        /* persist projection table */
+                        if ( proj )
+                        {
+#if KDBINDEXVERS == 2
+                            rc = KTrieIndexPersistProj_v2 ( self, & pb );
+#else
+                            rc = KTrieIndexPersistProj_v3 ( self, & pb );
+#endif
+                        }
+                    }
+                }
+                    
+                /* close down the file now, success or not */
+                KFileRelease ( pb . f );
+                pb . f = NULL;
+
+                /* douse buffer and mark NULL in case of later attempt */
+                free ( pb . buffer );
+                pb . buffer = NULL;
+
+                /* rename the files on success */
+                if ( rc == 0 )
+                {
+                    /* works even if "path" is absolute */
+                    rc = KDirectoryRename ( dir, false, tmpname, path );                        
+                    if ( rc == 0 )
+                    {
+                        int tmplen;
+
+                        /* done if this was the only file to rename */
+                        if ( ! use_md5 )
+                            return 0;
+
+                        /* use "tmpname" as a real "md5" name */
+                        tmplen = strlen ( tmpname );
+                        assert ( strcmp ( & tmpname [ tmplen - 4 ], ".tmp" ) == 0 );
+                        strcpy ( & tmpname [ tmplen - 3 ], "md5" );
+
+                        /* rename md5 file and be done on success */
+                        rc = KDirectoryRename ( dir, false, tmpmd5name, tmpname );
+                        if ( rc == 0 )
+                            return 0;
+
+                        /* failure here means we have a good index file,
+                           but a bad md5 file, so convert "tmpname" to the
+                           actual name of the index file */
+                        tmpname [ tmplen - 4 ] = 0;
+                    }
+                }
+
+                /* failed, remove the output files here */
+                KDirectoryRemove ( dir, false, "%s", tmpname );
+                if ( use_md5 )
+                    KDirectoryRemove ( dir, false, "%s", tmpmd5name );
+            }
+        }
+
+        /* douse buffer */
+        free ( pb . buffer );
+    }
+    
+    return rc;
+}
+
+
+/* whack whack */
+void KTrieIndexWhack_v2 ( KTrieIndex_v2 *self )
+{
+    KPTrieIndexWhack_v2 ( & self -> pt );
+    TrieWhack ( & self -> key2id, KTrieIdxNodeWhack_v2, NULL );
+    free ( self -> ord2node );
+}
+
+/* initialize an index from file - can be NULL */
+rc_t KTrieIndexOpen_v2 ( KTrieIndex_v2 *self, const KMMap *mm, bool byteswap )
+{
+    rc_t rc;
+    bool ptorig = false;
+    const KDBHdr *hdr = NULL;
+
+#if ! KTRIE_ZEROS_KPTRIE
+#error "KTrie is supposed to zero KPTrie"
+#endif
+    memset ( self, 0, sizeof * self );
+    self -> pt . byteswap = byteswap;
+
+    /* create an empty Trie index,
+       with numeric but auto-expand character set,
+       and a bucket size of 512, beyond which the
+       tree will branch.
+    */
+    rc = TrieInit ( & self -> key2id, "0-9", 512, true );
+    if ( rc != 0 )
+        return rc;
+
+    /* when opened for create, there will be no existing index */
+    if ( mm == NULL )
+        return 0;
+
+    rc = KMMapAddrRead ( mm, (const void**) & hdr );
+    if ( rc != 0 )
+        return rc;
+
+    switch ( hdr -> version )
+    {
+    case 1:
+        rc = KPTrieIndexInitFromV1_v2 ( & self -> pt, mm, byteswap );
+        break;
+    case 2:
+        rc = KPTrieIndexInit_v2 ( & self -> pt, mm, byteswap );
+        break;
+    case 3:
+        ptorig = true;
+    case 4:
+        rc = KPTrieIndexInit_v3_v4 ( & self -> pt, mm, byteswap, ptorig );
+        break;
+    default:
+        rc = RC(rcDB, rcIndex, rcConstructing, rcIndex, rcBadVersion);
+    }
+    /* open the prior index in persisted mode, but
+       don't load it into the core-based Trie */
+    if ( rc == 0 )
+    {
+        /* the file existed but was empty */
+        if ( self -> pt . key2id == NULL )
+        {
+            self -> pt . mm = NULL;
+            return 0;
+        }
+
+        /* retain a reference to memory map */
+        rc = KMMapAddRef ( mm );
+        if ( rc == 0 )
+        {
+            self -> pt . mm = mm;
+            return 0;
+        }
+
+        /* self -> pt gets whacked below */
+    }
+
+    KTrieIndexWhack_v2 ( self );
+    return rc;
+}
+
+/* KTrieIndexPopulate_v2
+ */
+typedef struct KTrieIndexPopulateData_v2_s2 KTrieIndexPopulateData_v2_s2;
+struct KTrieIndexPopulateData_v2_s2
+{
+    int64_t first;
+
+    KTrieIndex_v2 *self;
+    uint32_t count;
+    rc_t rc;
+
+    uint8_t id_bits;
+    uint8_t span_bits;
+};
+
+static
+bool CC KTrieIndexPopulate_v2_s2 ( PTNode *n, void *data )
+{
+    const String *key;
+    KTrieIndexPopulateData_v2_s2 *pb = data;
+
+    int64_t id;
+    size_t usize;
+    uint32_t span;
+
+    /* capture node data */
+    assert ( n -> data . size == sizeof id );
+    pb -> rc = Unpack ( pb -> id_bits, sizeof id * 8,
+        n -> data . addr, 0, pb -> id_bits, NULL, & id, sizeof id, & usize );
+    if ( pb -> rc == 0 )
+    {
+        pb -> rc = Unpack ( pb -> span_bits, sizeof span * 8,
+            n -> data . addr, pb -> id_bits, pb -> span_bits, NULL, & span, sizeof span, & usize );
+    }
+    if ( pb -> rc != 0 )
+        return true;
+
+    pb -> rc = PTNodeMakeKey ( n, & key );
+    if ( pb -> rc == 0 )
+    {
+        KTrieIdxNode_v2_s2 *node;
+        pb -> rc = KTrieIdxNodeMake_v2_s2 ( & node, key, id + pb -> first );
+        StringWhack ( ( String* ) key );
+        if ( pb -> rc == 0 )
+        {
+            node -> span = span;
+
+            pb -> rc = TrieInsert ( & pb -> self -> key2id, & node -> n );
+            if ( pb -> rc == 0 )
+            {
+                ++ pb -> count;
+                return false;
+            }
+
+            KTrieIdxNodeWhack_v2 ( & node -> n, NULL );
+        }
+    }
+
+    return true;
+}
+
+/* KTrieIndexAttach_v2
+ *  attach a keymap to an existing table
+ */
+static
+rc_t KTrieIndexPopulate_v2_s1 ( KTrieIndex_v2 *self, uint32_t i, int64_t idd )
+{
+    rc_t rc;
+    uint32_t nid = self -> pt . ord2node [ i ];
+
+    if ( i != 0 && self -> pt . ord2node [ i - 1 ] == nid )
+        return 0;
+
+    i = self -> count;
+
+    if ( nid == 0 )
+    {
+        rc = KTrieIdxNodeMakeHole_v2_s1 ( & self -> ord2node [ i ], self -> pt . first + idd );
+        if ( rc == 0 )
+            self -> count = i + 1;
+    }
+    else
+    {
+        PTNode pnode;
+        rc = PTrieGetNode ( self -> pt . key2id, & pnode, nid );
+        if ( rc == 0 )
+        {
+            const String *key;
+            rc = PTNodeMakeKey ( & pnode, & key );
+            if ( rc == 0 )
+            {
+                rc = KTrieIdxNodeMake_v2_s1 ( & self -> ord2node [ i ],
+                    key, self -> pt . first + idd );
+                StringWhack ( ( String* ) key );
+                if ( rc == 0 )
+                {
+                    rc = TrieInsert ( & self -> key2id, & self -> ord2node [ i ] -> n );
+                    if ( rc != 0 )
+                        KTrieIdxNodeWhack_v2 ( & self -> ord2node [ i ] -> n, NULL );
+                    else
+                        self -> count = i + 1;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+rc_t KTrieIndexAttach_v2 ( KTrieIndex_v2 *self, bool proj )
+{
+    rc_t rc = 0;
+
+    /* if persisted index is empty, bail */
+    if ( self -> count != 0 || self -> pt . count == 0 )
+        return 0;
+
+    /* see if we can use existing projection index */
+    if ( proj && self -> pt . ord2node != NULL )
+    {
+        uint32_t i;
+
+        self -> ord2node =
+            malloc ( ( ( self -> pt . count + 4095 ) & ~ 4095 ) * sizeof self -> ord2node [ 0 ] );
+        if ( self -> ord2node == NULL )
+            return RC ( rcDB, rcIndex, rcUpdating, rcMemory, rcExhausted );
+
+        /* we were called because our count is 0 */
+        assert ( self -> count == 0 );
+
+        /* handle variant */
+        assert ( self -> pt . variant == 0 || self -> pt . id2ord . v8 != NULL );
+        switch ( self -> pt . variant )
+        {
+        case 0:  /* 1-1 id to name */
+            for ( rc = 0, i = 0; i < self -> pt . count && rc == 0; ++ i )
+                rc = KTrieIndexPopulate_v2_s1 ( self, i, i );
+            break;
+        case 1:  /* sparse 8-bit   */
+            for ( rc = 0, i = 0; i < self -> pt . count && rc == 0; ++ i )
+                rc = KTrieIndexPopulate_v2_s1 ( self, i, self -> pt . id2ord . v8 [ i ] );
+            break;
+        case 2:  /* sparse 16-bit  */
+            for ( rc = 0, i = 0; i < self -> pt . count && rc == 0; ++ i )
+                rc = KTrieIndexPopulate_v2_s1 ( self, i, self -> pt . id2ord . v16 [ i ] );
+            break;
+        case 3:  /* sparse 32-bit  */
+            for ( rc = 0, i = 0; i < self -> pt . count && rc == 0; ++ i )
+                rc = KTrieIndexPopulate_v2_s1 ( self, i, self -> pt . id2ord . v32 [ i ] );
+            break;
+        case 4:  /* sparse 64-bit  */
+            for ( rc = 0, i = 0; i < self -> pt . count && rc == 0; ++ i )
+                rc = KTrieIndexPopulate_v2_s1 ( self, i, self -> pt . id2ord . v64 [ i ] );
+            break;
+        }
+
+        if ( rc != 0 )
+        {
+            for ( i = self -> count; i > 0; )
+                KTrieIdxNodeWhack_v2 ( & self -> ord2node [ -- i ] -> n, NULL );
+            free ( self -> ord2node ), self -> ord2node = NULL;
+            return rc;
+        }
+    }
+    else
+    {
+        KTrieIndexPopulateData_v2_s2 pb;
+        pb . first = self -> pt . first;
+        pb . self = self;
+        pb . count = 0;
+        pb . rc = 0;
+        PTrieDoUntil ( self -> pt . key2id, KTrieIndexPopulate_v2_s2, & pb );
+        if ( pb . rc == 0 && pb . count != self -> pt . count )
+            return RC ( rcDB, rcIndex, rcUpdating, rcIndex, rcCorrupt );
+        self -> count = pb . count;
+    }
+
+    /* record known dimensions */
+    self -> first = self -> pt . first;
+    self -> last = self -> pt . last;
+
+    /* should be able to drop persisted copy now */
+    KPTrieIndexWhack_v2 ( & self -> pt );
+
+    return 0;
+}
+
+rc_t KTrieIndexInsert_v2 ( KTrieIndex_v2 *self,
+    bool proj, const char *str, int64_t id )
+{
+    rc_t rc;
+    String key;
+    void *ord2node;
+    uint32_t count;
+
+#if DISABLE_PROJ
+    proj = false;
+#endif
+
+    /* get the number of nodes in proj index or Trie.
+       the persisted tree is only loaded into the in-core
+       tree for edits ( insert/delete ), so the counts
+       may differ. also, when in projection mode, the
+       count refers to the number of array slots, which
+       can be > the number of Trie nodes if there are
+       holes in the id space. when not projecting, count
+       is exactly the number of nodes in the Trie.
+    */
+    count = self -> count;
+
+    /* detect first modification */
+    if ( self -> count == 0 )
+    {
+        /* detect persisted data */
+        if ( self -> pt . key2id != NULL )
+        {
+            /* load persisted data into core */
+            rc = KTrieIndexAttach_v2 ( self, proj );
+            if ( rc != 0 )
+                return rc;
+
+            /* should have loaded everything */
+            assert ( self -> count != 0 );
+            count = self -> count;
+        }
+    }
+
+    /* v2 only allows increasing ids
+       they don't have to be contiguous,
+       but they cannot repeat and cannot decrease */
+    else if ( id <= self -> last )
+        return RC ( rcDB, rcIndex, rcInserting, rcConstraint, rcViolated );
+
+    /* convert key to String */
+    StringInitCString ( & key, str );
+
+    /* insertion strategy depends upon projection index */
+    if ( proj )
+    {
+        KTrieIdxNode_v2_s1 *node;
+
+        /* check for extension of last node */
+        if ( count != 0 )
+        {
+            /* a non-zero count implies nodes in projection array */
+            assert ( self -> ord2node != NULL );
+
+            /* get last node */
+            node = self -> ord2node [ count - 1 ];
+            assert ( node != NULL );
+
+            /* if the keys match, this is an update to the node */
+            if ( StringEqual ( & key, & node -> n . key ) )
+            {
+                /* this must be an extension of range */
+                if ( id != self -> last + 1 )
+                    return RC ( rcDB, rcIndex, rcInserting, rcConstraint, rcViolated );
+
+                /* extend and done */
+                self -> last = id;
+                return 0;
+            }
+
+            /* not last node - create a hole if needed */
+            if ( id != self -> last + 1 )
+            {
+                /* extend array if needed
+                   should never have to handle initial insert,
+                   but would be happy to do so if asked */
+                if ( ( count & 4095 ) == 0 )
+                {
+                    ord2node = realloc ( self -> ord2node,
+                        ( count + 4096 ) * sizeof self -> ord2node [ 0 ] );
+                    if ( ord2node == NULL )
+                        return RC ( rcDB, rcIndex, rcInserting, rcMemory, rcExhausted );
+                    self -> ord2node = ord2node;
+                }
+
+                /* create NULL mapping */
+                rc = KTrieIdxNodeMakeHole_v2_s1 ( & node, self -> last + 1 );
+                if ( rc != 0 )
+                    return rc;
+
+                /* NB - this will cause count to be > num_nodes in Trie */
+                self -> ord2node [ count ++ ] = node;
+            }
+        }
+
+        /* make a new mapping starting with id */
+        rc = KTrieIdxNodeMake_v2_s1 ( & node, & key, id );
+        if ( rc == 0 )
+        {
+            /* attempt insertion */
+            rc = TrieInsertUnique ( & self -> key2id, & node -> n, NULL );
+            if ( rc == 0 )
+            {
+                /* create or extend projection array */
+                if ( ( count & 4095 ) == 0 )
+                {
+                    ord2node = realloc ( self -> ord2node,
+                        ( count + 4096 ) * sizeof self -> ord2node [ 0 ] );
+                    if ( ord2node == NULL )
+                        rc = RC ( rcDB, rcIndex, rcInserting, rcMemory, rcExhausted );
+                    else
+                        self -> ord2node = ord2node;
+                }
+
+                if ( rc == 0 )
+                {
+                    /* set/extend range, detecting first insertion */
+                    self -> last = id;
+                    if ( count == 0 )
+                        self -> first = id;
+
+                    /* project */
+                    self -> ord2node [ count ] = node;
+                    self -> count = count + 1;
+
+                    /* insertion complete */
+                    return 0;
+                }
+
+                /* remove failed insertion */
+                TrieUnlink ( & self -> key2id, & node -> n );
+            }
+
+            /* clean up new node */
+            KTrieIdxNodeWhack_v2 ( & node -> n, NULL );
+        }
+
+        /* clean up insertion of hole */
+        if ( count != self -> count )
+        {
+            assert ( count - 1 == self -> count );
+            KTrieIdxNodeWhack_v2 ( & self -> ord2node [ count - 1 ] -> n, NULL );
+        }
+    }
+    else
+    {
+        KTrieIdxNode_v2_s2 *node;
+
+        /* make a new mapping starting with id and a span of 1 */
+        rc = KTrieIdxNodeMake_v2_s2 ( & node, & key, id );
+        if ( rc == 0 )
+        {
+            /* attempt insertion */
+            KTrieIdxNode_v2_s2 *exist;
+            rc = TrieInsertUnique ( & self -> key2id, & node -> n, ( TNode** ) & exist );
+            if ( rc == 0 )
+            {
+                /* set/extend range, detecting first insertion */
+                if ( count == 0 )
+                {
+                    self -> max_span = 1;
+                    self -> first = id;
+                }
+                self -> last = id;
+
+                /* insertion complete */
+                self -> count = count + 1;
+                return 0;
+            }
+
+            /* clean up new node */
+            KTrieIdxNodeWhack_v2 ( & node -> n, NULL );
+
+            /* check existing for proper extension */
+            if ( exist != NULL )
+            {
+                if ( id == exist -> start_id + exist -> span )
+                {
+                    assert ( count != 0 );
+
+                    /* we already know id > last
+                       and that it boarders the range of "exist"
+                       so it must be last + 1 */
+                    assert ( id - 1 == self -> last );
+                    self -> last = id;
+
+                    /* extend the span of "exist" */
+                    ++ exist -> span;
+                    if ( exist -> span > self -> max_span )
+                        self -> max_span = exist -> span;
+
+                    return 0;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* drop string from trie and all mappings */
+rc_t KTrieIndexDelete_v2 ( KTrieIndex_v2 *self, bool proj, const char *str )
+{
+    rc_t rc;
+    String key;
+    TNode *tnode;
+    /* uint32_t count; */
+
+#if DISABLE_PROJ
+    proj = false;
+#endif
+
+    /* detect first modification */
+    /* count = self -> count; */
+    if ( self -> count != 0 )
+    {
+        /* detect persisted data */
+        if ( self -> pt . key2id != NULL )
+        {
+            rc = KTrieIndexAttach_v2 ( self, proj );
+            if ( rc != 0 )
+                return rc;
+        }
+    }
+
+    StringInitCString ( & key, str );
+
+    /* interface states that all objects are dropped.
+       however, this implementation only allows unique
+       mappings to a contig range, so a simple find is sufficient */
+    tnode = TrieFind ( & self -> key2id, & key );
+    if ( tnode == NULL )
+        return RC ( rcDB, rcIndex, rcRemoving, rcString, rcNotFound );
+
+    /* remove from trie */
+    TrieUnlink ( & self -> key2id, tnode );
+
+    /* neutralize node in projection index */
+    if ( proj )
+    {
+        KTrieIdxNode_v2_s1 *node = ( KTrieIdxNode_v2_s1* ) tnode;
+        uint32_t ord = KTrieIndexNode2Ord_v2 ( self, node );
+        if ( ord != 0 )
+        {
+            self -> ord2node [ ord - 1 ] -> n . key . size = 0;
+            self -> ord2node [ ord - 1 ] -> n . key . len = 0;
+            self -> ord2node [ ord - 1 ] -> key [ 0 ] = 0;
+            return 0;
+        }
+    }
+
+    /* whack node */
+    KTrieIdxNodeWhack_v2 ( tnode, NULL );
+
+    return 0;
+}
+
+/* map key to id range */
+rc_t KTrieIndexFind_v2 ( const KTrieIndex_v2 *self,
+    const char *str, int64_t *start_id,
+#if V2FIND_RETURNS_SPAN
+    uint32_t *span,
+#endif
+    int ( CC * custom_cmp ) ( const void *item, const PBSTNode *n, void *data ), void *data, bool convertFromV1 )
+{
+    /* search within in-core index */
+    if ( self -> count != 0 )
+    {
+        const TNode *tnode;
+
+        String key;
+        StringInitCString ( & key, str );
+
+        tnode = TrieFind ( & self -> key2id, & key );
+        if ( tnode != NULL )
+        {
+            if ( self -> ord2node != NULL )
+            {
+                const KTrieIdxNode_v2_s1 *node = ( const KTrieIdxNode_v2_s1* ) tnode;
+                uint32_t ord = KTrieIndexNode2Ord_v2 ( self, node );
+                if ( ord == 0 )
+                    return RC ( rcDB, rcIndex, rcSelecting, rcIndex, rcCorrupt );
+
+                * start_id = node -> start_id;
+#if V2FIND_RETURNS_SPAN
+                if ( ord == self -> count )
+                    * span = ( uint32_t ) ( self -> last - node -> start_id + 1 );
+                else
+                    * span = ( uint32_t ) ( self -> ord2node [ ord ] -> start_id - node -> start_id );
+#endif
+            }
+            else
+            {
+                const KTrieIdxNode_v2_s2 *node = ( const KTrieIdxNode_v2_s2* ) tnode;
+                * start_id = node -> start_id;
+#if V2FIND_RETURNS_SPAN
+                * span = node -> span;
+#endif
+            }
+
+            return 0;
+        }
+    }
+
+    /* search within persisted index */
+    else if ( self -> pt . key2id != NULL )
+    {
+        return KPTrieIndexFind_v2 ( & self -> pt, str, start_id,
+#if V2FIND_RETURNS_SPAN
+                                    span,
+#endif
+                                    custom_cmp, data, convertFromV1 );
+    }
+
+    return RC ( rcDB, rcIndex, rcSelecting, rcString, rcNotFound );
+}
+
+/* projection index id to key-string */
+typedef struct KTrieIndexProjectData_v2 KTrieIndexProjectData_v2;
+struct KTrieIndexProjectData_v2
+{
+    int64_t id;
+    const KTrieIdxNode_v2_s2 *node;
+};
+
+static
+bool CC KTrieIndexProjectScan_v2 ( TNode *n, void *data )
+{
+    KTrieIndexProjectData_v2 *pb = (KTrieIndexProjectData_v2 *)data;
+    const KTrieIdxNode_v2_s2 *node = ( const KTrieIdxNode_v2_s2* ) n;
+
+    if ( pb -> id >= node -> start_id &&
+         pb -> id < node -> start_id + node -> span )
+    {
+        pb -> node = node;
+        return true;
+    }
+
+    return false;
+}
+
+rc_t KTrieIndexProject_v2 ( const KTrieIndex_v2 *self,
+    int64_t id,
+#if V2FIND_RETURNS_SPAN
+     int64_t *start_id, uint32_t *span,
+#endif
+    char *key_buff, size_t buff_size, size_t *actsize )
+{
+    if ( self -> count != 0 )
+    {
+        if ( self -> ord2node != NULL )
+        {
+            uint32_t ord = KTrieIndexID2Ord_v2 ( self, id );
+            if ( ord != 0 )
+            {
+                const KTrieIdxNode_v2_s1 *node = self -> ord2node [ ord - 1 ];
+                
+                if (actsize)
+                    *actsize = node -> n . key . size;
+                if ( node -> n . key . size >= buff_size )
+                    return RC ( rcDB, rcIndex, rcProjecting, rcBuffer, rcInsufficient );
+                string_copy ( key_buff, buff_size,
+                    node -> n . key . addr, node -> n . key . size );
+                * start_id = node -> start_id;
+                * span = ( ( ord == self -> count ) ?
+                    ( self -> last + 1 ) : ( self -> ord2node [ ord ] -> start_id ) ) - node -> start_id;
+                return 0;
+            }
+        }
+        else
+        {
+            KTrieIndexProjectData_v2 pb;
+            pb . id = id;
+            if ( TrieDoUntil ( & self -> key2id, KTrieIndexProjectScan_v2, & pb ) )
+            {
+                const KTrieIdxNode_v2_s2 *node = pb . node;
+                
+                if (actsize)
+                    *actsize = node -> n . key . size;
+                if ( node -> n . key . size >= buff_size )
+                    return RC ( rcDB, rcIndex, rcProjecting, rcBuffer, rcInsufficient );
+                string_copy ( key_buff, buff_size,
+                    node -> n . key . addr, node -> n . key . size );
+                * start_id = node -> start_id;
+                * span = node -> span;
+                return 0;
+            }
+        }
+    }
+
+    else if ( self -> pt . ord2node != NULL )
+    {
+        return KPTrieIndexProject_v2 ( & self -> pt, id,
+#if V2FIND_RETURNS_SPAN
+            start_id, span,
+#endif
+            key_buff, buff_size, actsize );
+    }
+
+    return RC ( rcDB, rcIndex, rcProjecting, rcId, rcNotFound );
+}
diff --git a/libs/kdb/wu64idx-v3.c b/libs/kdb/wu64idx-v3.c
new file mode 100644
index 0000000..e218600
--- /dev/null
+++ b/libs/kdb/wu64idx-v3.c
@@ -0,0 +1,416 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kdb/extern.h>
+
+#include "windex-priv.h"
+
+#include <kdb/index.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kfs/mmap.h>
+#include <klib/pbstree.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct KU64Index_PNode_struct {
+    uint64_t key;
+    uint64_t key_size;
+    int64_t id;
+    uint64_t id_qty;
+} KU64Index_PNode;
+
+typedef struct KU64Index_Node_struct {
+    BSTNode node;
+    uint64_t key;
+    uint64_t key_size;
+    int64_t id;
+    uint64_t id_qty;
+} KU64Index_Node;
+
+static
+int64_t CC KU64Index_NodeSort( const BSTNode *item, const BSTNode *node )
+{
+    const KU64Index_Node* i = (const KU64Index_Node*)item;
+    const KU64Index_Node* n = (const KU64Index_Node*)node;
+
+    if( i->key < n->key ) {
+        return -1;
+    } else if( i->key > n->key ) {
+        return 1;
+    }
+    return 0;
+}
+
+static
+int64_t CC KU64Index_NodeSortUnique( const BSTNode *item, const BSTNode *node )
+{
+    const KU64Index_Node* i = (const KU64Index_Node*)item;
+    const KU64Index_Node* n = (const KU64Index_Node*)node;
+
+    if( (i->key + i->key_size - 1) < n->key ) {
+        return -1;
+    } else if( i->key > (n->key + n->key_size - 1) ) {
+        return 1;
+    }
+    return 0;
+}
+
+static
+bool CC KU64Index_UnrollPersisted( PBSTNode *n, void *data )
+{
+    KU64Index_v3* self = data;
+    const KU64Index_PNode* pn = n->data.addr;
+
+    KU64Index_Node* node = calloc(1, sizeof(KU64Index_Node));
+    if( node == NULL ) {
+        self->rc = RC(rcExe, rcNode, rcConstructing, rcMemory, rcInsufficient);
+    } else {
+        node->key = pn->key;
+        node->key_size = pn->key_size;
+        node->id = pn->id;
+        node->id_qty = pn->id_qty;
+        self->rc = BSTreeInsert(&self->tree, &node->node, KU64Index_NodeSort);
+    }
+    if( self->rc != 0 ) {
+        free(node);
+    }
+    return self->rc == 0 ? false : true;
+}
+
+rc_t KU64IndexOpen_v3(KU64Index_v3* self, struct KMMap const *mm, bool byteswap)
+{
+    rc_t rc = 0;
+    const char* maddr;
+    size_t msize;
+    PBSTree* ptree = NULL;
+
+    self->rc = 0;
+    BSTreeInit(&self->tree);
+
+    /* when opened for create, there will be no existing index */
+    if( mm == NULL ) {
+        return 0;
+    }
+
+    /* open the prior index in persisted mode */
+    rc = KMMapAddrRead(mm, (const void**)&maddr);
+    if( rc != 0 ) {
+        return rc;
+    }
+    rc = KMMapSize(mm, &msize);
+    if( rc != 0 ) {
+        return rc;
+    }
+    if( msize <= sizeof(struct KIndexFileHeader_v3) ) {
+        return 0;
+    }
+
+    rc = PBSTreeMake(&ptree, (const void**)(maddr + sizeof(struct KIndexFileHeader_v3)),
+                     msize - sizeof(struct KIndexFileHeader_v3), byteswap);
+    if( rc != 0 ) {
+        return rc;
+    }
+
+    PBSTreeDoUntil(ptree, false, KU64Index_UnrollPersisted, self);
+    rc = self->rc;
+
+    PBSTreeWhack(ptree);
+
+    if( rc != 0 ) {
+        KU64IndexWhack_v3(self);
+    }
+    return rc;
+}
+
+static
+void CC KU64Index_WhackBSTree( BSTNode *n, void *data )
+{
+    free((KU64Index_Node*)n);
+}
+
+rc_t KU64IndexWhack_v3(KU64Index_v3* self)
+{
+    self->rc = 0;
+    BSTreeWhack(&self->tree, KU64Index_WhackBSTree, NULL);
+    return 0;
+}
+
+rc_t KU64IndexInsert_v3(KU64Index_v3* self, bool unique, uint64_t key, uint64_t key_size, int64_t id, uint64_t id_qty)
+{
+    KU64Index_Node* node = calloc(1, sizeof(KU64Index_Node));
+    self->rc = 0;
+
+    if( node == NULL ) {
+        self->rc = RC(rcExe, rcNode, rcConstructing, rcMemory, rcInsufficient);
+    } else {
+        node->key = key;
+        node->key_size = key_size;
+        node->id = id;
+        node->id_qty = id_qty;
+        if( unique ) {
+            self->rc = BSTreeInsertUnique(&self->tree, &node->node, NULL, KU64Index_NodeSortUnique);
+        } else {
+            self->rc = BSTreeInsert(&self->tree, &node->node, KU64Index_NodeSort);
+        }
+    }
+    if( self->rc != 0 ) {
+        free(node);
+    }
+    return self->rc;
+}
+
+static
+int64_t CC KU64Index_Cmp4Delete( const void *item, const BSTNode *node )
+{
+    const KU64Index_Node* i = (const KU64Index_Node*)item;
+    const KU64Index_Node* n = (const KU64Index_Node*)node;
+
+    if( i->key < n->key ) {
+        return -1;
+    } else if( i->key > n->key ) {
+        return 1;
+    }
+    return 0;
+}
+
+rc_t KU64IndexDelete_v3(KU64Index_v3* self, uint64_t key)
+{
+    KU64Index_Node node;
+    BSTNode* n = NULL;
+
+    self->rc = 0;
+    node.key = key;
+    n = BSTreeFind(&self->tree, &node, KU64Index_Cmp4Delete);
+    if( n != NULL ) {
+        if( !BSTreeUnlink(&self->tree, n) ) {
+            self->rc = RC(rcDB, rcIndex, rcDestroying, rcId, rcCorrupt);
+        }
+    } else {
+        self->rc = RC(rcDB, rcIndex, rcDestroying, rcId, rcNotFound);
+    }
+    return self->rc;
+}
+
+typedef struct KU64Index_PersistData_struct
+{
+    uint64_t pos;
+    KFile *file;
+    KMD5File *file_md5;
+} KU64Index_PersistData;
+
+static
+rc_t CC KU64Index_WriteFunc( void *param, const void *buffer, size_t size, size_t *num_writ )
+{
+    KU64Index_PersistData* pd = param;
+    rc_t rc = KFileWrite(pd->file, pd->pos, buffer, size, num_writ);
+    pd->pos += *num_writ;
+    return rc;
+}
+
+static
+rc_t CC KU64Index_AuxFunc(void *param, const void *node, size_t *num_writ, PTWriteFunc write, void *write_param )
+{
+    rc_t rc = 0;
+    const KU64Index_Node* n = (const KU64Index_Node*)node;
+    int sz = sizeof(KU64Index_Node) - sizeof(BSTNode);
+
+    if( write != NULL ) {
+        rc = (*write)(write_param, &n->key, sz, num_writ);
+    } else {
+        *num_writ = sz;
+    }
+    return rc;
+}
+
+rc_t KU64IndexPersist_v3(KU64Index_v3* self, bool proj, KDirectory *dir, const char *path, bool use_md5)
+{
+    KU64Index_PersistData pd;
+    char tmpname[256];
+    char tmpmd5name[256];
+    char md5path[256];
+
+    self->rc = 0;
+    memset(&pd, 0, sizeof(KU64Index_PersistData));
+
+    self->rc = KDirectoryResolvePath(dir, false, tmpname, sizeof(tmpname), "%s.tmp", path);
+
+    if( self->rc == 0 ) {
+        self->rc = KDirectoryCreateFile(dir, &pd.file, true, 0664, kcmInit, "%s", tmpname);
+
+        if(use_md5 && self->rc == 0 ) {
+
+            KMD5SumFmt *km = NULL;
+            size_t tmplen = snprintf(tmpmd5name, sizeof(tmpmd5name), "%s.md5", tmpname);
+            KFile* kf = NULL;
+
+            if( tmplen >= sizeof(tmpmd5name) ) {
+                self->rc = RC(rcDB, rcIndex, rcPersisting, rcName, rcExcessive);
+            } else {
+
+                tmplen = snprintf(md5path, sizeof(md5path), "%s.md5", path);
+                if( tmplen >= sizeof(md5path) ) {
+                    self->rc = RC(rcDB, rcIndex, rcPersisting, rcName, rcExcessive);
+                } else {
+
+                    self->rc = KDirectoryCreateFile(dir, &kf, true, 0664, kcmInit, "%s", tmpmd5name);
+                    if( self->rc == 0 ) {
+                        self->rc = KMD5SumFmtMakeUpdate(&km, kf);
+                        if( self->rc == 0 ) {
+                            KMD5File * k5f;
+                            kf = NULL;
+                            self->rc = KMD5FileMakeWrite(&k5f, pd.file, km, path);
+                            if( self->rc == 0 ) {
+                                pd.file_md5 = k5f;
+                                pd.file = KMD5FileToKFile(k5f);
+                            }
+                            /* release pass or fail */
+                            KMD5SumFmtRelease(km);
+                        } else {
+                            KFileRelease ( kf );
+                        }
+                    } else {
+                        KFileRelease ( kf );
+                    }
+                }
+            }
+            if( self->rc != 0 ) {
+                KFileRelease(pd.file);
+            }
+        }
+
+        if( self->rc == 0 ) {
+            struct KIndexFileHeader_v3 head;
+            size_t writ = 0;
+
+            KDBHdrInit(&head.h, 3);
+            head.index_type = kitU64;
+            self->rc = KFileWrite(pd.file, pd.pos, &head, sizeof(struct KIndexFileHeader_v3), &writ);
+            if( self->rc == 0 ) {
+                pd.pos += writ;
+                if( use_md5 ) {
+                    KMD5FileBeginTransaction(pd.file_md5);
+                }
+                self->rc = BSTreePersist(&self->tree, NULL, KU64Index_WriteFunc, &pd, KU64Index_AuxFunc, &pd);
+            }
+            KFileRelease(pd.file);
+            pd.file = NULL;
+        }
+    }
+
+    if( self->rc == 0 ) {
+        self->rc = KDirectoryRename(dir, false, tmpname, path);
+        if( self->rc == 0 ) {
+            if ( use_md5 ) {
+                self->rc = KDirectoryRename(dir, false, tmpmd5name, md5path);
+            }
+            if( self->rc == 0 ) {
+                /* done */
+                return 0;
+            }
+        }
+    }
+
+    /* whack temporary file */
+    KDirectoryRemove(dir, false, "%s", tmpname);
+    if( use_md5 ) {
+        KDirectoryRemove(dir, false, "%s", tmpmd5name);
+    }
+    return self->rc;
+}
+
+typedef struct KU64Index_GrepData_struct {
+    rc_t rc;
+    rc_t (CC*func)(uint64_t key, uint64_t key_size, int64_t id, uint64_t id_qty, void* data);
+    void* data;
+    KU64Index_Node search;
+    uint64_t* key;
+    uint64_t* key_size;
+    int64_t* id;
+    uint64_t* id_qty;
+} KU64Index_GrepData;
+
+/*
+ * return true: if found or break DoUntil for FindAll
+ */
+static
+bool CC KU64Index_Grep(BSTNode *node, void *data)
+{
+    KU64Index_Node* n = (KU64Index_Node*)node;
+    KU64Index_GrepData* d = data;
+
+    if( d->search.key >= n->key && (d->search.key - n->key) < n->key_size ) {
+        if( d->func ) {
+            d->rc = (*d->func)(n->key, n->key_size, n->id, n->id_qty, d->data);
+            if( d->rc != 0 ) {
+                return true;
+            }
+        } else {
+            *d->key = n->key;
+            *d->key_size = n->key_size;
+            *d->id = n->id;
+            *d->id_qty = n->id_qty;
+            return true;
+        }
+    }
+    return false;
+}
+
+rc_t KU64IndexFind_v3( const KU64Index_v3* self, uint64_t offset, uint64_t* key, uint64_t* key_size, int64_t* id, uint64_t* id_qty )
+{
+    KU64Index_GrepData d;
+
+    memset(&d, 0, sizeof(KU64Index_GrepData));
+    d.search.key = offset;
+    d.key = key;
+    d.key_size = key_size;
+    d.id = id;
+    d.id_qty = id_qty;
+    if( !BSTreeDoUntil(&self->tree, false, KU64Index_Grep, &d) ) {
+        d.rc = RC(rcDB, rcIndex, rcSelecting, rcId, rcNotFound);
+    }
+    return d.rc;
+}
+
+
+rc_t KU64IndexFindAll_v3( const KU64Index_v3* self, uint64_t offset, 
+    rc_t (CC*f)(uint64_t key, uint64_t key_size, int64_t id, uint64_t id_qty, void* data), void* data)
+{
+    KU64Index_GrepData d;
+
+    memset(&d, 0, sizeof(KU64Index_GrepData));
+    d.func = f;
+    d.data = data;
+    d.search.key = offset;
+    BSTreeDoUntil(&self->tree, false, KU64Index_Grep, &d);
+    return d.rc;
+}
diff --git a/libs/kfc/Makefile b/libs/kfc/Makefile
new file mode 100644
index 0000000..29ef8ec
--- /dev/null
+++ b/libs/kfc/Makefile
@@ -0,0 +1,97 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: all
+
+TOP ?= $(abspath ../..)
+MODULE = libs/kfc
+
+INT_LIBS = \
+	libkfc
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(KFC_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/all
+
+std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/all
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# all, std
+#
+$(TARGDIR)/all: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/all $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# kfc
+#
+$(ILIBDIR)/libkfc: $(addprefix $(ILIBDIR)/libkfc.,$(ILIBEXT))
+
+KFC_SRC = \
+	refcount \
+	tstate \
+	sysrsrc \
+	rsrc \
+	vtbl \
+	sysctx \
+	except \
+	xc \
+
+KFC_OBJ = \
+	$(addsuffix .$(LOBX),$(KFC_SRC))
+
+KFC_LIB = \
+
+$(ILIBDIR)/libkfc.$(LIBX): $(KFC_OBJ)
+	$(LD) --slib -o $@ $^ $(KFC_LIB)
+
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/kfc/except.c b/libs/kfc/except.c
new file mode 100644
index 0000000..0fa9ce4
--- /dev/null
+++ b/libs/kfc/except.c
@@ -0,0 +1,128 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define SRC_LOC_DEFINED 1
+
+#include <kfc/extern.h>
+#include <kfc/rsrc.h>
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/rc.h>
+#include <kfc/xcdefs.h>
+#include <kfc/xc.h>
+#include <kfc/tstate.h>
+
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kproc/thread.h>
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#include <sysalloc.h>
+
+
+/* event
+ *  create a thread event
+ *
+ *  "lineno" [ IN ] - the source line where event was created
+ *  "severity" [ IN ] - severity of the event
+ *  "origin" [ IN ] - origin of the event
+ *  "xc" [ IN ] - type of the event
+ *  "msg" [ IN, VARARG ] - instance data to be recorded on the event
+ */
+void ctx_event ( ctx_t ctx, uint32_t lineno,
+    xc_sev_t severity, xc_org_t origin,
+    xc_t xc, const char *msg, ... )
+{
+    va_list args;
+    va_start ( args, msg );
+
+    if ( ctx != NULL )
+        KThreadStateEvent ( ctx -> rsrc -> thread, ctx, lineno, severity, origin, xc, msg, args );
+
+    va_end ( args );
+}
+
+void ctx_vevent ( ctx_t ctx, uint32_t lineno,
+    xc_sev_t severity, xc_org_t origin,
+    xc_t xc, const char *msg, va_list args )
+{
+    if ( ctx != NULL )
+        KThreadStateEvent ( ctx -> rsrc -> thread, ctx, lineno, severity, origin, xc, msg, args );
+}
+
+
+/* CATCH
+ *  attempts to catch rc on certain types
+ */
+bool ctx_xc_isa ( ctx_t ctx, xc_t xc )
+{
+    if ( ctx != NULL && ctx -> evt != NULL )
+        return KThreadStateIsXCErr ( ctx -> rsrc -> thread, ctx, xc );
+    return false;
+}
+
+bool ctx_xobj_isa ( ctx_t ctx, xobj_t xo )
+{
+    if ( ctx != NULL && ctx -> evt != NULL )
+        return KThreadStateIsXCObj ( ctx -> rsrc -> thread, ctx, xo );
+    return false;
+}
+
+bool ctx_xstate_isa ( ctx_t ctx, xstate_t xs )
+{
+    if ( ctx != NULL && ctx -> evt != NULL )
+        return KThreadStateIsXCState ( ctx -> rsrc -> thread, ctx, xs );
+    return false;
+}
+
+
+/* clear
+ *  clears annotation and error
+ *  used from within CATCH handler
+ */
+void ctx_clear ( ctx_t ctx )
+{
+    if ( ctx != NULL && ctx -> evt != NULL )
+        KThreadStateClearEvents ( ctx -> rsrc -> thread, ctx );
+}
+
+
+/* what
+ *  retrieves current message
+ *  if no annotation exists, returns empty string
+ */
+const char * ctx_what ( ctx_t ctx )
+{
+    if ( ctx != NULL && ctx -> evt != NULL )
+        return KThreadStateGetMessage ( ctx -> rsrc -> thread, ctx );
+
+    return "";
+}
diff --git a/libs/kfc/refcount.c b/libs/kfc/refcount.c
new file mode 100644
index 0000000..8a25c12
--- /dev/null
+++ b/libs/kfc/refcount.c
@@ -0,0 +1,181 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/extern.h>
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <kfc/rc.h>
+
+#include <kfc/refcount-impl.h>
+
+#include <string.h>
+#include <sysalloc.h>
+
+
+/*--------------------------------------------------------------------------
+ * KRefcount
+ */
+
+KITFTOK_DEF ( KRefcount_v1 );
+
+/* Duplicate
+ *  create a duplicate reference
+ *
+ *  "rm" [ IN ] - capabilities to remove ( default 0 )
+ */
+LIB_EXPORT void * CC KRefcountDuplicate_v1 ( KRefcount_v1 * self, ctx_t ctx, caps_t rm )
+{
+    FUNC_ENTRY ( ctx, rcRuntime, rcRefcount, rcCopying );
+
+    int add_result;
+    const KRefcount_v1_vt * vt;
+
+    if ( self == NULL )
+        return NULL;
+
+    vt = KVTABLE_CAST ( self -> vt, ctx, KRefcount_v1 );
+    if ( vt == NULL )
+        INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KRefcount_v1 interface" );
+    else
+    {
+        if ( vt -> dup != NULL )
+            return ( * vt -> dup ) ( self, ctx, rm );
+
+        if ( rm != 0 )
+            INTERNAL_ERROR ( xcParamInvalid, "this reference does not support removal of capabilities ( %b )", rm );
+        else
+        {
+            add_result = KRefcountAdd ( & self -> refcount, self -> vt -> name );
+            switch ( add_result )
+            {
+            case krefOkay:
+                return self;
+            case krefZero:
+                INTERNAL_ERROR ( xcSelfZombie, "zero refcount" );
+                break;
+            case krefLimit:
+                INTERNAL_ERROR ( xcRefcountOutOfBounds, "maximum references reached" );
+                break;
+            case krefNegative:
+                INTERNAL_ERROR ( xcSelfZombie, "negative refcount" );
+                break;
+            default:
+                INTERNAL_ERROR ( xcUnexpected, "unknown result from KRefcountAdd: ( %d )", add_result );
+            }
+        }
+    }
+
+    return NULL;
+}
+
+/* Release
+ *  release a reference
+ */
+LIB_EXPORT void CC KRefcountRelease_v1 ( KRefcount_v1 * self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        FUNC_ENTRY ( ctx, rcRuntime, rcRefcount, rcReleasing );
+
+        const KRefcount_v1_vt * vt = KVTABLE_CAST ( self -> vt, ctx, KRefcount_v1 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KRefcount_v1 interface" );
+        else
+        {
+            int drop_result = KRefcountDrop ( & self -> refcount, self -> vt -> name );
+            switch ( drop_result )
+            {
+            case krefOkay:
+                return;
+            case krefWhack:
+                if ( vt -> destroy != NULL )
+                    ( * vt -> destroy ) ( self, ctx );
+                free ( self );
+                return;
+            case krefZero:
+                INTERNAL_WARNING ( xcSelfZombie, "zero refcount" );
+                break;
+            case krefNegative:
+                INTERNAL_WARNING ( xcSelfZombie, "negative refcount" );
+                break;
+            default:
+                INTERNAL_WARNING ( xcUnexpected, "unknown result from KRefcountDrop: ( %d )", drop_result );
+            }
+        }
+    }
+}
+
+
+/* Init
+ *  initialize the refcount to 1
+ *  may perform logging
+ */
+LIB_EXPORT void CC KRefcountInit_v1 ( KRefcount_v1 *self, ctx_t ctx,
+    const KVTable * kvt, const char * instance_name )
+{
+    FUNC_ENTRY ( ctx, rcRuntime, rcData, rcConstructing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to construct object" );
+    else if ( kvt == NULL )
+        INTERNAL_ERROR ( xcInterfaceNull, "null vtable" );
+    else
+    {
+        const KRefcount_v1_vt *vt = KVTABLE_CAST ( kvt, ctx, KRefcount_v1 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "vtable does not appear to implement KRefcount_v1" );
+        else
+        {
+            switch ( vt -> dad . min )
+            {
+            case 0:
+                break;
+            default:
+                INTERNAL_ERROR ( xcInterfaceInvalid, "vtable has an invalid minor version" );
+                return;
+            }
+
+            KRefcountInit ( & self -> refcount, 1, kvt -> name, "init", instance_name ? instance_name : "" );
+            self -> vt = kvt;
+#if _DEBUGGING && _ARCH_BITS > 32
+            memset ( & self -> align, 0, sizeof self -> align );
+#endif
+        }
+    }
+}
+
+/* Destroy
+ *  has nothing to destroy
+ *  may perform logging
+ */
+LIB_EXPORT void CC KRefcountDestroy_v1 ( KRefcount_v1 *self, ctx_t ctx )
+{
+#if _DEBUGGING
+    if ( self != NULL )
+        KRefcountWhack ( & self -> refcount, self -> vt -> name );
+#endif
+}
diff --git a/libs/kfc/rsrc-priv.h b/libs/kfc/rsrc-priv.h
new file mode 100644
index 0000000..e7c8f5f
--- /dev/null
+++ b/libs/kfc/rsrc-priv.h
@@ -0,0 +1,44 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_rsrc_priv_
+#define _h_kfc_rsrc_priv_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+struct KRsrc;
+
+/* rsrc_init
+ *  initialize a resource block with common managers
+ *  lazy generation from thread entry
+ *  not called when used under KMain
+ */
+void rsrc_init ( struct KRsrc * rsrc, ctx_t ctx, bool full );
+
+
+#endif /* _h_kfc_rsrc_priv_ */
diff --git a/libs/kfc/rsrc.c b/libs/kfc/rsrc.c
new file mode 100644
index 0000000..4db8974
--- /dev/null
+++ b/libs/kfc/rsrc.c
@@ -0,0 +1,180 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/extern.h>
+#include <kfc/rsrc.h>
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/rc.h>
+#include <kfc/xc.h>
+
+#include <kfc/tstate.h>
+#include <kproc/procmgr.h>
+#include <kproc/thread.h>
+#include <kfg/config.h>
+#include <kns/manager.h>
+#include <vfs/manager.h>
+#include <vfs/manager-priv.h>
+#include <kdb/manager.h>
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+
+#include "rsrc-priv.h"
+
+#include <string.h>
+#include <assert.h>
+
+
+/* Init
+ *  initialize a local block from another
+ */
+LIB_EXPORT void CC KRsrcInit ( KRsrc * rsrc, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcRuntime, rcMgr, rcAttaching );
+
+    if ( rsrc == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad KRsrc block" );
+    else
+    {
+        rc_t rc;
+        const KRsrc * src = ctx -> rsrc;
+        memset ( rsrc, 0, sizeof * rsrc );
+
+        /* attach new reference to each manager */
+        rc = KProcMgrAddRef ( rsrc -> proc = src -> proc );
+        if ( rc == 0 )
+            rsrc -> thread = KProcMgrMakeThreadState ( rsrc -> proc );
+#if 0
+        if ( rc == 0 )
+        {
+            rsrc -> mem = KMemMgrDuplicate ( src -> mem, ctx );
+            rc = ctx -> rc;
+        }
+#endif
+        if ( rc == 0 )
+            rc = KConfigAddRef ( rsrc -> cfg = src -> cfg );
+        if ( rc == 0 )
+            rc = KNSManagerAddRef ( rsrc -> kns = src -> kns );
+        if ( rc == 0 )
+            rc = VFSManagerAddRef ( rsrc -> vfs = src -> vfs );
+        if ( rc == 0 )
+            rc = KDBManagerAddRef ( rsrc -> kdb = src -> kdb );
+        if ( rc == 0 )
+            rc = VDBManagerAddRef ( rsrc -> vdb = src -> vdb );
+
+        if ( rc != 0 )
+        {
+            INTERNAL_ERROR ( xcRefcountOutOfBounds, "exceeded references to a KRsrc manager" );
+            KRsrcWhack ( rsrc, ctx );
+        }
+    }
+}
+
+
+/* Whack
+ *  release references
+ */
+LIB_EXPORT void CC KRsrcWhack ( KRsrc * self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        VDBManagerRelease ( self -> vdb );
+        KDBManagerRelease ( self -> kdb );
+        VFSManagerRelease ( self -> vfs );
+        KNSManagerRelease ( self -> kns );
+        KConfigRelease ( self -> cfg );
+#if 0
+        /* remember to deal with case of ctx == NULL,
+           which is allowed for VDB.2 in this context */
+        KMemMgrRelease ( self -> mem, ctx );
+#endif
+        KThreadStateWhack ( self -> thread );
+        KProcMgrRelease ( self -> proc );
+
+        memset ( self, 0, sizeof * self );
+    }
+}
+
+
+/* rsrc_init
+ *  initialize a resource block with common managers
+ *  lazy generation from thread entry
+ *  not called when used under KMain
+ */
+void rsrc_init ( KRsrc * rsrc, ctx_t ctx, bool full )
+{
+    if ( rsrc == NULL )
+        INTERNAL_ERROR ( xcParamNull, "Bad KRsrc block" );
+    else
+    {
+        rc_t rc;
+#if 0
+        memset ( rsrc, 0, sizeof * rsrc );
+#endif
+
+        /* initialize the proc mgr */
+        rc = KProcMgrInit ();
+        if ( rc == 0 && rsrc -> proc == NULL )
+            rc = KProcMgrMakeSingleton ( & rsrc -> proc );
+
+        /* create KMemMgr */
+
+        if ( full )
+        {
+            /* create current thread */
+            if ( rc == 0 )
+                rsrc -> thread = KProcMgrMakeThreadState ( rsrc -> proc );
+
+            /* read in KConfig */
+            if ( rc == 0 )
+                rc = KConfigMake ( & rsrc -> cfg, NULL );
+#if 0
+            /* not making the KNS manager, because the
+               VFS manager makes it, and we can get his */
+            if ( rc == 0 )
+                rc = KNSManagerMake ( & rsrc -> kns );
+#endif
+            /* create VFS manager, linked to our KConfig */
+            if ( rc == 0 )
+                rc = VFSManagerMakeFromKfg ( & rsrc -> vfs, rsrc -> cfg );
+#if 1
+            /* extract the VFS manager's KNS manager */
+            if ( rc == 0 )
+                rc = VFSManagerGetKNSMgr ( rsrc -> vfs, & rsrc -> kns );
+#endif
+            /* create a VDB manager, which creates a KDB manager
+               call special library agnostic function, link to vfs */
+            if ( rc == 0 )
+                rc = VDBManagerMakeRsrc ( & rsrc -> vdb, rsrc -> vfs );
+            /* obtain the read version of KDB manager */
+            if ( rc == 0 )
+                rc = VDBManagerOpenKDBManagerRead ( rsrc -> vdb, ( const KDBManager** ) & rsrc -> kdb );
+        }
+
+        if ( rc != 0 )
+            INTERNAL_ERROR ( xcUnexpected, "failed to create a KRsrc manager ( rc = %R )", rc );
+    }
+}
diff --git a/libs/kfc/sysctx-priv.h b/libs/kfc/sysctx-priv.h
new file mode 100644
index 0000000..a9e8a72
--- /dev/null
+++ b/libs/kfc/sysctx-priv.h
@@ -0,0 +1,45 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfc_sysctx_priv_
+#define _h_kfc_sysctx_priv_
+
+/* Clear new_ctx and initialize special members.
+   Make sure Unix and Windows version do the same. */
+#define RESET_CTX(new_ctx, ctx, func_loc) \
+    do { \
+        memset ( ( void* ) & new_ctx -> rc, 0, sizeof * new_ctx \
+                    - sizeof new_ctx -> rsrc \
+                    - sizeof new_ctx -> loc \
+                    - sizeof new_ctx -> caller  \
+                    - sizeof new_ctx -> zdepth ); \
+        new_ctx -> rsrc = ctx -> rsrc; \
+        new_ctx -> loc = func_loc; \
+        new_ctx -> caller = ctx; \
+        new_ctx -> zdepth = ctx -> zdepth + 1; \
+    } while (false)
+
+#endif /* _h_kfc_sysctx_priv_ */
diff --git a/libs/kfc/tstate.c b/libs/kfc/tstate.c
new file mode 100644
index 0000000..1980baf
--- /dev/null
+++ b/libs/kfc/tstate.c
@@ -0,0 +1,1041 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define SRC_LOC_DEFINED 1
+
+#include <kfc/extern.h>
+#include <kfc/tstate.h>
+#include <kfc/rsrc.h>
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/rc.h>
+#include <kfc/xc.h>
+#include <kfc/xcdefs.h>
+
+#include <klib/time.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+typedef struct KThreadEvent KThreadEvent;
+typedef struct KThreadEvtNode KThreadEvtNode;
+
+
+/*--------------------------------------------------------------------------
+ * ts_alloc
+ */
+static
+void * ts_alloc ( size_t bytes, bool clear )
+{
+    void * mem = clear ? calloc ( 1, bytes ) : malloc ( bytes );
+    if ( mem == NULL )
+        exit ( -1 );
+    return mem;
+}
+
+
+/*--------------------------------------------------------------------------
+ * xc to rc
+ */
+static
+rc_t extract_rc_xobj ( const XCObj * xobj )
+{
+    while ( xobj -> dad != NULL )
+        xobj = xobj -> dad;
+    return SILENT_RC ( 0, 0, 0, xobj -> rc_obj, 0 );
+}
+
+
+static
+rc_t extract_rc_xstate ( const XCState * xstate )
+{
+    while ( xstate -> dad != NULL )
+        xstate = xstate -> dad;
+    return SILENT_RC ( 0, 0, 0, 0, xstate -> rc_state );
+}
+
+static
+rc_t extract_rc_xerr ( const XCErr * xc )
+{
+    rc_t rc_obj, rc_state;
+
+    /* get to root xc */
+    while ( xc -> dad != NULL )
+        xc = xc -> dad;
+
+    /* retrieve components */
+    rc_obj = extract_rc_xobj ( xc -> obj );
+    rc_state = extract_rc_xstate ( xc -> state );
+
+    return rc_obj | rc_state;
+}
+
+static
+rc_t extract_rc ( const KFuncLoc * loc, const void * xc )
+{
+    rc_t rc_err = extract_rc_xerr ( xc );
+    return loc -> rc_context | rc_err;
+}
+
+
+/*--------------------------------------------------------------------------
+ * xc to string
+ */
+static
+const char * extract_desc_xobj ( const XCErr * xc )
+{
+    const XCObj * xobj;
+
+    while ( xc -> dad != NULL )
+        xc = xc -> dad;
+
+    xobj = xc -> obj;
+    while ( xobj -> desc == NULL && xobj -> dad != NULL )
+        xobj = xobj -> dad;
+
+    return xobj -> desc;
+}
+
+
+static
+const char * extract_desc_xstate ( const XCErr * xc )
+{
+    const XCState * xstate;
+
+    while ( xc -> dad != NULL )
+        xc = xc -> dad;
+
+    xstate = xc -> state;
+    while ( xstate -> desc == NULL && xstate -> dad != NULL )
+        xstate = xstate -> dad;
+
+    return xstate -> desc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KThreadEvtNode
+ *  exection state belonging to the current thread
+ */
+struct KThreadEvtNode
+{
+    KThreadEvtNode * parent;
+    KThreadEvtNode * next;
+    KThreadEvtNode * child;
+
+    const KFuncLoc * loc;
+    KThreadEvent * evt;
+    uint32_t zdepth;              /* root node has zdepth == 0 */
+};
+
+
+/*--------------------------------------------------------------------------
+ * KThreadEvent
+ *  describes a particular event
+ */
+struct KThreadEvent
+{
+    KThreadEvtNode * node;
+    KThreadEvent * next;
+
+    const XCErr * xc;
+    KTime_t timestamp;
+    String message;
+    xc_sev_t severity;
+    xc_org_t origin;
+    uint32_t lineno;
+};
+
+/* Dump
+ */
+static
+void KThreadEventDump ( ctx_t ctx, KTime_t timestamp, const KFuncLoc * loc,
+    uint32_t lineno, xc_sev_t severity, xc_org_t origin, const void * xc_param,
+    const char * msg, const KThreadEvtNode * node )
+{
+    const XCErr * xc = xc_param;
+
+    size_t pre_size, sz;
+    char pre [ 4096 ];
+
+#if _DEBUGGING
+    const char *fname;
+#endif
+
+    static const char * err_strings [ 3 ] [ 4 ] =
+    {
+        { "NOTE", "WARNING", "SYSTEM ERROR", "FATAL SYSTEM ERROR" },
+        { "NOTE", "WARNING", "INTERNAL ERROR", "FATAL INTERNAL ERROR" },
+        { "NOTE", "WARNING", "USER ERROR", "FATAL USER ERROR" }
+    };
+
+    KTime tm;
+    KTimeLocal ( & tm, timestamp );
+    string_printf ( pre, sizeof pre, & pre_size
+                    , "%04u-%02u-%02uT%02u:%02u:%02u "
+                    , tm . year
+                    , tm . month + 1
+                    , tm . day
+                    , tm . hour
+                    , tm . minute
+                    , tm . second
+        );
+
+#if _DEBUGGING
+    string_printf ( & pre [ pre_size ], sizeof pre - pre_size, & sz
+                    , "%.*s/%s/%s.%s:%u:"
+                    , sizeof __FILE__ -
+                      sizeof __mod__  -
+                      sizeof __file__ -
+                      sizeof __fext__ -
+                      1
+                    , __FILE__
+                    , loc -> src -> mod
+                    , loc -> src -> file
+                    , loc -> src -> ext
+                    , lineno
+                    , loc -> func
+        );
+    pre_size += sz;
+
+    /* function name */
+    fname = loc -> func;
+
+    /* remove leading "Java_" from jni names */
+    if ( memcmp ( loc -> func, "Java_", sizeof "Java_" - 1 ) == 0 )
+        fname += sizeof "Java_" - 1;
+
+    /* print it into buffer */
+    string_printf ( & pre [ pre_size ], sizeof pre - pre_size, & sz
+                    , "%s - "
+                    , fname
+        );
+
+    /* convert jni names into Java fqn */
+    if ( fname != loc -> func )
+    {
+        size_t i;
+        for ( i = 0; i < sz; ++ i )
+        {
+            if ( pre [ pre_size + i ] == '_' )
+                pre [ pre_size + i ] = '.';
+        }
+    }
+    pre_size += sz;
+#endif
+
+    string_printf ( & pre [ pre_size ], sizeof pre - pre_size, & sz
+                    , "%s: "
+                    , err_strings [ origin ] [ severity ]
+        );
+    pre_size += sz;
+
+#if _DEBUGGING
+    string_printf ( & pre [ pre_size ], sizeof pre - pre_size, & sz
+                    , "( %s ) "
+                    , xc -> name
+        );
+    pre_size += sz;
+#endif
+
+    string_printf ( & pre [ pre_size ], sizeof pre - pre_size, & sz
+                    , "%s %s"
+                    , extract_desc_xobj ( xc )
+                    , extract_desc_xstate ( xc )
+        );
+    pre_size += sz;
+
+    if ( msg == NULL || msg [ 0 ] == 0 )
+        fprintf ( stderr, "%s.\n", pre );
+    else
+        fprintf ( stderr, "%s - %s.\n", pre, msg );
+
+#if _DEBUGGING
+    if ( node != NULL )
+    {
+        fprintf ( stderr, "Stack Trace:\n" );
+        do
+        {
+            fprintf ( stderr
+                      , "    %s/%s.%s:%s\n"
+                      , node -> loc -> src -> mod
+                      , node -> loc -> src -> file
+                      , node -> loc -> src -> ext
+                      , node -> loc -> func
+                );
+            node = node -> parent;
+        }
+        while ( node != NULL );
+    }
+    else if ( ctx != NULL )
+    {
+        fprintf ( stderr, "Stack Trace:\n" );
+        do
+        {
+            fprintf ( stderr
+                      , "    %s/%s.%s:%s\n"
+                      , ctx -> loc -> src -> mod
+                      , ctx -> loc -> src -> file
+                      , ctx -> loc -> src -> ext
+                      , ctx -> loc -> func
+                );
+            ctx = ctx -> caller;
+        }
+        while ( ctx != NULL );
+    }
+#endif
+}
+
+/* Whack
+ */
+static
+KThreadEvent * KThreadEventWhack ( KThreadEvent * self )
+{
+    KThreadEvent * next = self -> next;
+
+    /* dump event to log */
+    KThreadEventDump ( NULL, self -> timestamp, self -> node -> loc,
+       self -> lineno, self -> severity, self -> origin,
+       self -> xc, self -> message . addr, self -> node );
+
+    free ( self );
+    return next;
+}
+
+static
+void KThreadEventWhackAll ( KThreadEvent * self )
+{
+    do
+        self = KThreadEventWhack ( self );
+    while ( self != NULL );
+}
+
+/* Clear
+ */
+static
+void KThreadEventClear ( KThreadEvent * self )
+{
+    if ( self -> next != NULL )
+        KThreadEventClear ( self -> next );
+    free ( self );
+}
+
+/* Make
+ */
+static
+KThreadEvent * KThreadEventMake ( ctx_t ctx,
+    uint32_t lineno, xc_sev_t severity, xc_org_t origin,
+    xc_t xc, const char * msg, va_list args )
+{
+    KThreadEvent * evt;
+    KTime_t ts = KTimeStamp ();
+
+    char * c;
+    size_t num_writ;
+    char msg_buffer [ 4096 ];
+    rc_t rc = string_vprintf ( msg_buffer, sizeof msg_buffer, & num_writ, msg, args );
+    if ( rc != 0 || num_writ >= sizeof msg_buffer )
+        string_printf ( msg_buffer, sizeof msg_buffer, & num_writ, "** BAD MESSAGE STRING **" );
+
+    if ( num_writ > 0 && msg_buffer [ num_writ - 1 ] == '.' )
+        msg_buffer [ -- num_writ ] = 0;
+
+    evt = malloc ( sizeof * evt + num_writ + 1 );
+    if ( evt == NULL )
+    {
+        /* ATTEMPT TO DUMP TO LOG */
+        KThreadEventDump ( ctx, ts, ctx -> loc, lineno, severity, origin, xc, msg_buffer, NULL );
+        exit ( -1 );
+    }
+
+    evt -> node = NULL;
+    evt -> next = NULL;
+
+    evt -> xc = ( const XCErr * ) xc;
+    evt -> timestamp = ts;
+    evt -> severity = severity;
+    evt -> origin = origin;
+    evt -> lineno = lineno;
+
+    c = ( char* ) ( evt + 1 );
+    memmove ( c, msg_buffer, num_writ + 1 );
+    StringInit ( & evt -> message, c, num_writ, string_len ( c, num_writ ) );
+
+    return evt;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KThreadEvtNode
+ *  exection state belonging to the current thread
+ */
+
+
+/* Whack
+ */
+static
+void KThreadEvtNodeWhackAll ( KThreadEvtNode * self )
+{
+    if ( self -> evt )
+        KThreadEventWhackAll ( self -> evt );
+
+    if ( self -> child )
+        KThreadEvtNodeWhackAll ( self -> child );
+
+    if ( self -> next )
+        KThreadEvtNodeWhackAll ( self -> next );
+
+    free ( self );
+}
+
+
+/* Clear
+ */
+static
+void KThreadEvtNodeClear ( KThreadEvtNode * self )
+{
+    if ( self -> evt )
+        KThreadEventClear ( self -> evt );
+
+    if ( self -> child )
+        KThreadEvtNodeClear ( self -> child );
+
+    if ( self -> next )
+        KThreadEvtNodeClear ( self -> next );
+
+    free ( self );
+}
+
+/* Make
+ */
+static
+KThreadEvtNode * KThreadEvtNodeMake ( ctx_t ctx )
+{
+    KThreadEvtNode * node = ts_alloc ( sizeof * node, true );
+    node -> loc = ctx -> loc;
+    node -> zdepth = ctx -> zdepth;
+    return node;
+}
+
+
+/* AddChild
+ */
+static
+KThreadEvtNode * KThreadEvtNodeAddChild ( KThreadEvtNode * self, KThreadEvtNode * child )
+{
+    KThreadEvtNode * existing = self -> child;
+    if ( existing == NULL )
+        self -> child = child;
+    else
+    {
+        while ( existing -> next != NULL )
+            existing = existing -> next;
+        existing -> next = child;
+    }
+    child -> parent = self;
+    return self;
+}
+
+
+/* AddEvent
+ */
+static
+void KThreadEvtNodeAddEvent ( KThreadEvtNode * self, KThreadEvent * evt )
+{
+    KThreadEvent * existing = self -> evt;
+    if ( existing == NULL )
+        self -> evt = evt;
+    else
+    {
+        while ( existing -> next != NULL )
+            existing = existing -> next;
+        existing -> next = evt;
+    }
+    evt -> node = self;
+}
+
+
+/* Unlink
+ */
+static
+void KThreadEvtNodeUnlink ( KThreadEvtNode * self )
+{
+    KThreadEvtNode * par, * sib;
+
+    par = self -> parent;
+    assert ( par != NULL );
+    sib = par -> child;
+
+    if ( sib == self )
+        par -> child = self -> next;
+    else
+    {
+        while ( sib -> next != self )
+        {
+            assert ( sib -> next != NULL );
+            sib = sib -> next;
+        }
+        sib -> next = self -> next;
+    }
+
+    self -> parent = NULL;
+    self -> next = NULL;
+}
+
+
+/* Locate
+ */
+static
+KThreadEvtNode * KThreadEvtNodeLocate ( KThreadEvtNode * self, uint32_t zdepth )
+{
+    assert ( zdepth <= self -> zdepth );
+    while ( zdepth < self -> zdepth )
+    {
+        assert ( self -> parent != NULL );
+        self = self -> parent;
+    }
+    return self;
+}
+
+
+/* FindDominant
+ */
+static
+KThreadEvent * KThreadEvtNodeFindDominant ( const KThreadEvtNode * self, const KThreadEvtNode * prune, KThreadEvent * dom )
+{
+    /* scan events within this node */
+    KThreadEvent * evt = self -> evt;
+    while ( evt != NULL )
+    {
+        if ( dom == NULL )
+            dom = evt;
+        else if ( evt -> severity > dom -> severity )
+            dom = evt;
+        evt = evt -> next;
+    }
+
+    /* scan child events */
+    self = self -> child;
+    while ( self != NULL )
+    {
+        if ( self != prune )
+            dom = KThreadEvtNodeFindDominant ( self, NULL, dom );
+        self = self -> next;
+    }
+
+    return dom;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KThreadState
+ *  exection state belonging to the current thread
+ */
+struct KThreadState
+{
+    KThreadEvtNode * eroot;
+};
+
+
+/* Whack
+ */
+void KThreadStateWhack ( KThreadState * self )
+{
+    if ( self != NULL )
+    {
+        if ( self -> eroot != NULL )
+            KThreadEvtNodeWhackAll ( self -> eroot );
+        free ( self );
+    }
+}
+
+
+/* MakeThreadState
+ *  creates state for a newly created thread
+ *  called from the new thread
+ */
+KThreadState * KProcMgrMakeThreadState ( struct KProcMgr const * self )
+{
+    if ( self != NULL )
+    {
+        KThreadState * tstate = ts_alloc ( sizeof * tstate, true );
+        return tstate;
+    }
+
+    return NULL;
+}
+
+
+/* CaptureEvent
+ *  records an event from the exception mechanism
+ */
+void KThreadStateEvent ( KThreadState * self, ctx_t ctx,
+    uint32_t lineno, xc_sev_t severity, xc_org_t origin,
+    xc_t xc, const char * msg, va_list args )
+{
+    KThreadEvtNode * node, * par;
+    KThreadEvent * evt = KThreadEventMake ( ctx, lineno, severity, origin, xc, msg, args );
+
+    /* prepare an RC for this event */
+    rc_t rc = 0;
+    if ( severity > xc_sev_warn )
+    {
+        rc = extract_rc ( ctx -> loc, xc );
+        assert ( rc != 0 );
+    }
+
+    /* handle early errors before managers */
+    if ( self == NULL )
+    {
+        KThreadEventDump ( ctx, evt -> timestamp, ctx -> loc,
+            lineno, severity, origin, xc, evt -> message . addr, NULL );
+        free ( evt );
+        return;
+    }
+
+    /* CASES:
+
+       1. the thread has no existing event state
+          - create new node for call stack
+          - add event to the node
+          - propagate the event and rc up the ctx stack
+          - capture stack trace as node chain
+          - record root node
+
+       2. the current stack frame already has an event
+          - find the corresponding node in stack trace
+          - add event to this node
+          - propagate up call chain while severity > caller.severity
+
+       3. the current stack frame is clear, but some caller has state
+          - create new node for call stack
+          - add event to the node
+          - propagate the event and rc up the ctx stack until frame has event
+          - capture stack trace as node chain
+          - find the corresponding node in stack trace
+          - add node from child frame to common parent node
+          - continue to propagate up call chain while severity > caller.severity
+
+    */
+
+
+    /* case 1 - just propagate up the stack */
+    if ( self -> eroot == NULL )
+    {
+        assert ( ctx -> evt == NULL );
+        assert ( ctx -> rc == 0 );
+
+        /* create a new event node */
+        node = KThreadEvtNodeMake ( ctx );
+
+        /* add the event */
+        KThreadEvtNodeAddEvent ( node, evt );
+        ( ( KCtx * ) ctx ) -> evt = evt;
+        ( ( KCtx * ) ctx ) -> rc = rc;
+
+        /* propagate up the stack */
+        while ( ctx -> caller != NULL )
+        {
+            /* bump up */
+            ctx = ctx -> caller;
+            par = KThreadEvtNodeMake ( ctx );
+
+            /* link */
+            node = KThreadEvtNodeAddChild ( par, node );
+
+            /* record the event */
+            ( ( KCtx * ) ctx ) -> evt = evt;
+            ( ( KCtx * ) ctx ) -> rc = rc;
+        }
+
+        /* record root node */
+        self -> eroot = node;
+    }
+
+    /* cases 2 & 3 - will need to merge */
+    else
+    {
+        KThreadEvent * existing = ctx -> evt;
+
+        /* case 2 - current frame has an event */
+        if ( ctx -> evt != NULL )
+        {
+            /* NB - this may not be so simple, if
+               a canonical ordering is to be achieved.
+               this code falls through to normal propagation,
+               that only favors the new event over existing
+               if it is more severe in nature.
+
+               canonical ordering would be:
+               a) events originating in a frame always
+                  order before child events
+               b) dominant event should be selected
+                  first by severity and second by order
+
+               as it stands, the code allows a previous child
+               event of the same severity to remain dominant.
+
+            */
+
+            node = KThreadEvtNodeLocate ( existing -> node, ctx -> zdepth );
+            KThreadEvtNodeAddEvent ( node, evt );
+        }
+
+        /* case 3 - current frame is clear */
+        else
+        {
+            assert ( ctx -> rc == 0 );
+
+            /* create a new event node */
+            node = KThreadEvtNodeMake ( ctx );
+
+            /* add the event */
+            KThreadEvtNodeAddEvent ( node, evt );
+            ( ( KCtx * ) ctx ) -> evt = evt;
+            ( ( KCtx * ) ctx ) -> rc = rc;
+
+            /* bump up */
+            assert ( ctx -> caller != NULL );
+            ctx = ctx -> caller;
+
+            /* propagate up the stack */
+            while ( ctx -> evt == NULL )
+            {
+                /* make node for this frame */
+                par = KThreadEvtNodeMake ( ctx );
+
+                /* link */
+                node = KThreadEvtNodeAddChild ( par, node );
+
+                /* record the event */
+                ( ( KCtx * ) ctx ) -> evt = evt;
+                ( ( KCtx * ) ctx ) -> rc = rc;
+
+                /* bump up */
+                assert ( ctx -> caller != NULL );
+                ctx = ctx -> caller;
+            }
+
+            /* found nearest existing event */
+            existing = ctx -> evt;
+
+            /* locate common parent node */
+            par = KThreadEvtNodeLocate ( existing -> node, ctx -> zdepth );
+            node = KThreadEvtNodeAddChild ( par, node );
+        }
+
+        /* cases 2 & 3 - propagate event while severity > existing */
+        while ( severity > existing -> severity )
+        {
+            do
+            {
+                /* overwrite prior */
+                ( ( KCtx * ) ctx ) -> evt = evt;
+                ( ( KCtx * ) ctx ) -> rc = rc;
+
+                /* bump up */
+                ctx = ctx -> caller;
+                if ( ctx == NULL )
+                    return;
+            }
+            while ( ctx -> evt == ( void * ) existing );
+
+            assert ( ctx -> evt != NULL );
+            existing = ctx -> evt;
+        }
+    }
+
+    if ( severity == xc_sev_fatal )
+        exit ( -1 );
+}
+
+
+/* ClearEvents
+ *  clears events from a particular point in the callchain
+ *  down toward lower points.
+ */
+void KThreadStateClearEvents ( KThreadState * self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        assert ( ctx != NULL );
+        if ( ctx -> evt != NULL )
+        {
+            /* the recorded event */
+            KThreadEvent * evt = ctx -> evt;
+
+            /* locate the node for this frame */
+            KThreadEvtNode * node = KThreadEvtNodeLocate ( evt -> node, ctx -> zdepth );
+
+            /* douse it and everything below it */
+            if ( node == self -> eroot )
+            {
+                self -> eroot = NULL;
+                KThreadEvtNodeClear ( node );
+
+                do
+                {
+                    ( ( KCtx * ) ctx ) -> evt = NULL;
+                    ( ( KCtx * ) ctx ) -> rc = 0;
+
+                    ctx = ctx -> caller;
+                }
+                while ( ctx != NULL );
+            }
+            else
+            {
+                KThreadEvtNode * par = node -> parent;
+
+                KThreadEvtNodeUnlink ( node );
+                KThreadEvtNodeClear ( node );
+
+                /* WARNING - "evt" and "node" are now dangling! */
+
+                ( ( KCtx * ) ctx ) -> evt = NULL;
+                ( ( KCtx * ) ctx ) -> rc = 0;
+
+                assert ( ctx -> caller != NULL );
+                ctx = ctx -> caller;
+
+                /* look for nodes with no more events */
+                for ( node = par; node != NULL; node = par )
+                {
+                    if ( node -> child != NULL || node -> evt != NULL )
+                        break;
+
+                    par = node -> parent;
+                    if ( par == NULL )
+                        self -> eroot = NULL;
+                    else
+                        KThreadEvtNodeUnlink ( node );
+                    KThreadEvtNodeClear ( node );
+
+                    assert ( ctx != NULL );
+                    assert ( ctx -> evt == ( void * ) evt );
+                    ( ( KCtx * ) ctx ) -> evt = NULL;
+                    ( ( KCtx * ) ctx ) -> rc = 0;
+
+                    ctx = ctx -> caller;
+                }
+
+                assert ( node == NULL || ctx != NULL );
+
+                /* see if it was cleared all the way to root */
+                if ( node == NULL )
+                    self -> eroot = NULL;
+
+                /* see if the dominant evt from the cleared node
+                   had propagated higher up and needs to be reset */
+                else if ( ctx -> evt == ( void* ) evt )
+                {
+                    rc_t rc = 0;
+                    KThreadEvent * dom;
+                    KThreadEvtNode * par;
+
+                    assert ( ctx != NULL );
+
+                    /* AT THIS POINT:
+
+                       the current "node", a parent of the node
+                       originally being cleared, either has its
+                       own event(s) or has children that do.
+
+                       the dominant event of the node we just
+                       cleared ( dangling pointer in "evt" ) had
+                       been propagated as the dominant event of
+                       this ( and possibly further ) parents.
+
+                       we need to establish a new dominant event.
+                       this will be accomplished by visiting the
+                       current node and all of its children to find
+                       the node with the highest severity as first
+                       key, and first in order as second key.
+
+                       NB - we may need to review the code to ensure
+                       there is a canonical ordering in all cases.
+
+                     */
+
+                    dom = KThreadEvtNodeFindDominant ( node, NULL, NULL );
+                    assert ( dom != NULL );
+                    if ( dom -> severity > xc_sev_warn )
+                        rc = extract_rc ( node -> loc, dom -> xc );
+
+                    ( ( KCtx * ) ctx ) -> evt = dom;
+                    ( ( KCtx * ) ctx ) -> rc = rc;
+
+                    par = node -> parent;
+                    ctx = ctx -> caller;
+
+                    while ( par != NULL )
+                    {
+                        KThreadEvent * dom2;
+
+                        /* early exit optimization */
+                        if ( ctx -> evt != ( void * ) evt )
+                            break;
+
+                        /* compete for dominance */
+                        dom2 = KThreadEvtNodeFindDominant ( par, node, dom );
+                        if ( dom2 != dom )
+                        {
+                            rc = 0;
+                            if ( dom2 -> severity > xc_sev_warn )
+                                rc = extract_rc ( node -> loc, dom2 -> xc );
+                            dom = dom2;
+                        }
+
+                        /* update context */
+                        ( ( KCtx * ) ctx ) -> evt = dom;
+                        ( ( KCtx * ) ctx ) -> rc = rc;
+
+                        /* bump up */
+                        par = node -> parent;
+                        ctx = ctx -> caller;
+                    }
+                }
+            }
+        }
+    }
+}
+
+
+/* GetMessage
+ *  retrieve current event message
+ */
+const char * KThreadStateGetMessage ( const KThreadState * self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        assert ( ctx != NULL );
+        if ( ctx -> evt != NULL )
+        {
+            KThreadEvent * evt = ctx -> evt;
+            return evt -> message . addr;
+        }
+    }
+
+    return "";
+}
+
+
+/* IsXCErr
+ */
+bool KThreadStateIsXCErr ( const KThreadState * self, ctx_t ctx, xc_t xc )
+{
+    if ( self != NULL )
+    {
+        assert ( ctx != NULL );
+        if ( ctx -> evt != NULL )
+        {
+            KThreadEvent * evt = ctx -> evt;
+            const XCErr * err = evt -> xc;
+            do
+            {
+                if ( err == ( const XCErr * ) xc )
+                    return true;
+
+                err = err -> dad;
+            }
+            while ( err != NULL );
+        }
+    }
+
+    return false;
+}
+
+/* IsXCObj
+ */
+bool KThreadStateIsXCObj ( const KThreadState * self, ctx_t ctx, xobj_t xo )
+{
+    if ( self != NULL )
+    {
+        assert ( ctx != NULL );
+        if ( ctx -> evt != NULL )
+        {
+            KThreadEvent * evt = ctx -> evt;
+            const XCErr * err = evt -> xc;
+            const XCObj * obj;
+
+            while ( err -> dad != NULL )
+                err = err -> dad;
+
+            obj = err -> obj;
+
+            do
+            {
+                if ( obj == ( const XCObj * ) xo )
+                    return true;
+
+                obj = obj -> dad;
+            }
+            while ( obj != NULL );
+        }
+    }
+
+    return false;
+}
+
+/* IsXCState
+ */
+bool KThreadStateIsXCState ( const KThreadState * self, ctx_t ctx, xstate_t xs )
+{
+    if ( self != NULL )
+    {
+        assert ( ctx != NULL );
+        if ( ctx -> evt != NULL )
+        {
+            KThreadEvent * evt = ctx -> evt;
+            const XCErr * err = evt -> xc;
+            const XCState * state;
+
+            while ( err -> dad != NULL )
+                err = err -> dad;
+
+            state = err -> state;
+
+            do
+            {
+                if ( state == ( const XCState * ) xs )
+                    return true;
+
+                state = state -> dad;
+            }
+            while ( state != NULL );
+        }
+    }
+
+    return false;
+}
diff --git a/libs/kfc/unix/sysctx.c b/libs/kfc/unix/sysctx.c
new file mode 100644
index 0000000..97b8c78
--- /dev/null
+++ b/libs/kfc/unix/sysctx.c
@@ -0,0 +1,192 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/rsrc-global.h>
+#include <kfc/except.h>
+#include <kfc/rc.h>
+#include <kfc/xc.h>
+#include <kproc/procmgr.h>
+
+#include <atomic32.h>
+
+#include "rsrc-priv.h"
+#include "sysctx-priv.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+#include <errno.h>
+#include <assert.h>
+
+/* thread-local storage */
+typedef struct TLS TLS;
+struct TLS
+{
+    KRsrc rsrc;
+    KCtx ctx;
+};
+
+static pthread_key_t key;
+static pthread_once_t key_once = PTHREAD_ONCE_INIT;
+
+
+/* whack
+ *  whack thread-local storage
+ */
+static
+void whack_tls ( void * data )
+{
+    /* the thread-local storage */
+    TLS * tls = data;
+
+    /* the "parent" ctx */
+    ctx_t ctx = & tls -> ctx;
+    FUNC_ENTRY ( ctx, rcRuntime, rcThread, rcDestroying );
+
+    /* whack the resource managers */
+    KRsrcWhack ( & tls -> rsrc, ctx );
+
+    /* free the memory */
+    free ( tls );
+}
+
+
+/* make_tls
+ *  create thread-local storage
+ */
+static
+TLS * make_tls ( const KFuncLoc * func_loc )
+{
+    ctx_t ctx;
+
+    /* create the storage */
+    TLS * tls = calloc ( 1, sizeof * tls );
+    if ( tls == NULL )
+        exit ( ENOMEM );
+
+    /* grab its context */
+    ctx = & tls -> ctx;
+
+    /* recover process-global resources */
+    TRY ( KRsrcGlobalInit ( & tls -> ctx, func_loc, true ) )
+    {
+        /* attach references */
+        TRY ( KRsrcInit ( & tls -> rsrc, ctx ) )
+        {
+            /* reset context */
+            tls -> ctx . rsrc = & tls -> rsrc;
+
+            /* set on thread */
+            pthread_setspecific ( key, tls );
+            assert ( ! FAILED () );
+        }
+    }
+
+    if ( FAILED () )
+    {
+        free ( tls );
+        exit ( -1 );
+    }
+
+    return tls;
+}
+
+
+/* make_key
+ *  initialize the thread-local storage key
+ */
+static
+void make_key ( void )
+{
+    pthread_key_create ( & key, whack_tls );
+}
+
+
+/* get_tls_ctx
+ *  reads thread-local storage
+ */
+static
+const KCtx * get_tls_ctx ( const KFuncLoc * func_loc )
+{
+    TLS * tls;
+
+    if ( KProcMgrOnMainThread () )
+    {
+        static KCtx s_ctx;
+        static bool been_here;
+        ctx_t ctx = & s_ctx;
+
+        if ( been_here )
+            return & s_ctx;
+
+        TRY ( KRsrcGlobalInit ( & s_ctx, func_loc, true ) )
+        {
+            /* done */
+            been_here = true;
+            return & s_ctx;
+        }
+
+        /* terrible failure */
+        exit ( -1 );
+    }
+
+    /* ensure the key is there */
+    pthread_once ( & key_once, make_key );
+
+    /* retrieve the existing tls */
+    tls = pthread_getspecific ( key );
+
+    /* create a new one if missing */
+    if ( tls == NULL )
+    {
+        tls = make_tls ( func_loc );
+        assert ( tls != NULL );
+    }
+
+    return & tls -> ctx;
+}
+
+
+/* ctx_recover
+ *  queries thread for previously stored KRsrc block
+ *  creates a new one if necessary
+ */
+ctx_t ctx_recover ( KCtx * new_ctx, const KFuncLoc * func_loc )
+{
+    DECLARE_FUNC_LOC ( rcRuntime, rcMgr, rcOpening );
+
+    if ( new_ctx != NULL )
+    {
+        const KCtx * ctx = get_tls_ctx ( & s_func_loc );
+
+        /* clear new_ctx and initialize special members */
+        RESET_CTX(new_ctx, ctx, func_loc);
+    }
+
+    return new_ctx;
+}
diff --git a/libs/kfc/unix/sysrsrc.c b/libs/kfc/unix/sysrsrc.c
new file mode 100644
index 0000000..212a27b
--- /dev/null
+++ b/libs/kfc/unix/sysrsrc.c
@@ -0,0 +1,148 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/extern.h>
+#include <kfc/rsrc.h>
+#include <kfc/rsrc-global.h>
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/rc.h>
+#include <kfc/xc.h>
+#include <kproc/procmgr.h>
+#include <atomic32.h>
+
+#include "rsrc-priv.h"
+
+#include <pthread.h>
+#include <string.h>
+#include <assert.h>
+
+
+static KRsrc s_rsrc;
+static atomic32_t s_initialized;
+static pthread_mutex_t crit = PTHREAD_MUTEX_INITIALIZER;
+
+static
+void atexit_task ( void )
+{
+    if ( atomic32_read ( & s_initialized ) == 2 )
+    {
+        KCtx local_ctx;
+        DECLARE_FUNC_LOC ( rcRuntime, rcMgr, rcDestroying );
+        memset ( & local_ctx, 0, sizeof local_ctx );
+        local_ctx . rsrc = & s_rsrc;
+        local_ctx . loc = & s_func_loc;
+
+        KRsrcGlobalWhack ( & local_ctx );
+    }
+}
+
+/* Global
+ *  retrieve process-global singleton KRsrc block
+ *  creates and initializes block on initial request
+ *  caches pointer for subsequent requests
+ */
+void KRsrcGlobalInit ( KCtx * ctx, const KFuncLoc * loc, bool full )
+{
+    int initialized;
+
+    assert ( ctx != NULL );
+    assert ( loc != NULL );
+
+    /* initialize caller's top-level ctx */
+    memset ( ctx, 0, sizeof * ctx );
+    ctx -> rsrc = & s_rsrc;
+    ctx -> loc = loc;
+
+    /* singleton initialization */
+    initialized = atomic32_read ( & s_initialized );
+    if ( 0 <= initialized && initialized < 2 )
+    {
+        /* acquire lock */
+        int status = pthread_mutex_lock ( & crit );
+        if ( status != 0 )
+            exit ( status );
+
+        initialized = atomic32_read ( & s_initialized );
+        if ( 0 <= initialized && initialized < 2 )
+        {
+            KCtx local_ctx;
+            DECLARE_FUNC_LOC ( rcRuntime, rcMgr, rcConstructing );
+
+            /* link a new local context */
+            ctx_init ( & local_ctx, ( ctx_t* ) & ctx, & s_func_loc );
+
+            /* common initializer-errors are
+               propagated to and handled by caller */
+            rsrc_init ( & s_rsrc, ctx, full );
+
+            /* mark the level of initialization */
+            atomic32_set ( & s_initialized, full ? 2 : 1 );
+
+            if ( full )
+            {
+                /* register global cleanup */
+                status = atexit ( atexit_task );
+                if ( status != 0 )
+                    SYSTEM_ERROR ( xcUnexpected, "atexit failed: %!", status );
+            }
+        }
+
+        /* release lock */
+        pthread_mutex_unlock ( & crit );
+    }
+}
+
+
+/* Whack
+ *  the global KRsrc may be referenced by local KRsrc
+ */
+void KRsrcGlobalWhack ( ctx_t ctx )
+{
+    if ( atomic32_read ( & s_initialized ) > 0 )
+    {
+        /* acquire lock, but ignore status */
+        int status = pthread_mutex_lock ( & crit );
+        if ( status != 0 || atomic32_read ( & s_initialized ) > 0 )
+        {
+            /* early whack of KProcMgr */
+            KProcMgrRelease ( s_rsrc . proc );
+            s_rsrc . proc = NULL;
+
+            /* run destructor tasks while we still have other mgrs */
+            KProcMgrWhack ();
+
+            /* tear it down */
+            KRsrcWhack ( & s_rsrc, ctx );
+
+            /* mark as torn down */
+            atomic32_set ( & s_initialized, -1 );
+        }
+
+        /* release lock */
+        pthread_mutex_unlock ( & crit );
+    }
+}
diff --git a/libs/kfc/vtbl.c b/libs/kfc/vtbl.c
new file mode 100644
index 0000000..6a0d6b3
--- /dev/null
+++ b/libs/kfc/vtbl.c
@@ -0,0 +1,208 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+typedef struct KVTableCacheCleanup KVTableCacheCleanup;
+#define KTASK_IMPL KVTableCacheCleanup
+
+#include <sysalloc.h>
+
+#include <kfc/extern.h>
+#include <kfc/vtbl-impl.h>
+#include <kfc/except.h>
+#include <kfc/ctx.h>
+#include <kfc/xc.h>
+
+#include <kproc/impl.h>
+#include <atomic.h>
+
+
+/* KVTableCacheCleanup
+ */
+struct KVTableCacheCleanup
+{
+    /* THIS WILL BREAK WHEN TASK GETS CONVERTED
+       SHOULD BE EXPLICITLY KTask_v1
+       NB - don't use KTask_v2, because that will
+       have a vtable being cleaned up */
+    KTask dad;
+
+    /* all vtable caches are stored in a singly-linked list */
+    atomic_ptr_t list;
+};
+
+/* Whack
+ *  
+ */
+static
+rc_t CC KVTableCacheCleanupWhack ( KVTableCacheCleanup * self )
+{
+    KTaskDestroy ( & self -> dad, "KVTableCacheCleanup" );
+    free ( self );
+    return 0;
+}
+
+/* Execute
+ *  perform deferred operation
+ */
+static
+rc_t CC KVTableCacheCleanupExecute ( KVTableCacheCleanup * self )
+{
+    KHierCache * test, * read = self -> list . ptr;
+    if ( read != NULL ) do
+        read = atomic_test_and_set_ptr ( & self -> list, NULL, test = read );
+    while ( read != test );
+
+    while ( read != NULL )
+    {
+        test = ( void* ) read -> next;
+        /* may insert a debug statement here */
+        free ( read );
+        read = test;
+    }
+
+    return 0;
+}
+
+static
+KTask_vt_v1 KVTableCacheCleanup_vt =
+{
+    1, 0,
+    KVTableCacheCleanupWhack,
+    KVTableCacheCleanupExecute
+};
+
+static
+void KVTableAddHierCacheToCleanupTask ( KHierCache * cache, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcRuntime, rcQueue, rcInserting );
+
+    KHierCache * test, * read;
+    KVTableCacheCleanup * local_task;
+
+    static atomic_ptr_t cleanup_task;
+    if ( cleanup_task . ptr == NULL )
+    {
+        rc_t rc;
+        local_task = malloc ( sizeof * local_task );
+        if ( local_task == NULL )
+        {
+            SYSTEM_ERROR ( xcNoMemory, "allocating %zu bytes", sizeof * local_task );
+            return;
+        }
+
+        rc = KTaskInit ( & local_task -> dad,
+            ( const KTask_vt* ) & KVTableCacheCleanup_vt, "KVTableCacheCleanup", "" );
+        if ( rc != 0 )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "%R", rc );
+            ( ( KCtx* ) ctx ) -> rc = rc;
+            free ( local_task );
+            return;
+        }
+
+        cache -> next = NULL;
+        local_task -> list . ptr = cache;
+        if ( atomic_test_and_set_ptr ( & cleanup_task, local_task, NULL ) == NULL )
+            return;
+
+        KVTableCacheCleanupWhack ( local_task );
+    }
+
+    local_task = cleanup_task . ptr;
+    read = local_task -> list . ptr;
+    do
+    {
+        cache -> next = test = read;
+        read = atomic_test_and_set_ptr ( & local_task -> list, cache, test );
+    }
+    while ( read != test );
+}
+
+
+/* Depth
+ */
+static
+uint32_t KVTableDepth ( KVTable * self /*, ctx_t ctx */ )
+{
+    uint32_t idx;
+
+    assert ( self -> itf != NULL );
+    idx = self -> itf -> idx;
+
+    if ( idx == 0 )
+    {
+        KItfTok * itf = ( KItfTok * ) self -> itf;
+        if ( self -> parent != NULL )
+            idx = KVTableDepth ( ( KVTable* ) self -> parent /*, ctx */ ) + 1;
+        else
+            idx = 1;
+        itf -> idx = idx;
+    }
+
+    return idx;
+}
+
+
+/* Resolve
+ *  walks a vtable's hierarchy
+ *  builds a linear array cache of casting pointers
+ *  dynamically configures KItfTok objects to cache their runtime offset
+ */
+void KVTableResolve ( const KVTable * cself, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcRuntime, rcTable, rcResolving );
+
+    KVTable * self = ( KVTable* ) cself;
+    if ( self != NULL && self -> cache == NULL )
+    {
+        uint32_t idx = KVTableDepth ( self /*, ctx */ );
+
+        KHierCache * cache;
+        size_t bytes = sizeof * cache - sizeof cache -> parent + idx * sizeof cache -> parent [ 0 ];
+
+        cache = malloc ( bytes );
+        if ( cache == NULL )
+            SYSTEM_ERROR ( xcNoMemory, "allocating %zu bytes", bytes );
+        else
+        {
+            cache -> next = NULL;
+            cache -> length = idx;
+
+            TRY ( KVTableAddHierCacheToCleanupTask ( cache, ctx ) )
+            {
+                self -> cache = cache;
+
+                do
+                {
+                    assert ( idx != 0 );
+                    cache -> parent [ -- idx ] = self;
+                    self = ( KVTable* ) self -> parent;
+                }
+                while ( self != NULL );
+            }
+        }
+    }
+}
diff --git a/libs/kfc/xc.c b/libs/kfc/xc.c
new file mode 100644
index 0000000..c1f800d
--- /dev/null
+++ b/libs/kfc/xc.c
@@ -0,0 +1,36 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/extern.h>
+
+/* generate forward declarations for everything */
+#include <kfc/xcext.h>
+#include <kfc/xc.h>
+
+/* generate static definitions */
+#undef _h_kfc_xc_
+#include <kfc/xcgen.h>
+#include <kfc/xc.h>
diff --git a/libs/kfg/.gitignore b/libs/kfg/.gitignore
new file mode 100644
index 0000000..d7efc7e
--- /dev/null
+++ b/libs/kfg/.gitignore
@@ -0,0 +1,2 @@
+*.def
+*.output
diff --git a/libs/kfg/Makefile b/libs/kfg/Makefile
new file mode 100644
index 0000000..d30c7ef
--- /dev/null
+++ b/libs/kfg/Makefile
@@ -0,0 +1,128 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: all
+
+TOP ?= $(abspath ../..)
+MODULE = libs/kfg
+
+INT_LIBS = \
+	libkfg
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(KFG_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+#INTERM_SRC = \
+	$(SRCDIR)/config-lex.c \
+	$(SRCDIR)/config-grammar.c \
+	$(SRCDIR)/config-tokens.h
+
+clean: stdclean
+	@ rm -f $(addsuffix /default.kfg,$(NCBIDIR))
+
+.PHONY: clean
+
+#.SECONDARY: $(INTERM_SRC)
+
+#-------------------------------------------------------------------------------
+# kfg
+#
+$(ILIBDIR)/libkfg: \
+	$(TARGDIR)/default.kfg \
+	$(TARGDIR)/certs.kfg \
+	$(addprefix $(ILIBDIR)/libkfg.,$(ILIBEXT))
+
+$(TARGDIR)/default.kfg: $(addsuffix /default.kfg,$(NCBIDIR))
+
+$(TARGDIR)/certs.kfg: $(addsuffix /certs.kfg,$(NCBIDIR))
+
+$(addsuffix /default.kfg,$(NCBIDIR)): $(SRCDIR)/default.kfg
+	cp $^ $@
+
+$(addsuffix /certs.kfg,$(NCBIDIR)): $(SRCDIR)/certs.kfg
+	cp $^ $@
+
+KFG_SRC = \
+	config-lex \
+	config-grammar \
+	config \
+	config-aws \
+	kart \
+	repository \
+	properties \
+	ngc \
+	report-kfg \
+    keystore
+
+# flex/bison should only be invoked manually in an environment ensures the correct versions:
+# bison 2.5, flex 2.5.35
+bison:
+	bison -o $(SRCDIR)/config-grammar.c --defines=$(SRCDIR)/config-tokens.h -v --no-lines $(SRCDIR)/config-grammar.y
+
+flex:
+	flex -t $(SRCDIR)/config-lex.l | grep -v '^#line' > $(SRCDIR)/config-lex.c
+
+#$(SRCDIR)/config-grammar.c $(SRCDIR)/config-tokens.h: $(SRCDIR)/config-grammar.y
+#	$(YACC) -o $(SRCDIR)/config-grammar.c --defines=$(SRCDIR)/config-tokens.h $^
+
+KFG_OBJ = \
+	$(addsuffix .$(LOBX),$(KFG_SRC))
+
+KFG_LIB = \
+	-dkfs \
+	-dklib
+
+$(ILIBDIR)/libkfg.$(LIBX): $(KFG_OBJ)
+	$(LD) --slib -o $@ $^ $(KFG_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/kfg/certs.kfg b/libs/kfg/certs.kfg
new file mode 100644
index 0000000..96d4122
--- /dev/null
+++ b/libs/kfg/certs.kfg
@@ -0,0 +1,31 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+##################
+# trusted CA certs
+
+/tls/ca.crt/ncbi1 = "-----BEGIN CERTIFICATE-----\r\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\r\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\r\nQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\r\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\r\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\r\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvh [...]
+
+/tls/ca.crt/ncbi2 = "-----BEGIN CERTIFICATE-----\r\nMIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\r\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\nd3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\r\nZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\r\nMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\r\nLmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\r\nRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcN [...]
diff --git a/libs/kfg/config-aws.c b/libs/kfg/config-aws.c
new file mode 100644
index 0000000..fb702f7
--- /dev/null
+++ b/libs/kfg/config-aws.c
@@ -0,0 +1,287 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+
+#include <ctype.h>
+#include <os-native.h>
+#include <stdlib.h>
+
+#include <kfg/kfg-priv.h>
+
+static
+rc_t aws_KConfigNodeUpdateChild ( KConfigNode *self, String *name, String *value )
+{
+    KConfigNode * child;
+    rc_t rc = KConfigNodeOpenNodeUpdate ( self, & child, "%S", name );
+    if ( rc == 0 )
+    {
+        rc = KConfigNodeWrite ( child, value -> addr, value -> size );
+        KConfigNodeRelease ( child );
+    }
+
+    return rc;
+}
+
+static
+rc_t aws_extract_key_value_pair ( const String *source, String *key, String *val )
+{
+    String k, v;
+    const char *start = source -> addr;
+    const char *end = start + source -> size;
+
+    char *eql = string_chr ( start, source -> size, '=' );
+    if ( eql == NULL )
+        return RC ( rcKFG, rcChar, rcSearching, rcFormat, rcInvalid );
+
+    /* key */
+    StringInit ( &k, start, eql - start, string_len ( start, eql - start ) );
+    StringTrim ( &k, key );
+
+    start = eql + 1;
+
+    /* value */
+    StringInit ( &v, start, end - start,  string_len ( start, end - start ) ); 
+    StringTrim ( &v, val );
+    return 0;
+}
+
+static
+void aws_parse_file ( const KFile *self, KConfigNode *aws_node, 
+                      char *buffer, size_t buf_size, bool isCredentialsFile )
+{
+    char *sep;
+    const char *start = buffer;
+    const char *end = start + buf_size;
+
+    for ( ; start < end; start = sep + 1 )
+    {
+        rc_t rc;
+        String string, trim;
+        String key, value;
+        
+        sep = string_chr ( start, end - start, '\n' );
+        if ( sep == NULL )
+            sep = ( char * ) end;
+
+        StringInit ( &string, start, sep - start, string_len ( start, sep - start ) );
+        
+        StringTrim ( &string, &trim );
+
+        /* check for comment line and skip */
+        if ( StringLength ( & trim ) != 0 && trim . addr [ 0 ] == '#' )
+            continue;
+
+        /* check for [default] line */
+        if ( StringLength ( & trim ) != 0 && trim . addr [ 0 ] == '[' )
+            continue;
+
+        /* check for key/value pairs and skip if none found */
+        rc = aws_extract_key_value_pair ( &trim, &key, &value );
+        if ( rc != 0 )
+            continue;
+
+        /* now check keys we are looking for and populate the node*/
+        if ( isCredentialsFile )
+        {
+            String access_key_id, secret_access_key;
+            CONST_STRING ( &access_key_id, "aws_access_key_id" );
+            CONST_STRING ( &secret_access_key, "aws_secret_access_key" );
+
+            if ( StringCaseEqual ( &key, &access_key_id ) )
+            {
+                rc = aws_KConfigNodeUpdateChild ( aws_node, &key, &value );
+                if ( rc != 0 )
+                    return;
+            }
+            if ( StringCaseEqual ( &key, &secret_access_key  ) )
+            {
+                rc = aws_KConfigNodeUpdateChild ( aws_node, &key, &value );
+                if ( rc != 0 )
+                    return;
+            }
+        }
+        else
+        {
+            String region, output;
+            CONST_STRING ( &region, "region" );
+            CONST_STRING ( &output, "output" );
+
+            if ( StringCaseEqual ( &key, &region ) )
+            {
+                rc = aws_KConfigNodeUpdateChild ( aws_node, &key, &value );
+                if ( rc != 0 )
+                    return;
+            }
+            if ( StringCaseEqual ( &key, &output  ) )
+            {
+                rc = aws_KConfigNodeUpdateChild ( aws_node, &key, &value );
+                if ( rc != 0 )
+                    return;
+            }
+        }
+    }
+}
+
+static
+rc_t aws_find_nodes ( KConfigNode *aws_node, const char *aws_path )
+{
+    KDirectory *wd;
+
+    rc_t rc = KDirectoryNativeDir ( &wd );
+    if ( rc == 0 )
+    {
+        char *buffer;
+        size_t num_read;
+        uint64_t buf_size;
+
+        const KFile *credentials, *config;
+
+        rc = KDirectoryOpenFileRead ( wd, &credentials, "%s%s", aws_path, "/credentials" );
+        if ( rc == 0 )
+        {
+            rc = KFileSize ( credentials, &buf_size );
+            if ( rc == 0 )
+            {
+                buffer = malloc ( buf_size );
+                if ( buffer != NULL )
+                {
+                    rc = KFileReadAll ( credentials, 0, buffer, ( size_t ) buf_size, &num_read );
+
+                    if ( rc == 0 )
+                        aws_parse_file ( credentials, aws_node, buffer, num_read, true );
+
+                    free ( buffer );
+                }
+
+            }
+
+            KFileRelease ( credentials );
+        }
+
+        rc = KDirectoryOpenFileRead ( wd, &config, "%s%s", aws_path, "/config" );
+        if ( rc == 0 )
+        {
+            rc = KFileSize ( config, &buf_size );
+            if ( rc == 0 )
+            {
+                buffer = malloc ( buf_size );
+                if ( buffer != NULL )
+                {
+                    rc = KFileReadAll ( config, 0, buffer, ( size_t ) buf_size, &num_read );
+                    
+                    if ( rc == 0 )
+                        aws_parse_file ( config, aws_node, buffer, num_read, false );
+
+                    free ( buffer );
+                }
+            }
+
+            KFileRelease ( config );
+        }
+
+        KDirectoryRelease ( wd );
+    }            
+           
+    return rc;
+}
+
+
+static
+void check_env ( const KConfig *self, char *path, size_t path_size )
+{
+    size_t num_read;
+    const char *home;
+    
+    const KConfigNode *home_node;
+    
+    /* Check to see if home node exists */
+    rc_t rc = KConfigOpenNodeRead ( self, &home_node, "HOME" );
+    if ( home_node == NULL )
+    {
+        /* just grab the HOME env variable */
+        home = getenv ( "HOME" );
+        if ( home != NULL )
+        {
+            num_read = string_copy_measure ( path, path_size, home );
+            if ( num_read >= path_size )
+                path [ 0 ] = 0;
+        }
+    }
+    else
+    {
+        /* if it exists check for a path */
+        rc = KConfigNodeRead ( home_node, 0, path, path_size, &num_read, NULL );
+        if ( rc != 0 )
+        {
+            home = getenv ( "HOME" );
+            if ( home != NULL )
+            {
+                num_read = string_copy_measure ( path, path_size, home );
+                if ( num_read >= path_size )
+                    path [ 0 ] = 0;
+            }
+
+        }
+        
+        rc = KConfigNodeRelease ( home_node );
+    }
+}
+
+extern
+void add_aws_nodes ( KConfig *self )
+{
+    char home [ 4096 ] = "";
+
+    size_t num_writ;
+    char path [ 4096 ];
+    rc_t rc;
+
+    check_env ( self, home, sizeof home );
+    /* if home environtment is found, create AWS root node */
+
+    if ( home [ 0 ] != 0 )
+    {
+        rc = string_printf ( path, sizeof path, &num_writ, "%s/.aws", home );
+        if ( rc == 0 && num_writ != 0 )
+        {
+            KConfigNode *aws_node;
+            
+            /* create aws node */
+            rc = KConfigOpenNodeUpdate ( self, &aws_node, "AWS", NULL );
+            if ( rc == 0 )
+                rc = aws_find_nodes ( aws_node, path );
+            
+            rc = KConfigNodeRelease ( aws_node );
+        }
+    }
+}
diff --git a/libs/kfg/config-grammar.c b/libs/kfg/config-grammar.c
new file mode 100644
index 0000000..99bd538
--- /dev/null
+++ b/libs/kfg/config-grammar.c
@@ -0,0 +1,1726 @@
+/* A Bison parser, made by GNU Bison 2.5.  */
+
+/* Bison implementation for Yacc-like parsers in C
+   
+      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+   
+   This program 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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+   
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "2.5"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 1
+
+/* Push parsers.  */
+#define YYPUSH 0
+
+/* Pull parsers.  */
+#define YYPULL 1
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* Substitute the variable and function names.  */
+#define yyparse         KFG_parse
+#define yylex           KFG_lex
+#define yyerror         KFG_error
+#define yylval          KFG_lval
+#define yychar          KFG_char
+#define yydebug         KFG_debug
+#define yynerrs         KFG_nerrs
+
+
+/* Copy the first part of user declarations.  */
+
+  
+    #include "kfg-parse.h"
+    #include <sysalloc.h>
+    #include <klib/rc.h>
+    #include <klib/namelist.h>
+    
+    #define YYSTYPE KFGSymbol
+    #include "config-tokens.h"
+        
+    #define KFG_lex KFGScan_yylex
+    
+    /* required parameter to VNamelistMake */
+    #define NAMELIST_ALLOC_BLKSIZE 10
+    
+    static void ReportRc(KFGParseBlock* pb, KFGScanBlock* sb, rc_t rc);
+    static void AppendName(KFGScanBlock* sb, VNamelist*, const KFGToken*);
+    static void KFG_error(KFGParseBlock* pb, KFGScanBlock* sb, const char* msg);
+
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     kfgEND_INPUT = 0,
+     kfgEND_LINE = 258,
+     kfgUNTERM_STRING = 259,
+     kfgUNTERM_ESCAPED_STRING = 260,
+     kfgUNRECOGNIZED = 261,
+     kfgVAR_REF = 262,
+     kfgUNTERM_VAR_REF = 263,
+     kfgASSIGN = 264,
+     kfgSTRING = 265,
+     kfgESCAPED_STRING = 266,
+     kfgABS_PATH = 267,
+     kfgREL_PATH = 268
+   };
+#endif
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+
+    KFGToken                pb;
+    const struct VNamelist* namelist;
+
+
+
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+/* Copy the second part of user declarations.  */
+
+
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+    int yyi;
+#endif
+{
+  return yyi;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#     ifndef EXIT_SUCCESS
+#      define EXIT_SUCCESS 0
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+#  endif
+# else
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+#  endif
+#  if (defined __cplusplus && ! defined EXIT_SUCCESS \
+       && ! ((defined YYMALLOC || defined malloc) \
+	     && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef EXIT_SUCCESS
+#    define EXIT_SUCCESS 0
+#   endif
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  yytype_int16 yyss_alloc;
+  YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+      + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
+    do									\
+      {									\
+	YYSIZE_T yynewbytes;						\
+	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
+	Stack = &yyptr->Stack_alloc;					\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+	yyptr += yynewbytes / sizeof (*yyptr);				\
+      }									\
+    while (YYID (0))
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined __GNUC__ && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)		\
+      do					\
+	{					\
+	  YYSIZE_T yyi;				\
+	  for (yyi = 0; yyi < (Count); yyi++)	\
+	    (To)[yyi] = (From)[yyi];		\
+	}					\
+      while (YYID (0))
+#  endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state.  */
+#define YYFINAL  13
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   21
+
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  14
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  8
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  17
+/* YYNRULES -- Number of states.  */
+#define YYNSTATES  23
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   268
+
+#define YYTRANSLATE(YYX)						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const yytype_uint8 yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const yytype_uint8 yyprhs[] =
+{
+       0,     0,     3,     5,     7,     9,    12,    17,    19,    22,
+      24,    26,    28,    30,    32,    35,    38,    40
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int8 yyrhs[] =
+{
+      15,     0,    -1,    16,    -1,     0,    -1,    17,    -1,    16,
+      17,    -1,    18,    19,    20,    21,    -1,     3,    -1,     1,
+      21,    -1,    12,    -1,    13,    -1,     9,    -1,    10,    -1,
+      11,    -1,    20,    10,    -1,    20,    11,    -1,     3,    -1,
+       0,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const yytype_uint8 yyrline[] =
+{
+       0,    84,    84,    85,    89,    90,    94,   103,   104,   108,
+     109,   113,   117,   118,   119,   120,   124,   125
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+static const char *const yytname[] =
+{
+  "kfgEND_INPUT", "error", "$undefined", "kfgEND_LINE",
+  "kfgUNTERM_STRING", "kfgUNTERM_ESCAPED_STRING", "kfgUNRECOGNIZED",
+  "kfgVAR_REF", "kfgUNTERM_VAR_REF", "kfgASSIGN", "kfgSTRING",
+  "kfgESCAPED_STRING", "kfgABS_PATH", "kfgREL_PATH", "$accept", "config",
+  "name_value_pairs", "name_value_pair", "pathname", "assign_op", "value",
+  "line_end", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const yytype_uint16 yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,    14,    15,    15,    16,    16,    17,    17,    17,    18,
+      18,    19,    20,    20,    20,    20,    21,    21
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     1,     1,     1,     2,     4,     1,     2,     1,
+       1,     1,     1,     1,     2,     2,     1,     1
+};
+
+/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
+   Performed when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const yytype_uint8 yydefact[] =
+{
+       0,     3,     0,     7,     9,    10,     0,     0,     4,     0,
+      17,    16,     8,     1,     5,    11,     0,    12,    13,     0,
+      14,    15,     6
+};
+
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int8 yydefgoto[] =
+{
+      -1,     6,     7,     8,     9,    16,    19,    12
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -5
+static const yytype_int8 yypact[] =
+{
+       0,    -5,     6,    -5,    -5,    -5,     2,     4,    -5,     1,
+      -5,    -5,    -5,    -5,    -5,    -5,    10,    -5,    -5,     8,
+      -5,    -5,    -5
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yytype_int8 yypgoto[] =
+{
+      -5,    -5,    -5,     7,    -5,    -5,    -5,    -4
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -3
+static const yytype_int8 yytable[] =
+{
+       1,     2,    13,     3,    -2,     2,    10,     3,    10,    11,
+      15,    11,     4,     5,    14,    22,     4,     5,    20,    21,
+      17,    18
+};
+
+#define yypact_value_is_default(yystate) \
+  ((yystate) == (-5))
+
+#define yytable_value_is_error(yytable_value) \
+  YYID (0)
+
+static const yytype_uint8 yycheck[] =
+{
+       0,     1,     0,     3,     0,     1,     0,     3,     0,     3,
+       9,     3,    12,    13,     7,    19,    12,    13,    10,    11,
+      10,    11
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const yytype_uint8 yystos[] =
+{
+       0,     0,     1,     3,    12,    13,    15,    16,    17,    18,
+       0,     3,    21,     0,    17,     9,    19,    10,    11,    20,
+      10,    11,    21
+};
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		(-2)
+#define YYEOF		0
+
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT		goto yyabortlab
+#define YYERROR		goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  However,
+   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
+   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
+   discussed.  */
+
+#define YYFAIL		goto yyerrlab
+#if defined YYFAIL
+  /* This is here to suppress warnings from the GCC cpp's
+     -Wunused-macros.  Normally we don't worry about that warning, but
+     some users do, and we want to make it easy for users to remove
+     YYFAIL uses, which will produce warnings from Bison 2.5.  */
+#endif
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)					\
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    {								\
+      yychar = (Token);						\
+      yylval = (Value);						\
+      YYPOPSTACK (1);						\
+      goto yybackup;						\
+    }								\
+  else								\
+    {								\
+      yyerror (pb, sb, YY_("syntax error: cannot back up")); \
+      YYERROR;							\
+    }								\
+while (YYID (0))
+
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)				\
+    do									\
+      if (YYID (N))                                                    \
+	{								\
+	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
+	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
+	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
+	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
+	}								\
+      else								\
+	{								\
+	  (Current).first_line   = (Current).last_line   =		\
+	    YYRHSLOC (Rhs, 0).last_line;				\
+	  (Current).first_column = (Current).last_column =		\
+	    YYRHSLOC (Rhs, 0).last_column;				\
+	}								\
+    while (YYID (0))
+#endif
+
+
+/* This macro is provided for backward compatibility. */
+
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
+#else
+# define YYLEX yylex (&yylval, sb)
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)			\
+do {						\
+  if (yydebug)					\
+    YYFPRINTF Args;				\
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
+do {									  \
+  if (yydebug)								  \
+    {									  \
+      YYFPRINTF (stderr, "%s ", Title);					  \
+      yy_symbol_print (stderr,						  \
+		  Type, Value, pb, sb); \
+      YYFPRINTF (stderr, "\n");						  \
+    }									  \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, KFGParseBlock* pb, KFGScanBlock* sb)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep, pb, sb)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+    KFGParseBlock* pb;
+    KFGScanBlock* sb;
+#endif
+{
+  if (!yyvaluep)
+    return;
+  YYUSE (pb);
+  YYUSE (sb);
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+	break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, KFGParseBlock* pb, KFGScanBlock* sb)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep, pb, sb)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+    KFGParseBlock* pb;
+    KFGScanBlock* sb;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep, pb, sb);
+  YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+#else
+static void
+yy_stack_print (yybottom, yytop)
+    yytype_int16 *yybottom;
+    yytype_int16 *yytop;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (; yybottom <= yytop; yybottom++)
+    {
+      int yybot = *yybottom;
+      YYFPRINTF (stderr, " %d", yybot);
+    }
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule, KFGParseBlock* pb, KFGScanBlock* sb)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule, pb, sb)
+    YYSTYPE *yyvsp;
+    int yyrule;
+    KFGParseBlock* pb;
+    KFGScanBlock* sb;
+#endif
+{
+  int yynrhs = yyr2[yyrule];
+  int yyi;
+  unsigned long int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+	     yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+		       &(yyvsp[(yyi + 1) - (yynrhs)])
+		       		       , pb, sb);
+      YYFPRINTF (stderr, "\n");
+    }
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (yyvsp, Rule, pb, sb); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef	YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined __GLIBC__ && defined _STRING_H
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+    const char *yystr;
+#endif
+{
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
+    continue;
+  return yylen;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+    char *yydest;
+    const char *yysrc;
+#endif
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      YYSIZE_T yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+	switch (*++yyp)
+	  {
+	  case '\'':
+	  case ',':
+	    goto do_not_strip_quotes;
+
+	  case '\\':
+	    if (*++yyp != '\\')
+	      goto do_not_strip_quotes;
+	    /* Fall through.  */
+	  default:
+	    if (yyres)
+	      yyres[yyn] = *yyp;
+	    yyn++;
+	    break;
+
+	  case '"':
+	    if (yyres)
+	      yyres[yyn] = '\0';
+	    return yyn;
+	  }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+   about the unexpected token YYTOKEN for the state stack whose top is
+   YYSSP.
+
+   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
+   not large enough to hold the message.  In that case, also set
+   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
+   required number of bytes is too large to store.  */
+static int
+yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
+                yytype_int16 *yyssp, int yytoken)
+{
+  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
+  YYSIZE_T yysize = yysize0;
+  YYSIZE_T yysize1;
+  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+  /* Internationalized format string. */
+  const char *yyformat = 0;
+  /* Arguments of yyformat. */
+  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+  /* Number of reported tokens (one for the "unexpected", one per
+     "expected"). */
+  int yycount = 0;
+
+  /* There are many possibilities here to consider:
+     - Assume YYFAIL is not used.  It's too flawed to consider.  See
+       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
+       for details.  YYERROR is fine as it does not invoke this
+       function.
+     - If this state is a consistent state with a default action, then
+       the only way this function was invoked is if the default action
+       is an error action.  In that case, don't check for expected
+       tokens because there are none.
+     - The only way there can be no lookahead present (in yychar) is if
+       this state is a consistent state with a default action.  Thus,
+       detecting the absence of a lookahead is sufficient to determine
+       that there is no unexpected or expected token to report.  In that
+       case, just report a simple "syntax error".
+     - Don't assume there isn't a lookahead just because this state is a
+       consistent state with a default action.  There might have been a
+       previous inconsistent state, consistent state with a non-default
+       action, or user semantic action that manipulated yychar.
+     - Of course, the expected token list depends on states to have
+       correct lookahead information, and it depends on the parser not
+       to perform extra reductions after fetching a lookahead from the
+       scanner and before detecting a syntax error.  Thus, state merging
+       (from LALR or IELR) and default reductions corrupt the expected
+       token list.  However, the list is correct for canonical LR with
+       one exception: it will still contain any token that will not be
+       accepted due to an error action in a later state.
+  */
+  if (yytoken != YYEMPTY)
+    {
+      int yyn = yypact[*yyssp];
+      yyarg[yycount++] = yytname[yytoken];
+      if (!yypact_value_is_default (yyn))
+        {
+          /* Start YYX at -YYN if negative to avoid negative indexes in
+             YYCHECK.  In other words, skip the first -YYN actions for
+             this state because they are default actions.  */
+          int yyxbegin = yyn < 0 ? -yyn : 0;
+          /* Stay within bounds of both yycheck and yytname.  */
+          int yychecklim = YYLAST - yyn + 1;
+          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+          int yyx;
+
+          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
+                && !yytable_value_is_error (yytable[yyx + yyn]))
+              {
+                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+                  {
+                    yycount = 1;
+                    yysize = yysize0;
+                    break;
+                  }
+                yyarg[yycount++] = yytname[yyx];
+                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+                if (! (yysize <= yysize1
+                       && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+                  return 2;
+                yysize = yysize1;
+              }
+        }
+    }
+
+  switch (yycount)
+    {
+# define YYCASE_(N, S)                      \
+      case N:                               \
+        yyformat = S;                       \
+      break
+      YYCASE_(0, YY_("syntax error"));
+      YYCASE_(1, YY_("syntax error, unexpected %s"));
+      YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+      YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+      YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+      YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+# undef YYCASE_
+    }
+
+  yysize1 = yysize + yystrlen (yyformat);
+  if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+    return 2;
+  yysize = yysize1;
+
+  if (*yymsg_alloc < yysize)
+    {
+      *yymsg_alloc = 2 * yysize;
+      if (! (yysize <= *yymsg_alloc
+             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
+        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
+      return 1;
+    }
+
+  /* Avoid sprintf, as that infringes on the user's name space.
+     Don't have undefined behavior even if the translation
+     produced a string with the wrong number of "%s"s.  */
+  {
+    char *yyp = *yymsg;
+    int yyi = 0;
+    while ((*yyp = *yyformat) != '\0')
+      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
+        {
+          yyp += yytnamerr (yyp, yyarg[yyi++]);
+          yyformat += 2;
+        }
+      else
+        {
+          yyp++;
+          yyformat++;
+        }
+  }
+  return 0;
+}
+#endif /* YYERROR_VERBOSE */
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, KFGParseBlock* pb, KFGScanBlock* sb)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep, pb, sb)
+    const char *yymsg;
+    int yytype;
+    YYSTYPE *yyvaluep;
+    KFGParseBlock* pb;
+    KFGScanBlock* sb;
+#endif
+{
+  YYUSE (yyvaluep);
+  YYUSE (pb);
+  YYUSE (sb);
+
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  switch (yytype)
+    {
+      case 20: /* "value" */
+
+	{
+    VNamelistRelease((yyvaluep->namelist));
+};
+
+	break;
+
+      default:
+	break;
+    }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (KFGParseBlock* pb, KFGScanBlock* sb);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (KFGParseBlock* pb, KFGScanBlock* sb)
+#else
+int
+yyparse (pb, sb)
+    KFGParseBlock* pb;
+    KFGScanBlock* sb;
+#endif
+#endif
+{
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+    /* Number of syntax errors so far.  */
+    int yynerrs;
+
+    int yystate;
+    /* Number of tokens to shift before error messages enabled.  */
+    int yyerrstatus;
+
+    /* The stacks and their tools:
+       `yyss': related to states.
+       `yyvs': related to semantic values.
+
+       Refer to the stacks thru separate pointers, to allow yyoverflow
+       to reallocate them elsewhere.  */
+
+    /* The state stack.  */
+    yytype_int16 yyssa[YYINITDEPTH];
+    yytype_int16 *yyss;
+    yytype_int16 *yyssp;
+
+    /* The semantic value stack.  */
+    YYSTYPE yyvsa[YYINITDEPTH];
+    YYSTYPE *yyvs;
+    YYSTYPE *yyvsp;
+
+    YYSIZE_T yystacksize;
+
+  int yyn;
+  int yyresult;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken;
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  yytoken = 0;
+  yyss = yyssa;
+  yyvs = yyvsa;
+  yystacksize = YYINITDEPTH;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY; /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed.  So pushing a state here evens the stacks.  */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+	/* Give user a chance to reallocate the stack.  Use copies of
+	   these so that the &'s don't force the real ones into
+	   memory.  */
+	YYSTYPE *yyvs1 = yyvs;
+	yytype_int16 *yyss1 = yyss;
+
+	/* Each stack pointer address is followed by the size of the
+	   data in use in that stack, in bytes.  This used to be a
+	   conditional around just the two extra args, but that might
+	   be undefined if yyoverflow is a macro.  */
+	yyoverflow (YY_("memory exhausted"),
+		    &yyss1, yysize * sizeof (*yyssp),
+		    &yyvs1, yysize * sizeof (*yyvsp),
+		    &yystacksize);
+
+	yyss = yyss1;
+	yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyexhaustedlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+	goto yyexhaustedlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+	yystacksize = YYMAXDEPTH;
+
+      {
+	yytype_int16 *yyss1 = yyss;
+	union yyalloc *yyptr =
+	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+	if (! yyptr)
+	  goto yyexhaustedlab;
+	YYSTACK_RELOCATE (yyss_alloc, yyss);
+	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+#  undef YYSTACK_RELOCATE
+	if (yyss1 != yyssa)
+	  YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+		  (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+	YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  if (yystate == YYFINAL)
+    YYACCEPT;
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+  /* Do appropriate processing given the current state.  Read a
+     lookahead token if we need one and don't already have one.  */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+  yyn = yypact[yystate];
+  if (yypact_value_is_default (yyn))
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yytable_value_is_error (yyn))
+        goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  /* Shift the lookahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
+
+  yystate = yyn;
+  *++yyvsp = yylval;
+
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 6:
+
+    { 
+            rc_t rc=pb->write_nvp(sb->self, (yyvsp[(1) - (4)].pb).tokenText, (yyvsp[(1) - (4)].pb).tokenLength, (yyvsp[(3) - (4)].namelist));
+            if (rc != 0)
+            {
+                ReportRc(pb, sb, rc);
+            }
+            VNamelistRelease((yyvsp[(3) - (4)].namelist));
+        }
+    break;
+
+  case 12:
+
+    { VNamelistMake(&(yyval.namelist), NAMELIST_ALLOC_BLKSIZE); AppendName(sb, (yyval.namelist), &(yyvsp[(1) - (1)].pb)); }
+    break;
+
+  case 13:
+
+    { VNamelistMake(&(yyval.namelist), NAMELIST_ALLOC_BLKSIZE); AppendName(sb, (yyval.namelist), &(yyvsp[(1) - (1)].pb)); }
+    break;
+
+  case 14:
+
+    { AppendName(sb, (yyvsp[(1) - (2)].namelist), &(yyvsp[(2) - (2)].pb)); (yyval.namelist)=(yyvsp[(1) - (2)].namelist); }
+    break;
+
+  case 15:
+
+    { AppendName(sb, (yyvsp[(1) - (2)].namelist), &(yyvsp[(2) - (2)].pb)); (yyval.namelist)=(yyvsp[(1) - (2)].namelist); }
+    break;
+
+
+
+      default: break;
+    }
+  /* User semantic actions sometimes alter yychar, and that requires
+     that yytoken be updated with the new translation.  We take the
+     approach of translating immediately before every use of yytoken.
+     One alternative is translating here after every semantic action,
+     but that translation would be missed if the semantic action invokes
+     YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+     if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
+     incorrect destructor might then be invoked immediately.  In the
+     case of YYERROR or YYBACKUP, subsequent parser actions might lead
+     to an incorrect destructor call or verbose syntax error message
+     before the lookahead is translated.  */
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* Make sure we have latest lookahead translation.  See comments at
+     user semantic actions for why this is necessary.  */
+  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
+
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if ! YYERROR_VERBOSE
+      yyerror (pb, sb, YY_("syntax error"));
+#else
+# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
+                                        yyssp, yytoken)
+      {
+        char const *yymsgp = YY_("syntax error");
+        int yysyntax_error_status;
+        yysyntax_error_status = YYSYNTAX_ERROR;
+        if (yysyntax_error_status == 0)
+          yymsgp = yymsg;
+        else if (yysyntax_error_status == 1)
+          {
+            if (yymsg != yymsgbuf)
+              YYSTACK_FREE (yymsg);
+            yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
+            if (!yymsg)
+              {
+                yymsg = yymsgbuf;
+                yymsg_alloc = sizeof yymsgbuf;
+                yysyntax_error_status = 2;
+              }
+            else
+              {
+                yysyntax_error_status = YYSYNTAX_ERROR;
+                yymsgp = yymsg;
+              }
+          }
+        yyerror (pb, sb, yymsgp);
+        if (yysyntax_error_status == 2)
+          goto yyexhaustedlab;
+      }
+# undef YYSYNTAX_ERROR
+#endif
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+	 error, discard it.  */
+
+      if (yychar <= YYEOF)
+	{
+	  /* Return failure if at end of input.  */
+	  if (yychar == YYEOF)
+	    YYABORT;
+	}
+      else
+	{
+	  yydestruct ("Error: discarding",
+		      yytoken, &yylval, pb, sb);
+	  yychar = YYEMPTY;
+	}
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+  /* Pacify compilers like GCC when the user code never invokes
+     YYERROR and the label yyerrorlab therefore never appears in user
+     code.  */
+  if (/*CONSTCOND*/ 0)
+     goto yyerrorlab;
+
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (!yypact_value_is_default (yyn))
+	{
+	  yyn += YYTERROR;
+	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+	    {
+	      yyn = yytable[yyn];
+	      if (0 < yyn)
+		break;
+	    }
+	}
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+	YYABORT;
+
+
+      yydestruct ("Error: popping",
+		  yystos[yystate], yyvsp, pb, sb);
+      YYPOPSTACK (1);
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  *++yyvsp = yylval;
+
+
+  /* Shift the error token.  */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#if !defined(yyoverflow) || YYERROR_VERBOSE
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (pb, sb, YY_("memory exhausted"));
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+  if (yychar != YYEMPTY)
+    {
+      /* Make sure we have latest lookahead translation.  See comments at
+         user semantic actions for why this is necessary.  */
+      yytoken = YYTRANSLATE (yychar);
+      yydestruct ("Cleanup: discarding lookahead",
+                  yytoken, &yylval, pb, sb);
+    }
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+		  yystos[*yyssp], yyvsp, pb, sb);
+      YYPOPSTACK (1);
+    }
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
+}
+
+
+
+
+
+#include <assert.h>
+#include <klib/token.h>
+#include <klib/writer.h>
+
+void KFG_error(KFGParseBlock* pb, KFGScanBlock* sb, const char* msg)
+{
+    sb->report_error(sb, msg);
+}
+
+void ReportRc(KFGParseBlock* pb, KFGScanBlock* sb, rc_t rc)
+{
+    char buf[1025];
+    size_t num_writ;
+    RCExplain(rc, buf, 1024, &num_writ);
+    buf[1024]=0;
+    yyerror(0, sb, buf);
+}
+
+void AppendName(KFGScanBlock* sb, VNamelist* nl, const KFGToken* pb)
+{   /* pb represents either a kfgSTRING or a kfgESCAPED_STRING with opening and closed quotes clipped */
+    rc_t rc;
+    KToken t;
+    size_t value_size;
+    char* buf;
+
+    if (pb->tokenLength == 0)
+    {
+        return;
+    }
+            
+    t.id= pb->tokenId == kfgESCAPED_STRING ? eEscapedString : eString;
+    StringInit(&t.str, pb->tokenText-1, pb->tokenLength+2, (uint32_t) (pb->tokenLength + 2) ); /* compensate for clipped quotes in order to use KTokenToString */
+    buf=(char*)malloc(t.str.size);
+
+    /* KTokenToString removes opening and closing quotes and handles escapes if present */
+    rc = KTokenToString (&t, buf, t.str.size, &value_size);
+    if (rc != 0)
+    {
+        ReportRc(0, sb, rc);
+    }
+    else
+    {   
+        assert(value_size < t.str.size);
+        buf[value_size]=0;
+        rc = VNamelistAppend(nl, buf);
+        if (rc != 0)
+        {
+            ReportRc(0, sb, rc);
+        }
+    }       
+    free(buf);
+}
+
+
+    
+
diff --git a/libs/kfg/config-grammar.y b/libs/kfg/config-grammar.y
new file mode 100644
index 0000000..ec507b5
--- /dev/null
+++ b/libs/kfg/config-grammar.y
@@ -0,0 +1,185 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+ 
+%{  
+    #include "kfg-parse.h"
+    #include <sysalloc.h>
+    #include <klib/rc.h>
+    #include <klib/namelist.h>
+
+    #define YYSTYPE_IS_DECLARED
+    #define YYSTYPE KFGSymbol
+    #include "config-tokens.h"
+        
+    #define KFG_lex KFGScan_yylex
+    
+    /* required parameter to VNamelistMake */
+    #define NAMELIST_ALLOC_BLKSIZE 10
+    
+    static void ReportRc(KFGParseBlock* pb, KFGScanBlock* sb, rc_t rc);
+    static void AppendName(KFGScanBlock* sb, VNamelist*, const KFGToken*);
+    static void KFG_error(KFGParseBlock* pb, KFGScanBlock* sb, const char* msg);
+%}
+
+%pure-parser
+%parse-param {KFGParseBlock* pb }
+%lex-param {KFGToken* sb}
+%parse-param {KFGScanBlock* sb }
+
+%name-prefix="KFG_"
+
+ /* tokens without textual representation or internal for the scanner */
+%token kfgEND_INPUT 0 
+%token kfgEND_LINE
+%token kfgUNTERM_STRING
+%token kfgUNTERM_ESCAPED_STRING
+%token kfgUNRECOGNIZED
+%token kfgVAR_REF
+%token kfgUNTERM_VAR_REF
+%token kfgASSIGN
+
+ /* tokens with a textual representation in pb */
+%token <pb> kfgSTRING
+%token <pb> kfgESCAPED_STRING
+%token <pb> kfgABS_PATH
+%token <pb> kfgREL_PATH
+
+%union {
+    KFGToken                pb;
+    const struct VNamelist* namelist;
+}
+%type <pb>          pathname  
+%type <namelist>    value
+
+%destructor
+{
+    VNamelistRelease($$);
+} <namelist>
+
+%%
+ 
+config
+    : name_value_pairs 
+    | kfgEND_INPUT      
+    ;
+    
+name_value_pairs
+    : name_value_pair
+    | name_value_pairs name_value_pair 
+    ;
+    
+name_value_pair
+    : pathname assign_op value line_end
+        { 
+            rc_t rc=pb->write_nvp(sb->self, $1.tokenText, $1.tokenLength, $3);
+            if (rc != 0)
+            {
+                ReportRc(pb, sb, rc);
+            }
+            VNamelistRelease($3);
+        } 
+    | kfgEND_LINE       
+    | error line_end    
+    ;
+    
+pathname
+    : kfgABS_PATH 
+    | kfgREL_PATH
+    ;
+    
+assign_op
+    : kfgASSIGN
+    ;   
+
+value
+    : kfgSTRING                 { VNamelistMake(&$$, NAMELIST_ALLOC_BLKSIZE); AppendName(sb, $$, &$1); }
+    | kfgESCAPED_STRING         { VNamelistMake(&$$, NAMELIST_ALLOC_BLKSIZE); AppendName(sb, $$, &$1); }
+    | value kfgSTRING           { AppendName(sb, $1, &$2); $$=$1; }
+    | value kfgESCAPED_STRING   { AppendName(sb, $1, &$2); $$=$1; }
+    ;
+    
+line_end
+    : kfgEND_LINE
+    | kfgEND_INPUT
+    ;
+
+%%
+
+#include <assert.h>
+#include <klib/token.h>
+#include <klib/writer.h>
+
+void KFG_error(KFGParseBlock* pb, KFGScanBlock* sb, const char* msg)
+{
+    sb->report_error(sb, msg);
+}
+
+void ReportRc(KFGParseBlock* pb, KFGScanBlock* sb, rc_t rc)
+{
+    char buf[1025];
+    size_t num_writ;
+    RCExplain(rc, buf, 1024, &num_writ);
+    buf[1024]=0;
+    yyerror(0, sb, buf);
+}
+
+void AppendName(KFGScanBlock* sb, VNamelist* nl, const KFGToken* pb)
+{   /* pb represents either a kfgSTRING or a kfgESCAPED_STRING with opening and closed quotes clipped */
+    rc_t rc;
+    KToken t;
+    size_t value_size;
+    char* buf;
+
+    if (pb->tokenLength == 0)
+    {
+        return;
+    }
+            
+    t.id= pb->tokenId == kfgESCAPED_STRING ? eEscapedString : eString;
+    StringInit(&t.str, pb->tokenText-1, pb->tokenLength+2, (uint32_t) (pb->tokenLength + 2) ); /* compensate for clipped quotes in order to use KTokenToString */
+    buf=(char*)malloc(t.str.size);
+
+    /* KTokenToString removes opening and closing quotes and handles escapes if present */
+    rc = KTokenToString (&t, buf, t.str.size, &value_size);
+    if (rc != 0)
+    {
+        ReportRc(0, sb, rc);
+    }
+    else
+    {   
+        assert(value_size < t.str.size);
+        buf[value_size]=0;
+        rc = VNamelistAppend(nl, buf);
+        if (rc != 0)
+        {
+            ReportRc(0, sb, rc);
+        }
+    }       
+    free(buf);
+}
+
+
+    
diff --git a/libs/kfg/config-lex.c b/libs/kfg/config-lex.c
new file mode 100644
index 0000000..a45986d
--- /dev/null
+++ b/libs/kfg/config-lex.c
@@ -0,0 +1,2517 @@
+
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types. 
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t; 
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif	/* defined (__STDC__) */
+#endif	/* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* An opaque pointer. */
+#ifndef YY_TYPEDEF_YY_SCANNER_T
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void* yyscan_t;
+#endif
+
+/* For convenience, these vars (plus the bison vars far below)
+   are macros in the reentrant scanner. */
+#define yyin yyg->yyin_r
+#define yyout yyg->yyout_r
+#define yyextra yyg->yyextra_r
+#define yyleng yyg->yyleng_r
+#define yytext yyg->yytext_r
+#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
+#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
+#define yy_flex_debug yyg->yy_flex_debug_r
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yyg->yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yyg->yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE vdb_kfg_yyrestart(yyin ,yyscanner )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+    /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
+     *       access to the local variable yy_act. Since yyless() is a macro, it would break
+     *       existing scanners that call yyless() from OUTSIDE vdb_kfg_yylex. 
+     *       One obvious solution it to make yy_act a global. I tried that, and saw
+     *       a 5% performance hit in a non-yylineno scanner, because yy_act is
+     *       normally declared as a register variable-- so it is not worth it.
+     */
+    #define  YY_LESS_LINENO(n) \
+            do { \
+                int yyl;\
+                for ( yyl = n; yyl < yyleng; ++yyl )\
+                    if ( yytext[yyl] == '\n' )\
+                        --yylineno;\
+            }while(0)
+    
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		*yy_cp = yyg->yy_hold_char; \
+		YY_RESTORE_YY_MORE_OFFSET \
+		yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+    
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via vdb_kfg_yyrestart()), so that the user can continue scanning by
+	 * just pointing yyin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+
+	};
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
+                          ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
+                          : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
+
+void vdb_kfg_yyrestart (FILE *input_file ,yyscan_t yyscanner );
+void vdb_kfg_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
+YY_BUFFER_STATE vdb_kfg_yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner );
+void vdb_kfg_yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
+void vdb_kfg_yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
+void vdb_kfg_yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
+void vdb_kfg_yypop_buffer_state (yyscan_t yyscanner );
+
+static void vdb_kfg_yyensure_buffer_stack (yyscan_t yyscanner );
+static void vdb_kfg_yy_load_buffer_state (yyscan_t yyscanner );
+static void vdb_kfg_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );
+
+#define YY_FLUSH_BUFFER vdb_kfg_yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)
+
+YY_BUFFER_STATE vdb_kfg_yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
+YY_BUFFER_STATE vdb_kfg_yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
+YY_BUFFER_STATE vdb_kfg_yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );
+
+void *vdb_kfg_yyalloc (yy_size_t ,yyscan_t yyscanner );
+void *vdb_kfg_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner );
+void vdb_kfg_yyfree (void * ,yyscan_t yyscanner );
+
+#define yy_new_buffer vdb_kfg_yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){ \
+        vdb_kfg_yyensure_buffer_stack (yyscanner); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            vdb_kfg_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){\
+        vdb_kfg_yyensure_buffer_stack (yyscanner); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            vdb_kfg_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define vdb_kfg_yywrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+typedef int yy_state_type;
+
+#define yytext_ptr yytext_r
+
+static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state  ,yyscan_t yyscanner);
+static int yy_get_next_buffer (yyscan_t yyscanner );
+static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	yyg->yytext_ptr = yy_bp; \
+	yyleng = (size_t) (yy_cp - yy_bp); \
+	yyg->yy_hold_char = *yy_cp; \
+	*yy_cp = '\0'; \
+	yyg->yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 35
+#define YY_END_OF_BUFFER 36
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+	{
+	flex_int32_t yy_verify;
+	flex_int32_t yy_nxt;
+	};
+static yyconst flex_int16_t yy_accept[135] =
+    {   0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       13,   13,   36,   34,    8,    9,   24,    7,   34,   15,
+       34,   11,   32,    2,    4,   35,   35,   35,   35,   31,
+       35,   35,   35,   22,   13,   13,   24,   23,    0,    0,
+        7,    0,   15,    0,   14,    0,    1,   10,   11,    0,
+        2,    3,    4,    0,    5,    0,    6,    0,   31,    0,
+       29,    0,    0,   22,   20,   13,   13,   23,    0,   27,
+       26,   26,    0,    0,   14,   18,   17,   17,   10,    0,
+       11,   30,   21,   13,   27,   26,   25,   26,    0,   26,
+        0,   33,    0,    0,   18,   17,   17,   16,    0,   17,
+
+        0,   10,   11,   12,   13,   13,    0,   26,   25,   26,
+       26,   26,   28,    0,    0,   17,   17,   16,   17,   17,
+       19,   10,   13,   26,   25,   26,   26,    0,   17,   17,
+       16,   17,   13,    0
+    } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        2,    4,    4,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    5,    6,    7,    1,    1,    8,    9,
+       10,   11,    1,    1,   12,   12,   13,   14,   14,   14,
+       14,   14,   14,   14,   14,   14,   14,    1,    1,    1,
+       15,    1,    1,    1,   14,   14,   14,   14,   14,   14,
+       14,   14,   14,   14,   14,   14,   14,   14,   14,   14,
+       14,   14,   14,   14,   14,   14,   14,   14,   14,   14,
+        1,   16,    1,    1,   14,    1,   14,   14,   14,   14,
+
+       14,   14,   14,   14,   14,   14,   14,   14,   14,   14,
+       14,   14,   14,   14,   14,   14,   14,   14,   14,   14,
+       14,   14,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst flex_int32_t yy_meta[17] =
+    {   0,
+        1,    1,    2,    3,    1,    1,    1,    1,    1,    4,
+        5,    6,    6,    6,    1,    7
+    } ;
+
+static yyconst flex_int16_t yy_base[163] =
+    {   0,
+        0,    0,   14,   15,   16,   17,   26,   40,   54,   68,
+       82,   90,   86,  670,  670,  670,   96,    0,   74,  106,
+       10,   69,  670,    0,  670,  120,  131,   27,  670,  670,
+      142,   15,  149,  670,    0,   72,  154,  670,  168,    0,
+        0,   66,  178,  192,  670,    0,  670,   66,   65,   63,
+        0,  206,  670,  217,  670,  228,  670,   30,  670,   65,
+      670,   31,   64,  670,  670,    0,   55,  670,   59,  670,
+      237,  249,  256,   58,  670,  670,  264,  274,   53,   51,
+       51,  670,  670,  281,  670,  291,  670,  305,    0,  317,
+      331,  670,    0,   49,  670,  341,  355,  670,    0,  365,
+
+      379,   47,   46,  670,    0,   41,  393,    0,    0,  407,
+      420,    0,  670,   34,  434,    0,  448,    0,  461,    0,
+      670,   41,   37,    0,    0,    0,  474,    0,    0,    0,
+        0,  487,   38,  670,  503,  510,  517,  524,  531,  538,
+      545,   47,  552,  559,  566,  572,  578,  585,  592,   35,
+      599,  606,  613,  620,   34,  627,  634,  641,  648,   30,
+      655,  662
+    } ;
+
+static yyconst flex_int16_t yy_def[163] =
+    {   0,
+      134,    1,  135,  135,  135,  135,  136,  136,  137,  137,
+      138,  138,  134,  134,  134,  134,  139,  140,  134,  141,
+      134,  142,  134,  143,  134,  144,  144,  145,  134,  134,
+      145,  146,  146,  134,  147,  147,  139,  134,  139,  148,
+      140,  134,  141,  141,  134,  149,  134,  150,  142,  134,
+      143,  144,  134,  144,  134,  144,  134,  145,  134,   31,
+      134,  146,   33,  134,  134,  147,  147,  134,   39,  134,
+      151,  152,  134,   44,  134,  134,  153,  154,  150,  134,
+      155,  134,  134,  147,  134,  151,  134,  156,  157,  152,
+      152,  134,   73,  134,  134,  153,  158,  134,  159,  154,
+
+      154,  160,  155,  134,   84,  147,  151,   86,   86,  156,
+      161,   86,  134,   73,  153,   96,  158,   96,  162,   96,
+      134,  160,   84,   86,   86,  110,  161,  114,   96,  117,
+       96,  162,   84,    0,  134,  134,  134,  134,  134,  134,
+      134,  134,  134,  134,  134,  134,  134,  134,  134,  134,
+      134,  134,  134,  134,  134,  134,  134,  134,  134,  134,
+      134,  134
+    } ;
+
+static yyconst flex_int16_t yy_nxt[687] =
+    {   0,
+       14,   15,   16,   15,   17,   18,   19,   20,   14,   14,
+       14,   14,   21,   22,   23,   14,   25,   25,   25,   25,
+       47,   63,   64,   48,   26,   26,   27,   27,   29,   29,
+       30,   59,   31,   60,   59,  122,   60,   63,   64,  103,
+       79,   29,   29,   29,   30,  128,   31,  128,  133,  133,
+      133,  133,   49,   80,  123,   29,   29,   29,   50,   80,
+       33,   34,  114,   50,  102,   80,   95,   85,   84,   29,
+       29,   29,   83,   82,   33,   34,   81,   50,   80,   73,
+       67,   50,   42,   29,   29,  134,  134,  134,   36,  134,
+      134,   29,   29,  134,  134,  134,   36,  134,  134,   29,
+
+       38,  134,   39,  134,  134,  134,  134,  134,  134,  134,
+      134,   40,   44,   45,  134,  134,  134,  134,  134,  134,
+      134,   46,   53,  134,  134,  134,  134,  134,  134,  134,
+       54,  134,   55,   53,  134,  134,  134,  134,  134,  134,
+      134,   56,  134,   57,   58,   58,  134,  134,  134,  134,
+       61,   62,   62,  134,  134,  134,  134,   65,   68,  134,
+       69,  134,  134,  134,  134,  134,  134,  134,  134,   40,
+       37,   37,  134,  134,  134,  134,   70,  134,  134,  134,
+      134,  134,  134,   71,   74,   75,  134,  134,  134,  134,
+      134,  134,  134,   46,   43,   43,  134,  134,  134,  134,
+
+       76,  134,  134,  134,  134,  134,  134,   77,  134,  134,
+      134,  134,  134,  134,  134,  134,  134,  134,  134,   53,
+      134,  134,  134,  134,  134,  134,  134,   54,  134,   55,
+       53,  134,  134,  134,  134,  134,  134,  134,   56,  134,
+       57,   87,  134,   88,  134,  134,  134,  134,  134,  134,
+      134,  134,   89,   87,  134,   91,  134,  134,  134,  134,
+      134,  134,  134,  134,   40,   92,  134,   93,   94,   93,
+       97,   98,  134,  134,  134,  134,  134,  134,  134,   99,
+      101,   98,  134,  134,  134,  134,  134,  134,  134,   46,
+      104,  134,  105,  106,  105,   87,  134,  107,  134,  134,
+
+      134,  134,  134,  134,  134,  134,   89,   86,   86,  109,
+      134,  110,  134,   86,  134,  134,  134,  134,  134,  134,
+      111,   87,  134,   91,  134,  134,  134,  134,  134,  134,
+      134,  134,   40,   90,   90,  134,  134,  134,  134,  113,
+      134,  134,  134,  134,  134,  134,   71,  115,   98,  134,
+      134,  134,  134,  134,  134,  134,   99,   96,   96,  134,
+      134,  117,  118,   96,  134,  134,  134,  134,  134,  134,
+      119,  101,   98,  134,  134,  134,  134,  134,  134,  134,
+       46,  100,  100,  134,  134,  134,  134,  121,  134,  134,
+      134,  134,  134,  134,   77,   86,   86,  134,  134,  134,
+
+      134,  134,  134,  134,  134,  134,  134,  134,   71,   86,
+       86,  109,  134,  110,  134,   86,  134,  134,  134,  134,
+      134,  134,  111,  112,  125,  134,  126,  134,  134,  134,
+      134,  134,  134,  134,  134,  127,   96,   96,  134,  134,
+      134,  134,  134,  134,  134,  134,  134,  134,  134,   77,
+       96,   96,  134,  134,  117,  118,   96,  134,  134,  134,
+      134,  134,  134,  119,  120,  134,  134,  130,  131,  134,
+      134,  134,  134,  134,  134,  134,  132,  112,  125,  134,
+       88,  134,  134,  134,  134,  134,  134,  134,  134,  127,
+      120,  134,  134,   97,  131,  134,  134,  134,  134,  134,
+
+      134,  134,  132,   24,   24,   24,   24,   24,   24,   24,
+       28,   28,   28,   28,   28,   28,   28,   32,   32,   32,
+       32,   32,   32,   32,   35,   35,   35,   35,   35,   35,
+       35,   37,  134,  134,   37,   37,   37,   37,   41,  134,
+       41,   41,   41,   41,   41,   43,  134,  134,   43,   43,
+       43,   43,   51,  134,   51,   51,  134,   51,   51,   52,
+       52,   52,   52,   52,   52,   52,   58,  134,  134,   58,
+       58,   58,   62,  134,  134,   62,   62,   62,   66,  134,
+       66,  134,   66,   66,   66,   72,  134,   72,   72,   72,
+       72,   72,   78,  134,   78,   78,   78,   78,   78,   86,
+
+      134,  134,   86,   86,   86,   86,   90,  134,  134,   90,
+       90,   90,   90,   96,  134,  134,   96,   96,   96,   96,
+      100,  134,  134,  100,  100,  100,  100,  108,  108,  108,
+      108,  108,  108,  108,  112,  134,  112,  112,  112,  112,
+      112,  116,  116,  116,  116,  116,  116,  116,  120,  134,
+      120,  120,  120,  120,  120,  124,  134,  124,  124,  124,
+      124,  124,  129,  134,  129,  129,  129,  129,  129,   13,
+      134,  134,  134,  134,  134,  134,  134,  134,  134,  134,
+      134,  134,  134,  134,  134,  134
+    } ;
+
+static yyconst flex_int16_t yy_chk[687] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    3,    4,    5,    6,
+       21,   32,   32,   21,    3,    4,    5,    6,    7,    7,
+        7,   28,    7,   28,   58,  160,   58,   62,   62,  155,
+      150,    7,    8,    8,    8,  114,    8,  114,  123,  133,
+      123,  133,  142,  122,  106,    8,    9,    9,  103,  102,
+        9,    9,   94,   81,   80,   79,   74,   69,   67,    9,
+       10,   10,   63,   60,   10,   10,   50,   49,   48,   42,
+       36,   22,   19,   10,   11,   13,    0,    0,   11,    0,
+        0,   11,   12,    0,    0,    0,   12,    0,    0,   12,
+
+       17,    0,   17,    0,    0,    0,    0,    0,    0,    0,
+        0,   17,   20,   20,    0,    0,    0,    0,    0,    0,
+        0,   20,   26,    0,    0,    0,    0,    0,    0,    0,
+       26,    0,   26,   27,    0,    0,    0,    0,    0,    0,
+        0,   27,    0,   27,   31,   31,    0,    0,    0,    0,
+       31,   33,   33,    0,    0,    0,    0,   33,   37,    0,
+       37,    0,    0,    0,    0,    0,    0,    0,    0,   37,
+       39,   39,    0,    0,    0,    0,   39,    0,    0,    0,
+        0,    0,    0,   39,   43,   43,    0,    0,    0,    0,
+        0,    0,    0,   43,   44,   44,    0,    0,    0,    0,
+
+       44,    0,    0,    0,    0,    0,    0,   44,   52,    0,
+        0,    0,    0,    0,    0,    0,   52,    0,   52,   54,
+        0,    0,    0,    0,    0,    0,    0,   54,    0,   54,
+       56,    0,    0,    0,    0,    0,    0,    0,   56,    0,
+       56,   71,    0,   71,    0,    0,    0,    0,    0,    0,
+        0,    0,   71,   72,    0,   72,    0,    0,    0,    0,
+        0,    0,    0,    0,   72,   73,    0,   73,   73,   73,
+       77,   77,    0,    0,    0,    0,    0,    0,    0,   77,
+       78,   78,    0,    0,    0,    0,    0,    0,    0,   78,
+       84,    0,   84,   84,   84,   86,    0,   86,    0,    0,
+
+        0,    0,    0,    0,    0,    0,   86,   88,   88,   88,
+        0,   88,    0,   88,    0,    0,    0,    0,    0,    0,
+       88,   90,    0,   90,    0,    0,    0,    0,    0,    0,
+        0,    0,   90,   91,   91,    0,    0,    0,    0,   91,
+        0,    0,    0,    0,    0,    0,   91,   96,   96,    0,
+        0,    0,    0,    0,    0,    0,   96,   97,   97,    0,
+        0,   97,   97,   97,    0,    0,    0,    0,    0,    0,
+       97,  100,  100,    0,    0,    0,    0,    0,    0,    0,
+      100,  101,  101,    0,    0,    0,    0,  101,    0,    0,
+        0,    0,    0,    0,  101,  107,  107,    0,    0,    0,
+
+        0,  107,    0,    0,    0,    0,    0,    0,  107,  110,
+      110,  110,    0,  110,    0,  110,    0,    0,    0,    0,
+        0,    0,  110,  111,  111,    0,  111,    0,    0,    0,
+        0,    0,    0,    0,    0,  111,  115,  115,    0,    0,
+        0,    0,  115,    0,    0,    0,    0,    0,    0,  115,
+      117,  117,    0,    0,  117,  117,  117,    0,    0,    0,
+        0,    0,    0,  117,  119,    0,    0,  119,  119,    0,
+        0,    0,    0,    0,    0,    0,  119,  127,  127,    0,
+      127,    0,    0,    0,    0,    0,    0,    0,    0,  127,
+      132,    0,    0,  132,  132,    0,    0,    0,    0,    0,
+
+        0,    0,  132,  135,  135,  135,  135,  135,  135,  135,
+      136,  136,  136,  136,  136,  136,  136,  137,  137,  137,
+      137,  137,  137,  137,  138,  138,  138,  138,  138,  138,
+      138,  139,    0,    0,  139,  139,  139,  139,  140,    0,
+      140,  140,  140,  140,  140,  141,    0,    0,  141,  141,
+      141,  141,  143,    0,  143,  143,    0,  143,  143,  144,
+      144,  144,  144,  144,  144,  144,  145,    0,    0,  145,
+      145,  145,  146,    0,    0,  146,  146,  146,  147,    0,
+      147,    0,  147,  147,  147,  148,    0,  148,  148,  148,
+      148,  148,  149,    0,  149,  149,  149,  149,  149,  151,
+
+        0,    0,  151,  151,  151,  151,  152,    0,    0,  152,
+      152,  152,  152,  153,    0,    0,  153,  153,  153,  153,
+      154,    0,    0,  154,  154,  154,  154,  156,  156,  156,
+      156,  156,  156,  156,  157,    0,  157,  157,  157,  157,
+      157,  158,  158,  158,  158,  158,  158,  158,  159,    0,
+      159,  159,  159,  159,  159,  161,    0,  161,  161,  161,
+      161,  161,  162,    0,  162,  162,  162,  162,  162,  134,
+      134,  134,  134,  134,  134,  134,  134,  134,  134,  134,
+      134,  134,  134,  134,  134,  134
+    } ;
+
+/* Table of booleans, true if rule could match eol. */
+static yyconst flex_int32_t yy_rule_can_match_eol[36] =
+    {   0,
+0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0,     };
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+    #include "kfg-lex.h"
+    #include <sysalloc.h>
+    #include "config-tokens.h"    
+    
+    #define YYSTYPE KFGToken
+    
+    /* code to populate token with internal values */
+    #define YY_USER_ACTION              \
+        yylval -> tokenText     = yytext;   \
+        yylval -> tokenLength   = yyleng;   \
+        yylval -> line_no       = yylineno; \
+        yylval -> column_no     = yycolumn; \
+        yycolumn += yyleng; 
+        
+    #define REM_LQUOTE \
+        ++ yylval -> tokenText; \
+        -- yylval -> tokenLength; \
+        ++ yylval -> column_no;
+        
+    #define REM_RQUOTE \
+        -- yylval -> tokenLength; 
+#define YY_NO_UNISTD_H 1
+/* re-entrant scanner */
+/* bison options */
+/* maintain state stack */
+/* let parser handle EOF */
+/* start-state for slash-star comments */
+
+
+/* states for strings */
+
+
+/* in-string variable reference */
+
+/* node/name in a path */
+
+#define INITIAL 0
+#define CMT_SLASH_STAR 1
+#define CMT_MULTI_LINE 2
+#define IN_DBL_STRING 3
+#define IN_SNG_STRING 4
+#define IN_VAR_REF 5
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Holds the entire state of the reentrant scanner. */
+struct yyguts_t
+    {
+
+    /* User-defined. Not touched by flex. */
+    YY_EXTRA_TYPE yyextra_r;
+
+    /* The rest are the same as the globals declared in the non-reentrant scanner. */
+    FILE *yyin_r, *yyout_r;
+    size_t yy_buffer_stack_top; /**< index of top of stack. */
+    size_t yy_buffer_stack_max; /**< capacity of stack. */
+    YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
+    char yy_hold_char;
+    int yy_n_chars;
+    int yyleng_r;
+    char *yy_c_buf_p;
+    int yy_init;
+    int yy_start;
+    int yy_did_buffer_switch_on_eof;
+    int yy_start_stack_ptr;
+    int yy_start_stack_depth;
+    int *yy_start_stack;
+    yy_state_type yy_last_accepting_state;
+    char* yy_last_accepting_cpos;
+
+    int yylineno_r;
+    int yy_flex_debug_r;
+
+    char *yytext_r;
+    int yy_more_flag;
+    int yy_more_len;
+
+    YYSTYPE * yylval_r;
+
+    }; /* end struct yyguts_t */
+
+static int yy_init_globals (yyscan_t yyscanner );
+
+    /* This must go here because YYSTYPE and YYLTYPE are included
+     * from bison output in section 1.*/
+    #    define yylval yyg->yylval_r
+    
+int vdb_kfg_yylex_init (yyscan_t* scanner);
+
+int vdb_kfg_yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
+
+/* Accessor methods to globals.
+   These are made visible to non-reentrant scanners for convenience. */
+
+int vdb_kfg_yylex_destroy (yyscan_t yyscanner );
+
+int vdb_kfg_yyget_debug (yyscan_t yyscanner );
+
+void vdb_kfg_yyset_debug (int debug_flag ,yyscan_t yyscanner );
+
+YY_EXTRA_TYPE vdb_kfg_yyget_extra (yyscan_t yyscanner );
+
+void vdb_kfg_yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
+
+FILE *vdb_kfg_yyget_in (yyscan_t yyscanner );
+
+void vdb_kfg_yyset_in  (FILE * in_str ,yyscan_t yyscanner );
+
+FILE *vdb_kfg_yyget_out (yyscan_t yyscanner );
+
+void vdb_kfg_yyset_out  (FILE * out_str ,yyscan_t yyscanner );
+
+int vdb_kfg_yyget_leng (yyscan_t yyscanner );
+
+char *vdb_kfg_yyget_text (yyscan_t yyscanner );
+
+int vdb_kfg_yyget_lineno (yyscan_t yyscanner );
+
+void vdb_kfg_yyset_lineno (int line_number ,yyscan_t yyscanner );
+
+YYSTYPE * vdb_kfg_yyget_lval (yyscan_t yyscanner );
+
+void vdb_kfg_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int vdb_kfg_yywrap (yyscan_t yyscanner );
+#else
+extern int vdb_kfg_yywrap (yyscan_t yyscanner );
+#endif
+#endif
+
+    static void yyunput (int c,char *buf_ptr  ,yyscan_t yyscanner);
+    
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (yyscan_t yyscanner );
+#else
+static int input (yyscan_t yyscanner );
+#endif
+
+#endif
+
+    static void yy_push_state (int new_state ,yyscan_t yyscanner);
+    
+    static void yy_pop_state (yyscan_t yyscanner );
+    
+    static int yy_top_state (yyscan_t yyscanner );
+    
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+		{ \
+		int c = '*'; \
+		int n; \
+		for ( n = 0; n < max_size && \
+			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+			buf[n] = (char) c; \
+		if ( c == '\n' ) \
+			buf[n++] = (char) c; \
+		if ( c == EOF && ferror( yyin ) ) \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+		result = n; \
+		} \
+	else \
+		{ \
+		errno=0; \
+		while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+			{ \
+			if( errno != EINTR) \
+				{ \
+				YY_FATAL_ERROR( "input in flex scanner failed" ); \
+				break; \
+				} \
+			errno=0; \
+			clearerr(yyin); \
+			} \
+		}\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int vdb_kfg_yylex \
+               (YYSTYPE * yylval_param ,yyscan_t yyscanner);
+
+#define YY_DECL int vdb_kfg_yylex \
+               (YYSTYPE * yylval_param , yyscan_t yyscanner)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+
+ /* multi-line comments */
+
+    yylval = yylval_param;
+
+	if ( !yyg->yy_init )
+		{
+		yyg->yy_init = 1;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! yyg->yy_start )
+			yyg->yy_start = 1;	/* first start state */
+
+		if ( ! yyin )
+			yyin = stdin;
+
+		if ( ! yyout )
+			yyout = stdout;
+
+		if ( ! YY_CURRENT_BUFFER ) {
+			vdb_kfg_yyensure_buffer_stack (yyscanner);
+			YY_CURRENT_BUFFER_LVALUE =
+				vdb_kfg_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+		}
+
+		vdb_kfg_yy_load_buffer_state(yyscanner );
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = yyg->yy_c_buf_p;
+
+		/* Support of yytext. */
+		*yy_cp = yyg->yy_hold_char;
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = yyg->yy_start;
+yy_match:
+		do
+			{
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+			if ( yy_accept[yy_current_state] )
+				{
+				yyg->yy_last_accepting_state = yy_current_state;
+				yyg->yy_last_accepting_cpos = yy_cp;
+				}
+			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+				{
+				yy_current_state = (int) yy_def[yy_current_state];
+				if ( yy_current_state >= 135 )
+					yy_c = yy_meta[(unsigned int) yy_c];
+				}
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+			++yy_cp;
+			}
+		while ( yy_current_state != 134 );
+		yy_cp = yyg->yy_last_accepting_cpos;
+		yy_current_state = yyg->yy_last_accepting_state;
+
+yy_find_action:
+		yy_act = yy_accept[yy_current_state];
+
+		YY_DO_BEFORE_ACTION;
+
+		if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
+			{
+			int yyl;
+			for ( yyl = 0; yyl < yyleng; ++yyl )
+				if ( yytext[yyl] == '\n' )
+					   
+    do{ yylineno++;
+        yycolumn=0;
+    }while(0)
+;
+			}
+
+do_action:	/* This label is used only to access EOF actions. */
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+			case 0: /* must back up */
+			/* undo the effects of YY_DO_BEFORE_ACTION */
+			*yy_cp = yyg->yy_hold_char;
+			yy_cp = yyg->yy_last_accepting_cpos;
+			yy_current_state = yyg->yy_last_accepting_state;
+			goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+{ yy_push_state ( CMT_SLASH_STAR, yyscanner ); }
+	YY_BREAK
+case 2:
+YY_RULE_SETUP
+/* ignore */
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+/* ignore */
+	YY_BREAK
+case 4:
+/* rule 4 can match eol */
+YY_RULE_SETUP
+{ BEGIN CMT_MULTI_LINE; }
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+{ yy_pop_state ( yyscanner ); }
+	YY_BREAK
+case 6:
+YY_RULE_SETUP
+{ yy_pop_state ( yyscanner ); return kfgEND_LINE; }
+	YY_BREAK
+/* line comments */
+case 7:
+YY_RULE_SETUP
+/* ignore */
+	YY_BREAK
+/* ignored tokens */
+case 8:
+YY_RULE_SETUP
+/* ignore */
+	YY_BREAK
+/* end of line is significant */
+case 9:
+/* rule 9 can match eol */
+YY_RULE_SETUP
+{ return kfgEND_LINE; }
+	YY_BREAK
+/* normal, POSIX-style paths */
+case 10:
+YY_RULE_SETUP
+{ return kfgABS_PATH; }
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+{ return kfgREL_PATH; }
+	YY_BREAK
+/* variable references inside strings */
+case 12:
+YY_RULE_SETUP
+{ yy_pop_state ( yyscanner ); return kfgVAR_REF; }
+	YY_BREAK
+case 13:
+YY_RULE_SETUP
+{ yy_pop_state ( yyscanner ); return kfgUNTERM_VAR_REF; }
+	YY_BREAK
+case YY_STATE_EOF(IN_VAR_REF):
+{ yy_pop_state ( yyscanner ); return kfgUNTERM_VAR_REF; } 
+	YY_BREAK
+/* single quoted strings */
+case 14:
+/* rule 14 can match eol */
+YY_RULE_SETUP
+{ REM_LQUOTE; REM_RQUOTE; return kfgSTRING; }
+	YY_BREAK
+case 15:
+/* rule 15 can match eol */
+YY_RULE_SETUP
+{ REM_LQUOTE; return kfgUNTERM_STRING; }
+	YY_BREAK
+case 16:
+/* rule 16 can match eol */
+YY_RULE_SETUP
+{ REM_LQUOTE; REM_RQUOTE; return kfgESCAPED_STRING; }
+	YY_BREAK
+case 17:
+/* rule 17 can match eol */
+YY_RULE_SETUP
+{ REM_LQUOTE; return kfgUNTERM_ESCAPED_STRING; }
+	YY_BREAK
+/* single quoted strings with variable references*/
+case 18:
+/* rule 18 can match eol */
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ REM_LQUOTE; yy_push_state ( IN_SNG_STRING, yyscanner ); yy_push_state ( IN_VAR_REF, yyscanner ); return kfgSTRING; }
+	YY_BREAK
+case 19:
+/* rule 19 can match eol */
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ REM_LQUOTE; yy_push_state ( IN_SNG_STRING, yyscanner ); yy_push_state ( IN_VAR_REF, yyscanner ); return kfgESCAPED_STRING; }
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+{ yy_push_state ( IN_VAR_REF, yyscanner ); yyless(0); }
+	YY_BREAK
+case 21:
+/* rule 21 can match eol */
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ yy_push_state ( IN_VAR_REF, yyscanner ); return kfgSTRING; }
+	YY_BREAK
+case 22:
+/* rule 22 can match eol */
+YY_RULE_SETUP
+{ REM_RQUOTE; yy_pop_state ( yyscanner ); return kfgSTRING; } 
+	YY_BREAK
+/* double quoted strings */
+case 23:
+/* rule 23 can match eol */
+YY_RULE_SETUP
+{ REM_LQUOTE; REM_RQUOTE; return kfgSTRING; }
+	YY_BREAK
+case 24:
+/* rule 24 can match eol */
+YY_RULE_SETUP
+{ REM_LQUOTE; return kfgUNTERM_STRING; }
+	YY_BREAK
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+{ REM_LQUOTE; REM_RQUOTE; return kfgESCAPED_STRING; }
+	YY_BREAK
+case 26:
+/* rule 26 can match eol */
+YY_RULE_SETUP
+{ REM_LQUOTE; return kfgUNTERM_ESCAPED_STRING; }
+	YY_BREAK
+/* double quoted strings with variable references*/
+case 27:
+/* rule 27 can match eol */
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ REM_LQUOTE; yy_push_state ( IN_DBL_STRING, yyscanner ); yy_push_state ( IN_VAR_REF, yyscanner ); return kfgSTRING; }
+	YY_BREAK
+case 28:
+/* rule 28 can match eol */
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ REM_LQUOTE; yy_push_state ( IN_DBL_STRING, yyscanner ); yy_push_state ( IN_VAR_REF, yyscanner ); return kfgESCAPED_STRING; }
+	YY_BREAK
+case 29:
+YY_RULE_SETUP
+{ yy_push_state ( IN_VAR_REF, yyscanner ); yyless(0); }
+	YY_BREAK
+case 30:
+/* rule 30 can match eol */
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ yy_push_state ( IN_VAR_REF, yyscanner ); return kfgSTRING; }
+	YY_BREAK
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+{ REM_RQUOTE; yy_pop_state ( yyscanner ); return kfgSTRING; } 
+	YY_BREAK
+/* literals */
+case 32:
+YY_RULE_SETUP
+{ return kfgASSIGN; }
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+{ return kfgVAR_REF; }
+	YY_BREAK
+/* unrecognized input */
+case 34:
+YY_RULE_SETUP
+{ return kfgUNRECOGNIZED; }
+	YY_BREAK
+case 35:
+YY_RULE_SETUP
+ECHO;
+	YY_BREAK
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(CMT_SLASH_STAR):
+case YY_STATE_EOF(CMT_MULTI_LINE):
+case YY_STATE_EOF(IN_DBL_STRING):
+case YY_STATE_EOF(IN_SNG_STRING):
+	yyterminate();
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = yyg->yy_hold_char;
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed yyin at a new source and called
+			 * vdb_kfg_yylex().  If so, then we have to assure
+			 * consistency between YY_CURRENT_BUFFER and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state( yyscanner );
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);
+
+			yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++yyg->yy_c_buf_p;
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = yyg->yy_last_accepting_cpos;
+				yy_current_state = yyg->yy_last_accepting_state;
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer( yyscanner ) )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				yyg->yy_did_buffer_switch_on_eof = 0;
+
+				if ( vdb_kfg_yywrap(yyscanner ) )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * yytext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! yyg->yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				yyg->yy_c_buf_p =
+					yyg->yytext_ptr + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state( yyscanner );
+
+				yy_cp = yyg->yy_c_buf_p;
+				yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				yyg->yy_c_buf_p =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];
+
+				yy_current_state = yy_get_previous_state( yyscanner );
+
+				yy_cp = yyg->yy_c_buf_p;
+				yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+} /* end of vdb_kfg_yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+	register char *source = yyg->yytext_ptr;
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;
+
+	else
+		{
+			int num_to_read =
+			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+			int yy_c_buf_p_offset =
+				(int) (yyg->yy_c_buf_p - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					vdb_kfg_yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+						number_to_move - 1;
+
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+			yyg->yy_n_chars, (size_t) num_to_read );
+
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+		}
+
+	if ( yyg->yy_n_chars == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			vdb_kfg_yyrestart(yyin  ,yyscanner);
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+		/* Extend the array by 50%, plus the number we really need. */
+		yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) vdb_kfg_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
+		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+	}
+
+	yyg->yy_n_chars += number_to_move;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+	yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+	return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+    static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+	yy_current_state = yyg->yy_start;
+
+	for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
+		{
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+		if ( yy_accept[yy_current_state] )
+			{
+			yyg->yy_last_accepting_state = yy_current_state;
+			yyg->yy_last_accepting_cpos = yy_cp;
+			}
+		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+			{
+			yy_current_state = (int) yy_def[yy_current_state];
+			if ( yy_current_state >= 135 )
+				yy_c = yy_meta[(unsigned int) yy_c];
+			}
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+		}
+
+	return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state , yyscan_t yyscanner)
+{
+	register int yy_is_jam;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
+	register char *yy_cp = yyg->yy_c_buf_p;
+
+	register YY_CHAR yy_c = 1;
+	if ( yy_accept[yy_current_state] )
+		{
+		yyg->yy_last_accepting_state = yy_current_state;
+		yyg->yy_last_accepting_cpos = yy_cp;
+		}
+	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+		{
+		yy_current_state = (int) yy_def[yy_current_state];
+		if ( yy_current_state >= 135 )
+			yy_c = yy_meta[(unsigned int) yy_c];
+		}
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+	yy_is_jam = (yy_current_state == 134);
+
+	return yy_is_jam ? 0 : yy_current_state;
+}
+
+    static void yyunput (int c, register char * yy_bp , yyscan_t yyscanner)
+{
+	register char *yy_cp;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+    yy_cp = yyg->yy_c_buf_p;
+
+	/* undo effects of setting up yytext */
+	*yy_cp = yyg->yy_hold_char;
+
+	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+		{ /* need to shift things up to make room */
+		/* +2 for EOB chars. */
+		register int number_to_move = yyg->yy_n_chars + 2;
+		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+		register char *source =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+			yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+			YY_FATAL_ERROR( "flex scanner push-back overflow" );
+		}
+
+	*--yy_cp = (char) c;
+
+    if ( c == '\n' ){
+        --yylineno;
+    }
+
+	yyg->yytext_ptr = yy_bp;
+	yyg->yy_hold_char = *yy_cp;
+	yyg->yy_c_buf_p = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+    static int yyinput (yyscan_t yyscanner)
+#else
+    static int input  (yyscan_t yyscanner)
+#endif
+
+{
+	int c;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+	*yyg->yy_c_buf_p = yyg->yy_hold_char;
+
+	if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+			/* This was really a NUL. */
+			*yyg->yy_c_buf_p = '\0';
+
+		else
+			{ /* need more input */
+			int offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
+			++yyg->yy_c_buf_p;
+
+			switch ( yy_get_next_buffer( yyscanner ) )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					vdb_kfg_yyrestart(yyin ,yyscanner);
+
+					/*FALLTHROUGH*/
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( vdb_kfg_yywrap(yyscanner ) )
+						return EOF;
+
+					if ( ! yyg->yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput(yyscanner);
+#else
+					return input(yyscanner);
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) yyg->yy_c_buf_p;	/* cast for 8-bit char's */
+	*yyg->yy_c_buf_p = '\0';	/* preserve yytext */
+	yyg->yy_hold_char = *++yyg->yy_c_buf_p;
+
+	if ( c == '\n' )
+		   
+    do{ yylineno++;
+        yycolumn=0;
+    }while(0)
+;
+
+	return c;
+}
+#endif	/* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * @param yyscanner The scanner object.
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void vdb_kfg_yyrestart  (FILE * input_file , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+	if ( ! YY_CURRENT_BUFFER ){
+        vdb_kfg_yyensure_buffer_stack (yyscanner);
+		YY_CURRENT_BUFFER_LVALUE =
+            vdb_kfg_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+	}
+
+	vdb_kfg_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
+	vdb_kfg_yy_load_buffer_state(yyscanner );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * @param yyscanner The scanner object.
+ */
+    void vdb_kfg_yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+	/* TODO. We should be able to replace this entire function body
+	 * with
+	 *		vdb_kfg_yypop_buffer_state();
+	 *		vdb_kfg_yypush_buffer_state(new_buffer);
+     */
+	vdb_kfg_yyensure_buffer_stack (yyscanner);
+	if ( YY_CURRENT_BUFFER == new_buffer )
+		return;
+
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*yyg->yy_c_buf_p = yyg->yy_hold_char;
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+		}
+
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+	vdb_kfg_yy_load_buffer_state(yyscanner );
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (vdb_kfg_yywrap()) processing, but the only time this flag
+	 * is looked at is after vdb_kfg_yywrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+static void vdb_kfg_yy_load_buffer_state  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+	yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+	yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+	yyg->yy_hold_char = *yyg->yy_c_buf_p;
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * @param yyscanner The scanner object.
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE vdb_kfg_yy_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
+{
+	YY_BUFFER_STATE b;
+    
+	b = (YY_BUFFER_STATE) vdb_kfg_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in vdb_kfg_yy_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) vdb_kfg_yyalloc(b->yy_buf_size + 2 ,yyscanner );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in vdb_kfg_yy_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	vdb_kfg_yy_init_buffer(b,file ,yyscanner);
+
+	return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with vdb_kfg_yy_create_buffer()
+ * @param yyscanner The scanner object.
+ */
+    void vdb_kfg_yy_delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+	if ( ! b )
+		return;
+
+	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		vdb_kfg_yyfree((void *) b->yy_ch_buf ,yyscanner );
+
+	vdb_kfg_yyfree((void *) b ,yyscanner );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a vdb_kfg_yyrestart() or at EOF.
+ */
+    static void vdb_kfg_yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file , yyscan_t yyscanner)
+
+{
+	int oerrno = errno;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+	vdb_kfg_yy_flush_buffer(b ,yyscanner);
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+    /* If b is the current buffer, then vdb_kfg_yy_init_buffer was _probably_
+     * called from vdb_kfg_yyrestart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = 0;
+    
+	errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * @param yyscanner The scanner object.
+ */
+    void vdb_kfg_yy_flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == YY_CURRENT_BUFFER )
+		vdb_kfg_yy_load_buffer_state(yyscanner );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *  @param yyscanner The scanner object.
+ */
+void vdb_kfg_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+	if (new_buffer == NULL)
+		return;
+
+	vdb_kfg_yyensure_buffer_stack(yyscanner);
+
+	/* This block is copied from vdb_kfg_yy_switch_to_buffer. */
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*yyg->yy_c_buf_p = yyg->yy_hold_char;
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+		}
+
+	/* Only push if top exists. Otherwise, replace top. */
+	if (YY_CURRENT_BUFFER)
+		yyg->yy_buffer_stack_top++;
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+	/* copied from vdb_kfg_yy_switch_to_buffer. */
+	vdb_kfg_yy_load_buffer_state(yyscanner );
+	yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *  @param yyscanner The scanner object.
+ */
+void vdb_kfg_yypop_buffer_state (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+	if (!YY_CURRENT_BUFFER)
+		return;
+
+	vdb_kfg_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner);
+	YY_CURRENT_BUFFER_LVALUE = NULL;
+	if (yyg->yy_buffer_stack_top > 0)
+		--yyg->yy_buffer_stack_top;
+
+	if (YY_CURRENT_BUFFER) {
+		vdb_kfg_yy_load_buffer_state(yyscanner );
+		yyg->yy_did_buffer_switch_on_eof = 1;
+	}
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void vdb_kfg_yyensure_buffer_stack (yyscan_t yyscanner)
+{
+	int num_to_alloc;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+	if (!yyg->yy_buffer_stack) {
+
+		/* First allocation is just for 2 elements, since we don't know if this
+		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
+		 * immediate realloc on the next call.
+         */
+		num_to_alloc = 1;
+		yyg->yy_buffer_stack = (struct yy_buffer_state**)vdb_kfg_yyalloc
+								(num_to_alloc * sizeof(struct yy_buffer_state*)
+								, yyscanner);
+		if ( ! yyg->yy_buffer_stack )
+			YY_FATAL_ERROR( "out of dynamic memory in vdb_kfg_yyensure_buffer_stack()" );
+								  
+		memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+				
+		yyg->yy_buffer_stack_max = num_to_alloc;
+		yyg->yy_buffer_stack_top = 0;
+		return;
+	}
+
+	if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
+
+		/* Increase the buffer to prepare for a possible push. */
+		int grow_size = 8 /* arbitrary grow size */;
+
+		num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
+		yyg->yy_buffer_stack = (struct yy_buffer_state**)vdb_kfg_yyrealloc
+								(yyg->yy_buffer_stack,
+								num_to_alloc * sizeof(struct yy_buffer_state*)
+								, yyscanner);
+		if ( ! yyg->yy_buffer_stack )
+			YY_FATAL_ERROR( "out of dynamic memory in vdb_kfg_yyensure_buffer_stack()" );
+
+		/* zero only the new slots.*/
+		memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
+		yyg->yy_buffer_stack_max = num_to_alloc;
+	}
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object. 
+ */
+YY_BUFFER_STATE vdb_kfg_yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)
+{
+	YY_BUFFER_STATE b;
+    
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) vdb_kfg_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in vdb_kfg_yy_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	vdb_kfg_yy_switch_to_buffer(b ,yyscanner );
+
+	return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to vdb_kfg_yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       vdb_kfg_yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE vdb_kfg_yy_scan_string (yyconst char * yystr , yyscan_t yyscanner)
+{
+    
+	return vdb_kfg_yy_scan_bytes(yystr,strlen(yystr) ,yyscanner);
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to vdb_kfg_yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE vdb_kfg_yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len , yyscan_t yyscanner)
+{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+    
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = _yybytes_len + 2;
+	buf = (char *) vdb_kfg_yyalloc(n ,yyscanner );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in vdb_kfg_yy_scan_bytes()" );
+
+	for ( i = 0; i < _yybytes_len; ++i )
+		buf[i] = yybytes[i];
+
+	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = vdb_kfg_yy_scan_buffer(buf,n ,yyscanner);
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in vdb_kfg_yy_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+}
+
+    static void yy_push_state (int  new_state , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+	if ( yyg->yy_start_stack_ptr >= yyg->yy_start_stack_depth )
+		{
+		yy_size_t new_size;
+
+		yyg->yy_start_stack_depth += YY_START_STACK_INCR;
+		new_size = yyg->yy_start_stack_depth * sizeof( int );
+
+		if ( ! yyg->yy_start_stack )
+			yyg->yy_start_stack = (int *) vdb_kfg_yyalloc(new_size ,yyscanner );
+
+		else
+			yyg->yy_start_stack = (int *) vdb_kfg_yyrealloc((void *) yyg->yy_start_stack,new_size ,yyscanner );
+
+		if ( ! yyg->yy_start_stack )
+			YY_FATAL_ERROR( "out of memory expanding start-condition stack" );
+		}
+
+	yyg->yy_start_stack[yyg->yy_start_stack_ptr++] = YY_START;
+
+	BEGIN(new_state);
+}
+
+    static void yy_pop_state  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+	if ( --yyg->yy_start_stack_ptr < 0 )
+		YY_FATAL_ERROR( "start-condition stack underflow" );
+
+	BEGIN(yyg->yy_start_stack[yyg->yy_start_stack_ptr]);
+}
+
+    static int yy_top_state  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+	return yyg->yy_start_stack[yyg->yy_start_stack_ptr - 1];
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
+{
+    	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		yytext[yyleng] = yyg->yy_hold_char; \
+		yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
+		yyg->yy_hold_char = *yyg->yy_c_buf_p; \
+		*yyg->yy_c_buf_p = '\0'; \
+		yyleng = yyless_macro_arg; \
+		} \
+	while ( 0 )
+
+/* Accessor  methods (get/set functions) to struct members. */
+
+/** Get the user-defined data for this scanner.
+ * @param yyscanner The scanner object.
+ */
+YY_EXTRA_TYPE vdb_kfg_yyget_extra  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yyextra;
+}
+
+/** Get the current line number.
+ * @param yyscanner The scanner object.
+ */
+int vdb_kfg_yyget_lineno  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    
+        if (! YY_CURRENT_BUFFER)
+            return 0;
+    
+    return yylineno;
+}
+
+/** Get the current column number.
+ * @param yyscanner The scanner object.
+ */
+int vdb_kfg_yyget_column  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    
+        if (! YY_CURRENT_BUFFER)
+            return 0;
+    
+    return yycolumn;
+}
+
+/** Get the input stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *vdb_kfg_yyget_in  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yyin;
+}
+
+/** Get the output stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *vdb_kfg_yyget_out  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yyout;
+}
+
+/** Get the length of the current token.
+ * @param yyscanner The scanner object.
+ */
+int vdb_kfg_yyget_leng  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yyleng;
+}
+
+/** Get the current token.
+ * @param yyscanner The scanner object.
+ */
+
+char *vdb_kfg_yyget_text  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yytext;
+}
+
+/** Set the user-defined data. This data is never touched by the scanner.
+ * @param user_defined The data to be associated with this scanner.
+ * @param yyscanner The scanner object.
+ */
+void vdb_kfg_yyset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yyextra = user_defined ;
+}
+
+/** Set the current line number.
+ * @param line_number
+ * @param yyscanner The scanner object.
+ */
+void vdb_kfg_yyset_lineno (int  line_number , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+        /* lineno is only valid if an input buffer exists. */
+        if (! YY_CURRENT_BUFFER )
+           yy_fatal_error( "vdb_kfg_yyset_lineno called with no buffer" , yyscanner); 
+    
+    yylineno = line_number;
+}
+
+/** Set the current column.
+ * @param line_number
+ * @param yyscanner The scanner object.
+ */
+void vdb_kfg_yyset_column (int  column_no , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+        /* column is only valid if an input buffer exists. */
+        if (! YY_CURRENT_BUFFER )
+           yy_fatal_error( "vdb_kfg_yyset_column called with no buffer" , yyscanner); 
+    
+    yycolumn = column_no;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * @param yyscanner The scanner object.
+ * @see vdb_kfg_yy_switch_to_buffer
+ */
+void vdb_kfg_yyset_in (FILE *  in_str , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yyin = in_str ;
+}
+
+void vdb_kfg_yyset_out (FILE *  out_str , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yyout = out_str ;
+}
+
+int vdb_kfg_yyget_debug  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yy_flex_debug;
+}
+
+void vdb_kfg_yyset_debug (int  bdebug , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yy_flex_debug = bdebug ;
+}
+
+/* Accessor methods for yylval and yylloc */
+
+YYSTYPE * vdb_kfg_yyget_lval  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yylval;
+}
+
+void vdb_kfg_yyset_lval (YYSTYPE *  yylval_param , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yylval = yylval_param;
+}
+
+/* User-visible API */
+
+/* vdb_kfg_yylex_init is special because it creates the scanner itself, so it is
+ * the ONLY reentrant function that doesn't take the scanner as the last argument.
+ * That's why we explicitly handle the declaration, instead of using our macros.
+ */
+
+int vdb_kfg_yylex_init(yyscan_t* ptr_yy_globals)
+
+{
+    if (ptr_yy_globals == NULL){
+        errno = EINVAL;
+        return 1;
+    }
+
+    *ptr_yy_globals = (yyscan_t) vdb_kfg_yyalloc ( sizeof( struct yyguts_t ), NULL );
+
+    if (*ptr_yy_globals == NULL){
+        errno = ENOMEM;
+        return 1;
+    }
+
+    /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
+    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+    return yy_init_globals ( *ptr_yy_globals );
+}
+
+/* vdb_kfg_yylex_init_extra has the same functionality as vdb_kfg_yylex_init, but follows the
+ * convention of taking the scanner as the last argument. Note however, that
+ * this is a *pointer* to a scanner, as it will be allocated by this call (and
+ * is the reason, too, why this function also must handle its own declaration).
+ * The user defined value in the first argument will be available to vdb_kfg_yyalloc in
+ * the yyextra field.
+ */
+
+int vdb_kfg_yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )
+
+{
+    struct yyguts_t dummy_yyguts;
+
+    vdb_kfg_yyset_extra (yy_user_defined, &dummy_yyguts);
+
+    if (ptr_yy_globals == NULL){
+        errno = EINVAL;
+        return 1;
+    }
+	
+    *ptr_yy_globals = (yyscan_t) vdb_kfg_yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
+	
+    if (*ptr_yy_globals == NULL){
+        errno = ENOMEM;
+        return 1;
+    }
+    
+    /* By setting to 0xAA, we expose bugs in
+    yy_init_globals. Leave at 0x00 for releases. */
+    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+    
+    vdb_kfg_yyset_extra (yy_user_defined, *ptr_yy_globals);
+    
+    return yy_init_globals ( *ptr_yy_globals );
+}
+
+static int yy_init_globals (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    /* Initialization is the same as for the non-reentrant scanner.
+     * This function is called from vdb_kfg_yylex_destroy(), so don't allocate here.
+     */
+
+    yyg->yy_buffer_stack = 0;
+    yyg->yy_buffer_stack_top = 0;
+    yyg->yy_buffer_stack_max = 0;
+    yyg->yy_c_buf_p = (char *) 0;
+    yyg->yy_init = 0;
+    yyg->yy_start = 0;
+
+    yyg->yy_start_stack_ptr = 0;
+    yyg->yy_start_stack_depth = 0;
+    yyg->yy_start_stack =  NULL;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+    yyin = stdin;
+    yyout = stdout;
+#else
+    yyin = (FILE *) 0;
+    yyout = (FILE *) 0;
+#endif
+
+    /* For future reference: Set errno on error, since we are called by
+     * vdb_kfg_yylex_init()
+     */
+    return 0;
+}
+
+/* vdb_kfg_yylex_destroy is for both reentrant and non-reentrant scanners. */
+int vdb_kfg_yylex_destroy  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+    /* Pop the buffer stack, destroying each element. */
+	while(YY_CURRENT_BUFFER){
+		vdb_kfg_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner );
+		YY_CURRENT_BUFFER_LVALUE = NULL;
+		vdb_kfg_yypop_buffer_state(yyscanner);
+	}
+
+	/* Destroy the stack itself. */
+	vdb_kfg_yyfree(yyg->yy_buffer_stack ,yyscanner);
+	yyg->yy_buffer_stack = NULL;
+
+    /* Destroy the start condition stack. */
+        vdb_kfg_yyfree(yyg->yy_start_stack ,yyscanner );
+        yyg->yy_start_stack = NULL;
+
+    /* Reset the globals. This is important in a non-reentrant scanner so the next time
+     * vdb_kfg_yylex() is called, initialization will occur. */
+    yy_init_globals( yyscanner);
+
+    /* Destroy the main struct (reentrant only). */
+    vdb_kfg_yyfree ( yyscanner , yyscanner );
+    yyscanner = NULL;
+    return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)
+{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)
+{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+}
+#endif
+
+void *vdb_kfg_yyalloc (yy_size_t  size , yyscan_t yyscanner)
+{
+	return (void *) malloc( size );
+}
+
+void *vdb_kfg_yyrealloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner)
+{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+}
+
+void vdb_kfg_yyfree (void * ptr , yyscan_t yyscanner)
+{
+	free( (char *) ptr );	/* see vdb_kfg_yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+
+
+
+bool KFGScan_yylex_init(KFGScanBlock* sb, const char *str)
+{
+    if (vdb_kfg_yylex_init(&sb->scanner) != 0)
+    {   
+        return false; /*RC ( rcKFG, rcMgr, rcParsing, rcMemory, rcExhausted );*/
+    }       
+    sb->buffer=vdb_kfg_yy_scan_string((yyconst char*)str,sb->scanner); 
+    
+    {   /* initialize line/col counters */
+        /* yylineno and yycolumn are macros using variable yyg, so we have to prepare it for them */
+        struct yyguts_t * yyg = (struct yyguts_t*)sb->scanner;
+        yylineno=1;
+        yycolumn=1;
+    }
+    
+    return true;
+}
+
+void KFGScan_yylex_destroy(KFGScanBlock* sb)
+{
+    vdb_kfg_yy_delete_buffer(sb->buffer,sb->scanner); 
+    if (sb->scanner)
+    {
+        vdb_kfg_yylex_destroy(sb->scanner);
+    }       
+    sb->scanner=0;
+    sb->buffer=0;
+}
+
+void KFGScan_set_debug(bool on, KFGScanBlock* sb)
+{
+    vdb_kfg_yyset_debug(on ? 1 : 0,sb->scanner);
+}
+
+int KFGScan_yylex(KFGSymbol* sym, KFGScanBlock* sb) 
+{ 
+    sym->pb.tokenId=vdb_kfg_yylex(&sym->pb,sb->scanner); 
+    sb->lastToken= &sym->pb;
+    
+    switch (sym->pb.tokenId)
+    {
+    case kfgVAR_REF:
+        if (!sb->look_up_var(sb->self, &sym->pb)) 
+        {
+            /* undefined variable reference is handled silently, to behave like a shell script */
+            /* sb->report_error(sb, "variable not found");*/
+            sym->pb.tokenLength = 0; 
+        }
+        sym->pb.tokenId = kfgSTRING;
+        break;
+    case kfgUNTERM_VAR_REF: /* convert bad var ref into a string */ 
+        sb->report_error(sb, "unterminated variable reference inside a string (use '\\$(' to avoid this message)");
+        sym->pb.tokenId = kfgSTRING; 
+        break;
+    case kfgUNTERM_STRING:
+    case kfgUNTERM_ESCAPED_STRING:
+        sb->report_error(sb, "unterminated string");
+        break;
+    default:
+        break;
+    }
+    
+    return sym->pb.tokenId; 
+}
+
+
diff --git a/libs/kfg/config-lex.l b/libs/kfg/config-lex.l
new file mode 100644
index 0000000..d16dfaf
--- /dev/null
+++ b/libs/kfg/config-lex.l
@@ -0,0 +1,221 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+ 
+%{ 
+    #include "kfg-lex.h"
+    #include <sysalloc.h>
+    #include "config-tokens.h"    
+    
+    #define YYSTYPE KFGToken
+    
+    /* code to populate token with internal values */
+    #define YY_USER_ACTION              \
+        yylval -> tokenText     = yytext;   \
+        yylval -> tokenLength   = yyleng;   \
+        yylval -> line_no       = yylineno; \
+        yylval -> column_no     = yycolumn; \
+        yycolumn += yyleng; 
+        
+    #define REM_LQUOTE \
+        ++ yylval -> tokenText; \
+        -- yylval -> tokenLength; \
+        ++ yylval -> column_no;
+        
+    #define REM_RQUOTE \
+        -- yylval -> tokenLength; 
+%}
+
+%option never-interactive nounistd yylineno
+
+%option prefix="vdb_kfg_yy"
+
+/* re-entrant scanner */
+%option reentrant
+
+/* bison options */
+%option bison-bridge
+
+ /* maintain state stack */
+%option stack
+
+ /* let parser handle EOF */
+%option noyywrap
+
+ /* start-state for slash-star comments */
+%x CMT_SLASH_STAR
+%x CMT_MULTI_LINE
+
+ /* states for strings */
+%x IN_DBL_STRING
+%x IN_SNG_STRING
+
+ /* in-string variable reference */
+%x IN_VAR_REF
+ 
+ /* node/name in a path */
+path_node                       [A-Za-z_0-9][-.A-Za-z_0-9]*
+
+pathname    {path_node}(\/{path_node})*
+
+abs_key     \/{pathname}
+rel_key     {pathname}
+
+ref_start   \$\(
+var_ref     {ref_start}{pathname}\)
+
+sstr_char   ([^\\'\f\r\n$]|$[^(\\])
+dstr_char   ([^\\"\f\r\n$]|$[^(\\])
+
+%%
+ /* multi-line comments */
+\/\*                                            { yy_push_state ( CMT_SLASH_STAR, yyscanner ); }
+<CMT_SLASH_STAR,CMT_MULTI_LINE>[^*\n]+          /* ignore */
+<CMT_SLASH_STAR,CMT_MULTI_LINE>\*+[^*/\n]+      /* ignore */
+<CMT_SLASH_STAR,CMT_MULTI_LINE>\**\n            { BEGIN CMT_MULTI_LINE; }
+<CMT_SLASH_STAR>\*+\/                           { yy_pop_state ( yyscanner ); }
+<CMT_MULTI_LINE>\*+\/                           { yy_pop_state ( yyscanner ); return kfgEND_LINE; }
+
+ /* line comments */
+#.*                                     /* ignore */
+
+ /* ignored tokens */
+[ \t\f\v\r]                             /* ignore */
+
+ /* end of line is significant */
+\n                                      { return kfgEND_LINE; }
+
+ /* normal, POSIX-style paths */
+\/{pathname}                            { return kfgABS_PATH; }
+{pathname}                              { return kfgREL_PATH; }
+
+ /* variable references inside strings */
+<IN_VAR_REF>{var_ref}                   { yy_pop_state ( yyscanner ); return kfgVAR_REF; }
+<IN_VAR_REF>[^)\n]*                     { yy_pop_state ( yyscanner ); return kfgUNTERM_VAR_REF; }
+<IN_VAR_REF><<EOF>>                     { yy_pop_state ( yyscanner ); return kfgUNTERM_VAR_REF; } 
+
+ /* single quoted strings */
+'{sstr_char}*'                          { REM_LQUOTE; REM_RQUOTE; return kfgSTRING; }
+'{sstr_char}*                           { REM_LQUOTE; return kfgUNTERM_STRING; }
+'(\\.|$\\|$\\$|{sstr_char})+'           { REM_LQUOTE; REM_RQUOTE; return kfgESCAPED_STRING; }
+'(\\.|$\\|$\\$|{sstr_char})+            { REM_LQUOTE; return kfgUNTERM_ESCAPED_STRING; }
+
+ /* single quoted strings with variable references*/
+'{sstr_char}*/{ref_start}               { REM_LQUOTE; yy_push_state ( IN_SNG_STRING, yyscanner ); yy_push_state ( IN_VAR_REF, yyscanner ); return kfgSTRING; }
+'(\\.|{sstr_char})+/{ref_start}         { REM_LQUOTE; yy_push_state ( IN_SNG_STRING, yyscanner ); yy_push_state ( IN_VAR_REF, yyscanner ); return kfgESCAPED_STRING; }
+
+<IN_SNG_STRING>{ref_start}              { yy_push_state ( IN_VAR_REF, yyscanner ); yyless(0); }
+<IN_SNG_STRING>{sstr_char}+/{ref_start} { yy_push_state ( IN_VAR_REF, yyscanner ); return kfgSTRING; }
+<IN_SNG_STRING>{sstr_char}*'            { REM_RQUOTE; yy_pop_state ( yyscanner ); return kfgSTRING; } 
+
+ /* double quoted strings */
+\"{dstr_char}*\"                        { REM_LQUOTE; REM_RQUOTE; return kfgSTRING; }
+\"{dstr_char}*                          { REM_LQUOTE; return kfgUNTERM_STRING; }
+\"(\\.|$\\|$\\$|{dstr_char})+\"         { REM_LQUOTE; REM_RQUOTE; return kfgESCAPED_STRING; }
+\"(\\.|$\\|$\\$|{dstr_char})+           { REM_LQUOTE; return kfgUNTERM_ESCAPED_STRING; }
+
+ /* double quoted strings with variable references*/
+\"{dstr_char}*/{ref_start}              { REM_LQUOTE; yy_push_state ( IN_DBL_STRING, yyscanner ); yy_push_state ( IN_VAR_REF, yyscanner ); return kfgSTRING; }
+\"(\\.|{dstr_char})+/{ref_start}        { REM_LQUOTE; yy_push_state ( IN_DBL_STRING, yyscanner ); yy_push_state ( IN_VAR_REF, yyscanner ); return kfgESCAPED_STRING; }
+
+<IN_DBL_STRING>{ref_start}              { yy_push_state ( IN_VAR_REF, yyscanner ); yyless(0); }
+<IN_DBL_STRING>{dstr_char}+/{ref_start} { yy_push_state ( IN_VAR_REF, yyscanner ); return kfgSTRING; }
+<IN_DBL_STRING>{dstr_char}*\"           { REM_RQUOTE; yy_pop_state ( yyscanner ); return kfgSTRING; } 
+
+ /* literals */
+=                                       { return kfgASSIGN; }
+
+{var_ref}                               { return kfgVAR_REF; }
+
+ /* unrecognized input */
+.                                       { return kfgUNRECOGNIZED; }
+
+%%
+
+bool KFGScan_yylex_init(KFGScanBlock* sb, const char *str)
+{
+    if (yylex_init(&sb->scanner) != 0)
+    {   
+        return false; /*RC ( rcKFG, rcMgr, rcParsing, rcMemory, rcExhausted );*/
+    }       
+    sb->buffer=yy_scan_string((yyconst char*)str, sb->scanner); 
+    
+    {   /* initialize line/col counters */
+        /* yylineno and yycolumn are macros using variable yyg, so we have to prepare it for them */
+        struct yyguts_t * yyg = (struct yyguts_t*)sb->scanner;
+        yylineno=1;
+        yycolumn=1;
+    }
+    
+    return true;
+}
+
+void KFGScan_yylex_destroy(KFGScanBlock* sb)
+{
+    yy_delete_buffer(sb->buffer, sb->scanner); 
+    if (sb->scanner)
+    {
+        yylex_destroy(sb->scanner);
+    }       
+    sb->scanner=0;
+    sb->buffer=0;
+}
+
+void KFGScan_set_debug(bool on, KFGScanBlock* sb)
+{
+    yyset_debug(on ? 1 : 0, sb->scanner);
+}
+
+int KFGScan_yylex(KFGSymbol* sym, KFGScanBlock* sb) 
+{ 
+    sym->pb.tokenId=yylex(&sym->pb, sb->scanner); 
+    sb->lastToken= &sym->pb;
+    
+    switch (sym->pb.tokenId)
+    {
+    case kfgVAR_REF:
+        if (!sb->look_up_var(sb->self, &sym->pb)) 
+        {
+            /* undefined variable reference is handled silently, to behave like a shell script */
+            /* sb->report_error(sb, "variable not found");*/
+            sym->pb.tokenLength = 0; 
+        }
+        sym->pb.tokenId = kfgSTRING;
+        break;
+    case kfgUNTERM_VAR_REF: /* convert bad var ref into a string */ 
+        sb->report_error(sb, "unterminated variable reference inside a string (use '\\$(' to avoid this message)");
+        sym->pb.tokenId = kfgSTRING; 
+        break;
+    case kfgUNTERM_STRING:
+    case kfgUNTERM_ESCAPED_STRING:
+        sb->report_error(sb, "unterminated string");
+        break;
+    default:
+        break;
+    }
+    
+    return sym->pb.tokenId; 
+}
+
diff --git a/libs/kfg/config-tokens.h b/libs/kfg/config-tokens.h
new file mode 100644
index 0000000..dd1af53
--- /dev/null
+++ b/libs/kfg/config-tokens.h
@@ -0,0 +1,75 @@
+/* A Bison parser, made by GNU Bison 2.5.  */
+
+/* Bison interface for Yacc-like parsers in C
+   
+      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+   
+   This program 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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+   
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     kfgEND_INPUT = 0,
+     kfgEND_LINE = 258,
+     kfgUNTERM_STRING = 259,
+     kfgUNTERM_ESCAPED_STRING = 260,
+     kfgUNRECOGNIZED = 261,
+     kfgVAR_REF = 262,
+     kfgUNTERM_VAR_REF = 263,
+     kfgASSIGN = 264,
+     kfgSTRING = 265,
+     kfgESCAPED_STRING = 266,
+     kfgABS_PATH = 267,
+     kfgREL_PATH = 268
+   };
+#endif
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+
+    KFGToken                pb;
+    const struct VNamelist* namelist;
+
+
+
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+
+
diff --git a/libs/kfg/config.c b/libs/kfg/config.c
new file mode 100644
index 0000000..42dd65a
--- /dev/null
+++ b/libs/kfg/config.c
@@ -0,0 +1,4387 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kfg/kfg-priv.h>
+#include "kfg-priv.h"
+
+struct KfgConfigNamelist;
+#define KNAMELIST_IMPL struct KfgConfigNamelist
+#include <klib/namelist.h>
+#include <klib/impl.h>
+
+#include <klib/container.h>
+#include <klib/data-buffer.h> /* KDataBuffer */
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/out.h> /* OUTMSG */
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/refcount.h>
+#include <klib/text.h>
+#include <klib/token.h>
+#include <klib/klib-priv.h>
+
+#include <kfs/directory.h>
+#include <kfs/gzip.h> /* KFileMakeGzipForRead */
+#include <kfs/subfile.h> /* KFileMakeSubRead */
+#include <kfs/file.h>
+#include <kfs/dyload.h>
+#include <kfs/mmap.h>
+#include <vfs/path.h>
+#include <strtol.h>
+#include <sysalloc.h>
+
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <va_copy.h>
+
+#if !WINDOWS
+    #include <sys/utsname.h>
+#endif
+
+#include "kfg-parse.h"
+#include "config-tokens.h"
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+/* the leaf name of the user's modifiable settings,
+   must reside in the user's $HOME/.ncbi directory */
+#define MAGIC_LEAF_NAME "user-settings.mkfg"
+
+static bool s_disable_user_settings = false;
+
+
+/*----------------------------------------------------------------------------*/
+static const char default_kfg[] = {
+"/config/default = \"true\"\n"
+"/repository/user/main/public/apps/file/volumes/flat = \"files\"\n"
+"/repository/user/main/public/apps/nakmer/volumes/nakmerFlat = \"nannot\"\n"
+"/repository/user/main/public/apps/nannot/volumes/nannotFlat = \"nannot\"\n"
+"/repository/user/main/public/apps/refseq/volumes/refseq = \"refseq\"\n"
+"/repository/user/main/public/apps/sra/volumes/sraFlat = \"sra\"\n"
+"/repository/user/main/public/apps/wgs/volumes/wgsFlat = \"wgs\"\n"
+"/repository/user/main/public/root = \"$(HOME)/ncbi/public\"\n"
+"/repository/remote/main/CGI/resolver-cgi = "
+                      "\"https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi\"\n"
+"/repository/remote/protected/CGI/resolver-cgi = "
+                      "\"https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi\"\n"
+"/tools/ascp/max_rate = \"1000m\"\n"
+};
+/*----------------------------------------------------------------------------*/
+
+/*--------------------------------------------------------------------------
+ * KConfig
+ */
+static
+rc_t KConfigSever ( const KConfig *self );
+
+
+/*--------------------------------------------------------------------------
+ * KConfigIncluded
+ *  node within configuration tree
+ */
+
+typedef struct KConfigIncluded KConfigIncluded;
+struct KConfigIncluded
+{
+    BSTNode n;
+    bool is_magic_file;
+    char path [ 1 ];
+};
+
+
+static
+void CC KConfigIncludedWhack ( BSTNode *n, void *ignore )
+{
+    free ( n );
+}
+
+static
+int64_t CC KConfigIncludedSort ( const BSTNode *item, const BSTNode *n )
+{
+    const KConfigIncluded *a = ( const KConfigIncluded* ) item;
+    const KConfigIncluded *b = ( const KConfigIncluded* ) n;
+    return strcmp ( a -> path, b -> path );
+}
+
+enum {
+    eInternalFalse = false, /* internal = false: non internal nodes */
+    eInternalTrue  = true,  /* internal = true ; internal nodes: read-only */
+    eInternalTrueUpdatable
+                       /* internal = true ; internal nodes, but can be updated :
+                                            "kfg/dir", "kfg/name" */
+} EInternal;
+typedef uint32_t TInternal;
+
+/*--------------------------------------------------------------------------
+ * KConfigNode
+ *  node within configuration tree
+ */
+struct KConfigNode
+{
+    BSTNode n;
+
+    /* needs to hold a dependency reference to mgr */
+    KConfig *mgr;
+
+    /* uncounted reference to parent node */
+    KConfigNode *dad;
+
+    /* File node came from; null if created during runtime*/
+    KConfigIncluded *came_from;
+
+    /* named children - always unique */
+    BSTree children;
+
+    /* named attributes */
+    BSTree attr;
+
+    /* node value */
+    char * val_buffer;
+    String value;
+
+    /* node name */
+    String name;
+
+    KRefcount refcount;
+
+    TInternal internal; /* EInternal */
+    bool read_only;
+    bool dirty;
+};
+
+/* replace this once we introduce attributes */
+#define KConfigAttrWhack NULL
+
+
+/* Whack
+ */
+static
+void CC KConfigNodeWhack ( BSTNode *n, void * data )
+{
+    KConfigNode *self = ( KConfigNode* ) n;
+    KConfig *mgr = data;
+
+    if ( mgr == NULL )
+    {
+        /* just releasing reference */
+        KConfigSever ( self -> mgr );
+        self -> mgr = NULL;
+        self -> read_only = false;
+    }
+    else
+    {
+        /* tearing down structure */
+        BSTreeWhack ( & self -> children, KConfigNodeWhack, mgr );
+        BSTreeWhack ( & self -> attr, KConfigAttrWhack, mgr );
+        free ( self -> val_buffer );
+        free ( self );
+    }
+}
+
+/* Init
+ */
+static
+void KConfigNodeInit ( KConfigNode *self, const String *name )
+{
+    /* clear out here, ignoring the string space */
+    memset ( self, 0, sizeof * self );
+
+    /* initialize name early for the sake of KRefcountInit */
+    string_copy ( ( char* ) ( self + 1 ), name -> size + 1, name -> addr, name -> size );
+    StringInit ( & self -> name, ( char* ) ( self + 1 ), name -> size, name -> len );
+    StringInit ( & self -> value, "", 0, 0 );
+    KRefcountInit ( & self -> refcount, 0, "KConfigNode", "init", self -> name . addr );
+}
+
+/* Make
+ */
+static
+rc_t KConfigNodeMake ( KConfigNode **n, const String *name )
+{
+    /* don't use calloc, because of string space */
+    KConfigNode *cn = malloc ( sizeof * cn + name -> size + 1 );
+    if ( cn == NULL )
+    {
+        rc_t rc = RC ( rcKFG, rcNode, rcCreating, rcMemory, rcExhausted );
+        PLOGERR (klogErr, (klogErr, rc, "Unable to create a config item for $(i)", "i=%S", name));
+        return rc;
+    }
+    KConfigNodeInit ( cn, name );
+    * n = cn;
+
+    return 0;
+}
+
+
+/* Cmp
+ * Sort
+ */
+static
+int64_t CC KConfigNodeCmp ( const void *item, const BSTNode *n )
+{
+    const String *a = ( const String* ) item;
+    const KConfigNode *b = ( const KConfigNode* ) n;
+    return StringCompare ( a, & b -> name );
+}
+
+static
+int64_t CC KConfigNodeSort ( const BSTNode *item, const BSTNode *n )
+{
+    const KConfigNode *a = ( const KConfigNode* ) item;
+    const KConfigNode *b = ( const KConfigNode* ) n;
+    return StringCompare ( & a -> name, & b -> name );
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KConfigNodeAddRef ( const KConfigNode *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KConfigNode" ) )
+        {
+        case krefLimit:
+            return RC ( rcKFG, rcNode, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KConfigNodeRelease ( const KConfigNode *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KConfigNode" ) )
+        {
+        case krefWhack:
+            KConfigNodeWhack ( & ( ( KConfigNode* ) self ) -> n, NULL );
+        break;
+        case krefNegative:
+            return RC ( rcKFG, rcNode, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KConfig
+ *  configuration parameter manager
+ */
+struct KConfig
+{
+    BSTree tree;
+    BSTree included;
+    KDualRef refcount;
+    KConfigIncluded *current_file;
+
+    char * load_path;
+    size_t load_path_sz_tmp;
+
+    const char *magic_file_path;
+    size_t magic_file_path_size;
+
+    bool disableFileLoadOnKfgCreating;
+
+    bool dirty;
+    bool initialized;
+};
+
+static atomic_ptr_t G_kfg;
+
+rc_t KConfigAppendToLoadPath(KConfig *self, const char* chunk)
+{
+    rc_t rc = 0;
+    size_t new_sz = 0;
+
+    assert(self);
+
+    if (chunk == NULL || chunk[0] == '\0') {
+        return rc;
+    }
+
+    if (self->load_path == NULL) {
+        self->load_path_sz_tmp = PATH_MAX;
+        self->load_path = malloc(self->load_path_sz_tmp);
+        if (self->load_path == NULL) {
+            return RC ( rcKFG, rcMgr, rcCreating, rcMemory, rcExhausted );
+        }
+        self->load_path[0] = '\0';
+    }
+
+    new_sz = string_size(self->load_path) + 1 + string_size(chunk) + 1;
+    if (self->load_path_sz_tmp < new_sz) {
+        self->load_path_sz_tmp = 2 * new_sz;
+        self->load_path = realloc(self->load_path, self->load_path_sz_tmp);
+        if (self->load_path == NULL) {
+            return RC ( rcKFG, rcMgr, rcCreating, rcMemory, rcExhausted );
+        }
+    }
+
+    if (self->load_path[0] != '\0') {
+        strcat(self->load_path, ":");
+    }
+    strcat(self->load_path, chunk);
+
+    return rc;
+}
+
+
+/* Whack
+ */
+static
+rc_t KConfigEmpty ( KConfig * self)
+{
+    if (self)
+    {
+        BSTreeWhack ( & self -> tree, KConfigNodeWhack, self );
+        BSTreeWhack ( & self -> included, KConfigIncludedWhack, NULL );
+
+        self -> magic_file_path_size = 0;
+        free ( ( void* ) self -> magic_file_path );
+        self -> magic_file_path = NULL;
+
+        self->load_path_sz_tmp = 0;
+        free ( self->load_path );
+        self->load_path = NULL;
+    }
+    return 0;
+}
+
+static
+rc_t find_home_directory ( KDyld *dyld,
+    const KDirectory **dir, bool release_cached_dir )
+{
+    static const KDirectory * cached_dir = NULL;
+    static rc_t cached_rc = 0;
+    rc_t rc;
+
+    if (release_cached_dir) {
+        rc = KDirectoryRelease(cached_dir);
+        cached_dir = NULL;
+        cached_rc = 0;
+        return rc;
+    }
+    else if ( cached_dir != NULL )
+    {
+        rc = KDirectoryAddRef ( cached_dir );
+        if ( rc == 0 ) {
+            * dir = cached_dir;
+        }
+        return rc;
+    }
+    else if ( cached_rc != 0 )
+    {
+        return cached_rc;
+    }
+
+    rc = KDyldHomeDirectory ( dyld, dir, ( fptr_t ) KConfigMake );
+    if ( rc == 0  &&  KDirectoryAddRef ( * dir ) == 0 )
+    {
+        cached_dir = * dir;
+    }
+    else
+    {
+        cached_rc = rc;
+    }
+
+    return rc;
+}
+
+static
+rc_t KConfigWhack ( KConfig *self )
+{
+    bool release_cached_dir = true;
+    find_home_directory(NULL, NULL, release_cached_dir);
+
+    if ( self == G_kfg.ptr )
+        atomic_test_and_set_ptr ( & G_kfg, NULL, self );
+
+    KConfigEmpty (self);
+
+    free ( self );
+
+    return 0;
+}
+
+/* Init
+ */
+static
+void KConfigInit ( KConfig *self, KConfigNode * root )
+{
+    KDualRefInit ( & self -> refcount, 1, 0, "KConfig", "init", "kfg" );
+    BSTreeInit ( & self -> tree );
+    self -> dirty = false;
+    self -> initialized = false;
+    BSTreeInit ( & self -> included );
+    BSTreeInsert ( & self -> tree, & root -> n, KConfigNodeSort );
+    self -> magic_file_path = NULL;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KConfigAddRef ( const KConfig *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KDualRefAdd ( & self -> refcount, "KConfig" ) )
+        {
+        case krefLimit:
+            return RC ( rcKFG, rcMgr, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KConfigRelease ( const KConfig *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KDualRefDrop ( & self -> refcount, "KConfig" ) )
+        {
+        case krefWhack:
+            return KConfigWhack ( ( KConfig* ) self );
+        case krefLimit:
+            return RC ( rcKFG, rcMgr, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+static
+KConfig *KConfigAttach ( const KConfig *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KDualRefAddDep ( & self -> refcount, "KConfig" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KConfig* ) self;
+}
+
+static
+rc_t KConfigSever ( const KConfig *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KDualRefDropDep ( & self -> refcount, "KConfig" ) )
+        {
+        case krefWhack:
+            return KConfigWhack ( ( KConfig* ) self );
+        case krefLimit:
+            return RC ( rcKFG, rcMgr, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* init_token_source
+ */
+static
+rc_t init_token_source ( KTokenText *tt, KTokenSource *src,
+                         char *full, size_t fsize, const char *srcpath, const char *path, va_list args )
+{
+    size_t num_writ;
+    rc_t rc = 0;
+
+    if (args == NULL)
+        num_writ = string_copy ( full, fsize, path, string_size ( path ));
+    else
+        rc = string_vprintf ( full, fsize, & num_writ, path, args );
+    if ( rc == 0 )
+    {
+        String text, fpath;
+        StringInit ( & text, full, num_writ, string_len ( full, num_writ ) );
+        StringInitCString ( & fpath, srcpath );
+        KTokenTextInit ( tt, & text, & fpath );
+        KTokenSourceInit ( src, tt );
+    }
+    return rc;
+}
+
+/* Find
+ */
+static
+KToken *KConfigNodeFind ( const KConfigNode *self, const KConfigNode **n, KTokenSource *src, KToken *t )
+{
+    * n = NULL;
+
+    while ( t -> id != eEndOfInput )
+    {
+        switch ( t -> id )
+        {
+        case ePeriod:
+            break;
+        case eDblPeriod:
+            if ( self -> dad == NULL )
+                return NULL;
+            self = self -> dad;
+            break;
+        case eDecimal:
+        case eHex:
+        case eOctal:
+        case eIdent:
+        case eName:
+            self = ( const KConfigNode* ) BSTreeFind
+                ( & self -> children, &t -> str, KConfigNodeCmp );
+            if ( self == NULL )
+                return t;
+            break;
+        default:
+            * n = self;
+            return t;
+        }
+
+        if ( KTokenizerNext ( kPOSIXPathTokenizer, src, t ) -> id != eFwdSlash )
+            break;
+
+        KTokenizerNext ( kPOSIXPathTokenizer, src, t );
+    }
+
+    * n = self;
+    return t;
+}
+
+/* Create
+ */
+static
+KToken *KConfigNodeCreate ( KConfigNode *self, KConfigNode **n, KTokenSource *src, KToken *t,
+                            KConfigIncluded *current_file )
+{
+    bool created = false;
+    KConfigNode * nself;
+    * n = NULL;
+
+    while ( t -> id != eEndOfInput )
+    {
+        switch ( t -> id )
+        {
+        case ePeriod:
+            break;
+        case eDblPeriod:
+            if ( self -> dad == NULL )
+                return NULL;
+            self = self -> dad;
+            break;
+        case eDecimal:
+        case eHex:
+        case eOctal:
+        case eName:
+        case eIdent:
+            nself = ( KConfigNode* ) BSTreeFind
+                ( & self -> children, & t -> str, KConfigNodeCmp );
+            if ( nself == NULL )
+            {
+                KConfigNode *child;
+                rc_t rc = KConfigNodeMake ( & child, & t -> str );
+                if ( rc != 0 )
+                    return t;
+                BSTreeInsert ( & self -> children, & child -> n, KConfigNodeSort );
+                child -> dad = self;
+                self = child;
+                created = true;
+            }
+            else
+            {
+                self = nself;
+            }
+            break;
+        default:
+            * n = self;
+            return t;
+        }
+
+        if ( KTokenizerNext ( kPOSIXPathTokenizer, src, t ) -> id != eFwdSlash )
+            break;
+
+        KTokenizerNext ( kPOSIXPathTokenizer, src, t );
+    }
+
+    if ( created )
+        self -> came_from = current_file;
+
+    * n = self;
+    return t;
+}
+
+
+/* OpenNodeRead
+ * VOpenNodeRead
+ *  opens a configuration node
+ *
+ *  "node" [ OUT ] - return parameter for indicated configuration node
+ *
+ *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+ *  node within configuration hierarchy. paths will be interpreted as
+ *  if they were file system paths, using '/' as separator. the
+ *  special values NULL and "" are interpreted as "."
+ */
+static
+rc_t KConfigNodeVOpenNodeReadInt ( const KConfigNode *self, const KConfig *mgr,
+                                   const KConfigNode **node, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( node == NULL )
+    {
+        rc = RC ( rcKFG, rcNode, rcOpening, rcParam, rcNull );
+        PLOGERR (klogErr, (klogErr, rc, "faile to provide node to open $(n)", "n=%s", path));
+    }
+    else
+    {
+        if ( self == NULL )
+        {
+            rc = RC ( rcKFG, rcNode, rcOpening, rcSelf, rcNull );
+            PLOGERR (klogErr, (klogErr, rc, "failed to provide node reference for opening $(n)", "n=%s", path));
+        }
+        else
+        {
+            if ( path == NULL || path [ 0 ] == 0 )
+            {
+                * node = self;
+                rc = 0;
+            }
+            else
+            {
+                KTokenText tt;
+                KTokenSource src;
+                char full [ 4096 ];
+
+                rc = init_token_source ( & tt, & src, full, sizeof full, "", path, args );
+                if ( rc == 0 )
+                {
+                    /* look ahead */
+                    KToken t;
+
+                    /* skip over fwd slashes */
+                    do
+                        KTokenizerNext ( kPOSIXPathTokenizer, & src, & t );
+                    while ( t.id == eFwdSlash );
+
+                    /* follow path */
+                    if ( KConfigNodeFind ( self, node, & src, & t ) == NULL )
+                    {
+                        rc = RC ( rcKFG, rcNode, rcOpening, rcPath, rcInvalid );
+                        PLOGERR (klogErr, (klogErr, rc, "bad path $(p)", "p=%s", path));
+                    }
+                    if ( ( self = * node ) == NULL )
+                    {
+                        rc = SILENT_RC ( rcKFG, rcNode, rcOpening, rcPath, rcNotFound );
+                        /* don't complain about this
+                           PLOGERR (klogErr, (klogErr, rc, "can't find symbol $(p)", "p=%s", path));
+                        */
+                    }
+                    else if ( t . id != eEndOfInput )
+                    {
+                        rc = RC ( rcKFG, rcNode, rcOpening, rcPath, rcInvalid );
+                        PLOGERR (klogErr, (klogErr, rc, "bad path $(p)", "p=%s", path));
+                    }
+                }
+            }
+
+            if ( rc == 0 )
+            {
+                /* open node for read */
+                if ( self -> read_only )
+                {
+                    assert ( self -> mgr == mgr );
+                    return KConfigNodeAddRef ( self );
+                }
+
+                /* check to see if already open */
+                if ( atomic32_read ( & self -> refcount ) == 0 )
+                {
+                    ( ( KConfigNode* ) self ) -> mgr = KConfigAttach ( mgr );
+                    ( ( KConfigNode* ) self ) -> read_only = true;
+                    return KConfigNodeAddRef ( self );
+                }
+
+                rc = RC ( rcKFG, rcNode, rcOpening, rcNode, rcBusy );
+            }
+        }
+
+        * node = NULL;
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KConfigNodeGetMgr( const KConfigNode * self, KConfig ** mgr )
+{
+    if ( self == NULL )
+        return RC ( rcKFG, rcNode, rcOpening, rcSelf, rcNull );
+    if ( mgr == NULL )
+        return RC ( rcKFG, rcNode, rcOpening, rcParam, rcNull );
+    *mgr = self->mgr;
+    return KConfigAddRef ( *mgr );
+}
+
+
+LIB_EXPORT rc_t CC KConfigNodeVOpenNodeRead ( const KConfigNode *self,
+                                              const KConfigNode **node, const char *path, va_list args )
+{
+    if ( self != NULL )
+        return KConfigNodeVOpenNodeReadInt ( self, self -> mgr, node, path, args );
+
+    if ( node == NULL )
+        return RC ( rcKFG, rcNode, rcOpening, rcParam, rcNull );
+
+    * node = NULL;
+    return RC ( rcKFG, rcNode, rcOpening, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC KConfigNodeOpenNodeRead ( const KConfigNode *self,
+                                             const KConfigNode **node, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KConfigNodeVOpenNodeRead ( self, node, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfigVOpenNodeRead ( const KConfig *self,
+                                          const KConfigNode **node, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( node == NULL )
+        rc = RC ( rcKFG, rcMgr, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcMgr, rcOpening, rcSelf, rcNull );
+        else if (self->tree.root == NULL)
+            rc = RC ( rcKFG, rcMgr, rcOpening, rcPath, rcNotFound );
+        else
+        {
+            return KConfigNodeVOpenNodeReadInt
+                ( (const KConfigNode *) self -> tree . root, self, node, path, args );
+        }
+
+        * node = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfigOpenNodeRead ( const KConfig *self,
+                                         const KConfigNode **node, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KConfigVOpenNodeRead ( self, node, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* OpenNodeUpdate
+ * VOpenNodeUpdate
+ *  opens a configuration node
+ *
+ *  "node" [ OUT ] - return parameter for indicated configuration node
+ *
+ *  "path" [ IN, NULL OKAY ] - optional path for specifying named
+ *  node within configuration hierarchy. paths will be interpreted as
+ *  if they were file system paths, using '/' as separator. the
+ *  special values NULL and "" are interpreted as "."
+ */
+static
+rc_t KConfigNodeVOpenNodeUpdateInt ( KConfigNode *self, KConfig *mgr,
+                                     KConfigNode **node, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( node == NULL )
+        rc = RC ( rcKFG, rcNode, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcNode, rcOpening, rcSelf, rcNull );
+        else
+        {
+            if ( path == NULL || path [ 0 ] == 0 )
+            {
+                * node = self;
+                rc = 0;
+            }
+            else
+            {
+                KTokenText tt;
+                KTokenSource src;
+                char full [ 4096 ];
+
+                rc = init_token_source ( & tt, & src, full, sizeof full, "", path, args );
+                if ( rc == 0 )
+                {
+                    /* look ahead */
+                    KToken t;
+
+                    do
+                        KTokenizerNext ( kPOSIXPathTokenizer, & src, & t );
+                    while ( t.id == eFwdSlash);
+
+                    /* follow path */
+                    assert ( mgr != NULL );
+                    if ( KConfigNodeCreate ( self, node, & src, & t, mgr -> current_file ) == NULL )
+                        return RC ( rcKFG, rcNode, rcOpening, rcPath, rcInvalid );
+                    if ( ( self = * node ) == NULL )
+                        rc = RC ( rcKFG, rcNode, rcOpening, rcMemory, rcExhausted );
+                    else if ( t . id != eEndOfInput )
+                        rc = RC ( rcKFG, rcNode, rcOpening, rcPath, rcInvalid );
+                }
+            }
+
+            if ( rc == 0 )
+            {
+                /* check to see if internal */
+                if ( self -> internal == eInternalTrue )
+                    rc = RC ( rcKFG, rcNode, rcOpening, rcNode, rcReadonly );
+                else
+                {
+                    /* check to see if open */
+                    if ( atomic32_read ( & self -> refcount ) == 0 )
+                    {
+                        self -> mgr = KConfigAttach ( mgr );
+                        assert ( ! self -> read_only );
+                        return KConfigNodeAddRef ( self );
+                    }
+
+                    rc = RC ( rcKFG, rcNode, rcOpening, rcNode, rcBusy );
+                }
+            }
+        }
+
+        * node = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfigNodeVOpenNodeUpdate ( KConfigNode *self,
+                                                KConfigNode **node, const char *path, va_list args )
+{
+    if ( self != NULL )
+        return KConfigNodeVOpenNodeUpdateInt ( self, self -> mgr, node, path, args );
+
+    if ( node == NULL )
+        return RC ( rcKFG, rcNode, rcOpening, rcParam, rcNull );
+
+    * node = NULL;
+    return RC ( rcKFG, rcNode, rcOpening, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC KConfigNodeOpenNodeUpdate ( KConfigNode *self,
+                                               KConfigNode **node, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KConfigNodeVOpenNodeUpdate ( self, node, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfigVOpenNodeUpdate ( KConfig *self,
+                                            KConfigNode **node, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( node == NULL )
+        rc = RC ( rcKFG, rcMgr, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcMgr, rcOpening, rcSelf, rcNull );
+        else if (self->tree.root == NULL)
+            rc = RC ( rcKFG, rcMgr, rcOpening, rcSelf, rcCorrupt );
+        else
+        {
+            return KConfigNodeVOpenNodeUpdateInt
+                ( ( KConfigNode* ) self -> tree . root, self, node, path, args );
+        }
+
+        * node = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfigOpenNodeUpdate ( KConfig *self,
+                                           KConfigNode **node, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KConfigVOpenNodeUpdate ( self, node, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* Read
+ *  read a node value
+ *
+ *  "offset" [ IN ] - initial offset into configuration
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - number of bytes actually read
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of bytes remaining to be read.
+ *  specifically, "offset" + "num_read" + "remaining" == sizeof node data
+ */
+LIB_EXPORT rc_t CC KConfigNodeRead ( const KConfigNode *self,
+                                     size_t offset, char *buffer, size_t bsize,
+                                     size_t *num_read, size_t *remaining )
+{
+    rc_t rc;
+    size_t dummy;
+
+    if ( remaining == NULL )
+        remaining = & dummy;
+
+    if ( num_read == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+        else if ( buffer == NULL && bsize != 0 )
+            rc = RC ( rcKFG, rcNode, rcReading, rcBuffer, rcNull );
+        else if ( offset >= self -> value . size )
+            rc = 0;
+        else
+        {
+            size_t avail = * remaining = self -> value . size - offset;
+            if ( avail > bsize )
+                avail = bsize;
+            if ( avail > 0 )
+                memmove ( buffer, & self -> value . addr [ offset ], avail );
+            * num_read = avail;
+            * remaining -= avail;
+            return 0;
+        }
+
+        * num_read = 0;
+    }
+
+    * remaining = 0;
+
+    return rc;
+}
+
+static
+void KConfigNodeSetDirty ( KConfigNode *self )
+{
+    KConfig *mgr = self -> mgr;
+
+    if ( mgr == NULL )
+        self -> dirty = true;
+    else if ( mgr -> initialized )
+        self -> dirty = mgr -> dirty = true;
+}
+
+/* Write
+ *  write a node value or attribute
+ *  replaces anything already there
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - new value data
+ */
+LIB_EXPORT rc_t CC KConfigNodeWrite ( KConfigNode *self, const char *buffer, size_t size )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcWriting, rcSelf, rcNull );
+    else if ( self -> read_only || self -> internal == eInternalTrue )
+        rc = RC ( rcKFG, rcNode, rcWriting, rcSelf, rcReadonly );
+    else if ( size == 0 )
+    {
+        free ( self -> val_buffer ), self -> val_buffer = NULL;
+        StringInit ( & self -> value, "", 0, 0 );
+        rc = 0;
+    }
+    else if ( buffer == NULL )
+        rc = RC ( rcKFG, rcNode, rcWriting, rcBuffer, rcNull );
+    else
+    {
+        if ( size != self -> value . size )
+        {
+            void *new_buffer = realloc ( self -> val_buffer, size + 1 );
+            if ( new_buffer == NULL )
+                return RC ( rcKFG, rcNode, rcWriting, rcMemory, rcExhausted );
+            self -> val_buffer = new_buffer;
+            self -> value . size = size;
+            self -> value . addr = new_buffer;
+        }
+
+        assert ( self -> val_buffer != NULL );
+        string_copy ( self -> val_buffer, self -> value . size + 1, buffer, size );
+        self -> value . len = string_len ( self -> val_buffer, size );
+
+        KConfigNodeSetDirty ( self );
+
+        rc = 0;
+    }
+
+    return rc;
+}
+
+
+/* Write Boolean
+ *  write a boolean value ( literally the text "true" or "false:
+ *  overwrites anything already there
+ *
+ *  "state" [ IN ] - new value
+ */
+KFG_EXTERN rc_t CC KConfigNodeWriteBool ( KConfigNode *self, bool state )
+{
+    rc_t rc;
+    size_t written;
+    char value[ 8 ];
+
+    if ( state )
+        rc = string_printf( value, sizeof value, &written, "true" );
+    else
+        rc = string_printf( value, sizeof value, &written, "false" );
+
+    if ( rc == 0 )
+        rc = KConfigNodeWrite ( self, value, written );
+    return rc;
+}
+
+
+/* Append
+ *  append data to value
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - value data to be appended
+ */
+LIB_EXPORT rc_t CC KConfigNodeAppend ( KConfigNode *self, const char *buffer, size_t size )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcWriting, rcSelf, rcNull );
+    else if ( self -> read_only || self -> internal )
+        rc = RC ( rcKFG, rcNode, rcWriting, rcSelf, rcReadonly );
+    else if ( size == 0 )
+        rc = 0;
+    else if ( buffer == NULL )
+        rc = RC ( rcKFG, rcNode, rcWriting, rcBuffer, rcNull );
+    else
+    {
+        void *new_buffer = realloc ( self -> val_buffer, self -> value . size + size + 1 );
+        if ( new_buffer == NULL )
+            return RC ( rcKFG, rcNode, rcWriting, rcMemory, rcExhausted );
+        self -> val_buffer = new_buffer;
+        string_copy ( & self -> val_buffer [ self -> value . size ], self -> value . size + size + 1, buffer, size );
+        self -> value . size += size;
+        self -> value . len = string_len ( self -> val_buffer, self -> value . size );
+
+        KConfigNodeSetDirty ( self );
+
+        rc = 0;
+    }
+
+    return rc;
+}
+
+
+/* ReadAttr
+ *  reads as NUL-terminated string
+ *
+ *  "name" [ IN ] - NUL terminated attribute name
+ *
+ *  "buffer" [ OUT ] and "bsize" - return parameter for attribute value
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+LIB_EXPORT rc_t CC KConfigNodeReadAttr ( const KConfigNode *self, const char *name,
+                                         char *buffer, size_t bsize, size_t *size )
+{
+    PLOGMSG (klogFatal, (klogFatal, "$(F) unimplemented", "F=%s", __func__));
+    return -1;
+}
+
+
+/* WriteAttr
+ *  writes NUL-terminated string
+ *
+ *  "name" [ IN ] - NUL terminated attribute name
+ *
+ *  "value" [ IN ] - NUL terminated attribute value
+ */
+LIB_EXPORT rc_t CC KConfigNodeWriteAttr ( KConfigNode *self,
+                                          const char *name, const char *value )
+{
+    PLOGMSG (klogFatal, (klogFatal, "$(F) unimplemented", "F=%s", __func__));
+    return -1;
+}
+
+
+/* Drop
+ * VDrop
+ *  drop some or all node content
+ */
+LIB_EXPORT rc_t CC KConfigNodeDropAll ( KConfigNode *self )
+{
+    if ( self == NULL )
+        return RC ( rcKFG, rcNode, rcClearing, rcSelf, rcNull );
+    BSTreeWhack ( & self->children, KConfigNodeWhack, self->mgr);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KConfigNodeDropAttr ( KConfigNode *self, const char *attr )
+{
+    PLOGMSG (klogFatal, (klogFatal, "$(F) unimplemented", "F=%s", __func__));
+    return -1;
+}
+
+LIB_EXPORT rc_t CC KConfigNodeVDropChild ( KConfigNode *self, const char *path, va_list args )
+{
+    PLOGMSG (klogFatal, (klogFatal, "$(F) unimplemented", "F=%s", __func__));
+    return -1;
+}
+
+LIB_EXPORT rc_t CC KConfigNodeDropChild ( KConfigNode *self, const char *path, ... )
+{
+    PLOGMSG (klogFatal, (klogFatal, "$(F) unimplemented", "F=%s", __func__));
+    return -1;
+}
+
+
+/* Rename
+ *  renames a contained object
+ *
+ *  "from" [ IN ] - NUL terminated string in UTF-8
+ *  giving simple name of existing attr
+ *
+ *  "to" [ IN ] - NUL terminated string in UTF-8
+ *  giving new simple attr name
+ */
+LIB_EXPORT rc_t CC KConfigNodeRenameAttr ( KConfigNode *self, const char *from, const char *to )
+{
+    PLOGMSG (klogFatal, (klogFatal, "$(F) unimplemented", "F=%s", __func__));
+    return -1;
+}
+
+LIB_EXPORT rc_t CC KConfigNodeRenameChild ( KConfigNode *self, const char *from, const char *to )
+{
+    PLOGMSG (klogFatal, (klogFatal, "$(F) unimplemented", "F=%s", __func__));
+    return -1;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KConfig
+ */
+
+static
+rc_t
+update_node ( KConfig* self, const char* key, const char* value,
+    TInternal internal )
+{
+    KConfigNode * node;
+    rc_t rc = KConfigOpenNodeUpdate ( self, &node, "%s", key);
+    if (rc == 0)
+    {
+/*        pLogMsg(klogInfo, "updating config key $(KEY) with '$(VALUE)'",
+                          "KEY=%s,VALUE=%s",
+                          key, value);*/
+        rc = KConfigNodeWrite (node, value, string_size(value));
+        node -> internal = internal;
+        if (self->current_file != NULL && self->current_file->is_magic_file) {
+            if (node->came_from == NULL || !node->came_from->is_magic_file) {
+                node->came_from = self->current_file;
+            }
+        }
+        KConfigNodeRelease ( node );
+    }
+    return rc;
+}
+
+static
+rc_t write_nvp(void* pself, const char* name, size_t nameLen, VNamelist* values)
+{   /* concatenate all values from the namelist and put the result into config under the given name */
+    uint32_t count;
+    size_t size=0;
+    size_t concatTo=0;
+    uint32_t i;
+
+    char* buf;
+    KConfig *self = (KConfig *)pself;
+    rc_t rc=VNameListCount(values, &count);
+    if (rc != 0)
+    {
+        return rc;
+    }
+    for (i=0; i < count; ++i)
+    {
+        const char* val;
+        rc=VNameListGet(values, i, &val);
+        if (rc != 0)
+        {
+            return rc;
+        }
+        size+=string_size(val);
+    }
+
+    buf=(char*)malloc(size+1);
+    if (buf == 0)
+    {
+        return RC ( rcKFG, rcMgr, rcLoading, rcMemory, rcExhausted );
+    }
+
+    concatTo=0;
+    for (i=0; i < count; ++i)
+    {
+        const char* val;
+        rc=VNameListGet(values, i, &val);
+        if (rc != 0)
+        {
+            free(buf);
+            return rc;
+        }
+        string_copy(buf+concatTo, size+1-concatTo, val, string_size(val));
+        concatTo+=string_size(val);
+    }
+    buf[size]=0;
+
+    {   /* create the node */
+        String* nameStr;
+
+        /* some old config files may have "dbGaP" in their repository keys misspelled as "dbGap" - fix if seen */
+        const char* oldGaPprefix = "/repository/user/protected/dbGap-";
+        size_t size = sizeof("/repository/user/protected/dbGap-") - 1;
+        bool needsFix = string_cmp(name, string_measure(name, NULL), oldGaPprefix, size, (uint32_t)size) == 0;
+
+        String tmp;
+        StringInit(&tmp, name, nameLen, (uint32_t)nameLen);
+        StringCopy((const String**)&nameStr, &tmp);
+        if (needsFix)
+            ((char*)(nameStr->addr)) [ size - 2 ] = 'P';
+
+        rc = update_node(self, nameStr->addr, buf, false);
+        if (needsFix)
+        {
+            KConfigNode * node;
+            rc = KConfigOpenNodeUpdate ( self, &node, "%s", nameStr->addr );
+            if (rc == 0)
+            {   /* we are likely to be initializing, so have to set the dirty flags directly, not through KConfigNodeSetDirty() */
+                self -> dirty = true;
+                node -> dirty = true;
+                KConfigNodeRelease ( node );
+            }
+        }
+        StringWhack(nameStr);
+    }
+
+    free(buf);
+    return rc;
+}
+
+static
+bool look_up_var(void * self, struct KFGToken* pb)
+{
+    const KConfigNode* node;
+    rc_t rc = KConfigOpenNodeRead((KConfig*)self, &node, "%.*s", pb->tokenLength-3, pb->tokenText+2);
+    if (rc == 0)
+    {
+        pb->tokenText   = node->value.addr;
+        pb->tokenLength = node->value.len;
+        pb->tokenId     = kfgVAR_REF;
+    }
+    KConfigNodeRelease(node);
+    return rc == 0;
+}
+
+static
+void CC report_error(KFGScanBlock* sb, const char* msg)
+{
+    pLogMsg(klogErr, "$(file):$(line):$(column): error: token='$(token)', msg='$(msg)'",
+                     "file=%s,line=%d,column=%d,token=%.*s,msg=%s",
+                     sb->file,
+                     sb->lastToken->line_no,
+                     sb->lastToken->column_no,
+                     sb->lastToken->tokenLength,
+                     sb->lastToken->tokenText,
+                     msg);
+}
+
+#define DISP_RC2(rc, name, msg) (void)((rc == 0) ? 0 : \
+    PLOGERR(klogInt, (klogInt, rc, \
+        "$(name): $(msg)", "name=%s,msg=%s", name, msg)))
+
+typedef struct
+{
+    KFile *f; /* NULL for OUTMSG */
+
+    /* total bytes flushed to the file*/
+    size_t flushed;
+
+    /* total bytes in buffer */
+    size_t buffered;
+
+    rc_t rc;
+
+    /* buffer */
+    char buffer [ 32 * 1024 ];
+
+} PrintBuff;
+
+/* Init
+ *  initialize your structure
+ */
+static
+void PrintBuffInit ( PrintBuff *pb, KFile *f )
+{
+    assert ( pb != NULL );
+    pb -> f = f; /* NULL for OUTMSG */
+    pb -> flushed = 0;
+    pb -> buffered = 0;
+    pb -> rc = 0;
+}
+
+/* Flush
+ * Write buffer out to file
+ */
+static rc_t PrintBuffFlush ( PrintBuff *self )
+{
+    rc_t rc = 0;
+
+    assert ( self != NULL );
+    if ( self -> buffered != 0 )
+    {
+        size_t num_writ = 0;
+
+        if (self -> f == NULL) {
+            OUTMSG(("%.*s", self -> buffered - self -> flushed,
+                self -> buffer + self -> flushed));
+            num_writ = self -> buffered;
+        }
+        else {
+            rc = KFileWriteAll ( self -> f, self -> flushed,
+                self -> buffer, self -> buffered, & num_writ );
+        }
+
+        if ( rc == 0 )
+        {
+            if ( num_writ != self -> buffered )
+                rc = RC ( rcKFG, rcBuffer, rcFlushing,
+                    rcTransfer, rcIncomplete );
+            else
+            {
+                self -> flushed += num_writ;
+                self -> buffered = 0;
+            }
+        }
+    }
+
+    return self -> rc = rc;
+}
+
+/* Print
+ *  printf style writing to the buffer
+ */
+static
+rc_t PrintBuffPrint ( PrintBuff *self, const char *fmt, ... )
+{
+    rc_t rc;
+    size_t num_writ;
+    va_list args1, args2;
+
+    assert ( self != NULL );
+    assert ( fmt != NULL );
+    assert ( fmt [ 0 ] != 0 );
+
+    va_start ( args1, fmt );
+    va_copy ( args2, args1 );
+
+    rc = string_vprintf ( & self -> buffer [ self -> buffered ],
+            sizeof self -> buffer - self -> buffered, & num_writ, fmt, args1 );
+    if ( rc == 0 )
+        self -> buffered += num_writ;
+    else if ( GetRCObject ( rc ) == (enum RCObject)rcBuffer
+        && GetRCState ( rc ) == rcInsufficient )
+    {
+        rc = PrintBuffFlush ( self );
+        if ( rc == 0 )
+        {
+            rc = string_vprintf ( & self -> buffer [ self -> buffered ],
+             sizeof self -> buffer - self -> buffered, & num_writ, fmt, args2 );
+            if ( rc == 0 )
+                self -> buffered += num_writ;
+        }
+    }
+
+    va_end ( args2 );
+    va_end ( args1 );
+
+    return self -> rc = rc;
+}
+
+static rc_t printIndent(int indent, PrintBuff *pb) {
+    rc_t rc = 0;
+
+    int i = 0;
+    for (i = 0; i < indent * 2; ++i) {
+        rc_t rc2 = PrintBuffPrint(pb, " ");
+        if (rc == 0 && rc2 != 0) {
+            rc = rc2;
+        }
+    }
+
+    return rc;
+}
+
+static rc_t KConfigNodeReadData(const KConfigNode* self,
+    char* buf, size_t blen, size_t* num_read)
+{
+    rc_t rc = 0;
+    size_t remaining = 0;
+
+    assert(buf && blen && num_read);
+
+    rc = KConfigNodeRead(self, 0, buf, blen, num_read, &remaining);
+
+    assert(remaining == 0); /* TODO overflow check */
+    assert(*num_read <= blen);
+
+    return rc;
+}
+
+char ToHex(uint32_t i)
+{
+    if (i <= 9)
+        return '0' + i;
+    return 'A' + (i - 10);
+}
+
+static
+rc_t CC PrintBuffPrintQuoted ( PrintBuff *self, const String* data )
+{
+    rc_t rc = PrintBuffPrint(self, "\"");
+    const char* str = (const char*)(data->addr);
+    uint32_t i;
+    for ( i = 0; i < StringLength(data); ++i )
+    {
+        if (rc != 0)
+            break;
+        if (str[i] < ' ')
+        {
+            rc = PrintBuffPrint(self, "\\x%c%c",
+                ToHex(str[i]/16), ToHex(str[i]%16) );
+        }
+        else
+        {
+            switch (str[i])
+            {
+            case '"':
+                rc = PrintBuffPrint(self, "\\\"");
+                break;
+            default:
+                rc = PrintBuffPrint(self, "%c", str[i]);
+            }
+        }
+    }
+    if (rc == 0)
+        rc = PrintBuffPrint(self, "\"");
+    return rc;
+}
+
+static rc_t _printNodeData(const char *name, const char *data, uint32_t dlen,
+    bool native, const char *fullpath, bool hide, PrintBuff *pb)
+{
+    bool secret = false;
+    {
+        const char d1[] = "download-ticket";
+        size_t l1 = sizeof d1 - 1;
+
+        const char d2[] = "aws_access_key_id";
+        size_t l2 = sizeof d2 - 1;
+
+        const char d3[] = "aws_secret_access_key";
+        size_t l3 = sizeof d3 - 1;
+
+        if ((string_cmp(name,
+                string_measure(name, NULL), d1, l1, (uint32_t)l1) == 0) ||
+            (string_cmp(name,
+                string_measure(name, NULL), d2, l2, (uint32_t)l2) == 0) ||
+            (string_cmp(name,
+                string_measure(name, NULL), d3, l3, (uint32_t)l3) == 0))
+        {
+            secret = true;
+        }
+    }
+    if (hide && !native && secret) {
+        const char *ellipsis = "";
+        const char replace[] =
+"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+        if (dlen > 70) {
+            dlen = 70;
+            ellipsis = "...";
+        }
+        return PrintBuffPrint(pb, "%.*s%s", dlen, replace, ellipsis);
+    }
+    else if (!native) {
+        String s;
+        StringInit(&s, data, dlen, dlen);
+        return PrintBuffPrintQuoted(pb, &s);
+    }
+    else {
+        rc_t rc = PrintBuffPrint(pb, "%s = ", fullpath);
+        if (rc == 0) {
+            String s;
+            StringInit(&s, data, dlen, dlen);
+            rc = PrintBuffPrintQuoted(pb, &s);
+        }
+        if (rc == 0) {
+            rc = PrintBuffPrint(pb, "\n");
+        }
+        return rc;
+    }
+}
+
+static rc_t KConfigNodePrint(const KConfigNode *self, int indent,
+    const char* root, bool debug, bool native, const char* aFullpath,
+    PrintBuff *pb, uint32_t skipCount, va_list args)
+{
+    rc_t rc = 0;
+    KNamelist* names = NULL;
+    uint32_t count = 0;
+    uint32_t i = 0;
+    char data[4097] = "";
+    size_t num_data = 0;
+
+    assert(self);
+
+    if (!native) {
+        rc = printIndent(indent, pb);
+        if (rc == 0) {
+            bool found = false;
+            uint32_t i = 0;
+            va_list args_copy;
+            if (skipCount > 0) {
+                va_copy(args_copy, args);
+            }
+            for (i = 0; i < skipCount; ++i) {
+                const char *skip = va_arg(args_copy, const char*);
+                if (string_cmp(skip, string_measure(skip, NULL), root,
+                        string_measure(root, NULL), string_measure(root, NULL))
+                    == 0)
+                {
+                    rc = PrintBuffPrint
+                        (pb, "<%s><!-- skipped --></%s>\n", root, root);
+                    found = true;
+                    break;
+                }
+            }
+            if (skipCount > 0) {
+                va_end(args_copy);
+            }
+            if (found) {
+                return rc;
+            }
+            rc = PrintBuffPrint(pb, "<%s>", root);
+        }
+    }
+
+    if (rc == 0) {
+        rc_t rc = KConfigNodeReadData(self, data, sizeof data, &num_data);
+        DISP_RC2(rc, "KConfigNodeReadData()", root);
+        if (rc == 0 && num_data > 0) {
+            _printNodeData(root, data, num_data,
+                native, aFullpath, !native, pb);
+        }
+        if (debug && self->came_from) {
+            OUTMSG(("<came_from is_magic_file=\"%s\"/>",
+                self->came_from->is_magic_file ? "true" : "false"));
+        }
+    }
+
+    if (rc == 0) {
+        rc = KConfigNodeListChild(self, &names);
+        DISP_RC2(rc, "KConfigNodeListChild()", root);
+    }
+    if (rc == 0) {
+        rc = KNamelistCount(names, &count);
+        DISP_RC2(rc, "KNamelistCount()", root);
+    }
+
+    if (rc == 0) {
+        if (count > 0 && !native) {
+            rc = PrintBuffPrint(pb, "\n");
+        }
+        for (i = 0; i < count; ++i) {
+            char *fullpath = NULL;
+            const char* name = NULL;
+            const KConfigNode* node = NULL;
+            if (rc == 0) {
+                rc = KNamelistGet(names, i, &name);
+                DISP_RC2(rc, "KNamelistGet()", root);
+            }
+            if (rc == 0) {
+                rc = KConfigNodeOpenNodeRead(self, &node, "%s", name);
+                DISP_RC2(rc, "KConfigNodeOpenNodeRead()", name);
+            }
+            if (rc == 0) {
+                size_t bsize = strlen(aFullpath) + 1 + strlen(name) + 1;
+                fullpath = malloc(bsize + 1);
+                if (fullpath == NULL) {
+                    rc = RC(rcKFG, rcStorage, rcAllocating,
+                        rcMemory, rcExhausted);
+                }
+                else {
+                    string_printf(fullpath, bsize, NULL,
+                        "%s/%s", aFullpath, name);
+                }
+            }
+            if (rc == 0) {
+                if (! isdigit(name[0])) {
+                    KConfigNodePrint(node, indent + 1, name,
+                        debug, native, fullpath, pb, skipCount, args);
+                }
+                else {
+                    /* XML node names cannot start with a number */
+                    size_t dsize = strlen(name) + 2;
+                    char *dname =  malloc(dsize);
+                    if (dname == NULL) {
+                        rc = RC(rcKFG, rcStorage, rcAllocating,
+                            rcMemory, rcExhausted);
+                    }
+                    else {
+                        string_printf(dname, dsize, NULL, "_%s", name);
+                        KConfigNodePrint(node, indent + 1, dname,
+                            debug, native, fullpath, pb, skipCount, args);
+                        free(dname);
+                    }
+                }
+            }
+            KConfigNodeRelease(node);
+            free(fullpath);
+        }
+    }
+
+    if (count > 0 && !native) {
+        printIndent(indent, pb);
+    }
+
+    if (rc == 0 && !native) {
+        rc = PrintBuffPrint(pb, "</%s>\n", root);
+    }
+
+    KNamelistRelease(names);
+
+    return rc;
+}
+
+static rc_t CC KConfigPrintImpl(const KConfig* self,
+    int indent, const char *root, bool debug, bool native,
+    PrintBuff *pb, uint32_t skipCount, va_list args)
+{
+    rc_t rc = 0;
+
+    if (root == NULL) {
+        root = "Config";
+    }
+
+    if (self == NULL) {
+        OUTMSG(("<%s>", root));
+        OUTMSG(("KConfigPrint(const KConfig* self = NULL)\n"));
+        OUTMSG(("</%s>\n", root));
+    }
+    else {
+        const KConfigNode* node = NULL;
+        if (rc == 0) {
+            rc = KConfigOpenNodeRead(self, &node, "/");
+            DISP_RC2(rc, "KConfigOpenNodeRead()", "/");
+        }
+        if (rc == 0) {
+            KConfigNodePrint
+                (node, indent, root, debug, native, "", pb, skipCount, args);
+        }
+        KConfigNodeRelease(node);
+    }
+
+    return rc;
+}
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+LIB_EXPORT rc_t CC KConfigPrintDebug(const KConfig* self, const char *path) {
+    rc_t rc = 0;
+
+    PrintBuff pb;
+
+    if (rc == 0) {
+        PrintBuffInit(&pb, NULL);
+    }
+
+    if (rc == 0) {
+        rc = KConfigPrintImpl(self, 0, path, true, false, &pb, 0, NULL);
+    }
+
+    if (rc == 0) {
+        rc = PrintBuffFlush(&pb);
+    }
+
+    return rc;
+}
+
+/*
+ * Set up the parameter block and start parsing lines
+ */
+static
+rc_t parse_file ( KConfig * self, const char* path, const char * src )
+{
+    KFGParseBlock pb;
+    KFGScanBlock sb;
+
+    pb.write_nvp    = write_nvp;
+
+    sb.self         = self;
+    sb.file         = path;
+    sb.look_up_var  = look_up_var;
+    sb.report_error = report_error;
+
+    if  ( ! KFGScan_yylex_init(&sb, src) )
+    {   /* out of memory is the only reason we can get false here */
+        return RC ( rcKFG, rcMgr, rcParsing, rcMemory, rcExhausted );
+    }
+
+    KFG_parse(&pb, &sb); /* may have reported parse errors into log, but we should have been able to extract enough data to proceed regardless */
+    KFGScan_yylex_destroy(&sb);
+
+    return 0;
+}
+
+/* LoadFile
+ * loads a configuration file
+ */
+LIB_EXPORT rc_t CC KConfigLoadFile ( KConfig * self, const char * path, const KFile * file )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcMgr, rcLoading, rcSelf, rcNull );
+    else if ( file == NULL )
+        rc = RC ( rcKFG, rcMgr, rcLoading, rcFile, rcNull );
+    else
+    {
+        const KMMap * mm;
+        bool entry_initialized = self -> initialized;
+        self -> initialized = false;
+
+        /* populate file-specific predefined nodes */
+#define UPDATE_NODES(dir, file)                             \
+        rc = update_node(self, "kfg/dir", dir, eInternalTrueUpdatable );     \
+        if (rc == 0)                                        \
+            rc = update_node(self, "kfg/name", file, eInternalTrueUpdatable )
+
+        if ( path == NULL || path [ 0 ] == 0)
+        {
+            path = "UNSPECIFIED";
+            UPDATE_NODES ( "", "" );
+        }
+        else
+        {
+            KDirectory* dir;
+            rc = KDirectoryNativeDir(&dir);
+            if (rc == 0 )
+            {
+                char buff [ 4096 ];
+                rc = KDirectoryResolvePath ( dir, true, buff, sizeof buff,
+                    "%.*s", string_size(path), path );
+                if ( rc == 0 )
+                {
+                    char* name = strrchr (buff, '/');
+                    DBGMSG ( DBG_KFG, DBG_FLAG ( DBG_KFG ),
+                        ( "KFG: loading file '%s'\n", buff ) );
+                    if (name == NULL)
+                    {   /* no dir name */
+                        UPDATE_NODES("", buff);
+                    }
+                    else
+                    {
+                        *name=0; /* nul-terminate dir name; file name follows the 0 */
+                        UPDATE_NODES(buff, name+1);
+                    }
+                }
+                KDirectoryRelease ( dir );
+            }
+            else
+            {
+                update_node(self, "kfg/dir", "", eInternalTrueUpdatable);
+                update_node(self, "kfg/name", "", eInternalTrueUpdatable);
+            }
+        }
+#undef UPDATE_NODES
+
+
+        rc = KMMapMakeRead ( & mm, file );
+        if ( rc == 0 )
+        {
+            size_t size;
+            const void * ptr;
+            rc = KMMapAddrRead ( mm, & ptr );
+            if ( rc == 0 )
+                rc = KMMapSize ( mm, & size );
+            if ( rc == 0 )
+            {
+                /* make a 0-terminated copy for parsing */
+                char* buf=malloc(size+1);
+                if (buf == 0)
+                {
+                    rc = RC ( rcKFG, rcMgr, rcLoading, rcMemory, rcExhausted );
+                }
+                else
+                {
+                    string_copy(buf, size+1, ptr, size);
+                    buf[size]=0;
+
+                    /* Parse the path to populate: */
+                 /* update_node(self, "kfg/dir", dir, eInternalTrueUpdatable);*/
+               /* update_node(self, "kfg/name", name, eInternalTrueUpdatable);*/
+
+                    /* parse config file */
+                    rc = parse_file ( self, path, buf );
+                    free(buf);
+                }
+            }
+
+            KMMapRelease ( mm );
+        }
+        self -> initialized = entry_initialized;
+    }
+
+    return rc;
+}
+
+static
+bool KConfigNodePrintPath ( KConfigNode *self, PrintBuff *pb )
+{
+    if ( self -> dad == NULL )
+        PrintBuffPrint ( pb, "%S", & self -> name );
+    else
+    {
+        if ( KConfigNodePrintPath ( self -> dad, pb ) )
+            return true;
+
+        PrintBuffPrint ( pb, "/%S", & self -> name );
+    }
+    return pb -> rc != 0;
+}
+
+/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv KfgSettings vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
+typedef struct {
+    const char *envrNcbiHome;
+    char        envrNcbiSettings[ PATH_MAX ];
+    char        dfltNcbiHome    [ PATH_MAX ];
+    char        dfltNcbiSettings[ PATH_MAX ];
+} KfgSettings;
+static
+void _KConfigIniKfgSettings ( const KConfig * self, KfgSettings * ks ) {
+    size_t bytes = 0;
+
+    assert(ks);
+    memset(ks, 0, sizeof *ks);
+
+    /* load environment */
+    ks -> envrNcbiHome = getenv ( "NCBI_HOME" );
+    {
+        const char *value = getenv ( "NCBI_SETTINGS" );
+        if ( value != NULL ) {
+            string_copy_measure (
+                ks -> envrNcbiSettings, sizeof ks -> envrNcbiSettings, value );
+        }
+        else if ( ks -> envrNcbiHome != NULL ) {
+            string_printf ( ks->envrNcbiSettings,
+                sizeof ks -> envrNcbiSettings,
+                & bytes, "%s/%s", ks -> envrNcbiHome, MAGIC_LEAF_NAME);
+        }
+    }
+
+    /* default values */
+    {
+        char home [ PATH_MAX ] = "";
+        size_t num_read = 0;
+        size_t remaining = 0;
+        rc_t rc = KConfigRead
+            ( self, "HOME", 0, home, sizeof home, & num_read, & remaining);
+        if ( rc != 0 || remaining != 0 ) {
+            return;
+        }
+        string_printf ( ks -> dfltNcbiHome  , sizeof ks -> dfltNcbiHome,
+            & bytes, "%.*s/.ncbi", num_read, home );
+        string_printf ( ks->dfltNcbiSettings, sizeof ks -> dfltNcbiSettings,
+            & bytes, "%.*s/.ncbi/%s", num_read, home, MAGIC_LEAF_NAME );
+    }
+}
+
+static
+bool MayICommitTo(const KConfig *self, const char *path, size_t size)
+{
+    if ( ! s_disable_user_settings ) {
+        return true;
+    }
+    else {
+        size_t bytes = 0;
+        char home             [ PATH_MAX ] = "";
+        char dfltNcbiSettings [ PATH_MAX ] = "";
+        size_t num_read = 0;
+        size_t remaining = 0;
+        rc_t rc = KConfigRead
+            ( self, "HOME", 0, home, sizeof home, & num_read, & remaining);
+        if ( rc != 0 || remaining != 0 ) {
+            return false;
+        }
+        string_printf ( dfltNcbiSettings, sizeof dfltNcbiSettings,
+            & bytes, "%.*s/.ncbi/%s", num_read, home, MAGIC_LEAF_NAME );
+        return string_cmp
+            (dfltNcbiSettings, bytes, path, size, sizeof dfltNcbiSettings) != 0;
+    }
+}
+
+static
+rc_t _KConfigGetNcbiHome ( const KConfig * self, const KfgSettings * ks,
+    char * buf, size_t size)
+{
+    size_t num_read = 0;
+    size_t remaining = 0;
+
+    if (KConfigRead ( self, "NCBI_HOME", 0, buf, size, & num_read, & remaining)
+        != 0)
+    {
+        assert ( ks );
+        if ( ks -> envrNcbiHome != 0 ) {
+            string_copy_measure ( buf, size, ks -> envrNcbiHome );
+        }
+        else {
+            string_copy_measure ( buf, size, ks -> dfltNcbiHome );
+        }
+    }
+    else if ( remaining > 0 || num_read >= size ) {
+        return RC ( rcKFG, rcNode, rcReading, rcBuffer, rcInsufficient );
+    }
+    else {
+        buf [ num_read ] = '\0';
+    }
+
+    return 0;
+}
+
+static
+rc_t _KConfigGetNcbiSettings ( const KConfig * self, const KfgSettings * ks,
+    char * buf, size_t size, const char * root)
+{
+    size_t num_read = 0;
+    size_t remaining = 0;
+
+    rc_t rc = 0;
+
+    assert(ks && buf && size);
+
+    buf[0] = '\0';
+
+    rc = KConfigRead
+        ( self, "NCBI_SETTINGS", 0, buf, size, & num_read, & remaining );
+    if ( rc != 0 ) {
+        if ( ks -> envrNcbiSettings [ 0 ] != '\0' ) {
+            string_copy_measure ( buf, size, ks -> envrNcbiSettings );
+            rc = 0;
+        }
+        else if ( root != NULL && root[0] != '\0' ) {
+            rc = string_printf
+                ( buf, size, & num_read, "%s/%s", root, MAGIC_LEAF_NAME );
+        }
+        if ( rc != 0 ) {
+            string_copy_measure ( buf, size, ks -> dfltNcbiSettings );
+            rc = 0;
+        }
+    }
+    else if ( remaining > 0 || num_read >= size ) {
+        return RC ( rcKFG, rcNode, rcReading, rcBuffer, rcInsufficient );
+    }
+    else {
+        buf [ num_read ] = '\0';
+    }
+
+    return rc;
+}
+
+static
+void _KConfigSetNcbiHome ( KConfig * self, const KfgSettings * ks,
+    const char * ncbi_home)
+{
+    size_t num_read = 0;
+    size_t remaining = 0;
+    char buf [ PATH_MAX ] = "";
+
+    if ( KConfigRead ( self, "NCBI_HOME", 0,
+            buf, sizeof buf, & num_read, & remaining) == 0 )
+    {
+        DBGMSG( DBG_KFG, DBG_FLAG ( DBG_KFG ),
+            ( "KFG: NCBI_HOME='%.*s'\n", num_read, buf ) );
+    }
+    else {
+        if ( ncbi_home == NULL ) {
+            if ( ks -> envrNcbiHome != NULL ) {
+                ncbi_home = ks -> envrNcbiHome;
+            }
+            else {
+                ncbi_home = ks -> dfltNcbiHome;
+            }
+        }
+
+        update_node ( self, "NCBI_HOME", ncbi_home, false );
+
+        DBGMSG ( DBG_KFG, DBG_FLAG ( DBG_KFG ),
+            ( "KFG: NCBI_HOME     was set to '%s'\n", ncbi_home ) );
+    }
+}
+
+static
+void _KConfigSetNcbiSettings ( KConfig * self, const KfgSettings * ks,
+    const char * ncbi_settings )
+{
+    size_t num_read = 0;
+    size_t remaining = 0;
+    char buf [ PATH_MAX ] = "";
+
+    if ( KConfigRead ( self, "NCBI_SETTINGS", 0,
+            buf, sizeof buf, & num_read, & remaining) == 0 )
+    {
+        DBGMSG( DBG_KFG, DBG_FLAG ( DBG_KFG ),
+            ( "KFG: NCBI_SETTINGS='%.*s'\n", num_read, buf ) );
+    }
+    else {
+        if ( ncbi_settings == NULL ) {
+            if ( ks -> envrNcbiSettings [ 0 ] != '\0' ) {
+                ncbi_settings = ks -> envrNcbiSettings;
+            }
+            else {
+                ncbi_settings = ks -> dfltNcbiSettings;
+            }
+        }
+
+        update_node ( self, "NCBI_SETTINGS", ncbi_settings, false );
+        DBGMSG ( DBG_KFG, DBG_FLAG ( DBG_KFG ),
+            ( "KFG: NCBI_SETTINGS was set to '%s'\n", ncbi_settings ) );
+    }
+}
+/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ KfgSettings ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
+
+static
+bool CC WriteDirtyNode ( BSTNode *n, void *data )
+{
+    KConfigNode *self = ( KConfigNode * ) n;
+    PrintBuff *pb = data;
+
+    if ( self -> dirty
+        || ( self -> came_from != NULL && self -> came_from -> is_magic_file
+             && ! self -> internal ) )
+    {
+        if ( KConfigNodePrintPath ( self, pb ) )
+            return true;
+
+        if ( PrintBuffPrint ( pb, " = " ) != 0 )
+            return true;
+
+        if ( PrintBuffPrintQuoted ( pb, &self->value ) != 0 )
+            return true;
+
+        if ( PrintBuffPrint ( pb, "\n" ) != 0 )
+            return true;
+    }
+
+    return BSTreeDoUntil ( & self -> children, false, WriteDirtyNode, pb );
+}
+
+static
+void CC UnsetDirtyNode ( BSTNode *n, void *data )
+{
+    KConfigNode *self = ( KConfigNode * ) n;
+
+    if ( self -> dirty )
+        self -> dirty = false;
+
+    BSTreeForEach ( & self -> children, false, UnsetDirtyNode, data );
+}
+
+static
+rc_t path_to_magic_file ( const KConfig *self, char *path, size_t buffer_size, size_t *path_size )
+{
+    const KConfigNode *node;
+    rc_t rc = KConfigOpenNodeRead ( self, & node, "NCBI_SETTINGS" );
+
+    if ( rc == 0 )
+    {
+        size_t num_read, remaining;
+        rc = KConfigNodeRead ( node, 0, path, buffer_size - 1, & num_read, & remaining );
+
+        if ( rc == 0 && remaining != 0 )
+           rc = RC ( rcKFG, rcNode, rcReading, rcBuffer, rcInsufficient );
+
+        path[num_read] = '\0';
+
+        KConfigNodeRelease ( node );
+    }
+    return rc;
+}
+
+/* Commit
+ *  commits changes to user's private configuration file
+ */
+LIB_EXPORT rc_t CC KConfigCommit ( KConfig *self )
+{
+    rc_t rc;
+    size_t path_size;
+    char magic_file_path [ 4096 ];
+
+    if ( self == NULL )
+        return RC ( rcKFG, rcData, rcCommitting, rcSelf, rcNull );
+
+    /* Must only commit dirty nodes*/
+    if ( ! self -> dirty )
+        return 0;
+
+    rc = path_to_magic_file ( self, magic_file_path, sizeof magic_file_path, & path_size );
+    if ( rc == 0 )
+    {
+        char tmp_file_path [ 4096 ];
+
+        if ( ! MayICommitTo ( self, magic_file_path, path_size ) ) {
+            DBGMSG ( DBG_KFG, DBG_FLAG ( DBG_KFG ), (
+                "KFG: User Settings Are Disables: Skipped KConfigCommit\n" ) );
+            return RC ( rcKFG, rcData, rcCommitting, rcSelf, rcReadonly );
+        }
+
+        DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG),
+            ( "KFG: Committing to '%s'\n", magic_file_path ) );
+        rc = string_printf ( tmp_file_path, sizeof tmp_file_path, NULL, "%s.tmp", magic_file_path );
+        if ( rc == 0 )
+        {
+            KDirectory *dir;
+
+            /* get current directory */
+            rc = KDirectoryNativeDir ( & dir );
+            if ( rc == 0 )
+            {
+                KFile *tmp;
+
+                /* create temp magic file */
+                rc = KDirectoryCreateFile ( dir, & tmp, false, 0600, kcmInit | kcmParents, "%s", tmp_file_path );
+
+                if ( rc == 0 )
+                {
+                    PrintBuff pb;
+                    PrintBuffInit ( & pb, tmp );
+
+                    /* issue warning */
+                    rc = PrintBuffPrint ( & pb, "## auto-generated configuration file - DO NOT EDIT ##\n\n" );
+                    if ( rc == 0 )
+                    {
+                        /* flush nodes to file */
+                        if ( BSTreeDoUntil ( & self -> tree, false, WriteDirtyNode, & pb ) )
+                            /* failure */
+                            rc = pb . rc;
+                        else
+                            rc = PrintBuffFlush ( & pb );
+                    }
+
+                    KFileRelease ( tmp );
+
+                    if ( rc == 0 )
+                    {
+                        /* Rename file */
+                        rc = KDirectoryRename ( dir, true, tmp_file_path, magic_file_path  );
+                        if ( rc == 0 )
+                        {
+                            /* clear dirty flags */
+                            BSTreeForEach (  & self -> tree, false, UnsetDirtyNode, & pb);
+
+                            self -> dirty = false;
+                        }
+                    }
+
+                    if ( rc != 0 )
+                        KDirectoryRemove ( dir, true, "%s", tmp_file_path );
+                }
+
+                /* release dir */
+                KDirectoryRelease ( dir );
+            }
+        }
+    }
+    return rc;
+}
+
+static
+rc_t record_magic_path ( KConfig *self, const KDirectory *dir, const char *path, size_t sz )
+{
+    char buff [ 4096 ];
+    rc_t rc = KDirectoryResolvePath ( dir, true, buff, sizeof buff, "%.*s", ( int ) sz, path );
+    if ( rc == 0 )
+    {
+        char *magic_file_path;
+        sz = string_size ( buff );
+        magic_file_path = malloc ( sz + 1 );
+        if ( magic_file_path == NULL )
+            rc = RC ( rcKFG, rcMgr, rcLoading, rcMemory, rcExhausted );
+        else
+        {
+            free ( (void*) self -> magic_file_path );
+            self -> magic_file_path = magic_file_path;
+            self -> magic_file_path_size = sz;
+            memmove ( magic_file_path, buff, sz + 1 );
+        }
+    }
+
+    return rc;
+}
+
+
+static
+rc_t make_include_path ( KConfigIncluded **p, const KDirectory *dir, const char *path, size_t sz, bool is_magic )
+{
+    char buff [ 4096 ];
+    rc_t rc = KDirectoryResolvePath ( dir, true, buff, sizeof buff, "%.*s", ( int ) sz, path );
+    if ( rc == 0 )
+    {
+        KConfigIncluded *include;
+        sz = string_size ( buff );
+        include = malloc ( sizeof * include + sz );
+        if ( include == NULL )
+            rc = RC ( rcKFG, rcMgr, rcLoading, rcMemory, rcExhausted );
+        else
+        {
+            include -> is_magic_file = is_magic;
+            string_copy ( include -> path, sz + sizeof include -> path, buff, sz );
+            * p = include;
+            return 0;
+        }
+    }
+    * p = NULL;
+    return rc;
+}
+
+
+static
+bool load_from_file_path ( KConfig *self, const KDirectory *dir, const char *path, size_t sz, bool is_magic )
+{
+    rc_t rc;
+    const KFile *cfg_file;
+
+    /* record magic file path, regardless of whether it exists as a file */
+    if ( is_magic )
+        record_magic_path ( self, dir, path, sz );
+
+    DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: try to load from file '%.*s'\n", (int)sz, path ) );
+    rc = KDirectoryOpenFileRead ( dir, & cfg_file, "%.*s", ( int ) sz, path );
+    if ( rc == 0 )
+    {
+        KConfigIncluded *include;
+        rc = make_include_path ( & include, dir, path, sz, is_magic );
+        if ( rc == 0 )
+        {
+            BSTNode *existing;
+            if ( BSTreeInsertUnique ( & self -> included, & include -> n, & existing, KConfigIncludedSort ) != 0 )
+                free ( include );
+            else
+            {
+                self -> current_file = include;
+                rc = KConfigLoadFile ( self, include -> path, cfg_file );
+                self -> current_file = NULL;
+                if ( rc != 0 )
+                {
+                    BSTreeUnlink ( & self -> included, & include -> n );
+                    free ( include );
+                }
+            }
+        }
+
+        KFileRelease ( cfg_file );
+    }
+    return ( rc == 0 ) ? true : false;
+}
+
+typedef struct scan_config_path_data scan_config_path_data;
+struct scan_config_path_data
+{
+    KConfig *self;
+    bool loaded;
+};
+
+static
+rc_t CC scan_config_path ( const KDirectory *dir, uint32_t type, const char *name, void *data )
+{
+    scan_config_path_data * pb = data;
+    switch ( type )
+    {
+    case kptFile:
+    case kptFile | kptAlias:
+    {
+        size_t sz = string_size ( name );
+        if ( sz >= 5 && strcase_cmp ( & name [ sz - 4 ], 4, ".kfg", 4, 4 ) == 0 )
+            pb -> loaded |= load_from_file_path ( pb -> self, dir, name, sz, false );
+
+        break;
+    }}
+
+    return 0;
+}
+
+static
+bool scan_config_dir ( KConfig *self, const KDirectory *dir )
+{
+    scan_config_path_data pb;
+
+    pb . self = self;
+    pb . loaded = false;
+
+    KDirectoryVVisit ( dir, false, scan_config_path, & pb, ".", NULL );
+
+    return pb . loaded;
+}
+
+static
+bool load_from_dir_path ( KConfig *self, const KDirectory *dir, const char *path, size_t sz )
+{
+    bool loaded = false;
+    const KDirectory *cfg_dir;
+    rc_t rc = KDirectoryOpenDirRead ( dir, & cfg_dir, false, "%.*s", ( uint32_t ) sz, path );
+    if ( rc == 0 )
+    {
+        DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: try to load from directory '%.*s'\n", (int)sz, path ) );
+        loaded = scan_config_dir ( self, cfg_dir );
+        KDirectoryRelease ( cfg_dir );
+    }
+    return loaded;
+}
+
+static
+bool load_from_path ( KConfig *self, const KDirectory * dir, const char *path, size_t sz )
+{
+    bool loaded = false;
+    const char *naughty = string_chr ( path, sz, '%' );
+    if ( naughty == NULL && sz != 0 )
+    {
+        DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: try to load from path '%.*s'\n", (int)sz, path ) );
+        switch ( KDirectoryPathType ( dir, "%.*s", ( int ) sz, path ) & ~ kptAlias )
+        {
+        case kptFile:
+            loaded = load_from_file_path ( self, dir, path, sz, false );
+            break;
+        case kptDir:
+            loaded = load_from_dir_path ( self, dir, path, sz );
+            break;
+        }
+    }
+    return loaded;
+}
+
+static
+bool load_from_path_list ( KConfig *self, const KDirectory *dir, const char *path )
+{
+    bool loaded = false;
+    const char *end = path + string_size ( path );
+    while ( path < end )
+    {
+        const char *sep = string_chr ( path, end - path, ':' );
+        if ( sep == NULL )
+            sep = end;
+        if ( load_from_path ( self, dir, path, sep - path ) )
+            loaded = true;
+        path = sep + 1;
+    }
+    return loaded;
+}
+
+static
+bool load_from_env_variable ( KConfig *self, const KDirectory *dir )
+{
+    const char * env_list [] =
+    {
+        "KLIB_CONFIG",
+        "VDB_CONFIG",
+        "VDBCONFIG"
+    };
+
+    int i;
+    bool loaded = false;
+    for ( i = 0; ! loaded && i < sizeof env_list / sizeof env_list [ 0 ]; ++ i )
+    {
+        const char *eval = getenv ( env_list [ i ] );
+        DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: try to load from env. var '%s'\n", env_list[ i ] ) );
+        if ( eval != NULL && eval [ 0 ] != 0 )
+        {
+            /* rc_t rc = 0; */
+            DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: try to load from env. var '%s'\n", eval ) );
+            /* rc = */ KConfigAppendToLoadPath(self, eval);
+            loaded = load_from_path_list ( self, dir, eval );
+            if ( loaded )
+                DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: found from env. var '%s'\n", eval ) );
+        }
+    }
+
+    return loaded;
+}
+
+static
+rc_t load_env_variable_rc ( KConfig *self, const KDirectory *dir, bool *loaded )
+{
+    const char * env_list [] =
+    {
+        "NCBI_VDB_CONFIG"
+    };
+
+    int i;
+    rc_t rc;
+
+    * loaded = false;
+
+    for ( i = 0; ! * loaded && i < sizeof env_list / sizeof env_list [ 0 ]; ++ i )
+    {
+        const char *eval = getenv ( env_list [ i ] );
+        DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: try to load from env. var '%s'\n", env_list[ i ] ) );
+        if ( eval == NULL || eval [ 0 ] == 0 )
+            return 0;
+
+        DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: try to load from env. var '%s'\n", eval ) );
+        rc = KConfigAppendToLoadPath(self, eval);
+        if ( rc != 0 )
+            return rc;
+
+        * loaded = load_from_path_list ( self, dir, eval );
+        if ( * loaded )
+            DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: found from env. var '%s'\n", eval ) );
+        else
+            return RC ( rcKFG, rcFile, rcListing, rcEnvironment, rcEmpty );
+
+    }
+
+    return 0;
+}
+
+static
+bool load_from_std_location ( KConfig *self, const KDirectory *dir )
+{
+    const char * std_locs [] =
+    {
+#if ! WINDOWS
+        "/etc/ncbi",
+#else
+        "/c/ncbi",
+#endif
+    };
+
+    /* rc_t rc = 0; */
+
+    int i;
+    bool loaded = false;
+    for ( i = 0; ! loaded && i < sizeof std_locs / sizeof std_locs [ 0 ]; ++ i )
+    {
+        DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: try to load from std. location '%s'\n", std_locs[ i ] ) );
+        /* rc = */ KConfigAppendToLoadPath(self, std_locs [ i ]);
+        loaded = load_from_path ( self, dir,
+            std_locs [ i ], string_size ( std_locs [ i ] ));
+    }
+    if ( loaded )
+        DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: found from std. location\n" ) );
+    return loaded;
+}
+
+static
+bool load_from_fs_location ( KConfig *self )
+{
+    bool loaded = false;
+    KDyld *dyld;
+    rc_t rc = KDyldMake ( & dyld );
+    if ( rc == 0 )
+    {
+        const KDirectory *dir;
+        rc = find_home_directory ( dyld, & dir, false );
+        if ( rc == 0 )
+        {
+            char resolved[PATH_MAX + 1];
+            DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: try to load from dyn. loader\n" ) );
+
+/* N.B. Duplication of ResolvePath here and in load_from_dir_path ? */
+            if (KDirectoryResolvePath
+                    (dir, true, resolved, sizeof resolved, "ncbi") == 0)
+            {
+                rc = KConfigAppendToLoadPath(self, resolved);
+            }
+            if ((loaded = load_from_dir_path(self, dir, "ncbi", 4)))
+                DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: found from dyn. loader\n" ) );
+            KDirectoryRelease ( dir );
+        }
+        KDyldRelease ( dyld );
+    }
+    return loaded;
+}
+
+static bool load_from_default_string(KConfig *self) {
+    DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG), ("KFG: loading from default string\n"));
+    return parse_file(self,
+        "enbedded default configuration string", default_kfg) == 0;
+}
+
+LIB_EXPORT rc_t CC KConfigGetLoadPath ( const KConfig *self,
+    const char **path )
+{
+    if (self == NULL) {
+        return RC ( rcKFG, rcPath, rcListing, rcSelf, rcNull );
+    }
+
+    if (path == NULL) {
+        return RC ( rcKFG, rcPath, rcListing, rcParam, rcNull );
+    }
+
+    *path = self->load_path;
+    return 0;
+}
+
+static
+bool load_user_settings
+    ( KConfig * self, const KDirectory * dir, const char * path )
+{
+    return load_from_file_path
+        (self, dir, path, string_measure ( path, NULL ), true );
+}
+
+static
+bool load_from_home ( KConfig * self, const KDirectory * dir,
+    const KfgSettings * ks, char * ncbi_settings, size_t ncbi_settings_size)
+{
+    char ncbi_home [ PATH_MAX ] = "";
+
+    DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: checking NCBI_HOME\n" ) );
+
+    if ( _KConfigGetNcbiHome ( self, ks, ncbi_home, sizeof ncbi_home ) != 0 )
+    {
+        DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG),
+            ("KFG: cannot read NCBI_HOME from configuration\n"));
+        return false;
+    }
+    else {
+        bool loaded =
+            load_from_path ( self, dir, ncbi_home, string_size ( ncbi_home ) );
+
+        if ( loaded )
+        {
+            DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG),
+                ( "KFG: found from '%s'\n", ncbi_home ) );
+        }
+
+        _KConfigGetNcbiSettings
+            ( self, ks, ncbi_settings, ncbi_settings_size, NULL );
+
+        if ( load_user_settings ( self, dir, ncbi_settings ))
+            loaded = true;
+
+        _KConfigSetNcbiHome    ( self, ks, ncbi_home );
+        _KConfigSetNcbiSettings( self, ks, ncbi_settings );
+
+        return loaded;
+    }
+}
+
+static
+rc_t load_config_files ( KConfig * self,
+    const KDirectory * dir, const KfgSettings * ks, bool * loaded_from_dir )
+{
+    rc_t rc;
+    bool loaded;
+    KDirectory * wd;
+
+    char ncbi_settings [ PATH_MAX ] = "";
+
+    assert ( loaded_from_dir );
+    * loaded_from_dir = false;
+
+    /* if user supplied a starting point, try that */
+    if ( dir != NULL )
+    {
+        char path [ PATH_MAX ] = "";
+        rc = KDirectoryResolvePath ( dir, true, path, sizeof path, "." );
+        DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG),
+            ( "KFG: try load from supplied directory '%s'\n", path ) );
+
+        loaded = scan_config_dir ( self, dir );
+        if ( loaded )
+            DBGMSG( DBG_KFG, DBG_FLAG(DBG_KFG), ( "KFG: found from supplied directory\n" ) );
+
+        rc = _KConfigGetNcbiSettings
+            ( self, ks, ncbi_settings, sizeof ncbi_settings, path );
+        if (rc == 0) {
+            if ( load_user_settings ( self, dir, ncbi_settings ))
+                loaded = true;
+        }
+
+        if ( loaded ) {
+            _KConfigSetNcbiHome    ( self, ks, path );
+            _KConfigSetNcbiSettings( self, ks, ncbi_settings );
+            * loaded_from_dir = true;
+            return rc;
+        }
+    }
+
+    /* open up the native directory */
+    rc = KDirectoryNativeDir ( & wd );
+    if ( rc != 0 )
+        return rc;
+
+    /* try to load from environment variable */
+    rc = load_env_variable_rc ( self, wd, & loaded );
+    if ( rc != 0 )
+        return rc;
+    if ( loaded )
+        return 0;
+
+    /* load from the other environment variables */
+    loaded = load_from_env_variable ( self, wd );
+
+    /* try to load from standard locations */
+    if ( ! loaded )
+        loaded = load_from_std_location ( self, wd );
+
+    /* check for config as the result of a user install
+       i.e. not an admin installation */
+    if ( ! loaded )
+        loaded = load_from_fs_location ( self );
+
+    if ( ! loaded )
+        loaded = load_from_default_string ( self );
+
+    if ( ! s_disable_user_settings )
+        loaded |= load_from_home
+            ( self, wd, ks, ncbi_settings, sizeof ncbi_settings );
+    else {
+        DBGMSG ( DBG_KFG, DBG_FLAG ( DBG_KFG ), (
+            "KFG: User Settings Are Disables: Skipped Load KFG From Home\n" ) );
+        _KConfigSetNcbiHome    ( self, ks, NULL );
+        _KConfigSetNcbiSettings( self, ks, NULL );
+    }
+
+    KDirectoryRelease ( wd );
+
+    if (self->load_path) {
+        char* tmp = NULL;
+        self->load_path_sz_tmp = string_size(self->load_path) + 1;
+        tmp = realloc(self->load_path, self->load_path_sz_tmp);
+        if (tmp) {
+            self->load_path = tmp;
+        }
+    }
+
+    return 0;
+}
+
+static
+void add_predefined_nodes ( KConfig * self, const char * appname )
+{
+    size_t bytes;
+    char buf [ 4096 ];
+    const char *value;
+
+    KDirectory *cwd;
+    const KDirectory *dir;
+
+#if ! WINDOWS
+    struct utsname name;
+#endif
+
+    /* Path to libkfg.so */
+    KDyld *dyld;
+    rc_t rc = KDyldMake ( & dyld );
+    if ( rc == 0 )
+    {
+        rc = find_home_directory ( dyld, & dir, false );
+        if ( rc == 0 )
+        {
+            KDirectoryResolvePath ( dir, true, buf, sizeof buf, "." );
+            KDirectoryRelease ( dir );
+        }
+        KDyldRelease ( dyld );
+    }
+    update_node ( self, "vdb/lib/paths/kfg", rc == 0 ? buf : "", true );
+
+    /* Architecture */
+#if ! WINDOWS
+    if (uname(&name) >= 0)
+        update_node(self, "kfg/arch/name", name.nodename, true);
+    else
+#endif
+        update_node ( self, "kfg/arch/name", "", true);
+
+    string_printf(buf, sizeof(buf), &bytes, "%u", _ARCH_BITS);
+    update_node ( self, "kfg/arch/bits", buf, true );
+
+    /* *OS */
+#if LINUX
+    #define OS "linux"
+#elif MAC
+    #define OS "mac"
+#elif WINDOWS
+    #define OS "win"
+#elif SUN
+    #define OS "sun"
+#else
+    #error unrecognized OS
+#endif
+    update_node ( self, "OS", OS, true );
+#undef OS
+
+#if 0
+    /* BUILD_LINKAGE */
+#if _STATIC
+    #define BUILD_LINKAGE "STATIC"
+#else
+    #define BUILD_LINKAGE "DYNAMIC"
+#endif
+    update_node ( self, "BUILD_LINKAGE", BUILD_LINKAGE, true );
+#undef BUILD_LINKAGE
+#endif
+
+    /* BUILD */
+#if _PROFILING
+    #define BUILD "PROFILE"
+#elif _DEBUGGING
+    #define BUILD "DEBUG"
+#else
+    #define BUILD "RELEASE"
+#endif
+    update_node(self, "BUILD", BUILD, true );
+#undef BUILD
+
+    cwd = NULL;
+
+    /* PWD */
+    rc = KDirectoryNativeDir ( & cwd );
+    if ( rc == 0 )
+        rc = KDirectoryResolvePath ( cwd, true, buf, sizeof buf, "." );
+    update_node(self, "PWD", rc == 0 ? buf : "", true );
+
+    /* APPPATH */
+    if ( appname != NULL && rc == 0 )
+    {
+        bytes = string_size ( appname );
+        value = string_rchr ( appname, bytes, '/' );
+        if ( value == NULL )
+            value = string_rchr ( appname, bytes, '\\' );
+        if ( value != NULL )
+            bytes = appname + bytes - value;
+        rc = KDirectoryResolvePath ( cwd, true, buf, sizeof buf, "%s", appname);
+        if ( rc == 0 && bytes != 0 )
+            buf [ string_size(buf) - bytes ] = 0;
+        update_node(self, "APPPATH", rc == 0 ? buf : "", true );
+    }
+
+    /* APPNAME */
+    rc = LogAppName(buf, sizeof(buf), &bytes);
+    if ( rc == 0 )
+        buf [ bytes ] = 0;
+    update_node(self, "APPNAME", rc == 0 ? buf : "", true );
+
+    /* Environment variables */
+    /* some of the variables may be undefined, create nodes with empty values for them */
+#define DEFINE_ENV(name)                                         \
+    value=getenv(name);                                          \
+    update_node(self, name, value == NULL ? "" : value, true )
+
+    DEFINE_ENV("HOST");
+    DEFINE_ENV("USER");
+
+    value = NULL;
+#if WINDOWS
+    value = getenv ( "USERPROFILE" );
+#endif
+    if ( value == NULL ) {
+        value = getenv ( "HOME" );
+    }
+
+    if (value == NULL)
+    {
+        update_node(self, "HOME", "", true );
+    }
+    else
+    {
+        rc = KDirectoryResolvePath(cwd, true, buf, sizeof(buf), "%s", value);
+        if (rc == 0)
+        {
+            update_node(self, "HOME", buf, true );
+        }
+        else
+            LOGERR (klogErr, rc, "Unable to create a config item for $HOME");
+    }
+
+    DEFINE_ENV("VDB_ROOT");
+    DEFINE_ENV("VDB_CONFIG");
+#undef DEFINE_ENV
+
+    KDirectoryRelease ( cwd );
+}
+
+#if WINDOWS
+
+static isexistingdir(const char *path, const KDirectory *dir) {
+    return (KDirectoryPathType(dir, path) & ~kptAlias) == kptDir;
+}
+
+static bool isletter(char c) {
+    return ((c >= 'A' && c <= 'Z') ||
+            (c >= 'a' && c <= 'z'));
+}
+
+static bool sls(const char *b, size_t sz) {
+    if (b == NULL || sz < 3) {
+        return false;
+    }
+
+    return (b[0] == '/' && isletter(b[1]) && b[2] == '/');
+}
+
+static bool _DetectRepeatedDrives(const char *buffer,
+    size_t bsize, size_t *fixed, const KDirectory *dir)
+{
+    assert(fixed);
+
+    if (!sls(buffer, bsize)) {
+        return false;
+    }
+
+    if (!sls(buffer + 2, bsize - 2)) {
+        return false;
+    }
+
+    if (isexistingdir(buffer, dir)) {
+        return false;
+    }
+
+    *fixed = 2;
+
+    while (bsize > *fixed + 2) {
+        if (isexistingdir(buffer + *fixed, dir)) {
+            break;
+        }
+
+        if (!sls(buffer + *fixed + 2, bsize - *fixed - 2)) {
+            break;
+        }
+
+        *fixed += 2;
+    }
+
+    return true;
+}
+
+static rc_t _KConfigNodeFixRepeatedDrives(KConfigNode *self,
+    bool *updated, const KDirectory *dir)
+{
+    rc_t rc = 0;
+
+    char buffer[PATH_MAX];
+    size_t num_read = 0;
+    size_t remaining = 0;
+
+    assert(updated);
+
+    rc = KConfigNodeRead(self, 0, buffer, sizeof buffer, &num_read, &remaining);
+    if (rc == 0) {
+        size_t fixed = 0;
+        if (num_read < sizeof buffer) {
+            buffer[num_read] = '\0';
+        }
+        if (_DetectRepeatedDrives(buffer, num_read, &fixed, dir)
+            && fixed != 0 && fixed < num_read)
+        {
+            rc = KConfigNodeWrite(self, buffer + fixed, num_read - fixed);
+            if (rc == 0) {
+                *updated = true;
+            }
+        }
+    }
+
+    return rc;
+}
+
+static rc_t _KConfigNodeFixChildRepeatedDrives(KConfigNode *self,
+    const KDirectory *dir, bool *updated, const char *name, ...)
+{
+    rc_t rc = 0;
+    KConfigNode *node = NULL;
+
+    va_list args;
+    va_start(args, name);
+
+    rc = KConfigNodeVOpenNodeUpdate(self, &node, name, args);
+    if (rc == 0) {
+        rc_t rc = _KConfigNodeFixRepeatedDrives(node, updated, dir);
+        KConfigNodeRelease(node);
+    }
+
+    va_end(args);
+
+    return rc;
+}
+
+static rc_t _KConfigFixRepeatedDrives(KConfig *self,
+    const KDirectory *pdir, bool *updated)
+{
+    rc_t rc = 0;
+    const KDirectory *dir = pdir;
+    KConfigNode *user = NULL;
+    if (dir == NULL) {
+        rc = KDirectoryNativeDir(&dir);
+    }
+    rc = KConfigOpenNodeUpdate(self, &user, "/repository/user");
+    if (rc == 0) {
+        _KConfigNodeFixChildRepeatedDrives(user, dir, updated, "default-path");
+    }
+    if (rc == 0) {
+        uint32_t i = 0;
+        uint32_t count = 0;
+        KNamelist *categories = NULL;
+        rc_t rc = KConfigNodeListChildren(user, &categories);
+        if (rc == 0) {     /* main protected ... */
+            rc = KNamelistCount(categories, &count);
+        }
+        for (i = 0; rc == 0 && i < count; ++i) {
+            const char *nCategory = NULL;
+            rc_t rc = KNamelistGet(categories, i, &nCategory);
+            if (rc == 0) { /* main protected ... */
+                KConfigNode *category = NULL;
+                rc_t rc = KConfigNodeOpenNodeUpdate(user, &category, nCategory);
+                if (rc == 0) {
+                    uint32_t i = 0;
+                    uint32_t count = 0;
+                    KNamelist *subcategories = NULL;
+                    rc_t rc = KConfigNodeListChildren(category, &subcategories);
+                    if (rc == 0) {     /* main protected ... */
+                        rc = KNamelistCount(subcategories, &count);
+                    }
+                    for (i = 0; rc == 0 && i < count; ++i) {
+                        const char *name = NULL;
+                        rc_t rc = KNamelistGet(subcategories, i, &name);
+                        if (rc == 0) {
+                            _KConfigNodeFixChildRepeatedDrives(category,
+                                dir, updated, "%s/%s", name, "root");
+                        }
+                    }
+                    RELEASE(KNamelist, subcategories);
+                    RELEASE(KConfigNode, category);
+                }
+            }
+        }
+        RELEASE(KNamelist, categories);
+    }
+    RELEASE(KConfigNode, user);
+    if (pdir == NULL) {
+        RELEASE(KDirectory, dir);
+    }
+    return rc;
+}
+
+#endif
+
+static
+rc_t KConfigFill ( KConfig * self, const KDirectory * cfgdir,
+    const char * appname, bool local )
+{
+    KConfigNode * root;
+    String empty;
+    rc_t rc;
+
+    CONST_STRING ( & empty, "" );
+
+    rc = KConfigNodeMake ( & root, & empty );
+    if (rc == 0)
+    {
+        bool loaded_from_dir = false;
+
+        KfgSettings ks;
+
+        KConfigInit ( self, root );
+
+        add_predefined_nodes ( self, appname );
+
+        _KConfigIniKfgSettings ( self, &ks );
+
+        add_aws_nodes ( self );
+
+        if ( ! self -> disableFileLoadOnKfgCreating )
+            rc = load_config_files ( self, cfgdir, & ks, & loaded_from_dir );
+
+        if ( rc == 0 ) {
+         /* commit changes made to magic file nodes
+            during parsing (e.g. fixed spelling of dbGaP names) */
+            KConfigCommit ( self );
+        }
+    }
+
+    return rc;
+}
+
+
+extern rc_t ReportKfg ( const ReportFuncs *f, uint32_t indent,
+    uint32_t configNodesSkipCount, va_list args );
+
+/* "cfg" [ OUT ] - return parameter for mgr
+   if ( "local" == true ) do not initialize G_kfg
+   if ( cfgdir != NULL ) then initialize G_kfg. It is used in unit tests */
+static
+rc_t KConfigMakeImpl ( KConfig ** cfg, const KDirectory * cfgdir, bool local,
+    bool disableFileLoadOnKfgCreating )
+{
+    rc_t rc;
+    static const char * appname = NULL;
+
+    static bool latch;
+    if ( ! latch )
+    {
+        appname = ReportInitConfig ( ReportKfg );
+        latch = true;
+    }
+
+    if ( cfg == NULL )
+        rc = RC ( rcKFG, rcMgr, rcCreating, rcParam, rcNull );
+    else
+    {
+        KConfig * mgr = NULL;
+
+        if ( cfgdir != NULL ) {
+            /* local = true; 
+            ALWAYS create and/or return a singleton object. */
+        }
+
+        if ( ! local ) {
+            if ( G_kfg . ptr ) { /* if already made, just attach */
+                rc = KConfigAddRef ( G_kfg.ptr );
+                if (rc == 0) {
+                    * cfg = G_kfg . ptr;
+                }
+                return rc;
+            }
+        }
+
+        mgr = calloc ( 1, sizeof * mgr );
+        if ( mgr == NULL )
+            rc = RC ( rcKFG, rcMgr, rcCreating, rcMemory, rcExhausted );
+        else
+        {
+            mgr -> disableFileLoadOnKfgCreating = disableFileLoadOnKfgCreating;
+            rc = KConfigFill (mgr, cfgdir, appname, local);
+
+            mgr -> initialized = true;
+
+
+#if WINDOWS /* VDB-1554: fix incorrect posix paths in configuration nodes */
+            if ( rc == 0 ) {
+                bool updated = false;
+                rc_t rc = _KConfigFixRepeatedDrives ( mgr, cfgdir, & updated );
+                if ( rc == 0 && updated ) {
+                    rc = KConfigCommit ( mgr );
+                }
+            }
+#endif
+
+            DBGMSG ( DBG_KFG, DBG_FLAG ( DBG_KFG ), ( "\n" ) );
+
+            if ( rc == 0 )
+            {
+                if ( ! local ) {
+                    atomic_test_and_set_ptr ( & G_kfg, mgr, NULL );
+                }
+                * cfg = mgr;
+                return 0;
+            }
+
+            KConfigWhack ( mgr );
+        }
+
+        * cfg = NULL;
+    }
+
+    return rc;
+}
+
+/* Make
+ *  create a process-global configuration manager
+ *
+ *  "cfg" [ OUT ] - return parameter for mgr
+ */
+LIB_EXPORT rc_t CC KConfigMake(KConfig **cfg, const KDirectory *cfgdir)
+{
+    return KConfigMakeImpl(cfg, cfgdir, false, false);
+}
+
+/* call KConfigMake; do not initialize G_kfg */
+LIB_EXPORT
+rc_t CC KConfigMakeLocal(KConfig **cfg, const KDirectory *cfgdir)
+{
+    return KConfigMakeImpl(cfg, cfgdir, true, false);
+}
+
+/* call KConfigMake; do not load any file except user settings ( optionally ) */
+LIB_EXPORT
+rc_t CC KConfigMakeEmpty ( KConfig ** cfg )
+{
+    return KConfigMakeImpl ( cfg, NULL, false, true );
+}
+
+/*--------------------------------------------------------------------------
+ * KNamelist
+ */
+typedef struct KfgConfigNamelist KfgConfigNamelist;
+struct KfgConfigNamelist
+{
+    KNamelist dad;
+    size_t count;
+    const char *namelist [ 1 ];
+};
+
+/* Whack
+ */
+static
+rc_t CC KfgConfigNamelistWhack ( KfgConfigNamelist *self )
+{
+    free ( self );
+    return 0;
+}
+
+/* Count
+ */
+static
+rc_t CC KfgConfigNamelistCount ( const KfgConfigNamelist *self,
+uint32_t *count )
+{
+    * count = ( uint32_t ) self -> count;
+    return 0;
+}
+
+/* Get
+ */
+static
+rc_t CC KfgConfigNamelistGet ( const KfgConfigNamelist *self,
+    uint32_t idx, const char **name )
+{
+    if ( ( size_t ) idx >= self -> count )
+        return RC ( rcDB, rcNamelist, rcAccessing, rcParam, rcInvalid );
+    * name = self -> namelist [ idx ];
+    return 0;
+}
+
+/* Make
+ */
+static KNamelist_vt_v1 vtKfgConfigNamelist =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* start minor version 0 methods */
+    KfgConfigNamelistWhack,
+    KfgConfigNamelistCount,
+    KfgConfigNamelistGet
+    /* end minor version 0 methods */
+};
+
+ static
+ rc_t KfgConfigNamelistMake ( KNamelist **names, uint32_t count )
+ {
+     rc_t rc;
+     KfgConfigNamelist *self = malloc ( sizeof * self -
+         sizeof self -> namelist + count * sizeof self -> namelist [ 0 ] );
+     if ( self == NULL )
+         rc = RC ( rcKFG, rcMetadata, rcListing, rcMemory, rcExhausted );
+     else
+     {
+         self -> count = 0;
+
+         rc = KNamelistInit ( & self -> dad,
+             ( const KNamelist_vt* ) & vtKfgConfigNamelist );
+         if ( rc == 0 )
+         {
+             * names = & self -> dad;
+             return 0;
+         }
+
+         free ( self );
+     }
+
+     return rc;
+ }
+
+/* List
+ *  create metadata node listings
+ */
+static
+void CC BSTNodeCount ( BSTNode *n, void *data )
+{
+    * ( uint32_t* ) data += 1;
+}
+
+static
+void CC KConfigNodeGrabName ( BSTNode *n, void *data )
+{
+    KfgConfigNamelist *list = data;
+    list -> namelist [ list -> count ++ ]
+        = ( ( const KConfigNode* ) n ) -> name . addr;
+}
+
+/* ListChildren
+ *  list all named children
+ */
+LIB_EXPORT rc_t CC KConfigNodeListChildren ( const KConfigNode *self,
+    KNamelist **names )
+{
+    if ( names == NULL )
+        return RC ( rcKFG, rcNode, rcListing, rcParam, rcNull );
+
+    * names = NULL;
+
+    if ( self != NULL )
+    {
+        rc_t rc;
+
+        uint32_t count = 0;
+        BSTreeForEach ( & self -> children, 0, BSTNodeCount, & count );
+
+        rc = KfgConfigNamelistMake ( names, count );
+        if ( rc == 0 )
+            BSTreeForEach
+                ( & self -> children, 0, KConfigNodeGrabName, * names );
+
+        return rc;
+    }
+
+    return RC ( rcKFG, rcNode, rcListing, rcSelf, rcNull );
+}
+
+static
+void CC KConfigGrabName ( BSTNode *n, void *data )
+{
+    KfgConfigNamelist *list = data;
+    list -> namelist [ list -> count ++ ]
+        = ( ( const KConfigIncluded* ) n ) -> path;
+}
+
+/* ListIncluded
+ *  list all included files
+ */
+LIB_EXPORT rc_t CC KConfigListIncluded ( const KConfig *self,
+    KNamelist **names )
+{
+    if ( names == NULL )
+        return RC ( rcKFG, rcMgr, rcListing, rcParam, rcNull );
+
+    * names = NULL;
+
+    if ( self != NULL )
+    {
+        rc_t rc;
+
+        uint32_t count = 0;
+        BSTreeForEach ( & self -> included, 0, BSTNodeCount, & count );
+
+        rc = KfgConfigNamelistMake ( names, count );
+        if ( rc == 0 )
+            BSTreeForEach
+                ( & self -> included, 0, KConfigGrabName, * names );
+
+        return rc;
+    }
+
+    return RC ( rcKFG, rcMgr, rcListing, rcSelf, rcNull );
+}
+
+/************** Internal node-reading helpers *************/
+
+/* ReadNodeValueFixed
+ * copy the node's value into the caller's fixed size buffer and 0-terminate
+ */
+static rc_t ReadNodeValueFixed ( const KConfigNode* self, char *buf, size_t bsize )
+{
+    size_t num_read, remaining;
+    rc_t rc = KConfigNodeRead ( self, 0, buf, bsize - 1, &num_read, &remaining);
+    if (rc == 0)
+    {
+        if (remaining != 0)
+            rc = RC ( rcKFG, rcNode, rcReading, rcBuffer, rcInsufficient );
+        else
+            buf[num_read] = '\0';
+    }
+    return rc;
+}
+
+/**********************************************************/
+
+/* ReadBool
+ *  read a boolean node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (true if "TRUE", false if "FALSE"; rc != 0 if neither)
+ *
+ */
+LIB_EXPORT rc_t CC KConfigNodeReadBool ( const KConfigNode *self, bool *result )
+{
+    rc_t rc;
+
+    if ( result == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        * result = false;
+
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+        else
+        {
+            char buf [ 6 ];
+            rc = ReadNodeValueFixed ( self, buf, sizeof buf );
+            if ( rc == 0 )
+            {
+                switch ( tolower ( buf [ 0 ] ) )
+                {
+                case 'f':
+                    if ( buf [ 1 ] == 0 )
+                        return 0;
+                    if ( strncasecmp ( buf, "false", sizeof buf ) == 0 )
+                        return 0;
+                    break;
+
+                case 'n':
+                    if ( buf [ 1 ] == 0 )
+                        return 0;
+                    if ( strncasecmp ( buf, "no", sizeof buf ) == 0 )
+                        return 0;
+                    break;
+
+                case 't':
+                    * result = true;
+                    if ( buf [ 1 ] == 0 )
+                        return 0;
+                    if ( strncasecmp ( buf, "true", sizeof buf ) == 0 )
+                        return 0;
+                    break;
+
+                case 'y':
+                    * result = true;
+                    if ( buf [ 1 ] == 0 )
+                        return 0;
+                    if ( strncasecmp ( buf, "yes", sizeof buf ) == 0 )
+                        return 0;
+                    break;
+                }
+
+                * result = false;
+                rc = RC ( rcKFG, rcNode, rcReading, rcFormat, rcIncorrect );
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* ReadI64
+ *  read an integer node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+LIB_EXPORT rc_t CC KConfigNodeReadI64 ( const KConfigNode *self, int64_t *result )
+{
+    rc_t rc;
+
+    if ( result == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        * result = 0;
+
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+        else
+        {
+            /* allow for leading zeros */
+            char buf [ 256 ];
+
+            rc = ReadNodeValueFixed(self, buf, sizeof(buf));
+            if (rc == 0)
+            {
+                char* endptr;
+                int64_t res = strtoi64(buf, &endptr, 0);
+                if ( *endptr == '\0' )
+                    *result = res;
+                else
+                    rc = RC(rcKFG, rcNode, rcReading, rcFormat, rcIncorrect);
+            }
+        }
+    }
+    return rc;
+}
+
+/* ReadU64
+ *  read an unsiged node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+LIB_EXPORT rc_t CC KConfigNodeReadU64 ( const KConfigNode *self, uint64_t* result )
+{
+    rc_t rc;
+
+    if ( result == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        * result = 0;
+
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+        else
+        {
+            /* allow for leading zeros */
+            char buf [ 256 ];
+
+            rc = ReadNodeValueFixed(self, buf, sizeof(buf));
+            if (rc == 0)
+            {
+                char* endptr;
+                int64_t res = strtou64(buf, &endptr, 0);
+                if ( *endptr == '\0' )
+                    *result = res;
+                else
+                    rc = RC(rcKFG, rcNode, rcReading, rcFormat, rcIncorrect);
+            }
+        }
+    }
+    return rc;
+}
+
+/* ReadF64
+ *  read a floating point node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+LIB_EXPORT rc_t CC KConfigNodeReadF64( const KConfigNode *self, double* result )
+{
+    rc_t rc;
+
+    if ( result == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        * result = 0.0;
+
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+        else
+        {
+            /* allow for leading zeros, trailing digits */
+            char buf [ 256 ];
+
+            rc = ReadNodeValueFixed(self, buf, sizeof(buf));
+            if (rc == 0)
+            {
+                char* endptr;
+                double res = strtod(buf, &endptr);
+                if ( *endptr == '\0' )
+                    *result = res;
+                else
+                    rc = RC(rcKFG, rcNode, rcReading, rcFormat, rcIncorrect);
+            }
+        }
+    }
+    return rc;
+}
+
+#if 0
+/*** NB - code needs to be located in VFS ***/
+/* ReadNodeValueFixed
+ * Allocate a character buffer of sufficient size, copy the node's value into it, 0-terminate. Caller deallocates.
+ */
+static rc_t ReadNodeValueVariable( const KConfigNode* self, char** buf )
+{
+    size_t num_read, to_read;
+    /* first we ask about the size to be read */
+    rc_t rc = KConfigNodeRead ( self, 0, NULL, 0, &num_read, &to_read );
+    if ( rc == 0 )
+    {
+        char* value = malloc( to_read + 1 );
+        if ( value )
+        {
+            rc = ReadNodeValueFixed( self, value, to_read + 1 );
+            if ( rc == 0 )
+                *buf = value;
+            else
+                free (value);
+        }
+        else
+            rc = RC( rcKFG, rcNode, rcReading, rcMemory, rcExhausted );
+    }
+    return rc;
+}
+
+/* ReadFloat
+ *  read a VPath node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+LIB_EXPORT rc_t CC KConfigNodeReadVPath ( const KConfigNode *self, struct VPath** result )
+{
+    rc_t rc;
+
+    if ( result == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        * result = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+        else
+        {
+            char* buf;
+            rc = ReadNodeValueVariable ( self, &buf );
+            if ( rc == 0)
+            {
+                rc = VPathMake(result, buf);
+                free(buf);
+            }
+        }
+    }
+    return rc;
+}
+#endif
+
+/* ReadString
+ *  read a String node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+LIB_EXPORT rc_t CC KConfigNodeReadString ( const KConfigNode *self, String** result )
+{
+    rc_t rc;
+
+    if ( result == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        * result = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+        else
+        {
+            size_t num_read, to_read;
+
+            /* first we ask about the size to be read */
+            rc = KConfigNodeRead ( self, 0, NULL, 0, &num_read, &to_read );
+            if ( rc == 0 )
+            {
+                String *value = malloc ( sizeof * value + to_read + 1 );
+                if ( value == NULL )
+                    rc = RC( rcKFG, rcNode, rcReading, rcMemory, rcExhausted );
+                else
+                {
+                    /* initialize in absence of data - assume ASCII */
+                    StringInit ( value, (char*)( value + 1 ), to_read, (uint32_t)to_read );
+
+                    /* read the actual data */
+                    rc = ReadNodeValueFixed(self, (char*)value->addr, to_read + 1);
+                    if ( rc == 0 )
+                    {
+                        /* measure length of data to handle non-ASCII */
+                        value -> len = string_len ( value -> addr, value -> size );
+                        *result = value;
+                    }
+                    else
+                    {
+                        rc = RC(rcKFG, rcNode, rcReading, rcFormat, rcIncorrect);
+                        free ( value );
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfigRead ( const KConfig * self, const char * path,
+    size_t offset, char * buffer, size_t bsize,
+    size_t * num_read, size_t * remaining )
+{
+    const KConfigNode * node = NULL;
+
+    rc_t rc = KConfigOpenNodeRead ( self, & node, "%s", path );
+    if ( rc == 0) {
+        rc_t rc2 = 0;
+
+        rc = KConfigNodeRead
+            ( node, offset, buffer, bsize, num_read, remaining );
+
+        rc2 = KConfigNodeRelease ( node );
+        if ( rc == 0 ) {
+            rc = rc2;
+        }
+    }
+
+    return rc;
+}
+
+/* this macro wraps a call to KConfigNodeGetXXX in a node-accessing
+   code to implement the corresponding KConfigGetXXX function */
+#define NODE_TO_CONFIG_ACCESSOR(fn) \
+    const KConfigNode* node;                                \
+    rc_t rc = KConfigOpenNodeRead ( self, &node, "%s", path );   \
+    if ( rc == 0)                                           \
+    {                                                       \
+        rc_t rc2;                                           \
+        rc = fn(node, result);                              \
+        rc2 = KConfigNodeRelease(node);                     \
+        if (rc == 0)                                        \
+            rc = rc2;                                       \
+    }                                                       \
+    return rc;
+
+/* THESE FUNCTIONS ARE PROTECTED AGAINST BAD "self" AND "path"
+   BY KConfigOpenNodeRead, BUT THE CONVERSION FUNCTIONS ARE NOT */
+LIB_EXPORT rc_t CC KConfigReadBool ( const KConfig* self, const char* path, bool* result )
+{
+    NODE_TO_CONFIG_ACCESSOR(KConfigNodeReadBool);
+}
+LIB_EXPORT rc_t CC KConfigReadI64 ( const KConfig* self, const char* path, int64_t* result )
+{
+    NODE_TO_CONFIG_ACCESSOR(KConfigNodeReadI64);
+}
+LIB_EXPORT rc_t CC KConfigReadU64 ( const KConfig* self, const char* path, uint64_t* result )
+{
+    NODE_TO_CONFIG_ACCESSOR(KConfigNodeReadU64);
+}
+
+LIB_EXPORT rc_t CC KConfigReadF64 ( const KConfig* self, const char* path, double* result )
+{
+    NODE_TO_CONFIG_ACCESSOR(KConfigNodeReadF64);
+}
+
+LIB_EXPORT rc_t CC KConfigReadString ( const KConfig* self, const char* path, struct String** result )
+{
+    NODE_TO_CONFIG_ACCESSOR(KConfigNodeReadString);
+}
+
+#define DISP_RC(rc, msg) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, msg))
+
+LIB_EXPORT rc_t CC KConfigPrintPartial
+    (const KConfig *self, int indent, uint32_t skipCount, va_list args)
+{
+    rc_t rc = 0;
+
+    PrintBuff pb;
+
+    if (rc == 0) {
+        PrintBuffInit(&pb, NULL);
+    }
+
+    if (rc == 0) {
+        rc = KConfigPrintImpl
+            (self, indent, NULL, false, false, &pb, skipCount, args);
+    }
+
+    if (rc == 0) {
+        rc = PrintBuffFlush(&pb);
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfigPrint(const KConfig* self, int indent) {
+    return KConfigPrintPartial(self, indent, 0, NULL);
+}
+
+LIB_EXPORT rc_t CC KConfigToFile(const KConfig* self, KFile *file) {
+    rc_t rc = 0;
+    PrintBuff pb;
+    PrintBuffInit(&pb, file);
+    if (rc == 0) {
+        rc = KConfigPrintImpl(self, 0, NULL, false, true, &pb, 0, NULL);
+    }
+    if (rc == 0) {
+        rc = PrintBuffFlush(&pb);
+    }
+    return rc;
+}
+
+LIB_EXPORT void CC KConfigDisableUserSettings ( void )
+{
+    s_disable_user_settings = true;
+}
+
+static
+rc_t open_file ( const KFile **f, const char *path )
+{
+    /* get current directory */
+    KDirectory *wd;
+    rc_t rc = KDirectoryNativeDir ( & wd );
+    if ( rc == 0 )
+    {
+        rc = KDirectoryOpenFileRead ( wd, f, "%s", path );
+        KDirectoryRelease ( wd );
+    }
+
+    return rc;
+}
+
+/* KFS_EXTERN rc_t CC KFileMakeGzip2ForRead ( struct KFile const **gz, struct KFile const *src );
+#include <stdio.h> aprintf */
+#define aprintf( a, b ) ( ( void ) 0 )
+static
+rc_t decode_ncbi_gap ( KDataBuffer *mem, const KFile *orig )
+{
+    char hdr [ 8 ];
+    size_t num_read;
+    rc_t rc = KFileReadAll ( orig, 0, hdr, sizeof hdr, & num_read );
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+    if ( rc == 0 && num_read == sizeof hdr )
+    {
+        if (memcmp(hdr, "ncbi_gap", sizeof hdr) != 0) {
+            rc = RC(rcKFG, rcFile, rcReading, rcFile, rcWrongType);
+        }
+        else {
+            uint64_t eof;
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+            rc = KFileSize ( orig, & eof );
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+            if ( rc == 0 )
+            {
+                const KFile *sub;
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                rc = KFileMakeSubRead ( & sub, orig, sizeof hdr,
+                    eof - sizeof hdr );
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                if ( rc == 0 )
+                {
+                    const KFile *gzip;
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+
+/* aprintf          rc = KFileMakeGzip2ForRead ( & gzip, sub ); */
+                    rc = KFileMakeGzipForRead ( & gzip, sub );
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                    if ( rc == 0 )
+                    {
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                        rc = KDataBufferMakeBytes ( mem, 0 );
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                        if ( rc == 0 )
+                        {
+                            size_t total, to_read;
+
+                            /* after all of that, we're ready to decompress */
+                            for ( total = 0; ; )
+                            {
+                                char *buff;
+
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                                rc = KDataBufferResize ( mem,
+                                    total + 32 * 1024 );
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                                if ( rc != 0 )
+                                    break;
+
+                                buff = mem -> base;
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                                to_read = ( size_t ) mem -> elem_count - total;
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+
+                                rc = KFileReadAll ( gzip, total,
+                                    & buff [ total ], to_read, & num_read );
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                                if ( rc != 0 )
+                                    break;
+
+                                total += num_read;
+
+                                if ( num_read < to_read )
+                                {
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                                    buff [ total ] = 0;
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                                    mem -> elem_count = total;
+                                    break;
+                                }
+                            }
+                        }
+
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                        KFileRelease ( gzip );
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                    }
+
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                    KFileRelease ( sub );
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+                }
+            }
+        }
+    }
+
+aprintf("decode_ncbi_gap %d\n", __LINE__);
+    return rc;
+}
+
+typedef struct {
+    const char *projectId;
+    const char *encryptionKey;
+    const char *downloadTicket;
+    const char *description;
+} KGapConfig;
+
+static
+rc_t _KConfigNncToKGapConfig(const KConfig *self, char *text, KGapConfig *kgc)
+{
+    size_t len = 0;
+    int i = 0;
+
+    assert(self && text && kgc);
+
+    memset(kgc, 0, sizeof *kgc);
+    len = string_size(text);
+
+    {
+        const char version[] = "version ";
+        size_t l = sizeof version - 1;
+        if (string_cmp(version, l, text, len, (uint32_t)l) != 0) {
+            return RC(rcKFG, rcMgr, rcUpdating, rcFormat, rcUnrecognized);
+        }
+        text += l;
+        len -= l;
+    }
+
+    {
+        const char version[] = "1.0";
+        size_t l = sizeof version - 1;
+        if (string_cmp(version, l, text, l, (uint32_t)l) != 0) {
+            return RC(rcKFG, rcMgr, rcUpdating, rcFormat, rcUnsupported);
+        }
+        text += l;
+        len -= l;
+    }
+
+    while (len > 0 && (text[0] == '\r' || text[0] == '\n')) {
+        ++text;
+        --len;
+    }
+
+    for (i = 0; ; ++i) {
+        const char *p = NULL;
+        if (i == 0) {
+            p = strtok(text, "|");
+        }
+        else {
+            p = strtok (NULL, "|");
+        }
+        if (p == NULL) {
+            break;
+        }
+        switch (i) {
+            case 0:
+                kgc->projectId = p;
+                break;
+            case 1:
+                kgc->encryptionKey = p;
+                break;
+            case 2:
+                kgc->downloadTicket = p;
+                break;
+            case 3:
+                kgc->description = p;
+                break;
+        }
+    }
+
+    if (!kgc->projectId || !kgc->encryptionKey || !kgc->downloadTicket ||
+        !kgc->description)
+    {
+        return RC(rcKFG, rcMgr, rcUpdating, rcFile, rcInvalid);
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t KConfigFixMainResolverCgiNode ( KConfig * self ) {
+    rc_t rc = 0;
+
+    KConfigNode *node = NULL;
+    struct String *result = NULL;
+
+    assert(self);
+
+    if (rc == 0) {
+        rc = KConfigOpenNodeUpdate(self, &node,
+            "/repository/remote/main/CGI/resolver-cgi");
+    }
+
+    if (rc == 0) {
+        rc = KConfigNodeReadString(node, &result);
+    }
+
+    if (rc == 0) {
+        String http;
+        CONST_STRING ( & http,
+                   "http://www.ncbi.nlm.nih.gov/Traces/names/names.cgi" );
+        assert(result);
+        if ( result->size == 0 || StringEqual ( & http, result ) ) {
+            const char https []
+                = "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi";
+            rc = KConfigNodeWrite ( node, https, sizeof https );
+        }
+    }
+
+    free(result);
+
+    KConfigNodeRelease(node);
+
+    return rc;
+}
+LIB_EXPORT rc_t KConfigFixProtectedResolverCgiNode ( KConfig * self ) {
+    rc_t rc = 0;
+
+    KConfigNode *node = NULL;
+    struct String *result = NULL;
+
+    assert(self);
+
+    if (rc == 0) {
+        rc = KConfigOpenNodeUpdate(self, &node,
+            "/repository/remote/protected/CGI/resolver-cgi");
+    }
+
+    if (rc == 0) {
+        rc = KConfigNodeReadString(node, &result);
+    }
+
+    if (rc == 0) {
+        String http;
+        CONST_STRING ( & http,
+                   "http://www.ncbi.nlm.nih.gov/Traces/names/names.cgi" );
+        assert(result);
+        if ( result->size == 0 || StringEqual ( & http, result ) ) {
+            const char https []
+                = "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi";
+            rc = KConfigNodeWrite ( node, https, sizeof https );
+        }
+    }
+
+    free(result);
+
+    KConfigNodeRelease(node);
+
+    return rc;
+}
+
+static rc_t _KConfigNodeUpdateChild(KConfigNode *self,
+    const char *name, const char *val)
+{
+    rc_t rc = 0;
+
+    KConfigNode *node = NULL;
+
+    assert(self && name && val);
+
+    if (rc == 0) {
+        rc = KConfigNodeOpenNodeUpdate(self, &node, "%s", name);
+    }
+
+    if (rc == 0) {
+        rc = KConfigNodeWrite(node, val, string_size(val));
+    }
+
+    {
+        rc_t rc2 = KConfigNodeRelease(node);
+        if (rc2 != 0 && rc == 0) {
+            rc = rc2;
+        }
+    }
+
+    return rc;
+}
+
+static rc_t _KConfigMkPwdFileAndNode(KConfig *self,
+    KConfigNode *rep, const KGapConfig *kgc)
+{
+    rc_t rc = 0;
+    const KConfigNode *ncbiHome = NULL;
+    KConfigNode *node = NULL;
+    struct String *result = NULL;
+    char encryptionKeyPath[PATH_MAX];
+    KDirectory *dir = NULL;
+    KFile *encryptionKeyFile = NULL;
+    size_t num_writ = 0;
+
+    assert(self && kgc && rep);
+
+    if (rc == 0) {
+        rc = KConfigOpenNodeRead(self, &ncbiHome, "NCBI_HOME");
+    }
+    if (rc == 0) {
+        rc = KConfigNodeReadString(ncbiHome, &result);
+    }
+    KConfigNodeRelease(ncbiHome);
+    ncbiHome = NULL;
+
+    if (rc == 0) {
+        size_t num_writ = 0;
+        assert(result && result->addr);
+        rc = string_printf(encryptionKeyPath, sizeof encryptionKeyPath,
+            &num_writ, "%s/dbGaP-%s.enc_key", result->addr, kgc->projectId);
+        if (rc == 0) {
+            assert(num_writ < sizeof encryptionKeyPath);
+        }
+    }
+    free(result);
+    result = NULL;
+
+    if (rc == 0) {
+        rc = KDirectoryNativeDir(&dir);
+    }
+
+    if (rc == 0) {
+        rc = KDirectoryCreateFile(dir, &encryptionKeyFile,
+                                  false, 0600, kcmInit | kcmParents, "%s", encryptionKeyPath);
+    }
+
+    KDirectoryRelease(dir);
+
+    if (rc == 0) {
+        assert(kgc->encryptionKey);
+        rc = KFileWrite(encryptionKeyFile, 0,
+            kgc->encryptionKey, string_size(kgc->encryptionKey), &num_writ);
+        if (rc == 0) {
+            assert(num_writ == string_size(kgc->encryptionKey));
+        }
+    }
+
+    if (rc == 0) {
+        rc = KFileWrite(encryptionKeyFile, string_size(kgc->encryptionKey),
+            "\n", 1, &num_writ);
+        if (rc == 0) {
+            assert(num_writ == 1);
+        }
+    }
+
+    {
+        rc_t rc2 = KFileRelease(encryptionKeyFile);
+        if (rc2 != 0 && rc == 0) {
+            rc = rc2;
+        }
+    }
+
+    if (rc == 0) {
+        rc = _KConfigNodeUpdateChild(rep,
+            "encryption-key-path", encryptionKeyPath);
+    }
+
+    KConfigNodeRelease(node);
+
+    return rc;
+}
+
+static rc_t _mkNotFoundDir(const char *repoParentPath) {
+    rc_t rc = 0;
+
+    KPathType type = kptNotFound;
+
+    KDirectory *wd = NULL;
+    rc = KDirectoryNativeDir(&wd);
+
+    if (rc == 0) {
+        type = KDirectoryPathType(wd, "%s", repoParentPath);
+        if (type == kptNotFound) {
+            rc = KDirectoryCreateDir(wd, 0777, kcmCreate|kcmParents, "%s", repoParentPath);
+        }
+    }
+
+    KDirectoryRelease(wd);
+
+    return rc;
+}
+
+static rc_t _KConfigDBGapRepositoryNodes(KConfig *self,
+    KConfigNode *rep, const KGapConfig *kgc, const char *repoParentPath,
+    const char **newRepoParentPath)
+{
+    rc_t rc = 0;
+
+    assert(self && rep && kgc);
+
+    if (rc == 0) {
+        rc = _KConfigMkPwdFileAndNode(self, rep, kgc);
+    }
+
+    if (rc == 0) {
+        assert(kgc->downloadTicket);
+        rc = _KConfigNodeUpdateChild(rep,
+            "download-ticket", kgc->downloadTicket);
+    }
+
+    if (rc == 0) {
+        rc = _KConfigNodeUpdateChild(rep, "description", kgc->description);
+    }
+
+    if (rc == 0) {
+        rc = _KConfigNodeUpdateChild(rep, "apps/file/volumes/flat", "files");
+    }
+    if (rc == 0) {
+        rc = _KConfigNodeUpdateChild(rep, "apps/sra/volumes/sraFlat", "sra");
+    }
+
+    if (rc == 0) {
+        rc = _KConfigNodeUpdateChild(rep, "cache-enabled", "true");
+    }
+
+    if (rc == 0) {
+        static char rootPath[PATH_MAX] = "";
+        if (repoParentPath == NULL) {
+            size_t num_writ = 0;
+            const KConfigNode *home = NULL;
+            String *result = NULL;
+
+            if (rc == 0) {
+                rc = KConfigOpenNodeRead(self, &home, "HOME");
+            }
+
+            if (rc == 0) {
+                rc = KConfigNodeReadString(home, &result);
+            }
+
+            if (rc == 0) {
+                assert(result && result->addr);
+                rc = string_printf(rootPath, sizeof rootPath, &num_writ,
+                    "%s/ncbi/dbGaP-%s", result->addr, kgc->projectId);
+            }
+
+            if (rc == 0) {
+                repoParentPath = rootPath;
+            }
+
+            free(result);
+            KConfigNodeRelease(home);
+        }
+
+        if (rc == 0) {
+            rc = _KConfigNodeUpdateChild(rep, "root", repoParentPath);
+        }
+        if (rc == 0) {
+            rc = _mkNotFoundDir(repoParentPath);
+        }
+        if (rc == 0 && newRepoParentPath != NULL) {
+            *newRepoParentPath = repoParentPath;
+        }
+    }
+
+    return rc;
+}
+
+static rc_t _KConfigAddDBGapRepository(KConfig *self,
+    const KGapConfig *kgc, const char *repoParentPath,
+    const char **newRepoParentPath)
+{
+    rc_t rc = 0;
+
+    KConfigNode *rep = NULL;
+
+    char repNodeName[512] = "";
+
+    assert(self && kgc);
+
+    if (rc == 0) {
+        size_t num_writ = 0;
+        rc = string_printf(repNodeName, sizeof repNodeName, &num_writ,
+            "/repository/user/protected/dbGaP-%s", kgc->projectId);
+        if (rc == 0) {
+            assert(num_writ < sizeof repNodeName);
+        }
+    }
+
+    if (rc == 0) {
+        rc = KConfigOpenNodeUpdate(self, &rep, "%s", repNodeName);
+    }
+
+    if (rc == 0) {
+        rc = _KConfigDBGapRepositoryNodes(self, rep, kgc, repoParentPath,
+            newRepoParentPath);
+    }
+
+    KConfigNodeRelease(rep);
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfigImportNgc(KConfig *self,
+    const char *ngcPath, const char *repoParentPath,
+    const char **newRepoParentPath)
+{
+    if (self == NULL) {
+        return RC(rcKFG, rcMgr, rcUpdating, rcSelf, rcNull);
+    }
+
+    if (ngcPath == NULL) {
+        return RC(rcKFG, rcMgr, rcUpdating, rcParam, rcNull);
+    }
+    else {
+        const KFile *orig = NULL;
+        rc_t rc = open_file ( & orig, ngcPath );
+/*    DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG), ("KConfigImportNgc %d\n", __LINE__));*/
+        if (rc != 0) {
+            return rc;
+        }
+        else {
+            KGapConfig kgc;
+
+            KDataBuffer mem;
+            memset ( & mem, 0, sizeof mem );
+
+/*DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG), ("KConfigImportNgc %d\n", __LINE__));
+aprintf("KConfigImportNgc %d\n", __LINE__); */
+            rc = decode_ncbi_gap ( & mem, orig );
+/*DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG), ("KConfigImportNgc %d\n", __LINE__));
+aprintf("KConfigImportNgc %d\n", __LINE__);*/
+            KFileRelease ( orig );
+            orig = NULL;
+
+            if (rc == 0) {
+/*DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG), ("KConfigImportNgc %d\n", __LINE__));
+aprintf("KConfigImportNgc %d\n", __LINE__);*/
+                rc = _KConfigNncToKGapConfig(self, mem.base, &kgc);
+/*DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG), ("KConfigImportNgc %d\n", __LINE__));
+aprintf("KConfigImportNgc %d\n", __LINE__);*/
+            }
+
+            if (rc == 0) {
+/*DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG), ("KConfigImportNgc %d\n", __LINE__));
+aprintf("KConfigImportNgc %d\n", __LINE__);*/
+                rc = KConfigFixProtectedResolverCgiNode(self);
+/*DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG), ("KConfigImportNgc %d\n", __LINE__));
+aprintf("KConfigImportNgc %d\n", __LINE__);*/
+            }
+
+            if (rc == 0) {
+/*DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG), ("KConfigImportNgc %d\n", __LINE__));
+aprintf("KConfigImportNgc %d\n", __LINE__);*/
+                rc = _KConfigAddDBGapRepository(self, &kgc, repoParentPath,
+                    newRepoParentPath);
+/*DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG), ("KConfigImportNgc %d\n", __LINE__));
+aprintf("KConfigImportNgc %d\n", __LINE__);*/
+            }
+
+/*DBGMSG(DBG_KFG, DBG_FLAG(DBG_KFG), ("KConfigImportNgc %d\n", __LINE__));
+aprintf("KConfigImportNgc %d\n", __LINE__);*/
+            KDataBufferWhack ( & mem );
+        }
+
+        return rc;
+    }
+}
+
+
+LIB_EXPORT rc_t CC KConfigWriteBool( KConfig *self, const char * path, bool value )
+{
+    KConfigNode * node;
+    rc_t rc = KConfigOpenNodeUpdate ( self, &node, "%s", path );
+    if ( rc == 0 )
+    {
+        rc = KConfigNodeWriteBool ( node, value );
+        KConfigNodeRelease ( node );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KConfigWriteString( KConfig *self, const char * path, const char * value )
+{
+    KConfigNode * node;
+    rc_t rc = KConfigOpenNodeUpdate ( self, &node, "%s", path );
+    if ( rc == 0 )
+    {
+        rc = KConfigNodeWrite ( node, value, string_size( value ) );
+        KConfigNodeRelease ( node );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KConfigWriteSString( KConfig *self, const char * path, struct String const * value )
+{
+    KConfigNode * node;
+    rc_t rc = KConfigOpenNodeUpdate ( self, &node, "%s", path );
+    if ( rc == 0 )
+    {
+        rc = KConfigNodeWrite ( node, value->addr, value->size );
+        KConfigNodeRelease ( node );
+    }
+    return rc;
+}
diff --git a/libs/kfg/default.kfg b/libs/kfg/default.kfg
new file mode 100644
index 0000000..516c169
--- /dev/null
+++ b/libs/kfg/default.kfg
@@ -0,0 +1,47 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+## DEFAULT CONFIGURATION FOR SRA-TOOLKIT
+# 
+#  These settings are intended to allow the tools to work under conditions
+#  when the user has not yet performed any configuration.
+/config/default = "true"
+
+# The user's default public repository
+/repository/user/main/public/apps/file/volumes/flat = "files"
+/repository/user/main/public/apps/nakmer/volumes/nakmerFlat = "nannot"
+/repository/user/main/public/apps/nannot/volumes/nannotFlat = "nannot"
+/repository/user/main/public/apps/refseq/volumes/refseq = "refseq"
+/repository/user/main/public/apps/sra/volumes/sraFlat = "sra"
+/repository/user/main/public/apps/wgs/volumes/wgsFlat = "wgs"
+/repository/user/main/public/root = "$(HOME)/ncbi/public"
+
+# Remote access to NCBI's public repository
+/repository/remote/main/CGI/resolver-cgi = "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi"
+
+# Remote access to NCBI's protected repository
+/repository/remote/protected/CGI/resolver-cgi = "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi"
+
+# Aspera configuration
+/tools/ascp/max_rate = "1000m"
diff --git a/libs/kfg/kart.c b/libs/kfg/kart.c
new file mode 100644
index 0000000..22b14c3
--- /dev/null
+++ b/libs/kfg/kart.c
@@ -0,0 +1,720 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kfg/kart.h>
+
+#include <kfs/directory.h> /* KDirectoryOpenFileRead */
+#include <kfs/file.h> /* KFile */
+#include <kfs/gzip.h> /* KFileMakeGzipForRead */
+#include <kfs/subfile.h> /* KFileMakeSubRead */
+
+#include <klib/data-buffer.h> /* KDataBuffer */
+#include <klib/rc.h>
+#include <klib/refcount.h> /* KRefcount */
+#include <klib/out.h> /* OUTMSG */
+
+#include <strtol.h> /* strtou64 */
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h> /* free */
+#include <string.h> /* memcmp */
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+struct KartItem {
+    KRefcount refcount;
+
+    const Kart *dad;
+
+/*  String typeId; */
+    String projId;
+    String itemId;
+    String accession;
+    String name;
+    String itemDesc;
+};
+
+static void KartItemWhack(KartItem *self) {
+    assert(self);
+
+    KartRelease(self->dad);
+
+    memset(self, 0, sizeof *self);
+
+    free(self);
+}
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KartItemAddRef(const KartItem *self) {
+    if (self != NULL) {
+        switch (KRefcountAdd(&self->refcount, "KartItem")) {
+            case krefLimit:
+                return RC(rcKFG, rcFile, rcAttaching, rcRange, rcExcessive);
+        }
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KartItemRelease(const KartItem *self) {
+    if (self != NULL) {
+        switch (KRefcountDrop(&self -> refcount, "KartItem")) {
+            case krefWhack:
+                KartItemWhack((KartItem*)self);
+                break;
+            case krefLimit:
+                return RC(rcKFG, rcFile, rcReleasing, rcRange, rcExcessive);
+        }
+    }
+
+    return 0;
+}
+
+static rc_t StringAsUint64(const String *self, uint64_t *pid) {
+    uint64_t id = 0;
+
+    char buffer[21] = "";
+    size_t bytes = 0;
+    char *end = NULL;
+
+    assert(self);
+
+    if (pid == NULL) {
+        return RC(rcKFG, rcFile, rcAccessing, rcParam, rcNull);
+    }
+
+    *pid = 0;
+
+    if (sizeof buffer - 1 < self->len) {
+        return RC(rcKFG, rcFile, rcAccessing, rcBuffer, rcInsufficient);
+    }
+
+    if (self->len == 0 || self->size == 0) {
+        return RC(rcKFG, rcFile, rcAccessing, rcItem, rcEmpty);
+    }
+
+    bytes = string_copy(buffer, sizeof buffer, self->addr, self->len);
+    if (bytes != self->len) {
+        return RC(rcKFG, rcFile, rcAccessing, rcBuffer, rcInsufficient);
+    }
+
+    id = strtou64(buffer, &end, 0);
+    if (end[0] != 0) {
+        return RC(rcKFG, rcFile, rcAccessing, rcParam, rcInvalid);
+    }
+
+    *pid = id;
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KartItemProjIdNumber(const KartItem *self, uint64_t *pid) {
+    if (self == NULL) {
+        return RC(rcKFG, rcFile, rcAccessing, rcSelf, rcNull);
+    }
+    return StringAsUint64(&self->projId, pid);
+}
+
+LIB_EXPORT rc_t CC KartItemItemIdNumber(const KartItem *self, uint64_t *pid) {
+    if (self == NULL) {
+        return RC(rcKFG, rcFile, rcAccessing, rcSelf, rcNull);
+    }
+    return StringAsUint64(&self->itemId, pid);
+}
+
+static rc_t KartItemCheck(const KartItem *self, const String **elem) {
+    if (elem == NULL) {
+        return RC(rcKFG, rcFile, rcAccessing, rcParam, rcNull);
+    }
+
+    *elem = NULL;
+
+    if (self == NULL) {
+        return RC(rcKFG, rcFile, rcAccessing, rcSelf, rcNull);
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KartItemProjId(const KartItem *self, const String **elem)
+{
+    rc_t rc = KartItemCheck(self, elem);
+    if (rc == 0) {
+        *elem = &self->projId;
+    }
+    return rc;
+}
+LIB_EXPORT rc_t CC KartItemItemId(const KartItem *self, const String **elem)
+{
+    rc_t rc = KartItemCheck(self, elem);
+    if (rc == 0) {
+        *elem = &self->itemId;
+    }
+    return rc;
+}
+LIB_EXPORT rc_t CC KartItemAccession(const KartItem *self, const String **elem)
+{
+    rc_t rc = KartItemCheck(self, elem);
+    if (rc == 0) {
+        *elem = &self->accession;
+    }
+    return rc;
+}
+LIB_EXPORT rc_t CC KartItemName(const KartItem *self, const String **elem)
+{
+    rc_t rc = KartItemCheck(self, elem);
+    if (rc == 0) {
+        *elem = &self->name;
+    }
+    return rc;
+}
+LIB_EXPORT rc_t CC KartItemItemDesc(const KartItem *self, const String **elem)
+{
+    rc_t rc = KartItemCheck(self, elem);
+    if (rc == 0) {
+        *elem = &self->itemDesc;
+    }
+    return rc;
+}
+/*LIB_EXPORT rc_t CC KartItemTypeId(const KartItem *self, const String **elem)
+{
+    rc_t rc = KartItemCheck(self, elem);
+    if (rc == 0) {
+        *elem = &self->typeId;
+    }
+    return rc;
+}*/
+
+/** Print KartItem using OUTMSG; if (self == NULL) then print the header */
+LIB_EXPORT rc_t CC KartItemPrint(const KartItem *self) { /* AA-833 */
+    if (self != NULL) {
+        return OUTMSG(("'%S'\t'%S'\t'%S'\t'%S'\t'%S'\n", &self->projId,
+            &self->itemId, &self->accession, &self->name, &self->itemDesc));
+    }
+    return 0;
+}
+
+struct Kart {
+    KRefcount refcount;
+
+    KDataBuffer mem;
+
+    const char *text;
+    uint64_t len;
+
+    uint16_t itemsProcessed;
+};
+
+static void KartWhack(Kart *self) {
+    assert(self);
+
+    KDataBufferWhack(&self->mem);
+
+    memset(self, 0, sizeof *self);
+
+    free(self);
+}
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC KartAddRef(const Kart *self) {
+    if (self != NULL) {
+        switch (KRefcountAdd(&self->refcount, "Kart")) {
+            case krefLimit:
+                return RC(rcKFG, rcFile, rcAttaching, rcRange, rcExcessive);
+        }
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KartRelease(const Kart *self) {
+    if (self != NULL) {
+        switch (KRefcountDrop(&self -> refcount, "Kart")) {
+            case krefWhack:
+                KartWhack((Kart*)self);
+                break;
+            case krefLimit:
+                return RC(rcKFG, rcFile, rcReleasing, rcRange, rcExcessive);
+        }
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KartItemsProcessed(const Kart *self, uint16_t *number) {
+    if (number == NULL) {
+        return RC(rcKFG, rcFile, rcLoading, rcParam, rcNull);
+    }
+
+    *number = 0;
+
+    if (self == NULL) {
+        return RC(rcKFG, rcFile, rcLoading, rcSelf, rcNull);
+    }
+
+    *number = self->itemsProcessed;
+
+    return 0;
+}
+
+static rc_t KartItemInitFromKartRow(const Kart *self, const KartItem **item,
+    const char *line, size_t len)
+{
+    rc_t rc = 0;
+    int i = 0;
+    KartItem *obj = NULL;
+    assert(self && item && line && len);
+    obj = calloc(1, sizeof *obj);
+    if (obj == NULL) {
+        return RC(rcKFG, rcData, rcAllocating, rcMemory, rcExhausted);
+    }
+    for (i = 0; ; ++i) {
+        size_t l = 0;
+        String *next = NULL;
+        const char *p = string_chr(line, len, '|');
+        if (p == NULL) {
+            if (i != 4) {
+                rc = RC(rcKFG, rcFile, rcParsing, rcFile, rcInsufficient);
+                break;
+            }
+            l = len;
+        }
+        else {
+            l = p - line;
+        }
+        switch (i) { /* AA-833 */
+            case 0:
+                next = &obj->projId;
+                break;
+            case 1:
+                next = &obj->itemId;
+                break;
+            case 2:
+                next = &obj->accession;
+                break;
+            case 3:
+                next = &obj->name;
+                break;
+            case 4:
+                next = &obj->itemDesc;
+                break;
+            default:
+                rc = RC(rcKFG, rcFile, rcParsing, rcFile, rcExcessive);
+                break;
+        }
+        assert(next);
+        StringInit(next, line, l, (uint32_t)l);
+        if (l > len) {
+            rc = RC(rcKFG, rcFile, rcParsing, rcFile, rcInvalid);
+        }
+        if (len == l) {
+            break;
+        }
+        ++l;
+        line += l;
+        len -= l;
+    }
+    if (rc == 0) {
+        rc = KartAddRef(self);
+    }
+    if (rc == 0) {
+        KRefcountInit(&obj->refcount, 1, "KartItem", "KartItemInitFromKartRow", "kartitem");
+        ++((Kart*)self)->itemsProcessed;
+        obj->dad = self;
+        *item = obj;
+    }
+    else {
+        free(obj);
+        obj = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KartPrint(const Kart *self) {
+    uint32_t len = 0;
+
+    if (self == NULL) {
+        return RC(rcKFG, rcFile, rcLoading, rcSelf, rcNull);
+    }
+
+    len = (uint32_t)self->mem.elem_count;;
+    return OUTMSG(("%.*s", len, self->mem.base));
+}
+
+LIB_EXPORT rc_t CC KartPrintNumbered(const Kart *self) {
+    rc_t rc = 0;
+    rc_t rc2 = 0;
+    const char *start = NULL;
+    int32_t remaining = 0;
+    int32_t len = 0;
+    uint32_t i = 0;
+    const char *next = NULL;
+    bool done = false;
+
+    if (self == NULL) {
+        return RC(rcKFG, rcFile, rcLoading, rcSelf, rcNull);
+    }
+
+    remaining = (uint32_t)self->mem.elem_count;
+    start = self->mem.base;
+
+    {
+        const char version[] = "version ";
+        size_t l = sizeof version - 1;
+        if (string_cmp(version, l, start, remaining, (uint32_t)l) != 0) {
+            return RC(rcKFG, rcMgr, rcAccessing, rcFormat, rcUnrecognized);
+        }
+    }
+
+    next = string_chr(start, remaining, '\n');
+    if (next == NULL) {
+        len = remaining;
+    }
+    else {
+        ++next;
+        len = next - start;
+    }
+    remaining -= len;
+    rc2 = OUTMSG(("%.*s", len, start));
+    if (rc2 != 0 && rc == 0) {
+        rc = rc2;
+    }
+    start = next;
+
+    rc2 = OUTMSG(("row\tproj-id|item-id|accession|name|item-desc\n"));
+    if (rc2 != 0 && rc == 0) {
+        rc = rc2;
+    }
+
+    for (i = 1; remaining > 0; ++i) {
+        if (*start == '$') {
+            const char end[] = "$end";
+            size_t l = sizeof end - 1;
+            if (string_cmp(end, l, start, remaining, (uint32_t)l) != 0) {
+                return RC(rcKFG, rcMgr, rcAccessing, rcFormat, rcUnrecognized);
+            }
+            else {
+                done = true;
+            }
+        }
+        next = string_chr(start, remaining, '\n');
+        if (next == NULL) {
+            len = remaining;
+        }
+        else {
+            ++next;
+            len = next - start;
+        }
+        remaining -= len;
+        if (done) {
+            rc2 = OUTMSG(("%.*s", len, start));
+        }
+        else {
+            rc2 = OUTMSG(("%d\t%.*s", i, len, start));
+        }
+        if (rc2 != 0 && rc == 0) {
+            rc = rc2;
+        }
+        start = next;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KartMakeNextItem(Kart *self, const KartItem **item) {
+    size_t len = 0;
+    const char *line = NULL;
+    const char *next = NULL;
+
+    if (item == NULL) {
+        return RC(rcKFG, rcFile, rcLoading, rcParam, rcNull);
+    }
+    *item = NULL;
+    if (self == NULL) {
+        return RC(rcKFG, rcFile, rcLoading, rcSelf, rcNull);
+    }
+
+    while (self->len > 0
+        && (self->text[0] == '\r' || self->text[0] == '\n'))
+    {
+        ++self->text;
+        --self->len;
+    }
+
+    line = self->text;
+    next = string_chr(self->text, self->len, '\n');
+    if (next == NULL) {
+        return RC(rcKFG, rcFile, rcLoading, rcFile, rcInsufficient);
+    }
+
+    len = next - self->text;
+    if (*(next - 1) == '\r') {
+        --len;
+    }
+
+    if (self->len >= (uint64_t) (next - self->text + 1) ){
+        self->len -= next - self->text + 1;
+    }
+    else {
+        OUTMSG(("WARNING: STRING OVERFLOW DURING KART ROW PARSING"));
+        self->len = 0;
+    }
+
+    self->text = next + 1;
+
+    {
+        const char end[] = "$end";
+        if (string_cmp(line, len, end, sizeof end - 1, sizeof end - 1) == 0) {
+            return 0;
+        }
+    }
+
+    return KartItemInitFromKartRow(self, item, line, len);
+}
+
+static rc_t decode_kart(KDataBuffer *mem, const KFile *orig, size_t hdr_sz) {
+    rc_t rc = 0;
+    size_t num_read;
+    uint64_t eof;
+    assert(mem && orig && hdr_sz);
+    rc = KFileSize ( orig, & eof );
+    if ( rc == 0 )
+    {
+        const KFile *sub;
+        rc = KFileMakeSubRead(&sub, orig, hdr_sz, eof - hdr_sz);
+        if ( rc == 0 )
+        {
+            const KFile *gzip;
+            rc = KFileMakeGzipForRead ( & gzip, sub );
+            if ( rc == 0 )
+            {
+                rc = KDataBufferMakeBytes ( mem, 0 );
+                if ( rc == 0 )
+                {
+                    size_t total, to_read;
+
+                    /* after all of that, we're ready to decompress */
+                    for ( total = 0; ; )
+                    {
+                        char *buff;
+
+                        rc = KDataBufferResize ( mem,
+                            total + 32 * 1024 );
+                        if ( rc != 0 )
+                            break;
+
+                        buff = mem -> base;
+                        to_read = ( size_t ) mem -> elem_count - total;
+
+                        rc = KFileReadAll ( gzip, total,
+                            & buff [ total ], to_read, & num_read );
+                        if ( rc != 0 )
+                            break;
+
+                        total += num_read;
+                        
+                        if ( num_read < to_read )
+                        {
+                            buff [ total ] = 0;
+                            mem -> elem_count = total;
+                            break;
+                        }
+                    }
+                }
+
+                KFileRelease ( gzip );
+            }
+
+            KFileRelease ( sub );
+        }
+    }
+
+    return rc;
+}
+
+static rc_t KartProcessHeader(Kart *self) {
+    assert(self);
+
+    self->text = self->mem.base;
+    self->len = self->mem.elem_count;
+
+    {
+        const char version[] = "version ";
+        size_t l = sizeof version - 1;
+        if (string_cmp(version, l, self->text, self->len, (uint32_t)l) != 0) {
+            return RC(rcKFG, rcMgr, rcUpdating, rcFormat, rcUnrecognized);
+        }
+
+        self->text += l;
+        self->len -= l;
+    }
+
+    {
+        const char version[] = "1.0";
+        size_t l = sizeof version - 1;
+        if (string_cmp(version, l, self->text, l, (uint32_t)l) != 0) {
+            return RC(rcKFG, rcMgr, rcUpdating, rcFormat, rcUnsupported);
+        }
+
+        self->text += l;
+        self->len -= l;
+    }
+
+    while (self->len > 0 && (self->text[0] == '\r' || self->text[0] == '\n')) {
+        ++self->text;
+        --self->len;
+    }
+
+    return 0;
+}
+
+#ifdef _DEBUGGING
+static rc_t read_textkart(KDataBuffer *mem, const KFile *orig) {
+    rc_t rc = 0;
+    size_t num_read;
+    uint64_t eof;
+    assert(mem && orig);
+    rc = KFileSize ( orig, & eof );
+    if ( rc == 0 )
+    {
+        rc = KDataBufferMakeBytes ( mem, 0 );
+        if ( rc == 0 ) {
+            /* after all of that, we're ready to read */
+            rc = KDataBufferResize(mem, eof);
+            if ( rc != 0 )
+                return rc;
+            rc = KFileReadAll ( orig, 0, mem -> base, eof, & num_read );
+            if ( rc != 0 )
+                return rc;
+        }
+    }
+    return rc;
+}
+KFG_EXTERN rc_t CC KartMakeText(const struct KDirectory *dir, const char *path,
+    Kart **kart, bool *isKart)
+{
+    rc_t rc = 0;
+    const KFile *f = NULL;
+
+    if (dir == NULL || path == NULL || kart == NULL || isKart == NULL) {
+        return RC(rcKFG, rcFile, rcReading, rcParam, rcNull);
+    }
+
+    *isKart = false;
+    *kart = NULL;
+
+    rc = KDirectoryOpenFileRead(dir, &f, "%s", path);
+    if (rc != 0) {
+        return rc;
+    }
+
+    {
+        Kart *obj = NULL;
+
+        *isKart = true;
+
+        obj = calloc(1, sizeof *obj);
+        if (obj == NULL) {
+            return RC(rcKFG, rcData, rcAllocating, rcMemory, rcExhausted);
+        }
+
+        rc = read_textkart(&obj->mem, f);
+        if (rc == 0) {
+            rc = KartProcessHeader(obj);
+        }
+        if (rc == 0) {
+            KRefcountInit(&obj->refcount, 1, "Kart", "MakeText", "kart");
+            *kart = obj;
+        }
+        else {
+            KartWhack(obj);
+        }
+    }
+
+    RELEASE(KFile, f);
+    return rc;
+}
+#endif
+
+LIB_EXPORT rc_t KartMake(const KDirectory *dir, const char *path,
+    Kart **kart, bool *isKart)
+{
+    rc_t rc = 0;
+    const KFile *f = NULL;
+    char hdr[8] = "";
+    size_t num_read = 0;
+
+    if (dir == NULL || path == NULL || kart == NULL || isKart == NULL) {
+        return RC(rcKFG, rcFile, rcReading, rcParam, rcNull);
+    }
+
+    *isKart = false;
+    *kart = NULL;
+
+    rc = KDirectoryOpenFileRead(dir, &f, "%s", path);
+    if (rc != 0) {
+        return rc;
+    }
+
+    rc = KFileReadAll(f, 0, hdr, sizeof hdr, &num_read);
+    if (rc == 0 && num_read == sizeof hdr &&
+        memcmp(hdr, "ncbikart", sizeof hdr) == 0)
+    {
+        Kart *obj = NULL;
+
+        *isKart = true;
+
+        obj = calloc(1, sizeof *obj);
+        if (obj == NULL) {
+            return RC(rcKFG, rcData, rcAllocating, rcMemory, rcExhausted);
+        }
+
+        rc = decode_kart(&obj->mem, f, sizeof hdr);
+        if (rc == 0) {
+            rc = KartProcessHeader(obj);
+        }
+        if (rc == 0) {
+            KRefcountInit(&obj->refcount, 1, "Kart", "Make", "kart");
+            *kart = obj;
+        }
+        else {
+            KartWhack(obj);
+        }
+    }
+
+    RELEASE(KFile, f);
+    return rc;
+}
diff --git a/libs/kfg/keystore.c b/libs/kfg/keystore.c
new file mode 100644
index 0000000..7e3b98a
--- /dev/null
+++ b/libs/kfg/keystore.c
@@ -0,0 +1,858 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfg/extern.h>
+
+#include <kfg/keystore-priv.h>
+
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+
+#include <kfg/config.h>
+#include <kfg/repository.h>
+#include <kfg/kfg-priv.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/lockfile.h>
+#include <kfs/nullfile.h>
+
+#include <strtol.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define PASSWORD_MAX_SIZE 4096
+#define MAX_PATH_SIZE 4096
+
+static char defaultBindingsFile[MAX_PATH_SIZE];
+
+static rc_t KEncryptionKeyMakeFromFile(const char* path, KEncryptionKey** self);
+
+/* 
+ * Non-keyring implementation, using a combination of location-based and global keys
+ */
+
+struct KKeyStore
+{
+    KKeyStore_vt vt;
+    KRefcount refcount;
+    
+    KEncryptionKey* temp_key; /* temp key provided by the client code*/
+    
+    const KConfig* kfg;
+    char* bindingsFile;
+};
+
+static rc_t KKeyStoreWhack(KKeyStore* self);
+
+static KKeyStore_vt_v1 v1 = {
+    1, 0,
+    KKeyStoreWhack,
+    KKeyStoreGetKey
+};
+
+rc_t KKeyStoreWhack(KKeyStore* self)
+{
+    rc_t rc = KConfigRelease(self->kfg);
+    rc_t rc2 = KEncryptionKeyRelease(self->temp_key);
+    if (rc == 0)
+        rc = rc2;
+    if (self->bindingsFile != defaultBindingsFile)
+        free(self->bindingsFile);
+    free(self);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KKeyStoreMake(KKeyStore** self, KConfig* kfg)
+{
+    rc_t rc = 0;
+    KKeyStore* ret;
+    
+    if ( self == NULL )
+        return RC ( rcKFG, rcStorage, rcCreating, rcSelf, rcNull );
+
+    *self = NULL;
+    
+    ret = malloc(sizeof(*ret));
+    if (ret == NULL)
+        return RC ( rcKFG, rcStorage, rcCreating, rcMemory, rcExhausted );
+    
+    ret -> vt . v1 =  &v1;
+    
+    KRefcountInit ( & ret -> refcount, 1, "KKeyStore", "init", "" );
+    
+    ret->temp_key = NULL;
+    ret->bindingsFile = NULL;
+    ret->kfg = kfg;
+    if (kfg != NULL)
+    {
+        rc = KConfigAddRef(kfg);
+        if (rc == 0)
+            ret->kfg = kfg;
+    }
+    else
+        ret->kfg = NULL;
+    
+    if (rc == 0)
+        *self = ret;
+    else
+        KKeyStoreWhack(ret);
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KKeyStoreAddRef ( const KKeyStore *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KKeyStore" ) )
+        {
+        case krefLimit:
+            return RC ( rcKFG, rcStorage, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KKeyStoreRelease ( const KKeyStore *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KKeyStore" ) )
+        {
+        case krefWhack:
+            self -> vt . v1 -> destroy ( ( KKeyStore* ) self );
+        break;
+        case krefLimit:
+            return RC ( rcKFG, rcStorage, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/*
+ * the result is always 0-terminated
+ */
+static
+rc_t ReadEncKey(const KFile* file, char* buf, size_t bufsize)
+{
+    /* at this point we are only getting the password from a 
+     * file but in the future if we can get it from a pipe of
+     * some sort we can't count on the ReadAll to really know
+     * if we hit end of file and not just a pause in the
+     * streaming.  VDB 3 / VFS/KFS 2 will have to fix this somehow
+     */
+    size_t readNum;
+    rc_t rc = KFileReadAll (file, 0, buf, bufsize - 1, &readNum);
+
+    if (rc == 0)
+    {
+        /* -----
+         * trim back the contents of the file to
+         * a single ASCII/UTF-8 text line
+         * We actually only check for the two normal
+         * end of line characters so it could have other
+         * control characters...
+         */
+        char* pc = string_chr (buf, readNum, '\r');
+        if (pc == NULL)
+            pc = string_chr (buf, readNum, '\n');
+
+        if (pc != NULL)
+            *pc = 0;
+        else
+            buf[readNum]=0;
+            
+        if (string_measure(buf, NULL) == 0)
+            rc = RC (rcKFG, rcEncryptionKey, rcRetrieving, rcSize, rcTooShort);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KKeyStoreSetTemporaryKeyFromFile(KKeyStore* self, const struct KFile* file)
+{
+    rc_t rc;
+    char key[PASSWORD_MAX_SIZE + 1];
+    
+    if ( self == NULL )
+        return RC ( rcKFG, rcEncryptionKey, rcRetrieving, rcSelf, rcNull );
+        
+    if ( file == NULL )
+    {
+        rc = KEncryptionKeyRelease(self->temp_key);
+        self->temp_key = NULL;
+    }
+    else
+    {    
+        rc = ReadEncKey(file, key, PASSWORD_MAX_SIZE);
+        if (rc == 0)
+        {
+            rc = KEncryptionKeyRelease(self->temp_key);
+            if ( rc == 0)
+                rc = KEncryptionKeyMake(key, &self->temp_key);
+            memset(key, 0, PASSWORD_MAX_SIZE); /* is this enough security? */
+        }
+    }
+    
+    return rc;
+}
+
+
+static rc_t CC KKeyStoreGetKeyInt(const KKeyStore* self, const char* obj_key,
+    KEncryptionKey** enc_key, bool by_project_id, uint32_t projectId)
+{
+    rc_t rc = 0;
+    
+    if ( self == NULL )
+        return RC ( rcKFG, rcEncryptionKey, rcRetrieving, rcSelf, rcNull );
+    if ( enc_key == NULL )
+        return RC ( rcKFG, rcEncryptionKey, rcRetrieving, rcParam, rcNull );
+    
+    if (self->temp_key != NULL)
+    {
+        rc = KEncryptionKeyAddRef(self->temp_key);
+        if (rc == 0)
+            *enc_key = self->temp_key;
+    }
+    else
+    {
+        const char * env = getenv (ENV_KRYPTO_PWFILE);
+        if (env != NULL)
+            rc = KEncryptionKeyMakeFromFile(env, enc_key);
+        else 
+        {   /* try protected repository */
+            if ( self -> kfg == NULL )
+                rc = KConfigMake( (KConfig**) &(self -> kfg), NULL );
+            if ( rc == 0 )
+            {
+                rc_t rc2;
+                const KRepositoryMgr *rmgr;
+                rc = KConfigMakeRepositoryMgrRead ( self -> kfg, & rmgr );
+                if ( rc == 0 )
+                {
+                    const KRepository *protected;
+                    if (by_project_id) {
+                        rc = KRepositoryMgrGetProtectedRepository
+                            ( rmgr, projectId, & protected );
+                    }
+                    else {
+                        rc = KRepositoryMgrCurrentProtectedRepository
+                            ( rmgr, & protected );
+                    }
+                    if ( rc == 0 )
+                    {   /* in a protected area */
+                        char path [ MAX_PATH_SIZE ];
+                        rc = KRepositoryEncryptionKeyFile ( protected, path, sizeof(path), NULL );
+                        if ( rc == 0 && path [ 0 ] != 0 )
+                            rc = KEncryptionKeyMakeFromFile(path, enc_key);
+                            
+                        rc2 = KRepositoryRelease ( protected );
+                        if (rc == 0)
+                            rc = rc2;
+                    }
+                    else /* use global password file */
+                    {
+                        String* path;
+                        rc = KConfigReadString ( self -> kfg, KFG_KRYPTO_PWFILE, &path );        
+                        if (rc == 0)
+                        {
+                            rc = KEncryptionKeyMakeFromFile(path->addr, enc_key);
+                            StringWhack(path);
+                        }
+                        else 
+                            rc = RC(rcKFG, rcEncryptionKey, rcRetrieving, rcItem, rcNotFound); 
+                    }
+                    rc2 = KRepositoryMgrRelease ( rmgr );
+                    if (rc == 0)
+                        rc = rc2;
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KKeyStoreGetKey(const KKeyStore* self,
+    const char* obj_key, KEncryptionKey** enc_key)
+{
+    return KKeyStoreGetKeyInt(self, obj_key, enc_key, false, 0);
+}
+
+LIB_EXPORT rc_t CC KKeyStoreGetKeyByProjectId(const KKeyStore* self,
+    const char* obj_key, KEncryptionKey** enc_key, uint32_t projectId)
+{
+    return KKeyStoreGetKeyInt(self, obj_key, enc_key, true, projectId);
+}
+
+
+LIB_EXPORT rc_t CC KKeyStoreSetConfig(struct KKeyStore* self, const struct KConfig* kfg)
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        return RC ( rcKFG, rcEncryptionKey, rcRetrieving, rcSelf, rcNull );
+        
+    if ( kfg != NULL )
+        rc = KConfigAddRef(kfg);
+        
+    if ( rc == 0 )
+    {
+        if ( self->kfg != NULL )
+            KConfigRelease(self->kfg);
+        self->kfg = kfg;
+    }
+        
+    return rc;
+}
+
+/* 
+ * KEncryptionKey
+ */
+
+LIB_EXPORT rc_t CC KEncryptionKeyAddRef ( KEncryptionKey *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KEncryptionKey" ) )
+        {
+        case krefLimit:
+            return RC ( rcKFG, rcEncryptionKey, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KEncryptionKeyRelease ( KEncryptionKey *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KEncryptionKey" ) )
+        {
+        case krefWhack:
+            free((char*)self->value.addr); /*TODO: unlock memory? */
+            free(self);
+            break;
+        case krefLimit:
+            return RC ( rcKFG, rcEncryptionKey, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+static rc_t KEncryptionKeyMakeInt(const char* value, KEncryptionKey** self)
+{
+    KEncryptionKey* ret;
+    
+    *self = NULL;
+    
+    ret = malloc(sizeof(KEncryptionKey));
+    if (ret == NULL)
+        return RC ( rcKFG, rcEncryptionKey, rcCreating, rcMemory, rcExhausted );
+    else
+    {
+        size_t size = string_measure(value, NULL);
+        char* data = malloc(size+1);/*TODO: place in protected memory*/
+        if (data == NULL)
+        {
+            free(ret);
+            return RC ( rcKFG, rcEncryptionKey, rcCreating, rcMemory, rcExhausted );
+        }
+
+        string_copy(data, size + 1, value, size);    
+        StringInit( & ret -> value, data, size, (uint32_t)size ); /* do not include the 0-terminator */
+        
+        KRefcountInit ( & ret -> refcount, 1, "KEncryptionKey", "init", "" );
+        
+        *self = ret;
+        return 0;
+    }
+}
+
+LIB_EXPORT rc_t CC KEncryptionKeyMake(const char* value, KEncryptionKey** self)
+{
+    if ( value == NULL )
+        return RC ( rcKFG, rcEncryptionKey, rcCreating, rcParam, rcNull );
+    if ( self == NULL )
+        return RC ( rcKFG, rcEncryptionKey, rcCreating, rcSelf, rcNull );
+
+    return KEncryptionKeyMakeInt(value, self);
+}
+
+static rc_t KEncryptionKeyMakeFromFile(const char* path, KEncryptionKey** self)
+{
+    rc_t rc;
+    KDirectory* wd;
+    
+    if ( path == NULL )
+        return RC ( rcKFG, rcEncryptionKey, rcCreating, rcParam, rcNull );
+    if ( self == NULL )
+        return RC ( rcKFG, rcEncryptionKey, rcCreating, rcSelf, rcNull );
+    
+    rc = KDirectoryNativeDir(&wd);
+    if (rc == 0)
+    {
+        rc_t rc2;
+        const KFile* file;
+        const char dev_stdin [] = "/dev/stdin";
+        const char dev_null [] = "/dev/null";        
+        
+        if (strcmp (dev_stdin, path) == 0)
+            rc = KFileMakeStdIn (&file);
+        else if (strcmp (dev_null, path) == 0)
+            rc = KFileMakeNullRead (&file);
+        else 
+            rc = KDirectoryOpenFileRead(wd, &file, "%s", path);
+        if (rc == 0)
+        {
+            char key[PASSWORD_MAX_SIZE + 1];
+            rc = ReadEncKey(file, key, PASSWORD_MAX_SIZE);
+            if (rc == 0)
+                rc = KEncryptionKeyMakeInt(key, self);
+                
+            rc2 = KFileRelease(file);
+            if (rc == 0)
+                rc = rc2;
+        }
+        rc2 = KDirectoryRelease(wd);
+        if (rc == 0)
+            rc = rc2;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KKeyStoreSetBindingsFile(struct KKeyStore* self, const char* path)
+{
+    if ( self == NULL )
+        return RC ( rcKFG, rcStorage, rcInitializing, rcSelf, rcNull );
+        
+    if (self->bindingsFile != defaultBindingsFile)
+        free(self->bindingsFile);
+    if (path == NULL)
+        self->bindingsFile = NULL;
+    else
+    {
+        self->bindingsFile = string_dup(path, string_size(path));
+        if (self->bindingsFile == NULL)
+            return RC ( rcKFG, rcStorage, rcInitializing, rcMemory, rcExhausted );
+    }
+    return 0;
+}
+
+LIB_EXPORT const char* KKeyStoreGetBindingsFile(const struct KKeyStore* self)
+{
+    if ( self == NULL )
+        return NULL;
+        
+    return self->bindingsFile;
+}
+
+
+#define MAX_OBJID_SIZE 20
+#define MAX_NAME_SIZE 4096
+
+static rc_t LocateObjectId(const KFile* file, const char* key, char* value, size_t value_size, size_t* value_read)
+{
+    char buf[MAX_OBJID_SIZE + 1 + MAX_NAME_SIZE + 1];
+    size_t num_read;
+    uint64_t pos = 0;
+    size_t key_size = string_size(key);
+    bool eof = false;
+    do
+    {
+        rc_t rc = KFileReadAll(file, pos, buf, sizeof(buf), &num_read);
+        if (rc != 0)
+            return rc;
+        else
+        {
+            size_t start;
+            if (num_read == sizeof(buf))
+            {   /* locate the last incomplete line and ignore it; will be considered after the next read() */
+                while (num_read > 0)
+                {
+                    --num_read;
+                    if (buf[num_read] == '\r' || buf[num_read] == '\n')
+                        break;
+                }
+                if (num_read == 0)
+                    return RC ( rcVFS, rcMgr, rcReading, rcRow, rcTooLong);
+            }
+            else
+                eof = true;
+            
+            start = 0;
+            while (start + key_size < num_read)
+            {   
+                /* find the beginning of a line */
+                while (buf[start] == '\r' || buf[start] == '\n') 
+                {
+                    ++start;
+                    if (start >= num_read)
+                        break;
+                }
+                /* check the key */
+                if (string_cmp(key, key_size, buf + start, key_size, (uint32_t) ( num_read - start )) == 0)
+                {
+                    if (buf [ start + key_size ] == '=')
+                    {
+                        size_t i = 0;
+                        size_t sourceIdx = start + key_size + 1; /* 1st character after '=' */
+                        while (sourceIdx < num_read)
+                        {
+                            if (i >= value_size)
+                                return RC ( rcVFS, rcMgr, rcReading, rcName, rcTooLong);
+                                
+                            if (buf[sourceIdx] == '\r' || buf[sourceIdx] == '\n') 
+                                break;
+                                
+                            value[i] = buf[sourceIdx];
+                            
+                            ++i;
+                            ++sourceIdx;
+                        }
+                        *value_read = i;
+                        return 0;
+                    }
+                }
+                
+                /* skip until the next end of line */
+                while (buf[start] != '\r' && buf[start] != '\n') 
+                {
+                    ++start;
+                    if (start >= num_read)
+                        break;
+                }
+            }
+            
+            pos += num_read;
+        }
+    }
+    while (!eof);
+    
+    return RC ( rcVFS, rcMgr, rcReading, rcId, rcNotFound );
+}
+
+/*
+ * Reverse lookup
+ */
+static rc_t LocateObject(const KFile* file, const char* value, const size_t value_size, char* key, size_t key_size, size_t* key_read)
+{
+    char buf[MAX_OBJID_SIZE + 1 + MAX_NAME_SIZE + 1];
+    size_t num_read;
+    uint64_t pos = 0;
+    bool eof = false;
+    do
+    {
+        rc_t rc = KFileReadAll(file, pos, buf, sizeof(buf), &num_read);
+        if (rc != 0)
+            return rc;
+        else
+        {
+            size_t start;
+            if (num_read == sizeof(buf))
+            {   /* locate the last incomplete line and ignore it; will be considered after the next read() */
+                while (num_read > 0)
+                {
+                    --num_read;
+                    if (buf[num_read] == '\r' || buf[num_read] == '\n')
+                        break;
+                }
+                if (num_read == 0)
+                    return RC ( rcVFS, rcMgr, rcReading, rcRow, rcTooLong);
+            }
+            else
+                eof = true;
+            
+            start = 0; 
+            while (start + value_size < num_read)
+            {   
+                size_t key_start, key_end;
+                size_t value_start;
+                
+                /* find the beginning of a line */
+                while (buf[start] == '\r' || buf[start] == '\n') 
+                {
+                    ++start;
+                    if (start >= num_read)
+                        break;
+                }
+                if (start >= num_read)
+                    continue;
+                    
+                key_start = start;
+                
+                /* find the separator */
+                while (buf[start] != '=') 
+                {
+                    if (buf[start] == '\r' || buf[start] == '\n') /* separator not found, ignore the line*/
+                        break;
+                        
+                    ++start;
+                    if (start >= num_read)
+                        break;
+                }
+                if (start >= num_read || buf[start] != '=')
+                    continue;
+                
+                key_end = start;
+                
+                ++start; /* skip the separator */
+
+                value_start = start;
+                /* find the next end of line */
+                while (buf[start] != '\r' && buf[start] != '\n') 
+                {
+                    ++start;
+                    if (start >= num_read)
+                        break;
+                }
+
+                /* compare the value */
+                if (string_cmp(value, value_size, buf + value_start, start - value_start, (uint32_t) ( start - value_start )) == 0)
+                {
+                    *key_read = key_end - key_start;
+                    if (string_copy(key, key_size, buf + key_start, *key_read) != *key_read)
+                        return RC ( rcVFS, rcMgr, rcReading, rcId, rcTooLong);
+                    return 0;
+                }
+            }
+            
+            pos += num_read;
+        }
+    }
+    while (!eof);
+    
+    return RC ( rcVFS, rcMgr, rcReading, rcId, rcNotFound );
+}
+
+static rc_t AppendObject(KFile* file, const char* name, const String* value)
+{
+    uint64_t size;
+    rc_t rc = KFileSize ( file, &size );
+    if (rc == 0)
+    {
+        char buf[MAX_OBJID_SIZE + 1 + MAX_NAME_SIZE + 1];
+        size_t num_writ;
+        rc = string_printf(buf, sizeof(buf), &num_writ, "%s=%S\n", name, value);
+        if (rc == 0)
+            rc = KFileWrite ( file, size, buf, num_writ, &num_writ );
+    }
+    return rc;
+}
+
+static rc_t OpenBindingsFile(KKeyStore* self, const KFile** ret)
+{
+    rc_t rc = 0;
+    if (self->bindingsFile == NULL)
+    {
+        String* home;
+        if ( self->kfg == NULL )
+            rc = KConfigMake( (KConfig**) &(self -> kfg), NULL );
+        if (rc == 0)
+        {
+            if (KConfigReadString(self->kfg, "NCBI_HOME", &home) == 0 ||
+                KConfigReadString(self->kfg, "HOME", &home) == 0 ||
+                KConfigReadString(self->kfg, "USERPROFILE", &home) == 0 )
+            {
+                size_t num_writ;
+                rc = string_printf(defaultBindingsFile, sizeof(defaultBindingsFile), &num_writ, "%S/objid.mapping", home);
+                if (rc == 0)
+                    self->bindingsFile = defaultBindingsFile;
+                StringWhack(home);
+            }
+            else
+                rc = RC ( rcVFS, rcMgr, rcOpening, rcEnvironment, rcNull );
+        }
+    }
+    
+    if (rc == 0)
+    {
+        rc_t rc2;
+        KDirectory* wd;
+        rc = KDirectoryNativeDir (&wd);
+        if (rc == 0)
+            rc = KDirectoryOpenFileRead(wd, ret, "%s", self->bindingsFile);
+        else
+            *ret = NULL;
+            
+        rc2 = KDirectoryRelease(wd);
+        if (rc == 0)
+            rc = rc2;
+    }
+    return rc;
+}
+ 
+LIB_EXPORT rc_t CC KKeyStoreRegisterObject(struct KKeyStore* self, uint32_t oid, const struct String* newName)
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        return RC ( rcKFG, rcStorage, rcInitializing, rcSelf, rcNull );
+    else if ( newName == NULL )
+        rc = RC ( rcKFG, rcStorage, rcInitializing, rcParam, rcNull );
+    else
+    {
+        char oidString[MAX_OBJID_SIZE];
+        size_t num_writ;
+        rc = string_printf(oidString, sizeof(oidString), &num_writ, "%d", oid);
+        if (rc == 0)
+        {
+            rc_t rc2;
+            const KFile* file;
+            char oldName[MAX_NAME_SIZE];
+            size_t num_read;
+            
+            rc = OpenBindingsFile(self, &file);
+            if (rc == 0)
+            {   /* see if already registered */
+                if (LocateObjectId(file, oidString, oldName, sizeof(oldName), &num_read) == 0 &&
+                    string_cmp(oldName, num_read, newName->addr, newName->size, (uint32_t)newName->size) != 0)
+                    rc = RC ( rcVFS, rcMgr, rcRegistering, rcId, rcExists );
+                rc2 = KFileRelease(file);
+                if (rc == 0)
+                    rc = rc2;
+            }
+            else /* no bindings file; will create */
+                rc = 0;
+            
+            if (rc == 0)
+            {   /* not registered; lock the bindings file and append the binding */
+                KDirectory* wd;
+                rc = KDirectoryNativeDir (&wd);
+                if (rc == 0)
+                {
+                    KFile* lockedFile;
+                    /*TODO: loop until locking succeeds or times out */
+                    rc = KDirectoryCreateExclusiveAccessFile(wd, &lockedFile, true, 0600, kcmOpen, "%s", self->bindingsFile);
+                    if (rc == 0)
+                    {
+                        if (LocateObjectId(lockedFile, oidString, oldName, sizeof(oldName), &num_read) == 0)
+                        {   /* somebody inserted the binding before we locked - make sure their binding was the same */
+                            if (string_cmp(oldName, num_read, newName->addr, newName->size, (uint32_t)newName->size) != 0)
+                                rc = RC ( rcVFS, rcMgr, rcRegistering, rcId, rcExists );
+                        }
+                        else
+                            rc = AppendObject(lockedFile, oidString, newName);
+                            
+                        rc2 = KFileRelease(lockedFile);
+                        if (rc == 0)
+                            rc = rc2;
+                    }
+                    rc2 = KDirectoryRelease(wd);
+                    if (rc == 0)
+                        rc = rc2;
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VKKeyStoreGetObjectId(const struct KKeyStore* self, const struct String* name, uint32_t* oid)
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        return RC ( rcKFG, rcStorage, rcRetrieving, rcSelf, rcNull );
+    else if ( oid == NULL )
+        rc = RC ( rcKFG, rcStorage, rcRetrieving, rcParam, rcNull );
+    else
+    {
+        const KFile* file;
+        rc = OpenBindingsFile((KKeyStore*)self, &file);
+        if (rc == 0)
+        {
+            rc_t rc2;
+            char id_buf[MAX_OBJID_SIZE+1];
+            size_t id_read;
+            if (LocateObject(file, name->addr, name->size, id_buf, MAX_OBJID_SIZE, &id_read) == 0)
+            {
+                char* endptr;
+                unsigned long int res;
+                id_buf[id_read] = 0;
+                res = strtou32(id_buf, &endptr, 10);
+                if (*endptr != 0)
+                    rc = RC ( rcKFG, rcStorage, rcRetrieving, rcId, rcCorrupt);
+                else
+                    *oid = (uint32_t)res;
+            }
+            else
+                rc = RC ( rcKFG, rcStorage, rcRetrieving, rcName, rcNotFound);
+            
+            rc2 = KFileRelease(file);
+            if (rc == 0)
+                rc = rc2;
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KKeyStoreGetObjectName(const struct KKeyStore* self, uint32_t oid, const struct String** result)
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        return RC ( rcKFG, rcStorage, rcRetrieving, rcSelf, rcNull );
+    else if ( result == NULL )
+        rc = RC ( rcKFG, rcStorage, rcRetrieving, rcParam, rcNull );
+    else
+    {
+        char oidString[MAX_OBJID_SIZE];
+        size_t num_writ;
+        rc = string_printf(oidString, sizeof(oidString), &num_writ, "%d", oid);
+        if (rc == 0)
+        {
+            const KFile* file;
+            
+            rc = OpenBindingsFile((KKeyStore*)self, &file);
+            if (rc == 0)
+            {   
+                rc_t rc2;
+                char name[MAX_NAME_SIZE];
+                size_t num_read;
+                if (LocateObjectId(file, oidString, name, sizeof(name), &num_read) == 0)
+                {
+                    String* res = (String*)malloc(sizeof(String) + num_read);
+                    if (res != NULL)
+                    {
+                        string_copy((char*)res + sizeof(String), num_read, name, num_read);
+                        StringInit(res, (char*)res + sizeof(String), num_read, (uint32_t)num_read);
+                        *result = res;
+                    }
+                    else
+                        rc = RC ( rcKFG, rcStorage, rcRetrieving, rcMemory, rcExhausted );
+                }
+                else
+                    rc = RC ( rcKFG, rcStorage, rcRetrieving, rcId, rcNotFound);
+                    
+                rc2 = KFileRelease(file);
+                if (rc == 0)
+                    rc = rc2;
+            }
+        }
+    }
+    return rc;
+}
+
diff --git a/libs/kfg/kfg-lex.h b/libs/kfg/kfg-lex.h
new file mode 100644
index 0000000..0aee8e0
--- /dev/null
+++ b/libs/kfg/kfg-lex.h
@@ -0,0 +1,67 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_kfg_lex_
+#define _h_kfg_lex_
+
+#include <string.h>
+#include <stdbool.h>
+
+typedef struct KFGToken
+{
+    const char* tokenText;
+    size_t tokenLength;
+    int tokenId;
+    size_t line_no;
+    size_t column_no;
+} KFGToken;
+
+typedef struct KFGScanBlock
+{
+    void* scanner;
+    void* buffer;
+    void* self; 
+    const char* file;
+    KFGToken* lastToken; /* used for error reporting */
+    bool (*look_up_var)(void * self, struct KFGToken*);
+    void (*report_error)(struct KFGScanBlock* sb, const char* msg);
+} KFGScanBlock;
+
+struct VNamelist;
+typedef union 
+{
+	KFGToken            pb;
+	struct VNamelist*   namelist;
+} KFGSymbol;
+
+extern bool KFGScan_yylex_init(KFGScanBlock* sb, const char *str); /* false = out of memory */
+extern void KFGScan_yylex_destroy(KFGScanBlock* sb);
+
+extern void KFGScan_set_debug(bool on, KFGScanBlock* scannerContext);
+
+extern int KFGScan_yylex(KFGSymbol* pb, KFGScanBlock* scannerContext);
+
+#endif /* _h_kfg_lex_ */
diff --git a/libs/kfg/kfg-parse.h b/libs/kfg/kfg-parse.h
new file mode 100644
index 0000000..2ea69ff
--- /dev/null
+++ b/libs/kfg/kfg-parse.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_kfg_parse_
+#define _h_kfg_parse_
+
+#include "kfg-lex.h"
+
+#include <klib/rc.h>
+
+typedef struct KFGParseBlock
+{
+    rc_t (*write_nvp)(void * self, const char* name, size_t nameLen, struct VNamelist*);
+} KFGParseBlock;
+
+extern int KFG_parse(KFGParseBlock* pb, KFGScanBlock* scannerContext);
+
+#endif /* _h_kfg_parse_ */
diff --git a/libs/kfg/kfg-priv.h b/libs/kfg/kfg-priv.h
new file mode 100644
index 0000000..27e5556
--- /dev/null
+++ b/libs/kfg/kfg-priv.h
@@ -0,0 +1,32 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfg_priv_
+#define _h_kfg_priv_
+
+extern void add_aws_nodes ( KConfig *self );
+
+#endif /* _h_kfg_priv_ */
diff --git a/libs/kfg/ngc-priv.h b/libs/kfg/ngc-priv.h
new file mode 100644
index 0000000..8a6a6fa
--- /dev/null
+++ b/libs/kfg/ngc-priv.h
@@ -0,0 +1,59 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfg_ngc_priv_
+#define _h_kfg_ngc_priv_
+
+#ifndef _h_klib_data_buffer
+#include <klib/data-buffer.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KNgcObj
+{
+    KRefcount refcount;
+    KDataBuffer buffer;
+    String version, encryptionKey, downloadTicket, description;
+    uint32_t projectId;
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfg_ngc_priv_ */
diff --git a/libs/kfg/ngc.c b/libs/kfg/ngc.c
new file mode 100644
index 0000000..87d34aa
--- /dev/null
+++ b/libs/kfg/ngc.c
@@ -0,0 +1,484 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kfg/extern.h>
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/data-buffer.h>
+#include <klib/refcount.h>
+
+#include <kfg/ngc.h>
+#include <kfs/file.h>
+#include <kfs/subfile.h>
+#include <kfs/gzip.h>
+
+#include <strtol.h>
+
+#include "ngc-priv.h"
+
+#include <string.h>
+#include <sysalloc.h>
+
+
+#define MIN_ENC_KEY_LEN 1
+#define MAX_ENC_KEY_LEN 256
+#define MIN_DNLD_TICKET_LEN 1
+#define MAX_DNLD_TICKET_LEN 256
+#define MIN_DESCRIPTION_LEN 1
+#define MAX_DESCRIPTION_LEN 256
+
+static rc_t KNgcObjWhack ( KNgcObj * self )
+{
+    KDataBufferWhack ( & self-> buffer );
+    free( self );
+    return 0;
+}
+
+
+static rc_t KNgcObjParseIdKeyTicketDesc ( KNgcObj * self, uint32_t offset )
+{
+    rc_t rc = 0;
+    uint64_t i;
+    uint64_t l = ( self -> buffer . elem_count ) - offset;
+    uint8_t state;
+    const char * ptr = ( const char * ) self -> buffer . base;
+    String projectId;
+    String * dst = & projectId;
+
+    memset ( & projectId, 0, sizeof projectId );
+
+    ptr += offset;
+    dst -> addr = ptr;
+    for ( i = 0, state = 0; i < l && state < 4; i++ )
+    {
+        if ( ptr[ i ] == '|' )
+        {
+            dst -> size = dst -> len;
+            switch( state )
+            {
+                case 0 : dst = & self -> encryptionKey; break;
+                case 1 : dst = & self -> downloadTicket; break;
+                case 2 : dst = & self -> description; break;
+            }
+            state ++;
+            if ( state < 4 )
+            {
+                if ( i < ( l - 1 ) )
+                    dst -> addr = &( ptr[ i + 1 ] );
+            }
+        }
+        else
+        {
+            ( dst -> len )++;
+        }
+    }
+    if ( projectId . addr == NULL ||
+         self -> encryptionKey . addr == NULL ||
+         self -> downloadTicket . addr == NULL ||
+         self -> description . addr == NULL )
+    {
+        rc = RC ( rcKFG, rcFile, rcParsing, rcParam, rcInvalid );
+    }
+    else if ( projectId . len < 1 ||
+               self -> encryptionKey . len < 1 ||
+               self -> downloadTicket . len < 1 ||
+               self -> description . len < 1 )
+    {
+        rc = RC ( rcKFG, rcFile, rcParsing, rcParam, rcInvalid );
+    }
+
+    /* the following tests may be version depended */
+
+    /* test to verify that the project ID is a valid Integer */
+    if ( rc == 0 )
+    {
+        char * end;
+        self -> projectId = strtou32 ( projectId . addr, & end, 10 );
+        if ( ( end - ( char* ) projectId . addr ) != projectId . size )
+            rc = RC ( rcKFG, rcFile, rcParsing, rcParam, rcInvalid );
+    }
+
+    /* test that the download ticket and the encKey do have a minimum and maximum length */
+    if ( rc == 0 )
+    {
+        if ( ( self -> downloadTicket . len < MIN_DNLD_TICKET_LEN ) ||
+             ( self -> downloadTicket . len > MAX_DNLD_TICKET_LEN ) )
+            rc = RC ( rcKFG, rcFile, rcParsing, rcParam, rcInvalid );
+    }
+
+    if ( rc == 0 )
+    {
+        if ( ( self -> encryptionKey . len < MIN_ENC_KEY_LEN ) ||
+             ( self -> encryptionKey . len > MAX_ENC_KEY_LEN ) )
+            rc = RC ( rcKFG, rcFile, rcParsing, rcParam, rcInvalid );
+    }
+
+    if ( rc == 0 )
+    {
+        if ( ( self -> description . len < MIN_DESCRIPTION_LEN ) ||
+             ( self -> description . len > MAX_DESCRIPTION_LEN ) )
+            rc = RC ( rcKFG, rcFile, rcParsing, rcParam, rcInvalid );
+    }
+
+    return rc;
+}
+
+
+static bool KNgcParseUntilfound ( const char * src, uint32_t l, const char * term, uint32_t term_count, String * dst )
+{
+    bool res = false;
+    uint32_t i;
+
+    dst -> addr = src;
+    for ( i = 0; i < l && !res; ++i )
+    {
+        char * found = string_chr ( term, term_count, src[ i ] );
+        res = ( found != NULL );
+        if ( !res )
+            ( dst -> len )++;
+    }
+    if ( res )
+        dst -> size = dst -> len;
+    else
+        dst -> size = dst -> len = 0;
+    return res;
+}
+
+
+static rc_t KNgcObjParseBuffer ( KNgcObj * self )
+{
+    rc_t rc = 0;
+    uint32_t l = ( uint32_t ) self -> buffer . elem_count;
+    const char * ptr = ( const char * ) self -> buffer . base;
+
+    const char s_version[] = "version ";
+    const char s_v1_0[] = "1.0";
+
+    if ( ( size_t ) l != self -> buffer . elem_count )
+        l = INT32_MAX;
+
+    if ( string_cmp( s_version, sizeof s_version - 1, ptr, l, sizeof s_version - 1 ) != 0 )
+        rc = RC( rcKFG, rcFile, rcParsing, rcFormat, rcUnrecognized );
+    else if ( !KNgcParseUntilfound ( &( ptr[ 8 ] ), l - 8, "\n\r", 2, & self -> version ) )
+        rc = RC( rcKFG, rcFile, rcParsing, rcFormat, rcUnrecognized );
+
+    if ( rc == 0 )
+    {
+        if ( self -> version . len != 3 )
+            rc = RC( rcKFG, rcFile, rcParsing, rcFormat, rcUnrecognized );
+        else if ( string_cmp( s_v1_0, sizeof s_v1_0 - 1, self -> version . addr,  sizeof s_v1_0 - 1, sizeof s_v1_0 - 1 ) != 0 )
+            rc = RC( rcKFG, rcFile, rcParsing, rcFormat, rcUnrecognized );
+    }
+
+    if ( rc == 0 )
+    {
+        uint32_t offset = sizeof s_version - 1 + ( self -> version . len ) + 1;
+        rc = KNgcObjParseIdKeyTicketDesc ( self, offset );
+    }
+    return rc;
+}
+
+
+static rc_t KNgcObjInitFromString ( KNgcObj * self, const char * line )
+{
+    rc_t rc = 0;
+    uint32_t len = string_measure( line, NULL );
+    rc = KDataBufferResize ( &self -> buffer, len + 20 );
+    if ( rc == 0 )
+    {
+        size_t written;
+        rc = string_printf( self -> buffer . base, len + 20, &written, "version 1.0\n%s", line );
+        if ( rc == 0 )
+        {
+            self -> buffer . elem_count = written;
+            rc = KNgcObjParseBuffer ( self );
+        }
+    }
+    return rc;
+}
+
+
+static rc_t KNgcObjInitFromFile ( KNgcObj * self, const struct KFile * src )
+{
+    char hdr [ 8 ];
+    size_t num_read;
+    rc_t rc = KFileReadAll ( src, 0, hdr, sizeof hdr, & num_read );
+    if ( rc == 0 )
+    {
+        if ( num_read != sizeof hdr )
+            rc = RC( rcKFG, rcFile, rcReading, rcFile, rcWrongType );
+        else if ( memcmp( hdr, "ncbi_gap", sizeof hdr ) != 0 )
+            rc = RC( rcKFG, rcFile, rcReading, rcFile, rcWrongType );
+        else
+        {
+            uint64_t src_size;
+            rc = KFileSize ( src, & src_size );
+            if ( rc == 0 )
+            {
+                const struct KFile * sub;
+                rc = KFileMakeSubRead ( &sub, src, sizeof hdr, src_size - sizeof hdr );
+                if ( rc == 0 )
+                {
+                    const struct KFile * gzip;
+                    rc = KFileMakeGzipForRead ( & gzip, sub );
+                    if ( rc == 0 )
+                    {
+                        size_t to_read = ( src_size * 10 );
+                        /* guessing that the unzip version will not be bigger that 10 x the zipped one */
+                        rc = KDataBufferResize ( & self -> buffer, to_read );
+                        if ( rc == 0 )
+                        {
+                            size_t num_read;
+                            rc = KFileReadAll ( gzip, 0,  self -> buffer . base, to_read, & num_read );
+                            if ( rc == 0 )
+                            {
+                                self -> buffer . elem_count = num_read;
+                                rc = KNgcObjParseBuffer ( self );
+                            }
+                        }
+                        KFileRelease ( gzip );
+                    }
+                    KFileRelease ( sub );
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KNgcObjMakeFromString ( const KNgcObj **ngc, const char * line )
+{
+    rc_t rc;
+    if ( ngc == NULL || line == NULL )
+        rc = RC ( rcKFG, rcMgr, rcAllocating, rcParam, rcNull );
+    else
+    {
+        struct KNgcObj * f = calloc ( 1, sizeof * f );
+        if ( f == NULL )
+            rc = RC ( rcKFG, rcMgr, rcAllocating, rcMemory, rcExhausted );
+        else
+        {
+            KRefcountInit ( & f -> refcount, 1, "KNgcObj", "init", "kfg" );
+            memset ( & f -> buffer, 0, sizeof f -> buffer ); 
+            rc = KDataBufferMakeBytes ( & f -> buffer, 0 );
+            if ( rc == 0 )
+            {
+                rc = KNgcObjInitFromString( f, line );
+                if ( rc == 0 )
+                {
+                    * ngc = f;
+                    return rc;
+                }
+            }
+            KNgcObjWhack ( f );
+        }
+        * ngc = NULL;
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KNgcObjMakeFromFile ( const KNgcObj **ngc, const struct KFile * src )
+{
+    rc_t rc;
+    if ( ngc == NULL || src == NULL )
+        rc = RC ( rcKFG, rcFile, rcAllocating, rcParam, rcNull );
+    else
+    {
+        struct KNgcObj * f = calloc ( 1, sizeof * f );
+        if ( f == NULL )
+            rc = RC ( rcKFG, rcFile, rcAllocating, rcMemory, rcExhausted );
+        else
+        {
+            KRefcountInit ( & f -> refcount, 1, "KNgcObj", "init", "kfg" );
+            memset ( & f -> buffer, 0, sizeof f -> buffer ); 
+            rc = KDataBufferMakeBytes ( & f -> buffer, 0 );
+            if ( rc == 0 )
+            {
+                rc = KNgcObjInitFromFile( f, src );
+                if ( rc == 0 )
+                {
+                    * ngc = f;
+                    return rc;
+                }
+            }
+            KNgcObjWhack ( f );
+        }
+        * ngc = NULL;
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KNgcObjAddRef ( const KNgcObj *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd( &self->refcount, "KNgcObj" ) )
+        {
+        case krefLimit:
+            return RC ( rcKFG, rcFile, rcAttaching, rcRefcount, rcExcessive );
+        case krefNegative:
+            return RC ( rcKFG, rcFile, rcAttaching, rcRefcount, rcInvalid );
+        }
+    }
+    return 0;
+}
+
+
+LIB_EXPORT rc_t CC KNgcObjRelease ( const KNgcObj *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KNgcObj" ) )
+        {
+        case krefWhack:
+            return KNgcObjWhack ( ( KNgcObj * ) self );
+        case krefNegative:
+            return RC ( rcKFG, rcFile, rcReleasing, rcRefcount, rcInvalid );
+        }
+    }
+    return 0;
+}
+
+
+LIB_EXPORT rc_t CC KNgcObjPrint ( const KNgcObj *self, char * buffer, size_t buffer_size, size_t * written )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcFile, rcFormatting, rcSelf, rcNull );
+    else if ( buffer == NULL )
+        rc = RC ( rcKFG, rcFile, rcFormatting, rcParam, rcNull );
+    else
+        rc = string_printf( buffer, buffer_size, written,
+                            "Vers: '%S', ID:'%u', Key:'%S', Ticket:'%S', Desc:'%S'",
+                            &self -> version, self -> projectId, &self -> encryptionKey,
+                            &self -> downloadTicket, &self -> description );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KNgcObjWriteToFile ( const KNgcObj *self, struct KFile * dst )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcFile, rcWriting, rcSelf, rcNull );
+    else if ( dst == NULL )
+        rc = RC ( rcKFG, rcFile, rcWriting, rcParam, rcNull );
+    else
+    {
+        size_t written_to_hdr;
+        char hdr [ 10 ];
+        rc = string_printf( hdr, sizeof hdr, &written_to_hdr, "ncbi_gap" );
+        if ( rc == 0 )
+        {
+            size_t written_to_file;
+            rc = KFileWriteAll ( dst, 0, hdr, written_to_hdr, &written_to_file );
+            if ( rc == 0 && written_to_hdr == written_to_file )
+            {
+                struct KFile * sub;
+                rc = KFileMakeSubUpdate ( &sub, dst, written_to_file, 4096 );
+                if ( rc == 0 )
+                {
+                    struct KFile * gzip;
+                    rc = KFileMakeGzipForWrite ( &gzip, sub );
+                    if ( rc == 0 )
+                    {
+                        size_t written_to_buffer;
+                        char buffer[ 1024 ];
+                        rc = string_printf( buffer, sizeof buffer, &written_to_buffer,
+                                            "version %S\n%u|%S|%S|%S",
+                                            &self -> version, self -> projectId, &self -> encryptionKey,
+                                            &self -> downloadTicket, &self -> description );
+                        if ( rc == 0 )
+                        {
+                            size_t written_to_gzip;
+                            rc = KFileWriteAll ( gzip, 0, buffer, written_to_buffer, &written_to_gzip );
+                        }
+                        KFileRelease ( gzip );
+                    }
+                    KFileRelease ( sub );
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KNgcObjWriteKeyToFile ( const KNgcObj *self, struct KFile * dst )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcFile, rcWriting, rcSelf, rcNull );
+    else if ( dst == NULL )
+        rc = RC ( rcKFG, rcFile, rcWriting, rcParam, rcNull );
+    else if ( self -> encryptionKey . addr == NULL || self -> encryptionKey . len < 1 )
+        rc = RC ( rcKFG, rcFile, rcWriting, rcParam, rcInvalid );
+    else
+    {
+        size_t written_to_file;
+        rc = KFileWriteAll ( dst, 0, self -> encryptionKey . addr, self -> encryptionKey . len, &written_to_file );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KNgcObjGetProjectId ( const KNgcObj *self, uint32_t * id )
+{
+    rc_t rc;
+    if ( id == NULL )
+        rc = RC ( rcKFG, rcFile, rcFormatting, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcFile, rcFormatting, rcSelf, rcNull );
+        else
+        {
+            * id = self -> projectId;
+            return 0;
+        }
+
+        * id = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KNgcObjGetProjectName ( const KNgcObj *self, char * buffer, size_t buffer_size, size_t * written )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcFile, rcFormatting, rcSelf, rcNull );
+    else if ( buffer == NULL )
+        rc = RC ( rcKFG, rcFile, rcFormatting, rcParam, rcNull );
+    else
+        rc = string_printf( buffer, buffer_size, written, "dbGaP-%u", self -> projectId );
+    return rc;
+}
+
diff --git a/libs/kfg/properties.c b/libs/kfg/properties.c
new file mode 100644
index 0000000..57860bf
--- /dev/null
+++ b/libs/kfg/properties.c
@@ -0,0 +1,768 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/vector.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/namelist.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <kfg/config.h>
+#include <kfg/repository.h>
+#include <kfg/ngc.h>
+#include "ngc-priv.h"
+
+#include <va_copy.h>
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static rc_t KConfig_Get_Repository_State( const KConfig *self,
+    bool * state, bool negate, bool dflt, const char * path, ... )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+    else if ( state == NULL || path == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else {
+        va_list args;
+        char tmp[ 4096 ];
+        size_t num_writ;
+
+        *state = dflt;
+        va_start ( args, path );
+        rc = string_vprintf ( tmp, sizeof tmp, & num_writ, path, args );
+        va_end ( args );
+
+        if ( rc == 0 )
+        {
+            bool rd_state;
+            rc = KConfigReadBool ( self, tmp, &rd_state );
+            if ( rc == 0 )
+            {
+                if ( negate )
+                    *state = !rd_state;
+                else
+                    *state = rd_state;
+            }
+            else
+                rc = 0;     /* it is OK to not find the node, return the default then... */
+        }
+    }
+    return rc;
+}
+
+
+static rc_t KConfig_Set_Repository_State( KConfig *self,
+    bool state, bool negate, const char * path, ... )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcWriting, rcSelf, rcNull );
+    else if ( path == NULL )
+        rc = RC ( rcKFG, rcNode, rcWriting, rcParam, rcNull );
+    else
+    {
+        va_list args;
+        char tmp[ 4096 ];
+        size_t num_writ;
+
+        va_start ( args, path );
+        rc = string_vprintf ( tmp, sizeof tmp, & num_writ, path, args );
+        va_end ( args );
+
+        if ( rc == 0 )
+        {
+            if ( negate )
+                rc = KConfigWriteBool( self, tmp, !state );
+            else
+                rc = KConfigWriteBool( self, tmp, state );
+        }
+    }
+    return rc;
+}
+
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static rc_t KConfig_Get_Repository_String( const KConfig *self,
+    char * buffer, size_t buffer_size, size_t * written, const char * path, ... )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+    else if ( buffer == NULL || path == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    {
+        va_list args;
+        char tmp[ 4096 ];
+        size_t num_writ;
+
+        va_start ( args, path );
+        rc = string_vprintf ( tmp, sizeof tmp, & num_writ, path, args );
+        va_end ( args );
+
+        if ( rc == 0 )
+        {
+            struct String * res;
+            rc = KConfigReadString ( self, tmp, &res );
+            if ( rc == 0 )
+            {
+                rc = string_printf( buffer, buffer_size, written, "%S", res );
+                StringWhack ( res );
+            }
+        }
+    }
+    return rc;
+}
+
+
+static rc_t KConfig_Set_Repository_String( KConfig *self,
+    const char * value, const char * path, ... )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcWriting, rcSelf, rcNull );
+    else if ( path == NULL )
+        rc = RC ( rcKFG, rcNode, rcWriting, rcParam, rcNull );
+    else
+    {
+        va_list args;
+        char tmp[ 4096 ];
+        size_t num_writ;
+
+        va_start ( args, path );
+        rc = string_vprintf ( tmp, sizeof tmp, & num_writ, path, args );
+        va_end ( args );
+
+        if ( rc == 0 )
+            rc = KConfigWriteString( self, tmp, value );
+    }
+    return rc;
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* get/set HTTP proxy path */
+LIB_EXPORT rc_t CC KConfig_Get_Http_Proxy_Path( const KConfig *self,
+    char *buffer, size_t buffer_size, size_t *written )
+{
+    return KConfig_Get_Repository_String
+        (self, buffer, buffer_size, written, "http/proxy/path");
+}
+
+LIB_EXPORT rc_t CC KConfig_Set_Http_Proxy_Path
+    ( KConfig *self, const char *value )
+{
+    return KConfig_Set_Repository_String(self, value, "http/proxy/path");
+}
+
+/* get/set enabled-state for HTTP proxy */
+LIB_EXPORT rc_t CC KConfig_Get_Http_Proxy_Enabled
+    ( const KConfig *self, bool *enabled, bool dflt )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL ) {
+        rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+    }
+    else if ( enabled == NULL ) {
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    }
+    else {
+        *enabled = dflt;
+        KConfigReadBool ( self, "http/proxy/enabled", enabled );
+        /* errors are ignored - then default value is returned */
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfig_Set_Http_Proxy_Enabled
+    ( KConfig *self, bool enabled )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL ) {
+        rc = RC ( rcKFG, rcNode, rcWriting, rcSelf, rcNull );
+    }
+    else {
+        rc = KConfigWriteBool( self, "http/proxy/enabled", enabled );
+    }
+
+    return rc;
+}
+
+/* -------------------------------------------------------------------------- */
+/* get/set priority of environmnet vs. configuration for HTTP proxy */
+LIB_EXPORT rc_t CC KConfig_Has_Http_Proxy_Env_Higher_Priority
+    ( const KConfig *self, bool *enabled )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL ) {
+        rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+    }
+    else if ( enabled == NULL ) {
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    }
+    else {
+        String * res = NULL;
+        * enabled = false;
+        rc = KConfigReadString ( self, "/http/proxy/use", &res );
+        if ( rc == 0 ) {
+            String v;
+            CONST_STRING ( & v, "env,kfg" );
+            if ( StringEqual ( res, & v ) ) {
+                * enabled = true;
+            }
+        } else {
+            rc = 0;
+        }
+        free ( res );
+    }
+
+    return rc;
+}
+LIB_EXPORT rc_t CC KConfig_Set_Http_Proxy_Env_Higher_Priority
+    ( KConfig *self, bool enabled )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL ) {
+        rc = RC ( rcKFG, rcNode, rcWriting, rcSelf, rcNull );
+    }
+    else {
+        rc = KConfigWriteString
+            ( self, "/http/proxy/use", enabled ? "env,kfg" : "kfg,env" );
+    }
+
+    return rc;
+}
+
+/* -------------------------------------------------------------------------- */
+
+LIB_EXPORT rc_t CC KConfig_Get_Home( const KConfig *self, char * buffer, size_t buffer_size, size_t * written )
+{   return KConfig_Get_Repository_String( self, buffer, buffer_size, written, "HOME" ); }
+
+#define USER_DEFAULT_PATH "/repository/user/default-path"
+LIB_EXPORT rc_t CC KConfig_Get_Default_User_Path( const KConfig *self, char * buffer, size_t buffer_size, size_t * written )
+{   return KConfig_Get_Repository_String( self, buffer, buffer_size, written, USER_DEFAULT_PATH ); }
+LIB_EXPORT rc_t CC KConfig_Set_Default_User_Path( KConfig *self, const char * value )
+{   return KConfig_Set_Repository_String( self, value, USER_DEFAULT_PATH ); }
+
+/* -------------------------------------------------------------------------- */
+
+#define PATH_REPOSITORY_REMOTE_DISABLED "/repository/remote/disabled"
+LIB_EXPORT rc_t CC KConfig_Get_Remote_Access_Enabled
+    ( const KConfig *self, bool * enabled )
+{
+    return KConfig_Get_Repository_State( self, enabled,
+        true, true, PATH_REPOSITORY_REMOTE_DISABLED );
+}
+LIB_EXPORT rc_t CC KConfig_Set_Remote_Access_Enabled
+    ( KConfig *self, bool enabled )
+{
+    return KConfig_Set_Repository_State( self, enabled,
+        true, PATH_REPOSITORY_REMOTE_DISABLED );
+}
+
+#define PATH_REPOSITORY_REMOTE_MAIN_CGI_DISABLED \
+    "/repository/remote/main/CGI/disabled"
+LIB_EXPORT rc_t CC KConfig_Get_Remote_Main_Cgi_Access_Enabled
+    ( const KConfig *self, bool * enabled )
+{
+    return KConfig_Get_Repository_State( self, enabled,
+        true, true, PATH_REPOSITORY_REMOTE_MAIN_CGI_DISABLED );
+}
+
+#define PATH_REPOSITORY_REMOTE_AUX_NCBI_DISABLED \
+    "/repository/remote/aux/NCBI/disabled"
+LIB_EXPORT rc_t CC KConfig_Get_Remote_Aux_Ncbi_Access_Enabled
+    ( const KConfig *self, bool * enabled )
+{
+    return KConfig_Get_Repository_State( self, enabled,
+        true, true, PATH_REPOSITORY_REMOTE_DISABLED );
+}
+
+#define PATH_REPOSITORY_SITE_DISABLED "/repository/site/disabled"
+#define PATH_REPOSITORY_USER_DISABLED "/repository/user/disabled"
+LIB_EXPORT rc_t CC KConfig_Get_Site_Access_Enabled( const KConfig *self, bool * enabled )
+{   return KConfig_Get_Repository_State( self, enabled, true, true, PATH_REPOSITORY_SITE_DISABLED ); }
+LIB_EXPORT rc_t CC KConfig_Set_Site_Access_Enabled( KConfig *self, bool enabled )
+{   return KConfig_Set_Repository_State( self, enabled, true, PATH_REPOSITORY_SITE_DISABLED ); }
+
+LIB_EXPORT rc_t CC KConfig_Get_User_Access_Enabled( const KConfig *self, bool * enabled )
+{   return KConfig_Get_Repository_State( self, enabled, true, true, PATH_REPOSITORY_USER_DISABLED ); }
+LIB_EXPORT rc_t CC KConfig_Set_User_Access_Enabled( KConfig *self, bool enabled )
+{   return KConfig_Set_Repository_State( self, enabled, true, PATH_REPOSITORY_USER_DISABLED ); }
+
+
+#define PATH_REPOSITORY_USER_PUBLIC_DISABLED "/repository/user/main/public/disabled"
+LIB_EXPORT rc_t CC KConfig_Get_User_Public_Enabled( const KConfig *self, bool * enabled )
+{   return KConfig_Get_Repository_State( self, enabled, true, true, PATH_REPOSITORY_USER_PUBLIC_DISABLED ); }
+LIB_EXPORT rc_t CC KConfig_Set_User_Public_Enabled( KConfig *self, bool enabled )
+{   return KConfig_Set_Repository_State( self, enabled, true, PATH_REPOSITORY_USER_PUBLIC_DISABLED ); }
+
+#define PATH_REPOSITORY_USER_PUBLIC_CACHE_ENABLED "/repository/user/main/public/cache-enabled"
+LIB_EXPORT rc_t CC KConfig_Get_User_Public_Cached( const KConfig *self, bool * enabled )
+{   return KConfig_Get_Repository_State( self, enabled, false, false, PATH_REPOSITORY_USER_PUBLIC_CACHE_ENABLED ); }
+LIB_EXPORT rc_t CC KConfig_Set_User_Public_Cached( KConfig *self, bool enabled )
+{   return KConfig_Set_Repository_State( self, enabled, false, PATH_REPOSITORY_USER_PUBLIC_CACHE_ENABLED ); }
+
+#define PATH_REPOSITORY_USER_PROTECTED_CACHE_ENABLED "/repository/user/protected/%s/cache-enabled"
+LIB_EXPORT rc_t CC KConfig_Get_User_Protected_Cached( const KConfig *self, bool * enabled, const char * name )
+{   return KConfig_Get_Repository_State( self, enabled, false, false, PATH_REPOSITORY_USER_PROTECTED_CACHE_ENABLED, name ); }
+LIB_EXPORT rc_t CC KConfig_Set_User_Protected_Cached( KConfig *self, bool enabled, const char * name )
+{   return KConfig_Set_Repository_State( self, enabled, false, PATH_REPOSITORY_USER_PROTECTED_CACHE_ENABLED, name ); }
+
+#define PATH_REPOSITORY_USER_PUBLIC_CACHE_LOCATION "/repository/user/main/public/root"
+LIB_EXPORT rc_t CC KConfig_Get_User_Public_Cache_Location( const KConfig *self,
+    char * value, size_t value_size, size_t * written )
+{   return KConfig_Get_Repository_String( self, value, value_size, written, PATH_REPOSITORY_USER_PUBLIC_CACHE_LOCATION ); }
+LIB_EXPORT rc_t CC KConfig_Set_User_Public_Cache_Location( KConfig *self, const char * value )
+{   return KConfig_Set_Repository_String( self, value, PATH_REPOSITORY_USER_PUBLIC_CACHE_LOCATION ); }
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+LIB_EXPORT rc_t CC KConfigGetProtectedRepositoryCount( const KConfig *self, uint32_t * count )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+    else if ( count == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        const struct KConfigNode * node;
+        rc = KConfigOpenNodeRead ( self, &node, "/repository/user/protected" );
+        if ( rc == 0 )
+        {
+            struct KNamelist * names;
+            rc = KConfigNodeListChildren ( node, &names );
+            if ( rc == 0 )
+            {
+                rc = KNamelistCount ( names, count );
+                KNamelistRelease ( names );
+            }
+            KConfigNodeRelease ( node );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KConfigGetProtectedRepositoryName( const KConfig *self,
+    uint32_t id, char * buffer, size_t buffer_size, size_t * written )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+    else if ( buffer == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        const struct KConfigNode * node;
+        rc = KConfigOpenNodeRead ( self, &node, "/repository/user/protected" );
+        if ( rc == 0 )
+        {
+            struct KNamelist * names;
+            rc = KConfigNodeListChildren ( node, &names );
+            if ( rc == 0 )
+            {
+                const char * name;
+                rc = KNamelistGet ( names, id, &name );
+                if ( rc == 0 )
+                    rc = string_printf( buffer, buffer_size, written, "%s", name );
+                KNamelistRelease ( names );
+            }
+            KConfigNodeRelease ( node );
+        }
+    }
+    return rc;
+}
+
+
+static rc_t get_root_dir_of_repository( const struct KConfigNode * node,
+    const char * name, char * buffer, size_t buffer_size, size_t * written )
+{
+    const struct KConfigNode * sub_node;
+    rc_t rc = KConfigNodeOpenNodeRead ( node, &sub_node, "%s/root", name );
+    if ( rc == 0 )
+    {
+        struct String * S;
+        rc = KConfigNodeReadString ( sub_node, &S );
+        if ( rc == 0 )
+        {
+            rc = string_printf( buffer, buffer_size, written, "%S", S );
+            StringWhack ( S );
+        }
+        KConfigNodeRelease ( sub_node );
+    }
+    return rc;
+}
+
+
+static rc_t get_description_of_repository( const struct KConfigNode * node,
+    const char * name, char * buffer, size_t buffer_size, size_t * written )
+{
+    const struct KConfigNode * sub_node;
+    rc_t rc = KConfigNodeOpenNodeRead (node, &sub_node, "%s/description", name);
+    if ( rc == 0 )
+    {
+        struct String * S;
+        rc = KConfigNodeReadString ( sub_node, &S );
+        if ( rc == 0 )
+        {
+            rc = string_printf( buffer, buffer_size, written, "%S", S );
+            StringWhack ( S );
+        }
+        KConfigNodeRelease ( sub_node );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KConfigGetProtectedRepositoryPathById( const KConfig *self,
+    uint32_t id, char * buffer, size_t buffer_size, size_t * written )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+    else if ( buffer == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        const struct KConfigNode * node;
+        rc = KConfigOpenNodeRead ( self, &node, "/repository/user/protected" );
+        if ( rc == 0 )
+        {
+            struct KNamelist * names;
+            rc = KConfigNodeListChildren ( node, &names );
+            if ( rc == 0 )
+            {
+                const char * name;
+                rc = KNamelistGet ( names, id, &name );
+                if ( rc == 0 )
+                    rc = get_root_dir_of_repository( node, name, buffer, buffer_size, written );
+                KNamelistRelease ( names );
+            }
+            KConfigNodeRelease ( node );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfigSetProtectedRepositoryPathById( KConfig *self, uint32_t id, const char * value )
+{
+    char repo_name[ 1024 ];
+    size_t written;
+    rc_t rc = KConfigGetProtectedRepositoryName( self, id, repo_name, sizeof repo_name, &written );
+    if ( rc == 0 )
+        rc = KConfig_Set_Repository_String( self, value, "/repository/user/protected/%s/root", repo_name );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KConfigGetProtectedRepositoryIdByName
+    (const KConfig *self, const char *name, uint32_t *id)
+{
+    if (self == NULL)
+        return RC(rcKFG, rcNode, rcReading, rcSelf, rcNull);
+    else if (name == NULL || id == NULL)
+        return RC(rcKFG, rcNode, rcReading, rcParam, rcNull);
+    else {
+        const struct KConfigNode *node = NULL;
+        rc_t rc
+            = KConfigOpenNodeRead(self, &node, "/repository/user/protected");
+        if (rc == 0) {
+            struct KNamelist *names = NULL;
+            rc = KConfigNodeListChildren(node, &names);
+            if (rc == 0) {
+                uint32_t count = 0;
+                rc = KNamelistCount(names, &count);
+                if (rc == 0) {
+                    if (count == 0)
+                        rc = RC(rcKFG, rcNode, rcReading, rcName, rcNotFound);
+                    else {        /* loop through the names to find the one */
+                        uint32_t i = 0; /* which matches the name parameter */
+                        bool found = false;
+                        size_t name_size = string_size(name);
+                        for (i = 0; i < count && rc == 0; ++i) {
+                            const char *s = NULL;
+                            rc = KNamelistGet(names, i, &s);
+                            if ( rc == 0 && s != NULL ) {
+                                size_t s_size = string_size(s);
+                                if (name_size == s_size) {
+                                    int cmp = string_cmp(name, name_size,
+                                        s, s_size, (uint32_t)s_size);
+                                    found = (cmp == 0);
+                                    if (found) {
+                                        *id = i;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        if (rc == 0 && !found) {
+                            rc = RC
+                                (rcKFG, rcNode, rcReading, rcName, rcNotFound);
+                        }
+                    }
+                }
+                KNamelistRelease(names);
+            }
+            KConfigNodeRelease(node);
+        }
+        return rc;
+    }
+}
+
+LIB_EXPORT rc_t CC KConfigGetProtectedRepositoryPathByName( const KConfig *self,
+    const char * name, char * buffer, size_t buffer_size, size_t * written )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+    else if ( buffer == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        const struct KConfigNode * node;
+        rc = KConfigOpenNodeRead ( self, &node, "/repository/user/protected" );
+        if ( rc == 0 )
+        {
+            struct KNamelist * names;
+            rc = KConfigNodeListChildren ( node, &names );
+            if ( rc == 0 )
+            {
+                uint32_t count;
+                rc = KNamelistCount ( names, &count );
+                if ( rc == 0 )
+                {
+                    if ( count == 0 )
+                        rc = RC ( rcKFG, rcNode, rcReading, rcName, rcNotFound );
+                    else
+                    {
+                        /* loop through the names to find the one which matches the name parameter */
+                        uint32_t i;
+                        bool found = false;
+                        size_t name_size = string_size( name );
+                        for ( i = 0; !found && i < count && rc == 0; ++i )
+                        {
+                            const char * s = NULL;
+                            rc = KNamelistGet ( names, i, &s );
+                            if ( rc == 0 && s != NULL )
+                            {
+                                size_t s_size = string_size( s );
+                                if ( name_size == s_size )
+                                {
+                                    int cmp = string_cmp ( name, name_size,
+                                        s, s_size, (uint32_t)s_size);
+                                    found = ( cmp == 0 );
+                                    if ( found )
+                                        rc = get_root_dir_of_repository( node, s, buffer, buffer_size, written );
+                                }
+                            }
+                        }
+                        if ( rc == 0 && !found )
+                            rc = RC ( rcKFG, rcNode, rcReading, rcName, rcNotFound );
+                    }
+                }
+                KNamelistRelease ( names );
+            }
+            KConfigNodeRelease ( node );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KConfigGetProtectedRepositoryDescriptionByName(
+    const KConfig *self,
+    const char * name, char * buffer, size_t buffer_size, size_t * written )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+    else if ( buffer == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        const struct KConfigNode * node;
+        rc = KConfigOpenNodeRead ( self, &node, "/repository/user/protected" );
+        if ( rc == 0 )
+        {
+            struct KNamelist * names;
+            rc = KConfigNodeListChildren ( node, &names );
+            if ( rc == 0 )
+            {
+                uint32_t count;
+                rc = KNamelistCount ( names, &count );
+                if ( rc == 0 )
+                {
+                    if ( count == 0 )
+                        rc = RC( rcKFG, rcNode, rcReading, rcName, rcNotFound );
+                    else
+                    {
+   /* loop through the names to find the one which matches the name parameter */
+                        uint32_t i;
+                        bool found = false;
+                        size_t name_size = string_size( name );
+                        for ( i = 0; !found && i < count && rc == 0; ++i )
+                        {
+                            const char * s = NULL;
+                            rc = KNamelistGet ( names, i, &s );
+                            if ( rc == 0 && s != NULL )
+                            {
+                                size_t s_size = string_size( s );
+                                if ( name_size == s_size )
+                                {
+                                    int cmp = string_cmp ( name, name_size,
+                                        s, s_size, (uint32_t)s_size);
+                                    found = ( cmp == 0 );
+                                    if ( found )
+                                        rc = get_description_of_repository(node,
+                                            s, buffer, buffer_size, written );
+                                }
+                            }
+                        }
+                        if ( rc == 0 && !found )
+                            rc = RC
+                                (rcKFG, rcNode, rcReading, rcName, rcNotFound);
+                    }
+                }
+                KNamelistRelease ( names );
+            }
+            KConfigNodeRelease ( node );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KConfigDoesProtectedRepositoryExist( const KConfig *self, const char * name, bool * res )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcSelf, rcNull );
+    else if ( res == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        const struct KConfigNode * node;
+        *res = false;
+        rc = KConfigOpenNodeRead ( self, &node, "/repository/user/protected" );
+        if ( rc == 0 )
+        {
+            struct KNamelist * names;
+            rc = KConfigNodeListChildren ( node, &names );
+            if ( rc == 0 )
+            {
+                uint32_t count;
+                rc = KNamelistCount ( names, &count );
+                if ( rc == 0 )
+                {
+                    if ( count == 0 )
+                        rc = RC ( rcKFG, rcNode, rcReading, rcName, rcNotFound );
+                    else
+                    {
+                        /* loop through the names to find the one which matches the name parameter */
+                        uint32_t i;
+                        bool found = false;
+                        size_t name_size = string_size( name );
+                        for ( i = 0; !found && i < count && rc == 0; ++i )
+                        {
+                            const char * s = NULL;
+                            rc = KNamelistGet ( names, i, &s );
+                            if ( rc == 0 && s != NULL )
+                            {
+                                size_t s_size = string_size( s );
+                                if ( name_size == s_size )
+                                {
+                                    int cmp = string_cmp ( name, name_size,
+                                        s, s_size, (uint32_t)s_size);
+                                    found = ( cmp == 0 );
+                                }
+                            }
+                        }
+                        if ( rc == 0 && found )
+                            *res = true;
+                    }
+                }
+                KNamelistRelease ( names );
+            }
+            KConfigNodeRelease ( node );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfigGetProtectedRepositoryEnabledById( const KConfig *self, uint32_t id, bool * enabled )
+{
+    char repo_name[ 1024 ];
+    size_t written;
+    rc_t rc = KConfigGetProtectedRepositoryName( self, id, repo_name, sizeof repo_name, &written );
+    if ( rc == 0 )
+        rc = KConfig_Get_Repository_State( self, enabled, true, true, "/repository/user/protected/%s/disabled", repo_name );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KConfigSetProtectedRepositoryEnabledById( KConfig *self, uint32_t id, bool enabled )
+{
+    char repo_name[ 1024 ];
+    size_t written;
+    rc_t rc = KConfigGetProtectedRepositoryName( self, id, repo_name, sizeof repo_name, &written );
+    if ( rc == 0 )
+        rc = KConfig_Set_Repository_State( self, enabled, true, "/repository/user/protected/%s/disabled", repo_name );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KConfigGetProtectedRepositoryCachedById( const KConfig *self, uint32_t id, bool * enabled )
+{
+    char repo_name[ 1024 ];
+    size_t written;
+    rc_t rc = KConfigGetProtectedRepositoryName( self, id, repo_name, sizeof repo_name, &written );
+    if ( rc == 0 )
+        rc = KConfig_Get_Repository_State( self, enabled, false, false, "/repository/user/protected/%s/cache-enabled", repo_name );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KConfigSetProtectedRepositoryCachedById( KConfig *self, uint32_t id, bool enabled )
+{
+    char repo_name[ 1024 ];
+    size_t written;
+    rc_t rc = KConfigGetProtectedRepositoryName( self, id, repo_name, sizeof repo_name, &written );
+    if ( rc == 0 )
+        rc = KConfig_Set_Repository_State( self, enabled, false, "/repository/user/protected/%s/cache-enabled", repo_name );
+    return rc;
+}
diff --git a/libs/kfg/report-kfg.c b/libs/kfg/report-kfg.c
new file mode 100644
index 0000000..8512179
--- /dev/null
+++ b/libs/kfg/report-kfg.c
@@ -0,0 +1,532 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfg/extern.h>
+
+#include <kfg/config.h>
+#include <kfg/repository.h> /* KRepositoryMgr */
+#include <kfg/kfg-priv.h>
+
+#include <klib/namelist.h> /* KNamelistRelease */
+#include <klib/out.h> /* OUTMSG */
+#include <klib/klib-priv.h>
+#include <klib/rc.h>
+
+#include <kfs/directory.h>
+#include <kfs/dyload.h> /* KDyld */
+#include <kfs/file.h> /* KFileRead */
+#include <kfs/nullfile.h> /* KFileMakeNullUpdate */
+#include <kfs/md5.h> /* KMD5SumFmt */
+
+#include <sysalloc.h>
+
+#include <stdarg.h> /* va_start */
+#include <stdio.h> /* sprintf */
+#include <stdlib.h> /* malloc */
+#include <string.h> /* memset */
+#include <limits.h> /* PATH_MAX */
+#include <assert.h>
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+/*
+ * An unrecoverable error happened.
+ * We can help to solve it
+ * by reporting information about known application execution environment.
+ */
+
+#define report ( * f -> report )
+#define reportData ( * f -> reportData )
+#define reportData1 ( * f -> reportData1 )
+#define reportOpen ( * f -> reportOpen )
+#define reportOpen1 ( * f -> reportOpen1 )
+#define reportClose ( * f -> reportClose )
+#define reportClose1 ( * f -> reportClose1 )
+#define reportError ( * f -> reportError )
+#define reportErrorStr ( * f -> reportErrorStr )
+#define reportErrorStrImpl ( * f -> reportErrorStrImpl )
+#define reportErrorStrInt ( * f -> reportErrorStrInt )
+#define reportError3Str ( * f -> reportError3Str )
+
+static rc_t ReportKfgFiles(const ReportFuncs *f,
+    int indent, const KConfig* cfg)
+{
+    rc_t rc = 0;
+
+    uint32_t count = 0;
+    KNamelist* names = NULL;
+
+    rc = KConfigListIncluded(cfg, &names);
+
+    if (rc != 0) {
+        reportOpen(indent, "Files", 0);
+        reportError(indent + 1, rc, "KConfigListIncluded");
+    }
+    else {
+        rc = KNamelistCount(names, &count);
+        if (rc != 0) {
+            reportOpen(indent, "Files", 0);
+            reportErrorStr(indent + 1,
+                rc, "KNamelistCount", "origin", "KConfigListIncluded");
+        }
+        else {
+            uint32_t i = 0;
+            reportOpen(indent, "Files", 1, "count", 'd', count);
+            for (i = 0; i < count && rc == 0; ++i) {
+                const char* name = NULL;
+                rc = KNamelistGet(names, i, &name);
+                if (rc != 0) {
+                    reportErrorStrInt(indent + 1, rc, "KNamelistGet",
+                        "origin", "KConfigListIncluded", "idx", i);
+                }
+                else
+                {   report(indent + 1, "File", 1, "name", 's', name); }
+            }
+        }
+    }
+    reportClose(indent, "Files");
+
+    RELEASE(KNamelist, names);
+
+    return rc;
+}
+
+static
+rc_t sKConfigNode_Read(const KConfigNode* node, char* buffer, size_t buf_sz,
+    char** overflow_buf, bool* cant_allocate)
+{
+    rc_t rc = 0;
+    size_t num_read = 0;
+    size_t remaining = 0;
+    assert(overflow_buf && cant_allocate);
+    *cant_allocate = false;
+    *overflow_buf = NULL;
+    rc = KConfigNodeRead(node, 0, buffer, buf_sz, &num_read, &remaining);
+    if (rc != 0)
+    {   return rc; }
+    if (num_read < buf_sz)
+    {   buffer[num_read] = '\0'; }
+    else {
+        size_t new_buf_sz = num_read + remaining + 1;
+        char* overflow = malloc(new_buf_sz);
+        if (overflow == NULL) {
+            int i = 0;
+            for (i = 2; i < 5 && buf_sz - i > 0; ++i)
+            {   buffer[buf_sz - i] = '.'; }
+            buffer[buf_sz - 1] = '\0';
+            *cant_allocate = true;
+        }
+        else {
+            buffer = *overflow_buf = overflow;
+            buf_sz = 
+            rc = KConfigNodeRead
+                (node, 0, buffer, new_buf_sz, &num_read, &remaining);
+            if (rc != 0)
+            {   return rc; }
+            assert(num_read < new_buf_sz && remaining == 0);
+            buffer[num_read] = '\0';
+        }
+    }
+    return rc;
+}
+
+static rc_t ReportChildNode(const ReportFuncs *f, int indent,
+    const KNamelist* names, const KConfigNode* node, const char* root, uint32_t idx);
+
+static
+rc_t ReportConfigNodeChildren(const ReportFuncs *f, int indent,
+    const KConfigNode* node, const char* nodeName)
+{
+    KNamelist* names = NULL;
+    rc_t rc = KConfigNodeListChild(node, &names);
+    if (rc != 0) {
+        reportErrorStrImpl(indent,
+            rc, "KConfigNodeListChild", "node", nodeName, false);
+    }
+    else {
+        uint32_t count = 0;
+        rc = KNamelistCount(names, &count);
+        if (rc != 0) {
+            reportErrorStrImpl
+                (indent, rc, "KNamelistCount", "node", nodeName, false);
+        }
+        else {
+            if (count) {
+                uint32_t i = 0;
+                int j;
+                OUTMSG(("\n"));
+                for (i = 0; i < count && rc == 0; ++i) {
+                    rc = ReportChildNode
+                        (f, indent + 1, names, node, nodeName, i);
+                }
+                for (j = 0; j < indent; ++j)
+                {   OUTMSG((" ")); }
+            }
+        }
+    }
+    RELEASE(KNamelist, names);
+    return rc;
+}
+
+static rc_t ReportConfigNode(const ReportFuncs *f, int indent, const char* root,
+    const char* name, const KConfigNode* node, const char* node_name)
+{
+    rc_t rc = 0;
+
+    char local[PATH_MAX + 1] = "";
+    const char* nodeName = node_name ? node_name : name;
+    char* overflow = NULL;
+    bool cantallocate = false;
+
+    reportOpen1(indent, nodeName);
+    rc = sKConfigNode_Read(node, local, sizeof local, &overflow, &cantallocate);
+    if (rc == 0) {
+        char* buf = overflow ? overflow : local;
+        rc = reportData1(buf);
+        free(overflow);
+        overflow = NULL;
+        if (rc == 0)
+        {   rc = ReportConfigNodeChildren(f, indent, node, nodeName); }
+    }
+    else {
+        reportError3Str
+            (indent + 1, rc, "KConfigNodeRead", "node", root, "/", name, false);
+    }
+    reportClose1(nodeName);
+
+    return rc;
+}
+
+static rc_t ReportConfigNode_File(const ReportFuncs *f, int indent,
+    const char* root,
+    const char* name, const KConfigNode* node, const char* node_name)
+{
+    rc_t rc = 0;
+    char local[PATH_MAX + 1] = "";
+    const char* nodeName = node_name ? node_name : name;
+    char* overflow = NULL;
+    bool cantallocate = false;
+    rc = sKConfigNode_Read(node, local, sizeof local, &overflow, &cantallocate);
+    if (rc) {
+        reportError3Str
+            (indent, rc, "KConfigNodeRead", "node", root, "/", name, false);
+    }
+    else {
+        const char* buf = overflow ? overflow : local;
+        KPathType file_type = kptNotFound;
+        const char* type = NULL;
+        if (!cantallocate) {
+            KDirectory* dir = NULL;
+            rc = KDirectoryNativeDir(&dir);
+            if (rc == 0) {
+                file_type = KDirectoryPathType(dir, "%s", buf);
+                file_type &= ~kptAlias;
+                type = file_type == kptFile ? "exists" :
+                          file_type == kptNotFound ? "not found" : "unexpected";
+            }
+            RELEASE(KDirectory, dir);
+        }
+        else
+        {   type = "noo long"; }
+        if (rc == 0)
+        {   reportData(indent, nodeName, buf, 1, "file", 's', type); }
+    }
+    free(overflow);
+    overflow = NULL;
+    return rc;
+}
+
+static rc_t ReportChildNode(const ReportFuncs *f, int indent,
+    const KNamelist* names,
+    const KConfigNode* node, const char* root, uint32_t idx)
+{
+    rc_t rc = 0;
+
+    const char* name = NULL;
+    rc = KNamelistGet(names, idx, &name);
+    if (rc != 0) {
+        reportErrorStrInt
+            (indent + 1, rc, "KNamelistGet", "node", root, "idx", idx);
+    }
+    else {
+        const KConfigNode* child = NULL;
+
+        rc = KConfigNodeOpenNodeRead(node, &child, "%s", name);
+        if (rc != 0) {
+            reportOpen(indent, name, 0);
+            reportError3Str(indent + 1, rc, "KConfigNodeOpenNodeRead",
+                "node", root, "/", name, true);
+            reportClose(indent, name);
+        }
+        else {
+            rc = ReportConfigNode(f, indent, root, name, child, NULL);
+        }
+
+        RELEASE(KConfigNode, child);
+    }
+
+    return rc;
+}
+
+static
+rc_t ReportRefseq(const ReportFuncs *f, int indent, const KConfig* cfg)
+{
+    rc_t rc = 0;
+
+    const char root[] = "refseq";
+
+    const KConfigNode* node = NULL;
+    rc = KConfigOpenNodeRead(cfg, &node, "%s", root);
+    if (rc != 0) {
+        if (GetRCState(rc) == rcNotFound) {
+            report(indent, root, 1, "state", 's', "not found");
+            rc = 0;
+        }
+        else
+        {   reportErrorStr(indent, rc, "KConfigOpenNodeRead", "node", root); }
+    }
+    else {
+        KNamelist* names = NULL;
+        rc = KConfigNodeListChild(node, &names);
+        if (rc != 0)
+        {   reportErrorStr(indent, rc, "KConfigNodeListChild", "node", root); }
+        else {
+            uint32_t count = 0;
+            rc = KNamelistCount(names, &count);
+            if (rc != 0)
+            {   reportErrorStr(indent, rc, "KNamelistCount", "node", root); }
+            else {
+                uint32_t i = 0;
+                reportOpen(indent, root, 0);
+                for (i = 0; i < count && rc == 0; ++i)
+                {   rc = ReportChildNode(f, indent + 1, names, node, root, i); }
+                reportClose(indent, root);
+            }
+        }
+        RELEASE(KNamelist, names);
+    }
+
+    RELEASE(KConfigNode, node);
+
+    return rc;
+}
+
+static
+rc_t ReportSra(const ReportFuncs *f, int indent, const KConfig* cfg)
+{
+    rc_t rc = 0;
+    const char root[] = "sra";
+    const KConfigNode* node = NULL;
+    assert(cfg);
+    rc = KConfigOpenNodeRead(cfg, &node, "%s", root);
+    if (rc != 0) {
+        if (GetRCState(rc) == rcNotFound) {
+            report(indent, root, 1, "state", 's', "not found");
+            rc = 0;
+        }
+        else
+        {   reportErrorStr(indent, rc, "KConfigOpenNodeRead", "node", root); }
+    }
+    else {
+        KNamelist* names = NULL;
+        rc = KConfigNodeListChild(node, &names);
+        if (rc != 0)
+        {   reportErrorStr(indent, rc, "KConfigNodeListChild", "node", root); }
+        else {
+            uint32_t count = 0;
+            rc = KNamelistCount(names, &count);
+            if (rc != 0)
+            {   reportErrorStr(indent, rc, "KNamelistCount", "node", root); }
+            else {
+                uint32_t i = 0;
+                reportOpen(indent, root, 0);
+                for (i = 0; i < count && rc == 0; ++i)
+                {   rc = ReportChildNode(f, indent + 1, names, node, root, i); }
+                reportClose(indent, root);
+            }
+        }
+        RELEASE(KNamelist, names);
+    }
+    RELEASE(KConfigNode, node);
+    return rc;
+}
+
+static
+rc_t ReportKrypto(const ReportFuncs *f, int indent, const KConfig* cfg)
+{
+    rc_t rc = 0;
+
+    const char root[] = KFG_KRYPTO_PWFILE;
+    const char name[] = "krypto";
+
+    const KConfigNode* node = NULL;
+    rc = KConfigOpenNodeRead(cfg, &node, "%s", root);
+    if (rc != 0) {
+        if (GetRCState(rc) == rcNotFound) {
+            report(indent, name, 1, "state", 's', "pwfile: not found");
+            rc = 0;
+        }
+        else
+        {   reportErrorStr(indent, rc, "KConfigOpenNodeRead", "node", root); }
+    }
+    else {
+        rc = ReportConfigNode_File(f, indent, "krypto", "pwfile", node, "krypto");
+    }
+
+    RELEASE(KConfigNode, node);
+
+    return rc;
+}
+
+static rc_t ReportRemoteAccess(const ReportFuncs *f,
+    int indent, const KRepositoryMgr *mgr)
+{
+    const char root[] = "RemoteAccess";
+
+    bool available = KRepositoryMgrHasRemoteAccess(mgr);
+    report(indent, root, 1, "available", 's', available ? "true" : "false");
+
+    return 0;
+}
+
+static rc_t ReportCrntRepository(const ReportFuncs *f,
+    int indent, const KRepositoryMgr *mgr)
+{
+    rc_t rc = 0;
+
+    const KRepository *protectd = NULL;
+
+    const char root[] = "CurrentProtectedRepository";
+    bool open = false;
+
+    if (rc == 0) {
+        rc = KRepositoryMgrCurrentProtectedRepository(mgr, &protectd);
+        if (rc != 0) {
+            if (rc == SILENT_RC(
+                rcKFG, rcMgr, rcAccessing, rcNode, rcNotFound))
+            {
+                report(indent, root, 1, "found", 's', "false");
+            }
+            else {
+                reportOpen(indent, root, 0);
+                open = true;
+                reportErrorStr(indent + 1, rc,
+                    "KRepositoryMgrCurrentProtectedRepository", NULL, NULL);
+            }
+        }
+    }
+    if (rc == 0) {
+        char buffer[256];
+        size_t name_size = 0;
+        reportOpen(indent, root, 1, "found", 's', "true");
+        open = true;
+        rc = KRepositoryName(protectd, buffer, sizeof buffer, &name_size);
+        if (rc != 0) {
+            reportErrorStr(indent + 1, rc, "KRepositoryName",
+                "origin", "KRepositoryMgrCurrentProtectedRepository");
+        }
+        else {
+            reportData(indent + 1, "name", buffer, 0);
+        }
+    }
+    if (open) {
+        reportClose(indent, root);
+    }
+
+    RELEASE(KRepository, protectd);
+
+    return rc;
+}
+
+rc_t ReportKfg
+    ( const ReportFuncs *f, uint32_t indent, uint32_t skipCount, va_list args )
+{
+    rc_t rc = 0;
+
+    KConfig *cfg = NULL;
+    const KRepositoryMgr *mgr = NULL;
+
+    const char tag[] = "Configuration";
+
+    reportOpen(indent, tag, 0);
+
+    rc = KConfigMake(&cfg, NULL);
+    if (rc != 0) {
+        reportError(indent + 1, rc, "KConfigMake");
+    }
+    else if ((rc = KConfigMakeRepositoryMgrRead(cfg, &mgr)) != 0) {
+        reportError(indent + 1, rc, "KConfigMakeRepositoryMgrRead");
+    }
+    else {
+        {
+            rc_t rc2 = ReportKfgFiles(f, indent + 1, cfg);
+            if (rc == 0 && rc2 != 0)
+            {   rc = rc2; }
+        }
+        {
+            rc_t rc2 = ReportRefseq(f, indent + 1, cfg);
+            if (rc == 0 && rc2 != 0)
+            {   rc = rc2; }
+        }
+        {
+            rc_t rc2 = ReportKrypto(f, indent + 1, cfg);
+            if (rc == 0 && rc2 != 0)
+            {   rc = rc2; }
+        }
+        {
+            rc_t rc2 = ReportSra(f, indent + 1, cfg);
+            if (rc == 0 && rc2 != 0)
+            {   rc = rc2; }
+        }
+        {
+            rc_t rc2 = KConfigPrintPartial(cfg, indent, skipCount, args);
+            if (rc == 0 && rc2 != 0)
+            {   rc = rc2; }
+        }
+        {
+            rc_t rc2 = ReportRemoteAccess(f, indent + 1, mgr);
+            if (rc == 0 && rc2 != 0)
+            {   rc = rc2; }
+        }
+        {
+            rc_t rc2 = ReportCrntRepository(f, indent + 1, mgr);
+            if (rc == 0 && rc2 != 0)
+            {   rc = rc2; }
+        }
+    }
+
+    reportClose(indent, tag);
+
+    RELEASE(KRepositoryMgr, mgr);
+    RELEASE(KConfig, cfg);
+
+    return rc;
+}
diff --git a/libs/kfg/repository.c b/libs/kfg/repository.c
new file mode 100644
index 0000000..c2cf03a
--- /dev/null
+++ b/libs/kfg/repository.c
@@ -0,0 +1,1982 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kfg/extern.h>
+
+#include <kfg/repository.h>
+#include <kfg/config.h>
+#include <kfg/ngc.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/impl.h>
+#include <klib/refcount.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/vector.h>
+#include <klib/namelist.h>
+#include <klib/rc.h>
+
+#include "ngc-priv.h"
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <ctype.h> /* isdigit */
+#include <os-native.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <limits.h> /* PATH_MAX */
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+/*--------------------------------------------------------------------------
+ * KRepository
+ *  presents structured access to a storage repository
+ *  as modeled in KConfig.
+ *
+ *  all objects are obtained via KRepositoryMgr ( see below )
+ */
+struct KRepository
+{
+    const KConfigNode *node;
+    String name;
+    KRefcount refcount;
+    KRepCategory category;
+    KRepSubCategory subcategory;
+};
+
+
+/* Whack
+ */
+static
+rc_t KRepositoryWhack ( KRepository *self )
+{
+    KConfigNodeRelease ( self -> node );
+    free ( self );
+    return 0;
+}
+
+/* Sort
+ */
+static
+int64_t CC KRepositorySort ( const void **a, const void **b, void *ignore )
+{
+    const KRepository *left = * a;
+    const KRepository *right = * b;
+
+    if ( left -> category != right -> category )
+        return (int64_t)left -> category - (int64_t)right -> category;
+
+    if ( left -> subcategory != right -> subcategory )
+        return (int64_t)left -> subcategory - (int64_t)right -> subcategory;
+
+    return StringCompare ( & left -> name, & right -> name );
+}
+
+/* Make
+ */
+static
+rc_t KRepositoryMake ( KRepository **rp, const KConfigNode *node,
+    const char *name, KRepCategory category, KRepSubCategory subcategory )
+{
+    rc_t rc;
+    KRepository *r;
+    String name_str;
+
+    /* measure string */
+    StringInitCString ( & name_str, name );
+
+    /* create object */
+    r = malloc ( sizeof * r + name_str . size + 1 );
+    if ( r == NULL )
+        return RC ( rcKFG, rcNode, rcConstructing, rcMemory, rcExhausted );
+
+    rc = KConfigNodeAddRef ( node );
+    if ( rc != 0 )
+    {
+        free ( r );
+        return rc;
+    }
+
+    r -> node = node;
+    r -> name = name_str;
+    r -> name . addr = ( char* ) ( r + 1 );
+    KRefcountInit ( & r -> refcount, 1, "KRepository", "make", name );
+    r -> category = category;
+    r -> subcategory = subcategory;
+    memmove ( r + 1, name, name_str . size );
+    ( ( char* ) ( r + 1 ) ) [ name_str . size ] = 0;
+
+    * rp = r;
+
+    return 0;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KRepositoryAddRef ( const KRepository *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KRepository" ) )
+        {
+        case krefLimit:
+            return RC ( rcKFG, rcNode, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KRepositoryRelease ( const KRepository *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KRepository" ) )
+        {
+        case krefWhack:
+            return KRepositoryWhack ( ( KRepository* ) self );
+        case krefNegative:
+            return RC ( rcKFG, rcNode, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* WhackEntry
+ *  for cleaning up these vectors
+ */
+static
+void CC KRepositoryWhackEntry ( void *item, void *ignore )
+{
+    KRepository *self = item;
+    KRepositoryRelease ( self );
+}
+
+
+/* Category
+ * SubCategory
+ *  tells what the repository category or sub-category are
+ *  or returns "bad" if the repository object is not usable.
+ */
+LIB_EXPORT KRepCategory CC KRepositoryCategory ( const KRepository *self )
+{
+    if ( self != NULL )
+        return self -> category;
+    return krepBadCategory;
+}
+
+LIB_EXPORT KRepSubCategory CC KRepositorySubCategory ( const KRepository *self )
+{
+    if ( self != NULL )
+        return self -> subcategory;
+    return krepBadSubCategory;
+}
+
+
+/* Name
+ *  get the repository name
+ *  attempts to copy NUL-terminated name into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - name output parameter
+ *
+ *  "name_size" [ OUT, NULL OKAY ] - returns the name size in
+ *  bytes, excluding any NUL termination.
+ */
+LIB_EXPORT rc_t CC KRepositoryName ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *name_size )
+{
+    if ( self == NULL )
+        return RC ( rcKFG, rcNode, rcAccessing, rcSelf, rcNull );
+
+    if ( name_size != NULL )
+        * name_size = self -> name . size;
+
+    if ( bsize < self -> name . size )
+        return RC ( rcKFG, rcNode, rcAccessing, rcBuffer, rcInsufficient );
+
+    if ( buffer == NULL )
+        return RC ( rcKFG, rcNode, rcAccessing, rcBuffer, rcNull );
+
+    memmove ( buffer, self -> name . addr, self -> name . size );
+
+    if ( bsize > self -> name . size )
+        buffer [ self -> name . size ] = 0;
+
+    return 0;
+}
+
+
+/* DisplayName
+ *  get the repository display name,
+ *  if different from its actual name
+ *
+ *  attempts to copy NUL-terminated name into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - name output parameter
+ *
+ *  "name_size" [ OUT, NULL OKAY ] - returns the name size in
+ *  bytes, excluding any NUL termination.
+ */
+LIB_EXPORT rc_t CC KRepositoryDisplayName ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *name_size )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        const KConfigNode *node;
+
+        if ( name_size != NULL )
+            * name_size = 0;
+
+        rc = KConfigNodeOpenNodeRead ( self -> node, & node, "display-name" );
+        if ( rc != 0 )
+            rc = KRepositoryName ( self, buffer, bsize, name_size );
+        else
+        {
+            size_t num_read, remaining;
+            rc = KConfigNodeRead ( node, 0, buffer, bsize, & num_read, & remaining );
+            KConfigNodeRelease ( node );
+
+            if ( rc == 0 )
+            {
+                if ( name_size != NULL )
+                    * name_size = num_read + remaining;
+
+                if ( remaining != 0 )
+                    rc = RC ( rcKFG, rcNode, rcAccessing, rcBuffer, rcInsufficient );
+                else if ( num_read < bsize )
+                    buffer [ num_read ] = 0;
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* Root
+ *  read the root path as a POSIX path or URL
+ *
+ *  attempts to copy NUL-terminated path into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - path output parameter
+ *
+ *  "root_size" [ OUT, NULL OKAY ] - returns the path size in
+ *  bytes, excluding any NUL termination.
+ */
+LIB_EXPORT rc_t CC KRepositoryRoot ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *root_size )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        const KConfigNode *node;
+
+        if ( root_size != NULL )
+            * root_size = 0;
+
+        rc = KConfigNodeOpenNodeRead ( self -> node, & node, "root" );
+        if ( rc == 0 )
+        {
+            size_t num_read, remaining;
+            rc = KConfigNodeRead ( node, 0, buffer, bsize, & num_read, & remaining );
+            KConfigNodeRelease ( node );
+
+            if ( rc == 0 )
+            {
+                if ( root_size != NULL )
+                    * root_size = num_read + remaining;
+
+                if ( remaining != 0 )
+                    rc = RC ( rcKFG, rcNode, rcAccessing, rcBuffer, rcInsufficient );
+                else if ( num_read < bsize )
+                    buffer [ num_read ] = 0;
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KRepositorySetRoot(KRepository *self,
+    const char *root, size_t root_size)
+{
+    rc_t rc = 0;
+
+    if (self == NULL) {
+        return RC(rcKFG, rcNode, rcUpdating, rcSelf, rcNull);
+    }
+    else if (root == NULL) {
+        return RC(rcKFG, rcNode, rcUpdating, rcParam, rcNull);
+    }
+    else {
+        KConfigNode *self_node = (KConfigNode*)self->node;
+        KConfigNode *node = NULL;
+
+        rc = KConfigNodeOpenNodeUpdate(self_node, &node, "root");
+        if (rc == 0) {
+            rc = KConfigNodeWrite(node, root, root_size);
+            KConfigNodeRelease(node);
+        }
+    }
+
+    return rc;
+}
+
+
+const char root_history_key[] = "root/history";
+
+/* RootHistory
+ *  read the root-history as a semicolon separated list of POSIX paths
+ *
+ *  attempts to copy NUL-terminated path into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - path output parameter
+ *
+ *  "roothistory_size" [ OUT, NULL OKAY ] - returns the root-history
+ *  size in bytes, excluding any NUL termination.
+ */
+LIB_EXPORT rc_t CC KRepositoryRootHistory ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *roothistory_size )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        const KConfigNode *node;
+
+        if ( roothistory_size != NULL )
+            * roothistory_size = 0;
+
+        rc = KConfigNodeOpenNodeRead ( self -> node, & node, root_history_key );
+        if ( rc == 0 )
+        {
+            size_t num_read, remaining;
+            rc = KConfigNodeRead ( node, 0, buffer, bsize, & num_read, & remaining );
+            KConfigNodeRelease ( node );
+
+            if ( rc == 0 )
+            {
+                if ( roothistory_size != NULL )
+                    * roothistory_size = num_read + remaining;
+
+                if ( remaining != 0 )
+                    rc = RC ( rcKFG, rcNode, rcAccessing, rcBuffer, rcInsufficient );
+                else if ( num_read < bsize )
+                    buffer [ num_read ] = 0;
+            }
+        }
+    }
+
+    return rc;
+
+}
+
+
+/* SetRootHistory
+ *  set the root-history list of paths
+ *
+ *  "roothistory" [ IN ] and "roothistory_size" [ IN ] - path input parameter
+ */
+LIB_EXPORT rc_t CC KRepositorySetRootHistory( KRepository *self,
+    const char *roothistory, size_t roothistory_size )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        return RC(rcKFG, rcNode, rcUpdating, rcSelf, rcNull);
+    else if ( roothistory == NULL )
+        return RC(rcKFG, rcNode, rcUpdating, rcParam, rcNull);
+    else
+    {
+        KConfigNode *self_node = ( KConfigNode* )self->node;
+        KConfigNode *node = NULL;
+
+        rc = KConfigNodeOpenNodeUpdate( self_node, &node, root_history_key );
+        if ( rc == 0 )
+        {
+            rc = KConfigNodeWrite( node, roothistory, roothistory_size );
+            KConfigNodeRelease( node );
+        }
+    }
+    return rc;
+}
+
+
+static rc_t append_to_root_history( KRepository *self, const char *item )
+{
+    size_t required;
+    rc_t rc = KRepositoryRootHistory( self, NULL, 0, &required );
+    if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == ( enum RCObject ) rcPath )
+    {
+        /* we do not have a root-history yet */
+        rc = KRepositorySetRootHistory( self, item, string_size( item ) );
+    }
+    else if ( GetRCState( rc ) == rcInsufficient && GetRCObject( rc ) == ( enum RCObject ) rcBuffer )
+    {
+        /* we expect the buffer to be insufficient, because we tested for size by giving a NULL as buffer */
+        char * temp = malloc( required + 1 );
+        if ( temp == NULL )
+            rc = RC( rcKFG, rcNode, rcUpdating, rcMemory, rcExhausted );
+        else
+        {
+            rc = KRepositoryRootHistory( self, temp, required, NULL );
+            if ( rc == 0 )
+            {
+                VNamelist * list;
+                temp[ required ] = 0;
+                rc = VNamelistFromStr ( &list, temp, ':' );
+                if ( rc == 0 )
+                {
+                    int32_t idx;
+                    rc = VNamelistContainsStr( list, item, &idx );
+                    if ( rc == 0 && idx < 0 )
+                    {
+                        rc = VNamelistAppend ( list, item );
+                        if ( rc == 0 )
+                        {
+                            const String * new_value;
+                            rc = VNamelistJoin( list, ':', &new_value );
+                            if ( rc == 0 )
+                            {
+                                rc = KRepositorySetRootHistory( self, new_value -> addr, new_value -> size );
+                                StringWhack( new_value );
+                            }
+                        }
+                    }
+                    VNamelistRelease ( list );
+                }
+            }
+            free( temp );
+        }
+    }
+    return rc;
+}
+
+
+/* AppendToRootHistory
+ *  append to the root-history
+ *
+ *  "roothistory" [ IN ] and "roothistory_size" [ IN ] - path input parameter
+ *  if item == NULL, add the current root to the root-history 
+ */
+LIB_EXPORT rc_t CC KRepositoryAppendToRootHistory( KRepository *self, const char *item )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        return RC( rcKFG, rcNode, rcUpdating, rcSelf, rcNull );
+    else if ( item == NULL )
+    {
+        size_t curr_root_size;
+        rc = KRepositoryRoot( self, NULL, 0, &curr_root_size );
+        if ( GetRCState( rc ) == rcInsufficient && GetRCObject( rc ) == ( enum RCObject ) rcBuffer )
+        {
+            char * root = malloc( curr_root_size + 1 );
+            if ( root == NULL )
+                rc = RC( rcKFG, rcNode, rcUpdating, rcMemory, rcExhausted );
+            else
+            {
+                rc = KRepositoryRoot( self, root, curr_root_size, NULL );
+                if ( rc == 0 )
+                {
+                    root[ curr_root_size ] = 0;
+                    rc = append_to_root_history( self, root );
+                }
+                else
+                {
+                    /* we cannot determine the current root, because it is not stored */
+                    rc = 0;
+                }
+                free( root );
+            }
+        }
+        else
+        {
+            /* we cannot determine the current root, because it is not stored */
+            rc = 0;
+        }
+    }
+    else
+        rc = append_to_root_history( self, item );
+    return rc;
+}
+
+    
+/* Resolver
+ *  read the url of the CGI-resolver
+ *
+ *  attempts to copy NUL-terminated path into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - path output parameter
+ *
+ *  "written" [ OUT, NULL OKAY ] - returns the url size in
+ *  bytes, excluding any NUL termination.
+ */
+LIB_EXPORT rc_t CC KRepositoryResolver ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *written )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        const KConfigNode *node;
+
+        if ( written != NULL )
+            * written = 0;
+
+        rc = KConfigNodeOpenNodeRead ( self -> node, & node, "resolver-cgi" );
+        if ( rc == 0 )
+        {
+            size_t num_read, remaining;
+            rc = KConfigNodeRead ( node, 0, buffer, bsize, & num_read, & remaining );
+            KConfigNodeRelease ( node );
+
+            if ( rc == 0 )
+            {
+                if ( written != NULL )
+                    * written = num_read + remaining;
+
+                if ( remaining != 0 )
+                    rc = RC ( rcKFG, rcNode, rcAccessing, rcBuffer, rcInsufficient );
+                else if ( num_read < bsize )
+                    buffer [ num_read ] = 0;
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* Disabled
+ *  discover whether the repository is enabled
+ */
+LIB_EXPORT bool CC KRepositoryDisabled ( const KRepository *self )
+{
+    if ( self != NULL )
+    {
+        const KConfigNode *node;
+        rc_t rc = KConfigNodeOpenNodeRead ( self -> node, & node, "disabled" );
+        if ( rc == 0 )
+        {
+            bool disabled = false;
+            rc = KConfigNodeReadBool ( node, & disabled );
+            KConfigNodeRelease ( node );
+            if ( rc == 0 )
+                return disabled;
+        }
+    }
+
+    return false;
+}
+
+
+static const char * STR_TRUE  = "true";
+static const char * STR_FALSE = "false";
+
+LIB_EXPORT rc_t CC KRepositorySetDisabled ( const KRepository *self, bool disabled )
+{
+    rc_t rc = RC ( rcKFG, rcNode, rcAccessing, rcSelf, rcNull );
+    if ( self != NULL )
+    {
+        KConfigNode * self_node = ( KConfigNode * )self->node;  /* casting away const-ness */
+        KConfigNode * node;
+        rc = KConfigNodeOpenNodeUpdate ( self_node, &node, "disabled" );
+        if ( rc == 0 )
+        {
+            const char * value = disabled ? STR_TRUE : STR_FALSE;
+            rc = KConfigNodeWrite ( node, value, string_size( value ) );
+            if ( rc == 0 )
+            {
+                KConfig * cfg;
+                rc = KConfigNodeGetMgr( self->node, &cfg );
+                if ( rc == 0 )
+                {
+                    rc = KConfigCommit ( cfg );
+                    KConfigRelease ( cfg );
+                }
+            }
+            KConfigNodeRelease ( node );
+        }
+    }
+    return rc;
+}
+
+
+/* CacheEnabled
+ *  discover whether the repository supports caching
+ */
+LIB_EXPORT bool CC KRepositoryCacheEnabled ( const KRepository *self )
+{
+    if ( self != NULL )
+    {
+        const KConfigNode *node;
+        rc_t rc = KConfigNodeOpenNodeRead ( self -> node, & node, "cache-enabled" );
+        if ( rc == 0 )
+        {
+            bool enabled = false;
+            rc = KConfigNodeReadBool ( node, & enabled );
+            KConfigNodeRelease ( node );
+            if ( rc == 0 )
+                return enabled;
+        }
+    }
+
+    return false;
+}
+
+
+/* DownloadTicket
+ *  return any associated download ticket
+ *
+ *  attempts to copy NUL-terminated ticket into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - ticket output parameter
+ *
+ *  "ticket_size" [ OUT, NULL OKAY ] - returns the ticket size in
+ *  bytes, excluding any NUL termination.
+ */
+LIB_EXPORT rc_t CC KRepositoryDownloadTicket ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *ticket_size )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        const KConfigNode *node;
+
+        if ( ticket_size != NULL )
+            * ticket_size = 0;
+
+        rc = KConfigNodeOpenNodeRead ( self -> node, & node, "download-ticket" );
+        if ( rc == 0 )
+        {
+            size_t num_read, remaining;
+            rc = KConfigNodeRead ( node, 0, buffer, bsize, & num_read, & remaining );
+            KConfigNodeRelease ( node );
+
+            if ( rc == 0 )
+            {
+                if ( ticket_size != NULL )
+                    * ticket_size = num_read + remaining;
+
+                if ( remaining != 0 )
+                    rc = RC ( rcKFG, rcNode, rcAccessing, rcBuffer, rcInsufficient );
+                else if ( num_read < bsize )
+                    buffer [ num_read ] = 0;
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* EncryptionKey
+ *  return any associated encryption key
+ *
+ *  attempts to copy NUL-terminated key into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - encryption key output parameter
+ *
+ *  "key_size" [ OUT, NULL OKAY ] - returns the key size in
+ *  bytes, excluding any NUL termination.
+ */
+LIB_EXPORT rc_t CC KRepositoryEncryptionKey ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *key_size )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        const KConfigNode *node;
+
+        if ( key_size != NULL )
+            * key_size = 0;
+
+        rc = KConfigNodeOpenNodeRead ( self -> node, & node, "encryption-key" );
+        if ( rc == 0 )
+        {
+            size_t num_read, remaining;
+            rc = KConfigNodeRead ( node, 0, buffer, bsize, & num_read, & remaining );
+            KConfigNodeRelease ( node );
+
+            if ( rc == 0 )
+            {
+                if ( key_size != NULL )
+                    * key_size = num_read + remaining;
+
+                if ( remaining != 0 )
+                    rc = RC ( rcKFG, rcNode, rcAccessing, rcBuffer, rcInsufficient );
+                else if ( num_read < bsize )
+                    memset ( & buffer [ num_read ], 0, bsize - num_read );
+            }
+        }
+        else if ( GetRCState ( rc ) == rcNotFound )
+        {
+            char path [ 4096 ];
+            rc_t rc2 = KRepositoryEncryptionKeyFile ( self, path, sizeof path, NULL );
+            if ( rc2 == 0 )
+            {
+                KDirectory *wd;
+                rc2 = KDirectoryNativeDir ( & wd );
+                if ( rc2 == 0 )
+                {
+                    const KFile *keyFile;
+                    rc2 = KDirectoryOpenFileRead ( wd, & keyFile, "%s", path );
+                    KDirectoryRelease ( wd );
+                    if ( rc2 == 0 )
+                    {
+                        size_t num_read;
+                        rc = KFileReadAll ( keyFile, 0, buffer, bsize, & num_read );
+                        if ( rc == 0 )
+                        {
+                            if ( num_read == bsize )
+                            {
+                                uint64_t eof;
+                                rc = KFileSize ( keyFile, & eof );
+                                if ( rc == 0 )
+                                    num_read = ( size_t ) eof;
+                                else
+                                    num_read = 0;
+
+                                rc = RC ( rcKFG, rcFile, rcReading, rcBuffer, rcInsufficient );
+                                memset ( buffer, 0, bsize );
+                            }
+                            else if ( num_read == 0 )
+                            {
+                                rc = RC ( rcKFG, rcFile, rcReading, rcFile, rcEmpty );
+                                memset ( buffer, 0, bsize );
+                            }
+                            else
+                            {
+                                char *eoln = string_chr ( buffer, num_read, '\n' );
+                                if ( eoln != NULL )
+                                {
+                                    if ( eoln == buffer )
+                                        num_read = 0;
+                                    else if ( eoln [ -1 ] == '\r' )
+                                        num_read = eoln - buffer - 1;
+                                    else
+                                        num_read = eoln - buffer;
+                                }
+
+                                if ( key_size != NULL )
+                                    * key_size = num_read;
+
+                                memset ( & buffer [ num_read ], 0, bsize - num_read );
+                            }
+                        }
+
+                        KFileRelease ( keyFile );
+                    }
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* EncryptionKeyFile
+ *  return path to any associated encryption key file
+ *
+ *  attempts to copy NUL-terminated path into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - key file path output parameter
+ *
+ *  "path_size" [ OUT, NULL OKAY ] - returns the path size in
+ *  bytes, excluding any NUL termination.
+ */
+LIB_EXPORT rc_t CC KRepositoryEncryptionKeyFile ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *path_size )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        const KConfigNode *node;
+
+        if ( path_size != NULL )
+            * path_size = 0;
+
+        rc = KConfigNodeOpenNodeRead ( self -> node, & node, "encryption-key-path" );
+        if ( rc == 0 )
+        {
+            size_t num_read, remaining;
+            rc = KConfigNodeRead ( node, 0, buffer, bsize, & num_read, & remaining );
+            KConfigNodeRelease ( node );
+
+            if ( rc == 0 )
+            {
+                if ( path_size != NULL )
+                    * path_size = num_read + remaining;
+
+                if ( remaining != 0 )
+                    rc = RC ( rcKFG, rcNode, rcAccessing, rcBuffer, rcInsufficient );
+                else if ( num_read < bsize )
+                    buffer [ num_read ] = 0;
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* Description
+ *  return any associated descriptive text
+ *
+ *  attempts to copy NUL-terminated description into provided buffer
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - description text output parameter
+ *
+ *  "desc_size" [ OUT, NULL OKAY ] - returns the text size in
+ *  bytes, excluding any NUL termination.
+ */
+LIB_EXPORT rc_t CC KRepositoryDescription ( const KRepository *self,
+    char *buffer, size_t bsize, size_t *desc_size )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcNode, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        const KConfigNode *node;
+
+        if ( desc_size != NULL )
+            * desc_size = 0;
+
+        rc = KConfigNodeOpenNodeRead ( self -> node, & node, "description" );
+        if ( rc == 0 )
+        {
+            size_t num_read, remaining;
+            rc = KConfigNodeRead ( node, 0, buffer, bsize, & num_read, & remaining );
+            KConfigNodeRelease ( node );
+
+            if ( rc == 0 )
+            {
+                if ( desc_size != NULL )
+                    * desc_size = num_read + remaining;
+
+                if ( remaining != 0 )
+                    rc = RC ( rcKFG, rcNode, rcAccessing, rcBuffer, rcInsufficient );
+                else if ( num_read < bsize )
+                    buffer [ num_read ] = 0;
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* ProjectId
+ *  return project id for protected user repository
+ *  return RC when repository is not user protected
+ *
+ *  "projectId" [ OUT ] - returns the project id
+ */
+LIB_EXPORT rc_t CC KRepositoryProjectId
+    ( const KRepository * self, uint32_t * projectId )
+{
+    rc_t rc = 0;
+
+    if ( projectId == NULL )
+        rc = RC ( rcKFG, rcMgr, rcAccessing, rcParam, rcNull );
+    else if ( self == NULL )
+        rc = SILENT_RC ( rcKFG, rcMgr, rcAccessing, rcSelf, rcNull );
+    else if ( self -> category != krepUserCategory
+           || self -> subcategory != krepProtectedSubCategory )
+        rc = RC ( rcKFG, rcMgr, rcAccessing, rcSelf, rcWrongType );
+    else {
+        uint32_t id = 0;
+        const char prefix [] = "dbGaP-";
+        char localName [512] = "";
+        size_t localNumWrit = 0;
+
+        * projectId = 0;
+
+        KRepositoryName (self, localName, sizeof ( localName ), & localNumWrit);
+        assert ( localNumWrit < sizeof localName );
+
+        if ( strcase_cmp ( localName, localNumWrit,
+            prefix, sizeof prefix - 1, sizeof prefix - 1) == 0)
+        {
+            int i = sizeof prefix - 1;
+            for ( i = sizeof prefix - 1; i < localNumWrit; ++ i ) {
+                if ( ! isdigit ( localName [ i ] ) ) {
+                    rc = RC (rcKFG, rcMgr, rcAccessing, rcSelf, rcUnrecognized);
+                    break;
+                }
+                id = id * 10 + localName [ i ] - '0';
+            }
+
+            if ( rc == 0 ) {
+                * projectId = id;
+                return 0;
+            }
+        }
+
+        rc = RC (rcKFG, rcMgr, rcAccessing, rcSelf, rcUnrecognized);
+    }
+        
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KRepositoryVector
+ *  uses Vector API
+ *  holds zero or more KRepository objects
+ */
+
+
+/* Whack
+ *  destroy your vector
+ */
+LIB_EXPORT rc_t CC KRepositoryVectorWhack ( KRepositoryVector *self )
+{
+    if ( self == NULL )
+        return RC ( rcKFG, rcVector, rcDestroying, rcSelf, rcNull );
+
+    VectorWhack ( self, KRepositoryWhackEntry, NULL );
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KRepositoryMgr
+ *  manages structured access to repositories
+ */
+struct KRepositoryMgr
+{
+    const KConfig *ro_cfg;
+    KConfig *rw_cfg;
+    KRefcount refcount;
+};
+
+
+/* Whack
+ */
+static
+rc_t KRepositoryMgrWhack ( KRepositoryMgr *self )
+{
+    if ( self -> ro_cfg )
+        KConfigRelease ( self -> ro_cfg );
+    if ( self -> rw_cfg )
+        KConfigRelease ( self -> rw_cfg );
+    free ( self );
+    return 0;
+}
+
+
+/* Make
+ *  create a repository manager
+ *  uses values from "self"
+ */
+LIB_EXPORT rc_t CC KConfigMakeRepositoryMgrRead ( const KConfig *self, const KRepositoryMgr **mgrp )
+{
+    rc_t rc;
+
+    if ( mgrp == NULL )
+        rc = RC ( rcKFG, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcMgr, rcConstructing, rcSelf, rcNull );
+        else
+        {
+            KRepositoryMgr *mgr = calloc ( 1, sizeof * mgr );
+            if ( mgr == NULL )
+                rc = RC ( rcKFG, rcMgr, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KConfigAddRef ( self );
+                if ( rc == 0 )
+                {
+                    mgr -> ro_cfg = self;
+                    KRefcountInit ( & mgr -> refcount, 1, "KRepositoryMgr", "make-read", "mgr" );
+                    * mgrp = mgr;
+                    return 0;
+                }
+
+                free ( mgr );
+            }
+        }
+
+        * mgrp = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KConfigMakeRepositoryMgrUpdate ( KConfig *self, KRepositoryMgr **mgrp )
+{
+    rc_t rc;
+
+    if ( mgrp == NULL )
+        rc = RC ( rcKFG, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcMgr, rcConstructing, rcSelf, rcNull );
+        else
+        {
+            KRepositoryMgr *mgr = calloc ( 1, sizeof * mgr );
+            if ( mgr == NULL )
+                rc = RC ( rcKFG, rcMgr, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KConfigAddRef ( self );
+                if ( rc == 0 )
+                {
+                    mgr -> rw_cfg = self;
+                    KRefcountInit ( & mgr -> refcount, 1, "KRepositoryMgr", "make-update", "mgr" );
+                    * mgrp = mgr;
+                    return 0;
+                }
+
+                free ( mgr );
+            }
+        }
+
+        * mgrp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KRepositoryMgrAddRef ( const KRepositoryMgr *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KRepositoryMgr" ) )
+        {
+        case krefLimit:
+            return RC ( rcKFG, rcMgr, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KRepositoryMgrRelease ( const KRepositoryMgr *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KRepositoryMgr" ) )
+        {
+        case krefWhack:
+            return KRepositoryMgrWhack ( ( KRepositoryMgr* ) self );
+        case krefNegative:
+            return RC ( rcKFG, rcMgr, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+static
+const KConfig *KRepositoryMgrGetROKConfig ( const KRepositoryMgr *self )
+{
+    return self -> ro_cfg ? self -> ro_cfg : self -> rw_cfg;
+}
+
+static
+rc_t KRepositoryMgrSubCategoryRepositories ( const KConfigNode *sub,
+    KRepCategory category, KRepSubCategory subcategory, KRepositoryVector *repositories )
+{
+    KNamelist *repo_names;
+    rc_t rc = KConfigNodeListChildren ( sub, & repo_names );
+    if ( rc == 0 )
+    {
+        uint32_t i, count;
+        rc = KNamelistCount ( repo_names, & count );
+        for ( i = 0; i < count && rc == 0; ++ i )
+        {
+            const char *repo_name;
+            rc = KNamelistGet ( repo_names, i, & repo_name );
+            if ( rc == 0 )
+            {
+                const KConfigNode *node;
+                rc = KConfigNodeOpenNodeRead ( sub, & node, "%s", repo_name );
+                if ( rc == 0 )
+                {
+                    KRepository *repo;
+                    rc = KRepositoryMake ( & repo, node, repo_name, category, subcategory );
+                    if ( rc == 0 )
+                    {
+                        rc = VectorAppend ( repositories, NULL, repo );
+                        if ( rc != 0 )
+                            KRepositoryWhack ( repo );
+                    }
+
+                    KConfigNodeRelease ( node );
+                }
+            }
+        }
+
+        KNamelistRelease ( repo_names );
+    }
+
+    return rc;
+}
+
+static
+rc_t KRepositoryMgrCategoryRepositories ( const KConfigNode *cat,
+    KRepCategory category, KRepositoryVector *repositories )
+{
+    KNamelist *sub_names;
+    rc_t rc = KConfigNodeListChildren ( cat, & sub_names );
+    if ( rc == 0 )
+    {
+        uint32_t i, count;
+        rc = KNamelistCount ( sub_names, & count );
+        for ( i = 0; i < count && rc == 0; ++ i )
+        {
+            const char *sub_name;
+            rc = KNamelistGet ( sub_names, i, & sub_name );
+            if ( rc == 0 )
+            {
+                KRepSubCategory subcategory = krepBadSubCategory;
+                if ( strcmp ( "main", sub_name ) == 0 )
+                    subcategory = krepMainSubCategory;
+                else if ( strcmp ( "aux", sub_name ) == 0 )
+                    subcategory = krepAuxSubCategory;
+                else if ( strcmp ( "protected", sub_name ) == 0 )
+                    subcategory = krepProtectedSubCategory;
+
+                if ( subcategory != krepBadSubCategory )
+                {
+                    const KConfigNode *sub;
+                    rc = KConfigNodeOpenNodeRead ( cat, & sub, "%s", sub_name );
+                    if ( rc == 0 )
+                    {
+                        rc = KRepositoryMgrSubCategoryRepositories ( sub, category, subcategory, repositories );
+                        KConfigNodeRelease ( sub );
+                    }
+                }
+            }
+        }
+
+        KNamelistRelease ( sub_names );
+    }
+
+    return rc;
+}
+
+
+/* UserRepositories
+ *  retrieve all user repositories in a Vector
+ */
+LIB_EXPORT rc_t CC KRepositoryMgrGetRepositories ( const KRepositoryMgr * self, KRepCategory category,
+    KRepositoryVector * repositories )
+{
+    rc_t rc;
+
+    if ( repositories == NULL )
+        rc = RC ( rcKFG, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        VectorInit ( repositories, 0, 8 );
+
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcMgr, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            const KConfig * kfg = KRepositoryMgrGetROKConfig ( self );
+
+            const KConfigNode * node;
+            switch( category )
+            {
+                case krepUserCategory   : rc = KConfigOpenNodeRead ( kfg, & node, "/repository/user" ); break;
+                case krepSiteCategory   : rc = KConfigOpenNodeRead ( kfg, & node, "/repository/site" ); break;
+                case krepRemoteCategory : rc = KConfigOpenNodeRead ( kfg, & node, "/repository/remote" ); break;
+                default : rc = RC ( rcKFG, rcMgr, rcAccessing, rcParam, rcInvalid );
+            }
+            if ( rc == 0 )
+            {
+                rc = KRepositoryMgrCategoryRepositories ( node, category, repositories );
+                KConfigNodeRelease ( node );
+                if ( rc == 0 )
+                    VectorReorder ( repositories, KRepositorySort, NULL );
+            }
+
+            if ( rc != 0 )
+                KRepositoryVectorWhack ( repositories );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT bool CC KRepositoryMgrCategoryDisabled ( const KRepositoryMgr *self, KRepCategory category )
+{
+    bool res = false;
+
+    if ( self != NULL )
+    {
+        const KConfig * kfg = KRepositoryMgrGetROKConfig ( self );
+        if ( kfg != NULL )
+        {
+            switch( category )
+            {
+                case krepUserCategory   : KConfigReadBool ( kfg, "/repository/user/disabled", &res ); break;
+                case krepSiteCategory   : KConfigReadBool ( kfg, "/repository/site/disabled", &res ); break;
+                case krepRemoteCategory : KConfigReadBool ( kfg, "/repository/remote/disabled", &res ); break;
+            }
+        }
+    }
+    return res;
+}
+
+
+LIB_EXPORT rc_t CC KRepositoryMgrCategorySetDisabled ( const KRepositoryMgr *self, KRepCategory category, bool disabled )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcMgr, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        KConfig * kfg = ( KConfig * ) KRepositoryMgrGetROKConfig ( self );
+        if ( kfg == NULL )
+            rc = RC ( rcKFG, rcMgr, rcAccessing, rcParam, rcNull );
+        else
+        {
+            switch( category )
+            {
+                case krepUserCategory   : rc = KConfigWriteBool ( kfg, "/repository/user/disabled", disabled ); break;
+                case krepSiteCategory   : rc = KConfigWriteBool ( kfg, "/repository/site/disabled", disabled ); break;
+                case krepRemoteCategory : rc = KConfigWriteBool ( kfg, "/repository/remote/disabled", disabled ); break;
+                default : rc = RC ( rcKFG, rcMgr, rcAccessing, rcParam, rcInvalid );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KRepositoryMgrUserRepositories ( const KRepositoryMgr * self,
+    KRepositoryVector * user_repositories )
+{
+    return KRepositoryMgrGetRepositories ( self, krepUserCategory, user_repositories );
+}
+
+
+/* SiteRepositories
+ *  retrieve all site repositories in a Vector
+ */
+LIB_EXPORT rc_t CC KRepositoryMgrSiteRepositories ( const KRepositoryMgr *self,
+    KRepositoryVector *site_repositories )
+{
+    return KRepositoryMgrGetRepositories ( self, krepSiteCategory, site_repositories );
+}
+
+
+/* RemoteRepositories
+ *  retrieve all remote repositories in a Vector
+ */
+LIB_EXPORT rc_t CC KRepositoryMgrRemoteRepositories ( const KRepositoryMgr *self,
+    KRepositoryVector *remote_repositories )
+{
+    return KRepositoryMgrGetRepositories ( self, krepRemoteCategory, remote_repositories );
+}
+
+
+/* CurrentProtectedRepository
+ *  returns the currently active user protected repository
+ */
+LIB_EXPORT rc_t CC KRepositoryMgrCurrentProtectedRepository ( const KRepositoryMgr *self, const KRepository **protected )
+{
+    rc_t rc;
+
+    if ( protected == NULL )
+        rc = RC ( rcKFG, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        * protected = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcMgr, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            KRepositoryVector v;
+            rc = KRepositoryMgrUserRepositories ( self, & v );
+            if ( rc == 0 )
+            {
+                KDirectory *wd;
+                rc = KDirectoryNativeDir ( & wd );
+                if ( rc == 0 )
+                {
+                    /* we need services of system directory */
+                    struct KSysDir *sysDir = KDirectoryGetSysDir ( wd );
+
+                    /* allocate buffer space for 3 paths */
+                    const size_t path_size = 4096;
+                    char *wd_path = malloc ( path_size * 3 );
+                    if ( wd_path == NULL )
+                        rc = RC ( rcKFG, rcMgr, rcAccessing, rcMemory, rcExhausted );
+                    else
+                    {
+                        /* the working directory already has a canonical path */
+                        rc = KDirectoryResolvePath ( wd, true, wd_path, path_size, "." );
+                        if ( rc == 0 )
+                        {
+                            size_t wd_size = string_size ( wd_path );
+
+                            /* look for all protected user repositories */
+                            uint32_t i, count = VectorLength ( & v );
+                            for ( i = 0; i < count; ++ i )
+                            {
+                                const KRepository *r = ( const void* ) VectorGet ( & v, i );
+                                if ( r -> subcategory == krepProtectedSubCategory )
+                                {
+                                    rc_t rc2 = 0;
+                                    size_t resolved_size;
+                                    char *resolved = wd_path + path_size;
+
+                                    /* get stated root path to repository */
+                                    char *root = resolved + path_size;
+                                    rc2 = KRepositoryRoot ( r,
+                                        root, path_size, NULL );
+                                    if ( rc2 != 0 ) {
+                                        /* VDB-1096:
+                                        We cannot get repository root:
+                                        is it a bad repository configuration?
+                                        Then ignore this repository node
+                                        and try another repository */
+                                        continue;
+                                    }
+
+                                    /* get its canonical path */
+                                    rc2 = KSysDirRealPath ( sysDir,
+                                                            resolved, path_size, "%s", root );
+                                    if ( rc2 != 0 ) {
+                                        /* VDB-1096:
+                      Invalid cannot get repository root? Ignore and continue */
+                                        continue;
+                                    }
+
+                                    /* we know the current directory's canonical path size
+                                       and we know the repository's canonical path size.
+                                       to be "within" the repository, the current directory's
+                                       size must be >= repository path size, and must match
+                                       exactly the repository path itself over those bytes. */
+                                    resolved_size = string_size ( resolved );
+                                    if ( resolved_size <= wd_size && memcmp ( wd_path, resolved, resolved_size ) == 0 )
+                                    {
+                                        /* still have a little more to check */
+                                        if ( resolved_size == wd_size ||
+                                             wd_path [ resolved_size ] == '/' )
+                                        {
+                                            /* we are in the repository */
+                                            rc = KRepositoryAddRef ( r );
+                                            if ( rc == 0 )
+                                                * protected = r;
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+
+                        free ( wd_path );
+                    }
+
+                    KDirectoryRelease ( wd );
+                }
+
+                KRepositoryVectorWhack ( & v );
+            }
+            else if (rc ==
+                SILENT_RC(rcKFG, rcNode, rcOpening, rcPath, rcNotFound))
+            {
+                return SILENT_RC ( rcKFG, rcMgr, rcAccessing, rcNode, rcNotFound );
+            }
+
+            if ( rc == 0 && * protected == NULL )
+                return SILENT_RC ( rcKFG, rcMgr, rcAccessing, rcNode, rcNotFound );
+        }
+    }
+
+    return rc;
+}
+
+
+/* GetProtectedRepository
+ *  retrieves a user protected repository by its associated project-id
+ */
+LIB_EXPORT rc_t CC KRepositoryMgrGetProtectedRepository ( const KRepositoryMgr *self, 
+    uint32_t projectId, 
+    const KRepository **protected )
+{
+    rc_t rc;
+
+    if ( protected == NULL )
+        rc = RC ( rcKFG, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcKFG, rcMgr, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            char repNodeName[512] = "";
+            size_t numWrit = 0;
+            KRepositoryVector v;
+            rc = string_printf(repNodeName, sizeof repNodeName, &numWrit, "dbgap-%u", projectId); /* go case-insensitive */
+            assert(numWrit < sizeof(repNodeName));
+            
+            rc = KRepositoryMgrUserRepositories ( self, & v );
+            if ( rc == 0 )
+            {  /* look for all protected user repositories */
+                uint32_t i, count = VectorLength ( & v );
+                for ( i = 0; i < count; ++ i )
+                {
+                    const KRepository *r = ( const void* ) VectorGet ( & v, i );
+                    if ( r -> subcategory == krepProtectedSubCategory )
+                    {
+                        char localName[512] = "";
+                        size_t localNumWrit = 0;
+                        KRepositoryName(r, localName, sizeof(localName), &localNumWrit);
+                        assert(localNumWrit < sizeof(localName));
+                        if (strcase_cmp(repNodeName, numWrit, localName, localNumWrit, sizeof(localName)) == 0)
+                        {
+                            rc = KRepositoryAddRef ( r );
+                            if ( rc == 0 )
+                            {
+                                * protected = r;
+                                KRepositoryVectorWhack(&v);
+                                return 0;
+                            }
+                        }
+                    }
+                }
+                KRepositoryVectorWhack(&v);
+                rc = RC ( rcKFG, rcMgr, rcAccessing, rcNode, rcNotFound );
+            }
+        }
+    }
+
+    return rc;
+}    
+
+
+static rc_t find_repository_in_vector( KRepositoryVector * v, KRepository **repository, const char * name, uint32_t name_len )
+{
+    rc_t rc = 0;
+    KRepository * found = NULL;
+    uint32_t count = VectorLength ( v );
+    uint32_t i;
+    for ( i = 0; i < count && found == NULL; ++ i )
+    {
+        char r_name[ 512 ];
+        size_t written = 0;
+        KRepository * r = ( KRepository * ) VectorGet ( v, i );
+        rc = KRepositoryName( r, r_name, sizeof r_name , &written );
+        if ( strcase_cmp( name, name_len, r_name, written, sizeof r_name ) == 0 )
+        {
+            found = r;
+        }
+    }
+    if ( found == NULL )
+        rc = RC ( rcKFG, rcMgr, rcSearching, rcName, rcNotFound );
+    else
+        *repository = found;
+    return rc;
+}
+
+
+static rc_t create_child_node( const KConfigNode * self, const char * child_name, const char * child_val, uint32_t len )
+{
+    KConfigNode * child_node;
+    rc_t rc = KConfigNodeOpenNodeUpdate( ( KConfigNode * )self, &child_node, "%s", child_name );
+    if ( rc == 0 )
+    {
+        rc_t rc_2;
+        rc = KConfigNodeWrite( child_node, child_val, len );
+        rc_2 = KConfigNodeRelease( child_node );
+        if ( rc == 0 ) rc = rc_2;
+    }
+    return rc;
+}
+
+
+static rc_t make_writable_file( struct KFile ** dst, const char * path )
+{
+    KDirectory * dir;
+    rc_t rc = KDirectoryNativeDir( &dir );
+    if ( rc == 0 )
+    {
+        rc = KDirectoryCreateFile ( dir, dst, false, 0600, ( kcmInit | kcmParents ), "%s", path );
+        KDirectoryRelease( dir );
+    }
+    return rc;
+}
+
+
+static rc_t make_key_file( KRepositoryMgr * self, const struct KNgcObj * ngc, char * buffer, size_t buffer_size, size_t * written )
+{
+    struct String * home;
+    rc_t rc = KConfigReadString ( self->rw_cfg, "HOME", &home );
+    if ( rc == 0 )
+    {
+        rc = string_printf( buffer, buffer_size, written, "%S", home );
+        if ( rc == 0 )
+        {
+            size_t written2;
+            rc = string_printf( &buffer[ *written ], buffer_size - *written, &written2, "/.ncbi/dbGap-%u.enc_key", ngc->projectId );
+            if ( rc == 0 )
+                *written += written2;
+        }
+        StringWhack ( home );
+    }
+    if ( rc == 0 )
+    {
+        struct KFile * key_file;
+        rc = make_writable_file( &key_file, buffer );
+        if ( rc == 0 )
+        {
+            rc = KNgcObjWriteKeyToFile ( ngc, key_file );
+            KFileRelease( key_file );
+        }
+    }
+    return rc;
+}
+
+/******************************************************************************/
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+static rc_t _KRepositoryAppsNodeFix(KConfigNode *self,
+    const char *path, const char *val, size_t len, uint32_t *modifications)
+{
+    rc_t rc = 0;
+
+    KConfigNode *node = NULL;
+
+    assert(self && modifications);
+
+    rc = KConfigNodeOpenNodeUpdate(self, &node, path);
+    if (rc == 0) {
+        bool update = false;
+        char buffer[8] = "";
+        size_t num_read = 0;
+        size_t remaining = 0;
+        rc_t rc = KConfigNodeRead(node, 0,
+            buffer, sizeof buffer, &num_read, &remaining);
+        if ((rc != 0) || (string_cmp(buffer, num_read, val, len, len) != 0)) {
+            update = true;
+        }
+
+        if (update) {
+            rc = KConfigNodeWrite(node, val, len);
+            if (rc == 0) {
+                *modifications = INP_UPDATE_APPS;
+            }
+        }
+    }
+
+    RELEASE(KConfigNode, node);
+
+    return rc;
+}
+
+static rc_t _KRepositoryFixApps(KRepository *self, uint32_t *modifications) {
+    rc_t rf = 0;
+    rc_t rs = 0;
+
+    KConfigNode *self_node = NULL;
+
+    assert(self);
+
+    self_node = (KConfigNode*)self->node;
+
+    rf = _KRepositoryAppsNodeFix(self_node, "apps/file/volumes/flat",
+        "files", 5, modifications);
+
+    rs = _KRepositoryAppsNodeFix(self_node, "apps/sra/volumes/sraFlat",
+        "sra"  , 3, modifications);
+
+    return rf != 0 ? rf : rs;
+}
+
+/* we have not found a repository named repo_name, let us create a new one... */
+static rc_t create_new_protected_repository( KRepositoryMgr * self,
+    const struct KNgcObj * ngc, const char * location, uint32_t location_len, const char * repo_name, uint32_t name_len )
+{
+    KConfigNode * new_repository;
+    rc_t rc = KConfigOpenNodeUpdate( self->rw_cfg, &new_repository, "/repository/user/protected/dbGaP-%u", ngc->projectId );
+    if ( rc == 0 )
+    {
+        rc = create_child_node( new_repository, "download-ticket", ngc->downloadTicket.addr, ngc->downloadTicket.len );
+
+        if ( rc == 0 )
+            rc = create_child_node( new_repository, "description", ngc->description.addr, ngc->description.len );
+
+        if ( rc == 0 )
+            rc = create_child_node( new_repository, "apps/file/volumes/flat", "files", 5 );
+
+        if ( rc == 0 )
+            rc = create_child_node( new_repository, "apps/sra/volumes/sraFlat", "sra", 3 );
+
+        if ( rc == 0 )
+            rc = create_child_node( new_repository, "cache-enabled", "true", 4 );
+
+        if ( rc == 0 )
+            rc = create_child_node( new_repository, "root", location, location_len );
+
+        if ( rc == 0 )
+        {
+            size_t written;
+            char key_file_path[ 4096 ];
+            rc = make_key_file( self, ngc, key_file_path, sizeof key_file_path, &written );
+            if ( rc == 0 )
+                rc = create_child_node(new_repository,
+                    "encryption-key-path", key_file_path, (uint32_t)written);
+        }
+        KConfigNodeRelease( new_repository );
+    }
+    return rc;
+}
+
+
+static rc_t check_for_modifications(
+    const KRepository *repository, const KNgcObj *ngc,
+    uint32_t *modifications, uint32_t *notFoundNodes)
+{
+    rc_t rc = 0;
+    size_t written;
+    char buffer[ 1024 ];
+    assert(modifications && notFoundNodes);
+
+    if (rc == 0) {
+        rc = KRepositoryDownloadTicket(repository,
+            buffer, sizeof buffer, &written);
+        if (rc == 0) {
+            if (strcase_cmp(buffer, written, ngc->downloadTicket.addr,
+                ngc->downloadTicket.len, sizeof buffer) != 0)
+            {
+                *modifications |= INP_UPDATE_DNLD_TICKET;
+            }
+        }
+        else if (rc == SILENT_RC(rcKFG, rcNode, rcOpening, rcPath, rcNotFound)) 
+        {
+            rc = 0;
+            *notFoundNodes |= INP_UPDATE_DNLD_TICKET;
+        }
+    }
+
+    if (rc == 0) {
+        rc = KRepositoryEncryptionKey ( repository, buffer, sizeof buffer, &written );
+        if (rc == 0) {
+            if (strcase_cmp(buffer, written, ngc->encryptionKey.addr,
+                ngc->encryptionKey.len, sizeof buffer) != 0)
+            {
+                *modifications |= INP_UPDATE_ENC_KEY;
+            }
+        }
+        else if (rc == SILENT_RC(rcKFG, rcNode, rcOpening, rcPath, rcNotFound))
+        {
+            rc = 0;
+            *notFoundNodes |= INP_UPDATE_ENC_KEY;
+        }
+    }
+
+    if (rc == 0) {
+        rc = KRepositoryDescription ( repository, buffer, sizeof buffer, &written );
+        if (rc == 0) {
+            if (strcase_cmp(buffer, written, ngc->description.addr,
+                ngc->description.len, sizeof buffer) != 0)
+            {
+                *modifications |= INP_UPDATE_DESC;
+            }
+        }
+        else if (rc == SILENT_RC(rcKFG, rcNode,
+            rcOpening, rcPath, rcNotFound))
+        {
+            rc = 0;
+            *notFoundNodes |= INP_UPDATE_DESC;
+        }
+    }
+
+    return rc;
+}
+
+
+static rc_t check_for_root_modification(const KRepository *repository,
+    const char *root, uint32_t *modifications)
+{
+    rc_t rc = 0;
+    size_t root_size = 0;
+    char buffer[PATH_MAX] = "";
+    size_t bsize = 0;
+
+    if (root == NULL || modifications == NULL) {
+        return RC(rcKFG, rcMgr, rcAccessing, rcSelf, rcNull);
+    }
+
+    rc = KRepositoryRoot(repository, buffer, sizeof buffer, &root_size);
+    if (rc != 0) {
+        return rc;
+    }
+
+    bsize = string_measure(root, NULL);
+    if (strcase_cmp(buffer, root_size, root, bsize, sizeof buffer) != 0) {
+        *modifications |= INP_UPDATE_ROOT;
+    }
+
+    return rc;
+}
+
+/* we have an existing repository that corresponds with the given ngc-object, see if we have to / or can update its values */
+static rc_t update_existing_protected_repository( KRepositoryMgr * self,
+    KRepository * repository, const struct KNgcObj * ngc, uint32_t modifications )
+{
+    rc_t rc = 0;
+    /* make the changes... */
+    if ( modifications & INP_UPDATE_DNLD_TICKET )
+    {
+        rc = create_child_node( repository->node, "download-ticket", ngc->downloadTicket.addr, ngc->downloadTicket.len );
+    }
+
+    if ( rc == 0 && ( modifications & INP_UPDATE_ENC_KEY ) )
+    {
+        size_t written;
+        char key_file_path[ 4096 ];
+        rc = make_key_file( self, ngc, key_file_path, sizeof key_file_path, &written );
+        if ( rc == 0 )
+            rc = create_child_node(repository->node,
+                "encryption-key-path", key_file_path, (uint32_t)written);
+    }
+
+    if ( rc == 0 && ( modifications & INP_UPDATE_DESC ) )
+    {
+        rc = create_child_node( repository->node, "description", ngc->description.addr, ngc->description.len );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KRepositoryMgrImportNgcObj( KRepositoryMgr * self,
+    const struct KNgcObj * ngc, const char * location, uint32_t permissions, uint32_t * result_flags )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcKFG, rcMgr, rcUpdating, rcSelf, rcNull );
+    if ( ngc == NULL || location == NULL || result_flags == NULL )
+        rc = RC ( rcKFG, rcMgr, rcUpdating, rcParam, rcNull );
+    else
+    {
+        KRepositoryVector user_repositories;
+        size_t written;
+        char ngc_repo_name[ 512 ];
+        *result_flags = 0;
+        memset(&user_repositories, 0, sizeof user_repositories);
+        rc = string_printf( ngc_repo_name, sizeof ngc_repo_name, &written, "dbGaP-%u", ngc->projectId );
+        if ( rc == 0 )
+        {
+            KRepository *repository = NULL;
+            bool exists = false;
+
+            rc = KRepositoryMgrUserRepositories ( self, &user_repositories );
+            if ( rc == 0 )
+            {
+                rc = find_repository_in_vector(&user_repositories,
+                    &repository, ngc_repo_name, (uint32_t)written);
+                if ( rc == 0 )
+                {
+                    uint32_t modifications = 0;
+                    uint32_t notFoundNodes = 0;
+
+                    exists = true;
+
+                    /* test for any changes:
+                       1. download ticket
+                       2. enc. key
+                       3. description
+
+                       mark each bit that differs
+                    */
+                    rc = check_for_modifications(repository,
+                        ngc, &modifications, &notFoundNodes);
+                    if ( rc == 0 )
+                    {
+                        if (notFoundNodes != 0) {
+                            permissions |= notFoundNodes;
+                            modifications |= notFoundNodes;
+                        }
+
+                        /* reject if any modification was not authorized */
+                        if ( ( modifications & ( modifications ^ permissions ) ) != 0 )
+                        {
+                            /* tell what was wrong, set rc */
+                            * result_flags = modifications & ( modifications ^ permissions );
+                            rc = RC(rcKFG, rcMgr, rcUpdating,
+                                rcConstraint, rcViolated);
+                        }
+                        else if ( modifications != 0 )
+                        {
+                            /* apply changes - all are authorized */
+
+                            rc = update_existing_protected_repository( self, repository, ngc, modifications );
+                            if ( rc == 0 )
+                                *result_flags |= modifications;
+                        }
+                    }
+                }
+            }
+
+            if (! exists) {
+                if (permissions & INP_CREATE_REPOSITORY) {
+                    uint32_t location_len = string_measure (location, NULL);
+                    rc = create_new_protected_repository(
+                        self, ngc, location, location_len,
+                        ngc_repo_name, (uint32_t)written);
+                    if (rc == 0) {
+                        *result_flags |= INP_CREATE_REPOSITORY;
+                    }
+                }
+                else {
+                    *result_flags |= INP_CREATE_REPOSITORY;
+                    rc = RC(rcKFG, rcMgr, rcUpdating, rcConstraint, rcViolated);
+                }
+            }
+            else {
+                if (rc == 0 && permissions & INP_UPDATE_ROOT) {
+                    uint32_t modifications = 0;
+                    rc = check_for_root_modification(
+                        repository, location, &modifications);
+                    if (rc == 0) {
+                        if (modifications & INP_UPDATE_ROOT) {
+                            uint32_t location_len
+                                = string_measure(location, NULL);
+                            rc = KRepositorySetRoot(repository,
+                                location, location_len);
+                            if (rc == 0) {
+                                *result_flags |= INP_UPDATE_ROOT;
+                            }
+                        }
+                        else if (modifications != 0) {
+                            *result_flags |= INP_UPDATE_ROOT;
+                            rc = RC(rcKFG, rcMgr, rcCreating,
+                                rcConstraint, rcViolated);
+                        }
+                    }
+                }
+                if (rc == 0) {
+                    uint32_t modifications = 0;
+                    rc = _KRepositoryFixApps(repository, &modifications);
+                    if (rc == 0 && modifications != 0) {
+                        *result_flags |= INP_UPDATE_APPS;
+                    }
+                }
+            }
+        }
+
+        KRepositoryVectorWhack ( &user_repositories );
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT
+bool CC KRepositoryMgrHasRemoteAccess(const KRepositoryMgr *self)
+{
+    bool has = false;
+
+    rc_t rc = 0, r2 = 0;
+
+    uint32_t len = 0;
+
+    KRepositoryVector remote_repositories;
+    memset(&remote_repositories, 0, sizeof remote_repositories);
+
+    rc = KRepositoryMgrRemoteRepositories(self, &remote_repositories);
+
+    if (rc == 0) {
+        len = VectorLength(&remote_repositories);
+    }
+
+    if (rc == 0 && len > 0) {
+        uint32_t i = 0;
+        if (! KRepositoryMgrCategoryDisabled(self, krepRemoteCategory)) {
+            for (i = 0; i < len; ++ i) {
+                const KRepository *r = VectorGet(&remote_repositories, i);
+                if (r != NULL) {
+                    if (KRepositoryDisabled(r)) {
+                        continue;
+                    }
+
+                    if (KRepositorySubCategory(r)
+                        != krepProtectedSubCategory)
+                    {
+                        has = true;
+                    }
+                }
+            }
+        }
+    }
+
+    r2 = KRepositoryVectorWhack(&remote_repositories);
+    if (r2 != 0 && rc == 0) {
+        rc = r2;
+    }
+
+    if (rc != 0) {
+        return false;
+    }
+
+    return has;
+}
diff --git a/libs/kfs/.gitignore b/libs/kfs/.gitignore
new file mode 100644
index 0000000..c253038
--- /dev/null
+++ b/libs/kfs/.gitignore
@@ -0,0 +1 @@
+*.def
diff --git a/libs/kfs/Makefile b/libs/kfs/Makefile
new file mode 100644
index 0000000..eaed481
--- /dev/null
+++ b/libs/kfs/Makefile
@@ -0,0 +1,221 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: all
+
+TOP ?= $(abspath ../..)
+MODULE = libs/kfs
+
+INT_LIBS = \
+	libkfs \
+	libkfs-nommap \
+	libkff \
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES =           \
+	$(KFS_OBJ)       \
+	$(KFS_NOMMAP_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# mmap.c
+#  special rule to generate a disabled mmap
+#
+%.nommap.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) -DFORCE_MALLOC_MMAP -D_LIBRARY $<
+
+
+#-------------------------------------------------------------------------------
+# kfs
+#
+$(ILIBDIR)/libkfs: $(addprefix $(ILIBDIR)/libkfs.,$(ILIBEXT))
+
+$(ILIBDIR)/libkfs-nommap: $(addprefix $(ILIBDIR)/libkfs-nommap.,$(LIBX))
+
+KFS_CMN = \
+	directory \
+	arrayfile \
+	file \
+	sysdir \
+	sysfile \
+	sysmmap \
+	syslockfile \
+	sysdll \
+	gzip \
+	bzip \
+	md5 \
+	crc32 \
+	arc \
+	toc \
+	tocentry \
+	tocdir \
+	tocfile \
+	sra \
+	tar \
+	teefile \
+	buffile \
+	buffile-read \
+	buffile-write \
+	subfile \
+	nullfile \
+	countfile \
+	dir_test \
+	pagefile \
+	pmem \
+	readheadfile \
+	ramfile \
+	extendable-ramfile \
+	quickmount \
+	report \
+	lockfile \
+	syslockfile \
+	cacheteefile \
+	from_to_namelist
+
+KFS_SRC = \
+	mmap \
+	$(KFS_CMN)
+
+ifeq (win,$(OS))
+	KFS_SRC += directory-path
+endif
+
+KFS_NOMMAP_SRC = \
+	mmap.nommap \
+	$(KFS_CMN)
+
+KFS_OBJ = \
+	$(addsuffix .$(LOBX),$(KFS_SRC))
+
+KFS_NOMMAP_OBJ = \
+	$(addsuffix .$(LOBX),$(KFS_NOMMAP_SRC))
+
+KFS_LIB = \
+	-dkproc \
+	-dklib \
+	-ddl \
+	-dz \
+	-dbz2
+
+#	-dsz \
+
+$(ILIBDIR)/libkfs.$(LIBX): $(KFS_OBJ)
+	$(LD) --slib -o $@ $^ $(KFS_LIB)
+
+$(ILIBDIR)/libkfs-nommap.$(LIBX): $(KFS_NOMMAP_OBJ)
+	$(LD) --slib -o $@ $^ $(KFS_LIB)
+
+
+
+#-------------------------------------------------------------------------------
+# kfs.2
+#
+$(ILIBDIR)/libkfs.2: $(addprefix $(ILIBDIR)/libkfs.2.,$(ILIBEXT))
+
+KFS2_SRC = \
+	$(KFS_SRC) \
+	file-v2 \
+	directory-v2 \
+	sysfile-v2 
+#	sysdir-v2
+
+KFS2_OBJ = \
+	$(addsuffix .$(LOBX),$(KFS2_SRC))
+
+KFS2_LIB = \
+	$(KFS_LIB)
+
+$(ILIBDIR)/libkfs.2.$(LIBX): $(KFS2_OBJ)
+	$(LD) --slib -o $@ $^ $(KFS2_LIB)
+
+
+#-------------------------------------------------------------------------------
+# kff
+#
+ifeq (1,$(HAVE_MAGIC))
+
+$(ILIBDIR)/libkff: $(addprefix $(ILIBDIR)/libkff.,$(ILIBEXT))
+
+OBJFILES += $(KFF_OBJ)
+
+KFF_SRC = \
+	fileformat \
+	ffext \
+	ffkey \
+	ffmagic
+
+KFF_OBJ = \
+	$(addsuffix .$(LOBX),$(KFF_SRC))
+
+KFF_LIB = \
+	-dkfg \
+	-dklib
+
+ifneq (win,$(OS))
+	KFF_LIB += -lmagic
+endif
+
+$(ILIBDIR)/libkff.$(LIBX): $(KFF_OBJ)
+	$(LD) --slib -o $@ $^ $(KFF_LIB)
+
+else
+
+$(ILIBDIR)/libkff:
+	@ echo "NOTE - internal library $(@F) cannot be built:"         \
+	       "It requires 'libmagic' and its development headers."
+
+endif
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/kfs/arc.c b/libs/kfs/arc.c
new file mode 100644
index 0000000..a69cfb4
--- /dev/null
+++ b/libs/kfs/arc.c
@@ -0,0 +1,4089 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+#include "karc-priv.h"
+#include "toc-priv.h"
+
+#include <kfs/arc.h>
+
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/status.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/vector.h>
+#include <klib/pbstree.h>
+#include <klib/text.h>
+#include <klib/sort.h>
+#include <klib/printf.h>
+#include <klib/klib-priv.h> /* ReportRecordZombieFile */
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/toc.h>
+#include <kfs/sra.h>
+#include <kfs/cacheteefile.h>
+
+#include <kns/http.h>
+
+#include <sysalloc.h>
+
+#include <atomic32.h>
+#include <os-native.h>
+
+#include <assert.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <va_copy.h>
+
+/* SHOULD NOT INCLUDE THESE DIRECTLY */
+#include <fcntl.h>
+#include <sys/stat.h>
+
+const char * get_mode_string (KCreateMode mode);
+/* defined in dir_test.c */
+
+extern const char *gRCModule_str[];
+extern const char *gRCTarget_str[];
+extern const char *gRCContext_str[];
+extern const char *gRCObject_str[];
+extern const char *gRCState_str[];
+#define _LOG_RC(level,rc)	PLOGMSG(( level,			\
+					  "Return Code:: $(M):$(T):$(C):$(O):$(S)", \
+					  PLOG_5(PLOG_U32(M),PLOG_U32(T),PLOG_U32(C),PLOG_U32(O),PLOG_U32(S)), \
+					  GetRCModule(rc),		\
+					  GetRCTarget(rc),		\
+					  GetRCContext(rc),		\
+					  GetRCObject(rc),		\
+					  GetRCState(rc)))
+#define LOG_RC(level,rc)	PLOGMSG(( level,			\
+					  "Return Code:: $(M):$(T):$(C):$(O):$(S)", \
+					  PLOG_5(PLOG_S(M),PLOG_S(T),PLOG_S(C),PLOG_S(O),PLOG_S(S)), \
+					  gRCModule_str[GetRCModule(rc)], \
+					  gRCTarget_str[GetRCTarget(rc)], \
+					  gRCContext_str[GetRCContext(rc)], \
+					  (GetRCObject(rc)<rcLastTarget_v1_0)? \
+					  gRCTarget_str[GetRCObject(rc)]: \
+					  gRCObject_str[1+GetRCObject(rc)-rcLastTarget_v1_0], \
+					  gRCState_str[GetRCState(rc)]))
+/* #define LOG_RC(level,rc)	\ */
+/*     PLOGMSG(( level, "m $(R)",PLOG_S(R),gRCModule_str[GetRCModule(rc)])),	\ */
+/* 	PLOGMSG(( level, "t $(R)",PLOG_S(R),gRCTarget_str[GetRCTarget(rc)])), \ */
+/* 	PLOGMSG(( level, "c $(R)",PLOG_S(R),gRCContext_str[GetRCContext(rc)])), \ */
+/* 	PLOGMSG(( level, "o $(R)",PLOG_S(R),(GetRCObject(rc)<rcLastTarget_v1_0)? \ */
+/* 		  gRCTarget_str[GetRCObject(rc)]:			\ */
+/* 		  gRCObject_str[1+GetRCObject(rc)-rcLastTarget_v1_0])), \ */
+/* 	PLOGMSG(( level, "s $(R)",PLOG_S(R),gRCState_str[GetRCState(rc)])) */
+
+
+#ifdef _DEBUGGING
+#define FUNC_ENTRY() DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_ARCENTRY), ("Enter: %s\n", __func__))
+#define KFF_DEBUG(msg) DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_ARC), msg)
+#else
+#define FUNC_ENTRY()
+#define KFF_DEBUG(msg)
+#endif
+
+
+/* ----------------------------------------------------------------------
+ * 
+ */
+
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+#define KDIR_IMPL struct KArcDir
+#define KFILE_IMPL struct KArcFile
+#include <kfs/impl.h>
+
+static rc_t KArcDirResolvePathNode (const KArcDir *self,
+                                    enum RCContext ctx,
+                                    const char *path,
+                                    bool follow_sym_link,
+                                    const KTocEntry ** pnode,
+                                    KTocEntryType * ptype);
+
+
+
+/* ======================================================================
+ * Defines relevant to the whole compilation unit.
+ */
+/* arbitrary number that was originially set much much higher than expected needs. */
+#define	KARC_LINK_RESOLVE_LOOPMAX		(16)
+
+/* -----
+ * We use MAX_PATH if it is available but not religiously.  We handle most
+ * buffer over-runs with in the module only truncating paths at the border
+ * of the module where KDirectory doesn't handle path's longer than MAX_PATH
+ */
+#ifdef MAX_PATH
+#define	KARC_DEFAULT_PATH_ALLOC			(MAX_PATH)
+#else
+#define	KARC_DEFAULT_PATH_ALLOC			(4096)
+#endif
+
+
+
+
+
+/* ======================================================================
+ * KArcDirIterator
+ *
+ * This very simple iterator steps in order through the nodes of the binary
+ * search tree that is a "directory" in a KToc and thus steps through the
+ * list of elements in a directory.  Only the name is made available at each
+ * step.  That worked better for sysdir than arcdir from where this was 
+ * borrowed (it was called SysDirEnum there)
+ *
+ * It is primarily used to build a directory listing.
+ *
+ * This iterator is a once through iterator.  Whack must be called after Init
+ * or a dangling reference is left open.  Init can be called again but only if 
+ * Whack was indeed called.
+ *
+ * NOTE:
+ * This class unlike most in the KFS system is built in place and is not
+ * constructed by default allocating memory in the constructor.
+ * This means it can not be truly opaque as the structure of the base struct
+ * has to be exposed so it can be created.
+ */
+
+
+/*--------------------------------------------------------------------------
+ * KArcDirIterator
+ *
+ * a ArcDir directory enumerator/iterator getting the names of elements in
+ * the TOC.
+ *
+ * const KToc *	  toc		a keep alive so the BSTree won't go
+ *					away in the middle
+ * union                  u		A union to allow pointers to base and
+ *					derivative class
+ *					without casting
+ *   const BSTNode * 	  bnp		point to a node as a BSTNode
+ *   const KTocEntry *  tnp		point to a node as a KTocEntry
+ * bool                   isFirst;	upon creation this flag is set to true;
+ *					set to false the first next call
+ */
+typedef struct KArcDirIterator 	
+{
+    const KToc * toc;	        /* a keep alive so the BSTree won't go away in the middle */
+    union
+    {
+        const BSTNode * bnp;	/* point to a node as a BSTNode */
+        const KTocEntry * tnp;	/* point to a node as a KTocEntry */
+    }			u;
+    bool isFirst;	            /* upon creation this flag is set to true
+                                   set to false the first next call */
+} KArcDirIterator;
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirIteratorWhack
+ * 	The Object destructor
+ * [INOUT] KArcDirIterator *self	Iterator self reference: object oriented in C
+ */
+static
+void KArcDirIteratorWhack (KArcDirIterator *self)
+{
+    KTocRelease ( self -> toc );
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirIteratorInit
+ * 
+ * The object constructor
+ *
+ * [OUT] KArcDirIterator *	self		Iterator self reference: object oriented in C
+ * [IN]  const KArcDir * 	arcdir		A directory that contains beneath it (or as it)
+ *						the directory to be iterated.
+ * [IN]	 const char * 		path		The directory to be iterated as referenced from
+ *						arcdir.
+ *
+ * To iterate arcdir use a path of ".".
+ */
+static
+rc_t KArcDirIteratorInit (KArcDirIterator *self, const KArcDir * arcdir, 
+                          const char * path)
+{
+    const BSTree * 	tree;
+    const KTocEntry * node;
+    const KToc *	toc;
+    KTocEntryType	type;
+    rc_t		rc;
+
+    /* is self parameter possibly bad? */
+    if (self == NULL)
+        return RC (rcFS, rcDirectory, rcConstructing, rcSelf, rcNull);
+
+    self->toc = NULL;
+    self->isFirst = true;	/* warning squelcher ? that breaks type opacity */
+    self->u.bnp = NULL;
+
+    /* is another parameter possibly bad? */
+    if ((path == NULL)||(arcdir == NULL))
+        return RC (rcFS, rcDirectory, rcConstructing, rcParam, rcNull);
+
+    if (KArcDirGetTOC(arcdir,&toc) != 0)
+        return RC (rcFS, rcDirectory, rcConstructing, rcParam, rcNotFound);
+
+    self->toc = toc;
+    KTocAddRef(toc);
+
+    /* get the KTocEntry from which all things are possible */
+    rc = KArcDirResolvePathNode (arcdir, rcConstructing, path, true, &node, &type);
+    if ( rc == 0 )
+    {
+        if ((type == ktocentrytype_dir) || (type == ktocentrytype_hardlink))
+        {
+            rc = KTocEntryGetBSTree (node, &tree);
+            if (rc == 0)
+            {
+                /* success */
+                self->u.bnp = BSTreeFirst(tree);
+                return 0;
+            }
+        }
+        else
+        {
+            rc = RC (rcFS, rcDirectory, rcConstructing, rcParam, rcInvalid);
+        }
+    }
+
+    /* failure */
+    KTocRelease (self->toc);
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirIteratorNext
+ *
+ * Go to the next node (or the first node if the iterator has not been used.
+ *
+ * [RET]   const char * 			The return is the name of the next element
+ * [INOUT] KArcDirIterator *	self		Iterator self reference: object oriented in C
+ */
+static const char * KArcDirIteratorNext (KArcDirIterator *self)
+{
+    const char * name;
+
+    assert (self != NULL);
+
+    /* -----
+     * The initialization put the first node's address into the pointer
+     * so do do nothing about the pointer before using it except say we
+     * need to update it next time.
+     */
+    if (self->isFirst)
+    {
+        self->isFirst = false;
+    }
+    /* -----
+     * After the first time we need to bump the pointer until it can't be bumped.
+     */
+    else	
+    {
+        /* -----
+         * It's not specified in klib/container.h but BSTNodeNext
+         * returns NULL at end of tree
+         * [ WHAT ELSE WOULD IT RETURN? ]
+         */
+        self->u.bnp = BSTNodeNext (self->u.bnp);
+    }
+
+    /* -----
+     * The first test isn't necesary so letting KTocEntryGetName return NULL
+     * could be used instead of the extra check.
+     * Checking against NULL adds a little to each call while not checking
+     * adds more but only to the last call.
+     * Pick your poison.
+     */
+    if ((self->u.bnp == NULL) || (KTocEntryGetName (self->u.tnp, &name) != 0))
+    {
+        return NULL;
+    }
+    return name;
+}
+
+
+/* ======================================================================
+ */
+typedef struct KArcListing KArcListing;
+
+#define KNAMELIST_IMPL struct KArcListing
+#include <klib/impl.h>
+
+/*--------------------------------------------------------------------------
+ * KArcListing
+ *  a directory listing
+ *
+ * NOTE:
+ * This is nearly identical to KSysDirListing but both are currently private to
+ * their compilation units.
+ */
+struct KArcListing
+{
+    KNamelist     dad;      /* base class */
+    const char ** namelist; /* pointer to a malloced array of pointers to names */
+    int           cnt;      /* specific size chosen by compiler for efficiency */
+};
+
+
+/* ----------------------------------------------------------------------
+ * KArcListingWhack
+ *
+ * Class destructor
+ *
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [INOUT] const KArcListing* self		Listing self reference: object oriented in C
+ */
+static
+rc_t CC KArcListingWhack (const KArcListing *self)
+{
+    int ix;
+    for ( ix = 0; ix < self->cnt; ++ix )
+    {
+        free ( (void*)self->namelist[ix] );
+    }
+    free ( (void*)self->namelist );
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcListingDestroy
+ * Class destructor
+ *
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [INOUT] KArcListing *	self		Listing self reference: object oriented in C
+ */
+static
+rc_t CC KArcListingDestroy (KArcListing *self)
+{
+    rc_t rc = KArcListingWhack (self);
+    if (rc == 0)
+        free (self);
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcListingCount
+ *
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]  const KArcListing *	self		Listing self reference: object oriented in C
+ * [OUT] uint32_t *		count		Where to put the count of names
+ */
+static rc_t CC KArcListingCount (const KArcListing *self, uint32_t *count)
+{
+    *count = self->cnt;
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcListingGet
+ *
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]  const KArcListing *	self		Listing self reference: object oriented in C
+ * [IN]  uint32_t		idx		?
+ * [OUT] const char **		name		Where to put the name
+ */
+static rc_t CC KArcListingGet (const KArcListing *self, uint32_t idx, const char **name)
+{
+    if (idx >= (uint32_t)self->cnt)
+        return RC (rcFS, rcNamelist, rcAccessing, rcParam, rcExcessive);
+    * name = self -> namelist [ idx ];
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcListingSort
+ *
+ * This function has the signature needed to use with the NameList base class for
+ * KArcListings to determine the order of two names.  Matches the signature of
+ * strcmp() and other functions suitable for use by qsort() and others
+ *
+ * [RET] int					0:  if a == b 
+ *						<0: if a < b
+ *						>0: if a > b
+ * [IN] const void *		a
+ * [IN] const void *		b
+ *
+ * Elements are typed as const void * to match the signature needed for 
+ * a call to qsort() but they should be pointers to namelist elements
+ */
+static int64_t CC KArcListingSort (const void *a, const void *b, void * ignored)
+{
+    return strcmp (*(const char**)a, *(const char**)b);
+}
+
+static KNamelist_vt_v1 vtKArcListing =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* start minor version 0 methods */
+    KArcListingDestroy,
+    KArcListingCount,
+    KArcListingGet
+    /* end minor version 0 methods */
+};
+
+
+/* ----------------------------------------------------------------------
+ * KArcListingInit
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [INOUT] KArcListing *	self		Listing self reference: object oriented in C
+ * [IN]    const char *		path		?
+ * [IN]    const KDirectory *	dir		?
+ * [IN]    bool (* 		f	)(const KDirectory*, const char*, void*),
+ *						This is a filter function - any listing element
+ *						passed to this function will generate a true ot
+ *						a false.  If flase that listing element is dropped.
+ *						If this parameter is NULL all elements are kept.
+ * [IN]	   void *		data		Ignored.  May use NULL if permitted
+ *						by 'f'.
+ */
+static rc_t KArcListingInit (KArcListing *self,
+                             const char *path,
+                             const KDirectory *dir,
+                             bool (CC* f) (const KDirectory*, const char*, void*),
+                             void *data)
+{
+    rc_t rc;
+
+    /* is self parameter possibly NULL? */
+    if (self == NULL)
+    {
+        return  RC (rcFS, rcDirectory, rcConstructing, rcSelf, rcNull);
+    }
+
+    /* start with an empty name list */
+    self->namelist = NULL;
+    self->cnt = 0;
+
+    /* initialize the Namelist base class */
+    if ((rc = KNamelistInit (& self -> dad,
+			     (const KNamelist_vt*)&vtKArcListing)) == 0)
+    {
+        /* -----
+         * so we'll build a list iterator
+         */
+        KArcDirIterator listitr;
+
+        if ((rc = KArcDirIteratorInit (& listitr, (const KArcDir*)dir, path)) == 0)
+        {
+
+#define	LEN_INCREMENT	(512)
+
+            uint32_t len = LEN_INCREMENT;
+
+            /* allocate heap for the default start size of a namelist */
+
+            self->namelist = malloc (len * sizeof (self->namelist[0]));
+            if (self->namelist == NULL)
+            {
+                rc = RC (rcFS, rcDirectory, rcListing, rcMemory, rcExhausted);
+            }
+            else
+            {
+                void *r;
+                const char *name;
+
+                /* -----
+                 * loop through the directory (the BSTree for a Archive TOC)
+                 */
+                while ((name = KArcDirIteratorNext (&listitr)) != NULL)
+                {
+                    /* if there is a filter function, run it */
+                    if (f != NULL)
+                    {
+                        /* skip if the filter doesn't say use it */
+                        if (! (*f) (dir, name, data))
+                            continue;
+                    }
+		    
+                    /* if the buffer is full, reallocate it larger */
+                    if (self->cnt == len)
+                    {
+                        len += LEN_INCREMENT;
+                        if ( NULL == ( r = realloc ( (void*)self -> namelist,
+                                                     len * sizeof self -> namelist [ 0 ] ) ) )
+                        {
+                            /* -----
+                             * malloc failure so we fail too  - break not return so we can 
+                             * free allocated memory
+                             */
+                            rc = RC (rcFS, rcDirectory, rcListing, rcMemory, rcExhausted);
+                            break;
+                        }
+                        self->namelist = r;
+                    }
+                    
+                    /* get ourselves memory for the name */
+                    self->namelist[self->cnt] = malloc (strlen (name) + 1);
+                    if (self->namelist[self->cnt] == NULL)
+                    {
+                        /* oops a failure so we fail */
+                        rc = RC (rcFS, rcDirectory, rcListing, rcMemory, rcExhausted);
+                        break;
+                    }
+                    strcpy ((char*)self->namelist[self->cnt], name);
+                    ++self->cnt;
+                }
+		
+                if (rc == 0)
+                {
+                    /* -----
+                     * now that we have our list and know how big it should have been we'll shrink it
+                     * if the count was zero this a effectively just a free()
+                     */
+                    r = realloc ( ( void* )self->namelist,
+                                  self->cnt * sizeof ( self->namelist[0] ) );
+                    /* -----
+                     * if we have a new non-NULL pointer we know we have a list of non-zero length
+                     * store the pointer and sort the list
+                     */
+                    if (r != NULL)
+                    {
+                        self -> namelist = r;
+                        ksort ((void*)r, self -> cnt, sizeof self -> namelist [ 0 ], KArcListingSort, NULL);
+                    }
+                    /* -----
+                     * If we have a NULL pointer but have a non-zero count, we have a malloc() heap
+                     * space failure
+                     */
+                    else if (self -> cnt != 0)
+                    {
+                        rc = RC (rcFS, rcDirectory, rcListing, rcMemory, rcExhausted);
+                    }
+                    /* -----
+                     * Or we have a NULL pointer and a count of zero so stow the NULL so its not
+                     * a dangling bad pointer
+                     */
+                    else
+                    {
+                        self->namelist = r;
+                    }
+                }
+                /* if we got here because of a problem, kill the listing */
+                if (rc != 0)
+                {
+                    KArcListingWhack (self);
+                    self->namelist = NULL;
+                    self->cnt = 0;
+                }
+            }
+            /* we're done with the iterator so kill it */
+            KArcDirIteratorWhack (&listitr);
+        }
+    }
+    return rc;
+}
+
+
+/* ======================================================================
+ */
+
+/*--------------------------------------------------------------------------
+ * KArcDir
+ *  a directory inside an archive (tar or SRA for example)
+ *
+ * This type is being engineered to mimic KSysDir.
+ */
+struct KArcDir
+{
+    KDirectory		dad;					/* parent class as in inheritance */
+
+    const KDirectory *  parent;					/* parent object */
+    const KToc *	toc;					/* table of contents class */
+    const KTocEntry *	node;					/* table of contents entry NULL for top level */
+    KArcFSType	arctype;
+    union
+    {
+	const void *		v;
+	const KFile *		f;
+	const KDirectory * 	d;
+    } archive;
+
+    uint32_t	  	root;					/* offset of / in path to treat as root */
+    uint32_t 	  	size;					/* length of path */		
+    char 	  	path	 [KARC_DEFAULT_PATH_ALLOC];	/* name of archive = mount point */
+   
+/* actual allocation is based on actual string length */
+};
+
+static rc_t KArcDirMake (KArcDir ** self,
+                         enum RCContext ctx,
+                         const KDirectory * parent,
+                         const KToc * toc,
+                         const KTocEntry * node,
+                         const void * archive,
+                         KArcFSType baseType,
+                         uint32_t dad_root,
+                         const char *path,
+                         uint32_t path_size,
+                         bool update, /* ignored */
+                         bool chroot);
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirDestroy
+ */
+static rc_t CC KArcDirDestroy (KArcDir *self)
+{
+    if (self->toc != NULL)
+        KTocRelease (self->toc);
+
+    if (self->archive.v != NULL) switch (self->arctype)
+	{
+	default:
+	    free ((void*)self->archive.v);
+	    break;
+	case tocKFile:
+	    KFileRelease (self->archive.f);
+	    break;
+	case tocKDirectory:
+	    KDirectoryRelease (self->archive.d);
+	    break;
+	}
+    free (self);
+
+    return 0;
+}
+
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirCanonPath
+ *
+ * In this context CanonPath means to make the path a pure /x/y/z with no back tracking 
+ * by using ~/../~ or redundant ~/./~ or ~//~ here notations.  Not exactly the usage of 
+ * canonical in describing a path in other places but consistent within KFS.  It matches
+ * the common meaning of canonical path as the one true path except that processing out
+ * of sym links isn't done here but would normally have been.  Not processing the 
+ * links means potentially more than one canonical path can reach the same target 
+ * violating the usual meaning of canonical path as the one true shortest path to any
+ * element.
+ *
+ * const KArcDir *		self		Object oriented C; KArcDir object for this method
+ * enum RCContext 		ctx
+ * char * 			path
+ * size_t			psize
+ */
+static
+rc_t		KArcDirCanonPath	(const KArcDir *self,
+					 enum RCContext ctx,
+					 char *path,
+					 size_t psize)
+{
+    char *	low;	/* a pointer to the root location in path; not changed after initialization */
+    char *	dst;	/* a target reference for compressing a path to remove . and .. references */
+    char *	last;	/* the end of the last processed facet of the path */
+    char *	end;	/* absolute end of the incoming path */
+    char * 	src;	/* the start of the current facet to be processed */
+
+    /* end is the character after the end of the incoming path */
+    end = path + psize;
+
+    /* point all other temp pointers at the root point in the incoming path */
+    last = path + self->root;
+
+    /* handle windows / / network path starter */
+    if ((last == path) && (last[0] == '/') && (last[1] == '/'))
+      last ++;
+
+    low = dst = last;
+
+    for (;;)
+    {
+
+        /* point at the first / after the most recent processed facet */
+        src = strchr (last + 1, '/');
+        if (src == NULL)	/* if no '/' point to the end */
+            src = end;
+
+        /* detect special sequences */
+        switch (src - last)
+        {
+        case 1: /* / / (with nothing between) is a superflouous / hurting us to parse later;
+                 * /. is a here reference to the same directory as the previous */
+            if ((last[1] == '/')||(last[1] == '.'))
+            {
+                /* skip over */
+                last = src;
+                if (src != end)
+                    continue;
+            }
+            break;
+        case 2: /* /./ is a "here" reference point and is omitted by not copying it over */
+            if (last[1] == '.')
+            {
+                /* skip over */
+                last = src;
+                if (src != end)
+                    continue;
+            }
+            break;
+
+        case 3: /* /../ is a up one directory and is processed by deleting the last facet copied */
+            if (last [1] == '.' && last [2] == '.')
+            {
+                /* remove previous leaf in path */
+                dst [ 0 ] = 0;
+                dst = strrchr (path, '/');
+                /* can't up a directory past the root */
+                if (dst == NULL || dst < low)
+                {
+                    return RC (rcFS, rcDirectory, ctx, rcPath, rcInvalid);
+                }
+
+                last = src;
+                if (src != end)
+                    continue;
+            }
+            break;
+        }
+
+        /* if rewriting, copy leaf */
+        if (dst != last)
+        {
+            memmove (dst, last, src - last);
+        }
+
+        /* move destination ahead */
+        dst += src - last;
+        
+        /* if we're done, go */
+        if (src == end)
+            break;
+
+        /* find next separator */
+        last = src;
+    }
+
+    /* NUL terminate if modified */
+    if (dst != end)
+        * dst = 0;
+
+    /* say we did did it with no problems */
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirMakePath
+ *
+ *  creates a full path from partial
+ *
+ * [IN]  const KArcDir *	self	object oriented self
+ * [IN]  enum RCContext		ctx	a hint for context in building
+ *					an error return rc_t
+ * [IN]  bool			canon	Should the output be made 
+ *					canonical per KDirectory's
+ *					definition of canonical
+ * [OUT] char **		pbuffer The output path
+ * [IN]  const char *		path	The input path
+ * [IN]  va_list		args	Possible additions to path
+ */
+static
+rc_t KArcDirMakePath (const KArcDir *self,
+		      enum RCContext ctx,
+		      bool canon,
+		      char ** pbuffer,
+		      const char *path,
+		      va_list args)
+{
+    int    psize;	/* 'printed' size - output from vsnprintf */
+    size_t asize;	/* allocated buffer size */
+    size_t bsize;	/* base size */
+    char * buffer;
+
+    /* -----
+     * Validate parameters and fail if unusable
+     */
+    assert (path != NULL);
+    assert (pbuffer != NULL);
+
+    if (path == NULL)
+    {
+	return RC (rcFS, rcDirectory, ctx, rcPath, rcNull);
+    }
+    if (path[0] == 0)
+    {
+	return RC (rcFS, rcDirectory, ctx, rcPath, rcInvalid);
+    }
+
+    buffer = NULL;
+    asize = KARC_DEFAULT_PATH_ALLOC;
+    for (;;)
+    {
+	/* -----
+	 * allocate a buffer of the default size or a better size determined below
+	 */
+	buffer = realloc (buffer, asize);
+	*pbuffer = buffer;
+	if (buffer == NULL)
+	{
+	    return RC (rcFS, rcDirectory, rcAllocating, rcPath, rcExhausted);
+	}
+	/* -----
+	 * inherited from linux/sysdir.c
+	 *
+	 * if path starts with % we build something out of va_list?
+	 *
+	 * use vsnprintf (printf to string with size limit and argument list
+	 *	pointer instead of a list of arguments:
+	 * build path to buffer using a path that is a printf format string
+	 * with a requirement that the first thing in the format be a format inducing %
+	 */
+	if ((args != NULL) && (path[0] == '%'))
+	{
+	    psize = vsnprintf (buffer, asize, path, args);
+
+	    /* -----
+	     * decoding of path failed due a failure of printf
+	     * <0 is an unspecified failure unspecified (check errno?)
+	     */
+	    if (psize < 0)
+            return RC (rcFS, rcDirectory, ctx, rcPath, rcUnknown);
+
+	    /* -----
+	     * decoding of path failed due to length truncation
+	     * try to realloc using a larger size
+	     */
+	    if ( (size_t)psize >= asize )
+	    {
+            asize = psize;
+            continue;
+	    }
+
+	    /* -----
+	     * maybe the decoded path is a relative partial path
+	     */
+	    if (buffer[0] != '/')
+	    {
+            /* -----
+             * if our KArcDir self has a mount point self->path of length more than 0
+             * but that length isn't too long to prepend it to the derived path than
+             * move the derived path over making room for the KArcDir base path and 
+             * then insert that base at the beginning
+             */
+            bsize = self->size;
+            if (bsize + psize >= asize)
+            {
+                asize = bsize + psize;
+                continue;
+            }
+            /* make room */
+            memmove (buffer + self->size, buffer, psize+1);
+            /* fail if the kDirectory path doesn't end in /? (inherited) */
+            assert (self->path[bsize-1] == '/');
+            /* prepend self's path */
+            memmove (buffer, self->path, bsize);
+	    }
+
+	    /* -----
+	     * or maybe we have a path base for the KArcDir
+	     */
+	    else if ((bsize = self->root) != 0)
+	    {
+            /* -----
+             * if we got a full path from the decoding do the same thing but only the
+             * amount of the self's path that is up to an effective "chroot" point
+             */
+            if (bsize + psize >= asize)
+            {
+                asize = bsize + psize;
+                continue;
+            }
+            memmove (buffer + self->size, buffer, psize+1);
+            assert (self->path [bsize-1] != '/');
+            memmove (buffer, self -> path, bsize);
+	    }
+	    /* -----
+	     * or maybe the new path is cool as is.  unlikely?
+	     */
+	}
+	else
+	{
+	    /* -----
+	     * copy a partial/relative  path parameter into the buffer leaving room for the
+	     * self's base path
+	     */
+	    if (path[0] != '/')
+	    {
+            assert (self->path[self->size - 1] == '/');
+            memmove (buffer, self->path, bsize = self->size);
+	    }
+	    /* -----
+	     * copy the pre-root portion of the self's path into the buffer
+	     */
+	    else if ((bsize = self->root) != 0)
+	    {
+            assert (self->path[bsize-1] != '/');
+            memmove (buffer, self->path, bsize);
+	    }
+
+	    /* -----
+	     * okay use snprintf to append the incoming path into the buffer after the
+	     * self's base or root either using a simple string format or again assuming
+	     * that the path has printf format symbols if there are arguments in the
+	     * va_list
+	     */
+	    if (args == NULL)
+            psize = snprintf (buffer+bsize, asize-bsize, "%s", path);
+	    else
+            psize = vsnprintf (buffer+bsize, asize-bsize, path, args);
+
+	    /* -----
+	     * decoding of path failed due a failure of printf
+	     * <0 is an unspecified failure unspecified (check errno?)
+	     */
+	    if (psize < 0)
+            return RC (rcFS, rcDirectory, ctx, rcPath, rcUnknown);
+
+	    /* -----
+	     * decoding of path failed due to length truncation
+	     * try to realloc using a larger size
+	     */
+	    if (bsize+psize >= asize)
+	    {
+            asize = bsize+psize;
+            continue;
+	    }
+	}
+	break;
+    }
+    /* -----
+     * if the last character is a '/' get rid of it?
+     */
+    if (buffer[bsize+psize] == '/')
+        buffer[bsize+(--psize)] = 0;
+
+    /* -----
+     * if the incoming path turns out to be a single character (I think) AND
+     * we either have the canon flag set or if the the KArcDir root is not empty
+     * "canonize" it.
+     */
+    if (canon || (self->root != 0))
+    {
+        return KArcDirCanonPath (self, ctx, *pbuffer, bsize+psize);
+    }
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirList
+ *  create a directory listing
+ *
+ *  "list" [ OUT ] - return parameter for list object
+ *
+ *  "path" [ IN, NULL OKAY ] - optional parameter for target
+ *  directory. if NULL, interpreted to mean "."
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]	 const KArcDir *	self		Object oriented C; KArcDir object for this method
+ * [OUT] KNamelist **		listp,
+ * [IN]  bool (* 		f	)(const KDirectory*,const char *, void *)
+ * [IN]  void *			data
+ * [IN]  const char *		path
+ * [IN]  va_list		args
+ */
+static
+rc_t CC KArcDirList (const KArcDir *self,
+                     KNamelist **listp,
+                     bool (CC* f) (const KDirectory *dir, const char *name, void *data),
+                     void *data,
+                     const char *path,
+                     va_list args)
+{
+    char * full_path;
+    rc_t rc;
+
+    rc = KArcDirMakePath (self, rcListing, true,
+			  &full_path, path, args);
+    if (rc == 0)
+    {
+	const KTocEntry * pnode;
+	KTocEntryType	type;
+	KArcDir * full_dir;
+
+	rc = KArcDirResolvePathNode(self, rcListing, full_path, true, &pnode, &type);
+	if (rc == 0)
+	{
+	    rc = KArcDirMake (&full_dir,
+			      rcListing,
+			      self->parent,
+			      self->toc,
+			      pnode,
+			      self->archive.v,
+			      self->arctype,
+			      self->root,
+			      full_path,
+			      (uint32_t)strlen(full_path),
+			      false, 
+			      0);
+	    if (rc == 0)
+	    {
+		KArcListing *list = malloc (sizeof *list);
+
+		if (list == NULL)
+		{
+		    rc = RC (rcFS, rcDirectory, rcListing, rcMemory, rcExhausted);
+		}
+		else
+		{
+		    rc = KArcListingInit (list,
+					  full_dir->path,
+					  &full_dir->dad,
+					  f,
+					  data);
+
+		    if (rc != 0)
+		    {
+			free (list);
+		    }
+		    else
+		    {
+			*listp = &list->dad;
+		    }
+		}
+		KArcDirDestroy (full_dir);
+	    }
+	}
+	free (full_path);
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirFullPathType
+ *
+ * Get the KDirectory defined KPathType for whatever is referred to 
+ * by path that is accessible through the KArcDir self.  The path's
+ * root is based on self's root (?) and a relative path is relative to 
+ * self.
+ *
+ * [RET] uint32_t			actually this is enum KPathType
+ * [IN]  const KArcDir *	self	base KDirectory for the call to
+ *					find the type of path
+ * [IN]  const char * 		path	what path of which to type the
+ *					last facet
+ */
+static
+uint32_t KArcDirFullPathType (const KArcDir *self, const char * path)
+{
+    const KTocEntry * node;
+    const char *	local_path = path;
+    KTocEntryType	type;
+    uint32_t		tt = 0;
+    int			loopcount;
+    rc_t		rc;
+
+    assert (self != NULL);
+    assert (path != NULL);
+
+    for (loopcount = 0; loopcount < KARC_LINK_RESOLVE_LOOPMAX; ++loopcount)
+    {
+        rc = KArcDirResolvePathNode (self,
+            rcConstructing, local_path, false, &node, &type); 
+        if (rc != 0)
+        {
+            /* TODO: filter rc into kptBadPath or kptNotFound... */
+            return (tt | kptNotFound);
+        }
+        switch (type)
+        {
+        default:
+            return kptBadPath;
+
+        case ktocentrytype_unknown:
+            return kptBadPath;
+
+        case ktocentrytype_hardlink:
+            return kptDir;
+
+        case ktocentrytype_dir:
+            return tt | kptDir;
+
+        case ktocentrytype_file:
+        case ktocentrytype_emptyfile:
+            return tt | kptFile;
+
+        case ktocentrytype_chunked:
+            return tt | kptFile;
+
+        case ktocentrytype_softlink:
+            tt = kptAlias;
+            if (KTocEntryGetSoftTarget(node,&local_path) != 0)
+                return kptAlias|kptNotFound;
+            break;
+
+        case ktocentrytype_zombiefile:
+            PLOGMSG (klogWarn, (klogWarn,
+                "zombie file detected: '$(P)'", "P=%s", path));
+            ReportRecordZombieFile();
+            return tt | kptZombieFile;
+
+        }
+    }
+    return kptBadPath;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirPathType
+ *  returns a KPathType
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ *
+ * [RET] uint32_t
+ * [IN]  const KArcDir *	self		Object oriented C; KArcDir object for this method
+ * [IN]  const char *		path
+ * [IN]  va_list		args
+ */
+static uint32_t CC KArcDirPathType (const KArcDir *self, const char *path, va_list args)
+{
+    rc_t	rc;
+    uint32_t 	type;
+    char * 	full;
+
+    rc = KArcDirMakePath (self, rcAccessing, false, &full, path, args);
+
+    if (rc == 0)
+    {
+        type = KArcDirFullPathType (self, full);
+        free (full);
+    }
+    else
+    {
+        type = kptBadPath;
+    }
+    return type;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirVisitDir
+ *
+ * [IN] KArcDirVisitData *	pb
+ */
+typedef struct KArcDirVisitData		
+{
+    rc_t   (CC* f )(const KDirectory*, uint32_t, const char*, void*);
+    void *      data;
+    KArcDir *   dir;
+    bool        recurse;
+} KArcDirVisitData;
+
+
+static
+rc_t KArcDirVisitDir(KArcDirVisitData *pb)
+{
+    /* get a directory listing */
+    KArcDirIterator 	listing;
+    rc_t		rc; 
+
+    assert (pb != NULL);
+
+    rc = KArcDirIteratorInit (&listing, pb->dir, pb->dir->path);
+    if (rc == 0)
+    {
+        const char * base;
+        const char * name;
+        char * full_name = NULL;
+        uint32_t 	size;
+
+        size = pb->dir->size;
+        base = pb->dir->path;
+
+        for(pb->dir->size = size, name = KArcDirIteratorNext (&listing);
+            name != NULL; name = KArcDirIteratorNext (&listing))
+        {
+            uint32_t len = (uint32_t)strlen (name);
+            free(full_name);
+            full_name = malloc(size + len + 1);
+
+            if(full_name == NULL) {
+                rc = RC (rcFS, rcDirectory, rcVisiting, rcMemory, rcExhausted);
+                break;
+            } else {
+                const KTocEntry *	pnode;
+                KTocEntryType		type;
+                /* -----
+                * build up the path from the base and the name
+                */
+                memmove(full_name, base, size);
+                memmove(full_name+size, name, len);
+                full_name[size+len] = 0;
+
+                rc = KArcDirResolvePathNode(pb->dir, rcVisiting, full_name,
+                                            true, &pnode, &type);
+                if(rc != 0) {
+                    break;
+                }
+                /* -----
+                * call the function per visit
+                */
+                /* type is wrong "type"  needs to be a kpt not karctoctype */
+                {
+                    uint32_t kptype;
+                    kptype = KArcDirFullPathType(pb->dir, full_name);
+                    rc = pb->f(&pb->dir->dad, kptype, name, pb->data);
+                }
+                if(rc != 0) {
+                    break;
+                }
+                if(pb->recurse && ((type == ktocentrytype_dir)||(type == ktocentrytype_hardlink))) {
+                    KArcDir * rdir;
+                    KArcDirVisitData rpb;
+
+                    rc = KArcDirMake(&rdir, rcVisiting, pb->dir->parent, pb->dir->toc,
+                                     pnode, pb->dir->archive.v, pb->dir->arctype, pb->dir->root,
+                                     full_name, (uint32_t)strlen ( full_name ), false, false);
+                    if(rc != 0) {
+                        break;
+                    }
+                    rpb.f = pb->f;
+                    rpb.data = pb->data;
+                    rpb.dir = rdir;
+                    rpb.recurse = pb->recurse;
+                    rc = KArcDirVisitDir(&rpb);
+                    KArcDirDestroy(rdir);
+                    if(rc != 0) {
+                        break;
+                    }
+                }
+            }
+        }
+        free(full_name);
+        KArcDirIteratorWhack (& listing);
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirRelativePath
+ *
+ * KArcDirRelativePath
+ *  makes "path" relative to "root"
+ *  both "root" and "path" MUST be absolute
+ *  both "root" and "path" MUST be canonical, i.e. have no "//", "/./" or "/../" sequences
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN] const KArcDir *		self		Object oriented C; KArcDir object for this method
+ * [IN] enum RCContext 		ctx
+ * [IN] const char *		root
+ * [IN, OUT] char *			path
+ * [IN] size_t			path_max
+ */
+static
+rc_t KArcDirRelativePath (const KArcDir *self, enum RCContext ctx,
+			  const char *root, char *path, size_t path_max)
+{
+    int backup;
+    size_t bsize, psize;
+
+    const char *r = root + self -> root;
+    const char *p = path + self -> root;
+
+    assert (r != NULL && r [ 0 ] == '/');
+    assert (p != NULL && p [ 0 ] == '/');
+
+    for (; * r == * p; ++ r, ++ p)
+    {
+        /* disallow identical paths */
+        if (* r == 0)
+            return RC (rcFS, rcDirectory, ctx, rcPath, rcInvalid);
+    }
+
+    /* paths are identical up to "r","p"
+       if "r" is within a leaf name, then no backup is needed
+       by counting every '/' from "r" to end, obtain backup count */
+    for (backup = 0; * r != 0; ++ r)
+    {
+        if (* r == '/')
+            ++ backup;
+    }
+
+    /* the number of bytes to be inserted */
+    bsize = backup * 3;
+
+    /* align "p" to last directory separator */
+    while (p [ -1 ] != '/') -- p;
+
+    /* the size of the remaining relative path */
+    psize = strlen (p);
+
+    /* open up space if needed */
+    if ( (size_t)(p - path) < bsize )
+    {
+        /* prevent overflow */
+        if (bsize + psize >= path_max)
+            return RC (rcFS, rcDirectory, ctx, rcPath, rcExcessive);
+        
+        memmove (path + bsize, p, psize);
+    }
+
+    /* insert backup sequences */
+    for (bsize = 0; backup > 0; bsize += 3, -- backup)
+        memmove (& path [ bsize ], "../", 3);
+
+    /* close gap */
+    if ( (size_t)( p - path ) > bsize )
+	{
+		memmove (path + bsize, p, psize + 1);
+	}
+
+	return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirResolvePathNode
+ *
+ * Resolve a path to a KToc Node with a triple return type of
+ * success/failure, KTocEntry to use to access the leaf of the path,
+ * and the type of the node that could have been easily obtained from 
+ * that node
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]  const KArcDir *      self	OOP in C self/this pointer
+ * [IN]  const char *         path	the path to resolve
+ * [IN]  bool		      follow	Follow any links
+ * [OUT] const KTocEntry ** pnode	a pointer that will point to the 
+ *					ArcTOCNode for the path
+ * [OUT] KTocEntryType *    ptype	Archive specific type for the
+ *					entry matching path
+ * TODO: Make this prettier for human readabilty by breaking out into sub-functions?
+ */
+static
+rc_t	KArcDirResolvePathNode	(const KArcDir *	self,
+				 enum RCContext 	ctx,
+				 const char *		path,
+				 bool			follow,
+				 const KTocEntry ** 	pnode,
+				 KTocEntryType * ptype)
+{
+    rc_t		rc = 0;
+
+    assert (self != NULL);
+    assert (path != NULL);
+    assert (pnode != NULL);
+    assert (ptype != NULL);
+
+    *pnode = NULL;
+    *ptype = ktocentrytype_unknown;
+
+    if (path[0] == 0)
+    {
+        rc = RC (rcFS, rcDirectory, ctx, rcPath, rcInvalid);
+    }
+    else
+    {
+	/* -----
+	 * This loop is to replace recursive approaches to resolving sym links in 
+	 * the path.before the last facet.
+	 *
+	 * we used temp_path as an alias for path because we can "recur" by 
+	 * going through the loop iteratively instead of recursively changing
+	 * temp_path each time where we would have called this function again
+	 */
+	const char *	temp_path = path;	/* no alloc */
+	const KToc *	toc = self->toc;	/* no alloc */
+	char *		allocated_path = NULL;	/* alloc; must free{} */
+	char * 		abpath = NULL;		/* alloc; must free{} */
+
+	while(rc == 0) /* loop as long as no failures or until break */
+	{
+	    /* -----
+	     * clean up the path to its KFS canonical form
+	     */
+	    if (abpath != NULL)
+            free (abpath);
+	    rc = KArcDirMakePath (self, ctx, /* canon*/true, &abpath,
+                              temp_path, NULL);
+	    if (rc != 0)
+	    {
+            /* -----
+             * If we couldn't "make the path" we'll just fail passing along
+             * the fail reason from MakePath.
+             */
+            break;	/* TODO fix rc context? Object? */
+	    }
+	    else
+	    {
+            const String * pathstring;
+
+            rc = KTocGetPath (toc, &pathstring);
+            /* -----
+             * validate that this canonical path is in the TOC
+             */
+            if (strncmp(abpath, pathstring->addr, pathstring->size) != 0)
+            {
+                /* -----
+                 * This is a key return as it could be used to trigger a call to 
+                 * a containing "parent" KDirectory to try again outside of this KArcDir
+                 * be it another KArcDir, KSysDir, or other KDirectory interface 
+                 * implementation.
+                 */
+                rc = RC (rcFS, rcDirectory, ctx, rcPath, rcOutOfKDirectory);
+                break;
+            }
+            else
+            {
+                const KTocEntry *	node;		/* no alloc */
+                const String *	toc_path_string;	/* no alloc */
+                const char *	toc_path;		/* no alloc */
+                const char *	left;		/* no alloc */
+                KTocEntryType	type  = ktocentrytype_unknown;
+                /* -----
+                 * now get the path that is just that which is inside the TOC by pointing
+                 * past the path of the TOC and get the relevant TOC.  Since the incoming path
+                 * and the "makepath" path have all been ASCIZ so is this abbreviated path.
+                 */
+
+
+                rc = KTocGetPath (toc, &toc_path_string);
+                toc_path = abpath + toc_path_string->size; /* point past toc's path to either NUL or '/' */
+                if (toc_path[0] == '/')		/* if '/' move forward one char */
+                    toc_path++;
+                else if (toc_path[0] != 0x00)	/* if not NUL we are not in this TOC */
+                {
+                    rc = RC (rcFS, rcDirectory, ctx, rcPath, rcOutOfKDirectory);
+                    break;
+                }
+
+                /* if the called resolve failed then this resolve fails too */
+                rc = KTocResolvePathTocEntry (toc, &node, toc_path, strlen(toc_path), &type, &left);
+                if (rc != 0)
+                {
+                    /* nothing? or fix ret? */
+                }
+                else if (type != ktocentrytype_softlink)
+                {
+                    /* -----
+                     * This is the non soft link successful result
+                     */
+                    *ptype = type;
+                    *pnode = node;
+                    /* rc is 0 at this point */
+                    break; /* out of for (;;) */
+                }
+                else
+                {
+                    size_t	lsize;
+			
+                    /* -----
+                     * successful so far but there might still be some path left if we hit a soft link
+                     */
+                    lsize = strlen(left);	/* points to NUL for empty string if we got to the end */
+
+                    if ((lsize == 0) && (! follow))
+                    {
+                        /* -----
+                         * This is a soft link successful result
+                         */
+                        *ptype = type;
+                        *pnode = node;
+                        /* rc is 0 at this point */
+                        break; /* out of for (;;) */
+                    }
+                    /* -----
+                     * If we did hit a soft link with path remaining we have work to do resolving the
+                     * facets in the path before the end.
+                     *
+                     * the remaining path could be as little as a single "/".
+                     */
+                    else
+                    {
+                        const char *	symlink_path;		/* no alloc */
+                        rc = KTocEntryGetSoftTarget(node, &symlink_path);
+                        if (rc != 0)
+                        {
+                            /* fix rc_t? */
+                            break;
+                        }
+                        else
+                        {
+                            /* -----
+                             * If the symbolic link's path starts with '/' it is an absolute path
+                             */
+                            if (symlink_path[0] == '/')
+                            {
+                                temp_path = symlink_path;
+                                continue; /* back to for(;;) */
+                            }
+                            else
+                            {
+                                /* -----
+                                 * if the first character isn't '/' it is relative to the current
+                                 * directory within the TOC
+                                 */
+                                size_t		asize;		/* allocated size */
+                                size_t		fsize;		/* first - before symlink - size */
+                                size_t  	ssize;		/* symlink value size */
+                                const char * 	backtrack;
+                                /* -----
+                                 * Backtrack across the last facet - which was the link name
+                                 */
+                                for (backtrack = left - 1; *backtrack != '/'; --backtrack)
+                                    ;
+                                backtrack++; /* get back the '/' */
+
+                                /* -----
+                                 * we need enough space for the 
+                                 */
+                                fsize = backtrack - abpath;	/* current path through start of link */
+                                ssize = strlen(symlink_path);/* length of the link's replacement value */
+                                asize = fsize+ssize+lsize+1;/* total of the three pieces and NUL */
+                                allocated_path		/* get a temp buffer to build this new path */
+                                    = realloc (allocated_path, asize);
+                                if (allocated_path == NULL)
+                                {
+                                    rc = RC (rcFS, rcDirectory, ctx, rcMemory, rcExhausted);
+                                    break; /* end for(;;) */
+                                }
+                                else
+                                {
+                                    char * pc;
+                                    /* -----
+                                     * TODO verify that there is or is not a problem
+                                     * with  "~//~" showing up from these memcopies
+                                     * and that a final NUL is added add extra buffer
+                                     * space as needed to asize
+                                     */
+                                    memmove (allocated_path, abpath, fsize);
+                                    pc = allocated_path + fsize;
+                                    memmove (pc, symlink_path, ssize);
+                                    pc += ssize;
+                                    if (*(pc-1) == '/')
+                                        --pc;
+                                    memmove (pc, left, lsize+1);
+                                    temp_path = allocated_path;
+                                    continue;
+
+                                } /* if (allocated_path == NULL) {} else { */
+                            } /* if (symlink_path[0] == '/') {} else { */
+                        } /* if (rc != 0) {} else { */
+                    } /* if ((lsize == 0) && (! follow)) {} else { */
+                } /* if (rc != 0) {} else if (type != ktocentrytype_softlink) {} else { */
+            } /* if (strncmp(abpath, self->path, self->size) != 0) {} else { */
+	    } /* if (rc != 0) {} else { */
+	} /* while(rc == 0) */
+	if (abpath != NULL)
+	    free (abpath);
+	if (allocated_path != NULL)
+	    free (allocated_path);
+    } /* if (path[0] == 0) {} else { */
+    return rc;
+}
+
+
+/* ======================================================================
+ * KArcFile
+ *  a file inside an archive
+ */
+
+/*-----------------------------------------------------------------------
+ * KArcFile
+ *  an archive file including tar and sra
+ */
+struct KArcFile
+{
+    KFile		dad;
+    const KToc *	toc;	/* not accessed directly but it owns the node so need a ref to it */
+    const KTocEntry *	node;
+    const KFile *	archive;
+};
+
+/*-----------------------------------------------------------------------
+ * KArcFileDestroy
+ *
+ * Destructor for objects of class KArcFile.  Usually not called directly but instead called
+ * when the reference count for the object drops to 0.
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN] KArcFile *		self		OOP self pointer - the object to be destroyed
+ */
+static
+rc_t CC KArcFileDestroy (KArcFile *self)
+{
+    rc_t ret1, ret2;
+
+    assert (self != NULL);
+
+    ret1 = KFileRelease (self->archive);
+    ret2 = KTocRelease (self->toc);
+    free (self);
+
+    /* -----
+     * this seems a tad silly but pass along one or the other failure
+     * We chose to call the second release even of the first failed
+     * erring on the side of releasing as much as possible
+     */
+    return (ret1 != 0) ? ret1 : ret2;
+}
+
+
+/*-----------------------------------------------------------------------
+ * KArcFileGetSysFile
+ *
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ * Returns the KSysFile/KFile associated with a KArcFile.  NULL if not appropriate.
+ *
+ * [RET] struct KSysFile *
+ * [IN]  const KArcFile *	self		Object oriented C; KArcFile object for this method
+ * [OUT] uint64_t *		offset		An offset into the KSysfile where the KArcFile's
+ *						data starts.
+ */
+static
+struct KSysFile *CC KArcFileGetSysFile (const KArcFile *self, uint64_t *offset)
+{
+    rc_t rc;
+    KTocEntryType type;
+    struct KSysFile * fp;
+    uint64_t fo;
+    uint64_t ao;
+
+    /* parameters must be non-NULL */
+    assert (self != NULL);
+    assert (offset != NULL);
+
+    /* check the type which must be a contiguous file */
+    rc = KTocEntryGetType (self->node, &type);
+    if (rc == 0)
+    {
+	if (type == ktocentrytype_file)
+	{
+	    /* recur into the KFile to see if it allows this */
+	    fp = KFileGetSysFile (self->archive, &ao);
+
+	    /* -----
+	     * if all this is true get the offset from the TOC entry and
+	     * return it
+	     */
+	    if (fp != NULL)
+	    {
+		if (KTocEntryGetFileOffset (self->node, &fo) == 0)
+		{
+		    *offset = ao + fo;
+		    return fp;
+		}
+	    }
+	}
+    }
+    /* any failure alng the way leads to returning NULL */
+    *offset = 0;
+    return NULL;
+}
+
+
+/*-----------------------------------------------------------------------
+ * KArcFileRandomAccess
+ *
+ * Returns zero if Random access is allowed for this KFile
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details		
+ * [IN] const KArcFile *	self		Object oriented C; KArcFile object for this method
+ */
+static
+rc_t CC KArcFileRandomAccess (const KArcFile *self)
+{
+    assert (self != NULL);
+    return 0;
+}
+
+
+/*-----------------------------------------------------------------------
+ * KArcFileType
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KArcFileType ( const KArcFile *self )
+{
+    return KFileType ( self -> archive );
+}
+
+
+/*-----------------------------------------------------------------------
+ * KArcFileSize
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]  const KArcFile *	self		Object oriented C; KArcFile object for this method
+ * [OUT] uint64_t *		size		Where to put the virtual size of the file
+ */
+static
+rc_t CC KArcFileSize (const KArcFile *self, uint64_t *size)
+{
+    rc_t	rc;
+    uint64_t	fsize;
+
+    assert (self != NULL);
+    assert (size != NULL);
+
+    rc = KTocEntryGetFileSize(self->node, &fsize);
+    if (rc == 0)
+    {
+	/* success */
+	*size = fsize;
+    }
+    /* pass along RC value */
+    return rc;
+}
+
+
+/*-----------------------------------------------------------------------
+ * KArcFileSetSize
+ *
+ * Change the size of the KFile.  Not supported for files inside archives.
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN] KArcFile *		self		Object oriented C; KArcFile object for this method
+ * [IN] uint64_t		size
+ */
+static
+rc_t CC KArcFileSetSize (KArcFile *self, uint64_t size)
+{
+    return RC (rcFS, rcFile, rcUpdating, rcArc, rcUnsupported);
+}
+
+
+
+/*-----------------------------------------------------------------------
+ * KArcFileRead
+ *
+ * Read bytes from a file represented by this KArcFile
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]  const KArcFile *	self		Object oriented C; KArcFile object for this method
+ * [IN]  uint64_t		pos		Offset with in the file from where to start reading
+ * [OUT] void *			buffer		buffer to which to write the read bytes 
+ * [IN]  size_t			bsize		how many bytes to read
+ * [OUT] size_t *		num_read	how many bytes actually read. Will get written even
+ *						in failure
+ */
+/* ----------------------------------------------------------------------
+ * KArcFileReadContiguous
+ *
+ * Read data from a contiguously stored file at a specified position
+ *
+ * The parameters are the same as KArcFileRead.  This private function could be
+ * inlined.  It is broken out for human readabilty.
+ *
+ * We just fix the offset by adding the offset to the file within the archive
+ * (we fixed the number to read before we got here) and pass the read to the
+ * archive.
+ */
+static
+rc_t KArcFileReadContiguous (const KArcFile *self, uint64_t pos,
+			     void *buffer, size_t bsize, size_t *num_read)
+{
+    rc_t	rc;
+    uint64_t	offset;
+
+    assert (self != NULL);
+    assert (buffer != NULL);
+    assert (num_read != NULL);
+    assert (bsize != 0);
+
+    rc = KTocEntryGetFileOffset (self->node, &offset);
+    if (rc == 0)
+    {
+	rc = KFileRead (self->archive, pos + offset, buffer, bsize, num_read);
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcFileReadEmpty
+ *
+ * Read data from a file with no content.
+ *
+ * The parameters are the same as KArcFileRead.  This private function could be
+ * inlined.  It is broken out for human readabilty.
+ *
+ * We just fix the offset by adding the offset to the file within the archive
+ * (we fixed the number to read before we got here) and pass the read to the
+ * archive.
+ */
+static
+rc_t KArcFileReadEmpty (const KArcFile *self, uint64_t pos,
+                        void *buffer, size_t bsize, size_t *num_read)
+{
+    assert (self != NULL);
+    assert (buffer != NULL);
+    assert (num_read != NULL);
+    assert (bsize != 0);
+
+    *num_read = 0;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcFileReadChunked
+ *
+ * Read data from a  chunked file at a specified position
+ *
+ * The parameters are the same as KArcFileRead.  This private function could be
+ * inlined.  It is broken out for human readabilty.
+ */
+static
+rc_t KArcFileReadChunked (const KArcFile *self,
+			  uint64_t pos,
+			  void *buffer,
+			  size_t bsize,
+			  size_t *num_read)
+{
+    const KTocChunk *	pchunk;		/* pointer to the chunk table */
+    size_t		count;		/* how many to read/write in an action */
+    uint32_t		num_chunks;	/* how many chunks in the array */
+    rc_t		rc;		/* general purpose return from calls and pass along */
+
+    assert (self != NULL);
+    assert (buffer != NULL);
+    assert (num_read != NULL);
+    assert (bsize != 0);
+
+    /* -----
+     * assume no read/write will happen or rather start with having read none;
+     * this write could be superfluous but we need to prepare *num_read for += operations
+     */
+    *num_read = 0;
+
+    /* -----
+     * Get the count of chunks and a pointer to the array of chunks for this file
+     */
+    rc = KTocEntryGetChunks (self->node, &num_chunks, &pchunk);
+    if (rc == 0)
+    {
+	uint8_t *	pbuff;		/* access the buffer as an array of bytes */
+	uint64_t	end;		/* this will be set to the end offset */
+
+	pbuff = buffer;
+	end = pos + bsize;	
+
+	/* -----
+	 * step through the chunks
+	 */
+	for (; (num_chunks) && (pos < end); --num_chunks, ++pchunk)
+	{
+	    uint64_t 	cend;		/* end offset of this chunk */
+
+	    /* -----
+	     * determine the end of this chunk
+	     */
+	    cend = pchunk->logical_position + pchunk->size;
+
+	    /* -----
+	     * if this chunk is entirely before the current position
+	     * we are looking for
+	     * skip to the next (if any) chunk
+	     */
+	    if (pos > cend)
+		continue;
+
+	    /* -----
+	     * handle any needed zero fill section before the next chunk
+	     */
+	    if (pos < pchunk->logical_position)
+	    {
+		/* -----
+		 * try to fake-read as many bytes of zero as possible
+		 * so start assuming you need enough zeros to reach the next chunk
+		 * but cut it back to the remaining requested if that was too many
+		 */
+		count = (size_t)( pchunk->logical_position - pos );
+		if (count > bsize)
+		    count = bsize;
+
+		/* fake read the zeros */
+		memset (pbuff, 0, count);
+
+		/* update tracking variables */
+		pbuff += count;
+		pos += count;
+		*num_read += count;
+	    }
+
+	    /* -----
+	     * handle a chunk section
+	     *
+	     * if we are here, then we still have bytes to get and
+	     * pos >= pchunk_logical_position
+	     *
+	     * Get the most we can from this chunk.
+	     * If there are enough bytes in this chunk to finish the read: do so.
+	     * Else read through the end of the chunk
+	     */
+	    count = (size_t)( (end <= cend) ? end - pos : cend - pos );
+
+	    /* -----
+	     * a little tricky is we call by value the wanted count and the function
+	     * called will over write that with the actual read count
+	     */
+	    rc = KFileRead (self->archive, 
+			    pchunk->source_position + (pchunk->logical_position - pos), 
+			    pbuff, count, &count);
+
+	    *num_read += count;
+	    if (rc != 0)
+	    {
+		/* failure so abort */
+		break;
+	    }
+	    pbuff += count;
+	    pos += count;
+	    *num_read += count;
+	}
+	/* -----
+	 * If eveything so far is okay but we have more bytes to read
+	 * yet no more chunks; then fill to the end with zeroes
+	 */
+	if ((rc == 0) && (pos < end))
+	{
+	    count = (size_t)( end - pos );
+	    memset (pbuff, 0, count);
+	    *num_read += count;
+	}
+    }
+    return rc;
+}
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t CC KArcFileRead	(const KArcFile *self,
+			 uint64_t pos,
+			 void *buffer,
+			 size_t bsize,
+			 size_t *num_read)
+{
+    KTocEntryType	type;
+    rc_t		rc;
+
+    /* -----
+     * self and buffer were validated as not NULL before calling here
+     *
+     * So get the KTocEntry type: chunked files and contiguous files 
+     * are read differently.
+     */
+    assert (self != NULL);
+    assert (buffer != NULL);
+    assert (num_read != NULL);
+    assert (bsize != 0);
+
+    rc = KTocEntryGetType(self->node, &type);
+
+    assert ((type == ktocentrytype_file) || 
+            (type == ktocentrytype_chunked) ||
+            (type == ktocentrytype_emptyfile));
+
+    if (rc == 0)
+    {
+	uint64_t	size;
+
+	/* -----
+	 * We have to validate the size to be read and will modify the number
+	 * down if necessary
+	 */
+	rc = KTocEntryGetFileSize (self->node, &size);
+	if (rc == 0)
+	{
+	    /* ----- 
+	     * if we are seeking beyond the end match sysfile.c's use of pread
+	     * and return number read as 0 to mark EOF
+	     */
+	    if (pos >= size)
+	    {
+		*num_read = 0;
+	    }
+	    else
+	    {
+		uint64_t	limit;
+
+		limit = 
+		    (pos + bsize > size)	/* if attempt to read beyond end of file */
+		    ? size - pos		/* then force smaller read */
+		    : bsize;			/* else allow full read */
+
+		switch (type)
+		{
+		default:
+		case ktocentrytype_unknown:
+		case ktocentrytype_dir:
+		case ktocentrytype_softlink:
+		case ktocentrytype_hardlink:
+		    /* -----
+		     * We should not have been able to open these as a KArcFile
+		     * so this is probably superfluous
+		     */
+		    rc = RC (rcFS, rcFile, rcReading, rcArc, rcUnexpected);
+		    break;
+		case ktocentrytype_file:
+		    rc = KArcFileReadContiguous (self, pos, buffer, (size_t)limit, num_read);
+		    break;
+		case ktocentrytype_chunked:
+		    rc = KArcFileReadChunked (self, pos, buffer, (size_t)limit, num_read);
+		    break;
+		case ktocentrytype_emptyfile:
+		    rc = KArcFileReadEmpty (self, pos, buffer, (size_t)limit, num_read);
+		    break;
+		}
+	    }
+	}
+    }
+    return rc;
+}
+
+
+
+/*-----------------------------------------------------------------------
+ * KArcFileWrite
+ *
+ * Write bytes to a file represented by this KArcFile.
+ * Fails as unsupported for files inside archives.
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]  KArcFile *		self		Object oriented C; KArcFile object for this method
+ * [IN]  uint64_t 		pos		Offset within file to start writing (ignored)
+ * [IN]  const void *		buffer		pointer to data to write (ignored)
+ * [IN]  size_t 		size		how many bytes to write (ignored)
+ * [OUT] size_t *		num_writ	how many bytes written - always set to 0
+ */
+static
+rc_t CC KArcFileWrite (KArcFile *self, uint64_t pos,
+		       const void *buffer, size_t size,
+		       size_t *num_writ)
+{
+    assert (num_writ != NULL);
+
+    /* duplicates write in KFileWrite() so this can be deleted */
+    *num_writ = 0;
+
+    return RC (rcFS, rcArc, rcWriting, rcSelf, rcUnsupported);
+}
+
+
+
+static	KFile_vt_v1	vtKArcFile =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KArcFileDestroy,
+    KArcFileGetSysFile,
+    KArcFileRandomAccess,
+    KArcFileSize,
+    KArcFileSetSize,
+    KArcFileRead,
+    KArcFileWrite,
+
+    /* 1.1 */
+    KArcFileType
+};
+
+/*-----------------------------------------------------------------------
+ * KArcFileMake
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [OUT] KArcFile ** 		self		were to put a reference to the newly allocated
+ *						KArcFile structure
+ * [IN]  const KFile *		archive		The KFile for the archive containing this archive
+ * [IN]  const KArcToc *	toc		The controlling TOC for the Archive File
+ * [IN]  const KTocEntry *	node		The specific node somewhere in that TOC for this file
+ */
+static
+rc_t KArcFileMake (KArcFile ** self,
+		   const KFile * archive,
+		   const KToc * toc,
+		   const KTocEntry * node)
+{
+    rc_t	rc;
+    KArcFile *	pF;
+    uint64_t    size;
+
+    /* -----
+     * we can not accept any of the four parameters as NULL
+     */
+    assert (self != NULL);
+    assert (archive != NULL);
+    assert (toc != NULL);
+    assert (node != NULL);
+
+    /* -----
+     * Proceed with non-NULL parameters
+     */
+    rc = KFileSize (archive, &size);
+    if (GetRCState(rc) == rcUnsupported)
+    {
+        size = ~(uint64_t)0;
+        rc = 0;
+    }
+
+    if (rc == 0)
+    {
+        /* we need to check chunked files here as well */
+        if (((node->type == ktocentrytype_file) &&
+             (node->u.contiguous_file.file_size > 0) &&
+             (size < (node->u.contiguous_file.file_size +
+                      node->u.contiguous_file.archive_offset))) ||
+            ((node->type == ktocentrytype_chunked) &&
+             (node->u.chunked_file.file_size > 0) &&
+             (size < (node->u.chunked_file.chunks[node->u.chunked_file.num_chunks-1].source_position +
+                      node->u.chunked_file.chunks[node->u.chunked_file.num_chunks-1].size))))
+            rc = RC (rcFS, rcFile, rcConstructing, rcArc, rcIncomplete);
+        else
+        {
+            /* get space for the object */
+            pF = malloc (sizeof * pF);
+            if (pF == NULL)	/* allocation failed */
+            {
+                /* fail */
+                rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+            }
+            else
+            {
+                rc = KFileInit (&pF->dad,				/* initialize base class */
+                                (const KFile_vt*)&vtKArcFile,	/* VTable for KArcFile */
+                                "KArcFile", "no-name",
+                                true,				/* read allowed */
+                                false);				/* write disallowed */
+                if (rc == 0)
+                {
+                    /* succeed */
+                    pF->toc = toc;					/* shared TOC */
+                    KTocAddRef(toc);				/* keep alive reference */
+                    pF->node = node;				/* file specific TOC entry */
+                    pF->archive = archive;				/* shared archive file */
+                    KFileAddRef(archive);				/* keep alive reference */
+                    *self = pF;					/* and to the output */
+                }
+                if (rc != 0)
+                    /* fail */
+                    free (pF);
+            }
+	}
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirVisit
+ *  visit each path under designated directory,
+ *  recursively if so indicated
+ *
+ *  "recurse" [ IN ] - if non-zero, recursively visit sub-directories
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to execute
+ *  on each path. receives a base directory and relative path
+ *  for each entry, where each path is also given the leaf name
+ *  for convenience. if "f" returns non-zero, the iteration will
+ *  terminate and that value will be returned. NB - "dir" will not
+ *  be the same as "self".
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+static 
+rc_t CC KArcDirVisit (const KArcDir *self, 
+                      bool recurse,
+                      rc_t (CC* f) (const KDirectory *, uint32_t, const char *, void *), 
+                      void *data,
+                      const char *path,
+                      va_list args)
+{
+    char * full_path;
+    rc_t   rc;
+
+
+    /* -----
+     * First fix the path to make it useable
+     */
+    rc = KArcDirMakePath (self, rcVisiting, true, &full_path, path, args);
+    if (rc != 0)
+    {
+	LOGERR (klogInt, rc, "failed to make path in Visit");
+    }
+    else
+    {
+	const KTocEntry * pnode;
+	KTocEntryType	type;
+
+	/* -----
+	 * Now find that path as a node and validate it is a directory
+	 */
+	rc = KArcDirResolvePathNode(self, rcListing, full_path, true, &pnode, &type);
+	if (rc != 0)
+	{
+	    PLOGERR (klogInt, (klogInt, rc, "failed to resolve path $(P) in Visit", "P=%s", full_path));
+	}
+	else
+	{
+	    if ((type == ktocentrytype_dir) || (type == ktocentrytype_hardlink))
+	    {
+		KArcDir * full_dir;
+		uint32_t path_size;
+
+		/* -----
+		 * make a locally accessible private KDirectory/KArcDir
+		 */
+		for ( path_size = (uint32_t)strlen ( full_path );
+		      ( path_size > self->root ) && ( full_path[ path_size - 1 ] == '/' );
+		      -- path_size )
+		{}
+		rc = KArcDirMake (&full_dir, 
+				  rcVisiting,
+				  self->parent,
+				  self->toc,
+				  pnode,
+				  self->archive.v,
+				  self->arctype,
+				  self->root,
+				  full_path,
+				  path_size, 
+				  true,
+				  false);
+		if (rc == 0)
+		{
+		    KArcDirVisitData pb;
+
+		    pb.f = f;
+		    pb.data = data;
+		    pb.dir = full_dir;
+		    pb.recurse = recurse;
+/*		    pb.dir.path[--pb.dir.size] = 0; */
+
+		    rc = KArcDirVisitDir (&pb);
+
+		    KArcDirDestroy (full_dir);
+		}
+	    }
+	    else
+	    {
+		rc = RC (rcFS, rcDirectory, rcVisiting, rcPath, rcIncorrect);
+		LOGERR (klogInt, rc, "Type is not a directory");
+	    }
+	}
+	free (full_path);
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirVisitUpdate
+ */
+static rc_t CC KArcDirVisitUpdate (KArcDir *self,
+                                   bool recurse,
+                                   rc_t (CC*f) (KDirectory *,uint32_t,const char *,void *),
+                                   void *data,
+                                   const char *path,
+                                   va_list args)
+{
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirResolvePath
+ *
+ *  resolves path to an absolute or directory-relative path
+ *
+ * [IN]  const KArcDir *self		Objected oriented self
+ * [IN]	 bool 		absolute	if non-zero, always give a path starting
+ *  					with '/'. NB - if the directory is 
+ *					chroot'd, the absolute path
+ *					will still be relative to directory root.
+ * [OUT] char *		resolved	buffer for NUL terminated result path in 
+ *					directory-native character set
+ * [IN]	 size_t		rsize		limiting size of resolved buffer
+ * [IN]  const char *	path		NUL terminated string in directory-native
+ *					character set denoting target path. 
+ *					NB - need not exist.
+ *
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static rc_t CC KArcDirResolvePath (const KArcDir *self,
+                                   bool absolute,
+                                   char *resolved,
+                                   size_t rsize,
+                                   const char *path,
+                                   va_list args)
+{
+    char * full;
+    rc_t   rc; 
+
+    assert (self != NULL);
+    assert (resolved != NULL);
+    assert (path != NULL);
+
+    rc = KArcDirMakePath (self, rcResolving, true, &full, path, args);
+
+    if (rc == 0)
+    {
+        uint32_t path_size = (uint32_t)strlen ( full );
+
+        if (absolute)
+        {
+            /* test buffer capacity -  this is a limitation of KDirectory not in KArcDir */
+            if ((path_size - self->root) >= rsize)
+            {
+                rc =  RC (rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient);
+            }
+            else
+            {
+                /* ready to go */
+                strcpy (resolved, & full[self->root]);
+                assert (resolved[0] == '/');
+            }
+        }
+        else
+        {
+            rc = KArcDirRelativePath (self, rcResolving, self->path, full, path_size);
+            if (rc == 0)
+            {
+                path_size = (uint32_t)strlen ( full );
+                /* test buffer capacity -  this is a limitation of KDirectory not in KArcDir */
+                if (path_size >= rsize)
+                {
+                    rc = RC (rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient);
+                }
+                else
+                {
+                    strcpy (resolved, full);
+                }
+            }
+        }
+    }
+    if (full != NULL)
+        free (full);
+
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirResolveAlias
+ *  resolves an alias path to its immediate target
+ *  NB - the resolved path may be yet another alias
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting an object presumed to be an alias.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static rc_t CC KArcDirResolveAlias (const KArcDir * self, 
+				 bool absolute,
+				 char * resolved,
+				 size_t rsize,
+				 const char *alias_fmt,
+				 va_list args)
+{
+    char *		full_path;
+    const char *	link_path;
+    const KTocEntry * pnode;
+    KTocEntryType	type;
+    rc_t		rc;
+    size_t		ssize;
+
+    assert (self != NULL);
+    assert (resolved != NULL);
+    assert (alias_fmt != NULL);
+
+    rc = KArcDirMakePath (self, rcResolving, true,
+			  &full_path, alias_fmt, args);
+
+    if (rc != 0)
+    {
+    	/* can't "fix" path */
+	    /*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+    }
+    else
+    {
+    	/* first find the node and it has to be an alias */ 
+        char alias[4096];
+        int size = ( args == NULL ) ?
+            snprintf  ( alias, sizeof alias, "%s", alias_fmt ) : 
+            vsnprintf ( alias, sizeof alias, alias_fmt, args );
+
+        if ( size < 0 || size >= ( int ) sizeof alias )
+            rc = RC ( rcFS, rcDirectory, rcResolving, rcPath, rcExcessive );
+        else
+        	rc = KArcDirResolvePathNode (self, rcResolving, alias, false, &pnode, &type);
+    
+    	if (rc != 0)
+    	{
+    	    /*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+    	}
+    	else if (type != ktocentrytype_softlink)
+    	{
+    	    rc = RC (rcFS, rcDirectory, rcResolving, rcLink, rcInvalid);
+    	}
+    	else
+    	{
+    	    rc = KTocEntryGetSoftTarget(pnode, &link_path);
+    	    if (rc != 0)
+    	    {
+        		/* can't "fix" path */
+        		/*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+    	    }
+    	    else
+    	    {
+    	    	ssize = strlen(link_path);
+        		if (ssize > rsize)
+        		{
+    	    	    rc = RC (rcFS, rcDirectory,rcResolving, rcParam, rcInsufficient);
+    		    }
+        		else
+        		{
+    	    	    strcpy (resolved, link_path);
+    		    }
+    	    }
+    	}
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirRename
+ *  rename an object accessible from directory, replacing
+ *  any existing target object of the same type
+ *
+ *  "from" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ *
+ *  "to" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ */
+static
+rc_t CC KArcDirRename (KArcDir *self, bool force, const char *from, const char *to)
+{
+    assert (self != NULL);
+    assert (from != NULL);
+    assert (to != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirRemove
+ *  remove an accessible object from its directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "force" [ IN ] - if non-zero and target is a directory,
+ *  remove recursively
+ */
+static
+rc_t CC KArcDirRemove (KArcDir *self, bool force, const char *path, va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirClearDir
+ *  remove all directory contents
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "force" [ IN ] - if non-zero and directory entry is a
+ *  sub-directory, remove recursively
+ */
+static
+rc_t CC KArcDirClearDir (KArcDir *self, bool force, const char *path, va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirAccess
+ *  get access to object
+ *
+ *  "access" [ OUT ] - return parameter for Unix access mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static rc_t CC KArcDirVAccess (const KArcDir *self,
+			    uint32_t *access,
+			    const char *path_fmt,
+			    va_list args)
+{
+    rc_t rc;
+    uint32_t acc;
+    KTocEntryType type;
+    char * full;
+    const KTocEntry * entry;
+
+    va_list args_copy;
+
+    assert (self != NULL);
+    assert (access != NULL);
+    assert (path_fmt != NULL);
+
+    /* MUST copy "args" if the intention is to use it twice */
+    if ( args != NULL )
+        va_copy ( args_copy, args );
+
+    /* -----
+     * by C standard the nested ifs (if A { if B { if C ... could have been if A && B && C
+     */
+    if ((rc = KArcDirMakePath (self, rcAccessing, false, &full, path_fmt, args)) == 0)
+    {
+        char path [ 4096 ];
+        int size = ( args == NULL ) ?
+            snprintf  ( path, sizeof path, "%s", path_fmt ) :
+            vsnprintf ( path, sizeof path, path_fmt, args_copy );
+
+        if ( size < 0 || size >= ( int ) sizeof path )
+            rc = RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcExcessive );
+        else
+        {
+        	if ((rc = KArcDirResolvePathNode (self, rcAccessing, path, true, &entry, &type)) == 0)
+        	{
+        	    if ((rc = KTocEntryGetAccess (entry, &acc)) == 0)
+        	    {
+                    /*
+                     * We want to filter the access because within an Archive
+                     * a file is unwritable
+                     */
+            		*access = acc & ~(S_IWRITE|S_IWGRP|S_IWOTH);
+            		rc = 0;
+        	    }
+        	}
+        }
+    }
+
+    if ( args != NULL )
+        va_end ( args_copy );
+
+    if (full != NULL)
+        free (full);
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirSetAccess
+ *  set access to object a la Unix "chmod"
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "access" [ IN ] and "mask" [ IN ] - definition of change
+ *  where "access" contains new bit values and "mask defines
+ *  which bits should be changed.
+ *
+ *  "recurse" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ */
+static rc_t CC KArcDirSetAccess (KArcDir *self,
+			      bool recurse,
+			      uint32_t access,
+			      uint32_t mask,
+			      const char *path,
+			      va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+
+static	rc_t CC KArcDirVDate		(const KArcDir *self,
+					 KTime_t *date,
+					 const char *path_fmt,
+					 va_list args)
+{
+/*     const KToc *	toc; */
+    rc_t 		rc;
+    KTime_t		ldate;
+    KTocEntryType	type;
+    char * 		full;
+    const KTocEntry * node;
+
+    va_list args_copy;
+
+    assert (self != NULL);
+    assert (date != NULL);
+    assert (path_fmt != NULL);
+
+    /* MUST copy "args" if the intention is to use it twice */
+    if ( args != NULL )
+        va_copy ( args_copy, args );
+
+    /* -----
+     * by C standard the nested ifs (if A { if B { if C ... could have been if A && B && C
+     */
+    if ((rc = KArcDirMakePath (self, rcAccessing, false, &full, path_fmt, args)) == 0)
+    {
+#if 0
+        if ((rc = KArcDirGetTOC (self, &toc)) == 0)
+#endif
+        {
+            /* THIS IS INCORRECT - IT SHOULD NOT RESOLVE ALIASES */
+            char path [ 4096 ];
+            int size = vsnprintf ( path, sizeof path, path_fmt, args_copy );
+
+            if ( size < 0 || size >= ( int ) sizeof path )
+                rc = RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcExcessive );
+            else
+            {
+                if ((rc = KArcDirResolvePathNode (self, rcAccessing, path, true, &node, &type)) == 0)
+                {
+                    if ((rc = KTocEntryGetTime (node, &ldate)) == 0)
+                    {
+                        *date =  ldate;
+                        rc = 0;
+                    }
+                }
+            }
+        }
+    }
+
+    if ( args != NULL )
+        va_end ( args_copy );
+
+    if (full != NULL)
+        free (full);
+    return rc;
+}
+
+static	rc_t CC KArcDirSetDate		(KArcDir *self,
+					 bool recurse,
+					 KTime_t date,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+static
+struct KSysDir *CC KArcDirGetSysDir ( const KArcDir *self )
+{
+    return NULL;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirCreateAlias
+ *  creates a path alias according to create mode
+ *
+ *  "targ" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target alias
+ *
+ *  "access" [ IN ] - standard Unix directory access mode
+ *  used when "mode" has kcmParents set and alias path does
+ *  not exist.
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC KArcDirCreateAlias (KArcDir *self,
+			 uint32_t access,
+			 KCreateMode mode,
+			 const char *targ,
+			 const char *alias)
+{
+    assert (self != NULL);
+    assert (targ != NULL);
+    assert (alias != NULL);
+
+    return RC (rcFS, rcArc, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirOpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC KArcDirOpenFileRead	(const KArcDir *self,
+					 const KFile **f,
+					 const char *path,
+					 va_list args)
+{
+    char *	full_path = NULL;
+    rc_t	rc;
+
+    assert (self != NULL);
+    assert (f != NULL);
+    assert (path != NULL);
+
+    rc = KArcDirMakePath (self, rcOpening, true, &full_path, path, args);
+
+    if (rc == 0)
+    {
+	const KTocEntry * pnode;
+	KTocEntryType     type;
+
+	rc = KArcDirResolvePathNode (self, rcOpening, full_path, true, &pnode, &type);
+
+	if (rc == 0)
+	{
+
+	    switch (type)
+	    {
+	    case ktocentrytype_unknown:
+	    case ktocentrytype_dir:
+	    case ktocentrytype_softlink:
+	    case ktocentrytype_hardlink:
+	    default:
+		rc = RC (rcFS, rcDirectory, rcOpening, rcFile, rcInvalid);
+		break;
+	    case ktocentrytype_emptyfile:
+	    case ktocentrytype_file:
+	    case ktocentrytype_chunked:
+		rc = KArcFileMake ((KArcFile**)f, self->archive.v, self->toc, pnode);
+		break;
+	    }
+	}
+	free (full_path);
+    }    
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirOpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ */
+static
+rc_t CC KArcDirOpenFileWrite	(KArcDir *self,
+					 KFile **f,
+					 bool update,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (f != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirCreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC KArcDirCreateFile	(KArcDir *self,
+					 KFile **f,
+					 bool update,
+					 uint32_t access,
+					 KCreateMode cmode,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (f != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirFileLocator
+ *  returns locator in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "locator" [ OUT ] - return parameter for file locator
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC KArcDirFileLocator		(const KArcDir *self,
+					 uint64_t *locator,
+					 const char *path,
+					 va_list args)
+{
+    char *		full_path;
+    rc_t		rc;
+
+    assert (self != NULL);
+    assert (locator != NULL);
+    assert (path != NULL);
+
+    rc = KArcDirMakePath (self, rcResolving, true,
+			  &full_path, path, args);
+
+    if (rc != 0)
+    {
+	/* can't "fix" path */
+	/*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+    }
+    else
+    {
+	const KTocEntry * pnode;
+	KTocEntryType     type;
+
+	rc = KArcDirResolvePathNode (self, rcResolving, full_path, /*follow links*/true, &pnode, &type);
+
+	if (rc != 0)
+	{
+	    /* can't resolve path */
+	    /*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+	}
+	else
+	{
+	    uint64_t	flocator;
+
+	    rc = KTocEntryGetFileLocator(pnode, &flocator);
+	    if (rc != 0)
+	    {
+		/* can't "fix" path */
+		/*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+	    }
+	    else
+	    {
+		*locator = flocator;
+	    }
+	}
+	free (full_path);
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirFileSize
+ *  returns size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC KArcDirFileSize		(const KArcDir *self,
+					 uint64_t *size,
+					 const char *path,
+					 va_list args)
+{
+    char *		full_path;
+    rc_t		rc;
+
+    assert (self != NULL);
+    assert (size != NULL);
+    assert (path != NULL);
+
+    rc = KArcDirMakePath (self, rcResolving, true,
+			  &full_path, path, args);
+
+    if (rc != 0)
+    {
+	/* can't "fix" path */
+	/*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+    }
+    else
+    {
+	const KTocEntry * pnode;
+	KTocEntryType     type;
+
+	rc = KArcDirResolvePathNode (self, rcResolving, full_path, /*follow links*/true, &pnode, &type);
+
+	if (rc != 0)
+	{
+	    /* can't resolve path */
+	    /*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+	}
+	else
+	{
+	    uint64_t	fsize;
+
+	    rc = KTocEntryGetFileSize(pnode, &fsize);
+	    if (rc != 0)
+	    {
+		/* can't "fix" path */
+		/*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+	    }
+	    else
+	    {
+		*size = fsize;
+	    }
+	}
+	free (full_path);
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirFileSize
+ *  returns size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC KArcDirFilePhysicalSize		(const KArcDir *self,
+					 uint64_t *size,
+					 const char *path,
+					 va_list args)
+{
+    char *		full_path;
+    rc_t		rc;
+
+    assert (self != NULL);
+    assert (size != NULL);
+    assert (path != NULL);
+
+    rc = KArcDirMakePath (self, rcResolving, true,
+			  &full_path, path, args);
+
+    if (rc != 0)
+    {
+	/* can't "fix" path */
+	/*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+    }
+    else
+    {
+	const KTocEntry * pnode;
+	KTocEntryType     type;
+
+	rc = KArcDirResolvePathNode (self, rcResolving, full_path, /*follow links*/true, &pnode, &type);
+
+	if (rc != 0)
+	{
+	    /* can't resolve path */
+	    /*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+	}
+	else
+	{
+	    uint64_t	fsize;
+
+	    rc = KTocEntryGetFilePhysicalSize(pnode, &fsize);
+	    if (rc != 0)
+	    {
+		/* can't "fix" path */
+		/*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+	    }
+	    else
+	    {
+		*size = fsize;
+	    }
+	}
+	free (full_path);
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirSetFileSize
+ *  sets size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KArcDirSetFileSize	(KArcDir *self,
+					 uint64_t size,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcWriting, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirOpenDirRead
+ *
+ *  opens a sub-directory
+ *
+ * [IN]  const KArcDir *	self	Object Oriented C KArcDir self
+ * [OUT] const KDirectory **	subp	Where to put the new KDirectory/KArcDir
+ * [IN]  bool			chroot	Create a chroot cage for this new subdirectory
+ * [IN]  const char *		path	Path to the directory to open
+ * [IN]  va_list		args	So far the only use of args is possible additions to path
+ */
+static 
+rc_t CC KArcDirOpenDirRead	(const KArcDir *self,
+					 const KDirectory **subp,
+					 bool chroot,
+					 const char *path,
+					 va_list args)
+{
+    char * full;
+    rc_t rc;
+
+    assert (self != NULL);
+    assert (subp != NULL);
+    assert (path != NULL);
+
+    rc = KArcDirMakePath (self, rcOpening, true, &full, path, args);
+    if (rc == 0)
+    {
+	const KTocEntry *	pnode;
+	KTocEntryType		type;
+	size_t path_size = strlen (full);
+
+	/* -----
+	 * get rid of any extra '/' characters at the end of path
+	 */
+	while (path_size > 0 && full [ path_size - 1 ] == '/')
+	    full [ -- path_size ] = 0;
+
+	/* -----
+	 * get the node for this path 
+	 */
+	rc = KArcDirResolvePathNode (self, rcOpening, full, true, &pnode, &type);
+	if (rc == 0)
+	{
+            switch (type)
+            {
+            default:
+		/* fail */
+		rc = RC (rcFS, rcDirectory, rcOpening, rcPath, rcIncorrect);
+                break;
+            case ktocentrytype_dir:
+            case ktocentrytype_hardlink:
+	    {
+		KArcDir *	sub;
+
+		rc = KArcDirMake (&sub,
+				  rcOpening,
+				  self->parent,
+				  self->toc,
+				  pnode,
+				  self->archive.v,
+				  self->arctype,
+				  self->root,
+				  full,
+				  (uint32_t)path_size,
+				  false,
+				  chroot);
+		if (rc == 0)
+		{
+		    /* succeed */
+		    *subp = &sub->dad;
+		}
+	    }
+            }
+	}
+	free (full);
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirOpenDirUpdate
+ *  opens a sub-directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "chroot" [ IN ] - if non-zero, the new directory becomes
+ *  chroot'd and will interpret paths beginning with '/'
+ *  relative to itself.
+ */
+static
+rc_t CC KArcDirOpenDirUpdate	(KArcDir *self,
+					 KDirectory ** subp, 
+					 bool chroot, 
+					 const char *path, 
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (subp != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirCreateDir
+ *  create a sub-directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "access" [ IN ] - standard Unix directory permissions
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC KArcDirCreateDir	(KArcDir *self,
+					 uint32_t access,
+					 KCreateMode mode,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirDestroyFile
+ */
+static
+rc_t CC KArcDirDestroyFile	(KArcDir *self,
+					 KFile * f)
+{
+    assert (self != NULL);
+    assert (f != NULL);
+
+    return RC (rcFS, rcArc, rcDestroying, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KArcDirFileContiguous
+ *  
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "contiguous" [ OUT ] - return parameter for file status
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC KArcDirFileContiguous		(const KArcDir *self,
+                                         bool * contiguous,
+					 const char *path,
+					 va_list args)
+{
+    char *		full_path;
+    rc_t		rc;
+
+    assert (self != NULL);
+    assert (contiguous != NULL);
+    assert (path != NULL);
+
+    rc = KArcDirMakePath (self, rcResolving, true,
+			  &full_path, path, args);
+
+    if (rc != 0)
+    {
+	/* can't "fix" path */
+	/*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+    }
+    else
+    {
+	const KTocEntry * pnode;
+	KTocEntryType     type;
+
+	rc = KArcDirResolvePathNode (self, rcResolving, full_path, /*follow links*/true, &pnode, &type);
+
+	if (rc != 0)
+	{
+	    /* can't resolve path */
+	    /*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+	}
+	else
+	{
+	    switch (type)
+	    {
+	    default:
+                *contiguous = false;
+		break;
+	    case ktocentrytype_emptyfile:
+	    case ktocentrytype_file:
+                *contiguous = true;
+		break;
+	    }
+	}
+	free (full_path);
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+static KDirectory_vt_v1 vtKArcDir =
+{
+    /* version 1.0 */
+    1, 3,
+
+    /* start minor version 0 methods*/
+    KArcDirDestroy,
+    KArcDirList,
+    KArcDirVisit,
+    KArcDirVisitUpdate,
+    KArcDirPathType,
+    KArcDirResolvePath,
+    KArcDirResolveAlias,
+    KArcDirRename,
+    KArcDirRemove,
+    KArcDirClearDir,
+    KArcDirVAccess,
+    KArcDirSetAccess,
+    KArcDirCreateAlias,
+    KArcDirOpenFileRead,
+    KArcDirOpenFileWrite,
+    KArcDirCreateFile,
+    KArcDirFileSize,
+    KArcDirSetFileSize,
+    KArcDirOpenDirRead,
+    KArcDirOpenDirUpdate,
+    KArcDirCreateDir,
+    KArcDirDestroyFile,
+    /* end minor version 0 methods*/
+
+    /* start minor version 1 methods*/
+    KArcDirVDate,
+    KArcDirSetDate,
+    KArcDirGetSysDir,
+    /* end minor version 1 methods*/
+
+    /* start minor version 2 methods*/
+    KArcDirFileLocator,
+    /* end minor version 2 methods*/
+
+    /* start minor version 3 methods*/
+    KArcDirFilePhysicalSize,
+    KArcDirFileContiguous
+    /* end minor version 3 methods*/
+};
+
+/* ----------------------------------------------------------------------
+ * KArcDirMake
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN] KArcDir **		self		objected oriented c "self"
+ * [IN] enum RCContext 		ctx		context to use when passing along rc_t
+ * [IN] const KDirectory * 	parent		KDirectory type for path before the archive
+ * [IN] const KToc * 	toc		table of contents for the archive
+ * [IN] const KTocEntry * 	node		this directory's node within the TOC
+ * [IN] const KFile * 		archive		open archive file as KFile
+ * [IN] uint32_t 		dad_root	offset of end of "root" within the path
+ * [IN] const char *		path		path all the way back to file system root not
+ *						effective but real root
+ * [IN] uint32_t		path_size	length of path
+ * [IN] bool			update		!read_only -- ignored for now and forced read_only
+ * [IN] bool			chroot		make this a chroot to dad root?
+ */
+static
+rc_t	KArcDirMake	(KArcDir ** self,
+                         enum RCContext ctx,
+                         const KDirectory * parent,
+                         const KToc * toc,
+                         const KTocEntry * node,
+                         const void * archive,
+                         KArcFSType baseType,
+                         uint32_t dad_root,
+                         const char *path,
+                         uint32_t path_size,
+                         bool update, /* ignored */
+                         bool chroot)
+{
+    KArcDir * dir;
+    rc_t rc;
+
+    assert (self != NULL);
+    assert (parent != NULL);
+    assert (toc != NULL);
+    /* node will be NULL at base archive file */
+    assert (archive != NULL);
+    assert (path != NULL);
+
+    dir = malloc ((sizeof(KArcDir) - sizeof dir->path) + path_size + 2);
+
+    if (dir == NULL)
+    {
+        *self = NULL;
+        return RC (rcFS, rcArc, rcCreating, rcMemory, rcExhausted);
+    }
+
+    dir->toc = NULL;
+    dir->archive.v = NULL;
+
+    rc = KDirectoryInit (&dir->dad, (const KDirectory_vt*) &vtKArcDir,
+                         "KArcDir", path,
+			 /* update*/ false); /* force KDirectory to read_only here */
+    if (rc != 0)
+    {
+        free (dir);
+        return ResetRCContext (rc, rcFS, rcDirectory, ctx);
+    }
+
+    dir->parent = parent;
+    dir->toc = toc;
+    KTocAddRef(toc);
+    dir->node = node;
+    dir->arctype = baseType;
+    dir->archive.v = archive;
+
+    switch (baseType)
+    {
+    default:
+        free (dir);
+        return RC (rcFS, rcArc, rcConstructing, rcParam, rcInvalid);
+    case tocKFile:
+        KFileAddRef (archive);
+        break;
+    case tocKDirectory:
+        KDirectoryAddRef (archive);
+        break;
+    }
+    memmove (dir->path, path, path_size);
+    dir->root = chroot ? path_size : dad_root;
+    dir->size = path_size+1; /* make space for the next two operations */
+    dir->path [path_size] = '/';
+    dir->path [path_size+1] = 0;
+    *self = dir;
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirGetTOC
+ *
+ * [IN]  const KArcDir * 	self	Object oriented C
+ * [OUT] const KToc ** 	toc	Where to put a pointer to the TOC for the KArcDir
+ *
+ * Set a pointer to point the TOC for this KArcDir(KDirectory)
+ */
+rc_t KArcDirGetTOC (const KArcDir * self,
+                    const struct KToc ** toc)
+{
+    assert (self != NULL);
+    assert (toc != NULL);
+
+    *toc = self->toc;
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KDirectoryToKArcDir
+ *
+ * [IN]  const KDirectory * 	self	Object oriented C
+ * [OUT] const KArcDir * 	cast	Object oriented C
+ *
+ *
+ * Get a reference to a KArcDir from a KDirectory as a cast.  It is a new reference.
+ */
+
+LIB_EXPORT rc_t CC KDirectoryToKArcDir (const KDirectory * self, const KArcDir ** cast)
+{
+    rc_t rc;
+    if ( cast == NULL )
+        rc = RC ( rcFS, rcArc, rcCasting, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcArc, rcCasting, rcSelf, rcNull );
+        else
+        {
+            if (self->vt != (const KDirectory_vt*)&vtKArcDir)
+                rc = RC ( rcFS, rcArc, rcCasting, rcSelf, rcIncorrect );
+            else
+            {
+                rc = KDirectoryAddRef ( self );
+                if ( rc == 0 )
+                {
+                    * cast = (const KArcDir*)self;
+                    return 0;
+                }
+            }
+        }
+
+        * cast = NULL;
+    }
+
+    return rc;
+}
+
+
+static
+rc_t KDirectoryOpenArcDirRead_intern( const KDirectory * self,
+                                      const KDirectory ** pdir,
+                                      bool chroot,
+                                      bool silent,
+                                      const char * path,
+                                      KArcFSType baseType,
+                                      void * _archive,
+                                      rc_t ( CC * parse )( KToc *, const void *,
+                                                           bool( CC* )( const KDirectory*,
+                                                                        const char *, void*),
+                                                           void * ),
+                                      bool( CC* filter )( const KDirectory*, const char *, void * ),
+                                      void * filterparam )
+{
+    union
+    {
+        const void * v;
+        const KFile * f;
+        const KDirectory * d;
+    } archive;
+    KArcDir * arcdir = NULL;
+    KToc   * toc = NULL;
+    String   spath;
+    size_t   pathlen;
+    rc_t     rc = 0;
+    rc_t     rcaux = 0;
+    char     cpath [ 4096 ];
+    uint32_t type;
+
+    archive.v = _archive;
+    /* -----
+     * sanity check parameters  The first bunch is from the base class KDirectory.
+     */
+    if ( pdir == NULL )
+    {
+        if ( !silent )
+            PLOGMSG ( klogErr, ( klogErr,
+                      "NULL parameter for the root KArcDir for $(file)",
+                       PLOG_S ( file ),
+                       path ) );
+        return RC ( rcFS, rcDirectory, rcOpening, rcDirectory, rcNull );
+    }
+    *pdir = NULL;
+
+    if ( self == NULL )
+    {
+        if ( !silent )
+            PLOGMSG ( klogErr, ( klogErr,
+                      "NULL parameter for self for $(file)",
+                      PLOG_S ( file ),
+                      path ) );
+        return RC ( rcFS, rcDirectory, rcOpening, rcSelf, rcNull );
+    }
+
+    if ( path == NULL )
+    {
+        if ( !silent )
+            PLOGMSG ( klogErr,( klogErr,
+                      "NULL parameter for the root KArcDir for $(file)",
+                      PLOG_S ( file ),
+                      path ) );
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcNull );
+    }
+
+    if ( path[0] == 0x00 )
+    {
+        if ( !silent )
+            PLOGMSG ( klogErr,( klogErr,
+                      "NULL string for the root KArcDir for $(file)",
+                      PLOG_S ( file ),
+                      path ) );
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcInvalid );
+    }
+
+    if (_archive == NULL)
+    {
+        /* -----
+         * we got a local String type mixed in along with ASCIZ cstrings
+         */
+        rc = KDirectoryResolvePath ( self, true, cpath, sizeof (cpath), "%s", path );
+        if ( rc == 0 )
+        {
+            size_t ln;
+            ln = strlen (cpath);
+            if ((cpath[ln-1] == '.')&&(cpath[ln-2] == '/'))
+                cpath[ln-2] = '\0';
+        }
+        else
+            return rc;
+    }
+    else
+    {
+        size_t ln;
+
+        rc = string_printf (cpath, sizeof cpath, &ln, "%s", path);
+        if ((rc == 0) && (ln > sizeof cpath))
+            rc = RC (rcFS, rcArc, rcOpening, rcBuffer, rcInsufficient);
+    }
+
+    StringInitCString ( &spath, cpath );
+    pathlen = strlen ( cpath );
+
+    if (_archive != NULL)
+    {
+        switch (baseType)
+        {
+        case tocKFile:
+            rc = KFileAddRef (_archive);
+            break;
+        case tocKDirectory:
+            rc = KDirectoryAddRef (_archive);
+            break;
+        default:
+            /* i dunno */
+            break;
+        }
+        if (rc)
+            return rc;
+    }
+    else
+    {
+        type = KDirectoryPathType ( self, "%s", cpath );
+        switch ( type & ~kptAlias )
+        {
+        default:
+            rc = RC ( rcFS, rcArc, rcOpening, rcFile, rcUnexpected );
+            if ( !silent )
+                LOGERR (klogErr, rc, "Unusable file type" );
+            break;
+        case kptNotFound:
+        case kptBadPath:
+            rc = RC ( rcFS, rcArc, rcOpening, rcFile, rcNotFound );
+            break;
+
+        case kptFile:
+            /* -----
+             * Open the archive file as a KFILE for internal use
+             *
+             * Fail / quit if we couldn't
+             */
+            if ( baseType != tocKFile )
+            {
+                rc = RC ( rcFS, rcArc, rcOpening, rcFile, rcIncorrect );
+                if ( !silent )
+                    LOGERR ( klogErr, rc, "Mismatch of file type and expected type" );
+                return rc;
+            }
+
+            rc = KDirectoryOpenFileRead ( self, &archive.f, "%s", cpath );
+            if ( rc != 0 && !silent )
+            {
+                PLOGERR ( klogErr, ( klogErr, rc,
+                                     "Failed to open archive file $(file)",
+                                     PLOG_S (file),
+                                     path ) );
+            }
+        
+            break;
+
+        case kptDir:
+            if ( baseType != tocKDirectory )
+            {
+                rc = RC ( rcFS, rcArc, rcOpening, rcFile, rcInconsistent );
+                if ( !silent )
+                    LOGERR ( klogErr, rc, "Mismatch of file type and expected type" );
+                return rc;
+            }
+
+            rc = KDirectoryOpenDirRead ( self, &archive.d, false, "%s", cpath );
+            if ( rc != 0 && !silent )
+            {
+                PLOGMSG ( klogErr,
+                          ( klogErr, "Failed to open archive directory $(file)",
+                            PLOG_S ( file ), path ) );
+            }
+            break;
+        } /* switch ( type & ~kptAlias ) */
+    }
+    if ( rc == 0 )
+    {
+        /* -----
+         * Build the TOC necessary to get to all internal files and subdirectories
+         * Any sub KArcDir or KFile created will also need to reference the same TOC
+         */
+        rc = KTocInit ( &toc, &spath, baseType, archive.v, sraAlign4Byte );
+        if ( rc != 0 )
+        {
+            if ( !silent )
+                PLOGERR ( klogErr, 
+                     ( klogErr, rc, "Failed to initialize Table of Contents for $(path)", 
+                     PLOG_S ( path ), cpath ) );
+        }
+        else
+        {
+            const KTocEntry * node;
+
+            node = KTocGetRoot( toc );
+
+            rc = KArcDirMake (&arcdir,      /* where to build the KArcDir */
+                              rcAccessing,  /* funky RC replacement thingie */
+                              self,         /* parent KDirectory - for previous path */
+                              toc,          /* table of contents structure for this archive */
+                              node,         /* archive "root" has no node */
+                              archive.v,    /* KFile for the archive */
+                              baseType,     /* base type o archive */
+                              0,            /* dad_root */
+                              cpath,        /* path to archive will be the path of the directory */
+                              (uint32_t)pathlen, /* length of path (the Init will append "/") */
+                              true,         /* readonly */
+                              false);       /* not chroot */
+            if ( rc != 0 )
+            {
+                if ( !silent )
+                PLOGERR ( klogErr, 
+                          ( klogErr, rc, "Failed to allocate for the root KArcDir for $(file)",
+                          PLOG_S ( file ), path ) );
+            }
+            else
+            {
+                rc = parse( toc,archive.v, filter, filterparam );
+                if ( rc == SILENT_RC ( rcFS, rcArc, rcParsing, rcToc, rcIncomplete ) )
+                {
+                    rcaux = rc;
+                    rc = 0;
+                }
+                if ( rc != 0 )
+                {
+                    if ( !silent )
+                        PLOGERR ( klogErr, 
+                             ( klogErr, rc, "Failed to parse $(file)",
+                             PLOG_S ( file ), cpath ) );
+                }
+                else
+                {
+                    *pdir = &arcdir->dad;
+                }
+            }
+        }
+    }
+    /* -----
+     * if rc is non-zero we failed somewhere above.
+     * Release allocated memory and exit with that error code.
+     */
+    if ( archive.v != NULL )
+    {
+        switch ( baseType )
+        {
+        default:
+            free ( (void*)archive.v );
+            break;
+        case tocKFile:
+            KFileRelease ( archive.f );
+            break;
+        case tocKDirectory:
+            KDirectoryRelease ( archive.d );
+            break;
+        }
+    }
+
+    rc = rc | rcaux;
+
+    if ( rc != 0 )
+    {
+        if ( arcdir != NULL )
+            KDirectoryRelease ( &arcdir->dad );
+        *pdir = NULL;
+    }
+
+    if ( toc != NULL )
+        KTocRelease ( toc );
+
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KDirectoryOpenArcDirRead
+ *  Open an archive file as a KDirectory derived type: made to match 
+ *  KDirectoryOpenDirRead() where parse could be the first element of arg
+ *
+ * Much of the code in this function is copied directly from KDirectoryVOpenDirRead
+ *
+ * [IN]  dir   A KDirectory (of any derived type) to reach the archive file
+ * [OUT] pdir  The KDirectory (of type KArcDir)
+ * [IN]  chroot if non-zero, the new directory becomes chroot'd and interprets paths
+ *       stating with '/'
+ * [IN]  path   The path to the archive - this will decome the directory path
+ * [IN]  parse  A pointer to the function needed to build a TOC by parsing the file
+ *
+ * This function is made difficult because a path is not a global type.  Where we
+ * would like to be able to take path and args and have them parsed nicely as they
+ * are for KSysDir or KArcDir with nearly identical functions those functions are
+ * not available here as self is a KDirectory but we do not know and should not know
+ * whether it is a KSysDir or KArcDir.  Unfortunately KSysDir was made overly opaque.
+ * [this is a result of providing full encapsulation, i.e. KDirectory is ONLY an
+ *  interface and there is no implementation provided.][well very little]
+ * If we could take path and args (path and ...) and pass them to a function
+ * equivalent to KSysDirMakePath we would be able to do this right.  Or if we could
+ * ask the self what it's path was and what it considered size and root we could do
+ * the path build here and tidy up properly what we got.  .As is, we have  to be more
+ * limited.
+ *
+ * We will have to wait and fix this right in directory.c where we can instead have
+ * an attempt to open using KDirectory[V]OpenDirRead() check if when it tries to
+ * open a directory but instead finds it has been given a path it will try to parse 
+ * the file using a known set of parse functions to see if the file can be treated
+ * as a directory. Then this function can be called from KDirectoryOpenDirRead.
+ */
+LIB_EXPORT rc_t CC KDirectoryOpenArcDirRead( const KDirectory * self,
+    const KDirectory ** pdir,
+    bool chroot,
+    const char * path,
+    KArcFSType baseType,
+    rc_t ( CC * parse )( KToc *, const void *,
+        bool( CC * )( const KDirectory *, const char *, void * ), void * ),
+    bool ( CC * filter )( const KDirectory*, const char *, void *),
+    void * filterparam )
+{
+    return KDirectoryOpenArcDirRead_intern( self,
+        pdir,
+        chroot, 
+        false,
+        path,
+        baseType,
+        NULL,
+        parse,
+        filter,
+        filterparam );
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryOpenArcDirRead_silent( const KDirectory * self,
+    const KDirectory ** pdir,
+    bool chroot,
+    const char * path,
+    KArcFSType baseType,
+    rc_t ( CC * parse )( KToc *, const void *,
+        bool( CC * )( const KDirectory *, const char *, void * ), void * ),
+    bool ( CC * filter )( const KDirectory*, const char *, void *),
+    void * filterparam )
+{
+    return KDirectoryOpenArcDirRead_intern( self,
+        pdir,
+        chroot, 
+        true,
+        path, 
+        baseType,
+        NULL,
+        parse,
+        filter,
+        filterparam );
+}
+LIB_EXPORT rc_t CC KDirectoryOpenArcDirRead_silent_preopened( const KDirectory * self,
+    const KDirectory ** pdir,
+    bool chroot,
+    const char * path,
+    KArcFSType baseType,
+    void * archive,
+    rc_t ( CC * parse )( KToc *, const void *,
+        bool( CC * )( const KDirectory *, const char *, void * ), void * ),
+    bool ( CC * filter )( const KDirectory*, const char *, void *),
+    void * filterparam )
+{
+    return KDirectoryOpenArcDirRead_intern( self,
+        pdir,
+        chroot, 
+        true,
+        path, 
+        baseType,
+        archive,
+        parse,
+        filter,
+        filterparam );
+}
+
+
+/* ======================================================================
+ * 
+ */
+typedef struct KArcDirPersistVisitFuncData
+{
+    Vector * vector;
+    KArcDir * dir;
+    char path[4096];
+} KArcDirPersistVisitFuncData;
+
+
+static
+rc_t CC KArcDirPersistVisitFunc (const KDirectory * dir, uint32_t unused_type, const char * name, void * data)
+{
+    KPathType type;
+    KArcDirPersistVisitFuncData * vdata;
+    char * path;
+    size_t len = 0;
+    rc_t rc;
+
+    rc = 0;
+    vdata = data;
+
+    type = (KPathType)KDirectoryPathType (dir, "%s", name);
+    switch (type)
+    {
+    default:
+	return 0;
+    case kptDir:
+	len = strlen (vdata->path);
+	if (len > 0)
+	{
+	    vdata->path[len] = '/';
+	    strcpy (vdata->path+len+1, name);
+	}
+	else
+	    strcpy (vdata->path, name);
+
+
+/* this needs cleaning up - dir moved along but path did not.  path handling is weak through out */
+/* 	rc = KArcDirVisit ((const KArcDir*)dir, false, KArcDirPersistVisitFunc, data, vdata->path, NULL); */
+	rc = KArcDirVisit ((const KArcDir*)dir, false, KArcDirPersistVisitFunc, data, name, NULL);
+	if (rc != 0)
+	{
+	    LOGERR (klogInt, rc, "KArcDirPersist Visit failed");
+	}
+	vdata->path[len] = '\0';
+	return rc;
+    case kptFile:
+    case kptFile|kptAlias:
+	len = strlen (vdata->path);
+	if (len > 0)
+	{
+	    vdata->path[len] = '/';
+	    strcpy (vdata->path+len+1, name);
+	}
+	else
+	    strcpy (vdata->path, name);
+	path = malloc (strlen(vdata->path)+1);
+	if (path == NULL)
+	{
+	    rc = RC (rcFS, rcArc, rcReindexing, rcMemory, rcExhausted);
+	}
+	else
+	{
+	    strcpy (path, vdata->path);
+	    rc = VectorAppend (vdata->vector, NULL, path);
+	}
+	vdata->path[len] = '\0';
+
+	return rc;
+    }
+}
+
+static
+void CC whack ( void *item, void *data )
+{
+    free (item);
+}
+
+/* ========================================
+ * Build a Persisted version of a TOC in a buffer
+ * return the allocated buffer
+ */
+#ifdef _DEBUGGING
+static
+void CC write_entry( void * item, void *data)
+{
+    const char * path = item;
+    uint32_t * count = data;
+
+    TOC_SORT(("%3u: %s\n", *count, path));
+
+    (*count)++;
+}
+#endif
+rc_t KArcDirPersistHeader (const KArcDir * self,
+                           void ** buffer,
+                           size_t * buffer_size,
+                           uint64_t * file_size,
+                           KSRAFileAlignment align,
+                           rc_t (CC*usort)(const KDirectory*, Vector*))
+{
+    rc_t         rc;
+    const KToc * toc;
+
+    FUNC_ENTRY();
+
+    if (self == NULL)
+    {
+	rc = RC (rcFS, rcDirectory, rcPersisting, rcSelf, rcNull);
+	LOGERR (klogInt, rc, "KArcDirPersist Self is NULL");
+	return rc;
+    }
+    if (buffer == NULL)
+    {
+	rc = RC (rcFS, rcDirectory, rcPersisting, rcParam, rcNull);
+	LOGERR (klogInt, rc, "KArcDirPersist buffer is NULL");
+	return rc;
+    }
+    rc = KArcDirGetTOC (self, &toc);
+    if (rc != 0)
+        LOGERR (klogInt, rc, "KArcDirPersist TOC retrieval failed");
+    else
+    {
+        /* mutable field as it only applies to this specific operation */
+        rc = KTocAlignmentSet ((KToc*)toc, align);
+        if (rc != 0)
+            LOGERR (klogInt, rc, "KArcDirPersist TOC alignment failed");
+        else
+        {
+            Vector filevector;
+            KArcDirPersistVisitFuncData	data;
+
+            VectorInit (&filevector, 0, 0);
+
+            data.path[0] = '\0'; /* looks like "" */
+            data.vector = &filevector;
+
+
+            rc = KArcDirVisit (self, false, KArcDirPersistVisitFunc, &data, ".", NULL);
+            if (rc != 0)
+            {
+                LOGERR (klogInt, rc, "KArcDirPersist Visit failed");
+            }
+            else
+            {
+
+#ifdef _DEBUGGING
+/* this loop and the next just can be used in a debug build to verify the sorting function used */
+                {
+                    uint32_t ix;
+                    TOC_SORT (("Pre-sort order:\n"));
+
+                    ix = 1;
+                    VectorForEach ( &filevector, false, write_entry, &ix);
+                }
+#endif
+
+                if (usort)
+                    rc = usort(&self->dad, &filevector);
+
+#ifdef _DEBUGGING
+                {
+                    uint32_t ix;
+                    TOC_SORT (("Post-sort order:\n"));
+
+                    ix = 1;
+                    VectorForEach ( &filevector, false, write_entry, &ix);
+                }
+#endif
+
+
+                if (rc != 0)
+                {
+                    LOGERR (klogInt, rc, "KArcDirPersist user sort failed failed");
+                }
+                else
+                {
+                    rc = KTocPersist (toc, buffer, buffer_size, file_size, &filevector);
+                    if (rc != 0)
+                        LOGERR (klogInt, rc, "KArcDirPersist TOC retrieval failed");
+                }
+            }
+/*     free (data.path); */
+            VectorWhack (&filevector, whack, NULL);
+	}
+    }
+ 
+    return rc;
+}
+
+KFS_EXTERN bool CC KDirectoryIsKArcDir ( const KDirectory * self )
+{
+    return self != NULL && &self -> vt -> v1 == &vtKArcDir;
+}
+
+KFS_EXTERN bool CC KArcDirIsFromRemote ( const KArcDir * self )
+{
+    return self != NULL && self -> arctype == tocKFile &&
+            ( KFileIsKCacheTeeFile ( self -> archive . f ) || KFileIsKHttpFile ( self -> archive . f ) );
+}
+
+
+/* end of file arc.c */
+
diff --git a/libs/kfs/arrayfile.c b/libs/kfs/arrayfile.c
new file mode 100644
index 0000000..0f19006
--- /dev/null
+++ b/libs/kfs/arrayfile.c
@@ -0,0 +1,423 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+#include <kfs/impl.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+
+/*--------------------------------------------------------------------------
+ * KArrayFile
+ */
+
+
+/* Destroy
+ *  destroy array-file
+ */
+LIB_EXPORT rc_t CC KArrayFileDestroy ( KArrayFile *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcDestroying, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . destroy ) ( self );
+    }
+
+    return RC ( rcFS, rcFile, rcDestroying, rcInterface, rcBadVersion );
+}
+
+
+/* AddRef
+ *  creates a new reference
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KArrayFileAddRef ( const KArrayFile *self )
+{
+    if ( self != NULL )
+        atomic32_inc ( & ( ( KArrayFile* ) self ) -> refcount );
+    return 0;
+}
+
+/* Release
+ *  discard reference to file
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KArrayFileRelease ( const KArrayFile *cself )
+{
+    KArrayFile *self = ( KArrayFile* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+        {
+            rc_t rc = KArrayFileDestroy ( self );
+            if ( rc != 0 )
+                atomic32_set ( & self -> refcount, 1 );
+            return rc;
+        }
+    }
+    return 0;
+}
+
+/* Dimensionality
+ *  returns the number of dimensions in the ArrayFile
+ *
+ *  "dim" [ OUT ] - return parameter for number of dimensions
+ */
+LIB_EXPORT rc_t CC KArrayFileDimensionality ( const KArrayFile *self, uint8_t *dim )
+{
+    if ( dim == NULL )
+        return RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+
+    * dim = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . dimensionality ) ( self, dim );
+    }
+
+    return RC ( rcFS, rcFile, rcAccessing, rcInterface, rcBadVersion );
+}
+
+
+/* SetDimensionality
+ *  sets the number of dimensions in the ArrayFile
+ *
+ *  "dim" [ IN ] - new number of dimensions; must be > 0
+ */
+LIB_EXPORT rc_t CC KArrayFileSetDimensionality ( KArrayFile *self, uint8_t dim )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcResizing, rcSelf, rcNull );
+
+    if ( dim == 0 )
+        return RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcFS, rcFile, rcResizing, rcFile, rcNoPerm );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . set_dimensionality ) ( self, dim );
+    }
+
+    return RC ( rcFS, rcFile, rcResizing, rcInterface, rcBadVersion );
+}
+
+
+/* DimExtents
+ *  returns the extent of every dimension
+ *
+ *  "dim" [ IN ] - the dimensionality of "extents"
+ *
+ *  "extents" [ OUT ] - returns the extent for every dimension
+ */
+LIB_EXPORT rc_t CC KArrayFileDimExtents ( const KArrayFile *self, uint8_t dim, uint64_t *extents )
+{
+    uint8_t i;
+    if ( extents == NULL || dim == 0 )
+        return RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+
+    for ( i = 0; i < dim; ++i )
+        extents[ i ] = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . dim_extents ) ( self, dim, extents );
+    }
+
+    return RC ( rcFS, rcFile, rcAccessing, rcInterface, rcBadVersion );
+}
+
+
+/* SetDimExtents
+ *  sets the new extents for every dimension
+ *
+ *  "dim" [ IN ] - the dimensionality of "extents"
+ *
+ *  "extents" [ IN ] - new extents for every dimension
+ */
+LIB_EXPORT rc_t CC KArrayFileSetDimExtents ( KArrayFile *self, uint8_t dim, uint64_t *extents )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcResizing, rcSelf, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcFS, rcFile, rcResizing, rcFile, rcNoPerm );
+
+    if ( extents == NULL || dim == 0 )
+        return RC ( rcFS, rcFile, rcResizing, rcParam, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . set_dim_extents ) ( self, dim, extents );
+    }
+
+    return RC ( rcFS, rcFile, rcResizing, rcInterface, rcBadVersion );
+}
+
+
+/* ElementSize
+ *  returns the element size in bits
+ *
+ *  "elem_bits" [ OUT ] - size of each element in bits
+ */
+LIB_EXPORT rc_t CC KArrayFileElementSize ( const KArrayFile *self, uint64_t *elem_bits )
+{
+    if ( elem_bits == NULL )
+        return RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+
+    *elem_bits = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . element_size ) ( self, elem_bits );
+    }
+
+    return RC ( rcFS, rcFile, rcAccessing, rcInterface, rcBadVersion );
+}
+
+
+/* Read
+ *  read from n-dimensional position
+ *
+ *  "dim" [ IN ] - the dimensionality of all vectors
+ *
+ *  "pos"  [ IN ] - n-dimensional starting position in elements
+ *
+ *  "buffer" [ OUT ] and "elem_count" [ IN ] - return buffer for read
+ *  where "elem_count" is n-dimensional in elements
+ *
+ *  "num_read" [ OUT ] - n-dimensional return parameter giving back
+ *      the number of read elements in every dimension
+ */
+LIB_EXPORT rc_t CC KArrayFileRead ( const KArrayFile *self, uint8_t dim,
+    const uint64_t *pos, void *buffer, const uint64_t *elem_count,
+    uint64_t *num_read )
+{
+    uint8_t i;
+    if ( num_read == NULL || pos == NULL || elem_count == NULL || dim == 0 )
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+
+    for ( i = 0; i < dim; ++i )
+        num_read[ i ] = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcFS, rcFile, rcReading, rcFile, rcNoPerm );
+
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . read ) ( self, dim, pos, buffer, elem_count, num_read );
+    }
+
+    return RC ( rcFS, rcFile, rcReading, rcInterface, rcBadVersion );
+}
+
+
+/* Read_v
+ *  read one element of variable length from n-dimensional position
+ *
+ *  "dim" [ IN ] - the dimensionality of all vectors
+ *
+ *  "pos"  [ IN ] - n-dimensional starting position in elements
+ *
+ *  "buffer" [ OUT ] and "elem_count" [ IN ] - return buffer for read
+ *  where "elem_count" is length of buffer in elements
+ *
+ *  "num_read" [ OUT ] - return parameter giving back
+ *      the number of read elements in every dimension
+ */
+LIB_EXPORT rc_t CC KArrayFileRead_v ( const KArrayFile *self, uint8_t dim,
+    const uint64_t *pos, void *buffer, const uint64_t elem_count,
+    uint64_t *num_read )
+{
+    if ( num_read == NULL || pos == NULL || elem_count == 0 || dim == 0 )
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+
+    *num_read = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcFS, rcFile, rcReading, rcFile, rcNoPerm );
+
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . read_v ) ( self, dim, pos, buffer, elem_count, num_read );
+    }
+
+    return RC ( rcFS, rcFile, rcReading, rcInterface, rcBadVersion );
+}
+
+
+/* Write
+ *  write into n-dimensional position
+ *
+ *  "dim" [ IN ] - the dimensionality of all vectors
+ *
+ *  "pos"  [ IN ] - n-dimensional offset where to write to
+ *                   in elements
+ *
+ *  "buffer" [ IN ] and "elem_count" [ IN ] - data to be written
+ *  where "elem_count" is n-dimensional in elements
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of elements actually written per dimension
+ */
+LIB_EXPORT rc_t CC KArrayFileWrite ( KArrayFile *self, uint8_t dim,
+    const uint64_t *pos, const void *buffer, const uint64_t *elem_count,
+    uint64_t *num_writ )
+{
+    uint8_t i;
+    if ( num_writ == NULL || pos == NULL || elem_count == NULL || dim == 0 )
+        return RC ( rcFS, rcFile, rcWriting, rcParam, rcNull );
+
+    for ( i = 0; i < dim; ++i )
+        num_writ[ i ] = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcSelf, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcFS, rcFile, rcWriting, rcFile, rcNoPerm );
+
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . write ) ( self, dim, pos, buffer, elem_count, num_writ );
+    }
+
+    return RC ( rcFS, rcFile, rcWriting, rcInterface, rcBadVersion );
+}
+
+
+/* GetMeta
+ *  extracts metadata into a string-vector
+ *
+ *  "key"   [ IN ]  - the key which part of the metadata to retrieve
+ *
+ *  "list"  [ OUT ] - pointer to a KNamelist-pointer
+ *
+ */
+LIB_EXPORT rc_t CC KArrayFileGetMeta ( struct KArrayFile const *self, const char *key,
+    const struct KNamelist **list )
+{
+    if ( key == NULL || list == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcSelf, rcNull );
+
+    *list = NULL;
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . get_meta ) ( self, key, list );
+    }
+
+    return RC ( rcFS, rcFile, rcWriting, rcInterface, rcBadVersion );
+}
+
+
+/* Init
+ *  initialize a newly allocated file object
+ */
+LIB_EXPORT rc_t CC KArrayFileInit ( KArrayFile *self, const KArrayFile_vt *vt,
+    bool read_enabled, bool write_enabled )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcSelf, rcNull );
+    if ( vt == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcNull );
+    switch ( vt -> v1 . maj )
+    {
+    case 0:
+        return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcInvalid );
+
+    case 1:
+        switch ( vt -> v1 . min )
+        {
+            /* ADD NEW MINOR VERSION CASES HERE */
+        case 0:
+#if _DEBUGGING
+        if ( vt -> v1 . write == NULL              ||
+             vt -> v1 . read == NULL               ||
+             vt -> v1 . element_size == NULL       ||
+             vt -> v1 . set_dim_extents == NULL    ||
+             vt -> v1 . dim_extents == NULL        ||
+             vt -> v1 . set_dimensionality == NULL ||
+             vt -> v1 . dimensionality == NULL     ||
+             vt -> v1 . get_meta == NULL           ||
+             vt -> v1 . destroy == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcNull );
+#endif
+            break;
+        default:
+            return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcBadVersion );
+        }
+        break;
+
+    default:
+        return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcBadVersion );
+    }
+
+    self -> vt = vt;
+    KRefcountInit ( & self -> refcount, 1, "KArrayFile", "Creating", "-" );
+    self -> read_enabled = ( uint8_t ) ( read_enabled != 0 );
+    self -> write_enabled = ( uint8_t ) ( write_enabled != 0 );
+
+    return 0;
+}
diff --git a/libs/kfs/buffile-read.c b/libs/kfs/buffile-read.c
new file mode 100644
index 0000000..7635568
--- /dev/null
+++ b/libs/kfs/buffile-read.c
@@ -0,0 +1,265 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+typedef struct KBufReadFile KBufReadFile;
+#define KFILE_IMPL KBufReadFile
+
+#include <kfs/extern.h>
+
+#include <kfs/file.h>
+#include <kfs/impl.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+/*-----------------------------------------------------------------------
+ * KBufReadFile
+ */
+struct KBufReadFile
+{
+    KFile dad;
+
+    uint64_t pos;       /* position of buff within the original file */
+
+    const KFile *f;           /* original file being buffered */
+
+    size_t bsize;       /* size of the buffer */
+    size_t num_valid;   /* how much of the buffer is actually valid */
+
+    uint8_t buff [ 1 ];
+};
+
+static
+rc_t CC KBufReadFileDestroy ( KBufReadFile *self )
+{
+    rc_t rc = KFileRelease ( self -> f );
+    if ( rc == 0 )
+        free ( self );
+    return rc;
+}
+
+static
+struct KSysFile* CC KBufReadFileSysFile ( const KBufReadFile *self, uint64_t *offset )
+{
+    /* does not support SysFile */
+    * offset = 0;
+    return NULL;
+}
+
+static
+rc_t CC KBufReadFileRandomAccess ( const KBufReadFile *self )
+{
+    return KFileRandomAccess ( self -> f );
+}
+
+static
+rc_t CC KBufReadFileSize ( const KBufReadFile *self, uint64_t *size )
+{
+    return KFileSize ( self -> f, size );
+}
+
+static
+rc_t CC KBufReadFileSetSize ( KBufReadFile *self, uint64_t size )
+{
+    return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+}
+
+static
+rc_t CC KBufReadFileRead ( const KBufReadFile *cself, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc = 0;
+
+    assert (cself);
+    assert (buffer);
+    assert (num_read);
+
+    /* start assuming nothing will be read */
+    *num_read = 0;
+
+    if (bsize != 0)
+    {
+        KBufReadFile * self = (KBufReadFile *)cself;
+        uint64_t new_pos; 
+        size_t new_offset;
+
+        /* cast might be a no-op */
+        new_offset = (size_t)(pos % cself->bsize);
+        new_pos = pos - new_offset;
+
+        /* we need to read if we are on the wrong 'sector page'
+         * or the current 'sector page' isn't long enough.
+         *
+         * If on the wrong page just kill the contents
+         */
+        if (new_pos != cself->pos)
+        {
+            self->num_valid = 0;
+            self->pos = new_pos;
+        }
+
+        /* new we agree on the 'sector page' even if we have nothing
+         * valid in it */
+        if ((self->num_valid == 0) || (self->num_valid <= (size_t)new_offset))
+        {
+            size_t new_num_read;
+            rc = KFileReadAll (self->f, self->pos + self->num_valid,
+                               self->buff + self->num_valid, 
+                               self->bsize - self->num_valid,
+                               &new_num_read);
+            if (rc == 0)
+                self->num_valid += new_num_read;
+        }
+
+        /* now we have all we're gonna get this time */
+        if (new_offset < self->num_valid)
+        {
+            size_t to_copy;
+
+            to_copy = self->num_valid - new_offset;
+            if (to_copy > bsize)
+                to_copy = bsize;
+            
+            memmove (buffer, self->buff + new_offset, to_copy);
+            *num_read = to_copy;
+        }
+    }
+    return rc;
+}
+
+static
+rc_t CC KBufReadFileWrite ( KBufReadFile *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    return RC ( rcFS, rcFile, rcWriting, rcFunction, rcUnsupported );
+}
+
+static
+uint32_t CC KBufReadFileType ( const KBufReadFile * self )
+{
+    return KFileType ( self -> f );
+}
+
+static
+rc_t KBufReadFileMake ( KBufReadFile ** bp, const KFile *f, size_t bsize,
+    const KFile_vt *vt, bool read_enabled, bool write_enabled )
+{
+    rc_t rc;
+
+    KBufReadFile *buf = calloc ( sizeof * buf - 1 + bsize, 1 );
+    if ( buf == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KFileInit ( & buf -> dad, vt, "KBufReadFile", "no-name", read_enabled, write_enabled );
+        if ( rc == 0 )
+        {
+            rc = KFileAddRef ( f );
+            if ( rc == 0 )
+            {
+                buf -> f = ( KFile* ) f;
+                buf -> bsize = bsize;
+                * bp = buf;
+                return 0;
+            }
+        }
+
+        free ( buf );
+    }
+
+    return rc;
+}
+
+/* MakeBufferedWrite
+ *  make a writable file buffer
+ *
+ *  "buf" [ OUT ] - return parameter for new buffered file
+ *
+ *  "original" [ IN ] - source file to be buffered. must have read access
+ *
+ *  "bsize" [ IN ] - buffer size
+ */
+
+static
+const KFile_vt_v1 vtKBufReadFileRandWR_v1 =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KBufReadFileDestroy,
+    KBufReadFileSysFile,
+    KBufReadFileRandomAccess,
+    KBufReadFileSize,
+    KBufReadFileSetSize,
+    KBufReadFileRead,
+    KBufReadFileWrite,
+
+    /* 1.1 */
+    KBufReadFileType
+};
+
+LIB_EXPORT 
+rc_t CC KBufReadFileMakeRead ( const KFile ** bp, const KFile * original, size_t bsize )
+{
+    rc_t rc;
+
+    if ( bp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( original == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! original -> read_enabled )
+        {
+            if ( original -> write_enabled )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcWriteonly );
+            else
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        }
+        else
+        {
+            KBufReadFile *buf;
+            rc = KBufReadFileMake ( & buf, original, bsize,
+                ( const KFile_vt* ) & vtKBufReadFileRandWR_v1, true, false );
+            if ( rc == 0 )
+            {
+                * bp = & buf -> dad;
+                return 0;
+            }
+        }
+
+        * bp = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/kfs/buffile-write.c b/libs/kfs/buffile-write.c
new file mode 100644
index 0000000..562d6eb
--- /dev/null
+++ b/libs/kfs/buffile-write.c
@@ -0,0 +1,371 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+typedef struct KBufWriteFile KBufWriteFile;
+#define KFILE_IMPL KBufWriteFile
+
+#include <kfs/extern.h>
+
+#include <kfs/file.h>
+#include <kfs/impl.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+/*-----------------------------------------------------------------------
+ * KBufWriteFile
+ */
+struct KBufWriteFile
+{
+    KFile dad;
+
+    uint64_t pos;
+
+    KFile *f;
+
+    size_t bsize;
+    size_t num_valid;
+
+    uint8_t buff [ 1 ];
+};
+
+
+/*
+static
+rc_t CC KBufWriteFileDestroy ( KBufWriteFile *self )
+{
+    rc_t rc = KFileRelease ( self -> f );
+    if ( rc == 0 )
+        free ( self );
+    return rc;
+}
+*/
+
+static
+rc_t KBufWriteFileFlush ( KBufWriteFile *self, uint64_t dpos )
+{
+    rc_t rc;
+    size_t total_writ, partial;
+
+    /* flush buffer */
+    for ( rc = 0, total_writ = 0; total_writ < self -> num_valid; total_writ += partial )
+    {
+        rc = KFileWrite ( self -> f, dpos + total_writ,
+            & self -> buff [ total_writ ],
+            self -> num_valid - total_writ, & partial );
+        if ( rc != 0 )
+            break;
+        if ( partial == 0 )
+        {
+            rc = RC ( rcFS, rcFile, rcWriting, rcTransfer, rcIncomplete );
+            break;
+        }
+    }
+
+    if ( rc == 0 )
+        self -> num_valid = 0;
+
+    return rc;
+}
+
+static
+rc_t CC KBufWriteFileFlushDestroy ( KBufWriteFile *self )
+{
+    rc_t rc = KBufWriteFileFlush ( self, self -> pos );
+    if ( rc == 0 )
+        rc = KFileRelease ( self -> f );
+    if ( rc == 0 )
+        free ( self );
+    return rc;
+}
+
+static
+struct KSysFile* CC KBufWriteFileNoSysFile ( const KBufWriteFile *self, uint64_t *offset )
+{
+    * offset = 0;
+    return NULL;
+}
+
+static
+rc_t CC KBufWriteFileRandomAccess ( const KBufWriteFile *self )
+{
+    return KFileRandomAccess ( self -> f );
+}
+
+static
+rc_t CC KBufWriteFileSize ( const KBufWriteFile *self, uint64_t *size )
+{
+    return KFileSize ( self -> f, size );
+}
+
+static
+rc_t CC KBufWriteFileSetSize ( KBufWriteFile *self, uint64_t size )
+{
+    if ( self -> pos + self -> num_valid > size )
+    {
+        if ( self -> pos < size )
+        {
+            size_t total, num_writ, to_write = ( size_t ) ( size - self -> pos );
+            for ( total = 0; total < to_write; total += num_writ )
+            {
+                rc_t rc = KFileWrite ( self -> f, self -> pos + total,
+                    & self -> buff [ total ], to_write - total, & num_writ );
+                if ( rc != 0 )
+                    return rc;
+                if ( num_writ == 0 )
+                    return RC ( rcFS, rcFile, rcReading, rcTransfer, rcIncomplete );
+            }
+        }
+
+        self -> pos = 0;
+        self -> num_valid = 0;
+    }
+
+    return KFileSetSize ( self -> f, size );
+}
+
+static
+rc_t CC KBufWriteFileNoRead ( const KBufWriteFile *cself, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    return RC ( rcFS, rcFile, rcReading, rcFunction, rcUnsupported );
+}
+
+static
+rc_t CC KBufWriteFileWrite ( KBufWriteFile *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    rc_t rc;
+    size_t total, partial, trailing;
+
+    const uint8_t *bbuff = buffer;
+    uint64_t send = pos + size;
+
+    /* case 1: empty write */
+    if ( size == 0 )
+    {
+        * num_writ = 0;
+        return 0;
+    }
+
+    /* perform write */
+    for ( rc = 0, total = trailing = 0; total < size; total += partial )
+    {
+        size_t boff = total - trailing;
+        uint64_t dpos = self -> pos;
+        uint64_t dend = self -> pos + self -> num_valid;
+        uint64_t dlim = self -> pos + self -> bsize;
+        uint64_t spos = pos + boff;
+
+        /* case 2: left within buffer */
+        if ( dpos <= spos && spos <= dend && spos < dlim )
+        {
+            partial = ( size_t ) ( ( dlim < send ? dlim : send ) - spos );
+            memmove ( & self -> buff [ spos - dpos ], & bbuff [ boff ], partial );
+            if ( spos + partial > dend )
+            {
+                dend = spos + partial;
+                self -> num_valid = ( size_t ) ( dend - dpos );
+            }
+        }
+
+        /* case 3: right within buffer */
+        else if ( spos < dpos && dpos < send && send <= dlim )
+        {
+            partial = ( size_t ) ( send - dpos );
+            memmove ( & self -> buff [ spos - dpos ], & bbuff [ boff ], partial );
+            if ( send > dend )
+            {
+                dend = send;
+                self -> num_valid = ( size_t ) ( dend - dpos );
+            }
+
+            /* adjust other components for trailing copy */
+            assert ( trailing == 0 );
+            trailing = partial;
+            send = dpos;
+        }
+
+        /* case 4: no intersection */
+        else if ( send <= dpos || dend <= spos )
+        {
+            /* flush buffer as-is */
+            rc = KBufWriteFileFlush ( self, dpos );
+            if ( rc != 0 )
+                break;
+
+            /* empty buffer centered on this write */
+            self -> pos = spos;
+
+            /* if write is >= buffer size, just write it directy */
+            partial = size - total;
+            if ( partial < self -> bsize )
+            {
+                memmove ( self -> buff, & bbuff [ boff ], partial );
+                self -> num_valid = partial;
+            }
+            else
+            {
+                rc = KFileWrite ( self -> f, spos, & bbuff [ boff ], partial, & partial );
+                if ( rc != 0 )
+                    break;
+                if ( partial == 0 )
+                {
+                    rc = RC ( rcFS, rcFile, rcWriting, rcTransfer, rcIncomplete );
+                    break;
+                }
+            }
+        }
+
+        /* case 5: completely engulfs */
+        else
+        {
+            assert ( spos < dpos && dlim < send );
+            rc = KFileWrite ( self -> f, spos, & bbuff [ boff ], ( size_t ) ( send - spos ), & partial );
+            if ( rc != 0 )
+                break;
+            if ( partial == 0 )
+            {
+                rc = RC ( rcFS, rcFile, rcWriting, rcTransfer, rcIncomplete );
+                break;
+            }
+
+            /* anything in the buffer is invalid now */
+            self -> num_valid = 0;
+        }
+    }
+
+    * num_writ = total;
+
+    return rc;
+}
+
+static
+uint32_t CC KBufWriteFileType ( const KBufWriteFile * self )
+{
+    return KFileType ( self -> f );
+}
+
+static
+rc_t KBufWriteFileMake ( KBufWriteFile ** bp, const KFile *f, size_t bsize,
+    const KFile_vt *vt, bool read_enabled, bool write_enabled )
+{
+    rc_t rc;
+
+    KBufWriteFile *buf = malloc ( sizeof * buf - 1 + bsize );
+    if ( buf == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        memset ( buf, 0, sizeof * buf );
+        rc = KFileInit ( & buf -> dad, vt, "KBufWriteFile", "no-name", read_enabled, write_enabled );
+        if ( rc == 0 )
+        {
+            rc = KFileAddRef ( f );
+            if ( rc == 0 )
+            {
+                buf -> f = ( KFile* ) f;
+                buf -> bsize = bsize;
+                * bp = buf;
+                return 0;
+            }
+        }
+
+        free ( buf );
+    }
+
+    return rc;
+}
+
+/* MakeBufferedWrite
+ *  make a writable file buffer
+ *
+ *  "buf" [ OUT ] - return parameter for new buffered file
+ *
+ *  "original" [ IN ] - source file to be buffered. must have read access
+ *
+ *  "bsize" [ IN ] - buffer size
+ */
+
+static
+const KFile_vt_v1 vtKBufWriteFileRandWR_v1 =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KBufWriteFileFlushDestroy,
+    KBufWriteFileNoSysFile,
+    KBufWriteFileRandomAccess,
+    KBufWriteFileSize,
+    KBufWriteFileSetSize,
+    KBufWriteFileNoRead,
+    KBufWriteFileWrite,
+
+    /* 1.1 */
+    KBufWriteFileType
+};
+
+LIB_EXPORT rc_t KBufWriteFileMakeWrite ( KFile ** bp, KFile * original, size_t bsize )
+{
+    rc_t rc;
+
+    if ( bp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( original == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! original -> write_enabled )
+        {
+            if ( original -> read_enabled )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+            else
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        }
+        else
+        {
+            KBufWriteFile *buf;
+            rc = KBufWriteFileMake ( & buf, original, bsize,
+                ( const KFile_vt* ) & vtKBufWriteFileRandWR_v1, false, true );
+            if ( rc == 0 )
+            {
+                * bp = & buf -> dad;
+                return 0;
+            }
+        }
+
+        * bp = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/kfs/buffile.c b/libs/kfs/buffile.c
new file mode 100644
index 0000000..92ddc05
--- /dev/null
+++ b/libs/kfs/buffile.c
@@ -0,0 +1,574 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+struct KBufFile;
+#define KFILE_IMPL struct KBufFile
+
+#include <kfs/extern.h>
+#include <kfs/buffile.h>
+
+#include <kfs/file.h>
+#include <kfs/impl.h>
+#include <kfs/pagefile.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+rc_t KBufWriteFileMakeWrite ( KFile ** bp, KFile * original, size_t bsize );
+
+
+/*-----------------------------------------------------------------------
+ * KBufFile
+ */
+typedef struct KBufFile KBufFile;
+struct KBufFile
+{
+    KFile dad;
+
+    uint64_t max_write;
+
+    KFile *f;
+    KPageFile *pf;
+
+    KPage *pg;
+    size_t pgsize;
+    uint32_t pgid;
+};
+
+
+#define KBufFileSerialAccess( self ) \
+    ( ( const KFile* ) & ( self ) -> dad ) -> align [ 0 ]
+
+#define KBufFileSetSerialAccess( self, val ) \
+    ( self ) -> dad . align [ 0 ] = ( val )
+    
+
+static
+rc_t CC KBufFileDestroy ( KBufFile *self )
+{
+    rc_t rc = KPageRelease ( self -> pg );
+    if ( rc == 0 )
+    {
+        self -> pg = NULL;
+        self -> pgid = 0;
+
+        rc = KPageFileRelease ( self -> pf );
+        if ( rc == 0 )
+        {
+            KFileRelease ( self -> f );
+            free ( self );
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t CC KBufFileDestroyTrunc ( KBufFile *self )
+{
+    /* grab some information */
+    KFile *f = self -> f;
+    rc_t rc = KFileAddRef ( self -> f );
+    uint64_t max_write = self -> max_write;
+
+    if ( rc == 0 )
+    {
+        /* destroy self and write all pages */
+        rc = KBufFileDestroy ( self );
+        if ( rc == 0 )
+            rc = KFileSetSize ( f, max_write );
+
+        KFileRelease ( f );
+    }
+    return rc;
+}
+
+static
+struct KSysFile* CC KBufFileGetSysFile ( const KBufFile *self, uint64_t *offset )
+{
+    * offset = 0;
+    return NULL;
+}
+
+static
+rc_t CC KBufFileRandomAccess ( const KBufFile *self )
+{
+    return KFileRandomAccess ( self -> f );
+}
+
+static
+rc_t CC KBufFileSizeRead ( const KBufFile *self, uint64_t *size )
+{
+    uint64_t lsize, fsize;
+    rc_t rc = KPageFileSize ( self -> pf, & lsize, & fsize, NULL );
+
+    if ( rc != 0 )
+        * size = 0;
+    else
+        * size = fsize;
+
+    return rc;
+}
+
+static
+rc_t CC KBufFileSize ( const KBufFile *self, uint64_t *size )
+{
+    uint64_t lsize, fsize;
+    rc_t rc = KPageFileSize ( self -> pf, & lsize, & fsize, NULL );
+
+    if ( rc != 0 )
+        * size = 0;
+    else if ( lsize < fsize )
+        * size = fsize;
+    else
+        * size = lsize;
+
+    return rc;
+}
+
+static
+rc_t CC KBufFileSetSize ( KBufFile *self, uint64_t size )
+{
+    KPageRelease ( self -> pg );
+    self -> pg = NULL;
+    self -> pgid = 0;
+
+    return KPageFileSetSize ( self -> pf, size );
+}
+
+static
+rc_t CC KBufFileNoSetSize ( KBufFile *self, uint64_t size )
+{
+    return RC ( rcFS, rcFile, rcResizing, rcFunction, rcUnsupported );
+}
+
+static
+rc_t CC KBufFileRead ( const KBufFile *cself, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    KBufFile *self = ( KBufFile* ) cself;
+
+    rc_t rc;
+    uint8_t *dst = buffer;
+    size_t total, partial;
+
+    for ( rc = 0, total = 0; total < bsize; pos += partial, total += partial )
+    {
+        const uint8_t *src;
+        size_t bytes, offset;
+
+        /* bytes remaining to be read */
+        size_t remain = bsize - total;
+
+        /* user wants to access this page */
+        uint32_t pgid = ( uint32_t ) ( pos / self -> pgsize ) + 1;
+
+        /* check against cached page */
+        if ( self -> pgid != pgid )
+        {
+            /* release previous page */
+            KPageRelease ( self -> pg );
+
+            /* get requested page */
+            rc = KPageFilePosGet ( self -> pf, & self -> pg, pos );
+            if ( rc != 0 )
+            {
+                if ( GetRCState ( rc ) == rcNotFound )
+                    rc = 0;
+
+                self -> pg = NULL;
+                self -> pgid = 0;
+                break;
+            }
+            self -> pgid = pgid;
+        }
+
+        /* access page memory */
+        rc = KPageAccessRead ( self -> pg, ( const void** ) & src, & bytes );
+        if ( rc != 0 )
+            break;
+
+        /* going to copy from page at the given offset */
+        offset = ( size_t ) ( pos % bytes );
+        assert ( bytes == self -> pgsize );
+
+        /* limit to end of file if serial access */
+        if ( KBufFileSerialAccess ( self ) )
+        {
+            uint64_t fsize;
+            rc = KPageFileSize ( self -> pf, NULL, & fsize, NULL );
+            if ( rc != 0 )
+                break;
+            if ( pgid * bytes > fsize )
+            {
+                bytes = ( size_t ) ( fsize % bytes ); 
+                if ( bytes <= offset )
+                    break;
+            }
+        }
+        /* limit to eof if read-only */
+        else if ( ! self -> dad . write_enabled )
+        {
+            if ( pgid * bytes > self -> max_write )
+            {
+                bytes = ( size_t ) ( self -> max_write % bytes ); 
+                if ( bytes <= offset )
+                    break;
+            }
+        }
+
+        /* limit bytes to request */
+        partial = bytes - offset;
+        if ( partial > remain )
+            partial = remain;
+
+        /* copy bytes */
+        memmove ( & dst [ total ], & src [ offset ], partial );
+    }
+
+    if ( total != 0 )
+    {
+        * num_read = total;
+        return 0;
+    }
+
+    * num_read = 0;
+    return rc;
+}
+
+static
+rc_t CC KBufFileWrite ( KBufFile *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    rc_t rc;
+    size_t total, partial;
+    const uint8_t *src = buffer;
+
+    /* record start marker */
+    uint64_t start = pos;
+
+    for ( rc = 0, total = 0; total < size; pos += partial, total += partial )
+    {
+        uint8_t *dst;
+        size_t bytes, offset;
+
+        /* bytes remaining to be writ */
+        size_t remain = size - total;
+
+        /* user wants to access this page */
+        uint32_t pgid = ( uint32_t ) ( pos / self -> pgsize ) + 1;
+
+        /* check against cached page */
+        if ( self -> pgid != pgid )
+        {
+            /* release previous page */
+            KPageRelease ( self -> pg );
+
+            /* get requested page */
+            rc = KPageFilePosGet ( self -> pf, & self -> pg, pos );
+            if ( rc != 0 )
+            {
+                self -> pg = NULL;
+                self -> pgid = 0;
+                break;
+            }
+            self -> pgid = pgid;
+        }
+
+        /* access page memory */
+        rc = KPageAccessUpdate ( self -> pg, ( void** ) & dst, & bytes );
+        if ( rc != 0 )
+            break;
+
+        /* going to copy to page at the given offset */
+        offset = ( size_t ) ( pos % bytes );
+        partial = bytes - offset;
+        assert ( bytes == self -> pgsize );
+
+        /* limit bytes to request */
+        if ( partial > remain )
+            partial = remain;
+
+        /* copy bytes */
+        memmove ( & dst [ offset ], & src [ total ], partial );
+    }
+
+    if ( total != 0 )
+    {
+        if ( start + total > self -> max_write )
+            self -> max_write = start + total;
+        * num_writ = total;
+        return 0;
+    }
+
+    * num_writ = 0;
+    return rc;
+}
+
+
+static
+rc_t CC KBufFileNoWrite ( KBufFile *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    return RC ( rcFS, rcFile, rcWriting, rcFunction, rcUnsupported );
+}
+
+static
+uint32_t CC KBufFileType ( const KBufFile * self )
+{
+    return KFileType ( self -> f );
+}
+
+static
+const KFile_vt_v1 vtKBufFileRD_v1 =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KBufFileDestroy,
+    KBufFileGetSysFile,
+    KBufFileRandomAccess,
+    KBufFileSizeRead,
+    KBufFileNoSetSize,
+    KBufFileRead,
+    KBufFileNoWrite,
+
+    /* 1.1 */
+    KBufFileType
+};
+
+static
+const KFile_vt_v1 vtKBufFileRW_v1 =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KBufFileDestroyTrunc,
+    KBufFileGetSysFile,
+    KBufFileRandomAccess,
+    KBufFileSize,
+    KBufFileSetSize,
+    KBufFileRead,
+    KBufFileWrite,
+
+    /* 1.1 */
+    KBufFileType
+};
+
+static
+rc_t KBufFileMake ( KBufFile ** bp, const KFile_vt *vt,
+    const KFile *f, uint64_t eof, const KPageFile *pf,
+    bool read_enabled, bool write_enabled, bool serial )
+{
+    rc_t rc;
+
+    KBufFile *buf = malloc ( sizeof * buf );
+    if ( buf == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KFileInit ( & buf -> dad, vt, "KBufFile", "no-name", read_enabled, write_enabled );
+        if ( rc == 0 )
+        {
+            rc = KFileAddRef ( f );
+            if ( rc == 0 )
+            {
+                buf -> max_write = serial ? 0 : eof;
+
+                buf -> f = ( KFile* ) f;
+                buf -> pf = ( KPageFile* ) pf;
+
+                buf -> pg = NULL;
+                buf -> pgsize = KPageConstSize ();
+                buf -> pgid = 0;
+
+                KBufFileSetSerialAccess ( buf, serial );
+
+                * bp = buf;
+                return 0;
+            }
+        }
+
+        free ( buf );
+    }
+
+    return rc;
+}
+
+/* MakeBufferedRead
+ *  make a read-only file buffer
+ *
+ *  "buf" [ OUT ] - return parameter for new buffered file
+ *
+ *  "original" [ IN ] - source file to be buffered. must have read access
+ *
+ *  "bsize" [ IN ] - buffer size
+ */
+LIB_EXPORT rc_t CC KBufFileMakeRead ( const KFile ** bp,
+    const KFile * original, size_t bsize )
+{
+    rc_t rc;
+
+    if ( bp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( original == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else
+        {
+            uint64_t eof;
+            bool serial = false;
+            const KPageFile *pf;
+
+            /* round bsize to next higher page */
+            size_t pgmask = KPageConstSize () - 1;
+            assert ( ( pgmask & ( pgmask + 1 ) ) == 0 );
+            bsize = ( bsize + pgmask ) & ~ pgmask;
+
+            /* check for serial access */
+            if ( KFileRandomAccess ( original ) != 0 )
+                serial = true;
+
+            /* try to get end of file */
+            rc = KFileSize ( original, & eof );
+            if ( rc != 0 )
+                serial = true;
+
+            /* create page file for read */
+            rc = KPageFileMakeRead ( & pf, original, bsize );
+            if ( rc == 0 )
+            {
+                /* create buffered file */
+                KBufFile *buf;
+                rc = KBufFileMake ( & buf, ( const KFile_vt* ) & vtKBufFileRD_v1,
+                    original, eof, pf, true, false, serial );
+                if ( rc == 0 )
+                {
+                    * bp = & buf -> dad;
+                    return 0;
+                }
+
+                KPageFileRelease ( pf );
+            }
+        }
+
+        * bp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* MakeBufferedWrite
+ *  make a writable file buffer
+ *
+ *  "buf" [ OUT ] - return parameter for new buffered file
+ *
+ *  "original" [ IN ] - source file to be buffered. must have read access
+ *
+ *  "update" [ IN ] - if true, make a read/write buffer
+ *
+ *  "bsize" [ IN ] - buffer size
+ */
+LIB_EXPORT rc_t CC KBufFileMakeWrite ( KFile ** bp,
+    KFile * original, bool update, size_t bsize )
+{
+    rc_t rc;
+
+    if ( bp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( original == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! original -> write_enabled )
+        {
+            if ( original -> read_enabled )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+            else
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        }
+        else
+        {
+            /* check for serial access */
+            bool serial = false;
+            if ( KFileRandomAccess ( original ) != 0 )
+                serial = true;
+
+            /* if read-write is not required */
+            if ( ! update )
+                return KBufWriteFileMakeWrite ( bp, original, bsize );
+
+            /* can only use page file if backing is r/w */
+            if ( ! original -> read_enabled )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcWriteonly );
+            else
+            {
+                uint64_t eof;
+                KPageFile *pf;
+
+                /* round bsize to next higher page */
+                size_t pgmask = KPageConstSize () - 1;
+                assert ( ( pgmask & ( pgmask + 1 ) ) == 0 );
+                bsize = ( bsize + pgmask ) & ~ pgmask;
+
+                /* try to get end of file */
+                rc = KFileSize ( original, & eof );
+                if ( rc != 0 )
+                    serial = true;
+
+                /* create page file for update */
+                rc = KPageFileMakeUpdate ( & pf, original, bsize, serial );
+                if ( rc == 0 )
+                {
+                    /* create buffered file */
+                    KBufFile *buf;
+                    rc = KBufFileMake ( & buf, ( const KFile_vt* ) & vtKBufFileRW_v1,
+                        original, eof, pf, update, true, serial );
+                    if ( rc == 0 )
+                    {
+                        * bp = & buf -> dad;
+                        return 0;
+                    }
+
+                    KPageFileRelease ( pf );
+                }
+            }
+        }
+
+        * bp = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/kfs/bzip.c b/libs/kfs/bzip.c
new file mode 100644
index 0000000..95f9708
--- /dev/null
+++ b/libs/kfs/bzip.c
@@ -0,0 +1,836 @@
+/*=======================================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+struct KBZipFile;
+#define KFILE_IMPL struct KBZipFile
+
+#include <kfs/extern.h>
+#include <kfs/impl.h>
+#include <kfs/bzip.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+
+#include <bzlib.h>      /* bz_stream */
+#include <assert.h>
+#include <stdlib.h>    /* malloc */
+#include <string.h>
+
+#ifdef _DEBUGGING
+#define BZIP_DEBUG(msg) DBGMSG(DBG_KFS,DBG_FLAG(DBG_KFS_BZIP), msg)
+#else
+#define BZIP_DEBUG(msg)
+#endif
+
+#define BZIP_DBGSTREAM(strm,msg)                                 \
+    BZIP_DEBUG(("%s: bz_stream (%p) %.35s\nnext_in %p "          \
+                "avail_in %6u total_in %10lu next_out %p "       \
+                "avail_out %6u total_out %10lu\n",               \
+                __func__, strm, msg,                             \
+                strm->next_in, strm->avail_in,                   \
+                (uint64_t)strm->total_in_lo32 +                  \
+                (((uint64_t)strm->total_in_hi32)<<32),           \
+                strm->next_out, strm->avail_out,                 \
+                (uint64_t)strm->total_out_lo32 +                 \
+                (((uint64_t)strm->total_out_hi32)<<32)))
+
+
+/***************************************************************************************/
+/* bzip2 File                                                                    */
+/***************************************************************************************/
+
+#define BZ2CHUNK 0x20000    /* 128K */
+
+/* ======================================================================
+ * bzip2 KFile structure
+ */
+typedef struct KBZipFile KBZipFile;
+struct KBZipFile
+{
+    KFile dad;
+    KFile *file; /* underlying KFile */
+    uint64_t filePosition;
+    uint64_t myPosition;
+    int BZ2_bzDecompressResult;
+    bz_stream strm;
+    char buff[BZ2CHUNK]; /* buffer to cache KFile data */
+    bool completed;
+};
+
+
+/* ======================================================================
+ * subroutine functions for KBZipFile methods
+ */
+static
+rc_t KBZipFileWriteInt (KBZipFile *self,
+                          int action,
+                          size_t *pnumwrit)
+{
+    bz_stream *strm;
+    unsigned avail_in;
+    rc_t rc = 0;
+
+    assert (self);
+    assert (pnumwrit);
+
+    *pnumwrit = 0;
+
+    strm = &self->strm;
+    avail_in = strm->avail_in;
+
+    /* run deflate() on input until output buffer not full, finish
+       compression if all of source has been read in */
+    do
+    {
+        uint32_t num_comp;
+        size_t written;
+        int zret;
+
+        /* compress one internal buffers worth */
+        strm->next_out = self->buff;
+        strm->avail_out = sizeof (self->buff);
+
+        zret = BZ2_bzCompress (strm, action);    /* no bad return value */
+
+        /* state not clobbered */
+        assert(zret == BZ_OK || zret == BZ_RUN_OK
+               || zret == BZ_FINISH_OK || zret == BZ_STREAM_END);
+
+        /* compression used the sizeof of the outbuffer - the amount
+         * it says it didn't use */
+        num_comp = sizeof(self->buff) - strm->avail_out;
+
+        rc = KFileWrite (self->file, self->filePosition, self->buff, num_comp, &written);
+
+        self->filePosition += written;
+
+        *pnumwrit = avail_in - strm->avail_in;
+
+    } while (strm->avail_out == 0);
+
+    assert (strm->avail_in == 0);     /* all input will be used */
+    return rc;
+}
+
+
+#if 0 /* obsolete */
+static
+int s_read(KBZipFile *self,
+           char *buffer,
+           size_t bsize,
+           size_t *num_read,
+           rc_t *rc)
+{
+    bz_stream* strm;
+    int ret;
+
+    assert(self && buffer && bsize && num_read);
+
+    strm = &self->strm;
+
+    ret = 0;
+    while (!*num_read) {
+        strm->next_out  = buffer;
+        strm->avail_out = bsize;
+        ret = BZ2_bzDecompress(strm);
+        assert(ret == BZ_OK || ret == BZ_STREAM_END);  /* state not clobbered */
+        *num_read = bsize - strm->avail_out;
+        if (strm->avail_out > 0) {
+            size_t src_read;
+            * rc = KFileRead
+                (self->file, self->filePosition, self->buff, sizeof(self->buff), &src_read);
+            if (*rc != 0)
+            {   return -70; }
+            strm->avail_in = src_read;
+            self->filePosition += src_read;
+            strm->next_in = self->buff;
+        }
+        if (!strm->avail_in)
+        {   break; }
+    }
+    return ret;
+}
+
+static rc_t old_KBZipFileReadInt ( KBZipFile * self, void * buffer, size_t bsize, size_t * num_read )
+{
+    rc_t rc = 0;
+    size_t numRead = 0;
+
+    do
+    {
+        int ret;
+        size_t have = 0;
+
+        if (self->BZ2_bzDecompressResult == BZ_STREAM_END)
+            break;
+        ret = s_read(self, (char*)buffer + numRead, bsize - numRead, &have, &rc);
+        if ( ret == -70 ) /* rc hack - known to not collide with bzlib errors */
+            return rc;
+        self->BZ2_bzDecompressResult = ret;
+        if (!have)
+            break;
+        numRead += have;
+    } while (numRead != bsize);
+
+    *num_read = numRead;
+    return rc;
+}
+#endif
+
+static
+rc_t KBZipFileReadInt (KBZipFile * self, void * buffer, size_t bsize, size_t * pnumread)
+{
+    bz_stream temp;     /* store some values here during a reinit after stream end */
+    bz_stream * strm;   /* alias for the object's bzip stream object */
+    /* size_t bleft = bsize; */
+    size_t num_read;
+    size_t tot_read = 0;
+    rc_t rc = 0;
+
+    BZIP_DEBUG (("---------------\n%s: Enter requesting bsize %lu\n", __func__, bsize));
+
+    strm = &self->strm;
+
+    for (tot_read = 0; tot_read < bsize ; )
+    {
+        char * this_out;
+        size_t src_read;
+        int zret;
+        bool bin;
+        bool bout;
+        bool end;
+
+        bin = (strm->avail_in != 0);
+
+        BZIP_DEBUG (("%s: loop start tot_read %zu\n", __func__, tot_read));
+
+        strm->next_out = this_out = (char*)buffer + tot_read;
+        strm->avail_out = (unsigned int) (bsize - tot_read);
+
+        BZIP_DEBUG(("%s: call Decompress\n", __func__));
+
+        BZIP_DBGSTREAM (strm, "before BZ2_bzDecompress");
+
+        zret = BZ2_bzDecompress(strm);
+
+        BZIP_DBGSTREAM (strm, "after BZ2_bzDecompress");
+
+        switch (zret)
+        {
+            /* unexpected error returns from zlib */
+        default:
+            BZIP_DEBUG (("%s: undocumented error return in bzip Decompress\n", __func__));
+            rc = RC (rcFS, rcFile, rcReading, rcFile, rcUnknown);
+            PLOGERR (klogErr,
+                     (klogErr, rc, "unknown error decompressing BZip2 file "
+                      "error code '$(EC)'", "EC=%d", zret));
+            return rc;
+
+            /* known unfixable errors */
+        case BZ_PARAM_ERROR:
+            BZIP_DEBUG (("%s: internal programming error - bad parameters\n", __func__));
+            rc = RC (rcFS, rcFile, rcReading, rcSelf, rcInvalid);
+            if (strm == NULL)
+                BZIP_DEBUG (("%s: strm is NULL\n", __func__));
+            else
+            {
+                if (strm->state == NULL)
+                    BZIP_DEBUG (("%s: strm->state is NULL\n", __func__));
+                if (strm->avail_out < 1)
+                    BZIP_DEBUG (("%s: strm->avail_out < 1\n", __func__));
+            }
+            LOGERR (klogInt, rc, "bzip strm structure bad");
+            return rc;
+
+        case BZ_DATA_ERROR:
+            BZIP_DEBUG (("%s: data integrity error in bzip stream\n", __func__));
+            rc = RC (rcFS, rcFile, rcReading, rcData, rcCorrupt);
+            LOGERR (klogErr, rc, "bzip stream data error");
+            return rc;
+
+        case BZ_DATA_ERROR_MAGIC:
+            BZIP_DEBUG (("%s: data magic bytes error in bzip stream\n", __func__));
+            rc = RC (rcFS, rcFile, rcReading, rcData, rcIncorrect);
+            LOGERR (klogErr, rc, "bzip stream not a bzip stream");
+            return rc;
+
+        case BZ_MEM_ERROR:
+            BZIP_DEBUG (("%s: memory exhausted during BZip decompress\n", __func__));
+            rc = RC (rcFS, rcFile, rcReading, rcMemory, rcExhausted);
+            LOGERR (klogErr, rc, "not enough memory available during bzip decompress");
+            return rc;
+
+        case BZ_STREAM_END:
+            BZIP_DEBUG (("%s: BZ_STREAM_END\n", __func__));
+            end = true;
+            num_read = strm->next_out - this_out;
+            bout = (num_read != 0);
+            BZIP_DEBUG (("%s: num_read %zu\n", __func__, num_read));
+            self->completed = true;
+            BZIP_DBGSTREAM (strm, "before BZ2_bzDecompressEnd");
+            zret = BZ2_bzDecompressEnd(strm);
+            BZIP_DBGSTREAM (strm, "after BZ2_bzDecompressEnd");
+            if (zret == BZ_OK)
+            {
+                temp = *strm;
+                memset (strm, 0, sizeof *strm);
+                zret = BZ2_bzDecompressInit (strm, 1, 0);
+                BZIP_DBGSTREAM (strm, "after BZ2_bzDecompressInit");
+                strm->next_in = temp.next_in;
+                strm->avail_in = temp.avail_in;
+/*                 strm->next_out = temp.next_out; */
+/*                 strm->avail_out = temp.avail_out; */
+                strm->total_in_lo32 = temp.total_in_lo32;
+                strm->total_in_hi32 = temp.total_in_hi32;
+                strm->total_out_lo32 = temp.total_out_lo32;
+                strm->total_out_hi32 = temp.total_out_hi32;
+                BZIP_DBGSTREAM (strm, "after restore");
+            }
+            switch (zret)
+            {
+            case BZ_OK:
+                break;
+            default:
+                return RC (rcFS, rcFile, rcReading, rcFile, rcUnknown);
+            }
+            goto read_more;
+
+        case BZ_OK:
+            BZIP_DEBUG (("%s: BZ_OK\n", __func__));
+            end = false;
+            num_read = strm->next_out - this_out;
+            bout = (num_read != 0);
+            BZIP_DEBUG (("%s: num_read %zu\n", __func__, num_read));
+
+        read_more:
+            /* if we wanted more on this read, read some more compressed */
+            tot_read += num_read;
+            if (strm->avail_in == 0)
+            {
+                rc = KFileRead (self->file, self->filePosition, self->buff, 
+                                sizeof self->buff, &src_read);
+                if (rc)
+                    return rc;
+
+                BZIP_DEBUG (("%s: KFileRead read %u\n", __func__, src_read));
+
+                if (src_read == 0)
+                {
+                    BZIP_DEBUG (("%s: end %u in %u out %u\n", __func__, end, bin, bout));
+                
+                    if (!end && bin && !bout)
+                        rc = RC (rcFS, rcFile, rcReading, rcData, rcInsufficient);
+                    goto done;
+                }
+                strm->avail_in = (unsigned int) src_read;
+                self->filePosition += src_read;
+                strm->next_in = self->buff;
+
+                /* if src_read == 0 but we are not at BZ_STREAM_END
+                 * we have an error
+                if (src_read == 0) bleft = 0;
+                */
+            }
+            break;
+        }
+        if (rc)
+            break;
+        BZIP_DEBUG (("%s: loop end tot_read %zu\n", __func__, tot_read));
+    }
+done:
+    BZIP_DEBUG (("%s: returning tot_read %zu\n\n\n", __func__, tot_read));
+    *pnumread = tot_read;
+    return rc;
+}
+
+
+static rc_t KBZipFileReadSeek (KBZipFile *self, uint64_t pos)
+{
+    rc_t rc = 0;
+    size_t num_read = 0;
+    size_t to_read;
+    uint8_t buff [ 32 * 1024 ];
+
+    for ( to_read = sizeof buff; self -> myPosition < pos; self -> myPosition += num_read )
+    {
+	if (self->myPosition + sizeof buff > pos)
+	    to_read = pos - self->myPosition;
+
+        BZIP_DEBUG(("%s: call KBZipFileReadInt to_read %zu \n",__func__));
+
+	rc = KBZipFileReadInt ( self, buff, to_read, &num_read);
+
+        BZIP_DEBUG(("%s: return KBZipFileReadInt num_read %zu \n",__func__));
+
+	if ( rc )
+	    break;
+
+	if (num_read == 0)
+	    break;
+    }
+    return rc;
+}
+
+
+/* ======================================================================
+ * virtual table methods for KBZipFile object
+ */
+
+/* Destroy
+ *  destroy file
+ */
+static rc_t CC KBZipFileDestroy (KBZipFile *self)
+{
+    rc_t rc = 0, orc = 0;
+
+    if (self)
+    {
+        if (self->file != NULL)
+        {
+            int zret = BZ_OK;
+
+            if (self->dad.write_enabled)
+            {
+                /* flush out end of compressed data */
+/*                 if (self->completed == false) */
+/*                 { */
+                    size_t ignored;
+                    bz_stream* strm = &self->strm;
+
+                    strm->avail_in = 0;
+                    strm->next_in = NULL;
+                    rc = KBZipFileWriteInt(self, BZ_FINISH, &ignored);
+/*                     assert (zret == BZ_STREAM_END); */        /* stream will be complete */
+/*                 } */
+
+                zret = BZ2_bzCompressEnd(&self->strm);   /* clean up */
+
+                self->completed = true;
+            }
+            else if (self->dad.read_enabled)
+            {
+                zret = BZ2_bzDecompressEnd (&self->strm);
+            }
+            else
+            {
+                rc = RC (rcFS, rcFile, rcDestroying, rcSelf, rcInvalid);
+                LOGERR (klogInt, orc, "corrupt object "
+                        "closing bzip file object");
+            }
+            if (zret != BZ_OK)
+            {
+                orc = RC (rcFS, rcFile, rcDestroying, rcParam, rcInvalid);
+                LOGERR (klogInt, orc, "bad parameters - coding error on "
+                        "closing bzip file object");
+                if (rc == 0)
+                    rc = orc;
+            }
+
+            orc = KFileRelease (self->file);
+            if (rc == 0)
+                rc = orc;
+        }
+        free (self);
+    }
+    return rc;
+}
+
+
+/* GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ */
+static struct KSysFile *CC KBZipFileGetSysFile (const KBZipFile *self,
+                                                uint64_t *offset)
+{
+    return NULL;
+}
+
+
+/* RandomAccess
+ *  ALMOST by definition, the file is random access
+ *
+ *  certain file types will refuse random access
+ *  these include FIFO and socket based files, but also
+ *  wrappers that require serial access ( e.g. compression )
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t CC KBZipFileRandomAccess (const KBZipFile *self)
+{
+    return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+}
+
+
+/* Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KBZipFileSize (const KBZipFile *self, uint64_t *size)
+{
+    return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+}
+
+
+/* SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KBZipFileSetSize(KBZipFile *self,
+                                uint64_t size)
+{
+    return RC ( rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported );
+}
+
+
+/* Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of file.
+ */
+static
+rc_t CC KBZipFileRead (const KBZipFile *cself,
+                              uint64_t pos,
+                              void *buffer,
+                              size_t bsize,
+                              size_t *num_read)
+{
+    KBZipFile *self = (KBZipFile*) cself;
+    rc_t rc = 0;
+
+    size_t numRead = 0, ignore;
+
+    if (self->dad.read_enabled == false)
+        return RC (rcFS, rcFile, rcReading, rcFunction, rcUnsupported);
+
+    if (!num_read)
+    {   num_read = &ignore; }
+
+    *num_read = 0;
+
+    if (!cself || !buffer)
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+
+    if (!bsize)
+    {   return 0; }
+
+    if (pos < self->myPosition)
+    {
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcInvalid );
+    }
+
+    BZIP_DEBUG(("%s: pos %lu bsize %zu\n", __func__, pos, bsize));
+    BZIP_DEBUG(("%s: myPosition %lu numRead '%zu'\n", __func__, self->myPosition, numRead));
+
+    if (pos > self->myPosition)
+    {
+        rc =  KBZipFileReadSeek (self, pos);
+        if (rc)
+            return rc;
+        if (pos != self->myPosition)
+            return 0;
+    }
+
+    rc = KBZipFileReadInt ( self, buffer, bsize, &numRead );
+    if (rc)
+        return rc;
+
+    *num_read = numRead;
+
+    self->myPosition += numRead;
+
+    BZIP_DEBUG(("%s: myPosition %lu numRead '%zu'\n", __func__, self->myPosition, numRead));
+
+    return 0;
+}
+
+
+/* Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+static
+rc_t CC KBZipFileWrite (struct KBZipFile *self,
+                        uint64_t pos,
+                        const void *buffer,
+                        size_t bsize,
+                        size_t *pnum_writ)
+{
+    rc_t rc = 0;
+
+    if (self->dad.write_enabled == false)
+        rc = RC (rcFS, rcFile, rcWriting, rcFunction, rcUnsupported);
+    else
+    {
+        *pnum_writ = 0;
+
+        if (pos != self->myPosition)
+            rc = RC (rcFS, rcFile, rcWriting, rcParam, rcIncorrect);
+
+        else
+        {
+            bz_stream * strm;
+            size_t num_writ;
+
+            strm = &self->strm;
+            strm->next_in  = (char*) buffer;
+            strm->avail_in = (unsigned int) bsize;
+
+            rc =  KBZipFileWriteInt (self, BZ_RUN, &num_writ);
+            if (rc == 0)
+            {
+                self->myPosition += num_writ;
+                *pnum_writ = num_writ;
+            }
+        }
+    }
+    return rc;
+}
+
+
+/* Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KBZipFileType (const KBZipFile *self)
+{
+    return KFileType (self->file);
+}
+
+
+/* ======================================================================
+ * virtual table for KBZipFile object
+ */
+static
+KFile_vt_v1 KBZipFile_vt_v1 =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KBZipFileDestroy,
+    KBZipFileGetSysFile,
+    KBZipFileRandomAccess,
+    KBZipFileSize,
+    KBZipFileSetSize,
+    KBZipFileRead,
+    KBZipFileWrite,
+
+    /* 1.1 */
+    KBZipFileType
+};
+
+
+/* ======================================================================
+ * Factory functions
+ */
+
+LIB_EXPORT rc_t CC KFileMakeBzip2ForRead (const struct KFile **pnew_obj,
+                                          const struct KFile *compfile)
+{
+    rc_t rc;
+
+    if ( pnew_obj == NULL || compfile == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+
+    else
+    {
+        KBZipFile *obj;
+
+        *pnew_obj = NULL;
+
+        obj = (KBZipFile*) calloc(1,sizeof(KBZipFile));
+        if (!obj)
+        {
+            rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+            LOGERR (klogErr, rc, "memory exhausted building bzip2 "
+                    "file object");
+        }
+        else
+        {
+            rc = KFileInit(&obj->dad, (const KFile_vt*) &KBZipFile_vt_v1,
+                           "KBZipFile", "no-name", true, false);
+            if (rc == 0)
+            {
+                bz_stream * strm;
+                int zret;
+
+                strm = &obj->strm;
+                zret = BZ2_bzDecompressInit (strm, 1, /* verbosity */
+                                             0); /* small */
+
+                switch (zret)
+                {
+                case BZ_OK:
+                    obj->completed = true;
+                    rc = KFileAddRef (compfile);
+                    if (rc == 0)
+                    {
+                        obj->file = (KFile *)compfile;
+                        *pnew_obj = &obj->dad;
+                        return 0;
+                    }
+                    break;
+
+                case BZ_CONFIG_ERROR:
+                    rc = RC (rcFS, rcFile, rcConstructing, rcLibrary,
+                             rcCorrupt);
+                    LOGERR (klogFatal, rc, "bzip2 library miscompiled");
+                    break;
+
+                case BZ_PARAM_ERROR:
+                    rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcInvalid);
+                    LOGERR (klogInt, rc, "coding error bzip2 file object");
+                    break;
+
+                case BZ_MEM_ERROR:
+                    rc = RC (rcFS, rcFile, rcConstructing, rcMemory,
+                             rcExhausted);
+                    LOGERR (klogErr, rc, "memory exhausted building bzip2 "
+                            "file object");
+                    break;
+
+                default:
+                    rc = RC (rcFS, rcFile, rcConstructing, rcLibrary,
+                             rcUnexpected);
+                    LOGERR (klogFatal, rc, "bzip2 library return unexpected "
+                            "error");
+                    break;
+
+                }
+            }
+        }
+        KBZipFileDestroy (obj);
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KFileMakeBzip2ForWrite (struct KFile **pnew_obj,
+                                           struct KFile *compfile)
+{
+    rc_t rc;
+
+    if ( pnew_obj == NULL || compfile == NULL )
+        rc= RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+
+    else
+    {
+        KBZipFile *obj;
+
+        *pnew_obj = NULL;
+
+        obj = (KBZipFile*)calloc(1,sizeof(KBZipFile));
+        if (obj == NULL)
+        {
+            rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+            LOGERR (klogErr, rc, "memory exhausted building bzip2 "
+                    "file object");
+        }
+        else
+        {
+            rc = KFileInit(&obj->dad, (const KFile_vt*)&KBZipFile_vt_v1,
+                           "KBZipFile", "no-name", false, true);
+            if (rc == 0)
+            {
+                bz_stream* strm;
+                int zret;
+
+                strm = &obj->strm;
+                zret = BZ2_bzCompressInit(strm, 9, /* blockSize100k */
+                                          1, /* verbosity */
+                                          30); /* workFactor */
+                switch (zret)
+                {
+                case BZ_OK:
+                    obj->completed = true;
+                    rc = KFileAddRef (compfile);
+                    if (rc == 0)
+                    {
+                        obj->file = compfile;
+                        *pnew_obj = &obj->dad;
+                        return 0;
+                    }
+                    break;
+
+                case BZ_CONFIG_ERROR:
+                    rc = RC (rcFS, rcFile, rcConstructing, rcLibrary,
+                             rcCorrupt);
+                    LOGERR (klogFatal, rc, "bzip2 library miscompiled");
+                    break;
+
+                case BZ_PARAM_ERROR:
+                    rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcInvalid);
+                    LOGERR (klogInt, rc, "coding error bzip2 file object");
+                    break;
+
+                case BZ_MEM_ERROR:
+                    rc = RC (rcFS, rcFile, rcConstructing, rcMemory,
+                             rcExhausted);
+                    LOGERR (klogErr, rc, "memory exhausted building bzip2 "
+                            "file object");
+                    break;
+
+                default:
+                    rc = RC (rcFS, rcFile, rcConstructing, rcLibrary,
+                             rcUnexpected);
+                    LOGERR (klogFatal, rc, "bzip2 library return unexpected "
+                            "error");
+                    break;
+
+                }
+            }
+        }
+        KBZipFileDestroy (obj);
+    }
+    return rc;
+}
+
+
+/* EOF */
diff --git a/libs/kfs/cacheteefile.c b/libs/kfs/cacheteefile.c
new file mode 100644
index 0000000..b4a7c0d
--- /dev/null
+++ b/libs/kfs/cacheteefile.c
@@ -0,0 +1,1833 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+#include <stdio.h>
+
+struct KCacheTeeFile;
+#define KFILE_IMPL struct KCacheTeeFile
+#include <kfs/impl.h>
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/checksum.h>
+#include <klib/time.h>
+
+#include <kfs/cacheteefile.h>
+#include <kfs/defs.h>
+#include <kproc/queue.h>
+#include <atomic32.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <endian.h>
+
+#include <stdio.h>
+
+#define NO_SCRATCH_BUFFER 1
+#define USE_BUFFER_POOL NO_SCRATCH_BUFFER && 1
+
+/* byte-order is an issue for treating these as words */
+#define USE_32BIT_BITMAP_WORDS 1
+
+
+/*--------------------------------------------------------------------------
+ layout of local file:
+ 
+ CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC MMMMMMMMMMMMMM SS BB
+
+ C ... file content in valid/invalid blocks
+ M ... bitmap of blocks bytes = ( ( ( content-size / block-size ) + 1 ) / 8 ) + 1 )
+ S ... size of content ( uint64_t ) 8 bytes
+ B ... used blocksize  ( uint32_t ) 4 bytes
+ */
+
+
+/*--------------------------------------------------------------------------
+ * KCacheTeeFile
+ */
+
+#define CACHE_TEE_DEFAULT_BLOCKSIZE ( 32 * 1024 * 4 )
+
+#define CACHE_STAT 0
+
+#if( CACHE_STAT > 0 )
+typedef struct CacheStatistic
+{
+    uint64_t requests;
+    uint64_t requested_bytes;
+    uint64_t delivered_bytes;    
+    uint64_t requests_below_32k;
+    uint64_t requests_consecutive;
+    uint64_t requests_in_first32k;
+    
+    uint64_t prev_pos;
+    uint64_t requests_same_pos;
+    uint64_t requests_same_pos_and_len;
+    size_t prev_len;
+    size_t min_len;
+    size_t max_len;
+    
+} CacheStatistic;
+
+
+static void init_cache_stat( CacheStatistic * stat )
+{
+    stat -> requests = 0;
+    stat -> requested_bytes = 0;
+    stat -> delivered_bytes = 0;    
+    stat -> requests_below_32k = 0;
+    stat -> requests_consecutive = 0;
+    stat -> requests_in_first32k = 0;
+    stat -> prev_pos = 0xFFFFFFFFFFFFFFFF;
+    stat -> requests_same_pos = 0;
+    stat -> requests_same_pos_and_len = 0;
+    stat -> prev_len = 0;
+    stat -> min_len = -1;    
+    stat -> max_len = 0;
+}
+
+static void write_cache_stat( CacheStatistic * stat, uint64_t pos, size_t requested, size_t delivered )
+{
+    ( stat -> requests )++;
+    ( stat -> requested_bytes )+= requested;
+    ( stat -> delivered_bytes )+= delivered;    
+
+    if ( requested < 0x08000 )
+        ( stat -> requests_below_32k )++;
+
+    if ( delivered < stat -> min_len )
+        stat -> min_len    = delivered;
+
+    if ( delivered > stat -> max_len )
+        stat -> max_len    = delivered;
+
+    if ( pos + requested < 0x08000 )
+        ( stat -> requests_in_first32k )++;
+        
+    if ( stat -> prev_pos != pos )
+    {
+        if ( stat -> prev_pos + stat -> prev_len == pos )
+        {
+            ( stat -> requests_consecutive )++;
+        }
+        
+        stat -> prev_pos = pos;
+        stat -> prev_len = requested;
+    }
+    else
+    {
+        if ( stat -> prev_len != requested )
+        {
+            ( stat -> requests_same_pos_and_len )++;
+            stat -> prev_len = requested;
+        }
+        ( stat -> requests_same_pos )++;
+    }
+}
+
+static void report_cache_stat( CacheStatistic * stat )
+{
+    fprintf( stderr, "\n" );
+    fprintf( stderr, "cache-stat.requests ................... %lu\n", stat -> requests );
+    fprintf( stderr, "cache-stat.requested_bytes ............ %lu\n", stat -> requested_bytes );
+    fprintf( stderr, "cache-stat.delivered_bytes ............ %lu\n", stat -> delivered_bytes );    
+    fprintf( stderr, "cache-stat.requests_below_32k ......... %lu\n", stat -> requests_below_32k );
+    fprintf( stderr, "cache-stat.requests_consecutive........ %lu\n", stat -> requests_consecutive );
+    fprintf( stderr, "cache-stat.requests_in_first32k........ %lu\n", stat -> requests_in_first32k );
+    
+    fprintf( stderr, "cache-stat.requests_same_pos .......... %lu\n", stat -> requests_same_pos );
+    fprintf( stderr, "cache-stat.requests_same_pos_and_len .. %lu\n", stat -> requests_same_pos );
+    fprintf( stderr, "cache-stat.min_len .................... %u\n", stat -> min_len );
+    fprintf( stderr, "cache-stat.max_len .................... %u\n", stat -> max_len );
+    
+    fprintf( stderr, "\n" );
+}
+
+#endif
+
+
+typedef struct KCacheTeeFile
+{
+    KFile dad;
+    const KFile * remote;                    /* the remote file we are wrapping (can be a local one too, we make no assumptions about that) */
+    KFile * local;                            /* the local cache of the remote one */
+    KDirectory * dir;                        /* we have to store a KDirectory because we need it at closing the file, where we test for promoting the cache */
+
+    uint64_t remote_size;                    /* the size of the wrapped file */
+    uint64_t local_size;                    /* the size of the local cache file ( remote_size + bitmap + tail ) */
+    uint64_t block_count;                    /* how many blocks do we need to cache the remote file ( last block may be shorter ) */
+
+#if USE_32BIT_BITMAP_WORDS
+    atomic32_t * bitmap;
+#else
+    uint8_t volatile * bitmap;                /* the bitmap of cached blocks */
+#endif
+    uint64_t bitmap_bytes;                    /* how many bytes do we need to store the bitmap */
+
+#if USE_BUFFER_POOL
+    KQueue * buffer_pool;
+#endif
+#if ! NO_SCRATCH_BUFFER
+    uint8_t * scratch_buffer;
+    uint64_t first_block_in_scratch;        /* what is the block-id of the first block in the scratch-buffer */
+    uint64_t scratch_size;                    /* how many bytes are allocated for the scratch-buffer */
+    uint64_t valid_scratch_bytes;            /* how many bytes store valid data in the scratch-buffer */
+#endif
+
+    uint32_t block_size;                    /* how big is a block ( aka 1 bit in the bitmap )*/
+
+#if( CACHE_STAT > 0 )
+    CacheStatistic stat;                    /* optional cache statistic */
+#endif
+
+    bool local_read_only;
+    char local_path [ 1 ];                    /* stores the path to the local cache, for eventual promoting at close */
+} KCacheTeeFile;
+
+
+#if USE_32BIT_BITMAP_WORDS
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define SWAP_FN(val) (val)
+#else
+#define SWAP_FN(val) \
+    (((val)>>24)&0xff) | /* move byte 3 to byte 0 */ \
+    (((val)<<8)&0xff0000) | /* move byte 1 to byte 2 */ \
+    (((val)>>8)&0xff00) | /* move byte 2 to byte 1 */ \
+    (((val)<<24)&0xff000000) /* byte 0 to byte 3 */
+#endif
+#define GEN_BIT_NR_MASK_ROW(i) SWAP_FN( 1 << ( (i) * 4 ) ), SWAP_FN( 1 << ( (i) * 4 + 1 ) ), SWAP_FN( 1 << ( (i) * 4 + 2 ) ), SWAP_FN( 1 << ( (i) * 4 + 3 ) )
+
+const uint32_t BitNr2Mask[ 32 ] =
+{
+    GEN_BIT_NR_MASK_ROW(0),
+    GEN_BIT_NR_MASK_ROW(1),
+    GEN_BIT_NR_MASK_ROW(2),
+    GEN_BIT_NR_MASK_ROW(3),
+    GEN_BIT_NR_MASK_ROW(4),
+    GEN_BIT_NR_MASK_ROW(5),
+    GEN_BIT_NR_MASK_ROW(6),
+    GEN_BIT_NR_MASK_ROW(7)
+};
+#undef SWAP_FN
+#undef GEN_BIT_NR_MASK_ROW
+
+#define IS_CACHE_BIT( CacheFile, Block_Nr ) \
+    ( ( atomic32_read ( & ( CacheFile )->bitmap[ (Block_Nr) >> 5 ] ) & BitNr2Mask[ (Block_Nr) & 31 ] ) > 0 )
+
+#define IS_BITMAP_BIT( BitMap, Block_Nr ) \
+    ( ( atomic32_read ( & ( BitMap )[ (Block_Nr) >> 5 ] ) & BitNr2Mask[ (Block_Nr) & 31 ] ) > 0 )
+
+#else
+
+const uint8_t BitNr2Mask[ 8 ] =
+{
+         /* 0  1  2  3   4   5   6    7  */
+            1, 2, 4, 8, 16, 32, 64, 128
+};
+
+#define IS_CACHE_BIT( CacheFile, Block_Nr ) ( ( CacheFile->bitmap[ (Block_Nr) >> 3 ] & BitNr2Mask[ (Block_Nr) & 7 ] ) > 0 )
+#define IS_BITMAP_BIT( BitMap, Block_Nr ) ( ( BitMap[ (Block_Nr) >> 3 ] & BitNr2Mask[ (Block_Nr) & 7 ] ) > 0 )
+
+
+#endif
+
+#define BITS_2_BYTES( BitCount ) ( ( ( BitCount ) + 7 ) >> 3 )
+#define SIZE_2_BLOCK_COUNT( Number_Of_Bytes, Block_Size ) ( ( ( Number_Of_Bytes ) + ( Block_Size ) - 1 ) / ( Block_Size ) )
+
+static rc_t calculate_local_size_from_remote_size( KCacheTeeFile *self )
+{
+    rc_t rc = 0;
+    if ( self->block_size > 0 )
+    {
+        self->block_count = SIZE_2_BLOCK_COUNT( self->remote_size, self->block_size );
+        self->bitmap_bytes = BITS_2_BYTES( self->block_count );
+        self->local_size = ( self->remote_size +
+                             self->bitmap_bytes + 
+                             sizeof self->remote_size + 
+                             sizeof self->block_size );
+    }
+    else
+    {
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcInvalid );
+        LOGERR( klogErr, rc, "div by zero attempt in calculating local size" );
+    }
+    return rc;
+}
+
+/*    factored out because it is used in:
+    create_bitmap(), IsCacheFileComplete(), GetCacheCompleteness() and Has_Cache_Zero_Blocks()
+*/
+#if USE_32BIT_BITMAP_WORDS
+static rc_t create_bitmap_buffer( atomic32_t ** bitmap, uint64_t bitmap_bytes )
+{
+    rc_t rc = 0;
+    *bitmap = calloc ( sizeof **bitmap, ( bitmap_bytes + sizeof ** bitmap - 1 ) / sizeof ** bitmap );
+    if ( *bitmap == NULL )
+    {
+        rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+        LOGERR( klogErr, rc, "init local bitmap-area" );
+    }
+    return rc;
+}
+#else
+static rc_t create_bitmap_buffer( uint8_t volatile ** bitmap, uint64_t bitmap_bytes )
+{
+    rc_t rc = 0;
+    *bitmap = calloc ( sizeof **bitmap, bitmap_bytes );
+    if ( *bitmap == NULL )
+    {
+        rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+        LOGERR( klogErr, rc, "init local bitmap-area" );
+    }
+    return rc;
+}
+#endif
+
+/*    factored out because it is used in:
+    init_new_local_file() and verify_existing_local_file()
+*/
+static rc_t create_bitmap( KCacheTeeFile *self )
+{
+    return create_bitmap_buffer( &self->bitmap, self->bitmap_bytes );
+}
+
+
+#if USE_32BIT_BITMAP_WORDS
+static bool is_bitmap_full( const atomic32_t * bitmap, uint64_t bitmap_bytes, uint64_t block_count )
+{
+    uint64_t bitmap_word;
+    const uint64_t bitmap_words_minus_one = ( ( bitmap_bytes + sizeof * bitmap - 1 ) >> 2 ) - 1;
+    for( bitmap_word = 0; bitmap_word < bitmap_words_minus_one; ++ bitmap_word )
+    {
+        if ( ~ atomic32_read ( & bitmap [ bitmap_word ] ) != 0 )
+            return false;
+    }
+
+    {
+        uint64_t block_id = ( bitmap_word << 5 );
+        while ( block_id < block_count )
+        {
+            bool block_cached = IS_BITMAP_BIT( bitmap, block_id );
+            if ( !block_cached )
+                return false;
+            ++block_id;
+        }
+    }
+    return true;
+}
+#else
+static bool is_bitmap_full( const uint8_t volatile * bitmap, uint64_t bitmap_bytes, uint64_t block_count )
+{
+    uint64_t bitmap_byte = 0;
+    while( bitmap_byte < ( bitmap_bytes - 1 ) )
+    {
+        if ( bitmap[ bitmap_byte++ ] != 0xFF )
+            return false;
+    }
+
+    {
+        uint64_t block_id = ( bitmap_byte << 3 );
+        while ( block_id < block_count )
+        {
+            bool block_cached = IS_BITMAP_BIT( bitmap, block_id );
+            if ( !block_cached )
+                return false;
+            ++block_id;
+        }
+    }
+    return true;
+}
+#endif
+
+
+static rc_t init_new_local_file( KCacheTeeFile * cf )
+{
+    rc_t rc = create_bitmap( cf );
+    if ( rc == 0 )
+    {
+        size_t written;
+        uint64_t pos = cf -> remote_size;
+
+        /* write the bitmap ( zero'd out ) into the local file */
+        rc = KFileWriteAll ( cf -> local, pos, 
+            ( const void * ) cf -> bitmap, cf -> bitmap_bytes, &written );
+        if ( rc == 0 && written != cf -> bitmap_bytes )
+        {
+            rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcInvalid );
+            LOGERR( klogErr, rc, "no full initialization of local file bitmap" );
+        }
+
+        /* write the remote-file-size into the local file ( uint64_t = 8 bytes )*/
+        if ( rc == 0 )
+        {
+            pos += cf -> bitmap_bytes;
+            rc = KFileWriteAll ( cf -> local, pos,
+                                 &cf -> remote_size, sizeof( cf -> remote_size ), &written );
+            if ( rc == 0 && written != sizeof( cf -> remote_size ) )
+            {
+                rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcInvalid );
+                LOGERR( klogErr, rc, "cannot write remote-filesize into local file" );
+            }
+        }
+
+        /* write the block-size into the local file ( size_t = 4 bytes )*/
+        if ( rc == 0 )
+        {
+            pos += sizeof( cf -> remote_size );
+            rc = KFileWriteAll ( cf -> local, pos,
+                                 &cf -> block_size, sizeof( cf -> block_size ), &written );
+            if ( rc == 0 && written != sizeof( cf -> block_size ) )
+            {
+                rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcInvalid );
+                LOGERR( klogErr, rc, "cannot write block-size into local file" );
+            }
+        }
+
+    }
+    return rc;
+}
+
+
+static rc_t try_read_uint32_t( const struct KFile * self, uint64_t pos, uint32_t * value )
+{
+    size_t num_read;
+    rc_t rc =  KFileRead( self, pos, value, sizeof *value, &num_read );
+    if ( rc == 0 )
+    {
+        if ( num_read != sizeof *value )
+            rc = SILENT_RC ( rcFS, rcFile, rcValidating, rcParam, rcInvalid );
+    }
+    return rc;
+}
+
+static rc_t try_read_uint64_t( const struct KFile * self, uint64_t pos, uint64_t * value )
+{
+    size_t num_read;
+    rc_t rc =  KFileRead( self, pos, value, sizeof *value, &num_read );
+    if ( rc == 0 )
+    {
+        if ( num_read != sizeof *value )
+            rc = SILENT_RC ( rcFS, rcFile, rcValidating, rcParam, rcInvalid );
+    }
+    return rc;
+}
+
+
+static rc_t read_block_size( const struct KFile * self, uint64_t local_size, uint32_t *block_size )
+{
+    if ( local_size >= sizeof *block_size )
+    {
+        uint64_t pos = local_size - ( sizeof *block_size );
+        int num_try = 3;
+        rc_t rc;
+
+        while ( true )
+        {
+            rc = try_read_uint32_t( self, pos, block_size );
+            
+            if ( rc == 0 && *block_size != 0 )
+                // we are done
+                return 0;
+            
+            if ( --num_try == 0 )
+                break;
+            
+            KSleep( 1 );
+        }
+        
+        if ( rc != 0 )
+            return rc;
+    }
+    
+    return RC ( rcFS, rcFile, rcValidating, rcParam, rcInvalid );
+}
+
+
+static rc_t read_content_size( const struct KFile * self, uint64_t local_size, uint64_t *content_size )
+{
+    if ( local_size >= sizeof( *content_size ) + 4 )
+    {
+        uint64_t pos = ( local_size - 4 ) - sizeof( *content_size );
+        int num_try = 3;
+        rc_t rc;
+
+        while ( true )
+        {
+            rc = try_read_uint64_t( self, pos, content_size );
+            if ( rc == 0 && *content_size != 0 )
+            {
+                if ( *content_size < local_size )
+                    return 0;
+                else
+                    return RC ( rcFS, rcFile, rcValidating, rcParam, rcInvalid );
+            }
+            
+            if ( --num_try == 0 )
+                break;
+            
+            KSleep( 1 );
+        }
+        
+        if ( rc != 0 )
+            return rc;
+    }
+    
+    return RC ( rcFS, rcFile, rcValidating, rcParam, rcInvalid );
+}
+
+
+static rc_t verify_file_structure( const uint64_t local_size, const uint32_t block_size, const uint64_t content_size,
+                                   uint64_t * block_count, /* size_t */ uint64_t * bitmap_bytes )
+{
+    rc_t rc = 0;
+    uint64_t expected_size;
+
+    *block_count = SIZE_2_BLOCK_COUNT( content_size, block_size );
+    *bitmap_bytes = BITS_2_BYTES( *block_count );
+
+    /* check if the values 'content-size' and 'block_size' result in the currect real file size */
+    expected_size = content_size + *bitmap_bytes + sizeof ( local_size ) + sizeof ( block_size );
+    if ( expected_size != local_size )
+        rc = RC ( rcFS, rcFile, rcValidating, rcParam, rcInvalid );
+    return rc;
+}
+
+
+static rc_t read_bitmap( KCacheTeeFile * cf )
+{
+    /* read the bitmap from the local file */
+    size_t num_read;
+    rc_t rc = KFileReadAll ( cf -> local, cf -> remote_size, ( void * ) cf -> bitmap, cf -> bitmap_bytes, &num_read );
+    if ( rc != 0 )
+    {
+        LOGERR( klogErr, rc, "cannot read bitmap from local file" );
+    }
+    else if ( num_read != cf -> bitmap_bytes )
+    {
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcInvalid );
+        PLOGERR( klogErr, ( klogErr, rc, "cannot read $(ls) bitmap-bytes from local file, read $(rs) instead", 
+                       "ls=%lu,rs=%lu", cf -> bitmap_bytes, num_read ));
+    }
+    return rc;
+}
+
+
+static rc_t verify_existing_local_file( KCacheTeeFile * cf, bool * fully_in_cache )
+{
+    uint64_t bitmap_bytes, content_size, block_count;
+    uint32_t block_size;
+    bool cached = false;
+    
+    rc_t rc = read_block_size ( cf -> local, cf -> local_size, &block_size );
+    /* read content-size, compare to the content-size of the remote file */
+    if ( rc == 0 )
+        rc = read_content_size ( cf -> local, cf -> local_size, &content_size );
+
+    if ( rc == 0 && content_size != cf -> remote_size )
+    {
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcInvalid );
+        PLOGERR( klogErr, ( klogErr, rc, "content-size in local file $(ls) does not match size of remote file $(rs)", 
+                           "ls=%lu,rs=%lu", content_size, cf -> remote_size ) );
+    }
+
+    /* check if the local file has the right size ( content + bitmap + content_size + block_size )*/
+    if ( rc == 0 )
+        rc = verify_file_structure ( cf -> local_size, block_size, content_size, &block_count, &bitmap_bytes );
+
+    /* check if the requested block-size equals the stored block-size */
+    if ( rc == 0 )
+    {
+        if ( cf -> block_size == 0 )
+            cf -> block_size = CACHE_TEE_DEFAULT_BLOCKSIZE;
+        if ( cf -> block_size != block_size )
+        {
+            PLOGMSG( klogWarn, ( klogWarn, "block-size in local file $(ls) does not match requested value $(rv)",
+                                "ls=%u,rv=%u", block_size, cf -> block_size ) );
+        }
+        /* use the block-size as stored in the file */
+        cf -> block_size = block_size;
+        cf -> block_count = block_count;
+        cf -> bitmap_bytes = bitmap_bytes;
+        rc = create_bitmap( cf );
+    }
+
+    /* read the bitmap into the memory ... */
+    if ( rc == 0 )
+        rc = read_bitmap( cf );
+
+    if ( rc == 0 )
+        cached = is_bitmap_full( cf -> bitmap, cf -> bitmap_bytes, cf -> block_count ); 
+        
+    if ( rc == 0 && fully_in_cache != NULL )
+        *fully_in_cache = cached;
+        
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC IsCacheFileComplete( const struct KFile * self, bool * is_complete )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcSelf, rcNull );
+    else if ( is_complete == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcParam, rcNull );
+    else
+    {
+        uint64_t local_size;
+        *is_complete = false;
+        rc = KFileSize( self, &local_size );
+        if ( rc != 0 )
+        {
+            LOGERR( klogErr, rc, "cannot detect filesize when checking if cached file is complete" );
+        }
+        /* TODO: need to do a better constant tha a magic number */
+        else if (local_size < 13)
+        {
+            rc = RC ( rcFS, rcFile, rcValidating, rcSize, rcInsufficient );
+            LOGERR( klogErr, rc, "cannot use filesize of zero when checking if cached file is complete" );
+        }
+        else
+        {
+            uint32_t block_size;
+            rc = read_block_size( self, local_size, &block_size );
+            if ( rc == 0 )
+            {
+                uint64_t content_size;
+
+                rc = read_content_size( self, local_size, &content_size );
+                /* create bitmap buffer */
+                if ( rc == 0 )
+                {
+                    uint64_t block_count;
+                    /* size_t */ uint64_t bitmap_bytes;
+                    rc = verify_file_structure( local_size, block_size, content_size, &block_count, &bitmap_bytes );
+                    if ( rc == 0 )
+                    {
+#if USE_32BIT_BITMAP_WORDS
+                        atomic32_t * bitmap = NULL;
+#else
+                        uint8_t volatile * bitmap = NULL;
+#endif
+                        rc = create_bitmap_buffer( &bitmap, bitmap_bytes );
+                        if ( rc == 0 )
+                        {
+                            size_t num_read;
+                            /* read the bitmap into the memory ... */
+                            rc = KFileReadAll ( self, content_size, ( void * ) bitmap, bitmap_bytes, &num_read );
+                            if ( rc != 0 )
+                            {
+                                LOGERR( klogErr, rc, "cannot read bitmap from local file" );
+                            }
+                            else if ( num_read != bitmap_bytes )
+                            {
+                                rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcInvalid );
+                                PLOGERR( klogErr, ( klogErr, rc, "cannot read $(ls) bitmap-bytes from local file, read $(rs) instead", 
+                                                    "ls=%lu,rs=%lu", bitmap_bytes, num_read ));
+                            }
+                        }
+                        if ( rc == 0 )
+                            *is_complete = is_bitmap_full( bitmap, bitmap_bytes, block_count );
+
+                        if ( bitmap != NULL )
+                            free( ( void * ) bitmap );
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC TruncateCacheFile( struct KFile * self )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC( rcFS, rcFile, rcResizing, rcSelf, rcNull );
+    else
+    {
+        uint64_t local_size;
+        rc = KFileSize( self, &local_size );
+        if ( rc != 0 )
+        {
+            LOGERR( klogErr, rc, "cannot detect filesize when truncating cached file" );
+        }
+        else
+        {
+            uint32_t block_size;
+            rc = read_block_size( self, local_size, &block_size );
+            if ( rc == 0 )
+            {
+                uint64_t content_size;
+                rc = read_content_size( self, local_size, &content_size );
+                if ( rc == 0 )
+                {
+                    uint64_t block_count, bitmap_bytes;
+                    rc = verify_file_structure( local_size, block_size, content_size, &block_count, &bitmap_bytes );
+
+                    /* truncate the file by setting the new (shorter) filesize */
+                    if ( rc == 0 )
+                        rc = KFileSetSize( self, content_size );
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+static bool file_exist( KDirectory * dir, const char * filename )
+{
+    uint32_t pt = KDirectoryPathType ( dir, "%s", filename );
+    return ( ( pt & ~kptAlias ) == kptFile );
+}
+
+
+static rc_t promote_cache( KCacheTeeFile * self )
+{
+    char cache_file_name [ 4096 ];
+    char temp_file_name [ 4096 ];
+    size_t num_writ;
+    rc_t rc = string_printf ( cache_file_name, sizeof cache_file_name, &num_writ, "%s.cache", self -> local_path );
+    if ( rc == 0 )
+        rc = string_printf ( temp_file_name, sizeof temp_file_name, &num_writ, "%s.cache.temp", self -> local_path );
+
+    /* (1) releaes open cache file ( windows cannot rename open files ) */
+    if ( rc == 0 )
+        rc = KFileRelease( self -> local );
+
+    /* (2) rename to temporary name */
+    if ( rc == 0 )
+    {
+        self -> local = NULL;
+        rc = KDirectoryRename ( self -> dir, true, cache_file_name, temp_file_name );
+    }
+
+    /* (3) open from temporary name */
+    if ( rc == 0 )
+        rc = KDirectoryOpenFileWrite( self -> dir, &self -> local, true, "%s", temp_file_name );
+
+    /* (4) perform truncation */
+    if ( rc == 0 )
+        rc = TruncateCacheFile( self -> local );
+    
+    /* (5) releaes open temp. cache file ( windows cannot rename open files ) */
+    if ( rc == 0 )
+        rc = KFileRelease( self -> local );
+
+    /* (6) rename to final filename ( windows cannot rename open files ) */
+    if ( rc == 0 )
+    {
+        self -> local = NULL;
+        rc = KDirectoryRename ( self -> dir, true, temp_file_name, self -> local_path );
+    }
+
+    /* (6) open from final filename */
+    if ( rc == 0 )
+        rc = KDirectoryOpenFileWrite( self -> dir, &self -> local, true, "%s", self -> local_path );
+
+    return rc;
+}
+
+
+/* Destroy
+ */
+static rc_t CC KCacheTeeFileDestroy( KCacheTeeFile * self )
+{
+#if USE_BUFFER_POOL
+    rc_t rc;
+    void * pool_page;
+#endif
+    bool already_promoted_by_other_instance = file_exist( self -> dir, self -> local_path );
+    
+#if( CACHE_STAT > 0 )
+    report_cache_stat( & self -> stat );
+#endif
+    
+    if ( !self -> local_read_only && !already_promoted_by_other_instance )
+    {
+        bool fully_in_cache;
+        rc_t rc = IsCacheFileComplete ( self -> local, &fully_in_cache );
+        if ( rc == 0 && fully_in_cache )
+        {
+            promote_cache( self );
+        }
+    }
+
+    if ( self->bitmap != NULL )
+        free( ( void * ) self->bitmap );
+#if ! NO_SCRATCH_BUFFER
+    if ( self->scratch_buffer != NULL )
+        free( self->scratch_buffer );
+#endif
+
+#if USE_BUFFER_POOL
+    while ( (rc = KQueuePop( self -> buffer_pool, &pool_page, NULL )) == 0 )
+    {
+        free( pool_page );
+    }
+    KQueueRelease( self -> buffer_pool );
+#endif
+
+    KFileRelease ( self -> remote );
+    KFileRelease ( self -> local );
+
+    if ( already_promoted_by_other_instance )
+        KDirectoryRemove ( self -> dir, true, "%s.cache", self -> local_path );
+        
+    KDirectoryRelease ( self -> dir );
+    
+    free ( self );
+    return 0;
+}
+
+
+static void set_bitmap( const KCacheTeeFile *cself, uint64_t start_block, uint64_t block_count )
+{
+#if USE_32BIT_BITMAP_WORDS
+    uint32_t old, bits;
+    const uint32_t block_bit = BitNr2Mask [ start_block & 31 ];
+
+    /* we should get rid of block count */
+    assert ( block_count == 1 );
+
+    old = atomic32_read ( & cself -> bitmap [ start_block >> 5 ] );
+    do
+    {
+        bits = old;
+        old = atomic32_test_and_set ( & cself -> bitmap [ start_block >> 5 ], ( int ) ( bits | block_bit ), ( int ) bits );
+    }
+    while ( old != bits );
+
+#else
+    uint64_t block_idx, block_nr;
+    for ( block_idx = 0, block_nr = start_block; 
+          block_idx < block_count; 
+          ++block_idx, ++block_nr )
+    {
+        cself->bitmap[ block_nr >> 3 ] |= BitNr2Mask[ block_nr & 0x07 ];
+    }
+#endif
+}
+
+
+static rc_t write_bitmap( const KCacheTeeFile *cself, uint64_t block )
+{
+    rc_t rc;
+    size_t written;
+    uint64_t pos;
+    size_t to_write;
+#if USE_32BIT_BITMAP_WORDS
+    uint32_t block_word = ( uint32_t ) ( block >> 5 );
+    uint64_t bitmap_pos = ( block_word << 2 );
+    pos = cself->remote_size + bitmap_pos;
+    to_write = 4;
+
+    // last word may go outside bitmap ranges in the file, since bitmap has 1-byte alignment in the file, but 4-byte alignment in memory
+    if (bitmap_pos + to_write > cself->bitmap_bytes)
+        to_write = cself->bitmap_bytes - bitmap_pos;
+
+    rc = KFileWriteAll( cself->local, pos, ( const void * ) &cself->bitmap[ block_word ], to_write, &written );
+#else
+    uint32_t block_byte = ( uint32_t ) ( block >> 3 );
+    pos = cself->remote_size + block_byte;
+    to_write = 1;
+    rc = KFileWriteAll( cself->local, pos, ( const void * ) &cself->bitmap[ block_byte ], to_write, &written );
+#endif
+    if ( rc != 0 )
+    {
+        PLOGERR( klogErr, ( klogErr, rc, "cannot write local-file-bitmap block $(block) at $(pos) $(to_write) bytes",
+                           "block=%lu,pos=%lu,to_write=%zu", block, pos, to_write ) );
+    }
+    return rc;
+}
+
+
+#if ! NO_SCRATCH_BUFFER
+static rc_t resize_scratch_buffer( const KCacheTeeFile *cself, uint64_t new_size )
+{
+    rc_t rc = 0;
+    KCacheTeeFile *self = ( KCacheTeeFile * )cself;
+
+    /* create scratch-buffer or resize it if needed */
+    if ( self->scratch_size == 0 )
+    {
+        self->scratch_buffer = malloc( new_size );
+        if ( self->scratch_buffer == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+        else
+            self->scratch_size = new_size;
+    }
+    else if ( self->scratch_size < new_size )
+    {
+        uint8_t * tmp = realloc( self->scratch_buffer, new_size );
+        if ( tmp == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            self->scratch_buffer = tmp;
+            self->scratch_size = new_size;
+        }
+    }
+    return rc;
+}
+#endif
+
+
+size_t check_rd_len( const KCacheTeeFile *cself, uint64_t pos, size_t bsize )
+{
+    size_t res = bsize;
+    uint64_t last_pos = pos;
+    last_pos += bsize;
+    if ( last_pos >= cself->remote_size )
+    {
+        if ( pos >= cself->remote_size )
+            res = 0;
+        else
+            res = ( cself->remote_size - pos );
+    }
+    return res;
+}
+
+static rc_t rd_remote_wr_local( const KCacheTeeFile *cself, uint64_t pos,
+                                void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc = 0;
+    if ( bsize > 0 )
+    {
+        size_t bytes_read;
+        *num_read = 0;
+        rc = KFileReadAll( cself->remote, pos, buffer, bsize, &bytes_read );
+        if ( rc != 0 || bytes_read == 0) /** try again **/
+        {
+            rc = KFileReadAll( cself->remote, pos, buffer, bsize, &bytes_read );
+            if ( rc == 0 && bytes_read == 0 )
+            { /*old behavior */
+                rc = RC ( rcFS, rcFile, rcReading, rcBuffer, rcEmpty );
+            }
+        }
+        if ( rc == 0 )
+        {
+            if ( cself->local_read_only )
+                *num_read = bytes_read;
+            else
+                rc = KFileWriteAll( cself->local, pos, buffer, bytes_read, num_read );
+        }
+    }
+    return rc;
+}
+
+
+static rc_t KCacheTeeFileRead_simple2( const KCacheTeeFile *cself, uint64_t pos,
+                                       void *buffer, size_t bsize, size_t *num_read )
+{
+    uint64_t block = pos / cself->block_size;
+    size_t   offset = pos % cself->block_size;
+    size_t   to_read_total = bsize;
+    int64_t salvage_block = -1;
+
+#if NO_SCRATCH_BUFFER
+    rc_t rc = 0;
+    uint64_t first_block_in_scratch = -1;
+    uint64_t valid_scratch_bytes = 0;
+    uint8_t * scratch_buffer;
+#if USE_BUFFER_POOL
+    if ( KQueuePop( cself -> buffer_pool, (void **)&scratch_buffer, NULL ) != 0 )
+        scratch_buffer = malloc ( cself -> block_size );
+#else
+    scratch_buffer = malloc ( cself -> block_size );
+#endif
+    if ( scratch_buffer == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcMemory, rcExhausted );
+#else
+    uint64_t first_block_in_scratch = cself -> first_block_in_scratch;
+    uint64_t valid_scratch_bytes = cself -> valid_scratch_bytes;
+    rc_t rc = resize_scratch_buffer( cself, cself->block_size );
+    uint8_t * scratch_buffer = cself -> scratch_buffer;
+#endif
+        
+    *num_read = 0;
+
+    while ( rc == 0 && to_read_total > 0 )
+    {
+        size_t to_read = cself->block_size - offset;
+        
+        if ( to_read > to_read_total )
+            to_read = to_read_total;
+
+        if ( first_block_in_scratch == block )
+        {
+            if ( valid_scratch_bytes <= offset )
+            { /** EOF in remote file and nothing to read **/
+                to_read_total = to_read = 0; 
+            }
+            else
+            { 
+                if ( to_read > valid_scratch_bytes - offset )
+                { /** EOF in remote file something left**/
+                   to_read_total = to_read = valid_scratch_bytes - offset;
+                }
+                memmove( buffer, scratch_buffer + offset, to_read );
+            }
+
+            /*** move source counters **/
+            offset += to_read;
+            block  += offset / cself->block_size;
+            offset %= cself->block_size;
+
+            /*** move output counters **/       
+            to_read_total -= to_read;
+            *num_read += to_read;
+            buffer = ((char*)buffer) + to_read;
+        }
+        else if ( IS_CACHE_BIT( cself, block ) )
+        {
+            uint64_t fpos = block * cself->block_size;
+            int64_t fbsize = cself -> remote_size - fpos;
+            size_t nread = 0;
+
+            if( fbsize > cself->block_size )
+                fbsize = cself -> block_size;
+
+            rc = KFileReadAll( cself->local, fpos, scratch_buffer, fbsize, &nread );
+            if ( rc == 0 )
+            {
+                int i;
+                uint64_t *b = ( uint64_t* )scratch_buffer;
+                first_block_in_scratch = block;
+                valid_scratch_bytes = nread;
+                
+                if ( block != salvage_block )
+                { /** check for fully space page, but don't do it in infinite loop **/
+                    for ( i = 0; i < ( nread/ sizeof( *b ) ) && b [ i]==0; i++ ) { } 
+                    if ( i == ( nread / sizeof( *b ) ) )
+                    {
+                        rc = rd_remote_wr_local( cself, block*cself->block_size, scratch_buffer, fbsize, &nread );
+                        if ( rc == 0 )
+                            salvage_block = block;
+                    }
+                    else
+                    {
+                        salvage_block = -1;
+                    }
+                }
+            }
+        }
+        else
+        {
+            uint64_t fpos = block * cself->block_size;
+            int64_t  fbsize = cself->remote_size - fpos;
+            size_t   nread = 0;
+
+            if ( fbsize > cself->block_size )
+                fbsize = cself->block_size;
+            rc = rd_remote_wr_local( cself, fpos, scratch_buffer, fbsize, &nread );
+            if ( rc == 0 )
+            {
+                first_block_in_scratch = block;
+                valid_scratch_bytes = nread;
+                if ( !cself->local_read_only )
+                {
+                    set_bitmap( cself, block, 1 );
+                    rc = write_bitmap( cself, block );
+                }
+            }
+        }
+
+    }
+
+#if NO_SCRATCH_BUFFER
+#if USE_BUFFER_POOL
+    if ( KQueuePush( cself -> buffer_pool, scratch_buffer, NULL ) != 0 )
+        free ( scratch_buffer );
+#else
+    free ( scratch_buffer );
+#endif
+#else
+    ( ( KCacheTeeFile * )cself ) -> first_block_in_scratch = first_block_in_scratch;
+    ( ( KCacheTeeFile * )cself ) -> valid_scratch_bytes = valid_scratch_bytes;
+#endif
+
+    return rc;
+}
+
+#if 0
+/**********************************************************************************************
+    try #3
+**********************************************************************************************/
+static rc_t KCacheTeeFileRead_3( const KCacheTeeFile *cself, uint64_t pos,
+                                 void * buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc = 0;
+    uint64_t i_pos = pos;
+    uint8_t * i_buffer = buffer;
+    size_t still_to_read = bsize;
+    size_t total_read = 0;
+    size_t bytes_read;
+
+    /* we have to exclude that we are requesting beyond EOF, we can do that because we know the size
+       of the file, the 'constructor' of the KCacheTeeFile has requested it and rejects construction
+       if it cannot get this size */
+    if ( ( i_pos + still_to_read ) > cself -> remote_size )
+    {
+        still_to_read = ( cself -> remote_size - i_pos );
+    }
+    
+    while ( rc == 0 && still_to_read > 0 )
+    {
+        uint64_t block = ( i_pos / cself->block_size );
+        if ( IS_CACHE_BIT( cself, block ) )
+        {
+            /* i_pos is in a cached block... */
+            size_t to_read = ( ( ( block + 1 ) * cself->block_size ) - i_pos );
+            if ( to_read > still_to_read ) to_read = still_to_read;
+            rc = KFileReadAll( cself->local, i_pos, i_buffer, to_read, &bytes_read );
+            if ( rc == 0 )
+            {
+                /* check what we read from the local file is completely empty */
+                size_t i = 0;
+                while ( i_buffer[ i ] == 0 && i < bytes_read ) { i++; }
+                if ( i == ( bytes_read + 1 ) )
+                {
+                    /* we have to read from remote because this segment is zero!
+                       this is a fix for broken cache-files */
+                    cself->bitmap[ block >> 3 ] &= ~( BitNr2Mask[ block & 0x07 ] );
+                    rc = write_bitmap( cself, block );
+                    /* do not advance the buffer, because in the loop this will be read remotely now */
+                }
+                else
+                {
+                    i_buffer += bytes_read;
+                    total_read += bytes_read;
+                    i_pos += bytes_read;
+                    still_to_read -= bytes_read;
+                }
+            }
+        }
+        else
+        {
+            /* i_pos is not in a cached block... */
+            uint64_t block_pos = ( block * cself->block_size );
+            uint64_t ofs = ( i_pos - block_pos );
+            if ( ofs == 0 && still_to_read >= cself->block_size )
+            {
+                /* read the whole block remotely, this can return less than requested if last block...
+                   and it can return 0 bytes if the http-connection times out... */
+                rc = KFileReadAll( cself->remote, i_pos, i_buffer, cself->block_size, &bytes_read );
+                if ( rc == 0 )
+                {
+                    if ( bytes_read == 0 )
+                    {
+                        still_to_read = 0;    /* terminate the loop, return as much as read so far, return rc ==0 */
+                    }
+                    else
+                    {
+                        /* write it to the local file */
+                        size_t bytes_written;
+                        rc = KFileWriteAll( cself->local, i_pos, i_buffer, bytes_read, &bytes_written );
+                        if ( rc == 0 )
+                        {
+                            if ( bytes_written != bytes_read )
+                            {
+                                rc = RC ( rcFS, rcFile, rcWriting, rcTransfer, rcTooShort );
+                            }
+                            else
+                            {
+                                /* write the bitmap */
+                                set_bitmap( cself, block, 1 );
+                                rc = write_bitmap( cself, block );
+                                if ( rc == 0 )
+                                {
+                                    i_buffer += bytes_read;
+                                    total_read += bytes_read;
+                                    i_pos += bytes_read;
+                                    still_to_read -= bytes_read;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            else
+            {
+                /* use the scratch-buffer to read the whole block, copy the smaller part that was requested */
+                if ( cself->scratch_size < cself->block_size )
+                {
+                    rc = resize_scratch_buffer( cself, cself->block_size );
+                }
+                if ( rc == 0 )
+                {
+                    /* read the whole block remotely, this can return less than requested if last block...
+                       and it can return 0 bytes if the http-connection times out... */
+                    rc = KFileReadAll( cself->remote, block_pos, cself->scratch_buffer, cself->block_size, &bytes_read );
+                    if ( rc == 0 )
+                    {
+                        if ( bytes_read == 0 )
+                        {
+                            still_to_read = 0;    /* terminate the loop, return as much as read so far, return rc ==0 */
+                        }
+                        else
+                        {
+                            /* write it to the local file */
+                            size_t bytes_written;
+                            rc = KFileWriteAll( cself->local, block_pos, cself -> scratch_buffer, bytes_read, &bytes_written );
+                            if ( rc == 0 )
+                            {
+                                if ( bytes_written != bytes_read )
+                                {
+                                    rc = RC ( rcFS, rcFile, rcWriting, rcTransfer, rcTooShort );
+                                }
+                                else
+                                {
+                                    /* write the bitmap */
+                                    set_bitmap( cself, block, 1 );
+                                    rc = write_bitmap( cself, block );
+                                    if ( rc == 0 )
+                                    {
+                                        /* here comes the difference: copy the bytes from the offset */
+                                        size_t to_copy = ( cself->block_size - ofs );
+                                        if ( to_copy > still_to_read ) to_copy = still_to_read;
+                                        memmove ( i_buffer, &( cself->scratch_buffer[ ofs ] ), to_copy );
+                                        
+                                        i_buffer += to_copy;
+                                        total_read += to_copy;
+                                        i_pos += to_copy;
+                                        still_to_read -= to_copy;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if ( rc == 0 )
+        *num_read = total_read;
+
+    return rc;
+}
+#endif
+
+/**********************************************************************************************
+    START vt-functions
+**********************************************************************************************/
+
+static struct KSysFile* KCacheTeeFileGetSysFile( const KCacheTeeFile *self, uint64_t *offset )
+{
+    * offset = 0;
+    return NULL;
+}
+
+
+static rc_t KCacheTeeFileRandomAccess( const KCacheTeeFile *self )
+{
+    return 0;
+}
+
+
+static rc_t KCacheTeeFileSize( const KCacheTeeFile *self, uint64_t *size )
+{
+    *size = self->remote_size;
+    return 0;
+}
+
+
+static rc_t KCacheTeeFileSetSize( KCacheTeeFile *self, uint64_t size )
+{
+    return RC ( rcFS, rcFile, rcUpdating, rcFile, rcReadonly );
+}
+
+static rc_t KCacheTeeFileRead( const KCacheTeeFile *cself, uint64_t pos,
+                               void *buffer, size_t bsize, size_t *num_read )
+{
+
+    /* rc_t rc = KCacheTeeFileRead_3( cself, pos, buffer, bsize, num_read ); */
+    rc_t rc = KCacheTeeFileRead_simple2( cself, pos, buffer, bsize, num_read );
+
+#if( CACHE_STAT > 0 )
+    write_cache_stat( & ( ( ( KCacheTeeFile * )cself ) -> stat ), pos, bsize, *num_read );
+#endif
+    
+    return rc;
+}
+
+
+static rc_t KCacheTeeFileWrite( KCacheTeeFile *self, uint64_t pos,
+                                const void *buffer, size_t size, size_t *num_writ )
+{
+    return RC ( rcFS, rcFile, rcUpdating, rcInterface, rcUnsupported );
+}
+
+/**********************************************************************************************
+    END vt-functions
+**********************************************************************************************/
+
+
+static KFile_vt_v1 vtKCacheTeeFile =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* start minor version 0 methods */
+    KCacheTeeFileDestroy,
+    KCacheTeeFileGetSysFile,
+    KCacheTeeFileRandomAccess,
+    KCacheTeeFileSize,
+    KCacheTeeFileSetSize,
+    KCacheTeeFileRead,
+    KCacheTeeFileWrite
+    /* end minor version 0 methods */
+};
+
+
+static rc_t make_cache_tee( struct KDirectory *self, struct KFile const **tee,
+    struct KFile const *remote, struct KFile *local, uint32_t blocksize, bool read_only, const char *path )
+{
+    rc_t rc;
+    size_t path_size = string_size ( path );
+    KCacheTeeFile * cf = malloc ( sizeof * cf + path_size + 1 );
+    if ( cf == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        cf -> dir = self;
+        string_copy( cf -> local_path, path_size + 1, path, path_size );
+        cf -> remote = remote;     /* store the file-objects but no AddRef()'s yet! */
+        cf -> local  = local;
+        cf -> block_size = ( blocksize > 0 ) ? blocksize : CACHE_TEE_DEFAULT_BLOCKSIZE;
+        cf -> bitmap = NULL;
+#if ! NO_SCRATCH_BUFFER
+        cf -> scratch_buffer = NULL;
+        cf -> scratch_size = 0;
+        cf -> first_block_in_scratch = -1;
+        cf -> valid_scratch_bytes = 0;
+#endif
+        cf -> local_read_only = read_only;
+
+#if( CACHE_STAT > 0 )
+        init_cache_stat( & cf -> stat );
+#endif
+        
+        rc = KFileSize( local, &cf -> local_size );
+        if ( rc != 0 )
+        {
+            LOGERR( klogErr, rc, "cannot detect size of local file" );
+        }
+        else
+        {
+            bool fully_in_cache = false;
+            
+            rc = KFileSize( cf -> remote, &cf -> remote_size );
+            if ( rc != 0 )
+            {
+                LOGERR( klogErr, rc, "cannot detect size of remote file" );
+            }
+            else
+            {
+                if ( cf -> local_size == 0 && ! cf -> local_read_only )
+                {
+                    /* the local file was just created... */
+                    if ( cf -> remote_size == 0 )
+                    {
+                        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcInvalid );
+                        LOGERR( klogErr, rc, "size of remote file is zero" );
+                    }
+                    else
+                    {
+                        rc = calculate_local_size_from_remote_size( cf );
+                        if ( rc == 0 )
+                        {
+                            rc = KFileSetSize ( cf -> local, cf -> local_size );
+                            if ( rc == 0 )
+                            {
+                                rc = init_new_local_file( cf );
+                            }
+                            else
+                            {
+                                PLOGERR( klogInt, ( klogInt, rc, "cannot size local file to $(l) bytes", "l=%lu", cf->local_size ) );
+                            }
+                        }
+                    }
+                }
+                else
+                    rc = verify_existing_local_file( cf, &fully_in_cache );
+            }
+
+            if ( rc == 0 && fully_in_cache && ! cf -> local_read_only )
+            {
+                /* here is the up-front-test: the cache is complete and we have write access! */
+                rc = promote_cache( cf );
+                if ( rc == 0 )
+                {
+                    *tee = cf -> local;
+                    free ( cf );
+                    return rc;  /* here we return the truncated, promoted cache as tee-file ! */
+                }
+            }
+
+            if ( rc == 0 )
+            {
+                if ( cf -> remote_size == 0 )
+                {
+                    cf -> remote_size = cf -> local_size;
+                }
+                
+                /* now we have to AddRef() everything we hang on until the final release! */
+                rc = KDirectoryAddRef ( cf -> dir );
+                if ( rc == 0 )
+                {
+                    rc = KFileAddRef( cf -> remote );
+                    if ( rc == 0 )
+                    {
+#if USE_BUFFER_POOL
+                        rc = KQueueMake( &cf -> buffer_pool, 32 );
+#endif
+                        if ( rc == 0 )
+                        {
+                            rc = KFileInit( &cf -> dad, (const union KFile_vt *)&vtKCacheTeeFile, "KCacheTeeFile", path, true, false );
+                            if ( rc == 0 )
+                            {
+                                /* the wrapper is ready to use now! */
+                                *tee = ( const KFile * ) &cf -> dad;
+                                return 0;
+                            }
+                            else
+                            {
+                                LOGERR( klogErr, rc, "cannot initialize KFile-structure" );
+#if USE_BUFFER_POOL
+                                KQueueRelease( cf -> buffer_pool );
+#endif
+                                /* TODO: check if we actually need to release cf->local here, since we never attached to it */
+                                KFileRelease( cf -> local );
+                                KFileRelease( cf -> remote );
+                                KDirectoryRelease ( cf -> dir );
+                            }
+                        }
+                        else
+                        {
+                            KFileRelease( cf -> remote );
+                            KDirectoryRelease ( cf -> dir );
+                        }
+                    }
+                    else
+                        KDirectoryRelease ( cf -> dir );
+                }
+            }
+        }
+        free ( cf );
+    }
+    return rc;
+}
+
+
+static rc_t make_read_only_cache_tee( struct KDirectory *self,
+    struct KFile const **tee, struct KFile const *remote, uint32_t blocksize, const char *path )
+{
+    const struct KFile * local;
+    rc_t rc = KDirectoryOpenFileRead( self, &local, "%s.cache", path );
+    if ( rc == 0 )
+        rc = make_cache_tee( self, tee, remote, ( struct KFile * )local, blocksize, true, path );
+    else
+    {
+        /* we cannot even open the local cache in read-only mode,
+           we give up - and return a reference to the remote file... */
+        rc = KFileAddRef( remote );
+        if ( rc == 0 )
+            *tee = remote;
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryVMakeCacheTee ( struct KDirectory *self,
+    struct KFile const **tee, struct KFile const *remote,
+    uint32_t blocksize, const char *path, va_list args )
+{
+    rc_t rc;
+    if ( tee == NULL || remote == NULL )
+        rc = RC ( rcFS, rcFile, rcAllocating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcFile, rcAllocating, rcSelf, rcNull );
+        else if ( path == NULL )
+            rc = RC ( rcFS, rcFile, rcAllocating, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcFS, rcFile, rcAllocating, rcPath, rcEmpty );
+        else
+        {
+            char full [ 4096 ];
+
+            rc = KDirectoryVResolvePath ( self, false, full, sizeof full, path, args );
+            if ( rc != 0 )
+            {
+                PLOGERR( klogErr, ( klogErr, rc, "cannot resolve path of cache file '$(path)'", 
+                        "path=%s", full ) );
+            }
+            else
+            {
+                if ( rc == 0 )
+                {
+                    /* it was possible to aquire the lock on the cache-file */
+                    struct KFile * local;
+                    rc = KDirectoryOpenFileWrite( self, &local, true, "%s.cache", full );
+                    if ( rc == 0 )
+                    {
+                        /* we have the exclusive rd/wr access to the cache file !*/
+                        rc = make_cache_tee( self, tee, remote, local, blocksize, false, full );
+                    }
+                    else if ( GetRCState( rc ) == rcNotFound )
+                    {
+                        rc = KDirectoryCreateFile( self, &local, true,
+                            0664, kcmOpen | kcmParents, "%s.cache", full );
+                        if ( rc == 0 )
+                        {
+                            /* we have the exclusive rd/wr access to the cache file !*/
+                            rc = make_cache_tee( self, tee, remote, local, blocksize, false, full );
+                        }
+                    }
+                    else
+                    {
+                        /* we do not have the exclusive rd/wr access to the cache file !*/
+                        rc = make_read_only_cache_tee( self, tee, remote, blocksize, full );
+                    }
+                }
+                else if ( GetRCState ( rc ) == rcBusy )
+                {
+                    /* it was NOT possible to aquire the lock on the cache-file */
+                    rc = make_read_only_cache_tee( self, tee, remote, blocksize, full );
+                }
+                else
+                {
+                    PLOGERR( klogErr, ( klogErr, rc, "cannot create lock-file '$(path).cache.lock'", 
+                            "path=%s", full ) );
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryMakeCacheTee ( struct KDirectory *self,
+    struct KFile const **tee, struct KFile const *remote,
+    uint32_t blocksize, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, path );
+
+    rc = KDirectoryVMakeCacheTee ( self, tee, remote, blocksize, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+#if USE_32BIT_BITMAP_WORDS
+static uint64_t count_bits_in_bitmap( const uint64_t block_count, const uint64_t bitmap_bytes, const atomic32_t * bitmap )
+{
+    uint64_t res = 0;
+    uint64_t idx;
+    for ( idx = 0; idx < block_count; ++idx )
+    {
+        if ( IS_BITMAP_BIT( bitmap, idx ) )
+            res++;
+    }
+    return res;
+}
+#else
+static uint64_t count_bits_in_bitmap( const uint64_t block_count, const uint64_t bitmap_bytes, const uint8_t volatile * bitmap )
+{
+    uint64_t res = 0;
+    uint64_t idx;
+    for ( idx = 0; idx < block_count; ++idx )
+    {
+        if ( IS_BITMAP_BIT( bitmap, idx ) )
+            res++;
+    }
+    return res;
+}
+#endif
+
+LIB_EXPORT rc_t CC GetCacheCompleteness( const struct KFile * self, float * percent, uint64_t * bytes_in_cache )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcSelf, rcNull );
+    else
+    {
+        uint64_t local_size;
+        if ( percent != NULL ) *percent = 0;
+        if ( bytes_in_cache != NULL ) *bytes_in_cache = 0;
+        rc = KFileSize( self, &local_size );
+        if ( rc != 0 )
+        {
+            LOGERR( klogErr, rc, "cannot detect filesize when checking if cached file is complete" );
+        }
+        else
+        {
+            uint32_t block_size;
+            rc = read_block_size( self, local_size, &block_size );
+            if ( rc == 0 )
+            {
+                uint64_t content_size;
+                rc = read_content_size( self, local_size, &content_size );
+                /* create bitmap buffer */
+                if ( rc == 0 )
+                {
+                    uint64_t block_count;
+                    uint64_t bitmap_bytes;
+                    rc = verify_file_structure( local_size, block_size, content_size, &block_count, &bitmap_bytes );
+                    if ( rc == 0 )
+                    {
+#if USE_32BIT_BITMAP_WORDS
+                        atomic32_t * bitmap = NULL;
+#else
+                        uint8_t volatile * bitmap = NULL;
+#endif
+                        rc = create_bitmap_buffer( &bitmap, bitmap_bytes );
+                        if ( rc == 0 )
+                        {
+                            size_t num_read;
+                            /* read the bitmap into the memory ... */
+                            rc = KFileReadAll ( self, content_size, ( void * ) bitmap, bitmap_bytes, &num_read );
+                            if ( rc != 0 )
+                            {
+                                LOGERR( klogErr, rc, "cannot read bitmap from local file" );
+                            }
+                            else if ( num_read != bitmap_bytes )
+                            {
+                                rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcInvalid );
+                                PLOGERR( klogErr, ( klogErr, rc, "cannot read $(ls) bitmap-bytes from local file, read $(rs) instead", 
+                                               "ls=%lu,rs=%lu", bitmap_bytes, num_read ));
+                            }
+                        }
+                        if ( rc == 0 )
+                        {
+                            uint64_t in_cache = count_bits_in_bitmap( block_count, bitmap_bytes, bitmap );
+                            if ( in_cache > 0 && block_count > 0 )
+                            {
+                                float res = ( float ) in_cache;
+                                res *= 100;
+                                res /= block_count;
+                                if ( percent != NULL ) ( *percent ) = res;
+                                if ( bytes_in_cache != NULL ) ( *bytes_in_cache ) = ( in_cache * block_size );
+                            }
+                        }
+                        if ( bitmap != NULL )
+                            free( ( void * ) bitmap );
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+/* -----
+ * examens the file, and reports the size of the original file ( without the cachefile-footer )
+ *
+ */
+LIB_EXPORT rc_t CC GetCacheTruncatedSize( const struct KFile * self, uint64_t * truncated_size )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcSelf, rcNull );
+    else if ( truncated_size == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcParam, rcNull );
+    else
+    {
+        uint64_t local_size;
+        *truncated_size = 0;
+        rc = KFileSize( self, &local_size );
+        if ( rc != 0 )
+        {
+            LOGERR( klogErr, rc, "cannot detect filesize when checking if cached file is complete" );
+        }
+        /* TODO: need to do a better constant tha a magic number */
+        else if (local_size < 13)
+        {
+            rc = RC ( rcFS, rcFile, rcValidating, rcSize, rcInsufficient );
+            LOGERR( klogErr, rc, "cannot use filesize of zero when checking if cached file is complete" );
+        }
+        else
+        {
+            uint32_t block_size;
+            rc = read_block_size( self, local_size, &block_size );
+            if ( rc == 0 )
+            {
+                uint64_t content_size;
+                rc = read_content_size( self, local_size, &content_size );
+                if ( rc == 0 )
+                {
+                    uint64_t block_count, bitmap_bytes;
+                    rc = verify_file_structure( local_size, block_size, content_size, &block_count, &bitmap_bytes );
+                    if ( rc == 0 )
+                    {
+                        *truncated_size = content_size;
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC Has_Cache_Zero_Blocks( const struct KFile * self, uint64_t * checked_blocks, uint64_t * empty_blocks )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcSelf, rcNull );
+    else if ( checked_blocks == NULL || empty_blocks == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcParam, rcNull );
+    else
+    {
+        uint64_t local_size;
+        *checked_blocks = 0;
+        *empty_blocks = 0;
+        rc = KFileSize( self, &local_size );
+        if ( rc != 0 )
+        {
+            LOGERR( klogErr, rc, "cannot detect filesize when checking if cached file is complete" );
+        }
+        else
+        {
+            uint32_t block_size;
+            rc = read_block_size( self, local_size, &block_size );
+            if ( rc == 0 )
+            {
+                uint64_t content_size;
+                rc = read_content_size( self, local_size, &content_size );
+                /* create bitmap buffer */
+                if ( rc == 0 )
+                {
+                    uint64_t block_count;
+                    uint64_t bitmap_bytes;
+                    rc = verify_file_structure( local_size, block_size, content_size, &block_count, &bitmap_bytes );
+                    if ( rc == 0 )
+                    {
+#if USE_32BIT_BITMAP_WORDS
+                        atomic32_t * bitmap = NULL;
+#else
+                        uint8_t volatile * bitmap = NULL;
+#endif
+                        rc = create_bitmap_buffer( &bitmap, bitmap_bytes );
+                        if ( rc == 0 )
+                        {
+                            size_t num_read;
+                            /* read the bitmap into the memory ... */
+                            rc = KFileReadAll ( self, content_size, ( void * ) bitmap, bitmap_bytes, &num_read );
+                            if ( rc != 0 )
+                            {
+                                LOGERR( klogErr, rc, "cannot read bitmap from local file" );
+                            }
+                            else if ( num_read != bitmap_bytes )
+                            {
+                                rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcInvalid );
+                                PLOGERR( klogErr, ( klogErr, rc, "cannot read $(ls) bitmap-bytes from local file, read $(rs) instead", 
+                                               "ls=%lu,rs=%lu", bitmap_bytes, num_read ));
+                            }
+                        }
+                        if ( rc == 0 )
+                        {
+                            /* loop through the bitmap for each bit set verify that the corresponding block is not zero */
+                            uint8_t * buffer = malloc( block_size );
+                            if ( buffer != NULL )
+                            {
+                                uint64_t idx;
+                                for ( idx = 0; idx < block_count && rc == 0; ++idx )
+                                {
+                                    if ( IS_BITMAP_BIT( bitmap, idx ) )
+                                    {
+                                        size_t num_read;
+                                        rc = KFileReadAll ( self, idx * block_size, buffer, block_size, &num_read );
+                                        if ( rc == 0 )
+                                        {
+                                            ( *checked_blocks )++;
+                                            if ( num_read > 0 )
+                                            {
+                                                size_t i, n;
+                                                for ( i = 0, n = 0; i < num_read; ++i )
+                                                    if ( buffer[ i ] != 0 ) n++;
+                                                if ( n == num_read ) ( * empty_blocks )++;
+                                            }
+                                        }
+                                    }
+                                }
+                                free( buffer );
+                            }
+                        }
+                        if ( bitmap != NULL )
+                            free( ( void * ) bitmap );
+                    }
+                }
+            }
+        }
+    
+    }
+    return rc;
+}
+
+
+/* -----
+ * reports in the boolean if the file is a cachetoofile and it is complete...
+ *
+ * KFile is the struct returned by KDirectoryMakeCacheTee()..
+ */
+LIB_EXPORT rc_t CC IsCacheTeeComplete( const struct KFile * self, bool * complete )
+{
+    rc_t rc = 0;
+    if ( self == NULL || complete == NULL )
+        rc = RC ( rcFS, rcFile, rcValidating, rcParam, rcNull );
+    else
+    {
+        if ( &self->vt->v1 != &vtKCacheTeeFile )
+            rc = RC ( rcFS, rcFile, rcValidating, rcParam, rcInvalid );
+        else
+        {
+            struct KCacheTeeFile * ctf = ( struct KCacheTeeFile * )self;
+            *complete = is_bitmap_full( ctf->bitmap, ctf->bitmap_bytes, ctf->block_count );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT bool CC KFileIsKCacheTeeFile( const struct KFile * self )
+{
+    return self != NULL && &self->vt->v1 == &vtKCacheTeeFile;
+}
diff --git a/libs/kfs/countfile.c b/libs/kfs/countfile.c
new file mode 100644
index 0000000..d34c5e9
--- /dev/null
+++ b/libs/kfs/countfile.c
@@ -0,0 +1,652 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/countfile.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+
+/* ======================================================================
+ * KCounterFile
+ */
+
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+#define KFILE_IMPL struct KCounterFile
+#include <kfs/impl.h>
+
+/* clear out possible macro definitions of FS and GS,
+ * which show up on Solaris/x86 when building with GCC (per sys/ucontext.h)
+ */
+#ifdef FS
+#  undef FS
+#endif
+#ifdef GS
+#  undef GS
+#endif
+
+static rc_t CC KCounterFileDestroy (KCounterFile *self);
+static struct KSysFile *CC KCounterFileGetSysFile (const KCounterFile *self,
+					    uint64_t *offset);
+static rc_t CC KCounterFileRandomAccess (const KCounterFile *self);
+static uint32_t CC KCounterFileType (const KCounterFile *self);
+static rc_t CC KCounterFileSize (const KCounterFile *self, uint64_t *size);
+static rc_t CC KCounterFileSetSize (KCounterFile *self, uint64_t size);
+static rc_t CC KCounterFileRead (const KCounterFile *self, uint64_t pos,
+                                 void *buffer, size_t bsize, size_t *num_read);
+static rc_t CC KCounterFileWrite (KCounterFile *self, uint64_t pos, const void *buffer,
+			       size_t size, size_t *num_writ);
+
+
+static const KFile_vt_v1 vtKCounterFile =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KCounterFileDestroy,
+    KCounterFileGetSysFile,
+    KCounterFileRandomAccess,
+    KCounterFileSize,
+    KCounterFileSetSize,
+    KCounterFileRead,
+    KCounterFileWrite,
+
+    /* 1.1 */
+    KCounterFileType
+};
+
+/*-----------------------------------------------------------------------
+ * KCounterFile
+ */
+typedef uint8_t lstate;
+enum elstate
+{
+    ENOTHING,
+    EASCII,
+    ECR,
+    ELF,
+    ECRLF,
+    ELFCR,
+    EBINARY
+};
+struct KCounterFile
+{
+    KFile	dad;
+    uint64_t	max_position;
+    KFile *	original;
+    uint64_t *	bytecounter; /* we do not trust reads from bytecounter */
+    uint64_t *	linecounter; /* we do not trust reads from linecounter */
+    lstate      line_state;
+    bool	size_allowed;
+    bool	force;
+};
+
+/* ----------------------------------------------------------------------
+ * KCounterFileMake
+ *  create a new file object
+ */
+
+static
+rc_t KCounterFileMake (KCounterFile ** pself,
+		       KFile * original,
+		       uint64_t * bytecounter,
+		       uint64_t * linecounter,
+                       bool force)
+{
+    uint64_t		fsize;
+    rc_t		rc;
+    KCounterFile *	self;
+
+    /* -----
+     * we can not accept any of the three pointer parameters as NULL
+     */
+    assert (pself != NULL);
+    assert (original != NULL);
+    assert (bytecounter != NULL);
+
+    /* -----
+     * get space for the object
+     */
+    self = malloc (sizeof (KCounterFile));
+    if (self == NULL)	/* allocation failed */
+    {
+	/* fail */
+	rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+    }
+    else
+    {
+	rc = KFileInit (&self->dad,			/* initialize base class */
+			(const KFile_vt*)&vtKCounterFile,/* VTable for KCounterFile */
+            "KCounterFile", "no-name",
+			original->read_enabled,
+			original->write_enabled);
+	if (rc == 0)
+	{
+            for (;;)
+            {
+                if (force) /* all sizes come from actual reads */
+                {
+                    fsize = 0;
+                    self->force = true;
+                    self->size_allowed = false;
+                }
+                else
+                {
+                    rc = KFileSize(original,&fsize);
+                    if (GetRCState(rc) == rcUnsupported)
+                    {
+                        force = true;
+                        continue;
+                    }
+                    else if (rc)
+                        break;
+                    self->force = false;
+                    self->size_allowed = true;
+                }
+                self->max_position = fsize;
+                self->original = original;
+                self->bytecounter = bytecounter;
+                self->linecounter = linecounter;
+                if (linecounter)
+                {
+                    self->line_state = ENOTHING;
+                    *linecounter = 0;
+                }
+                else
+                {
+                    self->line_state = EBINARY;
+                }
+                *bytecounter = fsize;
+                *pself = self;
+                return 0;
+            }
+	}
+	/* fail */
+	free (self);
+    }
+    *pself = NULL;
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KFileMakeCounterRead (const KFile ** self, const KFile * original,
+                                         uint64_t * bytecounter, uint64_t * linecounter,
+                                         bool force_reads)
+{
+    return KCounterFileMake ((KCounterFile **)self, (KFile*)original, bytecounter, linecounter, force_reads);
+}
+LIB_EXPORT rc_t CC KFileMakeCounterUpdate (KFile ** self, KFile * original,
+                                           uint64_t * bytecounter, uint64_t * linecounter,
+                                           bool force_reads)
+{
+    return KCounterFileMake ((KCounterFile **)self, original, bytecounter, linecounter, force_reads);
+}
+LIB_EXPORT rc_t CC KFileMakeCounterWrite (KFile ** self, KFile * original,
+                                          uint64_t * bytecounter, uint64_t * linecounter,
+                                          bool force_reads)
+{
+    return KCounterFileMake ((KCounterFile **)self, original, bytecounter, linecounter, force_reads);
+}
+
+enum ecc
+{
+    NUL,
+    SOH,
+    STX,
+    ETX,
+    EOT,
+    ENQ,
+    ACK,
+    BEL,
+    BS,
+    TAB,
+    LF,
+    VT,
+    FF,
+    CR,
+    SO,
+    SI,
+    DLE,
+    DC1,
+    DC2,
+    DC3,
+    DC4,
+    NAK,
+    SYN,
+    ETB,
+    CAN,
+    EM,
+    SUB,
+    ESC,
+    FS,
+    GS,
+    RS,
+    US,
+    DEL = 127
+};
+
+static
+void check_state (KCounterFile * self, void * _buffer, size_t size)
+{
+    uint8_t * buffer = _buffer;
+    size_t idx;
+
+    if (self->linecounter == NULL)
+        return;
+
+    if (self->line_state == EBINARY)
+        return;
+
+    for (idx = 0; idx < size; ++idx)
+    {
+        if (buffer[idx] >= DEL)
+        {
+            self->line_state = EBINARY;
+        }
+        else
+        {
+            switch (buffer[idx])
+            {
+            case NUL:
+            case SOH:
+            case STX:
+            case ETX:
+            case EOT:
+            case ENQ:
+            case ACK:
+            case BEL:
+            case BS:
+            case SO:
+            case SI:
+            case DLE:
+            case DC1:
+            case DC2:
+            case DC3:
+            case DC4:
+            case NAK:
+            case SYN:
+            case ETB:
+            case CAN:
+            case EM:
+            case SUB:
+            case ESC:
+            case FS:
+            case GS:
+            case RS:
+            case US:
+            case DEL:
+                /* leave line count mode */
+                self->line_state = EBINARY;
+                *self->linecounter = 0;
+                return;
+
+            case 128: /* not in use yet - a pseudo-EOL */
+                /* FF might go here? */
+                ++*self->linecounter;
+                self->line_state = EASCII;
+                break;
+                
+
+            case LF:
+                switch (self->line_state)
+                {
+                case ENOTHING:
+                case ELF:
+                case ECRLF:
+                case ELFCR:
+                    ++*self->linecounter;
+                case EASCII:
+                    self->line_state = ELF;
+                    break;
+                case ECR:
+                    self->line_state = ECRLF;
+                    break;
+                }
+                break;
+            case CR:
+                switch (self->line_state)
+                {
+                case ENOTHING:
+                case ECR:
+                case ECRLF:
+                case ELFCR:
+                    ++*self->linecounter;
+                case EASCII:
+                    self->line_state = ECR;
+                    break;
+                case ELF:
+                    self->line_state = ELFCR;
+                    break;
+                }
+                break;
+
+            case TAB:
+            case VT:
+            case FF:
+            default:
+                if (self->line_state != EASCII)
+                {
+                    ++*self->linecounter;
+                }
+                self->line_state = EASCII;
+                break;
+            }
+        }       
+    }
+}
+
+static
+rc_t KCounterFileSeek (KCounterFile * self, uint64_t pos)
+{
+    uint64_t	max_position;
+    rc_t	rc = 0;
+    size_t	num_read = 0;
+    size_t	to_read;
+    uint8_t	ignored[64*1024];
+
+    assert (self->max_position < pos);
+    for (max_position = self->max_position; max_position < pos; max_position += num_read)
+    {
+            to_read = (size_t)( pos - max_position );
+            if (to_read > sizeof ignored)
+                to_read = sizeof ignored;
+            rc = KFileRead (self->original, max_position, ignored, to_read, &num_read);
+            if (rc || (num_read == 0))
+                break;
+            check_state (self, ignored, num_read);
+    }
+    self->max_position = max_position;
+    *self->bytecounter = max_position;
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *
+ */
+static
+rc_t CC KCounterFileDestroy (KCounterFile *self)
+{
+    rc_t rc = 0;
+    uint64_t size;
+
+    assert (self != NULL);
+    assert (self->bytecounter != NULL);
+
+    if (self->force || ! self->size_allowed)
+    {
+        size_t	num_read = 0;
+        uint8_t	ignored[64*1024];
+        
+        size = self->max_position;
+        if (self->dad.read_enabled)
+            do
+            {
+                rc = KFileRead (self->original, size,
+                                ignored, sizeof ignored, &num_read);
+                size += num_read;
+                DBGMSG(DBG_KFS,DBG_FLAG(DBG_KFS_COUNTER),
+                       ("%s: size '%lu' num_read '%lu'\n", __func__, size, num_read));
+                if (rc != 0)
+                    break;
+                check_state (self, ignored, num_read);
+            } while (num_read != 0);
+    }
+    else
+    {
+        rc = KFileSize (self->original, &size);
+        DBGMSG(DBG_KFS,DBG_FLAG(DBG_KFS_COUNTER),
+               ("%s: lazy way size '%lu'\n", __func__, size));
+    }
+    *self->bytecounter = size;
+    if (rc == 0)
+    {
+        rc = KFileRelease (self->original);
+        free (self);
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ *
+ * bytes could not be counted if memory mapped so this is disallowed
+ */
+
+static
+struct KSysFile *CC KCounterFileGetSysFile (const KCounterFile *self, uint64_t *offset)
+{
+    /* parameters must be non-NULL */
+    assert (self != NULL);
+    assert (offset != NULL);
+
+    return NULL;
+}
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t CC KCounterFileRandomAccess (const KCounterFile *self)
+{
+    assert (self != NULL);
+    assert (self->original != NULL);
+    return KFileRandomAccess (self->original);
+}
+
+/* ----------------------------------------------------------------------
+ * Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KCounterFileType (const KCounterFile *self)
+{
+    assert (self != NULL);
+    assert (self->original != NULL);
+
+    return KFileType (self->original);
+}
+
+/* ----------------------------------------------------------------------
+ * Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KCounterFileSize (const KCounterFile *self, uint64_t *size)
+{
+    rc_t	rc;
+    uint64_t	fsize;
+
+    assert (self != NULL);
+    assert (self->original != NULL);
+    assert (size != NULL);
+
+    rc = KFileSize (self->original, &fsize);
+
+    if (rc == 0)
+    {
+	/* success: refreshing the value */
+	*size = ((KCounterFile *)self)->max_position = fsize;
+    }
+    /* pass along RC value */
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KCounterFileSetSize (KCounterFile *self, uint64_t size)
+{
+    rc_t rc;
+
+    rc = KFileSetSize (self->original, size);
+    if (rc == 0)
+	self->max_position = size;
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t CC KCounterFileRead	(const KCounterFile *cself,
+				 uint64_t pos,
+				 void *buffer,
+				 size_t bsize,
+				 size_t *num_read)
+{
+    KCounterFile * 	self;
+    uint64_t	max_position;
+    uint64_t	temp_max_position;
+    rc_t	rc;
+
+
+    /* -----
+     * self and buffer were validated as not NULL before calling here
+     *
+     * So get the KTTOCNode type: chunked files and contiguous files 
+     * are read differently.
+     */
+    assert (cself != NULL);
+    assert (cself->original != NULL);
+    assert (buffer != NULL);
+    assert (num_read != NULL);
+    assert (bsize != 0);
+
+    self = (KCounterFile*)cself;
+    max_position = cself->max_position;
+
+    if ((pos > max_position) && (! self->size_allowed))
+    {
+	rc = KCounterFileSeek (self, pos);
+	if (rc != 0)
+	    return rc;
+        /* if seek failed */
+        if (pos > self->max_position)
+        {
+            *num_read = 0;
+            return 0;
+        }
+    }
+    rc = KFileRead (self->original, pos, buffer, bsize, num_read);
+    temp_max_position = pos + *num_read;
+    if (temp_max_position > max_position)
+    {
+        uint32_t new_bytes = (uint32_t)(temp_max_position - max_position);
+
+        check_state (self, ((char *)buffer) + (*num_read) - new_bytes, new_bytes);
+
+	*self->bytecounter = self->max_position = temp_max_position;
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ * Unsupported as we now treat archives as READ ONLY
+ */
+static
+rc_t CC KCounterFileWrite (KCounterFile *self, uint64_t pos,
+			   const void *buffer, size_t bsize,
+			   size_t *num_writ)
+{
+    uint64_t	max_position;
+    uint64_t	temp_max_position;
+    rc_t	rc;
+
+
+    /* -----
+     * self and buffer were validated as not NULL before calling here
+     *
+     * So get the KTTOCNode type: chunked files and contiguous files 
+     * are read differently.
+     */
+    assert (self != NULL);
+    assert (self->original != NULL);
+    assert (buffer != NULL);
+    assert (num_writ != NULL);
+    assert (bsize != 0);
+
+    max_position = self->max_position;
+
+    if ((self->dad.read_enabled) && (pos > max_position) && (! self->size_allowed))
+    {
+	rc = KCounterFileSeek (self, pos);
+	if (rc != 0)
+	    return rc;
+    }
+
+    rc = KFileWrite (self->original, pos, buffer, bsize, num_writ);
+    temp_max_position = pos + *num_writ;
+
+    if (temp_max_position > max_position)
+    {
+	*self->bytecounter = self->max_position = temp_max_position;
+    }
+    return rc;
+}
+
+
+/* end of file countfile.c */
+
diff --git a/libs/kfs/crc32.c b/libs/kfs/crc32.c
new file mode 100644
index 0000000..f64fd32
--- /dev/null
+++ b/libs/kfs/crc32.c
@@ -0,0 +1,1771 @@
+/*=======================================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+
+#define CRC_DBG_REF(msg) DBGMSG(DBG_LEGREF,DBG_FLAG(DBG_LEGREF_CRC), msg)
+
+struct KCRC32File;
+#define KFILE_IMPL struct KCRC32File
+
+#include <kfs/crc.h>
+#include <kfs/impl.h>
+#include <klib/checksum.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <endian.h>
+#include <byteswap.h>
+
+
+/*--------------------------------------------------------------------------
+ * KCRC32SumEntry
+ *  describes an entry into a CRC32 checksum file
+ */
+typedef struct KCRC32SumEntry KCRC32SumEntry;
+struct KCRC32SumEntry
+{
+    SLNode n;
+    uint32_t crc32;
+    bool bin;
+    char path [ 1 ];
+};
+
+static
+void CC KCRC32SumEntryWhack ( SLNode *n, void *ignore )
+{
+    free ( n );
+}
+
+typedef struct KCRC32SumEntryFlushData KCRC32SumEntryFlushData;
+struct KCRC32SumEntryFlushData
+{
+    uint64_t pos;
+    KFile *f;
+    rc_t rc;
+};
+
+static
+bool CC KCRC32SumEntryFlush ( SLNode *n, void *data )
+{
+    KCRC32SumEntryFlushData *pb = data;
+    const KCRC32SumEntry *self = ( const KCRC32SumEntry* ) n;
+
+    int len;
+    size_t num_writ;
+    char line [ 4096 + 16 ];
+
+    len = snprintf ( line, sizeof line, "%08x %c%s\n",
+        self -> crc32, self -> bin ? '*' : ' ', self -> path );
+    if ( len < 0 || len >= sizeof line )
+    {
+        pb -> rc = RC ( rcFS, rcFile, rcFormatting, rcString, rcExcessive );
+        return true;
+    }
+
+    pb -> rc = KFileWrite ( pb -> f, pb -> pos, line, len, & num_writ );
+    if ( pb -> rc != 0 )
+        return true;
+
+    pb -> pos += num_writ;
+
+    if ( num_writ == ( size_t ) len )
+        return false;
+
+    pb -> rc = RC ( rcFS, rcFile, rcFormatting, rcTransfer, rcIncomplete );
+    return true;
+}
+
+static
+rc_t KCRC32SumEntryMake ( KCRC32SumEntry **ep,
+    const char *path, uint32_t crc32, bool bin )
+{
+    KCRC32SumEntry *entry = malloc ( sizeof * entry + strlen ( path ) );
+    if ( entry == NULL )
+        return RC ( rcFS, rcFile, rcUpdating, rcMemory, rcExhausted );
+
+    entry -> crc32 = crc32;
+    entry -> bin = bin;
+    strcpy ( entry -> path, path );
+
+    * ep = entry;
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KCRC32SumFmt
+ *  a formatter for reading or writing an crc32sum-style checksum file
+ */
+struct KCRC32SumFmt
+{
+    SLList entries;
+    KFile *f;
+    atomic32_t refcount;
+    uint32_t count;
+    bool read_only;
+    bool dirty;
+};
+
+/* Flush
+ */
+LIB_EXPORT rc_t CC KCRC32SumFmtFlush ( KCRC32SumFmt *self )
+{
+    if ( self != NULL && self -> dirty )
+    {
+        KCRC32SumEntryFlushData pb;
+        pb . pos = 0;
+        pb . f = self -> f;
+        pb . rc = 0;
+
+        SLListDoUntil ( & self -> entries, KCRC32SumEntryFlush, & pb );
+
+        if ( pb . rc != 0 )
+            return pb . rc;
+
+        self -> dirty = false;
+    }
+    return 0;
+}
+
+
+/* Whack
+ */
+static
+rc_t KCRC32SumFmtWhack ( KCRC32SumFmt *self )
+{
+    rc_t rc;
+
+    atomic32_set ( & self -> refcount, 1 );
+
+    rc = KCRC32SumFmtFlush ( self );
+    if ( rc == 0 )
+        rc = KFileRelease ( self -> f );
+    if ( rc != 0 )
+        return rc;
+
+    SLListWhack ( & self -> entries, KCRC32SumEntryWhack, NULL );
+    free ( self );
+    return 0;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KCRC32SumFmtAddRef ( const KCRC32SumFmt *cself )
+{
+    if ( cself != NULL )
+    {
+        CRC_DBG_REF (("%s self %p prior count %u\n", __func__, cself, atomic32_read ( & cself -> refcount ) ));
+        atomic32_inc ( & ( ( KCRC32SumFmt* ) cself ) -> refcount );
+    }
+    else
+    {
+        CRC_DBG_REF(("%s self %p\n", __func__, cself));
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KCRC32SumFmtRelease ( const KCRC32SumFmt *cself )
+{
+    KCRC32SumFmt *self = ( KCRC32SumFmt* ) cself;
+    if ( cself != NULL )
+    {
+        CRC_DBG_REF (("%s self %p prior count %u\n", __func__, cself, atomic32_read ( & cself -> refcount ) ));
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+            return KCRC32SumFmtWhack ( self );
+    }
+    else
+    {
+        CRC_DBG_REF(("%s self %p\n", __func__, cself));
+    }
+    return 0;
+}
+
+
+/* Extract
+ *  extract a single line
+ */
+static
+rc_t KCRC32SumFmtExtract ( KCRC32SumFmt *self, const char *line, size_t size )
+{
+    rc_t rc = 0;
+    KCRC32SumEntry *entry;
+
+    /* check for a DOS condition not caught by parse */
+    if ( line [ size - 1 ] == '\r' )
+    {
+        /* drop CR from line */
+        size -= 1;
+    }
+
+    /* quick validity check */
+    if ( size < 11 || line [ 8 ] != ' ' )
+        return RC ( rcFS, rcFile, rcConverting, rcFormat, rcInvalid );
+
+    /* create entry */
+    entry = malloc ( sizeof * entry + size - ( 8 /* cs */ + 2 /* sp + mode */ ) );
+    if ( entry == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        /* read checksum */
+        char *p;
+        entry -> crc32 = strtoul ( line, & p, 16 );
+        if ( ( ( const char* ) p - line ) != 8 )
+            rc = RC ( rcFS, rcFile, rcConverting, rcFormat, rcInvalid );
+
+        /* parse mode */
+        else if ( line [ 9 ] == ' ' )
+            entry -> bin = false;
+        else if ( line [ 9 ] == '*' )
+            entry -> bin = true;
+        else
+            rc = RC ( rcFS, rcFile, rcConverting, rcFormat, rcInvalid );
+
+        /* the rest is path */
+        if ( rc == 0 )
+        {
+            string_copy ( entry -> path, size, & line [ 10 ], size - 10 );
+            SLListPushTail ( & self -> entries, & entry -> n );
+            ++ self -> count;
+            return 0;
+        }
+
+        free ( entry );
+    }
+
+    return rc;
+}
+
+
+/* Parse
+ *  parse *.crc32 file
+ */
+static
+rc_t KCRC32SumFmtParse ( KCRC32SumFmt *self, const char *start, const char *stop )
+{
+    rc_t rc;
+    const char *end;
+
+    for ( rc = 0; start < stop; start = end + 1 )
+    {
+        end = string_chr ( start, stop - start, '\n' );
+        if ( end == NULL )
+            end = stop;
+
+        /* allow '#' comments and blank lines */
+        if ( ( end - start ) == 0 )
+            continue;
+        if ( start [ 0 ] == '#' )
+            continue;
+
+        /* line must have minimum length */
+        if ( ( end - start ) < ( 8 /* cs */ + 2 /* sp + mode */ + 1 /* path */ ) )
+        {
+            /* check for empty line ending in CR-LF */
+            if ( end [ -1 ] == '\r' && ( end - start ) == 1 )
+                continue;
+
+            /* other stuff is garbage */
+            rc = RC ( rcFS, rcFile, rcParsing, rcData, rcInsufficient );
+            break;
+        }
+
+        /* extract entry */
+        rc = KCRC32SumFmtExtract ( self, start, end - start );
+        if ( rc != 0 )
+            break;
+    }
+
+    return rc;
+}
+
+
+/* Populate
+ *  reads all lines of input from *.crc32 file
+ */
+static
+rc_t KCRC32SumFmtPopulate ( KCRC32SumFmt *self, const KFile *in )
+{
+    uint64_t eof;
+    rc_t rc = KFileSize ( in, & eof );
+    if ( rc == 0 )
+    {
+        char *buff = malloc ( ( size_t ) eof );
+        if ( buff == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            size_t num_read, total;
+            for ( total = 0; total < ( size_t ) eof; total += num_read )
+            {
+                rc = KFileRead ( in, total,
+                    & buff [ total ], ( size_t ) eof - total, & num_read );
+                if ( rc != 0 )
+                    break;
+                if ( num_read == 0 )
+                {
+                    rc = RC ( rcFS, rcFile, rcReading, rcTransfer, rcIncomplete );
+                    break;
+                }
+            }
+
+            if ( rc == 0 )
+                rc = KCRC32SumFmtParse ( self, buff, buff + total );
+
+            free ( buff );
+        }
+    }
+
+    return rc;
+}
+
+
+/* Make
+ *  creates a formatted accessor to textual checksum file
+ */
+LIB_EXPORT rc_t CC KCRC32SumFmtMakeRead ( const KCRC32SumFmt **fp, const KFile *in )
+{
+    rc_t rc;
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( in == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! in -> read_enabled )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        else
+        {
+            KCRC32SumFmt *f = malloc ( sizeof * f );
+            if ( f == NULL )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                SLListInit ( & f -> entries );
+                atomic32_set ( & f -> refcount, 1 );
+                f -> f = NULL;
+                f -> count = 0;
+                f -> read_only = true;
+                f -> dirty = false;
+
+                rc = KCRC32SumFmtPopulate ( f, in );
+                if ( rc == 0 )
+                {
+                    f -> f = ( KFile* ) in;
+                    * fp = f;
+                    return 0;
+                }
+                
+                KCRC32SumFmtWhack ( f );
+            }
+        }
+
+        * fp = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KCRC32SumFmtMakeUpdate ( KCRC32SumFmt **fp, KFile *out )
+{
+    rc_t rc;
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( out == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! out -> write_enabled )
+        {
+            if ( out -> read_enabled )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+            else
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        }
+        else
+        {
+            KCRC32SumFmt *f = malloc ( sizeof * f );
+            if ( f == NULL )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                SLListInit ( & f -> entries );
+                atomic32_set ( & f -> refcount, 1 );
+                f -> f = NULL;
+                f -> count = 0;
+                f -> read_only = false;
+                f -> dirty = false;
+
+                rc = 0;
+                if ( out -> read_enabled )
+                    rc = KCRC32SumFmtPopulate ( f, out );
+                if ( rc == 0 )
+                {
+                    f -> f = out;
+                    * fp = f;
+                    return 0;
+                }
+                
+                KCRC32SumFmtWhack ( f );
+            }
+        }
+
+        * fp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* Count
+ *  return the number of checksums in file
+ */
+LIB_EXPORT rc_t CC KCRC32SumFmtCount ( const KCRC32SumFmt *self, uint32_t *count )
+{
+    rc_t rc;
+    if ( count == NULL )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * count = self -> count;
+            return 0;
+        }
+
+        * count = 0;
+    }
+    return rc;
+}
+
+
+/* Get
+ *  retrieve an indexed checksum line
+ *
+ *  "idx" [ IN ] - zero-based index of checksum to access
+ *
+ *  "path" [ OUT ] and "size" [ IN ] - return buffer for file path
+ *
+ *  "crc32" [ OUT ] - return parameter for the checksum
+ *
+ *  "bin" [ OUT, NULL OKAY ] - true if fopen mode used to
+ *  calculate "digest" was binary, false if text. pertinent if
+ *  digest was calculated using DOS text mode.
+ */
+LIB_EXPORT rc_t CC KCRC32SumFmtGet ( const KCRC32SumFmt *self, uint32_t idx,
+    char *path, size_t size, uint32_t *crc32, bool *bin )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+    else if ( idx >= self -> count )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcId, rcNotFound );
+    else
+    {
+        uint32_t i;
+        const KCRC32SumEntry *entry = ( const KCRC32SumEntry* )
+            SLListHead ( & self -> entries );
+        for ( i = 0; entry != NULL && i < idx; ++ i )
+        {
+            entry = ( const KCRC32SumEntry* )
+                SLNodeNext ( & entry -> n );
+        }
+
+        if ( entry == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcId, rcNotFound );
+        else if ( path == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcBuffer, rcNull );
+        else if ( crc32 == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+        else
+        {
+            /* copy everything out */
+            * crc32 = entry -> crc32;
+            if ( bin != NULL )
+                * bin = entry -> bin;
+
+            /* return success if buffer large enough */
+            if ( string_copy_measure ( path, size, entry -> path ) < size )
+                return 0;
+
+            rc = RC ( rcFS, rcFile, rcAccessing, rcBuffer, rcInsufficient );
+        }
+    }
+
+    if ( path != NULL && size != 0 )
+        path [ 0 ] = 0;
+
+    if ( crc32 != NULL )
+        * crc32 = 0;
+
+    if ( bin != NULL )
+        * bin = false;
+
+    return rc;
+}
+
+
+/* Find
+ *  retrieve checksum line by path
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  "crc32" [ OUT ] - return parameter for the checksum
+ *
+ *  "bin" [ OUT, NULL OKAY ] - true if fopen mode used to
+ *  calculate "digest" was binary, false if text. pertinent if
+ *  digest was calculated using DOS text mode.
+ */
+LIB_EXPORT rc_t CC KCRC32SumFmtFind ( const KCRC32SumFmt *self,
+    const char *path, uint32_t *crc32, bool *bin )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+    else if ( path == NULL )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcPath, rcNull );
+    else if ( path [ 0 ] == 0 )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcPath, rcEmpty );
+    else
+    {
+        const KCRC32SumEntry *entry = ( const KCRC32SumEntry* )
+            SLListHead ( & self -> entries );
+        while ( entry != NULL )
+        {
+            if ( strcmp ( path, entry -> path ) == 0 )
+                break;
+
+            entry = ( const KCRC32SumEntry* )
+                SLNodeNext ( & entry -> n );
+        }
+
+        if ( entry == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcPath, rcNotFound );
+        else if ( crc32 == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+        else
+        {
+            /* copy everything out */
+            *crc32 = entry -> crc32;
+            if ( bin != NULL )
+                * bin = entry -> bin;
+
+            return 0;
+        }
+    }
+
+    if ( crc32 != NULL )
+        * crc32 = 0;
+
+    if ( bin != NULL )
+        * bin = false;
+
+    return rc;
+}
+
+
+/* Delete
+ *  remove an existing line
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  returns rcNotFound if not present
+ */
+LIB_EXPORT rc_t CC KCRC32SumFmtDelete ( KCRC32SumFmt *self, const char *path )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcRemoving, rcSelf, rcNull );
+    else if ( path == NULL )
+        rc = RC ( rcFS, rcFile, rcRemoving, rcPath, rcNull );
+    else if ( path [ 0 ] == 0 )
+        rc = RC ( rcFS, rcFile, rcRemoving, rcPath, rcEmpty );
+    else
+    {
+        KCRC32SumEntry *entry = ( KCRC32SumEntry* )
+            SLListHead ( & self -> entries );
+        while ( entry != NULL )
+        {
+            if ( strcmp ( path, entry -> path ) == 0 )
+                break;
+
+            entry = ( KCRC32SumEntry* )
+                SLNodeNext ( & entry -> n );
+        }
+
+        if ( entry == NULL )
+            rc = RC ( rcFS, rcFile, rcRemoving, rcPath, rcNotFound );
+        else
+        {
+            /* pop entry from list */
+            SLListUnlink ( & self -> entries, & entry -> n );
+
+            /* delete entry */
+            KCRC32SumEntryWhack ( & entry -> n, NULL );
+
+            /* mark the modification */
+            self -> dirty = true;
+            assert ( self -> count > 0 );
+            -- self -> count;
+
+            return 0;
+        }
+    }
+
+    return rc;
+}
+
+
+/* Update
+ *  add a checksum line to file or update an existing line
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  "crc32" [ IN ] - calculated checksum
+ *
+ *  "bin" [ IN ] - true if checksum was calculated on all bytes
+ *  in file, false if fopen mode used to read file was text.
+ */
+LIB_EXPORT rc_t CC KCRC32SumFmtUpdate ( KCRC32SumFmt *self, const char *path, uint32_t crc32, bool bin )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcSelf, rcNull );
+    else if ( path == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcNull );
+    else if ( path [ 0 ] == 0 )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcEmpty );
+    else
+    {
+        /* create an entry */
+        KCRC32SumEntry *entry;
+        rc = KCRC32SumEntryMake ( & entry, path, crc32, bin );
+        if ( rc == 0 )
+        {
+            /* scan for existing entry */
+            KCRC32SumEntry *exist = ( KCRC32SumEntry* )
+                SLListHead ( & self -> entries );
+            while ( exist != NULL )
+            {
+                if ( strcmp ( exist -> path, entry -> path ) == 0 )
+                    break;
+                exist = ( KCRC32SumEntry* )
+                    SLNodeNext ( & exist -> n );
+            }
+
+            /* if new entry, insert */
+            if ( exist == NULL )
+            {
+                SLListPushTail ( & self -> entries, & entry -> n );
+                self -> dirty = true;
+                ++ self -> count;
+            }
+
+            /* if existing, perform update */
+            else
+            {
+                if ( exist -> crc32 != entry -> crc32 || exist -> bin != entry -> bin )
+                {
+                    exist -> crc32 = entry -> crc32;
+                    exist -> bin = entry -> bin;
+                    self -> dirty = true;
+                }
+                KCRC32SumEntryWhack ( & entry -> n, NULL );
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* Rename
+ * Rename the checksum line to reflect a file name change but no content change.
+ *
+ *  "newpath" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file's new name
+ *
+ *  "oldpath" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file's old name
+ *
+ */
+LIB_EXPORT rc_t CC KCRC32SumFmtRename ( KCRC32SumFmt *self, const char *oldpath, const char *newpath )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcSelf, rcNull );
+    else if ( newpath == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcNull );
+    else if ( newpath [ 0 ] == 0 )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcEmpty );
+    else if ( oldpath == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcNull );
+    else if ( oldpath [ 0 ] == 0 )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcEmpty );
+    else
+    {
+        bool bin;
+        uint32_t crc32;
+
+        rc = KCRC32SumFmtFind ( self, oldpath, & crc32, & bin );
+        if ( rc == 0 )
+            rc = KCRC32SumFmtUpdate ( self, newpath, crc32, bin );
+        if ( rc == 0 )
+            rc = KCRC32SumFmtDelete ( self, oldpath );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * CRC32 KFile extensions
+ */
+typedef enum KCRC32FileUnionType
+{
+    KCRC32FileTypeRead,
+    KCRC32FileTypeWrite
+} KCRC32FileUnionType;
+
+struct KCRC32File
+{
+    KFile dad;
+
+    /* this is position of next byte to read or write
+       relative to the CRC not actual read/write */
+    uint64_t position;
+    KFile *file;
+    KCRC32SumFmt *fmt;
+    uint32_t crc32;
+    KCRC32FileUnionType type;
+    union
+    {
+        struct
+        {
+            rc_t rc;
+            uint32_t crc32;
+            bool eof;
+        } rd;
+
+        struct
+        {
+            /* maximum position written to "file" */
+            uint64_t max_position;
+
+            /* saved information for a transaction */
+            uint64_t tposition;
+            uint32_t crc32;
+
+            /* is transaction open */
+            bool topen;
+
+            /* path to file for crc32 fmt */
+            char path [ 1 ];
+        } wr;
+
+    } u;
+};
+
+/* Whack
+ */
+static
+rc_t CC KCRC32FileWhackRead ( KCRC32File *self )
+{
+    rc_t rc;
+
+    atomic32_set ( & self -> dad . refcount, 1 );
+
+    rc = KFileRelease ( self -> file );
+    if ( rc == 0 )
+        free ( self );
+
+    return rc;
+}
+
+static
+rc_t CC KCRC32FileWhackWrite ( KCRC32File *self )
+{
+    rc_t rc;
+
+    atomic32_set ( & self -> dad . refcount, 1 );
+
+    /* if destination file has been written farther
+       than our concept of eof, truncate */
+    if ( self -> u . wr . max_position > self -> position )
+    {
+        rc = KFileSetSize ( self -> file, self -> position );
+        if ( rc != 0 )
+            return rc;
+        self -> u . wr . max_position = self -> position;
+    }
+
+    rc = KFileRelease ( self -> file );
+    if ( rc == 0 )
+    {
+        KCRC32SumFmtUpdate ( self -> fmt, self -> u . wr . path, self -> crc32, true );
+        KCRC32SumFmtRelease ( self -> fmt );
+        free ( self );
+    }
+
+    return rc;
+}
+
+static const char CRCTAG [8] = "CRC32CTX";
+static const char ENDIANTAG [4] =
+{ 
+    '0' + (char)((__BYTE_ORDER/1000)%10),
+    '0' + (char)((__BYTE_ORDER/100)%10),
+    '0' + (char)((__BYTE_ORDER/10)%10),
+    '0' + (char)((__BYTE_ORDER/1)%10)
+};
+static const char ENDIANSWAPTAG [4] =
+{ 
+    '0' + (char)((__BYTE_ORDER/1)%10),
+    '0' + (char)((__BYTE_ORDER/10)%10),
+    '0' + (char)((__BYTE_ORDER/100)%10),
+    '0' + (char)((__BYTE_ORDER/1000)%10)
+};
+
+static
+rc_t CC KCRC32FileWrite ( KCRC32File *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ );
+
+static
+rc_t CC KCRC32FileWhackAppend ( KCRC32File *self )
+{
+    rc_t rc;
+
+    /* if the file is empty, just whack it */
+    if ( self -> position == 0 )
+        return KCRC32FileWhackWrite ( self );
+
+    /* begin transaction will save current state */
+    rc = KCRC32FileBeginTransaction ( self );
+    if ( rc == 0 )
+    {
+        size_t num_writ;
+
+        /* create a closing tag with current checksum */
+        uint8_t closer [ sizeof CRCTAG + sizeof ENDIANTAG + sizeof self -> crc32 ];
+        memmove ( closer, CRCTAG, sizeof CRCTAG );
+        memmove ( & closer [ sizeof CRCTAG ], ENDIANTAG, sizeof ENDIANTAG );
+        memmove ( & closer [ sizeof CRCTAG + sizeof ENDIANTAG ], & self -> crc32, sizeof self -> crc32 );
+            
+        /* append this to the file */
+        rc = KCRC32FileWrite ( self, self -> position, closer, sizeof closer, & num_writ );
+        if ( rc == 0 )
+        {
+            /* test transfer */
+            if ( num_writ != sizeof closer )
+                rc = RC ( rcFS, rcFile, rcDestroying, rcTransfer, rcIncomplete );
+            else
+            {
+                /* complete operation */
+                rc = KCRC32FileWhackWrite ( self );
+                if ( rc == 0 )
+                    return rc;
+            }
+        }
+
+        /* restore entry state */
+        KCRC32FileRevert ( self );
+    }
+
+    /* bail on errors */
+    atomic32_set ( & self -> dad . refcount, 1 );
+    return rc;
+}
+
+
+/* GetSysFile
+ */
+static
+struct KSysFile *CC KCRC32FileGetSysFile ( const KCRC32File *self, uint64_t *offset )
+{
+    if ( offset != NULL )
+        * offset = 0;
+    return NULL;
+}
+
+
+/* RandomAccess
+ */
+static
+rc_t CC KCRC32FileRandomAccessRead ( const KCRC32File *self )
+{
+    return KFileRandomAccess ( self -> file );
+}
+
+static
+rc_t CC KCRC32FileRandomAccessWrite ( const KCRC32File *self )
+{
+    return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+}
+
+
+/* Type
+ */
+static
+uint32_t CC KCRC32FileType ( const KCRC32File *self )
+{
+    return KFileType ( self -> file );
+}
+
+
+/* Size
+ */
+static
+rc_t CC KCRC32FileSize ( const KCRC32File *self, uint64_t *size )
+{
+    return KFileSize ( self -> file, size );
+}
+
+static
+rc_t CC KCRC32FileSizeAppend ( const KCRC32File *self, uint64_t *size )
+{
+    *size = self -> position;
+    return 0;
+}
+
+
+/* SetSize
+ *  the read-only version should never be called, because
+ *  the message dispatch checks for write enable
+ *
+ *  the writable version disallows all but a total reset
+ *  and setting size to current size
+ */
+static
+rc_t CC KCRC32FileSetSizeRead ( KCRC32File *self, uint64_t size )
+{
+    return RC ( rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported );
+}
+
+static
+rc_t CC KCRC32FileSetSizeWrite ( KCRC32File *self, uint64_t size )
+{
+    rc_t rc;
+
+    /* allow a noop */
+    if ( size == self -> position )
+        return 0;
+
+    /* disallow if not a reset */
+    if ( size != 0 )
+        return RC ( rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported );
+
+    /* ensure we're not in a transaction */
+    if ( self -> u . wr . topen )
+        return RC ( rcFS, rcFile, rcUpdating, rcFile, rcBusy );
+
+    /* go ahead and try to truncate destination */
+    rc = KFileSetSize ( self -> file, 0 );
+    if ( rc == 0 )
+    {
+        /* reset our internal state */
+        self -> position = self -> u . wr . max_position = 0;
+        self -> crc32 = 0;
+    }
+
+    return rc;
+}
+
+
+/* Finish
+ *  returns the results of crc comparison
+ */
+static
+rc_t KCRC32FileFinish ( KCRC32File *self )
+{
+    if ( ! self -> u . rd . eof )
+    {
+        if ( self -> crc32 != self -> u. rd . crc32 )
+            self -> u . rd . rc = RC ( rcFS, rcFile, rcReading, rcFile, rcCorrupt );
+        self -> u . rd . eof = true;
+    }
+
+    return self -> u . rd . rc;
+}
+
+
+/* Seek
+ *  used to scan ahead in a read-only file
+ *  "self" is modifiable, but file is read-only
+ */
+static
+rc_t KCRC32FileSeek ( KCRC32File *self, uint64_t pos )
+{
+    rc_t rc;
+    size_t num_read;
+    uint8_t buff [ 32 * 1024 ];
+
+    /* should never be called by writable file */
+    assert ( ! self -> dad . write_enabled );
+
+    /* seek to "pos" */
+    for ( rc = 0; self -> position < pos; self -> position += num_read )
+    {
+        /* maximum to read in this buffer */
+        size_t to_read = sizeof buff;
+        if ( self -> position + sizeof buff > pos )
+            to_read = ( size_t ) ( pos - self -> position );
+
+        /* read bytes */
+        rc = KFileRead ( self -> file, self -> position, buff, to_read, & num_read );
+        if ( rc != 0 )
+            break;
+
+        /* detect EOF */
+        if ( num_read == 0 )
+        {
+            switch (self->type)
+            {
+            case KCRC32FileTypeRead:
+                rc = KCRC32FileFinish ( self );
+                break;
+            case KCRC32FileTypeWrite:
+                if ( self -> fmt != NULL)
+                {
+                    KCRC32SumFmtUpdate ( self -> fmt, self -> u . wr . path, self -> crc32, true );
+                    KCRC32SumFmtRelease ( self -> fmt );
+                    self -> fmt = NULL;
+                }
+                break;
+            }
+            break;
+        }
+        
+        /* append bytes */
+        self -> crc32 = CRC32 ( self -> crc32, buff, num_read );
+    }
+    
+    return rc;
+}
+
+/* Read
+ *  read-only version allows random access reads
+ */
+static
+rc_t CC KCRC32FileRead ( const KCRC32File *cself,
+    uint64_t pos, void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+    size_t total = 0;
+    uint64_t end = pos + bsize;
+    KCRC32File *self = ( KCRC32File* ) cself;
+
+    * num_read = 0;
+
+    /* no buffer means no bytes */
+    if ( bsize == 0 )
+        return 0;
+
+    /* test for starting a read before the current marker
+       meaning that it does not figure in to the checksum */
+    if ( self -> position > pos )
+    {
+        /* test for entire buffer being before marker */
+        if ( end <= self -> position )
+            return KFileRead ( self -> file, pos, buffer, bsize, num_read );
+
+        /* perform a partial read without affecting checksum */
+        rc = KFileRead ( self -> file, pos, buffer, ( size_t )( self -> position - pos ), num_read );
+        if ( rc != 0 )
+            return rc;
+
+        /* adjust as if a new read request, remembering number read so far */
+        pos += * num_read;
+        total = * num_read;
+        buffer = & ( ( uint8_t* ) buffer ) [ * num_read ];
+
+        /* in case num_read != all bytes up to marker */
+        if ( pos != self -> position )
+            return 0;
+    }
+
+    /* test for hole between current marker and desired start */
+    else if ( self -> position < pos )
+    {
+        /* scan ahead, discarding */
+        rc = KCRC32FileSeek ( self, pos );
+        if ( rc != 0 || self -> position < pos )
+            return rc;
+    }
+
+    /* no hole - and still some space in buffer */
+    assert ( self -> position == pos );
+    assert ( pos < end );
+
+    /* read bytes */
+    rc = KFileRead ( self -> file, pos, buffer, ( size_t ) ( end - pos ), num_read );
+    if ( rc == 0 )
+    {
+        /* detect bytes read */
+        if ( * num_read != 0 )
+        {
+            /* accumulate into checksum */
+            self -> position += * num_read;
+            self -> crc32 = CRC32 ( self -> crc32, buffer, * num_read );
+
+            /* add in any previously read bytes and return success */
+            * num_read += total;
+            return 0;
+        }
+
+        switch (self->type)
+        {
+        case KCRC32FileTypeRead:
+            /* EOF - get results */
+            rc = KCRC32FileFinish ( self );
+            break;
+        case KCRC32FileTypeWrite:
+            if ( self -> fmt != NULL)
+            {
+                KCRC32SumFmtUpdate ( self -> fmt, self -> u . wr . path, self -> crc32, true );
+                KCRC32SumFmtRelease ( self -> fmt );
+                self -> fmt = NULL;
+            }
+            break;
+        }
+
+    }
+
+    /* always return 0 if some bytes were read */
+    if ( total != 0 )
+    {
+        * num_read = total;
+        return 0;
+    }
+    
+    return rc;
+}
+
+/* Read
+ *  writeable version isn't keeping track of checksum on read,
+ *  so just forward to destination file
+ */
+static
+rc_t CC KCRC32FileFwdRead ( const KCRC32File *self,
+    uint64_t pos, void *buffer, size_t bsize, size_t *num_read )
+{
+    return KFileRead ( self -> file, pos, buffer, bsize, num_read );
+}
+
+
+/* Write
+ */
+static
+rc_t CC KCRC32FileBadWrite ( KCRC32File *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    * num_writ = 0;
+    if ( size == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcBuffer, rcNull );
+
+    return RC ( rcFS, rcFile, rcReading, rcFile, rcReadonly );
+}
+
+static
+rc_t CC KCRC32FileWrite ( KCRC32File *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    rc_t rc;
+
+    if ( pos != self -> position )
+        return RC ( rcFS, rcFile, rcWriting, rcParam, rcInvalid );
+
+    rc = KFileWrite ( self -> file, pos, buffer, size, num_writ );
+    if ( rc == 0 && * num_writ != 0 )
+    {
+        self -> position += * num_writ;
+        if ( self -> position > self -> u . wr . max_position )
+            self -> u . wr . max_position = self -> position;
+        self -> crc32 = CRC32 ( self -> crc32, buffer, * num_writ );
+    }
+
+    return rc;
+}
+
+
+/* ToKFile
+ *  a CRC file is a subclass of KFile
+ *  this is an explicit cast operator
+ */
+LIB_EXPORT KFile* CC KCRC32FileToKFile ( KCRC32File *self )
+{
+    if ( self != NULL )
+        return & self -> dad;
+    return NULL;
+}
+
+LIB_EXPORT const KFile* CC KCRC32FileToKFileConst ( const KCRC32File *self )
+{
+    if ( self != NULL )
+        return & self -> dad;
+    return NULL;
+}
+
+
+/* BeginTransaction
+ *  preserve current state and file marker
+ *  in preparation for rollback
+ */
+LIB_EXPORT rc_t CC KCRC32FileBeginTransaction ( KCRC32File *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcFreezing, rcSelf, rcNull );
+    if ( ! self -> dad . write_enabled )
+        return RC ( rcFS, rcFile, rcFreezing, rcFile, rcReadonly );
+    if ( self -> u . wr . topen )
+        return RC ( rcFS, rcFile, rcFreezing, rcFile, rcBusy );
+
+    self -> u . wr . topen = true;
+    self -> u . wr . tposition = self -> position;
+    self -> u . wr . crc32 = self -> crc32;
+
+    return 0;
+}
+
+
+/* Commit
+ *  accept current state as correct
+ */
+LIB_EXPORT rc_t CC KCRC32FileCommit ( KCRC32File *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcCommitting, rcSelf, rcNull );
+    if ( ! self -> dad . write_enabled )
+        return RC ( rcFS, rcFile, rcCommitting, rcFile, rcReadonly );
+
+    self -> u . wr . topen = false;
+
+    return 0;
+}
+
+
+/* Revert
+ *  revert state to previous transaction boundary conditions
+ */
+LIB_EXPORT rc_t CC KCRC32FileRevert ( KCRC32File *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcReverting, rcSelf, rcNull );
+    if ( ! self -> dad . write_enabled )
+        return RC ( rcFS, rcFile, rcReverting, rcFile, rcReadonly );
+    if ( ! self -> u . wr . topen )
+        return RC ( rcFS, rcFile, rcReverting, rcFile, rcInconsistent );
+
+    self -> position = self -> u . wr . tposition;
+    self -> crc32 = self -> u . wr . crc32;
+    self -> u . wr . topen = false;
+
+    return 0;
+}
+
+/* Reset
+ *  reset state to that of an empty file
+ *  aborts any open transaction
+ */
+LIB_EXPORT rc_t CC KCRC32FileReset ( KCRC32File *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcResetting, rcSelf, rcNull );
+    if ( ! self -> dad . write_enabled )
+        return RC ( rcFS, rcFile, rcResetting, rcFile, rcReadonly );
+#if 1
+    self -> u . wr . topen = false;
+#else
+    if ( self -> u . wr . topen )
+        return RC ( rcFS, rcFile, rcResetting, rcFile, rcBusy );
+#endif
+
+    self -> position = 0;
+    self -> crc32 = 0;
+
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * CRC32File factories
+ */
+
+
+/* MakeCRC32Read
+ *  creates an adapter to check CRC32 checksum for a source file
+ *
+ *  "f" [ OUT ] - return parameter for file with crc32 check
+ *
+ *  "src" [ IN ] - source file with read permission
+ *
+ *  "crc32" [ IN ] - checksum to match
+ *
+ * NB - creates a read-only file that does NOT support random access
+ *  i.e. must be consumed serially starting from offset 0
+ */
+static KFile_vt_v1 KCRC32FileRead_vt =
+{
+    1, 1,
+
+    /* 1.0 */
+    KCRC32FileWhackRead,
+    KCRC32FileGetSysFile,
+    KCRC32FileRandomAccessRead,
+    KCRC32FileSize,
+    KCRC32FileSetSizeRead,
+    KCRC32FileRead,
+    KCRC32FileBadWrite,
+
+    /* 1.1 */
+    KCRC32FileType
+};
+
+LIB_EXPORT rc_t CC KFileMakeCRC32Read ( const KFile **fp,
+    const KFile *src, uint32_t crc32 )
+{
+    rc_t rc;
+
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( src == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! src -> read_enabled )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        else
+        {
+            KCRC32File *f = malloc ( sizeof * f - sizeof f -> u + sizeof f -> u . rd );
+            if ( f == NULL )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KFileInit ( & f -> dad,
+				     ( const KFile_vt* ) & KCRC32FileRead_vt, "KCRC32File", "no-name", true, false );
+                if ( rc == 0 )
+                {
+                    f -> position = 0;
+                    f -> crc32 = 0;
+                    f -> file = ( KFile* ) src;
+                    f -> fmt = NULL;
+                    f -> type = KCRC32FileTypeRead;
+                    f -> u . rd . rc = 0;
+                    f -> u . rd . eof = 0;
+                    f -> u . rd . crc32 = crc32;
+
+                    * fp = & f -> dad;
+                    return 0;
+                }
+            }
+
+            free ( f );
+        }
+
+        * fp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* MakeWrite
+ *  creates an adapter to create checksum for a file
+ *
+ *  "f" [ OUT ] - return parameter for file with crc32 check
+ *
+ *  "out" [ IN ] - output file with write permission
+ *  since this file is being wrapped by "f", ownership of
+ *  the provided reference is transferred to "f"
+ *
+ *  "fmt" [ IN ] - checksum output formatter.
+ *  since this may be used for multiple checksums, "f" will
+ *  attach its own reference to "fmt".
+ *
+ *  "path" [ IN ] - checksum output file path, used to
+ *  create standard crc32sum file entry.
+ *
+ * NB - creates a write-only file that does NOT suppport random access
+ *  i.e. must be written serially from offset 0
+ */
+static KFile_vt_v1 sKCRC32FileWrite_vt =
+{
+    1, 0,
+
+    KCRC32FileWhackWrite,
+    KCRC32FileGetSysFile,
+    KCRC32FileRandomAccessWrite,
+    KCRC32FileSize,
+    KCRC32FileSetSizeWrite,
+    KCRC32FileFwdRead,
+    KCRC32FileWrite
+};
+
+LIB_EXPORT rc_t CC KCRC32FileMakeWrite ( KCRC32File **fp,
+    KFile *out, KCRC32SumFmt *fmt, const char *path )
+{
+    rc_t rc;
+
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( out == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! out -> write_enabled )
+        {
+            if ( out -> read_enabled )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+            else
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        }
+        else if ( fmt == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( fmt -> read_only )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+        else if ( path == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcEmpty );
+        else
+        {
+            KCRC32File *f = malloc ( sizeof * f - sizeof f -> u +
+                sizeof f -> u . wr + strlen ( path ) );
+            if ( f == NULL )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KFileInit ( & f -> dad,
+                    ( const KFile_vt* ) & sKCRC32FileWrite_vt, "KCRC32File", path, out -> read_enabled, true );
+                if ( rc == 0 )
+                {
+                    f -> position = 0;
+                    f -> crc32 = 0;
+                    f -> file = out;
+                    f -> fmt = fmt;
+                    f -> type = KCRC32FileTypeWrite;
+
+                    memset ( & f -> u . wr, 0, sizeof f -> u . wr );
+                    strcpy ( f -> u . wr . path, path );
+
+                    rc = KFileSize ( out, & f -> u . wr . max_position );
+                    if (rc)
+                    {
+                        if (GetRCState (rc) == rcUnsupported)
+                        {
+                            f -> u . wr . max_position  = 0;
+                            rc = 0;
+                        }
+                    }    
+                    if ( rc == 0 )
+                        rc = KCRC32SumFmtAddRef ( fmt );
+                    if ( rc == 0 )
+                    {
+                        * fp = f;
+                        return 0;
+                    }
+                }
+
+                free ( f );
+            }
+        }
+
+        * fp = NULL;
+    }
+
+    return rc;
+}
+
+/* MakeAppend
+ *  creates an adapter to create CRC32 checksum for a file
+ *
+ *  "f" [ OUT ] - return parameter for file with crc32 check
+ *
+ *  "out" [ IN ] - output file with write permission
+ *  since this file is being wrapped by "f", ownership of
+ *  the provided reference is transferred to "f"
+ *
+ *  "fmt" [ IN ] - checksum output formatter.
+ *  since this may be used for multiple checksums, "f" will
+ *  attach its own reference to "fmt".
+ *
+ *  "path" [ IN ] - checksum output file path, used to
+ *  create standard crc32sum file entry.
+ *
+ * NB - creates a write-only file that does NOT suppport random access
+ *  i.e. must be written serially from current EOF (minus the stored crc context)
+ */
+static KFile_vt_v1 sKCRC32FileAppend_vt =
+{
+    1, 0,
+
+    KCRC32FileWhackAppend,
+    KCRC32FileGetSysFile,
+    KCRC32FileRandomAccessWrite,
+    KCRC32FileSizeAppend,
+    KCRC32FileSetSizeWrite,
+    KCRC32FileFwdRead,
+    KCRC32FileWrite
+};
+
+LIB_EXPORT rc_t CC KCRC32FileMakeAppend ( KCRC32File **fp, KFile *out, KCRC32SumFmt *fmt, const char *path )
+{
+    rc_t rc;
+    KLogLevel lvl = klogInt;
+    
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( out == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! out -> write_enabled )
+        {
+            if ( out -> read_enabled )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+            else
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        }
+        else if ( fmt == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( fmt -> read_only )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+        else if ( path == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcEmpty );
+        else
+        {
+            KCRC32File *f = malloc ( sizeof * f - sizeof f -> u +
+                sizeof f -> u . wr + strlen ( path ) );
+            if ( f == NULL )
+            {
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+                lvl = klogSys;
+            }
+            else
+            {
+                rc = KFileInit ( & f -> dad,
+                    ( const KFile_vt* ) & sKCRC32FileAppend_vt, "KCRC32File", path, out -> read_enabled, true );
+                if ( rc == 0 )
+                {
+                    f -> crc32 = 0;
+                    f -> file = out;
+                    f -> fmt = fmt;
+                    f -> type = KCRC32FileTypeWrite;
+
+                    rc = KCRC32SumFmtAddRef ( fmt );
+                    if ( rc != 0 )
+                    {
+                        free ( f );
+                        * fp = NULL;
+                        return rc;
+                    }
+
+                    memset ( & f -> u . wr, 0, sizeof f -> u . wr );
+                    strcpy ( f -> u . wr . path, path );
+
+                    lvl = klogSys;
+                    rc = KFileSize ( out, & f -> position );
+                    if ( rc == 0 )
+                    {
+                        uint8_t buffer [ sizeof CRCTAG + sizeof ENDIANTAG + sizeof f -> crc32 ];
+
+                        /* an empty file is fine */
+                        if ( f -> position == 0 )
+                        {
+                            * fp = f;
+                            return 0;
+                        }
+
+                        /* set max */
+                        f -> u . wr . max_position = f -> position;
+
+                        /* a file without a trailing crc state is incorrect or corrupt */
+                        if ( f -> position < sizeof buffer )
+                        {
+                            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcIncorrect );
+                            lvl = klogErr;
+                        }
+                        else
+                        {
+                            /* try to read crc state */
+                            size_t num_read;
+                            rc = KFileRead ( out, f -> position - sizeof buffer, buffer, sizeof buffer, & num_read );
+                            if ( rc == 0 )
+                            {
+                                if ( num_read != sizeof buffer )
+                                    rc = RC ( rcFS, rcFile, rcConstructing, rcTransfer, rcIncomplete );
+                                else
+                                {
+                                    /* errors from here are usage errors */
+                                    lvl = klogErr;
+                                    
+                                    if ( memcmp ( buffer, CRCTAG, sizeof CRCTAG ) != 0 )
+                                        rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcIncorrect );
+                                    else
+                                    {
+                                        /* forget about the CRC state */
+                                        f -> position -= sizeof buffer;
+                                        memmove ( & f -> crc32, & buffer [ sizeof CRCTAG + sizeof ENDIANTAG ], sizeof f -> crc32 );
+                                        
+                                        /* check for proper byte order */
+                                        if ( memcmp ( & buffer [ sizeof CRCTAG ], ENDIANTAG, sizeof ENDIANTAG ) == 0 )
+                                        {
+                                            * fp = f;
+                                            return 0;
+                                        }
+
+                                        /* probably swapped, but confirm */
+                                        if ( memcmp ( & buffer [ sizeof CRCTAG ], ENDIANSWAPTAG, sizeof ENDIANSWAPTAG ) == 0 )
+                                        {
+                                            f -> crc32 = bswap_32 ( f -> crc32 );
+                                            * fp = f;
+                                            return 0;
+                                        }
+                                        
+                                        /* garbage */
+                                        rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcCorrupt );
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    
+                    KCRC32SumFmtRelease ( fmt );
+                }
+                
+                free ( f );
+            }
+        }
+        
+        * fp = NULL;
+    }
+    
+    LOGERR ( lvl, rc, "append-mode CRC32 file" );
+    
+    return rc;
+}
+
+static KFile_vt_v1 sKCRC32FileReadCreate_vt =
+{
+    1, 1,
+
+    KCRC32FileWhackRead,
+    KCRC32FileGetSysFile,
+    KCRC32FileRandomAccessRead,
+    KCRC32FileSize,
+    KCRC32FileSetSizeRead,
+    KCRC32FileRead,
+    KCRC32FileBadWrite,
+
+    /* 1.1 */
+    KCRC32FileType
+};
+
+LIB_EXPORT rc_t CC KFileMakeNewCRC32Read ( const KFile **fp,
+    const KFile *in, KCRC32SumFmt *fmt, const char *path )
+{
+    rc_t rc;
+
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( in == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! in -> read_enabled )
+	    rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        else if ( fmt == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( fmt -> read_only )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+        else if ( path == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcEmpty );
+        else
+        {
+            KCRC32File *f = malloc ( sizeof * f - sizeof f -> u +
+                sizeof f -> u . wr + strlen ( path ) );
+            if ( f == NULL )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KFileInit ( & f -> dad,
+                    ( const KFile_vt* ) & sKCRC32FileReadCreate_vt, "KCRC32File", path, in -> read_enabled, false );
+                if ( rc == 0 )
+                {
+                    f -> position = 0;
+                    f -> crc32 = 0;
+                    f -> file = ( KFile* ) in;
+                    f -> fmt = fmt;
+                    f -> type = KCRC32FileTypeWrite;
+                    memset ( & f -> u . wr, 0, sizeof f -> u . wr );
+                    strcpy ( f -> u . wr . path, path );
+#if 0
+                    /* KFileSize can't always be used */
+                    rc = KFileSize ( in, & f -> u . wr . max_position );
+#endif
+                    if ( rc == 0 )
+                        rc = KCRC32SumFmtAddRef ( fmt );
+                    if ( rc == 0 )
+                    {
+                        * fp = & f -> dad;
+                        return 0;
+                    }
+                }
+
+                free ( f );
+            }
+        }
+
+        * fp = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/kfs/dir_test.c b/libs/kfs/dir_test.c
new file mode 100644
index 0000000..9be919e
--- /dev/null
+++ b/libs/kfs/dir_test.c
@@ -0,0 +1,54 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+#include <kfs/directory.h>
+#include <sysalloc.h>
+
+/* ======================================================================
+ */
+const char *get_mode_string ( KCreateMode mode )
+{
+    switch (mode)
+    {
+    default:
+	return "BAD MODE";
+    case kcmOpen:
+	return "kcmOpen";
+    case kcmInit:
+	return "kcmInit";
+    case kcmCreate:
+	return "kcmCreate";
+    case kcmOpen|kcmParents:
+	return "kcmOpen|kcmParents";
+    case kcmInit|kcmParents:
+	return "kcmInit|kcmParents";
+    case kcmCreate|kcmParents:
+	return "kcmCreate|kcmParents";
+    }
+}
+
+/* end of file */
diff --git a/libs/kfs/directory-v2.c b/libs/kfs/directory-v2.c
new file mode 100644
index 0000000..a0544a2
--- /dev/null
+++ b/libs/kfs/directory-v2.c
@@ -0,0 +1,1185 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+#include <kfs/extern.h>
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <kfs/impl.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/path.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ *  a directory
+ */
+
+static const char classname[] = "KDirectory";
+
+/* AddRef
+ *  creates a new reference
+ *  ignores NULL references
+ */
+
+// !!! Probably wrong way to implement this function
+LIB_EXPORT KDirectory_v2 * CC KDirectoryDuplicate_v2 ( const KDirectory_v2 *self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcCopying );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to dupliacte directory" );
+
+    else switch ( KRefcountAdd ( & self -> refcount, classname ) )
+         {
+         case krefLimit:
+             INTERNAL_ERROR ( xcRefcountOutOfBounds, "references to directory surpass limit" );
+             break;
+         default:
+             INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has an invalid version" );
+         }
+
+    return NULL;
+}
+
+/* Release
+ *  discard reference to directory
+ *  ignores NULL references
+ */
+LIB_EXPORT void CC KDirectoryRelease_v2 ( const KDirectory_v2 *self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcReleasing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to release directory" );
+
+    else switch ( KRefcountDrop ( & self -> refcount, classname ) )
+         {
+         case krefWhack:
+         {
+             switch ( self -> vt -> v2 . maj )
+             {
+             case 2:
+                 ( * self -> vt -> v2 . destroy ) ( ( KDirectory_v2 * ) self, ctx );
+                 break;
+             default:
+                 INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has an invalid version" );
+             }
+             
+             if ( FAILED () )
+             {
+                 KRefcountInit ( ( KRefcount * ) & self -> refcount, 1, classname, "failed-release", "orphan" );
+                 INTERNAL_ERROR ( xcReleaseFailed, "failed to release reference, - orphan" );
+             }
+         }
+         case krefNegative:
+             INTERNAL_ERROR ( xcRefcountOutOfBounds, "references to directory cannot be negative" );
+         }
+}
+
+/* List
+ *  create a directory listing
+ *
+ *  "list" [ OUT ] - return parameter for list object
+ *
+ *  "path" [ IN, NULL OKAY ] - optional parameter for target
+ *  directory. if NULL, interpreted to mean "." will be
+ *  interpreted as format string if arguments follow
+ */
+
+LIB_EXPORT KNamelist * CC KDirectoryList_v2 ( const KDirectory_v2 *self, ctx_t ctx,
+    bool ( CC * f ) ( const KDirectory_v2 *dir, const char *name, void *data ),
+    void *data, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcListing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to create directory listing" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . list_dir ) ( self, ctx, f, data, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has an invalid version" );
+    }
+
+    return NULL;
+}
+
+/* Visit
+ *  visit each path under designated directory,
+ *  recursively if so indicated
+ *
+ *  "recurse" [ IN ] - if non-zero, recursively visit sub-directories
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to execute
+ *  on each path. receives a base directory and relative path
+ *  for each entry. if "f" returns non-zero, the iteration will
+ *  terminate and that value will be returned. NB - "dir" will not
+ *  be the same as "self".
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+LIB_EXPORT void CC KDirectoryVisit_v2 ( const KDirectory_v2 *self, ctx_t ctx, bool recurse,
+    bool ( CC * f ) ( const KDirectory_v2 *dir, uint32_t type, const char *name, void *data ),
+    void *data, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcVisiting );
+    
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to visit directory" );
+
+    if ( f == NULL )
+        INTERNAL_ERROR ( xcFunctionNull, "function pointer is null" );
+
+    if ( path == NULL )
+        /* FIX ME  path = "." */ ;
+
+    switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        ( * self -> vt -> v2 . visit ) ( self, ctx, recurse, f, data, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has an invalid version" );
+    }
+}
+
+/* VisitUpdate
+ *  
+ */
+LIB_EXPORT void CC KDirectoryVisitUpdate_v2 ( KDirectory_v2 *self, ctx_t ctx, bool recurse,
+    bool ( CC * f ) ( KDirectory_v2 *dir, uint32_t type, const char *name, void *data ),
+    void *data, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcVisiting );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to visit directory" );
+    else if ( f == NULL )
+        INTERNAL_ERROR ( xcFunctionNull, "function pointer is null" );
+
+    else if ( self -> read_only )
+        INTERNAL_ERROR ( xcFileReadOnly, "directory does not have write permission" );
+
+    else if ( path == NULL )
+        /* FIX ME path = "." */;
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        ( * self -> vt -> v2 . visit_update )( self, ctx, recurse, f, data, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has an invalid version" );
+    }
+}
+
+/* PathType
+ *  returns a KPathType
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+LIB_EXPORT uint32_t CC KDirectoryPathType_v2 ( const KDirectory_v2 *self, ctx_t ctx, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcIdentifying );
+
+    if ( self == NULL ) 
+        INTERNAL_ERROR ( xcSelfNull, "failed to get path type" );
+
+    if ( path == NULL )
+        return kptBadPath;
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . path_type ) ( self, ctx, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has an invalid version" );
+    }
+
+    return kptBadPath;
+}
+
+/* ResolvePath
+ *  resolves path to an absolute or directory-relative path
+ *
+ *  "absolute" [ IN ] - if non-zero, always give a path starting
+ *  with '/'. NB - if the directory is chroot'd, the absolute path
+ *  will still be relative to directory root.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *  the resolved path will be directory relative
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target path. NB - need not exist.
+ */
+LIB_EXPORT KPath * CC KDirectoryResolvePath_v2 ( const KDirectory_v2 *self, ctx_t ctx, 
+    bool absolute, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcResolving );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to resolve path" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . resolve_path )
+            ( self, ctx, absolute, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has an invalid version" );
+    }
+
+    return NULL;
+}
+
+/* ResolveAlias
+ *  resolves an alias path to its immediate target
+ *  NB - the resolved path may be yet another alias
+ *
+ *  "absolute" [ IN ] - if non-zero, always give a path starting
+ *  with '/'. NB - if the directory is chroot'd, the absolute path
+ *  will still be relative to directory root.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *  the resolved path will be directory relative
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting an object presumed to be an alias.
+ */
+
+LIB_EXPORT KPath * CC KDirectoryResolveAlias_v2 ( const KDirectory_v2 *self, ctx_t ctx, bool absolute,
+    const KPath *alias )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcResolving );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to resolve alias" );
+
+    else if ( alias == NULL )
+        INTERNAL_ERROR ( xcPathNull, "alias is null" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . resolve_alias )
+            ( self, ctx, absolute, alias );
+    }
+
+    return NULL;
+}
+
+/* Rename
+ *  rename an object accessible from directory, replacing
+ *  any existing target object of the same type
+ *
+ *  "from" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ *
+ *  "to" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ */
+LIB_EXPORT void CC KDirectoryRename_v2 ( KDirectory_v2 *self, ctx_t ctx, bool force, const KPath *from, const KPath *to )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcRenaming );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to rename directory" );
+
+    else if ( from == NULL || to == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else if ( self -> read_only )
+        INTERNAL_ERROR ( xcDirectoryWriteOnly, "directory does not have write permissions" );
+    
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        ( * self -> vt -> v2 . rename ) ( self, ctx, force, from, to );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+
+}
+
+/* Remove
+ *  remove an accessible object from its directory
+ *
+ *  "force" [ IN ] - if non-zero and target is a directory,
+ *  remove recursively
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT void CC KDirectoryRemove_v2 ( KDirectory_v2 *self, ctx_t ctx, bool force, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcRemoving );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to remove directory" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else if ( self -> read_only )
+        INTERNAL_ERROR ( xcDirectoryWriteOnly, "directory does not have write permissions" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        ( * self -> vt -> v2 . remove ) ( self, ctx, force, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+}
+
+/* ClearDir
+ *  remove all directory contents
+ *
+ *  "force" [ IN ] - if non-zero and directory entry is a
+ *  sub-directory, remove recursively
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+LIB_EXPORT void CC KDirectoryClearDir_v2 ( KDirectory_v2 *self, ctx_t ctx, bool force, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcRemoving );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to clear directory" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else if ( self -> read_only )
+        INTERNAL_ERROR ( xcDirectoryWriteOnly, "directory does not have write permissions" );
+
+    switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        ( * self -> vt -> v2 . clear_dir ) ( self, ctx, force, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+}
+
+/* Access
+ *  get access to object
+ *
+ *  "access" [ OUT ] - return parameter for Unix access mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT uint32_t CC KDirectoryAccess_v2 ( const KDirectory_v2 *self, ctx_t ctx, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to access directory" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . access ) ( self, ctx, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+    
+    return 0;
+}
+
+/* SetAccess
+ *  set access to object a la Unix "chmod"
+ *
+ *  "recurse" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ *
+ *  "access" [ IN ] and "mask" [ IN ] - definition of change
+ *  where "access" contains new bit values and "mask defines
+ *  which bits should be changed.
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT void CC KDirectorySetAccess_v2 ( KDirectory_v2 *self, ctx_t ctx, bool recurse,
+    uint32_t access, uint32_t mask, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to set access to directory" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else if ( self -> read_only )
+        INTERNAL_ERROR ( xcDirectoryWriteOnly, "directory does not have write permissions" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        /* TBD - perhaps limit bits to lower 9 */
+        ( * self -> vt -> v2 . set_access )
+            ( self, ctx, recurse, access, mask, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+}
+
+/* Date
+ *  get date/time to object
+ *
+ *  "date" [ OUT ] - return parameter
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT KTime_t CC KDirectoryDate_v2 ( const KDirectory_v2 *self, ctx_t ctx, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . date ) ( self, ctx, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+
+    return 0;
+}
+
+
+/* SetDate
+ *  set date to object
+ *
+ *  "recurse" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ *
+ *  "date" [ IN ] - new time and date for the object
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT void CC KDirectorySetDate_v2 ( KDirectory_v2 *self, ctx_t ctx, bool recurse,
+    KTime_t date, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcUpdating );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        ( * self -> vt -> v2 . setdate ) ( self, ctx, recurse, date, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+}
+
+
+/* CreateAlias
+ *  creates a path alias according to create mode
+ *
+ *  "access" [ IN ] - standard Unix directory access mode
+ *  used when "mode" has kcmParents set and alias path does
+ *  not exist.
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "targ" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target alias
+ */
+LIB_EXPORT void CC KDirectoryCreateAlias_v2 ( KDirectory_v2 *self, ctx_t ctx,
+    uint32_t access, KCreateMode mode, const KPath *targ, const KPath *alias )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcUpdating );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    if ( targ == NULL || alias == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    if ( self -> read_only )
+        INTERNAL_ERROR ( xcDirectoryWriteOnly, "directory does not have read permissions" );
+
+    switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        ( * self -> vt -> v2 . create_alias )( self, ctx, access, mode, targ, alias );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+}
+
+/* OpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT const KFile_v2 * CC KDirectoryOpenFileRead_v2 ( const KDirectory_v2 *self, ctx_t ctx,
+    const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcOpening );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . open_file_read ) ( self, ctx, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+
+    return NULL;
+}
+
+/* OpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT KFile_v2 * CC KDirectoryOpenFileWrite_v2 ( KDirectory_v2 *self, ctx_t ctx,
+    bool update, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcOpening );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else if ( self -> read_only )
+        INTERNAL_ERROR ( xcDirectoryWriteOnly, "directory does not have read permissions" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . open_file_write )
+            ( self, ctx, update, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+
+    return NULL;
+}
+
+/* CreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT KFile_v2 * CC KDirectoryCreateFile_v2 ( KDirectory_v2 *self, ctx_t ctx,
+    bool update, uint32_t access, KCreateMode mode, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcCreating );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else if ( self -> read_only )
+        INTERNAL_ERROR ( xcDirectoryWriteOnly, "directory does not have read permissions" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . create_file )
+            ( self, ctx, update, access, mode, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+
+    return NULL;
+}
+
+/* FileLocator
+ *  returns locator in bytes of target file
+ *
+ *  "locator" [ OUT ] - return parameter for file locator
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT uint64_t CC KDirectoryFileLocator_v2 ( const KDirectory_v2 *self, ctx_t ctx,
+   const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . file_locator ) ( self, ctx, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+
+    return 0;
+}
+
+/* FileSize
+ *  returns size in bytes of target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT uint64_t CC KDirectoryFileSize_v2 ( const KDirectory_v2 *self, ctx_t ctx, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . file_size ) ( self, ctx, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+
+    return 0;
+}
+
+/* FilePhysicalSize
+ *  returns size in bytes of target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT uint64_t CC KDirectoryFilePhysicalSize_v2 ( const KDirectory_v2 *self, ctx_t ctx, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . file_phys_size ) ( self, ctx, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+
+    return 0;
+}
+
+/* SetFileSize
+ *  sets size in bytes of target file
+ *
+ *  "size" [ IN ] - new file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT void CC KDirectorySetFileSize_v2 ( KDirectory_v2 *self, ctx_t ctx,
+    uint64_t size, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcUpdating );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else if ( self -> read_only )
+        INTERNAL_ERROR ( xcDirectoryWriteOnly, "directory does not have read permissions" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        ( * self -> vt -> v2 . set_size ) ( self, ctx, size, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+}
+
+/* FileContiguous
+ *  returns true if the file is "contiguous".  Chunked or sparse files are not
+ *  contiguous while most data files are.  Virtual generated files would likely
+ *  not be contiguous.  
+ *
+ *  "contiguous" [ OUT ] - return parameter for file contiguous
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT bool CC KDirectoryFileContiguous_v2 ( const KDirectory_v2 *self, ctx_t ctx, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . file_contiguous ) ( self, ctx, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+
+    return false;
+}
+
+/* OpenDirRead
+ * KDirectoryOpenDirUpdate
+ *  opens a sub-directory
+ *
+ *  "chroot" [ IN ] - if non-zero, the new directory becomes
+ *  chroot'd and will interpret paths beginning with '/'
+ *  relative to itself.
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+LIB_EXPORT const KDirectory_v2 * CC KDirectoryOpenDirRead_v2 ( const KDirectory_v2 *self, ctx_t ctx,
+    bool chroot, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcOpening );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    if ( path == NULL )
+        /* FIX ME path = "." */;
+
+    switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . open_dir_read )
+            ( self, ctx, chroot, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+    
+    return NULL;
+}
+
+LIB_EXPORT KDirectory_v2 * CC KDirectoryOpenDirUpdate_v2 ( KDirectory_v2 *self, ctx_t ctx,
+    bool chroot, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcOpening );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    if ( self -> read_only )
+        INTERNAL_ERROR ( xcDirectoryWriteOnly, "directory does not have read permissions" );
+
+    if ( path == NULL )
+        /* FIX ME path = "." */;
+
+    switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        return ( * self -> vt -> v2 . open_dir_update )
+            ( self, ctx, chroot, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+
+    return NULL;
+}
+
+/* CreateDir
+ *  create a sub-directory
+ *
+ *  "access" [ IN ] - standard Unix directory mode, e.g.0775
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+LIB_EXPORT void CC KDirectoryCreateDir_v2 ( KDirectory_v2 *self, ctx_t ctx,
+    uint32_t access, KCreateMode mode, const KPath *path )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get directory date" );
+
+    else if ( path == NULL )
+        INTERNAL_ERROR ( xcPathNull, "path is null" );
+
+    if ( self -> read_only )
+        INTERNAL_ERROR ( xcDirectoryWriteOnly, "directory does not have read permissions" );
+
+    else switch ( self -> vt -> v2 . maj )
+    {
+    case 2:
+        ( * self -> vt -> v2 . create_dir ) ( self, ctx, access, mode, path );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+}
+
+/* Init
+ *  initialize a newly allocated directory object
+ */
+LIB_EXPORT void CC KDirectoryInit_v2 ( KDirectory_v2 *self, ctx_t ctx, const KDirectory_vt *vt,
+    const char * class_name, const char * path, bool update )
+{
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get initialize directory" );
+
+    else if ( vt == NULL )
+        INTERNAL_ERROR ( xcInterfaceNull, "null vtable" );
+
+    else switch ( vt -> v2 . maj )
+    {
+    case 2:
+#if _DEBUGGING
+        if ( vt -> v2 . file_phys_size == NULL  ||
+             vt -> v2 . file_locator == NULL    ||
+             vt -> v2 . get_sysdir == NULL      ||
+             vt -> v2 . setdate == NULL         ||
+             vt -> v2 . date == NULL            ||
+             vt -> v2 . create_dir == NULL      ||
+             vt -> v2 . open_dir_update == NULL ||
+             vt -> v2 . open_dir_read == NULL   ||
+             vt -> v2 . set_size == NULL        ||
+             vt -> v2 . file_size == NULL       ||
+             vt -> v2 . create_file == NULL     ||
+             vt -> v2 . open_file_write == NULL ||
+             vt -> v2 . open_file_read == NULL  ||
+             vt -> v2 . create_alias == NULL    ||
+             vt -> v2 . set_access == NULL      ||
+             vt -> v2 . access == NULL          ||
+             vt -> v2 . clear_dir == NULL       ||
+             vt -> v2 . remove == NULL          ||
+             vt -> v2 . rename == NULL          ||
+             vt -> v2 . resolve_alias == NULL   ||
+             vt -> v2 . resolve_path == NULL    ||
+             vt -> v2 . path_type == NULL       ||
+             vt -> v2 . visit_update == NULL    ||
+             vt -> v2 . visit == NULL           ||
+             vt -> v2 . list_dir == NULL        ||
+             vt -> v2 . destroy == NULL )
+            
+            INTERNAL_ERROR ( xcInterfaceNull, "null vtable" );
+#endif
+        break;
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+
+    self -> vt = vt;
+    self -> read_only = ( uint8_t ) ( update == 0 );
+
+
+    KRefcountInit ( &self->refcount, 1, class_name, "init", path );
+}
+
+/* DestroyFile
+ *  does whatever is necessary with an unreferenced file
+ */
+LIB_EXPORT void CC KDirectoryDestroyFile_v2 ( const KDirectory_v2 *self, ctx_t ctx, KFile_v2 *f )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcDirectory, rcDestroying );
+
+    const KDirectory_vt *vt = self -> vt;
+    switch ( vt -> v2 . maj )
+    {
+    case 2:
+        if ( vt -> v2 . destroy_file != NULL )
+            ( * vt -> v2 . destroy_file ) ( ( KDirectory_v2 * ) self, ctx, f );
+        else
+            KFileDestroy_v2 ( f, ctx );
+    default:
+        INTERNAL_ERROR ( xcDirectoryInvalidVersion, "directory has invalid version" );
+    }
+}
+
+#if 0
+
+/* GetSysDir
+ *  returns an underlying system file object
+ */
+LIB_EXPORT struct KSysDir* CC KDirectoryGetSysDir_v2 ( const KDirectory_v2 *self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        switch ( self -> vt -> v2 . maj )
+        {
+        case 1:
+            if ( self -> vt -> v2 . min > 0 )
+                return ( * self -> vt -> v2 . get_sysdir ) ( self );
+            break;
+        }
+    }
+    return NULL;
+}
+
+
+static rc_t copy_loop( const KFile *src, KFile *dst, size_t bsize )
+{
+    rc_t rc = 0;
+    uint64_t pos = 0;
+    size_t num_read = 1;
+
+    char * buffer = malloc( bsize );
+    if ( buffer == NULL )
+        return RC( rcFS, rcDirectory, rcCopying, rcMemory, rcExhausted );
+
+    while ( rc == 0 && num_read > 0 )
+    {
+        rc = KFileRead ( src, pos, buffer, bsize, &num_read );
+        if ( rc == 0 && num_read > 0 )
+        {
+            size_t num_writ;
+            rc = KFileWrite ( dst, pos, buffer, num_read, &num_writ );
+            pos += num_read;
+        }
+    }
+    free( buffer );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryCopyPath ( const KDirectory_v2 *src_dir,
+    KDirectory_v2 *dst_dir, const char *src_path, const char * dst_path )
+{
+    rc_t rc;
+    struct KFile const *f_src;
+
+    if ( src_dir == NULL || dst_dir == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcSelf, rcNull );
+    if ( src_path == NULL || dst_path == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcParam, rcNull );
+
+    rc = KDirectoryOpenFileRead ( src_dir, &f_src, "%s", src_path );
+    if ( rc == 0 )
+    {
+        uint32_t pt = KDirectoryPathType ( dst_dir, "%s", dst_path );
+        switch( pt )
+        {
+            case kptFile : ; /* intentional fall through! */
+            case kptDir  : rc = KDirectoryRemove ( dst_dir, true, "%s", dst_path ); break;
+        }
+        if ( rc == 0 )
+        {
+            struct KFile *f_dst;
+            uint32_t access = 0664;
+            rc = KDirectoryCreateFile ( dst_dir, &f_dst, false, access, kcmCreate, "%s", dst_path );
+            if ( rc == 0 )
+            {
+                rc = copy_loop( f_src, f_dst, 1024 * 16 );
+            }
+        }
+    }
+    return rc;
+}
+
+
+static rc_t build_obj_path( char **s, const KPath *path, const char * objname )
+{
+    rc_t rc;
+    size_t lp = string_size( path );
+    size_t l = lp + string_size( objname ) + 2;
+    *s = malloc( l );
+    if ( *s == NULL )
+        rc = RC( rcFS, rcDirectory, rcCopying, rcMemory, rcExhausted );
+    else
+    {
+        size_t written;
+        const char * concat = ( ( path[ lp - 1 ] == '/' ) ? "%s%s" : "%s/%s" );
+        rc = string_printf( *s, l, &written, concat, path, objname );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryCopyPaths( const KDirectory_v2 * src_dir,
+    KDirectory_v2 * dst_dir, bool recursive, const char *src, const char *dst )
+{
+    rc_t rc;
+    struct KNamelist *list;
+
+    if ( src_dir == NULL || dst_dir == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcSelf, rcNull );
+    if ( src == NULL || dst == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcParam, rcNull );
+
+    rc = KDirectoryList ( src_dir, &list, NULL, NULL, "%s", src );
+    if ( rc == 0 )
+    {
+        uint32_t pt = KDirectoryPathType ( dst_dir, "%s", dst );
+        /* if the output-directory does not exist: create it! */
+        switch( pt )
+        {
+            case kptFile : rc = KDirectoryRemove ( dst_dir, true, "%s", dst );
+                            /* intentially no break ! */
+
+            case kptNotFound : if ( rc == 0 )
+                                    rc = KDirectoryCreateDir ( dst_dir, 0775, kcmCreate | kcmParents, "%s", dst );
+                               break;
+        }
+        if ( rc == 0 )
+        {
+            uint32_t i, n;
+            rc = KNamelistCount ( list, &n );
+            for ( i = 0; i < n && rc == 0; ++i )
+            {
+                const char *name;
+                rc = KNamelistGet ( list, i, &name );
+                if ( rc == 0 )
+                {
+                    char *src_obj;
+                    rc = build_obj_path( &src_obj, src, name );
+                    if ( rc == 0 )
+                    {
+                        char *dst_obj;
+                        rc = build_obj_path( &dst_obj, dst, name );
+                        if ( rc == 0 )
+                        {
+                            pt = KDirectoryPathType ( src_dir, "%s", src_obj );
+                            switch( pt )
+                            {
+                                case kptFile : rc = KDirectoryCopyPath ( src_dir, dst_dir, src_obj, dst_obj );
+                                               break;
+
+                                case kptDir  : if ( recursive )
+                                                    rc = KDirectoryCopyPaths( src_dir, dst_dir, true, src_obj, dst_obj );
+                                               break;
+                            }
+                            free( dst_obj );
+                        }
+                        free( src_obj );
+                    }
+                }
+            }
+        }
+        KNamelistRelease ( list );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryCopy( const KDirectory_v2 * src_dir,
+    KDirectory_v2 * dst_dir, bool recursive, const char *src, const char *dst )
+{
+    rc_t rc = 0;
+    uint32_t pt;
+
+    if ( src_dir == NULL || dst_dir == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcSelf, rcNull );
+    if ( src == NULL || dst == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcParam, rcNull );
+
+    pt = KDirectoryPathType ( src_dir, "%s", src );
+    switch( pt )
+    {
+        case kptFile : rc = KDirectoryCopyPath ( src_dir, dst_dir, src, dst );
+                        break;
+        case kptDir  : rc = KDirectoryCopyPaths ( src_dir, dst_dir, recursive, src, dst );
+                        break;
+    }
+    return rc;
+}
+#endif
diff --git a/libs/kfs/directory.c b/libs/kfs/directory.c
new file mode 100644
index 0000000..7536d05
--- /dev/null
+++ b/libs/kfs/directory.c
@@ -0,0 +1,1539 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+#include <kfs/extern.h>
+#include <kfs/impl.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ *  a directory
+ */
+
+static const char classname[] = "KDirectory";
+
+/* AddRef
+ *  creates a new reference
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KDirectoryAddRef_v1 ( const KDirectory_v1 *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, classname ) )
+        {
+        case krefLimit:
+            return RC ( rcFS, rcDirectory, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Release
+ *  discard reference to directory
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KDirectoryRelease_v1 ( const KDirectory_v1 *cself )
+{
+    KDirectory_v1 *self = ( KDirectory* ) cself;
+    if ( cself != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, classname ) )
+        {
+        case krefWhack:
+        {
+            rc_t rc;
+
+            switch ( self -> vt -> v1 . maj )
+            {
+            case 1:
+                rc = ( * self -> vt -> v1 . destroy ) ( self );
+                break;
+
+            default:
+                rc = RC ( rcFS, rcDirectory, rcReleasing, rcInterface, rcBadVersion );
+            }
+
+            if ( rc != 0 )
+                KRefcountInit ( & self -> refcount, 1, classname, "failed-release", "orphan" );
+            return rc;
+        }
+        case krefNegative:
+            return RC ( rcDB, rcTable, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* List
+ *  create a directory listing
+ *
+ *  "list" [ OUT ] - return parameter for list object
+ *
+ *  "path" [ IN, NULL OKAY ] - optional parameter for target
+ *  directory. if NULL, interpreted to mean "." will be
+ *  interpreted as format string if arguments follow
+ */
+LIB_EXPORT rc_t CC KDirectoryList_v1 ( const KDirectory_v1 *self, struct KNamelist **list,
+    bool ( CC * f ) ( const KDirectory_v1 *dir, const char *name, void *data ),
+    void *data, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVList ( self, list, f, data, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVList ( const KDirectory_v1 *self, struct KNamelist **list,
+    bool ( CC * f ) ( const KDirectory_v1 *dir, const char *name, void *data ),
+    void *data, const char *path, va_list args )
+{
+    if ( list == NULL )
+        return RC ( rcFS, rcDirectory, rcListing, rcParam, rcNull );
+
+    * list = NULL;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcListing, rcSelf, rcNull );
+
+    if ( path == NULL || path [ 0 ] == 0 )
+        path = ".";
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . list_dir ) ( self, list, f, data, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcListing, rcInterface, rcBadVersion );
+}
+
+/* Visit
+ *  visit each path under designated directory,
+ *  recursively if so indicated
+ *
+ *  "recurse" [ IN ] - if non-zero, recursively visit sub-directories
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to execute
+ *  on each path. receives a base directory and relative path
+ *  for each entry. if "f" returns non-zero, the iteration will
+ *  terminate and that value will be returned. NB - "dir" will not
+ *  be the same as "self".
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+LIB_EXPORT rc_t CC KDirectoryVisit_v1 ( const KDirectory_v1 *self, bool recurse,
+    rc_t ( CC * f ) ( const KDirectory_v1 *dir, uint32_t type, const char *name, void *data ),
+    void *data, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVVisit ( self, recurse, f, data, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVVisit ( const KDirectory_v1 *self, bool recurse,
+    rc_t ( CC * f ) ( const KDirectory_v1 *dir, uint32_t type, const char *name, void *data ),
+    void *data, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcVisiting, rcSelf, rcNull );
+    if ( f == NULL )
+        return RC ( rcFS, rcDirectory, rcVisiting, rcFunction, rcNull );
+
+    if ( path == NULL || path [ 0 ] == 0 )
+        path = ".";
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . visit ) ( self, recurse, f, data, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcVisiting, rcInterface, rcBadVersion );
+}
+
+/* VisitUpdate
+ *  
+ */
+LIB_EXPORT rc_t CC KDirectoryVisitUpdate_v1 ( KDirectory_v1 *self, bool recurse,
+    rc_t ( CC * f ) ( KDirectory_v1 *dir, uint32_t type, const char *name, void *data ),
+    void *data, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVVisitUpdate ( self, recurse, f, data, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVVisitUpdate ( KDirectory_v1 *self, bool recurse,
+    rc_t ( CC * f ) ( KDirectory_v1 *dir, uint32_t type, const char *name, void *data ),
+    void *data, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcVisiting, rcSelf, rcNull );
+    if ( f == NULL )
+        return RC ( rcFS, rcDirectory, rcVisiting, rcFunction, rcNull );
+
+    if ( path == NULL || path [ 0 ] == 0 )
+        path = ".";
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcDirectory, rcVisiting, rcDirectory, rcReadonly );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . visit_update )
+            ( self, recurse, f, data, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcVisiting, rcInterface, rcBadVersion );
+}
+
+/* PathType
+ *  returns a KPathType
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+LIB_EXPORT uint32_t CC KDirectoryPathType_v1 ( const KDirectory_v1 *self, const char *path, ... )
+{
+    uint32_t type;
+    va_list args;
+
+    va_start ( args, path );
+    type = KDirectoryVPathType ( self, path, args );
+    va_end ( args );
+
+    return type;
+}
+
+LIB_EXPORT uint32_t CC KDirectoryVPathType ( const KDirectory_v1 *self, const char *path, va_list args )
+{
+    if ( self == NULL || path == NULL || path [ 0 ] == 0 )
+        return kptBadPath;
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . path_type ) ( self, path, args );
+    }
+
+    return kptBadPath;
+}
+
+/* ResolvePath
+ *  resolves path to an absolute or directory-relative path
+ *
+ *  "absolute" [ IN ] - if non-zero, always give a path starting
+ *  with '/'. NB - if the directory is chroot'd, the absolute path
+ *  will still be relative to directory root.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *  the resolved path will be directory relative
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target path. NB - need not exist.
+ */
+LIB_EXPORT rc_t CC KDirectoryResolvePath_v1 ( const KDirectory_v1 *self, bool absolute,
+    char *resolved, size_t rsize, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVResolvePath ( self, absolute,
+        resolved, rsize, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVResolvePath ( const KDirectory_v1 *self, bool absolute,
+    char *resolved, size_t rsize, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcResolving, rcSelf, rcNull );
+
+    /* allow NULL buffers of 0 size */
+    if ( resolved == NULL && rsize != 0 )
+        return RC ( rcFS, rcDirectory, rcResolving, rcBuffer, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcResolving, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcResolving, rcPath, rcInvalid );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . resolve_path )
+            ( self, absolute, resolved, rsize, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcResolving, rcInterface, rcBadVersion );
+}
+
+/* ResolveAlias
+ *  resolves an alias path to its immediate target
+ *  NB - the resolved path may be yet another alias
+ *
+ *  "absolute" [ IN ] - if non-zero, always give a path starting
+ *  with '/'. NB - if the directory is chroot'd, the absolute path
+ *  will still be relative to directory root.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *  the resolved path will be directory relative
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting an object presumed to be an alias.
+ */
+LIB_EXPORT rc_t CC KDirectoryResolveAlias_v1 ( const KDirectory_v1 *self, bool absolute,
+    char *resolved, size_t rsize, const char *alias, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, alias );
+    rc = KDirectoryVResolveAlias ( self, absolute,
+        resolved, rsize, alias, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVResolveAlias ( const KDirectory_v1 *self, bool absolute,
+    char *resolved, size_t rsize, const char *alias, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcResolving, rcSelf, rcNull );
+
+    /* allow NULL buffers of 0 size */
+    if ( resolved == NULL && rsize != 0 )
+        return RC ( rcFS, rcDirectory, rcResolving, rcBuffer, rcNull );
+
+    if ( alias == NULL )
+        return RC ( rcFS, rcDirectory, rcResolving, rcPath, rcNull );
+    if ( alias [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcResolving, rcPath, rcInvalid );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . resolve_alias )
+            ( self, absolute, resolved, rsize, alias, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcResolving, rcInterface, rcBadVersion );
+}
+
+/* Rename
+ *  rename an object accessible from directory, replacing
+ *  any existing target object of the same type
+ *
+ *  "from" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ *
+ *  "to" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ */
+LIB_EXPORT rc_t CC KDirectoryRename_v1 ( KDirectory_v1 *self, bool force, const char *from, const char *to )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcRenaming, rcSelf, rcNull );
+
+    if ( from == NULL || to == NULL )
+        return RC ( rcFS, rcDirectory, rcRenaming, rcPath, rcNull );
+    if ( from [ 0 ] == 0 || to [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcRenaming, rcPath, rcInvalid );
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcDirectory, rcRenaming, rcDirectory, rcReadonly );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . rename ) ( self, force, from, to );
+    }
+
+    return RC ( rcFS, rcDirectory, rcRenaming, rcInterface, rcBadVersion );
+}
+
+/* Remove
+ *  remove an accessible object from its directory
+ *
+ *  "force" [ IN ] - if non-zero and target is a directory,
+ *  remove recursively
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT rc_t CC KDirectoryRemove_v1 ( KDirectory_v1 *self, bool force, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVRemove ( self, force, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVRemove ( KDirectory_v1 *self, bool force, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcRemoving, rcSelf, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcRemoving, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcRemoving, rcPath, rcInvalid );
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcDirectory, rcRemoving, rcDirectory, rcReadonly );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . remove ) ( self, force, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcRemoving, rcInterface, rcBadVersion );
+}
+
+/* ClearDir
+ *  remove all directory contents
+ *
+ *  "force" [ IN ] - if non-zero and directory entry is a
+ *  sub-directory, remove recursively
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+LIB_EXPORT rc_t CC KDirectoryClearDir_v1 ( KDirectory_v1 *self, bool force, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVClearDir ( self, force, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVClearDir ( KDirectory_v1 *self, bool force, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcRemoving, rcSelf, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcRemoving, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcRemoving, rcPath, rcInvalid );
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcDirectory, rcRemoving, rcDirectory, rcReadonly );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . clear_dir ) ( self, force, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcRemoving, rcInterface, rcBadVersion );
+}
+
+/* Access
+ *  get access to object
+ *
+ *  "access" [ OUT ] - return parameter for Unix access mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT rc_t CC KDirectoryAccess_v1 ( const KDirectory_v1 *self,
+    uint32_t *access, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVAccess ( self, access, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVAccess ( const KDirectory_v1 *self,
+    uint32_t *access, const char *path, va_list args )
+{
+    if ( access == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcParam, rcNull );
+
+    * access = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcSelf, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcInvalid );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . access ) ( self, access, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcBadVersion );
+}
+
+/* SetAccess
+ *  set access to object a la Unix "chmod"
+ *
+ *  "recurse" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ *
+ *  "access" [ IN ] and "mask" [ IN ] - definition of change
+ *  where "access" contains new bit values and "mask defines
+ *  which bits should be changed.
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT rc_t CC KDirectorySetAccess_v1 ( KDirectory_v1 *self, bool recurse,
+    uint32_t access, uint32_t mask, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVSetAccess ( self, recurse,
+        access, mask, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVSetAccess ( KDirectory_v1 *self, bool recurse,
+    uint32_t access, uint32_t mask, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcSelf, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcInvalid );
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcDirectory, rcReadonly );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        /* TBD - perhaps limit bits to lower 9 */
+        return ( * self -> vt -> v1 . set_access )
+            ( self, recurse, access, mask, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcUpdating, rcInterface, rcBadVersion );
+}
+
+/* Date
+ *  get date/time to object
+ *
+ *  "date" [ OUT ] - return parameter
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT rc_t CC KDirectoryDate_v1 ( const KDirectory_v1 *self,
+    KTime_t *date, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVDate ( self, date, path, args );
+    va_end ( args );
+
+    return rc;
+}
+LIB_EXPORT rc_t CC KDirectoryVDate ( const KDirectory_v1 *self,
+    KTime_t *date, const char *path, va_list args )
+{
+    if ( date == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcParam, rcNull );
+
+    * date = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcSelf, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcInvalid );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 1 )
+            return ( * self -> vt -> v1 . date ) ( self, date, path, args );
+        break;
+    }
+
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcBadVersion );
+}
+
+
+/* SetDate
+ *  set date to object
+ *
+ *  "recurse" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ *
+ *  "date" [ IN ] - new time and date for the object
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT rc_t CC KDirectorySetDate_v1 ( KDirectory_v1 *self, bool recurse,
+    KTime_t date, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVSetDate ( self, recurse,
+			      date, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVSetDate ( KDirectory_v1 *self, bool recurse,
+    KTime_t date, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcSelf, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcInvalid );
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcDirectory, rcReadonly );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        /* TBD - perhaps limit bits to lower 9 */
+        if ( self -> vt -> v1 . min >= 1 )
+            return ( * self -> vt -> v1 . setdate ) ( self, recurse, date, path, args );
+        break;
+    }
+
+    return RC ( rcFS, rcDirectory, rcUpdating, rcInterface, rcBadVersion );
+}
+
+
+/* CreateAlias
+ *  creates a path alias according to create mode
+ *
+ *  "access" [ IN ] - standard Unix directory access mode
+ *  used when "mode" has kcmParents set and alias path does
+ *  not exist.
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "targ" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target alias
+ */
+LIB_EXPORT rc_t CC KDirectoryCreateAlias_v1 ( KDirectory_v1 *self,
+    uint32_t access, KCreateMode mode,
+    const char *targ, const char *alias )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcSelf, rcNull );
+
+    if ( targ == NULL || alias == NULL )
+        return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcNull );
+    if ( targ [ 0 ] == 0 || alias [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcInvalid );
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcDirectory, rcReadonly );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . create_alias )
+            ( self, access, mode, targ, alias );
+    }
+
+    return RC ( rcFS, rcDirectory, rcUpdating, rcInterface, rcBadVersion );
+}
+
+/* OpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC KDirectoryOpenFileRead_v1 ( const KDirectory_v1 *self,
+    struct KFile const **f, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVOpenFileRead ( self, f, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVOpenFileRead ( const KDirectory_v1 *self,
+    struct KFile const **f, const char *path, va_list args )
+{
+    if ( f == NULL )
+        return RC ( rcFS, rcDirectory, rcOpening, rcFile, rcNull );
+
+    * f = NULL;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcOpening, rcSelf, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcInvalid );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . open_file_read ) ( self, f, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcOpening, rcInterface, rcBadVersion );
+}
+
+/* OpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC KDirectoryOpenFileWrite_v1 ( KDirectory_v1 *self,
+    struct KFile **f, bool update, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVOpenFileWrite ( self, f, update, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVOpenFileWrite ( KDirectory_v1 *self,
+    struct KFile **f, bool update, const char *path, va_list args )
+{
+    if ( f == NULL )
+        return RC ( rcFS, rcDirectory, rcOpening, rcFile, rcNull );
+
+    * f = NULL;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcOpening, rcSelf, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcInvalid );
+
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcDirectory, rcOpening, rcDirectory, rcReadonly );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . open_file_write )
+            ( self, f, update, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcOpening, rcInterface, rcBadVersion );
+}
+
+/* CreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC KDirectoryCreateFile_v1 ( KDirectory_v1 *self, struct KFile **f,
+    bool update, uint32_t access, KCreateMode mode, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVCreateFile ( self, f, update,
+        access, mode, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVCreateFile ( KDirectory_v1 *self, struct KFile **f,
+    bool update, uint32_t access, KCreateMode mode, const char *path, va_list args )
+{
+    if ( f == NULL )
+        return RC ( rcFS, rcDirectory, rcCreating, rcFile, rcNull );
+
+    * f = NULL;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcCreating, rcSelf, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcInvalid );
+
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcDirectory, rcCreating, rcDirectory, rcReadonly );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . create_file )
+            ( self, f, update, access, mode, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcCreating, rcInterface, rcBadVersion );
+}
+
+/* FileLocator
+ *  returns locator in bytes of target file
+ *
+ *  "locator" [ OUT ] - return parameter for file locator
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC KDirectoryFileLocator_v1 ( const KDirectory_v1 *self,
+    uint64_t *locator, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVFileLocator ( self, locator, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVFileLocator ( const KDirectory_v1 *self,
+    uint64_t *locator, const char *path, va_list args )
+{
+    if ( locator == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcParam, rcNull );
+
+    * locator = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcSelf, rcNull );
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcInvalid );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 2 )
+            return ( * self -> vt -> v1 . file_locator ) ( self, locator, path, args );
+        break;
+    }
+
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcBadVersion );
+}
+
+/* FileSize
+ *  returns size in bytes of target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC KDirectoryFileSize_v1 ( const KDirectory_v1 *self,
+    uint64_t *size, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVFileSize ( self, size, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVFileSize ( const KDirectory_v1 *self,
+    uint64_t *size, const char *path, va_list args )
+{
+    if ( size == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcParam, rcNull );
+
+    * size = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcSelf, rcNull );
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcInvalid );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . file_size ) ( self, size, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcBadVersion );
+}
+
+/* FilePhysicalSize
+ *  returns size in bytes of target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC KDirectoryFilePhysicalSize_v1 ( const KDirectory_v1 *self,
+    uint64_t *size, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVFilePhysicalSize ( self, size, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVFilePhysicalSize ( const KDirectory_v1 *self,
+    uint64_t *size, const char *path, va_list args )
+{
+    if ( size == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcParam, rcNull );
+
+    * size = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcSelf, rcNull );
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcInvalid );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 3 )
+            return ( * self -> vt -> v1 . file_phys_size ) ( self, size, path, args );
+        break;
+    }
+
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcBadVersion );
+}
+
+/* SetFileSize
+ *  sets size in bytes of target file
+ *
+ *  "size" [ IN ] - new file size
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC KDirectorySetFileSize_v1 ( KDirectory_v1 *self,
+    uint64_t size, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVSetFileSize ( self, size, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVSetFileSize ( KDirectory_v1 *self,
+    uint64_t size, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcSelf, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcInvalid );
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcDirectory, rcUpdating, rcDirectory, rcReadonly );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . set_size ) ( self, size, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcBadVersion );
+}
+
+/* FileContiguous
+ *  returns true if the file is "contiguous".  Chunked or sparse files are not
+ *  contiguous while most data files are.  Virtual generated files would likely
+ *  not be contiguous.  
+ *
+ *  "contiguous" [ OUT ] - return parameter for file contiguous
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC KDirectoryFileContiguous_v1 ( const KDirectory_v1 *self,
+    bool *contiguous, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVFileContiguous ( self, contiguous, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVFileContiguous ( const KDirectory_v1 *self,
+    bool *contiguous, const char *path, va_list args )
+{
+    if ( contiguous == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcParam, rcNull );
+
+    * contiguous = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcSelf, rcNull );
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcInvalid );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 3 )
+            return ( * self -> vt -> v1 . file_contiguous ) ( self, contiguous, path, args );
+        break;
+    }
+
+    return RC ( rcFS, rcDirectory, rcAccessing, rcInterface, rcBadVersion );
+}
+
+/* OpenDirRead
+ * KDirectoryOpenDirUpdate
+ *  opens a sub-directory
+ *
+ *  "chroot" [ IN ] - if non-zero, the new directory becomes
+ *  chroot'd and will interpret paths beginning with '/'
+ *  relative to itself.
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+LIB_EXPORT rc_t CC KDirectoryOpenDirRead_v1 ( const KDirectory_v1 *self,
+    const KDirectory_v1 **sub, bool chroot, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVOpenDirRead ( self, sub, chroot, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVOpenDirRead ( const KDirectory_v1 *self,
+    const KDirectory_v1 **sub, bool chroot, const char *path, va_list args )
+{
+    if ( sub == NULL )
+        return RC ( rcFS, rcDirectory, rcOpening, rcDirectory, rcNull );
+
+    * sub = NULL;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcOpening, rcSelf, rcNull );
+
+    if ( path == NULL || path [ 0 ] == 0 )
+        path = ".";
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . open_dir_read )
+            ( self, sub, chroot, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcOpening, rcInterface, rcBadVersion );
+}
+
+LIB_EXPORT rc_t CC KDirectoryOpenDirUpdate_v1 ( KDirectory_v1 *self,
+    KDirectory_v1 **sub, bool chroot, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVOpenDirUpdate ( self, sub, chroot, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVOpenDirUpdate ( KDirectory_v1 *self,
+    KDirectory_v1 **sub, bool chroot, const char *path, va_list args )
+{
+    if ( sub == NULL )
+        return RC ( rcFS, rcDirectory, rcOpening, rcDirectory, rcNull );
+
+    * sub = NULL;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcOpening, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        /* TODO: Maybe for writing wncbi-vdb we need to return RC */
+        return SILENT_RC ( rcFS, rcDirectory, rcOpening, rcDirectory, rcReadonly );
+
+    if ( path == NULL || path [ 0 ] == 0 )
+        path = ".";
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . open_dir_update )
+            ( self, sub, chroot, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcOpening, rcInterface, rcBadVersion );
+}
+
+/* CreateDir
+ *  create a sub-directory
+ *
+ *  "access" [ IN ] - standard Unix directory mode, e.g.0775
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+LIB_EXPORT rc_t CC KDirectoryCreateDir_v1 ( KDirectory_v1 *self,
+    uint32_t access, KCreateMode mode, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVCreateDir ( self, access, mode, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryVCreateDir ( KDirectory_v1 *self,
+    uint32_t access, KCreateMode mode, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcCreating, rcSelf, rcNull );
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcInvalid );
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcDirectory, rcCreating, rcDirectory, rcReadonly );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . create_dir ) ( self, access, mode, path, args );
+    }
+
+    return RC ( rcFS, rcDirectory, rcCreating, rcInterface, rcBadVersion );
+}
+
+/* Init
+ *  initialize a newly allocated directory object
+ */
+LIB_EXPORT rc_t CC KDirectoryInit_v1 ( KDirectory_v1 *self, const KDirectory_vt *vt,
+    const char * class_name, const char * path, bool update )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDirectory, rcConstructing, rcSelf, rcNull );
+    if ( vt == NULL )
+        return RC ( rcFS, rcDirectory, rcConstructing, rcInterface, rcNull );
+    switch ( vt -> v1 . maj )
+    {
+    case 0:
+        return RC ( rcFS, rcDirectory, rcConstructing, rcInterface, rcInvalid );
+    case 1:
+        switch ( vt -> v1 . min )
+        {
+            /* ADD NEW MINOR VERSION CASES HERE */
+        case 3:
+#if _DEBUGGING
+            if ( vt -> v1 . file_phys_size == NULL )
+                return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcNull );
+#endif
+            /* no break */
+        case 2:
+#if _DEBUGGING
+            if ( vt -> v1 . file_locator == NULL )
+                return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcNull );
+#endif
+            /* no break */
+        case 1:
+#if _DEBUGGING
+            if ( vt -> v1 . get_sysdir == NULL      ||
+                 vt -> v1 . setdate == NULL         ||
+                 vt -> v1 . date == NULL )
+                return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcNull );
+#endif
+            /* no break */
+        case 0:
+#if _DEBUGGING
+            /* vt -> v1 . destroy_file CAN be NULL */
+            if ( vt -> v1 . create_dir == NULL      ||
+                 vt -> v1 . open_dir_update == NULL ||
+                 vt -> v1 . open_dir_read == NULL   ||
+                 vt -> v1 . set_size == NULL        ||
+                 vt -> v1 . file_size == NULL       ||
+                 vt -> v1 . create_file == NULL     ||
+                 vt -> v1 . open_file_write == NULL ||
+                 vt -> v1 . open_file_read == NULL  ||
+                 vt -> v1 . create_alias == NULL    ||
+                 vt -> v1 . set_access == NULL      ||
+                 vt -> v1 . access == NULL          ||
+                 vt -> v1 . clear_dir == NULL       ||
+                 vt -> v1 . remove == NULL          ||
+                 vt -> v1 . rename == NULL          ||
+                 vt -> v1 . resolve_alias == NULL   ||
+                 vt -> v1 . resolve_path == NULL    ||
+                 vt -> v1 . path_type == NULL       ||
+                 vt -> v1 . visit_update == NULL    ||
+                 vt -> v1 . visit == NULL           ||
+                 vt -> v1 . list_dir == NULL        ||
+                 vt -> v1 . destroy == NULL )
+                return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcNull );
+#endif
+            break;
+        default:
+            return RC ( rcFS, rcDirectory, rcConstructing, rcInterface, rcBadVersion );
+        }
+        break;
+    default:
+        return RC ( rcFS, rcDirectory, rcConstructing, rcInterface, rcBadVersion );
+    }
+
+    self -> vt = vt;
+    self -> read_only = ( uint8_t ) ( update == 0 );
+
+
+    KRefcountInit ( &self->refcount, 1, class_name, "init", path );
+
+    return 0;
+}
+
+/* DestroyFile
+ *  does whatever is necessary with an unreferenced file
+ */
+LIB_EXPORT rc_t CC KDirectoryDestroyFile_v1 ( const KDirectory_v1 *self, KFile *f )
+{
+    const KDirectory_vt *vt = self -> vt;
+    switch ( vt -> v1 . maj )
+    {
+    case 1:
+        if ( vt -> v1 . destroy_file != NULL )
+            return ( * vt -> v1 . destroy_file ) ( ( KDirectory_v1* ) self, f );
+        return KFileDestroy_v1 ( f );
+    }
+
+    return RC ( rcFS, rcDirectory, rcDestroying, rcInterface, rcBadVersion );
+}
+
+/* GetSysDir
+ *  returns an underlying system file object
+ */
+LIB_EXPORT struct KSysDir_v1* CC KDirectoryGetSysDir_v1 ( const KDirectory_v1 *self )
+{
+    if ( self != NULL )
+    {
+        switch ( self -> vt -> v1 . maj )
+        {
+        case 1:
+            if ( self -> vt -> v1 . min > 0 )
+                return ( * self -> vt -> v1 . get_sysdir ) ( self );
+            break;
+        }
+    }
+    return NULL;
+}
+
+
+static rc_t copy_loop( const KFile *src, KFile *dst, size_t bsize )
+{
+    rc_t rc = 0;
+    uint64_t pos = 0;
+    size_t num_read = 1;
+
+    char * buffer = malloc( bsize );
+    if ( buffer == NULL )
+        return RC( rcFS, rcDirectory, rcCopying, rcMemory, rcExhausted );
+
+    while ( rc == 0 && num_read > 0 )
+    {
+        rc = KFileRead ( src, pos, buffer, bsize, &num_read );
+        if ( rc == 0 && num_read > 0 )
+        {
+            size_t num_writ;
+            rc = KFileWrite ( dst, pos, buffer, num_read, &num_writ );
+            pos += num_read;
+        }
+    }
+    free( buffer );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryCopyPath ( const KDirectory_v1 *src_dir,
+    KDirectory_v1 *dst_dir, const char *src_path, const char * dst_path )
+{
+    rc_t rc;
+    struct KFile const *f_src;
+
+    if ( src_dir == NULL || dst_dir == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcSelf, rcNull );
+    if ( src_path == NULL || dst_path == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcParam, rcNull );
+
+    rc = KDirectoryOpenFileRead ( src_dir, &f_src, "%s", src_path );
+    if ( rc == 0 )
+    {
+        uint32_t pt = KDirectoryPathType ( dst_dir, "%s", dst_path );
+        switch( pt )
+        {
+            case kptFile : ; /* intentional fall through! */
+            case kptDir  : rc = KDirectoryRemove ( dst_dir, true, "%s", dst_path ); break;
+        }
+        if ( rc == 0 )
+        {
+            struct KFile *f_dst;
+            uint32_t access = 0664;
+            rc = KDirectoryCreateFile ( dst_dir, &f_dst, false, access, kcmCreate, "%s", dst_path );
+            if ( rc == 0 )
+            {
+                rc = copy_loop( f_src, f_dst, 1024 * 16 );
+            }
+        }
+    }
+    return rc;
+}
+
+
+static rc_t build_obj_path( char **s, const char *path, const char * objname )
+{
+    rc_t rc;
+    size_t lp = string_size( path );
+    size_t l = lp + string_size( objname ) + 2;
+    *s = malloc( l );
+    if ( *s == NULL )
+        rc = RC( rcFS, rcDirectory, rcCopying, rcMemory, rcExhausted );
+    else
+    {
+        size_t written;
+        const char * concat = ( ( path[ lp - 1 ] == '/' ) ? "%s%s" : "%s/%s" );
+        rc = string_printf( *s, l, &written, concat, path, objname );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryCopyPaths( const KDirectory_v1 * src_dir,
+    KDirectory_v1 * dst_dir, bool recursive, const char *src, const char *dst )
+{
+    rc_t rc;
+    struct KNamelist *list;
+
+    if ( src_dir == NULL || dst_dir == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcSelf, rcNull );
+    if ( src == NULL || dst == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcParam, rcNull );
+
+    rc = KDirectoryList ( src_dir, &list, NULL, NULL, "%s", src );
+    if ( rc == 0 )
+    {
+        uint32_t pt = KDirectoryPathType ( dst_dir, "%s", dst );
+        /* if the output-directory does not exist: create it! */
+        switch( pt )
+        {
+            case kptFile : rc = KDirectoryRemove ( dst_dir, true, "%s", dst );
+                            /* intentially no break ! */
+
+            case kptNotFound : if ( rc == 0 )
+                                    rc = KDirectoryCreateDir ( dst_dir, 0775, kcmCreate | kcmParents, "%s", dst );
+                               break;
+        }
+        if ( rc == 0 )
+        {
+            uint32_t i, n;
+            rc = KNamelistCount ( list, &n );
+            for ( i = 0; i < n && rc == 0; ++i )
+            {
+                const char *name;
+                rc = KNamelistGet ( list, i, &name );
+                if ( rc == 0 )
+                {
+                    char *src_obj;
+                    rc = build_obj_path( &src_obj, src, name );
+                    if ( rc == 0 )
+                    {
+                        char *dst_obj;
+                        rc = build_obj_path( &dst_obj, dst, name );
+                        if ( rc == 0 )
+                        {
+                            pt = KDirectoryPathType ( src_dir, "%s", src_obj );
+                            switch( pt )
+                            {
+                                case kptFile : rc = KDirectoryCopyPath ( src_dir, dst_dir, src_obj, dst_obj );
+                                               break;
+
+                                case kptDir  : if ( recursive )
+                                                    rc = KDirectoryCopyPaths( src_dir, dst_dir, true, src_obj, dst_obj );
+                                               break;
+                            }
+                            free( dst_obj );
+                        }
+                        free( src_obj );
+                    }
+                }
+            }
+        }
+        KNamelistRelease ( list );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryCopy( const KDirectory_v1 * src_dir,
+    KDirectory_v1 * dst_dir, bool recursive, const char *src, const char *dst )
+{
+    rc_t rc = 0;
+    uint32_t pt;
+
+    if ( src_dir == NULL || dst_dir == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcSelf, rcNull );
+    if ( src == NULL || dst == NULL )
+        return RC ( rcFS, rcDirectory, rcCopying, rcParam, rcNull );
+
+    pt = KDirectoryPathType ( src_dir, "%s", src );
+    switch( pt )
+    {
+        case kptFile : rc = KDirectoryCopyPath ( src_dir, dst_dir, src, dst );
+                        break;
+        case kptDir  : rc = KDirectoryCopyPaths ( src_dir, dst_dir, recursive, src, dst );
+                        break;
+    }
+    return rc;
+}
diff --git a/libs/kfs/extendable-ramfile.c b/libs/kfs/extendable-ramfile.c
new file mode 100644
index 0000000..70e1535
--- /dev/null
+++ b/libs/kfs/extendable-ramfile.c
@@ -0,0 +1,280 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+
+#include <kfs/extendable-ramfile.h>
+#include <kfs/file.h>
+
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <string.h>
+
+/* ======================================================================
+ * KExtendableRamFile
+ */
+
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+typedef struct KExtendableRamFile KExtendableRamFile;
+#define KFILE_IMPL struct KExtendableRamFile
+#include <kfs/impl.h>
+
+/*-----------------------------------------------------------------------
+ * KExtendableRamFile
+ *  A KFile that puts reads and writes into a buffer.
+ *  The buffer can be realloced if necessary.
+ */
+struct KExtendableRamFile {
+    KFile	dad;
+
+    uint64_t pos;
+    size_t   bsize;
+    char *   buffer;
+};
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *
+ */
+static
+rc_t CC KExtendableRamFileDestroy (KExtendableRamFile *self)
+{
+    free(self->buffer);
+    memset(self, 0, sizeof *self);
+    free(self);
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or RAM if
+ *  no such file is available.
+ *
+ * We cant allow memory mapping a tee file as the read?writes ar needed
+ * to trigger the writes to the copy KFile
+ */
+
+static struct KSysFile *CC KExtendableRamFileGetSysFile(
+    const KExtendableRamFile *self, uint64_t *offset)
+{
+    return NULL;
+}
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ *  returns 0 if random access, error code otherwise
+ *
+ * Update needs to be able to seek both original and copy while read
+ * only needs to be able to seek the original.
+ */
+static rc_t CC KExtendableRamFileRandomAccess (const KExtendableRamFile *self) {
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KExtendableRamFileType (const KExtendableRamFile *self)
+{
+    return kfdNull;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KExtendableRamFileSize (const KExtendableRamFile *self, uint64_t *size)
+{
+    assert (self != NULL);
+    assert (size != NULL);
+
+    *size = self->pos;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KExtendableRamFileSetSize(KExtendableRamFile *self, uint64_t size)
+{
+    return RC(rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, RAM OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ *
+ * NOTE: Can not seek;
+ *
+ */
+static rc_t CC KExtendableRamFileRead(const KExtendableRamFile *self,
+    uint64_t pos, void *buffer, size_t bsize, size_t *num_read)
+{
+    assert (self);
+    assert (buffer);
+    assert (num_read);
+    /* no restrictions on pos or bsize */
+
+    if (pos >= self->pos)
+    {
+        *num_read = 0;
+        return 0;
+    }
+
+    if (pos + bsize > self->pos)
+        bsize = self->pos - pos;
+
+    memmove(buffer, self->buffer + pos, bsize);
+
+    *num_read = bsize;
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, RAM OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ * Always accepts writes and can seek.
+ */
+static rc_t CC KExtendableRamFileWrite(KExtendableRamFile *self,
+    uint64_t pos, const void *buffer, size_t bsize, size_t *num_writ)
+{
+    assert (self);
+    assert (buffer);
+    assert (num_writ);
+
+    /* if buffer big enough? */
+    if (self->pos + bsize > self->bsize)
+    {
+        char *tmp = NULL;
+        size_t req = self->bsize;
+        while (req < self->pos + bsize) {
+            req += self->bsize;
+        }
+        tmp = realloc(self->buffer, req);
+        if (tmp == NULL) {
+            return RC(rcFS, rcFile, rcWriting, rcMemory, rcExhausted);
+        }
+        self->buffer = tmp;
+        self->bsize = req;
+    }
+
+    memmove(self->buffer + self->pos, buffer, bsize);
+    self->pos += bsize;
+    *num_writ = bsize;
+
+    return 0;
+}
+
+static const KFile_vt_v1 vtKExtendableRamFile =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KExtendableRamFileDestroy,
+    KExtendableRamFileGetSysFile,
+    KExtendableRamFileRandomAccess,
+    KExtendableRamFileSize,
+    KExtendableRamFileSetSize,
+    KExtendableRamFileRead,
+    KExtendableRamFileWrite,
+
+    /* 1.1 */
+    KExtendableRamFileType
+};
+
+/* ----------------------------------------------------------------------
+ * KExtendableRamFileMake
+ *  create a new file object
+ */
+LIB_EXPORT rc_t CC KExtendableRamFileMake(KFile **pself) {
+    size_t buffer_size = 1; /* TODO: set it to something good */
+    rc_t rc = 0;
+    KExtendableRamFile *self = NULL;
+
+    if (pself == NULL)
+        return RC(rcFS, rcFile, rcConstructing, rcSelf, rcNull);
+
+    if (buffer_size == 0)
+        ++buffer_size;
+
+    /* ----- get space for the object */
+    self = calloc(1, sizeof *self);
+    if (self == NULL) {
+        return RC(rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+    }
+    self->buffer = calloc(1, buffer_size);
+    if (self->buffer == NULL) {
+        free(self);
+        return RC(rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+    }
+    rc = KFileInit(&self->dad,			/* initialize base class */
+        (const KFile_vt*)&vtKExtendableRamFile,/*VTable for KExtendableRamFile*/
+        "KExtendableRamFile", "ExtendableRAM", true, true);
+    if (rc != 0) {
+        free(self->buffer);
+        free(self);
+        return rc;
+    }
+    self->bsize = buffer_size;
+    *pself = &self->dad;
+    return 0;
+}
diff --git a/libs/kfs/ffext.c b/libs/kfs/ffext.c
new file mode 100644
index 0000000..9cca43e
--- /dev/null
+++ b/libs/kfs/ffext.c
@@ -0,0 +1,812 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/container.h>
+#include <kfs/fileformat.h>
+#include "fileformat-priv.h"
+struct KExtFileFormat;
+#define KFILEFORMAT_IMPL struct KExtFileFormat
+#include "impl.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <stdio.h>
+
+struct KDirectory;
+
+typedef
+struct KExtNode
+{
+    BSTNode		node;
+    atomic32_t 		refcount;
+    KFileFormatType	typeid;
+    size_t		kfflen;
+    size_t		extlen;
+    char *		extdescr;
+    char		kffdescr [1];
+} KExtNode;
+
+static
+rc_t KExtNodeDestroy (const KExtNode * cself)
+{
+    rc_t rc = 0;
+    KExtNode * self = (KExtNode*)cself;
+
+    FUNC_ENTRY();
+
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcDestroying, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KExtNodeDestroy: self == NULL");
+    }
+    else
+    {
+
+        /* memory leak?  do we need to release KFFTables? */
+
+
+	free (self);
+    }
+    return rc;
+}
+
+static
+rc_t KExtNodeRelease (const KExtNode * cself)
+{
+    rc_t rc = 0;
+    FUNC_ENTRY();
+
+    if (cself != NULL)
+    {
+        KExtNode *self = (KExtNode*)cself;
+        if (atomic32_dec_and_test (&self->refcount))
+            return  KExtNodeDestroy (cself);
+    }
+    return rc;
+}
+/* not used at this time */
+#if 0
+static
+rc_t KExtNodeAddRef (const KExtNode * self)
+{
+    rc_t rc = 0;
+    FUNC_ENTRY();
+
+    if (self != NULL)
+        atomic32_inc (&((KFileFormat*)self)->refcount);
+    return rc;
+}
+#endif
+static
+rc_t KExtNodeMake (KExtNode ** kmmp, const KFFTables * tables,
+		     const char * extdescr, size_t extlen,
+		     const char * kffdescr, size_t kfflen)
+
+{
+    KExtNode * self;
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+
+    if (extdescr == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcNull);
+	LOGERR (klogErr, rc, "KExtNodeMake: extdescr == NULL");
+    }
+    else if (kffdescr == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcNull);
+	LOGERR (klogErr, rc, "KKffNodeMake: kffdescr == NULL");
+    }
+    else
+    {
+	if (extlen > DESCRLEN_MAX)
+	{
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcInvalid);
+	    LOGERR (klogErr, rc, "KExtNodeMake: extdescr too long");
+	}
+	else if (extlen == 0)
+	{
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcEmpty);
+	    LOGERR (klogErr, rc, "KExtNodeMake: extdescr too short");
+	}
+	else if (kfflen > DESCRLEN_MAX)
+	{
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcInvalid);
+	    LOGERR (klogErr, rc, "KKffNodeMake: kffdescr too long");
+	}
+	else if (kfflen == 0)
+	{
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcEmpty);
+	    LOGERR (klogErr, rc, "KKffNodeMake: kffdescr too short");
+	}
+	else
+	{
+	    KFileFormatType typeid;
+	    rc = KFFTablesGetTypeId (tables, kffdescr, &typeid, NULL);
+	    if (rc == 0)
+	    {
+		self = malloc (sizeof (*self) + extlen + kfflen + 1);
+		if (self == NULL)
+		{
+		    rc = RC (rcFF,  rcIndex, rcConstructing, rcMemory, rcExhausted);
+		    LOGERR (klogErr, rc, "KExtNodeMake: self could not be allocated");
+		}
+		else
+		{
+		    atomic32_set (&self->refcount,1);
+		    self->typeid = typeid;
+		    self->kfflen = kfflen;
+		    self->extlen = extlen;
+		    self->extdescr = self->kffdescr + kfflen + 1;
+		    memmove (self->kffdescr, kffdescr, kfflen);
+		    memmove (self->extdescr, extdescr, extlen);
+		    self->kffdescr[self->kfflen] = '\0';
+		    self->extdescr[self->extlen] = '\0';
+		    *kmmp = self;
+		    return 0;
+		}
+	    }
+	}
+    }
+    return rc;
+}
+
+
+/* -------------------------
+ *
+ */
+typedef
+struct KExtTable
+{
+    atomic32_t 	refcount;
+    BSTree	tree;
+} KExtTable;
+
+static
+void KExtNodeWhack (BSTNode * n, void * ignored)
+{
+    FUNC_ENTRY();
+
+    (void)KExtNodeRelease((KExtNode*)n);
+}
+static
+rc_t KExtTableDestroy (KExtTable * cself)
+{
+    rc_t rc;
+    KExtTable * self;
+
+    FUNC_ENTRY();
+
+    rc = 0;
+    self = (KExtTable*)cself;
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcTable, rcDestroying, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KExtTableDestroy: self == NULL");
+    }
+    else
+    {
+	BSTreeWhack (&self->tree, KExtNodeWhack, NULL);
+	free (self);
+    }
+    return rc;
+}
+static
+rc_t KExtTableRelease (const KExtTable * cself)
+{
+    rc_t rc = 0;
+    FUNC_ENTRY();
+
+    if (cself != NULL)
+    {
+	KExtTable *self = (KExtTable*)cself;
+        if (atomic32_dec_and_test (&self->refcount))
+	    return  KExtTableDestroy (self);
+    }
+    return rc;
+}
+#if 0
+static /* not used at this time */
+rc_t KExtTableAddRef (const KExtTable * self)
+{
+    rc_t rc = 0;
+    FUNC_ENTRY();
+
+    if (self != NULL)
+        atomic32_inc (& ((KFileFormat*) self)->refcount);
+    return rc;
+}
+#endif
+static
+rc_t KExtTableMake (KExtTable ** kmmtp)
+{
+    KExtTable * self;
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    self = malloc (sizeof *self);
+    if (self == NULL)
+    {
+        rc = RC (rcFF, rcTable, rcConstructing, rcParam, rcNull);
+        LOGERR (klogErr, rc, "KExtTableMake: self could not be allocated");
+    }
+    else
+    {
+        atomic32_set (&self->refcount,1);
+        BSTreeInit (&self->tree);
+        *kmmtp = self;
+    }
+    return rc;
+}
+
+static
+int64_t KExtNodeCmp (const void* item, const BSTNode * n)
+{
+    size_t len;
+    KExtNode * mn = (KExtNode *)n;
+    String *s = ( String * ) item;
+
+    FUNC_ENTRY();
+
+    /* -----
+     * we only check this many characters of the comparison item
+     * we need only this part to match and ignore characters after
+     * this in the comparison string
+     */
+    len = mn->extlen;
+    return strcase_cmp ( s -> addr, s -> len , mn->extdescr, len, len );
+}
+
+static
+rc_t KExtTableFind (KExtTable * self, KExtNode ** node, const char * str)
+{
+    rc_t rc = 0;
+    String s;
+
+    FUNC_ENTRY();
+
+    StringInitCString ( &s, str );
+
+    *node = (KExtNode*)BSTreeFind (&self->tree, &s, KExtNodeCmp);
+    if (*node == NULL)
+    {
+/* 	rc = RC (rcFF, rcTable, rcSearching, rcNode, rcNotFound); */
+        KFF_DEBUG (("%s: Could not find %s\n", __func__, str));
+    }
+    return rc;
+}
+/* maxlen includes the terminating NUL */
+#if 0 /* not in use at this time */
+static
+rc_t KExtTableFindKFFDescr (KExtTable * self, const char * str, char * kff, size_t maxlen)
+{
+    rc_t rc;
+    KExtNode * np;
+
+    FUNC_ENTRY();
+
+
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcFileFormat, rcSearching, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KExtTableFindKFFDecr:self == NULL");
+	return rc;
+    }
+    if (str == NULL)
+    {
+	rc = RC (rcFF, rcFileFormat, rcSearching, rcParam, rcNull);
+	LOGERR (klogErr, rc, "KExtTableFindKFFDecr: searchstring is NULL");
+	return rc;
+    }
+    if (kff == NULL)
+    {
+	rc = RC (rcFF, rcFileFormat, rcSearching, rcParam, rcNull);
+	LOGERR (klogErr, rc, "KExtTableFindKFFDecr: found storage is NULL");
+	return rc;
+    }
+    rc = KExtTableFind (self, &np, str);
+    if (maxlen <= np->kfflen) /* kfflen does not include NUL */
+    {
+	rc = RC (rcFF, rcFileFormat, rcSearching, rcParam, rcTooLong);
+	LOGERR (klogErr, rc, "KExtTableFindKFFDecr: found storage is NULL");
+	return rc;
+    }
+    memmove (kff, np->kffdescr, np->kfflen);
+    kff[np->kfflen] = '\0';
+    return rc;
+}
+#endif
+static
+int64_t KExtNodeSort (const BSTNode* item, const BSTNode * n)
+{
+    KExtNode *n1 = ( KExtNode * ) item;
+    KExtNode *n2 = ( KExtNode * ) n;
+
+    FUNC_ENTRY();
+
+    return strcase_cmp ( n1 -> extdescr, n1 -> extlen, 
+                         n2 -> extdescr, n2 -> extlen, n2 -> extlen );
+}
+static
+rc_t KExtTableInsert (KExtTable * self, KExtNode *node)
+{
+
+    FUNC_ENTRY();
+
+    return (BSTreeInsert (&self->tree, &node->node, KExtNodeSort));
+}
+/* not is use at this time */
+#if 0
+static
+rc_t KExtTableBufferRead (KExtTable * self, KFFTables * tables,
+			    const char * buff, size_t bufflen)
+{
+    rc_t rc = 0;
+    const char * kff;
+    const char * ext;
+    const char * nl;
+    size_t kfflen;
+    size_t extlen;
+
+
+    FUNC_ENTRY();
+
+
+    /* -----
+     * until we get all the way through the buffer
+     * which by this coding could actually be all blank
+     */
+    while (bufflen)
+    {
+	ext = buff;
+	/* -----
+	 * allow leading white space including blank lines
+	 */
+	if (isspace (*ext))	
+	{
+	    buff++;
+	    bufflen --;
+	    continue;
+	}
+	/* -----
+	 * not a comment line so find the tab splitting the sections
+	 */
+	kff = memchr (ext, '\t', bufflen);
+	if (kff == NULL)
+	{
+	    /* couldn't find it so blae the document and quit */
+	bad_line:
+	    rc = RC (rcFF, rcBuffer, rcParsing, rcFormat, rcCorrupt);
+	    /* log error */
+	    bufflen = 0;
+	    continue;
+	}
+	/* -----
+	 * the ext portion of the line is from the first non-white space
+	 * through the character before the tab.
+	 */
+	extlen = kff - ext;
+	bufflen -= extlen + 1;
+	kff++; /* point past the tab */
+	while (bufflen) /* skip white space */
+	{
+	    if (*kff == '\n') /* end of line now is a format error */
+	    {
+		goto bad_line;
+	    }
+	    if (!isspace (*kff)) /* break at non shite space character */
+		break;
+	    bufflen --;
+	    kff ++;
+	}
+	if (bufflen == 0) /* no kff descr */
+	    goto bad_line;
+	nl = memchr (kff, '\n', bufflen);
+	if (nl == NULL) /* no EOL but last line in buffer */
+	{
+	    kfflen = bufflen;
+	    bufflen = 0;
+	}
+	else /* not last unfinished line */
+	{
+	    kfflen = nl - ext;
+	    bufflen -= kfflen + 1;
+	    buff = nl + 1;
+	}
+	{
+	    KExtNode * np;
+	    rc = KExtNodeMake (&np, tables, ext, extlen,
+				 kff, kfflen);
+	    if (rc != 0)
+	    {
+		/* LOG ERR */
+		break;
+	    }
+	}
+    }
+    ( break;
+	    }
+	}
+    }
+    return rc;
+}
+#endif
+/* not used at this time */
+#if 0
+LIB_EXPORT rc_t CC KExtTableRead (KExtTable * self, const KFile * file))
+{
+    rc_t rc = 0;
+    /* setup KMMap */
+    /* call KExtTableBufferRead */
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KExtTableWrite (const KExtTable * self, KFile * file)
+{
+    rc_t rc = 0;
+
+    return rc;
+}
+#endif
+/* -----
+ * format is
+ * whitechar := {' '|'\f'|'\t'|'\v'}
+ * whitespace := whitechar*
+ * ext-str = !whitespace!{'\t'|'\n'}*
+ * kff-str = !whitespace!{'\t'|'\n'}*
+ *
+ * A line is 
+ * [<whitespace>]#<comment line skipped>\n
+ * Or 
+ * [<whitespace>]<ext-str>\t[<whitespace>]<kff-str>\n
+ * Or
+ * [<whitespace>]\n
+ *
+ * NOTE: whitespace at the right end of the two strings is included in the strings
+ * NOTE: We do not look for '\v'|'\f' within the strings though we maybe should
+ * NOTE: the ext string definitely allows white space and punctuation
+ */
+static
+rc_t KExtTableInit (KExtTable * self, const KFFTables * tables, const char * buffer, size_t len)
+{
+    rc_t rc = 0;
+    const char * ext;
+    const char * kff;
+    const char * tab;
+    const char * newline;
+    const char * line;
+    const char * limit;
+    KExtNode * node;
+    
+    FUNC_ENTRY();
+    
+    /* moved this block of code from the bottom of the function
+       to assure that this node is always created */
+	char unknown[] = "Unknown";
+    
+	rc = KExtNodeMake (&node, tables, unknown, sizeof (unknown) - 1, unknown, sizeof (unknown) - 1);
+	if (rc != 0)
+	{
+	    LOGERR (klogFatal, rc, "Failure to make node");
+        return rc;
+	}
+
+    rc = KExtTableInsert(self, node);
+    if (rc != 0)
+    {
+        LOGERR (klogFatal, rc, "Failure to insert node");
+	    return rc;
+	}
+    
+    /* -----
+     * we try to go all the way through the buffer line by line
+     * which by this coding could actually be all blank
+     */
+    limit = buffer + len;
+    for (line = buffer; line < limit; line = newline+1)
+    {
+        for (ext = line; isspace (*ext); ext++, len--)
+        {
+            if (len == 0) /* last of the file was all whitespace so quit */
+                break;
+        }
+        newline = memchr (ext, '\n', len);
+        if (newline == NULL)
+            newline = ext + len;
+        /* -----
+         * If the first character on the line is #
+         * we treat it as a comment (matches sh/bash/libext/etc.
+         */
+        if (*ext == '#')
+        {
+            /* -----
+             * skip this line
+             */
+            len -= newline+1 - ext;
+            continue;
+        }
+        
+        tab = memchr (ext, '\t', len);
+        if (tab == NULL)
+        {
+            rc = RC (rcFF, rcFileFormat, rcConstructing, rcFile, rcInvalid);
+            LOGERR (klogFatal, rc, "No <TAB> between ext and kff");
+            break;
+        }
+        kff = tab + 1;
+        for (len -= kff - ext;
+             isspace (*kff);
+             len--, kff++)
+        {
+            if (len == 0)
+            {
+                rc = RC (rcFF, rcFileFormat, rcConstructing, rcFile, rcInvalid);
+                LOGERR (klogFatal, rc, "No kff after <TAB>");
+                break;
+            }
+        }
+        if (newline == kff)
+        {
+            rc = RC (rcFF, rcFileFormat, rcConstructing, rcFile, rcInvalid);
+            LOGERR (klogFatal, rc, "No kff after whitespace");
+            break;
+        }
+        len -= newline+1 - kff;
+        rc = KExtNodeMake (&node, tables, ext, tab-ext, kff, newline-kff);
+        if (rc != 0)
+        {
+            LOGERR (klogFatal, rc, "Failure to make node");
+            break;
+        }
+        rc = KExtTableInsert(self, node);
+        if (rc != 0)
+        {
+            LOGERR (klogFatal, rc, "Failure to insert node");
+            break;
+        }
+    }
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KExtFileFormat
+ *  a file content (format) categorizer
+ */
+
+typedef
+struct KExtFileFormat
+{
+    KFileFormat	  dad;
+    KExtTable * table;
+} KExtFileFormat;
+
+static rc_t KExtFileFormatDestroy (KExtFileFormat *self);
+static rc_t KExtFileFormatGetTypeBuff (const KExtFileFormat *self,
+				       const void * buff, size_t buff_len,
+				       KFileFormatType * type,
+				       KFileFormatClass * class,
+				       char * description,
+				       size_t descriptionmax,
+				       size_t * descriptionlength);
+static rc_t KExtFileFormatGetTypePath (const KExtFileFormat *self,
+				       const struct  KDirectory * dir, const char * path,
+				       KFileFormatType * type,
+				       KFileFormatClass * class,
+				       char * description,
+				       size_t descriptionmax,
+				       size_t * descriptionlength);
+static
+KFileFormat_vt_v1 vt_v1 =
+{
+    1, 1, /* maj, min */
+    KExtFileFormatDestroy,
+    KExtFileFormatGetTypeBuff,
+    KExtFileFormatGetTypePath
+};
+
+
+
+/* Destroy
+ *  destroy FileFormat
+ */
+static
+rc_t KExtFileFormatDestroy (KExtFileFormat *self)
+{
+    FUNC_ENTRY();
+    rc_t rc = KFFTablesRelease (self->dad.tables);
+    {
+        rc_t rc2 = KExtTableRelease (self->table);
+        if (rc == 0)
+            rc = rc2;
+    }
+    free (self);
+    return 0;
+}
+
+/* Type
+ *  returns a KExtFileFormatDesc
+ *  [OUT] rc_t               return
+ *  [IN]  const KExtFileFormat *  self         
+ *  [IN]  void **            buffer       buffer to hold returned description
+ *  [IN]  size_t             buffer_size  size of the buffer
+ *  [OUT] char **            descr        text description of file type
+ *  [IN]  size_t             descr_max    maximum size of string descr can hold
+ *  [OUT] size_t *           descr_len    length of returned descr (not including NUL
+ */
+static
+rc_t CC KExtFileFormatGetTypeBuff (const KExtFileFormat *self, const void * buff, size_t buff_len,
+				KFileFormatType * type, KFileFormatClass * class,
+				char * descr, size_t descr_max, size_t *descr_len)
+{
+
+    FUNC_ENTRY();
+
+    return RC (rcFF, rcFileFormat, rcSearching, rcFormat, rcUnsupported);
+}
+
+
+static
+rc_t CC KExtFileFormatGetTypePath (const KExtFileFormat *self,
+                                const struct KDirectory * dir_ignored, const char * path,
+                                KFileFormatType * type, KFileFormatClass * class,
+                                char * descr, size_t descr_max, size_t *descr_len)
+{
+    rc_t rc = 0;
+    const char * b;
+    const char * s;
+    size_t size;
+
+
+    FUNC_ENTRY();
+
+
+    if (type != NULL)
+	*type = kfftError;
+    if (class != NULL)
+	*class = kffcError;
+
+    s = strrchr (path, '/');
+    if (s == NULL)
+	s = path;
+
+
+    b = strrchr (s, '.');
+    if (b == NULL)
+	b = path + string_measure(path, &size) - 1; /* will be an empty string when calls KExtTableFind */
+    {
+	KExtNode * node;
+	size_t c;
+
+        KFF_DEBUG (("%s: extension is %s\n", __func__, b+1));
+#if 1
+ 	rc = KExtTableFind (self->table, &node, ++b);
+	if (rc == 0)
+	{
+	    KFileFormatClass cid;
+	    KFileFormatType tid;
+	    if (node == NULL)
+		rc = KExtTableFind (self->table, &node, "Unknown");
+	    if (rc == 0)
+		rc = KFFTablesGetTypeId (self->dad.tables, node->kffdescr, &tid, &cid);
+	    if (rc == 0)
+	    {
+		c = node->kfflen;
+		if (c > descr_max)
+		    c = descr_max-1;
+		if (descr)
+		    string_copy (descr, descr_max, node->kffdescr, c);
+		descr[c] = '\0';
+		if (descr_len)
+		    *descr_len = c;
+		if (type)
+		    *type = tid;
+		if (class)
+		    *class = cid;
+	    }
+	}
+	if (rc != 0)
+	{
+	    if (descr_len != NULL)
+		*descr_len = 0;
+	    if (type != NULL)
+		*type = kfftNotFound;
+	    if (class != NULL)
+		*class = kffcNotFound;
+	}	
+
+
+#else
+	size_t l = string_measure (b, &size);
+	if (desc != NULL)
+	{
+	    string_copy (desc, desc_max, b, l);
+	    if (desc_max < l)
+		desc[desc_max-1] = 0;
+	}
+	if (descr_len != NULL)
+	    *descr_len = l;
+	if (type != NULL)
+	    *type = kfftUnknown;
+	if (class != NULL)
+	    *class = kffcUnknown;
+#endif
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KExtFileFormatMake (KFileFormat ** pft,
+			 const char* ext, size_t extlen,
+			 const char * typeAndClass, size_t tclen)
+{
+    rc_t rc = 0;
+    KExtFileFormat * self;
+
+
+    FUNC_ENTRY();
+
+    self = malloc (sizeof * self);
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcFileFormat, rcAllocating, rcMemory, rcExhausted);
+	LOGERR (klogFatal, rc, "Failed to allocate for KExtFileFormat");
+    }
+    else
+    {
+	rc = KFileFormatInit (&self->dad, (const KFileFormat_vt *)&vt_v1, typeAndClass, tclen);
+	if (rc == 0)
+	{
+	    rc = KExtTableMake (&self->table);
+	    if (rc == 0)
+	    {
+		rc = KExtTableInit (self->table, self->dad.tables, ext, extlen);
+		{
+		    if (rc == 0)
+		    {
+			*pft = &self->dad;
+			return 0;
+		    }
+		}
+		KExtTableRelease (self->table);
+	    }
+	}
+	free (self);
+    }
+    return rc;
+}
+
diff --git a/libs/kfs/ffkey.c b/libs/kfs/ffkey.c
new file mode 100644
index 0000000..2c43f7b
--- /dev/null
+++ b/libs/kfs/ffkey.c
@@ -0,0 +1,833 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/container.h>
+#include <kfs/fileformat.h>
+#include <sysalloc.h>
+#include "fileformat-priv.h"
+
+#include <atomic.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* ----------------------------------------------------------------------
+ * Private type used only with in this compilation unit.
+ */
+typedef
+struct KFFClass
+{
+    BSTNode	node;
+    atomic32_t	refcount;
+    KFileFormatClass	class;		/* scalar ID of the class */
+    size_t	len;		/* length of the descriptor */
+    char 	descr	[1];	/* ASCIZ text description of the class */
+} KFFClass;
+
+static
+rc_t KFFClassDestroy (const KFFClass * cself)
+{
+    rc_t rc;
+    KFFClass * self;
+
+    FUNC_ENTRY();
+
+    rc = 0;
+    self = (KFFClass*)cself;
+    if (cself == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcDestroying, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KFFClassDestroy: self == NULL");
+    }
+    else
+    {
+	free (self);
+    }
+    return rc;
+}
+
+static
+rc_t KFFClassRelease (const KFFClass * cself)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (cself != NULL)
+    {
+	KFFClass *self = (KFFClass*)cself;
+        if (atomic32_dec_and_test (&self->refcount))
+	    return  KFFClassDestroy (cself);
+    }
+    return rc;
+}
+/* not used at this time */
+#if 0
+static
+rc_t KFFClassAddRef (const KFFClass * self)
+{
+    rc_t rc = 0; 
+
+    FUNC_ENTRY();
+
+    if (self != NULL)
+        atomic32_inc (&((KFFClass*)self)->refcount);
+    return rc;
+}
+#endif
+static
+rc_t KFFClassMake (KFFClass ** kffcp,	/* pointer to new object */
+		   KFileFormatClass class, /* ID of new class */
+		   const char * descr,	/* description of new class */
+		   size_t len)		/* length of description */
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (kffcp == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcConstructing, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KFFClassMake: kffkmp == NULL");
+    }
+    else if (descr == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcNull);
+	LOGERR (klogErr, rc, "KFFClassMake: descr == NULL");
+    }
+    else
+    {
+	if (len > DESCRLEN_MAX)
+	{
+/* 	    printf("len %u DESCRLEN_MAX %u\n", len, DESCRLEN_MAX); */
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcInvalid);
+	    LOGERR (klogErr, rc, "KFFClassMake: descr too long");
+	}
+	else if (len == 0)
+	{
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcEmpty);
+	    LOGERR (klogErr, rc, "KFFClassMake: descr too short");
+	}
+	else
+	{
+	    KFFClass * self = malloc (sizeof (*self) + len);
+	    if (self == NULL)
+	    {
+		rc = RC (rcFF,  rcIndex, rcConstructing, rcMemory, rcExhausted);
+		LOGERR (klogErr, rc, "KFFClassMake: object could not be allocated");
+	    }
+	    else
+	    {
+		/* self->node needs not be initialized  */
+		atomic32_set (&self->refcount,1);
+		self->class = class;
+		self->len = len;
+		memmove (self->descr, descr, len);
+		self->descr[self->len] = '\0';
+		*kffcp = self;
+		return 0;
+	    }
+	}
+    }
+    *kffcp = NULL;
+    return rc;
+}
+
+/* -----
+ * Private type used only with in this compilation unit.
+ */
+typedef
+struct KFFType
+{
+    BSTNode	node;
+    atomic32_t 	refcount;	/* how many open references to this object */
+    KFileFormatType	type;		/* scalar ID of the type */
+    KFileFormatClass	class;		/* scalar ID of the class the type belongs in */
+    size_t	len;		/* length of the descriptor */
+    char 	descr	[1];	/* ASCIZ text description of the type */
+} KFFType;
+
+static
+rc_t KFFTypeDestroy (const KFFType * cself)
+{
+    rc_t rc = 0;
+    KFFType * self = (KFFType*)cself;
+
+    FUNC_ENTRY();
+
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcDestroying, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KFFTypeDestroy: self == NULL");
+    }
+    else
+    {
+	free (self);
+    }
+    return rc;
+}
+
+static
+rc_t KFFTypeRelease (const KFFType * cself)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (cself != NULL)
+    {
+	KFFType *self = (KFFType*)cself;
+        if (atomic32_dec_and_test (&self->refcount))
+	    return  KFFTypeDestroy (cself);
+    }
+    return rc;
+}
+/* not used at this time */
+#if 0
+static
+rc_t KFFTypeAddRef (const KFFType * self)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (self != NULL)
+        atomic32_inc (&((KFFType*)self)->refcount);
+    return rc;
+}
+#endif
+static
+rc_t KFFTypeMake (KFFType ** kfftp,
+		  KFileFormatType  type,
+		  KFileFormatClass class,
+		  const char * descr,
+		  size_t len)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (kfftp == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcConstructing, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KFFTypeMake: kffkmp == NULL");
+    }
+    else if (descr == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcNull);
+	LOGERR (klogErr, rc, "KFFTypeMake: descr == NULL");
+    }
+    else
+    {
+	if (len > DESCRLEN_MAX)
+	{
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcInvalid);
+	    LOGERR (klogErr, rc, "KFFTypeMake: descr too long");
+	}
+	else if (len == 0)
+	{
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcEmpty);
+	    LOGERR (klogErr, rc, "KFFTypeMake: descr too short");
+	}
+	else
+	{
+	    KFFType * self = malloc (sizeof (*self) + len);
+	    if (self == NULL)
+	    {
+		rc = RC (rcFF,  rcIndex, rcConstructing, rcMemory, rcExhausted);
+		LOGERR (klogErr, rc, "KFFTypeMake: object could not be allocated");
+	    }
+	    else
+	    {
+		/* self->node needs not be initialized  */
+		atomic32_set (&self->refcount,1);
+		self->len = len;
+		memmove (self->descr, descr, len);
+		self->descr[self->len] = '\0';
+		self->type = type;
+		self->class = class;
+		*kfftp = self;
+		return 0;
+	    }
+	}
+    }
+    *kfftp = NULL;
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ *
+ * A table will have a descr based bstree for type, a descr based bstree
+ * for class,
+ *
+ * A type indexed and class indexed set of indexes into the same stuff.
+ *
+ * All table are thus the "node" and pointer to a node.  the same nodes
+ * are referred to by the descr based bstree and the linear tables.
+ *
+ * Linear tables are pre allocated arrays that are increased by chunks.
+*/
+
+struct KFFTables
+{
+    atomic32_t 	refcount;
+    BSTree	classtree;
+    BSTree	typetree;
+    KFFClass **	classindex;
+    KFFType **	typeindex;
+    uint32_t	typecount;
+    uint32_t	classcount;
+    uint32_t	typesize;
+    uint32_t	classsize;
+
+};
+
+static
+void KFFTypeNodeWhack (BSTNode * n, void * ignored)
+{
+    FUNC_ENTRY();
+
+    KFFTypeDestroy ((KFFType*)n);
+}
+static
+void KFFClassNodeWhack (BSTNode * n, void * ignored)
+{
+    FUNC_ENTRY();
+    KFFClassDestroy ((KFFClass*)n);
+}
+static 
+rc_t KFFTablesDestroy (const KFFTables * cself)
+{
+    KFFTables * self = (KFFTables*)cself;
+    rc_t rc = 0;
+/*     uint32_t ix; */
+    FUNC_ENTRY();
+
+    BSTreeWhack (&self->typetree, KFFTypeNodeWhack, NULL);
+    BSTreeWhack (&self->classtree, KFFClassNodeWhack, NULL);
+    if (self->classindex != NULL)
+	free (self->classindex);
+    if (self->typeindex != NULL)
+	free (self->typeindex);
+    free (self);
+    return rc;
+}
+
+rc_t CC KFFTablesRelease (const KFFTables * cself)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (cself != NULL)
+    {
+	KFFTables *self = (KFFTables*)cself;
+        if (atomic32_dec_and_test (&self->refcount))
+	    return  KFFTablesDestroy (self);
+    }
+    return rc;
+}
+
+rc_t CC KFFTablesAddRef (const KFFTables * self)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (self != NULL)
+        atomic32_inc (& ((KFFTables*) self)->refcount);
+    return rc;
+}
+
+/* -----
+ * if descr is too short, not NUL terminated, and at the edge of legal memory
+ * there is a chance the next two functions could have a segmentation fault
+ */
+static
+int64_t classcmp (const void * descr, const BSTNode * n)
+{
+    KFFClass * nn = (KFFClass*)n;
+    return strncmp ((const char *)descr, nn->descr, nn->len);
+}
+static
+int64_t typecmp (const void * descr, const BSTNode * n)
+{
+    KFFType * nn = (KFFType *)n;
+
+    return strncmp ((const char *)descr, nn->descr, nn->len);
+}
+static
+int64_t classsort (const BSTNode * i ,const BSTNode * n)
+{
+    KFFClass * ii = (KFFClass *)i;
+    KFFClass * nn = (KFFClass *)n;
+    return strncmp (ii->descr, nn->descr, nn->len);
+}
+static
+int64_t typesort (const BSTNode * i, const BSTNode * n)
+{
+    KFFType * ii = (KFFType *)i;
+    KFFType * nn = (KFFType *)n;
+    return strncmp (ii->descr, nn->descr, nn->len);
+}
+
+static
+KFFClass * KFFTablesFindKFFClass (KFFTables * self,
+				  const char * descr )
+{
+    BSTNode * pbn;
+    if ((self == NULL) || (descr == NULL))
+	return NULL;
+    pbn = BSTreeFind (&self->classtree, descr, classcmp);
+    return (KFFClass*)pbn;
+}
+static
+KFFType * KFFTablesFindKFFType (KFFTables * self,
+				const char * descr )
+{
+    BSTNode * pbn;
+    FUNC_ENTRY ();
+    if ((self == NULL) || (descr == NULL))
+	return NULL;
+    pbn = BSTreeFind (&self->typetree, descr, typecmp);
+    return (KFFType*)pbn;
+}
+/* Not currently used
+static
+KFileFormatClass KFFTablesFindKFileFormatClass (KFFTables * self,
+						const char * descr )
+{
+    BSTNode * pbn;
+    LOGENTRY (10, "(10, "KFFTablesFindKFileFormatClass"));
+    if ((self == NULL) || (descr == NULL))
+	return kffcError;
+    pbn = BSTreeFind (&self->classtree, descr, classcmp);
+    if (pbn == NULL)
+	return kffcUnknown;
+    return ((KFFClass*)pbn)->class;
+}
+*/
+static
+KFileFormatType KFFTablesFindKFileFormatType (const KFFTables * self,
+					      const char * descr )
+{
+    union
+    {
+	BSTNode * bn;
+	KFFType * kt;
+    } node;
+
+    FUNC_ENTRY();
+ 
+    if ((self == NULL) || (descr == NULL))
+    {
+	LOGMSG(klogWarn,"Not Found");
+	return kfftError;
+    }
+    node.bn = BSTreeFind (&self->typetree, descr, typecmp);
+    if (node.bn == NULL)
+    {
+        PLOGMSG(klogWarn,(klogWarn,"Unknown $(D)", PLOG_S(D),descr));
+	return kfftUnknown;
+    }
+
+/*     printf("KFFTablesFindKFileFormatType:\n" */
+/* 	   "\trefcount\t%u\n" */
+/* 	   "\ttype\t\t%u\n" */
+/* 	   "\tclass\t\t%u\n" */
+/* 	   "\tlen\t\t%lu\n" */
+/* 	   "\tdescr\t\t%s\n", */
+/* 	   node.kt->refcount,  */
+/* 	   node.kt->type, */
+/* 	   node.kt->class, */
+/* 	   node.kt->len, */
+/* 	   node.kt->descr); */
+
+    return (node.kt->type);
+}
+
+rc_t CC KFFTablesAddClass (KFFTables * self,
+                           KFileFormatClass * pclassid, /* returned ID: NULL okay */
+                           const char * descr,
+                           size_t len)
+{
+    rc_t rc;
+
+    FUNC_ENTRY();
+
+/*     PLOGMSG ((klogDebug10, "Descr is $(L) $(D)", PLOG_2(PLOG_U32(L),PLOG_S(D)), len,descr)); */
+    rc = 0;
+    if (self == NULL)
+    {
+	rc = -1;
+	LOGERR (klogErr, rc, "Error making type: NULL pointer");
+    }
+    else if (descr == NULL)
+    {
+	rc = -1;
+	LOGERR (klogErr, rc, "Error making type: NULL descr");
+    }
+    else
+    {
+	KFFClass * pclass;
+
+	pclass = KFFTablesFindKFFClass (self, descr);
+	if (pclass != NULL)
+	{
+	    rc = -1;
+	    PLOGERR (klogErr, (klogErr, rc, "Class already inserted <$(d)>", PLOG_S(d),  descr));
+	}
+	else
+	{
+	    /* not thread safe if multiple "creators" */
+	    if (self->classcount * sizeof(KFFClass*) == self->classsize)
+	    {
+		void * vp;
+		self->classsize += 32 * sizeof(KFFClass*);
+		/* realloc will not be undone if anything fails */
+		vp = realloc (self->classindex,self->classsize);
+		if (vp == NULL)
+		{
+		    rc = -1;
+		    LOGERR (klogErr, rc, "Error allocating class table");
+		}
+		self->classindex = vp;
+	    }
+	}
+	if (rc == 0)
+	{
+	    KFileFormatClass cid;
+	    KFFClass * kc;
+	    cid = self->classcount++;
+	    rc = KFFClassMake (&kc, cid, descr, len);
+	    if (rc != 0)
+	    {
+		PLOGERR (klogErr, (klogErr, rc, "Error making class: $(c) $(d)",
+			  PLOG_2(PLOG_U32(c),PLOG_S(d)),
+			  cid, descr));
+	    }
+	    else
+	    {
+		rc = BSTreeInsert (&self->classtree, &kc->node,
+				   classsort);
+		if (rc == 0)
+		{
+		    self->classindex[cid] = kc;
+		    if (pclassid)
+			*pclassid = cid;
+		    return 0;
+		}
+		PLOGERR (klogErr, (klogErr, rc, "Error inserting class $(c) $(d)",
+                                   PLOG_2(PLOG_U32(c),PLOG_S(d)),
+                                   cid, descr));
+		KFFClassRelease (kc);
+	    }
+	    self->classcount--;
+	}
+    }
+    if (pclassid)
+	*pclassid = 0;
+    return rc;
+}
+
+rc_t CC KFFTablesAddType (KFFTables * self,
+                          KFileFormatType * ptype, /* returned new ID */
+                          const char * class,
+                          const char * type,
+                          size_t clen,
+                          size_t tlen)
+{
+    rc_t rc;
+    KFFType * ptn;
+    KFFClass * pcn;
+    KFileFormatClass classid;
+    KFileFormatType pid;
+
+    FUNC_ENTRY();
+
+    rc = 0;
+
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcFileFormat, rcConstructing, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "Error making type: NULL pointer");
+	goto quickout;
+    }
+    if ((class == NULL)||(type == NULL))
+    {
+ 	rc = -1;
+	LOGERR (klogErr, rc, "Error making type: NULL parameter");
+	goto quickout;
+    }
+    ptn = KFFTablesFindKFFType (self, type);
+    pcn = KFFTablesFindKFFClass (self, class);
+    if (ptn != NULL)
+    {
+	rc = -1;
+	PLOGERR (klogErr, (klogErr, rc, "Type already inserted <$(d)>", PLOG_S(d), type));
+	goto quickout;
+    }
+
+    if (pcn == NULL)
+    {
+	rc = KFFTablesAddClass (self, &classid, class, clen);
+	if (rc != 0)
+	{
+	    PLOGERR (klogErr, (klogErr, rc, "unable to insert new class <$(d)>", PLOG_S(d), class));
+	    goto quickout;
+	}
+    }
+    else
+    {
+	classid = pcn->class;
+    }
+
+    /* not thread safe if multiple "creators" */
+    if (self->typecount * sizeof(KFFType*) == self->typesize)
+    {
+	void * vp;
+	self->typesize += 32 * sizeof(KFFType*);
+	/* realloc will not be undone of anything fails */
+	vp = realloc (self->typeindex,self->typesize);
+	if (vp == NULL)
+	{
+	    rc = -1;
+	    LOGERR (klogErr, rc, "Error allocating type table");
+	    goto quickout;
+	}
+	self->typeindex = vp;
+
+    }
+    pid = self->typecount++;
+    rc = KFFTypeMake (&ptn, pid, classid, type, tlen);
+    if (rc != 0)
+    {
+	PLOGERR (klogErr, (klogErr, rc, "Error making type: $(c) $(d)",
+                           PLOG_2(PLOG_I32(c),PLOG_S(d)),
+                           pid, type));
+    }
+    else
+    {
+	rc = BSTreeInsert (&self->typetree, &ptn->node, typesort);
+	if (rc == 0)
+	{
+	    self->typeindex[pid] = ptn;
+	    if (ptype)
+		*ptype = pid;
+	    return 0;
+	}
+	KFFTypeRelease (ptn);
+    }
+    self->typecount--;
+
+quickout:
+    if (ptype)
+	*ptype = 0;
+    return rc;
+}
+
+rc_t CC KFFTablesMake (KFFTables ** kmmtp)
+{
+    KFFTables * self;
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    self = calloc (1,sizeof *self); /* we need it zeroed */
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcTable, rcConstructing, rcParam, rcNull);
+	LOGERR (klogErr, rc, "KFFTablesMake: self could not be allocated");
+    }
+    else
+    {
+/* 	uint32_t unknown; */
+/* calloc does all this
+	self->typecount = self->typesize = self->classcount = 
+	    self->classsize = 0;
+	KFFClass = NULL;
+	KFFType = NULL;
+*/
+/* might not want to count on BSTreeInit to set to zero and nothing else */
+	BSTreeInit (&self->typetree);
+	BSTreeInit (&self->classtree);
+	atomic32_set (&self->refcount,1);
+	/* initialize the tables to have an unknown class and unknown type */
+#if 1
+/* is this wise? */
+	rc = KFFTablesAddType (self, NULL, "Unknown", "Unknown", 7, 7);
+	if (rc == 0)
+	{
+	    *kmmtp = self;
+	    return 0;
+	}
+#else
+	rc = KFFTablesAddClass (self, &unknown,
+				"Unknown", 7);
+	if (rc == 0)
+	{
+	    uint32_t u;
+	    rc = KFFTablesAddType (self, &u, unknown,
+				   "Unknown", 7);
+	    if (rc == 0)
+	    {
+		*kmmtp = self;
+		return 0;
+	    }
+	}
+#endif
+	KFFTablesRelease (self);
+    }
+    return rc;
+}
+
+rc_t CC KFFTablesGetClassDescr (const KFFTables * self,
+                                KFileFormatClass tid,
+                                size_t * len,
+                                char ** pd)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    *pd = NULL;
+    *len = 0;
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcTable, rcAccessing, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KFFTablesGetClassDescr: self is Null");
+    }
+    else
+    {
+	if ( ( tid < 0 )||( (uint32_t)tid > self->classcount ) )
+	{
+	    rc = RC (rcFF, rcTable, rcAccessing, rcParam, rcNotFound);
+	    LOGERR (klogErr, rc, "KFFTablesGetClassDescr: class ID out of range");
+	}
+	else
+	{
+	    *pd = self->classindex[tid]->descr;
+	    *len = self->classindex[tid]->len;
+	}
+    }
+    return rc;
+}
+
+rc_t CC KFFTablesGetTypeDescr (const KFFTables * self,
+                               KFileFormatType tid,
+                               size_t * len,
+                               char ** pd)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    *pd = NULL;
+    *len = 0;
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcTable, rcAccessing, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KFFTablesGetTypeDescr: self is Null");
+    }
+    else
+    {
+	if ( (uint32_t)tid > self->typecount )
+	{
+	    rc = RC (rcFF, rcTable, rcAccessing, rcParam, rcNotFound);
+	    LOGERR (klogErr, rc, "KFFTablesGetTypeDescr: type ID out of range");
+	}
+	else
+	{
+	    *pd = self->typeindex[tid]->descr;
+	    *len = self->typeindex[tid]->len;
+	}
+    }
+    return rc;
+}
+
+/* not currently used and incomplete
+rc_t KFFTablesGetClassId (const KFFTables * self,
+			  const char ** pd,
+			  KFileFormatClass * cid)
+{
+    rc_t rc;
+
+    FUNC_ENTRY();
+
+    rc = 0;
+    *cid = 0;
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcTable, rcAccessing, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KFFTablesGetClassId: self is Null");
+    }
+    else
+    {
+    }
+    return rc;
+}
+*/
+rc_t CC KFFTablesGetTypeId (const KFFTables * self,
+                            const char * pd,
+                            KFileFormatType * tid,
+                            KFileFormatClass * cid)
+{
+    rc_t rc;
+
+    FUNC_ENTRY();
+
+    rc = 0;
+    *tid = 0;
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcTable, rcAccessing, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KFFTablesGetTypeId: self is Null");
+    }
+    else
+    {
+	KFileFormatType tt;
+	tt = KFFTablesFindKFileFormatType (self, pd);
+	if (tt > 0)
+	{
+	    if (tid)
+		*tid = tt;
+	    if (cid)
+		*cid = self->typeindex[tt]->class;
+	}
+	else
+	{
+	    if (tid)
+		*tid = tt;
+	    if (cid)
+		*cid = tt; /* same fail values */
+	}
+    }
+    return rc;
+}
diff --git a/libs/kfs/ffmagic.c b/libs/kfs/ffmagic.c
new file mode 100644
index 0000000..8bdf26f
--- /dev/null
+++ b/libs/kfs/ffmagic.c
@@ -0,0 +1,969 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+#include <magic.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/container.h>
+#include <kfs/directory.h>
+#include <kfs/fileformat.h>
+#include <kfg/config.h>
+#include <sysalloc.h>
+#include "fileformat-priv.h"
+struct KMagicFileFormat;
+#define KFILEFORMAT_IMPL struct KMagicFileFormat
+#include "impl.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <stdio.h>
+
+typedef
+struct KMagicNode
+{
+    BSTNode		node;
+    atomic32_t 		refcount;
+    KFileFormatType	typeid;
+    size_t		kfflen;
+    size_t		magiclen;
+    char *		magicdescr;
+    char		kffdescr [1];
+} KMagicNode;
+
+static
+rc_t KMagicNodeDestroy (const KMagicNode * cself)
+{
+    rc_t rc;
+    KMagicNode * self;
+
+    FUNC_ENTRY();
+
+    rc = 0;
+    self = (KMagicNode*)cself;
+
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcDestroying, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KMagicNodeDestroy: self == NULL");
+    }
+    else
+    {
+	free (self);
+    }
+    return rc;
+}
+
+static
+rc_t KMagicNodeRelease (const KMagicNode * cself)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (cself != NULL)
+    {
+        KMagicNode *self = (KMagicNode*)cself;
+        if (atomic32_dec_and_test (&self->refcount))
+            return  KMagicNodeDestroy (cself);
+    }
+    return rc;
+}
+/* not used at this time */
+#if 0
+static
+rc_t KMagicNodeAddRef (const KMagicNode * self)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (self != NULL)
+        atomic32_inc (&((KFileFormat*)self)->refcount);
+    return rc;
+}
+#endif
+static
+rc_t KMagicNodeMake (KMagicNode ** kmmp, const KFFTables * tables,
+		     const char * magicdescr, size_t magiclen,
+		     const char * kffdescr, size_t kfflen)
+
+{
+    KMagicNode * self;
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (magicdescr == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcNull);
+	LOGERR (klogErr, rc, "KMagicNodeMake: magicdescr == NULL");
+    }
+    else if (kffdescr == NULL)
+    {
+	rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcNull);
+	LOGERR (klogErr, rc, "KKffNodeMake: kffdescr == NULL");
+    }
+    else
+    {
+	if (magiclen > DESCRLEN_MAX)
+	{
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcInvalid);
+	    LOGERR (klogErr, rc, "KMagicNodeMake: magicdescr too long");
+	}
+	else if (magiclen == 0)
+	{
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcEmpty);
+	    LOGERR (klogErr, rc, "KMagicNodeMake: magicdescr too short");
+	}
+	else if (kfflen > DESCRLEN_MAX)
+	{
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcInvalid);
+	    LOGERR (klogErr, rc, "KKffNodeMake: kffdescr too long");
+	}
+	else if (kfflen == 0)
+	{
+	    rc = RC (rcFF, rcIndex, rcConstructing, rcParam, rcEmpty);
+	    LOGERR (klogErr, rc, "KKffNodeMake: kffdescr too short");
+	}
+	else
+	{
+	    KFileFormatType typeid;
+	    rc = KFFTablesGetTypeId (tables, kffdescr, &typeid, NULL);
+	    if (rc == 0)
+	    {
+		self = malloc (sizeof (*self) + magiclen + kfflen + 1);
+		if (self == NULL)
+		{
+		    rc = RC (rcFF,  rcIndex, rcConstructing, rcMemory, rcExhausted);
+		    LOGERR (klogErr, rc, "KMagicNodeMake: self could not be allocated");
+		}
+		else
+		{
+		    atomic32_set (&self->refcount,1);
+		    self->typeid = typeid;
+		    self->kfflen = kfflen;
+		    self->magiclen = magiclen;
+		    self->magicdescr = self->kffdescr + kfflen + 1;
+		    memmove (self->kffdescr, kffdescr, kfflen);
+		    memmove (self->magicdescr, magicdescr, magiclen);
+		    self->kffdescr[self->kfflen] = '\0';
+		    self->magicdescr[self->magiclen] = '\0';
+		    *kmmp = self;
+		    return 0;
+		}
+	    }
+	}
+    }
+    return rc;
+}
+
+
+/* -------------------------
+ *
+ */
+typedef
+struct KMagicTable
+{
+    atomic32_t 	refcount;
+    BSTree	tree;
+} KMagicTable;
+
+static
+void KMagicNodeWhack (BSTNode * n, void * ignored)
+{
+    FUNC_ENTRY();
+
+    (void)KMagicNodeRelease((KMagicNode*)n);
+}
+static
+rc_t KMagicTableDestroy (KMagicTable * cself)
+{
+    rc_t rc;
+    KMagicTable * self;
+
+    FUNC_ENTRY();
+
+    rc = 0;
+    self = (KMagicTable*)cself;
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcTable, rcDestroying, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KMagicTableDestroy: self == NULL");
+    }
+    else
+    {
+	BSTreeWhack (&self->tree, KMagicNodeWhack, NULL);
+	free (self);
+    }
+    return rc;
+}
+static
+rc_t KMagicTableRelease (const KMagicTable * cself)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (cself != NULL)
+    {
+	KMagicTable *self = (KMagicTable*)cself;
+        if (atomic32_dec_and_test (&self->refcount))
+	    return  KMagicTableDestroy (self);
+    }
+    return rc;
+}
+#if 0
+static /* not used at this time */
+rc_t KMagicTableAddRef (const KMagicTable * self)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    if (self != NULL)
+        atomic32_inc (& ((KFileFormat*) self)->refcount);
+    return rc;
+}
+#endif
+static
+rc_t KMagicTableMake (KMagicTable ** kmmtp)
+{
+    KMagicTable * self;
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    self = malloc (sizeof *self);
+    if (self == NULL)
+    {
+        rc = RC (rcFF, rcTable, rcConstructing, rcParam, rcNull);
+        LOGERR (klogErr, rc, "KMagicTableMake: self could not be allocated");
+    }
+    else
+    {
+        atomic32_set (&self->refcount,1);
+        BSTreeInit (&self->tree);
+        *kmmtp = self;
+    }
+    return rc;
+}
+
+static
+int64_t KMagicNodeCmp (const void* item, const BSTNode * n)
+{
+    size_t len;
+    KMagicNode * mn = (KMagicNode *)n;
+
+    FUNC_ENTRY();
+
+    /* -----
+     * we only check this many characters of the comparison item
+     * we need only this part to match and ignore characters after
+     * this in the comparison string
+     */
+    len = mn->magiclen;
+    return strncmp (item, mn->magicdescr, len);
+}
+
+static
+rc_t KMagicTableFind (KMagicTable * self, KMagicNode ** node, const char * str)
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    *node = (KMagicNode*)BSTreeFind (&self->tree, str, KMagicNodeCmp);
+    if (*node == NULL)
+    {
+/* 	rc = RC (rcFF, rcTable, rcSearching, rcNode, rcNotFound); */
+        KFF_DEBUG (("%s: Could not find %s\n", __func__, str));
+    }
+    return rc;
+}
+/* maxlen includes the terminating NUL */
+#if 0 /* not in use at this time */
+static
+rc_t KMagicTableFindKFFDescr (KMagicTable * self, const char * str, char * kff, size_t maxlen)
+{
+    rc_t rc;
+    KMagicNode * np;
+
+    FUNC_ENTRY();
+
+    if (self == NULL)
+    {
+	rc = RC (rcFF, rcFileFormat, rcSearching, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "KMagicTableFindKFFDecr:self == NULL");
+	return rc;
+    }
+    if (str == NULL)
+    {
+	rc = RC (rcFF, rcFileFormat, rcSearching, rcParam, rcNull);
+	LOGERR (klogErr, rc, "KMagicTableFindKFFDecr: searchstring is NULL");
+	return rc;
+    }
+    if (kff == NULL)
+    {
+	rc = RC (rcFF, rcFileFormat, rcSearching, rcParam, rcNull);
+	LOGERR (klogErr, rc, "KMagicTableFindKFFDecr: found storage is NULL");
+	return rc;
+    }
+    rc = KMagicTableFind (self, &np, str);
+    if (maxlen <= np->kfflen) /* kfflen does not include NUL */
+    {
+	rc = RC (rcFF, rcFileFormat, rcSearching, rcParam, rcTooLong);
+	LOGERR (klogErr, rc, "KMagicTableFindKFFDecr: found storage is NULL");
+	return rc;
+    }
+    memmove (kff, np->kffdescr, np->kfflen);
+    kff[np->kfflen] = '\0';
+    return rc;
+}
+#endif
+static
+int64_t KMagicNodeSort (const BSTNode* item, const BSTNode * n)
+{
+    const char * str1;
+    const char * str2;
+
+    FUNC_ENTRY();
+
+    str1 = ((KMagicNode *)item)->magicdescr;
+    str2 = ((KMagicNode *)n)->magicdescr;
+    return strcmp (str1, str2);
+}
+static
+rc_t KMagicTableInsert (KMagicTable * self, KMagicNode *node)
+{
+    FUNC_ENTRY();
+
+    return (BSTreeInsert (&self->tree, &node->node, KMagicNodeSort));
+}
+/* not is use at this time */
+#if 0
+
+static
+rc_t KMagicTableBufferRead (KMagicTable * self, KFFTables * tables,
+			    const char * buff, size_t bufflen)
+{
+    rc_t rc = 0;
+    const char * kff;
+    const char * magic;
+    const char * nl;
+    size_t kfflen;
+    size_t magiclen;
+
+    FUNC_ENTRY();
+
+
+    /* -----
+     * until we get all the way through the buffer
+     * which by this coding could actually be all blank
+     */
+    while (bufflen)
+    {
+	magic = buff;
+	/* -----
+	 * allow leading white space including blank lines
+	 */
+	if (isspace (*magic))	
+	{
+	    buff++;
+	    bufflen --;
+	    continue;
+	}
+	/* -----
+	 * not a comment line so find the tab splitting the sections
+	 */
+	kff = memchr (magic, '\t', bufflen);
+	if (kff == NULL)
+	{
+	    /* couldn't find it so blae the document and quit */
+	bad_line:
+	    rc = RC (rcFF, rcBuffer, rcParsing, rcFormat, rcCorrupt);
+	    /* log error */
+	    bufflen = 0;
+	    continue;
+	}
+	/* -----
+	 * the magic portion of the line is from the first non-white space
+	 * through the character before the tab.
+	 */
+	magiclen = kff - magic;
+	bufflen -= magiclen + 1;
+	kff++; /* point past the tab */
+	while (bufflen) /* skip white space */
+	{
+	    if (*kff == '\n') /* end of line now is a format error */
+	    {
+		goto bad_line;
+	    }
+	    if (!isspace (*kff)) /* break at non shite space character */
+		break;
+	    bufflen --;
+	    kff ++;
+	}
+	if (bufflen == 0) /* no kff descr */
+	    goto bad_line;
+	nl = memchr (kff, '\n', bufflen);
+	if (nl == NULL) /* no EOL but last line in buffer */
+	{
+	    kfflen = bufflen;
+	    bufflen = 0;
+	}
+	else /* not last unfinished line */
+	{
+	    kfflen = nl - magic;
+	    bufflen -= kfflen + 1;
+	    buff = nl + 1;
+	}
+	{
+	    KMagicNode * np;
+	    rc = KMagicNodeMake (&np, tables, magic, magiclen,
+				 kff, kfflen);
+	    if (rc != 0)
+	    {
+		/* LOG ERR */
+		break;
+	    }
+	}
+    }
+    ( break;
+	    }
+	}
+    }
+    return rc;
+}
+#endif
+
+/* not used at this time */
+#if 0
+LIB_EXPORT rc_t CC KMagicTableRead (KMagicTable * self, const KFile * file))
+{
+    rc_t rc = 0;
+    /* setup KMMap */
+    /* call KMagicTableBufferRead */
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMagicTableWrite (const KMagicTable * self, KFile * file)
+{
+    rc_t rc = 0;
+
+    return rc;
+}
+#endif
+
+/* -----
+ * format is
+ * whitechar := {' '|'\f'|'\t'|'\v'}
+ * whitespace := whitechar*
+ * magic-str = !whitespace!{'\t'|'\n'}*
+ * kff-str = !whitespace!{'\t'|'\n'}*
+ *
+ * A line is 
+ * [<whitespace>]#<comment line skipped>\n
+ * Or 
+ * [<whitespace>]<magic-str>\t[<whitespace>]<kff-str>\n
+ * Or
+ * [<whitespace>]\n
+ *
+ * NOTE: whitespace at the right end of the two strings is included in the strings
+ * NOTE: We do not look for '\v'|'\f' within the strings though we maybe should
+ * NOTE: the magic string definitely allows white space and punctuation
+ */
+static
+rc_t KMagicTableInit (KMagicTable * self, const KFFTables * tables, const char * buffer, size_t len)
+{
+    rc_t rc;
+    const char * magic;
+    const char * kff;
+    const char * tab;
+    const char * newline;
+    const char * line;
+    const char * limit;
+    KMagicNode * node;
+
+    FUNC_ENTRY();
+
+    rc = 0;
+
+    /* -----
+     * we try to go all the way through the buffer line by line
+     * which by this coding could actually be all blank
+     */
+    limit = buffer + len;
+    for (line = buffer; line < limit; line = newline+1)
+    {
+	for (magic = line; isspace (*magic); magic++, len--)
+	{
+	    if (len == 0) /* last of the file was all whitespace so quit */
+		break;
+	}
+	newline = memchr (magic, '\n', len);
+	if (newline == NULL)
+	    newline = magic + len;
+	/* -----
+	 * If the first character on the line is #
+	 * we treat it as a comment (matches sh/bash/libmagic/etc.
+	 */
+	if (*magic == '#')
+	{
+	    /* -----
+	     * skip this line
+	     */
+	    len -= newline+1 - magic;
+	    continue;
+	}
+	
+	tab = memchr (magic, '\t', len);
+	if (tab == NULL)
+	{
+	    rc = RC (rcFF, rcFileFormat, rcConstructing, rcFile, rcInvalid);
+	    LOGERR (klogFatal, rc, "No <TAB> between magic and kff");
+	    break;
+	}
+	kff = tab + 1;
+	for (len -= kff - magic;
+	     isspace (*kff);
+	     len--, kff++)
+	{
+	    if (len == 0)
+	    {
+		rc = RC (rcFF, rcFileFormat, rcConstructing, rcFile, rcInvalid);
+		LOGERR (klogFatal, rc, "No kff after <TAB>");
+		break;
+	    }
+	}
+	if (newline == kff)
+	{
+	    rc = RC (rcFF, rcFileFormat, rcConstructing, rcFile, rcInvalid);
+	    LOGERR (klogFatal, rc, "No kff after whitespace");
+	    break;
+	}
+	len -= newline+1 - kff;
+ 	rc = KMagicNodeMake (&node, tables, magic, tab-magic, kff, newline-kff);
+	if (rc != 0)
+	{
+	    LOGERR (klogFatal, rc, "Failure to make node");
+	    break;
+	}
+	rc = KMagicTableInsert(self, node);
+	if (rc != 0)
+	{
+	    LOGERR (klogFatal, rc, "Failure to insert node");
+	    break;
+	}
+    }
+    if (rc == 0)
+    {
+	char unknown[] = "Unknown";
+
+	rc = KMagicNodeMake (&node, tables, unknown, sizeof (unknown) - 1, unknown, sizeof (unknown) - 1);
+	if (rc != 0)
+	{
+	    LOGERR (klogFatal, rc, "Failure to make node");
+	}
+	else
+	{
+	    rc = KMagicTableInsert(self, node);
+	    if (rc != 0)
+	    {
+		LOGERR (klogFatal, rc, "Failure to insert node");
+	    }
+	}
+    }
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KMagicFileFormat
+ *  a file content (format) categorizer
+ */
+
+typedef
+struct KMagicFileFormat
+{
+    KFileFormat	  dad;
+    magic_t 	  cookie;
+    KMagicTable * table;
+} KMagicFileFormat;
+
+static rc_t KMagicFileFormatDestroy (KMagicFileFormat *self);
+static rc_t KMagicFileFormatGetTypeBuff (const KMagicFileFormat *self,
+					 const void * buff, size_t buff_len,
+					 KFileFormatType * type,
+					 KFileFormatClass * class,
+					 char * description,
+					 size_t descriptionmax,
+					 size_t * descriptionlength);
+static rc_t KMagicFileFormatGetTypePath (const KMagicFileFormat *self,
+					 const KDirectory * dir,
+					 const char * path,
+					 KFileFormatType * type,
+					 KFileFormatClass * class,
+					 char * description,
+					 size_t descriptionmax,
+					 size_t * descriptionlength);
+static
+KFileFormat_vt_v1 vt_v1 =
+{
+    1, 1, /* maj, min */
+    KMagicFileFormatDestroy,
+    KMagicFileFormatGetTypeBuff,
+    KMagicFileFormatGetTypePath
+};
+
+
+
+/* Destroy
+ *  destroy FileFormat
+ */
+static
+rc_t KMagicFileFormatDestroy (KMagicFileFormat *self)
+{
+    FUNC_ENTRY();
+
+    rc_t rc = KMagicTableRelease (self->table);
+    magic_close (self->cookie);
+    {
+        rc_t rc2 = KFFTablesRelease (self->dad.tables);
+        if ( rc == 0 )
+            rc = rc2;
+    }
+    free (self);
+    return rc;
+}
+
+/* Type
+ *  returns a KMagicFileFormatDesc
+ *  [OUT] rc_t               return
+ *  [IN]  const KMagicFileFormat *  self         
+ *  [IN]  void **            buffer       buffer to hold returned description
+ *  [IN]  size_t             buffer_size  size of the buffer
+ *  [OUT] char **            descr        text description of file type
+ *  [IN]  size_t             descr_max    maximum size of string descr can hold
+ *  [OUT] size_t *           descr_len    length of returned descr (not including NUL
+ */
+static
+rc_t KMagicFileFormatGetTypePath (const KMagicFileFormat *self, const KDirectory * dir, const char * path,
+				  KFileFormatType * type, KFileFormatClass * class,
+				  char * descr, size_t descr_max, size_t *descr_len)
+{
+    rc_t rc = 0;
+    uint8_t	buff	[8192];
+    size_t	bytes_read;
+
+    rc = KDirectoryAddRef (dir);
+    if (rc == 0)
+    {
+	const KFile * file;
+	rc = KDirectoryOpenFileRead (dir, &file, "%s", path);
+	if (rc == 0)
+	{
+	    rc = KFileRead (file, 0, buff, sizeof buff, &bytes_read);
+	    {
+		rc = KMagicFileFormatGetTypeBuff (self,buff, bytes_read,
+						  type, class, descr,
+						  descr_max, descr_len);
+	    }
+	    KFileRelease (file);
+	}
+	KDirectoryRelease (dir);
+    }
+    return rc;
+}
+static
+rc_t KMagicFileFormatGetTypeBuff (const KMagicFileFormat *self, const void * buff, size_t buff_len,
+				  KFileFormatType * type, KFileFormatClass * class,
+				  char * descr, size_t descr_max, size_t *descr_len)
+{
+    rc_t rc = 0;
+    const char * b;
+
+    FUNC_ENTRY();
+
+    if (type != NULL)
+	*type = kfftError;
+    if (class != NULL)
+	*class = kffcError;
+    b = magic_buffer (self->cookie, buff, buff_len);
+    if (b == NULL)
+	rc = RC (rcFF, rcFileFormat, rcParsing, rcFormat, rcUnrecognized);
+    else
+    {
+	KMagicNode * node;
+	size_t c;
+
+        KFF_DEBUG (("magic_buffer returned %s\n", b));
+#if 1
+ 	rc = KMagicTableFind (self->table, &node, b);
+	if (rc == 0)
+	{
+	    KFileFormatClass cid;
+	    KFileFormatType tid;
+#define TABLES self->dad.tables
+	    if (node == NULL)
+		rc = KMagicTableFind (self->table, &node, "Unknown");
+	    if (rc == 0)
+		rc = KFFTablesGetTypeId (TABLES, node->kffdescr, &tid, &cid);
+	    if (rc == 0)
+	    {
+		c = node->kfflen;
+		if (c > descr_max)
+		    c = descr_max-1;
+		if (descr)
+		    string_copy(descr, descr_max, node->kffdescr, c);
+		descr[c] = '\0';
+		if (descr_len)
+		    *descr_len = c;
+		if (type)
+		    *type = tid;
+		if (class)
+		    *class = cid;
+	    }
+	}
+	if (rc != 0)
+	{
+	    if (descr_len != NULL)
+		*descr_len = 0;
+	    if (type != NULL)
+		*type = kfftNotFound;
+	    if (class != NULL)
+		*class = kffcNotFound;
+	}	
+
+
+#else
+    size_t size;
+	size_t l = string_measure(b, &size);
+	if (descr != NULL)
+	{
+	    string_copy (descr, descr_max, b, l);
+	    if (descr_max < l)
+		descr[descr_max-1] = 0;
+	}
+	if (descr_len != NULL)
+	    *descr_len = strlen (b);
+	if (type != NULL)
+	    *type = kfftUnknown;
+	if (class != NULL)
+	    *class = kffcUnknown;
+#endif
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KMagicFileFormatMake (KFileFormat ** pft, const char * magic_path,
+			   const char* magic, size_t magiclen,
+			   const char * typeAndClass, size_t tclen)
+{
+    rc_t rc = 0;
+    KMagicFileFormat * self;
+
+    FUNC_ENTRY();
+
+    DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFF),
+            ("%s: load path as called %s\n", __func__, magic_path));
+
+    self = malloc (sizeof * self);
+    if (self == NULL)
+    {
+        rc = RC (rcFF, rcFileFormat, rcAllocating, rcMemory, rcExhausted);
+        LOGERR (klogFatal, rc, "Failed to allocate for KMagicFileFormat");
+    }
+    else
+    {
+        rc = KFileFormatInit (&self->dad, (const KFileFormat_vt *)&vt_v1, typeAndClass, tclen);
+        if (rc == 0)
+        {
+            rc = KMagicTableMake (&self->table);
+            if (rc == 0)
+            {
+                rc = KMagicTableInit (self->table, self->dad.tables, magic, magiclen);
+                if (rc == 0)
+                {
+                    self->cookie = magic_open (MAGIC_PRESERVE_ATIME);
+        /* 		    self->cookie = magic_open (MAGIC_PRESERVE_ATIME|MAGIC_DEBUG|MAGIC_CHECK); */
+                    if (self->cookie == NULL)
+                    {
+                        rc = RC (rcFF, rcFileFormat, rcConstructing, rcResources, rcNull);
+                        LOGERR (klogFatal, rc, "Unable to obtain libmagic cookie");
+                    }
+                    else
+                    {
+                        KConfig * kfg;
+                        static const char kfg_magic_path[] = "kfs/kff/magic";
+                        char * magic_path_cursor;
+                        char kfg_magic_path_buff [1024];
+                        char magic_path_buff [4096];
+                        size_t z;
+                        int load_code;
+
+                        magic_path_cursor = magic_path_buff;
+
+                        if (magic_path)
+                        {
+                            z = strlen (magic_path);
+                            if (magic_path_cursor != magic_path_buff)
+                                *magic_path_cursor++ = ':';
+                            memmove (magic_path_cursor, magic_path, z);
+                            magic_path_cursor += z;
+                            *magic_path_cursor = '\0';
+                            DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFF),
+                                    ("%s: 1 magic_path_buff %s\n", __func__, magic_path_buff));
+                        }
+
+                        /* see if we have a configured alternate magic path */
+                        rc = KConfigMake (&kfg, NULL);
+                        if (rc == 0)
+                        {
+                            const KConfigNode * node;
+                            rc = KConfigOpenNodeRead (kfg, &node, kfg_magic_path);
+                            if (rc == 0)
+                            {
+                                size_t remaining;
+                                rc = KConfigNodeRead (node, 0, kfg_magic_path_buff,
+                                                      sizeof kfg_magic_path_buff-1,
+                                                      &z, &remaining);
+                                if (rc == 0)
+                                {
+                                    if (remaining != 0)
+                                    {
+                                        rc = RC (rcFF, rcFileFormat, rcLoading, rcString, rcExcessive);
+                                        DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFF),
+                                                ("%s: failed KConfigOpenNodeRead remaining %zu %R\n",
+                                                __func__, remaining, rc));
+                                    }
+                                    else if (z)
+                                    {
+                                        kfg_magic_path_buff[z] = '\0';
+                                        if (magic_path_cursor != magic_path_buff)
+                                            *magic_path_cursor++ = ':';
+                                        memmove (magic_path_cursor,kfg_magic_path_buff, z);
+                                        magic_path_cursor += z;
+                                        *magic_path_cursor = '\0';
+                                        DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFF),
+                                                ("%s: 3 magic_path_buff %s\n", __func__, magic_path_buff));
+                                    }
+                                }
+                                else
+                                    DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFF),
+                                        ("%s: failed KConfigNodeRead %R\n", __func__, rc));
+                                        
+                                {
+                                    rc_t rc2 = KConfigNodeRelease(node);
+                                    if (rc == 0)
+                                        rc = rc2;
+                                }
+                            }
+                            else
+                            {   /* no magic path konfigured; report but this is not an error */
+                                DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFF),
+                                        ("%s: failed KConfigOpenNodeRead %R\n", __func__, rc));
+                                rc = 0;
+                            }
+                                    
+                            {
+                                rc_t rc2 = KConfigRelease(kfg);
+                                if (rc == 0)
+                                    rc = rc2;
+                            }
+                        }
+                        else 
+                            DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFF),
+                                    ("%s: failed KConfigMake %R\n", __func__, rc));
+        
+                        if (rc == 0)
+                        {
+/*VDB-2911: remove use of system magic file; do not want to break when magic file format changes */
+#if 0                            
+                            KDirectory * pwd;
+                            rc = KDirectoryNativeDir (&pwd);
+                            if (rc == 0)
+                            {
+                                static const char unix_magic_path[] = "/usr/share/file/magic";
+                                KPathType kpt = KDirectoryPathType (pwd, unix_magic_path);
+                                rc = KDirectoryRelease(pwd);
+                                DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFF),
+                                        ("%s: %s %x\n", __func__, unix_magic_path, kpt));
+                                if ((kpt & ~ kptAlias) == kptFile)
+                                {
+                                    z = strlen (unix_magic_path);
+                                    if (magic_path_cursor != magic_path_buff)
+                                        *magic_path_cursor++ = ':';
+                                    memmove (magic_path_cursor, unix_magic_path, z);
+                                    magic_path_cursor += z;
+                                    *magic_path_cursor = '\0';
+                                    DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFF),
+                                            ("%s: 2 magic_path_buff %s\n", __func__, magic_path_buff));
+                                }
+                            }
+                            else
+                                LOGERR (klogErr, rc, "Failed to open NativeDir for Magic");
+#endif
+                            DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFF),
+                                    ("%s: loading path %s\n", __func__, magic_path_buff));
+
+                            load_code = magic_load (self->cookie, magic_path_buff);
+                            if (load_code != 0) /* defined as 0 success and -1 as fail */
+                            {
+                                KFF_DEBUG (("%s: magic_load() failed with load code %d(%s)\n", __func__, load_code, magic_error (self->cookie) ));
+                                rc = RC (rcFF, rcFileFormat, rcLoading, rcLibrary, rcUnexpected);
+                            }
+                            else
+                            {
+                                *pft = &self->dad;
+                                KFF_DEBUG (("%s Success\n", __func__));
+                                return 0;
+                            }
+                        }
+                        magic_close (self->cookie);
+                    }
+                }
+                else
+                    LOGERR (klogErr, rc, "Fail from KMagicTableInit");
+                    
+                KMagicTableRelease (self->table);
+            }
+            else
+                LOGERR (klogErr, rc, "Fail from KMagicTableMake");
+        }
+        else
+            LOGERR (klogErr, rc, "Fail from KFileFormatInit");
+        free (self);
+    }
+    return rc;
+}
+
diff --git a/libs/kfs/file-v2.c b/libs/kfs/file-v2.c
new file mode 100644
index 0000000..3e49010
--- /dev/null
+++ b/libs/kfs/file-v2.c
@@ -0,0 +1,724 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+struct KFile_v2;
+#define KFILE_IMPL struct KFile_v2
+#define KFILE_VERS 2
+
+#include <kfs/extern.h>
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <kfs/file-impl.h>
+#include <klib/rc.h>
+#include <kproc/timeout.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * KFile
+ *  a file
+ */
+
+KITFTOK_DEF ( KFile_v2 );
+
+/* GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ */
+LIB_EXPORT struct KSysFile_v2 * CC KFileGetSysFile_v2 ( const KFile_v2 *self, ctx_t ctx, uint64_t *offset )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcRetrieving );
+
+    if ( offset == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad offset parameter" );
+
+    else
+    {
+        * offset = 0;
+
+        if ( self == NULL )
+            INTERNAL_ERROR ( xcSelfNull, "failed to retrieve file" );
+        else
+        {
+            const KFile_v2_vt * vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+            if ( vt == NULL )
+                INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+
+            else
+            {
+                return ( * vt -> get_sysfile ) ( self, ctx, offset );
+            }
+        }
+    }
+
+    return NULL;
+}
+
+/* RandomAccess
+ *  ALMOST by definition, the file is random access
+ *  certain file types ( notably compressors ) will refuse random access
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+LIB_EXPORT bool CC KFileRandomAccess_v2 ( const KFile_v2 *self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to access file" );
+
+    else 
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+            return ( *vt -> random_access ) ( self, ctx );
+    }
+
+    return false;
+}
+
+/* Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+LIB_EXPORT uint32_t CC KFileType_v2 ( const KFile_v2 *self, ctx_t ctx )
+{
+    if ( self == NULL )
+        return kfdNull;
+    else
+    {
+        FUNC_ENTRY ( ctx, rcFS, rcFile, rcAccessing );
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+            return ( *vt -> get_type ) ( self, ctx );
+
+    }
+
+    return kfdInvalid;
+}
+
+/* Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+LIB_EXPORT uint64_t CC KFileSize_v2 ( const KFile_v2 *self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to access file" );
+    else
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+            return ( *vt -> get_size ) ( self, ctx );
+
+    }
+
+    return 0;
+}
+
+/* SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+LIB_EXPORT void CC KFileSetSize_v2 ( KFile_v2 *self, ctx_t ctx, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcResizing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to access file" );
+
+    else if ( ! self -> write_enabled )
+        INTERNAL_ERROR ( xcFileReadOnly, "file has no write permissions" );
+
+    else
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+            ( * vt -> set_size ) ( self, ctx, size );
+    }
+}
+
+/* Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - number of bytes actually read
+ */
+LIB_EXPORT size_t CC KFileRead_v2 ( const KFile_v2 *self, ctx_t ctx, uint64_t pos,
+    void *buffer, size_t bsize )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcReading );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to access file" );
+
+    else if ( ! self -> read_enabled )
+        INTERNAL_ERROR ( xcFileWriteOnly, "file has no read permissions" );
+
+    else if ( buffer == NULL )
+        INTERNAL_ERROR ( xcParamNull, "buffer is NULL" );
+    else if ( bsize == 0 )
+        INTERNAL_ERROR ( xcBufferInsufficient, "size of buffer is insufficient" );
+
+    else
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+            return ( *vt -> read ) ( self, ctx, pos, buffer, bsize );
+    }
+    
+    return 0;
+}
+
+LIB_EXPORT size_t CC KFileTimedRead_v2 ( const KFile_v2 *self, ctx_t ctx, uint64_t pos,
+    void *buffer, size_t bsize, struct timeout_t *tm )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcReading );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to read file" );
+
+    else if ( ! self -> read_enabled )
+        INTERNAL_ERROR ( xcFileWriteOnly, "file has no read permissions" );
+
+    else if ( buffer == NULL )
+        INTERNAL_ERROR ( xcParamNull, "buffer is NULL" );
+    else if ( bsize == 0 )
+        INTERNAL_ERROR ( xcBufferInsufficient, "size of buffer is insufficient" );
+
+    else 
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+            return ( *vt -> timed_read ) ( self, ctx, pos, buffer, bsize, tm );
+    }
+
+    return 0;
+}
+
+/* ReadAll
+ *  read from file until "bsize" bytes have been retrieved
+ *  or until end-of-input
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of file.
+ */
+LIB_EXPORT size_t CC KFileReadAll_v2 ( const KFile_v2 *self, ctx_t ctx, uint64_t pos,
+    void *buffer, size_t bsize )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcReading );
+
+    size_t total = 0;
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to read file" );
+
+    else if ( ! self -> read_enabled )
+        INTERNAL_ERROR ( xcFileWriteOnly, "file has no read permissions" );
+
+    else if ( buffer == NULL )
+        INTERNAL_ERROR ( xcParamNull, "buffer is NULL" );
+    else if ( bsize == 0 )
+        INTERNAL_ERROR ( xcBufferInsufficient, "size of buffer is insufficient" );
+
+    else 
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+        {
+            TRY ( total = ( *vt -> read ) ( self, ctx, pos, buffer, bsize ) )
+            {
+                if ( total != 0 && total < bsize )
+                {
+                    uint8_t *b;
+                    size_t count;
+
+                    timeout_t no_block;
+                    TimeoutInit ( & no_block, 0 );
+                
+                    for ( b = buffer; total < bsize; total += count )
+                    {
+                        TRY ( count = ( *vt -> timed_read ) ( self, ctx, pos + total, b + total, bsize - total, & no_block ) )
+                        {
+                            if ( count == 0 )
+                                break;
+                        }
+                        CATCH_ALL ()
+                        {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return total;
+}
+
+LIB_EXPORT size_t CC KFileTimedReadAll_v2 ( const KFile_v2 *self, ctx_t ctx, uint64_t pos,
+    void *buffer, size_t bsize, struct timeout_t *tm )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcReading );
+
+    size_t total = 0;
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to read file" );
+
+    else if ( ! self -> read_enabled )
+        INTERNAL_ERROR ( xcFileWriteOnly, "file has no read permissions" );
+
+    else if ( buffer == NULL )
+        INTERNAL_ERROR ( xcParamNull, "buffer is NULL" );
+    else if ( bsize == 0 )
+        INTERNAL_ERROR ( xcBufferInsufficient, "size of buffer is insufficient" );
+
+    else
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+        {
+            TRY ( total = ( *vt -> timed_read ) ( self, ctx, pos, buffer, bsize, tm ) )
+            {
+                if ( total != 0 && total < bsize )
+                {
+                    uint8_t *b;
+                    size_t count;
+
+                    timeout_t no_block;
+                    TimeoutInit ( & no_block, 0 );
+                    
+                    for ( b = buffer; total < bsize; total += count )
+                    {
+                        TRY ( count = ( *vt -> timed_read ) ( self, ctx, pos + total, b + total, bsize - total, & no_block ) )
+                        {
+                            if ( count == 0 )
+                                break;
+                        }
+                        CATCH_ALL ()
+                        {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return total;
+}
+
+/* ReadExactly
+ * TimedReadExactly
+ *  read from file until "bytes" have been retrieved
+ *  or return incomplete transfer error
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bytes" [ IN ] - return buffer for read
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+LIB_EXPORT void CC KFileReadExactly_v2 ( const KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, void *buffer, size_t bytes )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcReading );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to read file" );
+
+    else if ( ! self -> read_enabled )
+        INTERNAL_ERROR ( xcFileWriteOnly, "file has no read permissions" );
+
+    else if ( bytes == 0 )
+        return;
+    else if ( buffer == NULL )
+        INTERNAL_ERROR ( xcParamNull, "buffer is NULL" );
+
+    else
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+        {
+            size_t total = 0;
+
+            TRY ( total = ( *vt -> read ) ( self, ctx, pos, buffer, bytes ) )
+            {
+                uint8_t *b;
+                size_t count;
+
+                for ( b = buffer ; total < bytes; total += count )
+                {
+                    TRY ( count = ( *vt -> read ) ( self, ctx, pos + total, b + total, bytes - total ) )
+                    {
+                        if ( count == 0 )
+                        {
+                            SYSTEM_ERROR ( xcTransferIncomplete, "failed to read complete file" );
+                            break;
+                        }
+                    }
+#if 0
+                    CATCH ( xcTimeoutExhausted )
+                    {
+                        /* ignore and try again */
+                        CLEAR ();
+                        count = 0;
+                    }
+#endif
+                    CATCH_ALL ()
+                    {
+                        rc_t rc = ctx -> rc;
+                        if ( GetRCObject ( rc ) != ( enum RCObject ) rcTimeout || GetRCState ( rc ) != rcExhausted )
+                            break;
+
+                        CLEAR ();
+                        count = 0;
+                    }
+                }
+            }
+        }
+    }
+}
+
+LIB_EXPORT void CC KFileTimedReadExactly_v2 ( const KFile_v2 *self, ctx_t ctx,
+    uint64_t pos, void *buffer, size_t bytes, struct timeout_t *tm )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcReading );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to read file" );
+
+    else if ( ! self -> read_enabled )
+        INTERNAL_ERROR ( xcFileWriteOnly, "file has no read permissions" );
+
+    else if ( bytes == 0 )
+        return;
+    else if ( buffer == NULL )
+        INTERNAL_ERROR ( xcParamNull, "buffer is NULL" );
+
+    else
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+        {
+            size_t total;
+
+            TRY ( total = ( *vt -> timed_read ) ( self, ctx, pos, buffer, bytes, tm ) )
+            {
+                uint8_t *b;
+                size_t count;
+
+                for ( b = buffer, total = 0; total < bytes; total += count )
+                {
+                    TRY ( count = ( *vt -> timed_read ) ( self, ctx, pos + total, b + total, bytes - total, tm ) )
+                    {
+                        if ( count == 0 )
+                        {
+                            INTERNAL_ERROR ( xcTransferIncomplete, "failed to read complete file" );
+                            break;
+                        }
+                    }
+#if 0
+                    CATCH ( xcTimeoutExhausted )
+                    {
+                        /* ignore and try again */
+                        CLEAR ();
+                        count = 0;
+                    }
+#endif
+                    CATCH_ALL ()
+                    {
+                        rc_t rc = ctx -> rc;
+                        if ( GetRCObject ( rc ) != ( enum RCObject ) rcTimeout || GetRCState ( rc ) != rcExhausted )
+                            break;
+
+                        CLEAR ();
+                        count = 0;
+                    }
+                }
+            }
+        }
+    }
+}
+
+/* Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT ] - number of bytes actually written
+ */
+LIB_EXPORT size_t CC KFileWrite_2 ( KFile_v2 *self, ctx_t ctx, uint64_t pos,
+    const void *buffer, size_t size )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcWriting );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to read file" );
+
+    if ( ! self -> write_enabled )
+        INTERNAL_ERROR ( xcFileReadOnly, "file has no write permissions" );
+
+    else if ( buffer == NULL )
+        INTERNAL_ERROR ( xcParamNull, "buffer is NULL" );
+
+    else 
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+            return ( *vt -> write ) ( self, ctx, pos, buffer, size );
+    }
+    return 0;
+}
+
+LIB_EXPORT size_t CC KFileTimedWrite_v2 ( KFile_v2 *self, ctx_t ctx, uint64_t pos,
+    const void *buffer, size_t size, struct timeout_t *tm )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcWriting );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to read file" );
+
+    if ( ! self -> write_enabled )
+        INTERNAL_ERROR ( xcFileReadOnly, "file has no write permissions" );
+
+    else if ( buffer == NULL )
+        INTERNAL_ERROR ( xcParamNull, "buffer is NULL" );
+
+    else
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+            return ( *vt -> timed_write ) ( self, ctx, pos, buffer, size, tm );
+    }
+    return 0;
+}
+
+/* WriteAll
+ *  write from file until "size" bytes have been transferred
+ *  or until no further progress can be made
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+LIB_EXPORT size_t CC KFileWriteAll_v2 ( KFile_v2 *self, ctx_t ctx, uint64_t pos,
+    const void *buffer, size_t size )
+{
+    size_t total = 0;
+
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcWriting );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to read file" );
+
+    if ( ! self -> write_enabled )
+        INTERNAL_ERROR ( xcFileReadOnly, "file has no write permissions" );
+
+    else if ( buffer == NULL )
+        INTERNAL_ERROR ( xcParamNull, "buffer is NULL" );
+
+    else
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+        {
+            size_t count;
+
+            TRY ( total = count = ( *vt -> write ) ( self, ctx, pos, buffer, size ) )
+            {
+                if ( count != 0 && count < size )
+                {
+                    const uint8_t *b;
+                    timeout_t no_block;
+                    TimeoutInit ( & no_block, 0 );
+                
+                    for ( b = buffer; total < size; total += count )
+                    {
+                        TRY ( count = ( *vt -> timed_write ) 
+                              ( self, ctx, pos + total, b + total, size - total, & no_block ) )
+                        {
+                            if ( count == 0 )
+                                break;
+                        }
+                        CATCH_ALL ()
+                        {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return total;
+}
+
+LIB_EXPORT size_t CC KFileTimedWriteAll_v2 ( KFile_v2 *self, ctx_t ctx, uint64_t pos,
+    const void *buffer, size_t size, struct timeout_t *tm )
+{
+    size_t total = 0;
+
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcWriting );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to read file" );
+
+    if ( ! self -> write_enabled )
+        INTERNAL_ERROR ( xcFileReadOnly, "file has no write permissions" );
+
+    else if ( buffer == NULL )
+        INTERNAL_ERROR ( xcParamNull, "buffer is NULL" );
+
+    else
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( TO_REFCOUNT_V1 ( self ) -> vt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "this object does not support the KFile_v2 interface" );
+        else
+        {
+            TRY ( total = ( *vt -> timed_write ) ( self, ctx, pos, buffer, size, tm ) )
+            {
+                if ( total != 0 && total < size )
+                {
+                    const uint8_t *b;
+                    size_t count;
+
+                    for ( b = buffer, total = 0; total < size; total += count )
+                    {
+                        TRY ( count = ( *vt -> timed_write )
+                              ( self, ctx, pos + total, b + total, size - total, tm ) )
+                        {
+                            if ( count == 0 )
+                                break;
+                        }
+                        CATCH_ALL ()
+                        {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return total;
+}
+
+/* Init
+ *  initialize a newly allocated file object
+ */
+LIB_EXPORT void CC KFileInit_v2 ( KFile_v2 *self, ctx_t ctx, const KVTable *kvt,
+    const char *fname, bool read_enabled, bool write_enabled )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcConstructing );
+
+    TRY ( KRefcountInit_v1 ( & self -> dad, ctx, kvt, fname ) )
+    {
+        const KFile_v2_vt *vt = KVTABLE_CAST ( kvt, ctx, KFile_v2 );
+        if ( vt == NULL )
+            INTERNAL_ERROR ( xcInterfaceIncorrect, "vtable does not appear to implement KFile_v2" );
+        else switch ( vt -> dad . min )
+        {
+        case 0:
+#if _DEBUGGING
+            if ( vt -> write         == NULL ||
+                 vt -> read          == NULL ||
+                 vt -> set_size      == NULL ||
+                 vt -> get_size      == NULL ||
+                 vt -> random_access == NULL ||
+                 vt -> get_sysfile   == NULL ||
+                 vt -> timed_write   == NULL ||
+                 vt -> timed_read    == NULL ||
+                 vt -> get_type      == NULL )
+                
+                INTERNAL_ERROR ( xcInterfaceInvalid, "null method pointer(s)" );
+#endif
+            break;
+        default:
+            INTERNAL_ERROR ( xcInterfaceInvalid, "file has an invalid version" );
+        }
+
+        self -> read_enabled = ( uint8_t ) ( read_enabled != 0 );
+        self -> write_enabled = ( uint8_t ) ( write_enabled != 0 );
+    }
+}
diff --git a/libs/kfs/file.c b/libs/kfs/file.c
new file mode 100644
index 0000000..3dc88b8
--- /dev/null
+++ b/libs/kfs/file.c
@@ -0,0 +1,1002 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+#include <kfs/impl.h>
+#include <klib/rc.h>
+#include <kproc/timeout.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * KFile
+ *  a file
+ */
+
+/* Destroy
+ *  destroy file
+ */
+LIB_EXPORT rc_t CC KFileDestroy_v1 ( KFile_v1 *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcDestroying, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . destroy ) ( self );
+    }
+
+    return RC ( rcFS, rcFile, rcDestroying, rcInterface, rcBadVersion );
+}
+
+/* GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ */
+LIB_EXPORT struct KSysFile_v1 * CC KFileGetSysFile_v1 ( const KFile_v1 *self, uint64_t *offset )
+{
+    if ( offset != NULL )
+    {
+        * offset = 0;
+        if ( self != NULL )
+        {
+            switch ( self -> vt -> v1 . maj )
+            {
+            case 1:
+                return ( * self -> vt -> v1 . get_sysfile ) ( self, offset );
+            }
+        }
+    }
+    return NULL;
+}
+
+/* AddRef
+ *  creates a new reference
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KFileAddRef ( const KFile_v1 *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KFile" ) )
+        {
+        case krefLimit:
+            return RC ( rcFS, rcFile, rcAttaching, rcRange, rcExcessive );
+        case krefNegative:
+            return RC ( rcFS, rcFile, rcAttaching, rcSelf, rcInvalid );
+        default:
+            break;
+        }
+    }
+    return 0;
+}
+
+/* Release
+ *  discard reference to file
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KFileRelease_v1 ( const KFile_v1 *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KFile" ) )
+        {
+        case krefWhack:
+            if ( self -> dir != NULL )
+                return KDirectoryDestroyFile_v1 ( self -> dir, ( KFile_v1 * ) self );
+            return KFileDestroy_v1 ( ( KFile_v1 * ) self );
+        case krefNegative:
+            return RC ( rcFS, rcFile, rcReleasing, rcRange, rcExcessive );
+        default:
+            break;
+        }
+    }
+
+    return 0;
+}
+
+/* RandomAccess
+ *  ALMOST by definition, the file is random access
+ *  certain file types ( notably compressors ) will refuse random access
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+LIB_EXPORT rc_t CC KFileRandomAccess_v1 ( const KFile_v1 *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . random_access ) ( self );
+    }
+
+    return RC ( rcFS, rcFile, rcAccessing, rcInterface, rcBadVersion );
+}
+
+/* Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+LIB_EXPORT uint32_t CC KFileType_v1 ( const KFile_v1 *self )
+{
+    if ( self == NULL )
+        return kfdNull;
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 1 )
+            return ( * self -> vt -> v1 . get_type ) ( self );
+        break;
+    }
+
+    return kfdInvalid;
+}
+
+/* Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+LIB_EXPORT rc_t CC KFileSize_v1 ( const KFile_v1 *self, uint64_t *size )
+{
+    if ( size == NULL )
+        return RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+
+    * size = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . get_size ) ( self, size );
+    }
+
+    return RC ( rcFS, rcFile, rcAccessing, rcInterface, rcBadVersion );
+}
+
+/* SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+LIB_EXPORT rc_t CC KFileSetSize_v1 ( KFile_v1 *self, uint64_t size )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcResizing, rcSelf, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcFS, rcFile, rcResizing, rcFile, rcNoPerm );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . set_size ) ( self, size );
+    }
+
+    return RC ( rcFS, rcFile, rcResizing, rcInterface, rcBadVersion );
+}
+
+/* Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - number of bytes actually read
+ */
+LIB_EXPORT rc_t CC KFileRead_v1 ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    if ( num_read == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+
+    * num_read = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcFS, rcFile, rcReading, rcFile, rcNoPerm );
+
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcNull );
+    if ( bsize == 0 )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcInsufficient );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . read ) ( self, pos, buffer, bsize, num_read );
+    }
+
+    return RC ( rcFS, rcFile, rcReading, rcInterface, rcBadVersion );
+}
+
+LIB_EXPORT rc_t CC KFileTimedRead_v1 ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm )
+{
+    if ( num_read == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+
+    * num_read = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcFS, rcFile, rcReading, rcFile, rcNoPerm );
+
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcNull );
+    if ( bsize == 0 )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcInsufficient );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 2 )
+            return ( * self -> vt -> v1 . timed_read ) ( self, pos, buffer, bsize, num_read, tm );
+        if ( tm == NULL )
+            return ( * self -> vt -> v1 . read ) ( self, pos, buffer, bsize, num_read );
+        break;
+    }
+
+    return RC ( rcFS, rcFile, rcReading, rcInterface, rcBadVersion );
+}
+
+/* ReadAll
+ *  read from file until "bsize" bytes have been retrieved
+ *  or until end-of-input
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of file.
+ */
+LIB_EXPORT rc_t CC KFileReadAll_v1 ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+    uint8_t *b;
+    size_t total, count;
+
+    if ( num_read == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+
+    * num_read = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcFS, rcFile, rcReading, rcFile, rcNoPerm );
+
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcNull );
+    if ( bsize == 0 )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcInsufficient );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        count = 0;
+        rc = ( * self -> vt -> v1 . read ) ( self, pos, buffer, bsize, & count );
+        total = count;
+
+        if ( rc == 0 && count != 0 && count < bsize )
+        {
+            if ( self -> vt -> v1 . min >= 2 )
+            {
+                timeout_t no_block;
+                TimeoutInit ( & no_block, 0 );
+
+                for ( b = buffer; total < bsize; total += count )
+                {
+                    count = 0;
+                    rc = ( * self -> vt -> v1 . timed_read ) ( self, pos + total, b + total, bsize - total, & count, & no_block );
+                    if ( rc != 0 )
+                        break;
+                    if ( count == 0 )
+                        break;
+                }
+            }
+            else
+            {
+                for ( b = buffer; total < bsize; total += count )
+                {
+                    count = 0;
+                    rc = ( * self -> vt -> v1 . read ) ( self, pos + total, b + total, bsize - total, & count );
+                    if ( rc != 0 )
+                        break;
+                    if ( count == 0 )
+                        break;
+                }
+            }
+        }
+        break;
+    default:
+        return RC ( rcFS, rcFile, rcReading, rcInterface, rcBadVersion );
+    }
+
+    if ( total != 0 )
+    {
+        * num_read = total;
+        return 0;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KFileTimedReadAll_v1 ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm )
+{
+    rc_t rc;
+    uint8_t *b;
+    size_t total, count;
+
+    if ( num_read == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+
+    * num_read = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcFS, rcFile, rcReading, rcFile, rcNoPerm );
+
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcNull );
+    if ( bsize == 0 )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcInsufficient );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 2 )
+        {
+            count = 0;
+            rc = ( * self -> vt -> v1 . timed_read ) ( self, pos, buffer, bsize, & count, tm );
+            total = count;
+
+            if ( rc == 0 && count != 0 && count < bsize )
+            {
+                timeout_t no_block;
+                TimeoutInit ( & no_block, 0 );
+
+                for ( b = buffer; total < bsize; total += count )
+                {
+                    count = 0;
+                    rc = ( * self -> vt -> v1 . timed_read ) ( self, pos + total, b + total, bsize - total, & count, & no_block );
+                    if ( rc != 0 )
+                        break;
+                    if ( count == 0 )
+                        break;
+                }
+            }
+            break;
+        }
+
+        if ( tm == NULL )
+        {
+            for ( rc = 0, b = buffer, total = 0; total < bsize; total += count )
+            {
+                count = 0;
+                rc = ( * self -> vt -> v1 . read ) ( self, pos + total, b + total, bsize - total, & count );
+                if ( rc != 0 )
+                    break;
+                if ( count == 0 )
+                    break;
+            }
+            break;
+        }
+
+        /* no break */
+    default:
+        return RC ( rcFS, rcFile, rcReading, rcInterface, rcBadVersion );
+    }
+
+    if ( total != 0 )
+    {
+        * num_read = total;
+        return 0;
+    }
+
+    return rc;
+}
+
+/* ReadExactly
+ * TimedReadExactly
+ *  read from file until "bytes" have been retrieved
+ *  or return incomplete transfer error
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bytes" [ IN ] - return buffer for read
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+LIB_EXPORT rc_t CC KFileReadExactly_v1 ( const KFile_v1 *self,
+    uint64_t pos, void *buffer, size_t bytes )
+{
+    rc_t rc;
+    uint8_t *b;
+    size_t total, count;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcFS, rcFile, rcReading, rcFile, rcNoPerm );
+
+    if ( bytes == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        for ( b = buffer, total = 0; total < bytes; total += count )
+        {
+            count = 0;
+            rc = ( * self -> vt -> v1 . read ) ( self, pos + total, b + total, bytes - total, & count );
+            if ( rc != 0 )
+            {
+                if ( GetRCObject ( rc ) != ( enum RCObject ) rcTimeout || GetRCState ( rc ) != rcExhausted )
+                    break;
+            }
+            else if ( count == 0 )
+            {
+                rc = RC ( rcFS, rcFile, rcReading, rcTransfer, rcIncomplete );
+                break;
+            }
+        }
+        break;
+    default:
+        rc = RC ( rcFS, rcFile, rcReading, rcInterface, rcBadVersion );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KFileTimedReadExactly_v1 ( const KFile_v1 *self,
+    uint64_t pos, void *buffer, size_t bytes, struct timeout_t *tm )
+{
+    rc_t rc;
+    uint8_t *b;
+    size_t total, count;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcFS, rcFile, rcReading, rcFile, rcNoPerm );
+
+    if ( bytes == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 2 )
+        {
+            for ( b = buffer, total = 0; total < bytes; total += count )
+            {
+                count = 0;
+                rc = ( * self -> vt -> v1 . timed_read ) ( self, pos + total, b + total, bytes - total, & count, tm );
+                if ( rc != 0 )
+                {
+                    if ( tm != NULL )
+                        break;
+                    if ( GetRCObject ( rc ) != ( enum RCObject ) rcTimeout || GetRCState ( rc ) != rcExhausted )
+                        break;
+                }
+                else if ( count == 0 )
+                {
+                    rc = RC ( rcFS, rcFile, rcReading, rcTransfer, rcIncomplete );
+                    break;
+                }
+            }
+            break;
+        }
+
+        if ( tm == NULL )
+        {
+            for ( b = buffer, total = 0; total < bytes; total += count )
+            {
+                count = 0;
+                rc = ( * self -> vt -> v1 . read ) ( self, pos + total, b + total, bytes - total, & count );
+                if ( rc != 0 )
+                {
+                    if ( GetRCObject ( rc ) != ( enum RCObject ) rcTimeout || GetRCState ( rc ) != rcExhausted )
+                        break;
+                }
+                else if ( count == 0 )
+                {
+                    rc = RC ( rcFS, rcFile, rcReading, rcTransfer, rcIncomplete );
+                    break;
+                }
+            }
+            break;
+        }
+
+        /* no break */
+    default:
+        return RC ( rcFS, rcFile, rcReading, rcInterface, rcBadVersion );
+    }
+
+    return rc;
+}
+
+/* Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT ] - number of bytes actually written
+ */
+LIB_EXPORT rc_t CC KFileWrite_v1 ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    size_t ignore;
+    if ( num_writ == NULL )
+        num_writ = & ignore;
+
+    * num_writ = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcSelf, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcFS, rcFile, rcWriting, rcFile, rcNoPerm );
+
+    if ( size == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . write ) ( self, pos, buffer, size, num_writ );
+    }
+
+    return RC ( rcFS, rcFile, rcWriting, rcInterface, rcBadVersion );
+}
+
+LIB_EXPORT rc_t CC KFileTimedWrite_v1 ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm )
+{
+    size_t ignore;
+    if ( num_writ == NULL )
+        num_writ = & ignore;
+
+    * num_writ = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcSelf, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcFS, rcFile, rcWriting, rcFile, rcNoPerm );
+
+    if ( size == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 2 )
+            return ( * self -> vt -> v1 . timed_write ) ( self, pos, buffer, size, num_writ, tm );
+        if ( tm == NULL )
+            return ( * self -> vt -> v1 . write ) ( self, pos, buffer, size, num_writ );
+        break;
+    }
+
+    return RC ( rcFS, rcFile, rcWriting, rcInterface, rcBadVersion );
+}
+
+/* WriteAll
+ *  write from file until "size" bytes have been transferred
+ *  or until no further progress can be made
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+LIB_EXPORT rc_t CC KFileWriteAll_v1 ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    rc_t rc;
+    const uint8_t *b;
+    size_t total, count;
+
+    size_t ignore;
+    if ( num_writ == NULL )
+        num_writ = & ignore;
+
+    * num_writ = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcSelf, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcFS, rcFile, rcWriting, rcFile, rcNoPerm );
+
+    if ( size == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        count = 0;
+        rc = ( * self -> vt -> v1 . write ) ( self, pos, buffer, size, & count );
+        total = count;
+
+        if ( rc == 0 && count != 0 && count < size )
+        {
+            if ( self -> vt -> v1 . min >= 2 )
+            {
+                timeout_t no_block;
+                TimeoutInit ( & no_block, 0 );
+
+                for ( b = buffer; total < size; total += count )
+                {
+                    count = 0;
+                    rc = ( * self -> vt -> v1 . timed_write ) ( self, pos + total, b + total, size - total, & count, & no_block );
+                    if ( rc != 0 )
+                        break;
+                    if ( count == 0 )
+                        break;
+                }
+            }
+            else
+            {
+                for ( b = buffer; total < size; total += count )
+                {
+                    count = 0;
+                    rc = ( * self -> vt -> v1 . write ) ( self, pos + total, b + total, size - total, & count );
+                    if ( rc != 0 )
+                        break;
+                    if ( count == 0 )
+                        break;
+                }
+            }
+        }
+        break;
+    default:
+        return RC ( rcFS, rcFile, rcWriting, rcInterface, rcBadVersion );
+    }
+
+    * num_writ = total;
+    if ( total == size )
+        return 0;
+    if ( rc == 0 )
+        return RC ( rcFS, rcFile, rcWriting, rcTransfer, rcIncomplete );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KFileTimedWriteAll_v1 ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm )
+{
+    rc_t rc;
+    const uint8_t *b;
+    size_t total, count;
+
+    size_t ignore;
+    if ( num_writ == NULL )
+        num_writ = & ignore;
+
+    * num_writ = 0;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcSelf, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcFS, rcFile, rcWriting, rcFile, rcNoPerm );
+
+    if ( size == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 2 )
+        {
+            for ( rc = 0, b = buffer, total = 0; total < size; total += count )
+            {
+                count = 0;
+                rc = ( * self -> vt -> v1 . timed_write ) ( self, pos + total, b + total, size - total, & count, tm );
+                if ( rc != 0 )
+                    break;
+                if ( count == 0 )
+                    break;
+            }
+            break;
+        }
+
+        if ( tm == NULL )
+        {
+            for ( rc = 0, b = buffer, total = 0; total < size; total += count )
+            {
+                count = 0;
+                rc = ( * self -> vt -> v1 . write ) ( self, pos + total, b + total, size - total, & count );
+                if ( rc != 0 )
+                    break;
+                if ( count == 0 )
+                    break;
+            }
+            break;
+        }
+
+        /* no break */
+
+    default:
+        return RC ( rcFS, rcFile, rcWriting, rcInterface, rcBadVersion );
+    }
+
+    * num_writ = total;
+    if ( total == size )
+        return 0;
+    if ( rc == 0 )
+        return RC ( rcFS, rcFile, rcWriting, rcTransfer, rcIncomplete );
+    return rc;
+}
+
+/* Init
+ *  initialize a newly allocated file object
+ */
+LIB_EXPORT rc_t CC KFileInit ( KFile_v1 *self, const KFile_vt *vt,
+    const char *classname, const char *fname,
+    bool read_enabled, bool write_enabled )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcSelf, rcNull );
+    if ( vt == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcNull );
+    switch ( vt -> v1 . maj )
+    {
+    case 0:
+        return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcInvalid );
+
+    case 1:
+        switch ( vt -> v1 . min )
+        {
+            /* ADD NEW MINOR VERSION CASES HERE */
+        case 2:
+#if _DEBUGGING
+            if ( vt -> v1 . timed_write == NULL ||
+                 vt -> v1 . timed_read == NULL )
+                return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcNull );
+#endif
+        case 1:
+#if _DEBUGGING
+            if ( vt -> v1 . get_type == NULL )
+                return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcNull );
+#endif
+            /* no break */
+        case 0:
+#if _DEBUGGING
+        if ( vt -> v1 . write == NULL         ||
+             vt -> v1 . read == NULL          ||
+             vt -> v1 . set_size == NULL      ||
+             vt -> v1 . get_size == NULL      ||
+             vt -> v1 . random_access == NULL ||
+             vt -> v1 . get_sysfile == NULL   ||
+             vt -> v1 . destroy == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcNull );
+#endif
+            break;
+        default:
+            return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcBadVersion );
+        }
+        break;
+
+    default:
+        return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcBadVersion );
+    }
+
+    self -> vt = vt;
+    self -> dir = NULL;
+    KRefcountInit ( & self -> refcount, 1, classname, "init", fname );
+    self -> read_enabled = ( uint8_t ) ( read_enabled != 0 );
+    self -> write_enabled = ( uint8_t ) ( write_enabled != 0 );
+
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * 
+ */
+
+
+#undef KFileRelease
+LIB_EXPORT rc_t CC KFileRelease ( const KFile_v1 *self )
+{
+    return KFileRelease_v1 ( self );
+}
+
+#undef KFileRandomAccess
+LIB_EXPORT rc_t CC KFileRandomAccess ( const KFile_v1 *self )
+{
+    return KFileRandomAccess_v1 ( self );
+}
+
+#undef KFileType
+LIB_EXPORT uint32_t CC KFileType ( const KFile_v1 *self )
+{
+    return KFileType_v1 ( self );
+}
+
+#undef KFileSize
+LIB_EXPORT rc_t CC KFileSize ( const KFile_v1 *self, uint64_t *size )
+{
+    return KFileSize_v1 ( self, size );
+}
+
+#undef KFileSetSize
+LIB_EXPORT rc_t CC KFileSetSize ( KFile_v1 *self, uint64_t size )
+{
+    return KFileSetSize_v1 ( self, size );
+}
+
+#undef KFileRead
+LIB_EXPORT rc_t CC KFileRead ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    return KFileRead_v1 ( self, pos, buffer, bsize, num_read );
+}
+
+#undef KFileTimedRead
+LIB_EXPORT rc_t CC KFileTimedRead ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm )
+{
+    return KFileTimedRead_v1 ( self, pos, buffer, bsize, num_read, tm );
+}
+
+#undef KFileReadAll
+LIB_EXPORT rc_t CC KFileReadAll ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    return KFileReadAll_v1 ( self, pos, buffer, bsize, num_read );
+}
+
+#undef KFileTimedReadAll
+LIB_EXPORT rc_t CC KFileTimedReadAll ( const KFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm )
+{
+    return KFileTimedReadAll_v1 ( self, pos, buffer, bsize, num_read, tm );
+}
+
+#undef KFileReadExactly
+LIB_EXPORT rc_t CC KFileReadExactly ( const KFile_v1 *self, 
+    uint64_t pos, void *buffer, size_t bytes )
+{
+    return KFileReadExactly_v1 ( self, pos, buffer, bytes );
+}
+
+#undef KFileTimedReadExactly
+LIB_EXPORT rc_t CC KFileTimedReadExactly ( const KFile_v1 *self,
+    uint64_t pos, void *buffer, size_t bytes, struct timeout_t *tm )
+{
+    return KFileTimedReadExactly_v1 ( self, pos, buffer, bytes, tm );
+}
+
+#undef KFileWrite
+LIB_EXPORT rc_t CC KFileWrite ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    return KFileWrite_v1 ( self, pos, buffer, size, num_writ );
+}
+
+#undef KFileTimedWrite
+LIB_EXPORT rc_t CC KFileTimedWrite ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm )
+{
+    return KFileTimedWrite_v1 ( self, pos, buffer, size, num_writ, tm );
+}
+
+#undef KFileWriteAll
+LIB_EXPORT rc_t CC KFileWriteAll ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    return KFileWriteAll_v1 ( self, pos, buffer, size, num_writ );
+}
+
+#undef KFileTimedWriteAll
+LIB_EXPORT rc_t CC KFileTimedWriteAll ( KFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm )
+{
+    return KFileTimedWriteAll_v1 ( self, pos, buffer, size, num_writ, tm );
+}
+
+#if 0
+#undef KFileWriteExactly
+LIB_EXPORT rc_t CC KFileWriteExactly ( KFile_v1 *self, 
+    uint64_t pos, const void *buffer, size_t bytes )
+{
+    return KFileWriteExactly_v1 ( self, pos, buffer, bytes );
+}
+
+#undef KFileTimedWriteExactly
+LIB_EXPORT rc_t CC KFileTimedWriteExactly ( KFile_v1 *self, 
+    uint64_t pos, const void *buffer, size_t bytes, struct timeout_t *tm )
+{
+    return KFileTimedWriteExactly_v1 ( self, pos, buffer, bytes, tm ); 
+}
+#endif
+
+#undef KFileMakeStdIn
+LIB_EXPORT rc_t CC KFileMakeStdIn ( const KFile_v1 **std_in )
+{
+    return KFileMakeStdIn_v1 ( std_in );
+}
+
+#undef KFileMakeStdOut
+LIB_EXPORT rc_t CC KFileMakeStdOut ( KFile_v1 **std_out )
+{
+    return KFileMakeStdOut_v1 ( std_out );
+}
+
+#undef KFileMakeStdErr
+LIB_EXPORT rc_t CC KFileMakeStdErr ( KFile_v1 **std_err )
+{
+    return KFileMakeStdErr_v1 ( std_err );
+}
diff --git a/libs/kfs/fileformat-priv.h b/libs/kfs/fileformat-priv.h
new file mode 100644
index 0000000..4f19e62
--- /dev/null
+++ b/libs/kfs/fileformat-priv.h
@@ -0,0 +1,124 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_fileformat_priv_
+#define _h_fileformat_priv_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <klib/debug.h>
+
+#define	DEBUG_KFF	1
+
+#ifndef	DEBUG_KFF
+#define	DEBUG_KFF	0
+#endif
+
+#ifdef _DEBUGGING
+#define FUNC_ENTRY() /* DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFFENTRY), ("Enter: %s\n", __func__)) */
+#define KFF_DEBUG(msg) DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_KFF), msg)
+#else
+#define FUNC_ENTRY()
+#define KFF_DEBUG(msg)
+#endif
+
+#define KFILEFORMAT_LATEST 1
+
+#define DESCRLEN_MAX	(256)
+
+typedef struct KFFTables KFFTables;
+/* -----
+ * KFFTablesMake
+ *	Build the tables that contain classes and types.
+ *
+ * This make installs only a default "unknown" description which
+ * will end up with class id and file id of 0.  This FileId 0 will
+ * be in class with id of 0.
+ */
+rc_t KFFTablesMake (KFFTables ** kmmtp);
+
+/* -----
+ * KFFTablesAddClass
+ *	Add class with description (descr) to the tables
+ *	new class id is returned to where pclass points.
+ *	if pclass is NULL the new ID is not returned
+ */
+rc_t KFFTablesAddClass (KFFTables * self,
+			KFileFormatClass * pclass, /* returned new ID */
+			const char * descr,
+			size_t descrlen);
+
+/* -----
+ * KFFTablesAddType
+ *	Add type with description (descr) to the tables
+ *	new type id is returned to where ptype points.
+ *	if ptype is NULL the new ID is not returned
+ *	the new type will be in the refered class
+ */
+rc_t KFFTablesAddType (KFFTables * self,
+		       KFileFormatType * ptype, /* returned new ID */
+		       const char * class,
+		       const char * type,
+		       size_t clen,
+		       size_t tlen);
+
+rc_t KFFTablesAddRef (const KFFTables * self);
+rc_t KFFTablesRelease (const KFFTables * cself);
+
+rc_t KFFTablesGetClassDescr (const KFFTables * self,
+			     KFileFormatClass tid,
+			     size_t * len,
+			     char ** pd);
+rc_t KFFTablesGetTypeDescr (const KFFTables * self,
+			    KFileFormatType tid,
+			    size_t * len,
+			    char ** pd);
+rc_t KFFTablesGetClassId (const KFFTables * self,
+			  const char ** pd,
+			  KFileFormatClass * cid);
+rc_t KFFTablesGetTypeId (const KFFTables * self,
+			 const char * pd,
+			 KFileFormatType * tid,
+			 KFileFormatClass * cid);
+
+
+
+
+
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_fileformat_priv_ */
diff --git a/libs/kfs/fileformat.c b/libs/kfs/fileformat.c
new file mode 100644
index 0000000..f5e781a
--- /dev/null
+++ b/libs/kfs/fileformat.c
@@ -0,0 +1,291 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+#include <klib/rc.h>
+#include <kfs/fileformat.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <sysalloc.h>
+
+
+/* #include <kfs/directory.h> */
+
+#include "impl.h"
+
+#include <stdio.h> /* remove after debugging */
+#include <ctype.h>
+#include <os-native.h>
+#include <string.h>
+
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * KFileFormat
+ *  
+ */
+
+
+/* Destroy
+ *  destroy file
+ */
+rc_t CC KFileFormatDestroy ( KFileFormat *self )
+{
+    FUNC_ENTRY();
+
+    if (self == NULL)
+        return RC (rcFS, rcFile, rcDestroying, rcSelf, rcNull);
+
+    switch (self->vt->v1 . maj)
+    {
+    case 1:
+        return (* self->vt->v1 . destroy) (self);
+    }
+
+    return RC (rcFS, rcFile, rcDestroying, rcInterface, rcBadVersion);
+}
+
+/* AddRef
+ *  creates a new reference
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KFileFormatAddRef ( const KFileFormat *self )
+{
+    FUNC_ENTRY();
+    if (self != NULL)
+        atomic32_inc (& ((KFileFormat*) self)->refcount);
+    return 0;
+}
+
+/* Release
+ *  discard reference to file
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KFileFormatRelease ( const KFileFormat *cself )
+{
+    FUNC_ENTRY();
+    if (cself != NULL)
+    {
+	KFileFormat *self = (KFileFormat*)cself;
+        if (atomic32_dec_and_test (&self->refcount))
+	    return  KFileFormatDestroy (self);
+    }
+    return 0;
+}
+
+
+/* Type
+ *  returns a KFileFormatDesc
+ *  [OUT] rc_t               return
+ *  [IN]  const KFileFormat *  self         
+ *  [IN]  void **            buffer       buffer to hold returned description
+ *  [IN]  size_t             buffer_size  size of the buffer
+ *  [OUT] char **            descr        text description of file type
+ *  [IN]  size_t             descr_max    maximum size of string descr can hold
+ *  [OUT] size_t *           descr_len    length of returned descr (not including NUL
+ */
+LIB_EXPORT rc_t CC KFileFormatGetTypePath ( const KFileFormat *self, 
+			     const struct KDirectory * dir, const char * path,
+			     KFileFormatType * type, KFileFormatClass * class,
+			     char * description, size_t descriptionmax,
+			     size_t * descriptionlength )
+{
+    FUNC_ENTRY();
+
+    if (self == NULL)
+        return RC (rcFF, rcFileFormat, rcClassifying, rcSelf, rcNull);
+
+    switch (self->vt->v1.maj)
+    {
+    case 1:
+        if (self->vt->v1.min >= 1)
+	    return (* self->vt->v1 . gettypepath) (self, dir, path, type, class,
+						   description, descriptionmax,
+						   descriptionlength);
+        break;
+    }
+    return RC (rcFF, rcFileFormat, rcClassifying, rcInterface, rcBadVersion);
+}
+
+LIB_EXPORT rc_t CC KFileFormatGetTypeBuff ( const KFileFormat *self, const void * buff, size_t buff_len,
+			     KFileFormatType * type, KFileFormatClass * class,
+			     char * description, size_t descriptionmax,
+			     size_t * descriptionlength )
+{
+    FUNC_ENTRY();
+
+    if (self == NULL)
+        return RC (rcFF, rcFileFormat, rcClassifying, rcSelf, rcNull);
+
+    switch (self->vt->v1.maj)
+    {
+    case 1:
+        if (self->vt->v1.min >= 1)
+	    return (* self->vt->v1 . gettypebuff) (self, buff, buff_len, type, class,
+						   description, descriptionmax,
+						   descriptionlength);
+        break;
+    }
+    return RC (rcFF, rcFileFormat, rcClassifying, rcInterface, rcBadVersion);
+}
+
+LIB_EXPORT rc_t CC KFileFormatGetClassDescr ( const KFileFormat *self, KFileFormatClass c,
+			       char * description, size_t descriptionmax )
+{
+    rc_t rc;
+    size_t max;
+
+#undef ERROR
+#define ERROR "ERROR"
+#undef NOT_FOUND
+#define NOT_FOUND "NOT FOUND"
+
+    FUNC_ENTRY();
+
+    if (c < kffcError)
+    {
+    error:
+	max = (sizeof (ERROR) > descriptionmax-1) ? descriptionmax-1 : sizeof (ERROR)-1;
+	memmove (description, ERROR, max);
+	description[max] = '\0';
+	return 0;
+    }
+    else if (c == kffcNotFound)
+    {
+	max = (sizeof (NOT_FOUND) > descriptionmax-1) ? descriptionmax-1 : sizeof (NOT_FOUND)-1;
+	memmove (description, NOT_FOUND, max);
+	description[max] = '\0';
+	return 0;
+    }
+    else
+    {
+	char * cp;
+	size_t z;
+
+	rc = KFFTablesGetClassDescr(self->tables, c, &z, &cp);
+	if (rc)
+	    goto error;
+	max = (z > descriptionmax-1) ? descriptionmax-1 : z;
+	memmove (description, cp, max);
+	description[max] = '\0';
+	return 0;
+    }
+
+#undef ERROR
+#undef NOT_FOUND
+}
+static
+rc_t KFileFormatInitTypeAndClass (KFileFormat *self, const char * typeAndClass,
+			    size_t len)
+{
+    rc_t rc;
+    const char * type;
+    const char * class;
+    const char * tab;
+    const char * newline;
+    const char * line;
+    const char * limit;
+
+    FUNC_ENTRY();
+
+    rc = 0;
+    limit = typeAndClass + len;
+    for (line = typeAndClass; line < limit; line = newline+1)
+    {
+	for (type = line; isspace (*type) && len; len--, type++)
+	{
+	    if (len == 0)
+		break;
+	}
+	newline = memchr (type, '\n', len);
+	if (newline == NULL)
+	    newline = type + len;
+	if (*type == '#')
+	{
+	    /* -----
+	     * skip this line
+	     */
+	    len -= newline+1 - type;
+	    continue;
+	}
+	tab = memchr (type, '\t', len);
+	if (tab == NULL)
+	{
+	    rc = RC (rcFF, rcFileFormat, rcConstructing, rcFile, rcInvalid);
+	    LOGERR (klogFatal, rc, "No <TAB> between type and class");
+	    break;
+	}
+	class = tab + 1;
+	for ( len -= class - line;
+	      isspace (*class); len--, class++)
+	{
+	    if (len == 0)
+	    {
+		rc = RC (rcFF, rcFileFormat, rcConstructing, rcFile, rcInvalid);
+		LOGERR (klogFatal, rc, "No class after <TAB>");
+		break;
+	    }
+	}
+	if (newline == class)
+	{
+	    rc = RC (rcFF, rcFileFormat, rcConstructing, rcFile, rcInvalid);
+	    LOGERR (klogFatal, rc, "No class after whitespace");
+	    break;
+	}
+	rc = KFFTablesAddType (self->tables, NULL, class, type, newline-class, tab-type);
+	if (rc != 0)
+	    break;
+    }
+
+    return rc;
+}
+
+rc_t CC KFileFormatInit ( KFileFormat *self, const KFileFormat_vt *vt,
+		      const char * typeAndClass, size_t len )
+{
+    rc_t rc = 0;
+
+    FUNC_ENTRY();
+
+    self->vt = vt;
+    atomic32_set (&self->refcount,1);
+
+    rc = KFFTablesMake(&self->tables);
+    if (rc == 0)
+    {
+	rc = KFileFormatInitTypeAndClass (self, typeAndClass, len);
+
+
+        /* memory leak?  If Tables Make succeeds and InitType and Class fails do we leak? */
+
+    }
+    return rc;
+}
+
+
+
+
diff --git a/libs/kfs/from_to_namelist.c b/libs/kfs/from_to_namelist.c
new file mode 100644
index 0000000..b96028d
--- /dev/null
+++ b/libs/kfs/from_to_namelist.c
@@ -0,0 +1,454 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/namelist.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* ****************************************************************************************** */
+
+
+#define STATE_ALPHA 0
+#define STATE_LF 1
+#define STATE_NL 2
+
+
+typedef struct buffer_range
+{
+    const char * start;
+    uint32_t processed, count, state;
+} buffer_range;
+
+
+static const char empty_str[ 2 ] = { ' ', 0 };
+
+
+static void LoadFromBuffer( VNamelist * nl, buffer_range * range )
+{
+    uint32_t idx;
+    const char * p = range->start;
+    String S;
+
+    S.addr = p;
+    S.len = S.size = range->processed;
+    for ( idx = range->processed; idx < range->count; ++idx )
+    {
+        switch( p[ idx ] )
+        {
+            case 0x0A : switch( range->state )
+                        {
+                            case STATE_ALPHA : /* ALPHA --> LF */
+                                                VNamelistAppendString ( nl, &S );
+                                                range->state = STATE_LF;
+                                                break;
+
+                            case STATE_LF : /* LF --> LF */
+                                             VNamelistAppend ( nl, empty_str );
+                                             break;
+
+                            case STATE_NL : /* NL --> LF */
+                                             VNamelistAppend ( nl, empty_str );
+                                             range->state = STATE_LF;
+                                             break;
+                        }
+                        break;
+
+            case 0x0D : switch( range->state )
+                        {
+                            case STATE_ALPHA : /* ALPHA --> NL */
+                                                VNamelistAppendString ( nl, &S );
+                                                range->state = STATE_NL;
+                                                break;
+
+                            case STATE_LF : /* LF --> NL */
+                                             range->state = STATE_NL;
+                                             break;
+
+                            case STATE_NL : /* NL --> NL */
+                                             VNamelistAppend ( nl, empty_str );
+                                             break;
+                        }
+                        break;
+
+            default   : switch( range->state )
+                        {
+                            case STATE_ALPHA : /* ALPHA --> ALPHA */
+                                                S.len++; S.size++;
+                                                break;
+
+                            case STATE_LF : /* LF --> ALPHA */
+                                             S.addr = &p[ idx ]; S.len = S.size = 1;
+                                             range->state = STATE_ALPHA;
+                                             break;
+
+                            case STATE_NL : /* NL --> ALPHA */
+                                             S.addr = &p[ idx ]; S.len = S.size = 1;
+                                             range->state = STATE_ALPHA;
+                                             break;
+                        }
+                        break;
+        }
+    }
+    if ( range->state == STATE_ALPHA )
+    {
+        range->start = S.addr;
+        range->count = S.len;
+    }
+    else
+        range->count = 0;
+}
+
+
+static rc_t LoadFromFile( struct KFile const * f, VNamelist * nl )
+{
+    rc_t rc = 0;
+    uint64_t pos = 0;
+    char buffer[ 4096 ];
+    buffer_range range;
+    bool done = false;
+
+    range.start = buffer;
+    range.count = 0;
+    range.processed = 0;
+    range.state = STATE_ALPHA;
+
+    do
+    {
+        size_t num_read;
+        rc = KFileRead ( f, pos, ( char * )( range.start + range.processed ),
+                        ( sizeof buffer ) - range.processed, &num_read );
+        if ( rc == 0 )
+        {
+            done = ( num_read == 0 );
+            if ( !done )
+            {
+                range.start = buffer;
+                range.count = range.processed + num_read;
+
+                LoadFromBuffer( nl, &range );
+                if ( range.count > 0 )
+                {
+                    memmove ( buffer, range.start, range.count );
+                }
+                range.start = buffer;
+                range.processed = range.count;
+
+                pos += num_read;
+            }
+            else if ( range.state == STATE_ALPHA )
+            {
+                String S;
+                S.addr = range.start;
+                S.len = S.size = range.count;
+                VNamelistAppendString ( nl, &S );
+            }
+        }
+    } while ( rc == 0 && !done );
+
+    return rc;
+}
+
+
+
+/* -----
+
+ * loads the content of a KFile into a Namelist
+ *
+ */
+LIB_EXPORT rc_t CC LoadKFileToNameList( struct KFile const * self, VNamelist * namelist )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcSelf, rcNull );
+    else if ( namelist == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcParam, rcNull );
+    else
+        rc = LoadFromFile( self, namelist );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC LoadFileByNameToNameList( VNamelist * namelist, const char * filename )
+{
+    rc_t rc;
+    if ( namelist == NULL || filename == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcParam, rcNull );
+    else
+    {
+        KDirectory * dir;
+        rc = KDirectoryNativeDir ( &dir );
+        if ( rc == 0 )
+        {
+            KFile const * f;
+            rc = KDirectoryOpenFileRead ( dir, &f, "%s", filename );
+            if ( rc == 0 )
+            {
+                if ( rc == 0 )
+                    rc = LoadFromFile( f, namelist );
+                KFileRelease ( f );
+            }
+            KDirectoryRelease ( dir );
+        }
+    }
+    return rc;
+
+}
+
+
+static rc_t SaveToFile( struct KFile * f, const VNamelist * nl, const char * delim )
+{
+    uint32_t count;
+    rc_t rc = VNameListCount ( nl, &count );
+    if ( rc == 0 && count > 0 )
+    {
+        uint32_t idx;
+        uint64_t pos = 0;
+        for ( idx = 0; idx < count && rc == 0; ++idx )
+        {
+            const char * s;
+            rc = VNameListGet ( nl, idx, &s );
+            if ( rc == 0 && s != NULL )
+            {
+                size_t num_writ;
+                rc = KFileWriteAll ( f, pos, s, string_size ( s ), &num_writ );
+                if ( rc == 0 )
+                {
+                    pos += num_writ;
+                    rc = KFileWriteAll ( f, pos, delim, string_size ( delim ), &num_writ );
+                    if ( rc == 0 )
+                        pos += num_writ;
+                }
+            }
+        }
+        if ( rc == 0 )
+            rc = KFileSetSize ( f, pos );
+    }
+    return rc;
+}
+
+
+static rc_t ProcessFromBuffer( buffer_range * range,
+    rc_t ( CC * on_line )( const String * line, void * data ), void * data  )
+{
+    rc_t rc = 0;
+    uint32_t idx;
+    const char * p = range->start;
+    String S;
+
+    S.addr = p;
+    S.len = S.size = range->processed;
+    for ( idx = range->processed; idx < range->count && rc == 0; ++idx )
+    {
+        switch( p[ idx ] )
+        {
+            case 0x0A : switch( range->state )
+                        {
+                            case STATE_ALPHA : /* ALPHA --> LF */
+                                                rc = on_line( &S, data );
+                                                range->state = STATE_LF;
+                                                break;
+
+                            case STATE_LF : /* LF --> LF */
+                                             break;
+
+                            case STATE_NL : /* NL --> LF */
+                                             range->state = STATE_LF;
+                                             break;
+                        }
+                        break;
+
+            case 0x0D : switch( range->state )
+                        {
+                            case STATE_ALPHA : /* ALPHA --> NL */
+                                                rc = on_line( &S, data );
+                                                range->state = STATE_NL;
+                                                break;
+
+                            case STATE_LF : /* LF --> NL */
+                                             range->state = STATE_NL;
+                                             break;
+
+                            case STATE_NL : /* NL --> NL */
+                                             break;
+                        }
+                        break;
+
+            default   : switch( range->state )
+                        {
+                            case STATE_ALPHA : /* ALPHA --> ALPHA */
+                                                S.len++; S.size++;
+                                                break;
+
+                            case STATE_LF : /* LF --> ALPHA */
+                                             S.addr = &p[ idx ]; S.len = S.size = 1;
+                                             range->state = STATE_ALPHA;
+                                             break;
+
+                            case STATE_NL : /* NL --> ALPHA */
+                                             S.addr = &p[ idx ]; S.len = S.size = 1;
+                                             range->state = STATE_ALPHA;
+                                             break;
+                        }
+                        break;
+        }
+    }
+    if ( range->state == STATE_ALPHA )
+    {
+        range->start = S.addr;
+        range->count = S.len;
+    }
+    else
+        range->count = 0;
+    return rc;
+}
+
+
+static rc_t ProcessLineByLine( struct KFile const * f,
+        rc_t ( CC * on_line )( const String * line, void * data ), void * data )
+{
+    rc_t rc = 0;
+    uint64_t pos = 0;
+    char buffer[ 4096 ];
+    buffer_range range;
+    bool done = false;
+
+    range.start = buffer;
+    range.count = 0;
+    range.processed = 0;
+    range.state = STATE_ALPHA;
+
+    do
+    {
+        size_t num_read;
+        rc = KFileRead ( f, pos, ( char * )( range.start + range.processed ),
+                        ( sizeof buffer ) - range.processed, &num_read );
+        if ( rc == 0 )
+        {
+            done = ( num_read == 0 );
+            if ( !done )
+            {
+                range.start = buffer;
+                range.count = range.processed + num_read;
+
+                rc = ProcessFromBuffer( &range, on_line, data );
+                if ( range.count > 0 )
+                {
+                    memmove ( buffer, range.start, range.count );
+                }
+                range.start = buffer;
+                range.processed = range.count;
+
+                pos += num_read;
+            }
+            else if ( range.state == STATE_ALPHA )
+            {
+                String S;
+                S.addr = range.start;
+                S.len = S.size = range.count;
+                rc = on_line( &S, data );
+            }
+        }
+    } while ( rc == 0 && !done );
+
+    return rc;
+}
+
+/* -----
+
+ * processes each line in a KFile by the callback
+ *
+ */
+LIB_EXPORT rc_t CC ProcessFileLineByLine( struct KFile const * self,
+    rc_t ( CC * on_line )( const String * line, void * data ), void * data )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcSelf, rcNull );
+    else if ( on_line == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcParam, rcNull );
+    else
+        rc = ProcessLineByLine( self, on_line, data );
+    return rc;
+}
+
+ 
+ 
+/* -----
+
+ * writes content of a Namelist into a KFile
+ *
+ */
+
+LIB_EXPORT rc_t CC WriteNameListToKFile( struct KFile * self, const VNamelist * namelist, 
+                                         const char * delim )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcSelf, rcNull );
+    else if ( namelist == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcParam, rcNull );
+    else
+        rc = SaveToFile( self, namelist, delim );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC WriteNamelistToFileByName( const VNamelist * namelist, const char * filename,
+                                                 const char * delim )
+{
+    rc_t rc;
+    if ( namelist == NULL || filename == NULL || delim == NULL )
+        rc = RC( rcFS, rcFile, rcValidating, rcParam, rcNull );
+    else
+    {
+        KDirectory * dir;
+        rc = KDirectoryNativeDir ( &dir );
+        if ( rc == 0 )
+        {
+            KFile * f;
+            rc = KDirectoryCreateFile( dir, &f, true, 0664, kcmInit, "%s", filename );
+            if ( rc == 0 )
+            {
+                if ( rc == 0 )
+                    rc = SaveToFile( f, namelist, delim );
+                KFileRelease ( f );
+            }
+            KDirectoryRelease ( dir );
+        }
+    }
+    return rc;
+}
diff --git a/libs/kfs/gzip.c b/libs/kfs/gzip.c
new file mode 100644
index 0000000..beb22fb
--- /dev/null
+++ b/libs/kfs/gzip.c
@@ -0,0 +1,646 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+struct KGZipFile;
+#define KFILE_IMPL struct KGZipFile
+
+#include <kfs/extern.h>
+#include <kfs/impl.h>  /* KFile_vt_v1 */
+#include <kfs/gzip.h>  /* KFileMakeGzipFor... */
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <sysalloc.h>
+
+#include <zlib.h>      /* z_stream */
+#include <assert.h>
+#include <stdlib.h>    /* malloc */
+#include <string.h> /* memset */
+
+#ifdef _DEBUGGING
+#define GZIP_DEBUG(msg) DBGMSG(DBG_KFS,DBG_FLAG(DBG_KFS_GZIP), msg)
+#else
+#define GZIP_DEBUG(msg)
+#endif
+
+/***************************************************************************************/
+/* Gzip File                                                                     */
+/***************************************************************************************/
+
+#define GZFCHUNK 0x20000    /* 128K */
+/** Gzip KFile structure */
+struct KGZipFile {
+    KFile dad;
+    KFile *file; /* inderlying KFile */
+    uint64_t filePosition;
+    uint64_t myPosition;
+    z_stream strm;
+    unsigned char buff[GZFCHUNK]; /* buffer to cache KFile data */
+    bool completed;
+};
+typedef struct KGZipFile KGZipFile;
+
+/* virtual functions declarations (definitions for unsupported ) ***********************/
+
+static struct KSysFile *CC s_GetSysFile(const KGZipFile *self,
+    uint64_t *offset)
+{ return NULL; }
+
+static rc_t CC s_FileRandomAccess(const KGZipFile *self)
+{ return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported ); }
+
+static uint32_t CC s_FileType ( const KGZipFile *self )
+{ return KFileType ( self -> file ); }
+
+static rc_t CC s_FileSize(const KGZipFile *self, uint64_t *size)
+{ return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported ); }
+
+static rc_t CC s_FileSetSize(KGZipFile *self,
+    uint64_t size)
+{ return RC ( rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported ); }
+
+/* read-only methods *******************************************************************/
+
+static rc_t CC KGZipFile_InDestroy(KGZipFile *self);
+
+static rc_t CC KGZipFile_InRead(const KGZipFile *cself,
+    uint64_t pos,
+    void *buffer,
+    size_t bsize,
+    size_t *num_read);
+
+static rc_t CC KGZipFile_InWrite(KGZipFile *self,
+    uint64_t pos,
+    const void *buffer,
+    size_t size,
+    size_t *num_writ)
+{ return RC ( rcFS, rcFile, rcWriting, rcFunction, rcUnsupported ); }
+
+/** virtual table **********************************************************************/
+static KFile_vt_v1 s_vtKFile_InGz = {
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KGZipFile_InDestroy,
+    s_GetSysFile,
+    s_FileRandomAccess,
+    s_FileSize,
+    s_FileSetSize,
+    KGZipFile_InRead,
+    KGZipFile_InWrite,
+
+    /* 1.1 */
+    s_FileType
+};
+
+#define WINDOW_BITS (15 + 16)
+
+/** Factory method definition **********************************************************/
+
+LIB_EXPORT rc_t CC KFileMakeGzipForRead( const struct KFile **result,
+    const struct KFile *file )
+{
+    rc_t rc;
+    z_stream* strm;
+    KGZipFile *obj;
+
+    if ( result == NULL || file == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+
+    obj = (KGZipFile*) malloc(sizeof(KGZipFile));
+    if (!obj)
+        return RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+
+    rc = KFileInit(&obj->dad, (const KFile_vt*) &s_vtKFile_InGz, "KGZipFile", "no-name", true, false);
+    if (rc != 0) {
+        free(obj);
+        return rc;
+    }
+
+    strm = &obj->strm;
+    strm->zalloc   = Z_NULL;
+    strm->zfree    = Z_NULL;
+    strm->opaque   = Z_NULL;
+    strm->avail_in = 0;
+    strm->next_in  = Z_NULL;
+
+    /* TBD - this should check gzlib error codes */
+    if (inflateInit2(strm, WINDOW_BITS) != Z_OK) {
+        free(obj);
+        return RC ( rcFS, rcFile, rcConstructing, rcNoObj, rcUnknown );
+    }
+
+        obj->myPosition   = 0;
+        obj->filePosition = 0;
+
+    rc = KFileAddRef(file);
+    if ( rc != 0 )
+    {
+        obj->file = NULL;
+        KGZipFile_InDestroy ( obj );
+    }
+    else
+    {
+        obj->file = (KFile*) file;
+        obj->completed = true; /* we could have an empty file and this would be okay */
+        *result = &obj->dad;
+    }
+
+    return rc;
+}
+
+/* private functions declarations ******************************************************/
+
+static rc_t z_read ( KGZipFile * self, void * buffer, size_t bsize, size_t * num_read );
+static rc_t z_skip (KGZipFile *self, uint64_t pos);
+
+/* virtual functions definitions *******************************************************/
+
+static rc_t CC KGZipFile_InDestroy(KGZipFile *self) {
+    rc_t rc = KFileRelease(self->file);
+    if (rc == 0) {
+        inflateEnd(&self->strm);
+        free(self);
+    }
+
+    return rc;
+}
+
+static rc_t CC KGZipFile_InRead(const KGZipFile *cself,
+    uint64_t pos,
+    void *buffer,
+    size_t bsize,
+    size_t *num_read)
+{
+    KGZipFile *self = (KGZipFile*) cself;
+    rc_t rc = 0;
+
+    size_t numRead = 0, ignore;
+    if (!num_read)
+    {   num_read = &ignore; }
+
+    *num_read = 0;
+
+    if (!cself || !buffer)
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+
+    if (!bsize)
+    {   return 0; }
+
+    if (pos < self->myPosition)
+    {
+	return RC ( rcFS, rcFile, rcReading, rcParam, rcInvalid );
+    }
+
+    GZIP_DEBUG(("%s: pos %lu bsize %zu\n", __func__, pos, bsize));
+
+    if (pos > self->myPosition)
+    {
+	rc =  z_skip (self, pos);
+	if (rc)
+	    return rc;
+	if (pos != self->myPosition)
+	    return 0;
+    }
+
+    rc = z_read ( self, buffer, bsize, &numRead );
+    if (rc)
+	return rc;
+
+    *num_read = numRead;
+
+    self->myPosition += numRead;
+
+    return 0;
+}
+
+/* private functions definitions *******************************************************/
+
+static rc_t z_read ( KGZipFile * self, void * buffer, size_t bsize, size_t * _num_read )
+{
+    rc_t rc = 0;
+    size_t num_read, bleft ;
+
+    GZIP_DEBUG(("%s: Enter\n",__func__));
+
+
+    for (num_read = 0, bleft=bsize; bleft  > 0; )
+    {
+        z_stream * strm = &self->strm;
+        size_t src_read;
+        int zret;
+        
+        strm->next_out  = (uint8_t*)buffer + num_read;
+        strm->avail_out = (uInt) bleft;
+
+        GZIP_DEBUG(("%s: call inflate\n",__func__));
+
+
+        GZIP_DEBUG(("%s: before inflate next_in %14p avail_in %6u total_in %10lu next_out %14p avail_out %6u total_out %10lu\n",
+                    __func__, strm->next_in, strm->avail_in, strm->total_in,
+                    strm->next_out, strm->avail_out, strm->total_out));
+
+        zret = inflate (strm, Z_NO_FLUSH);
+
+        GZIP_DEBUG(("%s: after inflate  next_in %14p avail_in %6u total_in %10lu next_out %14p avail_out %6u total_out %10lu\n",
+                    __func__, strm->next_in, strm->avail_in, strm->total_in,
+                    strm->next_out, strm->avail_out, strm->total_out));
+
+	bleft = strm->avail_out;
+	num_read = bsize - bleft;
+
+        switch (zret)
+        {
+            /* unexpected error returns from zlib */
+        default:
+        case Z_ERRNO:
+            GZIP_DEBUG(("%s: unknown error %d\n",__func__, zret));
+            return RC (rcFS, rcFile, rcReading, rcFile, rcUnknown);
+
+            /* known unfixable errors */
+        case Z_STREAM_ERROR:
+            GZIP_DEBUG(("%s: stream error %d\n",__func__, zret));
+            return RC (rcFS, rcFile, rcReading, rcSelf, rcCorrupt);
+
+        case Z_DATA_ERROR:
+            GZIP_DEBUG(("%s: data error %d\n",__func__, zret));
+            return RC (rcFS, rcFile, rcReading, rcData, rcCorrupt);
+
+        case Z_STREAM_END:
+            GZIP_DEBUG(("%s: stream end %d\n",__func__, zret));
+            self->completed = true;
+            zret = inflateReset (strm);
+            GZIP_DEBUG (("%s: recall inflateReset zret = %d\n",__func__,zret));
+            switch (zret)
+            {
+            case Z_OK:
+                break;
+            default:
+                rc = RC (rcFS, rcFile, rcReading, rcData, rcInvalid);
+                break;
+            }
+            break;
+
+        case Z_BUF_ERROR:
+            GZIP_DEBUG(("%s: buf error %d\n",__func__, zret));
+            if (strm->avail_out > 0)
+            {
+                rc = KFileRead (self->file, self->filePosition, 
+                                self->buff, sizeof (self->buff), &src_read);
+                if (rc)
+                    break;
+
+                strm->avail_in = (uInt) src_read;
+                self->filePosition += src_read;
+                strm->next_in = self->buff;
+                if (src_read)
+                    self->completed = false;
+                else if (self->completed)
+                    goto done;
+                else if (zret == Z_BUF_ERROR)
+                {                
+                    /* this is either a truncated file or a blocked stream
+                     * code outside of here has to handle it */
+                    GZIP_DEBUG(("%s: truncated input\n",__func__));
+                    rc = RC (rcFS, rcFile, rcReading, rcData, rcInsufficient);
+                    break;
+                }
+            }
+            break;
+        case Z_OK:
+            break;
+        }
+        if (rc)
+            break;
+    }
+done:
+    *_num_read = num_read;
+    return rc;
+}
+
+static rc_t z_skip (KGZipFile *self, uint64_t pos)
+{
+    rc_t rc = 0;
+    size_t num_read = 0; /* superfluous to quiet compiler */
+    size_t to_read;
+    uint8_t buff [ 32 * 1024 ];
+
+    GZIP_DEBUG(("%s: enter pos %lu\n",__func__, pos));
+
+    for ( to_read = sizeof buff; self -> myPosition < pos; self -> myPosition += num_read )
+    {
+	if (self->myPosition + sizeof buff > pos)
+	    to_read = pos - self->myPosition;
+
+        GZIP_DEBUG(("%s: call z_read to_read %zu \n",__func__));
+
+	rc = z_read ( self, buff, to_read, &num_read );
+
+        GZIP_DEBUG(("%s: return z_read num_read %zu \n",__func__));
+
+	if ( rc )
+	    break;
+
+	if (num_read == 0)
+	    break;
+
+    }
+    return rc;
+}
+
+/***************************************************************************************/
+/* Gzip Output File                                                                    */
+/***************************************************************************************/
+
+/* write-only methods ******************************************************************/
+
+static rc_t CC KGZipFile_OutDestroy(KGZipFile *self);
+
+static rc_t CC KGZipFile_OutRead(const KGZipFile *cself,
+    uint64_t pos,
+    void *buffer,
+    size_t bsize,
+    size_t *num_read)
+{ return RC ( rcFS, rcFile, rcReading, rcFunction, rcUnsupported ); }
+
+static rc_t CC KGZipFile_OutWrite(KGZipFile *self,
+    uint64_t pos,
+    const void *buffer,
+    size_t bsize,
+    size_t *num_writ);
+
+/** virtual table **********************************************************************/
+static KFile_vt_v1 s_vtKFile_OutGz = {
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KGZipFile_OutDestroy,
+    s_GetSysFile,
+    s_FileRandomAccess,
+    s_FileSize,
+    s_FileSetSize,
+    KGZipFile_OutRead,
+    KGZipFile_OutWrite,
+
+    /* 1.1 */
+    s_FileType
+};
+
+/** Factory method definition **********************************************************/
+LIB_EXPORT rc_t CC KFileMakeGzipForWrite( struct KFile **result,
+    struct KFile *file )
+{
+    rc_t rc;
+    z_stream* strm;
+    KGZipFile *obj;
+
+    if ( result == NULL || file == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+
+    obj = (KGZipFile*) malloc(sizeof(KGZipFile));
+    if (!obj)
+        return RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+
+    rc = KFileInit(&obj->dad, (const KFile_vt*) &s_vtKFile_OutGz, "KGZipFile", "no-name", false, true);
+    if (rc != 0) {
+        free(obj);
+        return rc;
+    }
+
+    strm = &obj->strm;
+    strm->zalloc   = Z_NULL;
+    strm->zfree    = Z_NULL;
+    strm->opaque   = Z_NULL;
+    strm->avail_in = 0;
+    strm->next_in  = Z_NULL;
+
+    /* TBD - this should check gzlib error codes */
+    if (deflateInit2(strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, WINDOW_BITS,
+        8, /* The default value for the memLevel parameter is 8 */
+        Z_DEFAULT_STRATEGY) != Z_OK)
+    {
+        free(obj);
+        return RC ( rcFS, rcFile, rcConstructing, rcNoObj, rcUnknown );
+    }
+
+    obj->myPosition   = 0;
+    obj->filePosition = 0;
+    obj->completed    = false;
+
+    rc = KFileAddRef(file);
+    if ( rc != 0 )
+    {
+        obj->file = NULL;
+        KGZipFile_OutDestroy ( obj );
+    }
+    else
+    {
+        obj->file = file;
+        *result = &obj->dad;
+    }
+
+    return rc;
+}
+
+/* private functions declarations ******************************************************/
+
+static int s_GzipAndWrite(KGZipFile *self,
+    int flush,
+    size_t *num_writ,
+    rc_t *rc);
+
+/* virtual functions definitions *******************************************************/
+
+static rc_t CC KGZipFile_OutDestroy( KGZipFile *self)
+{
+    rc_t rc;
+    if ( !self->completed )
+    {
+        int ret;
+        size_t wrtn;
+        z_stream* strm = &self->strm;
+        strm->avail_in = 0;
+        strm->next_in = Z_NULL;
+
+        ret = s_GzipAndWrite( self, Z_FINISH, &wrtn, &rc );
+        if ( rc != 0 )
+            return rc;
+
+        assert( ret == Z_STREAM_END ); /* stream will be complete */
+        
+        deflateEnd( strm ); /* clean up */
+        self->completed = true;
+    }
+
+    rc = KFileRelease( self->file );
+    if ( rc == 0 )
+        free( self );
+
+    return rc;
+}
+
+static rc_t CC KGZipFile_OutWrite( struct KGZipFile *self,
+    uint64_t pos,
+    const void *buffer,
+    size_t bsize,
+    size_t *num_writ )
+{
+    int ret;
+    rc_t rc;
+    z_stream* strm;
+    size_t ignore;
+    if (!num_writ)
+    {   num_writ = &ignore; }
+
+    *num_writ = 0;
+
+    if ( pos != self->myPosition )
+        return RC ( rcFS, rcFile, rcWriting, rcParam, rcInvalid );
+
+    strm = &self->strm;
+    strm->next_in  = (Bytef*) buffer;
+    strm->avail_in = (uInt) bsize;
+
+    rc = 0;
+    ret = s_GzipAndWrite( self, Z_NO_FLUSH, num_writ, &rc );
+    if ( rc != 0 )
+        return rc;
+    assert( ret != Z_STREAM_END );  /* stream will be complete */
+
+    self->myPosition += * num_writ;
+
+    return 0;
+}
+
+/* private functions definitions *******************************************************/
+
+static int s_GzipAndWrite ( KGZipFile *self,
+    int flush,
+    size_t *num_writ,
+    rc_t *rc )
+{
+    z_stream *strm;
+    uInt avail_in;
+    int ret;
+
+    assert( self && num_writ && rc );
+
+    *num_writ = 0;
+    strm = &self->strm;
+    avail_in = strm->avail_in;
+    ret = 0;
+    /* run deflate() on input until output buffer not full, finish
+       compression if all of source has been read in */
+    do {
+        uint32_t have;
+        size_t written;
+        strm->avail_out = sizeof( self->buff );
+        strm->next_out = self->buff;
+        ret = deflate( strm, flush );    /* no bad return value */
+/*
+        OUTMSG (( "deflate: ret=%u | avail-out+%u\n", ret, strm->avail_out ));
+*/
+        assert( ret != Z_STREAM_ERROR );  /* state not clobbered */
+        have = sizeof( self->buff ) - strm->avail_out;
+        written = 0;
+        *rc = KFileWrite( self->file, self->filePosition, self->buff, have, &written );
+        /* this is wrong - Z_ERRNO would tell us to check errno for error
+           but the error is in *rc */
+        if ( *rc != 0 )
+            return Z_ERRNO;
+        self->filePosition += written;
+        *num_writ = avail_in - strm->avail_in;
+    } while ( strm->avail_out == 0 );
+
+    assert( strm->avail_in == 0 );     /* all input will be used */
+    return ret;
+}
+
+/* EOF */
+
+#include <stdio.h> /* printf */
+LIB_EXPORT rc_t CC KFileMakeGzip2ForRead( const struct KFile **result,
+    const struct KFile *file )
+{
+    rc_t rc;
+    z_stream* strm;
+    KGZipFile *obj;
+
+    if ( result == NULL || file == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+
+    obj = (KGZipFile*) malloc(sizeof(KGZipFile));
+    if (!obj)
+        return RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+
+printf("KFileMakeGzip2ForRead %d\n", __LINE__);
+    rc = KFileInit(&obj->dad, (const KFile_vt*) &s_vtKFile_InGz, "KGZipFile", "no-name", true, false);
+printf("KFileMakeGzip2ForRead %d\n", __LINE__);
+    if (rc != 0) {
+        free(obj);
+        return rc;
+    }
+
+    strm = &obj->strm;
+    memset(strm, 0, sizeof *strm);
+    strm->zalloc   = Z_NULL;
+    strm->zfree    = Z_NULL;
+    strm->opaque   = Z_NULL;
+    strm->avail_in = 0;
+    strm->next_in  = Z_NULL;
+
+    /* TBD - this should check gzlib error codes */
+printf("KFileMakeGzip2ForRead %d\n", __LINE__);
+    if (inflateInit2(strm, WINDOW_BITS) != Z_OK) {
+        free(obj);
+        return RC ( rcFS, rcFile, rcConstructing, rcNoObj, rcUnknown );
+    }
+
+printf("KFileMakeGzip2ForRead %d\n", __LINE__);
+        obj->myPosition   = 0;
+        obj->filePosition = 0;
+
+printf("KFileMakeGzip2ForRead %d\n", __LINE__);
+    rc = KFileAddRef(file);
+    if ( rc != 0 )
+    {
+printf("KFileMakeGzip2ForRead %d\n", __LINE__);
+        obj->file = NULL;
+        KGZipFile_InDestroy ( obj );
+    }
+    else
+    {
+printf("KFileMakeGzip2ForRead %d\n", __LINE__);
+        obj->file = (KFile*) file;
+        obj->completed = true; /* we could have an empty file and this would be okay */
+        *result = &obj->dad;
+    }
+
+printf("KFileMakeGzip2ForRead %d\n", __LINE__);
+    return rc;
+}
diff --git a/libs/kfs/impl.h b/libs/kfs/impl.h
new file mode 100644
index 0000000..ae37b37
--- /dev/null
+++ b/libs/kfs/impl.h
@@ -0,0 +1,120 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_impl_
+#define _h_kfs_impl_
+
+#include <klib/rc.h>
+#include <atomic.h>
+#include <kfs/fileformat.h>
+#include "fileformat-priv.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDirectory;
+
+typedef union KFileFormat_vt KFileFormat_vt;
+
+
+/*--------------------------------------------------------------------------
+ * KFileFormat
+ *  a virtual file
+ */
+struct KFileFormat
+{
+    const KFileFormat_vt *vt;
+    atomic32_t refcount;
+    KFFTables * tables;
+};
+
+#ifndef KFILEFORMAT_IMPL
+#define KFILEFORMAT_IMPL KFileFormat
+#endif
+
+typedef struct KFileFormat_vt_v1 KFileFormat_vt_v1;
+struct KFileFormat_vt_v1
+{
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t (*destroy) (KFILEFORMAT_IMPL * self);
+    rc_t (*gettypebuff) (const KFILEFORMAT_IMPL *self, const void * buff, size_t buff_len,
+			 KFileFormatType * type, KFileFormatClass * class,
+			 char * description, size_t descriptionmax,
+			 size_t * descriptionlength);
+    rc_t (*gettypepath) (const KFILEFORMAT_IMPL *self, const struct KDirectory * dir, const char * path,
+			 KFileFormatType * type, KFileFormatClass * class,
+			 char * description, size_t descriptionmax,
+			 size_t * descriptionlength);
+
+    /* end minor version == 0 */
+    /* start minor version == 1 */
+    /* end minor version == 1 */
+    /* end version == 1.x */
+};
+
+union KFileFormat_vt
+{
+    KFileFormat_vt_v1 v1;
+};
+
+/* Init
+ *  initialize a newly allocated file object
+ */
+rc_t KFileFormatInit (KFileFormat *self, const KFileFormat_vt *vt,
+		      const char * typeAndClass, size_t len);
+
+/* Destroy
+ *  destroy file
+ */
+rc_t KFileFormatDestroy ( KFileFormat *self );
+
+/* GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ */
+struct KSysFile *KFileFormatGetSysFile ( const KFileFormat *self, uint64_t *offset );
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_impl_ */
diff --git a/libs/kfs/karc-priv.h b/libs/kfs/karc-priv.h
new file mode 100644
index 0000000..bd96614
--- /dev/null
+++ b/libs/kfs/karc-priv.h
@@ -0,0 +1,43 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_arc_priv_h_
+#define _h_kfs_arc_priv_h_
+
+typedef struct KArcTOCNode KArcTOCNode;
+
+#ifdef _DEBUGGING
+#define FUNC_ENTRY() DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_ARCENTRY), ("Enter: %s\n", __func__))
+#define ARC_DEBUG(msg) DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_ARC), msg)
+#else
+#define FUNC_ENTRY()
+#define ARC_DEBUG(msg)
+#endif
+
+
+
+#endif /* #ifndef _h_kfs_arc_priv_h_ */
+/* end of file */
diff --git a/libs/kfs/kfs-priv.h b/libs/kfs/kfs-priv.h
new file mode 100644
index 0000000..f994f3f
--- /dev/null
+++ b/libs/kfs/kfs-priv.h
@@ -0,0 +1,47 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_priv_
+#define _h_kfs_priv_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KFile;
+struct KMD5File;
+
+/* exported private functions
+ */
+struct KFile *KMD5FileToKFile ( struct KMD5File *self );
+struct KFile const *KMD5FileToKFileConst ( struct KMD5File const *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kfs_priv_ */
diff --git a/libs/kfs/kfsmagic b/libs/kfs/kfsmagic
new file mode 100644
index 0000000..60ad337
--- /dev/null
+++ b/libs/kfs/kfsmagic
@@ -0,0 +1,20101 @@
+# Magic
+# Magic data for file(1) command.
+# Format is described in magic(5).
+#
+# Note: If you have edited this file you may run `file -C'
+#       to make a pre-compiled magic.mgc for faster execution
+#
+
+
+
+#--------------------------------------------------------------------------------
+# Sequence Read Archive format by International Nucleotide Sequence Database Collaboration
+# 
+
+0       string          NCBI            INDSC
+>4      string          .sra            Sequence Read Archive
+>8      belong          0x05031988      
+>12     belong          x               , Version %u
+
+0       string          NCBI            INDSC
+>4      string          .sra            Sequence Read Archive
+>8      Belong          0x88190305      
+>12     belong          x               , Version %u
+
+#--------------------------------------------------------------------------------
+# SFF format by 454 Life Sciences, Whitehead Institute for Biomedical Research and Sanger Institute.
+# 
+
+0	string		.sff		Standard Flowgram Format (SFF)
+>4	byte		x		- version %d
+>5	byte		x		%d
+>6	byte		x		%d
+>7	byte		x		%d
+>20	belong		x		, %Ld reads
+
+#--------------------------------------------------------------------------------
+# SRF format Generic Format for Sequence Data 
+# 
+
+0	string		SSRF		Generic Format for Sequence Data (SRF)
+>9	byte		x		- version %c
+>10	byte		x		%c
+>11	byte		x		%c
+
+#---------------------------------------------------------------------------------
+# FASTQ format Generic Format for Sequence Data 
+#
+
+0	string		@		FASTQ Generic Format for Sequence Data
+
+#------------------------------------------------------------------------------
+# Localstuff:  file(1) magic for locally observed files
+#
+# $Id: kfsmagic,v 1.2 2010/06/07 15:49:27 killian2 Exp $
+# Add any locally observed files here.  Remember:
+# text if readable, executable if runnable binary, data if unreadable.
+
+# XXX promoted from tex so that *.tfm is not mis-identified as mc68k file.
+# There is no way to detect TeX Font Metric (*.tfm) files without
+# breaking them apart and reading the data.  The following patterns
+# match most *.tfm files generated by METAFONT or afm2tfm.
+2	string		\000\021	TeX font metric data
+>33	string		>\0		(%s)
+2	string		\000\022	TeX font metric data
+>33	string		>\0		(%s)
+#------------------------------------------------------------------------------
+# acorn:  file(1) magic for files found on Acorn systems
+#
+
+# RISC OS Chunk File Format
+# From RISC OS Programmer's Reference Manual, Appendix D
+# We guess the file type from the type of the first chunk.
+0	lelong		0xc3cbc6c5	RISC OS Chunk data
+>12	string		OBJ_		\b, AOF object
+>12	string		LIB_		\b, ALF library
+
+# RISC OS AIF, contains "SWI OS_Exit" at offset 16.
+16	lelong		0xef000011	RISC OS AIF executable
+
+# RISC OS Draw files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0	string 		Draw		RISC OS Draw file data
+
+# RISC OS new format font files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0	string		FONT\0		RISC OS outline font data,
+>5	byte		x		version %d
+0	string		FONT\1		RISC OS 1bpp font data,
+>5	byte		x		version %d
+0	string		FONT\4		RISC OS 4bpp font data
+>5	byte		x		version %d
+
+# RISC OS Music files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0	string		Maestro\r	RISC OS music file
+>8	byte		x		version %d
+
+
+#------------------------------------------------------------------------------
+# adi: file(1) magic for ADi's objects
+# From Gregory McGarry <g.mcgarry at ieee.org>
+#
+0	leshort		0x521c		COFF DSP21k
+>18	lelong		&02		executable,
+>18	lelong		^02
+>>18	lelong		&01		static object,
+>>18	lelong		^01		relocatable object,
+>18	lelong		&010		stripped
+>18	lelong		^010		not stripped
+
+#------------------------------------------------------------------------------
+# adventure: file(1) magic for Adventure game files
+#
+# from Allen Garvin <earendil at faeryland.tamu-commerce.edu>
+# Edited by Dave Chapeskie <dchapes at ddm.on.ca> Jun 28, 1998
+# Edited by Chris Chittleborough <cchittleborough at yahoo.com.au>, March 2002
+#
+# ALAN
+# I assume there are other, lower versions, but these are the only ones I
+# saw in the archive.
+0	beshort	0x0206	ALAN game data
+>2	byte	<10	version 2.6%d
+
+# Conflicts with too much other stuff!
+# Infocom
+# (Note: to avoid false matches Z-machine version 1 and 2 are not
+# recognized since only the oldest Zork I and II used them.  Similarly
+# there are 4 Infocom games that use verion 4 that are not recognized.)
+#0	byte	3	Infocom game data (Z-machine 3,
+#>2	beshort	<0x7fff	Release %3d,
+#>26	beshort >0	Size %d*2
+#>18	string	>\0	Serial %.6s)
+#0	byte	5	Infocom game data (Z-machine 5,
+#>2	beshort	<0x7fff	Release %3d,
+#>26	beshort >0	Size %d*4
+#>18	string	>\0	Serial %.6s)
+#0	byte	6	Infocom game data (Z-machine 6,
+#>2	beshort	<0x7fff	Release %3d,
+#>26	beshort >0	Size %d*8
+#>18	string	>\0	Serial %.6s)
+#0	byte	8	Infocom game data (Z-machine 8,
+#>2	beshort	<0x7fff	Release %3d,
+#>26	beshort >0	Size %d*8
+#>18	string	>\0	Serial %.6s)
+
+# TADS (Text Adventure Development System)
+#  All files are machine-independent (games compile to byte-code) and are tagged
+#  with a version string of the form "V2.<digit>.<digit>\0" (but TADS 3 is
+#  on the way).
+#  Game files start with "TADS2 bin\n\r\032\0" then the compiler version.
+0	string	TADS2\ bin	TADS
+>9	belong  !0x0A0D1A00	game data, CORRUPTED
+>9	belong	 0x0A0D1A00
+>>13	string	>\0		%s game data
+#  Resource files start with "TADS2 rsc\n\r\032\0" then the compiler version.
+0	string	TADS2\ rsc	TADS
+>9	belong  !0x0A0D1A00	resource data, CORRUPTED
+>9	belong	 0x0A0D1A00
+>>13	string	>\0		%s resource data
+#  Some saved game files start with "TADS2 save/g\n\r\032\0", a little-endian
+#  2-byte length N, the N-char name of the game file *without* a NUL (darn!),
+# "TADS2 save\n\r\032\0" and the interpreter version. 
+0	string	TADS2\ save/g	TADS
+>12	belong	!0x0A0D1A00	saved game data, CORRUPTED
+>12	belong	 0x0A0D1A00
+>>(16.s+32) string >\0		%s saved game data
+#  Other saved game files start with "TADS2 save\n\r\032\0" and the interpreter
+#  version.
+0	string	TADS2\ save	TADS
+>10	belong	!0x0A0D1A00	saved game data, CORRUPTED
+>10	belong	 0x0A0D1A00
+>>14	string	>\0		%s saved game data
+#------------------------------------------------------------------------------
+# allegro:  file(1) magic for Allegro datafiles
+# Toby Deshane <hac at shoelace.digivill.net>
+#
+0 belong 0x736C6821   Allegro datafile (packed)
+0 belong 0x736C682E   Allegro datafile (not packed/autodetect)
+0 belong 0x736C682B   Allegro datafile (appended exe data)
+
+#------------------------------------------------------------------------------
+# alliant:  file(1) magic for Alliant FX series a.out files
+#
+# If the FX series is the one that had a processor with a 68K-derived
+# instruction set, the "short" should probably become "beshort" and the
+# "long" should probably become "belong".
+# If it's the i860-based one, they should probably become either the
+# big-endian or little-endian versions, depending on the mode they ran
+# the 860 in....
+#
+0	short		0420		0420 Alliant virtual executable
+>2	short		&0x0020		common library
+>16	long		>0		not stripped
+0	short		0421		0421 Alliant compact executable
+>2	short		&0x0020		common library
+>16	long		>0		not stripped
+#------------------------------------------------------------------------------
+# alpha architecture description
+#
+
+0	leshort		0603		COFF format alpha
+>22	leshort&030000	!020000		executable
+>24	leshort		0410		pure
+>24	leshort		0413		paged
+>22	leshort&020000	!0		dynamically linked
+>16	lelong		!0		not stripped
+>16	lelong		0		stripped
+>22	leshort&030000	020000		shared library
+>24	leshort		0407		object
+>27	byte		x		- version %d
+>26	byte		x		.%d
+>28	byte		x		-%d
+
+# Basic recognition of Digital UNIX core dumps - Mike Bremford <mike at opac.bl.uk>
+#
+# The actual magic number is just "Core", followed by a 2-byte version
+# number; however, treating any file that begins with "Core" as a Digital
+# UNIX core dump file may produce too many false hits, so we include one
+# byte of the version number as well; DU 5.0 appears only to be up to
+# version 2.
+#
+0	string		Core\001	Alpha COFF format core dump (Digital UNIX)
+>24	string		>\0		\b, from '%s'
+0	string		Core\002	Alpha COFF format core dump (Digital UNIX)
+>24	string		>\0		\b, from '%s'
+
+#------------------------------------------------------------------------------
+# amanda:  file(1) magic for amanda file format
+#
+0	string	AMANDA:\ 		AMANDA 
+>8	string	TAPESTART\ DATE		tape header file,
+>>23	string	X
+>>>25	string	>\ 			Unused %s
+>>23	string	>\ 			DATE %s
+>8	string	FILE\ 			dump file,
+>>13	string	>\ 			DATE %s
+#------------------------------------------------------------------------------
+# amigaos:  file(1) magic for AmigaOS binary formats:
+
+#
+# From ignatios at cs.uni-bonn.de (Ignatios Souvatzis)
+# Some formats are still missing: AmigaOS special IFF's, e.g.: FORM....CTLG
+# (the others should be separate, anyway)
+#
+0	belong		0x000003f3	AmigaOS loadseg()ble executable/binary
+0	belong		0x000003e7	AmigaOS object/library data
+#
+0	beshort		0xe310		Amiga Workbench
+>2	beshort		1		
+>>48	byte		1		disk icon
+>>48	byte		2		drawer icon
+>>48	byte		3		tool icon
+>>48	byte		4		project icon
+>>48	byte		5		garbage icon
+>>48	byte		6		device icon
+>>48	byte		7		kickstart icon
+>>48	byte		8		workbench application icon
+>2	beshort		>1		icon, vers. %d
+#
+# various sound formats from the Amiga
+# G=F6tz Waschk <waschk at informatik.uni-rostock.de>
+#
+0	string		FC14		Future Composer 1.4 Module sound file
+0	string		SMOD		Future Composer 1.3 Module sound file
+0	string		AON4artofnoise	Art Of Noise Module sound file
+1	string		MUGICIAN/SOFTEYES Mugician Module sound file
+58	string		SIDMON\ II\ -\ THE	Sidmon 2.0 Module sound file
+0	string		Synth4.0	Synthesis Module sound file
+0	string		ARP.		The Holy Noise Module sound file
+0	string		BeEp\0		JamCracker Module sound file
+0	string		COSO\0		Hippel-COSO Module sound file
+# Too simple (short, pure ASCII, deep), MPi
+#26	string		V.3		Brian Postma's Soundmon Module sound file v3
+#26	string		BPSM		Brian Postma's Soundmon Module sound file v3
+#26	string		V.2		Brian Postma's Soundmon Module sound file v2
+
+# The following are from: "Stefan A. Haubenthal" <polluks at web.de>
+0	beshort		0x0f00		AmigaOS bitmap font
+0	beshort		0x0f03		AmigaOS outline font
+0	belong		0x80001001	AmigaOS outline tag
+0	string		##\ version	catalog translation
+
+0	string		FORM		IFF data
+>8	string		CTLG		\b, CTLG message catalog
+>8	string		PREF		\b, PREF preferences
+
+0	string		Rar!		RAR archive data,
+>44	byte		x		v%0x,
+>35	byte		0		os: MS-DOS
+>35	byte		1		os: OS/2
+>35	byte		2		os: Win32
+>35	byte		3		os: Unix
+
+0	belong		0x000003fa	AmigaOS shared library
+
+# Amiga disk types
+# 
+0	string		RDSK		Rigid Disk Block
+>160	string		x		on %.24s
+0	string		DOS\0		Amiga DOS disk
+0	string		DOS\1		Amiga FFS disk
+0	string		DOS\2		Amiga Inter DOS disk
+0	string		DOS\3		Amiga Inter FFS disk
+0	string		DOS\4		Amiga Fastdir DOS disk
+0	string		DOS\5		Amiga Fastdir FFS disk
+0	string		KICK		Kickstart disk
+
+#------------------------------------------------------------------------------
+# animation:  file(1) magic for animation/movie formats
+#
+# animation formats
+# MPEG, FLI, DL originally from vax at ccwf.cc.utexas.edu (VaX#n8)
+# FLC, SGI, Apple originally from Daniel Quinlan (quinlan at yggdrasil.com)
+
+# MPEG animation format
+0	belong		0x000001b3		MPEG video stream data
+#>4	beshort&0xfff0	x			(%d x
+#>5	beshort&0x0fff  x			%d)
+0	belong		0x000001ba		MPEG system stream data
+
+# MPEG Audio (*.mpx)
+# from dreesen at math.fu-berlin.de
+
+# MPEG 1.0 Layer 3
+0       beshort&0xfffe  =0xfffa         \bMP3
+>2      byte&0xf0       =0x10           \b,  32 kBits
+>2      byte&0xf0       =0x20           \b,  40 kBits
+>2      byte&0xf0       =0x30           \b,  48 kBits
+>2      byte&0xf0       =0x40           \b,  56 kBits
+>2      byte&0xf0       =0x50           \b,  64 kBits
+>2      byte&0xf0       =0x60           \b,  80 kBits
+>2      byte&0xf0       =0x70           \b,  96 kBits
+>2      byte&0xf0       =0x80           \b, 112 kBits
+>2      byte&0xf0       =0x90           \b, 128 kBits
+>2      byte&0xf0       =0xA0           \b, 160 kBits
+>2      byte&0xf0       =0xB0           \b, 192 kBits
+>2      byte&0xf0       =0xC0           \b, 224 kBits
+>2      byte&0xf0       =0xD0           \b, 256 kBits
+>2      byte&0xf0       =0xE0           \b, 320 kBits
+# freq
+>2      byte&0x0C       =0x00           \b, 44.1 kHz
+>2      byte&0x0C       =0x04           \b, 48 kHz
+>2      byte&0x0C       =0x08           \b, 32 kHz
+# misc
+>3      byte&0xC0       =0x00           \b, Stereo
+>3      byte&0xC0       =0x40           \b, JStereo
+>3      byte&0xC0       =0x80           \b, Dual-Ch
+>3      byte&0xC0       =0xC0           \b, Mono
+#>1     byte&0x01       =0x00           \b, Error Protection
+#>2     byte&0x02       =0x02           \b, Padding
+#>2     byte&0x01       =0x01           \b, Private
+#>3     byte&0x08       =0x08           \b, Copyright
+#>3     byte&0x04       =0x04           \b, Original
+#>3     byte&0x03       1               \b, Emphasis 5
+#>3     byte&0x03       3               \b, Emphasis c
+
+# MPEG 1.0 Layer 2
+0       beshort&0xfffe  =0xfffc         \bMP2
+>2      byte&0xf0       =0x10           \b,  32 kBits
+>2      byte&0xf0       =0x20           \b,  48 kBits
+>2      byte&0xf0       =0x30           \b,  56 kBits
+>2      byte&0xf0       =0x40           \b,  64 kBits
+>2      byte&0xf0       =0x50           \b,  80 kBits
+>2      byte&0xf0       =0x60           \b,  96 kBits
+>2      byte&0xf0       =0x70           \b, 112 kBits
+>2      byte&0xf0       =0x80           \b, 128 kBits
+>2      byte&0xf0       =0x90           \b, 160 kBits
+>2      byte&0xf0       =0xA0           \b, 192 kBits
+>2      byte&0xf0       =0xB0           \b, 224 kBits
+>2      byte&0xf0       =0xC0           \b, 256 kBits
+>2      byte&0xf0       =0xD0           \b, 320 kBits
+>2      byte&0xf0       =0xE0           \b, 384 kBits
+# freq
+>2      byte&0x0C       =0x00           \b, 44.1 kHz
+>2      byte&0x0C       =0x04           \b, 48 kHz
+>2      byte&0x0C       =0x08           \b, 32 kHz
+# misc
+>3      byte&0xC0       =0x00           \b, Stereo
+>3      byte&0xC0       =0x40           \b, JStereo
+>3      byte&0xC0       =0x80           \b, Dual-Ch
+>3      byte&0xC0       =0xC0           \b, Mono
+#>1     byte&0x01       =0x00           \b, Error Protection
+#>2     byte&0x02       =0x02           \b, Padding
+#>2     byte&0x01       =0x01           \b, Private
+#>3     byte&0x08       =0x08           \b, Copyright
+#>3     byte&0x04       =0x04           \b, Original
+#>3     byte&0x03       1               \b, Emphasis 5
+#>3     byte&0x03       3               \b, Emphasis c
+
+# MPEG 2.0
+0       beshort&0xfff8  =0xfff0         MP
+# Layer 3
+>1      byte            &0x02           \b3
+# Layer 2
+>1      byte            &0x04           \b2
+>2      byte&0xf0       =0x10           \b,   8 kBits
+>2      byte&0xf0       =0x20           \b,  16 kBits
+>2      byte&0xf0       =0x30           \b,  24 kBits
+>2      byte&0xf0       =0x40           \b,  32 kBits
+>2      byte&0xf0       =0x50           \b,  40 kBits
+>2      byte&0xf0       =0x60           \b,  48 kBits
+>2      byte&0xf0       =0x70           \b,  56 kBits
+>2      byte&0xf0       =0x80           \b,  64 kBits
+>2      byte&0xf0       =0x90           \b,  80 kBits
+>2      byte&0xf0       =0xA0           \b,  96 kBits
+>2      byte&0xf0       =0xB0           \b, 112 kBits
+>2      byte&0xf0       =0xC0           \b, 128 kBits
+>2      byte&0xf0       =0xD0           \b, 144 kBits
+>2      byte&0xf0       =0xE0           \b, 160 kBits
+# freq
+>2      byte&0x0C       =0x00           \b, 22.05 kHz
+>2      byte&0x0C       =0x04           \b, 24 kHz
+>2      byte&0x0C       =0x08           \b, 16 kHz
+# misc
+>3      byte&0xC0       =0x00           \b, Stereo
+>3      byte&0xC0       =0x40           \b, JStereo
+>3      byte&0xC0       =0x80           \b, Dual-Ch
+>3      byte&0xC0       =0xC0           \b, Mono
+#>1     byte&0x01       =0x00           \b, Error Protection
+#>2     byte&0x02       =0x02           \b, Padding
+#>2     byte&0x01       =0x01           \b, Private
+#>3     byte&0x08       =0x08           \b, Copyright
+#>3     byte&0x04       =0x04           \b, Original
+#>3     byte&0x03       1               \b, Emphasis 5
+#>3     byte&0x03       3               \b, Emphasis c
+
+#From: Johan Gade <jgade at diku.dk>
+
+# MPEG-4 Advanced Audio Coding (AAC) file (perhaps also MPEG-2 ACC?)
+16	string		M4A		MPEG-4 Advanced Audio Coding file (AAC)
+
+
+# FLI animation format
+4	leshort		0xAF11			FLI file
+>6	leshort		x			- %d frames,
+>8	leshort		x			width=%d pixels,
+>10	leshort		x			height=%d pixels,
+>12	leshort		x			depth=%d,
+>16	leshort		x			ticks/frame=%d
+# FLC animation format
+4	leshort		0xAF12			FLC file
+>6	leshort		x			- %d frames
+>8	leshort		x			width=%d pixels,
+>10	leshort		x			height=%d pixels,
+>12	leshort		x			depth=%d,
+>16	leshort		x			ticks/frame=%d
+
+# DL animation format
+# XXX - collision with most `mips' magic
+#
+# I couldn't find a real magic number for these, however, this
+# -appears- to work.  Note that it might catch other files, too, so be
+# careful!
+#
+# Note that title and author appear in the two 20-byte chunks
+# at decimal offsets 2 and 22, respectively, but they are XOR'ed with
+# 255 (hex FF)!  The DL format is really bad.
+#
+#0	byte	1	DL version 1, medium format (160x100, 4 images/screen)
+#>42	byte	x	- %d screens,
+#>43	byte	x	%d commands
+#0	byte	2	DL version 2
+#>1	byte	1	- large format (320x200,1 image/screen),
+#>1	byte	2	- medium format (160x100,4 images/screen),
+#>1	byte	>2	- unknown format,
+#>42	byte	x	%d screens,
+#>43	byte	x	%d commands
+# Based on empirical evidence, DL version 3 have several nulls following the
+# \003.  Most of them start with non-null values at hex offset 0x34 or so.
+#0	string	\3\0\0\0\0\0\0\0\0\0\0\0	DL version 3
+
+# SGI formats
+0	string		MOVI		Silicon Graphics movie file
+
+# Apple Quicktime: Scan for all known top-level QT atom markers
+4	string		moov		Apple QuickTime movie file (moov)
+4	string		mdat		Apple QuickTime movie file (mdat)
+4	string		ftyp		Apple QuickTime movie file (ftyp)
+4	string		free		Apple QuickTime movie file (free)
+4	string		junk		Apple QuickTime movie file (junk)
+4	string		pnot		Apple QuickTime movie file (pnot)
+4	string		skip		Apple QuickTime movie file (skip)
+4	string		wide		Apple QuickTime movie file (wide)
+4	string		pict		Apple QuickTime movie file (pict)
+
+# iso 13818 transport stream
+#
+# from Oskar Schirmer <schirmer at scara.com> Feb 3, 2001 (ISO 13818.1)
+# (the following is a little bit restrictive and works fine for a stream
+#  that starts with PAT properly. it won't work for stream data, that is
+#  cut from an input device data right in the middle, but this shouldn't
+#  disturb)
+# syncbyte      8 bit	0x47
+# error_ind     1 bit	-
+# payload_start 1 bit	1
+# priority      1 bit	-
+# PID          13 bit	0x0000
+# scrambling    2 bit	-
+# adaptfld_ctrl 2 bit	1 or 3
+# conti_count   4 bit	0
+0	belong&0xFF5FFF1F	0x47400010	MPEG transport stream data
+>188	byte			!0x47		CORRUPTED
+
+# DIF digital video file format <mpruett at sgi.com>
+0	belong&0xffffff00	0x1f070000      DIF
+>4	byte			&0x01		(DVCPRO) movie file
+>4	byte			^0x01		(DV) movie file
+>3	byte			&0x80		(PAL)
+>3	byte			^0x80		(NTSC)
+
+# Microsoft Advanced Streaming Format (ASF) <mpruett at sgi.com>
+0	belong			0x3026b275	Microsoft ASF
+
+# MNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>
+0	string			\x8aMNG		MNG video data,
+>4	belong			!0x0d0a1a0a	CORRUPTED,
+>4	belong			0x0d0a1a0a
+>>16    belong	x				%ld x
+>>20    belong	x				%ld
+
+# JNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>
+0	string			\x8bJNG		JNG video data,
+>4	belong			!0x0d0a1a0a	CORRUPTED,
+>4	belong			0x0d0a1a0a
+>>16    belong	x				%ld x
+>>20    belong	x				%ld
+
+# Vivo video (Wolfram Kleff)
+3	string		\x0D\x0AVersion:Vivo	Vivo video data
+
+# VRML (Virtual Reality Modelling Language)
+0       string/b        #VRML\ V1.0\ ascii	VRML 1 file
+0	string/b	#VRML\ V2.0\ utf8	ISO/IEC 14772 VRML 97 file
+
+#---------------------------------------------------------------------------
+# HVQM4: compressed movie format designed by Hudson for Nintendo GameCube
+# From Mark Sheppard <msheppard at climax.co.uk>, 2002-10-03
+#
+0	string		HVQM4		%s
+>6	string		>\0		v%s
+>0	byte		x		GameCube movie,
+>0x34	ubeshort	x		%d x
+>0x36	ubeshort	x		%d,
+>0x26	ubeshort	x		%dµs,
+>0x42	ubeshort	0		no audio
+>0x42	ubeshort	>0		%dHz audio
+
+#------------------------------------------------------------------------------
+# apl:  file(1) magic for APL (see also "pdp" and "vax" for other APL
+#       workspaces)
+#
+0	long		0100554		APL workspace (Ken's original?)
+
+#------------------------------------------------------------------------------
+# applix:  file(1) magic for Applixware
+# From: Peter Soos <sp at osb.hu>
+#
+0	string		*BEGIN		Applixware
+>7	string		WORDS			Words Document
+>7	string		GRAPHICS		Graphic
+>7	string		RASTER			Bitmap
+>7	string		SPREADSHEETS		Spreadsheet
+>7	string		MACRO			Macro
+>7	string		BUILDER			Builder Object
+
+#------------------------------------------------------------------------------
+# archive:  file(1) magic for archive formats (see also "msdos" for self-
+#           extracting compressed archives)
+#
+# cpio, ar, arc, arj, hpack, lha/lharc, rar, squish, uc2, zip, zoo, etc.
+# pre-POSIX "tar" archives are handled in the C code.
+
+# POSIX tar archives
+257	string		ustar\0		POSIX tar archive
+257	string		ustar\040\040\0	GNU tar archive
+
+# cpio archives
+#
+# Yes, the top two "cpio archive" formats *are* supposed to just be "short".
+# The idea is to indicate archives produced on machines with the same
+# byte order as the machine running "file" with "cpio archive", and
+# to indicate archives produced on machines with the opposite byte order
+# from the machine running "file" with "byte-swapped cpio archive".
+#
+# The SVR4 "cpio(4)" hints that there are additional formats, but they
+# are defined as "short"s; I think all the new formats are
+# character-header formats and thus are strings, not numbers.
+0	short		070707		cpio archive
+0	short		0143561		byte-swapped cpio archive
+0	string		070707		ASCII cpio archive (pre-SVR4 or odc)
+0	string		070701		ASCII cpio archive (SVR4 with no CRC)
+0	string		070702		ASCII cpio archive (SVR4 with CRC)
+
+# Debian package (needs to go before regular portable archives)
+#
+0	string		!<arch>\ndebian
+>8	string		debian-split	part of multipart Debian package
+>8	string		debian-binary	Debian binary package
+>68	string		>\0		(format %s)
+>81	string		bz2		\b, uses bzip2 compression
+>84	string		gz		\b, uses gzip compression
+#>136	ledate		x		created: %s
+
+# other archives
+0	long		0177555		very old archive
+0	short		0177555		very old PDP-11 archive
+0	long		0177545		old archive
+0	short		0177545		old PDP-11 archive
+0	long		0100554		apl workspace
+0	string		=<ar>		archive
+
+# MIPS archive (needs to go before regular portable archives)
+#
+0	string	!<arch>\n__________E	MIPS archive
+>20	string	U			with MIPS Ucode members
+>21	string	L			with MIPSEL members
+>21	string	B			with MIPSEB members
+>19	string	L			and an EL hash table
+>19	string	B			and an EB hash table
+>22	string	X			-- out of date
+
+0	string		-h-		Software Tools format archive text
+
+#
+# XXX - why are there multiple <ar> thingies?  Note that 0x213c6172 is
+# "!<ar", so, for new-style (4.xBSD/SVR2andup) archives, we have:
+#
+# 0	string		!<arch>		current ar archive
+# 0	long		0x213c6172	archive file
+#
+# and for SVR1 archives, we have:
+#
+# 0	string		\<ar>		System V Release 1 ar archive
+# 0	string		=<ar>		archive
+#
+# XXX - did Aegis really store shared libraries, breakpointed modules,
+# and absolute code program modules in the same format as new-style
+# "ar" archives?
+#
+0	string		!<arch>		current ar archive
+>8	string		__.SYMDEF	random library
+>0	belong		=65538		- pre SR9.5
+>0	belong		=65539		- post SR9.5
+>0	beshort		2		- object archive
+>0	beshort		3		- shared library module
+>0	beshort		4		- debug break-pointed module
+>0	beshort		5		- absolute code program module
+0	string		\<ar>		System V Release 1 ar archive
+0	string		=<ar>		archive
+#
+# XXX - from "vax", which appears to collect a bunch of byte-swapped
+# thingies, to help you recognize VAX files on big-endian machines;
+# with "leshort", "lelong", and "string", that's no longer necessary....
+#
+0	belong		0x65ff0000	VAX 3.0 archive
+0	belong		0x3c61723e	VAX 5.0 archive
+#
+0	long		0x213c6172	archive file
+0	lelong		0177555		very old VAX archive
+0	leshort		0177555		very old PDP-11 archive
+#
+# XXX - "pdp" claims that 0177545 can have an __.SYMDEF member and thus
+# be a random library (it said 0xff65 rather than 0177545).
+#
+0	lelong		0177545		old VAX archive
+>8	string		__.SYMDEF	random library
+0	leshort		0177545		old PDP-11 archive
+>8	string		__.SYMDEF	random library
+#
+# From "pdp" (but why a 4-byte quantity?)
+#
+0	lelong		0x39bed		PDP-11 old archive
+0	lelong		0x39bee		PDP-11 4.0 archive
+
+# ARC archiver, from Daniel Quinlan (quinlan at yggdrasil.com)
+#
+# The first byte is the magic (0x1a), byte 2 is the compression type for
+# the first file (0x01 through 0x09), and bytes 3 to 15 are the MS-DOS
+# filename of the first file (null terminated).  Since some types collide
+# we only test some types on basis of frequency: 0x08 (83%), 0x09 (5%),
+# 0x02 (5%), 0x03 (3%), 0x04 (2%), 0x06 (2%).  0x01 collides with terminfo.
+0	lelong&0x8080ffff	0x0000081a	ARC archive data, dynamic LZW
+0	lelong&0x8080ffff	0x0000091a	ARC archive data, squashed
+0	lelong&0x8080ffff	0x0000021a	ARC archive data, uncompressed
+0	lelong&0x8080ffff	0x0000031a	ARC archive data, packed
+0	lelong&0x8080ffff	0x0000041a	ARC archive data, squeezed
+0	lelong&0x8080ffff	0x0000061a	ARC archive data, crunched
+
+# Acorn archive formats (Disaster prone simpleton, m91dps at ecs.ox.ac.uk)
+# I can't create either SPARK or ArcFS archives so I have not tested this stuff
+# [GRR:  the original entries collide with ARC, above; replaced with combined
+#  version (not tested)]
+#0	byte		0x1a		RISC OS archive
+#>1	string		archive		(ArcFS format)
+0	string		\032archive	RISC OS archive (ArcFS format)
+
+# ARJ archiver (jason at jarthur.Claremont.EDU)
+0	leshort		0xea60		ARJ archive data
+>5	byte		x		\b, v%d,
+>8	byte		&0x04		multi-volume,
+>8	byte		&0x10		slash-switched,
+>8	byte		&0x20		backup,
+>34	string		x		original name: %s,
+>7	byte		0		os: MS-DOS
+>7	byte		1		os: PRIMOS
+>7	byte		2		os: Unix
+>7	byte		3		os: Amiga
+>7	byte		4		os: Macintosh
+>7	byte		5		os: OS/2
+>7	byte		6		os: Apple ][ GS
+>7	byte		7		os: Atari ST
+>7	byte		8		os: NeXT
+>7	byte		9		os: VAX/VMS
+>3	byte		>0		%d]
+
+# HA archiver (Greg Roelofs, newt at uchicago.edu)
+# This is a really bad format. A file containing HAWAII will match this...
+#0	string		HA		HA archive data,
+#>2	leshort		=1		1 file,
+#>2	leshort		>1		%u files,
+#>4	byte&0x0f	=0		first is type CPY
+#>4	byte&0x0f	=1		first is type ASC
+#>4	byte&0x0f	=2		first is type HSC
+#>4	byte&0x0f	=0x0e		first is type DIR
+#>4	byte&0x0f	=0x0f		first is type SPECIAL
+
+# HPACK archiver (Peter Gutmann, pgut1 at cs.aukuni.ac.nz)
+0	string		HPAK		HPACK archive data
+
+# JAM Archive volume format, by Dmitry.Kohmanyuk at UA.net
+0	string		\351,\001JAM\		JAM archive,
+>7	string		>\0			version %.4s
+>0x26	byte		=0x27			-
+>>0x2b	string          >\0			label %.11s,
+>>0x27	lelong		x			serial %08x,
+>>0x36	string		>\0			fstype %.8s
+
+# LHARC/LHA archiver (Greg Roelofs, newt at uchicago.edu)
+2	string		-lh0-		LHarc 1.x archive data [lh0]
+2	string		-lh1-		LHarc 1.x archive data [lh1]
+2	string		-lz4-		LHarc 1.x archive data [lz4]
+2	string		-lz5-		LHarc 1.x archive data [lz5]
+#	[never seen any but the last; -lh4- reported in comp.compression:]
+2	string		-lzs-		LHa 2.x? archive data [lzs]
+2	string		-lh\40-		LHa 2.x? archive data [lh ]
+2	string		-lhd-		LHa 2.x? archive data [lhd]
+2	string		-lh2-		LHa 2.x? archive data [lh2]
+2	string		-lh3-		LHa 2.x? archive data [lh3]
+2	string		-lh4-		LHa (2.x) archive data [lh4]
+2	string		-lh5-		LHa (2.x) archive data [lh5]
+2	string		-lh6-		LHa (2.x) archive data [lh6]
+2	string		-lh7-		LHa (2.x) archive data [lh7]
+>20	byte		x		- header level %d
+
+# RAR archiver (Greg Roelofs, newt at uchicago.edu)
+0	string		Rar!		RAR archive data
+
+# SQUISH archiver (Greg Roelofs, newt at uchicago.edu)
+0	string		SQSH		squished archive data (Acorn RISCOS)
+
+# UC2 archiver (Greg Roelofs, newt at uchicago.edu)
+# I can't figure out the self-extracting form of these buggers...
+0	string		UC2\x1a		UC2 archive data
+
+# ZIP archives (Greg Roelofs, c/o zip-bugs at wkuvx1.wku.edu)
+0	string		PK\003\004	Zip archive data
+>4	byte		0x09		\b, at least v0.9 to extract
+>4	byte		0x0a		\b, at least v1.0 to extract
+>4	byte		0x0b		\b, at least v1.1 to extract
+>4	byte		0x14		\b, at least v2.0 to extract
+
+# Zoo archiver
+20	lelong		0xfdc4a7dc	Zoo archive data
+>4	byte		>48		\b, v%c.
+>>6	byte		>47		\b%c
+>>>7	byte		>47		\b%c
+>32	byte		>0		\b, modify: v%d
+>>33	byte		x		\b.%d+
+>42	lelong		0xfdc4a7dc	\b,
+>>70	byte		>0		extract: v%d
+>>>71	byte		x		\b.%d+
+
+# Shell archives
+10	string		#\ This\ is\ a\ shell\ archive	shell archive text
+
+#
+# LBR. NB: May conflict with the questionable 
+#          "binary Computer Graphics Metafile" format.
+#
+0       string  \0\ \ \ \ \ \ \ \ \ \ \ \0\0    LBR archive data
+#
+# PMA (CP/M derivative of LHA)
+#
+2       string          -pm0-           PMarc archive data [pm0]
+2       string          -pm1-           PMarc archive data [pm1]
+2       string          -pm2-           PMarc archive data [pm2]
+2       string          -pms-           PMarc SFX archive (CP/M, DOS)
+5       string          -pc1-           PopCom compressed executable (CP/M)
+
+# From Rafael Laboissiere <rafael at laboissiere.net>
+# The Project Revision Control System (see
+# http://prcs.sourceforge.net) generates a packaged project
+# file which is recognized by the following entry: 
+0	leshort		0xeb81	PRCS packaged project
+
+# Microsoft cabinets 
+# by David Necas (Yeti) <yeti at physics.muni.cz>
+#0	string	MSCF\0\0\0\0	Microsoft cabinet file data,
+#>25	byte	x		v%d
+#>24	byte	x		\b.%d
+# MPi: All CABs have version 1.3, so this is pointless.
+# Better magic in debian-additions.
+
+# GTKtalog catalogs 
+# by David Necas (Yeti) <yeti at physics.muni.cz>
+4	string	gtktalog\ 	GTKtalog catalog data,
+>13	string	3		version 3
+>>14	beshort	0x677a		(gzipped)
+>>14	beshort	!0x677a		(not gzipped)
+>13	string	>3		version %s
+
+############################################################################
+# Parity archive reconstruction file, the 'par' file format now used on Usenet.
+0       string          PAR\0	PARity archive data
+>48	leshort		=0	- Index file
+>48	leshort		>0	- file number %d
+
+# Felix von Leitner <felix-file at fefe.de>
+0	string	d8:announce	BitTorrent file
+
+# Atari MSA archive - Teemu Hukkanen <tjhukkan at iki.fi>
+0       beshort 0x0e0f          Atari MSA archive data
+>2      beshort x       	\b, %d sectors per track
+>4      beshort 0       	\b, 1 sided
+>4      beshort 1       	\b, 2 sided
+>6      beshort x       	\b, starting track: %d
+>8      beshort x       	\b, ending track: %d
+
+# Alternate ZIP string (amc at arwen.cs.berkeley.edu)
+0	string	PK00PK\003\004	Zip archive data
+
+# ACE archive (from http://www.wotsit.org/download.asp?f=ace)
+# by Stefan `Sec` Zehl <sec at 42.org>
+7	string		**ACE**		ACE compressed archive
+>15	byte	>0		version %d
+>16	byte	=0x00		\b, from MS-DOS
+>16	byte	=0x01		\b, from OS/2
+>16	byte	=0x02		\b, from Win/32
+>16	byte	=0x03		\b, from Unix
+>16	byte	=0x04		\b, from MacOS
+>16	byte	=0x05		\b, from WinNT
+>16	byte	=0x06		\b, from Primos
+>16	byte	=0x07		\b, from AppleGS
+>16	byte	=0x08		\b, from Atari
+>16	byte	=0x09		\b, from Vax/VMS
+>16	byte	=0x0A		\b, from Amiga
+>16	byte	=0x0B		\b, from Next
+>14	byte	x		\b, version %d to extract
+>5	leshort &0x0080		\b, multiple volumes,
+>>17	byte	x		\b (part %d),
+>5	leshort &0x0002		\b, contains comment
+>5	leshort	&0x0200		\b, sfx
+>5	leshort	&0x0400		\b, small dictionary
+>5	leshort	&0x0800		\b, multi-volume
+>5	leshort	&0x1000		\b, contains AV-String
+>>30	string\x16*UNREGISTERED\x20VERSION*	(unregistered)
+>5	leshort &0x2000		\b, with recovery record
+>5	leshort &0x4000		\b, locked
+>5	leshort &0x8000		\b, solid
+# Date in MS-DOS format (whatever that is)
+#>18	lelong	x		Created on
+
+#------------------------------------------------------------------------------
+# asterix:  file(1) magic for Aster*x; SunOS 5.5.1 gave the 4-character
+# strings as "long" - we assume they're just strings:
+# From: guy at netapp.com (Guy Harris)
+#
+0	string		*STA		Aster*x
+>7	string		WORD			Words Document
+>7	string		GRAP			Graphic
+>7	string		SPRE			Spreadsheet
+>7	string		MACR			Macro
+0	string		2278		Aster*x Version 2
+>29	byte		0x36			Words Document
+>29	byte		0x35			Graphic
+>29	byte		0x32			Spreadsheet
+>29	byte		0x38			Macro
+
+
+#------------------------------------------------------------------------------
+# att3b:  file(1) magic for AT&T 3B machines
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+# 3B20
+#
+# The 3B20 conflicts with SCCS.
+#0	beshort		0550		3b20 COFF executable
+#>12	belong		>0		not stripped
+#>22	beshort		>0		- version %ld
+#0	beshort		0551		3b20 COFF executable (TV)
+#>12	belong		>0		not stripped
+#>22	beshort		>0		- version %ld
+#
+# WE32K
+#
+0	beshort		0560		WE32000 COFF
+>18	beshort		^00000020	object
+>18	beshort		&00000020	executable
+>12	belong		>0		not stripped
+>18	beshort		^00010000	N/A on 3b2/300 w/paging
+>18	beshort		&00020000	32100 required
+>18	beshort		&00040000	and MAU hardware required
+>20	beshort		0407		(impure)
+>20	beshort		0410		(pure)
+>20	beshort		0413		(demand paged)
+>20	beshort		0443		(target shared library)
+>22	beshort		>0		- version %ld
+0	beshort		0561		WE32000 COFF executable (TV)
+>12	belong		>0		not stripped
+#>18	beshort		&00020000	- 32100 required
+#>18	beshort		&00040000	and MAU hardware required
+#>22	beshort		>0		- version %ld
+#
+# core file for 3b2 
+0	string		\000\004\036\212\200	3b2 core file
+>364	string		>\0		of '%s'
+
+#------------------------------------------------------------------------------
+# audio:  file(1) magic for sound formats (see also "iff")
+#
+# Jan Nicolai Langfeldt (janl at ifi.uio.no), Dan Quinlan (quinlan at yggdrasil.com),
+# and others
+#
+
+# Sun/NeXT audio data
+0	string		.snd		Sun/NeXT audio data:
+>12	belong		1		8-bit ISDN mu-law,
+>12	belong		2		8-bit linear PCM [REF-PCM],
+>12	belong		3		16-bit linear PCM,
+>12	belong		4		24-bit linear PCM,
+>12	belong		5		32-bit linear PCM,
+>12	belong		6		32-bit IEEE floating point,
+>12	belong		7		64-bit IEEE floating point,
+>12	belong		23		8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice data encoding),
+>12	belong		24		compressed (8-bit G.722 ADPCM)
+>12	belong		25		compressed (3-bit G.723 ADPCM),
+>12	belong		26		compressed (5-bit G.723 ADPCM),
+>12	belong		27		8-bit A-law,
+>20	belong		1		mono,
+>20	belong		2		stereo,
+>20	belong		4		quad,
+>16	belong		>0		%d Hz
+
+# DEC systems (e.g. DECstation 5000) use a variant of the Sun/NeXT format
+# that uses little-endian encoding and has a different magic number
+0	lelong		0x0064732E	DEC audio data:
+>12	lelong		1		8-bit ISDN mu-law,
+>12	lelong		2		8-bit linear PCM [REF-PCM],
+>12	lelong		3		16-bit linear PCM,
+>12	lelong		4		24-bit linear PCM,
+>12	lelong		5		32-bit linear PCM,
+>12	lelong		6		32-bit IEEE floating point,
+>12	lelong		7		64-bit IEEE floating point,
+>12	lelong		23		8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice data encoding),
+>20	lelong		1		mono,
+>20	lelong		2		stereo,
+>20	lelong		4		quad,
+>16	lelong		>0		%d Hz
+
+# Creative Labs AUDIO stuff
+0	string	MThd			Standard MIDI data
+>8 	beshort	x			(format %d)
+>10	beshort	x			using %d track
+>10	beshort		>1		\bs
+>12	beshort&0x7fff	x		at 1/%d
+>12	beshort&0x8000	>0		SMPTE
+
+0	string	CTMF			Creative Music (CMF) data
+0	string	SBI			SoundBlaster instrument data
+0	string	Creative\ Voice\ File	Creative Labs voice data
+# is this next line right?  it came this way...
+>19	byte	0x1A
+>23	byte	>0			- version %d
+>22	byte	>0			\b.%d
+
+# first entry is also the string "NTRK"
+0	belong		0x4e54524b	MultiTrack sound data
+>4	belong		x		- version %ld
+
+# Extended MOD format (*.emd) (Greg Roelofs, newt at uchicago.edu); NOT TESTED
+# [based on posting 940824 by "Dirk/Elastik", husberg at lehtori.cc.tut.fi]
+0	string		EMOD		Extended MOD sound data,
+>4	byte&0xf0	x		version %d
+>4	byte&0x0f	x		\b.%d,
+>45	byte		x		%d instruments
+>83	byte		0		(module)
+>83	byte		1		(song)
+
+# Real Audio (Magic .ra\0375)
+0	belong		0x2e7261fd	RealAudio sound file
+0	string		.RMF\0\0\0	RealMedia file
+
+# MTM/669/FAR/S3M/ULT/XM format checking [Aaron Eppert, aeppert at dialin.ind.net]
+# Oct 31, 1995
+# fixed by <doj at cubic.org> 2003-06-24
+# Too short...
+#0	string		MTM		MultiTracker Module sound data
+#0	string		if		Composer 669 Module sound data
+#0	string		JN		Composer 669 Module sound data (extended format)
+0	string		MAS_U		ULT(imate) Module sound data
+
+#0	string		FAR		Module sound data
+#>4	string		>\15		Title: "%s"
+
+0x2c	string		SCRM		ScreamTracker III Module sound data
+>0	string		>\0		Title: "%s"
+
+# Gravis UltraSound patches
+# From <ache at nagual.ru>
+
+0	string		GF1PATCH110\0ID#000002\0	GUS patch
+0	string		GF1PATCH100\0ID#000002\0	Old GUS	patch
+
+#
+# Taken from loader code from mikmod version 2.14
+# by Steve McIntyre (stevem at chiark.greenend.org.uk)
+# <doj at cubic.org> added title printing on 2003-06-24
+0	string	MAS_UTrack_V00
+>14	string	>/0		ultratracker V1.%.1s module sound data
+
+0	string	UN05		MikMod UNI format module sound data
+
+0	string	Extended\ Module: Fasttracker II module sound data
+>17	string	>\0		Title: "%s"
+
+21	string/c	!SCREAM!	Screamtracker 2 module sound data
+21	string	BMOD2STM	Screamtracker 2 module sound data
+1080	string	M.K.		4-channel Protracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	M!K!		4-channel Protracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	FLT4		4-channel Startracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	FLT8		8-channel Startracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	4CHN		4-channel Fasttracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	6CHN		6-channel Fasttracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	8CHN		8-channel Fasttracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	CD81		8-channel Octalyser module sound data
+>0	string	>\0		Title: "%s"
+1080	string	OKTA		8-channel Oktalyzer module sound data
+>0	string	>\0		Title: "%s"
+# Not good enough.
+#1082	string	CH
+#>1080	string	>/0		%.2s-channel Fasttracker "oktalyzer" module sound data
+1080	string	16CN		16-channel Taketracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	32CN		32-channel Taketracker module sound data
+>0	string	>\0		Title: "%s"
+
+# TOC sound files -Trevor Johnson <trevor at jpj.net>
+#
+0       string          TOC             TOC sound file
+
+# sidfiles <pooka at iki.fi>
+# added name,author,(c) and new RSID type by <doj at cubic.org> 2003-06-24
+0	string		SIDPLAY\ INFOFILE	Sidplay info file
+
+0	string		PSID			PlaySID v2.2+ (AMIGA) sidtune
+>4	beshort		>0			w/ header v%d,
+>14	beshort		=1			single song,
+>14	beshort		>1			%d songs,
+>16	beshort		>0			default song: %d
+>0x16	string		>\0			name: "%s"
+>0x36	string		>\0			author: "%s"
+>0x56	string		>\0			copyright: "%s"
+
+0	string		RSID			RSID sidtune PlaySID compatible
+>4	beshort		>0			w/ header v%d,
+>14	beshort		=1			single song,
+>14	beshort		>1			%d songs,
+>16	beshort		>0			default song: %d
+>0x16	string		>\0			name: "%s"
+>0x36	string		>\0			author: "%s"
+>0x56	string		>\0			copyright: "%s"
+
+# IRCAM <mpruett at sgi.com>
+# VAX and MIPS files are little-endian; Sun and NeXT are big-endian
+0	belong		0x64a30100		IRCAM file (VAX)
+0	belong		0x64a30200		IRCAM file (Sun)
+0	belong		0x64a30300		IRCAM file (MIPS little-endian)
+0	belong		0x64a30400		IRCAM file (NeXT)
+
+# NIST SPHERE <mpruett at sgi.com>
+0	string		NIST_1A\n\ \ \ 1024\n	NIST SPHERE file
+
+# Sample Vision <mpruett at sgi.com>
+0	string		SOUND\ SAMPLE\ DATA\ 	Sample Vision file
+
+# Audio Visual Research <tonigonenstein at users.sourceforge.net>
+0	string		2BIT			Audio Visual Research file,
+>12	beshort		=0			mono,
+>12	beshort		=-1			stereo,
+>14	beshort		x			%d bits
+>16	beshort		=0			unsigned,
+>16	beshort		=-1			signed,
+>22	belong&0x00ffffff	x		%d Hz,
+>18	beshort		=0			no loop,
+>18	beshort		=-1			loop,
+>21	ubyte		<=127			note %d,
+>22	byte		=0			replay 5.485 KHz
+>22	byte		=1			replay 8.084 KHz
+>22	byte		=2			replay 10.971 Khz
+>22	byte		=3			replay 16.168 Khz
+>22	byte		=4			replay 21.942 KHz
+>22	byte		=5			replay 32.336 KHz
+>22	byte		=6			replay 43.885 KHz
+>22	byte		=7			replay 47.261 KHz
+
+# SGI SoundTrack <mpruett at sgi.com>
+0	string		_SGI_SoundTrack		SGI SoundTrack project file
+# ID3 version 2 tags <waschk at informatik.uni-rostock.de>
+0	string		ID3	MP3 file with ID3 version 2.
+>3	ubyte	<0xff	\b%d.
+>4	ubyte	<0xff	\b%d tag
+
+# NSF (NES sound file) magic
+0	string		NESM\x1a	NES Sound File
+>14	string		>\0		("%s" by
+>46	string		>\0		%s, copyright
+>78	string		>\0		%s),
+>5	byte		x		version %d,
+>6	byte		x		%d tracks,
+>122	byte&0x2	=1		dual PAL/NTSC
+>122	byte&0x1	=1		PAL
+>122	byte&0x1	=0		NTSC
+
+# Impuse tracker module (audio/x-it)
+0	string		IMPM		Impulse Tracker module sound data -
+>4	string		>\0		"%s"
+>40	leshort		!0		compatible w/ITv%x
+>42	leshort		!0		created w/ITv%x
+
+# Imago Orpheus module (audio/x-imf)
+60	string		IM10		Imago Orpheus module sound data -
+>0	string		>\0		"%s"
+
+# From <collver1 at attbi.com>
+# These are the /etc/magic entries to decode modules, instruments, and
+# samples in Impulse Tracker's native format.
+
+0	string		IMPS		Impulse Tracker Sample
+>18	byte		&2		16 bit
+>18	byte		^2		8 bit
+>18	byte		&4		stereo
+>18	byte		^4		mono
+0	string		IMPI		Impulse Tracker Instrument
+>28	leshort		!0		ITv%x
+>30	byte		!0		%d samples
+
+# Yamaha TX Wave:  file(1) magic for Yamaha TX Wave audio files
+# From <collver1 at attbi.com>
+0	string		LM8953		Yamaha TX Wave
+>22	byte		0x49		looped
+>22	byte		0xC9		non-looped
+>23	byte		1		33kHz
+>23	byte		2		50kHz
+>23	byte		3		16kHz
+
+# scream tracker:  file(1) magic for Scream Tracker sample files
+#
+# From <collver1 at attbi.com>
+76	string		SCRS		Scream Tracker Sample
+>0	byte		1		sample
+>0	byte		2		adlib melody
+>0	byte		>2		adlib drum
+>31	byte		&2		stereo
+>31	byte		^2		mono
+>31	byte		&4		16bit little endian
+>31	byte		^4		8bit
+>30	byte		0		unpacked
+>30	byte		1		packed
+
+# audio
+# From: Cory Dikkers <cdikkers at swbell.net>
+0	string		MMD0		MED music file, version 0
+0	string		MMD1		OctaMED Pro music file, version 1
+0	string		MMD3		OctaMED Soundstudio music file, version 3
+0	string		OctaMEDCmpr	OctaMED Soundstudio compressed file
+0	string		MED		MED_Song
+0	string		SymM		Symphonie SymMOD music file
+#
+0	string		THX		AHX version
+>3	byte		=0		1 module data
+>3	byte		=1		2 module data
+#
+0	string		OKTASONG	Oktalyzer module data
+#
+0	string		DIGI\ Booster\ module\0	%s
+>20	byte		>0		%c
+>>21	byte		>0		\b%c
+>>>22	byte		>0		\b%c
+>>>>23	byte		>0		\b%c
+>610	string		>\0		\b, "%s"
+#
+0	string		DBM0	   	DIGI Booster Pro Module
+>4	byte		>0		V%X.
+>>5	byte		x		\b%02X
+>16	string		>\0		\b, "%s"
+#
+0	string		FTMN		FaceTheMusic module
+>16	string		>\0d		\b, "%s"
+
+# From: <doj at cubic.org> 2003-06-24
+0	string		AMShdr\32	Velvet Studio AMS Module v2.2
+0	string		Extreme		Extreme Tracker AMS Module v1.3
+0	string		DDMF		Xtracker DMF Module
+>4	byte		x		v%i
+>0xD	string		>\0		Title: "%s"
+>0x2B	string		>\0		Composer: "%s"
+0	string		DSM\32		Dynamic Studio Module DSM
+0	string		SONG		DigiTrekker DTM Module
+0	string		DMDL		DigiTrakker MDL Module
+0	string		PSM\32		Protracker Studio PSM Module
+44	string		PTMF		Poly Tracker PTM Module
+>0	string		>\32		Title: "%s"
+0	string		MT20		MadTracker 2.0 Module MT2
+0	string		RAD\40by\40REALiTY!! RAD Adlib Tracker Module RAD
+0	string		RTMM		RTM Module
+0x426	string		MaDoKaN96	XMS Adlib Module
+>0	string		>\0		Composer: "%s"
+0	string		AMF		AMF Module
+>4	string		>\0		Title: "%s"
+0	string		MODINFO1	Open Cubic Player Module Inforation MDZ
+0	string		Extended\40Instrument: Fast Tracker II Instrument
+
+# From: Takeshi Hamasaki <hma at syd.odn.ne.jp>
+# NOA Nancy Codec file
+0	string		\210NOA\015\012\032	NOA Nancy Codec Movie file
+# Yamaha SMAF format
+0	string		MMMD		Yamaha SMAF file
+# Sharp Jisaku Melody format for PDC
+0	string		\001Sharp\040JisakuMelody	SHARP Cell-Phone ringing Melody
+>20	string		Ver01.00	Ver. 1.00
+>>32	byte		x		, %d tracks
+
+# Free lossless audio codec <http://flac.sourceforge.net>
+# From: Przemyslaw Augustyniak <silvathraec at rpg.pl>
+0	string			fLaC		FLAC audio bitstream data
+>4	byte&0x7f		>0		\b, unknown version
+>4	byte&0x7f		0		\b
+# some common bits/sample values
+>>20	beshort&0x1f0		0x030		\b, 4 bit
+>>20	beshort&0x1f0		0x050		\b, 6 bit
+>>20	beshort&0x1f0		0x070		\b, 8 bit
+>>20	beshort&0x1f0		0x0b0		\b, 12 bit
+>>20	beshort&0x1f0		0x0f0		\b, 16 bit
+>>20	beshort&0x1f0		0x170		\b, 24 bit
+>>20	byte&0xe		0x0		\b, mono
+>>20	byte&0xe		0x2		\b, stereo
+>>20	byte&0xe		0x4		\b, 3 channels
+>>20	byte&0xe		0x6		\b, 4 channels
+>>20	byte&0xe		0x8		\b, 5 channels
+>>20	byte&0xe		0xa		\b, 6 channels
+>>20	byte&0xe		0xc		\b, 7 channels
+>>20	byte&0xe		0xe		\b, 8 channels
+# some common sample rates
+>>17	belong&0xfffff0		0x0ac440	\b, 44.1 kHz
+>>17	belong&0xfffff0		0x0bb800	\b, 48 kHz
+>>17	belong&0xfffff0		0x07d000	\b, 32 kHz
+>>17	belong&0xfffff0		0x056220	\b, 22.05 kHz
+>>17	belong&0xfffff0		0x05dc00	\b, 24 kHz
+>>17	belong&0xfffff0		0x03e800	\b, 16 kHz
+>>17	belong&0xfffff0		0x02b110	\b, 11.025 kHz
+>>17	belong&0xfffff0		0x02ee00	\b, 12 kHz
+>>17	belong&0xfffff0		0x01f400	\b, 8 kHz
+>>17	belong&0xfffff0		0x177000	\b, 96 kHz
+>>17	belong&0xfffff0		0x0fa000	\b, 64 kHz
+>>21	byte&0xf		>0		\b, >4G samples
+>>21	byte&0xf		0		\b
+>>>22	belong			>0		\b, %u samples
+>>>22	belong			0		\b, length unknown
+
+# (ISDN) VBOX voice message file (Wolfram Kleff)
+0       string          VBOX            VBOX voice message data
+
+# ReBorn Song Files (.rbs)
+# David J. Singer <doc at deadvirgins.org.uk>
+8       string          RB40             RBS Song file
+>29     string          ReBorn           created by ReBorn
+>37     string          Propellerhead    created by ReBirth
+
+# Synthesizer Generator and Kimwitu share their file format
+0	string		A#S#C#S#S#L#V#3	    Synthesizer Generator or Kimwitu data
+# Kimwitu++ uses a slightly different magic
+0	string		A#S#C#S#S#L#HUB	    Kimwitu++ data
+
+# From "Simon Hosie
+0       string  TFMX-SONG       TFMX module sound data
+#------------------------------------------------------------------------------
+# bFLT: file(1) magic for BFLT uclinux binary files
+#
+# From Philippe De Muyter <phdm at macqel.be>
+#
+0	string		bFLT		BFLT executable
+>4	belong		x		- version %ld
+>4	belong		4
+>>36	belong&0x1	0x1		ram
+>>36	belong&0x2	0x2		gotpic
+>>36	belong&0x4	0x4		gzip
+>>36	belong&0x8	0x8		gzdata
+#------------------------------------------------------------------------------
+# blender: file(1) magic for Blender 3D data files
+#
+# Coded by Guillermo S. Romero <gsromero at alumnos.euitt.upm.es> using the
+# data from Ton Roosendaal <ton at blender.nl>. Ton or his company do not
+# support the rule, so mail GSR if problems with it. Rule version: 1.1.
+# You can get latest version with comments and details about the format
+# at http://acd.asoc.euitt.upm.es/~gsromero/3d/blender/magic.blender
+
+0	string	=BLENDER	Blender3D,
+>7	string	=_		saved as 32-bits
+>7      string	=-		saved as 64-bits
+>8	string	=v		little endian
+>8	string	=V		big endian
+>9	byte	x		with version %c.
+>10	byte	x		\b%c
+>11	byte	x		\b%c
+
+#------------------------------------------------------------------------------
+# blit:  file(1) magic for 68K Blit stuff as seen from 680x0 machine
+#
+# Note that this 0407 conflicts with several other a.out formats...
+#
+# XXX - should this be redone with "be" and "le", so that it works on
+# little-endian machines as well?  If so, what's the deal with
+# "VAX-order" and "VAX-order2"?
+#
+#0	long		0407		68K Blit (standalone) executable
+#0	short		0407		VAX-order2 68K Blit (standalone) executable
+0	short		03401		VAX-order 68K Blit (standalone) executable
+0	long		0406		68k Blit mpx/mux executable
+0	short		0406		VAX-order2 68k Blit mpx/mux executable
+0	short		03001		VAX-order 68k Blit mpx/mux executable
+# Need more values for WE32 DMD executables.
+# Note that 0520 is the same as COFF
+#0	short		0520		tty630 layers executable
+#
+# i80960 b.out objects and archives
+#
+0	long		0x10d		i960 b.out relocatable object
+>16	long		>0		not stripped
+#
+# b.out archive (hp-rt on i960)
+0	string		!<bout>		b.out archive
+>8	string		__.SYMDEF	random library
+#------------------------------------------------------------------------------
+# bsdi:  file(1) magic for BSD/OS (from BSDI) objects
+#
+
+0	lelong		0314		386 compact demand paged pure executable
+>16	lelong		>0		not stripped
+>32	byte		0x6a		(uses shared libs)
+
+0	lelong		0407		386 executable
+>16	lelong		>0		not stripped
+>32	byte		0x6a		(uses shared libs)
+
+0	lelong		0410		386 pure executable
+>16	lelong		>0		not stripped
+>32	byte		0x6a		(uses shared libs)
+
+0	lelong		0413		386 demand paged pure executable
+>16	lelong		>0		not stripped
+>32	byte		0x6a		(uses shared libs)
+
+# same as in SunOS 4.x, except for static shared libraries
+0	belong&077777777	0600413		SPARC demand paged
+>0	byte		&0x80
+>>20	belong		<4096		shared library
+>>20	belong		=4096		dynamically linked executable
+>>20	belong		>4096		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+>36	belong		0xb4100001	(uses shared libs)
+
+0	belong&077777777	0600410		SPARC pure
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+>36	belong		0xb4100001	(uses shared libs)
+
+0	belong&077777777	0600407		SPARC
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+>36	belong		0xb4100001	(uses shared libs)
+
+#------------------------------------------------------------------------------
+# autocad:  file(1) magic for cad files
+#
+
+# AutoCAD DWG versions R13/R14 (www.autodesk.com)
+# Written December 01, 2003 by Lester Hightower
+# Based on the DWG File Format Specifications at http://www.opendwg.org/
+0	string	       \101\103\061\060\061		   AutoCAD
+>5	string	       \062\000\000\000\000		   DWG ver. R13
+>5	string	       \064\000\000\000\000		   DWG ver. R14
+
+# Microstation DGN/CIT Files (www.bentley.com)
+# Written October 30, 2003 by Lester Hightower
+# DGN is the default file extension of Microstation/Intergraph CAD files.
+# CIT is the proprietary raster format (similar to TIFF) used to attach
+# raster underlays to Microstation DGN (vector) drawings.
+# 
+# http://www.wotsit.org/search.asp
+# http://filext.com/detaillist.php?extdetail=DGN
+# http://filext.com/detaillist.php?extdetail=CIT
+#
+# http://www.bentley.com/products/default.cfm?objectid=97F351F5-9C35-4E5E-89C2
+# 3F86C928&method=display&p_objectid=97F351F5-9C35-4E5E-89C280A93F86C928
+# http://www.bentley.com/products/default.cfm?objectid=A5C2FD43-3AC9-4C71-B682
+# 721C479F&method=display&p_objectid=A5C2FD43-3AC9-4C71-B682C7BE721C479F
+0	string	       \010\011\376			   Microstation
+>3	string	       \002
+>>30	string	       \372\104				   DGN File
+>>30	string	       \172\104				   DGN File
+>>30	string	       \026\105				   DGN File
+>4	string	       \030\000\000			   CIT File
+
+# AutoCad, from Nahuel Greco
+0	string AC1012	AutoCad (release 12)
+0	string AC1014	AutoCad (release 14)
+
+#------------------------------------------------------------------------------
+# c-lang:  file(1) magic for C programs (or REXX)
+#
+
+# XPM icons (Greg Roelofs, newt at uchicago.edu)
+# if you uncomment "/*" for C/REXX below, also uncomment this entry
+#0	string		/*\ XPM\ */	X pixmap image data
+
+# this first will upset you if you're a PL/1 shop...
+# in which case rm it; ascmagic will catch real C programs
+#0	string		/*		C or REXX program text
+#0	string		//		C++ program text
+
+# From: Mikhail Teterin <mi at aldan.algebra.com> 
+0	string		cscope		cscope reference data
+>7	string		x		version %.2s
+# We skip the path here, because it is often long (so file will
+# truncate it) and mostly redundant.
+# The inverted index functionality was added some time betwen
+# versions 11 and 15, so look for -q if version is above 14:
+>7	string		>14
+>>10	regex		.+\ -q\		with inverted index
+>10	regex		.+\ -c\		text (non-compressed)
+
+#------------------------------------------------------------------------------
+# c64:  file(1) magic for various commodore 64 related files
+#
+# From <doj at cubic.org>
+
+0x16500	belong		0x12014100	D64 Image
+0x16500	belong		0x12014180	D71 Image
+0x61800 belong		0x28034400	D81 Image
+0	string		C64\40CARTRIDGE	CCS C64 Emultar Cartridge Image
+0	belong		0x43154164	X64 Image
+
+0	string		GCR-1541	GCR Image
+>8	byte		x		version: $i
+>9	byte		x		tracks: %i
+
+9	string		PSUR		ARC archive (c64)
+2	string		-LH1-		LHA archive (c64)
+
+0	string		C64File		PC64 Emulator file
+>8	string		>\0		"%s"
+0	string		C64Image	PC64 Freezer Image
+
+0	beshort		0x38CD		C64 PCLink Image
+0	string		CBM\144\0\0	Power 64 C64 Emulator Snapshot
+
+0	belong		0xFF424CFF	WRAptor packer (c64)
+
+#------------------------------------------------------------------------------
+# CDDB: file(1) magic for CDDB(tm) format CD text data files
+#
+# From <steve at gracenote.com>
+#
+# This is the /etc/magic entry to decode datafiles as used by
+# CDDB-enabled CD player applications.
+#
+
+0       string/b        #\040xmcd               CDDB(tm) format CD text data
+
+#------------------------------------------------------------------------------
+# chi:  file(1) magic for ChiWriter files
+#
+0       string          \\1cw\          ChiWriter file
+>5      string          >\0             version %s
+0       string          \\1cw           ChiWriter file
+
+#------------------------------------------------------------------------------
+# chord: file(1) magic for Chord music sheet typesetting utility input files
+#
+# From Philippe De Muyter <phdm at macqel.be>
+# File format is actually free, but many distributed files begin with `{title'
+#
+0	string		{title		Chord text file
+
+#------------------------------------------------------------------------------
+# cisco:  file(1) magic for cisco Systems routers
+#
+# Most cisco file-formats are covered by the generic elf code
+#
+# Microcode files are non-ELF, 0x8501 conflicts with NetBSD/alpha.
+0	belong&0xffffff00	0x85011400  cisco IOS microcode
+>7	string		>\0		    for '%s'
+0	belong&0xffffff00	0x8501cb00  cisco IOS experimental microcode
+>7	string		>\0		    for '%s'
+#------------------------------------------------------------------------------
+# citrus locale declaration
+#
+
+0	string		RuneCT		Citrus locale declaration for LC_CTYPE
+
+
+#------------------------------------------------------------------------------
+# claris:  file(1) magic for claris
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Claris Works a word processor, etc.
+# Version 3.0
+
+# .pct claris works clip art files
+#0000000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
+#*
+#0001000 #010 250 377 377 377 377 000 213 000 230 000 021 002 377 014 000
+#null to byte 1000 octal
+514	string	\377\377\377\377\000	Claris clip art?
+>0	string	\0\0\0\0\0\0\0\0\0\0\0\0\0	yes.
+514	string	\377\377\377\377\001	Claris clip art?
+>0	string	\0\0\0\0\0\0\0\0\0\0\0\0\0	yes.
+
+# Claris works files
+# .cwk
+0	string	\002\000\210\003\102\117\102\117\000\001\206 Claris works document
+# .plt
+0	string	\020\341\000\000\010\010	Claris Works pallete files .plt
+
+# .msp a dictionary file I am not sure about this I have only one .msp file
+0	string	\002\271\262\000\040\002\000\164	Claris works dictionary
+
+# .usp are user dictionary bits
+# I am not sure about a magic header:
+#0000000 001 123 160 146 070 125 104 040 136 123 015 012 160 157 144 151
+#        soh   S   p   f   8   U   D  sp   ^   S  cr  nl   p   o   d   i
+#0000020 141 164 162 151 163 164 040 136 123 015 012 144 151 166 040 043
+#          a   t   r   i   s   t  sp   ^   S  cr  nl   d   i   v  sp   #
+
+# .mth Thesaurus
+# statrts with \0 but no magic header
+
+# .chy Hyphenation file
+# I am not sure: 000 210 034 000 000
+
+# other claris files
+#./windows/claris/useng.ndx: data
+#./windows/claris/xtndtran.l32: data
+#./windows/claris/xtndtran.lst: data
+#./windows/claris/clworks.lbl: data
+#./windows/claris/clworks.prf: data
+#./windows/claris/userd.spl: data
+
+#------------------------------------------------------------------------------
+# clipper:  file(1) magic for Intergraph (formerly Fairchild) Clipper.
+#
+# XXX - what byte order does the Clipper use?
+#
+# XXX - what's the "!" stuff:
+#
+# >18	short		!074000,000000	C1 R1 
+# >18	short		!074000,004000	C2 R1
+# >18	short		!074000,010000	C3 R1
+# >18	short		!074000,074000	TEST
+#
+# I shall assume it's ANDing the field with the first value and
+# comparing it with the second, and rewrite it as:
+#
+# >18	short&074000	000000		C1 R1 
+# >18	short&074000	004000		C2 R1
+# >18	short&074000	010000		C3 R1
+# >18	short&074000	074000		TEST
+#
+# as SVR3.1's "file" doesn't support anything of the "!074000,000000"
+# sort, nor does SunOS 4.x, so either it's something Intergraph added
+# in CLIX, or something AT&T added in SVR3.2 or later, or something
+# somebody else thought was a good idea; it's not documented in the
+# man page for this version of "magic", nor does it appear to be
+# implemented (at least not after I blew off the bogus code to turn
+# old-style "&"s into new-style "&"s, which just didn't work at all).
+#
+0	short		0575		CLIPPER COFF executable (VAX #)
+>20	short		0407		(impure)
+>20	short		0410		(5.2 compatible)
+>20	short		0411		(pure)
+>20	short		0413		(demand paged)
+>20	short		0443		(target shared library)
+>12	long		>0		not stripped
+>22	short		>0		- version %ld
+0	short		0577		CLIPPER COFF executable
+>18	short&074000	000000		C1 R1 
+>18	short&074000	004000		C2 R1
+>18	short&074000	010000		C3 R1
+>18	short&074000	074000		TEST
+>20	short		0407		(impure)
+>20	short		0410		(pure)
+>20	short		0411		(separate I&D)
+>20	short		0413		(paged)
+>20	short		0443		(target shared library)
+>12	long		>0		not stripped
+>22	short		>0		- version %ld
+>48	long&01		01		alignment trap enabled
+>52	byte		1		-Ctnc
+>52	byte		2		-Ctsw
+>52	byte		3		-Ctpw
+>52	byte		4		-Ctcb
+>53	byte		1		-Cdnc
+>53	byte		2		-Cdsw
+>53	byte		3		-Cdpw
+>53	byte		4		-Cdcb
+>54	byte		1		-Csnc
+>54	byte		2		-Cssw
+>54	byte		3		-Cspw
+>54	byte		4		-Cscb
+4	string		pipe		CLIPPER instruction trace
+4	string		prof		CLIPPER instruction profile
+
+#------------------------------------------------------------------------------
+# commands:  file(1) magic for various shells and interpreters
+#
+0	string		:			shell archive or script for antique kernel text
+0	string/b	#!\ /bin/sh		Bourne shell script text
+0	string/b	#!\ /bin/csh		C shell script text
+# korn shell magic, sent by George Wu, gwu at clyde.att.com
+0	string/b	#!\ /bin/ksh		Korn shell script text
+0	string/b 	#!\ /bin/tcsh		Tenex C shell script text
+0	string/b 	#!\ /usr/bin/tcsh	Tenex C shell script text
+0	string/b 	#!\ /usr/local/tcsh	Tenex C shell script text
+0	string/b	#!\ /usr/local/bin/tcsh	Tenex C shell script text
+
+#
+# zsh/ash/ae/nawk/gawk magic from cameron at cs.unsw.oz.au (Cameron Simpson)
+0	string/b	#!\ /bin/zsh		Paul Falstad's zsh script text
+0	string/b	#!\ /usr/bin/zsh	Paul Falstad's zsh script text
+0	string/b	#!\ /usr/local/bin/zsh	Paul Falstad's zsh script text
+0	string/b	#!\ /usr/local/bin/ash	Neil Brown's ash script text
+0	string/b	#!\ /usr/local/bin/ae	Neil Brown's ae script text
+0	string/b	#!\ /bin/nawk		new awk script text
+0	string/b	#!\ /usr/bin/nawk	new awk script text
+0	string/b	#!\ /usr/local/bin/nawk	new awk script text
+0	string/b	#!\ /bin/gawk		GNU awk script text
+0	string/b	#!\ /usr/bin/gawk	GNU awk script text
+0	string/b	#!\ /usr/local/bin/gawk	GNU awk script text
+#
+0	string/b	#!\ /bin/awk		awk script text
+0	string/b	#!\ /usr/bin/awk	awk script text
+0	string		BEGIN			awk script text
+
+# AT&T Bell Labs' Plan 9 shell
+0	string/b	#!\ /bin/rc	Plan 9 rc shell script text
+
+# bash shell magic, from Peter Tobias (tobias at server.et-inf.fho-emden.de)
+0	string/b	#!\ /bin/bash		Bourne-Again shell script text
+0	string/b	#!\ /usr/bin/bash	Bourne-Again shell script text
+0	string/b	#!\ /usr/local/bash	Bourne-Again shell script text
+0	string/b	#!\ /usr/local/bin/bash	Bourne-Again shell script text
+
+# using env
+0	string		#!/usr/bin/env		a
+>15	string		>\0			%s script text
+0	string		#!\ /usr/bin/env	a
+>16	string		>\0			%s script text
+
+# PHP scripts
+# Ulf Harnhammar <ulfh at update.uu.se>
+0	string/c	=<?php			PHP script text
+0	string		=<?\n			PHP script text
+0	string		=<?\r			PHP script text
+0	string/b	#!\ /usr/local/bin/php	PHP script text
+0	string/b	#!\ /usr/bin/php	PHP script text
+
+0	string		Zend\x00		PHP script Zend Optimizer data
+
+#----------------------------------------------------------------------------
+# communcation
+
+# TTCN is the Tree and Tabular Combined Notation described in ISO 9646-3.
+# It is used for conformance testing of communication protocols.
+# Added by W. Borgert <debacle at debian.org>.
+0	string		$Suite			TTCN Abstract Test Suite
+>&1	string		$SuiteId
+>>&1	string		>\n			%s
+>&2	string		$SuiteId
+>>&1	string		>\n			%s
+>&3	string		$SuiteId
+>>&1	string		>\n			%s
+
+# MSC (message sequence charts) are a formal description technique,
+# described in ITU-T Z.120, mainly used for communication protocols.
+# Added by W. Borgert <debacle at debian.org>.
+0	string		mscdocument	Message Sequence Chart (document)
+0	string		msc		Message Sequence Chart (chart)
+0	string		submsc		Message Sequence Chart (subchart)
+
+#------------------------------------------------------------------------------
+# compress:  file(1) magic for pure-compression formats (no archives)
+#
+# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc.
+#
+# Formats for various forms of compressed data
+# Formats for "compress" proper have been moved into "compress.c",
+# because it tries to uncompress it to figure out what's inside.
+
+# standard unix compress
+0	string		\037\235	compress'd data
+>2	byte&0x80	>0		block compressed
+>2	byte&0x1f	x		%d bits
+
+# gzip (GNU zip, not to be confused with Info-ZIP or PKWARE zip archiver)
+#   Edited by Chris Chittleborough <cchittleborough at yahoo.com.au>, March 2002
+#	* Original filename is only at offset 10 if "extra field" absent
+#	* Produce shorter output - notably, only report compression methods
+#	  other than 8 ("deflate", the only method defined in RFC 1952).
+0       string          \037\213        gzip compressed data
+>2	byte		<8		\b, reserved method
+>2	byte		>8		\b, unknown method
+>3	byte		&0x01		\b, ASCII
+>3	byte		&0x02		\b, continuation
+>3	byte		&0x04		\b, extra field
+>3	byte&0xC	=0x08
+>>10	string		x		\b, was "%s"
+>9	byte		=0x00		\b, from MS-DOS
+>9	byte		=0x01		\b, from Amiga
+>9	byte		=0x02		\b, from VMS
+>9	byte		=0x03		\b, from Unix
+>9	byte		=0x05		\b, from Atari
+>9	byte		=0x06		\b, from OS/2
+>9	byte		=0x07		\b, from MacOS
+>9	byte		=0x0A		\b, from Tops/20
+>9	byte		=0x0B		\b, from Win/32
+>3	byte		&0x10		\b, comment
+>3	byte		&0x20		\b, encrypted
+### >4	ledate		x		last modified: %s,
+>8	byte		2		\b, max compression
+>8	byte		4		\b, max speed
+
+# packed data, Huffman (minimum redundancy) codes on a byte-by-byte basis
+0	string		\037\036	packed data
+>2	belong		>1		\b, %d characters originally
+>2	belong		=1		\b, %d character originally
+#
+# This magic number is byte-order-independent.
+0	short		0x1f1f		old packed data
+
+# XXX - why *two* entries for "compacted data", one of which is
+# byte-order independent, and one of which is byte-order dependent?
+#
+0	short		0x1fff		compacted data
+# This string is valid for SunOS (BE) and a matching "short" is listed
+# in the Ultrix (LE) magic file.
+0	string		\377\037	compacted data
+0	short		0145405		huf output
+
+# bzip2
+0	string		BZh		bzip2 compressed data
+>3	byte		>47		\b, block size = %c00k
+
+# squeeze and crunch
+# Michael Haardt <michael at cantor.informatik.rwth-aachen.de>
+0	beshort		0x76FF		squeezed data,
+>4	string		x		original name %s
+0	beshort		0x76FE		crunched data,
+>2	string		x		original name %s
+0	beshort		0x76FD		LZH compressed data,
+>2	string		x		original name %s
+
+# Freeze
+0	string		\037\237	frozen file 2.1
+0	string		\037\236	frozen file 1.0 (or gzip 0.5)
+
+# SCO compress -H (LZH)
+0	string		\037\240	SCO compress -H (LZH) data
+
+# European GSM 06.10 is a provisional standard for full-rate speech
+# transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse
+# excitation/long term prediction) coding at 13 kbit/s.
+#
+# There's only a magic nibble (4 bits); that nibble repeats every 33
+# bytes.  This isn't suited for use, but maybe we can use it someday.
+#
+# This will cause very short GSM files to be declared as data and
+# mismatches to be declared as data too!
+#0	byte&0xF0	0xd0		data
+#>33	byte&0xF0	0xd0
+#>66	byte&0xF0	0xd0
+#>99	byte&0xF0	0xd0
+#>132	byte&0xF0	0xd0		GSM 06.10 compressed audio
+
+# bzip	a block-sorting file compressor
+#	by Julian Seward <sewardj at cs.man.ac.uk> and others
+#
+0	string		BZ		bzip compressed data
+>2	byte		x		\b, version: %c
+>3	string		=1		\b, compression block size 100k
+>3	string		=2		\b, compression block size 200k
+>3	string		=3		\b, compression block size 300k
+>3	string		=4		\b, compression block size 400k
+>3	string		=5		\b, compression block size 500k
+>3	string		=6		\b, compression block size 600k
+>3	string		=7		\b, compression block size 700k
+>3	string		=8		\b, compression block size 800k
+>3	string		=9		\b, compression block size 900k
+
+# lzop from <markus.oberhumer at jk.uni-linz.ac.at>
+0	string		\x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a	lzop compressed data
+>9	beshort		<0x0940
+>>9	byte&0xf0	=0x00		- version 0.
+>>9	beshort&0x0fff	x		\b%03x,
+>>13	byte		1		LZO1X-1,
+>>13	byte		2		LZO1X-1(15),
+>>13	byte		3		LZO1X-999,
+## >>22	bedate		>0		last modified: %s,
+>>14	byte		=0x00		os: MS-DOS
+>>14	byte		=0x01		os: Amiga
+>>14	byte		=0x02		os: VMS
+>>14	byte		=0x03		os: Unix
+>>14	byte		=0x05		os: Atari
+>>14	byte		=0x06		os: OS/2
+>>14	byte		=0x07		os: MacOS
+>>14	byte		=0x0A		os: Tops/20
+>>14	byte		=0x0B		os: WinNT
+>>14	byte		=0x0E		os: Win32
+>9	beshort		>0x0939
+>>9	byte&0xf0	=0x00		- version 0.
+>>9	byte&0xf0	=0x10		- version 1.
+>>9	byte&0xf0	=0x20		- version 2.
+>>9	beshort&0x0fff	x		\b%03x,
+>>15	byte		1		LZO1X-1,
+>>15	byte		2		LZO1X-1(15),
+>>15	byte		3		LZO1X-999,
+## >>25	bedate		>0		last modified: %s,
+>>17	byte		=0x00		os: MS-DOS
+>>17	byte		=0x01		os: Amiga
+>>17	byte		=0x02		os: VMS
+>>17	byte		=0x03		os: Unix
+>>17	byte		=0x05		os: Atari
+>>17	byte		=0x06		os: OS/2
+>>17	byte		=0x07		os: MacOS
+>>17	byte		=0x0A		os: Tops/20
+>>17	byte		=0x0B		os: WinNT
+>>17	byte		=0x0E		os: Win32
+
+# 4.3BSD-Quasijarus Strong Compression
+# http://minnie.tuhs.org/Quasijarus/compress.html
+0	string		\037\241	Quasijarus strong compressed data
+
+# From: Cory Dikkers <cdikkers at swbell.net>
+0	string		XPKF		Amiga xpkf.library compressed data
+0	string		PP11		Power Packer 1.1 compressed data
+0	string		PP20		Power Packer 2.0 compressed data,
+>4	belong		0x09090909	fast compression
+>4	belong		0x090A0A0A	mediocre compression
+>4	belong		0x090A0B0B	good compression
+>4	belong		0x090A0C0C	very good compression
+>4	belong		0x090A0C0D	best compression
+
+# 7z archiver, from Thomas Klausner (wiz at danbala.tuwien.ac.at)
+# http://www.7-zip.org or DOC/7zFormat.txt 
+#
+0	string		7z\274\257\047\034	7z archive data,
+>6	byte		x			version %d
+>7	byte		x			\b.%d
+
+# AFX compressed files (Wolfram Kleff)
+2	string		-afx-		AFX compressed file data
+#------------------------------------------------------------------------------
+# Console game magic
+# Toby Deshane <hac at shoelace.digivill.net>
+#    ines:  file(1) magic for Marat's iNES Nintendo Entertainment System
+#           ROM dump format
+
+0 string NES\032 iNES ROM dump,
+>4 byte  x     %dx16k PRG
+>5 byte  x     \b, %dx8k CHR
+>6 byte&0x01  =0x1  \b, [Vert.]
+>6 byte&0x01  =0x0  \b, [Horiz.]
+>6 byte&0x02  =0x2  \b, [SRAM]
+>6 byte&0x04  =0x4  \b, [Trainer]
+>6 byte&0x04  =0x8  \b, [4-Scr]
+
+#------------------------------------------------------------------------------
+# gameboy:  file(1) magic for the Nintendo (Color) Gameboy raw ROM format
+#
+0x104 belong 0xCEED6666 Gameboy ROM:
+>0x134 string >\0 "%.16s"
+>0x146 byte 0x03  \b,[SGB]
+>0x147 byte 0x00  \b, [ROM ONLY]
+>0x147 byte 0x01  \b, [ROM+MBC1]
+>0x147 byte 0x02  \b, [ROM+MBC1+RAM]
+>0x147 byte 0x03  \b, [ROM+MBC1+RAM+BATT]
+>0x147 byte 0x05  \b, [ROM+MBC2]
+>0x147 byte 0x06  \b, [ROM+MBC2+BATTERY]
+>0x147 byte 0x08  \b, [ROM+RAM]
+>0x147 byte 0x09  \b, [ROM+RAM+BATTERY]
+>0x147 byte 0x0B  \b, [ROM+MMM01]
+>0x147 byte 0x0C  \b, [ROM+MMM01+SRAM]
+>0x147 byte 0x0D  \b, [ROM+MMM01+SRAM+BATT]
+>0x147 byte 0x0F  \b, [ROM+MBC3+TIMER+BATT]
+>0x147 byte 0x10  \b, [ROM+MBC3+TIMER+RAM+BATT]
+>0x147 byte 0x11  \b, [ROM+MBC3]
+>0x147 byte 0x12  \b, [ROM+MBC3+RAM]
+>0x147 byte 0x13  \b, [ROM+MBC3+RAM+BATT]
+>0x147 byte 0x19  \b, [ROM+MBC5]
+>0x147 byte 0x1A  \b, [ROM+MBC5+RAM]
+>0x147 byte 0x1B  \b, [ROM+MBC5+RAM+BATT]
+>0x147 byte 0x1C  \b, [ROM+MBC5+RUMBLE]
+>0x147 byte 0x1D  \b, [ROM+MBC5+RUMBLE+SRAM]
+>0x147 byte 0x1E  \b, [ROM+MBC5+RUMBLE+SRAM+BATT]
+>0x147 byte 0x1F  \b, [Pocket Camera]
+>0x147 byte 0xFD  \b, [Bandai TAMA5]
+>0x147 byte 0xFE  \b, [Hudson HuC-3]
+>0x147 byte 0xFF  \b, [Hudson HuC-1]
+
+>0x148 byte 0     \b, ROM: 256Kbit
+>0x148 byte 1     \b, ROM: 512Kbit
+>0x148 byte 2     \b, ROM: 1Mbit
+>0x148 byte 3     \b, ROM: 2Mbit
+>0x148 byte 4     \b, ROM: 4Mbit
+>0x148 byte 5     \b, ROM: 8Mbit
+>0x148 byte 6     \b, ROM: 16Mbit
+>0x148 byte 0x52  \b, ROM: 9Mbit
+>0x148 byte 0x53  \b, ROM: 10Mbit
+>0x148 byte 0x54  \b, ROM: 12Mbit
+
+>0x149 byte 1     \b, RAM: 16Kbit
+>0x149 byte 2     \b, RAM: 64Kbit
+>0x149 byte 3     \b, RAM: 128Kbit
+>0x149 byte 4     \b, RAM: 1Mbit
+
+#>0x14e long  x     \b, CRC: %x
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) magic for the Sega MegaDrive/Genesis raw ROM format
+#
+0x100 string SEGA  Sega MegaDrive/Genesis raw ROM dump
+>0x120 string >\0 Name: "%.16s"
+>0x110 string >\0 %.16s
+>0x1B0 string RA with SRAM
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) magic for the Super MegaDrive ROM dump format
+#
+0x280 string EAGN  Super MagicDrive ROM dump
+>0 byte x %dx16k blocks
+>2 byte 0 \b, last in series or standalone
+>2 byte >0 \b, split ROM
+>8 byte 0xAA
+>9 byte 0xBB
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) alternate magic for the Super MegaDrive ROM dump format
+#
+0x280 string EAMG  Super MagicDrive ROM dump
+>0 byte x %dx16k blocks
+>2 byte x \b, last in series or standalone
+>8 byte 0xAA
+>9 byte 0xBB
+
+#------------------------------------------------------------------------------
+# smsgg:  file(1) magic for Sega Master System and Game Gear ROM dumps
+#
+# Does not detect all images.  Very preliminary guesswork.  Need more data
+# on format.
+#
+# FIXME: need a little more info...;P
+#
+#0 byte 0xF3
+#>1 byte 0xED  Sega Master System/Game Gear ROM dump
+#>1 byte 0x31  Sega Master System/Game Gear ROM dump
+#>1 byte 0xDB  Sega Master System/Game Gear ROM dump
+#>1 byte 0xAF  Sega Master System/Game Gear ROM dump
+#>1 byte 0xC3  Sega Master System/Game Gear ROM dump
+
+#------------------------------------------------------------------------------
+# dreamcast:  file(1) uncertain magic for the Sega Dreamcast VMU image format
+#
+0 belong 0x21068028   Sega Dreamcast VMU game image
+0 string LCDi         Dream Animator file
+
+#------------------------------------------------------------------------------
+# v64: file(1) uncertain magic for the V64 format N64 ROM dumps
+#
+0 belong 0x37804012    V64 Nintendo 64 ROM dump
+
+#------------------------------------------------------------------------------
+# msx: file(1) magic for MSX game cartridge dumps
+# Too simple - MPi
+#0 beshort 0x4142 MSX game cartridge dump 
+
+#------------------------------------------------------------------------------
+# Sony Playstation executables (Adam Sjoegren <asjo at diku.dk>) :
+0	string	PS-X\ EXE	Sony Playstation executable
+#  Area:
+>113	string	x		(%s)
+
+#------------------------------------------------------------------------------
+# Microsoft Xbox executables .xbe (Esa Hyytiä <ehyytia at cc.hut.fi>)
+0       string          XBEH            XBE, Microsoft Xbox executable
+# probabilistic checks whether signed or not
+>0x0004 ulelong =0x0
+>>&2    ulelong =0x0
+>>>&2   ulelong =0x0  \b, not signed
+>0x0004 ulelong >0
+>>&2    ulelong >0
+>>>&2   ulelong >0    \b, signed
+# expect base address of 0x10000
+>0x0104               ulelong =0x10000
+>>(0x0118-0x0FF60)    ulelong&0x80000007  0x80000007 \b, all regions
+>>(0x0118-0x0FF60)    ulelong&0x80000007  !0x80000007
+>>>(0x0118-0x0FF60)   ulelong >0           (regions:
+>>>>(0x0118-0x0FF60)  ulelong &0x00000001  NA
+>>>>(0x0118-0x0FF60)  ulelong &0x00000002  Japan
+>>>>(0x0118-0x0FF60)  ulelong &0x00000004  Rest_of_World
+>>>>(0x0118-0x0FF60)  ulelong &0x80000000  Manufacturer
+>>>(0x0118-0x0FF60)   ulelong >0           \b)
+
+# --------------------------------
+# Microsoft Xbox data file formats
+0       string          XIP0            XIP, Microsoft Xbox data
+0       string          XTF0            XTF, Microsoft Xbox data
+#------------------------------------------------------------------------------
+# convex:  file(1) magic for Convex boxes
+#
+# Convexes are big-endian.
+#
+# /*\
+#  * Below are the magic numbers and tests added for Convex.
+#  * Added at beginning, because they are expected to be used most.
+# \*/
+0	belong	0507	Convex old-style object
+>16	belong	>0	not stripped
+0	belong	0513	Convex old-style demand paged executable
+>16	belong	>0	not stripped
+0	belong	0515	Convex old-style pre-paged executable
+>16	belong	>0	not stripped
+0	belong	0517	Convex old-style pre-paged, non-swapped executable
+>16	belong	>0	not stripped
+0	belong	0x011257	Core file
+#
+# The following are a series of dump format magic numbers.  Each one
+# corresponds to a drastically different dump format.  The first on is
+# the original dump format on a 4.1 BSD or earlier file system.  The
+# second marks the change between the 4.1 file system and the 4.2 file
+# system.  The Third marks the changing of the block size from 1K
+# to 2K to be compatible with an IDC file system.  The fourth indicates
+# a dump that is dependent on Convex Storage Manager, because data in
+# secondary storage is not physically contained within the dump.
+# The restore program uses these number to determine how the data is
+# to be extracted.
+#
+24	belong	=60011	dump format, 4.1 BSD or earlier
+24	belong	=60012	dump format, 4.2 or 4.3 BSD without IDC
+24	belong	=60013	dump format, 4.2 or 4.3 BSD (IDC compatible)
+24	belong	=60014	dump format, Convex Storage Manager by-reference dump
+#
+# what follows is a bunch of bit-mask checks on the flags field of the opthdr.
+# If there is no `=' sign, assume just checking for whether the bit is set?
+#
+0	belong	0601		Convex SOFF
+>88	belong&0x000f0000	=0x00000000	c1
+>88	belong			&0x00010000	c2
+>88	belong			&0x00020000	c2mp
+>88	belong			&0x00040000	parallel
+>88	belong			&0x00080000	intrinsic
+>88	belong			&0x00000001	demand paged
+>88	belong			&0x00000002	pre-paged
+>88	belong			&0x00000004	non-swapped
+>88	belong			&0x00000008	POSIX
+#
+>84	belong			&0x80000000	executable
+>84	belong			&0x40000000	object
+>84	belong&0x20000000	=0		not stripped
+>84	belong&0x18000000	=0x00000000	native fpmode
+>84	belong&0x18000000	=0x10000000	ieee fpmode
+>84	belong&0x18000000	=0x18000000	undefined fpmode
+#
+0	belong			0605		Convex SOFF core
+#
+0	belong			0607		Convex SOFF checkpoint
+>88	belong&0x000f0000	=0x00000000	c1
+>88	belong			&0x00010000	c2
+>88	belong			&0x00020000	c2mp
+>88	belong			&0x00040000	parallel
+>88	belong			&0x00080000	intrinsic
+>88	belong			&0x00000008	POSIX
+#
+>84	belong&0x18000000	=0x00000000	native fpmode
+>84	belong&0x18000000	=0x10000000	ieee fpmode
+>84	belong&0x18000000	=0x18000000	undefined fpmode
+
+# ----------------------------------------------------------------------------
+# ctags:  file (1) magic for Exuberant Ctags files
+# From: Alexander Mai <mai at migdal.ikp.physik.tu-darmstadt.de>
+0       string  !_TAG   Exuberant Ctags tag file text
+
+#------------------------------------------------------------------------------
+# dact:  file(1) magic for DACT compressed files
+#
+0	long		0x444354C3	DACT compressed data
+>4	byte		>-1		(version %i.
+>5	byte		>-1		$BS%i.
+>6	byte		>-1		$BS%i)
+>7	long		>0		$BS, original size: %i bytes
+>15	long		>30		$BS, block size: %i bytes
+
+#------------------------------------------------------------------------------
+# database:  file(1) magic for various databases
+#
+# extracted from header/code files by Graeme Wilford (eep2gw at ee.surrey.ac.uk)
+#
+#
+# GDBM magic numbers
+#  Will be maintained as part of the GDBM distribution in the future.
+#  <downsj at teeny.org>
+0	belong	0x13579ace	GNU dbm 1.x or ndbm database, big endian
+0	lelong	0x13579ace	GNU dbm 1.x or ndbm database, little endian
+0	string	GDBM		GNU dbm 2.x database
+#
+# Berkeley DB
+#
+# Ian Darwin's file /etc/magic files: big/little-endian version.
+#
+# Hash 1.85/1.86 databases store metadata in network byte order.
+# Btree 1.85/1.86 databases store the metadata in host byte order.
+# Hash and Btree 2.X and later databases store the metadata in host byte order.
+
+0	long	0x00061561	Berkeley DB
+>8	belong	4321
+>>4	belong	>2		1.86
+>>4	belong	<3		1.85
+>>4	belong	>0		(Hash, version %d, native byte-order)
+>8	belong	1234
+>>4	belong	>2		1.86
+>>4	belong	<3		1.85
+>>4	belong	>0		(Hash, version %d, little-endian)
+
+0	belong	0x00061561	Berkeley DB
+>8	belong	4321
+>>4	belong	>2		1.86
+>>4	belong	<3		1.85
+>>4	belong	>0		(Hash, version %d, big-endian)
+>8	belong	1234
+>>4	belong	>2		1.86
+>>4	belong	<3		1.85
+>>4	belong	>0		(Hash, version %d, native byte-order)
+
+0	long	0x00053162	Berkeley DB 1.85/1.86
+>4	long	>0		(Btree, version %d, native byte-order)
+0	belong	0x00053162	Berkeley DB 1.85/1.86
+>4	belong	>0		(Btree, version %d, big-endian)
+0	lelong	0x00053162	Berkeley DB 1.85/1.86
+>4	lelong	>0		(Btree, version %d, little-endian)
+
+12	long	0x00061561	Berkeley DB
+>16	long	>0		(Hash, version %d, native byte-order)
+12	belong	0x00061561	Berkeley DB
+>16	belong	>0		(Hash, version %d, big-endian)
+12	lelong	0x00061561	Berkeley DB
+>16	lelong	>0		(Hash, version %d, little-endian)
+
+12	long	0x00053162	Berkeley DB
+>16	long	>0		(Btree, version %d, native byte-order)
+12	belong	0x00053162	Berkeley DB
+>16	belong	>0		(Btree, version %d, big-endian)
+12	lelong	0x00053162	Berkeley DB
+>16	lelong	>0		(Btree, version %d, little-endian)
+
+12	long	0x00042253	Berkeley DB
+>16	long	>0		(Queue, version %d, native byte-order)
+12	belong	0x00042253	Berkeley DB
+>16	belong	>0		(Queue, version %d, big-endian)
+12	lelong	0x00042253	Berkeley DB
+>16	lelong	>0		(Queue, version %d, little-endian)
+#
+#
+# Round Robin Database Tool by Tobias Oetiker <oetiker at ee.ethz.ch>
+0	string	RRD		RRDTool DB
+>4	string	x		version %s
+#----------------------------------------------------------------------
+# ROOT: file(1) magic for ROOT databases
+#
+0       string  root\0  ROOT file
+>4      belong  x       Version %d
+>33     belong  x       (Compression: %d)
+
+# XXX: Weak magic.
+# Alex Ott <ott at jet.msk.su>
+## Paradox file formats
+#2	  leshort	0x0800	Paradox 
+#>0x39	  byte		3	v. 3.0 
+#>0x39	  byte		4	v. 3.5 
+#>0x39	  byte		9	v. 4.x 
+#>0x39	  byte		10	v. 5.x 
+#>0x39	  byte		11	v. 5.x 
+#>0x39	  byte		12	v. 7.x 
+#>>0x04	  byte		0	indexed .DB data file 
+#>>0x04	  byte		1	primary index .PX file 
+#>>0x04	  byte		2	non-indexed .DB data file 
+#>>0x04	  byte		3	non-incrementing secondary index .Xnn file 
+#>>0x04	  byte		4	secondary index .Ynn file 
+#>>0x04	  byte		5	incrementing secondary index .Xnn file 
+#>>0x04	  byte		6	non-incrementing secondary index .XGn file 
+#>>0x04	  byte		7	secondary index .YGn file 
+#>>>0x04	  byte		8	incrementing secondary index .XGn file 
+## XBase database files
+#0      byte       0x02	
+#>8     leshort	  >0
+#>>12   leshort    0	FoxBase 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x03	
+#>8     leshort	  >0
+#>>12   leshort    0	FoxBase+, FoxPro, dBaseIII+, dBaseIV, no memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x04	
+#>8     leshort	  >0
+#>>12   leshort    0	dBASE IV no memo file 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x05	
+#>8     leshort	  >0
+#>>12   leshort    0	dBASE V no memo file 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x30
+#>8     leshort	  >0
+#>>12   leshort    0	Visual FoxPro 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x43
+#>8     leshort	  >0
+#>>12   leshort    0	FlagShip with memo var size 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x7b
+#>8     leshort	  >0
+#>>12   leshort    0	dBASEIV with memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x83	
+#>8     leshort	  >0
+#>>12   leshort    0	FoxBase+, dBaseIII+ with memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x8b
+#>8     leshort	  >0
+#>>12   leshort    0	dBaseIV with memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x8e	
+#>8     leshort	  >0
+#>>12   leshort    0	dBaseIV with SQL Table 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0xb3
+#>8     leshort	  >0
+#>>12   leshort    0	FlagShip with .dbt memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0xf5
+#>8     leshort	  >0
+#>>12   leshort    0	FoxPro with memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0	leshort		0x0006		DBase 3 index file
+
+# MS Access database
+4	  string	Standard\ Jet\ DB	Microsoft Access Database
+
+# TDB database from Samba et al - Martin Pool <mbp at samba.org>
+0	string	TDB\ file		TDB database
+>32	lelong	0x2601196D		version 6, little-endian
+>>36	lelong	x			hash size %d bytes
+
+# SE Linux policy database
+0       lelong  0xf97cff8c      SE Linux policy
+>16     lelong  x               v%d
+>20     lelong  1      MLS
+>24     lelong  x       %d symbols
+>28     lelong  x       %d ocons
+
+# ICE authority file data (Wolfram Kleff)
+2	string		ICE		ICE authority data
+
+# X11 Xauthority file (Wolfram Kleff)
+10	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+11	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+12	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+13	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+14	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+15	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+16	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+17	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+18	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+
+#------------------------------------------------------------------------------
+# diamond:  file(1) magic for Diamond system
+#
+# ... diamond is a multi-media mail and electronic conferencing system....
+#
+# XXX - I think it was either renamed Slate, or replaced by Slate....
+#
+#	The full deal is too long...
+#0	string	<list>\n<protocol\ bbn-multimedia-format>	Diamond Multimedia Document
+0	string	=<list>\n<protocol\ bbn-m	Diamond Multimedia Document
+
+#------------------------------------------------------------------------------
+# diff:  file(1) magic for diff(1) output
+#
+0	string		diff\ 	'diff' output text
+0	string		***\ 		'diff' output text
+0	string		Only\ in\ 	'diff' output text
+0	string		Common\ subdirectories:\ 	'diff' output text
+
+# xdelta is like diff(1) for binary files (works for text, too).
+# Available from: ftp://ftp.xcf.berkeley.edu/pub/xdelta/
+0       string          %XDZ            xdelta diff file
+>4      string          >%              version %.3s
+#  Digital UNIX - Info
+#
+0	string	!<arch>\n________64E	Alpha archive
+>22	string	X			-- out of date
+#
+# Alpha COFF Based Executables
+# The stripped stuff really needs to be an 8 byte (64 bit) compare,
+# but this works
+0	leshort		0x183		COFF format alpha
+>22	leshort&020000	&010000		sharable library,
+>22	leshort&020000	^010000		dynamically linked,
+>24	leshort		0410		pure
+>24	leshort		0413		demand paged
+>8	lelong		>0		executable or object module, not stripped
+>8	lelong		0
+>>12	lelong		0		executable or object module, stripped
+>>12	lelong		>0		executable or object module, not stripped
+>27     byte            >0              - version %d.
+>26     byte            >0              %d-
+>28     leshort         >0              %d
+#
+# The next is incomplete, we could tell more about this format,
+# but its not worth it.
+0	leshort		0x188	Alpha compressed COFF
+0	leshort		0x18f	Alpha u-code object
+#
+#
+# Some other interesting Digital formats,
+0	string	\377\377\177		ddis/ddif
+0	string	\377\377\174		ddis/dots archive
+0	string	\377\377\176		ddis/dtif table data
+0	string	\033c\033		LN03 output
+0	long	04553207		X image
+#
+0	string	!<PDF>!\n		profiling data file
+#
+# Locale data tables (MIPS and Alpha).
+#
+0	short		0x0501		locale data table
+>6	short		0x24		for MIPS
+>6	short		0x40		for Alpha
+# ATSC A/53 aka AC-3 aka Dolby Digital <ashitaka at gmx.at>
+# from http://www.atsc.org/standards/a_52a.pdf
+# corrections, additions, etc. are always welcome!
+#
+# syncword
+0       beshort         0x0b77  ATSC A/52 aka AC-3 aka Dolby Digital stream,
+# fscod
+>4      byte&0xc0       0x00    48 kHz,
+>4      byte&0xc0       0x40    44.1 kHz,
+>4      byte&0xc0       0x80    32 kHz,
+# is this one used for 96 kHz?
+>4      byte&0xc0       0xc0    reserved frequency,
+#
+>5	byte&7 = 0		\b, complete main (CM)
+>5	byte&7 = 1		\b, music and effects (ME)
+>5	byte&7 = 2		\b, visually impaired (VI)
+>5	byte&7 = 3		\b, hearing impaired (HI)
+>5	byte&7 = 4		\b, dialogue (D)
+>5	byte&7 = 5		\b, commentary (C)
+>5	byte&7 = 6		\b, emergency (E)
+# acmod
+>6      byte&0xe0       0x00    1+1 front,
+>6      byte&0xe0       0x20    1 front/0 rear,
+>6      byte&0xe0       0x40    2 front/0 rear,
+>6      byte&0xe0       0x60    3 front/0 rear,
+>6      byte&0xe0       0x80    2 front/1 rear,
+>6      byte&0xe0       0xa0    3 front/1 rear,
+>6      byte&0xe0       0xc0    2 front/2 rear,
+>6      byte&0xe0       0xe0    3 front/2 rear,
+# lfeon (these may be incorrect)
+>7      byte&0x40       0x00    LFE off,
+>7      byte&0x40       0x40    LFE on,
+#
+>4	byte&0x3e = 0x00	\b, 32 kbit/s
+>4	byte&0x3e = 0x02        \b, 40 kbit/s
+>4	byte&0x3e = 0x04        \b, 48 kbit/s
+>4	byte&0x3e = 0x06        \b, 56 kbit/s
+>4	byte&0x3e = 0x08        \b, 64 kbit/s
+>4	byte&0x3e = 0x0a        \b, 80 kbit/s
+>4	byte&0x3e = 0x0c        \b, 96 kbit/s
+>4	byte&0x3e = 0x0e        \b, 112 kbit/s
+>4	byte&0x3e = 0x10        \b, 128 kbit/s
+>4	byte&0x3e = 0x12        \b, 160 kbit/s
+>4	byte&0x3e = 0x14        \b, 192 kbit/s
+>4	byte&0x3e = 0x16        \b, 224 kbit/s
+>4	byte&0x3e = 0x18        \b, 256 kbit/s
+>4	byte&0x3e = 0x1a        \b, 320 kbit/s
+>4	byte&0x3e = 0x1c        \b, 384 kbit/s
+>4	byte&0x3e = 0x1e        \b, 448 kbit/s
+>4	byte&0x3e = 0x20        \b, 512 kbit/s
+>4	byte&0x3e = 0x22        \b, 576 kbit/s
+>4	byte&0x3e = 0x24        \b, 640 kbit/s
+# dsurmod (these may be incorrect)
+>6      beshort&0x0180  0x0000  Dolby Surround not indicated
+>6      beshort&0x0180  0x0080  not Dolby Surround encoded
+>6      beshort&0x0180  0x0100  Dolby Surround encoded
+>6      beshort&0x0180  0x0180  reserved Dolby Surround mode
+
+#------------------------------------------------------------------------------
+# dump:  file(1) magic for dump file format--for new and old dump filesystems
+#
+# We specify both byte orders in order to recognize byte-swapped dumps.
+#
+24	belong	60012		new-fs dump file (big endian),
+>4	bedate	x		Previous dump %s,
+>8	bedate	x		This dump %s,
+>12	belong	>0		Volume %ld,
+>692	belong	0		Level zero, type:
+>692	belong	>0		Level %d, type:
+>0	belong	1		tape header,
+>0	belong	2		beginning of file record,
+>0	belong	3		map of inodes on tape,
+>0	belong	4		continuation of file record,
+>0	belong	5		end of volume,
+>0	belong	6		map of inodes deleted,
+>0	belong	7		end of medium (for floppy),
+>676	string	>\0		Label %s,
+>696	string	>\0		Filesystem %s,
+>760	string	>\0		Device %s,
+>824	string	>\0		Host %s,
+>888	belong	>0		Flags %x
+
+24	belong	60011		old-fs dump file (big endian),
+#>4	bedate	x		Previous dump %s,
+#>8	bedate	x		This dump %s,
+>12	belong	>0		Volume %ld,
+>692	belong	0		Level zero, type:
+>692	belong	>0		Level %d, type:
+>0	belong	1		tape header,
+>0	belong	2		beginning of file record,
+>0	belong	3		map of inodes on tape,
+>0	belong	4		continuation of file record,
+>0	belong	5		end of volume,
+>0	belong	6		map of inodes deleted,
+>0	belong	7		end of medium (for floppy),
+>676	string	>\0		Label %s,
+>696	string	>\0		Filesystem %s,
+>760	string	>\0		Device %s,
+>824	string	>\0		Host %s,
+>888	belong	>0		Flags %x
+
+24	lelong	60012		new-fs dump file (little endian),
+>4	ledate	x		This dump %s,
+>8	ledate	x		Previous dump %s,
+>12	lelong	>0		Volume %ld,
+>692	lelong	0		Level zero, type:
+>692	lelong	>0		Level %d, type:
+>0	lelong	1		tape header,
+>0	lelong	2		beginning of file record,
+>0	lelong	3		map of inodes on tape,
+>0	lelong	4		continuation of file record,
+>0	lelong	5		end of volume,
+>0	lelong	6		map of inodes deleted,
+>0	lelong	7		end of medium (for floppy),
+>676	string	>\0		Label %s,
+>696	string	>\0		Filesystem %s,
+>760	string	>\0		Device %s,
+>824	string	>\0		Host %s,
+>888	lelong	>0		Flags %x
+
+24	lelong	60011		old-fs dump file (little endian),
+#>4	ledate	x		Previous dump %s,
+#>8	ledate	x		This dump %s,
+>12	lelong	>0		Volume %ld,
+>692	lelong	0		Level zero, type:
+>692	lelong	>0		Level %d, type:
+>0	lelong	1		tape header,
+>0	lelong	2		beginning of file record,
+>0	lelong	3		map of inodes on tape,
+>0	lelong	4		continuation of file record,
+>0	lelong	5		end of volume,
+>0	lelong	6		map of inodes deleted,
+>0	lelong	7		end of medium (for floppy),
+>676	string	>\0		Label %s,
+>696	string	>\0		Filesystem %s,
+>760	string	>\0		Device %s,
+>824	string	>\0		Host %s,
+>888	lelong	>0		Flags %x
+
+#------------------------------------------------------------------------------
+# Dyadic: file(1) magic for Dyalog APL.
+#
+0 	byte	0xaa
+>1	byte	<4		Dyalog APL
+>>1	byte	0x00		incomplete workspace
+>>1	byte	0x01		component file
+>>1	byte	0x02		external variable
+>>1	byte	0x03		workspace
+>>2	byte	x		version %d
+>>3	byte	x		.%d
+
+#------------------------------------------------------------------------------
+# T602 editor documents 
+# by David Necas <yeti at physics.muni.cz>
+0	string	@CT\ 	T602 document data,
+>4	string	0	Kamenicky
+>4	string	1	CP 852
+>4	string	2	KOI8-CS
+>4	string	>2	unknown encoding
+
+# Vi IMproved Encrypted file 
+# by David Necas <yeti at physics.muni.cz>
+0	string	VimCrypt~	Vim encrypted file data
+
+#------------------------------------------------------------------------------
+# elf:  file(1) magic for ELF executables
+#
+# We have to check the byte order flag to see what byte order all the
+# other stuff in the header is in.
+#
+# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
+#
+# updated by Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		\177ELF		ELF
+>4	byte		0		invalid class
+>4	byte		1		32-bit
+# only for MIPS - in the future, the ABI field of e_flags should be used.
+>>18	leshort		8
+>>>36	lelong		&0x20		N32
+>>18	leshort		10
+>>>36	lelong		&0x20		N32
+>>18	beshort		8
+>>>36	belong		&0x20		N32
+>>18	beshort		10
+>>>36	belong		&0x20		N32
+>4	byte		2		64-bit
+>5	byte		0		invalid byte order
+>5	byte		1		LSB
+# The official e_machine number for MIPS is now #8, regardless of endianness.
+# The second number (#10) will be deprecated later. For now, we still
+# say something if #10 is encountered, but only gory details for #8.
+>>18    leshort		8
+# only for 32-bit
+>>>4	byte		1
+>>>>36  lelong&0xf0000000	0x00000000	MIPS-I
+>>>>36  lelong&0xf0000000	0x10000000	MIPS-II
+>>>>36  lelong&0xf0000000	0x20000000	MIPS-III
+>>>>36  lelong&0xf0000000	0x30000000	MIPS-IV
+>>>>36  lelong&0xf0000000	0x40000000	MIPS-V
+>>>>36  lelong&0xf0000000	0x60000000	MIPS32
+>>>>36  lelong&0xf0000000	0x70000000	MIPS64
+>>>>36  lelong&0xf0000000	0x80000000	MIPS32 rel2
+>>>>36  lelong&0xf0000000	0x90000000	MIPS64 rel2
+# only for 64-bit
+>>>4	byte		2
+>>>>48  lelong&0xf0000000	0x00000000	MIPS-I
+>>>>48  lelong&0xf0000000	0x10000000	MIPS-II
+>>>>48  lelong&0xf0000000	0x20000000	MIPS-III
+>>>>48  lelong&0xf0000000	0x30000000	MIPS-IV
+>>>>48  lelong&0xf0000000	0x40000000	MIPS-V
+>>>>48  lelong&0xf0000000	0x60000000	MIPS32
+>>>>48  lelong&0xf0000000	0x70000000	MIPS64 
+>>>>48  lelong&0xf0000000	0x80000000	MIPS32 rel2
+>>>>48  lelong&0xf0000000	0x90000000	MIPS64 rel2
+>>16	leshort		0		no file type,
+>>16	leshort		1		relocatable,
+>>16	leshort		2		executable,
+>>16	leshort		3		shared object,
+# Core handling from Peter Tobias <tobias at server.et-inf.fho-emden.de>
+# corrections by Christian 'Dr. Disk' Hechelmann <drdisk at ds9.au.s.shuttle.de>
+>>16	leshort		4		core file
+# Core file detection is not reliable.
+#>>>(0x38+0xcc) string	>\0		of '%s'
+#>>>(0x38+0x10) lelong	>0		(signal %d),
+>>16	leshort		&0xff00		processor-specific,
+>>18	leshort		0		no machine,
+>>18	leshort		1		AT&T WE32100 - invalid byte order,
+>>18	leshort		2		SPARC - invalid byte order,
+>>18	leshort		3		Intel 80386,
+>>18	leshort		4		Motorola
+>>>36	lelong		&0x01000000	68000 - invalid byte order,
+>>>36	lelong		&0x00810000	CPU32 - invalid byte order,
+>>>36	lelong		0		68020 - invalid byte order,
+>>18	leshort		5		Motorola 88000 - invalid byte order,
+>>18	leshort		6		Intel 80486,
+>>18	leshort		7		Intel 80860,
+>>18	leshort		8		MIPS,
+>>18	leshort		9		Amdahl - invalid byte order,
+>>18	leshort		10		MIPS (deprecated),
+>>18	leshort		11		RS6000 - invalid byte order,
+>>18	leshort		15		PA-RISC - invalid byte order,
+>>>50	leshort		0x0214		2.0
+>>>48	leshort		&0x0008		(LP64),
+>>18	leshort		16		nCUBE,
+>>18	leshort		17		Fujitsu VPP500,
+>>18	leshort		18		SPARC32PLUS,
+>>18	leshort		20		PowerPC,
+>>18	leshort		22		IBM S/390,
+>>18	leshort		36		NEC V800,
+>>18	leshort		37		Fujitsu FR20,
+>>18	leshort		38		TRW RH-32,
+>>18	leshort		39		Motorola RCE,
+>>18	leshort		40		ARM,
+>>18	leshort		41		Alpha,
+>>18	leshort		0xa390		IBM S/390 (obsolete),
+>>18	leshort		42		Hitachi SH,
+>>18	leshort		43		SPARC V9 - invalid byte order,
+>>18	leshort		44		Siemens Tricore Embedded Processor,
+>>18	leshort		45		Argonaut RISC Core, Argonaut Technologies Inc.,
+>>18	leshort		46		Hitachi H8/300,
+>>18	leshort		47		Hitachi H8/300H,
+>>18	leshort		48		Hitachi H8S,
+>>18	leshort		49		Hitachi H8/500,
+>>18	leshort		50		IA-64 (Intel 64 bit architecture),
+>>18	leshort		51		Stanford MIPS-X,
+>>18	leshort		52		Motorola Coldfire,
+>>18	leshort		53		Motorola M68HC12,
+>>18	leshort		62		AMD x86-64,
+>>18	leshort		75		Digital VAX,
+>>18	leshort		97		NatSemi 32k,
+>>18	leshort		0x9026		Alpha (unofficial),
+>>20	lelong		0		invalid version
+>>20	lelong		1		version 1
+>>36	lelong		1		MathCoPro/FPU/MAU Required
+>5	byte		2		MSB
+# only for MIPS - see comment in little-endian section above.
+>>18    beshort		8
+# only for 32-bit
+>>>4	byte		1
+>>>>36  belong&0xf0000000	0x00000000	MIPS-I
+>>>>36  belong&0xf0000000	0x10000000	MIPS-II
+>>>>36  belong&0xf0000000	0x20000000	MIPS-III
+>>>>36  belong&0xf0000000	0x30000000	MIPS-IV
+>>>>36  belong&0xf0000000	0x40000000	MIPS-V
+>>>>36  belong&0xf0000000	0x60000000	MIPS32
+>>>>36  belong&0xf0000000	0x70000000	MIPS64
+>>>>36  belong&0xf0000000	0x80000000	MIPS32 rel2
+>>>>36  belong&0xf0000000	0x90000000	MIPS64 rel2
+# only for 64-bit
+>>>4	byte		2
+>>>>48	belong&0xf0000000	0x00000000	MIPS-I
+>>>>48	belong&0xf0000000	0x10000000	MIPS-II
+>>>>48	belong&0xf0000000	0x20000000	MIPS-III
+>>>>48	belong&0xf0000000	0x30000000	MIPS-IV
+>>>>48	belong&0xf0000000	0x40000000	MIPS-V
+>>>>48	belong&0xf0000000	0x60000000	MIPS32
+>>>>48	belong&0xf0000000	0x70000000	MIPS64 
+>>>>48	belong&0xf0000000	0x80000000	MIPS32 rel2
+>>>>48	belong&0xf0000000	0x90000000	MIPS64 rel2
+>>16	beshort		0		no file type,
+>>16	beshort		1		relocatable,
+>>16	beshort		2		executable,
+>>16	beshort		3		shared object,
+>>16	beshort		4		core file,
+#>>>(0x38+0xcc) string	>\0		of '%s'
+#>>>(0x38+0x10) belong	>0		(signal %d),
+>>16	beshort		&0xff00		processor-specific,
+>>18	beshort		0		no machine,
+>>18	beshort		1		AT&T WE32100,
+>>18	beshort		2		SPARC,
+>>18	beshort		3		Intel 80386 - invalid byte order,
+>>18	beshort		4		Motorola
+>>>36	belong		&0x01000000	68000,
+>>>36	belong		&0x00810000	CPU32,
+>>>36	belong		0		68020,
+>>18	beshort		5		Motorola 88000,
+>>18	beshort		6		Intel 80486 - invalid byte order,
+>>18	beshort		7		Intel 80860,
+>>18	beshort		8		MIPS,
+>>18	beshort		9		Amdahl,
+>>18	beshort		10		MIPS (deprecated),
+>>18	beshort		11		RS6000,
+>>18	beshort		15		PA-RISC
+>>>50	beshort		0x0214		2.0
+>>>48	beshort		&0x0008		(LP64)
+>>18	beshort		16		nCUBE,
+>>18	beshort		17		Fujitsu VPP500,
+>>18	beshort		18		SPARC32PLUS,
+>>>36	belong&0xffff00	&0x000100	V8+ Required,
+>>>36	belong&0xffff00	&0x000200	Sun UltraSPARC1 Extensions Required,
+>>>36	belong&0xffff00	&0x000400	HaL R1 Extensions Required,
+>>>36	belong&0xffff00	&0x000800	Sun UltraSPARC3 Extensions Required,
+>>18	beshort		20		PowerPC or cisco 4500,
+>>18	beshort		21		cisco 7500,
+>>18	beshort		22		IBM S/390,
+>>18	beshort		24		cisco SVIP,
+>>18	beshort		25		cisco 7200,
+>>18	beshort		36		NEC V800 or cisco 12000,
+>>18	beshort		37		Fujitsu FR20,
+>>18	beshort		38		TRW RH-32,
+>>18	beshort		39		Motorola RCE,
+>>18	beshort		40		ARM,
+>>18	beshort		41		Alpha,
+>>18	beshort		42		Hitachi SH,
+>>18	beshort		43		SPARC V9,
+>>18	beshort		44		Siemens Tricore Embedded Processor,
+>>18	beshort		45		Argonaut RISC Core, Argonaut Technologies Inc.,
+>>18	beshort		46		Hitachi H8/300,
+>>18	beshort		47		Hitachi H8/300H,
+>>18	beshort		48		Hitachi H8S,
+>>18	beshort		49		Hitachi H8/500,
+>>18	beshort		50		IA-64 (Intel 64 bit architecture),
+>>18	beshort		51		Stanford MIPS-X,
+>>18	beshort		52		Motorola Coldfire,
+>>18	beshort		53		Motorola M68HC12,
+>>18	beshort		73		Cray NV1,
+>>18	beshort		75		Digital VAX,
+>>18	beshort		97		NatSemi 32k,
+>>18	beshort		0x9026		Alpha (unofficial),
+>>18	beshort		0xa390		IBM S/390 (obsolete),
+>>20	belong		0		invalid version
+>>20	belong		1		version 1
+>>36	belong		1		MathCoPro/FPU/MAU Required
+# Up to now only 0, 1 and 2 are defined; I've seen a file with 0x83, it seemed
+# like proper ELF, but extracting the string had bad results.
+>4      byte            <0x80
+>>8	string		>\0		(%s)
+>8	string		\0
+>>7	byte		0		(SYSV)
+>>7	byte		1		(HP-UX)
+>>7	byte		2		(NetBSD)
+>>7	byte		3		(GNU/Linux)
+>>7	byte		4		(GNU/Hurd)
+>>7	byte		5		(86Open)
+>>7	byte		6		(Solaris)
+>>7	byte		7		(Monterey)
+>>7	byte		8		(IRIX)
+>>7	byte		9		(FreeBSD)
+>>7	byte		10		(Tru64)
+>>7	byte		11		(Novell Modesto)
+>>7	byte		12		(OpenBSD)
+>>7	byte		97		(ARM)
+>>7	byte		255		(embedded)
+
+#------------------------------------------------------------------------------
+# encore:  file(1) magic for Encore machines
+#
+# XXX - needs to have the byte order specified (NS32K was little-endian,
+# dunno whether they run the 88K in little-endian mode or not).
+#
+0	short		0x154		Encore
+>20	short		0x107		executable
+>20	short		0x108		pure executable
+>20	short		0x10b		demand-paged executable
+>20	short		0x10f		unsupported executable
+>12	long		>0		not stripped
+>22	short		>0		- version %ld
+>22	short		0		-
+#>4	date		x		stamp %s
+0	short		0x155		Encore unsupported executable
+>12	long		>0		not stripped
+>22	short		>0		- version %ld
+>22	short		0		-
+#>4	date		x		stamp %s
+
+#------------------------------------------------------------------------------
+# Epoc 32 : file(1) magic for Epoc Documents [psion/osaris
+# Stefan Praszalowicz (hpicollo at worldnet.fr)
+#0	lelong		0x10000037	Epoc32
+>4	lelong		0x1000006D
+>>8	lelong		0x1000007F	Word
+>>8	lelong		0x10000088	Sheet
+>>8	lelong		0x1000007D	Sketch
+>>8	lelong		0x10000085	TextEd
+
+#------------------------------------------------------------------------------
+# fcs: file(1) magic for FCS (Flow Cytometry Standard) data files
+# From Roger Leigh <roger at whinlatter.uklinux.net>
+0       string          FCS1.0          Flow Cytometry Standard (FCS) data, version 1.0
+0       string          FCS2.0          Flow Cytometry Standard (FCS) data, version 2.0
+0       string          FCS3.0          Flow Cytometry Standard (FCS) data, version 3.0
+
+#------------------------------------------------------------------------------
+# lxkernel: file(1) magic for Linux/i386 Kernel
+# compiled Linux-kernel submitted by Hans Lermen lermen at elserv.ffm.fgan.de
+0x202			string		HdrS		Linux
+>0x1fe			leshort		0xAA55		\b/x86 Kernel
+>0x1fe			leshort		<0xAA55		Kernel
+>0x1fe			leshort		>0xAA55		Kernel
+>0x206			leshort		0x0105		\b, Setup Version 0x105, zImage
+>0x206			leshort		>0x0105		\b, Setup Version %#hx
+>>0x211			byte		0		\b, zImage
+>>0x211			byte		1		\b, bzImage
+>>>(0x20e.s+0x205)	byte		32
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %5.5s
+>>>(0x20e.s+0x206)	byte		32
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %6.6s
+>>>(0x20e.s+0x207)	byte		32
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %7.7s
+>>>(0x20e.s+0x205)	byte		45
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %s
+>>>(0x20e.s+0x206)	byte		45
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %s
+>>>(0x20e.s+0x207)	byte		45
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %s
+>>0x1f2			leshort		1		\b, RO-rootFS
+>>0x1f2			leshort		0		\b, RW-rootFS
+>>0x1fc			leshort		>0		\b, root_dev 0x%X
+>>0x1f6			leshort		>0		\b, swap_dev 0x%X
+>>0x1f8			leshort		>0		\b, RAMdisksize %u KB
+>>0x1fa			leshort		0xFFFF		\b, Normal VGA
+>>0x1fa			leshort		0xFFFE		\b, Extended VGA
+>>0x1fa			leshort		0xFFFD		\b, Prompt for Videomode
+>>0x1fa			leshort		>0		\b, Video mode %d
+
+0x1e3			string		Loading		Linux/i386 Kernel zImage
+
+#------------------------------------------------------------------------------
+# filesystems:  file(1) magic for different filesystems
+#
+0	string	\366\366\366\366	PC formatted floppy with no filesystem
+# Sun disk labels
+# From /usr/include/sun/dklabel.h:
+0774	beshort		0xdabe		Sun disk label
+>0	string		x		'%s
+>>31  	string		>\0		\b%s
+>>>63  	string		>\0		\b%s
+>>>>95 	string		>\0		\b%s
+>0	string		x		\b'
+>0734	short		>0		%d rpm,
+>0736	short		>0		%d phys cys,
+>0740	short		>0		%d alts/cyl,
+>0746	short		>0		%d interleave,
+>0750	short		>0		%d data cyls,
+>0752	short		>0		%d alt cyls,
+>0754	short		>0		%d heads/partition,
+>0756	short		>0		%d sectors/track,
+>0764	long		>0		start cyl %ld,
+>0770	long		x		%ld blocks
+# Is there a boot block written 1 sector in?
+>512    belong&077777777	0600407	\b, boot block present
+0x1FE	leshort	0xAA55			x86 boot sector
+>2	string	OSBS			\b, OS/BS MBR
+# J\xf6rg Jenderek <joerg.jenderek at gmx.net>
+>0x8C	string	Invalid\ partition\ table	\b, MS-DOS MBR
+>0x9D	string	Invalid\ partition\ table	\b, DR-DOS MBR, version 7.01 to 7.03
+>0x10F	string	Ung\201ltige\ Partitionstabelle	\b, MS-DOS MBR, german version 4.10.1998, 4.10.2222
+>0x8B	string	Ung\201ltige\ Partitionstabelle	\b, MS-DOS MBR, german version 5.00 to 4.00.950
+>0x145	string	Default:\ F			\b, FREE-DOS MBR
+>0	string	\0\0\0\0		\b, extended partition table
+# JuMP short     bootcodeoffset NOP assembler instructions will usually be EB xx 90
+# older drives may use E9 xx xx
+>0		lelong&0x009000EB	0x009000EB 
+>0		lelong&0x000000E9	0x000000E9 
+>>1		ubyte			>37	\b, code offset 0x%x
+# mtools-3.9.8/msdos.h
+# usual values are marked with comments to get only informations of strange FAT systems
+# valid sectorsize are from 32 to 2048
+>>>11		uleshort	<2049	
+>>>>11		uleshort	>31	
+>>>>>3		string		>\0		\b, OEM-ID "%8.8s"
+>>>>>11		uleshort	>512		\b, Bytes/sector %u
+#>>>>>11	uleshort	=512		\b, Bytes/sector %u=512 (usual)
+>>>>>11		uleshort	<512		\b, Bytes/sector %u
+>>>>>13		ubyte		>1		\b, sectors/cluster %u
+#>>>>>13	ubyte		=1		\b, sectors/cluster %u (usual on Floppies)
+>>>>>14		uleshort	>32		\b, reserved sectors %u
+#>>>>>14	uleshort	=32		\b, reserved sectors %u (usual Fat32)
+#>>>>>14	uleshort	>1		\b, reserved sectors %u
+#>>>>>14	uleshort	=1		\b, reserved sectors %u (usual FAT12,FAT16)
+>>>>>14		uleshort	<1		\b, reserved sectors %u
+>>>>>16		ubyte		>2		\b, FATs %u
+#>>>>>16	ubyte		=2		\b, FATs %u (usual)
+>>>>>16		ubyte		=1		\b, FAT  %u
+>>>>>16		ubyte		>0
+>>>>>17		uleshort	>0		\b, root entries %u
+#>>>>>17	uleshort	=0		\b, root entries %u=0 (usual Fat32)
+>>>>>19		uleshort	>0		\b, sectors %u (volumes <=32 MB) 
+#>>>>>19	uleshort	=0		\b, sectors %u=0 (usual Fat32)
+>>>>>21		ubyte		>0xF0		\b, Media descriptor 0x%x
+#>>>>>21	ubyte		=0xF0		\b, Media descriptor 0x%x (usual floppy)
+>>>>>21		ubyte		<0xF0		\b, Media descriptor 0x%x
+>>>>>22		uleshort	>0		\b, sectors/FAT %u
+#>>>>>22	uleshort	=0		\b, sectors/FAT %u=0 (usual Fat32)
+>>>>>26		ubyte		>2		\b, heads %u
+#>>>>>26	ubyte		=2		\b, heads %u (usual floppy)
+>>>>>26		ubyte		=1		\b, heads %u
+>>>>>28		ulelong		>0		\b, hidden sectors %u
+#>>>>>28	ulelong		=0		\b, hidden sectors %u (usual floppy)
+>>>>>32		ulelong		>0		\b, sectors %u (volumes > 32 MB) 
+#>>>>>32	ulelong		=0		\b, sectors %u (volumes > 32 MB) 
+# FAT<32 specific 
+# NOT le FAT3=NOT 3TAF=0xCCABBEB9
+>>>>>82		ulelong&0xCCABBEB9	>0
+>>>>>>36	ubyte		>0x80		\b, physical drive 0x%x
+#>>>>>>36	ubyte		=0x80		\b, physical drive 0x%x=0x80 (usual harddisk)
+>>>>>>36	ubyte&0x7F	>0		\b, physical drive 0x%x
+#>>>>>>36	ubyte		=0		\b, physical drive 0x%x=0 (usual floppy)
+>>>>>>37	ubyte		>0		\b, reserved 0x%x
+#>>>>>>37	ubyte		=0		\b, reserved 0x%x
+>>>>>>38	ubyte		>0x29		\b, dos < 4.0 BootSector (0x%x)
+>>>>>>38	ubyte		<0x29		\b, dos < 4.0 BootSector (0x%x)
+>>>>>>38	ubyte		=0x29
+>>>>>>>39	ulelong		x		\b, serial number 0x%x
+>>>>>>>43	string		<NO\ NAME	\b, label: "%11.11s"
+>>>>>>>43	string		>NO\ NAME	\b, label: "%11.11s"
+>>>>>>>43	string		=NO\ NAME	\b, unlabeled
+>>>>>>54	string		FAT1		\b, FAT
+>>>>>>>54	string		FAT12		\b (12 bit)
+>>>>>>>54	string		FAT16		\b (16 bit)
+# FAT32 specific
+>>>>>82		string		FAT32		\b, FAT (32 bit)
+>>>>>>36	ulelong		x		\b, sectors/FAT %u
+>>>>>>40	uleshort	>0		\b, extension flags %u
+#>>>>>>40	uleshort	=0		\b, extension flags %u
+>>>>>>42	uleshort	>0		\b, fsVersion %u
+#>>>>>>42	uleshort	=0		\b, fsVersion %u (usual)
+>>>>>>44	ulelong		>2		\b, rootdir cluster %u
+#>>>>>>44	ulelong		=2		\b, rootdir cluster %u
+#>>>>>>44	ulelong		=1		\b, rootdir cluster %u
+>>>>>>48	uleshort	>1		\b, infoSector %u
+#>>>>>>48	uleshort	=1		\b, infoSector %u (usual)
+>>>>>>48	uleshort	<1		\b, infoSector %u
+>>>>>>50	uleshort	>6		\b, Backup boot sector %u
+#>>>>>>50	uleshort	=6		\b, Backup boot sector %u (usual) 
+>>>>>>50	uleshort	<6		\b, Backup boot sector %u
+>>>>>>54	ulelong		>0		\b, reserved1 0x%x
+>>>>>>58	ulelong		>0		\b, reserved2 0x%x
+>>>>>>62	ulelong		>0		\b, reserved3 0x%x
+# same structure as FAT1X 
+>>>>>>64	ubyte		>0x80		\b, physical drive 0x%x
+#>>>>>>64	ubyte		=0x80		\b, physical drive 0x%x=80 (usual harddisk)
+>>>>>>64	ubyte&0x7F	>0		\b, physical drive 0x%x
+#>>>>>>64	ubyte		=0		\b, physical drive 0x%x=0 (usual floppy)
+>>>>>>65	ubyte		>0		\b, reserved 0x%x
+>>>>>>66	ubyte		>0x29		\b, dos < 4.0 BootSector (0x%x)
+>>>>>>66	ubyte		<0x29		\b, dos < 4.0 BootSector (0x%x)
+>>>>>>66	ubyte		=0x29
+>>>>>>>67	ulelong		x		\b, serial number 0x%x
+>>>>>>>71	string		<NO\ NAME	\b, label: "%11.11s"
+>>>>>>71	string		>NO\ NAME	\b, label: "%11.11s"
+>>>>>>71	string		=NO\ NAME	\b, unlabeled
+### FATs end
+>0x200	lelong	0x82564557		\b, BSD disklabel
+
+# Minix filesystems - Juan Cespedes <cespedes at debian.org>
+0x410	leshort		0x137f		Minix filesystem
+0x410	beshort		0x137f		Minix filesystem (big endian),
+>0x402	beshort		!0		\b, %d zones
+>0x1e	string		minix		\b, bootable
+0x410	leshort		0x138f		Minix filesystem, 30 char names
+0x410	leshort		0x2468		Minix filesystem, version 2
+0x410	leshort		0x2478		Minix filesystem, version 2, 30 char names
+
+# romfs filesystems - Juan Cespedes <cespedes at debian.org>
+0	string		-rom1fs-\0	romfs filesystem, version 1
+>8	belong	x			%d bytes,
+>16	string	x			named %s.
+
+# netboot image - Juan Cespedes <cespedes at debian.org>
+0	lelong		0x1b031336L	Netboot image,
+>4	lelong&0xFFFFFF00	0
+>>4	lelong&0x100	0x000		mode 2
+>>4	lelong&0x100	0x100		mode 3
+>4	lelong&0xFFFFFF00	!0	unknown mode
+
+0x18b	string	OS/2	OS/2 Boot Manager
+
+9564	lelong		0x00011954	Unix Fast File system (little-endian),
+>8404	string		x		last mounted on %s,
+#>9504	ledate		x		last checked at %s,
+>8224	ledate		x		last written at %s,
+>8401	byte		x		clean flag %d,
+>8228	lelong		x		number of blocks %d,
+>8232	lelong		x		number of data blocks %d,
+>8236	lelong		x		number of cylinder groups %d,
+>8240	lelong		x		block size %d,
+>8244	lelong		x		fragment size %d,
+>8252	lelong		x		minimum percentage of free blocks %d,
+>8256	lelong		x		rotational delay %dms,
+>8260	lelong		x		disk rotational speed %drps,
+>8320	lelong		0		TIME optimization
+>8320	lelong		1		SPACE optimization
+
+9564	belong		0x00011954	Unix Fast File system (big-endian),
+>7168   long		0x4c41424c	Apple UFS Volume
+>>7186  string		x		named %s,
+>>7176  belong		x		volume label version %d,
+>>7180  bedate		x		created on %s,
+>8404	string		x		last mounted on %s,
+#>9504	bedate		x		last checked at %s,
+>8224	bedate		x		last written at %s,
+>8401	byte		x		clean flag %d,
+>8228	belong		x		number of blocks %d,
+>8232	belong		x		number of data blocks %d,
+>8236	belong		x		number of cylinder groups %d,
+>8240	belong		x		block size %d,
+>8244	belong		x		fragment size %d,
+>8252	belong		x		minimum percentage of free blocks %d,
+>8256	belong		x		rotational delay %dms,
+>8260	belong		x		disk rotational speed %drps,
+>8320	belong		0		TIME optimization
+>8320	belong		1		SPACE optimization
+
+# ext2/ext3 filesystems - Andreas Dilger <adilger at turbolabs.com>
+0x438	leshort		0xEF53		Linux
+>0x44c	lelong		x		rev %d
+>0x43e	leshort		x		\b.%d
+>0x45c	lelong		^0x0000004	ext2 filesystem data
+>>0x43a	leshort		^0x0000001	(mounted or unclean)
+>0x45c	lelong		&0x0000004	ext3 filesystem data
+>>0x460	lelong		&0x0000004	(needs journal recovery)
+>0x43a	leshort		&0x0000002	(errors)
+>0x460	lelong		&0x0000001	(compressed)
+#>0x460	lelong		&0x0000002	(filetype)
+#>0x464	lelong		&0x0000001	(sparse_super)
+>0x464	lelong		&0x0000002	(large files)
+
+# SGI disk labels - Nathan Scott <nathans at debian.org>
+0	belong		0x0BE5A941	SGI disk label (volume header)
+
+# SGI XFS filesystem - Nathan Scott <nathans at debian.org>
+0	belong		0x58465342	SGI XFS filesystem data
+>0x4	belong		x		(blksz %d,
+>0x68	beshort		x		inosz %d,
+>0x64	beshort		^0x2004		v1 dirs)
+>0x64	beshort		&0x2004		v2 dirs)
+
+############################################################################
+# Minix-ST kernel floppy
+0x800	belong		0x46fc2700	Atari-ST Minix kernel image
+>19	string		\240\5\371\5\0\011\0\2\0	\b, 720k floppy
+>19	string		\320\2\370\5\0\011\0\1\0	\b, 360k floppy
+
+############################################################################
+# Hmmm, is this a better way of detecting _standard_ floppy images ?
+19	string		\320\2\360\3\0\011\0\1\0	DOS floppy 360k
+>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
+19	string		\240\5\371\3\0\011\0\2\0	DOS floppy 720k
+>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
+19	string		\100\013\360\011\0\022\0\2\0	DOS floppy 1440k
+>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
+
+19	string		\240\5\371\5\0\011\0\2\0	DOS floppy 720k, IBM
+>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
+19	string		\100\013\371\5\0\011\0\2\0	DOS floppy 1440k, mkdosfs
+>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
+
+19	string		\320\2\370\5\0\011\0\1\0	Atari-ST floppy 360k
+19	string		\240\5\371\5\0\011\0\2\0	Atari-ST floppy 720k
+
+#  Valid media descriptor bytes for MS-DOS:
+#
+#     Byte   Capacity   Media Size and Type
+#     -------------------------------------------------
+#
+#     F0     2.88 MB    3.5-inch, 2-sided, 36-sector
+#     F0     1.44 MB    3.5-inch, 2-sided, 18-sector
+#     F9     720K       3.5-inch, 2-sided, 9-sector
+#     F9     1.2 MB     5.25-inch, 2-sided, 15-sector
+#     FD     360K       5.25-inch, 2-sided, 9-sector
+#     FF     320K       5.25-inch, 2-sided, 8-sector
+#     FC     180K       5.25-inch, 1-sided, 9-sector
+#     FE     160K       5.25-inch, 1-sided, 8-sector
+#     FE     250K       8-inch, 1-sided, single-density
+#     FD     500K       8-inch, 2-sided, single-density
+#     FE     1.2 MB     8-inch, 2-sided, double-density
+#     F8     -----      Fixed disk 
+#
+#     FC     xxxK       Apricot 70x1x9 boot disk.
+#
+# Originally a bitmap:
+#  xxxxxxx0	Not two sided
+#  xxxxxxx1	Double sided
+#  xxxxxx0x	Not 8 SPT
+#  xxxxxx1x	8 SPT
+#  xxxxx0xx	Not Removable drive
+#  xxxxx1xx	Removable drive
+#  11111xxx	Must be one.
+#
+# But now it's rather random:
+#  111111xx	Low density disk
+#        00	SS, Not 8 SPT
+#        01	DS, Not 8 SPT
+#        10	SS, 8 SPT
+#        11	DS, 8 SPT
+#
+#  11111001	Double density 3� floppy disk, high density 5�
+#  11110000	High density 3� floppy disk
+#  11111000	Hard disk any format
+#
+
+# CDROM Filesystems
+32769    string    CD001     ISO 9660 CD-ROM filesystem data
+# "application id" which appears to be used as a volume label
+>32808	 string    >\0       '%s'
+>34816	 string    \000CD001\001EL\ TORITO\ SPECIFICATION    (bootable)
+37633    string    CD001     ISO 9660 CD-ROM filesystem data (raw 2352 byte sectors)
+32776    string    CDROM     High Sierra CD-ROM filesystem data
+
+# cramfs filesystem - russell at coker.com.au
+0       lelong    0x28cd3d45      Linux Compressed ROM File System data, little endian
+>4      lelong  x size %d
+>8      lelong  &1 version #2
+>8      lelong  &2 sorted_dirs
+>8      lelong  &4 hole_support
+>32     lelong  x CRC 0x%x,
+>36     lelong  x edition %d,
+>40     lelong  x %d blocks,
+>44     lelong  x %d files
+
+0       belong    0x28cd3d45      Linux Compressed ROM File System data, big endian
+>4      belong  x size %d
+>8      belong  &1 version #2
+>8      belong  &2 sorted_dirs
+>8      belong  &4 hole_support
+>32     belong  x CRC 0x%x,
+>36     belong  x edition %d,
+>40     belong  x %d blocks,
+>44     belong  x %d files
+
+# reiserfs - russell at coker.com.au
+0x10034		string	ReIsErFs	ReiserFS V3.5
+0x10034		string	ReIsEr2Fs	ReiserFS V3.6
+>0x1002c 	leshort	x		block size %d
+>0x10032	leshort	&2		(mounted or unclean)
+>0x10000	lelong	x		num blocks %d
+>0x10040	lelong	1		tea hash
+>0x10040	lelong	2		yura hash
+>0x10040	lelong	3		r5 hash
+
+# JFFS - russell at coker.com.au
+0	lelong	0x34383931	Linux Journalled Flash File system, little endian
+0	belong	0x34383931	Linux Journalled Flash File system, big endian
+
+# EST flat binary format (which isn't, but anyway)
+# From: Mark Brown <broonie at sirena.org.uk>
+0	string	ESTFBINR	EST flat binary
+
+# Aculab VoIP firmware
+# From: Mark Brown <broonie at sirena.org.uk>
+0	string	VoIP\ Startup\ and	Aculab VoIP firmware
+>35	string	x	format %s
+
+# PPCBoot image file
+# From: Mark Brown <broonie at sirena.org.uk>
+0	belong	0x27051956	PPCBoot image
+>4	string  PPCBoot
+>>12	string  x		version %s
+
+# JFFS2 file system
+0       leshort         0x1984                  Linux old jffs2 filesystem data little endian
+0       lelong          0xe0011985              Linux jffs2 filesystem data little endian
+
+#------------------------------------------------------------------------------
+# flash:	file(1) magic for Macromedia Flash file format
+#
+# See
+#
+#	http://www.macromedia.com/software/flash/open/
+#
+0	string		FWS		Macromedia Flash data,
+>3	byte		x		version %d
+0	string		CWS		Macromedia Flash data (compressed),
+>3	byte		x		version %d
+#
+# From Dave Wilson
+0	string AGD4\xbe\xb8\xbb\xcb\x00	Macromedia Freehand 9 Document
+
+#------------------------------------------------------------------------------
+# fonts:  file(1) magic for font data
+#
+0	string		FONT		ASCII vfont text
+0	short		0436		Berkeley vfont data
+0	short		017001		byte-swapped Berkeley vfont data
+
+# PostScript fonts (must precede "printer" entries), quinlan at yggdrasil.com
+0	string		%!PS-AdobeFont-1.	PostScript Type 1 font text
+>20	string		>\0			(%s)
+6	string		%!PS-AdobeFont-1.	PostScript Type 1 font program data
+
+# X11 font files in SNF (Server Natural Format) format
+0	belong		00000004		X11 SNF font data, MSB first
+0	lelong		00000004		X11 SNF font data, LSB first
+
+# X11 Bitmap Distribution Format, from Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		STARTFONT\040		X11 BDF font text
+
+# X11 fonts, from Daniel Quinlan (quinlan at yggdrasil.com)
+# PCF must come before SGI additions ("MIPSEL MIPS-II COFF" collides)
+0	string		\001fcp			X11 Portable Compiled Font data
+>12	byte		0x02			\b, LSB first
+>12	byte		0x0a			\b, MSB first
+0	string		D1.0\015		X11 Speedo font data
+
+#------------------------------------------------------------------------------
+# FIGlet fonts and controlfiles
+# From figmagic supplied with Figlet version 2.2
+# "David E. O'Brien" <obrien at FreeBSD.ORG>
+0	string		flf		FIGlet font
+>3	string		>2a		version %-2.2s
+0	string		flc		FIGlet controlfile
+>3	string		>2a		version %-2.2s
+
+# libGrx graphics lib fonts, from Albert Cahalan (acahalan at cs.uml.edu)
+# Used with djgpp (DOS Gnu C++), sometimes Linux or Turbo C++
+0	belong		0x14025919	libGrx font data,
+>8	leshort		x		%dx
+>10	leshort		x		\b%d
+>40	string		x		%s
+# Misc. DOS VGA fonts, from Albert Cahalan (acahalan at cs.uml.edu)
+0	belong		0xff464f4e	DOS code page font data collection
+7	belong		0x00454741	DOS code page font data
+7	belong		0x00564944	DOS code page font data (from Linux?)
+4098	string		DOSFONT		DOSFONT2 encrypted font data
+
+# downloadable fonts for browser (prints type) anthon at mnt.org
+0	string		PFR1		PFR1 font
+>102	string		>0		\b: %s
+
+# True Type fonts
+0	string	\000\001\000\000\000	TrueType font data
+
+0	string		\007\001\001\000Copyright\ (c)\ 199	Adobe Multiple Master font
+0	string		\012\001\001\000Copyright\ (c)\ 199	Adobe Multiple Master font
+
+# Opentype font data from Avi Bercovich
+0	string		OTTO		OpenType font data 
+
+
+#------------------------------------------------------------------------------
+# frame:  file(1) magic for FrameMaker files
+#
+# This stuff came on a FrameMaker demo tape, most of which is
+# copyright, but this file is "published" as witness the following:
+#
+0	string		\<MakerFile	FrameMaker document
+>11	string		5.5		 (5.5
+>11	string		5.0		 (5.0
+>11	string		4.0		 (4.0
+>11	string		3.0		 (3.0
+>11	string		2.0		 (2.0
+>11	string		1.0		 (1.0
+>14	byte		x		  %c)
+0	string		\<MIFFile	FrameMaker MIF (ASCII) file
+>9	string		4.0		 (4.0)
+>9	string		3.0		 (3.0)
+>9	string		2.0		 (2.0)
+>9	string		1.0		 (1.x)
+0	string		\<MakerDictionary	FrameMaker Dictionary text
+>17	string		3.0		 (3.0)
+>17	string		2.0		 (2.0)
+>17	string		1.0		 (1.x)
+0	string		\<MakerScreenFont	FrameMaker Font file
+>17	string		1.01		 (%s)
+0	string		\<MML		FrameMaker MML file
+0	string		\<BookFile	FrameMaker Book file
+>10	string		3.0		 (3.0
+>10	string		2.0		 (2.0
+>10	string		1.0		 (1.0
+>13	byte		x		  %c)
+# XXX - this book entry should be verified, if you find one, uncomment this
+#0	string		\<Book\ 	FrameMaker Book (ASCII) file
+#>6	string		3.0		 (3.0)
+#>6	string		2.0		 (2.0)
+#>6	string		1.0		 (1.0)
+0	string		\<Maker	Intermediate Print File	FrameMaker IPL file
+
+#------------------------------------------------------------------------------
+# freebsd:  file(1) magic for FreeBSD objects
+#
+# All new-style FreeBSD magic numbers are in host byte order (i.e.,
+# little-endian on x86).
+#
+# XXX - this comes from the file "freebsd" in a recent FreeBSD version of
+# "file"; it, and the NetBSD stuff in "netbsd", appear to use different
+# schemes for distinguishing between executable images, shared libraries,
+# and object files.
+#
+# FreeBSD says:
+#
+#    Regardless of whether it's pure, demand-paged, or none of the
+#    above:
+#
+#	if the entry point is < 4096, then it's a shared library if
+#	the "has run-time loader information" bit is set, and is
+#	position-independent if the "is position-independent" bit
+#	is set;
+#
+#	if the entry point is >= 4096 (or >4095, same thing), then it's
+#	an executable, and is dynamically-linked if the "has run-time
+#	loader information" bit is set.
+#
+# On x86, NetBSD says:
+#
+#    If it's neither pure nor demand-paged:
+#
+#	if it has the "has run-time loader information" bit set, it's
+#	a dynamically-linked executable;
+#
+#	if it doesn't have that bit set, then:
+#
+#	    if it has the "is position-independent" bit set, it's
+#	    position-independent;
+#
+#	    if the entry point is non-zero, it's an executable, otherwise
+#	    it's an object file.
+#
+#    If it's pure:
+#
+#	if it has the "has run-time loader information" bit set, it's
+#	a dynamically-linked executable, otherwise it's just an
+#	executable.
+#
+#    If it's demand-paged:
+#
+#	if it has the "has run-time loader information" bit set,
+#	then:
+#
+#	    if the entry point is < 4096, it's a shared library;
+#
+#	    if the entry point is = 4096 or > 4096 (i.e., >= 4096),
+#	    it's a dynamically-linked executable);
+#
+#	if it doesn't have the "has run-time loader information" bit
+#	set, then it's just an executable.
+#
+# (On non-x86, NetBSD does much the same thing, except that it uses
+# 8192 on 68K - except for "68k4k", which is presumably "68K with 4K
+# pages - SPARC, and MIPS, presumably because Sun-3's and Sun-4's
+# had 8K pages; dunno about MIPS.)
+#
+# I suspect the two will differ only in perverse and uninteresting cases
+# ("shared" libraries that aren't demand-paged and whose pages probably
+# won't actually be shared, executables with entry points <4096).
+#
+# I leave it to those more familiar with FreeBSD and NetBSD to figure out
+# what the right answer is (although using ">4095", FreeBSD-style, is
+# probably better than separately checking for "=4096" and ">4096",
+# NetBSD-style).  (The old "netbsd" file analyzed FreeBSD demand paged
+# executables using the NetBSD technique.)
+#
+0	lelong&0377777777	041400407	FreeBSD/i386
+>20	lelong			<4096
+>>3	byte&0xC0		&0x80		shared library
+>>3	byte&0xC0		0x40		PIC object
+>>3	byte&0xC0		0x00		object
+>20	lelong			>4095
+>>3	byte&0x80		0x80		dynamically linked executable
+>>3	byte&0x80		0x00		executable
+>16	lelong			>0		not stripped
+
+0	lelong&0377777777	041400410	FreeBSD/i386 pure
+>20	lelong			<4096
+>>3	byte&0xC0		&0x80		shared library
+>>3	byte&0xC0		0x40		PIC object
+>>3	byte&0xC0		0x00		object
+>20	lelong			>4095
+>>3	byte&0x80		0x80		dynamically linked executable
+>>3	byte&0x80		0x00		executable
+>16	lelong			>0		not stripped
+
+0	lelong&0377777777	041400413	FreeBSD/i386 demand paged
+>20	lelong			<4096
+>>3	byte&0xC0		&0x80		shared library
+>>3	byte&0xC0		0x40		PIC object
+>>3	byte&0xC0		0x00		object
+>20	lelong			>4095
+>>3	byte&0x80		0x80		dynamically linked executable
+>>3	byte&0x80		0x00		executable
+>16	lelong			>0		not stripped
+
+0	lelong&0377777777	041400314	FreeBSD/i386 compact demand paged
+>20	lelong			<4096
+>>3	byte&0xC0		&0x80		shared library
+>>3	byte&0xC0		0x40		PIC object
+>>3	byte&0xC0		0x00		object
+>20	lelong			>4095
+>>3	byte&0x80		0x80		dynamically linked executable
+>>3	byte&0x80		0x00		executable
+>16	lelong			>0		not stripped
+
+# XXX gross hack to identify core files
+# cores start with a struct tss; we take advantage of the following:
+# byte 7:     highest byte of the kernel stack pointer, always 0xfe
+#      8/9:   kernel (ring 0) ss value, always 0x0010
+#      10 - 27: ring 1 and 2 ss/esp, unused, thus always 0
+#      28:    low order byte of the current PTD entry, always 0 since the
+#             PTD is page-aligned
+#
+7	string	\357\020\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0	FreeBSD/i386 a.out core file
+>1039	string	>\0	from '%s'
+
+# /var/run/ld.so.hints
+# What are you laughing about?
+0	lelong			011421044151	ld.so hints file (Little Endian
+>4	lelong			>0		\b, version %d)
+>4	belong			<=0		\b)
+0	belong			011421044151	ld.so hints file (Big Endian
+>4	belong			>0		\b, version %d)
+>4	belong			<=0		\b)
+
+#
+# Files generated by FreeBSD scrshot(1)/vidcontrol(1) utilities
+#
+0	string	SCRSHOT_	scrshot(1) screenshot,
+>8	byte	x		version %d,
+>9	byte	2		%d bytes in header,
+>>10	byte	x		%d chars wide by
+>>11	byte	x		%d chars high
+
+#------------------------------------------------------------------------------
+# fsav:  file(1) magic for datafellows fsav virus definition files
+# Anthon van der Neut (anthon at mnt.org)
+0	beshort		0x1575		fsav (linux) macro virus
+>8	leshort		>0		(%d-
+>11	byte		>0		\b%02d-
+>10	byte		>0		\b%02d)
+
+# comment this out for now because it regognizes every file where
+# the eighth character is \n
+#8	byte		0x0a
+#>12	byte		0x07
+#>11	leshort		>0		fsav (linux) virus (%d-
+#>10	byte		0		\b01-
+#>10	byte		1		\b02-
+#>10	byte		2		\b03-
+#>10	byte		3		\b04-
+#>10	byte		4		\b05-
+#>10	byte		5		\b06-
+#>10	byte		6		\b07-
+#>10	byte		7		\b08-
+#>10	byte		8		\b08-
+#>10	byte		9		\b10-
+#>10	byte		10		\b11-
+#>10	byte		11		\b12-
+#>9	byte		>0		\b%02d)
+#------------------------------------------------------------------------------
+# games:  file(1) for games
+
+# Thomas M. Ott (ThMO)
+1	string	=WAD		DOOM data,
+>0	string	=I		main wad
+>0	string	=P		patch wad
+>0	byte	x		unknown junk
+
+# Fabio Bonelli <fabiobonelli at libero.it>
+# Quake II - III data files
+0       string  IDP2        	Quake II 3D Model file,
+>20     long    x               %lu skin(s),
+>8      long    x               (%lu x
+>12     long    x 		%lu),
+>40     long    x               %lu frame(s),
+>16     long    x               Frame size %lu bytes,
+>24     long  	x               %lu vertices/frame,
+>28     long    x            	%lu texture coordinates,
+>32     long    x               %lu triangles/frame
+
+0       string  IBSP            Quake
+>4      long    0x26            II Map file (BSP)
+>4      long    0x2E      	III Map file (BSP)
+
+0       string  IDS2            Quake II SP2 sprite file
+
+#---------------------------------------------------------------------------
+# Doom and Quake
+# submitted by Nicolas Patrois
+
+# DOOM
+
+0       string  IWAD    DOOM or DOOM ][ world
+0       string  PWAD    DOOM or DOOM ][ extension world
+
+0       string  \xcb\x1dBoom\xe6\xff\x03\x01    Boom or linuxdoom demo
+# some doom lmp files don't match, I've got one beginning with \x6d\x02\x01\x01
+
+24      string  LxD\ 203        Linuxdoom save
+>0      string  x       , name=%s
+>44     string  x       , world=%s
+
+# Quake
+
+0       string  PACK    Quake I or II world or extension
+
+#0       string  -1\x0a  Quake I demo
+#>30     string  x        version %.4s
+#>61     string  x        level %s       
+
+#0       string  5\x0a   Quake I save
+
+# The levels
+
+# Quake 1
+
+0	string	5\x0aIntroduction             Quake I save: start Introduction
+0	string	5\x0athe_Slipgate_Complex     Quake I save: e1m1 The slipgate complex
+0	string	5\x0aCastle_of_the_Damned     Quake I save: e1m2 Castle of the damned
+0	string	5\x0athe_Necropolis           Quake I save: e1m3 The necropolis
+0	string	5\x0athe_Grisly_Grotto        Quake I save: e1m4 The grisly grotto
+0	string	5\x0aZiggurat_Vertigo         Quake I save: e1m8 Ziggurat vertigo (secret)
+0	string	5\x0aGloom_Keep               Quake I save: e1m5 Gloom keep
+0	string	5\x0aThe_Door_To_Chthon       Quake I save: e1m6 The door to Chthon
+0	string	5\x0aThe_House_of_Chthon      Quake I save: e1m7 The house of Chthon
+0	string	5\x0athe_Installation         Quake I save: e2m1 The installation
+0	string	5\x0athe_Ogre_Citadel         Quake I save: e2m2 The ogre citadel
+0	string	5\x0athe_Crypt_of_Decay       Quake I save: e2m3 The crypt of decay (dopefish lives!)
+0	string	5\x0aUnderearth               Quake I save: e2m7 Underearth (secret)
+0	string	5\x0athe_Ebon_Fortress        Quake I save: e2m4 The ebon fortress
+0	string	5\x0athe_Wizard's_Manse       Quake I save: e2m5 The wizard's manse
+0	string	5\x0athe_Dismal_Oubliette     Quake I save: e2m6 The dismal oubliette
+0	string	5\x0aTermination_Central      Quake I save: e3m1 Termination central
+0	string	5\x0aVaults_of_Zin            Quake I save: e3m2 Vaults of Zin
+0	string	5\x0athe_Tomb_of_Terror       Quake I save: e3m3 The tomb of terror
+0	string	5\x0aSatan's_Dark_Delight     Quake I save: e3m4 Satan's dark delight
+0	string	5\x0athe_Haunted_Halls        Quake I save: e3m7 The haunted halls (secret)
+0	string	5\x0aWind_Tunnels             Quake I save: e3m5 Wind tunnels
+0	string	5\x0aChambers_of_Torment      Quake I save: e3m6 Chambers of torment
+0	string	5\x0athe_Sewage_System        Quake I save: e4m1 The sewage system
+0	string	5\x0aThe_Tower_of_Despair     Quake I save: e4m2 The tower of despair
+0	string	5\x0aThe_Elder_God_Shrine     Quake I save: e4m3 The elder god shrine
+0	string	5\x0athe_Palace_of_Hate       Quake I save: e4m4 The palace of hate
+0	string	5\x0aHell's_Atrium            Quake I save: e4m5 Hell's atrium
+0	string	5\x0athe_Nameless_City        Quake I save: e4m8 The nameless city (secret)
+0	string	5\x0aThe_Pain_Maze            Quake I save: e4m6 The pain maze
+0	string	5\x0aAzure_Agony              Quake I save: e4m7 Azure agony
+0	string	5\x0aShub-Niggurath's_Pit     Quake I save: end Shub-Niggurath's pit
+
+# Quake DeathMatch levels
+
+0	string	5\x0aPlace_of_Two_Deaths	 Quake I save: dm1 Place of two deaths
+0	string	5\x0aClaustrophobopolis		 Quake I save: dm2 Claustrophobopolis
+0	string	5\x0aThe_Abandoned_Base		 Quake I save: dm3 The abandoned base
+0	string	5\x0aThe_Bad_Place		 Quake I save: dm4 The bad place
+0	string	5\x0aThe_Cistern		 Quake I save: dm5 The cistern
+0	string	5\x0aThe_Dark_Zone		 Quake I save: dm6 The dark zone
+
+# Scourge of Armagon
+
+0	string	5\x0aCommand_HQ               Quake I save: start Command HQ
+0	string	5\x0aThe_Pumping_Station      Quake I save: hip1m1 The pumping station
+0	string	5\x0aStorage_Facility         Quake I save: hip1m2 Storage facility
+0	string	5\x0aMilitary_Complex         Quake I save: hip1m5 Military complex (secret)
+0	string	5\x0athe_Lost_Mine            Quake I save: hip1m3 The lost mine
+0	string	5\x0aResearch_Facility        Quake I save: hip1m4 Research facility
+0	string	5\x0aAncient_Realms           Quake I save: hip2m1 Ancient realms
+0	string	5\x0aThe_Gremlin's_Domain     Quake I save: hip2m6 The gremlin's domain (secret)
+0	string	5\x0aThe_Black_Cathedral      Quake I save: hip2m2 The black cathedral
+0	string	5\x0aThe_Catacombs            Quake I save: hip2m3 The catacombs
+0	string	5\x0athe_Crypt__              Quake I save: hip2m4 The crypt
+0	string	5\x0aMortum's_Keep            Quake I save: hip2m5 Mortum's keep
+0	string	5\x0aTur_Torment              Quake I save: hip3m1 Tur torment
+0	string	5\x0aPandemonium              Quake I save: hip3m2 Pandemonium
+0	string	5\x0aLimbo                    Quake I save: hip3m3 Limbo
+0	string	5\x0athe_Edge_of_Oblivion     Quake I save: hipdm1 The edge of oblivion (secret)
+0	string	5\x0aThe_Gauntlet             Quake I save: hip3m4 The gauntlet
+0	string	5\x0aArmagon's_Lair           Quake I save: hipend Armagon's lair
+
+# Malice
+
+0	string	5\x0aThe_Academy      Quake I save: start The academy
+0	string	5\x0aThe_Lab          Quake I save: d1 The lab
+0	string	5\x0aArea_33          Quake I save: d1b Area 33
+0	string	5\x0aSECRET_MISSIONS  Quake I save: d3b Secret missions
+0	string	5\x0aThe_Hospital     Quake I save: d10 The hospital (secret)
+0	string	5\x0aThe_Genetics_Lab Quake I save: d11 The genetics lab (secret)
+0	string	5\x0aBACK_2_MALICE    Quake I save: d4b Back to Malice
+0	string	5\x0aArea44           Quake I save: d1c Area 44
+0	string	5\x0aTakahiro_Towers  Quake I save: d2 Takahiro towers
+0	string	5\x0aA_Rat's_Life     Quake I save: d3 A rat's life
+0	string	5\x0aInto_The_Flood   Quake I save: d4 Into the flood
+0	string	5\x0aThe_Flood        Quake I save: d5 The flood
+0	string	5\x0aNuclear_Plant    Quake I save: d6 Nuclear plant
+0	string	5\x0aThe_Incinerator_Plant    Quake I save: d7 The incinerator plant
+0	string	5\x0aThe_Foundry              Quake I save: d7b The foundry
+0	string	5\x0aThe_Underwater_Base      Quake I save: d8 The underwater base
+0	string	5\x0aTakahiro_Base            Quake I save: d9 Takahiro base
+0	string	5\x0aTakahiro_Laboratories    Quake I save: d12 Takahiro laboratories
+0	string	5\x0aStayin'_Alive    Quake I save: d13 Stayin' alive
+0	string	5\x0aB.O.S.S._HQ      Quake I save: d14 B.O.S.S. HQ
+0	string	5\x0aSHOWDOWN!        Quake I save: d15 Showdown!
+
+# Malice DeathMatch levels
+
+0	string	5\x0aThe_Seventh_Precinct	 Quake I save: ddm1 The seventh precinct
+0	string	5\x0aSub_Station		 Quake I save: ddm2 Sub station
+0	string	5\x0aCrazy_Eights!		 Quake I save: ddm3 Crazy eights!
+0	string	5\x0aEast_Side_Invertationa	 Quake I save: ddm4 East side invertationa
+0	string	5\x0aSlaughterhouse		 Quake I save: ddm5 Slaughterhouse
+0	string	5\x0aDOMINO			 Quake I save: ddm6 Domino
+0	string	5\x0aSANDRA'S_LADDER		 Quake I save: ddm7 Sandra's ladder
+
+
+0	string	MComprHD	MAME CHD compressed hard disk image,
+>12	belong	x		version %lu
+
+#------------------------------------------------------------------------------
+# GEOS files (Vidar Madsen, vidar at gimp.org)
+# semi-commonly used in embedded and handheld systems.
+0	belong	0xc745c153	GEOS
+>40	byte	1	executable
+>40	byte	2	VMFile
+>40	byte	3	binary
+>40	byte	4	directory label
+>40	byte	<1	unknown
+>40	byte	>4	unknown
+>4	string	>\0	\b, name "%s"
+#>44	short	x	\b, version %d
+#>46	short	x	\b.%d
+#>48	short	x	\b, rev %d
+#>50	short	x	\b.%d
+#>52	short	x	\b, proto %d
+#>54	short	x	\br%d
+#>168	string	>\0	\b, copyright "%s"
+
+#------------------------------------------------------------------------------
+# gcc:  file(1) magic for GCC special files
+#
+0	string		gpch		GCC precompiled header
+
+# The version field is annoying.  It's 3 characters, not zero-terminated.
+>5	byte		x			(version %c
+>6	byte		x			\b%c
+>7	byte		x			\b%c)
+
+# 67 = 'C', 111 = 'o', 43 = '+', 79 = 'O'
+>4	byte		67			for C
+>4	byte		111			for Objective C
+>4	byte		43			for C++
+>4	byte		79			for Objective C++
+#------------------------------------------------------------------------------
+# GIMP Gradient: file(1) magic for the GIMP's gradient data files
+# by Federico Mena <federico at nuclecu.unam.mx>
+
+0       string          GIMP\ Gradient  GIMP gradient data
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the XCF image format used in the GIMP developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega at vt.edu)
+
+0	string		gimp\ xcf	GIMP XCF image data,
+>9	string		file		version 0,
+>9	string		v		version
+>>10	string		>\0		%s,
+>14	belong		x		%lu x
+>18	belong		x		%lu,
+>22     belong          0               RGB Color
+>22     belong          1               Greyscale
+>22     belong          2               Indexed Color
+>22	belong		>2		Unknown Image Type.
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the patterns used in the GIMP, developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega at vt.edu)
+
+20      string          GPAT            GIMP pattern data,
+>24     string          x               %s
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the brushes used in the GIMP, developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega at vt.edu)
+
+20      string          GIMP            GIMP brush data
+#
+# GNU nlsutils message catalog file format
+#
+0	string		\336\22\4\225	GNU message catalog (little endian),
+>4	lelong		x		revision %d,
+>8	lelong		x		%d messages
+0	string		\225\4\22\336	GNU message catalog (big endian),
+>4	belong		x		revision %d,
+>8	belong		x		%d messages
+# message catalogs, from Mitchum DSouza <m.dsouza at mrc-apu.cam.ac.uk>
+0	string		*nazgul*	Nazgul style compiled message catalog
+>8	lelong		>0		\b, version %ld
+# GnuPG
+# The format is very similar to pgp
+0	string          \001gpg                 GPG key trust database
+>4	byte            x                       version %d
+0       beshort         0x9901                  GPG key public ring
+# This magic is not particularly good, as the keyrings don't have true
+# magic. Nevertheless, it covers many keyrings.
+
+# Gnumeric spreadsheet
+# This entry is only semi-helpful, as Gnumeric compresses its files, so
+# they will ordinarily reported as "compressed", but at least -z helps
+39      string          =<gmr:Workbook           Gnumeric spreadsheet
+
+#------------------------------------------------------------------------------
+# gcc:  file(1) magic for GCC special files
+#
+0       string          gpch            GCC precompiled header
+
+# The version field is annoying.  It's 3 characters, not zero-terminated.
+>5      byte            x                       (version %c
+>6      byte            x                       \b%c
+>7      byte            x                       \b%c)
+
+# 67 = 'C', 111 = 'o', 43 = '+', 79 = 'O'
+>4      byte            67                      for C
+>4      byte            111                     for Objective C
+>4      byte            43                      for C++
+>4      byte            79                      for Objective C++
+
+
+
+#------------------------------------------------------------------------------
+# ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
+#
+# ACE/gr binary
+0	string	\000\000\0001\000\000\0000\000\000\0000\000\000\0002\000\000\0000\000\000\0000\000\000\0003		old ACE/gr binary file
+>39	byte	>0			- version %c
+# ACE/gr ascii
+0	string	#\ xvgr\ parameter\ file	ACE/gr ascii file
+0	string	#\ xmgr\ parameter\ file	ACE/gr ascii file
+0	string	#\ ACE/gr\ parameter\ file	ACE/gr ascii file
+# Grace projects
+0	string	#\ Grace\ project\ file		Grace project file
+>23	string	@version\  			(version
+>>32	byte	>0 				%c
+>>33	string	>\0 				\b.%.2s
+>>35	string	>\0 				\b.%.2s)
+# ACE/gr fit description files
+0	string	#\ ACE/gr\ fit\ description\ 	ACE/gr fit description file
+# end of ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
+
+#------------------------------------------------------------------------------
+# gringotts:  file(1) magic for Gringotts
+# http://devel.pluto.linux.it/projects/Gringotts/
+# author: Germano Rizzo <mano at pluto.linux.it>
+#GRG3????Y
+0	string	GRG		Gringotts data file
+#file format 1
+>3	string		1		v.1, MCRYPT S2K, SERPENT crypt, SHA-256 hash, ZLib lvl.9
+#file format 2
+>3	string		2		v.2, MCRYPT S2K, 
+>>8	byte&0x70	0x00		RIJNDAEL-128 crypt,
+>>8	byte&0x70	0x10		SERPENT crypt,
+>>8	byte&0x70	0x20		TWOFISH crypt, 
+>>8	byte&0x70	0x30		CAST-256 crypt,
+>>8	byte&0x70	0x40		SAFER+ crypt,
+>>8	byte&0x70	0x50		LOKI97 crypt,
+>>8	byte&0x70	0x60		3DES crypt,
+>>8	byte&0x70	0x70		RIJNDAEL-256 crypt,
+>>8	byte&0x08	0x00		SHA1 hash,
+>>8	byte&0x08	0x08		RIPEMD-160 hash,
+>>8	byte&0x04	0x00		ZLib
+>>8	byte&0x04	0x04		BZip2
+>>8	byte&0x03	0x00		lvl.0
+>>8	byte&0x03	0x01		lvl.3
+>>8	byte&0x03	0x02		lvl.6
+>>8	byte&0x03	0x03		lvl.9
+#file format 3
+>3	string		3		v.3, OpenPGP S2K, 
+>>8	byte&0x70	0x00		RIJNDAEL-128 crypt,
+>>8	byte&0x70	0x10		SERPENT crypt,
+>>8	byte&0x70	0x20		TWOFISH crypt, 
+>>8	byte&0x70	0x30		CAST-256 crypt,
+>>8	byte&0x70	0x40		SAFER+ crypt,
+>>8	byte&0x70	0x50		LOKI97 crypt,
+>>8	byte&0x70	0x60		3DES crypt,
+>>8	byte&0x70	0x70		RIJNDAEL-256 crypt,
+>>8	byte&0x08	0x00		SHA1 hash,
+>>8	byte&0x08	0x08		RIPEMD-160 hash,
+>>8	byte&0x04	0x00		ZLib
+>>8	byte&0x04	0x04		BZip2
+>>8	byte&0x03	0x00		lvl.0
+>>8	byte&0x03	0x01		lvl.3
+>>8	byte&0x03	0x02		lvl.6
+>>8	byte&0x03	0x03		lvl.9
+#file format >3
+>3	string		>3		v.%.1s (unknown details)
+
+#------------------------------------------------------------------------------
+# Hierarchical Data Format, used to facilitate scientific data exchange
+# specifications at http://hdf.ncsa.uiuc.edu/
+
+0	belong		0x0e031301	Hierarchical Data Format (version 4) data
+0	string		\211HDF\r\n\032	Hierarchical Data Format (version 5) data
+
+#------------------------------------------------------------------------------
+# hitach-sh: file(1) magic for Hitachi Super-H
+#
+# Super-H COFF
+#
+0	beshort		0x0500		Hitachi SH big-endian COFF
+>18	beshort&0x0002	=0x0000		object
+>18	beshort&0x0002	=0x0002		executable
+>18	beshort&0x0008	=0x0008		\b, stripped
+>18	beshort&0x0008	=0x0000		\b, not stripped
+#
+0	leshort		0x0550		Hitachi SH little-endian COFF
+>18	leshort&0x0002	=0x0000		object
+>18	leshort&0x0002	=0x0002		executable
+>18	leshort&0x0008	=0x0008		\b, stripped
+>18	leshort&0x0008	=0x0000		\b, not stripped
+
+
+#------------------------------------------------------------------------------
+# hp:  file(1) magic for Hewlett Packard machines (see also "printer")
+#
+# XXX - somebody should figure out whether any byte order needs to be
+# applied to the "TML" stuff; I'm assuming the Apollo stuff is
+# big-endian as it was mostly 68K-based.
+#
+# I think the 500 series was the old stack-based machines, running a
+# UNIX environment atop the "SUN kernel"; dunno whether it was
+# big-endian or little-endian.
+#
+# Daniel Quinlan (quinlan at yggdrasil.com): hp200 machines are 68010 based;
+# hp300 are 68020+68881 based; hp400 are also 68k.  The following basic
+# HP magic is useful for reference, but using "long" magic is a better
+# practice in order to avoid collisions.
+#
+# Guy Harris (guy at netapp.com): some additions to this list came from
+# HP-UX 10.0's "/usr/include/sys/unistd.h" (68030, 68040, PA-RISC 1.1,
+# 1.2, and 2.0).  The 1.2 and 2.0 stuff isn't in the HP-UX 10.0
+# "/etc/magic", though, except for the "archive file relocatable library"
+# stuff, and the 68030 and 68040 stuff isn't there at all - are they not
+# used in executables, or have they just not yet updated "/etc/magic"
+# completely?
+#
+# 0	beshort		200		hp200 (68010) BSD binary
+# 0	beshort		300		hp300 (68020+68881) BSD binary
+# 0	beshort		0x20c		hp200/300 HP-UX binary
+# 0	beshort		0x20d		hp400 (68030) HP-UX binary
+# 0	beshort		0x20e		hp400 (68040?) HP-UX binary
+# 0	beshort		0x20b		PA-RISC1.0 HP-UX binary
+# 0	beshort		0x210		PA-RISC1.1 HP-UX binary
+# 0	beshort		0x211		PA-RISC1.2 HP-UX binary
+# 0	beshort		0x214		PA-RISC2.0 HP-UX binary
+
+#
+# The "misc" stuff needs a byte order; the archives look suspiciously
+# like the old 177545 archives (0xff65 = 0177545).
+#
+#### Old Apollo stuff
+0	beshort		0627		Apollo m68k COFF executable
+>18	beshort		^040000		not stripped
+>22	beshort		>0		- version %ld
+0	beshort		0624		apollo a88k COFF executable
+>18	beshort		^040000		not stripped
+>22	beshort		>0		- version %ld
+0       long            01203604016     TML 0123 byte-order format
+0       long            01702407010     TML 1032 byte-order format
+0       long            01003405017     TML 2301 byte-order format
+0       long            01602007412     TML 3210 byte-order format
+#### PA-RISC 1.1
+0	belong 		0x02100106	PA-RISC1.1 relocatable object
+0	belong 		0x02100107	PA-RISC1.1 executable
+>168	belong		&0x00000004	dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x02100108	PA-RISC1.1 shared executable
+>168	belong&0x4	0x4		dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x0210010b	PA-RISC1.1 demand-load executable
+>168	belong&0x4	0x4		dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x0210010e	PA-RISC1.1 shared library
+>96	belong		>0		- not stripped
+
+0	belong 		0x0210010d	PA-RISC1.1 dynamic load library
+>96	belong		>0		- not stripped
+
+#### PA-RISC 2.0
+0	belong		0x02140106	PA-RISC2.0 relocatable object
+
+0       belong		0x02140107	PA-RISC2.0 executable
+>168	belong		&0x00000004	dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0       belong		0x02140108	PA-RISC2.0 shared executable
+>168	belong		&0x00000004	dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0       belong		0x0214010b	PA-RISC2.0 demand-load executable
+>168	belong		&0x00000004	dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0       belong		0x0214010e	PA-RISC2.0 shared library
+>96	belong		>0		- not stripped
+
+0       belong		0x0214010d	PA-RISC2.0 dynamic load library
+>96	belong		>0		- not stripped
+
+#### 800
+0	belong 		0x020b0106	PA-RISC1.0 relocatable object
+
+0	belong 		0x020b0107	PA-RISC1.0 executable
+>168	belong&0x4	0x4		dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x020b0108	PA-RISC1.0 shared executable
+>168	belong&0x4	0x4		dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x020b010b	PA-RISC1.0 demand-load executable
+>168	belong&0x4	0x4		dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x020b010e	PA-RISC1.0 shared library
+>96	belong		>0		- not stripped
+
+0	belong 		0x020b010d	PA-RISC1.0 dynamic load library
+>96	belong		>0		- not stripped
+
+0	belong		0x213c6172	archive file
+>68	belong 		0x020b0619	- PA-RISC1.0 relocatable library
+>68	belong	 	0x02100619	- PA-RISC1.1 relocatable library
+>68	belong 		0x02110619	- PA-RISC1.2 relocatable library
+>68	belong 		0x02140619	- PA-RISC2.0 relocatable library
+
+#### 500
+0	long		0x02080106	HP s500 relocatable executable
+>16	long		>0		- version %ld
+
+0	long		0x02080107	HP s500 executable
+>16	long		>0		- version %ld
+
+0	long		0x02080108	HP s500 pure executable
+>16	long		>0		- version %ld
+
+#### 200
+0	belong 		0x020c0108	HP s200 pure executable
+>4	beshort		>0		- version %ld
+>8	belong		&0x80000000	save fp regs
+>8	belong		&0x40000000	dynamically linked
+>8	belong		&0x20000000	debuggable
+>36	belong		>0		not stripped
+
+0	belong		0x020c0107	HP s200 executable
+>4	beshort		>0		- version %ld
+>8	belong		&0x80000000	save fp regs
+>8	belong		&0x40000000	dynamically linked
+>8	belong		&0x20000000	debuggable
+>36	belong		>0		not stripped
+
+0	belong		0x020c010b	HP s200 demand-load executable
+>4	beshort		>0		- version %ld
+>8	belong		&0x80000000	save fp regs
+>8	belong		&0x40000000	dynamically linked
+>8	belong		&0x20000000	debuggable
+>36	belong		>0		not stripped
+
+0	belong		0x020c0106	HP s200 relocatable executable
+>4	beshort		>0		- version %ld
+>6	beshort		>0		- highwater %d
+>8	belong		&0x80000000	save fp regs
+>8	belong		&0x20000000	debuggable
+>8	belong		&0x10000000	PIC
+
+0	belong 		0x020a0108	HP s200 (2.x release) pure executable
+>4	beshort		>0		- version %ld
+>36	belong		>0		not stripped
+
+0	belong		0x020a0107	HP s200 (2.x release) executable
+>4	beshort		>0		- version %ld
+>36	belong		>0		not stripped
+
+0	belong		0x020c010e	HP s200 shared library
+>4	beshort		>0		- version %ld
+>6	beshort		>0		- highwater %d
+>36	belong		>0		not stripped
+
+0	belong		0x020c010d	HP s200 dynamic load library
+>4	beshort		>0		- version %ld
+>6	beshort		>0		- highwater %d
+>36	belong		>0		not stripped
+
+#### MISC
+0	long		0x0000ff65	HP old archive
+0	long		0x020aff65	HP s200 old archive
+0	long		0x020cff65	HP s200 old archive
+0	long		0x0208ff65	HP s500 old archive
+
+0	long		0x015821a6	HP core file
+
+0	long		0x4da7eee8	HP-WINDOWS font
+>8	byte		>0		- version %ld
+0	string		Bitmapfile	HP Bitmapfile
+
+0	string		IMGfile	CIS 	compimg HP Bitmapfile
+# XXX - see "lif"
+#0	short		0x8000		lif file
+0	long		0x020c010c	compiled Lisp
+
+0	string		msgcat01	HP NLS message catalog,
+>8	long		>0		%d messages
+
+# addendum to /etc/magic with HP-48sx file-types by phk at data.fls.dk 1jan92
+0	string		HPHP48-		HP48 binary
+>7	byte		>0		- Rev %c
+>8	beshort		0x1129		(ADR)
+>8	beshort		0x3329		(REAL)
+>8	beshort		0x5529		(LREAL)
+>8	beshort		0x7729		(COMPLX)
+>8	beshort		0x9d29		(LCOMPLX)
+>8	beshort		0xbf29		(CHAR)
+>8	beshort		0xe829		(ARRAY)
+>8	beshort		0x0a2a		(LNKARRAY)
+>8	beshort		0x2c2a		(STRING)
+>8	beshort		0x4e2a		(HXS)
+>8	beshort		0x742a		(LIST)
+>8	beshort		0x962a		(DIR)
+>8	beshort		0xb82a		(ALG)
+>8	beshort		0xda2a		(UNIT)
+>8	beshort		0xfc2a		(TAGGED)
+>8	beshort		0x1e2b		(GROB)
+>8	beshort		0x402b		(LIB)
+>8	beshort		0x622b		(BACKUP)
+>8	beshort		0x882b		(LIBDATA)
+>8	beshort		0x9d2d		(PROG)
+>8	beshort		0xcc2d		(CODE)
+>8	beshort		0x482e		(GNAME)
+>8	beshort		0x6d2e		(LNAME)
+>8	beshort		0x922e		(XLIB)
+0	string		%%HP:		HP48 text
+>6	string		T(0)		- T(0)
+>6	string		T(1)		- T(1)
+>6	string		T(2)		- T(2)
+>6	string		T(3)		- T(3)
+>10	string		A(D)		A(D)
+>10	string		A(R)		A(R)
+>10	string		A(G)		A(G)
+>14	string		F(.)		F(.);
+>14	string		F(,)		F(,);
+
+# hpBSD magic numbers
+0	beshort		200		hp200 (68010) BSD
+>2	beshort		0407		impure binary
+>2	beshort		0410		read-only binary
+>2	beshort		0413		demand paged binary
+0	beshort		300		hp300 (68020+68881) BSD
+>2	beshort		0407		impure binary
+>2	beshort		0410		read-only binary
+>2	beshort		0413		demand paged binary
+#
+# From David Gero <dgero at nortelnetworks.com>
+# HP-UX 10.20 core file format from /usr/include/sys/core.h
+# Unfortunately, HP-UX uses corehead blocks without specifying the order
+# There are four we care about:
+#     CORE_KERNEL, which starts with the string "HP-UX"
+#     CORE_EXEC, which contains the name of the command
+#     CORE_PROC, which contains the signal number that caused the core dump
+#     CORE_FORMAT, which contains the version of the core file format (== 1)
+# The only observed order in real core files is KERNEL, EXEC, FORMAT, PROC
+# but we include all 6 variations of the order of the first 3, and
+# assume that PROC will always be last
+# Order 1: KERNEL, EXEC, FORMAT, PROC
+0x10		string	HP-UX
+>0		belong	2
+>>0xC		belong	0x3C
+>>>0x4C		belong	0x100
+>>>>0x58	belong	0x44
+>>>>>0xA0	belong	1
+>>>>>>0xAC	belong	4
+>>>>>>>0xB0	belong	1
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0x90	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+# Order 2: KERNEL, FORMAT, EXEC, PROC
+>>>0x4C		belong	1
+>>>>0x58	belong	4
+>>>>>0x5C	belong	1
+>>>>>>0x60	belong	0x100
+>>>>>>>0x6C	belong	0x44
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0xA4	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+# Order 3: FORMAT, KERNEL, EXEC, PROC
+0x24		string	HP-UX
+>0		belong	1
+>>0xC		belong	4
+>>>0x10		belong	1
+>>>>0x14	belong	2
+>>>>>0x20	belong	0x3C
+>>>>>>0x60	belong	0x100
+>>>>>>>0x6C	belong	0x44
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0xA4	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+# Order 4: EXEC, KERNEL, FORMAT, PROC
+0x64		string	HP-UX
+>0		belong	0x100
+>>0xC		belong	0x44
+>>>0x54		belong	2
+>>>>0x60	belong	0x3C
+>>>>>0xA0	belong	1
+>>>>>>0xAC	belong	4
+>>>>>>>0xB0	belong	1
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0x44	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+# Order 5: FORMAT, EXEC, KERNEL, PROC
+0x78		string	HP-UX
+>0		belong	1
+>>0xC		belong	4
+>>>0x10		belong	1
+>>>>0x14	belong	0x100
+>>>>>0x20	belong	0x44
+>>>>>>0x68	belong	2
+>>>>>>>0x74	belong	0x3C
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0x58	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+# Order 6: EXEC, FORMAT, KERNEL, PROC
+>0		belong	0x100
+>>0xC		belong	0x44
+>>>0x54		belong	1
+>>>>0x60	belong	4
+>>>>>0x64	belong	1
+>>>>>>0x68	belong	2
+>>>>>>>0x74	belong	0x2C
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0x44	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+
+# From: AMAKAWA Shuhei <sa264 at cam.ac.uk>
+0	string	HPHP49-			HP49 binary
+
+
+#------------------------------------------------------------------------------
+# human68k:  file(1) magic for Human68k (X680x0 DOS) binary formats
+# Magic too short!
+#0		string	HU		Human68k
+#>68		string	LZX		LZX compressed
+#>>72		string	>\0		(version %s)
+#>(8.L+74)	string	LZX		LZX compressed
+#>>(8.L+78)	string	>\0		(version %s)
+#>60		belong	>0		binded
+#>(8.L+66)	string	#HUPAIR		hupair
+#>0		string	HU		X executable
+#>(8.L+74)	string	#LIBCV1		- linked PD LIBC ver 1
+#>4		belong	>0		- base address 0x%x
+#>28		belong	>0		not stripped
+#>32		belong	>0		with debug information
+#0		beshort	0x601a		Human68k Z executable
+#0		beshort	0x6000		Human68k object file
+#0		belong	0xd1000000	Human68k ar binary archive
+#0		belong	0xd1010000	Human68k ar ascii archive
+#0		beshort	0x0068		Human68k lib archive
+#4		string	LZX		Human68k LZX compressed
+#>8		string	>\0		(version %s)
+#>4		string	LZX		R executable
+#2		string	#HUPAIR		Human68k hupair R executable
+
+#------------------------------------------------------------------------------
+# ibm370:  file(1) magic for IBM 370 and compatibles.
+#
+# "ibm370" said that 0x15d == 0535 was "ibm 370 pure executable".
+# What the heck *is* "USS/370"?
+# AIX 4.1's "/etc/magic" has
+#
+#	0	short		0535		370 sysV executable 
+#	>12	long		>0		not stripped
+#	>22	short		>0		- version %d
+#	>30	long		>0		- 5.2 format
+#	0	short		0530		370 sysV pure executable 
+#	>12	long		>0		not stripped
+#	>22	short		>0		- version %d
+#	>30	long		>0		- 5.2 format
+#
+# instead of the "USS/370" versions of the same magic numbers.
+#
+0	beshort		0537		370 XA sysV executable 
+>12	belong		>0		not stripped
+>22	beshort		>0		- version %d
+>30	belong		>0		- 5.2 format
+0	beshort		0532		370 XA sysV pure executable 
+>12	belong		>0		not stripped
+>22	beshort		>0		- version %d
+>30	belong		>0		- 5.2 format
+0	beshort		054001		370 sysV pure executable
+>12	belong		>0		not stripped
+0	beshort		055001		370 XA sysV pure executable
+>12	belong		>0		not stripped
+0	beshort		056401		370 sysV executable
+>12	belong		>0		not stripped
+0	beshort		057401		370 XA sysV executable
+>12	belong		>0		not stripped
+0       beshort		0531		SVR2 executable (Amdahl-UTS)
+>12	belong		>0		not stripped
+>24     belong		>0		- version %ld
+0	beshort		0534		SVR2 pure executable (Amdahl-UTS)
+>12	belong		>0		not stripped
+>24	belong		>0		- version %ld
+0	beshort		0530		SVR2 pure executable (USS/370)
+>12	belong		>0		not stripped
+>24	belong		>0		- version %ld
+0	beshort		0535		SVR2 executable (USS/370)
+>12	belong		>0		not stripped
+>24	belong		>0		- version %ld
+
+#------------------------------------------------------------------------------
+# ibm6000:  file(1) magic for RS/6000 and the RT PC.
+#
+0	beshort		0x01df		executable (RISC System/6000 V3.1) or obj module
+>12	belong		>0		not stripped
+# Breaks sun4 statically linked execs.
+#0      beshort		0x0103		executable (RT Version 2) or obj module
+#>2	byte		0x50		pure
+#>28	belong		>0		not stripped
+#>6	beshort		>0		- version %ld
+0	beshort		0x0104		shared library
+0	beshort		0x0105		ctab data
+0	beshort		0xfe04		structured file
+0	string		0xabcdef	AIX message catalog
+0	belong		0x000001f9	AIX compiled message catalog
+0	string		\<aiaff>	archive
+0	string		\<bigaf>	archive (big format)
+
+
+#------------------------------------------------------------------------------
+# iff:	file(1) magic for Interchange File Format (see also "audio" & "images")
+#
+# Daniel Quinlan (quinlan at yggdrasil.com) -- IFF was designed by Electronic
+# Arts for file interchange.  It has also been used by Apple, SGI, and
+# especially Commodore-Amiga.
+#
+# IFF files begin with an 8 byte FORM header, followed by a 4 character
+# FORM type, which is followed by the first chunk in the FORM.
+
+0	string		FORM		IFF data
+#>4	belong		x		\b, FORM is %d bytes long
+# audio formats
+>8	string		AIFF		\b, AIFF audio
+>8	string		AIFC		\b, AIFF-C compressed audio
+>8	string		8SVX		\b, 8SVX 8-bit sampled sound voice
+>8	string		SAMP		\b, SAMP sampled audio
+>8	string		DTYP		\b, DTYP datatype description
+>8	string		PTCH		\b, PTCH binary patch
+# image formats
+>8	string		ILBMBMHD	\b, ILBM interleaved image
+>>20	beshort		x		\b, %d x
+>>22	beshort		x		%d
+>8	string		RGBN		\b, RGBN 12-bit RGB image
+>8	string		RGB8		\b, RGB8 24-bit RGB image
+>8	string		DR2D		\b, DR2D 2-D object
+>8	string		TDDD		\b, TDDD 3-D rendering
+# other formats
+>8	string		FTXT		\b, FTXT formatted text
+
+#------------------------------------------------------------------------------
+# images:  file(1) magic for image formats (see also "iff")
+#
+# originally from jef at helios.ee.lbl.gov (Jef Poskanzer),
+# additions by janl at ifi.uio.no as well as others. Jan also suggested
+# merging several one- and two-line files into here.
+#
+# little magic: PCX (first byte is 0x0a)
+
+# Targa - matches `povray', `ppmtotga' and `xv' outputs
+# by Philippe De Muyter <phdm at macqel.be>
+# at 2, byte ImgType must be 1, 2, 3, 9, 10 or 11
+# at 1, byte CoMapType must be 1 if ImgType is 1 or 9, 0 otherwise
+# at 3, leshort Index is 0 for povray, ppmtotga and xv outputs
+# `xv' recognizes only a subset of the following (RGB with pixelsize = 24)
+# `tgatoppm' recognizes a superset (Index may be anything)
+1	belong&0xfff7ffff	0x01010000	Targa image data - Map
+>2	byte&8			8		- RLE
+>12	leshort			>0		%hd x
+>14	leshort			>0		%hd
+1	belong&0xfff7ffff	0x00020000	Targa image data - RGB
+>2	byte&8			8		- RLE
+>12	leshort			>0		%hd x
+>14	leshort			>0		%hd
+1	belong&0xfff7ffff	0x00030000	Targa image data - Mono
+>2	byte&8			8		- RLE
+>12	leshort			>0		%hd x
+>14	leshort			>0		%hd
+
+# PBMPLUS images
+# The next byte following the magic is always whitespace.
+0	string		P1		Netpbm PBM image text
+0	string		P2		Netpbm PGM image text
+0	string		P3		Netpbm PPM image text
+0	string		P4		Netpbm PBM "rawbits" image data
+0	string		P5		Netpbm PGM "rawbits" image data
+0	string		P6		Netpbm PPM "rawbits" image data
+0	string		P7		Netpbm PAM image file
+
+# From: bryanh at giraffe-data.com (Bryan Henderson)
+0	string		\117\072	Solitaire Image Recorder format
+>4	string		\013		MGI Type 11
+>4	string		\021		MGI Type 17
+0	string		.MDA		MicroDesign data
+>21	byte		48		version 2
+>21	byte		51		version 3
+0	string		.MDP		MicroDesign page data
+>21	byte		48		version 2
+>21	byte		51		version 3
+
+# NIFF (Navy Interchange File Format, a modification of TIFF) images
+0	string		IIN1		NIFF image data
+
+# Tag Image File Format, from Daniel Quinlan (quinlan at yggdrasil.com)
+# The second word of TIFF files is the TIFF version number, 42, which has
+# never changed.  The TIFF specification recommends testing for it.
+0	string		MM\x00\x2a	TIFF image data, big-endian
+0	string		II\x2a\x00	TIFF image data, little-endian
+
+# PNG [Portable Network Graphics, or "PNG's Not GIF"] images
+# (Greg Roelofs, newt at uchicago.edu)
+# (Albert Cahalan, acahalan at cs.uml.edu)
+#
+# 137 P N G \r \n ^Z \n [4-byte length] H E A D [HEAD data] [HEAD crc] ...
+#
+0	string		\x89PNG		PNG image data,
+>4	belong		!0x0d0a1a0a	CORRUPTED,
+>4	belong		0x0d0a1a0a
+>>16	belong		x		%ld x
+>>20	belong		x		%ld,
+>>24	byte		x		%d-bit
+>>25	byte		0		grayscale,
+>>25	byte		2		\b/color RGB,
+>>25	byte		3		colormap,
+>>25	byte		4		gray+alpha,
+>>25	byte		6		\b/color RGBA,
+#>>26	byte		0		deflate/32K,
+>>28	byte		0		non-interlaced
+>>28	byte		1		interlaced
+1	string		PNG		PNG image data, CORRUPTED
+
+# GIF
+0	string		GIF8		GIF image data
+>4	string		7a		\b, version 8%s,
+>4	string		9a		\b, version 8%s,
+>6	leshort		>0		%hd x
+>8	leshort		>0		%hd
+#>10	byte		&0x80		color mapped,
+#>10	byte&0x07	=0x00		2 colors
+#>10	byte&0x07	=0x01		4 colors
+#>10	byte&0x07	=0x02		8 colors
+#>10	byte&0x07	=0x03		16 colors
+#>10	byte&0x07	=0x04		32 colors
+#>10	byte&0x07	=0x05		64 colors
+#>10	byte&0x07	=0x06		128 colors
+#>10	byte&0x07	=0x07		256 colors
+
+# ITC (CMU WM) raster files.  It is essentially a byte-reversed Sun raster,
+# 1 plane, no encoding.
+0	string		\361\0\100\273	CMU window manager raster image data
+>4	lelong		>0		%d x
+>8	lelong		>0		%d,
+>12	lelong		>0		%d-bit
+
+# Magick Image File Format
+0	string		id=ImageMagick	MIFF image data
+
+# Artisan
+0	long		1123028772	Artisan image data
+>4	long		1		\b, rectangular 24-bit
+>4	long		2		\b, rectangular 8-bit with colormap
+>4	long		3		\b, rectangular 32-bit (24-bit with matte)
+
+# FIG (Facility for Interactive Generation of figures), an object-based format
+0	string		#FIG		FIG image text
+>5	string		x		\b, version %.3s
+
+# PHIGS
+0	string		ARF_BEGARF		PHIGS clear text archive
+0	string		@(#)SunPHIGS		SunPHIGS
+# version number follows, in the form m.n
+>40	string		SunBin			binary
+>32	string		archive			archive
+
+# GKS (Graphics Kernel System)
+0	string		GKSM		GKS Metafile
+>24	string		SunGKS		\b, SunGKS
+
+# CGM image files
+0	string		BEGMF		clear text Computer Graphics Metafile
+# XXX - questionable magic
+0	beshort&0xffe0	0x0020		binary Computer Graphics Metafile
+0	beshort		0x3020		character Computer Graphics Metafile
+
+# MGR bitmaps  (Michael Haardt, u31b3hs at pool.informatik.rwth-aachen.de)
+0	string	yz	MGR bitmap, modern format, 8-bit aligned
+0	string	zz	MGR bitmap, old format, 1-bit deep, 16-bit aligned
+0	string	xz	MGR bitmap, old format, 1-bit deep, 32-bit aligned
+0	string	yx	MGR bitmap, modern format, squeezed
+
+# Fuzzy Bitmap (FBM) images
+0	string		%bitmap\0	FBM image data
+>30	long		0x31		\b, mono
+>30	long		0x33		\b, color
+
+# facsimile data
+1	string		PC\ Research,\ Inc	group 3 fax data
+>29	byte		0		\b, normal resolution (204x98 DPI)
+>29	byte		1		\b, fine resolution (204x196 DPI)
+# From: Herbert Rosmanith <herp at wildsau.idv.uni.linz.at>
+0	string		Sfff		structured fax file
+
+
+# PC bitmaps (OS/2, Windoze BMP files)  (Greg Roelofs, newt at uchicago.edu)
+0	string		BM		PC bitmap data
+>14	leshort		12		\b, OS/2 1.x format
+>>18	leshort		x		\b, %d x
+>>20	leshort		x		%d
+>14	leshort		64		\b, OS/2 2.x format
+>>18	leshort		x		\b, %d x
+>>20	leshort		x		%d
+>14	leshort		40		\b, Windows 3.x format
+>>18	lelong		x		\b, %d x
+>>22	lelong		x		%d x
+>>28	leshort		x		%d
+# Too simple - MPi
+#0	string		IC		PC icon data
+#0	string		PI		PC pointer image data
+#0	string		CI		PC color icon data
+#0	string		CP		PC color pointer image data
+# Conflicts with other entries [BABYL]
+#0	string		BA		PC bitmap array data
+
+# XPM icons (Greg Roelofs, newt at uchicago.edu)
+# note possible collision with C/REXX entry in c-lang; currently commented out
+0	string		/*\ XPM\ */	X pixmap image text
+
+# Utah Raster Toolkit RLE images (janl at ifi.uio.no)
+0	leshort		0xcc52		RLE image data,
+>6	leshort		x		%d x
+>8	leshort		x		%d
+>2	leshort		>0		\b, lower left corner: %d
+>4	leshort		>0		\b, lower right corner: %d
+>10	byte&0x1	=0x1		\b, clear first
+>10	byte&0x2	=0x2		\b, no background
+>10	byte&0x4	=0x4		\b, alpha channel
+>10	byte&0x8	=0x8		\b, comment
+>11	byte		>0		\b, %d color channels
+>12	byte		>0		\b, %d bits per pixel
+>13	byte		>0		\b, %d color map channels
+
+# image file format (Robert Potter, potter at cs.rochester.edu)
+0	string		Imagefile\ version-	iff image data
+# this adds the whole header (inc. version number), informative but longish
+>10	string		>\0		%s
+
+# Sun raster images, from Daniel Quinlan (quinlan at yggdrasil.com)
+0	belong		0x59a66a95	Sun raster image data
+>4	belong		>0		\b, %d x
+>8	belong		>0		%d,
+>12	belong		>0		%d-bit,
+#>16	belong		>0		%d bytes long,
+>20	belong		0		old format,
+#>20	belong		1		standard,
+>20	belong		2		compressed,
+>20	belong		3		RGB,
+>20	belong		4		TIFF,
+>20	belong		5		IFF,
+>20	belong		0xffff		reserved for testing,
+>24	belong		0		no colormap
+>24	belong		1		RGB colormap
+>24	belong		2		raw colormap
+#>28	belong		>0		colormap is %d bytes long
+
+# SGI image file format, from Daniel Quinlan (quinlan at yggdrasil.com)
+#
+# See
+#	http://reality.sgi.com/grafica/sgiimage.html
+#
+0	beshort		474		SGI image data
+#>2	byte		0		\b, verbatim
+>2	byte		1		\b, RLE
+#>3	byte		1		\b, normal precision
+>3	byte		2		\b, high precision
+>4	beshort		x		\b, %d-D
+>6	beshort		x		\b, %d x
+>8	beshort		x		%d
+>10	beshort		x		\b, %d channel
+>10	beshort		!1		\bs
+>80	string		>0		\b, "%s"
+
+0	string		IT01		FIT image data
+>4	belong		x		\b, %d x
+>8	belong		x		%d x
+>12	belong		x		%d
+#
+0	string		IT02		FIT image data
+>4	belong		x		\b, %d x
+>8	belong		x		%d x
+>12	belong		x		%d
+#
+2048	string		PCD_IPI		Kodak Photo CD image pack file
+>0xe02	byte&0x03	0x00		, landscape mode
+>0xe02	byte&0x03	0x01		, portrait mode
+>0xe02	byte&0x03	0x02		, landscape mode
+>0xe02	byte&0x03	0x03		, portrait mode
+0	string		PCD_OPA		Kodak Photo CD overview pack file
+
+# FITS format.  Jeff Uphoff <juphoff at tarsier.cv.nrao.edu>
+# FITS is the Flexible Image Transport System, the de facto standard for
+# data and image transfer, storage, etc., for the astronomical community.
+# (FITS floating point formats are big-endian.)
+0	string	SIMPLE\ \ =	FITS image data
+>109	string	8		\b, 8-bit, character or unsigned binary integer
+>108	string	16		\b, 16-bit, two's complement binary integer
+>107	string	\ 32		\b, 32-bit, two's complement binary integer
+>107	string	-32		\b, 32-bit, floating point, single precision
+>107	string	-64		\b, 64-bit, floating point, double precision
+
+# other images
+0	string	This\ is\ a\ BitMap\ file	Lisp Machine bit-array-file
+0	string		!!		Bennet Yee's "face" format
+
+# From SunOS 5.5.1 "/etc/magic" - appeared right before Sun raster image
+# stuff.
+#
+0	beshort		0x1010		PEX Binary Archive
+
+# Visio drawings
+03000	string	Visio\ (TM)\ Drawing	%s
+
+# Tgif files
+0	string	\%TGIF\ x 		Tgif file version %s
+
+# DICOM medical imaging data
+128	string	DICM			DICOM medical imaging data
+
+# XWD - X Window Dump file.
+#   As described in /usr/X11R6/include/X11/XWDFile.h
+#   used by the xwd program.
+#   Bradford Castalia, idaeim, 1/01
+4	belong	7			XWD X Window Dump image data
+>100	string	>\0			\b, "%s"
+>16	belong	x			\b, %dx
+>20	belong	x			\b%dx
+>12	belong	x			\b%d
+
+# PDS - Planetary Data System
+#   These files use Parameter Value Language in the header section.
+#   Unfortunately, there is no certain magic, but the following
+#   strings have been found to be most likely.
+0	string	NJPL1I00		PDS (JPL) image data
+2	string	NJPL1I			PDS (JPL) image data
+0	string	CCSD3ZF			PDS (CCSD) image data
+2	string	CCSD3Z			PDS (CCSD) image data
+0	string	PDS_			PDS image data
+0	string	LBLSIZE=		PDS (VICAR) image data
+
+# pM8x: ATARI STAD compressed bitmap format
+#
+# from Oskar Schirmer <schirmer at scara.com> Feb 2, 2001
+# p M 8 5/6 xx yy zz data...
+# Atari ST STAD bitmap is always 640x400, bytewise runlength compressed.
+# bytes either run horizontally (pM85) or vertically (pM86). yy is the
+# most frequent byte, xx and zz are runlength escape codes, where xx is
+# used for runs of yy.
+#
+0	string	pM85		Atari ST STAD bitmap image data (hor)
+>5	byte	0x00		(white background)
+>5	byte	0xFF		(black background)
+0	string	pM86		Atari ST STAD bitmap image data (vert)
+>5	byte	0x00		(white background)
+>5	byte	0xFF		(black background)
+
+# XXX:
+# This is bad magic 0x5249 == 'RI' conflicts with RIFF and other
+# magic.
+# SGI RICE image file <mpruett at sgi.com>
+#0	beshort	0x5249		RICE image
+#>2	beshort	x		v%d
+#>4	beshort	x		(%d x
+#>6	beshort	x		%d)
+#>8	beshort	0		8 bit
+#>8	beshort	1		10 bit
+#>8	beshort	2		12 bit
+#>8	beshort	3		13 bit
+#>10	beshort	0		4:2:2
+#>10	beshort	1		4:2:2:4
+#>10	beshort	2		4:4:4
+#>10	beshort	3		4:4:4:4
+#>12	beshort	1		RGB
+#>12	beshort	2		CCIR601
+#>12	beshort	3		RP175
+#>12	beshort	4		YUV
+
+#------------------------------------------------------------------------------
+#
+# Marco Schmidt (marcoschmidt at users.sourceforge.net) -- an image  file format
+# for the EPOC operating system, which is used with PDAs like those from Psion
+#
+# see http://huizen.dds.nl/~frodol/psiconv/html/Index.html for a description
+# of various EPOC file formats
+
+0	string \x37\x00\x00\x10\x42\x00\x00\x10\x00\x00\x00\x00\x39\x64\x39\x47 EPOC MBM image file
+
+# PCX image files
+# From: Dan Fandrich <dan at coneharvesters.com>
+0	beshort		0x0a00	PCX ver. 2.5 image data
+0	beshort		0x0a02	PCX ver. 2.8 image data, with palette
+0	beshort		0x0a03	PCX ver. 2.8 image data, without palette
+0	beshort		0x0a04	PCX for Windows image data
+0	beshort		0x0a05	PCX ver. 3.0 image data
+>4	leshort		x      bounding box [%hd,
+>6	leshort		x      %hd] -
+>8	leshort		x      [%hd,
+>10	leshort		x      %hd],
+>65	byte		>1	%d planes each of
+>3	byte		x	%hhd-bit
+>68	byte		0	image,
+>68	byte		1	colour,
+>68	byte		2	grayscale,
+>68	byte		>2	image,
+>68	byte		<0	image,
+>12	leshort		>0	%hd x
+>>14	leshort		x      %hd dpi,
+>2	byte		0	uncompressed
+>2	byte		1	RLE compressed
+
+# Adobe Photoshop
+0	string		8BPS Adobe Photoshop Image
+
+# XV thumbnail indicator (ThMO)
+0	string		P7\ 332		XV thumbnail image data
+
+# NITF is defined by United States MIL-STD-2500A
+0	string	NITF	National Imagery Transmission Format
+>25	string	>\0	dated %.14s
+
+# GEM Image: Version 1, Headerlen 8 (Wolfram Kleff)
+0	belong		0x00010008	GEM Image data
+>12	beshort		x		%d x
+>14	beshort		x		%d,
+>4	beshort		x		%d planes,
+>8	beshort		x		%d x
+>10	beshort		x		%d pixelsize
+
+# GEM Metafile (Wolfram Kleff)
+0	lelong		0x0018FFFF	GEM Metafile data
+>4	leshort		x		version %d
+
+#
+# SMJPEG. A custom Motion JPEG format used by Loki Entertainment
+# Software Torbjorn Andersson <d91tan at Update.UU.SE>.
+#
+0	string	\0\nSMJPEG	SMJPEG
+>8	belong	x		%d.x data
+# According to the specification you could find any number of _TXT
+# headers here, but I can't think of any way of handling that. None of
+# the SMJPEG files I tried it on used this feature. Even if such a
+# file is encountered the output should still be reasonable.
+>16	string	_SND		\b,
+>>24	beshort	>0		%d Hz
+>>26	byte	8		8-bit
+>>26	byte	16		16-bit
+>>28	string	NONE		uncompressed
+# >>28	string	APCM		ADPCM compressed
+>>27	byte	1		mono
+>>28	byte	2		stereo
+# Help! Isn't there any way to avoid writing this part twice?
+>>32	string	_VID		\b,
+# >>>48	string	JFIF		JPEG
+>>>40	belong	>0		%d frames
+>>>44	beshort	>0		(%d x
+>>>46	beshort	>0		%d)
+>16	string	_VID		\b,
+# >>32	string	JFIF		JPEG
+>>24	belong	>0		%d frames
+>>28	beshort	>0		(%d x
+>>30	beshort	>0		%d)
+
+0	string	Paint\ Shop\ Pro\ Image\ File	Paint Shop Pro Image File
+
+# "thumbnail file" (icon)
+# descended from "xv", but in use by other applications as well (Wolfram Kleff)
+0       string          P7\ 332         XV "thumbnail file" (icon) data
+
+# taken from fkiss: (<yav at mte.biglobe.ne.jp> ?)
+0       string          KiSS            KISS/GS
+>4      byte            16              color
+>>5     byte            x               %d bit
+>>8     leshort         x               %d colors
+>>10    leshort         x               %d groups
+>4      byte            32              cell
+>>5     byte            x               %d bit
+>>8     leshort         x               %d x
+>>10    leshort         x               %d
+>>12    leshort         x               +%d
+>>14    leshort         x               +%d
+
+# Webshots (www.webshots.com), by John Harrison
+0       string          C\253\221g\230\0\0\0 Webshots Desktop .wbz file
+
+# Hercules DASD image files
+# From Jan Jaeger <jj at septa.nl>
+0       string  CKD_P370        Hercules CKD DASD image file
+>8      long    x               \b, %d heads per cylinder
+>12     long    x               \b, track size %d bytes
+>16     byte    x               \b, device type 33%2.2X
+
+0       string  CKD_C370        Hercules compressed CKD DASD image file
+>8      long    x               \b, %d heads per cylinder
+>12     long    x               \b, track size %d bytes
+>16     byte    x               \b, device type 33%2.2X
+
+0       string  CKD_S370        Hercules CKD DASD shadow file
+>8      long    x               \b, %d heads per cylinder
+>12     long    x               \b, track size %d bytes
+>16     byte    x               \b, device type 33%2.2X
+
+# Squeak images and - etoffi at softhome.net
+0 string \146\031\0\0  Squeak image data
+0 string 'From\040Squeak  Squeak program text
+
+# partimage: file(1) magic for PartImage files (experimental, incomplete)
+# Author: Hans-Joachim Baader <hjb at pro-linux.de>
+0		string	PaRtImAgE-VoLuMe	PartImage
+>0x0020		string	0.6.1		file version %s
+>>0x0060	lelong	>-1		volume %ld
+#>>0x0064 8 byte identifier
+#>>0x007c reserved
+>>0x0200	string	>\0		type %s
+>>0x1400	string	>\0		device %s,
+>>0x1600	string	>\0		original filename %s,
+# Some fields omitted
+>>0x2744	lelong	0		not compressed
+>>0x2744	lelong	1		gzip compressed
+>>0x2744	lelong	2		bzip2 compressed
+>>0x2744	lelong	>2		compressed with unknown algorithm
+>0x0020		string	>0.6.1		file version %s
+>0x0020		string	<0.6.1		file version %s
+
+# DCX is multi-page PCX, using a simple header of up to 1024
+# offsets for the respective PCX components.
+# From: Joerg Wunsch <joerg_wunsch at uriah.heep.sax.de>
+0	lelong	987654321	DCX multi-page PCX image data
+
+# Simon Walton <simonw at matteworld.com>
+# Kodak Cineon format for scanned negatives
+# http://www.kodak.com/US/en/motion/support/dlad/
+0	lelong  0xd75f2a80	Cineon image data
+>200	belong  >0		\b, %ld x
+>204	belong  >0		%ld
+
+# From Jan "Yenya" Kasprzak <kas at fi.muni.cz>
+# The description of *.mrw format can be found at
+# http://www.dalibor.cz/minolta/raw_file_format.htm
+0	string	\000MRM			Minolta Dimage camera raw image data
+
+# From: stephane.loeuillet at tiscali.f
+# http://www.djvuzone.org/
+0	string	AT&TFORM		DjVu Image file
+
+# From: Jason Bacon <bacon at smithers.neuro.mcw.edu>
+0	beshort	0x3020			character Computer Graphics Metafile
+
+
+#------------------------------------------------------------------------------
+# intel:  file(1) magic for x86 Unix
+#
+# Various flavors of x86 UNIX executable/object (other than Xenix, which
+# is in "microsoft").  DOS is in "msdos"; the ambitious soul can do
+# Windows as well.
+#
+# Windows NT belongs elsewhere, as you need x86 and MIPS and Alpha and
+# whatever comes next (HP-PA Hummingbird?).  OS/2 may also go elsewhere
+# as well, if, as, and when IBM makes it portable.
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0	leshort		0502		basic-16 executable
+>12	lelong		>0		not stripped
+#>22	leshort		>0		- version %ld
+0	leshort		0503		basic-16 executable (TV)
+>12	lelong		>0		not stripped
+#>22	leshort		>0		- version %ld
+0	leshort		0510		x86 executable
+>12	lelong		>0		not stripped
+0	leshort		0511		x86 executable (TV)
+>12	lelong		>0		not stripped
+0	leshort		=0512		iAPX 286 executable small model (COFF)
+>12	lelong		>0		not stripped
+#>22	leshort		>0		- version %ld
+0	leshort		=0522		iAPX 286 executable large model (COFF)
+>12	lelong		>0		not stripped
+#>22	leshort		>0		- version %ld
+# SGI labeled the next entry as "iAPX 386 executable" --Dan Quinlan
+0	leshort		=0514		80386 COFF executable
+>12	lelong		>0		not stripped
+>22	leshort		>0		- version %ld
+
+# rom: file(1) magic for BIOS ROM Extensions found in intel machines
+#      mapped into memory between 0xC0000 and 0xFFFFF
+# From Gürkan Sengün <gurkan at linuks.mine.nu>, www.linuks.mine.nu
+0        beshort         0x55AA       BIOS (ia32) ROM Ext.
+>5       string          USB          USB
+>7       string          LDR          UNDI image
+>30      string          IBM          IBM comp. Video
+>26      string          Adaptec      Adaptec
+>28      string          Adaptec      Adaptec
+>42      string          PROMISE      Promise
+>2       byte            x            (%d*512)
+
+#------------------------------------------------------------------------------
+# interleaf:  file(1) magic for InterLeaf TPS:
+#
+0	string		=\210OPS	Interleaf saved data
+0	string		=<!OPS		Interleaf document text
+>5	string		,\ Version\ =	\b, version
+>>17	string		>\0		%.3s
+
+#------------------------------------------------------------------------------
+# island:  file(1) magic for IslandWite/IslandDraw, from SunOS 5.5.1
+# "/etc/magic":
+# From: guy at netapp.com (Guy Harris)
+#
+4	string		pgscriptver	IslandWrite document
+13	string		DrawFile	IslandDraw document
+
+
+#------------------------------------------------------------------------------
+# ispell:  file(1) magic for ispell
+#
+# Ispell 3.0 has a magic of 0x9601 and ispell 3.1 has 0x9602.  This magic
+# will match 0x9600 through 0x9603 in *both* little endian and big endian.
+# (No other current magic entries collide.)
+#
+# Updated by Daniel Quinlan (quinlan at yggdrasil.com)
+#
+0	leshort&0xFFFC	0x9600		little endian ispell
+>0	byte		0		hash file (?),
+>0	byte		1		3.0 hash file,
+>0	byte		2		3.1 hash file,
+>0	byte		3		hash file (?),
+>2	leshort		0x00		8-bit, no capitalization, 26 flags
+>2	leshort		0x01		7-bit, no capitalization, 26 flags
+>2	leshort		0x02		8-bit, capitalization, 26 flags
+>2	leshort		0x03		7-bit, capitalization, 26 flags
+>2	leshort		0x04		8-bit, no capitalization, 52 flags
+>2	leshort		0x05		7-bit, no capitalization, 52 flags
+>2	leshort		0x06		8-bit, capitalization, 52 flags
+>2	leshort		0x07		7-bit, capitalization, 52 flags
+>2	leshort		0x08		8-bit, no capitalization, 128 flags
+>2	leshort		0x09		7-bit, no capitalization, 128 flags
+>2	leshort		0x0A		8-bit, capitalization, 128 flags
+>2	leshort		0x0B		7-bit, capitalization, 128 flags
+>2	leshort		0x0C		8-bit, no capitalization, 256 flags
+>2	leshort		0x0D		7-bit, no capitalization, 256 flags
+>2	leshort		0x0E		8-bit, capitalization, 256 flags
+>2	leshort		0x0F		7-bit, capitalization, 256 flags
+>4	leshort		>0		and %d string characters
+0	beshort&0xFFFC	0x9600		big endian ispell
+>1	byte		0		hash file (?),
+>1	byte		1		3.0 hash file,
+>1	byte		2		3.1 hash file,
+>1	byte		3		hash file (?),
+>2	beshort		0x00		8-bit, no capitalization, 26 flags
+>2	beshort		0x01		7-bit, no capitalization, 26 flags
+>2	beshort		0x02		8-bit, capitalization, 26 flags
+>2	beshort		0x03		7-bit, capitalization, 26 flags
+>2	beshort		0x04		8-bit, no capitalization, 52 flags
+>2	beshort		0x05		7-bit, no capitalization, 52 flags
+>2	beshort		0x06		8-bit, capitalization, 52 flags
+>2	beshort		0x07		7-bit, capitalization, 52 flags
+>2	beshort		0x08		8-bit, no capitalization, 128 flags
+>2	beshort		0x09		7-bit, no capitalization, 128 flags
+>2	beshort		0x0A		8-bit, capitalization, 128 flags
+>2	beshort		0x0B		7-bit, capitalization, 128 flags
+>2	beshort		0x0C		8-bit, no capitalization, 256 flags
+>2	beshort		0x0D		7-bit, no capitalization, 256 flags
+>2	beshort		0x0E		8-bit, capitalization, 256 flags
+>2	beshort		0x0F		7-bit, capitalization, 256 flags
+>4	beshort		>0		and %d string characters
+# ispell 4.0 hash files  kromJx <kromJx at crosswinds.net>
+# Ispell 4.0
+0       string          ISPL            ispell
+>4      long            x               hash file version %d,
+>8      long            x               lexletters %d,
+>12     long            x               lexsize %d,
+>16     long            x               hashsize %d,
+>20     long            x               stblsize %d
+#------------------------------------------------------------
+# Java ByteCode
+# From Larry Schwimmer (schwim at cs.stanford.edu)
+0	belong		0xcafebabe	compiled Java class data,
+>6	beshort x	version %d.
+>4	beshort x	\b%d
+#------------------------------------------------------------
+# Java serialization
+# From Martin Pool (m.pool at pharos.com.au)
+0	beshort		0xaced		Java serialization data
+>2	beshort		>0x0004		\b, version %d
+
+#------------------------------------------------------------------------------
+# JPEG images
+# SunOS 5.5.1 had
+#
+#	0	string		\377\330\377\340	JPEG file
+#	0	string		\377\330\377\356	JPG file
+#
+# both of which turn into "JPEG image data" here.
+#
+0	beshort		0xffd8		JPEG image data
+>6	string		JFIF		\b, JFIF standard
+>6	string		Exif		\b, EXIF standard
+# The following added by Erik Rossen <rossen at freesurf.ch> 1999-09-06
+# in a vain attempt to add image size reporting for JFIF.  Note that these
+# tests are not fool-proof since some perfectly valid JPEGs are currently
+# impossible to specify in magic(4) format.
+# First, a little JFIF version info:
+>11	byte		x		\b %d.
+>12	byte		x		\b%02d
+# Next, the resolution or aspect ratio of the image:
+#>13	byte		0		\b, aspect ratio
+#>13	byte		1		\b, resolution (DPI)
+#>13	byte		2		\b, resolution (DPCM)
+#>4	beshort		x		\b, segment length %d
+# Next, show thumbnail info, if it exists:
+>18	byte		!0		\b, thumbnail %dx
+>>19	byte		x		\b%d
+# Here things get sticky.  We can do ONE MORE marker segment with
+# indirect addressing, and that's all.  It would be great if we could
+# do pointer arithemetic like in an assembler language.  Christos?
+# And if there was some sort of looping construct to do searches, plus a few
+# named accumulators, it would be even more effective...
+# At least we can show a comment if no other segments got inserted before:
+>(4.S+5)	byte		0xFE
+>>(4.S+8)	string		>\0		\b, "%s"
+#>(4.S+5)	byte		0xFE		\b, comment
+#>>(4.S+6)	beshort		x		\b length=%d
+#>>(4.S+8)	string		>\0		\b, "%s"
+# Or, we can show the encoding type (I've included only the three most common)
+# and image dimensions if we are lucky and the SOFn (image segment) is here:
+>(4.S+5)	byte		0xC0		\b, baseline
+>>(4.S+6)	byte		x		\b, precision %d
+>>(4.S+7)	beshort		x		\b, %dx
+>>(4.S+9)	beshort		x		\b%d
+>(4.S+5)	byte		0xC1		\b, extended sequential
+>>(4.S+6)	byte		x		\b, precision %d
+>>(4.S+7)	beshort		x		\b, %dx
+>>(4.S+9)	beshort		x		\b%d
+>(4.S+5)	byte		0xC2		\b, progressive
+>>(4.S+6)	byte		x		\b, precision %d
+>>(4.S+7)	beshort		x		\b, %dx
+>>(4.S+9)	beshort		x		\b%d
+# I've commented-out quantisation table reporting.  I doubt anyone cares yet.
+#>(4.S+5)	byte		0xDB		\b, quantisation table
+#>>(4.S+6)	beshort		x		\b length=%d
+#>14	beshort		x		\b, %d x
+#>16	beshort		x		\b %d
+
+# HSI is Handmade Software's proprietary JPEG encoding scheme
+0	string		hsi1		JPEG image data, HSI proprietary
+
+# From: David Santinoli <david at santinoli.com>
+0	string		\x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A	JPEG 2000 image data
+
+#------------------------------------------------------------------------------
+# karma:  file(1) magic for Karma data files
+#
+# From <rgooch at atnf.csiro.au>
+
+0	string		KarmaRHD Version	Karma Data Structure Version
+>16	belong		x		%lu
+#------------------------------------------------------------------------------
+# DEC SRC Virtual Paper: Lectern files
+# Karl M. Hegbloom <karlheg at inetarena.com>
+0	string	lect	DEC SRC Virtual Paper Lectern file
+
+#------------------------------------------------------------------------------
+# lex:  file(1) magic for lex
+#
+#	derived empirically, your offsets may vary!
+53	string		yyprevious	C program text (from lex)
+>3	string		>\0		 for %s
+# C program text from GNU flex, from Daniel Quinlan <quinlan at yggdrasil.com>
+21	string		generated\ by\ flex	C program text (from flex)
+# lex description file, from Daniel Quinlan <quinlan at yggdrasil.com>
+0	string		%{		lex description text
+
+#------------------------------------------------------------------------------
+# lif:  file(1) magic for lif
+#
+# (Daniel Quinlan <quinlan at yggdrasil.com>)
+#
+0	beshort		0x8000		lif file
+
+#------------------------------------------------------------------------------
+# linux:  file(1) magic for Linux files
+#
+# Values for Linux/i386 binaries, from Daniel Quinlan <quinlan at yggdrasil.com>
+# The following basic Linux magic is useful for reference, but using
+# "long" magic is a better practice in order to avoid collisions.
+#
+# 2	leshort		100		Linux/i386
+# >0	leshort		0407		impure executable (OMAGIC)
+# >0	leshort		0410		pure executable (NMAGIC)
+# >0	leshort		0413		demand-paged executable (ZMAGIC)
+# >0	leshort		0314		demand-paged executable (QMAGIC)
+#
+0	lelong		0x00640107	Linux/i386 impure executable (OMAGIC)
+>16	lelong		0		\b, stripped
+0	lelong		0x00640108	Linux/i386 pure executable (NMAGIC)
+>16	lelong		0		\b, stripped
+0	lelong		0x0064010b	Linux/i386 demand-paged executable (ZMAGIC)
+>16	lelong		0		\b, stripped
+0	lelong		0x006400cc	Linux/i386 demand-paged executable (QMAGIC)
+>16	lelong		0		\b, stripped
+#
+0	string		\007\001\000	Linux/i386 object file
+>20	lelong		>0x1020		\b, DLL library
+# Linux-8086 stuff:
+0	string		\01\03\020\04	Linux-8086 impure executable
+>28	long		!0		not stripped
+0	string		\01\03\040\04	Linux-8086 executable
+>28	long		!0		not stripped
+#
+0	string		\243\206\001\0	Linux-8086 object file
+#
+0	string		\01\03\020\20	Minix-386 impure executable
+>28	long		!0		not stripped
+0	string		\01\03\040\20	Minix-386 executable
+>28	long		!0		not stripped
+# core dump file, from Bill Reynolds <bill at goshawk.lanl.gov>
+216	lelong		0421		Linux/i386 core file
+>220	string		>\0		of '%s'
+>200	lelong		>0		(signal %d)
+#
+# LILO boot/chain loaders, from Daniel Quinlan <quinlan at yggdrasil.com>
+# this can be overridden by the DOS executable (COM) entry
+2	string		LILO		Linux/i386 LILO boot/chain loader
+#
+# PSF fonts, from H. Peter Anvin <hpa at yggdrasil.com>
+0	leshort		0x0436		Linux/i386 PC Screen Font data,
+>2	byte		0		256 characters, no directory,
+>2	byte		1		512 characters, no directory,
+>2	byte		2		256 characters, Unicode directory,
+>2	byte		3		512 characters, Unicode directory,
+>3	byte		>0		8x%d
+# Linux swap file, from Daniel Quinlan <quinlan at yggdrasil.com>
+4086	string		SWAP-SPACE	Linux/i386 swap file
+# according to man page of mkswap (8) March 1999
+4086	string		SWAPSPACE2	Linux/i386 swap file (new style)
+>0x400	long		x		%d (4K pages)
+>0x404	long		x		size %d pages
+# ECOFF magic for OSF/1 and Linux (only tested under Linux though)
+#
+#	from Erik Troan (ewt at redhat.com) examining od dumps, so this
+#		could be wrong
+#      updated by David Mosberger (davidm at azstarnet.com) based on
+#      GNU BFD and MIPS info found below.
+#
+0	leshort		0x0183		ECOFF alpha
+>24	leshort		0407		executable
+>24	leshort		0410		pure
+>24	leshort		0413		demand paged
+>8	long		>0		not stripped
+>8	long		0		stripped
+>23	leshort		>0		- version %ld.
+#
+# Linux kernel boot images, from Albert Cahalan <acahalan at cs.uml.edu>
+# and others such as Axel Kohlmeyer <akohlmey at rincewind.chemie.uni-ulm.de>
+# and Nicol�s Lichtmaier <nick at debian.org>
+# All known start with: b8 c0 07 8e d8 b8 00 90 8e c0 b9 00 01 29 f6 29
+# Linux kernel boot images (i386 arch) (Wolfram Kleff)
+#514	string		HdrS		Linux kernel
+#>510	leshort		0xAA55		x86 boot executable
+#>>518	leshort		>=3D0x200
+#>>529	byte		0		zImage,
+#>>>529	byte		1		bzImage,
+#>>>(526.s+0x200) string	>\0		version %s,
+#>>498	leshort		1		RO-rootFS,
+#>>498	leshort		0		RW-rootFS,
+#>>508	leshort		>0		root_dev 0x%X,
+#>>502	leshort		>0		swap_dev 0x%X,
+#>>504	leshort		>0		RAMdisksize %u KB,
+#>>506	leshort		0xFFFF		Normal VGA
+#>>506	leshort		0xFFFE		Extended VGA
+#>>506	leshort		0xFFFD		Prompt for Videomode
+#>>506	leshort		>0		Video mode %d
+# This also matches new kernels, which were caught above by "HdrS".
+#0		belong	0xb8c0078e	Linux kernel
+#>0x1e3		string	Loading		version 1.3.79 or older
+#>0x1e9		string	Loading		from prehistoric times
+
+# System.map files - Nicol�s Lichtmaier <nick at debian.org>
+8	string	\ A\ _text	Linux kernel symbol map text
+
+# LSM entries - Nicol�s Lichtmaier <nick at debian.org>
+0	string	Begin3	Linux Software Map entry text
+0	string	Begin4	Linux Software Map entry text (new format)
+
+# From Matt Zimmerman
+0       belong  0x4f4f4f4d      User-mode Linux COW file
+>4      belong  x               \b, version %d
+>8      string  >\0             \b, backing file %s
+
+############################################################################
+# Linux kernel versions
+
+0		string		\xb8\xc0\x07\x8e\xd8\xb8\x00\x90	Linux
+>497		leshort		0		x86 boot sector
+>>514		belong		0x8e	of a kernel from the dawn of time!
+>>514		belong		0x908ed8b4	version 0.99-1.1.42
+>>514		belong		0x908ed8b8	for memtest86
+
+>497		leshort		!0		x86 kernel
+>>504		leshort		>0		RAMdisksize=%u KB
+>>502		leshort		>0		swap=0x%X
+>>508		leshort		>0		root=0x%X
+>>>498		leshort		1		\b-ro
+>>>498		leshort		0		\b-rw
+>>506		leshort		0xFFFF		vga=normal
+>>506		leshort		0xFFFE		vga=extended
+>>506		leshort		0xFFFD		vga=ask
+>>506		leshort		>0		vga=%d
+>>514		belong		0x908ed881	version 1.1.43-1.1.45
+>>514		belong		0x15b281cd
+>>>0xa8e	belong		0x55AA5a5a	version 1.1.46-1.2.13,1.3.0
+>>>0xa99	belong		0x55AA5a5a	version 1.3.1,2
+>>>0xaa3	belong		0x55AA5a5a	version 1.3.3-1.3.30
+>>>0xaa6	belong		0x55AA5a5a	version 1.3.31-1.3.41
+>>>0xb2b	belong		0x55AA5a5a	version 1.3.42-1.3.45
+>>>0xaf7	belong		0x55AA5a5a	version 1.3.46-1.3.72
+>>514		string		HdrS
+>>>518		leshort		>0x1FF
+>>>>529		byte		0		\b, zImage
+>>>>529		byte		1		\b, bzImage
+>>>>(526.s+0x200) string 	>\0		\b, version %s
+
+# Linux boot sector thefts.
+0		belong		0xb8c0078e	Linux
+>0x1e6		belong		0x454c4b53	ELKS Kernel
+>0x1e6		belong		!0x454c4b53	style boot sector
+
+############################################################################
+# Linux 8086 executable
+0	lelong&0xFF0000FF 0xC30000E9	Linux-Dev86 executable, headerless
+>5	string		.		
+>>4	string		>\0		\b, libc version %s
+
+0	lelong&0xFF00FFFF 0x4000301	Linux-8086 executable
+>2	byte&0x01	!0		\b, unmapped zero page
+>2	byte&0x20	0		\b, impure
+>2	byte&0x20	!0
+>>2	byte&0x10	!0		\b, A_EXEC
+>2	byte&0x02	!0		\b, A_PAL
+>2	byte&0x04	!0		\b, A_NSYM
+>2	byte&0x08	!0		\b, A_STAND
+>2	byte&0x40	!0		\b, A_PURE
+>2	byte&0x80	!0		\b, A_TOVLY
+>28     long            !0              \b, not stripped
+>37	string		.		
+>>36	string		>\0		\b, libc version %s
+
+# 0	lelong&0xFF00FFFF 0x10000301	ld86 I80386 executable
+# 0	lelong&0xFF00FFFF 0xB000301	ld86 M68K executable
+# 0	lelong&0xFF00FFFF 0xC000301	ld86 NS16K executable
+# 0	lelong&0xFF00FFFF 0x17000301	ld86 SPARC executable
+
+
+#------------------------------------------------------------------------------
+# lisp:  file(1) magic for lisp programs
+#
+# various lisp types, from Daniel Quinlan (quinlan at yggdrasil.com)
+
+# This is a guess, but a good one.
+0	string	;;			Lisp/Scheme program text
+
+# Emacs 18 - this is always correct, but not very magical.
+0	string	\012(			Emacs v18 byte-compiled Lisp data
+# Emacs 19+ - ver. recognition added by Ian Springer
+# Also applies to XEmacs 19+ .elc files; could tell them apart if we had regexp
+# support or similar - Chris Chittleborough <cchittleborough at yahoo.com.au>
+0	string	;ELC			
+>4	byte	>19			
+>4	byte    <32			Emacs/XEmacs v%d byte-compiled Lisp data
+
+# Files produced by CLISP Common Lisp From: Bruno Haible <haible at ilog.fr>
+0	string	(SYSTEM::VERSION\040'	CLISP byte-compiled Lisp program text
+0	long	0x70768BD2		CLISP memory image data
+0	long	0xD28B7670		CLISP memory image data, other endian
+
+# Files produced by GNU gettext
+0	long	0xDE120495		GNU-format message catalog data
+0	long	0x950412DE		GNU-format message catalog data
+
+#.com and .bin for MIT scheme 
+0	string	\372\372\372\372	MIT scheme (library?)
+
+# From: David Allouche <david at allouche.net>
+0	string	\<TeXmacs|	TeXmacs document text
+#------------------------------------------------------------------------------
+# mach file description
+#
+0	belong		0xcafebabe	Mach-O fat file
+>4	belong		1		with 1 architecture
+>4	belong		>1
+>>4	belong		x		with %ld architectures		
+#
+0	belong		0xfeedface	Mach-O
+>12	belong		1		object
+>12	belong		2		executable
+>12	belong		3		shared library
+>12	belong		4		core
+>12	belong		5		preload executable
+>12	belong		6               dynamically linked shared library
+>12	belong		7               dynamic linker
+>12	belong		8		bundle
+>12	belong		>8
+>>12	belong		x		filetype=%ld
+>4	belong		<0
+>>4	belong		x		architecture=%ld
+>4	belong		1		vax
+>4	belong		2		romp
+>4	belong		3		architecture=3
+>4	belong		4		ns32032
+>4	belong		5		ns32332
+>4	belong		6		for m68k architecture
+# from NeXTstep 3.0 <mach/machine.h>
+# i.e. mc680x0_all, ignore
+# >>8	belong		1		(mc68030)
+>>8	belong		2		(mc68040)
+>>8	belong		3		(mc68030 only)
+>4	belong		7		i386
+>4	belong		8		mips
+>4	belong		9		ns32532
+>4	belong		10		architecture=10
+>4	belong		11		hp pa-risc
+>4	belong		12		acorn
+>4	belong		13		m88k
+>4	belong		14		SPARC
+>4	belong		15		i860-big
+>4	belong		16		i860
+>4	belong		17		rs6000
+>4	belong		18		ppc
+>4	belong		>18
+>>4	belong		x		architecture=%ld
+
+#------------------------------------------------------------------------------
+# magic:  file(1) magic for magic files
+#
+0	string		#\ Magic	magic text file for file(1) cmd
+0	lelong		0xF11E041C	magic binary file for file(1) cmd
+>4	lelong		x		(version %d) (little endian)
+0	belong		0xF11E041C	magic binary file for file(1) cmd
+>4	belong		x		(version %d) (big endian)
+
+#------------------------------------------------------------------------------
+# mail.news:  file(1) magic for mail and news
+#
+# Unfortunately, saved netnews also has From line added in some news software.
+#0	string		From 		mail text
+# There are tests to ascmagic.c to cope with mail and news.
+0	string		Relay-Version: 	old news text
+0	string		#!\ rnews	batched news text
+0	string		N#!\ rnews	mailed, batched news text
+0	string		Forward\ to 	mail forwarding text
+0	string		Pipe\ to 	mail piping text
+0	string		Return-Path:	smtp mail text
+0	string		Path:		news text
+0	string		Xref:		news text
+0	string		From:		news or mail text
+0	string		Article 	saved news text
+0	string		BABYL		Emacs RMAIL text
+0	string		Received:	RFC 822 mail text
+0	string		MIME-Version:	MIME entity text
+#0	string		Content-	MIME entity text
+
+# TNEF files...
+0	lelong		0x223E9F78	Transport Neutral Encapsulation Format
+
+# From: Kevin Sullivan <ksulliva at psc.edu>
+0	string		*mbx*		MBX mail folder
+
+# From: Simon Matter <simon.matter at invoca.ch>
+0	string		\241\002\213\015skiplist\ file\0\0\0	Cyrus skiplist DB
+
+# JAM(mbp) Fidonet message area databases
+# JHR file
+0	string	JAM\0			JAM message area header file
+>12	leshort >0			(%d messages)
+
+# Squish Fidonet message area databases
+# SQD file (requires at least one message in the area)
+256	leshort	0xAFAE4453		Squish message area data file
+>4	leshort	>0			(%d messages)
+
+#------------------------------------------------------------------------------
+# maple:  file(1) magic for maple files
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Maple V release 4, a multi-purpose math program
+#
+
+# maple library .lib
+0	string	\000MVR4\nI	MapleVr4 library
+
+# .ind
+# no magic for these :-(
+# they are compiled indexes for maple files
+
+# .hdb 
+0	string	\000\004\000\000	Maple help database
+
+# .mhp
+# this has the form <PACKAGE=name>
+0	string	\<PACKAGE=	Maple help file
+0	string	\<HELP\ NAME=	Maple help file
+0	string	\n\<HELP\ NAME=	Maple help file with extra carriage return at start (yuck)
+#0	string	#\ Newton	Maple help file, old style
+0	string	#\ daub	Maple help file, old style
+#0	string	#===========	Maple help file, old style
+
+# .mws
+0	string	\000\000\001\044\000\221	Maple worksheet
+#this is anomalous
+0	string	WriteNow\000\002\000\001\000\000\000\000\100\000\000\000\000\000	Maple worksheet, but weird
+# this has the form {VERSION 2 3 "IBM INTEL NT" "2.3" }\n
+# that is {VERSION major_version miunor_version computer_type version_string}
+0	string	{VERSION\ 	Maple worksheet
+>9	string	>\0	version %.1s.
+>>10	string
+>>>11	string	>\0	%.1s
+
+# .mps
+0	string	\0\0\001$	Maple something
+# from byte 4 it is either 'nul E' or 'soh R'
+# I think 'nul E' means a file that was saved as  a different name
+# a sort of revision marking
+# 'soh R' means new 
+>4	string	\000\105	An old revision
+>4	string	\001\122	The latest save
+
+# .mpl
+# some of these are the same as .mps above
+#0000000 000 000 001 044 000 105 same as .mps
+#0000000 000 000 001 044 001 122 same as .mps
+
+0	string	#\n##\ <SHAREFILE=	Maple something
+0	string	\n#\n##\ <SHAREFILE=	Maple something
+0	string	##\ <SHAREFILE=	Maple something
+0	string	#\r##\ <SHAREFILE=	Maple something
+0	string	\r#\r##\ <SHAREFILE=	Maple something
+0	string	#\ \r##\ <DESCRIBE>	Maple something anomalous.
+
+#------------------------------------------------------------------------------
+# mathematica:  file(1) magic for mathematica files
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Mathematica a multi-purpose math program
+# versions 2.2 and 3.0
+
+#mathematica .mb
+0	string	\064\024\012\000\035\000\000\000	Mathematica version 2 notebook
+0	string	\064\024\011\000\035\000\000\000	Mathematica version 2 notebook
+
+# .ma
+# multiple possibilites:
+
+0	string	(*^\n\n::[\011frontEndVersion\ =\ 	Mathematica notebook
+#>41	string	>\0	%s
+
+#0	string	(*^\n\n::[\011palette	Mathematica notebook version 2.x
+
+#0	string	(*^\n\n::[\011Information	Mathematica notebook version 2.x
+#>675	string	>\0	%s #doesn't work well
+
+# there may be 'cr' instread of 'nl' in some does this matter?
+
+# generic:
+0	string	(*^\r\r::[\011	Mathematica notebook version 2.x
+0	string	\(\*\^\r\n\r\n\:\:\[\011	Mathematica notebook version 2.x
+0	string	(*^\015			Mathematica notebook version 2.x
+0	string	(*^\n\r\n\r::[\011	Mathematica notebook version 2.x
+0	string	(*^\r::[\011	Mathematica notebook version 2.x
+0	string	(*^\r\n::[\011	Mathematica notebook version 2.x
+0	string	(*^\n\n::[\011	Mathematica notebook version 2.x
+0	string	(*^\n::[\011	Mathematica notebook version 2.x
+
+
+# Mathematica .mx files
+
+#0	string	(*This\ is\ a\ Mathematica\ binary\ dump\ file.\ It\ can\ be\ loaded\ with\ Get.*)	Mathematica binary file
+0	string	(*This\ is\ a\ Mathematica\ binary\ 	Mathematica binary file
+#>71	string \000\010\010\010\010\000\000\000\000\000\000\010\100\010\000\000\000	
+# >71... is optional
+>88	string	>\0	from %s
+
+
+# Mathematica files PBF:
+# 115 115 101 120 102 106 000 001 000 000 000 203 000 001 000
+0	string	MMAPBF\000\001\000\000\000\203\000\001\000	Mathematica PBF (fonts I think)
+
+# .ml files  These are menu resources I think
+# these start with "[0-9][0-9][0-9]\ A~[0-9][0-9][0-9]\ 
+# how to put that into a magic rule?
+4	string	\ A~	MAthematica .ml file
+
+# .nb files
+#too long 0	string	(***********************************************************************\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Mathematica-Compatible Notebook	Mathematica 3.0 notebook
+0	string	(***********************	Mathematica 3.0 notebook
+
+# other (* matches it is a comment start in these langs
+0	string	(*	Mathematica, or Pascal,  Modula-2 or 3 code text
+
+#########################
+# MatLab v5
+0       string  MATLAB  Matlab v5 mat-file
+>126    short   0x494d  (big endian)
+>>124   beshort x       version 0x%04x
+>126    short   0x4d49  (little endian)
+>>124   leshort x       version 0x%04x
+
+#------------------------------------------------------------------------------
+# Mavroyanopoulos Nikos <nmav at hellug.gr>
+# mcrypt:   file(1) magic for mcrypt 2.2.x;
+0	string		\0m\3		mcrypt 2.5 encrypted data,
+>4	string		>\0		algorithm: %s,
+>>&1	leshort		>0		keysize: %d bytes,
+>>>&0	string		>\0		mode: %s,
+
+0	string		\0m\2		mcrypt 2.2 encrypted data,
+>3	byte		0		algorithm: blowfish-448,
+>3	byte		1		algorithm: DES,
+>3	byte		2		algorithm: 3DES,
+>3	byte		3		algorithm: 3-WAY,
+>3	byte		4		algorithm: GOST,
+>3	byte		6		algorithm: SAFER-SK64,
+>3	byte		7		algorithm: SAFER-SK128,
+>3	byte		8		algorithm: CAST-128,
+>3	byte		9		algorithm: xTEA,
+>3	byte		10		algorithm: TWOFISH-128,
+>3	byte		11		algorithm: RC2,
+>3	byte		12		algorithm: TWOFISH-192,
+>3	byte		13		algorithm: TWOFISH-256,
+>3	byte		14		algorithm: blowfish-128,
+>3	byte		15		algorithm: blowfish-192,
+>3	byte		16		algorithm: blowfish-256,
+>3	byte		100		algorithm: RC6,
+>3	byte		101		algorithm: IDEA,
+>4	byte		0		mode: CBC,
+>4	byte		1		mode: ECB,
+>4	byte		2		mode: CFB,
+>4	byte		3		mode: OFB,
+>4	byte		4		mode: nOFB,
+>5	byte		0		keymode: 8bit
+>5	byte		1		keymode: 4bit
+>5	byte		2		keymode: SHA-1 hash
+>5	byte		3		keymode: MD5 hash
+#------------------------------------------------------------------------------
+# mime:  file(1) magic for MIME encoded files
+#
+0	string		Content-Type:\
+>14	string		>\0		%s
+0	string		Content-Type:
+>13	string		>\0		%s
+
+#------------------------------------------------------------------------------
+# mips:  file(1) magic for Silicon Graphics (MIPS, IRIS, IRIX, etc.)
+#                         Dec Ultrix (MIPS)
+# all of SGI's *current* machines and OSes run in big-endian mode on the
+# MIPS machines, as far as I know.
+#
+# XXX - what is the blank "-" line?
+#
+# kbd file definitions
+0	string	kbd!map		kbd map file
+>8	byte	>0		Ver %d:
+>10	short	>0		with %d table(s)
+0	belong	0407		old SGI 68020 executable
+0	belong	0410		old SGI 68020 pure executable
+0	beshort	0x8765		disk quotas file
+0	beshort	0x0506		IRIS Showcase file
+>2	byte	0x49		-
+>3	byte	x		- version %ld
+0	beshort	0x0226		IRIS Showcase template
+>2	byte	0x63		-
+>3	byte	x		- version %ld
+0	belong	0x5343464d	IRIS Showcase file
+>4	byte	x		- version %ld
+0	belong	0x5443464d	IRIS Showcase template
+>4	byte	x		- version %ld
+0	belong	0xdeadbabe	IRIX Parallel Arena
+>8	belong	>0		- version %ld
+#
+0	beshort	0x0160		MIPSEB ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>22	byte	x		- version %ld
+>23	byte	x		.%ld
+#
+0	beshort	0x0162		MIPSEL-BE ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %d
+>22	byte	x		.%ld
+#
+0	beshort	0x6001		MIPSEB-LE ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %d
+>22	byte	x		.%ld
+#
+0	beshort	0x6201		MIPSEL ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %ld
+>22	byte	x		.%ld
+#
+# MIPS 2 additions
+#
+0	beshort	0x0163		MIPSEB MIPS-II ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>22	byte	x		- version %ld
+>23	byte	x		.%ld
+#
+0	beshort	0x0166		MIPSEL-BE MIPS-II ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>22	byte	x		- version %ld
+>23	byte	x		.%ld
+#
+0	beshort	0x6301		MIPSEB-LE MIPS-II ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %ld
+>22	byte	x		.%ld
+#
+0	beshort	0x6601		MIPSEL MIPS-II ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %ld
+>22	byte	x		.%ld
+#
+# MIPS 3 additions
+#
+0	beshort	0x0140		MIPSEB MIPS-III ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>22	byte	x		- version %ld
+>23	byte	x		.%ld
+#
+0	beshort	0x0142		MIPSEL-BE MIPS-III ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>22	byte	x		- version %ld
+>23	byte	x		.%ld
+#
+0	beshort	0x4001		MIPSEB-LE MIPS-III ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %ld
+>22	byte	x		.%ld
+#
+0	beshort	0x4201		MIPSEL MIPS-III ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %ld
+>22	byte	x		.%ld
+#
+0	beshort	0x180		MIPSEB Ucode
+0	beshort	0x182		MIPSEL-BE Ucode
+# 32bit core file
+0	belong	0xdeadadb0	IRIX core dump
+>4	belong	1		of
+>16	string	>\0		'%s'
+# 64bit core file
+0	belong	0xdeadad40	IRIX 64-bit core dump
+>4	belong	1		of
+>16	string	>\0		'%s'
+# N32bit core file
+0       belong	0xbabec0bb	IRIX N32 core dump
+>4      belong	1               of
+>16     string	>\0             '%s'
+# New style crash dump file
+0	string	\x43\x72\x73\x68\x44\x75\x6d\x70	IRIX vmcore dump of
+>36	string	>\0					'%s'
+# Trusted IRIX info
+0	string	SGIAUDIT	SGI Audit file
+>8	byte	x		- version %d
+>9	byte	x		.%ld
+#
+0	string	WNGZWZSC	Wingz compiled script
+0	string	WNGZWZSS	Wingz spreadsheet
+0	string	WNGZWZHP	Wingz help file
+#
+0	string	\#Inventor V	IRIS Inventor 1.0 file
+0	string	\#Inventor V2	Open Inventor 2.0 file
+# GLF is OpenGL stream encoding
+0	string	glfHeadMagic();		GLF_TEXT
+4	belong	0x7d000000		GLF_BINARY_LSB_FIRST
+4	belong	0x0000007d		GLF_BINARY_MSB_FIRST
+# GLS is OpenGL stream encoding; GLS is the successor of GLF
+0	string	glsBeginGLS(		GLS_TEXT
+4	belong	0x10000000		GLS_BINARY_LSB_FIRST
+4	belong	0x00000010		GLS_BINARY_MSB_FIRST
+
+#------------------------------------------------------------------------------
+# mirage:  file(1) magic for Mirage executables
+#
+# XXX - byte order?
+#
+0	long	31415		Mirage Assembler m.out executable
+#-----------------------------------------------------------------------------
+# misctools:  file(1) magic for miscelanous UNIX tools.
+#
+0	string		%%!!		X-Post-It-Note text
+0	string          BEGIN:VCALENDAR         vCalendar calendar file
+
+#------------------------------------------------------------------------------
+# mkid:  file(1) magic for mkid(1) databases
+#
+# ID is the binary tags database produced by mkid(1).
+#
+# XXX - byte order?
+#
+0	string		\311\304	ID tags data
+>2	short		>0		version %d
+
+#------------------------------------------------------------------------------
+# mlssa: file(1) magic for MLSSA datafiles
+#
+0		lelong		0xffffabcd	MLSSA datafile,
+>4		leshort		x		algorithm %d,
+>10		lelong		x		%d samples
+
+#------------------------------------------------------------------------------
+# mmdf:  file(1) magic for MMDF mail files
+#
+0	string	\001\001\001\001	MMDF mailbox
+#------------------------------------------------------------------------------
+# msad:  file(1) magic for msad
+# Microsoft visual C
+# This must precede the heuristic for raw G3 data
+4	string	Standard\ Jet\ DB	Microsoft Access Database
+
+#------------------------------------------------------------------------------
+# motorola:  file(1) magic for Motorola 68K and 88K binaries
+#
+# 68K
+#
+0	beshort		0520		mc68k COFF
+>18	beshort		^00000020	object
+>18	beshort		&00000020	executable
+>12	belong		>0		not stripped
+>168	string		.lowmem		Apple toolbox
+>20	beshort		0407		(impure)
+>20	beshort		0410		(pure)
+>20	beshort		0413		(demand paged)
+>20	beshort		0421		(standalone)
+0	beshort		0521		mc68k executable (shared)
+>12	belong		>0		not stripped
+0	beshort		0522		mc68k executable (shared demand paged)
+>12	belong		>0		not stripped
+#
+# Motorola/UniSoft 68K Binary Compatibility Standard (BCS)
+#
+0	beshort		0554		68K BCS executable
+#
+# 88K
+#
+# Motorola/88Open BCS
+#
+0	beshort		0555		88K BCS executable
+#
+# Motorola S-Records, from Gerd Truschinski <gt at freebsd.first.gmd.de>
+0   string      S0          Motorola S-Record; binary data in text format
+
+# ATARI ST relocatable PRG
+#
+# from Oskar Schirmer <schirmer at scara.com> Feb 3, 2001
+# (according to Roland Waldi, Oct 21, 1987)
+# besides the magic 0x601a, the text segment size is checked to be
+# not larger than 1 MB (which is a lot on ST).
+# The additional 0x601b distinction I took from Doug Lee's magic.
+0	belong&0xFFFFFFF0	0x601A0000	Atari ST M68K contiguous executable
+>2	belong			x		(txt=%ld,
+>6	belong			x		dat=%ld,
+>10	belong			x		bss=%ld,
+>14	belong			x		sym=%ld)
+0	belong&0xFFFFFFF0	0x601B0000	Atari ST M68K non-contig executable
+>2	belong			x		(txt=%ld,
+>6	belong			x		dat=%ld,
+>10	belong			x		bss=%ld,
+>14	belong			x		sym=%ld)
+
+# Atari ST/TT... program format (sent by Wolfram Kleff <kleff at cs.uni-bonn.de>)
+0       beshort         0x601A          Atari 68xxx executable,
+>2      belong          x               text len %lu,
+>6      belong          x               data len %lu,
+>10     belong          x               BSS len %lu,
+>14     belong          x               symboltab len %lu,
+>18     belong          0
+>22     belong          &0x01           fastload flag,
+>22     belong          &0x02           may be loaded to alternate RAM,
+>22     belong          &0x04           malloc may be from alternate RAM,
+>22     belong          x               flags: 0x%lX,
+>26     beshort         0               no relocation tab
+>26     beshort         !0              + relocation tab
+>30     string          SFX             [Self-Extracting LZH SFX archive]
+>38     string          SFX             [Self-Extracting LZH SFX archive]
+>44     string          ZIP!            [Self-Extracting ZIP SFX archive]
+
+0       beshort         0x0064          Atari 68xxx CPX file
+>8      beshort         x               (version %04lx)
+
+#------------------------------------------------------------------------------
+# msdos:  file(1) magic for MS-DOS files
+#
+
+# .BAT files (Daniel Quinlan, quinlan at yggdrasil.com)
+0	string/c	@echo\ off	MS-DOS batch file text
+
+# XXX - according to Microsoft's spec, at an offset of 0x3c in a
+# PE-format executable is the offset in the file of the PE header;
+# unfortunately, that's a little-endian offset, and there's no way
+# to specify an indirect offset with a specified byte order.
+# So, for now, we assume the standard MS-DOS stub, which puts the
+# PE header at 0x80 = 128.
+#
+# Required OS version and subsystem version were 4.0 on some NT 3.51
+# executables built with Visual C++ 4.0, so it's not clear that
+# they're interesting.  The user version was 0.0, but there's
+# probably some linker directive to set it.  The linker version was
+# 3.0, except for one ".exe" which had it as 4.20 (same damn linker!).
+#
+128	string		PE\0\0	MS Windows PE
+>150	leshort&0x0100	>0	32-bit
+>132	leshort		0x0	unknown processor
+>132	leshort		0x14c	Intel 80386
+>132	leshort		0x166	MIPS R4000
+>132	leshort		0x184	Alpha
+>132	leshort		0x268	Motorola 68000
+>132	leshort		0x1f0	PowerPC
+>132	leshort		0x290	PA-RISC
+>148	leshort		>27
+>>220	leshort		0	unknown subsystem
+>>220	leshort		1	native
+>>220	leshort		2	GUI
+>>220	leshort		3	console
+>>220	leshort		7	POSIX
+>150	leshort&0x2000	=0	executable
+#>>136	ledate		x	stamp %s,
+>>150	leshort&0x0001	>0	not relocatable
+#>>150	leshort&0x0004	=0	with line numbers,
+#>>150	leshort&0x0008	=0	with local symbols,
+#>>150	leshort&0x0200	=0	with debug symbols,
+>>150	leshort&0x1000	>0	system file
+#>>148	leshort		>0
+#>>>154	byte		x	linker %d
+#>>>155	byte		x	\b.%d,
+#>>148	leshort		>27
+#>>>192	leshort		x	requires OS %d
+#>>>194	leshort		x	\b.%d,
+#>>>196	leshort		x	user version %d
+#>>>198	leshort		x	\b.%d,
+#>>>200	leshort		x	subsystem version %d
+#>>>202	leshort		x	\b.%d,
+>150	leshort&0x2000	>0	DLL
+#>>136	ledate		x	stamp %s,
+>>150	leshort&0x0001	>0	not relocatable
+#>>150	leshort&0x0004	=0	with line numbers,
+#>>150	leshort&0x0008	=0	with local symbols,
+#>>150	leshort&0x0200	=0	with debug symbols,
+>>150	leshort&0x1000	>0	system file
+#>>148	leshort		>0
+#>>>154	byte		x	linker %d
+#>>>155	byte		x	\b.%d,
+#>>148	leshort		>27
+#>>>192	leshort		x	requires OS %d
+#>>>194	leshort		x	\b.%d,
+#>>>196	leshort		x	user version %d
+#>>>198	leshort		x	\b.%d,
+#>>>200	leshort		x	subsystem version %d
+#>>>202	leshort		x	\b.%d,
+0	leshort		0x14c	MS Windows COFF Intel 80386 object file
+#>4	ledate		x	stamp %s
+0	leshort		0x166	MS Windows COFF MIPS R4000 object file
+#>4	ledate		x	stamp %s
+0	leshort		0x184	MS Windows COFF Alpha object file
+#>4	ledate		x	stamp %s
+0	leshort		0x268	MS Windows COFF Motorola 68000 object file
+#>4	ledate		x	stamp %s
+0	leshort		0x1f0	MS Windows COFF PowerPC object file
+#>4	ledate		x	stamp %s
+0	leshort		0x290	MS Windows COFF PA-RISC object file
+#>4	ledate		x	stamp %s
+
+# .EXE formats (Greg Roelofs, newt at uchicago.edu)
+#
+0	string	MZ		MS-DOS executable (EXE)
+>24	string	@		\b, OS/2 or MS Windows
+>>0xe7	string	LH/2\ Self-Extract	\b, %s
+>>0xe9	string	PKSFX2		\b, %s
+>>0x7a	string	Windows\ self-extracting\ ZIP	\b, %s
+>0x1c	string	RJSX\xff\xff	\b, ARJ SFX
+>0x1c	string	diet\xf9\x9c	\b, diet compressed
+>0x1c	string	LZ09		\b, LZEXE v0.90 compressed
+>0x1c	string	LZ91		\b, LZEXE v0.91 compressed
+>0x1e	string	Copyright\ 1989-1990\ PKWARE\ Inc.	\b, PKSFX
+# JM: 0x1e "PKLITE Copr. 1990-92 PKWARE Inc. All Rights Reserved\7\0\0\0"
+>0x1e	string	PKLITE\ Copr.	\b, %.6s compressed
+>0x24	string	LHa's\ SFX	\b, %.15s
+>0x24	string	LHA's\ SFX	\b, %.15s
+>1638	string	-lh5-		\b, LHa SFX archive v2.13S
+>7195	string	Rar!		\b, RAR self-extracting archive
+#
+# [GRR 950118:  file 3.15 has a buffer-size limitation; offsets bigger than
+#   8161 bytes are ignored.  To make the following entries work, increase
+#   HOWMANY in file.h to 32K at least, and maybe to 70K or more for OS/2,
+#   NT/Win32 and VMS.]
+# [GRR:  some company sells a self-extractor/displayer for image data(!)]
+#
+>11696	string	PK\003\004	\b, PKZIP SFX archive v1.1
+>13297	string	PK\003\004	\b, PKZIP SFX archive v1.93a
+>15588	string	PK\003\004	\b, PKZIP2 SFX archive v1.09
+>15770	string	PK\003\004	\b, PKZIP SFX archive v2.04g
+>28374	string	PK\003\004	\b, PKZIP2 SFX archive v1.02
+#
+# Info-ZIP self-extractors
+#    these are the DOS versions:
+>25115	string	PK\003\004	\b, Info-ZIP SFX archive v5.12
+>26331	string	PK\003\004	\b, Info-ZIP SFX archive v5.12 w/decryption
+#    these are the OS/2 versions (OS/2 is flagged above):
+>47031	string	PK\003\004	\b, Info-ZIP SFX archive v5.12
+>49845	string	PK\003\004	\b, Info-ZIP SFX archive v5.12 w/decryption
+#    this is the NT/Win32 version:
+>69120	string	PK\003\004	\b, Info-ZIP NT SFX archive v5.12 w/decryption
+#
+# TELVOX Teleinformatica CODEC self-extractor for OS/2:
+>49801	string	\x79\xff\x80\xff\x76\xff	\b, CODEC archive v3.21
+>>49824	leshort		=1			\b, 1 file
+>>49824	leshort		>1			\b, %u files
+
+# .COM formats (Daniel Quinlan, quinlan at yggdrasil.com)
+# Uncommenting only the first two lines will cover about 2/3 of COM files,
+# but it isn't feasible to match all COM files since there must be at least
+# two dozen different one-byte "magics".
+#0	byte		0xe9		MS-DOS executable (COM)
+#>6	string	SFX\ of\ LHarc	(%s)
+#0	byte		0x8c		MS-DOS executable (COM)
+# 0xeb conflicts with "sequent" magic
+#0	byte		0xeb		MS-DOS executable (COM)
+#0	byte		0xb8		MS-DOS executable (COM)
+
+# miscellaneous formats
+0	string		LZ		MS-DOS executable (built-in)
+#0	byte		0xf0		MS-DOS program library data
+#
+
+#
+# Windows Registry files.
+#
+0	string		regf		Windows NT registry file
+0	string		CREG		Windows 95 registry file
+
+# Popular applications
+2080	string	Microsoft\ Word\ 6.0\ Document	%s
+2080	string	Documento\ Microsoft\ Word\ 6 Spanish Microsoft Word 6 document data
+# Pawel Wiecek <coven at i17linuxb.ists.pwr.wroc.pl> (for polish Word)
+2112	string	MSWordDoc			Microsoft Word document data
+#
+0	belong	0x31be0000			Microsoft Word Document
+#
+0       string  PO^Q`				Microsoft Word 6.0 Document
+#
+0	string	\376\067\0\043			Microsoft Office Document
+0	string	\320\317\021\340\241\261\032\341	Microsoft Office Document
+0	string	\333\245-\0\0\0			Microsoft Office Document
+#
+2080	string	Microsoft\ Excel\ 5.0\ Worksheet	%s
+#
+# Pawel Wiecek <coven at i17linuxb.ists.pwr.wroc.pl> (for polish Excel)
+2114	string	Biff5		Microsoft Excel 5.0 Worksheet
+#
+0	belong	0x00001a00	Lotus 1-2-3
+>4	belong	0x00100400	wk3 document data
+>4	belong	0x02100400	wk4 document data
+>4	belong	0x07800100	fm3 or fmb document data
+>4	belong	0x07800000	fm3 or fmb document data
+#
+0	belong	0x00000200 	Lotus 1-2-3
+>4	belong	0x06040600	wk1 document data
+>4	belong	0x06800200	fmt document data
+
+# Help files
+0	string	?_\3\0		MS Windows Help Data
+
+#  DeIsL1.isu what this is I don't know
+0	string	\161\250\000\000\001\002	DeIsL1.isu whatever that is
+
+# Winamp .avs
+#0	string	Nullsoft\ AVS\ Preset\ \060\056\061\032	A plug in for Winamp ms-windows Freeware media player
+0	string	Nullsoft\ AVS\ Preset\ 	Winamp plug in
+
+# Hyper terminal:
+0	string	HyperTerminal\ 	hyperterm
+>15	string	1.0\ --\ HyperTerminal\ data\ file	MS-windows Hyperterminal
+
+# Windows Metafont .WMF
+0	string	\327\315\306\232\000\000\000\000\000\000	ms-windows metafont .wmf
+
+#tz3 files whatever that is (MS Works files)
+0	string	\003\001\001\004\070\001\000\000	tz3 ms-works file
+0	string	\003\002\001\004\070\001\000\000	tz3 ms-works file
+0	string	\003\003\001\004\070\001\000\000	tz3 ms-works file
+
+# PGP sig files .sig
+#0 string \211\000\077\003\005\000\063\237\127 065 to  \027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\065\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\066\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\067\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\070\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\071\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\225\003\005\000\062\122\207\304\100\345\042 PGP sig
+
+# windows zips files .dmf
+0	string	MDIF\032\000\010\000\000\000\372\046\100\175\001\000\001\036\001\000 Ms-windows special zipped file
+
+
+# Windows help file FTG FTS
+0	string	\164\146\115\122\012\000\000\000\001\000\000\000	ms-windows help cache
+
+# grp old windows 3.1 group files
+0 string  \120\115\103\103	Ms-windows 3.1 group files
+
+
+# lnk files windows symlinks
+0	string	\114\000\000\000\001\024\002\000\000\000\000\000\300\000\000\000\000\000\000\106	ms-Windows shortcut
+
+#ico files
+0	string	\102\101\050\000\000\000\056\000\000\000\000\000\000\000	Icon for ms-windows
+
+# Windows icons (Ian Springer <ips at fpk.hp.com>)
+0	string	\000\000\001\000	ms-windows icon resource
+>4	byte	1			- 1 icon
+>4	byte	>1			- %d icons
+>>6	byte	>0			\b, %dx
+>>>7	byte	>0			\b%d
+>>8	byte	0			\b, 256-colors
+>>8	byte	>0			\b, %d-colors
+
+
+# .chr files
+0	string	PK\010\010BGI	Borland font 
+>4	string	>\0	%s
+# then there is a copyright notice
+
+
+# .bgi files
+0	string	pk\010\010BGI	Borland device 
+>4	string	>\0	%s
+# then there is a copyright notice
+
+
+# recycled/info the windows trash bin index
+9	string	\000\000\000\030\001\000\000\000 ms-windows recycled bin info
+
+
+##### put in Either Magic/font or Magic/news
+# Acroread or something  files wrongly identified as G3  .pfm
+# these have the form \000 \001 any? \002 \000 \000
+# or \000 \001 any? \022 \000 \000
+0	belong&0xffff00ff	0x00010012	PFM data
+>4	string			\000\000
+>6	string			>\060		- %s
+
+0	belong&0xffff00ff	0x00010002	PFM data
+>4	string			\000\000
+>6	string			>\060		- %s
+#0	string  \000\001 pfm?
+#>3	string  \022\000\000Copyright\  yes
+#>3	string  \002\000\000Copyright\  yes
+#>3	string  >\0     oops, not a font file. Cancel that.
+#it clashes with ttf files so put it lower down.
+
+# From Doug Lee via a FreeBSD pr
+9	string		GERBILDOC	First Choice document
+9	string		GERBILDB	First Choice database
+9	string		GERBILCLIP	First Choice database
+0	string		GERBIL		First Choice device file
+9	string		RABBITGRAPH	RabbitGraph file
+0	string		DCU1		Borland Delphi .DCU file
+0	string		!<spell>	MKS Spell hash list (old format)
+0	string		!<spell2>	MKS Spell hash list
+# Too simple - MPi
+#0	string		AH		Halo(TM) bitmapped font file
+0	lelong		0x08086b70	TurboC BGI file
+0	lelong		0x08084b50	TurboC Font file
+
+# WARNING: below line conflicts with Infocom game data Z-machine 3
+0	byte		0x03		DBase 3 data file
+>0x04	lelong		0		(no records)
+>0x04	lelong		>0		(%ld records)
+0	byte		0x83		DBase 3 data file with memo(s)
+>0x04	lelong		0		(no records)
+>0x04	lelong		>0		(%ld records)
+0	leshort		0x0006		DBase 3 index file
+0	string		PMCC		Windows 3.x .GRP file
+1	string		RDC-meg		MegaDots 
+>8	byte		>0x2F		version %c
+>9	byte		>0x2F		\b.%c file
+0	lelong		0x4C
+>4	lelong		0x00021401	Windows shortcut file
+
+# DOS EPS Binary File Header
+# From: Ed Sznyter <ews at Black.Market.NET>
+0	belong		0xC5D0D3C6	DOS EPS Binary File
+>4	long		>0		Postscript starts at byte %d
+>>8	long		>0		length %d
+>>>12	long		>0		Metafile starts at byte %d
+>>>>16	long		>0		length %d
+>>>20	long		>0		TIFF starts at byte %d
+>>>>24	long		>0		length %d
+
+# TNEF magic From "Joomy" <joomy at se-ed.net> 
+0	leshort		0x223e9f78	TNEF
+
+# HtmlHelp files (.chm)
+0	string  ITSF\003\000\000\000\x60\000\000\000\001\000\000\000	MS Windows HtmlHelp Data
+
+# GFA-BASIC (Wolfram Kleff)
+2	string		GFA-BASIC3	GFA-BASIC 3 data
+
+# DJGPP compiled files
+# v >2, uses DPMI & small(2k) stub (Robert vd Boon, rjvdboon at europe.com)
+0x200	string		go32stub	DOS-executable compiled w/DJGPP
+>0x20c	string		>0		(stub v%.4s)
+>>0x8b2	string		djp		[compressed w/%s
+>>>&1	string		>\0		%.4s]
+>>0x8ad	string		UPX		[compressed w/%s
+>>>&1	string		>\0		%.4s]
+>>0x1c	string		pmodedj		stubbed with %s
+
+# QDOS
+4	belong		0x4AFB		QDOS executable
+>9	pstring		x		'%s'
+0	beshort		0xFB01		QDOS object
+>2	pstring		x		'%s'
+
+#------------------------------------------------------------------------------
+# From Stuart Caie <kyzer at 4u.net> (developer of cabextract)
+# Microsoft Cabinet files
+0	string		MSCF\0\0\0\0	Microsoft Cabinet file
+>8	lelong		x		\b, %u bytes
+>28	leshort		1		\b, 1 file
+>28	leshort		>1		\b, %u files
+
+# InstallShield Cabinet files
+0	string		ISc(		InstallShield Cabinet file
+>5	byte&0xf0	=0x60 		version 6,
+>5	byte&0xf0	!0x60 		version 4/5,
+>(12.l+40)	lelong	x		%u files
+
+# Windows CE package files
+0	string		MSCE\0\0\0\0	Microsoft WinCE install header
+>20	lelong		0		\b, architecture-independent
+>20	lelong		103		\b, Hitachi SH3
+>20	lelong		104		\b, Hitachi SH4
+>20	lelong		0xA11		\b, StrongARM
+>20	lelong		4000		\b, MIPS R4000
+>20	lelong		10003		\b, Hitachi SH3
+>20	lelong		10004		\b, Hitachi SH3E
+>20	lelong		10005		\b, Hitachi SH4
+>20	lelong		70001		\b, ARM 7TDMI
+>52	leshort		1 		\b, 1 file
+>52	leshort		>1 		\b, %u files
+>56	leshort		1 		\b, 1 registry entry
+>56	leshort		>1 		\b, %u registry entries
+
+# Outlook Personal Folders
+0	lelong	0x4E444221	Microsoft Outlook binary email folder
+
+# From: Dirk Jagdmann <doj at cubic.org>
+0	lelong	0x00035f3f	Windows 3.x help file
+
+#------------------------------------------------------------------------------
+# modem:  file(1) magic for modem programs
+#
+# From: Florian La Roche <florian at knorke.saar.de>
+1	string		PC\ Research,\ Inc	Digifax-G3-File
+>29	byte		1		\b, fine resolution
+>29	byte		0		\b, normal resolution
+
+0	short		0x0100		raw G3 data, byte-padded
+0	short		0x1400		raw G3 data
+#
+# Magic data for vgetty voice formats
+# (Martin Seine & Marc Eberhard)
+
+#
+# raw modem data version 1
+#
+0    string    RMD1      raw modem data
+>4   string    >\0       (%s /
+>20  short     >0        compression type 0x%04x)
+
+#
+# portable voice format 1
+#
+0    string    PVF1\n         portable voice format
+>5   string    >\0       (binary %s)
+
+#
+# portable voice format 2
+#
+0    string    PVF2\n         portable voice format
+>5   string >\0          (ascii %s)
+
+
+#------------------------------------------------------------------------------
+# msvc:  file(1) magic for msvc
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Microsoft visual C
+# 
+# I have version 1.0
+
+# .aps
+0	string	HWB\000\377\001\000\000\000	Microsoft Visual C .APS file
+
+# .ide
+#too long 0	string	\102\157\162\154\141\156\144\040\103\053\053\040\120\162\157\152\145\143\164\040\106\151\154\145\012\000\032\000\002\000\262\000\272\276\372\316	MSVC .ide
+0	string	\102\157\162\154\141\156\144\040\103\053\053\040\120\162\157	MSVC .ide
+
+# .res
+0	string	\000\000\000\000\040\000\000\000\377	MSVC .res
+0	string	\377\003\000\377\001\000\020\020\350	MSVC .res
+0	string	\377\003\000\377\001\000\060\020\350	MSVC .res
+
+#.lib
+0	string	\360\015\000\000	Microsoft Visual C library
+0	string	\360\075\000\000	Microsoft Visual C library
+0	string	\360\175\000\000	Microsoft Visual C library
+
+#.pch
+0	string	DTJPCH0\000\022\103\006\200	Microsoft Visual C .pch
+
+# .pdb
+# too long 0	string	Microsoft\ C/C++\ program\ database\ 
+0	string	Microsoft\ C/C++\ 	MSVC program database
+>18	string	program\ database\ 	
+>33	string	>\0	ver %s
+
+#.sbr
+0	string	\000\002\000\007\000	MSVC .sbr
+>5	string 	>\0	%s
+
+#.bsc
+0	string	\002\000\002\001	MSVC .bsc
+
+#.wsp
+0	string	1.00\ .0000.0000\000\003	MSVC .wsp version 1.0000.0000
+# these seem to start with the version and contain menus
+
+#-----------------------------------------------------------------------------
+# natinst:  file(1) magic for National Instruments Code Files
+
+#
+# From <egamez at fcfm.buap.mx> Enrique G�mez-Flores
+# version 1
+# Many formats still missing, we use, for the moment LabVIEW
+# We guess VXI format file. VISA, LabWindowsCVI, BridgeVIEW, etc, are missing
+#
+0       string          RSRC            National Instruments,
+# Check if it's a LabVIEW File
+>8      string          LV              LabVIEW File,
+# Check wich kind of file is
+>>10    string          SB              Code Resource File, data
+>>10    string          IN              Virtual Instrument Program, data
+>>10    string          AR              VI Library, data
+# This is for Menu Libraries
+>8      string          LMNULBVW        Portable File Names, data
+# This is for General Resources
+>8      string          rsc             Resources File, data
+# This is for VXI Package
+0       string          VMAP            National Instruments, VXI File, data
+
+#------------------------------------------------------------------------------
+# ncr:  file(1) magic for NCR Tower objects
+#
+# contributed by
+# Michael R. Wayne  ***  TMC & Associates  ***  INTERNET: wayne at ford-vax.arpa
+# uucp: {philabs | pyramid} !fmsrl7!wayne   OR   wayne at fmsrl7.UUCP
+#
+0	beshort		000610	Tower/XP rel 2 object
+>12	   belong		>0	not stripped
+>20	   beshort		0407	executable
+>20	   beshort		0410	pure executable
+>22	   beshort		>0	- version %ld
+0	beshort		000615	Tower/XP rel 2 object
+>12	   belong		>0	not stripped
+>20	   beshort		0407	executable
+>20	   beshort		0410	pure executable
+>22	   beshort		>0	- version %ld
+0	beshort		000620	Tower/XP rel 3 object
+>12	   belong		>0	not stripped
+>20	   beshort		0407	executable
+>20	   beshort		0410	pure executable
+>22	   beshort		>0	- version %ld
+0	beshort		000625	Tower/XP rel 3 object
+>12	   belong		>0	not stripped
+>20	   beshort		0407	executable
+>20	   beshort		0410	pure executable
+>22	   beshort		>0	- version %ld
+0	beshort		000630	Tower32/600/400 68020 object
+>12	   belong		>0	not stripped
+>20	   beshort		0407	executable
+>20	   beshort		0410	pure executable
+>22	   beshort		>0	- version %ld
+0	beshort		000640	Tower32/800 68020
+>18	   beshort		&020000	w/68881 object
+>18	   beshort		&040000	compatible object
+>18	   beshort		&~060000	object
+>20	   beshort		0407	executable
+>20	   beshort		0413	pure executable
+>12	   belong		>0	not stripped
+>22	   beshort		>0	- version %ld
+0	beshort		000645	Tower32/800 68010
+>18	   beshort		&040000	compatible object
+>18	   beshort		&~060000 object
+>20	   beshort		0407	executable
+>20	   beshort		0413	pure executable
+>12	   belong		>0	not stripped
+>22	   beshort		>0	- version %ld
+
+#------------------------------------------------------------------------------
+# netbsd:  file(1) magic for NetBSD objects
+#
+# All new-style magic numbers are in network byte order.
+#
+
+0	lelong			000000407	a.out NetBSD little-endian object file
+>16	lelong			>0		not stripped
+0	belong			000000407	a.out NetBSD big-endian object file
+>16	belong			>0		not stripped
+
+0	belong&0377777777	041400413	a.out NetBSD/i386 demand paged
+>0	byte			&0x80		
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	041400410	a.out NetBSD/i386 pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	041400407	a.out NetBSD/i386
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+0	belong&0377777777	041400507	a.out NetBSD/i386 core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+0	belong&0377777777	041600413	a.out NetBSD/m68k demand paged
+>0	byte			&0x80		
+>>20	belong			<8192		shared library
+>>20	belong			=8192		dynamically linked executable
+>>20	belong			>8192		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	041600410	a.out NetBSD/m68k pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	041600407	a.out NetBSD/m68k
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	belong			!0		executable
+>>20	belong			=0		object file
+>16	belong			>0		not stripped
+0	belong&0377777777	041600507	a.out NetBSD/m68k core
+>12	string			>\0		from '%s'
+>32	belong			!0		(signal %d)
+
+0	belong&0377777777	042000413	a.out NetBSD/m68k4k demand paged
+>0	byte			&0x80		
+>>20	belong			<4096		shared library
+>>20	belong			=4096		dynamically linked executable
+>>20	belong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	042000410	a.out NetBSD/m68k4k pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	042000407	a.out NetBSD/m68k4k
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	belong			!0		executable
+>>20	belong			=0		object file
+>16	belong			>0		not stripped
+0	belong&0377777777	042000507	a.out NetBSD/m68k4k core
+>12	string			>\0		from '%s'
+>32	belong			!0		(signal %d)
+
+0	belong&0377777777	042200413	a.out NetBSD/ns32532 demand paged
+>0	byte			&0x80		
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	042200410	a.out NetBSD/ns32532 pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	042200407	a.out NetBSD/ns32532
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+0	belong&0377777777	042200507	a.out NetBSD/ns32532 core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+0	belong&0377777777	045200507	a.out NetBSD/powerpc core
+>12	string			>\0		from '%s'
+
+0	belong&0377777777	042400413	a.out NetBSD/SPARC demand paged
+>0	byte			&0x80		
+>>20	belong			<8192		shared library
+>>20	belong			=8192		dynamically linked executable
+>>20	belong			>8192		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	042400410	a.out NetBSD/SPARC pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	042400407	a.out NetBSD/SPARC
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	belong			!0		executable
+>>20	belong			=0		object file
+>16	belong			>0		not stripped
+0	belong&0377777777	042400507	a.out NetBSD/SPARC core
+>12	string			>\0		from '%s'
+>32	belong			!0		(signal %d)
+
+0	belong&0377777777	042600413	a.out NetBSD/pmax demand paged
+>0	byte			&0x80		
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	042600410	a.out NetBSD/pmax pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	042600407	a.out NetBSD/pmax
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+0	belong&0377777777	042600507	a.out NetBSD/pmax core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+0	belong&0377777777	043000413	a.out NetBSD/vax 1k demand paged
+>0	byte			&0x80		
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	043000410	a.out NetBSD/vax 1k pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	043000407	a.out NetBSD/vax 1k
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+0	belong&0377777777	043000507	a.out NetBSD/vax 1k core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+0	belong&0377777777	045400413	a.out NetBSD/vax 4k demand paged
+>0	byte			&0x80		
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	045400410	a.out NetBSD/vax 4k pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	045400407	a.out NetBSD/vax 4k
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+0	belong&0377777777	045400507	a.out NetBSD/vax 4k core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+# NetBSD/alpha does not support (and has never supported) a.out objects,
+# so no rules are provided for them.  NetBSD/alpha ELF objects are 
+# dealt with in "elf".
+0	lelong		0x00070185		ECOFF NetBSD/alpha binary
+>10	leshort		0x0001			not stripped
+>10	leshort		0x0000			stripped
+0	belong&0377777777	043200507	a.out NetBSD/alpha core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+0	belong&0377777777	043400413	a.out NetBSD/mips demand paged
+>0	byte			&0x80		
+>>20	belong			<8192		shared library
+>>20	belong			=8192		dynamically linked executable
+>>20	belong			>8192		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	043400410	a.out NetBSD/mips pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	043400407	a.out NetBSD/mips
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	belong			!0		executable
+>>20	belong			=0		object file
+>16	belong			>0		not stripped
+0	belong&0377777777	043400507	a.out NetBSD/mips core
+>12	string			>\0		from '%s'
+>32	belong			!0		(signal %d)
+
+0	belong&0377777777	043600413	a.out NetBSD/arm32 demand paged
+>0	byte			&0x80
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	043600410	a.out NetBSD/arm32 pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	043600407	a.out NetBSD/arm32
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+# NetBSD/arm26 has always used ELF objects, but it shares a core file
+# format with NetBSD/arm32.
+0	belong&0377777777	043600507	a.out NetBSD/arm core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+#------------------------------------------------------------------------------
+# netscape:  file(1) magic for Netscape files
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# version 3 and 4 I think
+#
+
+# Netscape Address book  .nab
+0	string \000\017\102\104\000\000\000\000\000\000\001\000\000\000\000\002\000\000\000\002\000\000\004\000 Netscape Address book
+
+# Netscape Communicator address book
+0   string   \000\017\102\111 Netscape Communicator address book
+
+# .snm Caches
+0	string		#\ Netscape\ folder\ cache	Netscape folder cache
+0	string	\000\036\204\220\000	Netscape folder cache
+# .n2p 
+# Net 2 Phone 
+#0	string	123\130\071\066\061\071\071\071\060\070\061\060\061\063\060
+0	string	SX961999	Net2phone
+
+#
+#This is files ending in .art, FIXME add more rules
+0       string          JG\004\016\0\0\0\0      ART
+
+#------------------------------------------------------------------------------
+# news:  file(1) magic for SunOS NeWS fonts (not "news" as in "netnews")
+#
+0	string		StartFontMetrics	ASCII font metrics
+0	string		StartFont	ASCII font bits
+0	belong		0x137A2944	NeWS bitmap font
+0	belong		0x137A2947	NeWS font family
+0	belong		0x137A2950	scalable OpenFont binary
+0	belong		0x137A2951	encrypted scalable OpenFont binary
+8	belong		0x137A2B45	X11/NeWS bitmap font
+8	belong		0x137A2B48	X11/NeWS font family
+#------------------------------------------------------------------------------
+# nitpicker:  file(1) magic for Flowfiles.
+# From: Christian Jachmann <C.Jachmann at gmx.net> http://www.nitpicker.de
+0	string	NPFF	NItpicker Flow File 
+>4	byte	x	V%d.
+>5	byte	x	%d
+>6	bedate	x	started: %s
+>10	bedate	x	stopped: %s
+>14	belong	x	Bytes: %u
+>18	belong	x	Bytes1: %u
+>22	belong	x	Flows: %u
+>26	belong	x	Pkts: %u
+
+#------------------------------------------------------------------------------
+# ocaml: file(1) magic for Objective Caml files.
+0	string	Caml1999	Objective caml
+>8	string	X		exec file
+>8	string	I		interface file (.cmi)
+>8	string	O		object file (.cmo)
+>8	string	A		library file (.cma)
+>8	string	Y		native object file (.cmx)
+>8	string	Z		native library file (.cmxa)
+>8	string	M		abstract syntax tree implementation file
+>8	string	N		abstract syntax tree interface file
+>9	string	>\0		(Version %3.3s).
+#------------------------------------------------------------------------------
+# octave binary data file(1) magic, from Dirk Eddelbuettel <edd at debian.org>
+0	string		Octave-1-L	Octave binary data (little endian)
+0	string		Octave-1-B	Octave binary data (big endian)
+
+#------------------------------------------------------------------------------
+# olf:  file(1) magic for OLF executables
+#
+# We have to check the byte order flag to see what byte order all the
+# other stuff in the header is in.
+#
+# MIPS R3000 may also be for MIPS R2000.
+# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
+#
+# Created by Erik Theisen <etheisen at openbsd.org>
+# Based on elf from Daniel Quinlan <quinlan at yggdrasil.com>
+0	string		\177OLF		OLF
+>4	byte		0		invalid class
+>4	byte		1		32-bit
+>4	byte		2		64-bit
+>7	byte		0		invalid os
+>7	byte		1		OpenBSD
+>7	byte		2		NetBSD
+>7	byte		3		FreeBSD
+>7	byte		4		4.4BSD
+>7	byte		5		Linux
+>7	byte		6		SVR4
+>7	byte		7		esix
+>7	byte		8		Solaris
+>7	byte		9		Irix
+>7	byte		10		SCO
+>7	byte		11		Dell
+>7	byte		12		NCR
+>5	byte		0		invalid byte order
+>5	byte		1		LSB
+>>16	leshort		0		no file type,
+>>16	leshort		1		relocatable,
+>>16	leshort		2		executable,
+>>16	leshort		3		shared object,
+# Core handling from Peter Tobias <tobias at server.et-inf.fho-emden.de>
+# corrections by Christian 'Dr. Disk' Hechelmann <drdisk at ds9.au.s.shuttle.de>
+>>16	leshort		4		core file
+>>>(0x38+0xcc) string	>\0		of '%s'
+>>>(0x38+0x10) lelong	>0		(signal %d),
+>>16	leshort		&0xff00		processor-specific,
+>>18	leshort		0		no machine,
+>>18	leshort		1		AT&T WE32100 - invalid byte order,
+>>18	leshort		2		SPARC - invalid byte order,
+>>18	leshort		3		Intel 80386,
+>>18	leshort		4		Motorola 68000 - invalid byte order,
+>>18	leshort		5		Motorola 88000 - invalid byte order,
+>>18	leshort		6		Intel 80486,
+>>18	leshort		7		Intel 80860,
+>>18	leshort		8		MIPS R3000_BE - invalid byte order,
+>>18	leshort		9		Amdahl - invalid byte order,
+>>18	leshort		10		MIPS R3000_LE,
+>>18	leshort		11		RS6000 - invalid byte order,
+>>18	leshort		15		PA-RISC - invalid byte order,
+>>18	leshort		16		nCUBE,
+>>18	leshort		17		VPP500,
+>>18	leshort		18		SPARC32PLUS,
+>>18	leshort		20		PowerPC,
+>>18	leshort		0x9026		Alpha,
+>>20	lelong		0		invalid version
+>>20	lelong		1		version 1
+>>36	lelong		1		MathCoPro/FPU/MAU Required
+>8	string		>\0		(%s)
+>5	byte		2		MSB
+>>16	beshort		0		no file type,
+>>16	beshort		1		relocatable,
+>>16	beshort		2		executable,
+>>16	beshort		3		shared object,
+>>16	beshort		4		core file,
+>>>(0x38+0xcc) string	>\0		of '%s'
+>>>(0x38+0x10) belong	>0		(signal %d),
+>>16	beshort		&0xff00		processor-specific,
+>>18	beshort		0		no machine,
+>>18	beshort		1		AT&T WE32100,
+>>18	beshort		2		SPARC,
+>>18	beshort		3		Intel 80386 - invalid byte order,
+>>18	beshort		4		Motorola 68000,
+>>18	beshort		5		Motorola 88000,
+>>18	beshort		6		Intel 80486 - invalid byte order,
+>>18	beshort		7		Intel 80860,
+>>18	beshort		8		MIPS R3000_BE,
+>>18	beshort		9		Amdahl,
+>>18	beshort		10		MIPS R3000_LE - invalid byte order,
+>>18	beshort		11		RS6000,
+>>18	beshort		15		PA-RISC,
+>>18	beshort		16		nCUBE,
+>>18	beshort		17		VPP500,
+>>18	beshort		18		SPARC32PLUS,
+>>18	beshort		20		PowerPC or cisco 4500,
+>>18	beshort		21		cisco 7500,
+>>18	beshort		24		cisco SVIP,
+>>18	beshort		25		cisco 7200,
+>>18	beshort		36		cisco 12000,
+>>18	beshort		0x9026		Alpha,
+>>20	belong		0		invalid version
+>>20	belong		1		version 1
+>>36	belong		1		MathCoPro/FPU/MAU Required
+
+#------------------------------------------------------------------------------
+# os2:  file(1) magic for OS/2 files
+#
+
+# Provided 1998/08/22 by
+# David Mediavilla <davidme.news at REMOVEIFNOTSPAMusa.net>
+1	string	InternetShortcut	MS Windows 95 Internet shortcut text
+>24	string	>\			(URL=<%s>)
+
+# OS/2 URL objects
+# Provided 1998/08/22 by
+# David Mediavilla <davidme.news at REMOVEIFNOTSPAMusa.net>
+#0	string	http:			OS/2 URL object text
+#>5	string	>\			(WWW) <http:%s>
+#0	string	mailto:			OS/2 URL object text
+#>7	string	>\			(email) <%s>
+#0	string	news:			OS/2 URL object text
+#>5	string	>\			(Usenet) <%s>
+#0	string	ftp:			OS/2 URL object text
+#>4	string	>\			(FTP) <ftp:%s>
+#0	string	file:			OS/2 URL object text
+#>5	string	>\			(Local file) <%s>
+
+# >>>>> OS/2 INF/HLP <<<<<  (source: Daniel Dissett ddissett at netcom.com)
+# Carl Hauser (chauser.parc at xerox.com) and 
+# Marcus Groeber (marcusg at ph-cip.uni-koeln.de)
+# list the following header format in inf02a.doc:
+#
+#  int16 ID;           // ID magic word (5348h = "HS")
+#  int8  unknown1;     // unknown purpose, could be third letter of ID
+#  int8  flags;        // probably a flag word...
+#                      //  bit 0: set if INF style file
+#                      //  bit 4: set if HLP style file
+#                      // patching this byte allows reading HLP files
+#                      // using the VIEW command, while help files 
+#                      // seem to work with INF settings here as well.
+#  int16 hdrsize;      // total size of header
+#  int16 unknown2;     // unknown purpose
+# 
+0   string  HSP\x01\x9b\x00 OS/2 INF
+>107 string >0                      (%s)
+0   string  HSP\x10\x9b\x00     OS/2 HLP
+>107 string >0                      (%s)
+
+# OS/2 INI (this is a guess)
+0  string   \xff\xff\xff\xff\x14\0\0\0  OS/2 INI
+#
+# Copyright (c) 1996 Ignatios Souvatzis. All rights reserved.
+#
+# 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. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#      This product includes software developed by Ignatios Souvatzis for
+#      the NetBSD project.
+# 4. The name of the author may not be used to endorse or promote products
+#    derived from this software without specific prior written permission.
+#
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+#
+#
+#
+# OS9/6809 module descriptions:
+#
+0	beshort		0x87CD	OS9/6809 module:
+#
+>6	byte&0x0f	0x00	non-executable
+>6	byte&0x0f	0x01	machine language
+>6	byte&0x0f	0x02	BASIC I-code
+>6	byte&0x0f	0x03	P-code
+>6	byte&0x0f	0x04	C I-code
+>6	byte&0x0f	0x05	COBOL I-code
+>6	byte&0x0f	0x06	FORTRAN I-code
+#
+>6	byte&0xf0	0x10	program executable
+>6	byte&0xf0	0x20	subroutine
+>6	byte&0xf0	0x30	multi-module
+>6	byte&0xf0	0x40	data module
+#
+>6	byte&0xf0	0xC0	system module
+>6	byte&0xf0	0xD0	file manager
+>6	byte&0xf0	0xE0	device driver
+>6	byte&0xf0	0xF0	device descriptor
+#
+# OS9/m68k stuff (to be continued)
+#
+0	beshort		0x4AFC	OS9/68K module:
+#
+# attr
+>14	byte&0x80	0x80	re-entrant
+>14	byte&0x40	0x40	ghost
+>14	byte&0x20	0x20	system-state
+#
+# lang:
+#
+>13	byte		1	machine language
+>13	byte		2	BASIC I-code
+>13	byte		3	P-code
+>13	byte		4	C I-code
+>13	byte		5	COBOL I-code
+>13	byte		6	Fortran I-code
+#
+#
+# type:
+#
+>12	byte		1	program executable
+>12	byte		2	subroutine
+>12	byte		3	multi-module
+>12	byte		4	data module
+>12	byte		11	trap library
+>12	byte		12	system module
+>12	byte		13	file manager
+>12	byte		14	device driver
+>12	byte		15	device descriptor
+#
+# Mach magic number info
+#
+0	long		0xefbe	OSF/Rose object
+# I386 magic number info
+#
+0	short		0565	i386 COFF object
+
+#------------------------------------------------------------------------------
+# palm:  file(1) magic for PalmOS {.prc,.pdb}: applications, docfiles, and hacks
+#
+# Brian Lalor <blalor at hcirisc.cs.binghamton.edu>
+
+# appl
+60      belong                  0x6170706c      PalmOS application
+>0      string                  >\0             "%s"
+# TEXt
+60      belong                  0x54455874      AportisDoc file
+>0      string                  >\0             "%s"
+# HACK
+60      belong                  0x4841434b      HackMaster hack
+>0      string                  >\0             "%s"
+
+# Variety of PalmOS document types
+# Michael-John Turner <mj at debian.org>
+# Thanks to Hasan Umit Ezerce <humit at tr-net.net.tr> for his DocType
+60	string	                BVokBDIC	BDicty PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DB99DBOS	DB PalmOS document
+>0	string                  >\0             "%s"
+60	string	                vIMGView	FireViewer/ImageViewer PalmOS document
+>0	string                  >\0             "%s"
+60	string	                PmDBPmDB	HanDBase PalmOS document
+>0	string                  >\0             "%s"
+60	string	                InfoINDB	InfoView PalmOS document
+>0	string                  >\0             "%s"
+60	string	                ToGoToGo	iSilo PalmOS document
+>0	string                  >\0             "%s"
+60	string	                JfDbJBas	JFile PalmOS document
+>0	string                  >\0             "%s"
+60	string	                JfDbJFil	JFile Pro PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DATALSdb	List PalmOS document
+>0	string                  >\0             "%s"
+60	string	                Mdb1Mdb1	MobileDB PalmOS document
+>0	string                  >\0             "%s"
+60	string	                PNRdPPrs	PeanutPress PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DataPlkr	Plucker PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DataSprd	QuickSheet PalmOS document
+>0	string                  >\0             "%s"
+60	string	                SM01SMem	SuperMemo PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DataTlPt	TealDoc PalmOS document
+>0	string                  >\0             "%s"
+60	string	                InfoTlIf	TealInfo PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DataTlMl	TealMeal PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DataTlPt	TealPaint PalmOS document
+>0	string                  >\0             "%s"
+60	string	                dataTDBP	ThinkDB PalmOS document
+>0	string                  >\0             "%s"
+60	string	                TdatTide	Tides PalmOS document
+>0	string                  >\0             "%s"
+60	string	                ToRaTRPW	TomeRaider PalmOS document
+>0	string                  >\0             "%s"
+
+# A GutenPalm zTXT etext for use on Palm Pilots (http://gutenpalm.sf.net)
+# For version 1.xx zTXTs, outputs version and numbers of bookmarks and
+#   annotations.
+# For other versions, just outputs version.
+#
+60		string		zTXT		A GutenPalm zTXT e-book
+>0		string		>\0		"%s"
+>(0x4E.L)	byte		0
+>>(0x4E.L+1)	byte		x		(v0.%02d)
+>(0x4E.L)	byte		1
+>>(0x4E.L+1)	byte		x		(v1.%02d)
+>>>(0x4E.L+10)	beshort		>0
+>>>>(0x4E.L+10) beshort		<2		- 1 bookmark
+>>>>(0x4E.L+10) beshort		>1		- %d bookmarks
+>>>(0x4E.L+14)	beshort		>0
+>>>>(0x4E.L+14) beshort		<2		- 1 annotation
+>>>>(0x4E.L+14) beshort		>1		- %d annotations
+>(0x4E.L)	byte		>1		(v%d.
+>>(0x4E.L+1)	byte		x		%02d)
+
+# Palm OS .prc file types
+60		string		libr		Palm OS dynamic library data
+>0		string		>\0		"%s"
+60		string		ptch		Palm OS operating system patch data
+>0		string		>\0		"%s"
+
+# Mobipocket (www.mobipocket.com), donated by Carl Witty
+60	string	                BOOKMOBI	Mobipocket E-book
+>0	string                  >\0             "%s"
+
+#------------------------------------------------------------------------------
+#
+# Parix COFF executables
+# From: Ignatios Souvatzis <ignatios at cs.uni-bonn.de>
+#
+0	beshort&0xfff	0xACE	PARIX
+>0	byte&0xf0	0x80	T800
+>0	byte&0xf0	0x90	T9000
+>19	byte&0x02	0x02	executable
+>19	byte&0x02	0x00	object
+>19	byte&0x0c	0x00	not stripped
+
+#------------------------------------------------------------------------------
+# pbm:  file(1) magic for Portable Bitmap files
+#
+# XXX - byte order?
+#
+0	short	0x2a17	"compact bitmap" format (Poskanzer)
+#------------------------------------------------------------------------------
+# pdf:  file(1) magic for Portable Document Format
+#
+
+0	string		%PDF-		PDF document
+>5	byte		x		\b, version %c
+>7	byte		x		\b.%c
+
+#------------------------------------------------------------------------------
+# pdp:  file(1) magic for PDP-11 executable/object and APL workspace
+#
+0	lelong		0101555		PDP-11 single precision APL workspace
+0	lelong		0101554		PDP-11 double precision APL workspace
+#
+# PDP-11 a.out
+#
+0	leshort		0407		PDP-11 executable
+>8	leshort		>0		not stripped
+>15	byte		>0		- version %ld
+
+0	leshort		0401		PDP-11 UNIX/RT ldp
+0	leshort		0405		PDP-11 old overlay
+
+0	leshort		0410		PDP-11 pure executable
+>8	leshort		>0		not stripped
+>15	byte		>0		- version %ld
+
+0	leshort		0411		PDP-11 separate I&D executable
+>8	leshort		>0		not stripped
+>15	byte		>0		- version %ld
+
+0	leshort		0437		PDP-11 kernel overlay
+
+# These last three are derived from 2.11BSD file(1)
+0	leshort		0413		PDP-11 demand-paged pure executable
+>8	leshort		>0		not stripped
+
+0	leshort		0430		PDP-11 overlaid pure executable
+>8	leshort		>0		not stripped
+
+0	leshort		0431		PDP-11 overlaid separate executable
+>8	leshort		>0		not stripped
+
+#------------------------------------------------------------------------------
+# perl:  file(1) magic for Larry Wall's perl language.
+#
+# The ``eval'' line recognizes an outrageously clever hack for USG systems.
+# Keith Waclena <keith at cerberus.uchicago.edu>
+# Send additions to <perl5-porters at perl.org>
+0	string/b	#!\ /bin/perl			perl script text
+0	string		eval\ "exec\ /bin/perl		perl script text
+0	string/b	#!\ /usr/bin/perl		perl script text
+0	string		eval\ "exec\ /usr/bin/perl	perl script text
+0	string/b	#!\ /usr/local/bin/perl		perl script text
+0	string		eval\ "exec\ /usr/local/bin/perl	perl script text
+0	string		eval\ '(exit\ $?0)'\ &&\ eval\ 'exec	perl script text
+
+# a couple more, by me
+# XXX: christos matches
+#0	regex		package		Perl5 module source text (via regex)
+0	string		package		Perl5 module source text
+
+#------------------------------------------------------------------------------
+# pgp:  file(1) magic for Pretty Good Privacy
+#
+0       beshort         0x9900                  PGP key public ring
+0       beshort         0x9501                  PGP key security ring
+0       beshort         0x9500                  PGP key security ring
+0	beshort		0xa600			PGP encrypted data
+0       string          -----BEGIN\040PGP       PGP armored data
+>15     string          PUBLIC\040KEY\040BLOCK- public key block
+>15     string          MESSAGE-                message
+>15     string          SIGNED\040MESSAGE-      signed message
+>15     string          PGP\040SIGNATURE-       signature
+
+#------------------------------------------------------------------------------
+# pkgadd:  file(1) magic for SysV R4 PKG Datastreams
+#
+0       string          #\ PaCkAgE\ DaTaStReAm  pkg Datastream (SVR4)
+#------------------------------------------------------------------------------
+# plan9:  file(1) magic for AT&T Bell Labs' Plan 9 executables
+#
+0	belong		0x000001EB	Plan 9 executable
+
+#------------------------------------------------------------------------------
+# plus5:  file(1) magic for Plus Five's UNIX MUMPS
+#
+# XXX - byte order?  Paging Hokey....
+#
+0	short		0x259		mumps avl global
+>2	byte		>0		(V%d)
+>6	byte		>0		with %d byte name
+>7	byte		>0		and %d byte data cells
+0	short		0x25a		mumps blt global
+>2	byte		>0		(V%d)
+>8	short		>0		- %d byte blocks
+>15	byte		0x00		- P/D format
+>15	byte		0x01		- P/K/D format
+>15	byte		0x02		- K/D format
+>15	byte		>0x02		- Bad Flags
+# SE Linux policy database
+0       lelong  0xf97cff8c      SE Linux policy
+>16     lelong  x               v%d
+>20     lelong  1 		MLS
+>24     lelong  x       	%d symbols
+>28     lelong  x       	%d ocons
+
+#------------------------------------------------------------------------------
+# printer:  file(1) magic for printer-formatted files
+#
+
+# PostScript, updated by Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		%!		PostScript document text
+>2	string		PS-Adobe-	conforming
+>>11	string		>\0		at level %.3s
+>>>15	string		EPS		- type %s
+>>>15	string		Query		- type %s
+>>>15	string		ExitServer	- type %s
+# Some PCs have the annoying habit of adding a ^D as a document separator
+0	string		\004%!		PostScript document text
+>3	string		PS-Adobe-	conforming
+>>12	string		>\0		at level %.3s
+>>>16	string		EPS		- type %s
+>>>16	string		Query		- type %s
+>>>16	string		ExitServer	- type %s
+0	string		\033%-12345X%!PS	PostScript document
+
+
+# DOS EPS Binary File Header
+# From: Ed Sznyter <ews at Black.Market.NET>
+0       belong          0xC5D0D3C6      DOS EPS Binary File
+>4      long            >0              Postscript starts at byte %d
+>>8     long            >0              length %d
+>>>12   long            >0              Metafile starts at byte %d
+>>>>16  long            >0              length %d
+>>>20   long            >0              TIFF starts at byte %d
+>>>>24  long            >0              length %d
+
+# Adobe's PostScript Printer Description (PPD) files
+#       Yves Arrouye <arrouye at marin.fdn.fr>
+#
+0      string          *PPD-Adobe:    PPD file
+>13    string          x              \b, ve
+
+# HP Printer Job Language
+0	string		\033%-12345X at PJL	HP Printer Job Language data
+# HP Printer Job Language
+# The header found on Win95 HP plot files is the "Silliest Thing possible" 
+# (TM)
+# Every driver puts the language at some random position, with random case
+# (LANGUAGE and Language)
+# For example the LaserJet 5L driver puts the "PJL ENTER LANGUAGE" in line 10
+# From: Uwe Bonnes <bon at elektron.ikp.physik.th-darmstadt.de>
+# 
+0	string		\033%-12345X at PJL	HP Printer Job Language data
+>&0	string		>\0			%s			
+>>&0	string		>\0			%s			
+>>>&0	string		>\0			%s		
+>>>>&0	string		>\0			%s		
+#>15	string		\ ENTER\ LANGUAGE\ =
+#>31	string		PostScript		PostScript
+
+# HP Printer Control Language, Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		\033E\033	HP PCL printer data
+>3	string		\&l0A		- default page size
+>3	string		\&l1A		- US executive page size
+>3	string		\&l2A		- US letter page size
+>3	string		\&l3A		- US legal page size
+>3	string		\&l26A		- A4 page size
+>3	string		\&l80A		- Monarch envelope size
+>3	string		\&l81A		- No. 10 envelope size
+>3	string		\&l90A		- Intl. DL envelope size
+>3	string		\&l91A		- Intl. C5 envelope size
+>3	string		\&l100A		- Intl. B5 envelope size
+>3	string		\&l-81A		- No. 10 envelope size (landscape)
+>3	string		\&l-90A		- Intl. DL envelope size (landscape)
+
+# IMAGEN printer-ready files:
+0	string	@document(		Imagen printer
+# this only works if "language xxx" is first item in Imagen header.
+>10	string	language\ impress	(imPRESS data)
+>10	string	language\ daisy		(daisywheel text)
+>10	string	language\ diablo	(daisywheel text)
+>10	string	language\ printer	(line printer emulation)
+>10	string	language\ tektronix	(Tektronix 4014 emulation)
+# Add any other languages that your Imagen uses - remember
+# to keep the word `text' if the file is human-readable.
+# [GRR 950115:  missing "postscript" or "ultrascript" (whatever it was called)]
+#
+# Now magic for IMAGEN font files...
+0	string		Rast		RST-format raster font data
+>45	string		>0		face %
+# From Jukka Ukkonen
+0	string		\033[K\002\0\0\017\033(a\001\0\001\033(g	Canon Bubble Jet BJC formatted data
+
+# From <mike at flyn.org>
+# These are the /etc/magic entries to decode data sent to an Epson printer.
+0       string          \x1B\x40\x1B\x28\x52\x08\x00\x00REMOTE1P        Epson Stylus Color 460 data
+
+
+#------------------------------------------------------------------------------
+# zenographics:  file(1) magic for Zenographics ZjStream printer data
+# Rick Richardson  rickr at mn.rr.com
+0	string		JZJZ
+>0x12	string		ZZ		Zenographics ZjStream printer data (big-endian)
+0	string		ZJZJ
+>0x12	string		ZZ		Zenographics ZjStream printer data (little-endian)
+
+
+#------------------------------------------------------------------------------
+# Oak Technologies printer stream
+# Rick Richardson <rickr at mn.rr.com>
+0       string          OAK
+>0x07	byte		0
+>0x0b	byte		0	Oak Technologies printer stream
+
+# This would otherwise be recognized as PostScript - nick at debian.org
+0	string		%!VMF 		SunClock's Vector Map Format data
+
+#------------------------------------------------------------------------------
+# HP LaserJet 1000 series downloadable firmware file
+0	string	\xbe\xefABCDEFGH	HP LaserJet 1000 series downloadable firmware   
+
+#------------------------------------------------------------------------------
+# project:  file(1) magic for Project management
+# 
+# Magic strings for ftnchek project files. Alexander Mai
+0	string	FTNCHEK_\ P	project file for ftnchek
+>10	string	1		version 2.7
+>10	string	2		version 2.8 to 2.10
+>10	string	3		version 2.11 or later
+
+#------------------------------------------------------------------------------
+# psdbms:  file(1) magic for psdatabase
+#
+0	belong&0xff00ffff	0x56000000	ps database
+>1	string	>\0	version %s
+>4	string	>\0	from kernel %s
+
+#------------------------------------------------------------------------------
+# psion:  file(1) magic for Psion handhelds data
+# from: Peter Breitenlohner <peb at mppmu.mpg.de>
+#
+0	lelong		0x10000037	Psion Series 5
+>4	lelong		0x10000039	font file
+>4	lelong		0x1000003A	printer driver
+>4	lelong		0x1000003B	clipboard
+>4	lelong		0x10000042	multi-bitmap image
+>4	lelong		0x1000006A	application infomation file
+>4	lelong		0x1000006D
+>>8	lelong		0x1000007D	sketch image
+>>8	lelong		0x1000007E	voice note
+>>8	lelong		0x1000007F	word file
+>>8	lelong		0x10000085	OPL program
+>>8	lelong		0x10000088	sheet file
+>>8	lelong		0x100001C4	EasyFax initialisation file
+>4	lelong		0x10000073	OPO module
+>4	lelong		0x10000074	OPL application
+>4	lelong		0x1000008A	exported multi-bitmap image
+
+0	lelong		0x10000041	Psion Series 5 ROM multi-bitmap image
+
+0	lelong		0x10000050	Psion Series 5
+>4	lelong		0x1000006D	database
+>4	lelong		0x100000E4	ini file
+
+0	lelong		0x10000079	Psion Series 5 binary:
+>4	lelong		0x00000000	DLL
+>4	lelong		0x10000049	comms hardware library
+>4	lelong		0x1000004A	comms protocol library
+>4	lelong		0x1000005D	OPX
+>4	lelong		0x1000006C	application
+>4	lelong		0x1000008D	DLL
+>4	lelong		0x100000AC	logical device driver
+>4	lelong		0x100000AD	physical device driver
+>4	lelong		0x100000E5	file transfer protocol
+>4	lelong		0x100000E5	file transfer protocol
+>4	lelong		0x10000140	printer defintion
+>4	lelong		0x10000141	printer defintion
+
+0	lelong		0x1000007A	Psion Series 5 executable
+
+#------------------------------------------------------------------------------
+# pulsar:  file(1) magic for Pulsar POP3 daemon binary files
+#
+# http://pulsar.sourceforge.net
+# mailto:rok.papez at lugos.si
+#
+
+0	belong	0x1ee7f11e	Pulsar POP3 daemon mailbox cache file.
+>4	ubelong	x		Version: %d.
+>8	ubelong	x		\b%d
+
+
+#------------------------------------------------------------------------------
+# pyramid:  file(1) magic for Pyramids
+#
+# XXX - byte order?
+#
+0	long		0x50900107	Pyramid 90x family executable
+0	long		0x50900108	Pyramid 90x family pure executable
+>16	long		>0		not stripped
+0	long		0x5090010b	Pyramid 90x family demand paged pure executable
+>16	long		>0		not stripped
+
+#------------------------------------------------------------------------------
+# python:  file(1) magic for python
+#
+# From: David Necas <yeti at physics.muni.cz>
+# often the module starts with a multiline string
+0	string		"""	a python script text
+# MAGIC as specified in Python/import.c (1.5 to 2.3.0a)
+# 20121  ( YEAR - 1995 ) + MONTH  + DAY (little endian followed by "\r\n"
+0	belong		0x994e0d0a	python 1.5/1.6 byte-compiled
+0	belong		0x87c60d0a	python 2.0 byte-compiled
+0	belong		0x2aeb0d0a	python 2.1 byte-compiled
+0	belong		0x2ded0d0a	python 2.2 byte-compiled
+0	belong		0x3bf20d0a	python 2.3 byte-compiled
+
+#------------------------------------------------------------------------------
+# file(1) magic for revision control files
+# From Hendrik Scholz <hendrik at scholz.net>
+0   string /1\ :pserver:    cvs password text file
+
+#------------------------------------------------------------------------------
+# riff:  file(1) magic for RIFF format
+# See
+#
+#	http://www.seanet.com/users/matts/riffmci/riffmci.htm
+#
+# AVI section extended by Patrik R�dman <patrik+file-magic at iki.fi>
+#
+0	string		RIFF		RIFF (little-endian) data
+# RIFF Palette format
+>8	string		PAL		\b, palette
+>>16	leshort		x		\b, version %d
+>>18	leshort		x		\b, %d entries
+# RIFF Device Independent Bitmap format
+>8	string		RDIB		\b, device-independent bitmap
+>>16	string		BM		
+>>>30	leshort		12		\b, OS/2 1.x format
+>>>>34	leshort		x		\b, %d x
+>>>>36	leshort		x		%d
+>>>30	leshort		64		\b, OS/2 2.x format
+>>>>34	leshort		x		\b, %d x
+>>>>36	leshort		x		%d
+>>>30	leshort		40		\b, Windows 3.x format
+>>>>34	lelong		x		\b, %d x
+>>>>38	lelong		x		%d x
+>>>>44	leshort		x		%d
+# RIFF MIDI format
+>8	string		RMID		\b, MIDI
+# RIFF Multimedia Movie File format
+>8	string		RMMP		\b, multimedia movie
+# Microsoft WAVE format (*.wav)
+>8	string		WAVE		\b, WAVE audio
+>>20	leshort		1		\b, Microsoft PCM
+>>>34	leshort		>0		\b, %d bit
+>>20	leshort		2		\b, Microsoft ADPCM
+>>20	leshort		6		\b, ITU G.711 A-law
+>>20	leshort		7		\b, ITU G.711 mu-law
+>>20	leshort		17		\b, IMA ADPCM
+>>20	leshort		20		\b, ITU G.723 ADPCM (Yamaha)
+>>20	leshort		49		\b, GSM 6.10
+>>20	leshort		64		\b, ITU G.721 ADPCM
+>>20	leshort		80		\b, MPEG
+>>20	leshort		85		\b, MPEG Layer 3
+>>22	leshort		=1		\b, mono
+>>22	leshort		=2		\b, stereo
+>>22	leshort		>2		\b, %d channels
+>>24	lelong		>0		%d Hz
+# Corel Draw Picture
+>8	string		CDRA		\b, Corel Draw Picture
+# AVI == Audio Video Interleave
+>8	string		AVI\040		\b, AVI
+>>12    string          LIST
+>>>20   string          hdrlavih
+>>>>&36 lelong          x               \b, %lu x
+>>>>&40 lelong          x               %lu,
+>>>>&4  lelong          >1000000        <1 fps,
+>>>>&4  lelong          1000000         1.00 fps,
+>>>>&4  lelong          500000          2.00 fps,
+>>>>&4  lelong          333333          3.00 fps,
+>>>>&4  lelong          250000          4.00 fps,
+>>>>&4  lelong          200000          5.00 fps,
+>>>>&4  lelong          166667          6.00 fps,
+>>>>&4  lelong          142857          7.00 fps,
+>>>>&4  lelong          125000          8.00 fps,
+>>>>&4  lelong          111111          9.00 fps,
+>>>>&4  lelong          100000          10.00 fps,
+# ]9.9,10.1[
+>>>>&4  lelong          <101010
+>>>>>&-4        lelong  >99010
+>>>>>>&-4       lelong  !100000         ~10 fps,
+>>>>&4  lelong          83333           12.00 fps,
+# ]11.9,12.1[
+>>>>&4  lelong          <84034
+>>>>>&-4        lelong  >82645
+>>>>>>&-4       lelong  !83333          ~12 fps,
+>>>>&4  lelong          66667           15.00 fps,
+# ]14.9,15.1[
+>>>>&4  lelong          <67114
+>>>>>&-4        lelong  >66225
+>>>>>>&-4       lelong  !66667          ~15 fps,
+>>>>&4  lelong          50000           20.00 fps,
+>>>>&4  lelong          41708           23.98 fps,
+>>>>&4  lelong          41667           24.00 fps,
+# ]23.9,24.1[
+>>>>&4  lelong          <41841
+>>>>>&-4        lelong  >41494
+>>>>>>&-4       lelong  !41708
+>>>>>>>&-4      lelong  !41667          ~24 fps,
+>>>>&4  lelong          40000           25.00 fps,
+# ]24.9,25.1[
+>>>>&4  lelong          <40161
+>>>>>&-4        lelong  >39841
+>>>>>>&-4       lelong  !40000          ~25 fps,
+>>>>&4  lelong          33367           29.97 fps,
+>>>>&4  lelong          33333           30.00 fps,
+# ]29.9,30.1[
+>>>>&4  lelong          <33445
+>>>>>&-4        lelong  >33223
+>>>>>>&-4       lelong  !33367
+>>>>>>>&-4      lelong  !33333          ~30 fps,
+>>>>&4  lelong          <32224          >30 fps,
+##>>>>&4  lelong          x               (%lu)
+##>>>>&20 lelong          x               %lu frames,
+# Note: The tests below assume that the AVI has 1 or 2 streams,
+#       "vids" optionally followed by "auds".
+#       (Should cover 99.9% of all AVIs.)
+# assuming avih length = 56
+>>>88   string  LIST
+>>>>96  string  strlstrh
+>>>>>108        string  vids    video:
+>>>>>>&0        lelong  0               uncompressed
+# skip past vids strh
+>>>>>>(104.l+108)       string  strf
+>>>>>>>(104.l+132)      lelong          1       RLE 8bpp
+>>>>>>>(104.l+132)      string/c        cvid    Cinepak
+>>>>>>>(104.l+132)      string/c        i263    Intel I.263
+>>>>>>>(104.l+132)      string/c        iv32    Indeo 3.2
+>>>>>>>(104.l+132)      string/c        iv41    Indeo 4.1
+>>>>>>>(104.l+132)      string/c        iv50    Indeo 5.0
+>>>>>>>(104.l+132)      string/c        mp42    Microsoft MPEG-4 v2
+>>>>>>>(104.l+132)      string/c        mp43    Microsoft MPEG-4 v3
+>>>>>>>(104.l+132)      string/c        mjpg    Motion JPEG
+>>>>>>>(104.l+132)      string/c        div3    DivX 3
+>>>>>>>>112             string/c        div3    Low-Motion
+>>>>>>>>112             string/c        div4    Fast-Motion
+>>>>>>>(104.l+132)      string/c        divx    DivX 4
+>>>>>>>(104.l+132)      string/c        dx50    DivX 5
+>>>>>>>(104.l+132)      string/c        xvid    XviD
+>>>>>>>(104.l+132)      lelong  0
+##>>>>>>>(104.l+132)      string  x       (%.4s)
+# skip past first (video) LIST
+>>>>(92.l+96)   string  LIST
+>>>>>(92.l+104) string  strlstrh
+>>>>>>(92.l+116)        string          auds    \b, audio:
+# auds strh length = 56:
+>>>>>>>(92.l+172)       string          strf
+>>>>>>>>(92.l+180)      leshort 0x0001  uncompressed PCM
+>>>>>>>>(92.l+180)      leshort 0x0002  ADPCM
+>>>>>>>>(92.l+180)      leshort 0x0055  MPEG-1 Layer 3
+>>>>>>>>(92.l+180)      leshort 0x2000  Dolby AC3
+>>>>>>>>(92.l+180)      leshort 0x0161  DivX
+##>>>>>>>>(92.l+180)      leshort x       (0x%.4x)
+>>>>>>>>(92.l+182)      leshort 1       (mono,
+>>>>>>>>(92.l+182)      leshort 2       (stereo,
+>>>>>>>>(92.l+182)      leshort >2      (%d channels,
+>>>>>>>>(92.l+184)      lelong  x       %d Hz)
+# auds strh length = 64:
+>>>>>>>(92.l+180)       string          strf
+>>>>>>>>(92.l+188)      leshort 0x0001  uncompressed PCM
+>>>>>>>>(92.l+188)      leshort 0x0002  ADPCM
+>>>>>>>>(92.l+188)      leshort 0x0055  MPEG-1 Layer 3
+>>>>>>>>(92.l+188)      leshort 0x2000  Dolby AC3
+>>>>>>>>(92.l+188)      leshort 0x0161  DivX
+##>>>>>>>>(92.l+188)      leshort x       (0x%.4x)
+>>>>>>>>(92.l+190)      leshort 1       (mono,
+>>>>>>>>(92.l+190)      leshort 2       (stereo,
+>>>>>>>>(92.l+190)      leshort >2      (%d channels,
+>>>>>>>>(92.l+192)      lelong  x       %d Hz)
+# Animated Cursor format
+>8	string		ACON		\b, animated cursor
+# SoundFont 2 <mpruett at sgi.com>
+>8	string		sfbk		SoundFont/Bank
+# MPEG-1 wrapped in a RIFF, apparently
+>8      string          CDXA            \b, wrapped MPEG-1 (CDXA)
+>8	string		4XMV		\b, 4X Movie file 
+
+#
+# XXX - some of the below may only appear in little-endian form.
+#
+# Also "MV93" appears to be for one form of Macromedia Director
+# files, and "GDMF" appears to be another multimedia format.
+#
+0	string		RIFX		RIFF (big-endian) data
+# RIFF Palette format
+>8	string		PAL		\b, palette
+>>16	beshort		x		\b, version %d
+>>18	beshort		x		\b, %d entries
+# RIFF Device Independent Bitmap format
+>8	string		RDIB		\b, device-independent bitmap
+>>16	string		BM		
+>>>30	beshort		12		\b, OS/2 1.x format
+>>>>34	beshort		x		\b, %d x
+>>>>36	beshort		x		%d
+>>>30	beshort		64		\b, OS/2 2.x format
+>>>>34	beshort		x		\b, %d x
+>>>>36	beshort		x		%d
+>>>30	beshort		40		\b, Windows 3.x format
+>>>>34	belong		x		\b, %d x
+>>>>38	belong		x		%d x
+>>>>44	beshort		x		%d
+# RIFF MIDI format
+>8	string		RMID		\b, MIDI
+# RIFF Multimedia Movie File format
+>8	string		RMMP		\b, multimedia movie
+# Microsoft WAVE format (*.wav)
+>8	string		WAVE		\b, WAVE audio
+>>20	leshort		1		\b, Microsoft PCM
+>>>34	leshort		>0		\b, %d bit
+>>22	beshort		=1		\b, mono
+>>22	beshort		=2		\b, stereo
+>>22	beshort		>2		\b, %d channels
+>>24	belong		>0		%d Hz
+# Corel Draw Picture
+>8	string		CDRA		\b, Corel Draw Picture
+# AVI == Audio Video Interleave
+>8	string		AVI\040		\b, AVI
+# Animated Cursor format
+>8	string		ACON		\b, animated cursor
+# Notation Interchange File Format (big-endian only)
+>8	string		NIFF		\b, Notation Interchange File Format
+# SoundFont 2 <mpruett at sgi.com>
+>8	string		sfbk		SoundFont/Bank
+
+#------------------------------------------------------------------------------
+# apple:  file(1) magic for Apple file formats
+#
+0	string		FiLeStArTfIlEsTaRt	binscii (apple ][) text
+0	string		\x0aGL			Binary II (apple ][) data
+0	string		\x76\xff		Squeezed (apple ][) data
+0	string		NuFile			NuFile archive (apple ][) data
+0	string		N\xf5F\xe9l\xe5		NuFile archive (apple ][) data
+0	belong		0x00051600		AppleSingle encoded Macintosh file
+0	belong		0x00051607		AppleDouble encoded Macintosh file
+
+# magic for Newton PDA package formats
+# from Ruda Moura <ruda at helllabs.org>
+0	string	package0	Newton package, NOS 1.x,
+>12	belong	&0x80000000	AutoRemove,
+>12	belong	&0x40000000	CopyProtect,
+>12	belong	&0x10000000	NoCompression,
+>12	belong	&0x04000000	Relocation,
+>12	belong	&0x02000000	UseFasterCompression,
+>16	belong	x		version %d
+
+0	string	package1	Newton package, NOS 2.x,
+>12	belong	&0x80000000	AutoRemove,
+>12	belong	&0x40000000	CopyProtect,
+>12	belong	&0x10000000	NoCompression,
+>12	belong	&0x04000000	Relocation,
+>12	belong	&0x02000000	UseFasterCompression,
+>16	belong	x		version %d
+
+0	string	package4	Newton package,
+>8	byte	8		NOS 1.x,
+>8	byte	9		NOS 2.x,
+>12	belong	&0x80000000	AutoRemove,
+>12	belong	&0x40000000	CopyProtect,
+>12	belong	&0x10000000	NoCompression,
+
+# The following entries for the Apple II are for files that have
+# been transferred as raw binary data from an Apple, without having
+# been encapsulated by any of the above archivers.
+#
+# In general, Apple II formats are hard to identify because Apple DOS
+# and especially Apple ProDOS have strong typing in the file system and
+# therefore programmers never felt much need to include type information
+# in the files themselves.
+#
+# Eric Fischer <enf at pobox.com>
+
+# AppleWorks word processor:
+#
+# This matches the standard tab stops for an AppleWorks file, but if
+# a file has a tab stop set in the first four columns this will fail.
+#
+# The "O" is really the magic number, but that's so common that it's
+# necessary to check the tab stops that follow it to avoid false positives.
+
+4       string          O====   AppleWorks word processor data
+>85     byte&0x01       >0      \b, zoomed
+>90     byte&0x01       >0      \b, paginated
+>92     byte&0x01       >0      \b, with mail merge
+#>91    byte            x       \b, left margin %d
+
+# AppleWorks database:
+#
+# This isn't really a magic number, but it's the closest thing to one
+# that I could find.  The 1 and 2 really mean "order in which you defined
+# categories" and "left to right, top to bottom," respectively; the D and R
+# mean that the cursor should move either down or right when you press Return.
+
+#30	string		\x01D	AppleWorks database data
+#30	string		\x02D	AppleWorks database data
+#30	string		\x01R	AppleWorks database data
+#30	string		\x02R	AppleWorks database data
+
+# AppleWorks spreadsheet:
+#
+# Likewise, this isn't really meant as a magic number.  The R or C means
+# row- or column-order recalculation; the A or M means automatic or manual
+# recalculation.
+
+#131	string		RA	AppleWorks spreadsheet data
+#131	string		RM	AppleWorks spreadsheet data
+#131	string		CA	AppleWorks spreadsheet data
+#131	string		CM	AppleWorks spreadsheet data
+
+# Applesoft BASIC:
+#
+# This is incredibly sloppy, but will be true if the program was
+# written at its usual memory location of 2048 and its first line
+# number is less than 256.  Yuck.
+
+0       belong&0xff00ff 0x80000 Applesoft BASIC program data
+#>2     leshort         x       \b, first line number %d
+
+# ORCA/EZ assembler:
+# 
+# This will not identify ORCA/M source files, since those have
+# some sort of date code instead of the two zero bytes at 6 and 7
+# XXX Conflicts with ELF
+#4       belong&0xff00ffff       0x01000000      ORCA/EZ assembler source data
+#>5      byte                    x               \b, build number %d
+
+# Broderbund Fantavision
+#
+# I don't know what these values really mean, but they seem to recur.
+# Will they cause too many conflicts?
+
+# Probably :-)
+#2	belong&0xFF00FF		0x040008	Fantavision movie data
+
+# Some attempts at images.
+#
+# These are actually just bit-for-bit dumps of the frame buffer, so
+# there's really no reasonably way to distinguish them except for their
+# address (if preserved) -- 8192 or 16384 -- and their length -- 8192
+# or, occasionally, 8184.
+#
+# Nevertheless this will manage to catch a lot of images that happen
+# to have a solid-colored line at the bottom of the screen.
+
+8144	string	\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F	Apple II image with white background
+8144	string	\x55\x2A\x55\x2A\x55\x2A\x55\x2A	Apple II image with purple background
+8144	string	\x2A\x55\x2A\x55\x2A\x55\x2A\x55	Apple II image with green background
+8144	string	\xD5\xAA\xD5\xAA\xD5\xAA\xD5\xAA	Apple II image with blue background
+8144	string	\xAA\xD5\xAA\xD5\xAA\xD5\xAA\xD5	Apple II image with orange background
+
+# Beagle Bros. Apple Mechanic fonts
+
+0	belong&0xFF00FFFF	0x6400D000	Apple Mechanic font
+
+#------------------------------------------------------------------------------
+# macintosh description
+#
+# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
+# Daniel Quinlan, quinlan at yggdrasil.com
+11	string	must\ be\ converted\ with\ BinHex	BinHex binary text
+>41	string	x					\b, version %.3s
+
+# Stuffit archives are the de facto standard of compression for Macintosh
+# files obtained from most archives. (franklsm at tuns.ca)
+0	string		SIT!			StuffIt Archive (data)
+>2	string		x			: %s
+0	string		SITD			StuffIt Deluxe (data)
+>2	string		x			: %s
+0	string		Seg			StuffIt Deluxe Segment (data)
+>2	string		x			: %s
+
+# Newer StuffIt archives (grant at netbsd.org)
+0	string		StuffIt			StuffIt Archive
+>162	string		>0			: %s
+
+# Macintosh Applications and Installation binaries (franklsm at tuns.ca)
+0	string		APPL			Macintosh Application (data)
+>2	string		x			\b: %s
+
+# Macintosh System files (franklsm at tuns.ca)
+0	string		zsys			Macintosh System File (data)
+0	string		FNDR			Macintosh Finder (data)
+0	string		libr			Macintosh Library (data)
+>2	string		x			: %s
+0	string		shlb			Macintosh Shared Library (data)
+>2	string		x			: %s
+0	string		cdev			Macintosh Control Panel (data)
+>2	string		x			: %s
+0	string		INIT			Macintosh Extension (data)
+>2	string		x			: %s
+0	string		FFIL			Macintosh Truetype Font (data)
+>2	string		x			: %s
+0	string		LWFN			Macintosh Postscript Font (data)
+>2	string		x			: %s
+
+# Additional Macintosh Files (franklsm at tuns.ca)
+0	string		PACT			Macintosh Compact Pro Archive (data)
+>2	string		x			: %s
+0	string		ttro			Macintosh TeachText File (data)
+>2	string		x			: %s
+0	string		TEXT			Macintosh TeachText File (data)
+>2	string		x			: %s
+0	string		PDF			Macintosh PDF File (data)
+>2	string		x			: %s
+
+# MacBinary format (Eric Fischer, enf at pobox.com)
+#
+# Unfortunately MacBinary doesn't really have a magic number prior
+# to the MacBinary III format.  The checksum is really the way to
+# do it, but the magic file format isn't up to the challenge.
+#
+# 0	byte		0
+# 1	byte				# filename length
+# 2	string				# filename
+# 65    string				# file type
+# 69	string				# file creator
+# 73	byte				# Finder flags
+# 74	byte		0
+# 75	beshort				# vertical posn in window
+# 77	beshort				# horiz posn in window
+# 79	beshort				# window or folder ID
+# 81    byte				# protected?
+# 82	byte		0
+# 83	belong				# length of data segment
+# 87	belong				# length of resource segment
+# 91	belong				# file creation date
+# 95	belong				# file modification date
+# 99	beshort				# length of comment after resource
+# 101	byte				# new Finder flags
+# 102	string		mBIN		# (only in MacBinary III)
+# 106	byte				# char. code of file name
+# 107	byte				# still more Finder flags
+# 116	belong				# total file length
+# 120	beshort				# length of add'l header
+# 122	byte		129		# for MacBinary II
+# 122	byte		130		# for MacBinary III
+# 123	byte		129		# minimum version that can read fmt
+# 124	beshort				# checksum
+#
+# This attempts to use the version numbers as a magic number, requiring
+# that the first one be 0x80, 0x81, 0x82, or 0x83, and that the second
+# be 0x81.  This works for the files I have, but maybe not for everyone's.
+
+# Unfortunately, this magic is quite weak - MPi
+#122	beshort&0xFCFF	0x8081		Macintosh MacBinary data
+
+# MacBinary I doesn't have the version number field at all, but MacBinary II
+# has been in use since 1987 so I hope there aren't many really old files
+# floating around that this will miss.  The original spec calls for using
+# the nulls in 0, 74, and 82 as the magic number.
+#
+# Another possibility, that would also work for MacBinary I, is to use
+# the assumption that 65-72 will all be ASCII (0x20-0x7F), that 73 will
+# have bits 1 (changed), 2 (busy), 3 (bozo), and 6 (invisible) unset,
+# and that 74 will be 0.  So something like
+# 
+# 71 	belong&0x80804EFF 0x00000000 	Macintosh MacBinary data
+# 
+# >73	byte&0x01	0x01		\b, inited
+# >73	byte&0x02	0x02		\b, changed
+# >73	byte&0x04	0x04		\b, busy
+# >73	byte&0x08	0x08		\b, bozo
+# >73	byte&0x10	0x10		\b, system
+# >73	byte&0x10	0x20		\b, bundle
+# >73	byte&0x10	0x40		\b, invisible
+# >73	byte&0x10	0x80		\b, locked
+
+#>65	string		x		\b, type "%4.4s"
+
+#>65	string		8BIM		(PhotoShop)
+#>65	string		ALB3		(PageMaker 3)
+#>65	string		ALB4		(PageMaker 4)
+#>65	string		ALT3		(PageMaker 3)
+#>65	string		APPL		(application)
+#>65	string		AWWP		(AppleWorks word processor)
+#>65	string		CIRC		(simulated circuit)
+#>65	string		DRWG		(MacDraw)
+#>65	string		EPSF		(Encapsulated PostScript)
+#>65	string		FFIL		(font suitcase)
+#>65	string		FKEY		(function key)
+#>65	string		FNDR		(Macintosh Finder)
+#>65	string		GIFf		(GIF image)
+#>65	string		Gzip		(GNU gzip)
+#>65	string		INIT		(system extension)
+#>65	string		LIB\ 		(library)
+#>65	string		LWFN		(PostScript font)
+#>65	string		MSBC		(Microsoft BASIC)
+#>65	string		PACT		(Compact Pro archive)
+#>65	string		PDF\ 		(Portable Document Format)
+#>65	string		PICT		(picture)
+#>65	string		PNTG		(MacPaint picture)
+#>65	string		PREF		(preferences)
+#>65	string		PROJ		(Think C project)
+#>65	string		QPRJ		(Think Pascal project)
+#>65	string		SCFL		(Defender scores)
+#>65	string		SCRN		(startup screen)
+#>65	string		SITD		(StuffIt Deluxe)
+#>65	string		SPn3		(SuperPaint)
+#>65	string		STAK		(HyperCard stack)
+#>65	string		Seg\ 		(StuffIt segment)
+#>65	string		TARF		(Unix tar archive)
+#>65	string		TEXT		(ASCII)
+#>65	string		TIFF		(TIFF image)
+#>65	string		TOVF		(Eudora table of contents)
+#>65	string		WDBN		(Microsoft Word word processor)
+#>65	string		WORD		(MacWrite word processor)
+#>65	string		XLS\ 		(Microsoft Excel)
+#>65	string		ZIVM		(compress (.Z))
+#>65	string		ZSYS		(Pre-System 7 system file)
+#>65	string		acf3		(Aldus FreeHand)
+#>65	string		cdev		(control panel)
+#>65	string		dfil		(Desk Acessory suitcase)
+#>65	string		libr		(library)
+#>65	string		nX^d		(WriteNow word processor)
+#>65	string		nX^w		(WriteNow dictionary)
+#>65	string		rsrc		(resource)
+#>65	string		scbk		(Scrapbook)
+#>65	string		shlb		(shared library)
+#>65	string		ttro		(SimpleText read-only)
+#>65	string		zsys		(system file)
+
+#>69	string		x		\b, creator "%4.4s"
+
+# Somewhere, Apple has a repository of registered Creator IDs.  These are
+# just the ones that I happened to have files from and was able to identify.
+
+#>69	string		8BIM		(Adobe Photoshop)
+#>69	string		ALD3		(PageMaker 3)
+#>69	string		ALD4		(PageMaker 4)
+#>69	string		ALFA		(Alpha editor)
+#>69	string		APLS		(Apple Scanner)
+#>69	string		APSC		(Apple Scanner)
+#>69	string		BRKL		(Brickles)
+#>69	string		BTFT		(BitFont)
+#>69	string		CCL2 		(Common Lisp 2)
+#>69	string		CCL\ 		(Common Lisp)
+#>69	string		CDmo		(The Talking Moose)
+#>69	string		CPCT		(Compact Pro)
+#>69	string		CSOm		(Eudora)
+#>69	string		DMOV		(Font/DA Mover)
+#>69	string		DSIM		(DigSim)
+#>69	string		EDIT		(Macintosh Edit)
+#>69	string		ERIK		(Macintosh Finder)
+#>69	string		EXTR		(self-extracting archive)
+#>69	string		Gzip		(GNU gzip)
+#>69	string		KAHL		(Think C)
+#>69	string		LWFU		(LaserWriter Utility)
+#>69	string		LZIV		(compress)
+#>69	string		MACA		(MacWrite)
+#>69	string		MACS		(Macintosh operating system)
+#>69	string		MAcK		(MacKnowledge terminal emulator)
+#>69	string		MLND		(Defender)
+#>69	string		MPNT		(MacPaint)
+#>69	string		MSBB		(Microsoft BASIC (binary))
+#>69	string		MSWD		(Microsoft Word)
+#>69	string		NCSA		(NCSA Telnet)
+#>69	string		PJMM		(Think Pascal)
+#>69	string		PSAL		(Hunt the Wumpus)
+#>69	string		PSI2		(Apple File Exchange)
+#>69	string		R*ch		(BBEdit)
+#>69	string		RMKR		(Resource Maker)
+#>69	string		RSED		(Resource Editor)
+#>69	string		Rich		(BBEdit)
+#>69	string		SIT!		(StuffIt)
+#>69	string		SPNT		(SuperPaint)
+#>69	string		Unix		(NeXT Mac filesystem)
+#>69	string		VIM!		(Vim editor)
+#>69	string		WILD		(HyperCard)
+#>69	string		XCEL		(Microsoft Excel)
+#>69	string		aCa2		(Fontographer)
+#>69	string		aca3		(Aldus FreeHand)
+#>69	string		dosa		(Macintosh MS-DOS file system)
+#>69	string		movr		(Font/DA Mover)
+#>69	string		nX^n		(WriteNow)
+#>69	string		pdos		(Apple ProDOS file system)
+#>69	string		scbk		(Scrapbook)
+#>69	string		ttxt		(SimpleText)
+#>69	string		ufox		(Foreign File Access)
+
+# Just in case...
+
+102	string		mBIN		MacBinary III data with surprising version number
+
+# sas magic from Bruce Foster (bef at nwu.edu)
+#
+#0	string		SAS		SAS
+#>8	string		x		%s
+0	string		SAS		SAS
+>24	string		DATA		data file
+>24	string		CATALOG		catalog
+>24	string		INDEX		data file index
+>24	string		VIEW		data view
+# sas 7+ magic from Reinhold Koch (reinhold.koch at roche.com)
+#
+0x54    string          SAS             SAS 7+
+>0x9C   string          DATA            data file
+>0x9C   string          CATALOG         catalog
+>0x9C   string          INDEX           data file index
+>0x9C   string          VIEW            data view
+
+# spss magic for SPSS system and portable files, 
+#	 from Bruce Foster (bef at nwu.edu).
+
+0	long		0xc1e2c3c9	SPSS Portable File
+>40	string 		x		%s
+
+0	string		$FL2		SPSS System File
+>24	string		x		%s
+
+# Macintosh filesystem data
+# From "Tom N Harris" <telliamed at mac.com>
+# Fixed HFS+ and Partition map magic: Ethan Benson <erbenson at alaska.net>
+# The MacOS epoch begins on 1 Jan 1904 instead of 1 Jan 1970, so these
+# entries depend on the data arithmetic added after v.35
+# There's also some Pascal strings in here, ditto...
+
+# The boot block signature, according to IM:Files, is 
+# "for HFS volumes, this field always contains the value 0x4C4B."
+# But if this is true for MFS or HFS+ volumes, I don't know.
+# Alternatively, the boot block is supposed to be zeroed if it's
+# unused, so a simply >0 should suffice.
+
+0x400	beshort			0xD2D7		Macintosh MFS data
+>0	beshort			0x4C4B		(bootable)
+>0x40a	beshort			&0x8000		(locked)
+>0x402	beldate-0x7C25B080	x		created: %s,
+>0x406	beldate-0x7C25B080	>0		last backup: %s,
+>0x414	belong			x		block size: %d,
+>0x412	beshort			x		number of blocks: %d,
+>0x424	pstring			x		volume name: %s
+
+# "BD" is has many false positives
+#0x400	beshort			0x4244		Macintosh HFS data
+#>0	beshort			0x4C4B		(bootable)
+#>0x40a	beshort			&0x8000		(locked)
+#>0x40a	beshort			^0x0100		(mounted)
+#>0x40a	beshort			&0x0200		(spared blocks)
+#>0x40a	beshort			&0x0800		(unclean)
+#>0x47C	beshort			0x482B		(Embedded HFS+ Volume)
+#>0x402	beldate-0x7C25B080	x		created: %s,
+#>0x406	beldate-0x7C25B080	x		last modified: %s,
+#>0x440	beldate-0x7C25B080	>0		last backup: %s,
+#>0x414	belong			x		block size: %d,
+#>0x412	beshort			x		number of blocks: %d,
+#>0x424	pstring			x		volume name: %s
+
+0x400	beshort			0x482B		Macintosh HFS Extended
+>&0	beshort			x		version %d data
+>0	beshort			0x4C4B		(bootable)
+>0x404	belong			^0x00000100	(mounted)
+>&2	belong			&0x00000200	(spared blocks)
+>&2	belong			&0x00000800	(unclean)
+>&2	belong			&0x00008000	(locked)
+>&6	string			x		last mounted by: '%.4s',
+# really, that should be treated as a belong and we print a string
+# based on the value. TN1150 only mentions '8.10' for "MacOS 8.1"
+>&14	beldate-0x7C25B080	x		created: %s,
+# only the creation date is local time, all other timestamps in HFS+ are UTC.
+>&18	bedate-0x7C25B080	x		last modified: %s,
+>&22	bedate-0x7C25B080	>0		last backup: %s,
+>&26	bedate-0x7C25B080	>0		last checked: %s,
+>&38	belong			x		block size: %d,
+>&42	belong			x		number of blocks: %d,
+>&46	belong			x		free blocks: %d
+
+# I don't think this is really necessary since it doesn't do much and 
+# anything with a valid driver descriptor will also have a valid
+# partition map
+#0		beshort		0x4552		Apple Device Driver data
+#>&24		beshort		=1		\b, MacOS
+
+# Is that the partition type a cstring or a pstring? Well, IM says "strings 
+# shorter than 32 bytes must be terminated with NULL" so I'll treat it as a 
+# cstring. Of course, partitions can contain more than four entries, but 
+# what're you gonna do?
+0x200		beshort		0x504D		Apple Partition data
+>0x2		beshort		x		block size: %d,
+>0x230		string		x		first type: %s,
+>0x210		string		x		name: %s,
+>0x254		belong		x		number of blocks: %d,
+>0x400		beshort		0x504D		
+>>0x430		string		x		second type: %s,
+>>0x410		string		x		name: %s,
+>>0x454		belong		x		number of blocks: %d,
+>>0x800		beshort		0x504D		
+>>>0x830	string		x		third type: %s,
+>>>0x810	string		x		name: %s,
+>>>0x854	belong		x		number of blocks: %d,
+>>>0xa00	beshort		0x504D		
+>>>>0xa30	string		x		fourth type: %s,
+>>>>0xa10	string		x		name: %s,
+>>>>0xa54	belong		x		number of blocks: %d
+# AFAIK, only the signature is different
+0x200		beshort		0x5453		Apple Old Partition data
+>0x2		beshort		x		block size: %d,
+>0x230		string		x		first type: %s,
+>0x210		string		x		name: %s,
+>0x254		belong		x		number of blocks: %d,
+>0x400		beshort		0x504D		
+>>0x430		string		x		second type: %s,
+>>0x410		string		x		name: %s,
+>>0x454		belong		x		number of blocks: %d,
+>>0x800		beshort		0x504D		
+>>>0x830	string		x		third type: %s,
+>>>0x810	string		x		name: %s,
+>>>0x854	belong		x		number of blocks: %d,
+>>>0xa00	beshort		0x504D		
+>>>>0xa30	string		x		fourth type: %s,
+>>>>0xa10	string		x		name: %s,
+>>>>0xa54	belong		x		number of blocks: %d
+
+# From: Remi Mommsen <mommsen at slac.stanford.edu>
+0		string		BOMStore	Mac OS X bill of materials (BOM) fil
+#------------------------------------------------------------------------------
+#
+# RPM: file(1) magic for Red Hat Packages   Erik Troan (ewt at redhat.com)
+#
+0	beshort		0xedab
+>2	beshort		0xeedb		RPM
+>>4	byte		x		v%d
+>>6	beshort		0		bin
+>>6	beshort		1		src
+>>8	beshort		1		i386
+>>8	beshort		2		Alpha
+>>8	beshort		3		Sparc
+>>8	beshort		4		MIPS
+>>8	beshort		5		PowerPC
+>>8	beshort		6		68000
+>>8	beshort		7	SGI
+>>8	beshort		8		RS6000
+>>8	beshort		9		IA64
+>>8	beshort		10		Sparc64
+>>8	beshort		11		MIPSel
+>>8	beshort		12		ARM
+>>10	string		x		%s
+
+#------------------------------------------------------------------------------
+# rtf:	file(1) magic for Rich Text Format (RTF)
+#
+# Duncan P. Simpson, D.P.Simpson at dcs.warwick.ac.uk
+#
+0	string		{\\rtf		Rich Text Format data,
+>5	byte		x		version %c,
+>6	string		\\ansi		ANSI
+>6	string		\\mac		Apple Macintosh
+>6	string		\\pc		IBM PC, code page 437
+>6	string		\\pca		IBM PS/2, code page 850
+
+#------------------------------------------------------------------------------
+# sc:  file(1) magic for "sc" spreadsheet
+#
+38	string		Spreadsheet	sc spreadsheet file
+
+#------------------------------------------------------------------------------
+# sccs:  file(1) magic for SCCS archives
+#
+# SCCS archive structure:
+# \001h01207
+# \001s 00276/00000/00000
+# \001d D 1.1 87/09/23 08:09:20 ian 1 0
+# \001c date and time created 87/09/23 08:09:20 by ian
+# \001e
+# \001u
+# \001U
+# ... etc.
+# Now '\001h' happens to be the same as the 3B20's a.out magic number (0550).
+# *Sigh*. And these both came from various parts of the USG.
+# Maybe we should just switch everybody from SCCS to RCS!
+# Further, you can't just say '\001h0', because the five-digit number
+# is a checksum that could (presumably) have any leading digit,
+# and we don't have regular expression matching yet. 
+# Hence the following official kludge:
+8	string		\001s\ 			SCCS archive data
+
+#------------------------------------------------------------------------------
+# sendmail:  file(1) magic for sendmail config files
+#
+# XXX - byte order?
+#
+0	byte	046	  Sendmail frozen configuration 
+>16	string	>\0	  - version %s
+0	short	0x271c	  Sendmail frozen configuration
+>16	string	>\0	  - version %s
+
+#------------------------------------------------------------------------------
+# sendmail:  file(1) magic for sendmail m4(1) files
+#
+# From Hendrik Scholz <hendrik at scholz.net>
+# i.e. files in /usr/share/sendmail/cf/
+#
+0   string  divert(-1)\n    sendmail m4 text file
+
+
+#------------------------------------------------------------------------------
+# sequent:  file(1) magic for Sequent machines
+#
+# Sequent information updated by Don Dwiggins <atsun!dwiggins>.
+# For Sequent's multiprocessor systems (incomplete).
+0	lelong	0x00ea        	BALANCE NS32000 .o
+>16	lelong	>0		not stripped
+>124	lelong	>0		version %ld
+0	lelong	0x10ea        	BALANCE NS32000 executable (0 @ 0)
+>16	lelong  >0            	not stripped
+>124	lelong	>0		version %ld
+0	lelong	0x20ea        	BALANCE NS32000 executable (invalid @ 0)
+>16	lelong  >0            	not stripped
+>124	lelong	>0		version %ld
+0	lelong	0x30ea        	BALANCE NS32000 standalone executable
+>16	lelong  >0          	not stripped
+>124	lelong	>0		version %ld
+#
+# Symmetry information added by Jason Merrill <jason at jarthur.claremont.edu>.
+# Symmetry magic nums will not be reached if DOS COM comes before them;
+# byte 0xeb is matched before these get a chance.
+0	leshort	0x12eb		SYMMETRY i386 .o
+>16	lelong	>0		not stripped
+>124	lelong	>0		version %ld
+0	leshort	0x22eb		SYMMETRY i386 executable (0 @ 0)
+>16	lelong	>0		not stripped
+>124	lelong	>0		version %ld
+0	leshort	0x32eb		SYMMETRY i386 executable (invalid @ 0)
+>16	lelong	>0		not stripped
+>124	lelong	>0		version %ld
+0	leshort	0x42eb		SYMMETRY i386 standalone executable
+>16	lelong	>0		not stripped
+>124	lelong	>0		version %ld
+
+#------------------------------------------------------------------------------
+# sgi:  file(1) magic for Silicon Graphics applications
+
+#
+#
+# Performance Co-Pilot file types
+0	string	PmNs				PCP compiled namespace (V.0)
+0	string	PmN				PCP compiled namespace
+>3	string	>\0				(V.%1.1s)
+3	belong	0x84500526			PCP archive
+>7	byte	x				(V.%d)
+>20	belong	-2				temporal index
+>20	belong	-1				metadata
+>20	belong	0				log volume #0
+>20	belong	>0				log volume #%ld
+>24	string	>\0				host: %s
+0	string	PCPFolio			PCP 
+>9	string	Version:			Archive Folio
+>18	string	>\0				(V.%s)
+0	string	#pmchart			PCP pmchart view
+>9	string	Version
+>17	string	>\0				(V%-3.3s)
+0	string	pmview				PCP pmview config
+>7	string	Version
+>15	string	>\0				(V%-3.3s)
+0	string	#pmlogger			PCP pmlogger config
+>10	string	Version
+>18	string	>\0				(V%1.1s)
+0	string	#pmdahotproc			PCP pmdahotproc config
+>13	string	Version
+>21	string	>\0				(V%-3.3s)
+0	string	PcPh				PCP Help 
+>4	string	1				Index
+>4	string	2				Text
+>5	string	>\0				(V.%1.1s)
+0	string	#pmieconf-rules			PCP pmieconf rules
+>16	string	>\0				(V.%1.1s)
+3	string	pmieconf-pmie			PCP pmie config
+>17	string	>\0				(V.%1.1s)
+
+# SpeedShop data files
+0	lelong	0x13130303			SpeedShop data file
+
+# mdbm files
+0	lelong	0x01023962			mdbm file, version 0 (obsolete)
+0	string	mdbm				mdbm file,
+>5	byte	x				version %d,
+>6	byte	x				2^%d pages,
+>7	byte	x				pagesize 2^%d,
+>17	byte	x				hash %d,
+>11	byte	x				dataformat %d
+
+# Alias|Wavefront Maya files
+0	string	//Maya ASCII	Alias|Wavefront Maya Ascii File,
+>13	lelong	x	version %s
+8	string	MAYAFOR4	Alias|Wavefront Maya Binary File,
+>32	lelong	x	version %s scene
+8	string	MayaFOR4	Alias|Wavefront Maya Binary File,
+>32	lelong	x	version %s scene
+8	string	CIMG		Alias|Wavefront Maya Image File
+8	string	DEEP		Alias|Wavefront Maya Image File
+
+#------------------------------------------------------------------------------
+# sgml:  file(1) magic for Standard Generalized Markup Language
+# HyperText Markup Language (HTML) is an SGML document type,
+# from Daniel Quinlan (quinlan at yggdrasil.com)
+# adapted to string extenstions by Anthon van der Neut <anthon at mnt.org)
+0   string/cB	\<!DOCTYPE\ html	HTML document text
+0   string/cb	\<head			HTML document text
+0   string/cb	\<title			HTML document text
+0   string/cb	\<html			HTML document text
+
+# Extensible markup language (XML), a subset of SGML
+# from Marc Prud'hommeaux (marc at apocalypse.org)
+0	string/cb	\<?xml			XML document text
+0	string		\<?xml\ version "	XML
+0	string		\<?xml\ version="	XML
+>15	string		>\0			%.3s document text
+>>23	string		\<xsl:stylesheet	(XSL stylesheet)
+>>24	string		\<xsl:stylesheet	(XSL stylesheet)
+0	string/b	\<?xml			XML document text
+0	string/cb	\<?xml			broken XML document text
+
+
+# SGML, mostly from rph at sq
+0   string/cb	\<!doctype		exported SGML document text
+0   string/cb	\<!subdoc		exported SGML subdocument text
+0   string/cb	\<!--			exported SGML document text
+
+# Web browser cookie files
+# (Mozilla, Galeon, Netscape 4, Konqueror..)
+# Ulf Harnhammar <ulfh at update.uu.se>
+0	string	#\ HTTP\ Cookie\ File	Web browser cookie text
+0	string	#\ Netscape\ HTTP\ Cookie\ File	Netscape cookie text
+0	string	#\ KDE\ Cookie\ File	Konqueror cookie text
+
+#------------------------------------------------------------------------
+# file(1) magic for sharc files
+#
+# SHARC DSP, MIDI SysEx and RiscOS filetype definitions added by 
+# FutureGroove Music (dsp at futuregroove.de)
+
+#------------------------------------------------------------------------
+0	string			Draw		RiscOS Drawfile
+0	string			PACK		RiscOS PackdDir archive
+
+#------------------------------------------------------------------------
+# SHARC DSP stuff (based on the FGM SHARC DSP SDK)
+
+0	string			!		Assembler source
+0	string			Analog		ADi asm listing file
+0	string			.SYSTEM		SHARC architecture file
+0	string			.system		SHARC architecture file
+
+0	leshort			0x521C		SHARC COFF binary
+>2	leshort			>1		, %hd sections
+>>12	lelong			>0		, not stripped
+
+#------------------------------------------------------------------------------
+# sinclair:  file(1) sinclair QL
+
+# additions to /etc/magic by Thomas M. Ott (ThMO)
+
+# Sinclair QL floppy disk formats (ThMO)
+0	string	=QL5		QL disk dump data,
+>3	string	=A		720 KB,
+>3	string	=B		1.44 MB,
+>3	string	=C		3.2 MB,
+>4	string	>\0		label:%.10s
+
+# Sinclair QL OS dump (ThMO)
+# (NOTE: if `file' would be able to use indirect references in a endian format
+#	 differing from the natural host format, this could be written more
+#	 reliably and faster...)
+#
+# we *can't* lookup QL OS code dumps, because `file' is UNABLE to read more
+# than the first 8K of a file... #-(
+#
+#0		belong	=0x30000
+#>49124		belong	<47104
+#>>49128		belong	<47104
+#>>>49132	belong	<47104
+#>>>>49136	belong	<47104	QL OS dump data,
+#>>>>>49148	string	>\0	type %.3s,
+#>>>>>49142	string	>\0	version %.4s
+
+# Sinclair QL firmware executables (ThMO)
+0	string	NqNqNq`\004	QL firmware executable (BCPL)
+
+# Sinclair QL libraries (ThMO)
+0	beshort	=0xFB01		QL library archive data
+
+# Sinclair QL executbables (ThMO)
+6	beshort	=0x4AFB		QL executable,
+>10	string	=\0		un-named
+>8	beshort	=1
+>>10	string	>\0		named: %.1s
+>8	beshort	=2
+>>10	string	>\0		named: %.2s
+>8	beshort	=3
+>>10	string	>\0		named: %.3s
+>8	beshort	=4
+>>10	string	>\0		named: %.4s
+>8	beshort	=5
+>>10	string	>\0		named: %.5s
+>8	beshort	=6
+>>10	string	>\0		named: %.6s
+>8	beshort	=7
+>>10	string	>\0		named: %.7s
+>8	beshort	=8
+>>10	string	>\0		named: %.8s
+>8	beshort	=9
+>>10	string	>\0		named: %.9s
+>8	beshort	=10
+>>10	string	>\0		named: %.10s
+>8	beshort	=11
+>>10	string	>\0		named: %.11s
+>8	beshort	=12
+>>10	string	>\0		named: %.12s
+>8	beshort	=13
+>>10	string	>\0		named: %.13s
+>8	beshort	=14
+>>10	string	>\0		named: %.14s
+>8	beshort	=15
+>>10	string	>\0		named: %.15s
+>8	beshort	=16
+>>10	string	>\0		named: %.16s
+>8	beshort	=17
+>>10	string	>\0		named: %.17s
+>8	beshort	=18
+>>10	string	>\0		named: %.18s
+>8	beshort	=19
+>>10	string	>\0		named: %.19s
+>8	beshort	=20
+>>10	string	>\0		named: %.20s
+>8	beshort	>20
+>>10	string	>\0		(truncated) named: %.20s
+
+# Sinclair QL rom (ThMO)
+0	belong	=0x4AFB0001	QL plugin-ROM data,
+>10	string	=\0		un-named
+>8	beshort	=1
+>>10	string	>\0		named: %.1s
+>8	beshort	=2
+>>10	string	>\0		named: %.2s
+>8	beshort	=3
+>>10	string	>\0		named: %.3s
+>8	beshort	=4
+>>10	string	>\0		named: %.4s
+>8	beshort	=5
+>>10	string	>\0		named: %.5s
+>8	beshort	=6
+>>10	string	>\0		named: %.6s
+>8	beshort	=7
+>>10	string	>\0		named: %.7s
+>8	beshort	=8
+>>10	string	>\0		named: %.8s
+>8	beshort	=9
+>>10	string	>\0		named: %.9s
+>8	beshort	=10
+>>10	string	>\0		named: %.10s
+>8	beshort	=11
+>>10	string	>\0		named: %.11s
+>8	beshort	=12
+>>10	string	>\0		named: %.12s
+>8	beshort	=13
+>>10	string	>\0		named: %.13s
+>8	beshort	=14
+>>10	string	>\0		named: %.14s
+>8	beshort	=15
+>>10	string	>\0		named: %.15s
+>8	beshort	=16
+>>10	string	>\0		named: %.16s
+>8	beshort	=17
+>>10	string	>\0		named: %.17s
+>8	beshort	=18
+>>10	string	>\0		named: %.18s
+>8	beshort	=19
+>>10	string	>\0		named: %.19s
+>8	beshort	=20
+>>10	string	>\0		named: %.20s
+>8	beshort	>20
+>>10	string	>\0		(truncated) named: %.20s
+
+#------------------------------------------------------------------------------
+# Sketch Drawings: http://sketch.sourceforge.net/ 
+# From: Edwin Mons <e at ik.nu>
+0	string	##Sketch	Sketch document text
+
+#-----------------------------------------------
+# GNU Smalltalk image, starting at version 1.6.2
+# From: catull_us at yahoo.com
+#
+0	string	GSTIm\0\0	GNU SmallTalk
+# little-endian
+>7	byte&1	=0		LE image version
+>>10	byte	x		%d.
+>>9	byte	x		\b%d.
+>>8	byte	x		\b%d
+#>>12	lelong	x		, data: %ld
+#>>16	lelong	x		, table: %ld
+#>>20	lelong	x		, memory: %ld
+# big-endian
+>7	byte&1	=1		BE image version
+>>8	byte	x		%d.
+>>9	byte	x		\b%d.
+>>10	byte	x		\b%d
+#>>12	belong	x		, data: %ld
+#>>16	belong	x		, table: %ld
+#>>20	belong	x		, memory: %ld
+
+
+
+#------------------------------------------------------------------------------
+# sniffer:  file(1) magic for packet capture files
+#
+# From: guy at alum.mit.edu (Guy Harris)
+#
+
+#
+# Microsoft Network Monitor 1.x capture files.
+#
+0	string		RTSS		NetMon capture file
+>5	byte		x		- version %d
+>4	byte		x		\b.%d
+>6	leshort		0		(Unknown)
+>6	leshort		1		(Ethernet)
+>6	leshort		2		(Token Ring)
+>6	leshort		3		(FDDI)
+>6	leshort		4		(ATM)
+
+#
+# Microsoft Network Monitor 2.x capture files.
+#
+0	string		GMBU		NetMon capture file
+>5	byte		x		- version %d
+>4	byte		x		\b.%d
+>6	leshort		0		(Unknown)
+>6	leshort		1		(Ethernet)
+>6	leshort		2		(Token Ring)
+>6	leshort		3		(FDDI)
+>6	leshort		4		(ATM)
+
+#
+# Network General Sniffer capture files.
+# Sorry, make that "Network Associates Sniffer capture files."
+#
+0	string		TRSNIFF\ data\ \ \ \ \032	Sniffer capture file
+>33	byte		2		(compressed)
+>23	leshort		x		- version %d
+>25	leshort		x		\b.%d
+>32	byte		0		(Token Ring)
+>32	byte		1		(Ethernet)
+>32	byte		2		(ARCNET)
+>32	byte		3		(StarLAN)
+>32	byte		4		(PC Network broadband)
+>32	byte		5		(LocalTalk)
+>32	byte		6		(Znet)
+>32	byte		7		(Internetwork Analyzer)
+>32	byte		9		(FDDI)
+>32	byte		10		(ATM)
+
+#
+# Cinco Networks NetXRay capture files.
+# Sorry, make that "Network General Sniffer Basic capture files."
+# Sorry, make that "Network Associates Sniffer Basic capture files."
+# Sorry, make that "Network Associates Sniffer Basic, and Windows
+# Sniffer Pro", capture files."
+#
+0	string		XCP\0		NetXRay capture file
+>4	string		>\0		- version %s
+>44	leshort		0		(Ethernet)
+>44	leshort		1		(Token Ring)
+>44	leshort		2		(FDDI)
+>44	leshort		3		(WAN)
+>44	leshort		8		(ATM)
+>44	leshort		9		(802.11)
+
+#
+# "libpcap" capture files.
+# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
+# the main program that uses that format, but there are other programs
+# that use "libpcap", or that use the same capture file format.)
+#
+0	ubelong		0xa1b2c3d4	tcpdump capture file (big-endian)
+>4	beshort		x		- version %d
+>6	beshort		x		\b.%d
+>20	belong		0		(No link-layer encapsulation
+>20	belong		1		(Ethernet
+>20	belong		2		(3Mb Ethernet
+>20	belong		3		(AX.25
+>20	belong		4		(ProNET
+>20	belong		5		(CHAOS
+>20	belong		6		(Token Ring
+>20	belong		7		(BSD ARCNET
+>20	belong		8		(SLIP
+>20	belong		9		(PPP
+>20	belong		10		(FDDI
+>20	belong		11		(RFC 1483 ATM
+>20	belong		12		(raw IP
+>20	belong		13		(BSD/OS SLIP
+>20	belong		14		(BSD/OS PPP
+>20	belong		50		(PPP or Cisco HDLC
+>20	belong		51		(PPP-over-Ethernet
+>20	belong		100		(RFC 1483 ATM
+>20	belong		101		(raw IP
+>20	belong		102		(BSD/OS SLIP
+>20	belong		103		(BSD/OS PPP
+>20	belong		104		(BSD/OS Cisco HDLC
+>20	belong		105		(802.11
+>20	belong		106		(Linux Classical IP over ATM
+>20	belong		107		(Frame Relay
+>20	belong		108		(OpenBSD loopback
+>20	belong		109		(OpenBSD IPsec encrypted
+>20	belong		112		(Cisco HDLC
+>20	belong		113		(Linux "cooked"
+>20	belong		114		(LocalTalk
+>20	belong		117		(OpenBSD PFLOG
+>20	belong		119		(802.11 with Prism header
+>20	belong		123		(SunATM
+>20	belong		127		(802.11 with radiotap header
+>20	belong		129		(Linux ARCNET
+>20	belong		140		(MTP2
+>20	belong		141		(MTP3
+>20	belong		143		(DOCSIS
+>20	belong		144		(IrDA
+>16	belong		x		\b, capture length %d)
+0	ulelong		0xa1b2c3d4	tcpdump capture file (little-endian)
+>4	leshort		x		- version %d
+>6	leshort		x		\b.%d
+>20	lelong		0		(No link-layer encapsulation
+>20	lelong		1		(Ethernet
+>20	lelong		2		(3Mb Ethernet
+>20	lelong		3		(AX.25
+>20	lelong		4		(ProNET
+>20	lelong		5		(CHAOS
+>20	lelong		6		(Token Ring
+>20	lelong		7		(ARCNET
+>20	lelong		8		(SLIP
+>20	lelong		9		(PPP
+>20	lelong		10		(FDDI
+>20	lelong		11		(RFC 1483 ATM
+>20	lelong		12		(raw IP
+>20	lelong		13		(BSD/OS SLIP
+>20	lelong		14		(BSD/OS PPP
+>20	lelong		50		(PPP or Cisco HDLC
+>20	lelong		51		(PPP-over-Ethernet
+>20	lelong		100		(RFC 1483 ATM
+>20	lelong		101		(raw IP
+>20	lelong		102		(BSD/OS SLIP
+>20	lelong		103		(BSD/OS PPP
+>20	lelong		104		(BSD/OS Cisco HDLC
+>20	lelong		105		(802.11
+>20	lelong		106		(Linux Classical IP over ATM
+>20	lelong		107		(Frame Relay
+>20	lelong		108		(OpenBSD loopback
+>20	lelong		109		(OpenBSD IPSEC encrypted
+>20	lelong		112		(Cisco HDLC
+>20	lelong		113		(Linux "cooked"
+>20	lelong		114		(LocalTalk
+>20	lelong		117		(OpenBSD PFLOG
+>20	lelong		119		(802.11 with Prism header
+>20	lelong		123		(SunATM
+>20	lelong		127		(802.11 with radiotap header
+>20	lelong		129		(Linux ARCNET
+>20	lelong		140		(MTP2
+>20	lelong		141		(MTP3
+>20	lelong		143		(DOCSIS
+>20	lelong		144		(IrDA
+>16	lelong		x		\b, capture length %d)
+
+#
+# "libpcap"-with-Alexey-Kuznetsov's-patches capture files.
+# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
+# the main program that uses that format, but there are other programs
+# that use "libpcap", or that use the same capture file format.)
+#
+0	ubelong		0xa1b2cd34	extended tcpdump capture file (big-endian)
+>4	beshort		x		- version %d
+>6	beshort		x		\b.%d
+>20	belong		0		(No link-layer encapsulation
+>20	belong		1		(Ethernet
+>20	belong		2		(3Mb Ethernet
+>20	belong		3		(AX.25
+>20	belong		4		(ProNET
+>20	belong		5		(CHAOS
+>20	belong		6		(Token Ring
+>20	belong		7		(ARCNET
+>20	belong		8		(SLIP
+>20	belong		9		(PPP
+>20	belong		10		(FDDI
+>20	belong		11		(RFC 1483 ATM
+>20	belong		12		(raw IP
+>20	belong		13		(BSD/OS SLIP
+>20	belong		14		(BSD/OS PPP
+>16	belong		x		\b, capture length %d)
+0	ulelong		0xa1b2cd34	extended tcpdump capture file (little-endian)
+>4	leshort		x		- version %d
+>6	leshort		x		\b.%d
+>20	lelong		0		(No link-layer encapsulation
+>20	lelong		1		(Ethernet
+>20	lelong		2		(3Mb Ethernet
+>20	lelong		3		(AX.25
+>20	lelong		4		(ProNET
+>20	lelong		5		(CHAOS
+>20	lelong		6		(Token Ring
+>20	lelong		7		(ARCNET
+>20	lelong		8		(SLIP
+>20	lelong		9		(PPP
+>20	lelong		10		(FDDI
+>20	lelong		11		(RFC 1483 ATM
+>20	lelong		12		(raw IP
+>20	lelong		13		(BSD/OS SLIP
+>20	lelong		14		(BSD/OS PPP
+>16	lelong		x		\b, capture length %d)
+
+#
+# AIX "iptrace" capture files.
+#
+0	string		iptrace\ 1.0	"iptrace" capture file
+0	string		iptrace\ 2.0	"iptrace" capture file
+
+#
+# Novell LANalyzer capture files.
+#
+0	leshort		0x1001		LANalyzer capture file
+0	leshort		0x1007		LANalyzer capture file
+
+#
+# HP-UX "nettl" capture files.
+#
+0	string		\x54\x52\x00\x64\x00	"nettl" capture file
+
+#
+# RADCOM WAN/LAN Analyzer capture files.
+#
+0	string		\x42\xd2\x00\x34\x12\x66\x22\x88	RADCOM WAN/LAN Analyzer capture file
+
+#
+# NetStumbler log files.  Not really packets, per se, but about as
+# close as you can get.  These are log files from NetStumbler, a
+# Windows program, that scans for 802.11b networks.
+#
+0	string		NetS		NetStumbler log file
+>8	lelong		x		\b, %d stations found
+
+#------------------------------------------------------------------------------
+# softquad:  file(1) magic for SoftQuad Publishing Software
+#
+# Author/Editor and RulesBuilder
+#
+# XXX - byte order?
+#
+0	string		\<!SQ\ DTD>	Compiled SGML rules file
+>9	string		>\0		 Type %s
+0	string		\<!SQ\ A/E>	A/E SGML Document binary
+>9	string		>\0		 Type %s
+0	string		\<!SQ\ STS>	A/E SGML binary styles file
+>9	string		>\0		 Type %s
+0	short		0xc0de		Compiled PSI (v1) data
+0	short		0xc0da		Compiled PSI (v2) data
+>3	string		>\0		(%s)
+# Binary sqtroff font/desc files...
+0	short		0125252		SoftQuad DESC or font file binary
+>2	short		>0		- version %d
+# Bitmaps...
+0	string		SQ\ BITMAP1	SoftQuad Raster Format text
+#0	string		SQ\ BITMAP2	SoftQuad Raster Format data
+# sqtroff intermediate language (replacement for ditroff int. lang.)
+0	string		X\ 		SoftQuad troff Context intermediate
+>2	string		495		for AT&T 495 laser printer
+>2	string		hp		for Hewlett-Packard LaserJet
+>2	string		impr		for IMAGEN imPRESS
+>2	string		ps		for PostScript
+
+#------------------------------------------------------------------------------
+# spectrum:  file(1) magic for Spectrum emulator files.
+#
+# John Elliott <jce at seasip.demon.co.uk>
+
+#
+# Spectrum +3DOS header
+#
+0       string          PLUS3DOS\032    Spectrum +3 data
+>15     byte            0               - BASIC program
+>15     byte            1               - number array
+>15     byte            2               - character array
+>15     byte            3               - memory block
+>>16    belong          0x001B0040      (screen)
+>15     byte            4               - Tasword document
+>15     string          TAPEFILE        - ZXT tapefile
+#
+# Tape file. This assumes the .TAP starts with a Spectrum-format header,
+# which nearly all will.
+#
+0       string          \023\000\000    Spectrum .TAP data
+>4      string          x               "%-10.10s"
+>3      byte            0               - BASIC program
+>3      byte            1               - number array
+>3      byte            2               - character array
+>3      byte            3               - memory block
+>>14    belong          0x001B0040      (screen)
+
+# The following three blocks are from pak21-spectrum at srcf.ucam.org
+# TZX tape images
+0      string          ZXTape!\x1a     Spectrum .TZX data
+>8     byte            x               version %d
+>9     byte            x               .%d
+
+# RZX input recording files
+0      string          RZX!            Spectrum .RZX data
+>4     byte            x               version %d
+>5     byte            x               .%d
+
+# And three sorts of disk image
+0      string          MV\ -\ CPCEMU\ Disk-Fil Amstrad/Spectrum .DSK data
+0      string          MV\ -\ CPC\ format\ Dis Amstrad/Spectrum DU54 .DSK data
+0      string          EXTENDED\ CPC\ DSK\ Fil Amstrad/Spectrum Extended .DSK data
+
+#------------------------------------------------------------------------------
+# sql:  file(1) magic for SQL files
+#
+# From: "Marty Leisner" <mleisner at eng.mc.xerox.com>
+# Recognize some MySQL files.
+#
+0	beshort			0xfe01		MySQL table definition file
+>2	byte			x		Version %d
+0	belong&0xffffff00	0xfefe0300	MySQL MISAM index file
+>3	byte			x		Version %d
+0	belong&0xffffff00	0xfefe0700	MySQL MISAM compressed data file
+>3	byte			x		Version %d
+0	belong&0xffffff00	0xfefe0500	MySQL ISAM index file
+>3	byte			x		Version %d
+0	belong&0xffffff00	0xfefe0600	MySQL ISAM compressed data file
+>3	byte			x		Version %d
+0	string		 	\376bin		MySQL replication log
+
+#------------------------------------------------------------------------------
+# sun:  file(1) magic for Sun machines
+#
+# Values for big-endian Sun (MC680x0, SPARC) binaries on pre-5.x
+# releases.  (5.x uses ELF.)
+#
+0	belong&077777777	0600413		SPARC demand paged
+>0	byte		&0x80
+>>20	belong		<4096		shared library
+>>20	belong		=4096		dynamically linked executable
+>>20	belong		>4096		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+0	belong&077777777	0600410		SPARC pure
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+0	belong&077777777	0600407		SPARC
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+
+0	belong&077777777	0400413		mc68020 demand paged
+>0	byte		&0x80
+>>20	belong		<4096		shared library
+>>20	belong		=4096		dynamically linked executable
+>>20	belong		>4096		dynamically linked executable
+>16	belong		>0		not stripped
+0	belong&077777777	0400410		mc68020 pure
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+0	belong&077777777	0400407		mc68020
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+
+0	belong&077777777	0200413		mc68010 demand paged
+>0	byte		&0x80
+>>20	belong		<4096		shared library
+>>20	belong		=4096		dynamically linked executable
+>>20	belong		>4096		dynamically linked executable
+>16	belong		>0		not stripped
+0	belong&077777777	0200410		mc68010 pure
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+0	belong&077777777	0200407		mc68010
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+
+# reworked these to avoid anything beginning with zero becoming "old sun-2"
+0	belong		0407		old sun-2 executable
+>16	belong		>0		not stripped
+0	belong		0410		old sun-2 pure executable
+>16	belong		>0		not stripped
+0	belong		0413		old sun-2 demand paged executable
+>16	belong		>0		not stripped
+
+#
+# Core files.  "SPARC 4.x BCP" means "core file from a SunOS 4.x SPARC
+# binary executed in compatibility mode under SunOS 5.x".
+#
+0	belong		0x080456	SunOS core file
+>4	belong		432		(SPARC)
+>>132	string		>\0		from '%s'
+>>116	belong		=3		(quit)
+>>116	belong		=4		(illegal instruction)
+>>116	belong		=5		(trace trap)
+>>116	belong		=6		(abort)
+>>116	belong		=7		(emulator trap)
+>>116	belong		=8		(arithmetic exception)
+>>116	belong		=9		(kill)
+>>116	belong		=10		(bus error)
+>>116	belong		=11		(segmentation violation)
+>>116	belong		=12		(bad argument to system call)
+>>116	belong		=29		(resource lost)
+>>120	belong		x		(T=%dK,
+>>124	belong		x		D=%dK,
+>>128	belong		x		S=%dK)
+>4	belong		826		(68K)
+>>128	string		>\0		from '%s'
+>4	belong		456		(SPARC 4.x BCP)
+>>152	string		>\0		from '%s'
+# Sun SunPC
+0	long		0xfa33c08e	SunPC 4.0 Hard Disk
+0	string		#SUNPC_CONFIG	SunPC 4.0 Properties Values
+# Sun snoop (see RFC 1761, which describes the capture file format).
+#
+0	string		snoop		Snoop capture file
+>8	belong		>0		- version %ld
+>12	belong		0		(IEEE 802.3)
+>12	belong		1		(IEEE 802.4)
+>12	belong		2		(IEEE 802.5)
+>12	belong		3		(IEEE 802.6)
+>12	belong		4		(Ethernet)
+>12	belong		5		(HDLC)
+>12	belong		6		(Character synchronous)
+>12	belong		7		(IBM channel-to-channel adapter)
+>12	belong		8		(FDDI)
+>12	belong		9		(Unknown)
+
+# Microsoft ICM color profile
+36	string		acspMSFT	Microsoft ICM Color Profile
+# Sun KCMS
+36	string		acsp		Kodak Color Management System, ICC Profile
+
+#---------------------------------------------------------------------------
+# The following entries have been tested by Duncan Laurie <duncan at sun.com> (a
+# lead Sun/Cobalt developer) who agrees that they are good and worthy of
+# inclusion.
+
+# Boot ROM images for Sun/Cobalt Linux server appliances
+0       string  Cobalt\ Networks\ Inc.\nFirmware\ v     Paged COBALT boot rom
+>38     string x        V%.4s
+
+# New format for Sun/Cobalt boot ROMs is annoying, it stores the version code
+# at the very end where file(1) can't get it.
+0       string CRfs     COBALT boot rom data (Flat boot rom or file system)
+
+
+#------------------------------------------------------------------------
+# sysex: file(1) magic for MIDI sysex files
+#
+# 
+0	byte			0xF0		SysEx File -
+
+# North American Group
+>1	byte			0x01		Sequential
+>1	byte			0x02		IDP
+>1	byte			0x03		OctavePlateau
+>1	byte			0x04		Moog
+>1	byte			0x05		Passport
+>1	byte			0x06		Lexicon
+>1	byte			0x07		Kurzweil
+>1	byte			0x08		Fender
+>1	byte			0x09		Gulbransen
+>1	byte			0x0a		AKG
+>1	byte			0x0b		Voyce
+>1	byte			0x0c		Waveframe
+>1	byte			0x0d		ADA
+>1	byte			0x0e		Garfield
+>1	byte			0x0f		Ensoniq
+>1	byte			0x10		Oberheim
+>1	byte			0x11		Apple
+>1	byte			0x12		GreyMatter
+>1	byte			0x14		PalmTree
+>1	byte			0x15		JLCooper
+>1	byte			0x16		Lowrey
+>1	byte			0x17		AdamsSmith
+>1	byte			0x18		E-mu
+>1	byte			0x19		Harmony
+>1	byte			0x1a		ART
+>1	byte			0x1b		Baldwin
+>1	byte			0x1c		Eventide
+>1	byte			0x1d		Inventronics
+>1	byte			0x1f		Clarity
+
+# European Group
+>1	byte			0x21		SIEL
+>1	byte			0x22		Synthaxe
+>1	byte			0x24		Hohner
+>1	byte			0x25		Twister
+>1	byte			0x26		Solton
+>1	byte			0x27		Jellinghaus
+>1	byte			0x28		Southworth
+>1	byte			0x29		PPG
+>1	byte			0x2a		JEN
+>1	byte			0x2b		SSL
+>1	byte			0x2c		AudioVertrieb
+
+>1	byte			0x2f		ELKA
+>>3	byte			0x09		EK-44
+
+>1	byte			0x30		Dynacord
+>1	byte			0x33		Clavia
+>1	byte			0x39		Soundcraft
+
+>1	byte			0x3e		Waldorf
+>>3	byte			0x7f		Microwave I
+
+# Japanese Group
+>1	byte			0x40		Kawai
+>>3	byte			0x20		K1
+>>3	byte			0x22		K4
+
+>1	byte			0x41		Roland
+>>3	byte			0x14		D-50
+>>3	byte			0x2b		U-220
+>>3	byte			0x02		TR-707
+
+>1	byte			0x42		Korg
+>>3	byte			0x19		M1
+
+>1	byte			0x43		Yamaha
+>1	byte			0x44		Casio
+>1	byte			0x46		Kamiya
+>1	byte			0x47		Akai
+>1	byte			0x48		Victor
+>1	byte			0x49		Mesosha
+>1	byte			0x4b		Fujitsu
+>1	byte			0x4c		Sony
+>1	byte			0x4e		Teac
+>1	byte			0x50		Matsushita
+>1	byte			0x51		Fostex
+>1	byte			0x52		Zoom
+>1	byte			0x54		Matsushita
+>1	byte			0x57		Acoustic tech. lab.
+
+>1	belong&0xffffff00	0x00007400	Ta Horng
+>1	belong&0xffffff00	0x00007500	e-Tek
+>1	belong&0xffffff00	0x00007600	E-Voice
+>1	belong&0xffffff00	0x00007700	Midisoft
+>1	belong&0xffffff00	0x00007800	Q-Sound
+>1	belong&0xffffff00	0x00007900	Westrex
+>1	belong&0xffffff00	0x00007a00	Nvidia*
+>1	belong&0xffffff00	0x00007b00	ESS
+>1	belong&0xffffff00	0x00007c00	Mediatrix
+>1	belong&0xffffff00	0x00007d00	Brooktree
+>1	belong&0xffffff00	0x00007e00	Otari
+>1	belong&0xffffff00	0x00007f00	Key Electronics
+>1	belong&0xffffff00	0x00010000	Shure
+>1	belong&0xffffff00	0x00010100	AuraSound
+>1	belong&0xffffff00	0x00010200	Crystal
+>1	belong&0xffffff00	0x00010300	Rockwell
+>1	belong&0xffffff00	0x00010400	Silicon Graphics
+>1	belong&0xffffff00	0x00010500	Midiman
+>1	belong&0xffffff00	0x00010600	PreSonus
+>1	belong&0xffffff00	0x00010800	Topaz
+>1	belong&0xffffff00	0x00010900	Cast Lightning
+>1	belong&0xffffff00	0x00010a00	Microsoft
+>1	belong&0xffffff00	0x00010b00	Sonic Foundry
+>1	belong&0xffffff00	0x00010c00	Line 6
+>1	belong&0xffffff00	0x00010d00	Beatnik Inc.
+>1	belong&0xffffff00	0x00010e00	Van Koerving
+>1	belong&0xffffff00	0x00010f00	Altech Systems
+>1	belong&0xffffff00	0x00011000	S & S Research
+>1	belong&0xffffff00	0x00011100	VLSI Technology
+>1	belong&0xffffff00	0x00011200	Chromatic
+>1	belong&0xffffff00	0x00011300	Sapphire
+>1	belong&0xffffff00	0x00011400	IDRC
+>1	belong&0xffffff00	0x00011500	Justonic Tuning
+>1	belong&0xffffff00	0x00011600	TorComp
+>1	belong&0xffffff00	0x00011700	Newtek Inc.
+>1	belong&0xffffff00	0x00011800	Sound Sculpture
+>1	belong&0xffffff00	0x00011900	Walker Technical
+>1	belong&0xffffff00	0x00011a00	Digital Harmony
+>1	belong&0xffffff00	0x00011b00	InVision
+>1	belong&0xffffff00	0x00011c00	T-Square
+>1	belong&0xffffff00	0x00011d00	Nemesys
+>1	belong&0xffffff00	0x00011e00	DBX
+>1	belong&0xffffff00	0x00011f00	Syndyne
+>1	belong&0xffffff00	0x00012000	Bitheadz	
+>1	belong&0xffffff00	0x00012100	Cakewalk
+>1	belong&0xffffff00	0x00012200	Staccato
+>1	belong&0xffffff00	0x00012300	National Semicon.
+>1	belong&0xffffff00	0x00012400	Boom Theory
+>1	belong&0xffffff00	0x00012500	Virtual DSP Corp
+>1	belong&0xffffff00	0x00012600	Antares
+>1	belong&0xffffff00	0x00012700	Angel Software
+>1	belong&0xffffff00	0x00012800	St Louis Music
+>1	belong&0xffffff00	0x00012900	Lyrrus dba G-VOX
+>1	belong&0xffffff00	0x00012a00	Ashley Audio
+>1	belong&0xffffff00	0x00012b00	Vari-Lite
+>1	belong&0xffffff00	0x00012c00	Summit Audio
+>1	belong&0xffffff00	0x00012d00	Aureal Semicon.
+>1	belong&0xffffff00	0x00012e00	SeaSound
+>1	belong&0xffffff00	0x00012f00	U.S. Robotics
+>1	belong&0xffffff00	0x00013000	Aurisis
+>1	belong&0xffffff00	0x00013100	Nearfield Multimedia
+>1	belong&0xffffff00	0x00013200	FM7 Inc.
+>1	belong&0xffffff00	0x00013300	Swivel Systems
+>1	belong&0xffffff00	0x00013400	Hyperactive
+>1	belong&0xffffff00	0x00013500	MidiLite
+>1	belong&0xffffff00	0x00013600	Radical
+>1	belong&0xffffff00	0x00013700	Roger Linn
+>1	belong&0xffffff00	0x00013800	Helicon
+>1	belong&0xffffff00	0x00013900	Event
+>1	belong&0xffffff00	0x00013a00	Sonic Network
+>1	belong&0xffffff00	0x00013b00	Realtime Music
+>1	belong&0xffffff00	0x00013c00	Apogee Digital
+
+>1	belong&0xffffff00	0x00202b00	Medeli Electronics
+>1	belong&0xffffff00	0x00202c00	Charlie Lab
+>1	belong&0xffffff00	0x00202d00	Blue Chip Music
+>1	belong&0xffffff00	0x00202e00	BEE OH Corp
+>1	belong&0xffffff00	0x00202f00	LG Semicon America
+>1	belong&0xffffff00	0x00203000	TESI
+>1	belong&0xffffff00	0x00203100	EMAGIC
+>1	belong&0xffffff00	0x00203200	Behringer
+>1	belong&0xffffff00	0x00203300	Access Music
+>1	belong&0xffffff00	0x00203400	Synoptic
+>1	belong&0xffffff00	0x00203500	Hanmesoft Corp
+>1	belong&0xffffff00	0x00203600	Terratec
+>1	belong&0xffffff00	0x00203700	Proel SpA
+>1	belong&0xffffff00	0x00203800	IBK MIDI
+>1	belong&0xffffff00	0x00203900	IRCAM
+>1	belong&0xffffff00	0x00203a00	Propellerhead Software
+>1	belong&0xffffff00	0x00203b00	Red Sound Systems
+>1	belong&0xffffff00	0x00203c00	Electron ESI AB
+>1	belong&0xffffff00	0x00203d00	Sintefex Audio
+>1	belong&0xffffff00	0x00203e00	Music and More
+>1	belong&0xffffff00	0x00203f00	Amsaro
+>1	belong&0xffffff00	0x00204000	CDS Advanced Technology
+>1	belong&0xffffff00	0x00204100	Touched by Sound
+>1	belong&0xffffff00	0x00204200	DSP Arts
+>1	belong&0xffffff00	0x00204300	Phil Rees Music
+>1	belong&0xffffff00	0x00204400	Stamer Musikanlagen GmbH
+>1	belong&0xffffff00	0x00204500	Soundart
+>1	belong&0xffffff00	0x00204600	C-Mexx Software
+>1	belong&0xffffff00	0x00204700	Klavis Tech.
+>1	belong&0xffffff00	0x00204800	Noteheads AB
+
+0	string			T707		Roland TR-707 Data
+#------------------------------------------------------------------------------
+# teapot:  file(1) magic for "teapot" spreadsheet
+#
+0       string          #!teapot\012xdr      teapot work sheet (XDR format)
+
+#------------------------------------------------------------------------------
+# terminfo:  file(1) magic for terminfo
+#
+# XXX - byte order for screen images?
+#
+0	string		\032\001	Compiled terminfo entry
+0	short		0433		Curses screen image
+0	short		0434		Curses screen image
+
+#------------------------------------------------------------------------------
+# tex:  file(1) magic for TeX files
+#
+# From <conklin at talisman.kaleida.com>
+
+# Although we may know the offset of certain text fields in TeX DVI
+# and font files, we can't use them reliably because they are not
+# zero terminated. [but we do anyway, christos]
+0	string		\367\002	TeX DVI file
+>16	string		>\0		(%s)
+0	string		\367\203	TeX generic font data
+0	string		\367\131	TeX packed font data
+>3	string		>\0		(%s)
+0	string		\367\312	TeX virtual font data
+0	string		This\ is\ TeX,	TeX transcript text
+0	string		This\ is\ METAFONT,	METAFONT transcript text
+
+# There is no way to detect TeX Font Metric (*.tfm) files without
+# breaking them apart and reading the data.  The following patterns
+# match most *.tfm files generated by METAFONT or afm2tfm.
+2	string		\000\021	TeX font metric data
+>33	string		>\0		(%s)
+2	string		\000\022	TeX font metric data
+>33	string		>\0		(%s)
+
+# Texinfo and GNU Info, from Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		\\input\ texinfo	Texinfo source text
+0	string		This\ is\ Info\ file	GNU Info text
+
+# TeX documents, from Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		\\input		TeX document text
+0	string		\\section	LaTeX document text
+0	string		\\setlength	LaTeX document text
+0	string		\\documentstyle	LaTeX document text
+0	string		\\chapter	LaTeX document text
+0	string		\\documentclass	LaTeX 2e document text
+0	string		\\relax		LaTeX auxiliary file
+0	string		\\contentsline	LaTeX  table of contents
+0	string		%\ -*-latex-*-	LaTeX document text
+
+# Tex document, from Hendrik Scholz <hendrik at scholz.net>
+0   string      \\ifx       TeX document text
+
+# Index and glossary files
+0	string		\\indexentry	LaTeX raw index file
+0	string		\\begin{theindex}	LaTeX sorted index
+0	string		\\glossaryentry	LaTeX raw glossary
+0	string		\\begin{theglossary}	LaTeX sorted glossary
+0	string		This\ is\ makeindex	Makeindex log file
+
+# End of TeX
+
+#------------------------------------------------------------------------------
+# file(1) magic for BibTex text files
+# From Hendrik Scholz <hendrik at scholz.net>
+
+0   string @article{          BibTex text file
+0   string @book{             BibTex text file
+0   string @inbook{           BibTex text file
+0   string @incollection{     BibTex text file
+0   string @inproceedings{    BibTex text file
+0   string @manual{           BibTex text file
+0   string @misc{             BibTex text file
+0   string @preamble{         BibTex text file
+0   string @phdthesis{        BibTex text file
+0   string @techreport{       BibTex text file
+0   string @unpublished{      BibTex text file
+
+0   string @Article{          BibTex text file
+0   string @Book{             BibTex text file
+0   string @Inbook{           BibTex text file
+0   string @Incollection{     BibTex text file
+0   string @Inproceedings{    BibTex text file
+0   string @Manual{           BibTex text file
+0   string @Misc{             BibTex text file
+0   string @Preamble{         BibTex text file
+0   string @Phdthesis{        BibTex text file
+0   string @Techreport{       BibTex text file
+0   string @Unpublished{      BibTex text file
+
+0   string @ARTICLE{          BibTex text file
+0   string @BOOK{             BibTex text file
+0   string @INBOOK{           BibTex text file
+0   string @INCOLLECTION{     BibTex text file
+0   string @INPROCEEDINGS{    BibTex text file
+0   string @MANUAL{           BibTex text file
+0   string @MISC{             BibTex text file
+0   string @PREAMBLE{         BibTex text file
+0   string @PHDTHESIS{        BibTex text file
+0   string @TECHREPORT{       BibTex text file
+0   string @UNPUBLISHED{      BibTex text file
+
+73  string %%%\ \ BibTeX-file{ BibTex text file (with full header)
+
+73  string %%%\ \ @BibTeX-style-file{   BibTeX style text file (with full header)
+
+0   string %\ BibTeX\ standard\ bibliography\      BibTeX standard bibliography style text file
+
+0   string %\ BibTeX\ `     BibTeX custom bibliography style text file
+
+0   string  @c\ @mapfile{   TeX font aliases text file
+
+#------------------------------------------------------------------------------
+# file(1) magic for tgif(1) files
+# From Hendrik Scholz <hendrik at scholz.net>
+
+0   string  %TGIF\ 4   tgif version 4 object file
+
+# ------------------------------------------------------------------------
+# ti-8x: file(1) magic for the TI-8x and TI-9x Graphing Calculators.
+#
+# From: Ryan McGuire (rmcguire at freenet.columbus.oh.us).
+#
+# Update: Romain Lievin (roms at lpg.ticalc.org).
+#
+# NOTE: This list is not complete.
+# Files for the TI-80 and TI-81 are pretty rare. I'm not going to put the
+# program/group magic numbers in here because I cannot find any.
+0		string		**TI80**	TI-80 Graphing Calculator File.
+0		string		**TI81**	TI-81 Graphing Calculator File.
+#
+# Magic Numbers for the TI-73
+#
+0		string		**TI73**	TI-73 Graphing Calculator
+>0x00003B	byte		0x00		(real number)
+>0x00003B	byte		0x01		(list)
+>0x00003B	byte		0x02		(matrix)
+>0x00003B	byte		0x03		(equation)
+>0x00003B	byte		0x04		(string)
+>0x00003B	byte		0x05		(program)
+>0x00003B	byte		0x06		(assembly program)
+>0x00003B	byte		0x07		(picture)
+>0x00003B	byte		0x08		(gdb)
+>0x00003B	byte		0x0C		(complex number)
+>0x00003B	byte		0x0F		(window settings)
+>0x00003B	byte		0x10		(zoom)
+>0x00003B	byte		0x11		(table setup)
+>0x00003B	byte		0x13		(backup)
+
+# Magic Numbers for the TI-82
+#
+0		string		**TI82**	TI-82 Graphing Calculator
+>0x00003B	byte		0x00		(real)
+>0x00003B	byte		0x01		(list)
+>0x00003B	byte		0x02		(matrix)
+>0x00003B	byte		0x03		(Y-variable)
+>0x00003B	byte		0x05		(program)
+>0x00003B	byte		0x06		(protected prgm)
+>0x00003B	byte		0x07		(picture)
+>0x00003B	byte		0x08		(gdb)
+>0x00003B	byte		0x0B		(window settings)
+>0x00003B	byte		0x0C		(window settings)
+>0x00003B	byte		0x0D		(table setup)
+>0x00003B	byte		0x0E		(screenshot)
+>0x00003B	byte		0x0F		(backup)
+#
+# Magic Numbers for the TI-83
+#
+0		string		**TI83**	TI-83 Graphing Calculator
+>0x00003B	byte		0x00		(real)
+>0x00003B	byte		0x01		(list)
+>0x00003B	byte		0x02		(matrix)
+>0x00003B	byte		0x03		(Y-variable)
+>0x00003B	byte		0x04		(string)
+>0x00003B	byte		0x05		(program)
+>0x00003B	byte		0x06		(protected prgm)
+>0x00003B	byte		0x07		(picture)
+>0x00003B	byte		0x08		(gdb)
+>0x00003B	byte		0x0B		(window settings)
+>0x00003B	byte		0x0C		(window settings)
+>0x00003B	byte		0x0D		(table setup)
+>0x00003B	byte		0x0E		(screenshot)
+>0x00003B	byte		0x13		(backup)
+#
+# Magic Numbers for the TI-83+
+#
+0		string		**TI83F*	TI-83+ Graphing Calculator
+>0x00003B	byte		0x00		(real number)
+>0x00003B	byte		0x01		(list)
+>0x00003B	byte		0x02		(matrix)
+>0x00003B	byte		0x03		(equation)
+>0x00003B	byte		0x04		(string)
+>0x00003B	byte		0x05		(program)
+>0x00003B	byte		0x06		(assembly program)
+>0x00003B	byte		0x07		(picture)
+>0x00003B	byte		0x08		(gdb)
+>0x00003B	byte		0x0C		(complex number)
+>0x00003B	byte		0x0F		(window settings)
+>0x00003B	byte		0x10		(zoom)
+>0x00003B	byte		0x11		(table setup)
+>0x00003B	byte		0x13		(backup)
+>0x00003B	byte		0x15		(application variable)
+>0x00003B	byte		0x17		(group of variable)
+
+#
+# Magic Numbers for the TI-85
+#
+0		string		**TI85**	TI-85 Graphing Calculator
+>0x00003B	byte		0x00		(real number)
+>0x00003B	byte		0x01		(complex number)
+>0x00003B	byte		0x02		(real vector)
+>0x00003B	byte		0x03		(complex vector)
+>0x00003B	byte		0x04		(real list)
+>0x00003B	byte		0x05		(complex list)
+>0x00003B	byte		0x06		(real matrix)
+>0x00003B	byte		0x07		(complex matrix)
+>0x00003B	byte		0x08		(real constant)
+>0x00003B	byte		0x09		(complex constant)
+>0x00003B	byte		0x0A		(equation)
+>0x00003B	byte		0x0C		(string)
+>0x00003B	byte		0x0D		(function GDB)
+>0x00003B	byte		0x0E		(polar GDB)
+>0x00003B	byte		0x0F		(parametric GDB)
+>0x00003B	byte		0x10		(diffeq GDB)
+>0x00003B	byte		0x11		(picture)
+>0x00003B	byte		0x12		(program)
+>0x00003B	byte		0x13		(range)
+>0x00003B	byte		0x17		(window settings)
+>0x00003B	byte		0x18		(window settings)
+>0x00003B	byte		0x19		(window settings)
+>0x00003B	byte		0x1A		(window settings)
+>0x00003B	byte		0x1B		(zoom)
+>0x00003B	byte		0x1D		(backup)
+>0x00003B	byte		0x1E		(unknown)
+>0x00003B	byte		0x2A		(equation)
+>0x000032	string		ZS4		- ZShell Version 4 File.
+>0x000032	string		ZS3		- ZShell Version 3 File.
+#
+# Magic Numbers for the TI-86
+#
+0		string		**TI86**	TI-86 Graphing Calculator
+>0x00003B	byte		0x00		(real number)
+>0x00003B	byte		0x01		(complex number)
+>0x00003B	byte		0x02		(real vector)
+>0x00003B	byte		0x03		(complex vector)
+>0x00003B	byte		0x04		(real list)
+>0x00003B	byte		0x05		(complex list)
+>0x00003B	byte		0x06		(real matrix)
+>0x00003B	byte		0x07		(complex matrix)
+>0x00003B	byte		0x08		(real constant)
+>0x00003B	byte		0x09		(complex constant)
+>0x00003B	byte		0x0A		(equation)
+>0x00003B	byte		0x0C		(string)
+>0x00003B	byte		0x0D		(function GDB)
+>0x00003B	byte		0x0E		(polar GDB)
+>0x00003B	byte		0x0F		(parametric GDB)
+>0x00003B	byte		0x10		(diffeq GDB)
+>0x00003B	byte		0x11		(picture)
+>0x00003B	byte		0x12		(program)
+>0x00003B	byte		0x13		(range)
+>0x00003B	byte		0x17		(window settings)
+>0x00003B	byte		0x18		(window settings)
+>0x00003B	byte		0x19		(window settings)
+>0x00003B	byte		0x1A		(window settings)
+>0x00003B	byte		0x1B		(zoom)
+>0x00003B	byte		0x1D		(backup)
+>0x00003B	byte		0x1E		(unknown)
+>0x00003B	byte		0x2A		(equation)
+#
+# Magic Numbers for the TI-89
+#
+0		string		**TI89**	TI-89 Graphing Calculator
+>0x000048	byte		0x00		(expression)
+>0x000048	byte		0x04		(list)
+>0x000048	byte		0x06		(matrix)
+>0x000048	byte		0x0A		(data)
+>0x000048	byte		0x0B		(text)
+>0x000048	byte		0x0C		(string)
+>0x000048	byte		0x0D		(graphic data base)
+>0x000048	byte		0x0E		(figure)
+>0x000048	byte		0x10		(picture)
+>0x000048	byte		0x12		(program)
+>0x000048	byte		0x13		(function)
+>0x000048	byte		0x14		(macro)
+>0x000048	byte		0x1C		(zipped)
+>0x000048	byte		0x21		(assembler)
+#
+# Magic Numbers for the TI-92
+#
+0		string		**TI92**	TI-92 Graphing Calculator
+>0x000048	byte		0x00		(expression)
+>0x000048	byte		0x04		(list)
+>0x000048	byte		0x06		(matrix)
+>0x000048	byte		0x0A		(data)
+>0x000048	byte		0x0B		(text)
+>0x000048	byte		0x0C		(string)
+>0x000048	byte		0x0D		(graphic data base)
+>0x000048	byte		0x0E		(figure)
+>0x000048	byte		0x10		(picture)
+>0x000048	byte		0x12		(program)
+>0x000048	byte		0x13		(function)
+>0x000048	byte		0x14		(macro)
+>0x000048	byte		0x1D		(backup)
+#
+# Magic Numbers for the TI-92+/V200
+#
+0		string		**TI92P*	TI-92+/V200 Graphing Calculator
+>0x000048	byte		0x00		(expression)
+>0x000048	byte		0x04		(list)
+>0x000048	byte		0x06		(matrix)
+>0x000048	byte		0x0A		(data)
+>0x000048	byte		0x0B		(text)
+>0x000048	byte		0x0C		(string)
+>0x000048	byte		0x0D		(graphic data base)
+>0x000048	byte		0x0E		(figure)
+>0x000048	byte		0x10		(picture)
+>0x000048	byte		0x12		(program)
+>0x000048	byte		0x13		(function)
+>0x000048	byte		0x14		(macro)
+>0x000048	byte		0x1C		(zipped)
+>0x000048	byte		0x21		(assembler)
+#
+# Magic Numbers for the TI-73/83+/89/92+/V200 FLASH upgrades
+#
+0x0000016	string		Advanced	TI-XX Graphing Calculator (FLASH)
+0		string		**TIFL**	TI-XX Graphing Calculator (FLASH)
+>8		byte		>0		- Revision %d
+>>9 		byte		x		\b.%d,
+>12		byte		>0		Revision date %02x
+>>13		byte		x		\b/%02x
+>>14		beshort		x		\b/%04x,
+>17		string		>/0		name: '%s',
+>48		byte		0x74		device: TI-73,
+>48		byte		0x73		device: TI-83+,
+>48		byte		0x98		device: TI-89,
+>48		byte		0x88		device: TI-92+,
+>49		byte		0x23		type: OS upgrade,
+>49		byte		0x24		type: application,
+>49		byte		0x25		type: certificate,
+>49		byte		0x3e		type: license,
+>74		lelong		>0		size: %ld bytes
+
+# VTi & TiEmu skins (TI Graphing Calculators).
+# From: Romain Lievin (roms at lpg.ticalc.org).
+# Magic Numbers for the VTi skins
+0               string          VTI		Virtual TI skin
+>3		string		v		- Version
+>>4		byte		>0		\b %c
+>>6		byte		x		\b.%c
+# Magic Numbers for the TiEmu skins
+0		string		TiEmu		TiEmu skin
+>6              string          v               - Version
+>>7             byte            >0              \b %c
+>>9             byte            x               \b.%c
+>>10		byte		x		\b%c
+
+#------------------------------------------------------------------------------
+# timezone:  file(1) magic for timezone data
+#
+# from Daniel Quinlan (quinlan at yggdrasil.com)
+# this should work on Linux, SunOS, and maybe others
+# Added new official magic number for recent versions of the Olson code
+0	string	TZif	timezone data
+0	string	\0\0\0\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	old timezone data
+0	string	\0\0\0\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\0	old timezone data
+0	string  \0\0\0\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\0	old timezone data
+0	string	\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0	old timezone data
+0	string	\0\0\0\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\0	old timezone data
+0	string	\0\0\0\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\0	old timezone data
+
+#------------------------------------------------------------------------------
+# troff:  file(1) magic for *roff
+#
+# updated by Daniel Quinlan (quinlan at yggdrasil.com)
+
+# troff input
+0	string		.\\"		troff or preprocessor input text
+0	string		'\\"		troff or preprocessor input text
+0	string		'.\\"		troff or preprocessor input text
+0	string		\\"		troff or preprocessor input text
+0	string		'''		troff or preprocessor input text
+
+# ditroff intermediate output text
+0	string		x\ T		ditroff output text
+>4	string		cat		for the C/A/T phototypesetter
+>4	string		ps		for PostScript
+>4	string		dvi		for DVI
+>4	string		ascii		for ASCII
+>4	string		lj4		for LaserJet 4
+>4	string		latin1		for ISO 8859-1 (Latin 1)
+>4	string		X75		for xditview at 75dpi
+>>7	string		-12		(12pt)
+>4	string		X100		for xditview at 100dpi
+>>8	string		-12		(12pt)
+
+# output data formats
+0	string		\100\357	very old (C/A/T) troff output data
+#
+#------------------------------------------------------------------------------
+# tuxedo:	file(1) magic for BEA TUXEDO data files
+#
+# from Ian Springer <ispringer at hotmail.com>
+#
+0	string		\0\0\1\236\0\0\0\0\0\0\0\0\0\0\0\0	BEA TUXEDO DES mask data
+
+#------------------------------------------------------------------------------
+# typeset:  file(1) magic for other typesetting
+#
+0	string		Interpress/Xerox	Xerox InterPress data
+>16	string		/			(version
+>>17	string		>\0			%s)
+
+#------------------------------------------------------------------------------
+# unknown:  file(1) magic for unknown machines
+#
+# XXX - this probably should be pruned, as it'll match PDP-11 and
+# VAX image formats.
+#
+# 0x107 is 0407; 0x108 is 0410; both are PDP-11 (executable and pure,
+# respectively).
+#
+# 0x109 is 0411; that's PDP-11 split I&D, but the PDP-11 version doesn't
+# have the "version %ld", which may be a bogus COFFism (I don't think
+# there ever was COFF for the PDP-11).
+#
+# 0x10B is 0413; that's VAX demand-paged, but this is a short, not a
+# long, as it would be on a VAX.
+#
+# 0x10C is 0414 and 0x10E is 416; those *are* unknown.
+#
+0	short		0x107		unknown machine executable
+>8	short		>0		not stripped
+>15	byte		>0		- version %ld
+0	short		0x108		unknown pure executable
+>8	short		>0		not stripped
+>15	byte		>0		- version %ld
+0	short		0x109		PDP-11 separate I&D
+>8	short		>0		not stripped
+>15	byte		>0		- version %ld
+0	short		0x10b		unknown pure executable
+>8	short		>0		not stripped
+>15	byte		>0		- version %ld
+0	long		0x10c		unknown demand paged pure executable
+>16	long		>0		not stripped
+0	long		0x10e		unknown readable demand paged pure executable
+
+#------------------------------------------------------------------------------
+# uuencode:  file(1) magic for ASCII-encoded files
+#
+
+# GRR:  the first line of xxencoded files is identical to that in uuencoded
+# files, but the first character in most subsequent lines is 'h' instead of
+# 'M'.  (xxencoding uses lowercase letters in place of most of uuencode's
+# punctuation and survives BITNET gateways better.)  If regular expressions
+# were supported, this entry could possibly be split into two with
+# "begin\040\.\*\012M" or "begin\040\.\*\012h" (where \. and \* are REs).
+0	string		begin\040	uuencoded or xxencoded text
+
+# btoa(1) is an alternative to uuencode that requires less space.
+0	string		xbtoa\ Begin	btoa'd text
+
+# ship(1) is another, much cooler alternative to uuencode.
+# Greg Roelofs, newt at uchicago.edu
+0	string		$\012ship	ship'd binary text
+
+# bencode(8) is used to encode compressed news batches (Bnews/Cnews only?)
+# Greg Roelofs, newt at uchicago.edu
+0	string	Decode\ the\ following\ with\ bdeco	bencoded News text
+
+# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
+# Daniel Quinlan, quinlan at yggdrasil.com
+11	string	must\ be\ converted\ with\ BinHex	BinHex binary text
+>41	string	x					\b, version %.3s
+
+# GRR:  is MIME BASE64 encoding handled somewhere?
+
+#------------------------------------------------------------------------------
+# varied.out:  file(1) magic for various USG systems
+#
+#	Herewith many of the object file formats used by USG systems.
+#	Most have been moved to files for a particular processor,
+#	and deleted if they duplicate other entries.
+#
+0	short		0610		Perkin-Elmer executable
+# AMD 29K
+0	beshort		0572		amd 29k coff noprebar executable
+0	beshort		01572		amd 29k coff prebar executable
+0	beshort		0160007		amd 29k coff archive
+# Cray
+6	beshort		0407		unicos (cray) executable
+# Ultrix 4.3
+596	string		\130\337\377\377	Ultrix core file
+>600	string		>\0		from '%s'
+# BeOS and MAcOS PEF executables
+# From: hplus at zilker.net (Jon Watte)
+0	string		Joy!peffpwpc	header for PowerPC PEF executable
+#
+# ava assembler/linker Uros Platise <uros.platise at ijs.si>
+0       string          avaobj  AVR assembler object code
+>7      string          >\0     version '%s'
+# gnu gmon magic From: Eugen Dedu <dedu at ese-metz.fr>
+0	string		gmon		GNU prof performance data
+>4	long		x		- version %ld
+# From: Dave Pearson <davep at davep.org>
+# Harbour <URL:http://www.harbour-project.org/> HRB files.
+0	string		\xc0HRB		Harbour HRB file
+>4	short		x		version %d
+
+# From: "Stefan A. Haubenthal" <polluks at web.de>
+0	belong		0x000001EB	Plan 9 executable
+#------------------------------------------------------------------------------
+# varied.script:  file(1) magic for various interpreter scripts
+
+0	string		#!\ /			a
+>3	string		>\0			%s script text
+0	string		#!\	/		a
+>3	string		>\0			%s script text
+0	string		#!/			a
+>2	string		>\0			%s script text
+0	string		#!\ 			script text
+>3	string		>\0			for %s
+
+
+#------------------------------------------------------------------------------
+# vax:  file(1) magic for VAX executable/object and APL workspace
+#
+0	lelong		0101557		VAX single precision APL workspace
+0	lelong		0101556		VAX double precision APL workspace
+
+#
+# VAX a.out (32V, BSD)
+#
+0	lelong		0407		VAX executable
+>16	lelong		>0		not stripped
+
+0	lelong		0410		VAX pure executable
+>16	lelong		>0		not stripped
+
+0	lelong		0413		VAX demand paged pure executable
+>16	lelong		>0		not stripped
+
+0	lelong		0420		VAX demand paged (first page unmapped) pure executable
+>16	lelong		>0		not stripped
+
+#
+# VAX COFF
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0	leshort		0570		VAX COFF executable
+>12	lelong		>0		not stripped
+>22	leshort		>0		- version %ld
+0	leshort		0575		VAX COFF pure executable
+>12	lelong		>0		not stripped
+>22	leshort		>0		- version %ld
+
+#------------------------------------------------------------------------------
+# vicar:  file(1) magic for VICAR files.
+#
+# From: Ossama Othman <othman at astrosun.tn.cornell.edu
+# VICAR is JPL's in-house spacecraft image processing program
+# VICAR image
+0	string	LBLSIZE=	VICAR image data
+>32	string	BYTE		\b, 8 bits  = VAX byte
+>32	string	HALF		\b, 16 bits = VAX word     = Fortran INTEGER*2
+>32	string	FULL		\b, 32 bits = VAX longword = Fortran INTEGER*4
+>32	string	REAL		\b, 32 bits = VAX longword = Fortran REAL*4
+>32	string	DOUB		\b, 64 bits = VAX quadword = Fortran REAL*8
+>32	string	COMPLEX		\b, 64 bits = VAX quadword = Fortran COMPLEX*8
+# VICAR label file
+43	string	SFDU_LABEL	VICAR label file
+
+#------------------------------------------------------------------------------
+# visx:  file(1) magic for Visx format files
+#
+0	short		0x5555		VISX image file
+>2	byte		0		(zero)
+>2	byte		1		(unsigned char)
+>2	byte		2		(short integer)
+>2	byte		3		(float 32)
+>2	byte		4		(float 64)
+>2	byte		5		(signed char)
+>2	byte		6		(bit-plane)
+>2	byte		7		(classes)
+>2	byte		8		(statistics)
+>2	byte		10		(ascii text)
+>2	byte		15		(image segments)
+>2	byte		100		(image set)
+>2	byte		101		(unsigned char vector)
+>2	byte		102		(short integer vector)
+>2	byte		103		(float 32 vector)
+>2	byte		104		(float 64 vector)
+>2	byte		105		(signed char vector)
+>2	byte		106		(bit plane vector)
+>2	byte		121		(feature vector)
+>2	byte		122		(feature vector library)
+>2	byte		124		(chain code)
+>2	byte		126		(bit vector)
+>2	byte		130		(graph)
+>2	byte		131		(adjacency graph)
+>2	byte		132		(adjacency graph library)
+>2	string		.VISIX		(ascii text)
+
+#------------------------------------------------------------------------------
+# vms:  file(1) magic for VMS executables (experimental)
+#
+# VMS .exe formats, both VAX and AXP (Greg Roelofs, newt at uchicago.edu)
+
+# GRR 950122:  I'm just guessing on these, based on inspection of the headers
+# of three executables each for Alpha and VAX architectures.  The VAX files
+# all had headers similar to this:
+#
+#   00000  b0 00 30 00 44 00 60 00  00 00 00 00 30 32 30 35  ..0.D.`.....0205
+#   00010  01 01 00 00 ff ff ff ff  ff ff ff ff 00 00 00 00  ................
+#
+0	string	\xb0\0\x30\0	VMS VAX executable
+>44032	string	PK\003\004	\b, Info-ZIP SFX archive v5.12 w/decryption
+#
+# The AXP files all looked like this, except that the byte at offset 0x22
+# was 06 in some of them and 07 in others:
+#
+#   00000  03 00 00 00 00 00 00 00  ec 02 00 00 10 01 00 00  ................
+#   00010  68 00 00 00 98 00 00 00  b8 00 00 00 00 00 00 00  h...............
+#   00020  00 00 07 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
+#   00030  00 00 00 00 01 00 00 00  00 00 00 00 00 00 00 00  ................
+#   00040  00 00 00 00 ff ff ff ff  ff ff ff ff 02 00 00 00  ................
+#
+0	belong	0x03000000	VMS Alpha executable
+>75264	string	PK\003\004	\b, Info-ZIP SFX archive v5.12 w/decryption
+
+# -----------------------------------------------------------
+# VMware specific files (deducted from version 1.1 and log file entries)
+# Anthon van der Neut (anthon at mnt.org)
+0	belong	0x4d52564e	VMware nvram 
+0	belong	0x434f5744	VMware
+>4	byte	3	 	virtual disk 
+>>32	lelong	x		(%d/
+>>36	lelong	x		\b%d/
+>>40	lelong	x		\b%d)
+>4	byte	2	 	undoable disk
+>>32	string  >\0		(%s)
+
+#------------------------------------------------------------------------------
+# vorbis:  file(1) magic for Ogg/Vorbis files
+#
+# From Felix von Leitner <leitner at fefe.de>
+# Extended by Beni Cherniavsky <cben at crosswinds.net>
+# Further extended by Greg Wooledge <greg at wooledge.org>
+#
+# Most (everything but the number of channels and bitrate) is commented
+# out with `##' as it's not interesting to the average user.  The most
+# probable things advanced users would want to uncomment are probably
+# the number of comments and the encoder version.
+#
+# --- Ogg Framing ---
+0		string		OggS		Ogg data
+>4		byte		!0		UNKNOWN REVISION %u
+##>4		byte		0		revision 0
+>4		byte		0
+##>>14		lelong		x		(Serial %lX)
+# non-Vorbis content: FLAC (Free Loss-lessy Audio Codec,
+# http://flac.sourceforge.net)
+>>28		string		fLaC		\b, FLAC audio
+# --- First vorbis packet - general header ---
+>>28		string		\x01vorbis	\b, Vorbis audio,
+>>>35		lelong		!0		UNKNOWN VERSION %lu,
+##>>>35		lelong		0		version 0,
+>>>35		lelong		0
+>>>>39		ubyte		1		mono,
+>>>>39		ubyte		2		stereo,
+>>>>39		ubyte		>2		%u channels,
+>>>>40		lelong		x		%lu Hz
+# Minimal, nominal and maximal bitrates specified when encoding
+>>>>48		string		<\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff	\b,
+# The above tests if at least one of these is specified:
+>>>>>52		lelong		!-1
+# Vorbis RC2 has a bug which puts -1000 in the min/max bitrate fields
+# instead of -1.
+# Vorbis 1.0 uses 0 instead of -1.
+>>>>>>52	lelong		!0
+>>>>>>>52	lelong		!-1000
+>>>>>>>>52	lelong		x		<%lu
+>>>>>48		lelong		!-1
+>>>>>>48	lelong		x		~%lu
+>>>>>44		lelong		!-1
+>>>>>>44	lelong		!-1000
+>>>>>>>44	lelong		!0
+>>>>>>>>44	lelong		x		>%lu
+>>>>>48		string		<\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff	bps
+# -- Second vorbis header packet - the comments
+# A kludge to read the vendor string.  It's a counted string, not a
+# zero-terminated one, so file(1) can't read it in a generic way.
+# libVorbis is the only one existing currently, so I detect specifically
+# it.  The interesting value is the cvs date (8 digits decimal).
+# Post-RC1 Ogg files have the second header packet (and thus the version)
+# in a different place, so we must use an indirect offset.
+>>>(84.b+85)		string		\x03vorbis
+>>>>(84.b+96)		string/c	Xiphophorus\ libVorbis\ I	\b, created by: Xiphophorus libVorbis I
+>>>>>(84.b+120)		string		>00000000	
+# Map to beta version numbers:
+>>>>>>(84.b+120)	string		<20000508	(<beta1 - prepublic)
+>>>>>>(84.b+120)	string		20000508	(beta1/2)
+>>>>>>(84.b+120)	string		>20000508
+>>>>>>>(84.b+120)	string		<20001031	(beta2-3)
+>>>>>>(84.b+120)	string		20001031	(beta3)
+>>>>>>(84.b+120)	string		>20001031
+>>>>>>>(84.b+120)	string		<20010225	(beta3-4)
+>>>>>>(84.b+120)	string		20010225	(beta4)
+>>>>>>(84.b+120)	string		>20010225
+>>>>>>>(84.b+120)	string		<20010615	(beta4-RC1)
+>>>>>>(84.b+120)	string		20010615	(RC1)
+>>>>>>(84.b+120)	string		20010813	(RC2)
+>>>>>>(84.b+120)	string		20010816	(RC2 - Garf tuned v1)
+>>>>>>(84.b+120)	string		20011014	(RC2 - Garf tuned v2)
+>>>>>>(84.b+120)	string		20011217	(pre-RC3 CVS)
+>>>>>>(84.b+120)	string		20011231	(RC3)
+# Some pre-1.0 CVS snapshots still had "Xiphphorus"...
+>>>>>>(84.b+120)	string		>20011231	(pre-1.0 CVS)
+# For the 1.0 release, Xiphophorus is replaced by Xiph.Org
+>>>>(84.b+96)		string/c	Xiph.Org\ libVorbis\ I	\b, created by: Xiph.Org libVorbis I
+>>>>>(84.b+117)		string		>00000000	
+>>>>>>(84.b+117)	string		<20020717	(pre-1.0 CVS)
+>>>>>>(84.b+117)	string		20020717	(1.0)
+>>>>>>(84.b+117)	string		>20020717	(post-1.0 CVS)
+
+#------------------------------------------------------------------------------
+# VXL: file(1) magic for VXL binary IO data files
+#
+# from Ian Scott <scottim at sf.net>
+#
+# VXL is a collection of C++ libraries for Computer Vision.
+# See the vsl chapter in the VXL Book for more info
+# http://www.isbe.man.ac.uk/public_vxl_doc/books/vxl/book.html
+# http:/vxl.sf.net
+
+2	lelong	0x472b2c4e	VXL data file,
+>0	leshort	>0		schema version no %d
+
+#------------------------------------------------------------------------------
+# wordprocessors:  file(1) magic fo word processors.
+#
+####### PWP file format used on Smith Corona Personal Word Processors:
+2	string	\040\040\040\040\040\040\040\040\040\040\040ML4D\040\'92	Smith Corona PWP
+>24	byte	2	\b, single spaced
+>24	byte	3	\b, 1.5 spaced
+>24	byte	4	\b, double spaced
+>25	byte	0x42	\b, letter
+>25	byte	0x54	\b, legal
+>26	byte	0x46	\b, A4
+
+#WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
+0	string	\377WPC\020\000\000\000\022\012\001\001\000\000\000\000	(WP) loadable text
+>15	byte	0	Optimized for Intel
+>15	byte	1	Optimized for Non-Intel
+1	string	WPC	(Corel/WP)
+>8	short	257	WordPerfect macro
+>8	short	258	WordPerfect help file
+>8	short	259	WordPerfect keyboard file
+>8	short	266	WordPerfect document
+>8	short	267	WordPerfect dictionary
+>8	short	268	WordPerfect thesaurus
+>8	short	269	WordPerfect block
+>8	short	270	WordPerfect rectangular block
+>8	short	271	WordPerfect column block
+>8	short	272	WordPerfect printer data
+>8	short	275	WordPerfect printer data
+>8	short	276	WordPerfect driver resource data
+>8	short	279	WordPerfect hyphenation code
+>8	short	280	WordPerfect hyphenation data
+>8	short	281	WordPerfect macro resource data
+>8	short	283	WordPerfect hyphenation lex
+>8	short	285	WordPerfect wordlist
+>8	short	286	WordPerfect equation resource data
+>8	short	289	WordPerfect spell rules
+>8	short	290	WordPerfect dictionary rules
+>8	short	295	WordPerfect spell rules (Microlytics)
+>8	short	299	WordPerfect settings file
+>8	short	301	WordPerfect 4.2 document
+>8	short	325	WordPerfect dialog file
+>8	short	332	WordPerfect button bar
+>8	short	513	Shell macro
+>8	short	522	Shell definition
+>8	short	769	Notebook macro
+>8	short	770	Notebook help file
+>8	short	771	Notebook keyboard file
+>8	short	778	Notebook definition
+>8	short	1026	Calculator help file
+>8	short 	1538	Calendar help file
+>8	short 	1546	Calendar data file
+>8	short	1793	Editor macro
+>8	short	1794	Editor help file
+>8	short	1795	Editor keyboard file
+>8	short	1817	Editor macro resource file
+>8	short 	2049	Macro editor macro
+>8	short 	2050	Macro editor help file
+>8	short	2051	Macro editor keyboard file
+>8	short	2305	PlanPerfect macro
+>8	short	2306	PlanPerfect help file
+>8	short	2307	PlanPerfect keyboard file
+>8	short	2314	PlanPerfect worksheet
+>8	short	2319	PlanPerfect printer definition
+>8	short	2322	PlanPerfect graphic definition
+>8	short	2323	PlanPerfect data
+>8	short	2324	PlanPerfect temporary printer
+>8	short	2329	PlanPerfect macro resource data
+>8	byte	11	Mail
+>8	short	2818	help file
+>8	short	2821	distribution list
+>8	short	2826	out box
+>8	short	2827	in box
+>8	short	2836	users archived mailbox
+>8	short	2837	archived message database
+>8	short	2838	archived attachments
+>8	short	3083	Printer temporary file
+>8	short	3330	Scheduler help file
+>8	short	3338	Scheduler in file
+>8	short	3339	Scheduler out file
+>8	short	3594	GroupWise settings file
+>8	short	3601	GroupWise directory services
+>8	short	3627	GroupWise settings file
+>8	short	4362	Terminal resource data
+>8	short	4363	Terminal resource data
+>8	short	4395	Terminal resource data
+>8	short	4619	GUI loadable text
+>8	short	4620	graphics resource data
+>8	short	4621	printer settings file
+>8	short	4622	port definition file
+>8	short	4623	print queue parameters
+>8	short	4624	compressed file
+>8	short	5130	Network service msg file
+>8	short	5131	Network service msg file
+>8	short	5132	Async gateway login msg
+>8	short	5134	GroupWise message file
+>8	short	7956	GroupWise admin domain database
+>8	short	7957	GroupWise admin host database
+>8	short	7959	GroupWise admin remote host database
+>8	short	7960	GroupWise admin ADS deferment data file
+>8	short	8458	IntelliTAG (SGML) compiled DTD
+>8	long	18219264	WordPerfect graphic image (1.0)
+>8	long	18219520	WordPerfect graphic image (2.0)
+#end of WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
+
+# Hangul (Korean) Word Processor File
+0	string	HWP\ Document\ File	Hangul (Korean) Word Processor File
+
+# CosmicBook, from Benoît Rouits
+0       string  CSBK    Ted Neslson's CosmicBook hypertext file
+
+
+#------------------------------------------------------------------------------
+# file(1) magic(5) data for xdelta  Josh MacDonald <jmacd at CS.Berkeley.EDU>
+#
+0	string	%XDELTA%	XDelta binary patch file 0.14
+0	string	%XDZ000%	XDelta binary patch file 0.18
+0	string	%XDZ001%	XDelta binary patch file 0.20
+0	string	%XDZ002%	XDelta binary patch file 1.0
+0	string	%XDZ003%	XDelta binary patch file 1.0.4
+0	string	%XDZ004%	XDelta binary patch file 1.1
+
+#------------------------------------------------------------------------------
+# xenix:  file(1) magic for Microsoft Xenix
+#
+# "Middle model" stuff, and "Xenix 8086 relocatable or 80286 small
+# model" lifted from "magic.xenix", with comment "derived empirically;
+# treat as folklore until proven"
+#
+# "small model", "large model", "huge model" stuff lifted from XXX
+#
+# XXX - "x.out" collides with PDP-11 archives
+#
+0	string		core		core file (Xenix)
+0	byte		0x80		8086 relocatable (Microsoft)
+0	leshort		0xff65		x.out
+>2	string		__.SYMDEF	 randomized
+>0	byte		x		archive
+0	leshort		0x206		Microsoft a.out
+>8	leshort		1		Middle model
+>0x1e	leshort		&0x10		overlay
+>0x1e	leshort		&0x2		separate
+>0x1e	leshort		&0x4		pure
+>0x1e	leshort		&0x800		segmented
+>0x1e	leshort		&0x400		standalone
+>0x1e	leshort		&0x8		fixed-stack
+>0x1c	byte		&0x80		byte-swapped
+>0x1c	byte		&0x40		word-swapped
+>0x10	lelong		>0		not-stripped
+>0x1e	leshort		^0xc000		pre-SysV
+>0x1e	leshort		&0x4000		V2.3
+>0x1e	leshort		&0x8000		V3.0
+>0x1c	byte		&0x4		86
+>0x1c	byte		&0xb		186
+>0x1c	byte		&0x9		286
+>0x1c	byte		&0xa		386
+>0x1f	byte		<0x040		small model
+>0x1f	byte		=0x048		large model	
+>0x1f	byte		=0x049		huge model 
+>0x1e	leshort		&0x1		executable
+>0x1e	leshort		^0x1		object file
+>0x1e	leshort		&0x40		Large Text
+>0x1e	leshort		&0x20		Large Data
+>0x1e	leshort		&0x120		Huge Objects Enabled
+>0x10	lelong		>0		not stripped
+
+0	leshort		0x140		old Microsoft 8086 x.out
+>0x3	byte		&0x4		separate
+>0x3	byte		&0x2		pure
+>0	byte		&0x1		executable
+>0	byte		^0x1		relocatable
+>0x14	lelong		>0		not stripped
+
+0	lelong		0x206		b.out
+>0x1e	leshort		&0x10		overlay
+>0x1e	leshort		&0x2		separate
+>0x1e	leshort		&0x4		pure
+>0x1e	leshort		&0x800		segmented
+>0x1e	leshort		&0x400		standalone
+>0x1e	leshort		&0x1		executable
+>0x1e	leshort		^0x1		object file
+>0x1e	leshort		&0x4000		V2.3
+>0x1e	leshort		&0x8000		V3.0
+>0x1c	byte		&0x4		86
+>0x1c	byte		&0xb		186
+>0x1c	byte		&0x9		286
+>0x1c	byte		&0x29		286
+>0x1c	byte		&0xa		386
+>0x1e	leshort		&0x4		Large Text
+>0x1e	leshort		&0x2		Large Data
+>0x1e	leshort		&0x102		Huge Objects Enabled
+
+0	leshort		0x580		XENIX 8086 relocatable or 80286 small model
+
+#------------------------------------------------------------------------------
+# xwindows:  file(1) magic for various X/Window system file formats.
+
+# Compiled X Keymap 
+# XKM (compiled X keymap) files (including version and byte ordering)
+1	string	mkx				Compiled XKB Keymap: lsb,
+>0	byte	>0				version %d
+>0	byte	=0				obsolete
+0	string	xkm				Compiled XKB Keymap: msb,
+>3	byte	>0				version %d
+>0	byte	=0				obsolete
+
+# xfsdump archive
+0	string	xFSdump0			xfsdump archive
+>8	long	x	(version %d)
+
+# Jaleo XFS files
+0	long	395726				Jaleo XFS file
+>4	long	x				- version %ld
+>8	long	x				- [%ld -
+>20	long	x				%ldx
+>24	long	x				%ldx
+>28	long	1008				YUV422]
+>28	long	1000				RGB24]
+
+#------------------------------------------------------------------------------
+# zilog:  file(1) magic for Zilog Z8000.
+#
+# Was it big-endian or little-endian?  My Product Specification doesn't
+# say.
+#
+0	long		0xe807		object file (z8000 a.out)
+0	long		0xe808		pure object file (z8000 a.out)
+0	long		0xe809		separate object file (z8000 a.out)
+0	long		0xe805		overlay object file (z8000 a.out)
+
+#------------------------------------------------------------------------------
+# zyxel:  file(1) magic for ZyXEL modems
+#
+# From <rob at pe1chl.ampr.org>
+# These are the /etc/magic entries to decode datafiles as used for the
+# ZyXEL U-1496E DATA/FAX/VOICE modems.  (This header conforms to a
+# ZyXEL-defined standard)
+
+0	string		ZyXEL\002	ZyXEL voice data
+>10	byte		0		- CELP encoding
+>10	byte&0x0B	1		- ADPCM2 encoding
+>10	byte&0x0B	2		- ADPCM3 encoding
+>10	byte&0x0B	3		- ADPCM4 encoding
+>10	byte&0x0B	8		- New ADPCM3 encoding
+>10	byte&0x04	4		with resync
+# Magic
+# Magic data for file(1) command.
+# Format is described in magic(5).
+#
+# Note: If you have edited this file you may run `file -C'
+#       to make a pre-compiled magic.mgc for faster execution
+#
+
+
+#--------------------------------------------------------------------------------
+# SFF format by 454 Life Sciences, Whitehead Institute for Biomedical Research and Sanger Institute.
+# 
+
+0	string		.sff		Standard Flowgram Format (SFF)
+>4	byte		x		- version %d
+>5	byte		x		%d
+>6	byte		x		%d
+>7	byte		x		%d
+>20	belong		x		, %Ld reads
+
+#--------------------------------------------------------------------------------
+# SRF format Generic Format for Sequence Data 
+# 
+
+0	string		SSRF		Generic Format for Sequence Data (SRF)
+>9	byte		x		- version %c
+>10	byte		x		%c
+>11	byte		x		%c
+
+#---------------------------------------------------------------------------------
+# FASTQ format Generic Format for Sequence Data 
+#
+
+0	string		@		FASTQ Generic Format for Sequence Data
+
+#------------------------------------------------------------------------------
+# Localstuff:  file(1) magic for locally observed files
+#
+# $Id: kfsmagic,v 1.2 2010/06/07 15:49:27 killian2 Exp $
+# Add any locally observed files here.  Remember:
+# text if readable, executable if runnable binary, data if unreadable.
+
+# XXX promoted from tex so that *.tfm is not mis-identified as mc68k file.
+# There is no way to detect TeX Font Metric (*.tfm) files without
+# breaking them apart and reading the data.  The following patterns
+# match most *.tfm files generated by METAFONT or afm2tfm.
+2	string		\000\021	TeX font metric data
+>33	string		>\0		(%s)
+2	string		\000\022	TeX font metric data
+>33	string		>\0		(%s)
+#------------------------------------------------------------------------------
+# acorn:  file(1) magic for files found on Acorn systems
+#
+
+# RISC OS Chunk File Format
+# From RISC OS Programmer's Reference Manual, Appendix D
+# We guess the file type from the type of the first chunk.
+0	lelong		0xc3cbc6c5	RISC OS Chunk data
+>12	string		OBJ_		\b, AOF object
+>12	string		LIB_		\b, ALF library
+
+# RISC OS AIF, contains "SWI OS_Exit" at offset 16.
+16	lelong		0xef000011	RISC OS AIF executable
+
+# RISC OS Draw files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0	string 		Draw		RISC OS Draw file data
+
+# RISC OS new format font files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0	string		FONT\0		RISC OS outline font data,
+>5	byte		x		version %d
+0	string		FONT\1		RISC OS 1bpp font data,
+>5	byte		x		version %d
+0	string		FONT\4		RISC OS 4bpp font data
+>5	byte		x		version %d
+
+# RISC OS Music files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0	string		Maestro\r	RISC OS music file
+>8	byte		x		version %d
+
+
+#------------------------------------------------------------------------------
+# adi: file(1) magic for ADi's objects
+# From Gregory McGarry <g.mcgarry at ieee.org>
+#
+0	leshort		0x521c		COFF DSP21k
+>18	lelong		&02		executable,
+>18	lelong		^02
+>>18	lelong		&01		static object,
+>>18	lelong		^01		relocatable object,
+>18	lelong		&010		stripped
+>18	lelong		^010		not stripped
+
+#------------------------------------------------------------------------------
+# adventure: file(1) magic for Adventure game files
+#
+# from Allen Garvin <earendil at faeryland.tamu-commerce.edu>
+# Edited by Dave Chapeskie <dchapes at ddm.on.ca> Jun 28, 1998
+# Edited by Chris Chittleborough <cchittleborough at yahoo.com.au>, March 2002
+#
+# ALAN
+# I assume there are other, lower versions, but these are the only ones I
+# saw in the archive.
+0	beshort	0x0206	ALAN game data
+>2	byte	<10	version 2.6%d
+
+# Conflicts with too much other stuff!
+# Infocom
+# (Note: to avoid false matches Z-machine version 1 and 2 are not
+# recognized since only the oldest Zork I and II used them.  Similarly
+# there are 4 Infocom games that use verion 4 that are not recognized.)
+#0	byte	3	Infocom game data (Z-machine 3,
+#>2	beshort	<0x7fff	Release %3d,
+#>26	beshort >0	Size %d*2
+#>18	string	>\0	Serial %.6s)
+#0	byte	5	Infocom game data (Z-machine 5,
+#>2	beshort	<0x7fff	Release %3d,
+#>26	beshort >0	Size %d*4
+#>18	string	>\0	Serial %.6s)
+#0	byte	6	Infocom game data (Z-machine 6,
+#>2	beshort	<0x7fff	Release %3d,
+#>26	beshort >0	Size %d*8
+#>18	string	>\0	Serial %.6s)
+#0	byte	8	Infocom game data (Z-machine 8,
+#>2	beshort	<0x7fff	Release %3d,
+#>26	beshort >0	Size %d*8
+#>18	string	>\0	Serial %.6s)
+
+# TADS (Text Adventure Development System)
+#  All files are machine-independent (games compile to byte-code) and are tagged
+#  with a version string of the form "V2.<digit>.<digit>\0" (but TADS 3 is
+#  on the way).
+#  Game files start with "TADS2 bin\n\r\032\0" then the compiler version.
+0	string	TADS2\ bin	TADS
+>9	belong  !0x0A0D1A00	game data, CORRUPTED
+>9	belong	 0x0A0D1A00
+>>13	string	>\0		%s game data
+#  Resource files start with "TADS2 rsc\n\r\032\0" then the compiler version.
+0	string	TADS2\ rsc	TADS
+>9	belong  !0x0A0D1A00	resource data, CORRUPTED
+>9	belong	 0x0A0D1A00
+>>13	string	>\0		%s resource data
+#  Some saved game files start with "TADS2 save/g\n\r\032\0", a little-endian
+#  2-byte length N, the N-char name of the game file *without* a NUL (darn!),
+# "TADS2 save\n\r\032\0" and the interpreter version. 
+0	string	TADS2\ save/g	TADS
+>12	belong	!0x0A0D1A00	saved game data, CORRUPTED
+>12	belong	 0x0A0D1A00
+>>(16.s+32) string >\0		%s saved game data
+#  Other saved game files start with "TADS2 save\n\r\032\0" and the interpreter
+#  version.
+0	string	TADS2\ save	TADS
+>10	belong	!0x0A0D1A00	saved game data, CORRUPTED
+>10	belong	 0x0A0D1A00
+>>14	string	>\0		%s saved game data
+#------------------------------------------------------------------------------
+# allegro:  file(1) magic for Allegro datafiles
+# Toby Deshane <hac at shoelace.digivill.net>
+#
+0 belong 0x736C6821   Allegro datafile (packed)
+0 belong 0x736C682E   Allegro datafile (not packed/autodetect)
+0 belong 0x736C682B   Allegro datafile (appended exe data)
+
+#------------------------------------------------------------------------------
+# alliant:  file(1) magic for Alliant FX series a.out files
+#
+# If the FX series is the one that had a processor with a 68K-derived
+# instruction set, the "short" should probably become "beshort" and the
+# "long" should probably become "belong".
+# If it's the i860-based one, they should probably become either the
+# big-endian or little-endian versions, depending on the mode they ran
+# the 860 in....
+#
+0	short		0420		0420 Alliant virtual executable
+>2	short		&0x0020		common library
+>16	long		>0		not stripped
+0	short		0421		0421 Alliant compact executable
+>2	short		&0x0020		common library
+>16	long		>0		not stripped
+#------------------------------------------------------------------------------
+# alpha architecture description
+#
+
+0	leshort		0603		COFF format alpha
+>22	leshort&030000	!020000		executable
+>24	leshort		0410		pure
+>24	leshort		0413		paged
+>22	leshort&020000	!0		dynamically linked
+>16	lelong		!0		not stripped
+>16	lelong		0		stripped
+>22	leshort&030000	020000		shared library
+>24	leshort		0407		object
+>27	byte		x		- version %d
+>26	byte		x		.%d
+>28	byte		x		-%d
+
+# Basic recognition of Digital UNIX core dumps - Mike Bremford <mike at opac.bl.uk>
+#
+# The actual magic number is just "Core", followed by a 2-byte version
+# number; however, treating any file that begins with "Core" as a Digital
+# UNIX core dump file may produce too many false hits, so we include one
+# byte of the version number as well; DU 5.0 appears only to be up to
+# version 2.
+#
+0	string		Core\001	Alpha COFF format core dump (Digital UNIX)
+>24	string		>\0		\b, from '%s'
+0	string		Core\002	Alpha COFF format core dump (Digital UNIX)
+>24	string		>\0		\b, from '%s'
+
+#------------------------------------------------------------------------------
+# amanda:  file(1) magic for amanda file format
+#
+0	string	AMANDA:\ 		AMANDA 
+>8	string	TAPESTART\ DATE		tape header file,
+>>23	string	X
+>>>25	string	>\ 			Unused %s
+>>23	string	>\ 			DATE %s
+>8	string	FILE\ 			dump file,
+>>13	string	>\ 			DATE %s
+#------------------------------------------------------------------------------
+# amigaos:  file(1) magic for AmigaOS binary formats:
+
+#
+# From ignatios at cs.uni-bonn.de (Ignatios Souvatzis)
+# Some formats are still missing: AmigaOS special IFF's, e.g.: FORM....CTLG
+# (the others should be separate, anyway)
+#
+0	belong		0x000003f3	AmigaOS loadseg()ble executable/binary
+0	belong		0x000003e7	AmigaOS object/library data
+#
+0	beshort		0xe310		Amiga Workbench
+>2	beshort		1		
+>>48	byte		1		disk icon
+>>48	byte		2		drawer icon
+>>48	byte		3		tool icon
+>>48	byte		4		project icon
+>>48	byte		5		garbage icon
+>>48	byte		6		device icon
+>>48	byte		7		kickstart icon
+>>48	byte		8		workbench application icon
+>2	beshort		>1		icon, vers. %d
+#
+# various sound formats from the Amiga
+# G=F6tz Waschk <waschk at informatik.uni-rostock.de>
+#
+0	string		FC14		Future Composer 1.4 Module sound file
+0	string		SMOD		Future Composer 1.3 Module sound file
+0	string		AON4artofnoise	Art Of Noise Module sound file
+1	string		MUGICIAN/SOFTEYES Mugician Module sound file
+58	string		SIDMON\ II\ -\ THE	Sidmon 2.0 Module sound file
+0	string		Synth4.0	Synthesis Module sound file
+0	string		ARP.		The Holy Noise Module sound file
+0	string		BeEp\0		JamCracker Module sound file
+0	string		COSO\0		Hippel-COSO Module sound file
+# Too simple (short, pure ASCII, deep), MPi
+#26	string		V.3		Brian Postma's Soundmon Module sound file v3
+#26	string		BPSM		Brian Postma's Soundmon Module sound file v3
+#26	string		V.2		Brian Postma's Soundmon Module sound file v2
+
+# The following are from: "Stefan A. Haubenthal" <polluks at web.de>
+0	beshort		0x0f00		AmigaOS bitmap font
+0	beshort		0x0f03		AmigaOS outline font
+0	belong		0x80001001	AmigaOS outline tag
+0	string		##\ version	catalog translation
+
+0	string		FORM		IFF data
+>8	string		CTLG		\b, CTLG message catalog
+>8	string		PREF		\b, PREF preferences
+
+0	string		Rar!		RAR archive data,
+>44	byte		x		v%0x,
+>35	byte		0		os: MS-DOS
+>35	byte		1		os: OS/2
+>35	byte		2		os: Win32
+>35	byte		3		os: Unix
+
+0	belong		0x000003fa	AmigaOS shared library
+
+# Amiga disk types
+# 
+0	string		RDSK		Rigid Disk Block
+>160	string		x		on %.24s
+0	string		DOS\0		Amiga DOS disk
+0	string		DOS\1		Amiga FFS disk
+0	string		DOS\2		Amiga Inter DOS disk
+0	string		DOS\3		Amiga Inter FFS disk
+0	string		DOS\4		Amiga Fastdir DOS disk
+0	string		DOS\5		Amiga Fastdir FFS disk
+0	string		KICK		Kickstart disk
+
+#------------------------------------------------------------------------------
+# animation:  file(1) magic for animation/movie formats
+#
+# animation formats
+# MPEG, FLI, DL originally from vax at ccwf.cc.utexas.edu (VaX#n8)
+# FLC, SGI, Apple originally from Daniel Quinlan (quinlan at yggdrasil.com)
+
+# MPEG animation format
+0	belong		0x000001b3		MPEG video stream data
+#>4	beshort&0xfff0	x			(%d x
+#>5	beshort&0x0fff  x			%d)
+0	belong		0x000001ba		MPEG system stream data
+
+# MPEG Audio (*.mpx)
+# from dreesen at math.fu-berlin.de
+
+# MPEG 1.0 Layer 3
+0       beshort&0xfffe  =0xfffa         \bMP3
+>2      byte&0xf0       =0x10           \b,  32 kBits
+>2      byte&0xf0       =0x20           \b,  40 kBits
+>2      byte&0xf0       =0x30           \b,  48 kBits
+>2      byte&0xf0       =0x40           \b,  56 kBits
+>2      byte&0xf0       =0x50           \b,  64 kBits
+>2      byte&0xf0       =0x60           \b,  80 kBits
+>2      byte&0xf0       =0x70           \b,  96 kBits
+>2      byte&0xf0       =0x80           \b, 112 kBits
+>2      byte&0xf0       =0x90           \b, 128 kBits
+>2      byte&0xf0       =0xA0           \b, 160 kBits
+>2      byte&0xf0       =0xB0           \b, 192 kBits
+>2      byte&0xf0       =0xC0           \b, 224 kBits
+>2      byte&0xf0       =0xD0           \b, 256 kBits
+>2      byte&0xf0       =0xE0           \b, 320 kBits
+# freq
+>2      byte&0x0C       =0x00           \b, 44.1 kHz
+>2      byte&0x0C       =0x04           \b, 48 kHz
+>2      byte&0x0C       =0x08           \b, 32 kHz
+# misc
+>3      byte&0xC0       =0x00           \b, Stereo
+>3      byte&0xC0       =0x40           \b, JStereo
+>3      byte&0xC0       =0x80           \b, Dual-Ch
+>3      byte&0xC0       =0xC0           \b, Mono
+#>1     byte&0x01       =0x00           \b, Error Protection
+#>2     byte&0x02       =0x02           \b, Padding
+#>2     byte&0x01       =0x01           \b, Private
+#>3     byte&0x08       =0x08           \b, Copyright
+#>3     byte&0x04       =0x04           \b, Original
+#>3     byte&0x03       1               \b, Emphasis 5
+#>3     byte&0x03       3               \b, Emphasis c
+
+# MPEG 1.0 Layer 2
+0       beshort&0xfffe  =0xfffc         \bMP2
+>2      byte&0xf0       =0x10           \b,  32 kBits
+>2      byte&0xf0       =0x20           \b,  48 kBits
+>2      byte&0xf0       =0x30           \b,  56 kBits
+>2      byte&0xf0       =0x40           \b,  64 kBits
+>2      byte&0xf0       =0x50           \b,  80 kBits
+>2      byte&0xf0       =0x60           \b,  96 kBits
+>2      byte&0xf0       =0x70           \b, 112 kBits
+>2      byte&0xf0       =0x80           \b, 128 kBits
+>2      byte&0xf0       =0x90           \b, 160 kBits
+>2      byte&0xf0       =0xA0           \b, 192 kBits
+>2      byte&0xf0       =0xB0           \b, 224 kBits
+>2      byte&0xf0       =0xC0           \b, 256 kBits
+>2      byte&0xf0       =0xD0           \b, 320 kBits
+>2      byte&0xf0       =0xE0           \b, 384 kBits
+# freq
+>2      byte&0x0C       =0x00           \b, 44.1 kHz
+>2      byte&0x0C       =0x04           \b, 48 kHz
+>2      byte&0x0C       =0x08           \b, 32 kHz
+# misc
+>3      byte&0xC0       =0x00           \b, Stereo
+>3      byte&0xC0       =0x40           \b, JStereo
+>3      byte&0xC0       =0x80           \b, Dual-Ch
+>3      byte&0xC0       =0xC0           \b, Mono
+#>1     byte&0x01       =0x00           \b, Error Protection
+#>2     byte&0x02       =0x02           \b, Padding
+#>2     byte&0x01       =0x01           \b, Private
+#>3     byte&0x08       =0x08           \b, Copyright
+#>3     byte&0x04       =0x04           \b, Original
+#>3     byte&0x03       1               \b, Emphasis 5
+#>3     byte&0x03       3               \b, Emphasis c
+
+# MPEG 2.0
+0       beshort&0xfff8  =0xfff0         MP
+# Layer 3
+>1      byte            &0x02           \b3
+# Layer 2
+>1      byte            &0x04           \b2
+>2      byte&0xf0       =0x10           \b,   8 kBits
+>2      byte&0xf0       =0x20           \b,  16 kBits
+>2      byte&0xf0       =0x30           \b,  24 kBits
+>2      byte&0xf0       =0x40           \b,  32 kBits
+>2      byte&0xf0       =0x50           \b,  40 kBits
+>2      byte&0xf0       =0x60           \b,  48 kBits
+>2      byte&0xf0       =0x70           \b,  56 kBits
+>2      byte&0xf0       =0x80           \b,  64 kBits
+>2      byte&0xf0       =0x90           \b,  80 kBits
+>2      byte&0xf0       =0xA0           \b,  96 kBits
+>2      byte&0xf0       =0xB0           \b, 112 kBits
+>2      byte&0xf0       =0xC0           \b, 128 kBits
+>2      byte&0xf0       =0xD0           \b, 144 kBits
+>2      byte&0xf0       =0xE0           \b, 160 kBits
+# freq
+>2      byte&0x0C       =0x00           \b, 22.05 kHz
+>2      byte&0x0C       =0x04           \b, 24 kHz
+>2      byte&0x0C       =0x08           \b, 16 kHz
+# misc
+>3      byte&0xC0       =0x00           \b, Stereo
+>3      byte&0xC0       =0x40           \b, JStereo
+>3      byte&0xC0       =0x80           \b, Dual-Ch
+>3      byte&0xC0       =0xC0           \b, Mono
+#>1     byte&0x01       =0x00           \b, Error Protection
+#>2     byte&0x02       =0x02           \b, Padding
+#>2     byte&0x01       =0x01           \b, Private
+#>3     byte&0x08       =0x08           \b, Copyright
+#>3     byte&0x04       =0x04           \b, Original
+#>3     byte&0x03       1               \b, Emphasis 5
+#>3     byte&0x03       3               \b, Emphasis c
+
+#From: Johan Gade <jgade at diku.dk>
+
+# MPEG-4 Advanced Audio Coding (AAC) file (perhaps also MPEG-2 ACC?)
+16	string		M4A		MPEG-4 Advanced Audio Coding file (AAC)
+
+
+# FLI animation format
+4	leshort		0xAF11			FLI file
+>6	leshort		x			- %d frames,
+>8	leshort		x			width=%d pixels,
+>10	leshort		x			height=%d pixels,
+>12	leshort		x			depth=%d,
+>16	leshort		x			ticks/frame=%d
+# FLC animation format
+4	leshort		0xAF12			FLC file
+>6	leshort		x			- %d frames
+>8	leshort		x			width=%d pixels,
+>10	leshort		x			height=%d pixels,
+>12	leshort		x			depth=%d,
+>16	leshort		x			ticks/frame=%d
+
+# DL animation format
+# XXX - collision with most `mips' magic
+#
+# I couldn't find a real magic number for these, however, this
+# -appears- to work.  Note that it might catch other files, too, so be
+# careful!
+#
+# Note that title and author appear in the two 20-byte chunks
+# at decimal offsets 2 and 22, respectively, but they are XOR'ed with
+# 255 (hex FF)!  The DL format is really bad.
+#
+#0	byte	1	DL version 1, medium format (160x100, 4 images/screen)
+#>42	byte	x	- %d screens,
+#>43	byte	x	%d commands
+#0	byte	2	DL version 2
+#>1	byte	1	- large format (320x200,1 image/screen),
+#>1	byte	2	- medium format (160x100,4 images/screen),
+#>1	byte	>2	- unknown format,
+#>42	byte	x	%d screens,
+#>43	byte	x	%d commands
+# Based on empirical evidence, DL version 3 have several nulls following the
+# \003.  Most of them start with non-null values at hex offset 0x34 or so.
+#0	string	\3\0\0\0\0\0\0\0\0\0\0\0	DL version 3
+
+# SGI formats
+0	string		MOVI		Silicon Graphics movie file
+
+# Apple Quicktime: Scan for all known top-level QT atom markers
+4	string		moov		Apple QuickTime movie file (moov)
+4	string		mdat		Apple QuickTime movie file (mdat)
+4	string		ftyp		Apple QuickTime movie file (ftyp)
+4	string		free		Apple QuickTime movie file (free)
+4	string		junk		Apple QuickTime movie file (junk)
+4	string		pnot		Apple QuickTime movie file (pnot)
+4	string		skip		Apple QuickTime movie file (skip)
+4	string		wide		Apple QuickTime movie file (wide)
+4	string		pict		Apple QuickTime movie file (pict)
+
+# iso 13818 transport stream
+#
+# from Oskar Schirmer <schirmer at scara.com> Feb 3, 2001 (ISO 13818.1)
+# (the following is a little bit restrictive and works fine for a stream
+#  that starts with PAT properly. it won't work for stream data, that is
+#  cut from an input device data right in the middle, but this shouldn't
+#  disturb)
+# syncbyte      8 bit	0x47
+# error_ind     1 bit	-
+# payload_start 1 bit	1
+# priority      1 bit	-
+# PID          13 bit	0x0000
+# scrambling    2 bit	-
+# adaptfld_ctrl 2 bit	1 or 3
+# conti_count   4 bit	0
+0	belong&0xFF5FFF1F	0x47400010	MPEG transport stream data
+>188	byte			!0x47		CORRUPTED
+
+# DIF digital video file format <mpruett at sgi.com>
+0	belong&0xffffff00	0x1f070000      DIF
+>4	byte			&0x01		(DVCPRO) movie file
+>4	byte			^0x01		(DV) movie file
+>3	byte			&0x80		(PAL)
+>3	byte			^0x80		(NTSC)
+
+# Microsoft Advanced Streaming Format (ASF) <mpruett at sgi.com>
+0	belong			0x3026b275	Microsoft ASF
+
+# MNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>
+0	string			\x8aMNG		MNG video data,
+>4	belong			!0x0d0a1a0a	CORRUPTED,
+>4	belong			0x0d0a1a0a
+>>16    belong	x				%ld x
+>>20    belong	x				%ld
+
+# JNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>
+0	string			\x8bJNG		JNG video data,
+>4	belong			!0x0d0a1a0a	CORRUPTED,
+>4	belong			0x0d0a1a0a
+>>16    belong	x				%ld x
+>>20    belong	x				%ld
+
+# Vivo video (Wolfram Kleff)
+3	string		\x0D\x0AVersion:Vivo	Vivo video data
+
+# VRML (Virtual Reality Modelling Language)
+0       string/b        #VRML\ V1.0\ ascii	VRML 1 file
+0	string/b	#VRML\ V2.0\ utf8	ISO/IEC 14772 VRML 97 file
+
+#---------------------------------------------------------------------------
+# HVQM4: compressed movie format designed by Hudson for Nintendo GameCube
+# From Mark Sheppard <msheppard at climax.co.uk>, 2002-10-03
+#
+0	string		HVQM4		%s
+>6	string		>\0		v%s
+>0	byte		x		GameCube movie,
+>0x34	ubeshort	x		%d x
+>0x36	ubeshort	x		%d,
+>0x26	ubeshort	x		%dµs,
+>0x42	ubeshort	0		no audio
+>0x42	ubeshort	>0		%dHz audio
+
+#------------------------------------------------------------------------------
+# apl:  file(1) magic for APL (see also "pdp" and "vax" for other APL
+#       workspaces)
+#
+0	long		0100554		APL workspace (Ken's original?)
+
+#------------------------------------------------------------------------------
+# applix:  file(1) magic for Applixware
+# From: Peter Soos <sp at osb.hu>
+#
+0	string		*BEGIN		Applixware
+>7	string		WORDS			Words Document
+>7	string		GRAPHICS		Graphic
+>7	string		RASTER			Bitmap
+>7	string		SPREADSHEETS		Spreadsheet
+>7	string		MACRO			Macro
+>7	string		BUILDER			Builder Object
+
+#------------------------------------------------------------------------------
+# archive:  file(1) magic for archive formats (see also "msdos" for self-
+#           extracting compressed archives)
+#
+# cpio, ar, arc, arj, hpack, lha/lharc, rar, squish, uc2, zip, zoo, etc.
+# pre-POSIX "tar" archives are handled in the C code.
+
+# POSIX tar archives
+257	string		ustar\0		POSIX tar archive
+257	string		ustar\040\040\0	GNU tar archive
+
+# cpio archives
+#
+# Yes, the top two "cpio archive" formats *are* supposed to just be "short".
+# The idea is to indicate archives produced on machines with the same
+# byte order as the machine running "file" with "cpio archive", and
+# to indicate archives produced on machines with the opposite byte order
+# from the machine running "file" with "byte-swapped cpio archive".
+#
+# The SVR4 "cpio(4)" hints that there are additional formats, but they
+# are defined as "short"s; I think all the new formats are
+# character-header formats and thus are strings, not numbers.
+0	short		070707		cpio archive
+0	short		0143561		byte-swapped cpio archive
+0	string		070707		ASCII cpio archive (pre-SVR4 or odc)
+0	string		070701		ASCII cpio archive (SVR4 with no CRC)
+0	string		070702		ASCII cpio archive (SVR4 with CRC)
+
+# Debian package (needs to go before regular portable archives)
+#
+0	string		!<arch>\ndebian
+>8	string		debian-split	part of multipart Debian package
+>8	string		debian-binary	Debian binary package
+>68	string		>\0		(format %s)
+>81	string		bz2		\b, uses bzip2 compression
+>84	string		gz		\b, uses gzip compression
+#>136	ledate		x		created: %s
+
+# other archives
+0	long		0177555		very old archive
+0	short		0177555		very old PDP-11 archive
+0	long		0177545		old archive
+0	short		0177545		old PDP-11 archive
+0	long		0100554		apl workspace
+0	string		=<ar>		archive
+
+# MIPS archive (needs to go before regular portable archives)
+#
+0	string	!<arch>\n__________E	MIPS archive
+>20	string	U			with MIPS Ucode members
+>21	string	L			with MIPSEL members
+>21	string	B			with MIPSEB members
+>19	string	L			and an EL hash table
+>19	string	B			and an EB hash table
+>22	string	X			-- out of date
+
+0	string		-h-		Software Tools format archive text
+
+#
+# XXX - why are there multiple <ar> thingies?  Note that 0x213c6172 is
+# "!<ar", so, for new-style (4.xBSD/SVR2andup) archives, we have:
+#
+# 0	string		!<arch>		current ar archive
+# 0	long		0x213c6172	archive file
+#
+# and for SVR1 archives, we have:
+#
+# 0	string		\<ar>		System V Release 1 ar archive
+# 0	string		=<ar>		archive
+#
+# XXX - did Aegis really store shared libraries, breakpointed modules,
+# and absolute code program modules in the same format as new-style
+# "ar" archives?
+#
+0	string		!<arch>		current ar archive
+>8	string		__.SYMDEF	random library
+>0	belong		=65538		- pre SR9.5
+>0	belong		=65539		- post SR9.5
+>0	beshort		2		- object archive
+>0	beshort		3		- shared library module
+>0	beshort		4		- debug break-pointed module
+>0	beshort		5		- absolute code program module
+0	string		\<ar>		System V Release 1 ar archive
+0	string		=<ar>		archive
+#
+# XXX - from "vax", which appears to collect a bunch of byte-swapped
+# thingies, to help you recognize VAX files on big-endian machines;
+# with "leshort", "lelong", and "string", that's no longer necessary....
+#
+0	belong		0x65ff0000	VAX 3.0 archive
+0	belong		0x3c61723e	VAX 5.0 archive
+#
+0	long		0x213c6172	archive file
+0	lelong		0177555		very old VAX archive
+0	leshort		0177555		very old PDP-11 archive
+#
+# XXX - "pdp" claims that 0177545 can have an __.SYMDEF member and thus
+# be a random library (it said 0xff65 rather than 0177545).
+#
+0	lelong		0177545		old VAX archive
+>8	string		__.SYMDEF	random library
+0	leshort		0177545		old PDP-11 archive
+>8	string		__.SYMDEF	random library
+#
+# From "pdp" (but why a 4-byte quantity?)
+#
+0	lelong		0x39bed		PDP-11 old archive
+0	lelong		0x39bee		PDP-11 4.0 archive
+
+# ARC archiver, from Daniel Quinlan (quinlan at yggdrasil.com)
+#
+# The first byte is the magic (0x1a), byte 2 is the compression type for
+# the first file (0x01 through 0x09), and bytes 3 to 15 are the MS-DOS
+# filename of the first file (null terminated).  Since some types collide
+# we only test some types on basis of frequency: 0x08 (83%), 0x09 (5%),
+# 0x02 (5%), 0x03 (3%), 0x04 (2%), 0x06 (2%).  0x01 collides with terminfo.
+0	lelong&0x8080ffff	0x0000081a	ARC archive data, dynamic LZW
+0	lelong&0x8080ffff	0x0000091a	ARC archive data, squashed
+0	lelong&0x8080ffff	0x0000021a	ARC archive data, uncompressed
+0	lelong&0x8080ffff	0x0000031a	ARC archive data, packed
+0	lelong&0x8080ffff	0x0000041a	ARC archive data, squeezed
+0	lelong&0x8080ffff	0x0000061a	ARC archive data, crunched
+
+# Acorn archive formats (Disaster prone simpleton, m91dps at ecs.ox.ac.uk)
+# I can't create either SPARK or ArcFS archives so I have not tested this stuff
+# [GRR:  the original entries collide with ARC, above; replaced with combined
+#  version (not tested)]
+#0	byte		0x1a		RISC OS archive
+#>1	string		archive		(ArcFS format)
+0	string		\032archive	RISC OS archive (ArcFS format)
+
+# ARJ archiver (jason at jarthur.Claremont.EDU)
+0	leshort		0xea60		ARJ archive data
+>5	byte		x		\b, v%d,
+>8	byte		&0x04		multi-volume,
+>8	byte		&0x10		slash-switched,
+>8	byte		&0x20		backup,
+>34	string		x		original name: %s,
+>7	byte		0		os: MS-DOS
+>7	byte		1		os: PRIMOS
+>7	byte		2		os: Unix
+>7	byte		3		os: Amiga
+>7	byte		4		os: Macintosh
+>7	byte		5		os: OS/2
+>7	byte		6		os: Apple ][ GS
+>7	byte		7		os: Atari ST
+>7	byte		8		os: NeXT
+>7	byte		9		os: VAX/VMS
+>3	byte		>0		%d]
+
+# HA archiver (Greg Roelofs, newt at uchicago.edu)
+# This is a really bad format. A file containing HAWAII will match this...
+#0	string		HA		HA archive data,
+#>2	leshort		=1		1 file,
+#>2	leshort		>1		%u files,
+#>4	byte&0x0f	=0		first is type CPY
+#>4	byte&0x0f	=1		first is type ASC
+#>4	byte&0x0f	=2		first is type HSC
+#>4	byte&0x0f	=0x0e		first is type DIR
+#>4	byte&0x0f	=0x0f		first is type SPECIAL
+
+# HPACK archiver (Peter Gutmann, pgut1 at cs.aukuni.ac.nz)
+0	string		HPAK		HPACK archive data
+
+# JAM Archive volume format, by Dmitry.Kohmanyuk at UA.net
+0	string		\351,\001JAM\		JAM archive,
+>7	string		>\0			version %.4s
+>0x26	byte		=0x27			-
+>>0x2b	string          >\0			label %.11s,
+>>0x27	lelong		x			serial %08x,
+>>0x36	string		>\0			fstype %.8s
+
+# LHARC/LHA archiver (Greg Roelofs, newt at uchicago.edu)
+2	string		-lh0-		LHarc 1.x archive data [lh0]
+2	string		-lh1-		LHarc 1.x archive data [lh1]
+2	string		-lz4-		LHarc 1.x archive data [lz4]
+2	string		-lz5-		LHarc 1.x archive data [lz5]
+#	[never seen any but the last; -lh4- reported in comp.compression:]
+2	string		-lzs-		LHa 2.x? archive data [lzs]
+2	string		-lh\40-		LHa 2.x? archive data [lh ]
+2	string		-lhd-		LHa 2.x? archive data [lhd]
+2	string		-lh2-		LHa 2.x? archive data [lh2]
+2	string		-lh3-		LHa 2.x? archive data [lh3]
+2	string		-lh4-		LHa (2.x) archive data [lh4]
+2	string		-lh5-		LHa (2.x) archive data [lh5]
+2	string		-lh6-		LHa (2.x) archive data [lh6]
+2	string		-lh7-		LHa (2.x) archive data [lh7]
+>20	byte		x		- header level %d
+
+# RAR archiver (Greg Roelofs, newt at uchicago.edu)
+0	string		Rar!		RAR archive data
+
+# SQUISH archiver (Greg Roelofs, newt at uchicago.edu)
+0	string		SQSH		squished archive data (Acorn RISCOS)
+
+# UC2 archiver (Greg Roelofs, newt at uchicago.edu)
+# I can't figure out the self-extracting form of these buggers...
+0	string		UC2\x1a		UC2 archive data
+
+# ZIP archives (Greg Roelofs, c/o zip-bugs at wkuvx1.wku.edu)
+0	string		PK\003\004	Zip archive data
+>4	byte		0x09		\b, at least v0.9 to extract
+>4	byte		0x0a		\b, at least v1.0 to extract
+>4	byte		0x0b		\b, at least v1.1 to extract
+>4	byte		0x14		\b, at least v2.0 to extract
+
+# Zoo archiver
+20	lelong		0xfdc4a7dc	Zoo archive data
+>4	byte		>48		\b, v%c.
+>>6	byte		>47		\b%c
+>>>7	byte		>47		\b%c
+>32	byte		>0		\b, modify: v%d
+>>33	byte		x		\b.%d+
+>42	lelong		0xfdc4a7dc	\b,
+>>70	byte		>0		extract: v%d
+>>>71	byte		x		\b.%d+
+
+# Shell archives
+10	string		#\ This\ is\ a\ shell\ archive	shell archive text
+
+#
+# LBR. NB: May conflict with the questionable 
+#          "binary Computer Graphics Metafile" format.
+#
+0       string  \0\ \ \ \ \ \ \ \ \ \ \ \0\0    LBR archive data
+#
+# PMA (CP/M derivative of LHA)
+#
+2       string          -pm0-           PMarc archive data [pm0]
+2       string          -pm1-           PMarc archive data [pm1]
+2       string          -pm2-           PMarc archive data [pm2]
+2       string          -pms-           PMarc SFX archive (CP/M, DOS)
+5       string          -pc1-           PopCom compressed executable (CP/M)
+
+# From Rafael Laboissiere <rafael at laboissiere.net>
+# The Project Revision Control System (see
+# http://prcs.sourceforge.net) generates a packaged project
+# file which is recognized by the following entry: 
+0	leshort		0xeb81	PRCS packaged project
+
+# Microsoft cabinets 
+# by David Necas (Yeti) <yeti at physics.muni.cz>
+#0	string	MSCF\0\0\0\0	Microsoft cabinet file data,
+#>25	byte	x		v%d
+#>24	byte	x		\b.%d
+# MPi: All CABs have version 1.3, so this is pointless.
+# Better magic in debian-additions.
+
+# GTKtalog catalogs 
+# by David Necas (Yeti) <yeti at physics.muni.cz>
+4	string	gtktalog\ 	GTKtalog catalog data,
+>13	string	3		version 3
+>>14	beshort	0x677a		(gzipped)
+>>14	beshort	!0x677a		(not gzipped)
+>13	string	>3		version %s
+
+############################################################################
+# Parity archive reconstruction file, the 'par' file format now used on Usenet.
+0       string          PAR\0	PARity archive data
+>48	leshort		=0	- Index file
+>48	leshort		>0	- file number %d
+
+# Felix von Leitner <felix-file at fefe.de>
+0	string	d8:announce	BitTorrent file
+
+# Atari MSA archive - Teemu Hukkanen <tjhukkan at iki.fi>
+0       beshort 0x0e0f          Atari MSA archive data
+>2      beshort x       	\b, %d sectors per track
+>4      beshort 0       	\b, 1 sided
+>4      beshort 1       	\b, 2 sided
+>6      beshort x       	\b, starting track: %d
+>8      beshort x       	\b, ending track: %d
+
+# Alternate ZIP string (amc at arwen.cs.berkeley.edu)
+0	string	PK00PK\003\004	Zip archive data
+
+# ACE archive (from http://www.wotsit.org/download.asp?f=ace)
+# by Stefan `Sec` Zehl <sec at 42.org>
+7	string		**ACE**		ACE compressed archive
+>15	byte	>0		version %d
+>16	byte	=0x00		\b, from MS-DOS
+>16	byte	=0x01		\b, from OS/2
+>16	byte	=0x02		\b, from Win/32
+>16	byte	=0x03		\b, from Unix
+>16	byte	=0x04		\b, from MacOS
+>16	byte	=0x05		\b, from WinNT
+>16	byte	=0x06		\b, from Primos
+>16	byte	=0x07		\b, from AppleGS
+>16	byte	=0x08		\b, from Atari
+>16	byte	=0x09		\b, from Vax/VMS
+>16	byte	=0x0A		\b, from Amiga
+>16	byte	=0x0B		\b, from Next
+>14	byte	x		\b, version %d to extract
+>5	leshort &0x0080		\b, multiple volumes,
+>>17	byte	x		\b (part %d),
+>5	leshort &0x0002		\b, contains comment
+>5	leshort	&0x0200		\b, sfx
+>5	leshort	&0x0400		\b, small dictionary
+>5	leshort	&0x0800		\b, multi-volume
+>5	leshort	&0x1000		\b, contains AV-String
+>>30	string\x16*UNREGISTERED\x20VERSION*	(unregistered)
+>5	leshort &0x2000		\b, with recovery record
+>5	leshort &0x4000		\b, locked
+>5	leshort &0x8000		\b, solid
+# Date in MS-DOS format (whatever that is)
+#>18	lelong	x		Created on
+
+#------------------------------------------------------------------------------
+# asterix:  file(1) magic for Aster*x; SunOS 5.5.1 gave the 4-character
+# strings as "long" - we assume they're just strings:
+# From: guy at netapp.com (Guy Harris)
+#
+0	string		*STA		Aster*x
+>7	string		WORD			Words Document
+>7	string		GRAP			Graphic
+>7	string		SPRE			Spreadsheet
+>7	string		MACR			Macro
+0	string		2278		Aster*x Version 2
+>29	byte		0x36			Words Document
+>29	byte		0x35			Graphic
+>29	byte		0x32			Spreadsheet
+>29	byte		0x38			Macro
+
+
+#------------------------------------------------------------------------------
+# att3b:  file(1) magic for AT&T 3B machines
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+# 3B20
+#
+# The 3B20 conflicts with SCCS.
+#0	beshort		0550		3b20 COFF executable
+#>12	belong		>0		not stripped
+#>22	beshort		>0		- version %ld
+#0	beshort		0551		3b20 COFF executable (TV)
+#>12	belong		>0		not stripped
+#>22	beshort		>0		- version %ld
+#
+# WE32K
+#
+0	beshort		0560		WE32000 COFF
+>18	beshort		^00000020	object
+>18	beshort		&00000020	executable
+>12	belong		>0		not stripped
+>18	beshort		^00010000	N/A on 3b2/300 w/paging
+>18	beshort		&00020000	32100 required
+>18	beshort		&00040000	and MAU hardware required
+>20	beshort		0407		(impure)
+>20	beshort		0410		(pure)
+>20	beshort		0413		(demand paged)
+>20	beshort		0443		(target shared library)
+>22	beshort		>0		- version %ld
+0	beshort		0561		WE32000 COFF executable (TV)
+>12	belong		>0		not stripped
+#>18	beshort		&00020000	- 32100 required
+#>18	beshort		&00040000	and MAU hardware required
+#>22	beshort		>0		- version %ld
+#
+# core file for 3b2 
+0	string		\000\004\036\212\200	3b2 core file
+>364	string		>\0		of '%s'
+
+#------------------------------------------------------------------------------
+# audio:  file(1) magic for sound formats (see also "iff")
+#
+# Jan Nicolai Langfeldt (janl at ifi.uio.no), Dan Quinlan (quinlan at yggdrasil.com),
+# and others
+#
+
+# Sun/NeXT audio data
+0	string		.snd		Sun/NeXT audio data:
+>12	belong		1		8-bit ISDN mu-law,
+>12	belong		2		8-bit linear PCM [REF-PCM],
+>12	belong		3		16-bit linear PCM,
+>12	belong		4		24-bit linear PCM,
+>12	belong		5		32-bit linear PCM,
+>12	belong		6		32-bit IEEE floating point,
+>12	belong		7		64-bit IEEE floating point,
+>12	belong		23		8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice data encoding),
+>12	belong		24		compressed (8-bit G.722 ADPCM)
+>12	belong		25		compressed (3-bit G.723 ADPCM),
+>12	belong		26		compressed (5-bit G.723 ADPCM),
+>12	belong		27		8-bit A-law,
+>20	belong		1		mono,
+>20	belong		2		stereo,
+>20	belong		4		quad,
+>16	belong		>0		%d Hz
+
+# DEC systems (e.g. DECstation 5000) use a variant of the Sun/NeXT format
+# that uses little-endian encoding and has a different magic number
+0	lelong		0x0064732E	DEC audio data:
+>12	lelong		1		8-bit ISDN mu-law,
+>12	lelong		2		8-bit linear PCM [REF-PCM],
+>12	lelong		3		16-bit linear PCM,
+>12	lelong		4		24-bit linear PCM,
+>12	lelong		5		32-bit linear PCM,
+>12	lelong		6		32-bit IEEE floating point,
+>12	lelong		7		64-bit IEEE floating point,
+>12	lelong		23		8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice data encoding),
+>20	lelong		1		mono,
+>20	lelong		2		stereo,
+>20	lelong		4		quad,
+>16	lelong		>0		%d Hz
+
+# Creative Labs AUDIO stuff
+0	string	MThd			Standard MIDI data
+>8 	beshort	x			(format %d)
+>10	beshort	x			using %d track
+>10	beshort		>1		\bs
+>12	beshort&0x7fff	x		at 1/%d
+>12	beshort&0x8000	>0		SMPTE
+
+0	string	CTMF			Creative Music (CMF) data
+0	string	SBI			SoundBlaster instrument data
+0	string	Creative\ Voice\ File	Creative Labs voice data
+# is this next line right?  it came this way...
+>19	byte	0x1A
+>23	byte	>0			- version %d
+>22	byte	>0			\b.%d
+
+# first entry is also the string "NTRK"
+0	belong		0x4e54524b	MultiTrack sound data
+>4	belong		x		- version %ld
+
+# Extended MOD format (*.emd) (Greg Roelofs, newt at uchicago.edu); NOT TESTED
+# [based on posting 940824 by "Dirk/Elastik", husberg at lehtori.cc.tut.fi]
+0	string		EMOD		Extended MOD sound data,
+>4	byte&0xf0	x		version %d
+>4	byte&0x0f	x		\b.%d,
+>45	byte		x		%d instruments
+>83	byte		0		(module)
+>83	byte		1		(song)
+
+# Real Audio (Magic .ra\0375)
+0	belong		0x2e7261fd	RealAudio sound file
+0	string		.RMF\0\0\0	RealMedia file
+
+# MTM/669/FAR/S3M/ULT/XM format checking [Aaron Eppert, aeppert at dialin.ind.net]
+# Oct 31, 1995
+# fixed by <doj at cubic.org> 2003-06-24
+# Too short...
+#0	string		MTM		MultiTracker Module sound data
+#0	string		if		Composer 669 Module sound data
+#0	string		JN		Composer 669 Module sound data (extended format)
+0	string		MAS_U		ULT(imate) Module sound data
+
+#0	string		FAR		Module sound data
+#>4	string		>\15		Title: "%s"
+
+0x2c	string		SCRM		ScreamTracker III Module sound data
+>0	string		>\0		Title: "%s"
+
+# Gravis UltraSound patches
+# From <ache at nagual.ru>
+
+0	string		GF1PATCH110\0ID#000002\0	GUS patch
+0	string		GF1PATCH100\0ID#000002\0	Old GUS	patch
+
+#
+# Taken from loader code from mikmod version 2.14
+# by Steve McIntyre (stevem at chiark.greenend.org.uk)
+# <doj at cubic.org> added title printing on 2003-06-24
+0	string	MAS_UTrack_V00
+>14	string	>/0		ultratracker V1.%.1s module sound data
+
+0	string	UN05		MikMod UNI format module sound data
+
+0	string	Extended\ Module: Fasttracker II module sound data
+>17	string	>\0		Title: "%s"
+
+21	string/c	!SCREAM!	Screamtracker 2 module sound data
+21	string	BMOD2STM	Screamtracker 2 module sound data
+1080	string	M.K.		4-channel Protracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	M!K!		4-channel Protracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	FLT4		4-channel Startracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	FLT8		8-channel Startracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	4CHN		4-channel Fasttracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	6CHN		6-channel Fasttracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	8CHN		8-channel Fasttracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	CD81		8-channel Octalyser module sound data
+>0	string	>\0		Title: "%s"
+1080	string	OKTA		8-channel Oktalyzer module sound data
+>0	string	>\0		Title: "%s"
+# Not good enough.
+#1082	string	CH
+#>1080	string	>/0		%.2s-channel Fasttracker "oktalyzer" module sound data
+1080	string	16CN		16-channel Taketracker module sound data
+>0	string	>\0		Title: "%s"
+1080	string	32CN		32-channel Taketracker module sound data
+>0	string	>\0		Title: "%s"
+
+# TOC sound files -Trevor Johnson <trevor at jpj.net>
+#
+0       string          TOC             TOC sound file
+
+# sidfiles <pooka at iki.fi>
+# added name,author,(c) and new RSID type by <doj at cubic.org> 2003-06-24
+0	string		SIDPLAY\ INFOFILE	Sidplay info file
+
+0	string		PSID			PlaySID v2.2+ (AMIGA) sidtune
+>4	beshort		>0			w/ header v%d,
+>14	beshort		=1			single song,
+>14	beshort		>1			%d songs,
+>16	beshort		>0			default song: %d
+>0x16	string		>\0			name: "%s"
+>0x36	string		>\0			author: "%s"
+>0x56	string		>\0			copyright: "%s"
+
+0	string		RSID			RSID sidtune PlaySID compatible
+>4	beshort		>0			w/ header v%d,
+>14	beshort		=1			single song,
+>14	beshort		>1			%d songs,
+>16	beshort		>0			default song: %d
+>0x16	string		>\0			name: "%s"
+>0x36	string		>\0			author: "%s"
+>0x56	string		>\0			copyright: "%s"
+
+# IRCAM <mpruett at sgi.com>
+# VAX and MIPS files are little-endian; Sun and NeXT are big-endian
+0	belong		0x64a30100		IRCAM file (VAX)
+0	belong		0x64a30200		IRCAM file (Sun)
+0	belong		0x64a30300		IRCAM file (MIPS little-endian)
+0	belong		0x64a30400		IRCAM file (NeXT)
+
+# NIST SPHERE <mpruett at sgi.com>
+0	string		NIST_1A\n\ \ \ 1024\n	NIST SPHERE file
+
+# Sample Vision <mpruett at sgi.com>
+0	string		SOUND\ SAMPLE\ DATA\ 	Sample Vision file
+
+# Audio Visual Research <tonigonenstein at users.sourceforge.net>
+0	string		2BIT			Audio Visual Research file,
+>12	beshort		=0			mono,
+>12	beshort		=-1			stereo,
+>14	beshort		x			%d bits
+>16	beshort		=0			unsigned,
+>16	beshort		=-1			signed,
+>22	belong&0x00ffffff	x		%d Hz,
+>18	beshort		=0			no loop,
+>18	beshort		=-1			loop,
+>21	ubyte		<=127			note %d,
+>22	byte		=0			replay 5.485 KHz
+>22	byte		=1			replay 8.084 KHz
+>22	byte		=2			replay 10.971 Khz
+>22	byte		=3			replay 16.168 Khz
+>22	byte		=4			replay 21.942 KHz
+>22	byte		=5			replay 32.336 KHz
+>22	byte		=6			replay 43.885 KHz
+>22	byte		=7			replay 47.261 KHz
+
+# SGI SoundTrack <mpruett at sgi.com>
+0	string		_SGI_SoundTrack		SGI SoundTrack project file
+# ID3 version 2 tags <waschk at informatik.uni-rostock.de>
+0	string		ID3	MP3 file with ID3 version 2.
+>3	ubyte	<0xff	\b%d.
+>4	ubyte	<0xff	\b%d tag
+
+# NSF (NES sound file) magic
+0	string		NESM\x1a	NES Sound File
+>14	string		>\0		("%s" by
+>46	string		>\0		%s, copyright
+>78	string		>\0		%s),
+>5	byte		x		version %d,
+>6	byte		x		%d tracks,
+>122	byte&0x2	=1		dual PAL/NTSC
+>122	byte&0x1	=1		PAL
+>122	byte&0x1	=0		NTSC
+
+# Impuse tracker module (audio/x-it)
+0	string		IMPM		Impulse Tracker module sound data -
+>4	string		>\0		"%s"
+>40	leshort		!0		compatible w/ITv%x
+>42	leshort		!0		created w/ITv%x
+
+# Imago Orpheus module (audio/x-imf)
+60	string		IM10		Imago Orpheus module sound data -
+>0	string		>\0		"%s"
+
+# From <collver1 at attbi.com>
+# These are the /etc/magic entries to decode modules, instruments, and
+# samples in Impulse Tracker's native format.
+
+0	string		IMPS		Impulse Tracker Sample
+>18	byte		&2		16 bit
+>18	byte		^2		8 bit
+>18	byte		&4		stereo
+>18	byte		^4		mono
+0	string		IMPI		Impulse Tracker Instrument
+>28	leshort		!0		ITv%x
+>30	byte		!0		%d samples
+
+# Yamaha TX Wave:  file(1) magic for Yamaha TX Wave audio files
+# From <collver1 at attbi.com>
+0	string		LM8953		Yamaha TX Wave
+>22	byte		0x49		looped
+>22	byte		0xC9		non-looped
+>23	byte		1		33kHz
+>23	byte		2		50kHz
+>23	byte		3		16kHz
+
+# scream tracker:  file(1) magic for Scream Tracker sample files
+#
+# From <collver1 at attbi.com>
+76	string		SCRS		Scream Tracker Sample
+>0	byte		1		sample
+>0	byte		2		adlib melody
+>0	byte		>2		adlib drum
+>31	byte		&2		stereo
+>31	byte		^2		mono
+>31	byte		&4		16bit little endian
+>31	byte		^4		8bit
+>30	byte		0		unpacked
+>30	byte		1		packed
+
+# audio
+# From: Cory Dikkers <cdikkers at swbell.net>
+0	string		MMD0		MED music file, version 0
+0	string		MMD1		OctaMED Pro music file, version 1
+0	string		MMD3		OctaMED Soundstudio music file, version 3
+0	string		OctaMEDCmpr	OctaMED Soundstudio compressed file
+0	string		MED		MED_Song
+0	string		SymM		Symphonie SymMOD music file
+#
+0	string		THX		AHX version
+>3	byte		=0		1 module data
+>3	byte		=1		2 module data
+#
+0	string		OKTASONG	Oktalyzer module data
+#
+0	string		DIGI\ Booster\ module\0	%s
+>20	byte		>0		%c
+>>21	byte		>0		\b%c
+>>>22	byte		>0		\b%c
+>>>>23	byte		>0		\b%c
+>610	string		>\0		\b, "%s"
+#
+0	string		DBM0	   	DIGI Booster Pro Module
+>4	byte		>0		V%X.
+>>5	byte		x		\b%02X
+>16	string		>\0		\b, "%s"
+#
+0	string		FTMN		FaceTheMusic module
+>16	string		>\0d		\b, "%s"
+
+# From: <doj at cubic.org> 2003-06-24
+0	string		AMShdr\32	Velvet Studio AMS Module v2.2
+0	string		Extreme		Extreme Tracker AMS Module v1.3
+0	string		DDMF		Xtracker DMF Module
+>4	byte		x		v%i
+>0xD	string		>\0		Title: "%s"
+>0x2B	string		>\0		Composer: "%s"
+0	string		DSM\32		Dynamic Studio Module DSM
+0	string		SONG		DigiTrekker DTM Module
+0	string		DMDL		DigiTrakker MDL Module
+0	string		PSM\32		Protracker Studio PSM Module
+44	string		PTMF		Poly Tracker PTM Module
+>0	string		>\32		Title: "%s"
+0	string		MT20		MadTracker 2.0 Module MT2
+0	string		RAD\40by\40REALiTY!! RAD Adlib Tracker Module RAD
+0	string		RTMM		RTM Module
+0x426	string		MaDoKaN96	XMS Adlib Module
+>0	string		>\0		Composer: "%s"
+0	string		AMF		AMF Module
+>4	string		>\0		Title: "%s"
+0	string		MODINFO1	Open Cubic Player Module Inforation MDZ
+0	string		Extended\40Instrument: Fast Tracker II Instrument
+
+# From: Takeshi Hamasaki <hma at syd.odn.ne.jp>
+# NOA Nancy Codec file
+0	string		\210NOA\015\012\032	NOA Nancy Codec Movie file
+# Yamaha SMAF format
+0	string		MMMD		Yamaha SMAF file
+# Sharp Jisaku Melody format for PDC
+0	string		\001Sharp\040JisakuMelody	SHARP Cell-Phone ringing Melody
+>20	string		Ver01.00	Ver. 1.00
+>>32	byte		x		, %d tracks
+
+# Free lossless audio codec <http://flac.sourceforge.net>
+# From: Przemyslaw Augustyniak <silvathraec at rpg.pl>
+0	string			fLaC		FLAC audio bitstream data
+>4	byte&0x7f		>0		\b, unknown version
+>4	byte&0x7f		0		\b
+# some common bits/sample values
+>>20	beshort&0x1f0		0x030		\b, 4 bit
+>>20	beshort&0x1f0		0x050		\b, 6 bit
+>>20	beshort&0x1f0		0x070		\b, 8 bit
+>>20	beshort&0x1f0		0x0b0		\b, 12 bit
+>>20	beshort&0x1f0		0x0f0		\b, 16 bit
+>>20	beshort&0x1f0		0x170		\b, 24 bit
+>>20	byte&0xe		0x0		\b, mono
+>>20	byte&0xe		0x2		\b, stereo
+>>20	byte&0xe		0x4		\b, 3 channels
+>>20	byte&0xe		0x6		\b, 4 channels
+>>20	byte&0xe		0x8		\b, 5 channels
+>>20	byte&0xe		0xa		\b, 6 channels
+>>20	byte&0xe		0xc		\b, 7 channels
+>>20	byte&0xe		0xe		\b, 8 channels
+# some common sample rates
+>>17	belong&0xfffff0		0x0ac440	\b, 44.1 kHz
+>>17	belong&0xfffff0		0x0bb800	\b, 48 kHz
+>>17	belong&0xfffff0		0x07d000	\b, 32 kHz
+>>17	belong&0xfffff0		0x056220	\b, 22.05 kHz
+>>17	belong&0xfffff0		0x05dc00	\b, 24 kHz
+>>17	belong&0xfffff0		0x03e800	\b, 16 kHz
+>>17	belong&0xfffff0		0x02b110	\b, 11.025 kHz
+>>17	belong&0xfffff0		0x02ee00	\b, 12 kHz
+>>17	belong&0xfffff0		0x01f400	\b, 8 kHz
+>>17	belong&0xfffff0		0x177000	\b, 96 kHz
+>>17	belong&0xfffff0		0x0fa000	\b, 64 kHz
+>>21	byte&0xf		>0		\b, >4G samples
+>>21	byte&0xf		0		\b
+>>>22	belong			>0		\b, %u samples
+>>>22	belong			0		\b, length unknown
+
+# (ISDN) VBOX voice message file (Wolfram Kleff)
+0       string          VBOX            VBOX voice message data
+
+# ReBorn Song Files (.rbs)
+# David J. Singer <doc at deadvirgins.org.uk>
+8       string          RB40             RBS Song file
+>29     string          ReBorn           created by ReBorn
+>37     string          Propellerhead    created by ReBirth
+
+# Synthesizer Generator and Kimwitu share their file format
+0	string		A#S#C#S#S#L#V#3	    Synthesizer Generator or Kimwitu data
+# Kimwitu++ uses a slightly different magic
+0	string		A#S#C#S#S#L#HUB	    Kimwitu++ data
+
+# From "Simon Hosie
+0       string  TFMX-SONG       TFMX module sound data
+#------------------------------------------------------------------------------
+# bFLT: file(1) magic for BFLT uclinux binary files
+#
+# From Philippe De Muyter <phdm at macqel.be>
+#
+0	string		bFLT		BFLT executable
+>4	belong		x		- version %ld
+>4	belong		4
+>>36	belong&0x1	0x1		ram
+>>36	belong&0x2	0x2		gotpic
+>>36	belong&0x4	0x4		gzip
+>>36	belong&0x8	0x8		gzdata
+#------------------------------------------------------------------------------
+# blender: file(1) magic for Blender 3D data files
+#
+# Coded by Guillermo S. Romero <gsromero at alumnos.euitt.upm.es> using the
+# data from Ton Roosendaal <ton at blender.nl>. Ton or his company do not
+# support the rule, so mail GSR if problems with it. Rule version: 1.1.
+# You can get latest version with comments and details about the format
+# at http://acd.asoc.euitt.upm.es/~gsromero/3d/blender/magic.blender
+
+0	string	=BLENDER	Blender3D,
+>7	string	=_		saved as 32-bits
+>7      string	=-		saved as 64-bits
+>8	string	=v		little endian
+>8	string	=V		big endian
+>9	byte	x		with version %c.
+>10	byte	x		\b%c
+>11	byte	x		\b%c
+
+#------------------------------------------------------------------------------
+# blit:  file(1) magic for 68K Blit stuff as seen from 680x0 machine
+#
+# Note that this 0407 conflicts with several other a.out formats...
+#
+# XXX - should this be redone with "be" and "le", so that it works on
+# little-endian machines as well?  If so, what's the deal with
+# "VAX-order" and "VAX-order2"?
+#
+#0	long		0407		68K Blit (standalone) executable
+#0	short		0407		VAX-order2 68K Blit (standalone) executable
+0	short		03401		VAX-order 68K Blit (standalone) executable
+0	long		0406		68k Blit mpx/mux executable
+0	short		0406		VAX-order2 68k Blit mpx/mux executable
+0	short		03001		VAX-order 68k Blit mpx/mux executable
+# Need more values for WE32 DMD executables.
+# Note that 0520 is the same as COFF
+#0	short		0520		tty630 layers executable
+#
+# i80960 b.out objects and archives
+#
+0	long		0x10d		i960 b.out relocatable object
+>16	long		>0		not stripped
+#
+# b.out archive (hp-rt on i960)
+0	string		!<bout>		b.out archive
+>8	string		__.SYMDEF	random library
+#------------------------------------------------------------------------------
+# bsdi:  file(1) magic for BSD/OS (from BSDI) objects
+#
+
+0	lelong		0314		386 compact demand paged pure executable
+>16	lelong		>0		not stripped
+>32	byte		0x6a		(uses shared libs)
+
+0	lelong		0407		386 executable
+>16	lelong		>0		not stripped
+>32	byte		0x6a		(uses shared libs)
+
+0	lelong		0410		386 pure executable
+>16	lelong		>0		not stripped
+>32	byte		0x6a		(uses shared libs)
+
+0	lelong		0413		386 demand paged pure executable
+>16	lelong		>0		not stripped
+>32	byte		0x6a		(uses shared libs)
+
+# same as in SunOS 4.x, except for static shared libraries
+0	belong&077777777	0600413		SPARC demand paged
+>0	byte		&0x80
+>>20	belong		<4096		shared library
+>>20	belong		=4096		dynamically linked executable
+>>20	belong		>4096		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+>36	belong		0xb4100001	(uses shared libs)
+
+0	belong&077777777	0600410		SPARC pure
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+>36	belong		0xb4100001	(uses shared libs)
+
+0	belong&077777777	0600407		SPARC
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+>36	belong		0xb4100001	(uses shared libs)
+
+#------------------------------------------------------------------------------
+# autocad:  file(1) magic for cad files
+#
+
+# AutoCAD DWG versions R13/R14 (www.autodesk.com)
+# Written December 01, 2003 by Lester Hightower
+# Based on the DWG File Format Specifications at http://www.opendwg.org/
+0	string	       \101\103\061\060\061		   AutoCAD
+>5	string	       \062\000\000\000\000		   DWG ver. R13
+>5	string	       \064\000\000\000\000		   DWG ver. R14
+
+# Microstation DGN/CIT Files (www.bentley.com)
+# Written October 30, 2003 by Lester Hightower
+# DGN is the default file extension of Microstation/Intergraph CAD files.
+# CIT is the proprietary raster format (similar to TIFF) used to attach
+# raster underlays to Microstation DGN (vector) drawings.
+# 
+# http://www.wotsit.org/search.asp
+# http://filext.com/detaillist.php?extdetail=DGN
+# http://filext.com/detaillist.php?extdetail=CIT
+#
+# http://www.bentley.com/products/default.cfm?objectid=97F351F5-9C35-4E5E-89C2
+# 3F86C928&method=display&p_objectid=97F351F5-9C35-4E5E-89C280A93F86C928
+# http://www.bentley.com/products/default.cfm?objectid=A5C2FD43-3AC9-4C71-B682
+# 721C479F&method=display&p_objectid=A5C2FD43-3AC9-4C71-B682C7BE721C479F
+0	string	       \010\011\376			   Microstation
+>3	string	       \002
+>>30	string	       \372\104				   DGN File
+>>30	string	       \172\104				   DGN File
+>>30	string	       \026\105				   DGN File
+>4	string	       \030\000\000			   CIT File
+
+# AutoCad, from Nahuel Greco
+0	string AC1012	AutoCad (release 12)
+0	string AC1014	AutoCad (release 14)
+
+#------------------------------------------------------------------------------
+# c-lang:  file(1) magic for C programs (or REXX)
+#
+
+# XPM icons (Greg Roelofs, newt at uchicago.edu)
+# if you uncomment "/*" for C/REXX below, also uncomment this entry
+#0	string		/*\ XPM\ */	X pixmap image data
+
+# this first will upset you if you're a PL/1 shop...
+# in which case rm it; ascmagic will catch real C programs
+#0	string		/*		C or REXX program text
+#0	string		//		C++ program text
+
+# From: Mikhail Teterin <mi at aldan.algebra.com> 
+0	string		cscope		cscope reference data
+>7	string		x		version %.2s
+# We skip the path here, because it is often long (so file will
+# truncate it) and mostly redundant.
+# The inverted index functionality was added some time betwen
+# versions 11 and 15, so look for -q if version is above 14:
+>7	string		>14
+>>10	regex		.+\ -q\		with inverted index
+>10	regex		.+\ -c\		text (non-compressed)
+
+#------------------------------------------------------------------------------
+# c64:  file(1) magic for various commodore 64 related files
+#
+# From <doj at cubic.org>
+
+0x16500	belong		0x12014100	D64 Image
+0x16500	belong		0x12014180	D71 Image
+0x61800 belong		0x28034400	D81 Image
+0	string		C64\40CARTRIDGE	CCS C64 Emultar Cartridge Image
+0	belong		0x43154164	X64 Image
+
+0	string		GCR-1541	GCR Image
+>8	byte		x		version: $i
+>9	byte		x		tracks: %i
+
+9	string		PSUR		ARC archive (c64)
+2	string		-LH1-		LHA archive (c64)
+
+0	string		C64File		PC64 Emulator file
+>8	string		>\0		"%s"
+0	string		C64Image	PC64 Freezer Image
+
+0	beshort		0x38CD		C64 PCLink Image
+0	string		CBM\144\0\0	Power 64 C64 Emulator Snapshot
+
+0	belong		0xFF424CFF	WRAptor packer (c64)
+
+#------------------------------------------------------------------------------
+# CDDB: file(1) magic for CDDB(tm) format CD text data files
+#
+# From <steve at gracenote.com>
+#
+# This is the /etc/magic entry to decode datafiles as used by
+# CDDB-enabled CD player applications.
+#
+
+0       string/b        #\040xmcd               CDDB(tm) format CD text data
+
+#------------------------------------------------------------------------------
+# chi:  file(1) magic for ChiWriter files
+#
+0       string          \\1cw\          ChiWriter file
+>5      string          >\0             version %s
+0       string          \\1cw           ChiWriter file
+
+#------------------------------------------------------------------------------
+# chord: file(1) magic for Chord music sheet typesetting utility input files
+#
+# From Philippe De Muyter <phdm at macqel.be>
+# File format is actually free, but many distributed files begin with `{title'
+#
+0	string		{title		Chord text file
+
+#------------------------------------------------------------------------------
+# cisco:  file(1) magic for cisco Systems routers
+#
+# Most cisco file-formats are covered by the generic elf code
+#
+# Microcode files are non-ELF, 0x8501 conflicts with NetBSD/alpha.
+0	belong&0xffffff00	0x85011400  cisco IOS microcode
+>7	string		>\0		    for '%s'
+0	belong&0xffffff00	0x8501cb00  cisco IOS experimental microcode
+>7	string		>\0		    for '%s'
+#------------------------------------------------------------------------------
+# citrus locale declaration
+#
+
+0	string		RuneCT		Citrus locale declaration for LC_CTYPE
+
+
+#------------------------------------------------------------------------------
+# claris:  file(1) magic for claris
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Claris Works a word processor, etc.
+# Version 3.0
+
+# .pct claris works clip art files
+#0000000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
+#*
+#0001000 #010 250 377 377 377 377 000 213 000 230 000 021 002 377 014 000
+#null to byte 1000 octal
+514	string	\377\377\377\377\000	Claris clip art?
+>0	string	\0\0\0\0\0\0\0\0\0\0\0\0\0	yes.
+514	string	\377\377\377\377\001	Claris clip art?
+>0	string	\0\0\0\0\0\0\0\0\0\0\0\0\0	yes.
+
+# Claris works files
+# .cwk
+0	string	\002\000\210\003\102\117\102\117\000\001\206 Claris works document
+# .plt
+0	string	\020\341\000\000\010\010	Claris Works pallete files .plt
+
+# .msp a dictionary file I am not sure about this I have only one .msp file
+0	string	\002\271\262\000\040\002\000\164	Claris works dictionary
+
+# .usp are user dictionary bits
+# I am not sure about a magic header:
+#0000000 001 123 160 146 070 125 104 040 136 123 015 012 160 157 144 151
+#        soh   S   p   f   8   U   D  sp   ^   S  cr  nl   p   o   d   i
+#0000020 141 164 162 151 163 164 040 136 123 015 012 144 151 166 040 043
+#          a   t   r   i   s   t  sp   ^   S  cr  nl   d   i   v  sp   #
+
+# .mth Thesaurus
+# statrts with \0 but no magic header
+
+# .chy Hyphenation file
+# I am not sure: 000 210 034 000 000
+
+# other claris files
+#./windows/claris/useng.ndx: data
+#./windows/claris/xtndtran.l32: data
+#./windows/claris/xtndtran.lst: data
+#./windows/claris/clworks.lbl: data
+#./windows/claris/clworks.prf: data
+#./windows/claris/userd.spl: data
+
+#------------------------------------------------------------------------------
+# clipper:  file(1) magic for Intergraph (formerly Fairchild) Clipper.
+#
+# XXX - what byte order does the Clipper use?
+#
+# XXX - what's the "!" stuff:
+#
+# >18	short		!074000,000000	C1 R1 
+# >18	short		!074000,004000	C2 R1
+# >18	short		!074000,010000	C3 R1
+# >18	short		!074000,074000	TEST
+#
+# I shall assume it's ANDing the field with the first value and
+# comparing it with the second, and rewrite it as:
+#
+# >18	short&074000	000000		C1 R1 
+# >18	short&074000	004000		C2 R1
+# >18	short&074000	010000		C3 R1
+# >18	short&074000	074000		TEST
+#
+# as SVR3.1's "file" doesn't support anything of the "!074000,000000"
+# sort, nor does SunOS 4.x, so either it's something Intergraph added
+# in CLIX, or something AT&T added in SVR3.2 or later, or something
+# somebody else thought was a good idea; it's not documented in the
+# man page for this version of "magic", nor does it appear to be
+# implemented (at least not after I blew off the bogus code to turn
+# old-style "&"s into new-style "&"s, which just didn't work at all).
+#
+0	short		0575		CLIPPER COFF executable (VAX #)
+>20	short		0407		(impure)
+>20	short		0410		(5.2 compatible)
+>20	short		0411		(pure)
+>20	short		0413		(demand paged)
+>20	short		0443		(target shared library)
+>12	long		>0		not stripped
+>22	short		>0		- version %ld
+0	short		0577		CLIPPER COFF executable
+>18	short&074000	000000		C1 R1 
+>18	short&074000	004000		C2 R1
+>18	short&074000	010000		C3 R1
+>18	short&074000	074000		TEST
+>20	short		0407		(impure)
+>20	short		0410		(pure)
+>20	short		0411		(separate I&D)
+>20	short		0413		(paged)
+>20	short		0443		(target shared library)
+>12	long		>0		not stripped
+>22	short		>0		- version %ld
+>48	long&01		01		alignment trap enabled
+>52	byte		1		-Ctnc
+>52	byte		2		-Ctsw
+>52	byte		3		-Ctpw
+>52	byte		4		-Ctcb
+>53	byte		1		-Cdnc
+>53	byte		2		-Cdsw
+>53	byte		3		-Cdpw
+>53	byte		4		-Cdcb
+>54	byte		1		-Csnc
+>54	byte		2		-Cssw
+>54	byte		3		-Cspw
+>54	byte		4		-Cscb
+4	string		pipe		CLIPPER instruction trace
+4	string		prof		CLIPPER instruction profile
+
+#------------------------------------------------------------------------------
+# commands:  file(1) magic for various shells and interpreters
+#
+0	string		:			shell archive or script for antique kernel text
+0	string/b	#!\ /bin/sh		Bourne shell script text
+0	string/b	#!\ /bin/csh		C shell script text
+# korn shell magic, sent by George Wu, gwu at clyde.att.com
+0	string/b	#!\ /bin/ksh		Korn shell script text
+0	string/b 	#!\ /bin/tcsh		Tenex C shell script text
+0	string/b 	#!\ /usr/bin/tcsh	Tenex C shell script text
+0	string/b 	#!\ /usr/local/tcsh	Tenex C shell script text
+0	string/b	#!\ /usr/local/bin/tcsh	Tenex C shell script text
+
+#
+# zsh/ash/ae/nawk/gawk magic from cameron at cs.unsw.oz.au (Cameron Simpson)
+0	string/b	#!\ /bin/zsh		Paul Falstad's zsh script text
+0	string/b	#!\ /usr/bin/zsh	Paul Falstad's zsh script text
+0	string/b	#!\ /usr/local/bin/zsh	Paul Falstad's zsh script text
+0	string/b	#!\ /usr/local/bin/ash	Neil Brown's ash script text
+0	string/b	#!\ /usr/local/bin/ae	Neil Brown's ae script text
+0	string/b	#!\ /bin/nawk		new awk script text
+0	string/b	#!\ /usr/bin/nawk	new awk script text
+0	string/b	#!\ /usr/local/bin/nawk	new awk script text
+0	string/b	#!\ /bin/gawk		GNU awk script text
+0	string/b	#!\ /usr/bin/gawk	GNU awk script text
+0	string/b	#!\ /usr/local/bin/gawk	GNU awk script text
+#
+0	string/b	#!\ /bin/awk		awk script text
+0	string/b	#!\ /usr/bin/awk	awk script text
+0	string		BEGIN			awk script text
+
+# AT&T Bell Labs' Plan 9 shell
+0	string/b	#!\ /bin/rc	Plan 9 rc shell script text
+
+# bash shell magic, from Peter Tobias (tobias at server.et-inf.fho-emden.de)
+0	string/b	#!\ /bin/bash		Bourne-Again shell script text
+0	string/b	#!\ /usr/bin/bash	Bourne-Again shell script text
+0	string/b	#!\ /usr/local/bash	Bourne-Again shell script text
+0	string/b	#!\ /usr/local/bin/bash	Bourne-Again shell script text
+
+# using env
+0	string		#!/usr/bin/env		a
+>15	string		>\0			%s script text
+0	string		#!\ /usr/bin/env	a
+>16	string		>\0			%s script text
+
+# PHP scripts
+# Ulf Harnhammar <ulfh at update.uu.se>
+0	string/c	=<?php			PHP script text
+0	string		=<?\n			PHP script text
+0	string		=<?\r			PHP script text
+0	string/b	#!\ /usr/local/bin/php	PHP script text
+0	string/b	#!\ /usr/bin/php	PHP script text
+
+0	string		Zend\x00		PHP script Zend Optimizer data
+
+#----------------------------------------------------------------------------
+# communcation
+
+# TTCN is the Tree and Tabular Combined Notation described in ISO 9646-3.
+# It is used for conformance testing of communication protocols.
+# Added by W. Borgert <debacle at debian.org>.
+0	string		$Suite			TTCN Abstract Test Suite
+>&1	string		$SuiteId
+>>&1	string		>\n			%s
+>&2	string		$SuiteId
+>>&1	string		>\n			%s
+>&3	string		$SuiteId
+>>&1	string		>\n			%s
+
+# MSC (message sequence charts) are a formal description technique,
+# described in ITU-T Z.120, mainly used for communication protocols.
+# Added by W. Borgert <debacle at debian.org>.
+0	string		mscdocument	Message Sequence Chart (document)
+0	string		msc		Message Sequence Chart (chart)
+0	string		submsc		Message Sequence Chart (subchart)
+
+#------------------------------------------------------------------------------
+# compress:  file(1) magic for pure-compression formats (no archives)
+#
+# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc.
+#
+# Formats for various forms of compressed data
+# Formats for "compress" proper have been moved into "compress.c",
+# because it tries to uncompress it to figure out what's inside.
+
+# standard unix compress
+0	string		\037\235	compress'd data
+>2	byte&0x80	>0		block compressed
+>2	byte&0x1f	x		%d bits
+
+# gzip (GNU zip, not to be confused with Info-ZIP or PKWARE zip archiver)
+#   Edited by Chris Chittleborough <cchittleborough at yahoo.com.au>, March 2002
+#	* Original filename is only at offset 10 if "extra field" absent
+#	* Produce shorter output - notably, only report compression methods
+#	  other than 8 ("deflate", the only method defined in RFC 1952).
+0       string          \037\213        gzip compressed data
+>2	byte		<8		\b, reserved method
+>2	byte		>8		\b, unknown method
+>3	byte		&0x01		\b, ASCII
+>3	byte		&0x02		\b, continuation
+>3	byte		&0x04		\b, extra field
+>3	byte&0xC	=0x08
+>>10	string		x		\b, was "%s"
+>9	byte		=0x00		\b, from MS-DOS
+>9	byte		=0x01		\b, from Amiga
+>9	byte		=0x02		\b, from VMS
+>9	byte		=0x03		\b, from Unix
+>9	byte		=0x05		\b, from Atari
+>9	byte		=0x06		\b, from OS/2
+>9	byte		=0x07		\b, from MacOS
+>9	byte		=0x0A		\b, from Tops/20
+>9	byte		=0x0B		\b, from Win/32
+>3	byte		&0x10		\b, comment
+>3	byte		&0x20		\b, encrypted
+### >4	ledate		x		last modified: %s,
+>8	byte		2		\b, max compression
+>8	byte		4		\b, max speed
+
+# packed data, Huffman (minimum redundancy) codes on a byte-by-byte basis
+0	string		\037\036	packed data
+>2	belong		>1		\b, %d characters originally
+>2	belong		=1		\b, %d character originally
+#
+# This magic number is byte-order-independent.
+0	short		0x1f1f		old packed data
+
+# XXX - why *two* entries for "compacted data", one of which is
+# byte-order independent, and one of which is byte-order dependent?
+#
+0	short		0x1fff		compacted data
+# This string is valid for SunOS (BE) and a matching "short" is listed
+# in the Ultrix (LE) magic file.
+0	string		\377\037	compacted data
+0	short		0145405		huf output
+
+# bzip2
+0	string		BZh		bzip2 compressed data
+>3	byte		>47		\b, block size = %c00k
+
+# squeeze and crunch
+# Michael Haardt <michael at cantor.informatik.rwth-aachen.de>
+0	beshort		0x76FF		squeezed data,
+>4	string		x		original name %s
+0	beshort		0x76FE		crunched data,
+>2	string		x		original name %s
+0	beshort		0x76FD		LZH compressed data,
+>2	string		x		original name %s
+
+# Freeze
+0	string		\037\237	frozen file 2.1
+0	string		\037\236	frozen file 1.0 (or gzip 0.5)
+
+# SCO compress -H (LZH)
+0	string		\037\240	SCO compress -H (LZH) data
+
+# European GSM 06.10 is a provisional standard for full-rate speech
+# transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse
+# excitation/long term prediction) coding at 13 kbit/s.
+#
+# There's only a magic nibble (4 bits); that nibble repeats every 33
+# bytes.  This isn't suited for use, but maybe we can use it someday.
+#
+# This will cause very short GSM files to be declared as data and
+# mismatches to be declared as data too!
+#0	byte&0xF0	0xd0		data
+#>33	byte&0xF0	0xd0
+#>66	byte&0xF0	0xd0
+#>99	byte&0xF0	0xd0
+#>132	byte&0xF0	0xd0		GSM 06.10 compressed audio
+
+# bzip	a block-sorting file compressor
+#	by Julian Seward <sewardj at cs.man.ac.uk> and others
+#
+0	string		BZ		bzip compressed data
+>2	byte		x		\b, version: %c
+>3	string		=1		\b, compression block size 100k
+>3	string		=2		\b, compression block size 200k
+>3	string		=3		\b, compression block size 300k
+>3	string		=4		\b, compression block size 400k
+>3	string		=5		\b, compression block size 500k
+>3	string		=6		\b, compression block size 600k
+>3	string		=7		\b, compression block size 700k
+>3	string		=8		\b, compression block size 800k
+>3	string		=9		\b, compression block size 900k
+
+# lzop from <markus.oberhumer at jk.uni-linz.ac.at>
+0	string		\x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a	lzop compressed data
+>9	beshort		<0x0940
+>>9	byte&0xf0	=0x00		- version 0.
+>>9	beshort&0x0fff	x		\b%03x,
+>>13	byte		1		LZO1X-1,
+>>13	byte		2		LZO1X-1(15),
+>>13	byte		3		LZO1X-999,
+## >>22	bedate		>0		last modified: %s,
+>>14	byte		=0x00		os: MS-DOS
+>>14	byte		=0x01		os: Amiga
+>>14	byte		=0x02		os: VMS
+>>14	byte		=0x03		os: Unix
+>>14	byte		=0x05		os: Atari
+>>14	byte		=0x06		os: OS/2
+>>14	byte		=0x07		os: MacOS
+>>14	byte		=0x0A		os: Tops/20
+>>14	byte		=0x0B		os: WinNT
+>>14	byte		=0x0E		os: Win32
+>9	beshort		>0x0939
+>>9	byte&0xf0	=0x00		- version 0.
+>>9	byte&0xf0	=0x10		- version 1.
+>>9	byte&0xf0	=0x20		- version 2.
+>>9	beshort&0x0fff	x		\b%03x,
+>>15	byte		1		LZO1X-1,
+>>15	byte		2		LZO1X-1(15),
+>>15	byte		3		LZO1X-999,
+## >>25	bedate		>0		last modified: %s,
+>>17	byte		=0x00		os: MS-DOS
+>>17	byte		=0x01		os: Amiga
+>>17	byte		=0x02		os: VMS
+>>17	byte		=0x03		os: Unix
+>>17	byte		=0x05		os: Atari
+>>17	byte		=0x06		os: OS/2
+>>17	byte		=0x07		os: MacOS
+>>17	byte		=0x0A		os: Tops/20
+>>17	byte		=0x0B		os: WinNT
+>>17	byte		=0x0E		os: Win32
+
+# 4.3BSD-Quasijarus Strong Compression
+# http://minnie.tuhs.org/Quasijarus/compress.html
+0	string		\037\241	Quasijarus strong compressed data
+
+# From: Cory Dikkers <cdikkers at swbell.net>
+0	string		XPKF		Amiga xpkf.library compressed data
+0	string		PP11		Power Packer 1.1 compressed data
+0	string		PP20		Power Packer 2.0 compressed data,
+>4	belong		0x09090909	fast compression
+>4	belong		0x090A0A0A	mediocre compression
+>4	belong		0x090A0B0B	good compression
+>4	belong		0x090A0C0C	very good compression
+>4	belong		0x090A0C0D	best compression
+
+# 7z archiver, from Thomas Klausner (wiz at danbala.tuwien.ac.at)
+# http://www.7-zip.org or DOC/7zFormat.txt 
+#
+0	string		7z\274\257\047\034	7z archive data,
+>6	byte		x			version %d
+>7	byte		x			\b.%d
+
+# AFX compressed files (Wolfram Kleff)
+2	string		-afx-		AFX compressed file data
+#------------------------------------------------------------------------------
+# Console game magic
+# Toby Deshane <hac at shoelace.digivill.net>
+#    ines:  file(1) magic for Marat's iNES Nintendo Entertainment System
+#           ROM dump format
+
+0 string NES\032 iNES ROM dump,
+>4 byte  x     %dx16k PRG
+>5 byte  x     \b, %dx8k CHR
+>6 byte&0x01  =0x1  \b, [Vert.]
+>6 byte&0x01  =0x0  \b, [Horiz.]
+>6 byte&0x02  =0x2  \b, [SRAM]
+>6 byte&0x04  =0x4  \b, [Trainer]
+>6 byte&0x04  =0x8  \b, [4-Scr]
+
+#------------------------------------------------------------------------------
+# gameboy:  file(1) magic for the Nintendo (Color) Gameboy raw ROM format
+#
+0x104 belong 0xCEED6666 Gameboy ROM:
+>0x134 string >\0 "%.16s"
+>0x146 byte 0x03  \b,[SGB]
+>0x147 byte 0x00  \b, [ROM ONLY]
+>0x147 byte 0x01  \b, [ROM+MBC1]
+>0x147 byte 0x02  \b, [ROM+MBC1+RAM]
+>0x147 byte 0x03  \b, [ROM+MBC1+RAM+BATT]
+>0x147 byte 0x05  \b, [ROM+MBC2]
+>0x147 byte 0x06  \b, [ROM+MBC2+BATTERY]
+>0x147 byte 0x08  \b, [ROM+RAM]
+>0x147 byte 0x09  \b, [ROM+RAM+BATTERY]
+>0x147 byte 0x0B  \b, [ROM+MMM01]
+>0x147 byte 0x0C  \b, [ROM+MMM01+SRAM]
+>0x147 byte 0x0D  \b, [ROM+MMM01+SRAM+BATT]
+>0x147 byte 0x0F  \b, [ROM+MBC3+TIMER+BATT]
+>0x147 byte 0x10  \b, [ROM+MBC3+TIMER+RAM+BATT]
+>0x147 byte 0x11  \b, [ROM+MBC3]
+>0x147 byte 0x12  \b, [ROM+MBC3+RAM]
+>0x147 byte 0x13  \b, [ROM+MBC3+RAM+BATT]
+>0x147 byte 0x19  \b, [ROM+MBC5]
+>0x147 byte 0x1A  \b, [ROM+MBC5+RAM]
+>0x147 byte 0x1B  \b, [ROM+MBC5+RAM+BATT]
+>0x147 byte 0x1C  \b, [ROM+MBC5+RUMBLE]
+>0x147 byte 0x1D  \b, [ROM+MBC5+RUMBLE+SRAM]
+>0x147 byte 0x1E  \b, [ROM+MBC5+RUMBLE+SRAM+BATT]
+>0x147 byte 0x1F  \b, [Pocket Camera]
+>0x147 byte 0xFD  \b, [Bandai TAMA5]
+>0x147 byte 0xFE  \b, [Hudson HuC-3]
+>0x147 byte 0xFF  \b, [Hudson HuC-1]
+
+>0x148 byte 0     \b, ROM: 256Kbit
+>0x148 byte 1     \b, ROM: 512Kbit
+>0x148 byte 2     \b, ROM: 1Mbit
+>0x148 byte 3     \b, ROM: 2Mbit
+>0x148 byte 4     \b, ROM: 4Mbit
+>0x148 byte 5     \b, ROM: 8Mbit
+>0x148 byte 6     \b, ROM: 16Mbit
+>0x148 byte 0x52  \b, ROM: 9Mbit
+>0x148 byte 0x53  \b, ROM: 10Mbit
+>0x148 byte 0x54  \b, ROM: 12Mbit
+
+>0x149 byte 1     \b, RAM: 16Kbit
+>0x149 byte 2     \b, RAM: 64Kbit
+>0x149 byte 3     \b, RAM: 128Kbit
+>0x149 byte 4     \b, RAM: 1Mbit
+
+#>0x14e long  x     \b, CRC: %x
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) magic for the Sega MegaDrive/Genesis raw ROM format
+#
+0x100 string SEGA  Sega MegaDrive/Genesis raw ROM dump
+>0x120 string >\0 Name: "%.16s"
+>0x110 string >\0 %.16s
+>0x1B0 string RA with SRAM
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) magic for the Super MegaDrive ROM dump format
+#
+0x280 string EAGN  Super MagicDrive ROM dump
+>0 byte x %dx16k blocks
+>2 byte 0 \b, last in series or standalone
+>2 byte >0 \b, split ROM
+>8 byte 0xAA
+>9 byte 0xBB
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) alternate magic for the Super MegaDrive ROM dump format
+#
+0x280 string EAMG  Super MagicDrive ROM dump
+>0 byte x %dx16k blocks
+>2 byte x \b, last in series or standalone
+>8 byte 0xAA
+>9 byte 0xBB
+
+#------------------------------------------------------------------------------
+# smsgg:  file(1) magic for Sega Master System and Game Gear ROM dumps
+#
+# Does not detect all images.  Very preliminary guesswork.  Need more data
+# on format.
+#
+# FIXME: need a little more info...;P
+#
+#0 byte 0xF3
+#>1 byte 0xED  Sega Master System/Game Gear ROM dump
+#>1 byte 0x31  Sega Master System/Game Gear ROM dump
+#>1 byte 0xDB  Sega Master System/Game Gear ROM dump
+#>1 byte 0xAF  Sega Master System/Game Gear ROM dump
+#>1 byte 0xC3  Sega Master System/Game Gear ROM dump
+
+#------------------------------------------------------------------------------
+# dreamcast:  file(1) uncertain magic for the Sega Dreamcast VMU image format
+#
+0 belong 0x21068028   Sega Dreamcast VMU game image
+0 string LCDi         Dream Animator file
+
+#------------------------------------------------------------------------------
+# v64: file(1) uncertain magic for the V64 format N64 ROM dumps
+#
+0 belong 0x37804012    V64 Nintendo 64 ROM dump
+
+#------------------------------------------------------------------------------
+# msx: file(1) magic for MSX game cartridge dumps
+# Too simple - MPi
+#0 beshort 0x4142 MSX game cartridge dump 
+
+#------------------------------------------------------------------------------
+# Sony Playstation executables (Adam Sjoegren <asjo at diku.dk>) :
+0	string	PS-X\ EXE	Sony Playstation executable
+#  Area:
+>113	string	x		(%s)
+
+#------------------------------------------------------------------------------
+# Microsoft Xbox executables .xbe (Esa Hyytiä <ehyytia at cc.hut.fi>)
+0       string          XBEH            XBE, Microsoft Xbox executable
+# probabilistic checks whether signed or not
+>0x0004 ulelong =0x0
+>>&2    ulelong =0x0
+>>>&2   ulelong =0x0  \b, not signed
+>0x0004 ulelong >0
+>>&2    ulelong >0
+>>>&2   ulelong >0    \b, signed
+# expect base address of 0x10000
+>0x0104               ulelong =0x10000
+>>(0x0118-0x0FF60)    ulelong&0x80000007  0x80000007 \b, all regions
+>>(0x0118-0x0FF60)    ulelong&0x80000007  !0x80000007
+>>>(0x0118-0x0FF60)   ulelong >0           (regions:
+>>>>(0x0118-0x0FF60)  ulelong &0x00000001  NA
+>>>>(0x0118-0x0FF60)  ulelong &0x00000002  Japan
+>>>>(0x0118-0x0FF60)  ulelong &0x00000004  Rest_of_World
+>>>>(0x0118-0x0FF60)  ulelong &0x80000000  Manufacturer
+>>>(0x0118-0x0FF60)   ulelong >0           \b)
+
+# --------------------------------
+# Microsoft Xbox data file formats
+0       string          XIP0            XIP, Microsoft Xbox data
+0       string          XTF0            XTF, Microsoft Xbox data
+#------------------------------------------------------------------------------
+# convex:  file(1) magic for Convex boxes
+#
+# Convexes are big-endian.
+#
+# /*\
+#  * Below are the magic numbers and tests added for Convex.
+#  * Added at beginning, because they are expected to be used most.
+# \*/
+0	belong	0507	Convex old-style object
+>16	belong	>0	not stripped
+0	belong	0513	Convex old-style demand paged executable
+>16	belong	>0	not stripped
+0	belong	0515	Convex old-style pre-paged executable
+>16	belong	>0	not stripped
+0	belong	0517	Convex old-style pre-paged, non-swapped executable
+>16	belong	>0	not stripped
+0	belong	0x011257	Core file
+#
+# The following are a series of dump format magic numbers.  Each one
+# corresponds to a drastically different dump format.  The first on is
+# the original dump format on a 4.1 BSD or earlier file system.  The
+# second marks the change between the 4.1 file system and the 4.2 file
+# system.  The Third marks the changing of the block size from 1K
+# to 2K to be compatible with an IDC file system.  The fourth indicates
+# a dump that is dependent on Convex Storage Manager, because data in
+# secondary storage is not physically contained within the dump.
+# The restore program uses these number to determine how the data is
+# to be extracted.
+#
+24	belong	=60011	dump format, 4.1 BSD or earlier
+24	belong	=60012	dump format, 4.2 or 4.3 BSD without IDC
+24	belong	=60013	dump format, 4.2 or 4.3 BSD (IDC compatible)
+24	belong	=60014	dump format, Convex Storage Manager by-reference dump
+#
+# what follows is a bunch of bit-mask checks on the flags field of the opthdr.
+# If there is no `=' sign, assume just checking for whether the bit is set?
+#
+0	belong	0601		Convex SOFF
+>88	belong&0x000f0000	=0x00000000	c1
+>88	belong			&0x00010000	c2
+>88	belong			&0x00020000	c2mp
+>88	belong			&0x00040000	parallel
+>88	belong			&0x00080000	intrinsic
+>88	belong			&0x00000001	demand paged
+>88	belong			&0x00000002	pre-paged
+>88	belong			&0x00000004	non-swapped
+>88	belong			&0x00000008	POSIX
+#
+>84	belong			&0x80000000	executable
+>84	belong			&0x40000000	object
+>84	belong&0x20000000	=0		not stripped
+>84	belong&0x18000000	=0x00000000	native fpmode
+>84	belong&0x18000000	=0x10000000	ieee fpmode
+>84	belong&0x18000000	=0x18000000	undefined fpmode
+#
+0	belong			0605		Convex SOFF core
+#
+0	belong			0607		Convex SOFF checkpoint
+>88	belong&0x000f0000	=0x00000000	c1
+>88	belong			&0x00010000	c2
+>88	belong			&0x00020000	c2mp
+>88	belong			&0x00040000	parallel
+>88	belong			&0x00080000	intrinsic
+>88	belong			&0x00000008	POSIX
+#
+>84	belong&0x18000000	=0x00000000	native fpmode
+>84	belong&0x18000000	=0x10000000	ieee fpmode
+>84	belong&0x18000000	=0x18000000	undefined fpmode
+
+# ----------------------------------------------------------------------------
+# ctags:  file (1) magic for Exuberant Ctags files
+# From: Alexander Mai <mai at migdal.ikp.physik.tu-darmstadt.de>
+0       string  !_TAG   Exuberant Ctags tag file text
+
+#------------------------------------------------------------------------------
+# dact:  file(1) magic for DACT compressed files
+#
+0	long		0x444354C3	DACT compressed data
+>4	byte		>-1		(version %i.
+>5	byte		>-1		$BS%i.
+>6	byte		>-1		$BS%i)
+>7	long		>0		$BS, original size: %i bytes
+>15	long		>30		$BS, block size: %i bytes
+
+#------------------------------------------------------------------------------
+# database:  file(1) magic for various databases
+#
+# extracted from header/code files by Graeme Wilford (eep2gw at ee.surrey.ac.uk)
+#
+#
+# GDBM magic numbers
+#  Will be maintained as part of the GDBM distribution in the future.
+#  <downsj at teeny.org>
+0	belong	0x13579ace	GNU dbm 1.x or ndbm database, big endian
+0	lelong	0x13579ace	GNU dbm 1.x or ndbm database, little endian
+0	string	GDBM		GNU dbm 2.x database
+#
+# Berkeley DB
+#
+# Ian Darwin's file /etc/magic files: big/little-endian version.
+#
+# Hash 1.85/1.86 databases store metadata in network byte order.
+# Btree 1.85/1.86 databases store the metadata in host byte order.
+# Hash and Btree 2.X and later databases store the metadata in host byte order.
+
+0	long	0x00061561	Berkeley DB
+>8	belong	4321
+>>4	belong	>2		1.86
+>>4	belong	<3		1.85
+>>4	belong	>0		(Hash, version %d, native byte-order)
+>8	belong	1234
+>>4	belong	>2		1.86
+>>4	belong	<3		1.85
+>>4	belong	>0		(Hash, version %d, little-endian)
+
+0	belong	0x00061561	Berkeley DB
+>8	belong	4321
+>>4	belong	>2		1.86
+>>4	belong	<3		1.85
+>>4	belong	>0		(Hash, version %d, big-endian)
+>8	belong	1234
+>>4	belong	>2		1.86
+>>4	belong	<3		1.85
+>>4	belong	>0		(Hash, version %d, native byte-order)
+
+0	long	0x00053162	Berkeley DB 1.85/1.86
+>4	long	>0		(Btree, version %d, native byte-order)
+0	belong	0x00053162	Berkeley DB 1.85/1.86
+>4	belong	>0		(Btree, version %d, big-endian)
+0	lelong	0x00053162	Berkeley DB 1.85/1.86
+>4	lelong	>0		(Btree, version %d, little-endian)
+
+12	long	0x00061561	Berkeley DB
+>16	long	>0		(Hash, version %d, native byte-order)
+12	belong	0x00061561	Berkeley DB
+>16	belong	>0		(Hash, version %d, big-endian)
+12	lelong	0x00061561	Berkeley DB
+>16	lelong	>0		(Hash, version %d, little-endian)
+
+12	long	0x00053162	Berkeley DB
+>16	long	>0		(Btree, version %d, native byte-order)
+12	belong	0x00053162	Berkeley DB
+>16	belong	>0		(Btree, version %d, big-endian)
+12	lelong	0x00053162	Berkeley DB
+>16	lelong	>0		(Btree, version %d, little-endian)
+
+12	long	0x00042253	Berkeley DB
+>16	long	>0		(Queue, version %d, native byte-order)
+12	belong	0x00042253	Berkeley DB
+>16	belong	>0		(Queue, version %d, big-endian)
+12	lelong	0x00042253	Berkeley DB
+>16	lelong	>0		(Queue, version %d, little-endian)
+#
+#
+# Round Robin Database Tool by Tobias Oetiker <oetiker at ee.ethz.ch>
+0	string	RRD		RRDTool DB
+>4	string	x		version %s
+#----------------------------------------------------------------------
+# ROOT: file(1) magic for ROOT databases
+#
+0       string  root\0  ROOT file
+>4      belong  x       Version %d
+>33     belong  x       (Compression: %d)
+
+# XXX: Weak magic.
+# Alex Ott <ott at jet.msk.su>
+## Paradox file formats
+#2	  leshort	0x0800	Paradox 
+#>0x39	  byte		3	v. 3.0 
+#>0x39	  byte		4	v. 3.5 
+#>0x39	  byte		9	v. 4.x 
+#>0x39	  byte		10	v. 5.x 
+#>0x39	  byte		11	v. 5.x 
+#>0x39	  byte		12	v. 7.x 
+#>>0x04	  byte		0	indexed .DB data file 
+#>>0x04	  byte		1	primary index .PX file 
+#>>0x04	  byte		2	non-indexed .DB data file 
+#>>0x04	  byte		3	non-incrementing secondary index .Xnn file 
+#>>0x04	  byte		4	secondary index .Ynn file 
+#>>0x04	  byte		5	incrementing secondary index .Xnn file 
+#>>0x04	  byte		6	non-incrementing secondary index .XGn file 
+#>>0x04	  byte		7	secondary index .YGn file 
+#>>>0x04	  byte		8	incrementing secondary index .XGn file 
+## XBase database files
+#0      byte       0x02	
+#>8     leshort	  >0
+#>>12   leshort    0	FoxBase 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x03	
+#>8     leshort	  >0
+#>>12   leshort    0	FoxBase+, FoxPro, dBaseIII+, dBaseIV, no memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x04	
+#>8     leshort	  >0
+#>>12   leshort    0	dBASE IV no memo file 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x05	
+#>8     leshort	  >0
+#>>12   leshort    0	dBASE V no memo file 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x30
+#>8     leshort	  >0
+#>>12   leshort    0	Visual FoxPro 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x43
+#>8     leshort	  >0
+#>>12   leshort    0	FlagShip with memo var size 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x7b
+#>8     leshort	  >0
+#>>12   leshort    0	dBASEIV with memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x83	
+#>8     leshort	  >0
+#>>12   leshort    0	FoxBase+, dBaseIII+ with memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x8b
+#>8     leshort	  >0
+#>>12   leshort    0	dBaseIV with memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0x8e	
+#>8     leshort	  >0
+#>>12   leshort    0	dBaseIV with SQL Table 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0xb3
+#>8     leshort	  >0
+#>>12   leshort    0	FlagShip with .dbt memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0      byte       0xf5
+#>8     leshort	  >0
+#>>12   leshort    0	FoxPro with memo 
+#>>>0x04	lelong		0		(no records)
+#>>>0x04	lelong		>0		(%ld records)
+#
+#0	leshort		0x0006		DBase 3 index file
+
+# MS Access database
+4	  string	Standard\ Jet\ DB	Microsoft Access Database
+
+# TDB database from Samba et al - Martin Pool <mbp at samba.org>
+0	string	TDB\ file		TDB database
+>32	lelong	0x2601196D		version 6, little-endian
+>>36	lelong	x			hash size %d bytes
+
+# SE Linux policy database
+0       lelong  0xf97cff8c      SE Linux policy
+>16     lelong  x               v%d
+>20     lelong  1      MLS
+>24     lelong  x       %d symbols
+>28     lelong  x       %d ocons
+
+# ICE authority file data (Wolfram Kleff)
+2	string		ICE		ICE authority data
+
+# X11 Xauthority file (Wolfram Kleff)
+10	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+11	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+12	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+13	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+14	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+15	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+16	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+17	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+18	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+
+#------------------------------------------------------------------------------
+# diamond:  file(1) magic for Diamond system
+#
+# ... diamond is a multi-media mail and electronic conferencing system....
+#
+# XXX - I think it was either renamed Slate, or replaced by Slate....
+#
+#	The full deal is too long...
+#0	string	<list>\n<protocol\ bbn-multimedia-format>	Diamond Multimedia Document
+0	string	=<list>\n<protocol\ bbn-m	Diamond Multimedia Document
+
+#------------------------------------------------------------------------------
+# diff:  file(1) magic for diff(1) output
+#
+0	string		diff\ 	'diff' output text
+0	string		***\ 		'diff' output text
+0	string		Only\ in\ 	'diff' output text
+0	string		Common\ subdirectories:\ 	'diff' output text
+
+# xdelta is like diff(1) for binary files (works for text, too).
+# Available from: ftp://ftp.xcf.berkeley.edu/pub/xdelta/
+0       string          %XDZ            xdelta diff file
+>4      string          >%              version %.3s
+#  Digital UNIX - Info
+#
+0	string	!<arch>\n________64E	Alpha archive
+>22	string	X			-- out of date
+#
+# Alpha COFF Based Executables
+# The stripped stuff really needs to be an 8 byte (64 bit) compare,
+# but this works
+0	leshort		0x183		COFF format alpha
+>22	leshort&020000	&010000		sharable library,
+>22	leshort&020000	^010000		dynamically linked,
+>24	leshort		0410		pure
+>24	leshort		0413		demand paged
+>8	lelong		>0		executable or object module, not stripped
+>8	lelong		0
+>>12	lelong		0		executable or object module, stripped
+>>12	lelong		>0		executable or object module, not stripped
+>27     byte            >0              - version %d.
+>26     byte            >0              %d-
+>28     leshort         >0              %d
+#
+# The next is incomplete, we could tell more about this format,
+# but its not worth it.
+0	leshort		0x188	Alpha compressed COFF
+0	leshort		0x18f	Alpha u-code object
+#
+#
+# Some other interesting Digital formats,
+0	string	\377\377\177		ddis/ddif
+0	string	\377\377\174		ddis/dots archive
+0	string	\377\377\176		ddis/dtif table data
+0	string	\033c\033		LN03 output
+0	long	04553207		X image
+#
+0	string	!<PDF>!\n		profiling data file
+#
+# Locale data tables (MIPS and Alpha).
+#
+0	short		0x0501		locale data table
+>6	short		0x24		for MIPS
+>6	short		0x40		for Alpha
+# ATSC A/53 aka AC-3 aka Dolby Digital <ashitaka at gmx.at>
+# from http://www.atsc.org/standards/a_52a.pdf
+# corrections, additions, etc. are always welcome!
+#
+# syncword
+0       beshort         0x0b77  ATSC A/52 aka AC-3 aka Dolby Digital stream,
+# fscod
+>4      byte&0xc0       0x00    48 kHz,
+>4      byte&0xc0       0x40    44.1 kHz,
+>4      byte&0xc0       0x80    32 kHz,
+# is this one used for 96 kHz?
+>4      byte&0xc0       0xc0    reserved frequency,
+#
+>5	byte&7 = 0		\b, complete main (CM)
+>5	byte&7 = 1		\b, music and effects (ME)
+>5	byte&7 = 2		\b, visually impaired (VI)
+>5	byte&7 = 3		\b, hearing impaired (HI)
+>5	byte&7 = 4		\b, dialogue (D)
+>5	byte&7 = 5		\b, commentary (C)
+>5	byte&7 = 6		\b, emergency (E)
+# acmod
+>6      byte&0xe0       0x00    1+1 front,
+>6      byte&0xe0       0x20    1 front/0 rear,
+>6      byte&0xe0       0x40    2 front/0 rear,
+>6      byte&0xe0       0x60    3 front/0 rear,
+>6      byte&0xe0       0x80    2 front/1 rear,
+>6      byte&0xe0       0xa0    3 front/1 rear,
+>6      byte&0xe0       0xc0    2 front/2 rear,
+>6      byte&0xe0       0xe0    3 front/2 rear,
+# lfeon (these may be incorrect)
+>7      byte&0x40       0x00    LFE off,
+>7      byte&0x40       0x40    LFE on,
+#
+>4	byte&0x3e = 0x00	\b, 32 kbit/s
+>4	byte&0x3e = 0x02        \b, 40 kbit/s
+>4	byte&0x3e = 0x04        \b, 48 kbit/s
+>4	byte&0x3e = 0x06        \b, 56 kbit/s
+>4	byte&0x3e = 0x08        \b, 64 kbit/s
+>4	byte&0x3e = 0x0a        \b, 80 kbit/s
+>4	byte&0x3e = 0x0c        \b, 96 kbit/s
+>4	byte&0x3e = 0x0e        \b, 112 kbit/s
+>4	byte&0x3e = 0x10        \b, 128 kbit/s
+>4	byte&0x3e = 0x12        \b, 160 kbit/s
+>4	byte&0x3e = 0x14        \b, 192 kbit/s
+>4	byte&0x3e = 0x16        \b, 224 kbit/s
+>4	byte&0x3e = 0x18        \b, 256 kbit/s
+>4	byte&0x3e = 0x1a        \b, 320 kbit/s
+>4	byte&0x3e = 0x1c        \b, 384 kbit/s
+>4	byte&0x3e = 0x1e        \b, 448 kbit/s
+>4	byte&0x3e = 0x20        \b, 512 kbit/s
+>4	byte&0x3e = 0x22        \b, 576 kbit/s
+>4	byte&0x3e = 0x24        \b, 640 kbit/s
+# dsurmod (these may be incorrect)
+>6      beshort&0x0180  0x0000  Dolby Surround not indicated
+>6      beshort&0x0180  0x0080  not Dolby Surround encoded
+>6      beshort&0x0180  0x0100  Dolby Surround encoded
+>6      beshort&0x0180  0x0180  reserved Dolby Surround mode
+
+#------------------------------------------------------------------------------
+# dump:  file(1) magic for dump file format--for new and old dump filesystems
+#
+# We specify both byte orders in order to recognize byte-swapped dumps.
+#
+24	belong	60012		new-fs dump file (big endian),
+>4	bedate	x		Previous dump %s,
+>8	bedate	x		This dump %s,
+>12	belong	>0		Volume %ld,
+>692	belong	0		Level zero, type:
+>692	belong	>0		Level %d, type:
+>0	belong	1		tape header,
+>0	belong	2		beginning of file record,
+>0	belong	3		map of inodes on tape,
+>0	belong	4		continuation of file record,
+>0	belong	5		end of volume,
+>0	belong	6		map of inodes deleted,
+>0	belong	7		end of medium (for floppy),
+>676	string	>\0		Label %s,
+>696	string	>\0		Filesystem %s,
+>760	string	>\0		Device %s,
+>824	string	>\0		Host %s,
+>888	belong	>0		Flags %x
+
+24	belong	60011		old-fs dump file (big endian),
+#>4	bedate	x		Previous dump %s,
+#>8	bedate	x		This dump %s,
+>12	belong	>0		Volume %ld,
+>692	belong	0		Level zero, type:
+>692	belong	>0		Level %d, type:
+>0	belong	1		tape header,
+>0	belong	2		beginning of file record,
+>0	belong	3		map of inodes on tape,
+>0	belong	4		continuation of file record,
+>0	belong	5		end of volume,
+>0	belong	6		map of inodes deleted,
+>0	belong	7		end of medium (for floppy),
+>676	string	>\0		Label %s,
+>696	string	>\0		Filesystem %s,
+>760	string	>\0		Device %s,
+>824	string	>\0		Host %s,
+>888	belong	>0		Flags %x
+
+24	lelong	60012		new-fs dump file (little endian),
+>4	ledate	x		This dump %s,
+>8	ledate	x		Previous dump %s,
+>12	lelong	>0		Volume %ld,
+>692	lelong	0		Level zero, type:
+>692	lelong	>0		Level %d, type:
+>0	lelong	1		tape header,
+>0	lelong	2		beginning of file record,
+>0	lelong	3		map of inodes on tape,
+>0	lelong	4		continuation of file record,
+>0	lelong	5		end of volume,
+>0	lelong	6		map of inodes deleted,
+>0	lelong	7		end of medium (for floppy),
+>676	string	>\0		Label %s,
+>696	string	>\0		Filesystem %s,
+>760	string	>\0		Device %s,
+>824	string	>\0		Host %s,
+>888	lelong	>0		Flags %x
+
+24	lelong	60011		old-fs dump file (little endian),
+#>4	ledate	x		Previous dump %s,
+#>8	ledate	x		This dump %s,
+>12	lelong	>0		Volume %ld,
+>692	lelong	0		Level zero, type:
+>692	lelong	>0		Level %d, type:
+>0	lelong	1		tape header,
+>0	lelong	2		beginning of file record,
+>0	lelong	3		map of inodes on tape,
+>0	lelong	4		continuation of file record,
+>0	lelong	5		end of volume,
+>0	lelong	6		map of inodes deleted,
+>0	lelong	7		end of medium (for floppy),
+>676	string	>\0		Label %s,
+>696	string	>\0		Filesystem %s,
+>760	string	>\0		Device %s,
+>824	string	>\0		Host %s,
+>888	lelong	>0		Flags %x
+
+#------------------------------------------------------------------------------
+# Dyadic: file(1) magic for Dyalog APL.
+#
+0 	byte	0xaa
+>1	byte	<4		Dyalog APL
+>>1	byte	0x00		incomplete workspace
+>>1	byte	0x01		component file
+>>1	byte	0x02		external variable
+>>1	byte	0x03		workspace
+>>2	byte	x		version %d
+>>3	byte	x		.%d
+
+#------------------------------------------------------------------------------
+# T602 editor documents 
+# by David Necas <yeti at physics.muni.cz>
+0	string	@CT\ 	T602 document data,
+>4	string	0	Kamenicky
+>4	string	1	CP 852
+>4	string	2	KOI8-CS
+>4	string	>2	unknown encoding
+
+# Vi IMproved Encrypted file 
+# by David Necas <yeti at physics.muni.cz>
+0	string	VimCrypt~	Vim encrypted file data
+
+#------------------------------------------------------------------------------
+# elf:  file(1) magic for ELF executables
+#
+# We have to check the byte order flag to see what byte order all the
+# other stuff in the header is in.
+#
+# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
+#
+# updated by Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		\177ELF		ELF
+>4	byte		0		invalid class
+>4	byte		1		32-bit
+# only for MIPS - in the future, the ABI field of e_flags should be used.
+>>18	leshort		8
+>>>36	lelong		&0x20		N32
+>>18	leshort		10
+>>>36	lelong		&0x20		N32
+>>18	beshort		8
+>>>36	belong		&0x20		N32
+>>18	beshort		10
+>>>36	belong		&0x20		N32
+>4	byte		2		64-bit
+>5	byte		0		invalid byte order
+>5	byte		1		LSB
+# The official e_machine number for MIPS is now #8, regardless of endianness.
+# The second number (#10) will be deprecated later. For now, we still
+# say something if #10 is encountered, but only gory details for #8.
+>>18    leshort		8
+# only for 32-bit
+>>>4	byte		1
+>>>>36  lelong&0xf0000000	0x00000000	MIPS-I
+>>>>36  lelong&0xf0000000	0x10000000	MIPS-II
+>>>>36  lelong&0xf0000000	0x20000000	MIPS-III
+>>>>36  lelong&0xf0000000	0x30000000	MIPS-IV
+>>>>36  lelong&0xf0000000	0x40000000	MIPS-V
+>>>>36  lelong&0xf0000000	0x60000000	MIPS32
+>>>>36  lelong&0xf0000000	0x70000000	MIPS64
+>>>>36  lelong&0xf0000000	0x80000000	MIPS32 rel2
+>>>>36  lelong&0xf0000000	0x90000000	MIPS64 rel2
+# only for 64-bit
+>>>4	byte		2
+>>>>48  lelong&0xf0000000	0x00000000	MIPS-I
+>>>>48  lelong&0xf0000000	0x10000000	MIPS-II
+>>>>48  lelong&0xf0000000	0x20000000	MIPS-III
+>>>>48  lelong&0xf0000000	0x30000000	MIPS-IV
+>>>>48  lelong&0xf0000000	0x40000000	MIPS-V
+>>>>48  lelong&0xf0000000	0x60000000	MIPS32
+>>>>48  lelong&0xf0000000	0x70000000	MIPS64 
+>>>>48  lelong&0xf0000000	0x80000000	MIPS32 rel2
+>>>>48  lelong&0xf0000000	0x90000000	MIPS64 rel2
+>>16	leshort		0		no file type,
+>>16	leshort		1		relocatable,
+>>16	leshort		2		executable,
+>>16	leshort		3		shared object,
+# Core handling from Peter Tobias <tobias at server.et-inf.fho-emden.de>
+# corrections by Christian 'Dr. Disk' Hechelmann <drdisk at ds9.au.s.shuttle.de>
+>>16	leshort		4		core file
+# Core file detection is not reliable.
+#>>>(0x38+0xcc) string	>\0		of '%s'
+#>>>(0x38+0x10) lelong	>0		(signal %d),
+>>16	leshort		&0xff00		processor-specific,
+>>18	leshort		0		no machine,
+>>18	leshort		1		AT&T WE32100 - invalid byte order,
+>>18	leshort		2		SPARC - invalid byte order,
+>>18	leshort		3		Intel 80386,
+>>18	leshort		4		Motorola
+>>>36	lelong		&0x01000000	68000 - invalid byte order,
+>>>36	lelong		&0x00810000	CPU32 - invalid byte order,
+>>>36	lelong		0		68020 - invalid byte order,
+>>18	leshort		5		Motorola 88000 - invalid byte order,
+>>18	leshort		6		Intel 80486,
+>>18	leshort		7		Intel 80860,
+>>18	leshort		8		MIPS,
+>>18	leshort		9		Amdahl - invalid byte order,
+>>18	leshort		10		MIPS (deprecated),
+>>18	leshort		11		RS6000 - invalid byte order,
+>>18	leshort		15		PA-RISC - invalid byte order,
+>>>50	leshort		0x0214		2.0
+>>>48	leshort		&0x0008		(LP64),
+>>18	leshort		16		nCUBE,
+>>18	leshort		17		Fujitsu VPP500,
+>>18	leshort		18		SPARC32PLUS,
+>>18	leshort		20		PowerPC,
+>>18	leshort		22		IBM S/390,
+>>18	leshort		36		NEC V800,
+>>18	leshort		37		Fujitsu FR20,
+>>18	leshort		38		TRW RH-32,
+>>18	leshort		39		Motorola RCE,
+>>18	leshort		40		ARM,
+>>18	leshort		41		Alpha,
+>>18	leshort		0xa390		IBM S/390 (obsolete),
+>>18	leshort		42		Hitachi SH,
+>>18	leshort		43		SPARC V9 - invalid byte order,
+>>18	leshort		44		Siemens Tricore Embedded Processor,
+>>18	leshort		45		Argonaut RISC Core, Argonaut Technologies Inc.,
+>>18	leshort		46		Hitachi H8/300,
+>>18	leshort		47		Hitachi H8/300H,
+>>18	leshort		48		Hitachi H8S,
+>>18	leshort		49		Hitachi H8/500,
+>>18	leshort		50		IA-64 (Intel 64 bit architecture),
+>>18	leshort		51		Stanford MIPS-X,
+>>18	leshort		52		Motorola Coldfire,
+>>18	leshort		53		Motorola M68HC12,
+>>18	leshort		62		AMD x86-64,
+>>18	leshort		75		Digital VAX,
+>>18	leshort		97		NatSemi 32k,
+>>18	leshort		0x9026		Alpha (unofficial),
+>>20	lelong		0		invalid version
+>>20	lelong		1		version 1
+>>36	lelong		1		MathCoPro/FPU/MAU Required
+>5	byte		2		MSB
+# only for MIPS - see comment in little-endian section above.
+>>18    beshort		8
+# only for 32-bit
+>>>4	byte		1
+>>>>36  belong&0xf0000000	0x00000000	MIPS-I
+>>>>36  belong&0xf0000000	0x10000000	MIPS-II
+>>>>36  belong&0xf0000000	0x20000000	MIPS-III
+>>>>36  belong&0xf0000000	0x30000000	MIPS-IV
+>>>>36  belong&0xf0000000	0x40000000	MIPS-V
+>>>>36  belong&0xf0000000	0x60000000	MIPS32
+>>>>36  belong&0xf0000000	0x70000000	MIPS64
+>>>>36  belong&0xf0000000	0x80000000	MIPS32 rel2
+>>>>36  belong&0xf0000000	0x90000000	MIPS64 rel2
+# only for 64-bit
+>>>4	byte		2
+>>>>48	belong&0xf0000000	0x00000000	MIPS-I
+>>>>48	belong&0xf0000000	0x10000000	MIPS-II
+>>>>48	belong&0xf0000000	0x20000000	MIPS-III
+>>>>48	belong&0xf0000000	0x30000000	MIPS-IV
+>>>>48	belong&0xf0000000	0x40000000	MIPS-V
+>>>>48	belong&0xf0000000	0x60000000	MIPS32
+>>>>48	belong&0xf0000000	0x70000000	MIPS64 
+>>>>48	belong&0xf0000000	0x80000000	MIPS32 rel2
+>>>>48	belong&0xf0000000	0x90000000	MIPS64 rel2
+>>16	beshort		0		no file type,
+>>16	beshort		1		relocatable,
+>>16	beshort		2		executable,
+>>16	beshort		3		shared object,
+>>16	beshort		4		core file,
+#>>>(0x38+0xcc) string	>\0		of '%s'
+#>>>(0x38+0x10) belong	>0		(signal %d),
+>>16	beshort		&0xff00		processor-specific,
+>>18	beshort		0		no machine,
+>>18	beshort		1		AT&T WE32100,
+>>18	beshort		2		SPARC,
+>>18	beshort		3		Intel 80386 - invalid byte order,
+>>18	beshort		4		Motorola
+>>>36	belong		&0x01000000	68000,
+>>>36	belong		&0x00810000	CPU32,
+>>>36	belong		0		68020,
+>>18	beshort		5		Motorola 88000,
+>>18	beshort		6		Intel 80486 - invalid byte order,
+>>18	beshort		7		Intel 80860,
+>>18	beshort		8		MIPS,
+>>18	beshort		9		Amdahl,
+>>18	beshort		10		MIPS (deprecated),
+>>18	beshort		11		RS6000,
+>>18	beshort		15		PA-RISC
+>>>50	beshort		0x0214		2.0
+>>>48	beshort		&0x0008		(LP64)
+>>18	beshort		16		nCUBE,
+>>18	beshort		17		Fujitsu VPP500,
+>>18	beshort		18		SPARC32PLUS,
+>>>36	belong&0xffff00	&0x000100	V8+ Required,
+>>>36	belong&0xffff00	&0x000200	Sun UltraSPARC1 Extensions Required,
+>>>36	belong&0xffff00	&0x000400	HaL R1 Extensions Required,
+>>>36	belong&0xffff00	&0x000800	Sun UltraSPARC3 Extensions Required,
+>>18	beshort		20		PowerPC or cisco 4500,
+>>18	beshort		21		cisco 7500,
+>>18	beshort		22		IBM S/390,
+>>18	beshort		24		cisco SVIP,
+>>18	beshort		25		cisco 7200,
+>>18	beshort		36		NEC V800 or cisco 12000,
+>>18	beshort		37		Fujitsu FR20,
+>>18	beshort		38		TRW RH-32,
+>>18	beshort		39		Motorola RCE,
+>>18	beshort		40		ARM,
+>>18	beshort		41		Alpha,
+>>18	beshort		42		Hitachi SH,
+>>18	beshort		43		SPARC V9,
+>>18	beshort		44		Siemens Tricore Embedded Processor,
+>>18	beshort		45		Argonaut RISC Core, Argonaut Technologies Inc.,
+>>18	beshort		46		Hitachi H8/300,
+>>18	beshort		47		Hitachi H8/300H,
+>>18	beshort		48		Hitachi H8S,
+>>18	beshort		49		Hitachi H8/500,
+>>18	beshort		50		IA-64 (Intel 64 bit architecture),
+>>18	beshort		51		Stanford MIPS-X,
+>>18	beshort		52		Motorola Coldfire,
+>>18	beshort		53		Motorola M68HC12,
+>>18	beshort		73		Cray NV1,
+>>18	beshort		75		Digital VAX,
+>>18	beshort		97		NatSemi 32k,
+>>18	beshort		0x9026		Alpha (unofficial),
+>>18	beshort		0xa390		IBM S/390 (obsolete),
+>>20	belong		0		invalid version
+>>20	belong		1		version 1
+>>36	belong		1		MathCoPro/FPU/MAU Required
+# Up to now only 0, 1 and 2 are defined; I've seen a file with 0x83, it seemed
+# like proper ELF, but extracting the string had bad results.
+>4      byte            <0x80
+>>8	string		>\0		(%s)
+>8	string		\0
+>>7	byte		0		(SYSV)
+>>7	byte		1		(HP-UX)
+>>7	byte		2		(NetBSD)
+>>7	byte		3		(GNU/Linux)
+>>7	byte		4		(GNU/Hurd)
+>>7	byte		5		(86Open)
+>>7	byte		6		(Solaris)
+>>7	byte		7		(Monterey)
+>>7	byte		8		(IRIX)
+>>7	byte		9		(FreeBSD)
+>>7	byte		10		(Tru64)
+>>7	byte		11		(Novell Modesto)
+>>7	byte		12		(OpenBSD)
+>>7	byte		97		(ARM)
+>>7	byte		255		(embedded)
+
+#------------------------------------------------------------------------------
+# encore:  file(1) magic for Encore machines
+#
+# XXX - needs to have the byte order specified (NS32K was little-endian,
+# dunno whether they run the 88K in little-endian mode or not).
+#
+0	short		0x154		Encore
+>20	short		0x107		executable
+>20	short		0x108		pure executable
+>20	short		0x10b		demand-paged executable
+>20	short		0x10f		unsupported executable
+>12	long		>0		not stripped
+>22	short		>0		- version %ld
+>22	short		0		-
+#>4	date		x		stamp %s
+0	short		0x155		Encore unsupported executable
+>12	long		>0		not stripped
+>22	short		>0		- version %ld
+>22	short		0		-
+#>4	date		x		stamp %s
+
+#------------------------------------------------------------------------------
+# Epoc 32 : file(1) magic for Epoc Documents [psion/osaris
+# Stefan Praszalowicz (hpicollo at worldnet.fr)
+#0	lelong		0x10000037	Epoc32
+>4	lelong		0x1000006D
+>>8	lelong		0x1000007F	Word
+>>8	lelong		0x10000088	Sheet
+>>8	lelong		0x1000007D	Sketch
+>>8	lelong		0x10000085	TextEd
+
+#------------------------------------------------------------------------------
+# fcs: file(1) magic for FCS (Flow Cytometry Standard) data files
+# From Roger Leigh <roger at whinlatter.uklinux.net>
+0       string          FCS1.0          Flow Cytometry Standard (FCS) data, version 1.0
+0       string          FCS2.0          Flow Cytometry Standard (FCS) data, version 2.0
+0       string          FCS3.0          Flow Cytometry Standard (FCS) data, version 3.0
+
+#------------------------------------------------------------------------------
+# lxkernel: file(1) magic for Linux/i386 Kernel
+# compiled Linux-kernel submitted by Hans Lermen lermen at elserv.ffm.fgan.de
+0x202			string		HdrS		Linux
+>0x1fe			leshort		0xAA55		\b/x86 Kernel
+>0x1fe			leshort		<0xAA55		Kernel
+>0x1fe			leshort		>0xAA55		Kernel
+>0x206			leshort		0x0105		\b, Setup Version 0x105, zImage
+>0x206			leshort		>0x0105		\b, Setup Version %#hx
+>>0x211			byte		0		\b, zImage
+>>0x211			byte		1		\b, bzImage
+>>>(0x20e.s+0x205)	byte		32
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %5.5s
+>>>(0x20e.s+0x206)	byte		32
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %6.6s
+>>>(0x20e.s+0x207)	byte		32
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %7.7s
+>>>(0x20e.s+0x205)	byte		45
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %s
+>>>(0x20e.s+0x206)	byte		45
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %s
+>>>(0x20e.s+0x207)	byte		45
+>>>>(0x20e.s+0x200)	string		>\0		\b, Version %s
+>>0x1f2			leshort		1		\b, RO-rootFS
+>>0x1f2			leshort		0		\b, RW-rootFS
+>>0x1fc			leshort		>0		\b, root_dev 0x%X
+>>0x1f6			leshort		>0		\b, swap_dev 0x%X
+>>0x1f8			leshort		>0		\b, RAMdisksize %u KB
+>>0x1fa			leshort		0xFFFF		\b, Normal VGA
+>>0x1fa			leshort		0xFFFE		\b, Extended VGA
+>>0x1fa			leshort		0xFFFD		\b, Prompt for Videomode
+>>0x1fa			leshort		>0		\b, Video mode %d
+
+0x1e3			string		Loading		Linux/i386 Kernel zImage
+
+#------------------------------------------------------------------------------
+# filesystems:  file(1) magic for different filesystems
+#
+0	string	\366\366\366\366	PC formatted floppy with no filesystem
+# Sun disk labels
+# From /usr/include/sun/dklabel.h:
+0774	beshort		0xdabe		Sun disk label
+>0	string		x		'%s
+>>31  	string		>\0		\b%s
+>>>63  	string		>\0		\b%s
+>>>>95 	string		>\0		\b%s
+>0	string		x		\b'
+>0734	short		>0		%d rpm,
+>0736	short		>0		%d phys cys,
+>0740	short		>0		%d alts/cyl,
+>0746	short		>0		%d interleave,
+>0750	short		>0		%d data cyls,
+>0752	short		>0		%d alt cyls,
+>0754	short		>0		%d heads/partition,
+>0756	short		>0		%d sectors/track,
+>0764	long		>0		start cyl %ld,
+>0770	long		x		%ld blocks
+# Is there a boot block written 1 sector in?
+>512    belong&077777777	0600407	\b, boot block present
+0x1FE	leshort	0xAA55			x86 boot sector
+>2	string	OSBS			\b, OS/BS MBR
+# J\xf6rg Jenderek <joerg.jenderek at gmx.net>
+>0x8C	string	Invalid\ partition\ table	\b, MS-DOS MBR
+>0x9D	string	Invalid\ partition\ table	\b, DR-DOS MBR, version 7.01 to 7.03
+>0x10F	string	Ung\201ltige\ Partitionstabelle	\b, MS-DOS MBR, german version 4.10.1998, 4.10.2222
+>0x8B	string	Ung\201ltige\ Partitionstabelle	\b, MS-DOS MBR, german version 5.00 to 4.00.950
+>0x145	string	Default:\ F			\b, FREE-DOS MBR
+>0	string	\0\0\0\0		\b, extended partition table
+# JuMP short     bootcodeoffset NOP assembler instructions will usually be EB xx 90
+# older drives may use E9 xx xx
+>0		lelong&0x009000EB	0x009000EB 
+>0		lelong&0x000000E9	0x000000E9 
+>>1		ubyte			>37	\b, code offset 0x%x
+# mtools-3.9.8/msdos.h
+# usual values are marked with comments to get only informations of strange FAT systems
+# valid sectorsize are from 32 to 2048
+>>>11		uleshort	<2049	
+>>>>11		uleshort	>31	
+>>>>>3		string		>\0		\b, OEM-ID "%8.8s"
+>>>>>11		uleshort	>512		\b, Bytes/sector %u
+#>>>>>11	uleshort	=512		\b, Bytes/sector %u=512 (usual)
+>>>>>11		uleshort	<512		\b, Bytes/sector %u
+>>>>>13		ubyte		>1		\b, sectors/cluster %u
+#>>>>>13	ubyte		=1		\b, sectors/cluster %u (usual on Floppies)
+>>>>>14		uleshort	>32		\b, reserved sectors %u
+#>>>>>14	uleshort	=32		\b, reserved sectors %u (usual Fat32)
+#>>>>>14	uleshort	>1		\b, reserved sectors %u
+#>>>>>14	uleshort	=1		\b, reserved sectors %u (usual FAT12,FAT16)
+>>>>>14		uleshort	<1		\b, reserved sectors %u
+>>>>>16		ubyte		>2		\b, FATs %u
+#>>>>>16	ubyte		=2		\b, FATs %u (usual)
+>>>>>16		ubyte		=1		\b, FAT  %u
+>>>>>16		ubyte		>0
+>>>>>17		uleshort	>0		\b, root entries %u
+#>>>>>17	uleshort	=0		\b, root entries %u=0 (usual Fat32)
+>>>>>19		uleshort	>0		\b, sectors %u (volumes <=32 MB) 
+#>>>>>19	uleshort	=0		\b, sectors %u=0 (usual Fat32)
+>>>>>21		ubyte		>0xF0		\b, Media descriptor 0x%x
+#>>>>>21	ubyte		=0xF0		\b, Media descriptor 0x%x (usual floppy)
+>>>>>21		ubyte		<0xF0		\b, Media descriptor 0x%x
+>>>>>22		uleshort	>0		\b, sectors/FAT %u
+#>>>>>22	uleshort	=0		\b, sectors/FAT %u=0 (usual Fat32)
+>>>>>26		ubyte		>2		\b, heads %u
+#>>>>>26	ubyte		=2		\b, heads %u (usual floppy)
+>>>>>26		ubyte		=1		\b, heads %u
+>>>>>28		ulelong		>0		\b, hidden sectors %u
+#>>>>>28	ulelong		=0		\b, hidden sectors %u (usual floppy)
+>>>>>32		ulelong		>0		\b, sectors %u (volumes > 32 MB) 
+#>>>>>32	ulelong		=0		\b, sectors %u (volumes > 32 MB) 
+# FAT<32 specific 
+# NOT le FAT3=NOT 3TAF=0xCCABBEB9
+>>>>>82		ulelong&0xCCABBEB9	>0
+>>>>>>36	ubyte		>0x80		\b, physical drive 0x%x
+#>>>>>>36	ubyte		=0x80		\b, physical drive 0x%x=0x80 (usual harddisk)
+>>>>>>36	ubyte&0x7F	>0		\b, physical drive 0x%x
+#>>>>>>36	ubyte		=0		\b, physical drive 0x%x=0 (usual floppy)
+>>>>>>37	ubyte		>0		\b, reserved 0x%x
+#>>>>>>37	ubyte		=0		\b, reserved 0x%x
+>>>>>>38	ubyte		>0x29		\b, dos < 4.0 BootSector (0x%x)
+>>>>>>38	ubyte		<0x29		\b, dos < 4.0 BootSector (0x%x)
+>>>>>>38	ubyte		=0x29
+>>>>>>>39	ulelong		x		\b, serial number 0x%x
+>>>>>>>43	string		<NO\ NAME	\b, label: "%11.11s"
+>>>>>>>43	string		>NO\ NAME	\b, label: "%11.11s"
+>>>>>>>43	string		=NO\ NAME	\b, unlabeled
+>>>>>>54	string		FAT1		\b, FAT
+>>>>>>>54	string		FAT12		\b (12 bit)
+>>>>>>>54	string		FAT16		\b (16 bit)
+# FAT32 specific
+>>>>>82		string		FAT32		\b, FAT (32 bit)
+>>>>>>36	ulelong		x		\b, sectors/FAT %u
+>>>>>>40	uleshort	>0		\b, extension flags %u
+#>>>>>>40	uleshort	=0		\b, extension flags %u
+>>>>>>42	uleshort	>0		\b, fsVersion %u
+#>>>>>>42	uleshort	=0		\b, fsVersion %u (usual)
+>>>>>>44	ulelong		>2		\b, rootdir cluster %u
+#>>>>>>44	ulelong		=2		\b, rootdir cluster %u
+#>>>>>>44	ulelong		=1		\b, rootdir cluster %u
+>>>>>>48	uleshort	>1		\b, infoSector %u
+#>>>>>>48	uleshort	=1		\b, infoSector %u (usual)
+>>>>>>48	uleshort	<1		\b, infoSector %u
+>>>>>>50	uleshort	>6		\b, Backup boot sector %u
+#>>>>>>50	uleshort	=6		\b, Backup boot sector %u (usual) 
+>>>>>>50	uleshort	<6		\b, Backup boot sector %u
+>>>>>>54	ulelong		>0		\b, reserved1 0x%x
+>>>>>>58	ulelong		>0		\b, reserved2 0x%x
+>>>>>>62	ulelong		>0		\b, reserved3 0x%x
+# same structure as FAT1X 
+>>>>>>64	ubyte		>0x80		\b, physical drive 0x%x
+#>>>>>>64	ubyte		=0x80		\b, physical drive 0x%x=80 (usual harddisk)
+>>>>>>64	ubyte&0x7F	>0		\b, physical drive 0x%x
+#>>>>>>64	ubyte		=0		\b, physical drive 0x%x=0 (usual floppy)
+>>>>>>65	ubyte		>0		\b, reserved 0x%x
+>>>>>>66	ubyte		>0x29		\b, dos < 4.0 BootSector (0x%x)
+>>>>>>66	ubyte		<0x29		\b, dos < 4.0 BootSector (0x%x)
+>>>>>>66	ubyte		=0x29
+>>>>>>>67	ulelong		x		\b, serial number 0x%x
+>>>>>>>71	string		<NO\ NAME	\b, label: "%11.11s"
+>>>>>>71	string		>NO\ NAME	\b, label: "%11.11s"
+>>>>>>71	string		=NO\ NAME	\b, unlabeled
+### FATs end
+>0x200	lelong	0x82564557		\b, BSD disklabel
+
+# Minix filesystems - Juan Cespedes <cespedes at debian.org>
+0x410	leshort		0x137f		Minix filesystem
+0x410	beshort		0x137f		Minix filesystem (big endian),
+>0x402	beshort		!0		\b, %d zones
+>0x1e	string		minix		\b, bootable
+0x410	leshort		0x138f		Minix filesystem, 30 char names
+0x410	leshort		0x2468		Minix filesystem, version 2
+0x410	leshort		0x2478		Minix filesystem, version 2, 30 char names
+
+# romfs filesystems - Juan Cespedes <cespedes at debian.org>
+0	string		-rom1fs-\0	romfs filesystem, version 1
+>8	belong	x			%d bytes,
+>16	string	x			named %s.
+
+# netboot image - Juan Cespedes <cespedes at debian.org>
+0	lelong		0x1b031336L	Netboot image,
+>4	lelong&0xFFFFFF00	0
+>>4	lelong&0x100	0x000		mode 2
+>>4	lelong&0x100	0x100		mode 3
+>4	lelong&0xFFFFFF00	!0	unknown mode
+
+0x18b	string	OS/2	OS/2 Boot Manager
+
+9564	lelong		0x00011954	Unix Fast File system (little-endian),
+>8404	string		x		last mounted on %s,
+#>9504	ledate		x		last checked at %s,
+>8224	ledate		x		last written at %s,
+>8401	byte		x		clean flag %d,
+>8228	lelong		x		number of blocks %d,
+>8232	lelong		x		number of data blocks %d,
+>8236	lelong		x		number of cylinder groups %d,
+>8240	lelong		x		block size %d,
+>8244	lelong		x		fragment size %d,
+>8252	lelong		x		minimum percentage of free blocks %d,
+>8256	lelong		x		rotational delay %dms,
+>8260	lelong		x		disk rotational speed %drps,
+>8320	lelong		0		TIME optimization
+>8320	lelong		1		SPACE optimization
+
+9564	belong		0x00011954	Unix Fast File system (big-endian),
+>7168   long		0x4c41424c	Apple UFS Volume
+>>7186  string		x		named %s,
+>>7176  belong		x		volume label version %d,
+>>7180  bedate		x		created on %s,
+>8404	string		x		last mounted on %s,
+#>9504	bedate		x		last checked at %s,
+>8224	bedate		x		last written at %s,
+>8401	byte		x		clean flag %d,
+>8228	belong		x		number of blocks %d,
+>8232	belong		x		number of data blocks %d,
+>8236	belong		x		number of cylinder groups %d,
+>8240	belong		x		block size %d,
+>8244	belong		x		fragment size %d,
+>8252	belong		x		minimum percentage of free blocks %d,
+>8256	belong		x		rotational delay %dms,
+>8260	belong		x		disk rotational speed %drps,
+>8320	belong		0		TIME optimization
+>8320	belong		1		SPACE optimization
+
+# ext2/ext3 filesystems - Andreas Dilger <adilger at turbolabs.com>
+0x438	leshort		0xEF53		Linux
+>0x44c	lelong		x		rev %d
+>0x43e	leshort		x		\b.%d
+>0x45c	lelong		^0x0000004	ext2 filesystem data
+>>0x43a	leshort		^0x0000001	(mounted or unclean)
+>0x45c	lelong		&0x0000004	ext3 filesystem data
+>>0x460	lelong		&0x0000004	(needs journal recovery)
+>0x43a	leshort		&0x0000002	(errors)
+>0x460	lelong		&0x0000001	(compressed)
+#>0x460	lelong		&0x0000002	(filetype)
+#>0x464	lelong		&0x0000001	(sparse_super)
+>0x464	lelong		&0x0000002	(large files)
+
+# SGI disk labels - Nathan Scott <nathans at debian.org>
+0	belong		0x0BE5A941	SGI disk label (volume header)
+
+# SGI XFS filesystem - Nathan Scott <nathans at debian.org>
+0	belong		0x58465342	SGI XFS filesystem data
+>0x4	belong		x		(blksz %d,
+>0x68	beshort		x		inosz %d,
+>0x64	beshort		^0x2004		v1 dirs)
+>0x64	beshort		&0x2004		v2 dirs)
+
+############################################################################
+# Minix-ST kernel floppy
+0x800	belong		0x46fc2700	Atari-ST Minix kernel image
+>19	string		\240\5\371\5\0\011\0\2\0	\b, 720k floppy
+>19	string		\320\2\370\5\0\011\0\1\0	\b, 360k floppy
+
+############################################################################
+# Hmmm, is this a better way of detecting _standard_ floppy images ?
+19	string		\320\2\360\3\0\011\0\1\0	DOS floppy 360k
+>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
+19	string		\240\5\371\3\0\011\0\2\0	DOS floppy 720k
+>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
+19	string		\100\013\360\011\0\022\0\2\0	DOS floppy 1440k
+>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
+
+19	string		\240\5\371\5\0\011\0\2\0	DOS floppy 720k, IBM
+>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
+19	string		\100\013\371\5\0\011\0\2\0	DOS floppy 1440k, mkdosfs
+>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
+
+19	string		\320\2\370\5\0\011\0\1\0	Atari-ST floppy 360k
+19	string		\240\5\371\5\0\011\0\2\0	Atari-ST floppy 720k
+
+#  Valid media descriptor bytes for MS-DOS:
+#
+#     Byte   Capacity   Media Size and Type
+#     -------------------------------------------------
+#
+#     F0     2.88 MB    3.5-inch, 2-sided, 36-sector
+#     F0     1.44 MB    3.5-inch, 2-sided, 18-sector
+#     F9     720K       3.5-inch, 2-sided, 9-sector
+#     F9     1.2 MB     5.25-inch, 2-sided, 15-sector
+#     FD     360K       5.25-inch, 2-sided, 9-sector
+#     FF     320K       5.25-inch, 2-sided, 8-sector
+#     FC     180K       5.25-inch, 1-sided, 9-sector
+#     FE     160K       5.25-inch, 1-sided, 8-sector
+#     FE     250K       8-inch, 1-sided, single-density
+#     FD     500K       8-inch, 2-sided, single-density
+#     FE     1.2 MB     8-inch, 2-sided, double-density
+#     F8     -----      Fixed disk 
+#
+#     FC     xxxK       Apricot 70x1x9 boot disk.
+#
+# Originally a bitmap:
+#  xxxxxxx0	Not two sided
+#  xxxxxxx1	Double sided
+#  xxxxxx0x	Not 8 SPT
+#  xxxxxx1x	8 SPT
+#  xxxxx0xx	Not Removable drive
+#  xxxxx1xx	Removable drive
+#  11111xxx	Must be one.
+#
+# But now it's rather random:
+#  111111xx	Low density disk
+#        00	SS, Not 8 SPT
+#        01	DS, Not 8 SPT
+#        10	SS, 8 SPT
+#        11	DS, 8 SPT
+#
+#  11111001	Double density 3� floppy disk, high density 5�
+#  11110000	High density 3� floppy disk
+#  11111000	Hard disk any format
+#
+
+# CDROM Filesystems
+32769    string    CD001     ISO 9660 CD-ROM filesystem data
+# "application id" which appears to be used as a volume label
+>32808	 string    >\0       '%s'
+>34816	 string    \000CD001\001EL\ TORITO\ SPECIFICATION    (bootable)
+37633    string    CD001     ISO 9660 CD-ROM filesystem data (raw 2352 byte sectors)
+32776    string    CDROM     High Sierra CD-ROM filesystem data
+
+# cramfs filesystem - russell at coker.com.au
+0       lelong    0x28cd3d45      Linux Compressed ROM File System data, little endian
+>4      lelong  x size %d
+>8      lelong  &1 version #2
+>8      lelong  &2 sorted_dirs
+>8      lelong  &4 hole_support
+>32     lelong  x CRC 0x%x,
+>36     lelong  x edition %d,
+>40     lelong  x %d blocks,
+>44     lelong  x %d files
+
+0       belong    0x28cd3d45      Linux Compressed ROM File System data, big endian
+>4      belong  x size %d
+>8      belong  &1 version #2
+>8      belong  &2 sorted_dirs
+>8      belong  &4 hole_support
+>32     belong  x CRC 0x%x,
+>36     belong  x edition %d,
+>40     belong  x %d blocks,
+>44     belong  x %d files
+
+# reiserfs - russell at coker.com.au
+0x10034		string	ReIsErFs	ReiserFS V3.5
+0x10034		string	ReIsEr2Fs	ReiserFS V3.6
+>0x1002c 	leshort	x		block size %d
+>0x10032	leshort	&2		(mounted or unclean)
+>0x10000	lelong	x		num blocks %d
+>0x10040	lelong	1		tea hash
+>0x10040	lelong	2		yura hash
+>0x10040	lelong	3		r5 hash
+
+# JFFS - russell at coker.com.au
+0	lelong	0x34383931	Linux Journalled Flash File system, little endian
+0	belong	0x34383931	Linux Journalled Flash File system, big endian
+
+# EST flat binary format (which isn't, but anyway)
+# From: Mark Brown <broonie at sirena.org.uk>
+0	string	ESTFBINR	EST flat binary
+
+# Aculab VoIP firmware
+# From: Mark Brown <broonie at sirena.org.uk>
+0	string	VoIP\ Startup\ and	Aculab VoIP firmware
+>35	string	x	format %s
+
+# PPCBoot image file
+# From: Mark Brown <broonie at sirena.org.uk>
+0	belong	0x27051956	PPCBoot image
+>4	string  PPCBoot
+>>12	string  x		version %s
+
+# JFFS2 file system
+0       leshort         0x1984                  Linux old jffs2 filesystem data little endian
+0       lelong          0xe0011985              Linux jffs2 filesystem data little endian
+
+#------------------------------------------------------------------------------
+# flash:	file(1) magic for Macromedia Flash file format
+#
+# See
+#
+#	http://www.macromedia.com/software/flash/open/
+#
+0	string		FWS		Macromedia Flash data,
+>3	byte		x		version %d
+0	string		CWS		Macromedia Flash data (compressed),
+>3	byte		x		version %d
+#
+# From Dave Wilson
+0	string AGD4\xbe\xb8\xbb\xcb\x00	Macromedia Freehand 9 Document
+
+#------------------------------------------------------------------------------
+# fonts:  file(1) magic for font data
+#
+0	string		FONT		ASCII vfont text
+0	short		0436		Berkeley vfont data
+0	short		017001		byte-swapped Berkeley vfont data
+
+# PostScript fonts (must precede "printer" entries), quinlan at yggdrasil.com
+0	string		%!PS-AdobeFont-1.	PostScript Type 1 font text
+>20	string		>\0			(%s)
+6	string		%!PS-AdobeFont-1.	PostScript Type 1 font program data
+
+# X11 font files in SNF (Server Natural Format) format
+0	belong		00000004		X11 SNF font data, MSB first
+0	lelong		00000004		X11 SNF font data, LSB first
+
+# X11 Bitmap Distribution Format, from Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		STARTFONT\040		X11 BDF font text
+
+# X11 fonts, from Daniel Quinlan (quinlan at yggdrasil.com)
+# PCF must come before SGI additions ("MIPSEL MIPS-II COFF" collides)
+0	string		\001fcp			X11 Portable Compiled Font data
+>12	byte		0x02			\b, LSB first
+>12	byte		0x0a			\b, MSB first
+0	string		D1.0\015		X11 Speedo font data
+
+#------------------------------------------------------------------------------
+# FIGlet fonts and controlfiles
+# From figmagic supplied with Figlet version 2.2
+# "David E. O'Brien" <obrien at FreeBSD.ORG>
+0	string		flf		FIGlet font
+>3	string		>2a		version %-2.2s
+0	string		flc		FIGlet controlfile
+>3	string		>2a		version %-2.2s
+
+# libGrx graphics lib fonts, from Albert Cahalan (acahalan at cs.uml.edu)
+# Used with djgpp (DOS Gnu C++), sometimes Linux or Turbo C++
+0	belong		0x14025919	libGrx font data,
+>8	leshort		x		%dx
+>10	leshort		x		\b%d
+>40	string		x		%s
+# Misc. DOS VGA fonts, from Albert Cahalan (acahalan at cs.uml.edu)
+0	belong		0xff464f4e	DOS code page font data collection
+7	belong		0x00454741	DOS code page font data
+7	belong		0x00564944	DOS code page font data (from Linux?)
+4098	string		DOSFONT		DOSFONT2 encrypted font data
+
+# downloadable fonts for browser (prints type) anthon at mnt.org
+0	string		PFR1		PFR1 font
+>102	string		>0		\b: %s
+
+# True Type fonts
+0	string	\000\001\000\000\000	TrueType font data
+
+0	string		\007\001\001\000Copyright\ (c)\ 199	Adobe Multiple Master font
+0	string		\012\001\001\000Copyright\ (c)\ 199	Adobe Multiple Master font
+
+# Opentype font data from Avi Bercovich
+0	string		OTTO		OpenType font data 
+
+
+#------------------------------------------------------------------------------
+# frame:  file(1) magic for FrameMaker files
+#
+# This stuff came on a FrameMaker demo tape, most of which is
+# copyright, but this file is "published" as witness the following:
+#
+0	string		\<MakerFile	FrameMaker document
+>11	string		5.5		 (5.5
+>11	string		5.0		 (5.0
+>11	string		4.0		 (4.0
+>11	string		3.0		 (3.0
+>11	string		2.0		 (2.0
+>11	string		1.0		 (1.0
+>14	byte		x		  %c)
+0	string		\<MIFFile	FrameMaker MIF (ASCII) file
+>9	string		4.0		 (4.0)
+>9	string		3.0		 (3.0)
+>9	string		2.0		 (2.0)
+>9	string		1.0		 (1.x)
+0	string		\<MakerDictionary	FrameMaker Dictionary text
+>17	string		3.0		 (3.0)
+>17	string		2.0		 (2.0)
+>17	string		1.0		 (1.x)
+0	string		\<MakerScreenFont	FrameMaker Font file
+>17	string		1.01		 (%s)
+0	string		\<MML		FrameMaker MML file
+0	string		\<BookFile	FrameMaker Book file
+>10	string		3.0		 (3.0
+>10	string		2.0		 (2.0
+>10	string		1.0		 (1.0
+>13	byte		x		  %c)
+# XXX - this book entry should be verified, if you find one, uncomment this
+#0	string		\<Book\ 	FrameMaker Book (ASCII) file
+#>6	string		3.0		 (3.0)
+#>6	string		2.0		 (2.0)
+#>6	string		1.0		 (1.0)
+0	string		\<Maker	Intermediate Print File	FrameMaker IPL file
+
+#------------------------------------------------------------------------------
+# freebsd:  file(1) magic for FreeBSD objects
+#
+# All new-style FreeBSD magic numbers are in host byte order (i.e.,
+# little-endian on x86).
+#
+# XXX - this comes from the file "freebsd" in a recent FreeBSD version of
+# "file"; it, and the NetBSD stuff in "netbsd", appear to use different
+# schemes for distinguishing between executable images, shared libraries,
+# and object files.
+#
+# FreeBSD says:
+#
+#    Regardless of whether it's pure, demand-paged, or none of the
+#    above:
+#
+#	if the entry point is < 4096, then it's a shared library if
+#	the "has run-time loader information" bit is set, and is
+#	position-independent if the "is position-independent" bit
+#	is set;
+#
+#	if the entry point is >= 4096 (or >4095, same thing), then it's
+#	an executable, and is dynamically-linked if the "has run-time
+#	loader information" bit is set.
+#
+# On x86, NetBSD says:
+#
+#    If it's neither pure nor demand-paged:
+#
+#	if it has the "has run-time loader information" bit set, it's
+#	a dynamically-linked executable;
+#
+#	if it doesn't have that bit set, then:
+#
+#	    if it has the "is position-independent" bit set, it's
+#	    position-independent;
+#
+#	    if the entry point is non-zero, it's an executable, otherwise
+#	    it's an object file.
+#
+#    If it's pure:
+#
+#	if it has the "has run-time loader information" bit set, it's
+#	a dynamically-linked executable, otherwise it's just an
+#	executable.
+#
+#    If it's demand-paged:
+#
+#	if it has the "has run-time loader information" bit set,
+#	then:
+#
+#	    if the entry point is < 4096, it's a shared library;
+#
+#	    if the entry point is = 4096 or > 4096 (i.e., >= 4096),
+#	    it's a dynamically-linked executable);
+#
+#	if it doesn't have the "has run-time loader information" bit
+#	set, then it's just an executable.
+#
+# (On non-x86, NetBSD does much the same thing, except that it uses
+# 8192 on 68K - except for "68k4k", which is presumably "68K with 4K
+# pages - SPARC, and MIPS, presumably because Sun-3's and Sun-4's
+# had 8K pages; dunno about MIPS.)
+#
+# I suspect the two will differ only in perverse and uninteresting cases
+# ("shared" libraries that aren't demand-paged and whose pages probably
+# won't actually be shared, executables with entry points <4096).
+#
+# I leave it to those more familiar with FreeBSD and NetBSD to figure out
+# what the right answer is (although using ">4095", FreeBSD-style, is
+# probably better than separately checking for "=4096" and ">4096",
+# NetBSD-style).  (The old "netbsd" file analyzed FreeBSD demand paged
+# executables using the NetBSD technique.)
+#
+0	lelong&0377777777	041400407	FreeBSD/i386
+>20	lelong			<4096
+>>3	byte&0xC0		&0x80		shared library
+>>3	byte&0xC0		0x40		PIC object
+>>3	byte&0xC0		0x00		object
+>20	lelong			>4095
+>>3	byte&0x80		0x80		dynamically linked executable
+>>3	byte&0x80		0x00		executable
+>16	lelong			>0		not stripped
+
+0	lelong&0377777777	041400410	FreeBSD/i386 pure
+>20	lelong			<4096
+>>3	byte&0xC0		&0x80		shared library
+>>3	byte&0xC0		0x40		PIC object
+>>3	byte&0xC0		0x00		object
+>20	lelong			>4095
+>>3	byte&0x80		0x80		dynamically linked executable
+>>3	byte&0x80		0x00		executable
+>16	lelong			>0		not stripped
+
+0	lelong&0377777777	041400413	FreeBSD/i386 demand paged
+>20	lelong			<4096
+>>3	byte&0xC0		&0x80		shared library
+>>3	byte&0xC0		0x40		PIC object
+>>3	byte&0xC0		0x00		object
+>20	lelong			>4095
+>>3	byte&0x80		0x80		dynamically linked executable
+>>3	byte&0x80		0x00		executable
+>16	lelong			>0		not stripped
+
+0	lelong&0377777777	041400314	FreeBSD/i386 compact demand paged
+>20	lelong			<4096
+>>3	byte&0xC0		&0x80		shared library
+>>3	byte&0xC0		0x40		PIC object
+>>3	byte&0xC0		0x00		object
+>20	lelong			>4095
+>>3	byte&0x80		0x80		dynamically linked executable
+>>3	byte&0x80		0x00		executable
+>16	lelong			>0		not stripped
+
+# XXX gross hack to identify core files
+# cores start with a struct tss; we take advantage of the following:
+# byte 7:     highest byte of the kernel stack pointer, always 0xfe
+#      8/9:   kernel (ring 0) ss value, always 0x0010
+#      10 - 27: ring 1 and 2 ss/esp, unused, thus always 0
+#      28:    low order byte of the current PTD entry, always 0 since the
+#             PTD is page-aligned
+#
+7	string	\357\020\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0	FreeBSD/i386 a.out core file
+>1039	string	>\0	from '%s'
+
+# /var/run/ld.so.hints
+# What are you laughing about?
+0	lelong			011421044151	ld.so hints file (Little Endian
+>4	lelong			>0		\b, version %d)
+>4	belong			<=0		\b)
+0	belong			011421044151	ld.so hints file (Big Endian
+>4	belong			>0		\b, version %d)
+>4	belong			<=0		\b)
+
+#
+# Files generated by FreeBSD scrshot(1)/vidcontrol(1) utilities
+#
+0	string	SCRSHOT_	scrshot(1) screenshot,
+>8	byte	x		version %d,
+>9	byte	2		%d bytes in header,
+>>10	byte	x		%d chars wide by
+>>11	byte	x		%d chars high
+
+#------------------------------------------------------------------------------
+# fsav:  file(1) magic for datafellows fsav virus definition files
+# Anthon van der Neut (anthon at mnt.org)
+0	beshort		0x1575		fsav (linux) macro virus
+>8	leshort		>0		(%d-
+>11	byte		>0		\b%02d-
+>10	byte		>0		\b%02d)
+
+# comment this out for now because it regognizes every file where
+# the eighth character is \n
+#8	byte		0x0a
+#>12	byte		0x07
+#>11	leshort		>0		fsav (linux) virus (%d-
+#>10	byte		0		\b01-
+#>10	byte		1		\b02-
+#>10	byte		2		\b03-
+#>10	byte		3		\b04-
+#>10	byte		4		\b05-
+#>10	byte		5		\b06-
+#>10	byte		6		\b07-
+#>10	byte		7		\b08-
+#>10	byte		8		\b08-
+#>10	byte		9		\b10-
+#>10	byte		10		\b11-
+#>10	byte		11		\b12-
+#>9	byte		>0		\b%02d)
+#------------------------------------------------------------------------------
+# games:  file(1) for games
+
+# Thomas M. Ott (ThMO)
+1	string	=WAD		DOOM data,
+>0	string	=I		main wad
+>0	string	=P		patch wad
+>0	byte	x		unknown junk
+
+# Fabio Bonelli <fabiobonelli at libero.it>
+# Quake II - III data files
+0       string  IDP2        	Quake II 3D Model file,
+>20     long    x               %lu skin(s),
+>8      long    x               (%lu x
+>12     long    x 		%lu),
+>40     long    x               %lu frame(s),
+>16     long    x               Frame size %lu bytes,
+>24     long  	x               %lu vertices/frame,
+>28     long    x            	%lu texture coordinates,
+>32     long    x               %lu triangles/frame
+
+0       string  IBSP            Quake
+>4      long    0x26            II Map file (BSP)
+>4      long    0x2E      	III Map file (BSP)
+
+0       string  IDS2            Quake II SP2 sprite file
+
+#---------------------------------------------------------------------------
+# Doom and Quake
+# submitted by Nicolas Patrois
+
+# DOOM
+
+0       string  IWAD    DOOM or DOOM ][ world
+0       string  PWAD    DOOM or DOOM ][ extension world
+
+0       string  \xcb\x1dBoom\xe6\xff\x03\x01    Boom or linuxdoom demo
+# some doom lmp files don't match, I've got one beginning with \x6d\x02\x01\x01
+
+24      string  LxD\ 203        Linuxdoom save
+>0      string  x       , name=%s
+>44     string  x       , world=%s
+
+# Quake
+
+0       string  PACK    Quake I or II world or extension
+
+#0       string  -1\x0a  Quake I demo
+#>30     string  x        version %.4s
+#>61     string  x        level %s       
+
+#0       string  5\x0a   Quake I save
+
+# The levels
+
+# Quake 1
+
+0	string	5\x0aIntroduction             Quake I save: start Introduction
+0	string	5\x0athe_Slipgate_Complex     Quake I save: e1m1 The slipgate complex
+0	string	5\x0aCastle_of_the_Damned     Quake I save: e1m2 Castle of the damned
+0	string	5\x0athe_Necropolis           Quake I save: e1m3 The necropolis
+0	string	5\x0athe_Grisly_Grotto        Quake I save: e1m4 The grisly grotto
+0	string	5\x0aZiggurat_Vertigo         Quake I save: e1m8 Ziggurat vertigo (secret)
+0	string	5\x0aGloom_Keep               Quake I save: e1m5 Gloom keep
+0	string	5\x0aThe_Door_To_Chthon       Quake I save: e1m6 The door to Chthon
+0	string	5\x0aThe_House_of_Chthon      Quake I save: e1m7 The house of Chthon
+0	string	5\x0athe_Installation         Quake I save: e2m1 The installation
+0	string	5\x0athe_Ogre_Citadel         Quake I save: e2m2 The ogre citadel
+0	string	5\x0athe_Crypt_of_Decay       Quake I save: e2m3 The crypt of decay (dopefish lives!)
+0	string	5\x0aUnderearth               Quake I save: e2m7 Underearth (secret)
+0	string	5\x0athe_Ebon_Fortress        Quake I save: e2m4 The ebon fortress
+0	string	5\x0athe_Wizard's_Manse       Quake I save: e2m5 The wizard's manse
+0	string	5\x0athe_Dismal_Oubliette     Quake I save: e2m6 The dismal oubliette
+0	string	5\x0aTermination_Central      Quake I save: e3m1 Termination central
+0	string	5\x0aVaults_of_Zin            Quake I save: e3m2 Vaults of Zin
+0	string	5\x0athe_Tomb_of_Terror       Quake I save: e3m3 The tomb of terror
+0	string	5\x0aSatan's_Dark_Delight     Quake I save: e3m4 Satan's dark delight
+0	string	5\x0athe_Haunted_Halls        Quake I save: e3m7 The haunted halls (secret)
+0	string	5\x0aWind_Tunnels             Quake I save: e3m5 Wind tunnels
+0	string	5\x0aChambers_of_Torment      Quake I save: e3m6 Chambers of torment
+0	string	5\x0athe_Sewage_System        Quake I save: e4m1 The sewage system
+0	string	5\x0aThe_Tower_of_Despair     Quake I save: e4m2 The tower of despair
+0	string	5\x0aThe_Elder_God_Shrine     Quake I save: e4m3 The elder god shrine
+0	string	5\x0athe_Palace_of_Hate       Quake I save: e4m4 The palace of hate
+0	string	5\x0aHell's_Atrium            Quake I save: e4m5 Hell's atrium
+0	string	5\x0athe_Nameless_City        Quake I save: e4m8 The nameless city (secret)
+0	string	5\x0aThe_Pain_Maze            Quake I save: e4m6 The pain maze
+0	string	5\x0aAzure_Agony              Quake I save: e4m7 Azure agony
+0	string	5\x0aShub-Niggurath's_Pit     Quake I save: end Shub-Niggurath's pit
+
+# Quake DeathMatch levels
+
+0	string	5\x0aPlace_of_Two_Deaths	 Quake I save: dm1 Place of two deaths
+0	string	5\x0aClaustrophobopolis		 Quake I save: dm2 Claustrophobopolis
+0	string	5\x0aThe_Abandoned_Base		 Quake I save: dm3 The abandoned base
+0	string	5\x0aThe_Bad_Place		 Quake I save: dm4 The bad place
+0	string	5\x0aThe_Cistern		 Quake I save: dm5 The cistern
+0	string	5\x0aThe_Dark_Zone		 Quake I save: dm6 The dark zone
+
+# Scourge of Armagon
+
+0	string	5\x0aCommand_HQ               Quake I save: start Command HQ
+0	string	5\x0aThe_Pumping_Station      Quake I save: hip1m1 The pumping station
+0	string	5\x0aStorage_Facility         Quake I save: hip1m2 Storage facility
+0	string	5\x0aMilitary_Complex         Quake I save: hip1m5 Military complex (secret)
+0	string	5\x0athe_Lost_Mine            Quake I save: hip1m3 The lost mine
+0	string	5\x0aResearch_Facility        Quake I save: hip1m4 Research facility
+0	string	5\x0aAncient_Realms           Quake I save: hip2m1 Ancient realms
+0	string	5\x0aThe_Gremlin's_Domain     Quake I save: hip2m6 The gremlin's domain (secret)
+0	string	5\x0aThe_Black_Cathedral      Quake I save: hip2m2 The black cathedral
+0	string	5\x0aThe_Catacombs            Quake I save: hip2m3 The catacombs
+0	string	5\x0athe_Crypt__              Quake I save: hip2m4 The crypt
+0	string	5\x0aMortum's_Keep            Quake I save: hip2m5 Mortum's keep
+0	string	5\x0aTur_Torment              Quake I save: hip3m1 Tur torment
+0	string	5\x0aPandemonium              Quake I save: hip3m2 Pandemonium
+0	string	5\x0aLimbo                    Quake I save: hip3m3 Limbo
+0	string	5\x0athe_Edge_of_Oblivion     Quake I save: hipdm1 The edge of oblivion (secret)
+0	string	5\x0aThe_Gauntlet             Quake I save: hip3m4 The gauntlet
+0	string	5\x0aArmagon's_Lair           Quake I save: hipend Armagon's lair
+
+# Malice
+
+0	string	5\x0aThe_Academy      Quake I save: start The academy
+0	string	5\x0aThe_Lab          Quake I save: d1 The lab
+0	string	5\x0aArea_33          Quake I save: d1b Area 33
+0	string	5\x0aSECRET_MISSIONS  Quake I save: d3b Secret missions
+0	string	5\x0aThe_Hospital     Quake I save: d10 The hospital (secret)
+0	string	5\x0aThe_Genetics_Lab Quake I save: d11 The genetics lab (secret)
+0	string	5\x0aBACK_2_MALICE    Quake I save: d4b Back to Malice
+0	string	5\x0aArea44           Quake I save: d1c Area 44
+0	string	5\x0aTakahiro_Towers  Quake I save: d2 Takahiro towers
+0	string	5\x0aA_Rat's_Life     Quake I save: d3 A rat's life
+0	string	5\x0aInto_The_Flood   Quake I save: d4 Into the flood
+0	string	5\x0aThe_Flood        Quake I save: d5 The flood
+0	string	5\x0aNuclear_Plant    Quake I save: d6 Nuclear plant
+0	string	5\x0aThe_Incinerator_Plant    Quake I save: d7 The incinerator plant
+0	string	5\x0aThe_Foundry              Quake I save: d7b The foundry
+0	string	5\x0aThe_Underwater_Base      Quake I save: d8 The underwater base
+0	string	5\x0aTakahiro_Base            Quake I save: d9 Takahiro base
+0	string	5\x0aTakahiro_Laboratories    Quake I save: d12 Takahiro laboratories
+0	string	5\x0aStayin'_Alive    Quake I save: d13 Stayin' alive
+0	string	5\x0aB.O.S.S._HQ      Quake I save: d14 B.O.S.S. HQ
+0	string	5\x0aSHOWDOWN!        Quake I save: d15 Showdown!
+
+# Malice DeathMatch levels
+
+0	string	5\x0aThe_Seventh_Precinct	 Quake I save: ddm1 The seventh precinct
+0	string	5\x0aSub_Station		 Quake I save: ddm2 Sub station
+0	string	5\x0aCrazy_Eights!		 Quake I save: ddm3 Crazy eights!
+0	string	5\x0aEast_Side_Invertationa	 Quake I save: ddm4 East side invertationa
+0	string	5\x0aSlaughterhouse		 Quake I save: ddm5 Slaughterhouse
+0	string	5\x0aDOMINO			 Quake I save: ddm6 Domino
+0	string	5\x0aSANDRA'S_LADDER		 Quake I save: ddm7 Sandra's ladder
+
+
+0	string	MComprHD	MAME CHD compressed hard disk image,
+>12	belong	x		version %lu
+
+#------------------------------------------------------------------------------
+# GEOS files (Vidar Madsen, vidar at gimp.org)
+# semi-commonly used in embedded and handheld systems.
+0	belong	0xc745c153	GEOS
+>40	byte	1	executable
+>40	byte	2	VMFile
+>40	byte	3	binary
+>40	byte	4	directory label
+>40	byte	<1	unknown
+>40	byte	>4	unknown
+>4	string	>\0	\b, name "%s"
+#>44	short	x	\b, version %d
+#>46	short	x	\b.%d
+#>48	short	x	\b, rev %d
+#>50	short	x	\b.%d
+#>52	short	x	\b, proto %d
+#>54	short	x	\br%d
+#>168	string	>\0	\b, copyright "%s"
+
+#------------------------------------------------------------------------------
+# gcc:  file(1) magic for GCC special files
+#
+0	string		gpch		GCC precompiled header
+
+# The version field is annoying.  It's 3 characters, not zero-terminated.
+>5	byte		x			(version %c
+>6	byte		x			\b%c
+>7	byte		x			\b%c)
+
+# 67 = 'C', 111 = 'o', 43 = '+', 79 = 'O'
+>4	byte		67			for C
+>4	byte		111			for Objective C
+>4	byte		43			for C++
+>4	byte		79			for Objective C++
+#------------------------------------------------------------------------------
+# GIMP Gradient: file(1) magic for the GIMP's gradient data files
+# by Federico Mena <federico at nuclecu.unam.mx>
+
+0       string          GIMP\ Gradient  GIMP gradient data
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the XCF image format used in the GIMP developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega at vt.edu)
+
+0	string		gimp\ xcf	GIMP XCF image data,
+>9	string		file		version 0,
+>9	string		v		version
+>>10	string		>\0		%s,
+>14	belong		x		%lu x
+>18	belong		x		%lu,
+>22     belong          0               RGB Color
+>22     belong          1               Greyscale
+>22     belong          2               Indexed Color
+>22	belong		>2		Unknown Image Type.
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the patterns used in the GIMP, developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega at vt.edu)
+
+20      string          GPAT            GIMP pattern data,
+>24     string          x               %s
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the brushes used in the GIMP, developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega at vt.edu)
+
+20      string          GIMP            GIMP brush data
+#
+# GNU nlsutils message catalog file format
+#
+0	string		\336\22\4\225	GNU message catalog (little endian),
+>4	lelong		x		revision %d,
+>8	lelong		x		%d messages
+0	string		\225\4\22\336	GNU message catalog (big endian),
+>4	belong		x		revision %d,
+>8	belong		x		%d messages
+# message catalogs, from Mitchum DSouza <m.dsouza at mrc-apu.cam.ac.uk>
+0	string		*nazgul*	Nazgul style compiled message catalog
+>8	lelong		>0		\b, version %ld
+# GnuPG
+# The format is very similar to pgp
+0	string          \001gpg                 GPG key trust database
+>4	byte            x                       version %d
+0       beshort         0x9901                  GPG key public ring
+# This magic is not particularly good, as the keyrings don't have true
+# magic. Nevertheless, it covers many keyrings.
+
+# Gnumeric spreadsheet
+# This entry is only semi-helpful, as Gnumeric compresses its files, so
+# they will ordinarily reported as "compressed", but at least -z helps
+39      string          =<gmr:Workbook           Gnumeric spreadsheet
+
+#------------------------------------------------------------------------------
+# gcc:  file(1) magic for GCC special files
+#
+0       string          gpch            GCC precompiled header
+
+# The version field is annoying.  It's 3 characters, not zero-terminated.
+>5      byte            x                       (version %c
+>6      byte            x                       \b%c
+>7      byte            x                       \b%c)
+
+# 67 = 'C', 111 = 'o', 43 = '+', 79 = 'O'
+>4      byte            67                      for C
+>4      byte            111                     for Objective C
+>4      byte            43                      for C++
+>4      byte            79                      for Objective C++
+
+
+
+#------------------------------------------------------------------------------
+# ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
+#
+# ACE/gr binary
+0	string	\000\000\0001\000\000\0000\000\000\0000\000\000\0002\000\000\0000\000\000\0000\000\000\0003		old ACE/gr binary file
+>39	byte	>0			- version %c
+# ACE/gr ascii
+0	string	#\ xvgr\ parameter\ file	ACE/gr ascii file
+0	string	#\ xmgr\ parameter\ file	ACE/gr ascii file
+0	string	#\ ACE/gr\ parameter\ file	ACE/gr ascii file
+# Grace projects
+0	string	#\ Grace\ project\ file		Grace project file
+>23	string	@version\  			(version
+>>32	byte	>0 				%c
+>>33	string	>\0 				\b.%.2s
+>>35	string	>\0 				\b.%.2s)
+# ACE/gr fit description files
+0	string	#\ ACE/gr\ fit\ description\ 	ACE/gr fit description file
+# end of ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
+
+#------------------------------------------------------------------------------
+# gringotts:  file(1) magic for Gringotts
+# http://devel.pluto.linux.it/projects/Gringotts/
+# author: Germano Rizzo <mano at pluto.linux.it>
+#GRG3????Y
+0	string	GRG		Gringotts data file
+#file format 1
+>3	string		1		v.1, MCRYPT S2K, SERPENT crypt, SHA-256 hash, ZLib lvl.9
+#file format 2
+>3	string		2		v.2, MCRYPT S2K, 
+>>8	byte&0x70	0x00		RIJNDAEL-128 crypt,
+>>8	byte&0x70	0x10		SERPENT crypt,
+>>8	byte&0x70	0x20		TWOFISH crypt, 
+>>8	byte&0x70	0x30		CAST-256 crypt,
+>>8	byte&0x70	0x40		SAFER+ crypt,
+>>8	byte&0x70	0x50		LOKI97 crypt,
+>>8	byte&0x70	0x60		3DES crypt,
+>>8	byte&0x70	0x70		RIJNDAEL-256 crypt,
+>>8	byte&0x08	0x00		SHA1 hash,
+>>8	byte&0x08	0x08		RIPEMD-160 hash,
+>>8	byte&0x04	0x00		ZLib
+>>8	byte&0x04	0x04		BZip2
+>>8	byte&0x03	0x00		lvl.0
+>>8	byte&0x03	0x01		lvl.3
+>>8	byte&0x03	0x02		lvl.6
+>>8	byte&0x03	0x03		lvl.9
+#file format 3
+>3	string		3		v.3, OpenPGP S2K, 
+>>8	byte&0x70	0x00		RIJNDAEL-128 crypt,
+>>8	byte&0x70	0x10		SERPENT crypt,
+>>8	byte&0x70	0x20		TWOFISH crypt, 
+>>8	byte&0x70	0x30		CAST-256 crypt,
+>>8	byte&0x70	0x40		SAFER+ crypt,
+>>8	byte&0x70	0x50		LOKI97 crypt,
+>>8	byte&0x70	0x60		3DES crypt,
+>>8	byte&0x70	0x70		RIJNDAEL-256 crypt,
+>>8	byte&0x08	0x00		SHA1 hash,
+>>8	byte&0x08	0x08		RIPEMD-160 hash,
+>>8	byte&0x04	0x00		ZLib
+>>8	byte&0x04	0x04		BZip2
+>>8	byte&0x03	0x00		lvl.0
+>>8	byte&0x03	0x01		lvl.3
+>>8	byte&0x03	0x02		lvl.6
+>>8	byte&0x03	0x03		lvl.9
+#file format >3
+>3	string		>3		v.%.1s (unknown details)
+
+#------------------------------------------------------------------------------
+# Hierarchical Data Format, used to facilitate scientific data exchange
+# specifications at http://hdf.ncsa.uiuc.edu/
+
+0	belong		0x0e031301	Hierarchical Data Format (version 4) data
+0	string		\211HDF\r\n\032	Hierarchical Data Format (version 5) data
+
+#------------------------------------------------------------------------------
+# hitach-sh: file(1) magic for Hitachi Super-H
+#
+# Super-H COFF
+#
+0	beshort		0x0500		Hitachi SH big-endian COFF
+>18	beshort&0x0002	=0x0000		object
+>18	beshort&0x0002	=0x0002		executable
+>18	beshort&0x0008	=0x0008		\b, stripped
+>18	beshort&0x0008	=0x0000		\b, not stripped
+#
+0	leshort		0x0550		Hitachi SH little-endian COFF
+>18	leshort&0x0002	=0x0000		object
+>18	leshort&0x0002	=0x0002		executable
+>18	leshort&0x0008	=0x0008		\b, stripped
+>18	leshort&0x0008	=0x0000		\b, not stripped
+
+
+#------------------------------------------------------------------------------
+# hp:  file(1) magic for Hewlett Packard machines (see also "printer")
+#
+# XXX - somebody should figure out whether any byte order needs to be
+# applied to the "TML" stuff; I'm assuming the Apollo stuff is
+# big-endian as it was mostly 68K-based.
+#
+# I think the 500 series was the old stack-based machines, running a
+# UNIX environment atop the "SUN kernel"; dunno whether it was
+# big-endian or little-endian.
+#
+# Daniel Quinlan (quinlan at yggdrasil.com): hp200 machines are 68010 based;
+# hp300 are 68020+68881 based; hp400 are also 68k.  The following basic
+# HP magic is useful for reference, but using "long" magic is a better
+# practice in order to avoid collisions.
+#
+# Guy Harris (guy at netapp.com): some additions to this list came from
+# HP-UX 10.0's "/usr/include/sys/unistd.h" (68030, 68040, PA-RISC 1.1,
+# 1.2, and 2.0).  The 1.2 and 2.0 stuff isn't in the HP-UX 10.0
+# "/etc/magic", though, except for the "archive file relocatable library"
+# stuff, and the 68030 and 68040 stuff isn't there at all - are they not
+# used in executables, or have they just not yet updated "/etc/magic"
+# completely?
+#
+# 0	beshort		200		hp200 (68010) BSD binary
+# 0	beshort		300		hp300 (68020+68881) BSD binary
+# 0	beshort		0x20c		hp200/300 HP-UX binary
+# 0	beshort		0x20d		hp400 (68030) HP-UX binary
+# 0	beshort		0x20e		hp400 (68040?) HP-UX binary
+# 0	beshort		0x20b		PA-RISC1.0 HP-UX binary
+# 0	beshort		0x210		PA-RISC1.1 HP-UX binary
+# 0	beshort		0x211		PA-RISC1.2 HP-UX binary
+# 0	beshort		0x214		PA-RISC2.0 HP-UX binary
+
+#
+# The "misc" stuff needs a byte order; the archives look suspiciously
+# like the old 177545 archives (0xff65 = 0177545).
+#
+#### Old Apollo stuff
+0	beshort		0627		Apollo m68k COFF executable
+>18	beshort		^040000		not stripped
+>22	beshort		>0		- version %ld
+0	beshort		0624		apollo a88k COFF executable
+>18	beshort		^040000		not stripped
+>22	beshort		>0		- version %ld
+0       long            01203604016     TML 0123 byte-order format
+0       long            01702407010     TML 1032 byte-order format
+0       long            01003405017     TML 2301 byte-order format
+0       long            01602007412     TML 3210 byte-order format
+#### PA-RISC 1.1
+0	belong 		0x02100106	PA-RISC1.1 relocatable object
+0	belong 		0x02100107	PA-RISC1.1 executable
+>168	belong		&0x00000004	dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x02100108	PA-RISC1.1 shared executable
+>168	belong&0x4	0x4		dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x0210010b	PA-RISC1.1 demand-load executable
+>168	belong&0x4	0x4		dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x0210010e	PA-RISC1.1 shared library
+>96	belong		>0		- not stripped
+
+0	belong 		0x0210010d	PA-RISC1.1 dynamic load library
+>96	belong		>0		- not stripped
+
+#### PA-RISC 2.0
+0	belong		0x02140106	PA-RISC2.0 relocatable object
+
+0       belong		0x02140107	PA-RISC2.0 executable
+>168	belong		&0x00000004	dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0       belong		0x02140108	PA-RISC2.0 shared executable
+>168	belong		&0x00000004	dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0       belong		0x0214010b	PA-RISC2.0 demand-load executable
+>168	belong		&0x00000004	dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0       belong		0x0214010e	PA-RISC2.0 shared library
+>96	belong		>0		- not stripped
+
+0       belong		0x0214010d	PA-RISC2.0 dynamic load library
+>96	belong		>0		- not stripped
+
+#### 800
+0	belong 		0x020b0106	PA-RISC1.0 relocatable object
+
+0	belong 		0x020b0107	PA-RISC1.0 executable
+>168	belong&0x4	0x4		dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x020b0108	PA-RISC1.0 shared executable
+>168	belong&0x4	0x4		dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x020b010b	PA-RISC1.0 demand-load executable
+>168	belong&0x4	0x4		dynamically linked
+>(144)	belong		0x054ef630	dynamically linked
+>96	belong		>0		- not stripped
+
+0	belong 		0x020b010e	PA-RISC1.0 shared library
+>96	belong		>0		- not stripped
+
+0	belong 		0x020b010d	PA-RISC1.0 dynamic load library
+>96	belong		>0		- not stripped
+
+0	belong		0x213c6172	archive file
+>68	belong 		0x020b0619	- PA-RISC1.0 relocatable library
+>68	belong	 	0x02100619	- PA-RISC1.1 relocatable library
+>68	belong 		0x02110619	- PA-RISC1.2 relocatable library
+>68	belong 		0x02140619	- PA-RISC2.0 relocatable library
+
+#### 500
+0	long		0x02080106	HP s500 relocatable executable
+>16	long		>0		- version %ld
+
+0	long		0x02080107	HP s500 executable
+>16	long		>0		- version %ld
+
+0	long		0x02080108	HP s500 pure executable
+>16	long		>0		- version %ld
+
+#### 200
+0	belong 		0x020c0108	HP s200 pure executable
+>4	beshort		>0		- version %ld
+>8	belong		&0x80000000	save fp regs
+>8	belong		&0x40000000	dynamically linked
+>8	belong		&0x20000000	debuggable
+>36	belong		>0		not stripped
+
+0	belong		0x020c0107	HP s200 executable
+>4	beshort		>0		- version %ld
+>8	belong		&0x80000000	save fp regs
+>8	belong		&0x40000000	dynamically linked
+>8	belong		&0x20000000	debuggable
+>36	belong		>0		not stripped
+
+0	belong		0x020c010b	HP s200 demand-load executable
+>4	beshort		>0		- version %ld
+>8	belong		&0x80000000	save fp regs
+>8	belong		&0x40000000	dynamically linked
+>8	belong		&0x20000000	debuggable
+>36	belong		>0		not stripped
+
+0	belong		0x020c0106	HP s200 relocatable executable
+>4	beshort		>0		- version %ld
+>6	beshort		>0		- highwater %d
+>8	belong		&0x80000000	save fp regs
+>8	belong		&0x20000000	debuggable
+>8	belong		&0x10000000	PIC
+
+0	belong 		0x020a0108	HP s200 (2.x release) pure executable
+>4	beshort		>0		- version %ld
+>36	belong		>0		not stripped
+
+0	belong		0x020a0107	HP s200 (2.x release) executable
+>4	beshort		>0		- version %ld
+>36	belong		>0		not stripped
+
+0	belong		0x020c010e	HP s200 shared library
+>4	beshort		>0		- version %ld
+>6	beshort		>0		- highwater %d
+>36	belong		>0		not stripped
+
+0	belong		0x020c010d	HP s200 dynamic load library
+>4	beshort		>0		- version %ld
+>6	beshort		>0		- highwater %d
+>36	belong		>0		not stripped
+
+#### MISC
+0	long		0x0000ff65	HP old archive
+0	long		0x020aff65	HP s200 old archive
+0	long		0x020cff65	HP s200 old archive
+0	long		0x0208ff65	HP s500 old archive
+
+0	long		0x015821a6	HP core file
+
+0	long		0x4da7eee8	HP-WINDOWS font
+>8	byte		>0		- version %ld
+0	string		Bitmapfile	HP Bitmapfile
+
+0	string		IMGfile	CIS 	compimg HP Bitmapfile
+# XXX - see "lif"
+#0	short		0x8000		lif file
+0	long		0x020c010c	compiled Lisp
+
+0	string		msgcat01	HP NLS message catalog,
+>8	long		>0		%d messages
+
+# addendum to /etc/magic with HP-48sx file-types by phk at data.fls.dk 1jan92
+0	string		HPHP48-		HP48 binary
+>7	byte		>0		- Rev %c
+>8	beshort		0x1129		(ADR)
+>8	beshort		0x3329		(REAL)
+>8	beshort		0x5529		(LREAL)
+>8	beshort		0x7729		(COMPLX)
+>8	beshort		0x9d29		(LCOMPLX)
+>8	beshort		0xbf29		(CHAR)
+>8	beshort		0xe829		(ARRAY)
+>8	beshort		0x0a2a		(LNKARRAY)
+>8	beshort		0x2c2a		(STRING)
+>8	beshort		0x4e2a		(HXS)
+>8	beshort		0x742a		(LIST)
+>8	beshort		0x962a		(DIR)
+>8	beshort		0xb82a		(ALG)
+>8	beshort		0xda2a		(UNIT)
+>8	beshort		0xfc2a		(TAGGED)
+>8	beshort		0x1e2b		(GROB)
+>8	beshort		0x402b		(LIB)
+>8	beshort		0x622b		(BACKUP)
+>8	beshort		0x882b		(LIBDATA)
+>8	beshort		0x9d2d		(PROG)
+>8	beshort		0xcc2d		(CODE)
+>8	beshort		0x482e		(GNAME)
+>8	beshort		0x6d2e		(LNAME)
+>8	beshort		0x922e		(XLIB)
+0	string		%%HP:		HP48 text
+>6	string		T(0)		- T(0)
+>6	string		T(1)		- T(1)
+>6	string		T(2)		- T(2)
+>6	string		T(3)		- T(3)
+>10	string		A(D)		A(D)
+>10	string		A(R)		A(R)
+>10	string		A(G)		A(G)
+>14	string		F(.)		F(.);
+>14	string		F(,)		F(,);
+
+# hpBSD magic numbers
+0	beshort		200		hp200 (68010) BSD
+>2	beshort		0407		impure binary
+>2	beshort		0410		read-only binary
+>2	beshort		0413		demand paged binary
+0	beshort		300		hp300 (68020+68881) BSD
+>2	beshort		0407		impure binary
+>2	beshort		0410		read-only binary
+>2	beshort		0413		demand paged binary
+#
+# From David Gero <dgero at nortelnetworks.com>
+# HP-UX 10.20 core file format from /usr/include/sys/core.h
+# Unfortunately, HP-UX uses corehead blocks without specifying the order
+# There are four we care about:
+#     CORE_KERNEL, which starts with the string "HP-UX"
+#     CORE_EXEC, which contains the name of the command
+#     CORE_PROC, which contains the signal number that caused the core dump
+#     CORE_FORMAT, which contains the version of the core file format (== 1)
+# The only observed order in real core files is KERNEL, EXEC, FORMAT, PROC
+# but we include all 6 variations of the order of the first 3, and
+# assume that PROC will always be last
+# Order 1: KERNEL, EXEC, FORMAT, PROC
+0x10		string	HP-UX
+>0		belong	2
+>>0xC		belong	0x3C
+>>>0x4C		belong	0x100
+>>>>0x58	belong	0x44
+>>>>>0xA0	belong	1
+>>>>>>0xAC	belong	4
+>>>>>>>0xB0	belong	1
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0x90	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+# Order 2: KERNEL, FORMAT, EXEC, PROC
+>>>0x4C		belong	1
+>>>>0x58	belong	4
+>>>>>0x5C	belong	1
+>>>>>>0x60	belong	0x100
+>>>>>>>0x6C	belong	0x44
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0xA4	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+# Order 3: FORMAT, KERNEL, EXEC, PROC
+0x24		string	HP-UX
+>0		belong	1
+>>0xC		belong	4
+>>>0x10		belong	1
+>>>>0x14	belong	2
+>>>>>0x20	belong	0x3C
+>>>>>>0x60	belong	0x100
+>>>>>>>0x6C	belong	0x44
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0xA4	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+# Order 4: EXEC, KERNEL, FORMAT, PROC
+0x64		string	HP-UX
+>0		belong	0x100
+>>0xC		belong	0x44
+>>>0x54		belong	2
+>>>>0x60	belong	0x3C
+>>>>>0xA0	belong	1
+>>>>>>0xAC	belong	4
+>>>>>>>0xB0	belong	1
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0x44	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+# Order 5: FORMAT, EXEC, KERNEL, PROC
+0x78		string	HP-UX
+>0		belong	1
+>>0xC		belong	4
+>>>0x10		belong	1
+>>>>0x14	belong	0x100
+>>>>>0x20	belong	0x44
+>>>>>>0x68	belong	2
+>>>>>>>0x74	belong	0x3C
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0x58	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+# Order 6: EXEC, FORMAT, KERNEL, PROC
+>0		belong	0x100
+>>0xC		belong	0x44
+>>>0x54		belong	1
+>>>>0x60	belong	4
+>>>>>0x64	belong	1
+>>>>>>0x68	belong	2
+>>>>>>>0x74	belong	0x2C
+>>>>>>>>0xB4	belong	4		core file
+>>>>>>>>>0x44	string	>\0		from '%s'
+>>>>>>>>>0xC4	belong	3		- received SIGQUIT
+>>>>>>>>>0xC4	belong	4		- received SIGILL
+>>>>>>>>>0xC4	belong	5		- received SIGTRAP
+>>>>>>>>>0xC4	belong	6		- received SIGABRT
+>>>>>>>>>0xC4	belong	7		- received SIGEMT
+>>>>>>>>>0xC4	belong	8		- received SIGFPE
+>>>>>>>>>0xC4	belong	10		- received SIGBUS
+>>>>>>>>>0xC4	belong	11		- received SIGSEGV
+>>>>>>>>>0xC4	belong	12		- received SIGSYS
+>>>>>>>>>0xC4	belong	33		- received SIGXCPU
+>>>>>>>>>0xC4	belong	34		- received SIGXFSZ
+
+# From: AMAKAWA Shuhei <sa264 at cam.ac.uk>
+0	string	HPHP49-			HP49 binary
+
+
+#------------------------------------------------------------------------------
+# human68k:  file(1) magic for Human68k (X680x0 DOS) binary formats
+# Magic too short!
+#0		string	HU		Human68k
+#>68		string	LZX		LZX compressed
+#>>72		string	>\0		(version %s)
+#>(8.L+74)	string	LZX		LZX compressed
+#>>(8.L+78)	string	>\0		(version %s)
+#>60		belong	>0		binded
+#>(8.L+66)	string	#HUPAIR		hupair
+#>0		string	HU		X executable
+#>(8.L+74)	string	#LIBCV1		- linked PD LIBC ver 1
+#>4		belong	>0		- base address 0x%x
+#>28		belong	>0		not stripped
+#>32		belong	>0		with debug information
+#0		beshort	0x601a		Human68k Z executable
+#0		beshort	0x6000		Human68k object file
+#0		belong	0xd1000000	Human68k ar binary archive
+#0		belong	0xd1010000	Human68k ar ascii archive
+#0		beshort	0x0068		Human68k lib archive
+#4		string	LZX		Human68k LZX compressed
+#>8		string	>\0		(version %s)
+#>4		string	LZX		R executable
+#2		string	#HUPAIR		Human68k hupair R executable
+
+#------------------------------------------------------------------------------
+# ibm370:  file(1) magic for IBM 370 and compatibles.
+#
+# "ibm370" said that 0x15d == 0535 was "ibm 370 pure executable".
+# What the heck *is* "USS/370"?
+# AIX 4.1's "/etc/magic" has
+#
+#	0	short		0535		370 sysV executable 
+#	>12	long		>0		not stripped
+#	>22	short		>0		- version %d
+#	>30	long		>0		- 5.2 format
+#	0	short		0530		370 sysV pure executable 
+#	>12	long		>0		not stripped
+#	>22	short		>0		- version %d
+#	>30	long		>0		- 5.2 format
+#
+# instead of the "USS/370" versions of the same magic numbers.
+#
+0	beshort		0537		370 XA sysV executable 
+>12	belong		>0		not stripped
+>22	beshort		>0		- version %d
+>30	belong		>0		- 5.2 format
+0	beshort		0532		370 XA sysV pure executable 
+>12	belong		>0		not stripped
+>22	beshort		>0		- version %d
+>30	belong		>0		- 5.2 format
+0	beshort		054001		370 sysV pure executable
+>12	belong		>0		not stripped
+0	beshort		055001		370 XA sysV pure executable
+>12	belong		>0		not stripped
+0	beshort		056401		370 sysV executable
+>12	belong		>0		not stripped
+0	beshort		057401		370 XA sysV executable
+>12	belong		>0		not stripped
+0       beshort		0531		SVR2 executable (Amdahl-UTS)
+>12	belong		>0		not stripped
+>24     belong		>0		- version %ld
+0	beshort		0534		SVR2 pure executable (Amdahl-UTS)
+>12	belong		>0		not stripped
+>24	belong		>0		- version %ld
+0	beshort		0530		SVR2 pure executable (USS/370)
+>12	belong		>0		not stripped
+>24	belong		>0		- version %ld
+0	beshort		0535		SVR2 executable (USS/370)
+>12	belong		>0		not stripped
+>24	belong		>0		- version %ld
+
+#------------------------------------------------------------------------------
+# ibm6000:  file(1) magic for RS/6000 and the RT PC.
+#
+0	beshort		0x01df		executable (RISC System/6000 V3.1) or obj module
+>12	belong		>0		not stripped
+# Breaks sun4 statically linked execs.
+#0      beshort		0x0103		executable (RT Version 2) or obj module
+#>2	byte		0x50		pure
+#>28	belong		>0		not stripped
+#>6	beshort		>0		- version %ld
+0	beshort		0x0104		shared library
+0	beshort		0x0105		ctab data
+0	beshort		0xfe04		structured file
+0	string		0xabcdef	AIX message catalog
+0	belong		0x000001f9	AIX compiled message catalog
+0	string		\<aiaff>	archive
+0	string		\<bigaf>	archive (big format)
+
+
+#------------------------------------------------------------------------------
+# iff:	file(1) magic for Interchange File Format (see also "audio" & "images")
+#
+# Daniel Quinlan (quinlan at yggdrasil.com) -- IFF was designed by Electronic
+# Arts for file interchange.  It has also been used by Apple, SGI, and
+# especially Commodore-Amiga.
+#
+# IFF files begin with an 8 byte FORM header, followed by a 4 character
+# FORM type, which is followed by the first chunk in the FORM.
+
+0	string		FORM		IFF data
+#>4	belong		x		\b, FORM is %d bytes long
+# audio formats
+>8	string		AIFF		\b, AIFF audio
+>8	string		AIFC		\b, AIFF-C compressed audio
+>8	string		8SVX		\b, 8SVX 8-bit sampled sound voice
+>8	string		SAMP		\b, SAMP sampled audio
+>8	string		DTYP		\b, DTYP datatype description
+>8	string		PTCH		\b, PTCH binary patch
+# image formats
+>8	string		ILBMBMHD	\b, ILBM interleaved image
+>>20	beshort		x		\b, %d x
+>>22	beshort		x		%d
+>8	string		RGBN		\b, RGBN 12-bit RGB image
+>8	string		RGB8		\b, RGB8 24-bit RGB image
+>8	string		DR2D		\b, DR2D 2-D object
+>8	string		TDDD		\b, TDDD 3-D rendering
+# other formats
+>8	string		FTXT		\b, FTXT formatted text
+
+#------------------------------------------------------------------------------
+# images:  file(1) magic for image formats (see also "iff")
+#
+# originally from jef at helios.ee.lbl.gov (Jef Poskanzer),
+# additions by janl at ifi.uio.no as well as others. Jan also suggested
+# merging several one- and two-line files into here.
+#
+# little magic: PCX (first byte is 0x0a)
+
+# Targa - matches `povray', `ppmtotga' and `xv' outputs
+# by Philippe De Muyter <phdm at macqel.be>
+# at 2, byte ImgType must be 1, 2, 3, 9, 10 or 11
+# at 1, byte CoMapType must be 1 if ImgType is 1 or 9, 0 otherwise
+# at 3, leshort Index is 0 for povray, ppmtotga and xv outputs
+# `xv' recognizes only a subset of the following (RGB with pixelsize = 24)
+# `tgatoppm' recognizes a superset (Index may be anything)
+1	belong&0xfff7ffff	0x01010000	Targa image data - Map
+>2	byte&8			8		- RLE
+>12	leshort			>0		%hd x
+>14	leshort			>0		%hd
+1	belong&0xfff7ffff	0x00020000	Targa image data - RGB
+>2	byte&8			8		- RLE
+>12	leshort			>0		%hd x
+>14	leshort			>0		%hd
+1	belong&0xfff7ffff	0x00030000	Targa image data - Mono
+>2	byte&8			8		- RLE
+>12	leshort			>0		%hd x
+>14	leshort			>0		%hd
+
+# PBMPLUS images
+# The next byte following the magic is always whitespace.
+0	string		P1		Netpbm PBM image text
+0	string		P2		Netpbm PGM image text
+0	string		P3		Netpbm PPM image text
+0	string		P4		Netpbm PBM "rawbits" image data
+0	string		P5		Netpbm PGM "rawbits" image data
+0	string		P6		Netpbm PPM "rawbits" image data
+0	string		P7		Netpbm PAM image file
+
+# From: bryanh at giraffe-data.com (Bryan Henderson)
+0	string		\117\072	Solitaire Image Recorder format
+>4	string		\013		MGI Type 11
+>4	string		\021		MGI Type 17
+0	string		.MDA		MicroDesign data
+>21	byte		48		version 2
+>21	byte		51		version 3
+0	string		.MDP		MicroDesign page data
+>21	byte		48		version 2
+>21	byte		51		version 3
+
+# NIFF (Navy Interchange File Format, a modification of TIFF) images
+0	string		IIN1		NIFF image data
+
+# Tag Image File Format, from Daniel Quinlan (quinlan at yggdrasil.com)
+# The second word of TIFF files is the TIFF version number, 42, which has
+# never changed.  The TIFF specification recommends testing for it.
+0	string		MM\x00\x2a	TIFF image data, big-endian
+0	string		II\x2a\x00	TIFF image data, little-endian
+
+# PNG [Portable Network Graphics, or "PNG's Not GIF"] images
+# (Greg Roelofs, newt at uchicago.edu)
+# (Albert Cahalan, acahalan at cs.uml.edu)
+#
+# 137 P N G \r \n ^Z \n [4-byte length] H E A D [HEAD data] [HEAD crc] ...
+#
+0	string		\x89PNG		PNG image data,
+>4	belong		!0x0d0a1a0a	CORRUPTED,
+>4	belong		0x0d0a1a0a
+>>16	belong		x		%ld x
+>>20	belong		x		%ld,
+>>24	byte		x		%d-bit
+>>25	byte		0		grayscale,
+>>25	byte		2		\b/color RGB,
+>>25	byte		3		colormap,
+>>25	byte		4		gray+alpha,
+>>25	byte		6		\b/color RGBA,
+#>>26	byte		0		deflate/32K,
+>>28	byte		0		non-interlaced
+>>28	byte		1		interlaced
+1	string		PNG		PNG image data, CORRUPTED
+
+# GIF
+0	string		GIF8		GIF image data
+>4	string		7a		\b, version 8%s,
+>4	string		9a		\b, version 8%s,
+>6	leshort		>0		%hd x
+>8	leshort		>0		%hd
+#>10	byte		&0x80		color mapped,
+#>10	byte&0x07	=0x00		2 colors
+#>10	byte&0x07	=0x01		4 colors
+#>10	byte&0x07	=0x02		8 colors
+#>10	byte&0x07	=0x03		16 colors
+#>10	byte&0x07	=0x04		32 colors
+#>10	byte&0x07	=0x05		64 colors
+#>10	byte&0x07	=0x06		128 colors
+#>10	byte&0x07	=0x07		256 colors
+
+# ITC (CMU WM) raster files.  It is essentially a byte-reversed Sun raster,
+# 1 plane, no encoding.
+0	string		\361\0\100\273	CMU window manager raster image data
+>4	lelong		>0		%d x
+>8	lelong		>0		%d,
+>12	lelong		>0		%d-bit
+
+# Magick Image File Format
+0	string		id=ImageMagick	MIFF image data
+
+# Artisan
+0	long		1123028772	Artisan image data
+>4	long		1		\b, rectangular 24-bit
+>4	long		2		\b, rectangular 8-bit with colormap
+>4	long		3		\b, rectangular 32-bit (24-bit with matte)
+
+# FIG (Facility for Interactive Generation of figures), an object-based format
+0	string		#FIG		FIG image text
+>5	string		x		\b, version %.3s
+
+# PHIGS
+0	string		ARF_BEGARF		PHIGS clear text archive
+0	string		@(#)SunPHIGS		SunPHIGS
+# version number follows, in the form m.n
+>40	string		SunBin			binary
+>32	string		archive			archive
+
+# GKS (Graphics Kernel System)
+0	string		GKSM		GKS Metafile
+>24	string		SunGKS		\b, SunGKS
+
+# CGM image files
+0	string		BEGMF		clear text Computer Graphics Metafile
+# XXX - questionable magic
+0	beshort&0xffe0	0x0020		binary Computer Graphics Metafile
+0	beshort		0x3020		character Computer Graphics Metafile
+
+# MGR bitmaps  (Michael Haardt, u31b3hs at pool.informatik.rwth-aachen.de)
+0	string	yz	MGR bitmap, modern format, 8-bit aligned
+0	string	zz	MGR bitmap, old format, 1-bit deep, 16-bit aligned
+0	string	xz	MGR bitmap, old format, 1-bit deep, 32-bit aligned
+0	string	yx	MGR bitmap, modern format, squeezed
+
+# Fuzzy Bitmap (FBM) images
+0	string		%bitmap\0	FBM image data
+>30	long		0x31		\b, mono
+>30	long		0x33		\b, color
+
+# facsimile data
+1	string		PC\ Research,\ Inc	group 3 fax data
+>29	byte		0		\b, normal resolution (204x98 DPI)
+>29	byte		1		\b, fine resolution (204x196 DPI)
+# From: Herbert Rosmanith <herp at wildsau.idv.uni.linz.at>
+0	string		Sfff		structured fax file
+
+
+# PC bitmaps (OS/2, Windoze BMP files)  (Greg Roelofs, newt at uchicago.edu)
+0	string		BM		PC bitmap data
+>14	leshort		12		\b, OS/2 1.x format
+>>18	leshort		x		\b, %d x
+>>20	leshort		x		%d
+>14	leshort		64		\b, OS/2 2.x format
+>>18	leshort		x		\b, %d x
+>>20	leshort		x		%d
+>14	leshort		40		\b, Windows 3.x format
+>>18	lelong		x		\b, %d x
+>>22	lelong		x		%d x
+>>28	leshort		x		%d
+# Too simple - MPi
+#0	string		IC		PC icon data
+#0	string		PI		PC pointer image data
+#0	string		CI		PC color icon data
+#0	string		CP		PC color pointer image data
+# Conflicts with other entries [BABYL]
+#0	string		BA		PC bitmap array data
+
+# XPM icons (Greg Roelofs, newt at uchicago.edu)
+# note possible collision with C/REXX entry in c-lang; currently commented out
+0	string		/*\ XPM\ */	X pixmap image text
+
+# Utah Raster Toolkit RLE images (janl at ifi.uio.no)
+0	leshort		0xcc52		RLE image data,
+>6	leshort		x		%d x
+>8	leshort		x		%d
+>2	leshort		>0		\b, lower left corner: %d
+>4	leshort		>0		\b, lower right corner: %d
+>10	byte&0x1	=0x1		\b, clear first
+>10	byte&0x2	=0x2		\b, no background
+>10	byte&0x4	=0x4		\b, alpha channel
+>10	byte&0x8	=0x8		\b, comment
+>11	byte		>0		\b, %d color channels
+>12	byte		>0		\b, %d bits per pixel
+>13	byte		>0		\b, %d color map channels
+
+# image file format (Robert Potter, potter at cs.rochester.edu)
+0	string		Imagefile\ version-	iff image data
+# this adds the whole header (inc. version number), informative but longish
+>10	string		>\0		%s
+
+# Sun raster images, from Daniel Quinlan (quinlan at yggdrasil.com)
+0	belong		0x59a66a95	Sun raster image data
+>4	belong		>0		\b, %d x
+>8	belong		>0		%d,
+>12	belong		>0		%d-bit,
+#>16	belong		>0		%d bytes long,
+>20	belong		0		old format,
+#>20	belong		1		standard,
+>20	belong		2		compressed,
+>20	belong		3		RGB,
+>20	belong		4		TIFF,
+>20	belong		5		IFF,
+>20	belong		0xffff		reserved for testing,
+>24	belong		0		no colormap
+>24	belong		1		RGB colormap
+>24	belong		2		raw colormap
+#>28	belong		>0		colormap is %d bytes long
+
+# SGI image file format, from Daniel Quinlan (quinlan at yggdrasil.com)
+#
+# See
+#	http://reality.sgi.com/grafica/sgiimage.html
+#
+0	beshort		474		SGI image data
+#>2	byte		0		\b, verbatim
+>2	byte		1		\b, RLE
+#>3	byte		1		\b, normal precision
+>3	byte		2		\b, high precision
+>4	beshort		x		\b, %d-D
+>6	beshort		x		\b, %d x
+>8	beshort		x		%d
+>10	beshort		x		\b, %d channel
+>10	beshort		!1		\bs
+>80	string		>0		\b, "%s"
+
+0	string		IT01		FIT image data
+>4	belong		x		\b, %d x
+>8	belong		x		%d x
+>12	belong		x		%d
+#
+0	string		IT02		FIT image data
+>4	belong		x		\b, %d x
+>8	belong		x		%d x
+>12	belong		x		%d
+#
+2048	string		PCD_IPI		Kodak Photo CD image pack file
+>0xe02	byte&0x03	0x00		, landscape mode
+>0xe02	byte&0x03	0x01		, portrait mode
+>0xe02	byte&0x03	0x02		, landscape mode
+>0xe02	byte&0x03	0x03		, portrait mode
+0	string		PCD_OPA		Kodak Photo CD overview pack file
+
+# FITS format.  Jeff Uphoff <juphoff at tarsier.cv.nrao.edu>
+# FITS is the Flexible Image Transport System, the de facto standard for
+# data and image transfer, storage, etc., for the astronomical community.
+# (FITS floating point formats are big-endian.)
+0	string	SIMPLE\ \ =	FITS image data
+>109	string	8		\b, 8-bit, character or unsigned binary integer
+>108	string	16		\b, 16-bit, two's complement binary integer
+>107	string	\ 32		\b, 32-bit, two's complement binary integer
+>107	string	-32		\b, 32-bit, floating point, single precision
+>107	string	-64		\b, 64-bit, floating point, double precision
+
+# other images
+0	string	This\ is\ a\ BitMap\ file	Lisp Machine bit-array-file
+0	string		!!		Bennet Yee's "face" format
+
+# From SunOS 5.5.1 "/etc/magic" - appeared right before Sun raster image
+# stuff.
+#
+0	beshort		0x1010		PEX Binary Archive
+
+# Visio drawings
+03000	string	Visio\ (TM)\ Drawing	%s
+
+# Tgif files
+0	string	\%TGIF\ x 		Tgif file version %s
+
+# DICOM medical imaging data
+128	string	DICM			DICOM medical imaging data
+
+# XWD - X Window Dump file.
+#   As described in /usr/X11R6/include/X11/XWDFile.h
+#   used by the xwd program.
+#   Bradford Castalia, idaeim, 1/01
+4	belong	7			XWD X Window Dump image data
+>100	string	>\0			\b, "%s"
+>16	belong	x			\b, %dx
+>20	belong	x			\b%dx
+>12	belong	x			\b%d
+
+# PDS - Planetary Data System
+#   These files use Parameter Value Language in the header section.
+#   Unfortunately, there is no certain magic, but the following
+#   strings have been found to be most likely.
+0	string	NJPL1I00		PDS (JPL) image data
+2	string	NJPL1I			PDS (JPL) image data
+0	string	CCSD3ZF			PDS (CCSD) image data
+2	string	CCSD3Z			PDS (CCSD) image data
+0	string	PDS_			PDS image data
+0	string	LBLSIZE=		PDS (VICAR) image data
+
+# pM8x: ATARI STAD compressed bitmap format
+#
+# from Oskar Schirmer <schirmer at scara.com> Feb 2, 2001
+# p M 8 5/6 xx yy zz data...
+# Atari ST STAD bitmap is always 640x400, bytewise runlength compressed.
+# bytes either run horizontally (pM85) or vertically (pM86). yy is the
+# most frequent byte, xx and zz are runlength escape codes, where xx is
+# used for runs of yy.
+#
+0	string	pM85		Atari ST STAD bitmap image data (hor)
+>5	byte	0x00		(white background)
+>5	byte	0xFF		(black background)
+0	string	pM86		Atari ST STAD bitmap image data (vert)
+>5	byte	0x00		(white background)
+>5	byte	0xFF		(black background)
+
+# XXX:
+# This is bad magic 0x5249 == 'RI' conflicts with RIFF and other
+# magic.
+# SGI RICE image file <mpruett at sgi.com>
+#0	beshort	0x5249		RICE image
+#>2	beshort	x		v%d
+#>4	beshort	x		(%d x
+#>6	beshort	x		%d)
+#>8	beshort	0		8 bit
+#>8	beshort	1		10 bit
+#>8	beshort	2		12 bit
+#>8	beshort	3		13 bit
+#>10	beshort	0		4:2:2
+#>10	beshort	1		4:2:2:4
+#>10	beshort	2		4:4:4
+#>10	beshort	3		4:4:4:4
+#>12	beshort	1		RGB
+#>12	beshort	2		CCIR601
+#>12	beshort	3		RP175
+#>12	beshort	4		YUV
+
+#------------------------------------------------------------------------------
+#
+# Marco Schmidt (marcoschmidt at users.sourceforge.net) -- an image  file format
+# for the EPOC operating system, which is used with PDAs like those from Psion
+#
+# see http://huizen.dds.nl/~frodol/psiconv/html/Index.html for a description
+# of various EPOC file formats
+
+0	string \x37\x00\x00\x10\x42\x00\x00\x10\x00\x00\x00\x00\x39\x64\x39\x47 EPOC MBM image file
+
+# PCX image files
+# From: Dan Fandrich <dan at coneharvesters.com>
+0	beshort		0x0a00	PCX ver. 2.5 image data
+0	beshort		0x0a02	PCX ver. 2.8 image data, with palette
+0	beshort		0x0a03	PCX ver. 2.8 image data, without palette
+0	beshort		0x0a04	PCX for Windows image data
+0	beshort		0x0a05	PCX ver. 3.0 image data
+>4	leshort		x      bounding box [%hd,
+>6	leshort		x      %hd] -
+>8	leshort		x      [%hd,
+>10	leshort		x      %hd],
+>65	byte		>1	%d planes each of
+>3	byte		x	%hhd-bit
+>68	byte		0	image,
+>68	byte		1	colour,
+>68	byte		2	grayscale,
+>68	byte		>2	image,
+>68	byte		<0	image,
+>12	leshort		>0	%hd x
+>>14	leshort		x      %hd dpi,
+>2	byte		0	uncompressed
+>2	byte		1	RLE compressed
+
+# Adobe Photoshop
+0	string		8BPS Adobe Photoshop Image
+
+# XV thumbnail indicator (ThMO)
+0	string		P7\ 332		XV thumbnail image data
+
+# NITF is defined by United States MIL-STD-2500A
+0	string	NITF	National Imagery Transmission Format
+>25	string	>\0	dated %.14s
+
+# GEM Image: Version 1, Headerlen 8 (Wolfram Kleff)
+0	belong		0x00010008	GEM Image data
+>12	beshort		x		%d x
+>14	beshort		x		%d,
+>4	beshort		x		%d planes,
+>8	beshort		x		%d x
+>10	beshort		x		%d pixelsize
+
+# GEM Metafile (Wolfram Kleff)
+0	lelong		0x0018FFFF	GEM Metafile data
+>4	leshort		x		version %d
+
+#
+# SMJPEG. A custom Motion JPEG format used by Loki Entertainment
+# Software Torbjorn Andersson <d91tan at Update.UU.SE>.
+#
+0	string	\0\nSMJPEG	SMJPEG
+>8	belong	x		%d.x data
+# According to the specification you could find any number of _TXT
+# headers here, but I can't think of any way of handling that. None of
+# the SMJPEG files I tried it on used this feature. Even if such a
+# file is encountered the output should still be reasonable.
+>16	string	_SND		\b,
+>>24	beshort	>0		%d Hz
+>>26	byte	8		8-bit
+>>26	byte	16		16-bit
+>>28	string	NONE		uncompressed
+# >>28	string	APCM		ADPCM compressed
+>>27	byte	1		mono
+>>28	byte	2		stereo
+# Help! Isn't there any way to avoid writing this part twice?
+>>32	string	_VID		\b,
+# >>>48	string	JFIF		JPEG
+>>>40	belong	>0		%d frames
+>>>44	beshort	>0		(%d x
+>>>46	beshort	>0		%d)
+>16	string	_VID		\b,
+# >>32	string	JFIF		JPEG
+>>24	belong	>0		%d frames
+>>28	beshort	>0		(%d x
+>>30	beshort	>0		%d)
+
+0	string	Paint\ Shop\ Pro\ Image\ File	Paint Shop Pro Image File
+
+# "thumbnail file" (icon)
+# descended from "xv", but in use by other applications as well (Wolfram Kleff)
+0       string          P7\ 332         XV "thumbnail file" (icon) data
+
+# taken from fkiss: (<yav at mte.biglobe.ne.jp> ?)
+0       string          KiSS            KISS/GS
+>4      byte            16              color
+>>5     byte            x               %d bit
+>>8     leshort         x               %d colors
+>>10    leshort         x               %d groups
+>4      byte            32              cell
+>>5     byte            x               %d bit
+>>8     leshort         x               %d x
+>>10    leshort         x               %d
+>>12    leshort         x               +%d
+>>14    leshort         x               +%d
+
+# Webshots (www.webshots.com), by John Harrison
+0       string          C\253\221g\230\0\0\0 Webshots Desktop .wbz file
+
+# Hercules DASD image files
+# From Jan Jaeger <jj at septa.nl>
+0       string  CKD_P370        Hercules CKD DASD image file
+>8      long    x               \b, %d heads per cylinder
+>12     long    x               \b, track size %d bytes
+>16     byte    x               \b, device type 33%2.2X
+
+0       string  CKD_C370        Hercules compressed CKD DASD image file
+>8      long    x               \b, %d heads per cylinder
+>12     long    x               \b, track size %d bytes
+>16     byte    x               \b, device type 33%2.2X
+
+0       string  CKD_S370        Hercules CKD DASD shadow file
+>8      long    x               \b, %d heads per cylinder
+>12     long    x               \b, track size %d bytes
+>16     byte    x               \b, device type 33%2.2X
+
+# Squeak images and - etoffi at softhome.net
+0 string \146\031\0\0  Squeak image data
+0 string 'From\040Squeak  Squeak program text
+
+# partimage: file(1) magic for PartImage files (experimental, incomplete)
+# Author: Hans-Joachim Baader <hjb at pro-linux.de>
+0		string	PaRtImAgE-VoLuMe	PartImage
+>0x0020		string	0.6.1		file version %s
+>>0x0060	lelong	>-1		volume %ld
+#>>0x0064 8 byte identifier
+#>>0x007c reserved
+>>0x0200	string	>\0		type %s
+>>0x1400	string	>\0		device %s,
+>>0x1600	string	>\0		original filename %s,
+# Some fields omitted
+>>0x2744	lelong	0		not compressed
+>>0x2744	lelong	1		gzip compressed
+>>0x2744	lelong	2		bzip2 compressed
+>>0x2744	lelong	>2		compressed with unknown algorithm
+>0x0020		string	>0.6.1		file version %s
+>0x0020		string	<0.6.1		file version %s
+
+# DCX is multi-page PCX, using a simple header of up to 1024
+# offsets for the respective PCX components.
+# From: Joerg Wunsch <joerg_wunsch at uriah.heep.sax.de>
+0	lelong	987654321	DCX multi-page PCX image data
+
+# Simon Walton <simonw at matteworld.com>
+# Kodak Cineon format for scanned negatives
+# http://www.kodak.com/US/en/motion/support/dlad/
+0	lelong  0xd75f2a80	Cineon image data
+>200	belong  >0		\b, %ld x
+>204	belong  >0		%ld
+
+# From Jan "Yenya" Kasprzak <kas at fi.muni.cz>
+# The description of *.mrw format can be found at
+# http://www.dalibor.cz/minolta/raw_file_format.htm
+0	string	\000MRM			Minolta Dimage camera raw image data
+
+# From: stephane.loeuillet at tiscali.f
+# http://www.djvuzone.org/
+0	string	AT&TFORM		DjVu Image file
+
+# From: Jason Bacon <bacon at smithers.neuro.mcw.edu>
+0	beshort	0x3020			character Computer Graphics Metafile
+
+
+#------------------------------------------------------------------------------
+# intel:  file(1) magic for x86 Unix
+#
+# Various flavors of x86 UNIX executable/object (other than Xenix, which
+# is in "microsoft").  DOS is in "msdos"; the ambitious soul can do
+# Windows as well.
+#
+# Windows NT belongs elsewhere, as you need x86 and MIPS and Alpha and
+# whatever comes next (HP-PA Hummingbird?).  OS/2 may also go elsewhere
+# as well, if, as, and when IBM makes it portable.
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0	leshort		0502		basic-16 executable
+>12	lelong		>0		not stripped
+#>22	leshort		>0		- version %ld
+0	leshort		0503		basic-16 executable (TV)
+>12	lelong		>0		not stripped
+#>22	leshort		>0		- version %ld
+0	leshort		0510		x86 executable
+>12	lelong		>0		not stripped
+0	leshort		0511		x86 executable (TV)
+>12	lelong		>0		not stripped
+0	leshort		=0512		iAPX 286 executable small model (COFF)
+>12	lelong		>0		not stripped
+#>22	leshort		>0		- version %ld
+0	leshort		=0522		iAPX 286 executable large model (COFF)
+>12	lelong		>0		not stripped
+#>22	leshort		>0		- version %ld
+# SGI labeled the next entry as "iAPX 386 executable" --Dan Quinlan
+0	leshort		=0514		80386 COFF executable
+>12	lelong		>0		not stripped
+>22	leshort		>0		- version %ld
+
+# rom: file(1) magic for BIOS ROM Extensions found in intel machines
+#      mapped into memory between 0xC0000 and 0xFFFFF
+# From Gürkan Sengün <gurkan at linuks.mine.nu>, www.linuks.mine.nu
+0        beshort         0x55AA       BIOS (ia32) ROM Ext.
+>5       string          USB          USB
+>7       string          LDR          UNDI image
+>30      string          IBM          IBM comp. Video
+>26      string          Adaptec      Adaptec
+>28      string          Adaptec      Adaptec
+>42      string          PROMISE      Promise
+>2       byte            x            (%d*512)
+
+#------------------------------------------------------------------------------
+# interleaf:  file(1) magic for InterLeaf TPS:
+#
+0	string		=\210OPS	Interleaf saved data
+0	string		=<!OPS		Interleaf document text
+>5	string		,\ Version\ =	\b, version
+>>17	string		>\0		%.3s
+
+#------------------------------------------------------------------------------
+# island:  file(1) magic for IslandWite/IslandDraw, from SunOS 5.5.1
+# "/etc/magic":
+# From: guy at netapp.com (Guy Harris)
+#
+4	string		pgscriptver	IslandWrite document
+13	string		DrawFile	IslandDraw document
+
+
+#------------------------------------------------------------------------------
+# ispell:  file(1) magic for ispell
+#
+# Ispell 3.0 has a magic of 0x9601 and ispell 3.1 has 0x9602.  This magic
+# will match 0x9600 through 0x9603 in *both* little endian and big endian.
+# (No other current magic entries collide.)
+#
+# Updated by Daniel Quinlan (quinlan at yggdrasil.com)
+#
+0	leshort&0xFFFC	0x9600		little endian ispell
+>0	byte		0		hash file (?),
+>0	byte		1		3.0 hash file,
+>0	byte		2		3.1 hash file,
+>0	byte		3		hash file (?),
+>2	leshort		0x00		8-bit, no capitalization, 26 flags
+>2	leshort		0x01		7-bit, no capitalization, 26 flags
+>2	leshort		0x02		8-bit, capitalization, 26 flags
+>2	leshort		0x03		7-bit, capitalization, 26 flags
+>2	leshort		0x04		8-bit, no capitalization, 52 flags
+>2	leshort		0x05		7-bit, no capitalization, 52 flags
+>2	leshort		0x06		8-bit, capitalization, 52 flags
+>2	leshort		0x07		7-bit, capitalization, 52 flags
+>2	leshort		0x08		8-bit, no capitalization, 128 flags
+>2	leshort		0x09		7-bit, no capitalization, 128 flags
+>2	leshort		0x0A		8-bit, capitalization, 128 flags
+>2	leshort		0x0B		7-bit, capitalization, 128 flags
+>2	leshort		0x0C		8-bit, no capitalization, 256 flags
+>2	leshort		0x0D		7-bit, no capitalization, 256 flags
+>2	leshort		0x0E		8-bit, capitalization, 256 flags
+>2	leshort		0x0F		7-bit, capitalization, 256 flags
+>4	leshort		>0		and %d string characters
+0	beshort&0xFFFC	0x9600		big endian ispell
+>1	byte		0		hash file (?),
+>1	byte		1		3.0 hash file,
+>1	byte		2		3.1 hash file,
+>1	byte		3		hash file (?),
+>2	beshort		0x00		8-bit, no capitalization, 26 flags
+>2	beshort		0x01		7-bit, no capitalization, 26 flags
+>2	beshort		0x02		8-bit, capitalization, 26 flags
+>2	beshort		0x03		7-bit, capitalization, 26 flags
+>2	beshort		0x04		8-bit, no capitalization, 52 flags
+>2	beshort		0x05		7-bit, no capitalization, 52 flags
+>2	beshort		0x06		8-bit, capitalization, 52 flags
+>2	beshort		0x07		7-bit, capitalization, 52 flags
+>2	beshort		0x08		8-bit, no capitalization, 128 flags
+>2	beshort		0x09		7-bit, no capitalization, 128 flags
+>2	beshort		0x0A		8-bit, capitalization, 128 flags
+>2	beshort		0x0B		7-bit, capitalization, 128 flags
+>2	beshort		0x0C		8-bit, no capitalization, 256 flags
+>2	beshort		0x0D		7-bit, no capitalization, 256 flags
+>2	beshort		0x0E		8-bit, capitalization, 256 flags
+>2	beshort		0x0F		7-bit, capitalization, 256 flags
+>4	beshort		>0		and %d string characters
+# ispell 4.0 hash files  kromJx <kromJx at crosswinds.net>
+# Ispell 4.0
+0       string          ISPL            ispell
+>4      long            x               hash file version %d,
+>8      long            x               lexletters %d,
+>12     long            x               lexsize %d,
+>16     long            x               hashsize %d,
+>20     long            x               stblsize %d
+#------------------------------------------------------------
+# Java ByteCode
+# From Larry Schwimmer (schwim at cs.stanford.edu)
+0	belong		0xcafebabe	compiled Java class data,
+>6	beshort x	version %d.
+>4	beshort x	\b%d
+#------------------------------------------------------------
+# Java serialization
+# From Martin Pool (m.pool at pharos.com.au)
+0	beshort		0xaced		Java serialization data
+>2	beshort		>0x0004		\b, version %d
+
+#------------------------------------------------------------------------------
+# JPEG images
+# SunOS 5.5.1 had
+#
+#	0	string		\377\330\377\340	JPEG file
+#	0	string		\377\330\377\356	JPG file
+#
+# both of which turn into "JPEG image data" here.
+#
+0	beshort		0xffd8		JPEG image data
+>6	string		JFIF		\b, JFIF standard
+>6	string		Exif		\b, EXIF standard
+# The following added by Erik Rossen <rossen at freesurf.ch> 1999-09-06
+# in a vain attempt to add image size reporting for JFIF.  Note that these
+# tests are not fool-proof since some perfectly valid JPEGs are currently
+# impossible to specify in magic(4) format.
+# First, a little JFIF version info:
+>11	byte		x		\b %d.
+>12	byte		x		\b%02d
+# Next, the resolution or aspect ratio of the image:
+#>13	byte		0		\b, aspect ratio
+#>13	byte		1		\b, resolution (DPI)
+#>13	byte		2		\b, resolution (DPCM)
+#>4	beshort		x		\b, segment length %d
+# Next, show thumbnail info, if it exists:
+>18	byte		!0		\b, thumbnail %dx
+>>19	byte		x		\b%d
+# Here things get sticky.  We can do ONE MORE marker segment with
+# indirect addressing, and that's all.  It would be great if we could
+# do pointer arithemetic like in an assembler language.  Christos?
+# And if there was some sort of looping construct to do searches, plus a few
+# named accumulators, it would be even more effective...
+# At least we can show a comment if no other segments got inserted before:
+>(4.S+5)	byte		0xFE
+>>(4.S+8)	string		>\0		\b, "%s"
+#>(4.S+5)	byte		0xFE		\b, comment
+#>>(4.S+6)	beshort		x		\b length=%d
+#>>(4.S+8)	string		>\0		\b, "%s"
+# Or, we can show the encoding type (I've included only the three most common)
+# and image dimensions if we are lucky and the SOFn (image segment) is here:
+>(4.S+5)	byte		0xC0		\b, baseline
+>>(4.S+6)	byte		x		\b, precision %d
+>>(4.S+7)	beshort		x		\b, %dx
+>>(4.S+9)	beshort		x		\b%d
+>(4.S+5)	byte		0xC1		\b, extended sequential
+>>(4.S+6)	byte		x		\b, precision %d
+>>(4.S+7)	beshort		x		\b, %dx
+>>(4.S+9)	beshort		x		\b%d
+>(4.S+5)	byte		0xC2		\b, progressive
+>>(4.S+6)	byte		x		\b, precision %d
+>>(4.S+7)	beshort		x		\b, %dx
+>>(4.S+9)	beshort		x		\b%d
+# I've commented-out quantisation table reporting.  I doubt anyone cares yet.
+#>(4.S+5)	byte		0xDB		\b, quantisation table
+#>>(4.S+6)	beshort		x		\b length=%d
+#>14	beshort		x		\b, %d x
+#>16	beshort		x		\b %d
+
+# HSI is Handmade Software's proprietary JPEG encoding scheme
+0	string		hsi1		JPEG image data, HSI proprietary
+
+# From: David Santinoli <david at santinoli.com>
+0	string		\x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A	JPEG 2000 image data
+
+#------------------------------------------------------------------------------
+# karma:  file(1) magic for Karma data files
+#
+# From <rgooch at atnf.csiro.au>
+
+0	string		KarmaRHD Version	Karma Data Structure Version
+>16	belong		x		%lu
+#------------------------------------------------------------------------------
+# DEC SRC Virtual Paper: Lectern files
+# Karl M. Hegbloom <karlheg at inetarena.com>
+0	string	lect	DEC SRC Virtual Paper Lectern file
+
+#------------------------------------------------------------------------------
+# lex:  file(1) magic for lex
+#
+#	derived empirically, your offsets may vary!
+53	string		yyprevious	C program text (from lex)
+>3	string		>\0		 for %s
+# C program text from GNU flex, from Daniel Quinlan <quinlan at yggdrasil.com>
+21	string		generated\ by\ flex	C program text (from flex)
+# lex description file, from Daniel Quinlan <quinlan at yggdrasil.com>
+0	string		%{		lex description text
+
+#------------------------------------------------------------------------------
+# lif:  file(1) magic for lif
+#
+# (Daniel Quinlan <quinlan at yggdrasil.com>)
+#
+0	beshort		0x8000		lif file
+
+#------------------------------------------------------------------------------
+# linux:  file(1) magic for Linux files
+#
+# Values for Linux/i386 binaries, from Daniel Quinlan <quinlan at yggdrasil.com>
+# The following basic Linux magic is useful for reference, but using
+# "long" magic is a better practice in order to avoid collisions.
+#
+# 2	leshort		100		Linux/i386
+# >0	leshort		0407		impure executable (OMAGIC)
+# >0	leshort		0410		pure executable (NMAGIC)
+# >0	leshort		0413		demand-paged executable (ZMAGIC)
+# >0	leshort		0314		demand-paged executable (QMAGIC)
+#
+0	lelong		0x00640107	Linux/i386 impure executable (OMAGIC)
+>16	lelong		0		\b, stripped
+0	lelong		0x00640108	Linux/i386 pure executable (NMAGIC)
+>16	lelong		0		\b, stripped
+0	lelong		0x0064010b	Linux/i386 demand-paged executable (ZMAGIC)
+>16	lelong		0		\b, stripped
+0	lelong		0x006400cc	Linux/i386 demand-paged executable (QMAGIC)
+>16	lelong		0		\b, stripped
+#
+0	string		\007\001\000	Linux/i386 object file
+>20	lelong		>0x1020		\b, DLL library
+# Linux-8086 stuff:
+0	string		\01\03\020\04	Linux-8086 impure executable
+>28	long		!0		not stripped
+0	string		\01\03\040\04	Linux-8086 executable
+>28	long		!0		not stripped
+#
+0	string		\243\206\001\0	Linux-8086 object file
+#
+0	string		\01\03\020\20	Minix-386 impure executable
+>28	long		!0		not stripped
+0	string		\01\03\040\20	Minix-386 executable
+>28	long		!0		not stripped
+# core dump file, from Bill Reynolds <bill at goshawk.lanl.gov>
+216	lelong		0421		Linux/i386 core file
+>220	string		>\0		of '%s'
+>200	lelong		>0		(signal %d)
+#
+# LILO boot/chain loaders, from Daniel Quinlan <quinlan at yggdrasil.com>
+# this can be overridden by the DOS executable (COM) entry
+2	string		LILO		Linux/i386 LILO boot/chain loader
+#
+# PSF fonts, from H. Peter Anvin <hpa at yggdrasil.com>
+0	leshort		0x0436		Linux/i386 PC Screen Font data,
+>2	byte		0		256 characters, no directory,
+>2	byte		1		512 characters, no directory,
+>2	byte		2		256 characters, Unicode directory,
+>2	byte		3		512 characters, Unicode directory,
+>3	byte		>0		8x%d
+# Linux swap file, from Daniel Quinlan <quinlan at yggdrasil.com>
+4086	string		SWAP-SPACE	Linux/i386 swap file
+# according to man page of mkswap (8) March 1999
+4086	string		SWAPSPACE2	Linux/i386 swap file (new style)
+>0x400	long		x		%d (4K pages)
+>0x404	long		x		size %d pages
+# ECOFF magic for OSF/1 and Linux (only tested under Linux though)
+#
+#	from Erik Troan (ewt at redhat.com) examining od dumps, so this
+#		could be wrong
+#      updated by David Mosberger (davidm at azstarnet.com) based on
+#      GNU BFD and MIPS info found below.
+#
+0	leshort		0x0183		ECOFF alpha
+>24	leshort		0407		executable
+>24	leshort		0410		pure
+>24	leshort		0413		demand paged
+>8	long		>0		not stripped
+>8	long		0		stripped
+>23	leshort		>0		- version %ld.
+#
+# Linux kernel boot images, from Albert Cahalan <acahalan at cs.uml.edu>
+# and others such as Axel Kohlmeyer <akohlmey at rincewind.chemie.uni-ulm.de>
+# and Nicol�s Lichtmaier <nick at debian.org>
+# All known start with: b8 c0 07 8e d8 b8 00 90 8e c0 b9 00 01 29 f6 29
+# Linux kernel boot images (i386 arch) (Wolfram Kleff)
+#514	string		HdrS		Linux kernel
+#>510	leshort		0xAA55		x86 boot executable
+#>>518	leshort		>=3D0x200
+#>>529	byte		0		zImage,
+#>>>529	byte		1		bzImage,
+#>>>(526.s+0x200) string	>\0		version %s,
+#>>498	leshort		1		RO-rootFS,
+#>>498	leshort		0		RW-rootFS,
+#>>508	leshort		>0		root_dev 0x%X,
+#>>502	leshort		>0		swap_dev 0x%X,
+#>>504	leshort		>0		RAMdisksize %u KB,
+#>>506	leshort		0xFFFF		Normal VGA
+#>>506	leshort		0xFFFE		Extended VGA
+#>>506	leshort		0xFFFD		Prompt for Videomode
+#>>506	leshort		>0		Video mode %d
+# This also matches new kernels, which were caught above by "HdrS".
+#0		belong	0xb8c0078e	Linux kernel
+#>0x1e3		string	Loading		version 1.3.79 or older
+#>0x1e9		string	Loading		from prehistoric times
+
+# System.map files - Nicol�s Lichtmaier <nick at debian.org>
+8	string	\ A\ _text	Linux kernel symbol map text
+
+# LSM entries - Nicol�s Lichtmaier <nick at debian.org>
+0	string	Begin3	Linux Software Map entry text
+0	string	Begin4	Linux Software Map entry text (new format)
+
+# From Matt Zimmerman
+0       belong  0x4f4f4f4d      User-mode Linux COW file
+>4      belong  x               \b, version %d
+>8      string  >\0             \b, backing file %s
+
+############################################################################
+# Linux kernel versions
+
+0		string		\xb8\xc0\x07\x8e\xd8\xb8\x00\x90	Linux
+>497		leshort		0		x86 boot sector
+>>514		belong		0x8e	of a kernel from the dawn of time!
+>>514		belong		0x908ed8b4	version 0.99-1.1.42
+>>514		belong		0x908ed8b8	for memtest86
+
+>497		leshort		!0		x86 kernel
+>>504		leshort		>0		RAMdisksize=%u KB
+>>502		leshort		>0		swap=0x%X
+>>508		leshort		>0		root=0x%X
+>>>498		leshort		1		\b-ro
+>>>498		leshort		0		\b-rw
+>>506		leshort		0xFFFF		vga=normal
+>>506		leshort		0xFFFE		vga=extended
+>>506		leshort		0xFFFD		vga=ask
+>>506		leshort		>0		vga=%d
+>>514		belong		0x908ed881	version 1.1.43-1.1.45
+>>514		belong		0x15b281cd
+>>>0xa8e	belong		0x55AA5a5a	version 1.1.46-1.2.13,1.3.0
+>>>0xa99	belong		0x55AA5a5a	version 1.3.1,2
+>>>0xaa3	belong		0x55AA5a5a	version 1.3.3-1.3.30
+>>>0xaa6	belong		0x55AA5a5a	version 1.3.31-1.3.41
+>>>0xb2b	belong		0x55AA5a5a	version 1.3.42-1.3.45
+>>>0xaf7	belong		0x55AA5a5a	version 1.3.46-1.3.72
+>>514		string		HdrS
+>>>518		leshort		>0x1FF
+>>>>529		byte		0		\b, zImage
+>>>>529		byte		1		\b, bzImage
+>>>>(526.s+0x200) string 	>\0		\b, version %s
+
+# Linux boot sector thefts.
+0		belong		0xb8c0078e	Linux
+>0x1e6		belong		0x454c4b53	ELKS Kernel
+>0x1e6		belong		!0x454c4b53	style boot sector
+
+############################################################################
+# Linux 8086 executable
+0	lelong&0xFF0000FF 0xC30000E9	Linux-Dev86 executable, headerless
+>5	string		.		
+>>4	string		>\0		\b, libc version %s
+
+0	lelong&0xFF00FFFF 0x4000301	Linux-8086 executable
+>2	byte&0x01	!0		\b, unmapped zero page
+>2	byte&0x20	0		\b, impure
+>2	byte&0x20	!0
+>>2	byte&0x10	!0		\b, A_EXEC
+>2	byte&0x02	!0		\b, A_PAL
+>2	byte&0x04	!0		\b, A_NSYM
+>2	byte&0x08	!0		\b, A_STAND
+>2	byte&0x40	!0		\b, A_PURE
+>2	byte&0x80	!0		\b, A_TOVLY
+>28     long            !0              \b, not stripped
+>37	string		.		
+>>36	string		>\0		\b, libc version %s
+
+# 0	lelong&0xFF00FFFF 0x10000301	ld86 I80386 executable
+# 0	lelong&0xFF00FFFF 0xB000301	ld86 M68K executable
+# 0	lelong&0xFF00FFFF 0xC000301	ld86 NS16K executable
+# 0	lelong&0xFF00FFFF 0x17000301	ld86 SPARC executable
+
+
+#------------------------------------------------------------------------------
+# lisp:  file(1) magic for lisp programs
+#
+# various lisp types, from Daniel Quinlan (quinlan at yggdrasil.com)
+
+# This is a guess, but a good one.
+0	string	;;			Lisp/Scheme program text
+
+# Emacs 18 - this is always correct, but not very magical.
+0	string	\012(			Emacs v18 byte-compiled Lisp data
+# Emacs 19+ - ver. recognition added by Ian Springer
+# Also applies to XEmacs 19+ .elc files; could tell them apart if we had regexp
+# support or similar - Chris Chittleborough <cchittleborough at yahoo.com.au>
+0	string	;ELC			
+>4	byte	>19			
+>4	byte    <32			Emacs/XEmacs v%d byte-compiled Lisp data
+
+# Files produced by CLISP Common Lisp From: Bruno Haible <haible at ilog.fr>
+0	string	(SYSTEM::VERSION\040'	CLISP byte-compiled Lisp program text
+0	long	0x70768BD2		CLISP memory image data
+0	long	0xD28B7670		CLISP memory image data, other endian
+
+# Files produced by GNU gettext
+0	long	0xDE120495		GNU-format message catalog data
+0	long	0x950412DE		GNU-format message catalog data
+
+#.com and .bin for MIT scheme 
+0	string	\372\372\372\372	MIT scheme (library?)
+
+# From: David Allouche <david at allouche.net>
+0	string	\<TeXmacs|	TeXmacs document text
+#------------------------------------------------------------------------------
+# mach file description
+#
+0	belong		0xcafebabe	Mach-O fat file
+>4	belong		1		with 1 architecture
+>4	belong		>1
+>>4	belong		x		with %ld architectures		
+#
+0	belong		0xfeedface	Mach-O
+>12	belong		1		object
+>12	belong		2		executable
+>12	belong		3		shared library
+>12	belong		4		core
+>12	belong		5		preload executable
+>12	belong		6               dynamically linked shared library
+>12	belong		7               dynamic linker
+>12	belong		8		bundle
+>12	belong		>8
+>>12	belong		x		filetype=%ld
+>4	belong		<0
+>>4	belong		x		architecture=%ld
+>4	belong		1		vax
+>4	belong		2		romp
+>4	belong		3		architecture=3
+>4	belong		4		ns32032
+>4	belong		5		ns32332
+>4	belong		6		for m68k architecture
+# from NeXTstep 3.0 <mach/machine.h>
+# i.e. mc680x0_all, ignore
+# >>8	belong		1		(mc68030)
+>>8	belong		2		(mc68040)
+>>8	belong		3		(mc68030 only)
+>4	belong		7		i386
+>4	belong		8		mips
+>4	belong		9		ns32532
+>4	belong		10		architecture=10
+>4	belong		11		hp pa-risc
+>4	belong		12		acorn
+>4	belong		13		m88k
+>4	belong		14		SPARC
+>4	belong		15		i860-big
+>4	belong		16		i860
+>4	belong		17		rs6000
+>4	belong		18		ppc
+>4	belong		>18
+>>4	belong		x		architecture=%ld
+
+#------------------------------------------------------------------------------
+# magic:  file(1) magic for magic files
+#
+0	string		#\ Magic	magic text file for file(1) cmd
+0	lelong		0xF11E041C	magic binary file for file(1) cmd
+>4	lelong		x		(version %d) (little endian)
+0	belong		0xF11E041C	magic binary file for file(1) cmd
+>4	belong		x		(version %d) (big endian)
+
+#------------------------------------------------------------------------------
+# mail.news:  file(1) magic for mail and news
+#
+# Unfortunately, saved netnews also has From line added in some news software.
+#0	string		From 		mail text
+# There are tests to ascmagic.c to cope with mail and news.
+0	string		Relay-Version: 	old news text
+0	string		#!\ rnews	batched news text
+0	string		N#!\ rnews	mailed, batched news text
+0	string		Forward\ to 	mail forwarding text
+0	string		Pipe\ to 	mail piping text
+0	string		Return-Path:	smtp mail text
+0	string		Path:		news text
+0	string		Xref:		news text
+0	string		From:		news or mail text
+0	string		Article 	saved news text
+0	string		BABYL		Emacs RMAIL text
+0	string		Received:	RFC 822 mail text
+0	string		MIME-Version:	MIME entity text
+#0	string		Content-	MIME entity text
+
+# TNEF files...
+0	lelong		0x223E9F78	Transport Neutral Encapsulation Format
+
+# From: Kevin Sullivan <ksulliva at psc.edu>
+0	string		*mbx*		MBX mail folder
+
+# From: Simon Matter <simon.matter at invoca.ch>
+0	string		\241\002\213\015skiplist\ file\0\0\0	Cyrus skiplist DB
+
+# JAM(mbp) Fidonet message area databases
+# JHR file
+0	string	JAM\0			JAM message area header file
+>12	leshort >0			(%d messages)
+
+# Squish Fidonet message area databases
+# SQD file (requires at least one message in the area)
+256	leshort	0xAFAE4453		Squish message area data file
+>4	leshort	>0			(%d messages)
+
+#------------------------------------------------------------------------------
+# maple:  file(1) magic for maple files
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Maple V release 4, a multi-purpose math program
+#
+
+# maple library .lib
+0	string	\000MVR4\nI	MapleVr4 library
+
+# .ind
+# no magic for these :-(
+# they are compiled indexes for maple files
+
+# .hdb 
+0	string	\000\004\000\000	Maple help database
+
+# .mhp
+# this has the form <PACKAGE=name>
+0	string	\<PACKAGE=	Maple help file
+0	string	\<HELP\ NAME=	Maple help file
+0	string	\n\<HELP\ NAME=	Maple help file with extra carriage return at start (yuck)
+#0	string	#\ Newton	Maple help file, old style
+0	string	#\ daub	Maple help file, old style
+#0	string	#===========	Maple help file, old style
+
+# .mws
+0	string	\000\000\001\044\000\221	Maple worksheet
+#this is anomalous
+0	string	WriteNow\000\002\000\001\000\000\000\000\100\000\000\000\000\000	Maple worksheet, but weird
+# this has the form {VERSION 2 3 "IBM INTEL NT" "2.3" }\n
+# that is {VERSION major_version miunor_version computer_type version_string}
+0	string	{VERSION\ 	Maple worksheet
+>9	string	>\0	version %.1s.
+>>10	string
+>>>11	string	>\0	%.1s
+
+# .mps
+0	string	\0\0\001$	Maple something
+# from byte 4 it is either 'nul E' or 'soh R'
+# I think 'nul E' means a file that was saved as  a different name
+# a sort of revision marking
+# 'soh R' means new 
+>4	string	\000\105	An old revision
+>4	string	\001\122	The latest save
+
+# .mpl
+# some of these are the same as .mps above
+#0000000 000 000 001 044 000 105 same as .mps
+#0000000 000 000 001 044 001 122 same as .mps
+
+0	string	#\n##\ <SHAREFILE=	Maple something
+0	string	\n#\n##\ <SHAREFILE=	Maple something
+0	string	##\ <SHAREFILE=	Maple something
+0	string	#\r##\ <SHAREFILE=	Maple something
+0	string	\r#\r##\ <SHAREFILE=	Maple something
+0	string	#\ \r##\ <DESCRIBE>	Maple something anomalous.
+
+#------------------------------------------------------------------------------
+# mathematica:  file(1) magic for mathematica files
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Mathematica a multi-purpose math program
+# versions 2.2 and 3.0
+
+#mathematica .mb
+0	string	\064\024\012\000\035\000\000\000	Mathematica version 2 notebook
+0	string	\064\024\011\000\035\000\000\000	Mathematica version 2 notebook
+
+# .ma
+# multiple possibilites:
+
+0	string	(*^\n\n::[\011frontEndVersion\ =\ 	Mathematica notebook
+#>41	string	>\0	%s
+
+#0	string	(*^\n\n::[\011palette	Mathematica notebook version 2.x
+
+#0	string	(*^\n\n::[\011Information	Mathematica notebook version 2.x
+#>675	string	>\0	%s #doesn't work well
+
+# there may be 'cr' instread of 'nl' in some does this matter?
+
+# generic:
+0	string	(*^\r\r::[\011	Mathematica notebook version 2.x
+0	string	\(\*\^\r\n\r\n\:\:\[\011	Mathematica notebook version 2.x
+0	string	(*^\015			Mathematica notebook version 2.x
+0	string	(*^\n\r\n\r::[\011	Mathematica notebook version 2.x
+0	string	(*^\r::[\011	Mathematica notebook version 2.x
+0	string	(*^\r\n::[\011	Mathematica notebook version 2.x
+0	string	(*^\n\n::[\011	Mathematica notebook version 2.x
+0	string	(*^\n::[\011	Mathematica notebook version 2.x
+
+
+# Mathematica .mx files
+
+#0	string	(*This\ is\ a\ Mathematica\ binary\ dump\ file.\ It\ can\ be\ loaded\ with\ Get.*)	Mathematica binary file
+0	string	(*This\ is\ a\ Mathematica\ binary\ 	Mathematica binary file
+#>71	string \000\010\010\010\010\000\000\000\000\000\000\010\100\010\000\000\000	
+# >71... is optional
+>88	string	>\0	from %s
+
+
+# Mathematica files PBF:
+# 115 115 101 120 102 106 000 001 000 000 000 203 000 001 000
+0	string	MMAPBF\000\001\000\000\000\203\000\001\000	Mathematica PBF (fonts I think)
+
+# .ml files  These are menu resources I think
+# these start with "[0-9][0-9][0-9]\ A~[0-9][0-9][0-9]\ 
+# how to put that into a magic rule?
+4	string	\ A~	MAthematica .ml file
+
+# .nb files
+#too long 0	string	(***********************************************************************\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Mathematica-Compatible Notebook	Mathematica 3.0 notebook
+0	string	(***********************	Mathematica 3.0 notebook
+
+# other (* matches it is a comment start in these langs
+0	string	(*	Mathematica, or Pascal,  Modula-2 or 3 code text
+
+#########################
+# MatLab v5
+0       string  MATLAB  Matlab v5 mat-file
+>126    short   0x494d  (big endian)
+>>124   beshort x       version 0x%04x
+>126    short   0x4d49  (little endian)
+>>124   leshort x       version 0x%04x
+
+#------------------------------------------------------------------------------
+# Mavroyanopoulos Nikos <nmav at hellug.gr>
+# mcrypt:   file(1) magic for mcrypt 2.2.x;
+0	string		\0m\3		mcrypt 2.5 encrypted data,
+>4	string		>\0		algorithm: %s,
+>>&1	leshort		>0		keysize: %d bytes,
+>>>&0	string		>\0		mode: %s,
+
+0	string		\0m\2		mcrypt 2.2 encrypted data,
+>3	byte		0		algorithm: blowfish-448,
+>3	byte		1		algorithm: DES,
+>3	byte		2		algorithm: 3DES,
+>3	byte		3		algorithm: 3-WAY,
+>3	byte		4		algorithm: GOST,
+>3	byte		6		algorithm: SAFER-SK64,
+>3	byte		7		algorithm: SAFER-SK128,
+>3	byte		8		algorithm: CAST-128,
+>3	byte		9		algorithm: xTEA,
+>3	byte		10		algorithm: TWOFISH-128,
+>3	byte		11		algorithm: RC2,
+>3	byte		12		algorithm: TWOFISH-192,
+>3	byte		13		algorithm: TWOFISH-256,
+>3	byte		14		algorithm: blowfish-128,
+>3	byte		15		algorithm: blowfish-192,
+>3	byte		16		algorithm: blowfish-256,
+>3	byte		100		algorithm: RC6,
+>3	byte		101		algorithm: IDEA,
+>4	byte		0		mode: CBC,
+>4	byte		1		mode: ECB,
+>4	byte		2		mode: CFB,
+>4	byte		3		mode: OFB,
+>4	byte		4		mode: nOFB,
+>5	byte		0		keymode: 8bit
+>5	byte		1		keymode: 4bit
+>5	byte		2		keymode: SHA-1 hash
+>5	byte		3		keymode: MD5 hash
+#------------------------------------------------------------------------------
+# mime:  file(1) magic for MIME encoded files
+#
+0	string		Content-Type:\
+>14	string		>\0		%s
+0	string		Content-Type:
+>13	string		>\0		%s
+
+#------------------------------------------------------------------------------
+# mips:  file(1) magic for Silicon Graphics (MIPS, IRIS, IRIX, etc.)
+#                         Dec Ultrix (MIPS)
+# all of SGI's *current* machines and OSes run in big-endian mode on the
+# MIPS machines, as far as I know.
+#
+# XXX - what is the blank "-" line?
+#
+# kbd file definitions
+0	string	kbd!map		kbd map file
+>8	byte	>0		Ver %d:
+>10	short	>0		with %d table(s)
+0	belong	0407		old SGI 68020 executable
+0	belong	0410		old SGI 68020 pure executable
+0	beshort	0x8765		disk quotas file
+0	beshort	0x0506		IRIS Showcase file
+>2	byte	0x49		-
+>3	byte	x		- version %ld
+0	beshort	0x0226		IRIS Showcase template
+>2	byte	0x63		-
+>3	byte	x		- version %ld
+0	belong	0x5343464d	IRIS Showcase file
+>4	byte	x		- version %ld
+0	belong	0x5443464d	IRIS Showcase template
+>4	byte	x		- version %ld
+0	belong	0xdeadbabe	IRIX Parallel Arena
+>8	belong	>0		- version %ld
+#
+0	beshort	0x0160		MIPSEB ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>22	byte	x		- version %ld
+>23	byte	x		.%ld
+#
+0	beshort	0x0162		MIPSEL-BE ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %d
+>22	byte	x		.%ld
+#
+0	beshort	0x6001		MIPSEB-LE ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %d
+>22	byte	x		.%ld
+#
+0	beshort	0x6201		MIPSEL ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %ld
+>22	byte	x		.%ld
+#
+# MIPS 2 additions
+#
+0	beshort	0x0163		MIPSEB MIPS-II ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>22	byte	x		- version %ld
+>23	byte	x		.%ld
+#
+0	beshort	0x0166		MIPSEL-BE MIPS-II ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>22	byte	x		- version %ld
+>23	byte	x		.%ld
+#
+0	beshort	0x6301		MIPSEB-LE MIPS-II ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %ld
+>22	byte	x		.%ld
+#
+0	beshort	0x6601		MIPSEL MIPS-II ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %ld
+>22	byte	x		.%ld
+#
+# MIPS 3 additions
+#
+0	beshort	0x0140		MIPSEB MIPS-III ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>22	byte	x		- version %ld
+>23	byte	x		.%ld
+#
+0	beshort	0x0142		MIPSEL-BE MIPS-III ECOFF executable
+>20	beshort	0407		(impure)
+>20	beshort	0410		(swapped)
+>20	beshort	0413		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>22	byte	x		- version %ld
+>23	byte	x		.%ld
+#
+0	beshort	0x4001		MIPSEB-LE MIPS-III ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %ld
+>22	byte	x		.%ld
+#
+0	beshort	0x4201		MIPSEL MIPS-III ECOFF executable
+>20	beshort	03401		(impure)
+>20	beshort	04001		(swapped)
+>20	beshort	05401		(paged)
+>8	belong	>0		not stripped
+>8	belong	0		stripped
+>23	byte	x		- version %ld
+>22	byte	x		.%ld
+#
+0	beshort	0x180		MIPSEB Ucode
+0	beshort	0x182		MIPSEL-BE Ucode
+# 32bit core file
+0	belong	0xdeadadb0	IRIX core dump
+>4	belong	1		of
+>16	string	>\0		'%s'
+# 64bit core file
+0	belong	0xdeadad40	IRIX 64-bit core dump
+>4	belong	1		of
+>16	string	>\0		'%s'
+# N32bit core file
+0       belong	0xbabec0bb	IRIX N32 core dump
+>4      belong	1               of
+>16     string	>\0             '%s'
+# New style crash dump file
+0	string	\x43\x72\x73\x68\x44\x75\x6d\x70	IRIX vmcore dump of
+>36	string	>\0					'%s'
+# Trusted IRIX info
+0	string	SGIAUDIT	SGI Audit file
+>8	byte	x		- version %d
+>9	byte	x		.%ld
+#
+0	string	WNGZWZSC	Wingz compiled script
+0	string	WNGZWZSS	Wingz spreadsheet
+0	string	WNGZWZHP	Wingz help file
+#
+0	string	\#Inventor V	IRIS Inventor 1.0 file
+0	string	\#Inventor V2	Open Inventor 2.0 file
+# GLF is OpenGL stream encoding
+0	string	glfHeadMagic();		GLF_TEXT
+4	belong	0x7d000000		GLF_BINARY_LSB_FIRST
+4	belong	0x0000007d		GLF_BINARY_MSB_FIRST
+# GLS is OpenGL stream encoding; GLS is the successor of GLF
+0	string	glsBeginGLS(		GLS_TEXT
+4	belong	0x10000000		GLS_BINARY_LSB_FIRST
+4	belong	0x00000010		GLS_BINARY_MSB_FIRST
+
+#------------------------------------------------------------------------------
+# mirage:  file(1) magic for Mirage executables
+#
+# XXX - byte order?
+#
+0	long	31415		Mirage Assembler m.out executable
+#-----------------------------------------------------------------------------
+# misctools:  file(1) magic for miscelanous UNIX tools.
+#
+0	string		%%!!		X-Post-It-Note text
+0	string          BEGIN:VCALENDAR         vCalendar calendar file
+
+#------------------------------------------------------------------------------
+# mkid:  file(1) magic for mkid(1) databases
+#
+# ID is the binary tags database produced by mkid(1).
+#
+# XXX - byte order?
+#
+0	string		\311\304	ID tags data
+>2	short		>0		version %d
+
+#------------------------------------------------------------------------------
+# mlssa: file(1) magic for MLSSA datafiles
+#
+0		lelong		0xffffabcd	MLSSA datafile,
+>4		leshort		x		algorithm %d,
+>10		lelong		x		%d samples
+
+#------------------------------------------------------------------------------
+# mmdf:  file(1) magic for MMDF mail files
+#
+0	string	\001\001\001\001	MMDF mailbox
+#------------------------------------------------------------------------------
+# msad:  file(1) magic for msad
+# Microsoft visual C
+# This must precede the heuristic for raw G3 data
+4	string	Standard\ Jet\ DB	Microsoft Access Database
+
+#------------------------------------------------------------------------------
+# motorola:  file(1) magic for Motorola 68K and 88K binaries
+#
+# 68K
+#
+0	beshort		0520		mc68k COFF
+>18	beshort		^00000020	object
+>18	beshort		&00000020	executable
+>12	belong		>0		not stripped
+>168	string		.lowmem		Apple toolbox
+>20	beshort		0407		(impure)
+>20	beshort		0410		(pure)
+>20	beshort		0413		(demand paged)
+>20	beshort		0421		(standalone)
+0	beshort		0521		mc68k executable (shared)
+>12	belong		>0		not stripped
+0	beshort		0522		mc68k executable (shared demand paged)
+>12	belong		>0		not stripped
+#
+# Motorola/UniSoft 68K Binary Compatibility Standard (BCS)
+#
+0	beshort		0554		68K BCS executable
+#
+# 88K
+#
+# Motorola/88Open BCS
+#
+0	beshort		0555		88K BCS executable
+#
+# Motorola S-Records, from Gerd Truschinski <gt at freebsd.first.gmd.de>
+0   string      S0          Motorola S-Record; binary data in text format
+
+# ATARI ST relocatable PRG
+#
+# from Oskar Schirmer <schirmer at scara.com> Feb 3, 2001
+# (according to Roland Waldi, Oct 21, 1987)
+# besides the magic 0x601a, the text segment size is checked to be
+# not larger than 1 MB (which is a lot on ST).
+# The additional 0x601b distinction I took from Doug Lee's magic.
+0	belong&0xFFFFFFF0	0x601A0000	Atari ST M68K contiguous executable
+>2	belong			x		(txt=%ld,
+>6	belong			x		dat=%ld,
+>10	belong			x		bss=%ld,
+>14	belong			x		sym=%ld)
+0	belong&0xFFFFFFF0	0x601B0000	Atari ST M68K non-contig executable
+>2	belong			x		(txt=%ld,
+>6	belong			x		dat=%ld,
+>10	belong			x		bss=%ld,
+>14	belong			x		sym=%ld)
+
+# Atari ST/TT... program format (sent by Wolfram Kleff <kleff at cs.uni-bonn.de>)
+0       beshort         0x601A          Atari 68xxx executable,
+>2      belong          x               text len %lu,
+>6      belong          x               data len %lu,
+>10     belong          x               BSS len %lu,
+>14     belong          x               symboltab len %lu,
+>18     belong          0
+>22     belong          &0x01           fastload flag,
+>22     belong          &0x02           may be loaded to alternate RAM,
+>22     belong          &0x04           malloc may be from alternate RAM,
+>22     belong          x               flags: 0x%lX,
+>26     beshort         0               no relocation tab
+>26     beshort         !0              + relocation tab
+>30     string          SFX             [Self-Extracting LZH SFX archive]
+>38     string          SFX             [Self-Extracting LZH SFX archive]
+>44     string          ZIP!            [Self-Extracting ZIP SFX archive]
+
+0       beshort         0x0064          Atari 68xxx CPX file
+>8      beshort         x               (version %04lx)
+
+#------------------------------------------------------------------------------
+# msdos:  file(1) magic for MS-DOS files
+#
+
+# .BAT files (Daniel Quinlan, quinlan at yggdrasil.com)
+0	string/c	@echo\ off	MS-DOS batch file text
+
+# XXX - according to Microsoft's spec, at an offset of 0x3c in a
+# PE-format executable is the offset in the file of the PE header;
+# unfortunately, that's a little-endian offset, and there's no way
+# to specify an indirect offset with a specified byte order.
+# So, for now, we assume the standard MS-DOS stub, which puts the
+# PE header at 0x80 = 128.
+#
+# Required OS version and subsystem version were 4.0 on some NT 3.51
+# executables built with Visual C++ 4.0, so it's not clear that
+# they're interesting.  The user version was 0.0, but there's
+# probably some linker directive to set it.  The linker version was
+# 3.0, except for one ".exe" which had it as 4.20 (same damn linker!).
+#
+128	string		PE\0\0	MS Windows PE
+>150	leshort&0x0100	>0	32-bit
+>132	leshort		0x0	unknown processor
+>132	leshort		0x14c	Intel 80386
+>132	leshort		0x166	MIPS R4000
+>132	leshort		0x184	Alpha
+>132	leshort		0x268	Motorola 68000
+>132	leshort		0x1f0	PowerPC
+>132	leshort		0x290	PA-RISC
+>148	leshort		>27
+>>220	leshort		0	unknown subsystem
+>>220	leshort		1	native
+>>220	leshort		2	GUI
+>>220	leshort		3	console
+>>220	leshort		7	POSIX
+>150	leshort&0x2000	=0	executable
+#>>136	ledate		x	stamp %s,
+>>150	leshort&0x0001	>0	not relocatable
+#>>150	leshort&0x0004	=0	with line numbers,
+#>>150	leshort&0x0008	=0	with local symbols,
+#>>150	leshort&0x0200	=0	with debug symbols,
+>>150	leshort&0x1000	>0	system file
+#>>148	leshort		>0
+#>>>154	byte		x	linker %d
+#>>>155	byte		x	\b.%d,
+#>>148	leshort		>27
+#>>>192	leshort		x	requires OS %d
+#>>>194	leshort		x	\b.%d,
+#>>>196	leshort		x	user version %d
+#>>>198	leshort		x	\b.%d,
+#>>>200	leshort		x	subsystem version %d
+#>>>202	leshort		x	\b.%d,
+>150	leshort&0x2000	>0	DLL
+#>>136	ledate		x	stamp %s,
+>>150	leshort&0x0001	>0	not relocatable
+#>>150	leshort&0x0004	=0	with line numbers,
+#>>150	leshort&0x0008	=0	with local symbols,
+#>>150	leshort&0x0200	=0	with debug symbols,
+>>150	leshort&0x1000	>0	system file
+#>>148	leshort		>0
+#>>>154	byte		x	linker %d
+#>>>155	byte		x	\b.%d,
+#>>148	leshort		>27
+#>>>192	leshort		x	requires OS %d
+#>>>194	leshort		x	\b.%d,
+#>>>196	leshort		x	user version %d
+#>>>198	leshort		x	\b.%d,
+#>>>200	leshort		x	subsystem version %d
+#>>>202	leshort		x	\b.%d,
+0	leshort		0x14c	MS Windows COFF Intel 80386 object file
+#>4	ledate		x	stamp %s
+0	leshort		0x166	MS Windows COFF MIPS R4000 object file
+#>4	ledate		x	stamp %s
+0	leshort		0x184	MS Windows COFF Alpha object file
+#>4	ledate		x	stamp %s
+0	leshort		0x268	MS Windows COFF Motorola 68000 object file
+#>4	ledate		x	stamp %s
+0	leshort		0x1f0	MS Windows COFF PowerPC object file
+#>4	ledate		x	stamp %s
+0	leshort		0x290	MS Windows COFF PA-RISC object file
+#>4	ledate		x	stamp %s
+
+# .EXE formats (Greg Roelofs, newt at uchicago.edu)
+#
+0	string	MZ		MS-DOS executable (EXE)
+>24	string	@		\b, OS/2 or MS Windows
+>>0xe7	string	LH/2\ Self-Extract	\b, %s
+>>0xe9	string	PKSFX2		\b, %s
+>>0x7a	string	Windows\ self-extracting\ ZIP	\b, %s
+>0x1c	string	RJSX\xff\xff	\b, ARJ SFX
+>0x1c	string	diet\xf9\x9c	\b, diet compressed
+>0x1c	string	LZ09		\b, LZEXE v0.90 compressed
+>0x1c	string	LZ91		\b, LZEXE v0.91 compressed
+>0x1e	string	Copyright\ 1989-1990\ PKWARE\ Inc.	\b, PKSFX
+# JM: 0x1e "PKLITE Copr. 1990-92 PKWARE Inc. All Rights Reserved\7\0\0\0"
+>0x1e	string	PKLITE\ Copr.	\b, %.6s compressed
+>0x24	string	LHa's\ SFX	\b, %.15s
+>0x24	string	LHA's\ SFX	\b, %.15s
+>1638	string	-lh5-		\b, LHa SFX archive v2.13S
+>7195	string	Rar!		\b, RAR self-extracting archive
+#
+# [GRR 950118:  file 3.15 has a buffer-size limitation; offsets bigger than
+#   8161 bytes are ignored.  To make the following entries work, increase
+#   HOWMANY in file.h to 32K at least, and maybe to 70K or more for OS/2,
+#   NT/Win32 and VMS.]
+# [GRR:  some company sells a self-extractor/displayer for image data(!)]
+#
+>11696	string	PK\003\004	\b, PKZIP SFX archive v1.1
+>13297	string	PK\003\004	\b, PKZIP SFX archive v1.93a
+>15588	string	PK\003\004	\b, PKZIP2 SFX archive v1.09
+>15770	string	PK\003\004	\b, PKZIP SFX archive v2.04g
+>28374	string	PK\003\004	\b, PKZIP2 SFX archive v1.02
+#
+# Info-ZIP self-extractors
+#    these are the DOS versions:
+>25115	string	PK\003\004	\b, Info-ZIP SFX archive v5.12
+>26331	string	PK\003\004	\b, Info-ZIP SFX archive v5.12 w/decryption
+#    these are the OS/2 versions (OS/2 is flagged above):
+>47031	string	PK\003\004	\b, Info-ZIP SFX archive v5.12
+>49845	string	PK\003\004	\b, Info-ZIP SFX archive v5.12 w/decryption
+#    this is the NT/Win32 version:
+>69120	string	PK\003\004	\b, Info-ZIP NT SFX archive v5.12 w/decryption
+#
+# TELVOX Teleinformatica CODEC self-extractor for OS/2:
+>49801	string	\x79\xff\x80\xff\x76\xff	\b, CODEC archive v3.21
+>>49824	leshort		=1			\b, 1 file
+>>49824	leshort		>1			\b, %u files
+
+# .COM formats (Daniel Quinlan, quinlan at yggdrasil.com)
+# Uncommenting only the first two lines will cover about 2/3 of COM files,
+# but it isn't feasible to match all COM files since there must be at least
+# two dozen different one-byte "magics".
+#0	byte		0xe9		MS-DOS executable (COM)
+#>6	string	SFX\ of\ LHarc	(%s)
+#0	byte		0x8c		MS-DOS executable (COM)
+# 0xeb conflicts with "sequent" magic
+#0	byte		0xeb		MS-DOS executable (COM)
+#0	byte		0xb8		MS-DOS executable (COM)
+
+# miscellaneous formats
+0	string		LZ		MS-DOS executable (built-in)
+#0	byte		0xf0		MS-DOS program library data
+#
+
+#
+# Windows Registry files.
+#
+0	string		regf		Windows NT registry file
+0	string		CREG		Windows 95 registry file
+
+# Popular applications
+2080	string	Microsoft\ Word\ 6.0\ Document	%s
+2080	string	Documento\ Microsoft\ Word\ 6 Spanish Microsoft Word 6 document data
+# Pawel Wiecek <coven at i17linuxb.ists.pwr.wroc.pl> (for polish Word)
+2112	string	MSWordDoc			Microsoft Word document data
+#
+0	belong	0x31be0000			Microsoft Word Document
+#
+0       string  PO^Q`				Microsoft Word 6.0 Document
+#
+0	string	\376\067\0\043			Microsoft Office Document
+0	string	\320\317\021\340\241\261\032\341	Microsoft Office Document
+0	string	\333\245-\0\0\0			Microsoft Office Document
+#
+2080	string	Microsoft\ Excel\ 5.0\ Worksheet	%s
+#
+# Pawel Wiecek <coven at i17linuxb.ists.pwr.wroc.pl> (for polish Excel)
+2114	string	Biff5		Microsoft Excel 5.0 Worksheet
+#
+0	belong	0x00001a00	Lotus 1-2-3
+>4	belong	0x00100400	wk3 document data
+>4	belong	0x02100400	wk4 document data
+>4	belong	0x07800100	fm3 or fmb document data
+>4	belong	0x07800000	fm3 or fmb document data
+#
+0	belong	0x00000200 	Lotus 1-2-3
+>4	belong	0x06040600	wk1 document data
+>4	belong	0x06800200	fmt document data
+
+# Help files
+0	string	?_\3\0		MS Windows Help Data
+
+#  DeIsL1.isu what this is I don't know
+0	string	\161\250\000\000\001\002	DeIsL1.isu whatever that is
+
+# Winamp .avs
+#0	string	Nullsoft\ AVS\ Preset\ \060\056\061\032	A plug in for Winamp ms-windows Freeware media player
+0	string	Nullsoft\ AVS\ Preset\ 	Winamp plug in
+
+# Hyper terminal:
+0	string	HyperTerminal\ 	hyperterm
+>15	string	1.0\ --\ HyperTerminal\ data\ file	MS-windows Hyperterminal
+
+# Windows Metafont .WMF
+0	string	\327\315\306\232\000\000\000\000\000\000	ms-windows metafont .wmf
+
+#tz3 files whatever that is (MS Works files)
+0	string	\003\001\001\004\070\001\000\000	tz3 ms-works file
+0	string	\003\002\001\004\070\001\000\000	tz3 ms-works file
+0	string	\003\003\001\004\070\001\000\000	tz3 ms-works file
+
+# PGP sig files .sig
+#0 string \211\000\077\003\005\000\063\237\127 065 to  \027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\065\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\066\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\067\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\070\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\071\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\225\003\005\000\062\122\207\304\100\345\042 PGP sig
+
+# windows zips files .dmf
+0	string	MDIF\032\000\010\000\000\000\372\046\100\175\001\000\001\036\001\000 Ms-windows special zipped file
+
+
+# Windows help file FTG FTS
+0	string	\164\146\115\122\012\000\000\000\001\000\000\000	ms-windows help cache
+
+# grp old windows 3.1 group files
+0 string  \120\115\103\103	Ms-windows 3.1 group files
+
+
+# lnk files windows symlinks
+0	string	\114\000\000\000\001\024\002\000\000\000\000\000\300\000\000\000\000\000\000\106	ms-Windows shortcut
+
+#ico files
+0	string	\102\101\050\000\000\000\056\000\000\000\000\000\000\000	Icon for ms-windows
+
+# Windows icons (Ian Springer <ips at fpk.hp.com>)
+0	string	\000\000\001\000	ms-windows icon resource
+>4	byte	1			- 1 icon
+>4	byte	>1			- %d icons
+>>6	byte	>0			\b, %dx
+>>>7	byte	>0			\b%d
+>>8	byte	0			\b, 256-colors
+>>8	byte	>0			\b, %d-colors
+
+
+# .chr files
+0	string	PK\010\010BGI	Borland font 
+>4	string	>\0	%s
+# then there is a copyright notice
+
+
+# .bgi files
+0	string	pk\010\010BGI	Borland device 
+>4	string	>\0	%s
+# then there is a copyright notice
+
+
+# recycled/info the windows trash bin index
+9	string	\000\000\000\030\001\000\000\000 ms-windows recycled bin info
+
+
+##### put in Either Magic/font or Magic/news
+# Acroread or something  files wrongly identified as G3  .pfm
+# these have the form \000 \001 any? \002 \000 \000
+# or \000 \001 any? \022 \000 \000
+0	belong&0xffff00ff	0x00010012	PFM data
+>4	string			\000\000
+>6	string			>\060		- %s
+
+0	belong&0xffff00ff	0x00010002	PFM data
+>4	string			\000\000
+>6	string			>\060		- %s
+#0	string  \000\001 pfm?
+#>3	string  \022\000\000Copyright\  yes
+#>3	string  \002\000\000Copyright\  yes
+#>3	string  >\0     oops, not a font file. Cancel that.
+#it clashes with ttf files so put it lower down.
+
+# From Doug Lee via a FreeBSD pr
+9	string		GERBILDOC	First Choice document
+9	string		GERBILDB	First Choice database
+9	string		GERBILCLIP	First Choice database
+0	string		GERBIL		First Choice device file
+9	string		RABBITGRAPH	RabbitGraph file
+0	string		DCU1		Borland Delphi .DCU file
+0	string		!<spell>	MKS Spell hash list (old format)
+0	string		!<spell2>	MKS Spell hash list
+# Too simple - MPi
+#0	string		AH		Halo(TM) bitmapped font file
+0	lelong		0x08086b70	TurboC BGI file
+0	lelong		0x08084b50	TurboC Font file
+
+# WARNING: below line conflicts with Infocom game data Z-machine 3
+0	byte		0x03		DBase 3 data file
+>0x04	lelong		0		(no records)
+>0x04	lelong		>0		(%ld records)
+0	byte		0x83		DBase 3 data file with memo(s)
+>0x04	lelong		0		(no records)
+>0x04	lelong		>0		(%ld records)
+0	leshort		0x0006		DBase 3 index file
+0	string		PMCC		Windows 3.x .GRP file
+1	string		RDC-meg		MegaDots 
+>8	byte		>0x2F		version %c
+>9	byte		>0x2F		\b.%c file
+0	lelong		0x4C
+>4	lelong		0x00021401	Windows shortcut file
+
+# DOS EPS Binary File Header
+# From: Ed Sznyter <ews at Black.Market.NET>
+0	belong		0xC5D0D3C6	DOS EPS Binary File
+>4	long		>0		Postscript starts at byte %d
+>>8	long		>0		length %d
+>>>12	long		>0		Metafile starts at byte %d
+>>>>16	long		>0		length %d
+>>>20	long		>0		TIFF starts at byte %d
+>>>>24	long		>0		length %d
+
+# TNEF magic From "Joomy" <joomy at se-ed.net> 
+0	leshort		0x223e9f78	TNEF
+
+# HtmlHelp files (.chm)
+0	string  ITSF\003\000\000\000\x60\000\000\000\001\000\000\000	MS Windows HtmlHelp Data
+
+# GFA-BASIC (Wolfram Kleff)
+2	string		GFA-BASIC3	GFA-BASIC 3 data
+
+# DJGPP compiled files
+# v >2, uses DPMI & small(2k) stub (Robert vd Boon, rjvdboon at europe.com)
+0x200	string		go32stub	DOS-executable compiled w/DJGPP
+>0x20c	string		>0		(stub v%.4s)
+>>0x8b2	string		djp		[compressed w/%s
+>>>&1	string		>\0		%.4s]
+>>0x8ad	string		UPX		[compressed w/%s
+>>>&1	string		>\0		%.4s]
+>>0x1c	string		pmodedj		stubbed with %s
+
+# QDOS
+4	belong		0x4AFB		QDOS executable
+>9	pstring		x		'%s'
+0	beshort		0xFB01		QDOS object
+>2	pstring		x		'%s'
+
+#------------------------------------------------------------------------------
+# From Stuart Caie <kyzer at 4u.net> (developer of cabextract)
+# Microsoft Cabinet files
+0	string		MSCF\0\0\0\0	Microsoft Cabinet file
+>8	lelong		x		\b, %u bytes
+>28	leshort		1		\b, 1 file
+>28	leshort		>1		\b, %u files
+
+# InstallShield Cabinet files
+0	string		ISc(		InstallShield Cabinet file
+>5	byte&0xf0	=0x60 		version 6,
+>5	byte&0xf0	!0x60 		version 4/5,
+>(12.l+40)	lelong	x		%u files
+
+# Windows CE package files
+0	string		MSCE\0\0\0\0	Microsoft WinCE install header
+>20	lelong		0		\b, architecture-independent
+>20	lelong		103		\b, Hitachi SH3
+>20	lelong		104		\b, Hitachi SH4
+>20	lelong		0xA11		\b, StrongARM
+>20	lelong		4000		\b, MIPS R4000
+>20	lelong		10003		\b, Hitachi SH3
+>20	lelong		10004		\b, Hitachi SH3E
+>20	lelong		10005		\b, Hitachi SH4
+>20	lelong		70001		\b, ARM 7TDMI
+>52	leshort		1 		\b, 1 file
+>52	leshort		>1 		\b, %u files
+>56	leshort		1 		\b, 1 registry entry
+>56	leshort		>1 		\b, %u registry entries
+
+# Outlook Personal Folders
+0	lelong	0x4E444221	Microsoft Outlook binary email folder
+
+# From: Dirk Jagdmann <doj at cubic.org>
+0	lelong	0x00035f3f	Windows 3.x help file
+
+#------------------------------------------------------------------------------
+# modem:  file(1) magic for modem programs
+#
+# From: Florian La Roche <florian at knorke.saar.de>
+1	string		PC\ Research,\ Inc	Digifax-G3-File
+>29	byte		1		\b, fine resolution
+>29	byte		0		\b, normal resolution
+
+0	short		0x0100		raw G3 data, byte-padded
+0	short		0x1400		raw G3 data
+#
+# Magic data for vgetty voice formats
+# (Martin Seine & Marc Eberhard)
+
+#
+# raw modem data version 1
+#
+0    string    RMD1      raw modem data
+>4   string    >\0       (%s /
+>20  short     >0        compression type 0x%04x)
+
+#
+# portable voice format 1
+#
+0    string    PVF1\n         portable voice format
+>5   string    >\0       (binary %s)
+
+#
+# portable voice format 2
+#
+0    string    PVF2\n         portable voice format
+>5   string >\0          (ascii %s)
+
+
+#------------------------------------------------------------------------------
+# msvc:  file(1) magic for msvc
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Microsoft visual C
+# 
+# I have version 1.0
+
+# .aps
+0	string	HWB\000\377\001\000\000\000	Microsoft Visual C .APS file
+
+# .ide
+#too long 0	string	\102\157\162\154\141\156\144\040\103\053\053\040\120\162\157\152\145\143\164\040\106\151\154\145\012\000\032\000\002\000\262\000\272\276\372\316	MSVC .ide
+0	string	\102\157\162\154\141\156\144\040\103\053\053\040\120\162\157	MSVC .ide
+
+# .res
+0	string	\000\000\000\000\040\000\000\000\377	MSVC .res
+0	string	\377\003\000\377\001\000\020\020\350	MSVC .res
+0	string	\377\003\000\377\001\000\060\020\350	MSVC .res
+
+#.lib
+0	string	\360\015\000\000	Microsoft Visual C library
+0	string	\360\075\000\000	Microsoft Visual C library
+0	string	\360\175\000\000	Microsoft Visual C library
+
+#.pch
+0	string	DTJPCH0\000\022\103\006\200	Microsoft Visual C .pch
+
+# .pdb
+# too long 0	string	Microsoft\ C/C++\ program\ database\ 
+0	string	Microsoft\ C/C++\ 	MSVC program database
+>18	string	program\ database\ 	
+>33	string	>\0	ver %s
+
+#.sbr
+0	string	\000\002\000\007\000	MSVC .sbr
+>5	string 	>\0	%s
+
+#.bsc
+0	string	\002\000\002\001	MSVC .bsc
+
+#.wsp
+0	string	1.00\ .0000.0000\000\003	MSVC .wsp version 1.0000.0000
+# these seem to start with the version and contain menus
+
+#-----------------------------------------------------------------------------
+# natinst:  file(1) magic for National Instruments Code Files
+
+#
+# From <egamez at fcfm.buap.mx> Enrique G�mez-Flores
+# version 1
+# Many formats still missing, we use, for the moment LabVIEW
+# We guess VXI format file. VISA, LabWindowsCVI, BridgeVIEW, etc, are missing
+#
+0       string          RSRC            National Instruments,
+# Check if it's a LabVIEW File
+>8      string          LV              LabVIEW File,
+# Check wich kind of file is
+>>10    string          SB              Code Resource File, data
+>>10    string          IN              Virtual Instrument Program, data
+>>10    string          AR              VI Library, data
+# This is for Menu Libraries
+>8      string          LMNULBVW        Portable File Names, data
+# This is for General Resources
+>8      string          rsc             Resources File, data
+# This is for VXI Package
+0       string          VMAP            National Instruments, VXI File, data
+
+#------------------------------------------------------------------------------
+# ncr:  file(1) magic for NCR Tower objects
+#
+# contributed by
+# Michael R. Wayne  ***  TMC & Associates  ***  INTERNET: wayne at ford-vax.arpa
+# uucp: {philabs | pyramid} !fmsrl7!wayne   OR   wayne at fmsrl7.UUCP
+#
+0	beshort		000610	Tower/XP rel 2 object
+>12	   belong		>0	not stripped
+>20	   beshort		0407	executable
+>20	   beshort		0410	pure executable
+>22	   beshort		>0	- version %ld
+0	beshort		000615	Tower/XP rel 2 object
+>12	   belong		>0	not stripped
+>20	   beshort		0407	executable
+>20	   beshort		0410	pure executable
+>22	   beshort		>0	- version %ld
+0	beshort		000620	Tower/XP rel 3 object
+>12	   belong		>0	not stripped
+>20	   beshort		0407	executable
+>20	   beshort		0410	pure executable
+>22	   beshort		>0	- version %ld
+0	beshort		000625	Tower/XP rel 3 object
+>12	   belong		>0	not stripped
+>20	   beshort		0407	executable
+>20	   beshort		0410	pure executable
+>22	   beshort		>0	- version %ld
+0	beshort		000630	Tower32/600/400 68020 object
+>12	   belong		>0	not stripped
+>20	   beshort		0407	executable
+>20	   beshort		0410	pure executable
+>22	   beshort		>0	- version %ld
+0	beshort		000640	Tower32/800 68020
+>18	   beshort		&020000	w/68881 object
+>18	   beshort		&040000	compatible object
+>18	   beshort		&~060000	object
+>20	   beshort		0407	executable
+>20	   beshort		0413	pure executable
+>12	   belong		>0	not stripped
+>22	   beshort		>0	- version %ld
+0	beshort		000645	Tower32/800 68010
+>18	   beshort		&040000	compatible object
+>18	   beshort		&~060000 object
+>20	   beshort		0407	executable
+>20	   beshort		0413	pure executable
+>12	   belong		>0	not stripped
+>22	   beshort		>0	- version %ld
+
+#------------------------------------------------------------------------------
+# netbsd:  file(1) magic for NetBSD objects
+#
+# All new-style magic numbers are in network byte order.
+#
+
+0	lelong			000000407	a.out NetBSD little-endian object file
+>16	lelong			>0		not stripped
+0	belong			000000407	a.out NetBSD big-endian object file
+>16	belong			>0		not stripped
+
+0	belong&0377777777	041400413	a.out NetBSD/i386 demand paged
+>0	byte			&0x80		
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	041400410	a.out NetBSD/i386 pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	041400407	a.out NetBSD/i386
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+0	belong&0377777777	041400507	a.out NetBSD/i386 core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+0	belong&0377777777	041600413	a.out NetBSD/m68k demand paged
+>0	byte			&0x80		
+>>20	belong			<8192		shared library
+>>20	belong			=8192		dynamically linked executable
+>>20	belong			>8192		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	041600410	a.out NetBSD/m68k pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	041600407	a.out NetBSD/m68k
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	belong			!0		executable
+>>20	belong			=0		object file
+>16	belong			>0		not stripped
+0	belong&0377777777	041600507	a.out NetBSD/m68k core
+>12	string			>\0		from '%s'
+>32	belong			!0		(signal %d)
+
+0	belong&0377777777	042000413	a.out NetBSD/m68k4k demand paged
+>0	byte			&0x80		
+>>20	belong			<4096		shared library
+>>20	belong			=4096		dynamically linked executable
+>>20	belong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	042000410	a.out NetBSD/m68k4k pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	042000407	a.out NetBSD/m68k4k
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	belong			!0		executable
+>>20	belong			=0		object file
+>16	belong			>0		not stripped
+0	belong&0377777777	042000507	a.out NetBSD/m68k4k core
+>12	string			>\0		from '%s'
+>32	belong			!0		(signal %d)
+
+0	belong&0377777777	042200413	a.out NetBSD/ns32532 demand paged
+>0	byte			&0x80		
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	042200410	a.out NetBSD/ns32532 pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	042200407	a.out NetBSD/ns32532
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+0	belong&0377777777	042200507	a.out NetBSD/ns32532 core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+0	belong&0377777777	045200507	a.out NetBSD/powerpc core
+>12	string			>\0		from '%s'
+
+0	belong&0377777777	042400413	a.out NetBSD/SPARC demand paged
+>0	byte			&0x80		
+>>20	belong			<8192		shared library
+>>20	belong			=8192		dynamically linked executable
+>>20	belong			>8192		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	042400410	a.out NetBSD/SPARC pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	042400407	a.out NetBSD/SPARC
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	belong			!0		executable
+>>20	belong			=0		object file
+>16	belong			>0		not stripped
+0	belong&0377777777	042400507	a.out NetBSD/SPARC core
+>12	string			>\0		from '%s'
+>32	belong			!0		(signal %d)
+
+0	belong&0377777777	042600413	a.out NetBSD/pmax demand paged
+>0	byte			&0x80		
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	042600410	a.out NetBSD/pmax pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	042600407	a.out NetBSD/pmax
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+0	belong&0377777777	042600507	a.out NetBSD/pmax core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+0	belong&0377777777	043000413	a.out NetBSD/vax 1k demand paged
+>0	byte			&0x80		
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	043000410	a.out NetBSD/vax 1k pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	043000407	a.out NetBSD/vax 1k
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+0	belong&0377777777	043000507	a.out NetBSD/vax 1k core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+0	belong&0377777777	045400413	a.out NetBSD/vax 4k demand paged
+>0	byte			&0x80		
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	045400410	a.out NetBSD/vax 4k pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	045400407	a.out NetBSD/vax 4k
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+0	belong&0377777777	045400507	a.out NetBSD/vax 4k core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+# NetBSD/alpha does not support (and has never supported) a.out objects,
+# so no rules are provided for them.  NetBSD/alpha ELF objects are 
+# dealt with in "elf".
+0	lelong		0x00070185		ECOFF NetBSD/alpha binary
+>10	leshort		0x0001			not stripped
+>10	leshort		0x0000			stripped
+0	belong&0377777777	043200507	a.out NetBSD/alpha core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+0	belong&0377777777	043400413	a.out NetBSD/mips demand paged
+>0	byte			&0x80		
+>>20	belong			<8192		shared library
+>>20	belong			=8192		dynamically linked executable
+>>20	belong			>8192		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	043400410	a.out NetBSD/mips pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	belong			>0		not stripped
+0	belong&0377777777	043400407	a.out NetBSD/mips
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	belong			!0		executable
+>>20	belong			=0		object file
+>16	belong			>0		not stripped
+0	belong&0377777777	043400507	a.out NetBSD/mips core
+>12	string			>\0		from '%s'
+>32	belong			!0		(signal %d)
+
+0	belong&0377777777	043600413	a.out NetBSD/arm32 demand paged
+>0	byte			&0x80
+>>20	lelong			<4096		shared library
+>>20	lelong			=4096		dynamically linked executable
+>>20	lelong			>4096		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	043600410	a.out NetBSD/arm32 pure
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80		executable
+>16	lelong			>0		not stripped
+0	belong&0377777777	043600407	a.out NetBSD/arm32
+>0	byte			&0x80		dynamically linked executable
+>0	byte			^0x80
+>>0	byte			&0x40		position independent
+>>20	lelong			!0		executable
+>>20	lelong			=0		object file
+>16	lelong			>0		not stripped
+# NetBSD/arm26 has always used ELF objects, but it shares a core file
+# format with NetBSD/arm32.
+0	belong&0377777777	043600507	a.out NetBSD/arm core
+>12	string			>\0		from '%s'
+>32	lelong			!0		(signal %d)
+
+#------------------------------------------------------------------------------
+# netscape:  file(1) magic for Netscape files
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# version 3 and 4 I think
+#
+
+# Netscape Address book  .nab
+0	string \000\017\102\104\000\000\000\000\000\000\001\000\000\000\000\002\000\000\000\002\000\000\004\000 Netscape Address book
+
+# Netscape Communicator address book
+0   string   \000\017\102\111 Netscape Communicator address book
+
+# .snm Caches
+0	string		#\ Netscape\ folder\ cache	Netscape folder cache
+0	string	\000\036\204\220\000	Netscape folder cache
+# .n2p 
+# Net 2 Phone 
+#0	string	123\130\071\066\061\071\071\071\060\070\061\060\061\063\060
+0	string	SX961999	Net2phone
+
+#
+#This is files ending in .art, FIXME add more rules
+0       string          JG\004\016\0\0\0\0      ART
+
+#------------------------------------------------------------------------------
+# news:  file(1) magic for SunOS NeWS fonts (not "news" as in "netnews")
+#
+0	string		StartFontMetrics	ASCII font metrics
+0	string		StartFont	ASCII font bits
+0	belong		0x137A2944	NeWS bitmap font
+0	belong		0x137A2947	NeWS font family
+0	belong		0x137A2950	scalable OpenFont binary
+0	belong		0x137A2951	encrypted scalable OpenFont binary
+8	belong		0x137A2B45	X11/NeWS bitmap font
+8	belong		0x137A2B48	X11/NeWS font family
+#------------------------------------------------------------------------------
+# nitpicker:  file(1) magic for Flowfiles.
+# From: Christian Jachmann <C.Jachmann at gmx.net> http://www.nitpicker.de
+0	string	NPFF	NItpicker Flow File 
+>4	byte	x	V%d.
+>5	byte	x	%d
+>6	bedate	x	started: %s
+>10	bedate	x	stopped: %s
+>14	belong	x	Bytes: %u
+>18	belong	x	Bytes1: %u
+>22	belong	x	Flows: %u
+>26	belong	x	Pkts: %u
+
+#------------------------------------------------------------------------------
+# ocaml: file(1) magic for Objective Caml files.
+0	string	Caml1999	Objective caml
+>8	string	X		exec file
+>8	string	I		interface file (.cmi)
+>8	string	O		object file (.cmo)
+>8	string	A		library file (.cma)
+>8	string	Y		native object file (.cmx)
+>8	string	Z		native library file (.cmxa)
+>8	string	M		abstract syntax tree implementation file
+>8	string	N		abstract syntax tree interface file
+>9	string	>\0		(Version %3.3s).
+#------------------------------------------------------------------------------
+# octave binary data file(1) magic, from Dirk Eddelbuettel <edd at debian.org>
+0	string		Octave-1-L	Octave binary data (little endian)
+0	string		Octave-1-B	Octave binary data (big endian)
+
+#------------------------------------------------------------------------------
+# olf:  file(1) magic for OLF executables
+#
+# We have to check the byte order flag to see what byte order all the
+# other stuff in the header is in.
+#
+# MIPS R3000 may also be for MIPS R2000.
+# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
+#
+# Created by Erik Theisen <etheisen at openbsd.org>
+# Based on elf from Daniel Quinlan <quinlan at yggdrasil.com>
+0	string		\177OLF		OLF
+>4	byte		0		invalid class
+>4	byte		1		32-bit
+>4	byte		2		64-bit
+>7	byte		0		invalid os
+>7	byte		1		OpenBSD
+>7	byte		2		NetBSD
+>7	byte		3		FreeBSD
+>7	byte		4		4.4BSD
+>7	byte		5		Linux
+>7	byte		6		SVR4
+>7	byte		7		esix
+>7	byte		8		Solaris
+>7	byte		9		Irix
+>7	byte		10		SCO
+>7	byte		11		Dell
+>7	byte		12		NCR
+>5	byte		0		invalid byte order
+>5	byte		1		LSB
+>>16	leshort		0		no file type,
+>>16	leshort		1		relocatable,
+>>16	leshort		2		executable,
+>>16	leshort		3		shared object,
+# Core handling from Peter Tobias <tobias at server.et-inf.fho-emden.de>
+# corrections by Christian 'Dr. Disk' Hechelmann <drdisk at ds9.au.s.shuttle.de>
+>>16	leshort		4		core file
+>>>(0x38+0xcc) string	>\0		of '%s'
+>>>(0x38+0x10) lelong	>0		(signal %d),
+>>16	leshort		&0xff00		processor-specific,
+>>18	leshort		0		no machine,
+>>18	leshort		1		AT&T WE32100 - invalid byte order,
+>>18	leshort		2		SPARC - invalid byte order,
+>>18	leshort		3		Intel 80386,
+>>18	leshort		4		Motorola 68000 - invalid byte order,
+>>18	leshort		5		Motorola 88000 - invalid byte order,
+>>18	leshort		6		Intel 80486,
+>>18	leshort		7		Intel 80860,
+>>18	leshort		8		MIPS R3000_BE - invalid byte order,
+>>18	leshort		9		Amdahl - invalid byte order,
+>>18	leshort		10		MIPS R3000_LE,
+>>18	leshort		11		RS6000 - invalid byte order,
+>>18	leshort		15		PA-RISC - invalid byte order,
+>>18	leshort		16		nCUBE,
+>>18	leshort		17		VPP500,
+>>18	leshort		18		SPARC32PLUS,
+>>18	leshort		20		PowerPC,
+>>18	leshort		0x9026		Alpha,
+>>20	lelong		0		invalid version
+>>20	lelong		1		version 1
+>>36	lelong		1		MathCoPro/FPU/MAU Required
+>8	string		>\0		(%s)
+>5	byte		2		MSB
+>>16	beshort		0		no file type,
+>>16	beshort		1		relocatable,
+>>16	beshort		2		executable,
+>>16	beshort		3		shared object,
+>>16	beshort		4		core file,
+>>>(0x38+0xcc) string	>\0		of '%s'
+>>>(0x38+0x10) belong	>0		(signal %d),
+>>16	beshort		&0xff00		processor-specific,
+>>18	beshort		0		no machine,
+>>18	beshort		1		AT&T WE32100,
+>>18	beshort		2		SPARC,
+>>18	beshort		3		Intel 80386 - invalid byte order,
+>>18	beshort		4		Motorola 68000,
+>>18	beshort		5		Motorola 88000,
+>>18	beshort		6		Intel 80486 - invalid byte order,
+>>18	beshort		7		Intel 80860,
+>>18	beshort		8		MIPS R3000_BE,
+>>18	beshort		9		Amdahl,
+>>18	beshort		10		MIPS R3000_LE - invalid byte order,
+>>18	beshort		11		RS6000,
+>>18	beshort		15		PA-RISC,
+>>18	beshort		16		nCUBE,
+>>18	beshort		17		VPP500,
+>>18	beshort		18		SPARC32PLUS,
+>>18	beshort		20		PowerPC or cisco 4500,
+>>18	beshort		21		cisco 7500,
+>>18	beshort		24		cisco SVIP,
+>>18	beshort		25		cisco 7200,
+>>18	beshort		36		cisco 12000,
+>>18	beshort		0x9026		Alpha,
+>>20	belong		0		invalid version
+>>20	belong		1		version 1
+>>36	belong		1		MathCoPro/FPU/MAU Required
+
+#------------------------------------------------------------------------------
+# os2:  file(1) magic for OS/2 files
+#
+
+# Provided 1998/08/22 by
+# David Mediavilla <davidme.news at REMOVEIFNOTSPAMusa.net>
+1	string	InternetShortcut	MS Windows 95 Internet shortcut text
+>24	string	>\			(URL=<%s>)
+
+# OS/2 URL objects
+# Provided 1998/08/22 by
+# David Mediavilla <davidme.news at REMOVEIFNOTSPAMusa.net>
+#0	string	http:			OS/2 URL object text
+#>5	string	>\			(WWW) <http:%s>
+#0	string	mailto:			OS/2 URL object text
+#>7	string	>\			(email) <%s>
+#0	string	news:			OS/2 URL object text
+#>5	string	>\			(Usenet) <%s>
+#0	string	ftp:			OS/2 URL object text
+#>4	string	>\			(FTP) <ftp:%s>
+#0	string	file:			OS/2 URL object text
+#>5	string	>\			(Local file) <%s>
+
+# >>>>> OS/2 INF/HLP <<<<<  (source: Daniel Dissett ddissett at netcom.com)
+# Carl Hauser (chauser.parc at xerox.com) and 
+# Marcus Groeber (marcusg at ph-cip.uni-koeln.de)
+# list the following header format in inf02a.doc:
+#
+#  int16 ID;           // ID magic word (5348h = "HS")
+#  int8  unknown1;     // unknown purpose, could be third letter of ID
+#  int8  flags;        // probably a flag word...
+#                      //  bit 0: set if INF style file
+#                      //  bit 4: set if HLP style file
+#                      // patching this byte allows reading HLP files
+#                      // using the VIEW command, while help files 
+#                      // seem to work with INF settings here as well.
+#  int16 hdrsize;      // total size of header
+#  int16 unknown2;     // unknown purpose
+# 
+0   string  HSP\x01\x9b\x00 OS/2 INF
+>107 string >0                      (%s)
+0   string  HSP\x10\x9b\x00     OS/2 HLP
+>107 string >0                      (%s)
+
+# OS/2 INI (this is a guess)
+0  string   \xff\xff\xff\xff\x14\0\0\0  OS/2 INI
+#
+# Copyright (c) 1996 Ignatios Souvatzis. All rights reserved.
+#
+# 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. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#      This product includes software developed by Ignatios Souvatzis for
+#      the NetBSD project.
+# 4. The name of the author may not be used to endorse or promote products
+#    derived from this software without specific prior written permission.
+#
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+#
+#
+#
+# OS9/6809 module descriptions:
+#
+0	beshort		0x87CD	OS9/6809 module:
+#
+>6	byte&0x0f	0x00	non-executable
+>6	byte&0x0f	0x01	machine language
+>6	byte&0x0f	0x02	BASIC I-code
+>6	byte&0x0f	0x03	P-code
+>6	byte&0x0f	0x04	C I-code
+>6	byte&0x0f	0x05	COBOL I-code
+>6	byte&0x0f	0x06	FORTRAN I-code
+#
+>6	byte&0xf0	0x10	program executable
+>6	byte&0xf0	0x20	subroutine
+>6	byte&0xf0	0x30	multi-module
+>6	byte&0xf0	0x40	data module
+#
+>6	byte&0xf0	0xC0	system module
+>6	byte&0xf0	0xD0	file manager
+>6	byte&0xf0	0xE0	device driver
+>6	byte&0xf0	0xF0	device descriptor
+#
+# OS9/m68k stuff (to be continued)
+#
+0	beshort		0x4AFC	OS9/68K module:
+#
+# attr
+>14	byte&0x80	0x80	re-entrant
+>14	byte&0x40	0x40	ghost
+>14	byte&0x20	0x20	system-state
+#
+# lang:
+#
+>13	byte		1	machine language
+>13	byte		2	BASIC I-code
+>13	byte		3	P-code
+>13	byte		4	C I-code
+>13	byte		5	COBOL I-code
+>13	byte		6	Fortran I-code
+#
+#
+# type:
+#
+>12	byte		1	program executable
+>12	byte		2	subroutine
+>12	byte		3	multi-module
+>12	byte		4	data module
+>12	byte		11	trap library
+>12	byte		12	system module
+>12	byte		13	file manager
+>12	byte		14	device driver
+>12	byte		15	device descriptor
+#
+# Mach magic number info
+#
+0	long		0xefbe	OSF/Rose object
+# I386 magic number info
+#
+0	short		0565	i386 COFF object
+
+#------------------------------------------------------------------------------
+# palm:  file(1) magic for PalmOS {.prc,.pdb}: applications, docfiles, and hacks
+#
+# Brian Lalor <blalor at hcirisc.cs.binghamton.edu>
+
+# appl
+60      belong                  0x6170706c      PalmOS application
+>0      string                  >\0             "%s"
+# TEXt
+60      belong                  0x54455874      AportisDoc file
+>0      string                  >\0             "%s"
+# HACK
+60      belong                  0x4841434b      HackMaster hack
+>0      string                  >\0             "%s"
+
+# Variety of PalmOS document types
+# Michael-John Turner <mj at debian.org>
+# Thanks to Hasan Umit Ezerce <humit at tr-net.net.tr> for his DocType
+60	string	                BVokBDIC	BDicty PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DB99DBOS	DB PalmOS document
+>0	string                  >\0             "%s"
+60	string	                vIMGView	FireViewer/ImageViewer PalmOS document
+>0	string                  >\0             "%s"
+60	string	                PmDBPmDB	HanDBase PalmOS document
+>0	string                  >\0             "%s"
+60	string	                InfoINDB	InfoView PalmOS document
+>0	string                  >\0             "%s"
+60	string	                ToGoToGo	iSilo PalmOS document
+>0	string                  >\0             "%s"
+60	string	                JfDbJBas	JFile PalmOS document
+>0	string                  >\0             "%s"
+60	string	                JfDbJFil	JFile Pro PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DATALSdb	List PalmOS document
+>0	string                  >\0             "%s"
+60	string	                Mdb1Mdb1	MobileDB PalmOS document
+>0	string                  >\0             "%s"
+60	string	                PNRdPPrs	PeanutPress PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DataPlkr	Plucker PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DataSprd	QuickSheet PalmOS document
+>0	string                  >\0             "%s"
+60	string	                SM01SMem	SuperMemo PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DataTlPt	TealDoc PalmOS document
+>0	string                  >\0             "%s"
+60	string	                InfoTlIf	TealInfo PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DataTlMl	TealMeal PalmOS document
+>0	string                  >\0             "%s"
+60	string	                DataTlPt	TealPaint PalmOS document
+>0	string                  >\0             "%s"
+60	string	                dataTDBP	ThinkDB PalmOS document
+>0	string                  >\0             "%s"
+60	string	                TdatTide	Tides PalmOS document
+>0	string                  >\0             "%s"
+60	string	                ToRaTRPW	TomeRaider PalmOS document
+>0	string                  >\0             "%s"
+
+# A GutenPalm zTXT etext for use on Palm Pilots (http://gutenpalm.sf.net)
+# For version 1.xx zTXTs, outputs version and numbers of bookmarks and
+#   annotations.
+# For other versions, just outputs version.
+#
+60		string		zTXT		A GutenPalm zTXT e-book
+>0		string		>\0		"%s"
+>(0x4E.L)	byte		0
+>>(0x4E.L+1)	byte		x		(v0.%02d)
+>(0x4E.L)	byte		1
+>>(0x4E.L+1)	byte		x		(v1.%02d)
+>>>(0x4E.L+10)	beshort		>0
+>>>>(0x4E.L+10) beshort		<2		- 1 bookmark
+>>>>(0x4E.L+10) beshort		>1		- %d bookmarks
+>>>(0x4E.L+14)	beshort		>0
+>>>>(0x4E.L+14) beshort		<2		- 1 annotation
+>>>>(0x4E.L+14) beshort		>1		- %d annotations
+>(0x4E.L)	byte		>1		(v%d.
+>>(0x4E.L+1)	byte		x		%02d)
+
+# Palm OS .prc file types
+60		string		libr		Palm OS dynamic library data
+>0		string		>\0		"%s"
+60		string		ptch		Palm OS operating system patch data
+>0		string		>\0		"%s"
+
+# Mobipocket (www.mobipocket.com), donated by Carl Witty
+60	string	                BOOKMOBI	Mobipocket E-book
+>0	string                  >\0             "%s"
+
+#------------------------------------------------------------------------------
+#
+# Parix COFF executables
+# From: Ignatios Souvatzis <ignatios at cs.uni-bonn.de>
+#
+0	beshort&0xfff	0xACE	PARIX
+>0	byte&0xf0	0x80	T800
+>0	byte&0xf0	0x90	T9000
+>19	byte&0x02	0x02	executable
+>19	byte&0x02	0x00	object
+>19	byte&0x0c	0x00	not stripped
+
+#------------------------------------------------------------------------------
+# pbm:  file(1) magic for Portable Bitmap files
+#
+# XXX - byte order?
+#
+0	short	0x2a17	"compact bitmap" format (Poskanzer)
+#------------------------------------------------------------------------------
+# pdf:  file(1) magic for Portable Document Format
+#
+
+0	string		%PDF-		PDF document
+>5	byte		x		\b, version %c
+>7	byte		x		\b.%c
+
+#------------------------------------------------------------------------------
+# pdp:  file(1) magic for PDP-11 executable/object and APL workspace
+#
+0	lelong		0101555		PDP-11 single precision APL workspace
+0	lelong		0101554		PDP-11 double precision APL workspace
+#
+# PDP-11 a.out
+#
+0	leshort		0407		PDP-11 executable
+>8	leshort		>0		not stripped
+>15	byte		>0		- version %ld
+
+0	leshort		0401		PDP-11 UNIX/RT ldp
+0	leshort		0405		PDP-11 old overlay
+
+0	leshort		0410		PDP-11 pure executable
+>8	leshort		>0		not stripped
+>15	byte		>0		- version %ld
+
+0	leshort		0411		PDP-11 separate I&D executable
+>8	leshort		>0		not stripped
+>15	byte		>0		- version %ld
+
+0	leshort		0437		PDP-11 kernel overlay
+
+# These last three are derived from 2.11BSD file(1)
+0	leshort		0413		PDP-11 demand-paged pure executable
+>8	leshort		>0		not stripped
+
+0	leshort		0430		PDP-11 overlaid pure executable
+>8	leshort		>0		not stripped
+
+0	leshort		0431		PDP-11 overlaid separate executable
+>8	leshort		>0		not stripped
+
+#------------------------------------------------------------------------------
+# perl:  file(1) magic for Larry Wall's perl language.
+#
+# The ``eval'' line recognizes an outrageously clever hack for USG systems.
+# Keith Waclena <keith at cerberus.uchicago.edu>
+# Send additions to <perl5-porters at perl.org>
+0	string/b	#!\ /bin/perl			perl script text
+0	string		eval\ "exec\ /bin/perl		perl script text
+0	string/b	#!\ /usr/bin/perl		perl script text
+0	string		eval\ "exec\ /usr/bin/perl	perl script text
+0	string/b	#!\ /usr/local/bin/perl		perl script text
+0	string		eval\ "exec\ /usr/local/bin/perl	perl script text
+0	string		eval\ '(exit\ $?0)'\ &&\ eval\ 'exec	perl script text
+
+# a couple more, by me
+# XXX: christos matches
+#0	regex		package		Perl5 module source text (via regex)
+0	string		package		Perl5 module source text
+
+#------------------------------------------------------------------------------
+# pgp:  file(1) magic for Pretty Good Privacy
+#
+0       beshort         0x9900                  PGP key public ring
+0       beshort         0x9501                  PGP key security ring
+0       beshort         0x9500                  PGP key security ring
+0	beshort		0xa600			PGP encrypted data
+0       string          -----BEGIN\040PGP       PGP armored data
+>15     string          PUBLIC\040KEY\040BLOCK- public key block
+>15     string          MESSAGE-                message
+>15     string          SIGNED\040MESSAGE-      signed message
+>15     string          PGP\040SIGNATURE-       signature
+
+#------------------------------------------------------------------------------
+# pkgadd:  file(1) magic for SysV R4 PKG Datastreams
+#
+0       string          #\ PaCkAgE\ DaTaStReAm  pkg Datastream (SVR4)
+#------------------------------------------------------------------------------
+# plan9:  file(1) magic for AT&T Bell Labs' Plan 9 executables
+#
+0	belong		0x000001EB	Plan 9 executable
+
+#------------------------------------------------------------------------------
+# plus5:  file(1) magic for Plus Five's UNIX MUMPS
+#
+# XXX - byte order?  Paging Hokey....
+#
+0	short		0x259		mumps avl global
+>2	byte		>0		(V%d)
+>6	byte		>0		with %d byte name
+>7	byte		>0		and %d byte data cells
+0	short		0x25a		mumps blt global
+>2	byte		>0		(V%d)
+>8	short		>0		- %d byte blocks
+>15	byte		0x00		- P/D format
+>15	byte		0x01		- P/K/D format
+>15	byte		0x02		- K/D format
+>15	byte		>0x02		- Bad Flags
+# SE Linux policy database
+0       lelong  0xf97cff8c      SE Linux policy
+>16     lelong  x               v%d
+>20     lelong  1 		MLS
+>24     lelong  x       	%d symbols
+>28     lelong  x       	%d ocons
+
+#------------------------------------------------------------------------------
+# printer:  file(1) magic for printer-formatted files
+#
+
+# PostScript, updated by Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		%!		PostScript document text
+>2	string		PS-Adobe-	conforming
+>>11	string		>\0		at level %.3s
+>>>15	string		EPS		- type %s
+>>>15	string		Query		- type %s
+>>>15	string		ExitServer	- type %s
+# Some PCs have the annoying habit of adding a ^D as a document separator
+0	string		\004%!		PostScript document text
+>3	string		PS-Adobe-	conforming
+>>12	string		>\0		at level %.3s
+>>>16	string		EPS		- type %s
+>>>16	string		Query		- type %s
+>>>16	string		ExitServer	- type %s
+0	string		\033%-12345X%!PS	PostScript document
+
+
+# DOS EPS Binary File Header
+# From: Ed Sznyter <ews at Black.Market.NET>
+0       belong          0xC5D0D3C6      DOS EPS Binary File
+>4      long            >0              Postscript starts at byte %d
+>>8     long            >0              length %d
+>>>12   long            >0              Metafile starts at byte %d
+>>>>16  long            >0              length %d
+>>>20   long            >0              TIFF starts at byte %d
+>>>>24  long            >0              length %d
+
+# Adobe's PostScript Printer Description (PPD) files
+#       Yves Arrouye <arrouye at marin.fdn.fr>
+#
+0      string          *PPD-Adobe:    PPD file
+>13    string          x              \b, ve
+
+# HP Printer Job Language
+0	string		\033%-12345X at PJL	HP Printer Job Language data
+# HP Printer Job Language
+# The header found on Win95 HP plot files is the "Silliest Thing possible" 
+# (TM)
+# Every driver puts the language at some random position, with random case
+# (LANGUAGE and Language)
+# For example the LaserJet 5L driver puts the "PJL ENTER LANGUAGE" in line 10
+# From: Uwe Bonnes <bon at elektron.ikp.physik.th-darmstadt.de>
+# 
+0	string		\033%-12345X at PJL	HP Printer Job Language data
+>&0	string		>\0			%s			
+>>&0	string		>\0			%s			
+>>>&0	string		>\0			%s		
+>>>>&0	string		>\0			%s		
+#>15	string		\ ENTER\ LANGUAGE\ =
+#>31	string		PostScript		PostScript
+
+# HP Printer Control Language, Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		\033E\033	HP PCL printer data
+>3	string		\&l0A		- default page size
+>3	string		\&l1A		- US executive page size
+>3	string		\&l2A		- US letter page size
+>3	string		\&l3A		- US legal page size
+>3	string		\&l26A		- A4 page size
+>3	string		\&l80A		- Monarch envelope size
+>3	string		\&l81A		- No. 10 envelope size
+>3	string		\&l90A		- Intl. DL envelope size
+>3	string		\&l91A		- Intl. C5 envelope size
+>3	string		\&l100A		- Intl. B5 envelope size
+>3	string		\&l-81A		- No. 10 envelope size (landscape)
+>3	string		\&l-90A		- Intl. DL envelope size (landscape)
+
+# IMAGEN printer-ready files:
+0	string	@document(		Imagen printer
+# this only works if "language xxx" is first item in Imagen header.
+>10	string	language\ impress	(imPRESS data)
+>10	string	language\ daisy		(daisywheel text)
+>10	string	language\ diablo	(daisywheel text)
+>10	string	language\ printer	(line printer emulation)
+>10	string	language\ tektronix	(Tektronix 4014 emulation)
+# Add any other languages that your Imagen uses - remember
+# to keep the word `text' if the file is human-readable.
+# [GRR 950115:  missing "postscript" or "ultrascript" (whatever it was called)]
+#
+# Now magic for IMAGEN font files...
+0	string		Rast		RST-format raster font data
+>45	string		>0		face %
+# From Jukka Ukkonen
+0	string		\033[K\002\0\0\017\033(a\001\0\001\033(g	Canon Bubble Jet BJC formatted data
+
+# From <mike at flyn.org>
+# These are the /etc/magic entries to decode data sent to an Epson printer.
+0       string          \x1B\x40\x1B\x28\x52\x08\x00\x00REMOTE1P        Epson Stylus Color 460 data
+
+
+#------------------------------------------------------------------------------
+# zenographics:  file(1) magic for Zenographics ZjStream printer data
+# Rick Richardson  rickr at mn.rr.com
+0	string		JZJZ
+>0x12	string		ZZ		Zenographics ZjStream printer data (big-endian)
+0	string		ZJZJ
+>0x12	string		ZZ		Zenographics ZjStream printer data (little-endian)
+
+
+#------------------------------------------------------------------------------
+# Oak Technologies printer stream
+# Rick Richardson <rickr at mn.rr.com>
+0       string          OAK
+>0x07	byte		0
+>0x0b	byte		0	Oak Technologies printer stream
+
+# This would otherwise be recognized as PostScript - nick at debian.org
+0	string		%!VMF 		SunClock's Vector Map Format data
+
+#------------------------------------------------------------------------------
+# HP LaserJet 1000 series downloadable firmware file
+0	string	\xbe\xefABCDEFGH	HP LaserJet 1000 series downloadable firmware   
+
+#------------------------------------------------------------------------------
+# project:  file(1) magic for Project management
+# 
+# Magic strings for ftnchek project files. Alexander Mai
+0	string	FTNCHEK_\ P	project file for ftnchek
+>10	string	1		version 2.7
+>10	string	2		version 2.8 to 2.10
+>10	string	3		version 2.11 or later
+
+#------------------------------------------------------------------------------
+# psdbms:  file(1) magic for psdatabase
+#
+0	belong&0xff00ffff	0x56000000	ps database
+>1	string	>\0	version %s
+>4	string	>\0	from kernel %s
+
+#------------------------------------------------------------------------------
+# psion:  file(1) magic for Psion handhelds data
+# from: Peter Breitenlohner <peb at mppmu.mpg.de>
+#
+0	lelong		0x10000037	Psion Series 5
+>4	lelong		0x10000039	font file
+>4	lelong		0x1000003A	printer driver
+>4	lelong		0x1000003B	clipboard
+>4	lelong		0x10000042	multi-bitmap image
+>4	lelong		0x1000006A	application infomation file
+>4	lelong		0x1000006D
+>>8	lelong		0x1000007D	sketch image
+>>8	lelong		0x1000007E	voice note
+>>8	lelong		0x1000007F	word file
+>>8	lelong		0x10000085	OPL program
+>>8	lelong		0x10000088	sheet file
+>>8	lelong		0x100001C4	EasyFax initialisation file
+>4	lelong		0x10000073	OPO module
+>4	lelong		0x10000074	OPL application
+>4	lelong		0x1000008A	exported multi-bitmap image
+
+0	lelong		0x10000041	Psion Series 5 ROM multi-bitmap image
+
+0	lelong		0x10000050	Psion Series 5
+>4	lelong		0x1000006D	database
+>4	lelong		0x100000E4	ini file
+
+0	lelong		0x10000079	Psion Series 5 binary:
+>4	lelong		0x00000000	DLL
+>4	lelong		0x10000049	comms hardware library
+>4	lelong		0x1000004A	comms protocol library
+>4	lelong		0x1000005D	OPX
+>4	lelong		0x1000006C	application
+>4	lelong		0x1000008D	DLL
+>4	lelong		0x100000AC	logical device driver
+>4	lelong		0x100000AD	physical device driver
+>4	lelong		0x100000E5	file transfer protocol
+>4	lelong		0x100000E5	file transfer protocol
+>4	lelong		0x10000140	printer defintion
+>4	lelong		0x10000141	printer defintion
+
+0	lelong		0x1000007A	Psion Series 5 executable
+
+#------------------------------------------------------------------------------
+# pulsar:  file(1) magic for Pulsar POP3 daemon binary files
+#
+# http://pulsar.sourceforge.net
+# mailto:rok.papez at lugos.si
+#
+
+0	belong	0x1ee7f11e	Pulsar POP3 daemon mailbox cache file.
+>4	ubelong	x		Version: %d.
+>8	ubelong	x		\b%d
+
+
+#------------------------------------------------------------------------------
+# pyramid:  file(1) magic for Pyramids
+#
+# XXX - byte order?
+#
+0	long		0x50900107	Pyramid 90x family executable
+0	long		0x50900108	Pyramid 90x family pure executable
+>16	long		>0		not stripped
+0	long		0x5090010b	Pyramid 90x family demand paged pure executable
+>16	long		>0		not stripped
+
+#------------------------------------------------------------------------------
+# python:  file(1) magic for python
+#
+# From: David Necas <yeti at physics.muni.cz>
+# often the module starts with a multiline string
+0	string		"""	a python script text
+# MAGIC as specified in Python/import.c (1.5 to 2.3.0a)
+# 20121  ( YEAR - 1995 ) + MONTH  + DAY (little endian followed by "\r\n"
+0	belong		0x994e0d0a	python 1.5/1.6 byte-compiled
+0	belong		0x87c60d0a	python 2.0 byte-compiled
+0	belong		0x2aeb0d0a	python 2.1 byte-compiled
+0	belong		0x2ded0d0a	python 2.2 byte-compiled
+0	belong		0x3bf20d0a	python 2.3 byte-compiled
+
+#------------------------------------------------------------------------------
+# file(1) magic for revision control files
+# From Hendrik Scholz <hendrik at scholz.net>
+0   string /1\ :pserver:    cvs password text file
+
+#------------------------------------------------------------------------------
+# riff:  file(1) magic for RIFF format
+# See
+#
+#	http://www.seanet.com/users/matts/riffmci/riffmci.htm
+#
+# AVI section extended by Patrik R�dman <patrik+file-magic at iki.fi>
+#
+0	string		RIFF		RIFF (little-endian) data
+# RIFF Palette format
+>8	string		PAL		\b, palette
+>>16	leshort		x		\b, version %d
+>>18	leshort		x		\b, %d entries
+# RIFF Device Independent Bitmap format
+>8	string		RDIB		\b, device-independent bitmap
+>>16	string		BM		
+>>>30	leshort		12		\b, OS/2 1.x format
+>>>>34	leshort		x		\b, %d x
+>>>>36	leshort		x		%d
+>>>30	leshort		64		\b, OS/2 2.x format
+>>>>34	leshort		x		\b, %d x
+>>>>36	leshort		x		%d
+>>>30	leshort		40		\b, Windows 3.x format
+>>>>34	lelong		x		\b, %d x
+>>>>38	lelong		x		%d x
+>>>>44	leshort		x		%d
+# RIFF MIDI format
+>8	string		RMID		\b, MIDI
+# RIFF Multimedia Movie File format
+>8	string		RMMP		\b, multimedia movie
+# Microsoft WAVE format (*.wav)
+>8	string		WAVE		\b, WAVE audio
+>>20	leshort		1		\b, Microsoft PCM
+>>>34	leshort		>0		\b, %d bit
+>>20	leshort		2		\b, Microsoft ADPCM
+>>20	leshort		6		\b, ITU G.711 A-law
+>>20	leshort		7		\b, ITU G.711 mu-law
+>>20	leshort		17		\b, IMA ADPCM
+>>20	leshort		20		\b, ITU G.723 ADPCM (Yamaha)
+>>20	leshort		49		\b, GSM 6.10
+>>20	leshort		64		\b, ITU G.721 ADPCM
+>>20	leshort		80		\b, MPEG
+>>20	leshort		85		\b, MPEG Layer 3
+>>22	leshort		=1		\b, mono
+>>22	leshort		=2		\b, stereo
+>>22	leshort		>2		\b, %d channels
+>>24	lelong		>0		%d Hz
+# Corel Draw Picture
+>8	string		CDRA		\b, Corel Draw Picture
+# AVI == Audio Video Interleave
+>8	string		AVI\040		\b, AVI
+>>12    string          LIST
+>>>20   string          hdrlavih
+>>>>&36 lelong          x               \b, %lu x
+>>>>&40 lelong          x               %lu,
+>>>>&4  lelong          >1000000        <1 fps,
+>>>>&4  lelong          1000000         1.00 fps,
+>>>>&4  lelong          500000          2.00 fps,
+>>>>&4  lelong          333333          3.00 fps,
+>>>>&4  lelong          250000          4.00 fps,
+>>>>&4  lelong          200000          5.00 fps,
+>>>>&4  lelong          166667          6.00 fps,
+>>>>&4  lelong          142857          7.00 fps,
+>>>>&4  lelong          125000          8.00 fps,
+>>>>&4  lelong          111111          9.00 fps,
+>>>>&4  lelong          100000          10.00 fps,
+# ]9.9,10.1[
+>>>>&4  lelong          <101010
+>>>>>&-4        lelong  >99010
+>>>>>>&-4       lelong  !100000         ~10 fps,
+>>>>&4  lelong          83333           12.00 fps,
+# ]11.9,12.1[
+>>>>&4  lelong          <84034
+>>>>>&-4        lelong  >82645
+>>>>>>&-4       lelong  !83333          ~12 fps,
+>>>>&4  lelong          66667           15.00 fps,
+# ]14.9,15.1[
+>>>>&4  lelong          <67114
+>>>>>&-4        lelong  >66225
+>>>>>>&-4       lelong  !66667          ~15 fps,
+>>>>&4  lelong          50000           20.00 fps,
+>>>>&4  lelong          41708           23.98 fps,
+>>>>&4  lelong          41667           24.00 fps,
+# ]23.9,24.1[
+>>>>&4  lelong          <41841
+>>>>>&-4        lelong  >41494
+>>>>>>&-4       lelong  !41708
+>>>>>>>&-4      lelong  !41667          ~24 fps,
+>>>>&4  lelong          40000           25.00 fps,
+# ]24.9,25.1[
+>>>>&4  lelong          <40161
+>>>>>&-4        lelong  >39841
+>>>>>>&-4       lelong  !40000          ~25 fps,
+>>>>&4  lelong          33367           29.97 fps,
+>>>>&4  lelong          33333           30.00 fps,
+# ]29.9,30.1[
+>>>>&4  lelong          <33445
+>>>>>&-4        lelong  >33223
+>>>>>>&-4       lelong  !33367
+>>>>>>>&-4      lelong  !33333          ~30 fps,
+>>>>&4  lelong          <32224          >30 fps,
+##>>>>&4  lelong          x               (%lu)
+##>>>>&20 lelong          x               %lu frames,
+# Note: The tests below assume that the AVI has 1 or 2 streams,
+#       "vids" optionally followed by "auds".
+#       (Should cover 99.9% of all AVIs.)
+# assuming avih length = 56
+>>>88   string  LIST
+>>>>96  string  strlstrh
+>>>>>108        string  vids    video:
+>>>>>>&0        lelong  0               uncompressed
+# skip past vids strh
+>>>>>>(104.l+108)       string  strf
+>>>>>>>(104.l+132)      lelong          1       RLE 8bpp
+>>>>>>>(104.l+132)      string/c        cvid    Cinepak
+>>>>>>>(104.l+132)      string/c        i263    Intel I.263
+>>>>>>>(104.l+132)      string/c        iv32    Indeo 3.2
+>>>>>>>(104.l+132)      string/c        iv41    Indeo 4.1
+>>>>>>>(104.l+132)      string/c        iv50    Indeo 5.0
+>>>>>>>(104.l+132)      string/c        mp42    Microsoft MPEG-4 v2
+>>>>>>>(104.l+132)      string/c        mp43    Microsoft MPEG-4 v3
+>>>>>>>(104.l+132)      string/c        mjpg    Motion JPEG
+>>>>>>>(104.l+132)      string/c        div3    DivX 3
+>>>>>>>>112             string/c        div3    Low-Motion
+>>>>>>>>112             string/c        div4    Fast-Motion
+>>>>>>>(104.l+132)      string/c        divx    DivX 4
+>>>>>>>(104.l+132)      string/c        dx50    DivX 5
+>>>>>>>(104.l+132)      string/c        xvid    XviD
+>>>>>>>(104.l+132)      lelong  0
+##>>>>>>>(104.l+132)      string  x       (%.4s)
+# skip past first (video) LIST
+>>>>(92.l+96)   string  LIST
+>>>>>(92.l+104) string  strlstrh
+>>>>>>(92.l+116)        string          auds    \b, audio:
+# auds strh length = 56:
+>>>>>>>(92.l+172)       string          strf
+>>>>>>>>(92.l+180)      leshort 0x0001  uncompressed PCM
+>>>>>>>>(92.l+180)      leshort 0x0002  ADPCM
+>>>>>>>>(92.l+180)      leshort 0x0055  MPEG-1 Layer 3
+>>>>>>>>(92.l+180)      leshort 0x2000  Dolby AC3
+>>>>>>>>(92.l+180)      leshort 0x0161  DivX
+##>>>>>>>>(92.l+180)      leshort x       (0x%.4x)
+>>>>>>>>(92.l+182)      leshort 1       (mono,
+>>>>>>>>(92.l+182)      leshort 2       (stereo,
+>>>>>>>>(92.l+182)      leshort >2      (%d channels,
+>>>>>>>>(92.l+184)      lelong  x       %d Hz)
+# auds strh length = 64:
+>>>>>>>(92.l+180)       string          strf
+>>>>>>>>(92.l+188)      leshort 0x0001  uncompressed PCM
+>>>>>>>>(92.l+188)      leshort 0x0002  ADPCM
+>>>>>>>>(92.l+188)      leshort 0x0055  MPEG-1 Layer 3
+>>>>>>>>(92.l+188)      leshort 0x2000  Dolby AC3
+>>>>>>>>(92.l+188)      leshort 0x0161  DivX
+##>>>>>>>>(92.l+188)      leshort x       (0x%.4x)
+>>>>>>>>(92.l+190)      leshort 1       (mono,
+>>>>>>>>(92.l+190)      leshort 2       (stereo,
+>>>>>>>>(92.l+190)      leshort >2      (%d channels,
+>>>>>>>>(92.l+192)      lelong  x       %d Hz)
+# Animated Cursor format
+>8	string		ACON		\b, animated cursor
+# SoundFont 2 <mpruett at sgi.com>
+>8	string		sfbk		SoundFont/Bank
+# MPEG-1 wrapped in a RIFF, apparently
+>8      string          CDXA            \b, wrapped MPEG-1 (CDXA)
+>8	string		4XMV		\b, 4X Movie file 
+
+#
+# XXX - some of the below may only appear in little-endian form.
+#
+# Also "MV93" appears to be for one form of Macromedia Director
+# files, and "GDMF" appears to be another multimedia format.
+#
+0	string		RIFX		RIFF (big-endian) data
+# RIFF Palette format
+>8	string		PAL		\b, palette
+>>16	beshort		x		\b, version %d
+>>18	beshort		x		\b, %d entries
+# RIFF Device Independent Bitmap format
+>8	string		RDIB		\b, device-independent bitmap
+>>16	string		BM		
+>>>30	beshort		12		\b, OS/2 1.x format
+>>>>34	beshort		x		\b, %d x
+>>>>36	beshort		x		%d
+>>>30	beshort		64		\b, OS/2 2.x format
+>>>>34	beshort		x		\b, %d x
+>>>>36	beshort		x		%d
+>>>30	beshort		40		\b, Windows 3.x format
+>>>>34	belong		x		\b, %d x
+>>>>38	belong		x		%d x
+>>>>44	beshort		x		%d
+# RIFF MIDI format
+>8	string		RMID		\b, MIDI
+# RIFF Multimedia Movie File format
+>8	string		RMMP		\b, multimedia movie
+# Microsoft WAVE format (*.wav)
+>8	string		WAVE		\b, WAVE audio
+>>20	leshort		1		\b, Microsoft PCM
+>>>34	leshort		>0		\b, %d bit
+>>22	beshort		=1		\b, mono
+>>22	beshort		=2		\b, stereo
+>>22	beshort		>2		\b, %d channels
+>>24	belong		>0		%d Hz
+# Corel Draw Picture
+>8	string		CDRA		\b, Corel Draw Picture
+# AVI == Audio Video Interleave
+>8	string		AVI\040		\b, AVI
+# Animated Cursor format
+>8	string		ACON		\b, animated cursor
+# Notation Interchange File Format (big-endian only)
+>8	string		NIFF		\b, Notation Interchange File Format
+# SoundFont 2 <mpruett at sgi.com>
+>8	string		sfbk		SoundFont/Bank
+
+#------------------------------------------------------------------------------
+# apple:  file(1) magic for Apple file formats
+#
+0	string		FiLeStArTfIlEsTaRt	binscii (apple ][) text
+0	string		\x0aGL			Binary II (apple ][) data
+0	string		\x76\xff		Squeezed (apple ][) data
+0	string		NuFile			NuFile archive (apple ][) data
+0	string		N\xf5F\xe9l\xe5		NuFile archive (apple ][) data
+0	belong		0x00051600		AppleSingle encoded Macintosh file
+0	belong		0x00051607		AppleDouble encoded Macintosh file
+
+# magic for Newton PDA package formats
+# from Ruda Moura <ruda at helllabs.org>
+0	string	package0	Newton package, NOS 1.x,
+>12	belong	&0x80000000	AutoRemove,
+>12	belong	&0x40000000	CopyProtect,
+>12	belong	&0x10000000	NoCompression,
+>12	belong	&0x04000000	Relocation,
+>12	belong	&0x02000000	UseFasterCompression,
+>16	belong	x		version %d
+
+0	string	package1	Newton package, NOS 2.x,
+>12	belong	&0x80000000	AutoRemove,
+>12	belong	&0x40000000	CopyProtect,
+>12	belong	&0x10000000	NoCompression,
+>12	belong	&0x04000000	Relocation,
+>12	belong	&0x02000000	UseFasterCompression,
+>16	belong	x		version %d
+
+0	string	package4	Newton package,
+>8	byte	8		NOS 1.x,
+>8	byte	9		NOS 2.x,
+>12	belong	&0x80000000	AutoRemove,
+>12	belong	&0x40000000	CopyProtect,
+>12	belong	&0x10000000	NoCompression,
+
+# The following entries for the Apple II are for files that have
+# been transferred as raw binary data from an Apple, without having
+# been encapsulated by any of the above archivers.
+#
+# In general, Apple II formats are hard to identify because Apple DOS
+# and especially Apple ProDOS have strong typing in the file system and
+# therefore programmers never felt much need to include type information
+# in the files themselves.
+#
+# Eric Fischer <enf at pobox.com>
+
+# AppleWorks word processor:
+#
+# This matches the standard tab stops for an AppleWorks file, but if
+# a file has a tab stop set in the first four columns this will fail.
+#
+# The "O" is really the magic number, but that's so common that it's
+# necessary to check the tab stops that follow it to avoid false positives.
+
+4       string          O====   AppleWorks word processor data
+>85     byte&0x01       >0      \b, zoomed
+>90     byte&0x01       >0      \b, paginated
+>92     byte&0x01       >0      \b, with mail merge
+#>91    byte            x       \b, left margin %d
+
+# AppleWorks database:
+#
+# This isn't really a magic number, but it's the closest thing to one
+# that I could find.  The 1 and 2 really mean "order in which you defined
+# categories" and "left to right, top to bottom," respectively; the D and R
+# mean that the cursor should move either down or right when you press Return.
+
+#30	string		\x01D	AppleWorks database data
+#30	string		\x02D	AppleWorks database data
+#30	string		\x01R	AppleWorks database data
+#30	string		\x02R	AppleWorks database data
+
+# AppleWorks spreadsheet:
+#
+# Likewise, this isn't really meant as a magic number.  The R or C means
+# row- or column-order recalculation; the A or M means automatic or manual
+# recalculation.
+
+#131	string		RA	AppleWorks spreadsheet data
+#131	string		RM	AppleWorks spreadsheet data
+#131	string		CA	AppleWorks spreadsheet data
+#131	string		CM	AppleWorks spreadsheet data
+
+# Applesoft BASIC:
+#
+# This is incredibly sloppy, but will be true if the program was
+# written at its usual memory location of 2048 and its first line
+# number is less than 256.  Yuck.
+
+0       belong&0xff00ff 0x80000 Applesoft BASIC program data
+#>2     leshort         x       \b, first line number %d
+
+# ORCA/EZ assembler:
+# 
+# This will not identify ORCA/M source files, since those have
+# some sort of date code instead of the two zero bytes at 6 and 7
+# XXX Conflicts with ELF
+#4       belong&0xff00ffff       0x01000000      ORCA/EZ assembler source data
+#>5      byte                    x               \b, build number %d
+
+# Broderbund Fantavision
+#
+# I don't know what these values really mean, but they seem to recur.
+# Will they cause too many conflicts?
+
+# Probably :-)
+#2	belong&0xFF00FF		0x040008	Fantavision movie data
+
+# Some attempts at images.
+#
+# These are actually just bit-for-bit dumps of the frame buffer, so
+# there's really no reasonably way to distinguish them except for their
+# address (if preserved) -- 8192 or 16384 -- and their length -- 8192
+# or, occasionally, 8184.
+#
+# Nevertheless this will manage to catch a lot of images that happen
+# to have a solid-colored line at the bottom of the screen.
+
+8144	string	\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F	Apple II image with white background
+8144	string	\x55\x2A\x55\x2A\x55\x2A\x55\x2A	Apple II image with purple background
+8144	string	\x2A\x55\x2A\x55\x2A\x55\x2A\x55	Apple II image with green background
+8144	string	\xD5\xAA\xD5\xAA\xD5\xAA\xD5\xAA	Apple II image with blue background
+8144	string	\xAA\xD5\xAA\xD5\xAA\xD5\xAA\xD5	Apple II image with orange background
+
+# Beagle Bros. Apple Mechanic fonts
+
+0	belong&0xFF00FFFF	0x6400D000	Apple Mechanic font
+
+#------------------------------------------------------------------------------
+# macintosh description
+#
+# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
+# Daniel Quinlan, quinlan at yggdrasil.com
+11	string	must\ be\ converted\ with\ BinHex	BinHex binary text
+>41	string	x					\b, version %.3s
+
+# Stuffit archives are the de facto standard of compression for Macintosh
+# files obtained from most archives. (franklsm at tuns.ca)
+0	string		SIT!			StuffIt Archive (data)
+>2	string		x			: %s
+0	string		SITD			StuffIt Deluxe (data)
+>2	string		x			: %s
+0	string		Seg			StuffIt Deluxe Segment (data)
+>2	string		x			: %s
+
+# Newer StuffIt archives (grant at netbsd.org)
+0	string		StuffIt			StuffIt Archive
+>162	string		>0			: %s
+
+# Macintosh Applications and Installation binaries (franklsm at tuns.ca)
+0	string		APPL			Macintosh Application (data)
+>2	string		x			\b: %s
+
+# Macintosh System files (franklsm at tuns.ca)
+0	string		zsys			Macintosh System File (data)
+0	string		FNDR			Macintosh Finder (data)
+0	string		libr			Macintosh Library (data)
+>2	string		x			: %s
+0	string		shlb			Macintosh Shared Library (data)
+>2	string		x			: %s
+0	string		cdev			Macintosh Control Panel (data)
+>2	string		x			: %s
+0	string		INIT			Macintosh Extension (data)
+>2	string		x			: %s
+0	string		FFIL			Macintosh Truetype Font (data)
+>2	string		x			: %s
+0	string		LWFN			Macintosh Postscript Font (data)
+>2	string		x			: %s
+
+# Additional Macintosh Files (franklsm at tuns.ca)
+0	string		PACT			Macintosh Compact Pro Archive (data)
+>2	string		x			: %s
+0	string		ttro			Macintosh TeachText File (data)
+>2	string		x			: %s
+0	string		TEXT			Macintosh TeachText File (data)
+>2	string		x			: %s
+0	string		PDF			Macintosh PDF File (data)
+>2	string		x			: %s
+
+# MacBinary format (Eric Fischer, enf at pobox.com)
+#
+# Unfortunately MacBinary doesn't really have a magic number prior
+# to the MacBinary III format.  The checksum is really the way to
+# do it, but the magic file format isn't up to the challenge.
+#
+# 0	byte		0
+# 1	byte				# filename length
+# 2	string				# filename
+# 65    string				# file type
+# 69	string				# file creator
+# 73	byte				# Finder flags
+# 74	byte		0
+# 75	beshort				# vertical posn in window
+# 77	beshort				# horiz posn in window
+# 79	beshort				# window or folder ID
+# 81    byte				# protected?
+# 82	byte		0
+# 83	belong				# length of data segment
+# 87	belong				# length of resource segment
+# 91	belong				# file creation date
+# 95	belong				# file modification date
+# 99	beshort				# length of comment after resource
+# 101	byte				# new Finder flags
+# 102	string		mBIN		# (only in MacBinary III)
+# 106	byte				# char. code of file name
+# 107	byte				# still more Finder flags
+# 116	belong				# total file length
+# 120	beshort				# length of add'l header
+# 122	byte		129		# for MacBinary II
+# 122	byte		130		# for MacBinary III
+# 123	byte		129		# minimum version that can read fmt
+# 124	beshort				# checksum
+#
+# This attempts to use the version numbers as a magic number, requiring
+# that the first one be 0x80, 0x81, 0x82, or 0x83, and that the second
+# be 0x81.  This works for the files I have, but maybe not for everyone's.
+
+# Unfortunately, this magic is quite weak - MPi
+#122	beshort&0xFCFF	0x8081		Macintosh MacBinary data
+
+# MacBinary I doesn't have the version number field at all, but MacBinary II
+# has been in use since 1987 so I hope there aren't many really old files
+# floating around that this will miss.  The original spec calls for using
+# the nulls in 0, 74, and 82 as the magic number.
+#
+# Another possibility, that would also work for MacBinary I, is to use
+# the assumption that 65-72 will all be ASCII (0x20-0x7F), that 73 will
+# have bits 1 (changed), 2 (busy), 3 (bozo), and 6 (invisible) unset,
+# and that 74 will be 0.  So something like
+# 
+# 71 	belong&0x80804EFF 0x00000000 	Macintosh MacBinary data
+# 
+# >73	byte&0x01	0x01		\b, inited
+# >73	byte&0x02	0x02		\b, changed
+# >73	byte&0x04	0x04		\b, busy
+# >73	byte&0x08	0x08		\b, bozo
+# >73	byte&0x10	0x10		\b, system
+# >73	byte&0x10	0x20		\b, bundle
+# >73	byte&0x10	0x40		\b, invisible
+# >73	byte&0x10	0x80		\b, locked
+
+#>65	string		x		\b, type "%4.4s"
+
+#>65	string		8BIM		(PhotoShop)
+#>65	string		ALB3		(PageMaker 3)
+#>65	string		ALB4		(PageMaker 4)
+#>65	string		ALT3		(PageMaker 3)
+#>65	string		APPL		(application)
+#>65	string		AWWP		(AppleWorks word processor)
+#>65	string		CIRC		(simulated circuit)
+#>65	string		DRWG		(MacDraw)
+#>65	string		EPSF		(Encapsulated PostScript)
+#>65	string		FFIL		(font suitcase)
+#>65	string		FKEY		(function key)
+#>65	string		FNDR		(Macintosh Finder)
+#>65	string		GIFf		(GIF image)
+#>65	string		Gzip		(GNU gzip)
+#>65	string		INIT		(system extension)
+#>65	string		LIB\ 		(library)
+#>65	string		LWFN		(PostScript font)
+#>65	string		MSBC		(Microsoft BASIC)
+#>65	string		PACT		(Compact Pro archive)
+#>65	string		PDF\ 		(Portable Document Format)
+#>65	string		PICT		(picture)
+#>65	string		PNTG		(MacPaint picture)
+#>65	string		PREF		(preferences)
+#>65	string		PROJ		(Think C project)
+#>65	string		QPRJ		(Think Pascal project)
+#>65	string		SCFL		(Defender scores)
+#>65	string		SCRN		(startup screen)
+#>65	string		SITD		(StuffIt Deluxe)
+#>65	string		SPn3		(SuperPaint)
+#>65	string		STAK		(HyperCard stack)
+#>65	string		Seg\ 		(StuffIt segment)
+#>65	string		TARF		(Unix tar archive)
+#>65	string		TEXT		(ASCII)
+#>65	string		TIFF		(TIFF image)
+#>65	string		TOVF		(Eudora table of contents)
+#>65	string		WDBN		(Microsoft Word word processor)
+#>65	string		WORD		(MacWrite word processor)
+#>65	string		XLS\ 		(Microsoft Excel)
+#>65	string		ZIVM		(compress (.Z))
+#>65	string		ZSYS		(Pre-System 7 system file)
+#>65	string		acf3		(Aldus FreeHand)
+#>65	string		cdev		(control panel)
+#>65	string		dfil		(Desk Acessory suitcase)
+#>65	string		libr		(library)
+#>65	string		nX^d		(WriteNow word processor)
+#>65	string		nX^w		(WriteNow dictionary)
+#>65	string		rsrc		(resource)
+#>65	string		scbk		(Scrapbook)
+#>65	string		shlb		(shared library)
+#>65	string		ttro		(SimpleText read-only)
+#>65	string		zsys		(system file)
+
+#>69	string		x		\b, creator "%4.4s"
+
+# Somewhere, Apple has a repository of registered Creator IDs.  These are
+# just the ones that I happened to have files from and was able to identify.
+
+#>69	string		8BIM		(Adobe Photoshop)
+#>69	string		ALD3		(PageMaker 3)
+#>69	string		ALD4		(PageMaker 4)
+#>69	string		ALFA		(Alpha editor)
+#>69	string		APLS		(Apple Scanner)
+#>69	string		APSC		(Apple Scanner)
+#>69	string		BRKL		(Brickles)
+#>69	string		BTFT		(BitFont)
+#>69	string		CCL2 		(Common Lisp 2)
+#>69	string		CCL\ 		(Common Lisp)
+#>69	string		CDmo		(The Talking Moose)
+#>69	string		CPCT		(Compact Pro)
+#>69	string		CSOm		(Eudora)
+#>69	string		DMOV		(Font/DA Mover)
+#>69	string		DSIM		(DigSim)
+#>69	string		EDIT		(Macintosh Edit)
+#>69	string		ERIK		(Macintosh Finder)
+#>69	string		EXTR		(self-extracting archive)
+#>69	string		Gzip		(GNU gzip)
+#>69	string		KAHL		(Think C)
+#>69	string		LWFU		(LaserWriter Utility)
+#>69	string		LZIV		(compress)
+#>69	string		MACA		(MacWrite)
+#>69	string		MACS		(Macintosh operating system)
+#>69	string		MAcK		(MacKnowledge terminal emulator)
+#>69	string		MLND		(Defender)
+#>69	string		MPNT		(MacPaint)
+#>69	string		MSBB		(Microsoft BASIC (binary))
+#>69	string		MSWD		(Microsoft Word)
+#>69	string		NCSA		(NCSA Telnet)
+#>69	string		PJMM		(Think Pascal)
+#>69	string		PSAL		(Hunt the Wumpus)
+#>69	string		PSI2		(Apple File Exchange)
+#>69	string		R*ch		(BBEdit)
+#>69	string		RMKR		(Resource Maker)
+#>69	string		RSED		(Resource Editor)
+#>69	string		Rich		(BBEdit)
+#>69	string		SIT!		(StuffIt)
+#>69	string		SPNT		(SuperPaint)
+#>69	string		Unix		(NeXT Mac filesystem)
+#>69	string		VIM!		(Vim editor)
+#>69	string		WILD		(HyperCard)
+#>69	string		XCEL		(Microsoft Excel)
+#>69	string		aCa2		(Fontographer)
+#>69	string		aca3		(Aldus FreeHand)
+#>69	string		dosa		(Macintosh MS-DOS file system)
+#>69	string		movr		(Font/DA Mover)
+#>69	string		nX^n		(WriteNow)
+#>69	string		pdos		(Apple ProDOS file system)
+#>69	string		scbk		(Scrapbook)
+#>69	string		ttxt		(SimpleText)
+#>69	string		ufox		(Foreign File Access)
+
+# Just in case...
+
+102	string		mBIN		MacBinary III data with surprising version number
+
+# sas magic from Bruce Foster (bef at nwu.edu)
+#
+#0	string		SAS		SAS
+#>8	string		x		%s
+0	string		SAS		SAS
+>24	string		DATA		data file
+>24	string		CATALOG		catalog
+>24	string		INDEX		data file index
+>24	string		VIEW		data view
+# sas 7+ magic from Reinhold Koch (reinhold.koch at roche.com)
+#
+0x54    string          SAS             SAS 7+
+>0x9C   string          DATA            data file
+>0x9C   string          CATALOG         catalog
+>0x9C   string          INDEX           data file index
+>0x9C   string          VIEW            data view
+
+# spss magic for SPSS system and portable files, 
+#	 from Bruce Foster (bef at nwu.edu).
+
+0	long		0xc1e2c3c9	SPSS Portable File
+>40	string 		x		%s
+
+0	string		$FL2		SPSS System File
+>24	string		x		%s
+
+# Macintosh filesystem data
+# From "Tom N Harris" <telliamed at mac.com>
+# Fixed HFS+ and Partition map magic: Ethan Benson <erbenson at alaska.net>
+# The MacOS epoch begins on 1 Jan 1904 instead of 1 Jan 1970, so these
+# entries depend on the data arithmetic added after v.35
+# There's also some Pascal strings in here, ditto...
+
+# The boot block signature, according to IM:Files, is 
+# "for HFS volumes, this field always contains the value 0x4C4B."
+# But if this is true for MFS or HFS+ volumes, I don't know.
+# Alternatively, the boot block is supposed to be zeroed if it's
+# unused, so a simply >0 should suffice.
+
+0x400	beshort			0xD2D7		Macintosh MFS data
+>0	beshort			0x4C4B		(bootable)
+>0x40a	beshort			&0x8000		(locked)
+>0x402	beldate-0x7C25B080	x		created: %s,
+>0x406	beldate-0x7C25B080	>0		last backup: %s,
+>0x414	belong			x		block size: %d,
+>0x412	beshort			x		number of blocks: %d,
+>0x424	pstring			x		volume name: %s
+
+# "BD" is has many false positives
+#0x400	beshort			0x4244		Macintosh HFS data
+#>0	beshort			0x4C4B		(bootable)
+#>0x40a	beshort			&0x8000		(locked)
+#>0x40a	beshort			^0x0100		(mounted)
+#>0x40a	beshort			&0x0200		(spared blocks)
+#>0x40a	beshort			&0x0800		(unclean)
+#>0x47C	beshort			0x482B		(Embedded HFS+ Volume)
+#>0x402	beldate-0x7C25B080	x		created: %s,
+#>0x406	beldate-0x7C25B080	x		last modified: %s,
+#>0x440	beldate-0x7C25B080	>0		last backup: %s,
+#>0x414	belong			x		block size: %d,
+#>0x412	beshort			x		number of blocks: %d,
+#>0x424	pstring			x		volume name: %s
+
+0x400	beshort			0x482B		Macintosh HFS Extended
+>&0	beshort			x		version %d data
+>0	beshort			0x4C4B		(bootable)
+>0x404	belong			^0x00000100	(mounted)
+>&2	belong			&0x00000200	(spared blocks)
+>&2	belong			&0x00000800	(unclean)
+>&2	belong			&0x00008000	(locked)
+>&6	string			x		last mounted by: '%.4s',
+# really, that should be treated as a belong and we print a string
+# based on the value. TN1150 only mentions '8.10' for "MacOS 8.1"
+>&14	beldate-0x7C25B080	x		created: %s,
+# only the creation date is local time, all other timestamps in HFS+ are UTC.
+>&18	bedate-0x7C25B080	x		last modified: %s,
+>&22	bedate-0x7C25B080	>0		last backup: %s,
+>&26	bedate-0x7C25B080	>0		last checked: %s,
+>&38	belong			x		block size: %d,
+>&42	belong			x		number of blocks: %d,
+>&46	belong			x		free blocks: %d
+
+# I don't think this is really necessary since it doesn't do much and 
+# anything with a valid driver descriptor will also have a valid
+# partition map
+#0		beshort		0x4552		Apple Device Driver data
+#>&24		beshort		=1		\b, MacOS
+
+# Is that the partition type a cstring or a pstring? Well, IM says "strings 
+# shorter than 32 bytes must be terminated with NULL" so I'll treat it as a 
+# cstring. Of course, partitions can contain more than four entries, but 
+# what're you gonna do?
+0x200		beshort		0x504D		Apple Partition data
+>0x2		beshort		x		block size: %d,
+>0x230		string		x		first type: %s,
+>0x210		string		x		name: %s,
+>0x254		belong		x		number of blocks: %d,
+>0x400		beshort		0x504D		
+>>0x430		string		x		second type: %s,
+>>0x410		string		x		name: %s,
+>>0x454		belong		x		number of blocks: %d,
+>>0x800		beshort		0x504D		
+>>>0x830	string		x		third type: %s,
+>>>0x810	string		x		name: %s,
+>>>0x854	belong		x		number of blocks: %d,
+>>>0xa00	beshort		0x504D		
+>>>>0xa30	string		x		fourth type: %s,
+>>>>0xa10	string		x		name: %s,
+>>>>0xa54	belong		x		number of blocks: %d
+# AFAIK, only the signature is different
+0x200		beshort		0x5453		Apple Old Partition data
+>0x2		beshort		x		block size: %d,
+>0x230		string		x		first type: %s,
+>0x210		string		x		name: %s,
+>0x254		belong		x		number of blocks: %d,
+>0x400		beshort		0x504D		
+>>0x430		string		x		second type: %s,
+>>0x410		string		x		name: %s,
+>>0x454		belong		x		number of blocks: %d,
+>>0x800		beshort		0x504D		
+>>>0x830	string		x		third type: %s,
+>>>0x810	string		x		name: %s,
+>>>0x854	belong		x		number of blocks: %d,
+>>>0xa00	beshort		0x504D		
+>>>>0xa30	string		x		fourth type: %s,
+>>>>0xa10	string		x		name: %s,
+>>>>0xa54	belong		x		number of blocks: %d
+
+# From: Remi Mommsen <mommsen at slac.stanford.edu>
+0		string		BOMStore	Mac OS X bill of materials (BOM) fil
+#------------------------------------------------------------------------------
+#
+# RPM: file(1) magic for Red Hat Packages   Erik Troan (ewt at redhat.com)
+#
+0	beshort		0xedab
+>2	beshort		0xeedb		RPM
+>>4	byte		x		v%d
+>>6	beshort		0		bin
+>>6	beshort		1		src
+>>8	beshort		1		i386
+>>8	beshort		2		Alpha
+>>8	beshort		3		Sparc
+>>8	beshort		4		MIPS
+>>8	beshort		5		PowerPC
+>>8	beshort		6		68000
+>>8	beshort		7	SGI
+>>8	beshort		8		RS6000
+>>8	beshort		9		IA64
+>>8	beshort		10		Sparc64
+>>8	beshort		11		MIPSel
+>>8	beshort		12		ARM
+>>10	string		x		%s
+
+#------------------------------------------------------------------------------
+# rtf:	file(1) magic for Rich Text Format (RTF)
+#
+# Duncan P. Simpson, D.P.Simpson at dcs.warwick.ac.uk
+#
+0	string		{\\rtf		Rich Text Format data,
+>5	byte		x		version %c,
+>6	string		\\ansi		ANSI
+>6	string		\\mac		Apple Macintosh
+>6	string		\\pc		IBM PC, code page 437
+>6	string		\\pca		IBM PS/2, code page 850
+
+#------------------------------------------------------------------------------
+# sc:  file(1) magic for "sc" spreadsheet
+#
+38	string		Spreadsheet	sc spreadsheet file
+
+#------------------------------------------------------------------------------
+# sccs:  file(1) magic for SCCS archives
+#
+# SCCS archive structure:
+# \001h01207
+# \001s 00276/00000/00000
+# \001d D 1.1 87/09/23 08:09:20 ian 1 0
+# \001c date and time created 87/09/23 08:09:20 by ian
+# \001e
+# \001u
+# \001U
+# ... etc.
+# Now '\001h' happens to be the same as the 3B20's a.out magic number (0550).
+# *Sigh*. And these both came from various parts of the USG.
+# Maybe we should just switch everybody from SCCS to RCS!
+# Further, you can't just say '\001h0', because the five-digit number
+# is a checksum that could (presumably) have any leading digit,
+# and we don't have regular expression matching yet. 
+# Hence the following official kludge:
+8	string		\001s\ 			SCCS archive data
+
+#------------------------------------------------------------------------------
+# sendmail:  file(1) magic for sendmail config files
+#
+# XXX - byte order?
+#
+0	byte	046	  Sendmail frozen configuration 
+>16	string	>\0	  - version %s
+0	short	0x271c	  Sendmail frozen configuration
+>16	string	>\0	  - version %s
+
+#------------------------------------------------------------------------------
+# sendmail:  file(1) magic for sendmail m4(1) files
+#
+# From Hendrik Scholz <hendrik at scholz.net>
+# i.e. files in /usr/share/sendmail/cf/
+#
+0   string  divert(-1)\n    sendmail m4 text file
+
+
+#------------------------------------------------------------------------------
+# sequent:  file(1) magic for Sequent machines
+#
+# Sequent information updated by Don Dwiggins <atsun!dwiggins>.
+# For Sequent's multiprocessor systems (incomplete).
+0	lelong	0x00ea        	BALANCE NS32000 .o
+>16	lelong	>0		not stripped
+>124	lelong	>0		version %ld
+0	lelong	0x10ea        	BALANCE NS32000 executable (0 @ 0)
+>16	lelong  >0            	not stripped
+>124	lelong	>0		version %ld
+0	lelong	0x20ea        	BALANCE NS32000 executable (invalid @ 0)
+>16	lelong  >0            	not stripped
+>124	lelong	>0		version %ld
+0	lelong	0x30ea        	BALANCE NS32000 standalone executable
+>16	lelong  >0          	not stripped
+>124	lelong	>0		version %ld
+#
+# Symmetry information added by Jason Merrill <jason at jarthur.claremont.edu>.
+# Symmetry magic nums will not be reached if DOS COM comes before them;
+# byte 0xeb is matched before these get a chance.
+0	leshort	0x12eb		SYMMETRY i386 .o
+>16	lelong	>0		not stripped
+>124	lelong	>0		version %ld
+0	leshort	0x22eb		SYMMETRY i386 executable (0 @ 0)
+>16	lelong	>0		not stripped
+>124	lelong	>0		version %ld
+0	leshort	0x32eb		SYMMETRY i386 executable (invalid @ 0)
+>16	lelong	>0		not stripped
+>124	lelong	>0		version %ld
+0	leshort	0x42eb		SYMMETRY i386 standalone executable
+>16	lelong	>0		not stripped
+>124	lelong	>0		version %ld
+
+#------------------------------------------------------------------------------
+# sgi:  file(1) magic for Silicon Graphics applications
+
+#
+#
+# Performance Co-Pilot file types
+0	string	PmNs				PCP compiled namespace (V.0)
+0	string	PmN				PCP compiled namespace
+>3	string	>\0				(V.%1.1s)
+3	belong	0x84500526			PCP archive
+>7	byte	x				(V.%d)
+>20	belong	-2				temporal index
+>20	belong	-1				metadata
+>20	belong	0				log volume #0
+>20	belong	>0				log volume #%ld
+>24	string	>\0				host: %s
+0	string	PCPFolio			PCP 
+>9	string	Version:			Archive Folio
+>18	string	>\0				(V.%s)
+0	string	#pmchart			PCP pmchart view
+>9	string	Version
+>17	string	>\0				(V%-3.3s)
+0	string	pmview				PCP pmview config
+>7	string	Version
+>15	string	>\0				(V%-3.3s)
+0	string	#pmlogger			PCP pmlogger config
+>10	string	Version
+>18	string	>\0				(V%1.1s)
+0	string	#pmdahotproc			PCP pmdahotproc config
+>13	string	Version
+>21	string	>\0				(V%-3.3s)
+0	string	PcPh				PCP Help 
+>4	string	1				Index
+>4	string	2				Text
+>5	string	>\0				(V.%1.1s)
+0	string	#pmieconf-rules			PCP pmieconf rules
+>16	string	>\0				(V.%1.1s)
+3	string	pmieconf-pmie			PCP pmie config
+>17	string	>\0				(V.%1.1s)
+
+# SpeedShop data files
+0	lelong	0x13130303			SpeedShop data file
+
+# mdbm files
+0	lelong	0x01023962			mdbm file, version 0 (obsolete)
+0	string	mdbm				mdbm file,
+>5	byte	x				version %d,
+>6	byte	x				2^%d pages,
+>7	byte	x				pagesize 2^%d,
+>17	byte	x				hash %d,
+>11	byte	x				dataformat %d
+
+# Alias|Wavefront Maya files
+0	string	//Maya ASCII	Alias|Wavefront Maya Ascii File,
+>13	lelong	x	version %s
+8	string	MAYAFOR4	Alias|Wavefront Maya Binary File,
+>32	lelong	x	version %s scene
+8	string	MayaFOR4	Alias|Wavefront Maya Binary File,
+>32	lelong	x	version %s scene
+8	string	CIMG		Alias|Wavefront Maya Image File
+8	string	DEEP		Alias|Wavefront Maya Image File
+
+#------------------------------------------------------------------------------
+# sgml:  file(1) magic for Standard Generalized Markup Language
+# HyperText Markup Language (HTML) is an SGML document type,
+# from Daniel Quinlan (quinlan at yggdrasil.com)
+# adapted to string extenstions by Anthon van der Neut <anthon at mnt.org)
+0   string/cB	\<!DOCTYPE\ html	HTML document text
+0   string/cb	\<head			HTML document text
+0   string/cb	\<title			HTML document text
+0   string/cb	\<html			HTML document text
+
+# Extensible markup language (XML), a subset of SGML
+# from Marc Prud'hommeaux (marc at apocalypse.org)
+0	string/cb	\<?xml			XML document text
+0	string		\<?xml\ version "	XML
+0	string		\<?xml\ version="	XML
+>15	string		>\0			%.3s document text
+>>23	string		\<xsl:stylesheet	(XSL stylesheet)
+>>24	string		\<xsl:stylesheet	(XSL stylesheet)
+0	string/b	\<?xml			XML document text
+0	string/cb	\<?xml			broken XML document text
+
+
+# SGML, mostly from rph at sq
+0   string/cb	\<!doctype		exported SGML document text
+0   string/cb	\<!subdoc		exported SGML subdocument text
+0   string/cb	\<!--			exported SGML document text
+
+# Web browser cookie files
+# (Mozilla, Galeon, Netscape 4, Konqueror..)
+# Ulf Harnhammar <ulfh at update.uu.se>
+0	string	#\ HTTP\ Cookie\ File	Web browser cookie text
+0	string	#\ Netscape\ HTTP\ Cookie\ File	Netscape cookie text
+0	string	#\ KDE\ Cookie\ File	Konqueror cookie text
+
+#------------------------------------------------------------------------
+# file(1) magic for sharc files
+#
+# SHARC DSP, MIDI SysEx and RiscOS filetype definitions added by 
+# FutureGroove Music (dsp at futuregroove.de)
+
+#------------------------------------------------------------------------
+0	string			Draw		RiscOS Drawfile
+0	string			PACK		RiscOS PackdDir archive
+
+#------------------------------------------------------------------------
+# SHARC DSP stuff (based on the FGM SHARC DSP SDK)
+
+0	string			!		Assembler source
+0	string			Analog		ADi asm listing file
+0	string			.SYSTEM		SHARC architecture file
+0	string			.system		SHARC architecture file
+
+0	leshort			0x521C		SHARC COFF binary
+>2	leshort			>1		, %hd sections
+>>12	lelong			>0		, not stripped
+
+#------------------------------------------------------------------------------
+# sinclair:  file(1) sinclair QL
+
+# additions to /etc/magic by Thomas M. Ott (ThMO)
+
+# Sinclair QL floppy disk formats (ThMO)
+0	string	=QL5		QL disk dump data,
+>3	string	=A		720 KB,
+>3	string	=B		1.44 MB,
+>3	string	=C		3.2 MB,
+>4	string	>\0		label:%.10s
+
+# Sinclair QL OS dump (ThMO)
+# (NOTE: if `file' would be able to use indirect references in a endian format
+#	 differing from the natural host format, this could be written more
+#	 reliably and faster...)
+#
+# we *can't* lookup QL OS code dumps, because `file' is UNABLE to read more
+# than the first 8K of a file... #-(
+#
+#0		belong	=0x30000
+#>49124		belong	<47104
+#>>49128		belong	<47104
+#>>>49132	belong	<47104
+#>>>>49136	belong	<47104	QL OS dump data,
+#>>>>>49148	string	>\0	type %.3s,
+#>>>>>49142	string	>\0	version %.4s
+
+# Sinclair QL firmware executables (ThMO)
+0	string	NqNqNq`\004	QL firmware executable (BCPL)
+
+# Sinclair QL libraries (ThMO)
+0	beshort	=0xFB01		QL library archive data
+
+# Sinclair QL executbables (ThMO)
+6	beshort	=0x4AFB		QL executable,
+>10	string	=\0		un-named
+>8	beshort	=1
+>>10	string	>\0		named: %.1s
+>8	beshort	=2
+>>10	string	>\0		named: %.2s
+>8	beshort	=3
+>>10	string	>\0		named: %.3s
+>8	beshort	=4
+>>10	string	>\0		named: %.4s
+>8	beshort	=5
+>>10	string	>\0		named: %.5s
+>8	beshort	=6
+>>10	string	>\0		named: %.6s
+>8	beshort	=7
+>>10	string	>\0		named: %.7s
+>8	beshort	=8
+>>10	string	>\0		named: %.8s
+>8	beshort	=9
+>>10	string	>\0		named: %.9s
+>8	beshort	=10
+>>10	string	>\0		named: %.10s
+>8	beshort	=11
+>>10	string	>\0		named: %.11s
+>8	beshort	=12
+>>10	string	>\0		named: %.12s
+>8	beshort	=13
+>>10	string	>\0		named: %.13s
+>8	beshort	=14
+>>10	string	>\0		named: %.14s
+>8	beshort	=15
+>>10	string	>\0		named: %.15s
+>8	beshort	=16
+>>10	string	>\0		named: %.16s
+>8	beshort	=17
+>>10	string	>\0		named: %.17s
+>8	beshort	=18
+>>10	string	>\0		named: %.18s
+>8	beshort	=19
+>>10	string	>\0		named: %.19s
+>8	beshort	=20
+>>10	string	>\0		named: %.20s
+>8	beshort	>20
+>>10	string	>\0		(truncated) named: %.20s
+
+# Sinclair QL rom (ThMO)
+0	belong	=0x4AFB0001	QL plugin-ROM data,
+>10	string	=\0		un-named
+>8	beshort	=1
+>>10	string	>\0		named: %.1s
+>8	beshort	=2
+>>10	string	>\0		named: %.2s
+>8	beshort	=3
+>>10	string	>\0		named: %.3s
+>8	beshort	=4
+>>10	string	>\0		named: %.4s
+>8	beshort	=5
+>>10	string	>\0		named: %.5s
+>8	beshort	=6
+>>10	string	>\0		named: %.6s
+>8	beshort	=7
+>>10	string	>\0		named: %.7s
+>8	beshort	=8
+>>10	string	>\0		named: %.8s
+>8	beshort	=9
+>>10	string	>\0		named: %.9s
+>8	beshort	=10
+>>10	string	>\0		named: %.10s
+>8	beshort	=11
+>>10	string	>\0		named: %.11s
+>8	beshort	=12
+>>10	string	>\0		named: %.12s
+>8	beshort	=13
+>>10	string	>\0		named: %.13s
+>8	beshort	=14
+>>10	string	>\0		named: %.14s
+>8	beshort	=15
+>>10	string	>\0		named: %.15s
+>8	beshort	=16
+>>10	string	>\0		named: %.16s
+>8	beshort	=17
+>>10	string	>\0		named: %.17s
+>8	beshort	=18
+>>10	string	>\0		named: %.18s
+>8	beshort	=19
+>>10	string	>\0		named: %.19s
+>8	beshort	=20
+>>10	string	>\0		named: %.20s
+>8	beshort	>20
+>>10	string	>\0		(truncated) named: %.20s
+
+#------------------------------------------------------------------------------
+# Sketch Drawings: http://sketch.sourceforge.net/ 
+# From: Edwin Mons <e at ik.nu>
+0	string	##Sketch	Sketch document text
+
+#-----------------------------------------------
+# GNU Smalltalk image, starting at version 1.6.2
+# From: catull_us at yahoo.com
+#
+0	string	GSTIm\0\0	GNU SmallTalk
+# little-endian
+>7	byte&1	=0		LE image version
+>>10	byte	x		%d.
+>>9	byte	x		\b%d.
+>>8	byte	x		\b%d
+#>>12	lelong	x		, data: %ld
+#>>16	lelong	x		, table: %ld
+#>>20	lelong	x		, memory: %ld
+# big-endian
+>7	byte&1	=1		BE image version
+>>8	byte	x		%d.
+>>9	byte	x		\b%d.
+>>10	byte	x		\b%d
+#>>12	belong	x		, data: %ld
+#>>16	belong	x		, table: %ld
+#>>20	belong	x		, memory: %ld
+
+
+
+#------------------------------------------------------------------------------
+# sniffer:  file(1) magic for packet capture files
+#
+# From: guy at alum.mit.edu (Guy Harris)
+#
+
+#
+# Microsoft Network Monitor 1.x capture files.
+#
+0	string		RTSS		NetMon capture file
+>5	byte		x		- version %d
+>4	byte		x		\b.%d
+>6	leshort		0		(Unknown)
+>6	leshort		1		(Ethernet)
+>6	leshort		2		(Token Ring)
+>6	leshort		3		(FDDI)
+>6	leshort		4		(ATM)
+
+#
+# Microsoft Network Monitor 2.x capture files.
+#
+0	string		GMBU		NetMon capture file
+>5	byte		x		- version %d
+>4	byte		x		\b.%d
+>6	leshort		0		(Unknown)
+>6	leshort		1		(Ethernet)
+>6	leshort		2		(Token Ring)
+>6	leshort		3		(FDDI)
+>6	leshort		4		(ATM)
+
+#
+# Network General Sniffer capture files.
+# Sorry, make that "Network Associates Sniffer capture files."
+#
+0	string		TRSNIFF\ data\ \ \ \ \032	Sniffer capture file
+>33	byte		2		(compressed)
+>23	leshort		x		- version %d
+>25	leshort		x		\b.%d
+>32	byte		0		(Token Ring)
+>32	byte		1		(Ethernet)
+>32	byte		2		(ARCNET)
+>32	byte		3		(StarLAN)
+>32	byte		4		(PC Network broadband)
+>32	byte		5		(LocalTalk)
+>32	byte		6		(Znet)
+>32	byte		7		(Internetwork Analyzer)
+>32	byte		9		(FDDI)
+>32	byte		10		(ATM)
+
+#
+# Cinco Networks NetXRay capture files.
+# Sorry, make that "Network General Sniffer Basic capture files."
+# Sorry, make that "Network Associates Sniffer Basic capture files."
+# Sorry, make that "Network Associates Sniffer Basic, and Windows
+# Sniffer Pro", capture files."
+#
+0	string		XCP\0		NetXRay capture file
+>4	string		>\0		- version %s
+>44	leshort		0		(Ethernet)
+>44	leshort		1		(Token Ring)
+>44	leshort		2		(FDDI)
+>44	leshort		3		(WAN)
+>44	leshort		8		(ATM)
+>44	leshort		9		(802.11)
+
+#
+# "libpcap" capture files.
+# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
+# the main program that uses that format, but there are other programs
+# that use "libpcap", or that use the same capture file format.)
+#
+0	ubelong		0xa1b2c3d4	tcpdump capture file (big-endian)
+>4	beshort		x		- version %d
+>6	beshort		x		\b.%d
+>20	belong		0		(No link-layer encapsulation
+>20	belong		1		(Ethernet
+>20	belong		2		(3Mb Ethernet
+>20	belong		3		(AX.25
+>20	belong		4		(ProNET
+>20	belong		5		(CHAOS
+>20	belong		6		(Token Ring
+>20	belong		7		(BSD ARCNET
+>20	belong		8		(SLIP
+>20	belong		9		(PPP
+>20	belong		10		(FDDI
+>20	belong		11		(RFC 1483 ATM
+>20	belong		12		(raw IP
+>20	belong		13		(BSD/OS SLIP
+>20	belong		14		(BSD/OS PPP
+>20	belong		50		(PPP or Cisco HDLC
+>20	belong		51		(PPP-over-Ethernet
+>20	belong		100		(RFC 1483 ATM
+>20	belong		101		(raw IP
+>20	belong		102		(BSD/OS SLIP
+>20	belong		103		(BSD/OS PPP
+>20	belong		104		(BSD/OS Cisco HDLC
+>20	belong		105		(802.11
+>20	belong		106		(Linux Classical IP over ATM
+>20	belong		107		(Frame Relay
+>20	belong		108		(OpenBSD loopback
+>20	belong		109		(OpenBSD IPsec encrypted
+>20	belong		112		(Cisco HDLC
+>20	belong		113		(Linux "cooked"
+>20	belong		114		(LocalTalk
+>20	belong		117		(OpenBSD PFLOG
+>20	belong		119		(802.11 with Prism header
+>20	belong		123		(SunATM
+>20	belong		127		(802.11 with radiotap header
+>20	belong		129		(Linux ARCNET
+>20	belong		140		(MTP2
+>20	belong		141		(MTP3
+>20	belong		143		(DOCSIS
+>20	belong		144		(IrDA
+>16	belong		x		\b, capture length %d)
+0	ulelong		0xa1b2c3d4	tcpdump capture file (little-endian)
+>4	leshort		x		- version %d
+>6	leshort		x		\b.%d
+>20	lelong		0		(No link-layer encapsulation
+>20	lelong		1		(Ethernet
+>20	lelong		2		(3Mb Ethernet
+>20	lelong		3		(AX.25
+>20	lelong		4		(ProNET
+>20	lelong		5		(CHAOS
+>20	lelong		6		(Token Ring
+>20	lelong		7		(ARCNET
+>20	lelong		8		(SLIP
+>20	lelong		9		(PPP
+>20	lelong		10		(FDDI
+>20	lelong		11		(RFC 1483 ATM
+>20	lelong		12		(raw IP
+>20	lelong		13		(BSD/OS SLIP
+>20	lelong		14		(BSD/OS PPP
+>20	lelong		50		(PPP or Cisco HDLC
+>20	lelong		51		(PPP-over-Ethernet
+>20	lelong		100		(RFC 1483 ATM
+>20	lelong		101		(raw IP
+>20	lelong		102		(BSD/OS SLIP
+>20	lelong		103		(BSD/OS PPP
+>20	lelong		104		(BSD/OS Cisco HDLC
+>20	lelong		105		(802.11
+>20	lelong		106		(Linux Classical IP over ATM
+>20	lelong		107		(Frame Relay
+>20	lelong		108		(OpenBSD loopback
+>20	lelong		109		(OpenBSD IPSEC encrypted
+>20	lelong		112		(Cisco HDLC
+>20	lelong		113		(Linux "cooked"
+>20	lelong		114		(LocalTalk
+>20	lelong		117		(OpenBSD PFLOG
+>20	lelong		119		(802.11 with Prism header
+>20	lelong		123		(SunATM
+>20	lelong		127		(802.11 with radiotap header
+>20	lelong		129		(Linux ARCNET
+>20	lelong		140		(MTP2
+>20	lelong		141		(MTP3
+>20	lelong		143		(DOCSIS
+>20	lelong		144		(IrDA
+>16	lelong		x		\b, capture length %d)
+
+#
+# "libpcap"-with-Alexey-Kuznetsov's-patches capture files.
+# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
+# the main program that uses that format, but there are other programs
+# that use "libpcap", or that use the same capture file format.)
+#
+0	ubelong		0xa1b2cd34	extended tcpdump capture file (big-endian)
+>4	beshort		x		- version %d
+>6	beshort		x		\b.%d
+>20	belong		0		(No link-layer encapsulation
+>20	belong		1		(Ethernet
+>20	belong		2		(3Mb Ethernet
+>20	belong		3		(AX.25
+>20	belong		4		(ProNET
+>20	belong		5		(CHAOS
+>20	belong		6		(Token Ring
+>20	belong		7		(ARCNET
+>20	belong		8		(SLIP
+>20	belong		9		(PPP
+>20	belong		10		(FDDI
+>20	belong		11		(RFC 1483 ATM
+>20	belong		12		(raw IP
+>20	belong		13		(BSD/OS SLIP
+>20	belong		14		(BSD/OS PPP
+>16	belong		x		\b, capture length %d)
+0	ulelong		0xa1b2cd34	extended tcpdump capture file (little-endian)
+>4	leshort		x		- version %d
+>6	leshort		x		\b.%d
+>20	lelong		0		(No link-layer encapsulation
+>20	lelong		1		(Ethernet
+>20	lelong		2		(3Mb Ethernet
+>20	lelong		3		(AX.25
+>20	lelong		4		(ProNET
+>20	lelong		5		(CHAOS
+>20	lelong		6		(Token Ring
+>20	lelong		7		(ARCNET
+>20	lelong		8		(SLIP
+>20	lelong		9		(PPP
+>20	lelong		10		(FDDI
+>20	lelong		11		(RFC 1483 ATM
+>20	lelong		12		(raw IP
+>20	lelong		13		(BSD/OS SLIP
+>20	lelong		14		(BSD/OS PPP
+>16	lelong		x		\b, capture length %d)
+
+#
+# AIX "iptrace" capture files.
+#
+0	string		iptrace\ 1.0	"iptrace" capture file
+0	string		iptrace\ 2.0	"iptrace" capture file
+
+#
+# Novell LANalyzer capture files.
+#
+0	leshort		0x1001		LANalyzer capture file
+0	leshort		0x1007		LANalyzer capture file
+
+#
+# HP-UX "nettl" capture files.
+#
+0	string		\x54\x52\x00\x64\x00	"nettl" capture file
+
+#
+# RADCOM WAN/LAN Analyzer capture files.
+#
+0	string		\x42\xd2\x00\x34\x12\x66\x22\x88	RADCOM WAN/LAN Analyzer capture file
+
+#
+# NetStumbler log files.  Not really packets, per se, but about as
+# close as you can get.  These are log files from NetStumbler, a
+# Windows program, that scans for 802.11b networks.
+#
+0	string		NetS		NetStumbler log file
+>8	lelong		x		\b, %d stations found
+
+#------------------------------------------------------------------------------
+# softquad:  file(1) magic for SoftQuad Publishing Software
+#
+# Author/Editor and RulesBuilder
+#
+# XXX - byte order?
+#
+0	string		\<!SQ\ DTD>	Compiled SGML rules file
+>9	string		>\0		 Type %s
+0	string		\<!SQ\ A/E>	A/E SGML Document binary
+>9	string		>\0		 Type %s
+0	string		\<!SQ\ STS>	A/E SGML binary styles file
+>9	string		>\0		 Type %s
+0	short		0xc0de		Compiled PSI (v1) data
+0	short		0xc0da		Compiled PSI (v2) data
+>3	string		>\0		(%s)
+# Binary sqtroff font/desc files...
+0	short		0125252		SoftQuad DESC or font file binary
+>2	short		>0		- version %d
+# Bitmaps...
+0	string		SQ\ BITMAP1	SoftQuad Raster Format text
+#0	string		SQ\ BITMAP2	SoftQuad Raster Format data
+# sqtroff intermediate language (replacement for ditroff int. lang.)
+0	string		X\ 		SoftQuad troff Context intermediate
+>2	string		495		for AT&T 495 laser printer
+>2	string		hp		for Hewlett-Packard LaserJet
+>2	string		impr		for IMAGEN imPRESS
+>2	string		ps		for PostScript
+
+#------------------------------------------------------------------------------
+# spectrum:  file(1) magic for Spectrum emulator files.
+#
+# John Elliott <jce at seasip.demon.co.uk>
+
+#
+# Spectrum +3DOS header
+#
+0       string          PLUS3DOS\032    Spectrum +3 data
+>15     byte            0               - BASIC program
+>15     byte            1               - number array
+>15     byte            2               - character array
+>15     byte            3               - memory block
+>>16    belong          0x001B0040      (screen)
+>15     byte            4               - Tasword document
+>15     string          TAPEFILE        - ZXT tapefile
+#
+# Tape file. This assumes the .TAP starts with a Spectrum-format header,
+# which nearly all will.
+#
+0       string          \023\000\000    Spectrum .TAP data
+>4      string          x               "%-10.10s"
+>3      byte            0               - BASIC program
+>3      byte            1               - number array
+>3      byte            2               - character array
+>3      byte            3               - memory block
+>>14    belong          0x001B0040      (screen)
+
+# The following three blocks are from pak21-spectrum at srcf.ucam.org
+# TZX tape images
+0      string          ZXTape!\x1a     Spectrum .TZX data
+>8     byte            x               version %d
+>9     byte            x               .%d
+
+# RZX input recording files
+0      string          RZX!            Spectrum .RZX data
+>4     byte            x               version %d
+>5     byte            x               .%d
+
+# And three sorts of disk image
+0      string          MV\ -\ CPCEMU\ Disk-Fil Amstrad/Spectrum .DSK data
+0      string          MV\ -\ CPC\ format\ Dis Amstrad/Spectrum DU54 .DSK data
+0      string          EXTENDED\ CPC\ DSK\ Fil Amstrad/Spectrum Extended .DSK data
+
+#------------------------------------------------------------------------------
+# sql:  file(1) magic for SQL files
+#
+# From: "Marty Leisner" <mleisner at eng.mc.xerox.com>
+# Recognize some MySQL files.
+#
+0	beshort			0xfe01		MySQL table definition file
+>2	byte			x		Version %d
+0	belong&0xffffff00	0xfefe0300	MySQL MISAM index file
+>3	byte			x		Version %d
+0	belong&0xffffff00	0xfefe0700	MySQL MISAM compressed data file
+>3	byte			x		Version %d
+0	belong&0xffffff00	0xfefe0500	MySQL ISAM index file
+>3	byte			x		Version %d
+0	belong&0xffffff00	0xfefe0600	MySQL ISAM compressed data file
+>3	byte			x		Version %d
+0	string		 	\376bin		MySQL replication log
+
+#------------------------------------------------------------------------------
+# sun:  file(1) magic for Sun machines
+#
+# Values for big-endian Sun (MC680x0, SPARC) binaries on pre-5.x
+# releases.  (5.x uses ELF.)
+#
+0	belong&077777777	0600413		SPARC demand paged
+>0	byte		&0x80
+>>20	belong		<4096		shared library
+>>20	belong		=4096		dynamically linked executable
+>>20	belong		>4096		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+0	belong&077777777	0600410		SPARC pure
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+0	belong&077777777	0600407		SPARC
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+
+0	belong&077777777	0400413		mc68020 demand paged
+>0	byte		&0x80
+>>20	belong		<4096		shared library
+>>20	belong		=4096		dynamically linked executable
+>>20	belong		>4096		dynamically linked executable
+>16	belong		>0		not stripped
+0	belong&077777777	0400410		mc68020 pure
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+0	belong&077777777	0400407		mc68020
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+
+0	belong&077777777	0200413		mc68010 demand paged
+>0	byte		&0x80
+>>20	belong		<4096		shared library
+>>20	belong		=4096		dynamically linked executable
+>>20	belong		>4096		dynamically linked executable
+>16	belong		>0		not stripped
+0	belong&077777777	0200410		mc68010 pure
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+0	belong&077777777	0200407		mc68010
+>0	byte		&0x80		dynamically linked executable
+>0	byte		^0x80		executable
+>16	belong		>0		not stripped
+
+# reworked these to avoid anything beginning with zero becoming "old sun-2"
+0	belong		0407		old sun-2 executable
+>16	belong		>0		not stripped
+0	belong		0410		old sun-2 pure executable
+>16	belong		>0		not stripped
+0	belong		0413		old sun-2 demand paged executable
+>16	belong		>0		not stripped
+
+#
+# Core files.  "SPARC 4.x BCP" means "core file from a SunOS 4.x SPARC
+# binary executed in compatibility mode under SunOS 5.x".
+#
+0	belong		0x080456	SunOS core file
+>4	belong		432		(SPARC)
+>>132	string		>\0		from '%s'
+>>116	belong		=3		(quit)
+>>116	belong		=4		(illegal instruction)
+>>116	belong		=5		(trace trap)
+>>116	belong		=6		(abort)
+>>116	belong		=7		(emulator trap)
+>>116	belong		=8		(arithmetic exception)
+>>116	belong		=9		(kill)
+>>116	belong		=10		(bus error)
+>>116	belong		=11		(segmentation violation)
+>>116	belong		=12		(bad argument to system call)
+>>116	belong		=29		(resource lost)
+>>120	belong		x		(T=%dK,
+>>124	belong		x		D=%dK,
+>>128	belong		x		S=%dK)
+>4	belong		826		(68K)
+>>128	string		>\0		from '%s'
+>4	belong		456		(SPARC 4.x BCP)
+>>152	string		>\0		from '%s'
+# Sun SunPC
+0	long		0xfa33c08e	SunPC 4.0 Hard Disk
+0	string		#SUNPC_CONFIG	SunPC 4.0 Properties Values
+# Sun snoop (see RFC 1761, which describes the capture file format).
+#
+0	string		snoop		Snoop capture file
+>8	belong		>0		- version %ld
+>12	belong		0		(IEEE 802.3)
+>12	belong		1		(IEEE 802.4)
+>12	belong		2		(IEEE 802.5)
+>12	belong		3		(IEEE 802.6)
+>12	belong		4		(Ethernet)
+>12	belong		5		(HDLC)
+>12	belong		6		(Character synchronous)
+>12	belong		7		(IBM channel-to-channel adapter)
+>12	belong		8		(FDDI)
+>12	belong		9		(Unknown)
+
+# Microsoft ICM color profile
+36	string		acspMSFT	Microsoft ICM Color Profile
+# Sun KCMS
+36	string		acsp		Kodak Color Management System, ICC Profile
+
+#---------------------------------------------------------------------------
+# The following entries have been tested by Duncan Laurie <duncan at sun.com> (a
+# lead Sun/Cobalt developer) who agrees that they are good and worthy of
+# inclusion.
+
+# Boot ROM images for Sun/Cobalt Linux server appliances
+0       string  Cobalt\ Networks\ Inc.\nFirmware\ v     Paged COBALT boot rom
+>38     string x        V%.4s
+
+# New format for Sun/Cobalt boot ROMs is annoying, it stores the version code
+# at the very end where file(1) can't get it.
+0       string CRfs     COBALT boot rom data (Flat boot rom or file system)
+
+
+#------------------------------------------------------------------------
+# sysex: file(1) magic for MIDI sysex files
+#
+# 
+0	byte			0xF0		SysEx File -
+
+# North American Group
+>1	byte			0x01		Sequential
+>1	byte			0x02		IDP
+>1	byte			0x03		OctavePlateau
+>1	byte			0x04		Moog
+>1	byte			0x05		Passport
+>1	byte			0x06		Lexicon
+>1	byte			0x07		Kurzweil
+>1	byte			0x08		Fender
+>1	byte			0x09		Gulbransen
+>1	byte			0x0a		AKG
+>1	byte			0x0b		Voyce
+>1	byte			0x0c		Waveframe
+>1	byte			0x0d		ADA
+>1	byte			0x0e		Garfield
+>1	byte			0x0f		Ensoniq
+>1	byte			0x10		Oberheim
+>1	byte			0x11		Apple
+>1	byte			0x12		GreyMatter
+>1	byte			0x14		PalmTree
+>1	byte			0x15		JLCooper
+>1	byte			0x16		Lowrey
+>1	byte			0x17		AdamsSmith
+>1	byte			0x18		E-mu
+>1	byte			0x19		Harmony
+>1	byte			0x1a		ART
+>1	byte			0x1b		Baldwin
+>1	byte			0x1c		Eventide
+>1	byte			0x1d		Inventronics
+>1	byte			0x1f		Clarity
+
+# European Group
+>1	byte			0x21		SIEL
+>1	byte			0x22		Synthaxe
+>1	byte			0x24		Hohner
+>1	byte			0x25		Twister
+>1	byte			0x26		Solton
+>1	byte			0x27		Jellinghaus
+>1	byte			0x28		Southworth
+>1	byte			0x29		PPG
+>1	byte			0x2a		JEN
+>1	byte			0x2b		SSL
+>1	byte			0x2c		AudioVertrieb
+
+>1	byte			0x2f		ELKA
+>>3	byte			0x09		EK-44
+
+>1	byte			0x30		Dynacord
+>1	byte			0x33		Clavia
+>1	byte			0x39		Soundcraft
+
+>1	byte			0x3e		Waldorf
+>>3	byte			0x7f		Microwave I
+
+# Japanese Group
+>1	byte			0x40		Kawai
+>>3	byte			0x20		K1
+>>3	byte			0x22		K4
+
+>1	byte			0x41		Roland
+>>3	byte			0x14		D-50
+>>3	byte			0x2b		U-220
+>>3	byte			0x02		TR-707
+
+>1	byte			0x42		Korg
+>>3	byte			0x19		M1
+
+>1	byte			0x43		Yamaha
+>1	byte			0x44		Casio
+>1	byte			0x46		Kamiya
+>1	byte			0x47		Akai
+>1	byte			0x48		Victor
+>1	byte			0x49		Mesosha
+>1	byte			0x4b		Fujitsu
+>1	byte			0x4c		Sony
+>1	byte			0x4e		Teac
+>1	byte			0x50		Matsushita
+>1	byte			0x51		Fostex
+>1	byte			0x52		Zoom
+>1	byte			0x54		Matsushita
+>1	byte			0x57		Acoustic tech. lab.
+
+>1	belong&0xffffff00	0x00007400	Ta Horng
+>1	belong&0xffffff00	0x00007500	e-Tek
+>1	belong&0xffffff00	0x00007600	E-Voice
+>1	belong&0xffffff00	0x00007700	Midisoft
+>1	belong&0xffffff00	0x00007800	Q-Sound
+>1	belong&0xffffff00	0x00007900	Westrex
+>1	belong&0xffffff00	0x00007a00	Nvidia*
+>1	belong&0xffffff00	0x00007b00	ESS
+>1	belong&0xffffff00	0x00007c00	Mediatrix
+>1	belong&0xffffff00	0x00007d00	Brooktree
+>1	belong&0xffffff00	0x00007e00	Otari
+>1	belong&0xffffff00	0x00007f00	Key Electronics
+>1	belong&0xffffff00	0x00010000	Shure
+>1	belong&0xffffff00	0x00010100	AuraSound
+>1	belong&0xffffff00	0x00010200	Crystal
+>1	belong&0xffffff00	0x00010300	Rockwell
+>1	belong&0xffffff00	0x00010400	Silicon Graphics
+>1	belong&0xffffff00	0x00010500	Midiman
+>1	belong&0xffffff00	0x00010600	PreSonus
+>1	belong&0xffffff00	0x00010800	Topaz
+>1	belong&0xffffff00	0x00010900	Cast Lightning
+>1	belong&0xffffff00	0x00010a00	Microsoft
+>1	belong&0xffffff00	0x00010b00	Sonic Foundry
+>1	belong&0xffffff00	0x00010c00	Line 6
+>1	belong&0xffffff00	0x00010d00	Beatnik Inc.
+>1	belong&0xffffff00	0x00010e00	Van Koerving
+>1	belong&0xffffff00	0x00010f00	Altech Systems
+>1	belong&0xffffff00	0x00011000	S & S Research
+>1	belong&0xffffff00	0x00011100	VLSI Technology
+>1	belong&0xffffff00	0x00011200	Chromatic
+>1	belong&0xffffff00	0x00011300	Sapphire
+>1	belong&0xffffff00	0x00011400	IDRC
+>1	belong&0xffffff00	0x00011500	Justonic Tuning
+>1	belong&0xffffff00	0x00011600	TorComp
+>1	belong&0xffffff00	0x00011700	Newtek Inc.
+>1	belong&0xffffff00	0x00011800	Sound Sculpture
+>1	belong&0xffffff00	0x00011900	Walker Technical
+>1	belong&0xffffff00	0x00011a00	Digital Harmony
+>1	belong&0xffffff00	0x00011b00	InVision
+>1	belong&0xffffff00	0x00011c00	T-Square
+>1	belong&0xffffff00	0x00011d00	Nemesys
+>1	belong&0xffffff00	0x00011e00	DBX
+>1	belong&0xffffff00	0x00011f00	Syndyne
+>1	belong&0xffffff00	0x00012000	Bitheadz	
+>1	belong&0xffffff00	0x00012100	Cakewalk
+>1	belong&0xffffff00	0x00012200	Staccato
+>1	belong&0xffffff00	0x00012300	National Semicon.
+>1	belong&0xffffff00	0x00012400	Boom Theory
+>1	belong&0xffffff00	0x00012500	Virtual DSP Corp
+>1	belong&0xffffff00	0x00012600	Antares
+>1	belong&0xffffff00	0x00012700	Angel Software
+>1	belong&0xffffff00	0x00012800	St Louis Music
+>1	belong&0xffffff00	0x00012900	Lyrrus dba G-VOX
+>1	belong&0xffffff00	0x00012a00	Ashley Audio
+>1	belong&0xffffff00	0x00012b00	Vari-Lite
+>1	belong&0xffffff00	0x00012c00	Summit Audio
+>1	belong&0xffffff00	0x00012d00	Aureal Semicon.
+>1	belong&0xffffff00	0x00012e00	SeaSound
+>1	belong&0xffffff00	0x00012f00	U.S. Robotics
+>1	belong&0xffffff00	0x00013000	Aurisis
+>1	belong&0xffffff00	0x00013100	Nearfield Multimedia
+>1	belong&0xffffff00	0x00013200	FM7 Inc.
+>1	belong&0xffffff00	0x00013300	Swivel Systems
+>1	belong&0xffffff00	0x00013400	Hyperactive
+>1	belong&0xffffff00	0x00013500	MidiLite
+>1	belong&0xffffff00	0x00013600	Radical
+>1	belong&0xffffff00	0x00013700	Roger Linn
+>1	belong&0xffffff00	0x00013800	Helicon
+>1	belong&0xffffff00	0x00013900	Event
+>1	belong&0xffffff00	0x00013a00	Sonic Network
+>1	belong&0xffffff00	0x00013b00	Realtime Music
+>1	belong&0xffffff00	0x00013c00	Apogee Digital
+
+>1	belong&0xffffff00	0x00202b00	Medeli Electronics
+>1	belong&0xffffff00	0x00202c00	Charlie Lab
+>1	belong&0xffffff00	0x00202d00	Blue Chip Music
+>1	belong&0xffffff00	0x00202e00	BEE OH Corp
+>1	belong&0xffffff00	0x00202f00	LG Semicon America
+>1	belong&0xffffff00	0x00203000	TESI
+>1	belong&0xffffff00	0x00203100	EMAGIC
+>1	belong&0xffffff00	0x00203200	Behringer
+>1	belong&0xffffff00	0x00203300	Access Music
+>1	belong&0xffffff00	0x00203400	Synoptic
+>1	belong&0xffffff00	0x00203500	Hanmesoft Corp
+>1	belong&0xffffff00	0x00203600	Terratec
+>1	belong&0xffffff00	0x00203700	Proel SpA
+>1	belong&0xffffff00	0x00203800	IBK MIDI
+>1	belong&0xffffff00	0x00203900	IRCAM
+>1	belong&0xffffff00	0x00203a00	Propellerhead Software
+>1	belong&0xffffff00	0x00203b00	Red Sound Systems
+>1	belong&0xffffff00	0x00203c00	Electron ESI AB
+>1	belong&0xffffff00	0x00203d00	Sintefex Audio
+>1	belong&0xffffff00	0x00203e00	Music and More
+>1	belong&0xffffff00	0x00203f00	Amsaro
+>1	belong&0xffffff00	0x00204000	CDS Advanced Technology
+>1	belong&0xffffff00	0x00204100	Touched by Sound
+>1	belong&0xffffff00	0x00204200	DSP Arts
+>1	belong&0xffffff00	0x00204300	Phil Rees Music
+>1	belong&0xffffff00	0x00204400	Stamer Musikanlagen GmbH
+>1	belong&0xffffff00	0x00204500	Soundart
+>1	belong&0xffffff00	0x00204600	C-Mexx Software
+>1	belong&0xffffff00	0x00204700	Klavis Tech.
+>1	belong&0xffffff00	0x00204800	Noteheads AB
+
+0	string			T707		Roland TR-707 Data
+#------------------------------------------------------------------------------
+# teapot:  file(1) magic for "teapot" spreadsheet
+#
+0       string          #!teapot\012xdr      teapot work sheet (XDR format)
+
+#------------------------------------------------------------------------------
+# terminfo:  file(1) magic for terminfo
+#
+# XXX - byte order for screen images?
+#
+0	string		\032\001	Compiled terminfo entry
+0	short		0433		Curses screen image
+0	short		0434		Curses screen image
+
+#------------------------------------------------------------------------------
+# tex:  file(1) magic for TeX files
+#
+# From <conklin at talisman.kaleida.com>
+
+# Although we may know the offset of certain text fields in TeX DVI
+# and font files, we can't use them reliably because they are not
+# zero terminated. [but we do anyway, christos]
+0	string		\367\002	TeX DVI file
+>16	string		>\0		(%s)
+0	string		\367\203	TeX generic font data
+0	string		\367\131	TeX packed font data
+>3	string		>\0		(%s)
+0	string		\367\312	TeX virtual font data
+0	string		This\ is\ TeX,	TeX transcript text
+0	string		This\ is\ METAFONT,	METAFONT transcript text
+
+# There is no way to detect TeX Font Metric (*.tfm) files without
+# breaking them apart and reading the data.  The following patterns
+# match most *.tfm files generated by METAFONT or afm2tfm.
+2	string		\000\021	TeX font metric data
+>33	string		>\0		(%s)
+2	string		\000\022	TeX font metric data
+>33	string		>\0		(%s)
+
+# Texinfo and GNU Info, from Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		\\input\ texinfo	Texinfo source text
+0	string		This\ is\ Info\ file	GNU Info text
+
+# TeX documents, from Daniel Quinlan (quinlan at yggdrasil.com)
+0	string		\\input		TeX document text
+0	string		\\section	LaTeX document text
+0	string		\\setlength	LaTeX document text
+0	string		\\documentstyle	LaTeX document text
+0	string		\\chapter	LaTeX document text
+0	string		\\documentclass	LaTeX 2e document text
+0	string		\\relax		LaTeX auxiliary file
+0	string		\\contentsline	LaTeX  table of contents
+0	string		%\ -*-latex-*-	LaTeX document text
+
+# Tex document, from Hendrik Scholz <hendrik at scholz.net>
+0   string      \\ifx       TeX document text
+
+# Index and glossary files
+0	string		\\indexentry	LaTeX raw index file
+0	string		\\begin{theindex}	LaTeX sorted index
+0	string		\\glossaryentry	LaTeX raw glossary
+0	string		\\begin{theglossary}	LaTeX sorted glossary
+0	string		This\ is\ makeindex	Makeindex log file
+
+# End of TeX
+
+#------------------------------------------------------------------------------
+# file(1) magic for BibTex text files
+# From Hendrik Scholz <hendrik at scholz.net>
+
+0   string @article{          BibTex text file
+0   string @book{             BibTex text file
+0   string @inbook{           BibTex text file
+0   string @incollection{     BibTex text file
+0   string @inproceedings{    BibTex text file
+0   string @manual{           BibTex text file
+0   string @misc{             BibTex text file
+0   string @preamble{         BibTex text file
+0   string @phdthesis{        BibTex text file
+0   string @techreport{       BibTex text file
+0   string @unpublished{      BibTex text file
+
+0   string @Article{          BibTex text file
+0   string @Book{             BibTex text file
+0   string @Inbook{           BibTex text file
+0   string @Incollection{     BibTex text file
+0   string @Inproceedings{    BibTex text file
+0   string @Manual{           BibTex text file
+0   string @Misc{             BibTex text file
+0   string @Preamble{         BibTex text file
+0   string @Phdthesis{        BibTex text file
+0   string @Techreport{       BibTex text file
+0   string @Unpublished{      BibTex text file
+
+0   string @ARTICLE{          BibTex text file
+0   string @BOOK{             BibTex text file
+0   string @INBOOK{           BibTex text file
+0   string @INCOLLECTION{     BibTex text file
+0   string @INPROCEEDINGS{    BibTex text file
+0   string @MANUAL{           BibTex text file
+0   string @MISC{             BibTex text file
+0   string @PREAMBLE{         BibTex text file
+0   string @PHDTHESIS{        BibTex text file
+0   string @TECHREPORT{       BibTex text file
+0   string @UNPUBLISHED{      BibTex text file
+
+73  string %%%\ \ BibTeX-file{ BibTex text file (with full header)
+
+73  string %%%\ \ @BibTeX-style-file{   BibTeX style text file (with full header)
+
+0   string %\ BibTeX\ standard\ bibliography\      BibTeX standard bibliography style text file
+
+0   string %\ BibTeX\ `     BibTeX custom bibliography style text file
+
+0   string  @c\ @mapfile{   TeX font aliases text file
+
+#------------------------------------------------------------------------------
+# file(1) magic for tgif(1) files
+# From Hendrik Scholz <hendrik at scholz.net>
+
+0   string  %TGIF\ 4   tgif version 4 object file
+
+# ------------------------------------------------------------------------
+# ti-8x: file(1) magic for the TI-8x and TI-9x Graphing Calculators.
+#
+# From: Ryan McGuire (rmcguire at freenet.columbus.oh.us).
+#
+# Update: Romain Lievin (roms at lpg.ticalc.org).
+#
+# NOTE: This list is not complete.
+# Files for the TI-80 and TI-81 are pretty rare. I'm not going to put the
+# program/group magic numbers in here because I cannot find any.
+0		string		**TI80**	TI-80 Graphing Calculator File.
+0		string		**TI81**	TI-81 Graphing Calculator File.
+#
+# Magic Numbers for the TI-73
+#
+0		string		**TI73**	TI-73 Graphing Calculator
+>0x00003B	byte		0x00		(real number)
+>0x00003B	byte		0x01		(list)
+>0x00003B	byte		0x02		(matrix)
+>0x00003B	byte		0x03		(equation)
+>0x00003B	byte		0x04		(string)
+>0x00003B	byte		0x05		(program)
+>0x00003B	byte		0x06		(assembly program)
+>0x00003B	byte		0x07		(picture)
+>0x00003B	byte		0x08		(gdb)
+>0x00003B	byte		0x0C		(complex number)
+>0x00003B	byte		0x0F		(window settings)
+>0x00003B	byte		0x10		(zoom)
+>0x00003B	byte		0x11		(table setup)
+>0x00003B	byte		0x13		(backup)
+
+# Magic Numbers for the TI-82
+#
+0		string		**TI82**	TI-82 Graphing Calculator
+>0x00003B	byte		0x00		(real)
+>0x00003B	byte		0x01		(list)
+>0x00003B	byte		0x02		(matrix)
+>0x00003B	byte		0x03		(Y-variable)
+>0x00003B	byte		0x05		(program)
+>0x00003B	byte		0x06		(protected prgm)
+>0x00003B	byte		0x07		(picture)
+>0x00003B	byte		0x08		(gdb)
+>0x00003B	byte		0x0B		(window settings)
+>0x00003B	byte		0x0C		(window settings)
+>0x00003B	byte		0x0D		(table setup)
+>0x00003B	byte		0x0E		(screenshot)
+>0x00003B	byte		0x0F		(backup)
+#
+# Magic Numbers for the TI-83
+#
+0		string		**TI83**	TI-83 Graphing Calculator
+>0x00003B	byte		0x00		(real)
+>0x00003B	byte		0x01		(list)
+>0x00003B	byte		0x02		(matrix)
+>0x00003B	byte		0x03		(Y-variable)
+>0x00003B	byte		0x04		(string)
+>0x00003B	byte		0x05		(program)
+>0x00003B	byte		0x06		(protected prgm)
+>0x00003B	byte		0x07		(picture)
+>0x00003B	byte		0x08		(gdb)
+>0x00003B	byte		0x0B		(window settings)
+>0x00003B	byte		0x0C		(window settings)
+>0x00003B	byte		0x0D		(table setup)
+>0x00003B	byte		0x0E		(screenshot)
+>0x00003B	byte		0x13		(backup)
+#
+# Magic Numbers for the TI-83+
+#
+0		string		**TI83F*	TI-83+ Graphing Calculator
+>0x00003B	byte		0x00		(real number)
+>0x00003B	byte		0x01		(list)
+>0x00003B	byte		0x02		(matrix)
+>0x00003B	byte		0x03		(equation)
+>0x00003B	byte		0x04		(string)
+>0x00003B	byte		0x05		(program)
+>0x00003B	byte		0x06		(assembly program)
+>0x00003B	byte		0x07		(picture)
+>0x00003B	byte		0x08		(gdb)
+>0x00003B	byte		0x0C		(complex number)
+>0x00003B	byte		0x0F		(window settings)
+>0x00003B	byte		0x10		(zoom)
+>0x00003B	byte		0x11		(table setup)
+>0x00003B	byte		0x13		(backup)
+>0x00003B	byte		0x15		(application variable)
+>0x00003B	byte		0x17		(group of variable)
+
+#
+# Magic Numbers for the TI-85
+#
+0		string		**TI85**	TI-85 Graphing Calculator
+>0x00003B	byte		0x00		(real number)
+>0x00003B	byte		0x01		(complex number)
+>0x00003B	byte		0x02		(real vector)
+>0x00003B	byte		0x03		(complex vector)
+>0x00003B	byte		0x04		(real list)
+>0x00003B	byte		0x05		(complex list)
+>0x00003B	byte		0x06		(real matrix)
+>0x00003B	byte		0x07		(complex matrix)
+>0x00003B	byte		0x08		(real constant)
+>0x00003B	byte		0x09		(complex constant)
+>0x00003B	byte		0x0A		(equation)
+>0x00003B	byte		0x0C		(string)
+>0x00003B	byte		0x0D		(function GDB)
+>0x00003B	byte		0x0E		(polar GDB)
+>0x00003B	byte		0x0F		(parametric GDB)
+>0x00003B	byte		0x10		(diffeq GDB)
+>0x00003B	byte		0x11		(picture)
+>0x00003B	byte		0x12		(program)
+>0x00003B	byte		0x13		(range)
+>0x00003B	byte		0x17		(window settings)
+>0x00003B	byte		0x18		(window settings)
+>0x00003B	byte		0x19		(window settings)
+>0x00003B	byte		0x1A		(window settings)
+>0x00003B	byte		0x1B		(zoom)
+>0x00003B	byte		0x1D		(backup)
+>0x00003B	byte		0x1E		(unknown)
+>0x00003B	byte		0x2A		(equation)
+>0x000032	string		ZS4		- ZShell Version 4 File.
+>0x000032	string		ZS3		- ZShell Version 3 File.
+#
+# Magic Numbers for the TI-86
+#
+0		string		**TI86**	TI-86 Graphing Calculator
+>0x00003B	byte		0x00		(real number)
+>0x00003B	byte		0x01		(complex number)
+>0x00003B	byte		0x02		(real vector)
+>0x00003B	byte		0x03		(complex vector)
+>0x00003B	byte		0x04		(real list)
+>0x00003B	byte		0x05		(complex list)
+>0x00003B	byte		0x06		(real matrix)
+>0x00003B	byte		0x07		(complex matrix)
+>0x00003B	byte		0x08		(real constant)
+>0x00003B	byte		0x09		(complex constant)
+>0x00003B	byte		0x0A		(equation)
+>0x00003B	byte		0x0C		(string)
+>0x00003B	byte		0x0D		(function GDB)
+>0x00003B	byte		0x0E		(polar GDB)
+>0x00003B	byte		0x0F		(parametric GDB)
+>0x00003B	byte		0x10		(diffeq GDB)
+>0x00003B	byte		0x11		(picture)
+>0x00003B	byte		0x12		(program)
+>0x00003B	byte		0x13		(range)
+>0x00003B	byte		0x17		(window settings)
+>0x00003B	byte		0x18		(window settings)
+>0x00003B	byte		0x19		(window settings)
+>0x00003B	byte		0x1A		(window settings)
+>0x00003B	byte		0x1B		(zoom)
+>0x00003B	byte		0x1D		(backup)
+>0x00003B	byte		0x1E		(unknown)
+>0x00003B	byte		0x2A		(equation)
+#
+# Magic Numbers for the TI-89
+#
+0		string		**TI89**	TI-89 Graphing Calculator
+>0x000048	byte		0x00		(expression)
+>0x000048	byte		0x04		(list)
+>0x000048	byte		0x06		(matrix)
+>0x000048	byte		0x0A		(data)
+>0x000048	byte		0x0B		(text)
+>0x000048	byte		0x0C		(string)
+>0x000048	byte		0x0D		(graphic data base)
+>0x000048	byte		0x0E		(figure)
+>0x000048	byte		0x10		(picture)
+>0x000048	byte		0x12		(program)
+>0x000048	byte		0x13		(function)
+>0x000048	byte		0x14		(macro)
+>0x000048	byte		0x1C		(zipped)
+>0x000048	byte		0x21		(assembler)
+#
+# Magic Numbers for the TI-92
+#
+0		string		**TI92**	TI-92 Graphing Calculator
+>0x000048	byte		0x00		(expression)
+>0x000048	byte		0x04		(list)
+>0x000048	byte		0x06		(matrix)
+>0x000048	byte		0x0A		(data)
+>0x000048	byte		0x0B		(text)
+>0x000048	byte		0x0C		(string)
+>0x000048	byte		0x0D		(graphic data base)
+>0x000048	byte		0x0E		(figure)
+>0x000048	byte		0x10		(picture)
+>0x000048	byte		0x12		(program)
+>0x000048	byte		0x13		(function)
+>0x000048	byte		0x14		(macro)
+>0x000048	byte		0x1D		(backup)
+#
+# Magic Numbers for the TI-92+/V200
+#
+0		string		**TI92P*	TI-92+/V200 Graphing Calculator
+>0x000048	byte		0x00		(expression)
+>0x000048	byte		0x04		(list)
+>0x000048	byte		0x06		(matrix)
+>0x000048	byte		0x0A		(data)
+>0x000048	byte		0x0B		(text)
+>0x000048	byte		0x0C		(string)
+>0x000048	byte		0x0D		(graphic data base)
+>0x000048	byte		0x0E		(figure)
+>0x000048	byte		0x10		(picture)
+>0x000048	byte		0x12		(program)
+>0x000048	byte		0x13		(function)
+>0x000048	byte		0x14		(macro)
+>0x000048	byte		0x1C		(zipped)
+>0x000048	byte		0x21		(assembler)
+#
+# Magic Numbers for the TI-73/83+/89/92+/V200 FLASH upgrades
+#
+0x0000016	string		Advanced	TI-XX Graphing Calculator (FLASH)
+0		string		**TIFL**	TI-XX Graphing Calculator (FLASH)
+>8		byte		>0		- Revision %d
+>>9 		byte		x		\b.%d,
+>12		byte		>0		Revision date %02x
+>>13		byte		x		\b/%02x
+>>14		beshort		x		\b/%04x,
+>17		string		>/0		name: '%s',
+>48		byte		0x74		device: TI-73,
+>48		byte		0x73		device: TI-83+,
+>48		byte		0x98		device: TI-89,
+>48		byte		0x88		device: TI-92+,
+>49		byte		0x23		type: OS upgrade,
+>49		byte		0x24		type: application,
+>49		byte		0x25		type: certificate,
+>49		byte		0x3e		type: license,
+>74		lelong		>0		size: %ld bytes
+
+# VTi & TiEmu skins (TI Graphing Calculators).
+# From: Romain Lievin (roms at lpg.ticalc.org).
+# Magic Numbers for the VTi skins
+0               string          VTI		Virtual TI skin
+>3		string		v		- Version
+>>4		byte		>0		\b %c
+>>6		byte		x		\b.%c
+# Magic Numbers for the TiEmu skins
+0		string		TiEmu		TiEmu skin
+>6              string          v               - Version
+>>7             byte            >0              \b %c
+>>9             byte            x               \b.%c
+>>10		byte		x		\b%c
+
+#------------------------------------------------------------------------------
+# timezone:  file(1) magic for timezone data
+#
+# from Daniel Quinlan (quinlan at yggdrasil.com)
+# this should work on Linux, SunOS, and maybe others
+# Added new official magic number for recent versions of the Olson code
+0	string	TZif	timezone data
+0	string	\0\0\0\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	old timezone data
+0	string	\0\0\0\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\0	old timezone data
+0	string  \0\0\0\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\0	old timezone data
+0	string	\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0	old timezone data
+0	string	\0\0\0\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\0	old timezone data
+0	string	\0\0\0\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\0	old timezone data
+
+#------------------------------------------------------------------------------
+# troff:  file(1) magic for *roff
+#
+# updated by Daniel Quinlan (quinlan at yggdrasil.com)
+
+# troff input
+0	string		.\\"		troff or preprocessor input text
+0	string		'\\"		troff or preprocessor input text
+0	string		'.\\"		troff or preprocessor input text
+0	string		\\"		troff or preprocessor input text
+0	string		'''		troff or preprocessor input text
+
+# ditroff intermediate output text
+0	string		x\ T		ditroff output text
+>4	string		cat		for the C/A/T phototypesetter
+>4	string		ps		for PostScript
+>4	string		dvi		for DVI
+>4	string		ascii		for ASCII
+>4	string		lj4		for LaserJet 4
+>4	string		latin1		for ISO 8859-1 (Latin 1)
+>4	string		X75		for xditview at 75dpi
+>>7	string		-12		(12pt)
+>4	string		X100		for xditview at 100dpi
+>>8	string		-12		(12pt)
+
+# output data formats
+0	string		\100\357	very old (C/A/T) troff output data
+#
+#------------------------------------------------------------------------------
+# tuxedo:	file(1) magic for BEA TUXEDO data files
+#
+# from Ian Springer <ispringer at hotmail.com>
+#
+0	string		\0\0\1\236\0\0\0\0\0\0\0\0\0\0\0\0	BEA TUXEDO DES mask data
+
+#------------------------------------------------------------------------------
+# typeset:  file(1) magic for other typesetting
+#
+0	string		Interpress/Xerox	Xerox InterPress data
+>16	string		/			(version
+>>17	string		>\0			%s)
+
+#------------------------------------------------------------------------------
+# unknown:  file(1) magic for unknown machines
+#
+# XXX - this probably should be pruned, as it'll match PDP-11 and
+# VAX image formats.
+#
+# 0x107 is 0407; 0x108 is 0410; both are PDP-11 (executable and pure,
+# respectively).
+#
+# 0x109 is 0411; that's PDP-11 split I&D, but the PDP-11 version doesn't
+# have the "version %ld", which may be a bogus COFFism (I don't think
+# there ever was COFF for the PDP-11).
+#
+# 0x10B is 0413; that's VAX demand-paged, but this is a short, not a
+# long, as it would be on a VAX.
+#
+# 0x10C is 0414 and 0x10E is 416; those *are* unknown.
+#
+0	short		0x107		unknown machine executable
+>8	short		>0		not stripped
+>15	byte		>0		- version %ld
+0	short		0x108		unknown pure executable
+>8	short		>0		not stripped
+>15	byte		>0		- version %ld
+0	short		0x109		PDP-11 separate I&D
+>8	short		>0		not stripped
+>15	byte		>0		- version %ld
+0	short		0x10b		unknown pure executable
+>8	short		>0		not stripped
+>15	byte		>0		- version %ld
+0	long		0x10c		unknown demand paged pure executable
+>16	long		>0		not stripped
+0	long		0x10e		unknown readable demand paged pure executable
+
+#------------------------------------------------------------------------------
+# uuencode:  file(1) magic for ASCII-encoded files
+#
+
+# GRR:  the first line of xxencoded files is identical to that in uuencoded
+# files, but the first character in most subsequent lines is 'h' instead of
+# 'M'.  (xxencoding uses lowercase letters in place of most of uuencode's
+# punctuation and survives BITNET gateways better.)  If regular expressions
+# were supported, this entry could possibly be split into two with
+# "begin\040\.\*\012M" or "begin\040\.\*\012h" (where \. and \* are REs).
+0	string		begin\040	uuencoded or xxencoded text
+
+# btoa(1) is an alternative to uuencode that requires less space.
+0	string		xbtoa\ Begin	btoa'd text
+
+# ship(1) is another, much cooler alternative to uuencode.
+# Greg Roelofs, newt at uchicago.edu
+0	string		$\012ship	ship'd binary text
+
+# bencode(8) is used to encode compressed news batches (Bnews/Cnews only?)
+# Greg Roelofs, newt at uchicago.edu
+0	string	Decode\ the\ following\ with\ bdeco	bencoded News text
+
+# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
+# Daniel Quinlan, quinlan at yggdrasil.com
+11	string	must\ be\ converted\ with\ BinHex	BinHex binary text
+>41	string	x					\b, version %.3s
+
+# GRR:  is MIME BASE64 encoding handled somewhere?
+
+#------------------------------------------------------------------------------
+# varied.out:  file(1) magic for various USG systems
+#
+#	Herewith many of the object file formats used by USG systems.
+#	Most have been moved to files for a particular processor,
+#	and deleted if they duplicate other entries.
+#
+0	short		0610		Perkin-Elmer executable
+# AMD 29K
+0	beshort		0572		amd 29k coff noprebar executable
+0	beshort		01572		amd 29k coff prebar executable
+0	beshort		0160007		amd 29k coff archive
+# Cray
+6	beshort		0407		unicos (cray) executable
+# Ultrix 4.3
+596	string		\130\337\377\377	Ultrix core file
+>600	string		>\0		from '%s'
+# BeOS and MAcOS PEF executables
+# From: hplus at zilker.net (Jon Watte)
+0	string		Joy!peffpwpc	header for PowerPC PEF executable
+#
+# ava assembler/linker Uros Platise <uros.platise at ijs.si>
+0       string          avaobj  AVR assembler object code
+>7      string          >\0     version '%s'
+# gnu gmon magic From: Eugen Dedu <dedu at ese-metz.fr>
+0	string		gmon		GNU prof performance data
+>4	long		x		- version %ld
+# From: Dave Pearson <davep at davep.org>
+# Harbour <URL:http://www.harbour-project.org/> HRB files.
+0	string		\xc0HRB		Harbour HRB file
+>4	short		x		version %d
+
+# From: "Stefan A. Haubenthal" <polluks at web.de>
+0	belong		0x000001EB	Plan 9 executable
+#------------------------------------------------------------------------------
+# varied.script:  file(1) magic for various interpreter scripts
+
+0	string		#!\ /			a
+>3	string		>\0			%s script text
+0	string		#!\	/		a
+>3	string		>\0			%s script text
+0	string		#!/			a
+>2	string		>\0			%s script text
+0	string		#!\ 			script text
+>3	string		>\0			for %s
+
+
+#------------------------------------------------------------------------------
+# vax:  file(1) magic for VAX executable/object and APL workspace
+#
+0	lelong		0101557		VAX single precision APL workspace
+0	lelong		0101556		VAX double precision APL workspace
+
+#
+# VAX a.out (32V, BSD)
+#
+0	lelong		0407		VAX executable
+>16	lelong		>0		not stripped
+
+0	lelong		0410		VAX pure executable
+>16	lelong		>0		not stripped
+
+0	lelong		0413		VAX demand paged pure executable
+>16	lelong		>0		not stripped
+
+0	lelong		0420		VAX demand paged (first page unmapped) pure executable
+>16	lelong		>0		not stripped
+
+#
+# VAX COFF
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0	leshort		0570		VAX COFF executable
+>12	lelong		>0		not stripped
+>22	leshort		>0		- version %ld
+0	leshort		0575		VAX COFF pure executable
+>12	lelong		>0		not stripped
+>22	leshort		>0		- version %ld
+
+#------------------------------------------------------------------------------
+# vicar:  file(1) magic for VICAR files.
+#
+# From: Ossama Othman <othman at astrosun.tn.cornell.edu
+# VICAR is JPL's in-house spacecraft image processing program
+# VICAR image
+0	string	LBLSIZE=	VICAR image data
+>32	string	BYTE		\b, 8 bits  = VAX byte
+>32	string	HALF		\b, 16 bits = VAX word     = Fortran INTEGER*2
+>32	string	FULL		\b, 32 bits = VAX longword = Fortran INTEGER*4
+>32	string	REAL		\b, 32 bits = VAX longword = Fortran REAL*4
+>32	string	DOUB		\b, 64 bits = VAX quadword = Fortran REAL*8
+>32	string	COMPLEX		\b, 64 bits = VAX quadword = Fortran COMPLEX*8
+# VICAR label file
+43	string	SFDU_LABEL	VICAR label file
+
+#------------------------------------------------------------------------------
+# visx:  file(1) magic for Visx format files
+#
+0	short		0x5555		VISX image file
+>2	byte		0		(zero)
+>2	byte		1		(unsigned char)
+>2	byte		2		(short integer)
+>2	byte		3		(float 32)
+>2	byte		4		(float 64)
+>2	byte		5		(signed char)
+>2	byte		6		(bit-plane)
+>2	byte		7		(classes)
+>2	byte		8		(statistics)
+>2	byte		10		(ascii text)
+>2	byte		15		(image segments)
+>2	byte		100		(image set)
+>2	byte		101		(unsigned char vector)
+>2	byte		102		(short integer vector)
+>2	byte		103		(float 32 vector)
+>2	byte		104		(float 64 vector)
+>2	byte		105		(signed char vector)
+>2	byte		106		(bit plane vector)
+>2	byte		121		(feature vector)
+>2	byte		122		(feature vector library)
+>2	byte		124		(chain code)
+>2	byte		126		(bit vector)
+>2	byte		130		(graph)
+>2	byte		131		(adjacency graph)
+>2	byte		132		(adjacency graph library)
+>2	string		.VISIX		(ascii text)
+
+#------------------------------------------------------------------------------
+# vms:  file(1) magic for VMS executables (experimental)
+#
+# VMS .exe formats, both VAX and AXP (Greg Roelofs, newt at uchicago.edu)
+
+# GRR 950122:  I'm just guessing on these, based on inspection of the headers
+# of three executables each for Alpha and VAX architectures.  The VAX files
+# all had headers similar to this:
+#
+#   00000  b0 00 30 00 44 00 60 00  00 00 00 00 30 32 30 35  ..0.D.`.....0205
+#   00010  01 01 00 00 ff ff ff ff  ff ff ff ff 00 00 00 00  ................
+#
+0	string	\xb0\0\x30\0	VMS VAX executable
+>44032	string	PK\003\004	\b, Info-ZIP SFX archive v5.12 w/decryption
+#
+# The AXP files all looked like this, except that the byte at offset 0x22
+# was 06 in some of them and 07 in others:
+#
+#   00000  03 00 00 00 00 00 00 00  ec 02 00 00 10 01 00 00  ................
+#   00010  68 00 00 00 98 00 00 00  b8 00 00 00 00 00 00 00  h...............
+#   00020  00 00 07 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
+#   00030  00 00 00 00 01 00 00 00  00 00 00 00 00 00 00 00  ................
+#   00040  00 00 00 00 ff ff ff ff  ff ff ff ff 02 00 00 00  ................
+#
+0	belong	0x03000000	VMS Alpha executable
+>75264	string	PK\003\004	\b, Info-ZIP SFX archive v5.12 w/decryption
+
+# -----------------------------------------------------------
+# VMware specific files (deducted from version 1.1 and log file entries)
+# Anthon van der Neut (anthon at mnt.org)
+0	belong	0x4d52564e	VMware nvram 
+0	belong	0x434f5744	VMware
+>4	byte	3	 	virtual disk 
+>>32	lelong	x		(%d/
+>>36	lelong	x		\b%d/
+>>40	lelong	x		\b%d)
+>4	byte	2	 	undoable disk
+>>32	string  >\0		(%s)
+
+#------------------------------------------------------------------------------
+# vorbis:  file(1) magic for Ogg/Vorbis files
+#
+# From Felix von Leitner <leitner at fefe.de>
+# Extended by Beni Cherniavsky <cben at crosswinds.net>
+# Further extended by Greg Wooledge <greg at wooledge.org>
+#
+# Most (everything but the number of channels and bitrate) is commented
+# out with `##' as it's not interesting to the average user.  The most
+# probable things advanced users would want to uncomment are probably
+# the number of comments and the encoder version.
+#
+# --- Ogg Framing ---
+0		string		OggS		Ogg data
+>4		byte		!0		UNKNOWN REVISION %u
+##>4		byte		0		revision 0
+>4		byte		0
+##>>14		lelong		x		(Serial %lX)
+# non-Vorbis content: FLAC (Free Loss-lessy Audio Codec,
+# http://flac.sourceforge.net)
+>>28		string		fLaC		\b, FLAC audio
+# --- First vorbis packet - general header ---
+>>28		string		\x01vorbis	\b, Vorbis audio,
+>>>35		lelong		!0		UNKNOWN VERSION %lu,
+##>>>35		lelong		0		version 0,
+>>>35		lelong		0
+>>>>39		ubyte		1		mono,
+>>>>39		ubyte		2		stereo,
+>>>>39		ubyte		>2		%u channels,
+>>>>40		lelong		x		%lu Hz
+# Minimal, nominal and maximal bitrates specified when encoding
+>>>>48		string		<\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff	\b,
+# The above tests if at least one of these is specified:
+>>>>>52		lelong		!-1
+# Vorbis RC2 has a bug which puts -1000 in the min/max bitrate fields
+# instead of -1.
+# Vorbis 1.0 uses 0 instead of -1.
+>>>>>>52	lelong		!0
+>>>>>>>52	lelong		!-1000
+>>>>>>>>52	lelong		x		<%lu
+>>>>>48		lelong		!-1
+>>>>>>48	lelong		x		~%lu
+>>>>>44		lelong		!-1
+>>>>>>44	lelong		!-1000
+>>>>>>>44	lelong		!0
+>>>>>>>>44	lelong		x		>%lu
+>>>>>48		string		<\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff	bps
+# -- Second vorbis header packet - the comments
+# A kludge to read the vendor string.  It's a counted string, not a
+# zero-terminated one, so file(1) can't read it in a generic way.
+# libVorbis is the only one existing currently, so I detect specifically
+# it.  The interesting value is the cvs date (8 digits decimal).
+# Post-RC1 Ogg files have the second header packet (and thus the version)
+# in a different place, so we must use an indirect offset.
+>>>(84.b+85)		string		\x03vorbis
+>>>>(84.b+96)		string/c	Xiphophorus\ libVorbis\ I	\b, created by: Xiphophorus libVorbis I
+>>>>>(84.b+120)		string		>00000000	
+# Map to beta version numbers:
+>>>>>>(84.b+120)	string		<20000508	(<beta1 - prepublic)
+>>>>>>(84.b+120)	string		20000508	(beta1/2)
+>>>>>>(84.b+120)	string		>20000508
+>>>>>>>(84.b+120)	string		<20001031	(beta2-3)
+>>>>>>(84.b+120)	string		20001031	(beta3)
+>>>>>>(84.b+120)	string		>20001031
+>>>>>>>(84.b+120)	string		<20010225	(beta3-4)
+>>>>>>(84.b+120)	string		20010225	(beta4)
+>>>>>>(84.b+120)	string		>20010225
+>>>>>>>(84.b+120)	string		<20010615	(beta4-RC1)
+>>>>>>(84.b+120)	string		20010615	(RC1)
+>>>>>>(84.b+120)	string		20010813	(RC2)
+>>>>>>(84.b+120)	string		20010816	(RC2 - Garf tuned v1)
+>>>>>>(84.b+120)	string		20011014	(RC2 - Garf tuned v2)
+>>>>>>(84.b+120)	string		20011217	(pre-RC3 CVS)
+>>>>>>(84.b+120)	string		20011231	(RC3)
+# Some pre-1.0 CVS snapshots still had "Xiphphorus"...
+>>>>>>(84.b+120)	string		>20011231	(pre-1.0 CVS)
+# For the 1.0 release, Xiphophorus is replaced by Xiph.Org
+>>>>(84.b+96)		string/c	Xiph.Org\ libVorbis\ I	\b, created by: Xiph.Org libVorbis I
+>>>>>(84.b+117)		string		>00000000	
+>>>>>>(84.b+117)	string		<20020717	(pre-1.0 CVS)
+>>>>>>(84.b+117)	string		20020717	(1.0)
+>>>>>>(84.b+117)	string		>20020717	(post-1.0 CVS)
+
+#------------------------------------------------------------------------------
+# VXL: file(1) magic for VXL binary IO data files
+#
+# from Ian Scott <scottim at sf.net>
+#
+# VXL is a collection of C++ libraries for Computer Vision.
+# See the vsl chapter in the VXL Book for more info
+# http://www.isbe.man.ac.uk/public_vxl_doc/books/vxl/book.html
+# http:/vxl.sf.net
+
+2	lelong	0x472b2c4e	VXL data file,
+>0	leshort	>0		schema version no %d
+
+#------------------------------------------------------------------------------
+# wordprocessors:  file(1) magic fo word processors.
+#
+####### PWP file format used on Smith Corona Personal Word Processors:
+2	string	\040\040\040\040\040\040\040\040\040\040\040ML4D\040\'92	Smith Corona PWP
+>24	byte	2	\b, single spaced
+>24	byte	3	\b, 1.5 spaced
+>24	byte	4	\b, double spaced
+>25	byte	0x42	\b, letter
+>25	byte	0x54	\b, legal
+>26	byte	0x46	\b, A4
+
+#WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
+0	string	\377WPC\020\000\000\000\022\012\001\001\000\000\000\000	(WP) loadable text
+>15	byte	0	Optimized for Intel
+>15	byte	1	Optimized for Non-Intel
+1	string	WPC	(Corel/WP)
+>8	short	257	WordPerfect macro
+>8	short	258	WordPerfect help file
+>8	short	259	WordPerfect keyboard file
+>8	short	266	WordPerfect document
+>8	short	267	WordPerfect dictionary
+>8	short	268	WordPerfect thesaurus
+>8	short	269	WordPerfect block
+>8	short	270	WordPerfect rectangular block
+>8	short	271	WordPerfect column block
+>8	short	272	WordPerfect printer data
+>8	short	275	WordPerfect printer data
+>8	short	276	WordPerfect driver resource data
+>8	short	279	WordPerfect hyphenation code
+>8	short	280	WordPerfect hyphenation data
+>8	short	281	WordPerfect macro resource data
+>8	short	283	WordPerfect hyphenation lex
+>8	short	285	WordPerfect wordlist
+>8	short	286	WordPerfect equation resource data
+>8	short	289	WordPerfect spell rules
+>8	short	290	WordPerfect dictionary rules
+>8	short	295	WordPerfect spell rules (Microlytics)
+>8	short	299	WordPerfect settings file
+>8	short	301	WordPerfect 4.2 document
+>8	short	325	WordPerfect dialog file
+>8	short	332	WordPerfect button bar
+>8	short	513	Shell macro
+>8	short	522	Shell definition
+>8	short	769	Notebook macro
+>8	short	770	Notebook help file
+>8	short	771	Notebook keyboard file
+>8	short	778	Notebook definition
+>8	short	1026	Calculator help file
+>8	short 	1538	Calendar help file
+>8	short 	1546	Calendar data file
+>8	short	1793	Editor macro
+>8	short	1794	Editor help file
+>8	short	1795	Editor keyboard file
+>8	short	1817	Editor macro resource file
+>8	short 	2049	Macro editor macro
+>8	short 	2050	Macro editor help file
+>8	short	2051	Macro editor keyboard file
+>8	short	2305	PlanPerfect macro
+>8	short	2306	PlanPerfect help file
+>8	short	2307	PlanPerfect keyboard file
+>8	short	2314	PlanPerfect worksheet
+>8	short	2319	PlanPerfect printer definition
+>8	short	2322	PlanPerfect graphic definition
+>8	short	2323	PlanPerfect data
+>8	short	2324	PlanPerfect temporary printer
+>8	short	2329	PlanPerfect macro resource data
+>8	byte	11	Mail
+>8	short	2818	help file
+>8	short	2821	distribution list
+>8	short	2826	out box
+>8	short	2827	in box
+>8	short	2836	users archived mailbox
+>8	short	2837	archived message database
+>8	short	2838	archived attachments
+>8	short	3083	Printer temporary file
+>8	short	3330	Scheduler help file
+>8	short	3338	Scheduler in file
+>8	short	3339	Scheduler out file
+>8	short	3594	GroupWise settings file
+>8	short	3601	GroupWise directory services
+>8	short	3627	GroupWise settings file
+>8	short	4362	Terminal resource data
+>8	short	4363	Terminal resource data
+>8	short	4395	Terminal resource data
+>8	short	4619	GUI loadable text
+>8	short	4620	graphics resource data
+>8	short	4621	printer settings file
+>8	short	4622	port definition file
+>8	short	4623	print queue parameters
+>8	short	4624	compressed file
+>8	short	5130	Network service msg file
+>8	short	5131	Network service msg file
+>8	short	5132	Async gateway login msg
+>8	short	5134	GroupWise message file
+>8	short	7956	GroupWise admin domain database
+>8	short	7957	GroupWise admin host database
+>8	short	7959	GroupWise admin remote host database
+>8	short	7960	GroupWise admin ADS deferment data file
+>8	short	8458	IntelliTAG (SGML) compiled DTD
+>8	long	18219264	WordPerfect graphic image (1.0)
+>8	long	18219520	WordPerfect graphic image (2.0)
+#end of WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
+
+# Hangul (Korean) Word Processor File
+0	string	HWP\ Document\ File	Hangul (Korean) Word Processor File
+
+# CosmicBook, from Benoît Rouits
+0       string  CSBK    Ted Neslson's CosmicBook hypertext file
+
+
+#------------------------------------------------------------------------------
+# file(1) magic(5) data for xdelta  Josh MacDonald <jmacd at CS.Berkeley.EDU>
+#
+0	string	%XDELTA%	XDelta binary patch file 0.14
+0	string	%XDZ000%	XDelta binary patch file 0.18
+0	string	%XDZ001%	XDelta binary patch file 0.20
+0	string	%XDZ002%	XDelta binary patch file 1.0
+0	string	%XDZ003%	XDelta binary patch file 1.0.4
+0	string	%XDZ004%	XDelta binary patch file 1.1
+
+#------------------------------------------------------------------------------
+# xenix:  file(1) magic for Microsoft Xenix
+#
+# "Middle model" stuff, and "Xenix 8086 relocatable or 80286 small
+# model" lifted from "magic.xenix", with comment "derived empirically;
+# treat as folklore until proven"
+#
+# "small model", "large model", "huge model" stuff lifted from XXX
+#
+# XXX - "x.out" collides with PDP-11 archives
+#
+0	string		core		core file (Xenix)
+0	byte		0x80		8086 relocatable (Microsoft)
+0	leshort		0xff65		x.out
+>2	string		__.SYMDEF	 randomized
+>0	byte		x		archive
+0	leshort		0x206		Microsoft a.out
+>8	leshort		1		Middle model
+>0x1e	leshort		&0x10		overlay
+>0x1e	leshort		&0x2		separate
+>0x1e	leshort		&0x4		pure
+>0x1e	leshort		&0x800		segmented
+>0x1e	leshort		&0x400		standalone
+>0x1e	leshort		&0x8		fixed-stack
+>0x1c	byte		&0x80		byte-swapped
+>0x1c	byte		&0x40		word-swapped
+>0x10	lelong		>0		not-stripped
+>0x1e	leshort		^0xc000		pre-SysV
+>0x1e	leshort		&0x4000		V2.3
+>0x1e	leshort		&0x8000		V3.0
+>0x1c	byte		&0x4		86
+>0x1c	byte		&0xb		186
+>0x1c	byte		&0x9		286
+>0x1c	byte		&0xa		386
+>0x1f	byte		<0x040		small model
+>0x1f	byte		=0x048		large model	
+>0x1f	byte		=0x049		huge model 
+>0x1e	leshort		&0x1		executable
+>0x1e	leshort		^0x1		object file
+>0x1e	leshort		&0x40		Large Text
+>0x1e	leshort		&0x20		Large Data
+>0x1e	leshort		&0x120		Huge Objects Enabled
+>0x10	lelong		>0		not stripped
+
+0	leshort		0x140		old Microsoft 8086 x.out
+>0x3	byte		&0x4		separate
+>0x3	byte		&0x2		pure
+>0	byte		&0x1		executable
+>0	byte		^0x1		relocatable
+>0x14	lelong		>0		not stripped
+
+0	lelong		0x206		b.out
+>0x1e	leshort		&0x10		overlay
+>0x1e	leshort		&0x2		separate
+>0x1e	leshort		&0x4		pure
+>0x1e	leshort		&0x800		segmented
+>0x1e	leshort		&0x400		standalone
+>0x1e	leshort		&0x1		executable
+>0x1e	leshort		^0x1		object file
+>0x1e	leshort		&0x4000		V2.3
+>0x1e	leshort		&0x8000		V3.0
+>0x1c	byte		&0x4		86
+>0x1c	byte		&0xb		186
+>0x1c	byte		&0x9		286
+>0x1c	byte		&0x29		286
+>0x1c	byte		&0xa		386
+>0x1e	leshort		&0x4		Large Text
+>0x1e	leshort		&0x2		Large Data
+>0x1e	leshort		&0x102		Huge Objects Enabled
+
+0	leshort		0x580		XENIX 8086 relocatable or 80286 small model
+
+#------------------------------------------------------------------------------
+# xwindows:  file(1) magic for various X/Window system file formats.
+
+# Compiled X Keymap 
+# XKM (compiled X keymap) files (including version and byte ordering)
+1	string	mkx				Compiled XKB Keymap: lsb,
+>0	byte	>0				version %d
+>0	byte	=0				obsolete
+0	string	xkm				Compiled XKB Keymap: msb,
+>3	byte	>0				version %d
+>0	byte	=0				obsolete
+
+# xfsdump archive
+0	string	xFSdump0			xfsdump archive
+>8	long	x	(version %d)
+
+# Jaleo XFS files
+0	long	395726				Jaleo XFS file
+>4	long	x				- version %ld
+>8	long	x				- [%ld -
+>20	long	x				%ldx
+>24	long	x				%ldx
+>28	long	1008				YUV422]
+>28	long	1000				RGB24]
+
+#------------------------------------------------------------------------------
+# zilog:  file(1) magic for Zilog Z8000.
+#
+# Was it big-endian or little-endian?  My Product Specification doesn't
+# say.
+#
+0	long		0xe807		object file (z8000 a.out)
+0	long		0xe808		pure object file (z8000 a.out)
+0	long		0xe809		separate object file (z8000 a.out)
+0	long		0xe805		overlay object file (z8000 a.out)
+
+#------------------------------------------------------------------------------
+# zyxel:  file(1) magic for ZyXEL modems
+#
+# From <rob at pe1chl.ampr.org>
+# These are the /etc/magic entries to decode datafiles as used for the
+# ZyXEL U-1496E DATA/FAX/VOICE modems.  (This header conforms to a
+# ZyXEL-defined standard)
+
+0	string		ZyXEL\002	ZyXEL voice data
+>10	byte		0		- CELP encoding
+>10	byte&0x0B	1		- ADPCM2 encoding
+>10	byte&0x0B	2		- ADPCM3 encoding
+>10	byte&0x0B	3		- ADPCM4 encoding
+>10	byte&0x0B	8		- New ADPCM3 encoding
+>10	byte&0x04	4		with resync
diff --git a/libs/kfs/lockfile.c b/libs/kfs/lockfile.c
new file mode 100644
index 0000000..86ac2e0
--- /dev/null
+++ b/libs/kfs/lockfile.c
@@ -0,0 +1,350 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+struct KRemoveLockFileTask;
+#define KTASK_IMPL struct KRemoveLockFileTask
+
+#include <kfs/extern.h>
+#include <kfs/lockfile.h>
+#include <kfs/impl.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kproc/task.h>
+#include <kproc/impl.h>
+#include <kproc/procmgr.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#if _DEBUGGING
+#define CRIPPLE_CLEANUP 0
+#define DISABLE_CLEANUP 0
+#endif
+
+/*--------------------------------------------------------------------------
+ * KRemoveLockFileTask
+ */
+typedef struct KRemoveLockFileTask KRemoveLockFileTask;
+struct KRemoveLockFileTask
+{
+    KTask dad;
+    KDirectory *dir;
+    char path [ 1 ];
+};
+
+static
+rc_t CC KRemoveLockFileTaskWhack ( KRemoveLockFileTask *self )
+{
+    rc_t rc = KDirectoryRelease ( self -> dir );
+    KTaskDestroy ( & self -> dad, "KRemoveLockFileTask" );
+    free ( self );
+    return rc;
+}
+
+static
+rc_t CC KRemoveLockFileTaskExecute ( KRemoveLockFileTask *self )
+{
+    return KDirectoryRemove ( self -> dir, true, "%s", self -> path );
+}
+
+static
+KTask_vt_v1 KRemoveLockFileTask_vt =
+{
+    1, 0,
+    KRemoveLockFileTaskWhack,
+    KRemoveLockFileTaskExecute
+};
+
+static
+rc_t KRemoveLockFileTaskMake ( KTask **task, KDirectory *dir, const char *path )
+{
+    rc_t rc;
+    size_t path_size = string_size ( path );
+    KRemoveLockFileTask *t = malloc ( sizeof * t + path_size );
+    if ( t == NULL )
+        rc = RC ( rcFS, rcLock, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KTaskInit ( & t -> dad, ( const KTask_vt* ) & KRemoveLockFileTask_vt, "KRemoveLockFileTask", path );
+        if ( rc == 0 )
+        {
+            rc = KDirectoryAddRef ( t -> dir = dir );
+            if ( rc == 0 )
+            {
+                strcpy ( t -> path, path );
+                * task = & t -> dad;
+                return 0;
+            }
+        }
+
+        free ( t );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KLockFile
+ *  a mutual exclusion lock on a file
+ *  the lock is acquired upon creation
+ *  and released upon destruction
+ *
+ * NB - only guaranteed to work when used from a single host
+ */
+struct KLockFile
+{
+    KProcMgr *pmgr;
+    KTask *cleanup;
+    KTaskTicket ticket;
+    KRefcount refcount;
+};
+
+static
+rc_t KLockFileWhack ( KLockFile *self )
+{
+    rc_t rc = 0;
+
+    /* remove task from cleanup queue */
+    if ( self -> pmgr != NULL )
+    {
+        rc = KProcMgrRemoveCleanupTask ( self -> pmgr, & self -> ticket );
+        KProcMgrRelease ( self -> pmgr );
+    }
+
+#if ! CRIPPLE_CLEANUP && ! DISABLE_CLEANUP
+    /* remove the lock file from file system */
+    rc = KTaskExecute ( self -> cleanup );
+#endif
+    KTaskRelease ( self -> cleanup );
+
+    free ( self );
+    return rc;
+}
+
+
+/* AddRef
+ */
+LIB_EXPORT rc_t CC KLockFileAddRef ( const KLockFile *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KLockFile" ) )
+        {
+        case krefLimit:
+            return RC ( rcFS, rcLock, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Release
+ */
+LIB_EXPORT rc_t CC KLockFileRelease ( const KLockFile *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KLockFile" ) )
+        {
+        case krefWhack:
+            return KLockFileWhack ( ( KLockFile* ) self );
+        case krefNegative:
+            return RC ( rcFS, rcLock, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Make
+ */
+static
+rc_t KLockFileMake ( KLockFile **lock, KDirectory *dir, const char *path )
+{
+    rc_t rc;
+    KLockFile *f = malloc ( sizeof * f );
+    if ( f == NULL )
+        rc = RC ( rcFS, rcLock, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KRemoveLockFileTaskMake ( & f -> cleanup, dir, path );
+        if ( rc == 0 )
+        {
+#if ! DISABLE_CLEANUP
+            /* register cleanup task with proc mgr */
+            rc = KProcMgrMakeSingleton ( & f -> pmgr );
+            if ( rc == 0 )
+                rc = KProcMgrAddCleanupTask ( f -> pmgr, & f -> ticket, f -> cleanup );
+            else
+#else
+            f -> pmgr = NULL;
+#endif
+            {
+                /* this is allowed to fail if mgr has not been initialized */
+                memset ( & f -> ticket, 0, sizeof f -> ticket );
+                rc = 0;
+            }
+
+            if ( rc == 0 )
+            {
+                KRefcountInit ( & f -> refcount, 1, "KLockFile", "make", path );
+                * lock = f;
+                return 0;
+            }
+
+            if ( f -> pmgr != NULL )
+                KProcMgrRelease ( f -> pmgr );
+        }
+
+        free ( f );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ *  interface extensions
+ */
+
+
+/* CreateLockFile
+ *  attempts to create a KLockFile
+ *
+ *  "lock" [ OUT ] - return parameter for newly created lock file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting lock file
+ */
+LIB_EXPORT rc_t CC KDirectoryVCreateLockFile ( KDirectory *self,
+    KLockFile **lock, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( lock == NULL )
+        rc = RC ( rcFS, rcFile, rcLocking, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcFile, rcLocking, rcSelf, rcNull );
+        else if ( path == NULL )
+            rc = RC ( rcFS, rcFile, rcLocking, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcFS, rcFile, rcLocking, rcPath, rcEmpty );
+        else
+        {
+            char full [ 4096 ];
+            rc = KDirectoryVResolvePath ( self, false, full, sizeof full, path, args );
+            if ( rc == 0 )
+            {
+                KFile *lock_file;
+                rc = KDirectoryCreateFile ( self, & lock_file, false, 0600, kcmCreate | kcmParents, "%s", full );
+                if ( rc == 0 )
+                {
+                    rc_t rc2;
+
+                    /* no longer need the file - not going to write to it anyway */
+                    KFileRelease ( lock_file );
+
+                    /* we have the lock */
+                    rc = KLockFileMake ( lock, self, full );
+                    if ( rc == 0 )
+                        return 0;
+
+                    /* must unlink lockfile */
+                    rc2 = KDirectoryRemove ( self, true, "%s", full );
+                    if ( rc2 != 0 )
+                        /* issue a report */;
+                }
+                else if ( GetRCState ( rc ) == rcExists )
+                {
+                    /* map the rc to kproc type values */
+                    rc = RC ( rcFS, rcFile, rcLocking, rcLocking, rcBusy );
+                }
+                else
+                {
+                    rc = ResetRCContext ( rc, rcFS, rcFile, rcLocking );
+                }
+            }
+        }
+
+        * lock = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryCreateLockFile ( KDirectory *self,
+    KLockFile **lock, const char *path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+
+    rc = KDirectoryVCreateLockFile ( self, lock, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* CreateExclusiveAccessFile
+ *  opens a file with exclusive write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+
+LIB_EXPORT rc_t CC KDirectoryCreateExclusiveAccessFile ( KDirectory *self, KFile **f,
+    bool update, uint32_t access, KCreateMode mode, const char *path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+
+    rc = KDirectoryVCreateExclusiveAccessFile ( self, f, update, access, mode, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
diff --git a/libs/kfs/manager.c b/libs/kfs/manager.c
new file mode 100644
index 0000000..1983ff2
--- /dev/null
+++ b/libs/kfs/manager.c
@@ -0,0 +1,641 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+
+#include <kfs/manager.h>
+#include <kfs/path.h>
+#include "path-priv.h"
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/kfs-priv.h>
+
+#include <klib/refcount.h>
+#include <klib/rc.h>
+
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+
+
+#include <sysalloc.h>
+#include <stdlib.h>
+
+
+#ifdef _DEBUGGING
+#define MGR_DEBUG(msg) DBGMSG(DBG_KFS,DBG_FLAG(DBG_KFS_MGR), msg)
+#else
+#define MGR_DEBUG(msg)
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KFSManager
+ */
+/* currently expected to be a singleton and not use a vtable but
+ * be fully fleashed out here */
+struct KFSManager
+{
+    KRefcount refcount;
+
+    /* the current directory in the eyes of the O/S when created */
+    KDirectory * cwd;
+
+    /* the underlying perating systems view of the path of the 
+     * current working directory */
+    KPath * cpath;
+    
+};
+static const char kfsmanager_classname [] = "KFSManager";
+
+static 
+KFSManager * singleton = NULL;
+
+
+/* Destroy
+ *  destroy file
+ */
+LIB_EXPORT rc_t CC KFSManagerDestroy ( KFSManager *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcDestroying, rcSelf, rcNull );
+
+    KRefcountWhack (&self->refcount, kfsmanager_classname);
+
+    KDirectoryRelease (self->cwd);
+
+    KPathRelease (self->cpath);
+
+    free (self);
+    singleton = NULL;
+    return 0;
+}
+
+/* AddRef
+ *  creates a new reference
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KFSManagerAddRef ( const KFSManager *self )
+{
+    if (self != NULL)
+    {
+        switch (KRefcountAdd (&self->refcount, kfsmanager_classname))
+        {
+        case krefOkay:
+            break;
+        case krefZero:
+            return RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcIncorrect);
+        case krefLimit:
+            return RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcExhausted);
+        case krefNegative:
+            return RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcInvalid);
+        default:
+            return RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcUnknown);
+        }
+    }
+    return 0;
+}
+
+/* Release
+ *  discard reference to file
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KFSManagerRelease ( const KFSManager *self )
+{
+    rc_t rc = 0;
+    if (self != NULL)
+    {
+        switch (KRefcountDrop (&self->refcount, kfsmanager_classname))
+        {
+        case krefOkay:
+        case krefZero:
+            break;
+        case krefWhack:
+            rc = KFSManagerDestroy ((KFSManager*)self);
+            break;
+        case krefNegative:
+            return RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcInvalid);
+        default:
+            rc = RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcUnknown);
+            break;            
+        }
+    }
+    return rc;
+}
+
+/* OpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC KFSManagerOpenFileRead (const KFSManager *self,
+                                           KFile const **f,
+                                           const KPath * path)
+{
+    /* -----
+     * this is a first pass that only opens files directory referenced from 
+     * the ced or have a sysdir root; that is it uses KSysDir and KSysFile
+     * only.
+     */
+    KDirectory *cwd;
+    const KFile * file;
+    size_t num_read;
+    char pbuff [4096];
+    rc_t rc;
+
+    if ((f == NULL) || (path == NULL))
+        return RC (rcFS, rcMgr, rcOpening, rcParam, rcNull);
+
+    *f = NULL;
+
+    if (self == NULL)
+        return RC (rcFS, rcMgr, rcOpening, rcSelf, rcNull);
+
+    rc = KPathReadPath (path, pbuff, sizeof pbuff, &num_read);
+    if (rc == 0)
+    {
+        char rbuff [4096];
+
+        cwd = self->cwd;
+    
+        rc = KDirectoryResolvePath (cwd, true, rbuff, sizeof rbuff, "%s", pbuff);
+        if (rc == 0)
+        {
+            uint32_t type;
+
+            type = KDirectoryPathType (cwd, "%s", rbuff);
+            switch (type & ~kptAlias)
+            {
+            case kptNotFound:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcNotFound);
+                break;
+
+            case kptFile:
+                rc = KDirectoryOpenFileRead (cwd, f, "%s", rbuff);
+                break;
+
+            case kptBadPath:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcInvalid);
+                break;
+            case kptDir:
+            case kptCharDev:
+            case kptBlockDev:
+            case kptFIFO:
+            case kptZombieFile:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcIncorrect);
+                break;
+
+            default:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcUnknown);
+                break;
+            }
+        }
+    }
+    if (rc == 0)
+    {
+        size_t z;
+        char obuff [4096];
+
+        if (KPathOption (path, kpopt_encrypted, obuff, sizeof obuff, &z) == 0)
+        {
+            const KFile * pwfile;
+
+            if (KPathOption (path, kpopt_pwpath, obuff, sizeof obuff, &z) == 0)
+                rc = KDirectoryOpenFileRead (cwd, &pwfile, "%s", obuff);
+
+            else if (KPathOption (path, kpopt_pwfd, obuff, sizeof obuff, &z) == 0)
+                rc = KFileMakeFDFileRead (&pwfile, atoi (obuff));
+            else
+                rc = RC (rcFS, rcPath, rcConstructing, rcParam, rcUnsupported);
+
+            if (rc == 0)
+            {
+                rc = KFileRead (pwfile, 0, obuff, sizeof obuff, &z);
+                
+                KFileRelease (pwfile);
+
+                if (rc == 0)
+                {
+                    KKey key;
+                    const KFile * encfile;
+
+                    rc = KKeyInit (&key, kkeyAES128, obuff, z);
+
+                    obuff[z] = '\0';
+
+                    rc = KEncFileMakeRead (&encfile, file, &key);
+                    if (rc == 0)
+                    {
+                        *f = encfile;
+                        return 0;
+                    }
+                }
+            }
+            if (rc)
+                KFileRelease (file);
+        }
+        else
+        {
+            *f = file;
+            return 0;
+        }
+    }
+    return rc;
+}
+
+
+/* OpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC KFSManagerOpenFileWrite (const KFSManager *self,
+                                            KFile **f, bool update,
+                                            const KPath * path )
+{
+    /* -----
+     * this is a first pass that only opens files directory referenced from 
+     * the ced or have a sysdir root; that is it uses KSysDir and KSysFile
+     * only.
+     */
+    KDirectory * cwd;
+    KFile * file;
+    size_t num_read;
+    char pbuff [4096];
+    rc_t rc;
+
+    if ((f == NULL) || (path == NULL))
+        return RC (rcFS, rcMgr, rcOpening, rcParam, rcNull);
+
+    *f = NULL;
+
+    if (self == NULL)
+        return RC (rcFS, rcMgr, rcOpening, rcSelf, rcNull);
+
+    rc = KPathReadPath (path, pbuff, sizeof pbuff, &num_read);
+    if (rc == 0)
+    {
+        KDirectory *cwd;
+        char rbuff [4096];
+
+        cwd = self->cwd;
+    
+        rc = KDirectoryResolvePath (cwd, true, rbuff, sizeof rbuff, "%s", pbuff);
+        if (rc == 0)
+        {
+            uint32_t type;
+
+            type = KDirectoryPathType (cwd, "%s", rbuff);
+            switch (type & ~kptAlias)
+            {
+            case kptNotFound:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcNotFound);
+                break;
+
+            case kptFile:
+                rc = KDirectoryOpenFileWrite (cwd, f, update, "%s", rbuff);
+                break;
+
+            case kptBadPath:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcInvalid);
+                break;
+            case kptDir:
+            case kptCharDev:
+            case kptBlockDev:
+            case kptFIFO:
+            case kptZombieFile:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcIncorrect);
+                break;
+
+            default:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcUnknown);
+                break;
+            }
+        }
+    }
+    if (rc == 0)
+    {
+        size_t z;
+        char obuff [4096];
+
+        if (KPathOption (path, kpopt_encrypted, obuff, sizeof obuff, &z) == 0)
+        {
+            const KFile * pwfile;
+
+            if (KPathOption (path, kpopt_pwpath, obuff, sizeof obuff, &z) == 0)
+                rc = KDirectoryOpenFileRead (cwd, &pwfile, "%s", obuff);
+
+            else if (KPathOption (path, kpopt_pwfd, obuff, sizeof obuff, &z) == 0)
+                rc = KFileMakeFDFileRead (&pwfile, atoi (obuff));
+            else
+                rc = RC (rcFS, rcPath, rcConstructing, rcParam, rcUnsupported);
+
+            if (rc == 0)
+            {
+                rc = KFileRead (pwfile, 0, obuff, sizeof obuff, &z);
+                
+                KFileRelease (pwfile);
+
+                if (rc == 0)
+                {
+                    KKey key;
+                    KFile * encfile;
+
+                    rc = KKeyInit (&key, kkeyAES128, obuff, z);
+
+                    obuff[z] = '\0';
+
+                    rc = KEncFileMakeWrite (&encfile, file, &key);
+                    if (rc == 0)
+                    {
+                        *f = encfile;
+                        return 0;
+                    }
+                }
+            }
+            if (rc)
+                KFileRelease (file);
+        }
+        else
+        {
+            *f = file;
+            return 0;
+        }
+    }
+    return rc;
+}
+
+
+/* CreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] KPath representing the path, URL or URN of the desired file
+ */
+LIB_EXPORT rc_t CC KFSManagerCreateFile ( const KFSManager *self, KFile **f,
+    bool update, uint32_t access, KCreateMode mode, const KPath * path )
+{
+    /* -----
+     * this is a first pass that only opens files directory referenced from 
+     * the ced or have a sysdir root; that is it uses KSysDir and KSysFile
+     * only.
+     */
+    KDirectory *cwd;
+    KFile * file;
+    size_t num_read;
+    char pbuff [4096];
+    rc_t rc;
+
+    if ((f == NULL) || (path == NULL))
+        return RC (rcFS, rcMgr, rcOpening, rcParam, rcNull);
+
+    *f = NULL;
+
+    if (self == NULL)
+        return RC (rcFS, rcMgr, rcOpening, rcSelf, rcNull);
+
+    rc = KPathReadPath (path, pbuff, sizeof pbuff, &num_read);
+    if (rc == 0)
+    {
+        char rbuff [4096];
+
+        cwd = self->cwd;
+    
+        rc = KDirectoryResolvePath (cwd, true, rbuff, sizeof rbuff, "%s", pbuff);
+        if (rc == 0)
+        {
+            uint32_t type;
+
+            type = KDirectoryPathType (cwd, "%s", rbuff);
+            switch (type & ~kptAlias)
+            {
+            case kptNotFound:
+            case kptFile:
+                rc = KDirectoryCreateFile (cwd, &file, update, access, mode,
+                                           "%s", rbuff);
+                break;
+
+            case kptBadPath:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcInvalid);
+                break;
+            case kptDir:
+            case kptCharDev:
+            case kptBlockDev:
+            case kptFIFO:
+            case kptZombieFile:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcIncorrect);
+                break;
+
+            default:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcUnknown);
+                break;
+            }
+        }
+    }
+    if (rc == 0)
+    {
+        size_t z;
+        char obuff [4096];
+
+        if (KPathOption (path, kpopt_encrypted, obuff, sizeof obuff, &z) == 0)
+        {
+            const KFile * pwfile;
+
+            if (KPathOption (path, kpopt_pwpath, obuff, sizeof obuff, &z) == 0)
+                rc = KDirectoryOpenFileRead (cwd, &pwfile, "%s", obuff);
+
+            else if (KPathOption (path, kpopt_pwfd, obuff, sizeof obuff, &z) == 0)
+                rc = KFileMakeFDFileRead (&pwfile, atoi (obuff));
+            else
+                rc = RC (rcFS, rcPath, rcConstructing, rcParam, rcUnsupported);
+
+            if (rc == 0)
+            {
+                rc = KFileRead (pwfile, 0, obuff, sizeof obuff, &z);
+                
+                KFileRelease (pwfile);
+
+                if (rc == 0)
+                {
+                    KKey key;
+                    KFile * encfile;
+
+                    rc = KKeyInit (&key, kkeyAES128, obuff, z);
+
+                    obuff[z] = '\0';
+
+                    rc = KEncFileMakeWrite (&encfile, file, &key);
+                    if (rc == 0)
+                    {
+                        *f = encfile;
+                        return 0;
+                    }
+                }
+            }
+            if (rc)
+                KFileRelease (file);
+        }
+        else
+        {
+            *f = file;
+            return 0;
+        }
+    }
+    return rc;
+}
+
+
+/* Remove
+ *  remove an accessible object from its directory
+ *
+ *  "force" [ IN ] - if true and target is a directory,
+ *  remove recursively
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT rc_t CC KFSManagerRemove ( const KFSManager *self, bool force,
+                                      const KPath * path )
+{
+    /* -----
+     * this is a first pass that only opens files directory referenced from 
+     * the ced or have a sysdir root; that is it uses KSysDir and KSysFile
+     * only.
+     */
+    size_t num_read;
+    char pbuff [4096];
+    rc_t rc;
+
+    if (path == NULL)
+        return RC (rcFS, rcMgr, rcOpening, rcParam, rcNull);
+
+    if (self == NULL)
+        return RC (rcFS, rcMgr, rcOpening, rcSelf, rcNull);
+
+    rc = KPathReadPath (path, pbuff, sizeof pbuff, &num_read);
+    if (rc == 0)
+    {
+        KDirectory *cwd;
+        char rbuff [4096];
+
+        cwd = self->cwd;
+    
+        rc = KDirectoryResolvePath (cwd, true, rbuff, sizeof rbuff, "%s", pbuff);
+        if (rc == 0)
+        {
+            uint32_t type;
+
+            type = KDirectoryPathType (cwd, "%s", rbuff);
+            switch (type & ~kptAlias)
+            {
+            case kptNotFound:
+                break;
+
+            case kptFile:
+            case kptDir:
+            case kptCharDev:
+            case kptBlockDev:
+            case kptFIFO:
+            case kptZombieFile:
+                rc = KDirectoryRemove (cwd, force, "%s", rbuff);
+                break;
+
+            case kptBadPath:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcInvalid);
+                break;
+/*                 rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcIncorrect); */
+/*                 break; */
+
+            default:
+                rc = RC (rcFS, rcMgr, rcOpening, rcFile, rcUnknown);
+                break;
+            }
+        }
+    }
+    return rc;
+}
+
+
+/* Make
+ */
+LIB_EXPORT rc_t CC KFSManagerMake ( KFSManager ** pmanager )
+{
+    if (pmanager == NULL)
+        return RC (rcFS, rcMgr, rcConstructing, rcParam, rcNull);
+
+    if (singleton)
+    {
+        *pmanager = singleton;
+    }
+    else
+    {
+        KFSManager * obj;
+        rc_t rc;
+
+        obj = calloc (1, sizeof (*obj));
+        if (obj == NULL)
+            return RC (rcFS, rcMgr, rcConstructing, rcMemory, rcExhausted);
+
+        KRefcountInit (&obj->refcount, 1, kfsmanager_classname, "init", 
+                       kfsmanager_classname);
+
+        rc = KDirectoryNativeDir (&obj->cwd);
+        if (rc)
+        {
+            obj->cwd = NULL;
+            KFSManagerDestroy (obj);
+            return rc;
+        }
+
+        rc = KPathMakeCurrentPath (&obj->cpath);
+        if (rc)
+        {
+            obj->cpath = NULL;
+            KFSManagerDestroy (obj);
+            return rc;
+        }
+
+        *pmanager = singleton = obj;
+
+    }
+    return 0;
+}
diff --git a/libs/kfs/md5.c b/libs/kfs/md5.c
new file mode 100644
index 0000000..4664188
--- /dev/null
+++ b/libs/kfs/md5.c
@@ -0,0 +1,1910 @@
+/*=======================================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+struct KMD5File;
+#define KFILE_IMPL struct KMD5File
+
+#include <kfs/extern.h>
+#include <kfs/md5.h>
+#include <kfs/impl.h>
+#include <klib/checksum.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <endian.h>
+#include <byteswap.h>
+
+#define MD5_DBG_REF(msg) DBGMSG(DBG_LEGREF,DBG_FLAG(DBG_LEGREF_MD5), msg)
+
+
+/*--------------------------------------------------------------------------
+ * KMD5SumEntry
+ *  describes an entry into an MD5 checksum file
+ */
+typedef struct KMD5SumEntry KMD5SumEntry;
+struct KMD5SumEntry
+{
+    SLNode n;
+    uint8_t digest [ 16 ];
+    bool bin;
+    char path [ 1 ];
+};
+
+static
+void CC KMD5SumEntryWhack ( SLNode *n, void *ignore )
+{
+    free ( n );
+}
+
+typedef struct KMD5SumEntryFlushData KMD5SumEntryFlushData;
+struct KMD5SumEntryFlushData
+{
+    uint64_t pos;
+    KFile *f;
+    rc_t rc;
+};
+
+static
+bool CC KMD5SumEntryFlush ( SLNode *n, void *data )
+{
+    KMD5SumEntryFlushData *pb = data;
+    const KMD5SumEntry *self = ( const KMD5SumEntry* ) n;
+    int i, len;
+    size_t num_writ, total;
+    char line [ 4096 + 40 ];
+
+    for ( total = 0, i = 0; i < 16; ++ i )
+    {
+        len = snprintf ( & line [ total ], sizeof line - total,
+            "%02x", self -> digest [ i ] );
+        assert ( len == 2 );
+        total += len;
+    }
+
+    len = snprintf ( & line [ total ], sizeof line - total,
+        " %c%s\n", self -> bin ? '*' : ' ', self -> path );
+
+    if ( len < 0 )
+    {
+        pb -> rc = RC ( rcFS, rcFile, rcFormatting, rcString, rcExcessive );
+        return true;
+    }
+
+    total += len;
+    if ( total >= sizeof line )
+    {
+        pb -> rc = RC ( rcFS, rcFile, rcFormatting, rcString, rcExcessive );
+        return true;
+    }
+
+    pb -> rc = KFileWrite ( pb -> f, pb -> pos, line, total, & num_writ );
+    if ( pb -> rc != 0 )
+        return true;
+
+    pb -> pos += num_writ;
+
+    if ( num_writ == total )
+        return false;
+
+    pb -> rc = RC ( rcFS, rcFile, rcFormatting, rcTransfer, rcIncomplete );
+    return true;
+}
+
+static
+rc_t KMD5SumEntryMake ( KMD5SumEntry **ep,
+    const char *path, const uint8_t digest [ 16 ], bool bin )
+{
+    KMD5SumEntry *entry = malloc ( sizeof * entry + strlen ( path ) );
+    if ( entry == NULL )
+        return RC ( rcFS, rcFile, rcUpdating, rcMemory, rcExhausted );
+
+    memmove ( entry -> digest, digest, sizeof entry -> digest );
+    entry -> bin = bin;
+    strcpy ( entry -> path, path );
+
+    * ep = entry;
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KMD5SumFmt
+ *  a formatter for reading or writing an md5sum-style checksum file
+ */
+struct KMD5SumFmt
+{
+    SLList entries;
+    KFile *f;
+    atomic32_t refcount;
+    uint32_t count;
+    bool read_only;
+    bool dirty;
+};
+
+/* Flush
+ */
+LIB_EXPORT rc_t CC KMD5SumFmtFlush ( KMD5SumFmt *self )
+{
+    if ( self != NULL && self -> dirty )
+    {
+        KMD5SumEntryFlushData pb;
+        pb . pos = 0;
+        pb . f = self -> f;
+        pb . rc = 0;
+
+        SLListDoUntil ( & self -> entries, KMD5SumEntryFlush, & pb );
+
+        if ( pb . rc != 0 )
+            return pb . rc;
+
+        self -> dirty = false;
+    }
+    return 0;
+}
+
+
+/* Whack
+ */
+static
+rc_t KMD5SumFmtWhack ( KMD5SumFmt *self )
+{
+    rc_t rc;
+
+    atomic32_set ( & self -> refcount, 1 );
+
+    rc = KMD5SumFmtFlush ( self );
+    if ( rc == 0 )
+        rc = KFileRelease ( self -> f );
+    if ( rc != 0 )
+        return rc;
+
+    SLListWhack ( & self -> entries, KMD5SumEntryWhack, NULL );
+    free ( self );
+    return 0;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KMD5SumFmtAddRef ( const KMD5SumFmt *cself )
+{
+    if ( cself != NULL )
+    {
+        MD5_DBG_REF (("%s self %p prior count %u\n", __func__, cself, atomic32_read ( & cself -> refcount ) ));
+        atomic32_inc ( & ( ( KMD5SumFmt* ) cself ) -> refcount );
+    }
+    else
+    {
+        MD5_DBG_REF(("%s self %p\n", __func__, cself));
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KMD5SumFmtRelease ( const KMD5SumFmt *cself )
+{
+    KMD5SumFmt *self = ( KMD5SumFmt* ) cself;
+    if ( cself != NULL )
+    {
+        MD5_DBG_REF (("%s self %p prior count %u\n", __func__, cself, atomic32_read ( & cself -> refcount ) ));
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+            return KMD5SumFmtWhack ( self );
+    }
+    else
+    {
+        MD5_DBG_REF(("%s self %p\n", __func__, cself));
+    }
+    return 0;
+}
+
+
+/* Extract
+ *  extract a single line
+ */
+static
+int hex_to_int ( char hex )
+{
+    int i = hex - '0';
+    if ( hex > '9' )
+    {
+        if ( hex < 'a' )
+            i = hex - 'A' + 10;
+        else
+            i = hex - 'a' + 10;
+
+        if ( i > 15 )
+            return -1;
+    }
+    return i;
+}
+
+static
+rc_t KMD5SumFmtExtract ( KMD5SumFmt *self, const char *line, size_t size )
+{
+    rc_t rc;
+    KMD5SumEntry *entry;
+
+    /* check for a DOS condition not caught by parse */
+    if ( line [ size - 1 ] == '\r' )
+    {
+        /* drop CR from line */
+        size -= 1;
+    }
+
+    /* create entry */
+    entry = malloc ( sizeof * entry + size - ( 32 /* cs */ + 2 /* sp + mode */ ) );
+    if ( entry == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        int i;
+
+        /* parse checksum */
+        for ( rc = 0, i = 0; i < 16; ++ i )
+        {
+            int l, u = hex_to_int ( line [ i + i + 0 ] );
+            l = hex_to_int ( line [ i + i + 1 ] );
+            if ( u < 0 || l < 0 )
+            {
+                rc = RC ( rcFS, rcFile, rcConverting, rcFormat, rcInvalid );
+                break;
+            }
+
+            entry -> digest [ i ] = ( uint8_t ) ( ( u << 4 ) | l );
+        }
+
+        /* parse mode */
+        if ( rc == 0 )
+        {
+            if ( line [ 32 ] != ' ' )
+                rc = RC ( rcFS, rcFile, rcConverting, rcFormat, rcInvalid );
+            else if ( line [ 33 ] == ' ' )
+                entry -> bin = false;
+            else if ( line [ 33 ] == '*' )
+                entry -> bin = true;
+            else
+                rc = RC ( rcFS, rcFile, rcConverting, rcFormat, rcInvalid );
+        }
+
+        /* the rest is path */
+        if ( rc == 0 )
+        {
+            string_copy ( entry -> path, size, & line [ 32 + 2 ], size - ( 32 + 2 ) );
+            SLListPushTail ( & self -> entries, & entry -> n );
+            ++ self -> count;
+            return 0;
+        }
+
+        free ( entry );
+    }
+
+    return rc;
+}
+
+
+/* Parse
+ *  parse *.md5 file
+ */
+static
+rc_t KMD5SumFmtParse ( KMD5SumFmt *self, const char *start, const char *stop )
+{
+    rc_t rc;
+    const char *end;
+
+    for ( rc = 0; start < stop; start = end + 1 )
+    {
+        end = string_chr ( start, stop - start, '\n' );
+        if ( end == NULL )
+            end = stop;
+
+        /* allow '#' comments and blank lines */
+        if ( ( end - start ) == 0 )
+            continue;
+        if ( start [ 0 ] == '#' )
+            continue;
+
+        /* line must have minimum length */
+        if ( ( end - start ) < ( 32 /* cs */ + 2 /* sp + mode */ + 1 /* path */ ) )
+        {
+            /* check for empty line ending in CR-LF */
+            if ( end [ -1 ] == '\r' && ( end - start ) == 1 )
+                continue;
+
+            /* other stuff is garbage */
+            rc = RC ( rcFS, rcFile, rcParsing, rcData, rcInsufficient );
+            break;
+        }
+
+        /* extract entry */
+        rc = KMD5SumFmtExtract ( self, start, end - start );
+        if ( rc != 0 )
+            break;
+    }
+
+    return rc;
+}
+
+
+/* Populate
+ *  reads all lines of input from *.md5 file
+ */
+static
+rc_t KMD5SumFmtPopulate ( KMD5SumFmt *self, const KFile *in )
+{
+    uint64_t eof;
+    rc_t rc = KFileSize ( in, & eof );
+    if ( rc == 0 )
+    {
+        char *buff = malloc ( ( size_t ) eof );
+        if ( buff == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            size_t num_read, total;
+            for ( total = 0; total < ( size_t ) eof; total += num_read )
+            {
+                rc = KFileRead ( in, total,
+                    & buff [ total ], ( size_t ) eof - total, & num_read );
+                if ( rc != 0 )
+                    break;
+                if ( num_read == 0 )
+                {
+                    rc = RC ( rcFS, rcFile, rcReading, rcTransfer, rcIncomplete );
+                    break;
+                }
+            }
+
+            if ( rc == 0 )
+                rc = KMD5SumFmtParse ( self, buff, buff + total );
+
+            free ( buff );
+        }
+    }
+
+    return rc;
+}
+
+
+/* Make
+ *  creates a formatted accessor to textual checksum file
+ *  takes over ownership of "in"/"out" file reference
+ */
+LIB_EXPORT rc_t CC KMD5SumFmtMakeRead ( const KMD5SumFmt **fp, const KFile *in )
+{
+    rc_t rc;
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( in == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! in -> read_enabled )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        else
+        {
+            KMD5SumFmt *f = malloc ( sizeof * f );
+            if ( f == NULL )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                SLListInit ( & f -> entries );
+                atomic32_set ( & f -> refcount, 1 );
+                f -> f = NULL;
+                f -> count = 0;
+                f -> read_only = true;
+                f -> dirty = false;
+
+                rc = KMD5SumFmtPopulate ( f, in );
+                if ( rc == 0 )
+                {
+                    f -> f = ( KFile* ) in;
+                    * fp = f;
+                    return 0;
+                }
+                
+                KMD5SumFmtWhack ( f );
+            }
+        }
+
+        * fp = NULL;
+    }
+
+    return rc;
+}
+
+/* Make
+ *  creates a formatted accessor to textual checksum file
+ *  takes over ownership of "in"/"out" file reference
+ */
+LIB_EXPORT rc_t CC KMD5SumFmtMakeUpdate ( KMD5SumFmt **fp, KFile *out )
+{
+    rc_t rc;
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( out == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! out -> write_enabled )
+        {
+            if ( out -> read_enabled )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+            else
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        }
+        else
+        {
+            KMD5SumFmt *f = malloc ( sizeof * f );
+            if ( f == NULL )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                SLListInit ( & f -> entries );
+                atomic32_set ( & f -> refcount, 1 );
+                f -> f = NULL;
+                f -> count = 0;
+                f -> read_only = false;
+                f -> dirty = false;
+
+                rc = 0;
+                if ( out -> read_enabled )
+                    rc = KMD5SumFmtPopulate ( f, out );
+                if ( rc == 0 )
+                {
+                    f -> f = out;
+                    * fp = f;
+                    return 0;
+                }
+                
+                KMD5SumFmtWhack ( f );
+            }
+        }
+
+        * fp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* Count
+ *  return the number of checksums in file
+ */
+LIB_EXPORT rc_t CC KMD5SumFmtCount ( const KMD5SumFmt *self, uint32_t *count )
+{
+    rc_t rc;
+    if ( count == NULL )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * count = self -> count;
+            return 0;
+        }
+
+        * count = 0;
+    }
+    return rc;
+}
+
+
+/* Get
+ *  retrieve an indexed checksum line
+ *
+ *  "idx" [ IN ] - zero-based index of checksum to access
+ *
+ *  "path" [ OUT ] and "size" [ IN ] - return buffer for file path
+ *
+ *  "digest" [ OUT ] - return parameter for the MD5 checksum
+ *
+ *  "bin" [ OUT, NULL OKAY ] - true if fopen mode used to
+ *  calculate "digest" was binary, false if text. pertinent if
+ *  digest was calculated using DOS text mode.
+ */
+LIB_EXPORT rc_t CC KMD5SumFmtGet ( const KMD5SumFmt *self, uint32_t idx,
+    char *path, size_t size, uint8_t digest [ 16 ], bool *bin )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+    else if ( idx >= self -> count )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcId, rcNotFound );
+    else
+    {
+        uint32_t i;
+        const KMD5SumEntry *entry = ( const KMD5SumEntry* )
+            SLListHead ( & self -> entries );
+        for ( i = 0; entry != NULL && i < idx; ++ i )
+        {
+            entry = ( const KMD5SumEntry* )
+                SLNodeNext ( & entry -> n );
+        }
+
+        if ( entry == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcId, rcNotFound );
+        else if ( path == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcBuffer, rcNull );
+        else if ( digest == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+        else
+        {
+            /* copy everything out */
+            memmove ( digest, entry -> digest, sizeof entry -> digest );
+            if ( bin != NULL )
+                * bin = entry -> bin;
+
+            /* return success if buffer large enough */
+            if ( string_copy_measure ( path, size, entry -> path ) < size )
+                return 0;
+
+            rc = RC ( rcFS, rcFile, rcAccessing, rcBuffer, rcInsufficient );
+        }
+    }
+
+    if ( path != NULL && size != 0 )
+        path [ 0 ] = 0;
+
+    if ( bin != NULL )
+        * bin = false;
+
+    return rc;
+}
+
+
+/* Find
+ *  retrieve checksum line by path
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  "digest" [ OUT ] - return parameter for the MD5 checksum
+ *
+ *  "bin" [ OUT, NULL OKAY ] - true if fopen mode used to
+ *  calculate "digest" was binary, false if text. pertinent if
+ *  digest was calculated using DOS text mode.
+ */
+LIB_EXPORT rc_t CC KMD5SumFmtFind ( const KMD5SumFmt *self,
+    const char *path, uint8_t digest [ 16 ], bool *bin )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+    else if ( path == NULL )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcPath, rcNull );
+    else if ( path [ 0 ] == 0 )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcPath, rcEmpty );
+    else
+    {
+        const KMD5SumEntry *entry = ( const KMD5SumEntry* )
+            SLListHead ( & self -> entries );
+        while ( entry != NULL )
+        {
+            if ( strcmp ( path, entry -> path ) == 0 )
+                break;
+
+            entry = ( const KMD5SumEntry* )
+                SLNodeNext ( & entry -> n );
+        }
+
+        if ( entry == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcPath, rcNotFound );
+        else if ( digest == NULL )
+            rc = RC ( rcFS, rcFile, rcAccessing, rcParam, rcNull );
+        else
+        {
+            /* copy everything out */
+            memmove ( digest, entry -> digest, sizeof entry -> digest );
+            if ( bin != NULL )
+                * bin = entry -> bin;
+
+            return 0;
+        }
+    }
+
+    if ( bin != NULL )
+        * bin = false;
+
+    return rc;
+}
+
+
+/* Delete
+ *  remove an existing line
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  returns rcNotFound if not present
+ */
+LIB_EXPORT rc_t CC KMD5SumFmtDelete ( KMD5SumFmt *self, const char *path )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcRemoving, rcSelf, rcNull );
+    else if ( path == NULL )
+        rc = RC ( rcFS, rcFile, rcRemoving, rcPath, rcNull );
+    else if ( path [ 0 ] == 0 )
+        rc = RC ( rcFS, rcFile, rcRemoving, rcPath, rcEmpty );
+    else
+    {
+        KMD5SumEntry *entry = ( KMD5SumEntry* )
+            SLListHead ( & self -> entries );
+        while ( entry != NULL )
+        {
+            if ( strcmp ( path, entry -> path ) == 0 )
+                break;
+
+            entry = ( KMD5SumEntry* )
+                SLNodeNext ( & entry -> n );
+        }
+
+        if ( entry == NULL )
+            rc = SILENT_RC ( rcFS, rcFile, rcRemoving, rcPath, rcNotFound );
+        else
+        {
+            /* pop entry from list */
+            SLListUnlink ( & self -> entries, & entry -> n );
+
+            /* delete entry */
+            KMD5SumEntryWhack ( & entry -> n, NULL );
+
+            /* mark the modification */
+            self -> dirty = true;
+            assert ( self -> count > 0 );
+            -- self -> count;
+
+            return 0;
+        }
+    }
+
+    return rc;
+}
+
+
+/* Update
+ *  add a checksum line to file or update an existing line
+ *
+ *  "path" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file
+ *
+ *  "digest" [ IN ] - calculated MD5 checksum
+ *
+ *  "bin" [ IN ] - true if checksum was calculated on all bytes
+ *  in file, false if fopen mode used to read file was text.
+ *
+ * NB - the md5sum tool operates with the assumption that files
+ *  are opened using "fopen". it records the mode used by prepending
+ *  '*' to indicate binary and ' ' to indicate text mode within the
+ *  checksum line.
+ *
+ *  unfortunately, this creates a situation where text-mode files
+ *  checksummed on DOS cannot be properly checked on any other
+ *  platform without the aid of some filter to drop out '\r' from
+ *  a '\r\n' sequence.
+ *
+ *  fortunately, most users are unaware of the binary/text mode
+ *  switches available with md5sum and use the default mode, which
+ *  is binary on DOS and text on Unix, which happens to be equivalent
+ *  to binary ( making one wonder why binary is not instead the
+ *  universal default ).
+ *
+ *  the end result is that we need to indicate whether CR stripping
+ *  was performed while at the same time behaving like md5sum.
+ */
+LIB_EXPORT rc_t CC KMD5SumFmtUpdate ( KMD5SumFmt *self, const char *path,
+    const uint8_t digest [ 16 ], bool bin )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcSelf, rcNull );
+    else if ( path == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcNull );
+    else if ( path [ 0 ] == 0 )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcEmpty );
+    else if ( digest == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcParam, rcNull );
+    else
+    {
+        /* create an entry */
+        KMD5SumEntry *entry;
+        rc = KMD5SumEntryMake ( & entry, path, digest, bin );
+        if ( rc == 0 )
+        {
+            /* scan for existing entry */
+            KMD5SumEntry *exist = ( KMD5SumEntry* )
+                SLListHead ( & self -> entries );
+            while ( exist != NULL )
+            {
+                if ( strcmp ( exist -> path, entry -> path ) == 0 )
+                    break;
+                exist = ( KMD5SumEntry* )
+                    SLNodeNext ( & exist -> n );
+            }
+
+            /* if new entry, insert */
+            if ( exist == NULL )
+            {
+                SLListPushTail ( & self -> entries, & entry -> n );
+                self -> dirty = true;
+                ++ self -> count;
+            }
+            else
+            {
+                /* if existing, perform update */
+                if ( memcmp ( exist -> digest, entry -> digest, sizeof exist -> digest ) != 0 ||
+                     exist -> bin != entry -> bin )
+                {
+                    memmove ( exist -> digest, entry -> digest, sizeof exist -> digest );
+                    exist -> bin = entry -> bin;
+                    self -> dirty = true;
+                }
+                KMD5SumEntryWhack ( & entry -> n, NULL );
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* Rename
+ * Rename the checksum line to reflect a file name change but no content change.
+ *
+ *  "newpath" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file's new name
+ *
+ *  "oldpath" [ IN ] - NUL terminated string in OS-native char set
+ *  denoting path to file's old name
+ *
+ */
+LIB_EXPORT rc_t CC KMD5SumFmtRename ( KMD5SumFmt *self, const char *oldpath, const char *newpath )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcSelf, rcNull );
+    else if ( newpath == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcNull );
+    else if ( newpath [ 0 ] == 0 )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcEmpty );
+    else if ( oldpath == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcNull );
+    else if ( oldpath [ 0 ] == 0 )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcString, rcEmpty );
+    else
+    {
+	uint8_t	digest [16];
+	bool    bin;
+
+	rc = KMD5SumFmtFind (self, oldpath, digest, &bin);
+
+	if (rc == 0)
+	    rc = KMD5SumFmtUpdate (self, newpath, digest, bin);
+
+	if (rc == 0)
+	    rc = KMD5SumFmtDelete (self, oldpath);
+;
+    }
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * MD5 KFile extensions
+ */
+typedef enum KMD5FileUnionType
+{
+    KMD5FileTypeRead,
+    KMD5FileTypeWrite
+} KMD5FileUnionType;
+struct KMD5File
+{
+    KFile dad;
+
+    /* this is position of next byte to read or write
+       relative to the MD5 not actual read/write */
+    uint64_t position;
+    MD5State md5;
+
+    KFile *file;
+    KMD5SumFmt *fmt;
+    KMD5FileUnionType type;
+    union
+    {
+        struct
+        {
+            rc_t rc;
+            uint8_t digest [ 16 ];
+            bool eof;
+        } rd;
+
+        struct
+        {
+            /* maximum position written to "file" */
+            uint64_t max_position;
+
+            /* saved information for a transaction */
+            uint64_t tposition;
+            MD5State tmd5;
+
+            /* is transaction open */
+            bool topen;
+            
+            /* was file changed */
+            bool changed;
+
+            /* path to file for md5 fmt */
+            char path [ 1 ];
+        } wr;
+
+    } u;
+};
+
+/* Whack
+ */
+static
+rc_t CC KMD5FileWhackRead ( KMD5File *self )
+{
+    rc_t rc;
+
+    atomic32_set ( & self -> dad . refcount, 1 );
+
+    rc = KFileRelease ( self -> file );
+    if ( rc == 0 )
+        free ( self );
+
+    return rc;
+}
+static
+rc_t CC KMD5FileWhackCreate ( KMD5File *self )
+{
+    uint64_t	position;
+    size_t	num_read;
+    rc_t	rc;
+    uint8_t	ignored [64 * 1024];
+
+    atomic32_set ( & self -> dad . refcount, 1 );
+
+    position = self->position;
+    for (;;)
+    {
+	rc = KFileRead (&self->dad, position, ignored, sizeof ignored, &num_read);
+	if (rc != 0)
+	    break;
+
+	if (num_read == 0)
+	    break;
+
+	position += num_read;
+    }
+    if (rc == 0)
+    {
+	rc = KFileRelease ( self -> file );
+	if ( rc == 0 )
+	    free ( self );
+    }
+    return rc;
+}
+
+static
+rc_t CC KMD5FileWhackWrite ( KMD5File *self )
+{
+    rc_t rc;
+    uint8_t digest [ 16 ];
+
+    atomic32_set ( & self -> dad . refcount, 1 );
+
+    /* if destination file has been written farther
+       than our concept of eof, truncate */
+    if ( self-> u . wr . changed && self -> u . wr . max_position > self -> position )
+    {
+        rc = KFileSetSize ( self -> file, self -> position );
+        if ( rc != 0 )
+            return rc;
+        self -> u . wr . max_position = self -> position;
+    }
+
+    rc = KFileRelease ( self -> file );
+    if ( rc == 0 )
+    {
+        MD5StateFinish ( & self -> md5, digest );
+        KMD5SumFmtUpdate ( self -> fmt, self -> u . wr . path, digest, true );
+        KMD5SumFmtRelease ( self -> fmt );
+        free ( self );
+    }
+
+    return rc;
+}
+
+static const char MD5TAG [8] = "MD5CNTXT";
+static const char ENDIANTAG [4] =
+{ 
+    '0' + (char)((__BYTE_ORDER/1000)%10),
+    '0' + (char)((__BYTE_ORDER/100)%10),
+    '0' + (char)((__BYTE_ORDER/10)%10),
+    '0' + (char)((__BYTE_ORDER/1)%10)
+};
+static const char ENDIANSWAPTAG [4] =
+{ 
+    '0' + (char)((__BYTE_ORDER/1)%10),
+    '0' + (char)((__BYTE_ORDER/10)%10),
+    '0' + (char)((__BYTE_ORDER/100)%10),
+    '0' + (char)((__BYTE_ORDER/1000)%10)
+};
+
+static
+rc_t CC KMD5FileWrite ( KMD5File *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ );
+
+static
+rc_t CC KMD5FileWhackAppend ( KMD5File *self )
+{
+    rc_t rc;
+
+    /* if the file is empty, just whack it */
+    if ( self -> position == 0 )
+        return KMD5FileWhackWrite ( self );
+
+    /* begin transaction will save current state */
+    rc = KMD5FileBeginTransaction ( self );
+    if ( rc == 0 )
+    {
+        size_t num_writ;
+
+        /* create a closing tag with current MD5State */
+        uint8_t closer [ sizeof MD5TAG + sizeof ENDIANTAG + sizeof self -> md5 ];
+        memmove ( closer, MD5TAG, sizeof MD5TAG );
+        memmove ( & closer [ sizeof MD5TAG ], ENDIANTAG, sizeof ENDIANTAG );
+        memmove ( & closer [ sizeof MD5TAG + sizeof ENDIANTAG ], & self -> md5, sizeof self -> md5 );
+            
+        /* append this to the file */
+        rc = KMD5FileWrite ( self, self -> position, closer, sizeof closer, & num_writ );
+        if ( rc == 0 )
+        {
+            /* test transfer */
+            if ( num_writ != sizeof closer )
+                rc = RC ( rcFS, rcFile, rcDestroying, rcTransfer, rcIncomplete );
+            else
+            {
+                /* complete operation */
+                rc = KMD5FileWhackWrite ( self );
+                if ( rc == 0 )
+                    return rc;
+            }
+        }
+
+        /* restore entry state */
+        KMD5FileRevert ( self );
+    }
+
+    /* bail on errors */
+    atomic32_set ( & self -> dad . refcount, 1 );
+    return rc;
+}
+
+
+/* GetSysFile
+ */
+static
+struct KSysFile *CC KMD5FileGetSysFile ( const KMD5File *self, uint64_t *offset )
+{
+    if ( offset != NULL )
+        * offset = 0;
+    return NULL;
+}
+
+
+/* RandomAccess
+ */
+static
+rc_t CC KMD5FileRandomAccessRead ( const KMD5File *self )
+{
+    return KFileRandomAccess ( self -> file );
+}
+
+static
+rc_t CC KMD5FileRandomAccessWrite ( const KMD5File *self )
+{
+    return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+}
+
+
+/* Type
+ */
+static
+uint32_t CC KMD5FileType ( const KMD5File *self )
+{
+    return KFileType ( self -> file );
+}
+
+
+/* Size
+ */
+static
+rc_t CC KMD5FileSize ( const KMD5File *self, uint64_t *size )
+{
+    return KFileSize ( self -> file, size );
+}
+
+static
+rc_t CC KMD5FileSizeAppend ( const KMD5File *self, uint64_t *size )
+{
+    assert (self);
+    assert (size);
+    *size = self->position;
+    return 0;
+}
+
+
+/* SetSize
+ *  the read-only version should never be called, because
+ *  the message dispatch checks for write enable
+ *
+ *  the writable version disallows all but a total reset
+ *  and setting size to current size
+ */
+static
+rc_t CC KMD5FileSetSizeRead ( KMD5File *self, uint64_t size )
+{
+    return RC ( rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported );
+}
+
+static
+rc_t CC KMD5FileSetSizeWrite ( KMD5File *self, uint64_t size )
+{
+    rc_t rc;
+
+    /* allow a noop */
+    if ( size == self -> position )
+        return 0;
+
+    /* disallow if not a reset */
+    if ( size != 0 )
+        return RC ( rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported );
+
+    /* ensure we're not in a transaction */
+    if ( self -> u . wr . topen )
+        return RC ( rcFS, rcFile, rcUpdating, rcFile, rcBusy );
+
+    /* go ahead and try to truncate destination */
+    rc = KFileSetSize ( self -> file, 0 );
+    if ( rc == 0 )
+    {
+        self -> u . wr . changed = true;
+        /* reset our internal state */
+        self -> position = self -> u . wr . max_position = 0;
+        MD5StateInit ( & self -> md5 );
+    }
+
+    return rc;
+}
+
+
+/* Finish
+ *  finishes an MD5State if necessary
+ *  returns the results of digest comparison
+ */
+static
+rc_t KMD5FileFinish ( KMD5File *self )
+{
+    /* finish MD5State on first time */
+    if ( ! self -> u . rd . eof )
+    {
+        uint8_t digest [ 16 ];
+        MD5StateFinish ( & self -> md5, digest );
+
+        if ( memcmp ( digest, self -> u . rd . digest, sizeof digest ) != 0 )
+            self -> u . rd . rc = RC ( rcFS, rcFile, rcReading, rcFile, rcCorrupt );
+
+        self -> u . rd . eof = true;
+    }
+
+    return self -> u . rd . rc;
+}
+
+
+/* Seek
+ *  used to scan ahead in a read-only file
+ *  "self" is modifiable, but file is read-only
+ */
+static
+rc_t KMD5FileSeek ( KMD5File *self, uint64_t pos )
+{
+    rc_t rc;
+    size_t num_read;
+    uint8_t buff [ 32 * 1024 ];
+
+    /* should never be called by writable file */
+    assert ( ! self -> dad . write_enabled );
+
+    /* seek to "pos" */
+    for ( rc = 0; self -> position < pos; self -> position += num_read )
+    {
+        /* maximum to read in this buffer */
+        size_t to_read = sizeof buff;
+        if ( self -> position + sizeof buff > pos )
+            to_read = ( size_t ) ( pos - self -> position );
+
+        /* read bytes */
+        rc = KFileRead ( self -> file, self -> position, buff, to_read, & num_read );
+        if ( rc != 0 )
+            break;
+
+        /* detect EOF */
+        if ( num_read == 0 )
+        {
+	    switch (self->type)
+	    {
+	    case KMD5FileTypeRead:
+		rc = KMD5FileFinish ( self );
+		break;
+	    case KMD5FileTypeWrite:
+		if ( self -> fmt != NULL)
+		{
+		    uint8_t digest [ 16 ];
+
+		    MD5StateFinish ( & self -> md5, digest );
+		    KMD5SumFmtUpdate ( self -> fmt, self -> u . wr . path, digest, true );
+		    KMD5SumFmtRelease ( self -> fmt );
+		    self -> fmt = NULL;
+		}
+		break;
+	    }
+	    break;
+        }
+
+        /* append bytes */
+        MD5StateAppend ( & self -> md5, buff, num_read );
+    }
+
+    return rc;
+}
+
+/* Read
+ *  read-only version allows random access reads
+ */
+static
+rc_t CC KMD5FileRead ( const KMD5File *cself,
+    uint64_t pos, void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+    size_t total = 0;
+    uint64_t end = pos + bsize;
+    KMD5File *self = ( KMD5File* ) cself;
+
+    * num_read = 0;
+
+    /* no buffer means no bytes */
+    if ( bsize == 0 )
+        return 0;
+
+    /* test for starting a read before the current marker
+       meaning that it does not figure in to the md5sum */
+    if ( self -> position  > pos )
+    {
+        /* test for entire buffer being before marker */
+        if ( end <= self -> position )
+            return KFileRead ( self -> file, pos, buffer, bsize, num_read );
+
+        /* perform a partial read without affecting md5 */
+        rc = KFileRead ( self -> file, pos, buffer, ( size_t ) ( self -> position - pos ), num_read );
+        if ( rc != 0 )
+            return rc;
+
+        /* adjust as if a new read request, remembering number read so far */
+        pos += * num_read;
+        total = * num_read;
+        buffer = & ( ( uint8_t* ) buffer ) [ * num_read ];
+
+        /* in case num_read != all bytes up to marker */
+        if ( pos != self -> position )
+            return 0;
+    }
+
+    /* test for hole between current marker and desired start */
+    else if ( self -> position < pos )
+    {
+        /* scan ahead, discarding */
+        rc = KMD5FileSeek ( self, pos );
+        if ( rc != 0 || self -> position < pos )
+            return rc;
+    }
+
+    /* no hole - and still some space in buffer */
+    assert ( self -> position == pos );
+    assert ( pos < end );
+
+    /* read bytes */
+    rc = KFileRead ( self -> file, pos, buffer, ( size_t ) ( end - pos ), num_read );
+    if ( rc == 0 )
+    {
+        /* detect bytes read */
+        if ( * num_read != 0 )
+        {
+            /* accumulate into MD5 */
+            self -> position += * num_read;
+            MD5StateAppend ( & self -> md5, buffer, * num_read );
+
+            /* add in any previously read bytes and return success */
+            * num_read += total;
+            return 0;
+        }
+        switch (self->type)
+        {
+        case KMD5FileTypeRead:
+            /* EOF - get MD5 digest results */
+            rc = KMD5FileFinish ( self );
+            break;
+        case KMD5FileTypeWrite:
+            if ( self -> fmt != NULL)
+            {
+            uint8_t digest [ 16 ];
+
+            MD5StateFinish ( & self -> md5, digest );
+            KMD5SumFmtUpdate ( self -> fmt, self -> u . wr . path, digest, true );
+            KMD5SumFmtRelease ( self -> fmt );
+            self -> fmt = NULL;
+            }
+            break;
+        }
+    }
+
+    /* always return 0 if some bytes were read */
+    if ( total != 0 )
+    {
+        * num_read = total;
+        return 0;
+    }
+
+    return rc;
+}
+
+/* Read
+ *  writeable version isn't keeping track of MD5 on read,
+ *  so just forward to destination file
+ */
+static
+rc_t CC KMD5FileFwdRead ( const KMD5File *self,
+    uint64_t pos, void *buffer, size_t bsize, size_t *num_read )
+{
+    return KFileRead ( self -> file, pos, buffer, bsize, num_read );
+}
+
+
+/* Write
+ */
+static
+rc_t CC KMD5FileBadWrite ( KMD5File *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    * num_writ = 0;
+    if ( size == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcFS, rcFile, rcWriting, rcBuffer, rcNull );
+
+    return RC ( rcFS, rcFile, rcReading, rcFile, rcReadonly );
+}
+
+static
+rc_t CC KMD5FileWrite ( KMD5File *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    rc_t rc;
+
+    if ( pos != self -> position )
+        return RC ( rcFS, rcFile, rcWriting, rcParam, rcInvalid );
+
+    rc = KFileWrite ( self -> file, pos, buffer, size, num_writ );
+    if ( rc == 0 && * num_writ != 0 )
+    {
+        self -> u . wr . changed = true;
+        self -> position += * num_writ;
+        if ( self -> position > self -> u . wr . max_position )
+            self -> u . wr . max_position = self -> position;
+        MD5StateAppend ( & self -> md5, buffer, * num_writ );
+    }
+
+    return rc;
+}
+
+
+/* ToKFile
+ *  an MD5 file is a subclass of KFile
+ *  this is an explicit cast operator
+ */
+LIB_EXPORT KFile* CC KMD5FileToKFile ( KMD5File *self )
+{
+    if ( self != NULL )
+        return & self -> dad;
+    return NULL;
+}
+
+LIB_EXPORT const KFile* CC KMD5FileToKFileConst ( const KMD5File *self )
+{
+    if ( self != NULL )
+        return & self -> dad;
+    return NULL;
+}
+
+
+/* BeginTransaction
+ *  preserve current MD5 state and file marker
+ *  in preparation for rollback
+ */
+LIB_EXPORT rc_t CC KMD5FileBeginTransaction ( KMD5File *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcFreezing, rcSelf, rcNull );
+    if ( ! self -> dad . write_enabled )
+        return RC ( rcFS, rcFile, rcFreezing, rcFile, rcReadonly );
+    if ( self -> u . wr . topen )
+        return RC ( rcFS, rcFile, rcFreezing, rcFile, rcBusy );
+
+    self -> u . wr . topen = true;
+    self -> u . wr . tposition = self -> position;
+    self -> u . wr . tmd5 = self -> md5;
+
+    return 0;
+}
+
+
+/* Commit
+ *  accept current MD5 state as correct
+ */
+LIB_EXPORT rc_t CC KMD5FileCommit ( KMD5File *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcCommitting, rcSelf, rcNull );
+    if ( ! self -> dad . write_enabled )
+        return RC ( rcFS, rcFile, rcCommitting, rcFile, rcReadonly );
+
+    self -> u . wr . topen = false;
+
+    return 0;
+}
+
+
+/* Revert
+ *  revert state to previous transaction boundary conditions
+ */
+LIB_EXPORT rc_t CC KMD5FileRevert ( KMD5File *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcReverting, rcSelf, rcNull );
+    if ( ! self -> dad . write_enabled )
+        return RC ( rcFS, rcFile, rcReverting, rcFile, rcReadonly );
+    if ( ! self -> u . wr . topen )
+        return RC ( rcFS, rcFile, rcReverting, rcFile, rcInconsistent );
+
+    self -> position = self -> u . wr . tposition;
+    self -> md5 = self -> u . wr . tmd5;
+    self -> u . wr . topen = false;
+
+    return 0;
+}
+
+/* Reset
+ *  reset state to that of an empty file
+ *  aborts any open transaction
+ */
+LIB_EXPORT rc_t CC KMD5FileReset ( KMD5File *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcResetting, rcSelf, rcNull );
+    if ( ! self -> dad . write_enabled )
+        return RC ( rcFS, rcFile, rcResetting, rcFile, rcReadonly );
+#if 1
+    self -> u . wr . topen = false;
+#else
+    if ( self -> u . wr . topen )
+        return RC ( rcFS, rcFile, rcResetting, rcFile, rcBusy );
+#endif
+
+    self -> u . wr . changed = true;
+    self -> position = 0;
+    MD5StateInit ( & self -> md5 );
+
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * MD5File factories
+ */
+
+
+/* MakeMD5Read
+ *  creates an adapter to check MD5 checksum for a source file
+ *
+ *  "f" [ OUT ] - return parameter for file with md5 check
+ *
+ *  "src" [ IN ] - source file with read permission
+ *
+ *  "digest" [ IN ] - MD5 checksum to match
+ *
+ * NB - creates a read-only file that does NOT support random access
+ *  i.e. must be consumed serially starting from offset 0
+ */
+static KFile_vt_v1 KMD5FileRead_vt =
+{
+    1, 1,
+
+    /* 1.0 */
+    KMD5FileWhackRead,
+    KMD5FileGetSysFile,
+    KMD5FileRandomAccessRead,
+    KMD5FileSize,
+    KMD5FileSetSizeRead,
+    KMD5FileRead,
+    KMD5FileBadWrite,
+
+    /* 1.1 */
+    KMD5FileType
+};
+
+LIB_EXPORT rc_t CC KFileMakeMD5Read ( const KFile **fp,
+    const KFile *src, const uint8_t digest [ 16 ] )
+{
+    rc_t rc;
+
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( src == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! src -> read_enabled )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        else if ( digest == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+        else
+        {
+            KMD5File *f = malloc ( sizeof * f - sizeof f -> u + sizeof f -> u . rd );
+            if ( f == NULL )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KFileInit ( & f -> dad,
+				     ( const KFile_vt* ) & KMD5FileRead_vt, "KMD5File", "no-name", true, false );
+                if ( rc == 0 )
+                {
+                    f -> position = 0;
+                    MD5StateInit ( & f -> md5 );
+                    f -> file = ( KFile* ) src;
+                    f -> fmt = NULL;
+                    f -> type = KMD5FileTypeRead;
+                    f -> u . rd . rc = 0;
+                    f -> u . rd . eof = 0;
+                    memmove ( f -> u . rd . digest, digest, sizeof f -> u . rd . digest );
+
+                    * fp = & f -> dad;
+                    return 0;
+                }
+            }
+
+            free ( f );
+        }
+
+        * fp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* MakeWrite
+ *  creates an adapter to create MD5 checksum for a file
+ *
+ *  "f" [ OUT ] - return parameter for file with md5 check
+ *
+ *  "out" [ IN ] - output file with write permission
+ *  since this file is being wrapped by "f", ownership of
+ *  the provided reference is transferred to "f"
+ *
+ *  "md5" [ IN ] - md5 checksum output formatter.
+ *  since this may be used for multiple checksums, "f" will
+ *  attach its own reference to "md5".
+ *
+ *  "path" [ IN ] - md5 checksum output file path, used to
+ *  create standard md5sum file entry.
+ *
+ * NB - creates a write-only file that does NOT suppport random access
+ *  i.e. must be written serially from offset 0
+ */
+static KFile_vt_v1 sKMD5FileWrite_vt =
+{
+    1, 0,
+
+    KMD5FileWhackWrite,
+    KMD5FileGetSysFile,
+    KMD5FileRandomAccessWrite,
+    KMD5FileSize,
+    KMD5FileSetSizeWrite,
+    KMD5FileFwdRead,
+    KMD5FileWrite
+};
+
+LIB_EXPORT rc_t CC KMD5FileMakeWrite ( KMD5File **fp,
+    KFile *out, KMD5SumFmt *md5, const char *path )
+{
+    rc_t rc;
+
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( out == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! out -> write_enabled )
+        {
+            if ( out -> read_enabled )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+            else
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        }
+        else if ( md5 == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( md5 -> read_only )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+        else if ( path == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcEmpty );
+        else
+        {
+            KMD5File *f = malloc ( sizeof * f - sizeof f -> u +
+                sizeof f -> u . wr + strlen ( path ) );
+            if ( f == NULL )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KFileInit ( & f -> dad,
+                    ( const KFile_vt* ) & sKMD5FileWrite_vt, "KMD5File", path, out -> read_enabled, true );
+                if ( rc == 0 )
+                {
+                    f -> position = 0;
+                    MD5StateInit ( & f -> md5 );
+                    f -> file = out;
+                    f -> fmt = md5;
+                    f -> type = KMD5FileTypeWrite;
+
+                    memset ( & f -> u . wr, 0, sizeof f -> u . wr );
+                    strcpy ( f -> u . wr . path, path );
+                    f -> u . wr . changed = false;
+
+                    rc = KFileSize ( out, & f -> u . wr . max_position );
+                    if (rc)
+                    {
+                        if (GetRCState (rc) == rcUnsupported)
+                        {
+                            f -> u . wr . max_position  = 0;
+                            rc = 0;
+                        }
+                    }    
+                    if ( rc == 0 )
+                        rc = KMD5SumFmtAddRef ( md5 );
+                    if ( rc == 0 )
+                    {
+                        * fp = f;
+                        return 0;
+                    }
+                }
+
+                free ( f );
+            }
+        }
+
+        * fp = NULL;
+    }
+
+    return rc;
+}
+
+/* MakeAppend
+ *  creates an adapter to create MD5 checksum for a file
+ *
+ *  "f" [ OUT ] - return parameter for file with md5 check
+ *
+ *  "out" [ IN ] - output file with write permission
+ *  since this file is being wrapped by "f", ownership of
+ *  the provided reference is transferred to "f"
+ *
+ *  "md5" [ IN ] - md5 checksum output formatter.
+ *  since this may be used for multiple checksums, "f" will
+ *  attach its own reference to "md5".
+ *
+ *  "path" [ IN ] - md5 checksum output file path, used to
+ *  create standard md5sum file entry.
+ *
+ * NB - creates a write-only file that does NOT suppport random access
+ *  i.e. must be written serially from current EOF (minus the stored MD5 context)
+ */
+static KFile_vt_v1 sKMD5FileAppend_vt =
+{
+    1, 0,
+
+    KMD5FileWhackAppend,
+    KMD5FileGetSysFile,
+    KMD5FileRandomAccessWrite,
+    KMD5FileSizeAppend,
+    KMD5FileSetSizeWrite,
+    KMD5FileFwdRead,
+    KMD5FileWrite
+};
+
+LIB_EXPORT rc_t CC KMD5FileMakeAppend ( KMD5File **fp, KFile *out, KMD5SumFmt *md5, const char *path )
+{
+    rc_t rc;
+    KLogLevel lvl = klogInt;
+    
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( out == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! out -> write_enabled )
+        {
+            if ( out -> read_enabled )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+            else
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        }
+        else if ( md5 == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( md5 -> read_only )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+        else if ( path == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcEmpty );
+        else
+        {
+            KMD5File *f = malloc ( sizeof * f - sizeof f -> u +
+                sizeof f -> u . wr + strlen ( path ) );
+            if ( f == NULL )
+            {
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+                lvl = klogSys;
+            }
+            else
+            {
+                rc = KFileInit ( & f -> dad,
+                    ( const KFile_vt* ) & sKMD5FileAppend_vt, "KMD5File", path, out -> read_enabled, true );
+                if ( rc == 0 )
+                {
+                    MD5StateInit ( & f -> md5 );
+                    f -> file = out;
+                    f -> fmt = md5;
+                    f -> type = KMD5FileTypeWrite;
+                    
+                    rc = KMD5SumFmtAddRef ( md5 );
+                    if ( rc != 0 )
+                    {
+                        free ( f );
+                        * fp = NULL;
+                        return rc;
+                    }
+
+                    memset ( & f -> u . wr, 0, sizeof f -> u . wr );
+                    strcpy ( f -> u . wr . path, path );
+                    f -> u . wr . changed = false;
+
+                    lvl = klogSys;
+                    rc = KFileSize ( out, & f -> position );
+                    if ( rc == 0 )
+                    {
+                        uint8_t buffer [ sizeof MD5TAG + sizeof ENDIANTAG + sizeof f -> md5 ];
+
+                        /* an empty file is fine */
+                        if ( f -> position == 0 )
+                        {
+                            * fp = f;
+                            return 0;
+                        }
+
+                        /* set max */
+                        f -> u . wr . max_position = f -> position;
+
+                        /* a file without a trailing MD5 state is incorrect or corrupt */
+                        if ( f -> position < sizeof buffer )
+                        {
+                            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcIncorrect );
+                            lvl = klogErr;
+                        }
+                        else
+                        {
+                            /* try to read MD5 state */
+                            size_t num_read;
+                            rc = KFileRead ( out, f -> position - sizeof buffer, buffer, sizeof buffer, & num_read );
+                            if ( rc == 0 )
+                            {
+                                if ( num_read != sizeof buffer )
+                                    rc = RC ( rcFS, rcFile, rcConstructing, rcTransfer, rcIncomplete );
+                                else
+                                {
+                                    /* errors from here are usage errors */
+                                    lvl = klogErr;
+                                    
+                                    if ( memcmp ( buffer, MD5TAG, sizeof MD5TAG ) != 0 )
+                                        rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcIncorrect );
+                                    else
+                                    {
+                                        /* forget about the MD5 state */
+                                        f -> position -= sizeof buffer;
+                                        memmove ( & f -> md5, & buffer [ sizeof MD5TAG + sizeof ENDIANTAG ], sizeof f -> md5 );
+                                        
+                                        /* check for proper byte order */
+                                        if ( memcmp ( & buffer [ sizeof MD5TAG ], ENDIANTAG, sizeof ENDIANTAG ) == 0 )
+                                        {
+                                            * fp = f;
+                                            return 0;
+                                        }
+
+                                        /* probably swapped, but confirm */
+                                        if ( memcmp ( & buffer [ sizeof MD5TAG ], ENDIANSWAPTAG, sizeof ENDIANSWAPTAG ) == 0 )
+                                        {
+                                            int i;
+
+                                            for ( i = 0; i < sizeof f -> md5 . count / sizeof f -> md5 . count [ 0 ]; ++ i )
+                                                f -> md5 . count [ i ] = bswap_32 ( f -> md5 . count [ i ] );
+                                            for ( i = 0; i < sizeof f -> md5 . abcd / sizeof f -> md5 . abcd [ 0 ]; ++ i )
+                                                f -> md5 . abcd [ i ] = bswap_32 ( f -> md5 . abcd [ i ] );
+
+                                            * fp = f;
+                                            return 0;
+                                        }
+                                        
+                                        /* garbage */
+                                        rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcCorrupt );
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    
+                    KMD5SumFmtRelease ( md5 );
+                }
+                
+                free ( f );
+            }
+        }
+        
+        * fp = NULL;
+    }
+    
+    LOGERR ( lvl, rc, "append-mode MD5 file" );
+    
+    return rc;
+}
+
+static KFile_vt_v1 sKMD5FileReadCreate_vt =
+{
+    1, 1,
+
+    KMD5FileWhackCreate,
+    KMD5FileGetSysFile,
+    KMD5FileRandomAccessRead,
+    KMD5FileSize,
+    KMD5FileSetSizeRead,
+    KMD5FileRead,
+    KMD5FileBadWrite,
+
+    /* 1.1 */
+    KMD5FileType
+};
+
+/* MakeReadNew
+ *  creates an adapter to create MD5 checksum for a file
+ *
+ *  "in" [ IN ] - input file 
+ *  since this file is being wrapped by "f", ownership of
+ *  the provided reference is transferred to "f"
+ */
+LIB_EXPORT rc_t CC KFileMakeNewMD5Read ( const KFile **fp,
+    const struct KFile *in, KMD5SumFmt *md5, const char *path )
+{
+    rc_t rc;
+
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( in == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! in -> read_enabled )
+	    rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        else if ( md5 == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( md5 -> read_only )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+        else if ( path == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcPath, rcEmpty );
+        else
+        {
+            size_t path_size = string_size ( path );
+            KMD5File *f = malloc ( sizeof * f + path_size );
+            if ( f == NULL )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KFileInit ( & f -> dad,
+                    ( const KFile_vt* ) & sKMD5FileReadCreate_vt, "KMD5File", path, in -> read_enabled, false );
+                if ( rc == 0 )
+                {
+                    f -> position = 0;
+                    MD5StateInit ( & f -> md5 );
+                    f -> file = (KFile*)in;
+                    f -> fmt = md5;
+                    f -> type = KMD5FileTypeWrite;
+                    
+                    memset ( & f -> u . wr, 0, sizeof f -> u . wr );
+                    string_copy ( f -> u . wr . path, path_size + 1, path, path_size );
+                    f -> u . wr . changed = false;
+#if 0
+/* KFileSize can't always be used */
+                    rc = KFileSize ( in, & f -> u . wr . max_position );
+#else
+                    f->u.wr.max_position = 0;
+#endif
+                    if ( rc == 0 )
+                        rc = KMD5SumFmtAddRef ( md5 );
+                    if ( rc == 0 )
+                    {
+                        * fp = &f->dad;
+                        return 0;
+                    }
+                }
+
+                free ( f );
+            }
+        }
+
+        * fp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* end of file */
diff --git a/libs/kfs/mmap-priv.h b/libs/kfs/mmap-priv.h
new file mode 100644
index 0000000..8b9ffac
--- /dev/null
+++ b/libs/kfs/mmap-priv.h
@@ -0,0 +1,111 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_mmap_priv_
+#define _h_mmap_priv_
+
+#ifndef _h_kfs_mmap_
+#include <kfs/mmap.h>
+#endif
+
+#ifndef _h_kfs_file_
+#include <kfs/file.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * KMMap
+ *  a memory mapped region
+ */
+#if 0
+/* minimal structure */
+struct KMMap
+{
+    uint64_t off;
+    uint64_t pos;
+    size_t size;
+    char *addr;
+
+    KFile *f;
+    size_t pg_size;
+
+    uint32_t addr_adj;
+    uint32_t size_adj;
+
+    KRefcount refcount;
+
+    bool read_only;
+    bool sys_mmap;
+    bool dirty;
+};
+#endif
+
+
+/* Make
+ *  make an open OS-specific KMMap structure
+ *  common code will initialize common parts such as KFile*
+ */
+rc_t KMMapMake ( KMMap **mmp );
+
+
+/* RWSys
+ *  map the region of mapped file into memory for read & write
+ *  using system memory mapping function
+ *
+ *  the values for "pos" and "size" can be trusted
+ *  as correct for page alignment
+ */
+rc_t KMMapRWSys ( KMMap *self, uint64_t pos, size_t size );
+
+
+/* ROSys
+ *  map the region of mapped file into memory for read only
+ *  using system memory mapping function
+ *
+ *  the values for "pos" and "size" can be trusted
+ *  as correct for page alignment
+ */
+rc_t KMMapROSys ( KMMap *self, uint64_t pos, size_t size );
+
+
+/* Unmap
+ *  removes a memory map
+ */
+rc_t KMMapUnmap ( KMMap *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_mmap_priv_ */
diff --git a/libs/kfs/mmap.c b/libs/kfs/mmap.c
new file mode 100644
index 0000000..69391d7
--- /dev/null
+++ b/libs/kfs/mmap.c
@@ -0,0 +1,754 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+#include "mmap-priv.h"
+#include "sysmmap-priv.h"
+#include "sysfile-priv.h"
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+
+#define USE_MALLOC_MMAP 1
+
+#if USE_MALLOC_MMAP
+
+#ifndef FORCE_MALLOC_MMAP
+#define FORCE_MALLOC_MMAP 0
+#endif
+
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KMMap
+ *  a memory mapped region
+ */
+
+
+/* Unmap
+ */
+static
+rc_t KMMapUnmapRgn ( KMMap *self )
+{
+    rc_t rc;
+
+    if ( self -> sys_mmap )
+        rc = KMMapUnmap ( self );
+    else
+    {
+        rc = 0;
+
+        if ( self -> dirty )
+        {
+            size_t num_writ, total;
+            for (  total = 0; total < self -> size; total += num_writ )
+            {
+                rc = KFileWrite ( self -> f, self -> pos + total,
+                    & self -> addr [ total ], self -> size - total, & num_writ );
+                if ( rc != 0 || num_writ == 0 )
+                    break;
+            }
+
+            if ( rc == 0 && total < self -> size )
+                rc = RC ( rcFS, rcMemMap, rcDestroying, rcTransfer, rcIncomplete );
+        }
+
+        if ( rc == 0 )
+            free ( self -> addr );
+    }
+
+    if ( rc == 0 )
+    {
+        self -> off = self -> pos = 0;
+        self -> addr = NULL;
+        self -> size = 0;
+        self -> sys_mmap = self -> dirty = false;
+    }
+
+    return rc;
+}
+
+/* Whack
+ */
+static
+rc_t KMMapWhack ( KMMap *self )
+{
+    rc_t rc = KMMapUnmapRgn ( self );
+    if ( rc != 0 )
+    {
+        KRefcountAdd ( & self -> refcount, "KMMap" );
+        return rc;
+    }
+
+    /* now goes the file */
+    KFileRelease ( self -> f );
+    free ( self );
+
+    return 0;
+}
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KMMapAddRef ( const KMMap *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KMMap" ) )
+        {
+        case krefLimit:
+            return RC ( rcFS, rcMemMap, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KMMapRelease ( const KMMap *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KMMap" ) )
+        {
+        case krefWhack:
+            return KMMapWhack ( ( KMMap* ) self );
+        case krefNegative:
+            return RC ( rcFS, rcMemMap, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Size
+ *  returns size of memory region
+ *
+ *  "size" [ OUT ] - return parameter for region size
+ */
+LIB_EXPORT rc_t CC KMMapSize ( const KMMap *self, size_t *size )
+{
+    if ( size == NULL )
+        return RC ( rcFS, rcMemMap, rcAccessing, rcParam, rcNull );
+
+    if ( self != NULL )
+    {
+        * size = self -> size;
+        return 0;
+    }
+
+    * size = 0;
+    return RC ( rcFS, rcMemMap, rcAccessing, rcSelf, rcNull );
+}
+
+
+/* Position
+ *  returns region starting offset into mapped file
+ *
+ *  "pos" [ OUT ] - return parameter for file offset
+ */
+LIB_EXPORT rc_t CC KMMapPosition ( const KMMap *self, uint64_t *pos )
+{
+    if ( pos == NULL )
+        return RC ( rcFS, rcMemMap, rcAccessing, rcParam, rcNull );
+
+    if ( self != NULL )
+    {
+        * pos = self -> pos;
+        return 0;
+    }
+
+    * pos = 0;
+    return RC ( rcFS, rcMemMap, rcAccessing, rcSelf, rcNull );
+}
+
+
+/* Addr
+ *  returns starting address of memory region
+ *
+ *  "addr" [ OUT ] - return parameter for memory address
+ */
+LIB_EXPORT rc_t CC KMMapAddrRead ( const KMMap *self, const void **addr )
+{
+    if ( addr == NULL )
+        return RC ( rcFS, rcMemMap, rcAccessing, rcParam, rcNull );
+
+    if ( self != NULL )
+    {
+        if ( self -> addr == NULL )
+            return RC ( rcFS, rcMemMap, rcAccessing, rcMemMap, rcInvalid );
+
+        * addr = ( const void* ) self -> addr;
+        return 0;
+    }
+
+    * addr = NULL;
+    return RC ( rcFS, rcMemMap, rcAccessing, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC KMMapAddrUpdate ( KMMap *self, void **addr )
+{
+    if ( addr == NULL )
+        return RC ( rcFS, rcMemMap, rcAccessing, rcParam, rcNull );
+
+    * addr = NULL;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcMemMap, rcAccessing, rcSelf, rcNull );
+
+    if ( self -> read_only )
+        return RC ( rcFS, rcMemMap, rcAccessing, rcMemMap, rcReadonly );
+
+    if (  self -> addr == NULL )
+        return RC ( rcFS, rcMemMap, rcAccessing, rcMemMap, rcInvalid );
+
+    if ( ! self -> sys_mmap )
+        self -> dirty = true;
+
+    * addr = self -> addr;
+    return 0;
+}
+
+
+/* MallocRgn
+ */
+#if USE_MALLOC_MMAP
+static
+rc_t KMMapMallocRgn ( KMMap *self, uint64_t pos, size_t size, bool read_only )
+{
+    rc_t rc;
+    uint64_t eof;
+
+    self -> off = 0;
+    self -> read_only = read_only;
+    self -> sys_mmap = self -> dirty = false;
+
+    /* try to crop size to actual file size */
+    rc = KFileSize ( self -> f, & eof );
+    if ( rc == 0 )
+    {
+        /* mapping beyond end of file */
+        if ( pos >= eof )
+        {
+            if ( read_only )
+            {
+                self -> pos = pos;
+                self -> addr = NULL;
+                self -> size = 0;
+                return 0;
+            }
+
+            /* allocate real memory */
+            self -> addr = calloc ( 1, size );
+            if ( self -> addr == NULL )
+                return RC ( rcFS, rcMemMap, rcConstructing, rcMemory, rcExhausted );
+
+            self -> pos = pos;
+            self -> size = size;
+            self -> dirty = true;
+            return 0;
+        }
+
+        /* crop for readonly case */
+        if ( read_only && (( size == 0 ) || ( pos + size > eof )))
+            size = ( size_t ) ( eof - pos );
+    }
+
+    /* now allocate memory */
+    self -> addr = malloc ( size );
+    if ( self -> addr == NULL )
+        rc = RC ( rcFS, rcMemMap, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        size_t num_read, total;
+        for ( rc = 0, total = 0; total < size; total += num_read )
+        {
+            rc = KFileRead ( self -> f, pos + total,
+                & self -> addr [ total ], size - total, & num_read );
+            if ( rc != 0 || num_read == 0 )
+                break;
+        }
+
+        if ( total != 0 )
+            rc = 0;
+
+        if ( total != size )
+            memset ( & self -> addr [ total ], 0, size - total );
+
+        self -> pos = pos;
+        self -> size = total;
+    }
+
+    return rc;
+}
+#endif
+
+
+/* RWRgn
+ */
+static
+rc_t KMMapRWRgn ( KMMap *self, uint64_t pos, size_t size )
+{
+    rc_t rc;
+    KSysFile *sf = KFileGetSysFile ( self -> f, & self -> off );
+
+    if ( ! self -> f -> read_enabled || ! self -> f -> write_enabled )
+        rc = RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcNoPerm );
+
+    else if ( sf == NULL )
+    {
+#if USE_MALLOC_MMAP
+        rc = KMMapMallocRgn ( self, pos, size, false );
+#else
+        rc = RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcIncorrect );
+#endif
+    }
+
+    else if ( self -> off != 0 )
+        rc = RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcNoPerm );
+
+    else
+    {
+        uint64_t eof;
+        rc = KFileSize ( self -> f, & eof );
+        if ( rc == 0 )
+        {
+            size_t bytes;
+            uint64_t pg_mask, left, right, range;
+
+            if ( size == 0 )
+            {
+                size = ( size_t ) eof;
+                if ( ( uint64_t ) size != eof )
+                    return RC ( rcFS, rcMemMap, rcConstructing, rcParam, rcExcessive );
+            }
+
+            pg_mask = self -> pg_size - 1;
+            left = pos & ~ pg_mask;
+            right = ( pos + size + pg_mask ) & ~ pg_mask;
+            range = right - left;
+
+            bytes = ( size_t ) range;
+            if ( ( uint64_t ) bytes != range )
+                return RC ( rcFS, rcMemMap, rcConstructing, rcParam, rcExcessive );
+
+            /* extend right edge if necessary */
+            if ( eof < right )
+            {
+                rc = KFileSetSize ( self -> f, right );
+                if ( rc != 0 )
+                    return ResetRCContext ( rc, rcFS, rcMemMap, rcConstructing );
+            }
+
+            if ( bytes == 0 )
+            {
+                self -> addr = NULL;
+                self -> addr_adj = 0;
+                self -> size_adj = 0;
+                self -> size = 0;
+            }
+            else
+            {
+#if FORCE_MALLOC_MMAP
+                rc = -1;
+#else
+                rc = KMMapRWSys ( self, left, bytes );
+#endif
+                if ( rc != 0 )
+                {
+                    self -> addr_adj = self -> size_adj = 0;
+                    self -> size = 0;
+
+                    if ( eof < right )
+                        KFileSetSize ( self -> f, eof );
+#if USE_MALLOC_MMAP
+                    rc = KMMapMallocRgn ( self, pos, size, false );
+#endif
+                    return rc;
+                }
+
+                self -> addr += pos - left;
+                self -> addr_adj = ( uint32_t ) ( pos - left );
+                self -> size_adj = ( uint32_t ) ( bytes - size );
+                self -> size = size;
+                self -> sys_mmap = true;
+            }
+
+            self -> pos = pos;
+            self -> read_only = false;
+        }
+    }
+
+    return rc;
+}
+
+
+/* RORgn
+ */
+static
+rc_t KMMapRORgn ( KMMap *self, uint64_t pos, size_t size )
+{
+    rc_t rc;
+
+    if ( ! self -> f -> read_enabled )
+        rc = RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcNoPerm );
+    else
+    {
+        uint64_t eof;
+
+        /* pos is relative to a virtual file; s_pos is relative to a system file */
+        uint64_t s_pos = pos;
+
+        KSysFile *sf = KFileGetSysFile ( self -> f, & self -> off );
+        if ( sf == NULL )
+        {
+#if USE_MALLOC_MMAP
+            return KMMapMallocRgn ( self, pos, size, true );
+#else
+            return RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcIncorrect );
+#endif
+        }
+
+        rc = KFileSize ( self -> f, & eof );
+
+        /* if file has known size */
+        if ( rc == 0 )
+        {
+            size_t bytes;
+            uint64_t pg_mask, left, right, range;
+
+            if ( size == 0 )
+            {
+                size = ( size_t ) eof;
+                if ( ( uint64_t ) size != eof )
+                    return RC ( rcFS, rcMemMap, rcConstructing, rcParam, rcExcessive );
+            }
+
+            if ( pos + size > eof )
+            {
+                if ( pos >= eof )
+                    return RC ( rcFS, rcMemMap, rcConstructing, rcParam, rcInvalid );
+                size = ( size_t ) ( eof - pos );
+            }
+
+            if ( self -> off != 0 )
+            {
+                s_pos = pos + self -> off;
+                rc = KFileSize ( & sf -> dad, & eof ); /* eof is now for the sysfile */
+                if ( rc != 0 )
+                    return ResetRCContext ( rc, rcFS, rcMemMap, rcConstructing );
+            }
+
+            pg_mask = self -> pg_size - 1;
+            left = s_pos & ~ pg_mask;
+            right = ( s_pos + size + pg_mask ) & ~ pg_mask;
+
+            if ( eof < right )
+                right = eof;
+
+            range = right - left;
+            bytes = ( size_t ) range;
+            if ( ( uint64_t ) bytes != range )
+                return RC ( rcFS, rcMemMap, rcConstructing, rcParam, rcExcessive );
+
+            if ( bytes == 0 )
+            {
+                size = 0;
+                self -> addr = NULL;
+                self -> addr_adj = 0;
+                self -> size_adj = 0;
+            }
+            else
+            {
+#if FORCE_MALLOC_MMAP
+                rc = -1;
+#else
+                rc = KMMapROSys ( self, left, bytes );
+#endif
+                if ( rc != 0 )
+                {
+                    self -> addr_adj = self -> size_adj = 0;
+                    self -> size = 0;
+#if USE_MALLOC_MMAP
+                    rc = KMMapMallocRgn ( self, pos, size, true );
+#endif
+                    return rc;
+                }
+            
+                self -> addr += s_pos - left;
+                self -> addr_adj = ( uint32_t ) ( s_pos - left );
+                self -> size_adj = ( uint32_t ) ( bytes - size );
+                self -> sys_mmap = true;
+            }
+        }
+
+        self -> pos = pos;
+        self -> size = size;
+        self -> read_only = true;
+    }
+
+    return rc;
+}
+
+
+/* MakeRgn
+ *  maps a portion of a file
+ *
+ *  "f" [ IN ] - file to map
+ *  a new reference will be attached
+ *
+ *  "pos" [ IN ] - starting offset into file
+ *
+ *  "size" [ IN, DEFAULT ZERO ] - size of resulting region. if 0,
+ *  the size will be interpreted as meaning size of "f" - "pos".
+ */
+static
+rc_t KMMapMakeRgn ( KMMap **mmp, const KFile *f )
+{
+    KMMap *mm;
+    rc_t rc = KMMapMake ( & mm );
+    if ( rc == 0 )
+    {
+        rc = KFileAddRef ( f );
+        if ( rc == 0 )
+        {
+            mm -> f = ( KFile* ) f;
+            mm -> off = mm -> pos = 0;
+            mm -> size = 0;
+            mm -> addr = NULL;
+            mm -> addr_adj = mm -> size_adj = 0;
+            KRefcountInit ( & mm -> refcount, 1, "KMMap", "make", "mmap" );
+            mm -> sys_mmap = false;
+            mm -> read_only = false;
+            mm -> dirty = false;
+    
+            * mmp = mm;
+            return 0;
+        }
+
+        KMMapWhack ( mm );
+    }
+
+    * mmp = NULL;
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMMapMakeRgnRead ( const KMMap **mmp,
+    const KFile *f, uint64_t pos, size_t size )
+{
+    rc_t rc;
+    if ( mmp == NULL )
+        rc = RC ( rcFS, rcMemMap, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( f == NULL )
+            rc = RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcNull );
+        else if ( ! f -> read_enabled )
+            rc = RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcNoPerm );
+        else
+        {
+            KMMap *mm;
+            rc = KMMapMakeRgn ( & mm, f );
+            if ( rc == 0 )
+            {
+                rc = KMMapRORgn ( mm, pos, size );
+                if ( rc == 0 )
+                {
+                    * mmp = mm;
+                    return 0;
+                }
+
+                KMMapWhack ( mm );
+            }
+        }
+
+        * mmp = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KMMapMakeRgnUpdate ( KMMap **mmp,
+    KFile *f, uint64_t pos, size_t size )
+{
+    rc_t rc;
+    if ( mmp == NULL )
+        rc = RC ( rcFS, rcMemMap, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( f == NULL )
+            rc = RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcNull );
+        else if ( ! f -> read_enabled || ! f -> write_enabled )
+            rc = RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcNoPerm );
+        else
+        {
+            KMMap *mm;
+            rc = KMMapMakeRgn ( & mm, f );
+            if ( rc == 0 )
+            {
+                rc = KMMapRWRgn ( mm, pos, size );
+                if ( rc == 0 )
+                {
+                    * mmp = mm;
+                    return 0;
+                }
+
+                KMMapWhack ( mm );
+            }
+        }
+
+        * mmp = NULL;
+    }
+    return rc;
+}
+
+/* Make
+ *  maps entire file
+ *
+ *  "f" [ IN ] - file to map.
+ *  a new reference will be attached
+ */
+LIB_EXPORT rc_t CC KMMapMakeRead ( const KMMap **mm, const KFile *f )
+{
+    return KMMapMakeRgnRead ( mm, f, 0, 0 );
+}
+
+LIB_EXPORT rc_t CC KMMapMakeUpdate ( KMMap **mm, KFile *f )
+{
+    return KMMapMakeRgnUpdate ( mm, f, 0, 0 );
+}
+
+
+/* MakeMax
+ *  maps as much of a file as possible
+ *
+ *  "f" [ IN ] - file to map.
+ *  a new reference will be added
+ */
+LIB_EXPORT rc_t CC KMMapMakeMaxRead ( const KMMap **mm, const KFile *f )
+{
+    /* 32-bit architecture */
+    if ( sizeof mm == 4 )
+        return KMMapMakeRgnRead ( mm, f, 0, 1500 * 1024 * 1024 );
+
+    /* 64-bit or beyond */
+    return KMMapMakeRgnRead ( mm, f, 0,  ( ( size_t ) 48 ) * 1024 * 1024 * 1024 );
+}
+
+LIB_EXPORT rc_t CC KMMapMakeMaxUpdate ( KMMap **mm, KFile *f )
+{
+    uint64_t eof;
+    rc_t rc = KFileSize ( f, & eof );
+    if ( rc == 0 )
+    {
+        /* 32-bit architecture */
+        if ( sizeof mm == 4 && eof > 1500 * 1024 * 1024 )
+            eof = 1500 * 1024 * 1024;
+
+        /* 64-bit or beyond */
+        if ( sizeof mm == 8 && eof > ( ( size_t ) 48 ) * 1024 * 1024 * 1024 )
+            eof = ( ( size_t ) 48 ) * 1024 * 1024 * 1024;
+
+        rc = KMMapMakeRgnUpdate ( mm, f, 0, ( size_t ) eof );
+    }
+    return rc;
+}
+
+
+/* Reposition
+ *  shift region to a new position
+ *  may change region size
+ *
+ *  "pos" [ IN ] - new starting position for region
+ *
+ *  "size" [ OUT, NULL OKAY ] - optional return parameter
+ *  for resultant region size
+ */
+LIB_EXPORT rc_t CC KMMapReposition ( const KMMap *cself, uint64_t pos, size_t *size )
+{
+    KMMap *self;
+    size_t ignore;
+    if ( size == NULL )
+        size = & ignore;
+
+    * size = 0;
+
+    self = ( KMMap* ) cself;
+    if ( cself != NULL )
+    {
+        rc_t rc;
+        size_t rgn_size = self -> size;
+        uint64_t pg_mask, left, right;
+
+        /* regardless of condition, if no change
+           in position is requested, we're done */
+        if ( pos == self -> pos )
+        {
+            * size = rgn_size;
+            return 0;
+        }
+
+        /* detect multiple owners */
+        if ( atomic32_read ( & self -> refcount ) > 1 )
+            return RC ( rcFS, rcMemMap, rcPositioning, rcMemMap, rcBusy );
+
+        pg_mask = self -> pg_size - 1;
+        left = self -> pos & ~ pg_mask;
+        right = left + rgn_size + self -> size_adj;
+
+        /* we're modifiable, so see if position
+           is within first page of current map */
+        if ( ( pos & ~ pg_mask ) == left )
+        {
+            self -> addr -= self -> addr_adj;
+            self -> addr_adj = self -> size_adj = ( uint32_t ) ( pos - left );
+            self -> addr += pos - left;
+            self -> pos = pos;
+            * size = self -> size = ( size_t ) ( right - pos );
+            return 0;
+        }
+
+        if ( rgn_size != 0 || self -> size_adj != 0 )
+        {
+            rc = KMMapUnmapRgn ( self );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        self -> addr_adj = self -> size_adj = 0;
+
+        rc = ( self -> read_only ? KMMapRORgn : KMMapRWRgn ) ( self, pos, rgn_size );
+
+        if ( rc == 0 )
+            * size = self -> size;
+        return rc;
+    }
+
+    return RC ( rcFS, rcMemMap, rcPositioning, rcSelf, rcNull );
+}
diff --git a/libs/kfs/nullfile.c b/libs/kfs/nullfile.c
new file mode 100644
index 0000000..22eab36
--- /dev/null
+++ b/libs/kfs/nullfile.c
@@ -0,0 +1,273 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <sysalloc.h>
+#include <kfs/nullfile.h>
+
+#include <assert.h>
+#include <stdlib.h>
+
+/* ======================================================================
+ * KNullFile
+ */
+
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+#define KFILE_IMPL struct KNullFile
+#include <kfs/impl.h>
+
+static rc_t CC KNullFileDestroy (KNullFile *self);
+static struct KSysFile *CC KNullFileGetSysFile (const KNullFile *self,
+					     uint64_t *offset);
+static rc_t CC KNullFileRandomAccess (const KNullFile *self);
+static uint32_t CC KNullFileType (const KNullFile *self);
+static rc_t CC KNullFileSize (const KNullFile *self, uint64_t *size);
+static rc_t CC KNullFileSetSize (KNullFile *self, uint64_t size);
+static rc_t CC KNullFileRead (const KNullFile *self, uint64_t pos,
+			   void *buffer, size_t bsize, size_t *num_read);
+static rc_t CC KNullFileWrite (KNullFile *self, uint64_t pos, const void *buffer,
+			    size_t size, size_t *num_writ);
+
+
+static const KFile_vt_v1 vtKNullFile =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KNullFileDestroy,
+    KNullFileGetSysFile,
+    KNullFileRandomAccess,
+    KNullFileSize,
+    KNullFileSetSize,
+    KNullFileRead,
+    KNullFileWrite,
+
+    /* 1.1 */
+    KNullFileType
+};
+
+/*-----------------------------------------------------------------------
+ * KNullFile
+ *  an archive file including tar and sra
+ */
+struct KNullFile
+{
+    KFile	dad;
+};
+
+/* ----------------------------------------------------------------------
+ * KNullFileMake
+ *  create a new file object
+ */
+static
+rc_t KNullFileMake (KNullFile ** self, bool write_allowed)
+{
+    rc_t	rc;
+    KNullFile *	pF;
+
+    /* -----
+     */
+    assert (self != NULL);
+
+    /* -----
+     * get space for the object
+     */
+    pF = malloc (sizeof (KNullFile));
+    if (pF == NULL)	/* allocation failed */
+    {
+	/* fail */
+	rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+    }
+    else
+    {
+	rc = KFileInit (&pF->dad,			/* initialize base class */
+			(const KFile_vt*)&vtKNullFile, 	/* VTable for KNullFile */
+            "KNullFile", "no-name",
+			true,				/* read allowed */
+			write_allowed);
+	if (rc == 0)
+	{
+	    *self = pF;
+	    return 0;
+	}
+	/* fail */
+	free (pF);
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KFileMakeNullRead ( const KFile ** self )
+{
+    return KNullFileMake ((KNullFile **)self, false);
+}
+
+LIB_EXPORT rc_t CC KFileMakeNullUpdate ( KFile ** self )
+{
+    return KNullFileMake ((KNullFile **)self, true);
+}
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *
+ */
+static
+rc_t CC KNullFileDestroy (KNullFile *self)
+{
+    free (self);
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ *
+ * We cant allow memory mapping a tee file as the read?writes ar needed
+ * to trigger the writes to the copy KFile
+ */
+
+static
+struct KSysFile *CC KNullFileGetSysFile (const KNullFile *self, uint64_t *offset)
+{
+    /* parameters must be non-NULL */
+    assert (self != NULL);
+    assert (offset != NULL);
+
+    /* not implmenting at this time */
+    return NULL;
+}
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ *  returns 0 if random access, error code otherwise
+ *
+ * Update needs to be able to seek both original and copy while read
+ * only needs to be able to seek the original.
+ */
+static
+rc_t CC KNullFileRandomAccess (const KNullFile *self)
+{
+    assert (self != NULL);
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KNullFileType (const KNullFile *self)
+{
+    return kfdNull;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KNullFileSize (const KNullFile *self, uint64_t *size)
+{
+    assert (self != NULL);
+    assert (size != NULL);
+
+    *size = 0;
+    return 0;;
+}
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KNullFileSetSize (KNullFile *self, uint64_t size)
+{
+    return RC (rcFS, rcFile, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t CC KNullFileRead	(const KNullFile *self,
+			 uint64_t pos,
+			 void *buffer,
+			 size_t bsize,
+			 size_t *num_read)
+{
+    *num_read = 0;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ * Unsupported as we now treat archives as READ ONLY
+ */
+static
+rc_t CC KNullFileWrite (KNullFile *self, uint64_t pos,
+		       const void *buffer, size_t bsize,
+		       size_t *num_writ)
+{
+    *num_writ = bsize;
+    return 0;
+}
+
+/* end of file nullfile.c */
+
diff --git a/libs/kfs/pagefile.c b/libs/kfs/pagefile.c
new file mode 100644
index 0000000..0516215
--- /dev/null
+++ b/libs/kfs/pagefile.c
@@ -0,0 +1,1388 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+#include <kfs/pagefile.h>
+#include <kfs/impl.h>
+#include <klib/container.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+#include <atomic.h>
+#include <sysalloc.h>
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#define REQUIRE_RANDOM_ACCESS 0
+
+#ifdef _DEBUGGING
+#define PAGE_DEBUG(msg) DBGMSG(DBG_KFS,DBG_FLAG(DBG_KFS_PAGE),msg)
+#else
+#define PAGE_DEBUG(msg)
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KPageMem
+ *  the raw page memory
+ */
+
+/* must be kept in sync with kdb/btree.c */
+#define PGBITS 15
+#define PGSIZE ( 1U << PGBITS )
+
+static
+rc_t KPageMemNew ( void **ppage )
+{
+    void *page = calloc ( PGSIZE, 1 );
+    if ( page == NULL )
+        return RC ( rcFS, rcBlob, rcAllocating, rcMemory, rcExhausted );
+
+    * ppage = page;
+    return 0;
+}
+
+static
+rc_t KPageMemMake ( void **ppage )
+{
+    void *page = malloc ( PGSIZE );
+    if ( page == NULL )
+        return RC ( rcFS, rcBlob, rcAllocating, rcMemory, rcExhausted );
+
+    * ppage = page;
+    return 0;
+}
+
+static
+void KPageMemWhack ( void *page )
+{
+    free ( page );
+}
+
+
+/*--------------------------------------------------------------------------
+ * KPageBacking
+ *  a reference KFile wrapper
+ */
+typedef struct KPageBacking KPageBacking;
+struct KPageBacking
+{
+    uint64_t eof;
+    KFile *backing;
+    KRefcount refcount;
+    bool write_through;
+    bool have_eof;
+};
+
+/* Whack
+ */
+static
+void KPageBackingWhack ( KPageBacking *self )
+{
+    if(self -> backing) KFileRelease ( self -> backing );
+    free ( self );
+}
+
+/* Attach
+ */
+static
+KPageBacking *KPageBackingAttach ( const KPageBacking *self )
+{
+    if ( self != NULL ) switch ( KRefcountAddDep ( & self -> refcount, "KPageBacking" ) )
+    {
+    case krefOkay:
+        return ( KPageBacking* ) self;
+    }
+
+    return NULL;
+}
+
+/* Sever
+ */
+static
+void KPageBackingSever ( const KPageBacking *self )
+{
+    if ( self != NULL ) switch ( KRefcountDropDep ( & self -> refcount, "KPageBacking" ) )
+    {
+    case krefWhack:
+        KPageBackingWhack ( ( KPageBacking* ) self );
+        break;
+    }
+}
+
+/* Release
+ */
+static
+void KPageBackingRelease ( const KPageBacking *self )
+{
+    if ( self != NULL ) switch ( KRefcountDrop ( & self -> refcount, "KPageBacking" ) )
+    {
+    case krefWhack:
+        KPageBackingWhack ( ( KPageBacking* ) self );
+        break;
+    }
+}
+
+/* Drop
+ *  drop backing file
+ */
+static
+rc_t KPageBackingDrop ( KPageBacking *self )
+{
+    KFile *backing;
+
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcDetaching, rcSelf, rcNull );
+
+    backing = self -> backing;
+    if ( backing != NULL && atomic_test_and_set_ptr ( ( atomic_ptr_t* ) & self -> backing, NULL, backing ) == backing )
+        KFileRelease ( backing );
+
+    self -> write_through = false;
+
+    return 0;
+}
+
+/* SetSize
+ *  sets size of backing store
+ */
+#define BACKING_FILE_GROWTH 1024 /** number of pages to grow at a time**/
+#define BACKING_FILE_MASK ( BACKING_FILE_GROWTH - 1 )
+static
+rc_t KPageBackingSetSize ( KPageBacking *self, uint32_t pg_count )
+{
+    uint64_t new_eof;
+
+    if ( pg_count > BACKING_FILE_GROWTH )
+		pg_count = ( pg_count + BACKING_FILE_MASK ) & ~ BACKING_FILE_MASK;
+
+    new_eof =  ( uint64_t ) pg_count << PGBITS;
+    if ( new_eof == self -> eof )
+        return 0;
+
+    self -> eof = new_eof;
+    return KFileSetSize ( self -> backing, self -> eof );
+}
+
+/* Read
+ *  read a page from backing
+ */
+#if 0
+static
+rc_t KFileReadAll ( const KFile *self, uint64_t pos, uint8_t *buff, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+    size_t total, partial;
+
+    for ( rc = 0, total = 0; total < bsize; total += partial )
+    {
+        rc = KFileRead ( self, pos + total, & buff [ total ], bsize - total, & partial );
+        if ( rc != 0 )
+            break;
+        if ( partial == 0 )
+            break;
+    }
+
+    if ( total != 0 )
+    {
+        * num_read = total;
+        return 0;
+    }
+
+    * num_read = 0;
+    return rc;
+}
+#endif
+
+static
+rc_t KPageBackingRead ( const KPageBacking *self, void **ppage, uint32_t pg_id )
+{
+    rc_t rc;
+    uint64_t pos;
+
+    /* can't read if backing isn't there */
+    if ( self -> backing == NULL )
+    {
+        * ppage = NULL;
+        return RC ( rcFS, rcFile, rcReading, rcBlob, rcNotFound );
+    }
+
+    /* the offset to the first byte after requested page */
+    pos = ( uint64_t ) pg_id << PGBITS;
+
+    /* allocate a page */
+    rc = KPageMemMake ( ppage );
+    if ( rc == 0 )
+    {
+        /* retrieve memory */
+        void *page = * ppage;
+
+        /* read page from file */
+        size_t num_read;
+        rc = KFileReadAll ( self -> backing, pos -= PGSIZE, page, PGSIZE, & num_read );
+        if ( rc == 0 )
+        {
+            if ( num_read != 0 )
+            {
+                /* keep track of eof */
+                pos += num_read;
+                if ( self -> eof < pos )
+                    ( ( KPageBacking* ) self ) -> eof = pos;
+
+                /* detect a partial page */
+                if ( num_read < PGSIZE )
+                    memset ( & ( ( uint8_t* ) page ) [ num_read ], 0, PGSIZE - num_read );
+
+                /* return page */
+                * ppage = page;
+                return 0;
+            }
+
+            rc = RC ( rcFS, rcFile, rcReading, rcBlob, rcNotFound );
+        }
+
+        KPageMemWhack ( page );
+    }
+
+    * ppage = NULL;
+    return rc;
+}
+
+
+/* Write
+ *  write a page to backing store
+ */
+#if 0
+static
+rc_t KFileWriteAll ( KFile *self, uint64_t pos, const uint8_t *buff, size_t size, size_t *num_writ )
+{
+    rc_t rc;
+    size_t total, partial;
+
+    for ( rc = 0, total = 0; total < size; total += partial )
+    {
+        rc = KFileWrite ( self, pos + total, & buff [ total ], size - total, & partial );
+        if ( rc != 0 )
+            break;
+        if ( partial == 0 )
+        {
+            rc = RC ( rcFS, rcBlob, rcWriting, rcTransfer, rcIncomplete );
+            break;
+        }
+    }
+
+    if ( total != 0 )
+    {
+        * num_writ = total;
+        return 0;
+    }
+
+    * num_writ = 0;
+    return rc;
+}
+#endif
+
+static
+rc_t KPageBackingWrite ( KPageBacking *self, const void *page, uint32_t pg_id )
+{
+    rc_t rc;
+    uint64_t pos;
+    size_t num_writ;
+
+    /* allow backing to be removed */
+    if ( self -> backing == NULL )
+    {
+        self -> write_through = false;
+        return 0;
+    }
+
+    /* the offset to the first byte after requested page */
+    pos = ( uint64_t ) pg_id << PGBITS;
+
+    /* write the page */
+    rc = KFileWriteAll ( self -> backing, pos -= PGSIZE, page, PGSIZE, & num_writ );
+    if ( rc == 0 )
+    {
+        pos += num_writ;
+        if ( self -> eof < pos )
+            self -> eof = pos;
+
+        if ( num_writ == PGSIZE )
+            return 0;
+
+        /* technically it is permissible for the file to deny us a complete page
+           but for this test, the file should accept whole pages.
+        */
+        rc = RC ( rcFS, rcBlob, rcWriting, rcTransfer, rcIncomplete );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KPage
+ *  a reference counted page
+ *  meant to be held within a BSTree and DLList
+ */
+struct KPage
+{
+    /* head for LRU cache */
+    DLNode ln;
+
+    /* backing file */
+    KPageBacking *backing;
+
+    /* raw memory */
+    void *page;
+
+    KRefcount refcount;
+
+    uint32_t page_id;
+    bool read_only;
+    bool dirty;
+};
+
+
+
+/* Whack
+ */
+static
+rc_t KPageWhack ( KPage *self )
+{
+    if ( self -> backing )
+    {
+        if ( self -> dirty )
+            KPageBackingWrite ( self -> backing, self -> page, self -> page_id );
+        KPageBackingSever ( self -> backing );
+    }
+    KPageMemWhack ( self -> page );
+    free ( self );
+    return 0;
+}
+
+
+/* New
+ *  make a new page
+ */
+static
+rc_t KPageNew ( KPage **ppage, KPageBacking * backing, uint32_t page_id )
+{
+    rc_t rc;
+    KPage *page = malloc ( sizeof * page );
+    if ( page == NULL )
+        rc = RC ( rcFS, rcBlob, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KPageMemNew ( & page -> page );
+        if ( rc == 0 )
+        {
+            if ( backing != NULL )
+                page -> backing = KPageBackingAttach ( backing );
+            else
+                page -> backing = NULL;
+            KRefcountInit ( & page -> refcount, 1, "KPage", "new", "page" );
+            page -> page_id = page_id;
+            page -> read_only = false;
+            page -> dirty = false;
+
+            * ppage = page;
+            return 0;
+        }
+
+        free ( page );
+    }
+
+    * ppage = NULL;
+    return rc;
+}
+
+
+/* Make
+ *  make a page from backing
+ */
+static
+rc_t KPageMake ( KPage **ppage, KPageBacking *backing, uint32_t page_id )
+{
+    rc_t rc;
+    KPage *page = malloc ( sizeof * page );
+    if ( page == NULL )
+        rc = RC ( rcFS, rcBlob, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KPageBackingRead ( backing, & page -> page, page_id );
+        if ( rc == 0 )
+        {
+            page -> backing = KPageBackingAttach ( backing );
+            KRefcountInit ( & page -> refcount, 1, "KPage", "make", "page" );
+            page -> page_id = page_id;
+            page -> read_only = false;
+            page -> dirty = false;
+
+            * ppage = page;
+            return 0;
+        }
+
+        free ( page );
+    }
+
+    * ppage = NULL;
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KPageAddRef ( const KPage *self )
+{
+    if ( self != NULL ) switch ( KRefcountAdd ( & self -> refcount, "KPage" ) )
+    {
+    case krefOkay:
+        break;
+    default:
+        return RC ( rcFS, rcBlob, rcAttaching, rcConstraint, rcViolated );
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KPageRelease ( const KPage *self )
+{
+    if ( self != NULL ) switch ( KRefcountDrop ( & self -> refcount, "KPage" ) )
+    {
+    case krefOkay:
+        if ( self -> dirty && self -> backing && self -> backing -> write_through )
+        {
+            rc_t rc = KPageBackingWrite ( self -> backing, self -> page, self -> page_id );
+            if ( rc != 0 )
+                return rc;
+
+            ( ( KPage* ) self ) -> dirty = false;
+        }
+        break;
+    case krefWhack:
+        return KPageWhack ( ( KPage* ) self );
+    default:
+        return RC ( rcFS, rcBlob, rcReleasing, rcConstraint, rcViolated );
+    }
+
+    return 0;
+}
+
+
+/* Attach
+ * Sever
+ *  ignores NULL references
+ */
+static
+void KPageAttach ( const KPage *self )
+{
+    if ( self != NULL )
+        KRefcountAddDep ( & self -> refcount, "KPage" );
+}
+
+static
+rc_t KPageSever ( const KPage *self )
+{
+    if ( self != NULL ) switch ( KRefcountDropDep ( & self -> refcount, "KPage" ) )
+    {
+    case krefOkay:
+        break;
+    case krefWhack:
+        return KPageWhack ( ( KPage* ) self );
+    default:
+        return RC ( rcFS, rcBlob, rcReleasing, rcConstraint, rcViolated );
+    }
+
+    return 0;
+}
+
+
+
+/* Id
+ *  returns page id
+ *
+ *  "page_id" [ OUT ] - return parameter for page id
+ */
+LIB_EXPORT rc_t CC KPageId ( const KPage *self, uint32_t *page_id )
+{
+    rc_t rc;
+
+    if ( page_id == NULL )
+        rc = RC ( rcFS, rcBlob, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcBlob, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * page_id = self -> page_id;
+            return 0;
+        }
+
+        * page_id = 0;
+    }
+
+    return rc;
+}
+
+
+/* ConstSize
+ *  returns constant page size
+ */
+LIB_EXPORT size_t CC KPageConstSize ( void )
+{
+    return PGSIZE;
+}
+
+
+/* AccessRead
+ * AccessUpdate
+ *  gain access to page memory
+ *  update access marks page as modified
+ */
+LIB_EXPORT rc_t CC KPageAccessRead ( const KPage *self, const void **mem, size_t *bytes )
+{
+    rc_t rc;
+
+    size_t dummy;
+    if ( bytes == NULL )
+        bytes = & dummy;
+
+    if ( mem == NULL )
+        rc = RC ( rcFS, rcBlob, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcBlob, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            assert ( self -> page != NULL );
+            * mem = self -> page;
+            * bytes = PGSIZE;
+            return 0;
+        }
+
+        * mem = NULL;
+    }
+
+    * bytes = 0;
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KPageAccessUpdate ( KPage *self, void **mem, size_t *bytes )
+{
+    rc_t rc;
+
+    size_t dummy;
+    if ( bytes == NULL )
+        bytes = & dummy;
+
+    if ( mem == NULL )
+        rc = RC ( rcFS, rcBlob, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcBlob, rcAccessing, rcSelf, rcNull );
+        else if ( self -> read_only )
+            rc = RC ( rcFS, rcBlob, rcAccessing, rcBlob, rcReadonly );
+        else
+        {
+            assert ( self -> page != NULL );
+            self -> dirty = true;
+            * mem = self -> page;
+            * bytes = PGSIZE;
+            return 0;
+        }
+
+        * mem = NULL;
+    }
+
+    * bytes = 0;
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KPageFile
+ *  presents some level of page management on top of a random-access KFile
+ */
+struct KPageFile
+{
+    void   **page_idx;
+    uint8_t  page_idx_depth;
+    DLList by_access;
+    KPageBacking *backing;
+    KRefcount refcount;
+    uint32_t count;
+    uint32_t ccount;
+    uint32_t climit;
+    bool read_only;
+};
+
+
+static
+void * KPageFile_whack_recursive( void **idx, uint8_t depth, uint32_t count,
+                                  DLList * mru, uint32_t * ccount )
+{
+	if ( idx != NULL )
+    {
+		if ( depth == 0 )
+        {
+			rc_t rc;
+			KPage * page = ( KPage* )idx;
+			DLListUnlink( mru, &page->ln );
+			rc=KPageSever( page );
+			if ( ccount != NULL )
+                ccount[ 0 ]--;
+			assert( rc == 0 );
+		}
+        else
+        {
+			int i;
+			uint8_t offset;
+
+			depth--;
+			offset = ( count >> ( 8 * depth ) ) & 0xff;
+			idx[ offset ] = KPageFile_whack_recursive( (void**)idx[ offset ], depth, count, mru, ccount );
+			for ( i = ( int )offset + 1; i < 256; i++ )
+            {
+				if ( idx[ i ] != NULL )
+                {
+					idx[ i ] = KPageFile_whack_recursive( (void**)idx[ i ], depth, 0, mru, ccount );
+				}
+			}	
+
+			if ( depth == 0 )
+            {
+				if ( offset == 0 )
+                {
+					free( idx );
+					return NULL;
+				}
+                else
+                {
+					return idx;
+				}
+			}
+            else if ( offset == 0 || ( offset == 1 && idx[ 1 ] == NULL ) )
+            {
+				void *tmp = idx[ 0 ];
+				free( idx );
+				return tmp;
+			}
+            else
+            {
+				return idx;
+			}
+		}
+	}
+	return NULL;
+}
+
+#define PAGE_IDX_DEPTH(A) ((A)>(1<<24)?4:((A)>(1<<16)?3:((A)>256?2:((A)>0?1:0))))
+
+static
+rc_t KPageFileSetPageCount( KPageFile * self, uint32_t count )
+{
+	void **tmp;	
+	uint8_t new_depth = PAGE_IDX_DEPTH( count );
+
+    /******* Adjust depth and change structure of the index if needed ****/
+	if ( new_depth > self->page_idx_depth )
+    {
+		if ( self->page_idx == NULL )
+        {
+			self->page_idx_depth = new_depth;
+		}
+        else while ( self->page_idx_depth < new_depth )
+        {
+			tmp = malloc( 256 * sizeof( *tmp ) );
+			memset( tmp, 0, 256 * sizeof( *tmp ) );
+			tmp[ 0 ] = self->page_idx;
+			self->page_idx = tmp;
+			self->page_idx_depth++;
+		}
+	}
+
+	if ( count < self->count )
+    {
+		self->page_idx = KPageFile_whack_recursive( self->page_idx, self->page_idx_depth,
+                                                    count, &self->by_access, &self->ccount );
+		self->page_idx_depth = new_depth;
+	}
+	self->count=count;
+	if ( self -> read_only )
+        return 0;
+
+	if ( self -> backing )
+        return KPageBackingSetSize ( self -> backing, count );
+	else if ( self->count > self->climit )
+    {
+        return RC ( rcFS, rcFile, rcProcessing, rcBuffer, rcExhausted );
+	}
+
+	return 0;
+}
+/* Whack
+ */
+
+static
+rc_t KPageFileWhack ( KPageFile *self )
+{
+    /* first, visit each cached page in flush order */
+    self->page_idx = KPageFile_whack_recursive( self->page_idx, self->page_idx_depth,
+                                                0, &self->by_access, &self->ccount );
+    /* release the backing file */
+    if ( self -> backing )
+        KPageBackingRelease ( self -> backing );
+
+    /* delete the object */
+    free ( self );
+    return 0;
+}
+
+/* Make
+ *  creates a page file
+ *
+ *  "pf" [ OUT ] - return parameter for page file
+ *
+ *  "backing" [ IN ] - backing file
+ *   NB - attaches a new reference to file
+ *        does not take ownership
+ *
+ *  "climit" [ IN ] - cache size limit
+ */
+
+#define MIN_CACHE_PAGE 2
+
+LIB_EXPORT rc_t CC KPageFileMakeRead ( const KPageFile **pf, const KFile * backing, size_t climit )
+{
+    rc_t rc;
+
+    if ( pf == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( backing == NULL )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNull );
+        else if ( ! backing -> read_enabled )
+            rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+        else
+        {
+            KPageBacking *bf = calloc ( 1, sizeof * bf );
+            if ( bf == NULL )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                KPageFile *f = malloc ( sizeof * f );
+                if ( f == NULL )
+                    rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+                else
+                {
+                    rc = KFileAddRef ( backing );
+                    if ( rc == 0 )
+                    {
+                        f->page_idx = NULL;
+                        f->page_idx_depth = 0;
+                        DLListInit ( & f -> by_access );
+                        KRefcountInit ( & f -> refcount, 1, "KPageFile", "make", "pgfile" );
+                        f -> count = 0;
+                        f -> ccount = 0;
+                        f -> climit = ( uint32_t ) ( climit >>  PGBITS );
+                        if ( f -> climit < MIN_CACHE_PAGE )
+                            f -> climit = MIN_CACHE_PAGE;
+
+                        PAGE_DEBUG( ( "PAGE: KPageFileMakeRead {%p} limit = %u\n", f, f->climit ) );
+
+                        f -> read_only = true;
+
+                        /* finish the backing file */
+                        KRefcountInit ( & bf -> refcount, 1, "KPageBacking", "make", "backing" );
+                        f -> backing = bf;
+                        bf -> write_through = false;
+
+                        /* attached reference */
+                        bf -> backing = ( KFile* ) backing;
+
+                        /* if backing is random access, get its size */
+                        rc = KFileSize ( backing, & bf -> eof );
+                        if ( rc == 0 )
+                        {
+                            bf -> have_eof = true;
+                            rc = KPageFileSetPageCount( f, ( uint32_t ) ( ( bf -> eof + PGSIZE - 1 ) >> PGBITS ) );
+                            if ( rc != 0 )
+                                return rc;
+                        }
+                        * pf = f;
+                        return 0;
+                    }
+                    free ( f );
+                }
+                free ( bf );
+            }
+        }
+        * pf = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KPageFileMakeUpdate ( KPageFile **pf, KFile * backing, size_t climit, bool write_through )
+{
+    rc_t rc = 0;
+
+    if ( pf == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( backing != NULL )
+        {
+        	if ( ! backing -> read_enabled )
+            {
+                if ( backing -> write_enabled )
+                    rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcWriteonly );
+                else
+                    rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcNoPerm );
+            }
+            else if ( ! backing -> write_enabled )
+                rc = RC ( rcFS, rcFile, rcConstructing, rcFile, rcReadonly );
+        }
+
+        if ( rc == 0 )
+        {
+            KPageFile *f = malloc ( sizeof * f );
+            if ( f == NULL )
+            {
+                rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            }
+            else 
+            {
+                f->page_idx = NULL;
+                f->page_idx_depth = 0;
+                DLListInit ( & f -> by_access );
+                KRefcountInit ( & f -> refcount, 1, "KPageFile", "make", "pgfile" );
+                f -> count = 0;
+                f -> ccount = 0;
+                f -> climit = ( uint32_t ) ( climit >>  PGBITS );
+                if ( f -> climit < MIN_CACHE_PAGE )
+                    f -> climit = MIN_CACHE_PAGE;
+
+                PAGE_DEBUG( ( "PAGE: KPageFileMakeUpdate {%p} limit = %u\n", f, f->climit ) );
+
+                f -> read_only = false;
+                f -> backing = NULL; /** for now **/
+            }
+
+            if ( rc == 0 && backing )
+            {
+                KPageBacking *bf = calloc ( 1, sizeof * bf );
+                if ( bf == NULL )
+                {
+                    rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+                }
+                else
+                {
+                    rc = KFileAddRef ( backing );
+                    if ( rc == 0 )
+                    {
+                        /* finish the backing file */
+                        KRefcountInit ( & bf -> refcount, 1, "KPageBacking", "make", "backing" );
+                        bf -> write_through = write_through;
+                        /* attached reference */
+                        bf -> backing = backing;
+
+                        /* see if file is random access */
+                        rc = KFileSize ( backing, & bf -> eof );
+                        if ( rc == 0 )
+                        {
+                            bf -> have_eof = true;
+                        }
+                    }
+                }
+
+                if ( rc == 0 )
+                {
+                    f -> backing = bf;
+                    rc = KPageFileSetPageCount( f, ( uint32_t ) ( ( bf -> eof + PGSIZE - 1 ) >> PGBITS ) );
+                }
+                else if ( bf != NULL )
+                {
+                    free ( bf );
+                }
+            }
+
+            if ( rc == 0 )
+            {
+                * pf = f;
+            }
+            else if ( f != NULL )
+            {
+                free( f );
+            }
+        }
+
+        if ( rc != 0 )
+        {
+            *pf = NULL;
+        }
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KPageFileAddRef ( const KPageFile *self )
+{
+    if ( self != NULL ) switch ( KRefcountAdd ( & self -> refcount, "KPageFile" ) )
+    {
+    case krefOkay:
+        break;
+    default:
+        return RC ( rcFS, rcFile, rcAttaching, rcConstraint, rcViolated );
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KPageFileRelease ( const KPageFile *self )
+{
+    if ( self != NULL ) switch ( KRefcountDrop ( & self -> refcount, "KPageFile" ) )
+    {
+    case krefOkay:
+        break;
+    case krefWhack:
+        return KPageFileWhack ( ( KPageFile* ) self );
+    default:
+        return RC ( rcFS, rcFile, rcReleasing, rcConstraint, rcViolated );
+    }
+
+    return 0;
+}
+
+
+/* Size
+ *  returns size in bytes of file and cache
+ *
+ *  "lsize" [ OUT, NULL OKAY ] - return parameter for logical size
+ *
+ *  "fsize" [ OUT, NULL OKAY ] - return parameter for file size
+ *
+ *  "csize" [ OUT, NULL OKAY ] - return parameter for cache size
+ */
+LIB_EXPORT rc_t CC KPageFileSize ( const KPageFile *self,
+    uint64_t *lsize, uint64_t *fsize, size_t *csize )
+{
+    rc_t rc = 0;
+
+    size_t dummysz;
+    uint64_t dummy64;
+
+    if ( lsize == NULL )
+        lsize = & dummy64;
+    if ( fsize == NULL )
+        fsize = & dummy64;
+    if ( csize == NULL )
+        csize = & dummysz;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        if ( self -> backing == NULL || self -> backing -> backing == NULL )
+            * fsize = 0;
+        else if ( ! self -> backing -> have_eof )
+            * fsize = self -> backing -> eof;
+        else
+            rc = KFileSize ( self -> backing -> backing, fsize );
+
+        if ( rc == 0 )
+        {
+            * lsize = ( uint64_t ) self -> count << PGBITS;
+            * csize = ( uint64_t ) self -> ccount << PGBITS;
+            return 0;
+        }
+    }
+
+    * lsize = 0;
+    * fsize = 0;
+    * csize = 0;
+
+    return rc;
+}
+
+/* SetSize
+ *  extends or truncates underlying file
+ *  may affect cache contents
+ *
+ *  "size" [ IN ] - logical size
+ */
+LIB_EXPORT rc_t CC KPageFileSetSize ( KPageFile *self, uint64_t size )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcFile, rcUpdating, rcSelf, rcNull );
+    else
+    {
+        uint32_t new_count = ( uint32_t ) ( ( size + PGSIZE - 1 ) >> PGBITS );
+	rc=KPageFileSetPageCount(self,new_count);
+	if(rc) return rc;
+	assert(self->count == new_count);
+    }
+    return rc;
+}
+
+
+static rc_t KPageFileIndexInsert( KPageFile * self, KPage * page )
+{
+	void    	**tmp;
+	uint8_t		depth;
+	uint32_t	page_id = page->page_id;
+	uint8_t		offset;
+
+	assert( page->page_id > 0 );
+
+	if ( page->page_id > self->count ) /**** This is an autogrowth ***/
+    {
+		rc_t rc= KPageFileSetPageCount( self, page->page_id );
+		if ( rc != 0 )
+            return rc;
+	}
+
+	if ( self->page_idx == NULL )
+    {
+		self->page_idx = malloc( 256 * sizeof( *tmp ) );
+		if( self->page_idx == NULL )
+			return RC( rcFS, rcIndex, rcInserting, rcMemory, rcInsufficient );
+		memset( self->page_idx, 0, 256 * sizeof( void * ) );
+	}
+
+	tmp = self->page_idx;
+	depth = self->page_idx_depth;
+	assert( PAGE_IDX_DEPTH( page_id ) <= depth );
+
+	while ( depth > 1 )
+    {
+		offset = ( ( page_id - 1 ) >> ( depth - 1 ) * 8 ) & 0xff;
+		if ( tmp[ offset ] == NULL )
+        {
+			tmp[ offset ] = malloc( 256 * sizeof( *tmp ) );
+			if ( tmp [ offset ] == NULL )
+				return RC( rcFS, rcIndex, rcInserting, rcMemory, rcInsufficient );
+			memset( tmp[ offset ], 0, 256 * sizeof( void * ) );
+		}
+		assert( tmp[ offset ] );
+		tmp = ( void** )tmp[ offset ];
+		depth--;
+	}
+
+	assert( depth == 1 );
+	offset = ( page_id - 1 ) & 0xff;
+	if ( tmp[ offset ] && tmp[ offset ] != page )
+        return RC( rcFS, rcIndex, rcInserting,rcId,rcDuplicate );
+
+	tmp[ offset ] = page;
+	return 0;
+}
+
+
+static rc_t KPageFileIndexDelete( KPageFile *self, uint32_t page_id )
+{
+	void ** tmp = self->page_idx;
+	uint8_t depth = self->page_idx_depth;
+    uint8_t offset;
+
+	assert( page_id > 0 );
+    assert( PAGE_IDX_DEPTH( page_id ) <= depth );
+
+	while( depth > 1 )
+    {
+        offset = ( ( page_id - 1 ) >> ( depth - 1 ) * 8 ) & 0xff;
+		if( tmp[ offset ] == 0 )
+			return RC( rcFS, rcIndex, rcRemoving,rcId,rcInconsistent );
+
+		assert( tmp[ offset ] );
+		tmp = ( void** )tmp[ offset ];
+		depth--;
+	}
+
+	offset=( page_id - 1 ) & 0xff;
+
+	if ( tmp[ offset ] == 0 )
+		return RC( rcFS, rcIndex, rcRemoving,rcId,rcInconsistent );
+
+	tmp[ offset ] = 0;
+	return 0;
+}
+
+
+static KPage * KPageFileIndexFind( KPageFile *self, uint32_t page_id )
+{
+    void ** tmp = self->page_idx;
+    uint8_t depth = self->page_idx_depth;
+    uint8_t offset;
+
+	assert( page_id > 0 );
+    if ( PAGE_IDX_DEPTH( page_id ) > depth )
+        return NULL;
+
+	if ( tmp == NULL )
+        return NULL;
+
+	while ( depth > 1 )
+    {
+        offset = ( ( page_id - 1 ) >> ( depth - 1 ) * 8 ) & 0xff;
+        if ( tmp[ offset ] == NULL )
+            return NULL;
+
+        assert( tmp[ offset ] );
+        tmp = ( void** )tmp[ offset ];
+        depth--;
+    }
+
+	offset = ( page_id - 1 ) & 0xff;
+	assert( tmp[ offset ] == NULL || ( ( KPage * )tmp[ offset ] )->page_id == page_id );
+	return ( KPage * )tmp[ offset ];
+}
+
+	
+/* CachePage
+ *  insert a page into cache
+ */
+static rc_t KPageFileCachePage ( KPageFile *self, KPage *page )
+{
+    rc_t rc;
+
+    /* perform insert */
+    rc = KPageFileIndexInsert( self, page );
+    if ( rc != 0 )
+        return rc;	
+
+    PAGE_DEBUG( ( "PAGE: {%p}.[%s] insert #%u\n", self, KDbgGetColName(), page->page_id ) );
+
+    DLListPushHead ( & self -> by_access, & page -> ln );
+
+    /* attach reference to page */
+    KPageAttach ( page );
+
+    /* check limit */
+    if ( ++ self -> ccount <= self -> climit )
+        return 0;
+
+    do
+    {
+        DLNode *last = DLListPopTail ( & self -> by_access );
+        KPage *doomed = ( KPage* ) last;
+
+        PAGE_DEBUG( ( "PAGE: {%p}.[%s] delete #%u\n", self, KDbgGetColName(), doomed->page_id ) );
+
+        rc = KPageFileIndexDelete( self, doomed->page_id );
+        if ( rc == 0 )
+            rc = KPageSever ( doomed );
+    }
+    while ( -- self -> ccount > self -> climit && rc == 0 );
+
+    return rc;
+}
+
+
+/* Alloc
+ *  allocates a new page
+ *  the page will be zeroed and initially unmodified
+ *
+ *  "page" [ OUT ] - return parameter for page object
+ *
+ *  "page_id" [ OUT, NULL OKAY ] - optional return parameter for page id
+ */
+LIB_EXPORT rc_t CC KPageFileAlloc ( KPageFile *self, KPage **ppage, uint32_t *page_id )
+{
+    rc_t rc;
+
+    uint32_t dummy;
+    if ( page_id == NULL )
+        page_id = & dummy;
+
+    if ( ppage == NULL )
+        rc = RC ( rcFS, rcFile, rcAllocating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcFile, rcAllocating, rcSelf, rcNull );
+        else if ( self -> read_only )
+            rc = RC ( rcFS, rcBlob, rcAllocating, rcFile, rcReadonly );
+        else
+        {
+            /* create new page */
+            rc = KPageNew ( ppage, self -> backing, self -> count + 1 );
+            if ( rc == 0 )
+            {
+                /* insert into cache */
+                rc = KPageFileCachePage ( self, * ppage );
+                if ( rc == 0 )
+                {
+                    * page_id = self -> count;
+                    return 0;
+                }
+
+                KPageRelease ( * ppage );
+            }
+        }
+
+        * ppage = NULL;
+    }
+
+    * page_id = 0;
+
+    return rc;
+}
+
+
+/* Get
+ *  returns an existing page
+ *
+ *  "page" [ OUT ] - return parameter for page object
+ *
+ *  "page_id" [ IN ] - id of page to retrieve
+ */
+LIB_EXPORT rc_t CC KPageFileGet ( KPageFile *self, KPage **ppage, uint32_t page_id )
+{
+    rc_t rc;
+
+    if ( ppage == NULL )
+        rc = RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcFile, rcReading, rcSelf, rcNull );
+        else if ( page_id == 0 )
+            rc = RC ( rcFS, rcFile, rcReading, rcId, rcNull );
+        else
+        {
+            KPage *page = KPageFileIndexFind( self, page_id ); /** try to see if MRU pages work **/
+            if ( page != NULL )
+            {
+                rc = KPageAddRef ( * ppage = page );
+                if ( rc == 0 )
+                {
+                    PAGE_DEBUG( ( "PAGE: {%p}.[%s] found #%u\n", self, KDbgGetColName(), page_id ) );
+
+                    /* put page at head of list if not already there */
+                    if ( DLListHead ( & self -> by_access ) != & page -> ln )
+                    {
+                        DLListUnlink ( & self -> by_access, & page -> ln );
+                        DLListPushHead ( & self -> by_access, & page -> ln );
+                    }
+                    return 0;
+                }
+                * ppage = NULL;
+                return rc;
+            }
+
+            rc = KPageMake ( ppage, self -> backing, page_id );
+            if ( rc == 0 )
+            {
+                /* insert into cache */
+                rc = KPageFileCachePage ( self, * ppage );
+                if ( rc == 0 )
+                    return 0;
+
+                KPageRelease ( * ppage );
+            }
+        }
+
+        * ppage = NULL;
+    }
+
+    return rc;
+}
+
+
+/* PosGet
+ *  returns a page corresponding to position
+ *
+ *  "page" [ OUT ] - return parameter for page object
+ *
+ *  "offset" [ IN ] - offset to a byte within file
+ */
+LIB_EXPORT rc_t CC KPageFilePosGet ( KPageFile *self, KPage **page, uint64_t offset )
+{
+    rc_t rc;
+
+    if ( page == NULL )
+        rc = RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcFile, rcReading, rcSelf, rcNull );
+        else
+        {
+            uint32_t aid, count = self -> count;
+            uint32_t zpgid = ( uint32_t ) ( offset >> PGBITS );
+
+            if ( self -> read_only || zpgid < count )
+                return KPageFileGet ( self, page, zpgid + 1 );
+
+            /* potentially extend count so that
+               the oid assigned will be zpgid + 1 */
+            self -> count = zpgid;
+            rc = KPageFileAlloc ( self, page, & aid );
+            if ( rc == 0 )
+            {
+                assert ( zpgid + 1 == aid );
+                return 0;
+            }
+
+            self -> count = count;
+        }
+
+        * page = NULL;
+    }
+
+    return rc;
+}
+
+
+/* DropBacking
+ *  used immediately prior to releasing
+ *  prevents modified pages from being flushed to disk
+ */
+LIB_EXPORT rc_t CC KPageFileDropBacking ( KPageFile *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcFile, rcDetaching, rcSelf, rcNull );
+
+    return self -> backing ? KPageBackingDrop ( self -> backing ) : 0;
+}
diff --git a/libs/kfs/pmem.c b/libs/kfs/pmem.c
new file mode 100644
index 0000000..fe3ff69
--- /dev/null
+++ b/libs/kfs/pmem.c
@@ -0,0 +1,632 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+#include <kfs/file.h>
+#include <kfs/pmem.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#define NUM_HOT_ENTRIES ((1024u * 1024u))
+
+typedef uint64_t BlockID;
+typedef union HotEntry HotEntry;
+typedef uint64_t Offset;
+typedef int64_t Size;
+
+struct HotEntryInUse {
+    int64_t size;  /* > 0 */
+    BlockID id;
+    void *storage;
+};
+
+struct HotEntryFree {
+    int64_t size; /* == 0 */
+    BlockID id;
+    unsigned next;
+};
+
+union HotEntry {
+    struct HotEntryInUse inuse;
+    struct HotEntryFree free;
+};
+
+typedef struct ColdPageLeaf ColdPageLeaf;
+struct ColdPageLeaf {
+    Offset offset;
+    Size size;
+};
+
+typedef union ColdPageNode ColdPageNode;
+union ColdPageNode {
+    ColdPageNode *next;
+    ColdPageLeaf *leaf;
+};
+
+/*--------------------------------------------------------------------------
+ * KMemBank
+ *  Uses a generational allocator.
+ *  A fixed number of blocks are managed by malloc/free.
+ *  Old blocks are written to a file and free'd.
+ *
+ *  The two envisioned usage patterns are:
+ *    1) blocks which are written, read, and freed 'quickly'.
+ *    2) blocks which are written, not used for 'a while', and then accessed all
+ *       at once, in the order they were created.
+ *
+ *  No attempt is made to reclaim or reuse the space in the file.
+ */
+struct KMemBank
+{
+    KFile *pf;
+
+    ColdPageNode coldStorage[64u * 1024u];
+
+    KRefcount refcount;
+
+    BlockID next;
+    uint64_t fileNext;
+    unsigned nextFree;
+    HotEntry hot[NUM_HOT_ENTRIES];
+};
+
+static KMemBank *newMemBank(void)
+{
+    KMemBank *self = calloc(1, sizeof(*self));
+
+    if (self) {
+        unsigned i;
+
+        for (i = 0; i < NUM_HOT_ENTRIES; ++i) {
+            self->hot[i].free.size = (int64_t)(-1);
+            self->hot[i].free.id = i + 1;
+            self->hot[i].free.next = i + 1;
+        }
+        self->next = NUM_HOT_ENTRIES;
+
+        KRefcountInit(&self->refcount, 1, "KMemBank", "new", "bank");
+        return self;
+    }
+    return NULL;
+}
+
+static void freeColdStorage(ColdPageNode *const node, int const depth);
+
+/* Whack
+ */
+static
+void KMemBankWhack ( KMemBank *self )
+{
+    freeColdStorage(self->coldStorage, 0);
+    KFileRelease(self->pf);
+    free(self);
+}
+
+/* Make
+ *  make a memory bank
+ *
+ *  "block_size" [ IN ] - ignored
+ *
+ *  "limit" [ IN, DFLT ZERO ] - ignored
+ *
+ *  "backing" [ IN ] - required.
+ */
+LIB_EXPORT rc_t CC KMemBankMake ( KMemBank **bankp,
+    size_t block_size, uint64_t limit, KFile *backing )
+{
+    assert(backing != NULL);
+    assert(bankp != NULL);
+    if (bankp == NULL || backing == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcConstructing, rcParam, rcNull);
+    }
+    else {
+        KMemBank *const self = newMemBank();
+        if (self == NULL) {
+            PLOGMSG(klogFatal, (klogFatal, "OUT OF MEMORY - " __FILE__ ":$(line)", "line=%i", __LINE__));
+            abort(); 
+            return RC(rcFS, rcMemory, rcConstructing, rcMemory, rcExhausted);
+        }
+        if (backing) {
+            self->pf = backing;
+            KFileAddRef(self->pf);
+        }
+        *bankp = self;
+        return 0;
+    }
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KMemBankAddRef(const KMemBank *cself)
+{
+    KMemBank *const self = (KMemBank *)cself;
+    if (self != NULL) {
+        int const rslt = KRefcountAdd(&self->refcount, "KMemBank");
+        assert(rslt == krefOkay);
+        if (rslt != krefOkay) {
+            PLOGMSG(klogFatal, (klogFatal, "LOGIC ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+            abort();
+            return RC(rcFS, rcMemory, rcAttaching, rcConstraint, rcViolated);
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KMemBankRelease(const KMemBank *cself)
+{
+    KMemBank *const self = (KMemBank *)cself;
+    if (self != NULL) {
+        int const rslt = KRefcountDrop(&self->refcount, "KMemBank");
+        switch(rslt) {
+        case krefWhack:
+            KMemBankWhack(self);
+            break;
+        case krefOkay:
+            break;
+        default:
+            PLOGMSG(klogFatal, (klogFatal, "LOGIC ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+            abort();
+            return RC(rcFS, rcMemory, rcAttaching, rcConstraint, rcViolated);
+        }
+    }
+    return 0;
+}
+
+static HotEntry *findBlock(KMemBank const *const self, BlockID const id)
+{
+    unsigned const slot = (id - 1) % NUM_HOT_ENTRIES;
+    HotEntry *const entry = (HotEntry *)&self->hot[slot];
+
+    return entry->inuse.id == id ? entry : NULL;
+}
+
+struct BlockID_ext {
+    int node[3];
+    int leaf;
+};
+
+static struct BlockID_ext extendBlockID(BlockID const id)
+{
+    struct BlockID_ext rslt;
+    rslt.node[0] = ((id - 1) >> 48) & 0xFFFF; /* -> node[65536] */
+    rslt.node[1] = ((id - 1) >> 32) & 0xFFFF; /* -> node[65536] */
+    rslt.node[2] = ((id - 1) >> 16) & 0xFFFF; /* -> leaf[65536] */
+    rslt.leaf    = ((id - 1) >>  0) & 0xFFFF; /* -> leaf      */
+    return rslt;
+}
+
+static void freeColdStorage(ColdPageNode *const node, int const depth)
+{
+    int i;
+    for (i = 0; i < 0x10000; ++i) {
+        if (node[i].next != NULL && depth < 2) {
+            freeColdStorage(node[i].next, depth + 1);
+        }
+        free(node[i].next);
+    }
+}
+
+static ColdPageLeaf *findColdBlock(KMemBank const *const self, BlockID const id)
+{
+    ColdPageNode const *node = self->coldStorage;
+    struct BlockID_ext const ext = extendBlockID(id);
+    int i;
+
+    for (i = 0; i < 2; ++i) {
+        int const j = ext.node[i];
+        if (node[j].next != NULL)
+            node = node[j].next;
+        else
+            return NULL;
+    }
+    {
+        ColdPageLeaf *const leaf = node[ext.node[2]].leaf;
+        return leaf == NULL ? NULL : &leaf[ext.leaf];
+    }
+}
+
+static rc_t transferToColdStorage(KMemBank *const self, BlockID const id, Offset const offset, Size const size)
+{
+    ColdPageNode *node = self->coldStorage;
+    struct BlockID_ext const ext = extendBlockID(id);
+    int i;
+
+    for (i = 0; i < 2; ++i) {
+        int const j = ext.node[i];
+        if (node[j].next != NULL)
+            node = node[j].next;
+        else {
+            node[j].next = calloc(64u * 1024u, sizeof(ColdPageNode));
+            if (node[j].next != NULL)
+                node = node[j].next;
+            else
+                return RC(rcFS, rcMemory, rcAllocating, rcMemory, rcExhausted);
+        }
+    }
+
+    if (node[ext.node[2]].leaf == NULL) {
+        node[ext.node[2]].leaf = calloc(64u * 1024u, sizeof(ColdPageLeaf));
+        if (node[ext.node[2]].leaf == NULL) {
+            return RC(rcFS, rcMemory, rcAllocating, rcMemory, rcExhausted);
+        }
+    }
+    {
+        ColdPageLeaf *const leaf = node[ext.node[2]].leaf;
+        leaf[ext.leaf].offset = offset;
+        leaf[ext.leaf].size = size;
+    }
+    return 0;
+}
+
+static rc_t freeColdBlock(KMemBank *const self, BlockID const id)
+{
+    ColdPageLeaf *const leaf = findColdBlock(self, id);
+
+    if (leaf && leaf->size > 0) {
+        leaf->size = -leaf->size;
+        return 0;
+    }
+    if (leaf == NULL || leaf->size == 0) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - BLOCK WAS NEVER ALLOCATED - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcDestroying, rcId, rcNotFound);
+    }
+    else {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - DOUBLE FREE - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcDestroying, rcId, rcInvalid);
+    }
+}
+
+static rc_t freeBlock(KMemBank *const self, BlockID const id)
+{
+    HotEntry *const entry = findBlock(self, id);
+    if (entry) {
+        struct HotEntryInUse const inuse = entry->inuse;
+        struct HotEntryFree *const pfree = &entry->free;
+
+        if (inuse.size == 0) {
+            PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - DOUBLE FREE - " __FILE__ ":$(line)", "line=%i", __LINE__));
+            abort();
+            return RC(rcFS, rcMemory, rcDestroying, rcId, rcInvalid);
+        }
+        free(inuse.storage);
+        memset(pfree, 0, sizeof(*pfree));
+        pfree->size = (int64_t)(-1);
+        pfree->id = id;
+        pfree->next = self->nextFree;
+        self->nextFree = entry - self->hot;
+        return 0;
+    }
+    else
+        return freeColdBlock(self, id);
+}
+
+static struct HotEntryInUse *newBlock(KMemBank *const self, rc_t *const rc)
+{
+    struct HotEntryInUse *inuse = NULL;
+    
+    if (self->nextFree < NUM_HOT_ENTRIES) {
+        HotEntry *const entry = &self->hot[self->nextFree];
+        struct HotEntryFree const free = entry->free;
+
+        assert(free.size < 0); /* it really is free */
+
+        self->nextFree = free.next;
+        inuse = &entry->inuse;
+        memset(inuse, 0, sizeof(*inuse));
+        inuse->id = free.id;
+    }
+    else {
+        BlockID const id = ++self->next;
+        unsigned const slot = (id - 1) % NUM_HOT_ENTRIES;
+        size_t written = 0;
+
+        inuse = &self->hot[slot].inuse;
+        assert(inuse->size >= 0); /* it really is inuse */
+
+        while (written < inuse->size) {
+            size_t const n = inuse->size - written;
+            size_t w = 0;
+            *rc = KFileWrite(self->pf, self->fileNext + written, ((char const *)inuse->storage) + written, n, &w);
+            if (*rc != 0) return NULL;
+            written += w;
+        }
+
+        *rc = transferToColdStorage(self, inuse->id, self->fileNext, inuse->size);
+        if (*rc != 0) return NULL;
+
+        self->fileNext += inuse->size;
+        free(inuse->storage);
+        memset(inuse, 0, sizeof(*inuse));
+        inuse->id = id;
+    }
+    return inuse;
+}
+
+/* Alloc
+ *  allocate memory
+ *
+ *  "id" [ OUT ] - return parameter for memory allocation id
+ *
+ *  "bytes" [ IN ] - the number of bytes to allocate
+ *
+ *  "clear" [ IN ] - ignored, memory is zero'ed
+ */
+LIB_EXPORT rc_t CC KMemBankAlloc ( KMemBank *self,
+    uint64_t *id, uint64_t bytes, bool clear )
+{
+    rc_t rc = 0;
+    struct HotEntryInUse *new_block = NULL;
+
+    assert(self != NULL);
+    assert(id != NULL);
+    if (self == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcAllocating, rcSelf, rcNull);
+    }
+    if (id == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcAllocating, rcParam, rcNull);
+    }
+    if (bytes > INT64_MAX)
+        return RC(rcFS, rcMemory, rcResizing, rcSize, rcExcessive);
+    if (bytes == 0)
+        return RC(rcFS, rcMemory, rcResizing, rcSize, rcInvalid);
+
+    new_block = newBlock(self, &rc); if (rc) return rc;
+    new_block->storage = calloc(1, bytes);
+    if (new_block->storage == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "OUT OF MEMORY - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcAllocating, rcMemory, rcExhausted);
+    }
+    new_block->size = bytes;
+    *id = new_block->id;
+    return 0;
+}
+
+
+/* Free
+ *  free memory
+ *
+ *  "id" [ IN, ZERO OKAY ] - id of the allocation to be freed
+ */
+LIB_EXPORT rc_t CC KMemBankFree ( KMemBank *self, uint64_t id )
+{
+    if ( id == 0 )
+        return 0;
+
+    assert(self != NULL);
+    if (self == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcAllocating, rcSelf, rcNull);
+    }
+    return freeBlock(self, id);
+}
+
+
+/* Size
+ *  returns the allocated capacity of the memory object
+ *
+ *  "id" [ IN ] - id of the allocation
+ *
+ *  "size" [ OUT ] - return parameter
+ */
+LIB_EXPORT rc_t CC KMemBankSize ( const KMemBank *self, uint64_t id, uint64_t *size )
+{
+    assert(self != NULL);
+    assert(size != NULL);
+    if (self == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcAccessing, rcSelf, rcNull);
+    }
+    if (size == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcAccessing, rcParam, rcNull);
+    }
+    else {
+        HotEntry const *const h = findBlock(self, id);
+        if (h) {
+            *size = h->inuse.size;
+            return 0;
+        }
+        else {
+            ColdPageLeaf const *const l = findColdBlock(self, id);
+            *size = (l && l->size > 0) ? l->size : 0;
+            return 0;
+        }
+    }
+}
+
+
+/* SetSize
+ *  performs a reallocation of memory object
+ *
+ *  "id" [ IN ] - id of the allocation being resized
+ *
+ *  "bytes" [ IN ] - new capacity
+ */
+LIB_EXPORT rc_t CC KMemBankSetSize ( KMemBank *self, uint64_t id, uint64_t bytes )
+{
+    assert(self != NULL);
+    assert(id != 0);
+    if (self == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcResizing, rcSelf, rcNull);
+    }
+    if (id == 0) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcResizing, rcId, rcInvalid);
+    }
+    if (bytes > INT64_MAX)
+        return RC(rcFS, rcMemory, rcResizing, rcSize, rcExcessive);
+    if (bytes == 0)
+        return RC(rcFS, rcMemory, rcResizing, rcSize, rcInvalid);
+    else {
+        HotEntry *const h = findBlock(self, id);
+        if (h && h->inuse.size > 0) {
+            void *const tmp = realloc(h->inuse.storage, bytes);
+            if (tmp) {
+                h->inuse.storage = tmp;
+                h->inuse.size = bytes;
+                return 0;
+            }
+            return RC(rcFS, rcMemory, rcResizing, rcMemory, rcExhausted);
+        }
+        else
+            return RC(rcFS, rcMemory, rcResizing, rcMode, rcUnsupported);
+    }
+}
+
+
+/* Read
+ *  linearly access memory
+ *
+ *  "id" [ IN ] - id of the allocation being read
+ *
+ *  "pos" [ IN ] - starting offset into allocation
+ *
+ *  "buffer" [ IN ] and "bsize" [ IN ] - buffer for returned data
+ *
+ *  "num_read" [ OUT ] - return parameter for the number of bytes read
+ */
+LIB_EXPORT rc_t CC KMemBankRead ( const KMemBank *self, uint64_t id,
+   uint64_t pos, void *buffer, size_t bsize, size_t *num_read )
+{
+    assert(self != NULL);
+    assert(num_read != NULL);
+    assert(id != 0);
+    if (self == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcReading, rcSelf, rcNull);
+    }
+    if (id == 0) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcReading, rcId, rcInvalid);
+    }
+    if (num_read == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcReading, rcParam, rcNull);
+    }
+    else {
+        HotEntry const *const h = findBlock(self, id);
+        if (h) {
+            char const *in = (char *)h->inuse.storage + pos;
+            char const *const endp = (char *)h->inuse.storage + h->inuse.size;
+
+            if (endp > in) {
+                size_t const n = (endp - in) < bsize ? (endp - in) : bsize;
+                memmove(buffer, in, n);
+                *num_read = n;
+            }
+            return 0;
+        }
+        else {
+            ColdPageLeaf const *const l = findColdBlock(self, id);
+
+            if (l == NULL || l->size <= 0)
+                return RC(rcFS, rcMemory, rcReading, rcId, rcNotFound);
+
+            return KFileRead(self->pf, l->offset + pos, buffer, bsize, num_read);
+        }
+    }
+}
+
+
+/* Write
+ *  linearly update memory
+ *  will resize as required
+ *
+ *  "id" [ IN ] - id of the allocation being writ
+ *
+ *  "pos" [ IN ] - starting offset into allocation
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to write
+ *
+ *  "num_writ" [ OUT ] - return parameter for the number of bytes written
+ */
+LIB_EXPORT rc_t CC KMemBankWrite ( KMemBank *self, uint64_t id,
+    uint64_t pos, const void *buffer, size_t size, size_t *num_writ )
+{
+    assert(self != NULL);
+    assert(num_writ != NULL);
+    assert(id != 0);
+    if (self == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcReading, rcSelf, rcNull);
+    }
+    if (id == 0) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcReading, rcId, rcInvalid);
+    }
+    if (num_writ == NULL) {
+        PLOGMSG(klogFatal, (klogFatal, "PROGRAMMER ERROR - " __FILE__ ":$(line)", "line=%i", __LINE__));
+        abort();
+        return RC(rcFS, rcMemory, rcReading, rcParam, rcNull);
+    }
+    else {
+        HotEntry *const h = findBlock(self, id);
+        if (h) {
+            if (pos + size > h->inuse.size) {
+                void *const tmp = realloc(h->inuse.storage, pos + size);
+                if (tmp) {
+                    h->inuse.storage = tmp;
+                    h->inuse.size = pos + size;
+                }
+                else
+                    return RC(rcFS, rcMemory, rcResizing, rcMemory, rcExhausted);
+            }
+            memmove(((char *)h->inuse.storage) + pos, buffer, size);
+            *num_writ = size;
+            return 0;
+        }
+        else
+            return RC(rcFS, rcMemory, rcWriting, rcMode, rcUnsupported);
+    }
+}
diff --git a/libs/kfs/quickmount.c b/libs/kfs/quickmount.c
new file mode 100644
index 0000000..965a516
--- /dev/null
+++ b/libs/kfs/quickmount.c
@@ -0,0 +1,967 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+#include <kfs/quickmount.h>
+#include <kfs/directory.h>
+
+#include <klib/rc.h>
+#include <klib/printf.h>
+
+#include <sysalloc.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+
+/* ----------------------------------------------------------------------
+ * 
+ */
+
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+#define KDIR_IMPL struct KQuickMountDir
+#define KNAMELIST_IMPL   struct KQuickMountListing
+#include <kfs/impl.h>
+
+/* ======================================================================
+ */
+/*--------------------------------------------------------------------------
+ * KQuickMountDir
+ *  a directory inside an archive (tar or SRA for example)
+ *
+ * This type is being engineered to mimic KQuickMountDir.
+ */
+struct KQuickMountDir
+{
+    KDirectory   dad;
+    int          root;
+    const KFile* file;
+    char *       mount;
+    char         path[1];
+    /* actual allocation is based on actual string length */
+};
+
+
+
+/* KQuickMountDirCanonPath
+ */
+static
+rc_t KQuickMountDirCanonPath ( const KQuickMountDir *self, enum RCContext ctx, char *path, size_t psize )
+{
+    char *low, *dst, *last, *end = path + psize;
+    low = dst = last = path + self -> root;
+
+    while ( 1 )
+    {
+        char *src = strchr ( last + 1, '/' );
+        if ( src == NULL )
+            src = end;
+
+        /* detect special sequences */
+        switch ( src - last )
+        {
+        case 2:
+            if ( last [ 1 ] == '.' )
+            {
+                /* skip over */
+                last = src;
+                if ( src != end )
+                    continue;
+            }
+            break;
+
+        case 3:
+            if ( last [ 1 ] == '.' && last [ 2 ] == '.' )
+            {
+                /* remove previous leaf in path */
+                dst [ 0 ] = 0;
+                dst = strrchr ( path, '/' );
+                if ( dst == NULL || dst < low )
+                    return RC ( rcFS, rcDirectory, ctx, rcPath, rcInvalid );
+
+                last = src;
+                if ( src != end )
+                    continue;
+            }
+            break;
+        }
+
+        /* if rewriting, copy leaf */
+        assert ( src >= last );
+
+        if ( dst != last )
+            memmove ( dst, last, src - last );
+
+        /* move destination ahead */
+        dst += src - last;
+        
+        /* if we're done, go */
+        if ( src == end )
+                break;
+
+        /* find next separator */
+        last = src;
+    }
+
+    /* NUL terminate if modified */
+    if ( dst != end )
+        * dst = 0;
+
+    return 0;
+}
+
+/* KQuickMountDirRelativePath
+ *  makes "path" relative to "root"
+ *  both "root" and "path" MUST be absolute
+ *  both "root" and "path" MUST be canonical, i.e. have no "./" or "../" sequences
+ */
+static
+rc_t KQuickMountDirRelativePath (const KQuickMountDir *self, enum RCContext ctx,
+                                 const char *root, char *path, size_t path_max)
+{
+    int backup;
+    size_t bsize, psize;
+
+    const char *r = root + self -> root;
+    const char *p = path + self -> root;
+
+    assert ( r != NULL && r [ 0 ] == '/' );
+    assert ( p != NULL && p [ 0 ] == '/' );
+
+    for ( ; * r == * p; ++ r, ++ p )
+    {
+        /* disallow identical paths */
+        if ( * r == 0 )
+            return RC ( rcFS, rcDirectory, ctx, rcPath, rcInvalid );
+    }
+
+    /* paths are identical up to "r","p"
+       if "r" is within a leaf name, then no backup is needed
+       by counting every '/' from "r" to end, obtain backup count */
+    for ( backup = 0; * r != 0; ++ r )
+    {
+        if ( * r == '/' )
+            ++ backup;
+    }
+
+    /* the number of bytes to be inserted */
+    bsize = backup * 3;
+
+    /* align "p" to last directory separator */
+    while ( p [ -1 ] != '/' ) -- p;
+
+    /* the size of the remaining relative path */
+    psize = strlen ( p );
+
+    /* open up space if needed */
+    if ( (size_t) (p - path) < bsize )
+    {
+        /* prevent overflow */
+        if ( bsize + psize >= path_max )
+            return RC ( rcFS, rcDirectory, ctx, rcPath, rcExcessive );
+        memmove ( path + bsize, p, psize + 1 /* 1 for '\0'*/ );
+    }
+
+    /* insert backup sequences */
+    for ( bsize = 0; backup > 0; bsize += 3, -- backup )
+        memmove ( & path [ bsize ], "../", 3 );
+
+    /* close gap */
+    if ( (size_t) (p - path) > bsize )
+        memmove ( & path [ bsize ], p, strlen ( p ) + 1 );
+
+    return 0;
+}
+
+
+
+static __inline__
+rc_t KQuickMountDirVMakePath (const KQuickMountDir * self, enum RCContext ctx, 
+                              bool canon, char * buffer, size_t path_max,
+                              const char * path, va_list args)
+{
+    size_t psize;
+    size_t bsize;
+    rc_t rc;
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, ctx, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, ctx, rcPath, rcInvalid );
+
+    if ( args != NULL && path [ 0 ] == '%' )
+    {
+        rc = string_vprintf (buffer, path_max, &psize, path, args);
+
+        if (psize > path_max)
+            return RC ( rcFS, rcDirectory, ctx, rcPath, rcExcessive );
+        if (rc)
+            return rc;
+        if ( buffer [ 0 ] != '/' )
+        {
+            bsize = (self->mount - self->path) - 1;
+            if ( bsize + psize >= path_max )
+                return RC ( rcFS, rcDirectory, ctx, rcPath, rcExcessive );
+            memmove ( buffer + bsize, buffer, psize + 1 );
+            assert ( self -> path [ bsize - 1 ] == '/' );
+            memmove ( buffer, self -> path, bsize );
+        }
+        else if ( ( bsize = self -> root ) != 0 )
+        {
+            if ( bsize + psize >= path_max )
+                return RC ( rcFS, rcDirectory, ctx, rcPath, rcExcessive );
+            memmove ( buffer + bsize, buffer, psize + 1 );
+            assert ( self -> path [ bsize - 1 ] != '/' );
+            memmove ( buffer, self -> path, bsize );
+        }
+    }
+    else
+    {
+        if ( path [ 0 ] != '/' )
+        {
+/*             assert ( self -> path [ self -> size - 1 ] == '/' ); */
+            memmove ( buffer, self -> path, bsize = (self->mount - self->path) - 1 );
+        }
+        else if ( ( bsize = self -> root ) != 0 )
+        {
+            assert ( self -> path [ bsize - 1 ] != '/' );
+            memmove ( buffer, self -> path, bsize );
+        }
+
+
+        rc = string_vprintf ( buffer + bsize, path_max - bsize, &psize, path, args );
+        if (bsize + psize >= path_max)
+            return RC ( rcFS, rcDirectory, ctx, rcPath, rcExcessive );
+        if (rc)
+            return rc;
+    }
+
+    if ( buffer [ bsize + psize ] == '/' )
+        buffer [ bsize + -- psize ] = 0;
+
+    if ( psize > 0 && ( canon || self -> root != 0 ) )
+        return KQuickMountDirCanonPath ( self, ctx, buffer, bsize + psize );
+
+    return 0;
+}
+
+
+static __inline__
+rc_t KQuickMountDirMakePath (const KQuickMountDir * self, enum RCContext ctx, 
+                             bool canon, char * buffer, size_t path_max,
+                             const char * path, ...)
+{
+    va_list args;
+    rc_t rc;
+
+    va_start (args, path);
+    rc = KQuickMountDirVMakePath (self, ctx, canon, buffer,
+                                  path_max, path, args);
+    va_end (args);
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirDestroy
+ */
+static rc_t CC KQuickMountDirDestroy (KQuickMountDir *self)
+{
+    rc_t rc;
+
+    rc = KFileRelease (self->file);
+
+    free (self);
+
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirList
+ *  create a directory listing
+ *
+ *  "list" [ OUT ] - return parameter for list object
+ *
+ *  "path" [ IN, NULL OKAY ] - optional parameter for target
+ *  directory. if NULL, interpreted to mean "."
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]	 const KQuickMountDir *	self		Object oriented C; KQuickMountDir object for this method
+ * [OUT] KNamelist **		listp,
+ * [IN]  bool (* 		f	)(const KDirectory*,const char *, void *)
+ * [IN]  void *			data
+ * [IN]  const char *		path
+ * [IN]  va_list		args
+ */
+static
+rc_t CC KQuickMountDirList (const KQuickMountDir *self,
+                       KNamelist **listp,
+                       bool (CC* f) (const KDirectory *dir, const char *name, void *data),
+                       void *data,
+                       const char *path,
+                       va_list args)
+{
+    return RC (rcFS, rcDirectory, rcAccessing, rcFunction, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirVisit
+ *  visit each path under designated directory,
+ *  recursively if so indicated
+ *
+ *  "recurse" [ IN ] - if non-zero, recursively visit sub-directories
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to execute
+ *  on each path. receives a base directory and relative path
+ *  for each entry, where each path is also given the leaf name
+ *  for convenience. if "f" returns non-zero, the iteration will
+ *  terminate and that value will be returned. NB - "dir" will not
+ *  be the same as "self".
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+static 
+rc_t CC KQuickMountDirVisit (const KQuickMountDir *self, 
+                      bool recurse,
+                      rc_t (CC* f) (const KDirectory *, uint32_t, const char *, void *), 
+                      void *data,
+                      const char *path,
+                      va_list args)
+{
+    return RC (rcFS, rcDirectory, rcAccessing, rcFunction, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirVisitUpdate
+ */
+static rc_t CC KQuickMountDirVisitUpdate (KQuickMountDir *self,
+                                   bool recurse,
+                                   rc_t (CC*f) (KDirectory *,uint32_t,const char *,void *),
+                                   void *data,
+                                   const char *path,
+                                   va_list args)
+{
+    return RC (rcFS, rcDirectory, rcUpdating, rcFunction, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirPathType
+ *  returns a KPathType
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ *
+ * [RET] uint32_t
+ * [IN]  const KQuickMountDir *	self		Object oriented C; KQuickMountDir object for this method
+ * [IN]  const char *		path
+ * [IN]  va_list		args
+ */
+static uint32_t CC KQuickMountDirPathType (const KQuickMountDir *self, const char *path, va_list args)
+{
+    char buff [8192];
+    rc_t rc;
+
+    rc = KQuickMountDirVMakePath (self, rcAccessing, true, buff, sizeof buff, path, args);
+    if (rc)
+        return kptBadPath;
+
+    if (strcmp (buff, self->path) == 0)
+        return kptFile;
+
+    return kptNotFound;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirResolvePath
+ *
+ *  resolves path to an absolute or directory-relative path
+ *
+ * [IN]  const KQuickMountDir *self		Objected oriented self
+ * [IN]	 bool 		absolute	if non-zero, always give a path starting
+ *  					with '/'. NB - if the directory is 
+ *					chroot'd, the absolute path
+ *					will still be relative to directory root.
+ * [OUT] char *		resolved	buffer for NUL terminated result path in 
+ *					directory-native character set
+ * [IN]	 size_t		rsize		limiting size of resolved buffer
+ * [IN]  const char *	path		NUL terminated string in directory-native
+ *					character set denoting target path. 
+ *					NB - need not exist.
+ *
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static rc_t CC KQuickMountDirResolvePath (const KQuickMountDir *self,
+                                          bool absolute,
+                                          char *resolved,
+                                          size_t rsize,
+                                          const char *path,
+                                          va_list args)
+{
+    char full [ 8192 ];
+    rc_t rc = KQuickMountDirVMakePath ( self, rcResolving, true, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        size_t path_size = strlen ( full );
+
+        if ( absolute )
+        {
+            /* test buffer capacity */
+            if ( path_size - self -> root >= rsize )
+                return RC ( rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient );
+
+            /* ready to go */
+            strcpy ( resolved, & full [ self -> root ] );
+/*             assert ( resolved [ 0 ] == '/' ); */
+        }
+        else
+        {
+            rc = KQuickMountDirRelativePath ( self, rcResolving, self -> path, full, sizeof full /*path_size*/ );
+            if ( rc == 0 )
+            {
+                path_size = strlen ( full );
+                if ( path_size >= rsize )
+                    return RC ( rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient );
+                strcpy ( resolved, full );
+            }
+        }
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirResolveAlias
+ *  resolves an alias path to its immediate target
+ *  NB - the resolved path may be yet another alias
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting an object presumed to be an alias.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static rc_t CC KQuickMountDirResolveAlias (const KQuickMountDir * self, 
+				 bool absolute,
+				 char * resolved,
+				 size_t rsize,
+				 const char *alias,
+				 va_list args)
+{
+    return RC (rcFS, rcDirectory, rcAccessing, rcFunction, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirRename
+ *  rename an object accessible from directory, replacing
+ *  any existing target object of the same type
+ *
+ *  "from" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ *
+ *  "to" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ */
+static
+rc_t CC KQuickMountDirRename (KQuickMountDir *self, bool force, const char *from, const char *to)
+{
+    assert (self != NULL);
+    assert (from != NULL);
+    assert (to != NULL);
+
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirRemove
+ *  remove an accessible object from its directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "force" [ IN ] - if non-zero and target is a directory,
+ *  remove recursively
+ */
+static
+rc_t CC KQuickMountDirRemove (KQuickMountDir *self, bool force, const char *path, va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirClearDir
+ *  remove all directory contents
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "force" [ IN ] - if non-zero and directory entry is a
+ *  sub-directory, remove recursively
+ */
+static
+rc_t CC KQuickMountDirClearDir (KQuickMountDir *self, bool force, const char *path, va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirAccess
+ *  get access to object
+ *
+ *  "access" [ OUT ] - return parameter for Unix access mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static rc_t CC KQuickMountDirVAccess (const KQuickMountDir *self,
+			    uint32_t *access,
+			    const char *path,
+			    va_list args)
+{
+    return RC (rcFS, rcDirectory, rcAccessing, rcFunction, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirSetAccess
+ *  set access to object a la Unix "chmod"
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "access" [ IN ] and "mask" [ IN ] - definition of change
+ *  where "access" contains new bit values and "mask defines
+ *  which bits should be changed.
+ *
+ *  "recurse" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ */
+static rc_t CC KQuickMountDirSetAccess (KQuickMountDir *self,
+			      bool recurse,
+			      uint32_t access,
+			      uint32_t mask,
+			      const char *path,
+			      va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirCreateAlias
+ *  creates a path alias according to create mode
+ *
+ *  "targ" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target alias
+ *
+ *  "access" [ IN ] - standard Unix directory access mode
+ *  used when "mode" has kcmParents set and alias path does
+ *  not exist.
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC KQuickMountDirCreateAlias (KQuickMountDir *self,
+			 uint32_t access,
+			 KCreateMode mode,
+			 const char *targ,
+			 const char *alias)
+{
+    assert (self != NULL);
+    assert (targ != NULL);
+    assert (alias != NULL);
+
+    return RC (rcFS, rcDirectory, rcCreating, rcSelf, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirOpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC KQuickMountDirOpenFileRead	(const KQuickMountDir *self,
+					 const KFile **f,
+					 const char *path,
+					 va_list args)
+{
+    return RC (rcFS, rcDirectory, rcOpening, rcSelf, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirOpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ */
+static
+rc_t CC KQuickMountDirOpenFileWrite	(KQuickMountDir *self,
+					 KFile **f,
+					 bool update,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (f != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcDirectory, rcCreating, rcSelf, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirCreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC KQuickMountDirCreateFile	(KQuickMountDir *self,
+					 KFile **f,
+					 bool update,
+					 uint32_t access,
+					 KCreateMode cmode,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (f != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcDirectory, rcCreating, rcSelf, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirFileSize
+ *  returns size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC KQuickMountDirFileSize		(const KQuickMountDir *self,
+					 uint64_t *size,
+					 const char *path,
+					 va_list args)
+{
+    return RC (rcFS, rcDirectory, rcCreating, rcSelf, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirSetFileSize
+ *  sets size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KQuickMountDirSetFileSize	(KQuickMountDir *self,
+					 uint64_t size,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcDirectory, rcWriting, rcSelf, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirOpenDirRead
+ *
+ *  opens a sub-directory
+ *
+ * [IN]  const KQuickMountDir *	self	Object Oriented C KQuickMountDir self
+ * [OUT] const KDirectory **	subp	Where to put the new KDirectory/KQuickMountDir
+ * [IN]  bool			chroot	Create a chroot cage for this new subdirectory
+ * [IN]  const char *		path	Path to the directory to open
+ * [IN]  va_list		args	So far the only use of args is possible additions to path
+ */
+static 
+rc_t CC KQuickMountDirOpenDirRead	(const KQuickMountDir *self,
+					 const KDirectory **subp,
+					 bool chroot,
+					 const char *path,
+					 va_list args)
+{
+    return RC (rcFS, rcDirectory, rcOpening, rcSelf, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirOpenDirUpdate
+ *  opens a sub-directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "chroot" [ IN ] - if non-zero, the new directory becomes
+ *  chroot'd and will interpret paths beginning with '/'
+ *  relative to itself.
+ */
+static
+rc_t CC KQuickMountDirOpenDirUpdate	(KQuickMountDir *self,
+					 KDirectory ** subp, 
+					 bool chroot, 
+					 const char *path, 
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (subp != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirCreateDir
+ *  create a sub-directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "access" [ IN ] - standard Unix directory permissions
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC KQuickMountDirCreateDir	(KQuickMountDir *self,
+					 uint32_t access,
+					 KCreateMode mode,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcDirectory, rcCreating, rcSelf, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KQuickMountDirDestroyFile
+ */
+#if 0
+static
+rc_t CC KQuickMountDirDestroyFile	(KQuickMountDir *self,
+					 KFile * f)
+{
+    assert (self != NULL);
+    assert (f != NULL);
+
+    return RC (rcFS, rcDirectory, rcDestroying, rcSelf, rcUnsupported);
+}
+
+
+static	rc_t CC KQuickMountDirDate (const KQuickMountDir *self,
+					 KTime_t *date,
+					 const char *path,
+					 va_list args)
+{
+    return RC (rcFS, rcDirectory, rcAccessing, rcSelf, rcUnsupported);
+
+}
+
+
+static	rc_t CC KQuickMountDirSetDate		(KQuickMountDir *self,
+					 bool recurse,
+					 KTime_t date,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}
+#endif
+
+/* ----------------------------------------------------------------------
+ *
+ */
+static KDirectory_vt_v1 vtKQuickMountDir =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* start minor version 0 methods*/
+    KQuickMountDirDestroy,
+    KQuickMountDirList,
+    KQuickMountDirVisit,
+    KQuickMountDirVisitUpdate,
+    KQuickMountDirPathType,
+    KQuickMountDirResolvePath,
+    KQuickMountDirResolveAlias,
+    KQuickMountDirRename,
+    KQuickMountDirRemove,
+    KQuickMountDirClearDir,
+    KQuickMountDirVAccess,
+    KQuickMountDirSetAccess,
+    KQuickMountDirCreateAlias,
+    KQuickMountDirOpenFileRead,
+    KQuickMountDirOpenFileWrite,
+    KQuickMountDirCreateFile,
+    KQuickMountDirFileSize,
+    KQuickMountDirSetFileSize,
+    KQuickMountDirOpenDirRead,
+    KQuickMountDirOpenDirUpdate,
+    KQuickMountDirCreateDir,
+    NULL,
+    /* end minor version 0 methods*/
+    /* start minor version 1 methods*/
+    NULL,
+    NULL,
+    NULL,
+    /* end minor version 2 methods*/
+    NULL,
+    /* end minor version 2 methods*/
+    /* end minor version 3 methods*/
+    NULL,
+    NULL
+    /* end minor version 3 methods*/
+};
+
+
+static KQuickMountDir * KQuickMountDirAlloc (size_t path_size, size_t mount_size)
+{
+    return calloc (sizeof (KQuickMountDir) + path_size + mount_size + 1, 1);
+}
+
+
+KFS_EXTERN rc_t KQuickMountDirMake (const KDirectory * self, 
+                                    const KDirectory ** pnewdir,
+                                    const KFile * file,
+                                    const char * path, size_t path_size,
+                                    const char * mount, size_t mount_size)
+{
+    KQuickMountDir * newdir;
+    char * pc;
+    rc_t rc;
+    bool endslash;
+    char tbuff [8193];
+
+    endslash = path[path_size-1] == '/';
+
+    if (sizeof tbuff - 1 < mount_size)
+        return RC (rcFS, rcDirectory, rcCreating, rcBuffer, rcInsufficient);
+
+    memmove (tbuff, mount, mount_size);
+    tbuff[mount_size] = '\0';
+
+    while ((pc = strpbrk (tbuff, "\"\\/")) != NULL)
+        *pc = '_';
+
+    rc = KFileAddRef (file);
+    if (rc == 0)
+    {
+        newdir = KQuickMountDirAlloc (path_size, mount_size);
+        if (newdir == NULL)
+            rc = RC (rcFS, rcDirectory, rcAllocating, rcMemory, rcExhausted);
+        else
+        {
+            newdir->file = file;
+            newdir->mount = newdir->path + path_size;
+            rc = KQuickMountDirMakePath (newdir, rcCreating, true, newdir->path,
+                                         path_size + 1 + mount_size + 1,
+                                         endslash?"%s%s":"%s/%s", path, tbuff);
+            if (rc == 0)
+            {
+                rc = KDirectoryInit (&newdir->dad, (const KDirectory_vt*) &vtKQuickMountDir,
+                                     "KQuickMountDir", path?path:"(null)", false);
+                if (rc == 0)
+                {
+                    newdir->mount = newdir->path + path_size + 1;
+                    newdir->root = 0;
+                    *pnewdir = &newdir->dad;
+                    return 0;
+                }
+/*             rc = RC (rcFS, rcDirectory, rcInitializing, rcObject, rcInvalid); */
+            }
+            KQuickMountDirDestroy (newdir);
+        }
+        KFileRelease (file);
+    }
+    return rc;
+}
+                         
+
+
+/* end of file quickmount.c */
+
diff --git a/libs/kfs/ramfile.c b/libs/kfs/ramfile.c
new file mode 100644
index 0000000..74651c3
--- /dev/null
+++ b/libs/kfs/ramfile.c
@@ -0,0 +1,424 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <sysalloc.h>
+#include <kfs/ramfile.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* ======================================================================
+ * KRamFile
+ */
+
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+#define KFILE_IMPL struct KRamFile
+#include <kfs/impl.h>
+
+/*-----------------------------------------------------------------------
+ * KRamFile
+ *  A KFile that puts reads and writes into a buffer. The buffer is passed
+ *  in so the creator will know where the buffer is.
+ */
+struct KRamFile
+{
+    KFile	dad;
+
+    uint64_t pos;
+    uint64_t max_pos;
+    size_t   bsize;
+    size_t   max;
+    char *   buffer;
+};
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *
+ */
+static
+rc_t CC KRamFileDestroy (KRamFile *self)
+{
+    free (self);
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or RAM if
+ *  no such file is available.
+ *
+ * We cant allow memory mapping a tee file as the read?writes ar needed
+ * to trigger the writes to the copy KFile
+ */
+
+static
+struct KSysFile *CC KRamFileGetSysFile (const KRamFile *self, uint64_t *offset)
+{
+    /* parameters must be non-RAM */
+    assert (self != NULL);
+    assert (offset != NULL);
+
+    return NULL;
+}
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ *  returns 0 if random access, error code otherwise
+ *
+ * Update needs to be able to seek both original and copy while read
+ * only needs to be able to seek the original.
+ */
+static
+rc_t CC KRamFileRandomAccess (const KRamFile *self)
+{
+    assert (self != NULL);
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KRamFileType (const KRamFile *self)
+{
+    return kfdNull;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KRamFileSize (const KRamFile *self, uint64_t *size)
+{
+    assert (self != NULL);
+    assert (size != NULL);
+
+/*     return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported ); */
+    *size = self->max_pos;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KRamFileSetSize (KRamFile *self, uint64_t size)
+{
+/*     return RC (rcFS, rcFile, rcUpdating, rcSelf, rcUnsupported); */
+    self->max_pos = size;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, RAM OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ *
+ * NOTE: Can not seek;
+ *
+ */
+static
+rc_t CC KRamFileRead	(const KRamFile *self,
+			 uint64_t pos,
+			 void *buffer,
+			 size_t bsize,
+			 size_t *num_read)
+{
+    assert (self);
+    assert (buffer);
+    assert (num_read);
+    /* no restrictions on pos or bsize */
+
+    if (pos >= self->max_pos)
+    {
+        *num_read = 0;
+        return 0;
+    }
+
+    if (pos + bsize > self->max_pos)
+        bsize = self->max_pos - pos;
+
+    /* if we are trying to read outside the current window */
+    if (self->pos > pos)
+    {
+        /* get some zeros */
+        size_t left_zeroes;
+
+        left_zeroes = self->pos - pos;
+
+        if (left_zeroes >= bsize)
+            left_zeroes = bsize;
+
+        memset (buffer, 0, bsize);
+    }
+    else if (self->pos + self->bsize < pos)
+        memset (buffer, 0, bsize);
+
+    /* so we are inside the current window */
+    else
+    {
+        /* are we trying to go past the window? */
+        if (pos + bsize > self->pos + self->bsize)
+            bsize = (self->pos + self->bsize) - pos;
+
+        memmove (buffer, self->buffer + (pos - self->pos), bsize);
+    }
+    *num_read = bsize;
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, RAM OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ * Always accepts writes and can seek.
+ */
+static
+rc_t CC KRamFileWrite (KRamFile *self, uint64_t pos,
+		       const void *buffer, size_t bsize,
+		       size_t *num_writ)
+{
+    char * to;
+
+    /* can't really fail */
+
+    assert (self);
+    assert (buffer);
+    assert (num_writ);
+
+    /* does the write fill the buffer? */
+    if (bsize >= self->max)
+    {
+        /* we can never allow a write larger than the internal buffer */
+        self->pos = pos;
+        self->bsize = bsize = self->max;
+        to = self->buffer;
+        if (self->max_pos < pos + bsize)
+            self->max_pos = pos + bsize;
+    }
+
+    /* else are we seeking forward or backward to completely new or completely
+     * over writing what is there */
+    else if ((self->bsize == 0) ||                     /* currently no buffer */
+             (pos >= (self->pos + self->max)) || /* past current */
+             (pos + self->max <= self->pos) ||   /* behind current */
+             ((pos <= self->pos) && (pos + bsize >= self->pos + self->bsize)))
+    {
+        /* reset the buffer parameters */
+        self->pos = pos;
+        self->bsize = bsize;
+        if (self->max_pos < pos + bsize)
+            self->max_pos = pos + bsize;
+
+        to = self->buffer;
+        /* clear any unused portion of the buffer */
+        if (self->max > bsize)
+            memset (self->buffer + bsize, 0, self->max - bsize);
+    }
+    else if (pos >= self->pos) 
+    {
+        /* if we are reading something at or after what we have now
+         * where the right edge was doesn't matter since we zero fill
+         * in the previous condition and at construction */
+        /* how far into the buffer will we start */
+        size_t poff = pos - self->pos;
+
+        /* do we have to slide the window? This is not optimized */
+        if ((poff != 0) && (poff + bsize > self->max))
+        {
+            size_t m = poff + bsize - self->max;
+            if (self->bsize < self->max)
+                memset (self->buffer + bsize, 0, self->max = self->bsize);
+            /* must use memmove not memmove */
+            memmove (self->buffer, self->buffer + poff, self->max - pos);
+
+            poff -= m;
+            self->pos -= m;
+        }
+
+        /* check for a new self->bsize */
+        if (poff + bsize > self->bsize)
+            self->bsize = poff + bsize;
+
+        /* check for a new max position */
+        if (self->max_pos < self->pos + self->bsize)
+            self->max_pos = self->pos + self->bsize;
+
+        to = self->buffer + poff;
+    }
+    else
+    {
+        size_t poff = self->pos - pos;
+
+        /* non optimized slide */
+        memmove (self->buffer + poff, self->buffer, self->max - poff);
+        self->pos = pos;
+        self->bsize += poff;
+        if (self->bsize > self->max)
+            self->bsize = self->max;
+        to = self->buffer;
+    }
+    memmove (to, buffer, bsize);
+    *num_writ = bsize;
+
+    return 0;
+}
+
+
+static const KFile_vt_v1 vtKRamFile =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KRamFileDestroy,
+    KRamFileGetSysFile,
+    KRamFileRandomAccess,
+    KRamFileSize,
+    KRamFileSetSize,
+    KRamFileRead,
+    KRamFileWrite,
+
+    /* 1.1 */
+    KRamFileType
+};
+
+/* ----------------------------------------------------------------------
+ * KRamFileMake
+ *  create a new file object
+ */
+static
+rc_t KRamFileMake (KRamFile ** pself, char * buffer, size_t buffer_size, bool r, bool w)
+{
+    rc_t	rc;
+    KRamFile *	self;
+
+    /* -----
+     */
+    if (pself == NULL)
+        return RC (rcFS, rcFile, rcConstructing, rcSelf, rcNull);
+
+    if (buffer == NULL)
+        return RC (rcFS, rcFile, rcConstructing, rcParam, rcNull);
+
+    /* we only deny size 0 buffer just to avoid the too weird corner cases */
+    if (buffer_size == 0)
+        return RC (rcFS, rcFile, rcConstructing, rcParam, rcTooShort);
+
+    if (((r != true) && (r != false)) || ((w != true) && (w != false)))
+        return RC (rcFS, rcFile, rcConstructing, rcParam, rcInvalid);
+
+    /* -----
+     * get space for the object
+     */
+    self = malloc (sizeof (*self));
+    if (self == NULL)	/* allocation failed */
+    {
+	/* fail */
+	rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+    }
+    else
+    {
+	rc = KFileInit (&self->dad,			/* initialize base class */
+			(const KFile_vt*)&vtKRamFile, 	/* VTable for KRamFile */
+            "KRamFile", "ram",
+                        r,w);
+	if (rc == 0)
+	{
+            self->pos = self->max_pos = 0;
+            self->max = buffer_size;
+            self->bsize = 0;
+            self->buffer = buffer;
+	    *pself = self;
+	    return 0;
+	}
+	/* fail */
+	free (self);
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KRamFileMakeRead (const KFile ** selfp,char * buffer, size_t buffer_size)
+{
+    KRamFile *self;
+    rc_t rc = KRamFileMake ( & self, buffer, buffer_size, true, false);
+    if ( rc == 0 )
+    {
+        self -> max_pos = buffer_size;
+        self -> bsize = buffer_size;
+        * selfp = & self -> dad;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KRamFileMakeWrite (KFile ** self, char * buffer, size_t buffer_size)
+{
+    return KRamFileMake ((KRamFile **)self, buffer, buffer_size, false, true);
+}
+
+LIB_EXPORT rc_t CC KRamFileMakeUpdate (KFile ** self, char * buffer, size_t buffer_size)
+{
+    return KRamFileMake ((KRamFile **)self, buffer, buffer_size, true, true);
+}
+
+
+/* end of file ramfile.c */
+
diff --git a/libs/kfs/readheadfile.c b/libs/kfs/readheadfile.c
new file mode 100644
index 0000000..59ab0a5
--- /dev/null
+++ b/libs/kfs/readheadfile.c
@@ -0,0 +1,294 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/readheadfile.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+/* ======================================================================
+ * KReadHeadFile
+ */
+
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+struct KReadHeadFile;
+#define KFILE_IMPL struct KReadHeadFile
+#include <kfs/impl.h>
+
+
+/*-----------------------------------------------------------------------
+ * KReadHeadFile
+ */
+typedef struct KReadHeadFile
+{
+    KFile	  dad;
+    uint64_t	  max_position;
+    const KFile * original;
+    size_t        buffer_size;
+    uint8_t       buffer [1];
+} KReadHeadFile;
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *
+ */
+static
+rc_t CC KReadHeadFileDestroy (KReadHeadFile *self)
+{
+    rc_t rc;
+
+    rc = KFileRelease (self->original);
+
+    free (self);
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ *
+ * bytes could not be counted if memory mapped so this is disallowed
+ */
+
+static
+struct KSysFile *CC KReadHeadFileGetSysFile (const KReadHeadFile *self, uint64_t *offset)
+{
+    /* parameters must be non-NULL */
+    assert (self != NULL);
+    assert (offset != NULL);
+
+    return KFileGetSysFile (self->original, offset);
+}
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t CC KReadHeadFileRandomAccess (const KReadHeadFile *self)
+{
+    return KFileRandomAccess (self->original);
+}
+
+/* ----------------------------------------------------------------------
+ * Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KReadHeadFileType (const KReadHeadFile *self)
+{
+    return KFileType (self->original);
+}
+
+/* ----------------------------------------------------------------------
+ * Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KReadHeadFileSize (const KReadHeadFile *self, uint64_t *size)
+{
+    return KFileSize (self->original, size);
+}
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KReadHeadFileSetSize (KReadHeadFile *self, uint64_t size)
+{
+    return RC (rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t CC KReadHeadFileRead	(const KReadHeadFile *cself,
+				 uint64_t pos,
+				 void *buffer,
+				 size_t bsize,
+				 size_t *num_read)
+{
+    rc_t rc;
+    size_t valid = 0;
+    size_t this_read;
+    KReadHeadFile *self = (KReadHeadFile *)cself;
+    *num_read = 0;
+
+    /* are we re-reading? */
+    if (pos < self->max_position)
+    {
+        size_t valid = self->max_position - pos;
+
+        if (bsize <= valid)
+        {
+            memmove (buffer, self->buffer + pos, bsize);
+            return 0;
+        }
+
+        memmove (buffer, self->buffer + pos, valid);
+    }
+    rc = KFileRead (self->original, pos + valid, (char *)buffer + valid,
+                    bsize - valid, &this_read);
+
+    *num_read = (rc) ? 0 : valid + this_read;
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ * Unsupported as we now treat archives as READ ONLY
+ */
+static
+rc_t CC KReadHeadFileWrite (KReadHeadFile *self, uint64_t pos,
+			   const void *buffer, size_t bsize,
+			   size_t *num_writ)
+{
+    assert ( self != NULL );
+    return RC (rcFS, rcFile, rcWriting, rcFunction, rcUnsupported);
+}
+
+static const KFile_vt_v1 vtKReadHeadFile =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KReadHeadFileDestroy,
+    KReadHeadFileGetSysFile,
+    KReadHeadFileRandomAccess,
+    KReadHeadFileSize,
+    KReadHeadFileSetSize,
+    KReadHeadFileRead,
+    KReadHeadFileWrite,
+
+    /* 1.1 */
+    KReadHeadFileType
+};
+
+
+
+/* ----------------------------------------------------------------------
+ * KReadHeadFileMake
+ *  create a new file object
+ */
+
+LIB_EXPORT rc_t CC KFileMakeReadHead (const KFile ** pself,
+                                      const KFile * original,
+                                      size_t buffer_size)
+{
+    rc_t rc;
+
+    if (pself == NULL)
+        return RC (rcFS, rcFile, rcConstructing, rcSelf, rcNull);
+
+    *pself = NULL;
+
+    if (original == NULL)
+        return RC (rcFS, rcFile, rcConstructing, rcParam, rcNull);
+
+    rc = KFileAddRef (original);
+    if (rc)
+        return rc;
+
+    rc = KFileRandomAccess (original);
+
+    /* buffering not needed as existing file is random access */
+    if (rc == 0)
+    {
+        *pself = original;
+        return 0;
+    }
+
+    /* some other failure we'll have to bail on */
+    else if (GetRCState(rc) != rcUnsupported)
+        return rc;
+
+    else
+    {
+        KReadHeadFile * self;
+
+        self = malloc (sizeof (*self) + buffer_size); /* really too much but too hard to tune down accurately */
+        if (self == NULL)
+            return RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+
+	rc = KFileInit (&self->dad,			/* initialize base class */
+			(const KFile_vt*)&vtKReadHeadFile,/* VTable for KReadHeadFile */
+            "KReadHeadFile", "no-name",
+			original->read_enabled,
+			false);
+	if (rc == 0)
+	{
+            self->max_position = 0;
+            self->original = original;
+            self->buffer_size = buffer_size;
+            *pself = &self->dad;
+            return 0;
+	}
+	/* fail */
+	free (self);
+    }
+    return rc;
+}
+
+/* end of file countfile.c */
+
diff --git a/libs/kfs/report.c b/libs/kfs/report.c
new file mode 100644
index 0000000..4cb3be9
--- /dev/null
+++ b/libs/kfs/report.c
@@ -0,0 +1,169 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+
+#include <klib/klib-priv.h>
+#include <klib/out.h> /* KOutHandlerSet */
+#include <klib/rc.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h> /* KFileWrite */
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h> /* calloc */
+#include <string.h> /* memset */
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+/*
+ * An unrecoverable error happened.
+ * We can help to solve it
+ * by reporting information about known application execution environment.
+ */
+
+#define report ( * f -> report )
+#define reportData ( * f -> reportData )
+#define reportData1 ( * f -> reportData1 )
+#define reportOpen ( * f -> reportOpen )
+#define reportOpen1 ( * f -> reportOpen1 )
+#define reportClose ( * f -> reportClose )
+#define reportClose1 ( * f -> reportClose1 )
+#define reportError ( * f -> reportError )
+#define reportErrorStr ( * f -> reportErrorStr )
+#define reportErrorStrImpl ( * f -> reportErrorStrImpl )
+#define reportErrorStrInt ( * f -> reportErrorStrInt )
+#define reportError3Str ( * f -> reportError3Str )
+
+#define MAGIC 0x6521
+
+typedef struct SFile {
+    uint64_t magic;
+    KFile* f;
+    uint64_t pos;
+} SFile;
+
+static rc_t CC fileWriter
+(void* data, const char* buffer, size_t bytes, size_t* num_writ)
+{
+    rc_t rc = 0;
+
+    SFile* self = (SFile*)data;
+    size_t dummy;
+    if (num_writ == NULL)
+    {   num_writ = &dummy; }
+    *num_writ = 0;
+
+    assert(self);
+    if (self->magic != MAGIC) {
+        return rc;
+    }
+
+    rc = KFileWrite(self->f, self->pos, buffer, bytes, num_writ);
+    self->pos += *num_writ;
+
+    return rc;
+}
+
+rc_t CC ReportRedirect
+( KWrtHandler* handler, const char* filename, bool* to_file, bool finalize )
+{
+    rc_t rc = 0;
+    if (!finalize) {
+        if (handler) {
+            handler->writer = KOutWriterGet();
+            handler->data = KOutDataGet();
+        }
+        if (filename) {
+            KDirectory* dir = NULL;
+            SFile* data = calloc(1, sizeof *data);
+            if (data == NULL) {
+                return RC(rcFS, rcMemory, rcAllocating, rcMemory, rcExhausted);
+            }
+            data->magic = MAGIC;
+            rc = KDirectoryNativeDir(&dir);
+            if (rc == 0) {
+                rc = KDirectoryCreateFile
+                    (dir, &data->f, false, 0664, kcmInit, "%s", filename);
+            }
+            if (rc == 0) {
+                rc = KOutHandlerSet(fileWriter, data);
+            }
+            RELEASE(KDirectory, dir);
+        }
+        if (rc != 0 || filename == NULL) {
+            KOutHandlerSetStdErr();
+            if (to_file)
+            {   *to_file = false; }
+        }
+        else if (to_file)
+        {   *to_file = true; }
+
+    }
+    else {
+        void* data = KOutDataGet();
+        SFile* self = (SFile*)data;
+        if (self) {
+            if (self->magic == MAGIC) {
+                RELEASE(KFile, self->f);;
+            }
+            memset(self, 0, sizeof *self);
+            free(self);
+        }
+        if (handler) {
+            KOutHandlerSet(handler->writer, handler->data);
+        }
+    }
+    return rc;
+}
+
+rc_t CC ReportCWD ( const ReportFuncs *f, uint32_t indent )
+{
+    KDirectory *wd;
+    rc_t rc = KDirectoryNativeDir ( & wd );
+    if ( rc != 0 )
+        reportError(indent, rc, "KDirectoryNativeDir");
+    else
+    {
+        char cwd [ PATH_MAX + 1 ];
+        rc = KDirectoryResolvePath ( wd, true, cwd, sizeof cwd, "." );
+        KDirectoryRelease ( wd );
+
+        if ( rc != 0 )
+            reportError(indent, rc, "KDirectoryResolvePath");
+        else
+            reportData(indent, "Cwd", cwd, 0);
+    }
+
+    return rc;
+}
diff --git a/libs/kfs/sra.c b/libs/kfs/sra.c
new file mode 100644
index 0000000..696aad9
--- /dev/null
+++ b/libs/kfs/sra.c
@@ -0,0 +1,486 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kfs/extern.h>
+
+#include <klib/defs.h>
+#include <byteswap.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/sra.h>
+/* #include <kfs/toc.h> */
+#include <klib/log.h>
+#include "toc-priv.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <sysalloc.h>
+
+
+struct KToc;
+struct KDirectory;
+
+
+
+static
+const KSraHeader ksraheader_v1 =
+{
+    { 'N', 'C','B', 'I' },
+    { '.', 's','r', 'a' },
+    eSraByteOrderTag,
+    1
+};
+
+LIB_EXPORT size_t CC SraHeaderSize ( const KSraHeader * self )
+{
+    /* self can be NULL */
+    return sizeof ( KSraHeader );
+}
+
+static
+uint64_t add_filler (uint64_t z, KSRAFileAlignment a)
+{
+    if (a > 1)
+    {
+        uint64_t m = (uint64_t)a - 1;
+        return (z + m) & ~ m;
+    }
+    return z;
+}
+
+static void	SraHeaderInit (KSraHeader * self, size_t treesize, KSRAFileAlignment alignment)
+{
+    memmove (self, &ksraheader_v1, sizeof ksraheader_v1);
+    self->u.v1.file_offset = add_filler (sizeof * self + treesize, alignment);
+}
+
+rc_t SraHeaderMake (KSraHeader ** pself, size_t treesize, KSRAFileAlignment alignment)
+{
+    KSraHeader * self = malloc (sizeof (KSraHeader));
+    if (self == NULL)
+	return RC ( rcFS, rcToc, rcConstructing, rcMemory, rcExhausted );
+    SraHeaderInit (self, treesize, alignment);
+    *pself = self;
+    return 0;
+}
+
+
+static rc_t  SraHeaderValidate ( const KSraHeader * self, bool * reverse, uint32_t * _version, size_t bytes_available )
+{
+    uint64_t offset;
+    rc_t rc;
+    uint32_t version;
+    bool rev;
+
+    if (reverse != NULL)
+	*reverse = false;
+    if (_version != NULL)
+	*_version = 0;
+
+    if (bytes_available < 8)
+        return RC (rcFS, rcArc, rcParsing, rcHeader, rcInsufficient);
+
+    if (memcmp ((void*)self, &ksraheader_v1,
+		sizeof (ksraheader_v1.ncbi) + sizeof (ksraheader_v1.sra)) != 0)
+	return RC (rcFS, rcArc, rcParsing, rcHeader, rcInvalid);
+
+    if (bytes_available < 12)
+        return 0;
+
+    switch (self->byte_order)
+    {
+    default:
+	return RC (rcFS, rcArc, rcParsing, rcHeader, rcCorrupt);
+    case eSraByteOrderTag:
+	rev = false;
+	break;
+    case eSraByteOrderReverse:
+	rev = true;
+	break;
+    }
+    rc = 0;
+
+    if (bytes_available < 16)
+        return 0;
+
+    version = rev ? bswap_32 (self->version) : self->version;
+    offset = rev ? bswap_64 (self->u.v1.file_offset) : self->u.v1.file_offset;
+
+    if (version > FS_SRA_CUR_VERSION)
+	rc =  RC (rcFS, rcArc, rcParsing, rcHeader, rcUnsupported);
+
+    /* 4 is minimum size for a TOC */
+    else if (offset < (sizeof ksraheader_v1 + 4))
+	return RC (rcFS, rcArc, rcParsing, rcHeader, rcCorrupt);
+
+    if (reverse != NULL)
+	*reverse = rev;
+    if (_version != NULL)
+	*_version = version;
+
+    return rc;
+}
+
+LIB_EXPORT uint64_t CC SraHeaderGetFileOffset ( const KSraHeader * self )
+{
+    if ( self -> byte_order == eSraByteOrderReverse )
+        return bswap_64 ( self->u.v1.file_offset );
+    return self->u.v1.file_offset;
+}
+
+static
+rc_t KTocParseRead (const KFile * f, uint64_t p, void * b, size_t z, size_t * n)
+{
+    rc_t rc;
+    size_t a;
+    size_t t;
+
+    rc = 0;
+    for (a = 0; a < z; a += t)
+    {
+	rc = KFileRead (f, p + a, (uint8_t*)b + a, z - a, &t);
+	if (rc != 0)
+	    return rc;
+	if (t == 0)
+	    break;
+    }
+    if (a < z)
+	rc = RC (rcFS, rcToc, rcParsing, rcFile, rcTooShort);
+    *n = a;
+    return rc;
+}
+
+
+static
+rc_t KTocParseReadPBSTree (struct KToc * self, const KFile * file, uint64_t endpos, void ** header)
+{
+    rc_t rc;
+    uint64_t toc_pos;
+    uint64_t end_pos;
+    size_t num_read;
+    size_t tree_size;
+
+    rc = 0;
+    toc_pos = SraHeaderSize(NULL);
+    end_pos = endpos;
+
+    if (end_pos <= toc_pos)
+    {
+        /* 	rc = RC (rcFS, rcToc, rc */
+    }
+    tree_size = (size_t)(end_pos - toc_pos);
+
+    *header = malloc (tree_size);
+    if (*header == NULL)
+    {
+        rc = RC (rcFS, rcToc, rcParsing, rcMemory, rcExhausted);
+    }
+    else
+    {
+        rc = KTocParseRead (file, toc_pos, *header, tree_size, &num_read);
+        if (rc == 0)
+        {
+            return 0;
+        }
+        free (*header);
+        *header = NULL;
+    }
+    return rc;
+}
+
+static
+rc_t CC KArcParseSRAInt ( struct KToc * self,
+                          const void * kvoid,
+                          bool ( CC * ignored ) ( const struct KDirectory *,  const char *, void * ),
+                          void * ignored_data, 
+                          bool unbounded,
+                          bool silent )
+{
+    uint64_t arcsize;
+    rc_t rc;
+    bool reverse;
+    uint32_t version;
+    KSraHeader header;
+    size_t num_read;
+    size_t all_read;
+    const KFile * file;
+    void * pbstreeBuffer;
+    /*     uint64_t toc_offset; */
+    /*     uint64_t file_offset; */
+
+    rc = 0;
+    if ( kvoid == NULL )
+    {
+        rc = RC ( rcFS, rcToc, rcParsing, rcParam, rcNull );
+        if ( !silent )
+            LOGERR ( klogErr, rc, "File parameter null for parsing .sra" );
+        return rc;
+    }
+    file = kvoid;
+
+    rc = KFileSize ( file, &arcsize );
+    if (rc)
+    {
+        if ( unbounded )
+            arcsize = ( (uint64_t)0 ) - 1;
+        else
+        {
+            rc = RC ( rcFS, rcToc, rcParsing, rcFile, rcIncorrect );
+            if ( !silent )
+                LOGERR ( klogErr, rc, "Can't determine archive file size" );
+            return rc;
+        }
+    }
+
+    for ( num_read = all_read = 0; all_read < sizeof (header); all_read += num_read )
+    {
+        rc = KTocParseRead ( file, 0, &header, sizeof (header), &num_read );
+        if ( num_read == 0 )
+        {
+            rc = RC ( rcFS, rcToc, rcParsing, rcFile, rcTooShort );
+            break;
+        }
+    }
+    if ( rc != 0 )
+    {
+        if ( !silent )
+            LOGERR ( klogErr, rc, "error reading file to parse .sra" );
+        return rc;
+    }
+
+    /* version is ignored at this point as there is only one version */
+    rc = SraHeaderValidate ( &header, &reverse, &version, sizeof header );
+    if ( rc != 0 )
+    {
+        if ( !silent )
+            LOGERR ( klogErr, rc, "File header invalid for .sra header" );
+        return rc;
+    }
+
+    switch ( version )
+    {
+    default:
+        rc = RC ( rcFS, rcToc, rcParsing, rcFileFormat, rcBadVersion );
+        if ( !silent )
+            LOGERR ( klogInt, rc, "Incompatible file version" );
+        break;
+    case 1:
+        rc = KTocParseReadPBSTree ( self, file, SraHeaderGetFileOffset (&header),
+                                   &pbstreeBuffer );
+        if ( rc != 0 )
+        {
+            if ( !silent )
+                LOGERR ( klogErr, rc, "File TOC not read for .sra header" );
+            break;
+        }
+        else
+        {
+            uint64_t offset;
+            offset = SraHeaderGetFileOffset (&header);
+            rc = KTocInflatePBSTree ( self, arcsize, pbstreeBuffer, 
+                                     (uint32_t)(offset - sizeof (header)),
+                                     offset,
+                                     reverse, "" );
+            free ( pbstreeBuffer );
+            if ( rc != 0 && !silent )
+            {
+                LOGERR (klogErr, rc, "File TOC not valid for .sra");
+            }
+            /* 	    else */
+            /* 	    { */
+            /* 		rc = KTocParseSraDirectory (self, bst, ""); */
+            /* 		if (rc == 0) */
+            /* 		    return 0; */
+            /* 	    } */
+        }
+        break;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KArcParseSRA ( struct KToc * self,
+                                  const void * kvoid,
+                                  bool (CC*ignored) (const struct KDirectory*,  const char*, void*),
+                                  void *ignored_data )
+{
+    return KArcParseSRAInt ( self, kvoid, ignored, ignored_data, false, false );
+}
+
+
+LIB_EXPORT rc_t CC KArcParseSRA_silent ( struct KToc * self,
+                                  const void * kvoid,
+                                  bool (CC*ignored) (const struct KDirectory*,  const char*, void*),
+                                  void *ignored_data )
+{
+    return KArcParseSRAInt ( self, kvoid, ignored, ignored_data, false, true );
+}
+
+LIB_EXPORT rc_t CC KArcParseSRAUnbounded ( struct KToc * self,
+                                  const void * kvoid,
+                                  bool (CC*ignored) (const struct KDirectory*,  const char*, void*),
+                                  void *ignored_data )
+{
+    return KArcParseSRAInt ( self, kvoid, ignored, ignored_data, true, false );
+}
+
+LIB_EXPORT rc_t CC KArcParseSRAUnbounded_silent ( struct KToc * self,
+                                  const void * kvoid,
+                                  bool (CC*ignored) (const struct KDirectory*,  const char*, void*),
+                                  void *ignored_data )
+{
+    return KArcParseSRAInt ( self, kvoid, ignored, ignored_data, true, false );
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryVOpenSraArchiveRead ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, va_list args )
+{
+    /* respond properly to va_list */
+    char full [ 4096 ];
+    int len = vsnprintf ( full, sizeof full, path, args );
+    if ( len < 0 )
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcExcessive );
+
+    /* putting off parameter validation into this call */
+    return KDirectoryOpenArcDirRead (self, sra_dir, chroot, full, tocKFile,
+                                     KArcParseSRA, NULL, NULL);
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryOpenSraArchiveRead ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVOpenSraArchiveRead ( self, sra_dir, chroot, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryVOpenSraArchiveRead_silent ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, va_list args )
+{
+    /* respond properly to va_list */
+    char full [ 4096 ];
+    int len = vsnprintf ( full, sizeof full, path, args );
+    if ( len < 0 )
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcExcessive );
+
+    /* putting off parameter validation into this call */
+    return KDirectoryOpenArcDirRead_silent ( self, sra_dir, false, full, tocKFile,
+                                     KArcParseSRA_silent, NULL, NULL );
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryOpenSraArchiveRead_silent ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVOpenSraArchiveRead_silent ( self, sra_dir, chroot, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryVOpenSraArchiveReadUnbounded_silent_preopened ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const struct KFile * f, const char *path, va_list args )
+{
+    /* respond properly to va_list */
+    char full [ 4096 ];
+    int len = vsnprintf ( full, sizeof full, path, args );
+    if ( len < 0 || len >= sizeof full )
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcExcessive );
+
+    /* putting off parameter validation into this call */
+    return KDirectoryOpenArcDirRead_silent_preopened ( self, sra_dir, false, full, tocKFile,
+        ( void* ) f, KArcParseSRAUnbounded_silent, NULL, NULL );
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryOpenSraArchiveReadUnbounded_silent_preopened ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const struct KFile * f, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVOpenSraArchiveReadUnbounded_silent_preopened ( self, sra_dir, chroot, f, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryVOpenSraArchiveReadUnbounded ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, va_list args )
+{
+    /* respond properly to va_list */
+    char full [ 4096 ];
+    int len = vsnprintf ( full, sizeof full, path, args );
+    if ( len < 0 )
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcExcessive );
+
+    /* putting off parameter validation into this call */
+    return KDirectoryOpenArcDirRead (self, sra_dir, false, full, tocKFile,
+                                     KArcParseSRAUnbounded, NULL, NULL);
+}
+
+
+LIB_EXPORT rc_t CC KDirectoryOpenSraArchiveReadUnbounded ( struct KDirectory const *self,
+    struct KDirectory const **sra_dir, int chroot, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVOpenSraArchiveReadUnbounded (self, sra_dir, chroot, path, args);
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KFileIsSRA (const char * b, size_t z)
+{
+    const KSraHeader * h = (const KSraHeader *)b;
+
+    if (SraHeaderValidate (h, NULL, NULL, z) == 0)
+        return 0;
+    
+    return RC (rcFS, rcFile, rcIdentifying, rcBuffer, rcWrongType);
+}
+
+/* end of file */
diff --git a/libs/kfs/subfile.c b/libs/kfs/subfile.c
new file mode 100644
index 0000000..4a3525d
--- /dev/null
+++ b/libs/kfs/subfile.c
@@ -0,0 +1,337 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/subfile.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+
+/* ======================================================================
+ * KSubFile
+ *  a file inside an archive
+ */
+
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+#define KFILE_IMPL struct KSubFile
+#include <kfs/impl.h>
+
+static rc_t CC KSubFileDestroy (KSubFile *self);
+static struct KSysFile *CC KSubFileGetSysFile (const KSubFile *self,
+					    uint64_t *offset);
+static rc_t CC KSubFileRandomAccess (const KSubFile *self);
+static uint32_t CC KSubFileType (const KSubFile *self);
+static rc_t CC KSubFileSize (const KSubFile *self, uint64_t *size);
+static rc_t CC KSubFileSetSize (KSubFile *self, uint64_t size);
+static rc_t CC KSubFileRead (const KSubFile *self, uint64_t pos,
+			  void *buffer, size_t bsize, size_t *num_read);
+static rc_t CC KSubFileWrite (KSubFile *self, uint64_t pos, const void *buffer,
+			   size_t size, size_t *num_writ);
+
+
+static const KFile_vt_v1 vtKSubFile =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KSubFileDestroy,
+    KSubFileGetSysFile,
+    KSubFileRandomAccess,
+    KSubFileSize,
+    KSubFileSetSize,
+    KSubFileRead,
+    KSubFileWrite,
+
+    /* 1.1 */
+    KSubFileType
+};
+
+/*-----------------------------------------------------------------------
+ * KSubFile
+ *  an archive file including tar and sra
+ */
+struct KSubFile
+{
+    KFile	dad;
+    uint64_t	start;
+    uint64_t	size;
+    KFile *	original;
+};
+
+/* ----------------------------------------------------------------------
+ * KSubFileMake
+ *  create a new file object
+ */
+
+static
+rc_t KSubFileMake (KSubFile ** self,
+		   KFile * original,
+		   uint64_t start,
+		   uint64_t size,
+		   bool read_enabled,
+		   bool write_enabled)
+{
+    rc_t	rc;
+    KSubFile *	pF;
+
+    /* -----
+     */
+    assert (self != NULL);
+    assert (original != NULL);
+/*     assert (start >= size); */
+
+    /* -----
+     * the enables should be true or false
+     */
+    assert ((read_enabled == true)||(read_enabled == false));
+    assert ((write_enabled == true)||(write_enabled == false));
+
+    /* -----
+     * get space for the object
+     */
+    pF = malloc (sizeof (KSubFile));
+    if (pF == NULL)	/* allocation failed */
+    {
+        /* fail */
+        rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+    }
+    else
+    {
+        rc = KFileInit (&pF->dad,			/* initialize base class */
+            (const KFile_vt*)&vtKSubFile, 	/* VTable for KSubFile */
+            "KSubFile", "no-name",
+                        read_enabled,		/* read allowed */
+                        write_enabled);		/* write disallowed */
+	if (rc == 0)
+	{
+	    KFileAddRef (original);
+	    /* succeed */
+	    pF->original = original;
+	    pF->start = start;
+	    pF->size = size;
+	    *self = pF;
+	    return 0;
+	}
+	/* fail */
+	free (pF);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KFileMakeSubRead (const KFile ** self, const KFile * original, uint64_t start, uint64_t size)
+{
+    return KSubFileMake ((KSubFile **)self, (KFile*)original, start, size,
+			 true, false);
+}
+
+LIB_EXPORT rc_t CC KFileMakeSubUpdate (KFile ** self, KFile * original, uint64_t start, uint64_t size)
+{
+    return KSubFileMake ((KSubFile **)self, original, start, size,
+			 true, true);
+}
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *
+ */
+static
+rc_t CC KSubFileDestroy (KSubFile *self)
+{
+    assert (self != NULL);
+    KFileRelease (self->original);
+    free (self);
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ *
+ * We cant allow memory mapping a tee file as the read?writes ar needed
+ * to trigger the writes to the copy KFile
+ */
+
+static
+struct KSysFile *CC KSubFileGetSysFile (const KSubFile *self, uint64_t *offset)
+{
+    /* parameters must be non-NULL */
+    assert (self != NULL);
+    assert (offset != NULL);
+
+    /* not implmenting at this time */
+    return NULL;
+}
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ *  returns 0 if random access, error code otherwise
+ *
+ * Update needs to be able to seek both original and copy while read
+ * only needs to be able to seek the original.
+ */
+static
+rc_t CC KSubFileRandomAccess (const KSubFile *self)
+{
+    assert (self != NULL);
+    return KFileRandomAccess (self->original);
+}
+
+/* ----------------------------------------------------------------------
+ * Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KSubFileType (const KSubFile *self)
+{
+    return KFileType (self->original);
+}
+
+
+/* ----------------------------------------------------------------------
+ * Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KSubFileSize (const KSubFile *self, uint64_t *size)
+{
+    assert (self != NULL);
+    assert (size != NULL);
+
+    *size = self->size;
+
+    return 0;;
+}
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KSubFileSetSize (KSubFile *self, uint64_t size)
+{
+    return RC (rcFS, rcFile, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t CC KSubFileRead	(const KSubFile *self,
+			 uint64_t pos,
+			 void *buffer,
+			 size_t bsize,
+			 size_t *num_read)
+{
+    size_t	request;
+    rc_t	rc;
+
+
+    /* -----
+     * self and buffer were validated as not NULL before calling here
+     *
+     * So get the KTTOCNode type: chunked files and contiguous files 
+     * are read differently.
+     */
+    assert (self != NULL);
+    assert (buffer != NULL);
+    assert (num_read != NULL);
+
+    *num_read = 0;
+    if (pos >= self->size)
+    {
+	return 0;
+    }
+    if ((pos + bsize) <= self->size)
+	request = bsize;
+    else
+	request = (size_t)(self->size - pos);
+
+    rc = KFileRead (self->original, self->start + pos, buffer, request, num_read);
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ * Unsupported as we now treat archives as READ ONLY
+ */
+static
+rc_t CC KSubFileWrite (KSubFile *self, uint64_t pos,
+		       const void *buffer, size_t bsize,
+		       size_t *num_writ)
+{
+    size_t to_write;
+
+    assert (self != NULL);
+    assert (buffer != NULL);
+    assert (num_writ != NULL);
+
+    *num_writ = 0;
+    if (pos >= ( uint64_t ) self->size)
+        return 0;
+
+    to_write = bsize;
+    if ((pos + bsize) > self->size)
+        to_write = ( uint64_t ) self -> size - pos;
+
+    return KFileWrite (self->original, self->start + pos, buffer, to_write, num_writ);
+}
+
+/* end of file subfile.c */
+
diff --git a/libs/kfs/szip.c b/libs/kfs/szip.c
new file mode 100644
index 0000000..59cc74a
--- /dev/null
+++ b/libs/kfs/szip.c
@@ -0,0 +1,575 @@
+/*=======================================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+struct KSZipFile;
+#define KFILE_IMPL struct KSZipFile
+
+#include <kfs/extern.h>
+#include <kfs/impl.h>  /* KFile_vt_v1 */
+#include <kfs/szip.h>  /* KFileMakeSzipFor... */
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+
+#include <ext/szlib.h>      /* sz_stream */
+
+#include <assert.h>
+#include <stdlib.h>    /* malloc */
+
+#ifdef _DEBUGGING
+#define SZIP_DEBUG(msg) DBGMSG(DBG_KFS,DBG_FLAG(DBG_KFS_GZIP), msg)
+#else
+#define SZIP_DEBUG(msg)
+#endif
+
+/***************************************************************************************/
+/* Szip File                                                                     */
+/***************************************************************************************/
+
+#define SZFCHUNK 0x20000    /* 128K */
+/** Szip KFile structure */
+struct KSZipFile {
+    KFile dad;
+    KFile *file; /* inderlying KFile */
+    uint64_t filePosition;
+    uint64_t myPosition;
+    sz_stream strm;
+    unsigned char buff[ SZFCHUNK ]; /* buffer to cache KFile data */
+    bool completed;
+};
+typedef struct KSZipFile KSZipFile;
+
+/* virtual functions declarations (definitions for unsupported ) ***********************/
+
+static struct KSysFile *CC s_GetSysFile(const KSZipFile *self,
+    uint64_t *offset)
+{ return NULL; }
+
+static rc_t CC s_FileRandomAccess(const KSZipFile *self)
+{ return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported ); }
+
+static uint32_t CC s_FileType ( const KSZipFile *self )
+{ return KFileType ( self -> file ); }
+
+static rc_t CC s_FileSize(const KSZipFile *self, uint64_t *size)
+{ return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported ); }
+
+static rc_t CC s_FileSetSize(KSZipFile *self,
+    uint64_t size)
+{ return RC ( rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported ); }
+
+/* read-only methods *******************************************************************/
+
+static rc_t CC KSZipFile_InDestroy ( KSZipFile *self );
+
+static rc_t CC KSZipFile_InRead ( const KSZipFile *cself,
+    uint64_t pos,
+    void *buffer,
+    size_t bsize,
+    size_t *num_read );
+
+static rc_t CC KSZipFile_InWrite ( KSZipFile *self,
+    uint64_t pos,
+    const void *buffer,
+    size_t size,
+    size_t *num_writ )
+{ return RC ( rcFS, rcFile, rcWriting, rcFunction, rcUnsupported ); }
+
+/** virtual table **********************************************************************/
+static KFile_vt_v1 s_vtKFile_InSz = {
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KSZipFile_InDestroy,
+    s_GetSysFile,
+    s_FileRandomAccess,
+    s_FileSize,
+    s_FileSetSize,
+    KSZipFile_InRead,
+    KSZipFile_InWrite,
+
+    /* 1.1 */
+    s_FileType
+};
+
+#define WINDOW_BITS (15 + 16)
+
+/** Factory method definition **********************************************************/
+
+LIB_EXPORT rc_t CC KFileMakeSzipForRead( const struct KFile **result,
+    const struct KFile *file )
+{
+    rc_t rc;
+    sz_stream* strm;
+    KSZipFile *obj;
+
+    if ( result == NULL || file == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+
+    obj = ( KSZipFile* ) malloc( sizeof( KSZipFile ) );
+    if ( !obj )
+        return RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+
+    rc = KFileInit( &obj->dad, (const KFile_vt*) &s_vtKFile_InSz, true, false );
+    if ( rc != 0 ) {
+        free( obj );
+        return rc;
+    }
+
+    strm = &obj->strm;
+    strm->avail_in = 0;
+    strm->next_in  = SZ_NULL;
+
+    /* TBD - this should check gzlib error codes */
+    if ( SZ_DecompressInit( strm ) != SZ_OK ) {
+        free( obj );
+        return RC ( rcFS, rcFile, rcConstructing, rcNoObj, rcUnknown );
+    }
+
+        obj->myPosition   = 0;
+        obj->filePosition = 0;
+
+    rc = KFileAddRef( file );
+    if ( rc != 0 )
+    {
+        obj->file = NULL;
+        KSZipFile_InDestroy ( obj );
+    }
+    else
+    {
+        obj->file = (KFile*) file;
+        *result = &obj->dad;
+    }
+
+    return rc;
+}
+
+/* private functions declarations ******************************************************/
+
+static rc_t s_read ( KSZipFile * self, void * buffer, size_t bsize, size_t * num_read );
+static rc_t s_skip ( KSZipFile *self, uint64_t pos );
+
+/* virtual functions definitions *******************************************************/
+
+static rc_t CC KSZipFile_InDestroy( KSZipFile *self ) {
+    rc_t rc = KFileRelease( self->file );
+    if ( rc == 0 ) {
+        SZ_DecompressEnd( &self->strm );
+        free( self );
+    }
+    return rc;
+}
+
+static rc_t CC KSZipFile_InRead( const KSZipFile *cself,
+    uint64_t pos,
+    void *buffer,
+    size_t bsize,
+    size_t *num_read )
+{
+    KSZipFile *self = (KSZipFile*) cself;
+    rc_t rc = 0;
+
+    size_t numRead = 0, ignore;
+    if ( num_read == NULL )
+        num_read = &ignore;
+
+    *num_read = 0;
+
+    if ( !cself || !buffer )
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcNull );
+
+    if ( !bsize )
+        return 0;
+
+    if ( pos < self->myPosition )
+        return RC ( rcFS, rcFile, rcReading, rcParam, rcInvalid );
+
+    SZIP_DEBUG(( "%s: pos %lu bsize %zu\n", __func__, pos, bsize ));
+
+    if ( pos > self->myPosition )
+    {
+    rc =  s_skip ( self, pos );
+    if ( rc != 0 )
+        return rc;
+    if ( pos != self->myPosition )
+        return 0;
+    }
+
+    rc = s_read ( self, buffer, bsize, &numRead );
+    if ( rc != 0 )
+        return rc;
+
+    *num_read = numRead;
+
+    self->myPosition += numRead;
+
+    return 0;
+}
+
+/* private functions definitions *******************************************************/
+
+static rc_t s_read ( KSZipFile * self, void * buffer, size_t bsize, size_t * _num_read )
+{
+    rc_t rc = 0;
+    size_t num_read = 0;
+
+    SZIP_DEBUG(( "%s: Enter\n", __func__ ));
+
+    for ( num_read = 0; num_read  == 0; )
+    {
+        sz_stream * strm = &self->strm;
+        size_t src_read;
+        int sret;
+        
+        strm->next_out = buffer;
+        strm->next_out += num_read;
+        strm->avail_out = bsize;
+
+        SZIP_DEBUG (( "%s: call inflate\n", __func__ ));
+
+        SZIP_DEBUG (( "%s: next_in %14p avail_in %6u total_in %10lu next_out %14p avail_out %6u total_out %10lu\n",
+                     __func__, strm->next_in, strm->avail_in, strm->total_in,
+                     strm->next_out, strm->avail_out, strm->total_out ));
+
+        sret = SZ_Decompress ( strm, SZ_NO_FLUSH );
+
+        SZIP_DEBUG (( "%s: next_in %14p avail_in %6u total_in %10lu next_out %14p avail_out %6u total_out %10lu\n",
+                     __func__, strm->next_in, strm->avail_in, strm->total_in,
+                     strm->next_out, strm->avail_out, strm->total_out ));
+
+        num_read = bsize - strm->avail_out;
+
+        switch ( sret )
+        {
+            /* unexpected error returns from slib */
+        default:
+        /* no equivalent in szlib.h
+        case Z_ERRNO:
+            SZIP_DEBUG (( "%s: unknown error %d\n",__func__, sret ));
+            return RC ( rcFS, rcFile, rcReading, rcFile, rcUnknown );
+        */
+
+        /* known unfixable errors */
+        case SZ_STREAM_ERROR:
+            SZIP_DEBUG (( "%s: stream error %d\n",__func__, sret ));
+            return RC ( rcFS, rcFile, rcReading, rcSelf, rcCorrupt );
+
+            /* don't handle these yet */
+        case SZ_STREAM_END:
+            SZIP_DEBUG (( "%s: stream end %d\n", __func__, sret ));
+            do
+            {
+                rc_t rc_2;
+                uint8_t junkbuff[4096];
+
+                rc_2 = KFileRead ( self->file, self->filePosition,
+                                   junkbuff, sizeof (junkbuff), &src_read );
+                if ( rc_2 != 0 )
+                {
+                    rc = rc_2;
+                    break;
+                }
+                if ( ( ( rc == 0 ) && ( src_read != 0 ) ) || ( strm->avail_in > 0 ) )
+                    rc = RC ( rcFS, rcFile, rcReading, rcData, rcExcessive );
+            } while ( src_read );
+            goto done;
+
+            break;
+
+        case SZ_MEM_ERROR:
+            SZIP_DEBUG (( "%s: mem error %d\n", __func__, sret ));
+            if ( strm->avail_out > 0 )
+            {
+                rc = KFileRead ( self->file, self->filePosition, 
+                                 self->buff, sizeof (self->buff), &src_read );
+                if ( rc != 0 )
+                    break;
+
+                strm->avail_in = src_read;
+                self->filePosition += src_read;
+                strm->next_in = (char*)self->buff;
+
+                /* this is either a truncated file or a blocked stream
+                 * code outside of here has to handle it */
+                if ( ( src_read == 0 ) && ( sret == SZ_MEM_ERROR ) )
+                {
+                    SZIP_DEBUG (( "%s: truncated input\n", __func__ ));
+                    rc = RC ( rcFS, rcFile, rcReading, rcData, rcInsufficient );
+                    break;
+                }
+
+            }
+            break;
+        case SZ_OK:
+            break;
+        }
+        if ( rc != 0 )
+            break;
+    }
+done:
+    *_num_read = num_read;
+    return rc;
+}
+
+
+static rc_t s_skip ( KSZipFile *self, uint64_t pos )
+{
+    rc_t rc = 0;
+    size_t num_read = 0; /* superfluous to quiet compiler */
+    size_t to_read;
+    uint8_t buff [ 32 * 1024 ];
+
+    SZIP_DEBUG (( "%s: enter pos %lu\n", __func__, pos ));
+
+    for ( to_read = sizeof buff; self -> myPosition < pos; self -> myPosition += num_read )
+    {
+    if ( self->myPosition + sizeof buff > pos )
+        to_read = pos - self->myPosition;
+
+    SZIP_DEBUG (( "%s: call z_read to_read %zu \n", __func__ ));
+
+    rc = s_read ( self, buff, to_read, &num_read );
+
+    SZIP_DEBUG (( "%s: return z_read num_read %zu \n", __func__ ));
+
+    if ( rc != 0 )
+        break;
+
+    if ( num_read == 0 )
+        break;
+    }
+    return rc;
+}
+
+/***************************************************************************************/
+/* Szip Output File                                                                    */
+/***************************************************************************************/
+
+/* write-only methods ******************************************************************/
+
+static rc_t CC KSZipFile_OutDestroy( KSZipFile *self );
+
+static rc_t CC KSZipFile_OutRead( const KSZipFile *cself,
+    uint64_t pos,
+    void *buffer,
+    size_t bsize,
+    size_t *num_read )
+{ return RC ( rcFS, rcFile, rcReading, rcFunction, rcUnsupported ); }
+
+static rc_t CC KSZipFile_OutWrite( KSZipFile *self,
+    uint64_t pos,
+    const void *buffer,
+    size_t bsize,
+    size_t *num_writ );
+
+/** virtual table **********************************************************************/
+static KFile_vt_v1 s_vtKFile_OutSz = {
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KSZipFile_OutDestroy,
+    s_GetSysFile,
+    s_FileRandomAccess,
+    s_FileSize,
+    s_FileSetSize,
+    KSZipFile_OutRead,
+    KSZipFile_OutWrite,
+
+    /* 1.1 */
+    s_FileType
+};
+
+/** Factory method definition **********************************************************/
+LIB_EXPORT rc_t CC KFileMakeSzipForWrite( struct KFile **result,
+    struct KFile *file )
+{
+    rc_t rc;
+    sz_stream* strm;
+    KSZipFile *obj;
+
+    if ( result == NULL || file == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcParam, rcNull );
+
+    obj = ( KSZipFile* ) malloc( sizeof( KSZipFile ) );
+    if ( obj == NULL )
+        return RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+
+    rc = KFileInit( &obj->dad, (const KFile_vt*) &s_vtKFile_OutSz, false, true );
+    if ( rc != 0 ) {
+        free( obj );
+        return rc;
+    }
+
+    strm = &obj->strm;
+    strm->avail_in = 0;
+    strm->next_in  = SZ_NULL;
+    strm->total_out = 0;
+    strm->next_out = 0;
+
+    strm->hidden = 0;
+    strm->options_mask = SZ_RAW_OPTION_MASK | SZ_NN_OPTION_MASK | SZ_MSB_OPTION_MASK;
+    strm->bits_per_pixel = 8;
+    strm->pixels_per_block = 8;
+    strm->pixels_per_scanline = 16;
+    strm->image_pixels = 16;
+
+    /* TBD - this should check gzlib error codes */
+    if ( SZ_CompressInit( strm ) != SZ_OK )
+    {
+        free( obj );
+        return RC ( rcFS, rcFile, rcConstructing, rcNoObj, rcUnknown );
+    }
+
+    obj->myPosition   = 0;
+    obj->filePosition = 0;
+    obj->completed    = false;
+
+    rc = KFileAddRef( file );
+    if ( rc != 0 )
+    {
+        obj->file = NULL;
+        KSZipFile_OutDestroy ( obj );
+    }
+    else
+    {
+        obj->file = file;
+        *result = &obj->dad;
+    }
+
+    return rc;
+}
+
+/* private functions declarations ******************************************************/
+
+static int s_SzipAndWrite ( KSZipFile *self,
+    bool flush,
+    size_t *num_writ,
+    rc_t *rc );
+
+/* virtual functions definitions *******************************************************/
+
+static rc_t CC KSZipFile_OutDestroy( KSZipFile *self) {
+    rc_t rc;
+    if ( !self->completed ) {
+        int ret;
+        size_t wrtn;
+        sz_stream* strm = &self->strm;
+        strm->avail_in = 0;
+        strm->next_in = SZ_NULL;
+
+        ret = s_SzipAndWrite( self, SZ_FINISH, &wrtn, &rc );
+        if ( rc != 0 )
+            return rc;
+        assert( ret == SZ_STREAM_END );        /* stream will be complete */
+        
+        SZ_CompressEnd( strm );   /* clean up */
+            
+        self->completed = true;
+    }
+
+    rc = KFileRelease( self->file );
+    if ( rc == 0 )
+        free( self );
+
+    return rc;
+}
+
+static rc_t CC KSZipFile_OutWrite( struct KSZipFile *self,
+    uint64_t pos,
+    const void *buffer,
+    size_t bsize,
+    size_t *num_writ )
+{
+    int ret;
+    rc_t rc;
+    sz_stream* strm;
+    size_t ignore;
+    if ( num_writ == NULL )
+        num_writ = &ignore;
+
+    *num_writ = 0;
+
+    if ( pos != self->myPosition )
+        return RC ( rcFS, rcFile, rcWriting, rcParam, rcInvalid );
+
+    strm = &self->strm;
+    strm->next_in  = (char *) buffer;
+    strm->avail_in = bsize;
+
+    rc = 0;
+    ret = s_SzipAndWrite( self, SZ_NO_FLUSH, num_writ, &rc );
+    if ( rc != 0 )
+        return rc;
+    assert( ret != SZ_STREAM_END );        /* stream will be complete */
+
+    self->myPosition += * num_writ;
+
+    return 0;
+}
+
+/* private functions definitions *******************************************************/
+
+static int s_SzipAndWrite( KSZipFile *self,
+    bool flush,
+    size_t *num_writ,
+    rc_t *rc )
+{
+    sz_stream *strm;
+    long avail_in;
+    int ret;
+
+    assert( self && num_writ && rc );
+
+    *num_writ = 0;
+    strm = &self->strm;
+    avail_in = strm->avail_in;
+    ret = 0;
+    /* run deflate() on input until output buffer not full, finish
+       compression if all of source has been read in */
+    do {
+        uint32_t have;
+        size_t written;
+        strm->avail_out = sizeof(self->buff);
+        strm->next_out = self->buff;
+        ret = SZ_Compress( strm, flush ? SZ_FINISH : SZ_NO_FLUSH );  /* no bad return value */
+        assert( ret != SZ_STREAM_ERROR );  /* state not clobbered */
+        have = sizeof( self->buff ) - strm->avail_out;
+        written = 0;
+        *rc = KFileWrite( self->file, self->filePosition, self->buff, have, &written );
+        /* this is wrong - Z_ERRNO would tell us to check errno for error
+           but the error is in *rc */
+        if ( *rc != 0 )
+            return SZ_STREAM_ERROR;
+        self->filePosition += written;
+        *num_writ = avail_in - strm->avail_in;
+    } while ( strm->avail_out == 0 );
+    assert( strm->avail_in == 0 );     /* all input will be used */
+    return ret;
+}
+
+/* EOF */
diff --git a/libs/kfs/tar.c b/libs/kfs/tar.c
new file mode 100644
index 0000000..4bfa92d
--- /dev/null
+++ b/libs/kfs/tar.c
@@ -0,0 +1,2684 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#define HANDLING_EXTENDED_HEADERS 0
+
+#include <kfs/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <kfs/arc.h>
+#include <kfs/toc.h>
+#include <kfs/tar.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+
+#include "toc-priv.h"
+#include <os-native.h>
+#include <sysalloc.h>
+#include <strtol.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h> /* temporary for development */
+
+#include <limits.h>
+/* #include <sys/types.h> */
+
+#ifdef _DEBUGGING
+#define TAR_FUNC_ENTRY() DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_TARENTRY), ("Enter: %s\n", __func__))
+#define TAR_DEBUG(msg) DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_TAR), msg)
+#else
+#define TAR_FUNC_ENTRY()
+#define TAR_DEBUG(msg)
+#endif
+
+/* -----
+ * offset of is the count of bytes between the base of a structure and 
+ * a particular member of that structure
+ */
+#ifndef OFFSET_OF
+#define	OFFSET_OF(structure,member) ((size_t)((&(((structure*)0)->member))-(0)))
+#endif
+
+/* -----
+ * Hide any definition of sun that might have come from sun compilers
+ * or the like
+ */
+#undef sun
+#undef SUN
+
+
+#define PASTE_2(a,b)   a##b
+#define PASTE_3(a,b,c) a##b##c
+#define STRINGIFY(a)   #a
+
+
+/* ======================================================================
+ * return an ASCII string that describes a header type
+ *
+ * Needs to match tar_header_type_enum.
+ */
+#if _DEBUGGING
+static const char * get_bool_string (bool b)
+{
+    switch (b)
+    {
+    case true:
+	return "true";
+    case false:
+	return "false";
+    default:
+	return "not-false";
+    }
+}
+#endif
+
+
+/* ======================================================================
+ * Header format structures
+ *
+ * Tar (tape archiver) started possibly as a unix utility in BSD rivalling
+ * the cpio from the AT&T System III.  The exact derivation is unimportant
+ * and some names might be slightly misleading based on historical 
+ * inaccuracies but successful implmentation is not dependant on such 
+ * accuracy in historical trivia but rather on accuracy in technical details.
+ *
+ * Posix attempted to standardize the growingly divergent variants of tar
+ * but it has led to only slightly more standardized variants with vaguely
+ * compatible extensions.
+ *
+ * For the purposes of this implmentation we will refer to the known to the
+ * author versions of tar and include the tar like aspects of the posix pax 
+ * replacement for tar.
+ *
+ * Cpio support could be added if desired with only some difficulty.
+ *
+ * Supported known variants for this implmentation will be:
+ * 	V7 	- the oldest known common base defitions for a tar header
+ *		   block ( possibly from Unix V7?)
+ *    	POSIX	- Posix.1-1988 initial restandardization of a header block
+ *		  This versio introduced the ustar name for a tar header
+ *		  and includes that term as a "magic" constant.
+ *	PAX	- Posix.1.2001 headers for pax a tar derivative that us a
+ *		  peaceful attempt to unify the tar and cpio formats apparently.
+ *		  It isn't different than POSIX in the ustar block but instead
+ *		  is an introduction of two new values of a link field in the
+ *		  tar header that defines what comes next (see headers defined
+ *		  below).
+ *	SUN	- an extension to the POSIX tar header format from SunOS 5
+ *	STAR 85	- pre-POSIX extensions to tar from Heorg Schilling (ask him its
+ *		  the bestest most greatest tar until STAR94)
+ *	STAR 94	- A redo of star based on the POSIX ustar tar header.  A less
+ *		  broken than most implmentation of a POSIX/ustar tar header
+ *		  based tar. Schilling says its the only real implmentation of
+ *		  a ustar based tar but it isn't fully compliant by design.
+ *	GNU 89	- a selected variant of tar from FSF/GNU that is a broken 
+ *		  implementation of a POSIX/ustar header based tar.
+ *	GNU 01	- A slight redo of the FSF/GNU tar format.  There are actually
+ *		  evolving variants all of which are still somewhat broken
+ *		  implementations of a ustar based tar header format.
+ *
+ * Along with these variants of a tar/ustar semi-standard tar header there are
+ * other header blocks and other significant blocks that are also tracked in
+ * this implmentation of a tar reader.
+ *	ZERO BLOCK - a block of 512 zero bytes that is supposed to be padding at
+ *		  the end of a tar file to meet some super blocksize.  Based on
+ *		  where it fits in it would be found when looking for a header
+ *		  for the next file included in a tar archive.
+ *	RAW	- a convention to mean a header block of a type that has not been 
+ *		  determined.
+ */
+#define TYPES() \
+    type_(UNDEFINED) type_(ZERO_BLOCK) type_(CPIO) type_(V7) type_(POSIX) \
+        type_(SUN) type_(STAR_85) type_(STAR_94)  type_(GNU_89) type_(SPARSE)
+
+
+#define type_(e) PASTE_2(TAR_,e),
+
+typedef enum tar_header_type
+{
+    TYPES()
+    TAR_TYPE_COUNT
+} tar_header_type;
+
+#undef type_
+#define type_(e) STRINGIFY(e),
+static const char *	get_type_string(tar_header_type t)
+{
+    static const char * type_error = "Error";
+    static const char * type_strings[] = 
+        {
+            TYPES()
+        };
+    if ((t < 0) || (t >= TAR_TYPE_COUNT))
+	return type_error;
+    return type_strings[t];
+}
+#undef type_
+#undef TYPES
+
+
+/* =============================================================================
+ * Tar headers are almost ASCII based but definitely byte/octet based so all
+ * elements are best defined as arrays of char and use casts to signed and unsigned
+ * where appropriate in interpretation..
+ * 
+ * All Tar files or streams are divided into blocks of 512 bytes
+ * This is significant in the file data in that the last block 
+ * of a file is supposed to be padded with NUL to fill out a block
+ * and then be followed by two blocks of all NUL bytes.
+ * headers are also 512 bytes with various but fairly consistent 
+ * interpretations of what is where with in that block
+ *
+ * Most tar utilities further define super blocks consisting of a number of blocks
+ * typically 10 of them for a length of 5120 bytes.  This is irrelevant for this
+ * implmentation.  By definition a tar file ends with two "zero blocks" and enough
+ * more after that to fill one of these super blocks.  We ignore all aspects of 
+ * this.
+ */
+#define TAR_BLOCK_SIZE		(512)
+typedef char tar_raw_block [TAR_BLOCK_SIZE];
+#define BLOCKS_FOR_BYTES(byte_count)	((byte_count+TAR_BLOCK_SIZE-1)/TAR_BLOCK_SIZE)
+
+/* --------------------------------------------------------------------------------
+ * lengths of various tar header fields
+ */
+
+/* --------------------
+ * Tar file names are always 100 bytes long and include preceding 
+ * path names.  The utilities do not precluded paths that put the 
+ * files outside of the "base" where the tar file was created.
+ *
+ * To handle tar files made by older tar utilities if the last 
+ * character is '/' then the file should be assumed to be a directory.
+ *
+ * This 'type' is used for both the name of the object being archived
+ * and the link target if it is a hard or soft link.
+ */
+#define	TAR_NAME_LEN		(100)
+typedef char	tar_file_name	[TAR_NAME_LEN];
+
+/* --------------------
+ * Tar mode strings are always 8 bytes long.
+ *
+ * 9 file access permissions bits and three execution mode bits.
+ *
+ * Zero '0' not NUL pre-fill unused bytes.  a user permision of 0644 would be stored as
+ * "0000644" with a NUL terminator.
+ *
+ * The format is 7 octal ASCII bytes with only the last 4 being 
+ * significant.  That is the first three are always '0'.  The 8th 
+ * byte is NUL.
+ *
+ * Older utilities might put preceding ' ' characters or
+ * instead of pre-fill have post fill ' ' or NUL.
+ */
+#define TAR_MODE_LEN		(8)
+typedef char	tar_file_mode	[TAR_MODE_LEN];
+/* -----
+ * These are the bits if the mode is in binary (octal defines for ease of interpretation)
+ * they match the st_mode field from the stat()/fstat() struct stat.
+ *
+ * GNU tar puts the file type bits from the stat structure in the mode of the tar file.
+ * Other tar implmentations might as well though no where is this dktefined as required or
+ * recommended or even supported.
+ */
+#define	TAR_SUID_BIT	(04000)	/* set UID on execution */
+#define	TAR_GUID_BIT	(02000)	/* set GID on execution */
+#define	TAR_STICKY_BIT	(01000)	/* save text / sticky bit */
+/* file permissions */
+#define	TAR_MODE_OREAD	(00400)	/* read by owner */
+#define	TAR_MODE_OWRITE	(00200)	/* write by owner */
+#define	TAR_MODE_OEXEC	(00100)	/* execute by owner */
+#define	TAR_MODE_GREAD	(00040)	/* read by group */
+#define	TAR_MODE_GWRITE	(00020)	/* write by group */
+#define	TAR_MODE_GEXEC	(00010)	/* execute by group */
+#define	TAR_MODE_WREAD	(00004)	/* read by other */
+#define	TAR_MODE_WWRITE	(00002)	/* write by other */
+#define	TAR_MODE_WEXEC	(00001)	/* execute by other */
+
+/* -----
+ * These are the bits once converted into ASCII
+ * with in an ASCII byte these bits are actually usable so no conversion needed
+ * '0' = 0x30 / 060
+ * '1' = 0x31 / 061
+ * '2' = 0x32 / 062
+ * '3' = 0x33 / 063
+ * '4' = 0x34 / 064
+ * '5' = 0x35 / 065
+ * '6' = 0x36 / 066
+ * '7' = 0x37 / 067
+ */
+#define	TAR_MODE_READ		(0x01)
+#define	TAR_MODE_WRITE		(0x02)
+#define	TAR_MODE_EXEC		(0x04)
+#define TAR_MODE_STICKY		(0x01)
+#define TAR_MODE_GUID		(0x02)
+#define TAR_MODE_SUID		(0x04)
+#define	TAR_MODE_OWNER_BYTE	(6)
+#define	TAR_MODE_GROUP_BYTE	(5)
+#define	TAR_MODE_WORLD_BYTE	(4)
+#define	TAR_MODE_USER_BYTE	(3)
+#define	TAR_MODE_EXEC_BYTE	(2)
+
+/* --------------------
+ * Tar user (and group) numeric IDs are put into 8 bytes.
+ *
+ * There is a '0' prefill and as terminating NUL.
+ *
+ * Older utilities might put preceding ' ' characters or
+ * instead of pre-fill have post fill ' ' or NUL.
+ */
+#define TAR_ID_LEN		(8)
+typedef	char	tar_id		[TAR_ID_LEN];
+
+/* --------------------
+ * Tar file size elements are 12 bytes long with 11 used
+ * for octal characters making the maximum size of a file
+ * for pure classic or Posix tar limited to 8 GBytes.  
+ * Various tar utilities handle longer files in different
+ * ways if at all.
+ *
+ * A length of 100 bytes would be stored as "00000000144".
+ *
+ * Links and some other special values are archived with a
+ * length of zero and thus no data blocks.
+ *
+ * There is a '0' prefill and as terminating NUL.
+ *
+ * Older utilities might put preceding ' ' characters or
+ * instead of pre-fill have post fill ' ' or NUL.
+ *
+ * GNU tar implmentations use alternative intrpretatopms of
+ * this and possibly other fields using mime base 64 or
+ * base 256 (big endian nonstandard sized binary)
+ */
+#define	TAR_SIZE_LEN		(12)
+typedef char	tar_size	[TAR_SIZE_LEN];
+#define MAX_TAR_FILE_SIZE	(077777777777)
+
+/* --------------------
+ * Tar file modification/access/creation times are 12 bytes
+ * long.  This holds 11 octal ASCII digits representing the
+ * number of seconds since 01/01/1970 00:00 UTC.
+ *
+ * There is a '0' prefill and as terminating NUL.
+ *
+ * Older utilities might put preceding ' ' characters or
+ * instead of pre-fill have post fill ' ' or NUL.
+ */
+#define TAR_TIME_LEN		(12)
+typedef	char	tar_time	[TAR_TIME_LEN];
+
+/* --------------------
+ * Tar has a weak checksum protection of part of the tar header
+ * that is 8 bytes long and again uses 7 ASCII octal digits.
+ *
+ * There is a '0' prefill and as terminating NUL.
+ *
+ * Older utilities might put preceding ' ' characters or
+ * instead of pre-fill have post fill ' ' or NUL.
+ */
+#define TAR_CSUM_LEN		(8)
+typedef	char	tar_csum	[TAR_CSUM_LEN];
+#define	csum_blanks		("       ")
+
+/* --------------------
+ * The tar link is a single byte that expresses the type of file
+ * or special value represented by this entry.
+ */
+typedef	char	tar_link;
+
+#define LINKS()                   \
+    link_('\0',OLDNORMAL_FILE)    \
+    link_('0',NORMAL_FILE)        \
+    link_('1',HARD_LINK)          \
+    link_('2',SYMBOLIC_LINK)      \
+    link_('3',CHARACTER_SPECIAL)  \
+    link_('4',BLOCK_SPECIAL)      \
+    link_('5',DIRECTORY)          \
+    link_('6',FIFO)               \
+    link_('7',CONTIGUOUS_FILE)    \
+    link_('A',SOLARIS_ACL)        \
+    link_('D',GNU_DUMPDIR)        \
+    link_('E',SOLARIS_ACL_FILE)   \
+    link_('I',INODE_METADATA)     \
+    link_('K',NEXT_LONG_LINK)     \
+    link_('L',NEXT_LONG_NAME)     \
+    link_('M',MULTI_VOLUME)       \
+    link_('N',GNU1989_LONG_NAMES) \
+    link_('S',SPARSE)             \
+    link_('V',VOLUME_NAME)        \
+    link_('X',SUN_XHDR)           \
+    link_('g',PAX_GLOBAL_XHDR)    \
+    link_('x',PAX_XHDR)
+
+#define link_(v,n)      PASTE_2(LINK_,n) = v,
+
+/* LINK_COUNT is a count not a mac value */
+enum e_tar_link
+{
+    LINKS()
+    LINK_COUNT
+};
+#undef link_
+
+#if _DEBUGGING
+#define link_(v,n) {STRINGIFY(n), v},
+struct nv_pair
+{
+    const char * name;
+    tar_link  link;
+};
+static const char * get_link_string(tar_link l)
+{
+    static const struct nv_pair pairs[] = 
+        {
+            LINKS()
+            {NULL, 0}
+        };
+    unsigned int ix;
+
+    for (ix = 0; pairs[ix].name != NULL; ++ix)
+        if (pairs[ix].link == l)
+            return pairs[ix].name;
+    return "UNDEFINED";
+}
+#undef link_
+#endif
+#undef LINKS
+
+
+/* --------------------
+ * The tar magic string is 6 bytes long.
+ */
+#define	TAR_MAGIC_LEN		(6)
+typedef char	tar_magic	[TAR_MAGIC_LEN];
+#define	POSIX_MAGIC_CONST	"ustar"		/* includes terminating NUL */
+
+/* --------------------
+ * The tar version string is two bytes long and uses both bytes
+ */
+#define	TAR_VERSION_LEN		(2)
+typedef	char	tar_version	[TAR_VERSION_LEN];
+#define	POSIX_VERSION_CONST	"00"		/* does not include terminating NUL */
+
+/* --------------------
+ * The Posix strong user/group name is 32 bytes long
+ */
+#define TAR_STRNAME_LEN		(32)
+typedef	char	tar_strname	[TAR_STRNAME_LEN];
+
+/* --------------------
+ * The dev? strings are 8 bytes long
+ */
+#define	TAR_DEV_LEN		(8)
+typedef	char	tar_dev		[TAR_DEV_LEN];
+
+/* --------------------
+ * Posix prefix is 155 bytes that can be put before the name to give a path of
+ * 255 bytes instad of the smaller limit of 99.
+ */
+#define	TAR_PREFIX_LEN		(155)
+typedef	char	tar_prefix	[TAR_PREFIX_LEN];
+
+/*
+ * Sun extensions
+ */
+
+/* --------------------
+ */
+typedef	char sun_extnum;
+#define	SUN_FULLSIZE_LEN	(10)
+typedef	char	sun_fullsize	[SUN_FULLSIZE_LEN];
+
+/* --------------------
+ * star extensions
+ *
+ * star85 is old star from 1985
+ */
+typedef	char	star85_version;
+#define	STAR85_FILETYPE_LEN	(8)
+typedef char	star85_filetype	[STAR85_FILETYPE_LEN];
+#define	STAR85_TYPE_LEN		(12)
+typedef	char	star85_type	[STAR85_TYPE_LEN];
+#define	STAR85_RDEV_LEN		(12)
+typedef	char	star85_rdev	[STAR85_RDEV_LEN];
+/* ignoring the 11 byte rdev with minor bits */
+#define	STAR85_UNAME_LEN	(16)
+typedef	char	star85_uname	[STAR85_UNAME_LEN];
+#define	STAR85_GNAME_LEN	(15)
+typedef	char	star85_gname	[STAR85_GNAME_LEN];
+#define	STAR_XMAGIC_LEN		(4)
+typedef	char	star_magic	[STAR_XMAGIC_LEN];
+#define	STAR_MAGIC_CONST	("tar")
+#define	NSTAR_PREFIX_LEN	(1)
+typedef	char	nstar_prefix	[NSTAR_PREFIX_LEN];
+
+/* --------------------
+ * gnu extensions
+ */
+#define	GNU89_MAGIC_LEN		(8)
+typedef	char	gnu89_magic	[GNU89_MAGIC_LEN];
+#define	GNU_89_MAGIC_CONST	"ustar  "		/* includes terminating NUL */
+#define	GNU_89_GNUMAGIC_CONST	"GNUtar "		/* includes terminating NUL */
+#define GNU89_LONGNAMES_LEN	(4)
+typedef char	gnu89_longnames	[GNU89_LONGNAMES_LEN];
+
+
+/* --------------------
+ * shared between the feuding star and gnu tar
+ */
+typedef	char	tar_isextended ;
+typedef struct	tar_sparse
+{
+    tar_size	offset;
+    tar_size	num_bytes;
+} tar_sparse;
+#define	GNU_SPARSES_IN_EXTRA_HEADER		(16)
+#define	GNU_SPARSES_IN_OLD_HEADER		(4)
+#define	GNU_SPARSES_IN_SPARSE_HEADER		(21)
+#define	STAR_SPARSES_IN_HEADER			(4)
+#define	STAR_SPARSES_IN_EXT_HEADER		(21)
+
+
+/* ----------------------------------------
+ * The various tar header formats
+ *
+ * Note that in all the tar, posix and pax formats the first 257 bytes are
+ * the same.  In all posix ad almost compliant formats the first
+ * 345 bytes are the same (except GNU 89).  It is abuse of the 155
+ * bytes of the prefix that make star and gnu truly not posix compliant
+ * Sun used the 12 bytes after the prefix so is still psox compliant.
+ */
+typedef	struct	tar_v7_header
+{
+    /* type		member name			 and offset */
+    tar_file_name	name;				/*   0 */
+    tar_file_mode	mode;				/* 100 */
+    tar_id		uid;				/* 108 */
+    tar_id		gid;				/* 116 */
+    tar_size		size;				/* 124 */
+    tar_time		mtime;				/* 136 */
+    tar_csum		csum;				/* 148 */
+    tar_link		link;				/* 156 */
+    tar_file_name	linkname;			/* 157 */
+    /* end of header					// 257 */
+} tar_v7_header;
+
+typedef struct tar_posix_header
+{
+    /* type		member name			 and offset */
+    tar_file_name	name;				/*   0 */
+    tar_file_mode	mode;				/* 100 */
+    tar_id		uid;				/* 108 */
+    tar_id		gid;				/* 116 */
+    tar_size		size;				/* 124 */
+    tar_time		mtime;				/* 136 */
+    tar_csum		csum;				/* 148 */
+    tar_link		link;				/* 156 */
+    tar_file_name	linkname;			/* 157 */
+    tar_magic		magic;				/* 257 */
+    tar_version		version;			/* 263 */
+    tar_strname		uname;				/* 265 */
+    tar_strname		gname;				/* 297 */
+    tar_dev		devmajor;			/* 329 */
+    tar_dev		devminor;			/* 337 */
+    tar_prefix		prefix;				/* 345 */
+    /* end of header					// 500 */
+} tar_posix_header, tar_pax_header;
+
+typedef struct tar_sun_header
+{
+    /* type		member name			 and offset */
+    tar_file_name	name;				/*   0 */
+    tar_file_mode	mode;				/* 100 */
+    tar_id		uid;				/* 108 */
+    tar_id		gid;				/* 116 */
+    tar_size		size;				/* 124 */
+    tar_time		mtime;				/* 136 */
+    tar_csum		csum;				/* 148 */
+    tar_link		link;				/* 156 */
+    tar_file_name	linkname;			/* 157 */
+    tar_magic		magic;				/* 257 */
+    tar_version		version;			/* 263 */
+    tar_strname		uname;				/* 265 */
+    tar_strname		gname;				/* 297 */
+    tar_dev		devmajor;			/* 329 */
+    tar_dev		devminor;			/* 337 */
+    tar_prefix		prefix;				/* 345 */
+    sun_extnum		extnum;				/* 500 non-conformant */
+    sun_extnum		extcount;			/* 501 non-conformant */
+    sun_fullsize	fullsize;			/* 502 non-conformant */
+    /* end of header					// 512 non-conformant */
+} tar_sun_header;
+
+typedef struct tar_star_85_header
+{
+    /* type		member name			 and offset */
+    tar_file_name	name;				/*   0 */
+    tar_file_mode	mode;				/* 100 */
+    tar_id		uid;				/* 108 */
+    tar_id		gid;				/* 116 */
+    tar_size		size;				/* 124 */
+    tar_time		mtime;				/* 136 */
+    tar_csum		csum;				/* 148 */
+    tar_link		link;				/* 156 */
+    tar_file_name	linkname;			/* 157 */
+    star85_version	starversion;			/* 257 non-conformant */
+    star85_filetype	starfiletype;			/* 258 internal type of file? non-conformant */
+    star85_type		startype;			/* 266 type of file (UNIX)? non-conformant */
+    star85_rdev		rdev;				/* 278 non-conformant */
+    tar_time		atime;				/* 290 non-conformant */
+    tar_time		ctime;				/* 302 non-conformant */
+    star85_uname	uname;				/* 314 non-conformant */
+    star85_gname	gname;				/* 330 non-conformant */
+    tar_prefix		prefix;				/* 345 non-conformant */
+    char		___fill0[8];			/* 500 non-conformant */
+    star_magic		xmagic;				/* 508 non-conformant */
+    /* end of header					// 512 non-conformant */
+} tar_star_85_header;
+typedef struct tar_star_94_header
+{
+    /* type		member name			 and offset */
+    tar_file_name	name;				/*   0 */
+    tar_file_mode	mode;				/* 100 */
+    tar_id		uid;				/* 108 */
+    tar_id		gid;				/* 116 */
+    tar_size		size;				/* 124 */
+    tar_time		mtime;				/* 136 */
+    tar_csum		csum;				/* 148 */
+    tar_link		link;				/* 156 */
+    tar_file_name	linkname;			/* 157 */
+    tar_magic		magic;				/* 257 */
+    tar_version		version;			/* 263 */
+    tar_strname		uname;				/* 265 */
+    tar_strname		gname;				/* 297 */
+    tar_dev		devmajor;			/* 329 */
+    tar_dev		devminor;			/* 337 */
+    nstar_prefix	prefix;				/* 345 */
+    char		___fill0;			/* 346 */
+    char		___fill1[8];			/* 347 */
+    tar_isextended	isextended;			/* 355 non-conformant */
+    tar_sparse 		sparse[STAR_SPARSES_IN_HEADER];	/* 356 non-conformant */
+    tar_size		realsize;			/* 452 non-conformant */
+    tar_size		offset;				/* 464 non-conformant */
+    tar_time		atime;				/* 476 non-conformant */
+    tar_time		ctime;				/* 488 non-conformant */
+    char		___fill2[8];			/* 500 */
+    star_magic		xmagic;				/* 508 non-conformant */
+    /* end of header					// 512 */
+} tar_star_94_header;
+
+typedef struct tar_gnu_89_header
+{
+    /* type		member name			 and offset */
+    tar_file_name	name;				/*   0 */
+    tar_file_mode	mode;				/* 100 */
+    tar_id		uid;				/* 108 */
+    tar_id		gid;				/* 116 */
+    tar_size		size;				/* 124 */
+    tar_time		mtime;				/* 136 */
+    tar_csum		csum;				/* 148 */
+    tar_link		link;				/* 156 */
+    tar_file_name	linkname;			/* 157 */
+    gnu89_magic		magic;				/* 257 non-conformant */
+    tar_strname		uname;				/* 265 */
+    tar_strname		gname;				/* 297 */
+    tar_dev		devmajor;			/* 329 */
+    tar_dev		devminor;			/* 337 */
+    tar_time		atime;				/* 345 non-conformant */
+    tar_time		ctime;				/* 357 non-conformant */
+    tar_size		offset;				/* 369 non-conformant */
+    gnu89_longnames	longnames;			/* 381 non-conformant */
+    char		___fill0[1];			/* 385 */
+    tar_sparse		sparse	[GNU_SPARSES_IN_OLD_HEADER];/* 386 optional sparse */
+    tar_isextended	isextended;			/* 482 non-conformant */
+    tar_size		realsize;			/* 483 non-conformant */
+    /* end of header					// 495 */
+} tar_gnu_89_header;
+
+typedef struct tar_gnu_99_header
+{
+    /* type		member name			 and offset */
+    tar_file_name	name;				/*   0 */
+    tar_file_mode	mode;				/* 100 */
+    tar_id		uid;				/* 108 */
+    tar_id		gid;				/* 116 */
+    tar_size		size;				/* 124 */
+    tar_time		mtime;				/* 136 */
+    tar_csum		csum;				/* 148 */
+    tar_link		link;				/* 156 */
+    tar_file_name	linkname;			/* 157 */
+    gnu89_magic		magic;				/* 257 non-conformant */
+    tar_strname		uname;				/* 265 */
+    tar_strname		gname;				/* 297 */
+    tar_dev		devmajor;			/* 329 */
+    tar_dev		devminor;			/* 337 */
+    tar_time		atime;				/* 345 non-conformant */
+    tar_time		ctime;				/* 357 non-conformant */
+    tar_size		offset;				/* 369 non-conformant */
+    gnu89_longnames	longnames;			/* 381 non-conformant */
+    char		___fill0[1];			/* 385 */
+    tar_sparse		sparse	[GNU_SPARSES_IN_OLD_HEADER];/* 386 non-conformant optional sparse */
+    tar_isextended	isextended;			/* 482 non-conformant */
+    tar_size		realsize;			/* 483 non-conformant */
+    /* end of header					// 495 */
+} tar_gnu_99_header;
+
+typedef struct tar_sparse_header
+{
+    /* type		member name			 and offset */
+    tar_sparse		sparse	[STAR_SPARSES_IN_EXT_HEADER];/* 0 */
+    tar_isextended	isextended;			/* 504 */
+} tar_sparse_header;					/* 505 end of header */
+
+typedef struct tar_cpio_header
+{
+    /* type		member name			 and offset */
+    char		magic		[6];		/*   0	must be "070707" */
+#define	TAR_CPIO_MAGIC_CONST ("070707")
+    char		dev		[6];		/*   6  (dev,ino) is unique for each file in archive */
+    char		ino		[6];		/*  12  see dev */
+    char		mode		[6];		/*  18 */
+    char		uid		[6];		/*  24 */
+    char		gif		[6];		/*  30 */
+    char		nlink		[6];		/*  36 */
+    char		rdev		[6];		/*  42 */
+    char		mtime		[11];		/*  48 */
+    char		namesize	[6];		/*  59 */
+    char		filesize	[6];		/*  65 */
+    char		buff		[1];		/*  71  name and file data */
+} tar_cpio_header;
+
+typedef union tar_header
+{
+    /* ----------
+     * The TAR header is to be zero filled by definition but some tar
+     * programs use ' ' instead.
+     *
+     * accept zeros ('0'), spaces (' ') or NULs (0x00) as equivalent where reasonable
+     *
+     * This name refers to the entire header as a single undifferentiated
+     * sequence of bytes.
+     */
+    tar_raw_block	raw;		/* tar block as an array of bytes: used for 0 blocks here */
+    tar_cpio_header	cpio;		/* cpio not really tar */
+    tar_v7_header	tar;		/* classic header back to the beginnings of memory */
+    tar_posix_header	posix;		/* ustar or Posix 1003.1 header */
+    tar_sun_header	suntar;		/* Sun Microsystems tar header */
+    tar_star_85_header	star_85;	/* star header from 1985 (pre-Posix) */
+    tar_star_94_header	star_94;	/* star header from 1994 (post-Posix) */
+    tar_gnu_89_header	gnu_89;		/* gnu header from circa 1989 (post-posix but broken) */
+    tar_gnu_99_header	gnu_99;         /* gnu header from ???? */
+    tar_sparse_header	sparse;		/* star / gnu extended sparses header */
+} tar_header;
+
+
+/* ======================================================================
+ * local module-wide function like macros
+ */
+/* -----
+ * offset of is the count of bytes between the base of a structure and 
+ * a particular member of that structure
+ */
+#define	OFFSET_OF(structure,member) ((size_t)((&(((structure*)0)->member))-(0)))
+
+
+/* ======================================================================
+ * compilation unit local functions
+ */
+
+/* ======================================================================
+ * return the RFC 2045 base 64 value for a byte character 
+ * -1 for any out of range
+ *
+ * base 64 uses A-Z as 0-25, a-z as 26-51, 0-9 as 52-61, + as 62 and / as 63
+ */
+static int64_t decode_base64char (uint8_t byte)
+{
+    /* 
+     * trade off of space for table versus time to upsize the return
+     * and reupsize where it is used
+     */
+    static const int8_t table[] = 
+	{
+	    /*
+	     * 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
+	     */
+	    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 00 */
+	    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 10 */
+	    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63, /* 20 */
+	    52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1, /* 30 */
+	    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, /* 40 */
+	    15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, /* 50 */
+	    -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, /* 60 */
+	    41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1, /* 70 */
+	    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 80 */
+	    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 90 */
+	    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* A0 */
+	    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* B0 */
+	    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* C0 */
+	    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* D0 */
+	    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* E0 */
+	    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1  /* F0 */
+	};
+    return table[byte];
+}
+
+
+/* ======================================================================
+ * return the RFC 2045 base 64 value of a string at <str> of length <len>
+ *
+ * Interpreted the specification to mean that you simply ignore any out
+ * of range characters.  They are not treated as bytes of 0 as that would
+ * mean a shift of earlier bytes.
+ *
+ * Each character is 6 bits of the final value.
+ */
+static int64_t decode_base64string (const uint8_t* str, size_t len)
+{
+    int64_t 	result = 0;
+    int64_t 	temp = 0;
+    size_t 	ix;
+
+    for (ix = 0; ix < len; ++ix)
+    {
+	if ((temp = decode_base64char(str[ix])) >= 0)
+	{
+	    result <<= 6; /* result *= 64 */
+	    result += temp;
+	}
+    }
+    return result;
+}
+
+
+/* ======================================================================
+ * tar_strtoll
+ *
+ * This function will convert a string in a tar header into a 64 signed
+ * integer.
+ *
+ * The original tar header used just octal numbers in ascii in fixed length
+ * fields.  As normal in the computer software world these "obviously plenty
+ * big" fields became way too small.
+ *
+ * GNU tar invented two approaches to make these numeric fields "bigger" but
+ * only prolonged the pain by squeezing the new numbers into the same fields.
+ *
+ * In the tar v7 and ustar based tar headers the fields are:
+ *	Name	Size	Octal Range	Interpretation
+ *	mode	8	0-2097151 	bit flags
+ *	uid	8	0-2097151
+ *	gid	8	0-2097151
+ *	size	12	0-8589934591	up to 8 Giga-Byte files
+ *	mtime	12	0-8589934591 	1970/01/01 00:00:00 GMT-2242/03/16 12:56:31 GMT
+ *	
+ *	atime	12	0-8589934591 	1970/01/01 00:00:00 GMT-2242/03/16 12:56:31 GMT
+ *	ctime	12	0-8589934591 	1970/01/01 00:00:00 GMT-2242/03/16 12:56:31 GMT
+ *
+ * GNU's first and already obsolete approach was to put Mime base-64 numbers
+ * With these the first byte is '+' or '-' to signal it isn't octal ASCII.
+ *
+ * GNU's second approach is base-256 which is a big endian binary string of lengths other
+ * than the 1, 2, 4 or 8 bytes of the standard integer types.  In this approach the first
+ * byte is either 0x80 for a positive number or 0xFF for a negative number.
+ */
+
+static int64_t tar_strtoll ( const uint8_t * str, size_t len, bool silent )
+{
+    int64_t	result = 0;
+    bool negative = false;
+    uint8_t temp_buff[24];	/* long enough to hold all octal bytes for 64 bit numbers */
+
+    /* -----
+     * force a NUL in case the source doesn't have one; this is for
+     * strtoll() on ASCII Octal
+     */
+    if ( len >= sizeof temp_buff )
+        len = sizeof temp_buff - 1;
+    memmove (temp_buff, str, len);
+    temp_buff[ len ] = 0x00;
+
+    /* -----
+     * Most are going to be simple ASCII octal using '0'-'7' with NUL terminator
+     * leading 0 is not required but of course is accepted to match tar 
+     * header specifications
+     */
+    if (((temp_buff[0] >= '0')&&(temp_buff[0] <= '7'))||(temp_buff[0] == ' '))
+    {
+        /* use stdlib strtoll - longest expected goes a few bits into the upper longword */
+        result = strtoi64((char*)temp_buff,NULL,8);
+    }
+    /* -----
+     * "base-256" well that is "binary" big endian of some length
+     *
+     * For fields longer than eight bytes upper bytes will shift out of 
+     * significance into the bit bucket.
+     */
+    else if ((temp_buff[0] == 0x80)||(temp_buff[0] == 0xFF)) /* from GNU tar */
+    {
+        unsigned int ix;
+        negative = (bool)((temp_buff[0] == 0xFF) ? true : false);
+        result = temp_buff[0] & 0x7F; /* toss first flag bit */
+        for (ix = 1; ix < len; ++ix)
+        {
+            result <<= 8; /* result *= 256; */
+            result += temp_buff[ix];
+        }
+        if (negative)
+            result = -result;
+    }
+    /* -----
+     * "base-64" an already dumped idea from GNU tar
+     */
+    else if ((temp_buff[0] == '+')||(temp_buff[0] == '-')) /* from GNU tar */
+    {
+        int64_t temp;
+        negative = (bool)((temp_buff[0] == '-') ? true : false);
+        temp = decode_base64string(temp_buff+1,len-1);
+        /* potential overflow */
+        result = negative ? -temp : temp;
+    }
+
+    /* -----
+     * look for an empty field of all NUL
+     */
+    else if (temp_buff[0] == 0x00)
+    {
+        unsigned int ix;
+        for (ix = 1; ix < len; ++ix)
+        {
+            if (temp_buff[ix] != 0x00)
+                goto fail;
+        }
+    }
+    /* -----
+     * no idea what it is then
+     */
+    else
+    {
+    fail:
+        result = 0; /* as good a guess as any */
+        TAR_DEBUG (("%s: unknown integer storage type %c%c%c%c%c%c%c%c\n",
+                    temp_buff[0],temp_buff[1],temp_buff[2],temp_buff[3],
+                    temp_buff[4],temp_buff[5],temp_buff[6],temp_buff[7]));
+        if ( ! silent ) {
+            PLOGMSG (klogErr, (klogErr, "unknown integer storage type "
+                                     "$(B0)$(B1)$(B2)$(B3)$(B4)$(B5)$(B6)$(B7)",
+                           "B0=%c,B1=%c,B2=%c,B3=%c,B4=%c,B5=%c,B6=%c,B7=%c",
+                           temp_buff[0],temp_buff[1],temp_buff[2],temp_buff[3],
+                           temp_buff[4],temp_buff[5],temp_buff[6],temp_buff[7]));
+        }
+    }
+    return result;
+}
+
+/* ======================================================================
+ * tar_header_type
+ * determine most probable tar header block type
+ */
+static tar_header_type	what_header_type(const tar_header* header)
+{
+    /* -----
+     * we'll assume its bad until we find a better guess
+     */
+    tar_header_type type = TAR_UNDEFINED;
+
+    /* -----
+     * look for a cpio header though we aren't expecting to support it quite yet
+     */
+    if (strncmp(header->cpio.magic, TAR_CPIO_MAGIC_CONST, sizeof(header->cpio.magic)) == 0)
+    {
+	type = TAR_CPIO;
+    }
+    /* -----
+     * look for extended headers of some type
+     *
+     * look for posix based extensions as hopefully most likely
+     */
+    else if (strcmp(header->posix.magic, POSIX_MAGIC_CONST) == 0)
+    {
+	/* -----
+	 * we have a post posix standard tar header but we aren't done yet
+	 *
+	 * First we look for star extensions to the header
+	 */
+	if (strcmp(header->star_94.xmagic, STAR_MAGIC_CONST) == 0)
+	{
+
+	    /* -----
+	     * we have either an old or new star archive
+	     */
+	    if (strcmp(header->star_94.magic, POSIX_MAGIC_CONST) == 0)
+	    {
+		/* -----
+		 * we have a new star type archive
+		 */
+		type = TAR_STAR_94;
+	    }
+	    else
+	    {
+		/* -----
+		 * we have a old star type archive
+		 */
+		type = TAR_STAR_85;
+	    }
+	}
+	/* -----
+	 * Next we look for SunOS5 extensions to the header
+	 */
+	else if (header->suntar.extnum &&
+		 header->suntar.extcount &&
+		 header->suntar.fullsize[0])
+	{
+	    type = TAR_SUN;
+	}
+	/* -----
+	 * Else it seems to be the generic Posix tar header
+	 */
+	else
+	{
+	    type = TAR_POSIX;
+	}
+    }
+    /* -----
+     * Not a proper magic for a POSIX ustar header so look for the improper magic of GNU's tar
+     */
+    else if (strcmp(header->star_94.magic, GNU_89_MAGIC_CONST) == 0)
+    {
+	/* we have an old GNU not really posix compliant archive type */
+	type = TAR_GNU_89;
+    }
+    /* -----
+     * If there is anything else there we don't know what to do with it
+     */
+    else if (header->posix.magic[0] != 0)
+    {
+	/* -----
+	 * Log an anomaly showing what we found in the magic field
+	 */
+	char temp_str	[9];
+	memset(temp_str,0,sizeof(temp_str));
+	string_copy(temp_str, sizeof(temp_str), header->posix.magic, 8);
+        TAR_DEBUG(("%s: unknown header type magic [%s]\n",
+                   __func__, temp_str));
+	type = TAR_UNDEFINED;
+    }
+    /* -----
+     * not knowing what we have lets see if it is a block of all zeroes
+     * knowing we can ignore it
+     */
+    else
+    {
+	/* -----
+	 * If this were a legitimate V7 (well just old style)
+	 * tar header the first character would be non-NUL
+	 * and the link would be on eof the old types
+	 */
+	if ((header->raw[0]>= ' ')&&(header->raw[0] <= '~'))
+	{
+	    switch (header->tar.link)
+	    {
+	    case LINK_OLDNORMAL_FILE:
+	    case LINK_NORMAL_FILE:
+	    case LINK_HARD_LINK:
+	    case LINK_SYMBOLIC_LINK:
+	    case LINK_CHARACTER_SPECIAL:
+	    case LINK_BLOCK_SPECIAL:
+	    case LINK_DIRECTORY:
+	    case LINK_FIFO:
+	    case LINK_CONTIGUOUS_FILE:
+		/* GNU TAR will do this to us */
+	    case LINK_NEXT_LONG_LINK:
+	    case LINK_NEXT_LONG_NAME:
+	    case LINK_GNU1989_LONG_NAMES:
+		type = TAR_V7;
+		break;
+	    default:
+		break;
+	    }
+	}
+	else
+	{
+	    /* -----
+	     * look for anything not zero
+	     */
+	    unsigned int ix;
+
+	    for (ix = 0; ix < sizeof(tar_header); ++ix)
+	    {
+		if (header->raw[ix])
+		{
+		    /* -----
+		     * non-zero so quit looking
+		     */
+		    break;
+		}
+	    }
+	    /* -----
+	     * if we got to the end we know they are all zero so say so
+	     */
+	    if (ix == sizeof(tar_header))
+	    {
+		type = TAR_ZERO_BLOCK;
+	    }
+	}
+    }
+    TAR_DEBUG (("%s: %s(%d)\n", __func__, get_type_string(type), type));
+    return type;
+}
+
+
+typedef struct sparse_data
+{
+    struct sparse_data*	next;
+    uint64_t		offset;
+    uint64_t		size;
+} sparse_data;
+/* ======================================================================
+ */
+
+static rc_t	sparse_data_make (sparse_data ** new_item, uint64_t offset, uint64_t size)
+{
+    sparse_data * p;
+
+    p = malloc (sizeof (sparse_data));
+    if (p != NULL)
+    {
+        p->offset = offset;
+        p->size = size;
+        p->next = NULL;
+        *new_item = p;
+        return 0;
+    }
+	return -1;
+}
+
+static rc_t	sparse_data_push(sparse_data ** q, uint64_t offset, uint64_t size)
+{
+    if (q == NULL)
+        return -1;
+    if (*q == NULL)
+        return sparse_data_make (q, offset, size);
+    return sparse_data_push (&((*q)->next), offset, size);
+}
+
+static rc_t	sparse_data_pop (sparse_data ** q, sparse_data **item)
+{
+    if ((q == NULL) || (item == NULL))
+        return -1;
+
+	*item = *q;
+	*q = (*item)->next;
+	(*item)->next = NULL;
+	return 0;
+}
+
+static rc_t	sparse_data_kill (sparse_data ** q)
+{
+    if (q == NULL)
+        return -1;
+    if (*q == NULL)
+        return 0;
+    if ((*q)->next != NULL)
+        return sparse_data_kill(&(*q)->next);
+
+    free (*q);
+    *q = NULL;
+    return 0;
+}
+
+/* ======================================================================
+ * local module-wide variables (reduction in parameter pushing)
+ *
+ * Module shared variables; kinda like C++ class elements
+ */
+typedef struct KTarState
+{
+    /* TODO: optimize chunk/sparse lists by counting as pushed */
+    const KFile *	kfile;		/* KFS reference to the specific file being parsed */
+    const KMMap *	kmmap;		/* KFS memory mapping for a portion of that file */
+    const void *	map;		/* where the tar file got put by mmap */
+    sparse_data * 	sparse_q;
+    KTocChunk *		chunks;		/* table of chunks: logical_position, source_position, size */
+    KToc *		toc;		/* the Table of Contents we are building */
+    size_t		tar_length;	/* how long is the tar file */
+    size_t		buffer_length;	/* how long is the window into the buffer */
+    uint64_t		buffer_start;	/* how far into the tar file is the buffer start */
+    uint64_t		buffer_limit;	/* how far into the tar file is the buffer end */
+    uint32_t		num_chunks;
+    /* -----
+     * zero blocks are only supposed to pad out the end of a tar file to
+     * match a larger block size.  If we find something after a zero block
+     * it is a file error of some type
+     */
+    bool		found_zero_block;
+    bool		found_second_zero_block;
+} KTarState;
+
+static rc_t make_chunk_list(KTarState * self, uint64_t file_offset)
+{
+    uint64_t		count = self->num_chunks;
+    uint64_t		source_position = file_offset;
+    uint64_t		ix;
+    sparse_data * 	psd;
+    rc_t		ret;
+
+    if (self->chunks)
+	free (self->chunks); /* shouldn't happen */
+    self->chunks = malloc( (size_t)( count * sizeof(KTocChunk) ) );
+    if (self->chunks == NULL)
+	return -1;
+
+
+    for (ix = 0; ix < count; ++ix)
+    {
+	ret = sparse_data_pop (&self->sparse_q, &psd);
+	if (ret != 0)
+	    return ret;
+	self->chunks[ix].logical_position = psd->offset;
+	self->chunks[ix].source_position = source_position;
+	self->chunks[ix].size = psd->size;
+	source_position += psd->size;
+	sparse_data_kill(&psd);
+    }
+    return 0;
+}
+
+static void whack_chunk_list(KTarState * self)
+{
+    free (self->chunks);
+    self->chunks = NULL;
+    self->num_chunks = 0;
+}
+
+#if HANDLING_EXTENDED_HEADERS
+/* ======================================================================
+ * mini class for handling pax/posix/ustar 
+ * extended headers and global extended headers
+ *
+ * Many of the values are included to get past range limits imposed by the ustar format
+ * particular for string length and charcter set or shortish integral values.  <ekyword>
+ * and <value> below are UTF-8.
+ *
+ * values in the header are string values written as with a 'printf' using the form
+ *	printf("%d %s=%s\n",<length>,<keyword>,<value>)
+ *
+ * <length> is described ambiguously as 
+ *	"The <length> field shall be the decimal length of the extended header record in octets,
+ *	 including the trailing <newline>."
+ * So does that include the length of <length>? or not?
+ *
+ * The field <keyword> is allowed in a pax Extended Header include but are not limited to
+ *	atime		time_t but with fractional seconds maybe
+ *	charset		enumeration list
+ *	comment		human readable comments
+ *	gid		integer gid allowing numbers greater than ustar limit of 2097151 (07777777)
+ *	gname		over rides xhdr gid and ustar gname and gid
+ *	linkpath
+ *	mtime		time_t but with franctional seconds maybe
+ *	path
+ *	realtime.<ANY>
+ *	security.<ANY>
+ *	size
+ *	uid		integer uid allowing numbers greater than ustar limit of 2097151 (07777777)
+ *	uname
+ * Any other keywords desired can be included but might not be meaningful to many applications.
+ * Keyword can have pretty much any character in it except '='.
+ *
+ * <value> is a UTF-8 string that ends with the '\n'.
+ * 
+ *
+ * charset is limited to (omit the quotation marks)
+ *      <value>			  Formal Standard
+ * "ISO-IR 646 1990"		ISO/IEC 646:1990
+ * "ISO-IR 8859 1 1998"		ISO/IEC 8859-1:1998
+ * "ISO-IR 8859 2 1999"		ISO/IEC 8859-2:1999
+ * "ISO-IR 8859 3 1999"		ISO/IEC 8859-3:1999
+ * "ISO-IR 8859 4 1998"		ISO/IEC 8859-4:1998
+ * "ISO-IR 8859 5 1999"		ISO/IEC 8859-5:1999
+ * "ISO-IR 8859 6 1999"		ISO/IEC 8859-6:1999
+ * "ISO-IR 8859 7 1987"		ISO/IEC 8859-7:1987
+ * "ISO-IR 8859 8 1999"		ISO/IEC 8859-8:1999
+ * "ISO-IR 8859 9 1999"		ISO/IEC 8859-9:1999
+ * "ISO-IR 8859 10 1998"	ISO/IEC 8859-10:1998
+ * "ISO-IR 8859 13 1998"	ISO/IEC 8859-13:1998
+ * "ISO-IR 8859 14 1998"	ISO/IEC 8859-14:1998
+ * "ISO-IR 8859 15 1999"	ISO/IEC 8859-15:1999
+ * "ISO-IR 10646 2000"		ISO/IEC 10646:2000
+ * "ISO-IR 10646 2000 UTF-8"	ISO/IEC 10646, UTF-8 encoding
+ * "BINARY"			None.
+ */
+typedef enum pax_charset
+{
+    PAX_CS_NOT_SPECIFIED,
+    PAX_CS_ISO_IR_646_1990,
+    PAX_CS_ISO_IR_8859_1_1998,
+    PAX_CS_ISO_IR_8859_2_1999,
+    PAX_CS_ISO_IR_8859_3_1999,
+    PAX_CS_ISO_IR_8859_4_1998,
+    PAX_CS_ISO_IR_8859_5_1999,
+    PAX_CS_ISO_IR_8859_6_1999,
+    PAX_CS_PAX_CS_ISO_IR_8859_7_1997,
+    PAX_CS_ISO_IR_8859_8_1999,
+    PAX_CS_ISO_IR_8859_9_1999,
+    PAX_CS_ISO_IR_8859_10_1998,
+    PAX_CS_ISO_IR_8859_13_1998,
+    PAX_CS_ISO_IR_8859_14_1998,
+    PAX_CS_ISO_IR_8859_15_1998,
+    PAX_CS_ISO_IR_1064_2000,
+    PAX_CS_ISO_IR_1064_2000_UTF_8,
+    PAX_CS_BINARY
+} pax_charset;
+
+static const char * pax_charset_strings[] = 
+{
+    "Not Specified",
+    "ISO-IR 646 1990",
+    "ISO-IR 8859 1 1998",
+    "ISO-IR 8859 2 1999",
+    "ISO-IR 8859 3 1999",
+    "ISO-IR 8859 4 1998",
+    "ISO-IR 8859 5 1999",
+    "ISO-IR 8859 6 1999",
+    "ISO-IR 8859 7 1987",
+    "ISO-IR 8859 8 1999",
+    "ISO-IR 8859 9 1999",
+    "ISO-IR 8859 10 1998",
+    "ISO-IR 8859 13 1998",
+    "ISO-IR 8859 14 1998",
+    "ISO-IR 8859 15 1999",
+    "ISO-IR 10646 2000",
+    "ISO-IR 10646 2000 UTF-8",
+    "BINARY",
+    NULL
+};
+
+static pax_charset pax_xhdr_parse_charset_string(char*string)
+{
+    int ix;		/* index */
+    const char * ps;	/* pointer to string */
+
+    for (ps = pax_charset_strings[ix= 0]; ps; ps = pax_charset_strings[++ix])
+	if (strcmp(ps,string) == 0)
+	    return ix;
+    return PAX_CS_NOT_SPECIFIED;	/* matched none so set it to not specified */
+}
+
+typedef struct pax_xheader pax_xheader;
+struct pax_xheader
+{
+    char *	path;		/* supercedes .posix.name */
+    char *	linkpath;	/* supercedes .posix.linkname */
+    char *	uname;		/* user name supercedes .posix.uname uid and .posix.uid */
+    char *	gname;		/* group name supercedes .posix.gname gid and .posix.gid */
+    time_t	atime;		/* supercedes .posix.atime */
+    time_t	mtime;		/* supercedes .posix.mtime */
+    uid_t	uid;		/* supercedes .posix.uid */
+    uint32_t	gid;		/* supercedes .posix.gname */
+    uint64_t	size;		/* supercedes .posix.size */
+    pax_charset	charset;	/* not supported by us? */
+};
+
+static pax_xheader *	pax_xhdr_create (void)
+{
+    pax_xheader * pxv = malloc (sizeof(pax_xheader));
+    memset (pxv,0,sizeof(pax_xheader));
+    return pxv;
+}
+
+static void	pax_xhdr_delete(pax_xheader * self)
+{
+    if (self->path)
+	free (self->path);
+    if (self->linkpath)
+	free (self->linkpath);
+    if (self->uname)
+	free (self->uname);
+    if (self->gname)
+	free (self->gname);
+    free (self);
+}
+
+static rc_t  pax_xhdr_set_general_string (char ** str, const char * val)
+{
+    size_t	len;	/* how much memory */
+    char      *	nl;	/* point to any new line in source */
+    rc_t	rc = 0;	/* return code; assume success */
+
+    if (*str)		/* if already set, free the old value */
+	free (*str);
+    nl = strchr (val, '\n');
+    if (nl)
+    {
+	len = nl - val + 1; /* +1 for NUL */
+    }
+    else
+    {
+        size_t size;
+        len = string_measure(val, &size) + 1;
+    }
+    *str = malloc (len);
+    if (*str)
+    {
+        string_copy(*str, len, val, len-1);
+        (*str)[len-1] = '\0'; /* if it was a '\n' terminated value this is needed not worth the check if needed */
+    }
+    else
+    {
+	rc = RC(rcFS/*?*/,rcAllocating,0/*?*/,rcNoObj/*?*/,rcNull); /* well its not 0 */
+    }
+    return rc;
+}
+
+/* ----------
+ * new_path points to a string that ends with either a '\n' or a NUL
+ */
+LIB_EXPORT rc_t CC pax_xhdr_set_path(pax_xheader * self, char * new_path)
+{
+    return pax_xhdr_set_general_string(&(self->path),new_path);
+}
+
+/* ----------
+ * new_path points to a string that ends with either a '\n' or a NUL
+ */
+LIB_EXPORT rc_t CC pax_xhdr_set_linkpath(pax_xheader * self, char * new_path)
+{
+    return pax_xhdr_set_general_string(&(self->linkpath),new_path);
+}
+
+/* ----------
+ * new_name points to a string that ends with either a '\n' or a NUL
+ */
+LIB_EXPORT rc_t CC pax_xhdr_set_uname(pax_xheader * self, char * new_name)
+{
+    return pax_xhdr_set_general_string(&(self->uname),new_name);
+}
+
+/* ----------
+ * new_name points to a string that ends with either a '\n' or a NUL
+ */
+LIB_EXPORT rc_t CC pax_xhdr_set_gname(pax_xheader * self, char * new_name)
+{
+    return pax_xhdr_set_general_string(&(self->gname),new_name);
+}
+
+LIB_EXPORT bool CC pax_xhdr_get_general_string (char**src, char**dst, size_t max)
+{
+    size_t size;
+    if (string_measure(*src, &size) > max-1)	/* fail if too big for target */
+    {
+        return false;
+    }
+    string_copy(*dst, max, *src, size);
+    return true;
+}
+
+LIB_EXPORT rc_t CC pax_xhdr_get_path(pax_xheader * self, char ** path, size_t max)
+{
+    return (pax_xhdr_get_general_string(&self->path,path,max))? 0 : ~0;
+}
+
+LIB_EXPORT rc_t CC pax_xhdr_get_linkpath(pax_xheader * self, char ** path, size_t max)
+{
+    return (pax_xhdr_get_general_string(&self->linkpath,path,max))? 0 : ~0;
+}
+
+LIB_EXPORT rc_t CC pax_xhdr_get_uname(pax_xheader * self, char ** name, size_t max)
+{
+    return (pax_xhdr_get_general_string(&self->uname,name,max))? 0 : ~0;
+}
+
+LIB_EXPORT rc_t CC pax_xhdr_get_gname(pax_xheader * self, char ** name, size_t max)
+{
+    return (pax_xhdr_get_general_string(&self->gname,name,max))? 0 : ~0;
+}
+
+/* ----------
+ * The mtime and atime <value> is defined as
+ *	The pax utility shall write an mtime record for each file in write
+ *	or copy modes if the file's modification time cannot be represented
+ *	exactly in the ustar header logical record described in ustar
+ *	Interchange Format. This can occur if the time is out of ustar range,
+ *	or if the file system of the underlying implementation supports
+ *	non-integer time granularities and the time is not an integer. All of
+ *	these time records shall be formatted as a decimal representation of
+ *	the time in seconds since the Epoch. If a period ( '.' ) decimal
+ *	point character is present, the digits to the right of the point shall
+ *	represent the units of a subsecond timing granularity, where the first
+ *	digit is tenths of a second and each subsequent digit is a tenth of
+ *	the previous digit. In read or copy mode, the pax utility shall
+ *	truncate the time of a file to the greatest value that is not greater
+ *	than the input header file time. In write or copy mode, the pax
+ *	utility shall output a time exactly if it can be represented exactly
+ *	as a decimal number, and otherwise shall generate only enough digits
+ *	so that the same time shall be recovered if the file is extracted on a
+ *	system whose underlying implementation supports the same time
+ *	granularity.
+ *
+ * So...
+ * Looks like for our purposes we ignore anything after a possible decimal
+ * point and just use the integer part of whatever is there and just not be
+ * to worried about it since we aren't creating any of this, just reading ie.
+ */
+static rc_t	pax_xhdr_set_general_time (const char * ts, time_t * tt)
+{
+    uint64_t temp = strtou64(ts,NULL,10); /* tosses decimal part for us */
+
+    if (temp)
+        *tt = (time_t)temp;
+    return temp ? 0 : ~0;
+}
+
+/* ======================================================================
+ * This is the data accumulated for each entry in a tar file.
+ */
+static struct	tar_entry_data
+{
+    /* -----
+     * We are not using linux (or other O/S specific) type here because the ranges
+     * for the system creating the archive might have larger types than the system
+     * we are running on.  We'll leave it to the outside caller of this program to
+     * "make it fit".
+     */
+
+    
+    entry_type	type;
+
+    char *	path;
+    char *	link;
+
+    uint64_t	size;
+    uint64_t	offset;
+
+    mode_t	mode;
+
+    char *	uname;
+    uid_t	uid;
+
+    char *	gname;
+    uint32_t	gid;
+
+    time_t	mtime;
+    time_t	atime;
+    time_t	ctime;
+
+} tar_entry_data;
+#endif
+/* ======================================================================
+ * Mapping a memory region
+ *
+ * This will have two versions:
+ *	initially for development it will make raw Linux O/S calls
+ *	quickly it will be ported to use KFS structures instead
+ */
+/* -----
+ * Use a map window size of a gigabyte
+ * Life would be really bad if a single header was with in pagesize of that gigabyte
+ * This assumes that a gigabyte is a multiple of system pagesize - a very safe bet.
+ */
+#define	MAP_WINDOW_SIZE	(1024*1024*1024)
+
+/* ----------
+ * map_tar_file
+ *
+ * This function uses existing members of the ktar state structure and a single parameter
+ * to decide what part of a file to map.
+ *
+ * IN: offset: 	an uint64_t type of where the starting point with in the file the memory mapped region
+ *		should start
+ * SIDE:	side effects are a freeing of any existing memory mapped region of a file and
+ *		if successful mappinga region it will have mapped that region and put real
+ *		parameters describing that region in the private memory block
+ */
+static
+rc_t map_tar_file (KTarState * self, uint64_t requested_offset)
+{
+    rc_t  ret = 0;
+
+    /* -----
+     * If we are mapping for the first time
+     */
+    if (self->kmmap == NULL)
+    {
+	ret = KMMapMakeMaxRead(&self->kmmap,self->kfile);
+	if (ret)
+	    return ret;
+	ret = KMMapSize(self->kmmap, &self->buffer_length);
+	if (ret)
+	    return ret;
+    }
+    /* -----
+     * if we are remapping the region
+     */
+    else
+    {
+	ret = KMMapReposition(self->kmmap, requested_offset, &self->buffer_length);
+	if (ret)
+	    return ret;
+    }
+    ret = KMMapAddrRead(self->kmmap, &self->map);
+    if (ret)
+	return ret;
+    ret = KMMapPosition(self->kmmap, &self->buffer_start);
+    if (ret)
+	return ret;
+    ret = KMMapSize(self->kmmap, &self->buffer_length);
+    if (ret)
+	return ret;
+    self->buffer_limit = self->buffer_start + self->buffer_length;
+
+    return ret;
+}
+
+static
+rc_t release_map (KTarState * self)
+{
+    KMMapRelease (self->kmmap);
+    self->kmmap = NULL;
+    return 0;
+}
+
+/* ======================================================================
+ *
+ * offset is the byte position within the tar file
+ * hard_limit is the byte position with in the tar file that is not mapped
+ *
+ * This is the ugliest function/method in the whole module.  The extensions
+ * to the tar header are not done in a consistent manner so convolutions
+ * have to be made to support all manner of extensions.
+ */
+static
+uint64_t process_one_entry (KTarState * self, uint64_t offset, uint64_t hard_limit, bool silent)
+{
+    /* -----
+     * full_path will store the full path of an element which can be longer than 
+     * will fit in the standard tar header.  This will also usually be an output
+     * to the consumer.
+     */
+    char full_path [ 4096 ];
+
+    /* -----
+     * full_path will store the full link (if any) of an element which can be longer than 
+     * will fit in the standard tar header.  This will also usually be an output
+     * to the consumer.
+     */
+    char full_link [ 4096 ];
+
+    /* -----
+     * data_offset will index into the tar file where the data portion for the current header
+     * lies. (Usually at the address of the header + 512)  This will also usually be an output
+     * to the consumer.
+     */
+    uint64_t data_offset = 0;
+
+    /* -----
+     * data_size will hold the size of the data portion for the current header.  This will also
+     * usually be an output to the consumer.
+     */
+    uint64_t data_size = 0;
+
+    /* -----
+     * virtual_data_size will hold the virtual size of a sparse file.  This will also
+     * usually be an output to the consumer.
+     */
+    uint64_t virtual_data_size = 0;
+    /* -----
+     * type is an enumerated type that described the format of the tar header.  Its initialized
+     * to an invalid header type.
+     */
+    tar_header_type	type = TAR_UNDEFINED;
+
+    /* -----
+     * link is an enumerated type that described the contents of this element.
+     */
+    tar_link link = LINK_OLDNORMAL_FILE;
+
+#if _DEBUGGING && 0
+/* We are not using these components of the tar header block at this point 
+ * but with a debug build it doesn't hurt to verify we fully understand the
+ * header.
+ */
+    uid_t  uid = 0;
+    uint32_t gid = 0;
+#endif
+    time_t mtime = 0;
+    mode_t mode = 0;
+
+    /* -----
+     * current_offset is the offset of the current header which might be a different header 
+     * than the one we started with.
+     */
+    uint64_t current_offset = offset;
+
+    /* -----
+     * we can access the header either as a sequence of bytes or as a
+     * header structure.  That header can further be accessed as one of
+     * several more specific types of header.
+     */
+    union
+    {
+        const uint8_t *    b;
+        const tar_header * h;
+    } current_header;
+
+    /* -----
+     * done is a flag as to when we are finished processing a tar element
+     * that might have multiple headers and other elements
+     */
+    bool done = false;
+
+    /* -----
+     * gnu_sparse is a flag that we are currently inside a sparse file
+     * with in the TAR and have more sparse header elements to parse
+     */
+    bool gnu_sparse = false;
+
+    TAR_FUNC_ENTRY();
+
+    /* -----
+     * check right away to make sure we are still in our memory mapped window
+     */
+    if (offset > self->buffer_limit)
+    {
+        /* -----
+         * if not bail and say we couldn't consume any bytes
+         */
+        return 0;
+    }
+
+    /* -----
+     * clear the full name and link name entries
+     */
+    memset (full_path, 0, sizeof(full_path));
+    memset (full_link, 0, sizeof(full_link));
+
+    /* -----
+     * set the header at the current TAR block.
+     * That is the map starts at offset buffer_start and we are at 
+     * current_offset into the file so we take the map as a pointer
+     * and add to it the difference between our current offset and the map's
+     * initial offset (first header is at map + 0 - 0)
+     */
+    current_header.b = (const uint8_t *)self->map + current_offset - self->buffer_start;
+    /* -----
+     * start processing
+     */
+    do
+    {
+        TAR_DEBUG (( "Processing one block at (%lu), it is sparse? %s\n",
+                     current_offset, get_bool_string(gnu_sparse)));
+
+        /* -----
+         * what we will do depends upon the type of this block
+         */
+        type = gnu_sparse ? TAR_SPARSE : what_header_type(current_header.h);
+        if (self->found_zero_block)
+        {
+            if (self->found_second_zero_block == true)
+            {
+                type = TAR_ZERO_BLOCK; /* skip anyway */
+            }
+            else if (type == TAR_ZERO_BLOCK)
+            {
+                self->found_second_zero_block = true;
+            }
+            else
+            {
+                if ( ! silent )
+                {
+                    PLOGMSG(klogErr,(klogErr,
+                        "Found Extra Header after a block of zeros $(O)",
+                        PLOG_U64(O), offset));
+                }
+                return -1;
+            }
+        }
+        switch (type)
+        {
+        case TAR_ZERO_BLOCK:
+        {
+            self->found_zero_block = true;
+            done = true;
+            break;
+        }
+        case TAR_SPARSE:
+        {
+            /* -----
+             * If there is an extension header we'll have different work to do
+             */
+#if 0
+            if (current_header.h->sparse.isextended)
+            {
+                LOGMSG (klogDebug3,"isextended true");
+            }
+            else
+            {
+                LOGMSG (klogDebug3,"isextended false");
+            }
+#endif
+            {
+                int64_t  ix;
+                uint64_t of;
+                uint64_t sz;
+
+                for (ix = 0; ix< GNU_SPARSES_IN_EXTRA_HEADER; ++ix)
+                {
+                    rc_t ret;
+                    of = tar_strtoll(
+                     (const uint8_t*)current_header.h->sparse.sparse[ix].offset,
+                                     TAR_SIZE_LEN, silent);
+                    sz = tar_strtoll(
+                  (const uint8_t*)current_header.h->sparse.sparse[ix].num_bytes,
+                                     TAR_SIZE_LEN, silent);
+                    if (sz == 0)
+                    {
+                        break;
+                    }
+#if 0
+                    PLOGMSG ((klogDebug4, 
+                              "SPARSE ext: $(count): $(offset) $(size)",
+                              PLOG_3(PLOG_I64(count),PLOG_X64(offset),PLOG_X64(size)),
+                              ix,
+                              of,
+                              sz));
+#endif
+
+                    ret = sparse_data_push (&self->sparse_q, of, sz);
+                    if (ret)
+                    {
+                        sparse_data_kill(&self->sparse_q);
+                        return -1;
+                    }
+                    ++self->num_chunks;
+                }
+            }
+        }
+        break;
+
+#if 0
+        /*Same as the default case */
+        case TAR_CPIO:
+            PLOGMSG ((klogErr,
+                      "unsupported header type $(type) $(string)",
+                      "type=%d,string=%s",
+                      type, get_type_string(type)));
+            done = true;
+            break;
+#endif
+
+        default:
+            if ( ! silent )
+            {
+                PLOGMSG (klogErr,(klogErr,
+                                  "unsupported header type $(type) $(string)",
+                                  "type=%d,string=%s",
+                                  type, get_type_string(type)));
+            }
+            done = true;
+            break;
+
+        case TAR_GNU_89:
+        case TAR_V7:
+        case TAR_POSIX:
+            /* -----
+             * almost anything we do will depend upon the size of the data for this block
+             *
+             * this will be wrong if we ever support cpio...
+             */
+            data_size = (uint64_t) ( tar_strtoll
+                ( (uint8_t*)current_header.h->tar.size,TAR_SIZE_LEN, silent ) );
+#if _DEBUGGING && 0
+            uid =  ( tar_strtoll
+                ( (uint8_t*)current_header.h->tar.uid,TAR_ID_LEN, silent ) );
+            gid =  ( tar_strtoll
+                ( (uint8_t*)current_header.h->tar.gid,TAR_ID_LEN, silent ) );
+#endif
+            mtime = ( tar_strtoll
+                ( (uint8_t*)current_header.h->tar.mtime,TAR_TIME_LEN, silent) );
+            mode = (uint32_t) ( tar_strtoll
+                ( (uint8_t*)current_header.h->tar.mode,TAR_MODE_LEN, silent) );
+        }
+
+        /* -----
+         * Sometimes we are done just by identifying the header type.
+         * If so we break the loop here.
+         */
+        if (done)
+        {
+            /* -----
+             * point at the next header block
+             * Add the size of the header itself plus enough block sizes of data to cover
+             * any associated data.
+             */
+            size_t header_plus_data_block_size = (1+BLOCKS_FOR_BYTES(data_size))*TAR_BLOCK_SIZE;
+            current_offset += (uint64_t)header_plus_data_block_size;
+            current_header.b += header_plus_data_block_size;
+            break;
+        }
+
+        /* -----
+         * several extensions to USTAR/TAR format headers involve
+         * prepending another header type to give a name longer 
+         * than will fit in tthe header itself.  If we had one of
+         * those use that name.  But if the full path has not been
+         * set use the path from this header.
+         */
+        if (full_path[0] == 0) /* if full_path wasn't filled in by an 'L' long name */
+        {
+            size_t len, size;
+            /* -----
+             * if there is a prefix (POSIX style) use it
+             * copy the prefix and then concatenate the name field
+             */
+            if (current_header.h->posix.prefix[0])
+            {
+#if 0
+                PLOGMSG ((klogDebug1,
+                          "used a posix prefix $(prefix)",
+                          "prefix=%s",
+                          current_header.h->posix.prefix));
+#endif
+                /* -----
+                 * copy in the prefix, force a NUL just in case. then add a directory divider 
+                 */
+                string_copy(full_path, sizeof(full_path), current_header.h->posix.prefix, TAR_PREFIX_LEN);
+                full_path[TAR_PREFIX_LEN] = 0x00;
+                strcat(full_path,"/");
+            }
+
+            strncat(full_path,current_header.h->tar.name,TAR_NAME_LEN);
+            len = string_measure(full_path, &size);
+            while (len > 1)
+            {
+                if (full_path[len-1] == '/')
+                    len--;
+                else
+                    break;
+            }
+            full_path[len] = '\0';
+        }
+        link = current_header.h->tar.link;
+        TAR_DEBUG(("link = %s(%c)\n",get_link_string(link),link));
+        switch (link)
+        {
+        case LINK_SPARSE:
+            /* -----
+             * If there is an extension header we'll have different work to do
+             */
+            if (current_header.h->gnu_89.isextended)
+            {
+                /* -----
+                 * If we have an extended header following make sure there is room
+                 */
+                if ( (uint64_t)( offset + 2 * sizeof(tar_header) ) > hard_limit )
+                    return 0;
+                done = false;
+                gnu_sparse = true;	/* next block will be part of the header and not data */
+                data_offset = offset + 2 * sizeof(tar_header);
+            }
+            else
+            {
+                done = true;
+                gnu_sparse = false;
+                data_offset = offset + sizeof(tar_header);
+            }
+
+            done = (bool)! current_header.h->gnu_89.isextended;
+            {
+                int32_t ix;
+                rc_t	ret;
+
+                virtual_data_size = (uint64_t)(tar_strtoll(
+                    (uint8_t*)current_header.h->gnu_89.realsize,TAR_SIZE_LEN,
+                    silent));
+
+                for (ix = 0; ix< GNU_SPARSES_IN_OLD_HEADER; ++ix)
+                {
+                    uint64_t soffset = tar_strtoll(
+                     (const uint8_t*)current_header.h->gnu_89.sparse[ix].offset,
+                                                   TAR_SIZE_LEN, silent);
+                    uint64_t ssize = tar_strtoll(
+                  (const uint8_t*)current_header.h->gnu_89.sparse[ix].num_bytes,
+                                                 TAR_SIZE_LEN, silent);
+                    if (ssize == 0)
+                    {
+                        break;
+                    }
+
+                    ret = sparse_data_push (&self->sparse_q, soffset, ssize);
+                    if (ret) 
+                    {
+                        sparse_data_kill(&self->sparse_q);
+                        return -1;
+                    }
+                    ++self->num_chunks;
+                }
+            }
+            data_offset = current_offset + sizeof(tar_header);
+            break;
+
+        case LINK_OLDNORMAL_FILE:		/* deprecated normal file */
+            /* -----
+             * this should only happen with LINK_OLDNORMAL_FILE
+             *
+             * If the type is file but the last character in the path is "/"
+             * treat it as a directory instead
+             */
+        {
+            size_t size;
+            if (full_path[string_measure(full_path, &size)-1] == '/')
+            {
+                link = LINK_DIRECTORY;
+            }
+        }
+	    /* fall through */
+        case LINK_NORMAL_FILE:
+        case LINK_CONTIGUOUS_FILE:
+        case LINK_DIRECTORY:
+            data_offset = current_offset + sizeof(tar_header);
+            done = true;
+            break;
+
+            /* since we do not extract for tar files, a symlink and a hardlink
+             * are the same to us */
+        case LINK_HARD_LINK:
+        case LINK_SYMBOLIC_LINK:
+            if (full_link[0] == 0)
+            {
+                string_copy(full_link, sizeof(full_link), current_header.h->tar.linkname, TAR_NAME_LEN);
+            }
+            done = true;
+            break;
+            
+            /* ----------
+             * These types we ignore and they are defined to not have a data size
+             */
+        case LINK_CHARACTER_SPECIAL:
+        case LINK_BLOCK_SPECIAL:
+        case LINK_FIFO:
+        case LINK_INODE_METADATA:
+            /* -----
+             * Nothing to be done
+             */
+            TAR_DEBUG (("%s: ignored block link type %s(%c) @ %lu\n",
+                        __func__,
+                        get_link_string(current_header.h->tar.link),
+                        get_link_string(current_header.h->tar.link),
+                        (uint64_t)(current_offset)+(uint64_t)(OFFSET_OF(tar_v7_header,link)))); 
+            data_size = 0; /* data size is specifically to be ignored */
+            done = true;
+            break;
+            
+            /* ----------
+             * These types we ignore as a final block or a block unto themselves and are
+             * not part of a series of blocks and they are defined to have a data size
+             */
+        case LINK_PAX_GLOBAL_XHDR:
+        case LINK_GNU_DUMPDIR: /* we are just gonna ignore this and not treat it like LINK_DIRECTORY */
+        case LINK_SOLARIS_ACL_FILE:
+        case LINK_VOLUME_NAME:
+        case LINK_MULTI_VOLUME:
+            TAR_DEBUG (("%s: ignored block link type %s(%c) %lu @ %lu\n",
+                        __func__,
+                        get_link_string(current_header.h->tar.link),
+                        get_link_string(current_header.h->tar.link),
+                        data_size,
+                        (uint64_t)(current_offset)+(uint64_t)(OFFSET_OF(tar_v7_header,link)))); 
+            done = true;
+            break;
+            
+            /* ----------
+             * These types we ignore as a block with in a series of blocks
+             * and they are defined to have a data size
+             *
+             * Nothing to be done
+             */
+        case LINK_SOLARIS_ACL:
+        case LINK_PAX_XHDR:	/* posix extended */
+            /* -----
+             */
+            TAR_DEBUG (("%s: ignored block link type %s(%c) @ %lu\n",
+                        __func__,
+                        get_link_string(current_header.h->tar.link),
+                        get_link_string(current_header.h->tar.link),
+                        (uint64_t)(current_offset)+(uint64_t)(OFFSET_OF(tar_v7_header,link)))); 
+            break;
+            
+            /* some link types we ignore this block */
+        default:
+            TAR_DEBUG (("%s: Ignoring block with link %s(%c/%02.2x) @ %lu\n",
+                        __func__, 
+                        get_link_string(current_header.h->tar.link),
+                        current_header.h->tar.link,
+                        (unsigned)(current_header.h->tar.link),
+                        (uint64_t)(current_offset)+(uint64_t)(OFFSET_OF(tar_v7_header,link))));
+            break;
+            
+        case LINK_NEXT_LONG_LINK:	/* long link name */
+            /* -----
+             * Long link name needs access now to its full set of data blocks, request a window shift 
+             * if it is not currently accessible
+             */
+            if ( (uint64_t)( offset + sizeof( tar_header ) + data_size ) > hard_limit )
+                return 0;
+            
+            string_copy(full_link, sizeof(full_link), (char*)(current_header.b + sizeof(tar_header)), data_size);
+            break;
+        case LINK_NEXT_LONG_NAME:	/* long path name */
+            /* -----
+             * Long path name needs access now to its full set of data blocks, request a window shift 
+             * if it is not currently accessible
+             */
+            if ( (uint64_t)( offset + sizeof( tar_header ) + data_size ) > hard_limit )
+            {
+                return 0;
+            }
+            
+            string_copy(full_path, sizeof(full_path), (char*)(current_header.b + sizeof(tar_header)), data_size);
+            break;
+        }
+        
+        /* -----
+         * move the current header offset to past the data blocks
+         */
+        if (link == LINK_SPARSE)
+        {
+            current_offset += sizeof (tar_header);
+            current_header.b += sizeof(tar_header);
+        }
+        else
+        {
+            current_offset += sizeof (tar_header)+ ((data_size+TAR_BLOCK_SIZE-1)/TAR_BLOCK_SIZE)*TAR_BLOCK_SIZE;
+            current_header.b += sizeof(tar_header) + ((data_size+TAR_BLOCK_SIZE-1)/TAR_BLOCK_SIZE)*TAR_BLOCK_SIZE;
+        }
+        /* -----
+         * if that is past the currently available
+         * quit the parse of this entry asn ask for a window shift, yeah, we'll redo work
+         * but its far simpler code to just start over than track being in the middle
+         */
+        if ((!done) && (current_offset >= hard_limit))
+        {
+            return 0;
+        }
+        
+    } while (! done);
+    
+    /* -----
+     * generate output for this entry
+     */
+    switch (type)
+    {
+    default:
+        if ( ! silent )
+        {
+            PLOGMSG (klogErr,(klogErr,"Unhandled Header Block Type $(type):$(typeint)","type=%c,typeint=%d",type ? type : '0',type));
+        }
+        return RC (rcFS, rcArc, rcParsing, rcData, rcUnsupported);
+    case TAR_ZERO_BLOCK:
+#if 0
+        LOGMSG (klogDebug1, "Zero Block");
+#endif
+        /* ignored */
+        break;
+
+    case TAR_CPIO:
+    case TAR_V7:
+    case TAR_POSIX:
+#if 0
+    case TAR_PAX:
+#endif
+    case TAR_SUN:
+    case TAR_STAR_85:
+    case TAR_STAR_94:
+    case TAR_GNU_89:
+#if 0
+    case TAR_GNU_01:
+#endif
+    case TAR_SPARSE:
+        /* -----
+         * TODO:
+         *	implement a header checksum routine call it here, and return -1 if the check sum fails
+         */
+        if (gnu_sparse)
+        {
+#if 0
+            PLOGMSG ((klogDebug3,
+                      "Need to create a file but gnu_sparse is true $(l)",
+                      PLOG_U8(l),
+                      link
+                         ));
+#endif
+            link = LINK_SPARSE;	/* faking it for the next section */
+        }
+        switch (link)
+        {
+        case LINK_OLDNORMAL_FILE:
+        case LINK_NORMAL_FILE:
+        case LINK_CONTIGUOUS_FILE:
+#if 0
+            LOGMSG (klogDebug3, "KTocCreateFile");
+#endif
+            TAR_DEBUG (("%s call KTocCreateFile '%c':%hhd\n", __func__, link, link));
+            KTocCreateFile (self->toc,
+                            data_size?data_offset:0,
+                            data_size,
+                            mtime,
+                            mode,
+                            (KCreateMode)(kcmInit|kcmParents),
+                            full_path);
+            /* -----
+             * TODO:
+             *	print something if extraneous fields found
+             */
+            break;
+        case LINK_HARD_LINK:
+            TAR_DEBUG (("%s call KTocCreateHardLink\n", __func__));
+            KTocCreateHardLink (self->toc, mtime, mode,
+                                (KCreateMode)(kcmInit|kcmParents),
+                                full_link, full_path);
+            /* -----
+             * TODO:
+             *	print something if extraneous fields found
+             */
+            break;
+        case LINK_SYMBOLIC_LINK:
+            TAR_DEBUG (("%s call KTocCreateSoftLink\n", __func__));
+            KTocCreateSoftLink (self->toc, mtime, mode,
+                                (KCreateMode)(kcmInit|kcmParents),
+                                full_link, full_path);
+            /* -----
+             * TODO:
+             *	print something if extraneous fields found
+             */
+            break;
+
+        case LINK_SPARSE:
+            TAR_DEBUG (("%s LINK_SPARSE current_offset %jx: data_offset %jx: data_size %jx\n",
+                        __func__, current_offset, data_offset, data_size));
+            make_chunk_list(self, data_offset);
+            KTocCreateChunkedFile (self->toc,
+                                   virtual_data_size,
+                                   mtime, mode,
+                                   self->num_chunks,
+                                   self->chunks,
+                                   (KCreateMode)(kcmInit|kcmParents), 
+                                   full_path);
+            whack_chunk_list (self);
+            break;
+        case LINK_CHARACTER_SPECIAL:
+        case LINK_BLOCK_SPECIAL:
+        case LINK_FIFO:
+        case LINK_VOLUME_NAME:
+        case LINK_SOLARIS_ACL:
+        case LINK_GNU_DUMPDIR:
+        case LINK_SUN_XHDR:
+        case LINK_INODE_METADATA:
+            TAR_DEBUG ( ( "%s ignored entry type %s linktype name  %s\n",
+                          __func__, get_link_string( link ), full_path ) );
+            /* ignore */
+            break;
+        case LINK_DIRECTORY:
+            TAR_DEBUG (("%s call KTocCreateDir\n", __func__));
+            KTocCreateDir (self->toc, mtime, mode, (KCreateMode)(kcmOpen|kcmParents), full_path);
+            /* -----
+             * TODO:
+             *	print something if extraneous fields found?
+             */
+            break;
+        default:
+            if ( ! silent )
+            {
+                PLOGMSG(klogErr,(klogErr,
+                                 " type ($(type)) name ($(name() link ($(link)) size ($(size)) offset ($(offset))",
+                                 "type=%s,name=%s,link=%s,size=%lld,offset=%lld",
+                                 get_type_string(type),
+                                 full_path,
+                                 full_link,
+                                 data_size,
+                                 data_offset));
+            }
+            break;
+        }
+        break;
+    }
+    return current_offset - offset;
+}
+
+
+static
+rc_t KArcParseTAR_intern ( KToc * self, 
+                           const void * kvoid,
+                           bool silent )
+{
+    KTarState state;
+    /* -----
+     * offset is the running index into the file of where the first tar header
+     *          for the next element should start
+     */
+    uint64_t offset;
+    /* -----
+     * used is the count of bytes used for headers, storage and padding of the last
+     *          examined element
+     */
+    uint64_t used;
+    uint64_t filesize;
+    const KFile * kfile = kvoid;
+    rc_t rc;
+
+    TAR_FUNC_ENTRY();
+
+    /* -----
+     * save the KFS File and TOC references
+     */
+
+    if ( kfile == NULL )
+    {
+        if ( !silent )
+            LOGMSG ( klogFatal, "Called with a bad KFile parameter" );
+        return RC (rcFS, rcArc, rcParsing, rcParam, rcNull );
+    }
+    else if ( self == NULL )
+    {
+        if ( !silent )
+            LOGMSG (klogFatal, "Called with a bad KToc parameter");
+        return RC (rcFS, rcArc, rcParsing, rcSelf, rcNull );
+    }
+
+    memset (&state, 0, sizeof (state));
+    state.kfile = kfile;
+    state.toc = self;
+
+    if ( ( rc = KFileSize ( state.kfile, &filesize ) ) != 0 )
+    {
+        if ( !silent )
+            LOGERR ( klogFatal, rc, "Failed to get file size of tarfile" );
+    }
+    else if ( filesize == 0 )
+    {
+        rc = RC ( rcFS, rcArc, rcAccessing, rcArc, rcEmpty );
+        if ( !silent )
+            LOGERR( klogFatal, rc, "Empty file" );
+    }
+    else if ( ( rc = map_tar_file ( &state, 0 ) ) != 0 )
+    {
+        if ( !silent )
+            PLOGMSG( klogFatal, 
+                    ( klogFatal, "Failed to $(operation) of size $(size)",
+                      "operation=%s,size=%lu", "mmap", filesize ) );
+        return rc;
+    }
+    else
+    {
+        int stalled = 0;
+
+        for ( offset = 0; offset < filesize; )
+        {
+            /* -----
+             * evaluate the tar file header at the current offset into the file
+             *
+             * the return is a positive number of bytes used
+             * OR a negative on a file parse error
+             * OR zero for a file that would exceed the current window
+             */
+            used = process_one_entry ( &state, offset, state.buffer_limit, silent );
+
+            if ( used == 0 )
+                stalled ++;
+            else
+                stalled = 0;
+
+            /* kill any left over sparse data - safely handles an empty queue */
+            sparse_data_kill ( &state.sparse_q );
+
+            if ( state.found_second_zero_block )
+            {
+                break;
+            }
+            if ( used > 0 )
+            {
+                offset += used;
+            }
+            else if ( used == 0 )   /* if the validate returns 0 we need more buffer */
+            {
+                if ( stalled == 5 ) /* sure why not 5 tries */
+                {
+                    rc = RC ( rcFS, rcArc, rcParsing, rcArc, rcIncomplete );
+                    break;
+                }
+                map_tar_file ( &state, offset ); /* slide the window up to current location */
+                /* -----
+                 * TODO:
+                 *	Handle a repeated call from the same location as a failure in file format
+                 * (truncation) of the tar file
+                 */
+            }
+            else /*if (used < 0)*/		/* if it is negative it means abort the tar file */
+            {
+                rc = RC ( rcFS, rcArc, rcParsing, rcArc, rcUnexpected );
+                break;
+            }
+        }
+        if ( offset > filesize )
+        {
+            rc = RC ( rcFS, rcArc, rcParsing, rcToc, rcIncomplete );
+            TAR_DEBUG (( "%s %R File offset %ju exceeds filesize %ju\n",
+                         __func__, rc, offset, filesize ));
+        }
+        release_map ( &state );
+    }
+    return rc;
+}
+
+/* ======================================================================
+ * validating a tar file is listing the files, links and directories
+ * in that archive.
+ *
+ * partial results are not to be accepted in the end but it is the responsibility
+ * of the caller to clear them.
+ *
+ * returns 0 for good archive and -1 for bad archive
+ */
+LIB_EXPORT rc_t CC KArcParseTAR ( KToc * self, 
+              const void * kvoid,
+              bool ( CC * ignored )( const KDirectory *, const char *, void * ),
+              void *also_ignored )
+{
+    return KArcParseTAR_intern ( self, kvoid, false );
+}
+
+
+LIB_EXPORT rc_t CC KArcParseTAR_silent ( KToc * self, 
+              const void * kvoid,
+              bool ( CC * ignored )( const KDirectory *, const char *, void * ),
+              void *also_ignored )
+{
+    return KArcParseTAR_intern ( self, kvoid, true );
+}
+
+
+LIB_EXPORT int CC KDirectoryVOpenTarArchiveRead ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const char *fmt, va_list args )
+{
+    char path [ 4096 ];
+    int size = (args == NULL) ?
+        snprintf  ( path, sizeof path, "%s", fmt ) :
+        vsnprintf ( path, sizeof path, fmt, args );
+    if ( size < 0 || size >= ( int ) sizeof path )
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcExcessive );
+
+    /* putting off parameter validation into this call */
+    return KDirectoryOpenArcDirRead ( self, tar_dir, false, path, tocKFile,
+                                      KArcParseTAR, NULL, NULL );
+}
+
+LIB_EXPORT int CC KDirectoryVOpenTarArchiveRead_silent ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const char *fmt, va_list args )
+{
+    char path [ 4096 ];
+    int size = (args == NULL) ?
+        snprintf  ( path, sizeof path, "%s", fmt ) :
+        vsnprintf ( path, sizeof path, fmt, args );
+    if ( size < 0 || size >= ( int ) sizeof path )
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcExcessive );
+
+    /* putting off parameter validation into this call */
+    return KDirectoryOpenArcDirRead_silent ( self, tar_dir, false, path, tocKFile,
+                                      KArcParseTAR_silent, NULL, NULL );
+}
+
+
+LIB_EXPORT int CC KDirectoryVOpenTarArchiveRead_silent_preopened ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const struct KFile * f, const char *fmt, va_list args )
+{
+    char path [ 4096 ];
+    int size = (args == NULL) ?
+        snprintf  ( path, sizeof path, "%s", fmt ) :
+        vsnprintf ( path, sizeof path, fmt, args );
+    if ( size < 0 || size >= ( int ) sizeof path )
+        return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcExcessive );
+
+    /* putting off parameter validation into this call */
+    return KDirectoryOpenArcDirRead_silent_preopened ( self, tar_dir, false, path, tocKFile, 
+                                      (void*)f, KArcParseTAR_silent, NULL, NULL );
+}
+
+
+LIB_EXPORT int CC KDirectoryOpenTarArchiveRead ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVOpenTarArchiveRead ( self, tar_dir, chroot, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT int CC KDirectoryOpenTarArchiveRead_silent ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVOpenTarArchiveRead_silent ( self, tar_dir, chroot, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT int CC KDirectoryOpenTarArchiveRead_silent_preopened ( struct KDirectory const *self,
+    struct KDirectory const **tar_dir, int chroot, const KFile * f, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDirectoryVOpenTarArchiveRead_silent_preopened ( self, tar_dir, chroot, f, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* ----------
+ * Validate that the compiler packed all the character arrays into the correct sizes
+ * to use the header.
+ *
+ * a bunch of magic numbers are in the function because we are making sure that
+ * they are reached by using the structure members.  They are listed in comments
+ * within comments in the tar_header.h file.
+ *
+ * No return value
+ */
+LIB_EXPORT bool CC validate_header_offsets( void )
+{
+    bool pass_fail = true; /* assume pass */
+#if _DEBUGGING
+    /* -----
+     * checking the size entails making sure the compiler made the structure
+     * the right length to match the series of octents in the file
+     */
+#define	check_size(T,V)     if( sizeof(T) != (size_t)V) { pass_fail = false; printf ("*** BAD_SIZE: %s is %u not %u\n", #T, (unsigned)sizeof(T), (unsigned)V);}
+    /* -----
+     * checking the offset entails making sure the compiler put the field at the
+     * right absolute location within a structure
+     */
+#define	check_offset(T,M,V) if( OFFSET_OF(T,M) != (size_t)V ) { pass_fail = false; printf ("*** BAD_OFFSET: %s.%s is %u not %d\n", #T, #M, (unsigned)OFFSET_OF(T,M), V);}
+
+    check_size(tar_raw_block,512);
+    check_size(tar_v7_header,257);
+    check_size(tar_posix_header,500);
+    check_size(tar_sun_header,512);
+    check_size(tar_star_85_header,512);
+    check_size(tar_star_94_header,512);
+    check_size(tar_gnu_89_header,495);
+    /*check_size(tar_new_gnu_header,512); */
+    check_size(tar_sparse_header,505);
+  
+
+    /* tar_header union */
+    check_offset(tar_header,raw,0);
+    check_offset(tar_header,tar,0);
+    check_offset(tar_header,posix,0);
+    check_offset(tar_header,suntar,0);
+    check_offset(tar_header,star_85,0);
+    check_offset(tar_header,star_94,0);
+    check_offset(tar_header,gnu_89,0);
+    /*check_offset(tar_header,new_gnu,0); */
+    check_offset(tar_header,sparse,0);
+
+    /* tar_v7_header */
+    check_offset(tar_v7_header,name,0);
+    check_offset(tar_v7_header,mode,100);
+    check_offset(tar_v7_header,uid,108);
+    check_offset(tar_v7_header,gid,116);
+    check_offset(tar_v7_header,size,124);
+    check_offset(tar_v7_header,mtime,136);
+    check_offset(tar_v7_header,csum,148);
+    check_offset(tar_v7_header,link,156);
+    check_offset(tar_v7_header,linkname,157);
+
+    /* tar_posix_header */
+    check_offset(tar_posix_header,name,0);
+    check_offset(tar_posix_header,mode,100);
+    check_offset(tar_posix_header,uid,108);
+    check_offset(tar_posix_header,gid,116);
+    check_offset(tar_posix_header,size,124);
+    check_offset(tar_posix_header,mtime,136);
+    check_offset(tar_posix_header,csum,148);
+    check_offset(tar_posix_header,link,156);
+    check_offset(tar_posix_header,linkname,157);
+    check_offset(tar_posix_header,magic,257);
+    check_offset(tar_posix_header,version,263);
+    check_offset(tar_posix_header,uname,265);
+    check_offset(tar_posix_header,gname,297);
+    check_offset(tar_posix_header,devmajor,329);
+    check_offset(tar_posix_header,devminor,337);
+    check_offset(tar_posix_header,prefix,345);
+
+    /* tar_sun_header */
+    check_offset(tar_sun_header,name,0);
+    check_offset(tar_sun_header,mode,100);
+    check_offset(tar_sun_header,uid,108);
+    check_offset(tar_sun_header,gid,116);
+    check_offset(tar_sun_header,size,124);
+    check_offset(tar_sun_header,mtime,136);
+    check_offset(tar_sun_header,csum,148);
+    check_offset(tar_sun_header,link,156);
+    check_offset(tar_sun_header,linkname,157);
+    check_offset(tar_sun_header,magic,257);
+    check_offset(tar_sun_header,version,263);
+    check_offset(tar_sun_header,uname,265);
+    check_offset(tar_sun_header,gname,297);
+    check_offset(tar_sun_header,devmajor,329);
+    check_offset(tar_sun_header,devminor,337);
+    check_offset(tar_sun_header,prefix,345);
+    check_offset(tar_sun_header,extnum,500);
+    check_offset(tar_sun_header,extcount,501);
+    check_offset(tar_sun_header,fullsize,502);
+
+    /* tar_star_85_header */
+    check_offset(tar_star_85_header,name,0);
+    check_offset(tar_star_85_header,mode,100);
+    check_offset(tar_star_85_header,uid,108);
+    check_offset(tar_star_85_header,gid,116);
+    check_offset(tar_star_85_header,size,124);
+    check_offset(tar_star_85_header,mtime,136);
+    check_offset(tar_star_85_header,csum,148);
+    check_offset(tar_star_85_header,link,156);
+    check_offset(tar_star_85_header,linkname,157);
+    check_offset(tar_star_85_header,starversion,257);
+    check_offset(tar_star_85_header,starfiletype,258);
+    check_offset(tar_star_85_header,startype,266);
+    check_offset(tar_star_85_header,rdev,278);
+    check_offset(tar_star_85_header,atime,290);
+    check_offset(tar_star_85_header,ctime,302);
+    check_offset(tar_star_85_header,uname,314);
+    check_offset(tar_star_85_header,gname,330);
+    check_offset(tar_star_85_header,prefix,345);
+    check_offset(tar_star_85_header,xmagic,508);
+
+    /* tar_star_94_header */
+    check_offset(tar_star_94_header,name,0);
+    check_offset(tar_star_94_header,mode,100);
+    check_offset(tar_star_94_header,uid,108);
+    check_offset(tar_star_94_header,gid,116);
+    check_offset(tar_star_94_header,size,124);
+    check_offset(tar_star_94_header,mtime,136);
+    check_offset(tar_star_94_header,csum,148);
+    check_offset(tar_star_94_header,link,156);
+    check_offset(tar_star_94_header,linkname,157);
+    check_offset(tar_star_94_header,magic,257);
+    check_offset(tar_star_94_header,version,263);
+    check_offset(tar_star_94_header,uname,265);
+    check_offset(tar_star_94_header,gname,297);
+    check_offset(tar_star_94_header,devmajor,329);
+    check_offset(tar_star_94_header,devminor,337);
+    check_offset(tar_star_94_header,prefix,345);
+    check_offset(tar_star_94_header,isextended,355);
+    check_offset(tar_star_94_header,sparse,356);
+    check_offset(tar_star_94_header,realsize,452);
+    check_offset(tar_star_94_header,offset,464);
+    check_offset(tar_star_94_header,atime,476);
+    check_offset(tar_star_94_header,ctime,488);
+    check_offset(tar_star_94_header,xmagic,508);
+
+    /* tar_gnu_89_header */
+    check_offset(tar_gnu_89_header,name,0);
+    check_offset(tar_gnu_89_header,mode,100);
+    check_offset(tar_gnu_89_header,uid,108);
+    check_offset(tar_gnu_89_header,gid,116);
+    check_offset(tar_gnu_89_header,size,124);
+    check_offset(tar_gnu_89_header,mtime,136);
+    check_offset(tar_gnu_89_header,csum,148);
+    check_offset(tar_gnu_89_header,link,156);
+    check_offset(tar_gnu_89_header,linkname,157);
+    check_offset(tar_gnu_89_header,magic,257);
+    check_offset(tar_gnu_89_header,uname,265);
+    check_offset(tar_gnu_89_header,gname,297);
+    check_offset(tar_gnu_89_header,atime,345);
+    check_offset(tar_gnu_89_header,ctime,357);
+    check_offset(tar_gnu_89_header,offset,369);
+    check_offset(tar_gnu_89_header,longnames,381);
+    check_offset(tar_gnu_89_header,sparse,386);
+    check_offset(tar_gnu_89_header,isextended,482);
+
+    /* tar_extended_header */
+    check_offset(tar_sparse_header,sparse,0);
+    check_offset(tar_sparse_header,isextended,504);
+#endif
+    return pass_fail;
+}
+
+/* end of file */
diff --git a/libs/kfs/teefile.c b/libs/kfs/teefile.c
new file mode 100644
index 0000000..17f9d2a
--- /dev/null
+++ b/libs/kfs/teefile.c
@@ -0,0 +1,532 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+/* #include <klib/container.h> */
+/* #include <klib/vector.h> */
+/* #include <klib/pbstree.h> */
+/* #include <klib/text.h> */
+/* #include <kfs/file.h> */
+/* #include <assert.h> */
+/* #include <limits.h> */
+/* #include <stdio.h> */
+/* #include <stdlib.h> */
+/* #include <string.h> */
+
+/* #include <klib/container.h> */
+/* #include <klib/vector.h> */
+/* #include <klib/pbstree.h> */
+/* #include <klib/text.h> */
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/teefile.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+/* #include <limits.h> */
+/* #include <stdio.h> */
+#include <stdlib.h>
+/* #include <string.h> */
+
+/* ======================================================================
+ * KTeeFile
+ *  a file inside an archive
+ */
+
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+#define KFILE_IMPL struct KTeeFile
+#include <kfs/impl.h>
+
+static rc_t CC KTeeFileDestroy (KTeeFile *self);
+static struct KSysFile *CC KTeeFileGetSysFile (const KTeeFile *self,
+					    uint64_t *offset);
+static rc_t CC KTeeFileRandomAccessRead (const KTeeFile *self);
+static rc_t CC KTeeFileRandomAccessUpdate (const KTeeFile *self);
+static uint32_t CC KTeeFileType (const KTeeFile *self);
+static rc_t CC KTeeFileSize (const KTeeFile *self, uint64_t *size);
+static rc_t CC KTeeFileSetSizeRead (KTeeFile *self, uint64_t size);
+static rc_t CC KTeeFileSetSizeUpdate (KTeeFile *self, uint64_t size);
+static rc_t CC KTeeFileRead (const KTeeFile *self, uint64_t pos,
+			  void *buffer, size_t bsize, size_t *num_read);
+static rc_t CC KTeeFileWriteRead (KTeeFile *self, uint64_t pos, const void *buffer,
+			       size_t size, size_t *num_writ);
+static rc_t CC KTeeFileWriteUpdate (KTeeFile *self, uint64_t pos, const void *buffer,
+				 size_t size, size_t *num_writ);
+
+
+static const KFile_vt_v1 vtKTeeFileRead =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KTeeFileDestroy,
+    KTeeFileGetSysFile,
+    KTeeFileRandomAccessRead,
+    KTeeFileSize,
+    KTeeFileSetSizeRead,
+    KTeeFileRead,
+    KTeeFileWriteRead,
+
+    /* 1.1 */
+    KTeeFileType
+};
+static const KFile_vt_v1 vtKTeeFileUpdate =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KTeeFileDestroy,
+    KTeeFileGetSysFile,
+    KTeeFileRandomAccessUpdate,
+    KTeeFileSize,
+    KTeeFileSetSizeUpdate,
+    KTeeFileRead,
+    KTeeFileWriteUpdate,
+
+    /* 1.1 */
+    KTeeFileType
+};
+
+
+/*-----------------------------------------------------------------------
+ * KTeeFile
+ *  an archive file including tar and sra
+ */
+struct KTeeFile
+{
+    KFile	dad;
+    uint64_t	maxposition;
+    KFile *	original;
+    KFile *	copy;
+};
+
+static
+rc_t KTeeFileSeek (const KTeeFile *cself, uint64_t pos)
+{
+    KTeeFile * self;
+    rc_t rc = 0;
+    size_t num_read;
+    uint8_t buff [ 32 * 1024 ];
+
+    self = (KTeeFile *)cself;
+    /* seek to "pos" */
+    while (self->maxposition < pos)
+    {
+        /* maximum to read in this buffer */
+        size_t to_read = sizeof buff;
+        if (self->maxposition + sizeof buff > pos )
+            to_read = (size_t) (pos - self->maxposition);
+
+        /* read bytes */
+        rc = KFileRead (&self->dad, self->maxposition, buff, to_read, &num_read );
+        if ( rc != 0 )
+            break;
+
+        /* detect EOF */
+        if (num_read == 0)
+        {
+            break;
+        }
+    }
+
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KTeeFileMake
+ *  create a new file object
+ */
+
+static
+rc_t KTeeFileMake (KTeeFile ** self,
+		   KFile * original,
+		   KFile * copy,
+		   const KFile_vt * vt,
+		   bool read_enabled,
+		   bool write_enabled)
+{
+    rc_t	rc;
+    KTeeFile *	pF;
+
+    /* -----
+     * we can not accept any of the three pointer parameters as NULL
+     */
+    assert (self != NULL);
+    assert (original != NULL);
+    assert (copy != NULL);
+
+    /* -----
+     * the enables should be true or false
+     */
+    assert ((read_enabled == true)||(read_enabled == false));
+    assert ((write_enabled == true)||(write_enabled == false));
+
+    /* -----
+     * get space for the object
+     */
+    pF = malloc (sizeof (KTeeFile));
+    if (pF == NULL)	/* allocation failed */
+    {
+	/* fail */
+	rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+    }
+    else
+    {
+	rc = KFileInit (&pF->dad,			/* initialize base class */
+			vt,			 	/* VTable for KTeeFile */
+            "KTeeFile", "no-name",
+			read_enabled,			/* read allowed */
+			write_enabled);			/* write disallowed */
+	if (rc == 0)
+	{
+/* take over the existing KFile Reference for original and copy*/
+	    /* succeed */
+	    pF->original = original;
+	    pF->copy = copy;
+	    pF->maxposition = 0;
+	    *self = pF;
+	    return 0;
+	}
+	/* fail */
+	free (pF);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KFileMakeTeeRead (const KFile ** self, const KFile * original, KFile * copy)
+{
+    return KTeeFileMake ((KTeeFile **)self, (KFile*)original, copy,
+			 (const KFile_vt*)&vtKTeeFileRead, true, false);
+}
+
+LIB_EXPORT rc_t CC KFileMakeTeeUpdate (KFile ** self, KFile * original, KFile * copy)
+{
+    return KTeeFileMake ((KTeeFile **)self, original, copy,
+			 (const KFile_vt*)&vtKTeeFileUpdate, true, true);
+}
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *
+ */
+static
+rc_t CC KTeeFileDestroy (KTeeFile *self)
+{
+    rc_t rc;
+    uint64_t last_max;
+
+    assert (self != NULL);
+
+    do
+    {
+        last_max = self->maxposition;
+
+        /* keep seeking ahead by a Gigabyte until we read no more */
+	rc = KTeeFileSeek (self, last_max + 1024*1024*1024);
+	if (rc != 0)
+	    return rc;
+
+    } while (last_max < self->maxposition);
+
+    rc = KFileRelease (self->original);
+    if ( rc == 0 )
+    {
+        KFileRelease (self->copy);
+        free (self);
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ *
+ * We cant allow memory mapping a tee file as the read?writes ar needed
+ * to trigger the writes to the copy KFile
+ */
+
+static
+struct KSysFile *CC KTeeFileGetSysFile (const KTeeFile *self, uint64_t *offset)
+{
+    /* parameters must be non-NULL */
+    assert (self != NULL);
+    assert (offset != NULL);
+
+    return NULL;
+}
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ *  returns 0 if random access, error code otherwise
+ *
+ * Update needs to be able to seek both original and copy while read
+ * only needs to be able to seek the original.
+ */
+static
+rc_t CC KTeeFileRandomAccessUpdate (const KTeeFile *self)
+{
+    rc_t rc;
+    assert (self != NULL);
+    rc = KFileRandomAccess (self->original);
+    if (rc == 0)
+	rc = KFileRandomAccess (self->copy);
+    return rc;
+}
+static
+rc_t CC KTeeFileRandomAccessRead (const KTeeFile *self)
+{
+    rc_t rc;
+    assert (self != NULL);
+    rc = KFileRandomAccess (self->original);
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KTeeFileType (const KTeeFile *self)
+{
+    return KFileType (self->original);
+}
+
+
+/* ----------------------------------------------------------------------
+ * Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KTeeFileSize (const KTeeFile *self, uint64_t *size)
+{
+    rc_t	rc;
+    uint64_t	fsize;
+
+    assert (self != NULL);
+    assert (size != NULL);
+
+    rc = KFileSize (self->original, &fsize);
+
+    if (rc == 0)
+    {
+	/* success */
+	*size = fsize;
+    }
+    /* pass along RC value */
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KTeeFileSetSizeUpdate (KTeeFile *self, uint64_t size)
+{
+    rc_t rc;
+
+    rc = KFileSetSize (self->original, size);
+    if (rc == 0)
+	rc = KFileSetSize (self->copy, size);
+    return rc;
+}
+static
+rc_t CC KTeeFileSetSizeRead (KTeeFile *self, uint64_t size)
+{
+    return RC (rcFS, rcFile, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t CC KTeeFileRead	(const KTeeFile *cself,
+			 uint64_t pos,
+			 void *buffer,
+			 size_t bsize,
+			 size_t *num_read)
+{
+    KTeeFile * 	self;
+    uint64_t	maxposition;
+    size_t	read;
+    size_t	written;
+    size_t	sofar;
+    rc_t	rc;
+
+
+    /* -----
+     * self and buffer were validated as not NULL before calling here
+     *
+     * So get the KTTOCNode type: chunked files and contiguous files 
+     * are read differently.
+     */
+    assert (cself != NULL);
+    assert (buffer != NULL);
+    assert (num_read != NULL);
+    assert (bsize != 0);
+
+    rc = 0;
+    read = 0;
+    self = (KTeeFile*)cself;
+    maxposition = self->maxposition;
+    if (pos > maxposition)
+	rc = KTeeFileSeek (self, pos);
+    if (rc == 0)
+    {
+	rc = KFileRead (self->original, pos, buffer, bsize, &read);
+	if (rc == 0)
+	{
+	    if (pos + read > maxposition)
+	    {
+		for ( sofar = (size_t)( maxposition - pos );
+			  sofar < read;
+		      sofar += written)
+		{
+		    rc = KFileWrite (self->copy, pos + sofar, (uint8_t*)buffer + sofar,
+				     read - sofar, &written);
+		    if (rc != 0)
+			break;
+		    if (written == 0)
+		    {
+			LOGERR (klogErr, rc, "Failure to write to copy in KTeeFileRead");
+			rc = RC (rcFS, rcFile, rcReading, rcFile, rcIncomplete);
+		    break;
+		    }
+		}
+		maxposition = pos + sofar;
+		if (maxposition > self->maxposition)
+		    self->maxposition = maxposition;
+	    }
+	}
+    }
+    *num_read = read;
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ * Unsupported as we now treat archives as READ ONLY
+ */
+static
+rc_t CC KTeeFileWriteUpdate (KTeeFile *self, uint64_t pos,
+		       const void *buffer, size_t bsize,
+		       size_t *num_writ)
+{
+    uint64_t	max_position;
+    size_t	writ;
+    size_t	written;
+    size_t	sofar;
+    rc_t	rc;
+
+    assert (self != NULL);
+    assert (buffer != NULL);
+    assert (num_writ != NULL);
+    assert (bsize != 0);
+
+    writ = 0;
+    rc = 0;
+    if (pos > self->maxposition)
+	rc = KTeeFileSeek (self, pos);
+    if (rc == 0)
+    {
+	rc = KFileWrite (self->original, pos, buffer, bsize, &writ);
+	if (rc == 0)
+	{
+	    for ( sofar = written = 0; sofar < writ; sofar += written)
+	    {
+		rc = KFileWrite (self->copy, pos + sofar, (uint8_t*)buffer + sofar,
+			     writ - sofar, &written);
+		if (rc != 0)
+		    break;
+		if (written == 0)
+		{
+		    rc = RC (rcFS, rcFile, rcReading, rcFile, rcIncomplete);
+		    LOGERR (klogErr, rc, "Failure to write to copy in KTeeFileWrite");
+		    break;
+		}
+	    }
+	    max_position = pos + sofar;
+	    if (max_position > self->maxposition)
+		self->maxposition = max_position;
+	}
+    }
+    *num_writ = writ;
+    return rc;
+}
+static
+rc_t CC KTeeFileWriteRead (KTeeFile *self, uint64_t pos,
+			   const void *buffer, size_t bsize,
+			   size_t *num_writ)
+{
+    assert (self != NULL);
+    assert (buffer != NULL);
+    assert (num_writ != NULL);
+    assert (bsize != 0);
+
+    *num_writ = 0;
+    return RC (rcFS, rcFile, rcWriting, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * 
+ */
+
+
+/* end of file teefile.c */
+
diff --git a/libs/kfs/toc-priv.h b/libs/kfs/toc-priv.h
new file mode 100644
index 0000000..d33cd1d
--- /dev/null
+++ b/libs/kfs/toc-priv.h
@@ -0,0 +1,841 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_toc_priv_h_
+#define _h_kfs_toc_priv_h_
+
+#include <klib/container.h>
+#include <klib/text.h>
+#include <kfs/arc.h>
+#include <kfs/toc.h>
+#include <atomic.h>
+
+#ifdef _DEBUGGING
+#define TOC_FUNC_ENTRY() DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_TOCENTRY), ("Enter: %s\n", __func__))
+#define TOC_SORT(msg) DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_SRASORT), msg)
+#define TOC_DEBUG(msg) DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_TOC), msg)
+#else
+#define TOC_FUNC_ENTRY()
+#define TOC_SORT(msg)
+#define TOC_DEBUG(msg)
+#endif
+
+
+
+/*--------------------------------------------------------------------------
+ * KTocEntry
+ */
+typedef struct KTocEntry KTocEntry;
+typedef enum KTocEntryType
+{
+    ktocentrytype_unknown = -1,
+    ktocentrytype_notfound,
+    ktocentrytype_dir,
+    ktocentrytype_file,
+    ktocentrytype_chunked,
+    ktocentrytype_softlink,
+    ktocentrytype_hardlink,
+    ktocentrytype_emptyfile,
+    ktocentrytype_zombiefile /* zombie in the sense that it is somewhere between live and dead */
+} KTocEntryType;
+
+/* arbitrary number that was originially set much much higher than expected needs. */
+#define	KARC_LINK_RESOLVE_LOOPMAX		(16)
+
+typedef struct KTocPageChunk
+{
+    uint64_t file_offset;
+    uint32_t page_id;
+    uint32_t page_offset;
+} KTocPageChunk;
+
+
+
+struct KTocEntry
+{
+    /* -----
+     * In C putting this first allows a weak form of polymorphism for
+     * a entry class.  A pointer to a BSTNode can be an alias to a pointer to 
+     * this form of node.
+     */
+    BSTNode		node;
+
+    /* -----
+     * The name of the directory/file/link that this Entry represents.  It is not
+     * the full path which must be assembled going up the tree.
+     *
+     * Be careful what String functions you try as some want to reallocate memory.
+     */
+    String		name;
+
+    /* -----
+     * Unix style file modification time (same as a 64-bit time_t)
+     */
+    KTime_t		mtime;
+
+    /* -----
+     * Unix style file access
+     */
+    uint32_t		access;
+
+    /* -----
+     * what type of entry is this?
+     */
+    KTocEntryType	type;
+
+    union KTocEntryUnion
+    {
+	struct KTocEntryDir
+	{
+	    /* -----
+	     * Tree of directories, files and links below this directory
+	     */
+            BSTree      tree;
+	} dir;
+	struct KTocEntryFile
+	{
+	    /*
+	     * how long is this file?
+	     */
+	    uint64_t	file_size;
+	    /* 
+	     * location within the archive where this file's data starts
+	     */
+	    uint64_t	archive_offset;
+	} contiguous_file;
+	struct KTocEntryZombieFile
+	{
+/* KEEP the first two fields here match the first two fields above
+ * file_size and archive_offset so the chunked is sort of a derived type */
+	    /*
+	     * how long is this file supposed to be?
+	     */
+	    uint64_t	file_size;
+	    /* 
+	     * location within the archive where this file's data would have started
+	     */
+	    uint64_t	archive_offset;
+	} zombie_file;
+	struct KTocEntryChunkFile
+	{
+/* KEEP the first two fields here match the first two fields above
+ * file_size and archive_offset so the chunked is sort of a derived type */
+	    /*
+	     * Size of the whole file including all chunks and any zero byte holes
+	     * between chunks
+	     */
+	    uint64_t	file_size;
+	    /* 
+	     * location within the archive where this file's data starts if viewws
+	     * as a virtual "*.sra"
+	     */
+	    uint64_t	archive_offset;
+
+	    KTocChunk *	chunks;			/* this will piggy back in the same allocation */
+	    uint32_t	num_chunks;	    
+	} chunked_file;
+        struct KTocEntryPagedChunkFile
+        {
+            uint64_t file_size;
+        } paged_chunk_file;
+	struct KTocEntrySoftLink
+	{
+	    String	link_path;
+	} symbolic_link;
+	struct KTocEntryHardLink
+	{
+	    const struct KTocEntry * ref;
+	    /* -----
+	     * This approach can lead to failures if the target of the link is deleted and this
+	     * reference is left dangling.
+	     */
+	} hard_link;
+    } u;
+};
+
+typedef struct KTocEntryIndex KTocEntryIndex;
+struct KTocEntryIndex
+{
+    BSTNode	node;
+    KTocEntry *	entry;
+    String	fullpath;
+};
+
+
+/* ----------------------------------------------------------------------
+ * KTocEntryParam
+ *
+ * An internal structure used only with in this compilation unit / module
+ */
+/* ----------------------------------------------------------------------
+ * NOTE: This oddness of specific to general to specific can probably be 
+ * refactored into specific functions (the published API) that uses common
+ * functions instead of a common target function.
+ */
+typedef struct KTocEntryParam	KTocEntryParam;
+struct KTocEntryParam
+{
+    KTocEntryType	type;
+    KTime_t		mtime;
+    uint32_t		access;
+    union
+    {
+	struct
+	{
+	    uint64_t		size;
+	    uint64_t		source_position;
+	} file;
+	struct
+	{
+	    uint64_t		size;
+	    uint32_t		num_chunks;
+	    const KTocChunk *	chunks;
+	} chunked;
+	struct
+	{
+            const KTocEntry *   ref;
+	} hardlink;
+	struct
+	{
+	    const char *	targ;
+	} softlink;
+    } u;
+};
+
+/* ----------------------------------------------------------------------
+ * KArcTOCNodeWhack
+ * [IN] BSTNode * 		n	
+ * [IN] void *    		data	
+ *
+ * This function matches the signature for a function pointer in a 
+ * call to BSTreeWhack().  It ignores the data pointer second parameter
+ * which can safely be called with NULL. 
+ */
+void	CC KTocEntryWhack	(BSTNode * n, void * data);
+int64_t	CC KTocEntryCmpVoid (const void * item, const BSTNode * node);
+rc_t	KTocEntryDelete	(KTocEntry * self);
+int64_t	CC KTocEntryCmp2 (const BSTNode * n, const BSTNode * p);
+rc_t	KTocEntryNewDirectory	(KTocEntry ** new_entry,
+					 const char * name,
+					 size_t name_size,
+					 KTime_t mtime,
+					 uint32_t access);
+rc_t		KTocEntryNewFile	(KTocEntry ** new_entry,
+					 const char * name,
+					 size_t name_size,
+					 KTime_t mtime,
+					 uint32_t access,
+					 uint64_t offset,
+					 uint64_t size);
+rc_t		KTocEntryNewChunked	(KTocEntry ** new_entry,
+					 const char * name,
+					 size_t name_size,
+					 KTime_t mtime,
+					 uint32_t access,
+					 uint64_t size,
+					 const KTocChunk * chunks,
+					 uint32_t num_chunks);
+rc_t		KTocEntryNewSoft	(KTocEntry ** new_entry,
+					 const char * name,
+					 size_t name_size,
+					 KTime_t mtime,
+					 uint32_t access,
+					 const char * link,
+					 size_t link_size);
+rc_t		KTocEntryNewHard	(KTocEntry ** new_entry,
+					 const char * name,
+					 size_t name_size,
+					 KTime_t mtime,
+					 uint32_t access,
+                                         const KTocEntry * targ);
+rc_t		KTocEntryNewZombieFile	(KTocEntry ** new_entry,
+					 const char * name,
+					 size_t name_size,
+					 KTime_t mtime,
+					 uint32_t access,
+					 uint64_t offset,
+					 uint64_t size);
+
+
+typedef struct	KTocEntryStack 	KTocEntryStack;
+rc_t KTocEntryStackNew(KTocEntryStack ** self);
+rc_t KTocEntryStackDel(KTocEntryStack * self);
+rc_t KTocEntryStackDepth(KTocEntryStack * self, int * depth);
+rc_t KTocEntryStackPush(KTocEntryStack * self, KTocEntry * pathaddr);
+rc_t KTocEntryStackPop(KTocEntryStack * self, KTocEntry ** pathaddr);
+
+const char * KTocEntryTypeGetString(KTocEntryType t);
+const char * get_mode_string (KCreateMode mode);
+
+typedef struct KTocEntryPersistWriteFuncData
+{
+    uint8_t *	buffptr;
+    uint8_t *	limit;
+} KTocEntryPersistWriteFuncData;
+KFS_EXTERN rc_t CC KTocEntryPersistWriteFunc (void * param, const void * buffer, size_t size,
+				size_t * num_writ);
+
+rc_t KTocEntryPersistNodeDir (void *param, const KTocEntry * n,
+			      size_t * num_writ, 
+			      PTWriteFunc write, void * write_param);
+
+/* ======================================================================
+ * KToc struct
+ */
+struct KArcDir;
+
+struct KToc
+{
+    KArcFSType	arctype;
+    KSRAFileAlignment alignment;
+    /* -----
+     * File containing the archive: details of its type hidden behind KFile.
+     * We should be able to do an archive in an archive by having this KFile
+     * point to a KArcFile with no problems.
+     */
+    union
+    {
+	const void *		v;
+	struct KFile const *f;
+	const KDirectory * 	d;
+    } archive;
+
+    /* -----
+     * KArcDir that implements the KDirectory interface for the contents of 
+     * the file opened as archive.  This link is needed to get to the 
+     * KDirectory interface from a KFile symbolic link.
+     *
+     * This reference is not counted in refcount as it is a link back to the
+     * tracked reference from the KArcDir to the KARcTOC.
+     */
+/*     const struct KArcDir *	karchive; */
+
+    /* -----
+     * count of references to this opened archive
+     */
+    atomic32_t		refcount;
+
+    /* -----
+     * A entry outside of a tree: instantiated as a special KTocEntry that is part of
+     * no BSTree with type set to ktocentrytype_dir (directory).
+     * Does not use the base dir BSTNode but makes processing easier to have a 
+     *"entry" type...
+     */
+    KTocEntry		entry;
+
+    /* -----
+     * These next two are used only in the KFile interface on top of a KToc
+     * on a KDirectory.  This needs to be rewritten as an interface so these
+     * don't exist in all KToc implmentations.
+     *
+     * Index  The main tree in 'entry' is sorted by names with in directories.
+     * This index is a directory less tree sorted by offset with in the archive.
+     *
+     * This is not currently used in tar file versions of the TOC archive.
+     *
+     * Each entry is of type KTocEntryIndex;
+     */
+    BSTree		offset_index;
+    KSraHeader *	header;
+
+
+    /* -----
+     * This is the full path of the archive file as used to open it as a KFile.
+     */
+    String		path;
+
+};
+
+/* four fields are common to all entries.*/
+
+
+/* GetName
+ *
+ *  [RET] rc_t                  0 for success; anything else for a failure
+ *                       see itf/klib/rc.h for general details
+ *  [IN]     const KTocEntry *  self        object oriented object reference
+ *  [OUT] const char **         name        where to put a reference to the name
+ */
+rc_t KTocEntryGetName(const KTocEntry *self,
+                     const char ** name);
+
+/* GetTime
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] KTime_t *      mtime       where to put unix/posix style permission flags
+ */
+rc_t KTocEntryGetTime(const KTocEntry *self,
+                     KTime_t *mtime);
+
+/* GetAccess
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                             see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] uint32_t       access      where to put unix/posix style permission flags
+ */
+rc_t KTocEntryGetAccess(const KTocEntry * self, uint32_t * access);
+
+
+/* GetType
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] KTocEntryType *    type        where to put the type specific node type (differs
+ *                      from KDirectory type)
+ */
+rc_t KTocEntryGetType(const KTocEntry *self,
+                     KTocEntryType * type);
+/* the type retrieved by GetType will permit several more fields specialized by type */
+/* for a directory the only specialzied field is the "BSTree" */
+
+#if 0
+const char * KTocEntryGetTypeString(KTocEntryType type);
+#endif
+
+/* GetBSTree
+ *
+ * Get a reference to the BSTree of a TocEntry that represents a directory.
+ * This will fail for all ites taht are not directories.
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] const BSTree **    ptree       where to put a reference to the kcont/BSTree of a
+ *                      directory node
+ */
+rc_t KTocEntryGetBSTree( const KTocEntry * self,
+                         struct BSTree const ** ptree);
+
+/* for a file there are two fields: a container offset and a file size */
+
+
+/* GetFileLocator (works for contiguous or chunked files)
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] uint64 *       locator        where to put the locator of a referenced node
+ */
+rc_t KTocEntryGetFileLocator( const KTocEntry * self,
+                              uint64_t * locator);
+
+
+/* GetFileSize (works for contiguous or chunked files)
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] uint64 *       size        where to put the size of a referenced node
+ */
+rc_t KTocEntryGetFileSize( const KTocEntry * self,
+                     uint64_t * size);
+
+
+/* GetFilePhysicalSize (works for contiguous or chunked files)
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] uint64 *       size        where to put the size of a referenced node
+ */
+rc_t KTocEntryGetFilePhysicalSize( const KTocEntry * self,
+                                   uint64_t * size);
+
+
+/* GetFileContiguous (works for contiguous or chunked files)
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] uint64 *       size        where to put the size of a referenced node
+ */
+rc_t KTocEntryGetFileContiguous( const KTocEntry * self,
+                                 bool * contiguous);
+
+
+/* GetFileOffset
+ *
+ * For normal contiguous file nodes 'offset' gets the offset to the start of the file.
+ * For all other nodes, 'offset' gets 0 with an appropriate rc_t return.
+ *
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] uint64 *       offset      where to put the offset of a referenced node
+ */
+rc_t KTocEntryGetFileOffset( const KTocEntry * self,
+                     uint64_t * offset);
+
+
+/* GetHardTarget
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] const KTocEntry ** target      where to put a reference from a hard link node
+ */
+rc_t KTocEntryGetHardTarget( const KTocEntry *self,
+                     const KTocEntry ** target);
+
+/* there are two specialzied fields for chunked files - both retrieved with the saem method */
+
+
+/* GetChunks
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] const KTocChunk *  chunks      where to put the size of a referenced node
+ */
+rc_t KTocEntryGetChunks (const KTocEntry * self,
+                     uint32_t * num_chunks,
+                     const KTocChunk ** chunks);
+
+/* GetSoftTarget
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KTocEntry *  self        object oriented object reference
+ * [OUT] const char **      target      where to put a reference from a hard link node
+ */
+rc_t KTocEntryGetSoftTarget (const KTocEntry *self,
+                     const char ** target);
+
+
+/*--------------------------------------------------------------------------
+ * KToc
+ *  archive table of contents
+ *
+ *  the "CreateXXX" series of methodss take a KCreateMode ( see kfs/directory.h ).
+ *  when mode == kcmOpen, create if needed, overwrite if exists.
+ *  when mode == kcmInit, create if needed, clear if exists.
+ *  when mode == kcmCreate, fail if exists, create otherwise.
+ *  if mode has kcmParents set, fill in missing parents on create.
+ *
+ * These is the only open API into a TOC with in the archive package of classes.
+ * Functions to parse archives (Tar was the first format but is not expected to 
+ * be the only format) use these methods to add entries to the TOC.  New parsers
+ * should fit the signature of 
+ *
+ *  rc_t PARSER (KToc * <TOC>, const KFile * <ARCHIVE>)
+ *
+ * "PARSER" [IN] is the parsing function
+ *
+ * "TOC" [OUT] is a opaque class that is never exposed other than to these create
+ * entry methods
+ *
+ * "FILE" [IN] is an archive opaquely opened as a KFile and then given to a
+ * KDirectory and should not be accessed from outside this parsing function.
+ *
+ * An Archive is opened via a call to friend function.  It has by design been
+ * made to mimic the signature of KDirectoryOpenDirRead with only a change in
+ * parameters after path.  No "..." or va_list is supported.  To use that
+ * functionality one would have to call KDirectoryResolvePath and use the
+ * new path generated by that call as the path parameter for this function.
+ *
+ * rc_t KDirectoryOpenArcDirRead (const KDirectory * dir, 
+ *                    KDirectory ** pdir,
+ *                    bool chroot,
+ *                    const char * path,
+ *                    rc_t (CC* parse )(KToc *,const KFile*));
+ *
+ * "dir" [IN] is an existing KDirectory in which to find the archive file.
+ *
+ * "pdir" [OUT] is a pointer which will after the function is called point to the new
+ * KDirectory that is the archive opened as a directory with the same name as
+ * its containing file.
+ *
+ * "chroot" [IN] is false(1)/true(1 [or any non zero]) as to whether the archive will
+ * treat its contents as a virtual root directory ('/') or not.
+ *
+ * "path" [IN] is the address with in directory of the archive.
+ *
+ * "parse" [IN] is the function that will create TOC entries for that archive.
+ *
+ * No member element or function of an object of class TOC will be exposed
+ * other than these create entry methods.
+ */
+typedef struct KToc KToc;
+
+/* Init
+ *  construct a TOC tied to a KFile with a given path
+ * At this point, this method has been made private and will only be called by 
+ * KDirectoryOpenArcDirRead().
+ */
+
+rc_t KTocInit( KToc**self, struct String const * path, KArcFSType arctype,
+        const void * archive, KSRAFileAlignment alignment);
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+rc_t KTocAddRef( const KToc *self );
+rc_t KTocRelease( const KToc *self );
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ * At this point, these methods have been made private and will only be called by 
+ * with in the archive package.  References to the TOC will be handled within 
+ * the constructors and destructors for KDirectorys and KFiles created by
+ * KDirectory OpenArcDirRead() and then any KDirectory OpenFileRead() and 
+ * KDirectory OpenDirRead() with in that initial KDirectory().  At this point
+ * archives are read only so OpenFileWrite() OpenDirWrite() CreateDir() CreateFile()
+ * and other such methods are not supported for archives.
+ */
+rc_t KTocAddRef ( const KToc *self );
+rc_t KTocRelease ( const KToc *self );
+
+
+/* ResolvePathNode
+ *
+ *
+ * [RET] rc_t                   0 for success; anything else for a failure
+ *                      see itf/klib/rc.h for general details
+ * [IN]  const KToc *   self        TOC self reference: object oriented in C
+ * [IN]  const char *       path        the path to be parsed - it will start at the root 
+ *                      of the TOC's address
+ * [OUT] const KTocEntry **     pnode       the address of the final node traversed is put here
+ * [OUT] uint32_t *         type        the type of node for the final node
+ * [OUT] char **        unusedpath  This will point to any part of the path not used up
+ *                      in parsing against the TOC.
+ *                      NULL if the leaf node was found
+ *                      the start of a node that could not be parsed
+ *                      the start of the node after a softlink (or NULL)
+ */
+rc_t KTocResolvePathTocEntry( const KToc *self,
+                         const KTocEntry ** pnode,
+                         const char *path,
+                         size_t path_len,
+                         KTocEntryType * ptype,
+                         const char ** unusedpath);
+
+/*--------------------------------------------------------------------------
+ * Constructors/factories
+ */
+
+/* CreateDir
+ *  create a sub-directory
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+rc_t KTocCreateDir ( KToc *self, KTime_t mtime, uint32_t access, 
+        KCreateMode mode, const char *path, ... );
+rc_t KTocVCreateDir ( KToc *self, KTime_t mtime, uint32_t access,
+        KCreateMode mode, const char *path, va_list args );
+
+/* CreateFile
+ *  create an entry for a contiguous file
+ *
+ *  "source_position" [ IN ] and "size" [ IN ] - description of the contiguous
+ *  region of the archive file occupied by the file
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ * This is used also to create an empty file.  When size is zero the underlying 
+ * library might create a special zero length entry type.
+ */
+rc_t KTocCreateFile ( KToc *self, uint64_t source_position, uint64_t size,
+              KTime_t mtime, uint32_t access, KCreateMode mode,
+              const char *path, ... );
+rc_t KTocVCreateFile ( KToc *self, uint64_t source_position, uint64_t size,
+               KTime_t mtime, uint32_t access, KCreateMode mode,
+               const char *path, va_list args );
+rc_t KTocCreateZombieFile ( KToc *self, uint64_t source_position, uint64_t size,
+              KTime_t mtime, uint32_t access, KCreateMode mode,
+              const char *path, ... );
+rc_t KTocVCreateZombieFile ( KToc *self, uint64_t source_position, uint64_t size,
+               KTime_t mtime, uint32_t access, KCreateMode mode,
+               const char *path, va_list args );
+
+/* CreateChunkedFile
+ *  create an entry for a chunked file
+ *
+ *  a chunked file consists of 0 or more possibly discontiguous chunks
+ *  positioned within the logical file
+ *
+ *  "size" [ IN ] - the size of the logical file
+ *
+ *  "num_chunks" [ IN ] - the number of chunks in "chunks"
+ *
+ *  "chunks" [ IN ] - an array of chunk descriptors, where each chunk
+ *  contains valid data that are mapped to form file
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+rc_t KTocCreateChunkedFile ( KToc *self, uint64_t size, KTime_t mtime,
+                 uint32_t access, uint32_t num_chunks,
+                 const KTocChunk chunks [], KCreateMode mode,
+                 const char *path, ... );
+rc_t KTocVCreateChunkedFile ( KToc *self, uint64_t size, KTime_t mtime,
+                  uint32_t access, uint32_t num_chunks,
+                  const KTocChunk chunks [], KCreateMode mode,
+                  const char *path, va_list args );
+
+/* CreateHardLink
+ *  creates a hard link to an existing file within TOC
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "targ" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "link" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting alias
+ */
+rc_t KTocCreateHardLink ( KToc *self, KTime_t mtime, uint32_t access,
+              KCreateMode mode, const char *targ,
+              const char *link, ... );
+rc_t KTocVCreateHardLink ( KToc *self, KTime_t mtime, uint32_t access,
+               KCreateMode mode, const char *targ,
+               const char *link, va_list args );
+
+/* CreateSoftLink
+ *  creates a soft link to any file or directory
+ *  that is interpreted upon acces.
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "targ" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target alias
+ */
+rc_t KTocCreateSoftLink ( KToc * self, KTime_t mtime, uint32_t access,
+              KCreateMode mode, const char * targ,
+              const char * alias, ... );
+rc_t KTocVCreateSoftLink ( KToc * self, KTime_t mtime, uint32_t access,
+               KCreateMode mode, const char * targ,
+               const char * alias, va_list args );
+
+/* OpenArcDirRead
+ *  Open an archive file as a KDirectory derived type: made to match 
+ *  KDirectoryOpenDirRead() where parse could be the first element of arg
+ *
+ * [IN]  dir    A KDirectory (of any derived type) to reach the archive file
+ * [OUT] pdir   The KDirectory (of type KArcDir) that will be created
+ * [IN]  chroot if non-zero, the new directory becomes chroot'd and interprets paths
+ *      stating with '/'
+ * [IN]  path   The path to the archive - this will become the directory path
+ * [IN]  parse  A pointer to the function needed to build a TOC by parsing the file
+ *
+ * parameters to parse
+ * REQUIRED:    KToc *
+ * REQUIRED:    void *  KFile* | KDirectory* | ???
+ * OPTIONAL:    bool (*)(const char*)           Filter: include or skip this path
+ * OPTIONAL:    rc_t (*)(???)               Sort: reorder name list
+ */
+
+KFS_EXTERN
+rc_t CC KDirectoryOpenArcDirRead (const KDirectory * dir, 
+            const KDirectory ** pdir,
+            bool chroot,
+            const char * path,
+            KArcFSType baseType,
+            rc_t (CC*parse)(KToc*,const void *,
+                bool(CC*)(const KDirectory*,const char *, void*),
+                void *),
+                bool (CC* filter )(const KDirectory*, const char *, void *),
+            void * filterparam );
+
+
+#if 0
+rc_t KTocResolvePathTocEntry( const KToc *self,
+                 const KTocEntry ** pnode,
+                 const char *path,  /* must be entirely in the TOC */
+                 size_t path_len,
+                 KTocEntryType * ptype,
+                 const char ** unusedpath);
+#endif
+
+
+
+const KTocEntry* KTocGetRoot( const KToc * self );
+
+#if 0
+const char * KTocGetRootPath( const KToc * self, size_t * len );
+#endif
+
+rc_t KTocGetPath( const KToc * self, struct String const ** path );
+rc_t KTocResolvePathFromOffset( const KToc *self,
+                const char ** path,
+                uint64_t * ppos,
+                uint64_t offset );
+
+KSRAFileAlignment KTocAlignmentGet( KToc * self );
+rc_t KTocAlignmentSet( KToc * self,KSRAFileAlignment align );
+
+const void * KTocGetArchive( const KToc * self );
+
+KFS_EXTERN rc_t KTocPersist( const KToc * self,
+                             void ** buffer, size_t * buffer_size,
+                             uint64_t * virtual_file_size,
+                             struct Vector const * files );
+
+KFS_EXTERN rc_t CC KTocEntryPersist( void *param, const void * node,
+                                     size_t * num_writ, 
+                                     PTWriteFunc write, void * write_param );
+
+rc_t KTocInflatePBSTree (KToc * self, uint64_t arcsize, const void * treestart,
+                         uint32_t maxsize, uint64_t offset,
+                         bool rev, const char * path);
+
+rc_t KArcDirPersistHeader	(const KArcDir * self,
+    void ** buffer, size_t * buffer_size, uint64_t * file_sile, uint32_t align,
+    rc_t ( CC *sort )(const struct KDirectory*, struct Vector*) );
+
+
+/* ----------------------------------------------------------------------
+ * KArcDirGetTOC
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]  const KArcDir *	self		Object oriented C; KArcDir object for this method
+ * [OUT] const KToc **		toc
+ */
+rc_t  KArcDirGetTOC (const struct KArcDir * self, const struct KToc ** toc);
+
+
+
+#endif /* #ifndef _h_kfs_toc_priv_h_ */
+/* end of file */
diff --git a/libs/kfs/toc.c b/libs/kfs/toc.c
new file mode 100644
index 0000000..9eeb89b
--- /dev/null
+++ b/libs/kfs/toc.c
@@ -0,0 +1,1764 @@
+/*===========================================================================
+ *
+ *                            Public DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+#include <atomic32.h>
+#include <klib/container.h>
+#include <klib/vector.h>
+#include <klib/pbstree.h>
+#include <klib/text.h>
+#include <kfs/arc.h>
+#include <kfs/sra.h>
+#include <kfs/toc.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include "toc-priv.h"
+
+#include <assert.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <os-native.h>
+
+
+/* ======================================================================
+ * Defines relevant to the whole compilation unit.
+ */
+
+/* !!!!!!!! WHY ISN'T THIS IN A COMMON PRIVATE HEADER FILE? !!!!!!! */
+rc_t SraHeaderMake (KSraHeader ** pself, size_t treesize, KSRAFileAlignment alignment);
+
+/* ======================================================================
+ * KTocEntryStack
+ *
+ * A private class used to keep track of directories passed through while adding
+ * entries to the TOC.
+ *
+ * private little class for handling a stack of pointers to TOC entrys
+ */
+struct KTocEntryStack
+{
+    unsigned		count;
+    unsigned		allocated;
+    KTocEntry **	stack;
+};
+
+/* ----------------------------------------------------------------------
+ * KTocEntryStackNew
+ * [OUT] KTocEntryStack ** 	pself		object oriented object reference where
+ * construct a Entry Stack at where the pointer to pointer so self points
+ *						to put the reference to the new object
+ */
+rc_t KTocEntryStackNew( KTocEntryStack ** self )
+{
+#define ARBITRARY_STACK_SIZE	(16)
+    if (self == NULL)
+        return RC (rcFS, rcToc, rcConstructing, rcParam, rcNull);
+
+    *self = malloc (sizeof (KTocEntryStack));
+    (*self)->count = 0;
+    (*self)->allocated = ARBITRARY_STACK_SIZE;
+    (*self)->stack = malloc ((*self)->allocated * sizeof (KTocEntry*));
+    if ((*self)->stack == NULL)
+        return RC (rcFS, rcToc, rcAllocating, rcMemory, rcInsufficient);
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryStackDel
+ *
+ * destruct a Entry Stack
+ *
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN] KTocEntryStack *	self		object oriented object reference what to destroy
+ */
+rc_t KTocEntryStackDel( KTocEntryStack * self )
+{
+
+    /* empty stack there so just return ok for now */
+    if (self == NULL)
+        return 0;
+
+    if (self->stack != NULL)
+        free (self->stack);
+
+    free (self);
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryStackDepth
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]  KTocEntryStack * 	self		object oriented object reference
+ * [OUT] int			depth		return the current depth/length of the stack
+ *						(int allows compiler flexibilty to use
+ *						efficient type)
+ */
+rc_t KTocEntryStackDepth( KTocEntryStack * self, int * depth )
+{
+    *depth = self->count;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryStackPush
+ *
+ * adds a reference to KTocEntry to the stack
+ *
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN] KTocEntryStack *	self		object oriented object reference what to destroy
+ * [IN] KTocEntry * 		pathaddr	the entry to add
+ */
+rc_t KTocEntryStackPush( KTocEntryStack * self, KTocEntry * pathaddr )
+{
+#define ARBITRARY_INCREMENT_SIZE	(8)
+
+    if (self == NULL)
+        return RC (rcFS, rcToc, rcInserting, rcSelf, rcNull);
+
+    if (self->count >= self->allocated)
+    {
+        KTocEntry **	stack;
+        int	new_allocated = self->allocated + ARBITRARY_INCREMENT_SIZE;
+        stack = realloc (self->stack, self->allocated * sizeof (KTocEntry*));
+        if (stack == NULL)
+        {
+            return RC (rcFS, rcToc, rcAllocating, rcMemory, rcInsufficient);
+        }
+        self->allocated = new_allocated;
+        self->stack = stack;
+    }
+    self->stack[self->count++] = pathaddr;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryStackPop
+ *
+ * removess a reference to KTocEntry to the stack (not C++STLish but more normal stack operation)
+ *
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]  KTocEntryStack * 	self		object oriented object reference what to destroy
+ * [OUT] KTocEntry ** 	pathaddr	where to put the reference to the entry removed
+ */
+rc_t KTocEntryStackPop( KTocEntryStack * self, KTocEntry ** pathaddr )
+{
+    if (self == NULL)
+        return RC (rcFS, rcToc, rcReading, rcSelf, rcNull);
+
+    if (pathaddr == NULL)
+        return RC (rcFS, rcToc, rcReading, rcParam, rcNull);
+
+    if (self->count == 0)
+    {
+        /* -----
+         * this means empty stack and is not considered an error
+         * though it should be looked for by the caller
+         */
+        *pathaddr = NULL;
+    }
+    else
+    {
+        *pathaddr = self->stack[--(self->count)];
+    }
+    return 0;
+}
+
+
+static
+int64_t CC KTocEntryIndexCmp2 (const BSTNode * n, const BSTNode * p)
+{
+    uint64_t nos;
+    uint64_t noe;
+    uint64_t pos;
+    uint64_t poe;
+
+    assert (n != NULL);
+    assert (p != NULL);
+    {
+        const KTocEntryIndex * ne = (const KTocEntryIndex*)n;
+        nos = ne->entry->u.contiguous_file.archive_offset;
+        noe = nos + ne->entry->u.contiguous_file.file_size;
+    }
+    {
+        const KTocEntryIndex * pe = (const KTocEntryIndex*)p;
+        pos = pe->entry->u.contiguous_file.archive_offset;
+        poe = pos + pe->entry->u.contiguous_file.file_size;
+    }
+    if ((nos == pos)&&(noe == poe))
+        return 0;
+    if (noe <= pos)
+        return -1;
+    return 1;
+}
+
+static
+uint64_t add_filler (uint64_t z, KSRAFileAlignment a)
+{
+    if (a > 1)
+    {
+        uint64_t m = (uint64_t)a - 1;
+        return (z + m) & ~ m;
+    }
+    return z;
+}
+
+static
+rc_t KTocCreateEntryIndex (KToc * self, const char * path, uint64_t * file_offset)
+{
+    rc_t rc;
+    size_t len;
+    union idx
+    {
+        void * v;
+        KTocEntryIndex * i;
+        char * b;
+    } idx;
+    KTocEntryType type;
+/*     const KTocEntry * entry; */
+    const char * left;
+
+    TOC_FUNC_ENTRY();
+
+    assert (self != NULL);
+    assert (path != NULL);
+
+    rc = 0;
+
+    len = strlen (path);
+    idx.v = malloc (sizeof (*idx.i) + len + 1);
+    if (idx.v == NULL)
+    {
+        rc = RC (rcFS, rcToc, rcReindexing, rcMemory, rcExhausted);
+        LOGERR( klogErr, rc, "Out of memory creating new path");
+    }
+    else
+    {
+        char * tmp;
+
+        type = ktocentrytype_unknown;
+        tmp = idx.b + sizeof (*idx.i);
+        strcpy (tmp, path);
+        StringInitCString (&idx.i->fullpath, tmp);
+        rc = KTocResolvePathTocEntry (self, (const KTocEntry**)&idx.i->entry, path, len, &type, &left);
+        if (rc != 0)
+            LOGERR( klogErr, rc, "Unable to resolve path");
+        else
+        {
+    /* 	    if (left != 0) */
+    /* 		rc = RC (rcFS, rcToc, rcAccessing, rcPath, rcNotFound); */
+    /* 	    else */
+            {
+                uint64_t offset;
+                uint64_t new_offset;
+                switch (type)
+                {
+                case ktocentrytype_dir:
+                case ktocentrytype_softlink:
+                case ktocentrytype_hardlink:
+                case ktocentrytype_emptyfile:
+                    goto no_entry;
+                case ktocentrytype_file:
+                            offset = add_filler (*file_offset, self->alignment);
+                            idx.i->entry->u.contiguous_file.archive_offset = offset;
+                            new_offset = offset + idx.i->entry->u.contiguous_file.file_size;
+                    break;
+                case ktocentrytype_chunked:
+                            offset = add_filler (*file_offset, self->alignment);
+                    idx.i->entry->u.chunked_file.archive_offset = offset;
+                    new_offset = offset + idx.i->entry->u.chunked_file.file_size;
+                    break;
+                case ktocentrytype_unknown:
+                    rc = RC (rcFS, rcToc, rcReindexing, rcTocEntry, rcUnknown);
+                    break;
+                case ktocentrytype_notfound:
+                    rc = RC (rcFS, rcToc, rcReindexing, rcTocEntry, rcNotFound);
+                    break;
+                default:
+                    rc = RC (rcFS, rcToc, rcReindexing, rcTocEntry, rcInvalid);
+                    break;
+                }
+                if (rc != 0)
+                    LOGERR( klogErr, rc, "Unable to handle path");
+                else
+                {
+                    rc = BSTreeInsert (&self->offset_index, &idx.i->node, KTocEntryIndexCmp2);
+                    if (rc == 0)
+                    {
+                        *file_offset = new_offset;
+                        return 0;
+                    }
+                }
+            }
+        }
+        no_entry:
+        free (idx.v);
+    }
+    return rc;
+}
+
+static
+void CC KTocEntryIndexWhack (BSTNode * n, void * data)
+{
+    free (n);
+}
+
+struct ugliness
+{
+    const KToc * toc;
+    uint64_t     offset;
+    uint64_t     foffset;
+};
+
+static int64_t CC KTocEntryIndexCmpOffset (const void * item /* offset */,
+    const BSTNode * n)
+{
+    struct ugliness * ugly;
+    uint64_t nos;
+    uint64_t noe;
+    uint64_t po;
+    assert (item != NULL);
+    assert (n != NULL);
+    ugly = (struct ugliness*)item;
+    {
+        const KTocEntryIndex * ne = (const KTocEntryIndex*)n;
+        nos = ne->entry->u.contiguous_file.archive_offset;
+        noe = add_filler (nos + ne->entry->u.contiguous_file.file_size,
+                          ugly->toc->alignment);
+    }
+    po = ugly->offset;
+
+    TOC_DEBUG (("%s: %lu %lu %lu\n", __func__, po, nos, noe));
+
+    ugly->foffset = 0;
+    if (po < nos)
+        return -1;
+    else if (po < noe)
+    {
+        ugly->foffset = po - nos;
+        return 0;
+    }
+    else
+        return 1;
+}
+
+/* -----
+ * We use MAX_PATH if it is available but not religiously.  We handle most
+ * buffer over-runs with in the module only truncating paths at the border
+ * of the module where KDirectory doesn't handle path's longer than MAX_PATH
+ */
+#ifdef MAX_PATH
+#define	KARC_DEFAULT_PATH_ALLOC			(MAX_PATH)
+#else
+#define	KARC_DEFAULT_PATH_ALLOC			(4096)
+#endif
+
+/* ======================================================================
+ * KToc method prototypes and defines
+ */
+
+/*--------------------------------------------------------------------------
+ * KToc
+ *  archive table of contents
+ *
+ *  the "CreateXXX" series of messages take a KCreateMode (see kfs/directory.h).
+ *  when mode == kcmOpen, create if needed, overwrite if exists.
+ *  when mode == kcmInit, create if needed, clear if exists.
+ *  when mode == kcmCreate, fail if exists, create otherwise.
+ *  if mode has kcmParents set, fill in missing parents on create.
+ */
+
+
+/* ======================================================================
+ * KToc method bodies
+ */
+
+/* ----------------------------------------------------------------------
+ * KToc
+ *  archive table of contents
+ *
+ *  the "CreateXXX" series of messages take a KCreateMode (see kfs/directory.h).
+ *  when mode == kcmOpen, create if needed, overwrite if exists.
+ *  when mode == kcmInit, create if needed, clear if exists.
+ *  when mode == kcmCreate, fail if exists, create otherwise.
+ *  if mode has kcmParents set, fill in missing parents on create.
+ */
+
+rc_t KTocInit ( KToc ** self,
+                const String * path,
+                KArcFSType arctype,
+                const void * archive,
+                KSRAFileAlignment alignment )
+{
+    char * str_data;
+    rc_t rc;
+
+    /* -----
+     * expected failure mode is NULL references for needed initializers
+     */
+    if (self == NULL)
+    {
+        return RC (rcFS, rcToc, rcConstructing, rcSelf, rcNull);
+    }
+    if ((path == NULL)||(archive == NULL))
+    {
+        return RC (rcFS, rcToc, rcConstructing, rcParam, rcNull);
+    }
+
+    /* -----
+     * get memory for the TOC and for its path
+     */
+    *self = malloc (sizeof(KToc) + StringSize(path) + 1);
+
+    /* -----
+     * expected failure mode is memory allocation failure
+     */
+    if (*self == NULL)
+    {
+        return RC (rcFS, rcToc, rcAllocating, rcMemory, rcInsufficient);
+    }
+
+    /* -----
+     * point past the KToc structure in the allocated memory for the
+     * string path of this TOC
+     */
+    str_data = (char *)*self + sizeof (KToc);
+
+    /* -----
+     * reference the existing KFile
+     */
+    switch ((*self)->arctype = arctype)
+    {
+    default:
+        free (self);
+        return RC (rcFS, rcToc, rcConstructing, rcParam, rcInvalid);
+    case tocKFile:
+        KFileAddRef ((*self)->archive.v = archive);
+        break;
+    case tocKDirectory:
+        KDirectoryAddRef ((*self)->archive.v = archive);
+        break;
+    }
+
+    /* need to set back pointer karchive */
+
+    /* -----
+     * We added here by default
+     */
+    atomic32_set (&(*self)->refcount, 1);
+
+    /* -----
+     * a tad clunky
+     */
+    string_copy (str_data, 1 + StringSize(path), path->addr, StringSize(path));
+    StringInit (&((*self)->path), str_data, StringSize(path), StringLength(path));
+    rc = (KTocAlignmentSet (*self, alignment));
+    if (rc == 0)
+    /* -----
+     * Build the "root directory" structure for the TOC initialized to empty
+     */
+    {
+        KTocEntry * pentry = &(*self)->entry;
+        const char *  pchar = strrchr ((*self)->path.addr, '/') + 1;
+        size_t	      size = (*self)->path.size - (pchar - (*self)->path.addr);
+
+        if (pchar == NULL)
+            pchar = (*self)->path.addr;
+
+        StringInit ( &pentry->name, pchar, size, (uint32_t)size );
+        pentry->type = ktocentrytype_dir;
+        BSTreeInit(&pentry->u.dir.tree);
+        BSTreeInit(&(*self)->offset_index);
+        (*self)->header = NULL;
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * AddRef
+ *  ignores NULL references
+ */
+rc_t KTocAddRef ( const KToc *self )
+{
+    KToc *	mutable_self = (KToc*)self; /* strip const protection for mutable field */
+
+    if (mutable_self != NULL)
+        atomic32_inc (&mutable_self->refcount);
+
+    return 0;
+}
+/* ----------------------------------------------------------------------
+ * AddRef
+ * Release
+ *  ignores NULL references
+ */
+rc_t KTocRelease ( const KToc *self )
+{
+    KToc *	mutable_self = (KToc*)self; /* strip const protection for mutable field */
+    rc_t	rc = 0;
+
+    if (mutable_self == NULL)
+    {
+        return RC (rcFS, rcToc, rcReleasing, rcSelf, rcNull);
+    }
+
+    if (atomic32_dec_and_test (&mutable_self->refcount))
+    {
+        switch (self->arctype)
+        {
+        case tocUnknown:
+        case tocKVirtual:
+            free((void*)self->archive.v);
+            break;
+
+        case tocKFile:
+            KFileRelease (self->archive.f);
+            break;
+        case tocKDirectory:
+            KDirectoryRelease (self->archive.d);
+            break;
+        }
+        BSTreeWhack (&mutable_self->entry.u.dir.tree, KTocEntryWhack, &rc);
+        BSTreeWhack (&mutable_self->offset_index, KTocEntryIndexWhack, &rc);
+        free (mutable_self);
+    }
+/*     else */
+/*     { */
+/*     } */
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KTocCreateSubdirs
+ *
+ * This is a constructor/parse helper method (the p starting the name is meant to 
+ * imply a c++/Java private situation)
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [INOUT]KToc * 		self		TOC self reference: object oriented in C
+ * [IN]   const char * 		_path		start of directory path
+ * [IN]   const char * 		end		end of directory path
+ * [IN]   KCreateMode  		mode		whether or not to document the existing?
+ * [INOUT]KTocEntryStack * 	pathstack	created outside this function but this is
+ *						where it is primarily filled in.  This is
+ *						created for use in KTocResolveHardLink
+ */
+static
+rc_t	KTocCreateSubdirs (KToc *    self,	   /* TOC self reference: object oriented in C */
+			   const char * _path,   /* start of directory path */
+			   const char * end, 	   /* end of directory path */
+			   KTime_t mtime,
+			   uint32_t access,
+			   KCreateMode  mode,    /* whether or not to document the existing? */
+			   KTocEntryStack * pathstack)
+{
+    const
+	char * 	path = _path;		/* pointer to head of remaining path to parse: starts at the beginning of course */
+    const
+	char *  slash;			/* pointer to the next '/' (or NUL) past the next facet of the path */
+    BSTree *	tree = &self->entry.u.dir.tree;	/* current directory tree we are in */
+    rc_t	rc = 0;		/* general purpose rc_t for calls and our own return */
+    BSTNode *   exists = NULL;		/* is there already a entry with our name? this will be it */
+    bool	success = true;		/*  */
+
+    /* -----
+     * special case of absolute position being turned into relative
+     * skip past initial "/" or "//" in a path
+     */
+    while (*path == '/')
+    {
+        PLOGMSG (klogWarn, (klogWarn,
+                            "skipping initial '/' in $(path)",
+                            PLOG_S(path),
+                            path));
+        ++path;
+    }
+
+    /* -----
+     * Now continue on with each facet of the path one at a time
+     */
+    for (;path < end; path = slash+1)
+    {
+        KTocEntry * newentry;			/* new entry for the new name entry: might be a duplicate */
+        bool	      do_insert = false;	/* do we insert a new entry? short cut for later */
+
+        /* -----
+         * find the next (first) '/' in the remaining path
+         */
+        slash = strchr (path, '/');
+
+        /* -----
+         * we've got the last directory in the path if there are no
+         * more '/' characters or if the next '/' is the last character in the
+         * path (we don't do white space checks!)
+         */
+        if (slash == NULL)
+        {
+            slash = end;
+        }
+
+        /* -----
+         * first we'll compare our new path against the special '.' and '..'
+         * special directory pointers
+         */
+        if ((path[0] == '.')&&(path+1 == slash))	/* . */
+        {
+            /* -----
+             * just ignore "here" directory references
+             */
+            continue;
+        }
+        else if ((path[0] == '.')&&(path[1] == '.')&&(path+2 == slash))	/* .. */
+        {
+            /* -----
+             * for up to parent directory references we try to change to that directory
+             */
+            int depth;
+
+            rc = KTocEntryStackDepth (pathstack, &depth);
+            if (depth <= 0)
+            {
+                /* FAILURE */
+                rc = RC (rcFS, rcToc, rcConstructing, rcLink, rcViolated);
+                success = false;
+                break;
+            }
+            else
+            {
+                rc = KTocEntryStackPop (pathstack, &newentry);
+            }
+        }
+        else
+        {
+            /* -----
+             * Create a new directory entry
+             *
+             * access isn't really implemented yet so make a directory
+             * default to read + execute for anyone
+             *
+             * we might only be using this directory entry for comparisons <shrug>
+             */
+            rc = KTocEntryNewDirectory (&newentry, path, slash - path, mtime, access);
+
+            /* -----
+             * pass along failures - no need to change any parts at this point
+             * but that time may come
+             */
+            if (rc != 0)
+            {
+                LOGMSG (klogErr, "failed to construct a directory entry: memory allocation");
+                return rc;
+            }
+
+            exists = BSTreeFind (tree, newentry, KTocEntryCmpVoid);
+
+            /* -----
+             * the expected is to insert the entry if it wasn't there but will check
+             * special circumstances
+             *
+             * so plan to insert or not based on whether it is there and expect
+             * all to be well.
+             *
+             * never insert if it already exists
+             */
+            do_insert = (bool)((exists == NULL) ?  true : false);
+            rc = 0;
+
+            /* -----
+             * Open/init/create with no make parents:
+             */
+            if ((exists == NULL)&& !(mode & kcmParents))
+            {
+                /* parent did not exist so we will fail */
+                rc = RC (rcFS, rcToc, rcCreating, rcSelf, rcInconsistent);
+                do_insert = false;
+                success = false;
+            }
+
+            /* -----
+             * if rc is set, we had a problem and will fail
+             */
+            if (rc != 0)
+            {
+                LOGERR	(klogErr, rc,
+                         "directory parse/creation failed");
+                (void)KTocEntryDelete(newentry);
+                break;
+            }
+
+            if (do_insert)
+            {
+                rc = BSTreeInsert (tree, &newentry->node, KTocEntryCmp2);
+                if (rc)
+                {
+                    LOGMSG (klogErr, "directory parse/creation failed 2");
+                    (void)KTocEntryDelete(newentry);
+                    break;
+                }
+                TOC_DEBUG (("%s: inserted new directory into TOC %S\n", __func__, newentry->name));
+            }
+            else
+            {
+                (void)KTocEntryDelete(newentry);
+                newentry = (KTocEntry*)exists;
+            }
+
+            /* -----
+             * move into the subdirectory for the next directory in the path
+             */
+            if ((rc = KTocEntryStackPush (pathstack, newentry)) != 0)
+            {
+                success = false;
+                break;
+            }
+
+            tree = &newentry->u.dir.tree;
+        }
+    }
+    return success ? 0 : rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KTocCreate
+ *
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN] KToc *		self		TOC self reference: object oriented in C
+ * [IN] KCreateMode 		mode		KDirectory defines that define what to so with
+ *						"files" that already existed or did not including
+ *						missing subdirectories in the path
+ * [IN] const char *		ppath		the path name for the new entry relative to the
+ *						base of the TOC
+ * [IN] const KTocEntryParam*	pparams		specific parameters for this type of entry - the
+ *						type of entry is included in this structure
+ */
+static rc_t KTocCreate (KToc *self,
+			KCreateMode mode,
+			const char *ppath,
+			const KTocEntryParam * pparams)
+{
+    rc_t		rc;
+    char *		pend;
+    size_t		name_size;
+    BSTree *		ptree;
+    KTocEntry * 	pnewentry = NULL;	/* init to kill a warning */
+    KTocEntry * 	pexistingentry;
+    KTocEntry * 	pwd = NULL;
+    KTocEntryStack *	pdirstack;
+
+    assert (self != NULL);
+    assert (ppath != NULL);
+    assert (pparams != NULL);
+
+    ptree = &self->entry.u.dir.tree;
+
+    if ((rc = KTocEntryStackNew (&pdirstack)) != 0)
+    {
+        return rc;
+    }
+    /* -----
+     * look for a '/' that isn't the last character in the path
+     */
+    pend = string_rchr (ppath, strlen(ppath)-1, '/');
+    if (pend != NULL)
+    {
+
+        rc = KTocCreateSubdirs (self, ppath, pend, pparams->mtime,
+                                pparams->access, mode, pdirstack);
+
+        rc = KTocEntryStackPop (pdirstack, &pwd);
+        if (pwd)
+        {
+            ptree = &(pwd->u.dir.tree);
+        }
+
+        ppath = pend+1;
+    }
+
+    name_size = strlen(ppath);
+    switch (pparams->type)
+    {
+    default:
+        break;
+    case ktocentrytype_dir:
+        rc = KTocEntryNewDirectory (&pnewentry,
+                                    ppath,
+                                    name_size,
+                                    pparams->mtime,
+                                    pparams->access);
+        break;
+    case ktocentrytype_file:
+        rc = KTocEntryNewFile (&pnewentry,
+                               ppath,
+                               name_size,
+                               pparams->mtime,
+                               pparams->access,
+                               pparams->u.file.source_position,
+                               pparams->u.file.size);
+        break;
+    case ktocentrytype_zombiefile:
+        rc = KTocEntryNewZombieFile (&pnewentry,
+                                     ppath,
+                                     name_size,
+                                     pparams->mtime,
+                                     pparams->access,
+                                     pparams->u.file.source_position,
+                                     pparams->u.file.size);
+        break;
+    case ktocentrytype_chunked:
+        rc = KTocEntryNewChunked (&pnewentry,
+                                  ppath,
+                                  name_size,
+                                  pparams->mtime,
+                                  pparams->access,
+                                  pparams->u.chunked.size,
+                                  pparams->u.chunked.chunks,
+                                  pparams->u.chunked.num_chunks);
+        break;
+    case ktocentrytype_softlink:
+        rc = KTocEntryNewSoft (&pnewentry,
+                               ppath,
+                               name_size,
+                               pparams->mtime,
+                               pparams->access,
+                               pparams->u.softlink.targ,
+                               strlen (pparams->u.softlink.targ));
+        break;
+    case ktocentrytype_hardlink:
+        rc = KTocEntryNewHard (&pnewentry,
+                               ppath,
+                               name_size,
+                               pparams->mtime,
+                               pparams->access,
+                               pparams->u.hardlink.ref);
+        break;
+    }
+/*     if (rc != 0) */
+/* 	; */
+
+    pexistingentry = (KTocEntry*)BSTreeFind (ptree, pnewentry, KTocEntryCmpVoid);
+
+    if (pexistingentry != NULL)
+    {
+        switch (mode & kcmValueMask)
+        {
+        default:
+            LOGMSG (klogInt, "invalis create mode flag for Toc Entry");
+        case kcmOpen:	/* use existing entry if it exists */
+            KTocEntryDelete (pnewentry);
+            break;
+
+        case kcmInit:
+            BSTreeUnlink (ptree, &pexistingentry->node); /*?*/
+            KTocEntryDelete (pexistingentry);
+            goto insert;
+            break;
+
+        case kcmCreate:
+            KTocEntryDelete (pnewentry);
+            rc = RC (rcFS, rcToc, rcInserting, rcDirEntry, rcDuplicate);
+            break;
+        }
+    }
+    else
+    {
+    insert:
+        rc = BSTreeInsert (ptree, &pnewentry->node, KTocEntryCmp2);
+        TOC_DEBUG (("%s: inserted new %s into TOC %s\n", __func__,
+                    KTocEntryTypeGetString(pparams->type),
+                    pnewentry->name.addr));
+    }
+#if 0
+    if (pparams->type == ktocentrytype_hardlink)
+    {
+
+        /* -----
+         * Now the ugly specific part of a hard link - resolve the link
+         */
+        rc = KTocResolveHardLink (self, pparams->u.hardlink.targ, pdirstack, pwd, &(pnewentry->u.hard_link.ref));
+        if (rc  != 0)
+        {
+            /* kill off node */
+            BSTreeUnlink (ptree, &pnewentry->node);
+            rc = RC (rcFS, rcToc, rcAliasing, rcArcHardLink, rcNotFound);
+        }
+    }
+#endif
+    KTocEntryStackDel (pdirstack);
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Constructors/factories
+ */
+static
+rc_t createPath (char ** newpath, const char * path, va_list args)
+{
+    rc_t rc;
+    char * p;
+    char * pp;
+    size_t l;
+    int i;
+
+    rc = 0;
+    p = NULL;
+    l = 4096;
+    *newpath = p;
+
+    /* not trusting C99 version of vsnprintf is in place rather than SUSv2 */
+    for (;;)
+    {
+        pp = realloc (p,l);
+        if (pp == NULL)
+        {
+            rc = RC (rcFS, rcToc, rcConstructing, rcMemory, rcExhausted);
+            return rc;
+        }
+        if (args == NULL)
+        {
+            i = (int)strlen ( path );
+            if ( i < (int)l )
+            strcpy ( pp, path );
+        }
+        else
+            i = vsnprintf (pp, l, path, args);
+        if (i < 0)
+        {
+            rc = RC (rcFS, rcToc, rcConstructing, rcFormat, rcInvalid);
+            free (pp);
+            return rc;
+        }
+        p = pp;
+        if ( i < (int)l )
+            break;
+        l = i + 1;
+    } 
+
+    *newpath = pp;
+
+    return rc;
+}
+
+
+
+/* ---------
+ * CreateDir
+ *  create a sub-directory
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation in kfs/directory.h).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ */
+rc_t KTocCreateDir ( KToc *self,KTime_t mtime, uint32_t access,
+		    KCreateMode mode, const char *path, ... )
+{
+    va_list 	args;
+    rc_t	rc;
+
+    va_start (args, path);
+    rc = KTocVCreateDir (self, mtime, access, mode, path, args);
+    va_end (args);
+    return rc;
+}
+
+rc_t KTocVCreateDir ( KToc *self,KTime_t mtime, uint32_t access,
+		     KCreateMode mode, const char *path, va_list args )
+{
+    KTocEntryParam	params;
+    char * npath;
+    rc_t rc;
+
+    TOC_DEBUG (("%s: Name: %s Mode: %s\n", __func__,
+	     path, get_mode_string(mode)));
+
+    rc = createPath (&npath, path, args);
+    if (rc)
+        return rc;
+
+    params.type = ktocentrytype_dir;
+    params.mtime = mtime;
+    params.access = access;
+
+    rc = KTocCreate (self, mode, npath, &params);
+    free (npath);
+    return rc;
+}
+
+/* ----------
+ * CreateFile
+ *  create an entry for a contiguous file
+ *
+ *  "source_position" [ IN ] and "size" [ IN ] - description of the contiguous
+ *  region of the archive file occupied by the file
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+rc_t KTocCreateFile ( KToc *self,
+		     uint64_t source_position, uint64_t size,
+		    KTime_t mtime, uint32_t access, 
+		     KCreateMode mode, const char *path, ... )
+{
+    va_list 	args;
+    rc_t	rc;
+
+    va_start (args, path);
+    rc = KTocVCreateFile (self, source_position, size,
+			  mtime, access, mode, path, args);
+    va_end (args);
+    return rc;
+}
+
+rc_t KTocVCreateFile ( KToc *self,
+                       uint64_t source_position, uint64_t size,
+                       KTime_t mtime, uint32_t access, 
+                       KCreateMode mode, const char *path, va_list args )
+{
+    KTocEntryParam	params;
+    char * npath;
+    rc_t rc;
+
+    TOC_DEBUG (("%s: Name: %s Mode: %sn Time: %lu\n", __func__,
+                path, get_mode_string(mode), mtime));
+
+
+    rc = createPath (&npath, path, args);
+    if (rc)
+        return rc;
+
+    params.type = ktocentrytype_file;
+    params.mtime = mtime;
+    params.access = access;
+    params.u.file.size = size;
+    params.u.file.source_position = source_position;
+
+    rc = KTocCreate (self, mode, npath, &params);
+    free (npath);
+    return rc;
+}
+
+rc_t KTocCreateZombieFile ( KToc *self,
+                            uint64_t source_position, uint64_t size,
+                            KTime_t mtime, uint32_t access, 
+                            KCreateMode mode, const char *path, ... )
+{
+    va_list 	args;
+    rc_t	rc;
+
+    va_start (args, path);
+    rc = KTocVCreateZombieFile (self, source_position, size,
+                                mtime, access, mode, path, args);
+    va_end (args);
+    return rc;
+}
+
+rc_t KTocVCreateZombieFile ( KToc *self,
+                             uint64_t source_position, uint64_t size,
+                             KTime_t mtime, uint32_t access, 
+                             KCreateMode mode, const char *path, va_list args )
+{
+    KTocEntryParam	params;
+    char * npath;
+    rc_t rc;
+
+    TOC_DEBUG (("%s: Name: %s Mode: %sn Time: %lu\n", __func__,
+                path, get_mode_string(mode), mtime));
+
+
+    rc = createPath (&npath, path, args);
+    if (rc)
+        return rc;
+
+    params.type = ktocentrytype_zombiefile;
+    params.mtime = mtime;
+    params.access = access;
+    params.u.file.size = size;
+    params.u.file.source_position = source_position;
+
+    rc = KTocCreate (self, mode, npath, &params);
+    free (npath);
+    return rc;
+}
+
+/* ---------
+ * CreateChunkedFile
+ */
+rc_t KTocCreateChunkedFile ( KToc *self, uint64_t size,KTime_t mtime,
+                             uint32_t access, uint32_t num_chunks,
+                             const KTocChunk chunks [], KCreateMode mode,
+                             const char *path, ... )
+{
+    va_list 	args;
+    rc_t	rc;
+
+    va_start (args, path);
+    rc = KTocVCreateChunkedFile (self, size, mtime, access, num_chunks,
+				 chunks, mode, path, args);
+    va_end (args);
+    return rc;
+}
+
+rc_t KTocVCreateChunkedFile ( KToc *self, uint64_t size,KTime_t mtime,
+                              uint32_t access, uint32_t num_chunks,
+                              const KTocChunk chunks [], KCreateMode mode,
+                              const char *path, va_list args )
+{
+    KTocEntryParam	params;
+    unsigned int	ix;
+    rc_t		rc;
+    char * 		npath;
+
+    TOC_DEBUG (("KToc Create Chunked File:: Name: %s Size: %ju Chunk count: %u Mode %s\n",
+                path, size, num_chunks, get_mode_string(mode)));
+
+    for (ix = 0; ix < num_chunks; ++ix)
+    {
+        TOC_DEBUG (( "KToc Create Chunk %u: 0x%jx 0x%jx %ju\n",
+                     ix,
+                     chunks[ix].logical_position,
+                     chunks[ix].source_position,
+                     chunks[ix].size));
+    }
+
+    rc = createPath (&npath, path, args);
+    if (rc)
+        return rc;
+
+    params.type = ktocentrytype_chunked;
+    params.u.chunked.size = size;
+    params.u.chunked.chunks = chunks;
+    params.u.chunked.num_chunks = num_chunks;
+
+    rc = KTocCreate (self, mode, npath, &params);
+    free (npath);
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * CreateHardLink
+ */
+rc_t KTocCreateHardLink ( KToc *self,KTime_t mtime, uint32_t access,
+                          KCreateMode mode, const char *targ,
+                          const char *link, ... )
+{
+    va_list 	args;
+    rc_t	rc;
+
+    va_start (args, link);
+    rc = KTocVCreateHardLink(self, mtime, access, mode, targ,
+			     link, args);
+    va_end (args);
+    return rc;
+}
+
+rc_t KTocVCreateHardLink ( KToc *self,KTime_t mtime, uint32_t access,
+			  KCreateMode mode, const char *targ,
+			  const char *link_fmt, va_list args )
+{
+#if 0
+    KTocEntryParam	params;
+    char * npath;
+    rc_t rc;
+
+
+
+    return rc;
+#else
+    KTocEntryParam	params;
+    char * npath;
+    const char * excess_path;
+    const KTocEntry * targ_entry;
+    KTocEntryType targ_type;
+    rc_t rc;
+
+    TOC_DEBUG (("Hard link_fmt:: Name: %s Link: %s Mode: %s\n",
+                link_fmt, targ, get_mode_string(mode)));
+
+    /* figure out where we are supposed to point */
+    rc = KTocResolvePathTocEntry (self, &targ_entry, targ, string_size (targ),
+                                  &targ_type, &excess_path);
+    if (rc == 0)
+    {
+        /* hard links to directories are kept as hard links
+         * while other types become true unix style links */
+        char link[4096];
+        int size;
+
+        switch (targ_type)
+        {
+        case ktocentrytype_dir:
+            rc = createPath (&npath, link_fmt, args);
+            if (rc)
+                return rc;
+            params.type = ktocentrytype_hardlink;
+            params.mtime = mtime;
+            params.access = access;
+            params.u.hardlink.ref = targ_entry;
+            rc = KTocCreate (self, mode, npath, &params);
+            free (npath);
+            return rc;
+
+            /* resolve by one indirection */
+        case ktocentrytype_hardlink:
+            rc = createPath (&npath, link_fmt, args);
+            if (rc)
+                return rc;
+            params.type = ktocentrytype_hardlink;
+            params.mtime = mtime;
+            params.access = access;
+            params.u.hardlink.ref = targ_entry->u.hard_link.ref;
+            rc = KTocCreate (self, mode, npath, &params);
+            free (npath);
+            return rc;
+
+        case ktocentrytype_file:
+        case ktocentrytype_zombiefile:
+            size = (args == NULL) ?
+                snprintf  ( link, sizeof link, "%s", link_fmt ) :
+                vsnprintf ( link, sizeof link, link_fmt, args );
+            if (size < 0 || size >= ( int ) sizeof link)
+                rc = RC (rcFS, rcToc, rcConstructing, rcLink, rcExcessive);
+            return rc ? rc : KTocCreateFile (self, targ_entry->u.contiguous_file.archive_offset,
+                                   targ_entry->u.contiguous_file.file_size,
+                                   mtime, access, mode, link);
+
+        case ktocentrytype_emptyfile:
+            size = (args == NULL) ?
+                snprintf  ( link, sizeof link, "%s", link_fmt ) :
+                vsnprintf ( link, sizeof link, link_fmt, args );
+            if (size < 0 || size >= ( int ) sizeof link)
+                rc = RC (rcFS, rcToc, rcConstructing, rcLink, rcExcessive);
+            return rc ? rc : KTocCreateFile (self, 0, 0, mtime, access, mode, link);
+
+        case ktocentrytype_chunked:
+            size = (args == NULL) ?
+                snprintf  ( link, sizeof link, "%s", link_fmt ) :
+                vsnprintf ( link, sizeof link, link_fmt, args );
+            if (size < 0 || size >= ( int ) sizeof link)
+                rc = RC (rcFS, rcToc, rcConstructing, rcLink, rcExcessive);
+            return rc ? rc : KTocCreateChunkedFile (self, targ_entry->u.chunked_file.file_size, mtime,
+                                          access, targ_entry->u.chunked_file.num_chunks,
+                                          targ_entry->u.chunked_file.chunks, mode, link);
+
+        case ktocentrytype_softlink:
+            size = (args == NULL) ?
+                snprintf  ( link, sizeof link, "%s", link_fmt ) :
+                vsnprintf ( link, sizeof link, link_fmt, args );
+            if (size < 0 || size >= ( int ) sizeof link)
+                rc = RC (rcFS, rcToc, rcConstructing, rcLink, rcExcessive);
+            return rc ? rc : KTocCreateSoftLink (self, mtime, access, mode, link,
+                                       targ_entry->u.symbolic_link.link_path.addr);
+
+        default:
+        case ktocentrytype_notfound:
+            /* silent ignore? */
+            break;
+        }
+    }
+    return rc;
+#endif
+}
+
+/* ----------------------------------------------------------------------
+ * CreateSoftLink
+ */
+rc_t KTocCreateSoftLink ( KToc *self,KTime_t mtime, uint32_t access,
+			 KCreateMode mode, const char *targ,
+			 const char *alias, ... )
+{
+    va_list 	args;
+    rc_t	rc;
+
+    va_start (args, alias);
+    rc = KTocVCreateSoftLink (self, mtime, access, mode,
+			      targ, alias, args);
+    va_end (args);
+    return rc;
+}
+
+rc_t KTocVCreateSoftLink ( KToc *self,KTime_t mtime, uint32_t access,
+			  KCreateMode mode, const char *targ,
+			  const char *alias, va_list args )
+{
+    KTocEntryParam	params;
+    char * npath;
+    rc_t rc;
+
+    TOC_DEBUG (("Soft link:: Name: %s Link: %s Mode: %s\n",
+                alias, targ, get_mode_string(mode)));
+
+    rc = createPath (&npath, alias, args);
+    if (rc)
+        return rc;
+
+    params.type = ktocentrytype_softlink;
+    params.mtime = mtime;
+    params.access = access;
+    params.u.softlink.targ = targ;
+
+    rc = KTocCreate (self, mode, npath, &params);
+    free (npath);
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+const KTocEntry * KTocGetRoot	(const KToc * self)
+{
+    if (self == NULL)
+        return NULL;
+
+    return &self->entry;
+}
+
+rc_t KTocGetPath ( const KToc * self, const String ** ppath )
+{
+    assert (self != NULL);
+    *ppath = &self->path;
+    return 0;
+}
+
+KSRAFileAlignment KTocAlignmentGet( KToc * self )
+{
+    return self->alignment;
+}
+
+rc_t KTocAlignmentSet( KToc * self,KSRAFileAlignment align )
+{
+    if ((align != 0) && (align == ((align)&~(align-1))))
+    {
+        self->alignment = align;
+        return 0;
+    }
+    return RC (rcFS, rcToc, rcConverting, rcParam, rcInvalid);
+}
+
+
+/* const char * KTocGetRootPath (const KToc * self, size_t * len) */
+/* { */
+/*     if (self == NULL) */
+/* 	return NULL; */
+/*     *len = self->path.len; */
+/*     return &self->path.addr;; */
+/* } */
+/*****
+ ***** CURRENTLY DOES NOT SUPPORT any form of crossing of
+ ***** KDirectory type paths
+ *****/
+rc_t KTocResolvePathTocEntry ( const KToc *self,
+                               const KTocEntry ** pentry,
+                               const char *path,	/* must be entirely in the TOC */
+                               size_t path_len,
+                               KTocEntryType * ptype,
+                               const char ** unusedpath )
+{
+    const char *  	slash;		/* points to the / following the current facet */
+    const char *  	next_facet;	/* points to the start of the current facet */
+    const char *	end;		/* points to the character after the path */
+    const KTocEntry * dentry;		/* the current entry we are at during the walk through */
+    KTocEntry * 	tentry;		/* points to a Temporary ENTRY built for comparisons */
+    union
+    {
+        const BSTNode     * b;		/* access to the BSTree Node starting the KToc entry */
+        const KTocEntry * k;		/* access to the whole of the entry */
+    }		  	fentry;		/* Found ENTRY: two ways to access to skip casts */
+    rc_t	  	rc;		/* temporary storage for the return from many calls */
+    size_t	  	facet_size;	/* length of a single facet (part of a path dir or file) */
+    size_t		path_size;	/* temporary size (shrinks as we go through the path */	
+    /* int		  	loopcount;	counter for loop limiting hardlink resolution */
+    KTocEntryType 	type = ktocentrytype_unknown;	/* type of a entry found for a facet (init to kill a warning */
+    bool		is_last_facet = false;
+    bool		is_facet_dir = false; /* if the path ends in / we know the last facet is a dir */
+    int                 outer_loopcount;
+    /* -----
+     * point to one character past the path - usually it will be a NUL but we
+     * are not making that a requirement here
+     */
+    next_facet = path;
+    path_size = path_len;
+    end = next_facet + path_size;
+    dentry = &self->entry;
+
+    /* -----
+     * look first for here references:
+     * either no path (not NULL but "") or just "."
+     */
+    if ((path_len == 0) || ((path_len == 1) && (path[0] == '.')))
+    {
+        *pentry = dentry;
+        *ptype = ktocentrytype_dir;
+        *unusedpath = end;
+        return 0;
+    }
+
+
+    /* -----
+     * now start wending our way down through subdirectories
+     */
+    for (outer_loopcount = 0; next_facet < end; ++ outer_loopcount)
+    {
+        TOC_DEBUG (("%s: stepping through subs (%d) (%s)\n", __func__, outer_loopcount, next_facet));
+
+        /* -----
+         * look for the end of the next facet in the path
+         */
+        slash = strchr (next_facet, '/');
+
+        /* -----
+         * if there was no '/' found then point to the end as that is the end of the facet
+         * but also mark that we know this is the last one (be it a directory, link or file)
+         */
+        if (slash == NULL)			
+        {
+            slash = end;
+            is_last_facet = true;
+        }
+        /* -----
+         * handle the special case of a path ending in / which also makes the last facet
+         * known to be a directory
+         */
+        else if (slash + 1 == end)
+        {
+            slash = end;
+            is_last_facet = true;
+            is_facet_dir = true;
+        }
+        facet_size = slash - next_facet;	/* how many characters in this facet */
+
+        /* -----
+         * build a temporary entry for comparisons
+         */
+        rc = KTocEntryNewDirectory (&tentry, next_facet, facet_size, 0, 0555);
+        if (rc != 0)
+        {
+            *pentry = NULL;		/* if we couldn't make then fail */
+            return rc;
+        }
+        fentry.b = BSTreeFind (&dentry->u.dir.tree, tentry, KTocEntryCmpVoid);
+        KTocEntryDelete(tentry);	/* clean up the temporary entry */
+
+        if (fentry.b == NULL)
+        {
+            /* -----
+             * we failed to find this facet.
+             */
+            *pentry = NULL;		/* if we couldn't make it fail */
+            *unusedpath = next_facet;	/* the name we couldn't find */
+            *ptype = ktocentrytype_notfound;
+
+            TOC_DEBUG (("%s: couldn't find (%s)\n", __func__, next_facet));
+
+            return SILENT_RC (rcFS, rcArc, rcResolving, rcParam, rcNotFound);
+        }
+
+        /* loopcount = 0; */
+
+        /* check the type to see if we're okay with it */
+        if ((rc = KTocEntryGetType (fentry.k, &type)) != 0)
+        {
+            if (type == ktocentrytype_notfound)
+            {
+                *ptype = type;
+            }
+            else
+            {
+                *ptype = ktocentrytype_unknown;
+            }
+            *pentry = NULL;		/* if we couldn't then fail */
+            *unusedpath = next_facet;	/* the name we couldn't find */
+            return rc;
+        }
+        *ptype = type;
+        switch (type)
+        {
+            /* -----
+             * resolve a hardlink immediately 
+             * re-resolve until we've gone too many hops or the
+             * resolution is to something that isn't another hardlink
+             *
+             * re-enter this switch with the type of the resolved entry
+             */
+        case ktocentrytype_hardlink:
+            if (is_last_facet)
+            {
+                *pentry = fentry.k->u.hard_link.ref;
+                *unusedpath = end;
+                /* successful arrival at the end at a directory */
+                return 0;
+            }
+            else
+            {
+                /* -----
+                 * this is the only path that continues through the loop
+                 */
+                next_facet = slash + 1;	 /* point past the slash */
+                dentry = fentry.k->u.hard_link.ref; /* make the found entry our current entry */
+            }
+            continue;	/* back to for(;;) */
+
+        case ktocentrytype_dir:
+            if (is_last_facet)
+            {
+                *pentry = fentry.k;
+                *unusedpath = end;
+                /* successful arrival at the end at a directory */
+                return 0;
+            }
+            else
+            {
+                /* -----
+                 * this is the only path that continues through the loop
+                 */
+                next_facet = slash + 1;	/* point past the slash */
+                dentry = fentry.k;	/* make the found entry our current entry */
+            }
+            continue;	/* back to for(;;) */
+
+        default:
+            *pentry = fentry.k;
+            *ptype = ktocentrytype_unknown;
+            *unusedpath = next_facet;
+            /* failure return */
+            return RC (rcFS, rcToc, rcResolving, rcParam, rcInvalid);
+
+        case ktocentrytype_emptyfile:
+        case ktocentrytype_file:
+        case ktocentrytype_chunked:
+        case ktocentrytype_zombiefile:
+            *pentry = fentry.k;
+
+            /* -----
+             * success if we are on the last facet that wasn't supposed to be a directory
+             * failure if we are not
+             */
+            if (is_last_facet && (! is_facet_dir))
+            {
+                *unusedpath = end;
+                return 0;
+            }
+            else
+            {
+                *unusedpath = next_facet;
+                return RC (rcFS, rcToc, rcResolving, rcParam, rcInvalid);
+            }
+
+        case ktocentrytype_softlink:
+            /* -----
+             * We got a softlink entry in the path.
+             */
+            *pentry = fentry.k;
+            *unusedpath = slash;
+            return 0;	/* This is a bit clunky but is a valid incomplete return */
+        }
+    }
+    /* should never get here */
+    return RC (rcFS, rcToc, rcResolving, rcParam, rcUnexpected);
+}
+
+/* SRA tocfile only not tar or other archives only */
+rc_t KTocResolvePathFromOffset ( const KToc *self,
+                                 const char ** path,
+                                 uint64_t * ppos,
+                                 uint64_t _offset )
+{
+    rc_t rc;
+    union u
+    {
+        const BSTNode * n;
+        const KTocEntryIndex * i;
+    } u;
+    uint64_t offset;
+    struct ugliness thisIsReallyUgly;
+
+    rc = 0;
+    offset = _offset - SraHeaderGetFileOffset (self->header);
+
+    TOC_DEBUG(("KTocResolvePathFromOffset _offset %lu offset %lu\n",
+               _offset, offset));
+
+    *path = NULL;
+    *ppos = 0;
+    thisIsReallyUgly.toc = self;
+    thisIsReallyUgly.offset = offset;
+
+    u.n =  BSTreeFind (&self->offset_index, &thisIsReallyUgly, KTocEntryIndexCmpOffset);
+    if (u.n != NULL)
+    {
+        *path = u.i->fullpath.addr;
+        *ppos = thisIsReallyUgly.foffset;
+    }
+    return rc;
+}
+
+const void * KTocGetArchive( const KToc * self )
+{
+    if (self == NULL)
+        return NULL;
+    return self->archive.v;
+}
+				
+
+
+
+typedef struct KDBHdr KDBHdr;
+
+typedef
+struct PersistFilesIndexData
+{
+    uint64_t offset;
+    const KToc * toc;
+    rc_t rc;
+} PersistFilesIndexData;
+
+LIB_EXPORT void CC PersistFilesIndex ( void * vitem, void * vdata )
+{
+    PersistFilesIndexData * data;
+    const char * path;
+
+    TOC_FUNC_ENTRY();
+
+    data = vdata;
+    if (data->rc != 0)
+    {
+        TOC_DEBUG(("PersistFilesIndex leave early %R\n", data->rc));
+        return;
+    }
+    path = (char*)vitem;
+
+    TOC_DEBUG(("PersistFilesIndex %s\n", path));
+
+    data->rc = KTocCreateEntryIndex ((KToc*)data->toc, path, &data->offset);
+}
+
+rc_t KTocPersist ( const KToc * self,
+                   void ** buffer, size_t * buffer_size,
+                   uint64_t * virtual_file_size,
+                   const Vector * files )
+{
+    rc_t rc;
+    size_t treesize;
+    KSraHeader * header;
+    uint8_t * bbuffer;
+    uint64_t filesize;
+
+    TOC_FUNC_ENTRY();
+
+    rc = 0;
+    treesize = 0;
+    bbuffer = NULL;
+    *buffer = NULL;
+    *buffer_size = 0;
+    *virtual_file_size = 0;
+
+    rc = KTocEntryPersistNodeDir (NULL, &self->entry, &treesize, NULL, NULL);
+    if (rc != 0)
+    {
+        LOGMSG (klogErr, "Failure to Persist Toc Root Entry");
+    }
+    else
+    {
+        rc = SraHeaderMake (&header, treesize, self->alignment);
+        if (header == NULL)
+        {
+            rc = RC (rcFS, rcToc, rcPersisting, rcMemory, rcExhausted);
+            LOGERR (klogErr, rc, "Failure to allocate buffer for header");
+        }
+        else
+        {
+                TOC_DEBUG (("KTocPersist: treesize %ju\n", treesize));
+
+            bbuffer = realloc ( header, (size_t)SraHeaderGetFileOffset( header ) );
+            if (bbuffer == NULL)
+            {
+                free (header);
+                rc = RC (rcFS, rcToc, rcPersisting, rcMemory, rcExhausted);
+                LOGERR (klogErr, rc, "Failure to allocate buffer for persisted header");
+            }
+            else
+            {
+                PersistFilesIndexData data;
+
+                header = (KSraHeader*)bbuffer;
+                data.offset = 0;
+                data.toc = self;
+                data.rc = 0;
+
+                VectorForEach (files, false, PersistFilesIndex, &data);
+                filesize = SraHeaderGetFileOffset(header) + data.offset;
+                rc = data.rc;
+                if (rc == 0)
+                {
+                            KTocEntryPersistWriteFuncData wdata;
+                            wdata.buffptr = bbuffer + SraHeaderSize(NULL);
+                            wdata.limit = bbuffer + SraHeaderGetFileOffset(header);
+                            rc = KTocEntryPersistNodeDir (NULL, &self->entry, &treesize,
+                                                          KTocEntryPersistWriteFunc, 
+                                                          &wdata);
+                }
+            }
+        }
+    }
+    if (rc == 0)
+    {
+        ((KToc*)self)->header = (KSraHeader *)bbuffer;
+        *buffer = bbuffer;
+        *buffer_size = treesize + SraHeaderSize(NULL);
+        *virtual_file_size = filesize;
+        return 0;
+    }
+    else if (bbuffer != NULL)
+    {
+        TOC_DEBUG (("Free called in KTocPersist\n"));
+        free (bbuffer);
+    }
+    return rc;
+}
+
+
+/* end of file toc.c */
diff --git a/libs/kfs/tocdir.c b/libs/kfs/tocdir.c
new file mode 100644
index 0000000..d5893d2
--- /dev/null
+++ b/libs/kfs/tocdir.c
@@ -0,0 +1,411 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+ 
+#include <kfs/extern.h>
+#include "toc-priv.h"
+#include <klib/rc.h>
+#include <klib/defs.h>
+#include <klib/namelist.h>
+#include <kfs/directory.h>
+#include <kfs/toc.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <stdio.h>
+
+static
+rc_t KTocProcessOneNameCommonAtt (const KDirectory * dir,
+				  const char * path,
+				  KTime_t * mtime,
+				  uint32_t * access)
+{
+    rc_t rc;
+
+    *mtime = 0;
+    *access = 0;
+    rc = KDirectoryDate (dir, mtime, "%s", path);
+    if (rc != 0)
+    {
+	PLOGERR (klogErr, (klogErr, rc, "Failure getting mtime of $(p)", PLOG_S(p), path));
+    }
+    else
+    {
+        rc = KDirectoryAccess (dir, access, "%s", path);
+	if (rc != 0)
+	{
+	    PLOGERR (klogErr, (klogErr, rc, "Failure getting access of $(p)", PLOG_S(p), path));
+	}
+    }
+    TOC_DEBUG (("%s path %s ktime_t %lu access %o\n", __func__, path, *mtime, *access));
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KTocParseKDirRecurOnePath
+ *
+ * take a single path name and add it to the TOC
+ *
+ * KToc *			self	read/write	the TOC being built
+ * const KDirectory *		dir	read		the directory owning the path
+ * bool (*)(const KDirectory*,
+ *          const char *,
+ *          void *)		filter	read/execute	a filtering function for path inclusion
+ * void *			data	read		passed in as third parameter to filter
+ * const char *			name	read		the path to be added
+ *
+ * filter and data can be NULL
+ */
+static
+rc_t KTocParseKDirRecur	(KToc * self,
+			 const KDirectory * dir,
+			 const char * path,
+			 bool (CC* filter )(const KDirectory *,const char *, void*),
+			 void *  data);
+             
+static
+rc_t KTocParseKDirRecurOnePath (KToc * self,
+				   const KDirectory * dir,
+				   const char * path,
+				   bool (CC* filter )(const KDirectory *,const char *, void*),
+				   void *  data)
+{
+    rc_t rc;
+    KPathType type;
+    KTime_t mtime;
+    uint32_t access;
+    uint64_t size;
+
+    assert (self != NULL);
+    assert (dir != NULL);
+    assert (path != NULL);
+
+    TOC_DEBUG (("%s: recur path for %s\n", __func__, path));
+
+    type = (KPathType)KDirectoryPathType (dir, "%s", path);
+
+    if (type & kptAlias)
+    {
+	size = 0;
+	rc = KTocProcessOneNameCommonAtt (dir, path, &mtime, &access);
+	if (rc == 0)
+	{
+	    char * res;
+	    char * tres;
+	    size_t res_sz;
+
+	    res = NULL;
+	    rc = RC ( rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient );
+	    for (res_sz = 128; 
+		 rc == RC ( rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient );
+		 res_sz <<= 1)
+	    {
+		tres = realloc (res, res_sz);
+		if (tres == NULL)
+		{
+		    if (res != NULL)
+			free (res);
+		    return RC (rcFS, rcToc, rcParsing, rcMemory, rcExhausted);
+		}
+		res = tres;
+        rc = KDirectoryResolveAlias (dir, false, res, res_sz, "%s", path );
+	    }
+	    if (rc != 0)
+	    {
+		PLOGERR (klogWarn, (klogWarn, rc, "Failure getting alias target of $(p)", PLOG_S(p), path));
+	    }
+	    else
+	    {
+		rc = KTocCreateSoftLink (self, mtime, access, kcmCreate, res, path);
+	    }
+	    if (res != NULL)
+		free (res);
+	}
+    }
+    else
+    {
+	switch (type)
+	{
+	default:
+	    /* -----
+	     * fail on anything we don't understand
+	     */
+	    rc = RC (rcFS, rcToc, rcConstructing, rcToc, rcUnexpected);
+	    PLOGERR (klogInt, (klogInt, rc, "Failure getting type for $(p)", PLOG_S(p), path));
+	    break;
+	case kptCharDev:
+	case kptBlockDev:
+	case kptFIFO:
+	    /* -----
+	     * silently drop all devices and fifo/queues
+	     */
+	    rc = 0;
+	    break;
+	case kptFile:
+		/* TBD: add support here for chunked files and for hard links
+		 *
+		 * use lstat (not stat) to see if there are more than one link.  
+		 * if so then this inode will end up in a bstree of possible doubly
+		 * linked files.  first time we find it put in in the toc as a file,
+		 * while on subsequent times put it in as a hardlink
+		 *
+		 * Don't know how to detect sparse files yet (other than this from wikipedia)
+		 *
+		 * http://en.wikipedia.org/wiki/Sparse_files#Detecting_sparse_files_in_Unix
+		 * Sparse files have different apparent and actual file sizes. This can be
+		 * detected by comparing the output of:
+		 *
+		 *	du -s -B1 --apparent-size sparse-file
+		 *
+		 * and:
+		 *
+		 *	du -s -B1 sparse-file
+		 *
+		 */
+	    rc = KDirectoryFileSize (dir, &size, "%s", path);
+	    if (rc != 0)
+	    {
+		PLOGERR (klogErr, (klogErr, rc, "Failure getting size of $(p)", PLOG_S(p), path));
+	    }
+	    else
+	    {
+		rc = KTocProcessOneNameCommonAtt (dir, path, &mtime, &access);
+		if (rc == 0)
+		{
+/* eventually we can choose to check for a compression */
+		    rc = KTocCreateFile (self, 0/*place holder*/, size, mtime, 
+                                          access, kcmCreate, path);
+		}
+	    }
+	    break;
+	case kptDir:
+	    size = 0;
+	    rc = KTocProcessOneNameCommonAtt (dir, path, &mtime, &access);
+	    if (rc == 0)
+	    {
+		rc = KTocCreateDir (self, mtime, access, kcmCreate, path);
+		if (rc == 0)
+		{
+		    rc = KTocParseKDirRecur (self, dir, path, filter, data);
+		}
+	    }
+	    break;
+	} /* switch (type) */
+    } /* if (type & kptAlias) ... else ... */
+    return rc;
+}
+
+
+static
+rc_t KTocParseKDirRecur	(KToc * self,
+			 const KDirectory * dir,
+			 const char * path,
+			 bool (CC* filter )(const KDirectory *,const char *, void*),
+			 void *  data)
+{
+    rc_t rc;
+    KNamelist * names;
+
+    assert (self != NULL);
+    assert (dir != NULL);
+    assert (path != NULL);
+
+    TOC_DEBUG (("%s: recur path for %s\n", __func__, path));
+
+    /* -----
+     * get a list of files in this directory
+     */
+    rc = KDirectoryList (dir, &names, NULL, NULL, "%s", path);
+    if (rc != 0)
+    {
+	LOGERR (klogErr, rc, "Failure to build a name list");
+    }
+    else
+    {
+	/* -----
+	 * get the length of the list
+	 */
+	uint32_t limit;
+
+	rc = KNamelistCount (names, &limit);
+	if (rc != 0)
+	{
+	    LOGERR (klogErr, rc, "Failure to count elements of a name list");
+	}
+	else
+	{
+	    /* -----
+	     * loop through the list
+	     */
+	    uint32_t idx;
+	    size_t pathlen;
+
+            TOC_DEBUG (("%s KNamelistCount counted %u\n", __func__, limit));
+	    pathlen = strlen (path);
+
+	    for (idx = 0; idx < limit; ++idx)
+	    {
+		/* -----
+		 * get the nth path name from the list
+		 */
+		const char * name;
+
+		rc = KNamelistGet (names, idx, &name);
+		if (rc != 0)
+		{
+		    LOGERR (klogErr, rc, "Failure to pull name from name list");
+		}
+		else
+		{
+		    char * new_path;
+		    size_t namelen;
+		    size_t new_pathlen;
+
+                    TOC_DEBUG(("%s KNamelistCount  %s\n", __func__, name));
+            
+		    namelen = strlen (name);
+		    /* length of previous path + '/' + length of name */
+		    new_pathlen = pathlen + 1 + namelen;
+		    new_path = malloc (new_pathlen + 1);  /* + NUL */
+
+		    if (new_path == NULL)
+		    {
+			rc = RC (rcFS, rcToc, rcConstructing, rcMemory, rcExhausted);
+			LOGERR (klogErr, rc, "out of memory building paths for TOC");
+		    }
+		    else
+		    {
+			bool use_name;
+			char * recur_path;
+                        size_t recur_path_z;
+
+			memmove (new_path, path, pathlen);
+			new_path[pathlen] = '/';
+			memmove (new_path + pathlen + 1, name, namelen);
+			new_path[pathlen+1+namelen] = '\0';
+
+#if 1
+                        recur_path_z = pathlen + 1 + namelen + 1;
+#else
+                        recur_path_z = 4096;
+#endif
+ 			recur_path = malloc (recur_path_z);
+			if (recur_path == NULL)
+			{
+			    rc = RC (rcFS, rcToc, rcConstructing, rcMemory, rcExhausted);
+			    LOGERR (klogErr, rc, "out of memory building paths for TOC");
+			}
+			else
+			{
+			    rc = KDirectoryResolvePath (dir, false, recur_path, recur_path_z,
+                                            "%s", new_path);
+                            TOC_DEBUG (("%s: resolved path %s for %s\n", __func__, recur_path, new_path));
+                            TOC_DEBUG (("%s: filter %p\n", __func__, filter));
+			    if (rc == 0)
+			    {
+				if (filter != NULL)
+				{
+				    use_name = filter (dir, recur_path, data);
+				}
+				else
+				    use_name = true;
+
+				if (use_name)
+				{
+                                    TOC_DEBUG (("%s: use_name true for %s\n", __func__, recur_path));
+				    rc = KTocParseKDirRecurOnePath (self, dir, recur_path, filter, data);
+				    if (rc != 0)
+				    {
+					PLOGERR (klogErr, (klogErr, rc, "Failure to process name from name list $(p)",
+                                                           PLOG_S(p), name));
+				    }
+				}
+			    }
+			    free (recur_path);
+			}
+			free (new_path);
+		    }
+		}
+		if (rc != 0)
+		    break;
+	    } /* for (idx = 0; idx < limit; ++idx) */
+	}
+	KNamelistRelease (names);
+    }
+    return rc;
+}
+
+/* ======================================================================
+ * KTocParseKDir
+ *
+ * This matches the standard signature for creating a KToc with a
+ * KDirectory (any implementation including another KArcDir) as the
+ * source to parse.
+ *
+ * Filter is a reference to a function that given a directory, a path
+ * as a char ASCIZ string and a pointer to some form of data probably 
+ * a struct will return 0 for do not include and 1 for include that
+ * path in the TOC.
+ *
+ * Filter can be NULL and no filtering function will be called.
+ * Data can be NULL is there is no Filter that expects it to b non-null.
+ */
+LIB_EXPORT rc_t CC KArcParseKDir ( KToc * self,
+                                   const void * kvoid,
+                                   bool(CC*filter)(const KDirectory*,const char *, void*),
+                                   void * data )
+{
+    const KDirectory * kdir;
+    rc_t rc;
+
+    kdir = kvoid;
+    rc = 0;
+
+    if (self == NULL)
+    {
+	rc = RC (rcFS, rcArc, rcParsing, rcSelf, rcNull);;
+	LOGERR (klogErr, rc, "KTocParseKDir: self was NULL");
+    }
+    else if (kdir == NULL)
+    {
+	rc = RC (rcFS, rcArc, rcParsing, rcParam, rcNull);;
+	LOGERR (klogErr, rc, "KTocParseKDir: kdir was NULL");
+    }
+    else
+    {
+        TOC_DEBUG (("Start Parse\n"));
+	rc = KTocParseKDirRecur (self, kdir, ".", filter, data);
+    }
+    return rc;
+}
+
+/* end of file */
diff --git a/libs/kfs/tocentry.c b/libs/kfs/tocentry.c
new file mode 100644
index 0000000..4bc915f
--- /dev/null
+++ b/libs/kfs/tocentry.c
@@ -0,0 +1,1748 @@
+/*===========================================================================
+ *
+ *                            Public DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+#include <atomic32.h>
+#include <klib/container.h>
+#include <klib/vector.h>
+#include <klib/pbstree.h>
+#include <klib/text.h>
+#include <kfs/arc.h>
+#include <kfs/toc.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <klib/sort.h>
+#include <sysalloc.h>
+
+#include "toc-priv.h"
+
+#include <assert.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <byteswap.h>
+
+
+/* ======================================================================
+ * KTocEntry
+ *
+ * A private class used to keep track of a single entry (
+ */
+
+
+/* ======================================================================
+ * KTocEntry method
+ *
+ * This class is not set up with a vtable at this point.  This API exposes
+ * (due to the nature of using a c struct as a class) much of it's opaque 
+ * elements by providing accessor functions to most of them.  Since they 
+ * are static in this file they are expected to be used only by a class 
+ * that is like a C++ friend class by being implemented in the same 
+ * compilation unit.
+ */
+
+/* NOTE data is not used but required to match the signature for a pointer to function */
+void CC KTocEntryWhack ( BSTNode * n, void * data )
+{
+    KTocEntry * p = (KTocEntry*)n;
+    /**(rc_t*)data = */ KTocEntryDelete (p);
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryDelete
+ * [INOUT] self the entry to delete
+ */
+rc_t KTocEntryDelete ( KTocEntry * self )
+{
+    /* defensive programming ensure minimally valid pointer */
+    if (self == NULL)
+    {
+        return 0;
+/* 	return RC (rcFS, rcToc, rcConstructing, rcSelf, rcNull); */
+    }
+
+    switch (self->type)
+    {
+    case ktocentrytype_unknown:
+    case ktocentrytype_file:
+    case ktocentrytype_chunked:
+    case ktocentrytype_softlink:
+    case ktocentrytype_hardlink:
+    case ktocentrytype_zombiefile:
+    default:
+	/* -----
+	 * at this point in the implementation there is nothing we need to
+	 * do with these entry types except free their "self" allocated memory.
+	 *
+	 * Used a switch in case we did for one or more of these.
+	 */
+	break;
+    case ktocentrytype_dir:
+	/* -----
+	 * directories have a BSTree below them that need to be 
+	 * deleted first
+	 */
+	BSTreeWhack (&self->u.dir.tree, KTocEntryWhack, NULL);
+	break;
+    }
+    free (self);
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryCmp2
+ *
+ * [RET] int					>0: if n > p
+ *						0:  if n == p
+ *						<0: if n < p
+ * [IN]  const BSTNode * 	n		where the pointer to a node matching the key is put
+ * [IN]  const BSTNode * 	p		where the pointer to a node matching the key is put
+ * This function fits the function signature needed for BSTreeInsert
+ *
+ * can not inline or make into a macro as it is referenced via a pointer
+ */
+int64_t CC KTocEntryCmp2 ( const BSTNode * n, const BSTNode * p )
+{
+
+    KTocEntry * nn;
+    KTocEntry * pp;
+    int64_t		  ii;
+
+    nn = (KTocEntry *)n;
+    pp =  (KTocEntry *)p;
+    ii = StringCompare (&nn->name, &pp->name);
+    return ii;
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryCmpVoid
+ *
+ * [RET] int					>0: if n > p
+ *						0:  if n == p
+ *						<0: if n < p
+ * [IN]  const void * 		item		'key' to find a matching bject in the BSTree
+ * [OUT] const BSTNode *	node		where the pointer to a node matching the key is put
+ * This function fits the function signature needed for BSTreeFind
+ *
+ * can not inline or make into a macro as it is referenced via a pointer
+ */
+int64_t CC KTocEntryCmpVoid ( const void * item, const BSTNode * node )
+{
+    const BSTNode * _item = item;
+    return KTocEntryCmp2 (_item, node);
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryNew
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [OUT] KTocEntry ** 	new_entry	where to put a pointer to the new TOC Entry
+ * [IN]  const char * 		name		name of the entry (file, link, directory...)
+ *						(not assumed to be ASCIZ)
+ * [IN]  size_t			name_size	length of name
+ * [IN]  uint32_t 		access		unix/posix style permission flags
+ * [IN]  size_t 		entry_specific	specific initialyers by entry type
+ */
+static
+rc_t		KTocEntryNew		(KTocEntry ** new_entry,
+					 const char * name,
+					 size_t name_size,
+					 KTime_t mtime,
+					 uint32_t access,
+					 size_t entry_specific)
+{
+    KTocEntry * entry;
+    size_t	  nsize;
+    char *	  namep;
+
+    nsize = entry_specific + name_size + 1; /* we want a NUL at end of name */
+
+    entry = malloc (nsize);
+    if (entry == NULL)
+    {
+	LOGMSG (klogErr,
+		"Failed to allocate for a TOC File entry");
+	return RC (rcFS, rcToc, rcAllocating, rcMemory, rcInsufficient);
+    }
+
+    /* entry->entry is fine left as undefined */
+    namep =(char*)entry + entry_specific;
+    string_copy (namep, name_size+1, name, name_size);
+    StringInit (&(entry->name), namep, name_size, (uint32_t)name_size);
+
+    entry->mtime = mtime;
+    entry->access = access;
+
+    *new_entry = entry;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryNewFile
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [OUT] KTocEntry **		new_entry	where to put a pointer to the new TOC Entry
+ * [IN]  const char *		name		name of the file (not path) (not assumed to be ASCIZ)
+ * [IN]  size_t 		name_size	length of name
+ * [IN]  uint32_t 		access		unix/posix style permission flags
+ * [IN]  uint64_t		offset		starting offset within the archive file of this file
+ * [IN]  uint64_t 		size		number of bytes in the file
+ */
+rc_t KTocEntryNewFile ( KTocEntry ** new_entry,
+                        const char * name,
+                        size_t name_size,
+                        KTime_t mtime,
+                        uint32_t access,
+                        uint64_t offset,
+                        uint64_t size )
+{
+    rc_t	rc;
+
+    TOC_SORT (("%s: %s %lu %u\n", __func__, name, mtime, access));
+
+    rc = KTocEntryNew (new_entry, name, name_size, mtime, access, 
+		       sizeof(KTocEntry) 
+		       - sizeof(union KTocEntryUnion)
+		       + sizeof(struct KTocEntryFile));
+
+    if (rc)
+	return rc;
+
+    if (size == 0)
+        (*new_entry)->type = ktocentrytype_emptyfile;
+
+    else
+    {
+        (*new_entry)->type = ktocentrytype_file;
+
+        (*new_entry)->u.contiguous_file.archive_offset = offset;
+        (*new_entry)->u.contiguous_file.file_size = size;
+    }
+
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KTocEntryNewZombieFile
+ *
+ * A zombie file is a file whose directory is in the archive but whose 
+ * storage is not
+ *
+ * [RET] rc_t					0 for success; anything else
+ *						for a failure
+ *                                              see itf/klib/rc.h for general
+ *                                              details
+ * [OUT] KTocEntry **		new_entry	where to put a pointer to the
+ *                                              new TOC Entry
+ * [IN]  const char *		name		name of the file (not path)
+ *                                              (not assumed to be ASCIZ)
+ * [IN]  size_t 		name_size	length of name
+ * [IN]  uint32_t 		access		unix/posix style permission
+ *                                              flags
+ * [IN]  uint64_t		offset		starting offset within the
+ *                                              archive file of this file
+ * [IN]  uint64_t 		size		number of bytes in the file
+ */
+rc_t KTocEntryNewZombieFile ( KTocEntry ** new_entry,
+                              const char * name,
+                              size_t name_size,
+                              KTime_t mtime,
+                              uint32_t access,
+                              uint64_t offset,
+                              uint64_t size )
+{
+    rc_t	rc;
+    
+/*     TOC_DEBUG (("%s: %s %lu\n", __func__, name, mtime)); */
+
+    rc = KTocEntryNew (new_entry, name, name_size, mtime, access, 
+		       sizeof(KTocEntry) 
+		       - sizeof(union KTocEntryUnion)
+		       + sizeof(struct KTocEntryFile));
+
+    if (rc)
+	return rc;
+
+    if (size == 0)
+        (*new_entry)->type = ktocentrytype_emptyfile;
+
+    else
+    {
+        (*new_entry)->type = ktocentrytype_zombiefile;
+
+        (*new_entry)->u.contiguous_file.archive_offset = offset;
+        (*new_entry)->u.contiguous_file.file_size = size;
+    }
+
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryNewChunked
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [OUT] KTocEntry **		new_entry	where to put a pointer to the new TOC Entry
+ * [IN]  const char *		name		name of the file (not path) (not assumed to be ASCIZ)
+ * [IN]  size_t			name_size	length of name
+ * [IN]  uint32_t		access		unix/posix style permission flags
+ * [IN]  uint64_t 		size		virtual number of bytes in the file: not actual
+ *						number of stored bytes
+ * [IN]  const KTocChunk * 	chunks		pointer to an array of chunk structures	
+ * [IN]  uint32_t 		num_chunks	number of chunks in the array above
+ */
+static
+int64_t CC chunkcmp (const void * a, const void * b, void * ignored)
+{
+    const KTocChunk *A = a;
+    const KTocChunk *B = b;
+    /* -----
+     * We can't rely on a cast down to int not getting messed up 
+     * by overflow nor even on uint64_t - uint64_t not overflowing int64_t
+     */
+    if (A->logical_position == B->logical_position)
+	return 0;
+    else if (A->logical_position > B->logical_position)
+	return 1;
+    else
+	return -1;
+}
+
+rc_t KTocEntryNewChunked ( KTocEntry ** new_entry,
+					 const char * name,
+					 size_t name_size,
+					 KTime_t mtime,
+					 uint32_t access,
+					 uint64_t size,
+					 const KTocChunk * chunks,
+					 uint32_t num_chunks )
+{
+    rc_t	rc;
+    KTocChunk * chunkp;
+    size_t	nsize;
+    size_t	csize;
+
+    /* -----
+     * This is a bit ugly...
+     *
+     * first (Compile time optimizations does much of the heavy lifting) figure out how
+     * much is the extra malloc amount
+     *
+     * Take size of a generic entry - the size of the union part but add back the size of
+     * the chunked file part
+     *
+     * Add to that the size of a 64 bit integer.  This is 8 bytes extra from what is
+     * needed by the header alone.
+     * 
+     * Mask that against the binary bit inverse of 1 less tha the size of a 64 bit integer.
+     *
+     * Now you have the size of the header plus the number of bytes needed to get to a 8
+     * byte address 0.  This is possibly more than is needed as 8 byte quantities could be
+     * read from 4 byte boundaries in many cases.
+     *
+     * Then add to that the size in bytes of the chunked data (all 64 bit numbers).
+     */
+    nsize = ~( ( size_t ) sizeof(uint64_t)-1) & 
+	(sizeof(KTocEntry)
+	 - sizeof(union KTocEntryUnion)
+	 + sizeof(struct KTocEntryChunkFile)
+	 + sizeof(uint64_t));
+    csize = sizeof(KTocChunk) * num_chunks;
+
+    if ((rc = KTocEntryNew (new_entry, name, name_size, mtime, access, 
+			    nsize + csize))
+	!= 0)
+    {
+	return rc;
+    }
+
+    chunkp = (KTocChunk*)((char*)*new_entry + nsize);
+    (*new_entry)->type = ktocentrytype_chunked;
+    (*new_entry)->u.chunked_file.file_size = size;
+    (*new_entry)->u.chunked_file.chunks = chunkp;
+    (*new_entry)->u.chunked_file.num_chunks = num_chunks;
+    memmove(chunkp, chunks, csize);
+    ksort (chunkp, num_chunks, sizeof(KTocChunk), chunkcmp, NULL);
+    /* -----
+     * TODO: We currently do no validation of the chunks.
+     * We accept that after the sort (which is probably superfluous)
+     * that for each chunk 
+     *
+     *	chunkp[N].logical_position + chunkp[N].size <= chunkp[N+1].logical_position
+     *
+     * We should probably verify this.
+     */
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryNewSoft
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [OUT] KTocEntry **		new_entry	where to put a pointer to the new TOC Entry
+ * [IN]  const char * 		name		name of the file (not path) (not assumed to be ASCIZ)
+ * [IN]  size_t 		name_size	length of name
+ * [IN]  uint32_t		access		unix/posix style permission flags
+ * [IN]  const char * 		link		character array (string) holding the name of the
+ *						links target (not assumed to be ASCIZ)
+ * [IN]  size_t 		link_size	length of the target string
+ * Link is run time resolved
+ */
+rc_t KTocEntryNewSoft ( KTocEntry ** new_entry,
+					 const char * name,
+					 size_t name_size,
+					 KTime_t mtime,
+					 uint32_t access,
+					 const char * link,
+					 size_t link_size )
+{
+    rc_t	rc;
+    char *	linkp;
+
+    rc = KTocEntryNew (new_entry, name, name_size, mtime, access, 
+		       (sizeof(KTocEntry)
+			- sizeof(union KTocEntryUnion))
+		       + sizeof(struct KTocEntrySoftLink) + link_size + 1);
+    if (rc != 0)
+    {
+	return rc;
+    }
+    (*new_entry)->type = ktocentrytype_softlink;
+    linkp =(char*)(*new_entry) + sizeof(KTocEntry) - sizeof(union KTocEntryUnion)
+	+ sizeof(struct KTocEntrySoftLink);
+    string_copy (linkp, link_size+1, link, link_size);
+    StringInit ( &((*new_entry)->u.symbolic_link.link_path), linkp, link_size, (uint32_t)link_size );
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryNewHard
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [OUT] KTocEntry ** 	new_entry	where to put a pointer to the new TOC Entry
+ * [IN]  const char * 		name		name of the file (not path) (not assumed to be ASCIZ)
+ * [IN]  size_t			name_size	length of name
+ * [IN]  uint32_t		access		unix/posix style permission flags
+ * Resolution of the link is not set up in this function
+ */
+rc_t KTocEntryNewHard ( KTocEntry ** new_entry,
+                        const char * name,
+                        size_t name_size,
+                        KTime_t mtime,
+                        uint32_t access,
+                        const KTocEntry * targ )
+{
+    rc_t	rc;
+
+    if ((rc = KTocEntryNew (new_entry, name, name_size, mtime, access, 
+			    sizeof(KTocEntry)
+			    - sizeof(union KTocEntryUnion)
+			    + sizeof(struct KTocEntryHardLink)))
+	!= 0)
+    {
+	return rc;
+    }
+    (*new_entry)->type = ktocentrytype_hardlink;
+    (*new_entry)->u.hard_link.ref = targ;
+
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * KTocEntryNewDirectory
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [OUT] KTocEntry **		new_entry	where to put a pointer to the new TOC Entry
+ * [IN]  const char *		name		name of the directory (not assumed to be ASCIZ)
+ * [IN]  size_t			name_size	length of name
+ * [IN]  uint32_t		access		unix/posix style permission flags
+ */
+rc_t KTocEntryNewDirectory ( KTocEntry ** new_entry,
+					 const char * name,
+					 size_t name_size,
+					 KTime_t mtime,
+					 uint32_t access )
+{
+    rc_t	rc;
+
+    /* -----
+     * get rid of trailing '/' characters in a file name
+     */
+    while (name[name_size-1] == '/')
+	--name_size;
+
+    if ((rc = KTocEntryNew (new_entry, name, name_size, mtime, access, 
+			    sizeof(KTocEntry)
+			    - sizeof(union KTocEntryUnion)
+			    + sizeof(struct KTocEntryDir)))
+	!= 0)
+    {
+	return rc;
+    }
+    (*new_entry)->type = ktocentrytype_dir;
+    BSTreeInit(&(*new_entry)->u.dir.tree);	/* start with an empty tree */
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+rc_t KTocEntryGetTime ( const KTocEntry *self, KTime_t *mtime )
+{
+    if (self == NULL)
+    {
+	return RC (rcFS, rcToc, rcAccessing, rcSelf, rcNull);
+    }
+    *mtime = self->mtime;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+rc_t KTocEntryGetAccess ( const KTocEntry *self, uint32_t *access )
+{
+    if (self == NULL)
+    {
+	return RC (rcFS, rcToc, rcAccessing, rcSelf, rcNull);
+    }
+    *access = self->access;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+rc_t KTocEntryGetType ( const KTocEntry *self, KTocEntryType* type )
+{
+    if (self == NULL)
+    {
+	return RC (rcFS, rcToc, rcAccessing, rcSelf, rcNull);
+    }
+    *type = self->type;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+rc_t KTocEntryGetFileSize ( const KTocEntry * self, uint64_t * size )
+{
+    int	loopcount;
+    const KTocEntry * target;
+
+    assert (self != NULL);
+    assert (size != NULL);
+
+    *size = 0;
+
+    for (loopcount = 0; loopcount < KARC_LINK_RESOLVE_LOOPMAX; ++loopcount)
+    {
+	switch (self->type)
+	{
+	default:
+	case ktocentrytype_unknown:
+	case ktocentrytype_notfound:
+	    return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+
+	case ktocentrytype_dir:
+	    return RC (rcFS, rcFile, rcAccessing, rcFileDesc, rcIncorrect);
+
+	case ktocentrytype_file:
+	    *size = self->u.contiguous_file.file_size;
+	    return 0;
+
+	case ktocentrytype_chunked:
+	    *size = self->u.chunked_file.file_size;
+	    return 0;
+
+	case ktocentrytype_zombiefile:
+	    *size = self->u.zombie_file.file_size;
+	    return 0;
+
+	case ktocentrytype_softlink:
+	    /* architect called for KArcDir to handle symbolic link resolution */
+	    return RC (rcFS, rcFile, rcAliasing, rcLink, rcNoErr);
+
+	case ktocentrytype_hardlink:
+	    if (KTocEntryGetHardTarget(self, &target) != 0)
+		return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+	    /* this breaks "object oriented rules" but lets us loop instead of recur */
+	    self = target; /* catch bad returns at reiteration of switch */
+	    /* only non-terminal path within the loop */
+	    break;
+
+        case ktocentrytype_emptyfile:
+	    *size = 0;
+	    return 0;
+
+	}
+    }
+    return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+}
+
+rc_t KTocEntryGetFilePhysicalSize ( const KTocEntry * self, uint64_t * size )
+{
+    int	loopcount;
+    const KTocEntry * target;
+
+    assert (self != NULL);
+    assert (size != NULL);
+
+    *size = 0;
+
+    for (loopcount = 0; loopcount < KARC_LINK_RESOLVE_LOOPMAX; ++loopcount)
+    {
+	switch (self->type)
+	{
+	default:
+	case ktocentrytype_unknown:
+	case ktocentrytype_notfound:
+	    return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+
+	case ktocentrytype_dir:
+	    return RC (rcFS, rcFile, rcAccessing, rcFileDesc, rcIncorrect);
+
+	case ktocentrytype_file:
+	    *size = self->u.contiguous_file.file_size;
+	    return 0;
+
+	case ktocentrytype_chunked:
+        {
+            uint64_t size_;
+            uint32_t ix;
+            for (size_ = 0, ix = 0; ix < self->u.chunked_file.num_chunks; ++ix)
+                size_ += self->u.chunked_file.chunks[ix].size;
+            *size = size_;
+	    return 0;
+        }
+	case ktocentrytype_zombiefile:
+	    *size = self->u.zombie_file.file_size;
+	    return 0;
+
+	case ktocentrytype_softlink:
+	    /* architect called for KArcDir to handle symbolic link resolution */
+	    return RC (rcFS, rcFile, rcAliasing, rcLink, rcNoErr);
+
+	case ktocentrytype_hardlink:
+	    if (KTocEntryGetHardTarget(self, &target) != 0)
+		return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+	    /* this breaks "object oriented rules" but lets us loop instead of recur */
+	    self = target; /* catch bad returns at reiteration of switch */
+	    /* only non-terminal path within the loop */
+	    break;
+
+        case ktocentrytype_emptyfile:
+	    *size = 0;
+	    return 0;
+
+	}
+    }
+    return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+rc_t KTocEntryGetFileLocator ( const KTocEntry * self, uint64_t * locator )
+{
+    int	loopcount;
+    const KTocEntry * target;
+
+    assert (self != NULL);
+    assert (locator != NULL);
+
+    *locator = 0;
+
+    for (loopcount = 0; loopcount < KARC_LINK_RESOLVE_LOOPMAX; ++loopcount)
+    {
+	switch (self->type)
+	{
+	default:
+	case ktocentrytype_unknown:
+	case ktocentrytype_notfound:
+	    return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+
+	case ktocentrytype_dir:
+	    return RC (rcFS, rcFile, rcAccessing, rcFileDesc, rcIncorrect);
+
+	case ktocentrytype_file:
+	case ktocentrytype_zombiefile:
+	    *locator = self->u.contiguous_file.archive_offset;
+	    return 0;
+	case ktocentrytype_chunked:
+        {
+            /* find lowest offset chunk */
+            if (self->u.chunked_file.num_chunks > 0)
+            {
+                uint64_t loc;
+                uint32_t ix;
+
+                *locator = self->u.chunked_file.chunks[0].source_position;
+                for (ix = 1; ix < self->u.chunked_file.num_chunks; ++ix)
+                {
+                    loc = self->u.chunked_file.chunks[ix].source_position;
+                    if (loc < *locator)
+                        *locator = loc;
+                }
+            }
+            else
+                *locator = 0;
+
+	    return 0;
+        }
+	case ktocentrytype_softlink:
+	    /* architect called for KArcDir to handle symbolic link resolution */
+	    return RC (rcFS, rcFile, rcAliasing, rcLink, rcNoErr);
+
+	case ktocentrytype_hardlink:
+	    if (KTocEntryGetHardTarget(self, &target) != 0)
+		return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+	    /* this breaks "object oriented rules" but lets us loop instead of recur */
+	    self = target; /* catch bad returns at reiteration of switch */
+	    /* only non-terminal path within the loop */
+	    break;
+
+        case ktocentrytype_emptyfile:
+	    *locator = 0;
+	    return 0;
+
+	}
+    }
+    return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+rc_t KTocEntryGetChunks ( const KTocEntry * self,
+                          uint32_t * num_chunks,
+                          const KTocChunk ** chunks )
+{
+    int	loopcount;
+    const KTocEntry * target;
+
+    *chunks = NULL;
+    *num_chunks = 0;
+
+    for (loopcount = 0; loopcount < KARC_LINK_RESOLVE_LOOPMAX; ++loopcount)
+    {
+	switch (self->type)
+	{
+	default:
+	case ktocentrytype_unknown:
+	case ktocentrytype_notfound:
+	    return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+
+	case ktocentrytype_dir:
+	case ktocentrytype_file:
+	    return RC (rcFS, rcFile, rcAccessing, rcFileDesc, rcIncorrect);
+
+	case ktocentrytype_chunked:
+	    *chunks = self->u.chunked_file.chunks;
+	    *num_chunks = self->u.chunked_file.num_chunks;
+	    return 0;
+
+	case ktocentrytype_softlink:
+	    /* architect called for KArcDir to handle symbolic link resolution */
+	    return RC (rcFS, rcFile, rcAliasing, rcLink, rcNoErr);
+
+	case ktocentrytype_hardlink:
+	    if (KTocEntryGetHardTarget(self, &target) != 0)
+		return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+	    /* this breaks "object oriented rules" but lets us loop instead of recur */
+	    self = target; /* catch bad returns at reiteration of switch */
+	    /* only non-terminal path within the loop */
+	    break;
+	}
+    }
+    return RC (rcFS, rcFile, rcAccessing, rcFile, rcInvalid);
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+rc_t KTocEntryGetFileOffset ( const KTocEntry * self, uint64_t * offset )
+{
+    int			loopcount;
+    const KTocEntry * target;
+
+    *offset = 0;
+
+    for (loopcount = 0; loopcount < KARC_LINK_RESOLVE_LOOPMAX; ++loopcount)
+    {
+	switch (self->type)
+	{
+	default:
+	case ktocentrytype_unknown:
+	case ktocentrytype_notfound:
+	    return RC (rcFS, rcTocEntry, rcAccessing, rcFile, rcUnknown);
+
+	case ktocentrytype_dir:
+	case ktocentrytype_chunked:
+	    return RC (rcFS, rcTocEntry, rcAccessing, rcSelf, rcUnsupported);
+
+	case ktocentrytype_file:
+	    *offset = self->u.contiguous_file.archive_offset;
+	    return 0;
+
+        case ktocentrytype_emptyfile:
+	    *offset = 0;
+	    return 0;
+
+	case ktocentrytype_softlink:
+	    /* architect called for KArcDir to handle symbolic link resolution */
+	    return RC (rcFS, rcTocEntry, rcAliasing, rcLink, rcNoErr);
+
+	case ktocentrytype_hardlink:
+	    if (KTocEntryGetHardTarget(self, &target) != 0)
+		return RC (rcFS, rcTocEntry, rcAccessing, rcSelf, rcInvalid);
+
+	    /* this breaks "object oriented rules" but lets us loop instead of recur */
+	    self = target; /* catch bad returns at reiteration of switch */
+	    /* only non-terminal path within the loop */
+	    break;
+	}
+    }
+    return RC (rcFS, rcToc, rcAccessing, rcSelf, rcInvalid);	/* loop fail - too many hard links */
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+rc_t KTocEntryGetBSTree ( const KTocEntry * self,const BSTree ** ptree )
+{
+    KTocEntryType	type;
+
+    if (self == NULL)
+    {
+	return RC (rcFS, rcToc, rcAccessing, rcSelf, rcNull);
+    }
+    if (KTocEntryGetType(self,&type) != 0)
+    {
+	return RC  (rcFS, rcToc, rcAccessing, rcParam, rcInvalid);
+    }
+    if (type != ktocentrytype_dir)
+    {
+	return RC  (rcFS, rcToc, rcAccessing, rcParam, rcInvalid);
+    }
+    *ptree = &self->u.dir.tree;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+rc_t KTocEntryGetHardTarget ( const KTocEntry *self, const KTocEntry ** target )
+{
+    if (self == NULL)
+    {
+	return RC (rcFS, rcToc, rcAccessing, rcSelf, rcNull);
+    }
+    if (target == NULL)
+    {
+	return RC (rcFS, rcToc, rcAccessing, rcParam, rcNull);
+    }
+    *target = (self->type == ktocentrytype_hardlink) ? self->u.hard_link.ref : NULL;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+rc_t KTocEntryGetSoftTarget ( const KTocEntry *self,
+				const char ** target )
+{
+    if (self == NULL)
+    {
+	return RC (rcFS, rcToc, rcAccessing, rcSelf, rcNull);
+    }
+    if (self->type != ktocentrytype_softlink)
+    {
+	return RC  (rcFS, rcToc, rcAccessing, rcSelf, rcInvalid);
+    }
+    *target = self->u.symbolic_link.link_path.addr;
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ *
+ */
+rc_t KTocEntryGetName ( const KTocEntry *self,
+			  const char ** name )
+{
+    if (self == NULL)
+    {
+	return RC (rcFS, rcToc, rcAccessing, rcSelf, rcNull);
+    }
+    *name = self->name.addr;
+    return 0;
+}
+
+/* ======================================================================
+ */
+const char * KTocEntryTypeGetString(KTocEntryType t)
+{
+    static const char * entryTypeString[] = 
+	{
+	    "ktocentrytype_unknown",
+	    "ktocentrytype_notfound",
+	    "ktocentrytype_dir",
+	    "ktocentrytype_file",
+	    "ktocentrytype_chunked",
+	    "ktocentrytype_softlink",
+	    "ktocentrytype_hardlink",
+	    "ktocentrytype_emptyfile" 
+	};
+
+    switch (t)
+    {
+    case ktocentrytype_unknown:
+    case ktocentrytype_dir:
+    case ktocentrytype_file:
+    case ktocentrytype_chunked:
+    case ktocentrytype_softlink:
+    case ktocentrytype_hardlink:
+    case ktocentrytype_emptyfile:
+	return entryTypeString[t+1];
+    default:
+	return "ktocentrytype_error";
+    }
+}
+
+/*
+ * preferred behavior of this needs to be determined
+ */
+LIB_EXPORT rc_t CC KTocEntryPersistWriteFunc ( void * param,
+                                               const void * buffer,
+                                               size_t size,
+                                               size_t * num_writ )
+{
+    KTocEntryPersistWriteFuncData * data;
+    rc_t rc;
+    size_t to_write;
+
+    assert (param != NULL);
+    assert (buffer != NULL);
+    assert (num_writ != NULL);
+
+    rc = 0;
+    *num_writ = 0;
+    data = param;
+    if (size != 0)
+    {
+	if ((data->buffptr + size) > data->limit)
+	{
+	    to_write = data->limit - data->buffptr;
+	    rc = RC (rcFS, rcTocEntry, rcPersisting, rcBuffer, rcTooShort);
+	}
+	else
+	    to_write = size;
+	memmove (data->buffptr, buffer, to_write);
+	data->buffptr += to_write;
+	*num_writ = to_write;
+#if 0
+	{
+	    size_t ix;
+
+	    for (ix = 0; ix < to_write; ix ++)
+	    {
+/* please do not delete commented out code */
+/* 		if ((ix & 0xF) == 0x0) */
+/* 		    printf ("%.08x : ", ix); */
+/* 		printf( "%.02x ", ((uint8_t*)buffer)[ix]); */
+
+/* 		if ((ix & 0xF) == 0xF) */
+/* 		    printf ("\n"); */
+	    }
+/*  	    printf ("\n"); */
+	}
+#endif
+    }
+    return rc;
+}
+
+
+static
+rc_t KTocEntryPersistNodeCommon (void * param, const KTocEntry * n,
+				 size_t * num_writ, PTWriteFunc write,
+				 void * write_param)
+{
+    size_t all_written;
+    size_t written;
+    uint16_t nsize;
+    const char * name;
+    rc_t rc;
+    KTocEntryType t;
+    uint8_t b;
+    KTime_t mtime;
+    uint32_t access;
+
+    rc = KTocEntryGetName (n, &name);
+    if (rc != 0)
+	return rc;
+    TOC_DEBUG (("%s %s\n", __func__, name));
+    if (write)
+    {
+
+/* please do not delete commented out code */
+/* 	printf ("----------\n"); */
+	nsize = (uint16_t)strlen(name);
+	rc = KTocEntryGetTime (n, &mtime);
+	if (rc != 0)
+	    return rc;
+	rc = KTocEntryGetAccess (n, &access);
+	if (rc != 0)
+	    return rc;
+	rc = KTocEntryGetType (n, &t);
+	if (rc != 0)
+	    return rc;
+	b = (uint8_t)t;
+/* 	printf ("name size\t"); */
+	rc = (*write) (write_param, &nsize, sizeof nsize, &all_written);
+	if (rc == 0)
+	{
+/* 	    printf("name %s\t", name); */
+	    rc = (*write) (write_param, name, nsize, &written);
+	    all_written += written;
+	    if (rc == 0)
+	    {
+/* 		printf("mtime\t"); */
+		rc = (*write) (write_param, &mtime, sizeof mtime, &written);
+		all_written += written;
+		if (rc == 0)
+		{
+/* 		    printf("access\t"); */
+		    rc = (*write) (write_param, &access, sizeof access, &written);
+		    all_written += written;
+		    if (rc == 0)
+		    {
+/* 			printf("type\t"); */
+			rc = (*write) (write_param, &b, sizeof b, &written);
+			all_written += written;
+		    }
+		}
+	    }
+	}
+	*num_writ = all_written;
+	return rc;
+    }
+    else
+    {
+	*num_writ = (sizeof (nsize) + strlen (name) + sizeof (mtime) +
+		     sizeof (access) + sizeof (b));
+	return 0;
+    }
+}
+
+rc_t KTocEntryPersistNodeDir ( void *param, const KTocEntry * n,
+			      size_t * num_writ, 
+			      PTWriteFunc write, void * write_param )
+{
+    rc_t rc;
+
+/*     size_t	start,end; */
+
+    TOC_FUNC_ENTRY();
+
+
+/*     start = *num_writ; */
+
+    rc = BSTreePersist (&n->u.dir.tree,
+			num_writ,
+			write,
+			write_param,
+			KTocEntryPersist,
+			NULL);
+    if (rc != 0)
+    {
+        TOC_DEBUG (("KTocEntryPersistNodeDir: failure return from BSTreePersist"));
+    }
+
+/*     end = *num_writ; */
+    return rc;
+}
+
+static
+rc_t KTocEntryPersistNodeFile (void *param, const KTocEntry * n,
+			       size_t * num_writ, 
+			       PTWriteFunc write, void * write_param)
+{
+    TOC_FUNC_ENTRY();
+
+    if (write)
+    {
+	rc_t rc;
+	size_t all_written;
+	size_t written;
+
+/* please do not delete commented out code */
+/* 	printf("file offset\t"); */
+	rc = (*write) (write_param, &n->u.contiguous_file.archive_offset,
+		       sizeof n->u.contiguous_file.archive_offset, &all_written);
+	if (rc == 0)
+	{
+/* 	    printf("file size\t"); */
+	    rc = (*write) (write_param, &n->u.contiguous_file.file_size,
+			   sizeof n->u.contiguous_file.file_size, &written);
+            all_written += written;
+	}
+	*num_writ = all_written;
+	return rc;
+    }
+    else
+    {
+	*num_writ = (sizeof n->u.contiguous_file.archive_offset +
+		     sizeof n->u.contiguous_file.file_size);
+	return 0;
+    }
+}
+
+static
+rc_t KTocEntryPersistNodeChunked (void *param, const KTocEntry * n,
+				  size_t * num_writ, 
+				  PTWriteFunc write, void * write_param)
+{
+    KTocChunk * chunks;
+    uint32_t count;
+
+    count = n->u.chunked_file.num_chunks; /* used with write and no write */
+    chunks = n->u.chunked_file.chunks;
+    if (write)
+    {
+	rc_t rc;
+	size_t all_written;
+	size_t written;
+
+/* please do not delete commented out code */
+/* 	printf("file size\t"); */
+	rc = (*write) (write_param, &n->u.chunked_file.file_size,
+		       sizeof n->u.chunked_file.file_size, &all_written);
+	if (rc == 0)
+	{
+/* 	    printf("chunk count\t"); */
+	    rc = (*write) (write_param, &count, sizeof count, &written);
+	    all_written += written;
+	    if (rc == 0)
+	    {
+		for ( ; count--; chunks++)
+		{
+/* 		    printf("chunk l position\t"); */
+ 		    rc = (*write) (write_param, &chunks->logical_position,
+ 				   sizeof chunks->logical_position, &written);
+		    all_written += written;
+		    if (rc != 0)
+			break;
+/* 		    printf("chunk s position\t"); */
+		    rc = (*write) (write_param, &chunks->source_position,
+				   sizeof chunks->source_position, &all_written);
+		    all_written += written;
+		    if (rc != 0)
+			break;
+/* 		    printf("chunk size\t"); */
+		    rc = (*write) (write_param, &chunks->size,
+				   sizeof chunks->size, &written);
+		    all_written += written;
+		    if (rc != 0)
+			break;
+		}
+	    }
+	}
+	*num_writ = all_written;
+	return rc;
+    }
+    else
+    {
+	*num_writ = (sizeof n->u.chunked_file.file_size + sizeof count +
+		     count * (sizeof chunks->logical_position +
+			      sizeof chunks->source_position +
+			      sizeof chunks->size));
+	return 0;
+    }
+}
+
+static
+rc_t KTocEntryPersistNodeSym (void *param, const KTocEntry * n,
+			      size_t * num_writ, PTWriteFunc write,
+			      void * write_param)
+{
+    uint16_t nsize;
+
+    nsize = (uint16_t)n->u.symbolic_link.link_path.size;
+    if (write)
+    {
+	rc_t rc;
+	size_t all_written;
+	size_t written;
+
+	rc = (*write) (write_param, &nsize, sizeof nsize, &all_written);
+	if (rc == 0)
+	{
+	    rc = (*write) (write_param, 
+			   n->u.symbolic_link.link_path.addr,
+			   nsize,
+			   &written);
+	    all_written += written;
+	}
+	*num_writ = all_written;
+	return rc;
+    }
+    else
+    {
+	*num_writ = (sizeof (nsize) + nsize);
+	return 0;
+    }
+}
+
+static
+rc_t KTocEntryPersistNodeLink (void *param, const KTocEntry * n,
+			       size_t * num_writ, 
+			       PTWriteFunc write, void * write_param)
+{
+    uint16_t nsize;
+
+    nsize = (uint16_t)n->u.hard_link.ref->name.size;
+    if (write)
+    {
+	rc_t rc;
+	size_t all_written;
+	size_t written;
+
+	rc = (*write) (write_param, &nsize, sizeof nsize, &all_written);
+	if (rc == 0)
+	{
+	    rc = (*write) (write_param, 
+			   n->u.hard_link.ref->name.addr,
+			   nsize,
+			   &written);
+	    all_written += written;
+	}
+	*num_writ = all_written;
+	return rc;
+    }
+    else
+    {
+	*num_writ = (sizeof (nsize) + nsize);
+	return 0;
+    }
+}
+
+LIB_EXPORT rc_t CC KTocEntryPersist ( void *param, const void * node,
+                                      size_t * num_writ, 
+                                      PTWriteFunc write, void * write_param )
+{
+    rc_t rc;
+    size_t all_written;
+    size_t written;
+    const KTocEntry * n;
+
+    TOC_FUNC_ENTRY();
+
+    all_written = 0;
+    n = (const KTocEntry *)node;
+    rc = KTocEntryPersistNodeCommon (param, n, &all_written, write, write_param);
+    if (rc == 0)
+    {
+	written = 0;
+	switch (n->type)
+	{
+	default:
+	    rc = RC (rcFS, rcTocEntry, rcPersisting, rcTocEntry, rcInvalid );
+	    LOGERR (klogInt, rc, "malformed node with bad type");
+	    break;
+
+ 	case ktocentrytype_notfound:
+	    rc = RC (rcFS, rcTocEntry, rcPersisting, rcTocEntry, rcCorrupt );
+	    LOGERR (klogInt, rc, "malformed tree node not found ");
+ 	    break;
+
+	case ktocentrytype_dir:
+	    /* recur */
+/* please do not delete commented out code */
+/* 	    printf("KTocEntryPersist Directory\n"); */
+	    rc = KTocEntryPersistNodeDir (param, n, &written, write, write_param);
+	    break;
+
+	case ktocentrytype_file:
+/* 	    printf("KTocEntryPersist File\n"); */
+	    rc = KTocEntryPersistNodeFile (param, n, &written, write, write_param);
+	    break;
+
+	case ktocentrytype_emptyfile:
+/* 	    printf("KTocEntryPersist Empty File\n"); */
+	    break;
+
+	case ktocentrytype_chunked:
+/* 	    printf("KTocEntryPersist chunked File\n"); */
+	    rc = KTocEntryPersistNodeChunked (param, n, &written, write, write_param);
+	    break;
+
+	case ktocentrytype_softlink:
+/* 	    printf("KTocEntryPersist soft link\n"); */
+	    rc = KTocEntryPersistNodeSym (param, n, &written, write, write_param);
+	    break;
+
+	case ktocentrytype_hardlink:
+/* 	    printf("KTocEntryPersist hard link\n"); */
+	    rc = KTocEntryPersistNodeLink (param, n, &written, write, write_param);
+	    break;
+	}
+	all_written += written;
+    }
+    *num_writ = all_written;
+    return rc;
+}
+
+typedef
+struct KTocEntryInflateData
+{
+    KToc * toc;
+    const char * path;
+    uint64_t arcsize;
+    uint64_t offset;
+    rc_t rc;
+    bool rev;
+} KTocEntryInflateData;
+
+typedef
+struct KTocEntryInflateCommon
+{
+    char * name;
+    KTime_t mtime;
+    uint32_t access;
+    KTocEntryType type;
+} KTocEntryInflateCommon;
+/* TBD: replace the list of parameters in the inflatenode functions
+typedef
+struct KTocEntryInflateNodeData
+{
+    KToc * toc;
+    const void * ptr;
+    const void * limit;
+    char * name;
+    KTime_t mtime;
+    uint32_t access;
+    KTocEntryType type;
+    bool rev;
+} KTocEntryInflateNodeData;
+*/
+
+static
+bool check_limit (const void * ptr, const void * limit, size_t size)
+{
+    const uint8_t * p = ptr;
+    const uint8_t * l = limit;
+    return ((p + size) > l);
+}
+
+#define read_scalar(N,T,S)	     \
+    static rc_t N (const void ** _ptr, const void * limit, bool rev, T * pout) \
+    {									\
+	const T * ptr;							\
+									\
+	if (check_limit (*_ptr, limit, sizeof (T)))			\
+	    return RC (rcFS, rcTocEntry, rcParsing, rcBuffer, rcTooShort); \
+	    								\
+	ptr = *_ptr;							\
+									\
+	if (rev)							\
+	{								\
+	    T t;							\
+	    memmove (&t, ptr, sizeof (T));				\
+	    *pout = S (t);						\
+	}								\
+	else								\
+	    memmove (pout, ptr, sizeof (T));                             \
+	*_ptr = ++ptr;							\
+	return 0;							\
+    }
+
+read_scalar (read_u16,uint16_t,bswap_16)
+read_scalar (read_u32,uint32_t,bswap_32)
+read_scalar (read_u64,uint64_t,bswap_64)
+read_scalar (read_i64,int64_t,bswap_64)
+
+static
+rc_t read_u8 (const void ** _ptr, const void * limit, uint8_t * pout)
+{
+    const uint8_t * ptr;
+
+    if (check_limit (*_ptr, limit, sizeof (uint8_t)))
+	return RC (rcFS, rcTocEntry, rcParsing, rcBuffer, rcTooShort);
+
+    ptr = *_ptr;
+    *pout = *ptr++;
+    *_ptr = ptr;
+    return 0;
+}
+
+static
+rc_t KTocEntryInflateNodeCommon (const void ** ptr,
+				 const void * limit,
+				 KTocEntryInflateCommon * common,
+				 const char * path,
+				 bool rev)
+{
+    rc_t rc;
+    uint16_t plen;
+    uint16_t nlen;
+
+    rc = read_u16 (ptr, limit, rev, &nlen);
+    if (rc)
+	return rc;
+
+    if (check_limit (*ptr, limit, nlen))
+	return RC (rcFS, rcTocEntry, rcParsing, rcBuffer, rcTooShort);;
+
+    plen = (uint16_t)strlen (path);
+    if (plen == 0)
+    {
+	common->name = malloc (nlen+1);
+	if (common->name == NULL)
+	{
+	    return RC (rcFS, rcTocEntry, rcInflating, rcMemory, rcExhausted);
+	}
+	memmove (common->name, *ptr, nlen);
+	common->name[nlen] = '\0';
+    }
+    else
+    {
+	common->name = malloc (plen + 1 + nlen+1);
+	if (common->name == NULL)
+	{
+	    return RC (rcFS, rcTocEntry, rcInflating, rcMemory, rcExhausted);
+	}
+	memmove (common->name, path, plen);
+	common->name[plen] = '/';
+	memmove (common->name+plen+1, *ptr, nlen);
+	common->name[plen + nlen + 1] = '\0';
+    }
+
+    *ptr = ((uint8_t*)*ptr) + nlen;
+
+    rc = read_i64 (ptr, limit, rev, &common->mtime);
+    if (rc == 0)
+    {
+	rc =read_u32 (ptr, limit, rev, &common->access);
+	if (rc == 0)
+	{
+	    uint8_t type;
+	    rc = read_u8 (ptr, limit, &type);
+	    if (rc == 0)
+	    {
+		common->type = type;
+		return 0;
+	    }
+	}
+    }
+    free (common->name);
+    common->name = NULL;
+    common->mtime = 0;
+    common->access = 0;
+    common->type = ktocentrytype_unknown;
+    return rc;
+}
+
+
+static
+rc_t KTocEntryInflateNodeDir (KToc * toc, KTocEntryInflateCommon * common, 
+			      const void ** ptr, uint64_t offset, uint64_t arcsize, const void * limit, bool rev)
+{
+    rc_t rc;
+
+    rc = KTocCreateDir (toc,
+			common->mtime,
+			common->access,
+			(KCreateMode)(kcmInit|kcmParents),
+			common->name);
+    if (rc == 0)
+    {
+	rc = KTocInflatePBSTree (toc, arcsize, *ptr, (uint32_t)( (uint8_t*)limit - (uint8_t*)*ptr ),
+                                 offset, rev, common->name);
+    }
+    return rc;
+}
+
+static
+rc_t KTocEntryInflateNodeFile (KToc * toc, const KTocEntryInflateCommon * common, 
+			       const void ** ptr, uint64_t offset, uint64_t arcsize, const void * limit, bool rev)
+{
+    rc_t rc;
+    uint64_t size;
+    uint64_t foffset;
+
+    rc = read_u64 (ptr, limit, rev, &foffset);
+    if (rc == 0)
+    {
+	rc = read_u64 (ptr, limit, rev, &size);
+	if (rc == 0)
+	{
+/*             KOutMsg ("%s %s %lu %lu %lu\n", __func__, common->name, size, offset + foffset, arcsize); */
+            if (arcsize >= offset + foffset + size )
+
+                rc = KTocCreateFile (toc,
+                                 offset + foffset,
+                                 size,
+                                 common->mtime,
+                                 common->access,
+                                 (KCreateMode)(kcmInit|kcmParents),
+                                 common->name);
+            else
+/*                 KOutMsg ("ZOMBIE: %s\n", common->name), */
+
+                rc = KTocCreateZombieFile (toc,
+                                           offset + foffset,
+                                           size,
+                                           common->mtime,
+                                           common->access,
+                                           (KCreateMode)(kcmInit|kcmParents),
+                                           common->name);
+	}
+    }
+    return rc;
+}
+
+static
+rc_t KTocEntryInflateNodeEmptyFile (KToc * toc, const KTocEntryInflateCommon * common, 
+                                    const void ** ptr, uint64_t offset, const void * limit, bool rev)
+{
+    rc_t rc;
+
+    rc = KTocCreateFile (toc,
+                         0,
+                         0,
+                         common->mtime,
+                         common->access,
+                         (KCreateMode)(kcmInit|kcmParents),
+                         common->name);
+    return rc;
+}
+
+static
+rc_t KTocEntryInflateNodeChunked (KToc * toc, const KTocEntryInflateCommon * common, 
+				  const void ** ptr, uint64_t offset, const void * limit, bool rev)
+{
+    rc_t rc;
+    uint64_t size;
+    uint32_t count;
+    KTocChunk * chunks;
+
+    rc = read_u64 (ptr, limit, rev, &size);
+    if (rc == 0)
+    {
+	rc = read_u32 (ptr, limit, rev, &count);
+	if (rc == 0)
+	{
+	    chunks = malloc (sizeof (KTocChunk) * count);
+	    if (chunks == NULL)
+		rc = RC (rcFS, rcTocEntry, rcParsing, rcMemory, rcExhausted);
+	    else
+	    {
+		uint32_t ix;
+		for (ix = 0; (rc == 0) && (ix < count); ++ix)
+		{
+		    if (rc == 0)
+			rc = read_u64 (ptr, limit, rev, &chunks[ix].logical_position);
+		    if (rc == 0)
+		    {
+			rc = read_u64 (ptr, limit, rev, &chunks[ix].source_position);
+			chunks[ix].source_position += offset;
+		    }
+		    if (rc == 0)
+			rc = read_u64 (ptr, limit, rev, &chunks[ix].size);
+		}
+		if (rc == 0)
+		    rc = KTocCreateChunkedFile (toc,
+						size,
+						common->mtime,
+						common->access,
+						count,
+						chunks,
+						(KCreateMode)(kcmInit|kcmParents),
+						common->name);
+		free (chunks);
+	    }
+	}
+    }
+    return rc;
+}
+
+static
+rc_t KTocEntryInflateNodeHardLink (KToc * toc, const KTocEntryInflateCommon * common, 
+				   const void ** ptr, uint64_t offset, const void * limit, bool rev)
+{
+    rc_t rc;
+    uint16_t llen;
+    char * link;
+
+    rc = read_u16 (ptr, limit, rev, &llen);
+    if (rc)
+	return rc;
+
+    if (check_limit (*ptr, limit, llen))
+	return RC (rcFS, rcTocEntry, rcParsing, rcBuffer, rcTooShort);;
+
+    link = malloc (llen + 1);
+    if (link == NULL)
+	return RC (rcFS, rcTocEntry, rcParsing, rcMemory, rcExhausted);
+
+    memmove (link, ptr, llen);
+    link[llen] = '\0';
+
+    rc = KTocCreateHardLink (toc, 
+			     common->mtime,
+			     common->access,
+			     (KCreateMode)(kcmInit|kcmParents),
+			     link,
+			     common->name);
+    
+    free (link);
+    return rc;
+}
+
+static
+rc_t KTocEntryInflateNodeSoftLink (KToc * toc, const KTocEntryInflateCommon * common, 
+				  const void ** ptr, uint64_t offset, const void * limit, bool rev)
+{
+    rc_t rc;
+    uint16_t llen;
+    char * link;
+
+    rc = read_u16 (ptr, limit, rev, &llen);
+    if (rc)
+	return rc;
+
+    if (check_limit (*ptr, limit, llen))
+	return RC (rcFS, rcTocEntry, rcParsing, rcBuffer, rcTooShort);;
+
+    link = malloc (llen + 1);
+    if (link == NULL)
+	return RC (rcFS, rcTocEntry, rcParsing, rcMemory, rcExhausted);
+
+    memmove (link, *ptr, llen);
+    link[llen] = '\0';
+
+    rc = KTocCreateSoftLink (toc, 
+			     common->mtime,
+			     common->access,
+			     (KCreateMode)(kcmInit|kcmParents),
+			     link,
+			     common->name);
+    
+    free (link);
+    return rc;
+}
+
+static
+void CC KTocEntryInflate (PBSTNode * n, void * _data)
+{
+    KTocEntryInflateData * data;
+    const void * ptr;
+    const void * limit;
+    KTocEntryInflateCommon common;
+    rc_t rc;
+
+    data = _data;
+    if (data->rc != 0)
+	return;
+    ptr = n->data.addr;
+    limit = (uint8_t*)ptr + n->data.size;
+    rc = KTocEntryInflateNodeCommon (&ptr, limit, &common, data->path, data->rev);
+    if (rc == 0)
+    {
+	switch (common.type)
+	{
+	default:
+	case ktocentrytype_unknown:
+	case ktocentrytype_notfound:
+	    rc = RC (rcFS, rcTocEntry, rcParsing, rcFile, rcCorrupt);
+	    break;
+	case ktocentrytype_dir:
+	    rc = KTocEntryInflateNodeDir (data->toc, &common, &ptr, data->offset,
+                                          data->arcsize, limit, data->rev);
+	    break;
+	case ktocentrytype_file:
+            rc = KTocEntryInflateNodeFile (data->toc, &common, &ptr, data->offset,
+                                           data->arcsize, limit, data->rev);
+	    break;
+	case ktocentrytype_emptyfile:
+	    rc = KTocEntryInflateNodeEmptyFile (data->toc, &common, &ptr, data->offset,
+                                                limit, data->rev);
+	    break;
+	case ktocentrytype_chunked:
+	    rc = KTocEntryInflateNodeChunked (data->toc, &common, &ptr, data->offset, limit, data->rev);
+	    break;
+	case ktocentrytype_softlink:
+	    rc = KTocEntryInflateNodeSoftLink (data->toc, &common, &ptr, data->offset, limit, data->rev);
+	    break;
+	case ktocentrytype_hardlink:
+	    rc = KTocEntryInflateNodeHardLink (data->toc, &common, &ptr, data->offset, limit, data->rev);
+	    break;
+	}
+	free (common.name);
+    }    
+    data->rc = rc; /* return */
+}
+
+rc_t KTocInflatePBSTree ( KToc * self, uint64_t arcsize, const void * treestart, uint32_t maxsize,
+			 uint64_t offset, bool rev, const char * path )
+{
+    rc_t rc;
+    PBSTree * pbst;
+
+    rc = PBSTreeMake (&pbst, treestart, maxsize, rev);
+    if (rc == 0)
+    {
+        KTocEntryInflateData data;
+
+        data.toc = self;
+        data.path = path;
+        data.arcsize = arcsize;
+        data.rc = 0;
+        data.rev = rev;
+        data.offset = offset;
+        
+        PBSTreeForEach (pbst, false, KTocEntryInflate, &data);
+
+        rc = data.rc;
+
+        PBSTreeWhack (pbst);
+    }
+    return rc;
+}
+
+
+/* end of file tocentry.c */
+
diff --git a/libs/kfs/tocfile.c b/libs/kfs/tocfile.c
new file mode 100644
index 0000000..1f912c9
--- /dev/null
+++ b/libs/kfs/tocfile.c
@@ -0,0 +1,635 @@
+/*===========================================================================
+ *
+ *                            Public DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kfs/extern.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/arc.h>
+#include <kfs/toc.h>
+#include <kfs/sra.h>
+#include <kfs/directory.h>
+#include <klib/defs.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <sysalloc.h>
+
+#include "toc-priv.h"
+
+#include <assert.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct KTocFile;
+#define KFILE_IMPL struct KTocFile
+#include <kfs/impl.h>
+
+#define OPEN_FILE_CACHE_MAX 1
+
+
+/*--------------------------------------------------------------------------
+ * FileCacheNode
+ */
+typedef struct FileCacheNode FileCacheNode;
+
+struct FileCacheNode
+{
+    BSTNode n;
+    const char *path;
+    const KFile *file;
+    struct FileCacheNode * newer;
+};
+
+static
+int64_t CC FileCacheNodeCmp ( const void *item, const BSTNode *n )
+{
+    const char *a = item;
+    const FileCacheNode *b = ( const FileCacheNode* ) n;
+
+    if ( a < b -> path )
+        return -1;
+    return a > b -> path;
+}
+
+static
+int64_t CC FileCacheNodeSort ( const BSTNode *item, const BSTNode *n )
+{
+    const FileCacheNode *a = ( const FileCacheNode* ) item;
+    const FileCacheNode *b = ( const FileCacheNode* ) n;
+
+    if ( a -> path < b -> path )
+        return -1;
+    return a -> path > b -> path;
+}
+
+static
+void CC FileCacheNodeWhack ( BSTNode *n, void *ignore )
+{
+    FileCacheNode *self = ( FileCacheNode* ) n;
+    KFileRelease ( self -> file );
+    free ( self );
+}
+
+static
+rc_t FileCacheNodeMake ( FileCacheNode **fcnp, const char *path, const KFile *file )
+{
+    FileCacheNode *fcn = malloc ( sizeof *fcn );
+    if ( fcn == NULL )
+        return RC ( rcFS, rcFile, rcReading, rcMemory, rcExhausted );
+
+    fcn -> path = path;
+    fcn -> file = file;
+
+    * fcnp = fcn;
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * KTocFile
+ */
+
+typedef struct KTocFile
+{
+    KFile dad;
+    const KToc * toc;
+    const KDirectory * dir;
+    uint8_t * header;
+/* these three below fields are mutable */
+    BSTree open_file_cache;     /* opened files by name */
+    FileCacheNode * head;       /* least recently opened */
+    FileCacheNode * tail;       /* most recently opened */
+/* these three above fields are mutable */
+    uint64_t file_size;
+    size_t header_size;
+/* the below field s mutable */
+    uint32_t cache_count;
+/* the above field is mutable */
+} KTocFile;
+
+/* Destroy
+ */
+static
+rc_t CC KTocFileDestroy (KTocFile *self)
+{
+    BSTreeWhack ( & self -> open_file_cache, FileCacheNodeWhack, NULL );
+    KTocRelease (self->toc);
+    KDirectoryRelease (self->dir);
+    free (self->header);
+    free (self);
+    return 0;
+}
+
+/* GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ *
+ * Since this file does not have a system file underlaying the header
+ * nor does it have a single file underlaying the various "subfiles"
+ * it must return NULL;
+ */
+static struct
+KSysFile *CC KTocFileGetSysFile ( const KTocFile *self, uint64_t *offset )
+{
+    * offset = 0;
+    return NULL;
+}
+
+/* RandomAccess
+ *  ALMOST by definition, the file is random access
+ *  certain file types ( notably compressors ) will refuse random access
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t CC KTocFileRandomAccess ( const KTocFile *self )
+{
+    assert (self != NULL);
+    return 0;
+}
+
+
+/* Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KTocFileType ( const KTocFile *self )
+{
+    return kfdFile;
+}
+
+
+/* Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KTocFileSize ( const KTocFile *self, uint64_t *size )
+{
+    assert (self != NULL);
+    assert (size != NULL);
+
+    *size = self->file_size;
+    return 0;
+}
+
+/* SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KTocFileSetSize ( KTocFile *self, uint64_t size )
+{
+    return RC (rcFS, rcFile, rcUpdating, rcToc, rcUnsupported);
+}
+
+/* Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+size_t get_filler (const KTocFile *self, size_t z)
+{
+    size_t align = KTocAlignmentGet((KToc *)self->toc); /* type convert mutable field */
+    if (align > 1)
+    {
+        size_t mask = (size_t)align - 1;    /* get significant bits */
+        return (align - (z & mask)) & mask;
+    }
+    return 0;
+}
+
+static
+rc_t CC KTocFileRead ( const KTocFile *self, uint64_t _pos,
+    void *_buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+    uint64_t pos;
+    uint8_t * buffer;
+    size_t filler;
+
+    assert (self != NULL);
+    assert (_buffer != NULL);
+
+    TOC_DEBUG (("%s: off %lu siz %zu ------\n", __func__, _pos, bsize));
+    TOC_DEBUG (("%s: self->file_size %lu\n", __func__, self->file_size));
+    rc = 0;
+    pos = _pos;
+    buffer = _buffer;
+
+    *num_read = 0;
+
+    /* go ahead and trim from read attempts anything beyond EOF
+     * return as EOF if we are asked to read beyond virtual file size
+     */
+    if (pos > self->file_size)  /* fully past EOF quit now */
+    {
+        TOC_DEBUG (("KTocFileRead read 0 past EOF"));
+	return 0;
+    }
+
+    if ((pos + bsize) > self->file_size)        /* partially past EOF quit at EOF */
+    {
+	bsize = (size_t)( self->file_size - pos );
+        TOC_DEBUG (("KTocFileRead trimmed read to %zu\n",bsize));
+    }
+
+    filler = get_filler (self, self->header_size);
+
+    /* get portion of read from header */
+    if (pos < (uint64_t) (self->header_size + filler))
+    {
+	size_t to_read = 0;
+
+        TOC_DEBUG (("%s size of header %zu filler after header %zu\n",
+                    __func__, self->header_size, filler));
+
+        /* header proper */
+        if (pos < self->header_size)
+        {
+            to_read = self->header_size - (size_t)pos;
+            if (to_read > bsize)
+                to_read = bsize;
+            memmove (buffer, self->header + pos, to_read);
+
+            pos += to_read;
+            bsize -= to_read;
+        }
+        /* filler after header */
+        if (pos != self->header_size)    /* didn't reach end of header */
+            filler = 0;
+        else
+        {
+            if (filler > bsize)
+                filler = bsize;
+            if (filler)
+            {
+                memset (buffer + to_read, 0, filler);
+            }
+        }
+
+	/* exit on partial read */
+	*num_read = to_read + filler;
+        TOC_DEBUG (("%s hdr read %zu", __func__, *num_read));
+	return 0;
+    }
+    else
+        /* start in on files */
+    {
+        uint64_t fpos;
+        uint64_t fsize;
+        const char * path;
+        const KDirectory * dir;
+        size_t to_read;
+        size_t this_read;
+        size_t all_read;
+        size_t filler;
+
+        *num_read = all_read = to_read = 0;
+
+        dir = KTocGetArchive (self->toc);
+        rc = KTocResolvePathFromOffset (self->toc, &path, &fpos, pos);
+        if (path != NULL)
+        {
+            if (rc != 0)
+            {
+                TOC_DEBUG (("%s can't resolve offset $(O) %R\n", __func__, pos, rc));
+                return rc;
+            }
+            TOC_DEBUG (("%s reading \"%s\" at offset %lu\n", __func__, path, pos));
+            rc = KDirectoryFileSize (dir, &fsize, "%s", path);
+            if (rc != 0)
+            {
+                TOC_DEBUG (("%s can't  determine sub file size  %s %R\n", __func__, path, rc));
+                return rc;
+            }
+            TOC_DEBUG (("%s size %lu\n", __func__, fsize));
+
+            if ((fpos + bsize) <= fsize)
+            {
+                filler = 0;
+                to_read = bsize;
+            }
+            else
+            {
+                filler = get_filler ( self, (size_t)fsize );
+                if ( bsize > ( fsize + filler ) )
+                    bsize = (size_t)( fsize + filler );
+
+                if (fpos < fsize)
+                {
+                    to_read = (size_t)( fsize - fpos );
+                    if (bsize <  (to_read + filler))
+                        filler = bsize - to_read;
+                }
+                else
+                {
+                    to_read = 0;
+                    if (filler > bsize)
+                        filler = bsize;
+                }
+            }
+
+            if (to_read)
+            {
+                KTocFile *mself = (KTocFile *)self;        /* to access mutable fields within self */
+                FileCacheNode *n;
+
+                TOC_DEBUG (("%s subfile %s\n", __func__, path));
+
+                /* look in cache */
+                n = ( FileCacheNode* ) BSTreeFind ( & mself -> open_file_cache,
+                                                    path, FileCacheNodeCmp );
+                if ( n != NULL )
+                {
+                    FileCacheNode * this_one;
+                    TOC_DEBUG (("%s cache hit for subfile %s\n", __func__, path));
+
+                    for (this_one = mself->head; this_one != n; this_one = this_one->newer)
+                    {
+                        if (this_one == NULL)
+                            return RC (rcFS, rcFile, rcOpening, rcToc, rcCorrupt);
+                    }
+                    if (mself->tail != mself->head) /* nothing to do if only one in queue */
+                    {
+                        if (this_one == mself->head)
+                        {
+                            mself->head = n->newer;
+                            n->newer = NULL;
+                            this_one = mself->tail;
+                            /* race condition possible: bad if next pair of assigns is not atomic and multi-threading */
+                            mself->tail = this_one->newer = n;
+                        }
+                    }
+                }
+                else
+                {
+                    const KFile * file;
+
+                    for (;;)
+                    {
+                        /* if we don't have too many files open, try to close something in the cache */
+                        if (mself->cache_count <= OPEN_FILE_CACHE_MAX)
+                        {
+                            TOC_DEBUG (("%s open subfile %s\n", __func__, path));
+                            /* open file on demand */
+                            rc = KDirectoryOpenFileRead (KTocGetArchive(self->toc), &file, "%s", path);
+                            if (rc == 0)
+                                break;
+                        }
+                        
+                        /* if we've run out of file descriptors try clearing the cache a bit */
+                        if ( ( rc == 0 ) || ( ( GetRCObject( rc ) == ( enum RCObject ) rcFileDesc ) &&
+                                               ( GetRCState( rc ) == rcExhausted ) ) )
+                        {
+                            TOC_DEBUG (("%s no more file descriptors\n", __func__));
+
+                            if (mself->cache_count != 0)
+                            {
+                                FileCacheNode * pn;
+
+                                rc = 0;
+                                pn = mself->head;
+                                TOC_DEBUG (("%s cache closing %s\n", __func__, pn->path));
+                                BSTreeUnlink (&mself->open_file_cache, &pn->n);
+                                mself->cache_count--;
+                                mself->head = pn->newer;
+                                (void)FileCacheNodeWhack (&pn->n, NULL);
+                                continue;
+                            }
+                        }
+                        return rc;
+                    }
+
+                    /* create a new cache node */
+                    rc = FileCacheNodeMake ( & n, path, file );
+                    if ( rc != 0 )
+                    {
+                        TOC_DEBUG (("%s %R  can't cache sub file %s\n", __func__, rc, path));
+                        KFileRelease ( file );
+                        return rc;
+                    }
+
+                    /* insert into cache */
+                    BSTreeInsert ( & mself -> open_file_cache, & n -> n, FileCacheNodeSort );
+                    mself->cache_count++;
+                    if (mself->head == NULL)
+                        mself->head = mself->tail = n;
+                    else
+                    {
+                        mself->tail->newer = n;
+                        mself->tail = n;
+                    }
+                }
+
+                rc = KFileRead (n ->file, fpos, buffer, to_read, &this_read);
+                if ( rc != 0)
+                {
+                    TOC_DEBUG (("%s %R error reading sub file %s\n", __func__, rc, path));
+                    return rc;
+                }
+            }
+            if (filler)
+                memset (buffer+to_read, 0, filler);
+
+            *num_read = to_read + filler;
+            TOC_DEBUG (("%s file %s read %zu\n", __func__, path, *num_read));
+        }
+    }
+    return rc;
+}
+
+/* Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+static
+rc_t CC KTocFileWrite ( KTocFile *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ)
+{
+    assert ( self != NULL );
+    return RC (rcFS, rcFile, rcWriting, rcToc, rcUnsupported);
+}
+
+
+static const KFile_vt_v1 vtKTocFile =
+{
+    /* version 1.1 */
+    1, 1,
+
+    /* start minor version 0 methods */
+    KTocFileDestroy,
+    KTocFileGetSysFile,
+    KTocFileRandomAccess,
+    KTocFileSize,
+    KTocFileSetSize,
+    KTocFileRead,
+    KTocFileWrite,
+    /* end minor version 0 methods */
+
+    /* start minor version == 1 */
+    KTocFileType
+    /* end minor version == 1 */
+};
+
+LIB_EXPORT rc_t CC KTocFileMake ( const KFile ** pself,
+		   const KToc * toc,
+		   const KDirectory * dir,
+		   void * header,
+		   uint64_t file_size,
+		   size_t header_size )
+{
+    KTocFile * self;
+    rc_t rc;
+
+    rc = 0;
+    self = malloc (sizeof (*self));
+    if (self == NULL)
+    {
+	rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+	LOGERR (klogErr, rc, "Out of memory in KTocFileMake");
+    }
+    else
+    {
+	rc = KFileInit (&self->dad, (const KFile_vt*)&vtKTocFile, "KTocFile", "no-name", true, false);
+	if (rc != 0)
+	{
+	    LOGERR (klogErr, rc, "Init failure in KTocFileMake");
+	}
+	else
+	{
+	    self->toc = toc;
+	    self->dir = dir;
+	    self->header = header;
+            BSTreeInit ( & self -> open_file_cache );
+            self->head = self->tail = NULL;
+            self->cache_count = 0;
+	    self->file_size = file_size;
+	    self->header_size = header_size;
+            TOC_DEBUG (("%s: file_size %lu header_size %u\n", __func__, file_size, header_size));
+	    KTocAddRef (toc);
+	    KDirectoryAddRef (dir);
+	    *pself = &self->dad;
+	    return 0;
+	}
+	free (self);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDirectoryOpenTocFileRead ( const KDirectory * self,
+				const KFile ** pfile,
+                                KSRAFileAlignment align,
+				bool ( CC * filter ) ( const KDirectory*, const char*, void* ),
+				void * filter_param,
+				rc_t ( CC * usort ) ( const KDirectory*, struct Vector* ) )
+{
+    rc_t rc;
+
+    TOC_DEBUG (("%s: enter\n",__func__));
+
+    rc = 0;
+    if (self == NULL)
+    {
+	rc = RC (rcFS, rcDirectory, rcConstructing, rcSelf, rcNull);
+	LOGERR (klogErr, rc, "Directory NULL in constructing a TocFile");
+	return rc;
+    }
+    if (pfile == NULL)
+    {
+	rc = RC (rcFS, rcDirectory, rcConstructing, rcParam, rcNull);
+	LOGERR (klogErr, rc, "file pointer parameter NULL in constructing a TocFile");
+	return rc;
+    }
+    if (rc == 0)
+    {
+	const KDirectory * dir;
+
+	rc = KDirectoryOpenArcDirRead (self, &dir, true, ".", tocKDirectory,
+				       KArcParseKDir, filter, filter_param);
+	if (rc != 0)
+	{
+	    LOGERR (klogErr, rc, "Failure to parse directory to TOC");
+	}
+	else
+	{
+	    void * header;
+	    uint64_t file_size;
+	    size_t header_size;
+
+            TOC_DEBUG (("%s: Persisting header\n", __func__));
+	    rc = KArcDirPersistHeader ((KArcDir*)dir, &header, &header_size, &file_size, align, usort);
+	    if (rc == 0)
+	    {
+		const KToc * toc;
+
+                TOC_DEBUG (("%s: Get TOC\n", __func__));
+		rc = KArcDirGetTOC ((const KArcDir*)dir, &toc); /* does not addref() */
+		if (rc != 0)
+		{
+		    LOGERR (klogErr, rc, "Failure to parse directory to TOC");
+		}
+		else
+		{
+		    const KFile * file;
+
+                    TOC_DEBUG (("%s: call KTocFileMake file_size %lu \n", __func__, file_size));
+
+		    rc = KTocFileMake (&file, toc, self, header, file_size, header_size);
+		    if (rc != 0)
+		    {
+			LOGERR (klogErr, rc, "Failure to make KTocFile");
+		    }
+		    else
+		    {
+			*pfile = file;
+		    }
+		}
+	    }
+            KDirectoryRelease (dir);
+	}
+    }
+    return rc;
+}
+						
+
+/* end of file dirfile.c */
diff --git a/libs/kfs/unix/sysdir-priv.h b/libs/kfs/unix/sysdir-priv.h
new file mode 100644
index 0000000..9cd1729
--- /dev/null
+++ b/libs/kfs/unix/sysdir-priv.h
@@ -0,0 +1,68 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sysdir_priv_
+#define _h_sysdir_priv_
+
+#ifndef _h_kfs_impl_
+#include <kfs/impl.h>
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * KSysDir
+ *  a Unix directory
+ */
+typedef struct KSysDir_v1 KSysDir_v1;
+typedef struct KSysDir_v2 KSysDir_v2;
+/* MakePath
+ *  create a full path from partial
+ *
+ *  "ctx" [ IN ] - a prepared context for returning non-zero rc_t
+ *
+ *  "canon" [ IN ] - if true, rewrite path in canonical form. usually
+ *  not required when passing a path to the system, as the OS performs
+ *  its own processing.
+ *
+ *  "bufer" [ OUT ] and "path_max" [ IN ] - return buffer for processed path
+ *
+ *  "path" [ IN ] and "args" [ IN, NULL OKAY ] - input path to be resolved
+ */
+rc_t KSysDirMakePath_v1 ( struct KSysDir_v1 const *self, enum RCContext ctx, bool canon,
+    char *buffer, size_t path_max, const char *path, va_list args );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_sysdir_priv_ */
diff --git a/libs/kfs/unix/sysdir.c b/libs/kfs/unix/sysdir.c
new file mode 100644
index 0000000..ab0c815
--- /dev/null
+++ b/libs/kfs/unix/sysdir.c
@@ -0,0 +1,2414 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KSysDir_v1;
+struct KSysDirListing;
+
+#define KDIR_IMPL struct KSysDir_v1
+#define KNAMELIST_IMPL struct KSysDirListing
+
+#include <kfs/extern.h>
+#include "sysdir-priv.h"
+#include "sysfile-priv.h"
+#include <klib/sort.h>
+#include <klib/impl.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/klib-priv.h>
+#include <sysalloc.h>
+
+#include "os-native.h"
+
+#ifndef __USE_UNIX98
+#define __USE_UNIX98 1
+#endif
+#include <unistd.h>
+
+/* old Sun includes won't define PATH_MAX */
+#ifndef __XOPEN_OR_POSIX
+#define __XOPEN_OR_POSIX 1
+#endif
+
+#include <limits.h>
+
+/* now they won't define lstat */
+#undef __XOPEN_OR_POSIX
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <utime.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KSysDirEnum
+ *  a Unix directory enumerator
+ */
+typedef struct KSysDirEnum KSysDirEnum;
+struct KSysDirEnum
+{
+    DIR *dir;
+};
+
+/* Whack
+ */
+static
+void KSysDirEnumWhack ( KSysDirEnum *self )
+{
+    closedir ( self -> dir );
+}
+
+/* Init
+ */
+static
+rc_t KSysDirEnumInit ( KSysDirEnum *self, const char *path )
+{
+    self -> dir = opendir ( path );
+    if ( self -> dir != NULL )
+        return 0;
+
+    switch ( errno )
+    {
+    case EACCES:
+        return RC ( rcFS, rcDirectory, rcListing, rcDirectory, rcUnauthorized );
+    case EMFILE:
+    case ENFILE:
+        return RC ( rcFS, rcDirectory, rcListing, rcFileDesc, rcExhausted );
+    case ENOENT:
+        return RC ( rcFS, rcDirectory, rcListing, rcPath, rcNotFound );
+    case ENOMEM:
+        return RC ( rcFS, rcDirectory, rcListing, rcMemory, rcExhausted );
+    case ENOTDIR:
+        return RC ( rcFS, rcDirectory, rcListing, rcPath, rcIncorrect );
+    }
+
+    return RC ( rcFS, rcDirectory, rcListing, rcNoObj, rcUnknown );
+}
+
+/* Next
+ */
+static
+const char *KSysDirEnumNext ( const KSysDirEnum *self )
+{
+    while ( 1 )
+    {
+        struct dirent *e = readdir ( self -> dir );
+        if ( e == NULL )
+            break;
+
+        if ( e -> d_name [ 0 ] == '.' )
+        {
+            switch ( e -> d_name [ 1 ] )
+            {
+            case 0:
+                continue;
+            case '.':
+                if ( e -> d_name [ 2 ] == 0 )
+                    continue;
+                break; 
+            }
+        }
+
+        return e -> d_name;
+    }
+
+    return NULL;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KSysDirListing
+ *  a Unix directory listing
+ */
+typedef struct KSysDirListing KSysDirListing;
+struct KSysDirListing
+{
+    KNamelist dad;
+    const char **namelist;
+    int cnt;
+};
+
+/* Whack
+ */
+static
+rc_t KSysDirListingWhack ( const KSysDirListing *self )
+{
+    int i;
+    for ( i = 0; i < self -> cnt; ++ i )
+        free ( ( void* ) self -> namelist [ i ] );
+    free ( self -> namelist );
+    return 0;
+}
+
+static
+rc_t KSysDirListingDestroy ( KSysDirListing *self )
+{
+    rc_t rc = KSysDirListingWhack ( self );
+    if ( rc == 0 )
+        free ( self );
+    return rc;
+}
+
+/* Count
+ */
+static
+rc_t KSysDirListingCount ( const KSysDirListing *self, uint32_t *count )
+{
+    * count = self -> cnt;
+    return 0;
+}
+
+/* Get
+ */
+static
+rc_t KSysDirListingGet ( const KSysDirListing *self, uint32_t idx, const char **name )
+{
+    if ( idx >= ( uint32_t ) self -> cnt )
+        return RC ( rcFS, rcNamelist, rcAccessing, rcParam, rcExcessive );
+    * name = self -> namelist [ idx ];
+    return 0;
+}
+
+/* Init
+ */
+static KNamelist_vt_v1 vtKSysDirListing =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* start minor version 0 methods */
+    KSysDirListingDestroy,
+    KSysDirListingCount,
+    KSysDirListingGet
+    /* end minor version 0 methods */
+};
+
+static
+int64_t KSysDirListingSort ( const void *a, const void *b, void * ignored )
+{
+    return strcmp ( * ( const char** ) a, * ( const char** ) b );
+}
+
+static
+rc_t KSysDirListingInit ( KSysDirListing *self, const char *path, const KDirectory_v1 *dir,
+    bool ( * f ) ( const KDirectory_v1*, const char*, void* ), void *data )
+{
+    rc_t rc;
+
+    self -> namelist = NULL;
+    self -> cnt = 0;
+
+    rc = KNamelistInit ( & self -> dad,
+        ( const KNamelist_vt* ) & vtKSysDirListing );
+    if ( rc == 0 )
+    {
+        KSysDirEnum list;
+        rc = KSysDirEnumInit ( & list, path );
+        if ( rc == 0 )
+        {
+            uint32_t len = 512;
+            self -> namelist = malloc ( len * sizeof self -> namelist [ 0 ] );
+            if ( self -> namelist == NULL )
+                rc = RC ( rcFS, rcDirectory, rcListing, rcMemory, rcExhausted );
+            else
+            {
+                void *r;
+                const char *name;
+                while ( ( name = KSysDirEnumNext ( & list ) ) != NULL )
+                {
+                    if ( f != NULL )
+                    {
+                        if ( ! ( * f ) ( dir, name, data ) )
+                            continue;
+                    }
+                    
+                    if ( self -> cnt == len )
+                    {
+                        len += len;
+                        r = realloc ( self -> namelist,
+                            len * sizeof self -> namelist [ 0 ] );
+                        if ( r == NULL )
+                        {
+                            rc = RC ( rcFS, rcDirectory, rcListing, rcMemory, rcExhausted );
+                            break;
+                        }
+                        self -> namelist = r;
+                    }
+
+                    self -> namelist [ self -> cnt ] = malloc ( strlen ( name ) + 1 );
+                    if ( self -> namelist [ self -> cnt ] == NULL )
+                    {
+                        rc = RC ( rcFS, rcDirectory, rcListing, rcMemory, rcExhausted );
+                        break;
+                    }
+                    strcpy ( ( char* ) self -> namelist [ self -> cnt ], name );
+                    ++ self -> cnt;
+                }
+
+                if ( rc == 0 )
+                {
+                    r = realloc ( self -> namelist,
+                        self -> cnt * sizeof self -> namelist [ 0 ] );
+                    if ( r != NULL )
+                    {
+                        self -> namelist = r;
+                        ksort ( r, self -> cnt, sizeof self -> namelist [ 0 ], KSysDirListingSort, NULL );
+                    }
+                    else if ( self -> cnt != 0 )
+                    {
+                        rc = RC ( rcFS, rcDirectory, rcListing, rcMemory, rcExhausted );
+                    }
+                    else
+                    {
+                        self -> namelist = r;
+                    }
+                }
+
+                if ( rc != 0 )
+                {
+                    KSysDirListingWhack ( self );
+                    self -> namelist = NULL;
+                    self -> cnt = 0;
+                }
+            }
+
+            KSysDirEnumWhack ( & list );
+        }
+    }
+    return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * KSysDir
+ *  a Unix directory
+ */
+struct KSysDir_v1
+{
+    KDirectory_v1 dad;
+    uint32_t root;
+    uint32_t size;
+    char path [ PATH_MAX ];
+};
+
+/* KSysDirMake
+ *  allocate an uninialized object
+ */
+static
+KSysDir_v1 *KSysDirMake_v1 ( size_t path_size )
+{
+    KSysDir_v1 *dir = malloc ( ( sizeof * dir - sizeof dir -> path + 2 ) + path_size );
+    return dir;
+}
+
+/* KSysDirDestroy
+ */
+static
+rc_t KSysDirDestroy_v1 ( KSysDir_v1 * self )
+{
+    free ( self );
+    return 0;
+}
+
+/* KSysDirInit
+ */
+static
+rc_t KSysDirInit_v1 ( KSysDir_v1 * self, enum RCContext ctx, uint32_t dad_root,
+    const char *path, uint32_t path_size, bool update, bool chroot );
+
+
+/* KSysDirCanonPath
+ */
+static
+rc_t KSysDirCanonPath_v1 ( const KSysDir_v1 * self, enum RCContext ctx, char *path, size_t psize )
+{
+    char *low, *dst, *last, *end = path + psize;
+    low = dst = last = path + self -> root;
+
+    while ( 1 )
+    {
+        char *src = strchr ( last + 1, '/' );
+        if ( src == NULL )
+            src = end;
+
+        /* detect special sequences */
+        switch ( src - last )
+        {
+        case 1: 
+            if ( last [ 1 ] == '/' )
+            {
+                /* "//" -> "/" */
+                last = src;
+            }
+            break;
+            
+        case 2:
+            if ( last [ 1 ] == '.' )
+            {
+                /* skip over "./" */
+                last = src;
+                if ( src != end )
+                    continue;
+            }
+            break;
+
+        case 3:
+            if ( last [ 1 ] == '.' && last [ 2 ] == '.' )
+            {
+                /* remove previous leaf in path */
+                dst [ 0 ] = 0;
+                dst = strrchr ( path, '/' );
+                if ( dst == NULL || dst < low )
+                    return RC ( rcFS, rcDirectory, ctx, rcPath, rcInvalid );
+
+                last = src;
+                if ( src != end )
+                    continue;
+            }
+            break;
+        }
+
+        /* if rewriting, copy leaf */
+        assert ( src >= last );
+
+        if ( dst != last )
+            memmove ( dst, last, src - last );
+
+        /* move destination ahead */
+        dst += src - last;
+        
+        /* if we're done, go */
+        if ( src == end )
+                break;
+
+        /* find next separator */
+        last = src;
+    }
+
+    /* NUL terminate if modified */
+    if ( dst != end )
+        * dst = 0;
+
+    return 0;
+}
+
+/* KSysDirMakePath
+ *  creates a full path from partial
+ */
+rc_t KSysDirMakePath_v1 ( const KSysDir_v1 * self, enum RCContext ctx, bool canon,
+    char *buffer, size_t path_max, const char *path, va_list args )
+{
+    int psize;
+    size_t bsize;
+
+    if ( path == NULL )
+        return RC ( rcFS, rcDirectory, ctx, rcPath, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcFS, rcDirectory, ctx, rcPath, rcInvalid );
+
+    if ( args != NULL && path [ 0 ] == '%' )
+    {
+        psize = vsnprintf ( buffer, path_max, path, args );
+        if ( psize < 0 || psize >= path_max )
+            return RC ( rcFS, rcDirectory, ctx, rcPath, rcExcessive );
+        if ( buffer [ 0 ] != '/' )
+        {
+            bsize = self -> size;
+            if ( bsize + psize >= path_max )
+                return RC ( rcFS, rcDirectory, ctx, rcPath, rcExcessive );
+            memmove ( buffer + bsize, buffer, psize + 1 );
+            assert ( self -> path [ bsize - 1 ] == '/' );
+            memmove ( buffer, self -> path, bsize );
+        }
+        else if ( ( bsize = self -> root ) != 0 )
+        {
+            if ( bsize + psize >= path_max )
+                return RC ( rcFS, rcDirectory, ctx, rcPath, rcExcessive );
+            memmove ( buffer + bsize, buffer, psize + 1 );
+            assert ( self -> path [ bsize - 1 ] != '/' );
+            memmove ( buffer, self -> path, bsize );
+        }
+    }
+    else
+    {
+        if ( path [ 0 ] != '/' )
+        {
+            assert ( self -> path [ self -> size - 1 ] == '/' );
+            memmove ( buffer, self -> path, bsize = self -> size );
+        }
+        else if ( ( bsize = self -> root ) != 0 )
+        {
+            assert ( self -> path [ bsize - 1 ] != '/' );
+            memmove ( buffer, self -> path, bsize );
+        }
+
+        if ( args == NULL )
+            psize = snprintf ( buffer + bsize, path_max - bsize, "%s", path );
+        else
+            psize = vsnprintf ( buffer + bsize, path_max - bsize, path, args );
+
+        if ( psize < 0 || bsize + psize >= path_max )
+            return RC ( rcFS, rcDirectory, ctx, rcPath, rcExcessive );
+    }
+
+    /* remove trailing slashes; keep the leading slash */
+    while ( bsize + psize > 1 && buffer [ bsize + psize - 1] == '/' )
+        buffer [ bsize + -- psize ] = 0;
+
+    if ( psize > 0 && ( canon || self -> root != 0 ) )
+        return KSysDirCanonPath_v1 ( self, ctx, buffer, bsize + psize );
+
+    return 0;
+}
+
+
+/* RealPath
+ *  returns a real OS path
+ */
+rc_t KSysDirVRealPath ( const KSysDir_v1 * self,
+    char *real, size_t bsize, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcLoading, false,
+        full, sizeof full, path, args );
+    assert ( bsize >= PATH_MAX );
+    if ( rc == 0 && realpath ( full, real ) == NULL )
+    {
+        switch ( errno )
+        {
+        case EACCES:
+            return RC ( rcFS, rcDylib, rcLoading, rcDirectory, rcUnauthorized );
+        case ENOTDIR:
+        case EINVAL:
+        case ELOOP:
+            return RC ( rcFS, rcDylib, rcLoading, rcPath, rcInvalid );
+        case EIO:
+            return RC ( rcFS, rcDylib, rcLoading, rcTransfer, rcUnknown );
+        case ENAMETOOLONG:
+            return RC ( rcFS, rcDylib, rcLoading, rcPath, rcExcessive );
+        case ENOENT:
+            return RC ( rcFS, rcDylib, rcLoading, rcPath, rcNotFound );
+        default:
+            return RC ( rcFS, rcDylib, rcLoading, rcNoObj, rcUnknown );
+        }
+    }
+
+    return rc;
+}
+
+rc_t KSysDirRealPath_v1 ( const KSysDir_v1 * self,
+    char *real, size_t bsize, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KSysDirVRealPath ( self, real, bsize, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+/* KSysDirList
+ *  create a directory listing
+ *
+ *  "list" [ OUT ] - return parameter for list object
+ *
+ *  "path" [ IN, NULL OKAY ] - optional parameter for target
+ *  directory. if NULL, interpreted to mean "."
+ */
+static
+rc_t KSysDirList_v1 ( const KSysDir_v1 * self, KNamelist **listp,
+    bool ( * f ) ( const KDirectory_v1 *dir, const char *name, void *data ), void *data,
+    const char *path, va_list args )
+{
+    KSysDir_v1 full;
+    rc_t rc = KSysDirMakePath_v1 ( self, rcListing, true,
+        full . path, sizeof full . path, path, args );
+    if ( rc == 0 )
+    {
+        rc = KSysDirInit_v1 ( & full, rcListing, self -> root,
+            NULL, strlen ( full . path ), 0, 0 );
+        if ( rc == 0 )
+        {
+            KSysDirListing *list = malloc ( sizeof * list );
+            if ( list == NULL )
+                rc = RC ( rcFS, rcDirectory, rcListing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KSysDirListingInit ( list,
+                    full . path, & full . dad, f, data );
+                if ( rc != 0 )
+                    free ( list );
+                else
+                    * listp = & list -> dad;
+            }
+        }
+    }
+    return rc;
+}
+
+
+/* KSysDirPathType
+ *  returns a KPathType
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+static
+uint32_t KSysDirFullPathType_v1 ( const char *path )
+{
+    struct stat st;
+    int type, alias;
+
+    if ( lstat ( path, & st ) != 0 ) switch ( errno )
+    {
+    case ENOENT:
+        return kptNotFound;
+    default:
+        return kptBadPath;
+    }
+
+    alias = 0;
+
+    if ( S_ISLNK ( st . st_mode ) )
+    {
+        alias = kptAlias;
+
+        if ( stat ( path, & st ) != 0 ) switch ( errno )
+        {
+        case ENOENT:
+            return kptNotFound | alias;
+        default:
+            return kptBadPath | alias;
+        } 
+    }
+
+    /* not a bad assumption */
+    type = kptFile;
+
+    /* overrides */
+    if ( S_ISDIR ( st . st_mode ) )
+        type = kptDir;
+    else if ( S_ISCHR ( st . st_mode ) )
+        type = kptCharDev;
+    else if ( S_ISBLK ( st . st_mode ) )
+        type = kptBlockDev;
+    else if ( S_ISFIFO ( st . st_mode ) )
+        type = kptFIFO;
+    else if ( S_ISSOCK ( st . st_mode ) )
+        type = kptFIFO;
+
+    /* add in alias bit */
+    return type | alias;
+}
+
+static
+uint32_t KSysDirPathType_v1 ( const KSysDir_v1 * self, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcAccessing, false, full, sizeof full, path, args );
+    if ( rc == 0 )
+        return KSysDirFullPathType_v1 ( full );
+    return kptBadPath;
+}
+
+/* KSysDirVisit
+ *  visit each path under designated directory,
+ *  recursively if so indicated
+ *
+ *  "recur" [ IN ] - if non-zero, recursively visit sub-directories
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to execute
+ *  on each path. receives a base directory and relative path
+ *  for each entry, where each path is also given the leaf name
+ *  for convenience. if "f" returns non-zero, the iteration will
+ *  terminate and that value will be returned. NB - "dir" will not
+ *  be the same as "self".
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+typedef struct KSysDirVisitData KSysDirVisitData;
+struct KSysDirVisitData
+{
+    rc_t ( * f ) ( KDirectory_v1*, uint32_t, const char*, void* );
+    void *data;
+    KSysDir_v1 dir;
+    bool recur;
+};
+
+static
+rc_t KSysDirVisitDir ( KSysDirVisitData *pb )
+{
+    /* get a directory listing */
+    KSysDirEnum listing;
+    rc_t rc = KSysDirEnumInit ( & listing, pb -> dir . path );
+    if ( rc == 0 )
+    {
+        const char *name;
+        uint32_t size = pb -> dir . size;
+
+        /* complete directory path */
+        pb -> dir . path [ size ] = '/';
+        if ( ++ size >= sizeof pb -> dir . path )
+            rc = RC ( rcFS, rcDirectory, rcVisiting, rcPath, rcExcessive );
+        else for ( pb -> dir . size = size, name = KSysDirEnumNext ( & listing );
+                   name != NULL; name = KSysDirEnumNext ( & listing ) )
+        {
+            uint32_t type, len = strlen ( name );
+            if ( size + len >= sizeof pb -> dir . path )
+            {
+                rc = RC ( rcFS, rcDirectory, rcVisiting, rcPath, rcExcessive );
+                break;
+            }
+            strcpy ( & pb -> dir . path [ size ], name );
+
+            type = KSysDirFullPathType_v1 ( pb -> dir . path );
+            if ( type == kptBadPath )
+            {
+                rc = RC ( rcFS, rcDirectory, rcVisiting, rcPath, rcInvalid );
+                break;
+            }
+
+            rc = ( * pb -> f ) ( & pb -> dir . dad, type, name, pb -> data );
+            if ( rc != 0 )
+                break;
+
+            if ( pb -> recur && ( type & ( kptAlias - 1 ) ) == kptDir )
+            {
+                pb -> dir . size += len;
+                rc = KSysDirVisitDir ( pb );
+                pb -> dir . size = size;
+                if ( rc != 0 )
+                    break;
+            }
+        }
+
+        
+        KSysDirEnumWhack ( & listing );
+    }
+    return rc;
+}
+
+static
+rc_t KSysDirVisit_v1 ( const KSysDir_v1 * self, bool recur,
+    rc_t ( * f ) ( KDirectory_v1 *dir, uint32_t type, const char *name, void *data ), void *data,
+    const char *path, va_list args )
+{
+    KSysDirVisitData pb;
+    rc_t rc = KSysDirMakePath_v1 ( self, rcVisiting, true,
+        pb . dir . path, sizeof pb . dir . path, path, args );
+    if ( rc == 0 )
+    {
+        uint32_t path_size;
+
+        switch ( KSysDirFullPathType_v1 ( pb . dir . path ) & ( kptAlias - 1 ) )
+        {
+        case kptNotFound:
+            return RC ( rcFS, rcDirectory, rcVisiting, rcPath, rcNotFound );
+        case kptBadPath:
+            return RC ( rcFS, rcDirectory, rcVisiting, rcPath, rcInvalid );
+        case kptDir:
+            break;
+        default:
+            return RC ( rcFS, rcDirectory, rcVisiting, rcPath, rcIncorrect );
+        }
+
+        path_size = strlen ( pb . dir . path );
+        while ( path_size > 1 && path_size > self -> root && pb . dir . path [ path_size - 1 ] == '/' )
+            -- path_size;
+
+        rc = KSysDirInit_v1 ( & pb . dir, rcVisiting, self -> root,
+            NULL, path_size, self -> dad . read_only ? 0 : 1, 0 );
+        if ( rc == 0 )
+        {
+            pb . f = f;
+            pb . data = data;
+            pb . recur = recur;
+            pb . dir . path [ -- pb . dir . size ] = 0;
+            rc = KSysDirVisitDir ( & pb );
+        }
+    }
+    return rc;
+}
+
+/* KSysDirRelativePath
+ *  makes "path" relative to "root"
+ *  both "root" and "path" MUST be absolute
+ *  both "root" and "path" MUST be canonical, i.e. have no "./" or "../" sequences
+ */
+static
+rc_t KSysDirRelativePath_v1 ( const KSysDir_v1 * self, enum RCContext ctx,
+    const char *root, char *path, size_t path_max )
+{
+    int backup;
+    size_t bsize, psize;
+
+    const char *r = root + self -> root;
+    const char *p = path + self -> root;
+
+    assert ( r != NULL && r [ 0 ] == '/' );
+    assert ( p != NULL && p [ 0 ] == '/' );
+
+    for ( ; * r == * p; ++ r, ++ p )
+    {
+        /* disallow identical paths */
+        if ( * r == 0 )
+            return RC ( rcFS, rcDirectory, ctx, rcPath, rcInvalid );
+    }
+
+    /* paths are identical up to "r","p"
+       if "r" is within a leaf name, then no backup is needed
+       by counting every '/' from "r" to end, obtain backup count */
+    for ( backup = 0; * r != 0; ++ r )
+    {
+        if ( * r == '/' )
+            ++ backup;
+    }
+
+    /* the number of bytes to be inserted */
+    bsize = backup * 3;
+
+    /* align "p" to last directory separator */
+    while ( p [ -1 ] != '/' ) -- p;
+
+    /* the size of the remaining relative path */
+    psize = strlen ( p );
+
+    /* open up space if needed */
+    if ( p - path < bsize )
+    {
+        /* prevent overflow */
+        if ( bsize + psize >= path_max )
+            return RC ( rcFS, rcDirectory, ctx, rcPath, rcExcessive );
+        memmove ( path + bsize, p, psize + 1 /* 1 for '\0'*/ );
+    }
+
+    /* insert backup sequences */
+    for ( bsize = 0; backup > 0; bsize += 3, -- backup )
+        memmove ( & path [ bsize ], "../", 3 );
+
+    /* close gap */
+    if ( p - path > bsize )
+        memmove ( & path [ bsize ], p, strlen ( p ) + 1 );
+
+    return 0;
+}
+
+/* KSysDirResolvePath
+ *  resolves path to an absolute or directory-relative path
+ *
+ *  "absolute" [ IN ] - if non-zero, always give a path starting
+ *  with '/'. NB - if the directory is chroot'd, the absolute path
+ *  will still be relative to directory root.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *  the resolved path will be directory relative
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target path. NB - need not exist.
+ */
+static
+rc_t KSysDirResolvePath_v1 ( const KSysDir_v1 * self, bool absolute,
+    char *resolved, size_t rsize, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcResolving, true, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        uint32_t path_size = strlen ( full );
+
+        if ( absolute )
+        {
+            /* test buffer capacity */
+            if ( path_size - self -> root >= rsize )
+                return RC ( rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient );
+
+            /* ready to go */
+            strcpy ( resolved, & full [ self -> root ] );
+/*             assert ( resolved [ 0 ] == '/' ); */
+        }
+        else
+        {
+            rc = KSysDirRelativePath_v1 ( self, rcResolving, self -> path, full, sizeof full /*path_size*/ );
+            if ( rc == 0 )
+            {
+                path_size = strlen ( full );
+                if ( path_size >= rsize )
+                    return RC ( rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient );
+                strcpy ( resolved, full );
+            }
+        }
+    }
+    return rc;
+}
+
+/* KSysDirResolveAlias
+ *  resolves an alias path to its immediate target
+ *  NB - the resolved path may be yet another alias
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting an object presumed to be an alias.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ */
+static
+rc_t KSysDirResolveAlias_v1 ( const KSysDir_v1 * self, bool absolute,
+    char *resolved, size_t rsize, const char *alias, va_list args )
+{
+    KSysDir_v1 full;
+    rc_t rc = KSysDirMakePath_v1 ( self, rcResolving, true,
+        full . path, sizeof full . path, alias, args );
+    if ( rc == 0 )
+    {
+        char link [ PATH_MAX ];
+        int len = readlink ( full . path, link, sizeof link );
+        if ( len < 0 ) switch ( errno )
+        {
+        case ENOENT:
+            return RC ( rcFS, rcDirectory, rcResolving, rcPath, rcNotFound );
+        case ENOTDIR:
+            return RC ( rcFS, rcDirectory, rcResolving, rcPath, rcIncorrect );
+        case ENAMETOOLONG:
+        case ELOOP:
+            return RC ( rcFS, rcDirectory, rcResolving, rcPath, rcInvalid );
+        case EACCES:
+            return RC ( rcFS, rcDirectory, rcResolving, rcDirectory, rcUnauthorized );
+        case ENOMEM:
+            return RC ( rcFS, rcDirectory, rcResolving, rcMemory, rcExhausted );
+        case EIO:
+            return RC ( rcFS, rcDirectory, rcResolving, rcTransfer, rcUnknown );
+        default:
+            return RC ( rcFS, rcDirectory, rcResolving, rcNoObj, rcUnknown );
+        }
+
+        if ( ( size_t ) len == sizeof link )
+            return RC ( rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient );
+        link [ len ] = 0;
+
+        if ( link [ 0 ] == '/' )
+        {
+            full . size = 1;
+            strcpy ( full . path, link );
+        }
+        else
+        {
+            char *f = strrchr ( full . path, '/' );
+            assert ( f != NULL );
+            full . size = ++f - full . path;
+            if ( full . size + len >= sizeof full . path )
+                return RC ( rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient );
+            strcpy ( f, link );
+        }
+
+        full . root = 0;
+
+/*         rc = KSysDirCanonPath ( & full, rcResolving, full . path, len ); */
+        rc = KSysDirCanonPath_v1 ( & full, rcResolving, full . path, full . size + len);
+        if ( rc == 0 )
+        {
+            /* the path in full is an absolute path
+               if outside of chroot, it's a bad link */
+            if ( memcmp ( full . path, self -> path, self -> root + 1 ) != 0 )
+                return RC ( rcFS, rcDirectory, rcResolving, rcLink, rcInvalid );
+
+            /* this is the absolute path length */
+            len = strlen ( & full . path [ self -> root ] );
+
+            /* if not requesting absolute, make self relative */
+            if ( ! absolute )
+            {
+                rc = KSysDirRelativePath_v1 ( self, rcResolving, self -> path, full . path, sizeof full.path/*len*/ );
+                if ( rc != 0 )
+                    return rc;
+                len = strlen ( full . path );
+            }
+
+            if ( ( size_t ) len >= rsize )
+                return RC ( rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient );
+
+            strcpy ( resolved, & full . path [ self -> root ] );
+        }
+    }
+    return rc;
+}
+
+
+/* KSysDirRename
+ *  rename an object accessible from directory, replacing
+ *  any existing target object of the same type
+ *
+ *  "from" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ *
+ *  "to" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ */
+static rc_t KSysDirVAccess ( const KSysDir_v1 * self, uint32_t *access, const char *path,
+                             va_list args );
+static rc_t KSysDirSetAccess_v1 ( KSysDir_v1 * self, bool recur, uint32_t access, uint32_t mask,
+                               const char *path, va_list args );
+
+static
+rc_t KSysDirRename_v1 ( KSysDir_v1 * self, bool force, const char *from, const char *to )
+{
+    char ffrom [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcRenaming, false, ffrom, sizeof ffrom, from, NULL );
+    if ( rc == 0 )
+    {
+        char fto [ PATH_MAX ];
+        rc = KSysDirMakePath_v1 ( self, rcRenaming, false, fto, sizeof fto, to, NULL );
+        if ( rc == 0 )
+        {
+            if ( rename ( ffrom, fto ) != 0 ) switch ( errno )
+            {
+            case EISDIR:
+            case EXDEV:
+                rc = RC ( rcFS, rcDirectory, rcRenaming, rcPath, rcIncorrect );
+                break;
+            case ENOTEMPTY:
+            case EEXIST:
+            case EBUSY:
+                rc = RC ( rcFS, rcDirectory, rcRenaming, rcPath, rcBusy );
+                break;
+            case EINVAL:
+            case ENOTDIR:
+            case ENAMETOOLONG:
+            case ELOOP:
+                rc = RC ( rcFS, rcDirectory, rcRenaming, rcPath, rcInvalid );
+                break;
+            case EACCES:
+            case EPERM:
+            case EROFS:
+                rc = RC ( rcFS, rcDirectory, rcRenaming, rcDirectory, rcUnauthorized );
+                break;
+            case ENOSPC:
+                rc= RC ( rcFS, rcDirectory, rcRenaming, rcStorage, rcExhausted );
+                break;
+            case ENOMEM:
+                rc = RC ( rcFS, rcDirectory, rcRenaming, rcMemory, rcExhausted );
+                break;
+            case ENOENT:
+                rc = RC ( rcFS, rcDirectory, rcRenaming, rcPath, rcNotFound );
+                break;
+            default:
+                rc = RC ( rcFS, rcDirectory, rcRenaming, rcNoObj, rcUnknown );
+                break;
+            }
+        }
+        if (force)
+        {
+            if (GetRCState(rc) == rcUnauthorized)
+            {
+                uint32_t faccess = 0;
+                uint32_t taccess = 0;
+                bool fchanged = false;
+                bool tchanged = false;
+
+                rc = KSysDirVAccess (self, &taccess, to, NULL);
+                if (rc == 0)
+                {
+                    rc = KSysDirSetAccess_v1 (self, false, 0222, 0222, to, NULL);
+                    tchanged = true;
+                }
+                else if(GetRCState(rc) ==  rcNotFound)
+                {
+                    rc = 0;
+                }
+
+                if (rc == 0)
+                {
+                    rc = KSysDirVAccess (self, &faccess, from, NULL);
+                    if (rc == 0)
+                    {
+                        rc = KSysDirSetAccess_v1 (self, false, 0222, 0222, from, NULL);
+                        if (rc == 0)
+                        {
+                            fchanged = true;
+                            rc = KSysDirRename_v1 (self, false, from, to);
+                        }
+                    }
+                    if (rc == 0)
+                    {
+                        /* set access on the new name to the access from the old name */
+                        KSysDirSetAccess_v1 (self, false, faccess, 0222, to, NULL);
+                    }
+                    else
+                    {
+                        /* since something falied, try to restore changed access bits */
+                        if (fchanged)
+                            KSysDirSetAccess_v1 (self, false, faccess, 0222, from, NULL);
+                        if (tchanged)
+                            KSysDirSetAccess_v1 (self, false, taccess, 0222, to, NULL);
+                    }
+                        
+                }
+
+            }
+        }
+    }
+    return rc;
+}
+
+
+/* KSysDirClearDir
+ *  remove all directory contents
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "force" [ IN ] - if non-zero and directory entry is a
+ *  sub-directory, remove recursively
+ */
+static
+rc_t KSysDirRemoveEntry_v1 ( char *path, size_t path_max, bool force );
+
+static
+rc_t KSysDirEmptyDir_v1 ( char *path, size_t path_max, bool force )
+{
+    KSysDirEnum list;
+    rc_t rc = KSysDirEnumInit ( & list, path );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcFS, rcDirectory, rcClearing );
+    else
+    {
+        size_t path_size = strlen ( path );
+        path [ path_size ] = '/';
+        if ( ++ path_size == path_max )
+            rc = RC ( rcFS, rcDirectory, rcClearing, rcPath, rcExcessive );
+        else
+        {
+            const char *leaf;
+            while ( ( leaf = KSysDirEnumNext ( & list ) ) != NULL )
+            {
+                size_t leaf_size = strlen ( leaf );
+                if ( path_size + leaf_size >= path_max )
+                {
+                    rc = RC ( rcFS, rcDirectory, rcClearing, rcPath, rcExcessive );
+                    break;
+                }
+
+                strcpy ( & path [ path_size ], leaf );
+                rc = KSysDirRemoveEntry_v1 ( path, path_max, force );
+                if ( rc != 0 )
+                {
+                    rc = ResetRCContext ( rc, rcFS, rcDirectory, rcClearing );
+                    break;
+                }
+            }
+
+            path [ path_size - 1 ] = 0;
+        }
+
+        KSysDirEnumWhack ( & list );
+    }
+    return rc;
+}
+
+static
+rc_t KSysDirClearDir_v1 ( KSysDir_v1 * self, bool force, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcClearing, false, full, sizeof full, path, args );
+    if ( rc == 0 )
+        rc = KSysDirEmptyDir_v1 ( full, sizeof full, force );
+    return rc;
+}
+
+/* KSysDirRemove
+ *  remove an accessible object from its directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "force" [ IN ] - if non-zero and target is a directory,
+ *  remove recursively
+ */
+static
+rc_t KSysDirRemoveEntry_v1 ( char *path, size_t path_max, bool force )
+{
+    if ( unlink ( path ) != 0 )
+    {
+        switch ( errno )
+        {
+        case ENOENT:
+            return 0;
+        case EPERM:
+        case EISDIR:
+            break;
+        case EACCES:
+        case EROFS:
+            return RC ( rcFS, rcDirectory, rcRemoving, rcDirectory, rcUnauthorized );
+        case EBUSY:
+            return RC ( rcFS, rcDirectory, rcRemoving, rcPath, rcBusy );
+        case ENAMETOOLONG:
+        case ENOTDIR:
+        case ELOOP:
+            return RC ( rcFS, rcDirectory, rcRemoving, rcPath, rcInvalid );
+        case ENOMEM:
+            return RC ( rcFS, rcDirectory, rcRemoving, rcMemory, rcExhausted );
+        case EIO:
+            return RC ( rcFS, rcDirectory, rcRemoving, rcTransfer, rcUnknown );
+        default:
+            return RC ( rcFS, rcDirectory, rcRemoving, rcNoObj, rcUnknown );
+        }
+
+        while ( rmdir ( path ) != 0 ) switch ( errno )
+        {
+        case EEXIST:
+        case ENOTEMPTY:
+            if ( force )
+            {
+                rc_t rc = KSysDirEmptyDir_v1 ( path, path_max, force );
+                if ( rc != 0 )
+                    return rc;
+                force = false;
+                break;
+            }
+        case EBUSY:
+            return RC ( rcFS, rcDirectory, rcRemoving, rcPath, rcBusy );
+        case EPERM:
+        case EACCES:
+        case EROFS:
+            return RC ( rcFS, rcDirectory, rcRemoving, rcDirectory, rcUnauthorized );
+        case ENOMEM:
+            return RC ( rcFS, rcDirectory, rcRemoving, rcMemory, rcExhausted );
+        default:
+            return RC ( rcFS, rcDirectory, rcRemoving, rcNoObj, rcUnknown );
+        }
+    }
+
+    return 0;
+}
+
+static
+rc_t KSysDirRemove_v1 ( KSysDir_v1 * self, bool force, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcRemoving, false, full, sizeof full, path, args );
+    if ( rc == 0 )
+        rc = KSysDirRemoveEntry_v1 ( full, sizeof full, force );
+    return rc;
+}
+
+/* KSysDirAccess
+ *  get access to object
+ *
+ *  "access" [ OUT ] - return parameter for Unix access mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+static
+rc_t KSysDirVAccess ( const KSysDir_v1 * self,
+    uint32_t *access, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcAccessing, false, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        struct stat st;
+        if ( lstat ( full, & st ) != 0 ) switch ( errno )
+        {
+        case ENOENT:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcNotFound );
+        case ENOTDIR:
+        case ELOOP:
+        case ENAMETOOLONG:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcInvalid );
+        case EACCES:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcDirectory, rcUnauthorized );
+        case ENOMEM:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcMemory, rcExhausted );
+        default:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcNoObj, rcUnknown );
+        }
+
+        * access = st . st_mode & 07777;
+    }
+    return rc;
+}
+
+/* KSysDirSetAccess
+ *  set access to object a la Unix "chmod"
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "access" [ IN ] and "mask" [ IN ] - definition of change
+ *  where "access" contains new bit values and "mask defines
+ *  which bits should be changed.
+ *
+ *  "recur" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ */
+static
+rc_t KSysDirChangeAccess_v1 ( char *path, size_t path_max,
+    uint32_t access, uint32_t mask, bool recur );
+
+static
+rc_t KSysDirChangeDirAccess_v1 ( char *path, size_t path_max,
+    uint32_t access, uint32_t mask )
+{
+    KSysDirEnum list;
+    rc_t rc = KSysDirEnumInit ( & list, path );
+    if ( rc == 0 )
+    {
+        bool eperm = false;
+        size_t path_size = strlen ( path );
+        path [ path_size ] = '/';
+        if ( ++ path_size == path_max )
+            rc = RC ( rcFS, rcDirectory, rcUpdating, rcBuffer, rcInsufficient );
+        else
+        {
+            const char *leaf;
+            while ( ( leaf = KSysDirEnumNext ( & list ) ) != NULL )
+            {
+                size_t leaf_size = strlen ( leaf );
+                if ( path_size + leaf_size >= path_max )
+                {
+                    rc = RC ( rcFS, rcDirectory, rcUpdating, rcBuffer, rcInsufficient );
+                    break;
+                }
+
+                strcpy ( & path [ path_size ], leaf );
+                rc = KSysDirChangeAccess_v1 ( path, path_max, access, mask, 1 );
+                if ( rc != 0 )
+                {
+                    if ( GetRCState ( rc ) != rcUnauthorized )
+                        break;
+                    eperm = true;
+                    rc = 0;
+                }
+            }
+
+            path [ path_size - 1 ] = 0;
+        }
+
+        KSysDirEnumWhack ( & list );
+
+        if ( rc == 0 && eperm )
+            rc = RC ( rcFS, rcDirectory, rcUpdating, rcDirectory, rcUnauthorized );
+    }
+    return rc;
+}
+
+static
+rc_t KSysDirChangeEntryAccess_v1 ( char *path, size_t path_max,
+    uint32_t access, uint32_t mask, uint32_t st_mode )
+{
+    /* keep old bits */
+    access &= mask;
+    access |= st_mode & ~ mask;
+
+    if ( chmod ( path, access & 07777 ) != 0 ) switch ( errno )
+    {
+    case EPERM:
+    case EACCES:
+    case EROFS:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcDirectory, rcUnauthorized );
+    case ENOTDIR:
+    case ELOOP:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcInvalid );
+    case ENAMETOOLONG:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcExcessive );
+    case ENOENT:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcNotFound );
+    case ENOMEM:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcMemory, rcExhausted );
+    default:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+static
+rc_t KSysDirChangeAccess_v1 ( char *path, size_t path_max,
+    uint32_t access, uint32_t mask, bool recur )
+{
+    struct stat st;
+    if ( lstat ( path, & st ) != 0 ) switch ( errno )
+    {
+    case ENOENT:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcNotFound );
+    case ENOTDIR:
+    case ELOOP:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcInvalid );
+    case ENAMETOOLONG:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcExcessive );
+    case EACCES:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcDirectory, rcUnauthorized );
+    case ENOMEM:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcMemory, rcExhausted );
+    default:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcNoObj, rcUnknown );
+    }
+
+    if ( recur && S_ISDIR ( st . st_mode ) )
+    {
+        rc_t rc;
+        uint32_t enable = access & mask;
+        if ( enable != 0 )
+        {
+            rc = KSysDirChangeEntryAccess_v1 ( path, path_max,
+                access, enable, st . st_mode );
+            if ( rc != 0 )
+                return rc;
+        }
+
+       rc = KSysDirChangeDirAccess_v1 ( path, path_max, access, mask );
+        if ( rc == 0 )
+        {
+            uint32_t disable = ~ access & mask;
+            if ( disable != 0 )
+            {
+                rc = KSysDirChangeEntryAccess_v1 ( path, path_max,
+                    access, disable, st . st_mode | enable );
+            }
+        }
+        return rc;
+    }
+
+    return KSysDirChangeEntryAccess_v1 ( path, path_max,
+         access, mask, st . st_mode );
+}
+
+static
+rc_t KSysDirSetAccess_v1 ( KSysDir_v1 * self, bool recur,
+    uint32_t access, uint32_t mask, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcUpdating, false, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        if ( mask == 0 )
+            mask = 07777;
+
+        rc = KSysDirChangeAccess_v1 ( full, sizeof full,
+            access, mask & 07777, recur );
+    }
+    return rc;
+}
+
+/* KSysDirDate
+ *  get access to object
+ *
+ *  "date" [ OUT ] - return parameter for Unix access mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+static
+rc_t KSysDirVDate ( const KSysDir_v1 * self,
+    KTime_t * date, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcAccessing, false, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        struct stat st;
+        if ( lstat ( full, & st ) != 0 ) switch ( errno )
+        {
+        case ENOENT:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcNotFound );
+        case ENOTDIR:
+        case ELOOP:
+        case ENAMETOOLONG:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcInvalid );
+        case EACCES:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcDirectory, rcUnauthorized );
+        case ENOMEM:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcMemory, rcExhausted );
+        default:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcNoObj, rcUnknown );
+        }
+
+        * date = ( KTime_t ) st . st_mtime;
+    }
+    return rc;
+}
+
+/* KSysDirSetDate
+ *  set date to object a la Unix "touch"
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "date" [ IN ]  - new mtime
+ *
+ *  "recur" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ */
+static
+rc_t KSysDirChangeDate_v1 ( char *path, size_t path_max,
+			 KTime_t date, bool recur );
+
+static
+rc_t KSysDirChangeDirDate_v1 ( char *path, size_t path_max,
+			      KTime_t date )
+{
+    KSysDirEnum list;
+    rc_t rc = KSysDirEnumInit ( & list, path );
+    if ( rc == 0 )
+    {
+        bool eperm = false;
+        size_t path_size = strlen ( path );
+        path [ path_size ] = '/';
+        if ( ++ path_size == path_max )
+            rc = RC ( rcFS, rcDirectory, rcUpdating, rcBuffer, rcInsufficient );
+        else
+        {
+            const char *leaf;
+            while ( ( leaf = KSysDirEnumNext ( & list ) ) != NULL )
+            {
+                size_t leaf_size = strlen ( leaf );
+                if ( path_size + leaf_size >= path_max )
+                {
+                    rc = RC ( rcFS, rcDirectory, rcUpdating, rcBuffer, rcInsufficient );
+                    break;
+                }
+
+                strcpy ( & path [ path_size ], leaf );
+                rc = KSysDirChangeDate_v1 ( path, path_max, date, 1 );
+                if ( rc != 0 )
+                {
+                    if ( GetRCState ( rc ) != rcUnauthorized )
+                        break;
+                    eperm = true;
+                    rc = 0;
+                }
+            }
+
+            path [ path_size - 1 ] = 0;
+        }
+
+        KSysDirEnumWhack ( & list );
+
+        if ( rc == 0 && eperm )
+            rc = RC ( rcFS, rcDirectory, rcUpdating, rcDirectory, rcUnauthorized );
+    }
+    return rc;
+}
+
+static
+rc_t KSysDirChangeEntryDate_v1 ( char *path, size_t path_max,
+			      struct utimbuf * tb)
+{
+    if ( utime ( path, tb ) != 0 ) switch ( errno )
+    {
+    case EPERM:
+    case EACCES:
+    case EROFS:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcDirectory, rcUnauthorized );
+    case ENOTDIR:
+    case ELOOP:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcInvalid );
+    case ENAMETOOLONG:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcExcessive );
+    case ENOENT:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcNotFound );
+    case ENOMEM:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcMemory, rcExhausted );
+    default:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+static
+rc_t KSysDirChangeDate_v1 ( char *path, size_t path_max,
+			 KTime_t date, bool recur )
+{
+    struct stat st;
+    struct utimbuf u;
+
+    if ( lstat ( path, & st ) != 0 ) switch ( errno )
+    {
+    case ENOENT:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcNotFound );
+    case ENOTDIR:
+    case ELOOP:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcInvalid );
+    case ENAMETOOLONG:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcExcessive );
+    case EACCES:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcDirectory, rcUnauthorized );
+    case ENOMEM:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcMemory, rcExhausted );
+    default:
+        return RC ( rcFS, rcDirectory, rcUpdating, rcNoObj, rcUnknown );
+    }
+
+    u . actime = u . modtime = date;
+
+    if ( recur && S_ISDIR ( st . st_mode ) )
+    {
+        rc_t rc = KSysDirChangeEntryDate_v1 ( path, path_max, & u );
+        if ( rc != 0 )
+            return rc;
+
+        rc = KSysDirChangeDirDate_v1 ( path, path_max, date );
+        if ( rc == 0 )
+            rc = KSysDirChangeEntryDate_v1 ( path, path_max, & u  );
+
+        return rc;
+    }
+
+    return  KSysDirChangeEntryDate_v1 ( path, path_max, & u );
+}
+
+static
+rc_t KSysDirVSetDate ( KSysDir_v1 *self, bool recur,
+	KTime_t date, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcUpdating, false, full, sizeof full, path, args );
+    if ( rc == 0 )
+        rc = KSysDirChangeDate_v1 ( full, sizeof full, date, recur );
+
+    return rc;
+}
+
+static
+KSysDir_v1 *KSysDirGetSysdir_v1 ( const KSysDir_v1 *cself )
+{
+    return ( KSysDir_v1 * ) cself;
+}
+
+/* KSysDirCreateParents
+ *  creates missing parent directories
+ */
+static
+rc_t make_dir_v1 ( const char *path, uint32_t access )
+{
+    if ( mkdir ( path, ( int ) access ) != 0 ) switch ( errno )
+    {
+    case ENOENT:
+        return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcNotFound );
+    case EEXIST:
+        return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcExists );
+    case EPERM:
+    case EACCES:
+    case EROFS:
+        return RC ( rcFS, rcDirectory, rcCreating, rcDirectory, rcUnauthorized );
+    case ENOTDIR:
+    case ELOOP:
+        return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcInvalid );
+    case ENOMEM:
+        return RC ( rcFS, rcDirectory, rcCreating, rcMemory, rcExhausted );
+    case ENOSPC:
+        return RC ( rcFS, rcDirectory, rcCreating, rcStorage, rcExhausted );
+    default:
+        return RC ( rcFS, rcDirectory, rcCreating, rcNoObj, rcUnknown );
+    }
+    return 0;
+}
+
+static
+rc_t KSysDirCreateParents_v1 ( const KSysDir_v1 * self,
+    char *path, uint32_t access, bool strip )
+{
+    rc_t rc;
+    char *p, *par = path + self -> root + 1;
+    size_t size = strlen ( par );
+
+    if ( ! strip )
+        p = par + size;
+    else
+    {
+        p = strrchr ( par, '/' );
+        if ( p == NULL )
+            return 0;
+        size = p - par;
+    }
+
+    while ( 1 )
+    {
+        /* crop string */
+        p [ 0 ] = 0;
+
+        /* try to create directory */
+        rc = make_dir_v1 ( path, access );
+        if ( GetRCState ( rc ) != rcNotFound )
+            break;
+
+        /* back up some more */
+        p = strrchr ( par, '/' );
+        if ( p == NULL )
+        {
+            p = par + strlen ( par );
+            break;
+        }
+    }
+
+    par += size;
+    assert ( p != NULL );
+
+    /* create directories from here */
+    if ( rc == 0 ) while ( p < par )
+    {
+        p [ 0 ] = '/';
+        rc = make_dir_v1 ( path, access );
+        if ( rc != 0 || ++ p >= par )
+            break;
+        p += strlen ( p );
+    }
+
+    /* fix up remaining path */
+    while ( p < par )
+    {
+        p [ 0 ] = '/';
+        if ( ++ p >= par )
+            break;
+        p += strlen ( p );
+    }
+
+    /* repair stripped path */
+    if ( strip )
+        par [ 0 ] = '/';
+
+    return rc;
+}
+
+/* CreateAlias
+ *  creates a path alias according to create mode
+ *  such that "alias" => "targ"
+ *
+ *  "access" [ IN ] - standard Unix directory access mode
+ *  used when "mode" has kcmParents set and alias path does
+ *  not exist.
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "targ" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object, i.e. the object which
+ *  is designated by symlink "alias".
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target alias, i.e. the symlink that
+ *  designates a target "targ".
+ */
+static
+rc_t KSysDirCreateAlias_v1 ( KSysDir_v1 * self,
+    uint32_t access, KCreateMode mode,
+    const char *targ, const char *alias )
+{
+    /* create full path to symlink */
+    char falias [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcCreating, true, falias, sizeof falias, alias, NULL );
+    if ( rc == 0 )
+    {
+        /* the full path to target RELATIVE TO self */
+        char ftarg [ PATH_MAX ];
+        rc = KSysDirMakePath_v1 ( self, rcCreating, true, ftarg, sizeof ftarg, targ, NULL );
+        if ( rc == 0 )
+        {
+            /* if "targ" is relative or "self" is chroot'd,
+               "ftarg" must be made relative */
+            if ( targ [ 0 ] != '/' || self -> root != 0 )
+            {
+                /* take path to alias as root.
+                   generate a path RELATIVE TO alias */
+                rc = KSysDirRelativePath_v1 ( self, rcCreating, falias,
+                    ftarg, sizeof ftarg /*strlen ( ftarg )*/ );
+                if ( rc != 0 )
+                    return rc;
+            }
+
+            if ( symlink ( ftarg, falias ) == 0 )
+                return 0;
+
+            switch ( errno )
+            {
+            case EEXIST:
+                /* alias already exists. unless mode is
+                   create-only, force creation by removing old */
+                if ( ( mode & kcmValueMask ) != kcmCreate )
+                {
+                    /* refuse to drop if not an alias */
+                    if ( ( KSysDirFullPathType_v1 ( falias ) & kptAlias ) == 0 )
+                        return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcIncorrect );
+
+                    /* drop existing alias */
+                    rc = KSysDirRemoveEntry_v1 ( falias, sizeof falias, false );
+                    if ( rc == 0 )
+                        break;
+                }
+                return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcExists );
+
+            case ENOENT:
+                /* a part of the alias path doesn't exist */
+                if ( ( mode & kcmParents ) != 0 )
+                {
+                    KSysDirCreateParents_v1 ( self, falias, access, true );
+                    break;
+                }
+                return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcNotFound );
+
+            case EPERM:
+            case EACCES:
+            case EROFS:
+                return RC ( rcFS, rcDirectory, rcCreating, rcDirectory, rcUnauthorized );
+            case ENAMETOOLONG:
+                return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcExcessive );
+            case ENOTDIR:
+            case ELOOP:
+                return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcInvalid );
+            case ENOMEM:
+                return RC ( rcFS, rcDirectory, rcCreating, rcMemory, rcExhausted );
+            case ENOSPC:
+                return RC ( rcFS, rcDirectory, rcCreating, rcStorage, rcExhausted );
+            case EIO:
+                return RC ( rcFS, rcDirectory, rcCreating, rcTransfer, rcUnknown );
+            default:
+                return RC ( rcFS, rcDirectory, rcCreating, rcNoObj, rcUnknown );
+            }
+
+            /* try again either with existing guy removed
+               or missing directories created */
+            if ( symlink ( ftarg, falias ) != 0 ) switch ( errno )
+            {
+            case EEXIST:
+                return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcExists );
+            case ENOENT:
+                return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcNotFound );
+            default:
+                return RC ( rcFS, rcDirectory, rcCreating, rcNoObj, rcUnknown );
+            }
+
+            assert ( rc == 0 );
+        }
+    }
+    return rc;
+}
+
+/* KSysDirOpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+static
+rc_t KSysDirOpenFileRead_v1 ( const KSysDir_v1 * self,
+    const KFile_v1 **f, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcOpening, false, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        int fd = open ( full, O_RDONLY );
+        if ( fd < 0 ) switch ( errno )
+        {
+        case ENOENT:
+            return SILENT_RC ( rcFS, rcDirectory, rcOpening, rcPath, rcNotFound );
+        case EACCES:
+            return RC ( rcFS, rcDirectory, rcOpening, rcDirectory, rcUnauthorized );
+        case EISDIR:
+            return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcIncorrect );
+        case ENOTDIR:
+        case ELOOP:
+            return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcInvalid );
+        case ENAMETOOLONG:
+            return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcExcessive );
+        case ENOMEM:
+            return RC ( rcFS, rcDirectory, rcOpening, rcMemory, rcExhausted );
+        case EMFILE:
+        case ENFILE:
+            return RC ( rcFS, rcDirectory, rcOpening, rcFileDesc, rcExhausted );
+        default:
+            return RC ( rcFS, rcDirectory, rcOpening, rcNoObj, rcUnknown );
+        }
+
+        rc = KSysFileMake_v1 ( ( KSysFile_v1 ** ) f, fd, full, true, false );
+        if ( rc != 0 )
+            close ( fd );
+    }
+    return rc;
+}
+
+/* KSysDirOpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ */
+static
+rc_t KSysDirOpenFileWrite_v1 ( KSysDir_v1 * self,
+    KFile_v1 **f, bool update, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcOpening, false, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        int fd = open ( full, update ? O_RDWR : O_WRONLY );
+        if ( fd < 0 ) switch ( errno )
+        {
+        case ENOENT:
+            return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcNotFound );
+        case EACCES:
+        case EROFS:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcDirectory, rcUnauthorized );
+        case EISDIR:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcIncorrect );
+        case ENOTDIR:
+        case ELOOP:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcInvalid );
+        case ENAMETOOLONG:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcExcessive );
+        case ENOMEM:
+            return RC ( rcFS, rcDirectory, rcOpening, rcMemory, rcExhausted );
+        case EMFILE:
+        case ENFILE:
+            return RC ( rcFS, rcDirectory, rcOpening, rcFileDesc, rcExhausted );
+        default:
+            return RC ( rcFS, rcDirectory, rcOpening, rcNoObj, rcUnknown );
+        }
+
+        rc = KSysFileMake_v1 ( ( KSysFile_v1 ** ) f, fd, full, update, 1 );
+        if ( rc != 0 )
+            close ( fd );
+    }
+    return rc;
+}
+
+/* KSysDirCreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ */
+static
+rc_t KSysDirCreateFile_v1 ( KSysDir_v1 * self, KFile_v1 **f, bool update,
+    uint32_t access, KCreateMode cmode, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcCreating, true, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        int fd, mode = update ? O_RDWR | O_CREAT : O_WRONLY | O_CREAT;
+        switch ( cmode & kcmValueMask )
+        {
+        case kcmOpen:
+            break;
+        case kcmInit:
+            mode |= O_TRUNC;
+            break;
+        case kcmCreate:
+            mode |= O_EXCL;
+            break;
+        case kcmSharedAppend:
+            mode = O_WRONLY | O_APPEND | O_CREAT;
+            break;
+        }
+
+        fd = open ( full, mode, ( int ) access );
+        while ( fd < 0 )
+        {
+            /* a common creation error is missing parents */
+            if ( ( cmode & kcmParents ) != 0 && errno == ENOENT )
+            {
+                /* force directory mode to have execute
+                   wherever there is read or write on file */
+                uint32_t dir_access = access |
+                    ( ( access & 0444 ) >> 2 ) | ( ( access & 0222 ) >> 1 );
+                /* NEW 2/15/2013 - also force read */
+                dir_access |= ( dir_access & 0111 ) << 2;
+                KSysDirCreateParents_v1 ( self, full, dir_access, true );
+
+                /* try again */
+                fd = open ( full, mode, ( int ) access );
+                if ( fd >= 0 )
+                    break;
+            }
+
+            /* when simply "touching" a file, the request for
+               write access may fail if created without write access */
+            if ( ( access & 0200 ) == 0 && errno == EACCES )
+            {
+                mode = O_CREAT;
+                if ( ( access & 0400 ) != 0 )
+                    mode |= O_RDONLY;
+                fd = open ( full, mode, ( int ) access );
+                if ( fd >= 0 )
+                    break;
+            }
+
+            switch ( errno )
+            {
+            case ENOENT:
+                rc = RC ( rcFS, rcDirectory, rcCreating, rcPath, rcNotFound );
+                break;
+            case EEXIST:
+                rc = RC ( rcFS, rcDirectory, rcCreating, rcPath, rcExists );
+                break;
+            case EACCES:
+            case EROFS:
+                rc = RC ( rcFS, rcDirectory, rcCreating, rcDirectory, rcUnauthorized );
+                break;
+            case EISDIR:
+                rc = RC ( rcFS, rcDirectory, rcCreating, rcPath, rcIncorrect );
+                break;
+            case ENOTDIR:
+            case ELOOP:
+                rc = RC ( rcFS, rcDirectory, rcCreating, rcPath, rcInvalid );
+                break;
+            case ENAMETOOLONG:
+                rc = RC ( rcFS, rcDirectory, rcCreating, rcPath, rcExcessive );
+                break;
+            case ENOSPC:
+                rc = RC ( rcFS, rcDirectory, rcCreating, rcStorage, rcExhausted );
+                break;
+            case ENOMEM:
+                rc = RC ( rcFS, rcDirectory, rcCreating, rcMemory, rcExhausted );
+                break;
+            case EMFILE:
+            case ENFILE:
+                rc = RC ( rcFS, rcDirectory, rcCreating, rcFileDesc, rcExhausted );
+                break;
+            default:
+                rc = RC ( rcFS, rcDirectory, rcCreating, rcNoObj, rcUnknown );
+                break;
+            }
+            
+            /* disabled 12/12/2012 : it prints an error message, if vdb tries to open
+               the same reference-object twice via http. The lock-file for the 2nd try
+               does already exist. This is not an error, just a condition. */
+
+            /* PLOGERR (klogErr, (klogErr, rc, "failed to create '$(F)'", "F=%s", full)); */
+            return rc;
+        }
+
+        rc = KSysFileMake_v1 ( ( KSysFile** ) f, fd, full, update, true );
+        if ( rc != 0 )
+            close ( fd );
+    }
+    return rc;
+}
+
+/* KSysDirFileSize
+ *  returns size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t KSysDirFileSize_v1 ( const KSysDir_v1 * self,
+    uint64_t *size, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcAccessing, false, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        struct stat st;
+        if ( stat ( full, & st ) != 0 ) switch ( errno )
+        {
+        case ENOENT:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcNotFound );
+        case ENOTDIR:
+        case ELOOP:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcInvalid );
+        case ENAMETOOLONG:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcExcessive );
+        case EACCES:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcDirectory, rcUnauthorized );
+        case ENOMEM:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcMemory, rcExhausted );
+        default:
+            return RC ( rcFS, rcDirectory, rcAccessing, rcNoObj, rcUnknown );
+        }
+
+        if ( S_ISDIR ( st . st_mode ) )
+            return RC ( rcFS, rcDirectory, rcAccessing, rcPath, rcIncorrect );
+
+        * size = st . st_size;
+    }
+    return rc;
+}
+
+/* KSysDirSetFileSize
+ *  sets size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t KSysDirSetFileSize_v1 ( KSysDir_v1 * self,
+    uint64_t size, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcUpdating, false, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        if ( truncate ( full, size ) != 0 ) switch ( errno )
+        {
+        case ENOENT:
+            return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcNotFound );
+        case EACCES:
+        case EROFS:
+            return RC ( rcFS, rcDirectory, rcUpdating, rcDirectory, rcUnauthorized );
+        case EFBIG:
+            return RC ( rcFS, rcDirectory, rcUpdating, rcParam, rcExcessive );
+        case EINTR:
+            return RC ( rcFS, rcDirectory, rcUpdating, rcFunction, rcIncomplete );
+        case EINVAL:
+            return RC ( rcFS, rcDirectory, rcUpdating, rcParam, rcInvalid );
+        case EIO:
+            return RC ( rcFS, rcDirectory, rcUpdating, rcTransfer, rcUnknown );
+        case EISDIR:
+            return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcIncorrect );
+        case ELOOP:
+            return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcInvalid );
+        case ENAMETOOLONG:
+            return RC ( rcFS, rcDirectory, rcUpdating, rcPath, rcExcessive );
+        default:
+            return RC ( rcFS, rcDirectory, rcUpdating, rcNoObj, rcUnknown );
+        }
+    }
+    return rc;
+}
+
+/* KSysDirOpenDirRead
+ * KSysDirOpenDirUpdate
+ *  opens a sub-directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "chroot" [ IN ] - if non-zero, the new directory becomes
+ *  chroot'd and will interpret paths beginning with '/'
+ *  relative to itself.
+ */
+static
+rc_t KSysDirOpenDirRead_v1 ( const KSysDir_v1 * self,
+     const KDirectory_v1 **subp, bool chroot, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc; 
+
+    rc = KSysDirMakePath_v1 ( self, rcOpening, true, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        int t;
+        KSysDir_v1 *sub;
+
+        size_t path_size = strlen ( full );
+        while ( path_size > 1 && full [ path_size - 1 ] == '/' )
+            full [ -- path_size ] = 0;
+            
+        t = KSysDirFullPathType_v1 ( full ) & ( kptAlias - 1 );
+        if ( t == kptNotFound )
+            return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcNotFound );
+        if ( t != kptDir )
+            return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcIncorrect );
+        
+        sub = KSysDirMake_v1 ( path_size );
+        if ( sub == NULL )
+            rc = RC ( rcFS, rcDirectory, rcOpening, rcMemory, rcExhausted );
+        else
+        {
+            rc = KSysDirInit_v1 ( sub, rcOpening, self -> root, full, path_size, false, chroot );
+            if ( rc == 0 )
+            {
+                * subp = & sub -> dad;
+                return 0;
+            }
+
+            free ( sub );
+        }
+    }
+    return rc;
+}
+
+static
+rc_t KSysDirOpenDirUpdate_v1 ( KSysDir_v1 * self,
+    KDirectory_v1 **subp, bool chroot, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc;
+
+    rc = KSysDirMakePath_v1 ( self, rcOpening, true, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        KSysDir_v1 *sub;
+
+        size_t path_size = strlen ( full );
+        while ( path_size > 1 && full [ path_size - 1 ] == '/' )
+            full [ -- path_size ] = 0;
+
+        switch ( KSysDirFullPathType_v1 ( full ) )
+        {
+        case kptNotFound:
+            return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcNotFound );
+        case kptBadPath:
+            return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcInvalid );
+        case kptDir:
+        case kptDir | kptAlias:
+            break;
+        default:
+            return RC ( rcFS, rcDirectory, rcOpening, rcPath, rcIncorrect );
+        }
+
+        sub = KSysDirMake_v1 ( path_size );
+        if ( sub == NULL )
+            rc = RC ( rcFS, rcDirectory, rcOpening, rcMemory, rcExhausted );
+        else
+        {
+            rc = KSysDirInit_v1 ( sub, rcOpening, self -> root, full, path_size, true, chroot );
+            if ( rc == 0 )
+            {
+                * subp = & sub -> dad;
+                return 0;
+            }
+
+            free ( sub );
+        }
+    }
+    return rc;
+}
+
+/* KSysDirCreateDir
+ *  create a sub-directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "access" [ IN ] - standard Unix directory permissions
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ */
+static
+rc_t KSysDirCreateDir_v1 ( KSysDir_v1 * self,
+    uint32_t access, KCreateMode mode, const char *path, va_list args )
+{
+    char full [ PATH_MAX ];
+    rc_t rc = KSysDirMakePath_v1 ( self, rcCreating, true, full, sizeof full, path, args );
+    if ( rc == 0 )
+    {
+        if ( ( mode & kcmValueMask ) == kcmCreate )
+        {
+            switch ( KSysDirFullPathType_v1 ( full ) )
+            {
+            case kptNotFound:
+                break;
+            case kptBadPath:
+                return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcInvalid );
+            case kptDir:
+                return RC ( rcFS, rcDirectory, rcCreating, rcDirectory, rcExists );
+            default:
+                return RC ( rcFS, rcDirectory, rcCreating, rcPath, rcIncorrect );
+            }
+        }
+
+        rc = make_dir_v1 ( full, access );
+        if ( rc != 0 ) switch ( GetRCState ( rc ) )
+        {
+        case rcExists:
+            rc = 0;
+            if ( ( mode & kcmValueMask ) == kcmInit )
+                rc = KSysDirEmptyDir_v1 ( full, sizeof full, 1 );
+            break;
+        case rcNotFound:
+            if ( ( mode & kcmParents ) != 0 )
+                rc = KSysDirCreateParents_v1 ( self, full, access, false );
+            break;
+        default:
+            break;
+        }
+    }
+    return rc;
+}
+
+/* KDirectoryNativeDir
+ *  returns a native file-system directory node reference
+ *  the directory root will be "/" and set to the native
+ *  idea of current working directory
+ *
+ *  NB - the returned reference will be non-const, allowing
+ *  modification operations to be attempted. these operations
+ *  may still fail if the underlying FS disallows them.
+ *
+ *  "dir" [ OUT ] - return parameter for native directory
+ */
+
+static KDirectory_vt_v1 vtKSysDir =
+{
+    /* version 1.1 */
+    1, 1,
+
+    /* start minor version 0 methods*/
+    KSysDirDestroy_v1,
+    KSysDirList_v1,
+
+    /* the following two messages map to the same method, requiring type casting */
+    ( rc_t ( * )  ( const KSysDir_v1*, bool,
+        rc_t ( * ) ( const KDirectory_v1*, uint32_t, const char*, void* ), void*,
+       const char*, va_list ) ) KSysDirVisit_v1,
+    ( rc_t ( * ) ( KSysDir_v1*, bool,
+        rc_t ( * ) ( KDirectory_v1*, uint32_t, const char*, void* ), void*,
+       const char*, va_list ) ) KSysDirVisit_v1,
+
+    KSysDirPathType_v1,
+    KSysDirResolvePath_v1,
+    KSysDirResolveAlias_v1,
+    KSysDirRename_v1,
+    KSysDirRemove_v1,
+    KSysDirClearDir_v1,
+    KSysDirVAccess,
+    KSysDirSetAccess_v1,
+    KSysDirCreateAlias_v1,
+    KSysDirOpenFileRead_v1,
+    KSysDirOpenFileWrite_v1,
+    KSysDirCreateFile_v1,
+    KSysDirFileSize_v1,
+    KSysDirSetFileSize_v1,
+    KSysDirOpenDirRead_v1,
+    KSysDirOpenDirUpdate_v1,
+    KSysDirCreateDir_v1,
+    NULL, /* we don't track files*/
+    /* end minor version 0 methods*/
+
+    /* start minor version 1 methods*/
+    KSysDirVDate,
+    KSysDirVSetDate,
+    KSysDirGetSysdir_v1
+    /* end minor version 1 methods*/
+};
+
+/* KSysDirInit
+ */
+static
+rc_t KSysDirInit_v1 ( KSysDir_v1 * self, enum RCContext ctx, uint32_t dad_root,
+    const char *path, uint32_t path_size, bool update, bool chroot )
+{
+    rc_t rc;
+
+    rc = KDirectoryInit ( & self -> dad, ( const KDirectory_vt * ) & vtKSysDir,
+                          "KSysDir", path?path:"(null)", update );
+    if ( rc != 0 )
+        return ResetRCContext ( rc, rcFS, rcDirectory, ctx );
+
+    if ( path != NULL )
+        memmove ( self -> path, path, path_size );
+    self -> root = chroot ? path_size : dad_root;
+    self -> size = path_size + 1;
+    self -> path [ path_size ] = '/';
+    self -> path [ path_size + 1 ] = 0;
+
+    return 0;
+}
+
+extern rc_t CC ReportCWD ( const ReportFuncs *f, uint32_t indent );
+extern rc_t CC ReportRedirect ( KWrtHandler* handler,
+    const char* filename, bool* to_file, bool finalize );
+
+LIB_EXPORT rc_t CC KDirectoryNativeDir_v1 ( KDirectory_v1 **dirp )
+{
+    rc_t rc;
+    KSysDir_v1 *dir;
+    uint32_t size;
+    char wd [ PATH_MAX ];
+
+    static bool latch;
+    if ( ! latch )
+    {
+        ReportInitKFS ( ReportCWD, ReportRedirect );
+        latch = true;
+    }
+
+    if ( dirp == NULL )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcParam, rcNull );
+
+    * dirp = NULL;
+
+    if ( realpath ( ".", wd ) == NULL ) switch ( errno )
+    {
+    case EACCES:
+        return RC ( rcFS, rcDirectory, rcAccessing, rcDirectory, rcUnauthorized );
+    case EIO:
+        return RC ( rcFS, rcDirectory, rcAccessing, rcTransfer, rcUnknown );
+    default:
+        return RC ( rcFS, rcDirectory, rcAccessing, rcNoObj, rcUnknown );
+    }
+
+    size = strlen ( wd );
+    if ( size + 2 > sizeof wd )
+        return RC ( rcFS, rcDirectory, rcAccessing, rcBuffer, rcInsufficient );
+
+    /* trim trailing slash */
+    if ( size > 0 && wd [ size - 1 ] == '/' )
+        wd [ -- size ] = 0;
+
+    dir = KSysDirMake_v1 ( size );
+    if ( dir == NULL )
+        rc = RC ( rcFS, rcDirectory, rcAccessing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KSysDirInit_v1 ( dir, rcAccessing, 0, wd, size, true, false );
+        if ( rc == 0 )
+        {
+            * dirp = & dir -> dad;
+            return 0;
+        }
+
+        free ( dir );
+    }
+
+    return rc;
+}
diff --git a/libs/kfs/unix/sysdll.c b/libs/kfs/unix/sysdll.c
new file mode 100644
index 0000000..54c7f4b
--- /dev/null
+++ b/libs/kfs/unix/sysdll.c
@@ -0,0 +1,1436 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+#include "va_copy.h"
+#include "sysdir-priv.h"
+
+#include <kfs/extern.h>
+#include <kfs/dyload.h>
+#include <kfs/directory.h>
+#include <klib/refcount.h>
+#include <klib/vector.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/status.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include "os-native.h"
+
+/* old Sun includes won't define PATH_MAX */
+
+#ifndef __XOPEN_OR_POSIX
+#define __XOPEN_OR_POSIX 1
+#endif
+
+#include <limits.h>
+
+#undef __XOPEN_OR_POSIX
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include <dlfcn.h>
+
+
+#if _DEBUGGING
+#define DLOPEN_MODE RTLD_NOW
+#else
+#define DLOPEN_MODE RTLD_LAZY
+#endif
+
+#define ALWAYS_ADD_EXE 1
+#define USE_DYLOAD 1
+
+/* PATH_MAX is not really universal even on Linux/Unix */
+#ifndef PATH_MAX
+#define PATH_MAX        4096
+#endif
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ */
+static
+void KDirRefRelease ( void *item, void *ignore )
+{
+    KDirectoryRelease ( ( const void* ) item );
+}
+
+/*--------------------------------------------------------------------------
+ * KDyld
+ *  dynamic library loader
+ *
+ *  maintains cache of libraries it has opened while they remain open
+ *  such that subsequent requests for an open library will return a
+ *  new reference to the existing library.
+ */
+struct KDyld
+{
+    Vector search;
+    KRefcount refcount;
+};
+
+
+/* Whack
+ */
+static
+rc_t KDyldWhack ( KDyld *self )
+{
+    KRefcountWhack ( & self -> refcount, "KDyld" );
+
+    VectorWhack ( & self -> search, KDirRefRelease, NULL );
+    free ( self );
+
+    return 0;
+}
+
+
+/* Make
+ *  create a dynamic loader object
+ *
+ *  "dl" [ OUT ] - return parameter for loader
+ */
+LIB_EXPORT rc_t CC KDyldMake ( KDyld **dlp )
+{
+    rc_t rc;
+
+    if ( dlp == NULL )
+        rc = RC ( rcFS, rcDylib, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KDyld *dl = malloc ( sizeof * dl );
+        if ( dl == NULL )
+            rc = RC ( rcFS, rcDylib, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            VectorInit ( & dl -> search, 1, 8 );
+            KRefcountInit ( & dl -> refcount, 1, "KDyld", "make", "dl" );
+
+            * dlp = dl;
+            return 0;
+        }
+
+        * dlp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KDyldAddRef ( const KDyld *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KDyld" ) )
+        {
+        case krefLimit:
+            return RC ( rcFS, rcDylib, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KDyldRelease ( const KDyld *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KDyld" ) )
+        {
+        case krefWhack:
+            return KDyldWhack ( ( KDyld* ) self );
+        case krefNegative:
+            return RC ( rcFS, rcDylib, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Attach
+ * Sever
+ */
+static
+KDyld *KDyldAttach ( const KDyld *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KDyld" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KDyld* ) self;
+}
+
+static
+rc_t KDyldSever ( const KDyld *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KDyld" ) )
+        {
+        case krefWhack:
+            return KDyldWhack ( ( KDyld* ) self );
+        case krefNegative:
+            return RC ( rcFS, rcDylib, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* AddSearchPath
+ *  add a search path to loader for locating library files
+ */
+LIB_EXPORT rc_t CC KDyldVAddSearchPath ( KDyld *self, const char *path, va_list args )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC ( rcFS, rcDylib, rcUpdating, rcSelf, rcNull );
+    else
+    {
+        KDirectory *wd;
+        rc = KDirectoryNativeDir ( & wd );
+        if ( rc == 0 )
+        {
+            const KDirectory *dir;
+            rc = KDirectoryVOpenDirRead ( wd, & dir, false, path, args );
+            if ( rc == 0 )
+            {
+                rc = VectorAppend ( & self -> search, NULL, dir );
+                if ( rc != 0 )
+                    KDirectoryRelease ( dir );
+            }
+
+            KDirectoryRelease ( wd );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDyldAddSearchPath ( KDyld *self, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDyldVAddSearchPath ( self, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+static
+void KDyldForEach ( const KDyld *self,
+    void ( * f ) ( const KDirectory *dir, void *data ), void *data )
+{
+    VectorForEach ( & self -> search, false,
+        ( void ( * ) ( void*, void* ) ) f, data );
+}
+
+
+/* HomeDirectory
+ *  returns a KDirectory where the binary for a given function is located
+ *
+ *  "dir" [ OUT ] - return parameter for home directory ( read-only ), if found
+ *
+ *  "func" [ IN ] - function pointer within binary to be located
+ */
+LIB_EXPORT rc_t CC KDyldHomeDirectory ( const KDyld *self, const KDirectory **dir, fptr_t func )
+{
+    rc_t rc;
+
+    if ( dir == NULL )
+        rc = RC ( rcFS, rcDylib, rcSearching, rcParam, rcNull );
+    else
+    {
+        * dir = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcFS, rcDylib, rcSearching, rcSelf, rcNull );
+        else if ( func == NULL )
+            rc = RC ( rcFS, rcDylib, rcSearching, rcFunction, rcNull );
+        else
+        {
+            Dl_info info;
+            memset ( & info, 0, sizeof info );
+            if ( dladdr ( ( void* ) func, & info ) == 0 )
+                rc = RC ( rcFS, rcDylib, rcSearching, rcFunction, rcNotFound );
+            else
+            {
+                KDirectory *wd;
+                rc = KDirectoryNativeDir ( & wd );
+                if ( rc == 0 )
+                {
+                    /* turn this into a real path */
+                    const KSysDir *sdir = KDirectoryGetSysDir ( wd );
+                    if ( sdir == NULL )
+                        rc = RC ( rcFS, rcDylib, rcSearching, rcDirectory, rcIncorrect );
+                    else
+                    {
+                        /* "dladdr" will return a simple name rather than a path
+                           when the address is within the application itself and
+                           the application was found using PATH. this is brilliant
+                           design at its best. */
+                        char thanks_for_brilliant_APIs [ PATH_MAX ];
+                        const char *dli_fname = info . dli_fname;
+
+                        /* check for a path rather than a name */
+                        const char *last_slash = strrchr ( info . dli_fname, '/' );
+                        if ( last_slash == NULL )
+                        {
+                            /* simple name - get PATH */
+                            const char *PATH = getenv ( "PATH" );
+                            rc = RC ( rcFS, rcDylib, rcSearching, rcPath, rcNotFound );
+                            if ( PATH != NULL )
+                            {
+                                /* loop over PATH */
+                                const char *path_start, *path_end;
+                                for ( path_start = PATH;; path_start = path_end + 1 )
+                                {
+                                    /* look for non-empty directory */
+                                    path_end = strchr ( path_start, ':' );
+                                    if ( path_start != path_end && path_start [ 0 ] != 0 )
+                                    {
+                                        rc_t rc2;
+                                        uint32_t path_type;
+
+                                        /* handle last element in list */
+                                        if ( path_end == NULL )
+                                            last_slash = path_start + strlen ( path_start );
+                                        else for ( last_slash = path_end; last_slash > path_start; -- last_slash )
+                                        {
+                                            if ( last_slash [ -1 ] != '/' )
+                                                break;
+                                        }
+
+                                        /* create possible path, using up to ':' */
+                                        rc2 = string_printf ( thanks_for_brilliant_APIs, sizeof thanks_for_brilliant_APIs, NULL,
+                                                              "%.*s/%s", ( int ) ( last_slash - path_start ), path_start, dli_fname );
+
+                                        /* if failed to create path string */
+                                        if ( rc2 != 0 )
+                                            break;
+
+                                        /* check path against working directory */
+                                        path_type = KDirectoryPathType ( wd, "%s", thanks_for_brilliant_APIs );
+                                        if ( ( path_type & ~ kptAlias ) == kptFile )
+                                        {
+                                            uint32_t access = 0;
+                                            rc = KDirectoryAccess ( wd, & access, "%s", thanks_for_brilliant_APIs );
+                                            if ( rc != 0 )
+                                                break;
+
+                                            /* try to do a quick check that the file can be executed.
+                                               but it could fail to do the right guess. */
+                                            if ( access & 0100 || access & 0010 || access & 0001 ) {
+                                                /* this is a file, which can be assumed to be an executable */
+                                                dli_fname = thanks_for_brilliant_APIs;
+                                                last_slash
+                                                    = & thanks_for_brilliant_APIs [ last_slash - path_start ];
+                                                rc = 0;
+                                                break;
+                                            }
+                                        }
+                                    }
+
+                                    /* exit if no more paths */
+                                    if ( path_end == NULL )
+                                        break;
+                                }
+                            }
+                        }
+
+                        if ( rc == 0 )
+                        {
+                            char real [ PATH_MAX ];
+                            rc = KSysDirRealPath ( sdir, real, sizeof real, "%.*s"
+                                , ( int ) ( last_slash - dli_fname ), dli_fname );
+
+                            if ( rc == 0 )
+                                rc = KDirectoryOpenDirRead ( wd, dir, false, "%s", real );
+
+                            DBGMSG(DBG_KFS, DBG_FLAG(DBG_KFS_DIR), ("%s: %R path is '%s'\n", __func__, rc, real));
+                        }
+                    }
+
+                    KDirectoryRelease ( wd );
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KDylib
+ *  Unix dynamic library
+ */
+struct KDylib
+{
+    void *handle;
+    String path;
+    KRefcount refcount;
+};
+
+
+/* Whack
+ */
+static
+rc_t KDylibWhack ( KDylib *self )
+{
+    KRefcountWhack ( & self -> refcount, "KDylib" );
+
+
+/* Darwin, especially before 10.5 doesn't/didn't do this well */
+#if ! MAC
+    /* try to close library */
+    if ( self -> handle && dlclose ( self -> handle ) )
+    {
+        /* report error */
+        const char *msg = dlerror ();
+        rc_t rc = RC ( rcFS, rcDylib, rcClosing, rcNoObj, rcUnknown );
+        LOGERR ( klogInt, rc, msg );
+        ( void ) msg;
+
+        return rc;
+    }
+#endif
+    free ( self );
+    return 0;
+}
+
+
+/* Make
+ */
+static
+rc_t KDylibMake ( KDylib **libp, const String *path )
+{
+    KDylib *lib = malloc ( sizeof * lib + path -> size + 1 );
+    if ( lib == NULL )
+        return RC ( rcFS, rcDylib, rcConstructing, rcMemory, rcExhausted );
+
+    lib -> handle = NULL;
+    string_copy ( ( char* ) ( lib + 1 ), path -> size + 1, path -> addr, path -> size );
+    StringInit ( & lib -> path, ( char* ) ( lib + 1 ), path -> size, path -> len );
+    KRefcountInit ( & lib -> refcount, 1, "KDylib", "make", lib -> path . addr );
+
+    * libp = lib;
+    return 0;
+}
+
+
+/* SetLogging
+ */
+static
+rc_t KDylibSetLogging ( const KDylib *self )
+{
+    rc_t ( CC * set_formatter ) ( KFmtWriter writer, KLogFmtFlags flags, void *data );
+    rc_t ( CC * set_writer ) ( KWrtWriter writer, void *data );
+    rc_t ( CC * set_level ) ( KLogLevel lvl );
+    
+    if ( ! self -> handle )
+    {
+        return 0;
+    }
+
+    /* set the current logging level */
+    set_level = ( rc_t ( * ) ( KLogLevel ) ) dlsym ( self -> handle, "KLogLevelSet" );
+    if ( set_level != NULL )
+    {
+        KLogLevel lvl = KLogLevelGet ();
+        ( * set_level ) ( lvl );
+    }
+
+    /* determine current library logging */
+    set_writer = ( rc_t ( * ) ( KWrtWriter, void* ) ) dlsym ( self -> handle, "KOutHandlerSet" );
+    if ( set_writer != NULL ) {
+        const KWrtHandler* handler = KOutHandlerGet ();
+        ( * set_writer ) ( handler -> writer, handler -> data );
+    }
+
+    set_formatter = ( rc_t ( * ) ( KFmtWriter, KLogFmtFlags, void* ) ) dlsym ( self -> handle, "KLogLibFmtHandlerSet" );
+    if ( set_formatter != NULL ) {
+        KLogFmtFlags flags = KLogLibFmtFlagsGet ();
+        const KFmtHandler* fmt_handler = KLogFmtHandlerGet ();
+        ( * set_formatter ) ( fmt_handler -> formatter, flags, fmt_handler -> data );
+    }
+    set_writer = ( rc_t ( * ) ( KWrtWriter, void* ) ) dlsym ( self -> handle, "KLogLibHandlerSet" );
+    if ( set_writer != NULL ) {
+        const KWrtHandler* handler = KLogLibHandlerGet ();
+        ( * set_writer ) ( handler -> writer, handler -> data );
+    }
+
+    set_formatter = ( rc_t ( * ) ( KFmtWriter, KLogFmtFlags, void* ) ) dlsym ( self -> handle, "KStsLibFmtHandlerSet" );
+    if ( set_formatter != NULL ) {
+        KStsFmtFlags flags = KStsLibFmtFlagsGet ();
+        const KFmtHandler* fmt_handler = KStsFmtHandlerGet ();
+        ( * set_formatter ) ( fmt_handler -> formatter, flags, fmt_handler -> data );
+    }
+    set_writer = ( rc_t ( * ) ( KWrtWriter, void* ) ) dlsym ( self -> handle, "KStsLibHandlerSet" );
+    if ( set_writer != NULL ) {
+        const KWrtHandler* handler = KStsLibHandlerGet ();
+        ( * set_writer ) ( handler -> writer, handler -> data );
+    }
+#if _DEBUGGING
+    set_writer = ( rc_t ( * ) ( KWrtWriter, void* ) ) dlsym ( self -> handle, "KDbgHandlerSet" );
+    if ( set_writer != NULL ) {
+        const KWrtHandler* handler = KDbgHandlerGet ();
+        ( * set_writer ) ( handler -> writer, handler -> data );
+    }
+#endif
+    return 0;
+}
+
+/* LoadLib
+ *  load a dynamic library
+ *
+ *  "lib" [ OUT ] - return parameter for loaded library
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target library
+ */
+static
+rc_t KDyldLoad ( KDyld *self, KDylib *lib, const char *path )
+{
+/* (VDB-1391) remove dynamic linker interfaces from system */
+#if USE_DYLOAD
+    rc_t rc;
+    const char *msg;
+    size_t msg_len;
+
+    lib -> handle = dlopen ( path, path == NULL ? RTLD_LAZY : DLOPEN_MODE );
+    if ( lib -> handle != NULL )
+        return KDylibSetLogging ( lib );
+
+    msg = dlerror ();
+    rc = RC ( rcFS, rcDylib, rcLoading, rcNoObj, rcUnknown );
+
+    msg_len = strlen(msg);
+    if ( msg_len > lib -> path . size + 2 )
+    {
+        const char *cmp = & msg [ lib -> path . size + 2 ];
+        if ( strcmp ( cmp, "cannot open shared object file: No such file or directory" ) == 0 )
+            rc = RC ( rcFS, rcDylib, rcLoading, rcPath, rcNotFound );
+        else if ( strncmp ( cmp, "undefined symbol: ", sizeof "undefined symbol: " - 1 ) == 0 )
+            rc = RC ( rcFS, rcDylib, rcLoading, rcDylib, rcIncomplete );
+    }
+    if (GetRCState(rc) == rcUnknown) {
+        static const char imageNotFound[] = " image not found";
+        const char *cmp1 = strstr(msg, imageNotFound);
+        const char *cmp2 = msg + msg_len - (sizeof(imageNotFound) - 1);
+        if (cmp1 == cmp2)
+            rc = RC ( rcFS, rcDylib, rcLoading, rcPath, rcNotFound );
+    }
+    
+    DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_DLL), ("%s: %R %s\n", __func__, rc, msg));
+    if (GetRCState(rc) == rcUnknown) {
+        (void)LOGMSG(klogWarn, (msg));
+    }
+    
+    return rc;
+#else
+    lib -> handle = NULL;
+    return 0;
+#endif    
+}
+
+static
+rc_t KDyldVTryLoadLib ( KDyld *self, KDylib **lib,
+    const KDirectory *dir, const char *path, va_list args )
+{
+    rc_t rc;
+
+    const KSysDir *sdir = KDirectoryGetSysDir ( dir );
+    if ( sdir == NULL )
+        rc = RC ( rcFS, rcDylib, rcLoading, rcDirectory, rcIncorrect );
+    else
+    {
+        char real [ PATH_MAX ];
+        rc = KSysDirVRealPath ( sdir, real, sizeof real, path, args );
+        if ( rc == 0 )
+        {
+            String pstr;
+            StringInitCString ( & pstr, real );
+
+            rc = KDylibMake ( lib, & pstr );
+            if ( rc == 0 )
+            {
+                rc = KDyldLoad ( self, * lib, real );
+                if ( rc == 0 )
+                    return 0;
+
+                free ( * lib );
+            }
+        }
+    }
+
+    * lib = NULL;
+
+    return rc;
+}
+
+static
+rc_t KDyldTryLoadLib ( KDyld *self, KDylib **lib,
+    const KDirectory *dir, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, path );
+    rc = KDyldVTryLoadLib ( self, lib, dir, path, args );
+    va_end ( args );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDyldVLoadLib ( KDyld *self,
+    KDylib **lib, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( lib == NULL )
+        rc = RC ( rcFS, rcDylib, rcLoading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcDylib, rcLoading, rcSelf, rcNull );
+        else if ( path == NULL || path [ 0 ] == 0 )
+        {
+            String pstr;
+            CONST_STRING ( & pstr, "" );
+
+            rc = KDylibMake ( lib, & pstr );
+            if ( rc == 0 )
+            {
+                rc = KDyldLoad ( self, * lib, NULL );
+                if ( rc == 0 )
+                    return 0;
+            
+                free ( * lib );
+            }
+        }
+        else
+        {
+            uint32_t i = VectorStart ( & self -> search );
+            uint32_t end = i + VectorLength ( & self -> search );
+
+            if ( i == end )
+            {
+                char name [ 4096 ];
+                int len = ( args == NULL ) ?
+                    snprintf  ( name, sizeof name, "%s", path ) :
+                    vsnprintf ( name, sizeof name, path, args );
+                if ( len < 0 || len >= sizeof name )
+                    rc = RC ( rcFS, rcDylib, rcLoading, rcPath, rcExcessive );
+                else
+                {
+                    String pstr;
+                    StringInit ( & pstr, name, len, string_len ( name, len ) );
+
+                    rc = KDylibMake ( lib, & pstr );
+                    if ( rc == 0 )
+                    {
+                        rc = KDyldLoad ( self, * lib, name );
+                        if ( rc == 0 )
+                            return 0;
+                    
+                        free ( * lib );
+                    }
+                }
+            }
+            else
+            {
+                for ( * lib = NULL; i < end; ++ i )
+                {
+                    const KDirectory *dir;
+
+                    va_list cpy;
+                    va_copy ( cpy, args );
+
+                    dir = ( const void* ) VectorGet ( & self -> search, i );
+                    rc = KDyldVTryLoadLib ( self, lib, dir, path, cpy );
+
+                    va_end ( cpy );
+
+                    if ( rc == 0 || GetRCState ( rc ) != rcNotFound )
+                        return rc;
+                }
+
+                rc = RC ( rcFS, rcDylib, rcLoading, rcPath, rcNotFound );
+            }
+        }
+
+        * lib = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDyldLoadLib ( KDyld *self,
+    KDylib **lib, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = KDyldVLoadLib ( self, lib, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KDylibAddRef ( const KDylib *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KDylib" ) )
+        {
+        case krefLimit:
+            return RC ( rcFS, rcDylib, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KDylibRelease ( const KDylib *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KDylib" ) )
+        {
+        case krefWhack:
+            return KDylibWhack ( ( KDylib* ) self );
+        case krefNegative:
+            return RC ( rcFS, rcDylib, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+static
+void KDylibVectRelease ( void *item, void *ignore )
+{
+    KDylib *self = item;
+    KDylibRelease ( self );
+}
+
+
+/* Attach
+ * Sever
+ */
+static
+KDylib *KDylibAttach ( const KDylib *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "KDylib" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( KDylib* ) self;
+}
+
+static
+rc_t KDylibSever ( const KDylib *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "KDylib" ) )
+        {
+        case krefWhack:
+            return KDylibWhack ( ( KDylib* ) self );
+        case krefNegative:
+            return RC ( rcFS, rcDylib, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Sort
+ */
+static
+int64_t KDylibSort ( const void *item, const void *n )
+{
+    const KDylib *a = item;
+    const KDylib *b = n;
+    return StringOrderNoNullCheck ( & a -> path, & b -> path );
+}
+
+
+/* FullPath
+ *  return full path to library
+ */
+LIB_EXPORT rc_t CC KDylibFullPath ( const KDylib *self, char *path, size_t psize )
+{
+    rc_t rc;
+
+    if ( psize == 0 )
+        rc = RC ( rcFS, rcDylib, rcAccessing, rcBuffer, rcInsufficient );
+    else if ( path == NULL )
+        rc = RC ( rcFS, rcDylib, rcAccessing, rcBuffer, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcDylib, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            size_t bytes = string_copy ( path, psize,
+                self -> path . addr, self -> path . size );
+            if ( bytes < psize )
+                return 0;
+
+            rc = RC ( rcFS, rcDylib, rcAccessing, rcBuffer, rcInsufficient );
+        }
+
+        path [ 0 ] = 0;
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KDlset
+ *  ordered set of dynamic libraries
+ *  contained libraries remain resident until set is released
+ */
+struct KDlset
+{
+    KDyld *dl;
+    Vector name, ord;
+    KRefcount refcount;
+};
+
+
+/* Whack
+ */
+static
+rc_t KDlsetWhack ( KDlset *self )
+{
+    KRefcountWhack ( & self -> refcount, "KDlset" );
+
+    VectorWhack ( & self -> name, NULL, NULL );
+    VectorWhack ( & self -> ord, KDylibVectRelease, NULL );
+    KDyldSever ( self -> dl );
+    free ( self );
+
+    return 0;
+}
+
+#define STRINGIZE(s) #s
+#define LIBNAME(pref, name, suff) STRINGIZE(pref) name STRINGIZE(suff)
+/* MakeSet
+ *  load a dynamic library
+ *
+ *  "set" [ OUT ] - return parameter for lib set
+ */
+LIB_EXPORT rc_t CC KDyldMakeSet ( const KDyld *self, KDlset **setp )
+{
+    rc_t rc = 0;
+
+    if ( setp == NULL )
+        rc = RC ( rcFS, rcDylib, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcDylib, rcConstructing, rcSelf, rcNull );
+        else
+        {
+            KDlset *set = malloc ( sizeof * set );
+            if ( set == NULL )
+                rc = RC ( rcFS, rcDylib, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                set -> dl = KDyldAttach ( self );
+                VectorInit ( & set -> name, 0, 16 );
+                VectorInit ( & set -> ord, 0, 16 );
+                KRefcountInit ( & set -> refcount, 1, "KDlset", "make", "dlset" );
+#if ! ALWAYS_ADD_EXE
+                {   
+                    KDylib *jni;
+                    const char* libname = LIBNAME(LIBPREFIX, "vdb_jni.", SHLIBEXT);
+                    if ( KDyldLoadLib ( ( KDyld* ) self, & jni, libname ) == 0 )
+                    {
+                        rc = KDlsetAddLib ( set, jni );
+                        KDylibRelease ( jni );
+                    }
+                    if (rc == 0)
+                    {
+                        * setp = set;
+                        return 0;
+                    }
+                }
+#else
+                {
+                    KDylib *exe;
+                    rc = KDyldLoadLib ( ( KDyld* ) self, & exe, NULL );
+                    if ( rc == 0 )
+                    {
+                        rc = KDlsetAddLib ( set, exe );
+                        KDylibRelease ( exe );
+                        if ( rc == 0 )
+                        {
+                            * setp = set;
+                            return 0;
+                        }
+                    }
+                }
+#endif
+                KDlsetRelease ( set );
+            }
+        }
+
+        * setp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KDlsetAddRef ( const KDlset *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KDlset" ) )
+        {
+        case krefLimit:
+            return RC ( rcFS, rcDylib, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KDlsetRelease ( const KDlset *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KDlset" ) )
+        {
+        case krefWhack:
+            return KDlsetWhack ( ( KDlset* ) self );
+        case krefNegative:
+            return RC ( rcFS, rcDylib, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* AddLib
+ *  adds a dynamic library to end of ordered set
+ *
+ *  "lib" [ IN ] - library returned from KDyldLoadLib
+ */
+static
+rc_t KDlsetAddLibInt ( KDlset *self, KDylib *lib )
+{
+    uint32_t idx;
+    rc_t rc = VectorAppend ( & self -> ord, & idx, lib );
+    if ( rc == 0 )
+    {
+        void *ignore;
+
+        rc = VectorInsertUnique ( & self -> name,
+            lib, NULL, KDylibSort );
+        if ( rc == 0 )
+            return 0;
+
+        VectorSwap ( & self -> ord, idx, NULL, & ignore );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDlsetAddLib ( KDlset *self, KDylib *lib )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcFS, rcDylib, rcInserting, rcSelf, rcNull );
+    else if ( lib == NULL )
+        rc = RC ( rcFS, rcDylib, rcInserting, rcDylib, rcNull );
+    else
+    {
+        rc = KDylibAddRef ( lib );
+        if ( rc == 0 )
+        {
+            rc = KDlsetAddLibInt ( self, lib );
+            if ( rc == 0 )
+                return 0;
+
+            KDylibRelease ( lib );
+        }
+    }
+
+    return rc;
+}
+
+
+/* AddAll
+ *  adds all dynamic libraries found in dl search path
+ */
+static
+rc_t KDlsetTryLib ( const KDirectory *dir,
+    uint32_t type, const char *name, void *data )
+{
+    KDlset *self = data;
+
+    if ( ( type & ~ kptAlias ) == kptFile )
+    {
+        rc_t rc;
+        KDylib *lib;
+#ifdef SHLX
+        /* force simple shared library extension */
+        if ( sizeof SHLX >= 2 )
+        {
+            /* SHLX has at least 1 character plus NUL byte */
+            uint32_t len = strlen ( name );
+            /* name must be at least 1 character larger */
+            if ( len <= ( sizeof SHLX - 1 ) )
+                return 0;
+            /* name must end with shared library extension */
+            if ( memcmp ( & name [ len - ( sizeof SHLX - 1 ) ], SHLX, sizeof SHLX - 1 ) != 0 )
+                return 0;
+        }
+#endif
+        rc = KDyldTryLoadLib ( self -> dl, & lib, dir, name );
+        if ( rc == 0 )
+        {
+            rc = KDlsetAddLibInt ( self, lib );
+            if ( rc == 0 )
+                return 0;
+
+            KDylibRelease ( lib );
+        }
+    }
+
+    return 0;
+}
+
+static
+void KDlsetVisitDir ( const KDirectory *dir, void *data )
+{
+    KDirectoryVisit ( dir, false, KDlsetTryLib, data, "." );
+}
+
+LIB_EXPORT rc_t CC KDlsetAddAll ( KDlset *self )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcDylib, rcInserting, rcSelf, rcNull );
+    KDyldForEach ( self -> dl, KDlsetVisitDir, self );
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KSymAddr
+ *  symbol address within a dynamic library
+ */
+struct KSymAddr
+{
+    KDylib *lib;
+    void *addr;
+    KRefcount refcount;
+};
+
+
+/* Whack
+ */
+static
+rc_t KSymAddrWhack ( KSymAddr *self )
+{
+    KRefcountWhack ( & self -> refcount, "KSymAddr" );
+
+    KDylibSever ( self -> lib );
+    free ( self );
+
+    return 0;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KSymAddrAddRef ( const KSymAddr *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KSymAddr" ) )
+        {
+        case krefLimit:
+            return RC ( rcFS, rcDylib, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KSymAddrRelease ( const KSymAddr *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KSymAddr" ) )
+        {
+        case krefWhack:
+            return KSymAddrWhack ( ( KSymAddr* ) self );
+        case krefNegative:
+            return RC ( rcFS, rcDylib, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make
+ */
+static
+rc_t KSymAddrMake ( KSymAddr **symp,
+    const KDylib *lib, const char *name )
+{
+    if ( lib -> handle )
+    {
+        void *addr = dlsym ( lib -> handle, name );
+        const char *estr = dlerror();
+        
+        if ( addr != NULL || estr == NULL )
+        {
+            KSymAddr *sym = malloc ( sizeof * sym );
+            if ( sym == NULL )
+                return RC ( rcFS, rcDylib, rcConstructing, rcMemory, rcExhausted );
+
+            sym -> lib = KDylibAttach ( lib );
+            sym -> addr = addr;
+            KRefcountInit ( & sym -> refcount, 1, "KSymAddr", "make", name );
+            * symp = sym;
+            return 0;
+        }
+    }
+    * symp = NULL;
+    return RC ( rcFS, rcDylib, rcSelecting, rcName, rcNotFound );
+}
+
+
+/* Symbol
+ *  find a symbol within dynamic library
+ *
+ *  "sym" [ OUT ] - return parameter for exported symbol address
+ *
+ *  "name" [ IN ] - NUL terminated symbol name in
+ *  library-native character set
+ */
+LIB_EXPORT rc_t CC KDylibSymbol ( const KDylib *self, KSymAddr **sym, const char *name )
+{
+    rc_t rc;
+
+    if ( sym == NULL )
+        rc = RC ( rcFS, rcDylib, rcSelecting, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcSelf, rcNull );
+        else if ( name == NULL )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcName, rcNull );
+        else if ( name [ 0 ] == 0 )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcName, rcEmpty );
+        else
+        {
+            return KSymAddrMake ( sym, self, name );
+        }
+
+        * sym = NULL;
+    }
+
+    return rc;
+}
+
+typedef struct KDlsetTrySymData KDlsetTrySymData;
+struct KDlsetTrySymData
+{
+    const KDlset *self;
+    const char *name;
+
+    bool ( CC * test ) ( const KSymAddr *sym, void *data );
+    void *data;
+
+    KSymAddr *sym;
+    rc_t rc;
+    bool first;
+};
+
+static
+bool KDlsetTrySymbol ( void *item, void *data )
+{
+    KSymAddr *sym;
+    KDlsetTrySymData *pb = data;
+    pb -> rc = KDylibSymbol ( item, & sym, pb -> name );
+    if ( pb -> rc == 0 )
+    {
+        /* simple case */
+        if ( pb -> test == NULL )
+        {
+            pb -> sym = sym;
+            return true;
+        }
+
+        /* apply filter function */
+        if ( ( * pb -> test ) ( sym, pb -> data ) )
+        {
+            KSymAddrRelease ( pb -> sym );
+            pb -> sym = sym;
+            return pb -> first;
+        }
+
+        KSymAddrRelease ( sym );
+    }
+    return false;
+}
+
+LIB_EXPORT rc_t CC KDlsetSymbol ( const KDlset *self, KSymAddr **sym, const char *name )
+{
+    rc_t rc;
+
+    if ( sym == NULL )
+        rc = RC ( rcFS, rcDylib, rcSelecting, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcSelf, rcNull );
+        else if ( name == NULL )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcName, rcNull );
+        else if ( name [ 0 ] == 0 )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcName, rcEmpty );
+        else
+        {
+            KDlsetTrySymData pb;
+            memset ( & pb, 0, sizeof pb );
+            pb . self = self;
+            pb . name = name;
+            pb . rc = RC ( rcFS, rcDylib, rcSelecting, rcName, rcNotFound );
+
+            if ( VectorDoUntil ( & self -> ord, false, KDlsetTrySymbol, & pb ) )
+            {
+                * sym = pb . sym;
+                return 0;
+            }
+
+            rc = pb . rc;
+        }
+
+        * sym = NULL;
+    }
+
+    return rc;
+}
+
+
+/* FirstSymbol
+ * LastSymbol
+ *  find a symbol within dynamic library set matching criteria
+ *
+ *  "sym" [ OUT ] - return parameter for exported symbol address
+ *
+ *  "name" [ IN ] - NUL terminated symbol name in
+ *  library-native character set
+ *
+ *  "test" [ IN ] and "data" [ IN, OPAQUE ] - callback filter function
+ *  return true if symbol matches criteria
+ */
+LIB_EXPORT rc_t CC KDlsetFirstSymbol ( const KDlset *self, KSymAddr **sym, const char *name,
+    bool ( CC * test ) ( const KSymAddr *sym, void *data ), void *data )
+{
+    rc_t rc;
+
+    if ( sym == NULL )
+        rc = RC ( rcFS, rcDylib, rcSelecting, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcSelf, rcNull );
+        else if ( name == NULL )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcName, rcNull );
+        else if ( name [ 0 ] == 0 )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcName, rcEmpty );
+        else if ( test == NULL )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcFunction, rcNull );
+        else
+        {
+            KDlsetTrySymData pb;
+            memset ( & pb, 0, sizeof pb );
+            pb . self = self;
+            pb . name = name;
+            pb . test = test;
+            pb . data = data;
+            pb . rc = RC ( rcFS, rcDylib, rcSelecting, rcName, rcNotFound );
+            pb . first = true;
+
+            if ( VectorDoUntil ( & self -> ord, false, KDlsetTrySymbol, & pb ) )
+            {
+                * sym = pb . sym;
+                return 0;
+            }
+
+            rc = pb . rc;
+        }
+
+        * sym = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDlsetLastSymbol ( const KDlset *self, KSymAddr **sym, const char *name,
+    bool ( CC * test ) ( const KSymAddr *sym, void *data ), void *data )
+{
+    rc_t rc;
+
+    if ( sym == NULL )
+        rc = RC ( rcFS, rcDylib, rcSelecting, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcSelf, rcNull );
+        else if ( name == NULL )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcName, rcNull );
+        else if ( name [ 0 ] == 0 )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcName, rcEmpty );
+        else if ( test == NULL )
+            rc = RC ( rcFS, rcDylib, rcSelecting, rcFunction, rcNull );
+        else
+        {
+            KDlsetTrySymData pb;
+            memset ( & pb, 0, sizeof pb );
+            pb . self = self;
+            pb . name = name;
+            pb . test = test;
+            pb . data = data;
+            pb . rc = RC ( rcFS, rcDylib, rcSelecting, rcName, rcNotFound );
+
+            VectorDoUntil ( & self -> ord, false, KDlsetTrySymbol, & pb );
+            if ( pb . sym != NULL )
+            {
+                * sym = pb . sym;
+                return 0;
+            }
+
+            rc = pb . rc;
+        }
+
+        * sym = NULL;
+    }
+
+    return rc;
+}
+
+
+/* List - PRIVATE
+ *  list the paths to the libraries in the set
+ */
+typedef struct list_dylib_param list_dylib_param;
+struct list_dylib_param
+{
+    VNamelist *list;
+    rc_t rc;
+};
+
+static
+bool CC list_dylib ( void *item, void *data )
+{
+    list_dylib_param *pb = data;
+    const KDylib *lib = ( const void* ) item;
+
+    /* "lib" was created with KDylibMake
+       which creates a NUL terminated path.
+       of course, this could seg-fault if bad... */
+    assert ( lib -> path . addr [ lib -> path . size ] == 0 );
+
+    pb -> rc = VNamelistAppend ( pb -> list, lib -> path . addr );
+    return pb -> rc != 0;
+}
+
+LIB_EXPORT rc_t CC KDlsetList ( const KDlset *self, KNamelist **listp )
+{
+    list_dylib_param pb;
+
+    assert ( listp != NULL );
+
+    if ( self == NULL )
+        pb . rc = RC ( rcFS, rcDylib, rcListing, rcSelf, rcNull );
+    else
+    {
+        pb . rc = VNamelistMake ( & pb . list, VectorLength ( & self -> name ) );
+        if ( pb . rc == 0 )
+        {
+            bool fail = VectorDoUntil ( & self -> name, false, list_dylib, & pb );
+            if ( ! fail )
+                pb . rc = VNamelistToNamelist ( pb . list, listp );
+
+            VNamelistRelease ( pb . list );
+        }
+    }
+
+    return pb . rc;
+}
+
+
+/* AsObj
+ * AsFunc
+ *  retrieve symbol address as pointer to object
+ */
+LIB_EXPORT void * CC KSymAddrAsObj ( const KSymAddr *self )
+{
+    if ( self != NULL )
+        return self -> addr;
+    return NULL;
+}
+
+LIB_EXPORT void CC KSymAddrAsFunc ( const KSymAddr *self, fptr_t *fp )
+{
+    if ( self != NULL && fp != NULL )
+        * fp = ( fptr_t ) self -> addr;
+}
+
+
diff --git a/libs/kfs/unix/sysfile-priv.h b/libs/kfs/unix/sysfile-priv.h
new file mode 100644
index 0000000..2c175e2
--- /dev/null
+++ b/libs/kfs/unix/sysfile-priv.h
@@ -0,0 +1,89 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef USE_TIMEOUT
+#define USE_TIMEOUT false
+#endif
+
+#ifndef USE_NO_TIMEOUT_TTY
+#define USE_NO_TIMEOUT_TTY false
+#endif
+
+#ifndef _h_sysfile_priv_
+#define _h_sysfile_priv_
+
+#ifndef _h_kfs_impl_
+#include <kfs/impl.h>
+#endif
+
+#include <sys/select.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * KSysFile
+ *  a Unix file
+ */
+typedef struct KSysFile_v1 KSysFile_v1;
+struct KSysFile_v1
+{
+    KFile_v1 dad;
+    int fd;
+#if USE_TIMEOUT
+    fd_set fds;
+    struct timeval to;
+    bool use_to;
+#endif
+};
+
+typedef struct KSysFile_v2 KSysFile_v2;
+struct KSysFile_v2
+{
+    KFile_v2 dad;
+    int fd;
+#if USE_TIMEOUT
+    fd_set fds;
+    struct timeval to;
+    bool use_to;
+#endif
+};
+
+/* KSysFileMake
+ *  create a new file object
+ *  from file descriptor
+ */
+rc_t KSysFileMake_v1 ( KSysFile_v1 **fp, int fd, const char *path, bool read_enabled, bool write_enabled );
+    KSysFile_v2 * KSysFileMake_v2 ( ctx_t ctx, int fd, const char *path, bool read_enabled, bool write_enabled );
+
+#define KSysFileMake NAME_VERS ( KSysFileMake, KFILE_VERS )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _h_sysfile_priv_ */
diff --git a/libs/kfs/unix/sysfile-v2.c b/libs/kfs/unix/sysfile-v2.c
new file mode 100644
index 0000000..1e839f0
--- /dev/null
+++ b/libs/kfs/unix/sysfile-v2.c
@@ -0,0 +1,1018 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KSysFile_v2;
+#define KFILE_IMPL struct KSysFile_v2
+#define KFILE_VERS 2
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <kfs/extern.h>
+#include "sysfile-priv.h"
+#include <kfs/kfs-priv.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+
+
+#ifndef __USE_UNIX98
+#define __USE_UNIX98 1
+#endif
+#include <unistd.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <assert.h>
+#include <string.h>
+
+#ifdef _DEBUGGING
+#define SYSDEBUG(msg) DBGMSG(DBG_KFS,DBG_FLAG(DBG_KFS_SYS),msg)
+#else
+#define SYSDEBUG(msg)
+#endif
+
+/*--------------------------------------------------------------------------
+ * KSysFile
+ *  a Unix file
+ */
+
+
+#if USE_TIMEOUT
+/* default timeout amount 3 seconds is 10,000 milliseconds */
+#define TIMEOUT_MSECS (3 * 1000)
+
+int32_t KSysFileTimeout = TIMEOUT_MSECS;
+
+enum
+{
+    select_read = 1,
+    select_write = 2,
+    select_exception = 4
+} select_operations;
+
+static
+void KSysFileSelect_v2 ( const KSysFile_v2 *self, ctx_t ctx, uint32_t operations )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcSelecting );
+
+    SYSDEBUG( ( "%s: Enter (%p, %x)\n", __func__, self, operations ) );
+
+
+    if ( self -> use_to )
+    {
+        fd_set fdsread;
+        fd_set fdswrite;
+        fd_set fdsexcept;
+        struct timeval to;
+
+        fdsread = self -> fds;
+        fdswrite = self -> fds;
+        fdsexcept = self -> fds;
+
+        to = self -> to;
+
+        while ( ! FAILED () )
+        {
+            int selected;
+            SYSDEBUG ( ( "%s: call select\n", __func__ ) );
+
+            selected = select ( self -> fd + 1, 
+                               ( operations & select_read ) ? &fdsread : NULL,
+                               ( operations & select_write ) ? &fdswrite : NULL,
+                               ( operations & select_exception ) ? &fdsexcept : NULL,
+                               &to );
+            SYSDEBUG(( "%s: select returned '%d' \n", __func__, selected));
+
+            if ( selected == 0 )
+                INTERNAL_ERROR ( xcFileTimeout, "timeout while selecting file" );
+
+            else if ( selected < 0 )
+            {
+                int lerrno = errno;
+
+                switch ( lerrno )
+                {
+                case EINVAL:
+                    INTERNAL_ERROR ( xcFileTimeout, "timeout while selecting file : coding error bad timeout or negative nfds" );
+                    break;
+
+                case EBADF:
+                    INTERNAL_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", self->fd );
+                    break;
+
+                case EINTR:/*  A signal was caught. */
+                    continue;
+
+                case ENOMEM:
+                    SYSTEM_ERROR ( xcNoMemory, "out of memory setting up read timeout" );
+                    break;
+
+                default:
+                    INTERNAL_ERROR ( xcFileUnexpected, "unexpected error code: %!", lerrno );
+                }
+                /* function documentation seems to show that unless EINTR was 
+                 * set we can now do our read
+                 */
+            }
+            else
+            {
+                assert ( FD_ISSET ( self -> fd, &fdsread )  ||
+                         FD_ISSET ( self -> fd, &fdswrite ) ||
+                         FD_ISSET ( self -> fd, &fdsexcept ) );
+
+                break;
+            }
+        }
+    }
+}
+#endif
+
+
+/* Destroy
+ */
+static
+void KSysFileDestroy_v2 ( KSysFile_v2 *self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcDestroying );
+
+    int lerrno;
+
+    while ( 1 )
+    {
+        if ( close ( self -> fd ) != 0 )
+        {
+            switch ( lerrno = errno )
+            {
+            case EBADF:
+                INTERNAL_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", self->fd );
+                break;
+                
+            case EINTR:
+                continue;
+                
+            default:
+                INTERNAL_ERROR ( xcFileUnexpected, "unexpected error code: %!", lerrno );
+                break;
+            }
+            
+            return;
+        }
+    }
+    
+    free ( self );
+}
+
+/* GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ */
+static
+KSysFile_v2 * KSysFileGetSysFile_v2 ( const KSysFile_v2 *self, ctx_t ctx, uint64_t *offset )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcRetrieving );
+
+    * offset = 0;
+    return ( KSysFile_v2 * ) self;
+}
+
+/* RandomAccess
+ *  ALMOST by definition, the file is random access
+ *  certain file types ( notably compressors ) will refuse random access
+ *
+ *  returns true if random access
+ */
+static
+bool KSysFileRandomAccess_v2 ( const KSysFile_v2 *self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcAccessing );
+
+    struct stat st;
+
+    int lerrno;
+
+    /* "fstat" gets metadata for an open file */
+    if ( fstat ( self -> fd, & st ) != 0 )
+    {
+        switch ( lerrno = errno )
+        {
+        case EBADF:
+            INTERNAL_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", self->fd );
+            break;
+            
+        default:
+            INTERNAL_ERROR ( xcFileUnexpected, "unexpected error code: %!", lerrno );
+            break;
+        }
+
+        return false;
+    }
+
+    /* here we check if the file supports random access by asking
+       if it is a "regular" file. It's the only type we actually
+       create via open, but we can be given an fd we didn't open,
+       and it might not be a regular file. */
+    if ( ! S_ISREG ( st . st_mode ) )
+        return false;
+
+    return true;
+}
+
+
+/* Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t KSysFileType_v2 ( const KSysFile_v2 *self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcEvaluating );
+
+    struct stat st;
+
+    if ( fstat ( self -> fd, & st ) != 0 )
+        return kfdInvalid;
+
+    if ( ! S_ISREG ( st . st_mode ) )
+    {
+        if ( S_ISCHR ( st . st_mode ) )
+            return kfdCharDev;
+        if ( S_ISBLK ( st . st_mode ) )
+            return kfdBlockDev;
+        if ( S_ISFIFO ( st . st_mode ) )
+            return kfdFIFO;
+        if ( S_ISSOCK ( st . st_mode ) )
+            return kfdSocket;
+    }
+
+    return kfdFile;
+}
+
+
+/* Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+uint64_t KSysFileSize_v2 ( const KSysFile_v2 *self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcAccessing );
+
+    struct stat st;
+
+    int lerrno;
+
+    if ( fstat ( self -> fd, & st ) != 0 )
+    {
+        switch ( lerrno = errno )
+        {
+        case EBADF:
+            INTERNAL_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", self->fd );
+            break;
+            
+        default:
+            INTERNAL_ERROR ( xcFileUnexpected, "unexpected error code: %!", lerrno );
+            break;
+        }
+
+        return 0;
+    }
+
+    if ( ! S_ISREG ( st . st_mode ) )
+    {
+        // what would be the error for a non regular file
+        SYSTEM_ERROR ( xcErrorUnknown, "?" );
+        return 0;
+    }
+
+    return st . st_size;
+}
+
+/* SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+void KSysFileSetSize_v2 ( KSysFile_v2 *self, ctx_t ctx, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcAccessing );
+
+    int lerrno;
+
+    if ( ftruncate ( self -> fd, size ) != 0 ) 
+        switch ( lerrno = errno )
+        {
+        case EBADF:
+            INTERNAL_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", self->fd );
+            break;
+            
+        default:
+            INTERNAL_ERROR ( xcFileUnexpected, "unexpected error code: %!", lerrno );
+            break;
+        }
+}
+
+/* Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+size_t KSysFileRead_v2 ( const KSysFile_v2 *self, ctx_t ctx,
+     uint64_t pos,void *buffer, size_t bsize )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcReading );
+
+    ssize_t count = 0;
+
+    assert ( self != NULL );
+
+    while ( 1 )
+    {
+        int lerrno;
+
+#if USE_TIMEOUT
+        ON_FAIL ( KSysFileSelect_v2 ( self, ctx, select_read | select_exception ) )
+        {
+            return 0;
+        }
+#endif
+
+        count = pread ( self -> fd, buffer, bsize, pos );
+
+        if ( count < 0 ) 
+        {
+            switch ( lerrno = errno )
+            {
+            case EINTR:
+                continue;
+
+            case EIO:
+                SYSTEM_ERROR ( xcTransferIncomplete, "system I/O error - likely broken pipe" );
+                break;
+                
+            case EBADF:
+                INTERNAL_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", self->fd );
+                break;
+                
+            case EISDIR:
+                INTERNAL_ERROR ( xcFileDescInvalid, "system misuse of a directory error");
+                break;
+                
+            case EINVAL:
+                SYSTEM_ERROR ( xcParamInvalid, "system invalid argument error");
+                break;
+
+            default:
+                INTERNAL_ERROR ( xcFileUnexpected, "unexpected error code: %!", lerrno );
+                break;
+            }
+            
+            return 0;
+        }
+
+        break;
+    }
+
+    return count;
+}
+
+/* Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+static
+size_t KSysFileWrite_v2 ( KSysFile_v2 *self, ctx_t ctx, 
+      uint64_t pos, const void *buffer, size_t size )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcWriting );
+
+    ssize_t count = 0;
+
+    assert ( self != NULL );
+
+    while ( 1 )
+    {
+        int lerrno;
+
+#if USE_TIMEOUT
+        ON_FAIL ( KSysFileSelect_v2 ( self, ctx, select_read | select_exception ) )
+        {
+            return 0;
+        }
+#endif
+
+        count = pwrite ( self -> fd, buffer, size, pos );
+
+        if ( count < 0 ) 
+        {
+            switch ( lerrno = errno )
+            {
+            case ENOSPC:
+                INTERNAL_ERROR ( xcStorageExhausted, "system bad file descriptor error fd = %d", self -> fd );
+                break;
+
+            case EINTR:
+                continue;
+                
+            case EFBIG:
+                INTERNAL_ERROR ( xcFileExcessive, "system file too large error" );
+                break;
+                
+            case EIO:
+                SYSTEM_ERROR ( xcTransferIncomplete, "system I/O error - likely broken pipe" );
+                break;
+                
+            case EBADF:
+                INTERNAL_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", self->fd );
+                break;
+                
+            case EISDIR:
+                INTERNAL_ERROR ( xcFileDescInvalid, "system misuse of a directory error");
+                break;
+
+            case EINVAL:
+                SYSTEM_ERROR ( xcParamInvalid, "system invalid argument error");
+                break;
+
+            default:
+                INTERNAL_ERROR ( xcFileUnexpected, "unexpected error code: %!", lerrno );
+                break;
+            }
+
+            return 0;
+        }
+
+        break;
+    }
+
+    return count;
+}
+
+
+/* Make
+ *  create a new file object
+ *  from file descriptor
+ */
+static KFile_vt_v2 vtKSysFile =
+{
+    /* version 2.0 */
+    2, 0,
+
+    /* start minor version 0 methods */
+    KSysFileDestroy_v2,
+    KSysFileGetSysFile_v2,
+    KSysFileRandomAccess_v2,
+    KSysFileSize_v2,
+    KSysFileSetSize_v2,
+    KSysFileRead_v2,
+    KSysFileWrite_v2,
+    KSysFileType_v2
+    /* end minor version 0 methods */
+};
+
+static
+KSysFile_v2 * KSysFileMakeVT_v2 ( ctx_t ctx, int fd, const KFile_vt *vt,
+    const char *path, bool read_enabled, bool write_enabled )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcConstructing );
+
+    KSysFile_v2 *f;
+
+    if ( fd < 0 )
+    {
+        INTERNAL_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", fd );
+        return NULL;
+    }
+
+    f = calloc ( sizeof * f, 1 );
+    if ( f == NULL )
+    {
+        SYSTEM_ERROR ( xcNoMemory, "out of memory" );
+        return NULL;
+    }
+
+#if USE_TIMEOUT
+    if ( KSysFileTimeout >= 0 )
+    {
+        f -> to.tv_sec = KSysFileTimeout / 1000;
+        f -> to.tv_usec = ( KSysFileTimeout % 1000 ) * 1000;
+        f -> use_to = true;
+        FD_ZERO ( &f -> fds );
+        FD_SET ( fd, &f -> fds );
+    }
+#endif
+
+    TRY ( KFileInit_v2 ( & f -> dad, ctx, vt, "KSysFile", path, read_enabled, write_enabled ) );
+    {
+        f -> fd = fd;
+        return f;
+    }
+
+    free ( f );
+    
+    return NULL;
+}
+
+LIB_EXPORT KSysFile_v2 * CC KSysFileMake_v2 ( ctx_t ctx, int fd, const char *path, bool read_enabled, bool write_enabled )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcConstructing );
+
+    return KSysFileMakeVT_v2 ( ctx, fd, ( const KFile_vt * ) & vtKSysFile,
+        path, read_enabled, write_enabled );
+}
+
+/*--------------------------------------------------------------------------
+ * KFile
+ *  Unix-specific standard i/o interfaces
+ */
+
+typedef struct KStdIOFile_v2 KStdIOFile_v2;
+struct KStdIOFile_v2
+{
+    KSysFile_v2 dad;
+    uint64_t pos;
+};
+
+
+/* Destroy
+ *  does not close fd
+ */
+static
+void KStdIOFileDestroy_v2 ( KSysFile_v2 *self, ctx_t ctx )
+{
+    free ( self );
+}
+
+static KFile_vt_v2 vtKStdIOFile =
+{
+    /* version 1.1 */
+    2, 0,
+
+    /* start minor version 0 methods */
+    KStdIOFileDestroy_v2,
+    KSysFileGetSysFile_v2,
+    KSysFileRandomAccess_v2,
+    KSysFileSize_v2,
+    KSysFileSetSize_v2,
+    KSysFileRead_v2,
+    KSysFileWrite_v2,
+    KSysFileType_v2
+    /* end minor version 0 methods */
+};
+
+/* RandomAccess
+ */
+static
+bool KStdIOFileRandomAccess_v2 ( const KSysFile_v2 *self, ctx_t ctx )
+{
+    INTERNAL_ERROR ( xcFunctionUnimplemented, "function is not supported" );
+    return false;
+}
+
+
+/* Size
+ */
+static
+uint64_t KStdIOFileSize_v2 ( const KSysFile_v2 *self, ctx_t ctx )
+{
+    INTERNAL_ERROR ( xcFunctionUnimplemented, "function is not supported" );
+
+    return 0;
+}
+
+/* SetSize
+ */
+static
+void KStdIOFileSetSize_v2 ( KSysFile_v2 *self, ctx_t ctx, uint64_t size )
+{
+    INTERNAL_ERROR ( xcFunctionUnimplemented, "function is not supported" );
+}
+
+/* Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+size_t KStdIOFileRead_v2 ( const KSysFile_v2 *dad, ctx_t ctx, 
+      uint64_t pos, void *buffer, size_t bsize )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcReading );
+
+    KStdIOFile_v2 *self = ( KStdIOFile_v2* ) dad;
+    ssize_t count = 0;
+
+    assert ( self != NULL );
+
+    if ( self -> pos != pos )
+        INTERNAL_ERROR ( xcParamInvalid, "system invalid argument error");
+    
+
+    while ( 1 )
+    {
+        int lerrno;
+
+#if USE_TIMEOUT
+        ON_FAIL ( KSysFileSelect_v2 ( &self->dad, ctx,  select_read | select_exception ) );
+        {
+            return 0;
+        }
+#endif
+
+        count = read ( self -> dad . fd, buffer, bsize );
+
+        if ( count < 0 ) switch ( lerrno = errno )
+        {
+        case EINTR:
+            continue;
+            
+        case EIO:
+            SYSTEM_ERROR ( xcTransferIncomplete, "system I/O error - likely broken pipe" );
+            break;
+            
+        case EBADF:
+            INTERNAL_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", self -> dad . fd );
+            break;
+            
+        case EISDIR:
+            INTERNAL_ERROR ( xcFileDescInvalid, "system misuse of a directory error");
+            break;
+            
+        case EINVAL:
+            SYSTEM_ERROR ( xcParamInvalid, "system invalid argument error");
+            break;
+            
+        default:
+            INTERNAL_ERROR ( xcFileUnexpected, "unexpected error code: %!", lerrno );
+            break;
+        }
+
+        self -> pos += count;
+        break;
+    }
+
+    return count;
+}
+
+/* Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+static
+size_t KStdIOFileWrite_v2 ( KSysFile_v2 *dad, ctx_t ctx, 
+      uint64_t pos, const void *buffer, size_t size )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcWriting );
+
+    KStdIOFile_v2 *self = ( KStdIOFile_v2* ) dad;
+    ssize_t count = 0
+;
+    assert ( self != NULL );
+
+    if ( self -> pos != pos )
+        INTERNAL_ERROR ( xcParamInvalid, "system invalid argument error");
+
+    while ( 1 )
+    {
+        int lerrno;
+
+#if USE_TIMEOUT
+        ON_FAIL ( KSysFileSelect_v1 ( &self -> dad, select_read | select_exception ) );
+        {
+            return 0;
+        }
+#endif
+
+        count = write ( self -> dad . fd, buffer, size );
+
+        if ( count < 0 ) 
+        {
+            switch ( lerrno = errno )
+            {
+            case ENOSPC:
+                INTERNAL_ERROR ( xcStorageExhausted, "system bad file descriptor error fd = %d", self -> dad . fd );
+                break;
+                
+            case EINTR:
+                continue;
+                
+            case EFBIG:
+                INTERNAL_ERROR ( xcFileExcessive, "system file too large error" );
+                break;
+                
+            case EIO:
+                SYSTEM_ERROR ( xcTransferIncomplete, "system I/O error - likely broken pipe" );
+                break;
+                
+            case EBADF:
+                INTERNAL_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", self -> dad . fd );
+                break;
+                
+            case EISDIR:
+                INTERNAL_ERROR ( xcFileDescInvalid, "system misuse of a directory error");
+                break;
+                
+            case EINVAL:
+                SYSTEM_ERROR ( xcParamInvalid, "system invalid argument error");
+                break;
+                
+            default:
+                INTERNAL_ERROR ( xcFileUnexpected, "unexpected error code: %!", lerrno );
+                break;
+            }
+
+            return 0;
+        }
+
+        self -> pos += count;
+        break;
+    }
+
+    return count;
+}
+
+static KFile_vt_v2 vtKStdIOStream =
+{
+    /* version 1.1 */
+    2, 0,
+
+    /* start minor version 0 methods */
+    KStdIOFileDestroy_v2,
+    KSysFileGetSysFile_v2,
+    KStdIOFileRandomAccess_v2,
+    KStdIOFileSize_v2,
+    KStdIOFileSetSize_v2,
+    KStdIOFileRead_v2,
+    KStdIOFileWrite_v2,
+    KSysFileType_v2
+    /* end minor version 0 methods */
+};
+
+static
+void KStdIOFileTest_v2 ( ctx_t ctx, int fd, bool *seekable, bool *readable, bool *writable )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcCreating );
+
+    int lerrno;
+    struct stat st;
+
+    if ( fstat ( fd, & st ) == 0 )
+    {
+        int fl;
+
+        if ( S_ISREG ( st . st_mode ) )
+            * seekable = true;
+        else
+            * seekable = false;
+
+        fl = fcntl ( fd, F_GETFL ) & O_ACCMODE;
+        switch ( fl )
+        {
+        case O_RDONLY:
+            * readable = true;
+            * writable = false;
+            break;
+        case O_WRONLY:
+            * readable = false;
+            * writable = true;
+            break;
+        case O_RDWR:
+            * readable = true;
+            * writable = true;
+            break;
+        }
+    }
+    else switch ( lerrno = errno )
+    {
+    case EBADF:
+        USER_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", fd );
+        break;
+    default:
+        USER_ERROR ( xcErrorUnknown, "unexpected error code: %!", lerrno );
+        break;
+    }
+}
+
+static
+KFile_v2 * KStdIOFileMake_v2 ( ctx_t ctx, int fd, bool seekable, bool read_enabled, bool write_enabled )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcConstructing );
+
+
+    if ( seekable )
+    {
+        /* a seekable fd means it can be treated like a normal file */
+
+        // !!! not sure if the cast is correct, or if the function needs to return a different type
+        return ( KFile_v2 * ) KSysFileMakeVT_v2 ( ctx, fd, ( const KFile_vt * ) & vtKStdIOFile,
+            "stdio-file", read_enabled, write_enabled );
+    }
+
+    if ( fd < 0 )
+        USER_ERROR ( xcFileDescInvalid, "bad file descriptor error fd = %d", fd );
+    else
+    {
+        KStdIOFile_v2 *f;
+        /* create a streamable version */
+        f = calloc ( sizeof *f, 1 );
+        if ( f == NULL )
+            SYSTEM_ERROR ( xcNoMemory, "out of memory" );
+        else
+        {
+#if USE_TIMEOUT
+            if ( ( KSysFileTimeout >= 0 )
+#if USE_NO_TIMEOUT_TTY
+                 && ( ! isatty ( fd ) )
+#endif
+                )
+            {
+                KSysFile_v2 *ff = &f -> dad;
+                
+                ff -> to.tv_sec = KSysFileTimeout / 1000;
+                ff -> to.tv_usec = ( KSysFileTimeout % 1000 ) * 1000;
+                ff -> use_to = true;
+                FD_ZERO ( &ff -> fds );
+                FD_SET ( fd, &ff -> fds );
+            }
+#endif
+            TRY ( KFileInit_v2 ( &f -> dad . dad, ctx, ( const KFile_vt * ) &vtKStdIOStream,
+                                "KStdIOFile", "fd", read_enabled, write_enabled ) )
+            {
+                f -> dad . fd = fd;
+                f -> pos = 0;
+                return & f -> dad . dad;
+            }
+
+            free ( f );
+        }
+    }
+    return NULL;
+}
+
+/* MakeStdIn
+ *  creates a read-only file on stdin
+ */
+LIB_EXPORT const KFile_v2 * CC KFileMakeStdIn_v2 ( ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcConstructing );
+
+    bool seekable, readable, writable;
+
+    TRY ( KStdIOFileTest_v2 ( ctx, 0, & seekable, & readable, & writable ) )
+    {
+        if ( ! readable )
+            USER_ERROR ( xcFileWriteOnly, "file descriptor 0 is write only!" );
+        else
+            return KStdIOFileMake_v2 ( ctx, 0, seekable, true, false );
+    }
+
+    return NULL;
+
+#if 0
+    TRY ( KStdIOFileTest_v2 ( ctx, 0, & seekable, & readable, & writable ) )
+    {
+        if ( ! readable )
+            USER_ERROR ( xcFileWriteOnly, "file descriptor 0 is write only!" );
+        
+        return KStdIOFileMake_v2 ( 0, seekable, true, false );
+    }
+
+    return NULL;
+#endif
+}
+
+/* MakeStdOut
+ * MakeStdErr
+ *  creates a write-only file on stdout or stderr
+ */
+LIB_EXPORT const KFile_v2 * CC KFileMakeStdOut_v2 ( ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcConstructing );
+
+    bool seekable, readable, writable;
+
+    TRY ( KStdIOFileTest_v2 ( ctx, 1, & seekable, & readable, & writable ) )
+    {
+        if ( ! writable ) // !!! Should this return NULL here or is it ok to continue?
+            USER_ERROR ( xcFileReadOnly, "file descriptor 1 is read only!" );
+
+        return KStdIOFileMake_v2 ( ctx, 1, seekable, false, true );
+    }
+
+    return NULL;
+}
+
+LIB_EXPORT const KFile_v2 * CC KFileMakeStdErr_v2 ( ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcConstructing );
+
+    bool seekable, readable, writable;
+
+    TRY ( KStdIOFileTest_v2 ( ctx, 2, & seekable, & readable, & writable ) )
+    {
+        if ( ! writable )
+            USER_ERROR ( xcFileReadOnly, "file descriptor 2 is read only!" );
+
+        return KStdIOFileMake_v2 ( ctx, 2, seekable, false, true );
+    } 
+
+    return NULL;
+}
+
+/* MakeFDFile
+ *  creates a file from a file-descriptor
+ *  not supported under Windows
+ */
+LIB_EXPORT const KFile_v2 * CC KFileMakeFDFileRead_v2 ( ctx_t ctx, int fd )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcConstructing );
+
+    bool seekable, readable, writable;
+
+    TRY ( KStdIOFileTest_v2 ( ctx, fd, & seekable, & readable, & writable ) )
+    {
+        if ( ! readable )
+            USER_ERROR ( xcFileWriteOnly, "file descriptor is write only!" );
+
+        return KStdIOFileMake_v2 ( ctx, fd, seekable, true, false );
+    }
+
+    return NULL;
+}
+
+LIB_EXPORT  KFile_v2 * CC KFileMakeFDFileWrite_v2 ( ctx_t ctx, bool update, int fd )
+{
+    FUNC_ENTRY ( ctx, rcFS, rcFile, rcConstructing );
+
+    bool seekable, readable, writable;
+
+    TRY ( KStdIOFileTest_v2 ( ctx, fd, & seekable, & readable, & writable ) )
+    {
+        if ( update && ! readable )
+            USER_ERROR ( xcFileWriteOnly, "file descriptor is write only!" );
+        if ( ! writable )
+            USER_ERROR ( xcFileReadOnly, "file descriptor 2 is read only!" );
+
+        return KStdIOFileMake_v2 ( ctx, fd, seekable, update, true );
+    }
+
+    return NULL;
+}
diff --git a/libs/kfs/unix/sysfile.c b/libs/kfs/unix/sysfile.c
new file mode 100644
index 0000000..ace186d
--- /dev/null
+++ b/libs/kfs/unix/sysfile.c
@@ -0,0 +1,1079 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KSysFile_v1;
+#define KFILE_IMPL struct KSysFile_v1
+
+#include <kfs/extern.h>
+#include "sysfile-priv.h"
+#include <kfs/kfs-priv.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <sysalloc.h>
+
+
+#ifndef __USE_UNIX98
+#define __USE_UNIX98 1
+#endif
+#include <unistd.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <assert.h>
+#include <string.h>
+
+#ifdef _DEBUGGING
+#define SYSDEBUG(msg) DBGMSG(DBG_KFS,DBG_FLAG(DBG_KFS_SYS),msg)
+#define POS_DEBUG(msg) DBGMSG(DBG_KFS,DBG_FLAG(DBG_KFS_POS),msg)
+#else
+#define SYSDEBUG(msg)
+#define POS_DEBUG(msg)
+#endif
+
+/*--------------------------------------------------------------------------
+ * KSysFile
+ *  a Unix file
+ */
+
+
+#if USE_TIMEOUT
+/* default timeout amount 3 seconds is 10,000 milliseconds */
+#define TIMEOUT_MSECS (3 * 1000)
+
+int32_t KSysFileTimeout = TIMEOUT_MSECS;
+
+enum
+{
+    select_read = 1,
+    select_write = 2,
+    select_exception = 4
+} select_operations;
+
+static
+rc_t KSysFileSelect_v1 (const KSysFile_v1* self, uint32_t operations)
+{
+    rc_t rc = 0;
+
+    SYSDEBUG(( "%s: Enter (%p, %x)\n", __func__, self, operations));
+
+
+    if (self->use_to)
+    {
+        fd_set fdsread;
+        fd_set fdswrite;
+        fd_set fdsexcept;
+        struct timeval to;
+        int selected;
+
+        fdsread = self->fds;
+        fdswrite = self->fds;
+        fdsexcept = self->fds;
+
+        to = self->to;
+
+        for (rc = 0; rc == 0; ) 
+        {
+            SYSDEBUG(( "%s: call select\n", __func__));
+
+            selected = select (self->fd + 1, 
+                               (operations & select_read) ? &fdsread : NULL,
+                               (operations & select_write) ? &fdswrite : NULL,
+                               (operations & select_exception) ? &fdsexcept : NULL,
+                               &to);
+            SYSDEBUG(( "%s: select returned '%d' \n", __func__, selected));
+
+            if (selected == 0)
+            {
+
+                rc = RC (rcFS, rcFile, rcSelecting, rcTimeout, rcDone);
+            }
+            else if (selected < 0)
+            {
+                int lerrno = errno;
+
+                switch (lerrno)
+                {
+                case EINVAL:
+                    rc = RC (rcFS, rcFile, rcSelecting, rcTimeout, rcInvalid);
+                    LOGERR (klogInt, rc, "coding error bad timeout or negative nfds");
+                    break;
+
+                case EBADF:
+                    rc = RC ( rcFS, rcFile, rcSelecting, rcFileDesc, rcInvalid );
+                    PLOGERR (klogErr,
+                             (klogErr, rc, "system bad file descriptor error fd='$(E)'",
+                              "E=%d", self->fd));
+                    break;
+
+                case EINTR:/*  A signal was caught. */
+                    continue;
+
+                case ENOMEM:
+                    rc = RC (rcFS, rcFile, rcSelecting, rcMemory, rcExhausted);
+                    LOGERR (klogErr, rc, "out of memory setting up read timeout");
+                    break;
+                }
+                /* function documentation seems to show that unless EINTR was 
+                 * set we can now do our read
+                 */
+            }
+            else
+            {
+                assert (FD_ISSET (self->fd, &fdsread) ||
+                        FD_ISSET (self->fd, &fdswrite) ||
+                        FD_ISSET (self->fd, &fdsexcept));
+
+                return 0;
+            }
+        }
+    }
+    return rc;
+}
+#endif
+
+
+/* Destroy
+ */
+static
+rc_t KSysFileDestroy_v1 ( KSysFile_v1 *self )
+{
+    rc_t rc = 0;
+    int lerrno;
+
+    if ( close ( self -> fd ) != 0 ) switch ( lerrno = errno )
+    {
+    case EBADF:
+        rc = RC ( rcFS, rcFile, rcDestroying, rcFunction, rcIncomplete );
+        PLOGERR (klogInt,
+                 (klogInt, rc, "system bad file descriptor error '$(F)'",
+                  "F=%d", self->fd));
+        break;
+
+    case EINTR:
+        rc = RC ( rcFS, rcFile, rcDestroying, rcFunction, rcIncomplete );
+        LOGERR (klogErr, rc, "system interrupted function error");
+        return rc;
+
+    default:
+        rc = RC ( rcFS, rcFile, rcDestroying, rcNoObj, rcUnknown );
+        PLOGERR (klogErr,
+                 (klogErr, rc, "unknown system error '$(S)($(E))'",
+                 "S=%!,E=%d", lerrno, lerrno));
+        return rc;
+    }
+
+    free ( self );
+    return 0;
+}
+
+/* GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ */
+static
+KSysFile_v1 * KSysFileGetSysFile_v1 ( const KSysFile_v1 *self, uint64_t *offset )
+{
+    * offset = 0;
+    return ( KSysFile_v1 * ) self;
+}
+
+/* RandomAccess
+ *  ALMOST by definition, the file is random access
+ *  certain file types ( notably compressors ) will refuse random access
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t KSysFileRandomAccess_v1 ( const KSysFile_v1 *self )
+{
+    struct stat st;
+    rc_t rc = 0;
+    int lerrno;
+    if ( fstat ( self -> fd, & st ) != 0 ) switch ( lerrno = errno )
+    {
+    case EBADF:
+        rc = RC ( rcFS, rcFile, rcAccessing, rcFileDesc, rcInvalid );
+        PLOGERR (klogErr,
+                 (klogErr, rc, "system bad file descriptor error fd='$(F)'",
+                  "F=%d", self->fd));
+        return rc;
+
+    default:
+        rc = RC ( rcFS, rcFile, rcAccessing, rcNoObj, rcUnknown );
+        PLOGERR (klogErr,
+                 (klogErr, rc, "unknown system error '$(F)($(E))'",
+                  "F=%!,E=%d", lerrno, lerrno));
+        return rc;
+    }
+
+    if ( ! S_ISREG ( st . st_mode ) )
+    {
+        rc = RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+        /* not a deadly error so don't log now         
+        LOGERR (klogErr, (klogErr, rc, ""));
+        */
+        return rc;
+    }
+    return 0;
+}
+
+
+/* Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t KSysFileType_v1 ( const KSysFile_v1 *self )
+{
+    struct stat st;
+
+    if ( fstat ( self -> fd, & st ) != 0 )
+        return kfdInvalid;
+
+    if ( ! S_ISREG ( st . st_mode ) )
+    {
+        if ( S_ISCHR ( st . st_mode ) )
+            return kfdCharDev;
+        if ( S_ISBLK ( st . st_mode ) )
+            return kfdBlockDev;
+        if ( S_ISFIFO ( st . st_mode ) )
+            return kfdFIFO;
+        if ( S_ISSOCK ( st . st_mode ) )
+            return kfdSocket;
+    }
+
+    return kfdFile;
+}
+
+
+/* Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t KSysFileSize_v1 ( const KSysFile_v1 *self, uint64_t *size )
+{
+    struct stat st;
+    rc_t rc = 0;
+    int lerrno;
+
+    if ( fstat ( self -> fd, & st ) != 0 ) switch ( lerrno = errno )
+    {
+    case EBADF:
+        rc = RC ( rcFS, rcFile, rcAccessing, rcFileDesc, rcInvalid );
+        PLOGERR (klogInt,
+                 (klogInt, rc, "system bad file descriptor error fd='$(F)'",
+                  "F=%d", self->fd));
+        return rc;
+    default:
+        rc = RC ( rcFS, rcFile, rcAccessing, rcNoObj, rcUnknown );
+        PLOGERR (klogErr,
+                 (klogErr, rc, "unknown system error '$(F)($(E))'",
+                  "F=%!,E=%d", lerrno, lerrno));
+        return rc;
+    }
+
+    if ( S_ISDIR ( st . st_mode ) )
+/*         return RC ( rcFS, rcFile, rcAccessing, rcFileDesc, rcIncorrect ); */
+        return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+
+    * size = st . st_size;
+
+    return 0;
+}
+
+/* SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t KSysFileSetSize_v1 ( KSysFile_v1 *self, uint64_t size )
+{
+    rc_t rc;
+    int lerrno;
+
+    if ( ftruncate ( self -> fd, size ) != 0 ) switch ( lerrno = errno )
+    {
+    case EBADF:
+        rc = RC ( rcFS, rcFile, rcUpdating, rcFileDesc, rcInvalid );
+        PLOGERR (klogInt,
+                (klogInt, rc, "system bad file descriptor error fd='$(E)'",
+                 "E=%d", self->fd));
+        return rc;
+    default:
+        rc = RC ( rcFS, rcFile, rcUpdating, rcNoObj, rcUnknown );
+        PLOGERR (klogErr,
+                 (klogErr, rc, "unknown system error '$(S)($(E))'",
+                  "S=%!,E=%d", lerrno, lerrno));
+        return rc;
+    }
+
+    return 0;
+}
+
+/* Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t KSysFileRead_v1 ( const KSysFile_v1 *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+
+    assert ( self != NULL );
+    assert (num_read != NULL);
+
+    *num_read = 0;
+
+    while ( 1 )
+    {
+        ssize_t count;
+        int lerrno;
+
+#if USE_TIMEOUT
+        rc = KSysFileSelect_v1 ( self, select_read | select_exception );
+        if (rc)
+            return rc;
+#endif
+
+#ifdef _DEBUGGING
+        {
+            POS_DEBUG( ( "%s,%lu,%lu\n", KDbgGetColName(), pos, bsize ) );
+        }
+#endif
+
+        count = pread ( self -> fd, buffer, bsize, pos );
+
+        if ( count < 0 ) switch ( lerrno = errno )
+        {
+        case EINTR:
+            continue;
+        case EIO:
+            rc = RC ( rcFS, rcFile, rcReading, rcTransfer, rcUnknown );
+            LOGERR (klogErr, rc, "system I/O error - likely broken pipe");
+            return rc;
+
+        case EBADF:
+            rc = RC ( rcFS, rcFile, rcReading, rcFileDesc, rcInvalid );
+            PLOGERR (klogErr,
+                     (klogErr, rc, "system bad file descriptor error fd='$(E)'",
+                      "E=%d", self->fd));
+            return rc;
+
+        case EISDIR:
+            rc = RC ( rcFS, rcFile, rcReading, rcFileDesc, rcIncorrect );
+            LOGERR (klogErr, rc, "system misuse of a directory error");
+            return rc;
+
+        case EINVAL:
+            rc = RC ( rcFS, rcFile, rcReading, rcParam, rcInvalid );
+            LOGERR (klogErr, rc, "system invalid argument error");
+            return rc;
+
+        default:
+            rc = RC ( rcFS, rcFile, rcReading, rcNoObj, rcUnknown );
+            PLOGERR (klogErr,
+                     (klogErr, rc, "unknown system error '$(S)($(E))'",
+                      "S=%!,E=%d", lerrno, lerrno));
+            return rc;
+        }
+
+        assert ( num_read != NULL );
+        * num_read = count;
+        break;
+    }
+
+    return 0;
+}
+
+/* Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+static
+rc_t KSysFileWrite_v1 ( KSysFile_v1 *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ)
+{
+    assert ( self != NULL );
+    while ( 1 )
+    {
+        rc_t rc;
+        int lerrno;
+        ssize_t count;
+
+#if USE_TIMEOUT
+        rc = KSysFileSelect_v1 (self, select_write | select_exception);
+        if (rc)
+            return rc;
+#endif
+
+        count = pwrite ( self -> fd, buffer, size, pos );
+
+        if ( count < 0 ) switch ( lerrno = errno )
+        {
+        case ENOSPC:
+            rc = RC ( rcFS, rcFile, rcWriting, rcStorage, rcExhausted );
+            PLOGERR (klogErr,
+                     (klogErr, rc, "system bad file descriptor error fd='$(E)'",
+                      "E=%d", self->fd));
+            return rc;
+
+        case EINTR:
+            continue;
+
+        case EFBIG:
+            rc = RC ( rcFS, rcFile, rcWriting, rcFile, rcExcessive );
+            LOGERR (klogErr, rc, "system file too large error");
+            return rc;
+
+        case EIO:
+            rc = RC ( rcFS, rcFile, rcWriting, rcTransfer, rcUnknown );
+            LOGERR (klogErr, rc, "system I/O error");
+            return rc;
+
+        case EBADF:
+            rc = RC ( rcFS, rcFile, rcWriting, rcFileDesc, rcInvalid );
+            PLOGERR (klogErr,
+                     (klogErr, rc, "system bad file descriptor error fd='$(E)'",
+                      "E=%d", self->fd));
+            return rc;
+
+        case EISDIR:
+            rc = RC ( rcFS, rcFile, rcWriting, rcFileDesc, rcIncorrect );
+            LOGERR (klogErr, rc, "system misuse of a directory error");
+            return rc;
+
+        case EINVAL:
+            rc = RC ( rcFS, rcFile, rcWriting, rcParam, rcInvalid );
+            LOGERR (klogErr, rc, "system invalid argument error");
+            return rc;
+
+        default:
+            rc = RC ( rcFS, rcFile, rcWriting, rcNoObj, rcUnknown );
+            PLOGERR (klogErr,
+                     (klogErr, rc, "unknown system error errno='$(S)($(E))'",
+                      "S=%!,E=%d", lerrno, lerrno));
+            return rc;
+        }
+
+        assert ( num_writ != NULL );
+        * num_writ = count;
+        break;
+    }
+
+    return 0;
+}
+
+
+/* Make
+ *  create a new file object
+ *  from file descriptor
+ */
+static KFile_vt_v1 vtKSysFile =
+{
+    /* version 1.1 */
+    1, 1,
+
+    /* start minor version 0 methods */
+    KSysFileDestroy_v1,
+    KSysFileGetSysFile_v1,
+    KSysFileRandomAccess_v1,
+    KSysFileSize_v1,
+    KSysFileSetSize_v1,
+    KSysFileRead_v1,
+    KSysFileWrite_v1,
+    /* end minor version 0 methods */
+
+    /* start minor version == 1 */
+    KSysFileType_v1
+    /* end minor version == 1 */
+};
+
+static
+rc_t KSysFileMakeVT ( KSysFile_v1 **fp, int fd, const KFile_vt *vt,
+    const char *path, bool read_enabled, bool write_enabled )
+{
+    rc_t rc;
+    KSysFile_v1 *f;
+
+    if ( fd < 0 )
+    {
+        rc = RC ( rcFS, rcFile, rcConstructing, rcFileDesc, rcInvalid );
+        PLOGERR (klogInt,
+                 (klogInt, rc, "invalid file descriptor $(F)",
+                  "F=%d", fd));
+        return rc;
+    }
+
+    f = calloc ( sizeof * f, 1 );
+    if ( f == NULL )
+    {
+        rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+        LOGERR (klogErr, rc, "out of memory");
+        return rc;
+    }
+    else
+    {
+#if USE_TIMEOUT
+        if (KSysFileTimeout >= 0)
+        {
+            f->to.tv_sec = KSysFileTimeout / 1000;
+            f->to.tv_usec = (KSysFileTimeout % 1000) * 1000;
+            f->use_to = true;
+            FD_ZERO (&f->fds);
+            FD_SET (fd, &f->fds);
+        }
+#endif
+
+        rc = KFileInit_v1( & f -> dad, vt, "KSysFile", path, read_enabled, write_enabled );
+        if ( rc == 0 )
+        {
+            f -> fd = fd;
+            * fp = f;
+            return 0;
+        }
+
+        free ( f );
+    }
+    return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * KFile
+ *  Unix-specific standard i/o interfaces
+ */
+
+typedef struct KStdIOFile KStdIOFile;
+struct KStdIOFile
+{
+    KSysFile_v1 dad;
+    uint64_t pos;
+};
+
+
+/* Destroy
+ *  does not close fd
+ */
+static
+rc_t KStdIOFileDestroy ( KSysFile_v1*self )
+{
+    free ( self );
+    return 0;
+}
+
+static KFile_vt_v1 vtKStdIOFile =
+{
+    /* version 1.1 */
+    1, 1,
+
+    /* start minor version 0 methods */
+    KStdIOFileDestroy,
+    KSysFileGetSysFile_v1,
+    KSysFileRandomAccess_v1,
+    KSysFileSize_v1,
+    KSysFileSetSize_v1,
+    KSysFileRead_v1,
+    KSysFileWrite_v1,
+    /* end minor version 0 methods */
+
+    /* start minor version == 1 */
+    KSysFileType_v1
+    /* end minor version == 1 */
+};
+
+/* RandomAccess
+ */
+static
+rc_t KStdIOFileRandomAccess ( const KSysFile_v1 *self )
+{
+/*     return RC ( rcFS, rcFile, rcAccessing, rcFileDesc, rcIncorrect ); */
+    return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+}
+
+
+/* Size
+ */
+static
+rc_t KStdIOFileSize ( const KSysFile_v1 *self, uint64_t *size )
+{
+    * size = 0;
+
+/*     return RC ( rcFS, rcFile, rcAccessing, rcFileDesc, rcIncorrect ); */
+    return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+}
+
+/* SetSize
+ */
+static
+rc_t KStdIOFileSetSize ( KSysFile_v1 *self, uint64_t size )
+{
+/*     return RC ( rcFS, rcFile, rcUpdating, rcFileDesc, rcIncorrect ); */
+    return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+}
+
+/* Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t KStdIOFileRead ( const KSysFile_v1 *dad, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+
+    KStdIOFile *self = ( KStdIOFile* ) dad;
+    assert ( self != NULL );
+
+    if ( self -> pos != pos )
+    {
+        rc = RC ( rcFS, rcFile, rcReading, rcParam, rcInvalid );
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Bad position for STDIO read $(P) instead of $(O)",
+                  "P=%lu,O=%lu", pos, self->pos));
+        return rc;
+    }
+
+    while ( 1 )
+    {
+        ssize_t count;
+        int lerrno;
+
+#if USE_TIMEOUT
+        rc = KSysFileSelect_v1 (&self->dad, select_read | select_exception);
+        if (rc)
+            return rc;
+#endif
+
+        count = read ( self -> dad . fd, buffer, bsize );
+
+        if ( count < 0 ) switch ( lerrno = errno )
+        {
+        case EINTR:
+            continue;
+
+        case EIO:
+            rc = RC ( rcFS, rcFile, rcReading, rcTransfer, rcUnknown );
+            LOGERR (klogErr, rc, "system I/O error - broken pipe");
+            return rc;
+
+        case EBADF:
+            rc = RC ( rcFS, rcFile, rcReading, rcFileDesc, rcInvalid );
+            PLOGERR (klogInt,
+                     (klogInt, rc, "system bad file descriptor fd='$(E)'",
+                      "E=%d", self->dad.fd));
+            return rc;
+
+        case EISDIR:
+            rc = RC ( rcFS, rcFile, rcReading, rcFileDesc, rcIncorrect );
+            LOGERR (klogInt, rc, "system misuse of a directory error");
+            return rc;
+
+        case EINVAL:
+            rc = RC ( rcFS, rcFile, rcReading, rcParam, rcInvalid );
+            LOGERR (klogErr, rc, "system invalid argument error");
+            return rc;
+
+        default:
+            rc = RC ( rcFS, rcFile, rcReading, rcNoObj, rcUnknown );
+            PLOGERR (klogErr,
+                     (klogErr, rc, "unknown system error '$(S)($(E))'",
+                      "S=%!,E=%d", lerrno, lerrno));
+            return rc;
+        }
+
+        assert ( num_read != NULL );
+        * num_read = count;
+        self -> pos += count;
+        break;
+    }
+
+    return 0;
+}
+
+/* Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+static
+rc_t KStdIOFileWrite ( KSysFile_v1 *dad, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ)
+{
+    rc_t rc;
+    KStdIOFile *self = ( KStdIOFile* ) dad;
+    assert ( self != NULL );
+
+    if ( self -> pos != pos )
+    {
+        rc = RC ( rcFS, rcFile, rcWriting, rcParam, rcInvalid );
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Bad position for STDIO write $(P) instead of $(O)",
+                  "P=%lu,O=%lu", pos, self->pos));
+        return rc;
+    }
+
+    while ( 1 )
+    {
+        int lerrno;
+        ssize_t count;
+
+#if USE_TIMEOUT
+        rc = KSysFileSelect_v1 ( &self->dad, select_read | select_exception);
+        if (rc)
+            return rc;
+#endif
+
+        count = write ( self -> dad . fd, buffer, size );
+
+        if ( count < 0 ) switch ( lerrno = errno )
+        {
+        case ENOSPC:
+            rc = RC ( rcFS, rcFile, rcWriting, rcStorage, rcExhausted );
+            LOGERR (klogErr, rc, "system device full error");
+            return rc;
+
+        case EINTR:
+            continue;
+
+        case EFBIG:
+            rc = RC ( rcFS, rcFile, rcWriting, rcFile, rcExcessive );
+            LOGERR (klogErr, rc, "system file too big error");
+            return rc;
+
+        case EIO:
+            rc = RC ( rcFS, rcFile, rcWriting, rcTransfer, rcUnknown );
+            LOGERR (klogErr, rc, "system I/O error - broken pipe");
+            return rc;
+            
+        case EBADF:
+            rc = RC ( rcFS, rcFile, rcWriting, rcFileDesc, rcInvalid );
+            PLOGERR (klogInt,
+                     (klogInt, rc, "system bad file descriptor error fd=$(F)",
+                      "F=%d", lerrno, self->dad.fd));
+            return rc;
+
+        case EINVAL:
+            rc = RC ( rcFS, rcFile, rcWriting, rcParam, rcInvalid );
+            LOGERR (klogInt, rc, "system invalid argument error");
+            return rc;
+
+        default:
+            rc = RC ( rcFS, rcFile, rcWriting, rcNoObj, rcUnknown );
+            PLOGERR (klogErr,
+                     (klogErr, rc, "unknown system error '$(S)($(E))'",
+                      "S=%!,E=%d", lerrno, lerrno));
+            return rc;
+        }
+
+        assert ( num_writ != NULL );
+        * num_writ = count;
+        self -> pos += count;
+        break;
+    }
+
+    return 0;
+}
+
+static KFile_vt_v1 vtKStdIOStream =
+{
+    /* version 1.1 */
+    1, 1,
+
+    /* start minor version 0 methods */
+    KStdIOFileDestroy,
+    KSysFileGetSysFile_v1,
+    KStdIOFileRandomAccess,
+    KStdIOFileSize,
+    KStdIOFileSetSize,
+    KStdIOFileRead,
+    KStdIOFileWrite,
+    /* end minor version 0 methods */
+
+    /* start minor version == 1 */
+    KSysFileType_v1
+    /* end minor version == 1 */
+};
+
+static
+rc_t KStdIOFileTest ( KFile_v1 **rp, int fd, bool *seekable, bool *readable, bool *writable )
+{
+    struct stat st;
+    int lerrno;
+    rc_t rc = 0;
+
+    if ( rp == NULL )
+        return RC ( rcFS, rcFile, rcCreating, rcParam, rcNull );
+
+    * rp = NULL;
+
+    if ( fstat ( fd, & st ) == 0 )
+    {
+        int fl;
+
+        if ( S_ISREG ( st . st_mode ) )
+            * seekable = true;
+        else
+            * seekable = false;
+
+        fl = fcntl ( fd, F_GETFL ) & O_ACCMODE;
+        switch (fl)
+        {
+        case O_RDONLY:
+            *readable = true;
+            *writable = false;
+            break;
+        case O_WRONLY:
+            *readable = false;
+            *writable = true;
+            break;
+        case O_RDWR:
+            *readable = true;
+            *writable = true;
+            break;
+        }
+    }
+    else switch (lerrno = errno)
+    {
+    case EBADF:
+        rc = RC ( rcFS, rcFile, rcCreating, rcFileDesc, rcInvalid );
+        PLOGERR (klogErr,
+                 (klogErr, rc, "system error bad file descriptor '$(F)'",
+                  "F=%d", fd));
+        break;
+    default:
+        rc = RC ( rcFS, rcFile, rcCreating, rcNoObj, rcUnknown );
+        PLOGERR (klogErr,
+                 (klogErr, rc, "unknown system error '$(F) ($(E))'",
+                  "F=%!,E=%d", lerrno, lerrno));
+        break;
+    }
+
+    return rc;
+}
+
+static
+rc_t KStdIOFileMake ( KFile_v1 **fp, int fd,
+    bool seekable, bool read_enabled, bool write_enabled )
+{
+    rc_t rc;
+    KStdIOFile *f;
+
+    if ( seekable )
+    {
+        return KSysFileMakeVT ( ( KSysFile_v1 ** ) fp, fd,
+            ( const KFile_vt * ) & vtKStdIOFile, "stdio-file", read_enabled, write_enabled );
+    }
+
+    if ( fd < 0 )
+    {
+        rc = RC ( rcFS, rcFile, rcConstructing, rcFileDesc, rcInvalid );
+        PLOGERR (klogInt,
+                 (klogInt, rc, "invalid file descriptor $(F)",
+                  "F=%d", fd));
+        return rc;
+    }
+    else
+    {
+        f = calloc ( sizeof *f, 1 );
+        if ( f == NULL )
+        {
+            rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            LOGERR (klogErr, rc, "out of memory");
+        }
+        else
+        {
+#if USE_TIMEOUT
+            if ((KSysFileTimeout >= 0)
+#if USE_NO_TIMEOUT_TTY
+                && (! isatty (fd)
+#endif
+                    )
+            {
+                KSysFile_v1 *ff = &f->dad;
+
+                ff->to.tv_sec = KSysFileTimeout / 1000;
+                ff->to.tv_usec = (KSysFileTimeout % 1000) * 1000;
+                ff->use_to = true;
+                FD_ZERO (&ff->fds);
+                FD_SET (fd, &ff->fds);
+            }
+#endif
+            rc = KFileInit_v1 ( &f->dad.dad, ( const KFile_vt * ) &vtKStdIOStream,
+                             "KStdIOFile", "fd", read_enabled, write_enabled );
+            if ( rc == 0 )
+            {
+                f -> dad . fd = fd;
+                f -> pos = 0;
+                * fp = & f -> dad . dad;
+                return 0;
+            }
+
+            free ( f );
+        }
+    }
+    return rc;
+}
+
+/* MakeStdIn
+ *  creates a read-only file on stdin
+ */
+LIB_EXPORT rc_t CC KFileMakeStdIn ( const KFile_v1 **std_in )
+{
+    bool seekable;
+    bool readable;
+    bool writable;
+    rc_t rc = KStdIOFileTest ( ( KFile_v1 ** ) std_in, 0, & seekable, & readable, & writable );
+    if ( rc != 0 )
+        return rc;
+    if ( ! readable )
+        return RC ( rcFS, rcFile, rcConstructing, rcFileDesc, rcWriteonly );
+
+    return KStdIOFileMake ( ( KFile_v1 ** ) std_in, 0, seekable, true, false );
+}
+
+/* MakeStdOut
+ * MakeStdErr
+ *  creates a write-only file on stdout or stderr
+ */
+LIB_EXPORT rc_t CC KFileMakeStdOut ( KFile_v1 **std_out )
+{
+    bool seekable;
+    bool readable;
+    bool writable;
+    rc_t rc = KStdIOFileTest ( std_out, 1, & seekable, & readable, & writable );
+    if ( rc != 0 )
+        return rc;
+    if ( ! writable )
+        return RC ( rcFS, rcFile, rcConstructing, rcFileDesc, rcReadonly );
+
+    return KStdIOFileMake ( std_out, 1, false, false, true );
+}
+
+LIB_EXPORT rc_t CC KFileMakeStdErr ( KFile_v1 **std_err )
+{
+    bool seekable;
+    bool readable;
+    bool writable;
+    rc_t rc = KStdIOFileTest ( std_err, 2, & seekable, & readable, & writable );
+    if ( rc != 0 )
+        return rc;
+    if ( ! writable )
+        return RC ( rcFS, rcFile, rcConstructing, rcFileDesc, rcReadonly );
+
+    return KStdIOFileMake ( std_err, 2, false, false, true );
+}
+
+/* MakeFDFile
+ *  creates a file from a file-descriptor
+ *  not supported under Windows
+ */
+LIB_EXPORT rc_t CC KFileMakeFDFileRead ( const KFile_v1 **f, int fd )
+{
+    bool seekable;
+    bool readable;
+    bool writable;
+    rc_t rc = KStdIOFileTest ( ( KFile_v1 ** ) f, fd, & seekable, & readable, & writable );
+    if ( rc != 0 )
+        return rc;
+    if ( ! readable )
+    {
+        rc = RC ( rcFS, rcFile, rcConstructing, rcFileDesc, rcWriteonly );
+        LOGERR (klogErr, rc, "error constructing read file from write only file descriptor");
+        return rc;
+    }
+    return KStdIOFileMake ( ( KFile** ) f, fd, seekable, true, false );
+}
+
+LIB_EXPORT rc_t CC KFileMakeFDFileWrite ( KFile_v1 **f, bool update, int fd )
+{
+    bool seekable;
+    bool readable;
+    bool writable;
+    rc_t rc = KStdIOFileTest ( f, fd, & seekable, & readable, & writable );
+    if ( rc != 0 )
+        return rc;
+    if ( update && ! readable )
+        return RC ( rcFS, rcFile, rcConstructing, rcFileDesc, rcWriteonly );
+    if ( ! writable )
+        return RC ( rcFS, rcFile, rcConstructing, rcFileDesc, rcReadonly );
+
+    return KStdIOFileMake ( f, fd, seekable, update, true );
+}
+
+LIB_EXPORT rc_t CC KSysFileMake ( KSysFile_v1 **fp, int fd, const char *path, bool read_enabled, bool write_enabled )
+{
+    bool seekable;
+    bool readable;
+    bool writable;
+    rc_t rc = KStdIOFileTest ( ( KFile** )fp, fd, & seekable, & readable, & writable );
+    if ( rc != 0 )
+        return rc;
+    if ( read_enabled && ! readable )
+        return RC ( rcFS, rcFile, rcConstructing, rcFileDesc, rcWriteonly );
+    if ( write_enabled && ! writable )
+        return RC ( rcFS, rcFile, rcConstructing, rcFileDesc, rcReadonly );
+    if (!seekable)
+        return KStdIOFileMake ( ( KFile** )fp, fd, false, read_enabled, write_enabled );
+    else
+        return KSysFileMakeVT ( fp, fd, ( const KFile_vt * ) & vtKSysFile,
+            path, read_enabled, write_enabled );
+}
diff --git a/libs/kfs/unix/syslockfile.c b/libs/kfs/unix/syslockfile.c
new file mode 100644
index 0000000..928d934
--- /dev/null
+++ b/libs/kfs/unix/syslockfile.c
@@ -0,0 +1,215 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+typedef struct KExclAccessFile KExclAccessFile;
+#define KFILE_IMPL KExclAccessFile
+
+#include <kfs/extern.h>
+#include <kfs/lockfile.h>
+#include <kfs/impl.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * KExclAccessFile
+ */
+struct KExclAccessFile
+{
+    KFile dad;
+    KLockFile *lock;
+    KFile *f;
+};
+
+static
+rc_t KExclAccessFileDestroy ( KExclAccessFile *self )
+{
+    rc_t rc = KFileRelease ( self -> f );
+    if ( rc == 0 )
+    {
+        KLockFileRelease ( self -> lock );
+        free ( self );
+    }
+    return rc;
+}
+
+static
+struct KSysFile *KExclAccessFileGetSysFile ( const KExclAccessFile *self, uint64_t *offset )
+{
+    return KFileGetSysFile ( self -> f, offset );
+}
+
+static
+rc_t KExclAccessFileRandomAccess ( const KExclAccessFile *self )
+{
+    return KFileRandomAccess ( self -> f );
+}
+
+static
+rc_t KExclAccessFileSize ( const KExclAccessFile *self, uint64_t *size )
+{
+    return KFileSize ( self -> f, size );
+}
+
+static
+rc_t KExclAccessFileSetSize ( KExclAccessFile *self, uint64_t size )
+{
+    return KFileSetSize ( self -> f, size );
+}
+
+static
+rc_t KExclAccessFileRead ( const KExclAccessFile *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    return KFileRead ( self -> f, pos, buffer, bsize, num_read );
+}
+
+static
+rc_t KExclAccessFileWrite ( KExclAccessFile *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    return KFileWrite ( self -> f, pos, buffer, size, num_writ );
+}
+
+static
+uint32_t KExclAccessFileType ( const KExclAccessFile * self )
+{
+    return KFileType ( self -> f );
+}
+
+static KFile_vt_v1 KExclAccessFile_vt =
+{
+    1, 1,
+
+    KExclAccessFileDestroy,
+    KExclAccessFileGetSysFile,
+    KExclAccessFileRandomAccess,
+    KExclAccessFileSize,
+    KExclAccessFileSetSize,
+    KExclAccessFileRead,
+    KExclAccessFileWrite,
+    KExclAccessFileType
+};
+
+static
+rc_t KExclAccessFileMake ( KExclAccessFile **fp, KLockFile *lock, KFile *f )
+{
+    rc_t rc;
+    KExclAccessFile *xf = malloc ( sizeof * xf );
+    if ( xf == NULL )
+        rc = RC ( rcFS, rcFile, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KFileInit ( & xf -> dad, ( const KFile_vt* ) & KExclAccessFile_vt,
+            "KExclAccessFile", "no-name", f -> read_enabled, f -> write_enabled );
+        if ( rc == 0 )
+        {
+            xf -> lock = lock;
+            xf -> f = f;
+            * fp = xf;
+            return 0;
+        }
+
+        free ( xf );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ *  interface extensions
+ */
+
+
+/* CreateExclusiveAccessFile
+ *  opens a file with exclusive write access
+ *
+ *  "fp" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC KDirectoryVCreateExclusiveAccessFile ( KDirectory *self, KFile **fp,
+    bool update, uint32_t access, KCreateMode mode, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( fp == NULL )
+        rc = RC ( rcFS, rcFile, rcLocking, rcParam, rcNull );
+    else
+    {
+        /* create the path */
+        char full [ 4096 ];
+        rc = KDirectoryVResolvePath ( self, true, full, sizeof full, path, args );
+        if ( rc == 0 )
+        {
+            KLockFile *lock;
+
+            /* acquire the lock */
+            rc = KDirectoryCreateLockFile ( self, & lock, "%s.lock", full );
+            if ( rc == 0 )
+            {
+                KFile *f;
+
+                /* create the file */
+                rc = KDirectoryCreateFile ( self, & f, update, access, mode, "%s", full );
+                if ( rc == 0 )
+                {
+                    KExclAccessFile *xf;
+
+                    /* wrap the file */
+                    rc = KExclAccessFileMake ( & xf, lock, f );
+                    if ( rc == 0 )
+                    {
+                        * fp = & xf -> dad;
+                        return 0;
+                    }
+
+                    KFileRelease ( f );
+                }
+
+                KLockFileRelease ( lock );
+            }
+        }
+
+        * fp = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/kfs/unix/sysmmap-priv.h b/libs/kfs/unix/sysmmap-priv.h
new file mode 100644
index 0000000..639c9a3
--- /dev/null
+++ b/libs/kfs/unix/sysmmap-priv.h
@@ -0,0 +1,68 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sysmmap_priv_
+#define _h_sysmmap_priv_
+
+#ifndef _h_mmap_priv_
+#include "../mmap-priv.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KMMap
+ *  a memory mapped region
+ */
+struct KMMap
+{
+    uint64_t off;
+    uint64_t pos;
+    size_t size;
+    char *addr;
+
+    KFile *f;
+    size_t pg_size;
+
+    uint32_t addr_adj;
+    uint32_t size_adj;
+
+    KRefcount refcount;
+
+    bool read_only;
+    bool sys_mmap;
+    bool dirty;
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sysmmap_priv_ */
diff --git a/libs/kfs/unix/sysmmap.c b/libs/kfs/unix/sysmmap.c
new file mode 100644
index 0000000..21bb985
--- /dev/null
+++ b/libs/kfs/unix/sysmmap.c
@@ -0,0 +1,143 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "sysmmap-priv.h"
+#include "sysfile-priv.h"
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <errno.h>
+
+
+/*--------------------------------------------------------------------------
+ * KMMap
+ *  a memory mapped region
+ */
+
+/* Make
+ */
+rc_t KMMapMake ( KMMap **mmp )
+{
+    KMMap *mm = calloc ( 1, sizeof * mm );
+    if ( mm == NULL )
+        return RC ( rcFS, rcMemMap, rcConstructing, rcMemory, rcExhausted );
+    
+    mm -> pg_size = sysconf ( _SC_PAGE_SIZE );
+
+    * mmp = mm;
+
+    return 0;
+}
+
+
+/* RWSys
+ */
+rc_t KMMapRWSys ( KMMap *self, uint64_t pos, size_t size )
+{
+    KSysFile *sf = KFileGetSysFile ( self -> f, & self -> off );
+    if ( sf == NULL )
+        return RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcIncorrect );
+
+    self -> addr = mmap ( 0, size,
+        PROT_READ | PROT_WRITE, MAP_SHARED, sf -> fd, pos );
+    if ( self -> addr != ( char* ) MAP_FAILED )
+        return 0;
+
+    switch ( errno )
+    {
+    case EBADF:
+        return RC ( rcFS, rcMemMap, rcConstructing, rcFileDesc, rcInvalid );
+    case EACCES:
+        return RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcNoPerm );
+    case ETXTBSY:
+    case ENODEV:
+        return RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcInvalid );
+    case EAGAIN:
+        return RC ( rcFS, rcMemMap, rcConstructing, rcFunction, rcIncomplete );
+    case ENOMEM:
+        return RC ( rcFS, rcMemMap, rcConstructing, rcMemory, rcExhausted );
+    }
+
+    return RC ( rcFS, rcMemMap, rcConstructing, rcNoObj, rcUnknown );
+}
+
+
+/* ROSys
+ */
+rc_t KMMapROSys ( KMMap *self, uint64_t pos, size_t size )
+{
+    KSysFile *sf = KFileGetSysFile ( self -> f, & self -> off );
+    if ( sf == NULL )
+        return RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcIncorrect );
+
+    self -> addr = mmap ( 0, size,
+        PROT_READ, MAP_SHARED, sf -> fd, pos );
+    if ( self -> addr != ( char* ) MAP_FAILED )
+        return 0;
+
+    switch ( errno )
+    {
+    case EBADF:
+        return RC ( rcFS, rcMemMap, rcConstructing, rcFileDesc, rcInvalid );
+    case EACCES:
+        return RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcNoPerm );
+    case ETXTBSY:
+    case ENODEV:
+        return RC ( rcFS, rcMemMap, rcConstructing, rcFile, rcInvalid );
+    case EAGAIN:
+        return RC ( rcFS, rcMemMap, rcConstructing, rcFunction, rcIncomplete );
+    case ENOMEM:
+        return RC ( rcFS, rcMemMap, rcConstructing, rcMemory, rcExhausted );
+    }
+
+    return RC ( rcFS, rcMemMap, rcConstructing, rcNoObj, rcUnknown );
+}
+
+
+/* Unmap
+ *  removes a memory map
+ */
+rc_t KMMapUnmap ( KMMap *self )
+{
+    if ( self -> size != 0 )
+    {
+        if ( munmap ( self -> addr - self -> addr_adj,
+                 self -> size + self -> size_adj ) )
+        {
+            if ( errno != EINVAL )
+                return RC ( rcFS, rcMemMap, rcDestroying, rcNoObj, rcUnknown );
+        }
+
+        self -> addr = NULL;
+        self -> size = 0;
+    }
+
+    return 0;
+}
diff --git a/libs/klib/.gitignore b/libs/klib/.gitignore
new file mode 100644
index 0000000..c253038
--- /dev/null
+++ b/libs/klib/.gitignore
@@ -0,0 +1 @@
+*.def
diff --git a/libs/klib/Judy.h b/libs/klib/Judy.h
new file mode 100644
index 0000000..b844e0a
--- /dev/null
+++ b/libs/klib/Judy.h
@@ -0,0 +1,635 @@
+#ifndef _JUDY_INCLUDED
+#define _JUDY_INCLUDED
+/*
+// _________________
+//
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+//
+// HEADER FILE FOR EXPORTED FEATURES IN JUDY LIBRARY, libJudy.*
+//
+// See the manual entries for details.
+//
+// Note:  This header file uses old-style comments on #-directive lines and
+// avoids "()" on macro names in comments for compatibility with older cc -Aa
+// and some tools on some platforms.
+
+
+// PLATFORM-SPECIFIC
+*/
+
+#if __SIZEOF_POINTER__*__CHAR_BIT__ == 64
+#define JU_64BIT 1
+#else
+#define JU_32BIT 1
+#endif
+
+#if ! JUST_DEFINE_YOUR_STUFF
+
+#ifdef JU_WIN /* =============================================== */
+
+typedef __int8           int8_t;
+typedef __int16          int16_t;
+typedef __int32          int32_t;
+typedef __int64          int64_t;
+
+typedef unsigned __int8  uint8_t;
+typedef unsigned __int16 uint16_t;
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int64 uint64_t;
+
+#else /* ================ ! JU_WIN ============================= */
+
+/* ISO C99: 7.8 Format conversion of integer types <inttypes.h> */
+/*#include <inttypes.h>   if this FAILS, try #include <stdint.h> */ 
+
+/* ISO C99: 7.18 Integer types uint*_t */
+#include <stdint.h> 
+
+#endif /* ================ ! JU_WIN ============================= */
+
+/* ISO C99 Standard: 7.20 General utilities */
+#include <stdlib.h>  
+
+/* ISO C99 Standard: 7.10/5.2.4.2.1 Sizes of integer types */
+#include <limits.h>
+
+#endif /* JUST_DEFINE_YOUR_STUFF */
+
+#ifdef __cplusplus      /* support use by C++ code */
+extern "C" {
+#endif
+
+
+/* ****************************************************************************
+// DECLARE SOME BASE TYPES IN CASE THEY ARE MISSING:
+//
+// These base types include "const" where appropriate, but only where of
+// interest to the caller.  For example, a caller cares that a variable passed
+// by reference will not be modified, such as, "const void * Pindex", but not
+// that the called function internally does not modify the pointer itself, such
+// as, "void * const Pindex".
+//
+// Note that its OK to pass a Pvoid_t to a Pcvoid_t; the latter is the same,
+// only constant.  Callers need to do this so they can also pass & Pvoid_t to
+// PPvoid_t (non-constant).
+*/
+
+#ifndef _PCVOID_T
+#define _PCVOID_T
+typedef const void * Pcvoid_t;
+#endif
+
+#ifndef _PVOID_T
+#define _PVOID_T
+typedef void *   Pvoid_t;
+typedef void ** PPvoid_t;
+#endif
+
+#ifndef _WORD_T
+#define _WORD_T
+    typedef  size_t  Word_t, * PWord_t;  /* expect 32-bit or 64-bit words. */
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+
+/* ****************************************************************************
+// SUPPORT FOR ERROR HANDLING:
+//
+// Judy error numbers:
+//
+// Note:  These are an enum so theres a related typedef, but the numbers are
+// spelled out so you can map a number back to its name.
+*/
+typedef enum            /* uint8_t -- but C does not support this type of enum.
+                                   -- nor does it support // comments!!         */
+{
+
+/* Note:  JU_ERRNO_NONE and JU_ERRNO_FULL are not real errors.  They specify
+// conditions which are otherwise impossible return values from 32-bit
+// Judy1Count, which has 2^32 + 1 valid returns (0..2^32) plus one error
+// return.  These pseudo-errors support the return values that cannot otherwise
+// be unambiguously represented in a 32-bit word, and will never occur on a
+// 64-bit system. */
+
+        JU_ERRNO_NONE           = 0,
+        JU_ERRNO_FULL           = 1,
+        JU_ERRNO_NFMAX          = JU_ERRNO_FULL,
+
+/* JU_ERRNO_NOMEM comes from malloc(3C) when Judy cannot obtain needed memory.
+// The system errno value is also set to ENOMEM.  This error can be recoverable
+// if the calling application frees other memory.
+//
+// TBD:  Currently there is no guarantee the Judy array has no memory leaks
+// upon JU_ERRNO_NOMEM. */
+
+        JU_ERRNO_NOMEM          = 2,
+
+/* Problems with parameters from the calling program:
+//
+// JU_ERRNO_NULLPPARRAY means PPArray was null; perhaps PArray was passed where
+// &PArray was intended.  Similarly, JU_ERRNO_NULLPINDEX means PIndex was null;
+// perhaps &Index was intended.  Also, JU_ERRNO_NONNULLPARRAY,
+// JU_ERRNO_NULLPVALUE, and JU_ERRNO_UNSORTED, all added later (hence with
+// higher numbers), mean:  A non-null array was passed in where a null pointer
+// was required; PValue was null; and unsorted indexes were detected. */
+
+        JU_ERRNO_NULLPPARRAY    = 3,    /* see above.                       */
+        JU_ERRNO_NONNULLPARRAY  = 10,   /* see above.                       */
+        JU_ERRNO_NULLPINDEX     = 4,    /* see above.                       */
+        JU_ERRNO_NULLPVALUE     = 11,   /* see above.                       */
+        JU_ERRNO_NOTJUDY1       = 5,    /* PArray is not to a Judy1 array.  */
+        JU_ERRNO_NOTJUDYL       = 6,    /* PArray is not to a JudyL array.  */
+        JU_ERRNO_NOTJUDYSL      = 7,    /* PArray is not to a JudySL array. */
+        JU_ERRNO_UNSORTED       = 12,   /* see above.                       */
+
+/* Errors below this point are not recoverable; further tries to access the
+// Judy array might result in EFAULT and a core dump:
+//
+// JU_ERRNO_OVERRUN occurs when Judy detects, upon reallocation, that a block
+// of memory in its own freelist was modified since being freed. */
+
+        JU_ERRNO_OVERRUN        = 8,
+
+/* JU_ERRNO_CORRUPT occurs when Judy detects an impossible value in a Judy data
+// structure:
+//
+// Note:  The Judy data structure contains some redundant elements that support
+// this type of checking. */
+
+        JU_ERRNO_CORRUPT        = 9
+
+/* Warning:  At least some C or C++ compilers do not tolerate a trailing comma
+// above here.  At least we know of one case, in aCC; see JAGad58928. */
+
+} JU_Errno_t;
+
+
+/* Judy errno structure:
+//
+// WARNING:  For compatibility with possible future changes, the fields of this
+// struct should not be referenced directly.  Instead use the macros supplied
+// below.
+
+// This structure should be declared on the stack in a threaded process. */
+
+typedef struct J_UDY_ERROR_STRUCT
+{
+    JU_Errno_t je_Errno;            /* one of the enums above.               */
+    int        je_ErrID;            /* often an internal source line number. */
+    Word_t     je_reserved[4];      /* for future backward compatibility.    */
+
+} JError_t, * PJError_t;
+
+
+/* Related macros:
+//
+// Fields from error struct: */
+
+#define JU_ERRNO(PJError)  ((PJError)->je_Errno)
+#define JU_ERRID(PJError)  ((PJError)->je_ErrID)
+
+/* For checking return values from various Judy functions:
+//
+// Note:  Define JERR as -1, not as the seemingly more portable (Word_t)
+// (~0UL), to avoid a compiler "overflow in implicit constant conversion"
+// warning. */
+
+#define   JERR (-1)                     /* functions returning int or Word_t */
+#define  PJERR ((Pvoid_t)  (~0UL))      /* mainly for use here, see below    */
+#define PPJERR ((PPvoid_t) (~0UL))      /* functions that return PPvoid_t    */
+
+/* Convenience macro for when detailed error information (PJError_t) is not
+// desired by the caller; a purposely short name: */
+
+#define PJE0  ((PJError_t) NULL)
+
+
+/* ****************************************************************************
+// JUDY FUNCTIONS:
+//
+// P_JE is a shorthand for use below:
+*/
+#define P_JE  PJError_t PJError
+
+/* ****************************************************************************
+// JUDY1 FUNCTIONS:
+*/
+extern int      Judy1Test(       Pcvoid_t  PArray, Word_t   Index,   P_JE);
+extern int      Judy1Set(        PPvoid_t PPArray, Word_t   Index,   P_JE);
+extern int      Judy1SetArray(   PPvoid_t PPArray, Word_t   Count,
+                                             const Word_t * const PIndex,
+                                                                     P_JE);
+extern int      Judy1Unset(      PPvoid_t PPArray, Word_t   Index,   P_JE);
+extern Word_t   Judy1Count(      Pcvoid_t  PArray, Word_t   Index1,
+                                                   Word_t   Index2,  P_JE);
+extern int      Judy1ByCount(    Pcvoid_t  PArray, Word_t   Count,
+                                                   Word_t * PIndex,  P_JE);
+extern Word_t   Judy1FreeArray(  PPvoid_t PPArray,                   P_JE);
+extern Word_t   Judy1MemUsed(    Pcvoid_t  PArray);
+extern Word_t   Judy1MemActive(  Pcvoid_t  PArray);
+extern int      Judy1First(      Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern int      Judy1Next(       Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern int      Judy1Last(       Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern int      Judy1Prev(       Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern int      Judy1FirstEmpty( Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern int      Judy1NextEmpty(  Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern int      Judy1LastEmpty(  Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern int      Judy1PrevEmpty(  Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+
+/* ****************************************************************************
+// JUDYL FUNCTIONS:
+*/
+extern PPvoid_t JudyLGet(        Pcvoid_t  PArray, Word_t    Index,  P_JE);
+extern PPvoid_t JudyLIns(        PPvoid_t PPArray, Word_t    Index,  P_JE);
+extern int      JudyLInsArray(   PPvoid_t PPArray, Word_t    Count,
+                                             const Word_t * const PIndex,
+                                             const Word_t * const PValue,
+                                                                     P_JE);
+
+extern int      JudyLDel(        PPvoid_t PPArray, Word_t    Index,  P_JE);
+extern Word_t   JudyLCount(      Pcvoid_t  PArray, Word_t    Index1,
+                                                   Word_t    Index2, P_JE);
+extern PPvoid_t JudyLByCount(    Pcvoid_t  PArray, Word_t    Count,
+                                                   Word_t *  PIndex, P_JE);
+extern Word_t   JudyLFreeArray(  PPvoid_t PPArray,                   P_JE);
+extern Word_t   JudyLMemUsed(    Pcvoid_t  PArray);
+extern Word_t   JudyLMemActive(  Pcvoid_t  PArray);
+extern PPvoid_t JudyLFirst(      Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern PPvoid_t JudyLNext(       Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern PPvoid_t JudyLLast(       Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern PPvoid_t JudyLPrev(       Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern int      JudyLFirstEmpty( Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern int      JudyLNextEmpty(  Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern int      JudyLLastEmpty(  Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+extern int      JudyLPrevEmpty(  Pcvoid_t  PArray, Word_t * PIndex,  P_JE);
+
+/* ****************************************************************************
+// JUDYSL FUNCTIONS:
+*/
+extern PPvoid_t JudySLGet(       Pcvoid_t, const uint8_t * Index, P_JE);
+extern PPvoid_t JudySLIns(       PPvoid_t, const uint8_t * Index, P_JE);
+extern int      JudySLDel(       PPvoid_t, const uint8_t * Index, P_JE);
+extern Word_t   JudySLFreeArray( PPvoid_t,                        P_JE);
+extern PPvoid_t JudySLFirst(     Pcvoid_t,       uint8_t * Index, P_JE);
+extern PPvoid_t JudySLNext(      Pcvoid_t,       uint8_t * Index, P_JE);
+extern PPvoid_t JudySLLast(      Pcvoid_t,       uint8_t * Index, P_JE);
+extern PPvoid_t JudySLPrev(      Pcvoid_t,       uint8_t * Index, P_JE);
+
+/* ****************************************************************************
+// JUDYHSL FUNCTIONS:
+*/
+extern PPvoid_t JudyHSGet(       Pcvoid_t,  void *, Word_t);
+extern PPvoid_t JudyHSIns(       PPvoid_t,  void *, Word_t, P_JE);
+extern int      JudyHSDel(       PPvoid_t,  void *, Word_t, P_JE);
+extern Word_t   JudyHSFreeArray( PPvoid_t,                  P_JE);
+
+extern const char *Judy1MallocSizes;
+extern const char *JudyLMallocSizes;
+
+/* ****************************************************************************
+// JUDY memory interface to malloc() FUNCTIONS:
+*/
+extern Word_t JudyMalloc(Word_t);               /* words reqd => words allocd. */
+extern Word_t JudyMallocVirtual(Word_t);        /* words reqd => words allocd. */
+extern void   JudyFree(Pvoid_t, Word_t);        /* free, size in words.        */
+extern void   JudyFreeVirtual(Pvoid_t, Word_t); /* free, size in words.        */
+
+#define JLAP_INVALID    0x1     /* flag to mark pointer "not a Judy array" */
+
+/* ****************************************************************************
+// MACRO EQUIVALENTS FOR JUDY FUNCTIONS:
+//
+// The following macros, such as J1T, are shorthands for calling Judy functions
+// with parameter address-of and detailed error checking included.  Since they
+// are macros, the error checking code is replicated each time the macro is
+// used, but it runs fast in the normal case of no error.
+//
+// If the caller does not like the way the default JUDYERROR macro handles
+// errors (such as an exit(1) call when out of memory), they may define their
+// own before the "#include <Judy.h>".  A routine such as HandleJudyError
+// could do checking on specific error numbers and print a different message
+// dependent on the error.  The following is one example:
+//
+// Note: the back-slashes are removed because some compilers will not accept
+// them in comments.
+//
+// void HandleJudyError(uint8_t *, int, uint8_t *, int, int);
+// #define JUDYERROR(CallerFile, CallerLine, JudyFunc, JudyErrno, JudyErrID)
+// {
+//    HandleJudyError(CallerFile, CallerLine, JudyFunc, JudyErrno, JudyErrID);
+// }
+//
+// The routine HandleJudyError could do checking on specific error numbers and
+// print a different message dependent on the error.
+//
+// The macro receives five parameters that are:
+//
+// 1.  CallerFile:  Source filename where a Judy call returned a serious error.
+// 2.  CallerLine:  Line number in that source file.
+// 3.  JudyFunc:    Name of Judy function reporting the error.
+// 4.  JudyErrno:   One of the JU_ERRNO* values enumerated above.
+// 5.  JudyErrID:   The je_ErrID field described above.
+*/
+#ifndef JUDYERROR_NOTEST
+#ifndef JUDYERROR       /* supply a default error macro */
+#include <stdio.h>
+
+#define JUDYERROR(CallerFile, CallerLine, JudyFunc, JudyErrno, JudyErrID) \
+    {                                                                     \
+        (void) fprintf(stderr, "File '%s', line %d: %s(), "               \
+           "JU_ERRNO_* == %d, ID == %d\n",                                \
+           CallerFile, CallerLine,                                        \
+           JudyFunc, JudyErrno, JudyErrID);                               \
+        exit(1);                                                          \
+    }
+
+#endif /* JUDYERROR */
+#endif /* JUDYERROR_NOTEST */
+
+/* If the JUDYERROR macro is not desired at all, then the following eliminates
+// it.  However, the return code from each Judy function (that is, the first
+// parameter of each macro) must be checked by the caller to assure that an
+// error did not occur.
+//
+// Example:
+//
+//   #define JUDYERROR_NOTEST 1
+//   #include <Judy.h>
+//
+// or use this cc option at compile time:
+//
+//   cc -DJUDYERROR_NOTEST ...
+//
+// Example code:
+//
+//   J1S(Rc, PArray, Index);
+//   if (Rc == JERR) goto ...error
+//
+// or:
+//
+//   JLI(PValue, PArray, Index);
+//   if (PValue == PJERR) goto ...error
+
+
+// Internal shorthand macros for writing the J1S, etc. macros:
+*/
+#ifdef JUDYERROR_NOTEST /* ============================================ */
+
+/* "Judy Set Error": */
+
+#define J_SE(FuncName,Errno)  ((void) 0)
+
+/* Note:  In each J_*() case below, the digit is the number of key parameters
+// to the Judy*() call.  Just assign the Func result to the callers Rc value
+// without a cast because none is required, and this keeps the API simpler.
+// However, a family of different J_*() macros is needed to support the
+// different numbers of key parameters (0,1,2) and the Func return type.
+//
+// In the names below, "I" = integer result; "P" = pointer result.  Note, the
+// Funcs for J_*P() return PPvoid_t, but cast this to a Pvoid_t for flexible,
+// error-free assignment, and then compare to PJERR.
+*/
+#define J_0I(Rc,PArray,Func,FuncName) \
+        { (Rc) = Func(PArray, PJE0); }
+
+#define J_1I(Rc,PArray,Index,Func,FuncName) \
+        { (Rc) = Func(PArray, Index, PJE0); }
+
+#define J_1P(PV,PArray,Index,Func,FuncName) \
+        { (PV) = (Pvoid_t) Func(PArray, Index, PJE0); }
+
+#define J_2I(Rc,PArray,Index,Arg2,Func,FuncName) \
+        { (Rc) = Func(PArray, Index, Arg2, PJE0); }
+
+#define J_2C(Rc,PArray,Index1,Index2,Func,FuncName) \
+        { (Rc) = Func(PArray, Index1, Index2, PJE0); }
+
+#define J_2P(PV,PArray,Index,Arg2,Func,FuncName) \
+        { (PV) = (Pvoid_t) Func(PArray, Index, Arg2, PJE0); }
+
+/* Variations for Judy*Set/InsArray functions: */
+
+#define J_2AI(Rc,PArray,Count,PIndex,Func,FuncName) \
+        { (Rc) = Func(PArray, Count, PIndex, PJE0); }
+#define J_3AI(Rc,PArray,Count,PIndex,PValue,Func,FuncName) \
+        { (Rc) = Func(PArray, Count, PIndex, PValue, PJE0); }
+
+#else /* ================ ! JUDYERROR_NOTEST ============================= */
+
+#define J_E(FuncName,PJE) \
+        JUDYERROR(__FILE__, __LINE__, FuncName, JU_ERRNO(PJE), JU_ERRID(PJE))
+
+#define J_SE(FuncName,Errno)                                            \
+        {                                                               \
+            JError_t J_Error;                                           \
+            JU_ERRNO(&J_Error) = (Errno);                               \
+            JU_ERRID(&J_Error) = __LINE__;                              \
+            J_E(FuncName, &J_Error);                                    \
+        }
+
+/* Note:  In each J_*() case below, the digit is the number of key parameters
+// to the Judy*() call.  Just assign the Func result to the callers Rc value
+// without a cast because none is required, and this keeps the API simpler.
+// However, a family of different J_*() macros is needed to support the
+// different numbers of key parameters (0,1,2) and the Func return type.
+//
+// In the names below, "I" = integer result; "P" = pointer result.  Note, the
+// Funcs for J_*P() return PPvoid_t, but cast this to a Pvoid_t for flexible,
+// error-free assignment, and then compare to PJERR.
+*/
+#define J_0I(Rc,PArray,Func,FuncName)                                   \
+        {                                                               \
+            JError_t J_Error;                                           \
+            if (((Rc) = Func(PArray, &J_Error)) == JERR)                \
+                J_E(FuncName, &J_Error);                                \
+        }
+
+#define J_1I(Rc,PArray,Index,Func,FuncName)                             \
+        {                                                               \
+            JError_t J_Error;                                           \
+            if (((Rc) = Func(PArray, Index, &J_Error)) == JERR)         \
+                J_E(FuncName, &J_Error);                                \
+        }
+
+#define J_1P(Rc,PArray,Index,Func,FuncName)                             \
+        {                                                               \
+            JError_t J_Error;                                           \
+            if (((Rc) = (Pvoid_t) Func(PArray, Index, &J_Error)) == PJERR) \
+                J_E(FuncName, &J_Error);                                \
+        }
+
+#define J_2I(Rc,PArray,Index,Arg2,Func,FuncName)                        \
+        {                                                               \
+            JError_t J_Error;                                           \
+            if (((Rc) = Func(PArray, Index, Arg2, &J_Error)) == JERR)   \
+                J_E(FuncName, &J_Error);                                \
+        }
+
+/* Variation for Judy*Count functions, which return 0, not JERR, for error (and
+// also for other non-error cases):
+//
+// Note:  JU_ERRNO_NFMAX should only apply to 32-bit Judy1, but this header
+// file lacks the necessary ifdefs to make it go away otherwise, so always
+// check against it.
+*/
+#define J_2C(Rc,PArray,Index1,Index2,Func,FuncName)                     \
+        {                                                               \
+            JError_t J_Error;                                           \
+            if ((((Rc) = Func(PArray, Index1, Index2, &J_Error)) == 0)  \
+             && (JU_ERRNO(&J_Error) > JU_ERRNO_NFMAX))                  \
+            {                                                           \
+                J_E(FuncName, &J_Error);                                \
+            }                                                           \
+        }
+
+#define J_2P(PV,PArray,Index,Arg2,Func,FuncName)                        \
+        {                                                               \
+            JError_t J_Error;                                           \
+            if (((PV) = (Pvoid_t) Func(PArray, Index, Arg2, &J_Error))  \
+                == PJERR) J_E(FuncName, &J_Error);                      \
+        }
+
+/* Variations for Judy*Set/InsArray functions: */
+
+#define J_2AI(Rc,PArray,Count,PIndex,Func,FuncName)                     \
+        {                                                               \
+            JError_t J_Error;                                           \
+            if (((Rc) = Func(PArray, Count, PIndex, &J_Error)) == JERR) \
+                J_E(FuncName, &J_Error);                                \
+        }
+
+#define J_3AI(Rc,PArray,Count,PIndex,PValue,Func,FuncName)              \
+        {                                                               \
+            JError_t J_Error;                                           \
+            if (((Rc) = Func(PArray, Count, PIndex, PValue, &J_Error))  \
+                == JERR) J_E(FuncName, &J_Error);                       \
+        }
+
+#endif /* ================ ! JUDYERROR_NOTEST ============================= */
+
+/* Some of the macros are special cases that use inlined shortcuts for speed
+// with root-level leaves:
+
+// This is a slower version with current processors, but in the future...
+*/
+#define J1T(Rc,PArray,Index)                                            \
+    (Rc) = Judy1Test((Pvoid_t)(PArray), Index, PJE0)
+
+#define J1S( Rc,    PArray,   Index) \
+        J_1I(Rc, (&(PArray)), Index,  Judy1Set,   "Judy1Set")
+#define J1SA(Rc,    PArray,   Count, PIndex) \
+        J_2AI(Rc,(&(PArray)), Count, PIndex, Judy1SetArray, "Judy1SetArray")
+#define J1U( Rc,    PArray,   Index) \
+        J_1I(Rc, (&(PArray)), Index,  Judy1Unset, "Judy1Unset")
+#define J1F( Rc,    PArray,   Index) \
+        J_1I(Rc,    PArray, &(Index), Judy1First, "Judy1First")
+#define J1N( Rc,    PArray,   Index) \
+        J_1I(Rc,    PArray, &(Index), Judy1Next,  "Judy1Next")
+#define J1L( Rc,    PArray,   Index) \
+        J_1I(Rc,    PArray, &(Index), Judy1Last,  "Judy1Last")
+#define J1P( Rc,    PArray,   Index) \
+        J_1I(Rc,    PArray, &(Index), Judy1Prev,  "Judy1Prev")
+#define J1FE(Rc,    PArray,   Index) \
+        J_1I(Rc,    PArray, &(Index), Judy1FirstEmpty, "Judy1FirstEmpty")
+#define J1NE(Rc,    PArray,   Index) \
+        J_1I(Rc,    PArray, &(Index), Judy1NextEmpty,  "Judy1NextEmpty")
+#define J1LE(Rc,    PArray,   Index) \
+        J_1I(Rc,    PArray, &(Index), Judy1LastEmpty,  "Judy1LastEmpty")
+#define J1PE(Rc,    PArray,   Index) \
+        J_1I(Rc,    PArray, &(Index), Judy1PrevEmpty,  "Judy1PrevEmpty")
+#define J1C( Rc,    PArray,   Index1,  Index2) \
+        J_2C(Rc,    PArray,   Index1,  Index2, Judy1Count,   "Judy1Count")
+#define J1BC(Rc,    PArray,   Count,   Index) \
+        J_2I(Rc,    PArray,   Count, &(Index), Judy1ByCount, "Judy1ByCount")
+#define J1FA(Rc,    PArray) \
+        J_0I(Rc, (&(PArray)), Judy1FreeArray, "Judy1FreeArray")
+#define J1MU(Rc,    PArray) \
+        (Rc) = Judy1MemUsed(PArray)
+
+#define JLG(PV,PArray,Index)                                            \
+    (PV) = (Pvoid_t)JudyLGet((Pvoid_t)PArray, Index, PJE0)
+
+#define JLI( PV,    PArray,   Index)                                    \
+        J_1P(PV, (&(PArray)), Index,  JudyLIns,   "JudyLIns")
+
+#define JLIA(Rc,    PArray,   Count, PIndex, PValue)                    \
+        J_3AI(Rc,(&(PArray)), Count, PIndex, PValue, JudyLInsArray,     \
+                                                  "JudyLInsArray")
+#define JLD( Rc,    PArray,   Index)                                    \
+        J_1I(Rc, (&(PArray)), Index,  JudyLDel,   "JudyLDel")
+
+#define JLF( PV,    PArray,   Index)                                    \
+        J_1P(PV,    PArray, &(Index), JudyLFirst, "JudyLFirst")
+
+#define JLN( PV,    PArray,   Index)                                    \
+        J_1P(PV,    PArray, &(Index), JudyLNext, "JudyLNext")
+
+#define JLL( PV,    PArray,   Index)                                    \
+        J_1P(PV,    PArray, &(Index), JudyLLast,  "JudyLLast")
+#define JLP( PV,    PArray,   Index)                                    \
+        J_1P(PV,    PArray, &(Index), JudyLPrev,  "JudyLPrev")
+#define JLFE(Rc,    PArray,   Index)                                    \
+        J_1I(Rc,    PArray, &(Index), JudyLFirstEmpty, "JudyLFirstEmpty")
+#define JLNE(Rc,    PArray,   Index)                                    \
+        J_1I(Rc,    PArray, &(Index), JudyLNextEmpty,  "JudyLNextEmpty")
+#define JLLE(Rc,    PArray,   Index)                                    \
+        J_1I(Rc,    PArray, &(Index), JudyLLastEmpty,  "JudyLLastEmpty")
+#define JLPE(Rc,    PArray,   Index)                                    \
+        J_1I(Rc,    PArray, &(Index), JudyLPrevEmpty,  "JudyLPrevEmpty")
+#define JLC( Rc,    PArray,   Index1,  Index2)                          \
+        J_2C(Rc,    PArray,   Index1,  Index2, JudyLCount,   "JudyLCount")
+#define JLBC(PV,    PArray,   Count,   Index)                           \
+        J_2P(PV,    PArray,   Count, &(Index), JudyLByCount, "JudyLByCount")
+#define JLFA(Rc,    PArray)                                             \
+        J_0I(Rc, (&(PArray)), JudyLFreeArray, "JudyLFreeArray")
+#define JLMU(Rc,    PArray)                                             \
+        (Rc) = JudyLMemUsed(PArray)
+
+#define JHSI(PV,    PArray,   PIndex,   Count)                          \
+        J_2P(PV, (&(PArray)), PIndex,   Count, JudyHSIns, "JudyHSIns")
+#define JHSG(PV,    PArray,   PIndex,   Count)                          \
+        (PV) = (Pvoid_t) JudyHSGet(PArray, PIndex, Count)
+#define JHSD(Rc,    PArray,   PIndex,   Count)                          \
+        J_2I(Rc, (&(PArray)), PIndex, Count, JudyHSDel, "JudyHSDel")
+#define JHSFA(Rc,    PArray)                                            \
+        J_0I(Rc, (&(PArray)), JudyHSFreeArray, "JudyHSFreeArray")
+
+#define JSLG( PV,    PArray,   Index)                                   \
+        J_1P( PV,    PArray,   Index, JudySLGet,   "JudySLGet")
+#define JSLI( PV,    PArray,   Index)                                   \
+        J_1P( PV, (&(PArray)), Index, JudySLIns,   "JudySLIns")
+#define JSLD( Rc,    PArray,   Index)                                   \
+        J_1I( Rc, (&(PArray)), Index, JudySLDel,   "JudySLDel")
+#define JSLF( PV,    PArray,   Index)                                   \
+        J_1P( PV,    PArray,   Index, JudySLFirst, "JudySLFirst")
+#define JSLN( PV,    PArray,   Index)                                   \
+        J_1P( PV,    PArray,   Index, JudySLNext,  "JudySLNext")
+#define JSLL( PV,    PArray,   Index)                                   \
+        J_1P( PV,    PArray,   Index, JudySLLast,  "JudySLLast")
+#define JSLP( PV,    PArray,   Index)                                   \
+        J_1P( PV,    PArray,   Index, JudySLPrev,  "JudySLPrev")
+#define JSLFA(Rc,    PArray)                                            \
+        J_0I( Rc, (&(PArray)), JudySLFreeArray, "JudySLFreeArray")
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* ! _JUDY_INCLUDED */
diff --git a/libs/klib/Makefile b/libs/klib/Makefile
new file mode 100644
index 0000000..f312342
--- /dev/null
+++ b/libs/klib/Makefile
@@ -0,0 +1,159 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: all
+
+TOP ?= $(abspath ../..)
+MODULE = libs/klib
+
+INT_LIBS = \
+	libklib
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(KLIB_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all: makedirs compile
+	@ $(MAKE) -C $(SRCDIR)/judy all
+	@ $(MAKE_CMD) $(TARGDIR)/all
+
+std: makedirs compile
+	@ $(MAKE) -C $(SRCDIR)/judy std
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE) -C $(SRCDIR)/judy std
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# all, std
+#
+$(TARGDIR)/all $(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/all $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+	@ $(MAKE) -C $(SRCDIR)/judy clean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# klib
+#
+$(ILIBDIR)/libklib: $(addprefix $(ILIBDIR)/libklib.,$(ILIBEXT))
+
+KLIB_SRC = \
+	text \
+	time \
+	utf8 \
+	iso8859 \
+	iso8859-1 \
+	cp1252 \
+	token \
+	symtab \
+	container \
+	vector \
+	namelist \
+	ncbi-vdb-version \
+	vector_namelist \
+	trie \
+	pbstree \
+	pbstree-impl.nopt \
+	pbstree-impl.swap.nopt \
+	bstpersist.nopt \
+	ptrie.nopt \
+	ptpersist.nopt \
+	crc32 \
+	md5 \
+	misc \
+	SHA-32bit \
+	SHA-64bit \
+	qsort \
+	ksort \
+	bsearch \
+	pack \
+	unpack \
+	vlen-encode \
+	data-buffer \
+	refcount \
+	printf \
+	status-rc-strings \
+	status-rc \
+	syserrcode \
+	syswriter \
+	out \
+	status \
+	log \
+	writer \
+	syslog \
+	systime \
+	rc-tbl \
+	rc-idx-tbl \
+	judy-vector \
+	report-klib \
+	num-gen \
+	progressbar \
+	sra-release-version \
+	btree
+#	path
+
+ifeq (win,$(OS))
+	KLIB_SRC += sysalloc
+endif
+
+ifeq (dbg,$(BUILD))
+	KLIB_SRC += debug
+endif
+
+KLIB_OBJ = \
+	$(addsuffix .$(LOBX),$(KLIB_SRC))
+
+KLIB_LIB = \
+	-sjudy \
+	-lm
+
+$(ILIBDIR)/libklib.$(LIBX): $(KLIB_OBJ)
+	$(LD) --slib -o $@ $^ $(KLIB_LIB)
+
+
+# compilation
+compile: makedirs
+	@ $(MAKE) -C $(SRCDIR)/judy compile
+	@ $(MAKE_CMD) -j$(MAKE_JOBS) $(TARGDIR)/compile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/klib/SHA-32bit.c b/libs/klib/SHA-32bit.c
new file mode 100644
index 0000000..e108dcc
--- /dev/null
+++ b/libs/klib/SHA-32bit.c
@@ -0,0 +1,313 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/extern.h>
+#include <klib/checksum.h>
+#include <arch-impl.h>
+
+#include <endian.h>
+#include <byteswap.h>
+
+#include <stdint.h>
+#include <string.h>
+
+static const uint32_t H0_1[5] =
+{
+    0x67452301U,
+    0xefcdab89U,
+    0x98badcfeU,
+    0x10325476U,
+    0xc3d2e1f0U,
+};
+
+static const uint32_t K_1[4] =
+{
+    0x5a827999U,
+    0x6ed9eba1U,
+    0x8f1bbcdcU,
+    0xca62c1d6U
+};
+
+static const uint32_t H0_2[8] =
+{
+    0x6a09e667U,
+    0xbb67ae85U,
+    0x3c6ef372U,
+    0xa54ff53aU,
+    0x510e527fU,
+    0x9b05688cU,
+    0x1f83d9abU,
+    0x5be0cd19U,
+};
+
+static const uint32_t K_2[] =
+{
+    0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 
+    0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 
+    0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 
+    0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U, 
+    0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, 
+    0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU, 
+    0x983e5152U, 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, 
+    0xc6e00bf3U, 0xd5a79147U, 0x06ca6351U, 0x14292967U, 
+    0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, 0x53380d13U, 
+    0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U, 
+    0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, 
+    0xd192e819U, 0xd6990624U, 0xf40e3585U, 0x106aa070U, 
+    0x19a4c116U, 0x1e376c08U, 0x2748774cU, 0x34b0bcb5U, 
+    0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, 0x682e6ff3U, 
+    0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, 
+    0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U, 
+};
+
+#if 0 /* this is slower than pure C version */
+#define ROL(X, N) uint32_rol ( X, N )
+#define ROR(X, N) uint32_ror ( X, N )
+#else
+#define ROL(X, N) (((X) << (N)) | ((X) >> (32 - (N))))
+#define ROR(X, N) ROL(X, 32-N)
+#endif
+#define SHR(X, N) ((X) >> (N))
+
+#define Ch(X, Y, Z) (((X) & (Y))^((~(X))&(Z)))
+#define Maj(X, Y, Z) (((X)&(Y))^((X)&(Z))^((Y)&(Z)))
+#define Parity(X, Y, Z) ((X)^(Y)^(Z))
+#define Sigma0(X) (ROR((X),  2)^ROR((X), 13)^ROR((X), 22))
+#define Sigma1(X) (ROR((X),  6)^ROR((X), 11)^ROR((X), 25))
+#define sigma0(X) (ROR((X),  7)^ROR((X), 18)^SHR((X),  3))
+#define sigma1(X) (ROR((X), 17)^ROR((X), 19)^SHR((X), 10))
+
+static void SHA1_stage(uint32_t Ho[8], const uint32_t Hi[8], uint32_t W[16])
+{
+    uint32_t a = Hi[0];
+    uint32_t b = Hi[1];
+    uint32_t c = Hi[2];
+    uint32_t d = Hi[3];
+    uint32_t e = Hi[4];
+    unsigned t;
+    
+    for (t = 0; t != 16; ++t) {
+        const uint32_t T = ROL(a, 5) + Ch(b, c, d) + e + K_1[0] + W[t];
+        
+        e = d; d = c; c = ROL(b, 30); b = a; a = T;
+    }
+    for ( ; t != 20; ++t) {
+        const uint32_t T = ROL(a, 5) + Ch(b, c, d) + e + K_1[0] +
+            (W[t%16] = ROL(W[(t-3)%16] ^ W[(t-8)%16] ^ W[(t-14)%16] ^ W[(t-16)%16], 1));
+        
+        e = d; d = c; c = ROL(b, 30); b = a; a = T;
+    }
+    for ( ; t != 40; ++t) {
+        const uint32_t T = ROL(a, 5) + Parity(b, c, d) + e + K_1[1] +
+            (W[t%16] = ROL(W[(t-3)%16] ^ W[(t-8)%16] ^ W[(t-14)%16] ^ W[(t-16)%16], 1));
+        
+        e = d; d = c; c = ROL(b, 30); b = a; a = T;
+    }
+    for ( ; t != 60; ++t) {
+        const uint32_t T = ROL(a, 5) + Maj(b, c, d) + e + K_1[2] +
+            (W[t%16] = ROL(W[(t-3)%16] ^ W[(t-8)%16] ^ W[(t-14)%16] ^ W[(t-16)%16], 1));
+        
+        e = d; d = c; c = ROL(b, 30); b = a; a = T;
+    }
+    for ( ; t != 80; ++t) {
+        const uint32_t T = ROL(a, 5) + Parity(b, c, d) + e + K_1[3] +
+            (W[t%16] = ROL(W[(t-3)%16] ^ W[(t-8)%16] ^ W[(t-14)%16] ^ W[(t-16)%16], 1));
+        
+        e = d; d = c; c = ROL(b, 30); b = a; a = T;
+    }
+    Ho[0] = Hi[0] + a;
+    Ho[1] = Hi[1] + b;
+    Ho[2] = Hi[2] + c;
+    Ho[3] = Hi[3] + d;
+    Ho[4] = Hi[4] + e;
+}
+
+static void SHA2_stage(uint32_t Ho[8], const uint32_t Hi[8], uint32_t W[16])
+{
+    uint32_t a = Hi[0];
+    uint32_t b = Hi[1];
+    uint32_t c = Hi[2];
+    uint32_t d = Hi[3];
+    uint32_t e = Hi[4];
+    uint32_t f = Hi[5];
+    uint32_t g = Hi[6];
+    uint32_t h = Hi[7];
+    unsigned t;
+    
+    for (t = 0; t != 16; ++t) {
+        const uint32_t T1 = h + Sigma1(e) + Ch(e, f, g) + K_2[t] + W[t];
+        const uint32_t T2 = Sigma0(a) + Maj(a, b, c);
+        
+        h = g; g = f; f = e; e = d + T1;
+        d = c; c = b; b = a; a = T1 + T2;
+    }
+    for ( ; t != 64; ++t) {
+        const uint32_t T1 = h + Sigma1(e) + Ch(e, f, g) + K_2[t] +
+            (W[t%16] = sigma1(W[(t-2)%16])+W[(t-7)%16]+sigma0(W[(t-15)%16])+W[(t-16)%16]);
+        const uint32_t T2 = Sigma0(a) + Maj(a, b, c);
+        
+        h = g; g = f; f = e; e = d + T1;
+        d = c; c = b; b = a; a = T1 + T2;
+    }
+    Ho[0] = Hi[0] + a;
+    Ho[1] = Hi[1] + b;
+    Ho[2] = Hi[2] + c;
+    Ho[3] = Hi[3] + d;
+    Ho[4] = Hi[4] + e;
+    Ho[5] = Hi[5] + f;
+    Ho[6] = Hi[6] + g;
+    Ho[7] = Hi[7] + h;
+}
+
+static __inline__ void SHA_32b_Init(struct SHA32bitState *ctx, int which)
+{
+    if (which == 0)
+        memmove(ctx->H, H0_1, sizeof(H0_1));
+    else
+        memmove(ctx->H, H0_2, sizeof(H0_2));
+    ctx->len = 0;
+    ctx->cur = 0;
+}
+
+static __inline__ void SHA_32b_Append(struct SHA32bitState *ctx, int which, const uint8_t data[], size_t length)
+{
+    unsigned i;
+    unsigned j;
+    unsigned n;
+    
+    ctx->len += length;
+    for (i = 0; i != length; i += n) {
+        n = length - i > 64 ? 64 : (unsigned)(length - i);
+        if (ctx->cur + n > 64)
+            n = 64 - ctx->cur;
+        memmove(&ctx->W[ctx->cur], &data[i], n);
+        ctx->cur += n;
+        if (ctx->cur == 64) {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+            uint32_t W[16];
+            
+            for (j = 0; j != 16; ++j)
+                W[j] = bswap_32(((const uint32_t *)ctx->W)[j]);
+            
+            (which ? SHA2_stage : SHA1_stage)(ctx->H, ctx->H, W);
+#else
+            (which ? SHA2_stage : SHA1_stage)(ctx->H, ctx->H, ctx->W);
+#endif
+            ctx->cur = 0;
+        }
+    }
+}
+
+static __inline__ void SHA_32b_Finish(const struct SHA32bitState *ctx, int which, uint32_t rslt[8])
+{
+    unsigned j;
+    unsigned const n = (ctx->cur + 3) >> 2;
+    uint32_t W[32];
+    
+    memset(W, 0, sizeof(W));
+    for (j = 0; j != n; ++j) {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+        W[j] = bswap_32(((const uint32_t *)ctx->W)[j]);
+#else
+        W[j] = ((const uint32_t *)ctx->W)[j];
+#endif
+    }
+    if (ctx->cur & 3) {
+        --j;
+        W[j] &= (~((uint32_t)0)) << ((4 - (ctx->cur & 3)) * 8);
+        W[j] |= ((uint32_t)0x80U) << ((3 - (ctx->cur & 3)) * 8);
+    }
+    else
+        W[j] = ((uint32_t)0x80U) << 24;
+    if (j < 14) {
+        W[14] = (uint32_t)(ctx->len >> 29);
+        W[15] = (uint32_t)(ctx->len <<  3);
+        (which ? SHA2_stage : SHA1_stage)(rslt, ctx->H, W);
+    }
+    else {
+        W[30] = (uint32_t)(ctx->len >> 29);
+        W[31] = (uint32_t)(ctx->len <<  3);
+        (which ? SHA2_stage : SHA1_stage)(rslt, ctx->H, W);
+        (which ? SHA2_stage : SHA1_stage)(rslt, rslt, W + 16);
+    }
+}
+
+void CC SHA1StateInit(SHA1State *ctx)
+{
+    SHA_32b_Init(ctx, 0);
+}
+
+void CC SHA1StateAppend(SHA1State *ctx, const void *data, size_t length)
+{
+    SHA_32b_Append(ctx, 0, data, length);
+}
+
+void CC SHA1StateFinish(SHA1State *ctx, uint8_t hash[20])
+{
+    uint32_t H[8];
+
+    SHA_32b_Finish(ctx, 0, H);
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    {
+        H[0] = bswap_32(H[0]);
+        H[1] = bswap_32(H[1]);
+        H[2] = bswap_32(H[2]);
+        H[3] = bswap_32(H[3]);
+        H[4] = bswap_32(H[4]);
+    }
+#endif
+    memmove(hash, H, 20);
+}
+
+void CC SHA256StateInit(SHA256State *ctx)
+{
+    SHA_32b_Init(ctx, 1);
+}
+
+void CC SHA256StateAppend(SHA256State *ctx, const void *data, size_t length)
+{
+    SHA_32b_Append(ctx, 1, data, length);
+}
+
+void CC SHA256StateFinish(SHA256State *ctx, uint8_t hash[32])
+{
+    uint32_t H[8];
+
+    SHA_32b_Finish(ctx, 1, H);
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    {
+        H[0] = bswap_32(H[0]);
+        H[1] = bswap_32(H[1]);
+        H[2] = bswap_32(H[2]);
+        H[3] = bswap_32(H[3]);
+        H[4] = bswap_32(H[4]);
+        H[5] = bswap_32(H[5]);
+        H[6] = bswap_32(H[6]);
+        H[7] = bswap_32(H[7]);
+    }
+#endif
+    memmove(hash, H, 32);
+}
diff --git a/libs/klib/SHA-64bit.c b/libs/klib/SHA-64bit.c
new file mode 100644
index 0000000..abf8917
--- /dev/null
+++ b/libs/klib/SHA-64bit.c
@@ -0,0 +1,271 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/extern.h>
+#include <klib/checksum.h>
+#include <arch-impl.h>
+
+#include <endian.h>
+#include <byteswap.h>
+
+#include <stdint.h>
+#include <string.h>
+
+#if _ARCH_BITS == 32
+#define UL( x ) x ## ULL
+#else
+#define UL( x ) x ## UL
+#endif
+
+static const uint64_t H0_384[8] =
+{
+    UL(0xcbbb9d5dc1059ed8),
+    UL(0x629a292a367cd507),
+    UL(0x9159015a3070dd17),
+    UL(0x152fecd8f70e5939),
+    UL(0x67332667ffc00b31),
+    UL(0x8eb44a8768581511),
+    UL(0xdb0c2e0d64f98fa7),
+    UL(0x47b5481dbefa4fa4),
+};
+
+static const uint64_t H0_512[8] =
+{
+    UL(0x6a09e667f3bcc908),
+    UL(0xbb67ae8584caa73b),
+    UL(0x3c6ef372fe94f82b),
+    UL(0xa54ff53a5f1d36f1),
+    UL(0x510e527fade682d1),
+    UL(0x9b05688c2b3e6c1f),
+    UL(0x1f83d9abfb41bd6b),
+    UL(0x5be0cd19137e2179),
+};
+
+static const uint64_t K[] =
+{
+    UL(0x428a2f98d728ae22), UL(0x7137449123ef65cd), UL(0xb5c0fbcfec4d3b2f), UL(0xe9b5dba58189dbbc), 
+    UL(0x3956c25bf348b538), UL(0x59f111f1b605d019), UL(0x923f82a4af194f9b), UL(0xab1c5ed5da6d8118), 
+    UL(0xd807aa98a3030242), UL(0x12835b0145706fbe), UL(0x243185be4ee4b28c), UL(0x550c7dc3d5ffb4e2), 
+    UL(0x72be5d74f27b896f), UL(0x80deb1fe3b1696b1), UL(0x9bdc06a725c71235), UL(0xc19bf174cf692694), 
+    UL(0xe49b69c19ef14ad2), UL(0xefbe4786384f25e3), UL(0x0fc19dc68b8cd5b5), UL(0x240ca1cc77ac9c65), 
+    UL(0x2de92c6f592b0275), UL(0x4a7484aa6ea6e483), UL(0x5cb0a9dcbd41fbd4), UL(0x76f988da831153b5), 
+    UL(0x983e5152ee66dfab), UL(0xa831c66d2db43210), UL(0xb00327c898fb213f), UL(0xbf597fc7beef0ee4), 
+    UL(0xc6e00bf33da88fc2), UL(0xd5a79147930aa725), UL(0x06ca6351e003826f), UL(0x142929670a0e6e70), 
+    UL(0x27b70a8546d22ffc), UL(0x2e1b21385c26c926), UL(0x4d2c6dfc5ac42aed), UL(0x53380d139d95b3df), 
+    UL(0x650a73548baf63de), UL(0x766a0abb3c77b2a8), UL(0x81c2c92e47edaee6), UL(0x92722c851482353b), 
+    UL(0xa2bfe8a14cf10364), UL(0xa81a664bbc423001), UL(0xc24b8b70d0f89791), UL(0xc76c51a30654be30), 
+    UL(0xd192e819d6ef5218), UL(0xd69906245565a910), UL(0xf40e35855771202a), UL(0x106aa07032bbd1b8), 
+    UL(0x19a4c116b8d2d0c8), UL(0x1e376c085141ab53), UL(0x2748774cdf8eeb99), UL(0x34b0bcb5e19b48a8), 
+    UL(0x391c0cb3c5c95a63), UL(0x4ed8aa4ae3418acb), UL(0x5b9cca4f7763e373), UL(0x682e6ff3d6b2b8a3), 
+    UL(0x748f82ee5defb2fc), UL(0x78a5636f43172f60), UL(0x84c87814a1f0ab72), UL(0x8cc702081a6439ec), 
+    UL(0x90befffa23631e28), UL(0xa4506cebde82bde9), UL(0xbef9a3f7b2c67915), UL(0xc67178f2e372532b), 
+    UL(0xca273eceea26619c), UL(0xd186b8c721c0c207), UL(0xeada7dd6cde0eb1e), UL(0xf57d4f7fee6ed178), 
+    UL(0x06f067aa72176fba), UL(0x0a637dc5a2c898a6), UL(0x113f9804bef90dae), UL(0x1b710b35131c471b), 
+    UL(0x28db77f523047d84), UL(0x32caab7b40c72493), UL(0x3c9ebe0a15c9bebc), UL(0x431d67c49c100d4c), 
+    UL(0x4cc5d4becb3e42b6), UL(0x597f299cfc657e2a), UL(0x5fcb6fab3ad6faec), UL(0x6c44198c4a475817), 
+};
+
+#undef UL
+
+#define ROL(X, N) uint64_rol ( X, N )
+#define ROR(X, N) uint64_ror ( X, N )
+#define SHR(X, N) ((X) >> (N))
+
+#define Ch(X, Y, Z) (((X) & (Y))^((~(X))&(Z)))
+#define Maj(X, Y, Z) (((X)&(Y))^((X)&(Z))^((Y)&(Z)))
+#define Parity(X, Y, Z) ((X)^(Y)^(Z))
+#define Sigma0(X) (ROR((X), 28)^ROR((X), 34)^ROR((X), 39))
+#define Sigma1(X) (ROR((X), 14)^ROR((X), 18)^ROR((X), 41))
+#define sigma0(X) (ROR((X),  1)^ROR((X),  8)^SHR((X), 7))
+#define sigma1(X) (ROR((X), 19)^ROR((X), 61)^SHR((X), 6))
+
+static void SHA_stage(uint64_t Ho[8], const uint64_t Hi[8], uint64_t W[16])
+{
+    uint64_t a = Hi[0];
+    uint64_t b = Hi[1];
+    uint64_t c = Hi[2];
+    uint64_t d = Hi[3];
+    uint64_t e = Hi[4];
+    uint64_t f = Hi[5];
+    uint64_t g = Hi[6];
+    uint64_t h = Hi[7];
+    unsigned t;
+    
+    for (t = 0; t != 16; ++t) {
+        const uint64_t T1 = h + Sigma1(e) + Ch(e, f, g) + K[t] + W[t];
+        const uint64_t T2 = Sigma0(a) + Maj(a, b, c);
+        
+        h = g; g = f; f = e; e = d + T1;
+        d = c; c = b; b = a; a = T1 + T2;
+    }
+    for ( ; t != 80; ++t) {
+        const uint64_t T1 = h + Sigma1(e) + Ch(e, f, g) + K[t] +
+            (W[t%16] = sigma1(W[(t-2)%16])+W[(t-7)%16]+sigma0(W[(t-15)%16])+W[(t-16)%16]);
+        const uint64_t T2 = Sigma0(a) + Maj(a, b, c);
+        
+        h = g; g = f; f = e; e = d + T1;
+        d = c; c = b; b = a; a = T1 + T2;
+    }
+    Ho[0] = Hi[0] + a;
+    Ho[1] = Hi[1] + b;
+    Ho[2] = Hi[2] + c;
+    Ho[3] = Hi[3] + d;
+    Ho[4] = Hi[4] + e;
+    Ho[5] = Hi[5] + f;
+    Ho[6] = Hi[6] + g;
+    Ho[7] = Hi[7] + h;
+}
+
+static __inline__ void SHA_64b_Init(struct SHA64bitState *ctx, int which)
+{
+    if (which == 0)
+        memmove(ctx->H, H0_384, sizeof(H0_384));
+    else
+        memmove(ctx->H, H0_512, sizeof(H0_512));
+    ctx->len = 0;
+    ctx->cur = 0;
+}
+
+static __inline__ void SHA_64b_Append(struct SHA64bitState *ctx, const uint8_t data[], size_t length)
+{
+    unsigned i;
+    unsigned j;
+    unsigned n;
+    
+    ctx->len += length;
+    for (i = 0; i != length; i += n) {
+        n = length - i > 128 ? 128 : (unsigned)(length - i);
+        if (ctx->cur + n > 128)
+            n = 128 - ctx->cur;
+        memmove(&ctx->W[ctx->cur], &data[i], n);
+        ctx->cur += n;
+        if (ctx->cur == 128) {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+            uint64_t W[16];
+            
+            for (j = 0; j != 16; ++j)
+                W[j] = bswap_64(((const uint64_t *)ctx->W)[j]);
+            SHA_stage(ctx->H, ctx->H, W);
+#else
+            SHA_stage(ctx->H, ctx->H, ctx->W);
+#endif
+            ctx->cur = 0;
+        }
+    }
+}
+
+
+static __inline__ void SHA_64b_Finish(const struct SHA64bitState *ctx, uint64_t rslt[8])
+{
+    unsigned j;
+    unsigned const n = (ctx->cur + 7) >> 3;
+    uint64_t W[32];
+    
+    memset(W, 0, sizeof(W));
+    for (j = 0; j != n; ++j) {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+        W[j] = bswap_64(((const uint64_t *)ctx->W)[j]);
+#else
+        W[j] = ((const uint64_t *)ctx->W)[j];
+#endif
+    }
+    if (ctx->cur & 7) {
+        --j;
+        W[j] &= (~((uint64_t)0)) << ((8 - (ctx->cur & 7)) * 8);
+        W[j] |= ((uint64_t)0x80U) << ((7 - (ctx->cur & 7)) * 8);
+    }
+    else
+        W[j] = ((uint64_t)0x80U) << 56;
+    if (j < 14) {
+        W[14] = ctx->len >> 61;
+        W[15] = ctx->len <<  3;
+        SHA_stage(rslt, ctx->H, W);
+    }
+    else {
+        W[30] = ctx->len >> 61;
+        W[31] = ctx->len <<  3;
+        SHA_stage(rslt, ctx->H, W);
+        SHA_stage(rslt, rslt, W + 16);
+    }
+}
+
+void CC SHA384StateInit(SHA384State *ctx)
+{
+    SHA_64b_Init(ctx, 0);
+}
+
+void CC SHA384StateAppend(SHA384State *ctx, const void *data, size_t length)
+{
+    SHA_64b_Append(ctx, data, length);
+}
+
+void CC SHA384StateFinish(SHA384State *ctx, uint8_t hash[48])
+{
+    uint64_t H[8];
+
+    SHA_64b_Finish(ctx, H);
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    {
+        H[0] = bswap_64(H[0]);
+        H[1] = bswap_64(H[1]);
+        H[2] = bswap_64(H[2]);
+        H[3] = bswap_64(H[3]);
+        H[4] = bswap_64(H[4]);
+        H[5] = bswap_64(H[5]);
+    }
+#endif
+    memmove(hash, H, 48);
+}
+
+void CC SHA512StateInit(SHA512State *ctx)
+{
+    SHA_64b_Init(ctx, 1);
+}
+
+void CC SHA512StateAppend(SHA512State *ctx, const void *data, size_t length)
+{
+    SHA_64b_Append(ctx, data, length);
+}
+
+void CC SHA512StateFinish(SHA512State *ctx, uint8_t hash[64])
+{
+    uint64_t H[8];
+
+    SHA_64b_Finish(ctx, H);
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    {
+        H[0] = bswap_64(H[0]);
+        H[1] = bswap_64(H[1]);
+        H[2] = bswap_64(H[2]);
+        H[3] = bswap_64(H[3]);
+        H[4] = bswap_64(H[4]);
+        H[5] = bswap_64(H[5]);
+        H[6] = bswap_64(H[6]);
+        H[7] = bswap_64(H[7]);
+    }
+#endif
+    memmove(hash, H, 64);
+}
diff --git a/libs/klib/bsd/syserrcode.c b/libs/klib/bsd/syserrcode.c
new file mode 100644
index 0000000..dcc7082
--- /dev/null
+++ b/libs/klib/bsd/syserrcode.c
@@ -0,0 +1,44 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "writer-priv.h"
+#include <klib/writer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <os-native.h> /* for strchrnul on non-linux */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <assert.h>
+
+size_t KWrtFmt_error_code ( char * pout, size_t max, uint32_t error_code )
+{
+    strerror_r ((int)error_code, pout, max);
+    return string_size (pout);
+}
diff --git a/libs/klib/bsearch.c b/libs/klib/bsearch.c
new file mode 100644
index 0000000..b071479
--- /dev/null
+++ b/libs/klib/bsearch.c
@@ -0,0 +1,77 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/extern.h>
+#include <klib/sort.h>
+#include <sysalloc.h>
+
+/* Copyright (C) 1991,92,97,2000,02 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <stdlib.h>
+
+
+/* Perform a binary search for KEY in BASE which has NMEMB elements
+   of SIZE bytes each.  The comparisons are done by (*COMPAR)().  */
+LIB_EXPORT void* CC kbsearch ( const void *key, const void *base, size_t nmemb, size_t size,
+    int64_t ( CC * compar ) ( const void *, const void *, void *data ), void *data )
+{
+    size_t l, u, idx;
+    const void *p;
+    int64_t comparison;
+
+    l = 0;
+    u = nmemb;
+    while (l < u)
+    {
+        idx = (l + u) / 2;
+        p = (void *) (((const char *) base) + (idx * size));
+        comparison = (*compar) (key, p, data);
+        if (comparison < 0)
+            u = idx;
+        else if (comparison > 0)
+            l = idx + 1;
+        else
+            return (void *) p;
+    }
+
+    return NULL;
+}
diff --git a/libs/klib/bstpersist.c b/libs/klib/bstpersist.c
new file mode 100644
index 0000000..58eeb52
--- /dev/null
+++ b/libs/klib/bstpersist.c
@@ -0,0 +1,252 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "trie-priv.h"
+#include "pbstree-priv.h"
+#include <klib/container.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * PBSTree
+ * PBSTreeData
+ */
+
+typedef struct PBSTreeData PBSTreeData;
+struct PBSTreeData
+{
+    PTWriteFunc write;
+    void *write_param;
+
+    PTAuxFunc aux;
+    void *aux_param;
+
+    P_BSTree *pt;
+    void ( CC * record ) ( P_BSTree*, unsigned int, size_t );
+
+    size_t num_writ;
+    size_t data_size;
+    uint32_t num_nodes;
+
+    rc_t rc;
+};
+
+static
+bool CC PBSTreeGatherInfo ( BSTNode *n, void *data )
+{
+    PBSTreeData *pb = data;
+
+    size_t node_size;
+    pb -> rc = ( * pb -> aux ) ( pb -> aux_param, n, & node_size, NULL, NULL );
+    if ( pb -> rc != 0 )
+        return true;
+
+    if ( pb -> pt != NULL )
+        ( * pb -> record ) ( pb -> pt, pb -> num_nodes, pb -> data_size );
+
+    pb -> data_size += node_size;
+    ++ pb -> num_nodes;
+
+    return false;
+}
+
+static
+void CC PBSTreeRecordU8 ( P_BSTree *pt, unsigned int idx, size_t offset )
+{
+    pt -> data_idx . v8 [ idx ] = ( uint8_t ) offset;
+}
+
+static
+void CC PBSTreeRecordU16 ( P_BSTree *pt, unsigned int idx, size_t offset )
+{
+    pt -> data_idx . v16 [ idx ] = ( uint16_t ) offset;
+}
+
+static
+void CC PBSTreeRecordU32 ( P_BSTree *pt, unsigned int idx, size_t offset )
+{
+    pt -> data_idx . v32 [ idx ] = ( uint32_t ) offset;
+}
+
+static
+bool CC PBSTreeWriteNodes ( BSTNode *n, void *data )
+{
+    PBSTreeData *pb = data;
+
+    size_t node_size;
+    pb -> rc = ( * pb -> aux ) ( pb -> aux_param,
+        n, & node_size, pb -> write, pb -> write_param );
+    if ( pb -> rc != 0 )
+        return true;
+
+    pb -> num_writ += node_size;
+    return false;
+}
+
+/*--------------------------------------------------------------------------
+ * BSTree
+ */
+
+/* BSTreePersist
+ *  write a b-tree to some storage location
+ *
+ *  the b-tree is persisted by making between one and three passes
+ *  over its nodes, see description of "write" parameter.
+ *
+ *  the first pass examines internal tree structure and invokes
+ *  a user-supplied function to determine overall size.
+ *
+ *  the second pass persists the internal structure in a packed
+ *  format, using the user-supplied generic "write" function.
+ *
+ *  the third pass invokes another user-supplied function to write
+ *  auxiliary node data to output.
+ *
+ *  "num_writ" returns the number of bytes written as a result of
+ *  persisting the b-tree. this will be the actual bytes written
+ *  regardless of return status.
+ *
+ *  "write" is a generic output streaming function used for all
+ *  operations. if NULL, then the function will exit after its
+ *  first pass with the number of bytes required in "num_writ".
+ *
+ *  "aux" is a specialized function for streaming auxiliary node
+ *  data to output using the supplied "write" function. it is invoked
+ *  during the first pass with a NULL write function for gathering
+ *  size data, and during the third pass with a non-NULL write function.
+ */
+KLIB_EXTERN rc_t CC BSTreePersist ( const BSTree *bt, size_t *num_writ,
+    PTWriteFunc write, void *write_param, PTAuxFunc aux, void *aux_param )
+{
+    PBSTreeData pb;
+
+    if ( num_writ != NULL )
+        * num_writ = 0;
+
+    if ( bt == NULL )
+        return RC ( rcCont, rcTree, rcPersisting, rcSelf, rcNull );
+    if ( aux == NULL )
+        return RC ( rcCont, rcTree, rcPersisting, rcFunction, rcNull );
+
+    pb . num_writ = 0;
+
+    /* handle the trivial case */
+    if ( bt -> root == NULL )
+    {
+        P_BSTree pt;
+        if ( write == NULL )
+        {
+            pb . num_writ = sizeof pt . num_nodes;
+            pb . rc = 0;
+        }
+        else
+        {
+            pt . num_nodes = 0;
+            pb . rc = ( * write ) ( write_param,
+                & pt, sizeof pt . num_nodes, & pb . num_writ );
+        }
+    }
+    else
+    {
+        /* initialize callback param block */
+        pb . write = write;
+        pb . write_param = write_param;
+        pb . aux = aux;
+        pb . aux_param = aux_param;
+        pb . rc = 0;
+
+        /* count nodes and tally data size */
+        pb . pt = NULL;
+        pb . data_size = 0;
+        pb . num_nodes = 0;
+        BSTreeDoUntil ( bt, 0, PBSTreeGatherInfo, & pb );
+        if ( pb . rc == 0 )
+        {
+            size_t pt_size;
+
+            /* determine object size */
+            if ( pb . data_size <= 256 )
+            {
+                pt_size = 1;
+                pb . record = PBSTreeRecordU8;
+            }
+            else if ( pb . data_size <= 65536 )
+            {
+                pt_size = 2;
+                pb . record = PBSTreeRecordU16;
+            }
+            else
+            {
+                pt_size = 4;
+                pb . record = PBSTreeRecordU32;
+            }
+
+            pt_size = sizeof * pb . pt - sizeof pb . pt -> data_idx +
+                pb . num_nodes * pt_size;
+
+            if ( write == NULL )
+                pb . num_writ = pt_size + pb . data_size;
+
+            else
+            {
+                pb . pt = malloc ( pt_size );
+                if ( pb . pt != NULL )
+                {
+                    pb . pt -> num_nodes = pb . num_nodes;
+                    pb . pt -> data_size = ( uint32_t ) pb . data_size;
+                    
+                    /* record node offsets */
+                    pb . data_size = 0;
+                    pb . num_nodes = 0;
+                    BSTreeDoUntil ( bt, 0, PBSTreeGatherInfo, & pb );
+                    if ( pb . rc != 0 )
+                        free ( pb . pt );
+                    else
+                    {
+                        pb . rc = ( write ) ( write_param,
+                            pb . pt, pt_size, & pb . num_writ );
+                        free ( pb . pt );
+                        
+                        if ( pb . rc == 0 )
+                            BSTreeDoUntil ( bt, 0, PBSTreeWriteNodes, & pb );
+                    }
+                }
+            }
+        }
+    }
+
+    if ( num_writ != NULL )
+        * num_writ = pb . num_writ;
+
+    return pb . rc;
+}
diff --git a/libs/klib/btree.c b/libs/klib/btree.c
new file mode 100644
index 0000000..29d9bda
--- /dev/null
+++ b/libs/klib/btree.c
@@ -0,0 +1,1457 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/extern.h>
+#include <klib/btree.h>
+#include <klib/ksort-macro.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <stdio.h>
+
+typedef struct SearchWindow {
+    uint16_t	lower;
+    uint16_t	upper;
+} SearchWindow;
+
+
+/* the leaf node works out naturally to be an odd count
+ which is needed for splitting at the median. so we
+ let a leaf fill, then split before further insert */
+#define LNSIZE ( ( PGSIZE - 2 ) / 8 )
+#define LNMEDIAN ( LNSIZE / 2 )
+#define LNHALF ( LNSIZE / 2 )
+
+typedef struct LeafEntry LeafEntry;
+struct LeafEntry
+{
+    uint16_t key;
+    uint16_t ksize;
+};
+
+typedef struct LeafNode LeafNode;
+struct LeafNode
+{
+    uint16_t key_prefix;       /*** prefix offset into the blob ***/
+    uint16_t key_prefix_len;   /*** length of the prefix ***/
+    SearchWindow   win[256]; /*** search windows for first letter of the key ***/
+    uint16_t count;	       /*** number of elements **/
+    uint16_t key_bytes;        /*** bytes used for storing keys ***/
+    LeafEntry ord [ ( PGSIZE - 8 - 256 * sizeof(SearchWindow)) / sizeof ( LeafEntry ) ];
+};
+
+
+/* the branch node works out to be an even key count
+ which means that we also split before insert when
+ full, but the split leaves the target insert side
+ light, corrected immediately with an insert */
+#define BRSIZE ( ( PGSIZE - 2 - 4 ) / 12 )
+
+typedef struct BranchEntry BranchEntry;
+struct BranchEntry
+{
+    uint16_t key;
+    uint16_t ksize;
+    uint32_t trans;
+};
+
+typedef struct BranchNode BranchNode;
+struct BranchNode
+{
+    uint16_t key_prefix;       /*** offset into the blob ***/
+    uint16_t key_prefix_len;   /*** length of the prefix ***/
+    SearchWindow   win[256]; /*** search windows for first letter of the key ***/
+    /* the exact structure here is important:
+     "ltrans" will be accessed as node -> ord [ -1 ] . trans */
+    uint16_t count;
+    uint16_t key_bytes;
+    
+    uint32_t ltrans;
+    BranchEntry ord [ ( PGSIZE - 12 - 256 * sizeof(SearchWindow) ) / sizeof ( BranchEntry ) ];
+};
+
+
+
+/* when keys are stored in pages, the max key size
+ will be such that some number of keys are guaranteed to fit */
+#define MIN_KEY_COUNT 2
+#define MAX_KEY_SIZE \
+(( PGSIZE - 12 - 256 * sizeof(SearchWindow)   - \
+MIN_KEY_COUNT * ( sizeof ( BranchEntry ) + sizeof ( uint32_t ) ) \
+) / MIN_KEY_COUNT )
+
+
+
+/* Find
+ *  searches for a match
+ *
+ *  "val" [ OUT ] - return parameter for value found
+ *   accessed via KBTreeValueAccess* described above
+ *   must be balanced with a call to KBTreeValueWhack.
+ *
+ *  "key" [ IN ] and "key_size" [ IN ] - describes an
+ *   opaque key
+ */
+
+static int compare_keys(unsigned const qsize, uint8_t const query[/* qsize */], unsigned const ksize, uint8_t const key[/* ksize */])
+{
+    unsigned const csize = (qsize < ksize) ? qsize : ksize;
+    int const diff = csize == 0 ? 0 : memcmp(query, key, csize);
+    return diff == 0 ? (int)qsize - (int)ksize : diff;
+}
+
+static rc_t leaf_find(Pager *const pager, Pager_vt const *const vt, void const *page,
+                      uint32_t *id, uint8_t const *const query, unsigned const qsize)
+{
+    const uint8_t *query_8 = query;
+    size_t  qsize_8 = qsize;
+    const LeafNode *cnode = vt->access(pager, page);
+    assert(cnode != NULL);
+
+    if(cnode->key_prefix_len > 0){
+        const size_t key_prefix_len=cnode->key_prefix_len;
+        /*** prefix must match ***/
+        assert(key_prefix_len == 0 || compare_keys(key_prefix_len, query, key_prefix_len, ((uint8_t *)cnode )+cnode->key_prefix) == 0);
+        /*************************/
+        query_8 += key_prefix_len;
+        qsize_8 -= key_prefix_len;
+    }
+    {
+    /* perform search on branch node */
+    unsigned const q = (qsize_8 > 0)?*query_8:0;
+    unsigned lower = cnode->win[q].lower;
+    unsigned upper = cnode->win[q].upper;
+
+    while (lower < upper)
+    {
+        /* determine the slot to examine */
+        unsigned const slot = ( lower + upper ) >> 1;
+
+        /* perform comparison */
+        const uint8_t *key = & ( ( const uint8_t* ) cnode ) [ cnode -> ord [ slot ] . key ];
+        int const diff = compare_keys ( qsize_8, query_8, cnode -> ord [ slot ] . ksize, key );
+        if ( diff == 0 )
+        {
+            memmove(id, key + cnode->ord[slot].ksize, 4);
+            return 0;
+        }
+        if ( diff < 0 )
+            upper = slot;
+        else
+            lower = slot + 1;
+    }
+    }
+    return RC(rcDB, rcTree, rcSelecting, rcItem, rcNotFound);
+}
+
+static rc_t branch_find(Pager *const pager, Pager_vt const *const vt, void const *page,
+                        uint32_t *id, uint8_t const *const query, unsigned const qsize)
+{
+    const uint8_t *query_8 = query;
+    size_t  qsize_8 = qsize;
+    rc_t rc = 0;
+    const BranchNode *cnode = vt->access(pager, page);
+    assert(cnode != NULL);
+
+    if(cnode->key_prefix_len > 0){
+        const size_t key_prefix_len=cnode->key_prefix_len;
+        /*** prefix must match ***/
+        assert(key_prefix_len == 0 || compare_keys(key_prefix_len, query, key_prefix_len, ((uint8_t *)cnode )+cnode->key_prefix) == 0);
+        /*************************/
+        query_8 += key_prefix_len;
+        qsize_8 -= key_prefix_len;
+    }
+    {
+        /* perform search on branch node */
+        unsigned const q = (qsize_8 > 0)?*query_8:0;
+        unsigned lower = cnode->win[q].lower;
+        unsigned upper = cnode->win[q].upper;
+
+        while (lower < upper)
+        {
+            /* determine the slot to examine */
+            unsigned const slot = ( lower + upper ) >> 1;
+
+            /* perform comparison */
+            const uint8_t *key = & ( ( const uint8_t* ) cnode ) [ cnode -> ord [ slot ] . key ];
+            int const diff = compare_keys ( qsize_8, query_8, cnode -> ord [ slot ] . ksize, key );
+            if ( diff == 0 )
+            {
+                memmove(id, key + cnode->ord[slot].ksize, 4);
+                return 0;
+            }
+            if ( diff < 0 )
+                upper = slot;
+            else
+                lower = slot + 1;
+        }
+        /* should have the last slot tried ( < 0 ) or next slot to try ( > 0 ) */
+        assert ( lower == upper );
+
+        /* the node id is left-shifted by 1 and has the "branch-bit" indicator
+           in the LSB. the remaining bits should NOT be zero */
+        /* NB - if "upper" is 0 and type is signed,
+           this will access entry -1, giving "ltrans" */
+        {
+            uint32_t const nid = (upper == 0) ? cnode->ltrans : cnode -> ord [ upper - 1 ] . trans;
+            assert ( ( nid >> 1 ) != 0 );
+
+            /* access child node */
+            {
+                void const *const child = vt->use(pager, nid >> 1);
+                assert(child != NULL);
+                rc = ( ( ( nid & 1 ) == 0 ) ? leaf_find : branch_find )
+                    ( pager, vt, child, id, query, qsize );
+                vt->unuse(pager, child);
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC BTreeFind ( uint32_t const root, Pager *const pager, Pager_vt const *const vt, uint32_t *id,
+                              const void *const key, size_t const key_size )
+{
+    assert (root != 0);
+    assert (vt != NULL);
+    assert (id != NULL);
+    assert (key != NULL);
+    assert (key_size != 0);
+    {
+        rc_t rc = 0;
+        void const *const page = vt->use(pager, root >> 1);
+
+        assert(page != NULL);
+        rc = (((root & 1) == 0) ? leaf_find : branch_find)(pager, vt, page, id, key, key_size);
+        vt->unuse(pager, page);
+        return rc;
+    }
+}
+
+/* Entry
+ *  searches for a match or creates a new entry
+ *
+ *  "val" [ OUT ] - return parameter for value found
+ *   accessed via KBTreeValueAccess* described above
+ *   must be balanced with a call to KBTreeValueWhack.
+ *
+ *  "was_inserted" [ OUT ] - if true, the returned value was the result of an
+ *   insertion and can be guaranteed to be all 0 bits. otherwise, the returned
+ *   value will be whatever was there previously.
+ *
+ *  "alloc_size" [ IN ] - the number of value bytes to allocate upon insertion,
+ *   i.e. if the key was not found. this value must agree with the limits
+ *   specified in Make ( see above ).
+ *
+ *  "key" [ IN ] and "key_size" [ IN ] - describes an
+ *   opaque key
+ */
+typedef struct Split Split;
+struct Split
+{
+    void *key;
+    uint32_t left;
+    uint32_t right;
+    uint16_t ksize;
+    uint8_t buff [ 256 ];
+};
+
+void SplitInit(Split *const self)
+{
+    memset(self, 0, 32);
+}
+
+void SplitWhack(Split *const self)
+{
+    if (self->key && self->key != &self->buff[0]) {
+        free(self->key);
+    }
+}
+
+typedef struct EntryData EntryData;
+struct EntryData
+{
+    Pager *pager;
+    Pager_vt const *vt;
+    uint32_t root;
+    uint32_t *id;
+    const void *key;
+    size_t key_size;
+    bool was_inserted;
+};
+
+
+static
+rc_t make_entry ( EntryData *pb, void *hdrp, void *ordp )
+{
+    rc_t rc=0;
+    /* use id provided from outside */
+    {
+        uint8_t *page = hdrp;
+        LeafNode *hdr = hdrp;
+        LeafEntry *ord = ordp;
+        const uint8_t *key = pb -> key;
+        uint16_t key_size = (uint16_t) ( pb -> key_size - hdr->key_prefix_len );
+        
+        
+        assert(hdr->key_prefix_len == 0 || memcmp(key,page + hdr->key_prefix, hdr -> key_prefix_len)==0);/*** validate in debug mode **/
+        key += hdr->key_prefix_len;
+        
+        /* grab memory for key and value-id */
+        hdr -> key_bytes += key_size + sizeof ( uint32_t );
+        assert ( hdr -> key_bytes < PGSIZE );
+        
+        /* location of key within page */
+        ord -> key = PGSIZE - hdr -> key_bytes;
+        ord -> ksize = ( uint16_t ) key_size;
+        
+        /* insert key */
+        memmove ( page + ord -> key, key,  key_size );
+        
+        /* record value id */
+        memmove ( & page [ ord -> key + key_size ], pb -> id, sizeof * pb -> id );
+        
+        /* mark inserted */
+        pb -> was_inserted = true;
+    }
+    
+    return rc;
+}
+
+static
+bool leaf_node_full ( const LeafNode *node, size_t key_size )
+{
+    /*** add existing keys ***/
+    size_t size = node -> key_bytes;
+    /*** add new key ***/
+    
+    assert( key_size >= node -> key_prefix_len);
+    size += key_size + sizeof ( uint32_t ) - node -> key_prefix_len;
+    /*** add key index **/
+    size += (uint8_t*)(node->ord + node -> count+1)  - (uint8_t*)node ;
+    
+    if ( size > PGSIZE )
+    return true;
+    return false;
+}
+
+static
+rc_t leaf_insert ( EntryData *pb, LeafNode *node, uint32_t slot )
+{
+    rc_t rc;
+    uint16_t q;
+    
+    /* check that key will fit */
+    if ( leaf_node_full ( node, pb->key_size ) ) {
+        return RC ( rcDB, rcTree, rcInserting, rcConstraint, rcViolated );
+    }
+    
+    /* open hole */
+    if ( slot != node -> count )
+    memmove ( & node -> ord [ slot + 1 ], & node -> ord [ slot ], sizeof node -> ord [ 0 ] * ( node -> count - slot ) );
+    
+    /* enter into the leaf */
+    rc = make_entry ( pb, node, & node -> ord [ slot ] );
+    if ( rc == 0 )
+    ++ node -> count;
+    
+    /* recover from error */
+    else if ( slot != node -> count )
+    memmove ( & node -> ord [ slot ], & node -> ord [ slot + 1 ], sizeof node -> ord [ 0 ] * ( node -> count - slot ) );
+    
+    /* correct search windows */
+    q=(pb->key_size > node->key_prefix_len)?((uint8_t*)pb->key)[node->key_prefix_len]:0;
+    /*** unused windows should have been maintained properly ****/
+    assert((node->win[q].upper==node->win[q].lower)?(node->win[q].lower==slot):true);
+    node->win[q].upper ++;
+    for(q=q+1; q < 256; q++){
+        node->win[q].lower++;
+        node->win[q].upper++;
+    }
+    return rc;
+}
+
+static void LeafEntry_sort_desc_by_offset(uint16_t ord[], unsigned const count, LeafNode const *const node)
+{
+    uint16_t i;
+    
+    for (i = 0; i < (uint16_t)count; ++ i)
+        ord[i] = i;
+    
+#define CMP(A, B) (node->ord[*(uint16_t *)B].key - node->ord[*(uint16_t *)A].key)
+#define SWAP(A, B, C, D) do { i = *(uint16_t *)A; *(uint16_t *)A = *(uint16_t *)B; *(uint16_t *)B = i; } while(0)
+    {
+    KSORT(ord, count, sizeof(ord[0]), 0, 0);
+    }
+#undef SWAP
+#undef CMP
+}
+
+static void BranchEntry_sort_desc_by_offset(uint16_t ord[], unsigned const count, BranchNode const *const node)
+{
+    uint16_t i;
+    
+    for (i = 0; i < (uint16_t)count; ++ i)
+        ord[i] = i;
+    
+#define CMP(A, B) (node->ord[*(uint16_t *)B].key - node->ord[*(uint16_t *)A].key)
+#define SWAP(A, B, C, D) do { i = *(uint16_t *)A; *(uint16_t *)A = *(uint16_t *)B; *(uint16_t *)B = i; } while(0)
+    {
+    KSORT(ord, count, sizeof(ord[0]), 0, 0);
+    }
+#undef SWAP
+#undef CMP
+}
+
+static
+rc_t split_leaf ( EntryData *pb,
+                 LeafNode *left, LeafNode *right, uint32_t slot, Split *split)
+{
+    size_t off, ksize;
+    bool hoist_existing;
+    uint16_t ord [ ( sizeof left -> ord / sizeof left -> ord [ 0 ] + 1 ) / 2 ];
+    
+    /* calculate median */
+    int32_t i, j, median = ( left -> count + 1 ) >> 1;
+    
+    /* pointers to pages */
+    uint8_t * lpage = ( void* ) left;
+    uint8_t * rpage = ( void* ) right;
+    
+    /* check to see if key being inserted would be hoisted */
+    if ( slot == median && median > ( left -> count >> 1 ) )
+    {
+        hoist_existing = false;
+        ksize = pb -> key_size;
+    }
+    else
+    {
+        /* TBD - choose median based upon count and slot */
+        /* get median key size */
+        hoist_existing = true;
+        ksize = left -> ord [ median ] . ksize + left -> key_prefix_len;
+    }
+    
+    /* allocate key space */
+    split -> key = split -> buff;
+    if ( ksize > ( sizeof split -> buff - sizeof ( uint32_t ) ) )
+    {
+        split -> key = malloc ( ksize + sizeof ( uint32_t ) );
+        if ( split -> key == NULL )
+        return RC ( rcDB, rcTree, rcInserting, rcMemory, rcExhausted );
+    }
+    
+    /* copy out key plus value id */
+    if ( hoist_existing ){
+        split -> ksize = 0;
+        if(left -> key_prefix_len > 0){
+            memmove ( ((uint8_t*)split -> key) + split -> ksize, lpage + left -> key_prefix, left -> key_prefix_len );
+            split -> ksize +=left -> key_prefix_len;
+        }
+        memmove(((uint8_t*)split -> key) + split -> ksize, lpage + left -> ord [ median ] . key , left -> ord [ median ] . ksize + sizeof ( uint32_t ) );
+        split -> ksize += left -> ord [ median ] . ksize;
+    }
+    
+    /* right page is empty */
+    right -> key_bytes = 0;
+    
+    /* copy all of the keys to the right of median from left to right */
+    for ( i = 0, j = median + hoist_existing; j < left -> count; ++ i, ++ j )
+    {
+        ksize = left -> ord [ j ] . ksize + sizeof ( uint32_t );
+        right -> ord [ i ] . ksize = left -> ord [ j ] . ksize;
+        right -> key_bytes += (uint16_t) ksize;
+        right -> ord [ i ] . key = ( uint16_t ) ( PGSIZE - right -> key_bytes );
+        memmove (rpage + right -> ord [ i ] . key, lpage + left -> ord [ j ] . key, ksize );
+        if(i == 0 && left->key_prefix_len > 0){
+            right -> key_prefix_len = left -> key_prefix_len;
+            right -> key_bytes     += left -> key_prefix_len;
+            right -> key_prefix     = PGSIZE - right -> key_bytes;
+            memmove ( rpage + right -> key_prefix, lpage + left->key_prefix, left -> key_prefix_len );
+        }
+    }
+    
+    /* each node has half its former count */
+    right -> count = ( uint16_t ) i;
+    left -> count = median;
+    
+    /* compact the keys */
+    LeafEntry_sort_desc_by_offset(ord, median, left);
+    for ( left -> key_bytes = 0, i = 0; i < median; ++ i )
+    {
+        j = ord [ i ];
+        ksize = left -> ord [ j ] . ksize + sizeof ( uint32_t );
+        off = PGSIZE - ( left -> key_bytes += (uint16_t) ksize );
+        if ( left -> ord [ j ] . key != off )
+        {
+            memmove ( & lpage [ off ], & lpage [ left -> ord [ j ] . key ], ksize );
+            left -> ord [ j ] . key = ( uint16_t ) off;
+        }
+        if(i == 0 && left->key_prefix_len > 0){ /** need to restore prefix from the right ***/
+            left -> key_bytes += left -> key_prefix_len;
+            left -> key_prefix = PGSIZE - left -> key_bytes;
+            memmove ( lpage + left -> key_prefix, rpage + right -> key_prefix, left -> key_prefix_len );
+        }
+    }
+    /*** maintain search windows ****/
+    /*** find the last window of left ***/
+    for(i=0;left->win[i].upper < left->count; i++){
+        assert(i<256);
+        right->win[i].lower=0;
+        right->win[i].upper=0;
+    }
+    j=right->ord[0].ksize?((uint8_t*)right)[right->ord[0].key]:0;
+    assert(i<=j);
+    for(;i<j;i++){
+        right->win[i].lower=0;
+        right->win[i].upper=0;
+        left->win[i].upper=left->count;
+        left->win[i+1].lower=left->count;
+    }
+    /*** set first window of right ***/
+    right->win[i].lower = 0;
+    assert( left->win[i].upper >= left->count + hoist_existing);
+    right->win[i].upper = left->win[i].upper - left->count - hoist_existing;
+    /*** set last window of left ***/
+    left->win[i].upper = left->count;
+    i++;
+    /*** set right windows from left, reset left ***/
+    for(;i<256;i++){
+        assert( left->win[i].lower >= left->count + hoist_existing );
+        assert( left->win[i].upper >= left->count + hoist_existing );
+        right->win[i].lower = left->win[i].lower - left->count  - hoist_existing;
+        right->win[i].upper = left->win[i].upper - left->count  - hoist_existing;
+        left->win[i].lower=left->count;
+        left->win[i].upper=left->count;
+    }
+    assert(right->win[255].upper == right -> count);
+    /*** reset right window ***/
+    for(;i<256;i++){
+        right->win[i].lower=right->count;
+        right->win[i].upper=right->count;
+    }
+    /*****************************************/
+    
+    /* if insert would be hoisted, do it directly */
+    if ( ! hoist_existing )
+    {
+        memmove ( split -> key, pb -> key , pb -> key_size );
+        memmove ( & ( ( uint8_t* ) split -> key ) [ pb -> key_size ], pb -> id, sizeof * pb -> id );
+        split -> ksize =  (uint16_t) pb -> key_size;
+        return 0;
+    }
+    
+    /* TBD - with keys in pages, there is no guarantee that the following insert
+     will succeed, unless there would be a provision for overflow. */
+    
+    /* decide where to insert entry */
+    if ( slot <= (uint32_t) median )
+    return leaf_insert ( pb, left, slot );
+    return leaf_insert ( pb, right, slot - median - 1 );
+}
+
+
+
+static
+rc_t leaf_entry ( EntryData *pb, void const *page, Split *split)
+{
+    int lower, upper;
+    rc_t rc = 0;
+    
+    const uint8_t *query = pb -> key;
+    size_t qsize = pb -> key_size;
+    uint16_t q;
+    
+    /* access page for read */
+    const LeafNode *cnode = pb->vt->access(pb->pager, page);
+    assert(cnode != NULL);
+    
+    /* special case for root node initial insert */
+    if ( cnode -> count == 0 )
+    {
+        LeafNode *node = pb->vt->update(pb->pager, page);
+        assert(node != NULL);
+        
+        {
+            rc = make_entry ( pb, node, & node -> ord [ 0 ] );
+            if ( rc == 0 ){
+                int i;
+                q=(qsize >0)? *query:0;
+                node -> count = 1;
+                node -> win[q].lower = 0;
+                node -> win[q].upper = 1;
+                for(i=0;i<q;i++){
+                    node -> win[i].lower = 0;
+                    node -> win[i].upper = 0;
+                }
+                for(i=q+1;i<256;i++){
+                    node -> win[i].lower = 1;
+                    node -> win[i].upper = 1;
+                }
+            }
+        }
+        return rc;
+    }
+    
+    /* perform search on branch node */
+    /* start with prefix compare */
+    if(cnode->key_prefix_len > 0){
+        const size_t key_prefix_len=cnode->key_prefix_len;
+        /*** prefix must match ***/
+        assert(key_prefix_len == 0 || compare_keys(key_prefix_len, query, key_prefix_len, ((uint8_t *)cnode )+cnode->key_prefix) == 0);
+        /*************************/
+        query += cnode->key_prefix_len;
+        qsize -= cnode->key_prefix_len;
+        
+    }
+    q=(qsize >0)? *query:0;
+    for ( lower = cnode->win[q].lower, upper = cnode -> win[q].upper; lower < upper; )
+    {
+        /* determine the slot to examine */
+        int slot = ( lower + upper ) >> 1;
+        
+        /* perform comparison */
+        const uint8_t *key = & ( ( const uint8_t* ) cnode ) [ cnode -> ord [ slot ] . key ];
+        int diff = compare_keys(qsize, query, cnode -> ord [ slot ] . ksize, key);
+        if ( diff == 0 )
+        {
+            uint32_t val_id;
+            memmove ( & val_id, & key [ cnode -> ord [ slot ] . ksize ], sizeof val_id );
+            * pb -> id = val_id;
+            return 0;
+        }
+        if ( diff < 0 )
+        upper = slot;
+        else
+        lower = slot + 1;
+    }
+    
+    /* should have the last slot tried ( < 0 ) or next slot to try ( > 0 ) */
+    assert ( lower == upper );
+    {
+    /* going to need to update the node */
+    LeafNode *node = pb->vt->update(pb->pager, page);
+    assert(node != NULL);
+    
+    /* unless an error occurs */
+    pb -> was_inserted = true;
+    
+    /* test for split */
+    if ( leaf_node_full ( node, pb->key_size ) )
+    {
+        /* create another leaf node to right */
+        void const *dup = pb->vt->alloc(pb->pager, &split->right);
+        if (dup == NULL)
+        rc = RC ( rcDB, rcTree, rcInserting, rcMemory, rcExhausted );
+        else {
+            void *mem = pb->vt->update(pb->pager, dup);
+            assert(mem != NULL);
+            {
+                rc = split_leaf ( pb, node, mem, upper, split);
+                if ( rc == 0 )
+                {
+                    rc = RC ( rcDB, rcTree, rcInserting, rcId, rcInsufficient );
+                    split -> right <<= 1;
+                }
+            }
+            pb->vt->unuse(pb->pager, dup);
+        }
+    }
+    else
+    {
+        /* simple insert */
+        rc = leaf_insert ( pb, node, upper );
+    }
+    }
+    return rc;
+}
+
+static
+bool branch_node_full ( const BranchNode *node, size_t key_size )
+{
+    /*** add existing keys ***/
+    size_t size = node -> key_bytes;
+    /*** add new key ***/
+    assert( key_size >= node -> key_prefix_len);
+    size += key_size + sizeof ( uint32_t ) - node -> key_prefix_len;
+    
+    /*** add key index **/
+    size += (uint8_t*)(node->ord + node -> count+1)  - (uint8_t*)node ;
+    if ( size > PGSIZE )
+    return true;
+    return false;
+}
+
+static
+rc_t branch_insert ( BranchNode *node, const Split *split, uint32_t slot )
+{
+    uint16_t ksize = split -> ksize;
+    uint8_t *key   = split -> key;
+    uint8_t *page = (uint8_t*) node;
+    uint16_t q;
+    
+    /* remove prefix from the key */
+    ksize -= node -> key_prefix_len;
+    
+    assert(node->key_prefix_len == 0 || memcmp(key,page + node->key_prefix, node -> key_prefix_len)==0);/*** validate in debug mode **/
+    key   += node -> key_prefix_len;
+    
+    /* check that key will fit */
+    if ( branch_node_full ( node, split -> ksize ) )
+    return RC ( rcDB, rcTree, rcInserting, rcConstraint, rcViolated );
+    
+    /* open hole */
+    if ( slot != node -> count )
+    memmove ( & node -> ord [ slot + 1 ], & node -> ord [ slot ], sizeof node -> ord [ 0 ] * ( node -> count - slot ) );
+    
+    /* enter key value pair */
+    node -> key_bytes += ksize + sizeof ( uint32_t );
+    node -> ord [ slot ] . ksize = ksize;
+    node -> ord [ slot ] . key = ( uint16_t ) ( PGSIZE - node -> key_bytes );
+    memmove ( & ( ( uint8_t* ) node ) [ PGSIZE - node -> key_bytes ], key, ksize + sizeof ( uint32_t ) );
+    
+    /* enter the new transitions */
+    assert ( node -> ord [ ( int ) slot - 1 ] . trans == split -> left );
+    node -> ord [ ( int ) slot - 1 ] . trans = split -> left;
+    node -> ord [ slot ] . trans = split -> right;
+    
+    ++ node -> count;
+    
+    /* correct search windows */
+    q=(split->ksize > node->key_prefix_len)?((uint8_t*)split->key)[node->key_prefix_len]:0;
+    /*** unused windows should have beed maintained properly ****/
+    assert((node->win[q].upper==node->win[q].lower)?(node->win[q].lower==slot):true);
+    node->win[q].upper ++;
+    for(q=q+1; q < 256; q++){
+        node->win[q].lower++;
+        node->win[q].upper++;
+    }
+    return 0;
+}
+
+static rc_t split_branch ( BranchNode *left, BranchNode *right, const Split *val, Split *split, uint32_t slot)
+{
+    size_t off, ksize;
+    bool hoist_existing;
+    uint16_t ord [ ( sizeof left -> ord / sizeof left -> ord [ 0 ] + 1 ) / 2 ];
+    
+    /* calculate median */
+    int32_t i, j, median = ( left -> count + 1 ) >> 1;
+    
+    /* pointers to pages */
+    uint8_t * lpage = ( void* ) left;
+    uint8_t * rpage = ( void* ) right;
+    
+    /* check to see if key being inserted would be hoisted */
+    if ( slot == median && median > ( left -> count >> 1 ) )
+    {
+        hoist_existing = false;
+        ksize = val -> ksize;
+    }
+    else
+    {
+        /* get median key size */
+        hoist_existing = true;
+        ksize = left -> ord [ median ] . ksize + left -> key_prefix_len;
+    }
+    
+    /* allocate key space */
+    split -> key = split -> buff;
+    if ( ksize > ( sizeof split -> buff - sizeof ( uint32_t ) ) )
+    {
+        split -> key = malloc ( ksize + sizeof ( uint32_t ) );
+        if ( split -> key == NULL )
+        return RC ( rcDB, rcTree, rcInserting, rcMemory, rcExhausted );
+    }
+    
+    /* copy out key plus value id */
+    if ( hoist_existing ){
+        split -> ksize = 0;
+        if(left -> key_prefix_len > 0){
+            memmove ( ((uint8_t*)split -> key) + split -> ksize, lpage + left -> key_prefix, left -> key_prefix_len );
+            split -> ksize +=left -> key_prefix_len;
+        }
+        memmove(((uint8_t*)split -> key) + split -> ksize, lpage + left -> ord [ median ] . key , left -> ord [ median ] . ksize + sizeof ( uint32_t ) );
+        split -> ksize +=  left -> ord [ median ] . ksize;
+    }
+    
+    
+    /* right page is empty */
+    right -> key_bytes = 0;
+    
+    /* copy all of the keys to the right of the median from left to right */
+    for ( i = 0, j = median + hoist_existing; j < left -> count; ++ i, ++ j )
+    {
+        ksize = left -> ord [ j ] . ksize + sizeof ( uint32_t );
+        right -> ord [ i ] . ksize = left -> ord [ j ] . ksize;
+        right -> key_bytes += (uint16_t) ksize;
+        right -> ord [ i ] . key = ( uint16_t ) ( PGSIZE - right -> key_bytes );
+        memmove ( & rpage [ PGSIZE - right -> key_bytes ], & lpage [ left -> ord [ j ] . key ], ksize );
+        right -> ord [ i - 1 ] . trans = left -> ord [ j - 1 ] . trans;
+        if(i == 0 && left->key_prefix_len > 0){
+            off = PGSIZE - right -> key_bytes - left -> key_prefix_len;
+            memmove ( & rpage [ off ], lpage + left -> key_prefix, left -> key_prefix_len );
+            right -> key_bytes += left -> key_prefix_len;
+            right -> key_prefix_len = left -> key_prefix_len;
+            right -> key_prefix = (uint16_t) off;
+        }
+    }
+    
+    /* copy the last trans */
+    right -> ord [ i - 1 ] . trans = left -> ord [ j - 1 ] . trans;
+    
+    /* each node has half its former count */
+    right -> count = ( uint16_t ) i;
+    left -> count = median;
+    
+    /* compact the keys */
+    BranchEntry_sort_desc_by_offset(ord, median, left);
+    for ( left -> key_bytes = 0, i = 0; i < median; ++ i )
+    {
+        j = ord [ i ];
+        ksize = left -> ord [ j ] . ksize + sizeof ( uint32_t );
+        off = PGSIZE - ( left -> key_bytes += (uint16_t) ksize );
+        if ( left -> ord [ j ] . key != off )
+        {
+            memmove ( & lpage [ off ], & lpage [ left -> ord [ j ] . key ], ksize );
+            left -> ord [ j ] . key = ( uint16_t ) off;
+        }
+        if(i == 0 && left->key_prefix_len > 0){ /** need to restore prefix from the right ***/
+            off = PGSIZE - left -> key_bytes - left -> key_prefix_len;
+            memmove ( & lpage [ off ], rpage + right -> key_prefix, left -> key_prefix_len );
+            left -> key_bytes += left -> key_prefix_len;
+            left -> key_prefix = (uint16_t) off;
+        }
+    }
+    /*** maintain search windows ****/
+    /*** find the last window of left ***/
+    for(i=0;left->win[i].upper < left->count; i++){
+        assert(i<256);
+        right->win[i].lower=0;
+        right->win[i].upper=0;
+    }
+    j=right->ord[0].ksize?((uint8_t*)right)[right->ord[0].key]:0;
+    assert(i<=j);
+    for(;i<j;i++){
+        right->win[i].lower=0;
+        right->win[i].upper=0;
+        left->win[i].upper=left->count;
+        left->win[i+1].lower=left->count;
+    }
+    /*** set first window of right ***/
+    right->win[i].lower = 0;
+    assert( left->win[i].upper >= left->count + hoist_existing);
+    right->win[i].upper = left->win[i].upper - left->count - hoist_existing;
+    /*** set last window of left ***/
+    left->win[i].upper = left->count;
+    i++;
+    /*** set right windows from left, reset left ***/
+    for(;i<256;i++){
+        assert( left->win[i].lower >= left->count + hoist_existing );
+        assert( left->win[i].upper >= left->count + hoist_existing );
+        right->win[i].lower = left->win[i].lower - left->count  - hoist_existing;
+        right->win[i].upper = left->win[i].upper - left->count  - hoist_existing;
+        left->win[i].lower=left->count;
+        left->win[i].upper=left->count;
+    }
+    assert(right->win[255].upper == right -> count);
+    /*** reset right window ***/
+    for(;i<256;i++){
+        right->win[i].lower=right->count;
+        right->win[i].upper=right->count;
+    }
+    /*****************************************/
+    
+    /* if insert would be hoisted, do it directly */
+    if ( ! hoist_existing )
+    {
+        /* copy key and value */
+        memmove ( split -> key, val -> key, val -> ksize + sizeof ( uint32_t ) );
+        split ->  ksize = val -> ksize;
+        
+        /* set left and right transitions */
+        assert ( left -> ord [ median - 1 ] . trans == val -> left );
+        left -> ord [ median - 1 ] . trans = val -> left;
+        right -> ltrans = val -> right;
+        
+        return 0;
+    }
+    
+    /* decide where to insert entry */
+    if ( slot <= (uint32_t) median )
+        return branch_insert ( left, val, slot );
+    return branch_insert ( right, val, slot - median - 1 );
+}
+#define MIN_PREFIX_TO_COMPACT 1 /*** minimum prefix delta to initiate compacting ****/
+static
+rc_t leaf_compact (EntryData *pb, void const *pg,uint16_t prefix_len)
+{
+    rc_t rc = 0;
+    const LeafNode *cnode = pb->vt->access(pb->pager, pg);
+    assert(cnode != NULL);
+    
+    if(cnode->key_prefix_len < prefix_len) {
+        assert(cnode->count   > 0);
+        if( cnode->count   > 0 && prefix_len > cnode->key_prefix_len ){
+            prefix_len -= cnode->key_prefix_len; /*** need only to compact the delta **/
+            assert(prefix_len == 0 || memcmp(((uint8_t*)cnode)+cnode->ord[0].key,
+                          ((uint8_t*)cnode)+cnode->ord[cnode->count-1].key,
+                          prefix_len )==0);/****** To be sure ****/
+            if( prefix_len >= MIN_PREFIX_TO_COMPACT){ /*** good to compact ***/
+                LeafNode *node = pb->vt->update(pb->pager, pg);
+                assert(node != NULL);
+                {
+                    uint8_t  q,last;
+                    uint16_t i;
+                    uint16_t ord [ ( sizeof node -> ord / sizeof node -> ord [ 0 ] + 1 ) / 2 ];
+                    
+                    LeafEntry_sort_desc_by_offset(ord, node->count, node);
+                    /*** deal with prefix and index 0 ***/
+                    /*** prefix is cut from the last stored key on the page **/
+                    if(node->key_prefix_len == 0){
+                        node->key_prefix = node->ord[ord[0]].key;
+                    }
+                    node->key_prefix_len    += prefix_len;
+                    node->ord[ord[0]].key   += prefix_len;
+                    node->ord[ord[0]].ksize -= prefix_len;
+                    /*** deal with index 1 (shift) ***/
+                    if(node->count > 1){
+                        node->ord[ord[1]].key   += prefix_len;
+                        node->ord[ord[1]].ksize -= prefix_len;
+                    }
+                    /*** cut all other values ***/
+                    for ( i = 2; i < node->count; ++ i ){
+                        uint16_t j = ord[i];
+                        uint8_t *src = ((uint8_t*)node) + node->ord[j].key + prefix_len;
+                        uint8_t *dst = src + (i-1)*prefix_len; /*** proportional offset ***/
+                        uint16_t ksize = node->ord[j].ksize + sizeof ( uint32_t ) - prefix_len;
+                        memmove(dst,src,ksize);
+                        node->ord[j].ksize -= prefix_len;
+                        node->ord[j].key    = (uint16_t) ( dst -  ((uint8_t*)node) );
+                    }
+                    assert( node -> key_bytes > (node->count-1) * prefix_len);
+                    node -> key_bytes -= (node->count-1) * prefix_len;
+                    /*** rebuild search windows ***/
+                    q=node->ord[0].ksize?((uint8_t*)node)[node->ord[0].key]:0;
+                    for(i=0;i<q;i++){
+                        node->win[i].lower=0;
+                        node->win[i].upper=0;
+                    }
+                    node->win[q].lower=0;
+                    for(i=0,last=q;i< node->count; ++ i ){
+                        q=node->ord[i].ksize?((uint8_t*)node)[node->ord[i].key]:0;
+                        assert(last<=q);
+                        if(q!=last){
+                            node->win[last++].upper = i;
+                            for(;last<q;last++){/*** need to catch up ***/
+                                node->win[last].lower=i;
+                                node->win[last].upper=i;
+                            }
+                            node->win[q].lower=i;
+                            last=q;
+                        }
+                    }
+                    node->win[last].upper=node->count;
+                    for(i=last+1;i<256;i++){
+                        node->win[i].lower=node->count;
+                        node->win[i].upper=node->count;
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+static
+rc_t branch_compact (EntryData *pb, void const *pg,uint16_t prefix_len)
+{
+    rc_t rc = 0;
+    const BranchNode *cnode = pb->vt->access(pb->pager, pg);
+    assert(cnode != NULL);
+    
+    if(cnode->key_prefix_len < prefix_len) {
+        assert(cnode->count   > 0);
+        if( cnode->count   > 0 && prefix_len > cnode->key_prefix_len ){
+            prefix_len -= cnode->key_prefix_len; /*** need only to compact the delta **/
+            assert(prefix_len == 0 || memcmp(((uint8_t*)cnode)+cnode->ord[0].key,
+                          ((uint8_t*)cnode)+cnode->ord[cnode->count-1].key,
+                          prefix_len )==0);/****** To be sure ****/
+            if( prefix_len >= MIN_PREFIX_TO_COMPACT){ /*** good to compact ***/
+                BranchNode *node = pb->vt->update(pb->pager, pg);
+                assert(node != NULL);
+                {
+                    uint8_t	 q,last;
+                    uint16_t i;
+                    uint16_t ord [ ( sizeof node -> ord / sizeof node -> ord [ 0 ] + 1 ) / 2 ];
+                    
+                    BranchEntry_sort_desc_by_offset(ord, node->count, node);
+                    /*** deal with prefix and index 0 ***/
+                    /*** prefix is cut from the last stored key on the page **/
+                    if(node->key_prefix_len == 0){
+                        node->key_prefix = node->ord[ord[0]].key;
+                    }
+                    node->key_prefix_len    += prefix_len;
+                    node->ord[ord[0]].key   += prefix_len;
+                    node->ord[ord[0]].ksize -= prefix_len;
+                    /*** deal with index 1 (shift) ***/
+                    if(node->count > 1){
+                        node->ord[ord[1]].key   += prefix_len;
+                        node->ord[ord[1]].ksize -= prefix_len;
+                    }
+                    /*** cut all other values ***/
+                    for ( i = 2; i < node->count; ++ i ){
+                        uint16_t j = ord[i];
+                        uint8_t *src = ((uint8_t*)node) + node->ord[j].key + prefix_len;
+                        uint8_t *dst = src + (i-1)*prefix_len; /*** proportional offset ***/
+                        uint16_t ksize = node->ord[j].ksize + sizeof ( uint32_t ) - prefix_len;
+                        memmove(dst,src,ksize);
+                        node->ord[j].ksize -= prefix_len;
+                        node->ord[j].key    = (uint16_t) ( dst -  ((uint8_t*)node) );
+                    }
+                    assert( node -> key_bytes > (node->count-1) * prefix_len);
+                    node -> key_bytes -= (node->count-1) * prefix_len;
+                    /*** rebuild search windows ***/
+                    q=node->ord[0].ksize?((uint8_t*)node)[node->ord[0].key]:0;
+                    for(i=0;i<q;i++){
+                        node->win[i].lower=0;
+                        node->win[i].upper=0;
+                    }
+                    node->win[q].lower=0;
+                    for(i=0,last=q;i< node->count; ++ i ){
+                        q=node->ord[i].ksize?((uint8_t*)node)[node->ord[i].key]:0;
+                        assert(last<=q);
+                        if(q!=last){
+                            node->win[last++].upper = i;
+                            for(;last<q;last++){/*** need to catch up ***/
+                                node->win[last].lower=i;
+                                node->win[last].upper=i;
+                            }
+                            node->win[q].lower=i;
+                            last=q;
+                        }
+                    }
+                    node->win[last].upper=node->count;
+                    for(i=last+1;i<256;i++){
+                        node->win[i].lower=node->count;
+                        node->win[i].upper=node->count;
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+static
+rc_t compact_page ( EntryData *pb, uint32_t nid, uint16_t prefix_len)
+{
+    void const *pg = pb->vt->use(pb->pager, nid >> 1);
+    assert(pg != NULL);
+    {
+    rc_t const rc = (((nid & 1) == 0) ? leaf_compact : branch_compact)(pb, pg, prefix_len);
+    pb->vt->unuse(pb->pager, pg);
+    return rc;
+    }
+}
+
+
+static
+rc_t branch_entry ( EntryData *pb, void const *page, Split *rsplit)
+{
+    void const *child;
+    uint32_t nid;
+    int lower, upper;
+    const uint8_t *query = pb -> key;
+    size_t qsize = pb -> key_size;
+    uint16_t q;
+    rc_t rc = 0;
+
+    /* look at node in read-only mode */
+    const BranchNode *cnode = pb->vt->access(pb->pager, page);
+    assert(cnode != NULL);
+    
+    /* perform search on branch node */
+    /* start with prefix compare */
+    if(cnode->key_prefix_len > 0){
+        const size_t key_prefix_len=cnode->key_prefix_len;
+        /*** prefix must match ***/
+        assert(key_prefix_len == 0 || compare_keys(key_prefix_len, query,key_prefix_len, ((uint8_t *)cnode )+cnode->key_prefix) == 0);
+        /*************************/
+        query += cnode->key_prefix_len;
+        qsize -= cnode->key_prefix_len;
+    }
+    q = (qsize>0)?*query:0;
+    
+    for ( lower = cnode->win[q].lower, upper = cnode -> win[q].upper; lower < upper; )
+    {
+        /* determine the slot to examine */
+        int slot = ( lower + upper ) >> 1;
+        
+        /* perform comparison */
+        const uint8_t *key = & ( ( const uint8_t* ) cnode ) [ cnode -> ord [ slot ] . key ];
+        int diff = compare_keys(qsize, query, cnode -> ord [ slot ] . ksize, key);
+        if ( diff == 0 )
+        {
+            memmove(pb->id, &key[cnode->ord[slot].ksize], 4);
+            return 0;
+        }
+        if ( diff < 0 )
+        upper = slot;
+        else
+        lower = slot + 1;
+    }
+    
+    /* should have the last slot tried ( < 0 ) or next slot to try ( > 0 ) */
+    assert ( lower == upper );
+    
+    /* the node id is left-shifted by 1 and has the "branch-bit" indicator
+     in the LSB. the remaining bits should NOT be zero */
+    nid = cnode -> ord [ upper - 1 ] . trans;
+    assert ( ( nid >> 1 ) != 0 );
+    
+    /* access child node */
+    child = pb->vt->use(pb->pager, nid >> 1);
+    assert(child != NULL);
+    {
+        Split split;
+        SplitInit ( & split );
+        /* recursively continue search */
+        rc = (((nid & 1) == 0) ? leaf_entry : branch_entry)(pb, child, &split);
+        /* detect split */
+        if ( GetRCState ( rc ) == rcInsufficient && GetRCObject ( rc ) == rcId )
+        {
+            /* splitting may replace value being inserted in to the branch ***/
+            /* access current node */
+            BranchNode *node = pb->vt->update(pb->pager, page);
+            assert(node != NULL);
+            rc = 0;
+            {
+                split . left = nid;
+                
+                /* if we are also full, we have to split */
+                if ( branch_node_full ( node, split.ksize ) )
+                {
+                    /* create another branch node to right */
+                    void const *dup = pb->vt->alloc(pb->pager, &rsplit->right);
+                    if (dup == NULL)
+                        rc = RC ( rcDB, rcTree, rcInserting, rcMemory, rcExhausted );
+                    else {
+                        void *mem = pb->vt->update(pb->pager, dup);
+                        assert(mem != NULL);
+                        {
+                            split_branch( node, mem, & split, rsplit, upper);
+                            rc = RC ( rcDB, rcTree, rcInserting, rcId, rcInsufficient );
+                            rsplit -> right += rsplit -> right + 1;
+                        }
+                        pb->vt->unuse(pb->pager, dup);
+                    }
+                }
+                else
+                {
+                    int pl;/**common prefix_len **/
+                    /* hoist into location */
+                    /* it will increase node->count and upper will start pointing into a new key ***/
+                    if(rc==0 && upper > 0 ){ /*** left side compact is possible  upper is 1 based ***/
+                        uint8_t   *a = (uint8_t*)split.key;
+                        uint8_t   *b = (uint8_t*)node;
+                        
+                        a += node->key_prefix_len;
+                        b += node->ord[upper-1].key;
+                        assert ( node->ord[upper-1].trans == split.left );
+                        for(pl=0;pl < split.ksize - node->key_prefix_len && pl < node->ord[upper-1].ksize && a[pl]==b[pl];pl++){}
+                        pl+=node->key_prefix_len;
+                        if(pl >= MIN_PREFIX_TO_COMPACT){
+                            rc=compact_page(pb,split.left,pl);
+                        }
+                    }
+                    if(rc==0 && upper < node->count ){ /*** right side compact is possible ***/
+                        uint8_t   *a = (uint8_t*)split.key;
+                        uint8_t   *b = (uint8_t*)node;
+                        a += node->key_prefix_len;
+                        b += node->ord[upper].key;
+                        for(pl=0;pl < split.ksize - node->key_prefix_len && pl < node->ord[upper].ksize && a[pl]==b[pl];pl++){}
+                        pl+=node->key_prefix_len;
+                        if(pl >= MIN_PREFIX_TO_COMPACT){
+                            rc=compact_page(pb,split.right,pl);
+                        }
+                    }
+                    if(rc == 0 ){
+                        rc=branch_insert ( node, & split, upper );
+                        assert(rc==0);
+                    }
+                }
+            }
+        }
+        
+        SplitWhack ( & split );
+        
+        pb->vt->unuse(pb->pager, child);
+    }
+    
+    return rc;
+}
+
+static rc_t tree_entry(EntryData *pb)
+{
+    void const *page;
+    rc_t rc;
+    Split split;
+    
+    if (pb->root == 0) {
+        uint32_t new_id = 0;
+        
+        page = pb->vt->alloc(pb->pager, &new_id);
+        if (page == NULL)
+            return RC ( rcDB, rcTree, rcInserting, rcMemory, rcExhausted );
+        pb->root = new_id << 1;
+    }
+    else {
+        page = pb->vt->use(pb->pager, pb->root >> 1);
+        assert(page != NULL);
+    }
+    SplitInit(&split);
+    
+    rc = (((pb->root & 1) == 0) ? leaf_entry : branch_entry)(pb, page, &split);
+    /* detect split */
+    if ( GetRCState ( rc ) == rcInsufficient && GetRCObject ( rc ) == rcId ) {
+        void const *new_root;
+
+        rc = 0;
+        split.left = pb->root;
+        new_root = pb->vt->alloc(pb->pager, &pb->root);
+        if (new_root) {
+            BranchNode *node = pb->vt->update(pb->pager, new_root);
+            assert(node != NULL);
+            {
+                uint16_t	q,i;
+                /* install the new root */
+                node -> key_bytes = split . ksize + sizeof ( uint32_t );
+                node -> key_prefix_len = 0;
+                node -> key_prefix = 0;
+                node -> ord [ 0 ] . ksize = split . ksize;
+                node -> ord [ 0 ] . key = ( uint16_t ) ( PGSIZE - node -> key_bytes );
+                memmove ( & ( ( uint8_t* ) node ) [ PGSIZE - node -> key_bytes ], split . key, node -> key_bytes );
+                node -> ltrans = split . left;
+                node -> ord [ 0 ] . trans = split . right;
+                node -> count = 1;
+                /* 				assert ( split . left < 10000 && split . right < 10000); */
+                /*** init search windows ***/
+                q=(split.ksize>0)? *(uint8_t*)split.key:0;
+                node -> win[q].lower = 0;
+                node -> win[q].upper = 1;
+                for(i=0;i<q;i++){
+                    node -> win[i].lower = 0;
+                    node -> win[i].upper = 0;
+                }
+                for(i=q+1;i<256;i++){
+                    node -> win[i].lower = 1;
+                    node -> win[i].upper = 1;
+                }
+                pb->root = (pb->root << 1) | 1;
+            }
+            pb->vt->unuse(pb->pager, new_root);
+        }
+        else
+            rc = RC ( rcDB, rcTree, rcInserting, rcMemory, rcExhausted );
+    }
+    SplitWhack(&split);
+    pb->vt->unuse(pb->pager, page);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC BTreeEntry ( uint32_t *root, Pager *pager, Pager_vt const *vt, uint32_t *id,
+                               bool *was_inserted, const void *key, size_t key_size )
+{
+    assert(root != NULL);
+    assert(vt != NULL);
+    assert(id != NULL);
+    assert(was_inserted != NULL);
+    assert(key != NULL);
+    assert(key_size != 0);
+    {
+        EntryData pb;
+        
+        pb.pager = pager;
+        pb.vt = vt;
+        pb.root = *root;
+        pb.id = id;
+        pb.key = key;
+        pb.key_size = key_size;
+        pb.was_inserted = false;
+        {
+            rc_t const rc = tree_entry(&pb);
+            
+            *root = pb.root;
+            *was_inserted = pb.was_inserted;
+            return rc;
+        }
+    }
+}
+
+
+/* ForEach
+ *  executes a function on each tree element
+ *
+ *  "reverse" [ IN ] - if true, iterate in reverse order
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - callback function
+ */
+static void invoke_foreach_func ( void const *const cnode, void const *const ordp,
+                                 void ( CC * f ) ( const void *key, size_t key_size, uint32_t id, void *data ), void *data )
+{
+    LeafEntry const *const ord = ordp;
+    uint8_t const *const page = cnode;
+    uint8_t const *const key = &page[ord->key];
+    size_t const key_size = ord->ksize;
+    uint32_t val_id;
+    
+    memmove(&val_id, &key[key_size], 4);
+    f(key, key_size, val_id, data);
+}
+
+static void foreach_leaf_reverse(uint32_t nodeid, Pager *pager, Pager_vt const *vt,
+                                 void ( CC * f ) ( const void *key, size_t key_size, uint32_t id, void *data ), void *data )
+{
+    void const *const page = vt->use(pager, nodeid);
+    assert(page != NULL);
+    {
+        unsigned i;
+    LeafNode const *const node = vt->access(pager, page);
+    assert(node != NULL);
+    
+    for (i = node->count; i > 0; ) {
+        invoke_foreach_func(node, &node->ord[--i], f, data);
+    }
+    }
+    vt->unuse(pager, page);
+}
+
+static void foreach_branch_reverse(uint32_t nodeid, Pager *pager, Pager_vt const *vt,
+                                   void ( CC * f ) ( const void *key, size_t key_size, uint32_t id, void *data ), void *data )
+{
+    void const *const page = vt->use(pager, nodeid);
+    assert(page != NULL);
+    {
+        unsigned i;
+    BranchNode const *const node = vt->access(pager, page);
+    assert(node != NULL);
+    
+    for (i = node->count; i > 0; ) {
+        uint32_t const child = node->ord[--i].trans;
+        
+        invoke_foreach_func(node, &node->ord[i], f, data);
+        if (child & 1) {
+            foreach_branch_reverse(child >> 1, pager, vt, f, data);
+        }
+        else {
+            foreach_leaf_reverse(child >> 1, pager, vt, f, data);
+        }
+    }
+    }
+    vt->unuse(pager, page);
+}
+
+static void foreach_reverse(uint32_t root, Pager *pager, Pager_vt const *vt,
+                            void ( CC * f ) ( const void *key, size_t key_size, uint32_t id, void *data ), void *data )
+{
+    if (root & 1) {
+        foreach_branch_reverse(root >> 1, pager, vt, f, data);
+    }
+    else {
+        foreach_leaf_reverse(root >> 1, pager, vt, f, data);
+    }
+}
+
+static void foreach_leaf(uint32_t nodeid, Pager *pager, Pager_vt const *vt,
+                         void ( CC * f ) ( const void *key, size_t key_size, uint32_t id, void *data ), void *data )
+{
+    void const *const page = vt->use(pager, nodeid);
+    assert(page != NULL);
+    {
+        unsigned i;
+    LeafNode const *const node = vt->access(pager, page);
+    assert(node != NULL);
+    
+    for (i = 0; i < node->count; ++i) {
+        invoke_foreach_func(node, &node->ord[i], f, data);
+    }
+    }
+    vt->unuse(pager, page);
+}
+
+static void foreach_branch(uint32_t nodeid, Pager *pager, Pager_vt const *vt,
+                           void ( CC * f ) ( const void *key, size_t key_size, uint32_t id, void *data ), void *data )
+{
+    void const *const page = vt->use(pager, nodeid);
+    assert(page != NULL);
+    {
+        unsigned i;
+    BranchNode const *const node = vt->access(pager, page);
+    assert(node != NULL);
+    
+    for (i = 0; i < node->count; ++i) {
+        uint32_t const child = node->ord[i].trans;
+        
+        invoke_foreach_func(node, &node->ord[i], f, data);
+        if (child & 1) {
+            foreach_branch(child >> 1, pager, vt, f, data);
+        }
+        else {
+            foreach_leaf(child >> 1, pager, vt, f, data);
+        }
+    }
+    }
+    vt->unuse(pager, page);
+}
+
+static void foreach(uint32_t root, Pager *pager, Pager_vt const *vt,
+                    void ( CC * f ) ( const void *key, size_t key_size, uint32_t id, void *data ), void *data )
+{
+    if (root & 1) {
+        foreach_branch(root >> 1, pager, vt, f, data);
+    }
+    else {
+        foreach_leaf(root >> 1, pager, vt, f, data);
+    }
+}
+
+LIB_EXPORT rc_t CC BTreeForEach ( uint32_t root, Pager *pager, Pager_vt const *vt, bool reverse,
+                                 void ( CC * f ) ( const void *key, size_t key_size, uint32_t id, void *data ), void *data )
+{
+    if (vt != NULL && root != 0 && f != NULL) {
+        if (reverse) {
+            foreach_reverse(root, pager, vt, f, data);
+        }
+        else {
+            foreach(root, pager, vt, f, data);
+        }
+    }
+    return 0;
+}
diff --git a/libs/klib/container.c b/libs/klib/container.c
new file mode 100644
index 0000000..710b722
--- /dev/null
+++ b/libs/klib/container.c
@@ -0,0 +1,1646 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/container.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * SLNode
+ *  singly linked node
+ */
+
+#if 0
+/* SLNodeFindNext
+ *  find next element satisfying criteria
+ */
+LIB_EXPORT SLNode* CC SLNodeFindNext ( const SLNode *p, bool ( CC * f ) ( const SLNode *n ) )
+{
+    if ( p != NULL )
+    {
+        SLNode *n = p -> next;
+        while ( n != NULL )
+        {
+            if ( ( * f ) ( n ) )
+                return n;
+            n = n -> next;
+        }
+    }
+    return NULL;
+}
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SLList
+ *  singly linked list
+ */
+
+/* SLListPushTail
+ *  push a single node onto tail of list
+ */
+LIB_EXPORT void CC SLListPushTail ( SLList *sl, SLNode *n )
+{
+    if ( sl != NULL && n != NULL )
+    {
+        if ( sl -> tail == NULL )
+            sl -> head = sl -> tail = n;
+        else
+        {
+            sl -> tail -> next = n;
+            sl -> tail = n;
+        }
+        n -> next = NULL;
+    }
+}
+
+/* SLListPopHead
+ *  pop a single node from head of list
+ */
+LIB_EXPORT SLNode* CC SLListPopHead ( SLList *sl )
+{
+    if ( sl != NULL )
+    {
+        SLNode *n = sl -> head;
+        if ( n != NULL )
+        {
+            sl -> head = n -> next;
+            if ( n -> next == NULL )
+                sl -> tail = NULL;
+        }
+        return n;
+    }
+    return NULL;
+}
+
+/* SLListPopTail
+ *  pop a single node from tail of list
+ */
+LIB_EXPORT SLNode* CC SLListPopTail ( SLList *sl )
+{
+    if ( sl != NULL )
+    {
+        SLNode *n = sl -> head;
+        if ( n != NULL )
+        {
+            SLNode *tail = sl -> tail;
+            if ( n == tail )
+            {
+                sl -> head = sl -> tail = NULL;
+                return n;
+            }
+            while ( n -> next != tail )
+                n = n -> next;
+            sl -> tail = n;
+            n -> next = NULL;
+            return tail;
+        }
+    }
+    return NULL;
+}
+
+/* SLListUnlink
+ *  removes a designated node from list
+ */
+LIB_EXPORT void CC SLListUnlink ( SLList *sl, SLNode *n )
+{
+    if ( sl != NULL && n != NULL )
+    {
+        SLNode *p = sl -> head;
+        if ( p == n )
+        {
+            sl -> head = p -> next;
+            if ( p -> next == NULL )
+                sl -> tail = NULL;
+        }
+        else while ( p != NULL )
+        {
+            if ( p -> next == n )
+            {
+                p -> next = n -> next;
+                if ( n -> next == NULL )
+                    sl -> tail = p;
+                break;
+            }
+            p = p -> next;
+        }
+    }
+}
+
+/* SLListForEach
+ *  executes a function on each list element
+ */
+LIB_EXPORT void CC SLListForEach ( const SLList *sl,
+    void ( CC * f ) ( SLNode *n, void *data ), void *data )
+{
+    if ( sl != NULL )
+    {
+        SLNode *n = sl -> head;
+        while ( n != NULL )
+        {
+            SLNode *next = n -> next;
+            ( * f ) ( n, data );
+            n = next;
+        }
+    }
+}
+
+/* SLListDoUntil
+ *  executes a function on each element
+ *  until the function returns true
+ */
+LIB_EXPORT bool CC SLListDoUntil ( const SLList *sl,
+    bool ( CC * f ) ( SLNode *n, void *data ), void *data )
+{
+    if ( sl )
+    {
+        SLNode *n = sl -> head;
+        while ( n != NULL )
+        {
+            SLNode *next = n -> next;
+            if ( ( * f ) ( n, data ) )
+                return true;
+            n = next;
+        }
+    }
+
+    return false;
+}
+
+/* SLListFindFirst
+ *  find first element satisfying criteria
+ */
+LIB_EXPORT SLNode* CC SLListFindFirst ( const SLList *sl,
+    bool ( CC * f ) ( const SLNode *n ) )
+{
+    if ( sl != NULL )
+    {
+        SLNode *n = sl -> head;
+        while ( n != NULL )
+        {
+            SLNode *next = n -> next;
+            if ( ( * f ) ( n ) )
+                return n;
+            n = next;
+        }
+    }
+    return NULL;
+}
+
+/* SLListWhack
+ *  pops elements from list and
+ *  executes a user provided destructor
+ */
+LIB_EXPORT void CC SLListWhack ( SLList *sl, 
+    void ( CC * whack ) ( SLNode *n, void *data ), void *data )
+{
+    if ( sl != NULL )
+    {
+        SLNode *n = sl -> head;
+        sl -> head = sl -> tail = NULL;
+
+        if ( whack != NULL )
+        {
+            while ( n != NULL )
+            {
+                SLNode *next = n -> next;
+                ( * whack ) ( n, data );
+                n = next;
+            }
+        }
+    }
+}
+
+
+/*--------------------------------------------------------------------------
+ * DLNode
+ *  doubly linked node
+ */
+
+#if 0
+/* DLNodeFindNext
+ *  find next element satisfying criteria
+ */
+LIB_EXPORT DLNode* CC DLNodeFindNext ( const DLNode *p, 
+    bool ( CC * f ) ( const DLNode *n ) )
+{
+    if ( p != NULL )
+    {
+        DLNode *n = p -> next;
+        while ( n != NULL )
+        {
+            if ( ( * f ) ( n ) )
+                return n;
+            n = n -> next;
+        }
+    }
+    return NULL;
+}
+
+/* DLNodeFindPrev
+ *  find previous element satisfying criteria
+ */
+LIB_EXPORT DLNode* CC DLNodeFindPrev ( const DLNode *p,
+    bool ( CC * f ) ( const DLNode *n ) )
+{
+    if ( p != NULL )
+    {
+        DLNode *n = p -> prev;
+        while ( n != NULL )
+        {
+            if ( ( * f ) ( n ) )
+                return n;
+            n = n -> prev;
+        }
+    }
+    return NULL;
+}
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * DLList
+ *  doubly linked list
+ */
+
+/* DLListPushHead
+ *  push a single node onto the head of list
+ */
+LIB_EXPORT void CC DLListPushHead ( DLList *dl, DLNode *n )
+{
+    if ( dl != NULL && n != NULL )
+    {
+        n -> prev = NULL;
+        n -> next = dl -> head;
+        if ( dl -> head == NULL )
+            dl -> head = dl -> tail = n;
+        else
+        {
+            dl -> head -> prev = n;
+            dl -> head = n;
+        }
+    }
+}
+
+/* DLListPushTail
+ *  push a single node onto the tail of list
+ */
+LIB_EXPORT void CC DLListPushTail ( DLList *dl, DLNode *n )
+{
+    if ( dl != NULL && n != NULL )
+    {
+        n -> next = NULL;
+        n -> prev = dl -> tail;
+        if ( dl -> tail == NULL )
+            dl -> tail = dl -> head = n;
+        else
+        {
+            dl -> tail -> next = n;
+            dl -> tail = n;
+        }
+    }
+}
+
+/* DLListPopHead
+ *  pop a single node from head of list
+ */
+LIB_EXPORT DLNode* CC DLListPopHead ( DLList *dl )
+{
+    if ( dl != NULL )
+    {
+        DLNode *n = dl -> head;
+        if ( dl -> head != NULL )
+        {
+            dl -> head = n -> next;
+            if ( n -> next == NULL )
+                dl -> tail = NULL;
+            else
+                n -> next -> prev = NULL;
+        }
+        return n;
+    }
+    return NULL;
+}
+
+/* DLListPopTail
+ *  pop a single node from tail of list
+ */
+LIB_EXPORT DLNode* CC DLListPopTail ( DLList *dl )
+{
+    if ( dl != NULL )
+    {
+        DLNode *n = dl -> tail;
+        if ( dl -> tail != NULL )
+        {
+            dl -> tail = n -> prev;
+            if ( n -> prev == NULL )
+                dl -> head = NULL;
+            else
+                n -> prev -> next = NULL;
+        }
+        return n;
+    }
+    return NULL;
+}
+
+/* DLListPrependList
+ *  pushes list contents onto the head of target
+ */
+LIB_EXPORT void CC DLListPrependList ( DLList *dl, DLList *l )
+{
+    if ( dl != NULL && l != NULL && l -> head != NULL )
+    {
+        if ( dl -> tail == NULL )
+            * dl = * l;
+        else
+        {
+            dl -> head -> prev = l -> tail;
+            l -> tail -> next = dl -> head;
+            dl -> head = l -> head;
+        }
+
+        l -> head = l -> tail = NULL;
+    }
+}
+
+/* DLListAppendList
+ *  pushes list contents onto the tail of target
+ */
+LIB_EXPORT void CC DLListAppendList ( DLList *dl, DLList *l )
+{
+    if ( dl != NULL && l != NULL && l -> head != NULL )
+    {
+        if ( dl -> tail == NULL )
+            * dl = * l;
+        else
+        {
+            dl -> tail -> next = l -> head;
+            l -> head -> prev = dl -> tail;
+            dl -> tail = l -> tail;
+        }
+
+        l -> head = l -> tail = NULL;
+    }
+}
+
+/* DLListInsertNodeBefore
+ *  inserts node "n" before "which" within list
+ */
+LIB_EXPORT void CC DLListInsertNodeBefore ( DLList *dl, DLNode *which, DLNode *n )
+{
+    if ( which != NULL && n != NULL )
+    {
+        /* take care of "n" */
+        n -> next = which;
+        n -> prev = which -> prev;
+
+        /* link "which"'s prev to "n" */
+        if ( which -> prev != NULL )
+            which -> prev -> next = n;
+
+        /* or if none, then perhaps head of list */
+        else if ( dl != NULL && dl -> head == which )
+            dl -> head = n;
+
+        /* link "which" to "n" */
+        which -> prev = n;
+    }
+}
+
+/* DLListInsertNodeAfter
+ *  inserts node "n" after "which" within list
+ */
+LIB_EXPORT void CC DLListInsertNodeAfter ( DLList *dl, DLNode *which, DLNode *n )
+{
+    if ( which != NULL && n != NULL )
+    {
+        /* take care of "n" */
+        n -> prev = which;
+        n -> next = which -> next;
+
+        /* link "which"'s next to "n" */
+        if ( which -> next != NULL )
+            which -> next -> prev = n;
+
+        /* or if none, then perhaps tail of list */
+        else if ( dl != NULL && dl -> tail == which )
+            dl -> tail = n;
+
+        /* link "which" to "n" */
+        which -> next = n;
+    }
+}
+
+/* DLListInsertListBefore
+ *  inserts list "l" before "which" within list "dl"
+ */
+LIB_EXPORT void CC DLListInsertListBefore ( DLList *dl, DLNode *which, DLList *l )
+{
+    if ( which != NULL && l != NULL && l -> head != NULL )
+    {
+        /* take care of inserting list */
+        l -> tail -> next = which;
+        l -> head -> prev = which -> prev;
+
+        /* link "which"'s prev to "l -> head" */
+        if ( which -> prev != NULL )
+            which -> prev -> next = l -> head;
+
+        /* or if none, then perhaps head of list */
+        else if ( dl != NULL && dl -> head == which )
+            dl -> head = l -> head;
+
+        /* link "which" to "l -> tail" */
+        which -> prev = l -> tail;
+
+        /* remove items from "l" */
+        l -> head = l -> tail = NULL;
+    }
+}
+
+/* DLListInsertListAfter
+ *  inserts list "l" after "which" within list "dl"
+ */
+LIB_EXPORT void CC DLListInsertListAfter ( DLList *dl, DLNode *which, DLList *l )
+{
+    if ( which != NULL && l != NULL && l -> head != NULL )
+    {
+        /* take care of inserting list */
+        l -> head -> prev = which;
+        l -> tail -> next = which -> next;
+
+        /* link "which"'s next to "l -> tail" */
+        if ( which -> next != NULL )
+            which -> next -> prev = l -> tail;
+
+        /* or if none, then perhaps tail of list */
+        else if ( dl != NULL && dl -> tail == which )
+            dl -> head = l -> tail;
+
+        /* link "which" to "l -> head" */
+        which -> next = l -> head;
+
+        /* remove items from "l" */
+        l -> head = l -> tail = NULL;
+    }
+}
+
+/* DLListUnlink
+ *  removes a designated node from list
+ */
+LIB_EXPORT void CC DLListUnlink ( DLList *dl, DLNode *n )
+{
+    if ( n != NULL )
+    {
+        if ( n -> next == NULL )
+        {
+            if ( dl != NULL && dl -> tail == n )
+            {
+                if ( n -> prev == NULL )
+                    dl -> head = dl -> tail = NULL;
+                else
+                {
+                    n -> prev -> next = NULL;
+                    dl -> tail = n -> prev;
+                }
+            }
+            else
+            {
+                if ( n -> prev != NULL )
+                    n -> prev -> next = NULL;
+            }
+        }
+        else if ( n -> prev == NULL )
+        {
+            n -> next -> prev = NULL;
+            if ( dl != NULL && dl -> head == n )
+                dl -> head = n -> next;
+        }
+        else
+        {
+            n -> next -> prev = n -> prev;
+            n -> prev -> next = n -> next;
+        }
+    }
+}
+
+/* DLListForEach
+ *  executes a function on each list element
+ */
+LIB_EXPORT void CC DLListForEach ( const DLList *dl, bool reverse,
+    void ( CC * f ) ( DLNode *n, void *data ), void *data )
+{
+    if ( dl != NULL )
+    {
+        DLNode *n, *next;
+        if ( reverse )
+        {
+            n = dl -> tail;
+            while ( n != NULL )
+            {
+                next = n -> prev;
+                ( * f ) ( n, data );
+                n = next;
+            }
+        }
+        else
+        {
+            n = dl -> head;
+            while ( n != NULL )
+            {
+                next = n -> next;
+                ( * f ) ( n, data );
+                n = next;
+            }
+        }
+    }
+}
+
+/* DLListDoUntil
+ *  executes a function on each element
+ *  until the function returns 1
+ */
+LIB_EXPORT bool CC DLListDoUntil ( const DLList *dl, bool reverse,
+    bool ( CC * f ) ( DLNode *n, void *data ), void *data )
+{
+    if ( dl != NULL )
+    {
+        DLNode *n, *next;
+        if ( reverse )
+        {
+            n = dl -> tail;
+            while ( n != NULL )
+            {
+                next = n -> prev;
+                if ( ( * f ) ( n, data ) )
+                    return true;
+                n = next;
+            }
+        }
+        else
+        {
+            n = dl -> head;
+            while ( n != NULL )
+            {
+                next = n -> next;
+                if ( ( * f ) ( n, data ) )
+                    return true;
+                n = next;
+            }
+        }
+    }
+    return false;
+}
+
+/* DLListFindFirst
+ *  find first element satisfying criteria
+ */
+LIB_EXPORT DLNode* CC DLListFindFirst ( const DLList *dl,
+    bool ( CC * f ) ( const DLNode *n ) )
+{
+    if ( dl != NULL )
+    {
+        DLNode *n = dl -> head;
+        while ( n != NULL )
+        {
+            if ( ( * f ) ( n ) )
+                return n;
+            n = n -> next;
+        }
+    }
+    return NULL;
+}
+
+/* DLListFindLast
+ *  find last element satisfying criteria
+ */
+LIB_EXPORT DLNode* CC DLListFindLast ( const DLList *dl,
+    bool ( CC * f ) ( const DLNode *n ) )
+{
+    if ( dl != NULL )
+    {
+        DLNode *n = dl -> tail;
+        while ( n != NULL )
+        {
+            if ( ( * f ) ( n ) )
+                return n;
+            n = n -> prev;
+        }
+    }
+    return NULL;
+}
+
+/* DLListWhack
+ *  pops elements from list and
+ *  executes a user provided destructor
+ */
+LIB_EXPORT void CC DLListWhack ( DLList *dl,
+    void ( CC * whack ) ( DLNode *n, void *data ), void *data )
+{
+    if ( dl != NULL )
+    {
+        DLNode *n = dl -> head;
+        dl -> head = dl -> tail = NULL;
+
+        if ( whack != NULL )
+        {
+            while ( n != NULL )
+            {
+                DLNode *next = n -> next;
+                ( * whack ) ( n, data );
+                n = next;
+            }
+        }
+    }
+}
+
+
+/*--------------------------------------------------------------------------
+ * BSTNode
+ *  b-tree node
+ */
+
+#define LEFT 1
+#define RIGHT 2
+
+#define BALANCE( node ) \
+    ( ( size_t ) ( node ) -> par & 3 )
+#define ZERO_BALANCE( node ) \
+    ( * ( size_t* ) & ( node ) -> par &= ~ ( size_t ) 3 )
+#define CLR_BALANCE( node, bal ) \
+    ( * ( size_t* ) & ( node ) -> par ^= ( bal ) )
+#define SET_BALANCE( node, bal ) \
+    ( * ( size_t* ) & ( node ) -> par |= ( bal ) )
+#define LEFT_HEAVY( node ) \
+    ( ( ( size_t ) ( node ) -> par & LEFT ) != 0 )
+#define RIGHT_HEAVY( node ) \
+    ( ( ( size_t ) ( node ) -> par & RIGHT ) != 0 )
+
+#define PMASK 3
+#define BBITS( node, bal ) ( bal )
+
+#define PBITS( node ) \
+    ( ( size_t ) ( node ) -> par & PMASK )
+#define PARENT( node ) \
+    ( BSTNode* ) ( ( size_t ) ( node ) -> par & ~ ( size_t ) PMASK )
+#define SET_PARENT( node, p ) \
+    ( ( node ) -> par = ( BSTNode* ) ( ( size_t ) ( p ) | PBITS ( node ) ) )
+#define SET_PARBAL( node, p, bal ) \
+    ( ( node ) -> par = ( BSTNode* ) ( ( size_t ) ( p ) | BBITS ( node, bal ) ) )
+
+
+/* LeftMost
+ *  returns the left-most child
+ */
+static
+BSTNode* CC LeftMost ( BSTNode *q )
+{
+    if ( q != NULL )
+    {
+        BSTNode *p = q -> child [ 0 ];
+        while ( p != NULL )
+        {
+            q = p;
+            p = p -> child [ 0 ];
+        }
+    }
+    return q;
+}
+
+/* RightMost
+ *  returns the right-most child
+ */
+static
+BSTNode* CC RightMost ( BSTNode *q )
+{
+    if ( q != NULL )
+    {
+        BSTNode *p = q -> child [ 1 ];
+        while ( p != NULL )
+        {
+            q = p;
+            p = p -> child [ 1 ];
+        }
+    }
+    return q;
+}
+
+/* FirstNode
+ *  the left-most node in tree
+ */
+#define FirstNode( bt ) \
+    LeftMost ( ( bt ) -> root )
+
+/* LastNode
+ *  the right-most node in tree
+ */
+#define LastNode( bt ) \
+    RightMost ( ( bt ) -> root )
+
+/* BSTNodeNext
+ *  returns next node
+ */
+LIB_EXPORT BSTNode* CC BSTNodeNext ( const BSTNode *n )
+{
+    BSTNode *p;
+
+    if ( n == NULL )
+        return NULL;
+
+    p = n -> child [ 1 ];
+    if ( p == 0 )
+    {
+        BSTNode *q = ( BSTNode* ) n;
+        while ( 1 )
+        {
+            p = PARENT ( q );
+            if ( p == NULL )
+                return NULL;
+            if ( p -> child [ 0 ] == q )
+                return p;
+            q = p;
+        }
+    }
+    return LeftMost ( p );
+}
+
+/* BSTNodePrev
+ *  returns prev node
+ */
+LIB_EXPORT BSTNode* CC BSTNodePrev ( const BSTNode *n )
+{
+    BSTNode *p = n -> child [ 0 ];
+    if ( p == 0 )
+    {
+        BSTNode *q = ( BSTNode* ) n;
+        while ( 1 )
+        {
+            p = PARENT ( q );
+            if ( p == NULL )
+                return NULL;
+            if ( p -> child [ 1 ] == q )
+                return p;
+            q = p;
+        }
+    }
+    return RightMost ( p );
+}
+
+/* BSTNodeParent
+ *  returns a parent node if there, NULL otherwise
+ */
+LIB_EXPORT BSTNode* CC BSTNodeParent ( const BSTNode *n )
+{
+    if ( n != NULL )
+        return PARENT ( n );
+    return NULL;
+}
+
+/* BSTNodeFindNext
+ *  find next element satisfying criteria
+ */
+LIB_EXPORT BSTNode* CC BSTNodeFindNext ( const BSTNode *p,
+    bool ( CC * f ) ( const BSTNode *n ) )
+{
+    if ( p != NULL )
+    {
+        BSTNode *n = BSTNodeNext ( p );
+        while ( n != NULL )
+        {
+            if ( ( * f ) ( n ) )
+                return n;
+            n = BSTNodeNext ( n );
+        }
+    }
+    return NULL;
+}
+
+/* BSTNodeFindPrev
+ *  find previous element satisfying criteria
+ */
+LIB_EXPORT BSTNode* CC BSTNodeFindPrev ( const BSTNode *p,
+    bool ( CC * f ) ( const BSTNode *n ) )
+{
+    if ( p != NULL )
+    {
+        BSTNode *n = BSTNodePrev ( p );
+        while ( n != NULL )
+        {
+            if ( ( * f ) ( n ) )
+                return n;
+            n = BSTNodePrev ( n );
+        }
+    }
+    return NULL;
+}
+
+
+/*--------------------------------------------------------------------------
+ * BSTree
+ *  b-tree
+ */
+
+/* BSTreeDepth
+ *  returns number of layers in b-tree
+ *
+ *  if "exact" is 1, then the maximum
+ *  depth is returned. otherwise, the depth of
+ *  an arbitrary leaf node is returned
+ */
+LIB_EXPORT uint32_t CC BSTreeDepth ( const BSTree *bt, bool exact )
+{
+    BSTNode *p;
+    uint32_t depth;
+
+    if ( bt == NULL || bt -> root == NULL )
+        return 0;
+
+    depth = 1;
+
+    if ( exact )
+    {
+        for ( p = FirstNode ( bt ); p != NULL; p = BSTNodeNext ( p ) )
+        {
+            BSTNode *q;
+            unsigned int ndepth;
+
+            if ( p -> child [ 0 ] != NULL || p -> child [ 1 ] != NULL )
+                continue;
+
+            for ( ndepth = 1, q = PARENT ( p ); q != NULL; q = PARENT ( q ) )
+                ++ ndepth;
+
+            if ( ndepth > depth )
+                depth = ndepth;
+        }
+    }
+    else
+    {
+        for ( p = bt -> root;; ++ depth )
+        {
+            if ( p -> child [ 0 ] != NULL )
+                p = p -> child [ 0 ];
+            else if ( p -> child [ 1 ] != NULL )
+                p = p -> child [ 1 ];
+            else
+                break;
+        }
+    }
+
+    return depth;
+}
+
+/* BSTreeFirst
+ *  returns first node
+ */
+LIB_EXPORT BSTNode* CC BSTreeFirst ( const BSTree *bt )
+{
+    if ( bt == NULL )
+        return NULL;
+    return FirstNode ( bt );
+}
+
+/* BSTreeLast
+ *  returns last node
+ */
+LIB_EXPORT BSTNode* CC BSTreeLast ( const BSTree *bt )
+{
+    if ( bt == NULL )
+        return NULL;
+    return LastNode ( bt );
+}
+
+/* BSTreeFind
+ *  find an object within tree
+ *  "cmp" function returns equivalent of "item" - "n"
+ */
+LIB_EXPORT BSTNode* CC BSTreeFind ( const BSTree *bt, const void *item,
+    int64_t ( CC * cmp ) ( const void *item, const BSTNode *n ) )
+{
+    if ( bt != NULL )
+    {
+        BSTNode *n = bt -> root;
+        while ( n != NULL )
+        {
+            int64_t diff = ( * cmp ) ( item, n );
+            if ( diff == 0 )
+                return n;
+            n = n -> child [ diff > 0 ];
+        }
+    }
+    return NULL;
+}
+
+/* BSTreeInsert
+ *  insert an object within tree, even if duplicate
+ *  "sort" function returns equivalent of "item" - "n"
+ *
+ *  the treatment of order for items reported as identical
+ *  i.e. sort function returns zero when they are compared,
+ *  is undefined.
+ *
+ *  the current implementation treats '<=' as '<' such
+ *  that all inserts are converted to a '<' or '>' comparison,
+ *  but this should not be relied upon.
+ */
+static
+BSTNode* CC RotateRightAtY ( BSTNode *y, BSTNode *x )
+{
+    BSTNode *w = x;
+    BSTNode *z = x -> child [ 1 ];
+    y -> child [ 0 ] = z;
+    x -> child [ 1 ] = y;
+    x -> par = PARENT ( y );
+    y -> par = x;
+
+    /* patch parent link */
+    if ( z != 0 )
+        SET_PARENT ( z, y );
+
+    return w;
+}
+
+static
+BSTNode* CC RotateLeftAtY ( BSTNode *y, BSTNode *x )
+{
+    BSTNode *w = x;
+    BSTNode *z = x -> child [ 0 ];
+    y -> child [ 1 ] = z;
+    x -> child [ 0 ] = y;
+    x -> par = PARENT ( y );
+    y -> par = x;
+
+    /* patch parent link */
+    if ( z != 0 )
+        SET_PARENT ( z, y );
+
+    return w;
+}
+
+static
+BSTNode* CC RotateLeftAtXRightAtY ( BSTNode *y, BSTNode *x )
+{
+    BSTNode *w = x -> child [ 1 ];
+    BSTNode *z = w -> child [ 0 ];
+    x -> child [ 1 ] = z;
+    if ( z != 0 )
+        SET_PARENT ( z, x );
+    z = w -> child [ 1 ];
+    w -> child [ 0 ] = x;
+    y -> child [ 0 ] = z;
+    w -> child [ 1 ] = y;
+        
+    switch ( BALANCE ( w ) )
+    {
+    case 0:
+        w -> par = PARENT ( y );
+        x -> par = w;
+        y -> par = w;
+        break;
+    case LEFT:
+        w -> par = PARENT ( y );
+        x -> par = w;
+        SET_PARBAL ( y, w, RIGHT );
+        break;
+    case RIGHT:
+        w -> par = PARENT ( y );
+        SET_PARBAL ( x, w, LEFT );
+        y -> par = w;
+        break;
+    }
+
+    /* patch parent link */
+    if ( z != 0 )
+        SET_PARENT ( z, y );
+
+    return w;
+}
+
+static
+BSTNode* CC RotateRightAtXLeftAtY ( BSTNode *y, BSTNode *x )
+{
+    BSTNode *w = x -> child [ 0 ];
+    BSTNode *z = w -> child [ 1 ];
+    x -> child [ 0 ] = z;
+    if ( z != 0 )
+        SET_PARENT ( z, x );
+    z = w -> child [ 0 ];
+    w -> child [ 1 ] = x;
+    y -> child [ 1 ] = z;
+    w -> child [ 0 ] = y;
+        
+    switch ( BALANCE ( w ) )
+    {
+    case 0:
+        w -> par = PARENT ( y );
+        x -> par = w;
+        y -> par = w;
+        break;
+    case LEFT:
+        w -> par = PARENT ( y );
+        SET_PARBAL ( x, w, RIGHT );
+        y -> par = w;
+        break;
+    case RIGHT:
+        w -> par = PARENT ( y );
+        x -> par = w;
+        SET_PARBAL ( y, w, LEFT );
+        break;
+    }
+
+    /* patch parent link */
+    if ( z != 0 )
+        SET_PARENT ( z, y );
+
+    return w;
+}
+
+static
+BSTNode* CC RebalanceLeft ( BSTNode *y, BSTNode *x )
+{
+    /* detect child balance */
+    if ( LEFT_HEAVY ( x ) )
+        return RotateRightAtY ( y, x );
+
+    /* child is right heavy */
+    return RotateLeftAtXRightAtY ( y, x );
+}
+
+static
+BSTNode* CC RebalanceRight ( BSTNode *y, BSTNode *x )
+{
+    /* detect child balance */
+    if ( RIGHT_HEAVY ( x ) )
+        return RotateLeftAtY ( y, x );
+
+    /* left heavy */
+    return RotateRightAtXLeftAtY ( y, x );
+}
+
+
+static
+void CC RebalanceAfterInsert ( BSTNode **root, BSTNode *y, BSTNode *x )
+{
+    BSTNode *w, *z;
+
+    /* detect left insertion */
+    if ( y -> child [ 0 ] == x )
+    {
+        /* if y was right-heavy, done */
+        if ( RIGHT_HEAVY ( y ) )
+        {
+            CLR_BALANCE ( y, RIGHT );
+            return;
+        }
+
+        /* rebalance left insertion */
+        w = RebalanceLeft ( y, x );
+    }
+
+    /* right insertion */
+    else
+    {
+        /* if y was left-heavy, done */
+        if ( LEFT_HEAVY ( y ) )
+        {
+            CLR_BALANCE ( y, LEFT );
+            return;
+        }
+
+        /* rebalance right insertion */
+        w = RebalanceRight ( y, x );
+    }
+
+    /* fix parent to child */
+    assert ( BALANCE ( w ) == 0 );
+    z = w -> par;
+    if ( z == 0 )
+        * root = w;
+    else
+        z -> child [ z -> child [ 1 ] == y ] = w;
+}
+
+LIB_EXPORT rc_t CC BSTreeInsert ( BSTree *bt, BSTNode *n,
+    int64_t ( CC * sort ) ( const BSTNode *n, const BSTNode *p ) )
+{
+    if ( bt != NULL && n != NULL )
+    {
+        int64_t diff;
+
+        BSTNode *p = bt -> root;
+        BSTNode *q = NULL;
+        BSTNode *y = NULL;
+
+        while ( p != NULL )
+        {
+            diff = ( * sort ) ( n, p );
+            q = p;
+            if ( BALANCE ( p ) != 0 )
+                y = p;
+            p = p -> child [ diff > 0 ];
+        }
+
+        n -> par = q;
+        n -> child [ 0 ] = n -> child [ 1 ] = NULL;
+
+        if ( q == NULL )
+            bt -> root = n;
+        else
+        {
+            q -> child [ diff > 0 ] = n;
+
+            /* run a trace-back */
+            for ( p = n; q != y; )
+            {
+                /* this is safe because q has 0 balance */
+                BSTNode *z = q -> par;
+                if ( q -> child [ 0 ] == p )
+                    SET_BALANCE ( q, LEFT );
+                else
+                    SET_BALANCE ( q, RIGHT );
+
+                p = q;
+                q = z;
+            }
+
+            /* rebalance */
+            if ( q != NULL )
+                RebalanceAfterInsert ( & bt -> root, q, p );
+        }
+    }
+
+    /* never fails in this implementation */
+    return 0;
+}
+
+/* BSTreeInsertUnique
+ *  insert an object within tree, but only if unique
+ *  "sort" function returns equivalent of "item" - "n"
+ *  returns non-NULL "n" upon match or NULL on success
+ */
+LIB_EXPORT rc_t CC BSTreeInsertUnique ( BSTree *bt, BSTNode *n, BSTNode **exist,
+    int64_t ( CC * sort ) ( const BSTNode *n, const BSTNode *p ) )
+{
+    if ( bt != NULL && n != NULL )
+    {
+        int64_t diff;
+
+        BSTNode *p = bt -> root;
+        BSTNode *q = NULL;
+        BSTNode *y = NULL;
+
+        while ( p != NULL )
+        {
+            diff = ( * sort ) ( n, p );
+
+            if ( diff == 0 )
+            {
+                /* fail to insert */
+                if ( exist != NULL )
+                    * exist = p;
+                return SILENT_RC ( rcCont, rcTree, rcInserting, rcNode, rcExists );
+            }
+
+            q = p;
+            if ( BALANCE ( p ) != 0 )
+                y = p;
+            p = p -> child [ diff > 0 ];
+        }
+
+        n -> par = q;
+        n -> child [ 0 ] = n -> child [ 1 ] = NULL;
+
+        if ( q == NULL )
+            bt -> root = n;
+        else
+        {
+            q -> child [ diff > 0 ] = n;
+
+            /* run a trace-back */
+            for ( p = n; q != y; )
+            {
+                /* this is safe because q has 0 balance */
+                BSTNode *z = q -> par;
+                if ( q -> child [ 0 ] == p )
+                    SET_BALANCE ( q, LEFT );
+                else
+                    SET_BALANCE ( q, RIGHT );
+
+                p = q;
+                q = z;
+            }
+
+            /* rebalance */
+            if ( q != NULL )
+                RebalanceAfterInsert ( & bt -> root, q, p );
+        }
+    }
+
+    /* only fails on existing item in this implementation */
+    return 0;
+}
+
+/* BSTreeResort
+ *  an optimized removal and re-insertion of
+ *  all contained elements using another function
+ *
+ *  the treatment of order for items reported as identical
+ *  i.e. sort function returns zero when they are compared,
+ *  is undefined.
+ *
+ *  the current implementation treats '<=' as '<' such
+ *  that all inserts are converted to a '<' or '>' comparison,
+ *  but this should not be relied upon.
+ */
+LIB_EXPORT void CC BSTreeResort ( BSTree *bt,
+    int64_t ( CC * resort ) ( const BSTNode *item, const BSTNode *n ) )
+{
+    if ( bt != NULL )
+    {
+        BSTNode *p = bt -> root;
+        bt -> root = NULL;
+
+        while ( p != NULL )
+        {
+            BSTNode *q = p -> child [ 0 ];
+            if ( q == 0 )
+            {
+                q = p -> child [ 1 ];
+                BSTreeInsert ( bt, p, resort );
+            }
+            else
+            {
+                p -> child [ 0 ] = q -> child [ 1 ];
+                q -> child [ 1 ] = p;
+            }
+            p = q;
+        }
+    }
+}
+
+/* BSTreeUnlink
+ *  removes a node from tree
+ */
+static
+void CC RebalanceAfterUnlink ( BSTNode **root, BSTNode *q, int dir )
+{
+    while ( q != 0 )
+    {
+        BSTNode *w, *x, *y = q;
+        q = PARENT ( q );
+
+        if ( ! dir )
+        {
+            if ( q && q -> child [ 1 ] == y )
+                dir = 1;
+
+            /* simulate an increment of balance */
+            switch ( BALANCE ( y ) )
+            {
+            case 0:
+                SET_BALANCE ( y, RIGHT );
+                return;
+            case LEFT:
+                CLR_BALANCE ( y, LEFT );
+                break;
+            case RIGHT:
+                /* y has just become ++ */
+                x = y -> child [ 1 ];
+                if ( LEFT_HEAVY ( x ) )
+                {
+                    w = RotateRightAtXLeftAtY ( y, x );
+                    if ( q == 0 )
+                        * root = w;
+                    else
+                        q -> child [ dir ] = w;
+                }
+                else
+                {
+                    w = y -> child [ 1 ] = x -> child [ 0 ];
+                    x -> child [ 0 ] = y;
+                    SET_PARENT ( x, q );
+                    SET_PARENT ( y, x );
+                    if ( w != 0 )
+                        SET_PARENT ( w, y );
+                    if ( q == 0 )
+                        * root = x;
+                    else
+                        q -> child [ dir ] = x;
+                    if ( BALANCE ( x ) == 0 )
+                    {
+                        SET_BALANCE ( x, LEFT );
+                        SET_PARBAL ( y, x, RIGHT );
+                        return;
+                    }
+                    ZERO_BALANCE ( x );
+                    ZERO_BALANCE ( y );
+                    /* y = x; */
+                }
+                break;
+            }
+        }
+
+        /* symmetric case */
+        else
+        {
+            if ( q && q -> child [ 0 ] == y )
+                dir = 0;
+
+            switch ( BALANCE ( y ) )
+            {
+            case 0:
+                SET_BALANCE ( y, LEFT );
+                return;
+            case LEFT:
+                /* y has just become -- */
+                x = y -> child [ 0 ];
+                if ( RIGHT_HEAVY ( x ) )
+                {
+                    w = RotateLeftAtXRightAtY ( y, x );
+                    if ( q == 0 )
+                        * root = w;
+                    else
+                        q -> child [ dir ] = w;
+                }
+                else
+                {
+                    w = x -> child [ 1 ];
+                    y -> child [ 0 ] = w;
+                    x -> child [ 1 ] = y;
+                    SET_PARENT ( x, q );
+                    SET_PARENT ( y, x );
+                    if ( w != 0 )
+                        SET_PARENT ( w, y );
+                    if ( q == 0 )
+                        * root = x;
+                    else
+                        q -> child [ dir ] = x;
+                    if ( BALANCE ( x ) == 0 )
+                    {
+                        SET_BALANCE ( x, RIGHT );
+                        SET_PARBAL ( y, x, LEFT );
+                        return;
+                    }
+                    ZERO_BALANCE ( x );
+                    ZERO_BALANCE ( y );
+                    /* y = x; */
+                }
+                break;
+            case RIGHT:
+                CLR_BALANCE ( y, RIGHT );
+                break;
+            }
+        }
+    }
+}
+
+static
+void CC BTUnlink ( BSTNode **root, BSTNode *p, int dir )
+{
+    BSTNode *q = PARENT ( p );
+    BSTNode *l, *r = p -> child [ 1 ];
+    if ( r == 0 )
+    {
+      /* no right child - simple unlink */
+        l = p -> child [ 0 ];
+        if ( q == 0 )
+            * root = l;
+        else
+            q -> child [ dir ] = l;
+        if ( l != 0 )
+            SET_PARENT ( l, q );
+    }
+    else
+    {
+      /* have a right child - check its left */
+        l = r -> child [ 0 ];
+        if ( l == 0 )
+        {
+            l = p -> child [ 0 ];
+            r -> child [ 0 ] = l;
+
+            /* take not only p's parent ( q )
+            // but its balance as well */
+            r -> par = p -> par;
+
+            if ( q == 0 )
+                * root = r;
+            else
+                q -> child [ dir ] = r;
+
+            if ( l != 0 )
+                SET_PARENT ( l, r );
+
+            /* artificially reset for following */
+            q = r;
+            dir = 1;
+        }
+
+        /* involves some work */
+        else
+        {
+	  /* find smallest subsequent item */
+            r = l -> child [ 0 ];
+            while ( r != 0 )
+            {
+                l = r;
+                r = l -> child [ 0 ];
+            }
+
+            /* unlink it */
+            r = PARENT ( l );
+            r -> child [ 0 ] = l -> child [ 1 ];
+
+            /* take over doomed node */
+            l -> child [ 0 ] = p -> child [ 0 ];
+            l -> child [ 1 ] = p -> child [ 1 ];
+
+            /* take not only p's parent ( q )
+            // but its balance as well */
+            l -> par = p -> par;
+
+            /* new king pin */
+            if ( q == 0 )
+                * root = l;
+            else
+                q -> child [ dir ] = l;
+
+            /* update parent links */
+            q = l -> child [ 0 ];
+            if ( q != 0 )
+                SET_PARENT ( q, l );
+            q = l -> child [ 1 ];
+            SET_PARENT ( q, l );
+            q = r -> child [ 0 ];
+            if ( q != 0 )
+                SET_PARENT ( q, r );
+
+            q = r;
+            dir = 0;
+        }
+    }
+
+    /* now - rebalance what we've undone */
+    if ( q != 0 )
+        RebalanceAfterUnlink ( root, q, dir );
+}
+
+static
+bool CC BSTreeContains ( const BSTNode *root, const BSTNode *n )
+{
+    while ( n != NULL )
+    {
+        if ( n == root )
+            return true;
+        n = PARENT ( n );
+    }
+    return false;
+}
+
+LIB_EXPORT bool CC BSTreeUnlink ( BSTree *bt, BSTNode *n )
+{
+    if ( bt != NULL && BSTreeContains ( bt -> root, n ) )
+    {
+        int dir = 0;
+        BSTNode *q = PARENT ( n );
+        if ( q != 0 )
+        {
+            assert ( q -> child [ 0 ] == n || q -> child [ 1 ] == n );
+            dir = q -> child [ 1 ] == n;
+        }
+        BTUnlink ( & bt -> root, n, ( int ) dir );
+        return true;
+    }
+    return false;
+}
+
+/* BSTreeForEach
+ *  executes a function on each tree element
+ */
+LIB_EXPORT void CC BSTreeForEach ( const BSTree *bt, bool reverse,
+    void ( CC * f ) ( BSTNode *n, void *data ), void *data )
+{
+    if ( bt != NULL )
+    {
+        BSTNode *n, *next;
+        if ( reverse )
+        {
+            n = LastNode ( bt );
+            while ( n != NULL )
+            {
+                next = BSTNodePrev ( n );
+                ( * f ) ( n, data );
+                n = next;
+            }
+        }
+        else
+        {
+            n = FirstNode ( bt );
+            while ( n != NULL )
+            {
+                next = BSTNodeNext ( n );
+                ( * f ) ( n, data );
+                n = next;
+            }
+        }
+    }
+}
+
+/* BSTreeDoUntil
+ *  executes a function on each element
+ *  until the function returns 1
+ */
+LIB_EXPORT bool CC BSTreeDoUntil ( const BSTree *bt, bool reverse,
+    bool ( CC * f ) ( BSTNode *n, void *data ), void *data )
+{
+    if ( bt != NULL )
+    {
+        BSTNode *n, *next;
+        if ( reverse )
+        {
+            n = LastNode ( bt );
+            while ( n != NULL )
+            {
+                next = BSTNodePrev ( n );
+                if ( ( * f ) ( n, data ) )
+                    return true;
+                n = next;
+            }
+        }
+        else
+        {
+            n = FirstNode ( bt );
+            while ( n != NULL )
+            {
+                next = BSTNodeNext ( n );
+                if ( ( * f ) ( n, data ) )
+                    return true;
+                n = next;
+            }
+        }
+    }
+    return false;
+}
+
+/* BSTreeWhack
+ *  removes nodes from tree and
+ *  executes a user provided destructor
+ */
+LIB_EXPORT void CC BSTreeWhack ( BSTree *bt,
+    void ( CC * whack ) ( BSTNode *n, void *data ), void *data )
+{
+    if ( bt != NULL )
+    {
+        BSTNode *p = bt -> root;
+        bt -> root = NULL;
+
+        if ( whack != NULL )
+        {
+            while ( p != NULL )
+            {
+                BSTNode *q = p -> child [ 0 ];
+                if ( q == 0 )
+                {
+                    q = p -> child [ 1 ];
+                    ( * whack ) ( p, data );
+                }
+                else
+                {
+                    p -> child [ 0 ] = q -> child [ 1 ];
+                    q -> child [ 1 ] = p;
+                }
+                p = q;
+            }
+        }
+    }
+}
diff --git a/libs/klib/cp1252.c b/libs/klib/cp1252.c
new file mode 100644
index 0000000..21734d9
--- /dev/null
+++ b/libs/klib/cp1252.c
@@ -0,0 +1,65 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <sysalloc.h>
+#include <stdint.h>
+
+LIB_EXPORT const uint32_t cp1252 [ 128 ] =
+{
+    /*0x80   0x81   0x82   0x83   0x84   0x85   0x86   0x87*/
+    0x20AC,0x0000,0x201A,0x0192,0x201E,0x201E,0x201E,0x201E,
+    /*0x88   0x89   0x8A   0x8B   0x8C   0x8D   0x8E   0x8F*/
+    0x201E,0x201E,0x201E,0x201E,0x201E,0x0000,0x201E,0x0000,
+    /*0x90   0x91   0x92   0x93   0x94   0x95   0x96   0x97*/
+    0x0000,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+    /*0x98   0x99   0x9A   0x9B   0x9C   0x9D   0x9E   0x9F*/
+    0x02DC,0x2122,0x0161,0x203A,0x0153,0x0000,0x017E,0x0178,
+    /*0xA0   0xA1   0xA2   0xA3   0xA4   0xA5   0xA6   0xA7*/
+    0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,
+    /*0xA8   0xA9   0xAA   0xAB   0xAC   0xAD   0xAE   0xAF*/
+    0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
+    /*0xB0   0xB1   0xB2   0xB3   0xB4   0xB5   0xB6   0xB7*/
+    0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
+    /*0xB8   0xB9   0xBA   0xBB   0xBC   0xBD   0xBE   0xBF*/
+    0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,
+    /*0xC0   0xC1   0xC2   0xC3   0xC4   0xC5   0xC6   0xC7*/
+    0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,
+    /*0xC8   0xC9   0xCA   0xCB   0xCC   0xCD   0xCE   0xCF*/
+    0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,
+    /*0xD0   0xD1   0xD2   0xD3   0xD4   0xD5   0xD6   0xD7*/
+    0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7,
+    /*0xD8   0xD9   0xDA   0xDB   0xDC   0xDD   0xDE   0xDF*/
+    0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF,
+    /*0xE0   0xE1   0xE2   0xE3   0xE4   0xE5   0xE6   0xE7*/
+    0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7,
+    /*0xE8   0xE9   0xEA   0xEB   0xEC   0xED   0xEE   0xEF*/
+    0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,
+    /*0xF0   0xF1   0xF2   0xF3   0xF4   0xF5   0xF6   0xF7*/
+    0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7,
+    /*0xF8   0xF9   0xFA   0xFB   0xFC   0xFD   0xFE   0xFF*/
+    0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x00FF
+};
diff --git a/libs/klib/crc32.c b/libs/klib/crc32.c
new file mode 100644
index 0000000..bd0f2d6
--- /dev/null
+++ b/libs/klib/crc32.c
@@ -0,0 +1,500 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/checksum.h>
+#include <byteswap.h>
+
+#include <sysalloc.h>
+
+#define SLOW_CRC 0
+
+#if SLOW_CRC == 1
+/*--------------------------------------------------------------------------
+ * CRC32
+ */
+static
+uint32_t sCRC32_tbl [ 256 ];
+
+/* CRC32Init
+ *  initializes table
+ *  IDEMPOTENT
+ */
+LIB_EXPORT void CC CRC32Init ( void )
+{
+    static int beenHere = 0;
+    if ( ! beenHere )
+    {
+        int i, j;
+        int32_t kPoly32 = 0x04C11DB7;
+        
+        for ( i = 0; i < 256; ++ i )
+        {
+            int32_t byteCRC = i << 24;
+            for ( j = 0; j < 8; ++ j )
+            {
+                if ( byteCRC < 0 )
+                    byteCRC = ( byteCRC << 1 ) ^ kPoly32;
+                else
+                    byteCRC <<= 1;
+            }
+            sCRC32_tbl [ i ] = byteCRC;
+        }
+
+        beenHere = 1;
+    }
+}
+
+/* CRC32
+ *  runs checksum on arbitrary data, returning result
+ *  initial checksum to be passed in is 0
+ *  subsequent checksums should be return from prior invocation
+ */
+LIB_EXPORT uint32_t CC CRC32 ( uint32_t checksum, const void *data, size_t size )
+{
+    size_t j;
+
+#define str ( ( const unsigned char* ) data )
+
+    if ( sCRC32_tbl [ 0 ] == sCRC32_tbl [ 1 ] )
+        CRC32Init();
+
+    for ( j = 0; j < size; ++ j )
+    {
+        uint32_t i = ( checksum >> 24 ) ^ str [ j ];
+        checksum <<= 8;
+        checksum ^= sCRC32_tbl [ i ];
+    }
+    return checksum;
+    
+#undef str
+}
+
+#else /* SLOW_CRC != 1*/
+/* -------  experimenting with slicing ------------*/
+
+uint32_t const sCRC32_tbl_[8][256] =
+{
+	{
+		0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9,0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005,
+		0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61,0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD,
+		0x4C11DB70,0x48D0C6C7,0x4593E01E,0x4152FDA9,0x5F15ADAC,0x5BD4B01B,0x569796C2,0x52568B75,
+		0x6A1936C8,0x6ED82B7F,0x639B0DA6,0x675A1011,0x791D4014,0x7DDC5DA3,0x709F7B7A,0x745E66CD,
+		0x9823B6E0,0x9CE2AB57,0x91A18D8E,0x95609039,0x8B27C03C,0x8FE6DD8B,0x82A5FB52,0x8664E6E5,
+		0xBE2B5B58,0xBAEA46EF,0xB7A96036,0xB3687D81,0xAD2F2D84,0xA9EE3033,0xA4AD16EA,0xA06C0B5D,
+		0xD4326D90,0xD0F37027,0xDDB056FE,0xD9714B49,0xC7361B4C,0xC3F706FB,0xCEB42022,0xCA753D95,
+		0xF23A8028,0xF6FB9D9F,0xFBB8BB46,0xFF79A6F1,0xE13EF6F4,0xE5FFEB43,0xE8BCCD9A,0xEC7DD02D,
+		0x34867077,0x30476DC0,0x3D044B19,0x39C556AE,0x278206AB,0x23431B1C,0x2E003DC5,0x2AC12072,
+		0x128E9DCF,0x164F8078,0x1B0CA6A1,0x1FCDBB16,0x018AEB13,0x054BF6A4,0x0808D07D,0x0CC9CDCA,
+		0x7897AB07,0x7C56B6B0,0x71159069,0x75D48DDE,0x6B93DDDB,0x6F52C06C,0x6211E6B5,0x66D0FB02,
+		0x5E9F46BF,0x5A5E5B08,0x571D7DD1,0x53DC6066,0x4D9B3063,0x495A2DD4,0x44190B0D,0x40D816BA,
+		0xACA5C697,0xA864DB20,0xA527FDF9,0xA1E6E04E,0xBFA1B04B,0xBB60ADFC,0xB6238B25,0xB2E29692,
+		0x8AAD2B2F,0x8E6C3698,0x832F1041,0x87EE0DF6,0x99A95DF3,0x9D684044,0x902B669D,0x94EA7B2A,
+		0xE0B41DE7,0xE4750050,0xE9362689,0xEDF73B3E,0xF3B06B3B,0xF771768C,0xFA325055,0xFEF34DE2,
+		0xC6BCF05F,0xC27DEDE8,0xCF3ECB31,0xCBFFD686,0xD5B88683,0xD1799B34,0xDC3ABDED,0xD8FBA05A,
+		0x690CE0EE,0x6DCDFD59,0x608EDB80,0x644FC637,0x7A089632,0x7EC98B85,0x738AAD5C,0x774BB0EB,
+		0x4F040D56,0x4BC510E1,0x46863638,0x42472B8F,0x5C007B8A,0x58C1663D,0x558240E4,0x51435D53,
+		0x251D3B9E,0x21DC2629,0x2C9F00F0,0x285E1D47,0x36194D42,0x32D850F5,0x3F9B762C,0x3B5A6B9B,
+		0x0315D626,0x07D4CB91,0x0A97ED48,0x0E56F0FF,0x1011A0FA,0x14D0BD4D,0x19939B94,0x1D528623,
+		0xF12F560E,0xF5EE4BB9,0xF8AD6D60,0xFC6C70D7,0xE22B20D2,0xE6EA3D65,0xEBA91BBC,0xEF68060B,
+		0xD727BBB6,0xD3E6A601,0xDEA580D8,0xDA649D6F,0xC423CD6A,0xC0E2D0DD,0xCDA1F604,0xC960EBB3,
+		0xBD3E8D7E,0xB9FF90C9,0xB4BCB610,0xB07DABA7,0xAE3AFBA2,0xAAFBE615,0xA7B8C0CC,0xA379DD7B,
+		0x9B3660C6,0x9FF77D71,0x92B45BA8,0x9675461F,0x8832161A,0x8CF30BAD,0x81B02D74,0x857130C3,
+		0x5D8A9099,0x594B8D2E,0x5408ABF7,0x50C9B640,0x4E8EE645,0x4A4FFBF2,0x470CDD2B,0x43CDC09C,
+		0x7B827D21,0x7F436096,0x7200464F,0x76C15BF8,0x68860BFD,0x6C47164A,0x61043093,0x65C52D24,
+		0x119B4BE9,0x155A565E,0x18197087,0x1CD86D30,0x029F3D35,0x065E2082,0x0B1D065B,0x0FDC1BEC,
+		0x3793A651,0x3352BBE6,0x3E119D3F,0x3AD08088,0x2497D08D,0x2056CD3A,0x2D15EBE3,0x29D4F654,
+		0xC5A92679,0xC1683BCE,0xCC2B1D17,0xC8EA00A0,0xD6AD50A5,0xD26C4D12,0xDF2F6BCB,0xDBEE767C,
+		0xE3A1CBC1,0xE760D676,0xEA23F0AF,0xEEE2ED18,0xF0A5BD1D,0xF464A0AA,0xF9278673,0xFDE69BC4,
+		0x89B8FD09,0x8D79E0BE,0x803AC667,0x84FBDBD0,0x9ABC8BD5,0x9E7D9662,0x933EB0BB,0x97FFAD0C,
+		0xAFB010B1,0xAB710D06,0xA6322BDF,0xA2F33668,0xBCB4666D,0xB8757BDA,0xB5365D03,0xB1F740B4
+	},
+	{
+		0x00000000,0xD219C1DC,0xA0F29E0F,0x72EB5FD3,0x452421A9,0x973DE075,0xE5D6BFA6,0x37CF7E7A,
+		0x8A484352,0x5851828E,0x2ABADD5D,0xF8A31C81,0xCF6C62FB,0x1D75A327,0x6F9EFCF4,0xBD873D28,
+		0x10519B13,0xC2485ACF,0xB0A3051C,0x62BAC4C0,0x5575BABA,0x876C7B66,0xF58724B5,0x279EE569,
+		0x9A19D841,0x4800199D,0x3AEB464E,0xE8F28792,0xDF3DF9E8,0x0D243834,0x7FCF67E7,0xADD6A63B,
+		0x20A33626,0xF2BAF7FA,0x8051A829,0x524869F5,0x6587178F,0xB79ED653,0xC5758980,0x176C485C,
+		0xAAEB7574,0x78F2B4A8,0x0A19EB7B,0xD8002AA7,0xEFCF54DD,0x3DD69501,0x4F3DCAD2,0x9D240B0E,
+		0x30F2AD35,0xE2EB6CE9,0x9000333A,0x4219F2E6,0x75D68C9C,0xA7CF4D40,0xD5241293,0x073DD34F,
+		0xBABAEE67,0x68A32FBB,0x1A487068,0xC851B1B4,0xFF9ECFCE,0x2D870E12,0x5F6C51C1,0x8D75901D,
+		0x41466C4C,0x935FAD90,0xE1B4F243,0x33AD339F,0x04624DE5,0xD67B8C39,0xA490D3EA,0x76891236,
+		0xCB0E2F1E,0x1917EEC2,0x6BFCB111,0xB9E570CD,0x8E2A0EB7,0x5C33CF6B,0x2ED890B8,0xFCC15164,
+		0x5117F75F,0x830E3683,0xF1E56950,0x23FCA88C,0x1433D6F6,0xC62A172A,0xB4C148F9,0x66D88925,
+		0xDB5FB40D,0x094675D1,0x7BAD2A02,0xA9B4EBDE,0x9E7B95A4,0x4C625478,0x3E890BAB,0xEC90CA77,
+		0x61E55A6A,0xB3FC9BB6,0xC117C465,0x130E05B9,0x24C17BC3,0xF6D8BA1F,0x8433E5CC,0x562A2410,
+		0xEBAD1938,0x39B4D8E4,0x4B5F8737,0x994646EB,0xAE893891,0x7C90F94D,0x0E7BA69E,0xDC626742,
+		0x71B4C179,0xA3AD00A5,0xD1465F76,0x035F9EAA,0x3490E0D0,0xE689210C,0x94627EDF,0x467BBF03,
+		0xFBFC822B,0x29E543F7,0x5B0E1C24,0x8917DDF8,0xBED8A382,0x6CC1625E,0x1E2A3D8D,0xCC33FC51,
+		0x828CD898,0x50951944,0x227E4697,0xF067874B,0xC7A8F931,0x15B138ED,0x675A673E,0xB543A6E2,
+		0x08C49BCA,0xDADD5A16,0xA83605C5,0x7A2FC419,0x4DE0BA63,0x9FF97BBF,0xED12246C,0x3F0BE5B0,
+		0x92DD438B,0x40C48257,0x322FDD84,0xE0361C58,0xD7F96222,0x05E0A3FE,0x770BFC2D,0xA5123DF1,
+		0x189500D9,0xCA8CC105,0xB8679ED6,0x6A7E5F0A,0x5DB12170,0x8FA8E0AC,0xFD43BF7F,0x2F5A7EA3,
+		0xA22FEEBE,0x70362F62,0x02DD70B1,0xD0C4B16D,0xE70BCF17,0x35120ECB,0x47F95118,0x95E090C4,
+		0x2867ADEC,0xFA7E6C30,0x889533E3,0x5A8CF23F,0x6D438C45,0xBF5A4D99,0xCDB1124A,0x1FA8D396,
+		0xB27E75AD,0x6067B471,0x128CEBA2,0xC0952A7E,0xF75A5404,0x254395D8,0x57A8CA0B,0x85B10BD7,
+		0x383636FF,0xEA2FF723,0x98C4A8F0,0x4ADD692C,0x7D121756,0xAF0BD68A,0xDDE08959,0x0FF94885,
+		0xC3CAB4D4,0x11D37508,0x63382ADB,0xB121EB07,0x86EE957D,0x54F754A1,0x261C0B72,0xF405CAAE,
+		0x4982F786,0x9B9B365A,0xE9706989,0x3B69A855,0x0CA6D62F,0xDEBF17F3,0xAC544820,0x7E4D89FC,
+		0xD39B2FC7,0x0182EE1B,0x7369B1C8,0xA1707014,0x96BF0E6E,0x44A6CFB2,0x364D9061,0xE45451BD,
+		0x59D36C95,0x8BCAAD49,0xF921F29A,0x2B383346,0x1CF74D3C,0xCEEE8CE0,0xBC05D333,0x6E1C12EF,
+		0xE36982F2,0x3170432E,0x439B1CFD,0x9182DD21,0xA64DA35B,0x74546287,0x06BF3D54,0xD4A6FC88,
+		0x6921C1A0,0xBB38007C,0xC9D35FAF,0x1BCA9E73,0x2C05E009,0xFE1C21D5,0x8CF77E06,0x5EEEBFDA,
+		0xF33819E1,0x2121D83D,0x53CA87EE,0x81D34632,0xB61C3848,0x6405F994,0x16EEA647,0xC4F7679B,
+		0x79705AB3,0xAB699B6F,0xD982C4BC,0x0B9B0560,0x3C547B1A,0xEE4DBAC6,0x9CA6E515,0x4EBF24C9
+	},
+	{
+		0x00000000,0x01D8AC87,0x03B1590E,0x0269F589,0x0762B21C,0x06BA1E9B,0x04D3EB12,0x050B4795,
+		0x0EC56438,0x0F1DC8BF,0x0D743D36,0x0CAC91B1,0x09A7D624,0x087F7AA3,0x0A168F2A,0x0BCE23AD,
+		0x1D8AC870,0x1C5264F7,0x1E3B917E,0x1FE33DF9,0x1AE87A6C,0x1B30D6EB,0x19592362,0x18818FE5,
+		0x134FAC48,0x129700CF,0x10FEF546,0x112659C1,0x142D1E54,0x15F5B2D3,0x179C475A,0x1644EBDD,
+		0x3B1590E0,0x3ACD3C67,0x38A4C9EE,0x397C6569,0x3C7722FC,0x3DAF8E7B,0x3FC67BF2,0x3E1ED775,
+		0x35D0F4D8,0x3408585F,0x3661ADD6,0x37B90151,0x32B246C4,0x336AEA43,0x31031FCA,0x30DBB34D,
+		0x269F5890,0x2747F417,0x252E019E,0x24F6AD19,0x21FDEA8C,0x2025460B,0x224CB382,0x23941F05,
+		0x285A3CA8,0x2982902F,0x2BEB65A6,0x2A33C921,0x2F388EB4,0x2EE02233,0x2C89D7BA,0x2D517B3D,
+		0x762B21C0,0x77F38D47,0x759A78CE,0x7442D449,0x714993DC,0x70913F5B,0x72F8CAD2,0x73206655,
+		0x78EE45F8,0x7936E97F,0x7B5F1CF6,0x7A87B071,0x7F8CF7E4,0x7E545B63,0x7C3DAEEA,0x7DE5026D,
+		0x6BA1E9B0,0x6A794537,0x6810B0BE,0x69C81C39,0x6CC35BAC,0x6D1BF72B,0x6F7202A2,0x6EAAAE25,
+		0x65648D88,0x64BC210F,0x66D5D486,0x670D7801,0x62063F94,0x63DE9313,0x61B7669A,0x606FCA1D,
+		0x4D3EB120,0x4CE61DA7,0x4E8FE82E,0x4F5744A9,0x4A5C033C,0x4B84AFBB,0x49ED5A32,0x4835F6B5,
+		0x43FBD518,0x4223799F,0x404A8C16,0x41922091,0x44996704,0x4541CB83,0x47283E0A,0x46F0928D,
+		0x50B47950,0x516CD5D7,0x5305205E,0x52DD8CD9,0x57D6CB4C,0x560E67CB,0x54679242,0x55BF3EC5,
+		0x5E711D68,0x5FA9B1EF,0x5DC04466,0x5C18E8E1,0x5913AF74,0x58CB03F3,0x5AA2F67A,0x5B7A5AFD,
+		0xEC564380,0xED8EEF07,0xEFE71A8E,0xEE3FB609,0xEB34F19C,0xEAEC5D1B,0xE885A892,0xE95D0415,
+		0xE29327B8,0xE34B8B3F,0xE1227EB6,0xE0FAD231,0xE5F195A4,0xE4293923,0xE640CCAA,0xE798602D,
+		0xF1DC8BF0,0xF0042777,0xF26DD2FE,0xF3B57E79,0xF6BE39EC,0xF766956B,0xF50F60E2,0xF4D7CC65,
+		0xFF19EFC8,0xFEC1434F,0xFCA8B6C6,0xFD701A41,0xF87B5DD4,0xF9A3F153,0xFBCA04DA,0xFA12A85D,
+		0xD743D360,0xD69B7FE7,0xD4F28A6E,0xD52A26E9,0xD021617C,0xD1F9CDFB,0xD3903872,0xD24894F5,
+		0xD986B758,0xD85E1BDF,0xDA37EE56,0xDBEF42D1,0xDEE40544,0xDF3CA9C3,0xDD555C4A,0xDC8DF0CD,
+		0xCAC91B10,0xCB11B797,0xC978421E,0xC8A0EE99,0xCDABA90C,0xCC73058B,0xCE1AF002,0xCFC25C85,
+		0xC40C7F28,0xC5D4D3AF,0xC7BD2626,0xC6658AA1,0xC36ECD34,0xC2B661B3,0xC0DF943A,0xC10738BD,
+		0x9A7D6240,0x9BA5CEC7,0x99CC3B4E,0x981497C9,0x9D1FD05C,0x9CC77CDB,0x9EAE8952,0x9F7625D5,
+		0x94B80678,0x9560AAFF,0x97095F76,0x96D1F3F1,0x93DAB464,0x920218E3,0x906BED6A,0x91B341ED,
+		0x87F7AA30,0x862F06B7,0x8446F33E,0x859E5FB9,0x8095182C,0x814DB4AB,0x83244122,0x82FCEDA5,
+		0x8932CE08,0x88EA628F,0x8A839706,0x8B5B3B81,0x8E507C14,0x8F88D093,0x8DE1251A,0x8C39899D,
+		0xA168F2A0,0xA0B05E27,0xA2D9ABAE,0xA3010729,0xA60A40BC,0xA7D2EC3B,0xA5BB19B2,0xA463B535,
+		0xAFAD9698,0xAE753A1F,0xAC1CCF96,0xADC46311,0xA8CF2484,0xA9178803,0xAB7E7D8A,0xAAA6D10D,
+		0xBCE23AD0,0xBD3A9657,0xBF5363DE,0xBE8BCF59,0xBB8088CC,0xBA58244B,0xB831D1C2,0xB9E97D45,
+		0xB2275EE8,0xB3FFF26F,0xB19607E6,0xB04EAB61,0xB545ECF4,0xB49D4073,0xB6F4B5FA,0xB72C197D
+	},
+	{
+		0x00000000,0xDC6D9AB7,0xBC1A28D9,0x6077B26E,0x7CF54C05,0xA098D6B2,0xC0EF64DC,0x1C82FE6B,
+		0xF9EA980A,0x258702BD,0x45F0B0D3,0x999D2A64,0x851FD40F,0x59724EB8,0x3905FCD6,0xE5686661,
+		0xF7142DA3,0x2B79B714,0x4B0E057A,0x97639FCD,0x8BE161A6,0x578CFB11,0x37FB497F,0xEB96D3C8,
+		0x0EFEB5A9,0xD2932F1E,0xB2E49D70,0x6E8907C7,0x720BF9AC,0xAE66631B,0xCE11D175,0x127C4BC2,
+		0xEAE946F1,0x3684DC46,0x56F36E28,0x8A9EF49F,0x961C0AF4,0x4A719043,0x2A06222D,0xF66BB89A,
+		0x1303DEFB,0xCF6E444C,0xAF19F622,0x73746C95,0x6FF692FE,0xB39B0849,0xD3ECBA27,0x0F812090,
+		0x1DFD6B52,0xC190F1E5,0xA1E7438B,0x7D8AD93C,0x61082757,0xBD65BDE0,0xDD120F8E,0x017F9539,
+		0xE417F358,0x387A69EF,0x580DDB81,0x84604136,0x98E2BF5D,0x448F25EA,0x24F89784,0xF8950D33,
+		0xD1139055,0x0D7E0AE2,0x6D09B88C,0xB164223B,0xADE6DC50,0x718B46E7,0x11FCF489,0xCD916E3E,
+		0x28F9085F,0xF49492E8,0x94E32086,0x488EBA31,0x540C445A,0x8861DEED,0xE8166C83,0x347BF634,
+		0x2607BDF6,0xFA6A2741,0x9A1D952F,0x46700F98,0x5AF2F1F3,0x869F6B44,0xE6E8D92A,0x3A85439D,
+		0xDFED25FC,0x0380BF4B,0x63F70D25,0xBF9A9792,0xA31869F9,0x7F75F34E,0x1F024120,0xC36FDB97,
+		0x3BFAD6A4,0xE7974C13,0x87E0FE7D,0x5B8D64CA,0x470F9AA1,0x9B620016,0xFB15B278,0x277828CF,
+		0xC2104EAE,0x1E7DD419,0x7E0A6677,0xA267FCC0,0xBEE502AB,0x6288981C,0x02FF2A72,0xDE92B0C5,
+		0xCCEEFB07,0x108361B0,0x70F4D3DE,0xAC994969,0xB01BB702,0x6C762DB5,0x0C019FDB,0xD06C056C,
+		0x3504630D,0xE969F9BA,0x891E4BD4,0x5573D163,0x49F12F08,0x959CB5BF,0xF5EB07D1,0x29869D66,
+		0xA6E63D1D,0x7A8BA7AA,0x1AFC15C4,0xC6918F73,0xDA137118,0x067EEBAF,0x660959C1,0xBA64C376,
+		0x5F0CA517,0x83613FA0,0xE3168DCE,0x3F7B1779,0x23F9E912,0xFF9473A5,0x9FE3C1CB,0x438E5B7C,
+		0x51F210BE,0x8D9F8A09,0xEDE83867,0x3185A2D0,0x2D075CBB,0xF16AC60C,0x911D7462,0x4D70EED5,
+		0xA81888B4,0x74751203,0x1402A06D,0xC86F3ADA,0xD4EDC4B1,0x08805E06,0x68F7EC68,0xB49A76DF,
+		0x4C0F7BEC,0x9062E15B,0xF0155335,0x2C78C982,0x30FA37E9,0xEC97AD5E,0x8CE01F30,0x508D8587,
+		0xB5E5E3E6,0x69887951,0x09FFCB3F,0xD5925188,0xC910AFE3,0x157D3554,0x750A873A,0xA9671D8D,
+		0xBB1B564F,0x6776CCF8,0x07017E96,0xDB6CE421,0xC7EE1A4A,0x1B8380FD,0x7BF43293,0xA799A824,
+		0x42F1CE45,0x9E9C54F2,0xFEEBE69C,0x22867C2B,0x3E048240,0xE26918F7,0x821EAA99,0x5E73302E,
+		0x77F5AD48,0xAB9837FF,0xCBEF8591,0x17821F26,0x0B00E14D,0xD76D7BFA,0xB71AC994,0x6B775323,
+		0x8E1F3542,0x5272AFF5,0x32051D9B,0xEE68872C,0xF2EA7947,0x2E87E3F0,0x4EF0519E,0x929DCB29,
+		0x80E180EB,0x5C8C1A5C,0x3CFBA832,0xE0963285,0xFC14CCEE,0x20795659,0x400EE437,0x9C637E80,
+		0x790B18E1,0xA5668256,0xC5113038,0x197CAA8F,0x05FE54E4,0xD993CE53,0xB9E47C3D,0x6589E68A,
+		0x9D1CEBB9,0x4171710E,0x2106C360,0xFD6B59D7,0xE1E9A7BC,0x3D843D0B,0x5DF38F65,0x819E15D2,
+		0x64F673B3,0xB89BE904,0xD8EC5B6A,0x0481C1DD,0x18033FB6,0xC46EA501,0xA419176F,0x78748DD8,
+		0x6A08C61A,0xB6655CAD,0xD612EEC3,0x0A7F7474,0x16FD8A1F,0xCA9010A8,0xAAE7A2C6,0x768A3871,
+		0x93E25E10,0x4F8FC4A7,0x2FF876C9,0xF395EC7E,0xEF171215,0x337A88A2,0x530D3ACC,0x8F60A07B
+	},
+	{
+		0x00000000,0x490D678D,0x921ACF1A,0xDB17A897,0x20F48383,0x69F9E40E,0xB2EE4C99,0xFBE32B14,
+		0x41E90706,0x08E4608B,0xD3F3C81C,0x9AFEAF91,0x611D8485,0x2810E308,0xF3074B9F,0xBA0A2C12,
+		0x83D20E0C,0xCADF6981,0x11C8C116,0x58C5A69B,0xA3268D8F,0xEA2BEA02,0x313C4295,0x78312518,
+		0xC23B090A,0x8B366E87,0x5021C610,0x192CA19D,0xE2CF8A89,0xABC2ED04,0x70D54593,0x39D8221E,
+		0x036501AF,0x4A686622,0x917FCEB5,0xD872A938,0x2391822C,0x6A9CE5A1,0xB18B4D36,0xF8862ABB,
+		0x428C06A9,0x0B816124,0xD096C9B3,0x999BAE3E,0x6278852A,0x2B75E2A7,0xF0624A30,0xB96F2DBD,
+		0x80B70FA3,0xC9BA682E,0x12ADC0B9,0x5BA0A734,0xA0438C20,0xE94EEBAD,0x3259433A,0x7B5424B7,
+		0xC15E08A5,0x88536F28,0x5344C7BF,0x1A49A032,0xE1AA8B26,0xA8A7ECAB,0x73B0443C,0x3ABD23B1,
+		0x06CA035E,0x4FC764D3,0x94D0CC44,0xDDDDABC9,0x263E80DD,0x6F33E750,0xB4244FC7,0xFD29284A,
+		0x47230458,0x0E2E63D5,0xD539CB42,0x9C34ACCF,0x67D787DB,0x2EDAE056,0xF5CD48C1,0xBCC02F4C,
+		0x85180D52,0xCC156ADF,0x1702C248,0x5E0FA5C5,0xA5EC8ED1,0xECE1E95C,0x37F641CB,0x7EFB2646,
+		0xC4F10A54,0x8DFC6DD9,0x56EBC54E,0x1FE6A2C3,0xE40589D7,0xAD08EE5A,0x761F46CD,0x3F122140,
+		0x05AF02F1,0x4CA2657C,0x97B5CDEB,0xDEB8AA66,0x255B8172,0x6C56E6FF,0xB7414E68,0xFE4C29E5,
+		0x444605F7,0x0D4B627A,0xD65CCAED,0x9F51AD60,0x64B28674,0x2DBFE1F9,0xF6A8496E,0xBFA52EE3,
+		0x867D0CFD,0xCF706B70,0x1467C3E7,0x5D6AA46A,0xA6898F7E,0xEF84E8F3,0x34934064,0x7D9E27E9,
+		0xC7940BFB,0x8E996C76,0x558EC4E1,0x1C83A36C,0xE7608878,0xAE6DEFF5,0x757A4762,0x3C7720EF,
+		0x0D9406BC,0x44996131,0x9F8EC9A6,0xD683AE2B,0x2D60853F,0x646DE2B2,0xBF7A4A25,0xF6772DA8,
+		0x4C7D01BA,0x05706637,0xDE67CEA0,0x976AA92D,0x6C898239,0x2584E5B4,0xFE934D23,0xB79E2AAE,
+		0x8E4608B0,0xC74B6F3D,0x1C5CC7AA,0x5551A027,0xAEB28B33,0xE7BFECBE,0x3CA84429,0x75A523A4,
+		0xCFAF0FB6,0x86A2683B,0x5DB5C0AC,0x14B8A721,0xEF5B8C35,0xA656EBB8,0x7D41432F,0x344C24A2,
+		0x0EF10713,0x47FC609E,0x9CEBC809,0xD5E6AF84,0x2E058490,0x6708E31D,0xBC1F4B8A,0xF5122C07,
+		0x4F180015,0x06156798,0xDD02CF0F,0x940FA882,0x6FEC8396,0x26E1E41B,0xFDF64C8C,0xB4FB2B01,
+		0x8D23091F,0xC42E6E92,0x1F39C605,0x5634A188,0xADD78A9C,0xE4DAED11,0x3FCD4586,0x76C0220B,
+		0xCCCA0E19,0x85C76994,0x5ED0C103,0x17DDA68E,0xEC3E8D9A,0xA533EA17,0x7E244280,0x3729250D,
+		0x0B5E05E2,0x4253626F,0x9944CAF8,0xD049AD75,0x2BAA8661,0x62A7E1EC,0xB9B0497B,0xF0BD2EF6,
+		0x4AB702E4,0x03BA6569,0xD8ADCDFE,0x91A0AA73,0x6A438167,0x234EE6EA,0xF8594E7D,0xB15429F0,
+		0x888C0BEE,0xC1816C63,0x1A96C4F4,0x539BA379,0xA878886D,0xE175EFE0,0x3A624777,0x736F20FA,
+		0xC9650CE8,0x80686B65,0x5B7FC3F2,0x1272A47F,0xE9918F6B,0xA09CE8E6,0x7B8B4071,0x328627FC,
+		0x083B044D,0x413663C0,0x9A21CB57,0xD32CACDA,0x28CF87CE,0x61C2E043,0xBAD548D4,0xF3D82F59,
+		0x49D2034B,0x00DF64C6,0xDBC8CC51,0x92C5ABDC,0x692680C8,0x202BE745,0xFB3C4FD2,0xB231285F,
+		0x8BE90A41,0xC2E46DCC,0x19F3C55B,0x50FEA2D6,0xAB1D89C2,0xE210EE4F,0x390746D8,0x700A2155,
+		0xCA000D47,0x830D6ACA,0x581AC25D,0x1117A5D0,0xEAF48EC4,0xA3F9E949,0x78EE41DE,0x31E32653
+	},
+	{
+		0x00000000,0x1B280D78,0x36501AF0,0x2D781788,0x6CA035E0,0x77883898,0x5AF02F10,0x41D82268,
+		0xD9406BC0,0xC26866B8,0xEF107130,0xF4387C48,0xB5E05E20,0xAEC85358,0x83B044D0,0x989849A8,
+		0xB641CA37,0xAD69C74F,0x8011D0C7,0x9B39DDBF,0xDAE1FFD7,0xC1C9F2AF,0xECB1E527,0xF799E85F,
+		0x6F01A1F7,0x7429AC8F,0x5951BB07,0x4279B67F,0x03A19417,0x1889996F,0x35F18EE7,0x2ED9839F,
+		0x684289D9,0x736A84A1,0x5E129329,0x453A9E51,0x04E2BC39,0x1FCAB141,0x32B2A6C9,0x299AABB1,
+		0xB102E219,0xAA2AEF61,0x8752F8E9,0x9C7AF591,0xDDA2D7F9,0xC68ADA81,0xEBF2CD09,0xF0DAC071,
+		0xDE0343EE,0xC52B4E96,0xE853591E,0xF37B5466,0xB2A3760E,0xA98B7B76,0x84F36CFE,0x9FDB6186,
+		0x0743282E,0x1C6B2556,0x311332DE,0x2A3B3FA6,0x6BE31DCE,0x70CB10B6,0x5DB3073E,0x469B0A46,
+		0xD08513B2,0xCBAD1ECA,0xE6D50942,0xFDFD043A,0xBC252652,0xA70D2B2A,0x8A753CA2,0x915D31DA,
+		0x09C57872,0x12ED750A,0x3F956282,0x24BD6FFA,0x65654D92,0x7E4D40EA,0x53355762,0x481D5A1A,
+		0x66C4D985,0x7DECD4FD,0x5094C375,0x4BBCCE0D,0x0A64EC65,0x114CE11D,0x3C34F695,0x271CFBED,
+		0xBF84B245,0xA4ACBF3D,0x89D4A8B5,0x92FCA5CD,0xD32487A5,0xC80C8ADD,0xE5749D55,0xFE5C902D,
+		0xB8C79A6B,0xA3EF9713,0x8E97809B,0x95BF8DE3,0xD467AF8B,0xCF4FA2F3,0xE237B57B,0xF91FB803,
+		0x6187F1AB,0x7AAFFCD3,0x57D7EB5B,0x4CFFE623,0x0D27C44B,0x160FC933,0x3B77DEBB,0x205FD3C3,
+		0x0E86505C,0x15AE5D24,0x38D64AAC,0x23FE47D4,0x622665BC,0x790E68C4,0x54767F4C,0x4F5E7234,
+		0xD7C63B9C,0xCCEE36E4,0xE196216C,0xFABE2C14,0xBB660E7C,0xA04E0304,0x8D36148C,0x961E19F4,
+		0xA5CB3AD3,0xBEE337AB,0x939B2023,0x88B32D5B,0xC96B0F33,0xD243024B,0xFF3B15C3,0xE41318BB,
+		0x7C8B5113,0x67A35C6B,0x4ADB4BE3,0x51F3469B,0x102B64F3,0x0B03698B,0x267B7E03,0x3D53737B,
+		0x138AF0E4,0x08A2FD9C,0x25DAEA14,0x3EF2E76C,0x7F2AC504,0x6402C87C,0x497ADFF4,0x5252D28C,
+		0xCACA9B24,0xD1E2965C,0xFC9A81D4,0xE7B28CAC,0xA66AAEC4,0xBD42A3BC,0x903AB434,0x8B12B94C,
+		0xCD89B30A,0xD6A1BE72,0xFBD9A9FA,0xE0F1A482,0xA12986EA,0xBA018B92,0x97799C1A,0x8C519162,
+		0x14C9D8CA,0x0FE1D5B2,0x2299C23A,0x39B1CF42,0x7869ED2A,0x6341E052,0x4E39F7DA,0x5511FAA2,
+		0x7BC8793D,0x60E07445,0x4D9863CD,0x56B06EB5,0x17684CDD,0x0C4041A5,0x2138562D,0x3A105B55,
+		0xA28812FD,0xB9A01F85,0x94D8080D,0x8FF00575,0xCE28271D,0xD5002A65,0xF8783DED,0xE3503095,
+		0x754E2961,0x6E662419,0x431E3391,0x58363EE9,0x19EE1C81,0x02C611F9,0x2FBE0671,0x34960B09,
+		0xAC0E42A1,0xB7264FD9,0x9A5E5851,0x81765529,0xC0AE7741,0xDB867A39,0xF6FE6DB1,0xEDD660C9,
+		0xC30FE356,0xD827EE2E,0xF55FF9A6,0xEE77F4DE,0xAFAFD6B6,0xB487DBCE,0x99FFCC46,0x82D7C13E,
+		0x1A4F8896,0x016785EE,0x2C1F9266,0x37379F1E,0x76EFBD76,0x6DC7B00E,0x40BFA786,0x5B97AAFE,
+		0x1D0CA0B8,0x0624ADC0,0x2B5CBA48,0x3074B730,0x71AC9558,0x6A849820,0x47FC8FA8,0x5CD482D0,
+		0xC44CCB78,0xDF64C600,0xF21CD188,0xE934DCF0,0xA8ECFE98,0xB3C4F3E0,0x9EBCE468,0x8594E910,
+		0xAB4D6A8F,0xB06567F7,0x9D1D707F,0x86357D07,0xC7ED5F6F,0xDCC55217,0xF1BD459F,0xEA9548E7,
+		0x720D014F,0x69250C37,0x445D1BBF,0x5F7516C7,0x1EAD34AF,0x058539D7,0x28FD2E5F,0x33D52327
+	},
+	{
+		0x00000000,0x4F576811,0x9EAED022,0xD1F9B833,0x399CBDF3,0x76CBD5E2,0xA7326DD1,0xE86505C0,
+		0x73397BE6,0x3C6E13F7,0xED97ABC4,0xA2C0C3D5,0x4AA5C615,0x05F2AE04,0xD40B1637,0x9B5C7E26,
+		0xE672F7CC,0xA9259FDD,0x78DC27EE,0x378B4FFF,0xDFEE4A3F,0x90B9222E,0x41409A1D,0x0E17F20C,
+		0x954B8C2A,0xDA1CE43B,0x0BE55C08,0x44B23419,0xACD731D9,0xE38059C8,0x3279E1FB,0x7D2E89EA,
+		0xC824F22F,0x87739A3E,0x568A220D,0x19DD4A1C,0xF1B84FDC,0xBEEF27CD,0x6F169FFE,0x2041F7EF,
+		0xBB1D89C9,0xF44AE1D8,0x25B359EB,0x6AE431FA,0x8281343A,0xCDD65C2B,0x1C2FE418,0x53788C09,
+		0x2E5605E3,0x61016DF2,0xB0F8D5C1,0xFFAFBDD0,0x17CAB810,0x589DD001,0x89646832,0xC6330023,
+		0x5D6F7E05,0x12381614,0xC3C1AE27,0x8C96C636,0x64F3C3F6,0x2BA4ABE7,0xFA5D13D4,0xB50A7BC5,
+		0x9488F9E9,0xDBDF91F8,0x0A2629CB,0x457141DA,0xAD14441A,0xE2432C0B,0x33BA9438,0x7CEDFC29,
+		0xE7B1820F,0xA8E6EA1E,0x791F522D,0x36483A3C,0xDE2D3FFC,0x917A57ED,0x4083EFDE,0x0FD487CF,
+		0x72FA0E25,0x3DAD6634,0xEC54DE07,0xA303B616,0x4B66B3D6,0x0431DBC7,0xD5C863F4,0x9A9F0BE5,
+		0x01C375C3,0x4E941DD2,0x9F6DA5E1,0xD03ACDF0,0x385FC830,0x7708A021,0xA6F11812,0xE9A67003,
+		0x5CAC0BC6,0x13FB63D7,0xC202DBE4,0x8D55B3F5,0x6530B635,0x2A67DE24,0xFB9E6617,0xB4C90E06,
+		0x2F957020,0x60C21831,0xB13BA002,0xFE6CC813,0x1609CDD3,0x595EA5C2,0x88A71DF1,0xC7F075E0,
+		0xBADEFC0A,0xF589941B,0x24702C28,0x6B274439,0x834241F9,0xCC1529E8,0x1DEC91DB,0x52BBF9CA,
+		0xC9E787EC,0x86B0EFFD,0x574957CE,0x181E3FDF,0xF07B3A1F,0xBF2C520E,0x6ED5EA3D,0x2182822C,
+		0x2DD0EE65,0x62878674,0xB37E3E47,0xFC295656,0x144C5396,0x5B1B3B87,0x8AE283B4,0xC5B5EBA5,
+		0x5EE99583,0x11BEFD92,0xC04745A1,0x8F102DB0,0x67752870,0x28224061,0xF9DBF852,0xB68C9043,
+		0xCBA219A9,0x84F571B8,0x550CC98B,0x1A5BA19A,0xF23EA45A,0xBD69CC4B,0x6C907478,0x23C71C69,
+		0xB89B624F,0xF7CC0A5E,0x2635B26D,0x6962DA7C,0x8107DFBC,0xCE50B7AD,0x1FA90F9E,0x50FE678F,
+		0xE5F41C4A,0xAAA3745B,0x7B5ACC68,0x340DA479,0xDC68A1B9,0x933FC9A8,0x42C6719B,0x0D91198A,
+		0x96CD67AC,0xD99A0FBD,0x0863B78E,0x4734DF9F,0xAF51DA5F,0xE006B24E,0x31FF0A7D,0x7EA8626C,
+		0x0386EB86,0x4CD18397,0x9D283BA4,0xD27F53B5,0x3A1A5675,0x754D3E64,0xA4B48657,0xEBE3EE46,
+		0x70BF9060,0x3FE8F871,0xEE114042,0xA1462853,0x49232D93,0x06744582,0xD78DFDB1,0x98DA95A0,
+		0xB958178C,0xF60F7F9D,0x27F6C7AE,0x68A1AFBF,0x80C4AA7F,0xCF93C26E,0x1E6A7A5D,0x513D124C,
+		0xCA616C6A,0x8536047B,0x54CFBC48,0x1B98D459,0xF3FDD199,0xBCAAB988,0x6D5301BB,0x220469AA,
+		0x5F2AE040,0x107D8851,0xC1843062,0x8ED35873,0x66B65DB3,0x29E135A2,0xF8188D91,0xB74FE580,
+		0x2C139BA6,0x6344F3B7,0xB2BD4B84,0xFDEA2395,0x158F2655,0x5AD84E44,0x8B21F677,0xC4769E66,
+		0x717CE5A3,0x3E2B8DB2,0xEFD23581,0xA0855D90,0x48E05850,0x07B73041,0xD64E8872,0x9919E063,
+		0x02459E45,0x4D12F654,0x9CEB4E67,0xD3BC2676,0x3BD923B6,0x748E4BA7,0xA577F394,0xEA209B85,
+		0x970E126F,0xD8597A7E,0x09A0C24D,0x46F7AA5C,0xAE92AF9C,0xE1C5C78D,0x303C7FBE,0x7F6B17AF,
+		0xE4376989,0xAB600198,0x7A99B9AB,0x35CED1BA,0xDDABD47A,0x92FCBC6B,0x43050458,0x0C526C49
+	},
+	{
+		0x00000000,0x5BA1DCCA,0xB743B994,0xECE2655E,0x6A466E9F,0x31E7B255,0xDD05D70B,0x86A40BC1,
+		0xD48CDD3E,0x8F2D01F4,0x63CF64AA,0x386EB860,0xBECAB3A1,0xE56B6F6B,0x09890A35,0x5228D6FF,
+		0xADD8A7CB,0xF6797B01,0x1A9B1E5F,0x413AC295,0xC79EC954,0x9C3F159E,0x70DD70C0,0x2B7CAC0A,
+		0x79547AF5,0x22F5A63F,0xCE17C361,0x95B61FAB,0x1312146A,0x48B3C8A0,0xA451ADFE,0xFFF07134,
+		0x5F705221,0x04D18EEB,0xE833EBB5,0xB392377F,0x35363CBE,0x6E97E074,0x8275852A,0xD9D459E0,
+		0x8BFC8F1F,0xD05D53D5,0x3CBF368B,0x671EEA41,0xE1BAE180,0xBA1B3D4A,0x56F95814,0x0D5884DE,
+		0xF2A8F5EA,0xA9092920,0x45EB4C7E,0x1E4A90B4,0x98EE9B75,0xC34F47BF,0x2FAD22E1,0x740CFE2B,
+		0x262428D4,0x7D85F41E,0x91679140,0xCAC64D8A,0x4C62464B,0x17C39A81,0xFB21FFDF,0xA0802315,
+		0xBEE0A442,0xE5417888,0x09A31DD6,0x5202C11C,0xD4A6CADD,0x8F071617,0x63E57349,0x3844AF83,
+		0x6A6C797C,0x31CDA5B6,0xDD2FC0E8,0x868E1C22,0x002A17E3,0x5B8BCB29,0xB769AE77,0xECC872BD,
+		0x13380389,0x4899DF43,0xA47BBA1D,0xFFDA66D7,0x797E6D16,0x22DFB1DC,0xCE3DD482,0x959C0848,
+		0xC7B4DEB7,0x9C15027D,0x70F76723,0x2B56BBE9,0xADF2B028,0xF6536CE2,0x1AB109BC,0x4110D576,
+		0xE190F663,0xBA312AA9,0x56D34FF7,0x0D72933D,0x8BD698FC,0xD0774436,0x3C952168,0x6734FDA2,
+		0x351C2B5D,0x6EBDF797,0x825F92C9,0xD9FE4E03,0x5F5A45C2,0x04FB9908,0xE819FC56,0xB3B8209C,
+		0x4C4851A8,0x17E98D62,0xFB0BE83C,0xA0AA34F6,0x260E3F37,0x7DAFE3FD,0x914D86A3,0xCAEC5A69,
+		0x98C48C96,0xC365505C,0x2F873502,0x7426E9C8,0xF282E209,0xA9233EC3,0x45C15B9D,0x1E608757,
+		0x79005533,0x22A189F9,0xCE43ECA7,0x95E2306D,0x13463BAC,0x48E7E766,0xA4058238,0xFFA45EF2,
+		0xAD8C880D,0xF62D54C7,0x1ACF3199,0x416EED53,0xC7CAE692,0x9C6B3A58,0x70895F06,0x2B2883CC,
+		0xD4D8F2F8,0x8F792E32,0x639B4B6C,0x383A97A6,0xBE9E9C67,0xE53F40AD,0x09DD25F3,0x527CF939,
+		0x00542FC6,0x5BF5F30C,0xB7179652,0xECB64A98,0x6A124159,0x31B39D93,0xDD51F8CD,0x86F02407,
+		0x26700712,0x7DD1DBD8,0x9133BE86,0xCA92624C,0x4C36698D,0x1797B547,0xFB75D019,0xA0D40CD3,
+		0xF2FCDA2C,0xA95D06E6,0x45BF63B8,0x1E1EBF72,0x98BAB4B3,0xC31B6879,0x2FF90D27,0x7458D1ED,
+		0x8BA8A0D9,0xD0097C13,0x3CEB194D,0x674AC587,0xE1EECE46,0xBA4F128C,0x56AD77D2,0x0D0CAB18,
+		0x5F247DE7,0x0485A12D,0xE867C473,0xB3C618B9,0x35621378,0x6EC3CFB2,0x8221AAEC,0xD9807626,
+		0xC7E0F171,0x9C412DBB,0x70A348E5,0x2B02942F,0xADA69FEE,0xF6074324,0x1AE5267A,0x4144FAB0,
+		0x136C2C4F,0x48CDF085,0xA42F95DB,0xFF8E4911,0x792A42D0,0x228B9E1A,0xCE69FB44,0x95C8278E,
+		0x6A3856BA,0x31998A70,0xDD7BEF2E,0x86DA33E4,0x007E3825,0x5BDFE4EF,0xB73D81B1,0xEC9C5D7B,
+		0xBEB48B84,0xE515574E,0x09F73210,0x5256EEDA,0xD4F2E51B,0x8F5339D1,0x63B15C8F,0x38108045,
+		0x9890A350,0xC3317F9A,0x2FD31AC4,0x7472C60E,0xF2D6CDCF,0xA9771105,0x4595745B,0x1E34A891,
+		0x4C1C7E6E,0x17BDA2A4,0xFB5FC7FA,0xA0FE1B30,0x265A10F1,0x7DFBCC3B,0x9119A965,0xCAB875AF,
+		0x3548049B,0x6EE9D851,0x820BBD0F,0xD9AA61C5,0x5F0E6A04,0x04AFB6CE,0xE84DD390,0xB3EC0F5A,
+		0xE1C4D9A5,0xBA65056F,0x56876031,0x0D26BCFB,0x8B82B73A,0xD0236BF0,0x3CC10EAE,0x6760D264
+	}
+};
+
+
+#if 0 /* precomputing table */
+void CRC32Init_slicing8()
+{
+    static int beenHere = 0;
+    if ( ! beenHere )
+    {
+        int32_t kPoly32 = 0x04C11DB7;
+        size_t i;
+        for (i = 0; i < 256; ++i)
+        {
+            int32_t crc = i << 24;
+            size_t j;
+            for (j = 0; j < 8; ++j)
+            {
+                /*if (crc < 0)
+                    crc = (crc << 1) ^ kPoly32;
+                else
+                    crc <<= 1;*/
+                crc = (crc << 1) ^ ((crc >> 31) & kPoly32);
+            }
+            sCRC32_tbl_[0][i] = crc;
+        }
+        for (int i = 0; i < 256; ++i)
+        {
+            sCRC32_tbl_[1][i] = (sCRC32_tbl_[0][i] << 8) ^ sCRC32_tbl_[0][sCRC32_tbl_[0][i] >> 24];
+            sCRC32_tbl_[2][i] = (sCRC32_tbl_[1][i] << 8) ^ sCRC32_tbl_[0][sCRC32_tbl_[1][i] >> 24];
+            sCRC32_tbl_[3][i] = (sCRC32_tbl_[2][i] << 8) ^ sCRC32_tbl_[0][sCRC32_tbl_[2][i] >> 24];
+
+            sCRC32_tbl_[4][i] = (sCRC32_tbl_[3][i] << 8) ^ sCRC32_tbl_[0][sCRC32_tbl_[3][i] >> 24];
+            sCRC32_tbl_[5][i] = (sCRC32_tbl_[4][i] << 8) ^ sCRC32_tbl_[0][sCRC32_tbl_[4][i] >> 24];
+            sCRC32_tbl_[6][i] = (sCRC32_tbl_[5][i] << 8) ^ sCRC32_tbl_[0][sCRC32_tbl_[5][i] >> 24];
+            sCRC32_tbl_[7][i] = (sCRC32_tbl_[6][i] << 8) ^ sCRC32_tbl_[0][sCRC32_tbl_[6][i] >> 24];
+        }
+        beenHere = 1;
+    }
+}
+#endif
+LIB_EXPORT void CC CRC32Init ( void ) {} /* TODO: some other files call this function. Need to delete those calls and then to delete this empty function */
+
+static uint32_t CRC32_one_byte_lookup(uint32_t previousCrc32, const void *data, size_t length)
+{
+    uint32_t crc = previousCrc32;
+    const uint8_t* currentChar = (const uint8_t*) data;
+    while (length-- > 0)
+    {
+        uint32_t i = ( crc >> 24 ) ^ *currentChar;
+        ++currentChar;
+        crc <<= 8;
+        crc ^= sCRC32_tbl_[0][i];
+    }
+    return crc;
+}
+
+#define QWORD_READ 0
+#define INVERT_PREVIOUS_CRC 0
+
+LIB_EXPORT uint32_t CC CRC32(uint32_t previousCrc32, const void *data, size_t length)
+{
+#if INVERT_PREVIOUS_CRC
+    uint32_t crc = ~previousCrc32; /* same as previousCrc32 ^ 0xFFFFFFFF*/
+#else
+    uint32_t crc = previousCrc32;
+#endif
+
+#if QWORD_READ == 1
+    const uint64_t* current = (const uint64_t*) data;
+    size_t const ALIGN_BYTES = 8;
+#else
+    const uint32_t* current = (const uint32_t*) data;
+    size_t const ALIGN_BYTES = 4;
+#endif
+
+    /* if 'data' is unaligned, process first unaligned bytes with simple algorithm,
+    then apply slicing to the aligned remainder */
+    size_t nFisrtUnalignedBytes = ((size_t)data % ALIGN_BYTES);
+    if (nFisrtUnalignedBytes)
+    {
+        nFisrtUnalignedBytes = ALIGN_BYTES - nFisrtUnalignedBytes;
+        crc = CRC32_one_byte_lookup(crc, data, nFisrtUnalignedBytes);
+        length -= nFisrtUnalignedBytes;
+        current = (const uint32_t*) ((char*)data + nFisrtUnalignedBytes);
+    }
+
+    /* process aligned data with slicing-by-8 algorithm */
+    while (length >= 8)
+    {
+#if QWORD_READ == 1 /* this is slower than 2x4-bytes */
+        uint64_t qword = *current++ ^ bswap_32(crc); /* in theory it should be no bswap for little-endian here */
+        crc =
+            sCRC32_tbl_[0][(uint8_t)(qword>>56)] ^
+            sCRC32_tbl_[1][(uint8_t)(qword>>48)] ^
+            sCRC32_tbl_[2][(uint8_t)(qword>>40)] ^
+            sCRC32_tbl_[3][(uint8_t)(qword>>32)] ^
+            sCRC32_tbl_[4][(uint8_t)(qword>>24)] ^
+            sCRC32_tbl_[5][(uint8_t)(qword>>16)] ^
+            sCRC32_tbl_[6][(uint8_t)(qword>> 8)] ^
+            sCRC32_tbl_[7][(uint8_t)qword];
+#else
+        uint32_t one = *current++ ^ bswap_32(crc); /* in theory it should be no bswap for little-endian here */
+        uint32_t two = *current++;
+        crc =
+            sCRC32_tbl_[0][(uint8_t)(two>>24)] ^
+            sCRC32_tbl_[1][(uint8_t)(two>>16)] ^
+            sCRC32_tbl_[2][(uint8_t)(two>> 8)] ^
+            sCRC32_tbl_[3][(uint8_t)two] ^
+            sCRC32_tbl_[4][(uint8_t)(one>>24)] ^
+            sCRC32_tbl_[5][(uint8_t)(one>>16)] ^
+            sCRC32_tbl_[6][(uint8_t)(one>> 8)] ^
+            sCRC32_tbl_[7][(uint8_t)one];
+#endif
+
+        length -= 8;
+    }
+
+    /* remaining 1 to 7 bytes (standard algorithm) */
+    crc = CRC32_one_byte_lookup(crc, current, length);
+
+#if INVERT_PREVIOUS_CRC
+    return ~crc; // same as crc ^ 0xFFFFFFFF
+#else
+    return crc;
+#endif
+}
+
+#endif /* SLOW_CRC */
diff --git a/libs/klib/data-buffer.c b/libs/klib/data-buffer.c
new file mode 100644
index 0000000..4021471
--- /dev/null
+++ b/libs/klib/data-buffer.c
@@ -0,0 +1,656 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/extern.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <atomic32.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#if _ARCH_BITS == 32
+#define BASE_PTR_ALIGNMENT 8
+#else
+#define BASE_PTR_ALIGNMENT 16
+#endif
+
+#define DEBUG_ALIGNMENT 0
+
+#if _DEBUGGING
+#define DEBUG_MALLOC_FREE 1
+#include <stdio.h>
+#endif
+
+#if DEBUG_ALIGNMENT
+#if ! _DEBUGGING
+#include <stdio.h>
+#endif
+
+static
+void cc_impl ( const KDataBuffer * self, const char * func, uint32_t lineno )
+{
+    /* if not byte-aligned, pointer is always a byte pointer */
+    if ( ( self -> elem_bits & 7 ) == 0 )
+    {
+        /* convert from bits to bytes */
+        uint64_t elem_bytes = self -> elem_bits >> 3;
+
+        /* if the size is an integral power of 2 */
+        if ( ( ( elem_bytes - 1 ) & elem_bytes ) == 0 )
+        {
+            /* never should be called with < 2 bytes ( see "cc" macro ) */
+            assert ( elem_bytes >= 2 );
+
+#if _ARCH_BITS == 32
+            /* test pointer alignment against 1 ( 16-bit ), 3 ( 32-bit ) */
+            if ( ( ( size_t ) self -> base & ( elem_bytes - 1 ) & 3 ) != 0 )
+            {
+                /* this buffer has bad pointer alignment */
+                fprintf ( stderr, "%s:%u: %s - WARNING: bad pointer alignment: 0x%08lx -> %lu bytes\n",
+                          __FILE__, lineno, func, ( size_t ) self -> base, ( size_t ) elem_bytes );
+            }
+#else
+            /* test pointer alignment against 1 ( 16-bit ), 3 ( 32-bit ), 7 ( 64-bit ), 15 ( 128-bit ) */
+            if ( ( ( size_t ) self -> base & ( elem_bytes - 1 ) & 15 ) != 0 )
+            {
+                /* this buffer has bad pointer alignment */
+                fprintf ( stderr, "%s:%u: %s - WARNING: bad pointer alignment: 0x%016lx -> %lu bytes\n",
+                          __FILE__, lineno, func, ( size_t ) self -> base, ( size_t ) elem_bytes );
+            }
+#endif
+        }
+    }
+}
+
+#define cc( self )                                          \
+    if ( ( self ) != NULL && ( self ) -> elem_bits > 16 )   \
+        cc_impl ( self, __func__, __LINE__ )
+#else
+#define cc( self ) ( ( void ) 0 )
+#endif
+
+/*--------------------------------------------------------------------------
+ * KDataBufferImpl
+ */
+typedef struct buffer_impl_t buffer_impl_t;
+struct buffer_impl_t {
+    size_t allocated;
+    atomic32_t refcount;
+    uint32_t foo;
+#if _ARCH_BITS == 32
+    uint32_t foo2;
+#endif
+};
+
+static size_t roundup(size_t value, unsigned bits)
+{
+    size_t const mask = (((size_t)1u) << bits) - 1;
+    return (value + mask) & (~mask);
+}
+
+static
+rc_t allocate(buffer_impl_t **target, size_t capacity) {
+    buffer_impl_t *y = malloc(capacity + sizeof(*y));
+
+    if (y == NULL)
+        return RC(rcRuntime, rcBuffer, rcAllocating, rcMemory, rcExhausted);
+
+    y->allocated = capacity;
+    atomic32_set(&y->refcount, 1);
+    
+#if DEBUG_MALLOC_FREE
+    y->foo = 0;
+#endif
+
+    *target = y;
+    return 0;
+}
+
+static buffer_impl_t *add_ref(buffer_impl_t *self) {
+    atomic32_inc(&self->refcount);
+    return self;
+}
+
+static buffer_impl_t *test_add_ref(buffer_impl_t *self) {
+    if (self) add_ref(self);
+    return self;
+}
+
+static void release(buffer_impl_t *self) {
+    int32_t refcount = atomic32_read_and_add(&self->refcount, -1);
+    
+    if (refcount == 1) {
+#if DEBUG_MALLOC_FREE
+        if (self->foo != 0) {
+            fprintf(stderr, "DIE DIE\n");
+        }
+        self->foo = 55;
+#endif
+        free(self);
+    }
+#if DEBUG_MALLOC_FREE
+    else if (refcount < 1) {
+        fprintf(stderr, "ALREADY DEAD\n");
+    }
+#endif
+}
+
+/* always returns object (new or original) with refcount == 1 */
+static rc_t reallocate(buffer_impl_t **target, size_t capacity) {
+    buffer_impl_t *temp;
+    buffer_impl_t *self = *target;
+
+    if (capacity <= self->allocated)
+        return 0;
+
+    /* check reference count for copies */
+    if (atomic32_read(&self->refcount) <= 1)
+    {
+        temp = realloc(self, capacity + sizeof(*temp));
+        if (temp == NULL)
+            return RC(rcRuntime, rcBuffer, rcResizing, rcMemory, rcExhausted);
+    }
+    else
+    {
+        temp = malloc(capacity + sizeof(*temp));
+        if (temp == NULL)
+            return RC(rcRuntime, rcBuffer, rcResizing, rcMemory, rcExhausted);
+        memmove(temp, self, self->allocated + sizeof(*temp));
+        release(self);
+    }
+    self = temp;
+    self->allocated = capacity;
+    atomic32_set(&self->refcount, 1);
+    *target = self;
+
+    return 0;
+}
+
+static rc_t shrink(buffer_impl_t **target, size_t capacity)
+{
+    buffer_impl_t *self = *target;
+    
+    if (capacity < self->allocated && atomic32_read(&self->refcount) == 1) {
+        buffer_impl_t *temp = realloc(self, capacity + sizeof(*temp));
+        
+        if (temp == NULL)
+            return RC(rcRuntime, rcBuffer, rcResizing, rcMemory, rcExhausted);
+
+        temp->allocated = capacity;
+        *target = temp;
+    }
+    return 0;
+}
+
+/*
+ either returns original with refcount == 2
+ or returns new copy with refcount == 1
+ */
+static buffer_impl_t* make_copy(buffer_impl_t *self) {
+    if (atomic32_read_and_add_eq(&self->refcount, 1, 1)==1)
+        return self;
+    else {
+        buffer_impl_t *copy = malloc(self->allocated + sizeof(*self));
+        if (copy) {
+            memmove(copy, self, self->allocated + sizeof(*copy));
+            atomic32_set(&copy->refcount, 1);
+        }
+        return copy;
+    }
+}
+
+static void const *get_data(buffer_impl_t const *self)
+{
+    return &self[1];
+}
+
+static void const *get_data_endp(buffer_impl_t const *self)
+{
+    return (uint8_t const *)get_data(self) + self->allocated;
+}
+
+static
+rc_t buffer_impl_check_integrity (buffer_impl_t const *self, uint8_t const *base, size_t offset, size_t size)
+{
+    void const *const endp = &base[size+offset];
+
+    if (self == NULL)
+        return 0;
+
+    /* refcount is of major importance */
+    if (atomic32_read (& self->refcount) <= 0)
+        return RC (rcRuntime, rcBuffer, rcValidating, rcBuffer, rcDestroyed);
+
+#if DEBUG_MALLOC_FREE
+    if (self->foo != 0)
+        return RC (rcRuntime, rcBuffer, rcValidating, rcBuffer, rcDestroyed);
+#endif
+
+    if ((void const *)base < get_data(self) || get_data_endp(self) < endp)
+        return RC (rcRuntime, rcBuffer, rcValidating, rcData, rcCorrupt);
+
+    return 0;
+}
+
+/* Make
+ *  create a new empty buffer
+ *
+ *  "buffer" [ OUT ] - pointer to structure to initialize
+ *
+ *  "capacity" [ IN ] - the number of bytes to be allocated
+ */
+LIB_EXPORT rc_t CC KDataBufferMake(KDataBuffer *target, uint64_t elem_bits, uint64_t elem_count) {
+    rc_t rc;
+    size_t bytes;
+    buffer_impl_t **impp;
+    
+    if (target == NULL)
+    	return RC(rcRuntime, rcBuffer, rcConstructing, rcParam, rcNull);
+
+    impp = (buffer_impl_t **)&target->ignore;
+    
+    bytes = roundup((elem_bits * elem_count + 7) / 8, 12);
+    if (8 * (uint64_t)bytes < elem_bits * elem_count)
+    	return RC(rcRuntime, rcBuffer, rcConstructing, rcParam, rcTooBig);
+    
+    memset (target, 0, sizeof(*target));
+
+    rc = allocate(impp, bytes);
+    if (rc == 0) {
+        target->base = (void *)get_data(*impp);
+        target->elem_bits = elem_bits;
+        target->elem_count = elem_count;
+    }
+
+    cc ( target );
+
+    return rc;
+}
+
+static rc_t KDataBufferResizeInt(KDataBuffer *self, uint64_t new_count) {
+    rc_t rc;
+    buffer_impl_t *imp;
+    buffer_impl_t *new_imp;
+    size_t new_size;
+    uint64_t bits;
+    const uint8_t *new_end;
+    const uint8_t *cur_end;
+    
+    if (self == NULL)
+    	return RC(rcRuntime, rcBuffer, rcResizing, rcParam, rcNull);
+
+    if (new_count == 0) {
+        self->elem_count = 0;
+        return 0; /*** no change for empty data ***/
+    }
+
+    bits = self->elem_bits * new_count;
+    if (((bits + 7) >> 35) != 0)
+    	return RC(rcRuntime, rcBuffer, rcConstructing, rcParam, rcTooBig);
+    
+    imp = (buffer_impl_t *)self->ignore;
+    if (imp == NULL) {
+        /* new buffer */
+        rc = allocate(&imp, roundup((bits + 7) / 8, 12));
+        if (rc == 0) {
+            self->ignore = imp;
+            self->base = (void *)get_data(imp);
+            self->elem_count = new_count;
+        }
+        return rc;
+    }
+
+    cur_end = &((const uint8_t *)imp)[imp->allocated + sizeof *imp];
+    new_end = &((const uint8_t *)self->base)[(bits + self->bit_offset + 7) >> 3];
+    if (cur_end >= new_end) {
+        /* requested end-of-buffer is within current allocation; realloc not required */
+        self->elem_count = new_count;
+        return 0;
+    }
+
+    if (!KDataBufferWritable(self))
+        return RC(rcRuntime, rcBuffer, rcResizing, rcSelf, rcReadonly);
+    
+    new_size = roundup((bits + 7) / 8, 12);
+    if (self->base == get_data(imp) && self->bit_offset == 0) {
+        rc = reallocate(&imp, new_size);
+        if (rc == 0) {
+            self->ignore = imp;
+            self->base = (void *)get_data(imp);
+            self->elem_count = new_count;
+        }
+        return rc;
+    }
+
+    /* is sub-buffer but is sole reference */
+    rc = allocate(&new_imp, roundup(new_size, 12));
+    if (rc == 0) {
+        memmove((void *)get_data(new_imp), self->base, new_size);
+        release(imp);
+        self->base = (void *)get_data(new_imp);
+        self->ignore = new_imp;
+        self->elem_count = new_count;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDataBufferResize(KDataBuffer *self, uint64_t new_count)
+{
+    rc_t rc = KDataBufferResizeInt ( self, new_count );
+    cc ( self );
+    return rc;
+}
+
+static rc_t KDataBufferSubInt (const KDataBuffer *self,
+    KDataBuffer *target, uint64_t start, uint64_t count)
+{
+    if (self == NULL || target == NULL)
+    	return RC(rcRuntime, rcBuffer, rcConstructing, rcParam, rcNull);
+    
+    if (self->ignore == NULL) {
+        if (start > 0 || count < UINT64_MAX)
+            return RC(rcRuntime, rcBuffer, rcConstructing, rcParam, rcNull);
+        *target = *self;
+        return 0;
+    }
+    if ((const KDataBuffer *)target != self) {
+        *target = *self;
+        target->ignore = add_ref((buffer_impl_t *)self->ignore);
+    }
+    {
+        buffer_impl_t *imp = (buffer_impl_t *)self->ignore;
+        bitsz_t offset = self->bit_offset + (((bitsz_t)((uint8_t const *)self->base - (uint8_t const *)get_data(imp))) << 3);
+        
+        if (start > self->elem_count){
+            start = self->elem_count;
+            count = 0;
+        }
+        else if (count > self->elem_count) {
+            count = self->elem_count;
+        }
+        if (start + count > self->elem_count) {
+            count = self->elem_count - start;
+        }
+        target->elem_count = count;
+        offset += (bitsz_t)start * self->elem_bits;
+        target->base = &((uint8_t *)get_data(imp))[offset >> 3];
+        target->bit_offset = (uint8_t)offset & 0x07;
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KDataBufferSub (const KDataBuffer *self,
+    KDataBuffer *target, uint64_t start, uint64_t count)
+{
+    rc_t rc = KDataBufferSubInt ( self, target, start, count );
+    cc ( self );
+    return rc;
+}
+
+static
+rc_t KDataBufferCastInt(const KDataBuffer *self, KDataBuffer *target, uint64_t new_elem_bits, bool can_shrink)
+{
+    bitsz_t bits;
+    size_t new_elem_count;
+    bitsz_t new_bits;
+
+    if (self == NULL)
+        return RC (rcRuntime, rcBuffer, rcCasting, rcSelf, rcNull);
+    if (target == NULL)
+    	return RC (rcRuntime, rcBuffer, rcCasting, rcParam, rcNull);
+    if (new_elem_bits == 0)
+    	return RC (rcRuntime, rcBuffer, rcCasting, rcParam, rcInvalid);
+    
+    bits = KDataBufferBits(self);
+    new_elem_count = bits / new_elem_bits;
+    new_bits = new_elem_bits * new_elem_count;
+    
+    if (new_bits != bits && ! (can_shrink && new_bits < bits))
+        return RC(rcRuntime, rcBuffer, rcCasting, rcParam, rcInvalid);
+
+    /* check alignment - if new element size is integral power of 2 and >= 16 bits */
+    if ( ( ( new_elem_bits - 1 ) & new_elem_bits ) == 0 && new_elem_bits >= 16 )
+    {
+        uint64_t elem_bytes = new_elem_bits >> 3;
+        if ( ( ( size_t ) self -> base & ( elem_bytes - 1 ) ) != 0 )
+        {
+            buffer_impl_t * buffer = ( buffer_impl_t * ) self -> ignore;
+            size_t total_bytes = KDataBufferBytes ( self );
+
+#if DEBUG_ALIGNMENT
+            fprintf ( stderr, "NOTICE: %s - adjusting pointer alignment of %zu byte buffer: ", __func__, total_bytes );
+#endif
+
+            /* need to realign data */
+            if ( ( const KDataBuffer * ) target == self && atomic32_read ( & buffer -> refcount ) == 1 )
+            {
+#if DEBUG_ALIGNMENT
+                fprintf ( stderr, "using memmove within buffer\n" );
+#endif
+                /* can simply memmove */
+                memmove ( buffer + 1, target -> base, total_bytes );
+                target -> base = buffer + 1;
+                assert ( ( ( size_t ) target -> base & ( BASE_PTR_ALIGNMENT - 1 ) ) == 0 );
+
+                /* perform cast */
+                target-> elem_count = new_elem_count;
+                target-> elem_bits = new_elem_bits;
+            }
+            else
+            {
+                /* must realloc */
+                KDataBuffer tmp;
+                rc_t rc = KDataBufferMakeBytes ( & tmp, total_bytes );
+                if ( rc != 0 )
+                    return rc;
+                assert ( ( ( size_t ) tmp . base & ( BASE_PTR_ALIGNMENT - 1 ) ) == 0 );
+
+#if DEBUG_ALIGNMENT
+                fprintf ( stderr, "reallocating and copying buffer\n" );
+#endif
+                /* copy */
+                memmove ( tmp . base, self -> base, total_bytes );
+
+                /* if assigning target would overwrite self, whack original */
+                if ( ( const KDataBuffer * ) target == self )
+                    KDataBufferWhack ( target );
+
+                /* new buffer is now output */
+                * target = tmp;
+            }
+
+            return 0;
+        }
+    }
+
+    if ((const KDataBuffer *)target != self)
+    {
+        *target = *self;
+        target->ignore = test_add_ref((buffer_impl_t *)self->ignore);
+    }
+
+    target->elem_count = new_elem_count;
+    target->elem_bits = new_elem_bits;
+
+    return 0;
+
+}
+
+LIB_EXPORT rc_t CC KDataBufferCast(const KDataBuffer *self, KDataBuffer *target, uint64_t new_elem_bits, bool can_shrink)
+{
+    rc_t rc = KDataBufferCastInt ( self, target, new_elem_bits, can_shrink );
+    cc ( self );
+    return rc;
+}
+
+static rc_t KDataBufferMakeWritableInt (const KDataBuffer *cself, KDataBuffer *target)
+{
+    if (cself == NULL)
+    	return RC(rcRuntime, rcBuffer, rcConstructing, rcParam, rcNull);
+    
+    if (target == NULL)
+    	return RC(rcRuntime, rcBuffer, rcConstructing, rcParam, rcNull);
+
+    if ((KDataBuffer const *)target != cself)
+        memset(target, 0, sizeof(*target));
+    
+    if (cself->ignore == NULL)
+        return KDataBufferMake(target, cself->elem_bits, cself->elem_count);
+    else {
+        buffer_impl_t *self = (buffer_impl_t *)cself->ignore;
+        buffer_impl_t *copy;
+        
+        if (cself->base == get_data(self) && cself->bit_offset == 0) {
+            /* not a sub-buffer */
+            copy = make_copy(self);
+            if (copy) {
+                if ((KDataBuffer const *)target == cself)
+                    release(self);
+                else 
+                    *target = *cself;
+                target->ignore = copy;
+                target->base = (uint8_t *)get_data(copy);
+                
+                return 0;
+            }
+            return RC(rcRuntime, rcBuffer, rcAllocating, rcMemory, rcExhausted);
+        }
+        else if (atomic32_read(&self->refcount) == 1) {
+            /* sub-buffer but is only reference so let it be */
+            if ((KDataBuffer const *)target != cself) {
+                *target = *cself;
+                atomic32_set(&self->refcount, 2);
+            }
+            return 0;
+        }
+        else {
+            /* sub-buffer so make new and copy */
+            rc_t rc;
+            
+            rc = allocate(&copy, roundup(KDataBufferBytes(cself), 12));
+            if (rc == 0) {
+                if (cself->bit_offset == 0)
+                    memmove((void *)get_data(copy), cself->base, KDataBufferBytes(cself));
+                else
+                    bitcpy((void *)get_data(copy), 0, cself->base, cself->bit_offset, KDataBufferBits(cself));
+
+                if ((const KDataBuffer *)target == cself)
+                    release(self);
+                else 
+                    *target = *cself;
+                target->ignore = copy;
+                target->base = (uint8_t *)get_data(copy);
+                target->bit_offset = 0;
+                return 0;
+            }
+            return rc;
+        }
+    }
+}
+
+LIB_EXPORT rc_t CC KDataBufferMakeWritable (const KDataBuffer *cself, KDataBuffer *target)
+{
+    rc_t rc = KDataBufferMakeWritableInt ( cself, target );
+    cc ( cself );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDataBufferWhack (KDataBuffer *self)
+{
+    cc ( self );
+    if (self)
+    {
+        if (self->ignore)
+            release((buffer_impl_t *)self->ignore);
+
+        memset(self, 0, sizeof(*self));
+    }
+    return 0;
+}
+
+LIB_EXPORT bool CC KDataBufferWritable(const KDataBuffer *cself)
+{
+    cc ( cself );
+    return (cself != NULL && cself->ignore != NULL &&
+            atomic32_read(&((buffer_impl_t *)cself->ignore)->refcount) == 1) ? true : false;
+}
+
+LIB_EXPORT rc_t CC KDataBufferShrink(KDataBuffer *self)
+{
+    rc_t rc = 0;
+    if (self && self->ignore) {
+        rc = shrink((buffer_impl_t **)&self->ignore,
+            (self->elem_bits * self->elem_count + self->bit_offset + 7) / 8);
+        cc ( self );
+    }
+    return rc;
+}
+
+LIB_EXPORT size_t CC KDataBufferMemorySize(KDataBuffer const *self)
+{
+    cc ( self );
+    if (self && self->ignore) {
+        return ((buffer_impl_t const *)self->ignore)->allocated + sizeof(buffer_impl_t);
+    }
+    return 0;
+}
+
+/* CheckIntegrity
+ *  performs some level of integrity checking on buffer structure
+ */
+LIB_EXPORT rc_t CC KDataBufferCheckIntegrity (const KDataBuffer *self)
+{
+    /* whether NULL is allowed is determined by caller */
+    if (self == NULL)
+        return RC (rcRuntime, rcBuffer, rcValidating, rcSelf, rcNull);
+
+    /* elem-bits must not be 0, unless there is no allocation */
+    if (self->elem_bits == 0)
+    {
+        if (self->elem_count == 0 && self->bit_offset == 0 && self->ignore == NULL) {
+            /* no allocation */
+            return 0;
+        }
+	    return RC (rcRuntime, rcBuffer, rcValidating, rcSelf, rcCorrupt);
+    }
+
+    /* if there is no allocation, check self */
+    if (self->ignore == NULL)
+    {
+        if (self->elem_count != 0 || self->bit_offset != 0)
+	    return RC (rcRuntime, rcBuffer, rcValidating, rcSelf, rcCorrupt);
+    }
+
+    /* test self against allocated buffer */
+    return buffer_impl_check_integrity (self->ignore, (const void*) self->base,
+        self->bit_offset / self->elem_bits, KDataBufferBytes (self));
+}
+
+/* 0x101e9b000 */
diff --git a/libs/klib/debug.c b/libs/klib/debug.c
new file mode 100644
index 0000000..62ab1bf
--- /dev/null
+++ b/libs/klib/debug.c
@@ -0,0 +1,352 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#if _DEBUGGING
+
+#include <klib/extern.h>
+#include <klib/debug.h>
+#include "writer-priv.h"
+#include <sysalloc.h>
+
+/* PUT THIS IN A CORRECT PLACE */
+#define _module(mod) \
+    KDbgFlag DBG_PASTE_3(DBG_,mod,_ANY) = ( DBG_PASTE_2(mod,_CONDITIONS()) 0);
+#define _condition(mod,flag) \
+    (((KDbgFlag)1)<<DBG_PASTE_4(DBG_,mod,_,flag)) |
+
+MODULE_NAMES()
+
+#undef _module
+#undef _condition
+
+#define _module(mod)                            \
+    dbg_s_flag DBG_PASTE_2(dbg_s_flag_,mod) [] = \
+    {                                            \
+        DBG_PASTE_2(mod,_CONDITIONS())           \
+        { NULL, DBG_FLAG_NONE }                      \
+    };
+
+#define _condition(mod,flag)                                           \
+    { DBG_STRING(flag), ((KDbgFlag)1)<<DBG_PASTE_4(DBG_,mod,_,flag) },
+
+MODULE_NAMES()
+
+#undef _module
+#undef _condition
+
+#define _module(mod)                           \
+    {                                           \
+        DBG_STRING(mod),                         \
+        DBG_PASTE_2(dbg_s_flag_,mod),        \
+        0                                       \
+    },
+
+dbg_s_mod dbg_flag_mod [] = 
+{
+    MODULE_NAMES()
+    { NULL, NULL }
+};
+#undef _module
+
+#define _module(mod) 
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <stdio.h>
+#include <string.h>
+
+KWrtHandler G_dbg_handler;
+
+
+/*  ********************************************************
+
+    setters and getters to find out what causes file-acces
+
+    ******************************************************** */
+
+uint64_t dbg_row_id;
+char dbg_col_name[ 128 ];
+
+
+LIB_EXPORT void CC KDbgSetRowId( uint64_t row_id )
+{
+    dbg_row_id = row_id;
+}
+
+
+LIB_EXPORT uint64_t CC KDbgGetRowId( void )
+{
+    return dbg_row_id;
+}
+
+LIB_EXPORT void CC KDbgSetColName( const char * col_name )
+{
+    if ( col_name != NULL )
+        string_copy ( dbg_col_name, sizeof dbg_col_name, col_name, string_size( col_name ) );
+    else
+        dbg_col_name[ 0 ] = 0;
+}
+
+LIB_EXPORT const char * CC KDbgGetColName( void )
+{
+    return dbg_col_name;
+}
+
+
+/*  ********************************************************  */
+
+/*
+ * Init()
+ * Initialize the debug messages module to a known state
+ */
+LIB_EXPORT rc_t CC KDbgInit( void )
+{
+    KDbgHandlerSetStdErr();
+    dbg_row_id = 0;
+    dbg_col_name[ 0 ] = 0;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KDbgMsg ( const char * fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+
+    if( (rc = vkfprintf(KDbgHandlerGet (), NULL, fmt, args)) != 0 ) {
+        kfprintf(KDbgHandlerGet(), NULL, "dbgmsg failure: %R in '%s'\n", rc, fmt);
+    }
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT KDbgFlag CC KDbgCondToFlag( KDbgCond cond )
+{
+    return (((KDbgFlag)1)<<cond);
+}
+
+/*
+ * For module 'mod' turn on or off the specific flags in
+ * mask flags
+ *
+ * bits in mask are effected.
+ * return previous 
+ */
+LIB_EXPORT KDbgMask CC KDbgSetModConds( KDbgMod mod, KDbgMask mask, KDbgMask flags )
+{
+    KDbgMask previous;
+
+    if ((mod < 0) || (mod >= DBG_MOD_COUNT))
+    {
+        /* unmaskable debug message */
+        KDbgMsg ("%s: Undefined module: (%u)\n", __func__, mod);
+        return DBG_FLAG_NONE;
+    }
+    previous = dbg_flag_mod[mod].flags;
+
+    dbg_flag_mod[mod].flags = (flags & mask) | (previous & ~mask);
+
+    return previous;
+}
+
+
+LIB_EXPORT bool CC KDbgTestModConds( KDbgMod mod, KDbgMask flags )
+{
+    if (mod >= DBG_MOD_COUNT)
+    {
+        /* unmaskable debug message */
+        KDbgMsg ("%s: Undefined module: (%u)\n", __func__, mod);
+        return false;
+    }
+    return DBG_FLAG_NONE != (KDbgGetModFlags (mod) & flags);
+}
+
+
+/*
+ * Get the KDbgMod associated with a name.
+ */
+LIB_EXPORT rc_t CC KDbgGetModId( KDbgMod * mod, 
+                   const char * mod_name, size_t mod_size )
+{
+    KDbgMod idx;
+
+    for (idx = 0; idx < DBG_MOD_COUNT; ++idx)
+    {
+        if (strncmp (dbg_flag_mod[idx].name, mod_name, mod_size) == 0)
+        {
+            *mod = idx;
+            return 0;
+        }
+    }
+    *mod = DBG_MOD_NOT_FOUND;
+    return RC (rcRuntime, rcLog, rcAccessing, rcParam, rcNotFound);
+}
+
+
+/*
+ * Get the KDbgCond associated with a name.
+ */
+LIB_EXPORT rc_t CC KDbgGetCndFlag( KDbgMod mod, KDbgFlag * flag,
+                      const char * cnd_name, size_t cnd_size )
+{
+    const dbg_s_flag * cnd;
+
+    for (cnd = dbg_flag_mod[mod].conds; cnd->name != NULL; ++cnd)
+    {
+        if (strncmp (cnd_name, cnd->name, cnd_size) == 0)
+            break;
+    }
+    if (cnd->name == NULL)
+        return RC (rcRuntime, rcArgv, rcAccessing, rcParam, rcUndefined);
+
+    *flag = cnd->flag;
+    return 0;
+}
+
+LIB_EXPORT KDbgMask CC KDbgGetModFlags( KDbgMod mod )
+{
+    if ((mod < 0) || (mod >= DBG_MOD_COUNT))
+    {
+        /* unmaskable debug message */
+        KDbgMsg ("%s: Undefined module: (%u)\n", __func__, mod);
+        return DBG_FLAG_NONE;
+    }
+    return dbg_flag_mod[mod].flags;
+}
+
+/* 
+ * param is coming in as utf-8/ASCII with NUL terminator or we fail
+ * we also assume no more than 127 significant characters
+ *
+ * These strings can be utf-8 or ASCII even if we are using 
+ * clib strXXX functions.
+ */
+LIB_EXPORT rc_t CC KDbgSetString( const char * string )
+{
+    const char * mod_s;
+    const char * flag_s;
+    size_t mod_z;
+
+    KDbgMod mod;
+
+    rc_t rc;
+
+    mod_s = string;
+
+    if (mod_s == NULL)
+        return RC (rcRuntime, rcArgv, rcAccessing, rcParam, rcNull);
+    if (*mod_s == '\0')
+        return 0;
+
+    flag_s = strchr (mod_s, '-');
+    if (flag_s)
+    {
+        mod_z = (size_t)(flag_s - mod_s);
+
+        if (*(++flag_s) == '\0')
+            flag_s = NULL;
+    }
+    else
+        mod_z = strlen (mod_s);
+
+    rc = KDbgGetModId (&mod, mod_s, mod_z);
+    if (rc)
+        return rc;
+
+    /* now we have a id for the module so we need to figure out the flag */
+
+    if (flag_s == NULL)
+    {
+        dbg_flag_mod[mod].flags = ~(KDbgMask)0;
+        rc = 0;
+    }
+    else
+    {
+        const dbg_s_flag * cnd;
+
+        for (cnd = dbg_flag_mod[mod].conds; cnd->name != NULL; ++cnd)
+        {
+            if (strcmp (flag_s, cnd->name) == 0)
+                break;
+        }
+        if (cnd->name == NULL)
+            return RC (rcRuntime, rcArgv, rcAccessing, rcParam, rcUndefined);
+
+        dbg_flag_mod[mod].flags |= cnd->flag;
+
+    }
+    return 0;
+}
+
+/* -----
+ * Handlers for application and library writers.
+ */
+
+#undef KDbgHandlerSetStdOut
+LIB_EXPORT rc_t CC KDbgHandlerSetStdOut( void )
+{
+    return KDbgHandlerSet( KWrt_DefaultWriter,KWrt_DefaultWriterDataStdOut );
+}
+
+
+#undef KDbgHandlerSetStdErr
+LIB_EXPORT rc_t CC KDbgHandlerSetStdErr( void )
+{
+    return KDbgHandlerSet( KWrt_DefaultWriter,KWrt_DefaultWriterDataStdErr );
+}
+
+
+#undef KDbgHandlerSet
+LIB_EXPORT rc_t CC KDbgHandlerSet( KWrtWriter writer, void * writer_data )
+{
+    G_dbg_handler.writer = writer;
+    G_dbg_handler.data = writer_data;
+    return 0;
+}
+
+#undef KDbgWriterDataGet
+LIB_EXPORT void * CC KDbgWriterDataGet( void )
+{
+    return ( KDbgHandlerGet()->data );
+}
+
+
+#undef KDbgWriterGet
+LIB_EXPORT KWrtWriter CC KDbgWriterGet( void )
+{
+    return ( KDbgHandlerGet()->writer );
+}
+
+
+#undef KDbgHandlerGet
+LIB_EXPORT KWrtHandler * CC KDbgHandlerGet( void )
+{
+    return ( &G_dbg_handler );
+}
+
+#endif /* _DEBUGGING */
diff --git a/libs/klib/iso8859-1.c b/libs/klib/iso8859-1.c
new file mode 100644
index 0000000..e62cdc9
--- /dev/null
+++ b/libs/klib/iso8859-1.c
@@ -0,0 +1,42 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <sysalloc.h>
+#include <stdint.h>
+
+LIB_EXPORT const uint32_t iso8859_1 [ 128 ] =
+{
+    /*  +       0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 */
+    /* 128 */   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    /* 144 */   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    /* 160 */ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
+    /* 176 */ 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
+    /* 192 */ 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
+    /* 208 */ 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
+    /* 224 */ 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
+    /* 240 */ 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
+};
diff --git a/libs/klib/iso8859.c b/libs/klib/iso8859.c
new file mode 100644
index 0000000..0973624
--- /dev/null
+++ b/libs/klib/iso8859.c
@@ -0,0 +1,205 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/text.h>
+#include <sysalloc.h>
+#include <assert.h>
+
+/* iso8859_utf32
+ *  converts 8-bit text to a single UTF32 character
+ *  returns the number of 8-bit bytes consumed, such that:
+ *    return > 0 means success
+ *    return == 0 means insufficient input
+ *    return < 0 means bad input
+ */
+LIB_EXPORT int CC iso8859_utf32 ( const uint32_t map [ 128 ],
+    uint32_t *cp, const char *begin, const char *end )
+{
+    uint32_t ch;
+
+    if ( begin == NULL || end == NULL )
+        return -1;
+    if ( begin >= end )
+        return 0;
+
+    ch = begin [ 0 ];
+    if ( begin [ 0 ] < 0 )
+    {
+        ch = map [ ch & 0x7F ];
+        if ( ch == 0 )
+            return -1;
+    }
+
+    * cp = ch;
+    return 1;
+}
+
+/* iso8859_string_size/len/measure
+ *  measures UTF-16 strings
+ */
+LIB_EXPORT size_t CC iso8859_string_size ( const uint32_t map [ 128 ],
+    const char *str )
+{
+    uint32_t i, ch;
+
+    for ( ch = str [ i = 0 ]; ch != 0; ch = str [ ++ i ] )
+    {
+        if ( ( int ) ch < 0 && map [ ch & 0x7F ] == 0 )
+            break;
+    }
+
+    return ( size_t ) i;
+}
+
+LIB_EXPORT uint32_t CC iso8859_string_len ( const uint32_t map [ 128 ],
+    const char *str, size_t size )
+{
+    uint32_t i;
+
+    for ( i = 0; i < ( uint32_t ) size; ++ i )
+    {
+        uint32_t ch = str [ i ];
+        if ( str [ i ] < 0 && map [ ch & 0x7F ] == 0 )
+            break;
+    }
+
+    return i;
+}
+
+LIB_EXPORT uint32_t CC iso8859_string_measure ( const uint32_t map [ 128 ],
+    const char *str, size_t *size )
+{
+    uint32_t i, ch;
+
+    for ( ch = str [ i = 0 ]; ch != 0; ch = str [ ++ i ] )
+    {
+        if ( ( int ) ch < 0 && map [ ch & 0x7F ] == 0 )
+            break;
+    }
+
+    * size = i;
+    return i;
+}
+
+/* conversion from ISO-8859-x to internal standard */
+LIB_EXPORT uint32_t CC iso8859_cvt_string_len ( const uint32_t map [ 128 ],
+    const char *src, size_t src_size, size_t *dst_size )
+{
+    size_t size;
+    uint32_t i;
+
+    for ( i = 0, size = 0; i < ( uint32_t ) src_size; ++ i )
+    {
+        uint32_t ch = src [ i ];
+        if ( src [ i ] < 0 )
+        {
+            int ch_len;
+            char ignore [ 8 ];
+
+            ch = map [ ch & 0x7F ];
+            if ( ch == 0 )
+                break;
+
+            ch_len = utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch );
+            if ( ch_len <= 0 )
+                break;
+
+            size += ch_len;
+        }
+        else
+        {
+            ++ size;
+        }
+    }
+
+    * dst_size = size;
+
+    return i;
+}
+
+LIB_EXPORT uint32_t CC iso8859_cvt_string_measure ( const uint32_t map [ 128 ],
+    const char *src, size_t *src_size, size_t *dst_size )
+{
+    size_t size;
+    uint32_t i, ch;
+
+    for ( ch = src [ i = 0 ], size = 0; ch != 0; ch = src [ ++ i ] )
+    {
+        if ( ( int ) ch < 0 )
+        {
+            int ch_len;
+            char ignore [ 8 ];
+
+            ch = map [ ch & 0x7F ];
+            if ( ch == 0 )
+                break;
+
+            ch_len = utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch );
+            if ( ch_len <= 0 )
+                break;
+
+            size += ch_len;
+        }
+        else
+        {
+            ++ size;
+        }
+    }
+
+    * src_size = ( size_t ) i;
+    * dst_size = size;
+
+    return i;
+}
+
+LIB_EXPORT size_t CC iso8859_cvt_string_copy ( const uint32_t map [ 128 ],
+    char *dst, size_t dst_size, const char *src, size_t src_size )
+{
+    char *begin = dst;
+    char *dend = dst + dst_size;
+    const char *send = src + src_size;
+
+    while ( dst < dend && src < send )
+    {
+        int ch_len;
+        uint32_t ch = * src ++;
+        if ( ( int ) ch < 0 )
+        {
+            ch = map [ ch & 0x7F ];
+            if ( ch == 0 )
+                break;
+        }
+        ch_len = utf32_utf8 ( dst, dend, ch );
+        if ( ch_len <= 0 )
+            break;
+        dst += ch_len;
+    }
+
+    if ( dst < dend )
+        * dst = 0;
+    return ( size_t ) ( dst - begin );
+}
diff --git a/libs/klib/judy-vector.c b/libs/klib/judy-vector.c
new file mode 100644
index 0000000..9e34f6f
--- /dev/null
+++ b/libs/klib/judy-vector.c
@@ -0,0 +1,1793 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/vector.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#define JUST_DEFINE_YOUR_STUFF 1
+#include "Judy.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KVector
+ *  encapsulated vector interface
+ *
+ *  a vector obeys a particular set of messages
+ *  it may be implemented as an array, but not necessarily.
+ *
+ *  the principal property of a vector is that it acts as a map
+ *  between an integer key and a value of some type. in this case,
+ *  we only accept unsigned integers as keys.
+ */
+struct KVector
+{
+    void *nancy;
+    KRefcount refcount;
+    uint32_t fixed_size;
+    bool nancy_bool;
+};
+
+
+/* Make
+ *  create an empty vector
+ */
+LIB_EXPORT rc_t CC KVectorMake ( KVector **vp )
+{
+    rc_t rc;
+
+    if ( vp == NULL )
+        rc = RC ( rcCont, rcVector, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KVector *v = calloc ( 1, sizeof * v );
+        if ( v == NULL )
+            rc = RC ( rcCont, rcVector, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            KRefcountInit ( & v -> refcount, 1, "KVector", "make", "v" );
+            * vp = v;
+            return 0;
+        }
+
+        * vp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* Whack
+ */
+static
+rc_t KVectorWhack ( KVector *self )
+{
+    if ( self -> nancy != NULL )
+    {
+        JError_t err;
+        Word_t whee =
+            ( self -> nancy_bool ? Judy1FreeArray : JudyLFreeArray )
+            ( & self -> nancy, & err );
+        ( void ) whee;
+    }
+
+    free ( self );
+    return 0;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KVectorAddRef ( const KVector *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KVector" ) )
+        {
+        case krefOkay:
+            break;
+        case krefLimit:
+            return RC ( rcCont, rcVector, rcAttaching, rcRange, rcExcessive );
+        default:
+            return RC ( rcCont, rcVector, rcAttaching, rcRefcount, rcDestroyed );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KVectorRelease ( const KVector *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KVector" ) )
+        {
+        case krefOkay:
+            break;
+        case krefWhack:
+        case krefZero:
+            return KVectorWhack ( ( KVector* ) self );
+        default:
+            return RC ( rcCont, rcVector, rcReleasing, rcRefcount, rcDestroyed );
+        }
+    }
+    return 0;
+}
+
+
+/* NancyError
+ *  translate a JError_t to an rc_t
+ */
+static
+rc_t NancyError ( const JError_t *err, enum RCContext ctx )
+{
+    switch ( JU_ERRNO ( err ) )
+    {
+    case JU_ERRNO_NONE:
+        break;
+    case JU_ERRNO_FULL:
+        return RC ( rcCont, rcVector, ctx, rcRange, rcExcessive );
+    case JU_ERRNO_NOMEM:
+        return RC ( rcCont, rcVector, ctx, rcMemory, rcExhausted );
+    case JU_ERRNO_NULLPPARRAY:
+    case JU_ERRNO_NULLPINDEX:
+        return RC ( rcCont, rcVector, ctx, rcParam, rcNull );
+    case JU_ERRNO_NOTJUDY1:
+    case JU_ERRNO_NOTJUDYL:
+    case JU_ERRNO_NOTJUDYSL:
+        return RC ( rcCont, rcVector, ctx, rcType, rcIncorrect );
+    case JU_ERRNO_OVERRUN:
+    case JU_ERRNO_CORRUPT:
+        return RC ( rcCont, rcVector, ctx, rcVector, rcCorrupt );
+    case JU_ERRNO_NONNULLPARRAY:
+    case JU_ERRNO_NULLPVALUE:
+    case JU_ERRNO_UNSORTED:
+        return RC ( rcCont, rcVector, ctx, rcParam, rcInvalid );
+    }
+
+    return 0;
+}
+
+
+/* Get
+ *  get an untyped value
+ *  returns rc_t state of rcNull if index is not set
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for value
+ *
+ *  "bytes" [ OUT ] - return parameter for bytes in value
+ *
+ * NB - if rc_t state is rcInsufficient, "bytes" will contain
+ *  the number of bytes required to access the indexed value
+ */
+static
+rc_t Nancy1Test ( const void *nancy, uint64_t idx, bool *value )
+{
+    JError_t err;
+    int data = Judy1Test ( nancy, ( Word_t ) idx, & err );
+    if ( data == JERR )
+        return NancyError ( & err, rcAccessing );
+    * value = data != 0;
+    return 0;
+}
+
+static
+rc_t NancyLGet ( const void *nancy, uint64_t idx, Word_t *value )
+{
+    JError_t err;
+    PPvoid_t datap = JudyLGet ( nancy, ( Word_t ) idx, & err );
+    if ( datap == NULL )
+        return RC ( rcCont, rcVector, rcAccessing, rcItem, rcNotFound );
+    if ( datap == PPJERR )
+        return NancyError ( & err, rcAccessing );
+
+    * value = * ( const Word_t* ) datap;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KVectorGet ( const KVector *self, uint64_t key,
+    void *buffer, size_t bsize, size_t *bytes )
+{
+    rc_t rc;
+
+    if ( bytes == NULL )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcSelf, rcNull );
+        else if ( buffer == NULL && bsize != 0 )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcParam, rcNull );
+        else if ( sizeof key > sizeof ( Word_t ) && ( key >> 32 ) != 0 )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcRange, rcExcessive );
+        else
+        {
+            if ( self -> nancy_bool )
+            {
+                bool data;
+                rc = Nancy1Test ( self -> nancy, key, & data );
+                if ( rc == 0 )
+                {
+                    * bytes = sizeof data;
+                    if ( bsize < sizeof data )
+                        rc = RC ( rcCont, rcVector, rcAccessing, rcBuffer, rcInsufficient );
+                    else
+                        * ( bool* ) buffer = data;
+                    return rc;
+                }
+            }
+            else
+            {
+                Word_t data;
+                rc = NancyLGet ( self -> nancy, key, & data );
+                if ( rc == 0 )
+                {
+                    if ( self -> fixed_size == 0 )
+                        rc = RC ( rcCont, rcVector, rcAccessing, rcFunction, rcUnsupported );
+                    else
+                    {
+                        * bytes = self -> fixed_size;
+                        if ( bsize < self -> fixed_size )
+                            rc = RC ( rcCont, rcVector, rcAccessing, rcBuffer, rcInsufficient );
+                        else switch ( self -> fixed_size )
+                        {
+                        case 1:
+                            if ( data >= 0x100 )
+                                rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                            * ( uint8_t* ) buffer = ( uint8_t ) data;
+                            break;
+                        case 2:
+                            if ( data >= 0x10000 )
+                                rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                            * ( uint16_t* ) buffer = ( uint16_t ) data;
+                            break;
+                        case 4:
+                            if ( sizeof data > 4 && ( ( uint64_t ) data >> 32 ) != 0 )
+                                rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                            * ( uint32_t* ) buffer = ( uint32_t ) data;
+                            break;
+                        case 8:
+                            * ( uint64_t* ) buffer = ( uint64_t ) data;
+                            break;
+                        default:
+                            rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+                        }
+                        return rc;
+                    }
+                }
+            }
+        }
+
+        * bytes = 0;
+    }
+
+    return rc;
+}
+
+/* Get
+ *  get typed values
+ *  returns rc_t state of rcNull if index is not set
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "data" [ OUT ] - return parameter for value
+ */
+
+#if _ARCH_BITS == 64
+
+//#define bstored_bits_t size_t //uint64_t
+
+#define KVectorBoolGetStoredBits KVectorGetU64
+#define KVectorBoolSetStoredBits KVectorSetU64
+#define KVectorBoolVisitStoredBits KVectorVisitU64
+#define KVectorBoolGetFirstStoredBits KVectorGetFirstU64
+#define KVectorBoolGetPrevStoredBits KVectorGetPrevU64
+#define KVectorBoolGetNextStoredBits KVectorGetNextU64
+
+#elif _ARCH_BITS == 32
+
+//#define bstored_bits_t size_t //uint32_t
+
+#define KVectorBoolGetStoredBits KVectorGetU32
+#define KVectorBoolSetStoredBits KVectorSetU32
+#define KVectorBoolVisitStoredBits KVectorVisitU32
+#define KVectorBoolGetFirstStoredBits KVectorGetFirstU32
+#define KVectorBoolGetPrevStoredBits KVectorGetPrevU32
+#define KVectorBoolGetNextStoredBits KVectorGetNextU32
+
+#endif
+
+
+#define BOOL_VECT_RECORD_SIZE_IN_BITS (size_t)2
+#define BOOL_VECT_BIT_SET_MASK        (size_t)0x2
+#define BOOL_VECT_BIT_VALUE_MASK      (size_t)0x1
+#define BOOL_VECT_BIT_RECORD_MASK     (size_t)(BOOL_VECT_BIT_SET_MASK | BOOL_VECT_BIT_VALUE_MASK)
+
+
+LIB_EXPORT rc_t CC KVectorGetBoolOld ( const KVector *self, uint64_t key, bool *data )
+{
+    size_t bytes;
+    return KVectorGet ( self, key, data, sizeof * data, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetBool ( const KVector *self, uint64_t key, bool *data )
+{
+    rc_t rc = 0;
+    size_t stored_bits;
+    uint64_t key_qword = key / (sizeof(stored_bits) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS);
+    size_t bit_offset_in_qword = (key % (sizeof(stored_bits) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS)) * BOOL_VECT_RECORD_SIZE_IN_BITS;
+
+    size_t record;
+
+    if ( data == NULL )
+        return RC ( rcCont, rcVector, rcAccessing, rcParam, rcNull );
+
+    rc = KVectorBoolGetStoredBits ( self, key_qword, & stored_bits );
+    if ( rc )
+        return rc;
+
+    record = stored_bits >> bit_offset_in_qword;
+    if ( ( record & BOOL_VECT_BIT_SET_MASK ) == 0 )
+    {
+        * data = false;
+        return RC ( rcCont, rcVector, rcAccessing, rcItem, rcNotFound );
+    }
+    * data = (bool) (record & BOOL_VECT_BIT_VALUE_MASK);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KVectorGetI8 ( const KVector *self, uint64_t key, int8_t *data )
+{
+    size_t bytes;
+    return KVectorGet ( self, key, data, sizeof * data, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetI16 ( const KVector *self, uint64_t key, int16_t *data )
+{
+    size_t bytes;
+    return KVectorGet ( self, key, data, sizeof * data, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetI32 ( const KVector *self, uint64_t key, int32_t *data )
+{
+    size_t bytes;
+    return KVectorGet ( self, key, data, sizeof * data, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetI64 ( const KVector *self, uint64_t key, int64_t *data )
+{
+    size_t bytes;
+    return KVectorGet ( self, key, data, sizeof * data, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetU8 ( const KVector *self, uint64_t key, uint8_t *data )
+{
+    size_t bytes;
+    return KVectorGet ( self, key, data, sizeof * data, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetU16 ( const KVector *self, uint64_t key, uint16_t *data )
+{
+    size_t bytes;
+    return KVectorGet ( self, key, data, sizeof * data, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetU32 ( const KVector *self, uint64_t key, uint32_t *data )
+{
+    size_t bytes;
+    return KVectorGet ( self, key, data, sizeof * data, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetU64 ( const KVector *self, uint64_t key, uint64_t *data )
+{
+    size_t bytes;
+    return KVectorGet ( self, key, data, sizeof * data, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetF32 ( const KVector *self, uint64_t key, float *data )
+{
+    size_t bytes;
+    rc_t rc = KVectorGet ( self, key, data, sizeof * data, & bytes );
+    if ( rc == 0 && bytes != sizeof * data )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorGetF64 ( const KVector *self, uint64_t key, double *data )
+{
+    size_t bytes;
+    rc_t rc = KVectorGet ( self, key, data, sizeof * data, & bytes );
+    if ( rc == 0 && bytes != sizeof * data )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorGetPtr ( const KVector *self, uint64_t key, void **data )
+{
+    size_t bytes;
+    rc_t rc = KVectorGet ( self, key, data, sizeof * data, & bytes );
+    if ( rc == 0 && bytes != sizeof * data )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+
+/* GetFirst
+ *  get first non-null element
+ *  returns key of found element in "first"
+ */
+
+static
+rc_t NancyLGetFirst ( const void *nancy, uint64_t * first, Word_t * value )
+{
+    JError_t err;
+    Word_t idx = 0;
+    PPvoid_t datap = JudyLFirst ( nancy, & idx, & err );
+    if ( datap == NULL )
+        return RC ( rcCont, rcVector, rcAccessing, rcItem, rcNotFound );
+    if ( datap == PPJERR )
+        return NancyError ( & err, rcAccessing );
+
+    * first = idx;
+    * value = * ( const Word_t* ) datap;
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirst ( const KVector *self, uint64_t *first,
+    void * buffer, size_t bsize, size_t * bytes )
+{
+    rc_t rc;
+
+    if ( bytes == NULL )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcSelf, rcNull );
+        else if ( buffer == NULL && bsize != 0 )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcParam, rcNull );
+        else if ( self -> nancy_bool )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+        else
+        {
+            Word_t data;
+            rc = NancyLGetFirst ( self -> nancy, first, & data );
+            if ( rc == 0 )
+            {
+                if ( self -> fixed_size == 0 )
+                    rc = RC ( rcCont, rcVector, rcAccessing, rcFunction, rcUnsupported );
+                else
+                {
+                    * bytes = self -> fixed_size;
+                    if ( bsize < self -> fixed_size )
+                        rc = RC ( rcCont, rcVector, rcAccessing, rcBuffer, rcInsufficient );
+                    else switch ( self -> fixed_size )
+                    {
+                    case 1:
+                        if ( data >= 0x100 )
+                            rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                        * ( uint8_t* ) buffer = ( uint8_t ) data;
+                        break;
+                    case 2:
+                        if ( data >= 0x10000 )
+                            rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                        * ( uint16_t* ) buffer = ( uint16_t ) data;
+                        break;
+                    case 4:
+                        if ( sizeof data > 4 && ( ( uint64_t ) data >> 32 ) != 0 )
+                            rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                        * ( uint32_t* ) buffer = ( uint32_t ) data;
+                        break;
+                    case 8:
+                        * ( uint64_t* ) buffer = ( uint64_t ) data;
+                        break;
+                    default:
+                        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+                    }
+                    return rc;
+                }
+            }
+        }
+
+        * bytes = 0;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstBool ( const KVector *self, uint64_t *first, bool *data )
+{
+    rc_t rc;
+    uint64_t i;
+    size_t stored_bits;
+    const uint64_t width = sizeof stored_bits * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS;
+
+    /* THIS IS INCORRECT - have to test "self" first to return correct error code */
+    if ( data == NULL )
+        return RC ( rcCont, rcVector, rcAccessing, rcParam, rcNull );
+
+    rc = KVectorBoolGetFirstStoredBits ( self, first, & stored_bits );
+    while ( rc == 0 && stored_bits == 0 )
+        rc = KVectorBoolGetNextStoredBits ( self, first, * first, & stored_bits );
+    if ( rc != 0 )
+        return rc;
+
+    * first *= width;
+
+    for ( i = 0; i < width; ++ i )
+    {
+        if ( ( stored_bits & ( ( size_t ) BOOL_VECT_BIT_SET_MASK << i * BOOL_VECT_RECORD_SIZE_IN_BITS ) ) != 0 )
+            break;
+    }
+
+    * first += i;
+    * data = ( bool ) ( ( stored_bits >> i * BOOL_VECT_RECORD_SIZE_IN_BITS ) & BOOL_VECT_BIT_VALUE_MASK );
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstI8 ( const KVector *self, uint64_t *first, int8_t *value )
+{
+    size_t bytes;
+    return KVectorGetFirst ( self, first, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstI16 ( const KVector *self, uint64_t *first, int16_t *value )
+{
+    size_t bytes;
+    return KVectorGetFirst ( self, first, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstI32 ( const KVector *self, uint64_t *first, int32_t *value )
+{
+    size_t bytes;
+    return KVectorGetFirst ( self, first, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstI64 ( const KVector *self, uint64_t *first, int64_t *value )
+{
+    size_t bytes;
+    return KVectorGetFirst ( self, first, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstU8 ( const KVector *self, uint64_t *first, uint8_t *value )
+{
+    size_t bytes;
+    return KVectorGetFirst ( self, first, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstU16 ( const KVector *self, uint64_t *first, uint16_t *value )
+{
+    size_t bytes;
+    return KVectorGetFirst ( self, first, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstU32 ( const KVector *self, uint64_t *first, uint32_t *value )
+{
+    size_t bytes;
+    return KVectorGetFirst ( self, first, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstU64 ( const KVector *self, uint64_t *first, uint64_t *value )
+{
+    size_t bytes;
+    return KVectorGetFirst ( self, first, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstF32 ( const KVector *self, uint64_t *first, float *value )
+{
+    size_t bytes;
+    rc_t rc = KVectorGetFirst ( self, first, value, sizeof * value, & bytes );
+    if ( rc == 0 && bytes != sizeof * value )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstF64 ( const KVector *self, uint64_t *first, double *value )
+{
+    size_t bytes;
+    rc_t rc = KVectorGetFirst ( self, first, value, sizeof * value, & bytes );
+    if ( rc == 0 && bytes != sizeof * value )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorGetFirstPtr ( const KVector *self, uint64_t *first, void **value )
+{
+    size_t bytes;
+    rc_t rc = KVectorGetFirst ( self, first, value, sizeof * value, & bytes );
+    if ( rc == 0 && bytes != sizeof * value )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+/* GetPrev
+ *  given a starting key, get first previous non-null element
+ *  returns key of found element in "prev"
+ *
+ *  "prev" [ OUT ] - pointer to vector index of the returned value
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for value
+ *
+ *  "bytes" [ OUT ] - return parameter for bytes in value
+ *
+ * NB - if rc_t state is rcInsufficient, "bytes" will contain
+ *  the number of bytes required to access the indexed value
+*/
+
+static
+rc_t Nancy1TestPrev ( const void *nancy, uint64_t* prev, uint64_t idx, bool *value )
+{
+    JError_t err;
+    int data;
+    *prev = idx;
+    data = Judy1Prev ( nancy, ( Word_t* ) prev, & err );
+    if ( data == JERR )
+        return NancyError ( & err, rcAccessing );
+    * value = data != 0;
+    return 0;
+}
+
+static
+rc_t NancyLGetPrev ( const void *nancy, uint64_t* prev, uint64_t idx, Word_t *value )
+{
+    JError_t err;
+    PPvoid_t datap;
+    *prev = idx;
+    datap = JudyLPrev ( nancy, ( Word_t* ) prev, & err );
+    if ( datap == NULL )
+        return RC ( rcCont, rcVector, rcAccessing, rcItem, rcNotFound );
+    if ( datap == PPJERR )
+        return NancyError ( & err, rcAccessing );
+
+    * value = * ( const Word_t* ) datap;
+    return 0;
+}
+
+KLIB_EXTERN rc_t CC KVectorGetPrev ( const KVector *self, uint64_t *prev,
+    uint64_t key, void *value_buffer, size_t bsize, size_t *bytes )
+{
+    rc_t rc;
+
+    if ( bytes == NULL )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcSelf, rcNull );
+        else if ( ( value_buffer == NULL && bsize != 0 ) || prev == NULL )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcParam, rcNull );
+        else if ( sizeof key > sizeof ( Word_t ) && ( key >> 32 ) != 0 )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcRange, rcExcessive );
+        else
+        {
+            if ( self -> nancy_bool )
+            {
+                bool data;
+                rc = Nancy1TestPrev ( self -> nancy, prev, key, & data );
+                if ( rc == 0 )
+                {
+                    * bytes = sizeof data;
+                    if ( bsize < sizeof data )
+                        rc = RC ( rcCont, rcVector, rcAccessing, rcBuffer, rcInsufficient );
+                    else
+                        * ( bool* ) value_buffer = data;
+                    return rc;
+                }
+            }
+            else
+            {
+                Word_t data;
+                rc = NancyLGetPrev ( self -> nancy, prev, key, & data );
+                if ( rc == 0 )
+                {
+                    if ( self -> fixed_size == 0 )
+                        rc = RC ( rcCont, rcVector, rcAccessing, rcFunction, rcUnsupported );
+                    else
+                    {
+                        * bytes = self -> fixed_size;
+                        if ( bsize < self -> fixed_size )
+                            rc = RC ( rcCont, rcVector, rcAccessing, rcBuffer, rcInsufficient );
+                        else switch ( self -> fixed_size )
+                        {
+                        case 1:
+                            if ( data >= 0x100 )
+                                rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                            * ( uint8_t* ) value_buffer = ( uint8_t ) data;
+                            break;
+                        case 2:
+                            if ( data >= 0x10000 )
+                                rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                            * ( uint16_t* ) value_buffer = ( uint16_t ) data;
+                            break;
+                        case 4:
+                            if ( sizeof data > 4 && ( ( uint64_t ) data >> 32 ) != 0 )
+                                rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                            * ( uint32_t* ) value_buffer = ( uint32_t ) data;
+                            break;
+                        case 8:
+                            * ( uint64_t* ) value_buffer = ( uint64_t ) data;
+                            break;
+                        default:
+                            rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+                        }
+                        return rc;
+                    }
+                }
+            }
+        }
+
+        * bytes = 0;
+    }
+
+    return rc;
+}
+
+/* GetPrev
+ *  get prev typed values
+ *  returns rc_t state of rcNull if index is not set
+ *
+ *  "prev" [ OUT ] - pointer to vector index of the returned value
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "data" [ OUT ] - return parameter for value
+ */
+
+LIB_EXPORT rc_t CC KVectorGetPrevBoolOld ( const KVector *self,
+    uint64_t *prev, uint64_t key, bool *value )
+{
+    size_t bytes;
+    return KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevBool ( const KVector *self,
+    uint64_t *prev, uint64_t key, bool *value )
+{
+    rc_t rc = 0;
+    size_t stored_bits = 0;
+    uint64_t key_qword = key / (sizeof(stored_bits) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS);
+    size_t bit_offset_in_qword = (key % (sizeof(stored_bits) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS)) * BOOL_VECT_RECORD_SIZE_IN_BITS;
+
+    if ( bit_offset_in_qword )
+    {
+        rc = KVectorBoolGetStoredBits ( self, key_qword, & stored_bits );
+        if ( rc && rc != RC ( rcCont, rcVector, rcAccessing, rcItem, rcNotFound ))
+            return rc;
+    }
+
+    for (;;)
+    {
+        size_t record;
+
+        for (; bit_offset_in_qword; )
+        {
+            bit_offset_in_qword -= BOOL_VECT_RECORD_SIZE_IN_BITS;
+
+            record = stored_bits >> bit_offset_in_qword & BOOL_VECT_BIT_RECORD_MASK;
+            if ( record & BOOL_VECT_BIT_SET_MASK )
+            {
+                *value = (bool) (record & BOOL_VECT_BIT_VALUE_MASK);
+                *prev = key_qword * (sizeof(stored_bits) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS) |
+                        (uint64_t)(bit_offset_in_qword / BOOL_VECT_RECORD_SIZE_IN_BITS);
+                goto EXIT;
+            }
+        }
+
+        rc = KVectorBoolGetPrevStoredBits ( self, & key_qword, key_qword, & stored_bits );
+        if (rc)
+            break;
+        bit_offset_in_qword = sizeof(stored_bits) * 8;
+    }
+
+    EXIT:
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevI8 ( const KVector *self,
+    uint64_t *prev, uint64_t key, int8_t *value )
+{
+    size_t bytes;
+    return KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevI16 ( const KVector *self,
+    uint64_t *prev, uint64_t key, int16_t *value )
+{
+    size_t bytes;
+    return KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevI32 ( const KVector *self,
+    uint64_t *prev, uint64_t key, int32_t *value )
+{
+    size_t bytes;
+    return KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevI64 ( const KVector *self,
+    uint64_t *prev, uint64_t key, int64_t *value )
+{
+    size_t bytes;
+    return KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevU8 ( const KVector *self,
+    uint64_t *prev, uint64_t key, uint8_t *value )
+{
+    size_t bytes;
+    return KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevU16 ( const KVector *self,
+    uint64_t *prev, uint64_t key, uint16_t *value )
+{
+    size_t bytes;
+    return KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevU32 ( const KVector *self,
+    uint64_t *prev, uint64_t key, uint32_t *value )
+{
+    size_t bytes;
+    return KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevU64 ( const KVector *self,
+    uint64_t *prev, uint64_t key, uint64_t *value )
+{
+    size_t bytes;
+    return KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevF32 ( const KVector *self,
+    uint64_t *prev, uint64_t key, float *value )
+{
+    size_t bytes;
+    rc_t rc = KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+    if ( rc == 0 && bytes != sizeof * value )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevF64 ( const KVector *self,
+    uint64_t *prev, uint64_t key, double *value )
+{
+    size_t bytes;
+    rc_t rc = KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+    if ( rc == 0 && bytes != sizeof * value )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorGetPrevPtr ( const KVector *self,
+    uint64_t *prev, uint64_t key, void **value )
+{
+    size_t bytes;
+    rc_t rc = KVectorGetPrev ( self, prev, key, value, sizeof * value, & bytes );
+    if ( rc == 0 && bytes != sizeof * value )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+/* GetNext
+ *  given a starting key, get first following non-null element
+ *  returns key of found element in "next"
+ *
+ *  "next" [ OUT ] - pointer to vector index of the returned value
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for value
+ *
+ *  "bytes" [ OUT ] - return parameter for bytes in value
+ *
+ * NB - if rc_t state is rcInsufficient, "bytes" will contain
+ *  the number of bytes required to access the indexed value
+*/
+
+static
+rc_t Nancy1TestNext ( const void *nancy, uint64_t* next, uint64_t idx, bool *value )
+{
+    JError_t err;
+    int data;
+    *next = idx;
+    data = Judy1Next ( nancy, ( Word_t* ) next, & err );
+    if ( data == JERR )
+        return NancyError ( & err, rcAccessing );
+    * value = data != 0;
+    return 0;
+}
+
+static
+rc_t NancyLGetNext ( const void *nancy, uint64_t* next, uint64_t idx, Word_t *value )
+{
+    JError_t err;
+    PPvoid_t datap;
+    *next = idx;
+    datap = JudyLNext ( nancy, ( Word_t* ) next, & err );
+    if ( datap == NULL )
+        return RC ( rcCont, rcVector, rcAccessing, rcItem, rcNotFound );
+    if ( datap == PPJERR )
+        return NancyError ( & err, rcAccessing );
+
+    * value = * ( const Word_t* ) datap;
+    return 0;
+}
+
+KLIB_EXTERN rc_t CC KVectorGetNext ( const KVector *self, uint64_t *next,
+    uint64_t key, void *value_buffer, size_t bsize, size_t *bytes )
+{
+    rc_t rc;
+
+    if ( bytes == NULL )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcSelf, rcNull );
+        else if ( ( value_buffer == NULL && bsize != 0 ) || next == NULL )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcParam, rcNull );
+        else if ( sizeof key > sizeof ( Word_t ) && ( key >> 32 ) != 0 )
+            rc = RC ( rcCont, rcVector, rcAccessing, rcRange, rcExcessive );
+        else
+        {
+            if ( self -> nancy_bool )
+            {
+                bool data;
+                rc = Nancy1TestNext ( self -> nancy, next, key, & data );
+                if ( rc == 0 )
+                {
+                    * bytes = sizeof data;
+                    if ( bsize < sizeof data )
+                        rc = RC ( rcCont, rcVector, rcAccessing, rcBuffer, rcInsufficient );
+                    else
+                        * ( bool* ) value_buffer = data;
+                    return rc;
+                }
+            }
+            else
+            {
+                Word_t data;
+                rc = NancyLGetNext ( self -> nancy, next, key, & data );
+                if ( rc == 0 )
+                {
+                    if ( self -> fixed_size == 0 )
+                        rc = RC ( rcCont, rcVector, rcAccessing, rcFunction, rcUnsupported );
+                    else
+                    {
+                        * bytes = self -> fixed_size;
+                        if ( bsize < self -> fixed_size )
+                            rc = RC ( rcCont, rcVector, rcAccessing, rcBuffer, rcInsufficient );
+                        else switch ( self -> fixed_size )
+                        {
+                        case 1:
+                            if ( data >= 0x100 )
+                                rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                            * ( uint8_t* ) value_buffer = ( uint8_t ) data;
+                            break;
+                        case 2:
+                            if ( data >= 0x10000 )
+                                rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                            * ( uint16_t* ) value_buffer = ( uint16_t ) data;
+                            break;
+                        case 4:
+                            if ( sizeof data > 4 && ( ( uint64_t ) data >> 32 ) != 0 )
+                                rc = RC ( rcCont, rcVector, rcAccessing, rcData, rcCorrupt );
+                            * ( uint32_t* ) value_buffer = ( uint32_t ) data;
+                            break;
+                        case 8:
+                            * ( uint64_t* ) value_buffer = ( uint64_t ) data;
+                            break;
+                        default:
+                            rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+                        }
+                        return rc;
+                    }
+                }
+            }
+        }
+
+        * bytes = 0;
+    }
+
+    return rc;
+}
+
+/* GetNext
+ *  get next typed values
+ *  returns rc_t state of rcNull if index is not set
+ *
+ *  "next" [ OUT ] - pointer to vector index of the returned value
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "data" [ OUT ] - return parameter for value
+ */
+
+LIB_EXPORT rc_t CC KVectorGetNextBoolOld ( const KVector *self,
+    uint64_t *next, uint64_t key, bool *value )
+{
+    size_t bytes;
+    return KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextBool ( const KVector *self,
+    uint64_t *next, uint64_t key, bool *value )
+{
+    rc_t rc = 0;
+    size_t stored_bits = 0;
+    uint64_t key_qword = key / (sizeof(stored_bits) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS);
+    size_t bit_offset_in_qword = (key % (sizeof(stored_bits) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS)) * BOOL_VECT_RECORD_SIZE_IN_BITS;
+
+    size_t const MAX_BIT_OFFSET = sizeof(stored_bits) * 8 - BOOL_VECT_RECORD_SIZE_IN_BITS;
+
+    /* unless the "previous" value is the last entry in a word,
+       try to get the word and look for its next value */
+    if ( bit_offset_in_qword != MAX_BIT_OFFSET )
+    {
+        /* if the initial value does not exist, this may fail */
+        rc = KVectorBoolGetStoredBits ( self, key_qword, & stored_bits );
+        if ( rc != 0 )
+        {
+            /* any failure other than "not found" is considered hard */
+            if ( GetRCState ( rc ) != rcNotFound )
+                return rc;
+
+            /* the "key" passed in may be fake. */
+            rc = KVectorBoolGetNextStoredBits ( self, & key_qword, key_qword, & stored_bits );
+        }
+    }
+
+    for (;;)
+    {
+        size_t record;
+
+        for (; bit_offset_in_qword != MAX_BIT_OFFSET; )
+        {
+            bit_offset_in_qword += BOOL_VECT_RECORD_SIZE_IN_BITS;
+
+            record = stored_bits >> bit_offset_in_qword & BOOL_VECT_BIT_RECORD_MASK;
+            if ( record & BOOL_VECT_BIT_SET_MASK )
+            {
+                *value = (bool) (record & BOOL_VECT_BIT_VALUE_MASK);
+                *next = key_qword * (sizeof(stored_bits) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS) |
+                        (uint64_t)(bit_offset_in_qword / BOOL_VECT_RECORD_SIZE_IN_BITS);
+                goto EXIT;
+            }
+        }
+
+        rc = KVectorBoolGetNextStoredBits ( self, & key_qword, key_qword, & stored_bits );
+        if (rc)
+            break;
+        bit_offset_in_qword = 0 - BOOL_VECT_RECORD_SIZE_IN_BITS;
+    }
+
+    EXIT:
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextI8 ( const KVector *self,
+    uint64_t *next, uint64_t key, int8_t *value )
+{
+    size_t bytes;
+    return KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextI16 ( const KVector *self,
+    uint64_t *next, uint64_t key, int16_t *value )
+{
+    size_t bytes;
+    return KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextI32 ( const KVector *self,
+    uint64_t *next, uint64_t key, int32_t *value )
+{
+    size_t bytes;
+    return KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextI64 ( const KVector *self,
+    uint64_t *next, uint64_t key, int64_t *value )
+{
+    size_t bytes;
+    return KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextU8 ( const KVector *self,
+    uint64_t *next, uint64_t key, uint8_t *value )
+{
+    size_t bytes;
+    return KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextU16 ( const KVector *self,
+    uint64_t *next, uint64_t key, uint16_t *value )
+{
+    size_t bytes;
+    return KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextU32 ( const KVector *self,
+    uint64_t *next, uint64_t key, uint32_t *value )
+{
+    size_t bytes;
+    return KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextU64 ( const KVector *self,
+    uint64_t *next, uint64_t key, uint64_t *value )
+{
+    size_t bytes;
+    return KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextF32 ( const KVector *self,
+    uint64_t *next, uint64_t key, float *value )
+{
+    size_t bytes;
+    rc_t rc = KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+    if ( rc == 0 && bytes != sizeof * value )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextF64 ( const KVector *self,
+    uint64_t *next, uint64_t key, double *value )
+{
+    size_t bytes;
+    rc_t rc = KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+    if ( rc == 0 && bytes != sizeof * value )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorGetNextPtr ( const KVector *self,
+    uint64_t *next, uint64_t key, void **value )
+{
+    size_t bytes;
+    rc_t rc = KVectorGetNext ( self, next, key, value, sizeof * value, & bytes );
+    if ( rc == 0 && bytes != sizeof * value )
+        rc = RC ( rcCont, rcVector, rcAccessing, rcType, rcUnsupported );
+    return rc;
+}
+
+/* Set
+ *  set an untyped value
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "data" [ IN ] and "bytes" [ IN ] - value buffer
+ */
+static
+rc_t Nancy1Set ( void **nancy, uint64_t idx, bool value )
+{
+    JError_t err;
+    int status = ( value ? Judy1Set : Judy1Unset ) ( nancy, ( Word_t ) idx, & err );
+    if ( status == JERR )
+        return NancyError ( & err, rcWriting );
+    return 0;
+}
+
+static
+rc_t NancyLSet ( void **nancy, uint64_t idx, Word_t value )
+{
+    JError_t err;
+    PPvoid_t datap = JudyLIns ( nancy, ( Word_t ) idx, & err );
+    if ( datap == NULL )
+        return RC ( rcCont, rcVector, rcWriting, rcMemory, rcExhausted );
+    if ( datap == PPJERR )
+        return NancyError ( & err, rcWriting );
+    * ( Word_t* ) datap = value;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KVectorSet ( KVector *self, uint64_t key,
+    const void *data, size_t bytes )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcCont, rcVector, rcWriting, rcSelf, rcNull );
+    else if ( data == NULL )
+        rc = RC ( rcCont, rcVector, rcWriting, rcParam, rcNull );
+    else if ( bytes == 0 )
+        rc = RC ( rcCont, rcVector, rcWriting, rcParam, rcEmpty );
+    else
+    {
+        Word_t value;
+
+        /* detect first set */
+        if ( self -> nancy == NULL )
+        {
+            switch ( bytes )
+            {
+            case 1:
+            case 2:
+            case 4:
+                break;
+            case 8:
+                if ( sizeof value < 8 )
+                    return RC ( rcCont, rcVector, rcWriting, rcParam, rcExcessive );
+            }
+
+            self -> fixed_size = ( uint32_t ) bytes;
+        }
+        else if ( bytes != ( size_t ) self -> fixed_size )
+        {
+            return RC ( rcCont, rcVector, rcWriting, rcParam, rcInconsistent );
+        }
+        else if ( self -> nancy_bool )
+        {
+            /* clang gets upset about switching on boolean
+               the intent is to catch implementations that
+               may treat anything non-zero as true. */
+            switch ( ( uint32_t ) * ( const bool* ) data )
+            {
+            case 0:
+            case 1:
+                break;
+            default:
+                return RC ( rcCont, rcVector, rcWriting, rcParam, rcInvalid );
+            }
+            return Nancy1Set ( & self -> nancy, key, * ( const bool* ) data );
+        }
+
+        switch ( bytes )
+        {
+        case 1:
+            value = * ( const uint8_t* ) data;
+            break;
+        case 2:
+            value = * ( const uint16_t* ) data;
+            break;
+        case 4:
+            value = * ( const uint32_t* ) data;
+            break;
+        case 8:
+            value = ( Word_t ) * ( const uint64_t* ) data;
+            break;
+        }
+
+        rc = NancyLSet ( & self -> nancy, key, value );
+    }
+
+    return rc;
+}
+
+/* Set
+ *  set typed values
+ *
+ *  "key" [ IN ] - vector index
+ *
+ *  "data" [ IN ] - value
+ */
+LIB_EXPORT rc_t CC KVectorSetBoolOld ( KVector *self, uint64_t key, bool data )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcCont, rcVector, rcWriting, rcSelf, rcNull );
+    else
+    {
+        /* detect first set */
+        if ( self -> nancy == NULL )
+        {
+            self -> fixed_size = sizeof data;
+            self -> nancy_bool = true;
+        }
+        else if ( ! self -> nancy_bool )
+        {
+            return RC ( rcCont, rcVector, rcWriting, rcParam, rcInvalid );
+        }
+
+        rc = Nancy1Set ( & self -> nancy, key, data );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorSetBool ( KVector *self, uint64_t key, bool data )
+{
+    rc_t rc;
+
+    size_t stored_bits = 0;
+    uint64_t key_qword = key / (sizeof(stored_bits) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS);
+    size_t bit_offset_in_qword = (key % (sizeof(stored_bits) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS)) * BOOL_VECT_RECORD_SIZE_IN_BITS;
+    size_t new_bit_record;
+    size_t stored_bit_record;
+
+    data = !!data; /* forcing bool to be E {0, 1} */
+
+    rc = KVectorBoolGetStoredBits ( self, key_qword, &stored_bits );
+    if ( rc != 0 )
+    {
+        if ( GetRCState ( rc ) != rcNotFound )
+            return rc;
+
+        assert ( stored_bits == 0 );
+        rc = 0;
+    }
+
+    new_bit_record = (BOOL_VECT_BIT_SET_MASK | (uint64_t)data) << bit_offset_in_qword;
+    stored_bit_record = BOOL_VECT_BIT_RECORD_MASK << bit_offset_in_qword & stored_bits;
+
+    assert ( new_bit_record != 0 );
+    assert ( rc == 0 );
+
+    if ( new_bit_record != stored_bit_record )
+    {
+        stored_bits &= ~(BOOL_VECT_BIT_RECORD_MASK << bit_offset_in_qword); // clear stored record to assign a new value by bitwise OR
+        stored_bits |= new_bit_record;
+
+        rc = KVectorBoolSetStoredBits ( self, key_qword, stored_bits );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorSetI8 ( KVector *self, uint64_t key, int8_t value )
+{
+    return KVectorSet ( self, key, & value, sizeof value );
+}
+
+LIB_EXPORT rc_t CC KVectorSetI16 ( KVector *self, uint64_t key, int16_t value )
+{
+    return KVectorSet ( self, key, & value, sizeof value );
+}
+
+LIB_EXPORT rc_t CC KVectorSetI32 ( KVector *self, uint64_t key, int32_t value )
+{
+    return KVectorSet ( self, key, & value, sizeof value );
+}
+
+LIB_EXPORT rc_t CC KVectorSetI64 ( KVector *self, uint64_t key, int64_t value )
+{
+    return KVectorSet ( self, key, & value, sizeof value );
+}
+
+LIB_EXPORT rc_t CC KVectorSetU8 ( KVector *self, uint64_t key, uint8_t value )
+{
+    return KVectorSet ( self, key, & value, sizeof value );
+}
+
+LIB_EXPORT rc_t CC KVectorSetU16 ( KVector *self, uint64_t key, uint16_t value )
+{
+    return KVectorSet ( self, key, & value, sizeof value );
+}
+
+LIB_EXPORT rc_t CC KVectorSetU32 ( KVector *self, uint64_t key, uint32_t value )
+{
+    return KVectorSet ( self, key, & value, sizeof value );
+}
+
+LIB_EXPORT rc_t CC KVectorSetU64 ( KVector *self, uint64_t key, uint64_t value )
+{
+    return KVectorSet ( self, key, & value, sizeof value );
+}
+
+LIB_EXPORT rc_t CC KVectorSetF32 ( KVector *self, uint64_t key, float value )
+{
+    return KVectorSet ( self, key, & value, sizeof value );
+}
+
+LIB_EXPORT rc_t CC KVectorSetF64 ( KVector *self, uint64_t key, double value )
+{
+    return KVectorSet ( self, key, & value, sizeof value );
+}
+
+LIB_EXPORT rc_t CC KVectorSetPtr ( KVector *self, uint64_t key, const void *value )
+{
+    return KVectorSet ( self, key, & value, sizeof value );
+}
+
+
+/* Unset
+ *  unset an entry
+ *  returns rc_t state rcNull if index is not set
+ *
+ *  "key" [ IN ] - vector index
+ */
+LIB_EXPORT rc_t CC KVectorUnset ( KVector *self, uint64_t key )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcCont, rcVector, rcRemoving, rcSelf, rcNull );
+    else
+    {
+        int status;
+        JError_t err;
+
+        if ( self -> nancy_bool )
+            return Nancy1Set ( & self -> nancy, key, false );
+
+        status = JudyLDel ( & self -> nancy, ( Word_t ) key, & err );
+        if ( status == JERR )
+            return NancyError ( & err, rcRemoving );
+
+        rc = 0;
+    }
+
+    return rc;
+}
+
+
+/* Visit
+ *  executes a function on each key/value pair
+ *  returns early if "f" returns non-zero rc_t
+ *
+ *  "reverse" [ IN ] - if true, execute in reverse order
+ *
+ *  "f" [ IN ] and "user_data" [ IN, OPAQUE ] - function to be
+ *  executed on each vector element or until the function
+ *  returns true.
+ */
+LIB_EXPORT rc_t CC KVectorVisit ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, const void *value, size_t bytes, void *user_data ),
+    void *user_data )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcCont, rcVector, rcVisiting, rcSelf, rcNull );
+    else if ( f == NULL )
+        rc = RC ( rcCont, rcVector, rcVisiting, rcFunction, rcNull );
+    else
+    {
+        rc = 0;
+
+        if ( self -> nancy != NULL )
+        {
+            JError_t err;
+            Word_t first, last, idx;
+
+	    /** Judy1First searches for first value higher then first**/ 
+            first = 0;
+	    /** Judy1Last searches for first value lower then last **/
+            last = (Word_t)-1;
+
+            if ( self -> nancy_bool )
+            {
+                bool value = true;
+                int status = Judy1First ( self -> nancy, & first, & err );
+                if ( status != JERR )
+                    status = Judy1Last ( self -> nancy, & last, & err );
+                if ( status == JERR )
+                    rc = NancyError ( & err, rcVisiting );
+                else if ( reverse )
+                {
+                    for ( idx = last; ; )
+                    {
+                        rc = ( * f ) ( idx, & value, sizeof value, user_data );
+                        if ( rc != 0 )
+                            break;
+                        if ( idx == first )
+                            break;
+                        status = Judy1Prev ( self -> nancy, & idx, & err );
+                        if ( status == JERR )
+                        {
+                            rc = NancyError ( & err, rcVisiting );
+                            break;
+                        }
+                    }
+                }
+                else
+                {
+                    for ( idx = first; ; )
+                    {
+                        rc = ( * f ) ( idx, & value, sizeof value, user_data );
+                        if ( rc != 0 )
+                            break;
+                        if ( idx == last )
+                            break;
+                        status = Judy1Next ( self -> nancy, & idx, & err );
+                        if ( status == JERR )
+                        {
+                            rc = NancyError ( & err, rcVisiting );
+                            break;
+                        }
+                    }
+                }
+            }
+            else
+            {
+                Word_t value;
+                PPvoid_t lastp, datap = JudyLFirst ( self -> nancy, & first, & err );
+                if ( datap != PPJERR )
+                    lastp = JudyLLast ( self -> nancy, & last, & err );
+                if ( datap == PPJERR || lastp == PPJERR )
+                    rc = NancyError ( & err, rcVisiting );
+                else if ( reverse )
+                {
+                    for ( rc = 0, idx = last, datap = lastp; ; )
+                    {
+                        if ( datap == NULL )
+                            break;
+                        value = * ( const Word_t* ) datap;
+                        rc = ( * f ) ( idx, & value, sizeof value, user_data );
+                        if ( rc != 0 )
+                            break;
+                        if ( idx == first )
+                            break;
+                        datap = JudyLPrev ( self -> nancy, & idx, & err );
+                        if ( datap == PPJERR )
+                        {
+                            rc = NancyError ( & err, rcVisiting );
+                            break;
+                        }
+                    }
+                }
+                else
+                {
+                    for ( rc = 0, idx = first; ; )
+                    {
+                        if ( datap == NULL )
+                            break;
+                        value = * ( const Word_t* ) datap;
+                        rc = ( * f ) ( idx, & value, sizeof value, user_data );
+                        if ( rc != 0 )
+                            break;
+                        if ( idx == last )
+                            break;
+                        datap = JudyLNext ( self -> nancy, & idx, & err );
+                        if ( datap == PPJERR )
+                        {
+                            rc = NancyError ( & err, rcVisiting );
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* Visit
+ *  visit typed values
+ *  returns early if "f" returns non-zero rc_t
+ *
+ *  "reverse" [ IN ] - if true, execute in reverse order
+ *
+ *  "f" [ IN ] and "user_data" [ IN, OPAQUE ] - function to be
+ *  executed on each vector element or until the function
+ *  returns true.
+ */
+typedef struct KVectorVisitTypedData KVectorVisitTypedData;
+struct KVectorVisitTypedData
+{
+    union
+    {
+        rc_t ( CC * b ) ( uint64_t key, bool value, void *user_data );
+        rc_t ( CC * i ) ( uint64_t key, int64_t value, void *user_data );
+        rc_t ( CC * u ) ( uint64_t key, uint64_t value, void *user_data );
+        rc_t ( CC * f ) ( uint64_t key, double value, void *user_data );
+        rc_t ( CC * p ) ( uint64_t key, const void *value, void *user_data );
+        rc_t ( CC * u32 ) ( uint64_t key, uint32_t value, void *user_data );
+    } f;
+    void *user_data;
+};
+
+static
+rc_t CC KVectorVisitBoolFunc ( uint64_t key, const void *ptr, size_t bytes, void *user_data )
+{
+    rc_t rc;
+    bool value;
+    if ( bytes != sizeof value )
+        rc = RC ( rcCont, rcVector, rcVisiting, rcType, rcInvalid );
+    else if ( * ( const uint8_t* ) ptr > 1 )
+        rc = RC ( rcCont, rcVector, rcVisiting, rcData, rcInvalid );
+    else
+    {
+        KVectorVisitTypedData *pb = user_data;
+        rc = ( * pb -> f . b ) ( key,  * ( const bool* ) ptr, pb -> user_data );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KVectorVisitBoolOld ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, bool value, void *user_data ),
+    void *user_data )
+{
+    KVectorVisitTypedData pb;
+    pb . f . b = f;
+    pb . user_data = user_data;
+
+    return KVectorVisit ( self, reverse, KVectorVisitBoolFunc, & pb );
+}
+
+typedef struct UserDataStoredBitstoBool UserDataStoredBitstoBool;
+struct UserDataStoredBitstoBool
+{
+    rc_t ( * f ) ( uint64_t key, bool value, void *user_data );
+    void* user_data;
+};
+
+static rc_t VisitStoredBitstoBoolAdapter ( uint64_t key, size_t value, void *user_data )
+{
+    rc_t ( * bool_callback ) ( uint64_t key, bool value, void *user_data );
+
+    rc_t rc = 0;
+    size_t i;
+    void* original_user_data = ((struct UserDataStoredBitstoBool*) user_data) -> user_data;
+    bool_callback = ((UserDataStoredBitstoBool*) user_data) -> f;
+
+    for ( i = 0; i < sizeof (value) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS; ++i )
+    {
+        uint64_t key_bool = key * sizeof(value) * 8 / BOOL_VECT_RECORD_SIZE_IN_BITS + i;
+        size_t record = value >> i * BOOL_VECT_RECORD_SIZE_IN_BITS & BOOL_VECT_BIT_RECORD_MASK;
+        if ( record & BOOL_VECT_BIT_SET_MASK )
+        {
+            rc = bool_callback ( key_bool, (bool) (record & BOOL_VECT_BIT_VALUE_MASK), original_user_data );
+            if ( rc )
+                return rc;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KVectorVisitBool ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, bool value, void *user_data ),
+    void *user_data )
+{
+    UserDataStoredBitstoBool user_data_adapter = { f, user_data };
+    return KVectorBoolVisitStoredBits ( self, reverse, VisitStoredBitstoBoolAdapter, &user_data_adapter );
+}
+
+static
+rc_t CC KVectorVisitI64Func ( uint64_t key, const void *ptr, size_t bytes, void *user_data )
+{
+    int64_t value;
+    KVectorVisitTypedData *pb = user_data;
+
+    switch ( bytes )
+    {
+    case 1:
+        value = ( int8_t ) * ( const Word_t* ) ptr;
+        break;
+    case 2:
+        value = ( int16_t ) * ( const Word_t* ) ptr;
+        break;
+    case 4:
+        value = ( int32_t ) * ( const Word_t* ) ptr;
+        break;
+    default:
+        value = ( int64_t ) * ( const Word_t* ) ptr;
+    }
+
+    return ( * pb -> f . i ) ( key, value, pb -> user_data );
+}
+
+LIB_EXPORT rc_t CC KVectorVisitI64 ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, int64_t value, void *user_data ),
+    void *user_data )
+{
+    KVectorVisitTypedData pb;
+    pb . f . i = f;
+    pb . user_data = user_data;
+
+    return KVectorVisit ( self, reverse, KVectorVisitI64Func, & pb );
+}
+
+static
+rc_t CC KVectorVisitU64Func ( uint64_t key, const void *ptr, size_t bytes, void *user_data )
+{
+    KVectorVisitTypedData *pb = user_data;
+    return ( * pb -> f . u ) ( key, * ( const Word_t* ) ptr, pb -> user_data );
+}
+
+LIB_EXPORT rc_t CC KVectorVisitU64 ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, uint64_t value, void *user_data ),
+    void *user_data )
+{
+    KVectorVisitTypedData pb;
+    pb . f . u = f;
+    pb . user_data = user_data;
+
+    return KVectorVisit ( self, reverse, KVectorVisitU64Func, & pb );
+}
+
+rc_t CC KVectorVisitU32Func ( uint64_t key, const void *ptr, size_t bytes, void *user_data )
+{
+    KVectorVisitTypedData *pb = user_data;
+    return ( * pb -> f . u32 ) ( key, * ( const Word_t* ) ptr, pb -> user_data );
+}
+
+LIB_EXPORT rc_t CC KVectorVisitU32 ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, uint32_t value, void *user_data ),
+    void *user_data )
+{
+    KVectorVisitTypedData pb;
+    pb . f . u32 = f;
+    pb . user_data = user_data;
+
+    return KVectorVisit ( self, reverse, KVectorVisitU32Func, & pb );
+}
+
+static
+rc_t CC KVectorVisitF64Func ( uint64_t key, const void *ptr, size_t bytes, void *user_data )
+{
+    uint32_t u32;
+    double value;
+    KVectorVisitTypedData *pb = user_data;
+
+    switch ( bytes )
+    {
+    case 4:
+        u32 = ( uint32_t ) * ( const Word_t* ) ptr;
+        value = * ( const float* ) & u32;
+        break;
+    default:
+        value = * ( const double* ) ptr;
+    }
+
+    return ( * pb -> f . f ) ( key, value, pb -> user_data );
+}
+
+LIB_EXPORT rc_t CC KVectorVisitF64 ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, double value, void *user_data ),
+    void *user_data )
+{
+    KVectorVisitTypedData pb;
+    pb . f . f = f;
+    pb . user_data = user_data;
+
+    return KVectorVisit ( self, reverse, KVectorVisitF64Func, & pb );
+}
+
+static
+rc_t CC KVectorVisitPtrFunc ( uint64_t key, const void *ptr, size_t bytes, void *user_data )
+{
+    KVectorVisitTypedData *pb = user_data;
+    return ( * pb -> f . p ) ( key, * ( const void** ) ptr, pb -> user_data );
+}
+
+LIB_EXPORT rc_t CC KVectorVisitPtr ( const KVector *self, bool reverse,
+    rc_t ( CC * f ) ( uint64_t key, const void *value, void *user_data ),
+    void *user_data )
+{
+    KVectorVisitTypedData pb;
+    pb . f . p = f;
+    pb . user_data = user_data;
+
+    return KVectorVisit ( self, reverse, KVectorVisitPtrFunc, & pb );
+}
diff --git a/src/test/java/htsjdk/samtools/fastq/.gitignore b/libs/klib/judy/.gitignore
similarity index 100%
rename from src/test/java/htsjdk/samtools/fastq/.gitignore
rename to libs/klib/judy/.gitignore
diff --git a/libs/klib/judy/Judy1.h b/libs/klib/judy/Judy1.h
new file mode 100644
index 0000000..5eeb6fd
--- /dev/null
+++ b/libs/klib/judy/Judy1.h
@@ -0,0 +1,549 @@
+#ifndef _JUDY1_INCLUDED
+#define _JUDY1_INCLUDED
+// _________________
+//
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// ****************************************************************************
+//          JUDY1 -- SMALL/LARGE AND/OR CLUSTERED/SPARSE BIT ARRAYS
+//
+//                                    -by-
+//
+//                             Douglas L. Baskins
+//                             doug at sourcejudy.com
+//
+// Judy arrays are designed to be used instead of arrays.  The performance
+// suggests the reason why Judy arrays are thought of as arrays, instead of
+// trees.  They are remarkably memory efficient at all populations.
+// Implemented as a hybrid digital tree (but really a state machine, see
+// below), Judy arrays feature fast insert/retrievals, fast near neighbor
+// searching, and contain a population tree for extremely fast ordinal related
+// retrievals.
+//
+// CONVENTIONS:
+//
+// - The comments here refer to 32-bit [64-bit] systems.
+//
+// - BranchL, LeafL refer to linear branches and leaves (small populations),
+//   except LeafL does not actually appear as such; rather, Leaf1..3 [Leaf1..7]
+//   is used to represent leaf Index sizes, and LeafW refers to a Leaf with
+//   full (long) word Indexes, which is also a type of linear leaf.  Note that
+//   root-level LeafW (Leaf4 [Leaf8]) leaves are also called LEAFW.
+//
+// - BranchB, LeafB1 refer to bitmap branches and leaves (intermediate
+//   populations).
+//
+// - BranchU refers to uncompressed branches.  An uncompressed branch has 256
+//   JPs, some of which could be null.  Note:  All leaves are compressed (and
+//   sorted), or else an expanse is full (FullPopu), so there is no LeafU
+//   equivalent to BranchU.
+//
+// - "Popu" is short for "Population".
+// - "Pop1" refers to actual population (base 1).
+// - "Pop0" refers to Pop1 - 1 (base 0), the way populations are stored in data
+//   structures.
+//
+// - Branches and Leaves are both named by the number of bytes in their Pop0
+//   field.  In the case of Leaves, the same number applies to the Index sizes.
+//
+// - The representation of many numbers as hex is a relatively safe and
+//   portable way to get desired bitpatterns as unsigned longs.
+//
+// - Some preprocessors cant handle single apostrophe characters within
+//   #ifndef code, so here, use delete all instead.
+
+#include "JudyPrivate.h"        // includes Judy.h in turn.
+#include "JudyPrivateBranch.h"
+
+
+// ****************************************************************************
+// JUDY1 ROOT POINTER (JRP) AND JUDY1 POINTER (JP) TYPE FIELDS
+// ****************************************************************************
+//
+// The following enum lists all possible JP Type fields. 
+
+typedef enum            // uint8_t -- but C does not support this type of enum.
+{
+
+// JP NULL TYPES:
+//
+// There is a series of cJ1_JPNULL* Types because each one pre-records a
+// different Index Size for when the first Index is inserted in the previously
+// null JP.  They must start >= 8 (three bits).
+//
+// Note:  These Types must be in sequential order for doing relative
+// calculations between them.
+
+        cJ1_JPNULL1 = 1,
+                                // Index Size 1[1] byte  when 1 Index inserted.
+        cJ1_JPNULL2,            // Index Size 2[2] bytes when 1 Index inserted.
+        cJ1_JPNULL3,            // Index Size 3[3] bytes when 1 Index inserted.
+
+#ifndef JU_64BIT
+#define cJ1_JPNULLMAX cJ1_JPNULL3
+#else
+        cJ1_JPNULL4,            // Index Size 4[4] bytes when 1 Index inserted.
+        cJ1_JPNULL5,            // Index Size 5[5] bytes when 1 Index inserted.
+        cJ1_JPNULL6,            // Index Size 6[6] bytes when 1 Index inserted.
+        cJ1_JPNULL7,            // Index Size 7[7] bytes when 1 Index inserted.
+#define cJ1_JPNULLMAX cJ1_JPNULL7
+#endif
+
+
+// JP BRANCH TYPES:
+//
+// Note:  There are no state-1 branches; only leaves reside at state 1.
+
+// Linear branches:
+//
+// Note:  These Types must be in sequential order for doing relative
+// calculations between them.
+
+        cJ1_JPBRANCH_L2,        // 2[2] bytes Pop0, 1[5] bytes Dcd.
+        cJ1_JPBRANCH_L3,        // 3[3] bytes Pop0, 0[4] bytes Dcd.
+
+#ifdef JU_64BIT
+        cJ1_JPBRANCH_L4,        //  [4] bytes Pop0,  [3] bytes Dcd.
+        cJ1_JPBRANCH_L5,        //  [5] bytes Pop0,  [2] bytes Dcd.
+        cJ1_JPBRANCH_L6,        //  [6] bytes Pop0,  [1] byte  Dcd.
+        cJ1_JPBRANCH_L7,        //  [7] bytes Pop0,  [0] bytes Dcd.
+#endif
+
+        cJ1_JPBRANCH_L,         // note:  DcdPopO field not used.
+
+// Bitmap branches:
+//
+// Note:  These Types must be in sequential order for doing relative
+// calculations between them.
+
+        cJ1_JPBRANCH_B2,        // 2[2] bytes Pop0, 1[5] bytes Dcd.
+        cJ1_JPBRANCH_B3,        // 3[3] bytes Pop0, 0[4] bytes Dcd.
+
+#ifdef JU_64BIT
+        cJ1_JPBRANCH_B4,        //  [4] bytes Pop0,  [3] bytes Dcd.
+        cJ1_JPBRANCH_B5,        //  [5] bytes Pop0,  [2] bytes Dcd.
+        cJ1_JPBRANCH_B6,        //  [6] bytes Pop0,  [1] byte  Dcd.
+        cJ1_JPBRANCH_B7,        //  [7] bytes Pop0,  [0] bytes Dcd.
+#endif
+
+        cJ1_JPBRANCH_B,         // note:  DcdPopO field not used.
+
+// Uncompressed branches:
+//
+// Note:  These Types must be in sequential order for doing relative
+// calculations between them.
+
+        cJ1_JPBRANCH_U2,        // 2[2] bytes Pop0, 1[5] bytes Dcd.
+        cJ1_JPBRANCH_U3,        // 3[3] bytes Pop0, 0[4] bytes Dcd.
+
+#ifdef JU_64BIT
+        cJ1_JPBRANCH_U4,        //  [4] bytes Pop0,  [3] bytes Dcd.
+        cJ1_JPBRANCH_U5,        //  [5] bytes Pop0,  [2] bytes Dcd.
+        cJ1_JPBRANCH_U6,        //  [6] bytes Pop0,  [1] byte  Dcd.
+        cJ1_JPBRANCH_U7,        //  [7] bytes Pop0,  [0] bytes Dcd.
+#endif
+
+        cJ1_JPBRANCH_U,         // note:  DcdPopO field not used.
+
+
+// JP LEAF TYPES:
+
+// Linear leaves:
+//
+// Note:  These Types must be in sequential order for doing relative
+// calculations between them.
+//
+// Note:  There is no cJ1_JPLEAF1 for 64-bit for a subtle reason.  An immediate
+// JP can hold 15 1-byte Indexes, and a bitmap leaf would be used for 17
+// Indexes, so rather than support a linear leaf for only the case of exactly
+// 16 Indexes, a bitmap leaf is used in that case.  See also below regarding
+// cJ1_LEAF1_MAXPOP1 on 64-bit systems.
+//
+// Note:  There is no full-word (4-byte [8-byte]) Index leaf under a JP because
+// non-root-state leaves only occur under branches that decode at least one
+// byte.  Full-word, root-state leaves are under a JRP, not a JP.  However, in
+// the code a "fake" JP can be created temporarily above a root-state leaf.
+
+#ifndef JU_64BIT // 32-bit only; see above.
+        cJ1_JPLEAF1,            // 1    byte  Pop0, 2    bytes Dcd.
+#endif
+
+        cJ1_JPLEAF2,            // 2[2] bytes Pop0, 1[5] bytes Dcd.
+        cJ1_JPLEAF3,            // 3[3] bytes Pop0, 0[4] bytes Dcd.
+
+#ifdef JU_64BIT
+        cJ1_JPLEAF4,            //  [4] bytes Pop0,  [3] bytes Dcd.
+        cJ1_JPLEAF5,            //  [5] bytes Pop0,  [2] bytes Dcd.
+        cJ1_JPLEAF6,            //  [6] bytes Pop0,  [1] byte  Dcd.
+        cJ1_JPLEAF7,            //  [7] bytes Pop0,  [0] bytes Dcd.
+#endif
+
+// Bitmap leaf; Index Size == 1:
+//
+// Note:  These are currently only supported at state 1.  At other states the
+// bitmap would grow from 256 to 256^2, 256^3, ... bits, which would not be
+// efficient..
+
+        cJ1_JPLEAF_B1,          // 1[1] byte Pop0, 2[6] bytes Dcd.
+
+
+// Full population; Index Size == 1 virtual leaf:
+//
+// Note:  These are currently only supported at state 1.  At other states they
+// could be used, but they would be rare and the savings are dubious.
+
+        cJ1_JPFULLPOPU1,        // 1[1] byte Pop0, 2[6] bytes Dcd.
+
+#ifdef notdef  // for future enhancements
+        cJ1_JPFULLPOPU1m1,      // Full Population - 1 
+        cJ1_JPFULLPOPU1m2,      // Full Population - 2 
+        cJ1_JPFULLPOPU1m3,      // Full Population - 3 
+        cJ1_JPFULLPOPU1m4,      // Full Population - 4 
+        cJ1_JPFULLPOPU1m5,      // Full Population - 5 
+        cJ1_JPFULLPOPU1m6,      // Full Population - 6 
+        cJ1_JPFULLPOPU1m7,      // Full Population - 7 
+
+#ifdef JU_64BIT
+        cJ1_JPFULLPOPU1m8,      // Full Population - 8 
+        cJ1_JPFULLPOPU1m9,      // Full Population - 9 
+        cJ1_JPFULLPOPU1m10,     // Full Population - 10 
+        cJ1_JPFULLPOPU1m11,     // Full Population - 11
+        cJ1_JPFULLPOPU1m12,     // Full Population - 12
+        cJ1_JPFULLPOPU1m13,     // Full Population - 13
+        cJ1_JPFULLPOPU1m14,     // Full Population - 14
+        cJ1_JPFULLPOPU1m15,     // Full Population - 15
+#endif
+#endif // notdef -- for future enhancements
+
+
+// JP IMMEDIATES; leaves (Indexes) stored inside a JP:
+//
+// The second numeric suffix is the Pop1 for each type.  As the Index Size
+// increases, the maximum possible population decreases.
+//
+// Note:  These Types must be in sequential order in each group (Index Size),
+// and the groups in correct order too, for doing relative calculations between
+// them.  For example, since these Types enumerate the Pop1 values (unlike
+// other JP Types where there is a Pop0 value in the JP), the maximum Pop1 for
+// each Index Size is computable.
+
+        cJ1_JPIMMED_1_01,       // Index Size = 1, Pop1 = 1.
+        cJ1_JPIMMED_2_01,       // Index Size = 2, Pop1 = 1.
+        cJ1_JPIMMED_3_01,       // Index Size = 3, Pop1 = 1.
+#ifdef JU_64BIT
+        cJ1_JPIMMED_4_01,       // Index Size = 4, Pop1 = 1.
+        cJ1_JPIMMED_5_01,       // Index Size = 5, Pop1 = 1.
+        cJ1_JPIMMED_6_01,       // Index Size = 6, Pop1 = 1.
+        cJ1_JPIMMED_7_01,       // Index Size = 7, Pop1 = 1.
+#endif
+
+        cJ1_JPIMMED_1_02,       // Index Size = 1, Pop1 = 2.
+        cJ1_JPIMMED_1_03,       // Index Size = 1, Pop1 = 3.
+        cJ1_JPIMMED_1_04,       // Index Size = 1, Pop1 = 4.
+        cJ1_JPIMMED_1_05,       // Index Size = 1, Pop1 = 5.
+        cJ1_JPIMMED_1_06,       // Index Size = 1, Pop1 = 6.
+        cJ1_JPIMMED_1_07,       // Index Size = 1, Pop1 = 7.
+
+#ifdef JU_64BIT
+        cJ1_JPIMMED_1_08,       // Index Size = 1, Pop1 = 8.
+        cJ1_JPIMMED_1_09,       // Index Size = 1, Pop1 = 9.
+        cJ1_JPIMMED_1_10,       // Index Size = 1, Pop1 = 10.
+        cJ1_JPIMMED_1_11,       // Index Size = 1, Pop1 = 11.
+        cJ1_JPIMMED_1_12,       // Index Size = 1, Pop1 = 12.
+        cJ1_JPIMMED_1_13,       // Index Size = 1, Pop1 = 13.
+        cJ1_JPIMMED_1_14,       // Index Size = 1, Pop1 = 14.
+        cJ1_JPIMMED_1_15,       // Index Size = 1, Pop1 = 15.
+#endif
+
+        cJ1_JPIMMED_2_02,       // Index Size = 2, Pop1 = 2.
+        cJ1_JPIMMED_2_03,       // Index Size = 2, Pop1 = 3.
+
+#ifdef JU_64BIT
+        cJ1_JPIMMED_2_04,       // Index Size = 2, Pop1 = 4.
+        cJ1_JPIMMED_2_05,       // Index Size = 2, Pop1 = 5.
+        cJ1_JPIMMED_2_06,       // Index Size = 2, Pop1 = 6.
+        cJ1_JPIMMED_2_07,       // Index Size = 2, Pop1 = 7.
+#endif
+
+        cJ1_JPIMMED_3_02,       // Index Size = 3, Pop1 = 2.
+
+#ifdef JU_64BIT
+        cJ1_JPIMMED_3_03,       // Index Size = 3, Pop1 = 3.
+        cJ1_JPIMMED_3_04,       // Index Size = 3, Pop1 = 4.
+        cJ1_JPIMMED_3_05,       // Index Size = 3, Pop1 = 5.
+
+        cJ1_JPIMMED_4_02,       // Index Size = 4, Pop1 = 2.
+        cJ1_JPIMMED_4_03,       // Index Size = 4, Pop1 = 3.
+
+        cJ1_JPIMMED_5_02,       // Index Size = 5, Pop1 = 2.
+        cJ1_JPIMMED_5_03,       // Index Size = 3, Pop1 = 3.
+
+        cJ1_JPIMMED_6_02,       // Index Size = 6, Pop1 = 2.
+
+        cJ1_JPIMMED_7_02,       // Index Size = 7, Pop1 = 2.
+#endif
+
+// This special Type is merely a sentinel for doing relative calculations.
+// This value should not be used in switch statements (to avoid allocating code
+// for it), which is also why it appears at the end of the enum list.
+
+        cJ1_JPIMMED_CAP
+
+} jp1_Type_t;
+
+
+// RELATED VALUES:
+//
+// Index Size (state) for leaf JP, and JP type based on Index Size (state):
+
+#ifndef JU_64BIT // 32-bit
+#define J1_LEAFINDEXSIZE(jpType) ((jpType)    - cJ1_JPLEAF1 + 1)
+#define J1_LEAFTYPE(IndexSize)   ((IndexSize) + cJ1_JPLEAF1 - 1)
+#else
+#define J1_LEAFINDEXSIZE(jpType) ((jpType)    - cJ1_JPLEAF2 + 2)
+#define J1_LEAFTYPE(IndexSize)   ((IndexSize) + cJ1_JPLEAF2 - 2)
+#endif
+
+
+// ****************************************************************************
+// JUDY1 POINTER (JP) -- RELATED MACROS AND CONSTANTS
+// ****************************************************************************
+
+// MAXIMUM POPULATIONS OF LINEAR LEAVES:
+//
+// Allow up to 2 cache lines per leaf, with N bytes per index.
+//
+// J_1_MAXB is the maximum number of bytes (sort of) to allocate per leaf.
+// ALLOCSIZES is defined here, not there, for single-point control of these key
+// definitions.  See JudyTables.c for "TERMINATOR".
+
+#define J_1_MAXB   (sizeof(Word_t) * 32)
+#define ALLOCSIZES { 3, 5, 7, 11, 15, 23, 32, 47, 64, TERMINATOR } // in words.
+#define cJ1_LEAF1_MAXWORDS  5           // Leaf1 max alloc size in words.
+
+// Under JRP (root-state leaves):
+//
+// Includes a count (Population) word.
+//
+// Under JP (non-root-state leaves), which have no count (Population) words:
+//
+// When a 1-byte index leaf grows above cJ1_LEAF1_MAXPOP1 Indexes (bytes),
+// the memory chunk required grows to a size where a bitmap is just as
+// efficient, so use a bitmap instead for all greater Populations, on both
+// 32-bit and 64-bit systems.  However, on a 32-bit system this occurs upon
+// going from 6 to 8 words (24 to 32 bytes) in the memory chunk, but on a
+// 64-bit system this occurs upon going from 2 to 4 words (16 to 32 bytes).  It
+// would be silly to go from a 15-Index Immediate JP to a 16-Index linear leaf
+// to a 17-Index bitmap leaf, so just use a bitmap leaf for 16+ Indexes, which
+// means set cJ1_LEAF1_MAXPOP1 to cJ1_IMMED1_MAXPOP1 (15) to cause the
+// transition at that point.
+//
+// Note:  cJ1_LEAF1_MAXPOP1 is not used on 64-bit systems.
+
+#ifndef JU_64BIT // 32-bit
+
+#define cJ1_LEAF1_MAXPOP1    (cJ1_LEAF1_MAXWORDS * cJU_BYTESPERWORD)
+#define cJ1_LEAF2_MAXPOP1    (J_1_MAXB / 2)
+#define cJ1_LEAF3_MAXPOP1    (J_1_MAXB / 3)
+#define cJ1_LEAFW_MAXPOP1    ((J_1_MAXB - cJU_BYTESPERWORD) / cJU_BYTESPERWORD)
+
+#else // 64-bit
+
+// #define cJ1_LEAF1_MAXPOP1                    // no LEAF1 in 64-bit.
+#define cJ1_LEAF2_MAXPOP1    (J_1_MAXB / 2)
+#define cJ1_LEAF3_MAXPOP1    (J_1_MAXB / 3)
+#define cJ1_LEAF4_MAXPOP1    (J_1_MAXB / 4)
+#define cJ1_LEAF5_MAXPOP1    (J_1_MAXB / 5)
+#define cJ1_LEAF6_MAXPOP1    (J_1_MAXB / 6)
+#define cJ1_LEAF7_MAXPOP1    (J_1_MAXB / 7)
+#define cJ1_LEAFW_MAXPOP1    ((J_1_MAXB - cJU_BYTESPERWORD) / cJU_BYTESPERWORD)
+
+#endif
+
+
+// MAXIMUM POPULATIONS OF IMMEDIATE JPs:
+//
+// These specify the maximum Population of immediate JPs with various Index
+// Sizes (== sizes of remaining undecoded Index bits).
+
+#define cJ1_IMMED1_MAXPOP1  ((sizeof(jp_t) - 1) / 1)    // 7 [15].
+#define cJ1_IMMED2_MAXPOP1  ((sizeof(jp_t) - 1) / 2)    // 3  [7].
+#define cJ1_IMMED3_MAXPOP1  ((sizeof(jp_t) - 1) / 3)    // 2  [5].
+
+#ifdef JU_64BIT
+#define cJ1_IMMED4_MAXPOP1  ((sizeof(jp_t) - 1) / 4)    //    [3].
+#define cJ1_IMMED5_MAXPOP1  ((sizeof(jp_t) - 1) / 5)    //    [3].
+#define cJ1_IMMED6_MAXPOP1  ((sizeof(jp_t) - 1) / 6)    //    [2].
+#define cJ1_IMMED7_MAXPOP1  ((sizeof(jp_t) - 1) / 7)    //    [2].
+#endif
+
+
+// ****************************************************************************
+// JUDY1 BITMAP LEAF (J1LB) SUPPORT
+// ****************************************************************************
+
+#define J1_JLB_BITMAP(Pjlb,Subexp)  ((Pjlb)->j1lb_Bitmap[Subexp])
+
+typedef struct J__UDY1_BITMAP_LEAF
+{
+        BITMAPL_t j1lb_Bitmap[cJU_NUMSUBEXPL];
+
+} j1lb_t, * Pj1lb_t;
+
+
+// ****************************************************************************
+// MEMORY ALLOCATION SUPPORT
+// ****************************************************************************
+
+// ARRAY-GLOBAL INFORMATION:
+//
+// At the cost of an occasional additional cache fill, this object, which is
+// pointed at by a JRP and in turn points to a JP_BRANCH*, carries array-global
+// information about a Judy1 array that has sufficient population to amortize
+// the cost.  The jpm_Pop0 field prevents having to add up the total population
+// for the array in insert, delete, and count code.  The jpm_JP field prevents
+// having to build a fake JP for entry to a state machine; however, the
+// jp_DcdPopO field in jpm_JP, being one byte too small, is not used.
+//
+// Note:  Struct fields are ordered to keep "hot" data in the first 8 words
+// (see left-margin comments) for machines with 8-word cache lines, and to keep
+// sub-word fields together for efficient packing.
+
+typedef struct J_UDY1_POPULATION_AND_MEMORY
+{
+/* 1 */ Word_t     jpm_Pop0;            // total population-1 in array.
+/* 2 */ jp_t       jpm_JP;              // JP to first branch; see above.
+/* 4 */ Word_t     jpm_LastUPop0;       // last jpm_Pop0 when convert to BranchU
+// Note:  Field names match PJError_t for convenience in macros:
+/* 7 */ char       je_Errno;            // one of the enums in Judy.h.
+/* 7/8 */ int      je_ErrID;            // often an internal source line number.
+/* 8/9 */ Word_t   jpm_TotalMemWords;   // words allocated in array.
+} j1pm_t, *Pj1pm_t;
+
+
+// TABLES FOR DETERMINING IF LEAVES HAVE ROOM TO GROW:
+//
+// These tables indicate if a given memory chunk can support growth of a given
+// object into wasted (rounded-up) memory in the chunk.  This violates the
+// hiddenness of the JudyMalloc code.
+//
+// Also define macros to hide the details in the code using these tables.
+
+#ifndef JU_64BIT
+extern const uint8_t j__1_Leaf1PopToWords[cJ1_LEAF1_MAXPOP1 + 1];
+#endif
+extern const uint8_t j__1_Leaf2PopToWords[cJ1_LEAF2_MAXPOP1 + 1];
+extern const uint8_t j__1_Leaf3PopToWords[cJ1_LEAF3_MAXPOP1 + 1];
+#ifdef JU_64BIT
+extern const uint8_t j__1_Leaf4PopToWords[cJ1_LEAF4_MAXPOP1 + 1];
+extern const uint8_t j__1_Leaf5PopToWords[cJ1_LEAF5_MAXPOP1 + 1];
+extern const uint8_t j__1_Leaf6PopToWords[cJ1_LEAF6_MAXPOP1 + 1];
+extern const uint8_t j__1_Leaf7PopToWords[cJ1_LEAF7_MAXPOP1 + 1];
+#endif
+extern const uint8_t j__1_LeafWPopToWords[cJ1_LEAFW_MAXPOP1 + 1];
+
+// Check if increase of population will fit in same leaf:
+
+#ifndef JU_64BIT
+#define J1_LEAF1GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJ1_LEAF1_MAXPOP1, j__1_Leaf1PopToWords)
+#endif
+#define J1_LEAF2GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJ1_LEAF2_MAXPOP1, j__1_Leaf2PopToWords)
+#define J1_LEAF3GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJ1_LEAF3_MAXPOP1, j__1_Leaf3PopToWords)
+#ifdef JU_64BIT
+#define J1_LEAF4GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJ1_LEAF4_MAXPOP1, j__1_Leaf4PopToWords)
+#define J1_LEAF5GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJ1_LEAF5_MAXPOP1, j__1_Leaf5PopToWords)
+#define J1_LEAF6GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJ1_LEAF6_MAXPOP1, j__1_Leaf6PopToWords)
+#define J1_LEAF7GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJ1_LEAF7_MAXPOP1, j__1_Leaf7PopToWords)
+#endif
+#define J1_LEAFWGROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJ1_LEAFW_MAXPOP1, j__1_LeafWPopToWords)
+
+#ifndef JU_64BIT
+#define J1_LEAF1POPTOWORDS(Pop1)  (j__1_Leaf1PopToWords[Pop1])
+#endif
+#define J1_LEAF2POPTOWORDS(Pop1)  (j__1_Leaf2PopToWords[Pop1])
+#define J1_LEAF3POPTOWORDS(Pop1)  (j__1_Leaf3PopToWords[Pop1])
+#ifdef JU_64BIT
+#define J1_LEAF4POPTOWORDS(Pop1)  (j__1_Leaf4PopToWords[Pop1])
+#define J1_LEAF5POPTOWORDS(Pop1)  (j__1_Leaf5PopToWords[Pop1])
+#define J1_LEAF6POPTOWORDS(Pop1)  (j__1_Leaf6PopToWords[Pop1])
+#define J1_LEAF7POPTOWORDS(Pop1)  (j__1_Leaf7PopToWords[Pop1])
+#endif
+#define J1_LEAFWPOPTOWORDS(Pop1)  (j__1_LeafWPopToWords[Pop1])
+
+
+// FUNCTIONS TO ALLOCATE OBJECTS:
+
+Pj1pm_t j__udy1AllocJ1PM(void);                         // constant size.
+
+Pjbl_t  j__udy1AllocJBL(          Pj1pm_t);             // constant size.
+Pjbb_t  j__udy1AllocJBB(          Pj1pm_t);             // constant size.
+Pjp_t   j__udy1AllocJBBJP(Word_t, Pj1pm_t);
+Pjbu_t  j__udy1AllocJBU(          Pj1pm_t);             // constant size.
+
+#ifndef JU_64BIT
+Pjll_t  j__udy1AllocJLL1( Word_t, Pj1pm_t);
+#endif
+Pjll_t  j__udy1AllocJLL2( Word_t, Pj1pm_t);
+Pjll_t  j__udy1AllocJLL3( Word_t, Pj1pm_t);
+
+#ifdef JU_64BIT
+Pjll_t  j__udy1AllocJLL4( Word_t, Pj1pm_t);
+Pjll_t  j__udy1AllocJLL5( Word_t, Pj1pm_t);
+Pjll_t  j__udy1AllocJLL6( Word_t, Pj1pm_t);
+Pjll_t  j__udy1AllocJLL7( Word_t, Pj1pm_t);
+#endif
+
+Pjlw_t  j__udy1AllocJLW(  Word_t         );             // no Pj1pm needed.
+Pj1lb_t j__udy1AllocJLB1(         Pj1pm_t);             // constant size.
+
+
+// FUNCTIONS TO FREE OBJECTS:
+
+void    j__udy1FreeJ1PM( Pj1pm_t,        Pj1pm_t);      // constant size.
+
+void    j__udy1FreeJBL(  Pjbl_t,         Pj1pm_t);      // constant size.
+void    j__udy1FreeJBB(  Pjbb_t,         Pj1pm_t);      // constant size.
+void    j__udy1FreeJBBJP(Pjp_t,  Word_t, Pj1pm_t);
+void    j__udy1FreeJBU(  Pjbu_t,         Pj1pm_t);      // constant size.
+
+#ifndef JU_64BIT
+void    j__udy1FreeJLL1( Pjll_t, Word_t, Pj1pm_t);
+#endif
+void    j__udy1FreeJLL2( Pjll_t, Word_t, Pj1pm_t);
+void    j__udy1FreeJLL3( Pjll_t, Word_t, Pj1pm_t);
+
+#ifdef JU_64BIT
+void    j__udy1FreeJLL4( Pjll_t, Word_t, Pj1pm_t);
+void    j__udy1FreeJLL5( Pjll_t, Word_t, Pj1pm_t);
+void    j__udy1FreeJLL6( Pjll_t, Word_t, Pj1pm_t);
+void    j__udy1FreeJLL7( Pjll_t, Word_t, Pj1pm_t);
+#endif
+
+void    j__udy1FreeJLW(  Pjlw_t, Word_t, Pj1pm_t);
+void    j__udy1FreeJLB1( Pj1lb_t,        Pj1pm_t);      // constant size.
+void    j__udy1FreeSM(   Pjp_t,          Pj1pm_t);      // everything below Pjp.
+
+#endif // ! _JUDY1_INCLUDED
diff --git a/libs/klib/judy/Judy1Tables.32.c b/libs/klib/judy/Judy1Tables.32.c
new file mode 100644
index 0000000..8b57a1c
--- /dev/null
+++ b/libs/klib/judy/Judy1Tables.32.c
@@ -0,0 +1,72 @@
+// @(#) From generation tool: JudyTablesGen.c
+//
+
+#include "Judy1.h"
+// Leave the malloc() sizes readable in the binary (via strings(1)):
+const char * Judy1MallocSizes = "Judy1MallocSizes = 3, 5, 7, 11, 15, 23, 32, 47, 64, Leaf1 = 20";
+
+
+//	object uses 64 words
+//	cJU_BITSPERSUBEXPB = 32
+const uint8_t
+j__1_BranchBJPPopToWords[cJU_BITSPERSUBEXPB + 1] =
+{
+	 0,
+	 3,  5,  7, 11, 11, 15, 15, 23, 
+	23, 23, 23, 32, 32, 32, 32, 32, 
+	47, 47, 47, 47, 47, 47, 47, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64
+};
+
+//	object uses 5 words
+//	cJ1_LEAF1_MAXPOP1 = 20
+const uint8_t
+j__1_Leaf1PopToWords[cJ1_LEAF1_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  3,  3,  3,  3,  3,  3, 
+	 3,  3,  3,  3,  5,  5,  5,  5, 
+	 5,  5,  5,  5
+};
+
+//	object uses 32 words
+//	cJ1_LEAF2_MAXPOP1 = 64
+const uint8_t
+j__1_Leaf2PopToWords[cJ1_LEAF2_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  3,  3,  3,  3,  5,  5, 
+	 5,  5,  7,  7,  7,  7, 11, 11, 
+	11, 11, 11, 11, 11, 11, 15, 15, 
+	15, 15, 15, 15, 15, 15, 23, 23, 
+	23, 23, 23, 23, 23, 23, 23, 23, 
+	23, 23, 23, 23, 23, 23, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32
+};
+
+//	object uses 32 words
+//	cJ1_LEAF3_MAXPOP1 = 42
+const uint8_t
+j__1_Leaf3PopToWords[cJ1_LEAF3_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  3,  3,  5,  5,  7,  7, 
+	 7, 11, 11, 11, 11, 11, 15, 15, 
+	15, 15, 15, 15, 23, 23, 23, 23, 
+	23, 23, 23, 23, 23, 23, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 32
+};
+
+//	object uses 32 words
+//	cJ1_LEAFW_MAXPOP1 = 31
+const uint8_t
+j__1_LeafWPopToWords[cJ1_LEAFW_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  5,  5,  7,  7, 11, 11, 
+	11, 11, 15, 15, 15, 15, 23, 23, 
+	23, 23, 23, 23, 23, 23, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32
+};
diff --git a/libs/klib/judy/Judy1Tables.64.c b/libs/klib/judy/Judy1Tables.64.c
new file mode 100644
index 0000000..140ea53
--- /dev/null
+++ b/libs/klib/judy/Judy1Tables.64.c
@@ -0,0 +1,132 @@
+// @(#) From generation tool: JudyTablesGen.c
+//
+
+#include "Judy1.h"
+// Leave the malloc() sizes readable in the binary (via strings(1)):
+const char * Judy1MallocSizes = "Judy1MallocSizes = 3, 5, 7, 11, 15, 23, 32, 47, 64,";
+
+
+//	object uses 64 words
+//	cJU_BITSPERSUBEXPB = 32
+const uint8_t
+j__1_BranchBJPPopToWords[cJU_BITSPERSUBEXPB + 1] =
+{
+	 0,
+	 3,  5,  7, 11, 11, 15, 15, 23, 
+	23, 23, 23, 32, 32, 32, 32, 32, 
+	47, 47, 47, 47, 47, 47, 47, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64
+};
+
+//	object uses 32 words
+//	cJ1_LEAF2_MAXPOP1 = 128
+const uint8_t
+j__1_Leaf2PopToWords[cJ1_LEAF2_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  3,  3,  3,  3,  3,  3, 
+	 3,  3,  3,  3,  5,  5,  5,  5, 
+	 5,  5,  5,  5,  7,  7,  7,  7, 
+	 7,  7,  7,  7, 11, 11, 11, 11, 
+	11, 11, 11, 11, 11, 11, 11, 11, 
+	11, 11, 11, 11, 15, 15, 15, 15, 
+	15, 15, 15, 15, 15, 15, 15, 15, 
+	15, 15, 15, 15, 23, 23, 23, 23, 
+	23, 23, 23, 23, 23, 23, 23, 23, 
+	23, 23, 23, 23, 23, 23, 23, 23, 
+	23, 23, 23, 23, 23, 23, 23, 23, 
+	23, 23, 23, 23, 32, 32, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32
+};
+
+//	object uses 32 words
+//	cJ1_LEAF3_MAXPOP1 = 85
+const uint8_t
+j__1_Leaf3PopToWords[cJ1_LEAF3_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  3,  3,  3,  3,  3,  3, 
+	 5,  5,  5,  5,  5,  7,  7,  7, 
+	 7,  7, 11, 11, 11, 11, 11, 11, 
+	11, 11, 11, 11, 11, 15, 15, 15, 
+	15, 15, 15, 15, 15, 15, 15, 15, 
+	23, 23, 23, 23, 23, 23, 23, 23, 
+	23, 23, 23, 23, 23, 23, 23, 23, 
+	23, 23, 23, 23, 23, 32, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32, 32, 32
+};
+
+//	object uses 32 words
+//	cJ1_LEAF4_MAXPOP1 = 64
+const uint8_t
+j__1_Leaf4PopToWords[cJ1_LEAF4_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  3,  3,  3,  3,  5,  5, 
+	 5,  5,  7,  7,  7,  7, 11, 11, 
+	11, 11, 11, 11, 11, 11, 15, 15, 
+	15, 15, 15, 15, 15, 15, 23, 23, 
+	23, 23, 23, 23, 23, 23, 23, 23, 
+	23, 23, 23, 23, 23, 23, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32
+};
+
+//	object uses 32 words
+//	cJ1_LEAF5_MAXPOP1 = 51
+const uint8_t
+j__1_Leaf5PopToWords[cJ1_LEAF5_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  3,  3,  5,  5,  5,  5, 
+	 7,  7,  7, 11, 11, 11, 11, 11, 
+	11, 15, 15, 15, 15, 15, 15, 15, 
+	23, 23, 23, 23, 23, 23, 23, 23, 
+	23, 23, 23, 23, 32, 32, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32
+};
+
+//	object uses 32 words
+//	cJ1_LEAF6_MAXPOP1 = 42
+const uint8_t
+j__1_Leaf6PopToWords[cJ1_LEAF6_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  3,  3,  5,  5,  7,  7, 
+	 7, 11, 11, 11, 11, 11, 15, 15, 
+	15, 15, 15, 15, 23, 23, 23, 23, 
+	23, 23, 23, 23, 23, 23, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 32
+};
+
+//	object uses 32 words
+//	cJ1_LEAF7_MAXPOP1 = 36
+const uint8_t
+j__1_Leaf7PopToWords[cJ1_LEAF7_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  3,  5,  5,  7,  7,  7, 
+	11, 11, 11, 11, 15, 15, 15, 15, 
+	15, 23, 23, 23, 23, 23, 23, 23, 
+	23, 23, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32, 32
+};
+
+//	object uses 32 words
+//	cJ1_LEAFW_MAXPOP1 = 31
+const uint8_t
+j__1_LeafWPopToWords[cJ1_LEAFW_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  5,  5,  7,  7, 11, 11, 
+	11, 11, 15, 15, 15, 15, 23, 23, 
+	23, 23, 23, 23, 23, 23, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32
+};
diff --git a/libs/klib/judy/JudyByCount.c b/libs/klib/judy/JudyByCount.c
new file mode 100644
index 0000000..f6efea0
--- /dev/null
+++ b/libs/klib/judy/JudyByCount.c
@@ -0,0 +1,952 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Judy*ByCount() function for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+//
+// Compile with -DNOSMARTJBB, -DNOSMARTJBU, and/or -DNOSMARTJLB to build a
+// version with cache line optimizations deleted, for testing.
+//
+// Judy*ByCount() is a conceptual although not literal inverse of Judy*Count().
+// Judy*Count() takes a pair of Indexes, and allows finding the ordinal of a
+// given Index (that is, its position in the list of valid indexes from the
+// beginning) as a degenerate case, because in general the count between two
+// Indexes, inclusive, is not always just the difference in their ordinals.
+// However, it suffices for Judy*ByCount() to simply be an ordinal-to-Index
+// mapper.
+//
+// Note:  Like Judy*Count(), this code must "count sideways" in branches, which
+// can result in a lot of cache line fills.  However, unlike Judy*Count(), this
+// code does not receive a specific Index, hence digit, where to start in each
+// branch, so it cant accurately calculate cache line fills required in each
+// direction.  The best it can do is an approximation based on the total
+// population of the expanse (pop1 from Pjp) and the ordinal of the target
+// Index (see SETOFFSET()) within the expanse.
+//
+// Compile with -DSMARTMETRICS to obtain global variables containing smart
+// cache line metrics.  Note:  Dont turn this on simultaneously for this file
+// and JudyCount.c because they export the same globals.
+// ****************************************************************************
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+// These are imported from JudyCount.c:
+//
+// TBD:  Should this be in common code?  Exported from a header file?
+
+#ifdef JUDY1
+extern	Word_t j__udy1JPPop1(const Pjp_t Pjp);
+#define	j__udyJPPop1 j__udy1JPPop1
+#else
+extern	Word_t j__udyLJPPop1(const Pjp_t Pjp);
+#define	j__udyJPPop1 j__udyLJPPop1
+#endif
+
+// Avoid duplicate symbols since this file is multi-compiled:
+
+#ifdef SMARTMETRICS
+#ifdef JUDY1
+Word_t	jbb_upward   = 0;	// counts of directions taken:
+Word_t	jbb_downward = 0;
+Word_t	jbu_upward   = 0;
+Word_t	jbu_downward = 0;
+Word_t	jlb_upward   = 0;
+Word_t	jlb_downward = 0;
+#else
+extern Word_t jbb_upward;
+extern Word_t jbb_downward;
+extern Word_t jbu_upward;
+extern Word_t jbu_downward;
+extern Word_t jlb_upward;
+extern Word_t jlb_downward;
+#endif
+#endif
+
+
+// ****************************************************************************
+// J U D Y   1   B Y   C O U N T
+// J U D Y   L   B Y   C O U N T
+//
+// See the manual entry.
+
+#ifdef JUDY1
+FUNCTION int Judy1ByCount
+#else
+FUNCTION PPvoid_t JudyLByCount
+#endif
+        (
+	Pcvoid_t  PArray,	// root pointer to first branch/leaf in SM.
+	Word_t	  Count,	// ordinal of Index to find, 1..MAX.
+	Word_t *  PIndex,	// to return found Index.
+	PJError_t PJError	// optional, for returning error info.
+        )
+{
+	Word_t	  Count0;	// Count, base-0, to match pop0.
+	Word_t	  state;	// current state in SM.
+	Word_t	  pop1;		// of current branch or leaf, or of expanse.
+	Word_t	  pop1lower;	// pop1 of expanses (JPs) below that for Count.
+	Word_t	  digit;	// current word in branch.
+	Word_t	  jpcount;	// JPs in a BranchB subexpanse.
+	long	  jpnum;	// JP number in a branch (base 0).
+	long	  subexp;	// for stepping through layer 1 (subexpanses).
+	int	  offset;	// index ordinal within a leaf, base 0.
+
+	Pjp_t	  Pjp;		// current JP in branch.
+	Pjll_t	  Pjll;		// current Judy linear leaf.
+
+
+// CHECK FOR EMPTY ARRAY OR NULL PINDEX:
+
+	if (PArray == (Pvoid_t) NULL) JU_RET_NOTFOUND;
+
+	if (PIndex == (PWord_t) NULL)
+	{
+	    JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+	    JUDY1CODE(return(JERRI );)
+	    JUDYLCODE(return(PPJERR);)
+	}
+
+// Convert Count to Count0; assume special case of Count = 0 maps to ~0, as
+// desired, to represent the last index in a full array:
+//
+// Note:  Think of Count0 as a reliable "number of Indexes below the target."
+
+	Count0 = Count - 1;
+	assert((Count || Count0 == ~0));  // ensure CPU is sane about 0 - 1.
+	pop1lower = 0;
+
+	if (JU_LEAFW_POP0(PArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
+	{
+	    Pjlw_t Pjlw = P_JLW(PArray);		// first word of leaf.
+
+	    if (Count0 > Pjlw[0]) JU_RET_NOTFOUND;	// too high.
+
+	    *PIndex = Pjlw[Count];			// Index, base 1.
+
+	    JU_RET_FOUND_LEAFW(Pjlw, Pjlw[0] + 1, Count0);
+	}
+	else
+	{
+	    Pjpm_t Pjpm = P_JPM(PArray);
+
+	    if (Count0 > (Pjpm->jpm_Pop0)) JU_RET_NOTFOUND;	// too high.
+
+	    Pjp  = &(Pjpm->jpm_JP);
+	    pop1 =  (Pjpm->jpm_Pop0) + 1;
+
+//	    goto SMByCount;
+	}
+
+// COMMON CODE:
+//
+// Prepare to handle a root-level or lower-level branch:  Save the current
+// state, obtain the total population for the branch in a state-dependent way,
+// and then branch to common code for multiple cases.
+//
+// For root-level branches, the state is always cJU_ROOTSTATE, and the array
+// population must already be set in pop1; it is not available in jp_DcdPopO.
+//
+// Note:  The total population is only needed in cases where the common code
+// "counts down" instead of up to minimize cache line fills.  However, its
+// available cheaply, and its better to do it with a constant shift (constant
+// state value) instead of a variable shift later "when needed".
+
+#define	PREPB_ROOT(Next)	\
+	state = cJU_ROOTSTATE;	\
+	goto Next
+
+// Use PREPB_DCD() to first copy the Dcd bytes to *PIndex if there are any
+// (only if state < cJU_ROOTSTATE - 1):
+
+#define	PREPB_DCD(Pjp,cState,Next)			\
+	JU_SETDCD(*PIndex, Pjp, cState);	        \
+	PREPB((Pjp), cState, Next)
+
+#define	PREPB(Pjp,cState,Next)	\
+	state = (cState);	\
+	pop1  = JU_JPBRANCH_POP0(Pjp, (cState)) + 1; \
+	goto Next
+
+// Calculate whether the ordinal of an Index within a given expanse falls in
+// the lower or upper half of the expanses population, taking care with
+// unsigned math and boundary conditions:
+//
+// Note:  Assume the ordinal falls within the expanses population, that is,
+// 0 < (Count - Pop1lower) <= Pop1exp (assuming infinite math).
+//
+// Note:  If the ordinal is the middle element, it doesnt matter whether
+// LOWERHALF() is TRUE or FALSE.
+
+#define	LOWERHALF(Count0,Pop1lower,Pop1exp) \
+	(((Count0) - (Pop1lower)) < ((Pop1exp) / 2))
+
+// Calculate the (signed) offset within a leaf to the desired ordinal (Count -
+// Pop1lower; offset is one less), and optionally ensure its in range:
+
+#define	SETOFFSET(Offset,Count0,Pop1lower,Pjp)	\
+	(Offset) = (Count0) - (Pop1lower);	\
+	assert((Offset) >= 0);			\
+	assert((Offset) <= JU_JPLEAF_POP0(Pjp))
+
+// Variations for immediate indexes, with and without pop1-specific assertions:
+
+#define	SETOFFSET_IMM_CK(Offset,Count0,Pop1lower,cPop1)	\
+	(Offset) = (Count0) - (Pop1lower);		\
+	assert((Offset) >= 0);				\
+	assert((Offset) <  (cPop1))
+
+#define	SETOFFSET_IMM(Offset,Count0,Pop1lower) \
+	(Offset) = (Count0) - (Pop1lower)
+
+
+// STATE MACHINE -- TRAVERSE TREE:
+//
+// In branches, look for the expanse (digit), if any, where the total pop1
+// below or at that expanse would meet or exceed Count, meaning the Index must
+// be in this expanse.
+
+SMByCount:			// return here for next branch/leaf.
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// ----------------------------------------------------------------------------
+// LINEAR BRANCH; count populations in JPs in the JBL upwards until finding the
+// expanse (digit) containing Count, and "recurse".
+//
+// Note:  There are no null JPs in a JBL; watch out for pop1 == 0.
+//
+// Note:  A JBL should always fit in one cache line => no need to count up
+// versus down to save cache line fills.
+//
+// TBD:  The previous is no longer true.  Consider enhancing this code to count
+// up/down, but it can wait for a later tuning phase.  In the meantime, PREPB()
+// sets pop1 for the whole array, but that value is not used here.  001215:
+// Maybe its true again?
+
+	case cJU_JPBRANCH_L2:  PREPB_DCD(Pjp, 2, BranchL);
+#ifndef JU_64BIT
+	case cJU_JPBRANCH_L3:  PREPB(	 Pjp, 3, BranchL);
+#else
+	case cJU_JPBRANCH_L3:  PREPB_DCD(Pjp, 3, BranchL);
+	case cJU_JPBRANCH_L4:  PREPB_DCD(Pjp, 4, BranchL);
+	case cJU_JPBRANCH_L5:  PREPB_DCD(Pjp, 5, BranchL);
+	case cJU_JPBRANCH_L6:  PREPB_DCD(Pjp, 6, BranchL);
+	case cJU_JPBRANCH_L7:  PREPB(	 Pjp, 7, BranchL);
+#endif
+	case cJU_JPBRANCH_L:   PREPB_ROOT(	 BranchL);
+	{
+	    Pjbl_t Pjbl;
+
+// Common code (state-independent) for all cases of linear branches:
+
+BranchL:
+	    Pjbl = P_JBL(Pjp->jp_Addr);
+
+	    for (jpnum = 0; jpnum < (Pjbl->jbl_NumJPs); ++jpnum)
+	    {
+	        if ((pop1 = j__udyJPPop1((Pjbl->jbl_jp) + jpnum))
+		 == cJU_ALLONES)
+	        {
+		    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		    JUDY1CODE(return(JERRI );)
+		    JUDYLCODE(return(PPJERR);)
+	        }
+	        assert(pop1 != 0);
+
+// Warning:  pop1lower and pop1 are unsigned, so do not subtract 1 and compare
+// >=, but instead use the following expression:
+
+	        if (pop1lower + pop1 > Count0)	 // Index is in this expanse.
+	        {
+		    JU_SETDIGIT(*PIndex, Pjbl->jbl_Expanse[jpnum], state);
+		    Pjp = (Pjbl->jbl_jp) + jpnum;
+		    goto SMByCount;			// look under this expanse.
+	        }
+
+	        pop1lower += pop1;			// add this JPs pop1.
+	    }
+
+	    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);  // should never get here.
+	    JUDY1CODE(return(JERRI );)
+	    JUDYLCODE(return(PPJERR);)
+
+	} // case cJU_JPBRANCH_L
+
+
+// ----------------------------------------------------------------------------
+// BITMAP BRANCH; count populations in JPs in the JBB upwards or downwards
+// until finding the expanse (digit) containing Count, and "recurse".
+//
+// Note:  There are no null JPs in a JBB; watch out for pop1 == 0.
+
+	case cJU_JPBRANCH_B2:  PREPB_DCD(Pjp, 2, BranchB);
+#ifndef JU_64BIT
+	case cJU_JPBRANCH_B3:  PREPB(	 Pjp, 3, BranchB);
+#else
+	case cJU_JPBRANCH_B3:  PREPB_DCD(Pjp, 3, BranchB);
+	case cJU_JPBRANCH_B4:  PREPB_DCD(Pjp, 4, BranchB);
+	case cJU_JPBRANCH_B5:  PREPB_DCD(Pjp, 5, BranchB);
+	case cJU_JPBRANCH_B6:  PREPB_DCD(Pjp, 6, BranchB);
+	case cJU_JPBRANCH_B7:  PREPB(	 Pjp, 7, BranchB);
+#endif
+	case cJU_JPBRANCH_B:   PREPB_ROOT(	 BranchB);
+	{
+	    Pjbb_t Pjbb;
+
+// Common code (state-independent) for all cases of bitmap branches:
+
+BranchB:
+	    Pjbb = P_JBB(Pjp->jp_Addr);
+
+// Shorthand for one subexpanse in a bitmap and for one JP in a bitmap branch:
+//
+// Note: BMPJP0 exists separately to support assertions.
+
+#define	BMPJP0(Subexp)	     (P_JP(JU_JBB_PJP(Pjbb, Subexp)))
+#define	BMPJP(Subexp,JPnum)  (BMPJP0(Subexp) + (JPnum))
+
+
+// Common code for descending through a JP:
+//
+// Determine the digit for the expanse and save it in *PIndex; then "recurse".
+
+#define	JBB_FOUNDEXPANSE			\
+	{					\
+	    JU_BITMAPDIGITB(digit, subexp, JU_JBB_BITMAP(Pjbb,subexp), jpnum); \
+	    JU_SETDIGIT(*PIndex, digit, state);	\
+	    Pjp = BMPJP(subexp, jpnum);		\
+	    goto SMByCount;			\
+	}
+
+
+#ifndef NOSMARTJBB  // enable to turn off smart code for comparison purposes.
+
+// FIGURE OUT WHICH DIRECTION CAUSES FEWER CACHE LINE FILLS; adding the pop1s
+// in JPs upwards, or subtracting the pop1s in JPs downwards:
+//
+// See header comments about limitations of this for Judy*ByCount().
+
+#endif
+
+// COUNT UPWARD, adding each "below" JPs pop1:
+
+#ifndef NOSMARTJBB  // enable to turn off smart code for comparison purposes.
+
+	    if (LOWERHALF(Count0, pop1lower, pop1))
+	    {
+#endif
+#ifdef SMARTMETRICS
+		++jbb_upward;
+#endif
+		for (subexp = 0; subexp < cJU_NUMSUBEXPB; ++subexp)
+		{
+		    if ((jpcount = j__udyCountBitsB(JU_JBB_BITMAP(Pjbb,subexp)))
+		     && (BMPJP0(subexp) == (Pjp_t) NULL))
+		    {
+			JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);  // null ptr.
+			JUDY1CODE(return(JERRI );)
+			JUDYLCODE(return(PPJERR);)
+		    }
+
+// Note:  An empty subexpanse (jpcount == 0) is handled "for free":
+
+		    for (jpnum = 0; jpnum < jpcount; ++jpnum)
+		    {
+			if ((pop1 = j__udyJPPop1(BMPJP(subexp, jpnum)))
+			  == cJU_ALLONES)
+			{
+			    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+			    JUDY1CODE(return(JERRI );)
+			    JUDYLCODE(return(PPJERR);)
+			}
+			assert(pop1 != 0);
+
+// Warning:  pop1lower and pop1 are unsigned, see earlier comment:
+
+			if (pop1lower + pop1 > Count0)
+			    JBB_FOUNDEXPANSE;	// Index is in this expanse.
+
+			pop1lower += pop1;	// add this JPs pop1.
+		    }
+		}
+#ifndef NOSMARTJBB  // enable to turn off smart code for comparison purposes.
+	    }
+
+
+// COUNT DOWNWARD, subtracting each "above" JPs pop1 from the whole expanses
+// pop1:
+
+	    else
+	    {
+#ifdef SMARTMETRICS
+		++jbb_downward;
+#endif
+		pop1lower += pop1;		// add whole branch to start.
+
+		for (subexp = cJU_NUMSUBEXPB - 1; subexp >= 0; --subexp)
+		{
+		    if ((jpcount = j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, subexp)))
+		     && (BMPJP0(subexp) == (Pjp_t) NULL))
+		    {
+			JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);  // null ptr.
+			JUDY1CODE(return(JERRI );)
+			JUDYLCODE(return(PPJERR);)
+		    }
+
+// Note:  An empty subexpanse (jpcount == 0) is handled "for free":
+
+		    for (jpnum = jpcount - 1; jpnum >= 0; --jpnum)
+		    {
+			if ((pop1 = j__udyJPPop1(BMPJP(subexp, jpnum)))
+			  == cJU_ALLONES)
+			{
+			    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+			    JUDY1CODE(return(JERRI );)
+			    JUDYLCODE(return(PPJERR);)
+			}
+			assert(pop1 != 0);
+
+// Warning:  pop1lower and pop1 are unsigned, see earlier comment:
+
+			pop1lower -= pop1;
+
+// Beware unsigned math problems:
+
+			if ((pop1lower == 0) || (pop1lower - 1 < Count0))
+			    JBB_FOUNDEXPANSE;	// Index is in this expanse.
+		    }
+		}
+	    }
+#endif // NOSMARTJBB
+
+	    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);  // should never get here.
+	    JUDY1CODE(return(JERRI );)
+	    JUDYLCODE(return(PPJERR);)
+
+	} // case cJU_JPBRANCH_B
+
+
+// ----------------------------------------------------------------------------
+// UNCOMPRESSED BRANCH; count populations in JPs in the JBU upwards or
+// downwards until finding the expanse (digit) containing Count, and "recurse".
+
+	case cJU_JPBRANCH_U2:  PREPB_DCD(Pjp, 2, BranchU);
+#ifndef JU_64BIT
+	case cJU_JPBRANCH_U3:  PREPB(	 Pjp, 3, BranchU);
+#else
+	case cJU_JPBRANCH_U3:  PREPB_DCD(Pjp, 3, BranchU);
+	case cJU_JPBRANCH_U4:  PREPB_DCD(Pjp, 4, BranchU);
+	case cJU_JPBRANCH_U5:  PREPB_DCD(Pjp, 5, BranchU);
+	case cJU_JPBRANCH_U6:  PREPB_DCD(Pjp, 6, BranchU);
+	case cJU_JPBRANCH_U7:  PREPB(	 Pjp, 7, BranchU);
+#endif
+	case cJU_JPBRANCH_U:   PREPB_ROOT(	 BranchU);
+	{
+	    Pjbu_t Pjbu;
+
+// Common code (state-independent) for all cases of uncompressed branches:
+
+BranchU:
+	    Pjbu = P_JBU(Pjp->jp_Addr);
+
+// Common code for descending through a JP:
+//
+// Save the digit for the expanse in *PIndex, then "recurse".
+
+#define	JBU_FOUNDEXPANSE			\
+	{					\
+	    JU_SETDIGIT(*PIndex, jpnum, state);	\
+	    Pjp = (Pjbu->jbu_jp) + jpnum;	\
+	    goto SMByCount;			\
+	}
+
+
+#ifndef NOSMARTJBU  // enable to turn off smart code for comparison purposes.
+
+// FIGURE OUT WHICH DIRECTION CAUSES FEWER CACHE LINE FILLS; adding the pop1s
+// in JPs upwards, or subtracting the pop1s in JPs downwards:
+//
+// See header comments about limitations of this for Judy*ByCount().
+
+#endif
+
+// COUNT UPWARD, simply adding the pop1 of each JP:
+
+#ifndef NOSMARTJBU  // enable to turn off smart code for comparison purposes.
+
+	    if (LOWERHALF(Count0, pop1lower, pop1))
+	    {
+#endif
+#ifdef SMARTMETRICS
+		++jbu_upward;
+#endif
+
+		for (jpnum = 0; jpnum < cJU_BRANCHUNUMJPS; ++jpnum)
+		{
+		    // shortcut, save a function call:
+
+		    if ((Pjbu->jbu_jp[jpnum].jp_Type) <= cJU_JPNULLMAX)
+			continue;
+
+		    if ((pop1 = j__udyJPPop1((Pjbu->jbu_jp) + jpnum))
+		     == cJU_ALLONES)
+		    {
+			JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+			JUDY1CODE(return(JERRI );)
+			JUDYLCODE(return(PPJERR);)
+		    }
+		    assert(pop1 != 0);
+
+// Warning:  pop1lower and pop1 are unsigned, see earlier comment:
+
+		    if (pop1lower + pop1 > Count0)
+			JBU_FOUNDEXPANSE;	// Index is in this expanse.
+
+		    pop1lower += pop1;		// add this JPs pop1.
+		}
+#ifndef NOSMARTJBU  // enable to turn off smart code for comparison purposes.
+	    }
+
+
+// COUNT DOWNWARD, subtracting the pop1 of each JP above from the whole
+// expanses pop1:
+
+	    else
+	    {
+#ifdef SMARTMETRICS
+		++jbu_downward;
+#endif
+		pop1lower += pop1;		// add whole branch to start.
+
+		for (jpnum = cJU_BRANCHUNUMJPS - 1; jpnum >= 0; --jpnum)
+		{
+		    // shortcut, save a function call:
+
+		    if ((Pjbu->jbu_jp[jpnum].jp_Type) <= cJU_JPNULLMAX)
+			continue;
+
+		    if ((pop1 = j__udyJPPop1(Pjbu->jbu_jp + jpnum))
+		     == cJU_ALLONES)
+		    {
+			JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+			JUDY1CODE(return(JERRI );)
+			JUDYLCODE(return(PPJERR);)
+		    }
+		    assert(pop1 != 0);
+
+// Warning:  pop1lower and pop1 are unsigned, see earlier comment:
+
+		    pop1lower -= pop1;
+
+// Beware unsigned math problems:
+
+		    if ((pop1lower == 0) || (pop1lower - 1 < Count0))
+			JBU_FOUNDEXPANSE;	// Index is in this expanse.
+		}
+	    }
+#endif // NOSMARTJBU
+
+	    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);  // should never get here.
+	    JUDY1CODE(return(JERRI );)
+	    JUDYLCODE(return(PPJERR);)
+
+	} // case cJU_JPBRANCH_U
+
+// ----------------------------------------------------------------------------
+// LINEAR LEAF:
+//
+// Return the Index at the proper ordinal (see SETOFFSET()) in the leaf.  First
+// copy Dcd bytes, if there are any (only if state < cJU_ROOTSTATE - 1), to
+// *PIndex.
+//
+// Note:  The preceding branch traversal code MIGHT set pop1 for this expanse
+// (linear leaf) as a side-effect, but dont depend on that (for JUDYL, which
+// is the only cases that need it anyway).
+
+#define	PREPL_DCD(cState)				\
+	JU_SETDCD(*PIndex, Pjp, cState);	        \
+	PREPL
+
+#ifdef JUDY1
+#define	PREPL_SETPOP1			// not needed in any cases.
+#else
+#define	PREPL_SETPOP1  pop1 = JU_JPLEAF_POP0(Pjp) + 1
+#endif
+
+#define	PREPL				\
+	Pjll = P_JLL(Pjp->jp_Addr);	\
+	PREPL_SETPOP1;			\
+	SETOFFSET(offset, Count0, pop1lower, Pjp)
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+	case cJU_JPLEAF1:
+
+	    PREPL_DCD(1);
+	    JU_SETDIGIT1(*PIndex, ((uint8_t *) Pjll)[offset]);
+	    JU_RET_FOUND_LEAF1(Pjll, pop1, offset);
+#endif
+
+	case cJU_JPLEAF2:
+
+	    PREPL_DCD(2);
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(2)))
+		    | ((uint16_t *) Pjll)[offset];
+	    JU_RET_FOUND_LEAF2(Pjll, pop1, offset);
+
+#ifndef JU_64BIT
+	case cJU_JPLEAF3:
+	{
+	    Word_t lsb;
+	    PREPL;
+	    JU_COPY3_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (3 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(3))) | lsb;
+	    JU_RET_FOUND_LEAF3(Pjll, pop1, offset);
+	}
+
+#else
+	case cJU_JPLEAF3:
+	{
+	    Word_t lsb;
+	    PREPL_DCD(3);
+	    JU_COPY3_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (3 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(3))) | lsb;
+	    JU_RET_FOUND_LEAF3(Pjll, pop1, offset);
+	}
+
+	case cJU_JPLEAF4:
+
+	    PREPL_DCD(4);
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(4)))
+		    | ((uint32_t *) Pjll)[offset];
+	    JU_RET_FOUND_LEAF4(Pjll, pop1, offset);
+
+	case cJU_JPLEAF5:
+	{
+	    Word_t lsb;
+	    PREPL_DCD(5);
+	    JU_COPY5_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (5 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(5))) | lsb;
+	    JU_RET_FOUND_LEAF5(Pjll, pop1, offset);
+	}
+
+	case cJU_JPLEAF6:
+	{
+	    Word_t lsb;
+	    PREPL_DCD(6);
+	    JU_COPY6_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (6 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(6))) | lsb;
+	    JU_RET_FOUND_LEAF6(Pjll, pop1, offset);
+	}
+
+	case cJU_JPLEAF7:
+	{
+	    Word_t lsb;
+	    PREPL;
+	    JU_COPY7_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (7 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(7))) | lsb;
+	    JU_RET_FOUND_LEAF7(Pjll, pop1, offset);
+	}
+#endif
+
+
+// ----------------------------------------------------------------------------
+// BITMAP LEAF:
+//
+// Return the Index at the proper ordinal (see SETOFFSET()) in the leaf by
+// counting bits.  First copy Dcd bytes (always present since state 1 <
+// cJU_ROOTSTATE) to *PIndex.
+//
+// Note:  The preceding branch traversal code MIGHT set pop1 for this expanse
+// (bitmap leaf) as a side-effect, but dont depend on that.
+
+	case cJU_JPLEAF_B1:
+	{
+	    Pjlb_t Pjlb;
+
+	    JU_SETDCD(*PIndex, Pjp, 1);
+	    Pjlb = P_JLB(Pjp->jp_Addr);
+	    pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+
+// COUNT UPWARD, adding the pop1 of each subexpanse:
+//
+// The entire bitmap should fit in one cache line, but still try to save some
+// CPU time by counting the fewest possible number of subexpanses from the
+// bitmap.
+//
+// See header comments about limitations of this for Judy*ByCount().
+
+#ifndef NOSMARTJLB  // enable to turn off smart code for comparison purposes.
+
+	    if (LOWERHALF(Count0, pop1lower, pop1))
+	    {
+#endif
+#ifdef SMARTMETRICS
+		++jlb_upward;
+#endif
+		for (subexp = 0; subexp < cJU_NUMSUBEXPL; ++subexp)
+		{
+		    pop1 = j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, subexp));
+
+// Warning:  pop1lower and pop1 are unsigned, see earlier comment:
+
+		    if (pop1lower + pop1 > Count0)
+			goto LeafB1;		// Index is in this subexpanse.
+
+		    pop1lower += pop1;		// add this subexpanses pop1.
+		}
+#ifndef NOSMARTJLB  // enable to turn off smart code for comparison purposes.
+	    }
+
+
+// COUNT DOWNWARD, subtracting each "above" subexpanses pop1 from the whole
+// expanses pop1:
+
+	    else
+	    {
+#ifdef SMARTMETRICS
+		++jlb_downward;
+#endif
+		pop1lower += pop1;		// add whole leaf to start.
+
+		for (subexp = cJU_NUMSUBEXPL - 1; subexp >= 0; --subexp)
+		{
+		    pop1lower -= j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, subexp));
+
+// Beware unsigned math problems:
+
+		    if ((pop1lower == 0) || (pop1lower - 1 < Count0))
+			goto LeafB1;		// Index is in this subexpanse.
+		}
+	    }
+#endif // NOSMARTJLB
+
+	    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);  // should never get here.
+	    JUDY1CODE(return(JERRI );)
+	    JUDYLCODE(return(PPJERR);)
+
+
+// RETURN INDEX FOUND:
+//
+// Come here with subexp set to the correct subexpanse, and pop1lower set to
+// the sum for all lower expanses and subexpanses in the Judy tree.  Calculate
+// and save in *PIndex the digit corresponding to the ordinal in this
+// subexpanse.
+
+LeafB1:
+	    SETOFFSET(offset, Count0, pop1lower, Pjp);
+	    JU_BITMAPDIGITL(digit, subexp, JU_JLB_BITMAP(Pjlb, subexp), offset);
+	    JU_SETDIGIT1(*PIndex, digit);
+	    JU_RET_FOUND_LEAF_B1(Pjlb, subexp, offset);
+//	    == return((PPvoid_t) (P_JV(JL_JLB_PVALUE(Pjlb, subexp)) + offset))
+
+	} // case cJU_JPLEAF_B1
+
+
+#ifdef JUDY1
+// ----------------------------------------------------------------------------
+// FULL POPULATION:
+//
+// Copy Dcd bytes (always present since state 1 < cJU_ROOTSTATE) to *PIndex,
+// then set the appropriate digit for the ordinal (see SETOFFSET()) in the leaf
+// as the LSB in *PIndex.
+
+	case cJ1_JPFULLPOPU1:
+
+	    JU_SETDCD(*PIndex, Pjp, 1);
+	    SETOFFSET(offset, Count0, pop1lower, Pjp);
+	    assert(offset >= 0);
+	    assert(offset <= cJU_JPFULLPOPU1_POP0);
+	    JU_SETDIGIT1(*PIndex, offset);
+	    JU_RET_FOUND_FULLPOPU1;
+#endif
+
+
+// ----------------------------------------------------------------------------
+// IMMEDIATE:
+//
+// Locate the Index with the proper ordinal (see SETOFFSET()) in the Immediate,
+// depending on leaf Index Size and pop1.  Note:  There are no Dcd bytes in an
+// Immediate JP, but in a cJU_JPIMMED_*_01 JP, the field holds the least bytes
+// of the immediate Index.
+
+#define	SET_01(cState)  JU_SETDIGITS(*PIndex, JU_JPDCDPOP0(Pjp), cState)
+
+	case cJU_JPIMMED_1_01: SET_01(1); goto Imm_01;
+	case cJU_JPIMMED_2_01: SET_01(2); goto Imm_01;
+	case cJU_JPIMMED_3_01: SET_01(3); goto Imm_01;
+#ifdef JU_64BIT
+	case cJU_JPIMMED_4_01: SET_01(4); goto Imm_01;
+	case cJU_JPIMMED_5_01: SET_01(5); goto Imm_01;
+	case cJU_JPIMMED_6_01: SET_01(6); goto Imm_01;
+	case cJU_JPIMMED_7_01: SET_01(7); goto Imm_01;
+#endif
+
+Imm_01:
+
+	    DBGCODE(SETOFFSET_IMM_CK(offset, Count0, pop1lower, 1);)
+	    JU_RET_FOUND_IMM_01(Pjp);
+
+// Shorthand for where to find start of Index bytes array:
+
+#ifdef JUDY1
+#define	PJI (Pjp->jp_1Index)
+#else
+#define	PJI (Pjp->jp_LIndex)
+#endif
+
+// Optional code to check the remaining ordinal (see SETOFFSET_IMM()) against
+// the Index Size of the Immediate:
+
+#ifndef DEBUG				// simple placeholder:
+#define	IMM(cPop1,Next) \
+	goto Next
+#else					// extra pop1-specific checking:
+#define	IMM(cPop1,Next)						\
+	SETOFFSET_IMM_CK(offset, Count0, pop1lower, cPop1);	\
+	goto Next
+#endif
+
+	case cJU_JPIMMED_1_02: IMM( 2, Imm1);
+	case cJU_JPIMMED_1_03: IMM( 3, Imm1);
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_1_04: IMM( 4, Imm1);
+	case cJU_JPIMMED_1_05: IMM( 5, Imm1);
+	case cJU_JPIMMED_1_06: IMM( 6, Imm1);
+	case cJU_JPIMMED_1_07: IMM( 7, Imm1);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_1_08: IMM( 8, Imm1);
+	case cJ1_JPIMMED_1_09: IMM( 9, Imm1);
+	case cJ1_JPIMMED_1_10: IMM(10, Imm1);
+	case cJ1_JPIMMED_1_11: IMM(11, Imm1);
+	case cJ1_JPIMMED_1_12: IMM(12, Imm1);
+	case cJ1_JPIMMED_1_13: IMM(13, Imm1);
+	case cJ1_JPIMMED_1_14: IMM(14, Imm1);
+	case cJ1_JPIMMED_1_15: IMM(15, Imm1);
+#endif
+
+Imm1:	    SETOFFSET_IMM(offset, Count0, pop1lower);
+	    JU_SETDIGIT1(*PIndex, ((uint8_t *) PJI)[offset]);
+	    JU_RET_FOUND_IMM(Pjp, offset);
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_2_02: IMM(2, Imm2);
+	case cJU_JPIMMED_2_03: IMM(3, Imm2);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_2_04: IMM(4, Imm2);
+	case cJ1_JPIMMED_2_05: IMM(5, Imm2);
+	case cJ1_JPIMMED_2_06: IMM(6, Imm2);
+	case cJ1_JPIMMED_2_07: IMM(7, Imm2);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+Imm2:	    SETOFFSET_IMM(offset, Count0, pop1lower);
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(2)))
+		    | ((uint16_t *) PJI)[offset];
+	    JU_RET_FOUND_IMM(Pjp, offset);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_3_02: IMM(2, Imm3);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_3_03: IMM(3, Imm3);
+	case cJ1_JPIMMED_3_04: IMM(4, Imm3);
+	case cJ1_JPIMMED_3_05: IMM(5, Imm3);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+Imm3:
+	{
+	    Word_t lsb;
+	    SETOFFSET_IMM(offset, Count0, pop1lower);
+	    JU_COPY3_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (3 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(3))) | lsb;
+	    JU_RET_FOUND_IMM(Pjp, offset);
+	}
+#endif
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_4_02: IMM(2, Imm4);
+	case cJ1_JPIMMED_4_03: IMM(3, Imm4);
+
+Imm4:	    SETOFFSET_IMM(offset, Count0, pop1lower);
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(4)))
+		    | ((uint32_t *) PJI)[offset];
+	    JU_RET_FOUND_IMM(Pjp, offset);
+
+	case cJ1_JPIMMED_5_02: IMM(2, Imm5);
+	case cJ1_JPIMMED_5_03: IMM(3, Imm5);
+
+Imm5:
+	{
+	    Word_t lsb;
+	    SETOFFSET_IMM(offset, Count0, pop1lower);
+	    JU_COPY5_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (5 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(5))) | lsb;
+	    JU_RET_FOUND_IMM(Pjp, offset);
+	}
+
+	case cJ1_JPIMMED_6_02: IMM(2, Imm6);
+
+Imm6:
+	{
+	    Word_t lsb;
+	    SETOFFSET_IMM(offset, Count0, pop1lower);
+	    JU_COPY6_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (6 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(6))) | lsb;
+	    JU_RET_FOUND_IMM(Pjp, offset);
+	}
+
+	case cJ1_JPIMMED_7_02: IMM(2, Imm7);
+
+Imm7:
+	{
+	    Word_t lsb;
+	    SETOFFSET_IMM(offset, Count0, pop1lower);
+	    JU_COPY7_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (7 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(7))) | lsb;
+	    JU_RET_FOUND_IMM(Pjp, offset);
+	}
+#endif // (JUDY1 && JU_64BIT)
+
+
+// ----------------------------------------------------------------------------
+// UNEXPECTED JP TYPES:
+
+	default: JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		 JUDY1CODE(return(JERRI );)
+		 JUDYLCODE(return(PPJERR);)
+
+	} // SMByCount switch.
+
+	/*NOTREACHED*/
+
+} // Judy1ByCount() / JudyLByCount()
diff --git a/libs/klib/judy/JudyByCountWithDefs.c b/libs/klib/judy/JudyByCountWithDefs.c
new file mode 100644
index 0000000..b4ad243
--- /dev/null
+++ b/libs/klib/judy/JudyByCountWithDefs.c
@@ -0,0 +1,4 @@
+#define NOSMARTJBB 1
+#define NOSMARTJBU 1
+#define NOSMARTJLB 1
+#include "JudyByCount.c"
diff --git a/libs/klib/judy/JudyCascade.c b/libs/klib/judy/JudyCascade.c
new file mode 100644
index 0000000..fccb747
--- /dev/null
+++ b/libs/klib/judy/JudyCascade.c
@@ -0,0 +1,1940 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+extern int j__udyCreateBranchL(Pjp_t, Pjp_t, uint8_t *, Word_t, Pvoid_t);
+extern int j__udyCreateBranchB(Pjp_t, Pjp_t, uint8_t *, Word_t, Pvoid_t);
+
+DBGCODE(extern void JudyCheckSorted(Pjll_t Pjll, Word_t Pop1, long IndexSize);)
+
+static const jbb_t StageJBBZero;	// zeroed versions of namesake struct.
+
+// TBD:  There are multiple copies of (some of) these CopyWto3, Copy3toW,
+// CopyWto7 and Copy7toW functions in Judy1Cascade.c, JudyLCascade.c, and
+// JudyDecascade.c.  These static functions should probably be moved to a
+// common place, made macros, or something to avoid having four copies.
+
+
+// ****************************************************************************
+// __ J U D Y   C O P Y   X   T O   W
+
+
+FUNCTION static void j__udyCopy3toW(
+	PWord_t	  PDest,
+	uint8_t * PSrc,
+	Word_t	  LeafIndexes)
+{
+	do
+	{
+		JU_COPY3_PINDEX_TO_LONG(*PDest, PSrc);
+		PSrc	+= 3;
+		PDest	+= 1;
+
+	} while(--LeafIndexes);
+
+} //j__udyCopy3toW()
+
+
+#ifdef JU_64BIT
+
+FUNCTION static void j__udyCopy4toW(
+	PWord_t	   PDest,
+	uint32_t * PSrc,
+	Word_t	   LeafIndexes)
+{
+	do { *PDest++ = *PSrc++;
+	} while(--LeafIndexes);
+
+} // j__udyCopy4toW()
+
+
+FUNCTION static void j__udyCopy5toW(
+	PWord_t	  PDest,
+	uint8_t	* PSrc,
+	Word_t	  LeafIndexes)
+{
+	do
+	{
+		JU_COPY5_PINDEX_TO_LONG(*PDest, PSrc);
+		PSrc	+= 5;
+		PDest	+= 1;
+
+	} while(--LeafIndexes);
+
+} // j__udyCopy5toW()
+
+
+FUNCTION static void j__udyCopy6toW(
+	PWord_t	  PDest,
+	uint8_t	* PSrc,
+	Word_t	  LeafIndexes)
+{
+	do
+	{
+		JU_COPY6_PINDEX_TO_LONG(*PDest, PSrc);
+		PSrc	+= 6;
+		PDest	+= 1;
+
+	} while(--LeafIndexes);
+
+} // j__udyCopy6toW()
+
+
+FUNCTION static void j__udyCopy7toW(
+	PWord_t	  PDest,
+	uint8_t	* PSrc,
+	Word_t	  LeafIndexes)
+{
+	do
+	{
+		JU_COPY7_PINDEX_TO_LONG(*PDest, PSrc);
+		PSrc	+= 7;
+		PDest	+= 1;
+
+	} while(--LeafIndexes);
+
+} // j__udyCopy7toW()
+
+#endif // JU_64BIT
+
+
+// ****************************************************************************
+// __ J U D Y   C O P Y   W   T O   X
+
+
+FUNCTION static void j__udyCopyWto3(
+	uint8_t	* PDest,
+	PWord_t	  PSrc,
+	Word_t	  LeafIndexes)
+{
+	do
+	{
+		JU_COPY3_LONG_TO_PINDEX(PDest, *PSrc);
+		PSrc	+= 1;
+		PDest	+= 3;
+
+	} while(--LeafIndexes);
+
+} // j__udyCopyWto3()
+
+
+#ifdef JU_64BIT
+
+FUNCTION static void j__udyCopyWto4(
+	uint8_t	* PDest,
+	PWord_t	  PSrc,
+	Word_t	  LeafIndexes)
+{
+	uint32_t *PDest32 = (uint32_t *)PDest;
+
+	do
+	{
+		*PDest32 = *PSrc;
+		PSrc	+= 1;
+		PDest32	+= 1;
+	} while(--LeafIndexes);
+
+} // j__udyCopyWto4()
+
+
+FUNCTION static void j__udyCopyWto5(
+	uint8_t	* PDest,
+	PWord_t	  PSrc,
+	Word_t	  LeafIndexes)
+{
+	do
+	{
+		JU_COPY5_LONG_TO_PINDEX(PDest, *PSrc);
+		PSrc	+= 1;
+		PDest	+= 5;
+
+	} while(--LeafIndexes);
+
+} // j__udyCopyWto5()
+
+
+FUNCTION static void j__udyCopyWto6(
+	uint8_t	* PDest,
+	PWord_t	  PSrc,
+	Word_t	  LeafIndexes)
+{
+	do
+	{
+		JU_COPY6_LONG_TO_PINDEX(PDest, *PSrc);
+		PSrc	+= 1;
+		PDest	+= 6;
+
+	} while(--LeafIndexes);
+
+} // j__udyCopyWto6()
+
+
+FUNCTION static void j__udyCopyWto7(
+	uint8_t	* PDest,
+	PWord_t	  PSrc,
+	Word_t	  LeafIndexes)
+{
+	do
+	{
+		JU_COPY7_LONG_TO_PINDEX(PDest, *PSrc);
+		PSrc	+= 1;
+		PDest	+= 7;
+
+	} while(--LeafIndexes);
+
+} // j__udyCopyWto7()
+
+#endif // JU_64BIT
+
+
+// ****************************************************************************
+// COMMON CODE (MACROS):
+//
+// Free objects in an array of valid JPs, StageJP[ExpCnt] == last one may
+// include Immeds, which are ignored.
+
+#define FREEALLEXIT(ExpCnt,StageJP,Pjpm)				\
+	{								\
+	    Word_t _expct = (ExpCnt);					\
+	    while (_expct--) j__udyFreeSM(&((StageJP)[_expct]), Pjpm);  \
+	    return(-1);                                                 \
+	}
+
+// Clear the array that keeps track of the number of JPs in a subexpanse:
+
+#define ZEROJP(SubJPCount)                                              \
+	{								\
+		int ii;							\
+		for (ii = 0; ii < cJU_NUMSUBEXPB; ii++) (SubJPCount[ii]) = 0; \
+	}
+
+// ****************************************************************************
+// __ J U D Y   S T A G E   J B B   T O   J B B
+//
+// Create a mallocd BranchB (jbb_t) from a staged BranchB while "splaying" a
+// single old leaf.  Return -1 if out of memory, otherwise 1.
+
+static int j__udyStageJBBtoJBB(
+	Pjp_t     PjpLeaf,	// JP of leaf being splayed.
+	Pjbb_t    PStageJBB,	// temp jbb_t on stack.
+	Pjp_t     PjpArray,	// array of JPs to splayed new leaves.
+	uint8_t * PSubCount,	// count of JPs for each subexpanse.
+	Pjpm_t    Pjpm)		// the jpm_t for JudyAlloc*().
+{
+	Pjbb_t    PjbbRaw;	// pointer to new bitmap branch.
+	Pjbb_t    Pjbb;
+	Word_t    subexp;
+
+// Get memory for new BranchB:
+
+	if ((PjbbRaw = j__udyAllocJBB(Pjpm)) == (Pjbb_t) NULL) return(-1);
+	Pjbb = P_JBB(PjbbRaw);
+
+// Copy staged BranchB into just-allocated BranchB:
+
+	*Pjbb = *PStageJBB;
+
+// Allocate the JP subarrays (BJP) for the new BranchB:
+
+	for (subexp = 0; subexp < cJU_NUMSUBEXPB; subexp++)
+	{
+	    Pjp_t  PjpRaw;
+	    Pjp_t  Pjp;
+	    Word_t NumJP;       // number of JPs in each subexpanse.
+
+	    if ((NumJP = PSubCount[subexp]) == 0) continue;	// empty.
+
+// Out of memory, back out previous allocations:
+
+	    if ((PjpRaw = j__udyAllocJBBJP(NumJP, Pjpm)) == (Pjp_t) NULL)
+	    {
+		while(subexp--)
+		{
+		    if ((NumJP = PSubCount[subexp]) == 0) continue;
+
+		    PjpRaw = JU_JBB_PJP(Pjbb, subexp);
+		    j__udyFreeJBBJP(PjpRaw, NumJP, Pjpm);
+		}
+		j__udyFreeJBB(PjbbRaw, Pjpm);
+		return(-1);	// out of memory.
+	    }
+	    Pjp = P_JP(PjpRaw);
+
+// Place the JP subarray pointer in the new BranchB, copy subarray JPs, and
+// advance to the next subexpanse:
+
+	    JU_JBB_PJP(Pjbb, subexp) = PjpRaw;
+	    JU_COPYMEM(Pjp, PjpArray, NumJP);
+	    PjpArray += NumJP;
+
+	} // for each subexpanse.
+
+// Change the PjpLeaf from Leaf to BranchB:
+
+	PjpLeaf->jp_Addr  = (Word_t) PjbbRaw;
+	PjpLeaf->jp_Type += cJU_JPBRANCH_B2 - cJU_JPLEAF2;  // Leaf to BranchB.
+
+	return(1);
+
+} // j__udyStageJBBtoJBB()
+
+
+// ****************************************************************************
+// __ J U D Y   J L L 2   T O   J L B 1
+//
+// Create a LeafB1 (jlb_t = JLB1) from a Leaf2 (2-byte Indexes and for JudyL,
+// Word_t Values).  Return NULL if out of memory, else a pointer to the new
+// LeafB1.
+//
+// NOTE:  Caller must release the Leaf2 that was passed in.
+
+FUNCTION static Pjlb_t j__udyJLL2toJLB1(
+	uint16_t * Pjll,	// array of 16-bit indexes.
+#ifdef JUDYL
+	Pjv_t      Pjv,		// array of associated values.
+#endif
+	Word_t     LeafPop1,	// number of indexes/values.
+	Pvoid_t    Pjpm)	// jpm_t for JudyAlloc*()/JudyFree*().
+{
+	Pjlb_t     PjlbRaw;
+	Pjlb_t     Pjlb;
+	int	   offset;
+JUDYLCODE(int	   subexp;)
+
+// Allocate the LeafB1:
+
+	if ((PjlbRaw = j__udyAllocJLB1(Pjpm)) == (Pjlb_t) NULL)
+	    return((Pjlb_t) NULL);
+	Pjlb = P_JLB(PjlbRaw);
+
+// Copy Leaf2 indexes to LeafB1:
+
+	for (offset = 0; offset < LeafPop1; ++offset)
+	    JU_BITMAPSETL(Pjlb, Pjll[offset]);
+
+#ifdef JUDYL
+
+// Build LeafVs from bitmap:
+
+	for (subexp = 0; subexp < cJU_NUMSUBEXPL; ++subexp)
+	{
+	    struct _POINTER_VALUES
+	    {
+		Word_t pv_Pop1;		// size of value area.
+		Pjv_t  pv_Pjv;		// raw pointer to value area.
+	    } pv[cJU_NUMSUBEXPL];
+
+// Get the population of the subexpanse, and if any, allocate a LeafV:
+
+	    pv[subexp].pv_Pop1 = j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, subexp));
+
+	    if (pv[subexp].pv_Pop1)
+	    {
+		Pjv_t Pjvnew;
+
+// TBD:  There is an opportunity to put pop == 1 value in pointer:
+
+		pv[subexp].pv_Pjv = j__udyLAllocJV(pv[subexp].pv_Pop1, Pjpm);
+
+// Upon out of memory, free all previously allocated:
+
+		if (pv[subexp].pv_Pjv == (Pjv_t) NULL)
+		{
+		    while(subexp--)
+		    {
+			if (pv[subexp].pv_Pop1)
+			{
+			    j__udyLFreeJV(pv[subexp].pv_Pjv, pv[subexp].pv_Pop1,
+					  Pjpm);
+			}
+		    }
+		    j__udyFreeJLB1(PjlbRaw, Pjpm);
+		    return((Pjlb_t) NULL);
+		}
+
+		Pjvnew = P_JV(pv[subexp].pv_Pjv);
+		JU_COPYMEM(Pjvnew, Pjv, pv[subexp].pv_Pop1);
+		Pjv += pv[subexp].pv_Pop1;	// advance value pointer.
+
+// Place raw pointer to value array in bitmap subexpanse:
+
+		JL_JLB_PVALUE(Pjlb, subexp) = pv[subexp].pv_Pjv;
+
+	    } // populated subexpanse.
+	} // each subexpanse.
+
+#endif // JUDYL
+
+	return(PjlbRaw);	// pointer to LeafB1.
+
+} // j__udyJLL2toJLB1()
+
+
+// ****************************************************************************
+// __ J U D Y   C A S C A D E 1
+//
+// Create bitmap leaf from 1-byte Indexes and Word_t Values.
+//
+// TBD:  There must be a better way.
+//
+// Only for JudyL 32 bit:  (note, unifdef disallows comment on next line)
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+
+FUNCTION int j__udyCascade1(
+	Pjp_t	   Pjp,
+	Pvoid_t    Pjpm)
+{
+        Word_t     DcdP0;
+	uint8_t	 * PLeaf;
+	Pjlb_t	   PjlbRaw;
+	Pjlb_t	   Pjlb;
+	Word_t     Pop1;
+	Word_t     ii;		// temp for loop counter
+JUDYLCODE(Pjv_t	   Pjv;)
+
+	assert(JU_JPTYPE(Pjp) == cJU_JPLEAF1);
+	assert((JU_JPDCDPOP0(Pjp) & 0xFF) == (cJU_LEAF1_MAXPOP1-1));
+
+	PjlbRaw = j__udyAllocJLB1(Pjpm);
+	if (PjlbRaw == (Pjlb_t) NULL) return(-1);
+
+	Pjlb  = P_JLB(PjlbRaw);
+	PLeaf = (uint8_t *) P_JLL(Pjp->jp_Addr);
+	Pop1  = JU_JPLEAF_POP0(Pjp) + 1;
+
+	JUDYLCODE(Pjv = JL_LEAF1VALUEAREA(PLeaf, Pop1);)
+
+//	Copy 1 byte index Leaf to bitmap Leaf
+	for (ii = 0; ii < Pop1; ii++) JU_BITMAPSETL(Pjlb, PLeaf[ii]);
+
+#ifdef JUDYL
+//	Build 8 subexpanse Value leaves from bitmap
+	for (ii = 0; ii < cJU_NUMSUBEXPL; ii++)
+	{
+//	    Get number of Indexes in subexpanse
+	    if ((Pop1 = j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, ii))))
+	    {
+		Pjv_t PjvnewRaw;	// value area of new leaf.
+		Pjv_t Pjvnew;
+
+		PjvnewRaw = j__udyLAllocJV(Pop1, Pjpm);
+		if (PjvnewRaw == (Pjv_t) NULL)	// out of memory.
+		{
+//                  Free prevously allocated LeafVs:
+		    while(ii--)
+		    {
+			if ((Pop1 = j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, ii))))
+			{
+			    PjvnewRaw = JL_JLB_PVALUE(Pjlb, ii);
+			    j__udyLFreeJV(PjvnewRaw, Pop1, Pjpm);
+			}
+		    }
+//                  Free the bitmap leaf
+		    j__udyLFreeJLB1(PjlbRaw,Pjpm);
+		    return(-1);
+		}
+		Pjvnew    = P_JV(PjvnewRaw);
+		JU_COPYMEM(Pjvnew, Pjv, Pop1);
+
+		Pjv += Pop1;
+		JL_JLB_PVALUE(Pjlb, ii) = PjvnewRaw;
+	    }
+	}
+#endif // JUDYL
+
+	DcdP0 = JU_JPDCDPOP0(Pjp) | (PLeaf[0] & cJU_DCDMASK(1));
+        JU_JPSETADT(Pjp, (Word_t)PjlbRaw, DcdP0, cJU_JPLEAF_B1);
+
+	return(1);	// return success
+
+} // j__udyCascade1()
+
+#endif // (!(JUDY1 && JU_64BIT))
+
+
+// ****************************************************************************
+// __ J U D Y   C A S C A D E 2
+//
+// Entry PLeaf of size LeafPop1 is either compressed or splayed with pointer
+// returned in Pjp.  Entry Levels sizeof(Word_t) down to level 2.
+//
+// Splay or compress the 2-byte Index Leaf that Pjp point to.  Return *Pjp as a
+// (compressed) cJU_LEAFB1 or a cJU_BRANCH_*2
+
+FUNCTION int j__udyCascade2(
+	Pjp_t	   Pjp,
+	Pvoid_t	   Pjpm)
+{
+	uint16_t * PLeaf;	// pointer to leaf, explicit type.
+	Word_t	   End, Start;	// temporaries.
+	Word_t	   ExpCnt;	// count of expanses of splay.
+	Word_t     CIndex;	// current Index word.
+JUDYLCODE(Pjv_t	   Pjv;)	// value area of leaf.
+
+//	Temp staging for parts(Leaves) of newly splayed leaf
+	jp_t	   StageJP   [cJU_LEAF2_MAXPOP1];  // JPs of new leaves
+	uint8_t	   StageExp  [cJU_LEAF2_MAXPOP1];  // Expanses of new leaves
+	uint8_t	   SubJPCount[cJU_NUMSUBEXPB];     // JPs in each subexpanse
+	jbb_t      StageJBB;                       // staged bitmap branch
+
+	assert(JU_JPTYPE(Pjp) == cJU_JPLEAF2);
+	assert((JU_JPDCDPOP0(Pjp) & 0xFFFF) == (cJU_LEAF2_MAXPOP1-1));
+
+//	Get the address of the Leaf
+	PLeaf = (uint16_t *) P_JLL(Pjp->jp_Addr);
+
+//	And its Value area
+	JUDYLCODE(Pjv = JL_LEAF2VALUEAREA(PLeaf, cJU_LEAF2_MAXPOP1);)
+
+//  If Leaf is in 1 expanse -- just compress it to a Bitmap Leaf
+
+	CIndex = PLeaf[0];
+	if (!JU_DIGITATSTATE(CIndex ^ PLeaf[cJU_LEAF2_MAXPOP1-1], 2))
+	{
+//	cJU_JPLEAF_B1
+                Word_t DcdP0;
+		Pjlb_t PjlbRaw;
+		PjlbRaw = j__udyJLL2toJLB1(PLeaf,
+#ifdef JUDYL
+				     Pjv,
+#endif
+				     cJU_LEAF2_MAXPOP1, Pjpm);
+		if (PjlbRaw == (Pjlb_t)NULL) return(-1);  // out of memory
+
+//		Merge in another Dcd byte because compressing
+		DcdP0 = (CIndex & cJU_DCDMASK(1)) | JU_JPDCDPOP0(Pjp);
+                JU_JPSETADT(Pjp, (Word_t)PjlbRaw, DcdP0, cJU_JPLEAF_B1);
+
+		return(1);
+	}
+
+//  Else in 2+ expanses, splay Leaf into smaller leaves at higher compression
+
+	StageJBB = StageJBBZero;       // zero staged bitmap branch
+	ZEROJP(SubJPCount);
+
+//	Splay the 2 byte index Leaf to 1 byte Index Leaves
+	for (ExpCnt = Start = 0, End = 1; ; End++)
+	{
+//		Check if new expanse or last one
+		if (	(End == cJU_LEAF2_MAXPOP1)
+				||
+			(JU_DIGITATSTATE(CIndex ^ PLeaf[End], 2))
+		   )
+		{
+//			Build a leaf below the previous expanse
+//
+			Pjp_t  PjpJP	= StageJP + ExpCnt;
+			Word_t Pop1	= End - Start;
+			Word_t expanse = JU_DIGITATSTATE(CIndex, 2);
+			Word_t subexp  = expanse / cJU_BITSPERSUBEXPB;
+//
+//                      set the bit that is the current expanse
+			JU_JBB_BITMAP(&StageJBB, subexp) |= JU_BITPOSMASKB(expanse);
+#ifdef SUBEXPCOUNTS
+			StageJBB.jbb_subPop1[subexp] += Pop1; // pop of subexpanse
+#endif
+//                      count number of expanses in each subexpanse
+			SubJPCount[subexp]++;
+
+//			Save byte expanse of leaf
+			StageExp[ExpCnt] = JU_DIGITATSTATE(CIndex, 2);
+
+			if (Pop1 == 1)	// cJU_JPIMMED_1_01
+			{
+	                    Word_t DcdP0;
+	                    DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(1)) |
+                                CIndex;
+#ifdef JUDY1
+                            JU_JPSETADT(PjpJP, 0, DcdP0, cJ1_JPIMMED_1_01);
+#else   // JUDYL
+                            JU_JPSETADT(PjpJP, Pjv[Start], DcdP0, 
+                                cJL_JPIMMED_1_01);
+#endif  // JUDYL
+			}
+			else if (Pop1 <= cJU_IMMED1_MAXPOP1) // bigger
+			{
+//		cJL_JPIMMED_1_02..3:  JudyL 32
+//		cJ1_JPIMMED_1_02..7:  Judy1 32
+//		cJL_JPIMMED_1_02..7:  JudyL 64
+//		cJ1_JPIMMED_1_02..15: Judy1 64
+#ifdef JUDYL
+				Pjv_t  PjvnewRaw;	// value area of leaf.
+				Pjv_t  Pjvnew;
+
+//				Allocate Value area for Immediate Leaf
+				PjvnewRaw = j__udyLAllocJV(Pop1, Pjpm);
+				if (PjvnewRaw == (Pjv_t) NULL)
+					FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+				Pjvnew = P_JV(PjvnewRaw);
+
+//				Copy to Values to Value Leaf
+				JU_COPYMEM(Pjvnew, Pjv + Start, Pop1);
+				PjpJP->jp_Addr = (Word_t) PjvnewRaw;
+
+//				Copy to JP as an immediate Leaf
+				JU_COPYMEM(PjpJP->jp_LIndex, PLeaf + Start,
+					   Pop1);
+#else
+				JU_COPYMEM(PjpJP->jp_1Index, PLeaf + Start,
+					   Pop1);
+#endif
+//				Set Type, Population and Index size
+				PjpJP->jp_Type = cJU_JPIMMED_1_02 + Pop1 - 2;
+			}
+
+// 64Bit Judy1 does not have Leaf1:  (note, unifdef disallows comment on next
+// line)
+
+#if (! (defined(JUDY1) && defined(JU_64BIT)))
+			else if (Pop1 <= cJU_LEAF1_MAXPOP1) // still bigger
+			{
+//		cJU_JPLEAF1
+                                Word_t  DcdP0;
+				Pjll_t PjllRaw;	 // pointer to new leaf.
+				Pjll_t Pjll;
+		      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new leaf.
+
+//				Get a new Leaf
+				PjllRaw = j__udyAllocJLL1(Pop1, Pjpm);
+				if (PjllRaw == (Pjll_t)NULL)
+					FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+				Pjll = P_JLL(PjllRaw);
+#ifdef JUDYL
+//				Copy to Values to new Leaf
+				Pjvnew = JL_LEAF1VALUEAREA(Pjll, Pop1);
+				JU_COPYMEM(Pjvnew, Pjv + Start, Pop1);
+#endif
+//				Copy Indexes to new Leaf
+				JU_COPYMEM((uint8_t *)Pjll, PLeaf+Start, Pop1);
+
+				DBGCODE(JudyCheckSorted(Pjll, Pop1, 1);)
+
+                                DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(2)) 
+                                                |
+                                        (CIndex & cJU_DCDMASK(2-1))
+                                                |
+                                        (Pop1 - 1);
+
+                                JU_JPSETADT(PjpJP, (Word_t)PjllRaw, DcdP0,
+                                        cJU_JPLEAF1);
+			}
+#endif //  (!(JUDY1 && JU_64BIT)) // Not 64Bit Judy1
+
+			else				// biggest
+			{
+//		cJU_JPLEAF_B1
+                                Word_t  DcdP0;
+				Pjlb_t PjlbRaw;
+				PjlbRaw = j__udyJLL2toJLB1(
+						PLeaf + Start,
+#ifdef JUDYL
+						Pjv + Start,
+#endif
+						Pop1, Pjpm);
+				if (PjlbRaw == (Pjlb_t)NULL)
+					FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+                                DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(2)) 
+                                                |
+                                        (CIndex & cJU_DCDMASK(2-1)) 
+                                                |
+                                        (Pop1 - 1);
+
+                                JU_JPSETADT(PjpJP, (Word_t)PjlbRaw, DcdP0,
+                                        cJU_JPLEAF_B1);
+			}
+			ExpCnt++;
+//                      Done?
+			if (End == cJU_LEAF2_MAXPOP1) break;
+
+//			New Expanse, Start and Count
+			CIndex = PLeaf[End];
+			Start  = End;
+		}
+	}
+
+//      Now put all the Leaves below a BranchL or BranchB:
+	if (ExpCnt <= cJU_BRANCHLMAXJPS) // put the Leaves below a BranchL
+	{
+	    if (j__udyCreateBranchL(Pjp, StageJP, StageExp, ExpCnt,
+			Pjpm) == -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+	    Pjp->jp_Type = cJU_JPBRANCH_L2;
+	}
+	else
+	{
+	    if (j__udyStageJBBtoJBB(Pjp, &StageJBB, StageJP, SubJPCount, Pjpm)
+		== -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+	}
+	return(1);
+
+} // j__udyCascade2()
+
+
+// ****************************************************************************
+// __ J U D Y   C A S C A D E 3
+//
+// Return *Pjp as a (compressed) cJU_LEAF2, cJU_BRANCH_L3, cJU_BRANCH_B3.
+
+FUNCTION int j__udyCascade3(
+	Pjp_t	   Pjp,
+	Pvoid_t	   Pjpm)
+{
+	uint8_t  * PLeaf;	// pointer to leaf, explicit type.
+	Word_t	   End, Start;	// temporaries.
+	Word_t	   ExpCnt;	// count of expanses of splay.
+	Word_t     CIndex;	// current Index word.
+JUDYLCODE(Pjv_t	   Pjv;)	// value area of leaf.
+
+//	Temp staging for parts(Leaves) of newly splayed leaf
+	jp_t	   StageJP   [cJU_LEAF3_MAXPOP1];  // JPs of new leaves
+	Word_t	   StageA    [cJU_LEAF3_MAXPOP1];
+	uint8_t	   StageExp  [cJU_LEAF3_MAXPOP1];  // Expanses of new leaves
+	uint8_t	   SubJPCount[cJU_NUMSUBEXPB];     // JPs in each subexpanse
+	jbb_t      StageJBB;                       // staged bitmap branch
+
+	assert(JU_JPTYPE(Pjp) == cJU_JPLEAF3);
+	assert((JU_JPDCDPOP0(Pjp) & 0xFFFFFF) == (cJU_LEAF3_MAXPOP1-1));
+
+//	Get the address of the Leaf
+	PLeaf = (uint8_t *) P_JLL(Pjp->jp_Addr);
+
+//	Extract leaf to Word_t and insert-sort Index into it
+	j__udyCopy3toW(StageA, PLeaf, cJU_LEAF3_MAXPOP1);
+
+//	Get the address of the Leaf and Value area
+	JUDYLCODE(Pjv = JL_LEAF3VALUEAREA(PLeaf, cJU_LEAF3_MAXPOP1);)
+
+//  If Leaf is in 1 expanse -- just compress it (compare 1st, last & Index)
+
+	CIndex = StageA[0];
+	if (!JU_DIGITATSTATE(CIndex ^ StageA[cJU_LEAF3_MAXPOP1-1], 3))
+	{
+                Word_t DcdP0;
+		Pjll_t PjllRaw;	 // pointer to new leaf.
+		Pjll_t Pjll;
+      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new leaf.
+
+//		Alloc a 2 byte Index Leaf
+		PjllRaw	= j__udyAllocJLL2(cJU_LEAF3_MAXPOP1, Pjpm);
+		if (PjllRaw == (Pjlb_t)NULL) return(-1);  // out of memory
+
+		Pjll = P_JLL(PjllRaw);
+
+//		Copy just 2 bytes Indexes to new Leaf
+//		j__udyCopyWto2((uint16_t *) Pjll, StageA, cJU_LEAF3_MAXPOP1);
+		JU_COPYMEM    ((uint16_t *) Pjll, StageA, cJU_LEAF3_MAXPOP1);
+#ifdef JUDYL
+//		Copy Value area into new Leaf
+		Pjvnew = JL_LEAF2VALUEAREA(Pjll, cJU_LEAF3_MAXPOP1);
+		JU_COPYMEM(Pjvnew, Pjv, cJU_LEAF3_MAXPOP1);
+#endif
+		DBGCODE(JudyCheckSorted(Pjll, cJU_LEAF3_MAXPOP1, 2);)
+
+//		Form new JP, Pop0 field is unchanged
+//		Add in another Dcd byte because compressing
+                DcdP0 = (CIndex & cJU_DCDMASK(2)) | JU_JPDCDPOP0(Pjp);
+
+                JU_JPSETADT(Pjp, (Word_t) PjllRaw, DcdP0, cJU_JPLEAF2);
+
+		return(1); // Success
+	}
+
+//  Else in 2+ expanses, splay Leaf into smaller leaves at higher compression
+
+	StageJBB = StageJBBZero;       // zero staged bitmap branch
+	ZEROJP(SubJPCount);
+
+//	Splay the 3 byte index Leaf to 2 byte Index Leaves
+	for (ExpCnt = Start = 0, End = 1; ; End++)
+	{
+//		Check if new expanse or last one
+		if (	(End == cJU_LEAF3_MAXPOP1)
+				||
+			(JU_DIGITATSTATE(CIndex ^ StageA[End], 3))
+		   )
+		{
+//			Build a leaf below the previous expanse
+
+			Pjp_t  PjpJP	= StageJP + ExpCnt;
+			Word_t Pop1	= End - Start;
+			Word_t expanse = JU_DIGITATSTATE(CIndex, 3);
+			Word_t subexp  = expanse / cJU_BITSPERSUBEXPB;
+//
+//                      set the bit that is the current expanse
+			JU_JBB_BITMAP(&StageJBB, subexp) |= JU_BITPOSMASKB(expanse);
+#ifdef SUBEXPCOUNTS
+			StageJBB.jbb_subPop1[subexp] += Pop1; // pop of subexpanse
+#endif
+//                      count number of expanses in each subexpanse
+			SubJPCount[subexp]++;
+
+//			Save byte expanse of leaf
+			StageExp[ExpCnt] = JU_DIGITATSTATE(CIndex, 3);
+
+			if (Pop1 == 1)	// cJU_JPIMMED_2_01
+			{
+	                    Word_t DcdP0;
+	                    DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(2)) |
+                                CIndex;
+#ifdef JUDY1
+                            JU_JPSETADT(PjpJP, 0, DcdP0, cJ1_JPIMMED_2_01);
+#else   // JUDYL
+                            JU_JPSETADT(PjpJP, Pjv[Start], DcdP0, 
+                                cJL_JPIMMED_2_01);
+#endif  // JUDYL
+			}
+#if (defined(JUDY1) || defined(JU_64BIT))
+			else if (Pop1 <= cJU_IMMED2_MAXPOP1)
+			{
+//		cJ1_JPIMMED_2_02..3:  Judy1 32
+//		cJL_JPIMMED_2_02..3:  JudyL 64
+//		cJ1_JPIMMED_2_02..7:  Judy1 64
+#ifdef JUDYL
+//				Alloc is 1st in case of malloc fail
+				Pjv_t PjvnewRaw;  // value area of new leaf.
+				Pjv_t Pjvnew;
+
+//				Allocate Value area for Immediate Leaf
+				PjvnewRaw = j__udyLAllocJV(Pop1, Pjpm);
+				if (PjvnewRaw == (Pjv_t) NULL)
+					FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+				Pjvnew = P_JV(PjvnewRaw);
+
+//				Copy to Values to Value Leaf
+				JU_COPYMEM(Pjvnew, Pjv + Start, Pop1);
+
+				PjpJP->jp_Addr = (Word_t) PjvnewRaw;
+
+//				Copy to Index to JP as an immediate Leaf
+				JU_COPYMEM((uint16_t *) (PjpJP->jp_LIndex),
+					   StageA + Start, Pop1);
+#else // JUDY1
+				JU_COPYMEM((uint16_t *) (PjpJP->jp_1Index),
+					   StageA + Start, Pop1);
+#endif // JUDY1
+//				Set Type, Population and Index size
+				PjpJP->jp_Type = cJU_JPIMMED_2_02 + Pop1 - 2;
+			}
+#endif // (JUDY1 || JU_64BIT)
+
+			else	// Make a linear leaf2
+			{
+//		cJU_JPLEAF2
+                                Word_t  DcdP0;
+				Pjll_t PjllRaw;	 // pointer to new leaf.
+				Pjll_t Pjll;
+		      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new leaf.
+
+				PjllRaw = j__udyAllocJLL2(Pop1, Pjpm);
+				if (PjllRaw == (Pjll_t) NULL)
+					FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+				Pjll = P_JLL(PjllRaw);
+#ifdef JUDYL
+//				Copy to Values to new Leaf
+				Pjvnew = JL_LEAF2VALUEAREA(Pjll, Pop1);
+				JU_COPYMEM(Pjvnew, Pjv + Start, Pop1);
+#endif
+//				Copy least 2 bytes per Index of Leaf to new Leaf
+				JU_COPYMEM((uint16_t *) Pjll, StageA+Start,
+					   Pop1);
+
+				DBGCODE(JudyCheckSorted(Pjll, Pop1, 2);)
+
+                                DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(3)) 
+                                                |
+                                        (CIndex & cJU_DCDMASK(3-1)) 
+                                                |
+                                        (Pop1 - 1);
+
+                                JU_JPSETADT(PjpJP, (Word_t)PjllRaw, DcdP0,
+                                        cJU_JPLEAF2);
+			}
+			ExpCnt++;
+//                      Done?
+			if (End == cJU_LEAF3_MAXPOP1) break;
+
+//			New Expanse, Start and Count
+			CIndex = StageA[End];
+			Start  = End;
+		}
+	}
+
+//      Now put all the Leaves below a BranchL or BranchB:
+	if (ExpCnt <= cJU_BRANCHLMAXJPS) // put the Leaves below a BranchL
+	{
+	    if (j__udyCreateBranchL(Pjp, StageJP, StageExp, ExpCnt,
+			Pjpm) == -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+	    Pjp->jp_Type = cJU_JPBRANCH_L3;
+	}
+	else
+	{
+	    if (j__udyStageJBBtoJBB(Pjp, &StageJBB, StageJP, SubJPCount, Pjpm)
+		== -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+	}
+	return(1);
+
+} // j__udyCascade3()
+
+
+#ifdef JU_64BIT   // JudyCascade[4567]
+
+// ****************************************************************************
+// __ J U D Y   C A S C A D E 4
+//
+// Cascade from a cJU_JPLEAF4 to one of the following:
+//  1. if leaf is in 1 expanse:
+//        compress it into a JPLEAF3
+//  2. if leaf contains multiple expanses:
+//        create linear or bitmap branch containing
+//        each new expanse is either a:
+//               JPIMMED_3_01  branch
+//               JPIMMED_3_02  branch
+//               JPLEAF3
+
+FUNCTION int j__udyCascade4(
+	Pjp_t	   Pjp,
+	Pvoid_t	   Pjpm)
+{
+	uint32_t * PLeaf;	// pointer to leaf, explicit type.
+	Word_t	   End, Start;	// temporaries.
+	Word_t	   ExpCnt;	// count of expanses of splay.
+	Word_t     CIndex;	// current Index word.
+JUDYLCODE(Pjv_t	   Pjv;)	// value area of leaf.
+
+//	Temp staging for parts(Leaves) of newly splayed leaf
+	jp_t	   StageJP   [cJU_LEAF4_MAXPOP1];  // JPs of new leaves
+	Word_t	   StageA    [cJU_LEAF4_MAXPOP1];
+	uint8_t	   StageExp  [cJU_LEAF4_MAXPOP1];  // Expanses of new leaves
+	uint8_t	   SubJPCount[cJU_NUMSUBEXPB];     // JPs in each subexpanse
+	jbb_t      StageJBB;                       // staged bitmap branch
+
+	assert(JU_JPTYPE(Pjp) == cJU_JPLEAF4);
+	assert((JU_JPDCDPOP0(Pjp) & 0xFFFFFFFF) == (cJU_LEAF4_MAXPOP1-1));
+
+//	Get the address of the Leaf
+	PLeaf = (uint32_t *) P_JLL(Pjp->jp_Addr);
+
+//	Extract 4 byte index Leaf to Word_t
+	j__udyCopy4toW(StageA, PLeaf, cJU_LEAF4_MAXPOP1);
+
+//	Get the address of the Leaf and Value area
+	JUDYLCODE(Pjv = JL_LEAF4VALUEAREA(PLeaf, cJU_LEAF4_MAXPOP1);)
+
+//  If Leaf is in 1 expanse -- just compress it (compare 1st, last & Index)
+
+	CIndex = StageA[0];
+	if (!JU_DIGITATSTATE(CIndex ^ StageA[cJU_LEAF4_MAXPOP1-1], 4))
+	{
+                Word_t DcdP0;
+		Pjll_t PjllRaw;	 // pointer to new leaf.
+		Pjll_t Pjll;
+      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new Leaf.
+
+//		Alloc a 3 byte Index Leaf
+		PjllRaw = j__udyAllocJLL3(cJU_LEAF4_MAXPOP1, Pjpm);
+		if (PjllRaw == (Pjlb_t)NULL) return(-1);  // out of memory
+
+		Pjll = P_JLL(PjllRaw);
+
+//		Copy Index area into new Leaf
+		j__udyCopyWto3((uint8_t *) Pjll, StageA, cJU_LEAF4_MAXPOP1);
+#ifdef JUDYL
+//		Copy Value area into new Leaf
+		Pjvnew = JL_LEAF3VALUEAREA(Pjll, cJU_LEAF4_MAXPOP1);
+		JU_COPYMEM(Pjvnew, Pjv, cJU_LEAF4_MAXPOP1);
+#endif
+		DBGCODE(JudyCheckSorted(Pjll, cJU_LEAF4_MAXPOP1, 3);)
+
+	        DcdP0 = JU_JPDCDPOP0(Pjp) | (CIndex & cJU_DCDMASK(3));
+                JU_JPSETADT(Pjp, (Word_t)PjllRaw, DcdP0, cJU_JPLEAF3);
+
+		return(1);
+	}
+
+//  Else in 2+ expanses, splay Leaf into smaller leaves at higher compression
+
+	StageJBB = StageJBBZero;       // zero staged bitmap branch
+	ZEROJP(SubJPCount);
+
+//	Splay the 4 byte index Leaf to 3 byte Index Leaves
+	for (ExpCnt = Start = 0, End = 1; ; End++)
+	{
+//		Check if new expanse or last one
+		if (	(End == cJU_LEAF4_MAXPOP1)
+				||
+			(JU_DIGITATSTATE(CIndex ^ StageA[End], 4))
+		   )
+		{
+//			Build a leaf below the previous expanse
+
+			Pjp_t  PjpJP	= StageJP + ExpCnt;
+			Word_t Pop1	= End - Start;
+			Word_t expanse = JU_DIGITATSTATE(CIndex, 4);
+			Word_t subexp  = expanse / cJU_BITSPERSUBEXPB;
+//
+//                      set the bit that is the current expanse
+			JU_JBB_BITMAP(&StageJBB, subexp) |= JU_BITPOSMASKB(expanse);
+#ifdef SUBEXPCOUNTS
+			StageJBB.jbb_subPop1[subexp] += Pop1; // pop of subexpanse
+#endif
+//                      count number of expanses in each subexpanse
+			SubJPCount[subexp]++;
+
+//			Save byte expanse of leaf
+			StageExp[ExpCnt] = JU_DIGITATSTATE(CIndex, 4);
+
+			if (Pop1 == 1)	// cJU_JPIMMED_3_01
+			{
+	                    Word_t DcdP0;
+	                    DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(3)) |
+                                CIndex;
+#ifdef JUDY1
+                            JU_JPSETADT(PjpJP, 0, DcdP0, cJ1_JPIMMED_3_01);
+#else   // JUDYL
+                            JU_JPSETADT(PjpJP, Pjv[Start], DcdP0,
+                                cJL_JPIMMED_3_01);
+#endif  // JUDYL
+			}
+			else if (Pop1 <= cJU_IMMED3_MAXPOP1)
+			{
+//		cJ1_JPIMMED_3_02   :  Judy1 32
+//		cJL_JPIMMED_3_02   :  JudyL 64
+//		cJ1_JPIMMED_3_02..5:  Judy1 64
+
+#ifdef JUDYL
+//				Alloc is 1st in case of malloc fail
+				Pjv_t PjvnewRaw;  // value area of new leaf.
+				Pjv_t Pjvnew;
+
+//				Allocate Value area for Immediate Leaf
+				PjvnewRaw = j__udyLAllocJV(Pop1, Pjpm);
+				if (PjvnewRaw == (Pjv_t) NULL)
+					FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+				Pjvnew = P_JV(PjvnewRaw);
+
+//				Copy to Values to Value Leaf
+				JU_COPYMEM(Pjvnew, Pjv + Start, Pop1);
+				PjpJP->jp_Addr = (Word_t) PjvnewRaw;
+
+//				Copy to Index to JP as an immediate Leaf
+				j__udyCopyWto3(PjpJP->jp_LIndex,
+					       StageA + Start, Pop1);
+#else
+				j__udyCopyWto3(PjpJP->jp_1Index,
+					       StageA + Start, Pop1);
+#endif
+//				Set type, population and Index size
+				PjpJP->jp_Type = cJU_JPIMMED_3_02 + Pop1 - 2;
+			}
+			else
+			{
+//		cJU_JPLEAF3
+                                Word_t  DcdP0;
+				Pjll_t PjllRaw;	 // pointer to new leaf.
+				Pjll_t Pjll;
+		      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new leaf.
+
+				PjllRaw = j__udyAllocJLL3(Pop1, Pjpm);
+				if (PjllRaw == (Pjll_t)NULL)
+					FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+				Pjll = P_JLL(PjllRaw);
+
+//				Copy Indexes to new Leaf
+				j__udyCopyWto3((uint8_t *) Pjll, StageA + Start,
+					       Pop1);
+#ifdef JUDYL
+//				Copy to Values to new Leaf
+				Pjvnew = JL_LEAF3VALUEAREA(Pjll, Pop1);
+				JU_COPYMEM(Pjvnew, Pjv + Start, Pop1);
+#endif
+				DBGCODE(JudyCheckSorted(Pjll, Pop1, 3);)
+
+                                DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(4)) 
+                                                |
+                                        (CIndex & cJU_DCDMASK(4-1)) 
+                                                |
+                                        (Pop1 - 1);
+
+                                JU_JPSETADT(PjpJP, (Word_t)PjllRaw, DcdP0,
+                                        cJU_JPLEAF3);
+			}
+			ExpCnt++;
+//                      Done?
+			if (End == cJU_LEAF4_MAXPOP1) break;
+
+//			New Expanse, Start and Count
+			CIndex = StageA[End];
+			Start  = End;
+		}
+	}
+
+//      Now put all the Leaves below a BranchL or BranchB:
+	if (ExpCnt <= cJU_BRANCHLMAXJPS) // put the Leaves below a BranchL
+	{
+	    if (j__udyCreateBranchL(Pjp, StageJP, StageExp, ExpCnt,
+			Pjpm) == -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+	    Pjp->jp_Type = cJU_JPBRANCH_L4;
+	}
+	else
+	{
+	    if (j__udyStageJBBtoJBB(Pjp, &StageJBB, StageJP, SubJPCount, Pjpm)
+		== -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+	}
+	return(1);
+
+}  // j__udyCascade4()
+
+
+// ****************************************************************************
+// __ J U D Y   C A S C A D E 5
+//
+// Cascade from a cJU_JPLEAF5 to one of the following:
+//  1. if leaf is in 1 expanse:
+//        compress it into a JPLEAF4
+//  2. if leaf contains multiple expanses:
+//        create linear or bitmap branch containing
+//        each new expanse is either a:
+//               JPIMMED_4_01  branch
+//               JPLEAF4
+
+FUNCTION int j__udyCascade5(
+	Pjp_t	   Pjp,
+	Pvoid_t	   Pjpm)
+{
+	uint8_t  * PLeaf;	// pointer to leaf, explicit type.
+	Word_t	   End, Start;	// temporaries.
+	Word_t	   ExpCnt;	// count of expanses of splay.
+	Word_t     CIndex;	// current Index word.
+JUDYLCODE(Pjv_t	   Pjv;)	// value area of leaf.
+
+//	Temp staging for parts(Leaves) of newly splayed leaf
+	jp_t	   StageJP   [cJU_LEAF5_MAXPOP1];  // JPs of new leaves
+	Word_t	   StageA    [cJU_LEAF5_MAXPOP1];
+	uint8_t	   StageExp  [cJU_LEAF5_MAXPOP1];  // Expanses of new leaves
+	uint8_t	   SubJPCount[cJU_NUMSUBEXPB];     // JPs in each subexpanse
+	jbb_t      StageJBB;                       // staged bitmap branch
+
+	assert(JU_JPTYPE(Pjp) == cJU_JPLEAF5);
+	assert((JU_JPDCDPOP0(Pjp) & 0xFFFFFFFFFF) == (cJU_LEAF5_MAXPOP1-1));
+
+//	Get the address of the Leaf
+	PLeaf = (uint8_t *) P_JLL(Pjp->jp_Addr);
+
+//	Extract 5 byte index Leaf to Word_t
+	j__udyCopy5toW(StageA, PLeaf, cJU_LEAF5_MAXPOP1);
+
+//	Get the address of the Leaf and Value area
+	JUDYLCODE(Pjv = JL_LEAF5VALUEAREA(PLeaf, cJU_LEAF5_MAXPOP1);)
+
+//  If Leaf is in 1 expanse -- just compress it (compare 1st, last & Index)
+
+	CIndex = StageA[0];
+	if (!JU_DIGITATSTATE(CIndex ^ StageA[cJU_LEAF5_MAXPOP1-1], 5))
+	{
+                Word_t DcdP0;
+		Pjll_t PjllRaw;	 // pointer to new leaf.
+		Pjll_t Pjll;
+      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new leaf.
+
+//		Alloc a 4 byte Index Leaf
+		PjllRaw = j__udyAllocJLL4(cJU_LEAF5_MAXPOP1, Pjpm);
+		if (PjllRaw == (Pjlb_t)NULL) return(-1);  // out of memory
+
+		Pjll = P_JLL(PjllRaw);
+
+//		Copy Index area into new Leaf
+		j__udyCopyWto4((uint8_t *) Pjll, StageA, cJU_LEAF5_MAXPOP1);
+#ifdef JUDYL
+//		Copy Value area into new Leaf
+		Pjvnew = JL_LEAF4VALUEAREA(Pjll, cJU_LEAF5_MAXPOP1);
+		JU_COPYMEM(Pjvnew, Pjv, cJU_LEAF5_MAXPOP1);
+#endif
+		DBGCODE(JudyCheckSorted(Pjll, cJU_LEAF5_MAXPOP1, 4);)
+
+	        DcdP0 = JU_JPDCDPOP0(Pjp) | (CIndex & cJU_DCDMASK(4));
+                JU_JPSETADT(Pjp, (Word_t)PjllRaw, DcdP0, cJU_JPLEAF4);
+
+		return(1);
+	}
+
+//  Else in 2+ expanses, splay Leaf into smaller leaves at higher compression
+
+	StageJBB = StageJBBZero;       // zero staged bitmap branch
+	ZEROJP(SubJPCount);
+
+//	Splay the 5 byte index Leaf to 4 byte Index Leaves
+	for (ExpCnt = Start = 0, End = 1; ; End++)
+	{
+//		Check if new expanse or last one
+		if (	(End == cJU_LEAF5_MAXPOP1)
+				||
+			(JU_DIGITATSTATE(CIndex ^ StageA[End], 5))
+		   )
+		{
+//			Build a leaf below the previous expanse
+
+			Pjp_t  PjpJP	= StageJP + ExpCnt;
+			Word_t Pop1	= End - Start;
+			Word_t expanse = JU_DIGITATSTATE(CIndex, 5);
+			Word_t subexp  = expanse / cJU_BITSPERSUBEXPB;
+//
+//                      set the bit that is the current expanse
+			JU_JBB_BITMAP(&StageJBB, subexp) |= JU_BITPOSMASKB(expanse);
+#ifdef SUBEXPCOUNTS
+			StageJBB.jbb_subPop1[subexp] += Pop1; // pop of subexpanse
+#endif
+//                      count number of expanses in each subexpanse
+			SubJPCount[subexp]++;
+
+//			Save byte expanse of leaf
+			StageExp[ExpCnt] = JU_DIGITATSTATE(CIndex, 5);
+
+			if (Pop1 == 1)	// cJU_JPIMMED_4_01
+			{
+	                    Word_t DcdP0;
+	                    DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(4)) |
+                                CIndex;
+#ifdef JUDY1
+                            JU_JPSETADT(PjpJP, 0, DcdP0, cJ1_JPIMMED_4_01);
+#else   // JUDYL
+                            JU_JPSETADT(PjpJP, Pjv[Start], DcdP0,
+                                cJL_JPIMMED_4_01);
+#endif  // JUDYL
+			}
+#ifdef JUDY1
+			else if (Pop1 <= cJ1_IMMED4_MAXPOP1)
+			{
+//		cJ1_JPIMMED_4_02..3: Judy1 64
+
+//                              Copy to Index to JP as an immediate Leaf
+				j__udyCopyWto4(PjpJP->jp_1Index,
+					       StageA + Start, Pop1);
+
+//                              Set pointer, type, population and Index size
+				PjpJP->jp_Type = cJ1_JPIMMED_4_02 + Pop1 - 2;
+			}
+#endif
+			else
+			{
+//		cJU_JPLEAF4
+                                Word_t  DcdP0;
+				Pjll_t PjllRaw;	 // pointer to new leaf.
+				Pjll_t Pjll;
+		      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new leaf.
+
+//				Get a new Leaf
+				PjllRaw = j__udyAllocJLL4(Pop1, Pjpm);
+				if (PjllRaw == (Pjll_t)NULL)
+					FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+				Pjll = P_JLL(PjllRaw);
+
+//				Copy Indexes to new Leaf
+				j__udyCopyWto4((uint8_t *) Pjll, StageA + Start,
+					       Pop1);
+#ifdef JUDYL
+//				Copy to Values to new Leaf
+				Pjvnew = JL_LEAF4VALUEAREA(Pjll, Pop1);
+				JU_COPYMEM(Pjvnew, Pjv + Start, Pop1);
+#endif
+				DBGCODE(JudyCheckSorted(Pjll, Pop1, 4);)
+
+                                DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(5)) 
+                                                |
+                                        (CIndex & cJU_DCDMASK(5-1)) 
+                                                |
+                                        (Pop1 - 1);
+
+                                JU_JPSETADT(PjpJP, (Word_t)PjllRaw, DcdP0,
+                                        cJU_JPLEAF4);
+			}
+			ExpCnt++;
+//                      Done?
+			if (End == cJU_LEAF5_MAXPOP1) break;
+
+//			New Expanse, Start and Count
+			CIndex = StageA[End];
+			Start  = End;
+		}
+	}
+
+//      Now put all the Leaves below a BranchL or BranchB:
+	if (ExpCnt <= cJU_BRANCHLMAXJPS) // put the Leaves below a BranchL
+	{
+	    if (j__udyCreateBranchL(Pjp, StageJP, StageExp, ExpCnt,
+			Pjpm) == -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+	    Pjp->jp_Type = cJU_JPBRANCH_L5;
+	}
+	else
+	{
+	    if (j__udyStageJBBtoJBB(Pjp, &StageJBB, StageJP, SubJPCount, Pjpm)
+		== -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+	}
+	return(1);
+
+}  // j__udyCascade5()
+
+
+// ****************************************************************************
+// __ J U D Y   C A S C A D E 6
+//
+// Cascade from a cJU_JPLEAF6 to one of the following:
+//  1. if leaf is in 1 expanse:
+//        compress it into a JPLEAF5
+//  2. if leaf contains multiple expanses:
+//        create linear or bitmap branch containing
+//        each new expanse is either a:
+//               JPIMMED_5_01 ... JPIMMED_5_03  branch
+//               JPIMMED_5_01  branch
+//               JPLEAF5
+
+FUNCTION int j__udyCascade6(
+	Pjp_t	   Pjp,
+	Pvoid_t	   Pjpm)
+{
+	uint8_t  * PLeaf;	// pointer to leaf, explicit type.
+	Word_t	   End, Start;	// temporaries.
+	Word_t	   ExpCnt;	// count of expanses of splay.
+	Word_t     CIndex;	// current Index word.
+JUDYLCODE(Pjv_t	   Pjv;)	// value area of leaf.
+
+//	Temp staging for parts(Leaves) of newly splayed leaf
+	jp_t	   StageJP   [cJU_LEAF6_MAXPOP1];  // JPs of new leaves
+	Word_t	   StageA    [cJU_LEAF6_MAXPOP1];
+	uint8_t	   StageExp  [cJU_LEAF6_MAXPOP1];  // Expanses of new leaves
+	uint8_t	   SubJPCount[cJU_NUMSUBEXPB];     // JPs in each subexpanse
+	jbb_t      StageJBB;                       // staged bitmap branch
+
+	assert(JU_JPTYPE(Pjp) == cJU_JPLEAF6);
+	assert((JU_JPDCDPOP0(Pjp) & 0xFFFFFFFFFFFF) == (cJU_LEAF6_MAXPOP1-1));
+
+//	Get the address of the Leaf
+	PLeaf = (uint8_t *) P_JLL(Pjp->jp_Addr);
+
+//	Extract 6 byte index Leaf to Word_t
+	j__udyCopy6toW(StageA, PLeaf, cJU_LEAF6_MAXPOP1);
+
+//	Get the address of the Leaf and Value area
+	JUDYLCODE(Pjv = JL_LEAF6VALUEAREA(PLeaf, cJU_LEAF6_MAXPOP1);)
+
+//  If Leaf is in 1 expanse -- just compress it (compare 1st, last & Index)
+
+	CIndex = StageA[0];
+	if (!JU_DIGITATSTATE(CIndex ^ StageA[cJU_LEAF6_MAXPOP1-1], 6))
+	{
+                Word_t DcdP0;
+		Pjll_t PjllRaw;	 // pointer to new leaf.
+		Pjll_t Pjll;
+      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new leaf.
+
+//		Alloc a 5 byte Index Leaf
+		PjllRaw = j__udyAllocJLL5(cJU_LEAF6_MAXPOP1, Pjpm);
+		if (PjllRaw == (Pjlb_t)NULL) return(-1);  // out of memory
+
+		Pjll = P_JLL(PjllRaw);
+
+//		Copy Index area into new Leaf
+		j__udyCopyWto5((uint8_t *) Pjll, StageA, cJU_LEAF6_MAXPOP1);
+#ifdef JUDYL
+//		Copy Value area into new Leaf
+		Pjvnew = JL_LEAF5VALUEAREA(Pjll, cJU_LEAF6_MAXPOP1);
+		JU_COPYMEM(Pjvnew, Pjv, cJU_LEAF6_MAXPOP1);
+#endif
+		DBGCODE(JudyCheckSorted(Pjll, cJU_LEAF6_MAXPOP1, 5);)
+
+	        DcdP0 = JU_JPDCDPOP0(Pjp) | (CIndex & cJU_DCDMASK(5));
+                JU_JPSETADT(Pjp, (Word_t)PjllRaw, DcdP0, cJU_JPLEAF5);
+
+		return(1);
+	}
+
+//  Else in 2+ expanses, splay Leaf into smaller leaves at higher compression
+
+	StageJBB = StageJBBZero;       // zero staged bitmap branch
+	ZEROJP(SubJPCount);
+
+//	Splay the 6 byte index Leaf to 5 byte Index Leaves
+	for (ExpCnt = Start = 0, End = 1; ; End++)
+	{
+//		Check if new expanse or last one
+		if (	(End == cJU_LEAF6_MAXPOP1)
+				||
+			(JU_DIGITATSTATE(CIndex ^ StageA[End], 6))
+		   )
+		{
+//			Build a leaf below the previous expanse
+
+			Pjp_t  PjpJP	= StageJP + ExpCnt;
+			Word_t Pop1	= End - Start;
+			Word_t expanse = JU_DIGITATSTATE(CIndex, 6);
+			Word_t subexp  = expanse / cJU_BITSPERSUBEXPB;
+//
+//                      set the bit that is the current expanse
+			JU_JBB_BITMAP(&StageJBB, subexp) |= JU_BITPOSMASKB(expanse);
+#ifdef SUBEXPCOUNTS
+			StageJBB.jbb_subPop1[subexp] += Pop1; // pop of subexpanse
+#endif
+//                      count number of expanses in each subexpanse
+			SubJPCount[subexp]++;
+
+//			Save byte expanse of leaf
+			StageExp[ExpCnt] = JU_DIGITATSTATE(CIndex, 6);
+
+			if (Pop1 == 1)	// cJU_JPIMMED_5_01
+			{
+	                    Word_t DcdP0;
+	                    DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(5)) |
+                                CIndex;
+#ifdef JUDY1
+                            JU_JPSETADT(PjpJP, 0, DcdP0, cJ1_JPIMMED_5_01);
+#else   // JUDYL
+                            JU_JPSETADT(PjpJP, Pjv[Start], DcdP0,
+                                cJL_JPIMMED_5_01);
+#endif  // JUDYL
+			}
+#ifdef JUDY1
+			else if (Pop1 <= cJ1_IMMED5_MAXPOP1)
+			{
+//		cJ1_JPIMMED_5_02..3: Judy1 64
+
+//                              Copy to Index to JP as an immediate Leaf
+				j__udyCopyWto5(PjpJP->jp_1Index,
+					       StageA + Start, Pop1);
+
+//                              Set pointer, type, population and Index size
+				PjpJP->jp_Type = cJ1_JPIMMED_5_02 + Pop1 - 2;
+			}
+#endif
+			else
+			{
+//		cJU_JPLEAF5
+                                Word_t  DcdP0;
+				Pjll_t PjllRaw;	 // pointer to new leaf.
+				Pjll_t Pjll;
+		      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new leaf.
+
+//				Get a new Leaf
+				PjllRaw = j__udyAllocJLL5(Pop1, Pjpm);
+				if (PjllRaw == (Pjll_t)NULL)
+					FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+				Pjll = P_JLL(PjllRaw);
+
+//				Copy Indexes to new Leaf
+				j__udyCopyWto5((uint8_t *) Pjll, StageA + Start,
+					       Pop1);
+
+//				Copy to Values to new Leaf
+#ifdef JUDYL
+				Pjvnew = JL_LEAF5VALUEAREA(Pjll, Pop1);
+				JU_COPYMEM(Pjvnew, Pjv + Start, Pop1);
+#endif
+				DBGCODE(JudyCheckSorted(Pjll, Pop1, 5);)
+
+                                DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(6)) 
+                                                |
+                                        (CIndex & cJU_DCDMASK(6-1)) 
+                                                |
+                                        (Pop1 - 1);
+
+                                JU_JPSETADT(PjpJP, (Word_t)PjllRaw, DcdP0,
+                                        cJU_JPLEAF5);
+			}
+			ExpCnt++;
+//                      Done?
+			if (End == cJU_LEAF6_MAXPOP1) break;
+
+//			New Expanse, Start and Count
+			CIndex = StageA[End];
+			Start  = End;
+		}
+	}
+
+//      Now put all the Leaves below a BranchL or BranchB:
+	if (ExpCnt <= cJU_BRANCHLMAXJPS) // put the Leaves below a BranchL
+	{
+	    if (j__udyCreateBranchL(Pjp, StageJP, StageExp, ExpCnt,
+			Pjpm) == -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+	    Pjp->jp_Type = cJU_JPBRANCH_L6;
+	}
+	else
+	{
+	    if (j__udyStageJBBtoJBB(Pjp, &StageJBB, StageJP, SubJPCount, Pjpm)
+		== -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+	}
+	return(1);
+
+}  // j__udyCascade6()
+
+
+// ****************************************************************************
+// __ J U D Y   C A S C A D E 7
+//
+// Cascade from a cJU_JPLEAF7 to one of the following:
+//  1. if leaf is in 1 expanse:
+//        compress it into a JPLEAF6
+//  2. if leaf contains multiple expanses:
+//        create linear or bitmap branch containing
+//        each new expanse is either a:
+//               JPIMMED_6_01 ... JPIMMED_6_02  branch
+//               JPIMMED_6_01  branch
+//               JPLEAF6
+
+FUNCTION int j__udyCascade7(
+	Pjp_t	   Pjp,
+	Pvoid_t	   Pjpm)
+{
+	uint8_t  * PLeaf;	// pointer to leaf, explicit type.
+	Word_t	   End, Start;	// temporaries.
+	Word_t	   ExpCnt;	// count of expanses of splay.
+	Word_t     CIndex;	// current Index word.
+JUDYLCODE(Pjv_t	   Pjv;)	// value area of leaf.
+
+//	Temp staging for parts(Leaves) of newly splayed leaf
+	jp_t	   StageJP   [cJU_LEAF7_MAXPOP1];  // JPs of new leaves
+	Word_t	   StageA    [cJU_LEAF7_MAXPOP1];
+	uint8_t	   StageExp  [cJU_LEAF7_MAXPOP1];  // Expanses of new leaves
+	uint8_t	   SubJPCount[cJU_NUMSUBEXPB];     // JPs in each subexpanse
+	jbb_t      StageJBB;                       // staged bitmap branch
+
+	assert(JU_JPTYPE(Pjp) == cJU_JPLEAF7);
+	assert(JU_JPDCDPOP0(Pjp) == (cJU_LEAF7_MAXPOP1-1));
+
+//	Get the address of the Leaf
+	PLeaf = (uint8_t *) P_JLL(Pjp->jp_Addr);
+
+//	Extract 7 byte index Leaf to Word_t
+	j__udyCopy7toW(StageA, PLeaf, cJU_LEAF7_MAXPOP1);
+
+//	Get the address of the Leaf and Value area
+	JUDYLCODE(Pjv = JL_LEAF7VALUEAREA(PLeaf, cJU_LEAF7_MAXPOP1);)
+
+//  If Leaf is in 1 expanse -- just compress it (compare 1st, last & Index)
+
+	CIndex = StageA[0];
+	if (!JU_DIGITATSTATE(CIndex ^ StageA[cJU_LEAF7_MAXPOP1-1], 7))
+	{
+                Word_t DcdP0;
+		Pjll_t PjllRaw;	 // pointer to new leaf.
+		Pjll_t Pjll;
+      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new leaf.
+
+//		Alloc a 6 byte Index Leaf
+		PjllRaw = j__udyAllocJLL6(cJU_LEAF7_MAXPOP1, Pjpm);
+		if (PjllRaw == (Pjlb_t)NULL) return(-1);  // out of memory
+
+		Pjll = P_JLL(PjllRaw);
+
+//		Copy Index area into new Leaf
+		j__udyCopyWto6((uint8_t *) Pjll, StageA, cJU_LEAF7_MAXPOP1);
+#ifdef JUDYL
+//		Copy Value area into new Leaf
+		Pjvnew = JL_LEAF6VALUEAREA(Pjll, cJU_LEAF7_MAXPOP1);
+		JU_COPYMEM(Pjvnew, Pjv, cJU_LEAF7_MAXPOP1);
+#endif
+		DBGCODE(JudyCheckSorted(Pjll, cJU_LEAF7_MAXPOP1, 6);)
+
+	        DcdP0 = JU_JPDCDPOP0(Pjp) | (CIndex & cJU_DCDMASK(6));
+                JU_JPSETADT(Pjp, (Word_t)PjllRaw, DcdP0, cJU_JPLEAF6);
+
+		return(1);
+	}
+
+//  Else in 2+ expanses, splay Leaf into smaller leaves at higher compression
+
+	StageJBB = StageJBBZero;       // zero staged bitmap branch
+	ZEROJP(SubJPCount);
+
+//	Splay the 7 byte index Leaf to 6 byte Index Leaves
+	for (ExpCnt = Start = 0, End = 1; ; End++)
+	{
+//		Check if new expanse or last one
+		if (	(End == cJU_LEAF7_MAXPOP1)
+				||
+			(JU_DIGITATSTATE(CIndex ^ StageA[End], 7))
+		   )
+		{
+//			Build a leaf below the previous expanse
+
+			Pjp_t  PjpJP	= StageJP + ExpCnt;
+			Word_t Pop1	= End - Start;
+			Word_t expanse = JU_DIGITATSTATE(CIndex, 7);
+			Word_t subexp  = expanse / cJU_BITSPERSUBEXPB;
+//
+//                      set the bit that is the current expanse
+			JU_JBB_BITMAP(&StageJBB, subexp) |= JU_BITPOSMASKB(expanse);
+#ifdef SUBEXPCOUNTS
+			StageJBB.jbb_subPop1[subexp] += Pop1; // pop of subexpanse
+#endif
+//                      count number of expanses in each subexpanse
+			SubJPCount[subexp]++;
+
+//			Save byte expanse of leaf
+			StageExp[ExpCnt] = JU_DIGITATSTATE(CIndex, 7);
+
+			if (Pop1 == 1)	// cJU_JPIMMED_6_01
+			{
+	                    Word_t DcdP0;
+	                    DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(6)) |
+                                CIndex;
+#ifdef JUDY1
+                            JU_JPSETADT(PjpJP, 0, DcdP0, cJ1_JPIMMED_6_01);
+#else   // JUDYL
+                            JU_JPSETADT(PjpJP, Pjv[Start], DcdP0,
+                                cJL_JPIMMED_6_01);
+#endif  // JUDYL
+			}
+#ifdef JUDY1
+			else if (Pop1 == cJ1_IMMED6_MAXPOP1)
+			{
+//		cJ1_JPIMMED_6_02:    Judy1 64
+
+//                              Copy to Index to JP as an immediate Leaf
+				j__udyCopyWto6(PjpJP->jp_1Index,
+					       StageA + Start, 2);
+
+//                              Set pointer, type, population and Index size
+				PjpJP->jp_Type = cJ1_JPIMMED_6_02;
+			}
+#endif
+			else
+			{
+//		cJU_JPLEAF6
+                                Word_t  DcdP0;
+				Pjll_t PjllRaw;	 // pointer to new leaf.
+				Pjll_t Pjll;
+		      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new leaf.
+
+//				Get a new Leaf
+				PjllRaw = j__udyAllocJLL6(Pop1, Pjpm);
+				if (PjllRaw == (Pjll_t)NULL)
+					FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+				Pjll = P_JLL(PjllRaw);
+
+//				Copy Indexes to new Leaf
+				j__udyCopyWto6((uint8_t *) Pjll, StageA + Start,
+					       Pop1);
+#ifdef JUDYL
+//				Copy to Values to new Leaf
+				Pjvnew = JL_LEAF6VALUEAREA(Pjll, Pop1);
+				JU_COPYMEM(Pjvnew, Pjv + Start, Pop1);
+#endif
+				DBGCODE(JudyCheckSorted(Pjll, Pop1, 6);)
+
+                                DcdP0 = (JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(7)) 
+                                                |
+                                        (CIndex & cJU_DCDMASK(7-1)) 
+                                                |
+                                        (Pop1 - 1);
+
+                                JU_JPSETADT(PjpJP, (Word_t)PjllRaw, DcdP0,
+                                        cJU_JPLEAF6);
+			}
+			ExpCnt++;
+//                      Done?
+			if (End == cJU_LEAF7_MAXPOP1) break;
+
+//			New Expanse, Start and Count
+			CIndex = StageA[End];
+			Start  = End;
+		}
+	}
+
+//      Now put all the Leaves below a BranchL or BranchB:
+	if (ExpCnt <= cJU_BRANCHLMAXJPS) // put the Leaves below a BranchL
+	{
+	    if (j__udyCreateBranchL(Pjp, StageJP, StageExp, ExpCnt,
+			Pjpm) == -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+	    Pjp->jp_Type = cJU_JPBRANCH_L7;
+	}
+	else
+	{
+	    if (j__udyStageJBBtoJBB(Pjp, &StageJBB, StageJP, SubJPCount, Pjpm)
+		== -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+	}
+	return(1);
+
+}  // j__udyCascade7()
+
+#endif // JU_64BIT
+
+
+// ****************************************************************************
+// __ J U D Y   C A S C A D E   L
+//
+// (Compressed) cJU_LEAF3[7], cJ1_JPBRANCH_L.
+//
+// Cascade from a LEAFW (under Pjp) to one of the following:
+//  1. if LEAFW is in 1 expanse:
+//        create linear branch with a JPLEAF3[7] under it
+//  2. LEAFW contains multiple expanses:
+//        create linear or bitmap branch containing new expanses
+//        each new expanse is either a: 32   64
+//               JPIMMED_3_01  branch    Y    N
+//               JPIMMED_7_01  branch    N    Y
+//               JPLEAF3                 Y    N
+//               JPLEAF7                 N    Y
+
+FUNCTION int j__udyCascadeL(
+	Pjp_t	   Pjp,
+	Pvoid_t	   Pjpm)
+{
+	Pjlw_t	   Pjlw;	// leaf to work on.
+	Word_t	   End, Start;	// temporaries.
+	Word_t	   ExpCnt;	// count of expanses of splay.
+	Word_t	   CIndex;	// current Index word.
+JUDYLCODE(Pjv_t	   Pjv;)	// value area of leaf.
+
+//	Temp staging for parts(Leaves) of newly splayed leaf
+	jp_t	StageJP [cJU_LEAFW_MAXPOP1];
+	uint8_t	StageExp[cJU_LEAFW_MAXPOP1];
+	uint8_t	   SubJPCount[cJU_NUMSUBEXPB];     // JPs in each subexpanse
+	jbb_t      StageJBB;                       // staged bitmap branch
+
+//	Get the address of the Leaf
+	Pjlw = P_JLW(Pjp->jp_Addr);
+
+	assert(Pjlw[0] == (cJU_LEAFW_MAXPOP1 - 1));
+
+//	Get pointer to Value area of old Leaf
+	JUDYLCODE(Pjv = JL_LEAFWVALUEAREA(Pjlw, cJU_LEAFW_MAXPOP1);)
+
+	Pjlw++;		// Now point to Index area
+
+// If Leaf is in 1 expanse -- first compress it (compare 1st, last & Index):
+
+	CIndex = Pjlw[0];	// also used far below
+	if (!JU_DIGITATSTATE(CIndex ^ Pjlw[cJU_LEAFW_MAXPOP1 - 1],
+			     cJU_ROOTSTATE))
+	{
+		Pjll_t PjllRaw;		// pointer to new leaf.
+		Pjll_t Pjll;
+      JUDYLCODE(Pjv_t  Pjvnew;)		// value area of new leaf.
+
+//		Get the common expanse to all elements in Leaf
+		StageExp[0] = JU_DIGITATSTATE(CIndex, cJU_ROOTSTATE);
+
+//		Alloc a 3[7] byte Index Leaf
+#ifdef JU_64BIT
+		PjllRaw	= j__udyAllocJLL7(cJU_LEAFW_MAXPOP1, Pjpm);
+		if (PjllRaw == (Pjlb_t)NULL) return(-1);  // out of memory
+
+		Pjll = P_JLL(PjllRaw);
+
+//		Copy LEAFW to a cJU_JPLEAF7
+		j__udyCopyWto7((uint8_t *) Pjll, Pjlw, cJU_LEAFW_MAXPOP1);
+#ifdef JUDYL
+//		Get the Value area of new Leaf
+		Pjvnew = JL_LEAF7VALUEAREA(Pjll, cJU_LEAFW_MAXPOP1);
+		JU_COPYMEM(Pjvnew, Pjv, cJU_LEAFW_MAXPOP1);
+#endif
+		DBGCODE(JudyCheckSorted(Pjll, cJU_LEAFW_MAXPOP1, 7);)
+#else // 32 Bit
+		PjllRaw	= j__udyAllocJLL3(cJU_LEAFW_MAXPOP1, Pjpm);
+		if (PjllRaw == (Pjll_t) NULL) return(-1);
+
+		Pjll = P_JLL(PjllRaw);
+
+//		Copy LEAFW to a cJU_JPLEAF3
+		j__udyCopyWto3((uint8_t *) Pjll, Pjlw, cJU_LEAFW_MAXPOP1);
+#ifdef JUDYL
+//		Get the Value area of new Leaf
+		Pjvnew = JL_LEAF3VALUEAREA(Pjll, cJU_LEAFW_MAXPOP1);
+		JU_COPYMEM(Pjvnew, Pjv, cJU_LEAFW_MAXPOP1);
+#endif
+		DBGCODE(JudyCheckSorted(Pjll, cJU_LEAFW_MAXPOP1, 3);)
+#endif  // 32 Bit
+
+//		Following not needed because cJU_DCDMASK(3[7]) is == 0
+//////		StageJP[0].jp_DcdPopO	|= (CIndex & cJU_DCDMASK(3[7]));
+#ifdef JU_64BIT
+                JU_JPSETADT(&(StageJP[0]), (Word_t)PjllRaw, cJU_LEAFW_MAXPOP1-1,
+                                cJU_JPLEAF7);
+#else   // 32BIT
+                JU_JPSETADT(&(StageJP[0]), (Word_t)PjllRaw, cJU_LEAFW_MAXPOP1-1,
+                                cJU_JPLEAF3);
+#endif  // 32BIT
+//		Create a 1 element Linear branch
+		if (j__udyCreateBranchL(Pjp, StageJP, StageExp, 1, Pjpm) == -1)
+		    return(-1);
+
+//		Change the type of callers JP
+		Pjp->jp_Type = cJU_JPBRANCH_L;
+
+		return(1);
+	}
+
+//  Else in 2+ expanses, splay Leaf into smaller leaves at higher compression
+
+	StageJBB = StageJBBZero;       // zero staged bitmap branch
+	ZEROJP(SubJPCount);
+
+//	Splay the 4[8] byte Index Leaf to 3[7] byte Index Leaves
+	for (ExpCnt = Start = 0, End = 1; ; End++)
+	{
+//		Check if new expanse or last one
+		if (	(End == cJU_LEAFW_MAXPOP1)
+				||
+			(JU_DIGITATSTATE(CIndex ^ Pjlw[End], cJU_ROOTSTATE))
+		   )
+		{
+//			Build a leaf below the previous expanse
+
+			Pjp_t  PjpJP	= StageJP + ExpCnt;
+			Word_t Pop1	= End - Start;
+			Word_t expanse = JU_DIGITATSTATE(CIndex, cJU_ROOTSTATE);
+			Word_t subexp  = expanse / cJU_BITSPERSUBEXPB;
+//
+//                      set the bit that is the current expanse
+			JU_JBB_BITMAP(&StageJBB, subexp) |= JU_BITPOSMASKB(expanse);
+#ifdef SUBEXPCOUNTS
+			StageJBB.jbb_subPop1[subexp] += Pop1; // pop of subexpanse
+#endif
+//                      count number of expanses in each subexpanse
+			SubJPCount[subexp]++;
+
+//			Save byte expanse of leaf
+			StageExp[ExpCnt] = JU_DIGITATSTATE(CIndex,
+							   cJU_ROOTSTATE);
+
+			if (Pop1 == 1)	// cJU_JPIMMED_3[7]_01
+			{
+#ifdef  JU_64BIT
+#ifdef JUDY1
+                            JU_JPSETADT(PjpJP, 0, CIndex, cJ1_JPIMMED_7_01);
+#else   // JUDYL
+                            JU_JPSETADT(PjpJP, Pjv[Start], CIndex,
+                                cJL_JPIMMED_7_01);
+#endif  // JUDYL
+
+#else   // JU_32BIT
+#ifdef JUDY1
+                            JU_JPSETADT(PjpJP, 0, CIndex, cJ1_JPIMMED_3_01);
+#else   // JUDYL
+                            JU_JPSETADT(PjpJP, Pjv[Start], CIndex,
+                                cJL_JPIMMED_3_01);
+#endif  // JUDYL
+#endif  // JU_32BIT
+			}
+#ifdef JUDY1
+#ifdef  JU_64BIT
+			else if (Pop1 <= cJ1_IMMED7_MAXPOP1)
+#else
+			else if (Pop1 <= cJ1_IMMED3_MAXPOP1)
+#endif
+			{
+//		cJ1_JPIMMED_3_02   :  Judy1 32
+//		cJ1_JPIMMED_7_02   :  Judy1 64
+//                              Copy to JP as an immediate Leaf
+#ifdef  JU_64BIT
+				j__udyCopyWto7(PjpJP->jp_1Index, Pjlw+Start, 2);
+				PjpJP->jp_Type = cJ1_JPIMMED_7_02;
+#else
+				j__udyCopyWto3(PjpJP->jp_1Index, Pjlw+Start, 2);
+				PjpJP->jp_Type = cJ1_JPIMMED_3_02;
+#endif // 32 Bit
+			}
+#endif // JUDY1
+			else // Linear Leaf JPLEAF3[7]
+			{
+//		cJU_JPLEAF3[7]
+				Pjll_t PjllRaw;	 // pointer to new leaf.
+				Pjll_t Pjll;
+		      JUDYLCODE(Pjv_t  Pjvnew;)	 // value area of new leaf.
+#ifdef JU_64BIT
+				PjllRaw = j__udyAllocJLL7(Pop1, Pjpm);
+				if (PjllRaw == (Pjll_t) NULL) return(-1);
+				Pjll = P_JLL(PjllRaw);
+
+				j__udyCopyWto7((uint8_t *) Pjll, Pjlw + Start,
+					       Pop1);
+#ifdef JUDYL
+				Pjvnew = JL_LEAF7VALUEAREA(Pjll, Pop1);
+				JU_COPYMEM(Pjvnew, Pjv + Start, Pop1);
+#endif // JUDYL
+				DBGCODE(JudyCheckSorted(Pjll, Pop1, 7);)
+#else // JU_64BIT - 32 Bit
+				PjllRaw = j__udyAllocJLL3(Pop1, Pjpm);
+				if (PjllRaw == (Pjll_t) NULL) return(-1);
+				Pjll = P_JLL(PjllRaw);
+
+				j__udyCopyWto3((uint8_t *) Pjll, Pjlw + Start,
+					       Pop1);
+#ifdef JUDYL
+				Pjvnew = JL_LEAF3VALUEAREA(Pjll, Pop1);
+				JU_COPYMEM(Pjvnew, Pjv + Start, Pop1);
+#endif // JUDYL
+				DBGCODE(JudyCheckSorted(Pjll, Pop1, 3);)
+#endif // 32 Bit
+
+#ifdef JU_64BIT
+                                JU_JPSETADT(PjpJP, (Word_t)PjllRaw, Pop1 - 1,
+                                        cJU_JPLEAF7);
+#else // JU_64BIT - 32 Bit
+                                JU_JPSETADT(PjpJP, (Word_t)PjllRaw, Pop1 - 1,
+                                        cJU_JPLEAF3);
+#endif // 32 Bit
+			}
+			ExpCnt++;
+//                      Done?
+			if (End == cJU_LEAFW_MAXPOP1) break;
+
+//			New Expanse, Start and Count
+			CIndex = Pjlw[End];
+			Start  = End;
+		}
+	}
+
+// Now put all the Leaves below a BranchL or BranchB:
+	if (ExpCnt <= cJU_BRANCHLMAXJPS) // put the Leaves below a BranchL
+	{
+	    if (j__udyCreateBranchL(Pjp, StageJP, StageExp, ExpCnt,
+			Pjpm) == -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+	    Pjp->jp_Type = cJU_JPBRANCH_L;
+	}
+	else
+	{
+	    if (j__udyStageJBBtoJBB(Pjp, &StageJBB, StageJP, SubJPCount, Pjpm)
+		== -1) FREEALLEXIT(ExpCnt, StageJP, Pjpm);
+
+	    Pjp->jp_Type = cJU_JPBRANCH_B;  // cJU_LEAFW is out of sequence
+	}
+	return(1);
+
+} // j__udyCascadeL()
diff --git a/libs/klib/judy/JudyCount.c b/libs/klib/judy/JudyCount.c
new file mode 100644
index 0000000..a8a6eb1
--- /dev/null
+++ b/libs/klib/judy/JudyCount.c
@@ -0,0 +1,1193 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Judy*Count() function for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+//
+// Compile with -DNOSMARTJBB, -DNOSMARTJBU, and/or -DNOSMARTJLB to build a
+// version with cache line optimizations deleted, for testing.
+//
+// Compile with -DSMARTMETRICS to obtain global variables containing smart
+// cache line metrics.  Note:  Dont turn this on simultaneously for this file
+// and JudyByCount.c because they export the same globals.
+//
+// Judy*Count() returns the "count of Indexes" (inclusive) between the two
+// specified limits (Indexes).  This code is remarkably fast.  It traverses the
+// "Judy array" data structure.
+//
+// This count code is the GENERIC untuned version (minimum code size).  It
+// might be possible to tuned to a specific architecture to be faster.
+// However, in real applications, with a modern machine, it is expected that
+// the instruction times will be swamped by cache line fills.
+// ****************************************************************************
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+
+// define a phoney that is for sure
+
+#define cJU_LEAFW       cJU_JPIMMED_CAP
+
+// Avoid duplicate symbols since this file is multi-compiled:
+
+#ifdef SMARTMETRICS
+#ifdef JUDY1
+Word_t jbb_upward   = 0;	// counts of directions taken:
+Word_t jbb_downward = 0;
+Word_t jbu_upward   = 0;
+Word_t jbu_downward = 0;
+Word_t jlb_upward   = 0;
+Word_t jlb_downward = 0;
+#else
+extern Word_t jbb_upward;
+extern Word_t jbb_downward;
+extern Word_t jbu_upward;
+extern Word_t jbu_downward;
+extern Word_t jlb_upward;
+extern Word_t jlb_downward;
+#endif
+#endif
+
+
+// FORWARD DECLARATIONS (prototypes):
+
+static	Word_t j__udy1LCountSM(const Pjp_t Pjp, const Word_t Index,
+			       const Pjpm_t Pjpm);
+
+// Each of Judy1 and JudyL get their own private (static) version of this
+// function:
+
+static	int j__udyCountLeafB1(const Pjll_t Pjll, const Word_t Pop1,
+			      const Word_t Index);
+
+// These functions are not static because they are exported to Judy*ByCount():
+//
+// TBD:  Should be made static for performance reasons?  And thus duplicated?
+//
+// Note:  There really are two different functions, but for convenience they
+// are referred to here with a generic name.
+
+#ifdef JUDY1
+#define	j__udyJPPop1 j__udy1JPPop1
+#else
+#define	j__udyJPPop1 j__udyLJPPop1
+#endif
+
+Word_t j__udyJPPop1(const Pjp_t Pjp);
+
+
+// LOCAL ERROR HANDLING:
+//
+// The Judy*Count() functions are unusual because they return 0 instead of JERR
+// for an error.  In this source file, define C_JERR for clarity.
+
+#define	C_JERR 0
+
+
+// ****************************************************************************
+// J U D Y   1   C O U N T
+// J U D Y   L   C O U N T
+//
+// See the manual entry for details.
+//
+// This code is written recursively, at least at first, because thats much
+// simpler; hope its fast enough.
+
+#ifdef JUDY1
+FUNCTION Word_t Judy1Count
+#else
+FUNCTION Word_t JudyLCount
+#endif
+        (
+	Pcvoid_t  PArray,	// JRP to first branch/leaf in SM.
+	Word_t	  Index1,	// starting Index.
+	Word_t	  Index2,	// ending Index.
+	PJError_t PJError	// optional, for returning error info.
+        )
+{
+	jpm_t	  fakejpm;	// local temporary for small arrays.
+	Pjpm_t	  Pjpm;		// top JPM or local temporary for error info.
+	jp_t	  fakejp;	// constructed for calling j__udy1LCountSM().
+	Pjp_t	  Pjp;		// JP to pass to j__udy1LCountSM().
+	Word_t	  pop1;		// total for the array.
+	Word_t	  pop1above1;	// indexes at or above Index1, inclusive.
+	Word_t	  pop1above2;	// indexes at or above Index2, exclusive.
+	int	  retcode;	// from Judy*First() calls.
+JUDYLCODE(PPvoid_t PPvalue);	// from JudyLFirst() calls.
+
+
+// CHECK FOR SHORTCUTS:
+//
+// As documented, return C_JERR if the Judy array is empty or Index1 > Index2.
+
+	if ((PArray == (Pvoid_t) NULL) || (Index1 > Index2))
+	{
+	    JU_SET_ERRNO(PJError, JU_ERRNO_NONE);
+	    return(C_JERR);
+	}
+
+// If Index1 == Index2, simply check if the specified Index is set; pass
+// through the return value from Judy1Test() or JudyLGet() with appropriate
+// translations.
+
+	if (Index1 == Index2)
+	{
+#ifdef JUDY1
+	    retcode = Judy1Test(PArray, Index1, PJError);
+
+	    if (retcode == JERRI) return(C_JERR);	// pass through error.
+
+	    if (retcode == 0)
+	    {
+		JU_SET_ERRNO(PJError, JU_ERRNO_NONE);
+		return(C_JERR);
+	    }
+#else
+	    PPvalue = JudyLGet(PArray, Index1, PJError);
+
+	    if (PPvalue == PPJERR) return(C_JERR);	// pass through error.
+
+	    if (PPvalue == (PPvoid_t) NULL)		// Index is not set.
+	    {
+		JU_SET_ERRNO(PJError, JU_ERRNO_NONE);
+		return(C_JERR);
+	    }
+#endif
+	    return(1);					// single index is set.
+	}
+
+
+// CHECK JRP TYPE:
+//
+// Use an if/then for speed rather than a switch, and put the most common cases
+// first.
+//
+// Note:  Since even cJU_LEAFW types require counting between two Indexes,
+// prepare them here for common code below that calls j__udy1LCountSM(), rather
+// than handling them even more specially here.
+
+	if (JU_LEAFW_POP0(PArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
+	{
+	    Pjlw_t Pjlw	   = P_JLW(PArray);	// first word of leaf.
+	    Pjpm	   = & fakejpm;
+	    Pjp		   = & fakejp;
+	    Pjp->jp_Addr   = (Word_t) Pjlw;
+	    Pjp->jp_Type   = cJU_LEAFW;
+	    Pjpm->jpm_Pop0 = Pjlw[0];		// from first word of leaf.
+	    pop1	   = Pjpm->jpm_Pop0 + 1;
+	}
+	else
+	{
+	    Pjpm = P_JPM(PArray);
+	    Pjp	 = &(Pjpm->jpm_JP);
+	    pop1 = (Pjpm->jpm_Pop0) + 1;	// note: can roll over to 0.
+
+#if (defined(JUDY1) && (! defined(JU_64BIT)))
+	    if (pop1 == 0)		// rare special case of full array:
+	    {
+		Word_t count = Index2 - Index1 + 1;	// can roll over again.
+
+		if (count == 0)
+		{
+		    JU_SET_ERRNO(PJError, JU_ERRNO_FULL);
+		    return(C_JERR);
+		}
+		return(count);
+	    }
+#else
+	    assert(pop1);	// JudyL or 64-bit cannot create a full array!
+#endif
+	}
+
+
+// COUNT POP1 ABOVE INDEX1, INCLUSIVE:
+
+	assert(pop1);		// just to be safe.
+
+	if (Index1 == 0)	// shortcut, pop1above1 is entire population:
+	{
+	    pop1above1 = pop1;
+	}
+	else			// find first valid Index above Index1, if any:
+	{
+#ifdef JUDY1
+	    if ((retcode = Judy1First(PArray, & Index1, PJError)) == JERRI)
+		return(C_JERR);			// pass through error.
+#else
+	    if ((PPvalue = JudyLFirst(PArray, & Index1, PJError)) == PPJERR)
+		return(C_JERR);			// pass through error.
+
+	    retcode = (PPvalue != (PPvoid_t) NULL);	// found a next Index.
+#endif
+
+// If theres no Index at or above Index1, just return C_JERR (early exit):
+
+	    if (retcode == 0)
+	    {
+		JU_SET_ERRNO(PJError, JU_ERRNO_NONE);
+		return(C_JERR);
+	    }
+
+// If a first/next Index was found, call the counting motor starting with that
+// known valid Index, meaning the return should be positive, not C_JERR except
+// in case of a real error:
+
+	    if ((pop1above1 = j__udy1LCountSM(Pjp, Index1, Pjpm)) == C_JERR)
+	    {
+		JU_COPY_ERRNO(PJError, Pjpm);	// pass through error.
+		return(C_JERR);
+	    }
+	}
+
+
+// COUNT POP1 ABOVE INDEX2, EXCLUSIVE, AND RETURN THE DIFFERENCE:
+//
+// In principle, calculate the ordinal of each Index and take the difference,
+// with caution about off-by-one errors due to the specified Indexes being set
+// or unset.  In practice:
+//
+// - The ordinals computed here are inverse ordinals, that is, the populations
+//   ABOVE the specified Indexes (Index1 inclusive, Index2 exclusive), so
+//   subtract pop1above2 from pop1above1, rather than vice-versa.
+//
+// - Index1s result already includes a count for Index1 and/or Index2 if
+//   either is set, so calculate pop1above2 exclusive of Index2.
+//
+// TBD:  If Index1 and Index2 fall in the same expanse in the top-state
+// branch(es), would it be faster to walk the SM only once, to their divergence
+// point, before calling j__udy1LCountSM() or equivalent?  Possibly a non-issue
+// if a top-state pop1 becomes stored with each Judy1 array.  Also, consider
+// whether the first call of j__udy1LCountSM() fills the cache, for common tree
+// branches, for the second call.
+//
+// As for pop1above1, look for shortcuts for special cases when pop1above2 is
+// zero.  Otherwise call the counting "motor".
+
+	    assert(pop1above1);		// just to be safe.
+
+	    if (Index2++ == cJU_ALLONES) return(pop1above1); // Index2 at limit.
+
+#ifdef JUDY1
+	    if ((retcode = Judy1First(PArray, & Index2, PJError)) == JERRI)
+		return(C_JERR);
+#else
+	    if ((PPvalue = JudyLFirst(PArray, & Index2, PJError)) == PPJERR)
+		return(C_JERR);
+
+	    retcode = (PPvalue != (PPvoid_t) NULL);	// found a next Index.
+#endif
+	    if (retcode == 0) return(pop1above1);  // no Index above Index2.
+
+// Just as for Index1, j__udy1LCountSM() cannot return 0 (locally == C_JERR)
+// except in case of a real error:
+
+	    if ((pop1above2 = j__udy1LCountSM(Pjp, Index2, Pjpm)) == C_JERR)
+	    {
+		JU_COPY_ERRNO(PJError, Pjpm);		// pass through error.
+		return(C_JERR);
+	    }
+
+	    if (pop1above1 == pop1above2)
+	    {
+		JU_SET_ERRNO(PJError, JU_ERRNO_NONE);
+		return(C_JERR);
+	    }
+
+	    return(pop1above1 - pop1above2);
+
+} // Judy1Count() / JudyLCount()
+
+
+// ****************************************************************************
+// __ J U D Y 1 L   C O U N T   S M
+//
+// Given a pointer to a JP (with invalid jp_DcdPopO at cJU_ROOTSTATE), a known
+// valid Index, and a Pjpm for returning error info, recursively visit a Judy
+// array state machine (SM) and return the count of Indexes, including Index,
+// through the end of the Judy array at this state or below.  In case of error
+// or a count of 0 (should never happen), return C_JERR with appropriate
+// JU_ERRNO in the Pjpm.
+//
+// Note:  This function is not told the current state because its encoded in
+// the JP Type.
+//
+// Method:  To minimize cache line fills, while studying each branch, if Index
+// resides above the midpoint of the branch (which often consists of multiple
+// cache lines), ADD the populations at or above Index; otherwise, SUBTRACT
+// from the population of the WHOLE branch (available from the JP) the
+// populations at or above Index.  This is especially tricky for bitmap
+// branches.
+//
+// Note:  Unlike, say, the Ins and Del walk routines, this function returns the
+// same type of returns as Judy*Count(), so it can use *_SET_ERRNO*() macros
+// the same way.
+
+FUNCTION static Word_t j__udy1LCountSM(
+const	Pjp_t	Pjp,		// top of Judy (sub)SM.
+const	Word_t	Index,		// count at or above this Index.
+const	Pjpm_t	Pjpm)		// for returning error info.
+{
+	Pjbl_t	Pjbl;		// Pjp->jp_Addr masked and cast to types:
+	Pjbb_t	Pjbb;
+	Pjbu_t	Pjbu;
+	Pjll_t	Pjll;		// a Judy lower-level linear leaf.
+
+	Word_t	digit;		// next digit to decode from Index.
+	long	jpnum;		// JP number in a branch (base 0).
+	int	offset;		// index ordinal within a leaf, base 0.
+	Word_t	pop1;		// total population of an expanse.
+	Word_t	pop1above;	// to return.
+
+// Common code to check Decode bits in a JP against the equivalent portion of
+// Index; XOR together, then mask bits of interest; must be all 0:
+//
+// Note:  Why does this code only assert() compliance rather than actively
+// checking for outliers?  Its because Index is supposed to be valid, hence
+// always match any Dcd bits traversed.
+//
+// Note:  This assertion turns out to be always true for cState = 3 on 32-bit
+// and 7 on 64-bit, but its harmless, probably removed by the compiler.
+
+#define	CHECKDCD(Pjp,cState) \
+	assert(! JU_DCDNOTMATCHINDEX(Index, Pjp, cState))
+
+// Common code to prepare to handle a root-level or lower-level branch:
+// Extract a state-dependent digit from Index in a "constant" way, obtain the
+// total population for the branch in a state-dependent way, and then branch to
+// common code for multiple cases:
+//
+// For root-level branches, the state is always cJU_ROOTSTATE, and the
+// population is received in Pjpm->jpm_Pop0.
+//
+// Note:  The total population is only needed in cases where the common code
+// "counts up" instead of down to minimize cache line fills.  However, its
+// available cheaply, and its better to do it with a constant shift (constant
+// state value) instead of a variable shift later "when needed".
+
+#define	PREPB_ROOT(Pjp,Next)				\
+	digit = JU_DIGITATSTATE(Index, cJU_ROOTSTATE);	\
+	pop1  = (Pjpm->jpm_Pop0) + 1;			\
+	goto Next
+
+#define	PREPB(Pjp,cState,Next)				\
+	digit = JU_DIGITATSTATE(Index, cState);		\
+	pop1  = JU_JPBRANCH_POP0(Pjp, (cState)) + 1;    \
+	goto Next
+
+
+// SWITCH ON JP TYPE:
+//
+// WARNING:  For run-time efficiency the following cases replicate code with
+// varying constants, rather than using common code with variable values!
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// ----------------------------------------------------------------------------
+// ROOT-STATE LEAF that starts with a Pop0 word; just count within the leaf:
+
+	case cJU_LEAFW:
+	{
+	    Pjlw_t Pjlw = P_JLW(Pjp->jp_Addr);		// first word of leaf.
+
+	    assert((Pjpm->jpm_Pop0) + 1 == Pjlw[0] + 1);  // sent correctly.
+	    offset = j__udySearchLeafW(Pjlw + 1, Pjpm->jpm_Pop0 + 1, Index);
+	    assert(offset >= 0);			// Index must exist.
+	    assert(offset < (Pjpm->jpm_Pop0) + 1);	// Index be in range.
+	    return((Pjpm->jpm_Pop0) + 1 - offset);	// INCLUSIVE of Index.
+	}
+
+// ----------------------------------------------------------------------------
+// LINEAR BRANCH; count populations in JPs in the JBL ABOVE the next digit in
+// Index, and recurse for the next digit in Index:
+//
+// Note:  There are no null JPs in a JBL; watch out for pop1 == 0.
+//
+// Note:  A JBL should always fit in one cache line => no need to count up
+// versus down to save cache line fills.  (PREPB() sets pop1 for no reason.)
+
+	case cJU_JPBRANCH_L2:  CHECKDCD(Pjp, 2); PREPB(Pjp, 2, BranchL);
+	case cJU_JPBRANCH_L3:  CHECKDCD(Pjp, 3); PREPB(Pjp, 3, BranchL);
+
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_L4:  CHECKDCD(Pjp, 4); PREPB(Pjp, 4, BranchL);
+	case cJU_JPBRANCH_L5:  CHECKDCD(Pjp, 5); PREPB(Pjp, 5, BranchL);
+	case cJU_JPBRANCH_L6:  CHECKDCD(Pjp, 6); PREPB(Pjp, 6, BranchL);
+	case cJU_JPBRANCH_L7:  CHECKDCD(Pjp, 7); PREPB(Pjp, 7, BranchL);
+#endif
+	case cJU_JPBRANCH_L:   PREPB_ROOT(Pjp, BranchL);
+
+// Common code (state-independent) for all cases of linear branches:
+
+BranchL:
+
+	Pjbl      = P_JBL(Pjp->jp_Addr);
+	jpnum     = Pjbl->jbl_NumJPs;			// above last JP.
+	pop1above = 0;
+
+	while (digit < (Pjbl->jbl_Expanse[--jpnum]))	 // still ABOVE digit.
+	{
+	    if ((pop1 = j__udyJPPop1((Pjbl->jbl_jp) + jpnum)) == cJU_ALLONES)
+	    {
+		JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT);
+		return(C_JERR);
+	    }
+
+	    pop1above += pop1;
+	    assert(jpnum > 0);				// should find digit.
+	}
+
+	assert(digit == (Pjbl->jbl_Expanse[jpnum]));	// should find digit.
+
+	pop1 = j__udy1LCountSM((Pjbl->jbl_jp) + jpnum, Index, Pjpm);
+	if (pop1 == C_JERR) return(C_JERR);		// pass error up.
+
+	assert(pop1above + pop1);
+	return(pop1above + pop1);
+
+
+// ----------------------------------------------------------------------------
+// BITMAP BRANCH; count populations in JPs in the JBB ABOVE the next digit in
+// Index, and recurse for the next digit in Index:
+//
+// Note:  There are no null JPs in a JBB; watch out for pop1 == 0.
+
+	case cJU_JPBRANCH_B2:  CHECKDCD(Pjp, 2); PREPB(Pjp, 2, BranchB);
+	case cJU_JPBRANCH_B3:  CHECKDCD(Pjp, 3); PREPB(Pjp, 3, BranchB);
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_B4:  CHECKDCD(Pjp, 4); PREPB(Pjp, 4, BranchB);
+	case cJU_JPBRANCH_B5:  CHECKDCD(Pjp, 5); PREPB(Pjp, 5, BranchB);
+	case cJU_JPBRANCH_B6:  CHECKDCD(Pjp, 6); PREPB(Pjp, 6, BranchB);
+	case cJU_JPBRANCH_B7:  CHECKDCD(Pjp, 7); PREPB(Pjp, 7, BranchB);
+#endif
+	case cJU_JPBRANCH_B:   PREPB_ROOT(Pjp, BranchB);
+
+// Common code (state-independent) for all cases of bitmap branches:
+
+BranchB:
+	{
+	    long   subexp;	// for stepping through layer 1 (subexpanses).
+	    long   findsub;	// subexpanse containing   Index (digit).
+	    Word_t findbit;	// bit	      representing Index (digit).
+	    Word_t lowermask;	// bits for indexes at or below Index.
+	    Word_t jpcount;	// JPs in a subexpanse.
+	    Word_t clbelow;	// cache lines below digits cache line.
+	    Word_t clabove;	// cache lines above digits cache line.
+
+	    Pjbb      = P_JBB(Pjp->jp_Addr);
+	    findsub   = digit / cJU_BITSPERSUBEXPB;
+	    findbit   = digit % cJU_BITSPERSUBEXPB;
+	    lowermask = JU_MASKLOWERINC(JU_BITPOSMASKB(findbit));
+	    clbelow   = clabove = 0;	// initial/default => always downward.
+
+	    assert(JU_BITMAPTESTB(Pjbb, digit)); // digit must have a JP.
+	    assert(findsub < cJU_NUMSUBEXPB);	 // falls in expected range.
+
+// Shorthand for one subexpanse in a bitmap and for one JP in a bitmap branch:
+//
+// Note: BMPJP0 exists separately to support assertions.
+
+#define	BMPJP0(Subexp)       (P_JP(JU_JBB_PJP(Pjbb, Subexp)))
+#define	BMPJP(Subexp,JPnum)  (BMPJP0(Subexp) + (JPnum))
+
+#ifndef NOSMARTJBB  // enable to turn off smart code for comparison purposes.
+
+// FIGURE OUT WHICH DIRECTION CAUSES FEWER CACHE LINE FILLS; adding the pop1s
+// in JPs above Indexs JP, or subtracting the pop1s in JPs below Indexs JP.
+//
+// This is tricky because, while each set bit in the bitmap represents a JP,
+// the JPs are scattered over cJU_NUMSUBEXPB subexpanses, each of which can
+// contain JPs packed into multiple cache lines, and this code must visit every
+// JP either BELOW or ABOVE the JP for Index.
+//
+// Number of cache lines required to hold a linear list of the given number of
+// JPs, assuming the first JP is at the start of a cache line or the JPs in
+// jpcount fit wholly within a single cache line, which is ensured by
+// JudyMalloc():
+
+#define	CLPERJPS(jpcount) \
+	((((jpcount) * cJU_WORDSPERJP) + cJU_WORDSPERCL - 1) / cJU_WORDSPERCL)
+
+// Count cache lines below/above for each subexpanse:
+
+	    for (subexp = 0; subexp < cJU_NUMSUBEXPB; ++subexp)
+	    {
+		jpcount = j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, subexp));
+
+// When at the subexpanse containing Index (digit), add cache lines
+// below/above appropriately, excluding the cache line containing the JP for
+// Index itself:
+
+		if	(subexp <  findsub)  clbelow += CLPERJPS(jpcount);
+		else if (subexp >  findsub)  clabove += CLPERJPS(jpcount);
+		else // (subexp == findsub)
+		{
+		    Word_t clfind;	// cache line containing Index (digit).
+
+		    clfind = CLPERJPS(j__udyCountBitsB(
+				    JU_JBB_BITMAP(Pjbb, subexp) & lowermask));
+
+		    assert(clfind > 0);	 // digit itself should have 1 CL.
+		    clbelow += clfind - 1;
+		    clabove += CLPERJPS(jpcount) - clfind;
+		}
+	    }
+#endif // ! NOSMARTJBB
+
+// Note:  Its impossible to get through the following "if" without setting
+// jpnum -- see some of the assertions below -- but gcc -Wall doesnt know
+// this, so preset jpnum to make it happy:
+
+	    jpnum = 0;
+
+
+// COUNT POPULATION FOR A BITMAP BRANCH, in whichever direction should result
+// in fewer cache line fills:
+//
+// Note:  If the remainder of Index is zero, pop1above is the pop1 of the
+// entire expanse and theres no point in recursing to lower levels; but this
+// should be so rare that its not worth checking for;
+// Judy1Count()/JudyLCount() never even calls the motor for Index == 0 (all
+// bytes).
+
+
+// COUNT UPWARD, subtracting each "below or at" JPs pop1 from the whole
+// expanses pop1:
+//
+// Note:  If this causes clbelow + 1 cache line fills including JPs cache
+// line, thats OK; at worst this is the same as clabove.
+
+	    if (clbelow < clabove)
+	    {
+#ifdef SMARTMETRICS
+		++jbb_upward;
+#endif
+		pop1above = pop1;		// subtract JPs at/below Index.
+
+// Count JPs for which to accrue pop1s in this subexpanse:
+//
+// TBD:  If JU_JBB_BITMAP is cJU_FULLBITMAPB, dont bother counting.
+
+		for (subexp = 0; subexp <= findsub; ++subexp)
+		{
+		    jpcount = j__udyCountBitsB((subexp < findsub) ?
+				      JU_JBB_BITMAP(Pjbb, subexp) :
+				      JU_JBB_BITMAP(Pjbb, subexp) & lowermask);
+
+		    // should always find findbit:
+		    assert((subexp < findsub) || jpcount);
+
+// Subtract pop1s from JPs BELOW OR AT Index (digit):
+//
+// Note:  The pop1 for Indexs JP itself is partially added back later at a
+// lower state.
+//
+// Note:  An empty subexpanse (jpcount == 0) is handled "for free".
+//
+// Note:  Must be null JP subexp pointer in empty subexpanse and non-empty in
+// non-empty subexpanse:
+
+		    assert(   jpcount  || (BMPJP0(subexp) == (Pjp_t) NULL));
+		    assert((! jpcount) || (BMPJP0(subexp) != (Pjp_t) NULL));
+
+		    for (jpnum = 0; jpnum < jpcount; ++jpnum)
+		    {
+			if ((pop1 = j__udyJPPop1(BMPJP(subexp, jpnum)))
+			    == cJU_ALLONES)
+			{
+			    JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT);
+			    return(C_JERR);
+			}
+
+			pop1above -= pop1;
+		    }
+
+		    jpnum = jpcount - 1;	// make correct for digit.
+		}
+	    }
+
+// COUNT DOWNWARD, adding each "above" JPs pop1:
+
+	    else
+	    {
+		long jpcountbf;			// below findbit, inclusive.
+#ifdef SMARTMETRICS
+		++jbb_downward;
+#endif
+		pop1above = 0;			// add JPs above Index.
+		jpcountbf = 0;			// until subexp == findsub.
+
+// Count JPs for which to accrue pop1s in this subexpanse:
+//
+// This is more complicated than counting upward because the scan of digits
+// subexpanse must count ALL JPs, to know where to START counting down, and
+// ALSO note the offset of digits JP to know where to STOP counting down.
+
+		for (subexp = cJU_NUMSUBEXPB - 1; subexp >= findsub; --subexp)
+		{
+		    jpcount = j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, subexp));
+
+		    // should always find findbit:
+		    assert((subexp > findsub) || jpcount);
+
+		    if (! jpcount) continue;	// empty subexpanse, save time.
+
+// Count JPs below digit, inclusive:
+
+		    if (subexp == findsub)
+		    {
+			jpcountbf = j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, subexp)
+						  & lowermask);
+		    }
+
+		    // should always find findbit:
+		    assert((subexp > findsub) || jpcountbf);
+		    assert(jpcount >= jpcountbf);	// proper relationship.
+
+// Add pop1s from JPs ABOVE Index (digit):
+
+		    // no null JP subexp pointers:
+		    assert(BMPJP0(subexp) != (Pjp_t) NULL);
+
+		    for (jpnum = jpcount - 1; jpnum >= jpcountbf; --jpnum)
+		    {
+			if ((pop1 = j__udyJPPop1(BMPJP(subexp, jpnum)))
+			    == cJU_ALLONES)
+			{
+			    JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT);
+			    return(C_JERR);
+			}
+
+			pop1above += pop1;
+		    }
+		    // jpnum is now correct for digit.
+		}
+	    } // else.
+
+// Return the net population ABOVE the digits JP at this state (in this JBB)
+// plus the population AT OR ABOVE Index in the SM under the digits JP:
+
+	    pop1 = j__udy1LCountSM(BMPJP(findsub, jpnum), Index, Pjpm);
+	    if (pop1 == C_JERR) return(C_JERR);		// pass error up.
+
+	    assert(pop1above + pop1);
+	    return(pop1above + pop1);
+
+	} // case.
+
+
+// ----------------------------------------------------------------------------
+// UNCOMPRESSED BRANCH; count populations in JPs in the JBU ABOVE the next
+// digit in Index, and recurse for the next digit in Index:
+//
+// Note:  If the remainder of Index is zero, pop1above is the pop1 of the
+// entire expanse and theres no point in recursing to lower levels; but this
+// should be so rare that its not worth checking for;
+// Judy1Count()/JudyLCount() never even calls the motor for Index == 0 (all
+// bytes).
+
+	case cJU_JPBRANCH_U2:  CHECKDCD(Pjp, 2); PREPB(Pjp, 2, BranchU);
+	case cJU_JPBRANCH_U3:  CHECKDCD(Pjp, 3); PREPB(Pjp, 3, BranchU);
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_U4:  CHECKDCD(Pjp, 4); PREPB(Pjp, 4, BranchU);
+	case cJU_JPBRANCH_U5:  CHECKDCD(Pjp, 5); PREPB(Pjp, 5, BranchU);
+	case cJU_JPBRANCH_U6:  CHECKDCD(Pjp, 6); PREPB(Pjp, 6, BranchU);
+	case cJU_JPBRANCH_U7:  CHECKDCD(Pjp, 7); PREPB(Pjp, 7, BranchU);
+#endif
+	case cJU_JPBRANCH_U:   PREPB_ROOT(Pjp, BranchU);
+
+// Common code (state-independent) for all cases of uncompressed branches:
+
+BranchU:
+	    Pjbu = P_JBU(Pjp->jp_Addr);
+
+#ifndef NOSMARTJBU  // enable to turn off smart code for comparison purposes.
+
+// FIGURE OUT WHICH WAY CAUSES FEWER CACHE LINE FILLS; adding the JPs above
+// Indexs JP, or subtracting the JPs below Indexs JP.
+//
+// COUNT UPWARD, subtracting the pop1 of each JP BELOW OR AT Index, from the
+// whole expanses pop1:
+
+	    if (digit < (cJU_BRANCHUNUMJPS / 2))
+	    {
+		pop1above = pop1;		// subtract JPs below Index.
+#ifdef SMARTMETRICS
+		++jbu_upward;
+#endif
+		for (jpnum = 0; jpnum <= digit; ++jpnum)
+		{
+		    if ((Pjbu->jbu_jp[jpnum].jp_Type) <= cJU_JPNULLMAX)
+			continue;	// shortcut, save a function call.
+
+		    if ((pop1 = j__udyJPPop1(Pjbu->jbu_jp + jpnum))
+		     == cJU_ALLONES)
+		    {
+			JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT);
+			return(C_JERR);
+		    }
+
+		    pop1above -= pop1;
+		}
+	    }
+
+// COUNT DOWNWARD, simply adding the pop1 of each JP ABOVE Index:
+
+	    else
+#endif // NOSMARTJBU
+	    {
+		assert(digit < cJU_BRANCHUNUMJPS);
+#ifdef SMARTMETRICS
+		++jbu_downward;
+#endif
+		pop1above = 0;			// add JPs above Index.
+
+		for (jpnum = cJU_BRANCHUNUMJPS - 1; jpnum > digit; --jpnum)
+		{
+		    if ((Pjbu->jbu_jp[jpnum].jp_Type) <= cJU_JPNULLMAX)
+			continue;	// shortcut, save a function call.
+
+		    if ((pop1 = j__udyJPPop1(Pjbu->jbu_jp + jpnum))
+		     == cJU_ALLONES)
+		    {
+			JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT);
+			return(C_JERR);
+		    }
+
+		    pop1above += pop1;
+		}
+	    }
+
+	    if ((pop1 = j__udy1LCountSM(Pjbu->jbu_jp + digit, Index, Pjpm))
+	     == C_JERR) return(C_JERR);		// pass error up.
+
+	    assert(pop1above + pop1);
+	    return(pop1above + pop1);
+
+
+// ----------------------------------------------------------------------------
+// LEAF COUNT MACROS:
+//
+// LEAF*ABOVE() are common code for different JP types (linear leaves, bitmap
+// leaves, and immediates) and different leaf Index Sizes, which result in
+// calling different leaf search functions.  Linear leaves get the leaf address
+// from jp_Addr and the Population from jp_DcdPopO, while immediates use Pjp
+// itself as the leaf address and get Population from jp_Type.
+
+#define	LEAFLABOVE(Func)				\
+	Pjll = P_JLL(Pjp->jp_Addr);			\
+	pop1 = JU_JPLEAF_POP0(Pjp) + 1;	                \
+	LEAFABOVE(Func, Pjll, pop1)
+
+#define	LEAFB1ABOVE(Func) LEAFLABOVE(Func)  // different Func, otherwise same.
+
+#ifdef JUDY1
+#define	IMMABOVE(Func,Pop1)	\
+	Pjll = (Pjll_t) Pjp;	\
+	LEAFABOVE(Func, Pjll, Pop1)
+#else
+// Note:  For JudyL immediates with >= 2 Indexes, the index bytes are in a
+// different place than for Judy1:
+
+#define	IMMABOVE(Func,Pop1) \
+	LEAFABOVE(Func, (Pjll_t) (Pjp->jp_LIndex), Pop1)
+#endif
+
+// For all leaf types, the population AT OR ABOVE is the total pop1 less the
+// offset of Index; and Index should always be found:
+
+#define	LEAFABOVE(Func,Pjll,Pop1)		\
+	offset = Func(Pjll, Pop1, Index);	\
+	assert(offset >= 0);			\
+	assert(offset < (Pop1));		\
+	return((Pop1) - offset)
+
+// IMMABOVE_01 handles the special case of an immediate JP with 1 index, which
+// the search functions arent used for anyway:
+//
+// The target Index should be the one in this Immediate, in which case the
+// count above (inclusive) is always 1.
+
+#define	IMMABOVE_01						\
+	assert((JU_JPDCDPOP0(Pjp)) == JU_TRIMTODCDSIZE(Index));	\
+	return(1)
+
+
+// ----------------------------------------------------------------------------
+// LINEAR LEAF; search the leaf for Index; size is computed from jp_Type:
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+	case cJU_JPLEAF1:  LEAFLABOVE(j__udySearchLeaf1);
+#endif
+	case cJU_JPLEAF2:  LEAFLABOVE(j__udySearchLeaf2);
+	case cJU_JPLEAF3:  LEAFLABOVE(j__udySearchLeaf3);
+
+#ifdef JU_64BIT
+	case cJU_JPLEAF4:  LEAFLABOVE(j__udySearchLeaf4);
+	case cJU_JPLEAF5:  LEAFLABOVE(j__udySearchLeaf5);
+	case cJU_JPLEAF6:  LEAFLABOVE(j__udySearchLeaf6);
+	case cJU_JPLEAF7:  LEAFLABOVE(j__udySearchLeaf7);
+#endif
+
+
+// ----------------------------------------------------------------------------
+// BITMAP LEAF; search the leaf for Index:
+//
+// Since the bitmap describes Indexes digitally rather than linearly, this is
+// not really a search, but just a count.
+
+	case cJU_JPLEAF_B1:  LEAFB1ABOVE(j__udyCountLeafB1);
+
+
+#ifdef JUDY1
+// ----------------------------------------------------------------------------
+// FULL POPULATION:
+//
+// Return the count of Indexes AT OR ABOVE Index, which is the total population
+// of the expanse (a constant) less the value of the undecoded digit remaining
+// in Index (its base-0 offset in the expanse), which yields an inclusive count
+// above.
+//
+// TBD:  This only supports a 1-byte full expanse.  Should this extract a
+// stored value for pop0 and possibly more LSBs of Index, to handle larger full
+// expanses?
+
+	case cJ1_JPFULLPOPU1:
+	    return(cJU_JPFULLPOPU1_POP0 + 1 - JU_DIGITATSTATE(Index, 1));
+#endif
+
+
+// ----------------------------------------------------------------------------
+// IMMEDIATE:
+
+	case cJU_JPIMMED_1_01:  IMMABOVE_01;
+	case cJU_JPIMMED_2_01:  IMMABOVE_01;
+	case cJU_JPIMMED_3_01:  IMMABOVE_01;
+#ifdef JU_64BIT
+	case cJU_JPIMMED_4_01:  IMMABOVE_01;
+	case cJU_JPIMMED_5_01:  IMMABOVE_01;
+	case cJU_JPIMMED_6_01:  IMMABOVE_01;
+	case cJU_JPIMMED_7_01:  IMMABOVE_01;
+#endif
+
+	case cJU_JPIMMED_1_02:  IMMABOVE(j__udySearchLeaf1,  2);
+	case cJU_JPIMMED_1_03:  IMMABOVE(j__udySearchLeaf1,  3);
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_1_04:  IMMABOVE(j__udySearchLeaf1,  4);
+	case cJU_JPIMMED_1_05:  IMMABOVE(j__udySearchLeaf1,  5);
+	case cJU_JPIMMED_1_06:  IMMABOVE(j__udySearchLeaf1,  6);
+	case cJU_JPIMMED_1_07:  IMMABOVE(j__udySearchLeaf1,  7);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_1_08:  IMMABOVE(j__udySearchLeaf1,  8);
+	case cJ1_JPIMMED_1_09:  IMMABOVE(j__udySearchLeaf1,  9);
+	case cJ1_JPIMMED_1_10:  IMMABOVE(j__udySearchLeaf1, 10);
+	case cJ1_JPIMMED_1_11:  IMMABOVE(j__udySearchLeaf1, 11);
+	case cJ1_JPIMMED_1_12:  IMMABOVE(j__udySearchLeaf1, 12);
+	case cJ1_JPIMMED_1_13:  IMMABOVE(j__udySearchLeaf1, 13);
+	case cJ1_JPIMMED_1_14:  IMMABOVE(j__udySearchLeaf1, 14);
+	case cJ1_JPIMMED_1_15:  IMMABOVE(j__udySearchLeaf1, 15);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_2_02:  IMMABOVE(j__udySearchLeaf2,  2);
+	case cJU_JPIMMED_2_03:  IMMABOVE(j__udySearchLeaf2,  3);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_2_04:  IMMABOVE(j__udySearchLeaf2,  4);
+	case cJ1_JPIMMED_2_05:  IMMABOVE(j__udySearchLeaf2,  5);
+	case cJ1_JPIMMED_2_06:  IMMABOVE(j__udySearchLeaf2,  6);
+	case cJ1_JPIMMED_2_07:  IMMABOVE(j__udySearchLeaf2,  7);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_3_02:  IMMABOVE(j__udySearchLeaf3,  2);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_3_03:  IMMABOVE(j__udySearchLeaf3,  3);
+	case cJ1_JPIMMED_3_04:  IMMABOVE(j__udySearchLeaf3,  4);
+	case cJ1_JPIMMED_3_05:  IMMABOVE(j__udySearchLeaf3,  5);
+
+	case cJ1_JPIMMED_4_02:  IMMABOVE(j__udySearchLeaf4,  2);
+	case cJ1_JPIMMED_4_03:  IMMABOVE(j__udySearchLeaf4,  3);
+
+	case cJ1_JPIMMED_5_02:  IMMABOVE(j__udySearchLeaf5,  2);
+	case cJ1_JPIMMED_5_03:  IMMABOVE(j__udySearchLeaf5,  3);
+
+	case cJ1_JPIMMED_6_02:  IMMABOVE(j__udySearchLeaf6,  2);
+
+	case cJ1_JPIMMED_7_02:  IMMABOVE(j__udySearchLeaf7,  2);
+#endif
+
+
+// ----------------------------------------------------------------------------
+// OTHER CASES:
+
+	default: JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT); return(C_JERR);
+
+	} // switch on JP type
+
+	/*NOTREACHED*/
+
+} // j__udy1LCountSM()
+
+
+// ****************************************************************************
+// J U D Y   C O U N T   L E A F   B 1
+//
+// This is a private analog of the j__udySearchLeaf*() functions for counting
+// in bitmap 1-byte leaves.  Since a bitmap leaf describes Indexes digitally
+// rather than linearly, this is not really a search, but just a count of the
+// valid Indexes == set bits below or including Index, which should be valid.
+// Return the "offset" (really the ordinal), 0 .. Pop1 - 1, of Index in Pjll;
+// if Indexs bit is not set (which should never happen, so this is DEBUG-mode
+// only), return the 1s-complement equivalent (== negative offset minus 1).
+//
+// Note:  The source code for this function looks identical for both Judy1 and
+// JudyL, but the JU_JLB_BITMAP macro varies.
+//
+// Note:  For simpler calling, the first arg is of type Pjll_t but then cast to
+// Pjlb_t.
+
+FUNCTION static int j__udyCountLeafB1(
+const	Pjll_t	Pjll,		// bitmap leaf, as Pjll_t for consistency.
+const	Word_t	Pop1,		// Population of whole leaf.
+const	Word_t	Index)		// to which to count.
+{
+	Pjlb_t	Pjlb	= (Pjlb_t) Pjll;	// to proper type.
+	Word_t	digit   = Index & cJU_MASKATSTATE(1);
+	Word_t	findsub = digit / cJU_BITSPERSUBEXPL;
+	Word_t	findbit = digit % cJU_BITSPERSUBEXPL;
+	int	count;		// in leaf through Index.
+	long	subexp;		// for stepping through subexpanses.
+
+
+// COUNT UPWARD:
+//
+// The entire bitmap should fit in one cache line, but still try to save some
+// CPU time by counting the fewest possible number of subexpanses from the
+// bitmap.
+
+#ifndef NOSMARTJLB  // enable to turn off smart code for comparison purposes.
+
+	if (findsub < (cJU_NUMSUBEXPL / 2))
+	{
+#ifdef SMARTMETRICS
+	    ++jlb_upward;
+#endif
+	    count = 0;
+
+	    for (subexp = 0; subexp < findsub; ++subexp)
+	    {
+		count += ((JU_JLB_BITMAP(Pjlb, subexp) == cJU_FULLBITMAPL) ?
+			  cJU_BITSPERSUBEXPL :
+			  j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, subexp)));
+	    }
+
+// This count includes findbit, which should be set, resulting in a base-1
+// offset:
+
+	    count += j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, findsub)
+				& JU_MASKLOWERINC(JU_BITPOSMASKL(findbit)));
+
+	    DBGCODE(if (! JU_BITMAPTESTL(Pjlb, digit)) return(~count);)
+	    assert(count >= 1);
+	    return(count - 1);		// convert to base-0 offset.
+	}
+#endif // NOSMARTJLB
+
+
+// COUNT DOWNWARD:
+//
+// Count the valid Indexes above or at Index, and subtract from Pop1.
+
+#ifdef SMARTMETRICS
+	++jlb_downward;
+#endif
+	count = Pop1;			// base-1 for now.
+
+	for (subexp = cJU_NUMSUBEXPL - 1; subexp > findsub; --subexp)
+	{
+	    count -= ((JU_JLB_BITMAP(Pjlb, subexp) == cJU_FULLBITMAPL) ?
+		      cJU_BITSPERSUBEXPL :
+		      j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, subexp)));
+	}
+
+// This count includes findbit, which should be set, resulting in a base-0
+// offset:
+
+	count -= j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, findsub)
+				& JU_MASKHIGHERINC(JU_BITPOSMASKL(findbit)));
+
+	DBGCODE(if (! JU_BITMAPTESTL(Pjlb, digit)) return(~count);)
+	assert(count >= 0);		// should find Index itself.
+	return(count);			// is already a base-0 offset.
+
+} // j__udyCountLeafB1()
+
+
+// ****************************************************************************
+// J U D Y   J P   P O P 1
+//
+// This function takes any type of JP other than a root-level JP (cJU_LEAFW* or
+// cJU_JPBRANCH* with no number suffix) and extracts the Pop1 from it.  In some
+// sense this is a wrapper around the JU_JP*_POP0 macros.  Why write it as a
+// function instead of a complex macro containing a trinary?  (See version
+// Judy1.h version 4.17.)  We think its cheaper to call a function containing
+// a switch statement with "constant" cases than to do the variable
+// calculations in a trinary.
+//
+// For invalid JP Types return cJU_ALLONES.  Note that this is an impossibly
+// high Pop1 for any JP below a top level branch.
+
+FUNCTION Word_t j__udyJPPop1(
+const	Pjp_t Pjp)		// JP to count.
+{
+	switch (JU_JPTYPE(Pjp))
+	{
+#ifdef notdef // caller should shortcut and not even call with these:
+
+	case cJU_JPNULL1:
+	case cJU_JPNULL2:
+	case cJU_JPNULL3:  return(0);
+#ifdef JU_64BIT
+	case cJU_JPNULL4:
+	case cJU_JPNULL5:
+	case cJU_JPNULL6:
+	case cJU_JPNULL7:  return(0);
+#endif
+#endif // notdef
+
+	case cJU_JPBRANCH_L2:
+	case cJU_JPBRANCH_B2:
+	case cJU_JPBRANCH_U2: return(JU_JPBRANCH_POP0(Pjp,2) + 1);
+
+	case cJU_JPBRANCH_L3:
+	case cJU_JPBRANCH_B3:
+	case cJU_JPBRANCH_U3: return(JU_JPBRANCH_POP0(Pjp,3) + 1);
+
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_L4:
+	case cJU_JPBRANCH_B4:
+	case cJU_JPBRANCH_U4: return(JU_JPBRANCH_POP0(Pjp,4) + 1);
+
+	case cJU_JPBRANCH_L5:
+	case cJU_JPBRANCH_B5:
+	case cJU_JPBRANCH_U5: return(JU_JPBRANCH_POP0(Pjp,5) + 1);
+
+	case cJU_JPBRANCH_L6:
+	case cJU_JPBRANCH_B6:
+	case cJU_JPBRANCH_U6: return(JU_JPBRANCH_POP0(Pjp,6) + 1);
+
+	case cJU_JPBRANCH_L7:
+	case cJU_JPBRANCH_B7:
+	case cJU_JPBRANCH_U7: return(JU_JPBRANCH_POP0(Pjp,7) + 1);
+#endif
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+	case cJU_JPLEAF1:
+#endif
+	case cJU_JPLEAF2:
+	case cJU_JPLEAF3:
+#ifdef JU_64BIT
+	case cJU_JPLEAF4:
+	case cJU_JPLEAF5:
+	case cJU_JPLEAF6:
+	case cJU_JPLEAF7:
+#endif
+	case cJU_JPLEAF_B1:	return(JU_JPLEAF_POP0(Pjp) + 1);
+
+#ifdef JUDY1
+	case cJ1_JPFULLPOPU1:	return(cJU_JPFULLPOPU1_POP0 + 1);
+#endif
+
+	case cJU_JPIMMED_1_01:
+	case cJU_JPIMMED_2_01:
+	case cJU_JPIMMED_3_01:	return(1);
+#ifdef JU_64BIT
+	case cJU_JPIMMED_4_01:
+	case cJU_JPIMMED_5_01:
+	case cJU_JPIMMED_6_01:
+	case cJU_JPIMMED_7_01:	return(1);
+#endif
+
+	case cJU_JPIMMED_1_02:	return(2);
+	case cJU_JPIMMED_1_03:	return(3);
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_1_04:	return(4);
+	case cJU_JPIMMED_1_05:	return(5);
+	case cJU_JPIMMED_1_06:	return(6);
+	case cJU_JPIMMED_1_07:	return(7);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_1_08:	return(8);
+	case cJ1_JPIMMED_1_09:	return(9);
+	case cJ1_JPIMMED_1_10:	return(10);
+	case cJ1_JPIMMED_1_11:	return(11);
+	case cJ1_JPIMMED_1_12:	return(12);
+	case cJ1_JPIMMED_1_13:	return(13);
+	case cJ1_JPIMMED_1_14:	return(14);
+	case cJ1_JPIMMED_1_15:	return(15);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_2_02:	return(2);
+	case cJU_JPIMMED_2_03:	return(3);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_2_04:	return(4);
+	case cJ1_JPIMMED_2_05:	return(5);
+	case cJ1_JPIMMED_2_06:	return(6);
+	case cJ1_JPIMMED_2_07:	return(7);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_3_02:	return(2);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_3_03:	return(3);
+	case cJ1_JPIMMED_3_04:	return(4);
+	case cJ1_JPIMMED_3_05:	return(5);
+
+	case cJ1_JPIMMED_4_02:	return(2);
+	case cJ1_JPIMMED_4_03:	return(3);
+
+	case cJ1_JPIMMED_5_02:	return(2);
+	case cJ1_JPIMMED_5_03:	return(3);
+
+	case cJ1_JPIMMED_6_02:	return(2);
+
+	case cJ1_JPIMMED_7_02:	return(2);
+#endif
+
+	default:		return(cJU_ALLONES);
+	}
+
+	/*NOTREACHED*/
+
+} // j__udyJPPop1()
diff --git a/libs/klib/judy/JudyCreateBranch.c b/libs/klib/judy/JudyCreateBranch.c
new file mode 100644
index 0000000..1234c31
--- /dev/null
+++ b/libs/klib/judy/JudyCreateBranch.c
@@ -0,0 +1,312 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Branch creation functions for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+
+// ****************************************************************************
+// J U D Y   C R E A T E   B R A N C H   L
+//
+// Build a BranchL from an array of JPs and associated 1 byte digits
+// (expanses).  Return with Pjp pointing to the BranchL.  Caller must
+// deallocate passed arrays, if necessary.
+//
+// We have no idea what kind of BranchL it is, so caller must set the jp_Type.
+//
+// Return -1 if error (details in Pjpm), otherwise return 1.
+
+FUNCTION int j__udyCreateBranchL(
+	Pjp_t	Pjp,		// Build JPs from this place
+	Pjp_t	PJPs,		// Array of JPs to put into Bitmap branch
+	uint8_t Exp[],		// Array of expanses to put into bitmap
+	Word_t  ExpCnt,		// Number of above JPs and Expanses
+	Pvoid_t	Pjpm)
+{
+	Pjbl_t	PjblRaw;	// pointer to linear branch.
+	Pjbl_t	Pjbl;
+
+	assert(ExpCnt <= cJU_BRANCHLMAXJPS);
+
+	PjblRaw	= j__udyAllocJBL(Pjpm);
+	if (PjblRaw == (Pjbl_t) NULL) return(-1);
+        Pjbl    = P_JBL(PjblRaw);
+
+//	Build a Linear Branch
+	Pjbl->jbl_NumJPs = ExpCnt;
+
+//	Copy from the Linear branch from splayed leaves
+	JU_COPYMEM(Pjbl->jbl_Expanse, Exp,  ExpCnt);
+	JU_COPYMEM(Pjbl->jbl_jp,      PJPs, ExpCnt);
+
+//	Pass back new pointer to the Linear branch in JP
+	Pjp->jp_Addr = (Word_t) PjblRaw;
+
+	return(1);
+
+} // j__udyCreateBranchL()
+
+
+// ****************************************************************************
+// J U D Y   C R E A T E   B R A N C H   B
+//
+// Build a BranchB from an array of JPs and associated 1 byte digits
+// (expanses).  Return with Pjp pointing to the BranchB.  Caller must
+// deallocate passed arrays, if necessary.
+//
+// We have no idea what kind of BranchB it is, so caller must set the jp_Type.
+//
+// Return -1 if error (details in Pjpm), otherwise return 1.
+
+FUNCTION int j__udyCreateBranchB(
+	Pjp_t	Pjp,		// Build JPs from this place
+	Pjp_t	PJPs,		// Array of JPs to put into Bitmap branch
+	uint8_t Exp[],		// Array of expanses to put into bitmap
+	Word_t  ExpCnt,		// Number of above JPs and Expanses
+	Pvoid_t	Pjpm)
+{
+	Pjbb_t	PjbbRaw;	// pointer to bitmap branch.
+	Pjbb_t	Pjbb;
+	Word_t  ii, jj;		// Temps
+	uint8_t CurrSubExp;	// Current sub expanse for BM
+
+// This assertion says the number of populated subexpanses is not too large.
+// This function is only called when a BranchL overflows to a BranchB or when a
+// cascade occurs, meaning a leaf overflows.  Either way ExpCnt cant be very
+// large, in fact a lot smaller than cJU_BRANCHBMAXJPS.  (Otherwise a BranchU
+// would be used.)  Popping this assertion means something (unspecified) has
+// gone very wrong, or else Judys design criteria have changed, although in
+// fact there should be no HARM in creating a BranchB with higher actual
+// fanout.
+
+	assert(ExpCnt <= cJU_BRANCHBMAXJPS);
+
+//	Get memory for a Bitmap branch
+	PjbbRaw	= j__udyAllocJBB(Pjpm);
+	if (PjbbRaw == (Pjbb_t) NULL) return(-1);
+	Pjbb = P_JBB(PjbbRaw);
+
+//	Get 1st "sub" expanse (0..7) of bitmap branch
+	CurrSubExp = Exp[0] / cJU_BITSPERSUBEXPB;
+
+// Index thru all 1 byte sized expanses:
+
+	for (jj = ii = 0; ii <= ExpCnt; ii++)
+	{
+		Word_t SubExp;	// Cannot be a uint8_t
+
+//		Make sure we cover the last one
+		if (ii == ExpCnt)
+		{
+			SubExp = cJU_ALLONES;	// Force last one
+		}
+		else
+		{
+//			Calculate the "sub" expanse of the byte expanse
+			SubExp = Exp[ii] / cJU_BITSPERSUBEXPB;  // Bits 5..7.
+
+//			Set the bit that represents the expanse in Exp[]
+			JU_JBB_BITMAP(Pjbb, SubExp) |= JU_BITPOSMASKB(Exp[ii]);
+		}
+//		Check if a new "sub" expanse range needed
+		if (SubExp != CurrSubExp)
+		{
+//			Get number of JPs in this sub expanse
+			Word_t NumJP = ii - jj;
+			Pjp_t  PjpRaw;
+			Pjp_t  Pjp;
+
+			PjpRaw = j__udyAllocJBBJP(NumJP, Pjpm);
+                        Pjp    = P_JP(PjpRaw);
+
+			if (PjpRaw == (Pjp_t) NULL)	// out of memory.
+			{
+
+// Free any previous allocations:
+
+			    while(CurrSubExp--)
+			    {
+				NumJP = j__udyCountBitsB(JU_JBB_BITMAP(Pjbb,
+								  CurrSubExp));
+				if (NumJP)
+				{
+				    j__udyFreeJBBJP(JU_JBB_PJP(Pjbb,
+						    CurrSubExp), NumJP, Pjpm);
+				}
+			    }
+			    j__udyFreeJBB(PjbbRaw, Pjpm);
+			    return(-1);
+			}
+
+// Place the array of JPs in bitmap branch:
+
+			JU_JBB_PJP(Pjbb, CurrSubExp) = PjpRaw;
+
+// Copy the JPs to new leaf:
+
+			JU_COPYMEM(Pjp, PJPs + jj, NumJP);
+
+// On to the next bitmap branch "sub" expanse:
+
+			jj	   = ii;
+			CurrSubExp = SubExp;
+		}
+	} // for each 1-byte expanse
+
+// Pass back some of the JP to the new Bitmap branch:
+
+	Pjp->jp_Addr = (Word_t) PjbbRaw;
+
+	return(1);
+
+} // j__udyCreateBranchB()
+
+
+// ****************************************************************************
+// J U D Y   C R E A T E   B R A N C H   U
+//
+// Build a BranchU from a BranchB.  Return with Pjp pointing to the BranchU.
+// Free the BranchB and its JP subarrays.
+//
+// Return -1 if error (details in Pjpm), otherwise return 1.
+
+FUNCTION int j__udyCreateBranchU(
+	Pjp_t	  Pjp,
+	Pvoid_t	  Pjpm)
+{
+	jp_t	  JPNull;
+        Pjbu_t    PjbuRaw;
+        Pjbu_t    Pjbu;
+	Pjbb_t	  PjbbRaw;
+	Pjbb_t	  Pjbb;
+	Word_t	  ii, jj;
+	BITMAPB_t BitMap;
+	Pjp_t	  PDstJP;
+#ifdef JU_STAGED_EXP
+	jbu_t	  BranchU;	// Staged uncompressed branch
+#else
+
+// Allocate memory for a BranchU:
+
+	PjbuRaw = j__udyAllocJBU(Pjpm);
+	if (PjbuRaw == (Pjbu_t) NULL) return(-1);
+        Pjbu = P_JBU(PjbuRaw);
+#endif
+        JU_JPSETADT(&JPNull, 0, 0, JU_JPTYPE(Pjp) - cJU_JPBRANCH_B2 + cJU_JPNULL1);
+
+// Get the pointer to the BranchB:
+
+	PjbbRaw	= (Pjbb_t) (Pjp->jp_Addr);
+	Pjbb	= P_JBB(PjbbRaw);
+
+//	Set the pointer to the Uncompressed branch
+#ifdef JU_STAGED_EXP
+	PDstJP = BranchU.jbu_jp;
+#else
+        PDstJP = Pjbu->jbu_jp;
+#endif
+	for (ii = 0; ii < cJU_NUMSUBEXPB; ii++)
+	{
+		Pjp_t	PjpA;
+		Pjp_t	PjpB;
+
+		PjpB = PjpA = P_JP(JU_JBB_PJP(Pjbb, ii));
+
+//		Get the bitmap for this subexpanse
+		BitMap	= JU_JBB_BITMAP(Pjbb, ii);
+
+//		NULL empty subexpanses
+		if (BitMap == 0)
+		{
+//			But, fill with NULLs
+			for (jj = 0; jj < cJU_BITSPERSUBEXPB; jj++)
+			{
+				PDstJP[jj] = JPNull;
+			}
+			PDstJP += cJU_BITSPERSUBEXPB;
+			continue;
+		}
+//		Check if Uncompressed subexpanse
+		if (BitMap == cJU_FULLBITMAPB)
+		{
+//			Copy subexpanse to the Uncompressed branch intact
+			JU_COPYMEM(PDstJP, PjpA, cJU_BITSPERSUBEXPB);
+
+//			Bump to next subexpanse
+			PDstJP += cJU_BITSPERSUBEXPB;
+
+//			Set length of subexpanse
+			jj = cJU_BITSPERSUBEXPB;
+		}
+		else
+		{
+			for (jj = 0; jj < cJU_BITSPERSUBEXPB; jj++)
+			{
+//				Copy JP or NULLJP depending on bit
+				if (BitMap & 1) { *PDstJP = *PjpA++; }
+				else		{ *PDstJP = JPNull; }
+
+				PDstJP++;	// advance to next JP
+				BitMap >>= 1;
+			}
+			jj = PjpA - PjpB;
+		}
+
+// Free the subexpanse:
+
+		j__udyFreeJBBJP(JU_JBB_PJP(Pjbb, ii), jj, Pjpm);
+
+	} // for each JP in BranchU
+
+#ifdef JU_STAGED_EXP
+
+// Allocate memory for a BranchU:
+
+	PjbuRaw = j__udyAllocJBU(Pjpm);
+	if (PjbuRaw == (Pjbu_t) NULL) return(-1);
+        Pjbu = P_JBU(PjbuRaw);
+
+// Copy staged branch to newly allocated branch:
+//
+// TBD:  I think this code is broken.
+
+	*Pjbu = BranchU;
+
+#endif // JU_STAGED_EXP
+
+// Finally free the BranchB and put the BranchU in its place:
+
+	j__udyFreeJBB(PjbbRaw, Pjpm);
+
+	Pjp->jp_Addr  = (Word_t) PjbuRaw;
+	Pjp->jp_Type += cJU_JPBRANCH_U - cJU_JPBRANCH_B;
+
+	return(1);
+
+} // j__udyCreateBranchU()
diff --git a/libs/klib/judy/JudyDecascade.c b/libs/klib/judy/JudyDecascade.c
new file mode 100644
index 0000000..da625bc
--- /dev/null
+++ b/libs/klib/judy/JudyDecascade.c
@@ -0,0 +1,1204 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// "Decascade" support functions for JudyDel.c:  These functions convert
+// smaller-index-size leaves to larger-index-size leaves, and also, bitmap
+// leaves (LeafB1s) to Leaf1s, and some types of branches to smaller branches
+// at the same index size.  Some "decascading" occurs explicitly in JudyDel.c,
+// but rare or large subroutines appear as functions here, and the overhead to
+// call them is negligible.
+//
+// Compile with one of -DJUDY1 or -DJUDYL.  Note:  Function names are converted
+// to Judy1 or JudyL specific values by external #defines.
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#endif
+#ifdef JUDYL
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+DBGCODE(extern void JudyCheckSorted(Pjll_t Pjll, Word_t Pop1, long IndexSize);)
+
+
+// ****************************************************************************
+// __ J U D Y   C O P Y   2   T O   3
+//
+// Copy one or more 2-byte Indexes to a series of 3-byte Indexes.
+
+FUNCTION static void j__udyCopy2to3(
+	uint8_t *  PDest,	// to where to copy 3-byte Indexes.
+	uint16_t * PSrc,	// from where to copy 2-byte indexes.
+	Word_t     Pop1,	// number of Indexes to copy.
+	Word_t     MSByte)	// most-significant byte, prefix to each Index.
+{
+	Word_t	   Temp;	// for building 3-byte Index.
+
+	assert(Pop1);
+
+        do {
+	    Temp = MSByte | *PSrc++;
+	    JU_COPY3_LONG_TO_PINDEX(PDest, Temp);
+	    PDest += 3;
+        } while (--Pop1);
+
+} // j__udyCopy2to3()
+
+
+#ifdef JU_64BIT
+
+// ****************************************************************************
+// __ J U D Y   C O P Y   3   T O   4
+//
+// Copy one or more 3-byte Indexes to a series of 4-byte Indexes.
+
+FUNCTION static void j__udyCopy3to4(
+	uint32_t * PDest,	// to where to copy 4-byte Indexes.
+	uint8_t *  PSrc,	// from where to copy 3-byte indexes.
+	Word_t     Pop1,	// number of Indexes to copy.
+	Word_t     MSByte)	// most-significant byte, prefix to each Index.
+{
+	Word_t	   Temp;	// for building 4-byte Index.
+
+	assert(Pop1);
+
+        do {
+	    JU_COPY3_PINDEX_TO_LONG(Temp, PSrc);
+	    Temp |= MSByte;
+	    PSrc += 3;
+	    *PDest++ = Temp;		// truncates to uint32_t.
+        } while (--Pop1);
+
+} // j__udyCopy3to4()
+
+
+// ****************************************************************************
+// __ J U D Y   C O P Y   4   T O   5
+//
+// Copy one or more 4-byte Indexes to a series of 5-byte Indexes.
+
+FUNCTION static void j__udyCopy4to5(
+	uint8_t *  PDest,	// to where to copy 4-byte Indexes.
+	uint32_t * PSrc,	// from where to copy 4-byte indexes.
+	Word_t     Pop1,	// number of Indexes to copy.
+	Word_t     MSByte)	// most-significant byte, prefix to each Index.
+{
+	Word_t	   Temp;	// for building 5-byte Index.
+
+	assert(Pop1);
+
+        do {
+	    Temp = MSByte | *PSrc++;
+	    JU_COPY5_LONG_TO_PINDEX(PDest, Temp);
+	    PDest += 5;
+        } while (--Pop1);
+
+} // j__udyCopy4to5()
+
+
+// ****************************************************************************
+// __ J U D Y   C O P Y   5   T O   6
+//
+// Copy one or more 5-byte Indexes to a series of 6-byte Indexes.
+
+FUNCTION static void j__udyCopy5to6(
+	uint8_t * PDest,	// to where to copy 6-byte Indexes.
+	uint8_t * PSrc,		// from where to copy 5-byte indexes.
+	Word_t    Pop1,		// number of Indexes to copy.
+	Word_t    MSByte)	// most-significant byte, prefix to each Index.
+{
+	Word_t	  Temp;		// for building 6-byte Index.
+
+	assert(Pop1);
+
+        do {
+	    JU_COPY5_PINDEX_TO_LONG(Temp, PSrc);
+	    Temp |= MSByte;
+	    JU_COPY6_LONG_TO_PINDEX(PDest, Temp);
+	    PSrc  += 5;
+	    PDest += 6;
+        } while (--Pop1);
+
+} // j__udyCopy5to6()
+
+
+// ****************************************************************************
+// __ J U D Y   C O P Y   6   T O   7
+//
+// Copy one or more 6-byte Indexes to a series of 7-byte Indexes.
+
+FUNCTION static void j__udyCopy6to7(
+	uint8_t * PDest,	// to where to copy 6-byte Indexes.
+	uint8_t * PSrc,		// from where to copy 5-byte indexes.
+	Word_t    Pop1,		// number of Indexes to copy.
+	Word_t    MSByte)	// most-significant byte, prefix to each Index.
+{
+	Word_t	  Temp;		// for building 6-byte Index.
+
+	assert(Pop1);
+
+        do {
+	    JU_COPY6_PINDEX_TO_LONG(Temp, PSrc);
+	    Temp |= MSByte;
+	    JU_COPY7_LONG_TO_PINDEX(PDest, Temp);
+	    PSrc  += 6;
+	    PDest += 7;
+        } while (--Pop1);
+
+} // j__udyCopy6to7()
+
+#endif // JU_64BIT
+
+
+#ifndef JU_64BIT // 32-bit
+
+// ****************************************************************************
+// __ J U D Y   C O P Y   3   T O   W
+//
+// Copy one or more 3-byte Indexes to a series of longs (words, always 4-byte).
+
+FUNCTION static void j__udyCopy3toW(
+	PWord_t   PDest,	// to where to copy full-word Indexes.
+	uint8_t * PSrc,		// from where to copy 3-byte indexes.
+	Word_t    Pop1,		// number of Indexes to copy.
+	Word_t    MSByte)	// most-significant byte, prefix to each Index.
+{
+	assert(Pop1);
+
+        do {
+	    JU_COPY3_PINDEX_TO_LONG(*PDest, PSrc);
+	    *PDest++ |= MSByte;
+	    PSrc     += 3;
+        } while (--Pop1);
+
+} // j__udyCopy3toW()
+
+
+#else // JU_64BIT
+
+// ****************************************************************************
+// __ J U D Y   C O P Y   7   T O   W
+//
+// Copy one or more 7-byte Indexes to a series of longs (words, always 8-byte).
+
+FUNCTION static void j__udyCopy7toW(
+	PWord_t   PDest,	// to where to copy full-word Indexes.
+	uint8_t * PSrc,		// from where to copy 7-byte indexes.
+	Word_t    Pop1,		// number of Indexes to copy.
+	Word_t    MSByte)	// most-significant byte, prefix to each Index.
+{
+	assert(Pop1);
+
+        do {
+	    JU_COPY7_PINDEX_TO_LONG(*PDest, PSrc);
+	    *PDest++ |= MSByte;
+	    PSrc     += 7;
+        } while (--Pop1);
+
+} // j__udyCopy7toW()
+
+#endif // JU_64BIT
+
+
+// ****************************************************************************
+// __ J U D Y   B R A N C H   B   T O   B R A N C H   L
+//
+// When a BranchB shrinks to have few enough JPs, call this function to convert
+// it to a BranchL.  Return 1 for success, or -1 for failure (with details in
+// Pjpm).
+
+FUNCTION int j__udyBranchBToBranchL(
+	Pjp_t	Pjp,		// points to BranchB to shrink.
+	Pvoid_t	Pjpm)		// for global accounting.
+{
+	Pjbb_t	PjbbRaw;	// old BranchB to shrink.
+	Pjbb_t	Pjbb;
+	Pjbl_t	PjblRaw;	// new BranchL to create.
+	Pjbl_t	Pjbl;
+	Word_t	Digit;		// in BranchB.
+	Word_t  NumJPs;		// non-null JPs in BranchB.
+	uint8_t Expanse[cJU_BRANCHLMAXJPS];	// for building jbl_Expanse[].
+	Pjp_t	Pjpjbl;		// current JP in BranchL.
+	Word_t  SubExp;		// in BranchB.
+
+	assert(JU_JPTYPE(Pjp) >= cJU_JPBRANCH_B2);
+	assert(JU_JPTYPE(Pjp) <= cJU_JPBRANCH_B);
+
+	PjbbRaw	= (Pjbb_t) (Pjp->jp_Addr);
+	Pjbb	= P_JBB(PjbbRaw);
+
+// Copy 1-byte subexpanse digits from BranchB to temporary buffer for BranchL,
+// for each bit set in the BranchB:
+//
+// TBD:  The following supports variable-sized linear branches, but they are no
+// longer variable; this could be simplified to save the copying.
+//
+// TBD:  Since cJU_BRANCHLMAXJP == 7 now, and cJU_BRANCHUNUMJPS == 256, the
+// following might be inefficient; is there a faster way to do it?  At least
+// skip wholly empty subexpanses?
+
+	for (NumJPs = Digit = 0; Digit < cJU_BRANCHUNUMJPS; ++Digit)
+	{
+	    if (JU_BITMAPTESTB(Pjbb, Digit))
+	    {
+		Expanse[NumJPs++] = Digit;
+		assert(NumJPs <= cJU_BRANCHLMAXJPS);	// required of caller.
+	    }
+	}
+
+// Allocate and populate the BranchL:
+
+	if ((PjblRaw = j__udyAllocJBL(Pjpm)) == (Pjbl_t) NULL) return(-1);
+	Pjbl = P_JBL(PjblRaw);
+
+	JU_COPYMEM(Pjbl->jbl_Expanse, Expanse, NumJPs);
+
+	Pjbl->jbl_NumJPs = NumJPs;
+	DBGCODE(JudyCheckSorted((Pjll_t) (Pjbl->jbl_Expanse), NumJPs, 1);)
+
+// Copy JPs from each BranchB subexpanse subarray:
+
+	Pjpjbl = P_JP(Pjbl->jbl_jp);	// start at first JP in array.
+
+	for (SubExp = 0; SubExp < cJU_NUMSUBEXPB; ++SubExp)
+	{
+	    Pjp_t PjpRaw = JU_JBB_PJP(Pjbb, SubExp);	// current Pjp.
+	    Pjp_t Pjp;
+
+	    if (PjpRaw == (Pjp_t) NULL) continue;  // skip empty subexpanse.
+	    Pjp = P_JP(PjpRaw);
+
+	    NumJPs = j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, SubExp));
+	    assert(NumJPs);
+	    JU_COPYMEM(Pjpjbl, Pjp, NumJPs);	 // one subarray at a time.
+
+	    Pjpjbl += NumJPs;
+	    j__udyFreeJBBJP(PjpRaw, NumJPs, Pjpm);	// subarray.
+	}
+	j__udyFreeJBB(PjbbRaw, Pjpm);		// BranchB itself.
+
+// Finish up:  Calculate new JP type (same index size = level in new class),
+// and tie new BranchB into parent JP:
+
+	Pjp->jp_Type += cJU_JPBRANCH_L - cJU_JPBRANCH_B;
+	Pjp->jp_Addr  = (Word_t) PjblRaw;
+
+	return(1);
+
+} // j__udyBranchBToBranchL()
+
+
+#ifdef notdef
+
+// ****************************************************************************
+// __ J U D Y   B R A N C H   U   T O   B R A N C H   B
+//
+// When a BranchU shrinks to need little enough memory, call this function to
+// convert it to a BranchB to save memory (at the cost of some speed).  Return
+// 1 for success, or -1 for failure (with details in Pjpm).
+//
+// TBD:  Fill out if/when needed.  Not currently used in JudyDel.c for reasons
+// explained there.
+
+FUNCTION int j__udyBranchUToBranchB(
+	Pjp_t	Pjp,		// points to BranchU to shrink.
+	Pvoid_t	Pjpm)		// for global accounting.
+{
+	assert(FALSE);
+	return(1);
+}
+#endif // notdef
+
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+
+// ****************************************************************************
+// __ J U D Y   L E A F   B 1   T O   L E A F   1
+//
+// Shrink a bitmap leaf (cJU_LEAFB1) to linear leaf (cJU_JPLEAF1).
+// Return 1 for success, or -1 for failure (with details in Pjpm).
+//
+// Note:  This function is different than the other JudyLeaf*ToLeaf*()
+// functions because it receives a Pjp, not just a leaf, and handles its own
+// allocation and free, in order to allow the caller to continue with a LeafB1
+// if allocation fails.
+
+FUNCTION int j__udyLeafB1ToLeaf1(
+	Pjp_t	  Pjp,		// points to LeafB1 to shrink.
+	Pvoid_t	  Pjpm)		// for global accounting.
+{
+	Pjlb_t    PjlbRaw;	// bitmap in old leaf.
+	Pjlb_t    Pjlb;
+	Pjll_t	  PjllRaw;	// new Leaf1.
+	uint8_t	* Pleaf1;	// Leaf1 pointer type.
+	Word_t    Digit;	// in LeafB1 bitmap.
+#ifdef JUDYL
+	Pjv_t	  PjvNew;	// value area in new Leaf1.
+	Word_t    Pop1;
+	Word_t    SubExp;
+#endif
+
+	assert(JU_JPTYPE(Pjp) == cJU_JPLEAF_B1);
+	assert(((JU_JPDCDPOP0(Pjp) & 0xFF) + 1) == cJU_LEAF1_MAXPOP1);
+
+// Allocate JPLEAF1 and prepare pointers:
+
+	if ((PjllRaw = j__udyAllocJLL1(cJU_LEAF1_MAXPOP1, Pjpm)) == 0)
+	    return(-1);
+
+	Pleaf1	= (uint8_t *) P_JLL(PjllRaw);
+	PjlbRaw	= (Pjlb_t) (Pjp->jp_Addr);
+	Pjlb	= P_JLB(PjlbRaw);
+	JUDYLCODE(PjvNew = JL_LEAF1VALUEAREA(Pleaf1, cJL_LEAF1_MAXPOP1);)
+
+// Copy 1-byte indexes from old LeafB1 to new Leaf1:
+
+	for (Digit = 0; Digit < cJU_BRANCHUNUMJPS; ++Digit)
+	    if (JU_BITMAPTESTL(Pjlb, Digit))
+		*Pleaf1++ = Digit;
+
+#ifdef JUDYL
+
+// Copy all old-LeafB1 value areas from value subarrays to new Leaf1:
+
+	for (SubExp = 0; SubExp < cJU_NUMSUBEXPL; ++SubExp)
+	{
+	    Pjv_t PjvRaw = JL_JLB_PVALUE(Pjlb, SubExp);
+	    Pjv_t Pjv    = P_JV(PjvRaw);
+
+	    if (Pjv == (Pjv_t) NULL) continue;	// skip empty subarray.
+
+	    Pop1 = j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, SubExp));  // subarray.
+	    assert(Pop1);
+
+	    JU_COPYMEM(PjvNew, Pjv, Pop1);		// copy value areas.
+	    j__udyLFreeJV(PjvRaw, Pop1, Pjpm);
+	    PjvNew += Pop1;				// advance through new.
+	}
+
+	assert((((Word_t) Pleaf1) - (Word_t) P_JLL(PjllRaw))
+	    == (PjvNew - JL_LEAF1VALUEAREA(P_JLL(PjllRaw), cJL_LEAF1_MAXPOP1)));
+#endif // JUDYL
+
+	DBGCODE(JudyCheckSorted((Pjll_t) P_JLL(PjllRaw),
+			    (((Word_t) Pleaf1) - (Word_t) P_JLL(PjllRaw)), 1);)
+
+// Finish up:  Free the old LeafB1 and plug the new Leaf1 into the JP:
+//
+// Note:  jp_DcdPopO does not change here.
+
+	j__udyFreeJLB1(PjlbRaw, Pjpm);
+
+	Pjp->jp_Addr = (Word_t) PjllRaw;
+	Pjp->jp_Type = cJU_JPLEAF1;
+
+	return(1);
+
+} // j__udyLeafB1ToLeaf1()
+
+#endif // (JUDYL || (! JU_64BIT))
+
+
+// ****************************************************************************
+// __ J U D Y   L E A F   1   T O   L E A F   2
+//
+// Copy 1-byte Indexes from a LeafB1 or Leaf1 to 2-byte Indexes in a Leaf2.
+// Pjp MUST be one of:  cJU_JPLEAF_B1, cJU_JPLEAF1, or cJU_JPIMMED_1_*.
+// Return number of Indexes copied.
+//
+// TBD:  In this and all following functions, the caller should already be able
+// to compute the Pop1 return value, so why return it?
+
+FUNCTION Word_t  j__udyLeaf1ToLeaf2(
+	uint16_t * PLeaf2,	// destination uint16_t * Index portion of leaf.
+#ifdef JUDYL
+	Pjv_t	   Pjv2,	// destination value part of leaf.
+#endif
+	Pjp_t	   Pjp,		// 1-byte-index object from which to copy.
+	Word_t     MSByte,	// most-significant byte, prefix to each Index.
+	Pvoid_t	   Pjpm)	// for global accounting.
+{
+	Word_t	   Pop1;	// Indexes in leaf.
+	Word_t	   Offset;	// in linear leaf list.
+JUDYLCODE(Pjv_t	   Pjv1Raw;)	// source object value area.
+JUDYLCODE(Pjv_t	   Pjv1;)
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// JPLEAF_B1:
+
+	case cJU_JPLEAF_B1:
+	{
+	    Pjlb_t Pjlb = P_JLB(Pjp->jp_Addr);
+	    Word_t Digit;	// in LeafB1 bitmap.
+  JUDYLCODE(Word_t SubExp;)	// in LeafB1.
+
+	    Pop1 = JU_JPBRANCH_POP0(Pjp, 1) + 1; assert(Pop1);
+
+// Copy 1-byte indexes from old LeafB1 to new Leaf2, including splicing in
+// the missing MSByte needed in the Leaf2:
+
+	    for (Digit = 0; Digit < cJU_BRANCHUNUMJPS; ++Digit)
+		if (JU_BITMAPTESTL(Pjlb, Digit))
+		    *PLeaf2++ = MSByte | Digit;
+
+#ifdef JUDYL
+
+// Copy all old-LeafB1 value areas from value subarrays to new Leaf2:
+
+	    for (SubExp = 0; SubExp < cJU_NUMSUBEXPL; ++SubExp)
+	    {
+		Word_t SubExpPop1;
+
+		Pjv1Raw = JL_JLB_PVALUE(Pjlb, SubExp);
+		if (Pjv1Raw == (Pjv_t) NULL) continue;	// skip empty.
+		Pjv1 = P_JV(Pjv1Raw);
+
+		SubExpPop1 = j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, SubExp));
+		assert(SubExpPop1);
+
+		JU_COPYMEM(Pjv2, Pjv1, SubExpPop1);	// copy value areas.
+		j__udyLFreeJV(Pjv1Raw, SubExpPop1, Pjpm);
+		Pjv2 += SubExpPop1;			// advance through new.
+	    }
+#endif // JUDYL
+
+	    j__udyFreeJLB1((Pjlb_t) (Pjp->jp_Addr), Pjpm);  // LeafB1 itself.
+	    return(Pop1);
+
+	} // case cJU_JPLEAF_B1
+
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+
+// JPLEAF1:
+
+	case cJU_JPLEAF1:
+	{
+	    uint8_t * PLeaf1 = (uint8_t *) P_JLL(Pjp->jp_Addr);
+
+	    Pop1 = JU_JPBRANCH_POP0(Pjp, 1) + 1; assert(Pop1);
+	    JUDYLCODE(Pjv1 = JL_LEAF1VALUEAREA(PLeaf1, Pop1);)
+
+// Copy all Index bytes including splicing in missing MSByte needed in Leaf2
+// (plus, for JudyL, value areas):
+
+	    for (Offset = 0; Offset < Pop1; ++Offset)
+	    {
+		PLeaf2[Offset] = MSByte | PLeaf1[Offset];
+		JUDYLCODE(Pjv2[Offset] = Pjv1[Offset];)
+	    }
+	    j__udyFreeJLL1((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    return(Pop1);
+	}
+#endif // (JUDYL || (! JU_64BIT))
+
+
+// JPIMMED_1_01:
+//
+// Note:  jp_DcdPopO has 3 [7] bytes of Index (all but most significant byte),
+// so the assignment to PLeaf2[] truncates and MSByte is not needed.
+
+	case cJU_JPIMMED_1_01:
+	{
+	    PLeaf2[0] = JU_JPDCDPOP0(Pjp);	// see above.
+	    JUDYLCODE(Pjv2[0] = Pjp->jp_Addr;)
+	    return(1);
+	}
+
+
+// JPIMMED_1_0[2+]:
+
+	case cJU_JPIMMED_1_02:
+	case cJU_JPIMMED_1_03:
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_1_04:
+	case cJU_JPIMMED_1_05:
+	case cJU_JPIMMED_1_06:
+	case cJU_JPIMMED_1_07:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_1_08:
+	case cJ1_JPIMMED_1_09:
+	case cJ1_JPIMMED_1_10:
+	case cJ1_JPIMMED_1_11:
+	case cJ1_JPIMMED_1_12:
+	case cJ1_JPIMMED_1_13:
+	case cJ1_JPIMMED_1_14:
+	case cJ1_JPIMMED_1_15:
+#endif
+	{
+	    Pop1 = JU_JPTYPE(Pjp) - cJU_JPIMMED_1_02 + 2; assert(Pop1);
+	    JUDYLCODE(Pjv1Raw = (Pjv_t) (Pjp->jp_Addr);)
+	    JUDYLCODE(Pjv1    = P_JV(Pjv1Raw);)
+
+	    for (Offset = 0; Offset < Pop1; ++Offset)
+	    {
+#ifdef JUDY1
+		PLeaf2[Offset] = MSByte | Pjp->jp_1Index[Offset];
+#else
+		PLeaf2[Offset] = MSByte | Pjp->jp_LIndex[Offset];
+		Pjv2  [Offset] = Pjv1[Offset];
+#endif
+	    }
+	    JUDYLCODE(j__udyLFreeJV(Pjv1Raw, Pop1, Pjpm);)
+	    return(Pop1);
+	}
+
+
+// UNEXPECTED CASES, including JPNULL1, should be handled by caller:
+
+	default: assert(FALSE); break;
+
+	} // switch
+
+	return(0);
+
+} // j__udyLeaf1ToLeaf2()
+
+
+// *****************************************************************************
+// __ J U D Y   L E A F   2   T O   L E A F   3
+//
+// Copy 2-byte Indexes from a Leaf2 to 3-byte Indexes in a Leaf3.
+// Pjp MUST be one of:  cJU_JPLEAF2 or cJU_JPIMMED_2_*.
+// Return number of Indexes copied.
+//
+// Note:  By the time this function is called to compress a level-3 branch to a
+// Leaf3, the branch has no narrow pointers under it, meaning only level-2
+// objects are below it and must be handled here.
+
+FUNCTION Word_t  j__udyLeaf2ToLeaf3(
+	uint8_t * PLeaf3,	// destination "uint24_t *" Index part of leaf.
+#ifdef JUDYL
+	Pjv_t	  Pjv3,		// destination value part of leaf.
+#endif
+	Pjp_t	  Pjp,		// 2-byte-index object from which to copy.
+	Word_t    MSByte,	// most-significant byte, prefix to each Index.
+	Pvoid_t	  Pjpm)		// for global accounting.
+{
+	Word_t	  Pop1;		// Indexes in leaf.
+#if (defined(JUDYL) && defined(JU_64BIT))
+	Pjv_t	  Pjv2Raw;	// source object value area.
+#endif
+JUDYLCODE(Pjv_t	  Pjv2;)
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// JPLEAF2:
+
+	case cJU_JPLEAF2:
+	{
+	    uint16_t * PLeaf2 = (uint16_t *) P_JLL(Pjp->jp_Addr);
+
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1; assert(Pop1);
+	    j__udyCopy2to3(PLeaf3, PLeaf2, Pop1, MSByte);
+#ifdef JUDYL
+	    Pjv2 = JL_LEAF2VALUEAREA(PLeaf2, Pop1);
+	    JU_COPYMEM(Pjv3, Pjv2, Pop1);
+#endif
+	    j__udyFreeJLL2((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    return(Pop1);
+	}
+
+
+// JPIMMED_2_01:
+//
+// Note:  jp_DcdPopO has 3 [7] bytes of Index (all but most significant byte),
+// so the "assignment" to PLeaf3[] is exact [truncates] and MSByte is not
+// needed.
+
+	case cJU_JPIMMED_2_01:
+	{
+	    JU_COPY3_LONG_TO_PINDEX(PLeaf3, JU_JPDCDPOP0(Pjp));	// see above.
+	    JUDYLCODE(Pjv3[0] = Pjp->jp_Addr;)
+	    return(1);
+	}
+
+
+// JPIMMED_2_0[2+]:
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_2_02:
+	case cJU_JPIMMED_2_03:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_2_04:
+	case cJ1_JPIMMED_2_05:
+	case cJ1_JPIMMED_2_06:
+	case cJ1_JPIMMED_2_07:
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+	{
+	    JUDY1CODE(uint16_t * PLeaf2 = (uint16_t *) (Pjp->jp_1Index);)
+	    JUDYLCODE(uint16_t * PLeaf2 = (uint16_t *) (Pjp->jp_LIndex);)
+
+	    Pop1 = JU_JPTYPE(Pjp) - cJU_JPIMMED_2_02 + 2; assert(Pop1);
+	    j__udyCopy2to3(PLeaf3, PLeaf2, Pop1, MSByte);
+#ifdef JUDYL
+	    Pjv2Raw = (Pjv_t) (Pjp->jp_Addr);
+	    Pjv2    = P_JV(Pjv2Raw);
+	    JU_COPYMEM(Pjv3, Pjv2, Pop1);
+	    j__udyLFreeJV(Pjv2Raw, Pop1, Pjpm);
+#endif
+	    return(Pop1);
+	}
+#endif // (JUDY1 || JU_64BIT)
+
+
+// UNEXPECTED CASES, including JPNULL2, should be handled by caller:
+
+	default: assert(FALSE); break;
+
+	} // switch
+
+	return(0);
+
+} // j__udyLeaf2ToLeaf3()
+
+
+#ifdef JU_64BIT
+
+// ****************************************************************************
+// __ J U D Y   L E A F   3   T O   L E A F   4
+//
+// Copy 3-byte Indexes from a Leaf3 to 4-byte Indexes in a Leaf4.
+// Pjp MUST be one of:  cJU_JPLEAF3 or cJU_JPIMMED_3_*.
+// Return number of Indexes copied.
+//
+// Note:  By the time this function is called to compress a level-4 branch to a
+// Leaf4, the branch has no narrow pointers under it, meaning only level-3
+// objects are below it and must be handled here.
+
+FUNCTION Word_t  j__udyLeaf3ToLeaf4(
+	uint32_t * PLeaf4,	// destination uint32_t * Index part of leaf.
+#ifdef JUDYL
+	Pjv_t	   Pjv4,	// destination value part of leaf.
+#endif
+	Pjp_t	   Pjp,		// 3-byte-index object from which to copy.
+	Word_t     MSByte,	// most-significant byte, prefix to each Index.
+	Pvoid_t	   Pjpm)	// for global accounting.
+{
+	Word_t	   Pop1;	// Indexes in leaf.
+JUDYLCODE(Pjv_t	   Pjv3Raw;)	// source object value area.
+JUDYLCODE(Pjv_t	   Pjv3;)
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// JPLEAF3:
+
+	case cJU_JPLEAF3:
+	{
+	    uint8_t * PLeaf3 = (uint8_t *) P_JLL(Pjp->jp_Addr);
+
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1; assert(Pop1);
+	    j__udyCopy3to4(PLeaf4, (uint8_t *) PLeaf3, Pop1, MSByte);
+#ifdef JUDYL
+	    Pjv3 = JL_LEAF3VALUEAREA(PLeaf3, Pop1);
+	    JU_COPYMEM(Pjv4, Pjv3, Pop1);
+#endif
+	    j__udyFreeJLL3((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    return(Pop1);
+	}
+
+
+// JPIMMED_3_01:
+//
+// Note:  jp_DcdPopO has 7 bytes of Index (all but most significant byte), so
+// the assignment to PLeaf4[] truncates and MSByte is not needed.
+
+	case cJU_JPIMMED_3_01:
+	{
+	    PLeaf4[0] = JU_JPDCDPOP0(Pjp);	// see above.
+	    JUDYLCODE(Pjv4[0] = Pjp->jp_Addr;)
+	    return(1);
+	}
+
+
+// JPIMMED_3_0[2+]:
+
+	case cJU_JPIMMED_3_02:
+#ifdef JUDY1
+	case cJ1_JPIMMED_3_03:
+	case cJ1_JPIMMED_3_04:
+	case cJ1_JPIMMED_3_05:
+#endif
+	{
+	    JUDY1CODE(uint8_t * PLeaf3 = (uint8_t *) (Pjp->jp_1Index);)
+	    JUDYLCODE(uint8_t * PLeaf3 = (uint8_t *) (Pjp->jp_LIndex);)
+
+	    JUDY1CODE(Pop1 = JU_JPTYPE(Pjp) - cJU_JPIMMED_3_02 + 2;)
+	    JUDYLCODE(Pop1 = 2;)
+
+	    j__udyCopy3to4(PLeaf4, PLeaf3, Pop1, MSByte);
+#ifdef JUDYL
+	    Pjv3Raw = (Pjv_t) (Pjp->jp_Addr);
+	    Pjv3    = P_JV(Pjv3Raw);
+	    JU_COPYMEM(Pjv4, Pjv3, Pop1);
+	    j__udyLFreeJV(Pjv3Raw, Pop1, Pjpm);
+#endif
+	    return(Pop1);
+	}
+
+
+// UNEXPECTED CASES, including JPNULL3, should be handled by caller:
+
+	default: assert(FALSE); break;
+
+	} // switch
+
+	return(0);
+
+} // j__udyLeaf3ToLeaf4()
+
+
+// Note:  In all following j__udyLeaf*ToLeaf*() functions, JPIMMED_*_0[2+]
+// cases exist for Judy1 (&& 64-bit) only.  JudyL has no equivalent Immeds.
+
+
+// *****************************************************************************
+// __ J U D Y   L E A F   4   T O   L E A F   5
+//
+// Copy 4-byte Indexes from a Leaf4 to 5-byte Indexes in a Leaf5.
+// Pjp MUST be one of:  cJU_JPLEAF4 or cJU_JPIMMED_4_*.
+// Return number of Indexes copied.
+//
+// Note:  By the time this function is called to compress a level-5 branch to a
+// Leaf5, the branch has no narrow pointers under it, meaning only level-4
+// objects are below it and must be handled here.
+
+FUNCTION Word_t  j__udyLeaf4ToLeaf5(
+	uint8_t * PLeaf5,	// destination "uint40_t *" Index part of leaf.
+#ifdef JUDYL
+	Pjv_t	  Pjv5,		// destination value part of leaf.
+#endif
+	Pjp_t	  Pjp,		// 4-byte-index object from which to copy.
+	Word_t    MSByte,	// most-significant byte, prefix to each Index.
+	Pvoid_t	  Pjpm)		// for global accounting.
+{
+	Word_t	  Pop1;		// Indexes in leaf.
+JUDYLCODE(Pjv_t	  Pjv4;)	// source object value area.
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// JPLEAF4:
+
+	case cJU_JPLEAF4:
+	{
+	    uint32_t * PLeaf4 = (uint32_t *) P_JLL(Pjp->jp_Addr);
+
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1; assert(Pop1);
+	    j__udyCopy4to5(PLeaf5, PLeaf4, Pop1, MSByte);
+#ifdef JUDYL
+	    Pjv4 = JL_LEAF4VALUEAREA(PLeaf4, Pop1);
+	    JU_COPYMEM(Pjv5, Pjv4, Pop1);
+#endif
+	    j__udyFreeJLL4((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    return(Pop1);
+	}
+
+
+// JPIMMED_4_01:
+//
+// Note:  jp_DcdPopO has 7 bytes of Index (all but most significant byte), so
+// the assignment to PLeaf5[] truncates and MSByte is not needed.
+
+	case cJU_JPIMMED_4_01:
+	{
+	    JU_COPY5_LONG_TO_PINDEX(PLeaf5, JU_JPDCDPOP0(Pjp));	// see above.
+	    JUDYLCODE(Pjv5[0] = Pjp->jp_Addr;)
+	    return(1);
+	}
+
+
+#ifdef JUDY1
+
+// JPIMMED_4_0[4+]:
+
+	case cJ1_JPIMMED_4_02:
+	case cJ1_JPIMMED_4_03:
+	{
+	    uint32_t * PLeaf4 = (uint32_t *) (Pjp->jp_1Index);
+
+	    Pop1 = JU_JPTYPE(Pjp) - cJ1_JPIMMED_4_02 + 2;
+	    j__udyCopy4to5(PLeaf5, PLeaf4, Pop1, MSByte);
+	    return(Pop1);
+	}
+#endif // JUDY1
+
+
+// UNEXPECTED CASES, including JPNULL4, should be handled by caller:
+
+	default: assert(FALSE); break;
+
+	} // switch
+
+	return(0);
+
+} // j__udyLeaf4ToLeaf5()
+
+
+// ****************************************************************************
+// __ J U D Y   L E A F   5   T O   L E A F   6
+//
+// Copy 5-byte Indexes from a Leaf5 to 6-byte Indexes in a Leaf6.
+// Pjp MUST be one of:  cJU_JPLEAF5 or cJU_JPIMMED_5_*.
+// Return number of Indexes copied.
+//
+// Note:  By the time this function is called to compress a level-6 branch to a
+// Leaf6, the branch has no narrow pointers under it, meaning only level-5
+// objects are below it and must be handled here.
+
+FUNCTION Word_t  j__udyLeaf5ToLeaf6(
+	uint8_t * PLeaf6,	// destination uint8_t * Index part of leaf.
+#ifdef JUDYL
+	Pjv_t	  Pjv6,		// destination value part of leaf.
+#endif
+	Pjp_t	  Pjp,		// 5-byte-index object from which to copy.
+	Word_t    MSByte,	// most-significant byte, prefix to each Index.
+	Pvoid_t	  Pjpm)		// for global accounting.
+{
+	Word_t	  Pop1;		// Indexes in leaf.
+JUDYLCODE(Pjv_t	  Pjv5;)	// source object value area.
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// JPLEAF5:
+
+	case cJU_JPLEAF5:
+	{
+	    uint8_t * PLeaf5 = (uint8_t *) P_JLL(Pjp->jp_Addr);
+
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1; assert(Pop1);
+	    j__udyCopy5to6(PLeaf6, PLeaf5, Pop1, MSByte);
+#ifdef JUDYL
+	    Pjv5 = JL_LEAF5VALUEAREA(PLeaf5, Pop1);
+	    JU_COPYMEM(Pjv6, Pjv5, Pop1);
+#endif
+	    j__udyFreeJLL5((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    return(Pop1);
+	}
+
+
+// JPIMMED_5_01:
+//
+// Note:  jp_DcdPopO has 7 bytes of Index (all but most significant byte), so
+// the assignment to PLeaf6[] truncates and MSByte is not needed.
+
+	case cJU_JPIMMED_5_01:
+	{
+	    JU_COPY6_LONG_TO_PINDEX(PLeaf6, JU_JPDCDPOP0(Pjp));	// see above.
+	    JUDYLCODE(Pjv6[0] = Pjp->jp_Addr;)
+	    return(1);
+	}
+
+
+#ifdef JUDY1
+
+// JPIMMED_5_0[2+]:
+
+	case cJ1_JPIMMED_5_02:
+	case cJ1_JPIMMED_5_03:
+	{
+	    uint8_t * PLeaf5 = (uint8_t *) (Pjp->jp_1Index);
+
+	    Pop1 = JU_JPTYPE(Pjp) - cJ1_JPIMMED_5_02 + 2;
+	    j__udyCopy5to6(PLeaf6, PLeaf5, Pop1, MSByte);
+	    return(Pop1);
+	}
+#endif // JUDY1
+
+
+// UNEXPECTED CASES, including JPNULL5, should be handled by caller:
+
+	default: assert(FALSE); break;
+
+	} // switch
+
+	return(0);
+
+} // j__udyLeaf5ToLeaf6()
+
+
+// *****************************************************************************
+// __ J U D Y   L E A F   6   T O   L E A F   7
+//
+// Copy 6-byte Indexes from a Leaf2 to 7-byte Indexes in a Leaf7.
+// Pjp MUST be one of:  cJU_JPLEAF6 or cJU_JPIMMED_6_*.
+// Return number of Indexes copied.
+//
+// Note:  By the time this function is called to compress a level-7 branch to a
+// Leaf7, the branch has no narrow pointers under it, meaning only level-6
+// objects are below it and must be handled here.
+
+FUNCTION Word_t  j__udyLeaf6ToLeaf7(
+	uint8_t * PLeaf7,	// destination "uint24_t *" Index part of leaf.
+#ifdef JUDYL
+	Pjv_t	  Pjv7,		// destination value part of leaf.
+#endif
+	Pjp_t	  Pjp,		// 6-byte-index object from which to copy.
+	Word_t    MSByte,	// most-significant byte, prefix to each Index.
+	Pvoid_t	  Pjpm)		// for global accounting.
+{
+	Word_t	  Pop1;		// Indexes in leaf.
+JUDYLCODE(Pjv_t	  Pjv6;)	// source object value area.
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// JPLEAF6:
+
+	case cJU_JPLEAF6:
+	{
+	    uint8_t * PLeaf6 = (uint8_t *) P_JLL(Pjp->jp_Addr);
+
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+	    j__udyCopy6to7(PLeaf7, PLeaf6, Pop1, MSByte);
+#ifdef JUDYL
+	    Pjv6 = JL_LEAF6VALUEAREA(PLeaf6, Pop1);
+	    JU_COPYMEM(Pjv7, Pjv6, Pop1);
+#endif
+	    j__udyFreeJLL6((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    return(Pop1);
+	}
+
+
+// JPIMMED_6_01:
+//
+// Note:  jp_DcdPopO has 7 bytes of Index (all but most significant byte), so
+// the "assignment" to PLeaf7[] is exact and MSByte is not needed.
+
+	case cJU_JPIMMED_6_01:
+	{
+	    JU_COPY7_LONG_TO_PINDEX(PLeaf7, JU_JPDCDPOP0(Pjp));	// see above.
+	    JUDYLCODE(Pjv7[0] = Pjp->jp_Addr;)
+	    return(1);
+	}
+
+
+#ifdef JUDY1
+
+// JPIMMED_6_02:
+
+	case cJ1_JPIMMED_6_02:
+	{
+	    uint8_t * PLeaf6 = (uint8_t *) (Pjp->jp_1Index);
+
+	    j__udyCopy6to7(PLeaf7, PLeaf6, /* Pop1 = */ 2, MSByte);
+	    return(2);
+	}
+#endif // JUDY1
+
+
+// UNEXPECTED CASES, including JPNULL6, should be handled by caller:
+
+	default: assert(FALSE); break;
+
+	} // switch
+
+	return(0);
+
+} // j__udyLeaf6ToLeaf7()
+
+#endif // JU_64BIT
+
+
+#ifndef JU_64BIT // 32-bit version first
+
+// ****************************************************************************
+// __ J U D Y   L E A F   3   T O   L E A F   W
+//
+// Copy 3-byte Indexes from a Leaf3 to 4-byte Indexes in a LeafW.  Pjp MUST be
+// one of:  cJU_JPLEAF3 or cJU_JPIMMED_3_*.  Return number of Indexes copied.
+//
+// Note:  By the time this function is called to compress a level-L branch to a
+// LeafW, the branch has no narrow pointers under it, meaning only level-3
+// objects are below it and must be handled here.
+
+FUNCTION Word_t  j__udyLeaf3ToLeafW(
+	Pjlw_t	Pjlw,		// destination Index part of leaf.
+#ifdef JUDYL
+	Pjv_t	PjvW,		// destination value part of leaf.
+#endif
+	Pjp_t	Pjp,		// 3-byte-index object from which to copy.
+	Word_t	MSByte,		// most-significant byte, prefix to each Index.
+	Pvoid_t	Pjpm)		// for global accounting.
+{
+	Word_t	Pop1;		// Indexes in leaf.
+JUDYLCODE(Pjv_t Pjv3;)		// source object value area.
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// JPLEAF3:
+
+	case cJU_JPLEAF3:
+	{
+	    uint8_t * PLeaf3 = (uint8_t *) P_JLL(Pjp->jp_Addr);
+
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+	    j__udyCopy3toW((PWord_t) Pjlw, PLeaf3, Pop1, MSByte);
+#ifdef JUDYL
+	    Pjv3 = JL_LEAF3VALUEAREA(PLeaf3, Pop1);
+	    JU_COPYMEM(PjvW, Pjv3, Pop1);
+#endif
+	    j__udyFreeJLL3((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    return(Pop1);
+	}
+
+
+// JPIMMED_3_01:
+//
+// Note:  jp_DcdPopO has 3 bytes of Index (all but most significant byte), and
+// MSByte must be ord in.
+
+	case cJU_JPIMMED_3_01:
+	{
+	    Pjlw[0] = MSByte | JU_JPDCDPOP0(Pjp);		// see above.
+	    JUDYLCODE(PjvW[0] = Pjp->jp_Addr;)
+	    return(1);
+	}
+
+
+#ifdef JUDY1
+
+// JPIMMED_3_02:
+
+	case cJU_JPIMMED_3_02:
+	{
+	    uint8_t * PLeaf3 = (uint8_t *) (Pjp->jp_1Index);
+
+	    j__udyCopy3toW((PWord_t) Pjlw, PLeaf3, /* Pop1 = */ 2, MSByte);
+	    return(2);
+	}
+#endif // JUDY1
+
+
+// UNEXPECTED CASES, including JPNULL3, should be handled by caller:
+
+	default: assert(FALSE); break;
+
+	} // switch
+
+	return(0);
+
+} // j__udyLeaf3ToLeafW()
+
+
+#else // JU_64BIT
+
+
+// ****************************************************************************
+// __ J U D Y   L E A F   7   T O   L E A F   W
+//
+// Copy 7-byte Indexes from a Leaf7 to 8-byte Indexes in a LeafW.
+// Pjp MUST be one of:  cJU_JPLEAF7 or cJU_JPIMMED_7_*.
+// Return number of Indexes copied.
+//
+// Note:  By the time this function is called to compress a level-L branch to a
+// LeafW, the branch has no narrow pointers under it, meaning only level-7
+// objects are below it and must be handled here.
+
+FUNCTION Word_t  j__udyLeaf7ToLeafW(
+	Pjlw_t	Pjlw,		// destination Index part of leaf.
+#ifdef JUDYL
+	Pjv_t	PjvW,		// destination value part of leaf.
+#endif
+	Pjp_t	Pjp,		// 7-byte-index object from which to copy.
+	Word_t	MSByte,		// most-significant byte, prefix to each Index.
+	Pvoid_t	Pjpm)		// for global accounting.
+{
+	Word_t	Pop1;		// Indexes in leaf.
+JUDYLCODE(Pjv_t	Pjv7;)		// source object value area.
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// JPLEAF7:
+
+	case cJU_JPLEAF7:
+	{
+	    uint8_t * PLeaf7 = (uint8_t *) P_JLL(Pjp->jp_Addr);
+
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+	    j__udyCopy7toW((PWord_t) Pjlw, PLeaf7, Pop1, MSByte);
+#ifdef JUDYL
+	    Pjv7 = JL_LEAF7VALUEAREA(PLeaf7, Pop1);
+	    JU_COPYMEM(PjvW, Pjv7, Pop1);
+#endif
+	    j__udyFreeJLL7((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    return(Pop1);
+	}
+
+
+// JPIMMED_7_01:
+//
+// Note:  jp_DcdPopO has 7 bytes of Index (all but most significant byte), and
+// MSByte must be ord in.
+
+	case cJU_JPIMMED_7_01:
+	{
+	    Pjlw[0] = MSByte | JU_JPDCDPOP0(Pjp);		// see above.
+	    JUDYLCODE(PjvW[0] = Pjp->jp_Addr;)
+	    return(1);
+	}
+
+
+#ifdef JUDY1
+
+// JPIMMED_7_02:
+
+	case cJ1_JPIMMED_7_02:
+	{
+	    uint8_t * PLeaf7 = (uint8_t *) (Pjp->jp_1Index);
+
+	    j__udyCopy7toW((PWord_t) Pjlw, PLeaf7, /* Pop1 = */ 2, MSByte);
+	    return(2);
+	}
+#endif
+
+
+// UNEXPECTED CASES, including JPNULL7, should be handled by caller:
+
+	default: assert(FALSE); break;
+
+	} // switch
+
+	return(0);
+
+} // j__udyLeaf7ToLeafW()
+
+#endif // JU_64BIT
diff --git a/libs/klib/judy/JudyDel.c b/libs/klib/judy/JudyDel.c
new file mode 100644
index 0000000..4291da6
--- /dev/null
+++ b/libs/klib/judy/JudyDel.c
@@ -0,0 +1,2144 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Judy1Unset() and JudyLDel() functions for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+//
+// About HYSTERESIS:  In the Judy code, hysteresis means leaving around a
+// nominally suboptimal (not maximally compressed) data structure after a
+// deletion.  As a result, the shape of the tree for two identical index sets
+// can differ depending on the insert/delete path taken to arrive at the index
+// sets.  The purpose is to minimize worst-case behavior (thrashing) that could
+// result from a series of intermixed insertions and deletions.  It also makes
+// for MUCH simpler code, because instead of performing, "delete and then
+// compress," it can say, "compress and then delete," where due to hysteresis,
+// compression is not even attempted until the object IS compressible.
+//
+// In some cases the code has no choice and it must "ungrow" a data structure
+// across a "phase transition" boundary without hysteresis.  In other cases the
+// amount (such as "hysteresis = 1") is indicated by the number of JP deletions
+// (in branches) or index deletions (in leaves) that can occur in succession
+// before compressing the data structure.  (It appears that hysteresis <= 1 in
+// all cases.)
+//
+// In general no hysteresis occurs when the data structure type remains the
+// same but the allocated memory chunk for the node must shrink, because the
+// relationship is hardwired and theres no way to know how much memory is
+// allocated to a given data structure.  Hysteresis = 0 in all these cases.
+//
+// TBD:  Could this code be faster if memory chunk hysteresis were supported
+// somehow along with data structure type hysteresis?
+//
+// TBD:  Should some of the assertions here be converted to product code that
+// returns JU_ERRNO_CORRUPT?
+//
+// TBD:  Dougs code had an odd mix of function-wide and limited-scope
+// variables.  Should some of the function-wide variables appear only in
+// limited scopes, or more likely, vice-versa?
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+DBGCODE(extern void JudyCheckPop(Pvoid_t PArray);)
+DBGCODE(extern void JudyCheckSorted(Pjll_t Pjll, Word_t Pop1, long IndexSize);)
+
+#ifdef TRACEJP
+#include "JudyPrintJP.c"
+#endif
+
+// These are defined to generic values in JudyCommon/JudyPrivateTypes.h:
+//
+// TBD:  These should be exported from a header file, but perhaps not, as they
+// are only used here, and exported from JudyDecascade.c, which is a separate
+// file for profiling reasons (to prevent inlining), but which potentially
+// could be merged with this file, either in SoftCM or at compile-time:
+
+#ifdef JUDY1
+
+extern int      j__udy1BranchBToBranchL(Pjp_t Pjp, Pvoid_t Pjpm);
+#ifndef JU_64BIT
+extern int      j__udy1LeafB1ToLeaf1(Pjp_t, Pvoid_t);
+#endif
+extern Word_t   j__udy1Leaf1ToLeaf2(uint16_t *, Pjp_t, Word_t, Pvoid_t);
+extern Word_t   j__udy1Leaf2ToLeaf3(uint8_t  *, Pjp_t, Word_t, Pvoid_t);
+#ifndef JU_64BIT
+extern Word_t   j__udy1Leaf3ToLeafW(Pjlw_t,     Pjp_t, Word_t, Pvoid_t);
+#else
+extern Word_t   j__udy1Leaf3ToLeaf4(uint32_t *, Pjp_t, Word_t, Pvoid_t);
+extern Word_t   j__udy1Leaf4ToLeaf5(uint8_t  *, Pjp_t, Word_t, Pvoid_t);
+extern Word_t   j__udy1Leaf5ToLeaf6(uint8_t  *, Pjp_t, Word_t, Pvoid_t);
+extern Word_t   j__udy1Leaf6ToLeaf7(uint8_t  *, Pjp_t, Word_t, Pvoid_t);
+extern Word_t   j__udy1Leaf7ToLeafW(Pjlw_t,     Pjp_t, Word_t, Pvoid_t);
+#endif
+
+#else // JUDYL
+
+extern int      j__udyLBranchBToBranchL(Pjp_t Pjp, Pvoid_t Pjpm);
+extern int      j__udyLLeafB1ToLeaf1(Pjp_t, Pvoid_t);
+extern Word_t   j__udyLLeaf1ToLeaf2(uint16_t *, Pjv_t, Pjp_t, Word_t, Pvoid_t);
+extern Word_t   j__udyLLeaf2ToLeaf3(uint8_t  *, Pjv_t, Pjp_t, Word_t, Pvoid_t);
+#ifndef JU_64BIT
+extern Word_t   j__udyLLeaf3ToLeafW(Pjlw_t,     Pjv_t, Pjp_t, Word_t, Pvoid_t);
+#else
+extern Word_t   j__udyLLeaf3ToLeaf4(uint32_t *, Pjv_t, Pjp_t, Word_t, Pvoid_t);
+extern Word_t   j__udyLLeaf4ToLeaf5(uint8_t  *, Pjv_t, Pjp_t, Word_t, Pvoid_t);
+extern Word_t   j__udyLLeaf5ToLeaf6(uint8_t  *, Pjv_t, Pjp_t, Word_t, Pvoid_t);
+extern Word_t   j__udyLLeaf6ToLeaf7(uint8_t  *, Pjv_t, Pjp_t, Word_t, Pvoid_t);
+extern Word_t   j__udyLLeaf7ToLeafW(Pjlw_t,     Pjv_t, Pjp_t, Word_t, Pvoid_t);
+#endif
+
+#endif // JUDYL
+
+// For convenience in the calling code; "M1" means "minus one":
+
+#ifndef JU_64BIT
+#define j__udyLeafM1ToLeafW j__udyLeaf3ToLeafW
+#else
+#define j__udyLeafM1ToLeafW j__udyLeaf7ToLeafW
+#endif
+
+
+// ****************************************************************************
+// __ J U D Y   D E L   W A L K
+//
+// Given a pointer to a JP, an Index known to be valid, the number of bytes
+// left to decode (== level in the tree), and a pointer to a global JPM, walk a
+// Judy (sub)tree to do an unset/delete of that index, and possibly modify the
+// JPM.  This function is only called internally, and recursively.  Unlike
+// Judy1Test() and JudyLGet(), the extra time required for recursion should be
+// negligible compared with the total.
+//
+// Return values:
+//
+// -1 error; details in JPM
+//
+//  0 Index already deleted (should never happen, Index is known to be valid)
+//
+//  1 previously valid Index deleted
+//
+//  2 same as 1, but in addition the JP now points to a BranchL containing a
+//    single JP, which should be compressed into the parent branch (if there
+//    is one, which is not the case for a top-level branch under a JPM)
+
+DBGCODE(uint8_t parentJPtype;)          // parent branch JP type.
+
+FUNCTION static int j__udyDelWalk(
+        Pjp_t   Pjp,            // current JP under which to delete.
+        Word_t  Index,          // to delete.
+        Word_t  ParentLevel,    // of parent branch.
+        Pjpm_t  Pjpm)           // for returning info to top level.
+{
+        Word_t  pop1;           // of a leaf.
+        Word_t  level;          // of a leaf.
+        uint8_t digit;          // from Index, in current branch.
+        Pjll_t  PjllnewRaw;     // address of newly allocated leaf.
+        Pjll_t  Pjllnew;
+        int     offset;         // within a branch.
+        int     retcode;        // return code: -1, 0, 1, 2.
+JUDYLCODE(Pjv_t PjvRaw;)        // value area.
+JUDYLCODE(Pjv_t Pjv;)
+
+        DBGCODE(level = 0;)
+
+ContinueDelWalk:                // for modifying state without recursing.
+
+#ifdef TRACEJP
+        JudyPrintJP(Pjp, "d", __LINE__);
+#endif
+
+        switch (JU_JPTYPE(Pjp)) // entry:  Pjp, Index.
+        {
+
+
+// ****************************************************************************
+// LINEAR BRANCH:
+//
+// MACROS FOR COMMON CODE:
+//
+// Check for population too high to compress a branch to a leaf, meaning just
+// descend through the branch, with a purposeful off-by-one error that
+// constitutes hysteresis = 1.  In other words, do not compress until the
+// branchs CURRENT population fits in the leaf, even BEFORE deleting one
+// index.
+//
+// Next is a label for branch-type-specific common code.  Variables pop1,
+// level, digit, and Index are in the context.
+
+#define JU_BRANCH_KEEP(cLevel,MaxPop1,Next)             \
+        if (pop1 > (MaxPop1))   /* hysteresis = 1 */    \
+        {                                               \
+            assert((cLevel) >= 2);                      \
+            level = (cLevel);                           \
+            digit = JU_DIGITATSTATE(Index, cLevel);     \
+            goto Next;                                  \
+        }
+
+// Support for generic calling of JudyLeaf*ToLeaf*() functions:
+//
+// Note:  Cannot use JUDYLCODE() because this contains a comma.
+
+#ifdef JUDY1
+#define JU_PVALUEPASS  // null.
+#else
+#define JU_PVALUEPASS  Pjv,
+#endif
+
+// During compression to a leaf, check if a JP contains nothing but a
+// cJU_JPIMMED_*_01, in which case shortcut calling j__udyLeaf*ToLeaf*():
+//
+// Copy the index bytes from the jp_DcdPopO field (with possible truncation),
+// and continue the branch-JP-walk loop.  Variables Pjp and Pleaf are in the
+// context.
+
+#define JU_BRANCH_COPY_IMMED_EVEN(cLevel,Pjp,ignore)            \
+        if (JU_JPTYPE(Pjp) == cJU_JPIMMED_1_01 + (cLevel) - 2)  \
+        {                                                       \
+            *Pleaf++ = JU_JPDCDPOP0(Pjp);                       \
+  JUDYLCODE(*Pjv++   = (Pjp)->jp_Addr;)                         \
+            continue;   /* for-loop */                          \
+        }
+
+#define JU_BRANCH_COPY_IMMED_ODD(cLevel,Pjp,CopyIndex)          \
+        if (JU_JPTYPE(Pjp) == cJU_JPIMMED_1_01 + (cLevel) - 2)  \
+        {                                                       \
+            CopyIndex(Pleaf, (Word_t) (JU_JPDCDPOP0(Pjp)));     \
+            Pleaf += (cLevel);  /* index size = level */        \
+  JUDYLCODE(*Pjv++ = (Pjp)->jp_Addr;)                           \
+            continue;   /* for-loop */                          \
+        }
+
+// Compress a BranchL into a leaf one index size larger:
+//
+// Allocate a new leaf, walk the JPs in the old BranchL and pack their contents
+// into the new leaf (of type NewJPType), free the old BranchL, and finally
+// restart the switch to delete Index from the new leaf.  (Note that all
+// BranchLs are the same size.)  Variables Pjp, Pjpm, Pleaf, digit, and pop1
+// are in the context.
+
+#define JU_BRANCHL_COMPRESS(cLevel,LeafType,MaxPop1,NewJPType,          \
+                            LeafToLeaf,Alloc,ValueArea,                 \
+                            CopyImmed,CopyIndex)                        \
+        {                                                               \
+            LeafType Pleaf;                                             \
+            Pjbl_t   PjblRaw;                                           \
+            Pjbl_t   Pjbl;                                              \
+            Word_t   numJPs;                                            \
+                                                                        \
+            if ((PjllnewRaw = Alloc(MaxPop1, Pjpm)) == 0) return(-1);   \
+            Pjllnew = P_JLL(PjllnewRaw);                                \
+            Pleaf   = (LeafType) Pjllnew;                               \
+  JUDYLCODE(Pjv     = ValueArea(Pleaf, MaxPop1);)                       \
+                                                                        \
+            PjblRaw = (Pjbl_t) (Pjp->jp_Addr);                          \
+            Pjbl    = P_JBL(PjblRaw);                                   \
+            numJPs  = Pjbl->jbl_NumJPs;                                 \
+                                                                        \
+            for (offset = 0; offset < numJPs; ++offset)                 \
+            {                                                           \
+                CopyImmed(cLevel, (Pjbl->jbl_jp) + offset, CopyIndex);  \
+                                                                        \
+                pop1 = LeafToLeaf(Pleaf, JU_PVALUEPASS                  \
+                          (Pjbl->jbl_jp) + offset,                      \
+                          JU_DIGITTOSTATE(Pjbl->jbl_Expanse[offset],    \
+                          cLevel), (Pvoid_t) Pjpm);                     \
+                Pleaf = (LeafType) (((Word_t) Pleaf) + ((cLevel) * pop1)); \
+      JUDYLCODE(Pjv  += pop1;)                                          \
+            }                                                           \
+            assert(((((Word_t) Pleaf) - ((Word_t) Pjllnew)) / (cLevel)) == (MaxPop1)); \
+  JUDYLCODE(assert((Pjv - ValueArea(Pjllnew, MaxPop1)) == (MaxPop1));)  \
+            DBGCODE(JudyCheckSorted(Pjllnew, MaxPop1, cLevel);)         \
+                                                                        \
+            j__udyFreeJBL(PjblRaw, Pjpm);                               \
+                                                                        \
+            Pjp->jp_Type = (NewJPType);                                 \
+            Pjp->jp_Addr = (Word_t) PjllnewRaw;                         \
+            goto ContinueDelWalk;       /* delete from new leaf */      \
+        }
+
+// Overall common code for initial BranchL deletion handling:
+//
+// Assert that Index is in the branch, then see if the BranchL should be kept
+// or else compressed to a leaf.  Variables Index, Pjp, and pop1 are in the
+// context.
+
+#define JU_BRANCHL(cLevel,MaxPop1,LeafType,NewJPType,                   \
+                   LeafToLeaf,Alloc,ValueArea,CopyImmed,CopyIndex)      \
+                                                                        \
+        assert(! JU_DCDNOTMATCHINDEX(Index, Pjp, cLevel));              \
+        assert(ParentLevel > (cLevel));                                 \
+                                                                        \
+        pop1 = JU_JPBRANCH_POP0(Pjp, cLevel) + 1;                       \
+        JU_BRANCH_KEEP(cLevel, MaxPop1, BranchLKeep);                   \
+        assert(pop1 == (MaxPop1));                                      \
+                                                                        \
+        JU_BRANCHL_COMPRESS(cLevel, LeafType, MaxPop1, NewJPType,       \
+                            LeafToLeaf, Alloc, ValueArea, CopyImmed, CopyIndex)
+
+
+// END OF MACROS, START OF CASES:
+
+        case cJU_JPBRANCH_L2:
+
+            JU_BRANCHL(2, cJU_LEAF2_MAXPOP1, uint16_t *, cJU_JPLEAF2,
+                       j__udyLeaf1ToLeaf2, j__udyAllocJLL2, JL_LEAF2VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_EVEN, ignore);
+
+        case cJU_JPBRANCH_L3:
+
+            JU_BRANCHL(3, cJU_LEAF3_MAXPOP1, uint8_t *, cJU_JPLEAF3,
+                       j__udyLeaf2ToLeaf3, j__udyAllocJLL3, JL_LEAF3VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY3_LONG_TO_PINDEX);
+
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_L4:
+
+            JU_BRANCHL(4, cJU_LEAF4_MAXPOP1, uint32_t *, cJU_JPLEAF4,
+                       j__udyLeaf3ToLeaf4, j__udyAllocJLL4, JL_LEAF4VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_EVEN, ignore);
+
+        case cJU_JPBRANCH_L5:
+
+            JU_BRANCHL(5, cJU_LEAF5_MAXPOP1, uint8_t *, cJU_JPLEAF5,
+                       j__udyLeaf4ToLeaf5, j__udyAllocJLL5, JL_LEAF5VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY5_LONG_TO_PINDEX);
+
+        case cJU_JPBRANCH_L6:
+
+            JU_BRANCHL(6, cJU_LEAF6_MAXPOP1, uint8_t *, cJU_JPLEAF6,
+                       j__udyLeaf5ToLeaf6, j__udyAllocJLL6, JL_LEAF6VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY6_LONG_TO_PINDEX);
+
+        case cJU_JPBRANCH_L7:
+
+            JU_BRANCHL(7, cJU_LEAF7_MAXPOP1, uint8_t *, cJU_JPLEAF7,
+                       j__udyLeaf6ToLeaf7, j__udyAllocJLL7, JL_LEAF7VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY7_LONG_TO_PINDEX);
+#endif // JU_64BIT
+
+// A top-level BranchL is different and cannot use JU_BRANCHL():  Dont try to
+// compress to a (LEAFW) leaf yet, but leave this for a later deletion
+// (hysteresis > 0); and the next JP type depends on the system word size; so
+// dont use JU_BRANCH_KEEP():
+
+        case cJU_JPBRANCH_L:
+        {
+            Pjbl_t Pjbl;
+            Word_t numJPs;
+
+            level = cJU_ROOTSTATE;
+            digit = JU_DIGITATSTATE(Index, cJU_ROOTSTATE);
+
+            // fall through:
+
+
+// COMMON CODE FOR KEEPING AND DESCENDING THROUGH A BRANCHL:
+//
+// Come here with level and digit set.
+
+BranchLKeep:
+            Pjbl   = P_JBL(Pjp->jp_Addr);
+            numJPs = Pjbl->jbl_NumJPs;
+            assert(numJPs > 0);
+            DBGCODE(parentJPtype = JU_JPTYPE(Pjp);)
+
+// Search for a match to the digit (valid Index => must find digit):
+
+            for (offset = 0; (Pjbl->jbl_Expanse[offset]) != digit; ++offset)
+                assert(offset < numJPs - 1);
+
+            Pjp = (Pjbl->jbl_jp) + offset;
+
+// If not at a (deletable) JPIMMED_*_01, continue the walk (to descend through
+// the BranchL):
+
+            assert(level >= 2);
+            if ((JU_JPTYPE(Pjp)) != cJU_JPIMMED_1_01 + level - 2) break;
+
+// At JPIMMED_*_01:  Ensure the index is in the right expanse, then delete the
+// Immed from the BranchL:
+//
+// Note:  A BranchL has a fixed size and format regardless of numJPs.
+
+            assert(JU_JPDCDPOP0(Pjp) == JU_TRIMTODCDSIZE(Index));
+
+            JU_DELETEINPLACE(Pjbl->jbl_Expanse, numJPs, offset, ignore);
+            JU_DELETEINPLACE(Pjbl->jbl_jp,      numJPs, offset, ignore);
+
+            DBGCODE(JudyCheckSorted((Pjll_t) (Pjbl->jbl_Expanse),
+                                    numJPs - 1, 1);)
+
+// If only one index left in the BranchL, indicate this to the caller:
+
+            return ((--(Pjbl->jbl_NumJPs) <= 1) ? 2 : 1);
+
+        } // case cJU_JPBRANCH_L.
+
+
+// ****************************************************************************
+// BITMAP BRANCH:
+//
+// MACROS FOR COMMON CODE:
+//
+// Note the reuse of common macros here, defined earlier:  JU_BRANCH_KEEP(),
+// JU_PVALUE*.
+//
+// Compress a BranchB into a leaf one index size larger:
+//
+// Allocate a new leaf, walk the JPs in the old BranchB (one bitmap subexpanse
+// at a time) and pack their contents into the new leaf (of type NewJPType),
+// free the old BranchB, and finally restart the switch to delete Index from
+// the new leaf.  Variables Pjp, Pjpm, Pleaf, digit, and pop1 are in the
+// context.
+//
+// Note:  Its no accident that the interface to JU_BRANCHB_COMPRESS() is
+// identical to JU_BRANCHL_COMPRESS().  Only the details differ in how to
+// traverse the branchs JPs.
+
+#define JU_BRANCHB_COMPRESS(cLevel,LeafType,MaxPop1,NewJPType,          \
+                            LeafToLeaf,Alloc,ValueArea,                 \
+                            CopyImmed,CopyIndex)                        \
+        {                                                               \
+            LeafType  Pleaf;                                            \
+            Pjbb_t    PjbbRaw;  /* BranchB to compress */               \
+            Pjbb_t    Pjbb;                                             \
+            Word_t    subexp;   /* current subexpanse number    */      \
+            BITMAPB_t bitmap;   /* portion for this subexpanse  */      \
+            Pjp_t     Pjp2Raw;  /* one subexpanses subarray     */      \
+            Pjp_t     Pjp2;                                             \
+                                                                        \
+            if ((PjllnewRaw = Alloc(MaxPop1, Pjpm)) == 0) return(-1);   \
+            Pjllnew = P_JLL(PjllnewRaw);                                \
+            Pleaf   = (LeafType) Pjllnew;                               \
+  JUDYLCODE(Pjv     = ValueArea(Pleaf, MaxPop1);)                       \
+                                                                        \
+            PjbbRaw = (Pjbb_t) (Pjp->jp_Addr);                          \
+            Pjbb    = P_JBB(PjbbRaw);                                   \
+                                                                        \
+            for (subexp = 0; subexp < cJU_NUMSUBEXPB; ++subexp)         \
+            {                                                           \
+                if ((bitmap = JU_JBB_BITMAP(Pjbb, subexp)) == 0)        \
+                    continue;           /* empty subexpanse */          \
+                                                                        \
+                digit   = subexp * cJU_BITSPERSUBEXPB;                  \
+                Pjp2Raw = JU_JBB_PJP(Pjbb, subexp);                     \
+                Pjp2    = P_JP(Pjp2Raw);                                \
+                assert(Pjp2 != (Pjp_t) NULL);                           \
+                                                                        \
+                for (offset = 0; bitmap != 0; bitmap >>= 1, ++digit)    \
+                {                                                       \
+                    if (! (bitmap & 1))                                 \
+                        continue;       /* empty sub-subexpanse */      \
+                                                                        \
+                    ++offset;           /* before any continue */       \
+                                                                        \
+                    CopyImmed(cLevel, Pjp2 + offset - 1, CopyIndex);    \
+                                                                        \
+                    pop1 = LeafToLeaf(Pleaf, JU_PVALUEPASS              \
+                                      Pjp2 + offset - 1,                \
+                                      JU_DIGITTOSTATE(digit, cLevel),   \
+                                      (Pvoid_t) Pjpm);                  \
+                    Pleaf = (LeafType) (((Word_t) Pleaf) + ((cLevel) * pop1)); \
+          JUDYLCODE(Pjv  += pop1;)                                      \
+                }                                                       \
+                j__udyFreeJBBJP(Pjp2Raw, /* pop1 = */ offset, Pjpm);    \
+            }                                                           \
+            assert(((((Word_t) Pleaf) - ((Word_t) Pjllnew)) / (cLevel)) == (MaxPop1)); \
+  JUDYLCODE(assert((Pjv - ValueArea(Pjllnew, MaxPop1)) == (MaxPop1));)  \
+            DBGCODE(JudyCheckSorted(Pjllnew, MaxPop1, cLevel);)         \
+                                                                        \
+            j__udyFreeJBB(PjbbRaw, Pjpm);                               \
+                                                                        \
+            Pjp->jp_Type = (NewJPType);                                 \
+            Pjp->jp_Addr = (Word_t) PjllnewRaw;                         \
+            goto ContinueDelWalk;       /* delete from new leaf */      \
+        }
+
+// Overall common code for initial BranchB deletion handling:
+//
+// Assert that Index is in the branch, then see if the BranchB should be kept
+// or else compressed to a leaf.  Variables Index, Pjp, and pop1 are in the
+// context.
+
+#define JU_BRANCHB(cLevel,MaxPop1,LeafType,NewJPType,                   \
+                   LeafToLeaf,Alloc,ValueArea,CopyImmed,CopyIndex)      \
+                                                                        \
+        assert(! JU_DCDNOTMATCHINDEX(Index, Pjp, cLevel));              \
+        assert(ParentLevel > (cLevel));                                 \
+                                                                        \
+        pop1 = JU_JPBRANCH_POP0(Pjp, cLevel) + 1;                       \
+        JU_BRANCH_KEEP(cLevel, MaxPop1, BranchBKeep);                   \
+        assert(pop1 == (MaxPop1));                                      \
+                                                                        \
+        JU_BRANCHB_COMPRESS(cLevel, LeafType, MaxPop1, NewJPType,       \
+                            LeafToLeaf, Alloc, ValueArea, CopyImmed, CopyIndex)
+
+
+// END OF MACROS, START OF CASES:
+//
+// Note:  Its no accident that the macro calls for these cases is nearly
+// identical to the code for BranchLs.
+
+        case cJU_JPBRANCH_B2:
+
+            JU_BRANCHB(2, cJU_LEAF2_MAXPOP1, uint16_t *, cJU_JPLEAF2,
+                       j__udyLeaf1ToLeaf2, j__udyAllocJLL2, JL_LEAF2VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_EVEN, ignore);
+
+        case cJU_JPBRANCH_B3:
+
+            JU_BRANCHB(3, cJU_LEAF3_MAXPOP1, uint8_t *, cJU_JPLEAF3,
+                       j__udyLeaf2ToLeaf3, j__udyAllocJLL3, JL_LEAF3VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY3_LONG_TO_PINDEX);
+
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_B4:
+
+            JU_BRANCHB(4, cJU_LEAF4_MAXPOP1, uint32_t *, cJU_JPLEAF4,
+                       j__udyLeaf3ToLeaf4, j__udyAllocJLL4, JL_LEAF4VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_EVEN, ignore);
+
+        case cJU_JPBRANCH_B5:
+
+            JU_BRANCHB(5, cJU_LEAF5_MAXPOP1, uint8_t *, cJU_JPLEAF5,
+                       j__udyLeaf4ToLeaf5, j__udyAllocJLL5, JL_LEAF5VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY5_LONG_TO_PINDEX);
+
+        case cJU_JPBRANCH_B6:
+
+            JU_BRANCHB(6, cJU_LEAF6_MAXPOP1, uint8_t *, cJU_JPLEAF6,
+                       j__udyLeaf5ToLeaf6, j__udyAllocJLL6, JL_LEAF6VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY6_LONG_TO_PINDEX);
+
+        case cJU_JPBRANCH_B7:
+
+            JU_BRANCHB(7, cJU_LEAF7_MAXPOP1, uint8_t *, cJU_JPLEAF7,
+                       j__udyLeaf6ToLeaf7, j__udyAllocJLL7, JL_LEAF7VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY7_LONG_TO_PINDEX);
+#endif // JU_64BIT
+
+// A top-level BranchB is different and cannot use JU_BRANCHB():  Dont try to
+// compress to a (LEAFW) leaf yet, but leave this for a later deletion
+// (hysteresis > 0); and the next JP type depends on the system word size; so
+// dont use JU_BRANCH_KEEP():
+
+        case cJU_JPBRANCH_B:
+        {
+            Pjbb_t    Pjbb;             // BranchB to modify.
+            Word_t    subexp;           // current subexpanse number.
+            Word_t    subexp2;          // in second-level loop.
+            BITMAPB_t bitmap;           // portion for this subexpanse.
+            BITMAPB_t bitmask;          // with digits bit set.
+            Pjp_t     Pjp2Raw;          // one subexpanses subarray.
+            Pjp_t     Pjp2;
+            Word_t    numJPs;           // in one subexpanse.
+
+            level = cJU_ROOTSTATE;
+            digit = JU_DIGITATSTATE(Index, cJU_ROOTSTATE);
+
+            // fall through:
+
+
+// COMMON CODE FOR KEEPING AND DESCENDING THROUGH A BRANCHB:
+//
+// Come here with level and digit set.
+
+BranchBKeep:
+            Pjbb    = P_JBB(Pjp->jp_Addr);
+            subexp  = digit / cJU_BITSPERSUBEXPB;
+            bitmap  = JU_JBB_BITMAP(Pjbb, subexp);
+            bitmask = JU_BITPOSMASKB(digit);
+            assert(bitmap & bitmask);   // Index valid => digits bit is set.
+            DBGCODE(parentJPtype = JU_JPTYPE(Pjp);)
+
+// Compute digits offset into the bitmap, with a fast method if all bits are
+// set:
+
+            offset = ((bitmap == (cJU_FULLBITMAPB)) ?
+                      digit % cJU_BITSPERSUBEXPB :
+                      j__udyCountBitsB(bitmap & JU_MASKLOWEREXC(bitmask)));
+
+            Pjp2Raw = JU_JBB_PJP(Pjbb, subexp);
+            Pjp2    = P_JP(Pjp2Raw);
+            assert(Pjp2 != (Pjp_t) NULL);       // valid subexpanse pointer.
+
+// If not at a (deletable) JPIMMED_*_01, continue the walk (to descend through
+// the BranchB):
+
+            if (JU_JPTYPE(Pjp2 + offset) != cJU_JPIMMED_1_01 + level - 2)
+            {
+                Pjp = Pjp2 + offset;
+                break;
+            }
+
+// At JPIMMED_*_01:  Ensure the index is in the right expanse, then delete the
+// Immed from the BranchB:
+
+            assert(JU_JPDCDPOP0(Pjp2 + offset)
+                   == JU_TRIMTODCDSIZE(Index));
+
+// If only one index is left in the subexpanse, free the JP array:
+
+            if ((numJPs = j__udyCountBitsB(bitmap)) == 1)
+            {
+                j__udyFreeJBBJP(Pjp2Raw, /* pop1 = */ 1, Pjpm);
+                JU_JBB_PJP(Pjbb, subexp) = (Pjp_t) NULL;
+            }
+
+// Shrink JP array in-place:
+
+            else if (JU_BRANCHBJPGROWINPLACE(numJPs - 1))
+            {
+                assert(numJPs > 0);
+                JU_DELETEINPLACE(Pjp2, numJPs, offset, ignore);
+            }
+
+// JP array would end up too large; compress it to a smaller one:
+
+            else
+            {
+                Pjp_t PjpnewRaw;
+                Pjp_t Pjpnew;
+
+                if ((PjpnewRaw = j__udyAllocJBBJP(numJPs - 1, Pjpm))
+                 == (Pjp_t) NULL) return(-1);
+                Pjpnew = P_JP(PjpnewRaw);
+
+                JU_DELETECOPY(Pjpnew, Pjp2, numJPs, offset, ignore);
+                j__udyFreeJBBJP(Pjp2Raw, numJPs, Pjpm);         // old.
+
+                JU_JBB_PJP(Pjbb, subexp) = PjpnewRaw;
+            }
+
+// Clear digits bit in the bitmap:
+
+            JU_JBB_BITMAP(Pjbb, subexp) ^= bitmask;
+
+// If the current subexpanse alone is still too large for a BranchL (with
+// hysteresis = 1), the delete is all done:
+
+            if (numJPs > cJU_BRANCHLMAXJPS) return(1);
+
+// Consider shrinking the current BranchB to a BranchL:
+//
+// Check the numbers of JPs in other subexpanses in the BranchL.  Upon reaching
+// the critical number of numJPs (which could be right at the start; again,
+// with hysteresis = 1), its faster to just watch for any non-empty subexpanse
+// than to count bits in each subexpanse.  Upon finding too many JPs, give up
+// on shrinking the BranchB.
+
+            for (subexp2 = 0; subexp2 < cJU_NUMSUBEXPB; ++subexp2)
+            {
+                if (subexp2 == subexp) continue;  // skip current subexpanse.
+
+                if ((numJPs == cJU_BRANCHLMAXJPS) ?
+                    JU_JBB_BITMAP(Pjbb, subexp2) :
+                    ((numJPs += j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, subexp2)))
+                     > cJU_BRANCHLMAXJPS))
+                {
+                    return(1);          // too many JPs, cannot shrink.
+                }
+            }
+
+// Shrink current BranchB to a BranchL:
+//
+// Note:  In this rare case, ignore the return value, do not pass it to the
+// caller, because the deletion is already successfully completed and the
+// caller(s) must decrement population counts.  The only errors expected from
+// this call are JU_ERRNO_NOMEM and JU_ERRNO_OVERRUN, neither of which is worth
+// forwarding from this point.  See also 4.1, 4.8, and 4.15 of this file.
+
+            (void) j__udyBranchBToBranchL(Pjp, Pjpm);
+            return(1);
+
+        } // case.
+
+
+// ****************************************************************************
+// UNCOMPRESSED BRANCH:
+//
+// MACROS FOR COMMON CODE:
+//
+// Note the reuse of common macros here, defined earlier:  JU_PVALUE*.
+//
+// Compress a BranchU into a leaf one index size larger:
+//
+// Allocate a new leaf, walk the JPs in the old BranchU and pack their contents
+// into the new leaf (of type NewJPType), free the old BranchU, and finally
+// restart the switch to delete Index from the new leaf.  Variables Pjp, Pjpm,
+// digit, and pop1 are in the context.
+//
+// Note:  Its no accident that the interface to JU_BRANCHU_COMPRESS() is
+// nearly identical to JU_BRANCHL_COMPRESS(); just NullJPType is added.  The
+// details differ in how to traverse the branchs JPs --
+//
+// -- and also, what to do upon encountering a cJU_JPIMMED_*_01 JP.  In
+// BranchLs and BranchBs the JP must be deleted, but in a BranchU its merely
+// converted to a null JP, and this is done by other switch cases, so the "keep
+// branch" situation is simpler here and JU_BRANCH_KEEP() is not used.  Also,
+// theres no code to convert a BranchU to a BranchB since counting the JPs in
+// a BranchU is (at least presently) expensive, and besides, keeping around a
+// BranchU is form of hysteresis.
+
+#define JU_BRANCHU_COMPRESS(cLevel,LeafType,MaxPop1,NullJPType,NewJPType,   \
+                            LeafToLeaf,Alloc,ValueArea,CopyImmed,CopyIndex) \
+        {                                                               \
+            LeafType Pleaf;                                             \
+            Pjbu_t PjbuRaw = (Pjbu_t) (Pjp->jp_Addr);                   \
+            Pjp_t  Pjp2    = JU_JBU_PJP0(Pjp);                          \
+            Word_t ldigit;      /* larger than uint8_t */               \
+                                                                        \
+            if ((PjllnewRaw = Alloc(MaxPop1, Pjpm)) == 0) return(-1);   \
+            Pjllnew = P_JLL(PjllnewRaw);                                \
+            Pleaf   = (LeafType) Pjllnew;                               \
+  JUDYLCODE(Pjv     = ValueArea(Pleaf, MaxPop1);)                       \
+                                                                        \
+            for (ldigit = 0; ldigit < cJU_BRANCHUNUMJPS; ++ldigit, ++Pjp2) \
+            {                                                           \
+                /* fast-process common types: */                        \
+                if (JU_JPTYPE(Pjp2) == (NullJPType)) continue;          \
+                CopyImmed(cLevel, Pjp2, CopyIndex);                     \
+                                                                        \
+                pop1 = LeafToLeaf(Pleaf, JU_PVALUEPASS Pjp2,            \
+                                  JU_DIGITTOSTATE(ldigit, cLevel),      \
+                                  (Pvoid_t) Pjpm);                      \
+                Pleaf = (LeafType) (((Word_t) Pleaf) + ((cLevel) * pop1)); \
+      JUDYLCODE(Pjv  += pop1;)                                          \
+            }                                                           \
+            assert(((((Word_t) Pleaf) - ((Word_t) Pjllnew)) / (cLevel)) == (MaxPop1)); \
+  JUDYLCODE(assert((Pjv - ValueArea(Pjllnew, MaxPop1)) == (MaxPop1));)  \
+            DBGCODE(JudyCheckSorted(Pjllnew, MaxPop1, cLevel);)         \
+                                                                        \
+            j__udyFreeJBU(PjbuRaw, Pjpm);                               \
+                                                                        \
+            Pjp->jp_Type = (NewJPType);                                 \
+            Pjp->jp_Addr = (Word_t) PjllnewRaw;                         \
+            goto ContinueDelWalk;       /* delete from new leaf */      \
+        }
+
+// Overall common code for initial BranchU deletion handling:
+//
+// Assert that Index is in the branch, then see if a BranchU should be kept or
+// else compressed to a leaf.  Variables level, Index, Pjp, and pop1 are in the
+// context.
+//
+// Note:  BranchU handling differs from BranchL and BranchB as described above.
+
+#define JU_BRANCHU(cLevel,MaxPop1,LeafType,NullJPType,NewJPType,        \
+                   LeafToLeaf,Alloc,ValueArea,CopyImmed,CopyIndex)      \
+                                                                        \
+        assert(! JU_DCDNOTMATCHINDEX(Index, Pjp, cLevel));              \
+        assert(ParentLevel > (cLevel));                                 \
+        DBGCODE(parentJPtype = JU_JPTYPE(Pjp);)                         \
+                                                                        \
+        pop1 = JU_JPBRANCH_POP0(Pjp, cLevel) + 1;                       \
+                                                                        \
+        if (pop1 > (MaxPop1))   /* hysteresis = 1 */                    \
+        {                                                               \
+            level = (cLevel);                                           \
+            Pjp   = P_JP(Pjp->jp_Addr) + JU_DIGITATSTATE(Index, cLevel);\
+            break;              /* descend to next level */             \
+        }                                                               \
+        assert(pop1 == (MaxPop1));                                      \
+                                                                        \
+        JU_BRANCHU_COMPRESS(cLevel, LeafType, MaxPop1, NullJPType, NewJPType, \
+                            LeafToLeaf, Alloc, ValueArea, CopyImmed, CopyIndex)
+
+
+// END OF MACROS, START OF CASES:
+//
+// Note:  Its no accident that the macro calls for these cases is nearly
+// identical to the code for BranchLs, with the addition of cJU_JPNULL*
+// parameters only needed for BranchUs.
+
+        case cJU_JPBRANCH_U2:
+
+            JU_BRANCHU(2, cJU_LEAF2_MAXPOP1, uint16_t *,
+                       cJU_JPNULL1, cJU_JPLEAF2,
+                       j__udyLeaf1ToLeaf2, j__udyAllocJLL2, JL_LEAF2VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_EVEN, ignore);
+
+        case cJU_JPBRANCH_U3:
+
+            JU_BRANCHU(3, cJU_LEAF3_MAXPOP1, uint8_t *,
+                       cJU_JPNULL2, cJU_JPLEAF3,
+                       j__udyLeaf2ToLeaf3, j__udyAllocJLL3, JL_LEAF3VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY3_LONG_TO_PINDEX);
+
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_U4:
+
+            JU_BRANCHU(4, cJU_LEAF4_MAXPOP1, uint32_t *,
+                       cJU_JPNULL3, cJU_JPLEAF4,
+                       j__udyLeaf3ToLeaf4, j__udyAllocJLL4, JL_LEAF4VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_EVEN, ignore);
+
+        case cJU_JPBRANCH_U5:
+
+            JU_BRANCHU(5, cJU_LEAF5_MAXPOP1, uint8_t *,
+                       cJU_JPNULL4, cJU_JPLEAF5,
+                       j__udyLeaf4ToLeaf5, j__udyAllocJLL5, JL_LEAF5VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY5_LONG_TO_PINDEX);
+
+        case cJU_JPBRANCH_U6:
+
+            JU_BRANCHU(6, cJU_LEAF6_MAXPOP1, uint8_t *,
+                       cJU_JPNULL5, cJU_JPLEAF6,
+                       j__udyLeaf5ToLeaf6, j__udyAllocJLL6, JL_LEAF6VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY6_LONG_TO_PINDEX);
+
+        case cJU_JPBRANCH_U7:
+
+            JU_BRANCHU(7, cJU_LEAF7_MAXPOP1, uint8_t *,
+                       cJU_JPNULL6, cJU_JPLEAF7,
+                       j__udyLeaf6ToLeaf7, j__udyAllocJLL7, JL_LEAF7VALUEAREA,
+                       JU_BRANCH_COPY_IMMED_ODD, JU_COPY7_LONG_TO_PINDEX);
+#endif // JU_64BIT
+
+// A top-level BranchU is different and cannot use JU_BRANCHU():  Dont try to
+// compress to a (LEAFW) leaf yet, but leave this for a later deletion
+// (hysteresis > 0); just descend through the BranchU:
+
+        case cJU_JPBRANCH_U:
+
+            DBGCODE(parentJPtype = JU_JPTYPE(Pjp);)
+
+            level = cJU_ROOTSTATE;
+            Pjp   = P_JP(Pjp->jp_Addr) + JU_DIGITATSTATE(Index, cJU_ROOTSTATE);
+            break;
+
+
+// ****************************************************************************
+// LINEAR LEAF:
+//
+// State transitions while deleting an Index, the inverse of the similar table
+// that appears in JudyIns.c:
+//
+// Note:  In JudyIns.c this table is not needed and does not appear until the
+// Immed handling code; because once a Leaf is reached upon growing the tree,
+// the situation remains simpler, but for deleting indexes, the complexity
+// arises when leaves must compress to Immeds.
+//
+// Note:  There are other transitions possible too, not shown here, such as to
+// a leaf one level higher.
+//
+// (Yes, this is very terse...  Study it and it will make sense.)
+// (Note, parts of this diagram are repeated below for quick reference.)
+//
+//                      reformat JP here for Judy1 only, from word-1 to word-2
+//                                                                     |
+//           JUDY1 && JU_64BIT   JUDY1 || JU_64BIT                     |
+//                                                                     V
+// (*) Leaf1 [[ => 1_15..08 ] => 1_07 => ... => 1_04 ] => 1_03 => 1_02 => 1_01
+//     Leaf2 [[ => 2_07..04 ] => 2_03 => 2_02        ]                 => 2_01
+//     Leaf3 [[ => 3_05..03 ] => 3_02                ]                 => 3_01
+// JU_64BIT only:
+//     Leaf4 [[ => 4_03..02 ]]                                         => 4_01
+//     Leaf5 [[ => 5_03..02 ]]                                         => 5_01
+//     Leaf6 [[ => 6_02     ]]                                         => 6_01
+//     Leaf7 [[ => 7_02     ]]                                         => 7_01
+//
+// (*) For Judy1 & 64-bit, go directly from a LeafB1 to cJU_JPIMMED_1_15; skip
+//     Leaf1, as described in Judy1.h regarding cJ1_JPLEAF1.
+//
+// MACROS FOR COMMON CODE:
+//
+// (De)compress a LeafX into a LeafY one index size (cIS) larger (X+1 = Y):
+//
+// This is only possible when the current leaf is under a narrow pointer
+// ((ParentLevel - 1) > cIS) and its population fits in a higher-level leaf.
+// Variables ParentLevel, pop1, PjllnewRaw, Pjllnew, Pjpm, and Index are in the
+// context.
+//
+// Note:  Doing an "uplevel" doesnt occur until the old leaf can be compressed
+// up one level BEFORE deleting an index; that is, hysteresis = 1.
+//
+// Note:  LeafType, MaxPop1, NewJPType, and Alloc refer to the up-level leaf,
+// not the current leaf.
+//
+// Note:  010327:  Fixed bug where the jp_DcdPopO next-uplevel digit (byte)
+// above the current Pop0 value was not being cleared.  When upleveling, one
+// digit in jp_DcdPopO "moves" from being part of the Dcd subfield to the Pop0
+// subfield, but since a leaf maxpop1 is known to be <= 1 byte in size, the new
+// Pop0 byte should always be zero.  This is easy to overlook because
+// JU_JPLEAF_POP0() "knows" to only use the LSB of Pop0 (for efficiency) and
+// ignore the other bytes...  Until someone uses cJU_POP0MASK() instead of
+// JU_JPLEAF_POP0(), such as in JudyInsertBranch.c.
+//
+// TBD:  Should JudyInsertBranch.c use JU_JPLEAF_POP0() rather than
+// cJU_POP0MASK(), for efficiency?  Does it know for sure its a narrow pointer
+// under the leaf?  Not necessarily.
+
+#define JU_LEAF_UPLEVEL(cIS,LeafType,MaxPop1,NewJPType,LeafToLeaf,      \
+                        Alloc,ValueArea)                                \
+                                                                        \
+        assert(((ParentLevel - 1) == (cIS)) || (pop1 >= (MaxPop1)));    \
+                                                                        \
+        if (((ParentLevel - 1) > (cIS))  /* under narrow pointer */     \
+         && (pop1 == (MaxPop1)))         /* hysteresis = 1       */     \
+        {                                                               \
+            Word_t D_cdP0;                                              \
+            if ((PjllnewRaw = Alloc(MaxPop1, Pjpm)) == 0) return(-1);   \
+            Pjllnew = P_JLL(PjllnewRaw);                                \
+  JUDYLCODE(Pjv     = ValueArea((LeafType) Pjllnew, MaxPop1);)          \
+                                                                        \
+            (void) LeafToLeaf((LeafType) Pjllnew, JU_PVALUEPASS Pjp,    \
+                              Index & cJU_DCDMASK(cIS), /* TBD, Doug says */ \
+                              (Pvoid_t) Pjpm);                          \
+            DBGCODE(JudyCheckSorted(Pjllnew, MaxPop1, cIS + 1);)        \
+                                                                        \
+            D_cdP0 = (~cJU_MASKATSTATE((cIS) + 1)) & JU_JPDCDPOP0(Pjp); \
+            JU_JPSETADT(Pjp, (Word_t)PjllnewRaw, D_cdP0, NewJPType);    \
+            goto ContinueDelWalk;       /* delete from new leaf */      \
+        }
+
+
+// For Leaf3, only support JU_LEAF_UPLEVEL on a 64-bit system, and for Leaf7,
+// there is no JU_LEAF_UPLEVEL:
+//
+// Note:  Theres no way here to go from Leaf3 [Leaf7] to LEAFW on a 32-bit
+// [64-bit] system.  Thats handled in the main code, because its different in
+// that a JPM is involved.
+
+#ifndef JU_64BIT // 32-bit.
+#define JU_LEAF_UPLEVEL64(cIS,LeafType,MaxPop1,NewJPType,LeafToLeaf,    \
+                          Alloc,ValueArea)              // null.
+#else
+#define JU_LEAF_UPLEVEL64(cIS,LeafType,MaxPop1,NewJPType,LeafToLeaf,    \
+                          Alloc,ValueArea)                              \
+        JU_LEAF_UPLEVEL  (cIS,LeafType,MaxPop1,NewJPType,LeafToLeaf,    \
+                          Alloc,ValueArea)
+#define JU_LEAF_UPLEVEL_NONE(cIS,LeafType,MaxPop1,NewJPType,LeafToLeaf, \
+                          Alloc,ValueArea)              // null.
+#endif
+
+// Compress a Leaf* with pop1 = 2, or a JPIMMED_*_02, into a JPIMMED_*_01:
+//
+// Copy whichever Index is NOT being deleted (and assert that the other one is
+// found; Index must be valid).  This requires special handling of the Index
+// bytes (and value area).  Variables Pjp, Index, offset, and Pleaf are in the
+// context, offset is modified to the undeleted Index, and Pjp is modified
+// including jp_Addr.
+
+
+#define JU_TOIMMED_01_EVEN(cIS,ignore1,ignore2)                         \
+{                                                                       \
+        Word_t  D_cdP0;                                                 \
+        Word_t  A_ddr = 0;                                              \
+        uint8_t T_ype = JU_JPTYPE(Pjp);                                 \
+        offset = (Pleaf[0] == JU_LEASTBYTES(Index, cIS)); /* undeleted Ind */ \
+        assert(Pleaf[offset ? 0 : 1] == JU_LEASTBYTES(Index, cIS));     \
+        D_cdP0 = (Index & cJU_DCDMASK(cIS)) | Pleaf[offset];            \
+JUDYLCODE(A_ddr = Pjv[offset];)                                         \
+        JU_JPSETADT(Pjp, A_ddr, D_cdP0, T_ype);                         \
+}
+
+#define JU_TOIMMED_01_ODD(cIS,SearchLeaf,CopyPIndex)                    \
+        {                                                               \
+            Word_t  D_cdP0;                                             \
+            Word_t  A_ddr = 0;                                          \
+            uint8_t T_ype = JU_JPTYPE(Pjp);                             \
+                                                                        \
+            offset = SearchLeaf(Pleaf, 2, Index);                       \
+            assert(offset >= 0);        /* Index must be valid */       \
+            CopyPIndex(D_cdP0, & (Pleaf[offset ? 0 : cIS]));            \
+            D_cdP0 |= Index & cJU_DCDMASK(cIS);                         \
+  JUDYLCODE(A_ddr = Pjv[offset ? 0 : 1];)                               \
+            JU_JPSETADT(Pjp, A_ddr, D_cdP0, T_ype);                     \
+        }
+
+
+// Compress a Leaf* into a JPIMMED_*_0[2+]:
+//
+// This occurs as soon as its possible, with hysteresis = 0.  Variables pop1,
+// Pleaf, offset, and Pjpm are in the context.
+//
+// TBD:  Explain why hysteresis = 0 here, rather than > 0.  Probably because
+// the insert code assumes if the population is small enough, an Immed is used,
+// not a leaf.
+//
+// The differences between Judy1 and JudyL with respect to value area handling
+// are just too large for completely common code between them...  Oh well, some
+// big ifdefs follow.
+
+#ifdef JUDY1
+
+#define JU_LEAF_TOIMMED(cIS,LeafType,MaxPop1,BaseJPType,ignore1,\
+                        ignore2,ignore3,ignore4,                \
+                        DeleteCopy,FreeLeaf)                    \
+                                                                \
+        assert(pop1 > (MaxPop1));                               \
+                                                                \
+        if ((pop1 - 1) == (MaxPop1))    /* hysteresis = 0 */    \
+        {                                                       \
+            Pjll_t PjllRaw = (Pjll_t) (Pjp->jp_Addr);           \
+            DeleteCopy((LeafType) (Pjp->jp_1Index), Pleaf, pop1, offset, cIS); \
+            DBGCODE(JudyCheckSorted((Pjll_t) (Pjp->jp_1Index),  pop1-1, cIS);) \
+            Pjp->jp_Type = (BaseJPType) - 1 + (MaxPop1) - 1;    \
+            FreeLeaf(PjllRaw, pop1, Pjpm);                      \
+            return(1);                                          \
+        }
+
+#else // JUDYL
+
+// Pjv is also in the context.
+
+#define JU_LEAF_TOIMMED(cIS,LeafType,MaxPop1,BaseJPType,ignore1,\
+                        ignore2,ignore3,ignore4,                \
+                        DeleteCopy,FreeLeaf)                    \
+                                                                \
+        assert(pop1 > (MaxPop1));                               \
+                                                                \
+        if ((pop1 - 1) == (MaxPop1))    /* hysteresis = 0 */    \
+        {                                                       \
+            Pjll_t PjllRaw = (Pjll_t) (Pjp->jp_Addr);           \
+            Pjv_t  PjvnewRaw;                                   \
+            Pjv_t  Pjvnew;                                      \
+                                                                \
+            if ((PjvnewRaw = j__udyLAllocJV(pop1 - 1, Pjpm))    \
+                == (Pjv_t) NULL) return(-1);                    \
+   JUDYLCODE(Pjvnew = P_JV(PjvnewRaw);)                         \
+                                                                \
+            DeleteCopy((LeafType) (Pjp->jp_LIndex), Pleaf, pop1, offset, cIS); \
+            JU_DELETECOPY(Pjvnew, Pjv, pop1, offset, cIS);      \
+            DBGCODE(JudyCheckSorted((Pjll_t) (Pjp->jp_LIndex),  pop1-1, cIS);) \
+            FreeLeaf(PjllRaw, pop1, Pjpm);                      \
+            Pjp->jp_Addr = (Word_t) PjvnewRaw;                  \
+            Pjp->jp_Type = (BaseJPType) - 2 + (MaxPop1);        \
+            return(1);                                          \
+        }
+
+// A complicating factor for JudyL & 32-bit is that Leaf2..3, and for JudyL &
+// 64-bit Leaf 4..7, go directly to an Immed*_01, where the value is stored in
+// jp_Addr and not in a separate LeafV.  For efficiency, use the following
+// macro in cases where it can apply; it is rigged to do the right thing.
+// Unfortunately, this requires the calling code to "know" the transition table
+// and call the right macro.
+//
+// This variant compresses a Leaf* with pop1 = 2 into a JPIMMED_*_01:
+
+#define JU_LEAF_TOIMMED_01(cIS,LeafType,MaxPop1,ignore,Immed01JPType,   \
+                           ToImmed,SearchLeaf,CopyPIndex,               \
+                           DeleteCopy,FreeLeaf)                         \
+                                                                        \
+        assert(pop1 > (MaxPop1));                                       \
+                                                                        \
+        if ((pop1 - 1) == (MaxPop1))    /* hysteresis = 0 */            \
+        {                                                               \
+            Pjll_t PjllRaw = (Pjll_t) (Pjp->jp_Addr);                   \
+            ToImmed(cIS, SearchLeaf, CopyPIndex);                       \
+            FreeLeaf(PjllRaw, pop1, Pjpm);                              \
+            Pjp->jp_Type = (Immed01JPType);                             \
+            return(1);                                                  \
+        }
+#endif // JUDYL
+
+// See comments above about these:
+//
+// Note:  Here "23" means index size 2 or 3, and "47" means 4..7.
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+#define JU_LEAF_TOIMMED_23(cIS,LeafType,MaxPop1,BaseJPType,Immed01JPType, \
+                           ToImmed,SearchLeaf,CopyPIndex,               \
+                           DeleteCopy,FreeLeaf)                         \
+        JU_LEAF_TOIMMED(   cIS,LeafType,MaxPop1,BaseJPType,ignore1,     \
+                           ignore2,ignore3,ignore4,                     \
+                           DeleteCopy,FreeLeaf)
+#else // JUDYL && 32-bit
+#define JU_LEAF_TOIMMED_23(cIS,LeafType,MaxPop1,BaseJPType,Immed01JPType, \
+                           ToImmed,SearchLeaf,CopyPIndex,               \
+                           DeleteCopy,FreeLeaf)                         \
+        JU_LEAF_TOIMMED_01(cIS,LeafType,MaxPop1,ignore,Immed01JPType,   \
+                           ToImmed,SearchLeaf,CopyPIndex,               \
+                           DeleteCopy,FreeLeaf)
+#endif
+
+#ifdef JU_64BIT
+#ifdef JUDY1
+#define JU_LEAF_TOIMMED_47(cIS,LeafType,MaxPop1,BaseJPType,Immed01JPType, \
+                           ToImmed,SearchLeaf,CopyPIndex,               \
+                           DeleteCopy,FreeLeaf)                         \
+        JU_LEAF_TOIMMED(   cIS,LeafType,MaxPop1,BaseJPType,ignore1,     \
+                           ignore2,ignore3,ignore4,                     \
+                           DeleteCopy,FreeLeaf)
+#else // JUDYL && 64-bit
+#define JU_LEAF_TOIMMED_47(cIS,LeafType,MaxPop1,BaseJPType,Immed01JPType, \
+                           ToImmed,SearchLeaf,CopyPIndex,               \
+                           DeleteCopy,FreeLeaf)                         \
+        JU_LEAF_TOIMMED_01(cIS,LeafType,MaxPop1,ignore,Immed01JPType,   \
+                           ToImmed,SearchLeaf,CopyPIndex,               \
+                           DeleteCopy,FreeLeaf)
+#endif // JUDYL
+#endif // JU_64BIT
+
+// Compress a Leaf* in place:
+//
+// Here hysteresis = 0 (no memory is wasted).  Variables pop1, Pleaf, and
+// offset, and for JudyL, Pjv, are in the context.
+
+#ifdef JUDY1
+#define JU_LEAF_INPLACE(cIS,GrowInPlace,DeleteInPlace)          \
+        if (GrowInPlace(pop1 - 1))      /* hysteresis = 0 */    \
+        {                                                       \
+            DeleteInPlace(Pleaf, pop1, offset, cIS);            \
+            DBGCODE(JudyCheckSorted(Pleaf, pop1 - 1, cIS);)     \
+            return(1);                                          \
+        }
+#else
+#define JU_LEAF_INPLACE(cIS,GrowInPlace,DeleteInPlace)          \
+        if (GrowInPlace(pop1 - 1))      /* hysteresis = 0 */    \
+        {                                                       \
+            DeleteInPlace(Pleaf, pop1, offset, cIS);            \
+/**/        JU_DELETEINPLACE(Pjv, pop1, offset, ignore);        \
+            DBGCODE(JudyCheckSorted(Pleaf, pop1 - 1, cIS);)     \
+            return(1);                                          \
+        }
+#endif
+
+// Compress a Leaf* into a smaller memory object of the same JP type:
+//
+// Variables PjllnewRaw, Pjllnew, Pleafpop1, Pjpm, PleafRaw, Pleaf, and offset
+// are in the context.
+
+#ifdef JUDY1
+
+#define JU_LEAF_SHRINK(cIS,LeafType,DeleteCopy,Alloc,FreeLeaf,ValueArea) \
+        if ((PjllnewRaw = Alloc(pop1 - 1, Pjpm)) == 0) return(-1);       \
+        Pjllnew = P_JLL(PjllnewRaw);                                     \
+        DeleteCopy((LeafType) Pjllnew, Pleaf, pop1, offset, cIS);        \
+        DBGCODE(JudyCheckSorted(Pjllnew, pop1 - 1, cIS);)                \
+        FreeLeaf(PleafRaw, pop1, Pjpm);                                  \
+        Pjp->jp_Addr = (Word_t) PjllnewRaw;                              \
+        return(1)
+
+#else // JUDYL
+
+#define JU_LEAF_SHRINK(cIS,LeafType,DeleteCopy,Alloc,FreeLeaf,ValueArea) \
+        {                                                               \
+/**/        Pjv_t Pjvnew;                                               \
+                                                                        \
+            if ((PjllnewRaw = Alloc(pop1 - 1, Pjpm)) == 0) return(-1);  \
+            Pjllnew = P_JLL(PjllnewRaw);                                \
+/**/        Pjvnew  = ValueArea(Pjllnew, pop1 - 1);                     \
+            DeleteCopy((LeafType) Pjllnew, Pleaf, pop1, offset, cIS);   \
+/**/        JU_DELETECOPY(Pjvnew, Pjv, pop1, offset, cIS);              \
+            DBGCODE(JudyCheckSorted(Pjllnew, pop1 - 1, cIS);)           \
+            FreeLeaf(PleafRaw, pop1, Pjpm);                             \
+            Pjp->jp_Addr = (Word_t) PjllnewRaw;                         \
+            return(1);                                                  \
+        }
+#endif // JUDYL
+
+// Overall common code for Leaf* deletion handling:
+//
+// See if the leaf can be:
+// - (de)compressed to one a level higher (JU_LEAF_UPLEVEL()), or if not,
+// - compressed to an Immediate JP (JU_LEAF_TOIMMED()), or if not,
+// - shrunk in place (JU_LEAF_INPLACE()), or if none of those, then
+// - shrink the leaf to a smaller chunk of memory (JU_LEAF_SHRINK()).
+//
+// Variables Pjp, pop1, Index, and offset are in the context.
+// The *Up parameters refer to a leaf one level up, if there is any.
+
+#define JU_LEAF(cIS,                                                    \
+                UpLevel,                                                \
+                  LeafTypeUp,MaxPop1Up,LeafJPTypeUp,LeafToLeaf,         \
+                  AllocUp,ValueAreaUp,                                  \
+                LeafToImmed,ToImmed,CopyPIndex,                         \
+                  LeafType,ImmedMaxPop1,ImmedBaseJPType,Immed01JPType,  \
+                  SearchLeaf,GrowInPlace,DeleteInPlace,DeleteCopy,      \
+                  Alloc,FreeLeaf,ValueArea)                             \
+        {                                                               \
+            Pjll_t   PleafRaw;                                          \
+            LeafType Pleaf;                                             \
+                                                                        \
+            assert(! JU_DCDNOTMATCHINDEX(Index, Pjp, cIS));             \
+            assert(ParentLevel > (cIS));                                \
+                                                                        \
+            PleafRaw = (Pjll_t) (Pjp->jp_Addr);                         \
+            Pleaf    = (LeafType) P_JLL(PleafRaw);                      \
+            pop1     = JU_JPLEAF_POP0(Pjp) + 1;                         \
+                                                                        \
+            UpLevel(cIS, LeafTypeUp, MaxPop1Up, LeafJPTypeUp,           \
+                    LeafToLeaf, AllocUp, ValueAreaUp);                  \
+                                                                        \
+            offset = SearchLeaf(Pleaf, pop1, Index);                    \
+            assert(offset >= 0);        /* Index must be valid */       \
+  JUDYLCODE(Pjv = ValueArea(Pleaf, pop1);)                              \
+                                                                        \
+            LeafToImmed(cIS, LeafType, ImmedMaxPop1,                    \
+                        ImmedBaseJPType, Immed01JPType,                 \
+                        ToImmed, SearchLeaf, CopyPIndex,                \
+                        DeleteCopy, FreeLeaf);                          \
+                                                                        \
+            JU_LEAF_INPLACE(cIS, GrowInPlace, DeleteInPlace);           \
+                                                                        \
+            JU_LEAF_SHRINK(cIS, LeafType, DeleteCopy, Alloc, FreeLeaf,  \
+                           ValueArea);                                  \
+        }
+
+// END OF MACROS, START OF CASES:
+//
+// (*) Leaf1 [[ => 1_15..08 ] => 1_07 => ... => 1_04 ] => 1_03 => 1_02 => 1_01
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+        case cJU_JPLEAF1:
+
+            JU_LEAF(1,
+                    JU_LEAF_UPLEVEL, uint16_t *, cJU_LEAF2_MAXPOP1, cJU_JPLEAF2,
+                      j__udyLeaf1ToLeaf2, j__udyAllocJLL2, JL_LEAF2VALUEAREA,
+                    JU_LEAF_TOIMMED, ignore, ignore,
+                      uint8_t *, cJU_IMMED1_MAXPOP1,
+                      cJU_JPIMMED_1_02, cJU_JPIMMED_1_01, j__udySearchLeaf1,
+                      JU_LEAF1GROWINPLACE, JU_DELETEINPLACE, JU_DELETECOPY,
+                      j__udyAllocJLL1, j__udyFreeJLL1, JL_LEAF1VALUEAREA);
+#endif
+
+// A complicating factor is that for JudyL & 32-bit, a Leaf2 must go directly
+// to an Immed 2_01 and a Leaf3 must go directly to an Immed 3_01:
+//
+// Leaf2 [[ => 2_07..04 ] => 2_03 => 2_02 ] => 2_01
+// Leaf3 [[ => 3_05..03 ] => 3_02         ] => 3_01
+//
+// Hence use JU_LEAF_TOIMMED_23 instead of JU_LEAF_TOIMMED in the cases below,
+// and also the parameters ToImmed and, for odd index sizes, CopyPIndex, are
+// required.
+
+        case cJU_JPLEAF2:
+
+            JU_LEAF(2,
+                    JU_LEAF_UPLEVEL, uint8_t *, cJU_LEAF3_MAXPOP1, cJU_JPLEAF3,
+                      j__udyLeaf2ToLeaf3, j__udyAllocJLL3, JL_LEAF3VALUEAREA,
+                    JU_LEAF_TOIMMED_23, JU_TOIMMED_01_EVEN, ignore,
+                      uint16_t *, cJU_IMMED2_MAXPOP1,
+                      cJU_JPIMMED_2_02, cJU_JPIMMED_2_01, j__udySearchLeaf2,
+                      JU_LEAF2GROWINPLACE, JU_DELETEINPLACE, JU_DELETECOPY,
+                      j__udyAllocJLL2, j__udyFreeJLL2, JL_LEAF2VALUEAREA);
+
+// On 32-bit there is no transition to "uplevel" for a Leaf3, so use
+// JU_LEAF_UPLEVEL64 instead of JU_LEAF_UPLEVEL:
+
+        case cJU_JPLEAF3:
+
+            JU_LEAF(3,
+                    JU_LEAF_UPLEVEL64, uint32_t *, cJU_LEAF4_MAXPOP1,
+                      cJU_JPLEAF4,
+                      j__udyLeaf3ToLeaf4, j__udyAllocJLL4, JL_LEAF4VALUEAREA,
+                    JU_LEAF_TOIMMED_23,
+                      JU_TOIMMED_01_ODD, JU_COPY3_PINDEX_TO_LONG,
+                      uint8_t *, cJU_IMMED3_MAXPOP1,
+                      cJU_JPIMMED_3_02, cJU_JPIMMED_3_01, j__udySearchLeaf3,
+                      JU_LEAF3GROWINPLACE, JU_DELETEINPLACE_ODD,
+                                           JU_DELETECOPY_ODD,
+                      j__udyAllocJLL3, j__udyFreeJLL3, JL_LEAF3VALUEAREA);
+
+#ifdef JU_64BIT
+
+// A complicating factor is that for JudyL & 64-bit, a Leaf[4-7] must go
+// directly to an Immed [4-7]_01:
+//
+// Leaf4 [[ => 4_03..02 ]] => 4_01
+// Leaf5 [[ => 5_03..02 ]] => 5_01
+// Leaf6 [[ => 6_02     ]] => 6_01
+// Leaf7 [[ => 7_02     ]] => 7_01
+//
+// Hence use JU_LEAF_TOIMMED_47 instead of JU_LEAF_TOIMMED in the cases below.
+
+        case cJU_JPLEAF4:
+
+            JU_LEAF(4,
+                    JU_LEAF_UPLEVEL, uint8_t *, cJU_LEAF5_MAXPOP1, cJU_JPLEAF5,
+                      j__udyLeaf4ToLeaf5, j__udyAllocJLL5, JL_LEAF5VALUEAREA,
+                    JU_LEAF_TOIMMED_47, JU_TOIMMED_01_EVEN, ignore,
+                      uint32_t *, cJU_IMMED4_MAXPOP1,
+                      cJ1_JPIMMED_4_02, cJU_JPIMMED_4_01, j__udySearchLeaf4,
+                      JU_LEAF4GROWINPLACE, JU_DELETEINPLACE, JU_DELETECOPY,
+                      j__udyAllocJLL4, j__udyFreeJLL4, JL_LEAF4VALUEAREA);
+
+        case cJU_JPLEAF5:
+
+            JU_LEAF(5,
+                    JU_LEAF_UPLEVEL, uint8_t *, cJU_LEAF6_MAXPOP1, cJU_JPLEAF6,
+                      j__udyLeaf5ToLeaf6, j__udyAllocJLL6, JL_LEAF6VALUEAREA,
+                    JU_LEAF_TOIMMED_47,
+                      JU_TOIMMED_01_ODD, JU_COPY5_PINDEX_TO_LONG,
+                      uint8_t *, cJU_IMMED5_MAXPOP1,
+                      cJ1_JPIMMED_5_02, cJU_JPIMMED_5_01, j__udySearchLeaf5,
+                      JU_LEAF5GROWINPLACE, JU_DELETEINPLACE_ODD,
+                                           JU_DELETECOPY_ODD,
+                      j__udyAllocJLL5, j__udyFreeJLL5, JL_LEAF5VALUEAREA);
+
+        case cJU_JPLEAF6:
+
+            JU_LEAF(6,
+                    JU_LEAF_UPLEVEL, uint8_t *, cJU_LEAF7_MAXPOP1, cJU_JPLEAF7,
+                      j__udyLeaf6ToLeaf7, j__udyAllocJLL7, JL_LEAF7VALUEAREA,
+                    JU_LEAF_TOIMMED_47,
+                      JU_TOIMMED_01_ODD, JU_COPY6_PINDEX_TO_LONG,
+                      uint8_t *, cJU_IMMED6_MAXPOP1,
+                      cJ1_JPIMMED_6_02, cJU_JPIMMED_6_01, j__udySearchLeaf6,
+                      JU_LEAF6GROWINPLACE, JU_DELETEINPLACE_ODD,
+                                           JU_DELETECOPY_ODD,
+                      j__udyAllocJLL6, j__udyFreeJLL6, JL_LEAF6VALUEAREA);
+
+// There is no transition to "uplevel" for a Leaf7, so use JU_LEAF_UPLEVEL_NONE
+// instead of JU_LEAF_UPLEVEL, and ignore all of the parameters to that macro:
+
+        case cJU_JPLEAF7:
+
+            JU_LEAF(7,
+                    JU_LEAF_UPLEVEL_NONE, ignore1, ignore2, ignore3, ignore4,
+                      ignore5, ignore6,
+                    JU_LEAF_TOIMMED_47,
+                      JU_TOIMMED_01_ODD, JU_COPY7_PINDEX_TO_LONG,
+                      uint8_t *, cJU_IMMED7_MAXPOP1,
+                      cJ1_JPIMMED_7_02, cJU_JPIMMED_7_01, j__udySearchLeaf7,
+                      JU_LEAF7GROWINPLACE, JU_DELETEINPLACE_ODD,
+                                           JU_DELETECOPY_ODD,
+                      j__udyAllocJLL7, j__udyFreeJLL7, JL_LEAF7VALUEAREA);
+#endif // JU_64BIT
+
+
+// ****************************************************************************
+// BITMAP LEAF:
+
+        case cJU_JPLEAF_B1:
+        {
+#ifdef JUDYL
+            Pjv_t     PjvnewRaw;        // new value area.
+            Pjv_t     Pjvnew;
+            Word_t    subexp;           // 1 of 8 subexpanses in bitmap.
+            Pjlb_t    Pjlb;             // pointer to bitmap part of the leaf.
+            BITMAPL_t bitmap;           // for one subexpanse.
+            BITMAPL_t bitmask;          // bit set for Indexs digit.
+#endif
+            assert(! JU_DCDNOTMATCHINDEX(Index, Pjp, 1));
+            assert(ParentLevel > 1);
+            // valid Index:
+            assert(JU_BITMAPTESTL(P_JLB(Pjp->jp_Addr), Index));
+
+            pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+
+// Like a Leaf1, see if its under a narrow pointer and can become a Leaf2
+// (hysteresis = 1):
+
+            JU_LEAF_UPLEVEL(1, uint16_t *, cJU_LEAF2_MAXPOP1, cJU_JPLEAF2,
+                            j__udyLeaf1ToLeaf2, j__udyAllocJLL2,
+                            JL_LEAF2VALUEAREA);
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+
+// Handle the unusual special case, on Judy1 64-bit only, where a LeafB1 goes
+// directly to a JPIMMED_1_15; as described in comments in Judy1.h and
+// JudyIns.c.  Copy 1-byte indexes from old LeafB1 to the Immed:
+
+            if ((pop1 - 1) == cJU_IMMED1_MAXPOP1)       // hysteresis = 0.
+            {
+                Pjlb_t    PjlbRaw;      // bitmap in old leaf.
+                Pjlb_t    Pjlb;
+                uint8_t * Pleafnew;     // JPIMMED as a pointer.
+                Word_t    ldigit;       // larger than uint8_t.
+
+                PjlbRaw  = (Pjlb_t) (Pjp->jp_Addr);
+                Pjlb     = P_JLB(PjlbRaw);
+                Pleafnew = Pjp->jp_1Index;
+
+                JU_BITMAPCLEARL(Pjlb, Index);   // unset Indexs bit.
+
+// TBD:  This is very slow, there must be a better way:
+
+                for (ldigit = 0; ldigit < cJU_BRANCHUNUMJPS; ++ldigit)
+                {
+                    if (JU_BITMAPTESTL(Pjlb, ldigit))
+                    {
+                        *Pleafnew++ = ldigit;
+                        assert(Pleafnew - (Pjp->jp_1Index)
+                            <= cJU_IMMED1_MAXPOP1);
+                    }
+                }
+
+                DBGCODE(JudyCheckSorted((Pjll_t) (Pjp->jp_1Index),
+                                        cJU_IMMED1_MAXPOP1, 1);)
+                j__udyFreeJLB1(PjlbRaw, Pjpm);
+
+                Pjp->jp_Type = cJ1_JPIMMED_1_15;
+                return(1);
+            }
+
+#else // (JUDYL || (! JU_64BIT))
+
+// Compress LeafB1 to a Leaf1:
+//
+// Note:  4.37 of this file contained alternate code for Judy1 only that simply
+// cleared the bit and allowed the LeafB1 to go below cJU_LEAF1_MAXPOP1.  This
+// was the ONLY case where a malloc failure was not fatal; however, it violated
+// the critical assumption that the tree is always kept in least-compressed
+// form.
+
+            if (pop1 == cJU_LEAF1_MAXPOP1)      // hysteresis = 1.
+            {
+                if (j__udyLeafB1ToLeaf1(Pjp, Pjpm) == -1) return(-1);
+                goto ContinueDelWalk;   // delete Index in new Leaf1.
+            }
+#endif // (JUDYL || (! JU_64BIT))
+
+#ifdef JUDY1
+            // unset Indexs bit:
+
+            JU_BITMAPCLEARL(P_JLB(Pjp->jp_Addr), Index);
+#else // JUDYL
+
+// This is very different from Judy1 because of the need to manage the value
+// area:
+//
+// Get last byte to decode from Index, and pointer to bitmap leaf:
+
+            digit = JU_DIGITATSTATE(Index, 1);
+            Pjlb = P_JLB(Pjp->jp_Addr);
+
+// Prepare additional values:
+
+            subexp  = digit / cJU_BITSPERSUBEXPL;       // which subexpanse.
+            bitmap  = JU_JLB_BITMAP(Pjlb, subexp);      // subexps 32-bit map.
+            PjvRaw  = JL_JLB_PVALUE(Pjlb, subexp);      // corresponding values.
+            Pjv     = P_JV(PjvRaw);
+            bitmask = JU_BITPOSMASKL(digit);            // mask for Index.
+
+            assert(bitmap & bitmask);                   // Index must be valid.
+
+            if (bitmap == cJU_FULLBITMAPL)      // full bitmap, take shortcut:
+            {
+                pop1   = cJU_BITSPERSUBEXPL;
+                offset = digit % cJU_BITSPERSUBEXPL;
+            }
+            else        // compute subexpanse pop1 and value area offset:
+            {
+                pop1   = j__udyCountBitsL(bitmap);
+                offset = j__udyCountBitsL(bitmap & (bitmask - 1));
+            }
+
+// Handle solitary Index remaining in subexpanse:
+
+            if (pop1 == 1)
+            {
+                j__udyLFreeJV(PjvRaw, 1, Pjpm);
+
+                JL_JLB_PVALUE(Pjlb, subexp) = (Pjv_t) NULL;
+                JU_JLB_BITMAP(Pjlb, subexp) = 0;
+
+                return(1);
+            }
+
+// Shrink value area in place or move to a smaller value area:
+
+            if (JL_LEAFVGROWINPLACE(pop1 - 1))          // hysteresis = 0.
+            {
+                JU_DELETEINPLACE(Pjv, pop1, offset, ignore);
+            }
+            else
+            {
+                if ((PjvnewRaw = j__udyLAllocJV(pop1 - 1, Pjpm))
+                    == (Pjv_t) NULL) return(-1);
+                Pjvnew = P_JV(PjvnewRaw);
+
+                JU_DELETECOPY(Pjvnew, Pjv, pop1, offset, ignore);
+                j__udyLFreeJV(PjvRaw, pop1, Pjpm);
+                JL_JLB_PVALUE(Pjlb, subexp) = (Pjv_t) PjvnewRaw;
+            }
+
+            JU_JLB_BITMAP(Pjlb, subexp) ^= bitmask;     // clear Indexs bit.
+
+#endif // JUDYL
+
+            return(1);
+
+        } // case.
+
+
+#ifdef JUDY1
+
+// ****************************************************************************
+// FULL POPULATION LEAF:
+//
+// Convert to a LeafB1 and delete the index.  Hysteresis = 0; none is possible.
+//
+// Note:  Earlier the second assertion below said, "== 2", but in fact the
+// parent could be at a higher level if a fullpop is under a narrow pointer.
+
+        case cJ1_JPFULLPOPU1:
+        {
+            Pjlb_t PjlbRaw;
+            Pjlb_t Pjlb;
+            Word_t subexp;
+
+            assert(! JU_DCDNOTMATCHINDEX(Index, Pjp, 2));
+            assert(ParentLevel > 1);    // see above.
+
+            if ((PjlbRaw = j__udyAllocJLB1(Pjpm)) == (Pjlb_t) NULL)
+                return(-1);
+            Pjlb = P_JLB(PjlbRaw);
+
+// Fully populate the leaf, then unset Indexs bit:
+
+            for (subexp = 0; subexp < cJU_NUMSUBEXPL; ++subexp)
+                JU_JLB_BITMAP(Pjlb, subexp) = cJU_FULLBITMAPL;
+
+            JU_BITMAPCLEARL(Pjlb, Index);
+
+            Pjp->jp_Addr = (Word_t) PjlbRaw;
+            Pjp->jp_Type = cJU_JPLEAF_B1;
+
+            return(1);
+        }
+#endif // JUDY1
+
+
+// ****************************************************************************
+// IMMEDIATE JP:
+//
+// If theres just the one Index in the Immed, convert the JP to a JPNULL*
+// (should only happen in a BranchU); otherwise delete the Index from the
+// Immed.  See the state transitions table elsewhere in this file for a summary
+// of which Immed types must be handled.  Hysteresis = 0; none is possible with
+// Immeds.
+//
+// MACROS FOR COMMON CODE:
+//
+// Single Index remains in cJU_JPIMMED_*_01; convert JP to null:
+//
+// Variables Pjp and parentJPtype are in the context.
+//
+// Note:  cJU_JPIMMED_*_01 should only be encountered in BranchUs, not in
+// BranchLs or BranchBs (where its improper to merely modify the JP to be a
+// null JP); that is, BranchL and BranchB code should have already handled
+// any cJU_JPIMMED_*_01 by different means.
+
+#define JU_IMMED_01(NewJPType,ParentJPType)                             \
+                                                                        \
+            assert(parentJPtype == (ParentJPType));                     \
+            assert(JU_JPDCDPOP0(Pjp) == JU_TRIMTODCDSIZE(Index));       \
+            JU_JPSETADT(Pjp, 0, 0, NewJPType);                          \
+            return(1)
+
+// Convert cJ*_JPIMMED_*_02 to cJU_JPIMMED_*_01:
+//
+// Move the undeleted Index, whichever does not match the least bytes of Index,
+// from undecoded-bytes-only (in jp_1Index or jp_LIndex as appropriate) to
+// jp_DcdPopO (full-field).  Pjp, Index, and offset are in the context.
+
+#define JU_IMMED_02(cIS,LeafType,NewJPType)             \
+        {                                               \
+            LeafType Pleaf;                             \
+                                                        \
+            assert((ParentLevel - 1) == (cIS));         \
+  JUDY1CODE(Pleaf  = (LeafType) (Pjp->jp_1Index);)      \
+  JUDYLCODE(Pleaf  = (LeafType) (Pjp->jp_LIndex);)      \
+  JUDYLCODE(PjvRaw = (Pjv_t) (Pjp->jp_Addr);)           \
+  JUDYLCODE(Pjv    = P_JV(PjvRaw);)                     \
+            JU_TOIMMED_01_EVEN(cIS, ignore, ignore);    \
+  JUDYLCODE(j__udyLFreeJV(PjvRaw, 2, Pjpm);)            \
+            Pjp->jp_Type = (NewJPType);                 \
+            return(1);                                  \
+        }
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+
+// Variation for "odd" cJ*_JPIMMED_*_02 JP types, which are very different from
+// "even" types because they use leaf search code and odd-copy macros:
+//
+// Note:  JudyL 32-bit has no "odd" JPIMMED_*_02 types.
+
+#define JU_IMMED_02_ODD(cIS,NewJPType,SearchLeaf,CopyPIndex)    \
+        {                                                       \
+            uint8_t * Pleaf;                                    \
+                                                                \
+            assert((ParentLevel - 1) == (cIS));                 \
+  JUDY1CODE(Pleaf  = (uint8_t *) (Pjp->jp_1Index);)             \
+  JUDYLCODE(Pleaf  = (uint8_t *) (Pjp->jp_LIndex);)             \
+  JUDYLCODE(PjvRaw = (Pjv_t) (Pjp->jp_Addr);)                   \
+  JUDYLCODE(Pjv    = P_JV(PjvRaw);)                             \
+            JU_TOIMMED_01_ODD(cIS, SearchLeaf, CopyPIndex);     \
+  JUDYLCODE(j__udyLFreeJV(PjvRaw, 2, Pjpm);)                    \
+            Pjp->jp_Type = (NewJPType);                         \
+            return(1);                                          \
+        }
+#endif // (JUDY1 || JU_64BIT)
+
+// Core code for deleting one Index (and for JudyL, its value area) from a
+// larger Immed:
+//
+// Variables Pleaf, pop1, and offset are in the context.
+
+#ifdef JUDY1
+#define JU_IMMED_DEL(cIS,DeleteInPlace)                 \
+        DeleteInPlace(Pleaf, pop1, offset, cIS);        \
+        DBGCODE(JudyCheckSorted(Pleaf, pop1 - 1, cIS);)
+
+#else // JUDYL
+
+// For JudyL the value area might need to be shrunk:
+
+#define JU_IMMED_DEL(cIS,DeleteInPlace)                         \
+                                                                \
+        if (JL_LEAFVGROWINPLACE(pop1 - 1)) /* hysteresis = 0 */ \
+        {                                                       \
+            DeleteInPlace(   Pleaf,  pop1, offset, cIS);        \
+            JU_DELETEINPLACE(Pjv, pop1, offset, ignore);        \
+            DBGCODE(JudyCheckSorted(Pleaf, pop1 - 1, cIS);)     \
+        }                                                       \
+        else                                                    \
+        {                                                       \
+            Pjv_t PjvnewRaw;                                    \
+            Pjv_t Pjvnew;                                       \
+                                                                \
+            if ((PjvnewRaw = j__udyLAllocJV(pop1 - 1, Pjpm))    \
+                == (Pjv_t) NULL) return(-1);                    \
+            Pjvnew = P_JV(PjvnewRaw);                           \
+                                                                \
+            DeleteInPlace(Pleaf, pop1, offset, cIS);            \
+            JU_DELETECOPY(Pjvnew, Pjv, pop1, offset, ignore);   \
+            DBGCODE(JudyCheckSorted(Pleaf, pop1 - 1, cIS);)     \
+            j__udyLFreeJV(PjvRaw, pop1, Pjpm);                  \
+                                                                \
+            (Pjp->jp_Addr) = (Word_t) PjvnewRaw;                \
+        }
+#endif // JUDYL
+
+// Delete one Index from a larger Immed where no restructuring is required:
+//
+// Variables pop1, Pjp, offset, and Index are in the context.
+
+#define JU_IMMED(cIS,LeafType,BaseJPType,SearchLeaf,DeleteInPlace)      \
+        {                                                               \
+            LeafType Pleaf;                                             \
+                                                                        \
+            assert((ParentLevel - 1) == (cIS));                         \
+  JUDY1CODE(Pleaf  = (LeafType) (Pjp->jp_1Index);)                      \
+  JUDYLCODE(Pleaf  = (LeafType) (Pjp->jp_LIndex);)                      \
+  JUDYLCODE(PjvRaw = (Pjv_t) (Pjp->jp_Addr);)                           \
+  JUDYLCODE(Pjv    = P_JV(PjvRaw);)                                     \
+            pop1   = (JU_JPTYPE(Pjp)) - (BaseJPType) + 2;               \
+            offset = SearchLeaf(Pleaf, pop1, Index);                    \
+            assert(offset >= 0);        /* Index must be valid */       \
+                                                                        \
+            JU_IMMED_DEL(cIS, DeleteInPlace);                           \
+            --(Pjp->jp_Type);                                           \
+            return(1);                                                  \
+        }
+
+
+// END OF MACROS, START OF CASES:
+
+// Single Index remains in Immed; convert JP to null:
+
+        case cJU_JPIMMED_1_01: JU_IMMED_01(cJU_JPNULL1, cJU_JPBRANCH_U2);
+        case cJU_JPIMMED_2_01: JU_IMMED_01(cJU_JPNULL2, cJU_JPBRANCH_U3);
+#ifndef JU_64BIT
+        case cJU_JPIMMED_3_01: JU_IMMED_01(cJU_JPNULL3, cJU_JPBRANCH_U);
+#else
+        case cJU_JPIMMED_3_01: JU_IMMED_01(cJU_JPNULL3, cJU_JPBRANCH_U4);
+        case cJU_JPIMMED_4_01: JU_IMMED_01(cJU_JPNULL4, cJU_JPBRANCH_U5);
+        case cJU_JPIMMED_5_01: JU_IMMED_01(cJU_JPNULL5, cJU_JPBRANCH_U6);
+        case cJU_JPIMMED_6_01: JU_IMMED_01(cJU_JPNULL6, cJU_JPBRANCH_U7);
+        case cJU_JPIMMED_7_01: JU_IMMED_01(cJU_JPNULL7, cJU_JPBRANCH_U);
+#endif
+
+// Multiple Indexes remain in the Immed JP; delete the specified Index:
+
+        case cJU_JPIMMED_1_02:
+
+            JU_IMMED_02(1, uint8_t *, cJU_JPIMMED_1_01);
+
+        case cJU_JPIMMED_1_03:
+#if (defined(JUDY1) || defined(JU_64BIT))
+        case cJU_JPIMMED_1_04:
+        case cJU_JPIMMED_1_05:
+        case cJU_JPIMMED_1_06:
+        case cJU_JPIMMED_1_07:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJ1_JPIMMED_1_08:
+        case cJ1_JPIMMED_1_09:
+        case cJ1_JPIMMED_1_10:
+        case cJ1_JPIMMED_1_11:
+        case cJ1_JPIMMED_1_12:
+        case cJ1_JPIMMED_1_13:
+        case cJ1_JPIMMED_1_14:
+        case cJ1_JPIMMED_1_15:
+#endif
+            JU_IMMED(1, uint8_t *, cJU_JPIMMED_1_02,
+                     j__udySearchLeaf1, JU_DELETEINPLACE);
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+        case cJU_JPIMMED_2_02:
+
+            JU_IMMED_02(2, uint16_t *, cJU_JPIMMED_2_01);
+
+        case cJU_JPIMMED_2_03:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJ1_JPIMMED_2_04:
+        case cJ1_JPIMMED_2_05:
+        case cJ1_JPIMMED_2_06:
+        case cJ1_JPIMMED_2_07:
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+            JU_IMMED(2, uint16_t *, cJU_JPIMMED_2_02,
+                     j__udySearchLeaf2, JU_DELETEINPLACE);
+
+        case cJU_JPIMMED_3_02:
+
+            JU_IMMED_02_ODD(3, cJU_JPIMMED_3_01,
+                            j__udySearchLeaf3, JU_COPY3_PINDEX_TO_LONG);
+
+#endif
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJ1_JPIMMED_3_03:
+        case cJ1_JPIMMED_3_04:
+        case cJ1_JPIMMED_3_05:
+
+            JU_IMMED(3, uint8_t *, cJU_JPIMMED_3_02,
+                     j__udySearchLeaf3, JU_DELETEINPLACE_ODD);
+
+        case cJ1_JPIMMED_4_02:
+
+            JU_IMMED_02(4, uint32_t *, cJU_JPIMMED_4_01);
+
+        case cJ1_JPIMMED_4_03:
+
+            JU_IMMED(4, uint32_t *, cJ1_JPIMMED_4_02,
+                     j__udySearchLeaf4, JU_DELETEINPLACE);
+
+        case cJ1_JPIMMED_5_02:
+
+            JU_IMMED_02_ODD(5, cJU_JPIMMED_5_01,
+                            j__udySearchLeaf5, JU_COPY5_PINDEX_TO_LONG);
+
+        case cJ1_JPIMMED_5_03:
+
+            JU_IMMED(5, uint8_t *, cJ1_JPIMMED_5_02,
+                     j__udySearchLeaf5, JU_DELETEINPLACE_ODD);
+
+        case cJ1_JPIMMED_6_02:
+
+            JU_IMMED_02_ODD(6, cJU_JPIMMED_6_01,
+                            j__udySearchLeaf6, JU_COPY6_PINDEX_TO_LONG);
+
+        case cJ1_JPIMMED_7_02:
+
+            JU_IMMED_02_ODD(7, cJU_JPIMMED_7_01,
+                            j__udySearchLeaf7, JU_COPY7_PINDEX_TO_LONG);
+
+#endif // (JUDY1 && JU_64BIT)
+
+
+// ****************************************************************************
+// INVALID JP TYPE:
+
+        default: JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT); return(-1);
+
+        } // switch
+
+
+// PROCESS JP -- RECURSIVELY:
+//
+// For non-Immed JP types, if successful, post-decrement the population count
+// at this level, or collapse a BranchL if necessary by copying the remaining
+// JP in the BranchL to the parent (hysteresis = 0), which implicitly creates a
+// narrow pointer if there was not already one in the hierarchy.
+
+        assert(level);
+        retcode =  j__udyDelWalk(Pjp, Index, level, Pjpm);
+        assert(retcode != 0);           // should never happen.
+
+        if ((JU_JPTYPE(Pjp)) < cJU_JPIMMED_1_01)                // not an Immed.
+        {
+            switch (retcode)
+            {
+            case 1: 
+            {
+                jp_t JP = *Pjp;
+                Word_t DcdP0;
+
+                DcdP0 = JU_JPDCDPOP0(Pjp) - 1;          // decrement count.
+                JU_JPSETADT(Pjp, JP.jp_Addr, DcdP0, JU_JPTYPE(&JP)); 
+                break;
+            }
+            case 2:     // collapse BranchL to single JP; see above:
+                {
+                    Pjbl_t PjblRaw = (Pjbl_t) (Pjp->jp_Addr);
+                    Pjbl_t Pjbl    = P_JBL(PjblRaw);
+
+                    *Pjp = Pjbl->jbl_jp[0];
+                    j__udyFreeJBL(PjblRaw, Pjpm);
+                    retcode = 1;
+                }
+            }
+        }
+
+        return(retcode);
+
+} // j__udyDelWalk()
+
+
+// ****************************************************************************
+// J U D Y   1   U N S E T
+// J U D Y   L   D E L
+//
+// Main entry point.  See the manual entry for details.
+
+#ifdef JUDY1
+FUNCTION int Judy1Unset 
+#else
+FUNCTION int JudyLDel
+#endif
+        (
+        PPvoid_t  PPArray,      // in which to delete.
+        Word_t    Index,        // to delete.
+        PJError_t PJError       // optional, for returning error info.
+        )
+{
+        Word_t    pop1;         // population of leaf.
+        int       offset;       // at which to delete Index.
+    JUDY1CODE(int retcode;)     // return code from Judy1Test().
+JUDYLCODE(PPvoid_t PPvalue;)  // pointer from JudyLGet().
+
+
+// CHECK FOR NULL ARRAY POINTER (error by caller):
+
+        if (PPArray == (PPvoid_t) NULL)
+        {
+            JU_SET_ERRNO(PJError, JU_ERRNO_NULLPPARRAY);
+            return(JERRI);
+        }
+
+
+// CHECK IF INDEX IS INVALID:
+//
+// If so, theres nothing to do.  This saves a lot of time.  Pass through
+// PJError, if any, from the "get" function.
+
+#ifdef JUDY1
+        if ((retcode = Judy1Test(*PPArray, Index, PJError)) == JERRI)
+            return (JERRI);
+
+        if (retcode == 0) return(0);
+#else
+        if ((PPvalue = JudyLGet(*PPArray, Index, PJError)) == PPJERR)
+            return (JERRI);
+
+        if (PPvalue == (PPvoid_t) NULL) return(0);
+#endif
+
+
+// ****************************************************************************
+// PROCESS TOP LEVEL (LEAFW) BRANCHES AND LEAVES:
+
+// ****************************************************************************
+// LEAFW LEAF, OTHER SIZE:
+//
+// Shrink or convert the leaf as necessary.  Hysteresis = 0; none is possible.
+
+        if (JU_LEAFW_POP0(*PPArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
+        {
+  JUDYLCODE(Pjv_t  Pjv;)                        // current value area.
+  JUDYLCODE(Pjv_t  Pjvnew;)                     // value area in new leaf.
+            Pjlw_t Pjlw = P_JLW(*PPArray);      // first word of leaf.
+            Pjlw_t Pjlwnew;                     // replacement leaf.
+            pop1 = Pjlw[0] + 1;                 // first word of leaf is pop0.
+
+// Delete single (last) Index from array:
+
+            if (pop1 == 1)
+            {
+                j__udyFreeJLW(Pjlw, /* pop1 = */ 1, (Pjpm_t) NULL);
+                *PPArray = (Pvoid_t) NULL;
+                return(1);
+            }
+
+// Locate Index in compressible leaf:
+
+            offset = j__udySearchLeafW(Pjlw + 1, pop1, Index);
+            assert(offset >= 0);                // Index must be valid.
+
+  JUDYLCODE(Pjv = JL_LEAFWVALUEAREA(Pjlw, pop1);)
+
+// Delete Index in-place:
+//
+// Note:  "Grow in place from pop1 - 1" is the logical inverse of, "shrink in
+// place from pop1."  Also, Pjlw points to the count word, so skip that for
+// doing the deletion.
+
+            if (JU_LEAFWGROWINPLACE(pop1 - 1))
+            {
+                JU_DELETEINPLACE(Pjlw + 1, pop1, offset, ignore);
+#ifdef JUDYL // also delete from value area:
+                JU_DELETEINPLACE(Pjv,      pop1, offset, ignore);
+#endif
+                DBGCODE(JudyCheckSorted((Pjll_t) (Pjlw + 1), pop1 - 1,
+                                        cJU_ROOTSTATE);)
+                --(Pjlw[0]);                    // decrement population.
+                DBGCODE(JudyCheckPop(*PPArray);)
+                return(1);
+            }
+
+// Allocate new leaf for use in either case below:
+
+            Pjlwnew = j__udyAllocJLW(pop1 - 1);
+            JU_CHECKALLOC(Pjlw_t, Pjlwnew, JERRI);
+
+// Shrink to smaller LEAFW:
+//
+// Note:  Skip the first word = pop0 in each leaf.
+
+            Pjlwnew[0] = (pop1 - 1) - 1;
+            JU_DELETECOPY(Pjlwnew + 1, Pjlw + 1, pop1, offset, ignore);
+
+#ifdef JUDYL // also delete from value area:
+            Pjvnew = JL_LEAFWVALUEAREA(Pjlwnew, pop1 - 1);
+            JU_DELETECOPY(Pjvnew, Pjv, pop1, offset, ignore);
+#endif
+            DBGCODE(JudyCheckSorted(Pjlwnew + 1, pop1 - 1, cJU_ROOTSTATE);)
+
+            j__udyFreeJLW(Pjlw, pop1, (Pjpm_t) NULL);
+
+////        *PPArray = (Pvoid_t)  Pjlwnew | cJU_LEAFW);
+            *PPArray = (Pvoid_t)  Pjlwnew; 
+            DBGCODE(JudyCheckPop(*PPArray);)
+            return(1);
+
+        }
+        else
+
+
+// ****************************************************************************
+// JRP BRANCH:
+//
+// Traverse through the JPM to do the deletion unless the population is small
+// enough to convert immediately to a LEAFW.
+
+        {
+            Pjpm_t Pjpm;
+            Pjp_t  Pjp;         // top-level JP to process.
+            Word_t digit;       // in a branch.
+  JUDYLCODE(Pjv_t  Pjv;)        // to value area.
+            Pjlw_t Pjlwnew;                     // replacement leaf.
+    DBGCODE(Pjlw_t Pjlwnew_orig;)
+
+            Pjpm = P_JPM(*PPArray);     // top object in array (tree).
+            Pjp  = &(Pjpm->jpm_JP);     // next object (first branch or leaf).
+
+            assert(((Pjpm->jpm_JP.jp_Type) == cJU_JPBRANCH_L)
+                || ((Pjpm->jpm_JP.jp_Type) == cJU_JPBRANCH_B)
+                || ((Pjpm->jpm_JP.jp_Type) == cJU_JPBRANCH_U));
+
+// WALK THE TREE 
+//
+// Note:  Recursive code in j__udyDelWalk() knows how to collapse a lower-level
+// BranchL containing a single JP into the parent JP as a narrow pointer, but
+// the code here cant do that for a top-level BranchL.  The result can be
+// PArray -> JPM -> BranchL containing a single JP.  This situation is
+// unavoidable because a JPM cannot contain a narrow pointer; the BranchL is
+// required in order to hold the top digit decoded, and it does not collapse to
+// a LEAFW until the population is low enough.
+//
+// TBD:  Should we add a topdigit field to JPMs so they can hold narrow
+// pointers?
+
+            if (j__udyDelWalk(Pjp, Index, cJU_ROOTSTATE, Pjpm) == -1)
+            {
+                JU_COPY_ERRNO(PJError, Pjpm);
+                return(JERRI);
+            }
+
+            --(Pjpm->jpm_Pop0); // success; decrement total population.
+
+            if ((Pjpm->jpm_Pop0 + 1) != cJU_LEAFW_MAXPOP1)
+            {
+                DBGCODE(JudyCheckPop(*PPArray);)
+                return(1);
+            }
+
+// COMPRESS A BRANCH[LBU] TO A LEAFW:
+//
+            Pjlwnew = j__udyAllocJLW(cJU_LEAFW_MAXPOP1);
+            JU_CHECKALLOC(Pjlw_t, Pjlwnew, JERRI);
+
+// Plug leaf into root pointer and set population count:
+
+////        *PPArray  = (Pvoid_t) ((Word_t) Pjlwnew | cJU_LEAFW);
+            *PPArray  = (Pvoid_t) Pjlwnew;
+#ifdef JUDYL // prepare value area:
+            Pjv = JL_LEAFWVALUEAREA(Pjlwnew, cJU_LEAFW_MAXPOP1);
+#endif
+            *Pjlwnew++ = cJU_LEAFW_MAXPOP1 - 1; // set pop0.
+            DBGCODE(Pjlwnew_orig = Pjlwnew;)
+
+            switch (JU_JPTYPE(Pjp))
+            {
+
+// JPBRANCH_L:  Copy each JPs indexes to the new LEAFW and free the old
+// branch:
+
+            case cJU_JPBRANCH_L:
+            {
+                Pjbl_t PjblRaw = (Pjbl_t) (Pjp->jp_Addr);
+                Pjbl_t Pjbl    = P_JBL(PjblRaw);
+
+                for (offset = 0; offset < Pjbl->jbl_NumJPs; ++offset)
+                {
+                    pop1 = j__udyLeafM1ToLeafW(Pjlwnew, JU_PVALUEPASS
+                             (Pjbl->jbl_jp) + offset,
+                             JU_DIGITTOSTATE(Pjbl->jbl_Expanse[offset],
+                                             cJU_BYTESPERWORD),
+                             (Pvoid_t) Pjpm);
+                    Pjlwnew += pop1;            // advance through indexes.
+          JUDYLCODE(Pjv     += pop1;)           // advance through values.
+                }
+                j__udyFreeJBL(PjblRaw, Pjpm);
+
+                assert(Pjlwnew == Pjlwnew_orig + cJU_LEAFW_MAXPOP1);
+                break;                  // delete Index from new LEAFW.
+            }
+
+// JPBRANCH_B:  Copy each JPs indexes to the new LEAFW and free the old
+// branch, including each JP subarray:
+
+            case cJU_JPBRANCH_B:
+            {
+                Pjbb_t    PjbbRaw = (Pjbb_t) (Pjp->jp_Addr);
+                Pjbb_t    Pjbb    = P_JBB(PjbbRaw);
+                Word_t    subexp;       // current subexpanse number.
+                BITMAPB_t bitmap;       // portion for this subexpanse.
+                Pjp_t     Pjp2Raw;      // one subexpanses subarray.
+                Pjp_t     Pjp2;
+
+                for (subexp = 0; subexp < cJU_NUMSUBEXPB; ++subexp)
+                {
+                    if ((bitmap = JU_JBB_BITMAP(Pjbb, subexp)) == 0)
+                        continue;               // skip empty subexpanse.
+
+                    digit   = subexp * cJU_BITSPERSUBEXPB;
+                    Pjp2Raw = JU_JBB_PJP(Pjbb, subexp);
+                    Pjp2    = P_JP(Pjp2Raw);
+                    assert(Pjp2 != (Pjp_t) NULL);
+
+// Walk through bits for all possible sub-subexpanses (digits); increment
+// offset for each populated subexpanse; until no more set bits:
+
+                    for (offset = 0; bitmap != 0; bitmap >>= 1, ++digit)
+                    {
+                        if (! (bitmap & 1))     // skip empty sub-subexpanse.
+                            continue;
+
+                        pop1 = j__udyLeafM1ToLeafW(Pjlwnew, JU_PVALUEPASS
+                                 Pjp2 + offset,
+                                 JU_DIGITTOSTATE(digit, cJU_BYTESPERWORD),
+                                 (Pvoid_t) Pjpm);
+                        Pjlwnew += pop1;         // advance through indexes.
+              JUDYLCODE(Pjv     += pop1;)        // advance through values.
+                        ++offset;
+                    }
+                    j__udyFreeJBBJP(Pjp2Raw, /* pop1 = */ offset, Pjpm);
+                }
+                j__udyFreeJBB(PjbbRaw, Pjpm);
+
+                assert(Pjlwnew == Pjlwnew_orig + cJU_LEAFW_MAXPOP1);
+                break;                  // delete Index from new LEAFW.
+
+            } // case cJU_JPBRANCH_B.
+
+
+// JPBRANCH_U:  Copy each JPs indexes to the new LEAFW and free the old
+// branch:
+
+            case cJU_JPBRANCH_U:
+            {
+                Pjbu_t  PjbuRaw = (Pjbu_t) (Pjp->jp_Addr);
+                Pjbu_t  Pjbu    = P_JBU(PjbuRaw);
+                Word_t  ldigit;         // larger than uint8_t.
+
+                for (Pjp = Pjbu->jbu_jp, ldigit = 0;
+                     ldigit < cJU_BRANCHUNUMJPS;
+                     ++Pjp, ++ldigit)
+                {
+
+// Shortcuts, to save a little time for possibly big branches:
+
+                    if ((JU_JPTYPE(Pjp)) == cJU_JPNULLMAX)  // skip null JP.
+                        continue;
+
+// TBD:  Should the following shortcut also be used in BranchL and BranchB
+// code?
+
+#ifndef JU_64BIT
+                    if ((JU_JPTYPE(Pjp)) == cJU_JPIMMED_3_01)
+#else
+                    if ((JU_JPTYPE(Pjp)) == cJU_JPIMMED_7_01)
+#endif
+                    {                                   // single Immed:
+                        *Pjlwnew++ = JU_DIGITTOSTATE(ldigit, cJU_BYTESPERWORD)
+                                   | JU_JPDCDPOP0(Pjp); // rebuild Index.
+#ifdef JUDYL
+                        *Pjv++ = Pjp->jp_Addr;  // copy value area.
+#endif
+                        continue;
+                    }
+
+                    pop1 = j__udyLeafM1ToLeafW(Pjlwnew, JU_PVALUEPASS
+                             Pjp, JU_DIGITTOSTATE(ldigit, cJU_BYTESPERWORD),
+                             (Pvoid_t) Pjpm);
+                    Pjlwnew += pop1;            // advance through indexes.
+          JUDYLCODE(Pjv     += pop1;)           // advance through values.
+                }
+                j__udyFreeJBU(PjbuRaw, Pjpm);
+
+                assert(Pjlwnew == Pjlwnew_orig + cJU_LEAFW_MAXPOP1);
+                break;                  // delete Index from new LEAFW.
+
+            } // case cJU_JPBRANCH_U.
+
+
+// INVALID JP TYPE in jpm_t struct
+
+            default: JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT);
+                     return(JERRI);
+
+            } // end switch on sub-JP type.
+
+            DBGCODE(JudyCheckSorted((Pjll_t) Pjlwnew_orig, cJU_LEAFW_MAXPOP1,
+                                    cJU_ROOTSTATE);)
+
+// FREE JPM (no longer needed):
+
+            j__udyFreeJPM(Pjpm, (Pjpm_t) NULL);
+            DBGCODE(JudyCheckPop(*PPArray);)
+            return(1);
+
+        } 
+        /*NOTREACHED*/
+
+} // Judy1Unset() / JudyLDel()
diff --git a/libs/klib/judy/JudyFirst.c b/libs/klib/judy/JudyFirst.c
new file mode 100644
index 0000000..91533a9
--- /dev/null
+++ b/libs/klib/judy/JudyFirst.c
@@ -0,0 +1,211 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Judy*First[Empty]() and Judy*Last[Empty]() routines for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+//
+// These are inclusive versions of Judy*Next[Empty]() and Judy*Prev[Empty]().
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+
+// ****************************************************************************
+// J U D Y   1   F I R S T
+// J U D Y   L   F I R S T
+//
+// See the manual entry for details.
+
+#ifdef JUDY1
+FUNCTION int	  Judy1First
+#else
+FUNCTION PPvoid_t JudyLFirst
+#endif
+        (
+	Pcvoid_t  PArray,	// Judy array to search.
+	Word_t *  PIndex,	// starting point and result.
+	PJError_t PJError	// optional, for returning error info.
+        )
+{
+        if (PIndex == (PWord_t) NULL)		// caller error:
+	{
+	    JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+	    JUDY1CODE(return(JERRI );)
+	    JUDYLCODE(return(PPJERR);)
+	}
+
+#ifdef JUDY1
+	switch (Judy1Test(PArray, *PIndex, PJError))
+	{
+	case 1:	 return(1);			// found *PIndex itself.
+	case 0:  return(Judy1Next(PArray, PIndex, PJError));
+	default: return(JERRI);
+	}
+#else
+	{
+	    PPvoid_t PValue;
+
+	    if ((PValue = JudyLGet(PArray, *PIndex, PJError)) == PPJERR)
+		return(PPJERR);
+
+	    if (PValue != (PPvoid_t) NULL) return(PValue);  // found *PIndex.
+
+	    return(JudyLNext(PArray, PIndex, PJError));
+	}
+#endif
+
+} // Judy1First() / JudyLFirst()
+
+
+// ****************************************************************************
+// J U D Y   1   L A S T
+// J U D Y   L   L A S T
+//
+// See the manual entry for details.
+
+#ifdef JUDY1
+FUNCTION int	  Judy1Last(
+#else
+FUNCTION PPvoid_t JudyLLast(
+#endif
+	Pcvoid_t  PArray,	// Judy array to search.
+	Word_t *  PIndex,	// starting point and result.
+	PJError_t PJError)	// optional, for returning error info.
+{
+        if (PIndex == (PWord_t) NULL)
+	{
+	    JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);	 // caller error.
+	    JUDY1CODE(return(JERRI );)
+	    JUDYLCODE(return(PPJERR);)
+	}
+
+#ifdef JUDY1
+	switch (Judy1Test(PArray, *PIndex, PJError))
+	{
+	case 1:	 return(1);			// found *PIndex itself.
+	case 0:  return(Judy1Prev(PArray, PIndex, PJError));
+	default: return(JERRI);
+	}
+#else
+	{
+	    PPvoid_t PValue;
+
+	    if ((PValue = JudyLGet(PArray, *PIndex, PJError)) == PPJERR)
+		return(PPJERR);
+
+	    if (PValue != (PPvoid_t) NULL) return(PValue);  // found *PIndex.
+
+	    return(JudyLPrev(PArray, PIndex, PJError));
+	}
+#endif
+
+} // Judy1Last() / JudyLLast()
+
+
+// ****************************************************************************
+// J U D Y   1   F I R S T   E M P T Y
+// J U D Y   L   F I R S T   E M P T Y
+//
+// See the manual entry for details.
+
+#ifdef JUDY1
+FUNCTION int Judy1FirstEmpty(
+#else
+FUNCTION int JudyLFirstEmpty(
+#endif
+	Pcvoid_t  PArray,	// Judy array to search.
+	Word_t *  PIndex,	// starting point and result.
+	PJError_t PJError)	// optional, for returning error info.
+{
+        if (PIndex == (PWord_t) NULL)		// caller error:
+	{
+	    JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+	    return(JERRI);
+	}
+
+#ifdef JUDY1
+	switch (Judy1Test(PArray, *PIndex, PJError))
+	{
+	case 0:	 return(1);			// found *PIndex itself.
+	case 1:  return(Judy1NextEmpty(PArray, PIndex, PJError));
+	default: return(JERRI);
+	}
+#else
+	{
+	    PPvoid_t PValue;
+
+	    if ((PValue = JudyLGet(PArray, *PIndex, PJError)) == PPJERR)
+		return(JERRI);
+
+	    if (PValue == (PPvoid_t) NULL) return(1);	// found *PIndex.
+
+	    return(JudyLNextEmpty(PArray, PIndex, PJError));
+	}
+#endif
+
+} // Judy1FirstEmpty() / JudyLFirstEmpty()
+
+
+// ****************************************************************************
+// J U D Y   1   L A S T   E M P T Y
+// J U D Y   L   L A S T   E M P T Y
+//
+// See the manual entry for details.
+
+#ifdef JUDY1
+FUNCTION int Judy1LastEmpty(
+#else
+FUNCTION int JudyLLastEmpty(
+#endif
+	Pcvoid_t  PArray,	// Judy array to search.
+	Word_t *  PIndex,	// starting point and result.
+	PJError_t PJError)	// optional, for returning error info.
+{
+        if (PIndex == (PWord_t) NULL)
+	{
+	    JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);	 // caller error.
+	    return(JERRI);
+	}
+
+#ifdef JUDY1
+	switch (Judy1Test(PArray, *PIndex, PJError))
+	{
+	case 0:	 return(1);			// found *PIndex itself.
+	case 1:  return(Judy1PrevEmpty(PArray, PIndex, PJError));
+	default: return(JERRI);
+	}
+#else
+	{
+	    PPvoid_t PValue;
+
+	    if ((PValue = JudyLGet(PArray, *PIndex, PJError)) == PPJERR)
+		return(JERRI);
+
+	    if (PValue == (PPvoid_t) NULL) return(1);	// found *PIndex.
+
+	    return(JudyLPrevEmpty(PArray, PIndex, PJError));
+	}
+#endif
+
+} // Judy1LastEmpty() / JudyLLastEmpty()
diff --git a/libs/klib/judy/JudyFreeArray.c b/libs/klib/judy/JudyFreeArray.c
new file mode 100644
index 0000000..0145479
--- /dev/null
+++ b/libs/klib/judy/JudyFreeArray.c
@@ -0,0 +1,361 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Judy1FreeArray() and JudyLFreeArray() functions for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+// Return the number of bytes freed from the array.
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+DBGCODE(extern void JudyCheckPop(Pvoid_t PArray);)
+
+
+// ****************************************************************************
+// J U D Y   1   F R E E   A R R A Y
+// J U D Y   L   F R E E   A R R A Y
+//
+// See the Judy*(3C) manual entry for details.
+//
+// This code is written recursively, at least at first, because thats much
+// simpler.  Hope its fast enough.
+
+#ifdef JUDY1
+FUNCTION Word_t Judy1FreeArray
+#else
+FUNCTION Word_t JudyLFreeArray
+#endif
+        (
+	PPvoid_t  PPArray,	// array to free.
+	PJError_t PJError	// optional, for returning error info.
+        )
+{
+	jpm_t	  jpm;		// local to accumulate free statistics.
+
+// CHECK FOR NULL POINTER (error by caller):
+
+	if (PPArray == (PPvoid_t) NULL)
+	{
+	    JU_SET_ERRNO(PJError, JU_ERRNO_NULLPPARRAY);
+	    return(JERR);
+	}
+
+	DBGCODE(JudyCheckPop(*PPArray);)
+
+// Zero jpm.jpm_Pop0 (meaning the array will be empty in a moment) for accurate
+// logging in TRACEMI2.
+
+	jpm.jpm_Pop0	      = 0;		// see above.
+	jpm.jpm_TotalMemWords = 0;		// initialize memory freed.
+
+// 	Empty array:
+
+	if (P_JLW(*PPArray) == (Pjlw_t) NULL) return(0);
+
+// PROCESS TOP LEVEL "JRP" BRANCHES AND LEAF:
+
+	if (JU_LEAFW_POP0(*PPArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
+	{
+	    Pjlw_t Pjlw = P_JLW(*PPArray);	// first word of leaf.
+
+	    j__udyFreeJLW(Pjlw, Pjlw[0] + 1, &jpm);
+	    *PPArray = (Pvoid_t) NULL;		// make an empty array.
+	    return (-(jpm.jpm_TotalMemWords * cJU_BYTESPERWORD));  // see above.
+	}
+	else
+
+// Rootstate leaves:  just free the leaf:
+
+// Common code for returning the amount of memory freed.
+//
+// Note:  In a an ordinary LEAFW, pop0 = *PPArray[0].
+//
+// Accumulate (negative) words freed, while freeing objects.
+// Return the positive bytes freed.
+
+	{
+	    Pjpm_t Pjpm	    = P_JPM(*PPArray);
+	    Word_t TotalMem = Pjpm->jpm_TotalMemWords;
+
+	    j__udyFreeSM(&(Pjpm->jpm_JP), &jpm);  // recurse through tree.
+	    j__udyFreeJPM(Pjpm, &jpm);
+
+// Verify the array was not corrupt.  This means that amount of memory freed
+// (which is negative) is equal to the initial amount:
+
+	    if (TotalMem + jpm.jpm_TotalMemWords)
+	    {
+		JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		return(JERR);
+	    }
+
+	    *PPArray = (Pvoid_t) NULL;		// make an empty array.
+	    return (TotalMem * cJU_BYTESPERWORD);
+	}
+
+} // Judy1FreeArray() / JudyLFreeArray()
+
+
+// ****************************************************************************
+// __ J U D Y   F R E E   S M
+//
+// Given a pointer to a JP, recursively visit and free (depth first) all nodes
+// in a Judy array BELOW the JP, but not the JP itself.  Accumulate in *Pjpm
+// the total words freed (as a negative value).  "SM" = State Machine.
+//
+// Note:  Corruption is not detected at this level because during a FreeArray,
+// if the code hasnt already core dumped, its better to remain silent, even
+// if some memory has not been freed, than to bother the caller about the
+// corruption.  TBD:  Is this true?  If not, must list all legitimate JPNULL
+// and JPIMMED above first, and revert to returning bool_t (see 4.34).
+
+FUNCTION void j__udyFreeSM(
+	Pjp_t	Pjp,		// top of Judy (top-state).
+	Pjpm_t	Pjpm)		// to return words freed.
+{
+	Word_t	Pop1;
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+#ifdef JUDY1
+
+// FULL EXPANSE -- nothing to free  for this jp_Type.
+
+	case cJ1_JPFULLPOPU1:
+	    break;
+#endif
+
+// JUDY BRANCH -- free the sub-tree depth first:
+
+// LINEAR BRANCH -- visit each JP in the JBLs list, then free the JBL:
+//
+// Note:  There are no null JPs in a JBL.
+
+	case cJU_JPBRANCH_L:
+	case cJU_JPBRANCH_L2:
+	case cJU_JPBRANCH_L3:
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_L4:
+	case cJU_JPBRANCH_L5:
+	case cJU_JPBRANCH_L6:
+	case cJU_JPBRANCH_L7:
+#endif // JU_64BIT
+	{
+	    Pjbl_t Pjbl = P_JBL(Pjp->jp_Addr);
+	    Word_t offset;
+
+	    for (offset = 0; offset < Pjbl->jbl_NumJPs; ++offset)
+	        j__udyFreeSM((Pjbl->jbl_jp) + offset, Pjpm);
+
+	    j__udyFreeJBL((Pjbl_t) (Pjp->jp_Addr), Pjpm);
+	    break;
+	}
+
+
+// BITMAP BRANCH -- visit each JP in the JBBs list based on the bitmap, also
+//
+// Note:  There are no null JPs in a JBB.
+
+	case cJU_JPBRANCH_B:
+	case cJU_JPBRANCH_B2:
+	case cJU_JPBRANCH_B3:
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_B4:
+	case cJU_JPBRANCH_B5:
+	case cJU_JPBRANCH_B6:
+	case cJU_JPBRANCH_B7:
+#endif // JU_64BIT
+	{
+	    Word_t subexp;
+	    Word_t offset;
+	    Word_t jpcount;
+
+	    Pjbb_t Pjbb = P_JBB(Pjp->jp_Addr);
+
+	    for (subexp = 0; subexp < cJU_NUMSUBEXPB; ++subexp)
+	    {
+	        jpcount = j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, subexp));
+
+	        if (jpcount)
+	        {
+		    for (offset = 0; offset < jpcount; ++offset)
+		    {
+		       j__udyFreeSM(P_JP(JU_JBB_PJP(Pjbb, subexp)) + offset,
+				    Pjpm);
+		    }
+		    j__udyFreeJBBJP(JU_JBB_PJP(Pjbb, subexp), jpcount, Pjpm);
+	        }
+	    }
+	    j__udyFreeJBB((Pjbb_t) (Pjp->jp_Addr), Pjpm);
+
+	    break;
+	}
+
+
+// UNCOMPRESSED BRANCH -- visit each JP in the JBU array, then free the JBU
+// itself:
+//
+// Note:  Null JPs are handled during recursion at a lower state.
+
+	case cJU_JPBRANCH_U:
+	case cJU_JPBRANCH_U2:
+	case cJU_JPBRANCH_U3:
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_U4:
+	case cJU_JPBRANCH_U5:
+	case cJU_JPBRANCH_U6:
+	case cJU_JPBRANCH_U7:
+#endif // JU_64BIT
+	{
+	    Word_t offset;
+	    Pjbu_t Pjbu = P_JBU(Pjp->jp_Addr);
+
+	    for (offset = 0; offset < cJU_BRANCHUNUMJPS; ++offset)
+	        j__udyFreeSM((Pjbu->jbu_jp) + offset, Pjpm);
+
+	    j__udyFreeJBU((Pjbu_t) (Pjp->jp_Addr), Pjpm);
+	    break;
+	}
+
+
+// -- Cases below here terminate and do not recurse. --
+
+
+// LINEAR LEAF -- just free the leaf; size is computed from jp_Type:
+//
+// Note:  cJU_JPLEAF1 is a special case, see discussion in ../Judy1/Judy1.h
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+	case cJU_JPLEAF1:
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+	    j__udyFreeJLL1((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    break;
+#endif
+
+	case cJU_JPLEAF2:
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+	    j__udyFreeJLL2((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    break;
+
+	case cJU_JPLEAF3:
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+	    j__udyFreeJLL3((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    break;
+
+#ifdef JU_64BIT
+	case cJU_JPLEAF4:
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+	    j__udyFreeJLL4((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    break;
+
+	case cJU_JPLEAF5:
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+	    j__udyFreeJLL5((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    break;
+
+	case cJU_JPLEAF6:
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+	    j__udyFreeJLL6((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    break;
+
+	case cJU_JPLEAF7:
+	    Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+	    j__udyFreeJLL7((Pjll_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    break;
+#endif // JU_64BIT
+
+
+// BITMAP LEAF -- free sub-expanse arrays of JPs, then free the JBB.
+
+	case cJU_JPLEAF_B1:
+	{
+#ifdef JUDYL
+	    Word_t subexp;
+	    Word_t jpcount;
+	    Pjlb_t Pjlb = P_JLB(Pjp->jp_Addr);
+
+// Free the value areas in the bitmap leaf:
+
+	    for (subexp = 0; subexp < cJU_NUMSUBEXPL; ++subexp)
+	    {
+	        jpcount = j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, subexp));
+
+	        if (jpcount)
+		    j__udyLFreeJV(JL_JLB_PVALUE(Pjlb, subexp), jpcount, Pjpm);
+	    }
+#endif // JUDYL
+
+	    j__udyFreeJLB1((Pjlb_t) (Pjp->jp_Addr), Pjpm);
+	    break;
+
+	} // case cJU_JPLEAF_B1
+
+#ifdef JUDYL
+
+
+// IMMED*:
+//
+// For JUDYL, all non JPIMMED_*_01s have a LeafV which must be freed:
+
+	case cJU_JPIMMED_1_02:
+	case cJU_JPIMMED_1_03:
+#ifdef JU_64BIT
+	case cJU_JPIMMED_1_04:
+	case cJU_JPIMMED_1_05:
+	case cJU_JPIMMED_1_06:
+	case cJU_JPIMMED_1_07:
+#endif
+	    Pop1 = JU_JPTYPE(Pjp) - cJU_JPIMMED_1_02 + 2;
+	    j__udyLFreeJV((Pjv_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    break;
+
+#ifdef JU_64BIT
+	case cJU_JPIMMED_2_02:
+	case cJU_JPIMMED_2_03:
+
+	    Pop1 = JU_JPTYPE(Pjp) - cJU_JPIMMED_2_02 + 2;
+	    j__udyLFreeJV((Pjv_t) (Pjp->jp_Addr), Pop1, Pjpm);
+	    break;
+
+	case cJU_JPIMMED_3_02:
+	    j__udyLFreeJV((Pjv_t) (Pjp->jp_Addr), 2, Pjpm);
+	    break;
+
+#endif // JU_64BIT
+#endif // JUDYL
+
+
+// OTHER JPNULL, JPIMMED, OR UNEXPECTED TYPE -- nothing to free for this type:
+//
+// Note:  Lump together no-op and invalid JP types; see function header
+// comments.
+
+	default: break;
+
+	} // switch (JU_JPTYPE(Pjp))
+
+} // j__udyFreeSM()
diff --git a/libs/klib/judy/JudyGet.c b/libs/klib/judy/JudyGet.c
new file mode 100644
index 0000000..5071a3f
--- /dev/null
+++ b/libs/klib/judy/JudyGet.c
@@ -0,0 +1,1092 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Judy1Test() and JudyLGet() functions for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+#ifdef TRACEJPR                 // different macro name, for "retrieval" only.
+#include "JudyPrintJP.c"
+#endif
+
+
+// ****************************************************************************
+// J U D Y   1   T E S T
+// J U D Y   L   G E T
+//
+// See the manual entry for details.  Note support for "shortcut" entries to
+// trees known to start with a JPM.
+
+#ifdef JUDY1
+
+#ifdef JUDYGETINLINE
+FUNCTION int j__udy1Test
+#else
+FUNCTION int Judy1Test
+#endif
+
+#else  // JUDYL
+
+#ifdef JUDYGETINLINE
+FUNCTION PPvoid_t j__udyLGet
+#else
+FUNCTION PPvoid_t JudyLGet
+#endif
+
+#endif // JUDYL
+        (
+#ifdef JUDYGETINLINE
+        Pvoid_t   PArray,       // from which to retrieve.
+        Word_t    Index         // to retrieve.
+#else
+        Pcvoid_t  PArray,       // from which to retrieve.
+        Word_t    Index,        // to retrieve.
+        PJError_t PJError       // optional, for returning error info.
+#endif
+        )
+{
+        Pjp_t     Pjp;          // current JP while walking the tree.
+        Pjpm_t    Pjpm;         // for global accounting.
+        uint8_t   Digit;        // byte just decoded from Index.
+        Word_t    Pop1;         // leaf population (number of indexes).
+        Pjll_t    Pjll;         // pointer to LeafL.
+        DBGCODE(uint8_t ParentJPType;)
+
+#ifndef JUDYGETINLINE
+
+        if (PArray == (Pcvoid_t) NULL)  // empty array.
+        {
+  JUDY1CODE(return(0);)
+  JUDYLCODE(return((PPvoid_t) NULL);)
+        }
+
+// ****************************************************************************
+// PROCESS TOP LEVEL BRANCHES AND LEAF:
+
+        if (JU_LEAFW_POP0(PArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
+        {
+            Pjlw_t Pjlw = P_JLW(PArray);        // first word of leaf.
+            int    posidx;                      // signed offset in leaf.
+
+            Pop1   = Pjlw[0] + 1;
+            posidx = j__udySearchLeafW(Pjlw + 1, Pop1, Index);
+
+            if (posidx >= 0)
+            {
+      JUDY1CODE(return(1);)
+      JUDYLCODE(return((PPvoid_t) (JL_LEAFWVALUEAREA(Pjlw, Pop1) + posidx));)
+            }
+  JUDY1CODE(return(0);)
+  JUDYLCODE(return((PPvoid_t) NULL);)
+        }
+
+#endif // ! JUDYGETINLINE
+
+        Pjpm = P_JPM(PArray);
+        Pjp = &(Pjpm->jpm_JP);  // top branch is below JPM.
+
+// ****************************************************************************
+// WALK THE JUDY TREE USING A STATE MACHINE:
+
+ContinueWalk:           // for going down one level; come here with Pjp set.
+
+#ifdef TRACEJPR
+        JudyPrintJP(Pjp, "g", __LINE__);
+#endif
+        switch (JU_JPTYPE(Pjp))
+        {
+
+// Ensure the switch table starts at 0 for speed; otherwise more code is
+// executed:
+
+        case 0: goto ReturnCorrupt;     // save a little code.
+
+
+// ****************************************************************************
+// JPNULL*:
+//
+// Note:  These are legitimate in a BranchU (only) and do not constitute a
+// fault.
+
+        case cJU_JPNULL1:
+        case cJU_JPNULL2:
+        case cJU_JPNULL3:
+#ifdef JU_64BIT
+        case cJU_JPNULL4:
+        case cJU_JPNULL5:
+        case cJU_JPNULL6:
+        case cJU_JPNULL7:
+#endif
+            assert(ParentJPType >= cJU_JPBRANCH_U2);
+            assert(ParentJPType <= cJU_JPBRANCH_U);
+      JUDY1CODE(return(0);)
+      JUDYLCODE(return((PPvoid_t) NULL);)
+
+
+// ****************************************************************************
+// JPBRANCH_L*:
+//
+// Note:  The use of JU_DCDNOTMATCHINDEX() in branches is not strictly
+// required,since this can be done at leaf level, but it costs nothing to do it
+// sooner, and it aborts an unnecessary traversal sooner.
+
+        case cJU_JPBRANCH_L2:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 2)) break;
+            Digit = JU_DIGITATSTATE(Index, 2);
+            goto JudyBranchL;
+
+        case cJU_JPBRANCH_L3:
+
+#ifdef JU_64BIT // otherwise its a no-op:
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 3)) break;
+#endif
+            Digit = JU_DIGITATSTATE(Index, 3);
+            goto JudyBranchL;
+
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_L4:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 4)) break;
+            Digit = JU_DIGITATSTATE(Index, 4);
+            goto JudyBranchL;
+
+        case cJU_JPBRANCH_L5:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 5)) break;
+            Digit = JU_DIGITATSTATE(Index, 5);
+            goto JudyBranchL;
+
+        case cJU_JPBRANCH_L6:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 6)) break;
+            Digit = JU_DIGITATSTATE(Index, 6);
+            goto JudyBranchL;
+
+        case cJU_JPBRANCH_L7:
+
+            // JU_DCDNOTMATCHINDEX() would be a no-op.
+            Digit = JU_DIGITATSTATE(Index, 7);
+            goto JudyBranchL;
+
+#endif // JU_64BIT
+
+        case cJU_JPBRANCH_L:
+        {
+            Pjbl_t Pjbl;
+            int    posidx;
+
+            Digit = JU_DIGITATSTATE(Index, cJU_ROOTSTATE);
+
+// Common code for all BranchLs; come here with Digit set:
+
+JudyBranchL:
+            Pjbl = P_JBL(Pjp->jp_Addr);
+
+            posidx = 0;
+
+            do {
+                if (Pjbl->jbl_Expanse[posidx] == Digit)
+                {                       // found Digit; continue traversal:
+                    DBGCODE(ParentJPType = JU_JPTYPE(Pjp);)
+                    Pjp = Pjbl->jbl_jp + posidx;
+                    goto ContinueWalk;
+                }
+            } while (++posidx != Pjbl->jbl_NumJPs);
+
+            break;
+        }
+
+
+// ****************************************************************************
+// JPBRANCH_B*:
+
+        case cJU_JPBRANCH_B2:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 2)) break;
+            Digit = JU_DIGITATSTATE(Index, 2);
+            goto JudyBranchB;
+
+        case cJU_JPBRANCH_B3:
+
+#ifdef JU_64BIT // otherwise its a no-op:
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 3)) break;
+#endif
+            Digit = JU_DIGITATSTATE(Index, 3);
+            goto JudyBranchB;
+
+
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_B4:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 4)) break;
+            Digit = JU_DIGITATSTATE(Index, 4);
+            goto JudyBranchB;
+
+        case cJU_JPBRANCH_B5:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 5)) break;
+            Digit = JU_DIGITATSTATE(Index, 5);
+            goto JudyBranchB;
+
+        case cJU_JPBRANCH_B6:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 6)) break;
+            Digit = JU_DIGITATSTATE(Index, 6);
+            goto JudyBranchB;
+
+        case cJU_JPBRANCH_B7:
+
+            // JU_DCDNOTMATCHINDEX() would be a no-op.
+            Digit = JU_DIGITATSTATE(Index, 7);
+            goto JudyBranchB;
+
+#endif // JU_64BIT
+
+        case cJU_JPBRANCH_B:
+        {
+            Pjbb_t    Pjbb;
+            Word_t    subexp;   // in bitmap, 0..7.
+            BITMAPB_t BitMap;   // for one subexpanse.
+            BITMAPB_t BitMask;  // bit in BitMap for Indexs Digit.
+
+            Digit = JU_DIGITATSTATE(Index, cJU_ROOTSTATE);
+
+// Common code for all BranchBs; come here with Digit set:
+
+JudyBranchB:
+            DBGCODE(ParentJPType = JU_JPTYPE(Pjp);)
+            Pjbb   = P_JBB(Pjp->jp_Addr);
+            subexp = Digit / cJU_BITSPERSUBEXPB;
+
+            BitMap = JU_JBB_BITMAP(Pjbb, subexp);
+            Pjp    = P_JP(JU_JBB_PJP(Pjbb, subexp));
+
+            BitMask = JU_BITPOSMASKB(Digit);
+
+// No JP in subexpanse for Index => Index not found:
+
+            if (! (BitMap & BitMask)) break;
+
+// Count JPs in the subexpanse below the one for Index:
+
+            Pjp += j__udyCountBitsB(BitMap & (BitMask - 1));
+
+            goto ContinueWalk;
+
+        } // case cJU_JPBRANCH_B*
+
+
+// ****************************************************************************
+// JPBRANCH_U*:
+//
+// Notice the reverse order of the cases, and falling through to the next case,
+// for performance.
+
+        case cJU_JPBRANCH_U:
+
+            DBGCODE(ParentJPType = JU_JPTYPE(Pjp);)
+            Pjp = JU_JBU_PJP(Pjp, Index, cJU_ROOTSTATE);
+
+// If not a BranchU, traverse; otherwise fall into the next case, which makes
+// this very fast code for a large Judy array (mainly BranchUs), especially
+// when branches are already in the cache, such as for prev/next:
+
+#ifndef JU_64BIT
+            if (JU_JPTYPE(Pjp) != cJU_JPBRANCH_U3) goto ContinueWalk;
+#else
+            if (JU_JPTYPE(Pjp) != cJU_JPBRANCH_U7) goto ContinueWalk;
+#endif
+
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_U7:
+
+            // JU_DCDNOTMATCHINDEX() would be a no-op.
+            DBGCODE(ParentJPType = JU_JPTYPE(Pjp);)
+            Pjp = JU_JBU_PJP(Pjp, Index, 7);
+
+            if (JU_JPTYPE(Pjp) != cJU_JPBRANCH_U6) goto ContinueWalk;
+            // and fall through.
+
+        case cJU_JPBRANCH_U6:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 6)) break;
+            DBGCODE(ParentJPType = JU_JPTYPE(Pjp);)
+            Pjp = JU_JBU_PJP(Pjp, Index, 6);
+
+            if (JU_JPTYPE(Pjp) != cJU_JPBRANCH_U5) goto ContinueWalk;
+            // and fall through.
+
+        case cJU_JPBRANCH_U5:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 5)) break;
+            DBGCODE(ParentJPType = JU_JPTYPE(Pjp);)
+            Pjp = JU_JBU_PJP(Pjp, Index, 5);
+
+            if (JU_JPTYPE(Pjp) != cJU_JPBRANCH_U4) goto ContinueWalk;
+            // and fall through.
+
+        case cJU_JPBRANCH_U4:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 4)) break;
+            DBGCODE(ParentJPType = JU_JPTYPE(Pjp);)
+            Pjp = JU_JBU_PJP(Pjp, Index, 4);
+
+            if (JU_JPTYPE(Pjp) != cJU_JPBRANCH_U3) goto ContinueWalk;
+            // and fall through.
+
+#endif // JU_64BIT
+
+        case cJU_JPBRANCH_U3:
+
+#ifdef JU_64BIT // otherwise its a no-op:
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 3)) break;
+#endif
+            DBGCODE(ParentJPType = JU_JPTYPE(Pjp);)
+            Pjp = JU_JBU_PJP(Pjp, Index, 3);
+
+            if (JU_JPTYPE(Pjp) != cJU_JPBRANCH_U2) goto ContinueWalk;
+            // and fall through.
+
+        case cJU_JPBRANCH_U2:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 2)) break;
+            DBGCODE(ParentJPType = JU_JPTYPE(Pjp);)
+            Pjp = JU_JBU_PJP(Pjp, Index, 2);
+
+// Note:  BranchU2 is a special case that must continue traversal to a leaf,
+// immed, full, or null type:
+
+            goto ContinueWalk;
+
+
+// ****************************************************************************
+// JPLEAF*:
+//
+// Note:  Here the calls of JU_DCDNOTMATCHINDEX() are necessary and check
+// whether Index is out of the expanse of a narrow pointer.
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+
+        case cJU_JPLEAF1:
+        {
+            int posidx;         // signed offset in leaf.
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 1)) break;
+
+            Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+            Pjll = P_JLL(Pjp->jp_Addr);
+
+            if ((posidx = j__udySearchLeaf1(Pjll, Pop1, Index)) < 0) break;
+
+  JUDY1CODE(return(1);)
+  JUDYLCODE(return((PPvoid_t) (JL_LEAF1VALUEAREA(Pjll, Pop1) + posidx));)
+        }
+
+#endif // (JUDYL || (! JU_64BIT))
+
+        case cJU_JPLEAF2:
+        {
+            int posidx;         // signed offset in leaf.
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 2)) break;
+
+            Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+            Pjll = P_JLL(Pjp->jp_Addr);
+
+            if ((posidx = j__udySearchLeaf2(Pjll, Pop1, Index)) < 0) break;
+
+  JUDY1CODE(return(1);)
+  JUDYLCODE(return((PPvoid_t) (JL_LEAF2VALUEAREA(Pjll, Pop1) + posidx));)
+        }
+        case cJU_JPLEAF3:
+        {
+            int posidx;         // signed offset in leaf.
+
+#ifdef JU_64BIT // otherwise its a no-op:
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 3)) break;
+#endif
+
+            Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+            Pjll = P_JLL(Pjp->jp_Addr);
+
+            if ((posidx = j__udySearchLeaf3(Pjll, Pop1, Index)) < 0) break;
+
+  JUDY1CODE(return(1);)
+  JUDYLCODE(return((PPvoid_t) (JL_LEAF3VALUEAREA(Pjll, Pop1) + posidx));)
+        }
+#ifdef JU_64BIT
+        case cJU_JPLEAF4:
+        {
+            int posidx;         // signed offset in leaf.
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 4)) break;
+
+            Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+            Pjll = P_JLL(Pjp->jp_Addr);
+
+            if ((posidx = j__udySearchLeaf4(Pjll, Pop1, Index)) < 0) break;
+
+  JUDY1CODE(return(1);)
+  JUDYLCODE(return((PPvoid_t) (JL_LEAF4VALUEAREA(Pjll, Pop1) + posidx));)
+        }
+        case cJU_JPLEAF5:
+        {
+            int posidx;         // signed offset in leaf.
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 5)) break;
+
+            Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+            Pjll = P_JLL(Pjp->jp_Addr);
+
+            if ((posidx = j__udySearchLeaf5(Pjll, Pop1, Index)) < 0) break;
+
+  JUDY1CODE(return(1);)
+  JUDYLCODE(return((PPvoid_t) (JL_LEAF5VALUEAREA(Pjll, Pop1) + posidx));)
+        }
+
+        case cJU_JPLEAF6:
+        {
+            int posidx;         // signed offset in leaf.
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 6)) break;
+
+            Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+            Pjll = P_JLL(Pjp->jp_Addr);
+
+            if ((posidx = j__udySearchLeaf6(Pjll, Pop1, Index)) < 0) break;
+
+  JUDY1CODE(return(1);)
+  JUDYLCODE(return((PPvoid_t) (JL_LEAF6VALUEAREA(Pjll, Pop1) + posidx));)
+        }
+        case cJU_JPLEAF7:
+        {
+            int posidx;         // signed offset in leaf.
+
+            // JU_DCDNOTMATCHINDEX() would be a no-op.
+            Pop1 = JU_JPLEAF_POP0(Pjp) + 1;
+            Pjll = P_JLL(Pjp->jp_Addr);
+
+            if ((posidx = j__udySearchLeaf7(Pjll, Pop1, Index)) < 0) break;
+
+  JUDY1CODE(return(1);)
+  JUDYLCODE(return((PPvoid_t) (JL_LEAF7VALUEAREA(Pjll, Pop1) + posidx));)
+        }
+#endif // JU_64BIT
+
+
+// ****************************************************************************
+// JPLEAF_B1:
+
+        case cJU_JPLEAF_B1:
+        {
+            Pjlb_t    Pjlb;
+#ifdef JUDYL
+            int       posidx;
+            Word_t    subexp;   // in bitmap, 0..7.
+            BITMAPL_t BitMap;   // for one subexpanse.
+            BITMAPL_t BitMask;  // bit in BitMap for Indexs Digit.
+            Pjv_t     Pjv;
+#endif
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 1)) break;
+
+            Pjlb = P_JLB(Pjp->jp_Addr);
+
+#ifdef JUDY1
+
+// Simply check if Indexs bit is set in the bitmap:
+
+            if (JU_BITMAPTESTL(Pjlb, Index)) return(1);
+            break;
+
+#else // JUDYL
+
+// JudyL is much more complicated because of value area subarrays:
+
+            Digit   = JU_DIGITATSTATE(Index, 1);
+            subexp  = Digit / cJU_BITSPERSUBEXPL;
+            BitMap  = JU_JLB_BITMAP(Pjlb, subexp);
+            BitMask = JU_BITPOSMASKL(Digit);
+
+// No value in subexpanse for Index => Index not found:
+
+            if (! (BitMap & BitMask)) break;
+
+// Count value areas in the subexpanse below the one for Index:
+
+            Pjv = P_JV(JL_JLB_PVALUE(Pjlb, subexp));
+            assert(Pjv != (Pjv_t) NULL);
+            posidx = j__udyCountBitsL(BitMap & (BitMask - 1));
+
+            return((PPvoid_t) (Pjv + posidx));
+
+#endif // JUDYL
+
+        } // case cJU_JPLEAF_B1
+
+#ifdef JUDY1
+
+// ****************************************************************************
+// JPFULLPOPU1:
+//
+// If the Index is in the expanse, it is necessarily valid (found).
+
+        case cJ1_JPFULLPOPU1:
+
+            if (JU_DCDNOTMATCHINDEX(Index, Pjp, 1)) break;
+            return(1);
+
+#ifdef notdef // for future enhancements
+#ifdef JU_64BIT
+
+// Note: Need ? if (JU_DCDNOTMATCHINDEX(Index, Pjp, 1)) break;
+
+        case cJ1_JPFULLPOPU1m15:
+            if (Pjp->jp_1Index[14] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m14:
+            if (Pjp->jp_1Index[13] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m13:
+            if (Pjp->jp_1Index[12] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m12:
+            if (Pjp->jp_1Index[11] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m11:
+            if (Pjp->jp_1Index[10] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m10:
+            if (Pjp->jp_1Index[9] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m9:
+            if (Pjp->jp_1Index[8] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m8:
+            if (Pjp->jp_1Index[7] == (uint8_t)Index) break;
+#endif
+        case cJ1_JPFULLPOPU1m7:
+            if (Pjp->jp_1Index[6] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m6:
+            if (Pjp->jp_1Index[5] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m5:
+            if (Pjp->jp_1Index[4] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m4:
+            if (Pjp->jp_1Index[3] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m3:
+            if (Pjp->jp_1Index[2] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m2:
+            if (Pjp->jp_1Index[1] == (uint8_t)Index) break;
+        case cJ1_JPFULLPOPU1m1:
+            if (Pjp->jp_1Index[0] == (uint8_t)Index) break;
+
+            return(1);  // found, not in exclusion list
+
+#endif // JUDY1
+#endif //  notdef
+
+// ****************************************************************************
+// JPIMMED*:
+//
+// Note that the contents of jp_DcdPopO are different for cJU_JPIMMED_*_01:
+
+        case cJU_JPIMMED_1_01:
+        case cJU_JPIMMED_2_01:
+        case cJU_JPIMMED_3_01:
+#ifdef JU_64BIT
+        case cJU_JPIMMED_4_01:
+        case cJU_JPIMMED_5_01:
+        case cJU_JPIMMED_6_01:
+        case cJU_JPIMMED_7_01:
+#endif
+            if (JU_JPDCDPOP0(Pjp) != JU_TRIMTODCDSIZE(Index)) break;
+
+  JUDY1CODE(return(1);)
+  JUDYLCODE(return((PPvoid_t) &(Pjp->jp_Addr));)  // immediate value area.
+
+
+//   Macros to make code more readable and avoid dup errors
+
+#ifdef JUDY1
+
+#define CHECKINDEXNATIVE(LEAF_T, PJP, IDX, INDEX)                       \
+if (((LEAF_T *)((PJP)->jp_1Index))[(IDX) - 1] == (LEAF_T)(INDEX))       \
+    return(1)
+
+#define CHECKLEAFNONNAT(LFBTS, PJP, INDEX, IDX, COPY)                   \
+{                                                                       \
+    Word_t   i_ndex;                                                    \
+    uint8_t *a_ddr;                                                     \
+    a_ddr  = (PJP)->jp_1Index + (((IDX) - 1) * (LFBTS));                \
+    COPY(i_ndex, a_ddr);                                                \
+    if (i_ndex == JU_LEASTBYTES((INDEX), (LFBTS)))                      \
+        return(1);                                                      \
+}
+#endif
+
+#ifdef JUDYL
+
+#define CHECKINDEXNATIVE(LEAF_T, PJP, IDX, INDEX)                       \
+if (((LEAF_T *)((PJP)->jp_LIndex))[(IDX) - 1] == (LEAF_T)(INDEX))       \
+        return((PPvoid_t)(P_JV((PJP)->jp_Addr) + (IDX) - 1))
+
+#define CHECKLEAFNONNAT(LFBTS, PJP, INDEX, IDX, COPY)                   \
+{                                                                       \
+    Word_t   i_ndex;                                                    \
+    uint8_t *a_ddr;                                                     \
+    a_ddr  = (PJP)->jp_LIndex + (((IDX) - 1) * (LFBTS));                \
+    COPY(i_ndex, a_ddr);                                                \
+    if (i_ndex == JU_LEASTBYTES((INDEX), (LFBTS)))                      \
+        return((PPvoid_t)(P_JV((PJP)->jp_Addr) + (IDX) - 1));           \
+}
+#endif
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJ1_JPIMMED_1_15: CHECKINDEXNATIVE(uint8_t, Pjp, 15, Index);
+        case cJ1_JPIMMED_1_14: CHECKINDEXNATIVE(uint8_t, Pjp, 14, Index);
+        case cJ1_JPIMMED_1_13: CHECKINDEXNATIVE(uint8_t, Pjp, 13, Index);
+        case cJ1_JPIMMED_1_12: CHECKINDEXNATIVE(uint8_t, Pjp, 12, Index);
+        case cJ1_JPIMMED_1_11: CHECKINDEXNATIVE(uint8_t, Pjp, 11, Index);
+        case cJ1_JPIMMED_1_10: CHECKINDEXNATIVE(uint8_t, Pjp, 10, Index);
+        case cJ1_JPIMMED_1_09: CHECKINDEXNATIVE(uint8_t, Pjp,  9, Index);
+        case cJ1_JPIMMED_1_08: CHECKINDEXNATIVE(uint8_t, Pjp,  8, Index);
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+        case cJU_JPIMMED_1_07: CHECKINDEXNATIVE(uint8_t, Pjp,  7, Index);
+        case cJU_JPIMMED_1_06: CHECKINDEXNATIVE(uint8_t, Pjp,  6, Index);
+        case cJU_JPIMMED_1_05: CHECKINDEXNATIVE(uint8_t, Pjp,  5, Index);
+        case cJU_JPIMMED_1_04: CHECKINDEXNATIVE(uint8_t, Pjp,  4, Index);
+#endif
+        case cJU_JPIMMED_1_03: CHECKINDEXNATIVE(uint8_t, Pjp,  3, Index);
+        case cJU_JPIMMED_1_02: CHECKINDEXNATIVE(uint8_t, Pjp,  2, Index);
+                               CHECKINDEXNATIVE(uint8_t, Pjp,  1, Index);
+        break;
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJ1_JPIMMED_2_07: CHECKINDEXNATIVE(uint16_t, Pjp, 7, Index);
+        case cJ1_JPIMMED_2_06: CHECKINDEXNATIVE(uint16_t, Pjp, 6, Index);
+        case cJ1_JPIMMED_2_05: CHECKINDEXNATIVE(uint16_t, Pjp, 5, Index);
+        case cJ1_JPIMMED_2_04: CHECKINDEXNATIVE(uint16_t, Pjp, 4, Index);
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+        case cJU_JPIMMED_2_03: CHECKINDEXNATIVE(uint16_t, Pjp, 3, Index);
+        case cJU_JPIMMED_2_02: CHECKINDEXNATIVE(uint16_t, Pjp, 2, Index);
+                               CHECKINDEXNATIVE(uint16_t, Pjp, 1, Index);
+        break;
+#endif
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJ1_JPIMMED_3_05: 
+            CHECKLEAFNONNAT(3, Pjp, Index, 5, JU_COPY3_PINDEX_TO_LONG);
+        case cJ1_JPIMMED_3_04:
+            CHECKLEAFNONNAT(3, Pjp, Index, 4, JU_COPY3_PINDEX_TO_LONG);
+        case cJ1_JPIMMED_3_03:
+            CHECKLEAFNONNAT(3, Pjp, Index, 3, JU_COPY3_PINDEX_TO_LONG);
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+        case cJU_JPIMMED_3_02:
+            CHECKLEAFNONNAT(3, Pjp, Index, 2, JU_COPY3_PINDEX_TO_LONG);
+            CHECKLEAFNONNAT(3, Pjp, Index, 1, JU_COPY3_PINDEX_TO_LONG);
+            break;
+#endif
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+
+        case cJ1_JPIMMED_4_03: CHECKINDEXNATIVE(uint32_t, Pjp, 3, Index);
+        case cJ1_JPIMMED_4_02: CHECKINDEXNATIVE(uint32_t, Pjp, 2, Index);
+                               CHECKINDEXNATIVE(uint32_t, Pjp, 1, Index);
+            break;
+
+        case cJ1_JPIMMED_5_03:
+            CHECKLEAFNONNAT(5, Pjp, Index, 3, JU_COPY5_PINDEX_TO_LONG);
+        case cJ1_JPIMMED_5_02:
+            CHECKLEAFNONNAT(5, Pjp, Index, 2, JU_COPY5_PINDEX_TO_LONG);
+            CHECKLEAFNONNAT(5, Pjp, Index, 1, JU_COPY5_PINDEX_TO_LONG);
+            break;
+
+        case cJ1_JPIMMED_6_02:
+            CHECKLEAFNONNAT(6, Pjp, Index, 2, JU_COPY6_PINDEX_TO_LONG);
+            CHECKLEAFNONNAT(6, Pjp, Index, 1, JU_COPY6_PINDEX_TO_LONG);
+            break;
+
+        case cJ1_JPIMMED_7_02:
+            CHECKLEAFNONNAT(7, Pjp, Index, 2, JU_COPY7_PINDEX_TO_LONG);
+            CHECKLEAFNONNAT(7, Pjp, Index, 1, JU_COPY7_PINDEX_TO_LONG);
+            break;
+
+#endif // (JUDY1 && JU_64BIT)
+
+
+// ****************************************************************************
+// INVALID JP TYPE:
+
+        default:
+
+ReturnCorrupt:
+
+#ifdef JUDYGETINLINE    // Pjpm is known to be non-null:
+            JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT);
+#else
+            JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+#endif
+            JUDY1CODE(return(JERRI );)
+            JUDYLCODE(return(PPJERR);)
+
+        } // switch on JP type
+
+JUDY1CODE(return(0);)
+JUDYLCODE(return((PPvoid_t) NULL);)
+
+} // Judy1Test() / JudyLGet()
+
+
+#ifndef JUDYGETINLINE   // only compile the following function once:
+#ifdef DEBUG
+
+// ****************************************************************************
+// J U D Y   C H E C K   P O P
+//
+// Given a pointer to a Judy array, traverse the entire array to ensure
+// population counts add up correctly.  This can catch various coding errors.
+//
+// Since walking the entire tree is probably time-consuming, enable this
+// function by setting env parameter $CHECKPOP to first call at which to start
+// checking.  Note:  This function is called both from insert and delete code.
+//
+// Note:  Even though this function does nothing useful for LEAFW leaves, its
+// good practice to call it anyway, and cheap too.
+//
+// TBD:  This is a debug-only check function similar to JudyCheckSorted(), but
+// since it walks the tree it is Judy1/JudyL-specific and must live in a source
+// file that is built both ways.
+//
+// TBD:  As feared, enabling this code for every insert/delete makes Judy
+// deathly slow, even for a small tree (10K indexes).  Its not so bad if
+// present but disabled (<1% slowdown measured).  Still, should it be ifdefd
+// other than DEBUG and/or called less often?
+//
+// TBD:  Should this "population checker" be expanded to a comprehensive tree
+// checker?  It currently detects invalid LEAFW/JP types as well as inconsistent
+// pop1s.  Other possible checks, all based on essentially redundant data in
+// the Judy tree, include:
+//
+// - Zero LS bits in jp_Addr field.
+//
+// - Correct Dcd bits.
+//
+// - Consistent JP types (always descending down the tree).
+//
+// - Sorted linear lists in BranchLs and leaves (using JudyCheckSorted(), but
+//   ideally that function is already called wherever appropriate after any
+//   linear list is modified).
+//
+// - Any others possible?
+
+#include <stdlib.h>             // for getenv() and atol().
+
+static Word_t JudyCheckPopSM(Pjp_t Pjp, Word_t RootPop1);
+
+FUNCTION void JudyCheckPop(
+        Pvoid_t PArray)
+{
+static  bool_t  checked = FALSE;        // already checked env parameter.
+static  bool_t  enabled = FALSE;        // env parameter set.
+static  bool_t  active  = FALSE;        // calls >= callsmin.
+static  Word_t  callsmin;               // start point from $CHECKPOP.
+static  Word_t  calls = 0;              // times called so far.
+
+
+// CHECK FOR EXTERNAL ENABLING:
+
+        if (! checked)                  // only check once.
+        {
+            char * value;               // for getenv().
+
+            checked = TRUE;
+
+            if ((value = getenv("CHECKPOP")) == (char *) NULL)
+            {
+#ifdef notdef
+// Take this out because nightly tests want to be flavor-independent; its not
+// OK to emit special non-error output from the debug flavor:
+
+                (void) puts("JudyCheckPop() present but not enabled by "
+                            "$CHECKPOP env parameter; set it to the number of "
+                            "calls at which to begin checking");
+#endif
+                return;
+            }
+
+            callsmin = atol(value);     // note: non-number evaluates to 0.
+            enabled  = TRUE;
+
+            (void) printf("JudyCheckPop() present and enabled; callsmin = "
+                          "%lu\n", callsmin);
+        }
+        else if (! enabled) return;
+
+// Previously or just now enabled; check if non-active or newly active:
+
+        if (! active)
+        {
+            if (++calls < callsmin) return;
+
+            (void) printf("JudyCheckPop() activated at call %lu\n", calls);
+            active = TRUE;
+        }
+
+// IGNORE LEAFW AT TOP OF TREE:
+
+        if (JU_LEAFW_POP0(PArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
+                return;
+
+// Check JPM pop0 against tree, recursively:
+//
+// Note:  The traversal code in JudyCheckPopSM() is simplest when the case
+// statement for each JP type compares the pop1 for that JP to its subtree (if
+// any) after traversing the subtree (thats the hard part) and adding up
+// actual pop1s.  A top branchs JP in the JPM does not have room for a
+// full-word pop1, so pass it in as a special case.
+
+        {
+            Pjpm_t Pjpm = P_JPM(PArray);
+            (void) JudyCheckPopSM(&(Pjpm->jpm_JP), Pjpm->jpm_Pop0 + 1);
+            return;
+        }
+
+} // JudyCheckPop()
+
+
+// ****************************************************************************
+// J U D Y   C H E C K   P O P   S M
+//
+// Recursive state machine (subroutine) for JudyCheckPop():  Given a Pjp (other
+// than JPNULL*; caller should shortcut) and the root population for top-level
+// branches, check the subtrees actual pop1 against its nominal value, and
+// return the total pop1 for the subtree.
+//
+// Note:  Expect RootPop1 to be ignored at lower levels, so pass down 0, which
+// should pop an assertion if this expectation is violated.
+
+FUNCTION static Word_t JudyCheckPopSM(
+        Pjp_t  Pjp,             // top of subtree.
+        Word_t RootPop1)        // whole array, for top-level branches only.
+{
+        Word_t pop1_jp;         // nominal population from the JP.
+        Word_t pop1 = 0;        // actual population at this level.
+        Word_t offset;          // in a branch.
+
+#define PREPBRANCH(cPopBytes,Next) \
+        pop1_jp = JU_JPBRANCH_POP0(Pjp, cPopBytes) + 1; goto Next
+
+assert((((Word_t) (Pjp->jp_Addr)) & 7) == 3);
+        switch (JU_JPTYPE(Pjp))
+        {
+
+        case cJU_JPBRANCH_L2: PREPBRANCH(2, BranchL);
+        case cJU_JPBRANCH_L3: PREPBRANCH(3, BranchL);
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_L4: PREPBRANCH(4, BranchL);
+        case cJU_JPBRANCH_L5: PREPBRANCH(5, BranchL);
+        case cJU_JPBRANCH_L6: PREPBRANCH(6, BranchL);
+        case cJU_JPBRANCH_L7: PREPBRANCH(7, BranchL);
+#endif
+        case cJU_JPBRANCH_L:  pop1_jp = RootPop1;
+        {
+            Pjbl_t Pjbl;
+BranchL:
+            Pjbl = P_JBL(Pjp->jp_Addr);
+
+            for (offset = 0; offset < (Pjbl->jbl_NumJPs); ++offset)
+                pop1 += JudyCheckPopSM((Pjbl->jbl_jp) + offset, 0);
+
+            assert(pop1_jp == pop1);
+            return(pop1);
+        }
+
+        case cJU_JPBRANCH_B2: PREPBRANCH(2, BranchB);
+        case cJU_JPBRANCH_B3: PREPBRANCH(3, BranchB);
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_B4: PREPBRANCH(4, BranchB);
+        case cJU_JPBRANCH_B5: PREPBRANCH(5, BranchB);
+        case cJU_JPBRANCH_B6: PREPBRANCH(6, BranchB);
+        case cJU_JPBRANCH_B7: PREPBRANCH(7, BranchB);
+#endif
+        case cJU_JPBRANCH_B:  pop1_jp = RootPop1;
+        {
+            Word_t subexp;
+            Word_t jpcount;
+            Pjbb_t Pjbb;
+BranchB:
+            Pjbb = P_JBB(Pjp->jp_Addr);
+
+            for (subexp = 0; subexp < cJU_NUMSUBEXPB; ++subexp)
+            {
+                jpcount = j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, subexp));
+
+                for (offset = 0; offset < jpcount; ++offset)
+                {
+                    pop1 += JudyCheckPopSM(P_JP(JU_JBB_PJP(Pjbb, subexp))
+                                         + offset, 0);
+                }
+            }
+
+            assert(pop1_jp == pop1);
+            return(pop1);
+        }
+
+        case cJU_JPBRANCH_U2: PREPBRANCH(2, BranchU);
+        case cJU_JPBRANCH_U3: PREPBRANCH(3, BranchU);
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_U4: PREPBRANCH(4, BranchU);
+        case cJU_JPBRANCH_U5: PREPBRANCH(5, BranchU);
+        case cJU_JPBRANCH_U6: PREPBRANCH(6, BranchU);
+        case cJU_JPBRANCH_U7: PREPBRANCH(7, BranchU);
+#endif
+        case cJU_JPBRANCH_U:  pop1_jp = RootPop1;
+        {
+            Pjbu_t Pjbu;
+BranchU:
+            Pjbu = P_JBU(Pjp->jp_Addr);
+
+            for (offset = 0; offset < cJU_BRANCHUNUMJPS; ++offset)
+            {
+                if (((Pjbu->jbu_jp[offset].jp_Type) >= cJU_JPNULL1)
+                 && ((Pjbu->jbu_jp[offset].jp_Type) <= cJU_JPNULLMAX))
+                {
+                    continue;           // skip null JP to save time.
+                }
+
+                pop1 += JudyCheckPopSM((Pjbu->jbu_jp) + offset, 0);
+            }
+
+            assert(pop1_jp == pop1);
+            return(pop1);
+        }
+
+
+// -- Cases below here terminate and do not recurse. --
+//
+// For all of these cases except JPLEAF_B1, there is no way to check the JPs
+// pop1 against the object itself; just return the pop1; but for linear leaves,
+// a bounds check is possible.
+
+#define CHECKLEAF(MaxPop1)                              \
+        pop1 = JU_JPLEAF_POP0(Pjp) + 1;                 \
+        assert(pop1 >= 1);                              \
+        assert(pop1 <= (MaxPop1));                      \
+        return(pop1)
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+        case cJU_JPLEAF1:  CHECKLEAF(cJU_LEAF1_MAXPOP1);
+#endif
+        case cJU_JPLEAF2:  CHECKLEAF(cJU_LEAF2_MAXPOP1);
+        case cJU_JPLEAF3:  CHECKLEAF(cJU_LEAF3_MAXPOP1);
+#ifdef JU_64BIT
+        case cJU_JPLEAF4:  CHECKLEAF(cJU_LEAF4_MAXPOP1);
+        case cJU_JPLEAF5:  CHECKLEAF(cJU_LEAF5_MAXPOP1);
+        case cJU_JPLEAF6:  CHECKLEAF(cJU_LEAF6_MAXPOP1);
+        case cJU_JPLEAF7:  CHECKLEAF(cJU_LEAF7_MAXPOP1);
+#endif
+
+        case cJU_JPLEAF_B1:
+        {
+            Word_t subexp;
+            Pjlb_t Pjlb;
+
+            pop1_jp = JU_JPLEAF_POP0(Pjp) + 1;
+
+            Pjlb = P_JLB(Pjp->jp_Addr);
+
+            for (subexp = 0; subexp < cJU_NUMSUBEXPL; ++subexp)
+                pop1 += j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, subexp));
+
+            assert(pop1_jp == pop1);
+            return(pop1);
+        }
+
+        JUDY1CODE(case cJ1_JPFULLPOPU1: return(cJU_JPFULLPOPU1_POP0);)
+
+        case cJU_JPIMMED_1_01:  return(1);
+        case cJU_JPIMMED_2_01:  return(1);
+        case cJU_JPIMMED_3_01:  return(1);
+#ifdef JU_64BIT
+        case cJU_JPIMMED_4_01:  return(1);
+        case cJU_JPIMMED_5_01:  return(1);
+        case cJU_JPIMMED_6_01:  return(1);
+        case cJU_JPIMMED_7_01:  return(1);
+#endif
+
+        case cJU_JPIMMED_1_02:  return(2);
+        case cJU_JPIMMED_1_03:  return(3);
+#if (defined(JUDY1) || defined(JU_64BIT))
+        case cJU_JPIMMED_1_04:  return(4);
+        case cJU_JPIMMED_1_05:  return(5);
+        case cJU_JPIMMED_1_06:  return(6);
+        case cJU_JPIMMED_1_07:  return(7);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJ1_JPIMMED_1_08:  return(8);
+        case cJ1_JPIMMED_1_09:  return(9);
+        case cJ1_JPIMMED_1_10:  return(10);
+        case cJ1_JPIMMED_1_11:  return(11);
+        case cJ1_JPIMMED_1_12:  return(12);
+        case cJ1_JPIMMED_1_13:  return(13);
+        case cJ1_JPIMMED_1_14:  return(14);
+        case cJ1_JPIMMED_1_15:  return(15);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+        case cJU_JPIMMED_2_02:  return(2);
+        case cJU_JPIMMED_2_03:  return(3);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJ1_JPIMMED_2_04:  return(4);
+        case cJ1_JPIMMED_2_05:  return(5);
+        case cJ1_JPIMMED_2_06:  return(6);
+        case cJ1_JPIMMED_2_07:  return(7);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+        case cJU_JPIMMED_3_02:  return(2);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJ1_JPIMMED_3_03:  return(3);
+        case cJ1_JPIMMED_3_04:  return(4);
+        case cJ1_JPIMMED_3_05:  return(5);
+
+        case cJ1_JPIMMED_4_02:  return(2);
+        case cJ1_JPIMMED_4_03:  return(3);
+        case cJ1_JPIMMED_5_02:  return(2);
+        case cJ1_JPIMMED_5_03:  return(3);
+        case cJ1_JPIMMED_6_02:  return(2);
+        case cJ1_JPIMMED_7_02:  return(2);
+#endif
+
+        } // switch (JU_JPTYPE(Pjp))
+
+        assert(FALSE);          // unrecognized JP type => corruption.
+        return(0);              // to make some compilers happy.
+
+} // JudyCheckPopSM()
+
+#endif // DEBUG
+#endif // ! JUDYGETINLINE
diff --git a/libs/klib/judy/JudyHS.c b/libs/klib/judy/JudyHS.c
new file mode 100644
index 0000000..e95f3dc
--- /dev/null
+++ b/libs/klib/judy/JudyHS.c
@@ -0,0 +1,770 @@
+//=======================================================================
+//   Author Douglas L. Baskins, Dec 2003.
+//   Permission to use this code is freely granted, provided that this
+//   statement is retained.
+//   email - doug at sourcejudy.com -or- dougbaskins at yahoo.com
+//=======================================================================
+
+#include <string.h>                     // for memcmp(), memmove()
+
+#include <Judy.h>                       // for JudyL* routines/macros
+
+/*
+   This routine is a very fast "string" version of an ADT that stores
+   (JudyHSIns()), retrieves (JudyHSGet()), deletes (JudyHSDel()) and
+   frees the entire ADT (JudyHSFreeArray()) strings.  It uses the "Judy
+   arrays" JudyL() API as the main workhorse.  The length of the string
+   is included in the calling parameters so that strings with embedded
+   \0s can be used.  The string lengths can be from 0 bytes to whatever
+   malloc() can handle (~2GB).
+
+   Compile:
+  
+      cc -O JudyHS.c -c         needs to link with -lJudy (libJudy.a)
+  
+      Note: in gcc version 3.3.1, -O2 generates faster code than -O
+      Note: in gcc version 3.3.2, -O3 generates faster code than -O2
+
+   NOTES:
+
+1) There may be some performance issues with 64 bit machines, because I
+   have not characterized that it yet.
+
+2) It appears that a modern CPU (>2Ghz) that the instruction times are
+   much faster that a RAM access, so building up a word from bytes takes
+   no longer that a whole word access.  I am taking advantage of this to
+   make this code endian neutral.  A side effect of this is strings do
+   not need to be aligned, nor tested to be on to a word boundry.  In
+   older and in slow (RISC) machines, this may be a performance issue.
+   I have given up trying to optimize for machines that have very slow
+   mpy, mod, variable shifts and call returns.
+
+3) JudyHS is very scalable from 1 string to billions (with enough RAM).
+   The memory usage is also scales with population.  I have attempted to
+   combine the best characteristics of JudyL arrays with Hashing methods
+   and well designed modern processors (such as the 1.3Ghz Intel
+   Centrino this is being written on).
+
+   HOW JudyHS WORKS: ( 4[8] means 4 bytes in 32 bit machine and 8 in 64)
+
+   A) A JudyL array is used to separate strings of equal lengths into
+   their own structures (a different hash table is used for each length
+   of string).  The additional time overhead is very near zero because
+   of the CPU cache.  The space efficiency is improved because the
+   length need not be stored with the string (ls_t).  The "JLHash" ADT
+   in the test program "StringCompare" is verification of both these
+   assumptions.
+
+   B) A 32 bit hash value is produced from the string.  Many thanks to
+   the Internet and the author (Bob Jenkins) for coming up with a very
+   good and fast universal string hash.  Next the 32 bit hash number is
+   used as an Index to another JudyL array.  Notice that one (1) JudyL
+   array is used as a hash table per each string length.  If there are
+   no hash collisions (normally) then the string is copied to a
+   structure (ls_t) along with room for storing a Value.  A flag is
+   added to the pointer to note it is pointing to a ls_t structure.
+   Since the lengths of the strings are the same, there is no need to
+   stored length of string in the ls_t structure.  This saves about a
+   word per string of memory.
+
+   C) When there is a hashing collision (very rare), a JudyL array is
+   used to decode the next 4[8] bytes of the string.  That is, the next
+   4[8] bytes of the string are used as the Index.  This process is
+   repeated until the remaining string is unique.  The remaining string
+   (if any) is stored in a (now smaller) ls_t structure.  If the
+   remaining string is less or equal to 4[8] bytes, then the ls_t
+   structure is not needed and the Value area in the JudyL array is
+   used.  A compile option -DDONOTUSEHASH is available to test this
+   structure without using hashing (only the JudyL tree is used).  This
+   is equivalent to having all strings hashed to the same bucket.  The
+   speed is still better than all other tree based ADTs I have tested.
+   An added benefit of this is a very fast "hash collision" resolving.
+   It could foil hackers that exploit the slow synonym (linked-list)
+   collision handling property used with most hashing algorithms.  If
+   this is not a necessary property, then a simpler ADT "JLHash" that is
+   documented the the test program "StringCompare.c" may be used with a
+   little loss of memory efficiency (because it includes the string
+   length with the ls_t structure).  JudyHS was written to be the
+   fastest, very scalable, memory efficient, general purpose string ADT
+   possible.  (However, I would like to eat those words someday). (dlb)
+
+*/
+
+#ifdef EXAMPLE_CODE
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <Judy.h>
+
+//#include "JudyHS.h"                   // for Judy.h without JudyHS*()
+
+// By Doug Baskins Apr 2004 - for JudyHS man page
+
+#define MAXLINE 1000000                 /* max length of line */
+char      Index[MAXLINE];               // string to check
+
+int     // Usage:  CheckDupLines < file
+main()
+{
+    Pvoid_t   PJArray = (PWord_t)NULL;  // Judy array.
+    PWord_t   PValue;                   // ^ Judy array element.
+    Word_t    Bytes;                    // size of JudyHS array.
+    Word_t    LineNumb = 0;             // current line number
+    Word_t    Dups = 0;                 // number of duplicate lines
+
+    while (fgets(Index, MAXLINE, stdin) != (char *)NULL)
+    {
+        LineNumb++;                     // line number
+
+//      store string into array
+        JHSI(PValue, PJArray, Index, strlen(Index)); 
+        if (*PValue)                    // check if duplicate
+        {
+            Dups++;                     // count duplicates
+            printf("Duplicate lines %lu:%lu:%s", *PValue, LineNumb, Index);
+        }
+        else
+        {
+            *PValue = LineNumb;         // store Line number
+        }
+    }
+    printf("%lu Duplicates, free JudyHS array of %lu Lines\n", 
+                    Dups, LineNumb - Dups);
+    JHSFA(Bytes, PJArray);              // free array
+    printf("The JudyHS array allocated %lu bytes of memory\n", Bytes);
+    return (0);
+}
+#endif // EXAMPLE_CODE
+
+// Note:  Use JLAP_INVALID, which is non-zero, to mark pointers to a ls_t
+// This makes it compatable with previous versions of JudyL()
+
+#define IS_PLS(PLS)     (((Word_t) (PLS)) & JLAP_INVALID)
+#define CLEAR_PLS(PLS)  (((Word_t) (PLS)) & (~JLAP_INVALID))
+#define SET_PLS(PLS)    (((Word_t) (PLS)) | JLAP_INVALID)
+
+#define WORDSIZE     (sizeof(Word_t))
+
+// this is the struct used for "leaf" strings.  Note that
+// the Value is followed by a "variable" length ls_String array.
+//
+typedef struct L_EAFSTRING
+{
+    Word_t    ls_Value;                 // Value area (cannot change size)
+    uint8_t   ls_String[WORDSIZE];      // to fill out to a Word_t size
+} ls_t     , *Pls_t;
+
+#define LS_STRUCTOVD     (sizeof(ls_t) - WORDSIZE)
+
+// Calculate size of ls_t including the string of length of LEN.
+//
+#define LS_WORDLEN(LEN)  (((LEN) + LS_STRUCTOVD + WORDSIZE - 1) / WORDSIZE)
+
+// Copy from 0..4[8] bytes from string to a Word_t
+// NOTE: the copy in in little-endian order to take advantage of improved 
+// memory efficiency of JudyLIns() with smaller numbers
+//
+#define        COPYSTRING4toWORD(WORD,STR,LEN)          \
+{                                                       \
+    WORD = 0;                                           \
+    switch(LEN)                                         \
+    {                                                   \
+    default:    /* four and greater */                  \
+    case 4:                                             \
+        WORD += (Word_t)(((uint8_t *)(STR))[3] << 24);  \
+    case 3:                                             \
+        WORD += (Word_t)(((uint8_t *)(STR))[2] << 16);  \
+    case 2:                                             \
+        WORD += (Word_t)(((uint8_t *)(STR))[1] <<  8);  \
+    case 1:                                             \
+        WORD += (Word_t)(((uint8_t *)(STR))[0]);        \
+    case 0: break;                                      \
+    }                                                   \
+}
+
+#ifdef JU_64BIT
+
+// copy from 0..8 bytes from string to Word_t
+//
+#define        COPYSTRING8toWORD(WORD,STR,LEN)          \
+{                                                       \
+    WORD = 0UL;                                         \
+    switch(LEN)                                         \
+    {                                                   \
+    default:    /* eight and greater */                 \
+    case 8:                                             \
+        WORD += ((Word_t)((uint8_t *)(STR))[7] << 56);  \
+    case 7:                                             \
+        WORD += ((Word_t)((uint8_t *)(STR))[6] << 48);  \
+    case 6:                                             \
+        WORD += ((Word_t)((uint8_t *)(STR))[5] << 40);  \
+    case 5:                                             \
+        WORD += ((Word_t)((uint8_t *)(STR))[4] << 32);  \
+    case 4:                                             \
+        WORD += ((Word_t)((uint8_t *)(STR))[3] << 24);  \
+    case 3:                                             \
+        WORD += ((Word_t)((uint8_t *)(STR))[2] << 16);  \
+    case 2:                                             \
+        WORD += ((Word_t)((uint8_t *)(STR))[1] <<  8);  \
+    case 1:                                             \
+        WORD += ((Word_t)((uint8_t *)(STR))[0]);        \
+    case 0: break;                                      \
+    }                                                   \
+}
+
+#define COPYSTRINGtoWORD COPYSTRING8toWORD
+
+#else  // JU_32BIT
+
+#define COPYSTRINGtoWORD COPYSTRING4toWORD
+
+#endif // JU_32BIT
+
+// set JError_t locally
+
+#define JU_SET_ERRNO(PJERROR, JERRNO)           \
+{                                               \
+    if (PJERROR != (PJError_t) NULL)            \
+    {                                           \
+        if (JERRNO)                             \
+            JU_ERRNO(PJError) = (JERRNO);       \
+        JU_ERRID(PJERROR) = __LINE__;           \
+    }                                           \
+}
+
+//=======================================================================
+// This routine must hash string to 24..32 bits.  The "goodness" of
+// the hash is not as important as its speed.
+//=======================================================================
+
+// hash to no more than 32 bits
+
+// extern Word_t gHmask; for hash bits experiments
+
+#define JUDYHASHSTR(HVALUE,STRING,LENGTH)       \
+{                                               \
+    uint8_t *p_ = (uint8_t *)(STRING);          \
+    uint8_t *q_ = p_ + (LENGTH);                \
+    uint32_t c_ = 0;                            \
+    for (; p_ != q_; ++p_)                      \
+    {                                           \
+        c_ = (c_ * 31) + *p_;                   \
+    }                                           \
+/*  c_ &= gHmask;   see above   */              \
+    (HVALUE) = c_;                              \
+}
+
+// Find String of Len in JudyHS structure, return pointer to associated Value
+
+PPvoid_t
+JudyHSGet(Pcvoid_t PArray,              // pointer (^) to structure
+           void * Str,                  // pointer to string
+           Word_t Len                   // length of string
+    )
+{
+    uint8_t  *String = (uint8_t *)Str;
+    PPvoid_t  PPValue;                  // pointer to Value
+    Word_t    Index;                    // 4[8] bytes of String
+
+    JLG(PPValue, PArray, Len);          // find hash table for strings of Len
+    if (PPValue == (PPvoid_t) NULL)
+        return ((PPvoid_t) NULL);       // no strings of this Len
+
+//  check for caller error (null pointer)
+//
+    if ((String == (void *) NULL) && (Len != 0))
+        return ((PPvoid_t) NULL);       // avoid null-pointer dereference
+
+#ifndef DONOTUSEHASH
+    if (Len > WORDSIZE)                 // Hash table not necessary with short
+    {
+        uint32_t  HValue;               // hash of input string
+        JUDYHASHSTR(HValue, String, Len);       // hash to no more than 32 bits
+        JLG(PPValue, *PPValue, (Word_t)HValue); // get ^ to hash bucket
+        if (PPValue == (PPvoid_t) NULL)
+            return ((PPvoid_t) NULL);   // no entry in Hash table
+    }
+#endif // DONOTUSEHASH
+
+/*
+  Each JudyL array decodes 4[8] bytes of the string.  Since the hash
+  collisions occur very infrequently, the performance is not important.
+  However, even if the Hash code is not used this method still is
+  significantly faster than common tree methods (AVL, Red-Black, Splay,
+  b-tree, etc..).  You can compare it yourself with #define DONOTUSEHASH
+  1 or putting -DDONOTUSEHASH in the cc line.  Use the "StringCompare.c"
+  code to compare (9Dec2003 dlb).
+*/
+    while (Len > WORDSIZE)              // traverse tree of JudyL arrays
+    {
+        if (IS_PLS(*PPValue))           // ^ to JudyL array or ls_t struct?
+        {
+            Pls_t     Pls;              // ls_t struct, termination of tree
+            Pls = (Pls_t) CLEAR_PLS(*PPValue);  // remove flag from ^
+
+//          if remaining string matches, return ^ to Value, else NULL
+
+            if (memcmp(String, Pls->ls_String, Len) == 0)
+                return ((PPvoid_t) (&(Pls->ls_Value)));
+            else
+                return ((PPvoid_t) NULL);       // string does not match
+        }
+        else
+        {
+            COPYSTRINGtoWORD(Index, String, WORDSIZE);
+
+            JLG(PPValue, *PPValue, Index);      // decode next 4[8] bytes
+            if (PPValue == (PPvoid_t) NULL)     // if NULL array, bail out
+                return ((PPvoid_t) NULL);       // string does not match
+
+            String += WORDSIZE;                 // advance
+            Len -= WORDSIZE;
+        }
+    }
+
+//  Get remaining 1..4[8] bytes left in string
+
+    COPYSTRINGtoWORD(Index, String, Len);
+    JLG(PPValue, *PPValue, Index);      // decode last 1-4[8] bytes
+    return (PPValue);
+}
+
+// Add string to a tree of JudyL arrays (all lengths must be same)
+
+static PPvoid_t
+insStrJudyLTree(uint8_t * String,      // string to add to tree of JudyL arrays
+                 Word_t Len,            // length of string
+                 PPvoid_t PPValue,      // pointer to root pointer
+                 PJError_t PJError      // for returning error info
+    )
+{
+    Word_t    Index;                    // next 4[8] bytes of String
+
+    while (Len > WORDSIZE)              // add to JudyL tree
+    {
+//      CASE 1, pointer is to a NULL, make a new ls_t leaf
+
+        if (*PPValue == (Pvoid_t)NULL)
+        {
+            Pls_t     Pls;              // memory for a ls_t
+            Pls = (Pls_t) JudyMalloc(LS_WORDLEN(Len));
+            if (Pls == NULL)
+            {
+                JU_SET_ERRNO(PJError, JU_ERRNO_NOMEM);
+                return (PPJERR);
+            }
+            Pls->ls_Value = 0;                          // clear Value word
+            memmove(Pls->ls_String, String, Len);        // copy to new struct
+            *PPValue = (Pvoid_t)SET_PLS(Pls);           // mark pointer
+            return ((PPvoid_t) (&Pls->ls_Value));       // return ^ to Value
+        }                                               // no exit here
+//      CASE 2: is a ls_t, free (and shorten), then decode into JudyL tree
+
+        if (IS_PLS(*PPValue))                   // pointer to a ls_t? (leaf)
+        {
+            Pls_t     Pls;                      // ^ to ls_t
+            uint8_t  *String0;                  // ^ to string in ls_t
+            Word_t    Index0;                   // 4[8] bytes in string
+            Word_t    FreeLen;                  // length of ls_t
+            PPvoid_t  PPsplit;
+
+            FreeLen = LS_WORDLEN(Len);          // length of ls_t
+
+            Pls = (Pls_t) CLEAR_PLS(*PPValue);  // demangle ^ to ls_t
+            String0 = Pls->ls_String;
+            if (memcmp(String, String0, Len) == 0)      // check if match?
+            {
+                return ((PPvoid_t) (&Pls->ls_Value));   // yes, duplicate
+            }
+
+            *PPValue = NULL;            // clear ^ to ls_t and make JudyL
+
+//          This do loop is technically not required, saves multiple JudyFree()
+//          when storing already sorted strings into structure
+
+            do                          // decode next 4[8] bytes of string
+            {                           // with a JudyL array
+//              Note: string0 is always aligned
+
+                COPYSTRINGtoWORD(Index0, String0, WORDSIZE);
+                String0 += WORDSIZE;
+                COPYSTRINGtoWORD(Index, String, WORDSIZE);
+                String += WORDSIZE;
+                Len -= WORDSIZE;
+                PPsplit = PPValue;      // save for split below
+                PPValue = JudyLIns(PPValue, Index0, PJError);
+                if (PPValue == PPJERR)
+                {
+                    JU_SET_ERRNO(PJError, 0);
+                    return (PPJERR);
+                }
+
+            } while ((Index0 == Index) && (Len > WORDSIZE));
+
+//          finish storing remainder of string that was in the ls_t
+
+            PPValue = insStrJudyLTree(String0, Len, PPValue, PJError);
+            if (PPValue == PPJERR)
+            {
+                return (PPJERR);
+            }
+//          copy old Value to Value in new struct
+
+            *(PWord_t)PPValue = Pls->ls_Value;
+
+//          free the string buffer (ls_t)
+
+            JudyFree((Pvoid_t)Pls, FreeLen);
+            PPValue = JudyLIns(PPsplit, Index, PJError);
+            if (PPValue == PPJERR)
+            {
+                JU_SET_ERRNO(PJError, 0);
+                return (PPValue);
+            }
+
+//          finish remainder of newly inserted string
+
+            PPValue = insStrJudyLTree(String, Len, PPValue, PJError);
+            return (PPValue);
+        }                               // no exit here
+//      CASE 3, more JudyL arrays, decode to next tree
+
+        COPYSTRINGtoWORD(Index, String, WORDSIZE);
+        Len -= WORDSIZE;
+        String += WORDSIZE;
+
+        PPValue = JudyLIns(PPValue, Index, PJError);    // next 4[8] bytes
+        if (PPValue == PPJERR)
+        {
+            JU_SET_ERRNO(PJError, 0);
+            return (PPValue);
+        }
+    }
+//  this is done outside of loop so "Len" can be an unsigned number
+
+    COPYSTRINGtoWORD(Index, String, Len);
+    PPValue = JudyLIns(PPValue, Index, PJError);    // remaining 4[8] bytes
+
+    return (PPValue);
+}
+
+
+// Insert string to JudyHS structure, return pointer to associated Value
+
+PPvoid_t
+JudyHSIns(PPvoid_t PPArray,             // ^ to JudyHashArray name
+           void * Str,                  // pointer to string
+           Word_t Len,                  // length of string
+           PJError_t PJError            // optional, for returning error info
+    )
+{
+    uint8_t * String = (uint8_t *)Str;
+    PPvoid_t  PPValue;
+
+//  string can only be NULL if Len is 0.
+
+    if ((String == (uint8_t *) NULL) && (Len != 0UL))
+    {
+        JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+        return (PPJERR);
+    }
+    JLG(PPValue, *PPArray, Len);        // JudyL hash table for strings of Len
+    if (PPValue == (PPvoid_t) NULL)     // make new if missing, (very rare)
+    {
+        PPValue = JudyLIns(PPArray, Len, PJError);
+        if (PPValue == PPJERR)
+        {
+            JU_SET_ERRNO(PJError, 0);
+            return (PPJERR);
+        }
+    }
+#ifndef DONOTUSEHASH
+    if (Len > WORDSIZE)
+    {
+        uint32_t  HValue;                       // hash of input string
+        JUDYHASHSTR(HValue, String, Len);       // hash to no more than 32 bits
+        PPValue = JudyLIns(PPValue, (Word_t)HValue, PJError);
+        if (PPValue == PPJERR)
+        {
+            JU_SET_ERRNO(PJError, 0);
+            return (PPJERR);
+        }
+    }
+#endif // DONOTUSEHASH
+
+    PPValue = insStrJudyLTree(String, Len, PPValue, PJError); // add string 
+    return (PPValue);                   //  ^  to Value
+}
+
+// Delete string from tree of JudyL arrays (all Lens must be same)
+
+static int
+delStrJudyLTree(uint8_t * String,      // delete from tree of JudyL arrays
+                 Word_t Len,            // length of string
+                 PPvoid_t PPValue,      // ^ to hash bucket
+                 PJError_t PJError      // for returning error info
+    )
+{
+    PPvoid_t  PPValueN;                 // next pointer
+    Word_t    Index;
+    int       Ret;                      // -1=failed, 1=success, 2=quit del
+
+    if (IS_PLS(*PPValue))               // is pointer to ls_t?
+    {
+        Pls_t     Pls;
+        Pls = (Pls_t) CLEAR_PLS(*PPValue);      // demangle pointer
+        JudyFree((Pvoid_t)Pls, LS_WORDLEN(Len));        // free the ls_t
+
+        *PPValue = (Pvoid_t)NULL;       // clean pointer
+        return (1);                     // successfully deleted
+    }
+
+    if (Len > WORDSIZE)                 // delete from JudyL tree, not leaf
+    {
+        COPYSTRINGtoWORD(Index, String, WORDSIZE);      // get Index
+        JLG(PPValueN, *PPValue, Index); // get pointer to next JudyL array
+
+        String += WORDSIZE;             // advance to next 4[8] bytes
+        Len -= WORDSIZE;
+
+        Ret = delStrJudyLTree(String, Len, PPValueN, PJError);
+        if (Ret != 1) return(Ret);
+
+        if (*PPValueN == (PPvoid_t) NULL)
+        {
+//          delete JudyL element from tree
+
+            Ret = JudyLDel(PPValue, Index, PJError);
+        }
+    }
+    else
+    {
+        COPYSTRINGtoWORD(Index, String, Len);   // get leaf element
+
+//      delete last 1-4[8] bytes from leaf element
+
+        Ret = JudyLDel(PPValue, Index, PJError); 
+    }
+    return (Ret);
+}
+
+// Delete string from JHS structure
+
+int
+JudyHSDel(PPvoid_t PPArray,             // ^ to JudyHashArray struct
+           void * Str,                  // pointer to string
+           Word_t Len,                  // length of string
+           PJError_t PJError            // optional, for returning error info
+    )
+{
+    uint8_t * String = (uint8_t *)Str;
+    PPvoid_t  PPBucket, PPHtble;
+    int       Ret;                      // return bool from Delete routine
+#ifndef DONOTUSEHASH
+    uint32_t  HValue = 0;               // hash value of input string
+#endif // DONOTUSEHASH
+
+    if (PPArray == NULL)
+        return (0);                     // no pointer, return not found
+
+//  This is a little slower than optimum method, but not much in new CPU
+//  Verify that string is in the structure -- simplifies future assumptions
+
+    if (JudyHSGet(*PPArray, String, Len) == (PPvoid_t) NULL)
+        return (0);                     // string not found, return
+
+//  string is in structure, so testing for absence is not necessary
+
+    JLG(PPHtble, *PPArray, Len);        // JudyL hash table for strings of Len
+
+#ifdef DONOTUSEHASH
+    PPBucket = PPHtble;                 // simulate below code
+#else  // USEHASH
+    if (Len > WORDSIZE)
+    {
+        JUDYHASHSTR(HValue, String, Len);       // hash to no more than 32 bits
+
+//  get pointer to hash bucket
+
+        JLG(PPBucket, *PPHtble, (Word_t)HValue);
+    }
+    else
+    {
+        PPBucket = PPHtble;             // no bucket to JLGet
+    }
+#endif // USEHASH
+
+// delete from JudyL tree
+//
+    Ret = delStrJudyLTree(String, Len, PPBucket, PJError);
+    if (Ret != 1)
+    {
+        JU_SET_ERRNO(PJError, 0);
+        return(-1);
+    }
+//  handle case of missing JudyL array from hash table and length table
+
+    if (*PPBucket == (Pvoid_t)NULL)     // if JudyL tree gone
+    {
+#ifndef DONOTUSEHASH
+        if (Len > WORDSIZE)
+        {
+//          delete entry in Hash table
+
+            Ret = JudyLDel(PPHtble, (Word_t)HValue, PJError); 
+            if (Ret != 1)
+            {
+                JU_SET_ERRNO(PJError, 0);
+                return(-1);
+            }
+        }
+#endif // USEHASH
+        if (*PPHtble == (PPvoid_t) NULL)        // if Hash table gone
+        {
+//          delete entry from the String length table
+
+            Ret = JudyLDel(PPArray, Len, PJError); 
+            if (Ret != 1)
+            {
+                JU_SET_ERRNO(PJError, 0);
+                return(-1);
+            }
+        }
+    }
+    return (1);                         // success
+}
+
+static Word_t
+delJudyLTree(PPvoid_t PPValue,                 // ^ to JudyL root pointer
+              Word_t Len,                       // length of string
+              PJError_t PJError)                // for returning error info
+{
+    Word_t    bytes_freed = 0;                  // bytes freed at point
+    Word_t    bytes_total = 0;                  // accumulated bytes freed
+    PPvoid_t  PPValueN;
+
+//  Pointer is to another tree of JudyL arrays or ls_t struct
+
+    if (Len > WORDSIZE)                         // more depth to tree
+    {
+        Word_t NEntry;
+
+//      Pointer is to a ls_t struct
+
+        if (IS_PLS(*PPValue)) 
+        {
+            Pls_t   Pls;
+            Word_t  freewords;
+
+            freewords = LS_WORDLEN(Len);        // calculate length
+            Pls = (Pls_t)CLEAR_PLS(*PPValue);   // demangle pointer
+
+//        *PPValue = (Pvoid_t)NULL;               // clean pointer
+           JudyFree((Pvoid_t)Pls, freewords);   // free the ls_t
+
+            return(freewords * WORDSIZE);
+        }
+//      else
+//      Walk all the entrys in the JudyL array
+
+        NEntry = 0;                             // start at beginning
+        for (PPValueN = JudyLFirst(*PPValue, &NEntry, PJError);
+            (PPValueN != (PPvoid_t) NULL) && (PPValueN != PPJERR);
+             PPValueN = JudyLNext(*PPValue, &NEntry, PJError))
+        {
+//          recurse to the next level in the tree of arrays
+
+            bytes_freed = delJudyLTree(PPValueN, Len - WORDSIZE, PJError);
+            if (bytes_freed == JERR) return(JERR);
+            bytes_total += bytes_freed;
+        }
+        if (PPValueN == PPJERR) return(JERR);
+
+//      now free this JudyL array
+
+        bytes_freed = JudyLFreeArray(PPValue, PJError);
+        if (bytes_freed == JERR) return(JERR);
+        bytes_total += bytes_freed;
+
+        return(bytes_total);  // return amount freed
+    }
+//  else
+
+//  Pointer to simple JudyL array
+
+    bytes_freed = JudyLFreeArray(PPValue, PJError);
+
+    return(bytes_freed);
+}
+
+
+Word_t                                  // bytes freed
+JudyHSFreeArray(PPvoid_t PPArray,       // ^ to JudyHashArray struct
+           PJError_t PJError            // optional, for returning error info
+    )
+{
+    Word_t    Len;                      // start at beginning
+    Word_t    bytes_freed;              // bytes freed at this level.
+    Word_t    bytes_total;              // bytes total at all levels.
+    PPvoid_t  PPHtble;
+
+    if (PPArray == NULL) 
+        return (0);                     // no pointer, return none
+
+//  Walk the string length table for subsidary hash structs
+//  NOTE: This is necessary to determine the depth of the tree
+
+    bytes_freed = 0; 
+    bytes_total = 0;
+    Len = 0;                            // walk to length table
+
+    for (PPHtble  = JudyLFirst(*PPArray, &Len, PJError);
+        (PPHtble != (PPvoid_t) NULL) && (PPHtble != PPJERR);
+         PPHtble  = JudyLNext(*PPArray, &Len, PJError))
+    {
+        PPvoid_t PPValueH;
+
+#ifndef DONOTUSEHASH
+        if (Len > WORDSIZE)
+        {
+            Word_t HEntry = 0;              // walk the hash tables
+
+            for (PPValueH  = JudyLFirst(*PPHtble, &HEntry, PJError);
+                (PPValueH != (PPvoid_t) NULL) && (PPValueH != PPJERR);
+                 PPValueH  = JudyLNext(*PPHtble, &HEntry, PJError))
+            {
+                bytes_freed = delJudyLTree(PPValueH, Len, PJError);
+                if (bytes_freed == JERR) return(JERR);
+                bytes_total += bytes_freed;
+            }
+
+            if (PPValueH == PPJERR) return(JERR);
+
+//          free the Hash table for this length of string
+
+            bytes_freed = JudyLFreeArray(PPHtble, PJError);
+            if (bytes_freed == JERR) return(JERR);
+            bytes_total += bytes_freed;
+        }
+        else
+#endif // DONOTUSEHASH
+        {
+                PPValueH = PPHtble;     // simulate hash table
+
+                bytes_freed = delJudyLTree(PPValueH, Len, PJError);
+                if (bytes_freed == JERR) return(JERR);
+                bytes_total += bytes_freed;
+        }
+    }
+    if (PPHtble == PPJERR) return(JERR);
+
+//  free the length table
+
+    bytes_freed = JudyLFreeArray(PPArray, PJError);
+    if (bytes_freed == JERR) return(JERR);
+
+    bytes_total += bytes_freed;
+
+    return(bytes_total);                // return bytes freed
+}
diff --git a/libs/klib/judy/JudyHS.h b/libs/klib/judy/JudyHS.h
new file mode 100644
index 0000000..b403501
--- /dev/null
+++ b/libs/klib/judy/JudyHS.h
@@ -0,0 +1,35 @@
+// ****************************************************************************
+// Quick and dirty header file for use with old Judy.h without JudyHS defs
+// May 2004 (dlb) - No copyright or license -- it is free period.
+
+#include <stdint.h>
+
+// ****************************************************************************
+// JUDYHSL MACROS:
+
+#define JHSI(PV,    PArray,   PIndex,   Count)                          \
+        J_2P(PV, (&(PArray)), PIndex,   Count, JudyHSIns, "JudyHSIns")
+#define JHSG(PV,    PArray,   PIndex,   Count)                          \
+        (PV) = (Pvoid_t) JudyHSGet(PArray, PIndex, Count)
+#define JHSD(Rc,    PArray,   PIndex,   Count)                          \
+        J_2I(Rc, (&(PArray)), PIndex, Count, JudyHSDel, "JudyHSDel")
+#define JHSFA(Rc,    PArray)                                            \
+        J_0I(Rc, (&(PArray)), JudyHSFreeArray, "JudyHSFreeArray")
+
+// ****************************************************************************
+// JUDY memory interface to malloc() FUNCTIONS:
+
+extern Word_t JudyMalloc(Word_t);               // words reqd => words allocd.
+extern Word_t JudyMallocVirtual(Word_t);        // words reqd => words allocd.
+extern void   JudyFree(Pvoid_t, Word_t);        // block to free and its size in words.
+extern void   JudyFreeVirtual(Pvoid_t, Word_t); // block to free and its size in words.
+
+// ****************************************************************************
+// JUDYHS FUNCTIONS:
+
+extern PPvoid_t JudyHSGet(       Pcvoid_t,  void *, Word_t);
+extern PPvoid_t JudyHSIns(       PPvoid_t,  void *, Word_t, P_JE);
+extern int      JudyHSDel(       PPvoid_t,  void *, Word_t, P_JE);
+extern Word_t   JudyHSFreeArray( PPvoid_t,                  P_JE);
+
+extern uint32_t JudyHashStr(                void *, Word_t);
diff --git a/libs/klib/judy/JudyIns.c b/libs/klib/judy/JudyIns.c
new file mode 100644
index 0000000..d90820b
--- /dev/null
+++ b/libs/klib/judy/JudyIns.c
@@ -0,0 +1,1871 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Judy1Set() and JudyLIns() functions for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+//
+// TBD:  Should some of the assertions here be converted to product code that
+// returns JU_ERRNO_CORRUPT?
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+// Note:  Call JudyCheckPop() even before "already inserted" returns, to catch
+// population errors; see fix in 4.84:
+
+DBGCODE(extern void JudyCheckPop(Pvoid_t PArray);)
+DBGCODE(extern void JudyCheckSorted(Pjll_t Pjll, Word_t Pop1, long IndexSize);)
+
+#ifdef TRACEJP
+#include "JudyPrintJP.c"
+#endif
+
+
+// These are defined to generic values in JudyCommon/JudyPrivateTypes.h:
+//
+// TBD:  These should be exported from a header file, but perhaps not, as they
+// are only used here, and exported from Judy*Decascade, which is a separate
+// file for profiling reasons (to prevent inlining), but which potentially
+// could be merged with this file, either in SoftCM or at compile-time.
+
+#ifdef JUDY1
+extern int j__udy1CreateBranchB(Pjp_t, Pjp_t, uint8_t *, Word_t, Pvoid_t);
+extern int j__udy1CreateBranchU(Pjp_t, Pvoid_t);
+
+#ifndef JU_64BIT
+extern int j__udy1Cascade1(Pjp_t, Pvoid_t);
+#endif
+extern int j__udy1Cascade2(Pjp_t, Pvoid_t);
+extern int j__udy1Cascade3(Pjp_t, Pvoid_t);
+#ifdef JU_64BIT
+extern int j__udy1Cascade4(Pjp_t, Pvoid_t);
+extern int j__udy1Cascade5(Pjp_t, Pvoid_t);
+extern int j__udy1Cascade6(Pjp_t, Pvoid_t);
+extern int j__udy1Cascade7(Pjp_t, Pvoid_t);
+#endif
+extern int j__udy1CascadeL(Pjp_t, Pvoid_t);
+
+extern int j__udy1InsertBranch(Pjp_t Pjp, Word_t Index, Word_t Btype, Pjpm_t);
+
+#else // JUDYL
+
+extern int j__udyLCreateBranchB(Pjp_t, Pjp_t, uint8_t *, Word_t, Pvoid_t);
+extern int j__udyLCreateBranchU(Pjp_t, Pvoid_t);
+
+extern int j__udyLCascade1(Pjp_t, Pvoid_t);
+extern int j__udyLCascade2(Pjp_t, Pvoid_t);
+extern int j__udyLCascade3(Pjp_t, Pvoid_t);
+#ifdef JU_64BIT
+extern int j__udyLCascade4(Pjp_t, Pvoid_t);
+extern int j__udyLCascade5(Pjp_t, Pvoid_t);
+extern int j__udyLCascade6(Pjp_t, Pvoid_t);
+extern int j__udyLCascade7(Pjp_t, Pvoid_t);
+#endif
+extern int j__udyLCascadeL(Pjp_t, Pvoid_t);
+
+extern int j__udyLInsertBranch(Pjp_t Pjp, Word_t Index, Word_t Btype, Pjpm_t);
+#endif
+
+
+// ****************************************************************************
+// MACROS FOR COMMON CODE:
+//
+// Check if Index is an outlier to (that is, not a member of) this expanse:
+//
+// An outlier is an Index in-the-expanse of the slot containing the pointer,
+// but not-in-the-expanse of the "narrow" pointer in that slot.  (This means
+// the Dcd part of the Index differs from the equivalent part of jp_DcdPopO.)
+// Therefore, the remedy is to put a cJU_JPBRANCH_L* between the narrow pointer
+// and the object to which it points, and add the outlier Index as an Immediate
+// in the cJU_JPBRANCH_L*.  The "trick" is placing the cJU_JPBRANCH_L* at a
+// Level that is as low as possible.  This is determined by counting the digits
+// in the existing narrow pointer that are the same as the digits in the new
+// Index (see j__udyInsertBranch()).
+//
+// Note:  At some high Levels, cJU_DCDMASK() is all zeros => dead code; assume
+// the compiler optimizes this out.
+
+#define JU_CHECK_IF_OUTLIER(Pjp, Index, cLevel, Pjpm)                   \
+        if (JU_DCDNOTMATCHINDEX(Index, Pjp, cLevel))                    \
+            return(j__udyInsertBranch(Pjp, Index, cLevel, Pjpm))
+
+// Check if an Index is already in a leaf or immediate, after calling
+// j__udySearchLeaf*() to set Offset:
+//
+// A non-negative Offset means the Index already exists, so return 0; otherwise
+// complement Offset to proceed.
+
+#ifdef JUDY1
+#define Pjv ignore                                      // placeholder.
+#define JU_CHECK_IF_EXISTS(Offset,ignore,Pjpm)  \
+        {                                       \
+            if ((Offset) >= 0) return(0);       \
+            (Offset) = ~(Offset);               \
+        }
+#else
+// For JudyL, also set the value area pointer in the Pjpm:
+
+#define JU_CHECK_IF_EXISTS(Offset,Pjv,Pjpm)             \
+        {                                               \
+            if ((Offset) >= 0)                          \
+            {                                           \
+                (Pjpm)->jpm_PValue = (Pjv) + (Offset);  \
+                return(0);                              \
+            }                                           \
+            (Offset) = ~(Offset);                       \
+        }
+#endif
+
+
+// ****************************************************************************
+// __ J U D Y   I N S   W A L K
+//
+// Walk the Judy tree to do a set/insert.  This is only called internally, and
+// recursively.  Unlike Judy1Test() and JudyLGet(), the extra time required for
+// recursion should be negligible compared with the total.
+//
+// Return -1 for error (details in JPM), 0 for Index already inserted, 1 for
+// new Index inserted.
+
+FUNCTION static int j__udyInsWalk(
+        Pjp_t   Pjp,            // current JP to descend.
+        Word_t  Index,          // to insert.
+        Pjpm_t  Pjpm)           // for returning info to top Level.
+{
+        uint8_t digit;          // from Index, current offset into a branch.
+        jp_t    newJP;          // for creating a new Immed JP.
+        Word_t  exppop1;        // expanse (leaf) population.
+        int     retcode;        // return codes:  -1, 0, 1.
+
+#ifdef SUBEXPCOUNTS
+// Pointer to BranchB/U subexpanse counter:
+//
+// Note:  Very important for performance reasons (avoids cache fills).
+
+        PWord_t PSubExp = (PWord_t) NULL;
+#endif
+
+ContinueInsWalk:                // for modifying state without recursing.
+
+#ifdef TRACEJP
+        JudyPrintJP(Pjp, "i", __LINE__);
+#endif
+
+        switch (JU_JPTYPE(Pjp)) // entry:  Pjp, Index.
+        {
+
+
+// ****************************************************************************
+// JPNULL*:
+//
+// Convert JP in place from current null type to cJU_JPIMMED_*_01 by
+// calculating new JP type.
+
+        case cJU_JPNULL1:
+        case cJU_JPNULL2:
+        case cJU_JPNULL3:
+#ifdef JU_64BIT
+        case cJU_JPNULL4:
+        case cJU_JPNULL5:
+        case cJU_JPNULL6:
+        case cJU_JPNULL7:
+#endif
+            assert((Pjp->jp_Addr) == 0);
+            JU_JPSETADT(Pjp, 0, Index, JU_JPTYPE(Pjp) + cJU_JPIMMED_1_01 - cJU_JPNULL1);
+#ifdef JUDYL
+            // value area is first word of new Immed_01 JP:
+            Pjpm->jpm_PValue = (Pjv_t) (&(Pjp->jp_Addr));
+#endif
+            return(1);
+
+
+// ****************************************************************************
+// JPBRANCH_L*:
+//
+// If the new Index is not an outlier to the branchs expanse, and the branch
+// should not be converted to uncompressed, extract the digit and record the
+// Immediate type to create for a new Immed JP, before going to common code.
+//
+// Note:  JU_CHECK_IF_OUTLIER() is a no-op for BranchB3[7] on 32[64]-bit.
+
+#define JU_BRANCH_OUTLIER(DIGIT,POP1,cLEVEL,PJP,INDEX,PJPM)  \
+        JU_CHECK_IF_OUTLIER(PJP, INDEX, cLEVEL, PJPM);       \
+        (DIGIT) = JU_DIGITATSTATE(INDEX, cLEVEL);            \
+        (POP1)  = JU_JPBRANCH_POP0(PJP, cLEVEL)
+
+        case cJU_JPBRANCH_L2:
+            JU_BRANCH_OUTLIER(digit, exppop1, 2, Pjp, Index, Pjpm);
+            goto JudyBranchL;
+
+        case cJU_JPBRANCH_L3:
+            JU_BRANCH_OUTLIER(digit, exppop1, 3, Pjp, Index, Pjpm);
+            goto JudyBranchL;
+
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_L4:
+            JU_BRANCH_OUTLIER(digit, exppop1, 4, Pjp, Index, Pjpm);
+            goto JudyBranchL;
+
+        case cJU_JPBRANCH_L5:
+            JU_BRANCH_OUTLIER(digit, exppop1, 5, Pjp, Index, Pjpm);
+            goto JudyBranchL;
+
+        case cJU_JPBRANCH_L6:
+            JU_BRANCH_OUTLIER(digit, exppop1, 6, Pjp, Index, Pjpm);
+            goto JudyBranchL;
+
+        case cJU_JPBRANCH_L7:
+            JU_BRANCH_OUTLIER(digit, exppop1, 7, Pjp, Index, Pjpm);
+            goto JudyBranchL;
+#endif
+
+// Similar to common code above, but no outlier check is needed, and the Immed
+// type depends on the word size:
+
+        case cJU_JPBRANCH_L:
+        {
+            Pjbl_t PjblRaw;     // pointer to old linear branch.
+            Pjbl_t Pjbl;
+            Pjbu_t PjbuRaw;     // pointer to new uncompressed branch.
+            Pjbu_t Pjbu;
+            Word_t numJPs;      // number of JPs = populated expanses.
+            int    offset;      // in branch.
+
+            digit = JU_DIGITATSTATE(Index, cJU_ROOTSTATE);
+            exppop1 = Pjpm->jpm_Pop0;
+
+            // fall through:
+
+// COMMON CODE FOR LINEAR BRANCHES:
+//
+// Come here with digit and exppop1 already set.
+
+JudyBranchL:
+            PjblRaw = (Pjbl_t) (Pjp->jp_Addr);
+            Pjbl    = P_JBL(PjblRaw);
+
+// If population under this branch greater than:
+
+            if (exppop1 > JU_BRANCHL_MAX_POP)
+                goto ConvertBranchLtoU;
+
+            numJPs = Pjbl->jbl_NumJPs;
+
+            if ((numJPs == 0) || (numJPs > cJU_BRANCHLMAXJPS))
+            {
+                JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT);
+                return(-1);
+            }
+
+// Search for a match to the digit:
+
+            offset = j__udySearchLeaf1((Pjll_t) (Pjbl->jbl_Expanse), numJPs,
+                                       digit);
+
+// If Index is found, offset is into an array of 1..cJU_BRANCHLMAXJPS JPs:
+
+            if (offset >= 0)
+            {
+                Pjp = (Pjbl->jbl_jp) + offset;  // address of next JP.
+                break;                          // continue walk.
+            }
+
+// Expanse is missing (not populated) for the passed Index, so insert an Immed
+// -- if theres room:
+
+            if (numJPs < cJU_BRANCHLMAXJPS)
+            {
+                offset = ~offset;       // insertion offset.
+
+                JU_JPSETADT(&newJP, 0, Index,
+                        JU_JPTYPE(Pjp) + cJU_JPIMMED_1_01-cJU_JPBRANCH_L2);
+
+                JU_INSERTINPLACE(Pjbl->jbl_Expanse, numJPs, offset, digit);
+                JU_INSERTINPLACE(Pjbl->jbl_jp,      numJPs, offset, newJP);
+
+                DBGCODE(JudyCheckSorted((Pjll_t) (Pjbl->jbl_Expanse),
+                                        numJPs + 1, /* IndexSize = */ 1);)
+                ++(Pjbl->jbl_NumJPs);
+#ifdef JUDYL
+                // value area is first word of new Immed 01 JP:
+                Pjpm->jpm_PValue = (Pjv_t) ((Pjbl->jbl_jp) + offset);
+#endif
+                return(1);
+            }
+
+
+// MAXED OUT LINEAR BRANCH, CONVERT TO A BITMAP BRANCH, THEN INSERT:
+//
+// Copy the linear branch to a bitmap branch.
+//
+// TBD:  Consider renaming j__udyCreateBranchB() to j__udyConvertBranchLtoB().
+
+            assert((numJPs) <= cJU_BRANCHLMAXJPS);
+
+            if (j__udyCreateBranchB(Pjp, Pjbl->jbl_jp, Pjbl->jbl_Expanse,
+                                    numJPs, Pjpm) == -1)
+            {
+                return(-1);
+            }
+
+// Convert jp_Type from linear branch to equivalent bitmap branch:
+
+            Pjp->jp_Type += cJU_JPBRANCH_B - cJU_JPBRANCH_L;
+
+            j__udyFreeJBL(PjblRaw, Pjpm);       // free old BranchL.
+
+// Having changed branch types, now do the insert in the new branch type:
+
+            goto ContinueInsWalk;
+
+
+// OPPORTUNISTICALLY CONVERT FROM BRANCHL TO BRANCHU:
+//
+// Memory efficiency is no object because the branchs pop1 is large enough, so
+// speed up array access.  Come here with PjblRaw set.  Note:  This is goto
+// code because the previous block used to fall through into it as well, but no
+// longer.
+
+ConvertBranchLtoU:
+
+// Allocate memory for an uncompressed branch:
+
+            if ((PjbuRaw = j__udyAllocJBU(Pjpm)) == (Pjbu_t) NULL)
+                return(-1);
+            Pjbu = P_JBU(PjbuRaw);
+
+// Set the proper NULL type for most of the uncompressed branchs JPs:
+
+            JU_JPSETADT(&newJP, 0, 0, 
+                    JU_JPTYPE(Pjp) - cJU_JPBRANCH_L2 + cJU_JPNULL1);
+
+// Initialize:  Pre-set uncompressed branch to mostly JPNULL*s:
+
+            for (numJPs = 0; numJPs < cJU_BRANCHUNUMJPS; ++numJPs)
+                Pjbu->jbu_jp[numJPs] = newJP;
+
+// Copy JPs from linear branch to uncompressed branch:
+
+            {
+#ifdef SUBEXPCOUNTS
+                Word_t popmask = cJU_POP0MASK(JU_JPTYPE(Pjp))
+                                             - cJU_JPBRANCH_L2 - 2;
+
+                for (numJPs = 0; numJPs < cJU_NUMSUBEXPU; ++numJPs)
+                    Pjbu->jbu_subPop1[numJPs] = 0;
+#endif
+                for (numJPs = 0; numJPs < Pjbl->jbl_NumJPs; ++numJPs)
+                {
+                    Pjp_t Pjp1           = &(Pjbl->jbl_jp[numJPs]);
+                    offset               = Pjbl->jbl_Expanse[numJPs];
+                    Pjbu->jbu_jp[offset] = *Pjp1;
+#ifdef SUBEXPCOUNTS
+                    Pjbu->jbu_subPop1[offset/cJU_NUMSUBEXPU] +=
+                        JU_JPDCDPOP0(Pjp1) & popmask + 1;
+#endif
+                }
+            }
+            j__udyFreeJBL(PjblRaw, Pjpm);               // free old BranchL.
+
+// Plug new values into parent JP:
+
+            Pjp->jp_Addr  = (Word_t) PjbuRaw;
+            Pjp->jp_Type += cJU_JPBRANCH_U - cJU_JPBRANCH_L;    // to BranchU.
+
+// Save global population of last BranchU conversion:
+
+            Pjpm->jpm_LastUPop0 = Pjpm->jpm_Pop0;
+            goto ContinueInsWalk;
+
+        } // case cJU_JPBRANCH_L.
+
+
+// ****************************************************************************
+// JPBRANCH_B*:
+//
+// If the new Index is not an outlier to the branchs expanse, extract the
+// digit and record the Immediate type to create for a new Immed JP, before
+// going to common code.
+//
+// Note:  JU_CHECK_IF_OUTLIER() is a no-op for BranchB3[7] on 32[64]-bit.
+
+        case cJU_JPBRANCH_B2:
+            JU_BRANCH_OUTLIER(digit, exppop1, 2, Pjp, Index, Pjpm);
+            goto JudyBranchB;
+
+        case cJU_JPBRANCH_B3:
+            JU_BRANCH_OUTLIER(digit, exppop1, 3, Pjp, Index, Pjpm);
+            goto JudyBranchB;
+
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_B4:
+            JU_BRANCH_OUTLIER(digit, exppop1, 4, Pjp, Index, Pjpm);
+            goto JudyBranchB;
+
+        case cJU_JPBRANCH_B5:
+            JU_BRANCH_OUTLIER(digit, exppop1, 5, Pjp, Index, Pjpm);
+            goto JudyBranchB;
+
+        case cJU_JPBRANCH_B6:
+            JU_BRANCH_OUTLIER(digit, exppop1, 6, Pjp, Index, Pjpm);
+            goto JudyBranchB;
+
+        case cJU_JPBRANCH_B7:
+            JU_BRANCH_OUTLIER(digit, exppop1, 7, Pjp, Index, Pjpm);
+            goto JudyBranchB;
+#endif
+
+        case cJU_JPBRANCH_B:
+        {
+            Pjbb_t    Pjbb;             // pointer to bitmap branch.
+            Pjbb_t    PjbbRaw;          // pointer to bitmap branch.
+            Pjp_t     Pjp2Raw;          // 1 of N arrays of JPs.
+            Pjp_t     Pjp2;             // 1 of N arrays of JPs.
+            Word_t    subexp;           // 1 of N subexpanses in bitmap.
+            BITMAPB_t bitmap;           // for one subexpanse.
+            BITMAPB_t bitmask;          // bit set for Indexs digit.
+            Word_t    numJPs;           // number of JPs = populated expanses.
+            int       offset;           // in bitmap branch.
+
+// Similar to common code above, but no outlier check is needed, and the Immed
+// type depends on the word size:
+
+            digit   = JU_DIGITATSTATE(Index, cJU_ROOTSTATE);
+            exppop1 = Pjpm->jpm_Pop0;
+
+            // fall through:
+
+
+// COMMON CODE FOR BITMAP BRANCHES:
+//
+// Come here with digit and exppop1 already set.
+
+JudyBranchB:
+
+// If population increment is greater than..  (300):
+
+            if ((Pjpm->jpm_Pop0 - Pjpm->jpm_LastUPop0) > JU_BTOU_POP_INCREMENT)
+            {
+
+// If total population of array is greater than..  (750):
+
+                if (Pjpm->jpm_Pop0 > JU_BRANCHB_MAX_POP)
+                {
+
+// If population under the branch is greater than..  (135):
+
+                    if (exppop1 > JU_BRANCHB_MIN_POP)
+                    {
+                        if (j__udyCreateBranchU(Pjp, Pjpm) == -1) return(-1);
+
+// Save global population of last BranchU conversion:
+
+                        Pjpm->jpm_LastUPop0 = Pjpm->jpm_Pop0;
+
+                        goto ContinueInsWalk;
+                    }
+                }
+            }
+
+// CONTINUE TO USE BRANCHB:
+//
+// Get pointer to bitmap branch (JBB):
+
+            PjbbRaw = (Pjbb_t) (Pjp->jp_Addr);
+            Pjbb    = P_JBB(PjbbRaw);
+
+// Form the Int32 offset, and Bit offset values:
+//
+// 8 bit Decode | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+//              |SubExpanse |    Bit offset     |
+//
+// Get the 1 of 8 expanses from digit, Bits 5..7 = 1 of 8, and get the 32-bit
+// word that may have a bit set:
+
+            subexp = digit / cJU_BITSPERSUBEXPB;
+            bitmap = JU_JBB_BITMAP(Pjbb, subexp);
+
+            Pjp2Raw = JU_JBB_PJP(Pjbb, subexp);
+            Pjp2    = P_JP(Pjp2Raw);
+
+// Get the bit position that represents the desired expanse, and get the offset
+// into the array of JPs for the JP that matches the bit.
+
+            bitmask = JU_BITPOSMASKB(digit);
+            offset  = j__udyCountBitsB(bitmap & (bitmask - 1));
+
+// If JP is already in this expanse, get Pjp and continue the walk:
+
+            if (bitmap & bitmask)
+            {
+#ifdef SUBEXPCOUNTS
+                PSubExp = &(Pjbb->jbb_Counts[subexp]);  // ptr to subexp counts.
+#endif
+                Pjp =  Pjp2 + offset;
+                break;                                  // continue walk.
+            }
+
+
+// ADD NEW EXPANSE FOR NEW INDEX:
+//
+// The new expanse always an cJU_JPIMMED_*_01 containing just the new Index, so
+// finish setting up an Immed JP.
+
+            JU_JPSETADT(&newJP, 0, Index, 
+                JU_JPTYPE(Pjp) + cJU_JPIMMED_1_01-cJU_JPBRANCH_B2);
+
+// Get 1 of the 8 JP arrays and calculate number of JPs in subexpanse array:
+
+            Pjp2Raw = JU_JBB_PJP(Pjbb, subexp);
+            Pjp2    = P_JP(Pjp2Raw);
+            numJPs  = j__udyCountBitsB(bitmap);
+
+// Expand branch JP subarray in-place:
+
+            if (JU_BRANCHBJPGROWINPLACE(numJPs))
+            {
+                assert(numJPs > 0);
+                JU_INSERTINPLACE(Pjp2, numJPs, offset, newJP);
+#ifdef JUDYL
+                // value area is first word of new Immed 01 JP:
+                Pjpm->jpm_PValue = (Pjv_t) (Pjp2 + offset);
+#endif
+            }
+
+// No room, allocate a bigger bitmap branch JP subarray:
+
+            else
+            {
+                Pjp_t PjpnewRaw;
+                Pjp_t Pjpnew;
+
+                if ((PjpnewRaw = j__udyAllocJBBJP(numJPs + 1, Pjpm)) == 0)
+                    return(-1);
+                Pjpnew = P_JP(PjpnewRaw);
+
+// If there was an old JP array, then copy it, insert the new Immed JP, and
+// free the old array:
+
+                if (numJPs)
+                {
+                    JU_INSERTCOPY(Pjpnew, Pjp2, numJPs, offset, newJP);
+                    j__udyFreeJBBJP(Pjp2Raw, numJPs, Pjpm);
+#ifdef JUDYL
+                    // value area is first word of new Immed 01 JP:
+                    Pjpm->jpm_PValue = (Pjv_t) (Pjpnew + offset);
+#endif
+                }
+
+// New JP subarray; point to cJU_JPIMMED_*_01 and place it:
+
+                else
+                {
+                    assert(JU_JBB_PJP(Pjbb, subexp) == (Pjp_t) NULL);
+                     Pjp = Pjpnew;
+                    *Pjp = newJP;               // copy to new memory.
+#ifdef JUDYL
+                    // value area is first word of new Immed 01 JP:
+                    Pjpm->jpm_PValue = (Pjv_t) (&(Pjp->jp_Addr));
+#endif
+                }
+
+// Place new JP subarray in BranchB:
+
+                JU_JBB_PJP(Pjbb, subexp) = PjpnewRaw;
+
+            } // else
+
+// Set the new Indexs bit:
+
+            JU_JBB_BITMAP(Pjbb, subexp) |= bitmask;
+
+            return(1);
+
+        } // case
+
+
+// ****************************************************************************
+// JPBRANCH_U*:
+//
+// Just drop through the JP for the correct digit.  If the JP turns out to be a
+// JPNULL*, thats OK, the memory is already allocated, and the next walk
+// simply places an Immed in it.
+//
+#ifdef SUBEXPCOUNTS
+#define JU_GETSUBEXP(PSubExp,Pjbu,Digit) \
+        (PSubExp) = &((Pjbu)->jbu_subPop1[(Digit) / cJU_NUMSUBEXPU])
+#else
+#define JU_GETSUBEXP(PSubExp,Pjbu,Digit)  // null.
+#endif
+
+#define JU_JBU_PJP_SUBEXP(Pjp,PSubExp,Index,Level)              \
+        {                                                       \
+            uint8_t digit = JU_DIGITATSTATE(Index, Level);      \
+            Pjbu_t  P_jbu  = P_JBU((Pjp)->jp_Addr);             \
+            (Pjp) = &(P_jbu->jbu_jp[digit]);                    \
+            JU_GETSUBEXP(PSubExp, P_jbu, digit);                \
+        }
+
+        case cJU_JPBRANCH_U2:
+            JU_CHECK_IF_OUTLIER(Pjp, Index, 2, Pjpm);
+            JU_JBU_PJP_SUBEXP(Pjp, PSubExp, Index, 2);
+            break;
+
+#ifdef JU_64BIT
+        case cJU_JPBRANCH_U3:
+            JU_CHECK_IF_OUTLIER(Pjp, Index, 3, Pjpm);
+            JU_JBU_PJP_SUBEXP(Pjp, PSubExp, Index, 3);
+            break;
+
+        case cJU_JPBRANCH_U4:
+            JU_CHECK_IF_OUTLIER(Pjp, Index, 4, Pjpm);
+            JU_JBU_PJP_SUBEXP(Pjp, PSubExp, Index, 4);
+            break;
+
+        case cJU_JPBRANCH_U5:
+            JU_CHECK_IF_OUTLIER(Pjp, Index, 5, Pjpm);
+            JU_JBU_PJP_SUBEXP(Pjp, PSubExp, Index, 5);
+            break;
+
+        case cJU_JPBRANCH_U6:
+            JU_CHECK_IF_OUTLIER(Pjp, Index, 6, Pjpm);
+            JU_JBU_PJP_SUBEXP(Pjp, PSubExp, Index, 6);
+            break;
+
+        case cJU_JPBRANCH_U7:
+            JU_JBU_PJP_SUBEXP(Pjp, PSubExp, Index, 7);
+#else
+        case cJU_JPBRANCH_U3:
+            JU_JBU_PJP_SUBEXP(Pjp, PSubExp, Index, 3);
+#endif
+            break;
+
+        case cJU_JPBRANCH_U:
+            JU_JBU_PJP_SUBEXP(Pjp, PSubExp, Index, cJU_ROOTSTATE);
+            break;
+
+
+// ****************************************************************************
+// JPLEAF*:
+//
+// COMMON CODE FRAGMENTS TO MINIMIZE REDUNDANCY BELOW:
+//
+// These are necessary to support performance by function and loop unrolling
+// while avoiding huge amounts of nearly identical code.
+//
+// Prepare to handle a linear leaf:  Check for an outlier; set pop1 and pointer
+// to leaf:
+
+#ifdef JUDY1
+#define JU_LEAFVALUE(Pjv)                       // null.
+#define JU_LEAFPREPVALUE(Pjv, ValueArea)        // null.
+#else
+#define JU_LEAFVALUE(Pjv)                Pjv_t Pjv
+#define JU_LEAFPREPVALUE(Pjv, ValueArea) (Pjv) = ValueArea(Pleaf, exppop1)
+#endif
+
+#define JU_LEAFPREP(cIS,Type,MaxPop1,ValueArea)         \
+        Pjll_t  PjllRaw;                                \
+        Type    Pleaf;  /* specific type */             \
+        int     offset;                                 \
+        JU_LEAFVALUE(Pjv);                              \
+                                                        \
+        JU_CHECK_IF_OUTLIER(Pjp, Index, cIS, Pjpm);     \
+                                                        \
+        exppop1 = JU_JPLEAF_POP0(Pjp) + 1;              \
+        assert(exppop1 <= (MaxPop1));                   \
+        PjllRaw = (Pjll_t) (Pjp->jp_Addr);              \
+        Pleaf   = (Type) P_JLL(PjllRaw);                \
+        JU_LEAFPREPVALUE(Pjv, ValueArea)
+
+// Add to, or grow, a linear leaf:  Find Index position; if the Index is
+// absent, if theres room in the leaf, insert the Index [and value of 0] in
+// place, otherwise grow the leaf:
+//
+// Note:  These insertions always take place with whole words, using
+// JU_INSERTINPLACE() or JU_INSERTCOPY().
+
+#ifdef JUDY1
+#define JU_LEAFGROWVALUEADD(Pjv,ExpPop1,Offset)  // null.
+#else
+#define JU_LEAFGROWVALUEADD(Pjv,ExpPop1,Offset)         \
+        JU_INSERTINPLACE(Pjv, ExpPop1, Offset, 0);      \
+        Pjpm->jpm_PValue = (Pjv) + (Offset)
+#endif
+
+#ifdef JUDY1
+#define JU_LEAFGROWVALUENEW(ValueArea,Pjv,ExpPop1,Offset)  // null.
+#else
+#define JU_LEAFGROWVALUENEW(ValueArea,Pjv,ExpPop1,Offset)               \
+        {                                                               \
+            Pjv_t Pjvnew = ValueArea(Pleafnew, (ExpPop1) + 1);          \
+            JU_INSERTCOPY(Pjvnew, Pjv, ExpPop1, Offset, 0);             \
+            Pjpm->jpm_PValue = (Pjvnew) + (Offset);                     \
+        }
+#endif
+
+#define JU_LEAFGROW(cIS,Type,MaxPop1,Search,ValueArea,GrowInPlace,      \
+                    InsertInPlace,InsertCopy,Alloc,Free)                \
+                                                                        \
+        offset = Search(Pleaf, exppop1, Index);                         \
+        JU_CHECK_IF_EXISTS(offset, Pjv, Pjpm);                          \
+                                                                        \
+        if (GrowInPlace(exppop1))       /* add to current leaf */       \
+        {                                                               \
+            InsertInPlace(Pleaf, exppop1, offset, Index);               \
+            JU_LEAFGROWVALUEADD(Pjv, exppop1, offset);                  \
+            DBGCODE(JudyCheckSorted((Pjll_t) Pleaf, exppop1 + 1, cIS);) \
+            return(1);                                                  \
+        }                                                               \
+                                                                        \
+        if (exppop1 < (MaxPop1))        /* grow to new leaf */          \
+        {                                                               \
+            Pjll_t PjllnewRaw;                                          \
+            Type   Pleafnew;                                            \
+            if ((PjllnewRaw = Alloc(exppop1 + 1, Pjpm)) == 0) return(-1); \
+            Pleafnew = (Type) P_JLL(PjllnewRaw);                        \
+            InsertCopy(Pleafnew, Pleaf, exppop1, offset, Index);        \
+            JU_LEAFGROWVALUENEW(ValueArea, Pjv, exppop1, offset);       \
+            DBGCODE(JudyCheckSorted((Pjll_t) Pleafnew, exppop1 + 1, cIS);) \
+            Free(PjllRaw, exppop1, Pjpm);                               \
+            (Pjp->jp_Addr) = (Word_t) PjllnewRaw;                       \
+            return(1);                                                  \
+        }                                                               \
+        assert(exppop1 == (MaxPop1))
+
+// Handle linear leaf overflow (cascade):  Splay or compress into smaller
+// leaves:
+
+#define JU_LEAFCASCADE(MaxPop1,Cascade,Free)            \
+        if (Cascade(Pjp, Pjpm) == -1) return(-1);       \
+        Free(PjllRaw, MaxPop1, Pjpm);                   \
+        goto ContinueInsWalk
+
+// Wrapper around all of the above:
+
+#define JU_LEAFSET(cIS,Type,MaxPop1,Search,GrowInPlace,InsertInPlace,   \
+                   InsertCopy,Cascade,Alloc,Free,ValueArea)             \
+        {                                                               \
+            JU_LEAFPREP(cIS,Type,MaxPop1,ValueArea);                    \
+            JU_LEAFGROW(cIS,Type,MaxPop1,Search,ValueArea,GrowInPlace,  \
+                        InsertInPlace,InsertCopy,Alloc,Free);           \
+            JU_LEAFCASCADE(MaxPop1,Cascade,Free);                       \
+        }
+
+// END OF MACROS; LEAFL CASES START HERE:
+//
+// 64-bit Judy1 does not have 1-byte leaves:
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+
+        case cJU_JPLEAF1:
+
+            JU_LEAFSET(1, uint8_t *, cJU_LEAF1_MAXPOP1, j__udySearchLeaf1,
+                       JU_LEAF1GROWINPLACE, JU_INSERTINPLACE, JU_INSERTCOPY,
+                       j__udyCascade1, j__udyAllocJLL1, j__udyFreeJLL1,
+                       JL_LEAF1VALUEAREA);
+
+#endif // (JUDYL || ! JU_64BIT)
+
+        case cJU_JPLEAF2:
+
+            JU_LEAFSET(2, uint16_t *, cJU_LEAF2_MAXPOP1, j__udySearchLeaf2,
+                       JU_LEAF2GROWINPLACE, JU_INSERTINPLACE, JU_INSERTCOPY,
+                       j__udyCascade2, j__udyAllocJLL2, j__udyFreeJLL2,
+                       JL_LEAF2VALUEAREA);
+
+        case cJU_JPLEAF3:
+
+            JU_LEAFSET(3, uint8_t *, cJU_LEAF3_MAXPOP1, j__udySearchLeaf3,
+                       JU_LEAF3GROWINPLACE, JU_INSERTINPLACE3, JU_INSERTCOPY3,
+                       j__udyCascade3, j__udyAllocJLL3, j__udyFreeJLL3,
+                       JL_LEAF3VALUEAREA);
+
+#ifdef JU_64BIT
+        case cJU_JPLEAF4:
+
+            JU_LEAFSET(4, uint32_t *, cJU_LEAF4_MAXPOP1, j__udySearchLeaf4,
+                       JU_LEAF4GROWINPLACE, JU_INSERTINPLACE, JU_INSERTCOPY,
+                       j__udyCascade4, j__udyAllocJLL4, j__udyFreeJLL4,
+                       JL_LEAF4VALUEAREA);
+
+        case cJU_JPLEAF5:
+
+            JU_LEAFSET(5, uint8_t *, cJU_LEAF5_MAXPOP1, j__udySearchLeaf5,
+                       JU_LEAF5GROWINPLACE, JU_INSERTINPLACE5, JU_INSERTCOPY5,
+                       j__udyCascade5, j__udyAllocJLL5, j__udyFreeJLL5,
+                       JL_LEAF5VALUEAREA);
+
+        case cJU_JPLEAF6:
+
+            JU_LEAFSET(6, uint8_t *, cJU_LEAF6_MAXPOP1, j__udySearchLeaf6,
+                       JU_LEAF6GROWINPLACE, JU_INSERTINPLACE6, JU_INSERTCOPY6,
+                       j__udyCascade6, j__udyAllocJLL6, j__udyFreeJLL6,
+                       JL_LEAF6VALUEAREA);
+
+        case cJU_JPLEAF7:
+
+            JU_LEAFSET(7, uint8_t *, cJU_LEAF7_MAXPOP1, j__udySearchLeaf7,
+                       JU_LEAF7GROWINPLACE, JU_INSERTINPLACE7, JU_INSERTCOPY7,
+                       j__udyCascade7, j__udyAllocJLL7, j__udyFreeJLL7,
+                       JL_LEAF7VALUEAREA);
+#endif // JU_64BIT
+
+
+// ****************************************************************************
+// JPLEAF_B1:
+//
+// 8 bit Decode | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+//              |SubExpanse |    Bit offset     |
+//
+// Note:  For JudyL, values are stored in 8 subexpanses, each a linear word
+// array of up to 32 values each.
+
+        case cJU_JPLEAF_B1:
+        {
+#ifdef JUDYL
+            Pjv_t     PjvRaw;           // pointer to value part of the leaf.
+            Pjv_t     Pjv;              // pointer to value part of the leaf.
+            Pjv_t     PjvnewRaw;        // new value area.
+            Pjv_t     Pjvnew;           // new value area.
+            Word_t    subexp;           // 1 of 8 subexpanses in bitmap.
+            Pjlb_t    Pjlb;             // pointer to bitmap part of the leaf.
+            BITMAPL_t bitmap;           // for one subexpanse.
+            BITMAPL_t bitmask;          // bit set for Indexs digit.
+            int       offset;           // of index in value area.
+#endif
+
+            JU_CHECK_IF_OUTLIER(Pjp, Index, 1, Pjpm);
+
+#ifdef JUDY1
+
+// If Index (bit) is already set, return now:
+
+            if (JU_BITMAPTESTL(P_JLB(Pjp->jp_Addr), Index)) return(0);
+
+// If bitmap is not full, set the new Indexs bit; otherwise convert to a Full:
+
+            if ((exppop1 = JU_JPLEAF_POP0(Pjp) + 1)
+              < cJU_JPFULLPOPU1_POP0)
+            {
+                JU_BITMAPSETL(P_JLB(Pjp->jp_Addr), Index);
+            }
+            else
+            {
+                j__udyFreeJLB1((Pjlb_t) (Pjp->jp_Addr), Pjpm);  // free LeafB1.
+                Pjp->jp_Type = cJ1_JPFULLPOPU1;
+                Pjp->jp_Addr = 0;
+            }
+
+#else // JUDYL
+
+// This is very different from Judy1 because of the need to return a value area
+// even for an existing Index, or manage the value area for a new Index, and
+// because JudyL has no Full type:
+
+// Get last byte to decode from Index, and pointer to bitmap leaf:
+
+            digit = JU_DIGITATSTATE(Index, 1);
+            Pjlb  = P_JLB(Pjp->jp_Addr);
+
+// Prepare additional values:
+
+            subexp  = digit / cJU_BITSPERSUBEXPL;       // which subexpanse.
+            bitmap  = JU_JLB_BITMAP(Pjlb, subexp);      // subexps 32-bit map.
+            PjvRaw  = JL_JLB_PVALUE(Pjlb, subexp);      // corresponding values.
+            Pjv     = P_JV(PjvRaw);                     // corresponding values.
+            bitmask = JU_BITPOSMASKL(digit);            // mask for Index.
+            offset  = j__udyCountBitsL(bitmap & (bitmask - 1)); // of Index.
+
+// If Index already exists, get value pointer and exit:
+
+            if (bitmap & bitmask)
+            {
+                assert(Pjv);
+                Pjpm->jpm_PValue = Pjv + offset;        // existing value.
+                return(0);
+            }
+
+// Get the total bits set = expanse population of Value area:
+
+            exppop1 = j__udyCountBitsL(bitmap);
+
+// If the value area can grow in place, do it:
+
+            if (JL_LEAFVGROWINPLACE(exppop1))
+            {
+                JU_INSERTINPLACE(Pjv, exppop1, offset, 0);
+                JU_JLB_BITMAP(Pjlb, subexp) |= bitmask;  // set Indexs bit.
+                Pjpm->jpm_PValue = Pjv + offset;          // new value area.
+                return(1);
+            }
+
+// Increase size of value area:
+
+            if ((PjvnewRaw = j__udyLAllocJV(exppop1 + 1, Pjpm))
+             == (Pjv_t) NULL) return(-1);
+            Pjvnew = P_JV(PjvnewRaw);
+
+            if (exppop1)                // have existing value area.
+            {
+                assert(Pjv);
+                JU_INSERTCOPY(Pjvnew, Pjv, exppop1, offset, 0);
+                Pjpm->jpm_PValue = Pjvnew + offset;
+                j__udyLFreeJV(PjvRaw, exppop1, Pjpm);   // free old values.
+            }
+            else                        // first index, new value area:
+            {
+                 Pjpm->jpm_PValue   = Pjvnew;
+                *(Pjpm->jpm_PValue) = 0;
+            }
+
+// Set bit for new Index and place new leaf value area in bitmap:
+
+            JU_JLB_BITMAP(Pjlb, subexp) |= bitmask;
+            JL_JLB_PVALUE(Pjlb, subexp)  = PjvnewRaw;
+
+#endif // JUDYL
+
+            return(1);
+
+        } // case
+
+
+#ifdef JUDY1
+// ****************************************************************************
+// JPFULLPOPU1:
+//
+// If Index is not an outlier, then by definition its already set.
+
+        case cJ1_JPFULLPOPU1:
+
+            JU_CHECK_IF_OUTLIER(Pjp, Index, 1, Pjpm);
+            return(0);
+#endif
+
+
+// ****************************************************************************
+// JPIMMED*:
+//
+// This is some of the most complex code in Judy considering Judy1 versus JudyL
+// and 32-bit versus 64-bit variations.  The following comments attempt to make
+// this clearer.
+//
+// Of the 2 words in a JP, for immediate indexes Judy1 can use 2 words - 1 byte
+// = 7 [15] bytes, but JudyL can only use 1 word - 1 byte = 3 [7] bytes because
+// the other word is needed for a value area or a pointer to a value area.
+//
+// For both Judy1 and JudyL, cJU_JPIMMED_*_01 indexes are in word 2; otherwise
+// for Judy1 only, a list of 2 or more indexes starts in word 1.  JudyL keeps
+// the list in word 2 because word 1 is a pointer (to a LeafV, that is, a leaf
+// containing only values).  Furthermore, cJU_JPIMMED_*_01 indexes are stored
+// all-but-first-byte in jp_DcdPopO, not just the Index Sizes bytes.
+//
+// TBD:  This can be confusing because Doug didnt use data structures for it.
+// Instead he often directly accesses Pjp for the first word and jp_DcdPopO for
+// the second word.  It would be nice to use data structs, starting with
+// jp_1Index and jp_LIndex where possible.
+//
+// Maximum Immed JP types for Judy1/JudyL, depending on Index Size (cIS):
+//
+//          32-bit  64-bit
+//
+//    bytes:  7/ 3   15/ 7   (Judy1/JudyL)
+//
+//    cIS
+//    1_     07/03   15/07   (as in: cJ1_JPIMMED_1_07)
+//    2_     03/01   07/03
+//    3_     02/01   05/02
+//    4_             03/01
+//    5_             03/01
+//    6_             02/01
+//    7_             02/01
+//
+// State transitions while inserting an Index, matching the above table:
+// (Yes, this is very terse...  Study it and it will make sense.)
+// (Note, parts of this diagram are repeated below for quick reference.)
+//
+//      +-- reformat JP here for Judy1 only, from word-2 to word-1
+//      |
+//      |                  JUDY1 || JU_64BIT        JUDY1 && JU_64BIT
+//      V
+// 1_01 => 1_02 => 1_03 => [ 1_04 => ... => 1_07 => [ 1_08..15 => ]] Leaf1 (*)
+// 2_01 =>                 [ 2_02 => 2_03 =>        [ 2_04..07 => ]] Leaf2
+// 3_01 =>                 [ 3_02 =>                [ 3_03..05 => ]] Leaf3
+// JU_64BIT only:
+// 4_01 =>                                         [[ 4_02..03 => ]] Leaf4
+// 5_01 =>                                         [[ 5_02..03 => ]] Leaf5
+// 6_01 =>                                         [[ 6_02     => ]] Leaf6
+// 7_01 =>                                         [[ 7_02     => ]] Leaf7
+//
+// (*) For Judy1 & 64-bit, go directly from cJU_JPIMMED_1_15 to a LeafB1; skip
+//     Leaf1, as described in Judy1.h regarding cJ1_JPLEAF1.
+
+
+// COMMON CODE FRAGMENTS TO MINIMIZE REDUNDANCY BELOW:
+//
+// These are necessary to support performance by function and loop unrolling
+// while avoiding huge amounts of nearly identical code.
+//
+// The differences between Judy1 and JudyL with respect to value area handling
+// are just too large for completely common code between them...  Oh well, some
+// big ifdefs follow.  However, even in the following ifdefd code, use cJU_*,
+// JU_*, and Judy*() instead of cJ1_* / cJL_*, J1_* / JL_*, and
+// Judy1*()/JudyL*(), for minimum diffs.
+//
+// Handle growth of cJU_JPIMMED_*_01 to cJU_JPIMMED_*_02, for an even or odd
+// Index Size (cIS), given oldIndex, Index, and Pjll in the context:
+//
+// Put oldIndex and Index in their proper order.  For odd indexes, must copy
+// bytes.
+
+#ifdef JUDY1
+
+#define JU_IMMSET_01_COPY_EVEN(ignore1,ignore2) \
+        if (oldIndex < Index) { Pjll[0] = oldIndex; Pjll[1] = Index;    } \
+        else                  { Pjll[0] = Index;    Pjll[1] = oldIndex; }
+
+#define JU_IMMSET_01_COPY_ODD(cIS,CopyWord)     \
+        if (oldIndex < Index)                   \
+        {                                       \
+            CopyWord(Pjll + 0,     oldIndex);   \
+            CopyWord(Pjll + (cIS), Index);      \
+        }                                       \
+        else                                    \
+        {                                       \
+            CopyWord(Pjll + 0,    Index);       \
+            CopyWord(Pjll + (cIS), oldIndex);   \
+        }
+
+// The "real" *_01 Copy macro:
+//
+// Trim the high byte off Index, look for a match with the old Index, and if
+// none, insert the new Index in the leaf in the correct place, given Pjp and
+// Index in the context.
+//
+// Note:  A single immediate index lives in the jp_DcdPopO field, but two or
+// more reside starting at Pjp->jp_1Index.
+
+#define JU_IMMSET_01_COPY(cIS,LeafType,NewJPType,Copy,CopyWord) \
+        {                                                       \
+            LeafType Pjll;                                      \
+            Word_t   oldIndex = JU_JPDCDPOP0(Pjp);              \
+                                                                \
+            Index = JU_TRIMTODCDSIZE(Index);                    \
+            if (oldIndex == Index) return(0);                   \
+                                                                \
+            Pjll = (LeafType) (Pjp->jp_1Index);                 \
+            Copy(cIS,CopyWord);                                 \
+            DBGCODE(JudyCheckSorted(Pjll, 2, cIS);)             \
+                                                                \
+            Pjp->jp_Type = (NewJPType);                         \
+            return(1);                                          \
+        }
+
+#else // JUDYL
+
+// Variations to also handle value areas; see comments above:
+//
+// For JudyL, Pjv (start of value area) and oldValue are also in the context;
+// leave Pjv set to the value area for Index.
+
+#define JU_IMMSET_01_COPY_EVEN(cIS,CopyWord)    \
+        if (oldIndex < Index)                   \
+        {                                       \
+            Pjll[0] = oldIndex;                 \
+            Pjv [0] = oldValue;                 \
+            Pjll[1] = Index;                    \
+            ++Pjv;                              \
+        }                                       \
+        else                                    \
+        {                                       \
+            Pjll[0] = Index;                    \
+            Pjll[1] = oldIndex;                 \
+            Pjv [1] = oldValue;                 \
+        }
+
+#define JU_IMMSET_01_COPY_ODD(cIS,CopyWord)     \
+        if (oldIndex < Index)                   \
+        {                                       \
+            CopyWord(Pjll + 0,     oldIndex);   \
+            CopyWord(Pjll + (cIS), Index);      \
+            Pjv[0] = oldValue;                  \
+            ++Pjv;                              \
+        }                                       \
+        else                                    \
+        {                                       \
+            CopyWord(Pjll + 0,    Index);       \
+            CopyWord(Pjll + (cIS), oldIndex);   \
+            Pjv[1] = oldValue;                  \
+        }
+
+// The old value area is in the first word (*Pjp), and Pjv and Pjpm are also in
+// the context.  Also, unlike Judy1, indexes remain in word 2 (jp_LIndex),
+// meaning insert-in-place rather than copy.
+//
+// Return jpm_PValue pointing to Indexs value area.  If Index is new, allocate
+// a 2-value-leaf and attach it to the JP.
+
+#define JU_IMMSET_01_COPY(cIS,LeafType,NewJPType,Copy,CopyWord) \
+        {                                                       \
+            LeafType Pjll;                                      \
+            Word_t   oldIndex = JU_JPDCDPOP0(Pjp);              \
+            Word_t   oldValue;                                  \
+            Pjv_t    PjvRaw;                                    \
+            Pjv_t    Pjv;                                       \
+                                                                \
+            Index = JU_TRIMTODCDSIZE(Index);                    \
+                                                                \
+            if (oldIndex == Index)                              \
+            {                                                   \
+                Pjpm->jpm_PValue = (Pjv_t) Pjp;                 \
+                return(0);                                      \
+            }                                                   \
+                                                                \
+            if ((PjvRaw = j__udyLAllocJV(2, Pjpm)) == (Pjv_t) NULL) \
+                return(-1);                                     \
+            Pjv = P_JV(PjvRaw);                                 \
+                                                                \
+            oldValue       = Pjp->jp_Addr;                      \
+            (Pjp->jp_Addr) = (Word_t) PjvRaw;                   \
+            Pjll           = (LeafType) (Pjp->jp_LIndex);       \
+                                                                \
+            Copy(cIS,CopyWord);                                 \
+            DBGCODE(JudyCheckSorted(Pjll, 2, cIS);)             \
+                                                                \
+            Pjp->jp_Type   = (NewJPType);                       \
+            *Pjv             = 0;                               \
+            Pjpm->jpm_PValue = Pjv;                             \
+            return(1);                                          \
+        }
+
+// The following is a unique mix of JU_IMMSET_01() and JU_IMMSETCASCADE() for
+// going from cJU_JPIMMED_*_01 directly to a cJU_JPLEAF* for JudyL:
+//
+// If Index is not already set, allocate a leaf, copy the old and new indexes
+// into it, clear and return the new value area, and modify the current JP.
+// Note that jp_DcdPop is set to a pop0 of 0 for now, and incremented later.
+
+
+#define JU_IMMSET_01_CASCADE(cIS,LeafType,NewJPType,ValueArea,  \
+                             Copy,CopyWord,Alloc)               \
+        {                                                       \
+            Word_t   D_P0;                                      \
+            LeafType PjllRaw;                                   \
+            LeafType Pjll;                                      \
+            Word_t   oldIndex = JU_JPDCDPOP0(Pjp);              \
+            Word_t   oldValue;                                  \
+            Pjv_t    Pjv;                                       \
+                                                                \
+            Index = JU_TRIMTODCDSIZE(Index);                    \
+                                                                \
+            if (oldIndex == Index)                              \
+            {                                                   \
+                Pjpm->jpm_PValue = (Pjv_t) (&(Pjp->jp_Addr));   \
+                return(0);                                      \
+            }                                                   \
+                                                                \
+            if ((PjllRaw = (LeafType) Alloc(2, Pjpm)) == (LeafType) NULL) \
+                return(-1);                                     \
+            Pjll = (LeafType) P_JLL(PjllRaw);                   \
+            Pjv  = ValueArea(Pjll, 2);                          \
+                                                                \
+            oldValue = Pjp->jp_Addr;                            \
+                                                                \
+            Copy(cIS,CopyWord);                                 \
+            DBGCODE(JudyCheckSorted(Pjll, 2, cIS);)             \
+                                                                \
+            *Pjv = 0;                                           \
+            Pjpm->jpm_PValue  = Pjv;                            \
+            D_P0 = Index & cJU_DCDMASK(cIS); /* pop0 = 0 */     \
+            JU_JPSETADT(Pjp, (Word_t)PjllRaw, D_P0, NewJPType); \
+                                                                \
+            return(1);                                          \
+        }
+
+#endif // JUDYL
+
+// Handle growth of cJU_JPIMMED_*_[02..15]:
+
+#ifdef JUDY1
+
+// Insert an Index into an immediate JP that has room for more, if the Index is
+// not already present; given Pjp, Index, exppop1, Pjv, and Pjpm in the
+// context:
+//
+// Note:  Use this only when the JP format doesnt change, that is, going from
+// cJU_JPIMMED_X_0Y to cJU_JPIMMED_X_0Z, where X >= 2 and Y+1 = Z.
+//
+// Note:  Incrementing jp_Type is how to increase the Index population.
+
+#define JU_IMMSETINPLACE(cIS,LeafType,BaseJPType_02,Search,InsertInPlace) \
+        {                                                               \
+            LeafType Pjll;                                              \
+            int      offset;                                            \
+                                                                        \
+            exppop1 = JU_JPTYPE(Pjp) - (BaseJPType_02) + 2;             \
+            offset  = Search((Pjll_t) (Pjp->jp_1Index), exppop1, Index); \
+                                                                        \
+            JU_CHECK_IF_EXISTS(offset, ignore, Pjpm);                   \
+                                                                        \
+            Pjll = (LeafType) (Pjp->jp_1Index);                         \
+            InsertInPlace(Pjll, exppop1, offset, Index);                \
+            DBGCODE(JudyCheckSorted(Pjll, exppop1 + 1, cIS);)           \
+            ++(Pjp->jp_Type);                                           \
+            return(1);                                                  \
+        }
+
+// Insert an Index into an immediate JP that has no room for more:
+//
+// If the Index is not already present, do a cascade (to a leaf); given Pjp,
+// Index, Pjv, and Pjpm in the context.
+
+
+#define JU_IMMSETCASCADE(cIS,OldPop1,LeafType,NewJPType,                \
+                         ignore,Search,InsertCopy,Alloc)                \
+        {                                                               \
+            Word_t   D_P0;                                              \
+            Pjll_t PjllRaw;                                             \
+            Pjll_t Pjll;                                                \
+            int    offset;                                              \
+                                                                        \
+            offset = Search((Pjll_t) (Pjp->jp_1Index), (OldPop1), Index); \
+            JU_CHECK_IF_EXISTS(offset, ignore, Pjpm);                   \
+                                                                        \
+            if ((PjllRaw = Alloc((OldPop1) + 1, Pjpm)) == 0) return(-1); \
+            Pjll = P_JLL(PjllRaw);                                      \
+                                                                        \
+            InsertCopy((LeafType) Pjll, (LeafType) (Pjp->jp_1Index),    \
+                       OldPop1, offset, Index);                         \
+            DBGCODE(JudyCheckSorted(Pjll, (OldPop1) + 1, cIS);)         \
+                                                                        \
+            D_P0 = (Index & cJU_DCDMASK(cIS)) + (OldPop1) - 1;          \
+            JU_JPSETADT(Pjp, (Word_t)PjllRaw, D_P0, NewJPType);         \
+            return(1);                                                  \
+        }
+
+#else // JUDYL
+
+// Variations to also handle value areas; see comments above:
+//
+// For JudyL, Pjv (start of value area) is also in the context.
+//
+// TBD:  This code makes a true but weak assumption that a JudyL 32-bit 2-index
+// value area must be copied to a new 3-index value area.  AND it doesnt know
+// anything about JudyL 64-bit cases (cJU_JPIMMED_1_0[3-7] only) where the
+// value area can grow in place!  However, this should not break it, just slow
+// it down.
+
+#define JU_IMMSETINPLACE(cIS,LeafType,BaseJPType_02,Search,InsertInPlace) \
+        {                                                                 \
+            LeafType Pleaf;                                               \
+            int      offset;                                              \
+            Pjv_t    PjvRaw;                                              \
+            Pjv_t    Pjv;                                                 \
+            Pjv_t    PjvnewRaw;                                           \
+            Pjv_t    Pjvnew;                                              \
+                                                                          \
+            exppop1 = JU_JPTYPE(Pjp) - (BaseJPType_02) + 2;               \
+            offset  = Search((Pjll_t) (Pjp->jp_LIndex), exppop1, Index);  \
+            PjvRaw  = (Pjv_t) (Pjp->jp_Addr);                             \
+            Pjv     = P_JV(PjvRaw);                                       \
+                                                                          \
+            JU_CHECK_IF_EXISTS(offset, Pjv, Pjpm);                        \
+                                                                          \
+            if ((PjvnewRaw = j__udyLAllocJV(exppop1 + 1, Pjpm))           \
+             == (Pjv_t) NULL) return(-1);                                 \
+            Pjvnew = P_JV(PjvnewRaw);                                     \
+                                                                          \
+            Pleaf = (LeafType) (Pjp->jp_LIndex);                          \
+                                                                          \
+            InsertInPlace(Pleaf, exppop1, offset, Index);                 \
+            /* see TBD above about this: */                               \
+            JU_INSERTCOPY(Pjvnew, Pjv, exppop1, offset, 0);               \
+            DBGCODE(JudyCheckSorted(Pleaf, exppop1 + 1, cIS);)            \
+            j__udyLFreeJV(PjvRaw, exppop1, Pjpm);                         \
+            Pjp->jp_Addr     = (Word_t) PjvnewRaw;                        \
+            Pjpm->jpm_PValue = Pjvnew + offset;                           \
+                                                                          \
+            ++(Pjp->jp_Type);                                             \
+            return(1);                                                    \
+        }
+
+#define JU_IMMSETCASCADE(cIS,OldPop1,LeafType,NewJPType,                \
+                         ValueArea,Search,InsertCopy,Alloc)             \
+        {                                                               \
+            Word_t   D_P0;                                      \
+            Pjll_t PjllRaw;                                             \
+            Pjll_t Pjll;                                                \
+            int    offset;                                              \
+            Pjv_t  PjvRaw;                                              \
+            Pjv_t  Pjv;                                                 \
+            Pjv_t  Pjvnew;                                              \
+                                                                        \
+            PjvRaw = (Pjv_t) (Pjp->jp_Addr);                            \
+            Pjv    = P_JV(PjvRaw);                                      \
+            offset = Search((Pjll_t) (Pjp->jp_LIndex), (OldPop1), Index); \
+            JU_CHECK_IF_EXISTS(offset, Pjv, Pjpm);                      \
+                                                                        \
+            if ((PjllRaw = Alloc((OldPop1) + 1, Pjpm)) == 0)            \
+                return(-1);                                             \
+            Pjll = P_JLL(PjllRaw);                                      \
+            InsertCopy((LeafType) Pjll, (LeafType) (Pjp->jp_LIndex),    \
+                       OldPop1, offset, Index);                         \
+            DBGCODE(JudyCheckSorted(Pjll, (OldPop1) + 1, cIS);)         \
+                                                                        \
+            Pjvnew = ValueArea(Pjll, (OldPop1) + 1);                    \
+            JU_INSERTCOPY(Pjvnew, Pjv, OldPop1, offset, 0);             \
+            j__udyLFreeJV(PjvRaw, (OldPop1), Pjpm);                     \
+            Pjpm->jpm_PValue = Pjvnew + offset;                         \
+                                                                        \
+            D_P0 = (Index & cJU_DCDMASK(cIS)) + (OldPop1) - 1;          \
+            JU_JPSETADT(Pjp, (Word_t)PjllRaw, D_P0, NewJPType);         \
+            return(1);                                                  \
+        }
+
+#endif // JUDYL
+
+// Common convenience/shorthand wrappers around JU_IMMSET_01_COPY() for
+// even/odd index sizes:
+
+#define JU_IMMSET_01(     cIS, LeafType, NewJPType) \
+        JU_IMMSET_01_COPY(cIS, LeafType, NewJPType, JU_IMMSET_01_COPY_EVEN, \
+                          ignore)
+
+#define JU_IMMSET_01_ODD( cIS,            NewJPType, CopyWord) \
+        JU_IMMSET_01_COPY(cIS, uint8_t *, NewJPType, JU_IMMSET_01_COPY_ODD, \
+                          CopyWord)
+
+
+// END OF MACROS; IMMED CASES START HERE:
+
+// cJU_JPIMMED_*_01 cases:
+//
+// 1_01 always leads to 1_02:
+//
+// (1_01 => 1_02 => 1_03 => [ 1_04 => ... => 1_07 => [ 1_08..15 => ]] LeafL)
+
+        case cJU_JPIMMED_1_01: JU_IMMSET_01(1, uint8_t *, cJU_JPIMMED_1_02);
+
+// 2_01 leads to 2_02, and 3_01 leads to 3_02, except for JudyL 32-bit, where
+// they lead to a leaf:
+//
+// (2_01 => [ 2_02 => 2_03 => [ 2_04..07 => ]] LeafL)
+// (3_01 => [ 3_02 =>         [ 3_03..05 => ]] LeafL)
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+        case cJU_JPIMMED_2_01: JU_IMMSET_01(2, uint16_t *, cJU_JPIMMED_2_02);
+        case cJU_JPIMMED_3_01: JU_IMMSET_01_ODD (3, cJU_JPIMMED_3_02,
+                                                 JU_COPY3_LONG_TO_PINDEX);
+#else
+        case cJU_JPIMMED_2_01:
+            JU_IMMSET_01_CASCADE(2, uint16_t *, cJU_JPLEAF2, JL_LEAF2VALUEAREA,
+                                 JU_IMMSET_01_COPY_EVEN, ignore,
+                                 j__udyAllocJLL2);
+        case cJU_JPIMMED_3_01:
+            JU_IMMSET_01_CASCADE(3, uint8_t *,  cJU_JPLEAF3, JL_LEAF3VALUEAREA,
+                                 JU_IMMSET_01_COPY_ODD,
+                                 JU_COPY3_LONG_TO_PINDEX, j__udyAllocJLL3);
+#endif
+
+#ifdef JU_64BIT
+
+// [4-7]_01 lead to [4-7]_02 for Judy1, and to leaves for JudyL:
+//
+// (4_01 => [[ 4_02..03 => ]] LeafL)
+// (5_01 => [[ 5_02..03 => ]] LeafL)
+// (6_01 => [[ 6_02 =>     ]] LeafL)
+// (7_01 => [[ 7_02 =>     ]] LeafL)
+
+#ifdef JUDY1
+        case cJU_JPIMMED_4_01: JU_IMMSET_01(4, uint32_t *, cJ1_JPIMMED_4_02);
+        case cJU_JPIMMED_5_01: JU_IMMSET_01_ODD(5, cJ1_JPIMMED_5_02,
+                                                JU_COPY5_LONG_TO_PINDEX);
+        case cJU_JPIMMED_6_01: JU_IMMSET_01_ODD(6, cJ1_JPIMMED_6_02,
+                                                JU_COPY6_LONG_TO_PINDEX);
+        case cJU_JPIMMED_7_01: JU_IMMSET_01_ODD(7, cJ1_JPIMMED_7_02,
+                                                JU_COPY7_LONG_TO_PINDEX);
+#else // JUDYL
+        case cJU_JPIMMED_4_01:
+            JU_IMMSET_01_CASCADE(4, uint32_t *, cJU_JPLEAF4, JL_LEAF4VALUEAREA,
+                                 JU_IMMSET_01_COPY_EVEN, ignore,
+                                 j__udyAllocJLL4);
+        case cJU_JPIMMED_5_01:
+            JU_IMMSET_01_CASCADE(5, uint8_t *, cJU_JPLEAF5, JL_LEAF5VALUEAREA,
+                                 JU_IMMSET_01_COPY_ODD,
+                                 JU_COPY5_LONG_TO_PINDEX, j__udyAllocJLL5);
+        case cJU_JPIMMED_6_01:
+            JU_IMMSET_01_CASCADE(6, uint8_t *, cJU_JPLEAF6, JL_LEAF6VALUEAREA,
+                                 JU_IMMSET_01_COPY_ODD,
+                                 JU_COPY6_LONG_TO_PINDEX, j__udyAllocJLL6);
+        case cJU_JPIMMED_7_01:
+            JU_IMMSET_01_CASCADE(7, uint8_t *, cJU_JPLEAF7, JL_LEAF7VALUEAREA,
+                                 JU_IMMSET_01_COPY_ODD,
+                                 JU_COPY7_LONG_TO_PINDEX, j__udyAllocJLL7);
+#endif // JUDYL
+#endif // JU_64BIT
+
+// cJU_JPIMMED_1_* cases that can grow in place:
+//
+// (1_01 => 1_02 => 1_03 => [ 1_04 => ... => 1_07 => [ 1_08..15 => ]] LeafL)
+
+        case cJU_JPIMMED_1_02:
+#if (defined(JUDY1) || defined(JU_64BIT))
+        case cJU_JPIMMED_1_03:
+        case cJU_JPIMMED_1_04:
+        case cJU_JPIMMED_1_05:
+        case cJU_JPIMMED_1_06:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJU_JPIMMED_1_07:
+        case cJ1_JPIMMED_1_08:
+        case cJ1_JPIMMED_1_09:
+        case cJ1_JPIMMED_1_10:
+        case cJ1_JPIMMED_1_11:
+        case cJ1_JPIMMED_1_12:
+        case cJ1_JPIMMED_1_13:
+        case cJ1_JPIMMED_1_14:
+#endif
+            JU_IMMSETINPLACE(1, uint8_t *, cJU_JPIMMED_1_02, j__udySearchLeaf1,
+                             JU_INSERTINPLACE);
+
+// cJU_JPIMMED_1_* cases that must cascade:
+//
+// (1_01 => 1_02 => 1_03 => [ 1_04 => ... => 1_07 => [ 1_08..15 => ]] LeafL)
+
+#if (defined(JUDYL) && (! defined(JU_64BIT)))
+        case cJU_JPIMMED_1_03:
+            JU_IMMSETCASCADE(1, 3, uint8_t *, cJU_JPLEAF1, JL_LEAF1VALUEAREA,
+                             j__udySearchLeaf1, JU_INSERTCOPY,
+                             j__udyAllocJLL1);
+#endif
+#if (defined(JUDY1) && (! defined(JU_64BIT)))
+        case cJU_JPIMMED_1_07:
+            JU_IMMSETCASCADE(1, 7, uint8_t *, cJU_JPLEAF1, ignore,
+                             j__udySearchLeaf1, JU_INSERTCOPY,
+                             j__udyAllocJLL1);
+
+#endif
+#if (defined(JUDYL) && defined(JU_64BIT))
+        case cJU_JPIMMED_1_07:
+            JU_IMMSETCASCADE(1, 7, uint8_t *, cJU_JPLEAF1, JL_LEAF1VALUEAREA,
+                             j__udySearchLeaf1, JU_INSERTCOPY,
+                             j__udyAllocJLL1);
+
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+// Special case, as described above, go directly from Immed to LeafB1:
+
+        case cJ1_JPIMMED_1_15:
+        {
+            Word_t DcdP0;
+            int    offset;
+            Pjlb_t PjlbRaw;
+            Pjlb_t Pjlb;
+
+            offset = j__udySearchLeaf1((Pjll_t) Pjp->jp_1Index, 15, Index);
+
+            JU_CHECK_IF_EXISTS(offset, ignore, Pjpm);
+
+// Create a bitmap leaf (special case for Judy1 64-bit only, see usage):  Set
+// new Index in bitmap, copy an Immed1_15 to the bitmap, and set the parent JP
+// EXCEPT jp_DcdPopO, leaving any followup to the caller:
+
+            if ((PjlbRaw = j__udyAllocJLB1(Pjpm)) == (Pjlb_t) NULL)
+                return(-1);
+            Pjlb = P_JLB(PjlbRaw);
+
+            JU_BITMAPSETL(Pjlb, Index);
+
+            for (offset = 0; offset < 15; ++offset)
+                JU_BITMAPSETL(Pjlb, Pjp->jp_1Index[offset]);
+
+//          Set jp_DcdPopO including the current pop0; incremented later:
+            DcdP0 = (Index & cJU_DCDMASK(1)) + 15 - 1;
+            JU_JPSETADT(Pjp, (Word_t)PjlbRaw, DcdP0, cJU_JPLEAF_B1);
+
+            return(1);
+        }
+#endif
+
+// cJU_JPIMMED_[2..7]_[02..15] cases that grow in place or cascade:
+//
+// (2_01 => [ 2_02 => 2_03 => [ 2_04..07 => ]] LeafL)
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+        case cJU_JPIMMED_2_02:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJU_JPIMMED_2_03:
+        case cJ1_JPIMMED_2_04:
+        case cJ1_JPIMMED_2_05:
+        case cJ1_JPIMMED_2_06:
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+            JU_IMMSETINPLACE(2, uint16_t *, cJU_JPIMMED_2_02, j__udySearchLeaf2,
+                             JU_INSERTINPLACE);
+#endif
+
+#undef OLDPOP1
+#if ((defined(JUDY1) && (! defined(JU_64BIT))) || (defined(JUDYL) && defined(JU_64BIT)))
+        case cJU_JPIMMED_2_03:
+#define OLDPOP1 3
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJ1_JPIMMED_2_07:
+#define OLDPOP1 7
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+            JU_IMMSETCASCADE(2, OLDPOP1, uint16_t *, cJU_JPLEAF2,
+                             JL_LEAF2VALUEAREA, j__udySearchLeaf2,
+                             JU_INSERTCOPY, j__udyAllocJLL2);
+#endif
+
+// (3_01 => [ 3_02 => [ 3_03..05 => ]] LeafL)
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJU_JPIMMED_3_02:
+        case cJ1_JPIMMED_3_03:
+        case cJ1_JPIMMED_3_04:
+
+            JU_IMMSETINPLACE(3, uint8_t *, cJU_JPIMMED_3_02, j__udySearchLeaf3,
+                             JU_INSERTINPLACE3);
+#endif
+
+#undef OLDPOP1
+#if ((defined(JUDY1) && (! defined(JU_64BIT))) || (defined(JUDYL) && defined(JU_64BIT)))
+        case cJU_JPIMMED_3_02:
+#define OLDPOP1 2
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+        case cJ1_JPIMMED_3_05:
+#define OLDPOP1 5
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+            JU_IMMSETCASCADE(3, OLDPOP1, uint8_t *, cJU_JPLEAF3,
+                             JL_LEAF3VALUEAREA, j__udySearchLeaf3,
+                             JU_INSERTCOPY3, j__udyAllocJLL3);
+#endif
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+
+// (4_01 => [[ 4_02..03 => ]] LeafL)
+
+        case cJ1_JPIMMED_4_02:
+
+            JU_IMMSETINPLACE(4, uint32_t *, cJ1_JPIMMED_4_02, j__udySearchLeaf4,
+                             JU_INSERTINPLACE);
+
+        case cJ1_JPIMMED_4_03:
+
+            JU_IMMSETCASCADE(4, 3, uint32_t *, cJU_JPLEAF4, ignore,
+                             j__udySearchLeaf4, JU_INSERTCOPY,
+                             j__udyAllocJLL4);
+
+// (5_01 => [[ 5_02..03 => ]] LeafL)
+
+        case cJ1_JPIMMED_5_02:
+
+            JU_IMMSETINPLACE(5, uint8_t *, cJ1_JPIMMED_5_02, j__udySearchLeaf5,
+                             JU_INSERTINPLACE5);
+
+        case cJ1_JPIMMED_5_03:
+
+            JU_IMMSETCASCADE(5, 3, uint8_t *, cJU_JPLEAF5, ignore,
+                             j__udySearchLeaf5, JU_INSERTCOPY5,
+                             j__udyAllocJLL5);
+
+// (6_01 => [[ 6_02 => ]] LeafL)
+
+        case cJ1_JPIMMED_6_02:
+
+            JU_IMMSETCASCADE(6, 2, uint8_t *, cJU_JPLEAF6, ignore,
+                             j__udySearchLeaf6, JU_INSERTCOPY6,
+                             j__udyAllocJLL6);
+
+// (7_01 => [[ 7_02 => ]] LeafL)
+
+        case cJ1_JPIMMED_7_02:
+
+            JU_IMMSETCASCADE(7, 2, uint8_t *, cJU_JPLEAF7, ignore,
+                             j__udySearchLeaf7, JU_INSERTCOPY7,
+                             j__udyAllocJLL7);
+
+#endif // (JUDY1 && JU_64BIT)
+
+
+// ****************************************************************************
+// INVALID JP TYPE:
+
+        default: JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT); return(-1);
+
+        } // switch on JP type
+
+        {
+
+#ifdef SUBEXPCOUNTS
+
+// This code might seem strange here.  However it saves some memory read time
+// during insert (~70nS) because a pipelined processor does not need to "stall"
+// waiting for the memory read to complete.  Hope the compiler is not too smart
+// or dumb and moves the code down to where it looks like it belongs (below a
+// few lines).
+
+            Word_t SubExpCount = 0;     // current subexpanse counter.
+
+            if (PSubExp != (PWord_t) NULL)      // only if BranchB/U.
+                SubExpCount = PSubExp[0];
+#endif
+
+// PROCESS JP -- RECURSIVELY:
+//
+// For non-Immed JP types, if successful, post-increment the population count
+// at this Level.
+
+            retcode = j__udyInsWalk(Pjp, Index, Pjpm);
+
+// Successful insert, increment JP and subexpanse count:
+
+            if ((JU_JPTYPE(Pjp) < cJU_JPIMMED_1_01) && (retcode == 1))
+            {
+                jp_t   JP;
+                Word_t DcdP0;
+#ifdef SUBEXPCOUNTS
+
+// Note:  Pjp must be a pointer to a BranchB/U:
+
+                if (PSubExp != (PWord_t) NULL) PSubExp[0] = SubExpCount + 1;
+#endif
+
+                JP = *Pjp;
+                DcdP0 = JU_JPDCDPOP0(Pjp) + 1;
+                JU_JPSETADT(Pjp, JP.jp_Addr, DcdP0, JU_JPTYPE(&JP));
+            }
+        }
+        return(retcode);
+
+} // j__udyInsWalk()
+
+
+// ****************************************************************************
+// J U D Y   1   S E T
+// J U D Y   L   I N S
+//
+// Main entry point.  See the manual entry for details.
+
+#ifdef JUDY1
+FUNCTION int Judy1Set
+#else
+FUNCTION PPvoid_t JudyLIns
+#endif
+        (
+        PPvoid_t  PPArray,      // in which to insert.
+        Word_t    Index,        // to insert.
+        PJError_t PJError       // optional, for returning error info.
+        )
+{
+#ifdef JUDY1
+#define Pjv       ignore        // placeholders for macros.
+#define Pjvnew    ignore
+#else
+        Pjv_t     Pjv;          // value area in old leaf.
+        Pjv_t     Pjvnew;       // value area in new leaf.
+#endif
+        Pjpm_t    Pjpm;         // array-global info.
+        int       offset;       // position in which to store new Index.
+        Pjlw_t    Pjlw;
+
+
+// CHECK FOR NULL POINTER (error by caller):
+
+        if (PPArray == (PPvoid_t) NULL)
+        {
+            JU_SET_ERRNO(PJError, JU_ERRNO_NULLPPARRAY);
+            JUDY1CODE(return(JERRI );)
+            JUDYLCODE(return(PPJERR);)
+        }
+
+        Pjlw = P_JLW(*PPArray); // first word of leaf.
+
+// ****************************************************************************
+// PROCESS TOP LEVEL "JRP" BRANCHES AND LEAVES:
+
+// ****************************************************************************
+// JRPNULL (EMPTY ARRAY):  BUILD A LEAFW WITH ONE INDEX:
+
+// if a valid empty array (null pointer), so create an array of population == 1:
+
+        if (Pjlw == (Pjlw_t)NULL)
+        {
+            Pjlw_t Pjlwnew;
+
+            Pjlwnew = j__udyAllocJLW(1);
+            JUDY1CODE(JU_CHECKALLOC(Pjlw_t, Pjlwnew, JERRI );)
+            JUDYLCODE(JU_CHECKALLOC(Pjlw_t, Pjlwnew, PPJERR);)
+
+            Pjlwnew[0] = 1 - 1;         // pop0 = 0.
+            Pjlwnew[1] = Index;
+
+            *PPArray = (Pvoid_t) Pjlwnew;
+            DBGCODE(JudyCheckPop(*PPArray);)
+
+  JUDY1CODE(return(1); )
+  JUDYLCODE(Pjlwnew[2] = 0; )           // value area.
+  JUDYLCODE(return((PPvoid_t) (Pjlwnew + 2)); )
+
+        }  // NULL JRP
+
+// ****************************************************************************
+// LEAFW, OTHER SIZE:
+
+        if (JU_LEAFW_POP0(*PPArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
+        {
+            Pjlw_t Pjlwnew;
+            Word_t pop1;
+
+            Pjlw = P_JLW(*PPArray);             // first word of leaf.
+            pop1 = Pjlw[0] + 1;
+
+#ifdef JUDYL
+            Pjv = JL_LEAFWVALUEAREA(Pjlw, pop1);
+#endif
+            offset = j__udySearchLeafW(Pjlw + 1, pop1, Index);
+
+            if (offset >= 0)            // index is already valid:
+            {
+                DBGCODE(JudyCheckPop(*PPArray);)
+                JUDY1CODE(return(0); )
+                JUDYLCODE(return((PPvoid_t) (Pjv + offset)); )
+            }
+
+            offset = ~offset;
+
+// Insert index in cases where no new memory is needed:
+
+            if (JU_LEAFWGROWINPLACE(pop1))
+            {
+                ++Pjlw[0];                      // increase population.
+
+                JU_INSERTINPLACE(Pjlw + 1, pop1, offset, Index);
+#ifdef JUDYL
+                JU_INSERTINPLACE(Pjv, pop1, offset, 0);
+#endif
+                DBGCODE(JudyCheckPop(*PPArray);)
+                DBGCODE(JudyCheckSorted(Pjlw + 1, pop1 + 1, cJU_ROOTSTATE);)
+
+      JUDY1CODE(return(1); )
+      JUDYLCODE(return((PPvoid_t) (Pjv + offset)); )
+            }
+
+// Insert index into a new, larger leaf:
+
+            if (pop1 < cJU_LEAFW_MAXPOP1)       // can grow to a larger leaf.
+            {
+                Pjlwnew = j__udyAllocJLW(pop1 + 1);
+                JUDY1CODE(JU_CHECKALLOC(Pjlw_t, Pjlwnew, JERRI );)
+                JUDYLCODE(JU_CHECKALLOC(Pjlw_t, Pjlwnew, PPJERR);)
+
+                Pjlwnew[0] = pop1;              // set pop0 in new leaf.
+
+                JU_INSERTCOPY(Pjlwnew + 1, Pjlw + 1, pop1, offset, Index);
+#ifdef JUDYL
+                Pjvnew = JL_LEAFWVALUEAREA(Pjlwnew, pop1 + 1);
+                JU_INSERTCOPY(Pjvnew, Pjv, pop1, offset, 0);
+#endif
+                DBGCODE(JudyCheckSorted(Pjlwnew + 1, pop1 + 1, cJU_ROOTSTATE);)
+
+                j__udyFreeJLW(Pjlw, pop1, NULL);
+
+                *PPArray = (Pvoid_t) Pjlwnew;
+                DBGCODE(JudyCheckPop(*PPArray);)
+
+      JUDY1CODE(return(1); )
+      JUDYLCODE(return((PPvoid_t) (Pjvnew + offset)); )
+            }
+
+            assert(pop1 == cJU_LEAFW_MAXPOP1);
+
+// Leaf at max size => cannot insert new index, so cascade instead:
+//
+// Upon cascading from a LEAFW leaf to the first branch, must allocate and
+// initialize a JPM.
+
+            Pjpm = j__udyAllocJPM();
+            JUDY1CODE(JU_CHECKALLOC(Pjpm_t, Pjpm, JERRI );)
+            JUDYLCODE(JU_CHECKALLOC(Pjpm_t, Pjpm, PPJERR);)
+
+            (Pjpm->jpm_Pop0)       = cJU_LEAFW_MAXPOP1 - 1;
+            (Pjpm->jpm_JP.jp_Addr) = (Word_t) Pjlw;
+
+            if (j__udyCascadeL(&(Pjpm->jpm_JP), Pjpm) == -1)
+            {
+                JU_COPY_ERRNO(PJError, Pjpm);
+                JUDY1CODE(return(JERRI );)
+                JUDYLCODE(return(PPJERR);)
+            }
+
+// Note:  No need to pass Pjpm for memory decrement; LEAFW memory is never
+// counted in a JPM at all:
+
+            j__udyFreeJLW(Pjlw, cJU_LEAFW_MAXPOP1, NULL);
+            *PPArray = (Pvoid_t) Pjpm;
+
+        } // JU_LEAFW
+
+// ****************************************************************************
+// BRANCH:
+
+        {
+            int retcode;  // really only needed for Judy1, but free for JudyL.
+
+            Pjpm = P_JPM(*PPArray);
+            retcode = j__udyInsWalk(&(Pjpm->jpm_JP), Index, Pjpm);
+
+            if (retcode == -1)
+            {
+                JU_COPY_ERRNO(PJError, Pjpm);
+                JUDY1CODE(return(JERRI );)
+                JUDYLCODE(return(PPJERR);)
+            }
+
+            if (retcode ==  1) ++(Pjpm->jpm_Pop0);  // incr total array popu.
+
+            assert(((Pjpm->jpm_JP.jp_Type) == cJU_JPBRANCH_L)
+                || ((Pjpm->jpm_JP.jp_Type) == cJU_JPBRANCH_B)
+                || ((Pjpm->jpm_JP.jp_Type) == cJU_JPBRANCH_U));
+            DBGCODE(JudyCheckPop(*PPArray);)
+
+#ifdef JUDY1
+            assert((retcode == 0) || (retcode == 1));
+            return(retcode);            // == JU_RET_*_JPM().
+#else
+            assert(Pjpm->jpm_PValue != (Pjv_t) NULL);
+            return((PPvoid_t) Pjpm->jpm_PValue);
+#endif
+        }
+        /*NOTREACHED*/
+
+} // Judy1Set() / JudyLIns()
diff --git a/libs/klib/judy/JudyInsArray.c b/libs/klib/judy/JudyInsArray.c
new file mode 100644
index 0000000..b261db7
--- /dev/null
+++ b/libs/klib/judy/JudyInsArray.c
@@ -0,0 +1,1176 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// TBD:  It would probably be faster for the caller if the JudyL version took
+// PIndex as an interleaved array of indexes and values rather than just
+// indexes with a separate values array (PValue), especially considering
+// indexes and values are copied here with for-loops anyway and not the
+// equivalent of memmove().  All code could be revised to simply count by two
+// words for JudyL?  Supports "streaming" the data to/from disk better later?
+// In which case get rid of JU_ERRNO_NULLPVALUE, no longer needed, and simplify
+// the API to this code.
+// _________________
+
+// Judy1SetArray() and JudyLInsArray() functions for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+DBGCODE(extern void JudyCheckPop(Pvoid_t PArray);)
+
+
+// IMMED AND LEAF SIZE AND BRANCH TYPE ARRAYS:
+//
+// These support fast and easy lookup by level.
+
+static uint8_t immed_maxpop1[] = {
+    0,
+    cJU_IMMED1_MAXPOP1,
+    cJU_IMMED2_MAXPOP1,
+    cJU_IMMED3_MAXPOP1,
+#ifdef JU_64BIT
+    cJU_IMMED4_MAXPOP1,
+    cJU_IMMED5_MAXPOP1,
+    cJU_IMMED6_MAXPOP1,
+    cJU_IMMED7_MAXPOP1,
+#endif
+    // note:  There are no IMMEDs for whole words.
+};
+
+static uint8_t leaf_maxpop1[] = {
+    0,
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+    cJU_LEAF1_MAXPOP1,
+#else
+    0,                                  // 64-bit Judy1 has no Leaf1.
+#endif
+    cJU_LEAF2_MAXPOP1,
+    cJU_LEAF3_MAXPOP1,
+#ifdef JU_64BIT
+    cJU_LEAF4_MAXPOP1,
+    cJU_LEAF5_MAXPOP1,
+    cJU_LEAF6_MAXPOP1,
+    cJU_LEAF7_MAXPOP1,
+#endif
+    // note:  Root-level leaves are handled differently.
+};
+
+static uint8_t branchL_JPtype[] = {
+    0,
+    0,
+    cJU_JPBRANCH_L2,
+    cJU_JPBRANCH_L3,
+#ifdef JU_64BIT
+    cJU_JPBRANCH_L4,
+    cJU_JPBRANCH_L5,
+    cJU_JPBRANCH_L6,
+    cJU_JPBRANCH_L7,
+#endif
+    cJU_JPBRANCH_L,
+};
+
+static uint8_t branchB_JPtype[] = {
+    0,
+    0,
+    cJU_JPBRANCH_B2,
+    cJU_JPBRANCH_B3,
+#ifdef JU_64BIT
+    cJU_JPBRANCH_B4,
+    cJU_JPBRANCH_B5,
+    cJU_JPBRANCH_B6,
+    cJU_JPBRANCH_B7,
+#endif
+    cJU_JPBRANCH_B,
+};
+
+static uint8_t branchU_JPtype[] = {
+    0,
+    0,
+    cJU_JPBRANCH_U2,
+    cJU_JPBRANCH_U3,
+#ifdef JU_64BIT
+    cJU_JPBRANCH_U4,
+    cJU_JPBRANCH_U5,
+    cJU_JPBRANCH_U6,
+    cJU_JPBRANCH_U7,
+#endif
+    cJU_JPBRANCH_U,
+};
+
+// Subexpanse masks are similer to JU_DCDMASK() but without the need to clear
+// the first digits bits.  Avoid doing variable shifts by precomputing a
+// lookup array.
+
+static Word_t subexp_mask[] = {
+    0,
+    ~cJU_POP0MASK(1),
+    ~cJU_POP0MASK(2),
+    ~cJU_POP0MASK(3),
+#ifdef JU_64BIT
+    ~cJU_POP0MASK(4),
+    ~cJU_POP0MASK(5),
+    ~cJU_POP0MASK(6),
+    ~cJU_POP0MASK(7),
+#endif
+};
+
+
+// FUNCTION PROTOTYPES:
+
+static bool_t j__udyInsArray(Pjp_t PjpParent, int Level, PWord_t PPop1,
+                             PWord_t PIndex,
+#ifdef JUDYL
+                             Pjv_t   PValue,
+#endif
+                             Pjpm_t  Pjpm);
+
+
+// ****************************************************************************
+// J U D Y   1   S E T   A R R A Y
+// J U D Y   L   I N S   A R R A Y
+//
+// Main entry point.  See the manual entry for external overview.
+//
+// TBD:  Until thats written, note that the function returns 1 for success or
+// JERRI for serious error, including insufficient memory to build whole array;
+// use Judy*Count() to see how many were stored, the first N of the total
+// Count.  Also, since it takes Count == Pop1, it cannot handle a full array.
+// Also, "sorted" means ascending without duplicates, otherwise you get the
+// "unsorted" error.
+//
+// The purpose of these functions is to allow rapid construction of a large
+// Judy array given a sorted list of indexes (and for JudyL, corresponding
+// values).  At least one customer saw this as useful, and probably it would
+// also be useful as a sufficient workaround for fast(er) unload/reload to/from
+// disk.
+//
+// This code is written recursively for simplicity, until/unless someone
+// decides to make it faster and more complex.  Hopefully recursion is fast
+// enough simply because the function is so much faster than a series of
+// Set/Ins calls.
+
+#ifdef JUDY1
+FUNCTION int Judy1SetArray
+#else
+FUNCTION int JudyLInsArray
+#endif
+        (
+        PPvoid_t  PPArray,      // in which to insert, initially empty.
+        Word_t    Count,        // number of indexes (and values) to insert.
+const   Word_t *  const PIndex, // list of indexes to insert.
+#ifdef JUDYL
+const   Word_t *  const PValue, // list of corresponding values.
+#endif
+        PJError_t PJError       // optional, for returning error info.
+        )
+{
+        Pjlw_t    Pjlw;         // new root-level leaf.
+        Pjlw_t    Pjlwindex;    // first index in root-level leaf.
+        int       offset;       // in PIndex.
+
+
+// CHECK FOR NULL OR NON-NULL POINTER (error by caller):
+
+        if (PPArray == (PPvoid_t) NULL)
+        { JU_SET_ERRNO(PJError, JU_ERRNO_NULLPPARRAY);   return(JERRI); }
+
+        if (*PPArray != (Pvoid_t) NULL)
+        { JU_SET_ERRNO(PJError, JU_ERRNO_NONNULLPARRAY); return(JERRI); }
+
+        if (PIndex == (PWord_t) NULL)
+        { JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);    return(JERRI); }
+
+#ifdef JUDYL
+        if (PValue == (PWord_t) NULL)
+        { JU_SET_ERRNO(PJError, JU_ERRNO_NULLPVALUE);    return(JERRI); }
+#endif
+
+
+// HANDLE LARGE COUNT (= POP1) (typical case):
+//
+// Allocate and initialize a JPM, set the root pointer to point to it, and then
+// build the tree underneath it.
+
+// Common code for unusual error handling when no JPM available:
+
+        if (Count > cJU_LEAFW_MAXPOP1)  // too big for root-level leaf.
+        {
+            Pjpm_t Pjpm;                        // new, to allocate.
+
+// Allocate JPM:
+
+            Pjpm = j__udyAllocJPM();
+            JU_CHECKALLOC(Pjpm_t, Pjpm, JERRI);
+            *PPArray = (Pvoid_t) Pjpm;
+
+// Set some JPM fields:
+
+            (Pjpm->jpm_Pop0) = Count - 1;
+            // note: (Pjpm->jpm_TotalMemWords) is now initialized.
+
+// Build Judy tree:
+//
+// In case of error save the final Count, possibly modified, unless modified to
+// 0, in which case free the JPM itself:
+
+            if (! j__udyInsArray(&(Pjpm->jpm_JP), cJU_ROOTSTATE, &Count,
+                                 (PWord_t) PIndex,
+#ifdef JUDYL
+                                 (Pjv_t) PValue,
+#endif
+                                 Pjpm))
+            {
+                JU_COPY_ERRNO(PJError, Pjpm);
+
+                if (Count)              // partial success, adjust pop0:
+                {
+                    (Pjpm->jpm_Pop0) = Count - 1;
+                }
+                else                    // total failure, free JPM:
+                {
+                    j__udyFreeJPM(Pjpm, (Pjpm_t) NULL);
+                    *PPArray = (Pvoid_t) NULL;
+                }
+
+                DBGCODE(JudyCheckPop(*PPArray);)
+                return(JERRI);
+            }
+
+            DBGCODE(JudyCheckPop(*PPArray);)
+            return(1);
+
+        } // large count
+
+
+// HANDLE SMALL COUNT (= POP1):
+//
+// First ensure indexes are in sorted order:
+
+        for (offset = 1; offset < Count; ++offset)
+        {
+            if (PIndex[offset - 1] >= PIndex[offset])
+            { JU_SET_ERRNO(PJError, JU_ERRNO_UNSORTED); return(JERRI); }
+        }
+
+        if (Count == 0) return(1);              // *PPArray remains null.
+
+        {
+            Pjlw      = j__udyAllocJLW(Count + 1);
+                        JU_CHECKALLOC(Pjlw_t, Pjlw, JERRI);
+            *PPArray  = (Pvoid_t) Pjlw;
+            Pjlw[0]   = Count - 1;              // set pop0.
+            Pjlwindex = Pjlw + 1;
+        }
+
+// Copy whole-word indexes (and values) to the root-level leaf:
+
+          JU_COPYMEM(Pjlwindex,                      PIndex, Count);
+JUDYLCODE(JU_COPYMEM(JL_LEAFWVALUEAREA(Pjlw, Count), PValue, Count));
+
+        DBGCODE(JudyCheckPop(*PPArray);)
+        return(1);
+
+} // Judy1SetArray() / JudyLInsArray()
+
+
+// ****************************************************************************
+// __ J U D Y   I N S   A R R A Y
+//
+// Given:
+//
+// - a pointer to a JP
+//
+// - the JPs level in the tree, that is, the number of digits left to decode
+//   in the indexes under the JP (one less than the level of the JPM or branch
+//   in which the JP resides); cJU_ROOTSTATE on first entry (when JP is the one
+//   in the JPM), down to 1 for a Leaf1, LeafB1, or FullPop
+//
+// - a pointer to the number of indexes (and corresponding values) to store in
+//   this subtree, to modify in case of partial success
+//
+// - a list of indexes (and for JudyL, corresponding values) to store in this
+//   subtree
+//
+// - a JPM for tracking memory usage and returning errors
+//
+// Recursively build a subtree (immediate indexes, leaf, or branch with
+// subtrees) and modify the JP accordingly.  On the way down, build a BranchU
+// (only) for any expanse with *PPop1 too high for a leaf; on the way out,
+// convert the BranchU to a BranchL or BranchB if appropriate.  Keep memory
+// statistics in the JPM.
+//
+// Return TRUE for success, or FALSE with error information set in the JPM in
+// case of error, in which case leave a partially constructed but healthy tree,
+// and modify parent population counts on the way out.
+//
+// Note:  Each call of this function makes all modifications to the PjpParent
+// it receives; neither the parent nor child calls do this.
+
+FUNCTION static bool_t j__udyInsArray(
+        Pjp_t   PjpParent,              // parent JP in/under which to store.
+        int     Level,                  // initial digits remaining to decode.
+        PWord_t PPop1,                  // number of indexes to store.
+        PWord_t PIndex,                 // list of indexes to store.
+#ifdef JUDYL
+        Pjv_t   PValue,                 // list of corresponding values.
+#endif
+        Pjpm_t  Pjpm)                   // for memory and errors.
+{
+        Pjp_t   Pjp;                    // lower-level JP.
+        Word_t  Pjbany;                 // any type of branch.
+        int     levelsub;               // actual, of Pjps node, <= Level.
+        Word_t  pop1 = *PPop1;          // fast local value.
+        Word_t  pop1sub;                // population of one subexpanse.
+        uint8_t JPtype;                 // current JP type.
+        uint8_t JPtype_null;            // precomputed value for new branch.
+        jp_t    JPnull;                 // precomputed for speed.
+        Pjbu_t  PjbuRaw;                // constructed BranchU.
+        Pjbu_t  Pjbu;
+        int     digit;                  // in BranchU.
+        Word_t  digitmask;              // for a digit in a BranchU.
+        Word_t  digitshifted;           // shifted to correct offset.
+        Word_t  digitshincr;            // increment for digitshifted.
+        int     offset;                 // in PIndex, or a bitmap subexpanse.
+        int     numJPs;                 // number non-null in a BranchU.
+        bool_t  retval;                 // to return from this func.
+JUDYLCODE(Pjv_t PjvRaw);                // destination value area.
+JUDYLCODE(Pjv_t Pjv);
+
+
+// MACROS FOR COMMON CODE:
+//
+// Note:  These use function and local parameters from the context.
+// Note:  Assume newly allocated memory is zeroed.
+
+// Indicate whether a sorted list of indexes in PIndex, based on the first and
+// last indexes in the list using pop1, are in the same subexpanse between
+// Level and L_evel:
+//
+// This can be confusing!  Note that SAMESUBEXP(L) == TRUE means the indexes
+// are the same through level L + 1, and it says nothing about level L and
+// lower; they might be the same or they might differ.
+//
+// Note:  In principle SAMESUBEXP needs a mask for the digits from Level,
+// inclusive, to L_evel, exclusive.  But in practice, since the indexes are all
+// known to be identical above Level, it just uses a mask for the digits
+// through L_evel + 1; see subexp_mask[].
+
+#define SAMESUBEXP(L_evel) \
+        (! ((PIndex[0] ^ PIndex[pop1 - 1]) & subexp_mask[L_evel]))
+
+// Set PjpParent to a null JP appropriate for the level of the node to which it
+// points, which is 1 less than the level of the node in which the JP resides,
+// which is by definition Level:
+//
+// Note:  This can set the JPMs JP to an invalid jp_Type, but it doesnt
+// matter because the JPM is deleted by the caller.
+
+#define SETJPNULL_PARENT \
+            JU_JPSETADT(PjpParent, 0, 0, cJU_JPNULL1 + Level - 1);
+
+// Variation to set a specified JP (in a branch being built) to a precomputed
+// null JP:
+
+#define SETJPNULL(Pjp) *(Pjp) = JPnull
+
+// Handle complete (as opposed to partial) memory allocation failure:  Set the
+// parent JP to an appropriate null type (to leave a consistent tree), zero the
+// callers population count, and return FALSE:
+//
+// Note:  At Level == cJU_ROOTSTATE this sets the JPMs JPs jp_Type to a bogus
+// value, but it doesnt matter because the JPM should be deleted by the
+// caller.
+
+#define NOMEM { SETJPNULL_PARENT; *PPop1 = 0; return(FALSE); }
+
+// Allocate a Leaf1-N and save the address in Pjll; in case of failure, NOMEM:
+
+#define ALLOCLEAF(AllocLeaf) \
+        if ((PjllRaw = AllocLeaf(pop1, Pjpm)) == (Pjll_t) NULL) NOMEM; \
+        Pjll = P_JLL(PjllRaw);
+
+// Copy indexes smaller than words (and values which are whole words) from
+// given arrays to immediate indexes or a leaf:
+//
+// TBD:  These macros overlap with some of the code in JudyCascade.c; do some
+// merging?  That file has functions while these are macros.
+
+#define COPYTOLEAF_EVEN_SUB(Pjll,LeafType)              \
+        {                                               \
+            LeafType * P_leaf  = (LeafType *) (Pjll);   \
+            Word_t     p_op1   = pop1;                  \
+            PWord_t    P_Index = PIndex;                \
+                                                        \
+            assert(pop1 > 0);                           \
+                                                        \
+            do { *P_leaf++ = *P_Index++; /* truncates */\
+            } while (--(p_op1));                        \
+        }
+
+#define COPYTOLEAF_ODD_SUB(cLevel,Pjll,Copy)            \
+        {                                               \
+            uint8_t * P_leaf  = (uint8_t *) (Pjll);     \
+            Word_t    p_op1   = pop1;                   \
+            PWord_t   P_Index = PIndex;                 \
+                                                        \
+            assert(pop1 > 0);                           \
+                                                        \
+            do {                                        \
+                Copy(P_leaf, *P_Index);                 \
+                P_leaf += (cLevel); ++P_Index;          \
+            } while (--(p_op1));                        \
+        }
+
+#ifdef JUDY1
+
+#define COPYTOLEAF_EVEN(Pjll,LeafType)   COPYTOLEAF_EVEN_SUB(Pjll,LeafType)
+#define COPYTOLEAF_ODD(cLevel,Pjll,Copy) COPYTOLEAF_ODD_SUB(cLevel,Pjll,Copy)
+
+#else // JUDYL adds copying of values:
+
+#define COPYTOLEAF_EVEN(Pjll,LeafType)                  \
+        {                                               \
+            COPYTOLEAF_EVEN_SUB(Pjll,LeafType)          \
+            JU_COPYMEM(Pjv, PValue, pop1);              \
+        }
+
+#define COPYTOLEAF_ODD(cLevel,Pjll,Copy)                \
+        {                                               \
+            COPYTOLEAF_ODD_SUB( cLevel,Pjll,Copy)       \
+            JU_COPYMEM(Pjv, PValue, pop1);              \
+        }
+
+#endif
+
+// Set the JP type for an immediate index, where BaseJPType is JPIMMED_*_02:
+
+#define SETIMMTYPE(BaseJPType)  (PjpParent->jp_Type) = (BaseJPType) + pop1 - 2
+
+// Allocate and populate a Leaf1-N:
+//
+// Build MAKELEAF_EVEN() and MAKELEAF_ODD() using macros for common code.
+
+#define MAKELEAF_SUB1(AllocLeaf,ValueArea,LeafType)                     \
+        ALLOCLEAF(AllocLeaf);                                           \
+        JUDYLCODE(Pjv = ValueArea(Pjll, pop1))
+
+
+#define MAKELEAF_SUB2(cLevel,JPType)                                    \
+{                                                                       \
+        Word_t D_cdP0;                                                  \
+        assert(pop1 - 1 <= cJU_POP0MASK(cLevel));                       \
+        D_cdP0 = (*PIndex & cJU_DCDMASK(cLevel)) | (pop1 - 1);          \
+        JU_JPSETADT(PjpParent, (Word_t)PjllRaw, D_cdP0, JPType);        \
+}
+
+
+#define MAKELEAF_EVEN(cLevel,JPType,AllocLeaf,ValueArea,LeafType)       \
+        MAKELEAF_SUB1(AllocLeaf,ValueArea,LeafType);                    \
+        COPYTOLEAF_EVEN(Pjll, LeafType);                                \
+        MAKELEAF_SUB2(cLevel, JPType)
+
+#define MAKELEAF_ODD(cLevel,JPType,AllocLeaf,ValueArea,Copy)            \
+        MAKELEAF_SUB1(AllocLeaf,ValueArea,LeafType);                    \
+        COPYTOLEAF_ODD(cLevel, Pjll, Copy);                             \
+        MAKELEAF_SUB2(cLevel, JPType)
+
+// Ensure that the indexes to be stored in immediate indexes or a leaf are
+// sorted:
+//
+// This check is pure overhead, but required in order to protect the Judy array
+// against caller error, to avoid a later corruption or core dump from a
+// seemingly valid Judy array.  Do this check piecemeal at the leaf level while
+// the indexes are already in the cache.  Higher-level order-checking occurs
+// while building branches.
+//
+// Note:  Any sorting error in the expanse of a single immediate indexes JP or
+// a leaf => save no indexes in that expanse.
+
+#define CHECKLEAFORDER                                                  \
+        {                                                               \
+            for (offset = 1; offset < pop1; ++offset)                   \
+            {                                                           \
+                if (PIndex[offset - 1] >= PIndex[offset])               \
+                {                                                       \
+                    SETJPNULL_PARENT;                                   \
+                    *PPop1 = 0;                                         \
+                    JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_UNSORTED);      \
+                    return(FALSE);                                      \
+                }                                                       \
+            }                                                           \
+        }
+
+
+// ------ START OF CODE ------
+
+        assert( Level >= 1);
+        assert( Level <= cJU_ROOTSTATE);
+        assert((Level <  cJU_ROOTSTATE) || (pop1 > cJU_LEAFW_MAXPOP1));
+
+
+// CHECK FOR TOP LEVEL:
+//
+// Special case:  If at the top level (PjpParent is in the JPM), a top-level
+// branch must be created, even if its a BranchL with just one JP.  (The JPM
+// cannot point to a leaf because the leaf would have to be a lower-level,
+// higher-capacity leaf under a narrow pointer (otherwise a root-level leaf
+// would suffice), and the JPMs JP cant handle a narrow pointer because the
+// jp_DcdPopO field isnt big enough.)  Otherwise continue to check for a pop1
+// small enough to support immediate indexes or a leaf before giving up and
+// making a lower-level branch.
+
+        if (Level == cJU_ROOTSTATE)
+        {
+            levelsub = cJU_ROOTSTATE;
+            goto BuildBranch2;
+        }
+        assert(Level < cJU_ROOTSTATE);
+
+
+// SKIP JPIMMED_*_01:
+//
+// Immeds with pop1 == 1 should be handled in-line during branch construction.
+
+        assert(pop1 > 1);
+
+
+// BUILD JPIMMED_*_02+:
+//
+// The starting address of the indexes depends on Judy1 or JudyL; also, JudyL
+// includes a pointer to a values-only leaf.
+
+        if (pop1 <= immed_maxpop1[Level])      // note: always < root level.
+        {
+            JUDY1CODE(uint8_t * Pjll = (uint8_t *) (PjpParent->jp_1Index);)
+            JUDYLCODE(uint8_t * Pjll = (uint8_t *) (PjpParent->jp_LIndex);)
+
+            CHECKLEAFORDER;             // indexes to be stored are sorted.
+
+#ifdef JUDYL
+            if ((PjvRaw = j__udyLAllocJV(pop1, Pjpm)) == (Pjv_t) NULL)
+                NOMEM;
+            (PjpParent->jp_Addr) = (Word_t) PjvRaw;
+            Pjv = P_JV(PjvRaw);
+#endif
+
+            switch (Level)
+            {
+            case 1: COPYTOLEAF_EVEN(Pjll, uint8_t);
+                    SETIMMTYPE(cJU_JPIMMED_1_02);
+                    break;
+#if (defined(JUDY1) || defined(JU_64BIT))
+            case 2: COPYTOLEAF_EVEN(Pjll, uint16_t);
+                    SETIMMTYPE(cJU_JPIMMED_2_02);
+                    break;
+            case 3: COPYTOLEAF_ODD(3, Pjll, JU_COPY3_LONG_TO_PINDEX);
+                    SETIMMTYPE(cJU_JPIMMED_3_02);
+                    break;
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+            case 4: COPYTOLEAF_EVEN(Pjll, uint32_t);
+                    SETIMMTYPE(cJ1_JPIMMED_4_02);
+                    break;
+            case 5: COPYTOLEAF_ODD(5, Pjll, JU_COPY5_LONG_TO_PINDEX);
+                    SETIMMTYPE(cJ1_JPIMMED_5_02);
+                    break;
+            case 6: COPYTOLEAF_ODD(6, Pjll, JU_COPY6_LONG_TO_PINDEX);
+                    SETIMMTYPE(cJ1_JPIMMED_6_02);
+                    break;
+            case 7: COPYTOLEAF_ODD(7, Pjll, JU_COPY7_LONG_TO_PINDEX);
+                    SETIMMTYPE(cJ1_JPIMMED_7_02);
+                    break;
+#endif
+            default: assert(FALSE);     // should be impossible.
+            }
+
+            return(TRUE);               // note: no children => no *PPop1 mods.
+
+        } // JPIMMED_*_02+
+
+
+// BUILD JPLEAF*:
+//
+// This code is a little tricky.  The method is:  For each level starting at
+// the present Level down through levelsub = 1, and then as a special case for
+// LeafB1 and FullPop (which are also at levelsub = 1 but have different
+// capacity, see later), check if pop1 fits in a leaf (using leaf_maxpop1[])
+// at that level.  If so, except for Level == levelsub, check if all of the
+// current indexes to be stored are in the same (narrow) subexpanse, that is,
+// the digits from Level to levelsub + 1, inclusive, are identical between the
+// first and last index in the (sorted) list (in PIndex).  If this condition is
+// satisfied at any level, build a leaf at that level (under a narrow pointer
+// if Level > levelsub).
+//
+// Note:  Doing the search in this order results in storing the indexes in
+// "least compressed form."
+
+        for (levelsub = Level; levelsub >= 1; --levelsub)
+        {
+            Pjll_t PjllRaw;
+            Pjll_t Pjll;
+
+// Check if pop1 is too large to fit in a leaf at levelsub; if so, try the next
+// lower level:
+
+            if (pop1 > leaf_maxpop1[levelsub]) continue;
+
+// If pop1 fits in a leaf at levelsub, but levelsub is lower than Level, must
+// also check whether all the indexes in the expanse to store can in fact be
+// placed under a narrow pointer; if not, a leaf cannot be used, at this or any
+// lower level (levelsub):
+
+            if ((levelsub < Level) && (! SAMESUBEXP(levelsub)))
+                goto BuildBranch;       // cant use a narrow, need a branch.
+
+// Ensure valid pop1 and all indexes are in fact common through Level:
+
+            assert(pop1 <= cJU_POP0MASK(Level) + 1);
+            assert(! ((PIndex[0] ^ PIndex[pop1 - 1]) & cJU_DCDMASK(Level)));
+
+            CHECKLEAFORDER;             // indexes to be stored are sorted.
+
+// Build correct type of leaf:
+//
+// Note:  The jp_DcdPopO and jp_Type assignments in MAKELEAF_* happen correctly
+// for the levelsub (not Level) of the new leaf, even if its under a narrow
+// pointer.
+
+            switch (levelsub)
+            {
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+            case 1: MAKELEAF_EVEN(1, cJU_JPLEAF1, j__udyAllocJLL1,
+                                  JL_LEAF1VALUEAREA, uint8_t);
+                    break;
+#endif
+            case 2: MAKELEAF_EVEN(2, cJU_JPLEAF2, j__udyAllocJLL2,
+                                  JL_LEAF2VALUEAREA, uint16_t);
+                    break;
+            case 3: MAKELEAF_ODD( 3, cJU_JPLEAF3, j__udyAllocJLL3,
+                                  JL_LEAF3VALUEAREA, JU_COPY3_LONG_TO_PINDEX);
+                    break;
+#ifdef JU_64BIT
+            case 4: MAKELEAF_EVEN(4, cJU_JPLEAF4, j__udyAllocJLL4,
+                                  JL_LEAF4VALUEAREA, uint32_t);
+                    break;
+            case 5: MAKELEAF_ODD( 5, cJU_JPLEAF5, j__udyAllocJLL5,
+                                  JL_LEAF5VALUEAREA, JU_COPY5_LONG_TO_PINDEX);
+                    break;
+            case 6: MAKELEAF_ODD( 6, cJU_JPLEAF6, j__udyAllocJLL6,
+                                  JL_LEAF6VALUEAREA, JU_COPY6_LONG_TO_PINDEX);
+                    break;
+            case 7: MAKELEAF_ODD( 7, cJU_JPLEAF7, j__udyAllocJLL7,
+                                  JL_LEAF7VALUEAREA, JU_COPY7_LONG_TO_PINDEX);
+                    break;
+#endif
+            default: assert(FALSE);     // should be impossible.
+            }
+
+            return(TRUE);               // note: no children => no *PPop1 mods.
+
+        } // JPLEAF*
+
+
+// BUILD JPLEAF_B1 OR JPFULLPOPU1:
+//
+// See above about JPLEAF*.  If pop1 doesnt fit in any level of linear leaf,
+// it might still fit in a LeafB1 or FullPop, perhaps under a narrow pointer.
+
+        if ((Level == 1) || SAMESUBEXP(1))      // same until last digit.
+        {
+            Pjlb_t PjlbRaw;                     // for bitmap leaf.
+            Pjlb_t Pjlb;
+
+            assert(pop1 <= cJU_JPFULLPOPU1_POP0 + 1);
+            CHECKLEAFORDER;             // indexes to be stored are sorted.
+
+#ifdef JUDY1
+
+// JPFULLPOPU1:
+
+            if (pop1 == cJU_JPFULLPOPU1_POP0 + 1)
+            {
+                Word_t  Addr  = PjpParent->jp_Addr;
+                Word_t  DcdP0 = (*PIndex & cJU_DCDMASK(1))
+                                        | cJU_JPFULLPOPU1_POP0;
+                JU_JPSETADT(PjpParent, Addr, DcdP0, cJ1_JPFULLPOPU1);
+
+                return(TRUE);
+            }
+#endif
+
+// JPLEAF_B1:
+
+            if ((PjlbRaw = j__udyAllocJLB1(Pjpm)) == (Pjlb_t) NULL)
+                NOMEM;
+            Pjlb = P_JLB(PjlbRaw);
+
+            for (offset = 0; offset < pop1; ++offset)
+                JU_BITMAPSETL(Pjlb, PIndex[offset]);
+
+            retval = TRUE;              // default.
+
+#ifdef JUDYL
+
+// Build subexpanse values-only leaves (LeafVs) under LeafB1:
+
+            for (offset = 0; offset < cJU_NUMSUBEXPL; ++offset)
+            {
+                if (! (pop1sub = j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, offset))))
+                    continue;           // skip empty subexpanse.
+
+// Allocate one LeafV = JP subarray; if out of memory, clear bitmaps for higher
+// subexpanses and adjust *PPop1:
+
+                if ((PjvRaw = j__udyLAllocJV(pop1sub, Pjpm))
+                 == (Pjv_t) NULL)
+                {
+                    for (/* null */; offset < cJU_NUMSUBEXPL; ++offset)
+                    {
+                        *PPop1 -= j__udyCountBitsL(JU_JLB_BITMAP(Pjlb, offset));
+                        JU_JLB_BITMAP(Pjlb, offset) = 0;
+                    }
+
+                    retval = FALSE;
+                    break;
+                }
+
+// Populate values-only leaf and save the pointer to it:
+
+                Pjv = P_JV(PjvRaw);
+                JU_COPYMEM(Pjv, PValue, pop1sub);
+                JL_JLB_PVALUE(Pjlb, offset) = PjvRaw;   // first-tier pointer.
+                PValue += pop1sub;
+
+            } // for each subexpanse
+
+#endif // JUDYL
+
+// Attach new LeafB1 to parent JP; note use of *PPop1 possibly < pop1:
+
+            JU_JPSETADT(PjpParent, (Word_t) PjlbRaw, 
+                    (*PIndex & cJU_DCDMASK(1)) | (*PPop1 - 1), cJU_JPLEAF_B1);
+
+            return(retval);
+
+        } // JPLEAF_B1 or JPFULLPOPU1
+
+
+// BUILD JPBRANCH_U*:
+//
+// Arriving at BuildBranch means Level < top level but the pop1 is too large
+// for immediate indexes or a leaf, even under a narrow pointer, including a
+// LeafB1 or FullPop at level 1.  This implies SAMESUBEXP(1) == FALSE, that is,
+// the indexes to be stored "branch" at level 2 or higher.
+
+BuildBranch:    // come here directly if a leaf wont work.
+
+        assert(Level >= 2);
+        assert(Level < cJU_ROOTSTATE);
+        assert(! SAMESUBEXP(1));                // sanity check, see above.
+
+// Determine the appropriate level for a new branch node; see if a narrow
+// pointer can be used:
+//
+// This can be confusing.  The branch is required at the lowest level L where
+// the indexes to store are not in the same subexpanse at level L-1.  Work down
+// from Level to tree level 3, which is 1 above the lowest tree level = 2 at
+// which a branch can be used.  Theres no need to check SAMESUBEXP at level 2
+// because its known to be false at level 2-1 = 1.
+//
+// Note:  Unlike for a leaf node, a narrow pointer is always used for a branch
+// if possible, that is, maximum compression is always used, except at the top
+// level of the tree, where a JPM cannot support a narrow pointer, meaning a
+// top BranchL can have a single JP (fanout = 1); but that case jumps directly
+// to BuildBranch2.
+//
+// Note:  For 32-bit systems the only usable values for a narrow pointer are
+// Level = 3 and levelsub = 2; 64-bit systems have many more choices; but
+// hopefully this for-loop is fast enough even on a 32-bit system.
+//
+// TBD:  If not fast enough, #ifdef JU_64BIT and handle the 32-bit case faster.
+
+        for (levelsub = Level; levelsub >= 3; --levelsub)  // see above.
+            if (! SAMESUBEXP(levelsub - 1))     // at limit of narrow pointer.
+                break;                          // put branch at levelsub.
+
+BuildBranch2:   // come here directly for Level = levelsub = cJU_ROOTSTATE.
+
+        assert(levelsub >= 2);
+        assert(levelsub <= Level);
+
+// Initially build a BranchU:
+//
+// Always start with a BranchU because the number of populated subexpanses is
+// not yet known.  Use digitmask, digitshifted, and digitshincr to avoid
+// expensive variable shifts within JU_DIGITATSTATE within the loop.
+//
+// TBD:  The use of digitmask, etc. results in more increment operations per
+// loop, is there an even faster way?
+//
+// TBD:  Would it pay to pre-count the populated JPs (subexpanses) and
+// pre-compress the branch, that is, build a BranchL or BranchB immediately,
+// also taking account of opportunistic uncompression rules?  Probably not
+// because at high levels of the tree there might be huge numbers of indexes
+// (hence cache lines) to scan in the PIndex array to determine the fanout
+// (number of JPs) needed.
+
+        if ((PjbuRaw = j__udyAllocJBU(Pjpm)) == (Pjbu_t) NULL) NOMEM;
+        Pjbu = P_JBU(PjbuRaw);
+
+        JPtype_null       = cJU_JPNULL1 + levelsub - 2;  // in new BranchU.
+        JU_JPSETADT(&JPnull, 0, 0, JPtype_null);
+
+        Pjp               = Pjbu->jbu_jp;           // for convenience in loop.
+        numJPs            = 0;                      // non-null in the BranchU.
+        digitmask         = cJU_MASKATSTATE(levelsub);   // see above.
+        digitshincr       = 1UL << (cJU_BITSPERBYTE * (levelsub - 1));
+        retval            = TRUE;
+
+// Scan and populate JPs (subexpanses):
+//
+// Look for all indexes matching each digit in the BranchU (at the correct
+// levelsub), and meanwhile notice any sorting error.  Increment PIndex (and
+// PValue) and reduce pop1 for each subexpanse handled successfully.
+
+        for (digit = digitshifted = 0;
+             digit < cJU_BRANCHUNUMJPS;
+             ++digit, digitshifted += digitshincr, ++Pjp)
+        {
+            DBGCODE(Word_t pop1subprev;)
+            assert(pop1 != 0);          // end of indexes is handled elsewhere.
+
+// Count indexes in digits subexpanse:
+
+            for (pop1sub = 0; pop1sub < pop1; ++pop1sub)
+                if (digitshifted != (PIndex[pop1sub] & digitmask)) break;
+
+// Empty subexpanse (typical, performance path) or sorting error (rare):
+
+            if (pop1sub == 0)
+            {
+                if (digitshifted < (PIndex[0] & digitmask))
+                { SETJPNULL(Pjp); continue; }           // empty subexpanse.
+
+                assert(pop1 < *PPop1);  // did save >= 1 index and decr pop1.
+                JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_UNSORTED);
+                goto AbandonBranch;
+            }
+
+// Non-empty subexpanse:
+//
+// First shortcut by handling pop1sub == 1 (JPIMMED_*_01) inline locally.
+
+            if (pop1sub == 1)                   // note: can be at root level.
+            {
+                Word_t Addr = 0;
+      JUDYLCODE(Addr    = (Word_t) (*PValue++);)
+                JU_JPSETADT(Pjp, Addr, *PIndex, cJU_JPIMMED_1_01 + levelsub -2);
+
+                ++numJPs;
+
+                if (--pop1) { ++PIndex; continue; }  // more indexes to store.
+
+                ++digit; ++Pjp;                 // skip JP just saved.
+                goto ClearBranch;               // save time.
+            }
+
+// Recurse to populate one digits (subexpanses) JP; if successful, skip
+// indexes (and values) just stored (performance path), except when expanse is
+// completely stored:
+
+            DBGCODE(pop1subprev = pop1sub;)
+
+            if (j__udyInsArray(Pjp, levelsub - 1, &pop1sub, (PWord_t) PIndex,
+#ifdef JUDYL
+                               (Pjv_t) PValue,
+#endif
+                               Pjpm))
+            {                                   // complete success.
+                ++numJPs;
+                assert(pop1subprev == pop1sub);
+                assert(pop1 >= pop1sub);
+
+                if ((pop1 -= pop1sub) != 0)     // more indexes to store:
+                {
+                    PIndex += pop1sub;          // skip indexes just stored.
+          JUDYLCODE(PValue += pop1sub;)
+                    continue;
+                }
+                // else leave PIndex in BranchUs expanse.
+
+// No more indexes to store in BranchUs expanse:
+
+                ++digit; ++Pjp;                 // skip JP just saved.
+                goto ClearBranch;               // save time.
+            }
+
+// Handle any error at a lower level of recursion:
+//
+// In case of partial success, pop1sub != 0, but it was reduced from the value
+// passed to j__udyInsArray(); skip this JP later during ClearBranch.
+
+            assert(pop1subprev > pop1sub);      // check j__udyInsArray().
+            assert(pop1        > pop1sub);      // check j__udyInsArray().
+
+            if (pop1sub)                        // partial success.
+            { ++digit; ++Pjp; ++numJPs; }       // skip JP just saved.
+
+            pop1 -= pop1sub;                    // deduct saved indexes if any.
+
+// Same-level sorting error, or any lower-level error; abandon the rest of the
+// branch:
+//
+// Arrive here with pop1 = remaining unsaved indexes (always non-zero).  Adjust
+// the *PPop1 value to record and return, modify retval, and use ClearBranch to
+// finish up.
+
+AbandonBranch:
+            assert(pop1 != 0);                  // more to store, see above.
+            assert(pop1 <= *PPop1);             // sanity check.
+
+            *PPop1 -= pop1;                     // deduct unsaved indexes.
+            pop1    = 0;                        // to avoid error later.
+            retval  = FALSE;
+
+// Error (rare), or end of indexes while traversing new BranchU (performance
+// path); either way, mark the remaining JPs, if any, in the BranchU as nulls
+// and exit the loop:
+//
+// Arrive here with digit and Pjp set to the first JP to set to null.
+
+ClearBranch:
+            for (/* null */; digit < cJU_BRANCHUNUMJPS; ++digit, ++Pjp)
+                SETJPNULL(Pjp);
+            break;                              // saves one more compare.
+
+        } // for each digit
+
+
+// FINISH JPBRANCH_U*:
+//
+// Arrive here with a BranchU built under Pjbu, numJPs set, and either:  retval
+// == TRUE and *PPop1 unmodified, or else retval == FALSE, *PPop1 set to the
+// actual number of indexes saved (possibly 0 for complete failure at a lower
+// level upon the first call of j__udyInsArray()), and the Judy error set in
+// Pjpm.  Either way, PIndex points to an index within the expanse just
+// handled.
+
+        Pjbany = (Word_t) PjbuRaw;              // default = use this BranchU.
+        JPtype = branchU_JPtype[levelsub];
+
+// Check for complete failure above:
+
+        assert((! retval) || *PPop1);           // sanity check.
+
+        if ((! retval) && (*PPop1 == 0))        // nothing stored, full failure.
+        {
+            j__udyFreeJBU(PjbuRaw, Pjpm);
+            SETJPNULL_PARENT;
+            return(FALSE);
+        }
+
+// Complete or partial success so far; watch for sorting error after the
+// maximum digit (255) in the BranchU, which is indicated by having more
+// indexes to store in the BranchUs expanse:
+//
+// For example, if an index to store has a digit of 255 at levelsub, followed
+// by an index with a digit of 254, the for-loop above runs out of digits
+// without reducing pop1 to 0.
+
+        if (pop1 != 0)
+        {
+            JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_UNSORTED);
+            *PPop1 -= pop1;             // deduct unsaved indexes.
+            retval  = FALSE;
+        }
+        assert(*PPop1 != 0);            // branch (still) cannot be empty.
+
+
+// OPTIONALLY COMPRESS JPBRANCH_U*:
+//
+// See if the BranchU should be compressed to a BranchL or BranchB; if so, do
+// that and free the BranchU; otherwise just use the existing BranchU.  Follow
+// the same rules as in JudyIns.c (version 4.95):  Only check local population
+// (cJU_OPP_UNCOMP_POP0) for BranchL, and only check global memory efficiency
+// (JU_OPP_UNCOMPRESS) for BranchB.  TBD:  Have the rules changed?
+//
+// Note:  Because of differing order of operations, the latter compression
+// might not result in the same set of branch nodes as a series of sequential
+// insertions.
+//
+// Note:  Allocating a BranchU only to sometimes convert it to a BranchL or
+// BranchB is unfortunate, but attempting to work with a temporary BranchU on
+// the stack and then allocate and keep it as a BranchU in many cases is worse
+// in terms of error handling.
+
+
+// COMPRESS JPBRANCH_U* TO JPBRANCH_L*:
+
+        if (numJPs <= cJU_BRANCHLMAXJPS)        // JPs fit in a BranchL.
+        {
+            Pjbl_t PjblRaw = (Pjbl_t) NULL;     // new BranchL; init for cc.
+            Pjbl_t Pjbl;
+
+            if ((*PPop1 > JU_BRANCHL_MAX_POP)   // pop too high.
+             || ((PjblRaw = j__udyAllocJBL(Pjpm)) == (Pjbl_t) NULL))
+            {                                   // cant alloc BranchL.
+                goto SetParent;                 // just keep BranchU.
+            }
+
+            Pjbl = P_JBL(PjblRaw);
+
+// Copy BranchU JPs to BranchL:
+
+            (Pjbl->jbl_NumJPs) = numJPs;
+            offset = 0;
+
+            for (digit = 0; digit < cJU_BRANCHUNUMJPS; ++digit)
+            {
+                if ((((Pjbu->jbu_jp) + digit)->jp_Type) == JPtype_null)
+                    continue;
+
+                (Pjbl->jbl_Expanse[offset  ]) = digit;
+                (Pjbl->jbl_jp     [offset++]) = Pjbu->jbu_jp[digit];
+            }
+            assert(offset == numJPs);           // found same number.
+
+// Free the BranchU and prepare to use the new BranchL instead:
+
+            j__udyFreeJBU(PjbuRaw, Pjpm);
+
+            Pjbany = (Word_t) PjblRaw;
+            JPtype = branchL_JPtype[levelsub];
+
+        } // compress to BranchL
+
+
+// COMPRESS JPBRANCH_U* TO JPBRANCH_B*:
+//
+// If unable to allocate the BranchB or any JP subarray, free all related
+// memory and just keep the BranchU.
+//
+// Note:  This use of JU_OPP_UNCOMPRESS is a bit conservative because the
+// BranchU is already allocated while the (presumably smaller) BranchB is not,
+// the opposite of how its used in single-insert code.
+
+        else
+        {
+            Pjbb_t PjbbRaw = (Pjbb_t) NULL;     // new BranchB; init for cc.
+            Pjbb_t Pjbb;
+            Pjp_t  Pjp2;                        // in BranchU.
+
+            if ((*PPop1 > JU_BRANCHB_MAX_POP)   // pop too high.
+             || ((PjbbRaw = j__udyAllocJBB(Pjpm)) == (Pjbb_t) NULL))
+            {                                   // cant alloc BranchB.
+                goto SetParent;                 // just keep BranchU.
+            }
+
+            Pjbb = P_JBB(PjbbRaw);
+
+// Set bits in bitmap for populated subexpanses:
+
+            Pjp2 = Pjbu->jbu_jp;
+
+            for (digit = 0; digit < cJU_BRANCHUNUMJPS; ++digit)
+                if ((((Pjbu->jbu_jp) + digit)->jp_Type) != JPtype_null)
+                    JU_BITMAPSETB(Pjbb, digit);
+
+// Copy non-null JPs to BranchB JP subarrays:
+
+            for (offset = 0; offset < cJU_NUMSUBEXPB; ++offset)
+            {
+                Pjp_t PjparrayRaw;
+                Pjp_t Pjparray;
+
+                if (! (numJPs = j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, offset))))
+                    continue;                   // skip empty subexpanse.
+
+// If unable to allocate a JP subarray, free all BranchB memory so far and
+// continue to use the BranchU:
+
+                if ((PjparrayRaw = j__udyAllocJBBJP(numJPs, Pjpm))
+                    == (Pjp_t) NULL)
+                {
+                    while (offset-- > 0)
+                    {
+                        if (JU_JBB_PJP(Pjbb, offset) == (Pjp_t) NULL) continue;
+
+                        j__udyFreeJBBJP(JU_JBB_PJP(Pjbb, offset),
+                                 j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, offset)),
+                                        Pjpm);
+                    }
+                    j__udyFreeJBB(PjbbRaw, Pjpm);
+                    goto SetParent;             // keep BranchU.
+                }
+
+// Set one JP subarray pointer and copy the subexpanses JPs to the subarray:
+//
+// Scan the BranchU for non-null JPs until numJPs JPs are copied.
+
+                JU_JBB_PJP(Pjbb, offset) = PjparrayRaw;
+                Pjparray = P_JP(PjparrayRaw);
+
+                while (numJPs-- > 0)
+                {
+                    while ((Pjp2->jp_Type) == JPtype_null)
+                    {
+                        ++Pjp2;
+                        assert(Pjp2 < (Pjbu->jbu_jp) + cJU_BRANCHUNUMJPS);
+                    }
+                    *Pjparray++ = *Pjp2++;
+                }
+            } // for each subexpanse
+
+// Free the BranchU and prepare to use the new BranchB instead:
+
+            j__udyFreeJBU(PjbuRaw, Pjpm);
+
+            Pjbany = (Word_t) PjbbRaw;
+            JPtype = branchB_JPtype[levelsub];
+
+        } // compress to BranchB
+
+
+// COMPLETE OR PARTIAL SUCCESS:
+//
+// Attach new branch (under Pjp, with JPtype) to parent JP; note use of *PPop1,
+// possibly reduced due to partial failure.
+
+SetParent:
+        (PjpParent->jp_Addr) = Pjbany;
+        (PjpParent->jp_Type) = JPtype;
+
+        if (Level < cJU_ROOTSTATE)              // PjpParent not in JPM:
+        {
+            Word_t DcdP0 = (*PIndex & cJU_DCDMASK(levelsub)) | (*PPop1 - 1);
+
+            JU_JPSETADT(PjpParent ,Pjbany, DcdP0, JPtype);
+        }
+
+        return(retval);
+
+} // j__udyInsArray()
diff --git a/libs/klib/judy/JudyInsertBranch.c b/libs/klib/judy/JudyInsertBranch.c
new file mode 100644
index 0000000..307285c
--- /dev/null
+++ b/libs/klib/judy/JudyInsertBranch.c
@@ -0,0 +1,133 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// BranchL insertion functions for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+extern int j__udyCreateBranchL(Pjp_t, Pjp_t, uint8_t *, Word_t, Pvoid_t);
+
+
+// ****************************************************************************
+// __ J U D Y   I N S E R T   B R A N C H
+//
+// Insert 2-element BranchL in between Pjp and Pjp->jp_Addr.
+//
+// Return -1 if out of memory, otherwise return 1.
+
+FUNCTION int j__udyInsertBranch(
+	Pjp_t	Pjp,		// JP containing narrow pointer.
+	Word_t	Index,		// outlier to Pjp.
+	Word_t	BranchLevel,	// of what JP points to, mapped from JP type.
+	Pjpm_t	Pjpm)		// for global accounting.
+{
+	jp_t	JP2 [2];
+	jp_t	JP;
+	Pjp_t	PjpNull;
+	Word_t	XorExp;
+	Word_t	Inew, Iold;
+	Word_t  DCDMask;	// initially for original BranchLevel.
+	int	Ret;
+	uint8_t	Exp2[2];
+	uint8_t	DecodeByteN, DecodeByteO;
+
+//	Get the current mask for the DCD digits:
+
+	DCDMask = cJU_DCDMASK(BranchLevel);
+
+//	Obtain Dcd bits that differ between Index and JP, shifted so the
+//	digit for BranchLevel is the LSB:
+
+	XorExp = ((Index ^ JU_JPDCDPOP0(Pjp)) & (cJU_ALLONES >> cJU_BITSPERBYTE))
+	       >> (BranchLevel * cJU_BITSPERBYTE);
+	assert(XorExp);		// Index must be an outlier.
+
+//	Count levels between object under narrow pointer and the level at which
+//	the outlier diverges from it, which is always at least initial
+//	BranchLevel + 1, to end up with the level (JP type) at which to insert
+//	the new intervening BranchL:
+
+	do { ++BranchLevel; } while ((XorExp >>= cJU_BITSPERBYTE));
+	assert((BranchLevel > 1) && (BranchLevel < cJU_ROOTSTATE));
+
+//	Get the MSB (highest digit) that differs between the old expanse and
+//	the new Index to insert:
+
+	DecodeByteO = JU_DIGITATSTATE(JU_JPDCDPOP0(Pjp), BranchLevel);
+	DecodeByteN = JU_DIGITATSTATE(Index,	         BranchLevel);
+
+	assert(DecodeByteO != DecodeByteN);
+
+//	Determine sorted order for old expanse and new Index digits:
+
+	if (DecodeByteN > DecodeByteO)	{ Iold = 0; Inew = 1; }
+	else				{ Iold = 1; Inew = 0; }
+
+//	Copy old JP into staging area for new Branch
+	JP2 [Iold] = *Pjp;
+	Exp2[Iold] = DecodeByteO;
+	Exp2[Inew] = DecodeByteN;
+
+//	Create a 2 Expanse Linear branch
+//
+//	Note: Pjp->jp_Addr is set by j__udyCreateBranchL()
+
+	Ret = j__udyCreateBranchL(Pjp, JP2, Exp2, 2, Pjpm);
+	if (Ret == -1) return(-1);
+
+//	Get Pjp to the NULL of where to do insert
+	PjpNull	= ((P_JBL(Pjp->jp_Addr))->jbl_jp) + Inew;
+
+//	Convert to a cJU_JPIMMED_*_01 at the correct level:
+//	Build JP and set type below to: cJU_JPIMMED_X_01
+        JU_JPSETADT(PjpNull, 0, Index, cJU_JPIMMED_1_01 - 2 + BranchLevel);
+
+//	Return pointer to Value area in cJU_JPIMMED_X_01
+	JUDYLCODE(Pjpm->jpm_PValue = (Pjv_t) PjpNull;)
+
+//	The old JP now points to a BranchL that is at higher level.  Therefore
+//	it contains excess DCD bits (in the least significant position) that
+//	must be removed (zeroed); that is, they become part of the Pop0
+//	subfield.  Note that the remaining (lower) bytes in the Pop0 field do
+//	not change.
+//
+//	Take from the old DCDMask, which went "down" to a lower BranchLevel,
+//	and zero any high bits that are still in the mask at the new, higher
+//	BranchLevel; then use this mask to zero the bits in jp_DcdPopO:
+
+//	Set old JP to a BranchL at correct level
+
+	Pjp->jp_Type = cJU_JPBRANCH_L2 - 2 + BranchLevel;
+	DCDMask		^= cJU_DCDMASK(BranchLevel);
+	DCDMask		 = ~DCDMask & JU_JPDCDPOP0(Pjp);
+        JP = *Pjp;
+        JU_JPSETADT(Pjp, JP.jp_Addr, DCDMask, JP.jp_Type);
+
+	return(1);
+
+} // j__udyInsertBranch()
diff --git a/libs/klib/judy/JudyL.h b/libs/klib/judy/JudyL.h
new file mode 100644
index 0000000..13c7d66
--- /dev/null
+++ b/libs/klib/judy/JudyL.h
@@ -0,0 +1,503 @@
+#ifndef _JUDYL_INCLUDED
+#define _JUDYL_INCLUDED
+// _________________
+//
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// ****************************************************************************
+//          JUDYL -- SMALL/LARGE AND/OR CLUSTERED/SPARSE ARRAYS
+//
+//                                    -by-
+//
+//                             Douglas L. Baskins
+//                             doug at sourcejudy.com
+//
+// Judy arrays are designed to be used instead of arrays.  The performance
+// suggests the reason why Judy arrays are thought of as arrays, instead of
+// trees.  They are remarkably memory efficient at all populations.
+// Implemented as a hybrid digital tree (but really a state machine, see
+// below), Judy arrays feature fast insert/retrievals, fast near neighbor
+// searching, and contain a population tree for extremely fast ordinal related
+// retrievals.
+//
+// CONVENTIONS:
+//
+// - The comments here refer to 32-bit [64-bit] systems.
+//
+// - BranchL, LeafL refer to linear branches and leaves (small populations),
+//   except LeafL does not actually appear as such; rather, Leaf1..3 [Leaf1..7]
+//   is used to represent leaf Index sizes, and LeafW refers to a Leaf with
+//   full (Long) word Indexes, which is also a type of linear leaf.  Note that
+//   root-level LeafW (Leaf4 [Leaf8]) leaves are called LEAFW.
+//
+// - BranchB, LeafB1 refer to bitmap branches and leaves (intermediate
+//   populations).
+//
+// - BranchU refers to uncompressed branches.  An uncompressed branch has 256
+//   JPs, some of which could be null.  Note:  All leaves are compressed (and
+//   sorted), or else an expanse is full (FullPopu), so there is no LeafU
+//   equivalent to BranchU.
+//
+// - "Popu" is short for "Population".
+// - "Pop1" refers to actual population (base 1).
+// - "Pop0" refers to Pop1 - 1 (base 0), the way populations are stored in data
+//   structures.
+//
+// - Branches and Leaves are both named by the number of bytes in their Pop0
+//   field.  In the case of Leaves, the same number applies to the Index sizes.
+//
+// - The representation of many numbers as hex is a relatively safe and
+//   portable way to get desired bitpatterns as unsigned longs.
+//
+// - Some preprocessors cant handle single apostrophe characters within
+//   #ifndef code, so here, delete all instead.
+
+
+#include "JudyPrivate.h"        // includes Judy.h in turn.
+#include "JudyPrivateBranch.h"  // support for branches.
+
+
+// ****************************************************************************
+// JUDYL ROOT POINTER (JRP) AND JUDYL POINTER (JP) TYPE FIELDS
+// ****************************************************************************
+
+typedef enum            // uint8_t -- but C does not support this type of enum.
+{
+
+// JP NULL TYPES:
+//
+// There is a series of cJL_JPNULL* Types because each one pre-records a
+// different Index Size for when the first Index is inserted in the previously
+// null JP.  They must start >= 8 (three bits).
+//
+// Note:  These Types must be in sequential order for doing relative
+// calculations between them.
+
+        cJL_JPNULL1 = 1,
+                                // Index Size 1[1] byte  when 1 Index inserted.
+        cJL_JPNULL2,            // Index Size 2[2] bytes when 1 Index inserted.
+        cJL_JPNULL3,            // Index Size 3[3] bytes when 1 Index inserted.
+
+#ifndef JU_64BIT
+#define cJL_JPNULLMAX cJL_JPNULL3
+#else
+        cJL_JPNULL4,            // Index Size 4[4] bytes when 1 Index inserted.
+        cJL_JPNULL5,            // Index Size 5[5] bytes when 1 Index inserted.
+        cJL_JPNULL6,            // Index Size 6[6] bytes when 1 Index inserted.
+        cJL_JPNULL7,            // Index Size 7[7] bytes when 1 Index inserted.
+#define cJL_JPNULLMAX cJL_JPNULL7
+#endif
+
+
+// JP BRANCH TYPES:
+//
+// Note:  There are no state-1 branches; only leaves reside at state 1.
+
+// Linear branches:
+//
+// Note:  These Types must be in sequential order for doing relative
+// calculations between them.
+
+        cJL_JPBRANCH_L2,        // 2[2] bytes Pop0, 1[5] bytes Dcd.
+        cJL_JPBRANCH_L3,        // 3[3] bytes Pop0, 0[4] bytes Dcd.
+
+#ifdef JU_64BIT
+        cJL_JPBRANCH_L4,        //  [4] bytes Pop0,  [3] bytes Dcd.
+        cJL_JPBRANCH_L5,        //  [5] bytes Pop0,  [2] bytes Dcd.
+        cJL_JPBRANCH_L6,        //  [6] bytes Pop0,  [1] byte  Dcd.
+        cJL_JPBRANCH_L7,        //  [7] bytes Pop0,  [0] bytes Dcd.
+#endif
+
+        cJL_JPBRANCH_L,         // note:  DcdPopO field not used.
+
+// Bitmap branches:
+//
+// Note:  These Types must be in sequential order for doing relative
+// calculations between them.
+
+        cJL_JPBRANCH_B2,        // 2[2] bytes Pop0, 1[5] bytes Dcd.
+        cJL_JPBRANCH_B3,        // 3[3] bytes Pop0, 0[4] bytes Dcd.
+
+#ifdef JU_64BIT
+        cJL_JPBRANCH_B4,        //  [4] bytes Pop0,  [3] bytes Dcd.
+        cJL_JPBRANCH_B5,        //  [5] bytes Pop0,  [2] bytes Dcd.
+        cJL_JPBRANCH_B6,        //  [6] bytes Pop0,  [1] byte  Dcd.
+        cJL_JPBRANCH_B7,        //  [7] bytes Pop0,  [0] bytes Dcd.
+#endif
+
+        cJL_JPBRANCH_B,         // note:  DcdPopO field not used.
+
+// Uncompressed branches:
+//
+// Note:  These Types must be in sequential order for doing relative
+// calculations between them.
+
+        cJL_JPBRANCH_U2,        // 2[2] bytes Pop0, 1[5] bytes Dcd.
+        cJL_JPBRANCH_U3,        // 3[3] bytes Pop0, 0[4] bytes Dcd.
+
+#ifdef JU_64BIT
+        cJL_JPBRANCH_U4,        //  [4] bytes Pop0,  [3] bytes Dcd.
+        cJL_JPBRANCH_U5,        //  [5] bytes Pop0,  [2] bytes Dcd.
+        cJL_JPBRANCH_U6,        //  [6] bytes Pop0,  [1] byte  Dcd.
+        cJL_JPBRANCH_U7,        //  [7] bytes Pop0,  [0] bytes Dcd.
+#endif
+
+        cJL_JPBRANCH_U,         // note:  DcdPopO field not used.
+
+
+// JP LEAF TYPES:
+
+// Linear leaves:
+//
+// Note:  These Types must be in sequential order for doing relative
+// calculations between them.
+//
+// Note:  There is no full-word (4-byte [8-byte]) Index leaf under a JP because
+// non-root-state leaves only occur under branches that decode at least one
+// byte.  Full-word, root-state leaves are under a JRP, not a JP.  However, in
+// the code a "fake" JP can be created temporarily above a root-state leaf.
+
+        cJL_JPLEAF1,            // 1[1] byte  Pop0, 2    bytes Dcd.
+        cJL_JPLEAF2,            // 2[2] bytes Pop0, 1[5] bytes Dcd.
+        cJL_JPLEAF3,            // 3[3] bytes Pop0, 0[4] bytes Dcd.
+
+#ifdef JU_64BIT
+        cJL_JPLEAF4,            //  [4] bytes Pop0,  [3] bytes Dcd.
+        cJL_JPLEAF5,            //  [5] bytes Pop0,  [2] bytes Dcd.
+        cJL_JPLEAF6,            //  [6] bytes Pop0,  [1] byte  Dcd.
+        cJL_JPLEAF7,            //  [7] bytes Pop0,  [0] bytes Dcd.
+#endif
+
+// Bitmap leaf; Index Size == 1:
+//
+// Note:  These are currently only supported at state 1.  At other states the
+// bitmap would grow from 256 to 256^2, 256^3, ... bits, which would not be
+// efficient..
+
+        cJL_JPLEAF_B1,          // 1[1] byte Pop0, 2[6] bytes Dcd.
+
+// Full population; Index Size == 1 virtual leaf:
+//
+// Note:  JudyL has no cJL_JPFULLPOPU1 equivalent to cJ1_JPFULLPOPU1, because
+// in the JudyL case this could result in a values-only leaf of up to 256 words
+// (value areas) that would be slow to insert/delete.
+
+
+// JP IMMEDIATES; leaves (Indexes) stored inside a JP:
+//
+// The second numeric suffix is the Pop1 for each type.  As the Index Size
+// increases, the maximum possible population decreases.
+//
+// Note:  These Types must be in sequential order in each group (Index Size),
+// and the groups in correct order too, for doing relative calculations between
+// them.  For example, since these Types enumerate the Pop1 values (unlike
+// other JP Types where there is a Pop0 value in the JP), the maximum Pop1 for
+// each Index Size is computable.
+//
+// All enums equal or above this point are cJL_JPIMMEDs.
+
+        cJL_JPIMMED_1_01,       // Index Size = 1, Pop1 = 1.
+        cJL_JPIMMED_2_01,       // Index Size = 2, Pop1 = 1.
+        cJL_JPIMMED_3_01,       // Index Size = 3, Pop1 = 1.
+
+#ifdef JU_64BIT
+        cJL_JPIMMED_4_01,       // Index Size = 4, Pop1 = 1.
+        cJL_JPIMMED_5_01,       // Index Size = 5, Pop1 = 1.
+        cJL_JPIMMED_6_01,       // Index Size = 6, Pop1 = 1.
+        cJL_JPIMMED_7_01,       // Index Size = 7, Pop1 = 1.
+#endif
+
+        cJL_JPIMMED_1_02,       // Index Size = 1, Pop1 = 2.
+        cJL_JPIMMED_1_03,       // Index Size = 1, Pop1 = 3.
+
+#ifdef JU_64BIT
+        cJL_JPIMMED_1_04,       // Index Size = 1, Pop1 = 4.
+        cJL_JPIMMED_1_05,       // Index Size = 1, Pop1 = 5.
+        cJL_JPIMMED_1_06,       // Index Size = 1, Pop1 = 6.
+        cJL_JPIMMED_1_07,       // Index Size = 1, Pop1 = 7.
+
+        cJL_JPIMMED_2_02,       // Index Size = 2, Pop1 = 2.
+        cJL_JPIMMED_2_03,       // Index Size = 2, Pop1 = 3.
+
+        cJL_JPIMMED_3_02,       // Index Size = 3, Pop1 = 2.
+#endif
+
+// This special Type is merely a sentinel for doing relative calculations.
+// This value should not be used in switch statements (to avoid allocating code
+// for it), which is also why it appears at the end of the enum list.
+
+        cJL_JPIMMED_CAP
+
+} jpL_Type_t;
+
+
+// RELATED VALUES:
+
+// Index Size (state) for leaf JP, and JP type based on Index Size (state):
+
+#define JL_LEAFINDEXSIZE(jpType) ((jpType)    - cJL_JPLEAF1 + 1)
+#define JL_LEAFTYPE(IndexSize)   ((IndexSize) + cJL_JPLEAF1 - 1)
+
+
+// MAXIMUM POPULATIONS OF LINEAR LEAVES:
+
+#ifndef JU_64BIT // 32-bit
+
+#define J_L_MAXB                (sizeof(Word_t) * 64)
+#define ALLOCSIZES { 3, 5, 7, 11, 15, 23, 32, 47, 64, TERMINATOR } // in words.
+#define cJL_LEAF1_MAXWORDS               (32)   // max Leaf1 size in words.
+
+// Note:  cJL_LEAF1_MAXPOP1 is chosen such that the index portion is less than
+// 32 bytes -- the number of bytes the index takes in a bitmap leaf.
+
+#define cJL_LEAF1_MAXPOP1 \
+   ((cJL_LEAF1_MAXWORDS * cJU_BYTESPERWORD)/(1 + cJU_BYTESPERWORD))
+#define cJL_LEAF2_MAXPOP1       (J_L_MAXB / (2 + cJU_BYTESPERWORD))
+#define cJL_LEAF3_MAXPOP1       (J_L_MAXB / (3 + cJU_BYTESPERWORD))
+#define cJL_LEAFW_MAXPOP1 \
+           ((J_L_MAXB - cJU_BYTESPERWORD) / (2 * cJU_BYTESPERWORD))
+
+#else // 64-bit
+
+#define J_L_MAXB                (sizeof(Word_t) * 64)
+#define ALLOCSIZES { 3, 5, 7, 11, 15, 23, 32, 47, 64, TERMINATOR } // in words.
+#define cJL_LEAF1_MAXWORDS       (15)   // max Leaf1 size in words.
+
+#define cJL_LEAF1_MAXPOP1 \
+   ((cJL_LEAF1_MAXWORDS * cJU_BYTESPERWORD)/(1 + cJU_BYTESPERWORD))
+#define cJL_LEAF2_MAXPOP1       (J_L_MAXB / (2 + cJU_BYTESPERWORD))
+#define cJL_LEAF3_MAXPOP1       (J_L_MAXB / (3 + cJU_BYTESPERWORD))
+#define cJL_LEAF4_MAXPOP1       (J_L_MAXB / (4 + cJU_BYTESPERWORD))
+#define cJL_LEAF5_MAXPOP1       (J_L_MAXB / (5 + cJU_BYTESPERWORD))
+#define cJL_LEAF6_MAXPOP1       (J_L_MAXB / (6 + cJU_BYTESPERWORD))
+#define cJL_LEAF7_MAXPOP1       (J_L_MAXB / (7 + cJU_BYTESPERWORD))
+#define cJL_LEAFW_MAXPOP1 \
+           ((J_L_MAXB - cJU_BYTESPERWORD) / (2 * cJU_BYTESPERWORD))
+
+#endif // 64-bit
+
+
+// MAXIMUM POPULATIONS OF IMMEDIATE JPs:
+//
+// These specify the maximum Population of immediate JPs with various Index
+// Sizes (== sizes of remaining undecoded Index bits).  Since the JP Types enum
+// already lists all the immediates in order by state and size, calculate these
+// values from it to avoid redundancy.
+
+#define cJL_IMMED1_MAXPOP1  ((cJU_BYTESPERWORD - 1) / 1)        // 3 [7].
+#define cJL_IMMED2_MAXPOP1  ((cJU_BYTESPERWORD - 1) / 2)        // 1 [3].
+#define cJL_IMMED3_MAXPOP1  ((cJU_BYTESPERWORD - 1) / 3)        // 1 [2].
+
+#ifdef JU_64BIT
+#define cJL_IMMED4_MAXPOP1  ((cJU_BYTESPERWORD - 1) / 4)        //   [1].
+#define cJL_IMMED5_MAXPOP1  ((cJU_BYTESPERWORD - 1) / 5)        //   [1].
+#define cJL_IMMED6_MAXPOP1  ((cJU_BYTESPERWORD - 1) / 6)        //   [1].
+#define cJL_IMMED7_MAXPOP1  ((cJU_BYTESPERWORD - 1) / 7)        //   [1].
+#endif
+
+
+// ****************************************************************************
+// JUDYL LEAF BITMAP (JLLB) SUPPORT
+// ****************************************************************************
+//
+// Assemble bitmap leaves out of smaller units that put bitmap subexpanses
+// close to their associated pointers.  Why not just use a bitmap followed by a
+// series of pointers?  (See 4.27.)  Turns out this wastes a cache fill on
+// systems with smaller cache lines than the assumed value cJU_WORDSPERCL.
+
+#define JL_JLB_BITMAP(Pjlb, Subexp)  ((Pjlb)->jLlb_jLlbs[Subexp].jLlbs_Bitmap)
+#define JL_JLB_PVALUE(Pjlb, Subexp)  ((Pjlb)->jLlb_jLlbs[Subexp].jLlbs_PValue)
+
+typedef struct J__UDYL_LEAF_BITMAP_SUBEXPANSE
+{
+        BITMAPL_t jLlbs_Bitmap;
+        Pjv_t     jLlbs_PValue;
+
+} jLlbs_t;
+
+typedef struct J__UDYL_LEAF_BITMAP
+{
+        jLlbs_t jLlb_jLlbs[cJU_NUMSUBEXPL];
+
+} jLlb_t, * PjLlb_t;
+
+// Words per bitmap leaf:
+
+#define cJL_WORDSPERLEAFB1  (sizeof(jLlb_t) / cJU_BYTESPERWORD)
+
+
+// ****************************************************************************
+// MEMORY ALLOCATION SUPPORT
+// ****************************************************************************
+
+// ARRAY-GLOBAL INFORMATION:
+//
+// At the cost of an occasional additional cache fill, this object, which is
+// pointed at by a JRP and in turn points to a JP_BRANCH*, carries array-global
+// information about a JudyL array that has sufficient population to amortize
+// the cost.  The jpm_Pop0 field prevents having to add up the total population
+// for the array in insert, delete, and count code.  The jpm_JP field prevents
+// having to build a fake JP for entry to a state machine; however, the
+// jp_DcdPopO field in jpm_JP, being one byte too small, is not used.
+//
+// Note:  Struct fields are ordered to keep "hot" data in the first 8 words
+// (see left-margin comments) for machines with 8-word cache lines, and to keep
+// sub-word fields together for efficient packing.
+
+typedef struct J_UDYL_POPULATION_AND_MEMORY
+{
+/* 1 */ Word_t     jpm_Pop0;            // total population-1 in array.
+/* 2 */ jp_t       jpm_JP;              // JP to first branch; see above.
+/* 4 */ Word_t     jpm_LastUPop0;       // last jpm_Pop0 when convert to BranchU
+/* 7 */ Pjv_t      jpm_PValue;          // pointer to value to return.
+// Note:  Field names match PJError_t for convenience in macros:
+/* 8 */ char       je_Errno;            // one of the enums in Judy.h.
+/* 8/9  */ int     je_ErrID;            // often an internal source line number.
+/* 9/10 */ Word_t  jpm_TotalMemWords;   // words allocated in array.
+} jLpm_t, *PjLpm_t;
+
+
+// TABLES FOR DETERMINING IF LEAVES HAVE ROOM TO GROW:
+//
+// These tables indicate if a given memory chunk can support growth of a given
+// object into wasted (rounded-up) memory in the chunk.  Note:  This violates
+// the hiddenness of the JudyMalloc code.
+
+extern const uint8_t j__L_Leaf1PopToWords[cJL_LEAF1_MAXPOP1 + 1];
+extern const uint8_t j__L_Leaf2PopToWords[cJL_LEAF2_MAXPOP1 + 1];
+extern const uint8_t j__L_Leaf3PopToWords[cJL_LEAF3_MAXPOP1 + 1];
+#ifdef JU_64BIT
+extern const uint8_t j__L_Leaf4PopToWords[cJL_LEAF4_MAXPOP1 + 1];
+extern const uint8_t j__L_Leaf5PopToWords[cJL_LEAF5_MAXPOP1 + 1];
+extern const uint8_t j__L_Leaf6PopToWords[cJL_LEAF6_MAXPOP1 + 1];
+extern const uint8_t j__L_Leaf7PopToWords[cJL_LEAF7_MAXPOP1 + 1];
+#endif
+extern const uint8_t j__L_LeafWPopToWords[cJL_LEAFW_MAXPOP1 + 1];
+extern const uint8_t j__L_LeafVPopToWords[];
+
+// These tables indicate where value areas start:
+
+extern const uint8_t j__L_Leaf1Offset    [cJL_LEAF1_MAXPOP1 + 1];
+extern const uint8_t j__L_Leaf2Offset    [cJL_LEAF2_MAXPOP1 + 1];
+extern const uint8_t j__L_Leaf3Offset    [cJL_LEAF3_MAXPOP1 + 1];
+#ifdef JU_64BIT
+extern const uint8_t j__L_Leaf4Offset    [cJL_LEAF4_MAXPOP1 + 1];
+extern const uint8_t j__L_Leaf5Offset    [cJL_LEAF5_MAXPOP1 + 1];
+extern const uint8_t j__L_Leaf6Offset    [cJL_LEAF6_MAXPOP1 + 1];
+extern const uint8_t j__L_Leaf7Offset    [cJL_LEAF7_MAXPOP1 + 1];
+#endif
+extern const uint8_t j__L_LeafWOffset    [cJL_LEAFW_MAXPOP1 + 1];
+
+// Also define macros to hide the details in the code using these tables.
+
+#define JL_LEAF1GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJL_LEAF1_MAXPOP1, j__L_Leaf1PopToWords)
+#define JL_LEAF2GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJL_LEAF2_MAXPOP1, j__L_Leaf2PopToWords)
+#define JL_LEAF3GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJL_LEAF3_MAXPOP1, j__L_Leaf3PopToWords)
+#ifdef JU_64BIT
+#define JL_LEAF4GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJL_LEAF4_MAXPOP1, j__L_Leaf4PopToWords)
+#define JL_LEAF5GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJL_LEAF5_MAXPOP1, j__L_Leaf5PopToWords)
+#define JL_LEAF6GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJL_LEAF6_MAXPOP1, j__L_Leaf6PopToWords)
+#define JL_LEAF7GROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJL_LEAF7_MAXPOP1, j__L_Leaf7PopToWords)
+#endif
+#define JL_LEAFWGROWINPLACE(Pop1) \
+        J__U_GROWCK(Pop1, cJL_LEAFW_MAXPOP1, j__L_LeafWPopToWords)
+#define JL_LEAFVGROWINPLACE(Pop1)  \
+        J__U_GROWCK(Pop1, cJU_BITSPERSUBEXPL,  j__L_LeafVPopToWords)
+
+#define JL_LEAF1VALUEAREA(Pjv,Pop1)  (((PWord_t)(Pjv)) + j__L_Leaf1Offset[Pop1])
+#define JL_LEAF2VALUEAREA(Pjv,Pop1)  (((PWord_t)(Pjv)) + j__L_Leaf2Offset[Pop1])
+#define JL_LEAF3VALUEAREA(Pjv,Pop1)  (((PWord_t)(Pjv)) + j__L_Leaf3Offset[Pop1])
+#ifdef JU_64BIT
+#define JL_LEAF4VALUEAREA(Pjv,Pop1)  (((PWord_t)(Pjv)) + j__L_Leaf4Offset[Pop1])
+#define JL_LEAF5VALUEAREA(Pjv,Pop1)  (((PWord_t)(Pjv)) + j__L_Leaf5Offset[Pop1])
+#define JL_LEAF6VALUEAREA(Pjv,Pop1)  (((PWord_t)(Pjv)) + j__L_Leaf6Offset[Pop1])
+#define JL_LEAF7VALUEAREA(Pjv,Pop1)  (((PWord_t)(Pjv)) + j__L_Leaf7Offset[Pop1])
+#endif
+#define JL_LEAFWVALUEAREA(Pjv,Pop1)  (((PWord_t)(Pjv)) + j__L_LeafWOffset[Pop1])
+
+#define JL_LEAF1POPTOWORDS(Pop1)        (j__L_Leaf1PopToWords[Pop1])
+#define JL_LEAF2POPTOWORDS(Pop1)        (j__L_Leaf2PopToWords[Pop1])
+#define JL_LEAF3POPTOWORDS(Pop1)        (j__L_Leaf3PopToWords[Pop1])
+#ifdef JU_64BIT
+#define JL_LEAF4POPTOWORDS(Pop1)        (j__L_Leaf4PopToWords[Pop1])
+#define JL_LEAF5POPTOWORDS(Pop1)        (j__L_Leaf5PopToWords[Pop1])
+#define JL_LEAF6POPTOWORDS(Pop1)        (j__L_Leaf6PopToWords[Pop1])
+#define JL_LEAF7POPTOWORDS(Pop1)        (j__L_Leaf7PopToWords[Pop1])
+#endif
+#define JL_LEAFWPOPTOWORDS(Pop1)        (j__L_LeafWPopToWords[Pop1])
+#define JL_LEAFVPOPTOWORDS(Pop1)        (j__L_LeafVPopToWords[Pop1])
+
+
+// FUNCTIONS TO ALLOCATE OBJECTS:
+
+PjLpm_t j__udyLAllocJLPM(void);                         // constant size.
+
+Pjbl_t  j__udyLAllocJBL(          PjLpm_t);             // constant size.
+Pjbb_t  j__udyLAllocJBB(          PjLpm_t);             // constant size.
+Pjp_t   j__udyLAllocJBBJP(Word_t, PjLpm_t);
+Pjbu_t  j__udyLAllocJBU(          PjLpm_t);             // constant size.
+
+Pjll_t  j__udyLAllocJLL1( Word_t, PjLpm_t);
+Pjll_t  j__udyLAllocJLL2( Word_t, PjLpm_t);
+Pjll_t  j__udyLAllocJLL3( Word_t, PjLpm_t);
+
+#ifdef JU_64BIT
+Pjll_t  j__udyLAllocJLL4( Word_t, PjLpm_t);
+Pjll_t  j__udyLAllocJLL5( Word_t, PjLpm_t);
+Pjll_t  j__udyLAllocJLL6( Word_t, PjLpm_t);
+Pjll_t  j__udyLAllocJLL7( Word_t, PjLpm_t);
+#endif
+
+Pjlw_t  j__udyLAllocJLW(  Word_t         );             // no PjLpm_t needed.
+PjLlb_t j__udyLAllocJLB1(         PjLpm_t);             // constant size.
+Pjv_t   j__udyLAllocJV(   Word_t, PjLpm_t);
+
+
+// FUNCTIONS TO FREE OBJECTS:
+
+void    j__udyLFreeJLPM( PjLpm_t,        PjLpm_t);      // constant size.
+
+void    j__udyLFreeJBL(  Pjbl_t,         PjLpm_t);      // constant size.
+void    j__udyLFreeJBB(  Pjbb_t,         PjLpm_t);      // constant size.
+void    j__udyLFreeJBBJP(Pjp_t,  Word_t, PjLpm_t);
+void    j__udyLFreeJBU(  Pjbu_t,         PjLpm_t);      // constant size.
+
+void    j__udyLFreeJLL1( Pjll_t, Word_t, PjLpm_t);
+void    j__udyLFreeJLL2( Pjll_t, Word_t, PjLpm_t);
+void    j__udyLFreeJLL3( Pjll_t, Word_t, PjLpm_t);
+
+#ifdef JU_64BIT
+void    j__udyLFreeJLL4( Pjll_t, Word_t, PjLpm_t);
+void    j__udyLFreeJLL5( Pjll_t, Word_t, PjLpm_t);
+void    j__udyLFreeJLL6( Pjll_t, Word_t, PjLpm_t);
+void    j__udyLFreeJLL7( Pjll_t, Word_t, PjLpm_t);
+#endif
+
+void    j__udyLFreeJLW(  Pjlw_t, Word_t, PjLpm_t);
+void    j__udyLFreeJLB1( PjLlb_t,        PjLpm_t);      // constant size.
+void    j__udyLFreeJV(   Pjv_t,  Word_t, PjLpm_t);
+void    j__udyLFreeSM(   Pjp_t,          PjLpm_t);      // everything below Pjp.
+
+#endif // ! _JUDYL_INCLUDED
diff --git a/libs/klib/judy/JudyLTables.32.c b/libs/klib/judy/JudyLTables.32.c
new file mode 100644
index 0000000..c5f8793
--- /dev/null
+++ b/libs/klib/judy/JudyLTables.32.c
@@ -0,0 +1,121 @@
+// @(#) From generation tool: JudyTablesGen.c
+//
+
+#include "JudyL.h"
+// Leave the malloc() sizes readable in the binary (via strings(1)):
+const char * JudyLMallocSizes = "JudyLMallocSizes = 3, 5, 7, 11, 15, 23, 32, 47, 64, Leaf1 = 25";
+
+
+//	object uses 64 words
+//	cJU_BITSPERSUBEXPB = 32
+const uint8_t
+j__L_BranchBJPPopToWords[cJU_BITSPERSUBEXPB + 1] =
+{
+	 0,
+	 3,  5,  7, 11, 11, 15, 15, 23, 
+	23, 23, 23, 32, 32, 32, 32, 32, 
+	47, 47, 47, 47, 47, 47, 47, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64
+};
+
+//	object uses 32 words
+//	cJL_LEAF1_MAXPOP1 = 25
+const uint8_t
+j__L_Leaf1PopToWords[cJL_LEAF1_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  5,  5,  7, 11, 11, 11, 
+	15, 15, 15, 15, 23, 23, 23, 23, 
+	23, 23, 32, 32, 32, 32, 32, 32, 
+	32
+};
+const uint8_t
+j__L_Leaf1Offset[cJL_LEAF1_MAXPOP1 + 1] =
+{
+	 0,
+	 1,  1,  1,  1,  2,  3,  3,  3, 
+	 3,  3,  3,  3,  5,  5,  5,  5, 
+	 5,  5,  7,  7,  7,  7,  7,  7, 
+	 7
+};
+
+//	object uses 63 words
+//	cJL_LEAF2_MAXPOP1 = 42
+const uint8_t
+j__L_Leaf2PopToWords[cJL_LEAF2_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  5,  7, 11, 11, 11, 15, 
+	15, 15, 23, 23, 23, 23, 23, 32, 
+	32, 32, 32, 32, 32, 47, 47, 47, 
+	47, 47, 47, 47, 47, 47, 47, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63
+};
+const uint8_t
+j__L_Leaf2Offset[cJL_LEAF2_MAXPOP1 + 1] =
+{
+	 0,
+	 1,  1,  2,  2,  4,  4,  4,  5, 
+	 5,  5,  8,  8,  8,  8,  8, 11, 
+	11, 11, 11, 11, 11, 16, 16, 16, 
+	16, 16, 16, 16, 16, 16, 16, 21, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21
+};
+
+//	object uses 63 words
+//	cJL_LEAF3_MAXPOP1 = 36
+const uint8_t
+j__L_Leaf3PopToWords[cJL_LEAF3_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  5,  7,  7, 11, 11, 15, 15, 
+	23, 23, 23, 23, 23, 32, 32, 32, 
+	32, 32, 47, 47, 47, 47, 47, 47, 
+	47, 47, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63
+};
+const uint8_t
+j__L_Leaf3Offset[cJL_LEAF3_MAXPOP1 + 1] =
+{
+	 0,
+	 1,  3,  3,  3,  5,  5,  6,  6, 
+	10, 10, 10, 10, 10, 14, 14, 14, 
+	14, 14, 20, 20, 20, 20, 20, 20, 
+	20, 20, 27, 27, 27, 27, 27, 27, 
+	27, 27, 27, 27
+};
+
+//	object uses 63 words
+//	cJL_LEAFW_MAXPOP1 = 31
+const uint8_t
+j__L_LeafWPopToWords[cJL_LEAFW_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  5,  7, 11, 11, 15, 15, 23, 
+	23, 23, 23, 32, 32, 32, 32, 47, 
+	47, 47, 47, 47, 47, 47, 47, 63, 
+	63, 63, 63, 63, 63, 63, 63
+};
+const uint8_t
+j__L_LeafWOffset[cJL_LEAFW_MAXPOP1 + 1] =
+{
+	 0,
+	 2,  3,  4,  6,  6,  8,  8, 12, 
+	12, 12, 12, 16, 16, 16, 16, 24, 
+	24, 24, 24, 24, 24, 24, 24, 32, 
+	32, 32, 32, 32, 32, 32, 32
+};
+
+//	object uses 32 words
+//	cJU_BITSPERSUBEXPL = 32
+const uint8_t
+j__L_LeafVPopToWords[cJU_BITSPERSUBEXPL + 1] =
+{
+	 0,
+	 3,  3,  3,  5,  5,  7,  7, 11, 
+	11, 11, 11, 15, 15, 15, 15, 23, 
+	23, 23, 23, 23, 23, 23, 23, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32
+};
diff --git a/libs/klib/judy/JudyLTables.64.c b/libs/klib/judy/JudyLTables.64.c
new file mode 100644
index 0000000..8b818e1
--- /dev/null
+++ b/libs/klib/judy/JudyLTables.64.c
@@ -0,0 +1,219 @@
+// @(#) From generation tool: JudyTablesGen.c
+//
+
+#include "JudyL.h"
+// Leave the malloc() sizes readable in the binary (via strings(1)):
+const char * JudyLMallocSizes = "JudyLMallocSizes = 3, 5, 7, 11, 15, 23, 32, 47, 64, Leaf1 = 13";
+
+
+//	object uses 64 words
+//	cJU_BITSPERSUBEXPB = 32
+const uint8_t
+j__L_BranchBJPPopToWords[cJU_BITSPERSUBEXPB + 1] =
+{
+	 0,
+	 3,  5,  7, 11, 11, 15, 15, 23, 
+	23, 23, 23, 32, 32, 32, 32, 32, 
+	47, 47, 47, 47, 47, 47, 47, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64
+};
+
+//	object uses 15 words
+//	cJL_LEAF1_MAXPOP1 = 13
+const uint8_t
+j__L_Leaf1PopToWords[cJL_LEAF1_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  5,  5,  7,  7, 11, 11, 
+	11, 15, 15, 15, 15
+};
+const uint8_t
+j__L_Leaf1Offset[cJL_LEAF1_MAXPOP1 + 1] =
+{
+	 0,
+	 1,  1,  1,  1,  1,  1,  2,  2, 
+	 2,  2,  2,  2,  2
+};
+
+//	object uses 64 words
+//	cJL_LEAF2_MAXPOP1 = 51
+const uint8_t
+j__L_Leaf2PopToWords[cJL_LEAF2_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  5,  5,  7, 11, 11, 11, 
+	15, 15, 15, 15, 23, 23, 23, 23, 
+	23, 23, 32, 32, 32, 32, 32, 32, 
+	32, 47, 47, 47, 47, 47, 47, 47, 
+	47, 47, 47, 47, 47, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64
+};
+const uint8_t
+j__L_Leaf2Offset[cJL_LEAF2_MAXPOP1 + 1] =
+{
+	 0,
+	 1,  1,  1,  1,  2,  3,  3,  3, 
+	 3,  3,  3,  3,  5,  5,  5,  5, 
+	 5,  5,  7,  7,  7,  7,  7,  7, 
+	 7, 10, 10, 10, 10, 10, 10, 10, 
+	10, 10, 10, 10, 10, 13, 13, 13, 
+	13, 13, 13, 13, 13, 13, 13, 13, 
+	13, 13, 13
+};
+
+//	object uses 64 words
+//	cJL_LEAF3_MAXPOP1 = 46
+const uint8_t
+j__L_Leaf3PopToWords[cJL_LEAF3_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  5,  7,  7, 11, 11, 11, 
+	15, 15, 23, 23, 23, 23, 23, 23, 
+	32, 32, 32, 32, 32, 32, 32, 47, 
+	47, 47, 47, 47, 47, 47, 47, 47, 
+	47, 47, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64
+};
+const uint8_t
+j__L_Leaf3Offset[cJL_LEAF3_MAXPOP1 + 1] =
+{
+	 0,
+	 1,  1,  2,  2,  2,  3,  3,  3, 
+	 4,  4,  6,  6,  6,  6,  6,  6, 
+	 9,  9,  9,  9,  9,  9,  9, 13, 
+	13, 13, 13, 13, 13, 13, 13, 13, 
+	13, 13, 18, 18, 18, 18, 18, 18, 
+	18, 18, 18, 18, 18, 18
+};
+
+//	object uses 63 words
+//	cJL_LEAF4_MAXPOP1 = 42
+const uint8_t
+j__L_Leaf4PopToWords[cJL_LEAF4_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  3,  5,  7, 11, 11, 11, 15, 
+	15, 15, 23, 23, 23, 23, 23, 32, 
+	32, 32, 32, 32, 32, 47, 47, 47, 
+	47, 47, 47, 47, 47, 47, 47, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63
+};
+const uint8_t
+j__L_Leaf4Offset[cJL_LEAF4_MAXPOP1 + 1] =
+{
+	 0,
+	 1,  1,  2,  2,  4,  4,  4,  5, 
+	 5,  5,  8,  8,  8,  8,  8, 11, 
+	11, 11, 11, 11, 11, 16, 16, 16, 
+	16, 16, 16, 16, 16, 16, 16, 21, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21
+};
+
+//	object uses 64 words
+//	cJL_LEAF5_MAXPOP1 = 39
+const uint8_t
+j__L_Leaf5PopToWords[cJL_LEAF5_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  5,  5,  7, 11, 11, 15, 15, 
+	15, 23, 23, 23, 23, 23, 32, 32, 
+	32, 32, 32, 47, 47, 47, 47, 47, 
+	47, 47, 47, 47, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64
+};
+const uint8_t
+j__L_Leaf5Offset[cJL_LEAF5_MAXPOP1 + 1] =
+{
+	 0,
+	 2,  2,  2,  3,  4,  4,  6,  6, 
+	 6,  9,  9,  9,  9,  9, 12, 12, 
+	12, 12, 12, 18, 18, 18, 18, 18, 
+	18, 18, 18, 18, 25, 25, 25, 25, 
+	25, 25, 25, 25, 25, 25, 25
+};
+
+//	object uses 63 words
+//	cJL_LEAF6_MAXPOP1 = 36
+const uint8_t
+j__L_Leaf6PopToWords[cJL_LEAF6_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  5,  7,  7, 11, 11, 15, 15, 
+	23, 23, 23, 23, 23, 32, 32, 32, 
+	32, 32, 47, 47, 47, 47, 47, 47, 
+	47, 47, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63
+};
+const uint8_t
+j__L_Leaf6Offset[cJL_LEAF6_MAXPOP1 + 1] =
+{
+	 0,
+	 1,  3,  3,  3,  5,  5,  6,  6, 
+	10, 10, 10, 10, 10, 14, 14, 14, 
+	14, 14, 20, 20, 20, 20, 20, 20, 
+	20, 20, 27, 27, 27, 27, 27, 27, 
+	27, 27, 27, 27
+};
+
+//	object uses 64 words
+//	cJL_LEAF7_MAXPOP1 = 34
+const uint8_t
+j__L_Leaf7PopToWords[cJL_LEAF7_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  5,  7, 11, 11, 15, 15, 15, 
+	23, 23, 23, 23, 32, 32, 32, 32, 
+	32, 47, 47, 47, 47, 47, 47, 47, 
+	47, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64
+};
+const uint8_t
+j__L_Leaf7Offset[cJL_LEAF7_MAXPOP1 + 1] =
+{
+	 0,
+	 1,  3,  3,  5,  5,  7,  7,  7, 
+	11, 11, 11, 11, 15, 15, 15, 15, 
+	15, 22, 22, 22, 22, 22, 22, 22, 
+	22, 30, 30, 30, 30, 30, 30, 30, 
+	30, 30
+};
+
+//	object uses 63 words
+//	cJL_LEAFW_MAXPOP1 = 31
+const uint8_t
+j__L_LeafWPopToWords[cJL_LEAFW_MAXPOP1 + 1] =
+{
+	 0,
+	 3,  5,  7, 11, 11, 15, 15, 23, 
+	23, 23, 23, 32, 32, 32, 32, 47, 
+	47, 47, 47, 47, 47, 47, 47, 63, 
+	63, 63, 63, 63, 63, 63, 63
+};
+const uint8_t
+j__L_LeafWOffset[cJL_LEAFW_MAXPOP1 + 1] =
+{
+	 0,
+	 2,  3,  4,  6,  6,  8,  8, 12, 
+	12, 12, 12, 16, 16, 16, 16, 24, 
+	24, 24, 24, 24, 24, 24, 24, 32, 
+	32, 32, 32, 32, 32, 32, 32
+};
+
+//	object uses 64 words
+//	cJU_BITSPERSUBEXPL = 64
+const uint8_t
+j__L_LeafVPopToWords[cJU_BITSPERSUBEXPL + 1] =
+{
+	 0,
+	 3,  3,  3,  5,  5,  7,  7, 11, 
+	11, 11, 11, 15, 15, 15, 15, 23, 
+	23, 23, 23, 23, 23, 23, 23, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	47, 47, 47, 47, 47, 47, 47, 47, 
+	47, 47, 47, 47, 47, 47, 47, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64
+};
diff --git a/libs/klib/judy/JudyMalloc.c b/libs/klib/judy/JudyMalloc.c
new file mode 100644
index 0000000..165521f
--- /dev/null
+++ b/libs/klib/judy/JudyMalloc.c
@@ -0,0 +1,86 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// ************************************************************************ //
+//                    JUDY - Memory Allocater                             //
+//                              -by-					  //
+//		         Douglas L. Baskins				  //
+//			  Hewlett Packard				  //
+//                        Fort Collins, Co				  //
+//                         (970) 229-2027				  //
+//									  //
+// ************************************************************************ //
+
+// JUDY INCLUDE FILES
+#include "Judy.h"
+
+// ****************************************************************************
+// J U D Y   M A L L O C
+//
+// Allocate RAM.  This is the single location in Judy code that calls
+// malloc(3C).  Note:  JPM accounting occurs at a higher level.
+
+Word_t JudyMalloc(
+	Word_t Words)
+{
+	Word_t Addr;
+
+	Addr = (Word_t) malloc(Words * sizeof(Word_t));
+	return(Addr);
+
+} // JudyMalloc()
+
+
+// ****************************************************************************
+// J U D Y   F R E E
+
+void JudyFree(
+	void * PWord,
+	Word_t Words)
+{
+	(void) Words;
+	free(PWord);
+
+} // JudyFree()
+
+
+// ****************************************************************************
+// J U D Y   M A L L O C
+//
+// Higher-level "wrapper" for allocating objects that need not be in RAM,
+// although at this time they are in fact only in RAM.  Later we hope that some
+// entire subtrees (at a JPM or branch) can be "virtual", so their allocations
+// and frees should go through this level.
+
+Word_t JudyMallocVirtual(
+	Word_t Words)
+{
+	return(JudyMalloc(Words));
+
+} // JudyMallocVirtual()
+
+
+// ****************************************************************************
+// J U D Y   F R E E
+
+void JudyFreeVirtual(
+	void * PWord,
+	Word_t Words)
+{
+        JudyFree(PWord, Words);
+
+} // JudyFreeVirtual()
diff --git a/libs/klib/judy/JudyMallocIF.c b/libs/klib/judy/JudyMallocIF.c
new file mode 100644
index 0000000..fa91d80
--- /dev/null
+++ b/libs/klib/judy/JudyMallocIF.c
@@ -0,0 +1,780 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Judy malloc/free interface functions for Judy1 and JudyL.
+//
+// Compile with one of -DJUDY1 or -DJUDYL.
+//
+// Compile with -DTRACEMI (Malloc Interface) to turn on tracing of malloc/free
+// calls at the interface level.  (See also TRACEMF in lower-level code.)
+// Use -DTRACEMI2 for a terser format suitable for trace analysis.
+//
+// There can be malloc namespace bits in the LSBs of "raw" addresses from most,
+// but not all, of the j__udy*Alloc*() functions; see also JudyPrivate.h.  To
+// test the Judy code, compile this file with -DMALLOCBITS and use debug flavor
+// only (for assertions).  This test ensures that (a) all callers properly mask
+// the namespace bits out before dereferencing a pointer (or else a core dump
+// occurs), and (b) all callers send "raw" (unmasked) addresses to
+// j__udy*Free*() calls.
+//
+// Note:  Currently -DDEBUG turns on MALLOCBITS automatically.
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+// Set "hidden" global j__uMaxWords to the maximum number of words to allocate
+// to any one array (large enough to have a JPM, otherwise j__uMaxWords is
+// ignored), to trigger a fake malloc error when the number is exceeded.  Note,
+// this code is always executed, not #ifdefd, because its virtually free.
+//
+// Note:  To keep the MALLOC macro faster and simpler, set j__uMaxWords to
+// MAXINT, not zero, by default.
+
+Word_t j__uMaxWords = ~0UL;
+
+// This macro hides the faking of a malloc failure:
+//
+// Note:  To keep this fast, just compare WordsPrev to j__uMaxWords without the
+// complexity of first adding WordsNow, meaning the trigger point is not
+// exactly where you might assume, but it shouldnt matter.
+
+#define MALLOC(MallocFunc,WordsPrev,WordsNow) \
+        (((WordsPrev) > j__uMaxWords) ? 0UL : MallocFunc(WordsNow))
+
+// Clear words starting at address:
+//
+// Note:  Only use this for objects that care; in other cases, it doesnt
+// matter if the objects memory is pre-zeroed.
+
+#define ZEROWORDS(Addr,Words)                   \
+        {                                       \
+            Word_t  Words__ = (Words);          \
+            PWord_t Addr__  = (PWord_t) (Addr); \
+            while (Words__--) *Addr__++ = 0UL;  \
+        }
+
+#ifdef TRACEMI
+
+// TRACING SUPPORT:
+//
+// Note:  For TRACEMI, use a format for address printing compatible with other
+// tracing facilities; in particular, %x not %lx, to truncate the "noisy" high
+// part on 64-bit systems.
+//
+// TBD: The trace macros need fixing for alternate address types.
+//
+// Note:  TRACEMI2 supports trace analysis no matter the underlying malloc/free
+// engine used.
+
+#include <stdio.h>
+
+static Word_t j__udyMemSequence = 0L;   // event sequence number.
+
+#define TRACE_ALLOC5(a,b,c,d,e)   (void) printf(a, (b), c, d)
+#define TRACE_FREE5( a,b,c,d,e)   (void) printf(a, (b), c, d)
+#define TRACE_ALLOC6(a,b,c,d,e,f) (void) printf(a, (b), c, d, e)
+#define TRACE_FREE6( a,b,c,d,e,f) (void) printf(a, (b), c, d, e)
+
+#else
+
+#ifdef TRACEMI2
+
+#include <stdio.h>
+
+#define b_pw cJU_BYTESPERWORD
+
+#define TRACE_ALLOC5(a,b,c,d,e)   \
+            (void) printf("a %lx %lx %lx\n", (b), (d) * b_pw, e)
+#define TRACE_FREE5( a,b,c,d,e)   \
+            (void) printf("f %lx %lx %lx\n", (b), (d) * b_pw, e)
+#define TRACE_ALLOC6(a,b,c,d,e,f)         \
+            (void) printf("a %lx %lx %lx\n", (b), (e) * b_pw, f)
+#define TRACE_FREE6( a,b,c,d,e,f)         \
+            (void) printf("f %lx %lx %lx\n", (b), (e) * b_pw, f)
+
+static Word_t j__udyMemSequence = 0L;   // event sequence number.
+
+#else
+
+#define TRACE_ALLOC5(a,b,c,d,e)   // null.
+#define TRACE_FREE5( a,b,c,d,e)   // null.
+#define TRACE_ALLOC6(a,b,c,d,e,f) // null.
+#define TRACE_FREE6( a,b,c,d,e,f) // null.
+
+#endif // ! TRACEMI2
+#endif // ! TRACEMI
+
+
+// MALLOC NAMESPACE SUPPORT:
+
+#if (defined(DEBUG) && (! defined(MALLOCBITS))) // for now, DEBUG => MALLOCBITS:
+#define MALLOCBITS 1
+#endif
+
+#ifdef MALLOCBITS
+#define MALLOCBITS_VALUE 0x3    // bit pattern to use.
+#define MALLOCBITS_MASK  0x7    // note: matches mask__ in JudyPrivate.h.
+
+#define MALLOCBITS_SET( Type,Addr) \
+        ((Addr) = (Type) ((Word_t) (Addr) |  MALLOCBITS_VALUE))
+#define MALLOCBITS_TEST(Type,Addr) \
+        assert((((Word_t) (Addr)) & MALLOCBITS_MASK) == MALLOCBITS_VALUE); \
+        ((Addr) = (Type) ((Word_t) (Addr) & ~MALLOCBITS_VALUE))
+#else
+#define MALLOCBITS_SET( Type,Addr)  // null.
+#define MALLOCBITS_TEST(Type,Addr)  // null.
+#endif
+
+
+// SAVE ERROR INFORMATION IN A Pjpm:
+//
+// "Small" (invalid) Addr values are used to distinguish overrun and no-mem
+// errors.  (TBD, non-zero invalid values are no longer returned from
+// lower-level functions, that is, JU_ERRNO_OVERRUN is no longer detected.)
+
+#define J__UDYSETALLOCERROR(Addr)                                       \
+        {                                                               \
+            JU_ERRID(Pjpm) = __LINE__;                                  \
+            if ((Word_t) (Addr) > 0) JU_ERRNO(Pjpm) = JU_ERRNO_OVERRUN; \
+            else                     JU_ERRNO(Pjpm) = JU_ERRNO_NOMEM;   \
+            return(0);                                                  \
+        }
+
+
+// ****************************************************************************
+// ALLOCATION FUNCTIONS:
+//
+// To help the compiler catch coding errors, each function returns a specific
+// object type.
+//
+// Note:  Only j__udyAllocJPM() and j__udyAllocJLW() return multiple values <=
+// sizeof(Word_t) to indicate the type of memory allocation failure.  Other
+// allocation functions convert this failure to a JU_ERRNO.
+
+
+// Note:  Unlike other j__udyAlloc*() functions, Pjpms are returned non-raw,
+// that is, without malloc namespace or root pointer type bits:
+
+FUNCTION Pjpm_t j__udyAllocJPM(void)
+{
+        Word_t Words = (sizeof(jpm_t) + cJU_BYTESPERWORD - 1) / cJU_BYTESPERWORD;
+        Pjpm_t Pjpm  = (Pjpm_t) MALLOC(JudyMalloc, Words, Words);
+
+        assert((Words * cJU_BYTESPERWORD) == sizeof(jpm_t));
+
+        if ((Word_t) Pjpm > sizeof(Word_t))
+        {
+            ZEROWORDS(Pjpm, Words);
+            Pjpm->jpm_TotalMemWords = Words;
+        }
+
+        TRACE_ALLOC5("0x%x %8lu = j__udyAllocJPM(), Words = %lu\n",
+                     Pjpm, j__udyMemSequence++, Words, cJU_LEAFW_MAXPOP1 + 1);
+        // MALLOCBITS_SET(Pjpm_t, Pjpm);  // see above.
+        return(Pjpm);
+
+} // j__udyAllocJPM()
+
+
+FUNCTION Pjbl_t j__udyAllocJBL(Pjpm_t Pjpm)
+{
+        Word_t Words   = sizeof(jbl_t) / cJU_BYTESPERWORD;
+        Pjbl_t PjblRaw = (Pjbl_t) MALLOC(JudyMallocVirtual,
+                                         Pjpm->jpm_TotalMemWords, Words);
+
+        assert((Words * cJU_BYTESPERWORD) == sizeof(jbl_t));
+
+        if ((Word_t) PjblRaw > sizeof(Word_t))
+        {
+            ZEROWORDS(P_JBL(PjblRaw), Words);
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjblRaw); }
+
+        TRACE_ALLOC5("0x%x %8lu = j__udyAllocJBL(), Words = %lu\n", PjblRaw,
+                     j__udyMemSequence++, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjbl_t, PjblRaw);
+        return(PjblRaw);
+
+} // j__udyAllocJBL()
+
+
+FUNCTION Pjbb_t j__udyAllocJBB(Pjpm_t Pjpm)
+{
+        Word_t Words   = sizeof(jbb_t) / cJU_BYTESPERWORD;
+        Pjbb_t PjbbRaw = (Pjbb_t) MALLOC(JudyMallocVirtual,
+                                         Pjpm->jpm_TotalMemWords, Words);
+
+        assert((Words * cJU_BYTESPERWORD) == sizeof(jbb_t));
+
+        if ((Word_t) PjbbRaw > sizeof(Word_t))
+        {
+            ZEROWORDS(P_JBB(PjbbRaw), Words);
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjbbRaw); }
+
+        TRACE_ALLOC5("0x%x %8lu = j__udyAllocJBB(), Words = %lu\n", PjbbRaw,
+                     j__udyMemSequence++, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjbb_t, PjbbRaw);
+        return(PjbbRaw);
+
+} // j__udyAllocJBB()
+
+
+FUNCTION Pjp_t j__udyAllocJBBJP(Word_t NumJPs, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_BRANCHJP_NUMJPSTOWORDS(NumJPs);
+        Pjp_t  PjpRaw;
+
+        PjpRaw = (Pjp_t) MALLOC(JudyMalloc, Pjpm->jpm_TotalMemWords, Words);
+
+        if ((Word_t) PjpRaw > sizeof(Word_t))
+        {
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjpRaw); }
+
+        TRACE_ALLOC6("0x%x %8lu = j__udyAllocJBBJP(%lu), Words = %lu\n", PjpRaw,
+                     j__udyMemSequence++, NumJPs, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjp_t, PjpRaw);
+        return(PjpRaw);
+
+} // j__udyAllocJBBJP()
+
+
+FUNCTION Pjbu_t j__udyAllocJBU(Pjpm_t Pjpm)
+{
+        Word_t Words   = sizeof(jbu_t) / cJU_BYTESPERWORD;
+        Pjbu_t PjbuRaw = (Pjbu_t) MALLOC(JudyMallocVirtual,
+                                         Pjpm->jpm_TotalMemWords, Words);
+
+        assert((Words * cJU_BYTESPERWORD) == sizeof(jbu_t));
+
+        if ((Word_t) PjbuRaw > sizeof(Word_t))
+        {
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjbuRaw); }
+
+        TRACE_ALLOC5("0x%x %8lu = j__udyAllocJBU(), Words = %lu\n", PjbuRaw,
+                     j__udyMemSequence++, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjbu_t, PjbuRaw);
+        return(PjbuRaw);
+
+} // j__udyAllocJBU()
+
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+
+FUNCTION Pjll_t j__udyAllocJLL1(Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF1POPTOWORDS(Pop1);
+        Pjll_t PjllRaw;
+
+        PjllRaw = (Pjll_t) MALLOC(JudyMalloc, Pjpm->jpm_TotalMemWords, Words);
+
+        if ((Word_t) PjllRaw > sizeof(Word_t))
+        {
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjllRaw); }
+
+        TRACE_ALLOC6("0x%x %8lu = j__udyAllocJLL1(%lu), Words = %lu\n", PjllRaw,
+                     j__udyMemSequence++, Pop1, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjll_t, PjllRaw);
+        return(PjllRaw);
+
+} // j__udyAllocJLL1()
+
+#endif // (JUDYL || (! JU_64BIT))
+
+
+FUNCTION Pjll_t j__udyAllocJLL2(Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF2POPTOWORDS(Pop1);
+        Pjll_t PjllRaw;
+
+        PjllRaw = (Pjll_t) MALLOC(JudyMalloc, Pjpm->jpm_TotalMemWords, Words);
+
+        if ((Word_t) PjllRaw > sizeof(Word_t))
+        {
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjllRaw); }
+
+        TRACE_ALLOC6("0x%x %8lu = j__udyAllocJLL2(%lu), Words = %lu\n", PjllRaw,
+                     j__udyMemSequence++, Pop1, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjll_t, PjllRaw);
+        return(PjllRaw);
+
+} // j__udyAllocJLL2()
+
+
+FUNCTION Pjll_t j__udyAllocJLL3(Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF3POPTOWORDS(Pop1);
+        Pjll_t PjllRaw;
+
+        PjllRaw = (Pjll_t) MALLOC(JudyMalloc, Pjpm->jpm_TotalMemWords, Words);
+
+        if ((Word_t) PjllRaw > sizeof(Word_t))
+        {
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjllRaw); }
+
+        TRACE_ALLOC6("0x%x %8lu = j__udyAllocJLL3(%lu), Words = %lu\n", PjllRaw,
+                     j__udyMemSequence++, Pop1, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjll_t, PjllRaw);
+        return(PjllRaw);
+
+} // j__udyAllocJLL3()
+
+
+#ifdef JU_64BIT
+
+FUNCTION Pjll_t j__udyAllocJLL4(Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF4POPTOWORDS(Pop1);
+        Pjll_t PjllRaw;
+
+        PjllRaw = (Pjll_t) MALLOC(JudyMalloc, Pjpm->jpm_TotalMemWords, Words);
+
+        if ((Word_t) PjllRaw > sizeof(Word_t))
+        {
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjllRaw); }
+
+        TRACE_ALLOC6("0x%x %8lu = j__udyAllocJLL4(%lu), Words = %lu\n", PjllRaw,
+                     j__udyMemSequence++, Pop1, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjll_t, PjllRaw);
+        return(PjllRaw);
+
+} // j__udyAllocJLL4()
+
+
+FUNCTION Pjll_t j__udyAllocJLL5(Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF5POPTOWORDS(Pop1);
+        Pjll_t PjllRaw;
+
+        PjllRaw = (Pjll_t) MALLOC(JudyMalloc, Pjpm->jpm_TotalMemWords, Words);
+
+        if ((Word_t) PjllRaw > sizeof(Word_t))
+        {
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjllRaw); }
+
+        TRACE_ALLOC6("0x%x %8lu = j__udyAllocJLL5(%lu), Words = %lu\n", PjllRaw,
+                     j__udyMemSequence++, Pop1, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjll_t, PjllRaw);
+        return(PjllRaw);
+
+} // j__udyAllocJLL5()
+
+
+FUNCTION Pjll_t j__udyAllocJLL6(Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF6POPTOWORDS(Pop1);
+        Pjll_t PjllRaw;
+
+        PjllRaw = (Pjll_t) MALLOC(JudyMalloc, Pjpm->jpm_TotalMemWords, Words);
+
+        if ((Word_t) PjllRaw > sizeof(Word_t))
+        {
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjllRaw); }
+
+        TRACE_ALLOC6("0x%x %8lu = j__udyAllocJLL6(%lu), Words = %lu\n", PjllRaw,
+                     j__udyMemSequence++, Pop1, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjll_t, PjllRaw);
+        return(PjllRaw);
+
+} // j__udyAllocJLL6()
+
+
+FUNCTION Pjll_t j__udyAllocJLL7(Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF7POPTOWORDS(Pop1);
+        Pjll_t PjllRaw;
+
+        PjllRaw = (Pjll_t) MALLOC(JudyMalloc, Pjpm->jpm_TotalMemWords, Words);
+
+        if ((Word_t) PjllRaw > sizeof(Word_t))
+        {
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjllRaw); }
+
+        TRACE_ALLOC6("0x%x %8lu = j__udyAllocJLL7(%lu), Words = %lu\n", PjllRaw,
+                     j__udyMemSequence++, Pop1, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjll_t, PjllRaw);
+        return(PjllRaw);
+
+} // j__udyAllocJLL7()
+
+#endif // JU_64BIT
+
+
+// Note:  Root-level leaf addresses are always whole words (Pjlw_t), and unlike
+// other j__udyAlloc*() functions, they are returned non-raw, that is, without
+// malloc namespace or root pointer type bits (the latter are added later by
+// the caller):
+
+FUNCTION Pjlw_t j__udyAllocJLW(Word_t Pop1)
+{
+        Word_t Words = JU_LEAFWPOPTOWORDS(Pop1);
+        Pjlw_t Pjlw  = (Pjlw_t) MALLOC(JudyMalloc, Words, Words);
+
+        TRACE_ALLOC6("0x%x %8lu = j__udyAllocJLW(%lu), Words = %lu\n", Pjlw,
+                     j__udyMemSequence++, Pop1, Words, Pop1);
+        // MALLOCBITS_SET(Pjlw_t, Pjlw);  // see above.
+        return(Pjlw);
+
+} // j__udyAllocJLW()
+
+
+FUNCTION Pjlb_t j__udyAllocJLB1(Pjpm_t Pjpm)
+{
+        Word_t Words = sizeof(jlb_t) / cJU_BYTESPERWORD;
+        Pjlb_t PjlbRaw;
+
+        PjlbRaw = (Pjlb_t) MALLOC(JudyMalloc, Pjpm->jpm_TotalMemWords, Words);
+
+        assert((Words * cJU_BYTESPERWORD) == sizeof(jlb_t));
+
+        if ((Word_t) PjlbRaw > sizeof(Word_t))
+        {
+            ZEROWORDS(P_JLB(PjlbRaw), Words);
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjlbRaw); }
+
+        TRACE_ALLOC5("0x%x %8lu = j__udyAllocJLB1(), Words = %lu\n", PjlbRaw,
+                     j__udyMemSequence++, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjlb_t, PjlbRaw);
+        return(PjlbRaw);
+
+} // j__udyAllocJLB1()
+
+
+#ifdef JUDYL
+
+FUNCTION Pjv_t j__udyLAllocJV(Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JL_LEAFVPOPTOWORDS(Pop1);
+        Pjv_t  PjvRaw;
+
+        PjvRaw = (Pjv_t) MALLOC(JudyMalloc, Pjpm->jpm_TotalMemWords, Words);
+
+        if ((Word_t) PjvRaw > sizeof(Word_t))
+        {
+            Pjpm->jpm_TotalMemWords += Words;
+        }
+        else { J__UDYSETALLOCERROR(PjvRaw); }
+
+        TRACE_ALLOC6("0x%x %8lu = j__udyLAllocJV(%lu), Words = %lu\n", PjvRaw,
+                     j__udyMemSequence++, Pop1, Words, (Pjpm->jpm_Pop0) + 2);
+        MALLOCBITS_SET(Pjv_t, PjvRaw);
+        return(PjvRaw);
+
+} // j__udyLAllocJV()
+
+#endif // JUDYL
+
+
+// ****************************************************************************
+// FREE FUNCTIONS:
+//
+// To help the compiler catch coding errors, each function takes a specific
+// object type to free.
+
+
+// Note:  j__udyFreeJPM() receives a root pointer with NO root pointer type
+// bits present, that is, they must be stripped by the caller using P_JPM():
+
+FUNCTION void j__udyFreeJPM(Pjpm_t PjpmFree, Pjpm_t PjpmStats)
+{
+        Word_t Words = (sizeof(jpm_t) + cJU_BYTESPERWORD - 1) / cJU_BYTESPERWORD;
+
+        // MALLOCBITS_TEST(Pjpm_t, PjpmFree);   // see above.
+        JudyFree((Pvoid_t) PjpmFree, Words);
+
+        if (PjpmStats != (Pjpm_t) NULL) PjpmStats->jpm_TotalMemWords -= Words;
+
+// Note:  Log PjpmFree->jpm_Pop0, similar to other j__udyFree*() functions, not
+// an assumed value of cJU_LEAFW_MAXPOP1, for when the caller is
+// Judy*FreeArray(), jpm_Pop0 is set to 0, and the population after the free
+// really will be 0, not cJU_LEAFW_MAXPOP1.
+
+        TRACE_FREE6("0x%x %8lu =  j__udyFreeJPM(%lu), Words = %lu\n", PjpmFree,
+                    j__udyMemSequence++, Words, Words, PjpmFree->jpm_Pop0);
+
+
+} // j__udyFreeJPM()
+
+
+FUNCTION void j__udyFreeJBL(Pjbl_t Pjbl, Pjpm_t Pjpm)
+{
+        Word_t Words = sizeof(jbl_t) / cJU_BYTESPERWORD;
+
+        MALLOCBITS_TEST(Pjbl_t, Pjbl);
+        JudyFreeVirtual((Pvoid_t) Pjbl, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE5("0x%x %8lu =  j__udyFreeJBL(), Words = %lu\n", Pjbl,
+                    j__udyMemSequence++, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJBL()
+
+
+FUNCTION void j__udyFreeJBB(Pjbb_t Pjbb, Pjpm_t Pjpm)
+{
+        Word_t Words = sizeof(jbb_t) / cJU_BYTESPERWORD;
+
+        MALLOCBITS_TEST(Pjbb_t, Pjbb);
+        JudyFreeVirtual((Pvoid_t) Pjbb, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE5("0x%x %8lu =  j__udyFreeJBB(), Words = %lu\n", Pjbb,
+                    j__udyMemSequence++, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJBB()
+
+
+FUNCTION void j__udyFreeJBBJP(Pjp_t Pjp, Word_t NumJPs, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_BRANCHJP_NUMJPSTOWORDS(NumJPs);
+
+        MALLOCBITS_TEST(Pjp_t, Pjp);
+        JudyFree((Pvoid_t) Pjp, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE6("0x%x %8lu =  j__udyFreeJBBJP(%lu), Words = %lu\n", Pjp,
+                    j__udyMemSequence++, NumJPs, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJBBJP()
+
+
+FUNCTION void j__udyFreeJBU(Pjbu_t Pjbu, Pjpm_t Pjpm)
+{
+        Word_t Words = sizeof(jbu_t) / cJU_BYTESPERWORD;
+
+        MALLOCBITS_TEST(Pjbu_t, Pjbu);
+        JudyFreeVirtual((Pvoid_t) Pjbu, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE5("0x%x %8lu =  j__udyFreeJBU(), Words = %lu\n", Pjbu,
+                    j__udyMemSequence++, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJBU()
+
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+
+FUNCTION void j__udyFreeJLL1(Pjll_t Pjll, Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF1POPTOWORDS(Pop1);
+
+        MALLOCBITS_TEST(Pjll_t, Pjll);
+        JudyFree((Pvoid_t) Pjll, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE6("0x%x %8lu =  j__udyFreeJLL1(%lu), Words = %lu\n", Pjll,
+                    j__udyMemSequence++, Pop1, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJLL1()
+
+#endif // (JUDYL || (! JU_64BIT))
+
+
+FUNCTION void j__udyFreeJLL2(Pjll_t Pjll, Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF2POPTOWORDS(Pop1);
+
+        MALLOCBITS_TEST(Pjll_t, Pjll);
+        JudyFree((Pvoid_t) Pjll, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE6("0x%x %8lu =  j__udyFreeJLL2(%lu), Words = %lu\n", Pjll,
+                    j__udyMemSequence++, Pop1, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJLL2()
+
+
+FUNCTION void j__udyFreeJLL3(Pjll_t Pjll, Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF3POPTOWORDS(Pop1);
+
+        MALLOCBITS_TEST(Pjll_t, Pjll);
+        JudyFree((Pvoid_t) Pjll, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE6("0x%x %8lu =  j__udyFreeJLL3(%lu), Words = %lu\n", Pjll,
+                    j__udyMemSequence++, Pop1, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJLL3()
+
+
+#ifdef JU_64BIT
+
+FUNCTION void j__udyFreeJLL4(Pjll_t Pjll, Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF4POPTOWORDS(Pop1);
+
+        MALLOCBITS_TEST(Pjll_t, Pjll);
+        JudyFree((Pvoid_t) Pjll, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE6("0x%x %8lu =  j__udyFreeJLL4(%lu), Words = %lu\n", Pjll,
+                    j__udyMemSequence++, Pop1, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJLL4()
+
+
+FUNCTION void j__udyFreeJLL5(Pjll_t Pjll, Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF5POPTOWORDS(Pop1);
+
+        MALLOCBITS_TEST(Pjll_t, Pjll);
+        JudyFree((Pvoid_t) Pjll, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE6("0x%x %8lu =  j__udyFreeJLL5(%lu), Words = %lu\n", Pjll,
+                    j__udyMemSequence++, Pop1, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJLL5()
+
+
+FUNCTION void j__udyFreeJLL6(Pjll_t Pjll, Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF6POPTOWORDS(Pop1);
+
+        MALLOCBITS_TEST(Pjll_t, Pjll);
+        JudyFree((Pvoid_t) Pjll, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE6("0x%x %8lu =  j__udyFreeJLL6(%lu), Words = %lu\n", Pjll,
+                    j__udyMemSequence++, Pop1, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJLL6()
+
+
+FUNCTION void j__udyFreeJLL7(Pjll_t Pjll, Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAF7POPTOWORDS(Pop1);
+
+        MALLOCBITS_TEST(Pjll_t, Pjll);
+        JudyFree((Pvoid_t) Pjll, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE6("0x%x %8lu =  j__udyFreeJLL7(%lu), Words = %lu\n", Pjll,
+                    j__udyMemSequence++, Pop1, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJLL7()
+
+#endif // JU_64BIT
+
+
+// Note:  j__udyFreeJLW() receives a root pointer with NO root pointer type
+// bits present, that is, they are stripped by P_JLW():
+
+FUNCTION void j__udyFreeJLW(Pjlw_t Pjlw, Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JU_LEAFWPOPTOWORDS(Pop1);
+
+        // MALLOCBITS_TEST(Pjlw_t, Pjlw);       // see above.
+        JudyFree((Pvoid_t) Pjlw, Words);
+
+        if (Pjpm) Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE6("0x%x %8lu =  j__udyFreeJLW(%lu), Words = %lu\n", Pjlw,
+                    j__udyMemSequence++, Pop1, Words, Pop1 - 1);
+
+
+} // j__udyFreeJLW()
+
+
+FUNCTION void j__udyFreeJLB1(Pjlb_t Pjlb, Pjpm_t Pjpm)
+{
+        Word_t Words = sizeof(jlb_t) / cJU_BYTESPERWORD;
+
+        MALLOCBITS_TEST(Pjlb_t, Pjlb);
+        JudyFree((Pvoid_t) Pjlb, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE5("0x%x %8lu =  j__udyFreeJLB1(), Words = %lu\n", Pjlb,
+                    j__udyMemSequence++, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyFreeJLB1()
+
+
+#ifdef JUDYL
+
+FUNCTION void j__udyLFreeJV(Pjv_t Pjv, Word_t Pop1, Pjpm_t Pjpm)
+{
+        Word_t Words = JL_LEAFVPOPTOWORDS(Pop1);
+
+        MALLOCBITS_TEST(Pjv_t, Pjv);
+        JudyFree((Pvoid_t) Pjv, Words);
+
+        Pjpm->jpm_TotalMemWords -= Words;
+
+        TRACE_FREE6("0x%x %8lu = j__udyLFreeJV(%lu), Words = %lu\n", Pjv,
+                    j__udyMemSequence++, Pop1, Words, Pjpm->jpm_Pop0);
+
+
+} // j__udyLFreeJV()
+
+#endif // JUDYL
diff --git a/libs/klib/judy/JudyMemActive.c b/libs/klib/judy/JudyMemActive.c
new file mode 100644
index 0000000..d95a134
--- /dev/null
+++ b/libs/klib/judy/JudyMemActive.c
@@ -0,0 +1,257 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Return number of bytes of memory used to support a Judy1/L array.
+// Compile with one of -DJUDY1 or -DJUDYL.
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+FUNCTION static Word_t j__udyGetMemActive(Pjp_t);
+
+
+// ****************************************************************************
+// J U D Y   1   M E M   A C T I V E
+// J U D Y   L   M E M   A C T I V E
+
+#ifdef JUDY1
+FUNCTION Word_t Judy1MemActive
+#else
+FUNCTION Word_t JudyLMemActive
+#endif
+        (
+	Pcvoid_t PArray	        // from which to retrieve.
+        )
+{
+	if (PArray == (Pcvoid_t)NULL) return(0);
+
+	if (JU_LEAFW_POP0(PArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
+        {
+	    Pjlw_t Pjlw = P_JLW(PArray);	// first word of leaf.
+            Word_t Words = Pjlw[0] + 1;		// population.
+#ifdef JUDY1
+            return((Words + 1) * sizeof(Word_t));
+#else
+            return(((Words * 2) + 1) * sizeof(Word_t));
+#endif
+        }
+	else
+	{
+	    Pjpm_t Pjpm = P_JPM(PArray);
+	    return(j__udyGetMemActive(&Pjpm->jpm_JP) + sizeof(jpm_t));
+	}
+
+} // JudyMemActive()
+
+
+// ****************************************************************************
+// __ J U D Y   G E T   M E M   A C T I V E
+
+FUNCTION static Word_t j__udyGetMemActive(
+	Pjp_t  Pjp)		// top of subtree.
+{
+	Word_t offset;		// in a branch.
+	Word_t Bytes = 0;	// actual bytes used at this level.
+	Word_t IdxSz;		// bytes per index in leaves
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+	case cJU_JPBRANCH_L2:
+	case cJU_JPBRANCH_L3:
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_L4:
+	case cJU_JPBRANCH_L5:
+	case cJU_JPBRANCH_L6:
+	case cJU_JPBRANCH_L7:
+#endif
+	case cJU_JPBRANCH_L:
+	{
+	    Pjbl_t Pjbl = P_JBL(Pjp->jp_Addr);
+
+	    for (offset = 0; offset < (Pjbl->jbl_NumJPs); ++offset)
+	        Bytes += j__udyGetMemActive((Pjbl->jbl_jp) + offset);
+
+	    return(Bytes + sizeof(jbl_t));
+	}
+
+	case cJU_JPBRANCH_B2:
+	case cJU_JPBRANCH_B3:
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_B4:
+	case cJU_JPBRANCH_B5:
+	case cJU_JPBRANCH_B6:
+	case cJU_JPBRANCH_B7:
+#endif
+	case cJU_JPBRANCH_B:
+	{
+	    Word_t subexp;
+	    Word_t jpcount;
+	    Pjbb_t Pjbb = P_JBB(Pjp->jp_Addr);
+
+	    for (subexp = 0; subexp < cJU_NUMSUBEXPB; ++subexp)
+	    {
+	        jpcount = j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, subexp));
+                Bytes  += jpcount * sizeof(jp_t);
+
+		for (offset = 0; offset < jpcount; ++offset)
+		{
+		    Bytes += j__udyGetMemActive(P_JP(JU_JBB_PJP(Pjbb, subexp))
+			   + offset);
+		}
+	    }
+
+	    return(Bytes + sizeof(jbb_t));
+	}
+
+	case cJU_JPBRANCH_U2:
+	case cJU_JPBRANCH_U3:
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_U4:
+	case cJU_JPBRANCH_U5:
+	case cJU_JPBRANCH_U6:
+	case cJU_JPBRANCH_U7:
+#endif
+	case cJU_JPBRANCH_U:
+        {
+	    Pjbu_t Pjbu = P_JBU(Pjp->jp_Addr);
+
+            for (offset = 0; offset < cJU_BRANCHUNUMJPS; ++offset)
+	    {
+		if (((Pjbu->jbu_jp[offset].jp_Type) >= cJU_JPNULL1)
+		 && ((Pjbu->jbu_jp[offset].jp_Type) <= cJU_JPNULLMAX))
+		{
+		    continue;		// skip null JP to save time.
+		}
+
+	        Bytes += j__udyGetMemActive(Pjbu->jbu_jp + offset);
+	    }
+
+	    return(Bytes + sizeof(jbu_t));
+        }
+
+
+// -- Cases below here terminate and do not recurse. --
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+        case cJU_JPLEAF1: IdxSz = 1; goto LeafWords;
+#endif
+	case cJU_JPLEAF2: IdxSz = 2; goto LeafWords;
+	case cJU_JPLEAF3: IdxSz = 3; goto LeafWords;
+#ifdef JU_64BIT
+	case cJU_JPLEAF4: IdxSz = 4; goto LeafWords;
+	case cJU_JPLEAF5: IdxSz = 5; goto LeafWords;
+	case cJU_JPLEAF6: IdxSz = 6; goto LeafWords;
+	case cJU_JPLEAF7: IdxSz = 7; goto LeafWords;
+#endif
+LeafWords:
+
+#ifdef JUDY1
+            return(IdxSz * (JU_JPLEAF_POP0(Pjp) + 1));
+#else
+            return((IdxSz + sizeof(Word_t))
+		 * (JU_JPLEAF_POP0(Pjp) + 1));
+#endif
+	case cJU_JPLEAF_B1:
+	{
+#ifdef JUDY1
+            return(sizeof(jlb_t));
+#else
+            Bytes = (JU_JPLEAF_POP0(Pjp) + 1) * sizeof(Word_t);
+
+	    return(Bytes + sizeof(jlb_t));
+#endif
+	}
+
+	JUDY1CODE(case cJ1_JPFULLPOPU1: return(0);)
+
+#ifdef JUDY1
+#define J__Mpy 0
+#else
+#define J__Mpy sizeof(Word_t)
+#endif
+
+	case cJU_JPIMMED_1_01:	return(0);
+	case cJU_JPIMMED_2_01:	return(0);
+	case cJU_JPIMMED_3_01:	return(0);
+#ifdef JU_64BIT
+	case cJU_JPIMMED_4_01:	return(0);
+	case cJU_JPIMMED_5_01:	return(0);
+	case cJU_JPIMMED_6_01:	return(0);
+	case cJU_JPIMMED_7_01:	return(0);
+#endif
+
+	case cJU_JPIMMED_1_02:	return(J__Mpy * 2);
+	case cJU_JPIMMED_1_03:	return(J__Mpy * 3);
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_1_04:	return(J__Mpy * 4);
+	case cJU_JPIMMED_1_05:	return(J__Mpy * 5);
+	case cJU_JPIMMED_1_06:	return(J__Mpy * 6);
+	case cJU_JPIMMED_1_07:	return(J__Mpy * 7);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_1_08:	return(0);
+	case cJ1_JPIMMED_1_09:	return(0);
+	case cJ1_JPIMMED_1_10:	return(0);
+	case cJ1_JPIMMED_1_11:	return(0);
+	case cJ1_JPIMMED_1_12:	return(0);
+	case cJ1_JPIMMED_1_13:	return(0);
+	case cJ1_JPIMMED_1_14:	return(0);
+	case cJ1_JPIMMED_1_15:	return(0);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_2_02:	return(J__Mpy * 2);
+	case cJU_JPIMMED_2_03:	return(J__Mpy * 3);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_2_04:	return(0);
+	case cJ1_JPIMMED_2_05:	return(0);
+	case cJ1_JPIMMED_2_06:	return(0);
+	case cJ1_JPIMMED_2_07:	return(0);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_3_02:	return(J__Mpy * 2);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_3_03:	return(0);
+	case cJ1_JPIMMED_3_04:	return(0);
+	case cJ1_JPIMMED_3_05:	return(0);
+
+	case cJ1_JPIMMED_4_02:	return(0);
+	case cJ1_JPIMMED_4_03:	return(0);
+	case cJ1_JPIMMED_5_02:	return(0);
+	case cJ1_JPIMMED_5_03:	return(0);
+	case cJ1_JPIMMED_6_02:	return(0);
+	case cJ1_JPIMMED_7_02:	return(0);
+#endif
+
+	} // switch (JU_JPTYPE(Pjp))
+
+	return(0);			// to make some compilers happy.
+
+} // j__udyGetMemActive()
diff --git a/libs/klib/judy/JudyMemUsed.c b/libs/klib/judy/JudyMemUsed.c
new file mode 100644
index 0000000..e25f65b
--- /dev/null
+++ b/libs/klib/judy/JudyMemUsed.c
@@ -0,0 +1,59 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Return number of bytes of memory used to support a Judy1/L array.
+// Compile with one of -DJUDY1 or -DJUDYL.
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+#ifdef JUDY1
+FUNCTION Word_t Judy1MemUsed
+#else  // JUDYL
+FUNCTION Word_t JudyLMemUsed
+#endif
+        (
+	Pcvoid_t PArray 	// from which to retrieve.
+        )
+{
+	Word_t	 Words = 0;
+
+        if (PArray == (Pcvoid_t) NULL) return(0);
+
+	if (JU_LEAFW_POP0(PArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
+	{
+	    Pjlw_t Pjlw = P_JLW(PArray);		// first word of leaf.
+	    Words = JU_LEAFWPOPTOWORDS(Pjlw[0] + 1);	// based on pop1.
+	}
+	else
+	{
+	    Pjpm_t Pjpm = P_JPM(PArray);
+	    Words = Pjpm->jpm_TotalMemWords;
+	}
+
+	return(Words * sizeof(Word_t));		// convert to bytes.
+
+} // Judy1MemUsed() / JudyLMemUsed()
diff --git a/libs/klib/judy/JudyNext.c b/libs/klib/judy/JudyNext.c
new file mode 100644
index 0000000..4af06e2
--- /dev/null
+++ b/libs/klib/judy/JudyNext.c
@@ -0,0 +1,2 @@
+#define JUDYNEXT 1
+#include "JudyPrevNext.c"
diff --git a/libs/klib/judy/JudyNextEmpty.c b/libs/klib/judy/JudyNextEmpty.c
new file mode 100644
index 0000000..73b0926
--- /dev/null
+++ b/libs/klib/judy/JudyNextEmpty.c
@@ -0,0 +1,2 @@
+#define JUDYNEXT 1
+#include "JudyPrevNextEmpty.c"
diff --git a/libs/klib/judy/JudyPrev.c b/libs/klib/judy/JudyPrev.c
new file mode 100644
index 0000000..3d9f484
--- /dev/null
+++ b/libs/klib/judy/JudyPrev.c
@@ -0,0 +1,2 @@
+#define JUDYPREV 1
+#include "JudyPrevNext.c"
diff --git a/libs/klib/judy/JudyPrevEmpty.c b/libs/klib/judy/JudyPrevEmpty.c
new file mode 100644
index 0000000..f9a182b
--- /dev/null
+++ b/libs/klib/judy/JudyPrevEmpty.c
@@ -0,0 +1,2 @@
+#define JUDYPREV 1
+#include "JudyPrevNextEmpty.c"
diff --git a/libs/klib/judy/JudyPrevNext.c b/libs/klib/judy/JudyPrevNext.c
new file mode 100644
index 0000000..1131eef
--- /dev/null
+++ b/libs/klib/judy/JudyPrevNext.c
@@ -0,0 +1,1888 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Judy*Prev() and Judy*Next() functions for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+//
+// Compile with -DJUDYNEXT for the Judy*Next() function; otherwise defaults to
+// Judy*Prev().
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifndef JUDYNEXT
+#ifndef JUDYPREV
+#define	JUDYPREV 1		// neither set => use default.
+#endif
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+
+// ****************************************************************************
+// J U D Y   1   P R E V
+// J U D Y   1   N E X T
+// J U D Y   L   P R E V
+// J U D Y   L   N E X T
+//
+// See the manual entry for the API.
+//
+// OVERVIEW OF Judy*Prev():
+//
+// Use a reentrant switch statement (state machine, SM1 = "get") to decode the
+// callers *PIndex-1, starting with the (PArray), through branches, if
+// any, down to an immediate or a leaf.  Look for *PIndex-1 in that leaf, and
+// if found, return it.
+//
+// A dead end is either a branch that does not contain a JP for the appropriate
+// digit in *PIndex-1, or a leaf that does not contain the undecoded digits of
+// *PIndex-1.  Upon reaching a dead end, backtrack through the leaf/branches
+// that were just traversed, using a list (history) of parent JPs that is built
+// while going forward in SM1Get.  Start with the current leaf or branch.  In a
+// backtracked leaf, look for an Index less than *PIndex-1.  In each
+// backtracked branch, look "sideways" for the next JP, if any, lower than the
+// one for the digit (from *PIndex-1) that was previously decoded.  While
+// backtracking, if a leaf has no previous Index or a branch has no lower JP,
+// go to its parent branch in turn.  Upon reaching the JRP, return failure, "no
+// previous Index".  The backtrack process is sufficiently different from
+// SM1Get to merit its own separate reentrant switch statement (SM2 =
+// "backtrack").
+//
+// While backtracking, upon finding a lower JP in a branch, there is certain to
+// be a "prev" Index under that JP (unless the Judy array is corrupt).
+// Traverse forward again, this time taking the last (highest, right-most) JP
+// in each branch, and the last (highest) Index upon reaching an immediate or a
+// leaf.  This traversal is sufficiently different from SM1Get and SM2Backtrack
+// to merit its own separate reentrant switch statement (SM3 = "findlimit").
+//
+// "Decode" bytes in JPs complicate this process a little.  In SM1Get, when a
+// JP is a narrow pointer, that is, when states are skipped (so the skipped
+// digits are stored in jp_DcdPopO), compare the relevant digits to the same
+// digits in *PIndex-1.  If they are EQUAL, proceed in SM1Get as before.  If
+// jp_DcdPopOs digits are GREATER, treat the JP as a dead end and proceed in
+// SM2Backtrack.  If jp_DcdPopOs digits are LESS, treat the JP as if it had
+// just been found during a backtrack and proceed directly in SM3Findlimit.
+//
+// Note that Decode bytes can be ignored in SM3Findlimit; they dont matter.
+// Also note that in practice the Decode bytes are routinely compared with
+// *PIndex-1 because thats simpler and no slower than first testing for
+// narrowness.
+//
+// Decode bytes also make it unnecessary to construct the Index to return (the
+// revised *PIndex) during the search.  This step is deferred until finding an
+// Index during backtrack or findlimit, before returning it.  The first digit
+// of *PIndex is derived (saved) based on which JP is used in a JRP branch.
+// The remaining digits are obtained from the jp_DcdPopO field in the JP (if
+// any) above the immediate or leaf containing the found (prev) Index, plus the
+// remaining digit(s) in the immediate or leaf itself.  In the case of a LEAFW,
+// the Index to return is found directly in the leaf.
+//
+// Note:  Theoretically, as described above, upon reaching a dead end, SM1Get
+// passes control to SM2Backtrack to look sideways, even in a leaf.  Actually
+// its a little more efficient for the SM1Get leaf cases to shortcut this and
+// take care of the sideways searches themselves.  Hence the history list only
+// contains branch JPs, and SM2Backtrack only handles branches.  In fact, even
+// the branch handling cases in SM1Get do some shortcutting (sideways
+// searching) to avoid pushing history and calling SM2Backtrack unnecessarily.
+//
+// Upon reaching an Index to return after backtracking, *PIndex must be
+// modified to the found Index.  In principle this could be done by building
+// the Index from a saved rootdigit (in the top branch) plus the Dcd bytes from
+// the parent JP plus the appropriate Index bytes from the leaf.  However,
+// Immediates are difficult because their parent JPs lack one (last) digit.  So
+// instead just build the *PIndex to return "top down" while backtracking and
+// findlimiting.
+//
+// This function is written iteratively for speed, rather than recursively.
+//
+// CAVEATS:
+//
+// Why use a backtrack list (history stack), since it has finite size?  The
+// size is small for Judy on both 32-bit and 64-bit systems, and a list (really
+// just an array) is fast to maintain and use.  Other alternatives include
+// doing a lookahead (lookaside) in each branch while traversing forward
+// (decoding), and restarting from the top upon a dead end.
+//
+// A lookahead means noting the last branch traversed which contained a
+// non-null JP lower than the one specified by a digit in *PIndex-1, and
+// returning to that point for SM3Findlimit.  This seems like a good idea, and
+// should be pretty cheap for linear and bitmap branches, but it could result
+// in up to 31 unnecessary additional cache line fills (in extreme cases) for
+// every uncompressed branch traversed.  We have considered means of attaching
+// to or hiding within an uncompressed branch (in null JPs) a "cache line map"
+// or other structure, such as an offset to the next non-null JP, that would
+// speed this up, but it seems unnecessary merely to avoid having a
+// finite-length list (array).  (If JudySL is ever made "native", the finite
+// list length will be an issue.)
+//
+// Restarting at the top of the Judy array after a dead end requires a careful
+// modification of *PIndex-1 to decrement the digit for the parent branch and
+// set the remaining lower digits to all 1s.  This must be repeated each time a
+// parent branch contains another dead end, so even though it should all happen
+// in cache, the CPU time can be excessive.  (For JudySL or an equivalent
+// "infinitely deep" Judy array, consider a hybrid of a large, finite,
+// "circular" list and a restart-at-top when the list is backtracked to
+// exhaustion.)
+//
+// Why search for *PIndex-1 instead of *PIndex during SM1Get?  In rare
+// instances this prevents an unnecessary decode down the wrong path followed
+// by a backtrack; its pretty cheap to set up initially; and it means the
+// SM1Get machine can simply return if/when it finds that Index.
+//
+// TBD:  Wed like to enhance this function to make successive searches faster.
+// This would require saving some previous state, including the previous Index
+// returned, and in which leaf it was found.  If the next call is for the same
+// Index and the array has not been modified, start at the same leaf.  This
+// should be much easier to implement since this is iterative rather than
+// recursive code.
+//
+// VARIATIONS FOR Judy*Next():
+//
+// The Judy*Next() code is nearly a perfect mirror of the Judy*Prev() code.
+// See the Judy*Prev() overview comments, and mentally switch the following:
+//
+// - "*PIndex-1"  => "*PIndex+1"
+// - "less than"  => "greater than"
+// - "lower"      => "higher"
+// - "lowest"     => "highest"
+// - "next-left"  => "next-right"
+// - "right-most" => "left-most"
+//
+// Note:  SM3Findlimit could be called SM3Findmax/SM3Findmin, but a common name
+// for both Prev and Next means many fewer ifdefs in this code.
+//
+// TBD:  Currently this code traverses a JP whether its expanse is partially or
+// completely full (populated).  For Judy1 (only), since there is no value area
+// needed, consider shortcutting to a "success" return upon encountering a full
+// JP in SM1Get (or even SM3Findlimit?)  A full JP looks like this:
+//
+//	(((JU_JPDCDPOP0(Pjp) ^ cJU_ALLONES) & cJU_POP0MASK(cLevel)) == 0)
+
+#ifdef JUDY1
+#ifdef JUDYPREV
+FUNCTION int Judy1Prev
+#else
+FUNCTION int Judy1Next
+#endif
+#else
+#ifdef JUDYPREV
+FUNCTION PPvoid_t JudyLPrev
+#else
+FUNCTION PPvoid_t JudyLNext
+#endif
+#endif
+        (
+	Pcvoid_t  PArray,	// Judy array to search.
+	Word_t *  PIndex,	// starting point and result.
+	PJError_t PJError	// optional, for returning error info.
+        )
+{
+	Pjp_t	  Pjp, Pjp2;	// current JPs.
+	Pjbl_t	  Pjbl;		// Pjp->jp_Addr masked and cast to types:
+	Pjbb_t	  Pjbb;
+	Pjbu_t	  Pjbu;
+
+// Note:  The following initialization is not strictly required but it makes
+// gcc -Wall happy because there is an "impossible" path from Immed handling to
+// SM1LeafLImm code that looks like Pjll might be used before set:
+
+	Pjll_t	  Pjll = (Pjll_t) NULL;
+	Word_t	  state;	// current state in SM.
+	Word_t	  digit;	// next digit to decode from Index.
+
+// Note:  The following initialization is not strictly required but it makes
+// gcc -Wall happy because there is an "impossible" path from Immed handling to
+// SM1LeafLImm code (for JudyL & JudyPrev only) that looks like pop1 might be
+// used before set:
+
+#if (defined(JUDYL) && defined(JUDYPREV))
+	Word_t	  pop1 = 0;	// in a leaf.
+#else
+	Word_t	  pop1;		// in a leaf.
+#endif
+	int	  offset;	// linear branch/leaf, from j__udySearchLeaf*().
+	int	  subexp;	// subexpanse in a bitmap branch.
+	Word_t	  bitposmask;	// bit in bitmap for Index.
+
+// History for SM2Backtrack:
+//
+// For a given histnum, APjphist[histnum] is a parent JP that points to a
+// branch, and Aoffhist[histnum] is the offset of the NEXT JP in the branch to
+// which the parent JP points.  The meaning of Aoffhist[histnum] depends on the
+// type of branch to which the parent JP points:
+//
+// Linear:  Offset of the next JP in the JP list.
+//
+// Bitmap:  Which subexpanse, plus the offset of the next JP in the
+// subexpanses JP list (to avoid bit-counting again), plus for Judy*Next(),
+// hidden one byte to the left, which digit, because Judy*Next() also needs
+// this.
+//
+// Uncompressed:  Digit, which is actually the offset of the JP in the branch.
+//
+// Note:  Only branch JPs are stored in APjphist[] because, as explained
+// earlier, SM1Get shortcuts sideways searches in leaves (and even in branches
+// in some cases), so SM2Backtrack only handles branches.
+
+#define	HISTNUMMAX cJU_ROOTSTATE	// maximum branches traversable.
+	Pjp_t	APjphist[HISTNUMMAX];	// list of branch JPs traversed.
+	int	Aoffhist[HISTNUMMAX];	// list of next JP offsets; see above.
+	int	histnum = 0;		// number of JPs now in list.
+
+
+// ----------------------------------------------------------------------------
+// M A C R O S
+//
+// These are intended to make the code a bit more readable and less redundant.
+
+
+// "PUSH" AND "POP" Pjp AND offset ON HISTORY STACKS:
+//
+// Note:  Ensure a corrupt Judy array does not overflow *hist[].  Meanwhile,
+// underflowing *hist[] simply means theres no more room to backtrack =>
+// "no previous/next Index".
+
+#define	HISTPUSH(Pjp,Offset)			\
+	APjphist[histnum] = (Pjp);		\
+	Aoffhist[histnum] = (Offset);		\
+						\
+	if (++histnum >= HISTNUMMAX)		\
+	{					\
+	    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT) \
+	    JUDY1CODE(return(JERRI );)		\
+	    JUDYLCODE(return(PPJERR);)		\
+	}
+
+#define	HISTPOP(Pjp,Offset)			\
+	if ((histnum--) < 1) JU_RET_NOTFOUND;	\
+	(Pjp)	 = APjphist[histnum];		\
+	(Offset) = Aoffhist[histnum]
+
+// How to pack/unpack Aoffhist[] values for bitmap branches:
+
+#ifdef JUDYPREV
+
+#define	HISTPUSHBOFF(Subexp,Offset,Digit)	  \
+	(((Subexp) * cJU_BITSPERSUBEXPB) | (Offset))
+
+#define	HISTPOPBOFF(Subexp,Offset,Digit)	  \
+	(Subexp)  = (Offset) / cJU_BITSPERSUBEXPB; \
+	(Offset) %= cJU_BITSPERSUBEXPB
+#else
+
+#define	HISTPUSHBOFF(Subexp,Offset,Digit)	 \
+	 (((Digit) << cJU_BITSPERBYTE)		 \
+	| ((Subexp) * cJU_BITSPERSUBEXPB) | (Offset))
+
+#define	HISTPOPBOFF(Subexp,Offset,Digit)	 \
+	(Digit)   = (Offset) >> cJU_BITSPERBYTE; \
+	(Subexp)  = ((Offset) & JU_LEASTBYTESMASK(1)) / cJU_BITSPERSUBEXPB; \
+	(Offset) %= cJU_BITSPERSUBEXPB
+#endif
+
+
+// CHECK FOR NULL JP:
+
+#define	JPNULL(Type)  (((Type) >= cJU_JPNULL1) && ((Type) <= cJU_JPNULLMAX))
+
+
+// SEARCH A BITMAP:
+//
+// This is a weak analog of j__udySearchLeaf*() for bitmaps.  Return the actual
+// or next-left position, base 0, of Digit in the single uint32_t bitmap, also
+// given a Bitposmask for Digit.
+//
+// Unlike j__udySearchLeaf*(), the offset is not returned bit-complemented if
+// Digits bit is unset, because the caller can check the bitmap themselves to
+// determine that.  Also, if Digits bit is unset, the returned offset is to
+// the next-left JP (including -1), not to the "ideal" position for the Index =
+// next-right JP.
+//
+// Shortcut and skip calling j__udyCountBits*() if the bitmap is full, in which
+// case (Digit % cJU_BITSPERSUBEXP*) itself is the base-0 offset.
+//
+// TBD for Judy*Next():  Should this return next-right instead of next-left?
+// That is, +1 from current value?  Maybe not, if Digits bit IS set, +1 would
+// be wrong.
+
+#define	SEARCHBITMAPB(Bitmap,Digit,Bitposmask)				\
+	(((Bitmap) == cJU_FULLBITMAPB) ? (Digit % cJU_BITSPERSUBEXPB) :	\
+	 j__udyCountBitsB((Bitmap) & JU_MASKLOWERINC(Bitposmask)) - 1)
+
+#define	SEARCHBITMAPL(Bitmap,Digit,Bitposmask)				\
+	(((Bitmap) == cJU_FULLBITMAPL) ? (Digit % cJU_BITSPERSUBEXPL) :	\
+	 j__udyCountBitsL((Bitmap) & JU_MASKLOWERINC(Bitposmask)) - 1)
+
+#ifdef JUDYPREV
+// Equivalent to search for the highest offset in Bitmap:
+
+#define	SEARCHBITMAPMAXB(Bitmap)				  \
+	(((Bitmap) == cJU_FULLBITMAPB) ? cJU_BITSPERSUBEXPB - 1 : \
+	 j__udyCountBitsB(Bitmap) - 1)
+
+#define	SEARCHBITMAPMAXL(Bitmap)				  \
+	(((Bitmap) == cJU_FULLBITMAPL) ? cJU_BITSPERSUBEXPL - 1 : \
+	 j__udyCountBitsL(Bitmap) - 1)
+#endif
+
+
+// CHECK DECODE BYTES:
+//
+// Check Decode bytes in a JP against the equivalent portion of *PIndex.  If
+// *PIndex is lower (for Judy*Prev()) or higher (for Judy*Next()), this JP is a
+// dead end (the same as if it had been absent in a linear or bitmap branch or
+// null in an uncompressed branch), enter SM2Backtrack; otherwise enter
+// SM3Findlimit to find the highest/lowest Index under this JP, as if the code
+// had already backtracked to this JP.
+
+#ifdef JUDYPREV
+#define	CDcmp__ <
+#else
+#define	CDcmp__ >
+#endif
+
+#define	CHECKDCD(cState)						\
+	if (JU_DCDNOTMATCHINDEX(*PIndex, Pjp, cState))	                \
+	{								\
+	    if ((*PIndex		& cJU_DCDMASK(cState))		\
+	      CDcmp__(JU_JPDCDPOP0(Pjp) & cJU_DCDMASK(cState)))		\
+	    {								\
+		goto SM2Backtrack;					\
+	    }								\
+	    goto SM3Findlimit;						\
+	}
+
+
+// PREPARE TO HANDLE A LEAFW OR JRP BRANCH IN SM1:
+//
+// Extract a state-dependent digit from Index in a "constant" way, then jump to
+// common code for multiple cases.
+
+#define	SM1PREPB(cState,Next)				\
+	state = (cState);				\
+	digit = JU_DIGITATSTATE(*PIndex, cState);	\
+	goto Next
+
+
+// PREPARE TO HANDLE A LEAFW OR JRP BRANCH IN SM3:
+//
+// Optionally save Dcd bytes into *PIndex, then save state and jump to common
+// code for multiple cases.
+
+#define	SM3PREPB_DCD(cState,Next)			\
+	JU_SETDCD(*PIndex, Pjp, cState);	        \
+	SM3PREPB(cState,Next)
+
+#define	SM3PREPB(cState,Next)  state = (cState); goto Next
+
+
+// ----------------------------------------------------------------------------
+// CHECK FOR SHORTCUTS:
+//
+// Error out if PIndex is null.  Execute JU_RET_NOTFOUND if the Judy array is
+// empty or *PIndex is already the minimum/maximum Index possible.
+//
+// Note:  As documented, in case of failure *PIndex may be modified.
+
+	if (PIndex == (PWord_t) NULL)
+	{
+	    JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+	    JUDY1CODE(return(JERRI );)
+	    JUDYLCODE(return(PPJERR);)
+	}
+
+#ifdef JUDYPREV
+	if ((PArray == (Pvoid_t) NULL) || ((*PIndex)-- == 0))
+#else
+	if ((PArray == (Pvoid_t) NULL) || ((*PIndex)++ == cJU_ALLONES))
+#endif
+	    JU_RET_NOTFOUND;
+
+
+// HANDLE JRP:
+//
+// Before even entering SM1Get, check the JRP type.  For JRP branches, traverse
+// the JPM; handle LEAFW leaves directly; but look for the most common cases
+// first.
+
+// ROOT-STATE LEAF that starts with a Pop0 word; just look within the leaf:
+//
+// If *PIndex is in the leaf, return it; otherwise return the Index, if any,
+// below where it would belong.
+
+	if (JU_LEAFW_POP0(PArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
+	{
+	    Pjlw_t Pjlw = P_JLW(PArray);	// first word of leaf.
+	    pop1 = Pjlw[0] + 1;
+
+	    if ((offset = j__udySearchLeafW(Pjlw + 1, pop1, *PIndex))
+		>= 0)				// Index is present.
+	    {
+		assert(offset < pop1);			  // in expected range.
+		JU_RET_FOUND_LEAFW(Pjlw, pop1, offset); // *PIndex is set.
+	    }
+
+#ifdef JUDYPREV
+	    if ((offset = ~offset) == 0)	// no next-left Index.
+#else
+	    if ((offset = ~offset) >= pop1)	// no next-right Index.
+#endif
+		JU_RET_NOTFOUND;
+
+	    assert(offset <= pop1);		// valid result.
+
+#ifdef JUDYPREV
+	    *PIndex = Pjlw[offset--];		// next-left Index, base 1.
+#else
+	    *PIndex = Pjlw[offset + 1];		// next-right Index, base 1.
+#endif
+	    JU_RET_FOUND_LEAFW(Pjlw, pop1, offset);	// base 0.
+
+	}
+	else	// JRP BRANCH
+	{
+	    Pjpm_t Pjpm = P_JPM(PArray);
+	    Pjp = &(Pjpm->jpm_JP);
+
+//	    goto SM1Get;
+	}
+
+// ============================================================================
+// STATE MACHINE 1 -- GET INDEX:
+//
+// Search for *PIndex (already decremented/incremented so as to be inclusive).
+// If found, return it.  Otherwise in theory hand off to SM2Backtrack or
+// SM3Findlimit, but in practice "shortcut" by first sideways searching the
+// current branch or leaf upon hitting a dead end.  During sideways search,
+// modify *PIndex to a new path taken.
+//
+// ENTRY:  Pjp points to next JP to interpret, whose Decode bytes have not yet
+// been checked.  This JP is not yet listed in history.
+//
+// Note:  Check Decode bytes at the start of each loop, not after looking up a
+// new JP, so its easy to do constant shifts/masks, although this requires
+// cautious handling of Pjp, offset, and *hist[] for correct entry to
+// SM2Backtrack.
+//
+// EXIT:  Return, or branch to SM2Backtrack or SM3Findlimit with correct
+// interface, as described elsewhere.
+//
+// WARNING:  For run-time efficiency the following cases replicate code with
+// varying constants, rather than using common code with variable values!
+
+SM1Get:				// return here for next branch/leaf.
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// ----------------------------------------------------------------------------
+// LINEAR BRANCH:
+//
+// Check Decode bytes, if any, in the current JP, then search for a JP for the
+// next digit in *PIndex.
+
+	case cJU_JPBRANCH_L2: CHECKDCD(2); SM1PREPB(2, SM1BranchL);
+	case cJU_JPBRANCH_L3: CHECKDCD(3); SM1PREPB(3, SM1BranchL);
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_L4: CHECKDCD(4); SM1PREPB(4, SM1BranchL);
+	case cJU_JPBRANCH_L5: CHECKDCD(5); SM1PREPB(5, SM1BranchL);
+	case cJU_JPBRANCH_L6: CHECKDCD(6); SM1PREPB(6, SM1BranchL);
+	case cJU_JPBRANCH_L7: CHECKDCD(7); SM1PREPB(7, SM1BranchL);
+#endif
+	case cJU_JPBRANCH_L:		   SM1PREPB(cJU_ROOTSTATE, SM1BranchL);
+
+// Common code (state-independent) for all cases of linear branches:
+
+SM1BranchL:
+	    Pjbl = P_JBL(Pjp->jp_Addr);
+
+// Found JP matching current digit in *PIndex; record parent JP and the next
+// JPs offset, and iterate to the next JP:
+
+	    if ((offset = j__udySearchLeaf1((Pjll_t) (Pjbl->jbl_Expanse),
+					     Pjbl->jbl_NumJPs, digit)) >= 0)
+	    {
+		HISTPUSH(Pjp, offset);
+		Pjp = (Pjbl->jbl_jp) + offset;
+		goto SM1Get;
+	    }
+
+// Dead end, no JP in BranchL for next digit in *PIndex:
+//
+// Get the ideal location of digits JP, and if theres no next-left/right JP
+// in the BranchL, shortcut and start backtracking one level up; ignore the
+// current Pjp because it points to a BranchL with no next-left/right JP.
+
+#ifdef JUDYPREV
+	    if ((offset = (~offset) - 1) < 0)	// no next-left JP in BranchL.
+#else
+	    if ((offset = (~offset)) >= Pjbl->jbl_NumJPs)  // no next-right.
+#endif
+		goto SM2Backtrack;
+
+// Theres a next-left/right JP in the current BranchL; save its digit in
+// *PIndex and shortcut to SM3Findlimit:
+
+	    JU_SETDIGIT(*PIndex, Pjbl->jbl_Expanse[offset], state);
+	    Pjp = (Pjbl->jbl_jp) + offset;
+	    goto SM3Findlimit;
+
+
+// ----------------------------------------------------------------------------
+// BITMAP BRANCH:
+//
+// Check Decode bytes, if any, in the current JP, then look for a JP for the
+// next digit in *PIndex.
+
+	case cJU_JPBRANCH_B2: CHECKDCD(2); SM1PREPB(2, SM1BranchB);
+	case cJU_JPBRANCH_B3: CHECKDCD(3); SM1PREPB(3, SM1BranchB);
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_B4: CHECKDCD(4); SM1PREPB(4, SM1BranchB);
+	case cJU_JPBRANCH_B5: CHECKDCD(5); SM1PREPB(5, SM1BranchB);
+	case cJU_JPBRANCH_B6: CHECKDCD(6); SM1PREPB(6, SM1BranchB);
+	case cJU_JPBRANCH_B7: CHECKDCD(7); SM1PREPB(7, SM1BranchB);
+#endif
+	case cJU_JPBRANCH_B:		   SM1PREPB(cJU_ROOTSTATE, SM1BranchB);
+
+// Common code (state-independent) for all cases of bitmap branches:
+
+SM1BranchB:
+	    Pjbb = P_JBB(Pjp->jp_Addr);
+
+// Locate the digits JP in the subexpanse list, if present, otherwise the
+// offset of the next-left JP, if any:
+
+	    subexp     = digit / cJU_BITSPERSUBEXPB;
+	    assert(subexp < cJU_NUMSUBEXPB);	// falls in expected range.
+	    bitposmask = JU_BITPOSMASKB(digit);
+	    offset     = SEARCHBITMAPB(JU_JBB_BITMAP(Pjbb, subexp), digit,
+				       bitposmask);
+	    // right range:
+	    assert((offset >= -1) && (offset < (int) cJU_BITSPERSUBEXPB));
+
+// Found JP matching current digit in *PIndex:
+//
+// Record the parent JP and the next JPs offset; and iterate to the next JP.
+
+//	    if (JU_BITMAPTESTB(Pjbb, digit))			// slower.
+	    if (JU_JBB_BITMAP(Pjbb, subexp) & bitposmask)	// faster.
+	    {
+		// not negative since at least one bit is set:
+		assert(offset >= 0);
+
+		HISTPUSH(Pjp, HISTPUSHBOFF(subexp, offset, digit));
+
+		if ((Pjp = P_JP(JU_JBB_PJP(Pjbb, subexp))) == (Pjp_t) NULL)
+		{
+		    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		    JUDY1CODE(return(JERRI );)
+		    JUDYLCODE(return(PPJERR);)
+		}
+
+		Pjp += offset;
+		goto SM1Get;		// iterate to next JP.
+	    }
+
+// Dead end, no JP in BranchB for next digit in *PIndex:
+//
+// If theres a next-left/right JP in the current BranchB, shortcut to
+// SM3Findlimit.  Note:  offset is already set to the correct value for the
+// next-left/right JP.
+
+#ifdef JUDYPREV
+	    if (offset >= 0)		// next-left JP is in this subexpanse.
+		goto SM1BranchBFindlimit;
+
+	    while (--subexp >= 0)		// search next-left subexpanses.
+#else
+	    if (JU_JBB_BITMAP(Pjbb, subexp) & JU_MASKHIGHEREXC(bitposmask))
+	    {
+		++offset;			// next-left => next-right.
+		goto SM1BranchBFindlimit;
+	    }
+
+	    while (++subexp < cJU_NUMSUBEXPB)	// search next-right subexps.
+#endif
+	    {
+		if (! JU_JBB_PJP(Pjbb, subexp)) continue;  // empty subexpanse.
+
+#ifdef JUDYPREV
+		offset = SEARCHBITMAPMAXB(JU_JBB_BITMAP(Pjbb, subexp));
+		// expected range:
+		assert((offset >= 0) && (offset < cJU_BITSPERSUBEXPB));
+#else
+		offset = 0;
+#endif
+
+// Save the next-left/right JPs digit in *PIndex:
+
+SM1BranchBFindlimit:
+		JU_BITMAPDIGITB(digit, subexp, JU_JBB_BITMAP(Pjbb, subexp),
+				offset);
+		JU_SETDIGIT(*PIndex, digit, state);
+
+		if ((Pjp = P_JP(JU_JBB_PJP(Pjbb, subexp))) == (Pjp_t) NULL)
+		{
+		    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		    JUDY1CODE(return(JERRI );)
+		    JUDYLCODE(return(PPJERR);)
+		}
+
+		Pjp += offset;
+		goto SM3Findlimit;
+	    }
+
+// Theres no next-left/right JP in the BranchB:
+//
+// Shortcut and start backtracking one level up; ignore the current Pjp because
+// it points to a BranchB with no next-left/right JP.
+
+	    goto SM2Backtrack;
+
+
+// ----------------------------------------------------------------------------
+// UNCOMPRESSED BRANCH:
+//
+// Check Decode bytes, if any, in the current JP, then look for a JP for the
+// next digit in *PIndex.
+
+	case cJU_JPBRANCH_U2: CHECKDCD(2); SM1PREPB(2, SM1BranchU);
+	case cJU_JPBRANCH_U3: CHECKDCD(3); SM1PREPB(3, SM1BranchU);
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_U4: CHECKDCD(4); SM1PREPB(4, SM1BranchU);
+	case cJU_JPBRANCH_U5: CHECKDCD(5); SM1PREPB(5, SM1BranchU);
+	case cJU_JPBRANCH_U6: CHECKDCD(6); SM1PREPB(6, SM1BranchU);
+	case cJU_JPBRANCH_U7: CHECKDCD(7); SM1PREPB(7, SM1BranchU);
+#endif
+	case cJU_JPBRANCH_U:		   SM1PREPB(cJU_ROOTSTATE, SM1BranchU);
+
+// Common code (state-independent) for all cases of uncompressed branches:
+
+SM1BranchU:
+	    Pjbu = P_JBU(Pjp->jp_Addr);
+	    Pjp2 = (Pjbu->jbu_jp) + digit;
+
+// Found JP matching current digit in *PIndex:
+//
+// Record the parent JP and the next JPs digit, and iterate to the next JP.
+//
+// TBD:  Instead of this, just goto SM1Get, and add cJU_JPNULL* cases to the
+// SM1Get state machine?  Then backtrack?  However, it means you cant detect
+// an inappropriate cJU_JPNULL*, when it occurs in other than a BranchU, and
+// return JU_RET_CORRUPT.
+
+	    if (! JPNULL(JU_JPTYPE(Pjp2)))	// digit has a JP.
+	    {
+		HISTPUSH(Pjp, digit);
+		Pjp = Pjp2;
+		goto SM1Get;
+	    }
+
+// Dead end, no JP in BranchU for next digit in *PIndex:
+//
+// Search for a next-left/right JP in the current BranchU, and if one is found,
+// save its digit in *PIndex and shortcut to SM3Findlimit:
+
+#ifdef JUDYPREV
+	    while (digit >= 1)
+	    {
+		Pjp = (Pjbu->jbu_jp) + (--digit);
+#else
+	    while (digit < cJU_BRANCHUNUMJPS - 1)
+	    {
+		Pjp = (Pjbu->jbu_jp) + (++digit);
+#endif
+		if (JPNULL(JU_JPTYPE(Pjp))) continue;
+
+		JU_SETDIGIT(*PIndex, digit, state);
+		goto SM3Findlimit;
+	    }
+
+// Theres no next-left/right JP in the BranchU:
+//
+// Shortcut and start backtracking one level up; ignore the current Pjp because
+// it points to a BranchU with no next-left/right JP.
+
+	    goto SM2Backtrack;
+
+
+// ----------------------------------------------------------------------------
+// LINEAR LEAF:
+//
+// Check Decode bytes, if any, in the current JP, then search the leaf for
+// *PIndex.
+
+#define	SM1LEAFL(Func)					\
+	Pjll   = P_JLL(Pjp->jp_Addr);			\
+	pop1   = JU_JPLEAF_POP0(Pjp) + 1;	        \
+	offset = Func(Pjll, pop1, *PIndex);		\
+	goto SM1LeafLImm
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+	case cJU_JPLEAF1:  CHECKDCD(1); SM1LEAFL(j__udySearchLeaf1);
+#endif
+	case cJU_JPLEAF2:  CHECKDCD(2); SM1LEAFL(j__udySearchLeaf2);
+	case cJU_JPLEAF3:  CHECKDCD(3); SM1LEAFL(j__udySearchLeaf3);
+
+#ifdef JU_64BIT
+	case cJU_JPLEAF4:  CHECKDCD(4); SM1LEAFL(j__udySearchLeaf4);
+	case cJU_JPLEAF5:  CHECKDCD(5); SM1LEAFL(j__udySearchLeaf5);
+	case cJU_JPLEAF6:  CHECKDCD(6); SM1LEAFL(j__udySearchLeaf6);
+	case cJU_JPLEAF7:  CHECKDCD(7); SM1LEAFL(j__udySearchLeaf7);
+#endif
+
+// Common code (state-independent) for all cases of linear leaves and
+// immediates:
+
+SM1LeafLImm:
+	    if (offset >= 0)		// *PIndex is in LeafL / Immed.
+#ifdef JUDY1
+		JU_RET_FOUND;
+#else
+	    {				// JudyL is trickier...
+		switch (JU_JPTYPE(Pjp))
+		{
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+		case cJU_JPLEAF1: JU_RET_FOUND_LEAF1(Pjll, pop1, offset);
+#endif
+		case cJU_JPLEAF2: JU_RET_FOUND_LEAF2(Pjll, pop1, offset);
+		case cJU_JPLEAF3: JU_RET_FOUND_LEAF3(Pjll, pop1, offset);
+#ifdef JU_64BIT
+		case cJU_JPLEAF4: JU_RET_FOUND_LEAF4(Pjll, pop1, offset);
+		case cJU_JPLEAF5: JU_RET_FOUND_LEAF5(Pjll, pop1, offset);
+		case cJU_JPLEAF6: JU_RET_FOUND_LEAF6(Pjll, pop1, offset);
+		case cJU_JPLEAF7: JU_RET_FOUND_LEAF7(Pjll, pop1, offset);
+#endif
+
+		case cJU_JPIMMED_1_01:
+		case cJU_JPIMMED_2_01:
+		case cJU_JPIMMED_3_01:
+#ifdef JU_64BIT
+		case cJU_JPIMMED_4_01:
+		case cJU_JPIMMED_5_01:
+		case cJU_JPIMMED_6_01:
+		case cJU_JPIMMED_7_01:
+#endif
+		    JU_RET_FOUND_IMM_01(Pjp);
+
+		case cJU_JPIMMED_1_02:
+		case cJU_JPIMMED_1_03:
+#ifdef JU_64BIT
+		case cJU_JPIMMED_1_04:
+		case cJU_JPIMMED_1_05:
+		case cJU_JPIMMED_1_06:
+		case cJU_JPIMMED_1_07:
+		case cJU_JPIMMED_2_02:
+		case cJU_JPIMMED_2_03:
+		case cJU_JPIMMED_3_02:
+#endif
+		    JU_RET_FOUND_IMM(Pjp, offset);
+		}
+
+		JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);  // impossible?
+		JUDY1CODE(return(JERRI );)
+		JUDYLCODE(return(PPJERR);)
+
+	    } // found *PIndex
+
+#endif // JUDYL
+
+// Dead end, no Index in LeafL / Immed for remaining digit(s) in *PIndex:
+//
+// Get the ideal location of Index, and if theres no next-left/right Index in
+// the LeafL / Immed, shortcut and start backtracking one level up; ignore the
+// current Pjp because it points to a LeafL / Immed with no next-left/right
+// Index.
+
+#ifdef JUDYPREV
+	    if ((offset = (~offset) - 1) < 0)	// no next-left Index.
+#else
+	    if ((offset = (~offset)) >= pop1)	// no next-right Index.
+#endif
+		goto SM2Backtrack;
+
+// Theres a next-left/right Index in the current LeafL / Immed; shortcut by
+// copying its digit(s) to *PIndex and returning it.
+//
+// Unfortunately this is pretty hairy, especially avoiding endian issues.
+//
+// The cJU_JPLEAF* cases are very similar to same-index-size cJU_JPIMMED* cases
+// for *_02 and above, but must return differently, at least for JudyL, so
+// spell them out separately here at the cost of a little redundant code for
+// Judy1.
+
+	    switch (JU_JPTYPE(Pjp))
+	    {
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+	    case cJU_JPLEAF1:
+
+		JU_SETDIGIT1(*PIndex, ((uint8_t *) Pjll)[offset]);
+		JU_RET_FOUND_LEAF1(Pjll, pop1, offset);
+#endif
+
+	    case cJU_JPLEAF2:
+
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(2)))
+			| ((uint16_t *) Pjll)[offset];
+		JU_RET_FOUND_LEAF2(Pjll, pop1, offset);
+
+	    case cJU_JPLEAF3:
+	    {
+		Word_t lsb;
+		JU_COPY3_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (3 * offset));
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(3))) | lsb;
+		JU_RET_FOUND_LEAF3(Pjll, pop1, offset);
+	    }
+
+#ifdef JU_64BIT
+	    case cJU_JPLEAF4:
+
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(4)))
+			| ((uint32_t *) Pjll)[offset];
+		JU_RET_FOUND_LEAF4(Pjll, pop1, offset);
+
+	    case cJU_JPLEAF5:
+	    {
+		Word_t lsb;
+		JU_COPY5_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (5 * offset));
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(5))) | lsb;
+		JU_RET_FOUND_LEAF5(Pjll, pop1, offset);
+	    }
+
+	    case cJU_JPLEAF6:
+	    {
+		Word_t lsb;
+		JU_COPY6_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (6 * offset));
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(6))) | lsb;
+		JU_RET_FOUND_LEAF6(Pjll, pop1, offset);
+	    }
+
+	    case cJU_JPLEAF7:
+	    {
+		Word_t lsb;
+		JU_COPY7_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (7 * offset));
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(7))) | lsb;
+		JU_RET_FOUND_LEAF7(Pjll, pop1, offset);
+	    }
+
+#endif // JU_64BIT
+
+#define	SET_01(cState)  JU_SETDIGITS(*PIndex, JU_JPDCDPOP0(Pjp), cState)
+
+	    case cJU_JPIMMED_1_01: SET_01(1); goto SM1Imm_01;
+	    case cJU_JPIMMED_2_01: SET_01(2); goto SM1Imm_01;
+	    case cJU_JPIMMED_3_01: SET_01(3); goto SM1Imm_01;
+#ifdef JU_64BIT
+	    case cJU_JPIMMED_4_01: SET_01(4); goto SM1Imm_01;
+	    case cJU_JPIMMED_5_01: SET_01(5); goto SM1Imm_01;
+	    case cJU_JPIMMED_6_01: SET_01(6); goto SM1Imm_01;
+	    case cJU_JPIMMED_7_01: SET_01(7); goto SM1Imm_01;
+#endif
+SM1Imm_01:	JU_RET_FOUND_IMM_01(Pjp);
+
+// Shorthand for where to find start of Index bytes array:
+
+#ifdef JUDY1
+#define	PJI (Pjp->jp_1Index)
+#else
+#define	PJI (Pjp->jp_LIndex)
+#endif
+
+	    case cJU_JPIMMED_1_02:
+	    case cJU_JPIMMED_1_03:
+#if (defined(JUDY1) || defined(JU_64BIT))
+	    case cJU_JPIMMED_1_04:
+	    case cJU_JPIMMED_1_05:
+	    case cJU_JPIMMED_1_06:
+	    case cJU_JPIMMED_1_07:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	    case cJ1_JPIMMED_1_08:
+	    case cJ1_JPIMMED_1_09:
+	    case cJ1_JPIMMED_1_10:
+	    case cJ1_JPIMMED_1_11:
+	    case cJ1_JPIMMED_1_12:
+	    case cJ1_JPIMMED_1_13:
+	    case cJ1_JPIMMED_1_14:
+	    case cJ1_JPIMMED_1_15:
+#endif
+		JU_SETDIGIT1(*PIndex, ((uint8_t *) PJI)[offset]);
+		JU_RET_FOUND_IMM(Pjp, offset);
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	    case cJU_JPIMMED_2_02:
+	    case cJU_JPIMMED_2_03:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	    case cJ1_JPIMMED_2_04:
+	    case cJ1_JPIMMED_2_05:
+	    case cJ1_JPIMMED_2_06:
+	    case cJ1_JPIMMED_2_07:
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(2)))
+			| ((uint16_t *) PJI)[offset];
+		JU_RET_FOUND_IMM(Pjp, offset);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	    case cJU_JPIMMED_3_02:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	    case cJ1_JPIMMED_3_03:
+	    case cJ1_JPIMMED_3_04:
+	    case cJ1_JPIMMED_3_05:
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+	    {
+		Word_t lsb;
+		JU_COPY3_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (3 * offset));
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(3))) | lsb;
+		JU_RET_FOUND_IMM(Pjp, offset);
+	    }
+#endif
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+	    case cJ1_JPIMMED_4_02:
+	    case cJ1_JPIMMED_4_03:
+
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(4)))
+			| ((uint32_t *) PJI)[offset];
+		JU_RET_FOUND_IMM(Pjp, offset);
+
+	    case cJ1_JPIMMED_5_02:
+	    case cJ1_JPIMMED_5_03:
+	    {
+		Word_t lsb;
+		JU_COPY5_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (5 * offset));
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(5))) | lsb;
+		JU_RET_FOUND_IMM(Pjp, offset);
+	    }
+
+	    case cJ1_JPIMMED_6_02:
+	    {
+		Word_t lsb;
+		JU_COPY6_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (6 * offset));
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(6))) | lsb;
+		JU_RET_FOUND_IMM(Pjp, offset);
+	    }
+
+	    case cJ1_JPIMMED_7_02:
+	    {
+		Word_t lsb;
+		JU_COPY7_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (7 * offset));
+		*PIndex = (*PIndex & (~JU_LEASTBYTESMASK(7))) | lsb;
+		JU_RET_FOUND_IMM(Pjp, offset);
+	    }
+
+#endif // (JUDY1 && JU_64BIT)
+
+	    } // switch for not-found *PIndex
+
+	    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);	// impossible?
+	    JUDY1CODE(return(JERRI );)
+	    JUDYLCODE(return(PPJERR);)
+
+
+// ----------------------------------------------------------------------------
+// BITMAP LEAF:
+//
+// Check Decode bytes, if any, in the current JP, then look in the leaf for
+// *PIndex.
+
+	case cJU_JPLEAF_B1:
+	{
+	    Pjlb_t Pjlb;
+	    CHECKDCD(1);
+
+	    Pjlb	= P_JLB(Pjp->jp_Addr);
+	    digit       = JU_DIGITATSTATE(*PIndex, 1);
+	    subexp      = JU_SUBEXPL(digit);
+	    bitposmask  = JU_BITPOSMASKL(digit);
+	    assert(subexp < cJU_NUMSUBEXPL);	// falls in expected range.
+
+// *PIndex exists in LeafB1:
+
+//	    if (JU_BITMAPTESTL(Pjlb, digit))			// slower.
+	    if (JU_JLB_BITMAP(Pjlb, subexp) & bitposmask)	// faster.
+	    {
+#ifdef JUDYL				// needs offset at this point:
+		offset = SEARCHBITMAPL(JU_JLB_BITMAP(Pjlb, subexp), digit, bitposmask);
+#endif
+		JU_RET_FOUND_LEAF_B1(Pjlb, subexp, offset);
+//	== return((PPvoid_t) (P_JV(JL_JLB_PVALUE(Pjlb, subexp)) + (offset)));
+	    }
+
+// Dead end, no Index in LeafB1 for remaining digit in *PIndex:
+//
+// If theres a next-left/right Index in the current LeafB1, which for
+// Judy*Next() is true if any bits are set for higher Indexes, shortcut by
+// returning it.  Note:  For Judy*Prev(), offset is set here to the correct
+// value for the next-left JP.
+
+	    offset = SEARCHBITMAPL(JU_JLB_BITMAP(Pjlb, subexp), digit,
+				   bitposmask);
+	    // right range:
+	    assert((offset >= -1) && (offset < (int) cJU_BITSPERSUBEXPL));
+
+#ifdef JUDYPREV
+	    if (offset >= 0)		// next-left JP is in this subexpanse.
+		goto SM1LeafB1Findlimit;
+
+	    while (--subexp >= 0)		// search next-left subexpanses.
+#else
+	    if (JU_JLB_BITMAP(Pjlb, subexp) & JU_MASKHIGHEREXC(bitposmask))
+	    {
+		++offset;			// next-left => next-right.
+		goto SM1LeafB1Findlimit;
+	    }
+
+	    while (++subexp < cJU_NUMSUBEXPL)	// search next-right subexps.
+#endif
+	    {
+		if (! JU_JLB_BITMAP(Pjlb, subexp)) continue;  // empty subexp.
+
+#ifdef JUDYPREV
+		offset = SEARCHBITMAPMAXL(JU_JLB_BITMAP(Pjlb, subexp));
+		// expected range:
+		assert((offset >= 0) && (offset < (int) cJU_BITSPERSUBEXPL));
+#else
+		offset = 0;
+#endif
+
+// Save the next-left/right Indexess digit in *PIndex:
+
+SM1LeafB1Findlimit:
+		JU_BITMAPDIGITL(digit, subexp, JU_JLB_BITMAP(Pjlb, subexp), offset);
+		JU_SETDIGIT1(*PIndex, digit);
+		JU_RET_FOUND_LEAF_B1(Pjlb, subexp, offset);
+//	== return((PPvoid_t) (P_JV(JL_JLB_PVALUE(Pjlb, subexp)) + (offset)));
+	    }
+
+// Theres no next-left/right Index in the LeafB1:
+//
+// Shortcut and start backtracking one level up; ignore the current Pjp because
+// it points to a LeafB1 with no next-left/right Index.
+
+	    goto SM2Backtrack;
+
+	} // case cJU_JPLEAF_B1
+
+#ifdef JUDY1
+// ----------------------------------------------------------------------------
+// FULL POPULATION:
+//
+// If the Decode bytes match, *PIndex is found (without modification).
+
+	case cJ1_JPFULLPOPU1:
+
+	    CHECKDCD(1);
+	    JU_RET_FOUND_FULLPOPU1;
+#endif
+
+
+// ----------------------------------------------------------------------------
+// IMMEDIATE:
+
+#ifdef JUDYPREV
+#define	SM1IMM_SETPOP1(cPop1)
+#else
+#define SM1IMM_SETPOP1(cPop1)  pop1 = (cPop1)
+#endif
+
+#define	SM1IMM(Func,cPop1)				\
+	SM1IMM_SETPOP1(cPop1);				\
+	offset = Func((Pjll_t) (PJI), cPop1, *PIndex);	\
+	goto SM1LeafLImm
+
+// Special case for Pop1 = 1 Immediate JPs:
+//
+// If *PIndex is in the immediate, offset is 0, otherwise the binary NOT of the
+// offset where it belongs, 0 or 1, same as from the search functions.
+
+#ifdef JUDYPREV
+#define	SM1IMM_01_SETPOP1
+#else
+#define SM1IMM_01_SETPOP1  pop1 = 1
+#endif
+
+#define	SM1IMM_01							  \
+	SM1IMM_01_SETPOP1;						  \
+	offset = ((JU_JPDCDPOP0(Pjp) <  JU_TRIMTODCDSIZE(*PIndex)) ? ~1 : \
+		  (JU_JPDCDPOP0(Pjp) == JU_TRIMTODCDSIZE(*PIndex)) ?  0 : \
+								     ~0); \
+	goto SM1LeafLImm
+
+	case cJU_JPIMMED_1_01:
+	case cJU_JPIMMED_2_01:
+	case cJU_JPIMMED_3_01:
+#ifdef JU_64BIT
+	case cJU_JPIMMED_4_01:
+	case cJU_JPIMMED_5_01:
+	case cJU_JPIMMED_6_01:
+	case cJU_JPIMMED_7_01:
+#endif
+	    SM1IMM_01;
+
+// TBD:  Doug says it would be OK to have fewer calls and calculate arg 2, here
+// and in Judy*Count() also.
+
+	case cJU_JPIMMED_1_02:  SM1IMM(j__udySearchLeaf1,  2);
+	case cJU_JPIMMED_1_03:  SM1IMM(j__udySearchLeaf1,  3);
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_1_04:  SM1IMM(j__udySearchLeaf1,  4);
+	case cJU_JPIMMED_1_05:  SM1IMM(j__udySearchLeaf1,  5);
+	case cJU_JPIMMED_1_06:  SM1IMM(j__udySearchLeaf1,  6);
+	case cJU_JPIMMED_1_07:  SM1IMM(j__udySearchLeaf1,  7);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_1_08:  SM1IMM(j__udySearchLeaf1,  8);
+	case cJ1_JPIMMED_1_09:  SM1IMM(j__udySearchLeaf1,  9);
+	case cJ1_JPIMMED_1_10:  SM1IMM(j__udySearchLeaf1, 10);
+	case cJ1_JPIMMED_1_11:  SM1IMM(j__udySearchLeaf1, 11);
+	case cJ1_JPIMMED_1_12:  SM1IMM(j__udySearchLeaf1, 12);
+	case cJ1_JPIMMED_1_13:  SM1IMM(j__udySearchLeaf1, 13);
+	case cJ1_JPIMMED_1_14:  SM1IMM(j__udySearchLeaf1, 14);
+	case cJ1_JPIMMED_1_15:  SM1IMM(j__udySearchLeaf1, 15);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_2_02:  SM1IMM(j__udySearchLeaf2,  2);
+	case cJU_JPIMMED_2_03:  SM1IMM(j__udySearchLeaf2,  3);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_2_04:  SM1IMM(j__udySearchLeaf2,  4);
+	case cJ1_JPIMMED_2_05:  SM1IMM(j__udySearchLeaf2,  5);
+	case cJ1_JPIMMED_2_06:  SM1IMM(j__udySearchLeaf2,  6);
+	case cJ1_JPIMMED_2_07:  SM1IMM(j__udySearchLeaf2,  7);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_3_02:  SM1IMM(j__udySearchLeaf3,  2);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_3_03:  SM1IMM(j__udySearchLeaf3,  3);
+	case cJ1_JPIMMED_3_04:  SM1IMM(j__udySearchLeaf3,  4);
+	case cJ1_JPIMMED_3_05:  SM1IMM(j__udySearchLeaf3,  5);
+
+	case cJ1_JPIMMED_4_02:  SM1IMM(j__udySearchLeaf4,  2);
+	case cJ1_JPIMMED_4_03:  SM1IMM(j__udySearchLeaf4,  3);
+
+	case cJ1_JPIMMED_5_02:  SM1IMM(j__udySearchLeaf5,  2);
+	case cJ1_JPIMMED_5_03:  SM1IMM(j__udySearchLeaf5,  3);
+
+	case cJ1_JPIMMED_6_02:  SM1IMM(j__udySearchLeaf6,  2);
+
+	case cJ1_JPIMMED_7_02:  SM1IMM(j__udySearchLeaf7,  2);
+#endif
+
+
+// ----------------------------------------------------------------------------
+// INVALID JP TYPE:
+
+	default: JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		 JUDY1CODE(return(JERRI );)
+		 JUDYLCODE(return(PPJERR);)
+
+	} // SM1Get switch.
+
+	/*NOTREACHED*/
+
+
+// ============================================================================
+// STATE MACHINE 2 -- BACKTRACK BRANCH TO PREVIOUS JP:
+//
+// Look for the next-left/right JP in a branch, backing up the history list as
+// necessary.  Upon finding a next-left/right JP, modify the corresponding
+// digit in *PIndex before passing control to SM3Findlimit.
+//
+// Note:  As described earlier, only branch JPs are expected here; other types
+// fall into the default case.
+//
+// Note:  If a found JP contains needed Dcd bytes, thats OK, theyre copied to
+// *PIndex in SM3Findlimit.
+//
+// TBD:  This code has a lot in common with similar code in the shortcut cases
+// in SM1Get.  Can combine this code somehow?
+//
+// ENTRY:  List, possibly empty, of JPs and offsets in APjphist[] and
+// Aoffhist[]; see earlier comments.
+//
+// EXIT:  Execute JU_RET_NOTFOUND if no previous/next JP; otherwise jump to
+// SM3Findlimit to resume a new but different downward search.
+
+SM2Backtrack:		// come or return here for first/next sideways search.
+
+	HISTPOP(Pjp, offset);
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// ----------------------------------------------------------------------------
+// LINEAR BRANCH:
+
+	case cJU_JPBRANCH_L2: state = 2;	     goto SM2BranchL;
+	case cJU_JPBRANCH_L3: state = 3;	     goto SM2BranchL;
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_L4: state = 4;	     goto SM2BranchL;
+	case cJU_JPBRANCH_L5: state = 5;	     goto SM2BranchL;
+	case cJU_JPBRANCH_L6: state = 6;	     goto SM2BranchL;
+	case cJU_JPBRANCH_L7: state = 7;	     goto SM2BranchL;
+#endif
+	case cJU_JPBRANCH_L:  state = cJU_ROOTSTATE; goto SM2BranchL;
+
+SM2BranchL:
+#ifdef JUDYPREV
+	    if (--offset < 0) goto SM2Backtrack;  // no next-left JP in BranchL.
+#endif
+	    Pjbl = P_JBL(Pjp->jp_Addr);
+#ifdef JUDYNEXT
+	    if (++offset >= (Pjbl->jbl_NumJPs)) goto SM2Backtrack;
+						// no next-right JP in BranchL.
+#endif
+
+// Theres a next-left/right JP in the current BranchL; save its digit in
+// *PIndex and continue with SM3Findlimit:
+
+	    JU_SETDIGIT(*PIndex, Pjbl->jbl_Expanse[offset], state);
+	    Pjp = (Pjbl->jbl_jp) + offset;
+	    goto SM3Findlimit;
+
+
+// ----------------------------------------------------------------------------
+// BITMAP BRANCH:
+
+	case cJU_JPBRANCH_B2: state = 2;	     goto SM2BranchB;
+	case cJU_JPBRANCH_B3: state = 3;	     goto SM2BranchB;
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_B4: state = 4;	     goto SM2BranchB;
+	case cJU_JPBRANCH_B5: state = 5;	     goto SM2BranchB;
+	case cJU_JPBRANCH_B6: state = 6;	     goto SM2BranchB;
+	case cJU_JPBRANCH_B7: state = 7;	     goto SM2BranchB;
+#endif
+	case cJU_JPBRANCH_B:  state = cJU_ROOTSTATE; goto SM2BranchB;
+
+SM2BranchB:
+	    Pjbb = P_JBB(Pjp->jp_Addr);
+	    HISTPOPBOFF(subexp, offset, digit);		// unpack values.
+
+// If theres a next-left/right JP in the current BranchB, which for
+// Judy*Next() is true if any bits are set for higher Indexes, continue to
+// SM3Findlimit:
+//
+// Note:  offset is set to the JP previously traversed; go one to the
+// left/right.
+
+#ifdef JUDYPREV
+	    if (offset > 0)		// next-left JP is in this subexpanse.
+	    {
+		--offset;
+		goto SM2BranchBFindlimit;
+	    }
+
+	    while (--subexp >= 0)		// search next-left subexpanses.
+#else
+	    if (JU_JBB_BITMAP(Pjbb, subexp)
+	      & JU_MASKHIGHEREXC(JU_BITPOSMASKB(digit)))
+	    {
+		++offset;			// next-left => next-right.
+		goto SM2BranchBFindlimit;
+	    }
+
+	    while (++subexp < cJU_NUMSUBEXPB)	// search next-right subexps.
+#endif
+	    {
+		if (! JU_JBB_PJP(Pjbb, subexp)) continue;  // empty subexpanse.
+
+#ifdef JUDYPREV
+		offset = SEARCHBITMAPMAXB(JU_JBB_BITMAP(Pjbb, subexp));
+		// expected range:
+		assert((offset >= 0) && (offset < cJU_BITSPERSUBEXPB));
+#else
+		offset = 0;
+#endif
+
+// Save the next-left/right JPs digit in *PIndex:
+
+SM2BranchBFindlimit:
+		JU_BITMAPDIGITB(digit, subexp, JU_JBB_BITMAP(Pjbb, subexp),
+				offset);
+		JU_SETDIGIT(*PIndex, digit, state);
+
+		if ((Pjp = P_JP(JU_JBB_PJP(Pjbb, subexp))) == (Pjp_t) NULL)
+		{
+		    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		    JUDY1CODE(return(JERRI );)
+		    JUDYLCODE(return(PPJERR);)
+		}
+
+		Pjp += offset;
+		goto SM3Findlimit;
+	    }
+
+// Theres no next-left/right JP in the BranchB:
+
+	    goto SM2Backtrack;
+
+
+// ----------------------------------------------------------------------------
+// UNCOMPRESSED BRANCH:
+
+	case cJU_JPBRANCH_U2: state = 2;	     goto SM2BranchU;
+	case cJU_JPBRANCH_U3: state = 3;	     goto SM2BranchU;
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_U4: state = 4;	     goto SM2BranchU;
+	case cJU_JPBRANCH_U5: state = 5;	     goto SM2BranchU;
+	case cJU_JPBRANCH_U6: state = 6;	     goto SM2BranchU;
+	case cJU_JPBRANCH_U7: state = 7;	     goto SM2BranchU;
+#endif
+	case cJU_JPBRANCH_U:  state = cJU_ROOTSTATE; goto SM2BranchU;
+
+SM2BranchU:
+
+// Search for a next-left/right JP in the current BranchU, and if one is found,
+// save its digit in *PIndex and continue to SM3Findlimit:
+
+	    Pjbu  = P_JBU(Pjp->jp_Addr);
+	    digit = offset;
+
+#ifdef JUDYPREV
+	    while (digit >= 1)
+	    {
+		Pjp = (Pjbu->jbu_jp) + (--digit);
+#else
+	    while (digit < cJU_BRANCHUNUMJPS - 1)
+	    {
+		Pjp = (Pjbu->jbu_jp) + (++digit);
+#endif
+		if (JPNULL(JU_JPTYPE(Pjp))) continue;
+
+		JU_SETDIGIT(*PIndex, digit, state);
+		goto SM3Findlimit;
+	    }
+
+// Theres no next-left/right JP in the BranchU:
+
+	    goto SM2Backtrack;
+
+
+// ----------------------------------------------------------------------------
+// INVALID JP TYPE:
+
+	default: JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		 JUDY1CODE(return(JERRI );)
+		 JUDYLCODE(return(PPJERR);)
+
+	} // SM2Backtrack switch.
+
+	/*NOTREACHED*/
+
+
+// ============================================================================
+// STATE MACHINE 3 -- FIND LIMIT JP/INDEX:
+//
+// Look for the highest/lowest (right/left-most) JP in each branch and the
+// highest/lowest Index in a leaf or immediate, and return it.  While
+// traversing, modify appropriate digit(s) in *PIndex to reflect the path
+// taken, including Dcd bytes in each JP (which could hold critical missing
+// digits for skipped branches).
+//
+// ENTRY:  Pjp set to a JP under which to find max/min JPs (if a branch JP) or
+// a max/min Index and return (if a leaf or immediate JP).
+//
+// EXIT:  Execute JU_RET_FOUND* upon reaching a leaf or immediate.  Should be
+// impossible to fail, unless the Judy array is corrupt.
+
+SM3Findlimit:		// come or return here for first/next branch/leaf.
+
+	switch (JU_JPTYPE(Pjp))
+	{
+// ----------------------------------------------------------------------------
+// LINEAR BRANCH:
+//
+// Simply use the highest/lowest (right/left-most) JP in the BranchL, but first
+// copy the Dcd bytes to *PIndex if there are any (only if state <
+// cJU_ROOTSTATE - 1).
+
+	case cJU_JPBRANCH_L2:  SM3PREPB_DCD(2, SM3BranchL);
+#ifndef JU_64BIT
+	case cJU_JPBRANCH_L3:  SM3PREPB(    3, SM3BranchL);
+#else
+	case cJU_JPBRANCH_L3:  SM3PREPB_DCD(3, SM3BranchL);
+	case cJU_JPBRANCH_L4:  SM3PREPB_DCD(4, SM3BranchL);
+	case cJU_JPBRANCH_L5:  SM3PREPB_DCD(5, SM3BranchL);
+	case cJU_JPBRANCH_L6:  SM3PREPB_DCD(6, SM3BranchL);
+	case cJU_JPBRANCH_L7:  SM3PREPB(    7, SM3BranchL);
+#endif
+	case cJU_JPBRANCH_L:   SM3PREPB(    cJU_ROOTSTATE, SM3BranchL);
+
+SM3BranchL:
+	    Pjbl = P_JBL(Pjp->jp_Addr);
+
+#ifdef JUDYPREV
+	    if ((offset = (Pjbl->jbl_NumJPs) - 1) < 0)
+#else
+	    offset = 0; if ((Pjbl->jbl_NumJPs) == 0)
+#endif
+	    {
+		JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		JUDY1CODE(return(JERRI );)
+		JUDYLCODE(return(PPJERR);)
+	    }
+
+	    JU_SETDIGIT(*PIndex, Pjbl->jbl_Expanse[offset], state);
+	    Pjp = (Pjbl->jbl_jp) + offset;
+	    goto SM3Findlimit;
+
+
+// ----------------------------------------------------------------------------
+// BITMAP BRANCH:
+//
+// Look for the highest/lowest (right/left-most) non-null subexpanse, then use
+// the highest/lowest JP in that subexpanse, but first copy Dcd bytes, if there
+// are any (only if state < cJU_ROOTSTATE - 1), to *PIndex.
+
+	case cJU_JPBRANCH_B2:  SM3PREPB_DCD(2, SM3BranchB);
+#ifndef JU_64BIT
+	case cJU_JPBRANCH_B3:  SM3PREPB(    3, SM3BranchB);
+#else
+	case cJU_JPBRANCH_B3:  SM3PREPB_DCD(3, SM3BranchB);
+	case cJU_JPBRANCH_B4:  SM3PREPB_DCD(4, SM3BranchB);
+	case cJU_JPBRANCH_B5:  SM3PREPB_DCD(5, SM3BranchB);
+	case cJU_JPBRANCH_B6:  SM3PREPB_DCD(6, SM3BranchB);
+	case cJU_JPBRANCH_B7:  SM3PREPB(    7, SM3BranchB);
+#endif
+	case cJU_JPBRANCH_B:   SM3PREPB(    cJU_ROOTSTATE, SM3BranchB);
+
+SM3BranchB:
+	    Pjbb   = P_JBB(Pjp->jp_Addr);
+#ifdef JUDYPREV
+	    subexp = cJU_NUMSUBEXPB;
+
+	    while (! (JU_JBB_BITMAP(Pjbb, --subexp)))  // find non-empty subexp.
+	    {
+		if (subexp <= 0)		    // wholly empty bitmap.
+		{
+		    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		    JUDY1CODE(return(JERRI );)
+		    JUDYLCODE(return(PPJERR);)
+		}
+	    }
+
+	    offset = SEARCHBITMAPMAXB(JU_JBB_BITMAP(Pjbb, subexp));
+	    // expected range:
+	    assert((offset >= 0) && (offset < cJU_BITSPERSUBEXPB));
+#else
+	    subexp = -1;
+
+	    while (! (JU_JBB_BITMAP(Pjbb, ++subexp)))  // find non-empty subexp.
+	    {
+		if (subexp >= cJU_NUMSUBEXPB - 1)      // didnt find one.
+		{
+		    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		    JUDY1CODE(return(JERRI );)
+		    JUDYLCODE(return(PPJERR);)
+		}
+	    }
+
+	    offset = 0;
+#endif
+
+	    JU_BITMAPDIGITB(digit, subexp, JU_JBB_BITMAP(Pjbb, subexp), offset);
+	    JU_SETDIGIT(*PIndex, digit, state);
+
+	    if ((Pjp = P_JP(JU_JBB_PJP(Pjbb, subexp))) == (Pjp_t) NULL)
+	    {
+		JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		JUDY1CODE(return(JERRI );)
+		JUDYLCODE(return(PPJERR);)
+	    }
+
+	    Pjp += offset;
+	    goto SM3Findlimit;
+
+
+// ----------------------------------------------------------------------------
+// UNCOMPRESSED BRANCH:
+//
+// Look for the highest/lowest (right/left-most) non-null JP, and use it, but
+// first copy Dcd bytes to *PIndex if there are any (only if state <
+// cJU_ROOTSTATE - 1).
+
+	case cJU_JPBRANCH_U2:  SM3PREPB_DCD(2, SM3BranchU);
+#ifndef JU_64BIT
+	case cJU_JPBRANCH_U3:  SM3PREPB(    3, SM3BranchU);
+#else
+	case cJU_JPBRANCH_U3:  SM3PREPB_DCD(3, SM3BranchU);
+	case cJU_JPBRANCH_U4:  SM3PREPB_DCD(4, SM3BranchU);
+	case cJU_JPBRANCH_U5:  SM3PREPB_DCD(5, SM3BranchU);
+	case cJU_JPBRANCH_U6:  SM3PREPB_DCD(6, SM3BranchU);
+	case cJU_JPBRANCH_U7:  SM3PREPB(    7, SM3BranchU);
+#endif
+	case cJU_JPBRANCH_U:   SM3PREPB(    cJU_ROOTSTATE, SM3BranchU);
+
+SM3BranchU:
+	    Pjbu  = P_JBU(Pjp->jp_Addr);
+#ifdef JUDYPREV
+	    digit = cJU_BRANCHUNUMJPS;
+
+	    while (digit >= 1)
+	    {
+		Pjp = (Pjbu->jbu_jp) + (--digit);
+#else
+
+	    for (digit = 0; digit < cJU_BRANCHUNUMJPS; ++digit)
+	    {
+		Pjp = (Pjbu->jbu_jp) + digit;
+#endif
+		if (JPNULL(JU_JPTYPE(Pjp))) continue;
+
+		JU_SETDIGIT(*PIndex, digit, state);
+		goto SM3Findlimit;
+	    }
+
+// No non-null JPs in BranchU:
+
+	    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+	    JUDY1CODE(return(JERRI );)
+	    JUDYLCODE(return(PPJERR);)
+
+
+// ----------------------------------------------------------------------------
+// LINEAR LEAF:
+//
+// Simply use the highest/lowest (right/left-most) Index in the LeafL, but the
+// details vary depending on leaf Index Size.  First copy Dcd bytes, if there
+// are any (only if state < cJU_ROOTSTATE - 1), to *PIndex.
+
+#define	SM3LEAFLDCD(cState)				\
+	JU_SETDCD(*PIndex, Pjp, cState);	        \
+	SM3LEAFLNODCD
+
+#ifdef JUDY1
+#define	SM3LEAFL_SETPOP1		// not needed in any cases.
+#else
+#define	SM3LEAFL_SETPOP1  pop1 = JU_JPLEAF_POP0(Pjp) + 1
+#endif
+
+#ifdef JUDYPREV
+#define	SM3LEAFLNODCD			\
+	Pjll = P_JLL(Pjp->jp_Addr);	\
+	SM3LEAFL_SETPOP1;		\
+	offset = JU_JPLEAF_POP0(Pjp); assert(offset >= 0)
+#else
+#define	SM3LEAFLNODCD			\
+	Pjll = P_JLL(Pjp->jp_Addr);	\
+	SM3LEAFL_SETPOP1;		\
+	offset = 0; assert(JU_JPLEAF_POP0(Pjp) >= 0);
+#endif
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+	case cJU_JPLEAF1:
+
+	    SM3LEAFLDCD(1);
+	    JU_SETDIGIT1(*PIndex, ((uint8_t *) Pjll)[offset]);
+	    JU_RET_FOUND_LEAF1(Pjll, pop1, offset);
+#endif
+
+	case cJU_JPLEAF2:
+
+	    SM3LEAFLDCD(2);
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(2)))
+		    | ((uint16_t *) Pjll)[offset];
+	    JU_RET_FOUND_LEAF2(Pjll, pop1, offset);
+
+#ifndef JU_64BIT
+	case cJU_JPLEAF3:
+	{
+	    Word_t lsb;
+	    SM3LEAFLNODCD;
+	    JU_COPY3_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (3 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(3))) | lsb;
+	    JU_RET_FOUND_LEAF3(Pjll, pop1, offset);
+	}
+
+#else
+	case cJU_JPLEAF3:
+	{
+	    Word_t lsb;
+	    SM3LEAFLDCD(3);
+	    JU_COPY3_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (3 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(3))) | lsb;
+	    JU_RET_FOUND_LEAF3(Pjll, pop1, offset);
+	}
+
+	case cJU_JPLEAF4:
+
+	    SM3LEAFLDCD(4);
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(4)))
+		    | ((uint32_t *) Pjll)[offset];
+	    JU_RET_FOUND_LEAF4(Pjll, pop1, offset);
+
+	case cJU_JPLEAF5:
+	{
+	    Word_t lsb;
+	    SM3LEAFLDCD(5);
+	    JU_COPY5_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (5 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(5))) | lsb;
+	    JU_RET_FOUND_LEAF5(Pjll, pop1, offset);
+	}
+
+	case cJU_JPLEAF6:
+	{
+	    Word_t lsb;
+	    SM3LEAFLDCD(6);
+	    JU_COPY6_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (6 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(6))) | lsb;
+	    JU_RET_FOUND_LEAF6(Pjll, pop1, offset);
+	}
+
+	case cJU_JPLEAF7:
+	{
+	    Word_t lsb;
+	    SM3LEAFLNODCD;
+	    JU_COPY7_PINDEX_TO_LONG(lsb, ((uint8_t *) Pjll) + (7 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(7))) | lsb;
+	    JU_RET_FOUND_LEAF7(Pjll, pop1, offset);
+	}
+#endif
+
+
+// ----------------------------------------------------------------------------
+// BITMAP LEAF:
+//
+// Look for the highest/lowest (right/left-most) non-null subexpanse, then use
+// the highest/lowest Index in that subexpanse, but first copy Dcd bytes
+// (always present since state 1 < cJU_ROOTSTATE) to *PIndex.
+
+	case cJU_JPLEAF_B1:
+	{
+	    Pjlb_t Pjlb;
+
+	    JU_SETDCD(*PIndex, Pjp, 1);
+
+	    Pjlb   = P_JLB(Pjp->jp_Addr);
+#ifdef JUDYPREV
+	    subexp = cJU_NUMSUBEXPL;
+
+	    while (! JU_JLB_BITMAP(Pjlb, --subexp))  // find non-empty subexp.
+	    {
+		if (subexp <= 0)		// wholly empty bitmap.
+		{
+		    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		    JUDY1CODE(return(JERRI );)
+		    JUDYLCODE(return(PPJERR);)
+		}
+	    }
+
+// TBD:  Might it be faster to just use a variant of BITMAPDIGIT*() that yields
+// the digit for the right-most Index with a bit set?
+
+	    offset = SEARCHBITMAPMAXL(JU_JLB_BITMAP(Pjlb, subexp));
+	    // expected range:
+	    assert((offset >= 0) && (offset < cJU_BITSPERSUBEXPL));
+#else
+	    subexp = -1;
+
+	    while (! JU_JLB_BITMAP(Pjlb, ++subexp))  // find non-empty subexp.
+	    {
+		if (subexp >= cJU_NUMSUBEXPL - 1)    // didnt find one.
+		{
+		    JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		    JUDY1CODE(return(JERRI );)
+		    JUDYLCODE(return(PPJERR);)
+		}
+	    }
+
+	    offset = 0;
+#endif
+
+	    JU_BITMAPDIGITL(digit, subexp, JU_JLB_BITMAP(Pjlb, subexp), offset);
+	    JU_SETDIGIT1(*PIndex, digit);
+	    JU_RET_FOUND_LEAF_B1(Pjlb, subexp, offset);
+//	== return((PPvoid_t) (P_JV(JL_JLB_PVALUE(Pjlb, subexp)) + (offset)));
+
+	} // case cJU_JPLEAF_B1
+
+#ifdef JUDY1
+// ----------------------------------------------------------------------------
+// FULL POPULATION:
+//
+// Copy Dcd bytes to *PIndex (always present since state 1 < cJU_ROOTSTATE),
+// then set the highest/lowest possible digit as the LSB in *PIndex.
+
+	case cJ1_JPFULLPOPU1:
+
+	    JU_SETDCD(   *PIndex, Pjp, 1);
+#ifdef JUDYPREV
+	    JU_SETDIGIT1(*PIndex, cJU_BITSPERBITMAP - 1);
+#else
+	    JU_SETDIGIT1(*PIndex, 0);
+#endif
+	    JU_RET_FOUND_FULLPOPU1;
+#endif // JUDY1
+
+
+// ----------------------------------------------------------------------------
+// IMMEDIATE:
+//
+// Simply use the highest/lowest (right/left-most) Index in the Imm, but the
+// details vary depending on leaf Index Size and pop1.  Note:  There are no Dcd
+// bytes in an Immediate JP, but in a cJU_JPIMMED_*_01 JP, the field holds the
+// least bytes of the immediate Index.
+
+	case cJU_JPIMMED_1_01: SET_01(1); goto SM3Imm_01;
+	case cJU_JPIMMED_2_01: SET_01(2); goto SM3Imm_01;
+	case cJU_JPIMMED_3_01: SET_01(3); goto SM3Imm_01;
+#ifdef JU_64BIT
+	case cJU_JPIMMED_4_01: SET_01(4); goto SM3Imm_01;
+	case cJU_JPIMMED_5_01: SET_01(5); goto SM3Imm_01;
+	case cJU_JPIMMED_6_01: SET_01(6); goto SM3Imm_01;
+	case cJU_JPIMMED_7_01: SET_01(7); goto SM3Imm_01;
+#endif
+SM3Imm_01:	JU_RET_FOUND_IMM_01(Pjp);
+
+#ifdef JUDYPREV
+#define	SM3IMM_OFFSET(cPop1)  (cPop1) - 1	// highest.
+#else
+#define	SM3IMM_OFFSET(cPop1)  0			// lowest.
+#endif
+
+#define	SM3IMM(cPop1,Next)		\
+	offset = SM3IMM_OFFSET(cPop1);	\
+	goto Next
+
+	case cJU_JPIMMED_1_02: SM3IMM( 2, SM3Imm1);
+	case cJU_JPIMMED_1_03: SM3IMM( 3, SM3Imm1);
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_1_04: SM3IMM( 4, SM3Imm1);
+	case cJU_JPIMMED_1_05: SM3IMM( 5, SM3Imm1);
+	case cJU_JPIMMED_1_06: SM3IMM( 6, SM3Imm1);
+	case cJU_JPIMMED_1_07: SM3IMM( 7, SM3Imm1);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_1_08: SM3IMM( 8, SM3Imm1);
+	case cJ1_JPIMMED_1_09: SM3IMM( 9, SM3Imm1);
+	case cJ1_JPIMMED_1_10: SM3IMM(10, SM3Imm1);
+	case cJ1_JPIMMED_1_11: SM3IMM(11, SM3Imm1);
+	case cJ1_JPIMMED_1_12: SM3IMM(12, SM3Imm1);
+	case cJ1_JPIMMED_1_13: SM3IMM(13, SM3Imm1);
+	case cJ1_JPIMMED_1_14: SM3IMM(14, SM3Imm1);
+	case cJ1_JPIMMED_1_15: SM3IMM(15, SM3Imm1);
+#endif
+
+SM3Imm1:    JU_SETDIGIT1(*PIndex, ((uint8_t *) PJI)[offset]);
+	    JU_RET_FOUND_IMM(Pjp, offset);
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_2_02: SM3IMM(2, SM3Imm2);
+	case cJU_JPIMMED_2_03: SM3IMM(3, SM3Imm2);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_2_04: SM3IMM(4, SM3Imm2);
+	case cJ1_JPIMMED_2_05: SM3IMM(5, SM3Imm2);
+	case cJ1_JPIMMED_2_06: SM3IMM(6, SM3Imm2);
+	case cJ1_JPIMMED_2_07: SM3IMM(7, SM3Imm2);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+SM3Imm2:    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(2)))
+		    | ((uint16_t *) PJI)[offset];
+	    JU_RET_FOUND_IMM(Pjp, offset);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_3_02: SM3IMM(2, SM3Imm3);
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_3_03: SM3IMM(3, SM3Imm3);
+	case cJ1_JPIMMED_3_04: SM3IMM(4, SM3Imm3);
+	case cJ1_JPIMMED_3_05: SM3IMM(5, SM3Imm3);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+SM3Imm3:
+	{
+	    Word_t lsb;
+	    JU_COPY3_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (3 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(3))) | lsb;
+	    JU_RET_FOUND_IMM(Pjp, offset);
+	}
+#endif
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_4_02: SM3IMM(2, SM3Imm4);
+	case cJ1_JPIMMED_4_03: SM3IMM(3, SM3Imm4);
+
+SM3Imm4:    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(4)))
+		    | ((uint32_t *) PJI)[offset];
+	    JU_RET_FOUND_IMM(Pjp, offset);
+
+	case cJ1_JPIMMED_5_02: SM3IMM(2, SM3Imm5);
+	case cJ1_JPIMMED_5_03: SM3IMM(3, SM3Imm5);
+
+SM3Imm5:
+	{
+	    Word_t lsb;
+	    JU_COPY5_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (5 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(5))) | lsb;
+	    JU_RET_FOUND_IMM(Pjp, offset);
+	}
+
+	case cJ1_JPIMMED_6_02: SM3IMM(2, SM3Imm6);
+
+SM3Imm6:
+	{
+	    Word_t lsb;
+	    JU_COPY6_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (6 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(6))) | lsb;
+	    JU_RET_FOUND_IMM(Pjp, offset);
+	}
+
+	case cJ1_JPIMMED_7_02: SM3IMM(2, SM3Imm7);
+
+SM3Imm7:
+	{
+	    Word_t lsb;
+	    JU_COPY7_PINDEX_TO_LONG(lsb, ((uint8_t *) PJI) + (7 * offset));
+	    *PIndex = (*PIndex & (~JU_LEASTBYTESMASK(7))) | lsb;
+	    JU_RET_FOUND_IMM(Pjp, offset);
+	}
+#endif // (JUDY1 && JU_64BIT)
+
+
+// ----------------------------------------------------------------------------
+// OTHER CASES:
+
+	default: JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
+		 JUDY1CODE(return(JERRI );)
+		 JUDYLCODE(return(PPJERR);)
+
+	} // SM3Findlimit switch.
+
+	/*NOTREACHED*/
+
+} // Judy1Prev() / Judy1Next() / JudyLPrev() / JudyLNext()
diff --git a/libs/klib/judy/JudyPrevNextEmpty.c b/libs/klib/judy/JudyPrevNextEmpty.c
new file mode 100644
index 0000000..7eef40d
--- /dev/null
+++ b/libs/klib/judy/JudyPrevNextEmpty.c
@@ -0,0 +1,1388 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Judy*PrevEmpty() and Judy*NextEmpty() functions for Judy1 and JudyL.
+// Compile with one of -DJUDY1 or -DJUDYL.
+//
+// Compile with -DJUDYNEXT for the Judy*NextEmpty() function; otherwise
+// defaults to Judy*PrevEmpty().
+//
+// Compile with -DTRACEJPSE to trace JP traversals.
+//
+// This file is separate from JudyPrevNext.c because it differs too greatly for
+// ifdefs.  This might be a bit surprising, but there are two reasons:
+//
+// - First, down in the details, searching for an empty index (SearchEmpty) is
+//   remarkably asymmetric with searching for a valid index (SearchValid),
+//   mainly with respect to:  No return of a value area for JudyL; partially-
+//   full versus totally-full JPs; and handling of narrow pointers.
+//
+// - Second, we chose to implement SearchEmpty without a backtrack stack or
+//   backtrack engine, partly as an experiment, and partly because we think
+//   restarting from the top of the tree is less likely for SearchEmpty than
+//   for SearchValid, because empty indexes are more likely than valid indexes.
+//
+// A word about naming:  A prior version of this feature (see 4.13) was named
+// Judy*Free(), but there were concerns about that being read as a verb rather
+// than an adjective.  After prolonged debate and based on user input, we
+// changed "Free" to "Empty".
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#ifndef JUDYNEXT
+#ifndef JUDYPREV
+#define	JUDYPREV 1		// neither set => use default.
+#endif
+#endif
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+
+#include "JudyPrivate1L.h"
+
+#ifdef TRACEJPSE
+#include "JudyPrintJP.c"
+#endif
+
+
+// ****************************************************************************
+// J U D Y   1   P R E V   E M P T Y
+// J U D Y   1   N E X T   E M P T Y
+// J U D Y   L   P R E V   E M P T Y
+// J U D Y   L   N E X T   E M P T Y
+//
+// See the manual entry for the API.
+//
+// OVERVIEW OF Judy*PrevEmpty() / Judy*NextEmpty():
+//
+// See also for comparison the equivalent comments in JudyPrevNext.c.
+//
+// Take the callers *PIndex and subtract/add 1, but watch out for
+// underflow/overflow, which means "no previous/next empty index found."  Use a
+// reentrant switch statement (state machine, see SMGetRestart and
+// SMGetContinue) to decode Index, starting with the JRP (PArray), through a
+// JPM and branches, if any, down to an immediate or a leaf.  Look for Index in
+// that immediate or leaf, and if not found (invalid index), return success
+// (Index is empty).
+//
+// This search can result in a dead end where taking a different path is
+// required.  There are four kinds of dead ends:
+//
+// BRANCH PRIMARY dead end:  Encountering a fully-populated JP for the
+// appropriate digit in Index.  Search sideways in the branch for the
+// previous/next absent/null/non-full JP, and if one is found, set Index to the
+// highest/lowest index possible in that JPs expanse.  Then if the JP is an
+// absent or null JP, return success; otherwise for a non-full JP, traverse
+// through the partially populated JP.
+//
+// BRANCH SECONDARY dead end:  Reaching the end of a branch during a sideways
+// search after a branch primary dead end.  Set Index to the lowest/highest
+// index possible in the whole branchs expanse (one higher/lower than the
+// previous/next branchs expanse), then restart at the top of the tree, which
+// includes pre-decrementing/incrementing Index (again) and watching for
+// underflow/overflow (again).
+//
+// LEAF PRIMARY dead end:  Finding a valid (non-empty) index in an immediate or
+// leaf matching Index.  Search sideways in the immediate/leaf for the
+// previous/next empty index; if found, set *PIndex to match and return success.
+//
+// LEAF SECONDARY dead end:  Reaching the end of an immediate or leaf during a
+// sideways search after a leaf primary dead end.  Just as for a branch
+// secondary dead end, restart at the top of the tree with Index set to the
+// lowest/highest index possible in the whole immediate/leafs expanse.
+// TBD:  If leaf secondary dead end occurs, could shortcut and treat it as a
+// branch primary dead end; but this would require remembering the parent
+// branchs type and offset (a "one-deep stack"), and also wrestling with
+// narrow pointers, at least for leaves (but not for immediates).
+//
+// Note some ASYMMETRIES between SearchValid and SearchEmpty:
+//
+// - The SearchValid code, upon descending through a narrow pointer, if Index
+//   is outside the expanse of the subsidiary node (effectively a secondary
+//   dead end), must decide whether to backtrack or findlimit.  But the
+//   SearchEmpty code simply returns success (Index is empty).
+//
+// - Similarly, the SearchValid code, upon finding no previous/next index in
+//   the expanse of a narrow pointer (again, a secondary dead end), can simply
+//   start to backtrack at the parent JP.  But the SearchEmpty code would have
+//   to first determine whether or not the parent JPs narrow expanse contains
+//   a previous/next empty index outside the subexpanse.  Rather than keeping a
+//   parent state stack and backtracking this way, upon a secondary dead end,
+//   the SearchEmpty code simply restarts at the top of the tree, whether or
+//   not a narrow pointer is involved.  Again, see the equivalent comments in
+//   JudyPrevNext.c for comparison.
+//
+// This function is written iteratively for speed, rather than recursively.
+//
+// TBD:  Wed like to enhance this function to make successive searches faster.
+// This would require saving some previous state, including the previous Index
+// returned, and in which leaf it was found.  If the next call is for the same
+// Index and the array has not been modified, start at the same leaf.  This
+// should be much easier to implement since this is iterative rather than
+// recursive code.
+
+#ifdef JUDY1
+#ifdef JUDYPREV
+FUNCTION int Judy1PrevEmpty
+#else
+FUNCTION int Judy1NextEmpty
+#endif
+#else
+#ifdef JUDYPREV
+FUNCTION int JudyLPrevEmpty
+#else
+FUNCTION int JudyLNextEmpty
+#endif
+#endif
+        (
+	Pcvoid_t  PArray,	// Judy array to search.
+	Word_t *  PIndex,	// starting point and result.
+	PJError_t PJError	// optional, for returning error info.
+        )
+{
+	Word_t	  Index;	// fast copy, in a register.
+	Pjp_t	  Pjp;		// current JP.
+	Pjbl_t	  Pjbl;		// Pjp->jp_Addr masked and cast to types:
+	Pjbb_t	  Pjbb;
+	Pjbu_t	  Pjbu;
+	Pjlb_t	  Pjlb;
+	PWord_t	  Pword;	// alternate name for use by GET* macros.
+
+	Word_t	  digit;	// next digit to decode from Index.
+	Word_t	  digits;	// current state in SM = digits left to decode.
+	Word_t	  pop0;		// in a leaf.
+	Word_t	  pop0mask;	// precalculated to avoid variable shifts.
+	long	  offset;	// within a branch or leaf (can be large).
+	int	  subexp;	// subexpanse in a bitmap branch.
+	BITMAPB_t bitposmaskB;	// bit in bitmap for bitmap branch.
+	BITMAPL_t bitposmaskL;	// bit in bitmap for bitmap leaf.
+	Word_t	  possfullJP1;	// JP types for possibly full subexpanses:
+	Word_t	  possfullJP2;
+	Word_t	  possfullJP3;
+
+
+// ----------------------------------------------------------------------------
+// M A C R O S
+//
+// These are intended to make the code a bit more readable and less redundant.
+
+
+// CHECK FOR NULL JP:
+//
+// TBD:  In principle this can be reduced (here and in other *.c files) to just
+// the latter clause since no Type should ever be below cJU_JPNULL1, but in
+// fact some root pointer types can be lower, so for safety do both checks.
+
+#define	JPNULL(Type)  (((Type) >= cJU_JPNULL1) && ((Type) <= cJU_JPNULLMAX))
+
+
+// CHECK FOR A FULL JP:
+//
+// Given a JP, indicate if it is fully populated.  Use digits, pop0mask, and
+// possfullJP1..3 in the context.
+//
+// This is a difficult problem because it requires checking the Pop0 bits for
+// all-ones, but the number of bytes depends on the JP type, which is not
+// directly related to the parent branchs type or level -- the JPs child
+// could be under a narrow pointer (hence not full).  The simple answer
+// requires switching on or otherwise calculating the JP type, which could be
+// slow.  Instead, in SMPREPB* precalculate pop0mask and also record in
+// possfullJP1..3 the child JP (branch) types that could possibly be full (one
+// level down), and use them here.  For level-2 branches (with digits == 2),
+// the test for a full child depends on Judy1/JudyL.
+//
+// Note:  This cannot be applied to the JP in a JPM because it doesnt have
+// enough pop0 digits.
+//
+// TBD:  JPFULL_BRANCH diligently checks for BranchL or BranchB, where neither
+// of those can ever be full as it turns out.  Could just check for a BranchU
+// at the right level.  Also, pop0mask might be overkill, its not used much,
+// so perhaps just call cJU_POP0MASK(digits - 1) here?
+//
+// First, JPFULL_BRANCH checks for a full expanse for a JP whose child can be a
+// branch, that is, a JP in a branch at level 3 or higher:
+
+#define	JPFULL_BRANCH(Pjp)						\
+	  ((((JU_JPDCDPOP0(Pjp) ^ cJU_ALLONES) & pop0mask) == 0)	\
+	&& ((JU_JPTYPE(Pjp) == possfullJP1)				\
+	 || (JU_JPTYPE(Pjp) == possfullJP2)				\
+	 || (JU_JPTYPE(Pjp) == possfullJP3)))
+
+#ifdef JUDY1
+#define	JPFULL(Pjp)							\
+	((digits == 2) ?						\
+	 (JU_JPTYPE(Pjp) == cJ1_JPFULLPOPU1) : JPFULL_BRANCH(Pjp))
+#else
+#define	JPFULL(Pjp)							\
+	((digits == 2) ?						\
+	   (JU_JPTYPE(Pjp) == cJU_JPLEAF_B1)				\
+	 && (((JU_JPDCDPOP0(Pjp) & cJU_POP0MASK(1)) == cJU_POP0MASK(1))) : \
+	 JPFULL_BRANCH(Pjp))
+#endif
+
+
+// RETURN SUCCESS:
+//
+// This hides the need to set *PIndex back to the local value of Index -- use a
+// local value for faster operation.  Note that the callers *PIndex is ALWAYS
+// modified upon success, at least decremented/incremented.
+
+#define	RET_SUCCESS { *PIndex = Index; return(1); }
+
+
+// RETURN A CORRUPTION:
+
+#define	RET_CORRUPT { JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT); return(JERRI); }
+
+
+// SEARCH A BITMAP BRANCH:
+//
+// This is a weak analog of j__udySearchLeaf*() for bitmap branches.  Return
+// the actual or next-left position, base 0, of Digit in a BITMAPB_t bitmap
+// (subexpanse of a full bitmap), also given a Bitposmask for Digit.  The
+// position is the offset within the set bits.
+//
+// Unlike j__udySearchLeaf*(), the offset is not returned bit-complemented if
+// Digits bit is unset, because the caller can check the bitmap themselves to
+// determine that.  Also, if Digits bit is unset, the returned offset is to
+// the next-left JP or index (including -1), not to the "ideal" position for
+// the index = next-right JP or index.
+//
+// Shortcut and skip calling j__udyCountBitsB() if the bitmap is full, in which
+// case (Digit % cJU_BITSPERSUBEXPB) itself is the base-0 offset.
+
+#define	SEARCHBITMAPB(Bitmap,Digit,Bitposmask)				\
+	(((Bitmap) == cJU_FULLBITMAPB) ? (Digit % cJU_BITSPERSUBEXPB) :	\
+	 j__udyCountBitsB((Bitmap) & JU_MASKLOWERINC(Bitposmask)) - 1)
+
+#ifdef JUDYPREV
+// Equivalent to search for the highest offset in Bitmap, that is, one less
+// than the number of bits set:
+
+#define	SEARCHBITMAPMAXB(Bitmap)					\
+	(((Bitmap) == cJU_FULLBITMAPB) ? cJU_BITSPERSUBEXPB - 1 :	\
+	 j__udyCountBitsB(Bitmap) - 1)
+#endif
+
+
+// CHECK DECODE BYTES:
+//
+// Check Decode bytes in a JP against the equivalent portion of Index.  If they
+// dont match, Index is outside the subexpanse of a narrow pointer, hence is
+// empty.
+
+#define	CHECKDCD(cDigits) \
+	if (JU_DCDNOTMATCHINDEX(Index, Pjp, cDigits)) RET_SUCCESS
+
+
+// REVISE REMAINDER OF INDEX:
+//
+// Put one digit in place in Index and clear/set the lower digits, if any, so
+// the resulting Index is at the start/end of an expanse, or just clear/set the
+// least digits.
+//
+// Actually, to make simple use of JU_LEASTBYTESMASK, first clear/set all least
+// digits of Index including the digit to be overridden, then set the value of
+// that one digit.  If Digits == 1 the first operation is redundant, but either
+// very fast or even removed by the optimizer.
+
+#define	CLEARLEASTDIGITS(Digits) Index &= ~JU_LEASTBYTESMASK(Digits)
+#define	SETLEASTDIGITS(  Digits) Index |=  JU_LEASTBYTESMASK(Digits)
+
+#define	CLEARLEASTDIGITS_D(Digit,Digits)	\
+	{					\
+	    CLEARLEASTDIGITS(Digits);		\
+	    JU_SETDIGIT(Index, Digit, Digits);	\
+	}
+
+#define	SETLEASTDIGITS_D(Digit,Digits)		\
+	{					\
+	    SETLEASTDIGITS(Digits);		\
+	    JU_SETDIGIT(Index, Digit, Digits);	\
+	}
+
+
+// SET REMAINDER OF INDEX AND THEN RETURN OR CONTINUE:
+
+#define	SET_AND_RETURN(OpLeastDigits,Digit,Digits)	\
+	{						\
+	    OpLeastDigits(Digit, Digits);		\
+	    RET_SUCCESS;				\
+	}
+
+#define	SET_AND_CONTINUE(OpLeastDigits,Digit,Digits)	\
+	{						\
+	    OpLeastDigits(Digit, Digits);		\
+	    goto SMGetContinue;				\
+	}
+
+
+// PREPARE TO HANDLE A LEAFW OR JP BRANCH IN THE STATE MACHINE:
+//
+// Extract a state-dependent digit from Index in a "constant" way, then jump to
+// common code for multiple cases.
+//
+// TBD:  Should this macro do more, such as preparing variable-shift masks for
+// use in CLEARLEASTDIGITS and SETLEASTDIGITS?
+
+#define	SMPREPB(cDigits,Next,PossFullJP1,PossFullJP2,PossFullJP3)	\
+	digits	 = (cDigits);						\
+	digit	 = JU_DIGITATSTATE(Index, cDigits);			\
+	pop0mask = cJU_POP0MASK((cDigits) - 1);	 /* for branchs JPs */	\
+	possfullJP1 = (PossFullJP1);					\
+	possfullJP2 = (PossFullJP2);					\
+	possfullJP3 = (PossFullJP3);					\
+	goto Next
+
+// Variations for specific-level branches and for shorthands:
+//
+// Note:  SMPREPB2 need not initialize possfullJP* because JPFULL does not use
+// them for digits == 2, but gcc -Wall isnt quite smart enough to see this, so
+// waste a bit of time and space to get rid of the warning:
+
+#define	SMPREPB2(Next)				\
+	digits	 = 2;				\
+	digit	 = JU_DIGITATSTATE(Index, 2);	\
+	pop0mask = cJU_POP0MASK(1);  /* for branchs JPs */ \
+	possfullJP1 = possfullJP2 = possfullJP3 = 0;	    \
+	goto Next
+
+#define	SMPREPB3(Next) SMPREPB(3,	      Next, cJU_JPBRANCH_L2, \
+						    cJU_JPBRANCH_B2, \
+						    cJU_JPBRANCH_U2)
+#ifndef JU_64BIT
+#define	SMPREPBL(Next) SMPREPB(cJU_ROOTSTATE, Next, cJU_JPBRANCH_L3, \
+						    cJU_JPBRANCH_B3, \
+						    cJU_JPBRANCH_U3)
+#else
+#define	SMPREPB4(Next) SMPREPB(4,	      Next, cJU_JPBRANCH_L3, \
+						    cJU_JPBRANCH_B3, \
+						    cJU_JPBRANCH_U3)
+#define	SMPREPB5(Next) SMPREPB(5,	      Next, cJU_JPBRANCH_L4, \
+						    cJU_JPBRANCH_B4, \
+						    cJU_JPBRANCH_U4)
+#define	SMPREPB6(Next) SMPREPB(6,	      Next, cJU_JPBRANCH_L5, \
+						    cJU_JPBRANCH_B5, \
+						    cJU_JPBRANCH_U5)
+#define	SMPREPB7(Next) SMPREPB(7,	      Next, cJU_JPBRANCH_L6, \
+						    cJU_JPBRANCH_B6, \
+						    cJU_JPBRANCH_U6)
+#define	SMPREPBL(Next) SMPREPB(cJU_ROOTSTATE, Next, cJU_JPBRANCH_L7, \
+						    cJU_JPBRANCH_B7, \
+						    cJU_JPBRANCH_U7)
+#endif
+
+
+// RESTART AFTER SECONDARY DEAD END:
+//
+// Set Index to the first/last index in the branch or leaf subexpanse and start
+// over at the top of the tree.
+
+#ifdef JUDYPREV
+#define	SMRESTART(Digits) { CLEARLEASTDIGITS(Digits); goto SMGetRestart; }
+#else
+#define	SMRESTART(Digits) { SETLEASTDIGITS(  Digits); goto SMGetRestart; }
+#endif
+
+
+// CHECK EDGE OF LEAFS EXPANSE:
+//
+// Given the LSBs of the lowest/highest valid index in a leaf (or equivalently
+// in an immediate JP), the level (index size) of the leaf, and the full index
+// to return (as Index in the context) already set to the full index matching
+// the lowest/highest one, determine if there is an empty index in the leafs
+// expanse below/above the lowest/highest index, which is true if the
+// lowest/highest index is not at the "edge" of the leafs expanse based on its
+// LSBs.  If so, return Index decremented/incremented; otherwise restart at the
+// top of the tree.
+//
+// Note:  In many cases Index is already at the right spot and calling
+// SMRESTART instead of just going directly to SMGetRestart is a bit of
+// overkill.
+//
+// Note:  Variable shift occurs if Digits is not a constant.
+
+#ifdef JUDYPREV
+#define	LEAF_EDGE(MinIndex,Digits)			\
+	{						\
+	    if (MinIndex) { --Index; RET_SUCCESS; }	\
+	    SMRESTART(Digits);				\
+	}
+#else
+#define	LEAF_EDGE(MaxIndex,Digits)			\
+	{						\
+	    if ((MaxIndex) != JU_LEASTBYTES(cJU_ALLONES, Digits)) \
+	    { ++Index; RET_SUCCESS; }			\
+	    SMRESTART(Digits);				\
+	}
+#endif
+
+// Same as above except Index is not already set to match the lowest/highest
+// index, so do that before decrementing/incrementing it:
+
+#ifdef JUDYPREV
+#define	LEAF_EDGE_SET(MinIndex,Digits)	\
+	{				\
+	    if (MinIndex)		\
+	    { JU_SETDIGITS(Index, MinIndex, Digits); --Index; RET_SUCCESS; } \
+	    SMRESTART(Digits);		\
+	}
+#else
+#define	LEAF_EDGE_SET(MaxIndex,Digits)	\
+	{				\
+	    if ((MaxIndex) != JU_LEASTBYTES(cJU_ALLONES, Digits))	    \
+	    { JU_SETDIGITS(Index, MaxIndex, Digits); ++Index; RET_SUCCESS; } \
+	    SMRESTART(Digits);		\
+	}
+#endif
+
+
+// FIND A HOLE (EMPTY INDEX) IN AN IMMEDIATE OR LEAF:
+//
+// Given an index location in a leaf (or equivalently an immediate JP) known to
+// contain a usable hole (an empty index less/greater than Index), and the LSBs
+// of a minimum/maximum index to locate, find the previous/next empty index and
+// return it.
+//
+// Note:  "Even" index sizes (1,2,4[,8] bytes) have corresponding native C
+// types; "odd" index sizes dont, but they are not represented here because
+// they are handled completely differently; see elsewhere.
+
+#ifdef JUDYPREV
+
+#define	LEAF_HOLE_EVEN(cDigits,Pjll,IndexLSB)				\
+	{								\
+	    while (*(Pjll) > (IndexLSB)) --(Pjll); /* too high */	\
+	    if (*(Pjll) < (IndexLSB)) RET_SUCCESS  /* Index is empty */	\
+	    while (*(--(Pjll)) == --(IndexLSB)) /* null, find a hole */;\
+	    JU_SETDIGITS(Index, IndexLSB, cDigits);			\
+	    RET_SUCCESS;						\
+	}
+#else
+#define	LEAF_HOLE_EVEN(cDigits,Pjll,IndexLSB)				\
+	{								\
+	    while (*(Pjll) < (IndexLSB)) ++(Pjll); /* too low */	\
+	    if (*(Pjll) > (IndexLSB)) RET_SUCCESS  /* Index is empty */	\
+	    while (*(++(Pjll)) == ++(IndexLSB)) /* null, find a hole */;\
+	    JU_SETDIGITS(Index, IndexLSB, cDigits);			\
+	    RET_SUCCESS;						\
+	}
+#endif
+
+
+// SEARCH FOR AN EMPTY INDEX IN AN IMMEDIATE OR LEAF:
+//
+// Given a pointer to the first index in a leaf (or equivalently an immediate
+// JP), the population of the leaf, and a first empty Index to find (inclusive,
+// as Index in the context), where Index is known to fall within the expanse of
+// the leaf to search, efficiently find the previous/next empty index in the
+// leaf, if any.  For simplicity the following overview is stated in terms of
+// Judy*NextEmpty() only, but the same concepts apply symmetrically for
+// Judy*PrevEmpty().  Also, in each case the comparisons are for the LSBs of
+// Index and leaf indexes, according to the leafs level.
+//
+// 1.  If Index is GREATER than the last (highest) index in the leaf
+//     (maxindex), return success, Index is empty.  (Remember, Index is known
+//     to be in the leafs expanse.)
+//
+// 2.  If Index is EQUAL to maxindex:  If maxindex is not at the edge of the
+//     leafs expanse, increment Index and return success, there is an empty
+//     Index one higher than any in the leaf; otherwise restart with Index
+//     reset to the upper edge of the leafs expanse.  Note:  This might cause
+//     an extra cache line fill, but this is OK for repeatedly-called search
+//     code, and it saves CPU time.
+//
+// 3.  If Index is LESS than maxindex, check for "dense to end of leaf":
+//     Subtract Index from maxindex, and back up that many slots in the leaf.
+//     If the resulting offset is not before the start of the leaf then compare
+//     the index at this offset (baseindex) with Index:
+//
+// 3a.  If GREATER, the leaf must be corrupt, since indexes are sorted and
+//      there are no duplicates.
+//
+// 3b.  If EQUAL, the leaf is "dense" from Index to maxindex, meaning there is
+//      no reason to search it.  "Slide right" to the high end of the leaf
+//      (modify Index to maxindex) and continue with step 2 above.
+//
+// 3c.  If LESS, continue with step 4.
+//
+// 4.  If the offset based on maxindex minus Index falls BEFORE the start of
+//     the leaf, or if, per 3c above, baseindex is LESS than Index, the leaf is
+//     guaranteed "not dense to the end" and a usable empty Index must exist.
+//     This supports a more efficient search loop.  Start at the FIRST index in
+//     the leaf, or one BEYOND baseindex, respectively, and search the leaf as
+//     follows, comparing each current index (currindex) with Index:
+//
+// 4a.  If LESS, keep going to next index.  Note:  This is certain to terminate
+//      because maxindex is known to be greater than Index, hence the loop can
+//      be small and fast.
+//
+// 4b.  If EQUAL, loop and increment Index until finding currindex greater than
+//      Index, and return success with the modified Index.
+//
+// 4c.  If GREATER, return success, Index (unmodified) is empty.
+//
+// Note:  These are macros rather than functions for speed.
+
+#ifdef JUDYPREV
+
+#define	JSLE_EVEN(Addr,Pop0,cDigits,LeafType)				\
+	{								\
+	    LeafType * PjllLSB  = (LeafType *) (Addr);			\
+	    LeafType   IndexLSB = Index;	/* auto-masking */	\
+									\
+	/* Index before or at start of leaf: */				\
+									\
+	    if (*PjllLSB >= IndexLSB)		/* no need to search */	\
+	    {								\
+		if (*PjllLSB > IndexLSB) RET_SUCCESS; /* Index empty */	\
+		LEAF_EDGE(*PjllLSB, cDigits);				\
+	    }								\
+									\
+	/* Index in or after leaf: */					\
+									\
+	    offset = IndexLSB - *PjllLSB;	/* tentative offset  */	\
+	    if (offset <= (Pop0))		/* can check density */	\
+	    {								\
+		PjllLSB += offset;		/* move to slot */	\
+									\
+		if (*PjllLSB <= IndexLSB)	/* dense or corrupt */	\
+		{							\
+		    if (*PjllLSB == IndexLSB)	/* dense, check edge */	\
+			LEAF_EDGE_SET(PjllLSB[-offset], cDigits);	\
+		    RET_CORRUPT;					\
+		}							\
+		--PjllLSB;	/* not dense, start at previous */	\
+	    }								\
+	    else PjllLSB = ((LeafType *) (Addr)) + (Pop0); /* start at max */ \
+									\
+	    LEAF_HOLE_EVEN(cDigits, PjllLSB, IndexLSB);			\
+	}
+
+// JSLE_ODD is completely different from JSLE_EVEN because its important to
+// minimize copying odd indexes to compare them (see 4.14).  Furthermore, a
+// very complex version (4.17, but abandoned before fully debugged) that
+// avoided calling j__udySearchLeaf*() ran twice as fast as 4.14, but still
+// half as fast as SearchValid.  Doug suggested that to minimize complexity and
+// share common code we should use j__udySearchLeaf*() for the initial search
+// to establish if Index is empty, which should be common.  If Index is valid
+// in a leaf or immediate indexes, odds are good that an empty Index is nearby,
+// so for simplicity just use a *COPY* function to linearly search the
+// remainder.
+//
+// TBD:  Pathological case?  Average performance should be good, but worst-case
+// might suffer.  When Search says the initial Index is valid, so a linear
+// copy-and-compare is begun, if the caller builds fairly large leaves with
+// dense clusters AND frequently does a SearchEmpty at one end of such a
+// cluster, performance wont be very good.  Might a dense-check help?  This
+// means checking offset against the index at offset, and then against the
+// first/last index in the leaf.  We doubt the pathological case will appear
+// much in real applications because they will probably alternate SearchValid
+// and SearchEmpty calls.
+
+#define	JSLE_ODD(cDigits,Pjll,Pop0,Search,Copy)				\
+	{								\
+	    Word_t IndexLSB;		/* least bytes only */		\
+	    Word_t IndexFound;		/* in leaf	    */		\
+									\
+	    if ((offset = Search(Pjll, (Pop0) + 1, Index)) < 0)		\
+		RET_SUCCESS;		/* Index is empty */		\
+									\
+	    IndexLSB = JU_LEASTBYTES(Index, cDigits);			\
+	    offset  *= (cDigits);					\
+									\
+	    while ((offset -= (cDigits)) >= 0)				\
+	    {				/* skip until empty or start */	\
+		Copy(IndexFound, ((uint8_t *) (Pjll)) + offset);	\
+		if (IndexFound != (--IndexLSB))	/* found an empty */	\
+		{ JU_SETDIGITS(Index, IndexLSB, cDigits); RET_SUCCESS; }\
+	    }								\
+	    LEAF_EDGE_SET(IndexLSB, cDigits);				\
+	}
+
+#else // JUDYNEXT
+
+#define	JSLE_EVEN(Addr,Pop0,cDigits,LeafType)				\
+	{								\
+	    LeafType * PjllLSB   = ((LeafType *) (Addr)) + (Pop0);	\
+	    LeafType   IndexLSB = Index;	/* auto-masking */	\
+									\
+	/* Index at or after end of leaf: */				\
+									\
+	    if (*PjllLSB <= IndexLSB)		/* no need to search */	\
+	    {								\
+		if (*PjllLSB < IndexLSB) RET_SUCCESS;  /* Index empty */\
+		LEAF_EDGE(*PjllLSB, cDigits);				\
+	    }								\
+									\
+	/* Index before or in leaf: */					\
+									\
+	    offset = *PjllLSB - IndexLSB;	/* tentative offset  */	\
+	    if (offset <= (Pop0))		/* can check density */	\
+	    {								\
+		PjllLSB -= offset;		/* move to slot */	\
+									\
+		if (*PjllLSB >= IndexLSB)	/* dense or corrupt */	\
+		{							\
+		    if (*PjllLSB == IndexLSB)	/* dense, check edge */	\
+			LEAF_EDGE_SET(PjllLSB[offset], cDigits);	\
+		    RET_CORRUPT;					\
+		}							\
+		++PjllLSB;		/* not dense, start at next */	\
+	    }								\
+	    else PjllLSB = (LeafType *) (Addr);	/* start at minimum */	\
+									\
+	    LEAF_HOLE_EVEN(cDigits, PjllLSB, IndexLSB);			\
+	}
+
+#define	JSLE_ODD(cDigits,Pjll,Pop0,Search,Copy)				\
+	{								\
+	    Word_t IndexLSB;		/* least bytes only */		\
+	    Word_t IndexFound;		/* in leaf	    */		\
+	    int	   offsetmax;		/* in bytes	    */		\
+									\
+	    if ((offset = Search(Pjll, (Pop0) + 1, Index)) < 0)		\
+		RET_SUCCESS;			/* Index is empty */	\
+									\
+	    IndexLSB  = JU_LEASTBYTES(Index, cDigits);			\
+	    offset   *= (cDigits);					\
+	    offsetmax = (Pop0) * (cDigits);	/* single multiply */	\
+									\
+	    while ((offset += (cDigits)) <= offsetmax)			\
+	    {				/* skip until empty or end */	\
+		Copy(IndexFound, ((uint8_t *) (Pjll)) + offset);	\
+		if (IndexFound != (++IndexLSB))	/* found an empty */	\
+		{ JU_SETDIGITS(Index, IndexLSB, cDigits); RET_SUCCESS; } \
+	    }								\
+	    LEAF_EDGE_SET(IndexLSB, cDigits);				\
+	}
+
+#endif // JUDYNEXT
+
+// Note:  Immediate indexes never fill a single index group, so for odd index
+// sizes, save time by calling JSLE_ODD_IMM instead of JSLE_ODD.
+
+#define	j__udySearchLeafEmpty1(Addr,Pop0) \
+	JSLE_EVEN(Addr, Pop0, 1, uint8_t)
+
+#define	j__udySearchLeafEmpty2(Addr,Pop0) \
+	JSLE_EVEN(Addr, Pop0, 2, uint16_t)
+
+#define	j__udySearchLeafEmpty3(Addr,Pop0) \
+	JSLE_ODD(3, Addr, Pop0, j__udySearchLeaf3, JU_COPY3_PINDEX_TO_LONG)
+
+#ifndef JU_64BIT
+
+#define	j__udySearchLeafEmptyL(Addr,Pop0) \
+	JSLE_EVEN(Addr, Pop0, 4, Word_t)
+
+#else
+
+#define	j__udySearchLeafEmpty4(Addr,Pop0) \
+	JSLE_EVEN(Addr, Pop0, 4, uint32_t)
+
+#define	j__udySearchLeafEmpty5(Addr,Pop0) \
+	JSLE_ODD(5, Addr, Pop0, j__udySearchLeaf5, JU_COPY5_PINDEX_TO_LONG)
+
+#define	j__udySearchLeafEmpty6(Addr,Pop0) \
+	JSLE_ODD(6, Addr, Pop0, j__udySearchLeaf6, JU_COPY6_PINDEX_TO_LONG)
+
+#define	j__udySearchLeafEmpty7(Addr,Pop0) \
+	JSLE_ODD(7, Addr, Pop0, j__udySearchLeaf7, JU_COPY7_PINDEX_TO_LONG)
+
+#define	j__udySearchLeafEmptyL(Addr,Pop0) \
+	JSLE_EVEN(Addr, Pop0, 8, Word_t)
+
+#endif // JU_64BIT
+
+
+// ----------------------------------------------------------------------------
+// START OF CODE:
+//
+// CHECK FOR SHORTCUTS:
+//
+// Error out if PIndex is null.
+
+	if (PIndex == (PWord_t) NULL)
+	{
+	    JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+	    return(JERRI);
+	}
+
+	Index = *PIndex;			// fast local copy.
+
+// Set and pre-decrement/increment Index, watching for underflow/overflow:
+//
+// An out-of-bounds Index means failure:  No previous/next empty index.
+
+SMGetRestart:		// return here with revised Index.
+
+#ifdef JUDYPREV
+	if (Index-- == 0) return(0);
+#else
+	if (++Index == 0) return(0);
+#endif
+
+// An empty array with an in-bounds (not underflowed/overflowed) Index means
+// success:
+//
+// Note:  This check is redundant after restarting at SMGetRestart, but should
+// take insignificant time.
+
+	if (PArray == (Pvoid_t) NULL) RET_SUCCESS;
+
+// ----------------------------------------------------------------------------
+// ROOT-LEVEL LEAF that starts with a Pop0 word; just look within the leaf:
+//
+// If Index is not in the leaf, return success; otherwise return the first
+// empty Index, if any, below/above where it would belong.
+
+	if (JU_LEAFW_POP0(PArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
+	{
+	    Pjlw_t Pjlw = P_JLW(PArray);	// first word of leaf.
+	    pop0 = Pjlw[0];
+
+#ifdef	JUDY1
+	    if (pop0 == 0)			// special case.
+	    {
+#ifdef JUDYPREV
+		if ((Index != Pjlw[1]) || (Index-- != 0)) RET_SUCCESS;
+#else
+		if ((Index != Pjlw[1]) || (++Index != 0)) RET_SUCCESS;
+#endif
+		return(0);		// no previous/next empty index.
+	    }
+#endif // JUDY1
+
+	    j__udySearchLeafEmptyL(Pjlw + 1, pop0);
+
+//  No return -- thanks ALAN
+
+	}
+	else
+
+// ----------------------------------------------------------------------------
+// HANDLE JRP Branch:
+//
+// For JRP branches, traverse the JPM; handle LEAFW
+// directly; but look for the most common cases first.
+
+	{
+	    Pjpm_t Pjpm = P_JPM(PArray);
+	    Pjp = &(Pjpm->jpm_JP);
+
+//	    goto SMGetContinue;
+	}
+
+
+// ============================================================================
+// STATE MACHINE -- GET INDEX:
+//
+// Search for Index (already decremented/incremented so as to be an inclusive
+// search).  If not found (empty index), return success.  Otherwise do a
+// previous/next search, and if successful modify Index to the empty index
+// found.  See function header comments.
+//
+// ENTRY:  Pjp points to next JP to interpret, whose Decode bytes have not yet
+// been checked.
+//
+// Note:  Check Decode bytes at the start of each loop, not after looking up a
+// new JP, so its easy to do constant shifts/masks.
+//
+// EXIT:  Return, or branch to SMGetRestart with modified Index, or branch to
+// SMGetContinue with a modified Pjp, as described elsewhere.
+//
+// WARNING:  For run-time efficiency the following cases replicate code with
+// varying constants, rather than using common code with variable values!
+
+SMGetContinue:			// return here for next branch/leaf.
+
+#ifdef TRACEJPSE
+	JudyPrintJP(Pjp, "sf", __LINE__);
+#endif
+
+	switch (JU_JPTYPE(Pjp))
+	{
+
+
+// ----------------------------------------------------------------------------
+// LINEAR BRANCH:
+//
+// Check Decode bytes, if any, in the current JP, then search for a JP for the
+// next digit in Index.
+
+	case cJU_JPBRANCH_L2: CHECKDCD(2); SMPREPB2(SMBranchL);
+	case cJU_JPBRANCH_L3: CHECKDCD(3); SMPREPB3(SMBranchL);
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_L4: CHECKDCD(4); SMPREPB4(SMBranchL);
+	case cJU_JPBRANCH_L5: CHECKDCD(5); SMPREPB5(SMBranchL);
+	case cJU_JPBRANCH_L6: CHECKDCD(6); SMPREPB6(SMBranchL);
+	case cJU_JPBRANCH_L7: CHECKDCD(7); SMPREPB7(SMBranchL);
+#endif
+	case cJU_JPBRANCH_L:		   SMPREPBL(SMBranchL);
+
+// Common code (state-independent) for all cases of linear branches:
+
+SMBranchL:
+	    Pjbl = P_JBL(Pjp->jp_Addr);
+
+// First, check if Indexs expanse (digit) is below/above the first/last
+// populated expanse in the BranchL, in which case Index is empty; otherwise
+// find the offset of the lowest/highest populated expanse at or above/below
+// digit, if any:
+//
+// Note:  The for-loop is guaranteed to exit eventually because the first/last
+// expanse is known to be a terminator.
+//
+// Note:  Cannot use j__udySearchLeaf*Empty1() here because it only applies to
+// leaves and does not know about partial versus full JPs, unlike the use of
+// j__udySearchLeaf1() for BranchLs in SearchValid code.  Also, since linear
+// leaf expanse lists are small, dont waste time calling j__udySearchLeaf1(),
+// just scan the expanse list.
+
+#ifdef JUDYPREV
+	    if ((Pjbl->jbl_Expanse[0]) > digit) RET_SUCCESS;
+
+	    for (offset = (Pjbl->jbl_NumJPs) - 1; /* null */; --offset)
+#else
+	    if ((Pjbl->jbl_Expanse[(Pjbl->jbl_NumJPs) - 1]) < digit)
+		RET_SUCCESS;
+
+	    for (offset = 0; /* null */; ++offset)
+#endif
+	    {
+
+// Too low/high, keep going; or too high/low, meaning the loop passed a hole
+// and the initial Index is empty:
+
+#ifdef JUDYPREV
+		if ((Pjbl->jbl_Expanse[offset]) > digit) continue;
+		if ((Pjbl->jbl_Expanse[offset]) < digit) RET_SUCCESS;
+#else
+		if ((Pjbl->jbl_Expanse[offset]) < digit) continue;
+		if ((Pjbl->jbl_Expanse[offset]) > digit) RET_SUCCESS;
+#endif
+
+// Found expanse matching digit; if its not full, traverse through it:
+
+		if (! JPFULL((Pjbl->jbl_jp) + offset))
+		{
+		    Pjp = (Pjbl->jbl_jp) + offset;
+		    goto SMGetContinue;
+		}
+
+// Common code:  While searching for a lower/higher hole or a non-full JP, upon
+// finding a lower/higher hole, adjust Index using the revised digit and
+// return; or upon finding a consecutive lower/higher expanse, if the expanses
+// JP is non-full, modify Index and traverse through the JP:
+
+#define	BRANCHL_CHECK(OpIncDec,OpLeastDigits,Digit,Digits)	\
+	{							\
+	    if ((Pjbl->jbl_Expanse[offset]) != OpIncDec digit)	\
+		SET_AND_RETURN(OpLeastDigits, Digit, Digits);	\
+								\
+	    if (! JPFULL((Pjbl->jbl_jp) + offset))		\
+	    {							\
+		Pjp = (Pjbl->jbl_jp) + offset;			\
+		SET_AND_CONTINUE(OpLeastDigits, Digit, Digits);	\
+	    }							\
+	}
+
+// BranchL primary dead end:  Expanse matching Index/digit is full (rare except
+// for dense/sequential indexes):
+//
+// Search for a lower/higher hole, a non-full JP, or the end of the expanse
+// list, while decrementing/incrementing digit.
+
+#ifdef JUDYPREV
+		while (--offset >= 0)
+		    BRANCHL_CHECK(--, SETLEASTDIGITS_D, digit, digits)
+#else
+		while (++offset < Pjbl->jbl_NumJPs)
+		    BRANCHL_CHECK(++, CLEARLEASTDIGITS_D, digit, digits)
+#endif
+
+// Passed end of BranchL expanse list after finding a matching but full
+// expanse:
+//
+// Digit now matches the lowest/highest expanse, which is a full expanse; if
+// digit is at the end of BranchLs expanse (no hole before/after), break out
+// of the loop; otherwise modify Index to the next lower/higher digit and
+// return success:
+
+#ifdef JUDYPREV
+		if (digit == 0) break;
+		--digit; SET_AND_RETURN(SETLEASTDIGITS_D, digit, digits);
+#else
+		if (digit == JU_LEASTBYTES(cJU_ALLONES, 1)) break;
+		++digit; SET_AND_RETURN(CLEARLEASTDIGITS_D, digit, digits);
+#endif
+	    } // for-loop
+
+// BranchL secondary dead end, no non-full previous/next JP:
+
+	    SMRESTART(digits);
+
+
+// ----------------------------------------------------------------------------
+// BITMAP BRANCH:
+//
+// Check Decode bytes, if any, in the current JP, then search for a JP for the
+// next digit in Index.
+
+	case cJU_JPBRANCH_B2: CHECKDCD(2); SMPREPB2(SMBranchB);
+	case cJU_JPBRANCH_B3: CHECKDCD(3); SMPREPB3(SMBranchB);
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_B4: CHECKDCD(4); SMPREPB4(SMBranchB);
+	case cJU_JPBRANCH_B5: CHECKDCD(5); SMPREPB5(SMBranchB);
+	case cJU_JPBRANCH_B6: CHECKDCD(6); SMPREPB6(SMBranchB);
+	case cJU_JPBRANCH_B7: CHECKDCD(7); SMPREPB7(SMBranchB);
+#endif
+	case cJU_JPBRANCH_B:		   SMPREPBL(SMBranchB);
+
+// Common code (state-independent) for all cases of bitmap branches:
+
+SMBranchB:
+	    Pjbb = P_JBB(Pjp->jp_Addr);
+
+// Locate the digits JP in the subexpanse list, if present:
+
+	    subexp     = digit / cJU_BITSPERSUBEXPB;
+	    assert(subexp < cJU_NUMSUBEXPB);	// falls in expected range.
+	    bitposmaskB = JU_BITPOSMASKB(digit);
+
+// Absent JP = no JP matches current digit in Index:
+
+//	    if (! JU_BITMAPTESTB(Pjbb, digit))			// slower.
+	    if (! (JU_JBB_BITMAP(Pjbb, subexp) & bitposmaskB))	// faster.
+		RET_SUCCESS;
+
+// Non-full JP matches current digit in Index:
+//
+// Iterate to the subsidiary non-full JP.
+
+	    offset = SEARCHBITMAPB(JU_JBB_BITMAP(Pjbb, subexp), digit,
+				   bitposmaskB);
+	    // not negative since at least one bit is set:
+	    assert(offset >= 0);
+	    assert(offset < (int) cJU_BITSPERSUBEXPB);
+
+// Watch for null JP subarray pointer with non-null bitmap (a corruption):
+
+	    if ((Pjp = P_JP(JU_JBB_PJP(Pjbb, subexp)))
+	     == (Pjp_t) NULL) RET_CORRUPT;
+
+	    Pjp += offset;
+	    if (! JPFULL(Pjp)) goto SMGetContinue;
+
+// BranchB primary dead end:
+//
+// Upon hitting a full JP in a BranchB for the next digit in Index, search
+// sideways for a previous/next absent JP (unset bit) or non-full JP (set bit
+// with non-full JP); first in the current bitmap subexpanse, then in
+// lower/higher subexpanses.  Upon entry, Pjp points to a known-unusable JP,
+// ready to decrement/increment.
+//
+// Note:  The preceding code is separate from this loop because Index does not
+// need revising (see SET_AND_*()) if the initial index is an empty index.
+//
+// TBD:  For speed, shift bitposmaskB instead of using JU_BITMAPTESTB or
+// JU_BITPOSMASKB, but this shift has knowledge of bit order that really should
+// be encapsulated in a header file.
+
+#define	BRANCHB_CHECKBIT(OpLeastDigits)					\
+    if (! (JU_JBB_BITMAP(Pjbb, subexp) & bitposmaskB))  /* absent JP */	\
+	SET_AND_RETURN(OpLeastDigits, digit, digits)
+
+#define	BRANCHB_CHECKJPFULL(OpLeastDigits)				\
+    if (! JPFULL(Pjp))							\
+	SET_AND_CONTINUE(OpLeastDigits, digit, digits)
+
+#define	BRANCHB_STARTSUBEXP(OpLeastDigits)				\
+    if (! JU_JBB_BITMAP(Pjbb, subexp)) /* empty subexpanse, shortcut */ \
+	SET_AND_RETURN(OpLeastDigits, digit, digits)			\
+    if ((Pjp = P_JP(JU_JBB_PJP(Pjbb, subexp))) == (Pjp_t) NULL) RET_CORRUPT
+
+#ifdef JUDYPREV
+
+	    --digit;				// skip initial digit.
+	    bitposmaskB >>= 1;			// see TBD above.
+
+BranchBNextSubexp:	// return here to check next bitmap subexpanse.
+
+	    while (bitposmaskB)			// more bits to check in subexp.
+	    {
+		BRANCHB_CHECKBIT(SETLEASTDIGITS_D);
+		--Pjp;				// previous in subarray.
+		BRANCHB_CHECKJPFULL(SETLEASTDIGITS_D);
+		assert(digit >= 0);
+		--digit;
+		bitposmaskB >>= 1;
+	    }
+
+	    if (subexp-- > 0)			// more subexpanses.
+	    {
+		BRANCHB_STARTSUBEXP(SETLEASTDIGITS_D);
+		Pjp += SEARCHBITMAPMAXB(JU_JBB_BITMAP(Pjbb, subexp)) + 1;
+		bitposmaskB = (1U << (cJU_BITSPERSUBEXPB - 1));
+		goto BranchBNextSubexp;
+	    }
+
+#else // JUDYNEXT
+
+	    ++digit;				// skip initial digit.
+	    bitposmaskB <<= 1;			// note:  BITMAPB_t.
+
+BranchBNextSubexp:	// return here to check next bitmap subexpanse.
+
+	    while (bitposmaskB)			// more bits to check in subexp.
+	    {
+		BRANCHB_CHECKBIT(CLEARLEASTDIGITS_D);
+		++Pjp;				// previous in subarray.
+		BRANCHB_CHECKJPFULL(CLEARLEASTDIGITS_D);
+		assert(digit < cJU_SUBEXPPERSTATE);
+		++digit;
+		bitposmaskB <<= 1;		// note:  BITMAPB_t.
+	    }
+
+	    if (++subexp < cJU_NUMSUBEXPB)	// more subexpanses.
+	    {
+		BRANCHB_STARTSUBEXP(CLEARLEASTDIGITS_D);
+		--Pjp;				// pre-decrement.
+		bitposmaskB = 1;
+		goto BranchBNextSubexp;
+	    }
+
+#endif // JUDYNEXT
+
+// BranchB secondary dead end, no non-full previous/next JP:
+
+	    SMRESTART(digits);
+
+
+// ----------------------------------------------------------------------------
+// UNCOMPRESSED BRANCH:
+//
+// Check Decode bytes, if any, in the current JP, then search for a JP for the
+// next digit in Index.
+
+	case cJU_JPBRANCH_U2: CHECKDCD(2); SMPREPB2(SMBranchU);
+	case cJU_JPBRANCH_U3: CHECKDCD(3); SMPREPB3(SMBranchU);
+#ifdef JU_64BIT
+	case cJU_JPBRANCH_U4: CHECKDCD(4); SMPREPB4(SMBranchU);
+	case cJU_JPBRANCH_U5: CHECKDCD(5); SMPREPB5(SMBranchU);
+	case cJU_JPBRANCH_U6: CHECKDCD(6); SMPREPB6(SMBranchU);
+	case cJU_JPBRANCH_U7: CHECKDCD(7); SMPREPB7(SMBranchU);
+#endif
+	case cJU_JPBRANCH_U:		   SMPREPBL(SMBranchU);
+
+// Common code (state-independent) for all cases of uncompressed branches:
+
+SMBranchU:
+	    Pjbu = P_JBU(Pjp->jp_Addr);
+	    Pjp	 = (Pjbu->jbu_jp) + digit;
+
+// Absent JP = null JP for current digit in Index:
+
+	    if (JPNULL(JU_JPTYPE(Pjp))) RET_SUCCESS;
+
+// Non-full JP matches current digit in Index:
+//
+// Iterate to the subsidiary JP.
+
+	    if (! JPFULL(Pjp)) goto SMGetContinue;
+
+// BranchU primary dead end:
+//
+// Upon hitting a full JP in a BranchU for the next digit in Index, search
+// sideways for a previous/next null or non-full JP.  BRANCHU_CHECKJP() is
+// shorthand for common code.
+//
+// Note:  The preceding code is separate from this loop because Index does not
+// need revising (see SET_AND_*()) if the initial index is an empty index.
+
+#define	BRANCHU_CHECKJP(OpIncDec,OpLeastDigits)			\
+	{							\
+	    OpIncDec Pjp;					\
+								\
+	    if (JPNULL(JU_JPTYPE(Pjp)))				\
+		SET_AND_RETURN(OpLeastDigits, digit, digits)	\
+								\
+	    if (! JPFULL(Pjp))					\
+		SET_AND_CONTINUE(OpLeastDigits, digit, digits)	\
+	}
+
+#ifdef JUDYPREV
+	    while (digit-- > 0)
+		BRANCHU_CHECKJP(--, SETLEASTDIGITS_D);
+#else
+	    while (++digit < cJU_BRANCHUNUMJPS)
+		BRANCHU_CHECKJP(++, CLEARLEASTDIGITS_D);
+#endif
+
+// BranchU secondary dead end, no non-full previous/next JP:
+
+	    SMRESTART(digits);
+
+
+// ----------------------------------------------------------------------------
+// LINEAR LEAF:
+//
+// Check Decode bytes, if any, in the current JP, then search the leaf for the
+// previous/next empty index starting at Index.  Primary leaf dead end is
+// hidden within j__udySearchLeaf*Empty*().  In case of secondary leaf dead
+// end, restart at the top of the tree.
+//
+// Note:  Pword is the name known to GET*; think of it as Pjlw.
+
+#define	SMLEAFL(cDigits,Func)                   \
+	Pword = (PWord_t) P_JLW(Pjp->jp_Addr);  \
+	pop0  = JU_JPLEAF_POP0(Pjp);            \
+	Func(Pword, pop0)
+
+#if (defined(JUDYL) || (! defined(JU_64BIT)))
+	case cJU_JPLEAF1:  CHECKDCD(1); SMLEAFL(1, j__udySearchLeafEmpty1);
+#endif
+	case cJU_JPLEAF2:  CHECKDCD(2); SMLEAFL(2, j__udySearchLeafEmpty2);
+	case cJU_JPLEAF3:  CHECKDCD(3); SMLEAFL(3, j__udySearchLeafEmpty3);
+
+#ifdef JU_64BIT
+	case cJU_JPLEAF4:  CHECKDCD(4); SMLEAFL(4, j__udySearchLeafEmpty4);
+	case cJU_JPLEAF5:  CHECKDCD(5); SMLEAFL(5, j__udySearchLeafEmpty5);
+	case cJU_JPLEAF6:  CHECKDCD(6); SMLEAFL(6, j__udySearchLeafEmpty6);
+	case cJU_JPLEAF7:  CHECKDCD(7); SMLEAFL(7, j__udySearchLeafEmpty7);
+#endif
+
+
+// ----------------------------------------------------------------------------
+// BITMAP LEAF:
+//
+// Check Decode bytes, if any, in the current JP, then search the leaf for the
+// previous/next empty index starting at Index.
+
+	case cJU_JPLEAF_B1:
+
+	    CHECKDCD(1);
+
+	    Pjlb	= P_JLB(Pjp->jp_Addr);
+	    digit	= JU_DIGITATSTATE(Index, 1);
+	    subexp	= digit / cJU_BITSPERSUBEXPL;
+	    bitposmaskL	= JU_BITPOSMASKL(digit);
+	    assert(subexp < cJU_NUMSUBEXPL);	// falls in expected range.
+
+// Absent index = no index matches current digit in Index:
+
+//	    if (! JU_BITMAPTESTL(Pjlb, digit))			// slower.
+	    if (! (JU_JLB_BITMAP(Pjlb, subexp) & bitposmaskL))	// faster.
+		RET_SUCCESS;
+
+// LeafB1 primary dead end:
+//
+// Upon hitting a valid (non-empty) index in a LeafB1 for the last digit in
+// Index, search sideways for a previous/next absent index, first in the
+// current bitmap subexpanse, then in lower/higher subexpanses.
+// LEAFB1_CHECKBIT() is shorthand for common code to handle one bit in one
+// bitmap subexpanse.
+//
+// Note:  The preceding code is separate from this loop because Index does not
+// need revising (see SET_AND_*()) if the initial index is an empty index.
+//
+// TBD:  For speed, shift bitposmaskL instead of using JU_BITMAPTESTL or
+// JU_BITPOSMASKL, but this shift has knowledge of bit order that really should
+// be encapsulated in a header file.
+
+#define	LEAFB1_CHECKBIT(OpLeastDigits)				\
+	if (! (JU_JLB_BITMAP(Pjlb, subexp) & bitposmaskL))	\
+	    SET_AND_RETURN(OpLeastDigits, digit, 1)
+
+#define	LEAFB1_STARTSUBEXP(OpLeastDigits)			\
+	if (! JU_JLB_BITMAP(Pjlb, subexp)) /* empty subexp */	\
+	    SET_AND_RETURN(OpLeastDigits, digit, 1)
+
+#ifdef JUDYPREV
+
+	    --digit;				// skip initial digit.
+	    bitposmaskL >>= 1;			// see TBD above.
+
+LeafB1NextSubexp:	// return here to check next bitmap subexpanse.
+
+	    while (bitposmaskL)			// more bits to check in subexp.
+	    {
+		LEAFB1_CHECKBIT(SETLEASTDIGITS_D);
+		assert(digit >= 0);
+		--digit;
+		bitposmaskL >>= 1;
+	    }
+
+	    if (subexp-- > 0)		// more subexpanses.
+	    {
+		LEAFB1_STARTSUBEXP(SETLEASTDIGITS_D);
+		bitposmaskL = ((Word_t)1U << (cJU_BITSPERSUBEXPL - 1));
+		goto LeafB1NextSubexp;
+	    }
+
+#else // JUDYNEXT
+
+	    ++digit;				// skip initial digit.
+	    bitposmaskL <<= 1;			// note:  BITMAPL_t.
+
+LeafB1NextSubexp:	// return here to check next bitmap subexpanse.
+
+	    while (bitposmaskL)			// more bits to check in subexp.
+	    {
+		LEAFB1_CHECKBIT(CLEARLEASTDIGITS_D);
+		assert(digit < cJU_SUBEXPPERSTATE);
+		++digit;
+		bitposmaskL <<= 1;		// note:  BITMAPL_t.
+	    }
+
+	    if (++subexp < cJU_NUMSUBEXPL)	// more subexpanses.
+	    {
+		LEAFB1_STARTSUBEXP(CLEARLEASTDIGITS_D);
+		bitposmaskL = 1;
+		goto LeafB1NextSubexp;
+	    }
+
+#endif // JUDYNEXT
+
+// LeafB1 secondary dead end, no empty index:
+
+	    SMRESTART(1);
+
+
+#ifdef JUDY1
+// ----------------------------------------------------------------------------
+// FULL POPULATION:
+//
+// If the Decode bytes do not match, Index is empty (without modification);
+// otherwise restart.
+
+	case cJ1_JPFULLPOPU1:
+
+	    CHECKDCD(1);
+	    SMRESTART(1);
+#endif
+
+
+// ----------------------------------------------------------------------------
+// IMMEDIATE:
+//
+// Pop1 = 1 Immediate JPs:
+//
+// If Index is not in the immediate JP, return success; otherwise check if
+// there is an empty index below/above the immediate JPs index, and if so,
+// return success with modified Index, else restart.
+//
+// Note:  Doug says its fast enough to calculate the index size (digits) in
+// the following; no need to set it separately for each case.
+
+	case cJU_JPIMMED_1_01:
+	case cJU_JPIMMED_2_01:
+	case cJU_JPIMMED_3_01:
+#ifdef JU_64BIT
+	case cJU_JPIMMED_4_01:
+	case cJU_JPIMMED_5_01:
+	case cJU_JPIMMED_6_01:
+	case cJU_JPIMMED_7_01:
+#endif
+	    if (JU_JPDCDPOP0(Pjp) != JU_TRIMTODCDSIZE(Index)) RET_SUCCESS;
+	    digits = JU_JPTYPE(Pjp) - cJU_JPIMMED_1_01 + 1;
+	    LEAF_EDGE(JU_LEASTBYTES(JU_JPDCDPOP0(Pjp), digits), digits);
+
+// Immediate JPs with Pop1 > 1:
+
+#define	IMM_MULTI(Func,BaseJPType)			\
+	JUDY1CODE(Pword = (PWord_t) (Pjp->jp_1Index);)	\
+	JUDYLCODE(Pword = (PWord_t) (Pjp->jp_LIndex);)	\
+	Func(Pword, JU_JPTYPE(Pjp) - (BaseJPType) + 1)
+
+	case cJU_JPIMMED_1_02:
+	case cJU_JPIMMED_1_03:
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_1_04:
+	case cJU_JPIMMED_1_05:
+	case cJU_JPIMMED_1_06:
+	case cJU_JPIMMED_1_07:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_1_08:
+	case cJ1_JPIMMED_1_09:
+	case cJ1_JPIMMED_1_10:
+	case cJ1_JPIMMED_1_11:
+	case cJ1_JPIMMED_1_12:
+	case cJ1_JPIMMED_1_13:
+	case cJ1_JPIMMED_1_14:
+	case cJ1_JPIMMED_1_15:
+#endif
+	    IMM_MULTI(j__udySearchLeafEmpty1, cJU_JPIMMED_1_02);
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_2_02:
+	case cJU_JPIMMED_2_03:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_2_04:
+	case cJ1_JPIMMED_2_05:
+	case cJ1_JPIMMED_2_06:
+	case cJ1_JPIMMED_2_07:
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+	    IMM_MULTI(j__udySearchLeafEmpty2, cJU_JPIMMED_2_02);
+#endif
+
+#if (defined(JUDY1) || defined(JU_64BIT))
+	case cJU_JPIMMED_3_02:
+#endif
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_3_03:
+	case cJ1_JPIMMED_3_04:
+	case cJ1_JPIMMED_3_05:
+#endif
+#if (defined(JUDY1) || defined(JU_64BIT))
+	    IMM_MULTI(j__udySearchLeafEmpty3, cJU_JPIMMED_3_02);
+#endif
+
+#if (defined(JUDY1) && defined(JU_64BIT))
+	case cJ1_JPIMMED_4_02:
+	case cJ1_JPIMMED_4_03:
+	    IMM_MULTI(j__udySearchLeafEmpty4, cJ1_JPIMMED_4_02);
+
+	case cJ1_JPIMMED_5_02:
+	case cJ1_JPIMMED_5_03:
+	    IMM_MULTI(j__udySearchLeafEmpty5, cJ1_JPIMMED_5_02);
+
+	case cJ1_JPIMMED_6_02:
+	    IMM_MULTI(j__udySearchLeafEmpty6, cJ1_JPIMMED_6_02);
+
+	case cJ1_JPIMMED_7_02:
+	    IMM_MULTI(j__udySearchLeafEmpty7, cJ1_JPIMMED_7_02);
+#endif
+
+
+// ----------------------------------------------------------------------------
+// INVALID JP TYPE:
+
+	default: RET_CORRUPT;
+
+	} // SMGet switch.
+
+} // Judy1PrevEmpty() / Judy1NextEmpty() / JudyLPrevEmpty() / JudyLNextEmpty()
diff --git a/libs/klib/judy/JudyPrintJP.c b/libs/klib/judy/JudyPrintJP.c
new file mode 100644
index 0000000..3764da1
--- /dev/null
+++ b/libs/klib/judy/JudyPrintJP.c
@@ -0,0 +1,399 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// JudyPrintJP() debugging/tracing function for Judy1 or JudyL code.
+// The caller should #include this file, with its static function (replicated
+// in each compilation unit), in another *.c file, and compile with one of
+// -DJUDY1 or -DJUDYL.
+//
+// The caller can set j__udyIndex and/or j__udyPopulation non-zero to have
+// those values reported, and also to control trace-enabling (see below).
+//
+// Tracing is disabled by default unless one or both of two env parameters is
+// set (regardless of value).  If either value is set but null or evaluates to
+// zero, tracing is immediately enabled.  To disable tracing until a particular
+// j__udy*Index value is seen, set STARTINDEX=<hex-index> in the env.  To
+// disable it until a particular j__udy*Population value is seen, set
+// STARTPOP=<decimal-population> in the env.  Once either condition is met,
+// tracing "latches on".
+//
+// Example:
+//
+//      STARTPOP=0              // immediate tracing.
+//      STARTINDEX=f35430a8     // not until one of these is met.
+//      STARTPOP=1000000
+//
+// Note:  Trace-enabling does nothing unless the caller sets the appropriate
+// global variable non-zero.
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#include <stdlib.h>             // for getenv() and strtoul().
+
+
+// GLOBALS FROM CALLER:
+//
+// Note:  This storage is declared once in each compilation unit that includes
+// this file, but the linker should merge all cases into single locations, but
+// ONLY if these are uninitialized, so ASSUME they are 0 to start.
+
+Word_t j__udyIndex;             // current Index itself, optional from caller.
+Word_t j__udyPopulation;        // Indexes in array, optional from caller.
+
+// Other globals:
+
+static Word_t startindex = 0;           // see usage below.
+static Word_t startpop   = 0;
+static bool_t enabled    = FALSE;       // by default, unless env params set.
+
+// Shorthand for announcing JP addresses, Desc (in context), and JP types:
+//
+// Note:  Width is at least one blank wider than any JP type name, and the line
+// is left unfinished.
+//
+// Note:  Use a format for address printing compatible with other tracing
+// facilities; in particular, %x not %lx, to truncate the "noisy" high part on
+// 64-bit systems.
+
+#define JPTYPE(Type)  printf("0x%lx %s %-17s", (Word_t) Pjp, Desc, Type)
+
+// Shorthands for announcing expanse populations from DcdPopO fields:
+
+#define POP0 printf("Pop1 = 0 ")
+#define POP1 printf("Pop1 = %ld ", (Word_t) ((JU_JPDCDPOP0(Pjp) &            0xff) + 1))
+#define POP2 printf("Pop1 = %ld ", (Word_t) ((JU_JPDCDPOP0(Pjp) &          0xffff) + 1))
+#define POP3 printf("Pop1 = %ld ", (Word_t) ((JU_JPDCDPOP0(Pjp) &        0xffffff) + 1))
+#ifdef JU_64BIT
+#define POP4 printf("Pop1 = %ld ", (Word_t) ((JU_JPDCDPOP0(Pjp) &       0xffffffff) + 1))
+#define POP5 printf("Pop1 = %ld ", (Word_t) ((JU_JPDCDPOP0(Pjp) &     0xffffffffff) + 1))
+#define POP6 printf("Pop1 = %ld ", (Word_t) ((JU_JPDCDPOP0(Pjp) &   0xffffffffffff) + 1))
+#define POP7 printf("Pop1 = %ld ", (Word_t) ((JU_JPDCDPOP0(Pjp) & 0xffffffffffffff) + 1))
+#endif
+
+// Shorthands for announcing populations of Immeds:
+//
+// Note:  Line up the small populations that often occur together, but beyond
+// that, dont worry about it because populations can get arbitrarily large.
+
+#define POP_1   printf("Pop1 =  1 ")
+#define POP_2   printf("Pop1 =  2 ")
+#define POP_3   printf("Pop1 =  3 ")
+#define POP_4   printf("Pop1 =  4 ")
+#define POP_5   printf("Pop1 =  5 ")
+#define POP_6   printf("Pop1 =  6 ")
+#define POP_7   printf("Pop1 =  7 ")
+#define POP_8   printf("Pop1 =  8 ")
+#define POP_9   printf("Pop1 =  8 ")
+#define POP_10  printf("Pop1 = 10 ")
+#define POP_11  printf("Pop1 = 11 ")
+#define POP_12  printf("Pop1 = 12 ")
+#define POP_13  printf("Pop1 = 13 ")
+#define POP_14  printf("Pop1 = 14 ")
+#define POP_15  printf("Pop1 = 15 ")
+
+// Shorthands for other announcements:
+
+#define NUMJPSL printf("NumJPs = %d ", P_JBL(Pjp->jp_Addr)->jbl_NumJPs)
+#define OOPS    printf("-- OOPS, invalid Type\n"); exit(1)
+
+// This is harder to compute:
+
+#define NUMJPSB                                                         \
+        {                                                               \
+            Pjbb_t Pjbb = P_JBB(Pjp->jp_Addr);                          \
+            Word_t subexp;                                              \
+            int    numJPs = 0;                                          \
+                                                                        \
+            for (subexp = 0; subexp < cJU_NUMSUBEXPB; ++subexp)         \
+                numJPs += j__udyCountBitsB(JU_JBB_BITMAP(Pjbb, subexp));\
+                                                                        \
+            printf("NumJPs = %d ", numJPs);                             \
+        }
+
+
+// ****************************************************************************
+// J U D Y   P R I N T   J P
+//
+// Dump information about a JP, at least its address, type, population, and
+// number of JPs, as appropriate.  Error out upon any unexpected JP type.
+//
+// TBD:  Dump more detailed information about the JP?
+
+FUNCTION static void JudyPrintJP(
+        Pjp_t  Pjp,             // JP to describe.
+        char * Desc,            // brief description of caller, such as "i".
+        int    Line)            // callers source line number.
+{
+static  bool_t checked = FALSE; // set upon first entry and check for params.
+        char * value;           // for getenv().
+
+
+// CHECK FOR EXTERNAL ENABLING:
+//
+// If a parameter is set, report the value, even if it is null or otherwise
+// evaluates to zero, in which case enable tracing immediately; otherwise wait
+// for the value to be hit.
+
+#define GETENV(Name,Value,Base)                                 \
+        if ((value = getenv (Name)) != (char *) NULL)           \
+        {                                                       \
+            (Value) = strtoul (value, (char **) NULL, Base);    \
+            enabled |= ((Value) == 0);  /* see above */         \
+                                                                \
+            (void) printf ("JudyPrintJP(\"%s\"): $%s = %lu\n",  \
+                           Desc, Name, Value);                  \
+        }
+
+        if (! checked)  // only check once.
+        {
+            checked = TRUE;
+
+            GETENV ("STARTINDEX", startindex, 16);
+            GETENV ("STARTPOP",   startpop,   10);
+
+            (void) printf ("JudyPrintJP(\"%s\"): Tracing present %s\n", Desc,
+                           enabled ? "and immediately enabled" :
+                           (startindex || startpop) ?
+                           "but disabled until start condition met" :
+                           "but not enabled by env parameter");
+        }
+
+        if (! enabled)  // check repeatedly until latched enabled:
+        {
+            if (startindex && (startindex == j__udyIndex))
+            {
+                 (void) printf ("=== TRACING ENABLED (\"%s\"), "
+                                "startindex = 0x%lx\n", Desc, startindex);
+                 enabled = TRUE;
+            }
+            else if (startpop && (startpop == j__udyPopulation))
+            {
+                 (void) printf ("=== TRACING ENABLED (\"%s\"), "
+                                "startpop = %lu\n", Desc, startpop);
+                 enabled = TRUE;
+            }
+            else
+            {
+                return;         // print nothing this time.
+            }
+        }
+
+
+// SWITCH ON JP TYPE:
+
+        switch (JU_JPTYPE(Pjp))
+        {
+
+// Note:  The following COULD be merged more tightly between Judy1 and JudyL,
+// but we decided that the output should say cJ1*/cJL*, not cJU*, to be more
+// specific.
+
+#ifdef JUDY1
+        case cJ1_JPNULL1:       JPTYPE("cJ1_JPNULL1"); POP0;            break;
+        case cJ1_JPNULL2:       JPTYPE("cJ1_JPNULL2"); POP0;            break;
+        case cJ1_JPNULL3:       JPTYPE("cJ1_JPNULL3"); POP0;            break;
+#ifdef JU_64BIT
+        case cJ1_JPNULL4:       JPTYPE("cJ1_JPNULL4"); POP0;            break;
+        case cJ1_JPNULL5:       JPTYPE("cJ1_JPNULL5"); POP0;            break;
+        case cJ1_JPNULL6:       JPTYPE("cJ1_JPNULL6"); POP0;            break;
+        case cJ1_JPNULL7:       JPTYPE("cJ1_JPNULL7"); POP0;            break;
+#endif
+
+        case cJ1_JPBRANCH_L2:   JPTYPE("cJ1_JPBRANCH_L2"); POP2;NUMJPSL;break;
+        case cJ1_JPBRANCH_L3:   JPTYPE("cJ1_JPBRANCH_L3"); POP3;NUMJPSL;break;
+#ifdef JU_64BIT
+        case cJ1_JPBRANCH_L4:   JPTYPE("cJ1_JPBRANCH_L4"); POP4;NUMJPSL;break;
+        case cJ1_JPBRANCH_L5:   JPTYPE("cJ1_JPBRANCH_L5"); POP5;NUMJPSL;break;
+        case cJ1_JPBRANCH_L6:   JPTYPE("cJ1_JPBRANCH_L6"); POP6;NUMJPSL;break;
+        case cJ1_JPBRANCH_L7:   JPTYPE("cJ1_JPBRANCH_L7"); POP7;NUMJPSL;break;
+#endif
+        case cJ1_JPBRANCH_L:    JPTYPE("cJ1_JPBRANCH_L");       NUMJPSL;break;
+
+        case cJ1_JPBRANCH_B2:   JPTYPE("cJ1_JPBRANCH_B2"); POP2;NUMJPSB;break;
+        case cJ1_JPBRANCH_B3:   JPTYPE("cJ1_JPBRANCH_B3"); POP3;NUMJPSB;break;
+#ifdef JU_64BIT
+        case cJ1_JPBRANCH_B4:   JPTYPE("cJ1_JPBRANCH_B4"); POP4;NUMJPSB;break;
+        case cJ1_JPBRANCH_B5:   JPTYPE("cJ1_JPBRANCH_B5"); POP5;NUMJPSB;break;
+        case cJ1_JPBRANCH_B6:   JPTYPE("cJ1_JPBRANCH_B6"); POP6;NUMJPSB;break;
+        case cJ1_JPBRANCH_B7:   JPTYPE("cJ1_JPBRANCH_B7"); POP7;NUMJPSB;break;
+#endif
+        case cJ1_JPBRANCH_B:    JPTYPE("cJ1_JPBRANCH_B");       NUMJPSB;break;
+
+        case cJ1_JPBRANCH_U2:   JPTYPE("cJ1_JPBRANCH_U2"); POP2;        break;
+        case cJ1_JPBRANCH_U3:   JPTYPE("cJ1_JPBRANCH_U3"); POP3;        break;
+#ifdef JU_64BIT
+        case cJ1_JPBRANCH_U4:   JPTYPE("cJ1_JPBRANCH_U4"); POP4;        break;
+        case cJ1_JPBRANCH_U5:   JPTYPE("cJ1_JPBRANCH_U5"); POP5;        break;
+        case cJ1_JPBRANCH_U6:   JPTYPE("cJ1_JPBRANCH_U6"); POP6;        break;
+        case cJ1_JPBRANCH_U7:   JPTYPE("cJ1_JPBRANCH_U7"); POP7;        break;
+#endif
+        case cJ1_JPBRANCH_U:    JPTYPE("cJ1_JPBRANCH_U");               break;
+
+#ifndef JU_64BIT
+        case cJ1_JPLEAF1:       JPTYPE("cJ1_JPLEAF1"); POP1;            break;
+#endif
+        case cJ1_JPLEAF2:       JPTYPE("cJ1_JPLEAF2"); POP2;            break;
+        case cJ1_JPLEAF3:       JPTYPE("cJ1_JPLEAF3"); POP3;            break;
+#ifdef JU_64BIT
+        case cJ1_JPLEAF4:       JPTYPE("cJ1_JPLEAF4"); POP4;            break;
+        case cJ1_JPLEAF5:       JPTYPE("cJ1_JPLEAF5"); POP5;            break;
+        case cJ1_JPLEAF6:       JPTYPE("cJ1_JPLEAF6"); POP6;            break;
+        case cJ1_JPLEAF7:       JPTYPE("cJ1_JPLEAF7"); POP7;            break;
+#endif
+
+        case cJ1_JPLEAF_B1:     JPTYPE("cJ1_JPLEAF_B1");    POP1;       break;
+        case cJ1_JPFULLPOPU1:   JPTYPE("cJ1_JPFULLPOPU1");  POP1;       break;
+
+        case cJ1_JPIMMED_1_01:  JPTYPE("cJ1_JPIMMED_1_01"); POP_1;      break;
+        case cJ1_JPIMMED_2_01:  JPTYPE("cJ1_JPIMMED_2_01"); POP_1;      break;
+        case cJ1_JPIMMED_3_01:  JPTYPE("cJ1_JPIMMED_3_01"); POP_1;      break;
+#ifdef JU_64BIT
+        case cJ1_JPIMMED_4_01:  JPTYPE("cJ1_JPIMMED_4_01"); POP_1;      break;
+        case cJ1_JPIMMED_5_01:  JPTYPE("cJ1_JPIMMED_5_01"); POP_1;      break;
+        case cJ1_JPIMMED_6_01:  JPTYPE("cJ1_JPIMMED_6_01"); POP_1;      break;
+        case cJ1_JPIMMED_7_01:  JPTYPE("cJ1_JPIMMED_7_01"); POP_1;      break;
+#endif
+
+        case cJ1_JPIMMED_1_02:  JPTYPE("cJ1_JPIMMED_1_02"); POP_2;      break;
+        case cJ1_JPIMMED_1_03:  JPTYPE("cJ1_JPIMMED_1_03"); POP_3;      break;
+        case cJ1_JPIMMED_1_04:  JPTYPE("cJ1_JPIMMED_1_04"); POP_4;      break;
+        case cJ1_JPIMMED_1_05:  JPTYPE("cJ1_JPIMMED_1_05"); POP_5;      break;
+        case cJ1_JPIMMED_1_06:  JPTYPE("cJ1_JPIMMED_1_06"); POP_6;      break;
+        case cJ1_JPIMMED_1_07:  JPTYPE("cJ1_JPIMMED_1_07"); POP_7;      break;
+#ifdef JU_64BIT
+        case cJ1_JPIMMED_1_08:  JPTYPE("cJ1_JPIMMED_1_08"); POP_8;      break;
+        case cJ1_JPIMMED_1_09:  JPTYPE("cJ1_JPIMMED_1_09"); POP_9;      break;
+        case cJ1_JPIMMED_1_10:  JPTYPE("cJ1_JPIMMED_1_10"); POP_10;     break;
+        case cJ1_JPIMMED_1_11:  JPTYPE("cJ1_JPIMMED_1_11"); POP_11;     break;
+        case cJ1_JPIMMED_1_12:  JPTYPE("cJ1_JPIMMED_1_12"); POP_12;     break;
+        case cJ1_JPIMMED_1_13:  JPTYPE("cJ1_JPIMMED_1_13"); POP_13;     break;
+        case cJ1_JPIMMED_1_14:  JPTYPE("cJ1_JPIMMED_1_14"); POP_14;     break;
+        case cJ1_JPIMMED_1_15:  JPTYPE("cJ1_JPIMMED_1_15"); POP_15;     break;
+#endif
+        case cJ1_JPIMMED_2_02:  JPTYPE("cJ1_JPIMMED_2_02"); POP_2;      break;
+        case cJ1_JPIMMED_2_03:  JPTYPE("cJ1_JPIMMED_2_03"); POP_3;      break;
+#ifdef JU_64BIT
+        case cJ1_JPIMMED_2_04:  JPTYPE("cJ1_JPIMMED_2_04"); POP_4;      break;
+        case cJ1_JPIMMED_2_05:  JPTYPE("cJ1_JPIMMED_2_05"); POP_5;      break;
+        case cJ1_JPIMMED_2_06:  JPTYPE("cJ1_JPIMMED_2_06"); POP_6;      break;
+        case cJ1_JPIMMED_2_07:  JPTYPE("cJ1_JPIMMED_2_07"); POP_7;      break;
+#endif
+
+        case cJ1_JPIMMED_3_02:  JPTYPE("cJ1_JPIMMED_3_02"); POP_2;      break;
+#ifdef JU_64BIT
+        case cJ1_JPIMMED_3_03:  JPTYPE("cJ1_JPIMMED_3_03"); POP_3;      break;
+        case cJ1_JPIMMED_3_04:  JPTYPE("cJ1_JPIMMED_3_04"); POP_4;      break;
+        case cJ1_JPIMMED_3_05:  JPTYPE("cJ1_JPIMMED_3_05"); POP_5;      break;
+        case cJ1_JPIMMED_4_02:  JPTYPE("cJ1_JPIMMED_4_02"); POP_2;      break;
+        case cJ1_JPIMMED_4_03:  JPTYPE("cJ1_JPIMMED_4_03"); POP_3;      break;
+        case cJ1_JPIMMED_5_02:  JPTYPE("cJ1_JPIMMED_5_02"); POP_2;      break;
+        case cJ1_JPIMMED_5_03:  JPTYPE("cJ1_JPIMMED_5_03"); POP_3;      break;
+        case cJ1_JPIMMED_6_02:  JPTYPE("cJ1_JPIMMED_6_02"); POP_2;      break;
+        case cJ1_JPIMMED_7_02:  JPTYPE("cJ1_JPIMMED_7_02"); POP_2;      break;
+#endif
+        case cJ1_JPIMMED_CAP:   JPTYPE("cJ1_JPIMMED_CAP");              OOPS;
+
+#else // JUDYL ===============================================================
+
+        case cJL_JPNULL1:       JPTYPE("cJL_JPNULL1"); POP0;            break;
+        case cJL_JPNULL2:       JPTYPE("cJL_JPNULL2"); POP0;            break;
+        case cJL_JPNULL3:       JPTYPE("cJL_JPNULL3"); POP0;            break;
+#ifdef JU_64BIT
+        case cJL_JPNULL4:       JPTYPE("cJL_JPNULL4"); POP0;            break;
+        case cJL_JPNULL5:       JPTYPE("cJL_JPNULL5"); POP0;            break;
+        case cJL_JPNULL6:       JPTYPE("cJL_JPNULL6"); POP0;            break;
+        case cJL_JPNULL7:       JPTYPE("cJL_JPNULL7"); POP0;            break;
+#endif
+
+        case cJL_JPBRANCH_L2:   JPTYPE("cJL_JPBRANCH_L2"); POP2;NUMJPSL;break;
+        case cJL_JPBRANCH_L3:   JPTYPE("cJL_JPBRANCH_L3"); POP3;NUMJPSL;break;
+#ifdef JU_64BIT
+        case cJL_JPBRANCH_L4:   JPTYPE("cJL_JPBRANCH_L4"); POP4;NUMJPSL;break;
+        case cJL_JPBRANCH_L5:   JPTYPE("cJL_JPBRANCH_L5"); POP5;NUMJPSL;break;
+        case cJL_JPBRANCH_L6:   JPTYPE("cJL_JPBRANCH_L6"); POP6;NUMJPSL;break;
+        case cJL_JPBRANCH_L7:   JPTYPE("cJL_JPBRANCH_L7"); POP7;NUMJPSL;break;
+#endif
+        case cJL_JPBRANCH_L:    JPTYPE("cJL_JPBRANCH_L");       NUMJPSL;break;
+
+        case cJL_JPBRANCH_B2:   JPTYPE("cJL_JPBRANCH_B2"); POP2;NUMJPSB;break;
+        case cJL_JPBRANCH_B3:   JPTYPE("cJL_JPBRANCH_B3"); POP3;NUMJPSB;break;
+#ifdef JU_64BIT
+        case cJL_JPBRANCH_B4:   JPTYPE("cJL_JPBRANCH_B4"); POP4;NUMJPSB;break;
+        case cJL_JPBRANCH_B5:   JPTYPE("cJL_JPBRANCH_B5"); POP5;NUMJPSB;break;
+        case cJL_JPBRANCH_B6:   JPTYPE("cJL_JPBRANCH_B6"); POP6;NUMJPSB;break;
+        case cJL_JPBRANCH_B7:   JPTYPE("cJL_JPBRANCH_B7"); POP7;NUMJPSB;break;
+#endif
+        case cJL_JPBRANCH_B:    JPTYPE("cJL_JPBRANCH_B");       NUMJPSB;break;
+
+        case cJL_JPBRANCH_U2:   JPTYPE("cJL_JPBRANCH_U2"); POP2;        break;
+        case cJL_JPBRANCH_U3:   JPTYPE("cJL_JPBRANCH_U3"); POP3;        break;
+#ifdef JU_64BIT
+        case cJL_JPBRANCH_U4:   JPTYPE("cJL_JPBRANCH_U4"); POP4;        break;
+        case cJL_JPBRANCH_U5:   JPTYPE("cJL_JPBRANCH_U5"); POP5;        break;
+        case cJL_JPBRANCH_U6:   JPTYPE("cJL_JPBRANCH_U6"); POP6;        break;
+        case cJL_JPBRANCH_U7:   JPTYPE("cJL_JPBRANCH_U7"); POP7;        break;
+#endif
+        case cJL_JPBRANCH_U:    JPTYPE("cJL_JPBRANCH_U");               break;
+
+        case cJL_JPLEAF1:       JPTYPE("cJL_JPLEAF1"); POP1;            break;
+        case cJL_JPLEAF2:       JPTYPE("cJL_JPLEAF2"); POP2;            break;
+        case cJL_JPLEAF3:       JPTYPE("cJL_JPLEAF3"); POP3;            break;
+#ifdef JU_64BIT
+        case cJL_JPLEAF4:       JPTYPE("cJL_JPLEAF4"); POP4;            break;
+        case cJL_JPLEAF5:       JPTYPE("cJL_JPLEAF5"); POP5;            break;
+        case cJL_JPLEAF6:       JPTYPE("cJL_JPLEAF6"); POP6;            break;
+        case cJL_JPLEAF7:       JPTYPE("cJL_JPLEAF7"); POP7;            break;
+#endif
+
+        case cJL_JPLEAF_B1:     JPTYPE("cJL_JPLEAF_B1"); POP1;  break;
+
+        case cJL_JPIMMED_1_01:  JPTYPE("cJL_JPIMMED_1_01"); POP_1;      break;
+        case cJL_JPIMMED_2_01:  JPTYPE("cJL_JPIMMED_2_01"); POP_1;      break;
+        case cJL_JPIMMED_3_01:  JPTYPE("cJL_JPIMMED_3_01"); POP_1;      break;
+#ifdef JU_64BIT
+        case cJL_JPIMMED_4_01:  JPTYPE("cJL_JPIMMED_4_01"); POP_1;      break;
+        case cJL_JPIMMED_5_01:  JPTYPE("cJL_JPIMMED_5_01"); POP_1;      break;
+        case cJL_JPIMMED_6_01:  JPTYPE("cJL_JPIMMED_6_01"); POP_1;      break;
+        case cJL_JPIMMED_7_01:  JPTYPE("cJL_JPIMMED_7_01"); POP_1;      break;
+#endif
+
+        case cJL_JPIMMED_1_02:  JPTYPE("cJL_JPIMMED_1_02"); POP_2;      break;
+        case cJL_JPIMMED_1_03:  JPTYPE("cJL_JPIMMED_1_03"); POP_3;      break;
+#ifdef JU_64BIT
+        case cJL_JPIMMED_1_04:  JPTYPE("cJL_JPIMMED_1_04"); POP_4;      break;
+        case cJL_JPIMMED_1_05:  JPTYPE("cJL_JPIMMED_1_05"); POP_5;      break;
+        case cJL_JPIMMED_1_06:  JPTYPE("cJL_JPIMMED_1_06"); POP_6;      break;
+        case cJL_JPIMMED_1_07:  JPTYPE("cJL_JPIMMED_1_07"); POP_7;      break;
+        case cJL_JPIMMED_2_02:  JPTYPE("cJL_JPIMMED_2_02"); POP_2;      break;
+        case cJL_JPIMMED_2_03:  JPTYPE("cJL_JPIMMED_2_03"); POP_3;      break;
+        case cJL_JPIMMED_3_02:  JPTYPE("cJL_JPIMMED_3_02"); POP_2;      break;
+#endif
+        case cJL_JPIMMED_CAP:   JPTYPE("cJL_JPIMMED_CAP");      OOPS;
+
+#endif // JUDYL
+
+        default:  printf("Unknown Type = %d", JU_JPTYPE(Pjp));          OOPS;
+        }
+
+        if (j__udyIndex)        printf("Index = 0x%lx", j__udyIndex);
+        if (j__udyPopulation)   printf("Pop = %lu",     j__udyPopulation);
+
+        printf("line = %d\n", Line);
+
+} // JudyPrintJP()
diff --git a/libs/klib/judy/JudyPrivate.h b/libs/klib/judy/JudyPrivate.h
new file mode 100644
index 0000000..0d0c5f3
--- /dev/null
+++ b/libs/klib/judy/JudyPrivate.h
@@ -0,0 +1,1610 @@
+#ifndef _JUDYPRIVATE_INCLUDED
+#define _JUDYPRIVATE_INCLUDED
+// _________________
+//
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Header file for all Judy sources, for global but private (non-exported)
+// declarations.
+
+#include "Judy.h"
+
+// ****************************************************************************
+// A VERY BRIEF EXPLANATION OF A JUDY ARRAY
+//
+// A Judy array is, effectively, a digital tree (or Trie) with 256 element
+// branches (nodes), and with "compression tricks" applied to low-population
+// branches or leaves to save a lot of memory at the cost of relatively little
+// CPU time or cache fills.
+//
+// In the actual implementation, a Judy array is level-less, and traversing the
+// "tree" actually means following the states in a state machine (SM) as
+// directed by the Index.  A Judy array is referred to here as an "SM", rather
+// than as a "tree"; having "states", rather than "levels".
+//
+// Each branch or leaf in the SM decodes a portion ("digit") of the original
+// Index; with 256-way branches there are 8 bits per digit.  There are 3 kinds
+// of branches, called:  Linear, Bitmap and Uncompressed, of which the first 2
+// are compressed to contain no NULL entries.
+//
+// An Uncompressed branch has a 1.0 cache line fill cost to decode 8 bits of
+// (digit, part of an Index), but it might contain many NULL entries, and is
+// therefore inefficient with memory if lightly populated.
+//
+// A Linear branch has a ~1.75 cache line fill cost when at maximum population.
+// A Bitmap branch has ~2.0 cache line fills.  Linear and Bitmap branches are
+// converted to Uncompressed branches when the additional memory can be
+// amortized with larger populations.  Higher-state branches have higher
+// priority to be converted.
+//
+// Linear branches can hold 28 elements (based on detailed analysis) -- thus 28
+// expanses.  A Linear branch is converted to a Bitmap branch when the 29th
+// expanse is required.
+//
+// A Bitmap branch could hold 256 expanses, but is forced to convert to an
+// Uncompressed branch when 185 expanses are required.  Hopefully, it is
+// converted before that because of population growth (again, based on detailed
+// analysis and heuristics in the code).
+//
+// A path through the SM terminates to a leaf when the Index (or key)
+// population in the expanse below a pointer will fit into 1 or 2 cache lines
+// (~31..255 Indexes).  A maximum-population Leaf has ~1.5 cache line fill
+// cost.
+//
+// Leaves are sorted arrays of Indexes, where the Index Sizes (IS) are:  0, 1,
+// 8, 16, 24, 32, [40, 48, 56, 64] bits.  The IS depends on the "density"
+// (population/expanse) of the values in the Leaf.  Zero bits are possible if
+// population == expanse in the SM (that is, a full small expanse).
+//
+// Elements of a branches are called Judy Pointers (JPs).  Each JP object
+// points to the next object in the SM, plus, a JP can decode an additional
+// 2[6] bytes of an Index, but at the cost of "narrowing" the expanse
+// represented by the next object in the SM.  A "narrow" JP (one which has
+// decode bytes/digits) is a way of skipping states in the SM.
+//
+// Although counterintuitive, we think a Judy SM is optimal when the Leaves are
+// stored at MINIMUM compression (narrowing, or use of Decode bytes).  If more
+// aggressive compression was used, decompression of a leaf be required to
+// insert an index.  Additional compression would save a little memory but not
+// help performance significantly.
+
+
+#ifdef A_PICTURE_IS_WORTH_1000_WORDS
+*******************************************************************************
+
+JUDY 32-BIT STATE MACHINE (SM) EXAMPLE, FOR INDEX = 0x02040103
+
+The Index used in this example is purposely chosen to allow small, simple
+examples below; each 1-byte "digit" from the Index has a small numeric value
+that fits in one column.  In the drawing below:
+
+   JRP  == Judy Root Pointer;
+
+    C   == 1 byte of a 1..3 byte Population (count of Indexes) below this
+           pointer.  Since this is shared with the Decode field, the combined
+           sizes must be 3[7], that is, 1 word less 1 byte for the JP Type.
+
+   The 1-byte field jp_Type is represented as:
+
+   1..3 == Number of bytes in the population (Pop0) word of the Branch or Leaf
+           below the pointer (note:  1..7 on 64-bit); indicates:
+           - number of bytes in Decode field == 3 - this number;
+           - number of bytes remaining to decode.
+           Note:  The maximum is 3, not 4, because the 1st byte of the Index is
+           always decoded digitally in the top branch.
+   -B-  == JP points to a Branch (there are many kinds of Branches).
+   -L-  == JP points to a Leaf (there are many kinds of Leaves).
+
+   (2)  == Digit of Index decoded by position offset in branch (really
+           0..0xff).
+
+    4*  == Digit of Index necessary for decoding a "narrow" pointer, in a
+           Decode field; replaces 1 missing branch (really 0..0xff).
+
+    4+  == Digit of Index NOT necessary for decoding a "narrow" pointer, but
+           used for fast traversal of the SM by Judy1Test() and JudyLGet()
+           (see the code) (really 0..0xff).
+
+    0   == Byte in a JPs Pop0 field that is always ignored, because a leaf
+           can never contain more than 256 Indexes (Pop0 <= 255).
+
+    +-----  == A Branch or Leaf; drawn open-ended to remind you that it could
+    |          have up to 256 columns.
+    +-----
+
+    |
+    |   == Pointer to next Branch or Leaf.
+    V
+
+    |
+    O   == A state is skipped by using a "narrow" pointer.
+    |
+
+    < 1 > == Digit (Index) shown as an example is not necessarily in the
+             position shown; is sorted in order with neighbor Indexes.
+             (Really 0..0xff.)
+
+Note that this example shows every possibly topology to reach a leaf in a
+32-bit Judy SM, although this is a very subtle point!
+
+                                                                          STATE or`
+                                                                          LEVEL
+     +---+    +---+    +---+    +---+    +---+    +---+    +---+    +---+
+     |RJP|    |RJP|    |RJP|    |RJP|    |RJP|    |RJP|    |RJP|    |RJP|
+     L---+    B---+    B---+    B---+    B---+    B---+    B---+    B---+
+     |        |        |        |        |        |        |        |
+     |        |        |        |        |        |        |        |
+     V        V (2)    V (2)    V (2)    V (2)    V (2)    V (2)    V (2)
+     +------  +------  +------  +------  +------  +------  +------  +------
+Four |< 2 >   |  0     |  4*    |  C     |  4*    |  4*    |  C     |  C
+byte |< 4 >   |  0     |  0     |  C     |  1*    |  C     |  C     |  C     4
+Index|< 1 >   |  C     |  C     |  C     |  C     |  C     |  C     |  C
+Leaf |< 3 >   |  3     |  2     |  3     |  1     |  2     |  3     |  3
+     +------  +--L---  +--L---  +--B---  +--L---  +--B---  +--B---  +--B---
+                 |        |        |        |        |        |        |
+                /         |       /         |        |       /        /
+               /          |      /          |        |      /        /
+              |           |     |           |        |     |        |
+              V           |     V   (4)     |        |     V   (4)  V   (4)
+              +------     |     +------     |        |     +------  +------
+    Three     |< 4 >      |     |    4+     |        |     |    4+  |    4+
+    byte Index|< 1 >      O     |    0      O        O     |    1*  |    C   3
+    Leaf      |< 3 >      |     |    C      |        |     |    C   |    C
+              +------     |     |    2      |        |     |    1   |    2
+                         /      +----L-     |        |     +----L-  +----B-
+                        /            |      |        |          |        |
+                       |            /       |       /          /        /
+                       |           /        |      /          /        /
+                       |          /         |     |          /        /
+                       |         /          |     |         /        /
+                       |        |           |     |        |        |
+                       V        V           |     V(1)     |        V(1)
+                       +------  +------     |     +------  |        +------
+          Two byte     |< 1 >   |< 1 >      |     | 4+     |        | 4+
+          Index Leaf   |< 3 >   |< 3 >      O     | 1+     O        | 1+     2
+                       +------  +------    /      | C      |        | C
+                                          /       | 1      |        | 1
+                                         |        +-L----  |        +-L----
+                                         |          |      |          |
+                                         |         /       |         /
+                                         |        |        |        |
+                                         V        V        V        V
+                                         +------  +------  +------  +------
+                    One byte Index Leaf  |< 3 >   |< 3 >   |< 3 >   |< 3 >   1
+                                         +------  +------  +------  +------
+
+
+#endif // A_PICTURE_IS_WORTH_1000_WORDS
+
+
+// ****************************************************************************
+// MISCELLANEOUS GLOBALS:
+//
+// PLATFORM-SPECIFIC CONVENIENCE MACROS:
+//
+// These are derived from context (set by cc or in system header files) or
+// based on JU_<PLATFORM> macros from make_includes/platform.*.mk.  We decided
+// on 011018 that any macro reliably derivable from context (cc or headers) for
+// ALL platforms supported by Judy is based on that derivation, but ANY
+// exception means to stop using the external macro completely and derive from
+// JU_<PLATFORM> instead.
+
+// Other miscellaneous stuff:
+
+#ifndef _BOOL_T
+#define _BOOL_T
+typedef int bool_t;
+#endif
+
+#define FUNCTION                // null; easy to find functions.
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifdef TRACE            // turn on all other tracing in the code:
+#define TRACEJP  1      // JP traversals in JudyIns.c and JudyDel.c.
+#define TRACEJPR 1      // JP traversals in retrieval code, JudyGet.c.
+#define TRACECF  1      // cache fills in JudyGet.c.
+#define TRACEMI  1      // malloc calls in JudyMallocIF.c.
+#define TRACEMF  1      // malloc calls at a lower level in JudyMalloc.c.
+#endif
+
+#ifndef inline
+    #define inline __inline__
+#endif
+
+// SUPPORT FOR DEBUG-ONLY CODE:
+//
+// By convention, use -DDEBUG to enable both debug-only code AND assertions in
+// the Judy sources.
+//
+// Invert the sense of assertions, so they are off unless explicitly requested,
+// in a uniform way.
+//
+// Note:  It is NOT appropriate to put this in Judy.h; it would mess up
+// application code.
+
+#ifndef DEBUG
+#define NDEBUG 1                // must be 1 for "#if".
+#endif
+
+// Shorthand notations to avoid #ifdefs for single-line conditional statements:
+//
+// Warning:  These cannot be used around compiler directives, such as
+// "#include", nor in the case where Code contains a comma other than nested
+// within parentheses or quotes.
+
+#define DBGCODE(Code)  /* nothing */
+
+#ifdef JUDY1
+#define JUDY1CODE(Code) Code
+#define JUDYLCODE(Code) // null.
+#endif
+
+#ifdef JUDYL
+#define JUDYLCODE(Code) Code
+#define JUDY1CODE(Code) // null.
+#endif
+
+#include <assert.h>
+
+// ****************************************************************************
+// FUNDAMENTAL CONSTANTS FOR MACHINE
+// ****************************************************************************
+
+// Machine (CPU) cache line size:
+//
+// NOTE:  A leaf size of 2 cache lines maximum is the target (optimal) for
+// Judy.  Its hard to obtain a machines cache line size at compile time, but
+// if the machine has an unexpected cache line size, its not devastating if
+// the following constants end up causing leaves that are 1 cache line in size,
+// or even 4 cache lines in size.  The assumed 32-bit system has 16-word =
+// 64-byte cache lines, and the assumed 64-bit system has 16-word = 128-byte
+// cache lines.
+
+#ifdef JU_64BIT
+#define cJU_BYTESPERCL 128              // cache line size in bytes.
+#else
+#define cJU_BYTESPERCL  64              // cache line size in bytes.
+#endif
+
+// Bits Per Byte:
+
+#define cJU_BITSPERBYTE 0x8
+
+// Bytes Per Word and Bits Per Word, latter assuming sizeof(byte) is 8 bits:
+//
+// Expect 32 [64] bits per word.
+
+#define cJU_BYTESPERWORD (sizeof(Word_t))
+#define cJU_BITSPERWORD  (sizeof(Word_t) * cJU_BITSPERBYTE)
+
+#define JU_BYTESTOWORDS(BYTES) \
+        (((BYTES) + cJU_BYTESPERWORD - 1) / cJU_BYTESPERWORD)
+
+// A word that is all-ones, normally equal to -1UL, but safer with ~0:
+
+#define cJU_ALLONES  (~ ( Word_t ) 0UL)
+
+// Note, these are forward references, but thats OK:
+
+#define cJU_FULLBITMAPB ((BITMAPB_t) cJU_ALLONES)
+#define cJU_FULLBITMAPL ((BITMAPL_t) cJU_ALLONES)
+
+
+// ****************************************************************************
+// MISCELLANEOUS JUDY-SPECIFIC DECLARATIONS
+// ****************************************************************************
+
+// ROOT STATE:
+//
+// State at the start of the Judy SM, based on 1 byte decoded per state; equal
+// to the number of bytes per Index to decode.
+
+#define cJU_ROOTSTATE (sizeof(Word_t))
+
+
+// SUBEXPANSES PER STATE:
+//
+// Number of subexpanses per state traversed, which is the number of JPs in a
+// branch (actual or theoretical) and the number of bits in a bitmap.
+
+#define cJU_SUBEXPPERSTATE  256
+
+
+// LEAF AND VALUE POINTERS:
+//
+// Some other basic object types are in declared in JudyPrivateBranch.h
+// (Pjbl_t, Pjbb_t, Pjbu_t, Pjp_t) or are Judy1/L-specific (Pjlb_t).  The
+// few remaining types are declared below.
+//
+// Note:  Leaf pointers are cast to different-sized objects depending on the
+// leafs level, but are at least addresses (not just numbers), so use void *
+// (Pvoid_t), not PWord_t or Word_t for them, except use Pjlw_t for whole-word
+// (top-level, root-level) leaves.  Value areas, however, are always whole
+// words.
+//
+// Furthermore, use Pjll_t only for generic leaf pointers (for various size
+// LeafLs).  Use Pjlw_t for LeafWs.  Use Pleaf (with type uint8_t *, uint16_t
+// *, etc) when the leaf index size is known.
+
+typedef PWord_t Pjlw_t;  // pointer to root-level leaf (whole-word indexes).
+typedef Pvoid_t Pjll_t;  // pointer to lower-level linear leaf.
+
+#ifdef JUDYL
+typedef PWord_t Pjv_t;   // pointer to JudyL value area.
+#endif
+
+
+// POINTER PREPARATION MACROS:
+//
+// These macros are used to strip malloc-namespace-type bits from a pointer +
+// malloc-type word (which references any Judy mallocd object that might be
+// obtained from other than a direct call of malloc()), prior to dereferencing
+// the pointer as an address.  The malloc-type bits allow Judy mallocd objects
+// to come from different "malloc() namespaces".
+//
+//    (root pointer)    (JRP, see above)
+//    jp.jp_Addr        generic pointer to next-level node, except when used
+//                      as a JudyL Immed01 value area
+//    JU_JBB_PJP        macro hides jbbs_Pjp (pointer to JP subarray)
+//    JL_JLB_PVALUE     macro hides jLlbs_PValue (pointer to value subarray)
+//
+// When setting one of these fields or passing an address to j__udyFree*(), the
+// "raw" memory address is used; otherwise the memory address must be passed
+// through one of the macros below before its dereferenced.
+//
+// Note:  After much study, the typecasts below appear in the macros rather
+// than at the point of use, which is both simpler and allows the compiler to
+// do type-checking.
+
+
+#define P_JLW(  ADDR) ((Pjlw_t) (ADDR))  // root leaf.
+#define P_JPM(  ADDR) ((Pjpm_t) (ADDR))  // root JPM.
+#define P_JBL(  ADDR) ((Pjbl_t) (ADDR))  // BranchL.
+#define P_JBB(  ADDR) ((Pjbb_t) (ADDR))  // BranchB.
+#define P_JBU(  ADDR) ((Pjbu_t) (ADDR))  // BranchU.
+#define P_JLL(  ADDR) ((Pjll_t) (ADDR))  // LeafL.
+#define P_JLB(  ADDR) ((Pjlb_t) (ADDR))  // LeafB1.
+#define P_JP(   ADDR) ((Pjp_t)  (ADDR))  // JP.
+
+#ifdef JUDYL
+#define P_JV(   ADDR) ((Pjv_t)  (ADDR))  // &value.
+#endif
+
+
+// LEAST BYTES:
+//
+// Mask for least bytes of a word, and a macro to perform this mask on an
+// Index.
+//
+// Note:  This macro has been problematic in the past to get right and to make
+// portable.  Its not OK on all systems to shift by the full word size.  This
+// macro should allow shifting by 1..N bytes, where N is the word size, but
+// should produce a compiler warning if the macro is called with Bytes == 0.
+//
+// Warning:  JU_LEASTBYTESMASK() is not a constant macro unless Bytes is a
+// constant; otherwise it is a variable shift, which is expensive on some
+// processors.
+
+#define JU_LEASTBYTESMASK(BYTES) \
+        (((Word_t)0x100 << (cJU_BITSPERBYTE * ((BYTES) - 1))) - 1)
+
+#define JU_LEASTBYTES(INDEX,BYTES)  ((INDEX) & JU_LEASTBYTESMASK(BYTES))
+
+
+// BITS IN EACH BITMAP SUBEXPANSE FOR BITMAP BRANCH AND LEAF:
+//
+// The bits per bitmap subexpanse times the number of subexpanses equals a
+// constant (cJU_SUBEXPPERSTATE).  You can also think of this as a compile-time
+// choice of "aspect ratio" for bitmap branches and leaves (which can be set
+// independently for each).
+//
+// A default aspect ratio is hardwired here if not overridden at compile time,
+// such as by "EXTCCOPTS=-DBITMAP_BRANCH16x16 make".
+
+#if (! (defined(BITMAP_BRANCH8x32) || defined(BITMAP_BRANCH16x16) || defined(BITMAP_BRANCH32x8)))
+#define BITMAP_BRANCH32x8 1     // 32 bits per subexpanse, 8 subexpanses.
+#endif
+
+#ifdef BITMAP_BRANCH8x32
+#define BITMAPB_t uint8_t
+#endif
+
+#ifdef BITMAP_BRANCH16x16
+#define BITMAPB_t uint16_t
+#endif
+
+#ifdef BITMAP_BRANCH32x8
+#define BITMAPB_t uint32_t
+#endif
+
+// Note:  For bitmap leaves, BITMAP_LEAF64x4 is only valid for 64 bit:
+//
+// Note:  Choice of aspect ratio mostly matters for JudyL bitmap leaves.  For
+// Judy1 the choice doesnt matter much -- the code generated for different
+// BITMAP_LEAF* values choices varies, but correctness and performance are the
+// same.
+
+#ifndef JU_64BIT
+
+#if (! (defined(BITMAP_LEAF8x32) || defined(BITMAP_LEAF16x16) || defined(BITMAP_LEAF32x8)))
+#define BITMAP_LEAF32x8         // 32 bits per subexpanse, 8 subexpanses.
+#endif
+
+#else // 32BIT
+
+#if (! (defined(BITMAP_LEAF8x32) || defined(BITMAP_LEAF16x16) || defined(BITMAP_LEAF32x8) || defined(BITMAP_LEAF64x4)))
+#define BITMAP_LEAF64x4         // 64 bits per subexpanse, 4 subexpanses.
+
+#endif
+#endif // JU_64BIT
+
+#ifdef BITMAP_LEAF8x32
+#define BITMAPL_t uint8_t
+#endif
+
+#ifdef BITMAP_LEAF16x16
+#define BITMAPL_t uint16_t
+#endif
+
+#ifdef BITMAP_LEAF32x8
+#define BITMAPL_t uint32_t
+#endif
+
+#ifdef BITMAP_LEAF64x4
+#define BITMAPL_t uint64_t
+#endif
+
+
+// EXPORTED DATA AND FUNCTIONS:
+
+#ifdef JUDY1
+extern const uint8_t j__1_BranchBJPPopToWords[];
+#endif
+
+#ifdef JUDYL
+extern const uint8_t j__L_BranchBJPPopToWords[];
+#endif
+
+// Fast LeafL search routine used for inlined code:
+
+#if (! defined(SEARCH_BINARY)) || (! defined(SEARCH_LINEAR))
+// default a binary search leaf method
+#define SEARCH_BINARY 1
+//#define SEARCH_LINEAR 1
+#endif
+
+#ifdef SEARCH_LINEAR
+
+#define SEARCHLEAFNATIVE(LEAFTYPE,ADDR,POP1,INDEX)              \
+    LEAFTYPE *P_leaf = (LEAFTYPE *)(ADDR);                      \
+    LEAFTYPE  I_ndex = (INDEX); /* with masking */              \
+    if (I_ndex > P_leaf[(POP1) - 1]) return(~(POP1));           \
+    while(I_ndex > *P_leaf) P_leaf++;                           \
+    if (I_ndex == *P_leaf) return(P_leaf - (LEAFTYPE *)(ADDR)); \
+    return(~(P_leaf - (LEAFTYPE *)(ADDR)));
+
+
+#define SEARCHLEAFNONNAT(ADDR,POP1,INDEX,LFBTS,COPYINDEX)       \
+{                                                               \
+    uint8_t *P_leaf, *P_leafEnd;                                \
+    Word_t   i_ndex;                                            \
+    Word_t   I_ndex = JU_LEASTBYTES((INDEX), (LFBTS));          \
+    Word_t   p_op1;                                             \
+                                                                \
+    P_leaf    = (uint8_t *)(ADDR);                              \
+    P_leafEnd = P_leaf + ((POP1) * (LFBTS));                    \
+                                                                \
+    do {                                                        \
+        JU_COPY3_PINDEX_TO_LONG(i_ndex, P_leaf);                \
+        if (I_ndex <= i_ndex) break;                            \
+        P_leaf += (LFBTS);                                      \
+    } while (P_leaf < P_leafEnd);                               \
+                                                                \
+    p_op1 = (P_leaf - (uint8_t *) (ADDR)) / (LFBTS);            \
+    if (I_ndex == i_ndex) return(p_op1);                        \
+    return(~p_op1);                                             \
+}
+#endif // SEARCH_LINEAR
+
+#ifdef SEARCH_BINARY
+
+#define SEARCHLEAFNATIVE(LEAFTYPE,ADDR,POP1,INDEX)              \
+    LEAFTYPE *P_leaf = (LEAFTYPE *)(ADDR);                      \
+    LEAFTYPE I_ndex = (LEAFTYPE)INDEX; /* truncate hi bits */   \
+    Word_t   l_ow   = cJU_ALLONES;                              \
+    Word_t   m_id;                                              \
+    Word_t   h_igh  = POP1;                                     \
+                                                                \
+    while ((h_igh - l_ow) > 1UL)                                \
+    {                                                           \
+        m_id = (h_igh + l_ow) / 2;                              \
+        if (P_leaf[m_id] > I_ndex)                              \
+            h_igh = m_id;                                       \
+        else                                                    \
+            l_ow = m_id;                                        \
+    }                                                           \
+    if (l_ow == cJU_ALLONES || P_leaf[l_ow] != I_ndex)          \
+        return(~h_igh);                                         \
+    return(l_ow)
+
+
+#define SEARCHLEAFNONNAT(ADDR,POP1,INDEX,LFBTS,COPYINDEX)       \
+    uint8_t *P_leaf = (uint8_t *)(ADDR);                        \
+    Word_t   l_ow   = cJU_ALLONES;                              \
+    Word_t   m_id;                                              \
+    Word_t   h_igh  = POP1;                                     \
+    Word_t   I_ndex = JU_LEASTBYTES((INDEX), (LFBTS));          \
+    Word_t   i_ndex;                                            \
+                                                                \
+    I_ndex = JU_LEASTBYTES((INDEX), (LFBTS));                   \
+                                                                \
+    while ((h_igh - l_ow) > 1UL)                                \
+    {                                                           \
+        m_id = (h_igh + l_ow) / 2;                              \
+        COPYINDEX(i_ndex, &P_leaf[m_id * (LFBTS)]);             \
+        if (i_ndex > I_ndex)                                    \
+            h_igh = m_id;                                       \
+        else                                                    \
+            l_ow = m_id;                                        \
+    }                                                           \
+    if (l_ow == cJU_ALLONES) return(~h_igh);                    \
+                                                                \
+    COPYINDEX(i_ndex, &P_leaf[l_ow * (LFBTS)]);                 \
+    if (i_ndex != I_ndex) return(~h_igh);                       \
+    return(l_ow)
+
+#endif // SEARCH_BINARY
+
+// Fast way to count bits set in 8..32[64]-bit int:
+//
+// For performance, j__udyCountBits*() are written to take advantage of
+// platform-specific features where available.
+//
+
+#ifdef JU_NOINLINE
+
+extern BITMAPB_t j__udyCountBitsB(BITMAPB_t word);
+extern BITMAPL_t j__udyCountBitsL(BITMAPL_t word);
+
+// Compiler supports inline
+
+#elif  defined(JU_HPUX_IPF)
+
+#define j__udyCountBitsB(WORD)  _Asm_popcnt(WORD)
+#define j__udyCountBitsL(WORD)  _Asm_popcnt(WORD)
+
+#elif defined(JU_LINUX_IPF)
+
+static inline BITMAPB_t j__udyCountBitsB(BITMAPB_t word)
+{
+        BITMAPB_t result;
+        __asm__ ("popcnt %0=%1" : "=r" (result) : "r" (word));
+        return(result);
+}
+
+static inline BITMAPL_t j__udyCountBitsL(BITMAPL_t word)
+{
+        BITMAPL_t result;
+        __asm__ ("popcnt %0=%1" : "=r" (result) : "r" (word));
+        return(result);
+}
+
+
+#else // No instructions available, use inline code
+
+// ****************************************************************************
+// __ J U D Y   C O U N T   B I T S   B
+//
+// Return the number of bits set in "Word", for a bitmap branch.
+//
+// Note:  Bitmap branches have maximum bitmap size = 32 bits.
+
+#ifdef JU_WIN
+static __inline BITMAPB_t j__udyCountBitsB(BITMAPB_t word)
+#else
+static inline BITMAPB_t j__udyCountBitsB(BITMAPB_t word)
+#endif 
+{
+        word = (word & 0x55555555) + ((word & 0xAAAAAAAA) >>  1);
+        word = (word & 0x33333333) + ((word & 0xCCCCCCCC) >>  2);
+        word = (word & 0x0F0F0F0F) + ((word & 0xF0F0F0F0) >>  4); // >= 8 bits.
+#if defined(BITMAP_BRANCH16x16) || defined(BITMAP_BRANCH32x8)
+        word = (word & 0x00FF00FF) + ((word & 0xFF00FF00) >>  8); // >= 16 bits.
+#endif
+
+#ifdef BITMAP_BRANCH32x8
+        word = (word & 0x0000FFFF) + ((word & 0xFFFF0000) >> 16); // >= 32 bits.
+#endif
+        return(word);
+
+} // j__udyCountBitsB()
+
+
+// ****************************************************************************
+// __ J U D Y   C O U N T   B I T S   L
+//
+// Return the number of bits set in "Word", for a bitmap leaf.
+//
+// Note:  Bitmap branches have maximum bitmap size = 32 bits.
+
+// Note:  Need both 32-bit and 64-bit versions of j__udyCountBitsL() because
+// bitmap leaves can have 64-bit bitmaps.
+
+#ifdef JU_WIN
+static __inline BITMAPL_t j__udyCountBitsL(BITMAPL_t word)
+#else
+static inline BITMAPL_t j__udyCountBitsL(BITMAPL_t word)
+#endif
+{
+#ifndef JU_64BIT
+
+        word = (word & 0x55555555) + ((word & 0xAAAAAAAA) >>  1);
+        word = (word & 0x33333333) + ((word & 0xCCCCCCCC) >>  2);
+        word = (word & 0x0F0F0F0F) + ((word & 0xF0F0F0F0) >>  4); // >= 8 bits.
+#if defined(BITMAP_LEAF16x16) || defined(BITMAP_LEAF32x8)
+        word = (word & 0x00FF00FF) + ((word & 0xFF00FF00) >>  8); // >= 16 bits.
+#endif
+#ifdef BITMAP_LEAF32x8
+        word = (word & 0x0000FFFF) + ((word & 0xFFFF0000) >> 16); // >= 32 bits.
+#endif
+
+#else // JU_64BIT
+
+        word = (word & 0x5555555555555555) + ((word & 0xAAAAAAAAAAAAAAAA) >> 1);
+        word = (word & 0x3333333333333333) + ((word & 0xCCCCCCCCCCCCCCCC) >> 2);
+        word = (word & 0x0F0F0F0F0F0F0F0F) + ((word & 0xF0F0F0F0F0F0F0F0) >> 4);
+#if defined(BITMAP_LEAF16x16) || defined(BITMAP_LEAF32x8) || defined(BITMAP_LEAF64x4)
+        word = (word & 0x00FF00FF00FF00FF) + ((word & 0xFF00FF00FF00FF00) >> 8);
+#endif
+#if defined(BITMAP_LEAF32x8) || defined(BITMAP_LEAF64x4)
+        word = (word & 0x0000FFFF0000FFFF) + ((word & 0xFFFF0000FFFF0000) >>16);
+#endif
+#ifdef BITMAP_LEAF64x4
+        word = (word & 0x00000000FFFFFFFF) + ((word & 0xFFFFFFFF00000000) >>32);
+#endif
+#endif // JU_64BIT
+
+        return(word);
+
+} // j__udyCountBitsL()
+
+#endif // Compiler supports inline
+
+// GET POP0:
+//
+// Get from jp_DcdPopO the Pop0 for various JP Types.
+//
+// Notes:
+//
+// - Different macros require different parameters...
+//
+// - There are no simple macros for cJU_BRANCH* Types because their
+//   populations must be added up and dont reside in an already-calculated
+//   place.  (TBD:  This is no longer true, now its in the JPM.)
+//
+// - cJU_JPIMM_POP0() is not defined because it would be redundant because the
+//   Pop1 is already encoded in each enum name.
+//
+// - A linear or bitmap leaf Pop0 cannot exceed cJU_SUBEXPPERSTATE - 1 (Pop0 =
+//   0..255), so use a simpler, faster macro for it than for other JP Types.
+//
+// - Avoid any complex calculations that would slow down the compiled code.
+//   Assume these macros are only called for the appropriate JP Types.
+//   Unfortunately theres no way to trigger an assertion here if the JP type
+//   is incorrect for the macro, because these are merely expressions, not
+//   statements.
+
+#define  JU_LEAFW_POP0(JRP)                  (*P_JLW(JRP))
+#define cJU_JPFULLPOPU1_POP0                 (cJU_SUBEXPPERSTATE - 1)
+
+// GET JP Type:
+// Since bit fields greater than 32 bits are not supported in some compilers
+// the jp_DcdPopO field is expanded to include the jp_Type in the high 8 bits
+// of the Word_t.
+// First the read macro:
+
+#define JU_JPTYPE(PJP)          ((PJP)->jp_Type)
+
+#define JU_JPLEAF_POP0(PJP)     ((PJP)->jp_DcdP0[sizeof(Word_t) - 2])
+
+#ifdef JU_64BIT
+
+#define JU_JPDCDPOP0(PJP)               \
+    ((Word_t)(PJP)->jp_DcdP0[0] << 48 | \
+     (Word_t)(PJP)->jp_DcdP0[1] << 40 | \
+     (Word_t)(PJP)->jp_DcdP0[2] << 32 | \
+     (Word_t)(PJP)->jp_DcdP0[3] << 24 | \
+     (Word_t)(PJP)->jp_DcdP0[4] << 16 | \
+     (Word_t)(PJP)->jp_DcdP0[5] <<  8 | \
+     (Word_t)(PJP)->jp_DcdP0[6])
+
+
+#define JU_JPSETADT(PJP,ADDR,DCDPOP0,TYPE)                      \
+{                                                               \
+    (PJP)->jp_Addr     = (ADDR);                                \
+    (PJP)->jp_DcdP0[0] = (uint8_t)((Word_t)(DCDPOP0) >> 48);    \
+    (PJP)->jp_DcdP0[1] = (uint8_t)((Word_t)(DCDPOP0) >> 40);    \
+    (PJP)->jp_DcdP0[2] = (uint8_t)((Word_t)(DCDPOP0) >> 32);    \
+    (PJP)->jp_DcdP0[3] = (uint8_t)((Word_t)(DCDPOP0) >> 24);    \
+    (PJP)->jp_DcdP0[4] = (uint8_t)((Word_t)(DCDPOP0) >> 16);    \
+    (PJP)->jp_DcdP0[5] = (uint8_t)((Word_t)(DCDPOP0) >>  8);    \
+    (PJP)->jp_DcdP0[6] = (uint8_t)((Word_t)(DCDPOP0));          \
+    (PJP)->jp_Type     = (TYPE);                                \
+}
+
+#else   // 32 Bit
+
+#define JU_JPDCDPOP0(PJP)               \
+    ((Word_t)(PJP)->jp_DcdP0[0] << 16 | \
+     (Word_t)(PJP)->jp_DcdP0[1] <<  8 | \
+     (Word_t)(PJP)->jp_DcdP0[2])
+
+
+#define JU_JPSETADT(PJP,ADDR,DCDPOP0,TYPE)                      \
+{                                                               \
+    (PJP)->jp_Addr     = (ADDR);                                \
+    (PJP)->jp_DcdP0[0] = (uint8_t)((Word_t)(DCDPOP0) >> 16);    \
+    (PJP)->jp_DcdP0[1] = (uint8_t)((Word_t)(DCDPOP0) >>  8);    \
+    (PJP)->jp_DcdP0[2] = (uint8_t)((Word_t)(DCDPOP0));          \
+    (PJP)->jp_Type     = (TYPE);                                \
+}
+
+#endif  // 32 Bit
+
+// NUMBER OF BITS IN A BRANCH OR LEAF BITMAP AND SUBEXPANSE:
+//
+// Note:  cJU_BITSPERBITMAP must be the same as the number of JPs in a branch.
+
+#define cJU_BITSPERBITMAP cJU_SUBEXPPERSTATE
+
+// Bitmaps are accessed in units of "subexpanses":
+
+#define cJU_BITSPERSUBEXPB  (sizeof(BITMAPB_t) * cJU_BITSPERBYTE)
+#define cJU_NUMSUBEXPB      (cJU_BITSPERBITMAP / cJU_BITSPERSUBEXPB)
+
+#define cJU_BITSPERSUBEXPL  (sizeof(BITMAPL_t) * cJU_BITSPERBYTE)
+#define cJU_NUMSUBEXPL      (cJU_BITSPERBITMAP / cJU_BITSPERSUBEXPL)
+
+
+// MASK FOR A SPECIFIED BIT IN A BITMAP:
+//
+// Warning:  If BitNum is a variable, this results in a variable shift that is
+// expensive, at least on some processors.  Use with caution.
+//
+// Warning:  BitNum must be less than cJU_BITSPERWORD, that is, 0 ..
+// cJU_BITSPERWORD - 1, to avoid a truncated shift on some machines.
+//
+// TBD:  Perhaps use an array[32] of masks instead of calculating them.
+
+#define JU_BITPOSMASKB(BITNUM) ((Word_t)1 << ((BITNUM) % cJU_BITSPERSUBEXPB))
+#define JU_BITPOSMASKL(BITNUM) ((Word_t)1 << ((BITNUM) % cJU_BITSPERSUBEXPL))
+
+
+// TEST/SET/CLEAR A BIT IN A BITMAP LEAF:
+//
+// Test if a byte-sized Digit (portion of Index) has a corresponding bit set in
+// a bitmap, or set a byte-sized Digits bit into a bitmap, by looking up the
+// correct subexpanse and then checking/setting the correct bit.
+//
+// Note:  Mask higher bits, if any, for the convenience of the user of this
+// macro, in case they pass a full Index, not just a digit.  If the caller has
+// a true 8-bit digit, make it of type uint8_t and the compiler should skip the
+// unnecessary mask step.
+
+#define JU_SUBEXPL(DIGIT) (((DIGIT) / cJU_BITSPERSUBEXPL) & (cJU_NUMSUBEXPL-1))
+
+#define JU_BITMAPTESTL(PJLB, INDEX)  \
+    (JU_JLB_BITMAP(PJLB, JU_SUBEXPL(INDEX)) &  JU_BITPOSMASKL(INDEX))
+
+#define JU_BITMAPSETL(PJLB, INDEX)   \
+    (JU_JLB_BITMAP(PJLB, JU_SUBEXPL(INDEX)) |= JU_BITPOSMASKL(INDEX))
+
+#define JU_BITMAPCLEARL(PJLB, INDEX) \
+    (JU_JLB_BITMAP(PJLB, JU_SUBEXPL(INDEX)) ^= JU_BITPOSMASKL(INDEX))
+
+
+// MAP BITMAP BIT OFFSET TO DIGIT:
+//
+// Given a digit variable to set, a bitmap branch or leaf subexpanse (base 0),
+// the bitmap (BITMAP*_t) for that subexpanse, and an offset (Nth set bit in
+// the bitmap, base 0), compute the digit (also base 0) corresponding to the
+// subexpanse and offset by counting all bits in the bitmap until offset+1 set
+// bits are seen.  Avoid expensive variable shifts.  Offset should be less than
+// the number of set bits in the bitmap; assert this.
+//
+// If theres a better way to do this, I dont know what it is.
+
+#define JU_BITMAPDIGITB(DIGIT,SUBEXP,BITMAP,OFFSET)             \
+        {                                                       \
+            BITMAPB_t bitmap = (BITMAP); int remain = (OFFSET); \
+            (DIGIT) = (SUBEXP) * cJU_BITSPERSUBEXPB;            \
+                                                                \
+            while ((remain -= (bitmap & 1)) >= 0)               \
+            {                                                   \
+                bitmap >>= 1; ++(DIGIT);                        \
+                assert((DIGIT) < ((SUBEXP) + 1) * cJU_BITSPERSUBEXPB); \
+            }                                                   \
+        }
+
+#define JU_BITMAPDIGITL(DIGIT,SUBEXP,BITMAP,OFFSET)             \
+        {                                                       \
+            BITMAPL_t bitmap = (BITMAP); int remain = (OFFSET); \
+            (DIGIT) = (SUBEXP) * cJU_BITSPERSUBEXPL;            \
+                                                                \
+            while ((remain -= (bitmap & 1)) >= 0)               \
+            {                                                   \
+                bitmap >>= 1; ++(DIGIT);                        \
+                assert((DIGIT) < ((SUBEXP) + 1) * cJU_BITSPERSUBEXPL); \
+            }                                                   \
+        }
+
+
+// MASKS FOR PORTIONS OF 32-BIT WORDS:
+//
+// These are useful for bitmap subexpanses.
+//
+// "LOWER"/"HIGHER" means bits representing lower/higher-valued Indexes.  The
+// exact order of bits in the word is explicit here but is hidden from the
+// caller.
+//
+// "EXC" means exclusive of the specified bit; "INC" means inclusive.
+//
+// In each case, BitPos is either "JU_BITPOSMASK*(BitNum)", or a variable saved
+// from an earlier call of that macro; either way, it must be a 32-bit word
+// with a single bit set.  In the first case, assume the compiler is smart
+// enough to optimize out common subexpressions.
+//
+// The expressions depend on unsigned decimal math that should be universal.
+
+#define JU_MASKLOWEREXC( BITPOS)  ((BITPOS) - 1)
+#define JU_MASKLOWERINC( BITPOS)  (JU_MASKLOWEREXC(BITPOS) | (BITPOS))
+#define JU_MASKHIGHERINC(BITPOS)  (-(BITPOS))
+#define JU_MASKHIGHEREXC(BITPOS)  (JU_MASKHIGHERINC(BITPOS) ^ (BITPOS))
+
+
+// ****************************************************************************
+// SUPPORT FOR NATIVE INDEX SIZES
+// ****************************************************************************
+//
+// Copy a series of generic objects (uint8_t, uint16_t, uint32_t, Word_t) from
+// one place to another.
+
+#define JU_COPYMEM(PDST,PSRC,POP1)                      \
+    {                                                   \
+        Word_t i_ndex = 0;                              \
+        assert((POP1) > 0);                             \
+        do { (PDST)[i_ndex] = (PSRC)[i_ndex]; } \
+        while (++i_ndex < (POP1));                      \
+    }
+
+
+// ****************************************************************************
+// SUPPORT FOR NON-NATIVE INDEX SIZES
+// ****************************************************************************
+//
+// Copy a 3-byte Index pointed by a uint8_t * to a Word_t:
+//
+#define JU_COPY3_PINDEX_TO_LONG(DESTLONG,PINDEX)        \
+    DESTLONG  = (Word_t)(PINDEX)[0] << 16;              \
+    DESTLONG += (Word_t)(PINDEX)[1] <<  8;              \
+    DESTLONG += (Word_t)(PINDEX)[2]
+
+// Copy a Word_t to a 3-byte Index pointed at by a uint8_t *:
+
+#define JU_COPY3_LONG_TO_PINDEX(PINDEX,SOURCELONG)      \
+    (PINDEX)[0] = (uint8_t)((SOURCELONG) >> 16);        \
+    (PINDEX)[1] = (uint8_t)((SOURCELONG) >>  8);        \
+    (PINDEX)[2] = (uint8_t)((SOURCELONG))
+
+#ifdef JU_64BIT
+
+// Copy a 5-byte Index pointed by a uint8_t * to a Word_t:
+//
+#define JU_COPY5_PINDEX_TO_LONG(DESTLONG,PINDEX)        \
+    DESTLONG  = (Word_t)(PINDEX)[0] << 32;              \
+    DESTLONG += (Word_t)(PINDEX)[1] << 24;              \
+    DESTLONG += (Word_t)(PINDEX)[2] << 16;              \
+    DESTLONG += (Word_t)(PINDEX)[3] <<  8;              \
+    DESTLONG += (Word_t)(PINDEX)[4]
+
+// Copy a Word_t to a 5-byte Index pointed at by a uint8_t *:
+
+#define JU_COPY5_LONG_TO_PINDEX(PINDEX,SOURCELONG)      \
+    (PINDEX)[0] = (uint8_t)((SOURCELONG) >> 32);        \
+    (PINDEX)[1] = (uint8_t)((SOURCELONG) >> 24);        \
+    (PINDEX)[2] = (uint8_t)((SOURCELONG) >> 16);        \
+    (PINDEX)[3] = (uint8_t)((SOURCELONG) >>  8);        \
+    (PINDEX)[4] = (uint8_t)((SOURCELONG))
+
+// Copy a 6-byte Index pointed by a uint8_t * to a Word_t:
+//
+#define JU_COPY6_PINDEX_TO_LONG(DESTLONG,PINDEX)        \
+    DESTLONG  = (Word_t)(PINDEX)[0] << 40;              \
+    DESTLONG += (Word_t)(PINDEX)[1] << 32;              \
+    DESTLONG += (Word_t)(PINDEX)[2] << 24;              \
+    DESTLONG += (Word_t)(PINDEX)[3] << 16;              \
+    DESTLONG += (Word_t)(PINDEX)[4] <<  8;              \
+    DESTLONG += (Word_t)(PINDEX)[5]
+
+// Copy a Word_t to a 6-byte Index pointed at by a uint8_t *:
+
+#define JU_COPY6_LONG_TO_PINDEX(PINDEX,SOURCELONG)      \
+    (PINDEX)[0] = (uint8_t)((SOURCELONG) >> 40);        \
+    (PINDEX)[1] = (uint8_t)((SOURCELONG) >> 32);        \
+    (PINDEX)[2] = (uint8_t)((SOURCELONG) >> 24);        \
+    (PINDEX)[3] = (uint8_t)((SOURCELONG) >> 16);        \
+    (PINDEX)[4] = (uint8_t)((SOURCELONG) >>  8);        \
+    (PINDEX)[5] = (uint8_t)((SOURCELONG))
+
+// Copy a 7-byte Index pointed by a uint8_t * to a Word_t:
+//
+#define JU_COPY7_PINDEX_TO_LONG(DESTLONG,PINDEX)        \
+    DESTLONG  = (Word_t)(PINDEX)[0] << 48;              \
+    DESTLONG += (Word_t)(PINDEX)[1] << 40;              \
+    DESTLONG += (Word_t)(PINDEX)[2] << 32;              \
+    DESTLONG += (Word_t)(PINDEX)[3] << 24;              \
+    DESTLONG += (Word_t)(PINDEX)[4] << 16;              \
+    DESTLONG += (Word_t)(PINDEX)[5] <<  8;              \
+    DESTLONG += (Word_t)(PINDEX)[6]
+
+// Copy a Word_t to a 7-byte Index pointed at by a uint8_t *:
+
+#define JU_COPY7_LONG_TO_PINDEX(PINDEX,SOURCELONG)      \
+    (PINDEX)[0] = (uint8_t)((SOURCELONG) >> 48);        \
+    (PINDEX)[1] = (uint8_t)((SOURCELONG) >> 40);        \
+    (PINDEX)[2] = (uint8_t)((SOURCELONG) >> 32);        \
+    (PINDEX)[3] = (uint8_t)((SOURCELONG) >> 24);        \
+    (PINDEX)[4] = (uint8_t)((SOURCELONG) >> 16);        \
+    (PINDEX)[5] = (uint8_t)((SOURCELONG) >>  8);        \
+    (PINDEX)[6] = (uint8_t)((SOURCELONG))
+
+#endif // JU_64BIT
+
+// ****************************************************************************
+// COMMON CODE FRAGMENTS (MACROS)
+// ****************************************************************************
+//
+// These code chunks are shared between various source files.
+
+
+// SET (REPLACE) ONE DIGIT IN AN INDEX:
+//
+// To avoid endian issues, use masking and ORing, which operates in a
+// big-endian register, rather than treating the Index as an array of bytes,
+// though that would be simpler, but would operate in endian-specific memory.
+//
+// TBD:  This contains two variable shifts, is that bad?
+
+#define JU_SETDIGIT(INDEX,DIGIT,STATE)                  \
+        (INDEX) = ((INDEX) & (~cJU_MASKATSTATE(STATE))) \
+                           | (((Word_t) (DIGIT))        \
+                              << (((STATE) - 1) * cJU_BITSPERBYTE))
+
+// Fast version for single LSB:
+
+#define JU_SETDIGIT1(INDEX,DIGIT) (INDEX) = ((INDEX) & ~0xff) | (DIGIT)
+
+
+// SET (REPLACE) "N" LEAST DIGITS IN AN INDEX:
+
+#define JU_SETDIGITS(INDEX,INDEX2,cSTATE) \
+        (INDEX) = ((INDEX ) & (~JU_LEASTBYTESMASK(cSTATE))) \
+                | ((INDEX2) & ( JU_LEASTBYTESMASK(cSTATE)))
+
+// COPY DECODE BYTES FROM JP TO INDEX:
+//
+// Modify Index digit(s) to match the bytes in jp_DcdPopO in case one or more
+// branches are skipped and the digits are significant.  Its probably faster
+// to just do this unconditionally than to check if its necessary.
+//
+// To avoid endian issues, use masking and ORing, which operates in a
+// big-endian register, rather than treating the Index as an array of bytes,
+// though that would be simpler, but would operate in endian-specific memory.
+//
+// WARNING:  Must not call JU_LEASTBYTESMASK (via cJU_DCDMASK) with Bytes =
+// cJU_ROOTSTATE or a bad mask is generated, but there are no Dcd bytes to copy
+// in this case anyway.  In fact there are no Dcd bytes unless State <
+// cJU_ROOTSTATE - 1, so dont call this macro except in those cases.
+//
+// TBD:  It would be nice to validate jp_DcdPopO against known digits to ensure
+// no corruption, but this is non-trivial.
+
+#define JU_SETDCD(INDEX,PJP,cSTATE)                             \
+    (INDEX) = ((INDEX) & ~cJU_DCDMASK(cSTATE))                  \
+                | (JU_JPDCDPOP0(PJP) & cJU_DCDMASK(cSTATE))
+
+// INSERT/DELETE AN INDEX IN-PLACE IN MEMORY:
+//
+// Given a pointer to an array of "even" (native), same-sized objects
+// (indexes), the current population of the array, an offset in the array, and
+// a new Index to insert, "shift up" the array elements (Indexes) above the
+// insertion point and insert the new Index.  Assume there is sufficient memory
+// to do this.
+//
+// In these macros, "i_offset" is an index offset, and "b_off" is a byte
+// offset for odd Index sizes.
+//
+// Note:  Endian issues only arise fro insertion, not deletion, and even for
+// insertion, they are transparent when native (even) objects are used, and
+// handled explicitly for odd (non-native) Index sizes.
+//
+// Note:  The following macros are tricky enough that there is some test code
+// for them appended to this file.
+
+#define JU_INSERTINPLACE(PARRAY,POP1,OFFSET,INDEX)              \
+        assert((long) (POP1) > 0);                              \
+        assert((Word_t) (OFFSET) <= (Word_t) (POP1));           \
+        {                                                       \
+            Word_t i_offset = (POP1);                           \
+                                                                \
+            while (i_offset-- > (OFFSET))                       \
+                (PARRAY)[i_offset + 1] = (PARRAY)[i_offset];    \
+                                                                \
+            (PARRAY)[OFFSET] = (INDEX);                         \
+        }
+
+
+// Variation for non-native Indexes, where cIS = Index Size
+// and PByte must point to a uint8_t (byte); shift byte-by-byte:
+//
+
+#define JU_INSERTINPLACE3(PBYTE,POP1,OFFSET,INDEX)              \
+{                                                               \
+    Word_t i_off = POP1;                                        \
+                                                                \
+    while (i_off-- > (OFFSET))                                  \
+    {                                                           \
+        Word_t  i_dx = i_off * 3;                               \
+        (PBYTE)[i_dx + 0 + 3] = (PBYTE)[i_dx + 0];              \
+        (PBYTE)[i_dx + 1 + 3] = (PBYTE)[i_dx + 1];              \
+        (PBYTE)[i_dx + 2 + 3] = (PBYTE)[i_dx + 2];              \
+    }                                                           \
+    JU_COPY3_LONG_TO_PINDEX(&((PBYTE)[(OFFSET) * 3]), INDEX);   \
+}
+
+#ifdef JU_64BIT
+
+#define JU_INSERTINPLACE5(PBYTE,POP1,OFFSET,INDEX)              \
+{                                                               \
+    Word_t i_off = POP1;                                        \
+                                                                \
+    while (i_off-- > (OFFSET))                                  \
+    {                                                           \
+        Word_t  i_dx = i_off * 5;                               \
+        (PBYTE)[i_dx + 0 + 5] = (PBYTE)[i_dx + 0];              \
+        (PBYTE)[i_dx + 1 + 5] = (PBYTE)[i_dx + 1];              \
+        (PBYTE)[i_dx + 2 + 5] = (PBYTE)[i_dx + 2];              \
+        (PBYTE)[i_dx + 3 + 5] = (PBYTE)[i_dx + 3];              \
+        (PBYTE)[i_dx + 4 + 5] = (PBYTE)[i_dx + 4];              \
+    }                                                           \
+    JU_COPY5_LONG_TO_PINDEX(&((PBYTE)[(OFFSET) * 5]), INDEX);   \
+}
+
+#define JU_INSERTINPLACE6(PBYTE,POP1,OFFSET,INDEX)              \
+{                                                               \
+    Word_t i_off = POP1;                                        \
+                                                                \
+    while (i_off-- > (OFFSET))                                  \
+    {                                                           \
+        Word_t  i_dx = i_off * 6;                               \
+        (PBYTE)[i_dx + 0 + 6] = (PBYTE)[i_dx + 0];              \
+        (PBYTE)[i_dx + 1 + 6] = (PBYTE)[i_dx + 1];              \
+        (PBYTE)[i_dx + 2 + 6] = (PBYTE)[i_dx + 2];              \
+        (PBYTE)[i_dx + 3 + 6] = (PBYTE)[i_dx + 3];              \
+        (PBYTE)[i_dx + 4 + 6] = (PBYTE)[i_dx + 4];              \
+        (PBYTE)[i_dx + 5 + 6] = (PBYTE)[i_dx + 5];              \
+    }                                                           \
+    JU_COPY6_LONG_TO_PINDEX(&((PBYTE)[(OFFSET) * 6]), INDEX);   \
+}
+
+#define JU_INSERTINPLACE7(PBYTE,POP1,OFFSET,INDEX)              \
+{                                                               \
+    Word_t i_off = POP1;                                        \
+                                                                \
+    while (i_off-- > (OFFSET))                                  \
+    {                                                           \
+        Word_t  i_dx = i_off * 7;                               \
+        (PBYTE)[i_dx + 0 + 7] = (PBYTE)[i_dx + 0];              \
+        (PBYTE)[i_dx + 1 + 7] = (PBYTE)[i_dx + 1];              \
+        (PBYTE)[i_dx + 2 + 7] = (PBYTE)[i_dx + 2];              \
+        (PBYTE)[i_dx + 3 + 7] = (PBYTE)[i_dx + 3];              \
+        (PBYTE)[i_dx + 4 + 7] = (PBYTE)[i_dx + 4];              \
+        (PBYTE)[i_dx + 5 + 7] = (PBYTE)[i_dx + 5];              \
+        (PBYTE)[i_dx + 6 + 7] = (PBYTE)[i_dx + 6];              \
+    }                                                           \
+    JU_COPY7_LONG_TO_PINDEX(&((PBYTE)[(OFFSET) * 7]), INDEX);   \
+}
+#endif // JU_64BIT
+
+// Counterparts to the above for deleting an Index:
+//
+// "Shift down" the array elements starting at the Index to be deleted.
+
+#define JU_DELETEINPLACE(PARRAY,POP1,OFFSET,IGNORE)             \
+        assert((long) (POP1) > 0);                              \
+        assert((Word_t) (OFFSET) < (Word_t) (POP1));            \
+        {                                                       \
+            Word_t i_offset = (OFFSET);                         \
+                                                                \
+            while (++i_offset < (POP1))                         \
+                (PARRAY)[i_offset - 1] = (PARRAY)[i_offset];    \
+        }
+
+// Variation for odd-byte-sized (non-native) Indexes, where cIS = Index Size
+// and PByte must point to a uint8_t (byte); copy byte-by-byte:
+//
+// Note:  If cIS == 1, JU_DELETEINPLACE_ODD == JU_DELETEINPLACE.
+//
+// Note:  There are no endian issues here because bytes are just shifted as-is,
+// not converted to/from an Index.
+
+#define JU_DELETEINPLACE_ODD(PBYTE,POP1,OFFSET,cIS)             \
+        assert((long) (POP1) > 0);                              \
+        assert((Word_t) (OFFSET) < (Word_t) (POP1));            \
+        {                                                       \
+            Word_t b_off = (((OFFSET) + 1) * (cIS)) - 1;        \
+                                                                \
+            while (++b_off < ((POP1) * (cIS)))                  \
+                (PBYTE)[b_off - (cIS)] = (PBYTE)[b_off];        \
+        }
+
+
+// INSERT/DELETE AN INDEX WHILE COPYING OTHERS:
+//
+// Copy PSource[] to PDest[], where PSource[] has Pop1 elements (Indexes),
+// inserting Index at PDest[Offset].  Unlike JU_*INPLACE*() above, these macros
+// are used when moving Indexes from one memory object to another.
+
+#define JU_INSERTCOPY(PDEST,PSOURCE,POP1,OFFSET,INDEX)          \
+        assert((long) (POP1) > 0);                              \
+        assert((Word_t) (OFFSET) <= (Word_t) (POP1));           \
+        {                                                       \
+            Word_t i_offset;                                    \
+                                                                \
+            for (i_offset = 0; i_offset < (OFFSET); ++i_offset) \
+                (PDEST)[i_offset] = (PSOURCE)[i_offset];        \
+                                                                \
+            (PDEST)[i_offset] = (INDEX);                        \
+                                                                \
+            for (/* null */; i_offset < (POP1); ++i_offset)     \
+                (PDEST)[i_offset + 1] = (PSOURCE)[i_offset];    \
+        }
+
+#define JU_INSERTCOPY3(PDEST,PSOURCE,POP1,OFFSET,INDEX)         \
+assert((long) (POP1) > 0);                                      \
+assert((Word_t) (OFFSET) <= (Word_t) (POP1));                   \
+{                                                               \
+    Word_t o_ff;                                                \
+                                                                \
+    for (o_ff = 0; o_ff < (OFFSET); o_ff++)                     \
+    {                                                           \
+        Word_t  i_dx = o_ff * 3;                                \
+        (PDEST)[i_dx + 0] = (PSOURCE)[i_dx + 0];                \
+        (PDEST)[i_dx + 1] = (PSOURCE)[i_dx + 1];                \
+        (PDEST)[i_dx + 2] = (PSOURCE)[i_dx + 2];                \
+    }                                                           \
+    JU_COPY3_LONG_TO_PINDEX(&((PDEST)[(OFFSET) * 3]), INDEX);   \
+                                                                \
+    for (/* null */; o_ff < (POP1); o_ff++)                     \
+    {                                                           \
+        Word_t  i_dx = o_ff * 3;                                \
+        (PDEST)[i_dx + 0 + 3] = (PSOURCE)[i_dx + 0];            \
+        (PDEST)[i_dx + 1 + 3] = (PSOURCE)[i_dx + 1];            \
+        (PDEST)[i_dx + 2 + 3] = (PSOURCE)[i_dx + 2];            \
+    }                                                           \
+}
+
+#ifdef JU_64BIT
+
+#define JU_INSERTCOPY5(PDEST,PSOURCE,POP1,OFFSET,INDEX)         \
+assert((long) (POP1) > 0);                                      \
+assert((Word_t) (OFFSET) <= (Word_t) (POP1));                   \
+{                                                               \
+    Word_t o_ff;                                                \
+                                                                \
+    for (o_ff = 0; o_ff < (OFFSET); o_ff++)                     \
+    {                                                           \
+        Word_t  i_dx = o_ff * 5;                                \
+        (PDEST)[i_dx + 0] = (PSOURCE)[i_dx + 0];                \
+        (PDEST)[i_dx + 1] = (PSOURCE)[i_dx + 1];                \
+        (PDEST)[i_dx + 2] = (PSOURCE)[i_dx + 2];                \
+        (PDEST)[i_dx + 3] = (PSOURCE)[i_dx + 3];                \
+        (PDEST)[i_dx + 4] = (PSOURCE)[i_dx + 4];                \
+    }                                                           \
+    JU_COPY5_LONG_TO_PINDEX(&((PDEST)[(OFFSET) * 5]), INDEX);   \
+                                                                \
+    for (/* null */; o_ff < (POP1); o_ff++)                     \
+    {                                                           \
+        Word_t  i_dx = o_ff * 5;                                \
+        (PDEST)[i_dx + 0 + 5] = (PSOURCE)[i_dx + 0];            \
+        (PDEST)[i_dx + 1 + 5] = (PSOURCE)[i_dx + 1];            \
+        (PDEST)[i_dx + 2 + 5] = (PSOURCE)[i_dx + 2];            \
+        (PDEST)[i_dx + 3 + 5] = (PSOURCE)[i_dx + 3];            \
+        (PDEST)[i_dx + 4 + 5] = (PSOURCE)[i_dx + 4];            \
+    }                                                           \
+}
+
+#define JU_INSERTCOPY6(PDEST,PSOURCE,POP1,OFFSET,INDEX)         \
+assert((long) (POP1) > 0);                                      \
+assert((Word_t) (OFFSET) <= (Word_t) (POP1));                   \
+{                                                               \
+    Word_t o_ff;                                                \
+                                                                \
+    for (o_ff = 0; o_ff < (OFFSET); o_ff++)                     \
+    {                                                           \
+        Word_t  i_dx = o_ff * 6;                                \
+        (PDEST)[i_dx + 0] = (PSOURCE)[i_dx + 0];                \
+        (PDEST)[i_dx + 1] = (PSOURCE)[i_dx + 1];                \
+        (PDEST)[i_dx + 2] = (PSOURCE)[i_dx + 2];                \
+        (PDEST)[i_dx + 3] = (PSOURCE)[i_dx + 3];                \
+        (PDEST)[i_dx + 4] = (PSOURCE)[i_dx + 4];                \
+        (PDEST)[i_dx + 5] = (PSOURCE)[i_dx + 5];                \
+    }                                                           \
+    JU_COPY6_LONG_TO_PINDEX(&((PDEST)[(OFFSET) * 6]), INDEX);   \
+                                                                \
+    for (/* null */; o_ff < (POP1); o_ff++)                     \
+    {                                                           \
+        Word_t  i_dx = o_ff * 6;                                \
+        (PDEST)[i_dx + 0 + 6] = (PSOURCE)[i_dx + 0];            \
+        (PDEST)[i_dx + 1 + 6] = (PSOURCE)[i_dx + 1];            \
+        (PDEST)[i_dx + 2 + 6] = (PSOURCE)[i_dx + 2];            \
+        (PDEST)[i_dx + 3 + 6] = (PSOURCE)[i_dx + 3];            \
+        (PDEST)[i_dx + 4 + 6] = (PSOURCE)[i_dx + 4];            \
+        (PDEST)[i_dx + 5 + 6] = (PSOURCE)[i_dx + 5];            \
+    }                                                           \
+}
+
+#define JU_INSERTCOPY7(PDEST,PSOURCE,POP1,OFFSET,INDEX)         \
+assert((long) (POP1) > 0);                                      \
+assert((Word_t) (OFFSET) <= (Word_t) (POP1));                   \
+{                                                               \
+    Word_t o_ff;                                                \
+                                                                \
+    for (o_ff = 0; o_ff < (OFFSET); o_ff++)                     \
+    {                                                           \
+        Word_t  i_dx = o_ff * 7;                                \
+        (PDEST)[i_dx + 0] = (PSOURCE)[i_dx + 0];                \
+        (PDEST)[i_dx + 1] = (PSOURCE)[i_dx + 1];                \
+        (PDEST)[i_dx + 2] = (PSOURCE)[i_dx + 2];                \
+        (PDEST)[i_dx + 3] = (PSOURCE)[i_dx + 3];                \
+        (PDEST)[i_dx + 4] = (PSOURCE)[i_dx + 4];                \
+        (PDEST)[i_dx + 5] = (PSOURCE)[i_dx + 5];                \
+        (PDEST)[i_dx + 6] = (PSOURCE)[i_dx + 6];                \
+    }                                                           \
+    JU_COPY7_LONG_TO_PINDEX(&((PDEST)[(OFFSET) * 7]), INDEX);   \
+                                                                \
+    for (/* null */; o_ff < (POP1); o_ff++)                     \
+    {                                                           \
+        Word_t  i_dx = o_ff * 7;                                \
+        (PDEST)[i_dx + 0 + 7] = (PSOURCE)[i_dx + 0];            \
+        (PDEST)[i_dx + 1 + 7] = (PSOURCE)[i_dx + 1];            \
+        (PDEST)[i_dx + 2 + 7] = (PSOURCE)[i_dx + 2];            \
+        (PDEST)[i_dx + 3 + 7] = (PSOURCE)[i_dx + 3];            \
+        (PDEST)[i_dx + 4 + 7] = (PSOURCE)[i_dx + 4];            \
+        (PDEST)[i_dx + 5 + 7] = (PSOURCE)[i_dx + 5];            \
+        (PDEST)[i_dx + 6 + 7] = (PSOURCE)[i_dx + 6];            \
+    }                                                           \
+}
+
+#endif // JU_64BIT
+
+// Counterparts to the above for deleting an Index:
+
+#define JU_DELETECOPY(PDEST,PSOURCE,POP1,OFFSET,IGNORE)         \
+        assert((long) (POP1) > 0);                              \
+        assert((Word_t) (OFFSET) < (Word_t) (POP1));            \
+        {                                                       \
+            Word_t i_offset;                                    \
+                                                                \
+            for (i_offset = 0; i_offset < (OFFSET); ++i_offset) \
+                (PDEST)[i_offset] = (PSOURCE)[i_offset];        \
+                                                                \
+            for (++i_offset; i_offset < (POP1); ++i_offset)     \
+                (PDEST)[i_offset - 1] = (PSOURCE)[i_offset];    \
+        }
+
+// Variation for odd-byte-sized (non-native) Indexes, where cIS = Index Size;
+// copy byte-by-byte:
+//
+// Note:  There are no endian issues here because bytes are just shifted as-is,
+// not converted to/from an Index.
+//
+// Note:  If cIS == 1, JU_DELETECOPY_ODD == JU_DELETECOPY, at least in concept.
+
+#define JU_DELETECOPY_ODD(PDEST,PSOURCE,POP1,OFFSET,cIS)                \
+        assert((long) (POP1) > 0);                                      \
+        assert((Word_t) (OFFSET) < (Word_t) (POP1));                    \
+        {                                                               \
+            uint8_t *_Pdest   = (uint8_t *) (PDEST);                    \
+            uint8_t *_Psource = (uint8_t *) (PSOURCE);                  \
+            Word_t   b_off;                                             \
+                                                                        \
+            for (b_off = 0; b_off < ((OFFSET) * (cIS)); ++b_off)        \
+                *_Pdest++ = *_Psource++;                                \
+                                                                        \
+            _Psource += (cIS);                                          \
+                                                                        \
+            for (b_off += (cIS); b_off < ((POP1) * (cIS)); ++b_off)     \
+                *_Pdest++ = *_Psource++;                                \
+        }
+
+
+// GENERIC RETURN CODE HANDLING FOR JUDY1 (NO VALUE AREAS) AND JUDYL (VALUE
+// AREAS):
+//
+// This common code hides Judy1 versus JudyL details of how to return various
+// conditions, including a pointer to a value area for JudyL.
+//
+// First, define an internal variation of JERR called JERRI (I = int) to make
+// lint happy.  We accidentally shipped to 11.11 OEUR with all functions that
+// return int or Word_t using JERR, which is type Word_t, for errors.  Lint
+// complains about this for functions that return int.  So, internally use
+// JERRI for error returns from the int functions.  Experiments show that
+// callers which compare int Foo() to (Word_t) JERR (~0UL) are OK, since JERRI
+// sign-extends to match JERR.
+
+#define JERRI ((int) ~0)                // see above.
+
+#ifdef JUDY1
+
+#define JU_RET_FOUND    return(1)
+#define JU_RET_NOTFOUND return(0)
+
+// For Judy1, these all "fall through" to simply JU_RET_FOUND, since there is no
+// value area pointer to return:
+
+#define JU_RET_FOUND_LEAFW(PJLW,POP1,OFFSET)    JU_RET_FOUND
+
+#define JU_RET_FOUND_JPM(Pjpm)                  JU_RET_FOUND
+#define JU_RET_FOUND_PVALUE(Pjv,OFFSET)         JU_RET_FOUND
+#ifndef JU_64BIT
+#define JU_RET_FOUND_LEAF1(Pjll,POP1,OFFSET)    JU_RET_FOUND
+#endif
+#define JU_RET_FOUND_LEAF2(Pjll,POP1,OFFSET)    JU_RET_FOUND
+#define JU_RET_FOUND_LEAF3(Pjll,POP1,OFFSET)    JU_RET_FOUND
+#ifdef JU_64BIT
+#define JU_RET_FOUND_LEAF4(Pjll,POP1,OFFSET)    JU_RET_FOUND
+#define JU_RET_FOUND_LEAF5(Pjll,POP1,OFFSET)    JU_RET_FOUND
+#define JU_RET_FOUND_LEAF6(Pjll,POP1,OFFSET)    JU_RET_FOUND
+#define JU_RET_FOUND_LEAF7(Pjll,POP1,OFFSET)    JU_RET_FOUND
+#endif
+#define JU_RET_FOUND_IMM_01(Pjp)                JU_RET_FOUND
+#define JU_RET_FOUND_IMM(Pjp,OFFSET)            JU_RET_FOUND
+
+// Note:  No JudyL equivalent:
+
+#define JU_RET_FOUND_FULLPOPU1                   JU_RET_FOUND
+#define JU_RET_FOUND_LEAF_B1(PJLB,SUBEXP,OFFSET) JU_RET_FOUND
+
+#else // JUDYL
+
+//      JU_RET_FOUND            // see below; must NOT be defined for JudyL.
+#define JU_RET_NOTFOUND return((PPvoid_t) NULL)
+
+// For JudyL, the location of the value area depends on the JP type and other
+// factors:
+//
+// TBD:  The value areas should be accessed via data structures, here and in
+// Dougs code, not by hard-coded address calculations.
+//
+// This is useful in insert/delete code when the value area is returned from
+// lower levels in the JPM:
+
+#define JU_RET_FOUND_JPM(Pjpm)  return((PPvoid_t) ((Pjpm)->jpm_PValue))
+
+// This is useful in insert/delete code when the value area location is already
+// computed:
+
+#define JU_RET_FOUND_PVALUE(Pjv,OFFSET) return((PPvoid_t) ((Pjv) + OFFSET))
+
+#define JU_RET_FOUND_LEAFW(PJLW,POP1,OFFSET) \
+                return((PPvoid_t) (JL_LEAFWVALUEAREA(PJLW, POP1) + (OFFSET)))
+
+#define JU_RET_FOUND_LEAF1(Pjll,POP1,OFFSET) \
+                return((PPvoid_t) (JL_LEAF1VALUEAREA(Pjll, POP1) + (OFFSET)))
+#define JU_RET_FOUND_LEAF2(Pjll,POP1,OFFSET) \
+                return((PPvoid_t) (JL_LEAF2VALUEAREA(Pjll, POP1) + (OFFSET)))
+#define JU_RET_FOUND_LEAF3(Pjll,POP1,OFFSET) \
+                return((PPvoid_t) (JL_LEAF3VALUEAREA(Pjll, POP1) + (OFFSET)))
+#ifdef JU_64BIT
+#define JU_RET_FOUND_LEAF4(Pjll,POP1,OFFSET) \
+                return((PPvoid_t) (JL_LEAF4VALUEAREA(Pjll, POP1) + (OFFSET)))
+#define JU_RET_FOUND_LEAF5(Pjll,POP1,OFFSET) \
+                return((PPvoid_t) (JL_LEAF5VALUEAREA(Pjll, POP1) + (OFFSET)))
+#define JU_RET_FOUND_LEAF6(Pjll,POP1,OFFSET) \
+                return((PPvoid_t) (JL_LEAF6VALUEAREA(Pjll, POP1) + (OFFSET)))
+#define JU_RET_FOUND_LEAF7(Pjll,POP1,OFFSET) \
+                return((PPvoid_t) (JL_LEAF7VALUEAREA(Pjll, POP1) + (OFFSET)))
+#endif
+
+// Note:  Here jp_Addr is a value area itself and not an address, so P_JV() is
+// not needed:
+
+#define JU_RET_FOUND_IMM_01(PJP)  return((PPvoid_t) (&((PJP)->jp_Addr)))
+
+// Note:  Here jp_Addr is a pointer to a separately-mallocd value area, so
+// P_JV() is required; likewise for JL_JLB_PVALUE:
+
+#define JU_RET_FOUND_IMM(PJP,OFFSET) \
+            return((PPvoid_t) (P_JV((PJP)->jp_Addr) + (OFFSET)))
+
+#define JU_RET_FOUND_LEAF_B1(PJLB,SUBEXP,OFFSET) \
+            return((PPvoid_t) (P_JV(JL_JLB_PVALUE(PJLB, SUBEXP)) + (OFFSET)))
+
+#endif // JUDYL
+
+
+// GENERIC ERROR HANDLING:
+//
+// This is complicated by variations in the needs of the callers of these
+// macros.  Only use JU_SET_ERRNO() for PJError, because it can be null; use
+// JU_SET_ERRNO_NONNULL() for Pjpm, which is never null, and also in other
+// cases where the pointer is known not to be null (to save dead branches).
+//
+// Note:  Most cases of JU_ERRNO_OVERRUN or JU_ERRNO_CORRUPT should result in
+// an assertion failure in debug code, so they are more likely to be caught, so
+// do that here in each macro.
+
+#define JU_SET_ERRNO(PJError, JErrno)                   \
+        {                                               \
+            assert((JErrno) != JU_ERRNO_OVERRUN);       \
+            assert((JErrno) != JU_ERRNO_CORRUPT);       \
+                                                        \
+            if (PJError != (PJError_t) NULL)            \
+            {                                           \
+                JU_ERRNO(PJError) = (JErrno);           \
+                JU_ERRID(PJError) = __LINE__;           \
+            }                                           \
+        }
+
+// Variation for callers who know already that PJError is non-null; and, it can
+// also be Pjpm (both PJError_t and Pjpm_t have je_* fields), so only assert it
+// for null, not cast to any specific pointer type:
+
+#define JU_SET_ERRNO_NONNULL(PJError, JErrno)           \
+        {                                               \
+            assert((JErrno) != JU_ERRNO_OVERRUN);       \
+            assert((JErrno) != JU_ERRNO_CORRUPT);       \
+            assert(PJError);                            \
+                                                        \
+            JU_ERRNO(PJError) = (JErrno);               \
+            JU_ERRID(PJError) = __LINE__;               \
+        }
+
+// Variation to copy error info from a (required) JPM to an (optional)
+// PJError_t:
+//
+// Note:  The assertions above about JU_ERRNO_OVERRUN and JU_ERRNO_CORRUPT
+// should have already popped, so they are not needed here.
+
+#define JU_COPY_ERRNO(PJError, Pjpm)                            \
+        {                                                       \
+            if (PJError)                                        \
+            {                                                   \
+                JU_ERRNO(PJError) = (uint8_t)JU_ERRNO(Pjpm);    \
+                JU_ERRID(PJError) = JU_ERRID(Pjpm);             \
+            }                                                   \
+        }
+
+// For JErrno parameter to previous macros upon return from Judy*Alloc*():
+//
+// The memory allocator returns an address of 0 for out of memory,
+// 1..sizeof(Word_t)-1 for corruption (an invalid pointer), otherwise a valid
+// pointer.
+
+#define JU_ALLOC_ERRNO(ADDR) \
+        (((void *) (ADDR) != (void *) NULL) ? JU_ERRNO_OVERRUN : JU_ERRNO_NOMEM)
+
+#define JU_CHECKALLOC(Type,Ptr,Retval)                  \
+        if ((Ptr) < (Type) sizeof(Word_t))              \
+        {                                               \
+            JU_SET_ERRNO(PJError, JU_ALLOC_ERRNO(Ptr)); \
+            return(Retval);                             \
+        }
+
+// Leaf search routines
+
+#ifdef JU_NOINLINE
+
+int j__udySearchLeaf1(Pjll_t Pjll, Word_t LeafPop1, Word_t Index);
+int j__udySearchLeaf2(Pjll_t Pjll, Word_t LeafPop1, Word_t Index);
+int j__udySearchLeaf3(Pjll_t Pjll, Word_t LeafPop1, Word_t Index);
+
+#ifdef JU_64BIT
+
+int j__udySearchLeaf4(Pjll_t Pjll, Word_t LeafPop1, Word_t Index);
+int j__udySearchLeaf5(Pjll_t Pjll, Word_t LeafPop1, Word_t Index);
+int j__udySearchLeaf6(Pjll_t Pjll, Word_t LeafPop1, Word_t Index);
+int j__udySearchLeaf7(Pjll_t Pjll, Word_t LeafPop1, Word_t Index);
+
+#endif // JU_64BIT
+
+int j__udySearchLeafW(Pjlw_t Pjlw, Word_t LeafPop1, Word_t Index);
+
+#else  // complier support for inline
+
+#ifdef JU_WIN
+static __inline int j__udySearchLeaf1(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#else
+static inline int j__udySearchLeaf1(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#endif
+{ SEARCHLEAFNATIVE(uint8_t,  Pjll, LeafPop1, Index); }
+
+#ifdef JU_WIN
+static __inline int j__udySearchLeaf2(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#else
+static inline int j__udySearchLeaf2(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#endif
+{ SEARCHLEAFNATIVE(uint16_t, Pjll, LeafPop1, Index); }
+
+#ifdef JU_WIN
+static __inline int j__udySearchLeaf3(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#else
+static inline int j__udySearchLeaf3(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#endif
+{ SEARCHLEAFNONNAT(Pjll, LeafPop1, Index, 3, JU_COPY3_PINDEX_TO_LONG); }
+
+#ifdef JU_64BIT
+
+#ifdef JU_WIN
+static __inline int j__udySearchLeaf4(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#else
+static inline int j__udySearchLeaf4(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#endif
+{ SEARCHLEAFNATIVE(uint32_t, Pjll, LeafPop1, Index); }
+
+#ifdef JU_WIN
+static __inline int j__udySearchLeaf5(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#else
+static inline int j__udySearchLeaf5(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#endif
+{ SEARCHLEAFNONNAT(Pjll, LeafPop1, Index, 5, JU_COPY5_PINDEX_TO_LONG); }
+
+#ifdef JU_WIN
+static __inline int j__udySearchLeaf6(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#else
+static inline int j__udySearchLeaf6(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#endif
+{ SEARCHLEAFNONNAT(Pjll, LeafPop1, Index, 6, JU_COPY6_PINDEX_TO_LONG); }
+
+#ifdef JU_WIN
+static __inline int j__udySearchLeaf7(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#else
+static inline int j__udySearchLeaf7(Pjll_t Pjll, Word_t LeafPop1, Word_t Index)
+#endif
+{ SEARCHLEAFNONNAT(Pjll, LeafPop1, Index, 7, JU_COPY7_PINDEX_TO_LONG); }
+
+#endif // JU_64BIT
+
+#ifdef JU_WIN
+static __inline int j__udySearchLeafW(Pjlw_t Pjlw, Word_t LeafPop1, Word_t Index)
+#else
+static inline int j__udySearchLeafW(Pjlw_t Pjlw, Word_t LeafPop1, Word_t Index)
+#endif
+{ SEARCHLEAFNATIVE(Word_t, Pjlw, LeafPop1, Index); }
+
+#endif // compiler support for inline
+
+#endif // ! _JUDYPRIVATE_INCLUDED
diff --git a/libs/klib/judy/JudyPrivate1L.h b/libs/klib/judy/JudyPrivate1L.h
new file mode 100644
index 0000000..5b9591f
--- /dev/null
+++ b/libs/klib/judy/JudyPrivate1L.h
@@ -0,0 +1,483 @@
+#ifndef _JUDYPRIVATE1L_INCLUDED
+#define	_JUDYPRIVATE1L_INCLUDED
+// _________________
+//
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// ****************************************************************************
+// Declare common cJU_* names for JP Types that occur in both Judy1 and JudyL,
+// for use by code that ifdefs JUDY1 and JUDYL.  Only JP Types common to both
+// Judy1 and JudyL are #defined here with equivalent cJU_* names.  JP Types
+// unique to only Judy1 or JudyL are listed in comments, so the type lists
+// match the Judy1.h and JudyL.h files.
+//
+// This file also defines cJU_* for other JP-related constants and functions
+// that some shared JUDY1/JUDYL code finds handy.
+//
+// At least in principle this file should be included AFTER Judy1.h or JudyL.h.
+//
+// WARNING:  This file must be kept consistent with the enums in Judy1.h and
+// JudyL.h.
+//
+// TBD:  You might think, why not define common cJU_* enums in, say,
+// JudyPrivate.h, and then inherit them into superset enums in Judy1.h and
+// JudyL.h?  The problem is that the enum lists for each class (cJ1_* and
+// cJL_*) must be numerically "packed" into the correct order, for two reasons:
+// (1) allow the compiler to generate "tight" switch statements with no wasted
+// slots (although this is not very big), and (2) allow calculations using the
+// enum values, although this is also not an issue if the calculations are only
+// within each cJ*_JPIMMED_*_* class and the members are packed within the
+// class.
+
+#ifdef JUDY1
+
+#define	cJU_JRPNULL		cJ1_JRPNULL
+#define	cJU_JPNULL1		cJ1_JPNULL1
+#define	cJU_JPNULL2		cJ1_JPNULL2
+#define	cJU_JPNULL3		cJ1_JPNULL3
+#ifdef JU_64BIT
+#define	cJU_JPNULL4		cJ1_JPNULL4
+#define	cJU_JPNULL5		cJ1_JPNULL5
+#define	cJU_JPNULL6		cJ1_JPNULL6
+#define	cJU_JPNULL7		cJ1_JPNULL7
+#endif
+#define	cJU_JPNULLMAX		cJ1_JPNULLMAX
+#define	cJU_JPBRANCH_L2		cJ1_JPBRANCH_L2
+#define	cJU_JPBRANCH_L3		cJ1_JPBRANCH_L3
+#ifdef JU_64BIT
+#define	cJU_JPBRANCH_L4		cJ1_JPBRANCH_L4
+#define	cJU_JPBRANCH_L5		cJ1_JPBRANCH_L5
+#define	cJU_JPBRANCH_L6		cJ1_JPBRANCH_L6
+#define	cJU_JPBRANCH_L7		cJ1_JPBRANCH_L7
+#endif
+#define	cJU_JPBRANCH_L		cJ1_JPBRANCH_L
+#define	j__U_BranchBJPPopToWords j__1_BranchBJPPopToWords
+#define	cJU_JPBRANCH_B2		cJ1_JPBRANCH_B2
+#define	cJU_JPBRANCH_B3		cJ1_JPBRANCH_B3
+#ifdef JU_64BIT
+#define	cJU_JPBRANCH_B4		cJ1_JPBRANCH_B4
+#define	cJU_JPBRANCH_B5		cJ1_JPBRANCH_B5
+#define	cJU_JPBRANCH_B6		cJ1_JPBRANCH_B6
+#define	cJU_JPBRANCH_B7		cJ1_JPBRANCH_B7
+#endif
+#define	cJU_JPBRANCH_B		cJ1_JPBRANCH_B
+#define	cJU_JPBRANCH_U2		cJ1_JPBRANCH_U2
+#define	cJU_JPBRANCH_U3		cJ1_JPBRANCH_U3
+#ifdef JU_64BIT
+#define	cJU_JPBRANCH_U4		cJ1_JPBRANCH_U4
+#define	cJU_JPBRANCH_U5		cJ1_JPBRANCH_U5
+#define	cJU_JPBRANCH_U6		cJ1_JPBRANCH_U6
+#define	cJU_JPBRANCH_U7		cJ1_JPBRANCH_U7
+#endif
+#define	cJU_JPBRANCH_U		cJ1_JPBRANCH_U
+#ifndef JU_64BIT
+#define	cJU_JPLEAF1		cJ1_JPLEAF1
+#endif
+#define	cJU_JPLEAF2		cJ1_JPLEAF2
+#define	cJU_JPLEAF3		cJ1_JPLEAF3
+#ifdef JU_64BIT
+#define	cJU_JPLEAF4		cJ1_JPLEAF4
+#define	cJU_JPLEAF5		cJ1_JPLEAF5
+#define	cJU_JPLEAF6		cJ1_JPLEAF6
+#define	cJU_JPLEAF7		cJ1_JPLEAF7
+#endif
+#define	cJU_JPLEAF_B1		cJ1_JPLEAF_B1
+//				cJ1_JPFULLPOPU1
+#define	cJU_JPIMMED_1_01	cJ1_JPIMMED_1_01
+#define	cJU_JPIMMED_2_01	cJ1_JPIMMED_2_01
+#define	cJU_JPIMMED_3_01	cJ1_JPIMMED_3_01
+#ifdef JU_64BIT
+#define	cJU_JPIMMED_4_01	cJ1_JPIMMED_4_01
+#define	cJU_JPIMMED_5_01	cJ1_JPIMMED_5_01
+#define	cJU_JPIMMED_6_01	cJ1_JPIMMED_6_01
+#define	cJU_JPIMMED_7_01	cJ1_JPIMMED_7_01
+#endif
+#define	cJU_JPIMMED_1_02	cJ1_JPIMMED_1_02
+#define	cJU_JPIMMED_1_03	cJ1_JPIMMED_1_03
+#define	cJU_JPIMMED_1_04	cJ1_JPIMMED_1_04
+#define	cJU_JPIMMED_1_05	cJ1_JPIMMED_1_05
+#define	cJU_JPIMMED_1_06	cJ1_JPIMMED_1_06
+#define	cJU_JPIMMED_1_07	cJ1_JPIMMED_1_07
+#ifdef JU_64BIT
+//				cJ1_JPIMMED_1_08
+//				cJ1_JPIMMED_1_09
+//				cJ1_JPIMMED_1_10
+//				cJ1_JPIMMED_1_11
+//				cJ1_JPIMMED_1_12
+//				cJ1_JPIMMED_1_13
+//				cJ1_JPIMMED_1_14
+//				cJ1_JPIMMED_1_15
+#endif
+#define	cJU_JPIMMED_2_02	cJ1_JPIMMED_2_02
+#define	cJU_JPIMMED_2_03	cJ1_JPIMMED_2_03
+#ifdef JU_64BIT
+//				cJ1_JPIMMED_2_04
+//				cJ1_JPIMMED_2_05
+//				cJ1_JPIMMED_2_06
+//				cJ1_JPIMMED_2_07
+#endif
+#define	cJU_JPIMMED_3_02	cJ1_JPIMMED_3_02
+#ifdef JU_64BIT
+//				cJ1_JPIMMED_3_03
+//				cJ1_JPIMMED_3_04
+//				cJ1_JPIMMED_3_05
+//				cJ1_JPIMMED_4_02
+//				cJ1_JPIMMED_4_03
+//				cJ1_JPIMMED_5_02
+//				cJ1_JPIMMED_5_03
+//				cJ1_JPIMMED_6_02
+//				cJ1_JPIMMED_7_02
+#endif
+#define	cJU_JPIMMED_CAP		cJ1_JPIMMED_CAP
+
+#else // JUDYL ****************************************************************
+
+#define	cJU_JRPNULL		cJL_JRPNULL
+#define	cJU_JPNULL1		cJL_JPNULL1
+#define	cJU_JPNULL2		cJL_JPNULL2
+#define	cJU_JPNULL3		cJL_JPNULL3
+#ifdef JU_64BIT
+#define	cJU_JPNULL4		cJL_JPNULL4
+#define	cJU_JPNULL5		cJL_JPNULL5
+#define	cJU_JPNULL6		cJL_JPNULL6
+#define	cJU_JPNULL7		cJL_JPNULL7
+#endif
+#define	cJU_JPNULLMAX		cJL_JPNULLMAX
+#define	cJU_JPBRANCH_L2		cJL_JPBRANCH_L2
+#define	cJU_JPBRANCH_L3		cJL_JPBRANCH_L3
+#ifdef JU_64BIT
+#define	cJU_JPBRANCH_L4		cJL_JPBRANCH_L4
+#define	cJU_JPBRANCH_L5		cJL_JPBRANCH_L5
+#define	cJU_JPBRANCH_L6		cJL_JPBRANCH_L6
+#define	cJU_JPBRANCH_L7		cJL_JPBRANCH_L7
+#endif
+#define	cJU_JPBRANCH_L		cJL_JPBRANCH_L
+#define	j__U_BranchBJPPopToWords j__L_BranchBJPPopToWords
+#define	cJU_JPBRANCH_B2		cJL_JPBRANCH_B2
+#define	cJU_JPBRANCH_B3		cJL_JPBRANCH_B3
+#ifdef JU_64BIT
+#define	cJU_JPBRANCH_B4		cJL_JPBRANCH_B4
+#define	cJU_JPBRANCH_B5		cJL_JPBRANCH_B5
+#define	cJU_JPBRANCH_B6		cJL_JPBRANCH_B6
+#define	cJU_JPBRANCH_B7		cJL_JPBRANCH_B7
+#endif
+#define	cJU_JPBRANCH_B		cJL_JPBRANCH_B
+#define	cJU_JPBRANCH_U2		cJL_JPBRANCH_U2
+#define	cJU_JPBRANCH_U3		cJL_JPBRANCH_U3
+#ifdef JU_64BIT
+#define	cJU_JPBRANCH_U4		cJL_JPBRANCH_U4
+#define	cJU_JPBRANCH_U5		cJL_JPBRANCH_U5
+#define	cJU_JPBRANCH_U6		cJL_JPBRANCH_U6
+#define	cJU_JPBRANCH_U7		cJL_JPBRANCH_U7
+#endif
+#define	cJU_JPBRANCH_U		cJL_JPBRANCH_U
+#define	cJU_JPLEAF1		cJL_JPLEAF1
+#define	cJU_JPLEAF2		cJL_JPLEAF2
+#define	cJU_JPLEAF3		cJL_JPLEAF3
+#ifdef JU_64BIT
+#define	cJU_JPLEAF4		cJL_JPLEAF4
+#define	cJU_JPLEAF5		cJL_JPLEAF5
+#define	cJU_JPLEAF6		cJL_JPLEAF6
+#define	cJU_JPLEAF7		cJL_JPLEAF7
+#endif
+#define	cJU_JPLEAF_B1		cJL_JPLEAF_B1
+#define	cJU_JPIMMED_1_01	cJL_JPIMMED_1_01
+#define	cJU_JPIMMED_2_01	cJL_JPIMMED_2_01
+#define	cJU_JPIMMED_3_01	cJL_JPIMMED_3_01
+#ifdef JU_64BIT
+#define	cJU_JPIMMED_4_01	cJL_JPIMMED_4_01
+#define	cJU_JPIMMED_5_01	cJL_JPIMMED_5_01
+#define	cJU_JPIMMED_6_01	cJL_JPIMMED_6_01
+#define	cJU_JPIMMED_7_01	cJL_JPIMMED_7_01
+#endif
+#define	cJU_JPIMMED_1_02	cJL_JPIMMED_1_02
+#define	cJU_JPIMMED_1_03	cJL_JPIMMED_1_03
+#ifdef JU_64BIT
+#define	cJU_JPIMMED_1_04	cJL_JPIMMED_1_04
+#define	cJU_JPIMMED_1_05	cJL_JPIMMED_1_05
+#define	cJU_JPIMMED_1_06	cJL_JPIMMED_1_06
+#define	cJU_JPIMMED_1_07	cJL_JPIMMED_1_07
+#define	cJU_JPIMMED_2_02	cJL_JPIMMED_2_02
+#define	cJU_JPIMMED_2_03	cJL_JPIMMED_2_03
+#define	cJU_JPIMMED_3_02	cJL_JPIMMED_3_02
+#endif
+#define	cJU_JPIMMED_CAP		cJL_JPIMMED_CAP
+
+#endif // JUDYL
+
+
+// ****************************************************************************
+// cJU*_ other than JP types:
+
+#ifdef JUDY1
+
+#define	cJU_LEAFW_MAXPOP1	cJ1_LEAFW_MAXPOP1
+#ifndef JU_64BIT
+#define	cJU_LEAF1_MAXPOP1	cJ1_LEAF1_MAXPOP1
+#endif
+#define	cJU_LEAF2_MAXPOP1	cJ1_LEAF2_MAXPOP1
+#define	cJU_LEAF3_MAXPOP1	cJ1_LEAF3_MAXPOP1
+#ifdef JU_64BIT
+#define	cJU_LEAF4_MAXPOP1	cJ1_LEAF4_MAXPOP1
+#define	cJU_LEAF5_MAXPOP1	cJ1_LEAF5_MAXPOP1
+#define	cJU_LEAF6_MAXPOP1	cJ1_LEAF6_MAXPOP1
+#define	cJU_LEAF7_MAXPOP1	cJ1_LEAF7_MAXPOP1
+#endif
+#define	cJU_IMMED1_MAXPOP1	cJ1_IMMED1_MAXPOP1
+#define	cJU_IMMED2_MAXPOP1	cJ1_IMMED2_MAXPOP1
+#define	cJU_IMMED3_MAXPOP1	cJ1_IMMED3_MAXPOP1
+#ifdef JU_64BIT
+#define	cJU_IMMED4_MAXPOP1	cJ1_IMMED4_MAXPOP1
+#define	cJU_IMMED5_MAXPOP1	cJ1_IMMED5_MAXPOP1
+#define	cJU_IMMED6_MAXPOP1	cJ1_IMMED6_MAXPOP1
+#define	cJU_IMMED7_MAXPOP1	cJ1_IMMED7_MAXPOP1
+#endif
+
+#define	JU_LEAF1POPTOWORDS(Pop1)	J1_LEAF1POPTOWORDS(Pop1)
+#define	JU_LEAF2POPTOWORDS(Pop1)	J1_LEAF2POPTOWORDS(Pop1)
+#define	JU_LEAF3POPTOWORDS(Pop1)	J1_LEAF3POPTOWORDS(Pop1)
+#ifdef JU_64BIT
+#define	JU_LEAF4POPTOWORDS(Pop1)	J1_LEAF4POPTOWORDS(Pop1)
+#define	JU_LEAF5POPTOWORDS(Pop1)	J1_LEAF5POPTOWORDS(Pop1)
+#define	JU_LEAF6POPTOWORDS(Pop1)	J1_LEAF6POPTOWORDS(Pop1)
+#define	JU_LEAF7POPTOWORDS(Pop1)	J1_LEAF7POPTOWORDS(Pop1)
+#endif
+#define	JU_LEAFWPOPTOWORDS(Pop1)	J1_LEAFWPOPTOWORDS(Pop1)
+
+#ifndef JU_64BIT
+#define	JU_LEAF1GROWINPLACE(Pop1)	J1_LEAF1GROWINPLACE(Pop1)
+#endif
+#define	JU_LEAF2GROWINPLACE(Pop1)	J1_LEAF2GROWINPLACE(Pop1)
+#define	JU_LEAF3GROWINPLACE(Pop1)	J1_LEAF3GROWINPLACE(Pop1)
+#ifdef JU_64BIT
+#define	JU_LEAF4GROWINPLACE(Pop1)	J1_LEAF4GROWINPLACE(Pop1)
+#define	JU_LEAF5GROWINPLACE(Pop1)	J1_LEAF5GROWINPLACE(Pop1)
+#define	JU_LEAF6GROWINPLACE(Pop1)	J1_LEAF6GROWINPLACE(Pop1)
+#define	JU_LEAF7GROWINPLACE(Pop1)	J1_LEAF7GROWINPLACE(Pop1)
+#endif
+#define	JU_LEAFWGROWINPLACE(Pop1)	J1_LEAFWGROWINPLACE(Pop1)
+
+#define	j__udyCreateBranchL	j__udy1CreateBranchL
+#define	j__udyCreateBranchB	j__udy1CreateBranchB
+#define	j__udyCreateBranchU	j__udy1CreateBranchU
+#define	j__udyCascade1		j__udy1Cascade1
+#define	j__udyCascade2		j__udy1Cascade2
+#define	j__udyCascade3		j__udy1Cascade3
+#ifdef JU_64BIT
+#define	j__udyCascade4		j__udy1Cascade4
+#define	j__udyCascade5		j__udy1Cascade5
+#define	j__udyCascade6		j__udy1Cascade6
+#define	j__udyCascade7		j__udy1Cascade7
+#endif
+#define	j__udyCascadeL		j__udy1CascadeL
+#define	j__udyInsertBranch	j__udy1InsertBranch
+
+#define	j__udyBranchBToBranchL	j__udy1BranchBToBranchL
+#ifndef JU_64BIT
+#define	j__udyLeafB1ToLeaf1	j__udy1LeafB1ToLeaf1
+#endif
+#define	j__udyLeaf1ToLeaf2	j__udy1Leaf1ToLeaf2
+#define	j__udyLeaf2ToLeaf3	j__udy1Leaf2ToLeaf3
+#ifndef JU_64BIT
+#define	j__udyLeaf3ToLeafW	j__udy1Leaf3ToLeafW
+#else
+#define	j__udyLeaf3ToLeaf4	j__udy1Leaf3ToLeaf4
+#define	j__udyLeaf4ToLeaf5	j__udy1Leaf4ToLeaf5
+#define	j__udyLeaf5ToLeaf6	j__udy1Leaf5ToLeaf6
+#define	j__udyLeaf6ToLeaf7	j__udy1Leaf6ToLeaf7
+#define	j__udyLeaf7ToLeafW	j__udy1Leaf7ToLeafW
+#endif
+
+#define	jpm_t			j1pm_t
+#define	Pjpm_t			Pj1pm_t
+
+#define	jlb_t			j1lb_t
+#define	Pjlb_t			Pj1lb_t
+
+#define	JU_JLB_BITMAP		J1_JLB_BITMAP
+
+#define	j__udyAllocJPM		j__udy1AllocJ1PM
+#define	j__udyAllocJBL		j__udy1AllocJBL
+#define	j__udyAllocJBB		j__udy1AllocJBB
+#define	j__udyAllocJBBJP	j__udy1AllocJBBJP
+#define	j__udyAllocJBU		j__udy1AllocJBU
+#ifndef JU_64BIT
+#define	j__udyAllocJLL1		j__udy1AllocJLL1
+#endif
+#define	j__udyAllocJLL2		j__udy1AllocJLL2
+#define	j__udyAllocJLL3		j__udy1AllocJLL3
+#ifdef JU_64BIT
+#define	j__udyAllocJLL4		j__udy1AllocJLL4
+#define	j__udyAllocJLL5		j__udy1AllocJLL5
+#define	j__udyAllocJLL6		j__udy1AllocJLL6
+#define	j__udyAllocJLL7		j__udy1AllocJLL7
+#endif
+#define	j__udyAllocJLW		j__udy1AllocJLW
+#define	j__udyAllocJLB1		j__udy1AllocJLB1
+#define	j__udyFreeJPM		j__udy1FreeJ1PM
+#define	j__udyFreeJBL		j__udy1FreeJBL
+#define	j__udyFreeJBB		j__udy1FreeJBB
+#define	j__udyFreeJBBJP		j__udy1FreeJBBJP
+#define	j__udyFreeJBU		j__udy1FreeJBU
+#ifndef JU_64BIT
+#define	j__udyFreeJLL1		j__udy1FreeJLL1
+#endif
+#define	j__udyFreeJLL2		j__udy1FreeJLL2
+#define	j__udyFreeJLL3		j__udy1FreeJLL3
+#ifdef JU_64BIT
+#define	j__udyFreeJLL4		j__udy1FreeJLL4
+#define	j__udyFreeJLL5		j__udy1FreeJLL5
+#define	j__udyFreeJLL6		j__udy1FreeJLL6
+#define	j__udyFreeJLL7		j__udy1FreeJLL7
+#endif
+#define	j__udyFreeJLW		j__udy1FreeJLW
+#define	j__udyFreeJLB1		j__udy1FreeJLB1
+#define	j__udyFreeSM		j__udy1FreeSM
+
+#define	j__uMaxWords		j__u1MaxWords
+
+#ifdef DEBUG
+#define	JudyCheckPop		Judy1CheckPop
+#endif
+
+#else // JUDYL ****************************************************************
+
+#define	cJU_LEAFW_MAXPOP1	cJL_LEAFW_MAXPOP1
+#define	cJU_LEAF1_MAXPOP1	cJL_LEAF1_MAXPOP1
+#define	cJU_LEAF2_MAXPOP1	cJL_LEAF2_MAXPOP1
+#define	cJU_LEAF3_MAXPOP1	cJL_LEAF3_MAXPOP1
+#ifdef JU_64BIT
+#define	cJU_LEAF4_MAXPOP1	cJL_LEAF4_MAXPOP1
+#define	cJU_LEAF5_MAXPOP1	cJL_LEAF5_MAXPOP1
+#define	cJU_LEAF6_MAXPOP1	cJL_LEAF6_MAXPOP1
+#define	cJU_LEAF7_MAXPOP1	cJL_LEAF7_MAXPOP1
+#endif
+#define	cJU_IMMED1_MAXPOP1	cJL_IMMED1_MAXPOP1
+#define	cJU_IMMED2_MAXPOP1	cJL_IMMED2_MAXPOP1
+#define	cJU_IMMED3_MAXPOP1	cJL_IMMED3_MAXPOP1
+#ifdef JU_64BIT
+#define	cJU_IMMED4_MAXPOP1	cJL_IMMED4_MAXPOP1
+#define	cJU_IMMED5_MAXPOP1	cJL_IMMED5_MAXPOP1
+#define	cJU_IMMED6_MAXPOP1	cJL_IMMED6_MAXPOP1
+#define	cJU_IMMED7_MAXPOP1	cJL_IMMED7_MAXPOP1
+#endif
+
+#define	JU_LEAF1POPTOWORDS(Pop1)	JL_LEAF1POPTOWORDS(Pop1)
+#define	JU_LEAF2POPTOWORDS(Pop1)	JL_LEAF2POPTOWORDS(Pop1)
+#define	JU_LEAF3POPTOWORDS(Pop1)	JL_LEAF3POPTOWORDS(Pop1)
+#ifdef JU_64BIT
+#define	JU_LEAF4POPTOWORDS(Pop1)	JL_LEAF4POPTOWORDS(Pop1)
+#define	JU_LEAF5POPTOWORDS(Pop1)	JL_LEAF5POPTOWORDS(Pop1)
+#define	JU_LEAF6POPTOWORDS(Pop1)	JL_LEAF6POPTOWORDS(Pop1)
+#define	JU_LEAF7POPTOWORDS(Pop1)	JL_LEAF7POPTOWORDS(Pop1)
+#endif
+#define	JU_LEAFWPOPTOWORDS(Pop1)	JL_LEAFWPOPTOWORDS(Pop1)
+
+#define	JU_LEAF1GROWINPLACE(Pop1)	JL_LEAF1GROWINPLACE(Pop1)
+#define	JU_LEAF2GROWINPLACE(Pop1)	JL_LEAF2GROWINPLACE(Pop1)
+#define	JU_LEAF3GROWINPLACE(Pop1)	JL_LEAF3GROWINPLACE(Pop1)
+#ifdef JU_64BIT
+#define	JU_LEAF4GROWINPLACE(Pop1)	JL_LEAF4GROWINPLACE(Pop1)
+#define	JU_LEAF5GROWINPLACE(Pop1)	JL_LEAF5GROWINPLACE(Pop1)
+#define	JU_LEAF6GROWINPLACE(Pop1)	JL_LEAF6GROWINPLACE(Pop1)
+#define	JU_LEAF7GROWINPLACE(Pop1)	JL_LEAF7GROWINPLACE(Pop1)
+#endif
+#define	JU_LEAFWGROWINPLACE(Pop1)	JL_LEAFWGROWINPLACE(Pop1)
+
+#define	j__udyCreateBranchL	j__udyLCreateBranchL
+#define	j__udyCreateBranchB	j__udyLCreateBranchB
+#define	j__udyCreateBranchU	j__udyLCreateBranchU
+#define	j__udyCascade1		j__udyLCascade1
+#define	j__udyCascade2		j__udyLCascade2
+#define	j__udyCascade3		j__udyLCascade3
+#ifdef JU_64BIT
+#define	j__udyCascade4		j__udyLCascade4
+#define	j__udyCascade5		j__udyLCascade5
+#define	j__udyCascade6		j__udyLCascade6
+#define	j__udyCascade7		j__udyLCascade7
+#endif
+#define	j__udyCascadeL		j__udyLCascadeL
+#define	j__udyInsertBranch	j__udyLInsertBranch
+
+#define	j__udyBranchBToBranchL	j__udyLBranchBToBranchL
+#define	j__udyLeafB1ToLeaf1	j__udyLLeafB1ToLeaf1
+#define	j__udyLeaf1ToLeaf2	j__udyLLeaf1ToLeaf2
+#define	j__udyLeaf2ToLeaf3	j__udyLLeaf2ToLeaf3
+#ifndef JU_64BIT
+#define	j__udyLeaf3ToLeafW	j__udyLLeaf3ToLeafW
+#else
+#define	j__udyLeaf3ToLeaf4	j__udyLLeaf3ToLeaf4
+#define	j__udyLeaf4ToLeaf5	j__udyLLeaf4ToLeaf5
+#define	j__udyLeaf5ToLeaf6	j__udyLLeaf5ToLeaf6
+#define	j__udyLeaf6ToLeaf7	j__udyLLeaf6ToLeaf7
+#define	j__udyLeaf7ToLeafW	j__udyLLeaf7ToLeafW
+#endif
+
+#define	jpm_t			jLpm_t
+#define	Pjpm_t			PjLpm_t
+
+#define	jlb_t			jLlb_t
+#define	Pjlb_t			PjLlb_t
+
+#define	JU_JLB_BITMAP		JL_JLB_BITMAP
+
+#define	j__udyAllocJPM		j__udyLAllocJLPM
+#define	j__udyAllocJBL		j__udyLAllocJBL
+#define	j__udyAllocJBB		j__udyLAllocJBB
+#define	j__udyAllocJBBJP	j__udyLAllocJBBJP
+#define	j__udyAllocJBU		j__udyLAllocJBU
+#define	j__udyAllocJLL1		j__udyLAllocJLL1
+#define	j__udyAllocJLL2		j__udyLAllocJLL2
+#define	j__udyAllocJLL3		j__udyLAllocJLL3
+#ifdef JU_64BIT
+#define	j__udyAllocJLL4		j__udyLAllocJLL4
+#define	j__udyAllocJLL5		j__udyLAllocJLL5
+#define	j__udyAllocJLL6		j__udyLAllocJLL6
+#define	j__udyAllocJLL7		j__udyLAllocJLL7
+#endif
+#define	j__udyAllocJLW		j__udyLAllocJLW
+#define	j__udyAllocJLB1		j__udyLAllocJLB1
+//				j__udyLAllocJV
+#define	j__udyFreeJPM		j__udyLFreeJLPM
+#define	j__udyFreeJBL		j__udyLFreeJBL
+#define	j__udyFreeJBB		j__udyLFreeJBB
+#define	j__udyFreeJBBJP		j__udyLFreeJBBJP
+#define	j__udyFreeJBU		j__udyLFreeJBU
+#define	j__udyFreeJLL1		j__udyLFreeJLL1
+#define	j__udyFreeJLL2		j__udyLFreeJLL2
+#define	j__udyFreeJLL3		j__udyLFreeJLL3
+#ifdef JU_64BIT
+#define	j__udyFreeJLL4		j__udyLFreeJLL4
+#define	j__udyFreeJLL5		j__udyLFreeJLL5
+#define	j__udyFreeJLL6		j__udyLFreeJLL6
+#define	j__udyFreeJLL7		j__udyLFreeJLL7
+#endif
+#define	j__udyFreeJLW		j__udyLFreeJLW
+#define	j__udyFreeJLB1		j__udyLFreeJLB1
+#define	j__udyFreeSM		j__udyLFreeSM
+//				j__udyLFreeJV
+
+#define	j__uMaxWords		j__uLMaxWords
+
+#ifdef DEBUG
+#define	JudyCheckPop		JudyLCheckPop
+#endif
+
+#endif // JUDYL
+
+#endif // _JUDYPRIVATE1L_INCLUDED
diff --git a/libs/klib/judy/JudyPrivateBranch.h b/libs/klib/judy/JudyPrivateBranch.h
new file mode 100644
index 0000000..4e0dda4
--- /dev/null
+++ b/libs/klib/judy/JudyPrivateBranch.h
@@ -0,0 +1,777 @@
+#ifndef _JUDY_PRIVATE_BRANCH_INCLUDED
+#define _JUDY_PRIVATE_BRANCH_INCLUDED
+// _________________
+//
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// Header file for all Judy sources, for global but private (non-exported)
+// declarations specific to branch support.
+//
+// See also the "Judy Shop Manual" (try judy/doc/int/JudyShopManual.*).
+
+
+// ****************************************************************************
+// JUDY POINTER (JP) SUPPORT
+// ****************************************************************************
+//
+// This "rich pointer" object is pivotal to Judy execution.
+//
+// JP CONTAINING OTHER THAN IMMEDIATE INDEXES:
+//
+// If the JP points to a linear or bitmap leaf, jp_DcdPopO contains the
+// Population-1 in LSbs and Decode (Dcd) bytes in the MSBs.  (In practice the
+// Decode bits are masked off while accessing the Pop0 bits.)
+//
+// The Decode Size, the number of Dcd bytes available, is encoded in jpo_Type.
+// It can also be thought of as the number of states "skipped" in the SM, where
+// each state decodes 8 bits = 1 byte.
+//
+// TBD:  Dont need two structures, except possibly to force jp_Type to highest
+// address!
+//
+// Note:  The jpo_u union is not required by HP-UX or Linux but Win32 because
+// the cl.exe compiler otherwise refuses to pack a bitfield (DcdPopO) with
+// anything else, even with the -Zp option.  This is pretty ugly, but
+// fortunately portable, and its all hide-able by macros (see below).
+
+typedef struct J_UDY_POINTER_OTHERS      // JPO.
+        {
+            Word_t      j_po_Addr;       // first word:  Pjp_t, Word_t, etc.
+            union {
+//              Word_t  j_po_DcdPop0:cJU_BITSPERWORD-cJU_BITSPERBYTE;
+                uint8_t j_po_DcdP0[sizeof(Word_t) - 1];
+                uint8_t j_po_Bytes[sizeof(Word_t)];     // last byte = jp_Type.
+            } jpo_u;
+        } jpo_t;
+
+
+// JP CONTAINING IMMEDIATE INDEXES:
+//
+// j_pi_1Index[] plus j_pi_LIndex[] together hold as many N-byte (1..3-byte
+// [1..7-byte]) Indexes as will fit in sizeof(jpi_t) less 1 byte for j_pi_Type
+// (that is, 7..1 [15..1] Indexes).
+//
+// For Judy1, j_pi_1Index[] is used and j_pi_LIndex[] is not used.
+// For JudyL, j_pi_LIndex[] is used and j_pi_1Index[] is not used.
+//
+// Note:  Actually when Pop1 = 1, jpi_t is not used, and the least bytes of the
+// single Index are stored in j_po_DcdPopO, for both Judy1 and JudyL, so for
+// JudyL the j_po_Addr field can hold the target value.
+//
+// TBD:  Revise this structure to not overload j_po_DcdPopO this way?  The
+// current arrangement works, its just confusing.
+
+typedef struct _JUDY_POINTER_IMMED      // JPI.
+        {
+            uint8_t j_pi_1Index[sizeof(Word_t)];        // see above.
+            uint8_t j_pi_LIndex[sizeof(Word_t) - 1];    // see above.
+            uint8_t j_pi_Type;                  // JP type, 1 of cJ*_JPIMMED*.
+        } jpi_t;
+
+
+// UNION OF JP TYPES:
+//
+// A branch is an array of cJU_BRANCHUNUMJPS (256) of this object, or an
+// alternate data type such as:  A linear branch which is a list of 2..7 JPs,
+// or a bitmap branch which contains 8 lists of 0..32 JPs.  JPs reside only in
+// branches of a Judy SM.
+
+typedef union J_UDY_POINTER             // JP.
+        {
+            jpo_t j_po;                 // other than immediate indexes.
+            jpi_t j_pi;                 // immediate indexes.
+        } jp_t, *Pjp_t;
+
+// For coding convenience:
+//
+// Note, jp_Type has the same bits in jpo_t and jpi_t.
+
+#define jp_1Index  j_pi.j_pi_1Index     // for storing Indexes in first  word.
+#define jp_LIndex  j_pi.j_pi_LIndex     // for storing Indexes in second word.
+#define jp_Addr    j_po.j_po_Addr
+//#define       jp_DcdPop0 j_po.jpo_u.j_po_DcdPop0
+#define jp_Type    j_po.jpo_u.j_po_Bytes[sizeof(Word_t) - 1]
+#define jp_DcdP0   j_po.jpo_u.j_po_DcdP0
+
+
+// ****************************************************************************
+// JUDY POINTER (JP) -- RELATED MACROS AND CONSTANTS
+// ****************************************************************************
+
+// EXTRACT VALUES FROM JP:
+//
+// Masks for the bytes in the Dcd and Pop0 parts of jp_DcdPopO:
+//
+// cJU_DCDMASK() consists of a mask that excludes the (LSb) Pop0 bytes and
+// also, just to be safe, the top byte of the word, since jp_DcdPopO is 1 byte
+// less than a full word.
+//
+// Note:  These are constant macros (cJU) because cPopBytes should be a
+// constant.  Also note cPopBytes == state in the SM.
+
+#define cJU_POP0MASK(cPopBytes) JU_LEASTBYTESMASK(cPopBytes)
+
+#define cJU_DCDMASK(cPopBytes) \
+        ((cJU_ALLONES >> cJU_BITSPERBYTE) & (~cJU_POP0MASK(cPopBytes)))
+
+// Mask off the high byte from INDEX to it can be compared to DcdPopO:
+
+#define JU_TRIMTODCDSIZE(INDEX) ((cJU_ALLONES >> cJU_BITSPERBYTE) & (INDEX))
+
+// Get from jp_DcdPopO the Pop0 for various branch JP Types:
+//
+// Note:  There are no simple macros for cJU_BRANCH* Types because their
+// populations must be added up and dont reside in an already-calculated
+// place.
+
+#define JU_JPBRANCH_POP0(PJP,cPopBytes) \
+        (JU_JPDCDPOP0(PJP) & cJU_POP0MASK(cPopBytes))
+
+// METHOD FOR DETERMINING IF OBJECTS HAVE ROOM TO GROW:
+//
+// J__U_GROWCK() is a generic method to determine if an object can grow in
+// place, based on whether the next population size (one more) would use the
+// same space.
+
+#define J__U_GROWCK(POP1,MAXPOP1,POPTOWORDS) \
+        (((POP1) != (MAXPOP1)) && (POPTOWORDS[POP1] == POPTOWORDS[(POP1) + 1]))
+
+#define JU_BRANCHBJPGROWINPLACE(NumJPs) \
+        J__U_GROWCK(NumJPs, cJU_BITSPERSUBEXPB, j__U_BranchBJPPopToWords)
+
+
+// DETERMINE IF AN INDEX IS (NOT) IN A JPS EXPANSE:
+
+#define JU_DCDNOTMATCHINDEX(INDEX,PJP,POP0BYTES) \
+        (((INDEX) ^ JU_JPDCDPOP0(PJP)) & cJU_DCDMASK(POP0BYTES))
+
+
+// NUMBER OF JPs IN AN UNCOMPRESSED BRANCH:
+//
+// An uncompressed branch is simply an array of 256 Judy Pointers (JPs).  It is
+// a minimum cacheline fill object.  Define it here before its first needed.
+
+#define cJU_BRANCHUNUMJPS  cJU_SUBEXPPERSTATE
+
+
+// ****************************************************************************
+// JUDY BRANCH LINEAR (JBL) SUPPORT
+// ****************************************************************************
+//
+// A linear branch is a way of compressing empty expanses (null JPs) out of an
+// uncompressed 256-way branch, when the number of populated expanses is so
+// small that even a bitmap branch is excessive.
+//
+// The maximum number of JPs in a Judy linear branch:
+//
+// Note:  This number results in a 1-cacheline sized structure.  Previous
+// versions had a larger struct so a linear branch didnt become a bitmap
+// branch until the memory consumed was even, but for speed, its better to
+// switch "sooner" and keep a linear branch fast.
+
+#define cJU_BRANCHLMAXJPS 7
+
+
+// LINEAR BRANCH STRUCT:
+//
+// 1-byte count, followed by array of byte-sized expanses, followed by JPs.
+
+typedef struct J__UDY_BRANCH_LINEAR
+        {
+            uint8_t jbl_NumJPs;                     // num of JPs (Pjp_t), 1..N.
+            uint8_t jbl_Expanse[cJU_BRANCHLMAXJPS]; // 1..7 MSbs of pop exps.
+            jp_t    jbl_jp     [cJU_BRANCHLMAXJPS]; // JPs for populated exps.
+        } jbl_t, * Pjbl_t;
+
+
+// ****************************************************************************
+// JUDY BRANCH BITMAP (JBB) SUPPORT
+// ****************************************************************************
+//
+// A bitmap branch is a way of compressing empty expanses (null JPs) out of
+// uncompressed 256-way branch.  This costs 1 additional cache line fill, but
+// can save a lot of memory when it matters most, near the leaves, and
+// typically there will be only one at most in the path to any Index (leaf).
+//
+// The bitmap indicates which of the cJU_BRANCHUNUMJPS (256) JPs in the branch
+// are NOT null, that is, their expanses are populated.  The jbb_t also
+// contains N pointers to "mini" Judy branches ("subexpanses") of up to M JPs
+// each (see BITMAP_BRANCHMxN, for example, BITMAP_BRANCH32x8), where M x N =
+// cJU_BRANCHUNUMJPS.  These are dynamically allocated and never contain
+// cJ*_JPNULL* jp_Types.  An empty subexpanse is represented by no bit sets in
+// the corresponding subexpanse bitmap, in which case the corresponding
+// jbbs_Pjp pointers value is unused.
+//
+// Note that the number of valid JPs in each 1-of-N subexpanses is determined
+// by POPULATION rather than by EXPANSE -- the desired outcome to save memory
+// when near the leaves.  Note that the memory required for 185 JPs is about as
+// much as an uncompressed 256-way branch, therefore 184 is set as the maximum.
+// However, it is expected that a conversion to an uncompressed 256-way branch
+// will normally take place before this limit is reached for other reasons,
+// such as improving performance when the "wasted" memory is well amortized by
+// the population under the branch, preserving an acceptable overall
+// bytes/Index in the Judy array.
+//
+// The number of pointers to arrays of JPs in the Judy bitmap branch:
+//
+// Note:  The numbers below are the same in both 32 and 64 bit systems.
+
+#define cJU_BRANCHBMAXJPS  184          // maximum JPs for bitmap branches.
+
+// Convenience wrappers for referencing BranchB bitmaps or JP subarray
+// pointers:
+//
+// Note:  JU_JBB_PJP produces a "raw" memory address that must pass through
+// P_JP before use, except when freeing memory:
+
+#define JU_JBB_BITMAP(Pjbb, SubExp)  ((Pjbb)->jbb_jbbs[SubExp].jbbs_Bitmap)
+#define JU_JBB_PJP(   Pjbb, SubExp)  ((Pjbb)->jbb_jbbs[SubExp].jbbs_Pjp)
+
+#define JU_SUBEXPB(Digit) (((Digit) / cJU_BITSPERSUBEXPB) & (cJU_NUMSUBEXPB-1))
+
+#define JU_BITMAPTESTB(Pjbb, Index) \
+        (JU_JBB_BITMAP(Pjbb, JU_SUBEXPB(Index)) &  JU_BITPOSMASKB(Index))
+
+#define JU_BITMAPSETB(Pjbb, Index)  \
+        (JU_JBB_BITMAP(Pjbb, JU_SUBEXPB(Index)) |= JU_BITPOSMASKB(Index))
+
+// Note:  JU_BITMAPCLEARB is not defined because the code does it a faster way.
+
+typedef struct J__UDY_BRANCH_BITMAP_SUBEXPANSE
+        {
+            BITMAPB_t jbbs_Bitmap;
+            Pjp_t     jbbs_Pjp;
+
+        } jbbs_t;
+
+typedef struct J__UDY_BRANCH_BITMAP
+        {
+            jbbs_t jbb_jbbs   [cJU_NUMSUBEXPB];
+#ifdef SUBEXPCOUNTS
+            Word_t jbb_subPop1[cJU_NUMSUBEXPB];
+#endif
+        } jbb_t, * Pjbb_t;
+
+#define JU_BRANCHJP_NUMJPSTOWORDS(NumJPs) (j__U_BranchBJPPopToWords[NumJPs])
+
+#ifdef SUBEXPCOUNTS
+#define cJU_NUMSUBEXPU  16      // number of subexpanse counts.
+#endif
+
+
+// ****************************************************************************
+// JUDY BRANCH UNCOMPRESSED (JBU) SUPPORT
+// ****************************************************************************
+
+// Convenience wrapper for referencing BranchU JPs:
+//
+// Note:  This produces a non-"raw" address already passed through P_JBU().
+
+#define JU_JBU_PJP(Pjp,Index,Level) \
+        (&((P_JBU((Pjp)->jp_Addr))->jbu_jp[JU_DIGITATSTATE(Index, Level)]))
+#define JU_JBU_PJP0(Pjp) \
+        (&((P_JBU((Pjp)->jp_Addr))->jbu_jp[0]))
+
+typedef struct J__UDY_BRANCH_UNCOMPRESSED
+        {
+            jp_t   jbu_jp     [cJU_BRANCHUNUMJPS];  // JPs for populated exp.
+#ifdef SUBEXPCOUNTS
+            Word_t jbu_subPop1[cJU_NUMSUBEXPU];
+#endif
+        } jbu_t, * Pjbu_t;
+
+
+// ****************************************************************************
+// OTHER SUPPORT FOR JUDY STATE MACHINES (SMs)
+// ****************************************************************************
+
+// OBJECT SIZES IN WORDS:
+//
+// Word_ts per various JudyL structures that have constant sizes.
+// cJU_WORDSPERJP should always be 2; this is fundamental to the Judy
+// structures.
+
+#define cJU_WORDSPERJP (sizeof(jp_t)   / cJU_BYTESPERWORD)
+#define cJU_WORDSPERCL (cJU_BYTESPERCL / cJU_BYTESPERWORD)
+
+
+// OPPORTUNISTIC UNCOMPRESSION:
+//
+// Define populations at which a BranchL or BranchB must convert to BranchU.
+// Earlier conversion is possible with good memory efficiency -- see below.
+
+#ifndef NO_BRANCHU
+
+// Max population below BranchL, then convert to BranchU:
+
+#define JU_BRANCHL_MAX_POP      1000
+
+// Minimum global population increment before next conversion of a BranchB to a
+// BranchU:
+//
+// This is was done to allow malloc() to coalesce memory before the next big
+// (~512 words) allocation.
+
+#define JU_BTOU_POP_INCREMENT    300
+
+// Min/max population below BranchB, then convert to BranchU:
+
+#define JU_BRANCHB_MIN_POP       135
+#define JU_BRANCHB_MAX_POP       750
+
+#else // NO_BRANCHU
+
+// These are set up to have conservative conversion schedules to BranchU:
+
+#define JU_BRANCHL_MAX_POP      (-1UL)
+#define JU_BTOU_POP_INCREMENT      300
+#define JU_BRANCHB_MIN_POP        1000
+#define JU_BRANCHB_MAX_POP      (-1UL)
+
+#endif // NO_BRANCHU
+
+
+// MISCELLANEOUS MACROS:
+
+// Get N most significant bits from the shifted Index word:
+//
+// As Index words are decoded, they are shifted left so only relevant,
+// undecoded Index bits remain.
+
+#define JU_BITSFROMSFTIDX(SFTIDX, N)  ((SFTIDX) >> (cJU_BITSPERWORD - (N)))
+
+// TBD:  I have my doubts about the necessity of these macros (dlb):
+
+// Produce 1-digit mask at specified state:
+
+#define cJU_MASKATSTATE(State)  ((Word_t)0xff << (((State) - 1) * cJU_BITSPERBYTE))
+
+// Get byte (digit) from Index at the specified state, right justified:
+//
+// Note:  State must be 1..cJU_ROOTSTATE, and Digits must be 1..(cJU_ROOTSTATE
+// - 1), but theres no way to assert these within an expression.
+
+#define JU_DIGITATSTATE(Index,cState) \
+         ((uint8_t)((Index) >> (((cState) - 1) * cJU_BITSPERBYTE)))
+
+// Similarly, place byte (digit) at correct position for the specified state:
+//
+// Note:  Cast digit to a Word_t first so there are no complaints or problems
+// about shifting it more than 32 bits on a 64-bit system, say, when it is a
+// uint8_t from jbl_Expanse[].  (Believe it or not, the C standard says to
+// promote an unsigned char to a signed int; -Ac does not do this, but -Ae
+// does.)
+//
+// Also, to make lint happy, cast the whole result again because apparently
+// shifting a Word_t does not result in a Word_t!
+
+#define JU_DIGITTOSTATE(Digit,cState) \
+        ((Word_t) (((Word_t) (Digit)) << (((cState) - 1) * cJU_BITSPERBYTE)))
+
+#endif // ! _JUDY_PRIVATE_BRANCH_INCLUDED
+
+
+#ifdef TEST_INSDEL
+
+// ****************************************************************************
+// TEST CODE FOR INSERT/DELETE MACROS
+// ****************************************************************************
+//
+// To use this, compile a temporary *.c file containing:
+//
+//      #define DEBUG
+//      #define JUDY_ASSERT
+//      #define TEST_INSDEL
+//      #include "JudyPrivate.h"
+//      #include "JudyPrivateBranch.h"
+//
+// Use a command like this:  cc -Ae +DD64 -I. -I JudyCommon -o t t.c
+// For best results, include +DD64 on a 64-bit system.
+//
+// This test code exercises some tricky macros, but the output must be studied
+// manually to verify it.  Assume that for even-index testing, whole words
+// (Word_t) suffices.
+
+#include <stdio.h>
+
+#define INDEXES 3               // in each array.
+
+
+// ****************************************************************************
+// I N I T
+//
+// Set up variables for next test.  See usage.
+
+FUNCTION void Init (
+        int       base,
+        PWord_t   PeIndex,
+        PWord_t   PoIndex,
+        PWord_t   Peleaf,       // always whole words.
+#ifndef JU_64BIT
+        uint8_t * Poleaf3)
+#else
+        uint8_t * Poleaf3,
+        uint8_t * Poleaf5,
+        uint8_t * Poleaf6,
+        uint8_t * Poleaf7)
+#endif
+{
+        int offset;
+
+        *PeIndex = 99;
+
+        for (offset = 0; offset <= INDEXES; ++offset)
+            Peleaf[offset] = base + offset;
+
+        for (offset = 0; offset < (INDEXES + 1) * 3; ++offset)
+            Poleaf3[offset] = base + offset;
+
+#ifndef JU_64BIT
+        *PoIndex = (91 << 24) | (92 << 16) | (93 << 8) | 94;
+#else
+
+        *PoIndex = (91L << 56) | (92L << 48) | (93L << 40) | (94L << 32)
+                 | (95L << 24) | (96L << 16) | (97L <<  8) |  98L;
+
+        for (offset = 0; offset < (INDEXES + 1) * 5; ++offset)
+            Poleaf5[offset] = base + offset;
+
+        for (offset = 0; offset < (INDEXES + 1) * 6; ++offset)
+            Poleaf6[offset] = base + offset;
+
+        for (offset = 0; offset < (INDEXES + 1) * 7; ++offset)
+            Poleaf7[offset] = base + offset;
+#endif
+
+} // Init()
+
+
+// ****************************************************************************
+// P R I N T   L E A F
+//
+// Print the byte values in a leaf.
+
+FUNCTION void PrintLeaf (
+        char *    Label,        // for output.
+        int       IOffset,      // insertion offset in array.
+        int       Indsize,      // index size in bytes.
+        uint8_t * PLeaf)        // array of Index bytes.
+{
+        int       offset;       // in PLeaf.
+        int       byte;         // in one word.
+
+        (void) printf("%s %u: ", Label, IOffset);
+
+        for (offset = 0; offset <= INDEXES; ++offset)
+        {
+            for (byte = 0; byte < Indsize; ++byte)
+                (void) printf("%2d", PLeaf[(offset * Indsize) + byte]);
+
+            (void) printf(" ");
+        }
+
+        (void) printf("\n");
+
+} // PrintLeaf()
+
+
+// ****************************************************************************
+// M A I N
+//
+// Test program.
+
+FUNCTION main()
+{
+        Word_t  eIndex;                         // even, to insert.
+        Word_t  oIndex;                         // odd,  to insert.
+        Word_t  eleaf [ INDEXES + 1];           // even leaf, index size 4.
+        uint8_t oleaf3[(INDEXES + 1) * 3];      // odd leaf,  index size 3.
+#ifdef JU_64BIT
+        uint8_t oleaf5[(INDEXES + 1) * 5];      // odd leaf,  index size 5.
+        uint8_t oleaf6[(INDEXES + 1) * 6];      // odd leaf,  index size 6.
+        uint8_t oleaf7[(INDEXES + 1) * 7];      // odd leaf,  index size 7.
+#endif
+        Word_t  eleaf_2 [ INDEXES + 1];         // same, but second arrays:
+        uint8_t oleaf3_2[(INDEXES + 1) * 3];
+#ifdef JU_64BIT
+        uint8_t oleaf5_2[(INDEXES + 1) * 5];
+        uint8_t oleaf6_2[(INDEXES + 1) * 6];
+        uint8_t oleaf7_2[(INDEXES + 1) * 7];
+#endif
+        int     ioffset;                // index insertion offset.
+
+#ifndef JU_64BIT
+#define INIT        Init( 0, & eIndex, & oIndex, eleaf,   oleaf3)
+#define INIT2 INIT; Init(50, & eIndex, & oIndex, eleaf_2, oleaf3_2)
+#else
+#define INIT        Init( 0, & eIndex, & oIndex, eleaf,   oleaf3, \
+                         oleaf5,   oleaf6,   oleaf7)
+#define INIT2 INIT; Init(50, & eIndex, & oIndex, eleaf_2, oleaf3_2, \
+                         oleaf5_2, oleaf6_2, oleaf7_2)
+#endif
+
+#define WSIZE sizeof (Word_t)           // shorthand.
+
+#ifdef PRINTALL                 // to turn on "noisy" printouts.
+#define PRINTLEAF(Label,IOffset,Indsize,PLeaf) \
+        PrintLeaf(Label,IOffset,Indsize,PLeaf)
+#else
+#define PRINTLEAF(Label,IOffset,Indsize,PLeaf)  \
+        if (ioffset == 0)                       \
+        PrintLeaf(Label,IOffset,Indsize,PLeaf)
+#endif
+
+        (void) printf(
+"In each case, tests operate on an initial array of %d indexes.  Even-index\n"
+"tests set index values to 0,1,2...; odd-index tests set byte values to\n"
+"0,1,2...  Inserted indexes have a value of 99 or else byte values 91,92,...\n",
+                        INDEXES);
+
+        (void) puts("\nJU_INSERTINPLACE():");
+
+        for (ioffset = 0; ioffset <= INDEXES; ++ioffset)
+        {
+            INIT;
+            PRINTLEAF("Before", ioffset, WSIZE, (uint8_t *) eleaf);
+            JU_INSERTINPLACE(eleaf, INDEXES, ioffset, eIndex);
+            PrintLeaf("After ", ioffset, WSIZE, (uint8_t *) eleaf);
+        }
+
+        (void) puts("\nJU_INSERTINPLACE3():");
+
+        for (ioffset = 0; ioffset <= INDEXES; ++ioffset)
+        {
+            INIT;
+            PRINTLEAF("Before", ioffset, 3, oleaf3);
+            JU_INSERTINPLACE3(oleaf3, INDEXES, ioffset, oIndex);
+            PrintLeaf("After ", ioffset, 3, oleaf3);
+        }
+
+#ifdef JU_64BIT
+        (void) puts("\nJU_INSERTINPLACE5():");
+
+        for (ioffset = 0; ioffset <= INDEXES; ++ioffset)
+        {
+            INIT;
+            PRINTLEAF("Before", ioffset, 5, oleaf5);
+            JU_INSERTINPLACE5(oleaf5, INDEXES, ioffset, oIndex);
+            PrintLeaf("After ", ioffset, 5, oleaf5);
+        }
+
+        (void) puts("\nJU_INSERTINPLACE6():");
+
+        for (ioffset = 0; ioffset <= INDEXES; ++ioffset)
+        {
+            INIT;
+            PRINTLEAF("Before", ioffset, 6, oleaf6);
+            JU_INSERTINPLACE6(oleaf6, INDEXES, ioffset, oIndex);
+            PrintLeaf("After ", ioffset, 6, oleaf6);
+        }
+
+        (void) puts("\nJU_INSERTINPLACE7():");
+
+        for (ioffset = 0; ioffset <= INDEXES; ++ioffset)
+        {
+            INIT;
+            PRINTLEAF("Before", ioffset, 7, oleaf7);
+            JU_INSERTINPLACE7(oleaf7, INDEXES, ioffset, oIndex);
+            PrintLeaf("After ", ioffset, 7, oleaf7);
+        }
+#endif // JU_64BIT
+
+        (void) puts("\nJU_DELETEINPLACE():");
+
+        for (ioffset = 0; ioffset < INDEXES; ++ioffset)
+        {
+            INIT;
+            PRINTLEAF("Before", ioffset, WSIZE, (uint8_t *) eleaf);
+            JU_DELETEINPLACE(eleaf, INDEXES, ioffset);
+            PrintLeaf("After ", ioffset, WSIZE, (uint8_t *) eleaf);
+        }
+
+        (void) puts("\nJU_DELETEINPLACE_ODD(3):");
+
+        for (ioffset = 0; ioffset < INDEXES; ++ioffset)
+        {
+            INIT;
+            PRINTLEAF("Before", ioffset, 3, oleaf3);
+            JU_DELETEINPLACE_ODD(oleaf3, INDEXES, ioffset, 3);
+            PrintLeaf("After ", ioffset, 3, oleaf3);
+        }
+
+#ifdef JU_64BIT
+        (void) puts("\nJU_DELETEINPLACE_ODD(5):");
+
+        for (ioffset = 0; ioffset < INDEXES; ++ioffset)
+        {
+            INIT;
+            PRINTLEAF("Before", ioffset, 5, oleaf5);
+            JU_DELETEINPLACE_ODD(oleaf5, INDEXES, ioffset, 5);
+            PrintLeaf("After ", ioffset, 5, oleaf5);
+        }
+
+        (void) puts("\nJU_DELETEINPLACE_ODD(6):");
+
+        for (ioffset = 0; ioffset < INDEXES; ++ioffset)
+        {
+            INIT;
+            PRINTLEAF("Before", ioffset, 6, oleaf6);
+            JU_DELETEINPLACE_ODD(oleaf6, INDEXES, ioffset, 6);
+            PrintLeaf("After ", ioffset, 6, oleaf6);
+        }
+
+        (void) puts("\nJU_DELETEINPLACE_ODD(7):");
+
+        for (ioffset = 0; ioffset < INDEXES; ++ioffset)
+        {
+            INIT;
+            PRINTLEAF("Before", ioffset, 7, oleaf7);
+            JU_DELETEINPLACE_ODD(oleaf7, INDEXES, ioffset, 7);
+            PrintLeaf("After ", ioffset, 7, oleaf7);
+        }
+#endif // JU_64BIT
+
+        (void) puts("\nJU_INSERTCOPY():");
+
+        for (ioffset = 0; ioffset <= INDEXES; ++ioffset)
+        {
+            INIT2;
+            PRINTLEAF("Before, src ", ioffset, WSIZE, (uint8_t *) eleaf);
+            PRINTLEAF("Before, dest", ioffset, WSIZE, (uint8_t *) eleaf_2);
+            JU_INSERTCOPY(eleaf_2, eleaf, INDEXES, ioffset, eIndex);
+            PRINTLEAF("After,  src ", ioffset, WSIZE, (uint8_t *) eleaf);
+            PrintLeaf("After,  dest", ioffset, WSIZE, (uint8_t *) eleaf_2);
+        }
+
+        (void) puts("\nJU_INSERTCOPY3():");
+
+        for (ioffset = 0; ioffset <= INDEXES; ++ioffset)
+        {
+            INIT2;
+            PRINTLEAF("Before, src ", ioffset, 3, oleaf3);
+            PRINTLEAF("Before, dest", ioffset, 3, oleaf3_2);
+            JU_INSERTCOPY3(oleaf3_2, oleaf3, INDEXES, ioffset, oIndex);
+            PRINTLEAF("After,  src ", ioffset, 3, oleaf3);
+            PrintLeaf("After,  dest", ioffset, 3, oleaf3_2);
+        }
+
+#ifdef JU_64BIT
+        (void) puts("\nJU_INSERTCOPY5():");
+
+        for (ioffset = 0; ioffset <= INDEXES; ++ioffset)
+        {
+            INIT2;
+            PRINTLEAF("Before, src ", ioffset, 5, oleaf5);
+            PRINTLEAF("Before, dest", ioffset, 5, oleaf5_2);
+            JU_INSERTCOPY5(oleaf5_2, oleaf5, INDEXES, ioffset, oIndex);
+            PRINTLEAF("After,  src ", ioffset, 5, oleaf5);
+            PrintLeaf("After,  dest", ioffset, 5, oleaf5_2);
+        }
+
+        (void) puts("\nJU_INSERTCOPY6():");
+
+        for (ioffset = 0; ioffset <= INDEXES; ++ioffset)
+        {
+            INIT2;
+            PRINTLEAF("Before, src ", ioffset, 6, oleaf6);
+            PRINTLEAF("Before, dest", ioffset, 6, oleaf6_2);
+            JU_INSERTCOPY6(oleaf6_2, oleaf6, INDEXES, ioffset, oIndex);
+            PRINTLEAF("After,  src ", ioffset, 6, oleaf6);
+            PrintLeaf("After,  dest", ioffset, 6, oleaf6_2);
+        }
+
+        (void) puts("\nJU_INSERTCOPY7():");
+
+        for (ioffset = 0; ioffset <= INDEXES; ++ioffset)
+        {
+            INIT2;
+            PRINTLEAF("Before, src ", ioffset, 7, oleaf7);
+            PRINTLEAF("Before, dest", ioffset, 7, oleaf7_2);
+            JU_INSERTCOPY7(oleaf7_2, oleaf7, INDEXES, ioffset, oIndex);
+            PRINTLEAF("After,  src ", ioffset, 7, oleaf7);
+            PrintLeaf("After,  dest", ioffset, 7, oleaf7_2);
+        }
+#endif // JU_64BIT
+
+        (void) puts("\nJU_DELETECOPY():");
+
+        for (ioffset = 0; ioffset < INDEXES; ++ioffset)
+        {
+            INIT2;
+            PRINTLEAF("Before, src ", ioffset, WSIZE, (uint8_t *) eleaf);
+            PRINTLEAF("Before, dest", ioffset, WSIZE, (uint8_t *) eleaf_2);
+            JU_DELETECOPY(eleaf_2, eleaf, INDEXES, ioffset, ignore);
+            PRINTLEAF("After,  src ", ioffset, WSIZE, (uint8_t *) eleaf);
+            PrintLeaf("After,  dest", ioffset, WSIZE, (uint8_t *) eleaf_2);
+        }
+
+        (void) puts("\nJU_DELETECOPY_ODD(3):");
+
+        for (ioffset = 0; ioffset < INDEXES; ++ioffset)
+        {
+            INIT2;
+            PRINTLEAF("Before, src ", ioffset, 3, oleaf3);
+            PRINTLEAF("Before, dest", ioffset, 3, oleaf3_2);
+            JU_DELETECOPY_ODD(oleaf3_2, oleaf3, INDEXES, ioffset, 3);
+            PRINTLEAF("After,  src ", ioffset, 3, oleaf3);
+            PrintLeaf("After,  dest", ioffset, 3, oleaf3_2);
+        }
+
+#ifdef JU_64BIT
+        (void) puts("\nJU_DELETECOPY_ODD(5):");
+
+        for (ioffset = 0; ioffset < INDEXES; ++ioffset)
+        {
+            INIT2;
+            PRINTLEAF("Before, src ", ioffset, 5, oleaf5);
+            PRINTLEAF("Before, dest", ioffset, 5, oleaf5_2);
+            JU_DELETECOPY_ODD(oleaf5_2, oleaf5, INDEXES, ioffset, 5);
+            PRINTLEAF("After,  src ", ioffset, 5, oleaf5);
+            PrintLeaf("After,  dest", ioffset, 5, oleaf5_2);
+        }
+
+        (void) puts("\nJU_DELETECOPY_ODD(6):");
+
+        for (ioffset = 0; ioffset < INDEXES; ++ioffset)
+        {
+            INIT2;
+            PRINTLEAF("Before, src ", ioffset, 6, oleaf6);
+            PRINTLEAF("Before, dest", ioffset, 6, oleaf6_2);
+            JU_DELETECOPY_ODD(oleaf6_2, oleaf6, INDEXES, ioffset, 6);
+            PRINTLEAF("After,  src ", ioffset, 6, oleaf6);
+            PrintLeaf("After,  dest", ioffset, 6, oleaf6_2);
+        }
+
+        (void) puts("\nJU_DELETECOPY_ODD(7):");
+
+        for (ioffset = 0; ioffset < INDEXES; ++ioffset)
+        {
+            INIT2;
+            PRINTLEAF("Before, src ", ioffset, 7, oleaf7);
+            PRINTLEAF("Before, dest", ioffset, 7, oleaf7_2);
+            JU_DELETECOPY_ODD(oleaf7_2, oleaf7, INDEXES, ioffset, 7);
+            PRINTLEAF("After,  src ", ioffset, 7, oleaf7);
+            PrintLeaf("After,  dest", ioffset, 7, oleaf7_2);
+        }
+#endif // JU_64BIT
+
+        return(0);
+
+} // main()
+
+#endif // TEST_INSDEL
diff --git a/libs/klib/judy/JudySL.c b/libs/klib/judy/JudySL.c
new file mode 100644
index 0000000..637782d
--- /dev/null
+++ b/libs/klib/judy/JudySL.c
@@ -0,0 +1,1125 @@
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+// JUDY FUNCTIONS FOR STRING INDEXES, where associated values are longs.  One
+// JudySL*() corresponds to each JudyL*() function (with exceptions).
+//
+// See the manual entry for details.
+//
+// METHOD:  Break up each null-terminated Index (string) into chunks of W
+// bytes, where W is the machines word size, with null-padding in the last
+// word if necessary.  Store strings as a tree of JudyL arrays, that is, array
+// of array of array...  where each level consumes W bytes (one word) as an
+// index to the JudyL array at that level.  Since strings can begin on
+// arbitrary byte boundaries, copy each chunk of W bytes from Index into a
+// word-aligned object before using it as a Judy index.
+//
+// The JudySL tree also supports "single-index shortcut leaves".  A simple
+// JudySL array (tree of JudyL arrays) would go as many levels deep as the
+// Index (string) is long, which wastes time and memory when an Index is unique
+// beyond a certain point.  When theres just one Index under a pointer, given
+// a reliable way to tell that the pointer is not a root pointer to another
+// JudyL array, it should save a lot of time to instead point to a "leaf"
+// object, similar to leaves in JudyL arrays.
+//
+// TBD:  Multi-index leaves, like those in JudyL, are also worth considering,
+// but their payback for JudySL is less certain.  Likewise, shortcut branches
+// are worth considering too.
+//
+// This code uses the Judy.h definitions and Doug Baskins convention of a "P"
+// prefix for pointers, except no "P" for the first level of char * (strings).
+
+// IMPORTS:
+
+#include <string.h>                     // for strcmp(), strlen(), strcpy()
+#include <Judy.h>
+
+#ifndef NDEDUG
+#define NDEBUG 1
+#endif
+#include <assert.h>
+
+//=======================================================================
+// Compile:
+//
+//    cc -O JudyHS.c -c
+//
+//    Notes:
+//    1) use -DJU_64BIT for 64 bit compiles (HP, Sun, IPF, Motorola/IBM? etc..)
+//    2) In gcc version 3.3.1 for a Centrino, -O2 is faster than -O
+//    3) In gcc version 3.3.2 for a Centrino, -O3 is faster than -O2
+//=======================================================================
+
+#define JU_SET_ERRNO(PJERROR, JERRNO)           \
+{                                               \
+    if (PJERROR != (PJError_t)NULL)             \
+    {                                           \
+        JU_ERRNO(PJERROR) = (JERRNO);           \
+        JU_ERRID(PJERROR) = __LINE__;           \
+    }                                           \
+}
+
+#define JU_SET_ERRNO_NONNULL(PJERROR, JERRNO)   \
+{                                               \
+    JU_ERRNO(PJERROR) = (JERRNO);               \
+    JU_ERRID(PJERROR) = __LINE__;               \
+}
+
+// SUPPORT FOR HANDLING WORDS:
+
+#define WORDSIZE     (sizeof (Word_t))  // bytes in word = JudyL index.
+#define WORDS(BYTES) (((BYTES) + WORDSIZE - 1) / WORDSIZE)      // round up.
+
+// To mark a pointer is to a "short cut leaf", set least bit
+
+#define IS_PSCL(PSCL)     (((Word_t) (PSCL)) & JLAP_INVALID)
+#define CLEAR_PSCL(PSCL)  ((Pscl_t)(((Word_t) (PSCL)) & (~JLAP_INVALID)))
+#define SET_PSCL(PSCL)    (((Word_t) (PSCL)) | JLAP_INVALID)
+
+// MISCELLANEOUS GLOBALS:
+
+// Get the Index (string) length in bytes, including the trailing \0, which
+// is an integral part of the string:
+
+// A string is "in the last word" if a previously-set byte count is at or below
+// the system word size, or in some cases if the last byte in the (null-padded)
+// word is null (assume big-endian, including in a register on a little-endian
+// machine):
+
+#define LASTWORD_BY_VALUE(WORD) (! ((WORD) & 0xffL))
+
+#ifdef JU_64BIT
+
+// copy from 1..7 bytes from string to Word_t and test if \0 bytes
+//
+#define        COPYSTRINGtoWORD(WORD,STR)               \
+{                                                       \
+    do                                                  \
+    {                                                   \
+        uint8_t chr;                                    \
+        WORD =      (Word_t)(STR)[0] << 56;             \
+        if (!(WORD)) break;                             \
+        if (!(chr  = (STR)[1])) break;                  \
+        WORD += ((Word_t)(chr) << 48);                  \
+        if (!(chr  = (STR)[2])) break;                  \
+        WORD += ((Word_t)(chr) << 40);                  \
+        if (!(chr  = (STR)[3])) break;                  \
+        WORD += ((Word_t)(chr) << 32);                  \
+        if (!(chr  = (STR)[4])) break;                  \
+        WORD += ((Word_t)(chr) << 24);                  \
+        if (!(chr  = (STR)[5])) break;                  \
+        WORD += ((Word_t)(chr) << 16);                  \
+        if (!(chr  = (STR)[6])) break;                  \
+        WORD += ((Word_t)(chr) << 8) + (STR)[7];        \
+    } while(0);                                         \
+}
+
+// copy Word_t from 1..8 bytes to string and test of \0 bytes
+//
+#define         COPYWORDtoSTRING(STR,WORD)                      \
+{                                                               \
+    do                                                          \
+    {                                                           \
+        if (!((STR)[0] = (uint8_t)((WORD) >> 56))) break;       \
+        if (!((STR)[1] = (uint8_t)((WORD) >> 48))) break;       \
+        if (!((STR)[2] = (uint8_t)((WORD) >> 40))) break;       \
+        if (!((STR)[3] = (uint8_t)((WORD) >> 32))) break;       \
+        if (!((STR)[4] = (uint8_t)((WORD) >> 24))) break;       \
+        if (!((STR)[5] = (uint8_t)((WORD) >> 16))) break;       \
+        if (!((STR)[6] = (uint8_t)((WORD) >>  8))) break;       \
+        (STR)[7]       = (uint8_t)(WORD);                       \
+    } while(0);                                                 \
+}
+
+#else  // JU_32BIT
+
+// copy from 1..4 bytes from string to Word_t and test if \0 bytes
+
+#define        COPYSTRINGtoWORD(WORD,STR)               \
+{                                                       \
+    do                                                  \
+    {                                                   \
+        uint8_t chr;                                    \
+        WORD =       (STR)[0] << 24;                    \
+        if (WORD == 0) break;                           \
+        if (!(chr  = (STR)[1])) break;                  \
+        WORD += (Word_t)(chr << 16);                    \
+        if (!(chr  = (STR)[2])) break;                  \
+        WORD += (Word_t)(chr << 8) + (STR)[3];          \
+    } while(0);                                         \
+}
+
+// copy Word_t from 1..4 bytes to string and test of \0 bytes
+
+#define        COPYWORDtoSTRING(STR,WORD)                       \
+{                                                               \
+    do                                                          \
+    {                                                           \
+        if (!((STR)[0] = (uint8_t)((WORD) >> 24))) break;       \
+        if (!((STR)[1] = (uint8_t)((WORD) >> 16))) break;       \
+        if (!((STR)[2] = (uint8_t)((WORD) >>  8))) break;       \
+        (STR)[3]       = (uint8_t)(WORD);                       \
+    } while(0);                                                 \
+}
+#endif // JU_32BIT
+
+
+// SUPPORT FOR SINGLE-INDEX SHORTCUT LEAVES:
+
+typedef struct SHORCUTLEAF
+{
+    Pvoid_t   scl_Pvalue;               // callers value area.
+    uint8_t   scl_Index[WORDSIZE];      // base Index string.
+} scl_t  , *Pscl_t;
+
+// overhead of the scl_Pvalue only, the scl_Index is calculate elsewhere
+
+#define STRUCTOVD       (sizeof(scl_t) - WORDSIZE)
+
+// How big to malloc a shortcut leaf; stringlen should already include the
+// trailing null char:
+
+#define SCLSIZE(LEN)  (((LEN) + STRUCTOVD + WORDSIZE - 1) / WORDSIZE)
+
+// string routines, may replace with your own
+//
+#define STRCMP(S1,S2)   strcmp((void *)(S1), (void *)(S2))
+#define STRCPY(S1,S2)   strcpy((void *)(S1), (void *)(S2))
+#define STRLEN(S1)      (strlen((void *)(S1)) + 1)
+
+
+// Index and value area for a shortcut leaf, depending on how it matches the
+// undecoded remainder of the Index, given a Pscl_t that includes type bits
+// that must be cleared:
+//
+// PSCLINDEX() and PSCLVALUE() are also useful when Pscl contains uncleared
+// TYPE bits.
+//
+// Note:  SCLCMP() cannot take advantage of knowing the Index length because
+// the scl_Index length is not pre-known when these macros are used.
+
+#define PSCLINDEX(PSCL)  ((CLEAR_PSCL(PSCL))->scl_Index)
+#define PSCLVALUE(PSCL)  ((CLEAR_PSCL(PSCL))->scl_Pvalue)
+
+#define SCLCMP(INDEX,PSCL) STRCMP(INDEX, PSCLINDEX(PSCL))
+
+#define PPSCLVALUE_EQ(INDEX,PSCL)                                       \
+    ((SCLCMP(INDEX, PSCL) == 0) ? &PSCLVALUE(PSCL) : (PPvoid_t)NULL)
+
+#define PPSCLVALUE_LT(INDEX,PSCL)                                       \
+    ((SCLCMP(INDEX, PSCL) < 0) ? &PSCLVALUE(PSCL) : (PPvoid_t)NULL)
+
+#define PPSCLVALUE_GT(INDEX,PSCL)                                       \
+    ((SCLCMP(INDEX, PSCL) > 0) ? &PSCLVALUE(PSCL) : (PPvoid_t)NULL)
+
+// Common in-lined code to append or free a shortcut leaf:
+//
+// See header comments about premature return().  Note that malloc() does not
+// pre-zero the memory, so ensure scl_Pvalue is zeroed, just like a value area
+// in a JudyL array.  Hope strcpy() is fast enough in this context.
+
+#define APPEND_SCL(PSCL,PPARRAY,INDEX,LEN,PJERROR)                      \
+{                                                                       \
+    if (((PSCL) = (Pscl_t) JudyMalloc(SCLSIZE(LEN))) == (Pscl_t)NULL)   \
+    {                                                                   \
+        JU_SET_ERRNO(PJERROR, JU_ERRNO_NOMEM);                          \
+        return (PPJERR);                                                \
+    }                                                                   \
+    *(PPARRAY) = (Pvoid_t)SET_PSCL(PSCL);                               \
+    ((PSCL)->scl_Pvalue) = (Pvoid_t)NULL;                               \
+    (void)STRCPY((PSCL)->scl_Index, INDEX);                             \
+}
+
+// "FORWARD" DECLARATIONS:
+
+static void JudySLModifyErrno(PJError_t PJError,
+                              Pcvoid_t PArray, Pcvoid_t PArrayOrig);
+static int JudySLDelSub(PPvoid_t PPArray, PPvoid_t PPArrayOrig,
+                        const uint8_t * Index, Word_t len, PJError_t PJError);
+static PPvoid_t JudySLPrevSub(Pcvoid_t PArray, uint8_t * Index, int orig,
+                              Word_t len, PJError_t PJError);
+static PPvoid_t JudySLNextSub(Pcvoid_t PArray, uint8_t * Index, int orig,
+                              Word_t len, PJError_t PJError);
+
+// ****************************************************************************
+// J U D Y   S L   M O D I F Y   E R R N O
+//
+// Common code for error translation:  When a caller passes an invalid JAP
+// ("not a JudyL pointer"), OR if the JudySL array is corrupted at a lower
+// level, various JudyL*() calls return JU_ERRNO_NOTJUDYL.  If the caller wants
+// detailed error info, convert this particular error to JU_ERRNO_NOTJUDYSL if
+// at the top of the tree, otherwise convert it to JU_ERRNO_CORRUPT, meaning
+// there was a corruption (the only one even detectable outside JudyL) in the
+// JudySL tree; but pass through any other errors unaltered.
+
+static void
+JudySLModifyErrno(PJError_t PJError,    // to modify if non-null.
+                  Pcvoid_t PArray,      // current JudyL array.
+                  Pcvoid_t PArrayOrig   // top-of-tree JudyL array.
+    )
+{                                       //  map this Judy errno.
+    if ((PJError != PJE0) && (JU_ERRNO(PJError) == JU_ERRNO_NOTJUDYL))
+    {
+        if (PArray == PArrayOrig)       // callers fault.
+        {
+            JU_SET_ERRNO_NONNULL(PJError, JU_ERRNO_NOTJUDYSL);
+        }
+        else                            // lower level.
+        {
+            JU_SET_ERRNO_NONNULL(PJError, JU_ERRNO_CORRUPT);
+        }
+    }
+}                                       // JudySLModifyErrno()
+
+// ****************************************************************************
+// J U D Y   S L   G E T
+//
+// See comments in file header and below.
+
+PPvoid_t
+JudySLGet(Pcvoid_t PArray, const uint8_t * Index, PJError_t PJError)
+{
+    const uint8_t *pos = Index;         // place in Index.
+    Word_t    indexword;                // buffer for aligned copy.
+    PPvoid_t  PPValue;                  // from JudyL array.
+
+// CHECK FOR CALLER ERROR (NULL POINTER):
+
+    if (Index == (uint8_t *) NULL)
+    {
+        JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+        return (PPJERR);
+    }
+
+// SEARCH NEXT LEVEL JUDYL ARRAY IN TREE:
+//
+// Use or copy each word from the Index string and check for it in the next
+// level JudyL array in the array tree, but first watch for shortcut leaves.
+// Upon invalid Index or end of Index (string) in current word, return.
+
+    do                                  // until return.
+    {
+        if (IS_PSCL(PArray))            // a shortcut leaf.
+            return (PPSCLVALUE_EQ(pos, PArray));
+
+        COPYSTRINGtoWORD(indexword, pos);       // copy next 4[8] bytes.
+
+        JLG(PPValue, PArray, indexword);
+
+        if ((PPValue == (PPvoid_t) NULL) || LASTWORD_BY_VALUE(indexword))
+            return (PPValue);
+
+// CONTINUE TO NEXT LEVEL DOWN JUDYL ARRAY TREE:
+//
+// If a previous JudySLIns() ran out of memory partway down the tree, it left a
+// null *PPValue; this is automatically treated here as a dead-end (not a core
+// dump or assertion; see version 1.25).
+
+        pos += WORDSIZE;
+        PArray = *PPValue;              // each value -> next array.
+    } while(1);                         // forever
+//  NOTREACHED JudySLGet()
+}
+
+// ****************************************************************************
+// J U D Y   S L   I N S
+//
+// See also the comments in JudySLGet(), which is somewhat similar, though
+// simpler.
+//
+// Theory of operation:
+//
+// Upon encountering a null pointer in the tree of JudyL arrays, insert a
+// shortcut leaf -- including directly under a null root pointer for the first
+// Index in the JudySL array.
+//
+// Upon encountering a pre-existing shortcut leaf, if the old Index is equal to
+// the new one, return the old value area.  Otherwise, "carry down" the old
+// Index until the old and new Indexes diverge, at which point each Index
+// either terminates in the last JudyL array or a new shortcut leaf is inserted
+// under it for the Indexs remainder.
+//
+// TBD:  Running out of memory below the starting point causes a premature
+// return below (in several places) and leaves a dead-end in the JudySL tree.
+// Ideally the code here would back this out rather than wasting a little
+// memory, but in lieu of that, the get, delete, and search functions
+// understand dead-ends and handle them appropriately.
+
+PPvoid_t
+JudySLIns(PPvoid_t PPArray, const uint8_t * Index, PJError_t PJError)
+{
+    PPvoid_t  PPArrayOrig = PPArray;    // for error reporting.
+    const uint8_t *pos = Index;         // place in Index.
+    const uint8_t *pos2 = (uint8_t *) NULL;     // old Index (SCL being moved).
+    Word_t    len;                      // bytes remaining.
+
+// Note:  len2 is set when needed and only used when valid, but this is not
+// clear to gcc -Wall, so initialize it here to avoid a warning:
+
+    Word_t    len2 = 0;                 // for old Index (SCL being moved).
+    Word_t    scl2 = 0;                 // size in words of SCL
+    Word_t    indexword;                // buffer for aligned copy.
+    Word_t    indexword2;               // for old Index (SCL being moved).
+    PPvoid_t  PPValue;                  // from JudyL array.
+    PPvoid_t  PPValue2;                 // for old Index (SCL being moved).
+    Pscl_t    Pscl = (Pscl_t) NULL;     // shortcut leaf.
+    Pscl_t    Pscl2;                    // for old Index (SCL being moved).
+
+// CHECK FOR CALLER ERROR (NULL POINTERS):
+
+    if (PPArray == (PPvoid_t) NULL)
+    {
+        JU_SET_ERRNO(PJError, JU_ERRNO_NULLPPARRAY);
+        return (PPJERR);
+    }
+    if (Index == (uint8_t *) NULL)
+    {
+        JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+        return (PPJERR);
+    }
+
+    len = STRLEN(Index);        // bytes remaining.
+
+// APPEND SHORTCUT LEAF:
+//
+// If PPArray, which is the root pointer to the first or next JudyL array in
+// the tree, points to null (no next JudyL array), AND there is no shortcut
+// leaf being carried down, append a shortcut leaf here for the new Index, no
+// matter how much of the Index string remains (one or more bytes, including
+// the trailing \0).
+
+    while (1)                           // until return.
+    {
+        if (*PPArray == (Pvoid_t)NULL)  // no next JudyL array.
+        {
+            if (Pscl == (Pscl_t) NULL)  // no SCL being carried down.
+            {
+                APPEND_SCL(Pscl, PPArray, pos, len, PJError);   // returns if error.
+                return (&(Pscl->scl_Pvalue));
+            }
+            // else do nothing here; see below.
+        }
+
+// CARRY DOWN PRE-EXISTING SHORTCUT LEAF:
+//
+// When PPArray points to a pre-existing shortcut leaf, if its Index is equal
+// to the Index to be inserted, meaning no insertion is required, return its
+// value area; otherwise, "move it aside" and "carry it down" -- replace it
+// (see below) with one or more levels of JudyL arrays.  Moving it aside
+// initially just means setting Pscl non-null, both as a flag and for later
+// use, and clearing the pointer to the SCL in the JudyL array.
+
+        else if (IS_PSCL(*PPArray))
+        {
+            assert(Pscl == (Pscl_t) NULL);      // no nested SCLs.
+
+            Pscl = CLEAR_PSCL(*PPArray);
+
+            pos2 = Pscl->scl_Index;     // note: pos2 is always word-aligned.
+            len2 = STRLEN(pos2);        // bytes remaining.
+
+//          first check if string is already inserted
+
+            if ((len == len2) && (STRCMP(pos, pos2) == 0))
+                return (&(Pscl->scl_Pvalue));
+
+            *PPArray = (Pvoid_t)NULL;   // disconnect SCL.
+
+            scl2 = SCLSIZE(len2);       // save for JudyFree
+
+            // continue with *PPArray now clear, and Pscl, pos2, len2 set.
+        }
+
+// CHECK IF OLD AND NEW INDEXES DIVERGE IN THE CURRENT INDEX WORD:
+//
+// If a shortcut leaf is being carried down and its remaining Index chars now
+// diverge from the remaining chars of the Index being inserted, that is, if
+// the next words of each Index differ, "plug in" the old Index here, in a new
+// JudyL array, before proceeding.
+//
+// Note:  Call JudyLIns() for the SCL Index word before calling it for the new
+// Index word, so PPValue remains correct for the latter.  (JudyLIns() return
+// values are not stable across multiple calls.)
+//
+// Note:  Although pos2 is word-aligned, and a Pscl_t is a whole number of
+// words in size, pos2 is not certain to be null-padded through a whole word,
+// so copy it first to an index word for later use.
+//
+// See header comments about premature return().
+
+        COPYSTRINGtoWORD(indexword, pos);       // copy next 4[8] bytes.
+
+        if (Pscl != (Pscl_t) NULL)
+        {
+            COPYSTRINGtoWORD(indexword2, pos2); // copy next 4[8] bytes.
+
+            if (indexword != indexword2)        // SCL and new Indexes diverge.
+            {
+                assert(*PPArray == (Pvoid_t)NULL);      // should be new JudyL array.
+
+// Note:  If JudyLIns() returns JU_ERRNO_NOTJUDYL here, *PPArray should not be
+// modified, so JudySLModifyErrno() can do the right thing.
+
+                if ((PPValue2 = JudyLIns(PPArray, indexword2, PJError))
+                    == PPJERR)
+                {
+                    JudySLModifyErrno(PJError, *PPArray, *PPArrayOrig);
+                    return (PPJERR);
+                }
+
+                assert(PPValue2 != (PPvoid_t) NULL);
+
+// If the old (SCL) Index terminates here, copy its value directly into the
+// JudyL value area; otherwise create a new shortcut leaf for it, under
+// *PPValue2 (skipping the word just inserted), and copy its value to the new
+// SCL:
+
+                if (len2 <= WORDSIZE)
+                {
+                    *((PWord_t)PPValue2) = (Word_t)(Pscl->scl_Pvalue);
+                }
+                else
+                {
+                    APPEND_SCL(Pscl2, PPValue2, pos2 + WORDSIZE,
+                               len2 - WORDSIZE, PJError);
+                    (Pscl2->scl_Pvalue) = Pscl->scl_Pvalue;
+                }
+//              old SCL no longer needed.
+
+                JudyFree((void *)Pscl, scl2);
+
+                Pscl = (Pscl_t) NULL;
+            }
+        }
+
+// APPEND NEXT LEVEL JUDYL ARRAY TO TREE:
+//
+// If a shortcut leaf was carried down and diverged at this level, the code
+// above already appended the new JudyL array, but the next word of the new
+// Index still must be inserted in it.
+//
+// See header comments about premature return().
+//
+// Note:  If JudyLIns() returns JU_ERRNO_NOTJUDYL here, *PPArray should not be
+// modified, so JudySLModifyErrno() can do the right thing.
+
+        if ((PPValue = JudyLIns(PPArray, indexword, PJError)) == PPJERR)
+        {
+            JudySLModifyErrno(PJError, *PPArray, *PPArrayOrig);
+            return (PPJERR);
+        }
+
+        assert(PPValue != (PPvoid_t) NULL);
+
+// CHECK IF NEW INDEX TERMINATES:
+//
+// Note that if it does, and an old SCL was being carried down, it must have
+// diverged by this point, and is already handled.
+
+        if (len <= WORDSIZE)
+        {
+            assert(Pscl == (Pscl_t) NULL);
+            return (PPValue);           // is value for whole Index string.
+        }
+
+        pos += WORDSIZE;
+        len -= WORDSIZE;
+        pos2 += WORDSIZE;               // useless unless Pscl is set.
+        len2 -= WORDSIZE;
+
+        PPArray = PPValue;              // each value -> next array.
+    }                                   // while.
+}                                       // NOTREACHED, JudySLIns()
+
+// ****************************************************************************
+// J U D Y   S L   D E L
+//
+// See the comments in JudySLGet(), which is somewhat similar.
+//
+// Unlike JudySLGet() and JudySLIns(), recurse downward through the tree of
+// JudyL arrays to find and delete the given Index, if present, and then on the
+// way back up, any of its parent arrays which ends up empty.
+//
+// TECHNICAL NOTES:
+//
+// Recursion seems bad, but this allows for an arbitrary-length Index.  Also, a
+// more clever iterative solution that used JudyLCount() (see below) would
+// still require a function call per tree level, so why not just recurse?
+//
+// An earlier version (1.20) used a fixed-size stack, which limited the Index
+// size.  We were going to replace this with using JudyLCount(), in order to
+// note and return to (read this carefully) the highest level JudyL array with
+// a count of 1, all of whose descendant JudyL arrays also have a count of 1,
+// and delete from that point downwards.  This solution would traverse the
+// array tree downward looking to see if the given Index is in the tree, then
+// if so, delete layers downwards starting below the last one that contains
+// other Indexes than the one being deleted.
+//
+// TBD:  To save time coding, and to very likely save time overall during
+// execution, this function does "lazy deletions", or putting it more nicely,
+// it allows "hysteresis" in the JudySL tree, when shortcut leafs are present.
+// It only removes the specified Index, and recursively any empty JudyL arrays
+// above it, without fully reversing the effects of JudySLIns().  This is
+// probably OK because any application that calls JudySLDel() is likely to call
+// JudySLIns() again with the same or a neighbor Index.
+
+int
+JudySLDel(PPvoid_t PPArray, const uint8_t * Index, PJError_t PJError)   // optional, for returning error info.
+{
+
+// Check for caller error (null pointer):
+
+    if (PPArray == (PPvoid_t) NULL)
+    {
+        JU_SET_ERRNO(PJError, JU_ERRNO_NULLPPARRAY);
+        return (JERR);
+    }
+    if (Index == (uint8_t *) NULL)
+    {
+        JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+        return (JERR);
+    }
+
+// Do the deletion:
+
+    return (JudySLDelSub(PPArray, PPArray, Index, STRLEN(Index), PJError));
+
+}                                       // JudySLDel()
+
+// ****************************************************************************
+// J U D Y   S L   D E L   S U B
+//
+// This is the "engine" for JudySLDel() that expects aligned and len to already
+// be computed (only once).  See the header comments for JudySLDel().
+
+static int
+JudySLDelSub(PPvoid_t PPArray,          // in which to delete.
+             PPvoid_t PPArrayOrig,      // for error reporting.
+             const uint8_t * Index,     // to delete.
+             Word_t len,                // bytes remaining.
+             PJError_t PJError)         // optional, for returning error info.
+{
+    Word_t    indexword;                // next word to find.
+    PPvoid_t  PPValue;                  // from JudyL array.
+    int       retcode;                  // from lower-level call.
+
+    assert(PPArray != (PPvoid_t) NULL);
+    assert(Index != (uint8_t *) NULL);
+
+// DELETE SHORTCUT LEAF:
+//
+// As described above, this can leave an empty JudyL array, or one containing
+// only a single other Index word -- which could be, but is not, condensed into
+// a higher-level shortcut leaf.  More precisely, at this level it leaves a
+// temporary "dead end" in the JudySL tree, similar to when running out of
+// memory during JudySLIns(), and this is somewhat cleaned up by higher
+// recursions of the same function (see below); but remaining shortcut leaves
+// for other Indexes are not coalesced.
+
+    if (IS_PSCL(*PPArray))
+    {
+        Pscl_t    Pscll = CLEAR_PSCL(*PPArray);
+        Word_t    words;
+
+        if (STRCMP(Index, Pscll->scl_Index))
+            return (0);                 // incorrect index.
+
+        words = SCLSIZE(STRLEN(Pscll->scl_Index));
+        JudyFree((void *)Pscll, words);
+
+        *PPArray = (Pvoid_t)NULL;
+        return (1);                     // correct index deleted.
+    }
+
+// DELETE LAST INDEX WORD, FROM CURRENT JUDYL ARRAY:
+//
+// When at the end of the full Index, delete the last word, if present, from
+// the current JudyL array, and return the result all the way up.
+
+    COPYSTRINGtoWORD(indexword, Index); // copy next 4[8] bytes.
+
+    if (len <= WORDSIZE)
+    {
+        if ((retcode = JudyLDel(PPArray, indexword, PJError)) == JERR)
+        {
+            JudySLModifyErrno(PJError, *PPArray, *PPArrayOrig);
+            return (JERR);
+        }
+        return (retcode);
+    }
+
+// DELETE BELOW NON-LAST INDEX WORD IN CURRENT JUDYL ARRAY:
+//
+// If a word before the end of the full Index is present in the current JudyL
+// array, recurse through its value, which must be a pointer to another JudyL
+// array, to continue the deletion at the next level.  Return the JudyLGet()
+// return if the Indexs current word is not in the JudyL array, or if no
+// delete occurs below this level, both of which mean the whole Index is not
+// currently valid.
+//
+
+    JLG(PPValue, *PPArray, indexword);
+    if (PPValue == (PPvoid_t) NULL)
+        return (0);                     // Index not in JudySL array.
+// If a previous JudySLIns() ran out of memory partway down the tree, it left a
+// null *PPValue; this is automatically treated as a dead-end (not a core dump
+// or assertion; see version 1.25).
+    if ((retcode =
+         JudySLDelSub(PPValue, PPArrayOrig, Index + WORDSIZE,
+                      len - WORDSIZE, PJError)) != 1)
+    {
+        return (retcode);               // no lower-level delete, or error.
+    }
+
+// DELETE EMPTY JUDYL ARRAY:
+//
+// A delete occurred below in the tree.  If the child JudyL array became empty,
+// delete the current Index word from the current JudyL array, which could
+// empty the current array and null out *PPArray in turn (or pass through an
+// error).  Otherwise simply indicate that a deletion did occur.
+
+    if (*PPValue == (Pvoid_t)NULL)
+    {
+        if ((retcode = JudyLDel(PPArray, indexword, PJError)) == JERR)
+        {
+            JudySLModifyErrno(PJError, *PPArray, *PPArrayOrig);
+            return (JERR);
+        }
+
+        return (retcode);
+    }
+
+    return (1);
+}                                       // JudySLDelSub()
+
+// ****************************************************************************
+// J U D Y   S L   P R E V
+//
+// Recursively traverse the JudySL tree downward using JudyLGet() to look for
+// each successive index word from Index in the JudyL array at each level.  At
+// the last level for the Index (LASTWORD_BY_LEN()), use JudyLPrev() instead of
+// JudyLGet(), to exclude the initial Index.  If this doesnt result in finding
+// a previous Index, work back up the tree using JudyLPrev() at each higher
+// level to search for a previous index word.  Upon finding a previous index
+// word, descend again if/as necessary, this time inclusively, to find and
+// return the full previous Index.
+//
+// Also support shortcut leaves.
+//
+// Since this function is recursive and it also needs to know if its still
+// looking for the original Index (to exclude it at the LASTWORD_BY_LEN()
+// level) or for the remaining words of the previous Index (inclusive),
+// actually call a subroutine that takes an additional parameter.
+//
+// See also the technical notes in JudySLDel() regarding the use of recursion
+// rather than iteration.
+
+PPvoid_t
+JudySLPrev(Pcvoid_t PArray, uint8_t * Index, PJError_t PJError) // optional, for returning error info.
+{
+// Check for caller error (null pointer), or empty JudySL array:
+
+    if (Index == (uint8_t *) NULL)
+    {
+        JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+        return (PPJERR);
+    }
+
+    if (PArray == (Pvoid_t)NULL)
+        return ((PPvoid_t) NULL);
+// Do the search:
+    return (JudySLPrevSub(PArray, Index, /* original = */ 1,
+                          STRLEN(Index), PJError));
+}                                       // JudySLPrev()
+
+// ****************************************************************************
+// J U D Y   S L   P R E V   S U B
+//
+// This is the "engine" for JudySLPrev() that knows whether its still looking
+// for the original Index (exclusive) or a neighbor index (inclusive), and that
+// expects aligned and len to already be computed (only once).  See the header
+// comments for JudySLPrev().
+
+static    PPvoid_t
+JudySLPrevSub(Pcvoid_t PArray, uint8_t * Index, int orig,
+              Word_t len,               // bytes remaining.
+              PJError_t PJError)        // optional, for returning error info.
+{
+    Word_t    indexword;                // next word to find.
+    PPvoid_t  PPValue;                  // from JudyL array.
+// ORIGINAL SEARCH:
+//
+// When at a shortcut leaf, copy its remaining Index (string) chars into Index
+// and return its value area if the current Index is after (greater than) the
+// SCLs index; otherwise return null.
+    if (orig)
+    {
+        if (IS_PSCL(PArray))
+        {
+            if ((PPValue = PPSCLVALUE_GT(Index, PArray)) != (PPvoid_t) NULL)
+                (void)STRCPY(Index, PSCLINDEX(PArray));
+            return (PPValue);
+        }
+
+// If the current Index word:
+// - is not the last word in Index (end of string),
+// - exists in the current JudyL array, and,
+// - a previous Index is found below it, return that Indexs value area.
+
+        COPYSTRINGtoWORD(indexword, Index);     // copy next 4[8] bytes.
+        if (len > WORDSIZE)             // not at end of Index.
+        {
+            JLG(PPValue, PArray, indexword);
+            if (PPValue != (PPvoid_t) NULL)
+            {
+
+// If a previous JudySLIns() ran out of memory partway down the tree, it left a
+// null *PPValue; this is automatically treated as a dead-end (not a core dump
+// or assertion; see version 1.25):
+
+                PPValue = JudySLPrevSub(*PPValue, Index + WORDSIZE,
+                                        /* original = */ 1,
+                                        len - WORDSIZE, PJError);
+                if (PPValue == PPJERR)
+                    return (PPJERR);    // propagate error.
+                if (PPValue != (PPvoid_t) NULL)
+                    return (PPValue);   // see above.
+            }
+        }
+
+// Search for previous index word:
+//
+// One of the above conditions is false.  Search the current JudyL array for
+// the Index word, if any, prior to the current index word.  If none is found,
+// return null; otherwise fall through to common later code.
+
+        if ((PPValue = JudyLPrev(PArray, &indexword, PJError)) == PPJERR)
+        {
+            JudySLModifyErrno(PJError, PArray, orig ? PArray : (Pvoid_t)NULL);
+            return (PPJERR);
+        }
+
+        if (PPValue == (PPvoid_t) NULL)
+            return ((PPvoid_t) NULL);   // no previous index word.
+    }                                   // if.
+
+// SUBSEQUENT SEARCH:
+//
+// A higher level search already excluded the initial Index, then found a
+// previous index word, and is now traversing down to determine the rest of the
+// Index and to obtain its value area.  If at a shortcut leaf, return its value
+// area.  Otherwise search the current JudyL array backward from the upper
+// limit for its last index word.  If no index word is found, return null --
+// should never happen unless the JudySL tree is corrupt; otherwise fall
+// through to common later code.
+
+    else
+    {
+        if (IS_PSCL(PArray))            // at shortcut leaf.
+        {
+            (void)STRCPY(Index, PSCLINDEX(PArray));
+            return (&PSCLVALUE(PArray));
+        }
+
+        indexword = ~0UL;
+        if ((PPValue = JudyLLast(PArray, &indexword, PJError)) == PPJERR)
+        {
+            JudySLModifyErrno(PJError, PArray, orig ? PArray : (Pvoid_t)NULL);
+            return (PPJERR);
+        }
+
+// If a previous JudySLIns() ran out of memory partway down the tree, it left a
+// null *PPValue; this is automatically treated as a dead-end (not a core dump
+// or assertion; see version 1.25):
+
+        if (PPValue == (PPvoid_t) NULL)
+            return ((PPvoid_t) NULL);   // no previous index word.
+    }
+
+// FOUND PREVIOUS INDEX WORD:
+//
+// A previous (if original) or last (if subsequent) index word was located in
+// the current JudyL array.  Store it into the callers Index (string).  Then
+// if the found (previous) Index ends here, return its value area; otherwise do
+// a subsequent search below this point, which should never fail unless the
+// JudySL tree is corrupt, but this is detected at a lower level by the above
+// assertion.
+//
+// Note:  Treat Index as unaligned, even if it is aligned, to avoid writing
+// past the end of allocated memory (in case its less than a whole number of
+// words).
+
+    COPYWORDtoSTRING(Index, indexword); // copy next 4[8] bytes.
+    if (LASTWORD_BY_VALUE(indexword))
+        return (PPValue);
+// If a previous JudySLIns() ran out of memory partway down the tree, it left a
+// null *PPValue; this is automatically treated as a dead-end (not a core dump
+// or assertion; see version 1.25):
+    return (JudySLPrevSub(*PPValue, Index + WORDSIZE, /* original = */ 0,
+                          len - WORDSIZE, PJError));
+}                                       // JudySLPrevSub()
+
+// ****************************************************************************
+// J U D Y   S L   N E X T
+//
+// See the comments in JudySLPrev(), which is very similar.
+//
+// TBD:  Could the two functions call a common engine function with various
+// subfunctions and other constants specified?
+
+PPvoid_t
+JudySLNext(Pcvoid_t PArray, uint8_t * Index, PJError_t PJError) // optional, for returning error info.
+{
+// Check for caller error (null pointer), or empty JudySL array:
+
+    if (Index == (uint8_t *) NULL)
+    {
+        JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+        return (PPJERR);
+    }
+
+    if (PArray == (Pvoid_t)NULL)
+        return ((PPvoid_t) NULL);
+// Do the search:
+    return (JudySLNextSub(PArray, Index, /* original = */ 1,
+                          STRLEN(Index), PJError));
+}                                       // JudySLNext()
+
+// ****************************************************************************
+// J U D Y   S L   N E X T   S U B
+//
+// See the comments in JudySLPrevSub(), which is very similar.
+
+static    PPvoid_t
+JudySLNextSub(Pcvoid_t PArray, uint8_t * Index, int orig,
+              Word_t len,               // bytes remaining.
+              PJError_t PJError)        // optional, for returning error info.
+{
+    Word_t    indexword;                // next word to find.
+    PPvoid_t  PPValue;                  // from JudyL array.
+    if (orig)
+    {
+        if (IS_PSCL(PArray))
+        {
+            if ((PPValue = PPSCLVALUE_LT(Index, PArray)) != (PPvoid_t) NULL)
+                (void)STRCPY(Index, PSCLINDEX(PArray));
+            return (PPValue);
+        }
+
+        COPYSTRINGtoWORD(indexword, Index);     // copy next 4[8] bytes.
+
+        if (len > WORDSIZE)             // not at end of Index.
+        {
+            JLG(PPValue, PArray, indexword);
+            if (PPValue != (PPvoid_t) NULL)
+            {
+// If a previous JudySLIns() ran out of memory partway down the tree, it left a
+// null *PPValue; this is automatically treated as a dead-end (not a core dump
+// or assertion; see version 1.25):
+
+                PPValue = JudySLNextSub(*PPValue, Index + WORDSIZE,
+                                        /* original = */ 1,
+                                        len - WORDSIZE, PJError);
+                if (PPValue == PPJERR)
+                    return (PPJERR);    // propagate error.
+                if (PPValue != (PPvoid_t) NULL)
+                    return (PPValue);   // see above.
+            }
+        }
+
+        if ((PPValue = JudyLNext(PArray, &indexword, PJError)) == PPJERR)
+        {
+            JudySLModifyErrno(PJError, PArray, orig ? PArray : (Pvoid_t)NULL);
+            return (PPJERR);
+        }
+
+        if (PPValue == (PPvoid_t) NULL)
+            return ((PPvoid_t) NULL);   // no next index word.
+    }
+    else
+    {
+        if (IS_PSCL(PArray))            // at shortcut leaf.
+        {
+            (void)STRCPY(Index, PSCLINDEX(PArray));
+            return (&PSCLVALUE(PArray));
+        }
+
+        indexword = 0;
+        if ((PPValue = JudyLFirst(PArray, &indexword, PJError)) == PPJERR)
+        {
+            JudySLModifyErrno(PJError, PArray, orig ? PArray : (Pvoid_t)NULL);
+            return (PPJERR);
+        }
+
+// If a previous JudySLIns() ran out of memory partway down the tree, it left a
+// null *PPValue; this is automatically treated as a dead-end (not a core dump
+// or assertion; see version 1.25):
+
+        if (PPValue == (PPvoid_t) NULL)
+            return ((PPvoid_t) NULL);   // no next index word.
+    }
+
+    COPYWORDtoSTRING(Index, indexword); // copy next 4[8] bytes
+    if (LASTWORD_BY_VALUE(indexword))
+        return (PPValue);
+// If a previous JudySLIns() ran out of memory partway down the tree, it left a
+// null *PPValue; this is automatically treated as a dead-end (not a core dump
+// or assertion; see version 1.25):
+    return (JudySLNextSub(*PPValue, Index + WORDSIZE, /* original = */ 0,
+                          len - WORDSIZE, PJError));
+}                                       // JudySLNextSub()
+
+// ****************************************************************************
+// J U D Y   S L   F I R S T
+//
+// Like JudyLFirst(), do a JudySLGet(), then if necessary a JudySLNext().
+
+PPvoid_t
+JudySLFirst(Pcvoid_t PArray, uint8_t * Index, PJError_t PJError)        // optional, for returning error info.
+{
+    PPvoid_t  PPValue;                  // from JudyL array.
+    if (Index == (uint8_t *) NULL)
+    {
+        JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+        return (PPJERR);
+    }
+
+    if ((PPValue = JudySLGet(PArray, Index, PJError)) == PPJERR)
+        return (PPJERR);                // propagate serious error.
+    if ((PPValue == (PPvoid_t) NULL)    // first try failed.
+        && ((PPValue = JudySLNext(PArray, Index, PJError)) == PPJERR))
+    {
+        return (PPJERR);                // propagate serious error.
+    }
+
+    return (PPValue);
+}                                       // JudySLFirst()
+
+// ****************************************************************************
+// J U D Y   S L   L A S T
+//
+// Like JudyLLast(), do a JudySLGet(), then if necessary a JudySLPrev().
+
+PPvoid_t
+JudySLLast(Pcvoid_t PArray, uint8_t * Index, PJError_t PJError) // optional, for returning error info.
+{
+    PPvoid_t  PPValue;                  // from JudyL array.
+    if (Index == (uint8_t *) NULL)
+    {
+        JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
+        return (PPJERR);
+    }
+
+    if ((PPValue = JudySLGet(PArray, Index, PJError)) == PPJERR)
+        return (PPJERR);                // propagate serious error.
+    if ((PPValue == (PPvoid_t) NULL)    // first try failed.
+        && ((PPValue = JudySLPrev(PArray, Index, PJError)) == PPJERR))
+    {
+        return (PPJERR);                // propagate serious error.
+    }
+
+    return (PPValue);
+}                                       // JudySLLast()
+
+// ****************************************************************************
+// J U D Y   S L   F R E E   A R R A Y
+//
+// Walk the JudySL tree of JudyL arrays to free each JudyL array, depth-first.
+// During the walk, ignore indexes (strings) that end in the current JudyL
+// array to be freed.  Just recurse through those indexes which do not end,
+// that is, those whose associated value areas point to subsidiary JudyL
+// arrays, except for those which point to shortcut leaves.  Return the total
+// bytes freed in all of the JudyL arrays at or below the current level.
+//
+// Like the JudyLFreeArray() and Judy1FreeArray() code, this is written
+// recursively, which is probably fast enough, to allow indexes (strings) of
+// arbitrary size.  If recursion turns out to be a problem, consider instead
+// doing some large, fixed number of iterative descents (like 100) using a
+// fixed-size "stack" (array), then recursing upon overflow (relatively
+// rarely).
+
+Word_t
+JudySLFreeArray(PPvoid_t PPArray, PJError_t PJError)    // optional, for returning error info.
+{
+    PPvoid_t  PPArrayOrig = PPArray;    // for error reporting.
+    Word_t    indexword = 0;            // word just found.
+    PPvoid_t  PPValue;                  // from Judy array.
+    Word_t    bytes_freed = 0;          // bytes freed at this level.
+    Word_t    bytes_total = 0;          // bytes freed at all levels.
+    if (PPArray == (PPvoid_t) NULL)
+    {
+        JU_SET_ERRNO(PJError, JU_ERRNO_NULLPPARRAY);
+        return (JERR);
+    }
+
+// FREE SHORTCUT LEAF:
+
+    if (IS_PSCL(*PPArray))
+    {
+        Word_t    freewords;
+        Pscl_t    Pscl;
+
+        Pscl = CLEAR_PSCL(*PPArray);
+
+        freewords = SCLSIZE(STRLEN(Pscl->scl_Index));
+
+        JudyFree((void *)Pscl, freewords);
+
+        *PPArray = (Pvoid_t)NULL;
+
+        return (freewords * WORDSIZE);
+    }
+
+// FREE EACH SUB-ARRAY (DEPTH-FIRST):
+//
+// If a previous JudySLIns() ran out of memory partway down the tree, it left a
+// null *PPValue.  This is automatically treated correctly here as a dead-end.
+//
+// An Index (string) ends in the current word iff the last byte of the
+// (null-padded) word is null.
+
+    for (PPValue = JudyLFirst(*PPArray, &indexword, PJError);
+         (PPValue != (PPvoid_t) NULL) && (PPValue != PPJERR);
+         PPValue = JudyLNext(*PPArray, &indexword, PJError))
+    {
+        if (!LASTWORD_BY_VALUE(indexword))
+        {
+            if ((bytes_freed = JudySLFreeArray(PPValue, PJError)) == JERR)
+                return (JERR);          // propagate serious error.
+            bytes_total += bytes_freed;
+        }
+    }
+
+// Check for a serious error in a JudyL*() call:
+
+    if (PPValue == PPJERR)
+    {
+        JudySLModifyErrno(PJError, *PPArray, *PPArrayOrig);
+        return (JERR);
+    }
+
+// Now free the current array, which also nulls the pointer:
+//
+// Note:  *PPArray can be null here for a totally null JudySL array =>
+// JudyLFreeArray() returns zero.
+
+    if ((bytes_freed = JudyLFreeArray(PPArray, PJError)) == JERR)
+    {
+        JudySLModifyErrno(PJError, *PPArray, *PPArrayOrig);
+        return (JERR);
+    }
+    return (bytes_total + bytes_freed);
+}                                       // JudySLFreeArray()
diff --git a/libs/klib/judy/JudyTablesGen.c b/libs/klib/judy/JudyTablesGen.c
new file mode 100644
index 0000000..7be5de9
--- /dev/null
+++ b/libs/klib/judy/JudyTablesGen.c
@@ -0,0 +1,294 @@
+// Copyright (C) 2000 - 2002 Hewlett-Packard Company
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the term of the GNU Lesser 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 Lesser General Public License
+// for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+// _________________
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if (! (defined(JUDY1) || defined(JUDYL)))
+#error:  One of -DJUDY1 or -DJUDYL must be specified.
+#endif
+
+#define	TERMINATOR 999		// terminator for Alloc tables
+
+#define BPW sizeof(Word_t)	// define bytes per word
+
+#ifdef JUDY1
+#include "Judy1.h"
+#else
+#include "JudyL.h"
+#endif
+    
+FILE *fd;
+
+// Definitions come from header files Judy1.h and JudyL.h:
+
+int AllocSizes[] = ALLOCSIZES;
+
+#define	ROUNDUP(BYTES,BPW,OFFSETW) \
+	((((BYTES) + (BPW) - 1) / (BPW)) + (OFFSETW))
+
+
+// ****************************************************************************
+// G E N   T A B L E
+//
+// Note:  "const" is required for newer compilers.
+
+FUNCTION void GenTable(
+    const char * TableName,	// name of table string
+    const char * TableSize,	// dimentioned size string
+    int		 IndexBytes,	// bytes per Index
+    int		 LeafSize,	// number elements in object
+    int		 ValueBytes,	// bytes per Value
+    int		 OffsetWords)	// 1 for LEAFW
+{
+    int *	 PAllocSizes = AllocSizes;
+    int		 OWord;
+    int		 CurWord;
+    int		 IWord;
+    int		 ii;
+    int		 BytesOfIndex;
+    int		 BytesOfObject;
+    int		 Index;
+    int		 LastWords;
+    int		 Words [1000] = { 0 };
+    int		 Offset[1000] = { 0 };
+    int		 MaxWords;
+
+    MaxWords  =	ROUNDUP((IndexBytes + ValueBytes) * LeafSize, BPW, OffsetWords);
+    Words[0]  = 0;
+    Offset[0] = 0;
+    CurWord   = TERMINATOR;
+
+// Walk through all number of Indexes in table:
+
+    for (Index = 1; /* null */; ++Index)
+    {
+
+// Calculate byte required for next size:
+
+	BytesOfIndex  = IndexBytes * Index;
+	BytesOfObject = (IndexBytes + ValueBytes) * Index;
+
+// Round up and calculate words required for next size:
+
+        OWord =	ROUNDUP(BytesOfObject, BPW, OffsetWords);
+        IWord =	ROUNDUP(BytesOfIndex,  BPW, OffsetWords);
+
+// Root-level leaves of population of 1 and 2 do not have the 1 word offset:
+
+// Save minimum value of offset:
+
+        Offset[Index] = IWord;
+
+// Round up to next available size of words:
+
+	while (OWord > *PAllocSizes) PAllocSizes++;
+
+        if (Index == LeafSize)
+        {
+	    CurWord = Words[Index] = OWord;
+            break;
+        }
+//      end of available sizes ?
+
+	if (*PAllocSizes == TERMINATOR)
+        {
+            fprintf(stderr, "BUG, in %sPopToWords, sizes not big enough for object\n", TableName);
+	    exit(1);
+        }
+
+// Save words required and last word:
+
+        if (*PAllocSizes < MaxWords) { CurWord = Words[Index] = *PAllocSizes; }
+        else                         { CurWord = Words[Index] = MaxWords; }
+
+    } // for each index
+
+    LastWords = TERMINATOR;
+
+// Round up to largest size in each group of malloc sizes:
+
+    for (ii = LeafSize; ii > 0; ii--)
+    {
+        if (LastWords > (Words[ii] - ii)) LastWords = Offset[ii];
+        else                              Offset[ii] = LastWords;
+    }
+
+// Print the PopToWords[] table:
+
+    fprintf(fd,"\n//\tobject uses %d words\n", CurWord);
+    fprintf(fd,"//\t%s = %d\n", TableSize, LeafSize);
+
+    fprintf(fd,"const uint8_t\n");
+    fprintf(fd,"%sPopToWords[%s + 1] =\n", TableName, TableSize);
+    fprintf(fd,"{\n\t 0,");
+
+    for (ii = 1; ii <= LeafSize; ii++)
+    {
+
+// 8 columns per line, starting with 1:
+
+	if ((ii % 8) == 1) fprintf(fd,"\n\t");
+
+	fprintf(fd,"%2d", Words[ii]);
+
+// If not last number place comma:
+
+	if (ii != LeafSize) fprintf(fd,", ");
+    }
+    fprintf(fd,"\n};\n");
+
+// Print the Offset table if needed:
+
+    if (! ValueBytes) return;
+
+    fprintf(fd,"const uint8_t\n");
+    fprintf(fd,"%sOffset[%s + 1] =\n", TableName, TableSize);
+    fprintf(fd,"{\n");
+    fprintf(fd,"\t 0,");
+
+    for (ii = 1; ii <= LeafSize; ii++)
+    {
+        if ((ii % 8) == 1) fprintf(fd,"\n\t");
+
+	fprintf(fd,"%2d", Offset[ii]);
+
+	if (ii != LeafSize) fprintf(fd,", ");
+    }
+    fprintf(fd,"\n};\n");
+
+} // GenTable()
+
+
+// ****************************************************************************
+// M A I N
+
+#ifdef JU_WMAIN
+FUNCTION int wmain()
+#else
+FUNCTION int main()
+#endif
+{
+    int ii;
+
+#ifdef JUDY1
+    char *fname = "Judy1Tables.c";
+#else
+    char *fname = "JudyLTables.c";
+#endif
+
+    if ((fd = fopen(fname, "w")) == NULL){
+	perror("FATAL ERROR: could not write to Judy[1L]Tables.c file\n");
+	return (-1);
+    }
+
+
+    fprintf(fd,"// @(#) From generation tool: JudyTablesGen.c\n");
+    fprintf(fd,"//\n\n");
+
+
+// ================================ Judy1 =================================
+#ifdef JUDY1
+
+    fprintf(fd,"#include \"Judy1.h\"\n");
+
+    fprintf(fd,"// Leave the malloc() sizes readable in the binary (via "
+	   "strings(1)):\n");
+    fprintf(fd,"const char * Judy1MallocSizes = \"Judy1MallocSizes =");
+
+    for (ii = 0; AllocSizes[ii] != TERMINATOR; ii++)
+	fprintf(fd," %d,", AllocSizes[ii]);
+
+#ifndef JU_64BIT
+    fprintf(fd," Leaf1 = %d\";\n\n", ( int ) cJ1_LEAF1_MAXPOP1);
+#else
+    fprintf(fd,"\";\n\n");			// no Leaf1 in this case.
+#endif
+
+// ================================ 32 bit ================================
+#ifndef JU_64BIT
+
+    GenTable("j__1_BranchBJP","cJU_BITSPERSUBEXPB", 8, cJU_BITSPERSUBEXPB,0,0);
+
+    GenTable("j__1_Leaf1", "cJ1_LEAF1_MAXPOP1", 1, cJ1_LEAF1_MAXPOP1, 0, 0);
+    GenTable("j__1_Leaf2", "cJ1_LEAF2_MAXPOP1", 2, cJ1_LEAF2_MAXPOP1, 0, 0);
+    GenTable("j__1_Leaf3", "cJ1_LEAF3_MAXPOP1", 3, cJ1_LEAF3_MAXPOP1, 0, 0);
+    GenTable("j__1_LeafW", "cJ1_LEAFW_MAXPOP1", 4, cJ1_LEAFW_MAXPOP1, 0, 1);
+
+#endif
+
+// ================================ 64 bit ================================
+#ifdef JU_64BIT
+    GenTable("j__1_BranchBJP","cJU_BITSPERSUBEXPB",16, cJU_BITSPERSUBEXPB,0,0);
+
+    GenTable("j__1_Leaf2", "cJ1_LEAF2_MAXPOP1", 2, cJ1_LEAF2_MAXPOP1, 0, 0);
+    GenTable("j__1_Leaf3", "cJ1_LEAF3_MAXPOP1", 3, cJ1_LEAF3_MAXPOP1, 0, 0);
+    GenTable("j__1_Leaf4", "cJ1_LEAF4_MAXPOP1", 4, cJ1_LEAF4_MAXPOP1, 0, 0);
+    GenTable("j__1_Leaf5", "cJ1_LEAF5_MAXPOP1", 5, cJ1_LEAF5_MAXPOP1, 0, 0);
+    GenTable("j__1_Leaf6", "cJ1_LEAF6_MAXPOP1", 6, cJ1_LEAF6_MAXPOP1, 0, 0);
+    GenTable("j__1_Leaf7", "cJ1_LEAF7_MAXPOP1", 7, cJ1_LEAF7_MAXPOP1, 0, 0);
+    GenTable("j__1_LeafW", "cJ1_LEAFW_MAXPOP1", 8, cJ1_LEAFW_MAXPOP1, 0, 1);
+#endif
+#endif // JUDY1
+
+
+// ================================ JudyL =================================
+#ifdef JUDYL
+
+    fprintf(fd,"#include \"JudyL.h\"\n");
+
+    fprintf(fd,"// Leave the malloc() sizes readable in the binary (via "
+	   "strings(1)):\n");
+    fprintf(fd,"const char * JudyLMallocSizes = \"JudyLMallocSizes =");
+
+    for (ii = 0; AllocSizes[ii] != TERMINATOR; ii++)
+	fprintf(fd," %d,", AllocSizes[ii]);
+
+    fprintf(fd," Leaf1 = %ld\";\n\n", (Word_t)cJL_LEAF1_MAXPOP1);
+
+#ifndef JU_64BIT
+// ================================ 32 bit ================================
+    GenTable("j__L_BranchBJP","cJU_BITSPERSUBEXPB", 8, cJU_BITSPERSUBEXPB, 0,0);
+
+    GenTable("j__L_Leaf1", "cJL_LEAF1_MAXPOP1",  1, cJL_LEAF1_MAXPOP1, BPW,0);
+    GenTable("j__L_Leaf2", "cJL_LEAF2_MAXPOP1",  2, cJL_LEAF2_MAXPOP1, BPW,0);
+    GenTable("j__L_Leaf3", "cJL_LEAF3_MAXPOP1",  3, cJL_LEAF3_MAXPOP1, BPW,0);
+    GenTable("j__L_LeafW", "cJL_LEAFW_MAXPOP1",  4, cJL_LEAFW_MAXPOP1, BPW,1);
+    GenTable("j__L_LeafV", "cJU_BITSPERSUBEXPL", 4, cJU_BITSPERSUBEXPL,  0,0);
+#endif // 32 BIT
+
+#ifdef JU_64BIT
+// ================================ 64 bit ================================
+    GenTable("j__L_BranchBJP","cJU_BITSPERSUBEXPB",16, cJU_BITSPERSUBEXPB, 0,0);
+
+    GenTable("j__L_Leaf1", "cJL_LEAF1_MAXPOP1",  1, cJL_LEAF1_MAXPOP1,  BPW,0);
+    GenTable("j__L_Leaf2", "cJL_LEAF2_MAXPOP1",  2, cJL_LEAF2_MAXPOP1,  BPW,0);
+    GenTable("j__L_Leaf3", "cJL_LEAF3_MAXPOP1",  3, cJL_LEAF3_MAXPOP1,  BPW,0);
+    GenTable("j__L_Leaf4", "cJL_LEAF4_MAXPOP1",  4, cJL_LEAF4_MAXPOP1,  BPW,0);
+    GenTable("j__L_Leaf5", "cJL_LEAF5_MAXPOP1",  5, cJL_LEAF5_MAXPOP1,  BPW,0);
+    GenTable("j__L_Leaf6", "cJL_LEAF6_MAXPOP1",  6, cJL_LEAF6_MAXPOP1,  BPW,0);
+    GenTable("j__L_Leaf7", "cJL_LEAF7_MAXPOP1",  7, cJL_LEAF7_MAXPOP1,  BPW,0);
+    GenTable("j__L_LeafW", "cJL_LEAFW_MAXPOP1",  8, cJL_LEAFW_MAXPOP1,  BPW,1);
+    GenTable("j__L_LeafV", "cJU_BITSPERSUBEXPL", 8, cJU_BITSPERSUBEXPL, 0,0);
+#endif // 64 BIT
+
+#endif // JUDYL
+    fclose(fd);
+
+    return(0);
+
+} // main()
diff --git a/libs/klib/judy/Judy_Bit.c b/libs/klib/judy/Judy_Bit.c
new file mode 100644
index 0000000..2df7f37
--- /dev/null
+++ b/libs/klib/judy/Judy_Bit.c
@@ -0,0 +1,23 @@
+#define JUDY1
+
+#ifdef JU_64BIT
+#   include "Judy1Tables.64.c"
+#else
+#   include "Judy1Tables.32.c"
+#endif
+
+#include "JudyGet.c"
+#include "JudyIns.c"
+#include "JudyInsArray.c"
+#include "JudyDel.c"
+#include "JudyCreateBranch.c"
+#include "JudyFirst.c"
+#include "JudyFreeArray.c"
+#include "JudyInsertBranch.c"
+#include "JudyMallocIF.c"
+#include "JudyMemActive.c"
+#include "JudyMemUsed.c"
+#include "JudyPrevEmpty.c"
+#include "JudyByCountWithDefs.c"
+#include "j__udyGet.c"
+
diff --git a/libs/klib/judy/Judy_Bit_Cascade.c b/libs/klib/judy/Judy_Bit_Cascade.c
new file mode 100644
index 0000000..fe01d83
--- /dev/null
+++ b/libs/klib/judy/Judy_Bit_Cascade.c
@@ -0,0 +1,3 @@
+#define JUDY1
+
+#include "JudyCascade.c"
diff --git a/libs/klib/judy/Judy_Bit_Count.c b/libs/klib/judy/Judy_Bit_Count.c
new file mode 100644
index 0000000..92d6f37
--- /dev/null
+++ b/libs/klib/judy/Judy_Bit_Count.c
@@ -0,0 +1,3 @@
+#define JUDY1
+
+#include "JudyCount.c"
diff --git a/libs/klib/judy/Judy_Bit_Decascade.c b/libs/klib/judy/Judy_Bit_Decascade.c
new file mode 100644
index 0000000..ad8bb17
--- /dev/null
+++ b/libs/klib/judy/Judy_Bit_Decascade.c
@@ -0,0 +1,3 @@
+#define JUDY1
+
+#include "JudyDecascade.c"
diff --git a/libs/klib/judy/Judy_Bit_Next.c b/libs/klib/judy/Judy_Bit_Next.c
new file mode 100644
index 0000000..b3cb30d
--- /dev/null
+++ b/libs/klib/judy/Judy_Bit_Next.c
@@ -0,0 +1,3 @@
+#define JUDY1
+
+#include "JudyNext.c"
diff --git a/libs/klib/judy/Judy_Bit_NextEmpty.c b/libs/klib/judy/Judy_Bit_NextEmpty.c
new file mode 100644
index 0000000..9687ea7
--- /dev/null
+++ b/libs/klib/judy/Judy_Bit_NextEmpty.c
@@ -0,0 +1,3 @@
+#define JUDY1
+
+#include "JudyNextEmpty.c"
diff --git a/libs/klib/judy/Judy_Bit_Prev.c b/libs/klib/judy/Judy_Bit_Prev.c
new file mode 100644
index 0000000..92133b7
--- /dev/null
+++ b/libs/klib/judy/Judy_Bit_Prev.c
@@ -0,0 +1,3 @@
+#define JUDY1
+
+#include "JudyPrev.c"
diff --git a/libs/klib/judy/Judy_Word.c b/libs/klib/judy/Judy_Word.c
new file mode 100644
index 0000000..f5c2a8f
--- /dev/null
+++ b/libs/klib/judy/Judy_Word.c
@@ -0,0 +1,23 @@
+#define JUDYL
+
+#ifdef JU_64BIT
+#   include "JudyLTables.64.c"
+#else
+#   include "JudyLTables.32.c"
+#endif
+
+#include "JudyGet.c"
+#include "JudyIns.c"
+#include "JudyInsArray.c"
+#include "JudyDel.c"
+#include "JudyCreateBranch.c"
+#include "JudyFirst.c"
+#include "JudyFreeArray.c"
+#include "JudyInsertBranch.c"
+#include "JudyMallocIF.c"
+#include "JudyMemActive.c"
+#include "JudyMemUsed.c"
+#include "JudyPrevEmpty.c"
+#include "JudyByCountWithDefs.c"
+#include "j__udyGet.c"
+
diff --git a/libs/klib/judy/Judy_Word_Cascade.c b/libs/klib/judy/Judy_Word_Cascade.c
new file mode 100644
index 0000000..23af479
--- /dev/null
+++ b/libs/klib/judy/Judy_Word_Cascade.c
@@ -0,0 +1,3 @@
+#define JUDYL
+
+#include "JudyCascade.c"
diff --git a/libs/klib/judy/Judy_Word_Count.c b/libs/klib/judy/Judy_Word_Count.c
new file mode 100644
index 0000000..7ea0820
--- /dev/null
+++ b/libs/klib/judy/Judy_Word_Count.c
@@ -0,0 +1,3 @@
+#define JUDYL
+
+#include "JudyCount.c"
diff --git a/libs/klib/judy/Judy_Word_Decascade.c b/libs/klib/judy/Judy_Word_Decascade.c
new file mode 100644
index 0000000..fa2572b
--- /dev/null
+++ b/libs/klib/judy/Judy_Word_Decascade.c
@@ -0,0 +1,3 @@
+#define JUDYL
+
+#include "JudyDecascade.c"
diff --git a/libs/klib/judy/Judy_Word_Next.c b/libs/klib/judy/Judy_Word_Next.c
new file mode 100644
index 0000000..afefcaf
--- /dev/null
+++ b/libs/klib/judy/Judy_Word_Next.c
@@ -0,0 +1,3 @@
+#define JUDYL
+
+#include "JudyNext.c"
diff --git a/libs/klib/judy/Judy_Word_NextEmpty.c b/libs/klib/judy/Judy_Word_NextEmpty.c
new file mode 100644
index 0000000..bfd6310
--- /dev/null
+++ b/libs/klib/judy/Judy_Word_NextEmpty.c
@@ -0,0 +1,3 @@
+#define JUDYL
+
+#include "JudyNextEmpty.c"
diff --git a/libs/klib/judy/Judy_Word_Prev.c b/libs/klib/judy/Judy_Word_Prev.c
new file mode 100644
index 0000000..7d9bd1e
--- /dev/null
+++ b/libs/klib/judy/Judy_Word_Prev.c
@@ -0,0 +1,3 @@
+#define JUDYL
+
+#include "JudyPrev.c"
diff --git a/libs/klib/judy/Makefile b/libs/klib/judy/Makefile
new file mode 100644
index 0000000..59f5bfe
--- /dev/null
+++ b/libs/klib/judy/Makefile
@@ -0,0 +1,225 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: all
+
+TOP ?= $(abspath ../../..)
+MODULE = libs/klib/judy
+
+INT_LIBS = \
+	libjudy
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(JUDY_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+
+#-------------------------------------------------------------------------------
+# special rules
+#  for some reason these guys use the same source and load it up with
+#  ifdefs, so we have general rules to produce two sets of object files
+#  from a single set of sources
+#
+%.n.32.$(OBJX): %.c
+	$(CC) -o $@ $(OPT) $(CFLAGS) $<
+%.n.64.$(OBJX): %.c
+	$(CC) -o $@ $(OPT) $(CFLAGS) $<
+%.n.32_64.$(OBJX): %.c
+	$(CC) -o $@ $(OPT) $(CFLAGS) $<
+%.n.32.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) $(CFLAGS) $<
+%.n.64.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) $(CFLAGS) $<
+%.n.32_64.$(LOBX): %.c
+	$(CC) -o $@ $(OPT) $(CFLAGS) $<
+
+%.b.32.$(OBJX): %.c
+	$(CC) -o $@ $(OPT) $(CFLAGS) -DJUDY1 $<
+%.b.64.$(OBJX): %.c
+	$(CC) -o $@ $(OPT) $(CFLAGS) -DJUDY1 $<
+%.b.32_64.$(OBJX): %.c
+	$(CC) -o $@ $(OPT) $(CFLAGS) -DJUDY1 $<
+%.b.32.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) $(CFLAGS) -DJUDY1 $<
+%.b.64.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) $(CFLAGS) -DJUDY1 $<
+%.b.32_64.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) $(CFLAGS) -DJUDY1 $<
+
+%.w.32.$(OBJX): %.c
+	$(CC) -o $@ $(OPT) $(CFLAGS) -DJUDYL $<
+%.w.64.$(OBJX): %.c
+	$(CC) -o $@ $(OPT) $(CFLAGS) -DJUDYL $<
+%.w.32_64.$(OBJX): %.c
+	$(CC) -o $@ $(OPT) $(CFLAGS) -DJUDYL $<
+%.w.32.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) $(CFLAGS) -DJUDYL $<
+%.w.64.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) $(CFLAGS) -DJUDYL $<
+%.w.32_64.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) $(CFLAGS) -DJUDYL $<
+
+ifeq (win,$(OS))
+#JUDY_WIN = -DJU_WIN
+JUDY_WIN = -DJU_WMAIN -I$(TOP)/interfaces/cc/vc++
+endif
+
+#ifeq (dbg, $(BUILD))
+#DEBUG := -DDEBUG
+#endif
+
+CFLAGS = $(DEBUG)               \
+	$(NO_ARRAY_BOUNDS_WARNING)  \
+	$(DBG) $(CARCH) $(PROF)     \
+	$(JUDY_WIN) $(PED)          \
+	$(DEFINES) $(ARCHDEFS)      \
+	$(MIN_DEPLOY_OS_OPT)        \
+	-I$(SRCDIR) -I$(SRCDIR)/..
+
+VPATH += $(OBJDIR)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+	$(addprefix $(LIBDIR)/,$(EXT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+
+#-------------------------------------------------------------------------------
+# judy tables - whee!
+#
+JUDY_TABLES_SRC = \
+	JudyTablesGen
+
+JUDY_TABLES_BOBJ = \
+	$(addsuffix .b.$(BITS).$(OBJX),$(JUDY_TABLES_SRC))
+
+JUDY_TABLES_WOBJ = \
+	$(addsuffix .w.$(BITS).$(OBJX),$(JUDY_TABLES_SRC))
+
+$(OBJDIR)/Judy1TablesGen: $(JUDY_TABLES_BOBJ)
+	$(LD) --exe -o $@ $^
+
+$(OBJDIR)/JudyLTablesGen: $(JUDY_TABLES_WOBJ)
+	$(LD) --exe -o $@ $^
+
+$(OBJDIR)/Judy1Tables.c: $(OBJDIR)/Judy1TablesGen
+	$(RUN_REMOTELY) $^
+
+$(OBJDIR)/JudyLTables.c: $(OBJDIR)/JudyLTablesGen
+	$(RUN_REMOTELY) $^
+
+$(ILIBDIR)/judy-tables: \
+	$(OBJDIR)/JudyLTables.c \
+	$(OBJDIR)/Judy1Tables.c
+
+#    
+# make judy-tables to manually regenerate Judy tables sources, if there is ever such a need.
+#    
+judy-tables:
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+	cp $(OBJDIR)/Judy1Tables.c $(SRCDIR)/Judy1Tables.$(BITS).c
+	cp $(OBJDIR)/JudyLTables.c $(SRCDIR)/JudyLTables.$(BITS).c
+
+.PHONY: judy-tables
+    
+#-------------------------------------------------------------------------------
+# judy whee!
+#
+
+$(ILIBDIR)/libjudy: $(addprefix $(ILIBDIR)/libjudy.,$(LIBX))
+
+JUDY_NEUTRAL = \
+	JudyMalloc \
+	JudySL \
+	JudyHS
+
+JUDY_CMN = \
+	JudyGet \
+	JudyIns \
+	JudyInsArray \
+	JudyDel \
+	JudyCascade \
+	JudyCount \
+	JudyCreateBranch \
+	JudyDecascade \
+	JudyFirst \
+	JudyFreeArray \
+	JudyInsertBranch \
+	JudyMallocIF \
+	JudyMemActive \
+	JudyMemUsed \
+	JudyNext \
+	JudyNextEmpty \
+	JudyPrev \
+	JudyPrevEmpty \
+	JudyByCountWithDefs \
+	j__udyGet
+
+JUDY_WORD = \
+	_JudyLTables
+
+JUDY_BIT = \
+	_Judy1Tables
+
+JUDY_SRC = \
+	$(addsuffix .n,$(JUDY_NEUTRAL)) \
+	$(addsuffix .w,$(JUDY_CMN) $(JUDY_WORD)) \
+	$(addsuffix .b,$(JUDY_CMN) $(JUDY_BIT))
+
+JUDY_OBJ = \
+	$(addsuffix .$(BITS).$(LOBX),$(JUDY_SRC))
+
+$(ILIBDIR)/libjudy.$(LIBX): $(JUDY_OBJ)
+	$(LD) --slib -o $@ $^
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/klib/judy/_Judy1Tables.c b/libs/klib/judy/_Judy1Tables.c
new file mode 100644
index 0000000..c6aa8be
--- /dev/null
+++ b/libs/klib/judy/_Judy1Tables.c
@@ -0,0 +1,31 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+ 
+#if __SIZEOF_POINTER__*__CHAR_BIT__ == 64
+#include "Judy1Tables.64.c"
+#else
+#include "Judy1Tables.32.c"
+#endif
\ No newline at end of file
diff --git a/libs/klib/judy/_JudyLTables.c b/libs/klib/judy/_JudyLTables.c
new file mode 100644
index 0000000..13bcd3e
--- /dev/null
+++ b/libs/klib/judy/_JudyLTables.c
@@ -0,0 +1,31 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+ 
+#if __SIZEOF_POINTER__*__CHAR_BIT__ == 64
+#include "JudyLTables.64.c"
+#else
+#include "JudyLTables.32.c"
+#endif
\ No newline at end of file
diff --git a/libs/klib/judy/j__udyGet.c b/libs/klib/judy/j__udyGet.c
new file mode 100644
index 0000000..478c0f1
--- /dev/null
+++ b/libs/klib/judy/j__udyGet.c
@@ -0,0 +1,2 @@
+#define JUDYGETINLINE 1
+#include "JudyGet.c"
diff --git a/libs/klib/ksort.c b/libs/klib/ksort.c
new file mode 100644
index 0000000..ea7b093
--- /dev/null
+++ b/libs/klib/ksort.c
@@ -0,0 +1,98 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/extern.h>
+#include <klib/sort.h>
+
+
+/*--------------------------------------------------------------------------
+ * ksort
+ *  qsort with a function data pointer
+ */
+
+#define TSWAP( T, a, b )                                      \
+    do                                                        \
+    {                                                         \
+        T tmp = * ( const T* ) ( a );                         \
+        * ( T* ) ( a ) = * ( const T* ) ( b );                \
+        * ( T* ) ( b ) = tmp;                                 \
+    }                                                         \
+    while ( 0 )
+
+#define TCMP( T, a, b )                                       \
+    ( ( * ( const T* ) ( a ) < * ( const T* ) ( b ) ) ? -1 :  \
+      ( * ( const T* ) ( a ) > * ( const T* ) ( b ) ) )
+
+
+/* various custom ksort operations
+ *  structures will generally want their own functions
+ *  these fundamental types can be standardized
+ */
+LIB_EXPORT void CC ksort_int32_t ( int32_t *pbase, size_t total_elems )
+{
+#define SWAP( a, b, off, size )  TSWAP ( int32_t, a, b )
+#define CMP( a, b )                                             \
+    ( (int64_t) * ( const int32_t* ) ( a ) - (int64_t) * ( const int32_t* ) ( b ) )
+
+    KSORT ( pbase, total_elems, sizeof * pbase, 0, sizeof * pbase );
+
+#undef SWAP
+#undef CMP
+}
+
+LIB_EXPORT void CC ksort_uint32_t ( uint32_t *pbase, size_t total_elems )
+{
+#define SWAP( a, b, off, size )  TSWAP ( uint32_t, a, b )
+#define CMP( a, b ) \
+    ( (int64_t) * ( const uint32_t* ) ( a ) - (int64_t) * ( const uint32_t* ) ( b ) )
+
+    KSORT ( pbase, total_elems, sizeof * pbase, 0, sizeof * pbase );
+
+#undef SWAP
+#undef CMP
+}
+
+LIB_EXPORT void CC ksort_int64_t ( int64_t *pbase, size_t total_elems )
+{
+#define SWAP( a, b, off, size )  TSWAP ( int64_t, a, b )
+#define CMP( a, b ) TCMP ( int64_t, a, b )
+
+    KSORT ( pbase, total_elems, sizeof * pbase, 0, sizeof * pbase );
+
+#undef SWAP
+#undef CMP
+}
+
+LIB_EXPORT void CC ksort_uint64_t ( uint64_t *pbase, size_t total_elems )
+{
+#define SWAP( a, b, off, size )  TSWAP ( uint64_t, a, b )
+#define CMP( a, b ) TCMP ( uint64_t, a, b )
+
+    KSORT ( pbase, total_elems, sizeof * pbase, 0, sizeof * pbase );
+
+#undef SWAP
+#undef CMP
+}
diff --git a/libs/klib/linux/syserrcode.c b/libs/klib/linux/syserrcode.c
new file mode 100644
index 0000000..9ecd7ee
--- /dev/null
+++ b/libs/klib/linux/syserrcode.c
@@ -0,0 +1,53 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "writer-priv.h"
+#include <klib/writer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <os-native.h> /* for strchrnul on non-linux */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <assert.h>
+
+size_t KWrtFmt_error_code ( char * buffer, size_t buffer_size, uint32_t error_code )
+{
+    char * pc;
+
+    pc = strerror_r ((int)error_code, buffer, buffer_size);
+
+    /* the glibc guys are sorta strange */
+    if (pc != buffer)
+    {
+        string_copy_measure (buffer, buffer_size, pc);
+        buffer[buffer_size-1] = '\0';
+    }
+    return string_size (buffer);
+}
diff --git a/libs/klib/log-priv.h b/libs/klib/log-priv.h
new file mode 100644
index 0000000..042eb44
--- /dev/null
+++ b/libs/klib/log-priv.h
@@ -0,0 +1,96 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_log_priv_
+#define _h_log_priv_
+
+#ifndef _h_klib_log_
+#include <klib/log.h>
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* some defaults */
+
+/*--------------------------------------------------------------------------
+ * Log
+ *  global logging
+ */
+
+/* GetRCModuleText
+ */
+const char *GetRCModuleText ( enum RCModule mod );
+
+/* GetRCTargetText
+ */
+const char *GetRCTargetText ( enum RCTarget targ );
+
+/* GetRCContextText
+ */
+const char *GetRCContextText ( enum RCContext ctx );
+
+/* GetRCObjectText
+ *  obj can be RCTarget or RCObject
+ */
+const char *GetRCObjectText ( int obj );
+
+/* GetRCStateText
+ */
+const char *GetRCStateText ( enum RCState state );
+
+
+/* GetRCModuleIdxText
+ */
+const char *GetRCModuleIdxText ( enum RCModule mod );
+
+/* GetRCTargetIdxText
+ */
+const char *GetRCTargetIdxText ( enum RCTarget targ );
+
+/* GetRCContextIdxText
+ */
+const char *GetRCContextIdxText ( enum RCContext ctx );
+
+/* GetRCObjectIdxText
+ *  obj can be RCTarget or RCObject
+ */
+const char *GetRCObjectIdxText ( int obj );
+
+/* GetRCStateIdxText
+ */
+const char *GetRCStateIdxText ( enum RCState state );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_log_priv_ */
diff --git a/libs/klib/log.c b/libs/klib/log.c
new file mode 100644
index 0000000..db696af
--- /dev/null
+++ b/libs/klib/log.c
@@ -0,0 +1,986 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/extern.h>
+#include "log-priv.h"
+#include "writer-priv.h"
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/sort.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <os-native.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * LogLevel
+ * defaults to the error level which is the lowest error level filtering
+ * warning and informational messages
+ */
+static KLogLevel G_log_level = klogErr;
+static rc_t G_log_last_rc = 0;
+
+static KWrtHandler G_log_writer;
+static KWrtHandler G_log_lib_writer;
+
+static KFmtHandler G_log_formatter;
+static KLogFmtFlags G_log_formatter_flags;
+static KFmtHandler G_log_lib_formatter;
+static KLogFmtFlags G_log_lib_formatter_flags;
+
+/* LogLevelAdjust
+ *  adjust process-global log level by an offset from current
+ */
+LIB_EXPORT void CC KLogLevelAdjust( int32_t adjust )
+{
+    int32_t lvl = KLogLevelGet();
+
+    lvl += adjust;
+    if( lvl < klogLevelMin ) {
+        lvl = klogLevelMin;
+    } else if( lvl > klogLevelMax ) {
+        lvl = klogLevelMax;
+    }
+    G_log_level = lvl;
+}
+
+/* Get
+ *  retrieve current process-global log level
+ */
+LIB_EXPORT KLogLevel CC KLogLevelGet(void)
+{
+    return G_log_level;
+}
+
+/* Set
+ *  set process-global log level
+ */
+LIB_EXPORT rc_t CC KLogLevelSet(KLogLevel lvl)
+{
+    /* Don't allow an out of range set */
+    if( (lvl < klogLevelMin) || (lvl > klogLevelMax) ) {
+        return RC(rcRuntime, rcLog, rcUpdating, rcRange, rcInvalid);
+    }
+    G_log_level = lvl;
+    return 0;
+}
+
+/*
+ * These need to be kept in sync with type LogLevel
+ */
+static const char * logLevelParamStrings [] = 
+{
+    "fatal",
+    "sys",
+    "int",
+    "err",
+    "warn",
+    "info",
+    "debug"
+};
+
+LIB_EXPORT const char ** CC KLogGetParamStrings ( void )
+{
+    return logLevelParamStrings;
+}
+
+
+/* LogLevelExplain
+ *  inserts level description
+ */
+LIB_EXPORT rc_t CC KLogLevelExplain ( KLogLevel lvl, char *buffer, size_t bsize, size_t *num_writ )
+{
+    static const char undefined[] = "undefined";
+    size_t size;
+    uint32_t len;
+    const char *t;
+
+    /* catch unaccounted for or bad changes in log.h
+     * if the asserts fail then the table above and the rest
+     * of the function will fail */
+    assert (klogLevelMin == 0);
+    assert (klogLevelMin == klogFatal);
+    assert ((klogFatal + 1) == klogSys);
+    assert ((klogSys + 1) == klogInt);
+    assert ((klogInt + 1) == klogErr);
+    assert ((klogErr + 1) == klogWarn);
+    assert ((klogWarn + 1) == klogInfo);
+    assert ((klogInfo + 1) == klogDebug);
+    assert ((klogDebug) == klogLevelMax);
+
+    if ((lvl < klogLevelMin) || (lvl > klogLevelMax)) {
+        t = undefined;
+    } else {
+        t = logLevelParamStrings[lvl];
+    }
+
+    len = string_measure (t, &size);
+    if(len > bsize) {
+        if (num_writ) {
+            *num_writ = 0;
+        }
+        return RC ( rcRuntime, rcLog, rcLogging, rcBuffer, rcInsufficient );
+    }
+    if(num_writ) {
+        *num_writ = len;
+    }
+    string_copy (buffer, bsize, t, len);
+    return 0;
+}
+
+rc_t CC KLogDefaultFormatter( void* self, KWrtHandler* writer,
+                              size_t argc, const wrt_nvp_t args[],
+                              size_t envc, const wrt_nvp_t envs[] )
+{
+    rc_t rc = 0;
+    size_t num_writ, nsize, msize;
+    uint64_t mlen;
+    char buffer[8192], *nbuffer;
+    const char* msg, *rc_msg;
+
+    /* if writer is null than silence */
+    if( writer == NULL || writer->writer == NULL ) {
+        return rc;
+    }
+    msg = wrt_nvp_find_value(envc, envs, "message");
+    rc_msg = wrt_nvp_find_value(envc, envs, "reason");
+    if( msg != NULL ) {
+        const char* mend = msg + string_measure(msg, &msize);
+        /* strip trailing newlines */
+        while( mend != msg && (*mend == '\n' || *mend == '\r') ) {
+            --mend;
+        }
+        mlen = mend - msg;
+    } else {
+        mlen = 0;
+    }
+
+    nbuffer = buffer;
+    nsize = sizeof(buffer);
+    do {
+        rc = string_printf(nbuffer, nsize, & num_writ, "%s %s.%s %s: %s%s%.*s\n",
+                                 wrt_nvp_find_value(envc, envs, "timestamp"),
+                                 wrt_nvp_find_value(envc, envs, "app"),
+                                 wrt_nvp_find_value(envc, envs, "version"),
+                                 wrt_nvp_find_value(envc, envs, "severity"),
+                                 rc_msg ? rc_msg : "", rc_msg ? " - " : "",
+                                 ( uint32_t ) mlen, msg);
+        if( num_writ > nsize )
+        {
+            assert ( nbuffer == buffer );
+            nbuffer = malloc(nsize = num_writ + 2);
+            if( nbuffer == NULL ) {
+                rc = RC(rcRuntime, rcLog, rcLogging, rcMemory, rcExhausted);
+                break;
+            }
+            continue;
+        }
+        /* replace newlines with spaces, excluding last one */
+        for(nsize = 0; nsize < num_writ - 1; nsize++) {
+            if( nbuffer[nsize] == '\n' || nbuffer[nsize] == '\r' ) {
+                nbuffer[nsize] = ' ';
+            }
+        }
+        break;
+    } while(true);
+    if( rc == 0 ) {
+        rc = LogFlush(writer, nbuffer, num_writ);
+    }
+    if( nbuffer != buffer ) {
+        free(nbuffer);
+    }
+    return rc;
+}
+
+
+/* Init
+ *  initialize the logging module with executable identity and version,
+ *  plus logging level. actual behavior is determined by the logging
+ *  implementation.
+ *
+ *  "ident" [ IN ] - identity of executable
+ *
+ *  "vers" [ IN ] - 4-part version code: 0xMMmmrrrr, where
+ *      MM = major release
+ *      mm = minor release
+ *    rrrr = bug-fix release
+ *
+ *  "lvl" [ IN ] - a LogLevel specifying cutoff point for logs, such
+ *  that any log generated with a level above "lvl" will be ignored.
+ */
+LIB_EXPORT rc_t CC KLogInit ( void )
+{
+    rc_t rc;
+
+    G_log_level = klogWarn;
+    G_log_last_rc = 0;
+
+    rc = KLogHandlerSetStdErr();
+
+    if (rc == 0)
+        rc = KLogLibHandlerSet (NULL, NULL);
+
+    if (rc == 0)
+        rc = KLogFmtHandlerSetDefault();
+
+    if (rc == 0)
+        rc = KLogLibFmtHandlerSetDefault();
+
+    return rc;
+}
+
+
+/* LastErrorCode
+ * LastErrorCodeReset
+ *  return or clear the last reported rc_t with log level LogErr or above
+ */
+LIB_EXPORT rc_t CC KLogLastErrorCode ( void )
+{
+    return G_log_last_rc;
+}
+
+LIB_EXPORT void CC KLogLastErrorCodeReset ( void )
+{
+    G_log_last_rc = 0;
+}
+
+/* LastErrorCodeSet
+ *  set the last reported rc_t with log level LogErr or above
+ */
+LIB_EXPORT void CC KLogLastErrorCodeSet ( KLogLevel lvl, rc_t rc )
+{
+    if ( lvl <= klogErr )
+        G_log_last_rc = rc;
+}
+
+/* pLogMsg
+ *  creates an info node with parameters
+ *  <info time="" message="" ... />
+ *
+ *  "lvl" [ IN ] - severity of message
+ *
+ *  "msg" [ IN ] - NUL terminated string with named parameters
+ *
+ *  "fmt" [ IN ] - NUL terminated format string, behaves according
+ *  to standard printf-style formatting
+ */
+LIB_EXPORT rc_t CC pLogMsg ( KLogLevel lvl, const char *msg, const char *fmt, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    if ( lvl > KLogLevelGet() )
+        return 0;
+
+    va_start ( args, fmt );
+    rc = vLogMsg ( lvl, msg, fmt, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC pLogLibMsg ( KLogLevel lvl, const char *msg, const char *fmt, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    if ( lvl > KLogLevelGet() )
+        return 0;
+
+    va_start ( args, fmt );
+    rc = vLogLibMsg ( lvl, msg, fmt, args );
+    va_end ( args );
+
+    return rc;
+}
+
+/* logsubstituteparams
+ *  perform param substitution by name
+ */
+static
+rc_t logsubstituteparams ( const char* msg, uint32_t argc, const wrt_nvp_t argv[],
+                           uint32_t envc, const wrt_nvp_t envs[],
+                           char* buffer, size_t bsize, size_t* num_writ )
+{
+    rc_t rc;
+    size_t i, sz;
+    for ( rc = 0, i = 0, sz = 0; msg [ i ] != 0; ++ sz, ++ i )
+    {
+        /* copy msg character */
+        if ( sz < bsize )
+            buffer [ sz ] = msg [ i ];
+
+        /* detect substitution param */
+        if ( msg [ i ] == '$' && msg [ i + 1 ] == '(' )
+        {
+            const char *value;
+            size_t size;
+
+            /* find param by name */
+            const wrt_nvp_t *arg = wrt_nvp_find(argc, argv, &msg[ i + 2 ]);
+            if( arg == NULL ) {
+                arg = wrt_nvp_find(envc, envs, &msg[ i + 2 ]);
+                if( arg == NULL ) {
+                    rc = RC ( rcRuntime, rcLog, rcInserting, rcParam, rcNotFound );
+                    break;
+                }
+            }
+            /* substitute param value */
+            for(value = arg->value; *value != 0; value++, sz++) {
+                if( sz < bsize ) {
+                    buffer[sz] = *value;
+                }
+            }
+            /* compensate for outer loop's increment */
+            --sz;
+            /* advance past param token */
+            i += string_measure(arg->name, &size) + 2;
+            assert( msg[i] == ')' );
+        }
+    }
+
+    * num_writ = sz;
+
+    if ( rc != 0 )
+        return rc;
+
+    if ( sz >= bsize )
+        return RC ( rcRuntime, rcLog, rcInserting, rcBuffer, rcInsufficient );
+
+    buffer [ sz ] = 0;
+    return 0;
+}
+
+
+/* logappendpmsg
+ *  appends a message and parameters
+ */
+static
+int logmatchname ( const char *fmt, char *pdata )
+{
+    int i;
+    for ( i = 0; fmt [ i ] == pdata [ i ]; ++ i )
+    {
+        switch ( fmt [ i ] )
+        {
+        case '=':
+            if ( i > 0 )
+            {
+                pdata [ i ] = 0;
+                return i;
+            }
+        case 0:
+        case ',':
+            return -1;
+        }
+    }
+    return 0;
+}
+
+static
+rc_t logtokenizeparams ( const char* fmt, char* pdata,
+                         uint32_t* argcp, wrt_nvp_t argv[], uint32_t arg_max )
+{
+    /* now split into parameters */
+    uint32_t argc;
+    int len = logmatchname ( fmt, pdata );
+    if ( len ++ <= 0 )
+        return RC ( rcRuntime, rcLog, rcTokenizing, rcParam, rcInvalid );
+
+    argv [ 0 ] . name = pdata;
+    argv [ 0 ] . value = & pdata [ len ];
+    for ( argc = 1, fmt += len; ; ++ argc )
+    {
+        /* find end of formal param fmt */
+        char *end = strchr ( fmt, ',' );
+        if ( end == NULL )
+            break;
+        fmt = end + 1;
+
+        /* find end of param value by
+           finding beginning of next name */
+        end = strchr ( argv [ argc - 1 ] . value, ',' );
+        while ( end != NULL )
+        {
+            len = logmatchname ( fmt, end + 1 );
+            if ( len > 0 )
+                break;
+            if ( len < 0 )
+                return RC ( rcRuntime, rcLog, rcTokenizing, rcParam, rcInvalid );
+            end = strchr ( end + 1, ',' );
+        }
+
+        /* detect badly formed parameter value or va_list */
+        if ( end ++ == NULL )
+            return RC ( rcRuntime, rcLog, rcTokenizing, rcParam, rcInvalid );
+
+        /* detect too many parameters */
+        if ( argc == arg_max )
+            return RC ( rcRuntime, rcLog, rcTokenizing, rcRange, rcExcessive );
+
+        /* account for NUL */
+        ++ len;
+
+        /* NUL terminate value */
+        end [ -1 ] = 0;
+
+        /* record param name and value addresses */
+        argv [ argc ] . name = end;
+        argv [ argc ] . value = end + len;
+
+        /* advance over formal param name */
+        fmt += len;
+    }
+
+    /* if multiple parameters, order by name */
+    wrt_nvp_sort(argc, argv);
+    * argcp = argc;
+    return 0;
+}
+
+static
+rc_t prep_v_args( uint32_t* argc, wrt_nvp_t argv[], size_t max_argc,
+                  char* pbuffer, size_t pbsize, const char* fmt, va_list args )
+{
+    rc_t rc = string_vprintf ( pbuffer, pbsize, NULL, fmt, args );
+    if ( rc == 0 )
+    {
+        /* tokenize the parameters into name/value pairs */
+        rc = logtokenizeparams(fmt, pbuffer, argc, argv, ( uint32_t ) max_argc);
+    }
+    return rc;
+}
+
+static
+rc_t log_print( KFmtHandler* formatter, const KLogFmtFlags flags, KWrtHandler* writer,
+                KLogLevel lvl, bool use_rc, rc_t status, 
+                const char* msg, const char* fmt, va_list args )
+{
+    rc_t rc = 0;
+    char* nbuffer;
+    size_t num_writ, remaining;
+
+    uint32_t envc = 0;
+    wrt_nvp_t envs[20];
+    char ebuffer[2048];
+    uint32_t argc = 0;
+    wrt_nvp_t argv[32];
+    char pbuffer[4096];
+    char abuffer[4096];
+    KFmtWriter fmtwrt;
+    
+    assert(formatter != NULL);
+    assert(writer != NULL);
+
+    fmtwrt = formatter->formatter;
+    if( fmtwrt == NULL ) {
+        fmtwrt = KLogDefaultFormatter;
+    }
+    if( fmtwrt == KLogDefaultFormatter && writer->writer == NULL ) {
+        /* default formatting with NULL writer -> silence */
+        return rc;
+    }
+    nbuffer = (char*)ebuffer;
+    remaining = sizeof(ebuffer);
+    do {
+#define FIX_UP() if(rc){break;} remaining -= num_writ; nbuffer += num_writ
+        if( flags & (klogFmtTimestamp | klogFmtLocalTimestamp) ) {
+            if( flags & klogFmtLocalTimestamp ) {
+                rc = LogSimpleTimestamp(nbuffer, remaining, &num_writ);
+            } else {
+                rc = LogTimestamp(nbuffer, remaining, &num_writ);
+            }
+            nbuffer[num_writ++] = '\0';
+            envs[envc].name = "timestamp";
+            envs[envc++].value = nbuffer;
+            FIX_UP();
+        }
+        if( flags & klogFmtSeverity ) {
+            rc = KLogLevelExplain(lvl, nbuffer, remaining, &num_writ);
+            nbuffer[num_writ++] = '\0';
+            envs[envc].name = "severity";
+            envs[envc++].value = nbuffer;
+            FIX_UP();
+        }
+        if( flags & klogFmtPid ) {
+            rc = LogPID(nbuffer, remaining, &num_writ);
+            nbuffer[num_writ++] = '\0';
+            envs[envc].name = "pid";
+            envs[envc++].value = nbuffer;
+            FIX_UP();
+        }
+        if( flags & klogFmtAppName ) {
+            rc = LogAppName(nbuffer, remaining, &num_writ);
+            nbuffer[num_writ++] = '\0';
+            envs[envc].name = "app";
+            envs[envc++].value = nbuffer;
+            FIX_UP();
+        }
+        if( flags & klogFmtAppVersion ) {
+            rc = LogAppVersion(nbuffer, remaining, &num_writ);
+            nbuffer[num_writ++] = '\0';
+            envs[envc].name = "version";
+            envs[envc++].value = nbuffer;
+            FIX_UP();
+        }
+        if( use_rc ) {
+            if( flags & klogFmtReason ) {
+                rc = RCExplain(status, nbuffer, remaining, &num_writ);
+                nbuffer[num_writ++] = '\0';
+                envs[envc].name = "reason";
+                envs[envc++].value = nbuffer;
+                FIX_UP();
+            }
+            if( flags & klogFmtReasonShort ) {
+                rc = RCExplain2(status, nbuffer, remaining, &num_writ, eRCExOpt_ObjAndStateOnlyIfError);
+                nbuffer[num_writ++] = '\0';
+                envs[envc].name = "reason_short";
+                envs[envc++].value = nbuffer;
+                FIX_UP();
+            }
+            if( flags & klogFmtRC ) {
+                rc = string_printf(nbuffer, remaining, & num_writ, "%R", status);
+                envs[envc].name = "rc";
+                envs[envc++].value = nbuffer;
+                FIX_UP();
+            }
+            if( flags & klogFmtModule ) {
+                envs[envc].name = "module";
+                envs[envc++].value = GetRCModuleIdxText(GetRCModule(status));
+            }
+            if( flags & klogFmtTarget ) {
+                envs[envc].name = "target";
+                envs[envc++].value = GetRCTargetIdxText(GetRCTarget(status));
+            }
+            if( flags & klogFmtContext ) {
+                envs[envc].name = "context";
+                envs[envc++].value = GetRCContextIdxText(GetRCContext(status));
+            }
+            if( flags & klogFmtObject ) {
+                envs[envc].name = "object";
+                envs[envc++].value = GetRCObjectIdxText(GetRCObject(status));
+            }
+            if( flags & klogFmtState ) {
+                envs[envc].name = "state";
+                envs[envc++].value = GetRCStateIdxText(GetRCState(status));
+            }
+            if( flags & klogFmtModuleText ) {
+                envs[envc].name = "module-text";
+                envs[envc++].value = GetRCModuleText(GetRCModule(status));
+            }
+            if( flags & klogFmtTargetText ) {
+                envs[envc].name = "target-text";
+                envs[envc++].value = GetRCTargetText(GetRCTarget(status));
+            }
+            if( flags & klogFmtContextText ) {
+                envs[envc].name = "context-text";
+                envs[envc++].value = GetRCContextText(GetRCContext(status));
+            }
+            if( flags & klogFmtObjectText ) {
+                envs[envc].name = "object-text";
+                envs[envc++].value = GetRCObjectText(GetRCObject(status));
+            }
+            if( flags & klogFmtStateText ) {
+                envs[envc].name = "state-text";
+                envs[envc++].value = GetRCStateText(GetRCState(status));
+            }
+        }
+#undef FIX_UP
+    } while(false);
+    /* env must have one spare element for message added text below */
+    if( rc == 0 && envc >= (sizeof(envs)/sizeof(envs[0])) ) {
+        rc = RC(rcRuntime, rcLog, rcLogging, rcTable, rcInsufficient);
+    }
+    nbuffer = (char*)abuffer;
+    remaining = sizeof(abuffer);
+    if( rc == 0 ) {
+        if( fmt != NULL ) {
+            rc = prep_v_args(&argc, argv, sizeof(argv)/sizeof(argv[0]) - 1, pbuffer, sizeof(pbuffer), fmt, args);
+        }
+        if( rc == 0 && (flags & klogFmtMessage) ) {
+            if( msg == NULL || msg[0] == '\0' ) {
+                msg = "empty log message";
+            }
+            do {
+                /* substitute parameters into message */
+                wrt_nvp_sort(envc, envs);
+                rc = logsubstituteparams(msg, argc, argv, envc, envs, nbuffer, remaining - 1, &num_writ);
+                if( GetRCState(rc) == rcInsufficient ) {
+                    if(nbuffer != abuffer) {
+                        free(nbuffer);
+                    }
+                    remaining += num_writ > remaining ? num_writ : remaining;
+                    nbuffer = malloc(remaining);
+                    if( nbuffer == NULL ) {
+                        rc = RC(rcRuntime, rcLog, rcLogging, rcMemory, rcExhausted);
+                    }
+                } else {
+                    if( rc == 0 ) {
+                        nbuffer[num_writ] = '\0';
+                        envs[envc].name = "message";
+                        envs[envc++].value = nbuffer;
+                    }
+                    break;
+                }
+            } while(rc == 0);
+        }
+    }
+    if( rc != 0 ) {
+        /* print reason for failure */
+        string_printf((char*)abuffer, sizeof(abuffer), &num_writ, "log failure: %R in '%s'", rc, msg);
+        envs[envc].name = "message";
+        envs[envc++].value = abuffer;
+    }
+
+    wrt_nvp_sort(envc, envs);
+
+    {
+        rc_t rc2 = fmtwrt(formatter->data, writer, argc, argv, envc, envs);
+        if( (rc2 == 0) && use_rc ) {
+            KLogLastErrorCodeSet(lvl, status);
+        }
+        if(nbuffer != abuffer) {
+            free(nbuffer);
+        }
+        return rc != 0 ? rc : rc2;
+    }
+}
+
+/* LogMsg
+ *  makes an entry to the log file
+ *
+ *  "lvl" [ IN ] - severity of message
+ *
+ *  "msg" [ IN ] - NUL terminated string
+ */
+
+LIB_EXPORT rc_t CC LogMsg ( KLogLevel lvl, const char *msg )
+{
+    if ( lvl > KLogLevelGet() )
+        return 0;
+
+    return log_print(KLogFmtHandlerGet(), G_log_formatter_flags,
+                     KLogHandlerGet(), lvl, false, 0, msg, NULL, NULL );
+}
+
+LIB_EXPORT rc_t CC LogLibMsg ( KLogLevel lvl, const char *msg )
+{
+    if ( lvl > KLogLevelGet() )
+        return 0;
+
+    return log_print(KLogLibFmtHandlerGet(), G_log_lib_formatter_flags, 
+                     KLogLibHandlerGet(), lvl, false, 0, msg, NULL, NULL );
+}
+
+
+/* LogErr
+ *  reports an error to log file
+ *
+ *  "lvl" [ IN ] - severity of message
+ *
+ *  "status" [ IN ] - return code to be decoded
+ *
+ *  "msg" [ IN, NULL OKAY ] - optional NUL terminated message string
+ */
+LIB_EXPORT rc_t CC LogErr ( KLogLevel lvl, rc_t status, const char *msg )
+{
+    if ( lvl > KLogLevelGet() )
+        return 0;
+
+    return log_print(KLogFmtHandlerGet(), G_log_formatter_flags,
+                     KLogHandlerGet(), lvl, true, status, msg, NULL, NULL );
+}
+
+LIB_EXPORT rc_t CC LogLibErr ( KLogLevel lvl, rc_t status, const char *msg )
+{
+    if ( lvl > KLogLevelGet() )
+        return 0;
+
+    return log_print(KLogLibFmtHandlerGet(), G_log_lib_formatter_flags,
+                     KLogLibHandlerGet(), lvl, true, status, msg, NULL, NULL );
+}
+
+/* vLogMsg
+ *  makes a parameterized entry to the log file
+ *
+ *  "lvl" [ IN ] - severity of message
+ *
+ *  "msg" [ IN ] - NUL terminated string with named parameters
+ *
+ *  "fmt" [ IN ] - NUL terminated format string, behaves according
+ *  to standard printf-style formatting
+ */
+LIB_EXPORT rc_t CC vLogMsg ( KLogLevel lvl, const char *msg, const char *fmt, va_list args )
+{
+    if ( lvl > KLogLevelGet() )
+        return 0;
+
+    return log_print(KLogFmtHandlerGet(), G_log_formatter_flags,
+                     KLogHandlerGet(), lvl, false, 0, msg, fmt, args );
+}
+
+LIB_EXPORT rc_t CC vLogLibMsg ( KLogLevel lvl, const char *msg, const char *fmt, va_list args )
+{
+    if ( lvl > KLogLevelGet() )
+        return 0;
+
+    return log_print(KLogLibFmtHandlerGet(), G_log_lib_formatter_flags,
+                     KLogLibHandlerGet(), lvl, false, 0, msg, fmt, args );
+}
+
+/* vLogErr
+ *  reports an error to log file
+ *
+ *  "lvl" [ IN ] - severity of message
+ *
+ *  "status" [ IN ] - return code to be decoded
+ *
+ *  "msg" [ IN ] - NUL terminated message string with named parameters
+ *
+ *  "fmt" [ IN ] - NUL terminated format string, behaves according
+ *  to standard printf-style formatting
+ */
+LIB_EXPORT rc_t CC vLogErr ( KLogLevel lvl, rc_t status, const char *msg, const char *fmt, va_list args )
+{
+    if ( lvl > KLogLevelGet() )
+        return 0;
+
+    return log_print(KLogFmtHandlerGet(), G_log_formatter_flags,
+                     KLogHandlerGet(), lvl, true, status, msg, fmt, args );
+}
+
+LIB_EXPORT rc_t CC vLogLibErr ( KLogLevel lvl, rc_t status, const char *msg, const char *fmt, va_list args )
+{
+    if ( lvl > KLogLevelGet() )
+        return 0;
+    return log_print(KLogLibFmtHandlerGet(), G_log_lib_formatter_flags,
+                     KLogLibHandlerGet(), lvl, true, status, msg, fmt, args );
+}
+
+/* pLogErr
+ *  reports an error to log file
+ *
+ *  "lvl" [ IN ] - severity of message
+ *
+ *  "status" [ IN ] - return code to be decoded
+ *
+ *  "msg" [ IN ] - NUL terminated message string with named parameters
+ *
+ *  "fmt" [ IN ] - NUL terminated format string, behaves according
+ *  to standard printf-style formatting
+ */
+LIB_EXPORT rc_t CC pLogErr ( KLogLevel lvl, rc_t status, const char *msg, const char *fmt, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    if ( lvl > KLogLevelGet() )
+        return 0;
+
+    va_start ( args, fmt );
+    rc = vLogErr ( lvl, status, msg, fmt, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC pLogLibErr ( KLogLevel lvl, rc_t status, const char *msg, const char *fmt, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    if ( lvl > KLogLevelGet() )
+        return 0;
+
+    va_start ( args, fmt );
+    rc = vLogLibErr ( lvl, status, msg, fmt, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLogHandlerSetStdOut ( void )
+{
+    return KLogHandlerSet(KWrt_DefaultWriter, KWrt_DefaultWriterDataStdOut);
+}
+
+LIB_EXPORT rc_t CC KLogLibHandlerSetStdOut ( void )
+{
+    return KLogLibHandlerSet(KWrt_DefaultWriter, KWrt_DefaultWriterDataStdOut);
+}
+
+LIB_EXPORT rc_t CC KLogHandlerSetStdErr ( void )
+{
+    return KLogHandlerSet(KWrt_DefaultWriter, KWrt_DefaultWriterDataStdErr);
+}
+
+LIB_EXPORT rc_t CC KLogLibHandlerSetStdErr ( void )
+{
+    return KLogLibHandlerSet(KWrt_DefaultWriter, KWrt_DefaultWriterDataStdErr);
+}
+
+LIB_EXPORT rc_t CC KLogHandlerSet ( KWrtWriter writer, void * data )
+{
+    G_log_writer.writer = writer;
+    G_log_writer.data = data;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLogLibHandlerSet ( KWrtWriter writer, void * data )
+{
+    G_log_lib_writer.writer = writer;
+    G_log_lib_writer.data = data;
+    return 0;
+}
+
+LIB_EXPORT void * CC KLogDataGet ( void )
+{
+    return ( KLogHandlerGet()->data );
+}
+
+LIB_EXPORT void * CC KLogLibDataGet ( void )
+{
+    return ( KLogLibHandlerGet()->data );
+}
+
+LIB_EXPORT KWrtWriter CC KLogWriterGet ( void )
+{
+    return ( KLogHandlerGet()->writer );
+}
+
+LIB_EXPORT KWrtWriter CC KLogLibWriterGet ( void )
+{
+    return ( KLogLibHandlerGet()->writer );
+}
+
+LIB_EXPORT KWrtHandler * CC KLogHandlerGet ( void )
+{
+    return ( &G_log_writer );
+}
+
+LIB_EXPORT KWrtHandler * CC KLogLibHandlerGet ( void )
+{
+    return ( &G_log_lib_writer );
+}
+
+static const uint32_t log_dflt_opt = klogFmtTimestamp | klogFmtSeverity | klogFmtPid |
+                klogFmtMessage | klogFmtAppName | klogFmtAppVersion | klogFmtReason;
+
+LIB_EXPORT rc_t CC KLogFmtHandlerSetDefault ( void )
+{
+    rc_t rc = KLogFmtHandlerSet(KLogDefaultFormatter, 0, NULL);
+    if( rc == 0 ) {
+        G_log_formatter_flags = log_dflt_opt;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLogLibFmtHandlerSetDefault ( void )
+{
+    rc_t rc = KLogLibFmtHandlerSet(KLogDefaultFormatter, 0, NULL);
+    if( rc == 0 ) {
+        G_log_lib_formatter_flags = log_dflt_opt;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KLogFmtFlagsSet ( KLogFmtFlags flags )
+{
+    G_log_formatter_flags |= flags;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLogLibFmtFlagsSet ( KLogFmtFlags flags )
+{
+    G_log_lib_formatter_flags |= flags;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLogFmtHandlerSet ( KFmtWriter formatter, KLogFmtFlags flags, void* data )
+{
+    if( formatter == NULL ) {
+        return RC(rcRuntime, rcLog, rcLogging, rcFunction, rcNull);
+    }
+    G_log_formatter.formatter = formatter;
+    G_log_formatter.data = data;
+    KLogFmtFlagsSet(flags);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLogLibFmtHandlerSet ( KFmtWriter formatter, KLogFmtFlags flags, void* data )
+{
+    if( formatter == NULL ) {
+        return RC(rcRuntime, rcLog, rcLogging, rcFunction, rcNull);
+    }
+    G_log_lib_formatter.formatter = formatter;
+    G_log_lib_formatter.data = data;
+    KLogLibFmtFlagsSet(flags);
+    return 0;
+}
+
+LIB_EXPORT void * CC KLogFmtDataGet ( void )
+{
+    return ( KLogFmtHandlerGet()->data );
+}
+
+LIB_EXPORT void * CC KLogLibFmtDataGet ( void )
+{
+    return ( KLogFmtHandlerGet()->data );
+}
+
+LIB_EXPORT KFmtWriter CC KLogFmtWriterGet ( void )
+{
+    return ( KLogFmtHandlerGet()->formatter ? KLogFmtHandlerGet()->formatter : KLogDefaultFormatter );
+}
+
+LIB_EXPORT KFmtWriter CC KLogLibFmtWriterGet ( void )
+{
+    return ( KLogLibFmtHandlerGet()->formatter ? KLogLibFmtHandlerGet()->formatter : KLogDefaultFormatter );
+}
+
+LIB_EXPORT KFmtHandler * CC KLogFmtHandlerGet ( void )
+{
+    return ( &G_log_formatter );
+}
+
+LIB_EXPORT KFmtHandler * CC KLogLibFmtHandlerGet ( void )
+{
+    return ( &G_log_lib_formatter );
+}
+
+LIB_EXPORT KLogFmtFlags CC KLogFmtFlagsGet ( void )
+{
+    return G_log_formatter_flags;
+}
+
+LIB_EXPORT KLogFmtFlags CC KLogLibFmtFlagsGet ( void )
+{
+    return G_log_lib_formatter_flags;
+}
diff --git a/libs/klib/maybeswap.h b/libs/klib/maybeswap.h
new file mode 100644
index 0000000..7216c99
--- /dev/null
+++ b/libs/klib/maybeswap.h
@@ -0,0 +1,57 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_maybeswap_
+#define _h_maybeswap_
+
+/* technically, a whitelist would be safer */
+#ifdef __sparc
+#  if SWAP_PERSISTED
+#    define GET_UNALIGNED( type, swap, dest, src )                  \
+        do {                                                        \
+            type tmp##__LINE__;                                     \
+            memmove ( & tmp##__LINE__, & ( src ), sizeof ( type ) ); \
+            dest = swap ( tmp##__LINE__ );                          \
+        } while (0)
+#  else
+#    define GET_UNALIGNED( type, swap, dest, src ) \
+        memmove ( & ( dest ), & ( src ), sizeof ( type ) )
+#  endif
+#elif SWAP_PERSISTED
+#  define GET_UNALIGNED( type, swap, dest, src ) dest = swap ( src )
+#else
+#  define GET_UNALIGNED( type, swap, dest, src ) \
+      dest = ( * ( const type* ) & ( src ) )
+#endif
+
+#include <byteswap.h>
+
+#define GET16( dest, src ) GET_UNALIGNED ( uint16_t, bswap_16, dest, src )
+#define GET32( dest, src ) GET_UNALIGNED ( uint32_t, bswap_32, dest, src )
+#define GET64( dest, src ) GET_UNALIGNED ( uint64_t, bswap_64, dest, src )
+
+#endif /* _h_maybeswap_ */
+
diff --git a/libs/klib/md5.c b/libs/klib/md5.c
new file mode 100644
index 0000000..32d7883
--- /dev/null
+++ b/libs/klib/md5.c
@@ -0,0 +1,421 @@
+/*
+  Copyright (C) 1999 Aladdin Enterprises.  All rights reserved.
+
+  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.
+
+  L. Peter Deutsch
+  ghost at aladdin.com
+
+*/
+/*
+  Independent implementation of MD5 (RFC 1321).
+
+  This code implements the MD5 Algorithm defined in RFC 1321.
+  It is derived directly from the text of the RFC and not from the
+  reference implementation.
+
+  The original and principal author of md5.c is L. Peter Deutsch
+  <ghost at aladdin.com>.  Other authors are noted in the change history
+  that follows (in reverse chronological order):
+
+  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
+  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
+  1999-05-03 lpd Original version.
+*/
+
+/*
+  This software is derived from original work by Peter Deutsch.
+  It has been incorporated into a body of PUBLIC DOMAIN software
+  distributed by the National Center for Biotechnology Information.
+
+  Although all reasonable efforts have been taken to ensure the accuracy
+  and reliability of the software and data, the NLM and the U.S.
+  Government do not and cannot warrant the performance or results that
+  may be obtained by using this software or data. The NLM and the U.S.
+  Government disclaim all warranties, express or implied, including
+  warranties of performance, merchantability or fitness for any particular
+  purpose.
+*/
+
+#include <klib/extern.h>
+#include <klib/checksum.h>
+#include <sysalloc.h>
+
+#include <string.h>
+#include <endian.h>
+#include <byteswap.h>
+
+#if ! defined __BYTE_ORDER || ! defined __LITTLE_ENDIAN
+#error "missing byte order definitions"
+#endif
+
+
+
+/*--------------------------------------------------------------------------
+ * MD5
+ *  taken from Peter Deutsch's sources due to simplicity
+ */
+#define T_MASK ( ( uint32_t ) ~ 0 )
+
+/* MD5StateInit
+ *  initialize the algorithm and state block
+ */
+LIB_EXPORT void CC MD5StateInit ( MD5State *md5 )
+{
+    if ( md5 != NULL )
+    {
+        md5 -> count [ 0 ] = md5 -> count [ 1 ] = 0;
+        md5 -> abcd [ 0 ] = 0x67452301;
+        md5 -> abcd [ 1 ] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
+        md5 -> abcd [ 2 ] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
+        md5 -> abcd [ 3 ] = 0x10325476;
+        memset(md5->buf,0,sizeof(md5->buf));
+    }
+}
+
+/* MDStateProcess
+ *  input is taken in blocks of little-endian 32 bit words
+ *
+ *  for big endian machines, this means data are copied
+ *  and rearranged.
+ *
+ *  for little endian, data are copied if not properly aligned
+ */
+#define T1 /* 0xd76aa478 */ ( T_MASK ^ 0x28955b87 )
+#define T2 /* 0xe8c7b756 */ ( T_MASK ^ 0x173848a9 )
+#define T3    0x242070db
+#define T4 /* 0xc1bdceee */ ( T_MASK ^ 0x3e423111 )
+#define T5 /* 0xf57c0faf */ ( T_MASK ^ 0x0a83f050 )
+#define T6    0x4787c62a
+#define T7 /* 0xa8304613 */ ( T_MASK ^ 0x57cfb9ec )
+#define T8 /* 0xfd469501 */ ( T_MASK ^ 0x02b96afe )
+#define T9    0x698098d8
+#define T10 /* 0x8b44f7af */ ( T_MASK ^ 0x74bb0850 )
+#define T11 /* 0xffff5bb1 */ ( T_MASK ^ 0x0000a44e )
+#define T12 /* 0x895cd7be */ ( T_MASK ^ 0x76a32841 )
+#define T13    0x6b901122
+#define T14 /* 0xfd987193 */ ( T_MASK ^ 0x02678e6c )
+#define T15 /* 0xa679438e */ ( T_MASK ^ 0x5986bc71 )
+#define T16    0x49b40821
+#define T17 /* 0xf61e2562 */ ( T_MASK ^ 0x09e1da9d )
+#define T18 /* 0xc040b340 */ ( T_MASK ^ 0x3fbf4cbf )
+#define T19    0x265e5a51
+#define T20 /* 0xe9b6c7aa */ ( T_MASK ^ 0x16493855 )
+#define T21 /* 0xd62f105d */ ( T_MASK ^ 0x29d0efa2 )
+#define T22    0x02441453
+#define T23 /* 0xd8a1e681 */ ( T_MASK ^ 0x275e197e )
+#define T24 /* 0xe7d3fbc8 */ ( T_MASK ^ 0x182c0437 )
+#define T25    0x21e1cde6
+#define T26 /* 0xc33707d6 */ ( T_MASK ^ 0x3cc8f829 )
+#define T27 /* 0xf4d50d87 */ ( T_MASK ^ 0x0b2af278 )
+#define T28    0x455a14ed
+#define T29 /* 0xa9e3e905 */ ( T_MASK ^ 0x561c16fa )
+#define T30 /* 0xfcefa3f8 */ ( T_MASK ^ 0x03105c07 )
+#define T31    0x676f02d9
+#define T32 /* 0x8d2a4c8a */ ( T_MASK ^ 0x72d5b375 )
+#define T33 /* 0xfffa3942 */ ( T_MASK ^ 0x0005c6bd )
+#define T34 /* 0x8771f681 */ ( T_MASK ^ 0x788e097e )
+#define T35    0x6d9d6122
+#define T36 /* 0xfde5380c */ ( T_MASK ^ 0x021ac7f3 )
+#define T37 /* 0xa4beea44 */ ( T_MASK ^ 0x5b4115bb )
+#define T38    0x4bdecfa9
+#define T39 /* 0xf6bb4b60 */ ( T_MASK ^ 0x0944b49f )
+#define T40 /* 0xbebfbc70 */ ( T_MASK ^ 0x4140438f )
+#define T41    0x289b7ec6
+#define T42 /* 0xeaa127fa */ ( T_MASK ^ 0x155ed805 )
+#define T43 /* 0xd4ef3085 */ ( T_MASK ^ 0x2b10cf7a )
+#define T44    0x04881d05
+#define T45 /* 0xd9d4d039 */ ( T_MASK ^ 0x262b2fc6 )
+#define T46 /* 0xe6db99e5 */ ( T_MASK ^ 0x1924661a )
+#define T47    0x1fa27cf8
+#define T48 /* 0xc4ac5665 */ ( T_MASK ^ 0x3b53a99a )
+#define T49 /* 0xf4292244 */ ( T_MASK ^ 0x0bd6ddbb )
+#define T50    0x432aff97
+#define T51 /* 0xab9423a7 */ ( T_MASK ^ 0x546bdc58 )
+#define T52 /* 0xfc93a039 */ ( T_MASK ^ 0x036c5fc6 )
+#define T53    0x655b59c3
+#define T54 /* 0x8f0ccc92 */ ( T_MASK ^ 0x70f3336d )
+#define T55 /* 0xffeff47d */ ( T_MASK ^ 0x00100b82 )
+#define T56 /* 0x85845dd1 */ ( T_MASK ^ 0x7a7ba22e )
+#define T57    0x6fa87e4f
+#define T58 /* 0xfe2ce6e0 */ ( T_MASK ^ 0x01d3191f )
+#define T59 /* 0xa3014314 */ ( T_MASK ^ 0x5cfebceb )
+#define T60    0x4e0811a1
+#define T61 /* 0xf7537e82 */ ( T_MASK ^ 0x08ac817d )
+#define T62 /* 0xbd3af235 */ ( T_MASK ^ 0x42c50dca )
+#define T63    0x2ad7d2bb
+#define T64 /* 0xeb86d391 */ ( T_MASK ^ 0x14792c6e )
+
+static
+void MD5StateProcess ( MD5State *md5, const uint8_t *data /* [ 64 ] */ ) 
+{
+    uint32_t t;
+
+    uint32_t a = md5 -> abcd [ 0 ];
+    uint32_t b = md5 -> abcd [ 1 ];
+    uint32_t c = md5 -> abcd [ 2 ];
+    uint32_t d = md5 -> abcd [ 3 ];
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+
+    uint32_t xbuf [ 16 ];
+
+    /* assume proper alignment */
+    const uint32_t *X = ( const uint32_t* ) data;
+
+    /* check alignment */
+    if ( ( ( size_t ) X & 3 ) != 0 )
+    {
+        /* use buffer instead */
+        X = xbuf;
+        memmove ( xbuf, data, 64 );
+    }
+
+#elif __BYTE_ORDER == __BIG_ENDIAN
+
+    int i;
+    uint32_t X [ 16 ];
+    if ( ( ( size_t ) data & 3 ) == 0 )
+    {
+        const uint32_t *xp = ( const uint32_t* ) data;
+        for ( i = 0; i < 16; ++ i )
+            X [ i ] = bswap_32 ( xp [ i ] );
+    }
+
+    else
+    {
+        const uint8_t *xp = data;
+        for ( i = 0; i < 16; xp += 4, ++ i ) 
+            X [ i ] = xp [ 0 ] + ( xp [ 1 ] << 8 ) + ( xp [ 2 ] << 16 ) + ( xp [ 3 ] << 24 );
+    }
+
+#else
+#error "only big or little endian is supported"
+#endif
+
+#define ROTATE_LEFT( x, n ) \
+    ( ( ( x ) << ( n ) ) | ( ( x ) >> ( 32 - ( n ) ) ) ) 
+
+    /* Round 1. */
+    /* Let  [ abcd k s i ] denote the operation
+       a = b + ( ( a + F ( b,c,d ) + X [ k ] + T [ i ] ) <<< s ) . */
+#define F( x, y, z ) \
+    ( ( ( x ) & ( y ) ) | ( ~ ( x ) & ( z ) ) ) 
+#define SET( a, b, c, d, k, s, Ti ) \
+    t = a + F ( b,c,d ) + X [ k ] + Ti;\
+    a = ROTATE_LEFT ( t, s ) + b
+
+    /* Do the following 16 operations. */
+    SET ( a, b, c, d,  0,  7,  T1 );
+    SET ( d, a, b, c,  1, 12,  T2 );
+    SET ( c, d, a, b,  2, 17,  T3 );
+    SET ( b, c, d, a,  3, 22,  T4 );
+    SET ( a, b, c, d,  4,  7,  T5 );
+    SET ( d, a, b, c,  5, 12,  T6 );
+    SET ( c, d, a, b,  6, 17,  T7 );
+    SET ( b, c, d, a,  7, 22,  T8 );
+    SET ( a, b, c, d,  8,  7,  T9 );
+    SET ( d, a, b, c,  9, 12, T10 );
+    SET ( c, d, a, b, 10, 17, T11 );
+    SET ( b, c, d, a, 11, 22, T12 );
+    SET ( a, b, c, d, 12,  7, T13 );
+    SET ( d, a, b, c, 13, 12, T14 );
+    SET ( c, d, a, b, 14, 17, T15 );
+    SET ( b, c, d, a, 15, 22, T16 );
+#undef SET
+#undef F
+
+    /* Round 2. */
+    /* Let  [ abcd k s i ] denote the operation
+       a = b + ( ( a + G ( b,c,d ) + X [ k ] + T [ i ] ) <<< s ) . */
+#define G( x, y, z ) \
+    ( ( ( x ) & ( z ) ) | ( ( y ) & ~ ( z ) ) ) 
+#define SET( a, b, c, d, k, s, Ti ) \
+    t = a + G ( b,c,d ) + X [ k ] + Ti;\
+    a = ROTATE_LEFT ( t, s ) + b
+
+    /* Do the following 16 operations. */
+    SET ( a, b, c, d,  1,  5, T17 );
+    SET ( d, a, b, c,  6,  9, T18 );
+    SET ( c, d, a, b, 11, 14, T19 );
+    SET ( b, c, d, a,  0, 20, T20 );
+    SET ( a, b, c, d,  5,  5, T21 );
+    SET ( d, a, b, c, 10,  9, T22 );
+    SET ( c, d, a, b, 15, 14, T23 );
+    SET ( b, c, d, a,  4, 20, T24 );
+    SET ( a, b, c, d,  9,  5, T25 );
+    SET ( d, a, b, c, 14,  9, T26 );
+    SET ( c, d, a, b,  3, 14, T27 );
+    SET ( b, c, d, a,  8, 20, T28 );
+    SET ( a, b, c, d, 13,  5, T29 );
+    SET ( d, a, b, c,  2,  9, T30 );
+    SET ( c, d, a, b,  7, 14, T31 );
+    SET ( b, c, d, a, 12, 20, T32 );
+#undef SET
+#undef G
+
+    /* Round 3. */
+    /* Let  [ abcd k s t ] denote the operation
+       a = b + ( ( a + H ( b,c,d ) + X [ k ] + T [ i ] ) <<< s ) . */
+#define H( x, y, z ) \
+    ( ( x ) ^ ( y ) ^ ( z ) ) 
+#define SET( a, b, c, d, k, s, Ti ) \
+    t = a + H ( b,c,d ) + X [ k ] + Ti;\
+    a = ROTATE_LEFT ( t, s ) + b
+    
+    /* Do the following 16 operations. */
+    SET ( a, b, c, d,  5,  4, T33 );
+    SET ( d, a, b, c,  8, 11, T34 );
+    SET ( c, d, a, b, 11, 16, T35 );
+    SET ( b, c, d, a, 14, 23, T36 );
+    SET ( a, b, c, d,  1,  4, T37 );
+    SET ( d, a, b, c,  4, 11, T38 );
+    SET ( c, d, a, b,  7, 16, T39 );
+    SET ( b, c, d, a, 10, 23, T40 );
+    SET ( a, b, c, d, 13,  4, T41 );
+    SET ( d, a, b, c,  0, 11, T42 );
+    SET ( c, d, a, b,  3, 16, T43 );
+    SET ( b, c, d, a,  6, 23, T44 );
+    SET ( a, b, c, d,  9,  4, T45 );
+    SET ( d, a, b, c, 12, 11, T46 );
+    SET ( c, d, a, b, 15, 16, T47 );
+    SET ( b, c, d, a,  2, 23, T48 );
+#undef SET
+#undef H
+
+    /* Round 4. */
+    /* Let  [ abcd k s t ] denote the operation
+       a = b + ( ( a + I ( b,c,d ) + X [ k ] + T [ i ] ) <<< s ) . */
+#define I( x, y, z )                            \
+    ( ( y ) ^ ( ( x ) | ~ ( z ) ) ) 
+#define SET( a, b, c, d, k, s, Ti ) \
+    t = a + I ( b,c,d ) + X [ k ] + Ti;\
+    a = ROTATE_LEFT ( t, s ) + b
+
+    /* Do the following 16 operations. */
+    SET ( a, b, c, d,  0,  6, T49 );
+    SET ( d, a, b, c,  7, 10, T50 );
+    SET ( c, d, a, b, 14, 15, T51 );
+    SET ( b, c, d, a,  5, 21, T52 );
+    SET ( a, b, c, d, 12,  6, T53 );
+    SET ( d, a, b, c,  3, 10, T54 );
+    SET ( c, d, a, b, 10, 15, T55 );
+    SET ( b, c, d, a,  1, 21, T56 );
+    SET ( a, b, c, d,  8,  6, T57 );
+    SET ( d, a, b, c, 15, 10, T58 );
+    SET ( c, d, a, b,  6, 15, T59 );
+    SET ( b, c, d, a, 13, 21, T60 );
+    SET ( a, b, c, d,  4,  6, T61 );
+    SET ( d, a, b, c, 11, 10, T62 );
+    SET ( c, d, a, b,  2, 15, T63 );
+    SET ( b, c, d, a,  9, 21, T64 );
+#undef SET
+#undef I
+
+    /* Then perform the following additions. ( That is increment each
+       of the four registers by the value it had before this block
+       was started. ) */
+    md5 -> abcd [ 0 ] += a;
+    md5 -> abcd [ 1 ] += b;
+    md5 -> abcd [ 2 ] += c;
+    md5 -> abcd [ 3 ] += d;
+}
+
+
+/* MD5StateAppend
+ *  run MD5 on data block
+ *  accumulate results into "md5"
+ *  processes data in chunks
+ */
+LIB_EXPORT void CC MD5StateAppend ( MD5State *md5, const void *data, size_t size  ) 
+{
+    if ( md5 != NULL && data != NULL && size > 0 )
+    {
+        const uint8_t *p = data;
+        size_t left = size;
+        size_t offset = ( md5 -> count [ 0 ] >> 3 ) & 63;
+        uint32_t nbits = ( uint32_t ) ( size << 3 );
+
+        /* update the message length. */
+        md5 -> count [ 1 ] += ( uint32_t ) size >> 29;
+        md5 -> count [ 0 ] += nbits;
+
+        /* detect roll-over */
+        if ( md5 -> count [ 0 ] < nbits ) 
+            ++ md5 -> count [ 1 ];
+
+        /* process an initial partial block. */
+        if ( offset )
+        {
+            /* bytes to copy from input data are from offset up to 64 */
+            size_t copy = ( offset + size > 64 ? 64 - offset : size );
+            memmove ( md5 -> buf + offset, p, copy );
+
+            /* don't process a tiny partial block */
+            if ( offset + copy < 64 ) 
+                return;
+
+            /* trim off initial bytes */
+            p += copy;
+            left -= copy;
+
+            /* process full state buffer */
+            MD5StateProcess ( md5, md5 -> buf );
+        }
+
+        /* continue processing blocks directly from input */
+        for ( ; left >= 64; p += 64, left -= 64 ) 
+            MD5StateProcess ( md5, p );
+
+        /* buffer any remainder */
+        if ( left ) 
+            memmove ( md5 -> buf, p, left );
+    }
+}
+
+/* MD5StateFinish
+ *  processes any remaining data in "md5"
+ *  returns 16 bytes of digest
+ */
+LIB_EXPORT void CC MD5StateFinish ( MD5State *md5, uint8_t digest  [ 16 ] ) 
+{
+    if ( md5 != NULL )
+    {
+        int i;
+        uint8_t data [ 8 ];
+        static const uint8_t pad [ 64 ] = {
+            0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+        };
+
+        /* save the length before padding in little-endian order */
+        for ( i = 0; i < 8; ++ i ) 
+            data [ i ] = ( uint8_t ) ( md5 -> count [ i >> 2 ] >> ( ( i & 3 ) << 3 ) );
+
+        /* Pad to 56 bytes mod 64. */
+        MD5StateAppend ( md5, pad, ( ( 55 - ( md5 -> count [ 0 ] >> 3 ) ) & 63 ) + 1 );
+
+        /* Append the length. */
+        MD5StateAppend ( md5, data, 8 );
+
+        /* create digest */
+        for ( i = 0; i < 16; ++ i ) 
+            digest [ i ] = ( uint8_t ) ( md5 -> abcd [ i >> 2 ] >> ( ( i & 3 ) << 3 ) );
+    }
+}
diff --git a/libs/klib/namelist.c b/libs/klib/namelist.c
new file mode 100644
index 0000000..4806d4c
--- /dev/null
+++ b/libs/klib/namelist.c
@@ -0,0 +1,149 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/rc.h>
+#include <klib/impl.h>
+#include <sysalloc.h>
+
+#define KNAMELIST_LATEST 1
+
+/*--------------------------------------------------------------------------
+ * KNamelist
+ *  a simple array of entry names
+ */
+
+/* AddRef
+ *  creates a new reference
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KNamelistAddRef ( const KNamelist *self )
+{
+    if ( self != NULL )
+        atomic_inc ( & ( ( KNamelist* ) self ) -> refcount );
+    return 0;
+}
+
+/* Release
+ *  discard reference to list
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KNamelistRelease ( const KNamelist *cself )
+{
+    KNamelist *self = ( KNamelist* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic_dec_and_test ( & self -> refcount ) )
+        {
+            rc_t status;
+            switch ( self -> vt -> v1 . maj )
+            {
+            case 1:
+                status = ( * self -> vt -> v1 . destroy ) ( self );
+                break;
+            default:
+                status = RC ( rcCont, rcNamelist, rcReleasing, rcInterface, rcBadVersion );
+            }
+
+            if ( status != 0 )
+                atomic_set ( & self -> refcount, 1 );
+
+            return status;
+        }
+    }
+    return 0;
+}
+
+/* Count
+ *  returns the number of entries
+ *
+ *  "count" [ OUT ] - return parameter for entry count
+ */
+LIB_EXPORT rc_t CC KNamelistCount ( const KNamelist *self, uint32_t *count )
+{
+    if ( count == NULL )
+        return RC ( rcCont, rcNamelist, rcAccessing, rcParam, rcNull );
+
+    * count = 0;
+
+    if ( self == NULL )
+        return RC ( rcCont, rcNamelist, rcAccessing, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . count ) ( self, count );
+    }
+
+    return RC ( rcCont, rcNamelist, rcAccessing, rcInterface, rcBadVersion );
+}
+
+/* Get
+ *  get an indexed name
+ *
+ *  "idx" [ IN ] - a zero-based name index
+ *
+ *  "name" [ OUT ] - return parameter for NUL terminated name
+ */
+LIB_EXPORT rc_t CC KNamelistGet ( const KNamelist *self,
+    uint32_t idx, const char **name )
+{
+    if ( name == NULL )
+        return RC ( rcCont, rcNamelist, rcAccessing, rcParam, rcNull );
+
+    * name = NULL;
+
+    if ( self == NULL )
+        return RC ( rcCont, rcNamelist, rcAccessing, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . get ) ( self, idx, name );
+    }
+
+    return RC ( rcCont, rcNamelist, rcAccessing, rcInterface, rcBadVersion );
+}
+
+/* Init
+ *  polymorphic parent constructor
+ */
+LIB_EXPORT rc_t CC KNamelistInit ( KNamelist *self, const KNamelist_vt *vt )
+{
+    if ( self == NULL || vt == NULL )
+        return RC ( rcCont, rcNamelist, rcConstructing, rcSelf, rcNull );
+
+    if ( vt -> v1 . maj == 0 )
+        return RC ( rcCont, rcNamelist, rcConstructing, rcInterface, rcInvalid );
+
+    if ( vt -> v1 . maj > KNAMELIST_LATEST )
+        return RC ( rcCont, rcNamelist, rcConstructing, rcInterface, rcBadVersion );
+
+    self -> vt = vt;
+    atomic_set ( & self -> refcount, 1 );
+
+    return 0;
+}
diff --git a/libs/klib/ncbi-vdb-version.c b/libs/klib/ncbi-vdb-version.c
new file mode 100644
index 0000000..3c19aa5
--- /dev/null
+++ b/libs/klib/ncbi-vdb-version.c
@@ -0,0 +1,45 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+
+#include <klib/ncbi-vdb-version.h> /* GetPackageVersion */
+#include <klib/sra-release-version.h> /* SraReleaseVersion */
+
+#include <string.h> /* memset */
+
+
+LIB_EXPORT const char *GetPackageVersion(void) {
+    static char buffer[512] = "";
+
+    SraReleaseVersion version;
+    memset(&version, 0, sizeof version);
+
+    SraReleaseVersionGet(&version);
+
+    SraReleaseVersionPrint(&version, buffer, sizeof buffer, NULL);
+
+    return buffer;
+}
diff --git a/libs/klib/num-gen.c b/libs/klib/num-gen.c
new file mode 100644
index 0000000..a8d089b
--- /dev/null
+++ b/libs/klib/num-gen.c
@@ -0,0 +1,1157 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/vector.h>
+#include <klib/num-gen.h>
+#include <sysalloc.h>
+
+#include <strtol.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+typedef struct num_gen_node
+{
+    int64_t start;
+    uint64_t count; /* 0 ... skip, > 0 ... valid */
+} num_gen_node;
+
+
+/* **************************************************************************
+{ start:5,count: 0 } ---> [ ]
+{ start:5,count: 1 } ---> [ 5 ]
+{ start:5,count: 2 } ---> [ 5, 6 ]
+ ************************************************************************** */
+
+struct num_gen
+{
+    Vector nodes;
+    bool sorted;
+};
+
+
+struct num_gen_iter
+{
+    Vector nodes;
+    uint32_t curr_node;
+    uint64_t curr_node_sub_pos;
+    uint64_t total;
+    uint64_t progress;
+    int64_t min_value;
+    int64_t max_value;
+};
+
+/* forward decl. for fixing-function */
+static rc_t num_gen_fix_overlaps( struct num_gen * self, uint32_t * count );
+
+
+/* helper function to destroy a node*/
+static void CC num_gen_node_destroy( void *item, void *data )
+{
+    free( item );
+}
+
+
+/* helper function to create a node from start/count */
+static struct num_gen_node * num_gen_make_node( const int64_t start, const uint64_t count )
+{
+    num_gen_node * p = malloc( sizeof( * p ) );
+    if ( p != NULL )
+    {
+        p -> start = start;
+        p -> count = count;
+    }
+    return p;
+}
+
+
+/* helper callback to compare 2 nodes, lets VectorInsert create a sorted vector */
+static int64_t CC num_gen_insert_helper( const void* item1, const void* item2 )
+{
+    int64_t res = 0;
+    const num_gen_node * node1 = item1;
+    const num_gen_node * node2 = item2;
+    if ( node1 != NULL && node2 != NULL )
+    {
+        if ( node1 -> start < node2 -> start )
+            res = -1;
+        else if ( node1 -> start > node2 -> start )
+            res = 1;
+        else if ( node1 -> count < node2 -> count )
+            res = -1;
+        else if ( node1 -> count > node2 -> count )
+            res = 1;
+    }
+    return res;
+}
+
+
+/* helper callback to create a deep and conditional copy of a node-vector */
+static void CC num_gen_copy_cb_sorted( void *item, void *data )
+{
+    num_gen_node * node = item;
+    if ( node != NULL && node -> count > 0 )
+    {
+        num_gen_node * new_node = num_gen_make_node( node->start, node->count );
+        if ( new_node != NULL )
+        {
+            Vector * dst = data;
+            if ( dst != NULL )
+                VectorInsert( dst, new_node, NULL, num_gen_insert_helper );
+        }
+    }
+}
+
+static void CC num_gen_copy_cb_unsorted( void *item, void *data )
+{
+    num_gen_node * node = item;
+    if ( node != NULL && node -> count > 0 )
+    {
+        num_gen_node * new_node = num_gen_make_node( node->start, node->count );
+        if ( new_node != NULL )
+        {
+            Vector * dst = data;
+            if ( dst != NULL )
+                VectorAppend( dst, NULL, new_node );
+        }
+    }
+}
+
+
+/* helper function that creates a deep and conditional copy of a node-vector */
+static void num_gen_copy_vector( const Vector * src, Vector * dst, bool sorted )
+{
+    if ( src != NULL && dst != NULL )
+    {
+        if ( sorted )
+            VectorForEach ( src, false, num_gen_copy_cb_sorted, dst );
+        else
+            VectorForEach ( src, false, num_gen_copy_cb_unsorted, dst );
+    }
+}
+
+
+/* helper callback to add up all count values in the vector*/
+static void CC num_gen_total_count_cb( void *item, void *data )
+{
+    num_gen_node * node = item;
+    if ( node != NULL )
+    {
+        uint64_t * total = ( uint64_t *)data;
+        if ( total != NULL )
+            *total += node -> count;
+    }
+}
+
+
+/* helper function that adds up all count values in the vector*/
+static uint64_t num_gen_total_count( const Vector * src )
+{
+    uint64_t res = 0;
+    if ( src != NULL )
+        VectorForEach ( src, false, num_gen_total_count_cb, &res );
+    return res;
+}
+
+
+/* helper function for the parse-function */
+static rc_t num_gen_add_node( struct num_gen * self, const int64_t from, const int64_t to )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcInserting, rcSelf, rcNull );
+    else
+    {
+        num_gen_node * node;
+        if ( from < to )
+            node = num_gen_make_node( from, ( to - from ) + 1 );
+        else
+            node = num_gen_make_node( to, ( from - to ) + 1 );
+
+        if ( node == NULL )
+            rc = RC( rcVDB, rcNoTarg, rcInserting, rcMemory, rcExhausted );
+        else
+        {
+            if ( self->sorted )
+                rc = VectorInsert( &( self -> nodes ), node, NULL, num_gen_insert_helper );
+            else
+                rc = VectorAppend( &( self -> nodes ), NULL, node );
+        }
+    }
+    return rc;
+}
+
+
+#define MAX_NUM_STR 12
+/* helper-structure for num_gen_parse() */
+typedef struct num_gen_parse_ctx
+{
+    uint32_t num_str_idx;
+    bool this_is_the_first_number;
+    int64_t num1;
+    int64_t num2;
+    char num_str[ MAX_NUM_STR + 1 ];
+} num_gen_parse_ctx;
+
+
+/* helper for num_gen_parse() */
+static void num_gen_convert_ctx( num_gen_parse_ctx * parse_ctx )
+{
+    if ( parse_ctx != NULL )
+    {
+        char * endp;
+        
+        parse_ctx -> num_str[ parse_ctx -> num_str_idx ] = 0;
+        parse_ctx -> num1 = strtoi64( parse_ctx -> num_str, &endp, 10 );
+        parse_ctx -> this_is_the_first_number = false;
+        parse_ctx -> num_str_idx = 0;
+    }
+}
+
+
+/* helper for num_gen_parse() */
+static rc_t num_gen_convert_and_add_ctx( struct num_gen * self, num_gen_parse_ctx * parse_ctx )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcInserting, rcSelf, rcNull );
+    else if ( parse_ctx == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+    else if ( parse_ctx -> num_str_idx == 0 )
+        rc = RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcEmpty );
+    else
+    {
+        char *endp;
+
+        /* terminate the source-string */
+        parse_ctx -> num_str[ parse_ctx -> num_str_idx ] = 0;
+
+        /* convert the string into a uint64_t */
+        if ( parse_ctx -> this_is_the_first_number )
+        {
+            parse_ctx -> num1 = strtoi64( parse_ctx -> num_str, &endp, 10 );
+            parse_ctx -> num2 = parse_ctx -> num1;
+        }
+        else
+        {
+            parse_ctx -> num2 = strtoi64( parse_ctx -> num_str, &endp, 10 );
+        }
+
+        /* empty the source-string to be reused */
+        parse_ctx -> num_str_idx = 0;
+        
+        parse_ctx -> this_is_the_first_number = true;
+        rc = num_gen_add_node( self, parse_ctx -> num1, parse_ctx -> num2 );
+    }
+    return rc;
+}
+
+
+static rc_t num_gen_parse_len( struct num_gen * self, const char * src, size_t len )
+{
+    rc_t rc = 0;
+
+    if ( len == 0 )
+        rc = RC( rcVDB, rcNoTarg, rcParsing, rcParam, rcEmpty );
+    else
+    {
+        size_t i;
+        num_gen_parse_ctx parse_ctx;
+
+        parse_ctx . num_str_idx = 0;
+        parse_ctx . this_is_the_first_number = true;
+
+        for ( i = 0; i < len && rc == 0; ++i )
+        {
+            switch ( src[ i ] )
+            {
+            /* a dash switches from N1-mode into N2-mode */
+            case '-' :
+                num_gen_convert_ctx( &parse_ctx );
+                break;
+
+            /* a comma ends a single number or a range */
+            case ',' :
+                rc = num_gen_convert_and_add_ctx( self, &parse_ctx );
+                break;
+
+            /* in both mode add the char to the temp string */
+            default:
+                if ( ( src[ i ] >= '0' ) && ( src[ i ] <= '9' )&&
+                     ( parse_ctx . num_str_idx < MAX_NUM_STR ) )
+                    parse_ctx . num_str[ parse_ctx . num_str_idx ++ ] = src[ i ];
+                break;
+            }
+        }
+
+        /* dont forget to add what is left in ctx.num_str ... */
+        if ( parse_ctx . num_str_idx > 0 )
+            rc = num_gen_convert_and_add_ctx( self, &parse_ctx );
+
+        if ( rc == 0 && self->sorted )
+            rc = num_gen_fix_overlaps( self, NULL );
+    }
+    return rc;
+}
+
+
+/* parse the given string and insert the found ranges 
+   into the number-generator, fixes eventual overlaps */
+LIB_EXPORT rc_t CC num_gen_parse( struct num_gen * self, const char * src )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcParsing, rcSelf, rcNull );
+    else if ( src == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcParsing, rcParam, rcNull );
+    else if ( src[ 0 ] == 0 )
+        rc = RC( rcVDB, rcNoTarg, rcParsing, rcParam, rcEmpty );
+    else
+        rc = num_gen_parse_len( self, src, string_measure ( src, NULL ) );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_parse_S( struct num_gen * self, const String * src )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcParsing, rcSelf, rcNull );
+    else if ( src == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcParsing, rcParam, rcNull );
+    else if ( src->len == 0 )
+        rc = RC( rcVDB, rcNoTarg, rcParsing, rcParam, rcEmpty );
+    else
+        rc = num_gen_parse_len( self, src->addr, src->len );
+
+    return rc;
+}
+
+
+/* inserts the given ranges into the number-generator,
+   fixes eventual overlaps */
+LIB_EXPORT rc_t CC num_gen_add( struct num_gen * self, const int64_t first, const uint64_t count )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcInserting, rcSelf, rcNull );
+    if ( count == 0 )
+        rc = RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcEmpty );
+    else
+    {
+        rc = num_gen_add_node( self, first, ( first + count ) - 1 );
+        if ( rc == 0 && self->sorted )
+            rc = num_gen_fix_overlaps( self, NULL );
+    }
+    return rc;
+}
+
+
+/* helper function for range-check */
+static bool CC num_gen_check_range_start( num_gen_node * node, const int64_t range_start )
+{
+    bool res = ( node != NULL );
+    if ( res )
+    {
+        int64_t last = ( node -> start + node -> count ) - 1;
+        
+        if ( node -> start < range_start )
+        {
+            node -> start = range_start;
+            if ( node -> start <= last )
+                node -> count = ( last - ( node -> start ) ) + 1;
+            else
+            {
+                /* the node becomes invalid ... */
+                node -> start = 0;
+                node -> count = 0;
+                res = false;
+            }
+        }
+    }
+    return res;
+}
+
+
+/* helper function for range-check */
+static void CC num_gen_check_range_end( num_gen_node * node, const int64_t last )
+{
+    if ( node != NULL )
+    {
+        int64_t node_last = ( node -> start + node -> count ) - 1;
+
+        if ( node_last > last )
+        {
+            node_last = last;
+            if ( node -> start <= node_last )
+            {
+                node->count = ( node_last - ( node -> start ) ) + 1;
+            }
+            else
+            {
+                /* the node becomes invalid ... */
+                node -> start = 0;
+                node -> count = 0;
+            }
+        }
+    }
+}
+
+
+/* helper function for range-check */
+static void CC num_gen_check_range_callback( void * item, void * data )
+{
+    num_gen_node * node   = item;
+    num_gen_node * range  = data;
+
+    if ( node != NULL && range != NULL )
+    {
+        /* ignore invalid nodes... */
+        if ( node -> start != 0 && node -> count != 0 )
+        {
+            /* check if the start value is not out of range... */
+            if ( num_gen_check_range_start( node, range -> start ) )
+            {
+                uint64_t last = ( ( range -> start ) + ( range -> count ) ) - 1;
+                num_gen_check_range_end( node, last );
+            }
+        }
+    }
+}
+
+
+/* helper function for range-check */
+static void CC num_gen_count_invalid_nodes( void * item, void * data )
+{
+    num_gen_node * node = item;
+    
+    if ( ( node != NULL ) && ( node -> start == 0 ) && ( node -> count == 0 ) )
+    {
+        uint32_t * invalid_count = data;
+        if ( invalid_count != NULL )
+        {
+            ( *invalid_count )++;
+        }
+    }
+}
+
+
+/* helper function for range-check */
+static void CC num_gen_copy_valid_nodes( void * item, void * data )
+{
+    num_gen_node * node = item;
+
+    if ( node != NULL )
+    {
+        if ( ( node -> start != 0 )&&( node -> count != 0 ) )
+        {
+            Vector * dest = data;
+            if ( dest != NULL )
+                VectorInsert ( dest, node, NULL, num_gen_insert_helper );
+        }
+        else
+            free ( node );
+    }
+}
+
+
+/* helper function for range-check */
+static void num_gen_remove_invalid_nodes( struct num_gen * self )
+{
+    if ( self != NULL )
+    {
+        uint32_t count = VectorLength( &( self -> nodes ) );
+        if ( count > 0 )
+        {
+            Vector temp_nodes;
+            /* create a temp. vector */
+            VectorInit( &temp_nodes, 0, count );
+
+            /* copy all valid nodes into the temp. vector */
+            VectorForEach ( &( self -> nodes ), false,
+                            num_gen_copy_valid_nodes, &temp_nodes );
+
+            /* clear all nodes so far...,
+               DO NOT PASS num_gen_node_destroy into it */
+            VectorWhack( &( self -> nodes ), NULL, NULL );
+
+            /* initialize and copy (shallow) the valid nodes back
+               into the generator */
+            VectorCopy ( &temp_nodes, &( self -> nodes ) );
+
+            /* destroy the temp-vector,
+               DO NOT PASS num_gen_node_destroy into it */
+            VectorWhack ( &temp_nodes, NULL, NULL );
+        }
+    }
+}
+
+
+/* helper function for trim */
+LIB_EXPORT rc_t CC num_gen_trim( struct num_gen * self, const int64_t first, const uint64_t count )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcValidating, rcSelf, rcNull );
+    else
+    {
+        num_gen_node trim_range;
+        uint32_t invalid_nodes = 0;
+
+        /* walk all nodes to check for boundaries... */
+        trim_range.start = first;
+        trim_range.count = count;
+
+        VectorForEach ( &( self -> nodes), false,
+                        num_gen_check_range_callback, &trim_range );
+
+        VectorForEach ( &( self -> nodes ), false,
+                        num_gen_count_invalid_nodes, &invalid_nodes );
+
+        if ( invalid_nodes > 0 )
+            num_gen_remove_invalid_nodes( self );
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_make( struct num_gen ** self )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        struct num_gen * ng = calloc( 1, sizeof( * ng ) );
+        if ( ng == NULL )
+            rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            VectorInit( &( ng -> nodes ), 0, 5 );
+            ng->sorted = false;
+            *self = ng;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_make_sorted( struct num_gen ** self, bool sorted )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        struct num_gen * ng = calloc( 1, sizeof( * ng ) );
+        if ( ng == NULL )
+            rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            VectorInit( &( ng -> nodes ), 0, 5 );
+            ng->sorted = sorted;
+            *self = ng;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_make_from_str( struct num_gen ** self, const char * src )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+    else if ( src == NULL || src[ 0 ] == 0 )
+    {
+        *self = NULL;
+        rc = RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+    }
+    else
+    {
+        struct num_gen * temp;
+        rc = num_gen_make( &temp );
+        if ( rc == 0 )
+        {
+            rc = num_gen_parse( temp, src );
+        }
+        if ( rc == 0 )
+            *self = temp;
+        else
+        {
+            *self = NULL;
+            num_gen_destroy( temp );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_make_from_str_sorted( struct num_gen ** self, const char * src, bool sorted )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+    else if ( src == NULL || src[ 0 ] == 0 )
+    {
+        *self = NULL;
+        rc = RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+    }
+    else
+    {
+        struct num_gen * temp;
+        rc = num_gen_make_sorted( &temp, sorted );
+        if ( rc == 0 )
+        {
+            rc = num_gen_parse( temp, src );
+        }
+        if ( rc == 0 )
+            *self = temp;
+        else
+        {
+            *self = NULL;
+            num_gen_destroy( temp );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC num_gen_make_from_range( struct num_gen ** self, int64_t first, uint64_t count )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+    else if ( count == 0 )
+    {
+        *self = NULL;
+        rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcEmpty );
+    }
+    else
+    {
+        struct num_gen * temp;
+        rc = num_gen_make( &temp );
+        if ( rc == 0 )
+            rc = num_gen_add( temp, first, count );
+        if ( rc == 0 )
+            *self = temp;
+        else
+        {
+            *self = NULL;
+            num_gen_destroy( temp );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_clear( struct num_gen * self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcClearing, rcSelf, rcNull );
+    else if ( VectorLength( &( self -> nodes ) ) > 0 )
+    {
+        /* clear all nodes so far... */
+        VectorWhack( &( self -> nodes ), num_gen_node_destroy, NULL );
+
+        /* re-init the vector */
+        VectorInit( &( self->nodes ), 0, 5 );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_destroy( struct num_gen * self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcDestroying, rcSelf, rcNull );
+    else
+    {
+        VectorWhack( &( self -> nodes ), num_gen_node_destroy, NULL );
+        free( self );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT bool CC num_gen_empty( const struct num_gen * self )
+{
+    bool res = ( self != NULL );
+    if ( res )
+        res = ( VectorLength( &( self -> nodes ) ) < 1 );
+    return res;
+}
+
+
+typedef struct overlap_ctx
+{
+    num_gen_node * prev;
+    uint32_t overlaps;
+} overlap_ctx;
+
+
+/* static bool CC num_gen_overlap_fix_cb( void *item, void *data ) */
+static bool CC num_gen_overlap_fix_cb( void *item, void *data )
+{
+    bool res = false;
+    num_gen_node * node = item;
+    if ( node != NULL )
+    {
+        /* skip invalid nodes */
+        if ( node -> count > 0 && node -> start > 0 )
+        {
+            overlap_ctx * ov_ctx = data;
+            if ( ov_ctx != NULL )
+            {
+                /* if we do not have a previous node, take this one... */
+                if ( ov_ctx -> prev == NULL )
+                {
+                    ov_ctx -> prev = node;
+                }
+                else
+                {
+                    int64_t prev_last = ( ov_ctx -> prev -> start + ov_ctx -> prev -> count ) - 1;
+
+                    /* if we do not have an overlap, take this node as prev-node and continue */
+                    if ( prev_last < node -> start )
+                    {
+                        ov_ctx -> prev = node;
+                    }
+                    else
+                    {
+                        /* we have a overlap, the end of the prev-node is inside
+                           the current-node, we fix it by expanding the prev-node
+                           to the end of this node, and later declaring this
+                           node as invalid */
+                        int64_t this_last = ( node -> start + node -> count ) - 1;
+                        if ( prev_last < this_last )
+                        {
+                            ov_ctx -> prev -> count = ( prev_last - ( ov_ctx -> prev -> start ) ) + 1;
+                        }
+                        else
+                        {
+                            /* if the prev-node ends after this node, all we have to
+                               do is declaring this node as invalid */
+                            node->count = 0;
+                            node->start = 0;
+                        }
+                        res = true;
+                    }
+                }
+            }
+        }
+    }
+    return res;
+}
+
+
+static rc_t num_gen_fix_overlaps( struct num_gen * self, uint32_t * count )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+    else
+    {
+        overlap_ctx ov_ctx;
+        bool fix_executed = false;
+        
+        ov_ctx . overlaps = 0;
+        do
+        {
+            ov_ctx . prev = NULL;
+            fix_executed = VectorDoUntil ( &( self -> nodes ), false,
+                                           num_gen_overlap_fix_cb, &ov_ctx );
+        } while ( fix_executed );
+
+        if ( count )
+            *count = ov_ctx . overlaps;
+    }
+    return rc;
+}
+
+
+typedef struct string_ctx
+{
+    char * buffer;
+    size_t buffsize, written;
+} string_ctx;
+
+
+static void CC num_gen_as_string_cb( void * item, void * data )
+{
+    num_gen_node * node = item;
+    if ( node != NULL )
+    {
+        string_ctx * str_ctx = data;
+        if ( str_ctx != NULL && node -> count > 0 )
+        {
+            size_t bsize = str_ctx -> buffsize - str_ctx -> written;
+            if ( bsize > 0 )
+            {
+                rc_t rc;
+                char * buf = str_ctx -> buffer + str_ctx -> written;
+                size_t written;
+                if ( node -> count == 1 )
+                {
+                    rc = string_printf ( buf, bsize, &written, "%ld,", node -> start );
+                }
+                else
+                {
+                    uint64_t last = ( ( node -> start ) + ( node -> count ) ) - 1;
+                    rc = string_printf ( buf, bsize, &written, "%ld-%ld,", node -> start, last );
+                }
+                if ( rc == 0 )
+                    str_ctx -> written += written;
+            }
+        }
+    }
+}
+
+
+static void CC num_gen_as_string_full_info_cb( void * item, void * data )
+{
+    num_gen_node * node = item;
+    if ( node != NULL )
+    {
+        string_ctx * str_ctx = data;
+        if ( str_ctx != NULL )
+        {
+            size_t bsize = str_ctx -> buffsize - str_ctx -> written;
+            char * buf = str_ctx -> buffer + str_ctx -> written;
+            size_t written;
+            rc_t rc = string_printf ( buf, bsize, &written, "[s:%lu c:%lu]", node -> start, node -> count );
+            if ( rc == 0 )
+                str_ctx -> written += written;
+        }
+    }
+}
+
+
+LIB_EXPORT rc_t CC num_gen_as_string( const struct num_gen * self, char * buffer, size_t buffsize, size_t * written, bool full_info )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+    else if ( buffer == NULL || buffsize == 0 )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+    else
+    {
+        string_ctx str_ctx;
+    
+        str_ctx . buffer = buffer;
+        str_ctx . buffsize = buffsize;
+        str_ctx . written = 0;
+
+        if ( full_info )
+            VectorForEach ( &( self -> nodes ), false, num_gen_as_string_full_info_cb, &str_ctx );
+        else
+            VectorForEach ( &( self -> nodes ), false, num_gen_as_string_cb, &str_ctx );
+
+        if ( written != NULL )
+            *written = str_ctx . written;
+    }
+    return rc;
+}
+
+
+static bool CC num_gen_contains_cb( void * item, void * data )
+{
+    bool res = false;
+    num_gen_node * node = item;
+    if ( node != NULL && node->count > 0 )
+    {
+        int64_t * value = data;
+        if ( value != NULL )
+        {
+            int64_t end = ( node -> start + node -> count ) - 1;
+            res = ( node -> start <= *value && *value <= end );
+        }
+    }
+    return res;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_contains_value( const struct num_gen * self, const int64_t value )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+    else
+    {
+        int64_t temp = value;
+        if ( !VectorDoUntil ( &( self -> nodes ), false, num_gen_contains_cb, &temp ) )
+            rc = RC( rcVDB, rcNoTarg, rcReading, rcData, rcEmpty );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_range_check( struct num_gen * self, const int64_t first, const uint64_t count )
+{
+    rc_t rc;
+    /* if the user did not specify a range, take all */
+    if ( num_gen_empty( self ) )
+        rc = num_gen_add( self, first, count );
+    /* if the user did specify a range, check the boundaries */
+    else
+        rc = num_gen_trim( self, first, count );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_copy( const struct num_gen * self, struct num_gen ** dest )
+{
+    rc_t rc = num_gen_make( dest );
+    if ( rc == 0 )
+    {
+        num_gen_copy_vector( &( self -> nodes ), &( ( *dest ) -> nodes ), self->sorted );
+    }
+    return rc;
+}
+
+
+static int64_t min_vector_value( Vector * v )
+{
+    int64_t res = 0;
+    num_gen_node * node = VectorGet( v, 0 );
+    if ( node != NULL )
+        res = node -> start;
+    return res;
+}
+
+
+static int64_t max_vector_value( Vector * v )
+{
+    int64_t res = 0;
+    uint32_t count = VectorLength( v );
+    if ( count > 0 )
+    {
+        num_gen_node * node = VectorGet( v, count - 1 );
+        if ( node != NULL )
+            res = ( node -> start + node -> count ) - 1;
+    }
+    return res;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_iterator_make( const struct num_gen * self, const struct num_gen_iter ** iter )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+    else if ( iter == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+    else
+    {
+        struct num_gen_iter * temp = calloc( 1, sizeof( * temp ) );
+        *iter = NULL;
+        if ( temp == NULL )
+            rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            uint32_t count = VectorLength( &( self -> nodes ) );
+            if ( count == 0 )
+            {
+                VectorInit( &( temp -> nodes ), 0, 5 );
+                /* everything else is set to zero, because of calloc() above */
+            }
+            else
+            {
+                VectorInit( &( temp -> nodes ), 0, count );
+                num_gen_copy_vector( &( self -> nodes ), &( temp -> nodes ), self->sorted );
+                temp -> total = num_gen_total_count( &( temp -> nodes ) );
+                temp -> min_value = min_vector_value( &( temp -> nodes ) );
+                temp -> max_value = max_vector_value( &( temp -> nodes ) );
+            }
+            *iter = temp;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_iterator_destroy( const struct num_gen_iter *self )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcDestroying, rcSelf, rcNull );
+    else
+    {
+        struct num_gen_iter * temp = ( struct num_gen_iter * )self;
+        VectorWhack( &( temp -> nodes ), num_gen_node_destroy, NULL );
+        free( temp );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT bool CC num_gen_iterator_next( const struct num_gen_iter * self, int64_t * value, rc_t * rc )
+{
+    bool res = false;
+    if ( self == NULL )
+    {
+        if ( rc != NULL )
+            *rc = RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+    }
+    else if ( value == NULL )
+    {
+        if ( rc != NULL )
+            *rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+    }
+    else if ( self -> curr_node < VectorLength( &( self -> nodes ) ) )
+    {
+        *value = 0;
+        {
+            struct num_gen_iter * temp = ( struct num_gen_iter * )self;
+            num_gen_node * node = VectorGet( &( temp -> nodes ), temp -> curr_node );
+            if ( node == NULL )
+            {
+                if ( rc != NULL )
+                    *rc = RC( rcVDB, rcNoTarg, rcReading, rcItem, rcInvalid );
+            }
+            else
+            {
+                if ( node -> count < 2 )
+                {
+                    /* the node is a single-number-node, next node for next time */
+                    *value = node -> start;
+                    ( temp -> curr_node )++;
+                }
+                else
+                {
+                    /* the node is a number range, add the sub-position */
+                    *value = node -> start + temp -> curr_node_sub_pos;
+                    ( temp -> curr_node_sub_pos )++;
+                    /* if the sub-positions are used up, switch to next node */
+                    if ( temp -> curr_node_sub_pos >= node -> count )
+                    {
+                        ( temp -> curr_node )++;
+                        temp -> curr_node_sub_pos = 0;
+                    }
+                }
+                ( temp -> progress )++;
+                res = true;
+            }
+        }
+    }
+    return res;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_iterator_count( const struct num_gen_iter * self, uint64_t * count )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+    else if ( count == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+    else
+        *count = self -> total;
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_iterator_min( const struct num_gen_iter * self, int64_t * value )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+    else if ( value == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+    else
+        *value = self -> min_value;
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_iterator_max( const struct num_gen_iter * self, int64_t * value )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+    else if ( value == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+    else
+        *value = self -> max_value;
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC num_gen_iterator_percent( const struct num_gen_iter * self, uint8_t fract_digits, uint32_t * value )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+    else if ( value == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+    else
+    {
+        uint32_t factor = 100;
+        if ( fract_digits > 0 )
+        {
+            if ( fract_digits > 1 )
+                factor = 10000;
+            else
+                factor = 1000;
+        }
+            
+        if ( self -> total > 0 )
+        {
+            if ( self -> progress >= self -> total )
+                *value = factor;
+            else
+            {
+                uint64_t temp = self -> progress;
+                temp *= factor;
+                temp /= self -> total;
+                *value = ( uint16_t ) temp;
+            }
+        }
+        else
+            *value = 0;
+    }
+    return rc;
+}
diff --git a/libs/klib/out.c b/libs/klib/out.c
new file mode 100644
index 0000000..83c913d
--- /dev/null
+++ b/libs/klib/out.c
@@ -0,0 +1,208 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include <klib/extern.h>
+#include <klib/out.h>
+#include "writer-priv.h"
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <sysalloc.h>
+
+#include <stdarg.h>
+#include <string.h>
+
+LIB_EXPORT KWrtHandler G_out_handler;
+
+LIB_EXPORT rc_t CC KOutInit ( void )
+{
+    return KOutHandlerSetStdOut ();
+}
+
+static
+rc_t KOutMsgNulTermStringFmt ( const char * arg )
+{
+    size_t num_writ;
+    KWrtHandler * kout_msg_handler = KOutHandlerGet ();
+    return ( * kout_msg_handler -> writer ) ( kout_msg_handler -> data, arg, string_size ( arg ), & num_writ );        
+}
+
+static
+rc_t KOutMsgPrecNulTermStringFmt ( va_list args )
+{
+    unsigned int arg1 = va_arg ( args, unsigned int );
+    const char* arg2 = va_arg ( args, const char* );
+
+    size_t num_writ;
+    KWrtHandler * kout_msg_handler = KOutHandlerGet ();
+    return ( * kout_msg_handler -> writer ) ( kout_msg_handler -> data, arg2, arg1, & num_writ );        
+}
+
+static
+rc_t KOutMsgStringFmt ( const String * arg )
+{
+    size_t num_writ;
+    KWrtHandler * kout_msg_handler = KOutHandlerGet ();
+    return ( * kout_msg_handler -> writer ) ( kout_msg_handler -> data, arg->addr, arg->size, & num_writ );
+}
+
+static
+rc_t KOutMsgCharFmt ( uint32_t u32 )
+{
+    rc_t rc;
+    size_t num_writ;
+    KWrtHandler * kout_msg_handler = KOutHandlerGet ();
+
+    if ( u32 < 128 )
+    {
+        char ch = ( char ) u32;
+        rc = ( * kout_msg_handler -> writer ) ( kout_msg_handler -> data, &ch, 1, & num_writ );
+    }
+    else
+    {
+        char buf[4];
+        int dbytes = utf32_utf8 ( buf, & buf [ sizeof buf ], u32 );
+        if ( dbytes <= 0 )
+        {   /* invalid character */
+            rc = ( * kout_msg_handler -> writer ) ( kout_msg_handler -> data, "?", 1, & num_writ );
+        }
+        else
+        {
+            rc = ( * kout_msg_handler -> writer ) ( kout_msg_handler -> data, buf, dbytes, & num_writ );
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KOutMsg ( const char * fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+
+#define MATCH_FORMAT(format, literal) \
+    ( ( const void* ) ( format ) == ( const void* ) ( literal ) )
+
+    /* rapid pointer comparison */
+    if ( MATCH_FORMAT ( fmt, "%s" ) )
+        rc = KOutMsgNulTermStringFmt ( va_arg ( args, const char * ) );
+    else if ( MATCH_FORMAT ( fmt, "%.*s" ) )
+        rc = KOutMsgPrecNulTermStringFmt ( args );
+    else if ( MATCH_FORMAT ( fmt, "%S" ) )
+        rc = KOutMsgStringFmt ( va_arg ( args, const String * ) );
+    else if ( MATCH_FORMAT ( fmt, "%c" ) )
+        rc = KOutMsgCharFmt ( va_arg ( args, unsigned int ) );
+
+#undef MATCH_FORMAT
+#define MATCH_FORMAT(format, literal) \
+    ( memcmp ( ( format ), ( literal ), sizeof ( literal ) ) == 0 )
+
+    /* slower value comparison */
+    else if (MATCH_FORMAT(fmt, "%s"))
+        rc = KOutMsgNulTermStringFmt ( va_arg ( args, const char * ) );
+    else if (MATCH_FORMAT(fmt, "%.*s"))
+        rc = KOutMsgPrecNulTermStringFmt ( args );
+    else if (MATCH_FORMAT(fmt, "%S"))
+        rc = KOutMsgStringFmt ( va_arg ( args, const String * ) );
+    else if (MATCH_FORMAT(fmt, "%c"))
+        rc = KOutMsgCharFmt ( va_arg ( args, unsigned int ) );
+    else if( (rc = vkfprintf(KOutHandlerGet(), NULL, fmt, args)) != 0 ) 
+    {
+        kfprintf(KOutHandlerGet(), NULL, "outmsg failure: %R in '%s'\n", rc, fmt);
+    }
+#undef MATCH_FORMAT
+
+    va_end ( args );
+
+    return rc;
+}
+
+/* kprintf
+ *  performs a printf to our output writer
+ *  much like KOutMsg, but returns a size_t
+ */
+LIB_EXPORT rc_t CC kprintf ( size_t *num_writ, const char * fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+
+    rc = vkfprintf ( KOutHandlerGet (), num_writ, fmt, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC vkprintf ( size_t *num_writ, const char * fmt, va_list args )
+{
+    return vkfprintf ( KOutHandlerGet (), num_writ, fmt, args );
+}
+
+
+#undef KOutHandlerSetStdOut
+LIB_EXPORT rc_t CC KOutHandlerSetStdOut ( void )
+{
+    return KOutHandlerSet( KWrt_DefaultWriter, KWrt_DefaultWriterDataStdOut );
+}
+
+
+#undef KOutHandlerSetStdErr
+LIB_EXPORT rc_t CC KOutHandlerSetStdErr ( void )
+{
+    return KOutHandlerSet( KWrt_DefaultWriter, KWrt_DefaultWriterDataStdErr );
+}
+
+
+#undef KOutHandlerSet
+LIB_EXPORT rc_t CC KOutHandlerSet ( KWrtWriter writer, void * writer_data )
+{
+    G_out_handler.writer = writer;
+    G_out_handler.data = writer_data;
+    return 0;
+}
+
+
+#undef KOutDataGet
+LIB_EXPORT void * CC KOutDataGet ( void )
+{
+    return ( KOutHandlerGet()->data );
+}
+
+
+#undef KOutWriterGet
+LIB_EXPORT KWrtWriter CC KOutWriterGet ( void )
+{
+    return ( KOutHandlerGet()->writer );
+}
+
+
+#undef KOutHandlerGet
+LIB_EXPORT KWrtHandler * CC KOutHandlerGet ( void )
+{
+    return ( &G_out_handler );
+}
diff --git a/libs/klib/pack.c b/libs/klib/pack.c
new file mode 100644
index 0000000..90b1584
--- /dev/null
+++ b/libs/klib/pack.c
@@ -0,0 +1,517 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/pack.h>
+#include <klib/rc.h>
+#include <arch-impl.h>
+#include <sysalloc.h>
+
+#include <endian.h>
+#include <byteswap.h>
+#include <string.h>
+#include <assert.h>
+
+#if ! defined __LITTLE_ENDIAN && ! defined __BIG_ENDIAN
+#error "only little and big endian architectures are supported"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * pack
+ */
+#define MASK_SRC 0
+
+/* READ_UNPACKED
+ *  macro to read source elements into register
+ *  casts source pointer to appropriate type
+ *  performs byte swap if necessary to ensure that
+ *    elements are in reverse order
+ */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define READ_UNPACKED8( src, idx ) \
+    ( ( const uint32_t* ) ( src ) ) [ idx ]
+#else
+#define READ_UNPACKED8( src, idx ) \
+    bswap_32 ( ( ( const uint32_t* ) ( src ) ) [ idx ] )
+#endif
+
+#define READ_UNPACKED16( src, idx ) \
+    ( ( const uint16_t* ) ( src ) ) [ idx ]
+
+#define READ_UNPACKED32( src, idx ) \
+    ( ( const uint32_t* ) ( src ) ) [ idx ]
+
+#define READ_UNPACKED64( src, idx ) \
+    ( ( const uint64_t* ) ( src ) ) [ idx ]
+
+/* MASK
+ *  macro to mask off portion of source register
+ */
+#if MASK_SRC
+
+#define MASK8( in ) \
+    ( in ) & src_mask
+#define MASK16( in ) \
+    ( in ) & src_mask
+#define MASK32( in ) \
+    ( in ) & src_mask
+#define MASK64( in ) \
+    ( in ) & src_mask
+
+#else
+
+#define MASK8( in ) \
+    ( uint8_t ) ( in )
+#define MASK16( in ) \
+    ( uint16_t ) ( in )
+#define MASK32( in ) \
+    ( uint32_t ) ( in )
+#define MASK64( in ) \
+    ( uint64_t ) ( in )
+
+#endif
+
+
+/* WRITE_PACKED
+ *  macro to write dest elements from accumulator
+ *  casts dest pointer to appropriate type
+ *  performs byte swap if necessary to ensure that
+ *    elements are in stream order
+ */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define WRITE_PACKED32( acc, dst, idx ) \
+    ( ( uint32_t* ) ( dst ) ) [ idx ] = bswap_32 ( ( uint32_t ) ( acc ) )
+#define WRITE_PACKED64( acc, dst, idx ) \
+    ( ( uint64_t* ) ( dst ) ) [ idx ] = bswap_64 ( ( uint64_t ) ( acc ) )
+#else
+#define WRITE_PACKED32( acc, dst, idx ) \
+    ( ( uint32_t* ) ( dst ) ) [ idx ] = ( uint32_t ) ( acc )
+#define WRITE_PACKED64( acc, dst, idx ) \
+    ( ( uint64_t* ) ( dst ) ) [ idx ] = ( uint64_t ) ( acc )
+#endif
+
+/* Pack8
+ */
+static
+void Pack8 ( uint32_t packed, void *dst, const void *src, uint32_t count )
+{
+    /* accumulator */
+    uint64_t acc;
+    uint32_t abits;
+
+    /* loop indices */
+    uint32_t s, d, cnt;
+
+#if MASK_SRC
+    uint32_t src_mask = ( 1 << packed ) - 1;
+#endif
+
+    for ( acc = 0, abits = s = d = 0, cnt = count >> 2; s < cnt; ++ s )
+    {
+        /* get 4 bytes in reverse order, i.e.
+           bits 0-7 are src[0], bits 8-15 are src[1], etc. */
+        uint32_t in = READ_UNPACKED8 ( src, s );
+
+        /* pack the bytes into our accumulator */
+        acc <<= packed;
+        acc |= MASK8 ( in );
+
+        /* account for activity */
+        abits += packed;
+        in >>= 8;
+
+        /* detect need to dump accumulator */
+        if ( abits >= 32 )
+        {
+            abits -= 32;
+            WRITE_PACKED32 ( acc >> abits, dst, d ++ );
+        }
+
+        /* repeat for remaining 3 source bytes */
+        acc <<= packed;
+        acc |= MASK8 ( in );
+        abits += packed;
+        in >>= 8;
+        if ( abits >= 32 )
+        {
+            abits -= 32;
+            WRITE_PACKED32 ( acc >> abits, dst, d ++ );
+        }
+
+        acc <<= packed;
+        acc |= MASK8 ( in );
+        abits += packed;
+        in >>= 8;
+        if ( abits >= 32 )
+        {
+            abits -= 32;
+            WRITE_PACKED32 ( acc >> abits, dst, d ++ );
+        }
+
+        acc <<= packed;
+        acc |= MASK8 ( in );
+        abits += packed;
+        in >>= 8;
+        if ( abits >= 32 )
+        {
+            abits -= 32;
+            WRITE_PACKED32 ( acc >> abits, dst, d ++ );
+        }
+    }
+
+    /* handle remaining src bytes */
+    for ( s <<= 2; s < count; ++ s )
+    {
+        acc <<= packed;
+        acc |= MASK8 ( ( ( const uint8_t* ) src ) [ s ] );
+        abits += packed;
+        if ( abits >= 32 )
+        {
+            abits -= 32;
+            WRITE_PACKED32 ( acc >> abits, dst, d ++ );
+        }
+    }
+
+    /* handle remaining accumulator bits */
+    if ( abits != 0 )
+    {
+        uint32_t out = bswap_32 ( ( uint32_t ) ( acc << ( 32 - abits ) ) );
+        abits = ( abits + 7 ) >> 3;
+        for ( d <<= 2; abits != 0; -- abits, out >>= 8, ++ d )
+            ( ( uint8_t* ) dst ) [ d ] = ( uint8_t ) out;
+    }
+}
+
+/* Pack16
+ */
+static
+void Pack16 ( uint32_t packed, void *dst, const void *src, uint32_t count )
+{
+    /* accumulator */
+    uint64_t acc;
+    uint32_t abits;
+
+    /* loop indices */
+    uint32_t s, d;
+
+#if MASK_SRC
+    uint32_t src_mask = ( 1 << packed ) - 1;
+#endif
+
+    for ( acc = 0, abits = d = s = 0; s < count; ++ s )
+    {
+        /* get 2 bytes in native order */
+        uint32_t in = READ_UNPACKED16 ( src, s );
+
+        /* pack the bytes into our accumulator */
+        acc <<= packed;
+        acc |= MASK16 ( in );
+
+        /* account for activity */
+        abits += packed;
+
+        /* detect need to dump accumulator */
+        if ( abits >= 32 )
+        {
+            abits -= 32;
+            WRITE_PACKED32 ( acc >> abits, dst, d ++ );
+        }
+    }
+
+    /* handle remaining accumulator bits */
+    if ( abits != 0 )
+    {
+        uint32_t out = bswap_32 ( ( uint32_t ) ( acc << ( 32 - abits ) ) );
+        abits = ( abits + 7 ) >> 3;
+        for ( d <<= 2; abits != 0; -- abits, out >>= 8, ++ d )
+            ( ( uint8_t* ) dst ) [ d ] = ( uint8_t ) out;
+    }
+}
+
+/* Pack32
+ */
+static
+void Pack32 ( uint32_t packed, void *dst, const void *src, uint32_t count )
+{
+    /* accumulator */
+    uint64_t acc;
+    uint32_t abits;
+
+    /* loop indices */
+    uint32_t s, d;
+
+#if MASK_SRC
+    uint32_t src_mask = ( 1 << packed ) - 1;
+#endif
+
+    for ( acc = 0, abits = d = s = 0; s < count; ++ s )
+    {
+        /* get 4 bytes in native order */
+        uint32_t in = READ_UNPACKED32 ( src, s );
+
+        /* pack the bytes into our accumulator */
+        acc <<= packed;
+        acc |= MASK32 ( in );
+
+        /* account for activity */
+        abits += packed;
+
+        /* detect need to dump accumulator */
+        if ( abits >= 32 )
+        {
+            abits -= 32;
+            WRITE_PACKED32 ( acc >> abits, dst, d ++ );
+        }
+    }
+
+    /* handle remaining accumulator bits */
+    if ( abits != 0 )
+    {
+        uint32_t out = bswap_32 ( ( uint32_t ) ( acc << ( 32 - abits ) ) );
+        abits = ( abits + 7 ) >> 3;
+        for ( d <<= 2; abits != 0; -- abits, out >>= 8, ++ d )
+            ( ( uint8_t* ) dst ) [ d ] = ( uint8_t ) out;
+    }
+}
+
+/* Pack64a
+ *  source is 64 bits, packed <= 32 bits
+ */
+static
+void Pack64a ( uint32_t packed, void *dst, const void *src, uint32_t count )
+{
+    /* accumulator */
+    uint64_t acc;
+    uint32_t abits;
+
+    /* loop indices */
+    uint32_t s, d;
+
+#if MASK_SRC
+    uint64_t src_mask = ( 1 << packed ) - 1;
+#endif
+
+    for ( acc = 0, abits = d = s = 0; s < count; ++ s )
+    {
+        /* get 8 bytes in native order */
+        uint64_t in = READ_UNPACKED64 ( src, s );
+
+        /* pack the bytes into our accumulator */
+        acc <<= packed;
+        acc |= MASK32 ( in );
+
+        /* account for activity */
+        abits += packed;
+
+        /* detect need to dump accumulator */
+        if ( abits >= 32 )
+        {
+            abits -= 32;
+            WRITE_PACKED32 ( acc >> abits, dst, d ++ );
+        }
+    }
+
+    /* handle remaining accumulator bits */
+    if ( abits != 0 )
+    {
+        uint32_t out = bswap_32 ( ( uint32_t ) ( acc << ( 32 - abits ) ) );
+        abits = ( abits + 7 ) >> 3;
+        for ( d <<= 2; abits != 0; -- abits, out >>= 8, ++ d )
+            ( ( uint8_t* ) dst ) [ d ] = ( uint8_t ) out;
+    }
+}
+
+/* Pack64b
+ *  source is 64 bits, packed > 32 bits
+ */
+static
+void Pack64b ( uint32_t packed, void *dst, const void *src, uint32_t count )
+{
+    /* accumulator */
+    uint128_t acc;
+    uint32_t abits;
+
+    /* loop indices */
+    uint32_t s, d;
+
+#if MASK_SRC
+    uint64_t src_mask = ( ( uint64_t ) 1U << packed ) - 1;
+#endif
+
+    for ( abits = d = s = 0; s < count; ++ s )
+    {
+        /* get 8 bytes in native order */
+        uint64_t in = READ_UNPACKED64 ( src, s );
+
+        /* pack the bytes into our accumulator */
+        uint128_shl ( & acc, packed );
+        uint128_orlo ( & acc, MASK64 ( in ) );
+
+        /* account for activity */
+        abits += packed;
+
+        /* detect need to dump accumulator */
+        if ( abits >= 64 )
+        {
+            uint64_t save = uint128_lo ( & acc );
+            abits -= 64;
+            uint128_shr ( & acc, abits );
+            WRITE_PACKED64 ( uint128_lo ( & acc ), dst, d ++ );
+            uint128_setlo ( & acc, save );
+        }
+    }
+
+    /* handle remaining accumulator bits */
+    if ( abits != 0 )
+    {
+        uint64_t out;
+        uint128_shl ( & acc, 64 - abits );
+        out = bswap_64 ( uint128_lo ( & acc ) );
+        abits = ( abits + 7 ) & ~ 7;
+        for ( d <<= 3, out >>= 64 - abits; abits != 0; abits -= 8, out >>= 8, ++ d )
+            ( ( uint8_t* ) dst ) [ d ] = ( uint8_t ) out;
+    }
+}
+
+/* Pack
+ *  accepts a series of unpacked source bits
+ *  produces a series of packed destination bits by eliminating MSB
+ *
+ *  "unpacked" [ IN ] - original element size in bits
+ *  must be in 2^^[3..6], i.e. { 8, 16, 32, 64 }
+ *
+ *  "packed" [ IN ] - packed element size in bits
+ *  must be <= "unpacked"
+ *
+ *  "src" [ IN ] and "ssize" [ IN ] - source buffer
+ *  with size given in bytes
+ *
+ *  "consumed" [ OUT, NULL OKAY ] - number of source bytes
+ *  consumed. if NULL, then all source bytes MUST be consumed
+ *  or an error will be generated.
+ *
+ *  "dst" [ OUT ] and "dst_off" [ IN ] - destination
+ *  buffer bit address
+ *
+ *  "dsize" [ IN ] - size of "dst" in bits, not including "dst_off"
+ *
+ *  "psize" [ OUT ] - resultant packed size in bits
+ *
+ * NB - the implementation may allow packing in place
+ */
+LIB_EXPORT rc_t CC Pack ( uint32_t unpacked, uint32_t packed,
+    const void *src, size_t ssize, size_t *consumed,
+    void *dst, bitsz_t dst_off, bitsz_t dsize, bitsz_t *psize )
+{
+    /* prepare for failure */
+    if ( consumed != NULL )
+        * consumed = 0;
+
+    /* validate output param */
+    if ( psize == NULL )
+        return RC ( rcXF, rcBuffer, rcPacking, rcParam, rcNull );
+    * psize = 0;
+
+    /* require power of 2 with value between 8 and 64 */
+    if ( ( ( unpacked - 1 ) & unpacked ) != 0 ||
+         unpacked < 8 || unpacked > 64 )
+        return RC ( rcXF, rcBuffer, rcPacking, rcParam, rcInvalid );
+
+    /* validate remaining params */
+    if ( unpacked < packed )
+        return RC ( rcXF, rcBuffer, rcPacking, rcParam, rcInvalid );
+
+    if ( packed == 0 )
+        return RC ( rcXF, rcBuffer, rcPacking, rcParam, rcInvalid );
+
+    if ( ssize == 0 )
+        return 0;
+
+    if ( src == NULL )
+        return RC ( rcXF, rcBuffer, rcPacking, rcParam, rcNull );
+
+    /* detect a byte size so large it can't be converted to bits */
+    if ( ( ssize & ( ( size_t ) 7 << ( sizeof ssize * 8 - 3 ) ) ) != 0 )
+        return RC ( rcXF, rcBuffer, rcPacking, rcBuffer, rcExcessive );
+
+    /* required destination buffer size */
+    * psize = ( ( ssize << 3 ) / unpacked ) * packed;
+
+    if ( dsize < * psize )
+    {
+        if ( consumed == NULL )
+            return RC ( rcXF, rcBuffer, rcPacking, rcBuffer, rcInsufficient );
+
+        ssize = ( dsize / packed ) * ( unpacked >> 3 );
+        * psize = ( ( ssize << 3 ) / unpacked ) * packed;
+    }
+
+    if ( dst == NULL )
+    {
+        * psize = 0;
+        return RC ( rcXF, rcBuffer, rcPacking, rcParam, rcNull );
+    }
+
+    /* all parameters are validated */
+    dst = & ( ( char* ) dst ) [ dst_off >> 3 ];
+    dst_off &= 7;
+
+    if ( consumed != NULL )
+        * consumed = ssize;
+
+    if ( unpacked == 8 && packed == 8 && dst_off == 0 )
+    {
+        if ( ( const void* ) dst != src )
+            memmove ( dst, src, ssize );
+        return 0;
+    }
+
+    /* TBD - enable packing into existing buffers */
+    if ( dst_off != 0 )
+        return RC ( rcXF, rcBuffer, rcPacking, rcOffset, rcUnsupported );
+
+    switch ( unpacked )
+    {
+    case 8:
+        Pack8 ( packed, dst, src, ( uint32_t ) ssize );
+        break;
+    case 16:
+        Pack16 ( packed, dst, src, ( uint32_t ) ( ssize >> 1 ) );
+        break;
+    case 32:
+        Pack32 ( packed, dst, src, ( uint32_t ) ( ssize >> 2 ) );
+        break;
+    case 64:
+        if ( packed > 32 )
+            Pack64b ( packed, dst, src, ( uint32_t ) ( ssize >> 3 ) );
+        else
+            Pack64a ( packed, dst, src, ( uint32_t ) ( ssize >> 3 ) );
+        break;
+    }
+
+    return 0;
+}
diff --git a/libs/klib/pbstree-impl.c b/libs/klib/pbstree-impl.c
new file mode 100644
index 0000000..7b21db3
--- /dev/null
+++ b/libs/klib/pbstree-impl.c
@@ -0,0 +1,847 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "pbstree-priv.h"
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include "maybeswap.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * PBSTreeImpl
+ *  a flattened b-tree
+ */
+
+/* Count
+ *  returns number of elements in b-tree
+ */
+static
+uint32_t CC PBSTreeImplCount ( const PBSTree *self )
+{
+    uint32_t n;
+    GET32 ( n, self -> pt -> num_nodes );
+    return n;
+}
+
+/* Depth
+ *  returns number of layers in b-tree
+ */
+static
+uint32_t CC PBSTreeImplDepth ( const PBSTree *self )
+{
+    uint32_t depth, num_nodes;
+
+    GET32 ( num_nodes, self -> pt -> num_nodes );
+
+    for ( depth = 0; num_nodes != 0; ++ depth )
+        num_nodes >>= 1;
+
+    return depth;
+}
+
+/* Size
+ *  returns the size in bytes
+ *  of the PBSTree image
+ */
+static
+size_t CC PBSTreeImplSize ( const PBSTree *oself )
+{
+    size_t bytes;
+    const P_BSTree *self = oself -> pt;
+    uint32_t data_size, bytes32;
+
+    GET32 ( bytes32, self -> num_nodes );
+    if ( bytes32 == 0 ) /* empty tree */
+        return sizeof self -> num_nodes;
+    else
+        bytes = bytes32;
+
+    GET32 ( data_size, self -> data_size );
+    if ( data_size > 256 )
+    {
+        if ( data_size <= 65536 )
+            bytes += bytes;
+        else
+            bytes <<= 2;
+    }
+
+    return sizeof * self - sizeof self -> data_idx +
+        bytes + data_size;
+}
+
+/* GetNodeData
+ *  finds node data boundaries
+ */
+static
+rc_t CC PBSTreeImplGetNodeData8 ( const PBSTree *oself,
+    const void **addr, size_t *size, uint32_t id )
+{
+    const P_BSTree *self = oself -> pt;
+
+    uint32_t num_nodes;
+    const uint8_t *data_start;
+    uint32_t off, end;
+
+    GET32 ( num_nodes, self -> num_nodes );
+    GET32 ( end, self -> data_size );
+
+    if ( id == 0 )
+        return RC ( rcCont, rcTree, rcAccessing, rcId, rcNull );
+    if ( id > num_nodes )
+        return RC ( rcCont, rcTree, rcAccessing, rcId, rcNotFound );
+
+    data_start = ( const uint8_t* )
+      & self -> data_idx . v8 [ num_nodes ];
+    off = self -> data_idx . v8 [ id - 1 ];
+    if ( id != num_nodes )
+      end = self -> data_idx . v8 [ id ];
+
+    * addr = & data_start [ off ];
+    * size = end - off;
+    return 0;
+}
+
+static
+rc_t CC PBSTreeImplGetNodeData16 ( const PBSTree *oself,
+    const void **addr, size_t *size, uint32_t id )
+{
+    const P_BSTree *self = oself -> pt;
+
+    uint32_t num_nodes, end;
+    const uint8_t *data_start;
+    uint16_t off;
+
+    GET32 ( num_nodes, self -> num_nodes );
+    GET32 ( end, self -> data_size );
+
+    if ( id == 0 )
+        return RC ( rcCont, rcTree, rcAccessing, rcId, rcNull );
+    if ( id > num_nodes )
+        return RC ( rcCont, rcTree, rcAccessing, rcId, rcNotFound );
+
+    data_start = ( const uint8_t* )
+      & self -> data_idx . v16 [ num_nodes ];
+    GET16 ( off, self -> data_idx . v16 [ id - 1 ] );
+    if ( id != num_nodes )
+    {
+      uint16_t end16;
+      GET16 ( end16, self -> data_idx . v16 [ id ] );
+      end = end16;
+    }
+
+    * addr = & data_start [ off ];
+    * size = end - off;
+    return 0;
+}
+
+static
+rc_t CC PBSTreeImplGetNodeData32 ( const PBSTree *oself,
+    const void **addr, size_t *size, uint32_t id )
+{
+    const P_BSTree *self = oself -> pt;
+
+    uint32_t num_nodes;
+    const uint8_t *data_start;
+    uint32_t off, end;
+
+    GET32 ( num_nodes, self -> num_nodes );
+    GET32 ( end, self -> data_size );
+
+    if ( id == 0 )
+        return RC ( rcCont, rcTree, rcAccessing, rcId, rcNull );
+    if ( id > num_nodes )
+        return RC ( rcCont, rcTree, rcAccessing, rcId, rcNotFound );
+
+    data_start = ( const uint8_t* )
+      & self -> data_idx . v32 [ num_nodes ];
+    GET32 ( off, self -> data_idx . v32 [ id - 1 ] );
+    if ( id != num_nodes )
+      GET32 ( end, self -> data_idx . v32 [ id ] );
+
+    * addr = & data_start [ off ];
+    * size = end - off;
+    return 0;
+}
+
+/* Find
+ *  find an object within tree
+ *  "cmp" function returns equivalent of "item" - "n"
+ */
+static
+uint32_t CC PBSTreeImplFind8 ( const PBSTree *self, PBSTNode *n, const void *item,
+    int ( CC * cmp ) ( const void *item, const PBSTNode *n, void * data ), void * data )
+{
+    const P_BSTree *pt = self -> pt;
+    uint32_t right;
+    GET32 ( right, pt -> num_nodes );
+    if ( right != 0 )
+    {
+        int diff;
+        const uint8_t *data_start;
+        uint32_t off, end;
+        uint32_t id, left = 1;
+        uint32_t max_right = right;
+
+        GET32 ( end, pt -> data_size );
+	data_start = & pt -> data_idx . v8 [ right ];
+	
+	do
+	  {
+	    id = ( left + right ) >> 1;
+	    off = pt -> data_idx . v8 [ id - 1 ];
+	    n -> id = id;
+	    n -> data . addr = & data_start [ off ];
+	    if ( id == max_right )
+	      n -> data . size = end - off;
+	    else
+	      n -> data . size = pt -> data_idx . v8 [ id ] - off;
+	    diff = ( * cmp ) ( item, n, data );
+	    if ( diff == 0 )
+	      return id;
+	    if ( diff < 0 )
+	      right = id - 1;
+	    else
+	      left = id + 1;
+	  }
+	while ( left <= right );
+    }
+
+    n -> data . addr = NULL;
+    n -> data . size = 0;
+    return n -> id = 0;
+}
+
+static
+uint32_t CC PBSTreeImplFind16 ( const PBSTree *self, PBSTNode *n, const void *item,
+    int ( CC * cmp ) ( const void *item, const PBSTNode *n, void * data ), void * data )
+{
+    const P_BSTree *pt = self -> pt;
+    uint32_t right;
+    GET32 ( right, pt -> num_nodes );
+    if ( right != 0 )
+    {
+        int diff;
+        const uint8_t *data_start;
+        uint32_t end;
+        uint32_t id, left = 1;
+        uint32_t max_right = right;
+        uint16_t off;
+
+        GET32 ( end, pt -> data_size );
+	data_start = ( const uint8_t* )
+	  & pt -> data_idx . v16 [ right ];
+	
+	do
+	  {
+	    id = ( left + right ) >> 1;
+	    GET16 ( off, pt -> data_idx . v16 [ id - 1 ] );
+	    n -> id = id;
+	    n -> data . addr = & data_start [ off ];
+	    if ( id == max_right )
+	      n -> data . size = end - off;
+	    else
+	    {
+	      uint16_t size;
+	      GET16 ( size, pt -> data_idx . v16 [ id ] );
+	      n -> data . size = size - off;
+	    }
+	    diff = ( * cmp ) ( item, n, data );
+	    if ( diff == 0 )
+	      return id;
+	    if ( diff < 0 )
+	      right = id - 1;
+	    else
+	      left = id + 1;
+	  }
+	while ( left <= right );
+    }
+
+    n -> data . addr = NULL;
+    n -> data . size = 0;
+    return n -> id = 0;
+}
+
+static
+uint32_t CC PBSTreeImplFind32 ( const PBSTree *self, PBSTNode *n, const void *item,
+    int ( CC * cmp ) ( const void *item, const PBSTNode *n, void * data ), void * data )
+{
+    const P_BSTree *pt = self -> pt;
+    uint32_t right;
+    GET32 ( right, pt -> num_nodes );
+    if ( right != 0 )
+    {
+        int diff;
+        const uint8_t *data_start;
+        uint32_t off, end;
+        uint32_t id, left = 1;
+        uint32_t max_right = right;
+
+        GET32 ( end, pt -> data_size );
+	data_start = ( const uint8_t* )
+	  & pt -> data_idx . v32 [ right ];
+	
+	do
+	  {
+	    id = ( left + right ) >> 1;
+	    GET32 ( off, pt -> data_idx . v32 [ id - 1 ] );
+	    n -> id = id;
+	    n -> data . addr = & data_start [ off ];
+	    if ( id == max_right )
+	      n -> data . size = end - off;
+	    else
+	    {
+	      GET32 ( n -> data . size, pt -> data_idx . v32 [ id ] );
+	      n -> data . size -= off;
+	    }
+	    diff = ( * cmp ) ( item, n, data );
+	    if ( diff == 0 )
+	      return id;
+	    if ( diff < 0 )
+	      right = id - 1;
+	    else
+	      left = id + 1;
+	  }
+	while ( left <= right );
+    }
+
+    n -> data . addr = NULL;
+    n -> data . size = 0;
+    return n -> id = 0;
+}
+
+/* ForEach
+ *  executes a function on each tree element
+ */
+static
+void CC PBSTreeImplForEach8 ( const PBSTree *self, bool reverse,
+    void ( CC * f ) ( PBSTNode *n, void *data ), void *data )
+{
+    const P_BSTree *pt = self -> pt;
+    uint32_t num_nodes;
+    GET32 ( num_nodes, pt -> num_nodes );
+    if ( num_nodes != 0 )
+    {
+        PBSTNode n;
+        uint32_t id;
+        uint32_t off, end;
+        const uint8_t *data_start;
+
+        GET32 ( end, pt -> data_size );
+
+	data_start = & pt -> data_idx . v8 [ num_nodes ];
+	
+	if ( ! reverse )
+	  {
+	    for ( off = pt -> data_idx . v8 [ 0 ],
+		    id = 1; id < num_nodes; off = end, ++ id )
+	      {
+		end = pt -> data_idx . v8 [ id ];
+		n . internal = pt;
+		n . id = id;
+		n . data . addr = & data_start [ off ];
+		n . data . size = end - off;
+		( * f ) ( & n, data );
+	      }
+	    
+	    GET32 ( end, pt -> data_size );
+	  }
+	
+	off = pt -> data_idx . v8 [ num_nodes - 1 ];
+	n . internal = pt;
+	n . id = num_nodes;
+	n . data . addr = & data_start [ off ];
+	n . data . size = end - off;
+	( * f ) ( & n, data );
+	
+	if ( reverse )
+	  {
+	    for ( end = off, id = num_nodes - 1; id > 0; end = off, -- id )
+	      {
+		off = pt -> data_idx . v8 [ id - 1 ];
+		n . internal = pt;
+		n . id = id;
+		n . data . addr = & data_start [ off ];
+		n . data . size = end - off;
+		( * f ) ( & n, data );
+	      }
+	  }
+    }
+}
+
+static
+void CC PBSTreeImplForEach16 ( const PBSTree *self, bool reverse,
+    void ( CC * f ) ( PBSTNode *n, void *data ), void *data )
+{
+    const P_BSTree *pt = self -> pt;
+    uint32_t num_nodes;
+    GET32 ( num_nodes, pt -> num_nodes );
+    if ( num_nodes != 0 )
+    {
+        PBSTNode n;
+        uint32_t id, end;
+        uint16_t off;
+        const uint8_t *data_start;
+
+        GET32 ( end, pt -> data_size );
+
+	data_start = ( const uint8_t* )
+	  & pt -> data_idx . v16 [ num_nodes ];
+	
+	if ( ! reverse )
+	  {
+	    GET16 ( off, pt -> data_idx . v16 [ 0 ] );
+	    for ( id = 1; id < num_nodes; off = end, ++ id )
+	      {
+		uint16_t end16;
+		GET16 ( end16, pt -> data_idx . v16 [ id ] );
+		end = end16;
+		n . internal = pt;
+		n . id = id;
+		n . data . addr = & data_start [ off ];
+		n . data . size = end - off;
+		( * f ) ( & n, data );
+	      }
+	    
+	    GET32 ( end, pt -> data_size );
+	  }
+	
+	GET16 ( off, pt -> data_idx . v16 [ num_nodes - 1 ] );
+	n . internal = pt;
+	n . id = num_nodes;
+	n . data . addr = & data_start [ off ];
+	n . data . size = end - off;
+	( * f ) ( & n, data );
+        
+	if ( reverse )
+	  {
+	    for ( end = off, id = num_nodes - 1; id > 0; end = off, -- id )
+	      {
+		GET16 ( off, pt -> data_idx . v16 [ id - 1 ] );
+		n . internal = pt;
+		n . id = id;
+		n . data . addr = & data_start [ off ];
+		n . data . size = end - off;
+		( * f ) ( & n, data );
+	      }
+	  }
+    }
+}
+
+static
+void CC PBSTreeImplForEach32 ( const PBSTree *self, bool reverse,
+    void ( CC * f ) ( PBSTNode *n, void *data ), void *data )
+{
+    const P_BSTree *pt = self -> pt;
+    uint32_t num_nodes;
+    GET32 ( num_nodes, pt -> num_nodes );
+    if ( num_nodes != 0 )
+    {
+        PBSTNode n;
+        uint32_t id;
+        uint32_t off, end;
+        const uint8_t *data_start;
+
+        GET32 ( end, pt -> data_size );
+
+	data_start = ( const uint8_t* )
+	  & pt -> data_idx . v32 [ num_nodes ];
+	
+	if ( ! reverse )
+	  {
+	    GET32 ( off, pt -> data_idx . v32 [ 0 ] );
+	    for ( id = 1; id < num_nodes; off = end, ++ id )
+	      {
+		GET32( end, pt -> data_idx . v32 [ id ] );
+		n . internal = pt;
+		n . id = id;
+		n . data . addr = & data_start [ off ];
+		n . data . size = end - off;
+		( * f ) ( & n, data );
+	      }
+                
+	    GET32 ( end, pt -> data_size );
+	  }
+
+	GET32 ( off, pt -> data_idx . v32 [ num_nodes - 1 ] );
+	n . internal = pt;
+	n . id = num_nodes;
+	n . data . addr = & data_start [ off ];
+	n . data . size = end - off;
+	( * f ) ( & n, data );
+
+	if ( reverse )
+	  {
+	    for ( end = off, id = num_nodes - 1; id > 0; end = off, -- id )
+	      {
+		GET32 ( off, pt -> data_idx . v32 [ id - 1 ] );
+		n . internal = pt;
+		n . id = id;
+		n . data . addr = & data_start [ off ];
+		n . data . size = end - off;
+		( * f ) ( & n, data );
+	      }
+	  }
+    }
+}
+
+/* DoUntil
+ *  executes a function on each element
+ *  until the function returns true
+ */
+static
+bool CC PBSTreeImplDoUntil8 ( const PBSTree *self, bool reverse,
+    bool ( CC * f ) ( PBSTNode *n, void *data ), void *data )
+{
+    const P_BSTree *pt = self -> pt;
+    uint32_t num_nodes;
+    GET32 ( num_nodes, pt -> num_nodes );
+    if ( num_nodes != 0 )
+    {
+        PBSTNode n;
+        uint32_t id;
+        uint32_t off, end;
+        const uint8_t *data_start;
+
+        GET32 ( end, pt -> data_size );
+
+        data_start = & pt -> data_idx . v8 [ num_nodes ];
+	
+        if ( ! reverse )
+        {
+            for ( off = pt -> data_idx . v8 [ 0 ],
+                  id = 1; id < num_nodes; off = end, ++ id )
+            {
+                end = pt -> data_idx . v8 [ id ];
+                n . internal = pt;
+                n . id = id;
+                n . data . addr = & data_start [ off ];
+                n . data . size = end - off;
+                if ( ( * f ) ( & n, data ) )
+                    return true;
+            }
+	    
+            GET32 ( end, pt -> data_size );
+        }
+
+        off = pt -> data_idx . v8 [ num_nodes - 1 ];
+        n . internal = pt;
+        n . id = num_nodes;
+        n . data . addr = & data_start [ off ];
+        n . data . size = end - off;
+        if ( ( * f ) ( & n, data ) )
+            return true;
+
+        if ( reverse )
+        {
+            for ( end = off, id = num_nodes - 1; id > 0; end = off, -- id )
+            {
+                off = pt -> data_idx . v8 [ id - 1 ];
+                n . internal = pt;
+                n . id = id;
+                n . data . addr = & data_start [ off ];
+                n . data . size = end - off;
+                if ( ( * f ) ( & n, data ) )
+                    return true;
+            }
+        }
+    }
+
+    return 0;
+}
+
+static
+bool CC PBSTreeImplDoUntil16 ( const PBSTree *self, bool reverse,
+    bool ( CC * f ) ( PBSTNode *n, void *data ), void *data )
+{
+    const P_BSTree *pt = self -> pt;
+    uint32_t num_nodes;
+    GET32 ( num_nodes, pt -> num_nodes );
+    if ( num_nodes != 0 )
+    {
+        PBSTNode n;
+        uint32_t id, end;
+        uint16_t off;
+        const uint8_t *data_start;
+
+        GET32 ( end, pt -> data_size );
+
+        data_start = ( const uint8_t* )
+            & pt -> data_idx . v16 [ num_nodes ];
+            
+        if ( ! reverse )
+        {
+            GET16 ( off, pt -> data_idx . v16 [ 0 ] );
+            for ( id = 1; id < num_nodes; off = end, ++ id )
+            {
+                uint16_t end16;
+                GET16 ( end16, pt -> data_idx . v16 [ id ] );
+                end = end16;
+                n . internal = pt;
+                n . id = id;
+                n . data . addr = & data_start [ off ];
+                n . data . size = end - off;
+                if ( ( * f ) ( & n, data ) )
+                    return true;
+            }
+                
+            GET32 ( end, pt -> data_size );
+        }
+
+        GET16 ( off, pt -> data_idx . v16 [ num_nodes - 1 ] );
+        n . internal = pt;
+        n . id = num_nodes;
+        n . data . addr = & data_start [ off ];
+        n . data . size = end - off;
+        if ( ( * f ) ( & n, data ) )
+            return true;
+            
+        if ( reverse )
+        {
+            for ( end = off, id = num_nodes - 1; id > 0; end = off, -- id )
+            {
+                GET16 ( off, pt -> data_idx . v16 [ id - 1 ] );
+                n . internal = pt;
+                n . id = id;
+                n . data . addr = & data_start [ off ];
+                n . data . size = end - off;
+                if ( ( * f ) ( & n, data ) )
+                    return true;
+            }
+        }
+    }
+    return 0;
+}
+
+static
+bool CC PBSTreeImplDoUntil32 ( const PBSTree *self, bool reverse,
+    bool ( CC * f ) ( PBSTNode *n, void *data ), void *data )
+{
+    const P_BSTree *pt = self -> pt;
+    uint32_t num_nodes;
+    GET32 ( num_nodes, pt -> num_nodes );
+    if ( num_nodes != 0 )
+    {
+        PBSTNode n;
+        uint32_t id;
+        uint32_t off, end;
+        const uint8_t *data_start;
+
+        GET32 ( end, pt -> data_size );
+
+        data_start = ( const uint8_t* )
+            & pt -> data_idx . v32 [ num_nodes ];
+            
+        if ( ! reverse )
+        {
+            GET32 ( off, pt -> data_idx . v32 [ 0 ] );
+            for ( id = 1; id < num_nodes; off = end, ++ id )
+            {
+                GET32 ( end, pt -> data_idx . v32 [ id ] );
+                n . internal = pt;
+                n . id = id;
+                n . data . addr = & data_start [ off ];
+                n . data . size = end - off;
+                if ( ( * f ) ( & n, data ) )
+                    return true;
+            }
+                
+            GET32 ( end, pt -> data_size );
+        }
+            
+        GET32 ( off, pt -> data_idx . v32 [ num_nodes - 1 ] );
+        n . internal = pt;
+        n . id = num_nodes;
+        n . data . addr = & data_start [ off ];
+        n . data . size = end - off;
+        if ( ( * f ) ( & n, data ) )
+            return true;
+            
+        if ( reverse )
+        {
+            for ( end = off, id = num_nodes - 1; id > 0; end = off, -- id )
+            {
+                GET32 ( off, pt -> data_idx . v32 [ id - 1 ] );
+                n . internal = pt;
+                n . id = id;
+                n . data . addr = & data_start [ off ];
+                n . data . size = end - off;
+                if ( ( * f ) ( & n, data ) )
+                    return true;
+            }
+        }
+    }
+
+    return 0;
+}
+
+/* Whack
+ *  whacks PBSTree object
+ *  does not free memory reference
+ */
+static
+void CC PBSTreeImplWhack ( PBSTree *self )
+{
+    free ( self );
+}
+
+
+static PBSTree_vt_v1 vtPBSTreeImpl8 =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* required methods */
+    PBSTreeImplWhack,
+    PBSTreeImplCount,
+    PBSTreeImplDepth,
+    PBSTreeImplSize,
+    PBSTreeImplGetNodeData8,
+    PBSTreeImplFind8,
+    PBSTreeImplForEach8,
+    PBSTreeImplDoUntil8
+};
+
+static PBSTree_vt_v1 vtPBSTreeImpl16 =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* required methods */
+    PBSTreeImplWhack,
+    PBSTreeImplCount,
+    PBSTreeImplDepth,
+    PBSTreeImplSize,
+    PBSTreeImplGetNodeData16,
+    PBSTreeImplFind16,
+    PBSTreeImplForEach16,
+    PBSTreeImplDoUntil16
+};
+
+static PBSTree_vt_v1 vtPBSTreeImpl32 =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* required methods */
+    PBSTreeImplWhack,
+    PBSTreeImplCount,
+    PBSTreeImplDepth,
+    PBSTreeImplSize,
+    PBSTreeImplGetNodeData32,
+    PBSTreeImplFind32,
+    PBSTreeImplForEach32,
+    PBSTreeImplDoUntil32
+};
+
+
+/* GetVTable
+ */
+static
+PBSTree_vt * CC PBSTreeImplGetVTable ( const P_BSTree *pt )
+{
+    uint32_t data_size;
+    GET32 ( data_size, pt -> data_size );
+    if ( data_size <= 256 )
+      return (PBSTree_vt *) & vtPBSTreeImpl8;
+    if ( data_size <= 65536 )
+      return (PBSTree_vt *) & vtPBSTreeImpl16;
+    return (PBSTree_vt *) & vtPBSTreeImpl32;
+}
+
+
+/* CheckPersisted
+ *  check persisted image for apparent correctness
+ */
+static
+rc_t CC PBSTreeImplCheckPersisted ( const P_BSTree *pt, size_t size )
+{
+    uint32_t num_nodes;
+
+    if ( pt == NULL)
+        return RC ( rcCont, rcTree, rcConstructing, rcParam, rcNull );
+    if ( size == 0 )
+        return 0;
+    if ( size < sizeof pt -> num_nodes )
+        return RC ( rcCont, rcTree, rcConstructing, rcData, rcInvalid );
+
+    GET32 ( num_nodes, pt -> num_nodes );
+    if ( num_nodes > 0 )
+    {
+        uint32_t data_size;
+        const uint8_t *end, *data_start;
+
+        GET32 ( data_size, pt -> data_size );
+        if ( size < sizeof * pt || data_size == 0 )
+            return RC ( rcCont, rcTree, rcConstructing, rcData, rcIncomplete );
+
+        end = ( const uint8_t* ) pt + size;
+
+        if ( data_size <= 256 )
+            data_start = & pt -> data_idx . v8 [ num_nodes ];
+        else  if ( data_size <= 65536 )
+        {
+            data_start = ( const uint8_t* )
+                & pt -> data_idx . v16 [ num_nodes ];
+        }
+        else
+        {
+            data_start = ( const uint8_t* )
+                & pt -> data_idx . v32 [ num_nodes ];
+        }
+        
+        if ( & data_start [ data_size ] > end )
+            return RC ( rcCont, rcTree, rcConstructing, rcData, rcCorrupt );
+    }
+    
+    return 0;
+}
+
+/* PBSTreeMake
+ *  make a PBSTree structure
+ *  the memory reference passed in is borrowed
+ */
+#if SWAP_PERSISTED
+#define PBSTREEMAKE PBSTreeMakeSwapped
+#else
+#define PBSTREEMAKE PBSTreeMakeNative
+#endif
+
+rc_t PBSTREEMAKE ( PBSTree *pt, const void *addr, size_t size )
+{
+    rc_t rc = PBSTreeImplCheckPersisted ( addr, size );
+    if ( rc == 0 )
+    {
+        PBSTree_vt *vt = PBSTreeImplGetVTable ( addr );
+        rc = PBSTreeInit ( pt, vt, addr );
+    }
+    return rc;
+}
diff --git a/libs/klib/pbstree-native.c b/libs/klib/pbstree-native.c
new file mode 100644
index 0000000..9eb937e
--- /dev/null
+++ b/libs/klib/pbstree-native.c
@@ -0,0 +1,30 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#undef SWAP_PERSISTED
+#define SWAP_PERSISTED 0
+#include "pbstree-impl.c"
+#undef SWAP_PERSISTED
diff --git a/libs/klib/pbstree-priv.h b/libs/klib/pbstree-priv.h
new file mode 100644
index 0000000..4a5b0ae
--- /dev/null
+++ b/libs/klib/pbstree-priv.h
@@ -0,0 +1,680 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_pbstree_priv_
+#define _h_pbstree_priv_
+
+#ifndef _h_klib_pbstree_
+#include <klib/pbstree.h>
+#endif
+
+#ifndef _h_klib_ptrie_
+#include <klib/ptrie.h>
+#endif
+
+#include <endian.h>
+
+
+#define RECORD_HDR_IDX   1
+#define RECORD_HDR_DEPTH 1
+#define EXTENDED_PTRIE   1
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * P_BSTree
+ *  persisted binary search tree
+ *
+ *  in memory, the tree is built from nodes with 3 pointers. this
+ *  arrangement allows parent identification, left & right child
+ *  identification, as well as leaf node indication.
+ *
+ *  when persisted, the tree nodes are identified by index integer.
+ *  this integer may be 8, 16 or 32 bits as determined by the node count.
+ */
+typedef struct P_BSTree P_BSTree;
+struct P_BSTree
+{
+    /* a node count - if zero, then the structure ends */
+    uint32_t num_nodes;
+
+    /* the total size of auxiliary data */
+    uint32_t data_size;
+
+    /* offsets relative to & data_idx [ num_nodes ] */
+    union
+    {
+        uint8_t v8 [ 4 ];
+        uint16_t v16 [ 2 ];
+        uint32_t v32 [ 1 ];
+    } data_idx;
+
+#if 0
+    uint8_t data [ data_size ];
+#endif
+};
+
+
+/*--------------------------------------------------------------------------
+ * PBSTree_vt
+ *  versioned message dispatch table
+ */
+#ifndef PBSTREE_IMPL
+#define PBSTREE_IMPL PBSTree
+#endif
+
+typedef struct PBSTree_vt_v1 PBSTree_vt_v1;
+struct PBSTree_vt_v1
+{
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    void ( CC * destroy ) ( PBSTREE_IMPL *self );
+    uint32_t ( CC * count ) ( const PBSTREE_IMPL *self );
+    uint32_t ( CC * depth ) ( const PBSTREE_IMPL *self );
+    size_t ( CC * size ) ( const PBSTREE_IMPL *self );
+    rc_t ( CC * get_node_data ) ( const PBSTREE_IMPL *self,
+        const void **addr, size_t *size, uint32_t id );
+    uint32_t ( CC * find ) (  const PBSTREE_IMPL *self, PBSTNode *rtn,
+        const void *item, int ( CC * cmp ) ( const void*, const PBSTNode* , void* ), void *data );
+    void ( CC * for_each ) ( const PBSTREE_IMPL *self, bool reverse,
+        void ( CC * f ) ( PBSTNode*, void* ), void *data );
+    bool ( CC * do_until ) ( const PBSTREE_IMPL *self, bool reverse,
+        bool ( CC * f ) ( PBSTNode*, void* ), void *data );
+    /* end minor version == 0 */
+};
+
+/* latest major version */
+#define PBSTREE_LATEST 1
+
+typedef union PBSTree_vt PBSTree_vt;
+union PBSTree_vt
+{
+    PBSTree_vt_v1 v1;
+};
+
+/*--------------------------------------------------------------------------
+ * PBSTree
+ *  handle to persisted binary search tree
+ */
+struct PBSTree
+{
+    const PBSTree_vt *vt;
+    const P_BSTree *pt;
+};
+
+
+/* Make
+ *  swapped and native versions
+ *  take a pre-allocated but uninitialized PBSTree structure
+ */
+rc_t PBSTreeMakeNative ( PBSTree *pt, const void *addr, size_t size );
+rc_t PBSTreeMakeSwapped ( PBSTree *pt, const void *addr, size_t size );
+
+
+/* Init
+ *  initialize the parent class
+ */
+rc_t PBSTreeInit ( PBSTree *self, const PBSTree_vt *vt, const P_BSTree *pt );
+
+
+/* PBSTreeGetNodeData
+ *  finds node data boundaries
+ */
+rc_t PBSTreeGetNodeData ( const PBSTree *self,
+    const void **addr, size_t *size, uint32_t id );
+
+/* PBSTreeDump
+ *  dumps a persisted binary search tree
+ *
+ *  "name" [ IN, NULL OKAY ] - optional tree name
+ *
+ *  "stdio_file" [ IN ] - an output FILE* opaquely typed to avoid
+ *  requiring an include of stdio.h
+ *
+ *  "indent_level" [ IN ] - the indent tabbing amount for output
+ *  the implementation uses a tab setting of 2 spaces
+ *
+ *  "dump_node" [ IN, NULL OKAY ] and "data" [ IN ] - an optional
+ *  node dumping function and associated data
+ */
+void PBSTreeDump ( const PBSTree *self, const char *name,
+    void *stdio_file, uint32_t indent_level,
+    void ( CC * dump_node ) ( const void *addr, size_t size, void *stdio_file,
+        uint32_t indent_level, void *data ), void *data );
+
+/* GetIndentString
+ *  returns a string of spaces for indentation
+ */
+const char *GetIndentString ( uint32_t indent_level, uint32_t indent_tab );
+
+
+/*--------------------------------------------------------------------------
+ * P_TTrans
+ * PTTrans
+ *  the index is represented as a min-sized uint32_t,
+ *  the child transitions are represented by two parallel
+ *  sequences described below, and data values have an in-line
+ *  PTBTree.
+ */
+enum
+{
+#if RECORD_HDR_IDX
+    /* transition index from parent to here */
+    pttHdrIdx,
+#endif
+#if RECORD_HDR_DEPTH
+    /* tree depth of node, i.e. transitions from root */
+    pttHdrDepth,
+#endif
+    /* tcnt from TTrans, meaning the number of non-terminals */
+    pttHdrTransCnt,
+
+    /* zero if child array was NULL, or
+       the number of indicies in "idx" array
+       beyond the header values */
+    pttHdrIdxCnt,
+
+    /* the end of "idx" if cnt is zero */
+    pttHdrNullEnd,
+
+    /* the number of sequence entries in "idx",
+       where an entry is either a single index
+       or an index range, as indicated by "child_seq_type" */
+    pttHdrSeqLen = pttHdrNullEnd,
+
+    /* the number of entries in "child" array */
+    pttHdrChildCnt,
+
+    /* index of the last header */
+    pttLastHdr = pttHdrChildCnt,
+
+    /* index of the first entry in "idx" */
+    pttFirstIdx
+};
+
+typedef struct P_TTrans P_TTrans;
+struct P_TTrans
+{
+    /* the variant selected for idx depends upon the recorded
+       character set size, and is typically 8 bit.
+
+       idx [ pttHdrIdx ]      => transition index from parent,
+                                 i.e. character code
+       idx [ pttHdrDepth ]    => node depth
+       idx [ pttHdrTransCnt ] => transition count
+       idx [ pttIdxCnt ]      => index count, meaning the
+                                 dimension of "idx".
+
+       if idx . variant [ pttIdxCnt ] is zero, then the P_TTrans
+       child transition information is skipped, i.e. there is nothing
+       corresponding to the "child" array in a TTrans.
+
+       idx [ pttHdrSeqLen ]   => sequence length
+
+       if the child array exists, the index sequence starts
+       at offset pttFirstIdx into idx, due to the header information. */
+
+    union
+    {
+        uint8_t v8 [ 4 ];
+        uint16_t v16 [ 2 ];
+        uint32_t v32 [ 1 ];
+
+    } idx;
+
+    /* from this point forward, the structure members have calculated offsets */
+#if 0
+
+    /* transition array sequence type bits
+       indexed as: bits [ i / 8 ] & ( 1 << ( i % 8 ) )
+
+       a "0" indicates a simple { idx, trans } pair, while
+       a "1" indicates an index range { lower, upper } and
+       a trans [] corresponding to the range. the index range
+       is fully closed, i.e. upper is inclusive. */
+
+    uint8_t child_seq_type [ ( idx [ pttHdrSeqLen ] + 7 ) / 8 ];
+
+    /* alignment padding - when finding the location of the
+       "child" array ( if it exists ), it is forced to be aligned
+       to the size of its variant */
+
+    if ( offsetof align1 % sizeof child [ 0 ] != 0 )
+        uint8_t align1 [ sizeof child [ 0 ] - offsetof align1 % sizeof child [ 0 ] ];
+
+    /* if keys are embedded within tree, then record a backtrace
+       link from this P_TTrans to its parent */
+    if ( tt -> ext_keys == false )
+    {
+        union
+        {
+            uint8_t v8;
+            uint16_t v16;
+            uint32_t v32;
+
+        } dad;
+    }
+
+    /* transition ids. the variant selected depends upon
+       the number of transition nodes in the tree */
+
+    if ( idx [ pttHdrIdxCnt ] != 0 )
+    {
+        union
+        {
+            uint8_t v8 [ idx [ pttHdrChildCnt ] ];
+            uint16_t v16 [ idx [ pttHdrChildCnt ] ];
+            uint32_t v32 [ idx [ pttHdrChildCnt ] ];
+            
+        } child;
+    }
+    
+    /* alignment padding */
+    if ( offsetof align2 % sizeof uint32_t != 0 )
+    {
+        /* true or false as to whether to expect vals PBSTree */
+        uint8_t has_vals;
+
+        /* padding */
+        uint8_t align2 [ sizeof uint32_t - 1 - offsetof align2 % sizeof uint32_t ];
+    }
+
+    /* a persisted tree */
+    if ( offsetof align2 % sizeof uint32_t == 0 || has_vals != false )
+        PBSTree vals;
+
+    /* final alignment */
+    if ( offsetof align3 % 4 != 0 )
+        uint8_t align3 [ 4 - offsetof align3 % 4 ];
+#endif
+};
+
+typedef struct PTTrans PTTrans;
+struct PTTrans
+{
+    const PTTrans *back;
+
+    union
+    {
+        const uint8_t *v8;
+        const uint16_t *v16;
+        const uint32_t *v32;
+    } idx;
+
+    const uint8_t *child_seq_type;
+
+    union
+    {
+        const uint8_t *v8;
+        const uint16_t *v16;
+        const uint32_t *v32;
+    } dad;
+
+    union
+    {
+        const uint8_t *v8;
+        const uint16_t *v16;
+        const uint32_t *v32;
+    } child;
+
+    PBSTree _val;
+    const PBSTree *vals;
+
+    uint32_t tid;
+#if ! RECORD_HDR_IDX
+    uint32_t tidx;
+#endif
+#if ! RECORD_HDR_DEPTH
+    uint32_t depth;
+#endif
+    uint32_t tcnt;
+    uint32_t icnt;
+    uint32_t slen;
+    int32_t refcount;
+};
+
+/* PTTransGetIdx
+ */
+#define PTTransGetIdx( self, tt, zidx ) \
+    ( * ( tt ) -> get_idx ) ( self, zidx )
+
+/* PTTransGetIdxAddr
+ */
+#define PTTransGetIdxAddr( self, tt, zidx ) \
+    ( * ( tt ) -> get_idx_addr ) ( self, zidx )
+
+/* PTTransGetDad
+ */
+#define PTTransGetDad( self, tt ) \
+    ( * ( tt ) -> get_dad ) ( self )
+
+/* PTTransAlignDadAddr
+ */
+#define PTTransAlignDadAddr( self, tt ) \
+    ( * ( tt ) -> align_dad_addr ) ( self, ( tt ) -> backtrace )
+
+/* PTTransGetChild
+ */
+#define PTTransGetChild( self, tt, zidx ) \
+    ( * ( tt ) -> get_child ) ( self, zidx )
+
+/* PTTransGetChildAddr
+ */
+#define PTTransGetChildAddr( self, tt, zidx ) \
+    ( * ( tt ) -> get_child_addr ) ( self, zidx )
+
+/* PTTransGetTransCharCode
+ *  get char code of parent to self transition
+ */
+#if RECORD_HDR_IDX
+#define PTTransGetTransCharCode( self, tt ) \
+    PTTransGetIdx ( self, tt, pttHdrIdx )
+#else
+#define PTTransGetTransCharCode( self, tt ) \
+    ( self ) -> tidx
+#endif
+
+/* PTTransGetDepth
+ *  get transition depth
+ */
+#if RECORD_HDR_DEPTH
+#define PTTransGetDepth( self, tt ) \
+    PTTransGetIdx ( self, tt, pttHdrDepth )
+#else
+#define PTTransGetDepth( self, tt ) \
+    ( self ) -> depth
+#endif
+
+/* PTTransForEach
+ */
+void PTTransForEach ( const PTTrans *self, const PTrie *tt,
+    void ( * f ) ( const PTTrans *trans, const PTrie *tt, void *data ), void * data );
+
+/* PTTransDoUntil
+ */
+bool PTTransDoUntil ( const PTTrans *self, const PTrie *tt,
+    bool ( * f ) ( const PTTrans *trans, const PTrie *tt, void *data ), void * data );
+
+/* PTTransWhack
+ */
+void PTTransWhack ( PTTrans *trans );
+
+/* PTTransDump
+ *  takes a FILE* as argument
+ *
+ *  "tt" [ IN ] - the owning PTrie
+ *
+ *  "stdio_file" [ IN ] - an output FILE* opaquely typed to avoid
+ *  requiring an include of stdio.h
+ *
+ *  "indent_level" [ IN ] - the indent tabbing amount for output
+ *  the implementation uses a tab setting of 2 spaces
+ */
+void PTTransDump ( const PTTrans *self , const PTrie *tt,
+    void *stdio_file, uint32_t indent_level,
+    void ( CC * dump_node ) ( const void *addr, size_t size, void *stdio_file,
+        uint32_t indent_level, void *data ), void *data );
+
+
+/*--------------------------------------------------------------------------
+ * P_Trie
+ * PTrie
+ *  persisted TTree
+ */
+typedef struct P_Trie P_Trie;
+struct P_Trie
+{
+    /* the number of transition nodes */
+    uint32_t num_trans;
+
+    /* the number of value nodes */
+    uint32_t num_nodes;
+
+    /* size of all P_TTrans data */
+    uint32_t data_size;
+
+    /* storage characteristics */
+#if 0
+    /* keys are like this, built always as little-endian, first fields lowest */
+    uint16_t ext_keys  : 1;
+    uint16_t backtrace : 1;
+    uint16_t id_coding : 3;
+#if EXTENDED_PTRIE
+    uint16_t unused    : 3;
+#else
+    uint16_t unused    : 11;
+#endif
+#elif EXTENDED_PTRIE
+    uint8_t keys;
+#else
+    uint16_t keys;
+#endif  
+#if EXTENDED_PTRIE
+    uint8_t ext_data_size;
+#endif
+
+    /* character set in indexed order
+       N.B. a character value of 0 means
+       unmapped, and is unlikely but possible */
+    uint16_t width;
+    uint32_t rmap [ 1 ];
+
+#if 0
+    /* P_TTrans index - consists of 4-byte
+       offsets relative to "data" member,
+       i.e. an index of 2 means 8 byte offset */
+    union
+    {
+        uint8_t v8 [ num_trans ];
+        uint16_t v16 [ num_trans ];
+        uint32_t v32 [ num_trans ];
+
+    } trans_idx;
+
+    /* an alignment to keep "data" on 4-byte boundary */
+    if ( ( offsetof align1 & 3 ) != 0 )
+        uint8_t align1 [ 4 - ( offsetof align1 & 3 ) ];
+
+    /* P_TTrans objects */
+    uint32_t data [ ( data_size + 3 ) / 4 ];
+
+#endif
+};
+
+
+/* P_TrieExtKeys
+ */
+#define P_TrieExtKeys( keys ) \
+    ( ( keys ) & 1 )
+
+/* P_TrieBacktrace
+ */
+#define P_TrieBacktrace( keys ) \
+    ( ( keys ) & 2 )
+
+/* P_TrieIdCoding
+ */
+#define P_TrieIdCoding( keys ) \
+    ( ( keys >> 2 ) & 7 )
+
+/* P_TrieSetExtKeys
+ */
+#define P_TrieSetExtKeys( keys, val ) \
+    ( void ) ( ( val ) ? ( ( keys ) |= 1 ) : ( ( keys ) &= ~ 1 ) )
+
+/* P_TrieSetBacktrace
+ */
+#define P_TrieSetBacktrace( keys, val ) \
+    ( void ) ( ( val ) ? ( ( keys ) |= 2 ) : ( ( keys ) &= ~ 2 ) )
+
+/* P_TrieSetIdCoding
+ */
+#define P_TrieSetIdCoding( keys, val ) \
+    ( void ) ( ( keys ) = ( ( keys ) & ~ ( 7 << 2 ) ) | ( ( ( val ) & 7 ) << 2 ) )
+
+
+struct PTrie
+{
+    /* virtual functions on PTTrans */
+    uint32_t ( * get_idx ) ( const PTTrans*, uint32_t idx );
+    const void* ( * get_idx_addr ) ( const PTTrans*, uint32_t idx );
+    uint32_t ( * get_dad ) ( const PTTrans* );
+    const void* ( * align_dad_addr ) ( PTTrans*, bool backtrace );
+    uint32_t ( * get_child ) ( const PTTrans*, uint32_t idx );
+    const void* ( * get_child_addr ) ( const PTTrans*, uint32_t tcnt );
+
+    /* virtual functions on PTrie */
+    size_t ( * get_node_off ) ( const PTrie*, uint32_t idx );
+    uint32_t ( * encode_node_id ) ( const PTrie*,
+        uint32_t tid, uint32_t btid );
+    rc_t ( * decode_node_id ) ( const PTrie*, uint32_t id,
+        uint32_t *tid, uint32_t *btid );
+    uint32_t ( * decode_char_id ) ( const PTrie*, uint32_t id );
+
+    /* P_TTrans index to character map */
+    const uint32_t *_rmap;
+
+    /* P_TTrans offsets */
+    union
+    {
+        const uint8_t *v8;
+        const uint16_t *v16;
+        const uint32_t *v32;
+        const uint64_t *v64;
+    } trans_off;
+
+    /* P_TTrans PTrans objects */
+    union
+    {
+        const uint32_t *v32;
+        const uint64_t *v64;
+    } data;
+
+    /* the number of transition nodes */
+    uint32_t num_trans;
+
+    /* the number of value nodes */
+    uint32_t num_nodes;
+
+    /* size of all P_TTrans data */
+    size_t data_size;
+
+    /* storage characteristics */
+    uint8_t ext_keys;
+    uint8_t backtrace;
+    uint8_t id_coding;
+    uint8_t byteswap;
+
+    /* width of character map & trans array */
+    uint16_t width;
+
+    /* range of UTF-32 input characters */
+    uint32_t first_char;
+    uint32_t last_char;
+
+    /* index of an unmapped character */
+    uint16_t unmapped_idx;
+
+    /* character to index map */
+    uint16_t map [ 1 ];
+};
+
+
+
+/* PTrieGetNodeOff
+ */
+#define PTrieGetNodeOff( self, zidx ) \
+    ( * ( self ) -> get_node_off ) ( self, zidx )
+
+/* PTrieEncodeNodeId
+ */
+#define PTrieEncodeNodeId( self, tid, btid ) \
+    ( * ( self ) -> encode_node_id ) ( self, tid, btid )
+
+/* PTrieDecodeNodeId
+ */
+#define PTrieDecodeNodeId( self, id, tid, btid ) \
+    ( * ( self ) -> decode_node_id ) ( self, id, tid, btid )
+
+/* PTrieDecodeCharId
+ */
+#define PTrieDecodeCharId( self, idx ) \
+    ( * ( self ) -> decode_char_id ) ( self, idx )
+
+
+/* PTrieInitNode
+ *  takes a one-based index
+ */
+rc_t PTrieInitNode ( const PTrie *self, PTTrans *trans, uint32_t idx );
+
+/* PTrieMakeNode
+ *  takes a one-based index
+ */
+rc_t PTrieMakeNode ( const PTrie *self, PTTrans **transp, uint32_t idx );
+
+/* PTrieDump
+ *  takes a FILE* as argument
+ *
+ *  "name" [ IN, NULL OKAY ] - optional ttree name
+ *
+ *  "stdio_file" [ IN ] - an output FILE* opaquely typed to avoid
+ *  requiring an include of stdio.h
+ *
+ *  "indent_level" [ IN ] - the indent tabbing amount for output
+ *  the implementation uses a tab setting of 2 spaces
+ *
+ *  "dump_node" [ IN, NULL OKAY ] and "data" [ IN ] - an optional
+ *  node dumping function and associated data
+ */
+void PTrieDump ( const PTrie *self, const char *name,
+    void *stdio_file, uint32_t indent_level,
+    void ( * dump_node ) ( const void *addr, size_t size, void *stdio_file,
+        uint32_t indent_level, void *data ), void *data );
+
+/* PTrieDumpTrans
+ *  takes a FILE* as argument
+ *
+ *  the indent level is used for hierarchy.
+ *  2 spaces are emitted at the left margin for each level.
+ */
+void PTrieDumpTrans ( const PTrie *self , uint32_t id,
+    void *stdio_file, uint32_t indent_level,
+    void ( * dump_node ) ( const void *addr, size_t size, void *stdio_file,
+        uint32_t indent_level, void *data ), void *data );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_pbstree_priv_ */
diff --git a/libs/klib/pbstree-swapped.c b/libs/klib/pbstree-swapped.c
new file mode 100644
index 0000000..f9a9160
--- /dev/null
+++ b/libs/klib/pbstree-swapped.c
@@ -0,0 +1,30 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#undef SWAP_PERSISTED
+#define SWAP_PERSISTED 1
+#include "pbstree-impl.c"
+#undef SWAP_PERSISTED
diff --git a/libs/klib/pbstree.c b/libs/klib/pbstree.c
new file mode 100644
index 0000000..09f8b9c
--- /dev/null
+++ b/libs/klib/pbstree.c
@@ -0,0 +1,395 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "pbstree-priv.h"
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * PBSTree
+ *  a flattened b-tree
+ */
+
+/* Make
+ *  make a PBSTree structure
+ *  the memory reference passed in is borrowed
+ */
+LIB_EXPORT rc_t CC PBSTreeMake ( PBSTree **ptp, const void *addr, size_t size, bool byteswap )
+{
+    rc_t rc;
+
+    if ( ptp == NULL )
+        rc = RC ( rcCont, rcTree, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( size == 0 )
+            rc = RC ( rcCont, rcTree, rcConstructing, rcData, rcInvalid );
+        else if ( addr == NULL )
+            rc = RC ( rcCont, rcTree, rcConstructing, rcData, rcNull );
+        else
+        {
+            PBSTree *pt = malloc ( sizeof * pt );
+            if ( pt == NULL )
+                rc = RC ( rcCont, rcTree, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = byteswap ?
+                    PBSTreeMakeSwapped ( pt, addr, size ):
+                    PBSTreeMakeNative ( pt, addr, size );
+                if ( rc == 0 )
+                {
+                    * ptp = pt;
+                    return 0;
+                }
+
+                free ( pt );
+            }
+        }
+
+        * ptp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* Init - PROTECTED
+ *  initialize the parent class
+ */
+rc_t PBSTreeInit ( PBSTree *self, const PBSTree_vt *vt, const P_BSTree *pt )
+{
+    if ( self == NULL )
+        return RC ( rcCont, rcTree, rcConstructing, rcSelf, rcNull );
+
+    if ( vt == NULL )
+        return RC ( rcCont, rcTree, rcConstructing, rcInterface, rcNull );
+    if ( vt -> v1 . maj == 0 )
+        return RC ( rcCont, rcTree, rcConstructing, rcInterface, rcInvalid );
+    if ( vt -> v1 . maj > PBSTREE_LATEST )
+        return RC ( rcFS, rcFile, rcConstructing, rcInterface, rcBadVersion );
+
+    if ( pt == NULL )
+        return RC ( rcCont, rcTree, rcConstructing, rcParam, rcNull );
+
+#if _DEBUGGING
+    if ( vt -> v1 . maj == 1 )
+    {
+        /* check v1.1 methods */
+        if ( vt -> v1 . destroy == NULL ||
+             vt -> v1 . count == NULL ||
+             vt -> v1 . depth == NULL ||
+             vt -> v1 . size == NULL ||
+             vt -> v1 . get_node_data == NULL ||
+             vt -> v1 . find == NULL ||
+             vt -> v1 . for_each == NULL ||
+             vt -> v1 . do_until == NULL )
+        return RC ( rcCont, rcTree, rcConstructing, rcInterface, rcNull );
+    }
+#endif
+
+    /* everything is okay */
+    self -> vt = vt;
+    self -> pt = pt;
+    return 0;
+}
+
+
+/* Count
+ *  returns number of elements in b-tree
+ */
+LIB_EXPORT uint32_t CC PBSTreeCount ( const PBSTree *self )
+{
+    if ( self != NULL )
+    {
+        switch ( self -> vt -> v1 . maj )
+        {
+        case 1:
+            return ( * self -> vt -> v1 . count ) ( self );
+        }
+    }
+    return 0;
+}
+
+/* Depth
+ *  returns number of layers in b-tree
+ */
+LIB_EXPORT uint32_t CC PBSTreeDepth ( const PBSTree *self )
+{
+    if ( self != NULL )
+    {
+        switch ( self -> vt -> v1 . maj )
+        {
+        case 1:
+            return ( * self -> vt -> v1 . depth ) ( self );
+        }
+    }
+
+    return 0;
+}
+
+/* Size
+ *  returns the size in bytes
+ *  of the PBSTree image
+ */
+LIB_EXPORT size_t CC PBSTreeSize ( const PBSTree *self )
+{
+    if ( self != NULL )
+    {
+        switch ( self -> vt -> v1 . maj )
+        {
+        case 1:
+            return ( * self -> vt -> v1 . size ) ( self );
+        }
+    }
+
+    return 0;
+}
+
+
+/* GetNodeData - INTERNAL
+ *  finds node data boundaries
+ */
+rc_t PBSTreeGetNodeData ( const PBSTree *self,
+    const void **addr, size_t *size, uint32_t id )
+{
+    assert ( self != NULL );
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . get_node_data ) ( self, addr, size, id );
+    }
+
+    return RC ( rcCont, rcTree, rcAccessing, rcInterface, rcBadVersion );
+}
+
+
+/* GetNode
+ *  gets a PBSTNode from an id
+ *
+ *  "node" [ OUT ] - return parameter for node
+ *
+ *  "id" [ IN ] - a 1-based integer node id
+ *
+ *  return values:
+ *    EINVAL => an invalid parameter was passed
+ *    ENOENT => id out of range
+ */
+LIB_EXPORT rc_t CC PBSTreeGetNode ( const PBSTree *self, PBSTNode *node, uint32_t id )
+{
+    rc_t rc;
+    if ( node == NULL )
+        rc = RC ( rcCont, rcTree, rcAccessing, rcNode, rcNull );
+    else
+    {
+        if ( self == NULL)
+            rc = RC ( rcCont, rcTree, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = PBSTreeGetNodeData ( self,
+                & node -> data . addr, & node -> data . size, id );
+            if ( rc == 0 )
+            {
+                node -> internal = self;
+                node -> id = id;
+                return 0;
+            }
+        }
+
+        node -> data . addr = node -> internal = NULL;
+        node -> data . size = 0;
+        node -> id = 0;
+    }
+    return rc;
+}
+
+/* PBSTreeFind
+ *  find an object within tree
+ *  "cmp" function returns equivalent of "item" - "n"
+ */
+LIB_EXPORT uint32_t CC PBSTreeFind ( const PBSTree *self, PBSTNode *n, const void *item,
+    int ( CC * cmp ) ( const void *item, const PBSTNode *n, void *data ), void *data )
+{
+    PBSTNode buffer;
+
+    if ( n == NULL )
+        n = & buffer;
+
+    n -> internal = self;
+    if ( self != NULL )
+    {
+        switch ( self -> vt -> v1 . maj )
+        {
+        case 1:
+            return ( * self -> vt -> v1 . find ) ( self, n, item, cmp, data );
+        }
+    }
+
+    n -> data . addr = NULL;
+    n -> data . size = 0;
+    return n -> id = 0;
+}
+
+/* PBSTreeForEach
+ *  executes a function on each tree element
+ */
+LIB_EXPORT void CC PBSTreeForEach ( const PBSTree *self, bool reverse,
+    void ( CC * f ) ( PBSTNode *n, void *data ), void *data )
+{
+    if ( self != NULL && f != NULL )
+    {
+        switch ( self -> vt -> v1 . maj )
+        {
+        case 1:
+            ( * self -> vt -> v1 . for_each ) ( self, reverse, f, data );
+            break;
+        }
+    }
+}
+
+/* PBSTreeDoUntil
+ *  executes a function on each element
+ *  until the function returns true
+ */
+LIB_EXPORT bool CC PBSTreeDoUntil ( const PBSTree *self, bool reverse,
+    bool ( CC * f ) ( PBSTNode *n, void *data ), void *data )
+{
+    if ( self != NULL && f != NULL )
+    {
+        switch ( self -> vt -> v1 . maj )
+        {
+        case 1:
+            return ( * self -> vt -> v1 . do_until ) ( self, reverse, f, data );
+        }
+    }
+
+    return false;
+}
+
+/* PBSTreeWhack
+ *  whacks PBSTree object
+ *  does not free memory reference
+ */
+LIB_EXPORT void CC PBSTreeWhack ( PBSTree *self )
+{
+    if ( self != NULL )
+    {
+        switch ( self -> vt -> v1 . maj )
+        {
+        case 1:
+            ( * self -> vt -> v1 . destroy ) ( self );
+            break;
+        }
+    }
+}
+
+
+/*--------------------------------------------------------------------------
+ * PBSTNode
+ *  identifies a node within persisted b-tree
+ */
+
+/* Next
+ *  returns next node id
+ */
+LIB_EXPORT uint32_t CC PBSTNodeNext ( PBSTNode *n )
+{
+    if ( n == NULL )
+        return 0;
+
+    if ( PBSTreeGetNodeData ( n -> internal,
+             & n -> data . addr, & n -> data . size, n -> id + 1 ) )
+        return 0;
+
+    return ++ n -> id;
+}
+
+/* Prev
+ *  returns prev node id
+ */
+LIB_EXPORT uint32_t CC PBSTNodePrev ( PBSTNode *n )
+{
+    if ( n == NULL )
+        return 0;
+
+    if ( PBSTreeGetNodeData ( n -> internal,
+             & n -> data . addr, & n -> data . size, n -> id - 1 ) )
+        return 0;
+
+    return -- n -> id;
+}
+
+/* FindNext
+ *  find next element satisfying criteria
+ */
+LIB_EXPORT uint32_t CC PBSTNodeFindNext ( PBSTNode *n,
+    bool ( CC * f ) ( const PBSTNode *n ) )
+{
+    PBSTNode save;
+
+    if ( n == NULL || f == NULL )
+        return 0;
+
+    save = * n;
+
+    while ( PBSTNodeNext ( n ) )
+    {
+        if ( ( * f ) ( n ) )
+            return n -> id;
+    }
+
+    * n = save;
+    return 0;
+}
+
+/* FindPrev
+ *  find previous element satisfying criteria
+ */
+LIB_EXPORT uint32_t CC PBSTNodeFindPrev ( PBSTNode *n, 
+    bool ( CC * f ) ( const PBSTNode *n ) )
+{
+    PBSTNode save;
+
+    if ( n == NULL || f == NULL )
+        return 0;
+
+    save = * n;
+
+    while ( PBSTNodePrev ( n ) )
+    {
+        if ( ( * f ) ( n ) )
+            return n -> id;
+    }
+
+    * n = save;
+    return 0;
+}
diff --git a/libs/klib/printf.c b/libs/klib/printf.c
new file mode 100644
index 0000000..c104694
--- /dev/null
+++ b/libs/klib/printf.c
@@ -0,0 +1,3540 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/writer.h>
+#include <klib/symbol.h>
+#include <klib/time.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+
+#include "writer-priv.h"
+
+#include <os-native.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <stdio.h>
+#include <assert.h>
+#include <va_copy.h>
+
+/* the number of PrintFmt, PrintArg and String
+   elements to allocate in function-local storage */
+#define LOCAL_FMT_COUNT 64
+
+
+/* for testing purposes - temporarily define this guy */
+#define STDC_COMPATIBILITY 1
+
+/***********************************
+ * OLD PRINTF CODE IS NOW INACTIVE *
+ ***********************************/
+#define USE_OLD_PRINTF 0
+
+/***********************************
+ * OUR OLD BUDDY                   *
+ ***********************************/
+#if WINDOWS
+#undef snprintf
+#define snprintf _snprintf
+#endif
+
+/**************************************
+ * NAMING TRICKS TO HAVE BOTH ON HAND *
+ **************************************/
+#if USE_OLD_PRINTF
+#define old_string_vprintf string_vprintf
+#define old_string_printf string_printf
+#define old_vkfprintf vkfprintf
+#define old_kfprintf kfprintf
+#else
+#define new_string_vprintf string_vprintf
+#define new_string_printf string_printf
+#define new_vkfprintf vkfprintf
+#define new_kfprintf kfprintf
+#endif
+
+/************************************
+ * BEHAVIORS SENSITIVE TO STDC MODE *
+ ************************************/
+#if STDC_COMPATIBILITY
+#define NULL_STRING_TEXT "(null)"
+#else
+#define NULL_STRING_TEXT "NULL"
+#endif
+#define DOUSE_NUM_PREFIX_IF_ZERO              STDC_COMPATIBILITY
+#define KEEP_OCT_PREFIX_IF_ZERO               STDC_COMPATIBILITY
+#define OCTAL_PREFIX_COUNTS_TOWARD_PRECISION  STDC_COMPATIBILITY
+#define HEX_PREFIX_FOLLOWS_CASE               STDC_COMPATIBILITY
+/* Present in 2.3.3 (from SLES 9.3), absent in 2.5 (from CentOS 5.6) */
+#define EMULATE_SMALLINT_EXTENSION_BUG      ( STDC_COMPATIBILITY && defined(__GLIBC__) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 5) ) )
+#define ZERO_PAD_ONLY_NUMBERS               ( !STDC_COMPATIBILITY || defined(__GLIBC__) )
+
+#define USE_LIB_FLOAT 1
+
+static
+size_t string_flush ( char *dst, size_t bsize, const KWrtHandler *flush, rc_t *rc, size_t *total )
+{
+    size_t num_writ, flushed;
+    for ( flushed = 0; flushed < bsize; flushed += num_writ )
+    {
+        * rc = ( * flush -> writer ) ( flush -> data, dst, bsize, & num_writ );
+        if ( * rc != 0 )
+            break;
+        if ( num_writ == 0 )
+            break;
+    }
+
+    if ( * rc == 0 )
+    {
+        * total += flushed;
+        if ( flushed < bsize )
+            memmove ( dst, dst + flushed, bsize - flushed );
+    }
+
+    return bsize - flushed;
+}
+
+static
+rc_t CC string_flush_printf ( char *dst, size_t bsize,
+    const KWrtHandler *flush, size_t *num_writ, const char *fmt, ... );
+
+static
+rc_t string_flush_vprintf ( char *dst, size_t bsize, const KWrtHandler *flush,
+    size_t *num_writ, const char *fmt, va_list args )
+{
+    rc_t rc;
+    size_t sidx, didx, total, sz;
+
+    uint32_t *np;
+    uint32_t u32;
+    int64_t i64;
+    uint64_t u64;
+    double f64;
+#if ! USE_LIB_FLOAT
+    uint64_t frac;
+    double ftmp;
+    uint32_t exponent;
+#endif
+    const char *cp, *end;
+    const String *str;
+    const KSymbol *sym;
+    const KTime *tm;
+
+    char buff [ 256 ];
+    char use_sign, padding;
+    const char *hex_digits;
+    uint32_t i, j, len, digits, min_field_width, max_field_width, precision;
+    bool left_align, comma_separate, have_precision, byte_size, half_size, long_size;
+    bool alternate, date_time_zone;
+#if ! USE_LIB_FLOAT
+    bool trim_trailing_zeros;
+#endif
+
+    if ( fmt == NULL )
+    {
+        rc = RC ( rcText, rcString, rcFormatting, rcParam, rcNull );
+        if ( num_writ != NULL )
+            * num_writ = 0;
+        return rc;
+    }
+
+    if ( fmt [ 0 ] == 0 )
+    {
+        rc = RC ( rcText, rcString, rcFormatting, rcParam, rcEmpty );
+        if ( num_writ != NULL )
+            * num_writ = 0;
+        return rc;
+    }
+
+    if ( dst == NULL )
+    {
+        flush = NULL;
+        bsize = 0;
+    }
+
+    for ( rc = 0, sidx = didx = total = 0; fmt [ sidx ] != 0 && rc == 0; ++ sidx )
+    {
+        /* flush buffer */
+        if ( didx == bsize && flush != NULL )
+        {
+            didx = string_flush ( dst, didx, flush, & rc, & total );
+            if ( rc != 0 )
+                break;
+        }
+
+        /* copy until ending NUL or '%' */
+        if ( fmt [ sidx ] != '%' )
+        {
+            if ( didx < bsize )
+                dst [ didx ] = fmt [ sidx ];
+            ++ didx;
+            continue;
+        }
+
+        /* process escaped '%' */
+        if ( fmt [ ++ sidx ] == '%' )
+        {
+            if ( didx < bsize )
+                dst [ didx ] = '%';
+            ++ didx;
+            continue;
+        }
+
+        digits = 0;
+
+        /* process flags */
+        use_sign = 0;
+        left_align = comma_separate = alternate = false;
+        padding = ' ';
+
+        while ( 1 )
+        {
+            switch ( fmt [ sidx ] )
+            {
+            case '-':
+                left_align = true;
+                padding = ' ';
+                ++ sidx;
+                continue;
+            case '+':
+                use_sign = '+';
+                ++ sidx;
+                continue;
+            case ' ':
+                if ( use_sign != '+' )
+                    use_sign = ' ';
+                ++ sidx;
+                continue;
+            case '0':
+                if ( ! left_align )
+                    padding = '0';
+                ++ sidx;
+                continue;
+            case ',':
+            case '\'':
+                comma_separate = true;
+                ++ sidx;
+                continue;
+            case '#':
+                alternate = true;
+                ++ sidx;
+                continue;
+            }
+
+            break;
+        }
+
+        /* field width */
+        min_field_width = 0;
+        if ( fmt [ sidx ] == '*' )
+        {
+            min_field_width = va_arg ( args, unsigned int );
+            ++ sidx;
+        }
+        else while ( isdigit ( fmt [ sidx ] ) )
+        {
+            min_field_width *= 10;
+            min_field_width += fmt [ sidx ++ ] - '0';
+        }
+
+        /* precision */
+        precision = 0;
+        have_precision = false;
+        if ( fmt [ sidx ] == '.' )
+        {
+            padding = ' ';
+            have_precision = true;
+            if ( fmt [ ++ sidx ] == '*' ) {
+                precision = va_arg ( args, unsigned int );
+                sidx++;
+            } else for ( ; isdigit ( fmt [ sidx ] ); ++ sidx )
+            {
+                precision *= 10;
+                precision += fmt [ sidx ] - '0';
+            }
+        }
+
+        /* storage size */
+        byte_size = half_size = long_size = date_time_zone = false;
+        switch ( fmt [ sidx ] )
+        {
+        case 't':
+            byte_size = true;
+            ++ sidx;
+            break;
+        case 'h':
+            /* this should not be necessary */
+            if ( fmt [  ++ sidx ] != 'h' )
+                half_size = true;
+            else
+            {
+                byte_size = true;
+                ++ sidx;
+            }
+            break;
+        case 'l':
+            long_size = true;
+            ++ sidx;
+            break;
+        case 'z':
+            date_time_zone = true;
+            if ( sizeof ( size_t ) == sizeof ( uint64_t ) )
+                long_size = true;
+            ++ sidx;
+            break;
+        }
+
+        /* format */
+#if ! USE_LIB_FLOAT
+        trim_trailing_zeros = false;
+#endif
+        switch ( fmt [  sidx  ] )
+        {
+        case 'd':
+        case 'i':
+
+            /* retrieve argument as signed integer */
+            if ( byte_size )
+                i64 = ( int8_t ) va_arg ( args, int );
+            else if ( half_size )
+                i64 = ( int16_t ) va_arg ( args, int );
+            else if ( long_size )
+                i64 = va_arg ( args, int64_t );
+            else
+                i64 = va_arg ( args, int32_t );
+
+#if ! STDC_COMPATIBILITY
+            /* detect zero */
+            if ( i64 == 0 )
+                use_sign = 0;
+            else
+#endif
+            /* detect negative */
+            if ( i64 < 0 )
+            {
+                use_sign = '-';
+                i64 = - i64;
+            }
+
+            i = sizeof buff;
+
+#if ! USE_LIB_FLOAT
+        make_signed_integer:
+#endif
+            /* convert to numeral */
+            if ( comma_separate ) for ( -- i, j = 0; ; -- i, ++ j )
+            {
+                if ( j == 3 )
+                {
+                    buff [ -- i ] = ',';
+                    j = 0;
+                }
+                buff [ i ] =  ( i64 % 10 ) + '0';
+                ++ digits;
+                if ( ( i64 /= 10 ) == 0 )
+                    break;
+            }
+            else for ( -- i, digits = 0; ; -- i )
+            {
+                buff [ i ] =  ( i64 % 10 ) + '0';
+                ++ digits;
+                if ( ( i64 /= 10 ) == 0 )
+                    break;
+            }
+
+        insert_integer:
+
+            /* the actual length */
+            len = sizeof buff - i;
+
+            /* test for buffer flush */
+            if ( flush != NULL && didx < bsize )
+            {
+                max_field_width = len;
+                if ( len < precision )
+                    max_field_width = precision;
+                max_field_width += ( use_sign != 0 );
+                if ( max_field_width < min_field_width )
+                    max_field_width = min_field_width;
+                if ( didx + max_field_width > bsize )
+                {
+                    didx = string_flush ( dst, didx, flush, & rc, & total );
+                    if ( rc != 0 )
+                        break;
+                }
+            }
+
+            /* insert left-aligned */
+            if ( left_align )
+            {
+                /* sign */
+                if ( use_sign != 0 )
+                {
+                    if ( didx < bsize )
+                        dst [ didx ] = use_sign;
+                    ++ didx;
+                    ++ len;
+                }
+
+                /* precision */
+                for ( ; digits < precision; ++ didx, ++ len, ++ digits )
+                {
+                    if ( didx < bsize )
+                        dst [ didx ] = '0';
+                }
+
+                /* value */
+                for ( ; i < sizeof buff; ++ didx, ++ i )
+                {
+                    if ( didx < bsize )
+                        dst [ didx ] = buff [ i ];
+                }
+
+                /* padding */
+                for ( ; len < min_field_width; ++ didx, ++ len )
+                {
+                    if ( didx < bsize )
+                        dst [ didx ] = ' ';
+                }
+            }
+            /* insert right-aligned */
+            else
+            {
+                /* remove sign from field width */
+                if ( use_sign != 0 && min_field_width != 0 )
+                    -- min_field_width;
+
+                /* zero padding means issue sign first */
+                if ( use_sign != 0 && padding == '0' )
+                {
+                    if ( didx < bsize )
+                        dst [ didx ] = use_sign;
+                    ++ didx;
+                    use_sign = 0;
+                }
+
+                /* adjust length for precision */
+                if ( precision > digits )
+                    len += precision - digits;
+
+                /* apply padding */
+                for ( ; len < min_field_width; ++ didx, -- min_field_width )
+                {
+                    if ( didx < bsize )
+                        dst [ didx ] = padding;
+                }
+
+                /* sign */
+                if ( use_sign != 0 )
+                {
+                    if ( didx < bsize )
+                        dst [ didx ] = use_sign;
+                    ++ didx;
+                }
+
+                /* precision */
+                for ( ; digits < precision; ++ didx, ++ digits )
+                {
+                    if ( didx < bsize )
+                        dst [ didx ] = '0';
+                }
+
+                /* value */
+                for ( ; i < sizeof buff; ++ didx, ++ i )
+                {
+                    if ( didx < bsize )
+                        dst [ didx ] = buff [ i ];
+                }
+            }
+
+            break;
+
+        case 'u':
+
+            /* retrieve argument as unsigned integer */
+            if ( byte_size )
+                u64 = ( uint8_t ) va_arg ( args, int );
+            else if ( half_size )
+                u64 = ( uint16_t ) va_arg ( args, int );
+            else if ( long_size )
+                u64 = va_arg ( args, uint64_t );
+            else
+                u64 = va_arg ( args, uint32_t );
+
+            /* no sign */
+            use_sign = 0;
+
+            i = sizeof buff - 1;
+
+            /* convert to numeral */
+            if ( comma_separate ) for ( j = digits = 0; ; -- i, ++ j )
+            {
+                if ( j == 3 )
+                {
+                    buff [ -- i ] = ',';
+                    j = 0;
+                }
+                buff [ i ] =  ( u64 % 10 ) + '0';
+                ++ digits;
+                if ( ( u64 /= 10 ) == 0 )
+                    break;
+            }
+            else for ( digits = 0; ; -- i )
+            {
+                buff [ i ] =  ( u64 % 10 ) + '0';
+                ++ digits;
+                if ( ( u64 /= 10 ) == 0 )
+                    break;
+            }
+
+            goto insert_integer;
+
+        case 'p':
+
+            /* retrieve argument as unsigned integer */
+            if ( sizeof ( void* ) == sizeof ( uint32_t ) )
+                u64 = va_arg ( args, uint32_t );
+            else
+                u64 = va_arg ( args, uint64_t );
+
+            goto make_hex_integer;
+
+        case 'x':
+        case 'X':
+
+            /* retrieve argument as unsigned integer */
+            if ( byte_size )
+                u64 = ( uint8_t ) va_arg ( args, int );
+            else if ( half_size )
+                u64 = ( uint16_t ) va_arg ( args, int );
+            else if ( long_size )
+                u64 = va_arg ( args, uint64_t );
+            else
+                u64 = va_arg ( args, uint32_t );
+
+        make_hex_integer:
+
+            /* choose numeric case */
+            hex_digits = ( fmt [ sidx ] == 'x' ) ?
+                "0123456789abcdefx" : "0123456789ABCDEFX";
+
+            /* no sign */
+            use_sign = 0;
+
+            i = sizeof buff - 1;
+
+            /* convert to numeral */
+            if ( comma_separate ) for ( j = digits = 0; ; -- i, ++ j )
+            {
+                if ( j == 3 )
+                {
+                    buff [ -- i ] = ',';
+                    j = 0;
+                }
+                buff [ i ] =  hex_digits [ u64 & 15 ];
+                ++ digits;
+                if ( ( u64 >>= 4 ) == 0 )
+                    break;
+            }
+            else for ( digits = 0; ; -- i )
+            {
+                buff [ i ] =  hex_digits [ u64 & 15 ];
+                ++ digits;
+                if ( ( u64 >>= 4 ) == 0 )
+                    break;
+            }
+
+            if ( alternate )
+            {
+                buff [ -- i ] = hex_digits [ 16 ];
+                buff [ -- i ] = '0';
+            }
+
+            goto insert_integer;
+
+        case 'o':
+
+            /* retrieve argument as unsigned integer */
+            if ( byte_size )
+                u64 = ( uint8_t ) va_arg ( args, int );
+            else if ( half_size )
+                u64 = ( uint16_t ) va_arg ( args, int );
+            else if ( long_size )
+                u64 = va_arg ( args, uint64_t );
+            else
+                u64 = va_arg ( args, uint32_t );
+
+            /* no sign */
+            use_sign = 0;
+
+            i = sizeof buff - 1;
+
+            /* convert to numeral */
+            if ( comma_separate ) for ( j = digits = 0; ; -- i, ++ j )
+            {
+                if ( j == 3 )
+                {
+                    buff [ -- i ] = ',';
+                    j = 0;
+                }
+                buff [ i ] =  ( u64 & 7 ) + '0';
+                ++ digits;
+                if ( ( u64 >>= 3 ) == 0 )
+                    break;
+            }
+            else for ( digits = 0; ; -- i )
+            {
+                buff [ i ] =  ( u64 & 7 ) + '0';
+                ++ digits;
+                if ( ( u64 >>= 3 ) == 0 )
+                    break;
+            }
+
+            if ( alternate )
+            {
+                buff [ -- i ] = '0';
+#if STDC_COMPATIBILITY
+                ++ digits;
+#endif
+            }
+
+            goto insert_integer;
+
+        case 'b':
+
+            /* retrieve argument as unsigned integer */
+            if ( byte_size )
+                u64 = ( uint8_t ) va_arg ( args, int );
+            else if ( half_size )
+                u64 = ( uint16_t ) va_arg ( args, int );
+            else if ( long_size )
+                u64 = va_arg ( args, uint64_t );
+            else
+                u64 = va_arg ( args, uint32_t );
+
+            /* no sign */
+            use_sign = 0;
+
+            i = sizeof buff - 1;
+
+            /* convert to numeral */
+            if ( comma_separate ) for ( j = digits = 0; ; -- i, ++ j )
+            {
+                if ( j == 3 )
+                {
+                    buff [ -- i ] = ',';
+                    j = 0;
+                }
+                buff [ i ] =  ( u64 & 1 ) + '0';
+                ++ digits;
+                if ( ( u64 >>= 1 ) == 0 )
+                    break;
+            }
+            else for ( i = sizeof buff - 1; ; -- i )
+            {
+                buff [ i ] =  ( u64 & 1 ) + '0';
+                ++ digits;
+                if ( ( u64 >>= 1 ) == 0 )
+                    break;
+            }
+
+            if ( alternate )
+            {
+                buff [ -- i ] = 'b';
+                buff [ -- i ] = '0';
+            }
+
+            goto insert_integer;
+
+#if USE_LIB_FLOAT
+        case 'g':
+        case 'e':
+        case 'f':
+        {
+            char subfmt [ 16 ];
+            char * psubfmt = subfmt;
+
+            *psubfmt++ = '%';
+
+            if (alternate)
+                *psubfmt++ = '#';
+
+            if (use_sign)
+                *psubfmt++ = use_sign;
+
+            if (left_align)
+                *psubfmt++ = '-';
+            else if (padding == '0')
+                *psubfmt++ = '0';
+
+            *psubfmt++ = '*';
+            *psubfmt++ = '.';
+            *psubfmt++ = '*';
+            *psubfmt++ = fmt [  sidx  ];
+            *psubfmt = '\0';
+            
+            /* retrieve argument as double or long double */
+        
+            if ( long_size )
+                f64 = ( double ) va_arg ( args, long double );
+            else
+                f64 = va_arg ( args, double );
+
+            if ( ! have_precision )
+                precision = 6;
+            else if ( precision > 20 )
+                precision = 20;
+
+            i = snprintf (buff, sizeof buff, subfmt, min_field_width, precision, f64);
+
+            if ( i >= sizeof buff )
+            {
+                i = sizeof buff - 1;
+                buff [ i ] = '\0';
+            }
+            min_field_width = 0;
+            have_precision = false;
+
+            cp = buff;
+            goto make_nul_term_string;
+        }
+#else
+        case 'g':
+            trim_trailing_zeros = true;
+        case 'e':
+
+#define HANDLE_NAN() \
+            switch (fpclassify (f64))                   \
+            {                                           \
+            case FP_NAN:                                \
+                cp = "nan";                             \
+                goto make_nul_term_string;              \
+            case FP_INFINITE:                           \
+                cp = (f64 < 0) ? "-inf" : "inf";        \
+                goto make_nul_term_string;              \
+            }
+
+
+            /* retrieve argument as double or long double */
+        
+            if ( long_size )
+                f64 = ( double ) va_arg ( args, long double );
+            else
+                f64 = va_arg ( args, double );
+
+            HANDLE_NAN();
+
+            if ( f64 < 0 )
+            {
+                use_sign = '-';
+                f64 = - f64;
+            }
+
+            exponent = 0;
+            buff [ sizeof buff - 3 ] = '+';
+            buff [ sizeof buff - 4 ] = 'e';
+
+            i = len = sizeof buff;
+
+            ftmp = f64;
+
+            if ( f64 >= 10.0 )
+            {
+                for ( ftmp = f64 / 10, exponent = 1; ftmp >= 10.0; ++ exponent )
+                    ftmp /= 10;
+
+                if ( exponent < precision && fmt [ sidx ] == 'g' )
+                    goto make_normal_float;
+            }
+            else if ( f64 < 1.0 && f64 > 0.0 )
+            {
+                buff [ sizeof buff - 3 ] = '-';
+                for ( ftmp = f64 * 10, exponent = 1; ftmp < 1.0; ++ exponent )
+                    ftmp *= 10;
+
+                if ( exponent <= 4 && fmt [ sidx ] == 'g' )
+                    goto make_normal_float;
+            }
+            else if ( fmt [ sidx ] == 'g' )
+            {
+                goto make_normal_float;
+            }
+
+            /* just for safety */
+            exponent %= 100;
+
+            trim_trailing_zeros = false;
+
+            f64 = ftmp;
+
+            buff [ sizeof buff - 1 ] = ( exponent % 10 ) + '0';
+            buff [ sizeof buff - 2 ] = ( exponent / 10 ) + '0';
+
+            i = len = sizeof buff - 4;
+            goto make_normal_float;
+
+        case 'f':
+
+            /* retrieve argument as double or long double */
+            if ( long_size )
+                f64 = ( double ) va_arg ( args, long double );
+            else
+                f64 = va_arg ( args, double );
+
+            HANDLE_NAN();
+
+            if ( f64 < 0 )
+            {
+                use_sign = '-';
+                f64 = - f64;
+            }
+
+            i = len = sizeof buff;
+
+        make_normal_float:
+
+            if ( ! have_precision )
+                precision = 6;
+            else if ( precision > 20 )
+                precision = 20;
+
+            ftemp = 0.5;
+            for (j = 0; j < precision ; ++j)
+                ftemp /= 10;
+
+            f64 += ftemp;
+
+
+            /* save off integral portion */
+            i64 = ( int64_t ) f64;
+
+            /* convert to fraction */
+            f64 = f64 - i64;
+
+            /* promote by precision */
+            for ( j = 0; j < precision; ++ j )
+                f64 *= 10;
+
+            for ( frac = ( uint64_t ) f64; i + precision > len; frac /= 10 )
+                buff [ -- i ] = frac % 10 + '0';
+
+            if ( trim_trailing_zeros )
+            {
+                for ( j = len; -- j >= i; -- precision )
+                {
+                    if ( buff [ j ] != '0' )
+                        break;
+                }
+
+                memmove ( & buff [ len - precision ], & buff [ i ], precision );
+                i = len - precision;
+            }
+
+            if ( precision != 0 || alternate )
+                buff [ -- i ] = '.';
+
+            goto make_signed_integer;
+#endif
+        case 'c':
+
+            /* retrieve as an int */
+            u32 = va_arg ( args, unsigned int );
+            if ( u32 < 128 )
+                buff [ i = sizeof buff - 1 ] = ( char ) u32;
+            else
+            {
+                int dbytes = utf32_utf8 ( buff, & buff [ sizeof buff ], u32 );
+                if ( dbytes <= 0 )
+                    buff [ i = sizeof buff - 1 ] = '?';
+                else
+                    memmove ( & buff [ i = sizeof buff - dbytes ], buff, dbytes );
+            }
+
+            /* precision makes no sense, but no error */
+            precision = 0;
+
+            /* sign makes no sense */
+            use_sign = 0;
+
+#if ZERO_PAD_ONLY_NUMBERS
+            /* padding is always with spaces */
+            padding = ' ';
+#endif
+
+            /* other than that, we can treat it as an integer */
+            goto insert_integer;
+
+        case 's':
+
+            /* retrieve as a NUL terminated ( or precision limited ) string */
+            cp = va_arg ( args, const char* );
+            if ( cp == NULL )
+                cp = "NULL";
+
+        make_nul_term_string:
+
+            /* in our case, no precision field means unlimited */
+            if ( ! have_precision )
+                precision = -1;
+
+#if ZERO_PAD_ONLY_NUMBERS
+            /* padding is always with spaces */
+            padding = ' ';
+#endif
+            /* test for buffer flush */
+            if ( flush != NULL && didx < bsize )
+            {
+                max_field_width = 0;
+                if ( have_precision )
+                    max_field_width = precision;
+                if ( max_field_width < min_field_width )
+                    max_field_width = min_field_width;
+                if ( didx + max_field_width > bsize )
+                {
+                    didx = string_flush ( dst, didx, flush, & rc, & total );
+                    if ( rc != 0 )
+                        break;
+                }
+            }
+
+            /* if right aligning with a minimum field width, measure string */
+            if ( ! left_align && min_field_width != 0 )
+            {
+                for ( len = 0; cp [ len ] != 0 && len < precision; ++ len )
+                    ( void ) 0;
+
+                for ( ; len < min_field_width; ++ didx, ++ len )
+                {
+                    if ( didx < bsize )
+                        dst [ didx ] = padding;
+                }
+            }
+
+            /* copy string */
+            for ( i = 0; i < precision && cp [ i ] != 0; ++ didx, ++ i )
+            {
+                if ( flush != NULL && didx == bsize )
+                {
+                    didx = string_flush ( dst, didx, flush, & rc, & total );
+                    if ( rc != 0 )
+                        break;
+                }
+
+                if ( didx < bsize )
+                    dst [ didx ] = cp [ i ];
+            }
+
+            if ( rc != 0 )
+                break;
+
+            /* apply right padding */
+            if ( left_align ) for ( ; i < min_field_width; ++ didx, ++ i )
+            {
+                if ( flush != NULL && didx == bsize )
+                {
+                    didx = string_flush ( dst, didx, flush, & rc, & total );
+                    if ( rc != 0 )
+                        break;
+                }
+
+                if ( didx < bsize )
+                    dst [ didx ] = ' ';
+            }
+            break;
+
+            /* String object */
+        case 'S':
+
+            /* retrieve as a NUL terminated ( or precision limited ) string */
+            str = va_arg ( args, const String* );
+            if ( str == NULL )
+            {
+                cp = "NULL";
+                goto make_nul_term_string;
+            }
+
+        make_String:
+
+            /* in our case, no precision field means unlimited */
+            if ( ! have_precision )
+                precision = -1;
+
+            /* test for buffer flush */
+            if ( flush != NULL && didx < bsize )
+            {
+                /* buffer is measured in bytes, while printing
+                   widths are measured in characters... */
+                max_field_width = ( uint32_t ) str -> size;
+                if ( str -> len < min_field_width )
+                    max_field_width += min_field_width - str -> len;
+                if ( didx + max_field_width > bsize )
+                {
+                    didx = string_flush ( dst, didx, flush, & rc, & total );
+                    if ( rc != 0 )
+                        break;
+                }
+            }
+
+            /* if right aligning with a minimum field width, measure string */
+            if ( ! left_align && min_field_width != 0 )
+            {
+                len = str -> len;
+                if ( len > precision )
+                    len = precision;
+
+                for ( ; len < min_field_width; ++ didx, ++ len )
+                {
+                    if ( didx < bsize )
+                        dst [ didx ] = ' ';
+                }
+            }
+
+            cp = str -> addr;
+            end = cp + str -> size;
+
+            /* copy string */
+            for ( i = 0; i < str -> len && i < precision; ++ i )
+            {
+                uint32_t ch;
+                int sbytes = utf8_utf32 ( & ch, cp, end );
+                if ( sbytes <= 0 )
+                {
+                    if ( sbytes == 0 )
+                        rc = RC ( rcText, rcString, rcFormatting, rcData, rcInsufficient );
+                    else
+                        rc = RC ( rcText, rcString, rcFormatting, rcData, rcCorrupt );
+                    break;
+                }
+                cp += sbytes;
+
+                if ( didx < bsize )
+                {
+                    int dbytes = utf32_utf8 ( dst + didx, dst + bsize, ch );
+                    if ( dbytes > 0 )
+                    {
+                        didx += dbytes;
+                        continue;
+                    }
+                    if ( dbytes < 0 )
+                    {
+                        rc = RC ( rcText, rcString, rcFormatting, rcData, rcCorrupt );
+                        break;
+                    }
+                }
+
+                didx += sbytes;
+            }
+
+            /* apply right padding */
+            if ( left_align ) for ( ; i < min_field_width; ++ didx, ++ i )
+            {
+                if ( didx < bsize )
+                    dst [ didx ] = ' ';
+            }
+            break;
+
+            /* version number */
+        case 'V':
+
+            u32 = va_arg ( args, uint32_t );
+
+            if ( ! have_precision )
+            {
+                if ( ( u32 & 0xFFFF ) != 0 )
+                    precision = 3;
+                else if ( ( u32 & 0xFF0000 ) != 0 )
+                    precision = 2;
+                else
+                    precision = 1;
+            }
+
+            switch ( precision )
+            {
+            case 0:
+                cp = ""; break;
+            case 1:
+                cp ="%u"; break;
+            case 2:
+                cp ="%u.%u"; break;
+            default:
+                cp ="%u.%u.%u";
+            }
+
+            have_precision = false;
+            precision = 0;
+
+            rc = string_printf ( buff, sizeof buff, & sz,
+                                 cp,
+                                 VersionGetMajor ( u32 ),
+                                 VersionGetMinor ( u32 ),
+                                 VersionGetRelease ( u32 ) );
+            if ( rc != 0 )
+                break;
+
+            use_sign = 0;
+            padding = ' ';
+            memmove ( & buff [ i = ( uint32_t ) ( sizeof buff - sz ) ], buff, sz );
+            goto insert_integer;
+
+        case 'R':
+
+            rc = va_arg ( args, rc_t );
+            sz = KWrtFmt_rc_t ( buff, sizeof buff, alternate ? "#" : "", rc );
+            rc = 0; /* reset back to ok */
+            assert ( sz < sizeof buff );
+
+            use_sign = 0;
+            padding = ' ';
+            memmove ( & buff [ i = ( uint32_t ) ( sizeof buff - sz ) ], buff, sz );
+            goto insert_integer;
+
+        case 'N':
+
+            /* THIS IS WRONG - FIELD WIDTH AND FRIENDS WILL NOT BE USED */
+            sym = va_arg ( args, const KSymbol* );
+
+            if ( sym -> dad != NULL )
+            {
+                if ( flush != NULL )
+                    didx = string_flush ( dst, didx, flush, & rc, & total );
+
+                sz = 0;
+                rc = string_flush_printf ( & dst [ didx ], bsize - didx, flush, & sz, "%N:", sym -> dad );
+                if ( rc != 0 )
+                    break;
+
+                didx += ( uint32_t ) sz;
+                if ( flush != NULL )
+                    didx = 0;
+            }
+
+            str = & sym -> name;
+            goto make_String;
+
+        case 'T': /* KTime */
+
+            tm = va_arg ( args, const KTime* );
+
+            sz = 0;
+
+            /* LEGEND
+             *  modifier 'h' means do date only
+             *  modifier 'l' means date and time
+             *  modifier 'z' means date, time and timezone
+             *  no modifier means time
+             *  precision affects time
+             *  leading zero affects time
+             */
+            if ( date_time_zone || long_size || half_size )
+            {
+                static char const *months [ 12 ] =
+                    { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+                static char const *weekdays [ 7 ] =
+                    { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
+                rc = string_printf ( buff, sizeof buff, & sz, "%s %s %u %u"
+                                     , weekdays [ tm -> weekday ]
+                                     , months [ tm -> month ]
+                                     , tm -> day + 1
+                                     , tm -> year
+                    );
+                if ( rc != 0 )
+                    break;
+            }
+
+            if ( ! half_size )
+            {
+                if ( sz != 0 )
+                    buff [ sz ++ ] = ' ';
+
+                u64 = sz;
+
+                rc = string_printf ( & buff [ sz ], sizeof buff - sz, & sz,
+                                     padding == '0' ? "%02u:%02u:%02u %cM" : "%u:%02u:%02u %cM"
+                                     , ( tm -> hour + 11 ) % 12 + 1
+                                     , tm -> minute
+                                     , tm -> second
+                                     , ( tm -> hour < 12 ) ? 'A' : 'P'
+                    );
+                if ( rc != 0 )
+                    break;
+
+                u64 += sz;
+
+                if ( date_time_zone )
+                {
+                    rc = string_printf ( & buff [ u64 ], sizeof buff - ( size_t ) u64, & sz,
+                                         " %+02d", tm -> tzoff / 60 );
+                    if ( rc != 0 )
+                        break;
+
+                    u64 += sz;
+                }
+
+                sz = ( size_t ) u64;
+            }
+
+            padding = ' ';
+            memmove ( & buff [ i = ( uint32_t ) ( sizeof buff - sz ) ], buff, sz );
+            cp = buff;
+            goto make_nul_term_string;
+
+        case '!': /* operating system error code: e.g. errno or GetLastError() */
+            u32 = va_arg ( args, uint32_t ); /* fetching it unsigned but it can be signed */
+
+            sz = KWrtFmt_error_code ( buff, sizeof buff - 1, u32 );
+            assert ( sz < sizeof buff );
+            buff [ sz ] = '\0';
+
+            padding  = ' ';
+            memmove ( & buff [ i = ( uint32_t ) ( sizeof buff - sz ) ], buff, sz );
+            cp = buff;
+            goto make_nul_term_string;
+
+        case 'n':
+
+            np = va_arg ( args, uint32_t* );
+            if ( np != NULL )
+                * np = ( uint32_t ) ( total + didx );
+            break;
+
+        case 0:
+            -- sidx;
+            break;
+
+        default:
+            rc = RC ( rcText, rcString, rcFormatting, rcFormat, rcUnrecognized );
+        }
+    }
+
+    if ( num_writ != NULL )
+        * num_writ = total + didx;
+
+    if ( flush != NULL )
+    {
+        if ( rc == 0 && didx != 0 )
+        {
+            didx = string_flush ( dst, didx, flush, & rc, & total );
+            if ( rc == 0 && didx != 0 )
+                rc = RC ( rcRuntime, rcString, rcFormatting, rcTransfer, rcIncomplete );
+        }
+    }
+    else if ( didx < bsize )
+        dst [ didx ] = 0;
+    else if ( rc == 0 )
+        rc = RC ( rcText, rcString, rcFormatting, rcBuffer, rcInsufficient );
+
+    return rc;
+}
+
+static
+rc_t CC string_flush_printf ( char *dst, size_t bsize,
+    const KWrtHandler *flush, size_t *num_writ, const char *fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+
+    rc = string_flush_vprintf ( dst, bsize, flush, num_writ, fmt, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC old_string_vprintf ( char *dst, size_t bsize,
+    size_t *num_writ, const char *fmt, va_list args )
+{
+    return string_flush_vprintf ( dst, bsize, NULL, num_writ, fmt, args );
+}
+
+LIB_EXPORT rc_t CC old_string_printf ( char *dst, size_t bsize, size_t *num_writ, const char *fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+
+    rc = string_flush_vprintf ( dst, bsize, NULL, num_writ, fmt, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC old_vkfprintf ( const KWrtHandler *out,
+    size_t *num_writ, const char * fmt, va_list args )
+{
+    rc_t rc;
+
+    if ( out == NULL )
+    {
+        rc = RC ( rcRuntime, rcString, rcFormatting, rcFile, rcNull );
+        if ( num_writ != NULL )
+            * num_writ = 0;
+    }
+    else
+    {
+        char buff [ 4096 ];
+        rc = string_flush_vprintf ( buff, sizeof buff, out, num_writ, fmt, args );
+        if ( rc != 0 )
+            rc = ResetRCContext ( rc, rcRuntime, rcString, rcFormatting );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC old_kfprintf ( const KWrtHandler *out,
+    size_t *num_writ, const char * fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+
+    rc = old_vkfprintf ( out, num_writ, fmt, args );
+        
+    va_end ( args );
+
+    return rc;
+}
+
+/****************************
+ * NEW PRINTF IS NOW ACTIVE *
+ ****************************/
+
+/* create_overflow
+ *  create a buffer so large that it cannot overflow again
+ *  copy in existing structures
+ *  map self-referential pointers
+ */
+static
+rc_t create_overflow ( KDataBuffer *overflow, const char *fmt_str,
+    String **strp, PrintFmt **fmtp, PrintArg **argp,
+    uint32_t str_idx, uint32_t fmt_idx, uint32_t arg_idx )
+{
+    /* measure the format string and infer that
+       we can never have more format items than
+       characters in the string... */
+    size_t fmt_str_size = strlen ( fmt_str );
+
+    /* our size will create a format and argument
+       for every byte. this should be a total overkill. */
+    size_t buff_size = ( sizeof ** strp + sizeof ** fmtp + sizeof **argp ) * fmt_str_size;
+
+    /* make the buffer */
+    rc_t rc = KDataBufferMakeBytes ( overflow, buff_size );
+    if ( rc == 0 )
+    {
+        /* capture pointers to stack structures */
+        const String *str = * strp;
+        const PrintFmt *fmt = * fmtp;
+        const PrintArg *args = * argp;
+
+        /* destination pointers */
+        String *dstr = overflow -> base;
+        PrintFmt *dfmt = ( void* ) ( dstr + fmt_str_size );
+        PrintArg *dargs = ( void* ) ( dfmt + fmt_str_size );
+
+        /* copy existing data */
+        memmove ( dstr, str, str_idx * sizeof * dstr );
+        memmove ( dfmt, fmt, fmt_idx * sizeof * dfmt );
+        memmove ( dargs, args, arg_idx * sizeof * dargs );
+
+        /* if there are any pointers into "str", relocate them */
+        if ( str_idx != 0 )
+        {
+            uint32_t i, j;
+            for ( i = j = 0; i < fmt_idx && j < str_idx; ++ i )
+            {
+                switch ( dfmt [ i ] . type )
+                {
+                case sptString:
+                case sptUCS2String:
+                case sptUTF32String:
+                    if ( dargs [ i ] . S == & str [ j ] )
+                        dargs [ i ] . S = & dstr [ j ++ ];
+                    break;
+                }
+            }
+        }
+
+        /* replace pointers */
+        * strp = dstr;
+        * fmtp = dfmt;
+        * argp = dargs;
+   }
+
+    return rc;
+}
+
+
+/* parse_format_string
+ *  parse format string and args into structured format
+ */
+static
+rc_t parse_format_string ( const char *fmt_str, va_list vargs,
+    String **strp, PrintFmt **fmtp, PrintArg **argp, KDataBuffer *overflow )
+{
+    rc_t rc;
+    uint32_t i, str_idx, fmt_idx, arg_idx;
+
+    PrintFmt *fmt = * fmtp;
+    PrintArg *args = * argp;
+
+    /* loop over format string */
+    for ( rc = 0, i = str_idx = fmt_idx = arg_idx = 0; fmt_str [ i ] != 0; ++ i )
+    {
+        bool alternate, numeric;
+        char size_modifier, time_modifier;
+        bool has_precision, has_index, infinite_first;
+
+        /* loop to gather literal portions */
+        uint32_t start;
+        for ( start = i; ; ++ i )
+        {
+            /* run until we hit start of substitution token
+               or until we hit end of format string */
+            if ( fmt_str [ i ] != 0 && fmt_str [ i ] != '%' )
+                continue;
+
+            /* detect a literal string */
+            if ( i != start )
+            {
+                /* expand into overflow */
+                if ( fmt_idx == LOCAL_FMT_COUNT )
+                {
+                    rc = create_overflow ( overflow, fmt_str,
+                        strp, fmtp, argp, str_idx, fmt_idx, arg_idx );
+                    if ( rc != 0 )
+                        return rc;
+
+                    fmt = * fmtp;
+                    args = * argp;
+                }
+
+                /* create a text-literal format */
+                memset ( & fmt [ fmt_idx ], 0, sizeof fmt [ 0 ] );
+                fmt [ fmt_idx ] . u . l . text = & fmt_str [ start ];
+                fmt [ fmt_idx ] . u . l . size = i - start;
+                fmt [ fmt_idx ] . fmt = spfText;
+                fmt [ fmt_idx ] . type = sptLiteral;
+
+                /* increment counter */
+                ++ fmt_idx;
+            }
+
+            /* detect escape sequence */
+            if ( fmt_str [ i ] == 0 || fmt_str [ i + 1 ] != '%' )
+                break;
+
+            /* skip over escape */
+            start = ++ i;
+        }
+
+        /* done when NUL byte is seen */
+        if ( fmt_str [ i ] == 0 )
+            break;
+
+        /* detect overflow */
+        if ( fmt_idx == LOCAL_FMT_COUNT )
+        {
+            rc = create_overflow ( overflow, fmt_str,
+                strp, fmtp, argp, str_idx, fmt_idx, arg_idx );
+            if ( rc != 0 )
+                return rc;
+
+            fmt = * fmtp;
+            args = * argp;
+        }
+
+        /* initial format
+         *  thousands_separate    = false
+         *  add_prefix            = false
+         *  force_decimal_point   = false
+         *  leave_trailing_zeros  = false
+         *  print_time            = false
+         *  print_date            = false
+         *  print_weekday         = false
+         *  print_timezone        = false
+         *  hour_24               = false
+         *  sign                  = 0
+         *  left_fill             = space
+         */
+        memset ( & fmt [ fmt_idx ], 0, sizeof fmt [ 0 ] );
+        fmt [ fmt_idx ] . left_fill = ' ';
+
+        /* scan flags */
+        alternate = false;
+        while ( 1 )
+        {
+            switch ( fmt_str [ ++ i ] )
+            {
+                /* plus and space modify application of sign
+                   to signed integer and floating point conversions.
+                   plus overrides space. */
+            case ' ':
+                if ( fmt [ fmt_idx ] . sign == 0 )
+            case '+':
+                    fmt [ fmt_idx ] . sign = fmt_str [ i ];
+                continue;
+
+                /* dash indicates left-alignment. indicate this
+                   by setting "left_fill" to NUL. */
+            case '-':
+                fmt [ fmt_idx ] . left_fill = 0;
+                continue;
+
+                /* zero indicates an alternate left-fill for
+                   numeric conversions. the zero is inserted before
+                   any sign character in { '+', '-' or ' ' }.
+                   since "left_fill" is also used to indicate
+                   alignment, only store when right aligning. */
+            case '0':
+                if ( fmt [ fmt_idx ] . left_fill != 0 )
+                    fmt [ fmt_idx ] . left_fill = '0';
+                continue;
+
+                /* hash indicates that the formatter should use an
+                   "alternate" approach. that approach is specific
+                   to the format. */
+            case '#':
+                alternate = true;
+                continue;
+
+                /* comma ( or apostrophe outside of US ) indicates
+                   that the integer portion of a numeral should use
+                   a comma as a thousands separator for legibility. */
+            case ',':
+            case '\'':
+                fmt [ fmt_idx ] . thousands_separate = 1;
+                continue;
+            }
+
+            /* we've hit a non-flag character */
+            break;
+        }
+
+        /* minimum field width */
+        if ( isdigit ( fmt_str [ i ] ) )
+        {
+            /* literal */
+            fmt [ fmt_idx ] . u . f . min_field_width = fmt_str [ i ] - '0';
+            while ( isdigit ( fmt_str [ ++ i ] ) )
+            {
+                fmt [ fmt_idx ] . u . f . min_field_width *= 10;
+                fmt [ fmt_idx ] . u . f . min_field_width += fmt_str [ i ] - '0';
+            }
+        }
+        else if ( fmt_str [ i ] == '*' )
+        {
+            /* external - we populate the structure directly
+               rather than marking the value as external */
+            fmt [ fmt_idx ] . u . f . min_field_width = va_arg ( vargs, uint32_t );
+            ++ i;
+        }
+
+        /* precision */
+        has_precision = false;
+        if ( fmt_str [ i ] == '.' )
+        {
+            /* a single dot implies a precision value of 0 */
+            has_precision = true;
+
+            if ( isdigit ( fmt_str [ ++ i ] ) )
+            {
+                /* a literal precision */
+                fmt [ fmt_idx ] . u . f . precision = fmt_str [ i ] - '0';
+                while ( isdigit ( fmt_str [ ++ i ] ) )
+                {
+                    fmt [ fmt_idx ] . u . f . precision *= 10;
+                    fmt [ fmt_idx ] . u . f . precision += fmt_str [ i ] - '0';
+                }
+            }
+            else if ( fmt_str [ i ] == '*' )
+            {
+                /* external - again populate directly */
+                fmt [ fmt_idx ] . u . f . precision = va_arg ( vargs, uint32_t );
+                ++ i;
+            }
+            else if ( fmt_str [ i ] == '-' )
+            {
+                /* eat a negative precision - treat as 0 */
+                while ( isdigit ( fmt_str [ ++ i ] ) )
+                    ( void ) 0;
+            }
+        }
+
+        /* index - given when parameter is a vector */
+        has_index = infinite_first = false;
+        if ( fmt_str [ i ] == ':' )
+        {
+            bool has_start, has_len, has_end, end_is_stop;
+            has_start = has_len = has_end = end_is_stop = false;
+
+            /* parameter is taken as a vector,
+               with a default index starting at 0 */
+            has_index = true;
+
+            if ( isdigit ( fmt_str [ ++ i ] ) )
+            {
+                /* literal index */
+                fmt [ fmt_idx ] . u . f . start_idx = fmt_str [ i ] - '0';
+                while ( isdigit ( fmt_str [ ++ i ] ) )
+                {
+                    fmt [ fmt_idx ] . u . f . start_idx *= 10;
+                    fmt [ fmt_idx ] . u . f . start_idx += fmt_str [ i ] - '0';
+                }
+                has_start = true;
+            }
+            else switch ( fmt_str [ i ] )
+            {
+            case '*':
+                /* external index, captured directly */
+                fmt [ fmt_idx ] . u . f . start_idx = va_arg ( vargs, uint32_t );
+                ++ i;
+                has_start = true;
+                break;
+            case '$':
+                ++ i;
+                has_start = infinite_first = true;
+                break;
+            }
+
+            /* detect range */
+            switch ( fmt_str [ i ] )
+            {
+                /* given as start-stop */
+            case '-':
+                end_is_stop = true;
+
+                /* given as start/len */
+            case '/':
+
+                has_len = true;
+
+                if ( isdigit ( fmt_str [ ++ i ] ) )
+                {
+                    /* literal selection length or end */
+                    fmt [ fmt_idx ] . u . f . select_len = fmt_str [ i ] - '0';
+                    while ( isdigit ( fmt_str [ ++ i ] ) )
+                    {
+                        fmt [ fmt_idx ] . u . f . select_len *= 10;
+                        fmt [ fmt_idx ] . u . f . select_len += fmt_str [ i ] - '0';
+                    }
+                    has_end = true;
+                }
+                else switch ( fmt_str [ i ] )
+                {
+                case '*':
+                    /* external selection length or end */
+                    fmt [ fmt_idx ] . u . f . select_len = va_arg ( vargs, uint32_t );
+                    ++ i;
+                    has_end = true;
+                    break;
+                case '$':
+                    ++ i;
+                    end_is_stop = false;
+                    break;
+                case '-':
+                    /* negatives are garbage */
+                    while ( isdigit ( fmt_str [ ++ i ] ) )
+                        ( void ) 0;
+                    break;
+                default:
+                    end_is_stop = false;
+                }
+                break;
+            }
+
+            /* massage values */
+            if ( infinite_first )
+            {
+                /* having an infinite first forces length of 1 */
+                fmt [ fmt_idx ] . u . f . select_len = 1;
+            }
+            else if ( has_len )
+            {
+                /* if either a number or an external value was given */
+                if ( has_end && end_is_stop )
+                {
+                    /* end <= start is translated to length 1 */
+                    if ( fmt [ fmt_idx ] . u . f . select_len <= fmt [ fmt_idx ] . u . f . start_idx )
+                        fmt [ fmt_idx ] . u . f . select_len = 1;
+
+                    /* end > start is translated to stated length */
+                    else
+                        fmt [ fmt_idx ] . u . f . select_len -= fmt [ fmt_idx ] . u . f . start_idx - 1;
+                }
+            }
+            else if ( has_start )
+            {
+                /* with no end specified, selection length is 1 */
+                fmt [ fmt_idx ] . u . f . select_len = 1;
+            }
+        }
+
+        /* size - one of the greatest leg-irons in the C legacy,
+           guess at the parameter size so that va_arg can extract
+           it properly. rather than using predictable parameter sizes,
+           they are fuzzy. we have ( mostly ) kept them for tradition...
+           if no modifier is given, 32-bit is assumed for integer and
+           64-bit for floating point. */
+        size_modifier = time_modifier = 0;
+        switch ( fmt_str [ i ] )
+        {
+            /* "Tiny" modifier - like "hh" in C format */
+        case 't':
+            /* "Half" modifier - same as C format */
+        case 'h':
+            /* "Long" modifier - means 64-bit for integers, otherwise like C */
+        case 'l':
+            size_modifier = time_modifier = fmt_str [ i ++ ];
+            break;
+            /* "siZe" modifier - whatever the size of size_t is */
+        case 'z':
+            ++ i;
+            time_modifier = 'z';
+            if ( sizeof ( size_t ) == sizeof ( uint64_t ) )
+                size_modifier = 'l';
+            break;
+        }
+
+        /* output format
+           describes the formatting to apply on output
+           if precision has not been set, give it a default value */
+        numeric = false;
+        fmt [ fmt_idx ] . pointer_arg = has_index;
+        switch ( fmt_str [ i ] )
+        {
+            /* decimal signed integer */
+        case 'd':
+        case 'i':
+            fmt [ fmt_idx ] . radix = 10;
+            fmt [ fmt_idx ] . fmt = spfSignedInt;
+            numeric = true;
+            if ( ! has_precision )
+                fmt [ fmt_idx ] . u . f . precision = 1;
+            else if ( fmt [ fmt_idx ] . left_fill == '0' )
+                fmt [ fmt_idx ] . left_fill = ' ';
+            break;
+
+            /* decimal unsigned integer */
+        case 'u':
+            fmt [ fmt_idx ] . radix = 10;
+        unsigned_int:
+            fmt [ fmt_idx ] . fmt = spfUnsigned;
+            fmt [ fmt_idx ] . sign = 0;
+            numeric = true;
+            if ( ! has_precision )
+                fmt [ fmt_idx ] . u . f . precision = 1;
+            else if ( fmt [ fmt_idx ] . left_fill == '0' )
+                fmt [ fmt_idx ] . left_fill = ' ';
+            break;
+
+            /* hex unsigned integer */
+        case 'x':
+            fmt [ fmt_idx ] . add_prefix = alternate;
+            fmt [ fmt_idx ] . radix = 16;
+            goto unsigned_int;
+
+            /* upper-case hex unsigned integer or pointer value */
+        case 'X':
+        case 'p':
+            fmt [ fmt_idx ] . upper_case_num = 1;
+            fmt [ fmt_idx ] . add_prefix = alternate;
+            fmt [ fmt_idx ] . radix = 16;
+            goto unsigned_int;
+
+            /* octal unsigned integer */
+        case 'o':
+            fmt [ fmt_idx ] . add_prefix = alternate;
+            fmt [ fmt_idx ] . radix = 8;
+            goto unsigned_int;
+
+            /* binary unsigned integer */
+        case 'b':
+            fmt [ fmt_idx ] . add_prefix = alternate;
+            fmt [ fmt_idx ] . radix = 2;
+            goto unsigned_int;
+
+            /* decimal signed floating point */
+        case 'f':
+            fmt [ fmt_idx ] . fmt = spfStdFloat;
+        fmt_float:
+            fmt [ fmt_idx ] . radix = 10;
+            fmt [ fmt_idx ] . force_decimal_point = alternate;
+            numeric = true;
+            if ( ! has_precision )
+                fmt [ fmt_idx ] . u . f . precision = 6;
+            break;
+
+            /* scientific notation floating point */
+        case 'e':
+            fmt [ fmt_idx ] . fmt = spfSciFloat;
+            goto fmt_float;
+
+            /* "general" floating point */
+        case 'g':
+            fmt [ fmt_idx ] . leave_trailing_zeros = alternate;
+            fmt [ fmt_idx ] . fmt = spfGenFloat;
+            goto fmt_float;
+
+            /* character data */
+        case 's':
+        case 'S':
+            fmt [ fmt_idx ] . pointer_arg = 1;
+            if ( ! has_precision )
+            /* no break */
+        case 'c':
+                fmt [ fmt_idx ] . u . f . precision = -1;
+            fmt [ fmt_idx ] . fmt = spfText;
+            break;
+            
+            /* KSymbol* */
+        case 'N':
+            fmt [ fmt_idx ] . pointer_arg = 1;
+            fmt [ fmt_idx ] . fmt = spfSymbol;
+            break;
+
+            /* ver_t */
+        case 'V':
+            size_modifier = ( sizeof ( ver_t ) == sizeof ( uint32_t ) ) ? 0 : 'l';
+            fmt [ fmt_idx ] . min_vers_components = ! has_precision;
+            fmt [ fmt_idx ] . fmt = spfVersion;
+            break;
+
+            /* rc_t */
+        case 'R':
+            size_modifier = ( sizeof ( rc_t ) == sizeof ( uint32_t ) ) ? 0 : 'l';
+            fmt [ fmt_idx ] . explain_rc = alternate;
+            fmt [ fmt_idx ] . fmt = spfRC;
+            break;
+
+            /* KTime* */
+        case 'T':
+            fmt [ fmt_idx ] . pointer_arg = 1;
+            fmt [ fmt_idx ] . fmt = spfTime;
+            numeric = true;
+
+            /* here, the "size" modifier is interpreted
+               as a selector for the output format. perhaps
+               it could have been a precision thing, but... */
+            switch ( time_modifier )
+            {
+                /* by itself, 'T' implies print the time */
+            case 0:
+                fmt [ fmt_idx ] . print_time = 1;
+                break;
+
+                /* "half" 'T' means the date */
+            case 'h':
+                fmt [ fmt_idx ] . print_date = 1;
+                break;
+
+                /* "zone" 'T' means long date with time zone */
+            case 'z':
+                fmt [ fmt_idx ] . print_timezone = 1;
+                /* no break */
+
+                /* "long" 'T' means date and time */
+            case 'l':
+                fmt [ fmt_idx ] . print_time = 1;
+                fmt [ fmt_idx ] . print_date = 1;
+                fmt [ fmt_idx ] . print_weekday = 1;
+                break;
+            }
+            break;
+
+            /* OS-specific error code:
+               int on Unix-like systems
+               DWORD on Windows */
+        case '!':
+            size_modifier = 0;
+            fmt [ fmt_idx ] . fmt = spfOSErr;
+            break;
+
+#if SUPPORT_PERCENT_N
+            /* awful out parameter giving characters printed so far */
+        case 'n':
+            fmt [ fmt_idx ] . fmt = spfNone;
+            break;
+#endif
+        default:
+            return RC ( rcText, rcString, rcFormatting, rcFormat, rcUnrecognized );
+        }
+
+#if ZERO_PAD_ONLY_NUMBERS
+        /* handle zero padding for non-numeric cases */
+        if ( ! numeric && fmt [ fmt_idx ] . left_fill == '0' )
+            fmt [ fmt_idx ] . left_fill = ' ';
+#endif
+
+        /* argument format */
+        if ( has_index )
+        {
+            /* all arguments MUST be vectors. */
+            args [ arg_idx ] . p = va_arg ( vargs, const void* );
+
+            /* discriminate on vector type */
+            switch ( fmt_str [ i ] )
+            {
+                /* signed integer */
+            case 'd':
+            case 'i':
+            case '!':
+
+                if ( infinite_first )
+                    return RC ( rcText, rcString, rcFormatting, rcIndex, rcIncorrect );
+
+                /* select from 4 possibilities */
+                switch ( size_modifier )
+                {
+                case 0:
+                    fmt [ fmt_idx ] . type = sptSignedInt32Vect;
+                    break;
+                case 'l':
+                    fmt [ fmt_idx ] . type = sptSignedInt64Vect;
+                    break;
+                case 'h':
+                    fmt [ fmt_idx ] . type = sptSignedInt16Vect;
+                    break;
+                case 't':
+                    fmt [ fmt_idx ] . type = sptSignedInt8Vect;
+                    break;
+                }
+                break;
+
+                /* pointer value - cast to 32 or 64-bit unsigned integer */
+            case 'p':
+                size_modifier = ( sizeof ( void* ) == sizeof ( uint64_t ) ) ? 'l' : 0;
+                /* no break */
+
+                /* unsigned integer */
+            case 'u':
+            case 'x':
+            case 'X':
+            case 'o':
+            case 'b':
+            case 'V':
+            case 'R':
+
+                if ( infinite_first )
+                    return RC ( rcText, rcString, rcFormatting, rcIndex, rcIncorrect );
+
+                switch ( size_modifier )
+                {
+                case 0:
+                    fmt [ fmt_idx ] . type = sptUnsignedInt32Vect;
+                    break;
+                case 'l':
+                    fmt [ fmt_idx ] . type = sptUnsignedInt64Vect;
+                    break;
+                case 'h':
+                    fmt [ fmt_idx ] . type = sptUnsignedInt16Vect;
+                    break;
+                case 't':
+                    fmt [ fmt_idx ] . type = sptUnsignedInt8Vect;
+                    break;
+                }
+                break;
+
+                /* floating point */
+            case 'e':
+            case 'f':
+            case 'g':
+
+                if ( infinite_first )
+                    return RC ( rcText, rcString, rcFormatting, rcIndex, rcIncorrect );
+
+                switch ( size_modifier )
+                {
+                case 0:
+                    fmt [ fmt_idx ] . type = sptFloat64Vect;
+                    break;
+                case 'h':
+                    fmt [ fmt_idx ] . type = sptFloat32Vect;
+                    break;
+                case 'l':
+                    fmt [ fmt_idx ] . type = sptFloatLongVect;
+                    break;
+                }
+                break;
+
+                /* character array */
+            case 'c':
+
+                /* can't determine last */
+                if ( infinite_first )
+                    return RC ( rcText, rcString, rcFormatting, rcIndex, rcIncorrect );
+
+                /* length must be bounded */
+                if ( fmt [ fmt_idx ] . u . f . select_len == 0 )
+                    fmt [ fmt_idx ] . u . f . select_len = 1;
+
+                fmt [ fmt_idx ] . type = sptNulTermString;
+                break;
+
+            case 's':
+#if STDC_COMPATIBILITY
+                if ( args [ arg_idx ] . p == NULL ) {
+                    args [ arg_idx ] . p = NULL_STRING_TEXT;
+                }
+#endif
+                /* NUL-terminated string issues */
+                if ( args [ arg_idx ] . p != NULL && infinite_first )
+                {
+                    const char *cp = args [ arg_idx ] . p;
+
+                    /* handle selection of last element */
+                    size_t len = strlen ( cp );
+                    if ( len != 0 )
+                    {
+                        fmt [ fmt_idx ] . u . f . start_idx = len - 1;
+                        fmt [ fmt_idx ] . u . f . select_len = 1;
+                    }
+                }
+
+                fmt [ fmt_idx ] . type = sptNulTermString;
+                break;
+
+                /* character string */
+            case 'S':
+
+                /* if the index starts with last element */
+                if ( args [ arg_idx ] . p != NULL && infinite_first )
+                {
+                    const String *s = args [ arg_idx ] . p;
+                    if ( s -> size != 0 )
+                    {
+                        fmt [ fmt_idx ] . u . f . start_idx = s -> size - 1;
+                        fmt [ fmt_idx ] . u . f . select_len = 1;
+                    }
+                }
+
+                fmt [ fmt_idx ] . type = sptString;
+                break;
+
+                /* no other type supports vectors */
+            default:
+                return RC ( rcText, rcString, rcFormatting, rcFormat, rcIncorrect );
+            }
+        }
+        else
+        {
+            /* scalar or string arguments */
+            switch ( fmt_str [ i ] )
+            {
+                /* signed integer */
+            case 'd':
+            case 'i':
+            case '!':
+                fmt [ fmt_idx ] . type = sptSignedInt;
+                switch ( size_modifier )
+                {
+                case 0:
+                    args [ arg_idx ] . d = va_arg ( vargs, int32_t );
+                    break;
+                case 'l':
+                    args [ arg_idx ] . d = va_arg ( vargs, int64_t );
+                    break;
+#if EMULATE_SMALLINT_EXTENSION_BUG
+                case 'h':
+                case 't':
+                    args [ arg_idx ] . d = va_arg ( vargs, int );
+                    break;
+#else
+                case 'h':
+                    args [ arg_idx ] . d = ( int16_t ) va_arg ( vargs, int );
+                    break;
+                case 't':
+                    args [ arg_idx ] . d = ( int8_t ) va_arg ( vargs, int );
+                    break;
+#endif
+                }
+                break;
+
+                /* pointer cast to uint64_t */
+            case 'p':
+                size_modifier = ( sizeof ( void* ) == sizeof ( uint64_t ) ) ? 'l' : 0;
+                /* no break */
+
+                /* unsigned integer */
+            case 'u':
+            case 'x':
+            case 'X':
+            case 'o':
+            case 'b':
+            case 'V':
+            case 'R':
+                fmt [ fmt_idx ] . type = sptUnsignedInt;
+                switch ( size_modifier )
+                {
+                case 0:
+                    args [ arg_idx ] . u = va_arg ( vargs, uint32_t );
+                    break;
+                case 'l':
+                    args [ arg_idx ] . u = va_arg ( vargs, uint64_t );
+                    break;
+                case 'h':
+                    args [ arg_idx ] . u = ( uint16_t ) va_arg ( vargs, unsigned int );
+                    break;
+                case 't':
+                    args [ arg_idx ] . u = ( uint8_t ) va_arg ( vargs, unsigned int );
+                    break;
+                }
+                break;
+
+                /* floating point */
+            case 'e':
+            case 'f':
+            case 'g':
+                fmt [ fmt_idx ] . type = sptFloat;
+                switch ( size_modifier )
+                {
+                case 0:
+                case 'h':
+                    args [ arg_idx ] . f = va_arg ( vargs, double );
+                    break;
+                case 'l':
+                    args [ arg_idx ] . f = ( double ) va_arg ( vargs, long double );
+                    break;
+                default:
+                    return RC ( rcText, rcString, rcFormatting, rcFormat, rcIncorrect );
+                }
+                break;
+
+                /* single character */
+            case 'c':
+                fmt [ fmt_idx ] . type = sptChar;
+                args [ arg_idx ] . c = va_arg ( vargs, uint32_t );
+                break;
+
+                /* NUL-terminated string */
+            case 's':
+                fmt [ fmt_idx ] . type = sptNulTermString;
+                args [ arg_idx ] . s = va_arg ( vargs, const char* );
+                break;
+
+                /* String object */
+            case 'S':
+                fmt [ fmt_idx ] . type = sptString;
+                args [ arg_idx ] . S = va_arg ( vargs, const String* );
+                break;
+
+                /* KSymbol or KTime object */
+            case 'N':
+            case 'T':
+                fmt [ fmt_idx ] . type = sptPointer;
+                args [ arg_idx ] . p = va_arg ( vargs, const void* );
+                break;
+
+#if SUPPORT_PERCENT_N
+            case 'n':
+                fmt [ fmt_idx ] . type = sptBytesPrinted;
+                args [ arg_idx ] . n = va_arg ( vargs, uint32_t* );
+                break;
+#endif
+            }
+        }
+
+        /* account for format and argument */
+        ++ fmt_idx;
+        ++ arg_idx;
+    }
+
+    /* record final fmt */
+    if ( rc == 0 )
+    {
+        if ( fmt_idx == LOCAL_FMT_COUNT )
+        {
+            rc = create_overflow ( overflow, fmt_str,
+                strp, fmtp, argp, str_idx, fmt_idx, arg_idx );
+            if ( rc != 0 )
+                return rc;
+
+            fmt = * fmtp;
+        }
+
+        memset ( & fmt [ fmt_idx ], 0, sizeof fmt [ 0 ] );
+    }
+
+    return rc;
+}
+
+
+/* KBufferedWrtHandler
+ *  combines buffer and possibly NULL handler
+ *  handles flushing, counting, etc.
+ */
+typedef struct KBufferedWrtHandler KBufferedWrtHandler;
+struct KBufferedWrtHandler
+{
+    const KWrtHandler *handler;
+    char *buff;
+    size_t bsize;
+    size_t cur;
+    size_t flushed;
+    bool overflow;
+};
+
+
+/* flush_buffer
+ *  writes data to handler
+ *  or NUL-terminates buffer
+ */
+static
+rc_t flush_buffer ( KBufferedWrtHandler *out )
+{
+    const KWrtHandler *flush = out -> handler;
+    if ( flush != NULL  && flush -> writer != NULL )
+    {
+        rc_t rc = 0;
+        size_t num_writ, flushed;
+
+/*        assert ( out -> cur != 0 ); */
+
+        for ( flushed = 0; flushed < out -> cur; flushed += num_writ )
+        {
+            rc = ( * flush -> writer ) ( flush -> data,
+                & out -> buff [ flushed ], out -> cur - flushed, & num_writ );
+            if ( rc != 0 )
+                break;
+            if ( num_writ == 0 )
+                break;
+        }
+
+        if ( flushed == 0 )
+            return rc;
+
+        out -> flushed += flushed;
+        if ( flushed < out -> cur )
+            memmove ( out -> buff, & out -> buff [ flushed ], out -> cur - flushed );
+        out -> cur -= flushed;
+
+        return 0;
+    }
+
+    /* NB - header file states that space for NUL byte
+       is REQUIRED, so this test will declare overflow
+       whenever there is not space for the NUL termination */
+    if ( out -> cur >= out -> bsize )
+        out -> overflow = true;
+    else
+        out -> buff [ out -> cur ] = 0;
+
+    return 0;
+}
+
+static
+rc_t write_buffer ( KBufferedWrtHandler *out, const char *data, size_t bytes )
+{
+    size_t total, num_writ;
+    for ( total = 0; total < bytes; out -> cur += num_writ, total += num_writ )
+    {
+        if ( ! out -> overflow && out -> cur == out -> bsize )
+        {
+            rc_t rc = flush_buffer ( out );
+            if ( rc != 0 )
+                return rc;
+        }
+        if ( out -> overflow )
+            num_writ = bytes - total;
+        else
+        {
+            num_writ = out -> bsize - out -> cur;
+            if ( total + num_writ > bytes )
+                num_writ = bytes - total;
+            memmove ( & out -> buff [ out -> cur ], & data [ total ], num_writ );
+        }
+    }
+    return 0;
+}
+
+
+/* print_padding
+ *  issue padding characters
+ */
+static
+rc_t print_padding ( KBufferedWrtHandler *out, size_t count, char pad_char )
+{
+    size_t total, num_writ;
+    for ( total = 0; total < count; out -> cur += num_writ, total += num_writ )
+    {
+        if ( ! out -> overflow && out -> cur == out -> bsize )
+        {
+            rc_t rc = flush_buffer ( out );
+            if ( rc != 0 )
+                return rc;
+        }
+        if ( out -> overflow )
+            num_writ = count - total;
+        else
+        {
+            size_t i = out -> cur;
+            size_t lim = out -> cur + count - total;
+            if ( lim > out -> bsize )
+                lim = out -> bsize;
+            for ( num_writ = lim - i; i < lim; ++ i )
+                out -> buff [ i ] = pad_char;
+        }
+    }
+    return 0;
+}
+
+/* print_nul_term_string
+ */
+static
+rc_t print_nul_term_string ( KBufferedWrtHandler *out, String *S, size_t precision )
+{
+    size_t total, num_writ;
+    const char *s = S -> addr;
+
+    for ( S -> len = 0, total = 0; total < precision && s [ 0 ] != 0;
+          s += num_writ, out -> cur += num_writ, total += num_writ )
+    {
+        char *buff;
+        size_t lim;
+
+        if ( ! out -> overflow && out -> cur == out -> bsize )
+        {
+            rc_t rc = flush_buffer ( out );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        if ( out -> overflow )
+        {
+            lim = precision - total;
+
+            for ( num_writ = 0; num_writ < lim; ++ num_writ )
+            {
+                if ( s [ num_writ ] == 0 )
+                    break;
+
+                /* count characters as well as bytes */
+                if ( ( s [ num_writ ] & 0xC0 ) != 0x80 )
+                    ++ S -> len;
+            }
+        }
+        else
+        {
+            buff = out -> buff + out -> cur;
+            lim = out -> bsize - out -> cur;
+
+            if ( total + lim > precision )
+                lim = precision - total;
+
+            for ( num_writ = 0; num_writ < lim; ++ num_writ )
+            {
+                if ( s [ num_writ ] == 0 )
+                    break;
+
+                /* count characters as well as bytes */
+                if ( ( ( buff [ num_writ ] = s [ num_writ ] ) & 0xC0 ) != 0x80 )
+                    ++ S -> len;
+            }
+        }
+    }
+
+    S -> size = total;
+
+    return 0;
+}
+
+/* print_string
+ */
+static
+rc_t print_string ( KBufferedWrtHandler *out, const String *s, size_t precision )
+{
+    /* TBD - this is only correct for ASCII */
+    if ( s -> size < precision )
+        precision = s -> size;
+
+    return write_buffer ( out, s -> addr, precision );
+}
+
+static
+rc_t print_symbol ( KBufferedWrtHandler *out, const KSymbol *sym )
+{
+    if ( sym -> dad != NULL )
+    {
+        rc_t rc = print_symbol ( out, sym -> dad );
+        if ( rc == 0 )
+            rc = print_padding ( out, 1, ':' );
+        if ( rc != 0 )
+            return rc;
+    }
+    return print_string ( out, & sym -> name, sym -> name . size );
+}
+
+static
+rc_t print_literal ( KBufferedWrtHandler *out, const char *text, size_t size )
+{
+    return write_buffer ( out, text, size );
+}
+
+
+/* structured_print_engine
+ *  prints into a buffer
+ *  if an output handler is provided, the buffer will be flushed to it as needed
+ *  returns the number of BYTES written, but not the number of characters.
+ */
+static const char* alnum_set [ 2 ] [ 2 ] =
+{
+    /* "normal" alpha-numeric ordering for rendering numerals */
+    {
+        "0123456789abcdefghijklmnopqrstuvwxyz",
+        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    },
+    /* "abnormal" alpha-numeric ordering used by SFF format */
+    {
+        "abcdefghijklmnopqrstuvwxyz0123456789",
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
+    }
+};
+
+static
+rc_t structured_print_engine ( KBufferedWrtHandler *out,
+    const PrintFmt *fmt, const PrintArg *args )
+{
+    rc_t rc;
+    uint32_t fmt_idx, arg_idx;
+
+    /* declare these here to stifle the compiler
+       they should most naturally be declared within the loop,
+       but since they are conditionally initialized by the switch,
+       the compiler warns they may be used before initialization.
+       rather than quiet the complaint within the loop, they have
+       been manually hoisted outside and initialized once. */
+    uint32_t i = 0;
+    int64_t i64 = 0;
+    uint64_t u64 = 0;
+    double f64 = 0;
+    const void *p = NULL;
+
+    /* most of the arguments are going to be pulled into "S" */
+    String S;
+    StringInit ( & S, NULL, 0, 0 );
+
+    /* mark no overflow */
+    out -> overflow = false;
+
+    /* loop across all format structures */
+    for ( rc = 0, out -> cur = out -> flushed = 0, fmt_idx = arg_idx = 0;
+          fmt [ fmt_idx ] . type != sptTerm; ++ fmt_idx )
+    {
+        /* copy entry - we're going to modify it */
+        PrintFmt f = fmt [ fmt_idx ];
+
+        /* ENGINE PARAMETERS */
+
+        /* padding to left side of field */
+        uint32_t left_pad;
+
+        /* sign character if not NUL */
+        char sign_char;
+
+        /* prefix for unsigned int */
+        char prefix [ 4 ];
+        uint32_t prefix_len;
+
+        /* true if performing comma separation */
+        bool comma_sep;
+
+        /* zero-fill, from either integer precision or min-field-width */
+        uint32_t zero_fill;
+
+        /* length of integer portion of numeral, prefix contribution */
+        uint32_t int_len = 0, prefix_contribution;
+
+        /* string index, from index and text precision */
+        bool text_index;
+        uint64_t text_start, text_lim;
+
+        /* END ENGINE PARAMETERS */
+
+        int cvt_len;
+        uint32_t c, *n;
+
+        const KTime *tm;
+        const KSymbol *N;
+
+        char text [ 1024 ];
+        uint32_t dst_len;
+
+        char ffmt [ 16 ];
+        const char *to_numeral, *cfmt;
+
+        /* detect literal */
+        if ( f . type == sptLiteral )
+        {
+            rc = print_literal ( out, f . u . l . text, f . u . l . size );
+            if ( rc != 0 )
+                break;
+
+            continue;
+        }
+
+        /* gather external parameters */
+        if ( f . ext_field_width )
+             f . u . f . min_field_width = args [ arg_idx ++ ] . u;
+        if ( f . ext_precision )
+            f . u . f . precision = args [ arg_idx ++ ] . u;
+        if ( f . ext_start_index )
+            f . u . f . start_idx = args [ arg_idx ++ ] . u;
+        if ( f . ext_select_len )
+            f . u . f . select_len = args [ arg_idx ++ ] . u;
+        else if ( f . ext_stop_index )
+        {
+            f . u . f . select_len = args [ arg_idx ++ ] . u;
+            if ( f . u . f . select_len <= f . u . f . start_idx )
+                f . u . f . select_len = 1;
+            else
+                f . u . f . select_len -= f . u . f . start_idx - 1;
+        }
+
+        /* early initialization */
+        text_index = false;
+        text_start = 0;
+        text_lim = -1;
+
+        /* vector parameters may have NULL pointers under certain
+           circumstances, e.g. pre-calculated format with out-of-bounds
+           index coordinates, when this is detectable. */
+        if ( f . pointer_arg && args [ arg_idx ] . p == NULL )
+        {
+            if ( f . fmt == spfText )
+            {
+                CONST_STRING ( & S, NULL_STRING_TEXT );
+                f . type_cast = 0;
+                f . type = sptString;
+                if ( f . u . f . precision < S . len )
+#if STDC_COMPATIBILITY  &&  !defined(__GLIBC__)
+                    S . size = f . u . f . precision;
+                    S . len = (uint32_t) f . u . f . precision;
+#else
+                    StringInit ( & S, "", 0, 0 );
+#endif                    
+            }
+            else
+            {
+                memset ( & f, 0, sizeof f );
+                f . u . f . precision = 1;
+                f . radix = 10;
+                f . fmt = spfUnsigned;
+                f . type = sptUnsignedInt;
+                u64 = 0;
+            }
+        }
+
+        /* get source */
+        else switch ( f . type )
+        {
+            /* scalar or vector signed integer */
+        case sptSignedInt:
+            i64 = args [ arg_idx ] . d;
+            break;
+        case sptSignedInt8Vect:
+            i64 = args [ arg_idx ] . d8 [ f . u . f . start_idx ];
+            break;
+        case sptSignedInt16Vect:
+            i64 = args [ arg_idx ] . d16 [ f . u . f . start_idx ];
+            break;
+        case sptSignedInt32Vect:
+            i64 = args [ arg_idx ] . d32 [ f . u . f . start_idx ];
+            break;
+        case sptSignedInt64Vect:
+            i64 = args [ arg_idx ] . d64 [ f . u . f . start_idx ];
+            break;
+
+            /* scalar or vector unsigned integer */
+        case sptUnsignedInt:
+            u64 = args [ arg_idx ] . u;
+            break;
+        case sptUnsignedInt8Vect:
+            u64 = args [ arg_idx ] . u8 [ f . u . f . start_idx ];
+            break;
+        case sptUnsignedInt16Vect:
+            u64 = args [ arg_idx ] . u16 [ f . u . f . start_idx ];
+            break;
+        case sptUnsignedInt32Vect:
+            u64 = args [ arg_idx ] . u32 [ f . u . f . start_idx ];
+            break;
+        case sptUnsignedInt64Vect:
+            u64 = args [ arg_idx ] . u64 [ f . u . f . start_idx ];
+            break;
+
+            /* scalar or vector float */
+        case sptFloat:
+            f64 = args [ arg_idx ] . f;
+            break;
+        case sptFloat32Vect:
+            f64 = args [ arg_idx ] . f32 [ f . u . f . start_idx ];
+            break;
+        case sptFloat64Vect:
+            f64 = args [ arg_idx ] . f64 [ f . u . f . start_idx ];
+            break;
+        case sptFloatLongVect:
+            f64 = ( double ) args [ arg_idx ] . flong [ f . u . f . start_idx ];
+            break;
+
+            /* utf-8 character */
+        case sptChar:
+            c = args [ arg_idx ] . c;
+            cvt_len = utf32_utf8 ( text, & text [ sizeof text ], c );
+            if ( cvt_len < 0 )
+            {
+                text [ 0 ] = '?';
+                cvt_len = 1;
+            }
+            StringInit ( & S, text, cvt_len, 1 );
+            break;
+
+            /* NUL-terminated string */
+        case sptNulTermString:
+
+            /* special initialization to flag size/length unknown */
+            StringInit ( & S, args [ arg_idx ] . s, 0, -1 );
+
+            /* IF THE STRING IS INDEXED OR MAY NEED LEFT ALIGNMENT */
+            if ( f . u . f . start_idx != 0 || f . u . f . select_len != 0 ||
+                 ( f . u . f . min_field_width != 0 && f . left_fill ) )
+            {
+                /* precision limits upper bounds
+                   if the index range is more restrictive than precision,
+                   take this as precision for text case */
+                if ( f . u . f . select_len != 0 && f . u . f . select_len < f . u . f . precision )
+                    f . u . f . precision = f . u . f . select_len;
+
+                /* scan to start location */
+                for ( S . len = 0; S . len < f . u . f . start_idx; ++ S . size )
+                {
+                    /* if end of NUL-terminated string is reached before start,
+                       then create EMPTY string */
+                    if ( S . addr [ S . size ] == 0 )
+                    {
+                        f . u . f . start_idx = 0;
+                        f . u . f . select_len = 0;
+                        f . u . f . precision = 0;
+                        break;
+                    }
+                    /* walk across utf-8 multi-byte character */
+                    if ( ( S . addr [ S . size ] & 0xC0 ) != 0x80 )
+                        ++ S . len;
+                }
+
+                /* create sub-string
+                   limit scan to required precision for efficiency */
+                for ( S . addr += S . size, S . size = 0, S . len = 0;
+                      S . len < f . u . f . precision; ++ S . size )
+                {
+                    if ( S . addr [ S . size ] == 0 )
+                        break;
+                    if ( ( S . addr [ S . size ] & 0xC0 ) != 0x80 )
+                        ++ S . len;
+                }
+            }
+
+            /* precision limits text length */
+            if ( text_lim > f . u . f . precision )
+                text_lim = f . u . f . precision;
+
+            break;
+
+            /* String object */
+        case sptString:
+
+            /* the String may be indexed */
+            if ( f . u . f . start_idx != 0 || f . u . f . select_len != 0 )
+            {
+                text_index = true;
+                text_start = f . u . f . start_idx;
+                if ( f . u . f . select_len != 0 )
+                    text_lim = f . u . f . select_len;
+            }
+
+            /* precision limits text length */
+            if ( text_lim > f . u . f . precision )
+                text_lim = f . u . f . precision;
+
+            S = * args [ arg_idx ] . S;
+            if ( S . addr == NULL && S . size == 0 && S . len == 0 )
+                S . addr = "";
+            break;
+
+            /* UCS-2 or UTF-32 String object */
+        case sptUCS2String:
+        case sptUTF32String:
+            return RC ( rcText, rcString, rcConverting, rcType, rcUnsupported );
+
+            /* an object pointer */
+        case sptPointer:
+            p = args [ arg_idx ] . p;
+            break;
+
+        case sptRowId:
+            i64 = args [ arg_idx ] . d;
+            break;
+        case sptRowLen:
+            u64 = args [ arg_idx ] . u;
+            break;
+
+#if SUPPORT_PERCENT_N
+        case sptBytesPrinted:
+            n = args [ arg_idx ] . n;
+            if ( n != NULL )
+                * n = (uint32_t) ( out -> cur + out -> flushed );
+            ++ arg_idx;
+            continue;
+#endif
+        default:
+            return RC ( rcText, rcString, rcConverting, rcType, rcUnrecognized );
+        }
+
+        if ( f . type_cast ) switch ( f . type )
+        {
+        case sptSignedInt:
+        case sptSignedInt8Vect:
+        case sptSignedInt16Vect:
+        case sptSignedInt32Vect:
+        case sptSignedInt64Vect:
+            f64 = (double) i64;
+            break;
+
+        case sptUnsignedInt:
+        case sptUnsignedInt8Vect:
+        case sptUnsignedInt16Vect:
+        case sptUnsignedInt32Vect:
+        case sptUnsignedInt64Vect:
+            f64 = (double) u64;
+            break;
+
+        case sptFloat:
+        case sptFloat32Vect:
+        case sptFloat64Vect:
+        case sptFloatLongVect:
+            i64 = (int64_t) f64;
+            break;
+
+        case sptChar:
+        case sptNulTermString:
+        case sptString:
+            break;
+
+            /* UCS-2 or UTF-32 String object */
+        case sptUCS2String:
+        case sptUTF32String:
+        case sptPointer:
+            return RC ( rcText, rcString, rcConverting, rcType, rcUnsupported );
+
+        case sptRowId:
+            f64 = (double) i64;
+            break;
+        case sptRowLen:
+            f64 = (double) u64;
+            break;
+
+#if SUPPORT_PERCENT_N
+        case sptBytesPrinted:
+            break;
+#endif
+        default:
+            return RC ( rcText, rcString, rcConverting, rcType, rcUnrecognized );
+        }
+
+        /* advance arg count */
+        ++ arg_idx;
+
+        /* initialize engine params */
+        sign_char = 0;
+        comma_sep = false;
+        left_pad = prefix_len = prefix_contribution = zero_fill = 0;
+
+        /* format */
+        switch ( f . fmt )
+        {
+        case spfNone:
+        case spfText:
+            break;
+
+        case spfSignedInt:
+            if ( i64 < 0 )
+            {
+                sign_char = '-';
+                u64 = - i64;
+            }
+            else
+            {
+                sign_char = f . sign;
+                u64 = i64;
+            }
+            f . add_prefix = 0;
+            /* no break */
+        case spfUnsigned:
+            to_numeral = alnum_set [ f . reverse_alnum ] [ f . upper_case_num ];
+
+            if ( f . radix > 36 )
+                f . radix = 10;
+
+            i = sizeof text;
+#if _DEBUGGING
+            text [ -- i ] = 0;
+#endif
+            /* record if we are comma separating below */
+            comma_sep = f . thousands_separate;
+
+#if DOUSE_NUM_PREFIX_IF_ZERO
+            if ( u64 == 0 && f . add_prefix )
+            {
+#if KEEP_OCT_PREFIX_IF_ZERO
+                if ( f . u . f . precision == 0 && f . radix == 8 )
+                    f . u . f . precision = 1;
+#endif
+                f . add_prefix = 0;
+            }
+#endif
+            /* special case for value 0 and precision 0 */
+            if ( u64 != 0 || f . u . f . precision != 0 )
+            {
+                /* convert numeral */
+                do
+                    text [ -- i ] = to_numeral [ u64 % f . radix ];
+                while ( ( u64 /= f . radix ) != 0 );
+
+                /* add prefix to unsigned numeral */
+                if ( f . add_prefix )
+                {
+                    switch ( f . radix )
+                    {
+                    case 2:
+                        memmove ( prefix, "0b", prefix_len = 2 );
+                        break;
+                    case 8:
+                        memmove ( prefix, "0", prefix_len = prefix_contribution = 1 );
+#if OCTAL_PREFIX_COUNTS_TOWARD_PRECISION
+                        if ( f . add_prefix && f . u . f . precision != 0 )
+                            -- f . u . f . precision;
+#endif
+                        break;
+                    case 16:
+#if HEX_PREFIX_FOLLOWS_CASE
+                        if ( to_numeral [ 10 ] == 'A' )
+                            memmove ( prefix, "0X", prefix_len = 2 );
+                        else
+#endif
+                            memmove ( prefix, "0x", prefix_len = 2 );
+                        break;
+                    }
+                }
+            }
+
+            /* determine length in characters, also size in bytes */
+#if _DEBUGGING
+            int_len = sizeof text - i - 1;
+#else
+            int_len = sizeof text - i;
+#endif
+            /* create text string */
+            StringInit ( & S, & text [ i ], int_len, int_len );
+
+            /* zero-fill amount */
+            if ( f . u . f . precision > ( uint64_t ) int_len )
+                zero_fill = ( uint32_t ) ( f . u . f . precision - ( uint64_t ) int_len );
+            else if ( f . left_fill == '0' )
+            {
+                /* the known characters associated with integer */
+                dst_len = int_len + prefix_len + ( sign_char != 0 );
+                if ( comma_sep && int_len != 0 )
+                    dst_len += ( int_len + prefix_contribution - 1 ) / 3;
+                if ( ( uint64_t ) dst_len < f . u . f . min_field_width )
+                {
+                    /* determine the numeric width, including zero padding */
+                    dst_len = ( uint32_t ) f . u . f . min_field_width -
+                        prefix_len + prefix_contribution - ( sign_char != 0 );
+                    if ( comma_sep && int_len != 0 )
+                    {
+                        /* desired numeric-only portion of field is "dst_len"
+                           it will be extended not only by some number of '0's,
+                           but will be sprinkled with commas.
+
+                           if "x" were our number of numerals, then:
+                             x + ( x - 1 ) / 3 = dst_len
+                           with allowances for integer math. solving for x:
+                             x = ( 3 * dst_len + 3 ) / 4
+
+                           for example: given int_len = 1, value = 0:
+                             dst_len =  1 : x =  1
+                             dst_len =  2 : x =  2
+                             dst_len =  3 : x =  3
+                             dst_len =  4 : x =  3 [ requires special compensation ]
+                             dst_len =  5 : x =  4
+                             dst_len =  6 : x =  5
+                             dst_len =  7 : x =  6
+                             dst_len =  8 : x =  6 [ requires special compensation ]
+                                . . .
+                             dst_len = 19 : x = 15
+                             dst_len = 20 : x = 15
+                             dst_len = 21 : x = 16
+                             dst_len = 22 : x = 17
+                        */
+
+                        /* apply compensation for impossible width */
+                        if ( ( dst_len & 3 ) == 0 )
+                            ++ left_pad;
+
+                        /* dst_len now becomes the number of numerals */
+                        dst_len = ( dst_len * 3 + 3 ) >> 2;
+                    }
+
+                    /* number of zeros to add */
+                    zero_fill = dst_len - int_len;
+                    prefix_len -= prefix_contribution;
+                }
+            }
+
+            break;
+
+            /* TEMPORARY - cheat by calling through to runtime sprintf
+               this needs to be implemented to handle thousands separation */
+        case spfStdFloat:
+            c = 'f';
+        fmt_float:
+            sign_char = f . sign;
+            if ( f64 < 0 )
+            {
+                sign_char = '-';
+                f64 = - f64;
+            }
+
+            ffmt [ i = 0 ] = '%';
+            if ( f . force_decimal_point )
+                ffmt [ ++ i ] = '#';
+            if ( f . u . f . precision > 20 )
+                f . u . f . precision = 20;
+            sprintf ( & ffmt [ ++ i ], ".%u%c"
+                      , ( uint32_t ) f . u . f . precision
+                      , ( char ) c );
+            cvt_len = snprintf ( text, sizeof text, ffmt, f64 );
+            assert ( cvt_len >= 0 && ( size_t ) cvt_len < sizeof text );
+            StringInit ( & S, text, cvt_len, cvt_len );
+
+            /* record if we are comma separating below and capture length of integer portion */
+            int_len = 0;
+            comma_sep = f . thousands_separate;
+            /* if ( comma_sep ) */
+            {
+                for ( ; isdigit ( text [ int_len ] ); ++ int_len )
+                    ( void ) 0;
+            }
+
+            /* zero-fill amount */
+            if ( f . left_fill == '0' )
+            {
+                /* the known characters associated with numeral */
+                dst_len = cvt_len + ( sign_char != 0 );
+                if ( comma_sep && int_len != 0 )
+                    dst_len += ( int_len - 1 ) / 3;
+                if ( ( uint64_t ) dst_len < f . u . f . min_field_width )
+                {
+                    /* determine the integer width, including zero padding */
+                    dst_len = ( uint32_t ) f . u . f . min_field_width -
+                        cvt_len + int_len - ( sign_char != 0 );
+                    if ( comma_sep && int_len != 0 )
+                    {
+                        /* SEE COMMENTS IN INTEGER SECTION */
+
+                        /* apply compensation for impossible width */
+                        if ( ( dst_len & 3 ) == 0 )
+                            ++ left_pad;
+
+                        /* dst_len now becomes the number of numerals */
+                        dst_len = ( dst_len * 3 + 3 ) >> 2;
+                    }
+
+                    /* number of zeros to add */
+                    zero_fill = dst_len - int_len;
+                }
+            }
+            break;
+
+        case spfGenFloat:
+            c = 'g';
+            goto fmt_float;
+
+        case spfSciFloat:
+            c = 'e';
+            goto fmt_float;
+
+            /* version */
+        case spfVersion:
+
+            if ( f . min_vers_components )
+            {
+                if ( ( u64 & 0xFFFF ) != 0 )
+                    f . u . f . precision = 3;
+                else if ( ( u64 & 0xFF0000 ) != 0 )
+                    f . u . f . precision = 2;
+                else
+                    f . u . f . precision = 1;
+            }
+
+            switch ( f . u . f . precision )
+            {
+            case 0:
+                cfmt = "";
+                break;
+            case 1:
+                cfmt = "%u";
+                break;
+            case 2:
+                cfmt = "%u.%u";
+                break;
+            default:
+                cfmt = "%u.%u.%u";
+            }
+
+            dst_len = sprintf ( text, cfmt
+                                , VersionGetMajor ( ( uint32_t ) u64 )
+                                , VersionGetMinor ( ( uint32_t ) u64 )
+                                , VersionGetRelease ( ( uint32_t ) u64 )
+                );
+            StringInit ( & S, text, dst_len, dst_len );
+            f . u . f . precision = dst_len;
+            break;
+
+        case spfSymbol:
+
+            /* calculate total size of symbol */
+            for ( N = p, S = N -> name, N = N -> dad; N != NULL; N = N -> dad )
+            {
+                S . len += N -> name . len + 1;
+                S . size += N -> name . size + 1;
+            }
+
+            /* mark need to recheck format */
+            S . addr = NULL;
+            break;
+
+
+        case spfTime:
+
+            tm = p;
+
+            dst_len = 0;
+            if ( f . print_date )
+            {
+                static char const *months [ 12 ] =
+                    { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+                if ( f . print_weekday )
+                {
+                    static char const *weekdays [ 7 ] =
+                        { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
+                    dst_len = sprintf ( text, "%s %s %u %u"
+                                        , weekdays [ tm -> weekday ]
+                                        , months [ tm -> month ]
+                                        , tm -> day + 1
+                                        , tm -> year
+                        );
+                }
+                else
+                {
+                    dst_len = sprintf ( text, "%s %u %u"
+                                        , months [ tm -> month ]
+                                        , tm -> day + 1
+                                        , tm -> year
+                        );
+                }
+            }
+
+            if ( f . print_time )
+            {
+                if ( dst_len != 0 )
+                    text [ dst_len ++ ] = ' ';
+
+                if ( f . hour_24 )
+                {
+                    dst_len += sprintf ( & text [ dst_len ]
+                                         , f . left_fill == '0' ? "%02u:%02u:%02u" : "%u:%02u:%02u"
+                                         , tm -> hour
+                                         , tm -> minute
+                                         , tm -> second
+                        );
+                }
+                else
+                {
+                    dst_len += sprintf ( & text [ dst_len ]
+                                         , f . left_fill == '0' ? "%02u:%02u:%02u %cM" : "%u:%02u:%02u %cM"
+                                         , ( tm -> hour + 11 ) % 12 + 1
+                                         , tm -> minute
+                                         , tm -> second
+                                         , ( tm -> hour < 12 ) ? 'A' : 'P'
+                        );
+                }
+
+                if ( f . print_timezone )
+                {
+                    dst_len += sprintf ( & text [ dst_len ]
+                                         , " %+02d"
+                                         , tm -> tzoff / 60
+                        );
+                }
+            }
+
+            StringInit ( & S, text, dst_len, dst_len );
+            break;
+
+        case spfRC:
+            dst_len = (uint32_t) KWrtFmt_rc_t ( text, sizeof text, f . explain_rc ? "#" : "", ( rc_t ) u64 );
+            StringInit ( & S, text, dst_len, dst_len );
+            break;
+
+        case spfOSErr:
+            dst_len = (uint32_t) KWrtFmt_error_code ( text, sizeof text, ( int ) i64 );
+            StringInit ( & S, text, dst_len, dst_len );
+            break;
+
+        default:
+            return RC ( rcText, rcString, rcConverting, rcFormat, rcUnrecognized );
+        }
+
+        /* at this point, we have text in "S".
+           if the text pointer is NULL, it will need to be further processed.
+           if the text size is 0 but the length is not, then we may need to measure string.
+        */
+
+        /* apply index limitation */
+        if ( text_index )
+        {
+            assert ( S . addr != NULL );
+            assert ( S . size != 0 || S . len == 0 );
+            if ( StringSubstr ( & S, & S, ( uint32_t ) text_start, ( uint32_t ) text_lim ) == NULL )
+                StringInit ( & S, "", 0, 0 );
+        }
+
+        /* determine overall width of substitution so far */
+        dst_len = left_pad + ( sign_char != 0 ) + prefix_len + zero_fill + S . len;
+
+        /* if there are comma insertions, get those, too */
+        if ( comma_sep && ( int_len != 0 || zero_fill != 0 ) )
+            dst_len += ( int_len + zero_fill - 1 ) / 3;
+
+        /* calculate remaining left padding */
+        if ( f . left_fill != 0 && f . u . f . min_field_width > dst_len )
+        {
+            assert ( S . size != 0 || S . len == 0 );
+            left_pad += ( uint32_t ) ( f . u . f . min_field_width ) - dst_len;
+            dst_len = ( uint32_t ) f . u . f . min_field_width;
+        }
+
+        /* left padding */
+        if ( left_pad != 0 )
+        {
+            rc = print_padding ( out, left_pad, f . left_fill );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        /* output sign or prefix */
+        if ( sign_char != 0 )
+        {
+            rc = print_padding ( out, 1, sign_char );
+            if ( rc != 0 )
+                return rc;
+        }
+        else if ( prefix_len != 0 )
+        {
+            rc = write_buffer ( out, prefix, prefix_len );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        /* output comma-separated numeral */
+        if ( comma_sep && ( zero_fill != 0 || int_len != 0 ) )
+        {
+            uint32_t pos = zero_fill + int_len;
+            uint32_t chunk = ( pos - 1 ) % 3 + 1;
+
+            for ( i = 0, pos -= chunk; chunk > 0; -- chunk )
+            {
+                if ( zero_fill != 0 )
+                {
+                    rc = print_padding ( out, 1, '0' );
+                    -- zero_fill;
+                }
+                else
+                {
+                    rc = print_padding ( out, 1, S . addr [ i ] );
+                    ++ i;
+                }
+                if ( rc != 0 )
+                    return rc;
+            }
+
+            assert ( pos % 3 == 0 );
+            for ( pos /= 3; pos != 0; -- pos )
+            {
+                rc = print_padding ( out, 1, ',' );
+                if ( rc != 0 )
+                    return rc;
+
+                if ( zero_fill != 0 )
+                {
+                    if ( zero_fill >= 3 )
+                    {
+                        rc = print_padding ( out, 3, '0' );
+                        zero_fill -= 3;
+                    }
+                    else
+                    {
+                        rc = print_padding ( out, zero_fill, '0' );
+                        if ( rc == 0 )
+                            rc = write_buffer ( out, S . addr, 3 - zero_fill );
+                        i += 3 - zero_fill;
+                        zero_fill = 0;
+                    }
+                }
+                else
+                {
+                    rc = write_buffer ( out, & S . addr [ i ], 3 );
+                    i += 3;
+                }
+
+                if ( rc != 0 )
+                    return rc;
+            }
+
+            rc = write_buffer ( out, & S . addr [ i ], S . len - i );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        /* output numeral with zero fill */
+        else if ( zero_fill != 0 )
+        {
+            rc = print_padding ( out, zero_fill, '0' );
+            if ( rc == 0 )
+                rc = print_string ( out, & S, text_lim );
+        }
+
+        /* output NUL-terminated string */
+        else if ( S . size == 0 && S . len != 0 )
+        {
+            assert ( f . left_fill == 0 || f . u . f . min_field_width == 0 );
+            rc = print_nul_term_string ( out, & S, text_lim );
+            dst_len = S . len;
+        }
+
+        /* output KSymbol */
+        else if ( S . addr == NULL )
+        {
+            rc = print_symbol ( out, p );
+        }
+
+        /* output anything else in a String */
+        else
+        {
+            rc = print_string ( out, & S, text_lim );
+        }
+
+        /* recover from error */
+        if ( rc != 0 )
+            return rc;
+
+        /* apply right padding */
+        if ( f . u . f . min_field_width > dst_len )
+        {
+            rc = print_padding ( out, f . u . f . min_field_width - dst_len, ' ' );
+            if ( rc != 0 )
+                return rc;
+        }
+    }
+
+    rc = flush_buffer ( out );
+
+    if ( rc == 0 && out -> overflow )
+        rc = RC ( rcText, rcString, rcConverting, rcBuffer, rcInsufficient );
+
+    return rc;
+}
+
+
+/* structured_printf
+ *  uses constant format descriptors and argument block
+ *  prints to "out" handler
+ */
+LIB_EXPORT rc_t CC structured_printf ( const KWrtHandler *handler,
+    size_t *num_writ, const PrintFmt *fmt, const PrintArg *args )
+{
+    if ( handler != NULL )
+    {
+        rc_t rc;
+        char buff [ 4096 ];
+
+        KBufferedWrtHandler out;
+        out . handler = handler;
+        out . buff = buff;
+        out . bsize = sizeof buff;
+
+        rc = structured_print_engine ( & out, fmt, args );
+
+        if ( num_writ != NULL )
+            * num_writ = out . cur + out . flushed;
+
+        return rc;
+    }
+
+    if ( num_writ != NULL )
+        * num_writ = 0;
+
+    return RC ( rcRuntime, rcString, rcConverting, rcFile, rcNull );
+}
+
+
+/* structured_sprintf
+ *  uses constant format descriptors and argument block
+ *  prints to UTF-8 character buffer "dst"
+ */
+LIB_EXPORT rc_t CC structured_sprintf ( char *dst, size_t bsize,
+    size_t *num_writ, const PrintFmt *fmt, const PrintArg *args )
+{
+    if ( dst != NULL || bsize == 0 )
+    {
+        rc_t rc;
+
+        KBufferedWrtHandler out;
+        out . handler = NULL;
+        out . buff = dst;
+        out . bsize = bsize;
+
+        rc = structured_print_engine ( & out, fmt, args );
+
+        if ( num_writ != NULL )
+            * num_writ = out . cur + out . flushed;
+
+        return rc;
+    }
+
+    if ( num_writ != NULL )
+        * num_writ = 0;
+
+    return RC ( rcRuntime, rcString, rcConverting, rcBuffer, rcNull );
+}
+
+
+/* string_printf
+ *  provides a facility similar to snprintf
+ *
+ *  "dst" [ OUT ] and "bsize" [ IN ] - output buffer for string
+ *  will be NUL-terminated if possible
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - returns the number of non-NUL bytes
+ *  written to "dst" or the required "bsize" to complete successfully,
+ *  not including the NUL termination.
+ *
+ *  "fmt" [ IN ] and "args" [ IN, OPTIONAL ] - data to write
+ *
+ *  returns 0 if all bytes were successfully written and a NUL-byte was
+ *  written into the buffer.
+ *
+ *  returns rcBuffer, rcInsufficient if the buffer was too small. in this
+ *  case, it is possible that the only missing byte would be the NUL
+ *  termination, and the output string may still be usable since "num_writ"
+ *  indicates the actual number of text bytes.
+ */
+LIB_EXPORT rc_t CC new_string_vprintf ( char *dst, size_t bsize,
+    size_t *num_writ, const char *fmt_str, va_list vargs )
+{
+    rc_t rc;
+
+    String str [ 64 ], * strp = str;
+    PrintFmt fmt [ 64 ], * fmtp = fmt;
+    PrintArg args [ 64 ], * argp = args;
+
+    KDataBuffer overflow;
+
+    size_t dummy;
+    if ( num_writ == NULL )
+        num_writ = & dummy;
+
+    * num_writ = 0;
+
+    rc = parse_format_string ( fmt_str, vargs,
+        & strp, & fmtp, & argp, & overflow );
+
+    if ( rc == 0 )
+        rc = structured_sprintf ( dst, bsize, num_writ, fmtp, argp );
+
+    if ( strp != str )
+        KDataBufferWhack ( & overflow );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC new_string_printf ( char *dst, size_t bsize,
+    size_t *num_writ, const char *fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+
+    rc = new_string_vprintf ( dst, bsize, num_writ, fmt, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC new_vkfprintf ( const KWrtHandler *out,
+    size_t *num_writ, const char *fmt_str, va_list vargs )
+{
+    rc_t rc;
+
+    String str [ 64 ], * strp = str;
+    PrintFmt fmt [ 64 ], * fmtp = fmt;
+    PrintArg args [ 64 ], * argp = args;
+
+    KDataBuffer overflow;
+
+    size_t dummy;
+    if ( num_writ == NULL )
+        num_writ = & dummy;
+
+    * num_writ = 0;
+
+    rc = parse_format_string ( fmt_str, vargs,
+        & strp, & fmtp, & argp, & overflow );
+
+    if ( rc == 0 )
+        rc = structured_printf ( out, num_writ, fmtp, argp );
+
+    if ( strp != str )
+        KDataBufferWhack ( & overflow );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC new_kfprintf ( const KWrtHandler *out,
+    size_t *num_writ, const char *fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+
+    rc = new_vkfprintf ( out, num_writ, fmt, args );
+        
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KDataBufferVPrintf ( KDataBuffer * buf, const char * fmt, va_list args )
+{
+    rc_t rc;
+
+    if ( buf == NULL )
+        rc = RC ( rcText, rcString, rcFormatting, rcBuffer, rcNull );
+    else if ( fmt == NULL )
+        rc = RC ( rcText, rcString, rcFormatting, rcParam, rcNull );
+    else if ( fmt [ 0 ] == 0 )
+        rc = RC ( rcText, rcString, rcFormatting, rcParam, rcEmpty );
+    else
+    {
+        size_t bsize;
+        char *buffer;
+        size_t content;
+        size_t num_writ;
+
+        /* the C library ruins a va_list upon use
+           in case we ever need to use it a second time,
+           make a copy first */
+        va_list args_copy;
+        va_copy ( args_copy, args );
+
+        /* begin to calculate content and bsize */
+        content = ( size_t ) buf -> elem_count;
+
+        /* check for an empty buffer */
+        if ( content == 0 )
+        {
+            /* detect buffers initialized by memset */
+            if ( buf -> elem_bits == 0 )
+                buf -> elem_bits = 8;
+
+            rc = KDataBufferResize ( buf, bsize = 4096 );
+            if ( rc != 0 )
+                return rc;
+        }
+        else
+        {
+            /* generate even multiple of 4K */
+            bsize = ( content + 4095 ) & ~ ( size_t ) 4095;
+
+            /* discount NUL byte */
+            content -= 1;
+        }
+            
+        /* convert the 2-part url into a flat string */
+        buffer = buf -> base;
+        rc = string_vprintf ( &buffer [ content ], bsize - content, & num_writ, fmt, args );
+        /* Make sure there is enough room to store data including NUL */
+        if ( rc != 0 || ( content + num_writ ) == bsize )
+        {
+            bsize = ( content + num_writ + 4095 + 1 ) & ~ ( size_t ) 4095;
+            rc = KDataBufferResize ( buf, bsize );
+            if ( rc == 0 )
+            {
+                /* try again with the newly sized buffer */
+                rc = string_vprintf ( &buffer [ content ], bsize - content, & num_writ, fmt, args_copy );
+            }
+        }
+        va_end ( args_copy );
+    
+        /* size down to bsize + NUL */
+        if ( rc == 0 )
+            KDataBufferResize ( buf, content + num_writ + 1 );
+    }
+
+    return rc;
+}
+
+/* forward to KDataBufferVPrintf */
+LIB_EXPORT rc_t CC KDataBufferPrintf ( KDataBuffer * buf, const char * fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+    rc = KDataBufferVPrintf ( buf, fmt, args );
+    va_end ( args );
+
+    return rc;
+}
diff --git a/libs/klib/progressbar.c b/libs/klib/progressbar.c
new file mode 100644
index 0000000..2c9cbf2
--- /dev/null
+++ b/libs/klib/progressbar.c
@@ -0,0 +1,160 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/rc.h>
+#include <klib/out.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+
+typedef struct progressbar
+{
+	uint32_t percent;
+    bool initialized;
+	uint8_t digits;
+} progressbar;
+
+
+LIB_EXPORT rc_t CC make_progressbar( progressbar ** pb, const uint8_t digits )
+{
+	rc_t rc = 0;
+    if ( pb == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+	else
+	{
+		progressbar	* p = calloc( 1, sizeof( *p ) );
+		if ( p == NULL )
+			rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+		else
+		{
+			if ( digits > 2 )
+				p -> digits = 2;
+			else
+				p -> digits = digits;
+			*pb = p;
+		}
+	}
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC destroy_progressbar( progressbar * pb )
+{
+    if ( pb == NULL )
+        return RC( rcVDB, rcNoTarg, rcDestroying, rcSelf, rcNull );
+    free( pb );
+    return 0;
+}
+
+
+static void progess_0a( const uint16_t percent )
+{
+    KOutMsg( "| %2u%%", percent );
+}
+
+
+static void progess_0( const uint16_t percent )
+{
+    if ( percent & 1 )
+        KOutMsg( "\b\b\b\b- %2u%%", percent );
+    else
+        KOutMsg( "\b\b\b%2u%%", percent );
+}
+
+
+static void progess_1a( const uint16_t percent )
+{
+    uint16_t p1 = percent / 10;
+    uint16_t p0 = percent - ( p1 * 10 );
+    KOutMsg( "| %2u.%01u%%", p1, p0 );
+}
+
+
+static void progess_1( const uint16_t percent )
+{
+    uint16_t p1 = percent / 10;
+    uint16_t p0 = percent - ( p1 * 10 );
+    if ( ( p1 & 1 )&&( p0 == 0 ) )
+        KOutMsg( "\b\b\b\b\b\b- %2u.%01u%%", p1, p0 );
+    else
+        KOutMsg( "\b\b\b\b\b%2u.%01u%%", p1, p0 );
+}
+
+
+static void progess_2a( const uint16_t percent )
+{
+    uint16_t p1 = percent / 100;
+    uint16_t p0 = percent - ( p1 * 100 );
+    KOutMsg( "| %2u.%02u%%", p1, p0 );
+}
+
+
+static void progess_2( const uint16_t percent )
+{
+    uint16_t p1 = percent / 100;
+    uint16_t p0 = percent - ( p1 * 100 );
+    if ( ( p1 & 1 )&&( p0 == 0 ) )
+        KOutMsg( "\b\b\b\b\b\b\b- %2u.%02u%%", p1, p0 );
+    else
+        KOutMsg( "\b\b\b\b\b\b%2u.%02u%%", p1, p0 );
+}
+
+
+LIB_EXPORT rc_t CC update_progressbar( progressbar * pb, const uint32_t percent )
+{
+	rc_t rc = 0;
+    if ( pb == NULL )
+        rc = RC( rcVDB, rcNoTarg, rcParsing, rcSelf, rcNull );
+	else
+	{
+		if ( pb->initialized )
+		{
+			if ( pb->percent != percent )
+			{
+				pb->percent = percent;
+				switch( pb -> digits )
+				{
+					case 0 : progess_0( percent ); break;
+					case 1 : progess_1( percent ); break;
+					case 2 : progess_2( percent ); break;
+				}
+			}
+		}
+		else
+		{
+			pb->percent = percent;
+			switch( pb -> digits )
+			{
+				case 0 : progess_0a( percent ); break;
+				case 1 : progess_1a( percent ); break;
+				case 2 : progess_2a( percent ); break;
+			}
+			pb->initialized = true;
+		}
+	}
+    return rc;
+}
diff --git a/libs/klib/ptpersist.c b/libs/klib/ptpersist.c
new file mode 100644
index 0000000..64f9e13
--- /dev/null
+++ b/libs/klib/ptpersist.c
@@ -0,0 +1,1121 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "trie-priv.h"
+#include "pbstree-priv.h"
+#include <klib/container.h>
+#include <klib/sort.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#if _DEBUGGING
+#define DEBUGPRINT 0
+#endif
+
+/*--------------------------------------------------------------------------
+ * private declarations
+ */
+typedef struct IdxMap IdxMap;
+struct IdxMap
+{
+    uint32_t freq;
+    uint32_t idx;
+    uint32_t ch;
+};
+
+static
+int64_t CC IdxMapSort ( const void *left, const void *right, void *ignore )
+{
+#define a ( ( const IdxMap* ) left )
+#define b ( ( const IdxMap* ) right )
+
+    if ( b -> freq != a -> freq )
+        return ( int64_t ) b -> freq - ( int64_t ) a -> freq;
+    return ( int64_t ) a -> idx - ( int64_t ) b -> idx;
+
+#undef a
+#undef b
+}
+
+typedef struct PTChildNode PTChildNode;
+struct PTChildNode
+{
+    SLNode n;
+    const TTrans *trans;
+    uint32_t dad;
+    uint16_t idx;
+};
+
+static
+void CC PTChildNodeWhack ( SLNode *n, void *ignore )
+{
+    free ( n );
+}
+
+typedef struct PTriePersistData PTriePersistData;
+struct PTriePersistData
+{
+    PTWriteFunc write;
+    void *write_param;
+
+    PTAuxFunc aux;
+    void *aux_param;
+
+    PTAuxFunc null_write;
+    PTAuxFunc live_write;
+
+    IdxMap *idx_map;
+    size_t *trans_map;
+
+    void ( CC * record_idx ) ( void*, uint32_t, uint32_t );
+    void ( CC * record_trans ) ( void*, uint32_t, uint32_t );
+
+    union
+    {
+        uint8_t *v8;
+        uint16_t *v16;
+        uint32_t *v32;
+
+    } idx_seq;
+
+    uint8_t *child_seq_type;
+
+    union
+    {
+        uint8_t *v8;
+        uint16_t *v16;
+        uint32_t *v32;
+
+    } backtrace;
+
+    union
+    {
+        uint8_t *v8;
+        uint16_t *v16;
+        uint32_t *v32;
+
+    } trans_seq;
+
+    size_t data_size;
+
+    uint32_t num_nodes;
+    uint32_t max_nodes;
+
+    uint32_t num_trans;
+    uint32_t trans_id;
+    uint32_t child_id;
+
+    uint32_t min_width;
+    uint32_t depth;
+
+    rc_t rc;
+
+    uint8_t idx_size;
+    uint8_t trans_size;
+    uint8_t off_size;
+};
+
+static
+rc_t CC PTAlign ( PTriePersistData *pb, size_t *offset,
+    uint32_t size, uint32_t first_byte )
+{
+    rc_t rc;
+
+    union
+    {
+        uint8_t u8 [ 4 ];
+        uint32_t u32;
+    } u;
+    size_t to_write, num_writ;
+
+    int align = (int)( offset [ 0 ] & ( size - 1 ) );
+    if ( align == 0 )
+        return 0;
+
+#if DEBUGPRINT
+    fprintf(stderr, "PTAlign called.\n");
+#endif
+
+
+    to_write = size - align;
+
+    u . u32 = 0;
+    u . u8 [ 0 ] = ( uint8_t ) first_byte;
+
+    num_writ = 0;
+    rc = ( * pb -> write ) ( pb -> write_param, u . u8, to_write, & num_writ );
+
+    * offset += num_writ;
+
+    if ( rc != 0 )
+        return rc;
+    if ( num_writ != to_write )
+        return RC ( rcCont, rcTrie, rcPersisting, rcTransfer, rcIncomplete );
+    return 0;
+}
+
+static
+rc_t CC TNodeDataSize ( void *param, const void *n, size_t *num_writ,
+    PTWriteFunc write, void *write_param )
+{
+    PTriePersistData *pb = param;
+    rc_t rc = ( * pb -> aux ) ( pb -> aux_param, n, num_writ, write, write_param );
+    if ( rc == 0 )
+    {
+        String str;
+        const TNode *keynode = n;
+        if ( StringSubstr ( & keynode -> key, & str, pb -> depth, 0 ) == NULL )
+            * num_writ += 1;
+        else
+            * num_writ += str . size + 1;
+    }
+    return rc;
+}
+
+static
+rc_t CC TNodeWrite ( void *param, const void *n, size_t *num_writ,
+    PTWriteFunc write, void *write_param )
+{
+    PTriePersistData *pb = param;
+    const TNode *keynode = n;
+
+    rc_t rc;
+    String str;
+
+#if DEBUGPRINT
+    fprintf(stderr, "TNodeWrite called.\n");
+#endif
+
+
+    if ( write == NULL )
+        return TNodeDataSize ( param, n, num_writ, write, write_param );
+
+    /* TBD - find out why string is written with pb->write and NUL is written with write
+       they should be the same, and so the entire NUL terminated string should be done at once */
+    if ( StringSubstr ( & keynode -> key, & str, pb -> depth, 0 ) != NULL )
+        rc = ( * pb -> write ) ( pb -> write_param, str . addr, str . size, num_writ );
+    else
+    {
+        rc = 0;
+        * num_writ = 0;
+    }
+    if ( rc == 0 )
+    {
+        size_t writ;
+        char term [ 1 ];
+
+        term [ 0 ] = 0;
+        rc = ( * write ) ( write_param, term, 1, & writ );
+        if ( rc == 0 )
+        {
+            * num_writ += writ;
+            if ( writ != 1 )
+                return -1; /*AK: TODO is it correct?*/
+
+            writ = 0;
+            rc = ( * pb -> aux ) ( pb -> aux_param, n, & writ, write, write_param );
+            * num_writ += writ;
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t CC NullWrite ( void *param, const void *buffer, size_t bytes, size_t *num_writ )
+{
+    * num_writ = bytes;
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * TTrans
+ */
+static
+void CC TTransCountNodes ( BSTNode *n, void *data )
+{
+    /* count node */
+    ++ ( * ( uint32_t* ) data );
+}
+
+static
+void CC TTransCountTrans ( const TTransBacktrace *bt, uint32_t width, void *data )
+{
+    PTriePersistData *pb = data;
+    const TTrans *trans = bt -> trans;
+
+    /* count transition node */
+    ++ pb -> num_trans;
+
+    /* count value nodes */
+    if ( trans -> vals . root != NULL )
+    {
+        uint32_t num_nodes = 0;
+        BSTreeForEach ( & trans -> vals, 0, TTransCountNodes, & num_nodes );
+
+        /* accumulate into overall counter */
+        pb -> num_nodes += num_nodes;
+
+        /* record max */
+        if ( num_nodes > pb -> max_nodes )
+            pb -> max_nodes = num_nodes;
+    }
+
+    /* analyze child transition array and character set */
+    if ( trans -> child != NULL )
+    {
+        uint32_t i;
+        for ( i = 0; i < width; ++ i )
+        {
+            if ( trans -> child [ i ] != NULL )
+                ++ pb -> idx_map [ i ] . freq;
+        }
+    }
+}
+
+static
+void CC TTransRecordU8 ( void *buffer, uint32_t idx, uint32_t val )
+{
+    ( ( uint8_t* ) buffer ) [ idx ] = ( uint8_t ) val;
+}
+
+static
+void CC TTransRecordU16 ( void *buffer, uint32_t idx, uint32_t val )
+{
+    ( ( uint16_t* ) buffer ) [ idx ] = ( uint16_t ) val;
+}
+
+static
+void CC TTransRecordU32 ( void *buffer, uint32_t idx, uint32_t val )
+{
+    ( ( uint32_t* ) buffer ) [ idx ] = ( uint32_t ) val;
+}
+
+static
+bool CC TTransPersist1 ( const TTrans *trans, PTriePersistData *pb,
+    uint32_t tid, uint32_t dad, uint16_t idx, SLList *sl,
+    uint32_t *icntp, uint32_t *slenp, uint32_t *tcntp )
+{
+    uint32_t icnt, slen, tcnt;
+
+    void ( CC * record_idx ) ( void*, uint32_t, uint32_t ) = pb -> record_idx;
+    void ( CC * record_trans ) ( void*, uint32_t, uint32_t ) = pb -> record_trans;
+
+#if DEBUGPRINT
+    fprintf(stderr, "TTransPersist1 called.\n");
+#endif
+
+
+    /* set up header */
+#if RECORD_HDR_IDX
+#if DEBUGPRINT
+    fprintf(stderr, "Recording header index %d, %d\n", pttHdrIdx, idx);
+#endif
+    /* zero-based character code of transition */
+    ( * record_idx ) ( pb -> idx_seq . v8, pttHdrIdx, idx );
+#endif
+#if RECORD_HDR_DEPTH
+#if DEBUGPRINT
+    fprintf(stderr, "Recording header depth %d, %d\n", pttHdrDepth, trans->depth);
+#endif
+    /* node depth */
+    ( * record_idx ) ( pb -> idx_seq . v8, pttHdrDepth, trans -> depth );
+#endif
+    /* the number of transitions; in child array or in vals btree */
+    ( * record_idx ) ( pb -> idx_seq . v8, pttHdrTransCnt, trans -> tcnt );
+
+    /* record one-based parent backtrace */
+    if ( pb -> backtrace . v8 != NULL )
+        ( * record_trans ) ( pb -> backtrace . v8, 0, dad );
+
+    /* record child transition table */
+    if ( trans -> child == NULL )
+    {
+        /* no sequence or indices beyond header */
+        icnt = slen = tcnt = 0;
+        ( * record_idx ) ( pb -> idx_seq . v8, pttHdrIdxCnt, 0 );
+    }
+    else
+    {
+        uint32_t i;
+
+        /* set all index entries to simple type
+           the working array is large enough to hold
+           one bit per character code */
+        memset ( pb -> child_seq_type, 0, ( pb -> min_width + 7 ) >> 3 );
+
+        /* walk child array:
+           i    => zero-based character code and
+                   indirect index into trans.child
+           tcnt => persisted child index and counter
+           icnt => idx index and counter
+           slen => child_seq_type index and counter */
+        for ( tcnt = icnt = slen = i = 0; i < pb -> min_width; ++ i )
+        {
+            PTChildNode *n;
+
+            /* look only at valid transitions
+               notice that i, which represents the new character code,
+               is first mapped to an old character code */
+            if ( trans -> child [ pb -> idx_map [ i ] . idx ] != NULL )
+            {
+                /* record trans into child slot and allocate id */
+                ( * record_trans ) ( pb -> trans_seq . v8, tcnt ++, ++ pb -> child_id );
+
+                /* record index, either single or lower part of pair
+                   index value is the new character code for transition */
+                ( * record_idx ) ( pb -> idx_seq . v8, ++ icnt + pttLastHdr, i );
+
+                /* create a node for next trans to visit */
+                n = malloc ( sizeof * n );
+                if ( n == NULL )
+                    return true;
+                n -> trans = trans -> child [ pb -> idx_map [ i ] . idx ];
+                n -> dad = tid;
+                n -> idx = i;
+                SLListPushTail ( sl, & n -> n );
+
+                /* determine type
+                   notice that "i" is incremented, even though it will be
+                   incremented by for loop. the effect of doing so, as well
+                   as the effect of the following compound statement, is to
+                   leave "i" such that child [ i ] is NULL, in which case
+                   we're going to skip it anyway */
+                if ( ++ i < pb -> min_width &&
+                     trans -> child [ pb -> idx_map [ i ] . idx ] != NULL )
+                {
+                    /* it's a range */
+                    pb -> child_seq_type [ slen >> 3 ] |=
+                        ( uint8_t ) ( 1U << ( slen & 7 ) );
+
+                    /* record each trans, allocating a new child id */
+                    ( * record_trans ) ( pb -> trans_seq . v8, tcnt ++, ++ pb -> child_id );
+                    n = malloc ( sizeof * n );
+                    if ( n == NULL )
+                        return true;
+                    n -> trans = trans -> child [ pb -> idx_map [ i ] . idx ];
+                    n -> dad = tid;
+                    n -> idx = i;
+                    SLListPushTail ( sl, & n -> n );
+
+                    /* continue until end */
+                    for ( ++ i; i < pb -> min_width; ++ i )
+                    {
+                        /* detect end of range */
+                        if ( trans -> child [ pb -> idx_map [ i ] . idx ] == NULL )
+                            break;
+                        ( * record_trans ) ( pb -> trans_seq . v8, tcnt ++, ++ pb -> child_id );
+                        n = malloc ( sizeof * n );
+                        if ( n == NULL )
+                            return true;
+                        n -> trans = trans -> child [ pb -> idx_map [ i ] . idx ];
+                        n -> dad = tid;
+                        n -> idx = i;
+                        SLListPushTail ( sl, & n -> n );
+                    }
+
+                    /* i is one beyond end of index range, but
+                       we store the range as fully closed */
+                    ( * record_idx ) ( pb -> idx_seq . v8, ++ icnt + pttLastHdr, i - 1 );
+                }
+
+                /* count the index sequence bit */
+                ++ slen;
+            }
+        }
+
+        /* complete the header for the case where child array was present */
+        ( * record_idx ) ( pb -> idx_seq . v8, pttHdrIdxCnt, icnt );
+        ( * record_idx ) ( pb -> idx_seq . v8, pttHdrSeqLen, slen );
+        ( * record_idx ) ( pb -> idx_seq . v8, pttHdrChildCnt, tcnt );
+    }
+
+    * icntp = icnt;
+    * slenp = slen;
+    * tcntp = tcnt;
+
+    return false;
+}
+
+static
+bool CC TTransPersist ( const TTrans *trans, PTriePersistData *pb,
+     uint32_t dad, uint16_t idx, SLList *sl )
+{
+    uint32_t ztid;
+    uint32_t icnt, slen, tcnt;
+    size_t to_write, num_writ, entry_size;
+
+#if DEBUGPRINT
+    fprintf(stderr, "TTransPersist called.\n");
+#endif
+
+
+    /* grab my zero-based trans id */
+    ztid = pb -> trans_id ++;
+    assert ( ztid < pb -> num_trans );
+
+    /* grab entry size */
+    entry_size = pb -> data_size;
+
+    /* assign initial size as zero */
+    pb -> trans_map [ ztid ] = 0;
+
+    /* populate tables and record child iteration nodes */
+    if ( TTransPersist1 ( trans, pb, ztid + 1, dad, idx, sl, & icnt, & slen, & tcnt ) )
+        return true;
+
+    /* write TTrans header data */
+    if ( icnt == 0 )
+    {
+        /* simple header for TTrans with no child array */
+        to_write = pttHdrNullEnd * pb -> idx_size;
+        pb -> rc = ( * pb -> write ) ( pb -> write_param,
+            pb -> idx_seq . v8, to_write, & num_writ );
+
+        /* write parent backtrace if needed */
+        if ( pb -> backtrace . v8 != NULL && pb -> rc == 0 && num_writ == to_write )
+        {
+            pb -> data_size += num_writ;
+            pb -> rc = PTAlign ( pb, & pb -> data_size, pb -> trans_size, 0 );
+            if ( pb -> rc == 0 )
+            {
+                to_write = pb -> trans_size;
+                pb -> rc = ( * pb -> write ) ( pb -> write_param,
+                    pb -> backtrace . v8, to_write, & num_writ );
+            }
+        }
+    }
+    else
+    {
+        /* write index array */
+        to_write = ( icnt + pttFirstIdx ) * pb -> idx_size;
+        pb -> rc = ( * pb -> write ) ( pb -> write_param,
+            pb -> idx_seq . v8, to_write, & num_writ );
+
+        /* proceed if no error and completely written
+           the incomplete write will be detected below */
+        if ( pb -> rc == 0 && num_writ == to_write )
+        {
+            pb -> data_size += num_writ;
+
+            /* write index type array */
+            assert ( slen != 0 );
+            to_write = ( slen + 7 ) >> 3;
+            pb -> rc = ( * pb -> write ) ( pb -> write_param,
+                pb -> child_seq_type, to_write, & num_writ );
+            if ( pb -> rc == 0 && num_writ == to_write )
+            {
+                /* align for transition size */
+                pb -> data_size += num_writ;
+                pb -> rc = PTAlign ( pb, & pb -> data_size, pb -> trans_size, 0 );
+                if ( pb -> rc == 0 )
+                {
+                    /* write parent backtrace if needed */
+                    if ( pb -> backtrace . v8 != NULL )
+                    {
+                        to_write = pb -> trans_size;
+                        pb -> rc = ( * pb -> write ) ( pb -> write_param,
+                            pb -> backtrace . v8, to_write, & num_writ );
+                        if ( pb -> rc != 0 )
+                            return true;
+                        if ( num_writ != to_write )
+                        {
+                            pb -> rc = RC ( rcCont, rcTrie, rcPersisting, rcTransfer, rcIncomplete );
+                            return true;
+                        }
+
+                        pb -> data_size += num_writ;
+                    }
+
+                    /* write transition array */
+                    to_write = tcnt * pb -> trans_size;
+                    pb -> rc = ( * pb -> write ) ( pb -> write_param,
+                        pb -> trans_seq . v8, to_write, & num_writ );
+                }
+            }
+        }
+    }
+
+    if ( pb -> rc != 0 )
+        return true;
+
+    pb -> data_size += num_writ;
+    if ( num_writ != to_write )
+    {
+        pb -> rc = RC ( rcCont, rcTrie, rcPersisting, rcTransfer, rcIncomplete );
+        return true;
+    }
+
+    /* record trans' depth for internal key storage */
+    pb -> depth = trans -> depth;
+
+    /* detect need to align for data */
+    if ( ( pb -> data_size & 3 ) != 0 )
+    {
+        /* may be able to bail before writing b-tree */
+        if ( trans -> vals . root == NULL )
+        {
+            pb -> rc = PTAlign ( pb, & pb -> data_size, 4, 0 );
+            if ( pb -> rc != 0 )
+                return true;
+
+            /* record the size */
+            pb -> trans_map [ ztid ] = pb -> data_size - entry_size;
+            return false;
+        }
+
+        /* perform alignment */
+        pb -> rc = PTAlign ( pb, & pb -> data_size, 4, 1 );
+        if ( pb -> rc != 0 )
+            return true;
+    }
+
+    /* detect fake pass */
+    if ( pb -> write == NullWrite )
+    {
+        /* gather sizes */
+        pb -> rc = BSTreePersist ( & trans -> vals, & num_writ,
+            NULL, NULL, pb -> null_write, pb );
+    }
+    else
+    {
+        /* write BSTree for values */
+        pb -> rc = BSTreePersist ( & trans -> vals, & num_writ,
+            pb -> write, pb -> write_param, pb -> live_write, pb );
+    }
+
+    pb -> data_size += num_writ;
+
+    /* align3 */
+    if ( pb -> rc == 0 )
+        pb -> rc = PTAlign ( pb, & pb -> data_size, 4, 0 );
+
+    if ( pb -> rc != 0 )
+        return true;
+
+    pb -> trans_map [ ztid ] = pb -> data_size - entry_size;
+    return false;
+}
+
+/* TTransPIterate
+ *  walks TTrans nodes in a predictive order
+ *  using a queue
+ */
+static
+bool CC TTransPIterate ( const TTrans *self, PTriePersistData *pb )
+{
+    PTChildNode *n;
+
+    SLList sl;
+    SLListInit ( & sl );
+
+#if DEBUGPRINT
+    fprintf(stderr, "TTransPIterate called.\n");
+#endif
+
+
+    pb -> trans_id = pb -> child_id = 0;
+
+    /* prime list with root node */
+    n = malloc ( sizeof * n );
+    if ( n == NULL )
+        return true;
+
+    n -> trans = self;
+    n -> dad = 0;
+    n -> idx = 0;
+
+    /* now walk the list */
+    for ( ; n != NULL; n = ( PTChildNode* ) SLListPopHead ( & sl ) )
+    {
+        const TTrans *trans = n -> trans;
+        uint32_t dad = n -> dad;
+        uint16_t idx = n -> idx;
+
+        free ( n );
+
+        if ( TTransPersist ( trans, pb, dad, idx, & sl ) )
+        {
+            SLListWhack ( & sl, PTChildNodeWhack, NULL );
+            return true;
+        }
+    }
+
+    return false;
+}
+
+
+/*--------------------------------------------------------------------------
+ * Trie
+ */
+
+/* TriePersist
+ *  much like BSTreePersist but operates on a Trie
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] -  returns parameter for the number
+ *  of bytes written as a result of persisting the b-tree. this will
+ *  be the actual bytes written regardless of return status.
+ *
+ *  "ext_keys" [ IN ] - if true, does not store key data internally.
+ *  key text gets encoded into the tree structure in all cases. when
+ *  stored internally, any key text not represented by the tree will
+ *  be explicitly written by this function. otherwise, the caller will
+ *  be expected to store the text as desired. while internal storage
+ *  will probably be more efficient, it will cause this function to
+ *  fail if the Trie was built with ambiguous key transitions, i.e.
+ *  if initialized with "cs_expand" false and keys were added having
+ *  characters not included within the "accept" character set. this
+ *  is because the tree channels all unrecognized characters through
+ *  a single code, making their recovery impossible without being
+ *  stored externally.
+ *
+ *  "write" [ IN, NULL OKAY ] and "write_param" [ IN ] -  a generic
+ *  output streaming function used for all operations. if NULL, then
+ *  the function will exit after its first pass with the number of
+ *  bytes required in "num_writ".
+ *
+ *  "aux" [ IN ] and "aux_param" [ IN ] - a specialized function for
+ *  streaming auxiliary node data to output using the supplied "write"
+ *  function. it is invoked during the first pass with a NULL write
+ *  function for gathering size data, and during the third pass with
+ *  a non-NULL write function.
+ */
+static
+rc_t CC TriePersist0 ( size_t *num_writ, int ext_keys,
+   PTWriteFunc write, void *write_param )
+{
+    rc_t rc;
+    P_Trie ptt;
+
+    assert ( num_writ != NULL );
+
+#if DEBUGPRINT
+    fprintf( stderr, "TriePersist0 called.\n" );
+#endif
+
+    ptt . num_trans = 0;
+    ptt . num_nodes = 0;
+    ptt . data_size = 0;
+    ptt . keys = 0;
+#if EXTENDED_PTRIE
+    ptt . ext_data_size = 0;
+#endif
+    ptt . width = 0;
+
+    P_TrieSetExtKeys ( ptt . keys, ext_keys );
+    P_TrieSetBacktrace ( ptt . keys, ! ext_keys );
+
+    rc = ( * write ) ( write_param, & ptt, 16, num_writ );
+    if ( rc == 0 && * num_writ != 16 )
+        return RC ( rcCont, rcTrie, rcPersisting, rcTransfer, rcIncomplete );
+    return rc;
+}
+
+static
+void CC TriePersist1 ( const Trie *tt, PTriePersistData *pb )
+{
+    uint16_t i;
+
+    assert ( tt != NULL );
+    assert ( pb != NULL );
+    assert ( tt -> root != NULL );
+    assert ( pb -> idx_map != NULL );
+
+#if DEBUGPRINT
+    fprintf(stderr, "TriePersist1 called.\n");
+#endif
+
+    /* initialize statistics */
+    for ( i = 0; i < tt -> width; ++ i )
+    {
+        pb -> idx_map [ i ] . freq = 0;
+        pb -> idx_map [ i ] . idx = i;
+        pb -> idx_map [ i ] . ch = tt -> rmap [ i ];
+    }
+
+    /* count nodes and transition frequencies */
+    pb -> num_trans = 0;
+    pb -> num_nodes = 0;
+    pb -> max_nodes = 0;
+    TTransForEach ( tt -> root, tt -> width, TTransCountTrans, pb );
+
+    /* rearrange the indices by frequency */
+    ksort ( pb -> idx_map, tt -> width, sizeof pb -> idx_map [ 0 ], IdxMapSort, NULL );
+
+    /* determine real charset width by searching for
+       the first slot with zero transitions */
+    for ( i = 0; i < tt -> width; ++ i )
+    {
+        if ( pb -> idx_map [ i ] . freq == 0 )
+            break;
+    }
+    pb -> min_width = i;
+
+    /* translate character set width and node count */
+    if ( pb -> min_width <= 256 )
+    {
+        pb -> record_idx = TTransRecordU8;
+        pb -> idx_size = 1;
+    }
+    else if ( pb -> min_width <= 65536 )
+    {
+        pb -> record_idx = TTransRecordU16;
+        pb -> idx_size = 2;
+    }
+    else
+    {
+        pb -> record_idx = TTransRecordU32;
+        pb -> idx_size = 4;
+    }
+
+    if ( pb -> num_trans <= 256 )
+    {
+        pb -> record_trans = TTransRecordU8;
+        pb -> trans_size = 1;
+    }
+    else if ( pb -> num_trans <= 65536 )
+    {
+        pb -> record_trans = TTransRecordU16;
+        pb -> trans_size = 2;
+    }
+    else
+    {
+        pb -> record_trans = TTransRecordU32;
+        pb -> trans_size = 4;
+    }
+}
+
+static
+rc_t CC TriePersist2 ( const Trie *tt, PTriePersistData *pb )
+{
+    assert ( tt != NULL );
+    assert ( pb != NULL );
+    assert ( pb -> write == NullWrite );
+
+#if DEBUGPRINT
+    fprintf(stderr, "TriePersist2 called.\n");
+#endif
+
+    pb -> trans_id = 0;
+    pb -> data_size = 0;
+    TTransPIterate ( tt -> root, pb );
+    if ( pb -> rc == 0 )
+    {
+        /* we should have visited every TTrans node */
+        assert ( pb -> trans_id == pb -> num_trans );
+
+        /* size of trans offset array slot
+           since the persisted TTrans objects
+           are 4-byte aligned, we may be able to
+           get some savings */
+        if ( pb -> data_size <= 256 * 4 )
+            pb -> off_size = 1;
+        else if ( pb -> data_size <= 65536 * 4 )
+            pb -> off_size = 2;
+        else
+            pb -> off_size = 4;
+    }
+
+    return pb -> rc;
+}
+
+static
+rc_t CC TriePersist3 ( const Trie *tt, PTriePersistData *pb, int ext_keys,
+    PTWriteFunc write, void *write_param, size_t *num_writ )
+{
+    P_Trie *pt;
+    size_t trans_offset;
+
+#if DEBUGPRINT
+    fprintf(stderr, "TriePersist3 called.\n");
+#endif
+
+    assert ( tt != NULL );
+    assert ( pb != NULL );
+    assert ( write != NULL );
+    assert ( num_writ != NULL );
+
+    /* detect size overflow */
+    if ( sizeof pb -> data_size > 4 )
+    {
+#if EXTENDED_PTRIE
+        if ( ( ( uint64_t ) ( pb -> data_size - 1 ) >> 34 ) != 0 )
+            return pb -> rc = RC ( rcCont, rcTrie, rcPersisting, rcData, rcExcessive );
+#else
+        if ( ( ( uint64_t ) pb -> data_size >> 32 ) != 0 )
+            return pb -> rc = RC ( rcCont, rcTrie, rcPersisting, rcData, rcExcessive );
+#endif
+    }
+
+    /* figure trans_offset up to trans member */
+    trans_offset = sizeof * pt - sizeof pt -> rmap +
+        pb -> min_width * sizeof pt -> rmap [ 0 ];
+
+    /* create the real deal */
+    pt = malloc ( trans_offset + pb -> num_trans * pb -> off_size );
+    if ( pt == NULL )
+        pb -> rc = RC ( rcCont, rcTrie, rcPersisting, rcMemory, rcExhausted );
+    else
+    {
+        uint32_t i;
+        size_t data_offset;
+        size_t pt_data_size = pb -> data_size;
+
+        /* initialize header */
+        pt -> num_trans = pb -> num_trans;
+        pt -> num_nodes = pb -> num_nodes;
+        pt -> data_size = ( uint32_t ) pt_data_size;
+#if EXTENDED_PTRIE
+        if ( sizeof pb -> data_size == 4 )
+            pt -> ext_data_size = 0;
+        else
+            pt -> ext_data_size = ( uint8_t ) ( ( uint64_t ) pt_data_size >> 32 );
+#endif
+        pt -> keys = 0;
+        P_TrieSetExtKeys ( pt -> keys, ext_keys );
+        P_TrieSetBacktrace ( pt -> keys, ! ext_keys );
+        pt -> width = pb -> min_width;
+
+        /* decide upon id encoding type:
+           0 => 24 : 8, i.e. 24 bits for trans id, 8 bits for local btree id
+           1 => 22 : 10
+           2 => 20 : 12
+           3 => 18 : 14
+           4 => 16 : 16
+           5 => 14 : 18
+           6 => 12 : 20
+           7 => by offset into data section
+        */
+#define VALID_IDCODE( pb, trans, bt ) \
+    ( ( pb ) -> num_trans <= ( 1U << ( trans ) ) && \
+      ( pb ) -> max_nodes <= ( 1U << ( bt ) ) )
+
+        if ( VALID_IDCODE ( pb, 24, 8 ) )
+            P_TrieSetIdCoding ( pt -> keys, 0 );
+        else if ( VALID_IDCODE ( pb, 22, 10 ) )
+            P_TrieSetIdCoding ( pt -> keys, 1 );
+        else if ( VALID_IDCODE ( pb, 20, 12 ) )
+            P_TrieSetIdCoding ( pt -> keys, 2 );
+        else if ( VALID_IDCODE ( pb, 18, 14 ) )
+            P_TrieSetIdCoding ( pt -> keys, 3 );
+        else if ( VALID_IDCODE ( pb, 16, 16 ) )
+            P_TrieSetIdCoding ( pt -> keys, 4 );
+        else if ( VALID_IDCODE ( pb, 14, 18 ) )
+            P_TrieSetIdCoding ( pt -> keys, 5 );
+        else if ( VALID_IDCODE ( pb, 12, 20 ) )
+            P_TrieSetIdCoding ( pt -> keys, 6 );
+        else
+            P_TrieSetIdCoding ( pt -> keys, 7 );
+
+#undef VALID_IDCODE
+
+        /* fill out rmap */
+        for ( i = 0; i < ( uint32_t ) pb -> min_width; ++ i )
+            pt -> rmap [ i ] = pb -> idx_map [ i ] . ch;
+
+        /* fill out transition offset table */
+        if ( pb -> off_size == 1 )
+        {
+            uint8_t *trans = ( void* ) ( ( char* ) pt + trans_offset );
+            data_offset = trans_offset + pb -> num_trans;
+
+            for ( trans_offset = 0, i = 0; i < pb -> num_trans; ++ i )
+            {
+                assert ( ( trans_offset & 3 ) == 0 );
+                trans [ i ] = ( uint8_t ) ( trans_offset >> 2 );
+                trans_offset += pb -> trans_map [ i ];
+            }
+        }
+        else if ( pb -> off_size == 2 )
+        {
+            uint16_t *trans = ( void* ) ( ( char* ) pt + trans_offset );
+            data_offset = trans_offset + ( pb -> num_trans << 1 );
+
+            for ( trans_offset = 0, i = 0; i < pb -> num_trans; ++ i )
+            {
+                assert ( ( trans_offset & 3 ) == 0 );
+                trans [ i ] = ( uint16_t ) ( trans_offset >> 2 );
+                trans_offset += pb -> trans_map [ i ];
+            }
+        }
+        else
+        {
+            uint32_t *trans = ( void* ) ( ( char* ) pt + trans_offset );
+            data_offset = trans_offset + ( pb -> num_trans << 2 );
+
+            for ( trans_offset = 0, i = 0; i < pb -> num_trans; ++ i )
+            {
+                assert ( ( trans_offset & 3 ) == 0 );
+                trans [ i ] = ( uint32_t ) ( trans_offset >> 2 );
+                trans_offset += pb -> trans_map [ i ];
+            }
+        }
+
+        /* the last offset should equal total data bytes */
+        assert ( trans_offset == pt_data_size );
+
+        /* write the tree header */
+        pb -> rc = ( * write ) ( write_param, pt, data_offset, num_writ );
+        if ( pb -> rc == 0 && * num_writ != data_offset )
+            pb -> rc = RC ( rcCont, rcTrie, rcPersisting, rcTransfer, rcIncomplete );
+
+        free ( pt );
+    }
+
+    return pb -> rc;
+}
+
+LIB_EXPORT rc_t CC TriePersist ( const Trie *tt, size_t *num_writ, bool ext_keys,
+    PTWriteFunc write, void *write_param, PTAuxFunc aux, void *aux_param )
+{
+    PTriePersistData pb;
+    size_t num_writ_buffer;
+
+#if DEBUGPRINT
+    fprintf(stderr, "TriePersist called\n");
+#endif
+
+    if ( num_writ == NULL )
+        num_writ = & num_writ_buffer;
+
+    if ( write == NULL )
+    {
+        write = NullWrite;
+        write_param = NULL;
+    }
+
+    * num_writ = 0;
+
+    if ( tt == NULL )
+        return RC ( rcCont, rcTrie, rcPersisting, rcSelf, rcNull );
+    if ( aux == NULL )
+        return RC ( rcCont, rcTrie, rcPersisting, rcFunction, rcNull );
+
+    /* handle empty tree */
+    if ( tt -> root == NULL )
+        return TriePersist0 ( num_writ, ext_keys, write, write_param );
+
+    pb . write = NullWrite;
+    pb . write_param = NULL;
+    pb . aux = aux;
+    pb . aux_param = aux_param;
+    pb . rc = 0;
+
+    if ( ext_keys )
+    {
+        pb . null_write = aux;
+        pb . live_write = aux;
+    }
+    else
+    {
+        pb . null_write = TNodeDataSize;
+        pb . live_write = TNodeWrite;
+    }
+
+    /* prepare a statistical array for character transition analysis */
+    pb . idx_map = malloc ( tt -> width * sizeof pb . idx_map [ 0 ] );
+    if ( pb . idx_map == NULL )
+        pb . rc = RC ( rcCont, rcTrie, rcPersisting, rcMemory, rcExhausted );
+    else
+    {
+        /* analyze table dimensions based upon counts */
+        TriePersist1 ( tt, & pb );
+
+        /* time to allocate some memory
+           allocate trans_map based upon the number of TTrans objects
+           and idx_seq for persisting a single child array */
+        pb . trans_map = malloc (
+            /* the TTrans node size/offset array */
+            pb . num_trans * sizeof pb . trans_map [ 0 ] +
+            /* maximum space for all indices, all transitions */
+            ( pb . idx_size + pb . trans_size ) * pb . min_width +
+            /* space for parent backtrace transition */
+            pb . trans_size +
+            /* maximum space for sequence entry type bits */
+            ( ( pb . min_width + 7 ) >> 3 ) +
+            /* space for header entries in index array */
+            ( pb . idx_size * pttFirstIdx ) +
+            /* ample space for align1 */
+            pb . trans_size );
+        if ( pb . trans_map == NULL )
+            pb . rc = RC ( rcCont, rcTrie, rcPersisting, rcMemory, rcExhausted );
+        else
+        {
+            /* set up idx_seq from trans_map */
+            pb . idx_seq . v8 = ( uint8_t* ) pb . trans_map +
+                pb . num_trans * sizeof pb . trans_map [ 0 ];
+
+            /* assign pointers to parts */
+            pb . child_seq_type =
+                & pb . idx_seq . v8 [ pb . idx_size * ( pttFirstIdx + pb . min_width ) ];
+            pb . backtrace . v8 = NULL;
+            pb . trans_seq . v8 =
+                pb . child_seq_type + ( ( pb . min_width + 7 ) >> 3 );
+            if ( ! ext_keys )
+            {
+                pb . backtrace . v8 = pb . trans_seq . v8;
+                pb . trans_seq . v8 += pb . trans_size;
+            }
+
+            /* perform a dry-run to obtain overall size */
+            if ( TriePersist2 ( tt, & pb ) == 0 )
+            {
+                /* create, initialize and write the P_Trie structure */
+                if ( TriePersist3 ( tt, & pb, ext_keys, write, write_param, num_writ ) == 0 )
+                {
+                    /* use the real write function */
+                    pb . write = write;
+                    pb . write_param = write_param;
+
+                    /* align to 4 byte boundary */
+                    pb . rc = PTAlign ( & pb, num_writ, 4, 0 );
+                    if ( pb . rc == 0 )
+                    {
+                        /* write the nodes and data */
+                        pb . trans_id = 0;
+                        pb . data_size = 0;
+                        TTransPIterate ( tt -> root, & pb );
+                        * num_writ += pb . data_size;
+                    }
+                }
+            }
+
+            free ( pb . trans_map );
+        }
+
+        free ( pb . idx_map );
+    }
+
+    return pb . rc;
+}
diff --git a/libs/klib/ptrie.c b/libs/klib/ptrie.c
new file mode 100644
index 0000000..81835d9
--- /dev/null
+++ b/libs/klib/ptrie.c
@@ -0,0 +1,1992 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "pbstree-priv.h"
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <byteswap.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * PTNode
+ *  a node within text tree
+ *
+ *  a TTree will contain TTNodes, which themselves are intrusive but
+ *  irrelevant internal tree links plus a key string plus an externally
+ *  defined data structure, representing a value, and supporting multiple
+ *  nodes per key. the internal links permit navigation from node
+ *  to node that is not possible with the PTNode. furthermore, they
+ *  provide direct access to the key string that is not normally stored
+ *  verbatim within a persisted image.
+ *
+ *  a PTrie does not contain structured nodes, but stores linkage
+ *  and ordering information separately from the externally defined
+ *  data, and rather than using pointers, assigns integer ids to the
+ *  nodes themselves. navigation by pointers would require allocations,
+ *  which are unnecessary and expensive when traversing a read-only
+ *  persisted image. navigation is therefore intrusive on an externally
+ *  allocated node structure.
+ */
+
+/* PTNodeMakeKey
+ *  tries to may a key string from node
+ *  will fail if key text was not embedded into image when created
+ *
+ *  "key" [ OUT ] - return parameter for a key string allocation
+ *  that must be whacked with StringWhack when no longer needed.
+ *
+ *  return status codes:
+ *    EINVAL => invalid parameter
+ *    ENOENT => no key data were written to tree image
+ *    ENOMEM => memory failure
+ */
+LIB_EXPORT rc_t CC PTNodeMakeKey ( const PTNode *self, const String **keyp )
+{
+    rc_t rc;
+    if ( keyp == NULL )
+        rc = RC ( rcCont, rcNode, rcAccessing, rcParam, rcNull );
+    else
+    {
+        * keyp = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcCont, rcNode, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            const PTrie *tt = self -> internal;
+            if ( tt->ext_keys || ! tt->backtrace )
+                rc = RC ( rcCont, rcNode, rcAccessing, rcString, rcNotFound );
+            else
+            {
+                uint32_t tid, btid;
+
+                /* decode the node id into trans and btnode ids */
+                rc = PTrieDecodeNodeId ( tt, self -> id, & tid, & btid );
+                if ( rc == 0 )
+                {
+                    /* recover the trans node */
+                    PTTrans trans;
+                    rc = PTrieInitNode ( tt, & trans, tid );
+                    if ( rc == 0 )
+                    {
+                        size_t size;
+                        const void *addr;
+
+                        assert ( trans . vals != NULL );
+                        assert ( PBSTreeCount ( trans . vals ) >= btid );
+
+                        /* recover the value node */
+                        rc = PBSTreeGetNodeData ( trans . vals, & addr, & size, btid );
+                        if ( rc == 0 )
+                        {
+                            /* the depth of this transition is
+                               the length of the key string up to node */
+                            uint32_t depth = PTTransGetDepth ( & trans, tt );
+
+                            /* get an adequate UTF-32 buffer */
+                            uint32_t tbbuff [ 64 ], *traceback = tbbuff;
+                            if ( depth > sizeof tbbuff / sizeof tbbuff [ 0 ] )
+                                traceback = malloc ( depth * sizeof traceback [ 0 ] );
+
+                            /* complete the work */
+                            if ( traceback != NULL )
+                            {
+                                String *key;
+                                uint32_t nlen;
+                                size_t tbsize, nsize;
+
+                                uint32_t i;
+                                for ( i = depth; i > 0; )
+                                {
+                                    uint32_t zidx = PTTransGetTransCharCode ( & trans, tt );
+                                    traceback [ -- i ] =
+                                        ( zidx + 1 == tt -> unmapped_idx ) ?
+                                        ( uint32_t ) '?' : PTrieDecodeCharId ( tt, zidx );
+                                    tid = PTTransGetDad ( & trans, tt );
+                                    assert ( tid != 0 || i == 0 );
+                                    rc = PTrieInitNode ( tt, & trans, tid );
+                                    assert ( rc == 0 );
+                                }
+
+                                /* determine the size of traceback string */
+                                i = utf32_cvt_string_len ( traceback,
+                                    depth * sizeof traceback [ 0 ], & tbsize );
+                                assert ( i == depth );
+
+                                /* determine the size and length of node string */
+                                nlen = string_measure ( addr, & nsize );
+                                assert ( nsize < size );
+
+                                /* create the string object */
+                                key = malloc ( sizeof * key + tbsize + nsize + 1 );
+                                if ( key == NULL )
+                                    rc = RC ( rcCont, rcNode, rcAccessing, rcMemory, rcExhausted );
+                                else
+                                {
+                                    /* home free */
+                                    char *text = ( char* ) ( key + 1 );
+                                    tbsize = utf32_cvt_string_copy ( text, tbsize + 1,
+                                        traceback, depth * sizeof traceback [ 0 ] );
+                                    memmove ( & text [ tbsize ], addr, nsize + 1 );
+                                    StringInit ( key, text, tbsize + nsize, depth + nlen );
+                                    * keyp = key;
+                                }
+
+                                if ( traceback != tbbuff )
+                                    free ( traceback );
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * PTTrans
+ */
+
+/* Whack
+ */
+void PTTransWhack ( PTTrans *trans )
+{
+    if ( trans != NULL ) while ( 1 )
+    {
+        PTTrans *doomed = trans;
+        trans = ( PTTrans* ) trans -> back;
+        if ( doomed -> vals != & doomed -> _val )
+            PBSTreeWhack ( ( PBSTree* ) doomed -> vals );
+        free ( doomed );
+        if ( trans == NULL )
+            break;
+        if ( -- trans -> refcount > 0 )
+            break;
+    }
+}
+
+/* GetDepth
+ */
+#if ! RECORD_HDR_DEPTH
+LIB_EXPORT uint32_t CC PTTransGetDepth ( const PTTrans *self, const PTrie *tt )
+{
+    PTTrans trans;
+    uint32_t dad, depth;
+
+    assert ( self != NULL );
+    if ( self -> depth != 0 )
+        return self -> depth;
+
+    for ( depth = 0, dad = PTTransGetDad ( self, tt ); dad != 0;
+          ++ depth, dad = PTTransGetDad ( & trans, tt ) )
+    {
+        int status = PTrieInitNode ( tt, & trans, dad );
+        assert ( status == 0 );
+    }
+
+    return depth;
+}
+#endif
+
+/* GetChildChildIdx
+ */
+static
+uint32_t PTTransGetChildChildIdx ( const PTTrans *self,
+    const PTrie *tt, uint32_t zidx )
+{
+    const uint8_t *child_seq_type = self -> child_seq_type;
+    if ( self -> child_seq_type != NULL )
+    {
+        uint32_t i, j, k;
+
+        /* terse variable name explanation:
+           "i" will be the index into "child_seq_type" bit array
+           "j" is a 1-based index into child trans array
+           "k" is an index into the index array */
+        for ( i = 0, j = 1, k = pttFirstIdx; i < self -> slen; ++ k, ++ j, ++ i )
+        {
+            /* get the single char code or
+               the left edge of char code range */
+            uint32_t left = PTTransGetIdx ( self, tt, k );
+
+            /* detect terminal condition */
+            if ( left >= zidx )
+            {
+                /* if single or range left is too high, there's no transition */
+                if ( left > zidx )
+                    break;
+
+                /* the single or range left is an exact match
+                   "j" is the 1-based index into child array */
+                return j;
+            }
+
+            /* check entry type: if 0, then the index was a single
+               value. if 1, then it's a range */
+            if ( ( child_seq_type [ i >> 3 ] & ( 1U << ( i & 7 ) ) ) != 0 )
+            {
+                /* check for inclusion within the range
+                   N.B. ensure that the increment of "k"
+                   does not get evaluated more than once */
+                uint32_t right = PTTransGetIdx ( self, tt, ++ k );
+                if ( right >= zidx )
+                {
+                    /* found the range - calculate 1-based index */
+                    return zidx - left + j;
+                }
+
+                /* advance "j" by range width - 1 */
+                j += right - left;
+            }
+        }
+    }
+
+    return 0;
+}
+
+/* 8 bit index */
+static
+uint32_t PTTransGetIdx8 ( const PTTrans *self, uint32_t zidx )
+{
+    return self -> idx . v8 [ zidx ];
+}
+
+static
+const void * PTTransGetIdxAddr8 ( const PTTrans *self, uint32_t zidx )
+{
+    return & self -> idx . v8 [ zidx ];
+}
+
+/* 16 bit index */
+static
+uint32_t PTTransGetIdx16 ( const PTTrans *self, uint32_t zidx )
+{ 
+    return self -> idx . v16 [ zidx ];
+}
+
+static
+uint32_t PTTransSwapIdx16 ( const PTTrans *self, uint32_t zidx )
+{
+    return bswap_16 ( self -> idx . v16 [ zidx ] );
+}
+
+static
+const void * PTTransGetIdxAddr16 ( const PTTrans *self, uint32_t zidx )
+{
+    return & self -> idx . v16 [ zidx ];
+}
+
+/* NULL dad access */
+static
+uint32_t PTTransGetDadNULL ( const PTTrans *self )
+{
+    return 0; 
+}
+
+/* 8 bit trans id */
+static
+uint32_t PTTransGetDad8 ( const PTTrans *self )
+{
+    return self -> dad . v8 [ 0 ];
+}
+
+static
+const void * PTTransAlignDadAddr8 ( PTTrans *self, bool backtrace )
+{
+    return & self -> dad . v8 [ backtrace ];
+}
+
+static
+uint32_t PTTransGetChild8 ( const PTTrans *self, uint32_t zidx )
+{
+    return self -> child . v8 [ zidx ];
+}
+
+static
+const void * PTTransGetChildAddr8 ( const PTTrans *self, uint32_t zidx )
+{
+    return & self -> child . v8 [ zidx ];
+}
+
+/* 16 bit trans id */
+static
+uint32_t PTTransGetDad16 ( const PTTrans *self )
+{
+    return self -> dad . v16 [ 0 ];
+}
+
+static
+uint32_t PTTransSwapDad16 ( const PTTrans *self )
+{
+    return bswap_16 ( self -> dad . v16 [ 0 ] );
+}
+
+static
+const void * PTTransAlignDadAddr16 ( PTTrans *self, bool backtrace )
+{
+    /* align dad first */
+    size_t i = ( size_t ) self -> dad . v16;
+    i = ( i + 1 ) & ~ ( size_t ) 1;
+    self -> dad . v16 = ( const uint16_t* ) i;
+    if ( backtrace )
+        return ( const void* ) ( i + 2 );
+    return ( const void* ) i;
+}
+
+static
+uint32_t PTTransGetChild16 ( const PTTrans *self, uint32_t zidx )
+{
+    return self -> child . v16 [ zidx ];
+}
+
+static
+uint32_t PTTransSwapChild16 ( const PTTrans *self, uint32_t zidx )
+{
+    return bswap_16 ( self -> child . v16 [ zidx ] );
+}
+
+static
+const void * PTTransGetChildAddr16 ( const PTTrans *self, uint32_t zidx )
+{
+    return & self -> child . v16 [ zidx ];
+}
+
+/* 32 bit trans id */
+static
+uint32_t PTTransGetDad32 ( const PTTrans *self )
+{
+    return self -> dad . v32 [ 0 ];
+}
+
+static
+uint32_t PTTransSwapDad32 ( const PTTrans *self )
+{
+    return bswap_32 ( self -> dad . v32 [ 0 ] );
+}
+
+static
+const void * PTTransAlignDadAddr32 ( PTTrans *self, bool backtrace )
+{
+    /* align dad first */
+    size_t i = ( size_t ) self -> dad . v32;
+    i = ( i + 3 ) & ~ ( size_t ) 3;
+    self -> dad . v32 = ( const uint32_t* ) i;
+    if ( backtrace )
+        return ( const void* ) ( i + 4 );
+    return ( const void* ) i;
+}
+
+static
+uint32_t PTTransGetChild32 ( const PTTrans *self, uint32_t zidx )
+{
+    return self -> child . v32 [ zidx ];
+}
+
+static
+uint32_t PTTransSwapChild32 ( const PTTrans *self, uint32_t zidx )
+{
+    return bswap_32 ( self -> child . v32 [ zidx ] );
+}
+
+static
+const void * PTTransGetChildAddr32 ( const PTTrans *self, uint32_t zidx )
+{
+    return & self -> child . v32 [ zidx ];
+}
+
+/* ForEach
+ */
+void PTTransForEach ( const PTTrans *self, const PTrie *tt,
+    void ( * f ) ( const PTTrans *trans, const PTrie *tt, void *data ), void * data )
+{
+    const uint8_t *child_seq_type;
+
+    assert ( f != NULL );
+    ( * f ) ( self, tt, data );
+
+    child_seq_type = self -> child_seq_type;
+    if ( self -> child_seq_type != NULL )
+    {
+        PTTrans *trans = malloc ( sizeof * trans );
+        if ( trans != NULL )
+        {
+            uint32_t i, j, k;
+
+            /* see explanations in PTTransGetChildChildIdx */
+            for ( i = j = 0, k = pttFirstIdx; i < self -> slen; ++ k, ++ i )
+            {
+                uint32_t left, right;
+
+                /* get the single char code or
+                   the left edge of char code range */
+                left = right = PTTransGetIdx ( self, tt, k );
+
+                /* check entry type: if 0, then the index was a single
+                   value. if 1, then it's a range */
+                if ( ( child_seq_type [ i >> 3 ] & ( 1U << ( i & 7 ) ) ) != 0 )
+                    right = PTTransGetIdx ( self, tt, ++ k );
+
+                /* get child node id */
+                for ( ; left <= right; ++ j, ++ left )
+                {
+                    uint32_t tid = PTTransGetChild ( self, tt, j ) + 1;
+                    int status = PTrieInitNode ( tt, trans, tid );
+                    if ( status == 0 )
+                    {
+                        trans -> back = self;
+#if ! RECORD_HDR_IDX
+                        trans -> tidx = left;
+#endif
+#if ! RECORD_HDR_DEPTH
+                        trans -> depth = self -> depth + 1;
+#endif
+                        PTTransForEach ( trans, tt, f, data );
+                    }
+                }
+            }
+
+            free ( trans );
+        }
+    }
+}
+
+/* DoUntil
+ */
+bool PTTransDoUntil ( const PTTrans *self, const PTrie *tt,
+    bool ( * f ) ( const PTTrans *trans, const PTrie *tt, void *data ), void * data )
+{
+    const uint8_t *child_seq_type;
+
+    assert ( f != NULL );
+    if ( ( * f ) ( self, tt, data ) )
+        return true;
+
+    child_seq_type = self -> child_seq_type;
+    if ( self -> child_seq_type != NULL )
+    {
+        PTTrans *trans = malloc ( sizeof * trans );
+        if ( trans != NULL )
+        {
+            uint32_t i, j, k;
+
+            /* see explanations in PTTransGetChildChildIdx */
+            for ( i = j = 0, k = pttFirstIdx; i < self -> slen; ++ k, ++ i )
+            {
+                uint32_t left, right;
+
+                /* get the single char code or
+                   the left edge of char code range */
+                left = right = PTTransGetIdx ( self, tt, k );
+
+                /* check entry type: if 0, then the index was a single
+                   value. if 1, then it's a range */
+                if ( ( child_seq_type [ i >> 3 ] & ( 1U << ( i & 7 ) ) ) != 0 )
+                    right = PTTransGetIdx ( self, tt, ++ k );
+
+                /* get child node id */
+                for ( ; left <= right; ++ j, ++ left )
+                {
+                    uint32_t tid = PTTransGetChild ( self, tt, j ) + 1;
+                    rc_t rc = PTrieInitNode ( tt, trans, tid );
+                    if ( rc == 0 )
+                    {
+                        trans -> back = self;
+#if ! RECORD_HDR_IDX
+                        trans -> tidx = left;
+#endif
+#if ! RECORD_HDR_DEPTH
+                        trans -> depth = self -> depth + 1;
+#endif
+                        if ( PTTransDoUntil ( trans, tt, f, data ) )
+                        {
+                            free ( trans );
+                            return true;
+                        }
+                    }
+                }
+            }
+
+            free ( trans );
+        }
+    }
+    return false;
+}
+
+
+/*--------------------------------------------------------------------------
+ * PTrie
+ *  a persisted tree of text nodes
+ *
+ *  this is a collection of { key, value } pairs, where a many-value
+ *  to one key paradigm is naturally supported, as in the b-tree.
+ *
+ *  the desired retrieval operations are:
+ *   a) key -> id : value
+ *   b) key -> { id : value, ... }
+ *   c) RE -> id : value
+ *   d) RE -> { id : value, ... }
+ *   e) iteration across { id : value, ... }
+ *   f) id : value -> key
+ *
+ *  the reverse retrieval operation is:
+ *   a) id -> value
+ *
+ *  indexing of the id is performed externally, and should not be interpreted
+ *  as a serial, integer value. it may be a byte offset or a combination of
+ *  two integer values, as well as anything else.
+ */
+
+/* GetNodeOff
+ *  takes a 1-based index
+ *  returns an offset into data array
+ */
+static
+size_t PTrieGetNodeOff8 ( const PTrie *self, uint32_t zidx )
+{
+    return self -> trans_off . v8 [ zidx ];
+}
+
+static
+size_t PTrieGetNodeOff16 ( const PTrie *self, uint32_t zidx )
+{
+    return self -> trans_off . v16 [ zidx ];
+}
+
+static
+size_t PTrieSwapNodeOff16 ( const PTrie *self, uint32_t zidx )
+{
+    return bswap_16 ( self -> trans_off . v16 [ zidx ] );
+}
+
+static
+size_t PTrieGetNodeOff32 ( const PTrie *self, uint32_t zidx )
+{
+    return self -> trans_off . v32 [ zidx ];
+}
+
+static
+size_t PTrieSwapNodeOff32 ( const PTrie *self, uint32_t zidx )
+{
+    return bswap_32 ( self -> trans_off . v32 [ zidx ] );
+}
+
+#if 0
+static
+size_t PTrieGetNodeOff64 ( const PTrie *self, uint32_t zidx )
+{
+    return self -> trans_off . v64 [ zidx ];
+}
+
+static
+size_t PTrieSwapNodeOff64 ( const PTrie *self, uint32_t zidx )
+{
+    return bswap_64 ( self -> trans_off . v64 [ zidx ] );
+}
+#endif
+
+
+/* EncodeNodeId
+ * PTrieDecodeNodeId
+ */
+static
+uint32_t PTrieOrigEncodeNodeId0 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( tid << 8 ) | btid; 
+}
+
+static
+uint32_t PTrieEncodeNodeId0 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( ( ( tid - 1 ) << 8 ) + ( btid - 1 ) ) + 1;
+}
+
+static
+rc_t PTrieOrigDecodeTestTrieNodeId ( const PTrie *self, uint32_t *tid, uint32_t *btid, uint32_t count )
+{
+    uint32_t which = 0;
+
+    PTTrans trans;
+    rc_t rc = PTrieInitNode ( self, & trans, * tid & ~ 1U );
+    if ( rc == 0 )
+    {
+        assert ( trans . vals != NULL );
+        if ( PBSTreeCount ( trans . vals ) == count )
+            which |= 1;
+    }
+    rc = PTrieInitNode ( self, & trans, * tid | 1U );
+    if ( rc == 0 )
+    {
+        assert ( trans . vals != NULL );
+        if ( PBSTreeCount ( trans . vals ) == count )
+            which |= 2;
+    }
+
+    switch ( which )
+    {
+    case 0:
+        return RC ( rcCont, rcTrie, rcAccessing, rcId, rcCorrupt );
+    case 1:
+        * tid &= ~ 1U;
+        * btid = count;
+        break;
+    case 2:
+        * tid |= 1U;
+        * btid = count;
+        break;
+    case 3:
+        * btid = count;
+        return RC ( rcCont, rcTrie, rcAccessing, rcId, rcAmbiguous );
+    }
+
+    return 0;
+}
+
+static
+rc_t PTrieOrigDecodeNodeId0 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    /* unpack 1-based ids */
+    * tid = id >> 8;
+    * btid = id & 0xFF;
+
+    /* detect no-overflow cases */
+    if ( * btid != 0 )
+        return 0;
+
+    /* handle overflow */
+    return PTrieOrigDecodeTestTrieNodeId ( self, tid, btid, 0x100 );
+}
+
+static
+rc_t PTrieDecodeNodeId0 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    -- id;
+    * tid = ( id >> 8 ) + 1;
+    * btid = ( id & 0xFF ) + 1;
+    return 0;
+}
+
+static
+uint32_t PTrieOrigEncodeNodeId1 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( tid << 10 ) | btid;
+}
+
+static
+uint32_t PTrieEncodeNodeId1 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( ( ( tid - 1 ) << 10 ) + ( btid - 1 ) ) + 1;
+}
+
+static
+rc_t PTrieOrigDecodeNodeId1 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    * tid = id >> 10;
+    * btid = id & 0x3FF;
+    if ( * btid != 0 )
+        return 0;
+    return PTrieOrigDecodeTestTrieNodeId ( self, tid, btid, 0x400 );
+}
+
+static
+rc_t PTrieDecodeNodeId1 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    -- id;
+    * tid = ( id >> 10 ) + 1;
+    * btid = ( id & 0x3FF ) + 1;
+    return 0;
+}
+
+static
+uint32_t PTrieOrigEncodeNodeId2 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( tid << 12 ) | btid;
+}
+
+static
+uint32_t PTrieEncodeNodeId2 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( ( ( tid - 1 ) << 12 ) + ( btid - 1 ) ) + 1;
+}
+
+static
+rc_t PTrieOrigDecodeNodeId2 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    * tid = id >> 12;
+    * btid = id & 0xFFF;
+    if ( * btid != 0 )
+        return 0;
+    return PTrieOrigDecodeTestTrieNodeId ( self, tid, btid, 0x1000 );
+}
+
+static
+rc_t PTrieDecodeNodeId2 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    -- id;
+    * tid = ( id >> 12 ) + 1;
+    * btid = ( id & 0xFFF ) + 1;
+    return 0;
+}
+
+static
+uint32_t PTrieOrigEncodeNodeId3 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( tid << 14 ) | btid;
+}
+
+static
+uint32_t PTrieEncodeNodeId3 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( ( ( tid - 1 ) << 14 ) + ( btid - 1 ) ) + 1;
+}
+
+static
+rc_t PTrieOrigDecodeNodeId3 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    * tid = id >> 14;
+    * btid = id & 0x3FFF;
+    if ( * btid != 0 )
+        return 0;
+    return PTrieOrigDecodeTestTrieNodeId ( self, tid, btid, 0x4000 );
+}
+
+static
+rc_t PTrieDecodeNodeId3 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    -- id;
+    * tid = ( id >> 14 ) + 1;
+    * btid = ( id & 0x3FFF ) + 1;
+    return 0;
+}
+
+static
+uint32_t PTrieOrigEncodeNodeId4 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( tid << 16 ) | btid;
+}
+
+static
+uint32_t PTrieEncodeNodeId4 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( ( ( tid - 1 ) << 16 ) + ( btid - 1 ) ) + 1;
+}
+
+static
+rc_t PTrieOrigDecodeNodeId4 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    * tid = id >> 16;
+    * btid = id & 0xFFFF;
+    if ( * btid != 0 )
+        return 0;
+    return PTrieOrigDecodeTestTrieNodeId ( self, tid, btid, 0x10000 );
+}
+
+static
+rc_t PTrieDecodeNodeId4 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    -- id;
+    * tid = ( id >> 16 ) + 1;
+    * btid = ( id & 0xFFFF ) + 1;
+    return 0;
+}
+
+static
+uint32_t PTrieOrigEncodeNodeId5 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( tid << 18 ) | btid;
+}
+
+static
+uint32_t PTrieEncodeNodeId5 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( ( ( tid - 1 ) << 18 ) + ( btid - 1 ) ) + 1;
+}
+
+static
+rc_t PTrieOrigDecodeNodeId5 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    * tid = id >> 18;
+    * btid = id & 0x3FFFF;
+    if ( * btid != 0 )
+        return 0;
+    return PTrieOrigDecodeTestTrieNodeId ( self, tid, btid, 0x40000 );
+}
+
+static
+rc_t PTrieDecodeNodeId5 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    -- id;
+    * tid = ( id >> 18 ) + 1;
+    * btid = ( id & 0x3FFFF ) + 1;
+    return 0;
+}
+
+static
+uint32_t PTrieOrigEncodeNodeId6 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( tid << 20 ) | btid;
+}
+
+static
+uint32_t PTrieEncodeNodeId6 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    return ( ( ( tid - 1 ) << 20 ) + ( btid - 1 ) ) + 1;
+}
+
+static
+rc_t PTrieOrigDecodeNodeId6 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    * tid = id >> 20;
+    * btid = id & 0xFFFFF;
+    if ( * btid != 0 )
+        return 0;
+    return PTrieOrigDecodeTestTrieNodeId ( self, tid, btid, 0x100000 );
+}
+
+static
+rc_t PTrieDecodeNodeId6 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    -- id;
+    * tid = ( id >> 20 ) + 1;
+    * btid = ( id & 0xFFFFF ) + 1;
+    return 0;
+}
+
+static
+uint32_t PTrieEncodeNodeId7 ( const PTrie *self,
+    uint32_t tid, uint32_t btid )
+{
+    /* first get the byte offset to trans */
+    uint32_t id = PTrieGetNodeOff ( self, tid - 1 );
+
+    /* the trans node is supposed to have at least btid
+       nodes underneath, taking > 1 byte each, so by adding
+       the count to a trans offset, we get something that
+       can be recovered later, and we insist that this
+       offset will be somewhere within the trans */
+
+    /* NB - conversion from tid to offset gives a
+       zero-based index into an array of uint32_t,
+       which is converted to a zero-based byte offset
+       and then added to a one-based node id, resulting
+       in a one-based composite node id */
+    return ( id << 2 ) + btid;
+}
+
+static
+rc_t PTrieDecodeNodeId7 ( const PTrie *self, uint32_t id,
+    uint32_t *tid, uint32_t *btid )
+{
+    uint32_t left = 0;
+    uint32_t right = self -> num_nodes;
+    while ( left < right )
+    {
+        uint32_t i = ( left + right ) >> 1;
+        uint32_t off = PTrieGetNodeOff ( self, i ) << 2;
+        if ( off > id )
+            right = i;
+        else
+        {
+            size_t end;
+
+            /* should never be equal, because ids are 1-based */
+            assert ( off != id );
+
+            /* get offset of next or end of data */
+            if ( i + 1 == self -> num_nodes )
+                end = self -> data_size;
+            else
+                end = PTrieGetNodeOff ( self, i + 1 ) << 2;
+
+            if ( end > id )
+            {
+                /* found it */
+                * tid = i + 1;
+                * btid = id - off;
+                return 0;
+            }
+
+            left = i;
+        }
+    }
+
+    return RC ( rcCont, rcTrie, rcSelecting, rcId, rcNotFound );
+}
+
+
+/* DecodeCharId
+ */
+static
+uint32_t PTrieGetRMap ( const PTrie *self, uint32_t idx )
+{ 
+    return self -> _rmap [ idx ];
+}
+
+static
+uint32_t PTrieSwapRMap ( const PTrie *self, uint32_t idx )
+{
+    return bswap_32 ( self -> _rmap [ idx ] );
+}
+
+
+/* MakeInt
+ *  make a persisted tree structure
+ *  includes code to handle original composite node encoding
+ *
+ *  "addr" [ IN ] and "size" [ IN ] - constant memory image of
+ *  persisted text tree with a lifetime exceeding that of the
+ *  PTrie itself
+ *
+ *  "byteswap" [ IN ] - true if persisted image must be byteswapped
+ *
+ *  "orig" [ IN ] - true if persisted node ids must be reprocessed
+ *   for overflow. In the original implementation, the composite
+ *   node ids were formed from one-based trie and bstree node ids,
+ *   but the bits allotted for them were calculated from zero-based
+ *   ids, causing an overflow when either node reached its maximum.
+ *
+ *   e.g.: tid_max <= 0x1000000, btid_max <= 0x100: 24:8 packing
+ *   when ( one-based ) btid == 256, it requires 9 bits, whereas
+ *   zero-based btid == 255, requiring the expected 8 bits.
+ */
+static int16_t _get_16 ( uint16_t i ) { return ( int16_t ) i; }
+static int16_t _swap_16 ( uint16_t i ) { return ( int16_t ) bswap_16 ( i ); }
+static int32_t _get_32 ( uint32_t i ) { return ( int32_t ) i; }
+static int32_t _swap_32 ( uint32_t i ) { return ( int32_t ) bswap_32 ( i ); }
+
+#define PTOFFSETOF( mbr ) \
+    ( ( uint32_t ) ( size_t ) & ( ( ( P_Trie* ) 0 ) -> mbr ) )
+
+static
+rc_t PTrieMakeInt ( PTrie **ttp, const void *addr, size_t size, bool byteswap, bool orig )
+{
+    rc_t rc;
+
+    /* guard against unknown compiler struct packing */
+    assert ( PTOFFSETOF ( num_trans )     == 0x00 );
+    assert ( PTOFFSETOF ( num_nodes )     == 0x04 );
+    assert ( PTOFFSETOF ( data_size )     == 0x08 );
+    assert ( PTOFFSETOF ( keys )          == 0x0C );
+#if EXTENDED_PTRIE
+    assert ( PTOFFSETOF ( ext_data_size ) == 0x0D );
+#endif
+    assert ( PTOFFSETOF ( width )         == 0x0E );
+    assert ( PTOFFSETOF ( rmap )          == 0x10 );
+
+    if ( ttp == NULL )
+        rc = RC ( rcCont, rcTrie, rcAllocating, rcParam, rcNull );
+    else
+    {
+        if ( addr == NULL )
+            rc = RC ( rcCont, rcTrie, rcAllocating, rcParam, rcNull );
+        else if ( size == 0 )
+            rc = RC ( rcCont, rcTrie, rcAllocating, rcData, rcInvalid );
+        else
+        {
+            const P_Trie *ptt;
+
+            if ( size < ( sizeof * ptt - sizeof ptt -> rmap ) )
+                rc = RC ( rcCont, rcTrie, rcAllocating, rcData, rcCorrupt );
+            else
+            {
+                uint64_t min_size;
+                uint64_t data_size;
+
+                /* accessor functions */
+                int16_t ( * get_16 ) ( uint16_t ) = byteswap ? _swap_16 : _get_16;
+                int32_t ( * get_32 ) ( uint32_t ) = byteswap ? _swap_32 : _get_32;
+
+                /* everything looks good */
+                rc = 0;
+
+                /* structured pointer into const memory image */
+                ptt = addr;
+
+                /* extract data_size */
+                data_size = get_32 ( ptt -> data_size )
+#if EXTENDED_PTRIE
+                    + ( ( uint64_t ) ptt -> ext_data_size << 32 )
+#endif
+                    ;
+
+                /* minimum known size of the memory image
+                   will be adjusted as image is scanned */
+                min_size = sizeof * ptt - sizeof ptt -> rmap +
+                    get_16 ( ptt -> width ) * sizeof ptt -> rmap [ 0 ] +
+                    data_size;
+                if ( ( uint64_t ) size >= min_size )
+                {
+                    PTrie *tt;
+                    uint16_t i, unmapped;
+                    uint32_t ch, first, last;
+
+                    /* the accept character set is recovered from the
+                       reverse character map where the special character
+                       value NUL represents a wildcard.
+
+                       the forward map will be built using one-based
+                       character codes, where code 0 means unmapped.
+
+                       first determine the range of accept characters
+                       while at the same time capturing the one-based
+                       character code of wildcards */
+                    for ( last = 0, first = ~ 0, unmapped = i = 0;
+                          i < get_16 ( ptt -> width ); ++ i )
+                    {
+                        ch = get_32 ( ptt -> rmap [ i ] );
+                        if ( ch == 0 )
+                            unmapped = i + 1;
+                        else
+                        {
+                            if ( ch < first )
+                                first = ch;
+                            if ( ch > last )
+                                last = ch;
+                        }
+                    }
+
+                    /* this case occurs when all values are on the root node */
+                    if ( last < first )
+                        first = 1;
+                    
+                    /* allocated block with mapped sections */
+                    tt = malloc ( sizeof * tt - sizeof tt -> map +
+                        ( last - first + 1 ) * sizeof tt -> map [ 0 ] );
+                    if ( tt == NULL )
+                        rc = RC ( rcCont, rcTrie, rcAllocating, rcMemory, rcExhausted );
+                    else
+                    {
+                        uint16_t ptt_width = get_16 ( ptt -> width );
+
+                        /* fill character to index map with wildcard index
+                           usually NULL or unmapped */
+                        for ( ch = first; ch <= last; ++ ch )
+                            tt -> map [ ch - first ] = unmapped;
+
+                        /* now overwrite mapped characters with one-based char codes */
+                        for ( i = 0; i < ptt_width; ++ i )
+                        {
+                            ch = get_32 ( ptt -> rmap [ i ] );
+                            if ( ch != 0 )
+                                tt -> map [ ch - first ] = i + 1;
+                        }
+
+                        /* fill out the virtual functions */
+                        do
+                        {
+                            uint32_t trans_off_len;
+                            uint16_t ptt_keys = get_16 ( ptt -> keys );
+
+                            /* reverse character lookup */
+                            tt -> decode_char_id = byteswap ?
+                                PTrieSwapRMap : PTrieGetRMap;
+
+                            /* index encoding scheme */
+                            if ( orig ) switch ( P_TrieIdCoding ( ptt_keys ) )
+                            {
+                            case 0:
+                                tt -> encode_node_id = PTrieOrigEncodeNodeId0;
+                                tt -> decode_node_id = PTrieOrigDecodeNodeId0;
+                                break;
+                            case 1:
+                                tt -> encode_node_id = PTrieOrigEncodeNodeId1;
+                                tt -> decode_node_id = PTrieOrigDecodeNodeId1;
+                                break;
+                            case 2:
+                                tt -> encode_node_id = PTrieOrigEncodeNodeId2;
+                                tt -> decode_node_id = PTrieOrigDecodeNodeId2;
+                                break;
+                            case 3:
+                                tt -> encode_node_id = PTrieOrigEncodeNodeId3;
+                                tt -> decode_node_id = PTrieOrigDecodeNodeId3;
+                                break;
+                            case 4:
+                                tt -> encode_node_id = PTrieOrigEncodeNodeId4;
+                                tt -> decode_node_id = PTrieOrigDecodeNodeId4;
+                                break;
+                            case 5:
+                                tt -> encode_node_id = PTrieOrigEncodeNodeId5;
+                                tt -> decode_node_id = PTrieOrigDecodeNodeId5;
+                                break;
+                            case 6:
+                                tt -> encode_node_id = PTrieOrigEncodeNodeId6;
+                                tt -> decode_node_id = PTrieOrigDecodeNodeId6;
+                                break;
+                            default:
+                                tt -> encode_node_id = PTrieEncodeNodeId7;
+                                tt -> decode_node_id = PTrieDecodeNodeId7;
+                            }
+                            else switch ( P_TrieIdCoding ( ptt_keys ) )
+                            {
+                            case 0:
+                                tt -> encode_node_id = PTrieEncodeNodeId0;
+                                tt -> decode_node_id = PTrieDecodeNodeId0;
+                                break;
+                            case 1:
+                                tt -> encode_node_id = PTrieEncodeNodeId1;
+                                tt -> decode_node_id = PTrieDecodeNodeId1;
+                                break;
+                            case 2:
+                                tt -> encode_node_id = PTrieEncodeNodeId2;
+                                tt -> decode_node_id = PTrieDecodeNodeId2;
+                                break;
+                            case 3:
+                                tt -> encode_node_id = PTrieEncodeNodeId3;
+                                tt -> decode_node_id = PTrieDecodeNodeId3;
+                                break;
+                            case 4:
+                                tt -> encode_node_id = PTrieEncodeNodeId4;
+                                tt -> decode_node_id = PTrieDecodeNodeId4;
+                                break;
+                            case 5:
+                                tt -> encode_node_id = PTrieEncodeNodeId5;
+                                tt -> decode_node_id = PTrieDecodeNodeId5;
+                                break;
+                            case 6:
+                                tt -> encode_node_id = PTrieEncodeNodeId6;
+                                tt -> decode_node_id = PTrieDecodeNodeId6;
+                                break;
+                            default:
+                                tt -> encode_node_id = PTrieEncodeNodeId7;
+                                tt -> decode_node_id = PTrieDecodeNodeId7;
+                            }
+
+                            /* PTTrans index access based on the
+                               minimum allowed char code width
+                               where the 0 <= code < width */
+                            if ( ptt_width <= 256 )
+                            {
+                                tt -> get_idx = PTTransGetIdx8;
+                                tt -> get_idx_addr = PTTransGetIdxAddr8;
+                            }
+                            else
+                            {
+                                tt -> get_idx = byteswap ? PTTransSwapIdx16 : PTTransGetIdx16;
+                                tt -> get_idx_addr = PTTransGetIdxAddr16;
+                            }
+
+                            /* PTTrans child and parent access based
+                               ont the minimum allowed trans id width */
+                            if ( get_32 ( ptt -> num_trans ) <= 256 )
+                            {
+                                tt -> get_dad = PTTransGetDad8;
+                                tt -> align_dad_addr = PTTransAlignDadAddr8;
+                                tt -> get_child = PTTransGetChild8;
+                                tt -> get_child_addr = PTTransGetChildAddr8;
+                            }
+                            else if ( get_32 ( ptt -> num_trans ) <= 65536 )
+                            {
+                                if ( byteswap )
+                                {
+                                    tt -> get_dad = PTTransSwapDad16;
+                                    tt -> get_child = PTTransSwapChild16;
+                                }
+                                else
+                                {
+                                    tt -> get_dad = PTTransGetDad16;
+                                    tt -> get_child = PTTransGetChild16;
+                                }
+                                tt -> align_dad_addr = PTTransAlignDadAddr16;
+                                tt -> get_child_addr = PTTransGetChildAddr16;
+                            }
+                            else
+                            {
+                                if ( byteswap )
+                                {
+                                    tt -> get_dad = PTTransSwapDad32;
+                                    tt -> get_child = PTTransSwapChild32;
+                                }
+                                else
+                                {
+                                    tt -> get_dad = PTTransGetDad32;
+                                    tt -> get_child = PTTransGetChild32;
+                                }
+                                tt -> align_dad_addr = PTTransAlignDadAddr32;
+                                tt -> get_child_addr = PTTransGetChildAddr32;
+                            }
+
+                            /* wipe out the backtrace function */
+                            if ( ! P_TrieBacktrace ( ptt_keys ) )
+                                tt -> get_dad = PTTransGetDadNULL;
+
+                            /* the trans offset access is based upon the
+                               total data size to be represented in nodes.
+                               all entries are 4-byte aligned, making it
+                               possible to represent their offsets with
+                               the byte value / 4 */
+                            if ( data_size <= 256 * 4 )
+                            {
+                                tt -> get_node_off = PTrieGetNodeOff8;
+                                trans_off_len = ( get_32 ( ptt -> num_trans ) + 3 ) >> 2;
+                            }
+                            else if ( data_size <= 65536 * 4 )
+                            {
+                                tt -> get_node_off = byteswap ? PTrieSwapNodeOff16 : PTrieGetNodeOff16;
+                                trans_off_len = ( get_32 ( ptt -> num_trans ) + 1 ) >> 1;
+                            }
+                            else
+                            {
+                                tt -> get_node_off = byteswap ? PTrieSwapNodeOff32 : PTrieGetNodeOff32;
+                                trans_off_len = get_32 ( ptt -> num_trans );
+                            }
+
+                            /* the minimum size of this image */
+                            min_size += trans_off_len << 2;
+
+                            /* initialize a few members -
+                               could be here or inside following if
+                               placed here only for pipelining */
+                            tt -> _rmap = ptt -> rmap;
+                            tt -> trans_off . v32 = & ptt -> rmap [ ptt_width ];
+
+                            /* require image size to pass test */
+                            if ( min_size <= size )
+                            {
+                                tt -> data . v32 = & tt -> trans_off . v32 [ trans_off_len ];
+                                tt -> num_trans = get_32 ( ptt -> num_trans );
+                                tt -> num_nodes = get_32 ( ptt -> num_nodes );
+                                tt -> data_size = ( size_t ) data_size;
+                                tt -> ext_keys = P_TrieExtKeys ( ptt_keys ) != 0;
+                                tt -> backtrace = P_TrieBacktrace ( ptt_keys ) != 0;
+                                tt -> id_coding = P_TrieIdCoding ( ptt_keys );
+                                tt -> byteswap = byteswap;
+                                tt -> width = ptt_width;
+                                tt -> first_char = first;
+                                tt -> last_char = last;
+                                tt -> unmapped_idx = unmapped;
+
+                                * ttp = tt;
+                                return 0;
+                            }
+                        }
+                        while ( 0 );
+
+                        free ( tt );
+                    }
+                }
+            }
+        }
+
+        * ttp = NULL;
+    }
+    return rc;
+}
+
+/* Make
+ *  make a persisted tree structure
+ *
+ *  "addr" [ IN ] and "size" [ IN ] - constant memory image of
+ *  persisted text tree with a lifetime exceeding that of the
+ *  PTrie itself
+ *
+ *  "byteswap" [ IN ] - true if persisted image must be byteswapped
+ */
+LIB_EXPORT rc_t CC PTrieMake ( PTrie **tt, const void *addr, size_t size, bool byteswap )
+{
+    return PTrieMakeInt ( tt, addr, size, byteswap, false );
+}
+
+/* MakeOrig - DEPRECATED
+ *  make a persisted tree structure
+ *  includes code to handle original composite node encoding
+ *
+ *  "addr" [ IN ] and "size" [ IN ] - constant memory image of
+ *  persisted text tree with a lifetime exceeding that of the
+ *  PTrie itself
+ *
+ *  "byteswap" [ IN ] - true if persisted image must be byteswapped
+ */
+LIB_EXPORT rc_t CC PTrieMakeOrig ( PTrie **tt, const void *addr, size_t size, bool byteswap )
+{
+    return PTrieMakeInt ( tt, addr, size, byteswap, true );
+}
+
+/* Count
+ *  returns number of { id : value } pairs in text tree
+ *  not included within the TTree interface itself, but
+ *  was included here due to the fact that it is constant
+ *
+ *  return value:
+ *    integer value >= 0
+ */
+LIB_EXPORT uint32_t CC PTrieCount ( const PTrie *self )
+{
+    if ( self != NULL )
+      return self -> num_nodes;
+    return 0;
+}
+
+/* Size
+ *  returns the size in bytes
+ *  of the PTrie image
+ */
+LIB_EXPORT size_t CC PTrieSize ( const PTrie *self )
+{
+    const P_Trie *ptt;
+
+    if ( self == NULL )
+        return 0;
+
+    /* the original image has some standard set of headers
+       plus a bunch of table data from "rmap" to "data", followed
+       by "data_size" bytes of data. */
+    return ( const char* ) self -> data . v32 - ( const char* ) self -> _rmap +
+      self -> data_size + sizeof * ptt - sizeof ptt -> rmap;
+}
+
+/* GetNode
+ *  gets a PTNode from an id
+ *
+ *  "node" [ OUT ] - return parameter for node
+ *
+ *  "id" [ IN ] - a 1-based integer node id
+ *
+ *  return values:
+ *    EINVAL => an invalid parameter was passed
+ *    ENOENT => id out of range
+ */
+LIB_EXPORT rc_t CC PTrieGetNode ( const PTrie *self, PTNode *node, uint32_t id )
+{
+    rc_t rc;
+    if ( node == NULL )
+        rc = RC ( rcCont, rcTrie, rcAccessing, rcNode, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcCont, rcTrie, rcAccessing, rcSelf, rcNull );
+        else if ( id == 0 )
+            rc = RC ( rcCont, rcTrie, rcAccessing, rcId, rcNull );
+        else
+        {
+            uint32_t tid, btid;
+            rc = PTrieDecodeNodeId ( self, id, & tid, & btid );
+            if ( rc == 0 )
+            {
+                PTTrans trans;
+                rc = PTrieInitNode ( self, & trans, tid );
+                if ( rc == 0 )
+                {
+                    const PBSTree *pbt = trans . vals;
+                    if ( pbt == NULL )
+                        rc = RC ( rcCont, rcTrie, rcAccessing, rcId, rcNotFound );
+                    else
+                    {
+                        rc = PBSTreeGetNodeData ( pbt,
+                            & node -> data . addr, & node -> data . size, btid );
+                        if ( rc == 0 )
+                        {
+                            node -> internal = self;
+                            node -> id = id;
+
+                            if ( ! self -> ext_keys )
+                            {
+                                size_t sz = strlen ( node -> data . addr ) + 1;
+                                assert ( sz <= node -> data . size );
+                                node -> data . addr =
+                                    ( const char* ) node -> data . addr + sz;
+                                node -> data . size -= sz;
+                            }
+
+                            return 0;
+                        }
+                    }
+                }
+            }
+        }
+
+        node -> data . addr = node -> internal = NULL;
+        node -> data . size = 0;
+        node -> id = 0;
+    }
+    return rc;
+}
+
+/* InitNode
+ */
+rc_t PTrieInitNode ( const PTrie *self, PTTrans *trans, uint32_t idx )
+{
+    rc_t rc;
+    uint32_t tcnt;
+    const uint8_t *align2;
+
+    assert ( self != NULL );
+    assert ( trans != NULL );
+
+    if ( idx == 0 )
+        return RC ( rcCont, rcNode, rcConstructing, rcId, rcNull );
+    if ( idx > self -> num_trans )
+        return RC ( rcCont, rcNode, rcConstructing, rcId, rcNotFound );
+
+    /* record node id */
+    trans -> tid = idx;
+
+    /* no backtrace link yet assigned */
+    trans -> back = NULL;
+
+    /* nobody is linked to us yet */
+    trans -> refcount = 0;
+
+    /* initialize the trans' index member */
+    trans -> idx . v32 =
+        & self -> data . v32 [ PTrieGetNodeOff ( self, idx - 1 ) ];
+    assert ( ( ( size_t ) trans -> idx . v8 & 3 ) == 0 );
+
+    /* can now access header values within index */
+    trans -> tcnt = PTTransGetIdx ( trans, self, pttHdrTransCnt );
+    trans -> icnt = PTTransGetIdx ( trans, self, pttHdrIdxCnt );
+
+    /* if the icnt is zero, the original child array was NULL */
+    if ( trans -> icnt == 0 )
+    {
+        trans -> slen = tcnt = 0;
+        trans -> child_seq_type = NULL;
+
+        /* get unaligned dad pointer */
+        trans -> dad . v8 =
+            PTTransGetIdxAddr ( trans, self, pttHdrNullEnd );
+   }
+    else
+    {
+        tcnt = PTTransGetIdx ( trans, self, pttHdrChildCnt );
+        trans -> slen = PTTransGetIdx ( trans, self, pttHdrSeqLen );
+
+        /* sequence type */
+        trans -> child_seq_type =
+            PTTransGetIdxAddr ( trans, self, pttFirstIdx + trans -> icnt );
+
+        /* unaligned dad pointer */
+        trans -> dad . v8 = & trans -> child_seq_type [ ( trans -> slen + 7 ) >> 3 ];
+    }
+
+    /* align dad and get child pointer */
+    trans -> child . v8 = PTTransAlignDadAddr ( trans, self );
+
+    /* location of align2 */
+    align2 = PTTransGetChildAddr ( trans, self, tcnt );
+
+    /* NULL out dad pointer if no backtrace */
+    if ( ! self -> backtrace )
+        trans -> dad . v8 = NULL;
+
+    /* NULL out child pointer if no transitions */
+    if ( trans -> icnt == 0 )
+        trans -> child . v8 = NULL;
+
+    /* finally, look at align for boolean */
+    if ( ( ( size_t ) align2 & 3 ) != 0 )
+    {
+        if ( align2 [ 0 ] == 0 )
+        {
+            trans -> vals = NULL;
+            return 0;
+        }
+
+        * ( size_t* ) & align2 |= 3;
+        ++ align2;
+    }
+
+    /* to avoid an allocation, mimic the older behavior
+       that used persisted data directly as a PBSTree
+       and had no allocation. we introduced a wrapper
+       object in order to have a vtable for byte-swapping,
+       and this disturbs the older code. */
+    trans -> vals = & trans -> _val;
+
+    rc = self -> byteswap ?
+        PBSTreeMakeSwapped ( & trans -> _val, align2, 0 ):
+        PBSTreeMakeNative ( & trans -> _val, align2, 0 );
+    if ( rc == 0 )
+    {
+        if ( PBSTreeCount ( trans -> vals ) == 0 )
+        {
+            trans -> vals = NULL;
+        }
+    }
+    return rc;
+}
+
+/* MakeNode
+ */
+rc_t PTrieMakeNode ( const PTrie *self, PTTrans **transp, uint32_t idx )
+{
+    rc_t rc;
+
+    PTTrans *trans = malloc ( sizeof * trans );
+    if ( trans == NULL )
+        return RC ( rcCont, rcNode, rcAllocating, rcMemory, rcExhausted );
+
+    assert ( transp != NULL );
+    rc = PTrieInitNode ( self, * transp = trans, idx );
+    if ( rc != 0 )
+        free ( trans );
+
+    return rc;
+}
+
+/* MapChar
+ *  maps a character to a one-based character code
+ */
+static
+uint32_t PTrieMapChar ( const PTrie *tt, uint32_t ch )
+{
+  if ( ch >= tt -> first_char && ch <= tt -> last_char )
+    return tt -> map [ ch - tt -> first_char ];
+    return tt -> unmapped_idx;
+}
+
+/* NextIdx
+ *  pops a character from key string
+ *  maps it to an index
+ */
+static
+rc_t PTrieNextIdx ( const PTrie *tt, String *key, uint32_t *idx )
+{
+    uint32_t ch;
+    rc_t rc = StringPopHead ( key, & ch );
+    if ( rc == 0 )
+        * idx = PTrieMapChar ( tt, ch );
+    return rc;
+}
+
+/* FindTrans
+ */
+static
+rc_t PTrieFindTrans ( const PTrie *self, String *key, PTTrans **transp )
+{
+    rc_t rc;
+
+    PTTrans *dad;
+    uint32_t tid;
+    uint32_t key_idx;
+
+    for ( dad = NULL, key_idx = 0, rc = PTrieMakeNode ( self, transp, 1 );
+          rc == 0; rc = PTrieMakeNode ( self, transp, tid ) )
+    {
+        PTTrans *trans = * transp;
+
+        /* link in dad */
+        trans -> back = dad;
+#if ! RECORD_HDR_IDX
+        trans -> tidx = key_idx;
+#endif
+        if ( dad != NULL )
+        {
+#if ! RECORD_HDR_DEPTH
+            trans -> depth = dad -> depth + 1;
+#endif
+            ++ dad -> refcount;
+        }
+#if ! RECORD_HDR_DEPTH
+        else
+        {
+            trans -> depth = 0;
+        }
+#endif
+
+        /* if there are no child transitions,
+           this must be the node */
+        if ( trans -> icnt == 0 )
+            return 0;
+
+        /* capture dad for next loop
+           or for failure cleanup */
+        dad = trans;
+
+        /* get transition index for character */
+        rc = PTrieNextIdx ( self, key, & key_idx );
+        if ( rc != 0 )
+        {
+            /* end of string */
+            if ( GetRCState ( rc ) == rcEmpty )
+                return 0;
+
+            /* invalid input */
+            break;
+        }
+
+        /* either an unrecognized character or
+           a NULL transition mean NOT FOUND */
+        rc = RC ( rcCont, rcTrie, rcSelecting, rcString, rcNotFound );
+
+        /* check for inability to take transition */
+        if ( key_idx == 0 )
+            break;
+
+        /* try to take transition */
+        tid = PTTransGetChildChildIdx ( trans, self, -- key_idx );
+        if ( tid == 0 )
+            break;
+
+        /* convert the child transition index into a trans id */
+        tid = PTTransGetChild ( trans, self, tid - 1 ) + 1;
+    }
+
+    PTTransWhack ( dad );
+    return rc;
+}
+
+/* Find
+ * PTrieFindRE
+ *  find a single { id, value } pair  within tree
+ *
+ *  "item" [ IN ] - an exact match text string
+ *
+ *  "re" [ IN ] - a regular expression string
+ *
+ *  "rtn" [ OUT ] - return parameter for node if found.
+ *  its value is undefined unless the function returns success.
+ *
+ *  return value:
+ *    0    => not found
+ *    1..n => id of found pair
+ */
+static
+int CC PTNodeFindExact ( const void *ignore, const PBSTNode *n , void * data)
+{
+    assert ( n -> data . addr != NULL );
+    assert ( n -> data . size > 0 );
+
+    if ( ( ( const char* ) n -> data . addr ) [ 0 ] == 0 )
+        return 0;
+    return -1;
+}
+
+static
+int CC PTNodeFindRem ( const void *item, const PBSTNode *n, void * data )
+{
+    /* compare the remainder of the key */
+    const String *rem = item;
+    int diff = string_cmp ( rem -> addr, rem -> size,
+        n -> data . addr, n -> data . size, rem -> len );
+
+    /* if they differed within the key length, it could
+       be that the node is shorter or that there was a
+       character mismatch */
+    if ( diff != 0 )
+        return diff;
+
+    /* the only thing to ascertain now
+       is that the lengths are equal */
+    if ( ( ( const char* ) n -> data . addr ) [ rem -> size ] == 0 )
+        return 0;
+
+    /* the key is shorter */
+    return -1;
+}
+
+LIB_EXPORT uint32_t CC PTrieFind ( const PTrie *self, const String *item, PTNode *rtn,
+        int ( CC * custom_cmp ) ( const void *item, const PBSTNode *n, void *data ), void *data )
+{
+
+    if ( rtn == NULL )
+        return 0;
+
+    rtn -> data . addr = rtn -> internal = NULL;
+    rtn -> data . size = 0;
+    rtn -> id = 0;
+
+    if ( self != NULL && item != NULL && self -> num_trans != 0 && item -> len != 0 )
+    {
+        String key = * item;
+
+        PTTrans *trans;
+        rc_t rc = PTrieFindTrans ( self, & key, & trans );
+
+        if ( rc == 0 )
+        {
+            /* any values in b-tree? */
+            if ( trans -> vals != NULL )
+            {
+                int ( CC * cmp ) ( const void *item, const PBSTNode *n, void *data );
+                
+                if ( custom_cmp != NULL)
+                    cmp = custom_cmp;
+                else if ( self -> ext_keys )
+                    cmp = NULL;
+                /* for exact match on node */
+                else if ( key . len == 0 )
+                    cmp = PTNodeFindExact;
+                /* for remainder */
+                else
+                    cmp = PTNodeFindRem;
+
+                /* try to find the node */
+                if ( cmp != NULL )
+                {
+                    PBSTNode btnode;
+                    uint32_t btid = PBSTreeFind ( trans -> vals, & btnode, & key, cmp, data );
+                    if ( btid != 0 )
+                    {
+                        /* grab the data */
+                        rtn -> data . addr = btnode . data . addr;
+                        rtn -> data . size = btnode . data . size;
+
+                        /* record reference to self */
+                        rtn -> internal = self;
+
+                        /* set an id */
+                        rtn -> id = PTrieEncodeNodeId ( self,
+                            trans -> tid, btid );
+
+                        /* adjust the data block for internal keys */
+                        if ( ! self -> ext_keys )
+                        {
+                            const char *ptr = ( const char* ) rtn -> data . addr;
+                            for ( ; rtn -> data . size > 1 && * ptr != '\0'; ++ ptr, -- rtn -> data . size )
+                                ( void ) 0;
+                            rtn -> data . addr = ptr + 1; /* skip terminating NUL byte */
+                            -- rtn -> data.size;
+                        }
+                    }
+                }
+            }
+
+            PTTransWhack ( trans );
+        }
+    }
+
+    return rtn -> id;
+}
+
+LIB_EXPORT uint32_t CC PTrieFindRE ( const PTrie *self, const String *re, PTNode *rtn );
+
+/* FindAll
+ * PTrieFindAllRE
+ *  find multiple objects within tree
+ *
+ *  "key" [ IN ] - an exact match text string
+ *
+ *  "re" [ IN ] - a regular expression string
+ *
+ *  "buffer" [ OUT ] and "capacity" [ IN ] - a user-supplied
+ *  array of PTNode with a capacity of "capacity" elements.
+ *  if successful, the entire found set will be returned unordered within.
+ *
+ *  "num_found" [ OUT ] - indicates the size of the found set,
+ *  regardless of return value, such that if the supplied
+ *  buffer were to be too small, the required size is returned.
+ *
+ *  returns status codes:
+ *    EINVAL  => an invalid parameter
+ *    ENOENT  => the found set was empty
+ *    ENOBUFS => the found set was too large
+ */
+LIB_EXPORT rc_t CC PTrieFindAll ( const PTrie *self, struct String const *key,
+    PTNode buffer [], uint32_t capacity, uint32_t *num_found,
+    int ( CC * custom_cmp ) ( const void *item, const PBSTNode *n, void *data ), void *data );
+
+LIB_EXPORT rc_t CC PTrieFindAllRE ( const PTrie *self, const String *re,
+    PTNode buffer [], uint32_t capacity, uint32_t *num_found );
+
+/* ForEach
+ *  executes a function on each tree element
+ *
+ *  "f" [ IN ] and "data" [ IN ] - iteration callback function for
+ *  examining each TTNode in the tree
+ */
+typedef struct PTrieForEachData PTrieForEachData;
+struct PTrieForEachData
+{
+    const PTrie *tt;
+    void ( CC * f ) ( PTNode *n, void *data );
+    void *data;
+    uint32_t tid;
+};
+
+static
+void CC PTrieRunForEachVal ( PBSTNode *btn, void *data )
+{
+    PTNode ttn;
+    PTrieForEachData *pb = data;
+
+    ttn . data . addr = btn -> data . addr;
+    ttn . data . size = btn -> data . size;
+    ttn . internal = pb -> tt;
+    ttn . id = PTrieEncodeNodeId ( pb -> tt, pb -> tid, btn -> id );
+
+    if ( ! pb -> tt -> ext_keys )
+    {
+        size_t sz = strlen ( ttn . data . addr ) + 1;
+        assert ( sz <= ttn . data . size );
+        ttn . data . addr =
+            ( const char* ) ttn . data . addr + sz;
+        ttn . data . size -= sz;
+    }
+
+    ( * pb -> f ) ( & ttn, pb -> data );
+}
+
+static
+void PTrieRunForEachTrans ( const PTTrans *trans, const PTrie *tt, void *data )
+{
+    if ( trans -> vals != NULL )
+    {
+        PTrieForEachData *pb = data;
+        pb -> tid = trans -> tid;
+        PBSTreeForEach ( trans -> vals, 0, PTrieRunForEachVal, pb );
+    }
+}
+
+LIB_EXPORT void CC PTrieForEach ( const PTrie *self,
+    void ( CC * f ) ( PTNode *n, void *data ), void *data )
+{
+  if ( self != NULL && f != NULL && self -> num_trans != 0 )
+    {
+        PTTrans trans;
+        int status = PTrieInitNode ( self, & trans, 1 );
+        if ( status == 0 )
+        {
+            PTrieForEachData pb;
+            pb . tt = self;
+            pb . f = f;
+            pb . data = data;
+
+            PTTransForEach ( & trans, self, PTrieRunForEachTrans, & pb );
+        }
+    }
+}
+
+/* DoUntil
+ *  executes a function on each tree element
+ *  until the function returns true
+ *
+ *  "f" [ IN ] and "data" [ IN ] - iteration callback function for
+ *  examining each TTNode in the tree. the function returns "true"
+ *  to halt iteration.
+ *
+ *  return values:
+ *    the last value returned by "f" or false if never invoked
+ */
+typedef struct PTrieDoUntilData PTrieDoUntilData;
+struct PTrieDoUntilData
+{
+    const PTrie *tt;
+    bool ( CC * f ) ( PTNode *n, void *data );
+    void *data;
+    uint32_t tid;
+};
+
+static
+bool CC PTrieRunDoUntilVal ( PBSTNode *btn, void *data )
+{
+    PTNode ttn;
+    PTrieDoUntilData *pb = data;
+
+    ttn . data . addr = btn -> data . addr;
+    ttn . data . size = btn -> data . size;
+    ttn . internal = pb -> tt;
+    ttn . id = PTrieEncodeNodeId ( pb -> tt, pb -> tid, btn -> id );
+
+    if ( ! pb -> tt -> ext_keys )
+    {
+        size_t sz = strlen ( ttn . data . addr ) + 1;
+        assert ( sz <= ttn . data . size );
+        ttn . data . addr =
+            ( const char* ) ttn . data . addr + sz;
+        ttn . data . size -= sz;
+    }
+
+    return ( * pb -> f ) ( & ttn, pb -> data );
+}
+
+static
+bool PTrieRunDoUntilTrans ( const PTTrans *trans, const PTrie *tt, void *data )
+{
+    if ( trans -> vals != NULL )
+    {
+        PTrieDoUntilData *pb = data;
+        pb -> tid = trans -> tid;
+        return PBSTreeDoUntil ( trans -> vals, 0, PTrieRunDoUntilVal, pb );
+    }
+    return false;
+}
+
+LIB_EXPORT bool CC PTrieDoUntil ( const PTrie *self,
+    bool ( CC * f ) ( PTNode *n, void *data ), void *data )
+{
+  if ( self != NULL && f != NULL && self -> num_trans != 0 )
+    {
+        PTTrans trans;
+        rc_t rc = PTrieInitNode ( self, & trans, 1 );
+        if ( rc == 0 )
+        {
+            PTrieDoUntilData pb;
+            pb . tt = self;
+            pb . f = f;
+            pb . data = data;
+
+            return PTTransDoUntil ( & trans, self, PTrieRunDoUntilTrans, & pb );
+        }
+    }
+    return false;
+}
+
+/* Whack
+ *  tears down internal structure
+ */
+LIB_EXPORT void CC PTrieWhack ( PTrie *self )
+{
+    if ( self != NULL )
+        free ( self );
+}
diff --git a/libs/klib/qsort.c b/libs/klib/qsort.c
new file mode 100644
index 0000000..11901c8
--- /dev/null
+++ b/libs/klib/qsort.c
@@ -0,0 +1,311 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/extern.h>
+#include <klib/sort.h>
+#include <sysalloc.h>
+
+/* Copyright (C) 1991,1992,1996,1997,1999,2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Written by Douglas C. Schmidt (schmidt at ics.uci.edu).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* If you consider tuning this algorithm, you should consult first:
+   Engineering a sort function; Jon Bentley and M. Douglas McIlroy;
+   Software - Practice and Experience; Vol. 23 (11), 1249-1265, 1993.  */
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Byte-wise swap two items of size SIZE. */
+#define SWAP(a, b, size)                        \
+    do                                          \
+    {                                           \
+        register size_t __size = (size);        \
+        register char *__a = (a), *__b = (b);   \
+        do                                      \
+        {                                       \
+            char __tmp = *__a;                  \
+            *__a++ = *__b;                      \
+            *__b++ = __tmp;                     \
+        } while (--__size > 0);                 \
+    } while (0)
+
+/* Discontinue quicksort algorithm when partition gets below this size.
+   This particular magic number was chosen to work best on a Sun 4/260. */
+#define MAX_THRESH 4
+
+/* Stack node declarations used to store unfulfilled partition obligations. */
+typedef struct
+{
+    char *lo;
+    char *hi;
+} stack_node;
+
+/* The next 4 #defines implement a very fast in-line stack abstraction. */
+/* The stack needs log (total_elements) entries (we could even subtract
+   log(MAX_THRESH)).  Since total_elements has type size_t, we get as
+   upper bound for log (total_elements):
+   bits per byte (CHAR_BIT) * sizeof(size_t).  */
+#define STACK_SIZE	(CHAR_BIT * sizeof(size_t))
+#define PUSH(low, high)	((void) ((top->lo = (low)), (top->hi = (high)), ++top))
+#define	POP(low, high)	((void) (--top, (low = top->lo), (high = top->hi)))
+#define	STACK_NOT_EMPTY	(stack < top)
+
+
+/* Order size using quicksort.  This implementation incorporates
+   four optimizations discussed in Sedgewick:
+
+   1. Non-recursive, using an explicit stack of pointer that store the
+   next array partition to sort.  To save time, this maximum amount
+   of space required to store an array of SIZE_MAX is allocated on the
+   stack.  Assuming a 32-bit (64 bit) integer for size_t, this needs
+   only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes).
+   Pretty cheap, actually.
+
+   2. Chose the pivot element using a median-of-three decision tree.
+   This reduces the probability of selecting a bad pivot value and
+   eliminates certain extraneous comparisons.
+
+   3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
+   insertion sort to order the MAX_THRESH items within each partition.
+   This is a big win, since insertion sort is faster for small, mostly
+   sorted array segments.
+
+   4. The larger of the two sub-partitions is always pushed onto the
+   stack first, with the algorithm then concentrating on the
+   smaller partition.  This *guarantees* no more than log (total_elems)
+   stack size is needed (actually O(1) in this case)!  */
+
+LIB_EXPORT void CC ksort ( void *pbase, size_t total_elems, size_t size,
+    int64_t ( CC * cmp ) ( const void*, const void*, void *data ), void *data )
+{
+    register char *base_ptr = (char *) pbase;
+
+    const size_t max_thresh = MAX_THRESH * size;
+
+    /* NEW - NCBI ... avoid sorting a single element */
+    if (total_elems < 2)
+        /* Avoid lossage with unsigned arithmetic below.  */
+        return;
+
+    if (total_elems > MAX_THRESH)
+    {
+        char *lo = base_ptr;
+        char *hi = &lo[size * (total_elems - 1)];
+        stack_node stack[STACK_SIZE];
+        stack_node *top = stack;
+
+        PUSH (NULL, NULL);
+
+        while (STACK_NOT_EMPTY)
+        {
+            char *left_ptr;
+            char *right_ptr;
+
+            /* Select median value from among LO, MID, and HI. Rearrange
+               LO and HI so the three values are sorted. This lowers the
+               probability of picking a pathological pivot value and
+               skips a comparison for both the LEFT_PTR and RIGHT_PTR in
+               the while loops. */
+
+            char *mid = lo + size * ((hi - lo) / size >> 1);
+
+            if ((*cmp) ((void *) mid, (void *) lo, data) < 0)
+                SWAP (mid, lo, size);
+            if ((*cmp) ((void *) hi, (void *) mid, data) < 0)
+                SWAP (mid, hi, size);
+            else
+                goto jump_over;
+            if ((*cmp) ((void *) mid, (void *) lo, data) < 0)
+                SWAP (mid, lo, size);
+        jump_over:;
+
+            left_ptr  = lo + size;
+            right_ptr = hi - size;
+
+            /* Here's the famous ``collapse the walls'' section of quicksort.
+               Gotta like those tight inner loops!  They are the main reason
+               that this algorithm runs much faster than others. */
+            do
+            {
+                while ((*cmp) ((void *) left_ptr, (void *) mid, data) < 0)
+                    left_ptr += size;
+
+                while ((*cmp) ((void *) mid, (void *) right_ptr, data) < 0)
+                    right_ptr -= size;
+
+                if (left_ptr < right_ptr)
+                {
+                    SWAP (left_ptr, right_ptr, size);
+                    if (mid == left_ptr)
+                        mid = right_ptr;
+                    else if (mid == right_ptr)
+                        mid = left_ptr;
+                    left_ptr += size;
+                    right_ptr -= size;
+                }
+                else if (left_ptr == right_ptr)
+                {
+                    left_ptr += size;
+                    right_ptr -= size;
+                    break;
+                }
+            }
+            while (left_ptr <= right_ptr);
+
+            /* Set up pointers for next iteration.  First determine whether
+               left and right partitions are below the threshold size.  If so,
+               ignore one or both.  Otherwise, push the larger partition's
+               bounds on the stack and continue sorting the smaller one. */
+
+            if ((size_t) (right_ptr - lo) <= max_thresh)
+            {
+                if ((size_t) (hi - left_ptr) <= max_thresh)
+                    /* Ignore both small partitions. */
+                    POP (lo, hi);
+                else
+                    /* Ignore small left partition. */
+                    lo = left_ptr;
+            }
+            else if ((size_t) (hi - left_ptr) <= max_thresh)
+                /* Ignore small right partition. */
+                hi = right_ptr;
+            else if ((right_ptr - lo) > (hi - left_ptr))
+            {
+                /* Push larger left partition indices. */
+                PUSH (lo, right_ptr);
+                lo = left_ptr;
+            }
+            else
+            {
+                /* Push larger right partition indices. */
+                PUSH (left_ptr, hi);
+                hi = right_ptr;
+            }
+        }
+    }
+
+    /* Once the BASE_PTR array is partially sorted by quicksort the rest
+       is completely sorted using insertion sort, since this is efficient
+       for partitions below MAX_THRESH size. BASE_PTR points to the beginning
+       of the array to sort, and END_PTR points at the very last element in
+       the array (*not* one beyond it!). */
+
+#undef min
+#define min(x, y) ((x) < (y) ? (x) : (y))
+
+    {
+        char *const end_ptr = &base_ptr[size * (total_elems - 1)];
+        char *tmp_ptr = base_ptr;
+        char *thresh = min(end_ptr, base_ptr + max_thresh);
+        register char *run_ptr;
+
+        /* Find smallest element in first threshold and place it at the
+           array's beginning.  This is the smallest array element,
+           and the operation speeds up insertion sort's inner loop. */
+
+        for (run_ptr = tmp_ptr + size; run_ptr <= thresh; run_ptr += size)
+            if ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, data) < 0)
+                tmp_ptr = run_ptr;
+
+        if (tmp_ptr != base_ptr)
+            SWAP (tmp_ptr, base_ptr, size);
+
+        /* Insertion sort, running from left-hand-side up to right-hand-side.  */
+
+#if 1
+        /* NEW - NCBI */
+        tmp_ptr = base_ptr + size;
+        for ( run_ptr = base_ptr + size + size; run_ptr <= end_ptr; tmp_ptr = run_ptr, run_ptr += size )
+        {
+            for ( ; tmp_ptr >= base_ptr; tmp_ptr -= size )
+            {
+                if ( ( * cmp ) ( run_ptr, tmp_ptr, data ) >= 0 )
+                    break;
+            }
+
+            tmp_ptr += size;
+            if ( tmp_ptr != run_ptr )
+            {
+                char *trav;
+
+                trav = run_ptr + size;
+                while (--trav >= run_ptr)
+                {
+                    char c = *trav;
+                    char *hi, *lo;
+
+                    for (hi = lo = trav; (lo -= size) >= tmp_ptr; hi = lo)
+                        *hi = *lo;
+                    *hi = c;
+                }
+            }
+        }
+
+#else
+        run_ptr = base_ptr + size;
+        while ((run_ptr += size) <= end_ptr)
+        {
+            tmp_ptr = run_ptr - size;
+            while ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, data) < 0)
+                tmp_ptr -= size;
+
+            tmp_ptr += size;
+            if (tmp_ptr != run_ptr)
+            {
+                char *trav;
+
+                trav = run_ptr + size;
+                while (--trav >= run_ptr)
+                {
+                    char c = *trav;
+                    char *hi, *lo;
+
+                    for (hi = lo = trav; (lo -= size) >= tmp_ptr; hi = lo)
+                        *hi = *lo;
+                    *hi = c;
+                }
+            }
+        }
+#endif
+    }
+}
diff --git a/libs/klib/rc-idx-tbl.c b/libs/klib/rc-idx-tbl.c
new file mode 100644
index 0000000..1c65462
--- /dev/null
+++ b/libs/klib/rc-idx-tbl.c
@@ -0,0 +1,41 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+* Is used in XML logging to generate RC-derived attributes
+*/
+
+#define RC_ENUM( type ) \
+    const char *g ## type ##Idx_str [] =
+
+#define RC_ENTRY( id, txt ) # id ,
+
+#define RC_VFIRST( id1, id2 )
+
+#define RC_VLAST( id )
+
+#define RC_LAST( id ) NULL
+
+#include <klib/rc.h>
+
+/* EOF */
diff --git a/libs/klib/rc-tbl.c b/libs/klib/rc-tbl.c
new file mode 100644
index 0000000..a8cdef2
--- /dev/null
+++ b/libs/klib/rc-tbl.c
@@ -0,0 +1,38 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define RC_ENUM( type ) \
+    const char *g ## type ##_str [] =
+
+#define RC_ENTRY( id, txt ) txt,
+
+#define RC_VFIRST( id1, id2 )
+
+#define RC_VLAST( id )
+
+#define RC_LAST( id ) NULL
+
+#include <klib/rc.h>
diff --git a/libs/klib/refcount.c b/libs/klib/refcount.c
new file mode 100644
index 0000000..e0acafb
--- /dev/null
+++ b/libs/klib/refcount.c
@@ -0,0 +1,499 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 1
+#define INLINE_REFCOUNT 0
+
+#include <kfc/extern.h>
+
+#include <klib/refcount.h>
+#include <klib/log.h>
+#include <atomic32.h>
+
+#include <sysalloc.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+
+/* the simple atomic32_dec_and_test interface does not detect
+   crossing to negative. better said, it internally detects the
+   event but does not pay for setting a tri-state return value
+   on exit, opting instead to only detect the zero crossing. */
+#ifndef DETECT_ZERO_STATE
+#define DETECT_ZERO_STATE 1
+#endif
+
+/* the simple atomic32_inc interface does not detect rollover */
+#ifndef DETECT_LIMIT_VIOLATION
+#define DETECT_LIMIT_VIOLATION 1
+#endif
+
+/* this is in here to detect if the refcount is above a certain value 
+   introduced to debug heap corruption in the windows-build */
+#define MAX_REFCOUNT_VALUE 1000
+#ifndef DETECT_MAX_REFCOUNT_VIOLATION
+#define DETECT_MAX_REFCOUNT_VIOLATION 1
+#endif
+
+
+#define DUAL_OWN_BITS 16
+#define DUAL_DEP_BITS ( 32 - DUAL_OWN_BITS )
+#define DUAL_OWN_VAL ( 1 << DUAL_DEP_BITS )
+#define DUAL_DEP_VAL 1
+#define DUAL_OWN_MAX ( ( 1 << ( DUAL_OWN_BITS - 1 ) ) - 1 )
+#define DUAL_DEP_MAX ( ( 1 << ( DUAL_DEP_BITS - 1 ) ) - 1 )
+#define DUAL_OWN_LIM ( DUAL_OWN_MAX << DUAL_DEP_BITS )
+#define DUAL_DEP_LIM DUAL_DEP_MAX
+#define DUAL_OWN_MASK ( ( 1 << DUAL_OWN_BITS ) - 1 )
+#define DUAL_DEP_MASK ( ( 1 << DUAL_DEP_BITS ) - 1 )
+
+/*--------------------------------------------------------------------------
+ * KRefcount
+ *  signed 32-bit reference counter
+ * KDualRef
+ *  dual signed/unsigned 16-bit reference counter
+ */
+
+
+/* Init
+ *  initialize a refcount object
+ *
+ *  "refcount" [ IN/OUT ] - pointer to object being initialized
+ *
+ *  "value" [ IN ] - initial refcount value
+ *    -OR-
+ *  "owned" [ IN ] and "dep" [ IN ] - owned and dependent counts
+ *  function will return krefLimit if counts exceed limits
+ *
+ *  "clsname" [ IN ] - NUL-terminated string stating classname
+ *  of object instance being initialized.
+ *
+ *  "op" [ IN ] - NUL-terminated string stating construction operation
+ *
+ *  "name" [ IN ] - NUL-terminated name of instance
+ */
+#if ! INLINE_REFCOUNT
+void CC KRefcountInit ( KRefcount *refcount, int value,
+    const char *clsname, const char *op, const char *name )
+{
+    REFNEW ( clsname, op, name, refcount, value );
+    atomic32_set ( refcount, value );
+}
+#endif
+
+int CC KDualRefInit ( KDualRef *refcount, int owned, int dep,
+    const char *clsname, const char *op, const char *name )
+{
+    int value = owned << DUAL_DEP_BITS | dep;
+
+#if DETECT_LIMIT_VIOLATION
+    if ( owned < 0 || owned > DUAL_OWN_MAX ||
+         dep < 0 || dep > DUAL_DEP_MAX )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED TO CREATE %s, operation %s, name '%s', instance $0x%p: initial refcounts 0x%x, 0x%x",
+                   clsname, op, name, refcount, owned, dep ) );
+        return krefLimit;
+    }
+#endif
+
+    REFNEW ( clsname, op, name, refcount, value );
+    atomic32_set ( refcount, value );
+    return krefOkay;
+}
+
+
+/* Whack
+ *  tear down whatever was built up in object
+ */
+#if ! INLINE_REFCOUNT
+void CC KRefcountWhack ( KRefcount *self, const char *clsname )
+{
+    REFMSG ( clsname, "whack", self );
+}
+#endif
+
+void CC KDualRefWhack ( KDualRef *self, const char *clsname )
+{
+    REFMSG ( clsname, "whack", self );
+}
+
+
+/* Add
+ *  add an owned reference
+ *  returns enum value indicating action to be taken
+ *
+ *  inline implementation always returns krefOkay.
+ *
+ *  linked-in implementation may return any of the following
+ *  codes, depending upon how it was compiled:
+ *    krefOkay     : reference was successfully added
+ *    krefZero     : reference was added, but prior value was zero
+ *    krefLimit    : reference was NOT added, too many references
+ *    krefNegative : reference was NOT added, prior value was negative
+ */
+#if ! INLINE_REFCOUNT
+int CC KRefcountAdd ( const KRefcount *self, const char *clsname )
+{
+#if DETECT_ZERO_STATE
+    int prior = atomic32_read_and_add_ge ( ( KRefcount* ) self, 1, 0 );
+    if ( prior < 0 )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to addref %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefNegative;
+    }
+    if ( prior == 0 )
+    {
+#if 0 /*** disabling this warning since code is noe initializing refcount to zero in several places ***/
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "about to addref %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+#endif
+        return krefZero;
+    }
+
+#if DETECT_LIMIT_VIOLATION
+    if ( prior == INT_MAX )
+    {
+        atomic32_dec ( ( KRefcount* ) self );
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to addref %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefLimit;
+    }
+#endif
+
+    CNTMSG ( clsname, "addref", self, prior );
+
+#elif DETECT_LIMIT_VIOLATION
+    unsigned int prior = atomic32_read_and_add_lt ( ( KRefcount* ) self, 1, INT_MAX );
+    if ( prior >= INT_MAX )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to addref %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefLimit;
+    }
+    CNTMSG ( clsname, "addref", self, prior );
+#else
+    REFMSG ( clsname, "addref", self );
+    atomic32_inc ( ( KRefcount* ) ( self ) );
+#endif
+
+    return krefOkay;
+}
+#endif
+
+int CC KDualRefAdd ( const KDualRef *self, const char *clsname )
+{
+#if DETECT_LIMIT_VIOLATION
+    unsigned int prior = atomic32_read_and_add_lt ( ( KDualRef* ) self, DUAL_OWN_VAL, DUAL_OWN_LIM );
+#if DETECT_ZERO_STATE
+    unsigned int owned = prior >> DUAL_DEP_BITS;
+    if ( owned > DUAL_OWN_MAX )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER, 
+                  ( "FAILED to addref %s instance 0x%p: prior refcount = 0x%x",
+                    clsname, self, prior ));
+        return krefNegative;
+    }
+    if ( prior == 0 )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER, 
+                 ( "about to addref %s instance 0x%p: prior refcount = 0x%x",
+                    clsname, self, prior ) );
+        return krefZero;
+    }
+#endif
+    if ( prior >= DUAL_OWN_LIM )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER, 
+                  ( "FAILED to addref %s instance 0x%p: prior refcount = 0x0%x",
+                    clsname, self, prior ));
+        return krefLimit;
+    }
+    CNTMSG ( clsname, "addref", self, prior );
+#elif DETECT_ZERO_STATE
+    unsigned int prior = atomic32_read_and_add ( ( KDualRef* ) self, DUAL_OWN_VAL );
+    unsigned int owned = prior >> DUAL_DEP_BITS;
+    if ( owned > DUAL_OWN_MAX )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                  ( "FAILED to addref %s instance %0x%p: prior refcount = 0x%x",
+                    clsname, self, prior ));
+        return krefNegative;
+    }
+    if ( prior == 0 )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                  ( "about to addref %s instance %0x%p: prior refcount = 0x%x",
+                    clsname, self, prior ));
+        return krefZero;
+    }
+    CNTMSG ( clsname, "addref", self, prior );
+#else
+    REFMSG ( clsname, "addref", self );
+    atomic32_add ( ( KDualRef* ) ( self ), DUAL_OWN_VAL );
+#endif
+    return krefOkay;
+}
+
+
+/* Drop
+ *  drop an owned reference
+ *  returns enum value indicating action to be taken
+ *
+ *  inline implementation returns:
+ *    krefOkay     : reference was successfully dropped
+ *    krefWhack    : all references are gone and object can be collected
+ *
+ *  linked-in implementation may return any of the following
+ *  codes, depending upon how it was compiled:
+ *    krefOkay     : reference was successfully dropped
+ *    krefWhack    : all references are gone and object can be collected
+ *    krefZero     : reference was dropped, and no further owned refernces exist
+ *    krefNegative : reference was NOT dropped, as resultant count would be negative
+ */
+#if ! INLINE_REFCOUNT
+int CC KRefcountDrop ( const KRefcount *self, const char *clsname )
+{
+#if DETECT_ZERO_STATE
+    int prior = atomic32_read_and_add ( ( KRefcount* ) self, -1 );
+    if ( prior <= 0 )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to release %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefNegative;
+    }
+    CNTMSG ( clsname, "release", self, prior );
+    if ( prior == 1 )
+        return krefWhack;
+#else
+    REFMSG ( clsname, "release", self );
+    if ( atomic32_dec_and_test ( ( KRefcount* ) ( self ) ) )
+        return krefWhack;
+#endif
+    return krefOkay;
+}
+#endif
+
+int CC KDualRefDrop ( const KDualRef *self, const char *clsname )
+{
+    int prior = atomic32_read_and_add_ge ( ( KDualRef* ) self, - DUAL_OWN_VAL, DUAL_OWN_VAL );
+#if DETECT_ZERO_STATE
+    if ( prior < DUAL_OWN_VAL )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to release %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefNegative;
+    }
+#endif
+    CNTMSG ( clsname, "release", self, prior );
+    if ( prior == DUAL_OWN_VAL )
+        return krefWhack;
+    if ( ( prior >> DUAL_DEP_BITS ) == 0 )
+        return krefZero;
+    return krefOkay;
+}
+
+
+/* AddDep
+ *  adds a dependency reference
+ *  returns enum value indicating action to be taken
+ *
+ *  inline implementation always returns krefOkay.
+ *
+ *  linked-in implementation may return any of the following
+ *  codes, depending upon how it was compiled:
+ *    krefOkay     : reference was successfully added
+ *    krefZero     : reference was added, but prior value was zero
+ *    krefNegative : reference was NOT added, prior value was negative
+ */
+#if ! INLINE_REFCOUNT
+int CC KRefcountAddDep ( const KRefcount *self, const char *clsname )
+{
+#if DETECT_ZERO_STATE
+    int prior = atomic32_read_and_add ( ( KRefcount* ) self, 1 );
+    if ( prior < 0 )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to attach %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefNegative;
+    }
+    if ( prior == 0 )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "about to attach %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefZero;
+    }
+#if DETECT_LIMIT_VIOLATION
+    if ( prior == INT_MAX )
+    {
+        atomic32_dec ( ( KRefcount* ) self );
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to attach %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefLimit;
+    }
+#endif
+    CNTMSG ( clsname, "attach", self, prior );
+#elif DETECT_LIMIT_VIOLATION
+    unsigned int prior = atomic32_read_and_add_lt ( ( KRefcount* ) self, 1, INT_MAX );
+    if ( prior >= INT_MAX )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to attach %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefLimit;
+    }
+    CNTMSG ( clsname, "attach", self, prior );
+#else
+    REFMSG ( clsname, "attach", self );
+    atomic32_inc ( ( KRefcount* ) ( self ) );
+#endif
+    return krefOkay;
+}
+#endif
+
+int CC KDualRefAddDep ( const KDualRef *self, const char *clsname )
+{
+#if DETECT_ZERO_STATE
+    int prior = atomic32_read_and_add_ge ( ( KDualRef* ) self, 1, 0 );
+    int dep = prior & DUAL_DEP_MASK;
+    if ( prior < 0 || dep > DUAL_DEP_MAX )
+    {
+        if ( prior >= 0 )
+            atomic32_dec ( ( KDualRef* ) self );
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to attach %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefNegative;
+    }
+    if ( prior == 0 )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "about to attach %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefZero;
+    }
+#if DETECT_LIMIT_VIOLATION
+    if ( dep == DUAL_DEP_MAX )
+    {
+        atomic32_dec ( ( KDualRef* ) self );
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to attach %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefLimit;
+    }
+#endif
+    CNTMSG ( clsname, "attach", self, prior );
+#elif DETECT_LIMIT_VIOLATION
+    int prior = atomic32_read_and_inc ( ( KDualRef* ) self );
+    if ( ( prior & DUAL_DEP_MASK ) >= DUAL_DEP_MAX )
+    {
+        atomic32_dec ( ( KDualRef* ) self );
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to attach %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefLimit;
+    }
+    CNTMSG ( clsname, "attach", self, prior );
+#else
+    REFMSG ( clsname, "attach", self );
+    atomic32_inc ( ( KDualRef* ) ( self ) );
+#endif
+    return krefOkay;
+}
+
+
+/* DropDep
+ *  drop a dependency reference
+ *  returns enum value indicating action to be taken
+ *
+ *  inline implementation returns:
+ *    krefOkay     : reference was successfully dropped
+ *    krefWhack    : all references are gone and object can be collected
+ *
+ *  linked-in implementation may return any of the following
+ *  codes, depending upon how it was compiled:
+ *    krefOkay     : reference was successfully dropped
+ *    krefWhack    : all references are gone and object can be collected
+ *    krefZero     : reference was dropped, and no further dependent refernces exist
+ *    krefNegative : reference was NOT dropped, as resultant count would be negative
+ */
+#if ! INLINE_REFCOUNT
+int CC KRefcountDropDep ( const KRefcount *self, const char *clsname )
+{
+#if DETECT_ZERO_STATE
+    int prior = atomic32_read_and_add ( ( KRefcount* ) self, -1 );
+    if ( prior <= 0 )
+    {
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to sever %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefNegative;
+    }
+    CNTMSG ( clsname, "sever", self, prior );
+    if ( prior == 1 )
+        return krefWhack;
+#else
+    REFMSG ( clsname, "sever", self );
+    if ( atomic32_dec_and_test ( ( KRefcount* ) ( self ) ) )
+        return krefWhack;
+#endif
+    return krefOkay;
+}
+#endif
+
+int CC KDualRefDropDep ( const KDualRef *self, const char *clsname )
+{
+    int prior = atomic32_read_and_add ( ( KDualRef* ) self, -1 );
+#if DETECT_ZERO_STATE
+    if ( prior <= 0 )
+    {
+        atomic32_inc ( ( KDualRef* ) self );
+        DBGMSG ( DBG_REF, DBG_REF_PLACEHOLDER,
+                 ( "FAILED to sever %s instance 0x%p: prior refcount = 0x%x",
+                   clsname, self, prior ) );
+        return krefNegative;
+    }
+#endif
+    CNTMSG ( clsname, "sever", self, prior );
+    if ( prior == 1 )
+        return krefWhack;
+    if ( ( prior & DUAL_DEP_MASK ) == 1 )
+        return krefZero;
+    return krefOkay;
+}
diff --git a/libs/klib/release-vers.h b/libs/klib/release-vers.h
new file mode 100644
index 0000000..79ec52d
--- /dev/null
+++ b/libs/klib/release-vers.h
@@ -0,0 +1,44 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/* THIS FILE IS NOT GENERATED AUTOMATICALLY! */
+
+
+/* Version of current SRA Toolkit Release */
+#define RELEASE_VERS 0x02080001
+
+
+/* Type of Version of current SRA Toolkit Release is one of:
+ *  'd' - development
+ *  'a' - alpha
+ *  'b' - beta
+ *  'c' - release candidate
+ *  'r' - final
+ */
+#define RELEASE_TYPE 'r'
+
+/* Revision of Version of current SRA Toolkit Release */
+#define RELEASE_REVISION 0
diff --git a/libs/klib/report-klib.c b/libs/klib/report-klib.c
new file mode 100644
index 0000000..7cd08e6
--- /dev/null
+++ b/libs/klib/report-klib.c
@@ -0,0 +1,912 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h> /* MUST BE FIRST */
+
+#include <kapp/args.h> /* OPTION_REPORT */
+
+#include <kfs/directory.h> /* KDirectoryNativeDir */
+#include <kfg/kfg-priv.h> /* ENV_KRYPTO_PWFILE */
+
+#include <klib/klib-priv.h>
+#include <klib/log.h> /* LOGERR */
+#include <klib/misc.h> /* is_iser_an_admin */
+#include <klib/namelist.h> /* KNamelistRelease */
+#include <klib/out.h> /* OUTMSG */
+#include <klib/printf.h> /* string_printf */
+#include <klib/rc.h>
+#include <klib/report.h> /* ReportInit */
+#include <klib/time.h> /* KTime */
+#include <klib/text.h> /* string_printf */
+
+#include <atomic.h> /* atomic_test_and_set_ptr */
+
+#include <stdarg.h> /* va_start */
+#include <stdio.h> /* sprintf */
+#include <stdlib.h> /* malloc */
+#include <string.h> /* memset */
+#include <limits.h> /* PATH_MAX */
+#include <assert.h>
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+/*
+ * An unrecoverable error happened.
+ * We can help to solve it
+ * by reporting information about known application execution environment.
+ */
+
+static
+rc_t XMLLogger_Encode(const char* src, char *dst,
+    size_t dst_sz, size_t *num_writ)
+{
+    rc_t rc = 0;
+    if( src == NULL || dst == NULL || num_writ == NULL ) {
+        rc = RC(rcApp, rcArgv, rcParsing, rcParam, rcNull);
+    } else {
+        *num_writ = 0;
+        do {
+            size_t bytes;
+            const char* p;
+            switch(*src) {
+                case '\'':
+                    bytes = 6;
+                    p = "'";
+                    break;
+                case '"':
+                    bytes = 6;
+                    p = """;
+                    break;
+                case '&':
+                    bytes = 5;
+                    p = "&";
+                    break;
+                case '<':
+                    bytes = 4;
+                    p = "<";
+                    break;
+                case '>':
+                    bytes = 4;
+                    p = ">";
+                    break;
+                default:
+                    bytes = 1;
+                    p = src;
+                    break;
+            }
+            if( (*num_writ + bytes) > dst_sz ) {
+                rc = RC(rcApp, rcLog, rcEncoding, rcBuffer, rcInsufficient);
+                break;
+            } else {
+                memmove(dst, p, bytes);
+                *num_writ = *num_writ + bytes;
+                dst += bytes;
+            }
+        } while(*src++ != '\0');
+        *num_writ = *num_writ - 1;
+    }
+    return rc;
+}
+
+typedef rc_t (CC ReportObj)(const ReportFuncs *f, uint32_t indent,
+                              const char *path, bool *wasDbOrTableSet);
+typedef rc_t (CC ReportSoftware)(const ReportFuncs *f, uint32_t indent,
+                          const char *argv_0, const char *date, ver_t tool_ver);
+typedef rc_t (CC Whack )(void);
+typedef struct Report {
+    rc_t ( CC * report_redirect ) ( KWrtHandler* handler,
+        const char* filename, bool* to_file, bool finalize );
+    rc_t ( CC * report_cwd ) ( const ReportFuncs *f, uint32_t indent );
+    rc_t ( CC * report_config ) ( const ReportFuncs *f,
+        uint32_t indent, uint32_t configNodesSkipCount, va_list args );
+    ReportObj *report_vdb;
+    ReportSoftware *report_software;
+    Whack *whack_vdb;
+    atomic_ptr_t object; /* path: to free */
+    const char* date;
+    char** argv;
+    int argc;
+    KTime_t start;
+    ver_t tool_ver;
+    bool hasZombies;
+    bool silence;
+} Report;
+
+static rc_t ReportReplaceObjectPtr(Report* self, const char* path) {
+    char *copy;
+    void *prev_ptr, *cur_ptr;
+
+    assert(self);
+
+    copy = string_dup_measure(path, NULL);
+    if (copy == NULL)
+        return RC(rcExe, rcMemory, rcAllocating, rcMemory, rcExhausted);
+
+    cur_ptr = self -> object . ptr;
+    do
+    {
+        prev_ptr = cur_ptr;
+        cur_ptr = atomic_test_and_set_ptr ( & self -> object, copy, prev_ptr );
+    }
+    while ( cur_ptr != prev_ptr );
+
+    if ( cur_ptr != NULL )
+        free ( cur_ptr );
+
+    return 0;
+}
+
+static rc_t ReportFreeObject(Report* self) {
+    rc_t rc = 0;
+    void *prev_ptr, *cur_ptr;
+
+    assert(self);
+
+    cur_ptr = self -> object . ptr;
+    do
+    {
+        prev_ptr = cur_ptr;
+        cur_ptr = atomic_test_and_set_ptr ( & self -> object, NULL, prev_ptr );
+    }
+    while ( cur_ptr != prev_ptr );
+
+    if ( cur_ptr != NULL )
+        free(cur_ptr);
+
+    return rc;
+}
+
+static atomic_ptr_t report_singleton;
+/*static Report * volatile report_singleton;*/
+
+static rc_t ReportGet(Report** self)
+{
+    if ( report_singleton . ptr == NULL )
+        return RC ( rcRuntime, rcStorage, rcAccessing, rcSelf, rcNull );
+
+    * self = report_singleton . ptr;
+    return 0;
+}
+static rc_t ReportRelease(void)
+{
+    rc_t rc = 0;
+    Report *prev_report, *cur_report;
+
+    cur_report = report_singleton . ptr;
+    do
+    {
+        prev_report = cur_report;
+        cur_report = atomic_test_and_set_ptr ( & report_singleton, NULL, prev_report );
+    }
+    while ( cur_report != prev_report );
+
+    if ( cur_report != NULL )
+    {
+
+        /* cleanup */
+        ReportFreeObject( cur_report );
+        if ( cur_report -> whack_vdb != NULL )
+            rc = ( * cur_report -> whack_vdb ) ();
+
+        if ( cur_report -> argv != NULL )
+        {
+            int i;
+            for ( i = 0; i < cur_report -> argc; ++ i )
+                free ( cur_report -> argv [ i ] );
+            free ( cur_report -> argv );
+            cur_report -> argv = NULL;
+        }
+
+        memset ( cur_report, 0, sizeof * cur_report );
+    }
+
+    return rc;
+}
+
+static void reportOpen1(uint32_t indent, const char* name) {
+    OUTMSG(("%*c%s>", indent + 1, '<', name));
+}
+
+static rc_t reportData1(const char* data) {
+    rc_t rc = 0;
+
+    char dummy[PATH_MAX * 2 + 1] = "";
+    const char* p = data;
+
+    assert(data);
+
+    if (data[0] == 0) {
+        return rc;
+    }
+
+    if (strpbrk(data, "'\"&<>")) {
+        size_t num_writ = 0;
+        rc = XMLLogger_Encode(data, dummy, sizeof dummy, &num_writ);
+        if (rc == 0)
+        {   p = dummy; }
+    }
+
+    OUTMSG(("%s", p));
+
+    return rc;
+}
+
+static void reportClose1(const char* name) { OUTMSG(("</%s>\n", name)); }
+
+static rc_t reportImpl(int indent, bool open, bool close, bool eol,
+    const char* name, const char* data, int count, va_list args)
+{
+    rc_t rc = 0;
+    int i = 0;
+
+    if (count < 0) {
+        eol = false;
+        count = -count;
+    }
+
+    OUTMSG(("%*c", eol ? ( indent + 1 ) : 1, '<'));
+    OUTMSG(("%s%s", ( ! open && close ) ? "/" : "", name));
+
+    for (i = 0; i < count; ++i) {
+        const char* name = va_arg(args, const char*);
+        int format = va_arg(args, int);
+        union {
+            const char* s;
+            int i;
+            int64_t i64;
+            KTime* t;
+            rc_t rc;
+            const uint8_t* digest;
+            uint64_t u64;
+            ver_t vers;
+        } u;
+        OUTMSG((" %s=\"", name));
+        u.i64 = 0;
+        switch(format) {
+            case 'M':
+                u.digest = va_arg(args, const uint8_t*);
+                {
+                    int i = 0;
+                    for (i = 0; i < 16; ++i)
+                    {  OUTMSG(("%02x", *(u.digest + i))); }
+                }
+                break;
+            case 'l':
+                u.i64 = va_arg(args, int64_t);
+                OUTMSG(("%ld", u.i64));
+                break;
+            case 'u':
+                u.u64 = va_arg(args, uint64_t);
+                OUTMSG(("%lu", u.u64));
+                break;
+            case 'R':
+                u.rc = va_arg(args, rc_t);
+                OUTMSG(("%R", u.rc));
+                break;
+            case 'T':
+                u.t = va_arg(args, KTime*);
+                OUTMSG(("%lT", u.t));
+                break;
+            case 's':
+                u.s = va_arg(args, const char*);
+                OUTMSG(("%s", u.s));
+                break;
+            case 'V':
+                u.vers = va_arg(args, ver_t);
+                OUTMSG(("%V", u.vers));
+                break;
+            case 'd':
+            default:
+                u.i = va_arg(args, int);
+                OUTMSG(("%d", u.i));
+                break;
+        }
+        OUTMSG(("\""));
+    }
+
+    if (data) {
+        OUTMSG((">"));
+        rc = reportData1(data);
+        if (close)
+        {   OUTMSG(("</%s", name)); }
+    }
+    else if (open && close)
+    {   OUTMSG(("/")); }
+
+    OUTMSG((">"));
+    if (eol)
+    {   OUTMSG(("\n")); }
+
+    return rc;
+}
+
+static void CC report(uint32_t indent, const char* name, uint32_t count, ...) {
+     va_list args;
+     va_start(args, count);
+     reportImpl(indent, true, true, true, name, NULL, count, args);
+     va_end(args);
+}
+
+static
+void CC reportData(uint32_t indent, const char* name, const char* data, uint32_t count, ...)
+{
+    va_list args;
+    va_start(args, count);
+    reportImpl(indent, true, true, true, name, data, count, args);
+    va_end(args);
+}
+
+static void CC reportOpen(uint32_t indent, const char* name, uint32_t count, ...) {
+    va_list args;
+    va_start(args, count);
+    reportImpl(indent, true, false, true, name, NULL, count, args);
+    va_end(args);
+}
+
+static void CC reportClose(uint32_t indent, const char* name)
+{   reportImpl(indent, false, true, true, name, NULL, 0, NULL); }
+
+static void CC reportError(uint32_t indent, rc_t rc, const char* function) {
+    report(indent, "Error", 2,
+         "rc"      , 'R', rc,
+         "function", 's', function);
+}
+
+static void CC reportErrorStrImpl(uint32_t indent, rc_t rc,
+    const char* function, const char* name, const char* val, bool eol)
+{
+    int sign = eol ? 1 : -1;
+    if (rc || function) {
+        if (name != NULL || val != NULL) {
+            report(indent, "Error", sign * 3,
+                "rc", 'R', rc,
+                "function", 's', function,
+                name, 's', val);
+        }
+        else {
+            report(indent, "Error", sign * 2,
+                "rc", 'R', rc,
+                "function", 's', function);
+        }
+    }
+    else {
+        report(indent, "Error", sign,
+            name, 's', val);
+    }
+}
+
+static void CC reportErrorStr(uint32_t indent, rc_t rc, const char* function,
+    const char* name, const char* val)
+{   reportErrorStrImpl(indent, rc, function, name, val, true); }
+
+static void CC reportErrorStrInt(uint32_t indent, rc_t rc, const char* function,
+    const char* names, const char* vals, const char* namei, uint32_t vali)
+{
+    report(indent, "Error", 4,
+        "rc"      , 'd', rc,
+        "function", 's', function,
+        names     , 's', vals,
+        namei     , 'd', vali);
+}
+
+static void CC reportError3Str(uint32_t indent, rc_t rc, const char* function,
+    const char* name, const char* v1, const char* v2, const char* v3,
+    bool eol)
+{
+    char* buffer = malloc(strlen(v1) + strlen(v2) + strlen(v3) + 1);
+    if (buffer) {
+        sprintf(buffer, "%s%s%s", v1, v2, v3);
+        reportErrorStrImpl(indent, rc, function, name, buffer, eol);
+        free(buffer);
+    }
+}
+
+static ReportFuncs report_funcs =
+{
+    report,
+    reportData,
+    reportData1,
+    reportOpen,
+    reportOpen1,
+    reportClose,
+    reportClose1,
+    reportError,
+    reportErrorStr,
+    reportErrorStrImpl,
+    reportErrorStrInt,
+    reportError3Str
+};
+
+static rc_t ReportRun(int indent, rc_t rc_in) {
+    rc_t rc = 0;
+
+    const char tag[] = "Run";
+
+    Report* self = NULL;
+    ReportGet(&self);
+    if (self == NULL) {
+        return rc;
+    }
+
+    reportOpen(indent, tag, 0);
+
+    {
+        KTime kt;
+        const char tag[] = "Date";
+        reportOpen(indent + 1, tag, 0);
+        KTimeLocal(&kt, self->start);
+        report(indent + 2, "Start", 1, "value", 'T', &kt);
+        KTimeLocal(&kt, KTimeStamp());
+        report(indent + 2, "End"  , 1, "value", 'T', &kt);
+        reportClose(indent + 1, tag);
+    }
+
+    {
+        const char* name = "HOME";
+        const char* val = getenv(name);
+        if (val == NULL) {
+            name = "USERPROFILE";
+            val = getenv(name);
+        }
+        if (val == NULL)
+        {   name = val = "not found"; }
+        report(indent + 1, "Home", 2, "name", 's', name, "value", 's', val);
+    }
+
+    if ( self -> report_cwd != NULL )
+        rc = ( * self -> report_cwd ) ( & report_funcs, indent + 1 );
+
+    {
+        const char tag[] = "CommandLine";
+        int i = 0;
+        reportOpen(indent + 1, tag, 1, "argc", 'd', self->argc);
+        for (i = 0; i < self->argc; ++i) {
+            if (self->argv && self->argv[i]) {
+                report(indent + 2, "Arg", 2, "index", 'd', i,
+                    "value", 's', self->argv[i]);
+            }
+        }
+        reportClose(indent + 1, tag);
+    }
+
+    report(indent + 1, "Result", 1, "rc", 'R', rc_in);
+
+    report(indent + 1, "User", 1,
+        "admin", 's', is_iser_an_admin() ? "true" : "false");
+
+    reportClose(indent, tag);
+
+    return rc;
+}
+
+static rc_t ReportEnv(int indent) {
+    rc_t rc = 0;
+
+    const char tag[] = "Env";
+
+    const char * env_list [] = {
+        "all_proxy",
+        "ALL_PROXY",
+        "http_proxy",
+        "HTTP_PROXY",
+        "KLIB_CONFIG",
+        "VDBCONFIG",
+        "VDB_CONFIG",
+        ENV_KRYPTO_PWFILE,
+    };
+
+    int i = 0;
+
+    reportOpen(indent, tag, 0);
+
+    for (i = 0; i < sizeof env_list / sizeof env_list[0]; ++i) {
+        const char *val = getenv(env_list[i]);
+        if (val != NULL) {
+            report(indent + 1, env_list[i], 1, "value", 's', val);
+        }
+    }
+
+    reportClose(indent, tag);
+
+    return rc;
+}
+
+/* Silence
+ *  tell report to be silent at exit
+ *  useful especially in response to ^C
+ */
+LIB_EXPORT void CC ReportSilence ( void )
+{
+    Report* self = NULL;
+    ReportGet(&self);
+    if ( self != NULL )
+        self -> silence = true;
+}
+
+static rc_t reportToFileSet(const Report* self,
+    KWrtHandler* old_handler, const char* name, bool* to_file)
+{
+    rc_t rc = 0;
+    assert(self && to_file);
+    if (self->report_redirect) {
+        rc = (*self->report_redirect)(old_handler, name, to_file, false);
+    }
+    return rc;
+}
+
+static rc_t reportToStdErrSet(const Report* self, KWrtHandler* old_handler) {
+    rc_t rc = 0;
+    assert(self);
+    if (self->report_redirect) {
+        rc = (*self->report_redirect)(old_handler, NULL, NULL, false);
+    }
+    return rc;
+}
+
+/* Finalize:
+ * If (rc_in != 0) then report environment information.
+ * Then clean itself.
+ *
+ * When "--" OPTION_REPORT "always" command line argument is passed
+ * then the report [usually] goes to strerr.
+ *
+ * When aForce == true then the report goes to strout:
+ * it is done to insert it into test-sra output.
+ */
+static rc_t _ReportFinalize
+    (rc_t rc_in, bool aForce, uint32_t configNodesSkipCount, ...)
+{
+    rc_t rc = 0;
+
+    va_list args;
+
+    const char* report_arg = NULL;
+
+    bool force = rc_in != 0;
+
+    Report* self = NULL;
+    ReportGet(&self);
+
+    if (self == NULL) {
+        return rc;
+    }
+
+    va_start(args, configNodesSkipCount);
+
+    if (GetRCTarget(rc_in) == rcArgv) {
+        force = false;
+    }
+    else {
+        bool wasDbOrTableSet = true;
+        if (self->report_vdb != NULL) {
+            (*self->report_vdb)(&report_funcs, 0, NULL, &wasDbOrTableSet);
+            if (!wasDbOrTableSet) {
+                force = false;
+            }
+        }
+    }
+
+    if (!force && aForce) {
+        force = true;
+        self -> silence = false;
+    }
+
+    if (self->argv) {
+        int i = 0;
+        for (i = 1; i < self->argc; ++i) {
+            if (strcmp("--" OPTION_REPORT, self->argv[i]) == 0) {
+                if (i + 1 < self->argc) {
+                    report_arg = self->argv[i + 1];
+                }
+                break;
+            }
+        }
+    }
+
+    if (report_arg && strcmp("always", report_arg) == 0) {
+        force = true;
+        self -> silence = false;
+    }
+
+    if (!self -> silence) {
+        if (force) { 
+            if (report_arg && strcmp("never", report_arg) == 0) {
+                force = false;
+            }
+        }
+/*                              PLOGERR(klogErr, (klogErr,
+                               RC(rcApp, rcArgv, rcParsing, rcRange, rcInvalid),
+                               "report type '$(type)' is unrecognized",
+                               "type=%s", self->argv[i + 1]));*/
+
+        if (force) {
+            if (self->hasZombies && !aForce) {
+                KOutHandlerSetStdErr();
+                if (self->object.ptr != NULL) {
+                    OUTMSG(("\nThe archive '%s' may be truncated: "
+                        "Please download it again.\n", self->object.ptr));
+                }
+                else {
+                    OUTMSG(("\nThe archive may be truncated: "
+                        "Please download it again.\n"));
+                }
+            }
+            else {
+                int indent = 0;
+                const char tag[] = "Report";
+
+                char path[PATH_MAX + 1] = "";
+                bool to_file = false;
+                KWrtHandler old_handler;
+                if (rc_in == 0) {
+                    if (!aForce) {
+                        reportToStdErrSet(self, &old_handler);
+                    }
+                }
+                else {
+                    rc_t rc2 = 0;
+                    const char name[] = "ncbi_error_report.xml";
+                    const char* home = getenv("HOME");
+                    if (home == NULL) {
+                        home = getenv("USERPROFILE");
+                    }
+                    if (home) {
+                        size_t num_writ = 0;
+                        rc2 = string_printf
+                            (path, sizeof path, &num_writ, "%s/%s", home, name);
+                        assert(num_writ < sizeof path);
+                    }
+                    if (rc2 != 0 || home == NULL) {
+                        size_t num_writ = 0;
+                        rc2 = string_printf
+                            (path, sizeof path, &num_writ, "%s", name);
+                        assert(num_writ < sizeof path);
+                        assert(rc2 == 0);
+                    }
+                    reportToFileSet(self, &old_handler, path, &to_file);
+                }
+                if (!to_file && rc_in) {
+                    OUTMSG((
+"\n"
+"=============================================================\n"
+"An error occurred during processing.\n"
+"If the problem persists, you may consider sending the following XML document\n"
+"to 'sra at ncbi.nlm.nih.gov' for assistance.\n"
+"=============================================================\n\n"));
+                }
+
+                reportOpen(indent, tag, 0);
+
+                {
+                    rc_t rc2 = ReportRun(indent + 1, rc_in);
+                    if (rc == 0 && rc2 != 0)
+                    {   rc = rc2; }
+                }
+
+                if ( self -> report_config != NULL )
+                {
+                    rc_t rc2 = ( * self -> report_config ) ( & report_funcs,
+                        indent + 1, configNodesSkipCount, args );
+                    if (rc == 0 && rc2 != 0)
+                    {   rc = rc2; }
+                }
+
+                if (self -> report_vdb != NULL) {
+                    rc_t rc2 = (*self->report_vdb)
+                        (&report_funcs, indent + 1, self -> object . ptr, NULL);
+                    if (rc == 0 && rc2 != 0) {
+                        rc = rc2;
+                    }
+                }
+
+                if ( self -> report_software != NULL )
+                {
+                    const char *argv_0 = self -> argv ? self -> argv [ 0 ] : "";
+                    rc_t rc2 = ( * self -> report_software )
+                        ( & report_funcs, indent + 1,
+                            argv_0, self -> date, self -> tool_ver );
+                    if (rc == 0 && rc2 != 0)
+                    {   rc = rc2; }
+                }
+
+                {
+                    rc_t rc2 = ReportEnv(indent + 1);
+                    if (rc == 0 && rc2 != 0)
+                    {   rc = rc2; }
+                }
+
+                if (self->hasZombies) {
+                    OUTMSG(("\nOne of archives may be truncated: "
+                        "It should be redownloaded.\n"));
+                }
+
+                reportClose(indent, tag);
+                reportData1("\n");
+
+                if (to_file) {
+                    KOutHandlerSetStdErr();
+                    OUTMSG((
+"\n"
+"=============================================================\n"
+"An error occurred during processing.\n"
+"A report was generated into the file '%s'.\n"
+"If the problem persists, you may consider sending the file\n"
+"to 'sra at ncbi.nlm.nih.gov' for assistance.\n"
+"=============================================================\n\n", path));
+                }
+            }
+        }
+    }
+
+    ReportRelease();
+
+    va_end(args);
+
+    return rc;
+}
+
+/* Finalize:
+ * If (rc_in != 0) then report environment information.
+ * Then clean itself.
+ */
+LIB_EXPORT rc_t CC ReportFinalize(rc_t rc_in) {
+    return _ReportFinalize(rc_in, false, 0);
+}
+
+LIB_EXPORT rc_t CC ReportForceFinalize(void) {
+    return _ReportFinalize(0, true, 1, "VDBCOPY");
+}
+
+static
+char **copy_argv ( int argc, char **argv )
+{
+    char **argv2 = calloc ( argc, sizeof * argv2 );
+    if (argv2 != NULL) {
+        int i = 0;
+        for (i = 0; i < argc; ++i) {
+            argv2[i] = string_dup_measure(argv[i], NULL);
+        }
+    }
+    return argv2;
+}
+
+/* Init: initialize with common information */
+LIB_EXPORT void CC ReportInit(int argc, char* argv[], ver_t tool_version)
+{
+    static bool latch;
+    if ( ! latch )
+    {
+        /* comes pre-zeroed by runtime */
+        static Report self;
+
+        /* initialize with non-zero parameters */
+        self.start = KTimeStamp();
+        self.argc = argc;
+        self.argv = copy_argv ( argc, argv );
+        self.date = __DATE__;
+        self.tool_ver = tool_version;
+        self.silence = false;
+
+        /* export to the remainder of the source */
+        report_singleton . ptr = & self;
+
+        latch = true;
+    }
+}
+
+
+/* BuildDate
+ *  set the build date of the tool
+ *
+ *  "date" [ IN ] - pre-processor __DATE__
+ */
+LIB_EXPORT void CC ReportBuildDate ( const char *date )
+{
+    Report* self = NULL;
+    ReportGet(&self);
+    if ( self != NULL )
+        self -> date = date;
+}
+
+
+/* InitCWD
+ */
+LIB_EXPORT void CC ReportInitKFS (
+    rc_t ( CC * report_cwd ) ( const ReportFuncs *f, uint32_t indent ),
+    rc_t ( CC * report_redirect ) ( KWrtHandler* handler,
+        const char* filename, bool* to_file, bool finalize ) )
+{
+    Report* self = NULL;
+    ReportGet(&self);
+    if ( self != NULL ) {
+        self -> report_redirect = report_redirect;
+        self -> report_cwd = report_cwd;
+    }
+}
+
+
+/* InitConfig
+ */
+LIB_EXPORT const char* CC ReportInitConfig ( rc_t ( CC * report )
+    ( const ReportFuncs *f, uint32_t indent,
+      uint32_t configNodesSkipCount, va_list args ) )
+{
+    Report* self = NULL;
+    ReportGet(&self);
+    if ( self != NULL )
+    {
+        self -> report_config = report;
+        return self -> argv [ 0 ];
+    }
+    return NULL;
+}
+
+/* InitVDB
+ */
+LIB_EXPORT rc_t CC ReportInitVDB(
+    ReportObj *report_obj, ReportSoftware *report_software, Whack *whack)
+{
+    Report* self = NULL;
+    rc_t rc = ReportGet(&self);
+    if ( rc == 0 && self)
+    {
+        self -> report_vdb = report_obj;
+        self -> report_software = report_software;
+        self -> whack_vdb = whack;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC ReportResetObject(const char* path)
+{
+    Report* self = NULL;
+
+    if ( path == NULL )
+        path = "NULL";
+    else if ( path [ 0 ] == 0 )
+        path = "EMPTY";
+
+    ReportGet(&self);
+    if (self == NULL) {
+        return 0;
+    }
+
+    return ReportReplaceObjectPtr(self, path);
+}
+
+LIB_EXPORT void CC ReportRecordZombieFile(void)
+{
+    Report* self = NULL;
+    ReportGet(&self);
+    if (self == NULL)
+    {   return; }
+    self->hasZombies = true;
+}
diff --git a/libs/klib/sra-release-version.c b/libs/klib/sra-release-version.c
new file mode 100644
index 0000000..c8f40b6
--- /dev/null
+++ b/libs/klib/sra-release-version.c
@@ -0,0 +1,335 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/printf.h> /* string_printf */
+#include <klib/rc.h>
+#include <klib/sra-release-version.h>
+
+#include "release-vers.h"
+
+#include <ctype.h> /* isdigit */
+#include <os-native.h>
+#include <string.h> /* memset */
+#include <assert.h>
+
+LIB_EXPORT rc_t CC SraReleaseVersionGet(SraReleaseVersion *version) {
+    if (version == NULL) {
+        return RC(rcRuntime, rcArgv, rcAccessing, rcParam, rcNull);
+    }
+
+    version->version = RELEASE_VERS;
+    version->revision = RELEASE_REVISION;
+
+    switch (RELEASE_TYPE) {
+        case 'a':
+            version->type = eSraReleaseVersionTypeAlpha;
+            break;
+        case 'b':
+            version->type = eSraReleaseVersionTypeBeta;
+            break;
+        case 'c':
+            version->type = eSraReleaseVersionTypeRC;
+            break;
+        case 'd':
+            version->type = eSraReleaseVersionTypeDev;
+            break;
+        default:
+            version->type = eSraReleaseVersionTypeFinal;
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC SraReleaseVersionCmp(const SraReleaseVersion *self,
+    const SraReleaseVersion *version2, int32_t *result)
+{
+    if (result == NULL) {
+        return RC(rcRuntime, rcArgv, rcAccessing, rcParam, rcNull);
+    }
+
+    *result = 0;
+
+    if (self == NULL) {
+        return RC(rcRuntime, rcArgv, rcAccessing, rcSelf, rcNull);
+    }
+
+    if (version2 == NULL) {
+        return RC(rcRuntime, rcArgv, rcAccessing, rcParam, rcNull);
+    }
+
+    if (self->version < version2->version) {
+        *result = 1;
+    }
+    else if (self->version > version2->version) {
+        *result = -1;
+    }
+    else if (self->type < version2->type) {
+        *result = 1;
+    }
+    else if (self->type > version2->type) {
+        *result = -1;
+    }
+    else if (self->revision < version2->revision) {
+        *result = 1;
+    }
+    else if (self->revision > version2->revision) {
+        *result = -1;
+    }
+    else {
+        *result = 0;
+    }
+
+    return 0;
+}
+
+static int32_t getdigit(const char **s, size_t *size, int32_t max) {
+    int32_t d = 0;
+    char c = 0;
+
+    assert(s && size);
+
+    if (*size == 0) {
+        return 0;
+    }
+
+    c = **s;
+    if (!isdigit(c)) {
+        if (c == '\n') {
+            return 0;
+        }
+        else {
+            return -1;
+        }
+    }
+
+    while (*size > 0) {
+        char c = **s;
+        if (isdigit(c)) {
+            d = d * 10 + c - '0';
+        }
+        else {
+            break;
+        }
+        ++(*s);
+        --*size;
+    }
+
+    if (max > 0 && d > max) {
+        return -2;
+    }
+
+    return d;
+}
+
+#define SET_RC(i) ( \
+    (i) == -1 ? RC(rcRuntime, rcFile, rcReading, rcFile, rcInvalid) \
+              : RC(rcRuntime, rcFile, rcReading, rcNumeral, rcExcessive) )
+
+/* Parse
+ *  Initialize SraReleaseVersion from char version[size]
+ */
+LIB_EXPORT rc_t CC SraReleaseVersionInit ( SraReleaseVersion *self,
+    const char *version, size_t size )
+{
+    rc_t rc = 0;
+    int32_t major = 0, minor = 0, release = 0, revision = 0, i = 0,
+        type = eSraReleaseVersionTypeFinal; 
+    const char *p = version;
+
+    if (self == NULL) {
+        return RC(rcRuntime, rcArgv, rcAccessing, rcSelf, rcNull);
+    }
+
+    assert(self);
+    memset(self, 0, sizeof *self);
+
+    self->type = eSraReleaseVersionTypeFinal;
+
+    if (size == 0) {
+        return 0;
+    }
+
+    /* major: 1. */
+    if (size > 0 && rc == 0) {
+        int32_t i = getdigit(&p, &size, 255);
+        if (i >= 0) {
+            major = i;
+        }
+        else {
+            rc = SET_RC(i);
+        }
+    }
+
+    /* minor: 1.2 */
+    if (size > 0 && rc == 0 && *p != '\n') {
+        if (*p != '.' && *p != '-') {
+            rc = RC(rcRuntime, rcFile, rcReading, rcFile, rcInvalid);
+        }
+        if (*p == '.') {
+            ++p;
+            --size;
+            i = getdigit(&p, &size, 255);
+            if (i >= 0) {
+                minor = i;
+            }
+            else {
+                rc = SET_RC(i);
+            }
+        }
+    }
+
+    /* release: 1.2.3 */
+    if (size > 0 && rc == 0 && *p != '\n') {
+        if (*p != '.' && *p != '-') {
+            rc = RC(rcRuntime, rcFile, rcReading, rcFile, rcInvalid);
+        }
+        if (*p == '.') {
+            ++p;
+            --size;
+            i = getdigit(&p, &size, 0xFFFF);
+            if (i >= 0) {
+                release = i;
+            }
+            else {
+                rc = SET_RC(i);
+            }
+        }
+    }
+
+    /* dash: 1.2.3- */
+    if (size > 0 && rc == 0 && *p != '\n') {
+        if (*p != '-') {
+            rc = RC(rcRuntime, rcFile, rcReading, rcFile, rcInvalid);
+        }
+        ++p;
+        --size;
+    }
+
+    /* type: 1.2.3-a 1.2.3-rc */
+    if (size > 0 && rc == 0 && *p != '\n') {
+        if (!isalpha(*p)) {
+            if (!isdigit(*p)) {
+                rc = RC(rcRuntime, rcFile, rcReading, rcFile, rcInvalid);
+            }
+        }
+        else {
+            switch (*p) {
+                case 'a':
+                    type = eSraReleaseVersionTypeAlpha;
+                    break;
+                case 'b':
+                    type = eSraReleaseVersionTypeBeta;
+                    break;
+                case 'r':
+                    type = eSraReleaseVersionTypeRC;
+                    ++p;
+                    --size;
+                    if (size == 0) {
+                        rc = RC(rcRuntime,
+                            rcFile, rcReading, rcFile, rcInvalid);
+                    }
+                    else if (*p != 'c') {
+                        rc = RC(rcRuntime,
+                            rcFile, rcReading, rcFile, rcInvalid);
+                    }
+                    break;
+            }
+            ++p;
+            --size;
+        }
+    }
+
+    /* revision: 1.2.3-4 1.2.3-b4 1.2.3-rc4 */
+    if (size > 0 && rc == 0 && *p != '\n') {
+        i = getdigit(&p, &size, 0);
+        if (i >= 0) {
+            revision = i;
+        }
+        else {
+            rc = SET_RC(i);
+        }
+    }
+
+    if (size > 0 && rc == 0 && *p != '\n') {
+        rc = RC(rcRuntime, rcFile, rcReading, rcFile, rcInvalid);
+    }
+
+    if (rc == 0) {
+        self->version = (major << 24) + (minor << 16) + release;
+        self->revision = revision;
+        self->type = type;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SraReleaseVersionPrint ( const SraReleaseVersion *self,
+    char *version, size_t size, size_t *num_writ )
+{
+    rc_t rc = 0;
+    const char *type = "";
+
+    if (self == NULL) {
+        return RC(rcRuntime, rcArgv, rcAccessing, rcSelf, rcNull);
+    }
+
+    switch (self->type) {
+        case eSraReleaseVersionTypeDev:
+            type = "-dev";
+            break;
+        case eSraReleaseVersionTypeAlpha:
+            type = "-a";
+            break;
+        case eSraReleaseVersionTypeBeta:
+            type = "-b";
+            break;
+        case eSraReleaseVersionTypeRC:
+            type = "-rc";
+            break;
+        case eSraReleaseVersionTypeFinal:
+            if (self->revision == 0) {
+                type = "";
+            }
+            else {
+                type = "-";
+            }
+            break;
+        default:
+            assert(0);
+            break;
+    }
+
+    if (self->revision == 0) {
+        rc = string_printf(version, size, num_writ,
+            "%.3V%s", self->version, type);
+    }
+    else {
+        rc = string_printf(version, size, num_writ,
+            "%V%s%d", self->version, type, self->revision);
+    }
+
+    return rc;
+}
diff --git a/libs/klib/status-rc-strings.c b/libs/klib/status-rc-strings.c
new file mode 100644
index 0000000..b99962f
--- /dev/null
+++ b/libs/klib/status-rc-strings.c
@@ -0,0 +1,40 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sysalloc.h>
+
+#define PASTE2(a,b) a##b
+#define STRINGIFY(a) #a
+#define RC_ENUM(type) const char * PASTE2(type,Strings)[] =
+#define RC_ENTRY(a,b) STRINGIFY(a),
+#define RC_VFIRST(a,b)
+#define RC_VLAST(a)
+#define RC_LAST(a) "INVALID"
+
+#define RC_EMIT 0
+
+#include <klib/rc.h>
+
diff --git a/libs/klib/status-rc.c b/libs/klib/status-rc.c
new file mode 100644
index 0000000..73f7730
--- /dev/null
+++ b/libs/klib/status-rc.c
@@ -0,0 +1,156 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "writer-priv.h"
+#include <klib/writer.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <os-native.h> /* for strchrnul on non-linux */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <assert.h>
+
+size_t KWrtFmt_rc_t ( char * pout, size_t max, const char * fmt, rc_t rc_in )
+{
+    rc_t rc;
+    const char * str;
+    const char * mod_str;
+    const char * targ_str;
+    const char * ctx_str;
+    const char * obj_str;
+    const char * state_str;
+    size_t needed;
+    size_t mod_size;
+    size_t targ_size;
+    size_t ctx_size;
+    size_t obj_size;
+    size_t state_size;
+    enum RCModule mod;
+    enum RCTarget targ;
+    enum RCContext ctx;
+    int obj;
+    enum RCState state;
+
+    assert (pout);
+    assert (fmt);
+
+    if (*fmt == '#')
+        rc = RCExplain (rc_in, pout, max, &needed);
+
+    else if (rc_in != 0)
+    {
+        mod = GetRCModule (rc_in);
+        targ = GetRCTarget (rc_in);
+        ctx = GetRCContext (rc_in);
+        obj = GetRCObject (rc_in);
+        state = GetRCState (rc_in);
+
+        if ((mod < 0) || (mod > rcLastModule_v1_1))
+            mod = rcLastModule_v1_1;
+
+        if ((targ < 0) || (targ > rcLastTarget_v1_1))
+            targ = rcLastTarget_v1_1;
+
+        if ((ctx < 0) || (ctx > rcLastContext_v1_1))
+            ctx = rcLastContext_v1_1;
+
+        if ((obj < 0) || (obj > rcLastObject_v1_1))
+            obj = rcLastObject_v1_1;
+
+        if ((state < 0) || (state > rcLastState_v1_1))
+            state = rcLastState_v1_1;
+
+        mod_str = RCModuleStrings[mod];
+        str = strchrnul(mod_str, ' ');
+        mod_size = str - mod_str;
+
+        targ_str = RCTargetStrings[targ];
+        str = strchrnul(targ_str, ' ');
+        targ_size = str - targ_str;
+
+        ctx_str = RCContextStrings[ctx];
+        str = strchrnul(ctx_str, ' ');
+        ctx_size = str - ctx_str;
+
+/* object is tricky because it overlaps target */
+        if (obj == 0)
+        {
+            obj_str = RCObjectStrings[obj];
+            str = strchrnul(obj_str, ' ');
+            obj_size = str - obj_str;
+        }
+        else if (obj < rcLastTarget_v1_1)
+        {
+            obj_str = RCTargetStrings[obj];
+            str = strchrnul(obj_str, ' ');
+            obj_size = str - obj_str;
+        }
+        else
+        {
+            obj -= (rcLastTarget_v1_1-1);
+            obj_str = RCObjectStrings[obj];
+            str = strchrnul(obj_str, ' ');
+            obj_size = str - obj_str;
+        }
+
+        state_str = RCStateStrings[state];
+        str = strchrnul(state_str, ' ');
+        state_size = str - state_str;
+
+#if _DEBUGGING
+        rc = string_printf (pout, max, & needed, "RC(%s:%u:%s %*s,%*s,%*s,%*s,%*s)", 
+                            GetRCFilename(), GetRCLineno(), GetRCFunction(),
+                           (uint32_t)mod_size, mod_str,
+                           (uint32_t)targ_size, targ_str,
+                           (uint32_t)ctx_size, ctx_str,
+                           (uint32_t)obj_size, obj_str,
+                           (uint32_t)state_size, state_str);
+#else
+        rc = string_printf (pout, max, & needed, "RC(%*s,%*s,%*s,%*s,%*s)", 
+                           (uint32_t)mod_size, mod_str,
+                           (uint32_t)targ_size, targ_str,
+                           (uint32_t)ctx_size, ctx_str,
+                           (uint32_t)obj_size, obj_str,
+                           (uint32_t)state_size, state_str);
+#endif
+    }
+    else
+    {
+        state = GetRCState (rc_in);
+        state_str = RCStateStrings[state];
+        str = strchrnul(state_str, ' ');
+        state_size = str - state_str;
+        rc = string_printf (pout, max, & needed, "RC(%*s)",
+                           (uint32_t)state_size, state_str);
+    }
+
+    return rc != 0 ? 0 : needed;
+}
diff --git a/libs/klib/status.c b/libs/klib/status.c
new file mode 100644
index 0000000..d068064
--- /dev/null
+++ b/libs/klib/status.c
@@ -0,0 +1,439 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include <klib/extern.h>
+#include <klib/status.h>
+#include "writer-priv.h"
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <va_copy.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+static KStsLevel G_sts_level = 0;
+
+static KWrtHandler G_sts_handler;
+static KWrtHandler G_sts_lib_handler;
+
+static KFmtHandler G_sts_formatter;
+static KStsFmtFlags G_sts_formatter_flags;
+static KFmtHandler G_sts_lib_formatter;
+static KStsFmtFlags G_sts_lib_formatter_flags;
+
+static
+rc_t CC KStsDefaultFormatter( void* self, KWrtHandler* writer,
+                              size_t argc, const wrt_nvp_t args[],
+                              size_t envc, const wrt_nvp_t envs[] )
+{
+    rc_t rc = 0;
+    size_t num_writ, nsize;
+    uint32_t mlen;
+    char buffer[8192], *nbuffer;
+    const char* msg, *mend;
+
+    /* if writer is null than silence */
+    if( writer == NULL || writer->writer == NULL ) {
+        return rc;
+    }
+    msg = wrt_nvp_find_value(envc, envs, "message");
+    if( msg != NULL ) {
+        mend = msg + strlen(msg);
+        /* strip trailing newlines */
+        while( mend != msg && (*mend == '\n' || *mend == '\r') ) {
+            --mend;
+        }
+        mlen = ( uint32_t ) ( mend - msg );
+    } else {
+        mlen = 0;
+    }
+
+    nbuffer = buffer;
+    nsize = sizeof(buffer);
+    do {
+        rc = string_printf(nbuffer, nsize, & num_writ, "%s %s.%s: %.*s\n",
+                                 wrt_nvp_find_value(envc, envs, "timestamp"),
+                                 wrt_nvp_find_value(envc, envs, "app"),
+                                 wrt_nvp_find_value(envc, envs, "version"),
+                                 ( uint32_t ) mlen, msg);
+        if( num_writ > nsize ) {
+            assert ( nbuffer == buffer );
+            nbuffer = malloc(nsize = num_writ + 2);
+            if( nbuffer == NULL ) {
+                rc = RC(rcRuntime, rcLog, rcLogging, rcMemory, rcExhausted);
+                break;
+            }
+            continue;
+        }
+        /* replace newlines with spaces, excluding last one */
+        for(nsize = 0; nsize < num_writ - 1; nsize++) {
+            if( nbuffer[nsize] == '\n' || nbuffer[nsize] == '\r' ) {
+                nbuffer[nsize] = ' ';
+            }
+        }
+        break;
+    } while(true);
+    if( rc == 0 ) {
+        rc = LogFlush(writer, nbuffer, num_writ);
+    }
+    if( nbuffer != buffer ) {
+        free(nbuffer);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KStsInit ( void )
+{
+    rc_t rc;
+
+    G_sts_level = 0;
+    rc = KStsHandlerSetStdOut();
+
+    if ( rc == 0 )
+        rc = KStsLibHandlerSetStdOut ();
+#if 0
+    if (rc == 0)
+        rc = KStsLibHandlerSet(NULL, NULL);
+#endif
+    if (rc == 0)
+        rc = KStsFmtHandlerSetDefault();
+
+    if (rc == 0)
+        rc = KStsLibFmtHandlerSetDefault();
+
+    return rc;
+}
+
+static
+rc_t CC sts_print(KFmtHandler* formatter, const KStsFmtFlags flags, KWrtHandler* writer, const char* msg, va_list args)
+{
+    rc_t rc = 0;
+    char* nbuffer;
+    size_t num_writ, remaining;
+
+    uint32_t envc = 0;
+    wrt_nvp_t envs[5];
+    char ebuffer[2048];
+    char mbuffer[2048];
+    KFmtWriter fmtwrt;
+
+    assert(formatter != NULL);
+    assert(writer != NULL);
+
+    fmtwrt = formatter->formatter;
+    if( fmtwrt == NULL ) {
+        fmtwrt = KStsDefaultFormatter;
+    }
+    if( fmtwrt == KStsDefaultFormatter && writer->writer == NULL ) {
+        /* default formatting with NULL writer -> silence */
+        return rc;
+    }
+    nbuffer = (char*)ebuffer;
+    remaining = sizeof(ebuffer);
+    do {
+#define FIX_UP() if(rc){break;} remaining -= num_writ; nbuffer += num_writ
+        if( flags & (kstsFmtTimestamp | kstsFmtLocalTimestamp) ) {
+            if( flags & kstsFmtLocalTimestamp ) {
+                rc = LogSimpleTimestamp(nbuffer, remaining, &num_writ);
+            } else {
+                rc = LogTimestamp(nbuffer, remaining, &num_writ);
+            }
+            nbuffer[num_writ++] = '\0';
+            envs[envc].name = "timestamp";
+            envs[envc++].value = nbuffer;
+            FIX_UP();
+        }
+        if( flags & kstsFmtPid ) {
+            rc = LogPID(nbuffer, remaining, &num_writ);
+            nbuffer[num_writ++] = '\0';
+            envs[envc].name = "pid";
+            envs[envc++].value = nbuffer;
+            FIX_UP();
+        }
+        if( flags & kstsFmtAppName ) {
+            rc = LogAppName(nbuffer, remaining, &num_writ);
+            nbuffer[num_writ++] = '\0';
+            envs[envc].name = "app";
+            envs[envc++].value = nbuffer;
+            FIX_UP();
+        }
+        if( flags & kstsFmtAppVersion ) {
+            rc = LogAppVersion(nbuffer, remaining, &num_writ);
+            nbuffer[num_writ++] = '\0';
+            envs[envc].name = "version";
+            envs[envc++].value = nbuffer;
+            FIX_UP();
+        }
+#undef FIX_UP
+    } while(false);
+    /* env must have one spare element for message added text below */
+    if( rc == 0 && envc >= (sizeof(envs)/sizeof(envs[0])) ) {
+        rc = RC(rcRuntime, rcLog, rcLogging, rcTable, rcInsufficient);
+    }
+    nbuffer = (char*)mbuffer;
+    remaining = sizeof(mbuffer);
+
+    if( rc == 0 ) {
+        if( flags & kstsFmtMessage ) {
+            if( msg == NULL || msg[0] == '\0' ) {
+                msg = "empty status message";
+            }
+            do {
+                va_list args_copy;
+                va_copy(args_copy, args);
+                rc = string_vprintf(nbuffer, remaining, &num_writ, msg, args_copy);
+                va_end(args_copy);
+                if( num_writ > remaining ) {
+                    if(nbuffer != mbuffer) {
+                        free(nbuffer);
+                    }
+                    nbuffer = malloc(remaining = num_writ);
+                    if( nbuffer == NULL ) {
+                        rc = RC(rcRuntime, rcLog, rcLogging, rcMemory, rcExhausted);
+                    }
+                } else {
+                    if( rc == 0 ) {
+                        envs[envc].name = "message";
+                        envs[envc++].value = nbuffer;
+                    }
+                    break;
+                }
+            } while( rc == 0 );
+        }
+    }
+    if( rc != 0 ) {
+        /* print reason for failure */
+        rc = string_printf((char*)mbuffer, sizeof(mbuffer), NULL, "status failure: %R in '%s'", rc, msg);
+        envs[envc].name = "message";
+        envs[envc++].value = mbuffer;
+    }
+    wrt_nvp_sort(envc, envs);
+    rc = fmtwrt(formatter->data, writer, 0, NULL, envc, envs);
+    if(nbuffer != mbuffer) {
+        free(nbuffer);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KStsMsg(const char* msg, ...)
+{
+    rc_t rc;
+    va_list args;
+
+    va_start(args, msg);
+    rc = sts_print(KStsFmtHandlerGet(), G_sts_formatter_flags, KStsHandlerGet(), msg, args);
+    va_end(args);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KStsLibMsg(const char* msg, ...)
+{
+    rc_t rc;
+    va_list args;
+
+    va_start(args, msg);
+    rc = sts_print(KStsLibFmtHandlerGet(), G_sts_lib_formatter_flags, KStsLibHandlerGet(), msg, args);
+    va_end(args);
+    return rc;
+}
+
+LIB_EXPORT KStsLevel CC KStsLevelGet(void)
+{
+    return G_sts_level;
+}
+
+LIB_EXPORT void CC KStsLevelSet(KStsLevel lvl)
+{
+    G_sts_level = lvl;
+}
+
+LIB_EXPORT void CC KStsLevelAdjust(int32_t adjust)
+{
+    int32_t l = KStsLevelGet();
+    l += adjust;
+    KStsLevelSet( l < 0 ? 0 : l);
+}
+
+LIB_EXPORT rc_t CC KStsHandlerSetStdOut ( void )
+{
+    return KStsHandlerSet( KWrt_DefaultWriter, KWrt_DefaultWriterDataStdOut );
+}
+
+LIB_EXPORT rc_t CC KStsLibHandlerSetStdOut ( void )
+{
+    return KStsLibHandlerSet( KWrt_DefaultWriter, KWrt_DefaultWriterDataStdOut );
+}
+
+LIB_EXPORT rc_t CC KStsHandlerSetStdErr ( void )
+{
+    return KStsHandlerSet( KWrt_DefaultWriter, KWrt_DefaultWriterDataStdErr );
+}
+
+LIB_EXPORT rc_t CC KStsLibHandlerSetStdErr ( void )
+{
+    return KStsLibHandlerSet( KWrt_DefaultWriter, KWrt_DefaultWriterDataStdErr );
+}
+
+LIB_EXPORT rc_t CC KStsHandlerSet ( KWrtWriter writer, void * writer_data )
+{
+    G_sts_handler.writer = writer;
+    G_sts_handler.data = writer_data;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KStsLibHandlerSet ( KWrtWriter writer, void * writer_data )
+{
+    G_sts_lib_handler.writer = writer;
+    G_sts_lib_handler.data = writer_data;
+    return 0;
+}
+
+LIB_EXPORT void * CC KStsDataGet ( void )
+{
+    return ( KStsHandlerGet()->data );
+}
+
+LIB_EXPORT void * CC KStsLibDataGet ( void )
+{
+    return ( KStsLibHandlerGet()->data );
+}
+
+LIB_EXPORT KWrtWriter CC KStsWriterGet ( void )
+{
+    return ( KStsHandlerGet()->writer );
+}
+
+LIB_EXPORT KWrtWriter CC KStsLibWriterGet ( void )
+{
+    return ( KStsLibHandlerGet()->writer );
+}
+
+LIB_EXPORT KWrtHandler * CC KStsHandlerGet ( void )
+{
+    return ( &G_sts_handler );
+}
+
+LIB_EXPORT KWrtHandler * CC KStsLibHandlerGet ( void )
+{
+    return ( &G_sts_lib_handler );
+}
+
+static const uint32_t sts_dflt_opt = kstsFmtTimestamp | kstsFmtPid |
+                                     kstsFmtMessage | kstsFmtAppName | kstsFmtAppVersion;
+
+LIB_EXPORT rc_t CC KStsFmtHandlerSetDefault ( void )
+{
+    rc_t rc = KStsFmtHandlerSet(KStsDefaultFormatter, 0, NULL);
+    if( rc == 0 ) {
+        G_sts_formatter_flags = sts_dflt_opt;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KStsLibFmtHandlerSetDefault ( void )
+{
+    rc_t rc = KStsLibFmtHandlerSet(KStsDefaultFormatter, 0, NULL);
+    if( rc == 0 ) {
+        G_sts_lib_formatter_flags = sts_dflt_opt;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KStsFmtFlagsSet ( KStsFmtFlags flags )
+{
+    G_sts_formatter_flags |= flags;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KStsLibFmtFlagsSet ( KStsFmtFlags flags )
+{
+    G_sts_lib_formatter_flags |= flags;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KStsFmtHandlerSet ( KFmtWriter formatter, KStsFmtFlags flags, void* data )
+{
+    if( formatter == NULL ) {
+        return RC(rcRuntime, rcLog, rcLogging, rcFunction, rcNull);
+    }
+    G_sts_formatter.formatter = formatter;
+    G_sts_formatter.data = data;
+    KStsFmtFlagsSet(flags);
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KStsLibFmtHandlerSet ( KFmtWriter formatter, KStsFmtFlags flags, void* data )
+{
+    if( formatter == NULL ) {
+        return RC(rcRuntime, rcLog, rcLogging, rcFunction, rcNull);
+    }
+    G_sts_lib_formatter.formatter = formatter;
+    G_sts_lib_formatter.data = data;
+    KStsLibFmtFlagsSet(flags);
+    return 0;
+}
+
+LIB_EXPORT void * CC KStsFmtDataGet ( void )
+{
+    return ( KStsFmtHandlerGet()->data );
+}
+
+LIB_EXPORT void * CC KStsLibFmtDataGet ( void )
+{
+    return ( KStsFmtHandlerGet()->data );
+}
+
+LIB_EXPORT KFmtWriter CC KStsFmtWriterGet ( void )
+{
+    return ( KStsFmtHandlerGet()->formatter ? KStsFmtHandlerGet()->formatter : KStsDefaultFormatter);
+}
+
+LIB_EXPORT KFmtWriter CC KStsLibFmtWriterGet ( void )
+{
+    return ( KStsLibFmtHandlerGet()->formatter ? KStsLibFmtHandlerGet()->formatter : KStsDefaultFormatter);
+}
+
+LIB_EXPORT KFmtHandler * CC KStsFmtHandlerGet ( void )
+{
+    return ( &G_sts_formatter );
+}
+
+LIB_EXPORT KFmtHandler * CC KStsLibFmtHandlerGet ( void )
+{
+    return ( &G_sts_lib_formatter );
+}
+
+LIB_EXPORT KStsFmtFlags CC KStsFmtFlagsGet ( void )
+{
+    return G_sts_formatter_flags;
+}
+
+LIB_EXPORT KStsFmtFlags CC KStsLibFmtFlagsGet ( void )
+{
+    return G_sts_lib_formatter_flags;
+}
diff --git a/libs/klib/symtab.c b/libs/klib/symtab.c
new file mode 100644
index 0000000..56bfea2
--- /dev/null
+++ b/libs/klib/symtab.c
@@ -0,0 +1,736 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/symtab.h>
+#include <klib/symbol.h>
+#include <klib/token.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KSymbol
+ *  a name to object mapping
+ */
+
+
+/* Init
+ *  initialize a symbol without allocating space
+ *
+ *  "self" [ IN ] - where to initialize
+ *
+ *  "name" [ IN ] - symbol name
+ *
+ *  "type" [ IN ] - symbol type
+ *
+ *  "obj" [ IN, NULL OKAY ] - optional object mapping
+ *
+ */
+KLIB_EXTERN rc_t CC KSymbolInit ( KSymbol * self, 
+    const String * name, uint32_t type, const void * obj)
+{
+    rc_t rc;
+
+    if ( name == NULL )
+        rc = RC ( rcText, rcString, rcConstructing, rcName, rcNull );
+    else if ( name -> len == 0 )
+        rc = RC ( rcText, rcString, rcConstructing, rcName, rcEmpty );
+    else
+    {
+        string_copy ( ( char* ) ( self + 1 ), name -> size + 1, name -> addr, name -> size );
+        StringInit ( & self -> name, ( char* ) ( self + 1 ), name -> size, name -> len );
+        self -> u . obj = obj;
+        self -> dad = NULL;
+        self -> type = type;
+
+        return 0;
+    }
+    return rc;
+}
+
+/* Make
+ *  create a symbol
+ *
+ *  "sym" [ OUT ] - return parameter for symbol
+ *
+ *  "name" [ IN ] - symbol name
+ *
+ *  "type" [ IN ] - symbol type
+ *
+ *  "obj" [ IN, NULL OKAY ] - optional object mapping
+ */
+LIB_EXPORT rc_t CC KSymbolMake ( KSymbol **symp,
+    const String *name, uint32_t type, const void *obj )
+{
+    rc_t rc;
+    if ( symp == NULL )
+        rc = RC ( rcText, rcString, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KSymbol *sym = malloc ( sizeof *sym + name -> size + 1 );
+        if ( sym == NULL )
+            rc = RC ( rcText, rcString, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KSymbolInit (sym, name, type, obj);
+            if (rc == 0)
+            {
+                * symp = sym;
+                return 0;
+            }
+            free (sym);
+        }
+        * symp = NULL;
+    }
+    return rc;
+}
+
+/* Whack
+ */
+LIB_EXPORT void CC KSymbolWhack ( BSTNode *n, void *ignore )
+{
+    KSymbol *self = ( KSymbol* ) n;
+
+    if ( self -> type == eNamespace )
+        BSTreeWhack ( & self -> u . scope, KSymbolWhack, ignore );
+
+    free ( self );
+}
+
+/* Cmp
+ */
+LIB_EXPORT int64_t CC KSymbolCmp ( const void *item, const BSTNode *n )
+{
+    const String *a = item;
+    const KSymbol *b = ( const KSymbol* ) n;
+
+    return StringOrderNoNullCheck ( a, & b -> name );
+}
+
+/* Sort
+ */
+LIB_EXPORT int64_t CC KSymbolSort ( const BSTNode *item, const BSTNode *n )
+{
+    const KSymbol *a = ( const KSymbol* ) item;
+    const KSymbol *b = ( const KSymbol* ) n;
+
+    return StringOrderNoNullCheck ( & a -> name, & b -> name );
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * KSymTable
+ *  scoped stack of BSTree
+ */
+
+
+/* Init
+ *  create an empty symbol table
+ *
+ *  "intrinsic" [ IN ] - intrinsic scope
+ */
+LIB_EXPORT rc_t CC KSymTableInit ( KSymTable *self, const BSTree *intrinsic )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcText, rcTree, rcConstructing, rcSelf, rcNull );
+    else
+    {
+        self -> ns = NULL;
+        VectorInit ( & self -> stack, 0, 16 );
+
+        if ( intrinsic == NULL )
+        {
+            self -> intrinsic = 0;
+            return 0;
+        }
+
+        self -> intrinsic = 1;
+        rc = VectorAppend ( & self -> stack, NULL, intrinsic );
+    }
+
+    return rc;
+}
+
+/* Whack
+ *  must be called to clean up stack
+ */
+#ifndef KSymTableWhack
+LIB_EXPORT void CC KSymTableWhack ( KSymTable *self )
+{
+    if ( self != NULL )
+        VectorWhack ( & self -> stack, NULL, NULL );
+}
+#endif
+
+
+/* PushScope
+ *  pushes a tree onto stack
+ *  fails if count == depth
+ *  otherwise, pushes scope into top of stack
+ *
+ *  "scope" [ IN ] - current top scope
+ */
+LIB_EXPORT rc_t CC KSymTablePushScope ( const KSymTable *cself, BSTree *scope )
+{
+    KSymTable *self = ( KSymTable* ) cself;
+    assert ( self != NULL );
+    assert ( scope != NULL );
+    return VectorAppend ( & self -> stack, NULL, scope );
+}
+
+
+/* PopScope
+ *  removes a tree from stack
+ *  noop if count < self->intrinsic,
+ *  because stack bottom will be intrinsic scope
+ */
+LIB_EXPORT void CC KSymTablePopScope ( const KSymTable *cself )
+{
+    if ( cself != NULL && cself -> stack . len > cself -> intrinsic )
+        -- ( ( KSymTable* ) cself ) -> stack . len;
+}
+
+
+/* PushNamespace
+ *  pushes a namespace scope onto stack
+ */
+LIB_EXPORT rc_t CC KSymTablePushNamespace ( const KSymTable *cself, KSymbol *ns )
+{
+    rc_t rc;
+    KSymTable *self = ( KSymTable* ) cself;
+    assert ( ns != NULL && ns -> type == eNamespace );
+    rc = KSymTablePushScope ( self, & ns -> u . scope );
+    if ( rc == 0 )
+        self -> ns = ns;
+    return rc;
+}
+
+
+/* PopNamespace
+ */
+LIB_EXPORT void CC KSymTablePopNamespace ( const KSymTable *cself )
+{
+    KSymTable *self = ( KSymTable* ) cself;
+    assert ( self != NULL );
+    if ( self -> ns != NULL )
+    {
+        KSymTablePopScope ( self );
+        self -> ns = self -> ns -> dad;
+    }
+}
+
+
+/* CreateNamespace
+ *  given a name, make it into a namespace,
+ *
+ *  "name" [ IN ] - name of namespace. if being created within
+ *  another namespace, it will be linked to the parent.
+ */
+LIB_EXPORT rc_t CC KSymTableCreateNamespace ( KSymTable *self, KSymbol **nsp, const String *name )
+{
+    rc_t rc;
+
+    assert ( self != NULL );
+    assert ( nsp != NULL );
+    assert ( name != NULL );
+
+    if ( name -> len == 0 )
+        rc = RC ( rcText, rcTree, rcInserting, rcString, rcEmpty );
+    else if ( VectorLength ( & self -> stack ) <= self -> intrinsic )
+        rc = RC ( rcText, rcTree, rcInserting, rcTree, rcReadonly );
+    else
+    {
+        uint32_t len = VectorLength ( & self -> stack );
+        BSTree *scope = VectorGet ( & self -> stack, len - 1 );
+        KSymbol *ns = ( KSymbol* ) BSTreeFind ( scope, name, KSymbolCmp );
+        if ( ns != NULL )
+        {
+            if ( ns -> type == eNamespace )
+            {
+                * nsp = ns;
+                return 0;
+            }
+
+            rc = RC ( rcText, rcTree, rcInserting, rcName, rcExists );
+        }
+        else
+        {
+            ns = malloc ( sizeof *ns + name -> size + 1 );
+            if ( ns == NULL )
+                rc = RC ( rcText, rcTree, rcInserting, rcMemory, rcExhausted );
+            else
+            {
+                /* initialize namespace */
+                string_copy ( ( char* ) ( ns + 1 ), name -> size + 1, name -> addr, name -> size );
+                StringInit ( & ns -> name, ( char* ) ( ns + 1 ), name -> size, name -> len );
+                BSTreeInit ( & ns -> u . scope );
+                ns -> dad = self -> ns;
+                ns -> type = eNamespace;
+
+                /* now insert into parent scope */
+                assert ( scope != NULL );
+                BSTreeInsert ( scope, & ns -> n, KSymbolSort );
+
+                /* done */
+                * nsp = ns;
+                return 0;
+            }
+        }
+    }
+
+    * nsp = NULL;
+
+    return rc;
+}
+
+
+/* CreateSymbol
+ *  given a name, create an object reference
+ *
+ *  "symp" [ OUT, NULL OKAY ] - optional return parameter for
+ *  newly created symbol, which is entered into the top scope
+ *  and only returned for convenience.
+ *
+ *  "name" [ IN ] - symbol name. if being created within a
+ *  namespace, the symbol will be linked to the parent.
+ *
+ *  "id" [ IN ] - if the symbol type
+ *
+ *  "obj" [ IN, NULL OKAY ] - if the object has been created
+ *  at the point of symbol definition, it may be provided.
+ */
+LIB_EXPORT rc_t CC KSymTableCreateSymbol ( KSymTable *self, KSymbol **symp,
+    const String *name, uint32_t id, const void *obj )
+{
+    rc_t rc;
+    KSymbol *sym = NULL;
+
+    if ( self == NULL )
+        rc = RC ( rcText, rcTree, rcInserting, rcSelf, rcNull );
+    else if ( name == NULL )
+        rc = RC ( rcText, rcTree, rcInserting, rcString, rcNull );
+    else if ( name -> len == 0 )
+        rc = RC ( rcText, rcTree, rcInserting, rcString, rcEmpty );
+    else if ( VectorLength ( & self -> stack ) <= self -> intrinsic )
+        rc = RC ( rcText, rcTree, rcInserting, rcTree, rcReadonly );
+    else
+    {
+        sym = malloc ( sizeof *sym + name -> size + 1 );
+        if ( sym == NULL )
+            rc = RC ( rcText, rcTree, rcInserting, rcMemory, rcExhausted );
+        else
+        {
+            KSymbol *exists;
+            uint32_t len = VectorLength ( & self -> stack );
+            BSTree *scope = VectorGet ( & self -> stack, len - 1 );
+
+            /* initialize symbol */
+            string_copy ( ( char* ) ( sym + 1 ), name -> size + 1, name -> addr, name -> size );
+            StringInit ( & sym -> name, ( char* ) ( sym + 1 ), name -> size, name -> len );
+            sym -> u . obj = obj;
+            sym -> dad = self -> ns;
+            sym -> type = id;
+
+            assert ( scope != NULL );
+            rc = BSTreeInsertUnique ( scope, & sym -> n, ( BSTNode** ) & exists, KSymbolSort );
+            if ( rc != 0 )
+            {
+                free ( sym );
+                sym = NULL;
+            }
+        }
+    }
+
+    if ( symp != NULL )
+        * symp = sym;
+
+    return rc;
+}
+
+
+/* DupSymbol
+ *  given a symbol, create a duplicate
+ *
+ *  "dup" [ OUT, NULL OKAY ] - optional return parameter for
+ *  newly created symbol, which is entered into the top scope
+ *  and only returned for convenience.
+ *
+ *  "sym" [ IN ] - symbol to copy.
+ *
+ *  "id" [ IN ] - if the symbol type
+ *
+ *  "obj" [ IN, NULL OKAY ] - if the object has been created
+ *  at the point of symbol definition, it may be provided.
+ */
+static
+rc_t CC KSymTableDupNamespaces ( KSymTable *self, const KSymbol *ns )
+{
+    rc_t rc;
+
+    if ( ns == NULL )
+        return 0;
+
+    rc = KSymTableDupNamespaces ( self, ns -> dad );
+    if ( rc == 0 )
+    {
+        KSymbol *dup;
+        rc = KSymTableCreateNamespace ( self, & dup, & ns -> name );
+        if ( rc == 0 )
+            rc = KSymTablePushNamespace ( self, dup );
+    }
+
+    return rc;
+}
+
+static
+void CC KSymTablePopDupNamespaces ( KSymTable *self, const KSymbol *ns )
+{
+    for ( ; ns != NULL; ns = ns -> dad )
+        KSymTablePopNamespace ( self );
+}
+
+LIB_EXPORT rc_t CC KSymTableDupSymbol ( KSymTable *self, struct KSymbol **dupp,
+    const KSymbol *sym, uint32_t id, const void *obj )
+{
+    rc_t rc;
+    KSymbol *dup = NULL;
+
+    if ( self == NULL )
+        rc = RC ( rcText, rcTree, rcInserting, rcSelf, rcNull );
+    else if ( sym == NULL )
+        rc = RC ( rcText, rcTree, rcInserting, rcString, rcNull );
+    else if ( VectorLength ( & self -> stack ) <= self -> intrinsic )
+        rc = RC ( rcText, rcTree, rcInserting, rcTree, rcReadonly );
+    else
+    {
+        KSymbol *old = self -> ns;
+        rc = KSymTableDupNamespaces ( self, sym -> dad );
+        if ( rc == 0 )
+        {
+            rc = KSymTableCreateSymbol ( self, & dup, & sym -> name, id, obj );
+            KSymTablePopDupNamespaces ( self, dup -> dad );
+        }
+        self -> ns = old;
+    }
+
+    if ( dupp != NULL )
+        * dupp = dup;
+
+    return rc;
+}
+
+
+/* RemoveSymbol
+ *  removes symbol from table
+ *
+ *  "sym" [ IN ] - symbol to be removed
+ */
+LIB_EXPORT rc_t CC KSymTableRemoveSymbol ( KSymTable *self, const KSymbol *sym )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcText, rcTree, rcRemoving, rcSelf, rcNull );
+    else if ( sym == NULL )
+        rc = RC ( rcText, rcTree, rcRemoving, rcParam, rcNull );
+    else
+    {
+        uint32_t i;
+        BSTree *scope;
+
+        /* if the symbol lives within a namespace,
+           it won't be found directly. */
+        if ( sym -> dad != NULL )
+        {
+            KSymbol *ns = sym -> dad;
+            if ( ! BSTreeUnlink ( & ns -> u . scope, ( BSTNode* ) & sym -> n ) )
+                return RC ( rcText, rcTree, rcRemoving, rcNode, rcCorrupt );
+
+            /* if the namespace is not now empty, we're done */
+            if ( ns -> u . scope . root != NULL )
+                return 0;
+
+            /* remove and delete the namespace */
+            rc = KSymTableRemoveSymbol ( self, ns );
+            if ( rc == 0 )
+                KSymbolWhack ( & ns -> n, NULL );
+            return rc;
+        }
+
+        /* walk the stack trying to find owning scope */
+        for ( i = VectorLength ( & self -> stack ); i > self -> intrinsic; )
+        {
+            scope = VectorGet ( & self -> stack, -- i );
+            if ( BSTreeUnlink ( scope, ( BSTNode* ) & sym -> n ) )
+                return 0;
+        }
+
+        /* can't remove it from intrinsic table,
+           so see if it wasn't found or if it's intrinsic */
+        scope = VectorGet ( & self -> stack, 0 );
+        if ( scope != NULL && BSTreeFind ( scope, & sym -> name, KSymbolCmp ) != NULL )
+            rc = RC ( rcText, rcTree, rcRemoving, rcTree, rcReadonly );
+        else
+            rc = RC ( rcText, rcTree, rcRemoving, rcNode, rcNotFound );
+    }
+
+    return rc;
+}
+
+
+/* Find
+ *  finds a symbol within the scope stack
+ */
+LIB_EXPORT KSymbol * CC KSymTableFind ( const KSymTable *self, const String *name )
+{
+    if ( self != NULL && name != NULL && name -> len != 0 )
+    {
+        uint32_t i;
+
+        /* this is a pretty bad way to do things, but
+           we're a fairly low frequency symbol table... */
+        for ( i = VectorLength ( & self -> stack ); i > 0; )
+        {
+            BSTree *scope = VectorGet ( & self -> stack, -- i );
+            KSymbol *sym = ( KSymbol* )
+                BSTreeFind ( scope, name, KSymbolCmp );
+            if ( sym != NULL )
+                return sym;
+        }
+    }
+
+    return NULL;
+}
+
+static
+KSymbol * CC KSymTableDeepFindSymbol ( const KSymTable *self, const KSymbol *sym, uint32_t *level )
+{
+    uint32_t i;
+    KSymbol *found;
+
+    if ( sym -> dad != NULL )
+    {
+        found = KSymTableDeepFindSymbol ( self, sym -> dad, level );
+        if ( found == NULL || found -> type != eNamespace )
+            return NULL;
+        return ( KSymbol* ) BSTreeFind ( & found -> u . scope,
+            & sym -> name, KSymbolCmp );
+    }
+
+    for ( i = * level; i > 0; )
+    {
+        BSTree *scope = VectorGet ( & self -> stack, -- i );
+        found = ( KSymbol* ) BSTreeFind ( scope, & sym -> name, KSymbolCmp );
+        if ( found != NULL )
+        {
+            * level = i;
+            return found;
+        }
+    }
+
+    * level = 0;
+    return NULL;
+}
+
+LIB_EXPORT KSymbol * CC KSymTableFindSymbol ( const KSymTable *self, const KSymbol *sym )
+{
+    if ( self != NULL && sym != NULL )
+    {
+        uint32_t i;
+
+        /* the simple symbols are easy */
+        if ( sym -> dad == NULL )
+            return KSymTableFind ( self, & sym -> name );
+
+        /* namespaces are harder...
+
+           we're going to use recursion to find the root namespace
+           ( although it's unlikely to go beyond a practical limit )
+           and once the root name symbol is found, we need to step
+           backwards through the symtab scopes until we find the root.
+
+           the problem is that if that root doesn't produce a hit for
+           the requested symbol, we still have to keep looking through
+           other scopes
+        */
+
+        for ( i = VectorLength ( & self -> stack ); i > 0; )
+        {
+            KSymbol *found = KSymTableDeepFindSymbol ( self, sym, & i );
+            if ( found != NULL )
+                return found;
+        }
+    }
+
+    return NULL;
+}
+
+
+/* FindIntrinsic
+ *  find an intrinsic symbol
+ */
+LIB_EXPORT KSymbol * CC KSymTableFindIntrinsic ( const KSymTable *self, const String *name )
+{
+    KSymbol *sym = NULL;
+
+    if ( self != NULL && name != NULL && name -> len != 0 )
+    {
+        uint32_t i;
+
+        for ( i = self -> intrinsic; i > 0; )
+        {
+            BSTree *scope = VectorGet ( & self -> stack, -- i );
+            if ( scope != NULL )
+            {
+                KSymbol *sym_ = ( KSymbol* )
+                    BSTreeFind ( scope, name, KSymbolCmp );
+                if ( sym_ != NULL )
+                    return sym_;
+            }
+        }
+    }
+
+    return sym;
+}
+
+
+/* FindGlobal
+ *  find a symbol at global scope
+ */
+LIB_EXPORT KSymbol * CC KSymTableFindGlobal ( const KSymTable *self, const String *name )
+{
+    KSymbol *sym = NULL;
+
+    if ( self != NULL && name != NULL && name -> len != 0 )
+    {
+        uint32_t i;
+
+        for ( i = self -> intrinsic + 1; i > 0; )
+        {
+            BSTree *scope = VectorGet ( & self -> stack, -- i );
+            if ( scope != NULL )
+            {
+                KSymbol *sym_ = ( KSymbol* )
+                    BSTreeFind ( scope, name, KSymbolCmp );
+                if ( sym_ != NULL )
+                    return sym_;
+            }
+        }
+    }
+
+    return sym;
+}
+
+
+/* FindShallow
+ *  find a symbol in top scope
+ */
+LIB_EXPORT KSymbol * CC KSymTableFindShallow ( const KSymTable *self, const String *name )
+{
+    KSymbol *sym = NULL;
+
+    if ( self != NULL && name != NULL && name -> len != 0 )
+    {
+        uint32_t len = VectorLength ( & self -> stack );
+        if ( len > 0 )
+        {
+            BSTree *scope = VectorGet ( & self -> stack, len - 1 );
+            if ( scope != NULL )
+            {
+                sym = ( KSymbol* )
+                    BSTreeFind ( scope, name, KSymbolCmp );
+            }
+        }
+    }
+
+    return sym;
+}
+
+
+/* FindNext
+ *  given a symbol that was found in nearest scope
+ *  find next symbol of the same simple name in
+ *  farther scopes
+ */
+LIB_EXPORT KSymbol * CC KSymTableFindNext ( const KSymTable *self, const KSymbol *sym, uint32_t *id )
+{
+    KSymbol *next = NULL;
+
+    uint32_t i = 0;
+    if ( id != NULL )
+    {
+        i = * id;
+        * id = 0;
+    }
+
+    if ( self != NULL && sym != NULL )
+    {
+        BSTree *scope;
+        uint32_t len = VectorLength ( & self -> stack );
+
+        /* if the previous scope was not given */
+        if ( i == 0 || i > len )
+        {
+            for ( i = len; i > 0; )
+            {
+                scope = VectorGet ( & self -> stack, -- i );
+                next = ( KSymbol* ) BSTreeFind ( scope, & sym -> name, KSymbolCmp );
+                if ( next == sym )
+                {
+                    ++ i;
+                    break;
+                }
+            }
+
+            /* bail if not found */
+            if ( i == 0 )
+                return NULL;
+        }
+
+        /* continue the search */
+        for ( -- i ; i > 0; )
+        {
+            scope = VectorGet ( & self -> stack, -- i );
+            next = ( KSymbol* ) BSTreeFind ( scope, & sym -> name, KSymbolCmp );
+            if ( next != NULL )
+            {
+                if ( id != NULL )
+                    * id = i + 1;
+                break;
+            }
+        }
+    }
+
+    return next;
+}
diff --git a/libs/klib/text.c b/libs/klib/text.c
new file mode 100644
index 0000000..a920981
--- /dev/null
+++ b/libs/klib/text.c
@@ -0,0 +1,1134 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <va_copy.h>
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <errno.h>
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * String
+ *  pseudo-intrinsic string
+ */
+
+/* StringCopy
+ *  allocates a copy of a string
+ */
+LIB_EXPORT rc_t CC StringCopy ( const String **cpy, const String *str )
+{
+    if ( cpy != NULL )
+    {
+        if ( str != NULL )
+        {
+            size_t size = str -> size;
+            String *s = malloc ( sizeof * s + str -> size + 1 );
+            if ( s != NULL )
+            {
+                char *addr = ( char* ) ( s + 1 );
+                StringInit ( s, addr, size, str -> len );
+                memmove ( addr, str -> addr, size );
+                addr [ size ] = 0;
+                * cpy = s;
+                return 0;
+            }
+
+            * cpy = NULL;
+            return RC ( rcText, rcString, rcCopying, rcMemory, rcInsufficient );
+        }
+
+        * cpy = NULL;
+    }
+    return RC ( rcText, rcString, rcCopying, rcParam, rcNull );
+}
+
+/* StringConcat
+ *  concatenate one string onto another
+ */
+LIB_EXPORT rc_t CC StringConcat ( const String **cat, const String *a, const String *b )
+{
+    if ( cat != NULL )
+    {
+        if ( a != NULL && b != NULL )
+        {
+            size_t size = a -> size + b -> size;
+            String *s = malloc ( sizeof * s + size + 1 );
+            if ( s != NULL )
+            {
+                char *addr = ( char* ) ( s + 1 );
+                StringInit ( s, addr, size, a -> len + b -> len );
+                memmove ( addr, a -> addr, a -> size );
+                memmove ( & addr [ a -> size ], b -> addr, b -> size );
+                addr [ size ] = 0;
+                * cat = s;
+                return 0;
+            }
+
+            * cat = NULL;
+            return RC ( rcText, rcString, rcConcatenating, rcMemory, rcInsufficient );
+        }
+
+        * cat = NULL;
+    }
+    return RC ( rcText, rcString, rcConcatenating, rcParam, rcNull );
+}
+
+/* StringSubstr
+ *  creates a substring of an existing one
+ *  note that the substring is always a non-allocated copy
+ *  and is dependent upon the lifetime of its source
+ *
+ *  returns "sub" if "idx" was valid
+ *  or NULL otherwise
+ *
+ *  "len" may be 0 to indicate infinite length
+ *  or may extend beyond end of source string.
+ */
+LIB_EXPORT String * CC StringSubstr ( const String *str, String *sub,
+    uint32_t idx, uint32_t len )
+{
+    if ( str != NULL && sub != NULL && idx < str -> len )
+    {
+        const char *addr = string_idx ( str -> addr, str -> size, idx );
+        if ( addr != NULL )
+        {
+            sub -> size = str -> size - ( size_t ) ( addr - str -> addr );
+            sub -> len = str -> len - idx;
+            sub -> addr = addr;
+            if ( len > 0 && len < sub -> len )
+            {
+                const char *end = string_idx ( sub -> addr, sub -> size, len );
+                if ( end != NULL )
+                {
+                    sub -> size = ( size_t ) ( end - sub -> addr );
+                    sub -> len = len;
+                }
+            }
+            return sub;
+        }
+    }
+    return NULL;
+}
+
+/* StringTrim
+ *  trims ascii white-space from both ends
+ *  returns trimmed string in "trimmed"
+ */
+LIB_EXPORT String * CC StringTrim ( const String * str, String * trimmed )
+{
+    if ( trimmed != NULL )
+    {
+        if ( str == NULL )
+            CONST_STRING ( trimmed, "" );
+        else
+        {
+            const char * addr = str -> addr;
+            size_t i, end, sz = str -> size;
+            uint32_t len = str -> len;
+
+            for ( end = sz; end > 0; -- end )
+            {
+                if ( ! isspace ( addr [ end - 1 ] ) )
+                    break;
+            }
+
+            for ( i = 0; i < end; ++ i )
+            {
+                if ( ! isspace ( addr [ i ] ) )
+                    break;
+            }
+
+            StringInit ( trimmed, & addr [ i ], end - i, len - ( i + sz - end ) );
+        }
+    }
+
+    return trimmed;
+}
+
+/* StringHead
+ *  access the first character
+ *
+ *  this is an efficient enough function to be included.
+ *  the generic functions of accessing characters by index
+ *  are apt to be extremely inefficient with UTF-8, and
+ *  as such are not included.
+ *
+ *  returns EINVAL if the character is bad,
+ *  or ENODATA if the string is empty
+ */
+LIB_EXPORT rc_t CC StringHead ( const String *str, uint32_t *ch )
+{
+    rc_t rc;
+    if ( ch == NULL )
+        rc = RC ( rcText, rcString, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( str == NULL )
+            rc = RC ( rcText, rcString, rcAccessing, rcParam, rcNull );
+        else
+        {
+            if ( str -> len == 0 )
+                rc = RC ( rcText, rcString, rcAccessing, rcString, rcEmpty );
+            else
+            {
+                int ch_len = utf8_utf32 ( ch, str -> addr, str -> addr + str -> size );
+                if ( ch_len > 0 )
+                    return 0;
+
+                rc = RC ( rcText, rcString, rcAccessing, rcChar, rcInvalid );
+            }
+        }
+
+        * ch = 0;
+    }
+
+    return rc;
+}
+
+/* StringPopHead
+ *  remove and return the first character
+ *
+ *  returns EINVAL if the character is bad,
+ *  or ENODATA if the string is empty
+ */
+LIB_EXPORT rc_t CC StringPopHead ( String *str, uint32_t *ch )
+{
+    rc_t rc;
+    if ( ch == NULL )
+        rc = RC ( rcText, rcChar, rcRemoving, rcParam, rcNull );
+    else
+    {
+        if ( str == NULL )
+            rc = RC ( rcText, rcChar, rcRemoving, rcParam, rcNull );
+        else
+        {
+            if ( str -> len == 0 )
+                rc = SILENT_RC ( rcText, rcChar, rcRemoving, rcString, rcEmpty );
+            else
+            {
+                int ch_len = utf8_utf32 ( ch, str -> addr, str -> addr + str -> size );
+                if ( ch_len > 0 )
+                {
+                    str -> addr += ch_len;
+                    str -> size -= ch_len;
+                    str -> len -= 1;
+                    return 0;
+                }
+
+                rc = RC ( rcText, rcChar, rcRemoving, rcChar, rcInvalid );
+            }
+        }
+
+        * ch = 0;
+    }
+
+    return rc;
+}
+
+/* StringCompare
+ *  compare strings for relative ordering
+ */
+LIB_EXPORT int CC StringCompare ( const String *a, const String *b )
+{
+    int diff;
+    uint32_t len;
+
+    if ( a == b )
+        return 0;
+    if ( a == NULL )
+        return -1;
+    if ( b == NULL )
+        return 1;
+
+    len = a -> len;
+    if ( b -> len < len )
+        len = b -> len;
+
+    diff = string_cmp ( a -> addr, a -> size, b -> addr, b -> size, len );
+    if ( diff == 0 )
+        diff = ( int ) a -> len - ( int ) b -> len;
+    return diff;
+}
+
+/* StringCaseEqual
+ *  compare strings for case-insensitive equality
+ */
+LIB_EXPORT bool CC StringCaseEqual ( const String *a, const String *b )
+{
+    uint32_t len;
+
+    if ( a == b )
+        return true;
+    if ( a == NULL || b == NULL )
+        return false;
+
+    len = a -> len;
+    if ( b -> len != len )
+        return false;
+
+    return strcase_cmp ( a -> addr, a -> size, b -> addr, b -> size, len ) == 0;
+}
+
+/* StringCaseCompare
+ *  compare strings for relative case-insensitive ordering
+ */
+LIB_EXPORT int CC StringCaseCompare ( const String *a, const String *b )
+{
+    int diff;
+    uint32_t len;
+
+    if ( a == b )
+        return 0;
+    if ( a == NULL )
+        return -1;
+    if ( b == NULL )
+        return 1;
+
+    len = a -> len;
+    if ( b -> len < len )
+        len = b -> len;
+
+    diff = strcase_cmp ( a -> addr, a -> size, b -> addr, b -> size, len );
+    if ( diff == 0 )
+        diff = ( int ) a -> len - ( int ) b -> len;
+    return diff;
+}
+
+/* StringOrder
+ *  compares strings as quickly as possible for
+ *  deterministic ordering: first by length, then
+ *  by binary (byte-wise) content.
+ *
+ *  performs more quickly than StringCompare for cases
+ *  where only deterministic ordering is needed ( e.g. symbol table ).
+ */
+LIB_EXPORT int64_t CC StringOrder ( const String *a, const String *b )
+{
+    if ( a == b )
+        return 0;
+    if ( a == NULL )
+        return -1;
+    if ( b == NULL )
+        return 1;
+
+    if ( a -> size < b -> size )
+        return -1;
+    if ( a -> size > b -> size )
+        return 1;
+    return memcmp ( a -> addr, b -> addr, a -> size );
+}
+
+/* StringOrderNoNullCheck
+ *  avoids tests for NULL strings
+ */
+LIB_EXPORT int64_t CC StringOrderNoNullCheck ( const String *a, const String *b )
+{
+    if ( a -> size < b -> size )
+        return -1;
+    if ( a -> size > b -> size )
+        return 1;
+    return memcmp ( a -> addr, b -> addr, a -> size );
+}
+
+/* StringMatch
+ *  creates a substring of "a" in "match"
+ *  for all of the sequential matching characters between "a" and "b"
+ *  starting from character [ 0 ].
+ *
+ *  returns the number of characters that match.
+ */
+LIB_EXPORT uint32_t CC StringMatch ( String *match, const String *a, const String *b )
+{
+    if ( a == NULL || b == NULL )
+    {
+        CONST_STRING ( match, "" );
+        return 0;
+    }
+
+    if ( a == b )
+    {
+        * match = * a;
+        return a -> len;
+    }
+
+    if ( match == NULL )
+    {
+        return string_match ( a -> addr, a -> size,
+            b -> addr, b -> size, (uint32_t)b -> size, NULL );
+    }
+
+    match -> addr = a -> addr;
+    return match -> len = string_match ( a -> addr, a -> size,
+        b -> addr, b -> size, (uint32_t)b -> size, & match -> size );
+}
+
+/* StringMatchExtend
+ *  extends a substring of "a" in "match"
+ *  for all of the sequential matching characters between "a" and "b"
+ *  starting from character [ match -> len ].
+ *
+ *  returns the number of matching characters that were extended.
+ */
+LIB_EXPORT uint32_t CC StringMatchExtend ( String *match, const String *a, const String *b )
+{
+    size_t msize;
+    uint32_t len;
+
+    assert ( match != NULL );
+    if ( match -> len == 0 )
+        return StringMatch ( match, a, b );
+
+    assert ( a != NULL );
+    assert ( match -> addr == a -> addr );
+    assert ( match -> len <= a -> len );
+
+    if ( b == NULL || match -> len == a -> len || match -> len >= b -> len )
+        return 0;
+
+    msize = match -> size;
+    len = string_match ( a -> addr + msize, a -> size - msize,
+        b -> addr + msize, b -> size - msize, (uint32_t)b -> size, & msize );
+
+    match -> len += len;
+    match -> size += msize;
+    return len;
+}
+
+/* StringCopyUTF...
+ *  creates a String from UTF16 or UTF32 UNICODE input
+ *  wchar_t is one or the other, depending upon OS and compiler.
+ */
+LIB_EXPORT rc_t CC StringCopyUTF16 ( const String **cpy, const uint16_t *text, size_t bytes )
+{
+    if ( cpy != NULL )
+    {
+        if ( text != NULL || bytes == 0 )
+        {
+            size_t size;
+            uint32_t len = utf16_cvt_string_len ( text, bytes, & size );
+            String *str = ( String* ) malloc ( sizeof * str + 1 + size );
+            if ( ( * cpy = str ) == NULL )
+                return RC ( rcText, rcString, rcCopying, rcMemory, rcInsufficient );
+            StringInit ( str, ( char* ) ( str + 1 ), size, len );
+            str -> size = utf16_cvt_string_copy ( ( char* ) str -> addr, size, text, bytes );
+            return 0;
+        }
+
+        * cpy = NULL;
+    }
+    return RC ( rcText, rcString, rcCopying, rcParam, rcNull );
+}
+
+LIB_EXPORT rc_t CC StringCopyUTF32 ( const String **cpy, const uint32_t *text, size_t bytes )
+{
+    if ( cpy != NULL )
+    {
+        if ( text != NULL || bytes == 0 )
+        {
+            size_t size;
+            uint32_t len = utf32_cvt_string_len ( text, bytes, & size );
+            String *str = ( String* ) malloc ( sizeof * str + 1 + size );
+            if ( ( * cpy = str ) == NULL )
+                return RC ( rcText, rcString, rcCopying, rcMemory, rcInsufficient );
+            StringInit ( str, ( char* ) ( str + 1 ), size, len );
+            str -> size = utf32_cvt_string_copy ( ( char* ) str -> addr, size, text, bytes );
+            return 0;
+        }
+
+        * cpy = NULL;
+    }
+    return RC ( rcText, rcString, rcCopying, rcParam, rcNull );
+}
+
+/* StringWhack
+ *  deallocates a string
+ *  ignores strings not allocated by this library
+ */
+LIB_EXPORT void CC StringWhack ( const String* self )
+{
+    free ( ( void* ) self );
+}
+
+
+/* StringToInt
+ *  simple string conversion functions
+ */
+LIB_EXPORT int64_t StringToI64 ( const String * self, rc_t * optional_rc )
+{
+    if ( self != NULL )
+        return string_to_I64 ( self -> addr, self -> size, optional_rc );
+
+    if ( optional_rc != NULL )
+        * optional_rc = RC ( rcText, rcString, rcEvaluating, rcSelf, rcNull );
+
+    return 0;
+}
+
+LIB_EXPORT uint64_t StringToU64 ( const String * self, rc_t * optional_rc )
+{
+    if ( self != NULL )
+        return string_to_U64 ( self -> addr, self -> size, optional_rc );
+
+    if ( optional_rc != NULL )
+        * optional_rc = RC ( rcText, rcString, rcEvaluating, rcSelf, rcNull );
+
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * raw text strings
+ */
+
+/* string_size
+ *  length of string in bytes
+ */
+LIB_EXPORT size_t CC string_size ( const char *str )
+{
+    if ( str == NULL )
+        return 0;
+    return strlen ( str );
+}
+
+/* string_dup
+ *  replaces the broken C library strndup
+ *  creates a NUL-terminated malloc'd string
+ */
+LIB_EXPORT char * CC string_dup ( const char *str, size_t size )
+{
+    char *dst;
+    if ( str == NULL )
+        dst = NULL;
+    else
+    {
+        dst = malloc ( size + 1 );
+        if ( dst != NULL )
+            string_copy ( dst, size + 1, str, size );
+    }
+    return dst;
+}
+
+/* string_dup_measure
+ *  replaces the broken C library strdup
+ *  creates a NUL-terminated malloc'd string
+ *  returns size of string unless "size" is NULL
+ */
+LIB_EXPORT char * CC string_dup_measure ( const char *str, size_t *size )
+{
+    size_t bytes = string_size ( str );
+    if ( size != NULL )
+        * size = bytes;
+    return string_dup ( str, bytes );
+}
+
+/* string_hash
+ *  hashes a string
+ */
+LIB_EXPORT uint32_t CC string_hash ( const char *str, size_t size )
+{
+    size_t i;
+    uint32_t hash;
+
+    assert ( str != NULL );
+
+    if ( str == NULL )
+        return 0;
+
+    for ( hash = 0, i = 0; i < size; ++ i )
+    {
+        uint32_t ch = ( ( const unsigned char* )  str ) [ i ];
+        hash = ( ( hash << 1 ) - ( hash >> 16 ) ) ^ ch;
+    }
+    return hash ^ ( hash >> 16 );
+}
+
+/* string_to_int
+ *  simple string conversion functions
+ *
+ *  these functions are defined to consume the entire string.
+ *  leading spaces are tolerated, repeated signs are accepted for signed conversion,
+ *  decimal and hex encodings are accepted for unsigned conversion,
+ *  decimal only for signed conversion.
+ *
+ *  "optional_rc" [ OUT, NULL OKAY ] - if non-null, user is interested
+ *  in error conditions. if the parameter is present, the string must be
+ *  completely consumed without overflow.
+ *
+ *  optional return values ( with { GetRCObject ( rc ), GetRCState ( rc ) }:
+ *   0                            : no error
+ *   { rcRange, rcExcessive }     : integer overflow
+ *   { rcTransfer, rcIncomplete } : extra characters remain in string
+ *   { rcData, rcInsufficient }   : no numeric text was found
+ *
+ *  return values - regardless of "optional_rc":
+ *    val             : when no error
+ *    val             : on incomplete transfer
+ *    +/- max int64_t : when signed overflow occurs ( StringToI64 only )
+ *    max uint64_t    : when unsigned overflow occurs ( StringToU64 only )
+ *    0               : when no input text is found
+ */
+LIB_EXPORT int64_t string_to_I64 ( const char * text, size_t bytes, rc_t * optional_rc )
+{
+    rc_t rc = 0;
+
+    if ( text == NULL )
+        rc = RC ( rcText, rcString, rcEvaluating, rcParam, rcNull );
+    else
+    {
+        int64_t val;
+
+        size_t i, start;
+        uint8_t negate = 0;
+
+        /* allow white space */
+        for ( i = 0; i < bytes; ++ i )
+        {
+            if ( ! isspace ( text [ i ] ) )
+                break;
+        }
+
+        /* allow sign */
+        for ( ; i < bytes; ++ i )
+        {
+            switch ( text [ i ] )
+            {
+            case '-':
+                negate ^= 1;
+                continue;
+            case '+':
+                continue;
+            }
+            break;
+        }
+
+        start = i;
+        for ( val = 0; i < bytes; ++ i )
+        {
+            uint8_t digit;
+
+            /* HACK ALERT: by declaring this variable "volatile",
+               we prevent gcc-4.8.1 and friends from trying to optimize
+               this loop, and producing bad code ( see below ).
+               gcc-4.9.1 does not exhibit this behavior.
+            */
+            volatile int64_t x = 0;
+
+            if ( ! isdigit ( text [ i ] ) )
+                break;
+
+            /* want to bring this digit into number */
+            digit = text [ i ] - '0';
+
+            /* detect overflow on multiplication
+               The gcc optimization replaced a signed int-max
+               with an unsigned int-max, destroying the test.
+             */
+            if ( val > INT64_MAX / 10 )
+            {
+                rc = RC ( rcText, rcString, rcEvaluating, rcRange, rcExcessive );
+                val = INT64_MAX;
+                break;
+            }
+
+            val *= 10;
+            assert ( val >= 0 );
+
+            /* detect overflow on addition */
+            x = val + digit - negate;
+            if ( x < 0 )
+            {
+                rc = RC ( rcText, rcString, rcEvaluating, rcRange, rcExcessive );
+                val = INT64_MAX;
+                break;
+            }
+
+            val += digit;
+        }
+
+        if ( negate )
+            val = ( rc != 0 ) ? INT64_MIN : - val;
+
+        if ( start != i )
+        {
+            if ( optional_rc != NULL )
+            {
+                if ( rc == 0 && i != bytes )
+                    rc = RC ( rcText, rcString, rcParsing, rcTransfer, rcIncomplete );
+
+                * optional_rc = rc;
+            }
+
+            return val;
+        }
+
+        /* no digits were converted */
+        rc = RC ( rcText, rcString, rcParsing, rcData, rcInsufficient );
+    }
+
+    if ( optional_rc != NULL )
+        * optional_rc = rc;
+
+    return 0;
+}
+
+LIB_EXPORT uint64_t string_to_U64 ( const char * text, size_t bytes, rc_t * optional_rc )
+{
+    rc_t rc = 0;
+
+    if ( text == NULL )
+        rc = RC ( rcText, rcString, rcEvaluating, rcParam, rcNull );
+    else
+    {
+        uint64_t val;
+        size_t i, start;
+
+        /* allow white space */
+        for ( i = 0; i < bytes; ++ i )
+        {
+            if ( ! isspace ( text [ i ] ) )
+                break;
+        }
+
+        /* detect hex */
+        if ( bytes - i >= 3 && text [ i ] == '0' && tolower ( text [ i + 1 ] ) == 'x' )
+        {
+            start = i += 2;
+            for ( val = 0; i < bytes; ++ i )
+            {
+                uint8_t xdigit;
+
+                if ( ! isxdigit ( text [ i ] ) )
+                    break;
+
+                /* want to bring this digit into number */
+                xdigit = isdigit ( text [ i ] ) ?
+                    text [ i ] - '0' : tolower ( text [ i ] ) - 'a' + 10;
+
+                /* detect overflow */
+                if ( i - start > 16 )
+                {
+                    rc = RC ( rcText, rcString, rcEvaluating, rcRange, rcExcessive );
+                    val = UINT64_MAX;
+                    break;
+                }
+
+                val = ( val << 4 ) | xdigit;
+            }
+        }
+        else
+        {
+            start = i;
+            for ( val = 0; i < bytes; ++ i )
+            {
+                uint8_t digit;
+
+                if ( ! isdigit ( text [ i ] ) )
+                    break;
+
+                /* want to bring this digit into number */
+                digit = text [ i ] - '0';
+
+                /* detect overflow on multiplication */
+                if ( val > UINT64_MAX / 10 )
+                {
+                    rc = RC ( rcText, rcString, rcEvaluating, rcRange, rcExcessive );
+                    val = UINT64_MAX;
+                    break;
+                }
+
+                val *= 10;
+
+                /* detect overflow on addition */
+                if ( val > UINT64_MAX - digit )
+                {
+                    rc = RC ( rcText, rcString, rcEvaluating, rcRange, rcExcessive );
+                    val = UINT64_MAX;
+                    break;
+                }
+
+                val += digit;
+            }
+        }
+
+        if ( start != i )
+        {
+            if ( optional_rc != NULL )
+            {
+                if ( rc == 0 && i != bytes )
+                    rc = RC ( rcText, rcString, rcEvaluating, rcTransfer, rcIncomplete );
+
+                * optional_rc = rc;
+            }
+
+            return val;
+        }
+
+        /* no digits were converted */
+        rc = RC ( rcText, rcString, rcParsing, rcData, rcInsufficient );
+    }
+
+    if ( optional_rc != NULL )
+        * optional_rc = rc;
+
+    return 0;
+}
+
+/* utf8_utf32
+ *  converts UTF8 text to a single UTF32 character
+ *  returns the number of UTF8 bytes consumed, such that:
+ *    return > 0 means success
+ *    return == 0 means insufficient input
+ *    return < 0 means bad input or bad argument
+ */
+LIB_EXPORT int CC utf8_utf32 ( uint32_t *dst, const char *begin, const char *end )
+{
+    int c;
+    uint32_t ch;
+    const char *src, *stop;
+
+    if ( dst == NULL || begin == NULL || end == NULL )
+        return -1;
+
+    if ( begin == end )
+        return 0;
+
+    /* non-negative bytes are ASCII-7 */
+    c = begin [ 0 ];
+    if ( begin [ 0 ] >= 0 )
+    {
+        dst [ 0 ] = c;
+        return 1;
+    }
+	
+    /* the leftmost 24 bits are set
+       the rightmost 8 can look like:
+       110xxxxx == 2 byte character
+       1110xxxx == 3 byte character
+       11110xxx == 4 byte character
+       111110xx == 5 byte character
+       1111110x == 6 byte character
+    */
+	
+    src = begin;
+	
+    /* invert bits to look at range */
+    ch = c;
+    c = ~ c;
+	
+    /* illegal range */
+    if ( c >= 0x40 )
+        return -1;
+	
+    /* 2 byte */
+    else if ( c >= 0x20 )
+    {
+        ch &= 0x1F;
+        stop = src + 2;
+    }
+	
+    /* 3 byte */
+    else if ( c >= 0x10 )
+    {
+        ch &= 0xF;
+        stop = src + 3;
+    }
+	
+    /* 4 byte */
+    else if ( c >= 8 )
+    {
+        ch &= 7;
+        stop = src + 4;
+    }
+	
+    /* 5 byte */
+    else if ( c >= 4 )
+    {
+        ch &= 3;
+        stop = src + 5;
+    }
+	
+    /* illegal */
+    else if ( c < 2 )
+        return -1;
+    
+    /* 6 byte */
+    else
+    {
+        ch &= 1;
+        stop = src + 6;
+    }
+    
+    /* must have sufficient input */
+    if ( stop > end )
+        return 0;
+	
+    /* complete the character */
+    while ( ++ src != stop )
+    {
+        c = src [ 0 ] & 0x7F;
+        if ( src [ 0 ] >= 0 || c >= 0x40 )
+            return -1;
+        ch = ( ch << 6 ) | c;
+    }
+	
+    /* record the character */
+    dst [ 0 ] = ch;
+	
+    /* return the bytes consumed */
+    return ( int ) ( src - begin );
+}
+
+/* utf32_utf8
+ *  converts a single UTF32 character to UTF8 text
+ *  returns the number of UTF8 bytes generated, such that:
+ *    return > 0 means success
+ *    return == 0 means insufficient output
+ *    return < 0 means bad character or bad argument
+ */
+LIB_EXPORT int CC utf32_utf8 ( char *begin, char *end, uint32_t ch )
+{
+    int len;
+    char *dst;
+    uint32_t mask;
+
+    if ( begin == NULL || end == NULL )
+        return -1;
+    if ( begin >= end )
+        return 0;
+
+    if ( ch < 128 )
+    {
+        begin [ 0 ] = ( char ) ch;
+        return 1;
+    }
+
+    /* 2 byte */
+    if ( ch < 0x00000800 )
+    {
+        /* 110xxxxx */
+        mask = 0xC0U;
+        len = 2;
+    }
+	
+    /* 3 byte */
+    else if ( ch < 0x00010000 )
+    {
+        /* 1110xxxx */
+        mask = 0xE0U;
+        len = 3;
+    }
+
+    /* 4 byte */
+    else if ( ch < 0x00200000 )
+    {
+        /* 11110xxx */
+        mask = 0xF0U;
+        len = 4;
+    }
+	
+    /* 5 byte */
+    else if ( ch < 0x04000000 )
+    {
+        /* 111110xx */
+        mask = 0xF8U;
+        len = 5;
+    }
+	
+    /* 6 byte */
+    else
+    {
+        /* 1111110x */
+        mask = 0xFCU;
+        len = 6;
+    }
+	
+    dst = begin + len;
+    if ( dst > end )
+        return 0;
+    
+    while ( -- dst > begin )
+    {
+        /* 10xxxxxx */ /* too many casts to suit different compilers */
+        dst [ 0 ] = ( char ) (( char ) 0x80 | ( ( char ) ch & ( char ) 0x3F ));
+        ch >>= 6;
+    }
+    
+    dst [ 0 ] = ( char ) ( mask | ch );
+
+    return len;
+}
+
+/* utf16_string_size/len/measure
+ *  measures UTF-16 strings
+ */
+LIB_EXPORT size_t CC utf16_string_size ( const uint16_t *str )
+{
+    uint32_t i, ch;
+
+    for ( ch = str [ i = 0 ]; ch != 0 ; ch = str [ ++ i ] )
+    {
+        char ignore [ 8 ];
+        if ( utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch ) <= 0 )
+            break;
+    }
+
+    return i * sizeof * str;
+}
+
+LIB_EXPORT uint32_t CC utf16_string_len ( const uint16_t *str, size_t size )
+{
+    uint32_t i, str_len = ( uint32_t ) ( size >> 1 );
+
+    for ( i = 0; i < str_len; ++ i )
+    {
+        char ignore [ 8 ];
+        uint32_t ch = str [ i ];
+        if ( utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch ) <= 0 )
+            break;
+    }
+
+    return i;
+}
+
+LIB_EXPORT uint32_t CC utf16_string_measure ( const uint16_t *str, size_t *size )
+{
+    uint32_t i, ch;
+
+    for ( ch = str [ i = 0 ]; ch != 0 ; ch = str [ ++ i ] )
+    {
+        char ignore [ 8 ];
+        if ( utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch ) <= 0 )
+            break;
+    }
+
+    * size = i * sizeof * str;
+
+    return i;
+}
+
+/* utf32_string_size/len/measure
+ */
+LIB_EXPORT size_t CC utf32_string_size ( const uint32_t *str )
+{
+    uint32_t i, ch;
+
+    for ( ch = str [ i = 0 ]; ch != 0 ; ch = str [ ++ i ] )
+    {
+        char ignore [ 8 ];
+        if ( utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch ) <= 0 )
+            break;
+    }
+
+    return i * sizeof * str;
+}
+
+LIB_EXPORT uint32_t CC utf32_string_len ( const uint32_t *str, size_t size )
+{
+    uint32_t i, str_len = ( uint32_t ) ( size >> 2 );
+
+    for ( i = 0; i < str_len; ++ i )
+    {
+        char ignore [ 8 ];
+        uint32_t ch = str [ i ];
+        if ( utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch ) <= 0 )
+            break;
+    }
+
+    return i;
+}
+
+LIB_EXPORT uint32_t CC utf32_string_measure ( const uint32_t *str, size_t *size )
+{
+    uint32_t i, ch;
+
+    for ( ch = str [ i = 0 ]; ch != 0 ; ch = str [ ++ i ] )
+    {
+        char ignore [ 8 ];
+        if ( utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch ) <= 0 )
+            break;
+    }
+
+    * size = i * sizeof * str;
+
+    return i;
+}
+
+/* whcar_string_size/len/measure
+ *  measures whcar_t strings
+ */
+LIB_EXPORT size_t CC wchar_string_size ( const wchar_t *str )
+{
+    uint32_t i, ch;
+
+    for ( ch = str [ i = 0 ]; ch != 0 ; ch = str [ ++ i ] )
+    {
+        char ignore [ 8 ];
+        if ( utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch ) <= 0 )
+            break;
+    }
+
+    return i * sizeof * str;
+}
+
+LIB_EXPORT uint32_t CC wchar_string_len ( const wchar_t *str, size_t size )
+{
+    uint32_t i, str_len = ( uint32_t ) ( size / sizeof * str );
+
+    for ( i = 0; i < str_len; ++ i )
+    {
+        char ignore [ 8 ];
+        uint32_t ch = str [ i ];
+        if ( utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch ) <= 0 )
+            break;
+    }
+
+    return i;
+}
+
+LIB_EXPORT uint32_t CC wchar_string_measure ( const wchar_t *str, size_t *size )
+{
+    uint32_t i, ch;
+
+    for ( ch = str [ i = 0 ]; ch != 0 ; ch = str [ ++ i ] )
+    {
+        char ignore [ 8 ];
+        if ( utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch ) <= 0 )
+            break;
+    }
+
+    * size = i * sizeof * str;
+
+    return i;
+}
diff --git a/libs/klib/time.c b/libs/klib/time.c
new file mode 100644
index 0000000..c9d8f99
--- /dev/null
+++ b/libs/klib/time.c
@@ -0,0 +1,3 @@
+#include <klib/time.h> /* KSleep */
+
+LIB_EXPORT rc_t CC KSleep(uint32_t seconds) { return KSleepMs(seconds * 1000); }
diff --git a/libs/klib/token.c b/libs/klib/token.c
new file mode 100644
index 0000000..4bb6f9a
--- /dev/null
+++ b/libs/klib/token.c
@@ -0,0 +1,1291 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/token.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+
+/* for parser simplicity before the days of expressions,
+   signed numerals were recognized as single tokens, i.e.
+   (+/-)NUM with no separating white space was a single token */
+#define SUPPORT_SIGNED_NUMERALS 0
+
+/*--------------------------------------------------------------------------
+ * KToken
+ *  a string with an id and source information
+ */
+
+/* hex_to_int
+ *  where 'c' is known to be hex
+ */
+static
+unsigned int CC hex_to_int ( char c )
+{
+    int i = c - '0';
+    if ( c > '9' )
+    {
+        if ( c < 'a' )
+            i = c - 'A' + 10;
+        else
+            i = c - 'a' + 10;
+    }
+
+    assert ( i >= 0 && i < 16 );
+    return i;
+}
+
+static
+rc_t CC StringConvertHex ( const String *self, uint64_t *ip, int bits )
+{
+    uint32_t i;
+    uint64_t i64 = hex_to_int ( self -> addr [ 2 ] );
+    for ( i = 3; i < self -> len; ++ i )
+    {
+        i64 <<= 4;
+        i64 += hex_to_int ( self -> addr [ i ] );
+    }
+
+    if ( bits < 64 && ( i64 >> bits ) != 0 )
+        return RC ( rcVDB, rcToken, rcConverting, rcRange, rcExcessive );
+
+    * ip = i64;
+    return 0;
+}
+
+static
+rc_t CC StringConvertOctal ( const String *self, uint64_t *ip, int bits )
+{
+    uint32_t i;
+    uint64_t i64 = 0;
+    for ( i = 1; i < self -> len; ++ i )
+    {
+        i64 <<= 3;
+        i64 += self -> addr [ i ] - '0';
+    }
+
+    if ( bits < 64 && ( i64 >> bits ) != 0 )
+        return RC ( rcVDB, rcToken, rcConverting, rcRange, rcExcessive );
+
+    * ip = i64;
+    return 0;
+}
+
+static
+rc_t CC StringConvertDecimal ( const String *self, uint64_t *ip, int bits )
+{
+    uint32_t i;
+    uint64_t i64;
+
+    if ( bits > 32 )
+    {
+        i64 = self -> addr [ 0 ] - '0';
+        for ( i = 1; i < self -> len; ++ i )
+        {
+            i64 *= 10;
+            i64 += self -> addr [ i ] - '0';
+        }
+    }
+    else
+    {
+        uint32_t i32 = self -> addr [ 0 ] - '0';
+        for ( i = 1; i < self -> len; ++ i )
+        {
+            i32 *= 10;
+            i32 += self -> addr [ i ] - '0';
+        }
+        i64 = i32;
+    }
+
+    if ( bits < 64 && ( i64 >> bits ) != 0 )
+        return RC ( rcVDB, rcToken, rcConverting, rcRange, rcExcessive );
+
+    * ip = i64;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KTokenToI32 ( const KToken *self, int32_t *i )
+{
+    rc_t rc;
+    int64_t i64;
+
+    switch ( self -> id )
+    {
+    case eDecimal:
+        rc = StringConvertDecimal ( & self -> str, ( uint64_t* ) & i64, 31 );
+        break;
+    case eHex:
+        rc = StringConvertHex ( & self -> str, ( uint64_t* ) & i64, 31 );
+        break;
+    case eOctal:
+        rc = StringConvertOctal ( & self -> str, ( uint64_t* ) & i64, 31 );
+        break;
+    default:
+        return RC ( rcVDB, rcToken, rcConverting, rcType, rcIncorrect );
+    }
+
+    if ( rc == 0 )
+        * i = ( int32_t ) i64;
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTokenToU32 ( const KToken *self, uint32_t *i )
+{
+    rc_t rc;
+    uint64_t i64;
+
+    switch ( self -> id )
+    {
+    case eDecimal:
+        rc = StringConvertDecimal ( & self -> str, & i64, 32 );
+        break;
+    case eHex:
+        rc = StringConvertHex ( & self -> str, & i64, 32 );
+        break;
+    case eOctal:
+        rc = StringConvertOctal ( & self -> str, & i64, 32 );
+        break;
+    default:
+        return RC ( rcVDB, rcToken, rcConverting, rcType, rcIncorrect );
+    }
+
+    if ( rc == 0 )
+        * i = ( uint32_t ) i64;
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTokenToI64 ( const KToken *self, int64_t *i )
+{
+    switch ( self -> id )
+    {
+    case eDecimal:
+        return StringConvertDecimal ( & self -> str, ( uint64_t* ) i, 63 );
+    case eHex:
+        return StringConvertHex ( & self -> str, ( uint64_t* ) i, 63 );
+    case eOctal:
+        return StringConvertOctal ( & self -> str, ( uint64_t* ) i, 63 );
+    }
+
+    return RC ( rcVDB, rcToken, rcConverting, rcType, rcIncorrect );
+}
+
+LIB_EXPORT rc_t CC KTokenToU64 ( const KToken *self, uint64_t *i )
+{
+    switch ( self -> id )
+    {
+    case eDecimal:
+        return StringConvertDecimal ( & self -> str, i, 64 );
+    case eHex:
+        return StringConvertHex ( & self -> str, i, 64 );
+    case eOctal:
+        return StringConvertOctal ( & self -> str, i, 64 );
+    }
+
+    return RC ( rcVDB, rcToken, rcConverting, rcType, rcIncorrect );
+}
+
+LIB_EXPORT rc_t CC KTokenToF64 ( const KToken *self, double *d )
+{
+    char buffer [ 256 ], *end;
+
+    switch ( self -> id )
+    {
+    case eDecimal:
+    case eFloat:
+    case eExpFloat:
+        break;
+    case eOctal:
+        if ( self -> str . len == 1 )
+            break;
+    default:
+        return RC ( rcVDB, rcToken, rcConverting, rcType, rcIncorrect );
+    }
+
+    if ( string_copy ( buffer, sizeof buffer,
+             self -> str . addr, self -> str . size ) == sizeof buffer )
+    {
+        return RC ( rcVDB, rcToken, rcConverting, rcToken, rcExcessive );
+    }
+
+    * d = strtod ( buffer, & end );
+    if ( ( end - buffer ) != self -> str . size )
+        return RC ( rcVDB, rcToken, rcConverting, rcToken, rcInvalid );
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KTokenToVersion ( const KToken *self, uint32_t *vp )
+{
+    rc_t rc;
+    String str;
+    uint64_t i;
+    uint32_t v = 0;
+
+    const char *dot;
+    const char *start = self -> str . addr;
+    const char *end = start + self -> str . size;
+
+    switch ( self -> id )
+    {
+        /* three-part versions */
+    case eMajMinRel:
+        dot = string_rchr ( start, end - start, '.' ) + 1;
+        assert ( dot > start && dot < end );
+        StringInit ( & str, dot, (size_t)( end - dot ), (uint32_t)( end - dot ) );
+        rc = StringConvertDecimal ( & str, & i, 16 );
+        if ( rc != 0 )
+            break;
+
+        v = ( uint32_t ) i;
+        end = dot - 1;
+
+        /* two-part versions */
+    case eFloat:
+        dot = string_rchr ( start, end - start, '.' );
+        if ( dot == start )
+            return RC ( rcVDB, rcToken, rcConverting, rcType, rcIncorrect );
+        if ( ++ dot == end )
+            return RC ( rcVDB, rcToken, rcConverting, rcType, rcIncorrect );
+        StringInit ( & str, dot, (size_t)( end - dot ), (uint32_t)( end - dot ) );
+        rc = StringConvertDecimal ( & str, & i, 8 );
+        if ( rc != 0 )
+            break;
+
+        v |= ( uint32_t ) ( i << 16 );
+        end = dot - 1;
+
+        /* single-part versions */
+    case eOctal:
+    case eDecimal:
+        StringInit ( & str, start, (size_t)( end - start ), (uint32_t)( end - start ) );
+        rc = StringConvertDecimal ( & str, & i, 8 );
+        if ( rc != 0 )
+            break;
+
+        v |= ( uint32_t ) ( i << 24 );
+        break;
+
+    default:
+        return RC ( rcVDB, rcToken, rcConverting, rcType, rcIncorrect );
+    }
+
+    if ( rc == 0 )
+        * vp = v;
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTokenToString ( const KToken *self, char *buffer, size_t bsize, size_t *size )
+{
+    size_t i, j, sz = self -> str . size;
+
+    switch ( self -> id )
+    {
+    case eEndOfInput:
+        * size = 0;
+        return 0;
+
+    case eString:
+        -- sz;
+    case eUntermString:
+        * size = sz - 1;
+
+        if ( sz >= bsize )
+            return RC ( rcVDB, rcToken, rcConverting, rcBuffer, rcInsufficient );
+
+        string_copy ( buffer, bsize, self -> str . addr + 1, sz - 1 );
+        return 0;
+
+    case eEscapedString:
+        -- sz;
+    case eUntermEscapedString:
+        /* leave initial quote at str[0] in count */
+        break;
+
+    default:
+        * size = sz;
+
+        if ( sz + 1 >= bsize )
+            return RC ( rcVDB, rcToken, rcConverting, rcBuffer, rcInsufficient );
+
+        string_copy ( buffer, bsize, self -> str . addr, sz );
+        return 0;
+    }
+
+    /* walk across string starting at offset 1
+       to skip initial quote that was left in "sz" */
+    for ( i = 1, j = 0, -- bsize; i < sz; ++ i )
+    {
+        if ( j == bsize )
+            return RC ( rcVDB, rcToken, rcConverting, rcBuffer, rcInsufficient );
+
+        if ( ( buffer [ j ] = self -> str . addr [ i ] ) == '\\' )
+        {
+            if ( ++ i == sz )
+                break;
+            switch ( self -> str . addr [ i ] )
+            {
+                /* control characters */
+            case 'n':
+                buffer [ j ] = '\n';
+                break;
+            case 't':
+                buffer [ j ] = '\t';
+                break;
+            case 'r':
+                buffer [ j ] = '\r';
+                break;
+            case '0':
+                buffer [ j ] = '\0';
+                break;
+
+            case 'a':
+                buffer [ j ] = '\a';
+                break;
+            case 'b':
+                buffer [ j ] = '\b';
+                break;
+            case 'v':
+                buffer [ j ] = '\v';
+                break;
+            case 'f':
+                buffer [ j ] = '\f';
+                break;
+
+            case 'x': case 'X':
+                /* expect 2 additional hex characters */
+                if ( ( i + 2 ) < sz &&
+                     isxdigit ( self -> str . addr [ i + 1 ] ) &&
+                     isxdigit ( self -> str . addr [ i + 2 ] ) )
+                {
+                    /* go ahead and convert */
+                    buffer [ j ] = ( char )
+                        ( ( hex_to_int ( self -> str . addr [ i + 1 ] ) << 4 ) |
+                          hex_to_int ( self -> str . addr [ i + 2 ] ) );
+                    i += 2;
+                    break;
+                }
+                /* no break */
+
+                /* just quote self */
+            default:
+                buffer [ j ] = self -> str . addr [ i ];
+            }
+        }
+
+        ++ j;
+    }
+
+    * size = j;
+    return 0;
+}
+
+static
+rc_t CC utf8_utf32_cvt_string_copy ( uint32_t *dst, uint32_t blen, uint32_t *dlen, const char *src, size_t ssize )
+{
+    int rslt, len;
+    const char *end = src + ssize;
+
+    for ( len = 0; src < end; ++ len, src += rslt )
+    {
+        if ( len == blen )
+            return RC ( rcVDB, rcToken, rcConverting, rcBuffer, rcInsufficient );
+
+        rslt = utf8_utf32 ( & dst [ len ], src, end );
+        if ( rslt <= 0 )
+        {
+            if ( rslt == 0 )
+                return RC ( rcVDB, rcToken, rcConverting, rcString, rcInsufficient );
+
+            return RC ( rcVDB, rcToken, rcConverting, rcString, rcCorrupt );
+        }
+    }
+
+    * dlen = len;
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KTokenToWideString ( const KToken *self, uint32_t *buffer, uint32_t blen, uint32_t *len )
+{
+    int rslt;
+    const char *start, *end;
+    size_t i, sz = self -> str . size;
+
+    switch ( self -> id )
+    {
+    case eEndOfInput:
+        * len = 0;
+        return 0;
+
+    case eString:
+        -- sz;
+    case eUntermString:
+        return utf8_utf32_cvt_string_copy ( buffer, blen, len, self -> str . addr + 1, sz - 1 );
+
+    case eEscapedString:
+        -- sz;
+    case eUntermEscapedString:
+        -- sz;
+        break;
+
+    default:
+        return utf8_utf32_cvt_string_copy ( buffer, blen, len, self -> str . addr, sz );
+    }
+
+    /* get start and end pointers for utf8 string */
+    start = self -> str . addr + 1;
+    end = start + sz;
+
+    for ( i = 0; start < end; ++ i, start += rslt )
+    {
+        if ( i == blen )
+            return RC ( rcVDB, rcToken, rcConverting, rcBuffer, rcInsufficient );
+
+        rslt = utf8_utf32 ( & buffer [ i ], start, end );
+        if ( rslt <= 0 )
+        {
+            if ( rslt == 0 )
+                return RC ( rcVDB, rcToken, rcConverting, rcString, rcInsufficient );
+
+            return RC ( rcVDB, rcToken, rcConverting, rcString, rcCorrupt );
+        }
+
+        if ( buffer [ i ] == ( uint32_t ) '\\' )
+        {
+            rslt = utf8_utf32 ( & buffer [ i ], start += rslt, end );
+            if ( rslt <= 0 )
+            {
+                if ( rslt == 0 )
+                    return RC ( rcVDB, rcToken, rcConverting, rcString, rcInsufficient );
+
+                return RC ( rcVDB, rcToken, rcConverting, rcString, rcCorrupt );
+            }
+
+            if ( rslt == 1 ) switch ( ( char ) buffer [ i ] )
+            {
+                /* control characters */
+            case 'r':
+                buffer [ i ] = '\r';
+                break;
+            case 'n':
+                buffer [ i ] = '\n';
+                break;
+            case 't':
+                buffer [ i ] = '\t';
+                break;
+            case '0':
+                buffer [ i ] = '\0';
+                break;
+
+            case 'a':
+                buffer [ i ] = '\a';
+                break;
+            case 'b':
+                buffer [ i ] = '\b';
+                break;
+            case 'v':
+                buffer [ i ] = '\v';
+                break;
+            case 'f':
+                buffer [ i ] = '\f';
+                break;
+
+            case 'x': case 'X':
+                /* expect 2 additional hex characters */
+                if ( ( start + 2 ) < end &&
+                     isxdigit ( start [ 1 ] ) &&
+                     isxdigit ( start [ 2 ] ) )
+                {
+                    /* go ahead and convert */
+                    buffer [ i ] =
+                        ( ( hex_to_int ( start [ 1 ] ) << 4 ) |
+                            hex_to_int ( start [ 2 ] ) );
+                    start += 2;
+                }
+                break;
+
+            case 'u': case 'U':
+                /* expect 4 additional hex characters */
+                if ( ( start + 4 ) < end &&
+                     isxdigit ( start [ 1 ] ) &&
+                     isxdigit ( start [ 2 ] ) &&
+                     isxdigit ( start [ 3 ] ) &&
+                     isxdigit ( start [ 4 ] ) )
+                {
+                    /* go ahead and convert */
+                    buffer [ i ] =
+                        ( ( hex_to_int ( start [ 1 ] ) << 12 ) |
+                          ( hex_to_int ( start [ 2 ] ) << 8 ) |
+                          ( hex_to_int ( start [ 3 ] ) << 4 ) |
+                            hex_to_int ( start [ 4 ] ) );
+                    start += 4;
+                }
+                break;
+            }
+        }
+    }
+
+    * len = (uint32_t)i;
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KTokenSource
+ */
+
+
+/* Return
+ *  returns token to source
+ */
+LIB_EXPORT void CC KTokenSourceReturn ( KTokenSource *self, const KToken *t )
+{
+    if ( self != NULL && t != NULL )
+    {
+        if ( t -> str . addr + t -> str . size == self -> str . addr )
+        {
+            self -> str . addr = t -> str . addr;
+            self -> str . size += t -> str . size;
+            self -> str . len += t -> str . len;
+        }
+    }
+}
+
+
+/* Consume
+ *  consumes all remaining data
+ */
+LIB_EXPORT void CC KTokenSourceConsume ( KTokenSource *self )
+{
+    if ( self != NULL )
+    {
+        self -> str . addr += self -> str . size;
+        self -> str . len = 0;
+        self -> str . size = 0;
+    }
+}
+
+
+/* Extend
+ *  try to make more data available
+ */
+static
+rc_t CC KTokenSourceExtend ( KTokenSource *src )
+{
+    KTokenText *tt = ( KTokenText* ) src -> txt;
+    if ( tt -> read != NULL )
+    {
+        rc_t rc = ( * tt -> read ) ( tt -> data, tt, src -> str . size );
+        if ( rc != 0 )
+            return rc;
+        src -> str = tt -> str;
+    }
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KTokenizer
+ *  an encapsulation of the tokenizer code
+ */
+
+/* Next
+ *  get next token
+ */
+#if CHECK_TOKENIZER
+static KToken * CC KTokenizerNextInt
+#else
+LIB_EXPORT KToken * CC KTokenizerNext
+#endif
+ ( const KTokenizer *self, KTokenSource *src, KToken *t )
+{
+    int id;
+    const unsigned char *start, *stop;
+    bool return_eoln, allow_slash_slash, allow_hash_cmt, try_extend, path_ident;
+
+#define ispathident(c) ( isalnum (c) || (c) == '.' || (c) == '-' || (c) == '_' )
+
+    if ( t == NULL || src == NULL )
+        return NULL;
+
+    start = ( const unsigned char* ) src -> str . addr;
+    stop = start + src -> str . size;
+
+    /* glue token to text */
+    t -> txt = src -> txt;
+
+    /* no symbol */
+    t -> sym = NULL;
+
+    /* detect returning eoln */
+    return_eoln = ( self == kLineTokenizer );
+
+    /* the POSIX tokenizer doesn't want // comments */
+    allow_slash_slash = ( self != kPOSIXPathTokenizer );
+    allow_hash_cmt = ( self == kPOSIXPathTokenizer );
+    path_ident =  ( self == kPOSIXPathTokenizer );
+
+restart:
+
+    /* skip over blanks */
+    while ( start < stop && isspace ( * start ) )
+    {
+        switch ( * start )
+        {
+        case '\r':
+            t -> str . addr = ( const char* ) start;
+            if ( start + 1 < stop && start [ 1 ] == '\n' )
+                ++ start;
+            if ( ! return_eoln )
+            {
+                ++ src -> lineno;
+                break;
+            }
+            else
+            {
+        case '\n':
+                t -> str . addr = ( const char* ) start;
+                if ( start + 1 < stop && start [ 1 ] == '\r' )
+                    ++ start;
+                if ( ! return_eoln )
+                {
+                    ++ src -> lineno;
+                    break;
+                }
+            }
+
+            t -> str . len = (uint32_t)( start - ( const unsigned char* ) t -> str . addr );
+            t -> str . size = t -> str . len;
+            t -> lineno = src -> lineno ++;
+            t -> id = eEndOfLine;
+
+            src -> str . size -= start - ( const unsigned char* ) src -> str . addr;
+            src -> str . len -= (uint32_t)( start - ( const unsigned char* ) src -> str . addr );
+            src -> str . addr = ( const char* ) start;
+
+            return t;
+        }
+
+        ++ start;
+    }
+
+    /* detect end */
+    if ( start == stop )
+    {
+        src -> str . addr = ( const char* ) start;
+        src -> str . size = 0;
+        src -> str . len = 0;
+
+        KTokenSourceExtend ( src );
+        start = ( const unsigned char* ) src -> str . addr;
+        stop = start + src -> str . size;
+        if ( start != stop )
+            goto restart;
+
+        t -> str = src -> str;
+        t -> lineno = src -> lineno;
+        t -> id = eEndOfInput;
+        return t;
+    }
+
+    /* record start of token */
+    t -> str . addr = ( const char* ) start;
+    t -> lineno = src -> lineno;
+
+    /* many symbols do not need extend */
+    try_extend = false;
+
+    /* tokenize */
+    if ( isdigit ( * start ) )
+    {
+        try_extend = true;
+
+        /* assume numeral */
+        if ( * start != '0' )
+        {
+            id = eDecimal;
+#if SUPPORT_SIGNED_NUMERALS
+tokenize_decimal:
+#endif
+            while ( ++ start < stop )
+            {
+                if ( ! isdigit ( * start ) )
+                {
+                    if ( isalpha ( * start ) || * start == '_' )
+                    {
+                        if ( id != eDecimal )
+                            break;
+                        id = eName;
+                        goto tokenize_name;
+                    }
+                    if ( * start == '.' )
+                        goto tokenize_float;
+                    break;
+                }
+            }
+        }
+        else
+        {
+            if ( ( stop - start ) >= 3 &&
+                 ( start [ 1 ] == 'x' || start [ 1 ] == 'X' ) &&
+                 isxdigit ( start [ 2 ] ) )
+            {
+                id = eHex;
+                for ( start += 3; start < stop; ++ start )
+                {
+                    if ( ! isxdigit ( * start ) )
+                    {
+                        if ( isalpha ( * start ) || * start == '_' )
+                        {
+                            id = eName;
+                            goto tokenize_name;
+                        }
+                        break;
+                    }
+                }
+            }
+            else
+            {
+                id = eOctal;
+                while ( ++ start < stop )
+                {
+                    if ( ! isdigit ( * start ) )
+                    {
+                        if ( isalpha ( * start ) || * start == '_' )
+                        {
+                            id = eName;
+                            goto tokenize_name;
+                        }
+                        if ( * start == '.' )
+                            goto tokenize_float;
+                        break;
+                    }
+
+                    if ( * start > '7' )
+                        id = eDecimal;
+                }
+            }
+        }
+    }
+    else if ( isalpha ( * start ) )
+    {
+tokenize_ident:
+        try_extend = true;
+
+        id = eIdent;
+
+tokenize_name:
+        while ( ++ start < stop )
+        {
+            if ( path_ident && ( *start  == '.' || *start == '-' ) )
+                continue;
+
+            if ( ! isalnum ( * start ) && * start != '_' )
+                break;
+        }
+    }
+    else switch ( * start ++ )
+    {
+    case '_':
+        -- start;
+        goto tokenize_ident;
+    case '\'':
+        try_extend = true;
+        for ( id = eUntermString; start < stop; ++ start )
+        {
+            if ( * start == '\'' )
+            {
+                ++ id;
+                start += 1;
+                break;
+            }
+
+            if ( * start == '\\' )
+            {
+                id = eUntermEscapedString;
+                if ( ++ start == stop )
+                    break;
+            }
+        }
+        break;
+
+    case '"':
+        try_extend = true;
+        for ( id = eUntermString; start < stop; ++ start )
+        {
+            if ( * start == '"' )
+            {
+                ++ id;
+                start += 1;
+                break;
+            }
+
+            if ( * start == '\\' )
+            {
+                id = eUntermEscapedString;
+                if ( ++ start == stop )
+                    break;
+            }
+        }
+        break;
+
+    case '.':
+        if ( path_ident ) /* posix path parsing enabled */
+        {
+            /* find special identifier ".." by finding two periods not followed by 
+             * another identifier character
+             */
+            if ( start [ 0 ] == '.' && ! ispathident ( start [ 1 ]))
+            {
+                id = eDblPeriod;
+                break;
+            }
+            if ( isalnum ( * start ) || * start == '.' || * start == '_' || * start == '-' )
+            {
+                id = eName;
+                goto tokenize_name;
+            }
+        }
+        if ( stop > start && isdigit ( * start ) )
+        {
+tokenize_float:
+            try_extend = true;
+            id = eFloat;
+            while ( ++ start < stop )
+            {
+                if ( ! isdigit ( * start ) )
+                {
+                    if ( id != eFloat )
+                        break;
+                    if ( ( stop - start ) < 2 || ! isdigit ( start [ 1 ] ) )
+                        break;
+                    if ( * start == '.' )
+                        id = eMajMinRel;
+                    else if ( * start == 'e' || * start == 'E' )
+                        id = eExpFloat;
+                    else
+                    {
+                        break;
+                    }
+                    ++ start;
+                }
+            }
+            break;
+        }
+
+        if ( ( stop - start ) < 2 )
+            try_extend = true;
+        else if ( start [ 0 ] == '.' && start [ 1 ] == '.'  )
+        {
+            id = eEllipsis;
+            start += 2;
+            break;
+        }
+
+        id = ePeriod;
+        break;
+
+    case ',':
+        id = eComma;
+        break;
+    case ':':
+        id = eColon;
+        if ( start == stop )
+            try_extend = true;
+        else
+        {
+            switch ( start [ 0 ] )
+            {
+            case ':':
+                id = eDblColon;
+                start += 1;
+                break;
+            case '=':
+                id = eColonAssign;
+                start += 1;
+                break;
+            }
+        }
+        break;
+    case ';':
+        id = eSemiColon;
+        break;
+    case '?':
+        id = eQuestion;
+        break;
+    case '~':
+        id = eTilde;
+        break;
+    case '!':
+        id = eExclam;
+        if ( start == stop )
+            try_extend = true;
+        else if ( start [ 0 ] == '=' )
+        {
+            id = eNotEqual;
+            start += 1;
+        }
+        break;
+    case '@':
+        id = eAtSign;
+        break;
+    case '#':
+        if ( allow_hash_cmt )
+            goto line_cmt;
+        id = eHash;
+        break;
+    case '$':
+        id = eDollar;
+        break;
+    case '%':
+        id = ePercent;
+        break;
+    case '^':
+        id = eCaret;
+        break;
+    case '&':
+        id = eAmpersand;
+        if ( start == stop )
+            try_extend = true;
+        if ( start [ 0 ] == '&' )
+        {
+            id = eLogAnd;
+            start += 1;
+        }
+        break;
+    case '*':
+        id = eAsterisk;
+        break;
+    case '+':
+#if SUPPORT_SIGNED_NUMERALS
+        if ( start == stop )
+            try_extend = true;
+        else
+        {
+            if ( isdigit ( * start ) )
+            {
+                id = eSignedDec;
+                try_extend = true;
+                goto tokenize_decimal;
+            }
+            if ( start [ 0 ] == '=' )
+            {
+                id = ePlusAssign;
+                start += 1;
+                break;
+            }
+        }
+#endif
+        id = ePlus;
+        break;
+    case '-':
+#if SUPPORT_SIGNED_NUMERALS
+        if ( start == stop )
+            try_extend = true;
+        else
+        {
+            if ( isdigit ( * start ) )
+            {
+                id = eSignedDec;
+                try_extend = true;
+                goto tokenize_decimal;
+            }
+            if ( * start == '>' )
+            {
+                id = eOverArrow;
+                start += 1;
+                break;
+            }
+        }
+#endif
+        id = eMinus;
+        break;
+    case '=':
+        id = eAssign;
+        if ( start == stop )
+            try_extend = true;
+        else if ( start [ 0 ] == '=' )
+        {
+            id = eEqual;
+            start += 1;
+        }
+        break;
+    case '/':
+        id = eFwdSlash;
+        if ( start == stop )
+            try_extend = true;
+        else switch ( start [ 0 ] )
+        {
+        case '/':
+            if ( ! allow_slash_slash )
+                break;
+            ++ start;
+line_cmt:
+            try_extend = true;
+            for ( ; start < stop; ++ start )
+            {
+                switch ( start [ 0 ] )
+                {
+                case '\r':
+                case '\n':
+                    goto comment_restart;
+                }
+            }
+comment_restart:
+            src -> str . len -= string_len ( src -> str . addr, ( const char* ) start - src -> str . addr );
+            src -> str . size -= ( const char* ) start - src -> str . addr;
+            src -> str . addr = ( const char* ) start;
+            goto restart;
+
+        case '*':
+            try_extend = true;
+            id = eUntermComment;
+            if ( ++ start < stop ) switch ( start [ 0 ] )
+            {
+            case '\r':
+                if ( start + 1 < stop && start [ 1 ] == '\n' )
+                    ++ start;
+                ++ src -> lineno;
+                break;
+            case '\n':
+                if ( start + 1 < stop && start [ 1 ] == '\r' )
+                    ++ start;
+                ++ src -> lineno;
+                break;
+            }
+            for ( ++ start; start < stop; ++ start )
+            {
+                switch ( start [ 0 ] )
+                {
+                case '/':
+                    if ( start [ -1 ] == '*' )
+                    {
+                        ++ start;
+                        goto comment_restart;
+                    }
+                    break;
+                case '\r':
+                    if ( start + 1 < stop && start [ 1 ] == '\n' )
+                        ++ start;
+                    ++ src -> lineno;
+                    break;
+                case '\n':
+                    if ( start + 1 < stop && start [ 1 ] == '\r' )
+                        ++ start;
+                    ++ src -> lineno;
+                    break;
+                }
+            }
+            break;
+        }
+        break;
+    case '\\':
+        id = eBackSlash;
+        break;
+    case '|':
+        id = ePipe;
+        if ( start == stop )
+            try_extend = true;
+        else if ( start [ 0 ] == '|' )
+        {
+            id = eLogOr;
+            start += 1;
+        }
+        break;
+    case '(':
+        id = eLeftParen;
+        break;
+    case ')':
+        id = eRightParen;
+        break;
+    case '{':
+        id = eLeftCurly;
+        break;
+    case '}':
+        id = eRightCurly;
+        break;
+    case '<':
+        id = eLeftAngle;
+        if ( start == stop )
+            try_extend = true;
+        else if ( start [ 0 ] == '<' )
+        {
+            id = eDblLeftAngle;
+            start += 1;
+        }
+        break;
+    case '>':
+        id = eRightAngle;
+        if ( start == stop )
+            try_extend = true;
+        else if ( start [ 0 ] == '>' )
+        {
+            id = eDblRightAngle;
+            start += 1;
+        }
+        break;
+    case '[':
+        id = eLeftSquare;
+        if ( start == stop )
+            try_extend = true;
+        else if ( start [ 0 ] == '[' )
+        {
+            id = eDblLeftSquare;
+            start += 1;
+        }
+        break;
+    case ']':
+        id = eRightSquare;
+        if ( start == stop )
+            try_extend = true;
+        else if ( start [ 0 ] == ']' )
+        {
+            id = eDblRightSquare;
+            start += 1;
+        }
+        break;
+    default:
+        /* skip over single UTF-8 character */
+        if ( ( ( const char* ) start ) [ -1 ] < 0 )
+        {
+            while ( start < stop )
+            {
+                if ( ( * start & 0xC0 ) != 0x80 )
+                    break;
+                ++ start;
+            }
+        }
+
+        t -> str . len = 1;
+        t -> str . size = start - ( const unsigned char* ) t -> str . addr;
+
+        src -> str . addr = ( const char* ) start;
+        src -> str . len -= 1;
+        src -> str . size -= t -> str . size;
+
+        t -> id = eUnrecognized;
+        return t;
+    }
+
+    t -> str . len = (uint32_t)( start - ( const unsigned char* ) t -> str . addr );
+    t -> str . size = t -> str . len;
+    t -> id = id;
+
+    if ( ! try_extend || start < stop )
+    {
+        src -> str . size -= start - ( const unsigned char* ) src -> str . addr;
+        src -> str . len -= (uint32_t)( start - ( const unsigned char* ) src -> str . addr );
+        src -> str . addr = ( const char* ) start;
+    }
+    else
+    {
+        /* state that the amount left in source
+           is exactly what was tokenized */
+        src -> str = t -> str;
+
+        /* try to extend, which is successful
+           only if src ends up with more data */
+        KTokenSourceExtend ( src );
+        if ( src -> str . size > t -> str . size )
+        {
+            start = ( const unsigned char* ) src -> str . addr;
+            stop = start + src -> str . size;
+            goto restart;
+        }
+
+        /* out of data on source */
+        src -> str . addr = ( const char* ) stop;
+        src -> str . size = 0;
+        src -> str . len = 0;
+    }
+
+    return t;
+}
+
+#if CHECK_TOKENIZER
+#include <stdio.h>
+static
+void CC examine_src ( const KTokenSource *src, bool before )
+{
+    const KTokenText *tt = src -> txt;
+    const char *stage = before ? "before" : "after";
+
+    /* first test - are src addr and size correct */
+    if ( src -> str . addr + src -> str . size !=
+         tt -> str . addr + tt -> str . size )
+    {
+        /* in the case of console input before tokenization, this is allowed */
+        if ( before && src -> str . size == 0 && tt -> read != NULL )
+            return;
+
+        /* check for src addr being within text */
+        if ( src -> str . addr < tt -> str . addr ||
+             src -> str . addr >= tt -> str . addr + tt -> str . size )
+        {
+            fprintf ( stderr, "KTokenizerNext: bad src address %s scan\n", stage );
+        }
+        else
+        {
+            fprintf ( stderr, "KTokenizerNext: bad src size ( %lu ) %s scan "
+                      "at file \"%.*s\" offset %lu\n"
+                      , ( long unsigned ) src -> str . size
+                      , stage
+                      , ( int ) tt -> path . size, tt -> path . addr
+                      , ( long unsigned ) ( src -> str . addr - tt -> str . addr ) );
+        }
+    }
+
+    /* test number of characters */
+    else
+    {
+        uint32_t len = string_len ( src -> str . addr, src -> str . size );
+        if ( len != src -> str . len )
+        {
+            fprintf ( stderr, "KTokenizerNext: bad src character count "
+                      "( %u measured, %u stated ) %s scan\n", len, src -> str . len, stage );
+        }
+    }
+}
+
+LIB_EXPORT KToken * CC KTokenizerNext ( const KTokenizer *self, KTokenSource *src, KToken *t )
+{
+    KToken *rt;
+    examine_src ( src, true );
+    rt = KTokenizerNextInt ( self, src, t );
+    examine_src ( src, false );
+    return rt;
+}
+#endif
diff --git a/libs/klib/trie-priv.h b/libs/klib/trie-priv.h
new file mode 100644
index 0000000..3796ef7
--- /dev/null
+++ b/libs/klib/trie-priv.h
@@ -0,0 +1,237 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_trie_priv_
+#define _h_trie_priv_
+
+#ifndef _h_klib_trie_
+#include <klib/trie.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * TTrans
+ *  a text transition node
+ */
+typedef struct TTrans TTrans;
+struct TTrans
+{
+    /* child nodes */
+    TTrans **child;
+
+    /* values associated with the node */
+    BSTree vals;
+
+    /* the depth occupied within tree */
+    uint32_t depth;
+
+    /* number of transitions in array */
+    uint16_t tcnt;
+
+    /* number of values in b-tree */
+    uint16_t vcnt;
+};
+
+/* TTransBacktrace
+ *  describes a TTrans
+ *  with backtrace pointer to parent and transition index from parent
+ */
+typedef struct TTransBacktrace TTransBacktrace;
+struct TTransBacktrace
+{
+    const TTransBacktrace *par;
+    const TTrans *trans;
+    uint32_t idx;
+};
+
+/* TTransForEach
+ * TTransForEachBT
+ */
+void TTransForEach ( const TTrans *trans, uint32_t width,
+    void ( CC * f ) ( const TTransBacktrace *bt, uint32_t width, void *data ), void *data );
+void TTransForEachBT ( const TTransBacktrace *bt, uint32_t width,
+    void ( CC * f ) ( const TTransBacktrace *bt, uint32_t width, void *data ), void *data );
+
+/* TTransDoUntil
+ * TTransDoUntilBT
+ */
+bool TTransDoUntil ( const TTrans *trans, uint32_t width,
+    bool ( CC * f ) ( const TTransBacktrace *bt, uint32_t width, void *data ), void *data );
+bool TTransDoUntilBT ( const TTransBacktrace *bt, uint32_t width,
+    bool ( CC * f ) ( const TTransBacktrace *bt, uint32_t width, void *data ), void *data );
+
+/* TTransValidate
+ *  recursively checks structure
+ */
+int TTransValidate ( const TTrans *trans, const Trie *tt );
+
+
+/*--------------------------------------------------------------------------
+ * TTSearchNode
+ *  this is a complicated guy.
+ *
+ *  if the only values allowed in a TTrans were terminal values,
+ *  then the natural structure would imply a TTrans node for every
+ *  path and a child array to hold children. the tree would be
+ *  simple to navigate; searching would return TTrans nodes.
+ *
+ *  however, the structure abandons child arrays when the count
+ *  is low enough, and allows non-terminal values in the value
+ *  tree. a string may still terminate on a TTrans, but necessarily
+ *  there will be strings that terminate in space.
+ *
+ *  to handle this, as well as to address non-intrusive list
+ *  functionality, this search node is able to do too many things.
+ *
+ *  1) it allows a poor version of a child array to be added
+ *     to an existing TTrans.
+ *
+ *  2) it defines a fake TTrans object with its own depth
+ *     and value list.
+ *
+ *  3) the fake TTrans can itself be exploded to contain
+ *     further fake TTrans objects
+ *
+ *  4) it functions as a non-intrusive reference to a TTNode
+ *     for inclusion into temporary child lists.
+ */
+enum
+{
+    snTrans,
+    snKeynode,
+    snTransEx,
+    snFakeTrans,
+    snFakeTransEx
+};
+
+typedef struct TTSearchNode TTSearchNode;
+struct TTSearchNode
+{
+    union
+    {
+        /* snTrans, snTransEx */
+        struct
+        {
+            const TTrans *ref;
+            DLList vals;
+            DLList child;
+
+        } trans;
+
+        /* snKeynode */
+        struct
+        {
+            DLNode n;
+            const TNode *ref;
+
+        } keynode;
+
+        /* snFakeTrans, snFakeTransEx */
+        struct
+        {
+            DLNode n;
+            DLList vals;
+            DLList child;
+            uint32_t depth;
+            uint32_t idx;
+
+        } fake;
+
+    } u;
+
+    uint32_t refcount;
+    uint32_t variant;
+};
+
+/* TTSearchNodeMakeTrans
+ *  creates a reference node
+ */
+rc_t TTSearchNodeMakeTrans ( TTSearchNode **s, const TTrans *trans );
+
+/* TTSearchNodeExplodeTrans
+ *  explodes a simple TTrans to split values into term and non-term
+ *  may create fake trans objects within "child"
+ */
+rc_t TTSearchNodeExplodeTrans ( TTSearchNode *s, const Trie *tt );
+
+/* TTSearchNodeExplodeFakeTrans
+ *  explodes a fake trans to split values into term and non-term
+ *  may create fake trans objects within "child"
+ */
+rc_t TTSearchNodeExplodeFakeTrans ( TTSearchNode *s, const Trie *tt );
+
+/* TTSearchNodeRelease
+ *  releases a reference, and potentially the object
+ */
+void TTSearchNodeRelease ( TTSearchNode *s );
+
+/* TTSearchNodeReuseTrans
+ *  if a node has no other references,
+ *  destructs and re-initializes the node for reuse.
+ *
+ *  otherwise, a new node is created.
+ */
+rc_t TTSearchNodeReuseTrans ( TTSearchNode **s, const TTrans *trans );
+
+
+/*--------------------------------------------------------------------------
+ * TTSearchNodeRef
+ */
+typedef struct TTSearchNodeRef TTSearchNodeRef;
+struct TTSearchNodeRef
+{
+    DLNode n;
+    TTSearchNode *s;
+};
+
+/* TTSearchNodeRefMake
+ */
+rc_t TTSearchNodeRefMake ( TTSearchNodeRef **ref, TTSearchNode *s );
+
+/* TTSearchNodeRefWhack
+ * TTSearchNodeRefWhackAll
+ */
+void TTSearchNodeRefWhack ( TTSearchNodeRef *p );
+void TTSearchNodeRefWhackAll ( DLNode *n, void *ignore );
+
+
+/*--------------------------------------------------------------------------
+ * Trie
+ */
+
+/* TrieMapChar
+ *  maps a character to an index
+ */
+uint32_t TrieMapChar ( const Trie *tt, uint32_t ch );
+
+/* TrieNextIdx
+ *  pops a character from key string
+ *  maps it to an index
+ */
+rc_t TrieNextIdx ( const Trie *tt, String *key, uint32_t *idx );
+
+
+#endif /* _h_trie_priv_ */
diff --git a/libs/klib/trie.c b/libs/klib/trie.c
new file mode 100644
index 0000000..3250524
--- /dev/null
+++ b/libs/klib/trie.c
@@ -0,0 +1,1486 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "trie-priv.h"
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <wctype.h>
+#include <errno.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * TNode
+ *  a node within text tree
+ */
+
+/* TNodeMake
+ *  creates a TNode of variable size
+ *
+ *  "n" will contain the returned node
+ *
+ *  "size" must be at least the size of a TNode
+ */
+LIB_EXPORT rc_t CC TNodeMake ( TNode **np, size_t size )
+{
+    TNode *n;
+
+    if ( np == NULL )
+        return RC ( rcCont, rcNode, rcAllocating, rcParam, rcNull );
+
+    if ( size < sizeof * n )
+        return RC ( rcCont, rcNode, rcAllocating, rcParam, rcInvalid );
+
+    n = malloc ( size );
+    if ( n == NULL )
+        return RC ( rcCont, rcNode, rcAllocating, rcMemory, rcExhausted );
+
+    * np = n;
+    return 0;
+}
+
+/* TNodeWhack
+ *  performs final whacking of node
+ */
+LIB_EXPORT void CC TNodeWhack ( TNode *n )
+{
+    free ( n );
+}
+
+/* TNodeCmp
+ */
+static
+int64_t CC TNodeCmp ( const void *item, const void *n )
+{
+#define a ( ( const String* ) item )
+#define b ( ( const TNode* ) n )
+
+    return StringCompare ( a, & b -> key );
+
+#undef a
+#undef b
+}
+
+/* TNodeSort
+ */
+static
+int64_t CC TNodeSort ( const BSTNode *item, const BSTNode *n )
+{
+#define a ( ( const TNode* ) item )
+#define b ( ( const TNode* ) n )
+
+    return StringCompare ( & a -> key, & b -> key );
+
+#undef a
+#undef b
+}
+
+/*--------------------------------------------------------------------------
+ * TTrans
+ *  a text transition node
+ *
+ *  transitions to child nodes occur only if "tcnt" != 0 ( "child" != NULL )
+ *  and are taken on the query string's character [ key . len ]
+ */
+
+/* TTransMake
+ */
+static
+rc_t CC TTransMake ( TTrans **tp, uint32_t depth )
+{
+    TTrans *trans = malloc ( sizeof * trans );
+    if ( trans == NULL )
+        return RC ( rcCont, rcNode, rcAllocating, rcMemory, rcExhausted );
+
+    trans -> child = NULL;
+    trans -> tcnt = trans -> vcnt = 0;
+    BSTreeInit ( & trans -> vals );
+    trans -> depth = depth;
+
+    * tp = trans;
+    return 0;
+}
+
+/* TTransForEach
+ */
+void TTransForEach ( const TTrans *trans, uint32_t width,
+    void ( CC * f ) ( const TTransBacktrace *bt, uint32_t width, void *data ), void *data )
+{
+    TTransBacktrace bt;
+    bt . par = NULL;
+    bt . trans = trans;
+    bt . idx = 0;
+
+    TTransForEachBT ( & bt, width, f, data );
+}
+
+void TTransForEachBT ( const TTransBacktrace *bt, uint32_t width,
+    void ( CC * f ) ( const TTransBacktrace *bt, uint32_t width, void *data ), void *data )
+{
+    const TTrans *trans = bt -> trans;
+
+    if ( f != NULL )
+        ( * f ) ( bt, width, data );
+
+    assert ( trans != NULL );
+    if ( trans -> child != NULL )
+    {
+        uint32_t i;
+        TTransBacktrace child;
+        for ( child . par = bt, i = 0; i < width; ++ i )
+        {
+            if ( ( child . trans = trans -> child [ i ] ) != NULL )
+            {
+                child . idx = ( uint32_t ) i;
+                TTransForEachBT ( & child, width, f, data );
+            }
+        }
+    }
+}
+
+/* TTransDoUntil
+ */
+bool TTransDoUntil ( const TTrans *trans, uint32_t width,
+    bool ( CC * f ) ( const TTransBacktrace *bt, uint32_t width, void *data ), void *data )
+{
+    TTransBacktrace bt;
+    bt . par = NULL;
+    bt . trans = trans;
+    bt . idx = 0;
+
+    return TTransDoUntilBT ( & bt, width, f, data );
+}
+
+bool TTransDoUntilBT ( const TTransBacktrace *bt, uint32_t width,
+    bool ( CC * f ) ( const TTransBacktrace *bt, uint32_t width, void *data ), void *data )
+{
+    const TTrans *trans = bt -> trans;
+
+    if ( f != NULL )
+    {
+        if ( ( * f ) ( bt, width, data ) )
+            return true;
+    }
+
+    assert ( trans != NULL );
+    if ( trans -> child != NULL )
+    {
+        uint32_t i;
+        TTransBacktrace child;
+        for ( child . par = bt, i = 0; i < width; ++ i )
+        {
+            if ( ( child . trans = trans -> child [ i ] ) != NULL )
+            {
+                child . idx = ( uint32_t ) i;
+                if ( TTransDoUntilBT ( & child, width, f, data ) )
+                    return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+/* TTransWhack
+ */
+static
+void TTransWhack ( TTrans *trans, uint32_t width,
+    void ( CC * whack ) ( TNode *n, void *data ), void *data )
+{
+    if ( trans != NULL )
+    {
+        if ( trans -> child != NULL )
+        {
+            uint32_t i;
+            for ( i = 0; i < width; ++ i )
+            {
+                TTrans *child = trans -> child [ i ];
+                if ( child != NULL )
+                    TTransWhack ( child, width, whack, data );
+            }
+
+            free ( trans -> child );
+        }
+
+        BSTreeWhack ( & trans -> vals,
+            ( void ( CC * ) ( BSTNode*, void* ) ) whack, data );
+
+        free ( trans );
+    }
+}
+
+
+/*--------------------------------------------------------------------------
+ * Trie
+ *  a tree of text nodes
+ */
+
+/* TrieInit
+ *  initialize a text-tree structure
+ *
+ *  "accept" is a character-set string where each character
+ *  represents itself. the only exception is the '-' character,
+ *  which - when sandwiched between two other characters - is
+ *  interpreted en tot as a range expression. an example would be
+ *  "-0-9" is identical to "-0123456789"
+ *
+ *  "limit" sets the number of values to be accumulated in any
+ *  container. if this limit would be exceeded by any insertion,
+ *  the node is expanded and its values are re-distributed among
+ *  its children.
+ *
+ *  if "cs_expand" is 1, then any valid characters observed
+ *  during insertions are automatically added to the accept
+ *  character set. doing so will ensure that there are no
+ *  ambiguous transitions.
+ *
+ *  returns status codes:
+ *    0      => success
+ *    EINVAL => an invalid parameter
+ *    ENOMEM => failed to allocate internal structures
+ *    EDOM   => either the limit was too high or the accept string too wide
+ */
+LIB_EXPORT rc_t CC TrieInit ( Trie *tt, const char *accept,
+    uint32_t limit, bool cs_expand )
+{
+    int ch_len;
+    const char *src, *end;
+
+    uint32_t ch, ch2;
+    uint32_t first, last, width;
+
+    uint16_t *map;
+    uint32_t *rmap;
+
+    if ( tt == NULL )
+        return RC ( rcCont, rcTrie, rcConstructing, rcSelf, rcNull );
+
+    if ( accept == NULL )
+        return RC ( rcCont, rcTrie, rcConstructing, rcString, rcNull );
+
+    if ( accept [ 0 ] == 0 )
+        return RC ( rcCont, rcTrie, rcConstructing, rcString, rcEmpty );
+
+    if ( ( limit >> 16 ) != 0 )
+        return RC ( rcCont, rcTrie, rcConstructing, rcParam, rcExcessive );
+
+    memset ( tt, 0, sizeof * tt );
+    tt -> limit = ( uint16_t ) limit;
+    tt -> cs_expand = cs_expand;
+
+    /* determine width of accept string
+       N.B. we don't detect overlaps at this point */
+    src = accept;
+    end = src + strlen ( accept );
+
+    for ( last = 0, first = ~ 0; src < end; )
+    {
+        /* get a character */
+        ch_len = utf8_utf32 ( & ch, src, end );
+        if ( ch_len <= 0 )
+            return RC ( rcCont, rcTrie, rcConstructing, rcChar, rcInvalid );
+        src += ch_len;
+
+        /* this character represents itself */
+        if ( ch < first )
+            first = ch;
+        if ( ch > last )
+            last = ch;
+
+        /* check for a range expression */
+        if ( src < end && src [ 0 ] == '-' )
+        {
+            ch_len = utf8_utf32 ( & ch2, ++ src, end );
+            if ( ch_len <= 0 )
+                return RC ( rcCont, rcTrie, rcConstructing, rcChar, rcInvalid );
+            src += ch_len;
+
+            /* this character represents
+               hopefully a reasonable range */
+            if ( ch2 < ch )
+                return RC ( rcCont, rcTrie, rcConstructing, rcChar, rcInvalid );
+            if ( ch2 > last )
+                last = ch2;
+        }
+    }
+
+    /* must have had something */
+    if ( last < first )
+        return RC ( rcCont, rcTrie, rcConstructing, rcString, rcInvalid );
+
+    tt -> first_char = first;
+    tt -> last_char = last;
+
+    /* create a character map of pure unknown index */
+    map = calloc ( last - first + 1, sizeof map [ 0 ] );
+    if ( map == NULL )
+        return RC ( rcCont, rcTrie, rcConstructing, rcMemory, rcExhausted );
+    tt -> map = map;
+
+    /* mark the character map */
+    for ( src = accept; src < end; )
+    {
+        /* get a character */
+        ch_len = utf8_utf32 ( & ch, src, end );
+        src += ch_len;
+
+        /* mark character */
+#if REJECT_ACCEPT_OVERLAP
+        if ( map [ ch - first ] != 0 )
+        {
+            free ( map );
+            return RC ( rcCont, rcTrie, rcConstructing, rcChar, rcInvalid );
+        }
+#endif
+        map [ ch - first ] = 1;
+
+        /* check for a range expression */
+        if ( src < end && src [ 0 ] == '-' )
+        {
+            ch_len = utf8_utf32 ( & ch2, ++ src, end );
+            src += ch_len;
+
+            /* mark range */
+            for ( ++ ch; ch <= ch2; ++ ch )
+            {
+#if REJECT_ACCEPT_OVERLAP
+                if ( map [ ch - first ] != 0 )
+                {
+                    free ( map );
+                    return RC ( rcCont, rcTrie, rcConstructing, rcChar, rcInvalid );
+                }
+#endif
+                map [ ch - first ] = 1;
+            }
+        }
+    }
+
+    /* fill in the character map and determine width */
+    for ( width = 0, ch = first; ch <= last; ++ ch )
+    {
+        if ( map [ ch - first ] != 0 )
+            map [ ch - first ] = ++ width;
+    }
+
+    /* enforce maximum width */
+    assert ( width > 0 );
+    if ( ( ++ width >> 16 ) != 0 )
+    {
+        free ( map );
+        return RC ( rcCont, rcTrie, rcConstructing, rcRange, rcExcessive );
+    }
+
+    /* record trans width accounting for unmapped slot */
+    tt -> width = ( uint16_t ) width;
+
+    /* now create a reverse map to produce characters
+       from an index */
+#if _DEBUGGING
+    rmap = calloc ( width, sizeof rmap [ 0 ] );
+#else
+    rmap = malloc ( width * sizeof rmap [ 0 ] );
+#endif
+    if ( rmap == NULL )
+    {
+        free ( map );
+        return RC ( rcCont, rcTrie, rcConstructing, rcMemory, rcExhausted );
+    }
+    tt -> rmap = rmap;
+
+    for ( rmap [ 0 ] = 0, ch = first; ch <= last; ++ ch )
+    {
+        uint32_t idx = map [ ch - first ];
+        if ( idx != 0 )
+            rmap [ idx ] = ch;
+    }
+
+    return 0;
+}
+
+/* TrieMapChar
+ *  maps a character to an index
+ */
+uint32_t TrieMapChar ( const Trie *tt, uint32_t ch )
+{
+    if ( ch >= tt -> first_char && ch <= tt -> last_char )
+        return tt -> map [ ch - tt -> first_char ];
+    return 0;
+}
+
+/* TrieNextIdx
+ *  pops a character from key string
+ *  maps it to an index
+ */
+rc_t TrieNextIdx ( const Trie *tt, String *key, uint32_t *idx )
+{
+    uint32_t ch;
+    rc_t rc = StringPopHead ( key, & ch );
+    if ( rc == 0 )
+        * idx = TrieMapChar ( tt, ch );
+    return rc;
+}
+
+/* TrieAutoExpand
+ *  incorporates a new character into the accept charset
+ *
+ *    1. extends all existing "child" arrays
+ *    2. reallocs "map" if necessary, invalidating new space
+ *    3. reallocs "rmap"
+ *    4. installs character <-> index into map
+ *    5. increments width
+ *
+ *  the order of execution is designed to be benign if
+ *  failures occur, due only to memory exhaustion.
+ */
+typedef struct AutoExpandData AutoExpandData;
+struct AutoExpandData
+{
+    rc_t rc;
+};
+
+static
+bool CC TTransAutoExpand ( const TTransBacktrace *bt, uint32_t width, void *data )
+{
+    TTrans **child, *trans = ( TTrans* ) bt -> trans;
+
+    assert ( trans != NULL );
+    if ( trans -> child == NULL )
+        return false;
+
+    child = realloc ( trans -> child, ( width + 1 ) * sizeof * child );
+    if ( child == NULL )
+    {
+        ( ( AutoExpandData* ) data ) -> rc =
+            RC ( rcCont, rcTrie, rcInserting, rcMemory, rcExhausted );
+        return true;
+    }
+
+    child [ width ] = NULL;
+    trans -> child = child;
+    return false;
+}
+
+static
+rc_t CC TrieAutoExpand ( Trie *tt, uint32_t ch )
+{
+    AutoExpandData pb;
+    pb . rc = 0;
+
+    /* extend node child arrays */
+    TTransDoUntil ( tt -> root, tt -> width, TTransAutoExpand, & pb );
+    if ( pb . rc == 0 )
+    {
+        uint16_t *map = ( uint16_t* ) tt -> map;
+        uint32_t *rmap = ( uint32_t* ) tt -> rmap;
+
+        /* realloc charset to index map if necessary */
+        if ( ch < tt -> first_char )
+        {
+            map = malloc ( ( tt -> last_char - ch + 1 ) * sizeof * map );
+            if ( map == NULL )
+                return RC ( rcCont, rcTrie, rcInserting, rcMemory, rcExhausted );
+            memset ( map, 0, ( tt -> first_char - ch ) * sizeof * map );
+            memmove ( & map [ tt -> first_char - ch ], tt -> map,
+                ( tt -> last_char - tt -> first_char + 1 ) * sizeof * map );
+            free ( ( void* ) tt -> map );
+            tt -> first_char = ch;
+        }
+        else if ( ch > tt -> last_char )
+        {
+            map = realloc ( map, ( ch - tt -> first_char + 1 ) * sizeof * map );
+            if ( map == NULL )
+                return RC ( rcCont, rcTrie, rcInserting, rcMemory, rcExhausted );
+            memset ( & map [ tt -> last_char - tt -> first_char + 1 ], 0, ( ch - tt -> last_char ) * sizeof * map );
+            tt -> last_char = ch;
+        }
+
+        /* record any change */
+        tt -> map = map;
+
+        /* extend index to charset map */
+        rmap = realloc ( rmap, ( tt -> width + 1 ) * sizeof * rmap );
+        if ( rmap == NULL )
+            return RC ( rcCont, rcTrie, rcInserting, rcMemory, rcExhausted );
+
+        tt -> rmap = rmap;
+
+        /* it is done */
+        rmap [ tt -> width ] = ch;
+        map [ ch - tt -> first_char ] = tt -> width ++;
+    }
+
+    return pb . rc;
+}
+
+/* TrieValidateRemainder
+ *  ensures that all characters remaining in key
+ *  are valid and, in the case of expanding the char set,
+ *  are in the character set.
+ */
+static
+rc_t CC TrieValidateRemainder ( Trie *tt, const String *key )
+{
+    rc_t rc;
+    String rem = * key;
+
+    while ( 1 )
+    {
+        uint32_t ch;
+        rc = StringPopHead ( & rem, & ch );
+        if ( GetRCState ( rc ) == rcEmpty )
+            return 0;
+
+        if ( tt -> cs_expand )
+        {
+            uint32_t idx = TrieMapChar ( tt, ch );
+            if ( idx == 0 )
+            {
+                /* get the new width */
+                uint16_t width = tt -> width + 1;
+                
+                /* get a new value for idx */
+                idx = tt -> width;
+                
+                /* make sure the expansion would not exceed
+                   the 16 bit limit on array width */
+                if ( width == 0 )
+                {
+                    rc = RC ( rcCont, rcTrie, rcInserting, rcRange, rcExcessive );
+                    break;
+                }
+                
+                /* incorporate the character */
+                rc = TrieAutoExpand ( tt, ch );
+                if ( rc != 0 )
+                    break;
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* TrieExplodeTrans
+ *  a TTrans has exceeded its limit of TNode values
+ */
+typedef struct ExplodeTransData ExplodeTransData;
+struct ExplodeTransData
+{
+    const Trie *tt;
+    TTrans *trans;
+    size_t tsize;
+    uint32_t tcnt;
+    uint32_t cnt;
+    rc_t rc;
+    bool over;
+};
+
+static
+bool CC CreateKids ( BSTNode *n, void *data )
+{
+    ExplodeTransData *pb = data;
+    TNode *item = ( TNode* ) n;
+    const TTrans *trans = pb -> trans;
+
+    if ( item -> key . len > trans -> depth )
+    {
+        uint32_t idx;
+        String key = item -> key;
+        const Trie *tt = pb -> tt;
+
+        /* perform a sub-string based upon
+           knowledge that the entry key matches
+           the first "trans->depth" characters */
+        key . addr += pb -> tsize;
+        key . len -= trans -> depth;
+        key . size -= pb -> tsize;
+
+        /* get the next transition index */
+        pb -> rc = TrieNextIdx ( tt, & key, & idx );
+        if ( pb -> rc != 0 )
+            return true;
+
+        /* test the transition */
+        assert ( trans -> child != NULL );
+        if ( trans -> child [ idx ] == NULL )
+        {
+            /* create the transition */
+            pb -> rc = TTransMake ( & trans -> child [ idx ], trans -> depth + 1 );
+            if ( pb -> rc != 0 )
+                return false;
+
+            ++ pb -> tcnt;
+        }
+
+#if _DEBUGGING
+        /* accounting for non-terminal key */
+        ++ pb -> cnt;
+#else
+        /* early exit */
+        if ( ++ pb -> cnt == trans -> tcnt )
+            return true;
+#endif
+    }
+
+    return false;
+}
+
+static
+bool CC WhackKids ( BSTNode *n, void *data )
+{
+    ExplodeTransData *pb = data;
+    TNode *item = ( TNode* ) n;
+    const TTrans *trans = pb -> trans;
+
+    if ( item -> key . len > trans -> depth )
+    {
+        TTrans *child;
+        uint32_t idx;
+        String key = item -> key;
+        const Trie *tt = pb -> tt;
+
+        /* perform a sub-string based upon
+           knowledge that the entry key matches
+           the first "trans->depth" characters */
+        key . addr += pb -> tsize;
+        key . len -= trans -> depth;
+        key . size -= pb -> tsize;
+
+        /* get the next transition character */
+        pb -> rc = TrieNextIdx ( tt, & key, & idx );
+        if ( pb -> rc != 0 )
+            return false;
+
+        /* test the transition - due to early
+           exit on error from child creation,
+           as well as from this function, we can
+           assert that this transition is not NULL */
+        assert ( trans -> child != NULL );
+        assert ( trans -> child [ idx ] != NULL );
+        child = trans -> child [ idx ];
+
+        /* if the child is totally empty, it was just
+           created and should be doused */
+        if ( child -> tcnt + child -> vcnt == 0 )
+        {
+            free ( child );
+            trans -> child [ idx ] = NULL;
+
+#if _DEBUGGING
+            /* not strictly required, because no changes
+               have been committed yet */
+            -- pb -> tcnt;
+#else
+            /* early exit when there could be no further work */
+            if ( -- pb -> tcnt == 0 )
+                return true;
+#endif
+        }
+
+        /* mandatory early exit when we detect limit */
+        if ( -- pb -> cnt == 0 )
+            return true;
+    }
+
+    return false;
+}
+
+static
+bool CC MoveKids ( BSTNode *n, void *data )
+{
+    ExplodeTransData *pb = data;
+    TNode *item = ( TNode* ) n;
+    TTrans *trans = pb -> trans;
+
+    if ( item -> key . len > trans -> depth )
+    {
+        TTrans *child;
+        uint32_t idx;
+        String key = item -> key;
+        const Trie *tt = pb -> tt;
+
+        /* perform a sub-string based upon
+           knowledge that the entry key matches
+           the first "trans->depth" characters */
+        key . addr += pb -> tsize;
+        key . len -= trans -> depth;
+        key . size -= pb -> tsize;
+
+        /* get the next transition character */
+        pb -> rc = TrieNextIdx ( tt, & key, & idx );
+        assert ( pb -> rc == 0 );
+
+        /* test the transition */
+        assert ( trans -> child != NULL );
+        assert ( trans -> child [ idx ] != NULL );
+        child = trans -> child [ idx ];
+
+        /* pop this guy from its current location */
+        BSTreeUnlink ( & trans -> vals, & item -> n );
+
+        /* insert into its new location */
+        pb -> rc = BSTreeInsert ( & child -> vals, & item -> n, TNodeSort );
+        assert ( pb -> rc == 0 );
+
+        if ( item -> key . len == child -> depth )
+            ++ child -> vcnt;
+        else
+            ++ child -> tcnt;
+
+        /* detect an over-limit child */
+        assert ( child -> child == NULL );
+        if ( child -> tcnt != 0 && ( child -> tcnt + child -> vcnt > tt -> limit ) )
+            pb -> over = true;
+
+#if _DEBUGGING
+        ++ pb -> cnt;
+#else
+        /* early exit */
+        if ( ++ pb -> cnt == trans -> tcnt )
+            return true;
+#endif
+    }
+
+    return false;
+}
+
+static
+rc_t CC TrieExplodeTrans ( const Trie *tt, TTrans *trans, size_t tsize )
+{
+    rc_t rc;
+    ExplodeTransData pb;
+
+    /* create a child array */
+    assert ( trans -> child == NULL );
+    trans -> child = calloc ( tt -> width, sizeof trans -> child [ 0 ] );
+    if ( trans -> child == NULL )
+        return RC ( rcCont, rcTrie, rcInserting, rcMemory, rcExhausted );
+
+    /* loop data structure */
+    pb . tt = tt;
+    pb . trans = trans;
+    pb . tsize = tsize;
+    pb . tcnt = 0;
+    pb . cnt = 0;
+    pb . rc = 0;
+
+    /* create new child nodes */
+    BSTreeDoUntil ( & trans -> vals, 0, CreateKids, & pb );
+    assert ( pb . tcnt <= tt -> width );
+    rc = pb . rc;
+
+    /* roll-back changes on error */
+    if ( rc != 0 && pb . cnt != trans -> tcnt )
+    {
+        if ( pb . tcnt != 0 )
+        {
+            BSTreeDoUntil ( & trans -> vals, 0, WhackKids, & pb );
+            assert ( pb . tcnt == 0 );
+        }
+
+        free ( trans -> child );
+        trans -> child = NULL;
+
+        return rc;
+    }
+
+    /* commit changes */
+    pb . cnt = 0;
+    pb . over = false;
+
+    BSTreeDoUntil ( & trans -> vals, 0, MoveKids, & pb );
+    assert ( pb . rc == 0 );
+    assert ( pb . cnt == trans -> tcnt );
+
+    assert ( pb . tcnt <= tt -> width );
+    trans -> tcnt = pb . tcnt;
+
+    /* handle over-limit kids */
+    if ( pb . over )
+    {
+        uint32_t i;
+        for ( i = 0; i < tt -> width; ++ i )
+        {
+            TTrans *child = trans -> child [ i ];
+            if ( trans -> child [ i ] != NULL )
+            {
+                assert ( child -> child == NULL );
+                if ( child -> tcnt != 0 && ( child -> tcnt + child -> vcnt > tt -> limit ) )
+                {
+                    /* re-calculate transition key string size */
+                    uint32_t ch;
+                    const TNode *item = ( const TNode* ) child -> vals . root;
+                    String key = item -> key;
+
+                    key . addr += tsize;
+                    key . len -= trans -> tcnt;
+                    key . size -= tsize;
+
+                    rc = StringPopHead ( & key, & ch );
+                    assert ( rc == 0 );
+
+                    rc = TrieExplodeTrans ( tt, child, item -> key . size - key . size );
+                    if ( rc != 0 )
+                        break;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* TrieInsertEngine
+ *  inserts an item into tree
+ *
+ *  "item" is a TNode with an embedded key string.
+ *
+ *  "exist" is an optional return parameter for prior nodes
+ *  and indicates whether to insert unique or not
+ *
+ *  returns status codes:
+ *    0      => success
+ *    EINVAL => an invalid parameter
+ *    ENOMEM => failed to allocate internal structures
+ */
+static
+rc_t CC TrieInsertEngine ( Trie *tt, TNode *item, TNode **exist )
+{
+    rc_t rc;
+    String key;
+    TTrans *trans;
+
+    /* quick parameter check */
+    if ( tt == NULL )
+        return RC ( rcCont, rcTrie, rcInserting, rcSelf, rcNull );
+    if ( item == NULL )
+        return RC ( rcCont, rcTrie, rcInserting, rcParam, rcNull );
+    if ( item -> key . len == 0 )
+        return RC ( rcCont, rcTrie, rcInserting, rcString, rcEmpty );
+
+    /* starting key */
+    key = item -> key;
+
+    /* get the root TTrans */
+    if ( tt -> root == NULL )
+    {
+        rc = TTransMake ( & tt -> root, 0 );
+        if ( rc != 0 )
+            return rc;
+    }
+    trans = tt -> root;
+
+    while ( 1 )
+    {
+        /* if there is a child array and the key is non-terminal */
+        if ( trans -> child != NULL && trans -> depth < item -> key . len )
+        {
+            /* get transition character and index */
+            uint32_t ch, idx;
+            rc = StringPopHead ( & key, & ch );
+            if ( rc != 0 )
+                break;
+            idx = TrieMapChar ( tt, ch );
+
+            /* check for auto-expand on unmapped character */
+            if ( idx == 0 && tt -> cs_expand )
+            {
+                /* get the new width */
+                uint16_t width = tt -> width + 1;
+
+                /* get a new value for idx */
+                idx = tt -> width;
+
+                /* make sure the expansion would not exceed
+                   the 16 bit limit on array width */
+                if ( width == 0 )
+                {
+                    rc = RC ( rcCont, rcTrie, rcInserting, rcRange, rcExcessive );
+                    break;
+                }
+                rc = TrieAutoExpand ( tt, ch );
+                if ( rc != 0 )
+                    break;
+            }
+
+            /* take transition if there */
+            if ( trans -> child [ idx ] != NULL )
+            {
+                trans = trans -> child [ idx ];
+                continue;
+            }
+
+            /* create new transition */
+            rc = TTransMake ( & trans -> child [ idx ], trans -> depth + 1 );
+            if ( rc != 0 )
+                break;
+
+            /* account for and take the new transition */
+            ++ trans -> tcnt;
+            trans = trans -> child [ idx ];
+        }
+
+        /* item should never be shorter than node */
+        assert ( trans -> depth <= item -> key . len );
+        if ( trans -> depth < item -> key . len )
+        {
+            rc = TrieValidateRemainder ( tt, & key );
+            if ( rc != 0 )
+                break;
+        }
+
+        /* going to install into value tree */
+        if ( exist == NULL )
+            rc = BSTreeInsert ( & trans -> vals, & item -> n, TNodeSort );
+        else
+        {
+            rc = BSTreeInsertUnique ( & trans -> vals,
+                & item -> n, ( BSTNode** ) exist, TNodeSort );
+        }
+        if ( rc == 0 )
+        {
+            /* account for type of insert */
+            if ( trans -> depth == item -> key . len )
+                ++ trans -> vcnt;
+            else
+                ++ trans -> tcnt;
+
+            /* now test for overflow */
+            if ( trans -> child == NULL && trans -> tcnt != 0 )
+            {
+                if ( trans -> vcnt + trans -> tcnt > tt -> limit )
+                {
+                    /* it's time to convert to a full transition node */
+                    TrieExplodeTrans ( tt, trans, item -> key . size - key . size );
+                }
+            }
+        }
+        break;
+    }
+
+#if _DEBUGGING && 0
+    if ( rc == 0 && tt -> validate )
+        rc = TTransValidate ( tt -> root, tt );
+#endif
+
+    return rc;
+}
+
+/* TrieInsert
+ *  inserts an item into tree
+ *
+ *  "item" is a TNode with an embedded key string.
+ *
+ *  returns status codes:
+ *    0      => success
+ *    EINVAL => an invalid parameter
+ *    ENOMEM => failed to allocate internal structures
+ */
+LIB_EXPORT rc_t CC TrieInsert ( Trie *tt, TNode *item )
+{
+    return TrieInsertEngine ( tt, item, NULL );
+}
+
+/* TrieInsertUnique
+ *  behaves like TrieInsert and returns 0 if insert succeeded
+ *
+ *  if insert failed with a return value of EEXIST, the existing
+ *  object is returned in "exist".
+ */
+LIB_EXPORT rc_t CC TrieInsertUnique ( Trie *tt, TNode *item, TNode **exist )
+{
+    TNode *dummy;
+    if ( exist == NULL )
+        exist = & dummy;
+
+    return TrieInsertEngine ( tt, item, exist );
+}
+
+/* TrieFindTrans
+ */
+static
+rc_t CC TrieFindTrans ( const Trie *tt, TTrans *trans, const String *item, TTrans **buffer )
+{
+    String key = * item;
+
+    while ( trans -> child != NULL )
+    {
+        rc_t rc;
+        uint32_t idx;
+
+        assert ( trans -> tcnt != 0 );
+
+        rc = TrieNextIdx ( tt, & key, & idx );
+	/* This might actually happen if the trie has more internal
+	   nodes than one might think, and the string is short 
+	   (i.e. it terminates in an "internal" node */
+	/* This needs to know the reconstructed RC for better readability */
+	if (rc == RC( rcText, rcChar, rcRemoving, rcString, rcEmpty ) ) {
+	  *buffer = trans;
+	  return 0;
+	}
+        if ( rc != 0 )
+	  return rc;
+
+        if ( trans -> child [ idx ] == NULL )
+            break;
+
+        trans = trans -> child [ idx ];
+    }
+
+    * buffer = trans;
+    return 0;
+}
+
+/* TrieFindTransChain
+ *  finds chain of TTrans objects having single transitions
+ *
+ *  explanation and justification:
+ *
+ *  - when TrieUnlink removes the last bucket from a value BSTree,
+ *    the containing TTrans node may become empty and should be
+ *    collected.
+ *
+ *  - to collect a TTrans object, a backlink to its parent or a
+ *    forward list from parent(s) to node are required, in order
+ *    to remove the parents' outgoing transition to the dead node.
+ *
+ *  - backlinks have been excluded from the design for many reasons,
+ *    among them the expense of 64 bit pointers. a list of forward
+ *    transitions only requires a head and tail, since the internal
+ *    transitions are found with the key and may be recovered with
+ *    the same key.
+ *
+ *  - this chain is defined as the head and tail of a list having
+ *    a single line of transitions eminating from a remaining parent,
+ *    such that "head" will be the deepest parent in the chain having
+ *    a vcnt + tcnt > 1, or NULL if none are found. all subsequent nodes
+ *    will be subject to collection.
+ */
+static
+rc_t CC TrieFindTransChain ( const Trie *tt, TTrans *trans,
+    const String *item, TTrans **head, TTrans **tail )
+{
+    String key = * item;
+
+    * head = NULL;
+
+    while ( trans -> child != NULL )
+    {
+        rc_t rc;
+        uint32_t idx;
+
+        assert ( trans -> tcnt != 0 );
+
+        rc = TrieNextIdx ( tt, & key, & idx );
+        if ( rc != 0 )
+            return rc;
+
+        /* detect end of line */
+        if ( trans -> child [ idx ] == NULL )
+            break;
+
+        /* record new head */
+        if ( trans -> tcnt + trans -> vcnt > 1 )
+            * head = trans;
+
+        /* take transition */
+        trans = trans -> child [ idx ];
+    }
+
+    * tail = trans;
+    return 0;
+}
+
+/* TrieUnlink
+ *  remove an object from the tree
+ *
+ *  returns "true" if node was actually removed from tree
+ */
+LIB_EXPORT bool CC TrieUnlink ( Trie *tt, TNode *item )
+{
+    if ( tt != NULL && item != NULL && tt -> root != NULL )
+    {
+        TTrans *head, *tail;
+        rc_t rc = TrieFindTransChain ( tt, tt -> root, & item -> key, & head, & tail );
+        if ( rc == 0 && BSTreeUnlink ( & tail -> vals, & item -> n ) )
+        {
+            assert ( item -> key . len >= tail -> depth );
+            if ( item -> key . len == tail -> depth )
+            {
+                assert ( tail -> vcnt > 0 );
+                -- tail -> vcnt;
+            }
+            else
+            {
+                assert ( tail -> tcnt > 0 );
+                -- tail -> tcnt;
+            }
+
+            /* check for need to whack TTrans */
+            if ( tail -> vcnt + tail -> tcnt == 0 )
+            {
+                String key;
+                TTrans *trans;
+                uint32_t idx;
+
+                if ( head == NULL )
+                {
+                    /* going to whack everything */
+                    key = item -> key;
+                    trans = tt -> root;
+                }
+                else
+                {
+                    /* remove the leading characters of the key */
+                    StringSubstr ( & item -> key, & key, head -> depth, 0 );
+                    rc = TrieNextIdx ( tt, & key, & idx );
+                    assert ( rc == 0 );
+                    assert ( head -> child != NULL );
+                    trans = head -> child [ idx ];
+
+                    /* sever the transition */
+                    assert ( trans != NULL );
+                    head -> child [ idx ] = NULL;
+                    assert ( head -> vcnt > 0 );
+                    -- head -> vcnt;
+                }
+
+                /* whack all of the trans nodes down to tail */
+                while ( 1 )
+                {
+                    TTrans *next;
+
+                    /* get the next character index */
+                    rc = TrieNextIdx ( tt, & key, & idx );
+                    assert ( rc == 0 );
+
+                    /* get the next node */
+                    assert ( trans -> child != NULL );
+                    next = trans -> child [ idx ];
+                    assert ( next != NULL );
+
+                    /* whack the current node */
+                    assert ( trans -> vcnt + trans -> tcnt == 0 );
+                    assert ( trans -> vals . root == NULL );
+                    free ( trans -> child );
+                    free ( trans );
+
+                    /* get out if this was the tail */
+                    if ( trans == tail )
+                        break;
+
+                    /* take the next transition */
+                    trans = next;
+                }
+            }
+
+            return true;
+        }
+    }
+
+    return false;
+}
+
+/* TrieFind
+ *  find a single object within tree
+ *
+ *  "item" is an exact match text string
+ *
+ *  returns an arbitrarily selected TNode* from matching set
+ *  or NULL if none found.
+ */
+LIB_EXPORT TNode * CC TrieFind ( const Trie *tt, const String *item )
+{
+    if ( tt != NULL && item != NULL && tt -> root != NULL && item -> len != 0 )
+    {
+        TTrans *trans;
+        rc_t rc = TrieFindTrans ( tt, tt -> root, item, & trans );
+	if (rc == 0)
+        {
+	    return ( TNode* ) BSTreeFind ( & trans -> vals, item,
+                ( int64_t ( CC * ) ( const void*, const BSTNode* ) ) TNodeCmp );
+	}
+    }
+
+    return NULL;
+}
+
+/* TrieFindAll
+ *  find multiple objects within tree
+ *
+ *  "item" is an exact match text string
+ *
+ *  "buffer" is a user-supplied array of TNode* with a
+ *  capacity of "capacity" elements. if successful, the
+ *  entire found set will be returned unordered within.
+ *
+ *  "num_found" ( out ) indicates the size of the found set,
+ *  regardless of return value, such that if the supplied
+ *  buffer were to be too small, the required size is returned.
+ *
+ *  returns status codes:
+ *    0       => success
+ *    EINVAL  => an invalid parameter
+ *    ENOENT  => the found set was empty
+ *    ENOBUFS => the found set was too large
+ */
+LIB_EXPORT rc_t CC TrieFindAll ( const Trie *tt, const String *item,
+    TNode *buffer [], uint32_t capacity,
+    uint32_t *num_found )
+{
+    rc_t rc;
+    TTrans *trans;
+    uint32_t count;
+
+    if ( tt == NULL )
+        return RC ( rcCont, rcTrie, rcSelecting, rcSelf, rcNull );
+    if ( item == NULL )
+        return RC ( rcCont, rcTrie, rcSelecting, rcString, rcNull );
+    if ( item -> len == 0 )
+        return RC ( rcCont, rcTrie, rcSelecting, rcString, rcEmpty );
+
+    if ( buffer == NULL && capacity != 0 )
+        return RC ( rcCont, rcTrie, rcSelecting, rcBuffer, rcNull );
+
+    count = 0;
+
+    rc = TrieFindTrans ( tt, tt -> root, item, & trans );
+    if ( rc == 0 )
+    {
+        TNode *node = ( TNode* ) BSTreeFind ( & trans -> vals, item,
+            ( int64_t ( CC * ) ( const void*, const BSTNode* ) ) TNodeCmp );
+        if ( node == NULL )
+            rc = RC ( rcCont, rcTrie, rcSelecting, rcString, rcNotFound );
+        else
+        {
+            TNode *nbr;
+
+            /* back up as far as we can */
+            for ( nbr = ( TNode* ) BSTNodePrev ( & node -> n );
+                  nbr != NULL && StringEqual ( & nbr -> key, item );
+                  nbr = ( TNode* ) BSTNodePrev ( & node -> n ) )
+            {
+                ++ count;
+                node = nbr;
+            }
+
+            /* recover to original point */
+            if ( count != 0 )
+            {
+                uint32_t i;
+                for ( i = 0; i < count; ++ i )
+                {
+                    if ( i < capacity )
+                        buffer [ i ] = node;
+                    node = ( TNode* ) BSTNodeNext ( & node -> n );
+                }
+            }
+
+            /* count the original */
+            if ( count < capacity )
+                buffer [ count ] = node;
+
+            /* now continue forward */
+            for ( ++ count, node = ( TNode* ) BSTNodeNext ( & node -> n );
+                  node != NULL && StringEqual ( & node -> key, item );
+                  ++ count, node = ( TNode* ) BSTNodeNext ( & node -> n ) )
+            {
+                if ( count < capacity )
+                    buffer [ count ] = node;
+            }
+
+            /* detect no buffer space */
+            if ( count > capacity )
+                rc = RC ( rcCont, rcTrie, rcSelecting, rcBuffer, rcInsufficient );
+        }
+    }
+
+    if ( num_found != NULL )
+        * num_found = count;
+
+    return rc;
+}
+
+/* TrieForEach
+ *  executes a function on each tree element
+ */
+typedef struct TrieForEachData TrieForEachData;
+struct TrieForEachData
+{
+    void ( CC * f ) ( TNode*, void* );
+    void *data;
+};
+
+static
+void CC TrieForEachElem ( const TTransBacktrace *bt, uint32_t width, void *data )
+{
+    const TTrans *trans = bt -> trans;
+    TrieForEachData *pb = data;
+    if ( trans -> vals . root != NULL )
+    {
+        BSTreeForEach ( & trans -> vals, 0,
+            ( void ( CC * ) ( BSTNode*, void* ) ) pb -> f, pb -> data );
+    }
+}
+
+LIB_EXPORT void CC TrieForEach ( const Trie *tt,
+    void ( CC * f ) ( TNode *n, void *data ), void *data )
+{
+    if ( tt != NULL && tt -> root != NULL )
+    {
+        TrieForEachData pb;
+        pb . f = f;
+        pb . data = data;
+        TTransForEach ( tt -> root, tt -> width, TrieForEachElem, & pb );
+    }
+}
+
+/* TrieDoUntil
+ *  executes a function on each tree element
+ *  until the function returns true
+ */
+typedef struct TrieDoUntilData TrieDoUntilData;
+struct TrieDoUntilData
+{
+    bool ( CC * f ) ( TNode*, void* );
+    void *data;
+};
+
+static
+bool CC TrieDoUntilElem ( const TTransBacktrace *bt, uint32_t width, void *data )
+{
+    const TTrans *trans = bt -> trans;
+    TrieDoUntilData *pb = data;
+    if ( trans -> vals . root != NULL )
+    {
+        return BSTreeDoUntil ( & trans -> vals, 0,
+            ( bool ( CC * ) ( BSTNode*, void* ) ) pb -> f, pb -> data );
+    }
+    return false;
+}
+
+LIB_EXPORT bool CC TrieDoUntil ( const Trie *tt,
+    bool ( CC * f ) ( TNode *n, void *data ), void *data )
+{
+    if ( tt != NULL && tt -> root != NULL )
+    {
+        TrieDoUntilData pb;
+        pb . f = f;
+        pb . data = data;
+        return TTransDoUntil ( tt -> root, tt -> width, TrieDoUntilElem, & pb );
+    }
+    return false;
+}
+
+/* TrieExplore
+ *  executes a function on each element in the path of the key
+ *  from furthest node to closest node
+ *  until the function returns true or end of chain
+ */
+typedef struct TrieExploreData_struct {
+    bool ( CC * f ) ( TNode*, void* );
+    void *data;
+    const String* item;
+} TrieExploreData;
+
+static
+bool CC TrieExploreBSTree( BSTNode *n, void *data )
+{
+    TrieExploreData* pb = data;
+    TNode* node = (TNode*)n;
+    String sub = *pb->item;
+    sub.len = node->key.len;
+
+    if( StringCompare(&node->key, &sub) == 0 ) {
+        if( pb->f(node, pb->data) ) {
+            return true;
+        }
+    }
+    return false;
+}
+
+static
+bool CC TrieExploreTrans( const Trie *tt, TTrans *trans, String *key, TrieExploreData* data)
+{
+    /* first dive deeper if possible */
+    while( trans->child != NULL ) {
+        uint32_t idx;
+        if( TrieNextIdx(tt, key, &idx) != 0 ) {
+            break;
+        }
+        if( trans->child[idx] != NULL ) {
+            /* do not recur if current trans has no values */
+            if( trans->vcnt > 0 ) {
+                if( TrieExploreTrans(tt, trans->child[idx], key, data) ) {
+                    return true;
+                }
+                break;
+            } else {
+                trans = trans->child[idx];
+            }
+        }
+    }
+    /* than search local BSTree on the way out */
+    return BSTreeDoUntil(&trans->vals, true, TrieExploreBSTree, data);
+}
+
+LIB_EXPORT bool CC TrieExplore( const Trie *tt, const String *item, 
+    bool ( CC * f ) ( TNode *n, void *data ), void *data )
+{
+    if ( tt != NULL && item != NULL && tt->root != NULL && item->len != 0 ) {
+        TrieExploreData pb;
+        String key = *item;
+        pb.f = f;
+        pb.data = data;
+        pb.item = item;
+        return TrieExploreTrans(tt, tt->root, &key, &pb);
+    }
+    return false;
+}
+
+/* TrieWhack
+ *  tears down internal structure
+ *
+ *  any parameter, including"tt," may be NULL
+ */
+LIB_EXPORT void CC TrieWhack ( Trie *tt,
+    void ( CC * whack ) ( TNode *n, void *data ), void *data )
+{
+    if ( tt != NULL )
+    {
+        if ( tt -> root != NULL )
+            TTransWhack ( tt -> root, tt -> width, whack, data );
+
+        free ( ( void* ) tt -> map );
+        free ( ( void* ) tt -> rmap );
+    }
+}
diff --git a/libs/klib/trieval.c b/libs/klib/trieval.c
new file mode 100644
index 0000000..d2c43c1
--- /dev/null
+++ b/libs/klib/trieval.c
@@ -0,0 +1,168 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "trie-priv.h"
+#include <klib/log.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <wctype.h>
+#include <errno.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * TTrans
+ *  a text transition node
+ *
+ *  transitions to child nodes occur only if "tcnt" != 0 ( "child" != NULL )
+ *  and are taken on the query string's character [ key . len ]
+ */
+
+/* TTransValidate
+ */
+typedef struct TTValNodeCntData TTValNodeCntData;
+struct TTValNodeCntData
+{
+    unsigned int depth;
+    unsigned int vcnt;
+    unsigned int tcnt;
+};
+
+static
+void CC TTransCountTNodes ( BSTNode *n, void *data )
+{
+    TTValNodeCntData *pb = data;
+    const TNode *node = ( const TNode* ) n;
+
+    if ( strlen ( node -> key . addr ) == pb -> depth )
+        ++ pb -> vcnt;
+    else
+        ++ pb -> tcnt;
+}
+
+/* TTransValidate
+ *  recursively checks structure
+ */
+int CC TTransValidate ( const TTrans *trans, const Trie *tt )
+{
+    int status = 0;
+
+    TTValNodeCntData pb;
+    unsigned int i, width;
+
+    width = tt -> width;
+
+    pb . depth = trans -> depth;
+    pb . vcnt = pb . tcnt = 0;
+
+    /* count transition array */
+    if ( trans -> child != NULL )
+    {
+        for ( i = 0; i < width; ++ i )
+        {
+            if ( trans -> child [ i ] != NULL )
+                ++ pb . tcnt;
+        }
+    }
+
+    /* count value tree */
+    BSTreeForEach ( & trans -> vals, 0, TTransCountTNodes, & pb );
+
+    /* check validity */
+    if ( pb . tcnt != trans -> tcnt )
+    {
+        LOGERR ( status = EINVAL, "bad trans -> tcnt => %u, should be %u",
+                 trans -> tcnt, pb . tcnt );
+    }
+
+    /* should have a non-zero tcnt if has child array */
+    else if ( pb . tcnt == 0 && trans -> child != NULL )
+    {
+        LOGERR ( status = EINVAL, "empty trans -> child", NULL ); /* 3rd parameter is wrong so far... */
+    }
+
+    if ( pb . vcnt != trans -> vcnt )
+    {
+        LOGERR ( status = EINVAL, "bad trans -> vcnt => %u, should be %u",
+                 trans -> vcnt, pb . vcnt );
+    }
+
+    if ( trans -> child == NULL && pb . tcnt != 0 )
+    {
+        if ( pb . tcnt + pb . vcnt > tt -> limit )
+        {
+            /*
+            LOGMSG ( "WARNING: over-limit actual value count => %u, should be %u\n",
+                 pb . tcnt + pb . vcnt, tt -> limit );
+           */
+            LOGMSG ( status = EINVAL, "WARNING: over-limit actual value count => %u, should be %u\n" );
+        }
+    }
+
+    if ( status == 0 && trans -> child != NULL )
+    {
+        for ( i = 0; i < width; ++ i )
+        {
+            const TTrans *child = trans -> child [ i ];
+            if ( child != NULL )
+            {
+                if ( child -> depth != trans -> depth + 1 )
+                {
+                    LOGERR ( status = EINVAL, "bad trans -> depth => %u, should be %u",
+                             child -> depth, trans -> depth + 1 );
+                }
+                else
+                {
+                    int err = TTransValidate ( child, tt );
+                    if ( status == 0 )
+                        status = err;
+                }
+            }
+        }
+    }
+
+    return status;
+}
+
+/*--------------------------------------------------------------------------
+ * Trie
+ *  a tree of text nodes
+ */
+
+/* TrieValidate
+ *  run validation check on tree structure
+ */
+LIB_EXPORT int CC TrieValidate ( const Trie *tt )
+{
+    if ( tt == NULL )
+        return EINVAL;
+    if ( tt -> root == NULL )
+        return 0;
+    return TTransValidate ( tt -> root, tt );
+}
diff --git a/libs/klib/unix/misc.c b/libs/klib/unix/misc.c
new file mode 100644
index 0000000..e42e332
--- /dev/null
+++ b/libs/klib/unix/misc.c
@@ -0,0 +1,33 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/misc.h> /* is_iser_an_admin */
+
+#include <unistd.h> /* geteuid */
+
+LIB_EXPORT bool CC is_iser_an_admin(void) {
+    return geteuid() == 0;
+}
diff --git a/libs/klib/unix/syserrcode.c b/libs/klib/unix/syserrcode.c
new file mode 100644
index 0000000..df2ab60
--- /dev/null
+++ b/libs/klib/unix/syserrcode.c
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "writer-priv.h"
+#include <klib/writer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <os-native.h> /* for strchrnul on non-linux */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <assert.h>
+
+size_t KWrtFmt_error_code ( char * buffer, size_t buffer_size, uint32_t error_code )
+{
+    /* this either returns char * or int - we don't really care
+     * if it fails as slong as it put something into the buffer */
+    strerror_r ((int)error_code, buffer, buffer_size);
+    return string_size (buffer);
+}
diff --git a/libs/klib/unix/syslog.c b/libs/klib/unix/syslog.c
new file mode 100644
index 0000000..16aa4ad
--- /dev/null
+++ b/libs/klib/unix/syslog.c
@@ -0,0 +1,209 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include "log-priv.h"
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <time.h>
+#include <errno.h>
+
+
+/* LogTimestamp
+ *  generates a timestamp string
+ */
+
+LIB_EXPORT rc_t CC LogTimestamp ( char *buffer, size_t bsize, size_t *num_writ )
+{
+    int len;
+    static time_t last_time = 0;
+    static struct tm cal;
+    
+    /* get current time */
+    time_t t = time ( 0 );
+    
+    /* initialize time on first run */
+    if ( ! last_time )
+    {
+        last_time = t;
+        gmtime_r ( & last_time, & cal );
+    }
+    
+    /* or update if time has passed */
+    else if ( t != last_time )
+    {
+        /* update every 5 minutes or so */
+        time_t dt = t - last_time;
+        last_time = t;
+        if ( dt >= 300 )
+            gmtime_r ( & last_time, & cal );
+	
+        /* otherwise, just update the struct manually */
+        else
+        {
+            /* advance seconds */
+            dt += cal . tm_sec;
+            cal . tm_sec = ( int ) ( dt % 60 );
+	    
+            /* detect a rolled-over minute */
+            if ( ( dt /= 60 ) != 0 )
+            {
+                /* advance minutes */
+                dt += cal . tm_min;
+                cal . tm_min = ( int ) ( dt % 60 );
+		
+                /* detect a rolled-over hour */
+                if ( ( dt /= 60 ) != 0 )
+                {
+                    /* roll-over of an hour - refetch */
+                    gmtime_r ( & last_time, & cal );
+                }
+            }
+        }
+    }
+    
+    /* make the timestamp */
+    len = snprintf ( buffer, bsize,
+                     "%04d-%02d-%02dT%02d:%02d:%02d"
+                     , cal . tm_year + 1900
+                     , cal . tm_mon + 1
+                     , cal . tm_mday
+                     , cal . tm_hour
+                     , cal . tm_min
+                     , cal . tm_sec
+        );
+
+    if ( num_writ != NULL )
+        * num_writ = len;
+
+    if ( len < 0 || ( size_t ) len >= bsize )
+    {
+        if ( len < 0 && num_writ != NULL )
+            * num_writ = 0;
+        return RC ( rcApp, rcLog, rcLogging, rcBuffer, rcInsufficient );
+    }
+
+    return 0;
+}
+
+/* LogSimpleTimestamp
+ *  generates a local timestamp string without time zone
+ */
+LIB_EXPORT rc_t CC LogSimpleTimestamp ( char *buffer, size_t bsize, size_t *num_writ )
+{
+    int len;
+    static time_t last_time = 0;
+    static struct tm cal;
+    
+    /* get current time */
+    time_t t = time ( 0 );
+    
+    /* initialize time on first run */
+    if ( ! last_time )
+    {
+        last_time = t;
+        localtime_r ( & last_time, & cal );
+    }
+    
+    /* or update if time has passed */
+    else if ( t != last_time )
+    {
+        /* update every 5 minutes or so */
+        time_t dt = t - last_time;
+        last_time = t;
+        if ( dt >= 300 )
+            localtime_r ( & last_time, & cal );
+
+        /* otherwise, just update the struct manually */
+        else
+        {
+            /* advance seconds */
+            dt += cal . tm_sec;
+            cal . tm_sec = ( int ) ( dt % 60 );
+
+            /* detect a rolled-over minute */
+            if ( ( dt /= 60 ) != 0 )
+            {
+                /* advance minutes */
+                dt += cal . tm_min;
+                cal . tm_min = ( int ) ( dt % 60 );
+
+                /* detect a rolled-over hour */
+                if ( ( dt /= 60 ) != 0 )
+                {
+                    /* roll-over of an hour - refetch */
+                    localtime_r ( & last_time, & cal );
+                }
+            }
+        }
+    }
+    
+    /* make the timestamp */
+    len = snprintf ( buffer, bsize,
+                     "%04d-%02d-%02dT%02d:%02d:%02d"
+                     , cal . tm_year + 1900
+                     , cal . tm_mon + 1
+                     , cal . tm_mday
+                     , cal . tm_hour
+                     , cal . tm_min
+                     , cal . tm_sec
+        );
+    if ( num_writ != NULL )
+        * num_writ = len;
+
+    if ( len < 0 || ( size_t ) len >= bsize )
+    {
+        if ( len < 0 && num_writ != NULL )
+            * num_writ = 0;
+        return RC ( rcApp, rcLog, rcLogging, rcBuffer, rcInsufficient );
+    }
+
+    return 0;
+}
+
+/* LogPID
+ *  generates a process id
+ */
+LIB_EXPORT rc_t CC LogPID ( char *buffer, size_t bsize, size_t *num_writ )
+{
+    /* pid_t is signed not unsigned int */
+    int len = snprintf ( buffer, bsize, "%d", getpid () );
+    * num_writ = len;
+    if ( len < 0 || ( size_t ) len >= bsize )
+    {
+        if ( len < 0 )
+            * num_writ = 0;
+        return RC ( rcApp, rcLog, rcLogging, rcBuffer, rcInsufficient );
+    }
+    return 0;
+}
+
diff --git a/libs/klib/unix/systime.c b/libs/klib/unix/systime.c
new file mode 100644
index 0000000..9bef887
--- /dev/null
+++ b/libs/klib/unix/systime.c
@@ -0,0 +1,162 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/time.h>
+#include <klib/rc.h> /* RC */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <time.h>
+#include <sys/time.h>
+#include <errno.h>
+
+
+/*--------------------------------------------------------------------------
+ * KTime_t
+ *  64 bit time_t
+ */
+
+
+/* Stamp
+ *  current timestamp
+ */
+LIB_EXPORT KTime_t CC KTimeStamp ( void )
+{
+    return time ( NULL );
+}
+
+LIB_EXPORT KTimeMs_t CC KTimeMsStamp ( void )
+{
+	struct timeval tm;
+    gettimeofday( &tm, NULL );
+	return ( ( tm.tv_sec * 1000 ) + ( tm.tv_usec / 1000 ) );
+}
+
+/*--------------------------------------------------------------------------
+ * KTime
+ *  simple time structure
+ */
+
+
+/* Make
+ *  make KTime from struct tm
+ */
+static
+void KTimeMake ( KTime *kt, struct tm const *t )
+{
+    kt -> year = t -> tm_year + 1900;
+    kt -> month = t -> tm_mon;
+    kt -> day = t -> tm_mday - 1;
+    kt -> weekday = t -> tm_wday;
+#if !defined(__SunOS)  &&  !defined(__sun__)
+    kt -> tzoff = ( int16_t ) ( t -> tm_gmtoff / 60 );
+#endif
+    kt -> hour = ( uint8_t ) t -> tm_hour;
+    kt -> minute = ( uint8_t ) t -> tm_min;
+    kt -> second = ( uint8_t ) t -> tm_sec;
+    kt -> dst = t -> tm_isdst != 0;
+}
+
+
+/* Local
+ *  populate "kt" from "ts" in local time zone
+ */
+LIB_EXPORT const KTime* CC KTimeLocal ( KTime *kt, KTime_t ts )
+{
+    if ( kt != NULL )
+    {
+        struct tm t;
+        time_t unix_time = ( time_t ) ts;
+        localtime_r ( & unix_time, & t );
+        KTimeMake ( kt, & t );
+    }
+    return kt;
+}
+
+
+/* Global
+ *  populate "kt" from "ts" in GMT
+ */
+LIB_EXPORT const KTime* CC KTimeGlobal ( KTime *kt, KTime_t ts )
+{
+    if ( kt != NULL )
+    {
+        struct tm t;
+        time_t unix_time = ( time_t ) ts;
+        gmtime_r ( & unix_time, & t );
+        KTimeMake ( kt, & t );
+    }
+    return kt;
+}
+
+
+/* MakeTime
+ *  make a KTime_t from KTime
+ */
+LIB_EXPORT KTime_t CC KTimeMakeTime ( const KTime *self )
+{
+    KTime_t ts = 0;
+
+    if ( self != NULL )
+    {
+        struct tm t;
+
+        assert ( self -> year >= 1900 );
+        t . tm_year = self -> year - 1900;
+        t . tm_mon = self -> month;
+        t . tm_mday = self -> day + 1;
+        t . tm_wday = self -> weekday;
+#if !defined(__SunOS)  &&  !defined(__sun__)
+        t . tm_gmtoff = self -> tzoff * 60; 
+#endif
+        t . tm_hour = self -> hour;
+        t . tm_min = self -> minute;
+        t . tm_sec = self -> second;
+        t . tm_isdst = self -> dst;
+
+        ts = mktime ( &t );
+    }
+
+    return ts;
+}
+
+
+LIB_EXPORT rc_t CC KSleepMs(uint32_t milliseconds) {
+    struct timespec time;
+
+    time.tv_sec = (milliseconds / 1000);
+    time.tv_nsec = (milliseconds % 1000) * 1000 * 1000;
+
+    if (nanosleep(&time, NULL)) {
+        return 0;
+    }
+    else {
+        return RC(rcRuntime, rcTimeout, rcWaiting, rcTimeout, rcInterrupted);
+    }
+}
diff --git a/libs/klib/unix/syswriter.c b/libs/klib/unix/syswriter.c
new file mode 100644
index 0000000..6c31c7a
--- /dev/null
+++ b/libs/klib/unix/syswriter.c
@@ -0,0 +1,163 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include "writer-priv.h"
+#include <klib/text.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+static int unix_stdout = 1;
+static int unix_stderr = 2;
+
+rc_t KWrtSysInit(void** h_stdout, void** h_stderr)
+{
+    if( h_stdout ) {
+        *h_stdout = &unix_stdout;
+    }
+    if( h_stderr ) {
+        *h_stderr = &unix_stderr;
+    }
+    return 0;
+}
+
+/* ----
+ * write 'count' bytes starting at 'buf'  to a "stream/file" identified by 'fd'
+ */
+rc_t CC KWrt_DefaultWriter ( void * self, const char * buffer, size_t bufsize, size_t * num_writ )
+{
+    size_t total;
+    size_t remaining;
+    ssize_t num_written;
+    const char * pbyte;
+    int handle;
+    rc_t rc;
+
+    if ( self == NULL ) {
+        return RC ( rcApp, rcLog, rcWriting, rcSelf, rcNull );
+    }
+
+    handle = *(int*)self;
+    pbyte = buffer;
+    rc = 0;
+
+    total = 0;
+    for (remaining = bufsize; remaining > 0; remaining -= num_written)
+    {
+        num_written = write (handle, pbyte, remaining);
+        if (num_written < 0)
+        {
+            switch (errno)
+            {
+            case ENOSPC:
+                rc = RC ( rcApp, rcLog, rcWriting, rcStorage, rcExhausted );
+                break;
+            case EINTR:
+                num_written = 0;
+                break;
+            case EFBIG:
+                rc = RC ( rcApp, rcLog, rcWriting, rcFile, rcExcessive );
+                break;
+            case EIO:
+                rc = RC ( rcApp, rcLog, rcWriting, rcTransfer, rcUnknown );
+                break;
+            case EBADF:
+                rc = RC ( rcApp, rcLog, rcWriting, rcFileDesc, rcInvalid );
+                break;
+            case EINVAL:
+                rc = RC ( rcApp, rcLog, rcWriting, rcParam, rcInvalid );
+                break;
+            default:
+                rc = RC ( rcApp, rcLog, rcWriting, rcNoObj, rcUnknown );
+                break;
+            }
+            if (rc)
+                break;
+        }
+        else
+            total += num_written;
+    }
+    *num_writ = total;
+    return rc;
+}
+
+void print_int_fixup ( char * fmt, size_t * len, size_t max )
+{
+    /* all the Unix flavors support a real printf
+     * Only Windows does it "wrong".
+     * In windows we can't just return like this but instead:
+     *    save fmt[len-1]
+     *    replace 'j' with I64
+     *    replace 'z' or 't',  with 'I'
+     *    replace 'hh' with 'h'
+     *    append saved fmt[len-1] to its new place.
+     *
+     */
+    if (*len > 3)
+    {
+        if ((fmt[*len-3] == 'l') &&
+            (fmt[*len-2] == 'l'))
+        {
+            --*len;
+            fmt[*len-2] = 'j';
+            fmt[*len-1] = fmt[*len];
+            fmt[*len] = '\0';
+        }
+    }
+    else if (*len > 2)
+    {
+        /* -----
+         * replace an 'l' with a 'j'
+         * on 32 bit l is 32 bits and j is 64 bits
+         * on 64 bit l is 64 bits and j is 64 bits
+         * so we want the one that is the same on both
+         * we are not otherwise "fixing" the format for bad specifications
+         * just this ambiguous specification.
+         */
+        if (fmt[*len-2] == 'l')
+            fmt[*len-2] = 'j';
+    }
+    return;
+}
+
+void print_float_fixup ( char * fmt, size_t * len, size_t max )
+{
+    /* all the Unix flavors support a real printf
+     * Only Windows does it "wrong".
+     */
+    return;
+}
+
+void print_char_fixup ( char * fmt, size_t * len, size_t max )
+{
+    /* all the Unix flavors support a real printf
+     * Only Windows does it "wrong".
+     */
+    return;
+}
diff --git a/libs/klib/unpack.c b/libs/klib/unpack.c
new file mode 100644
index 0000000..16b34c9
--- /dev/null
+++ b/libs/klib/unpack.c
@@ -0,0 +1,833 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/pack.h>
+#include <klib/rc.h>
+#include <arch-impl.h>
+#include <sysalloc.h>
+
+#include <endian.h>
+#include <byteswap.h>
+#include <string.h>
+#include <assert.h>
+
+#if ! defined __LITTLE_ENDIAN && ! defined __BIG_ENDIAN
+#error "only little and big endian architectures are supported"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * unpack
+ */
+
+/* READ_PACKED
+ *  macro to read source elements into register
+ *  casts source pointer to appropriate type
+ *  performs byte swap if necessary to ensure that
+ *    elements are in reverse order
+ */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define READ_PACKED32( src, idx ) \
+    bswap_32 ( ( ( const uint32_t* ) ( src ) ) [ idx ] )
+#define READ_PACKED64( src, idx ) \
+    bswap_64 ( ( ( const uint64_t* ) ( src ) ) [ idx ] )
+#else
+#define READ_PACKED32( src, idx ) \
+    ( ( const uint32_t* ) ( src ) ) [ idx ]
+#define READ_PACKED64( src, idx ) \
+    ( ( const uint64_t* ) ( src ) ) [ idx ]
+#endif
+
+/* WRITE_UNPACKED
+ *  macro to write destination elements from register
+ *  casts destination pointer to appropriate type
+ *  performs byte swap if necessary to ensure that
+ *    elements are in original stream order
+ */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define WRITE_UNPACKED8( out, dst, idx ) \
+    ( ( uint64_t* ) ( dst ) ) [ idx ] = ( out )
+#else
+#define WRITE_UNPACKED8( out, dst, idx ) \
+    ( ( uint64_t* ) ( dst ) ) [ idx ] = bswap_64 ( out )
+#endif
+uint8_t unpack_8_from_2_arr[256][4]={
+{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,0,3},
+{0,0,1,0},{0,0,1,1},{0,0,1,2},{0,0,1,3},
+{0,0,2,0},{0,0,2,1},{0,0,2,2},{0,0,2,3},
+{0,0,3,0},{0,0,3,1},{0,0,3,2},{0,0,3,3},
+{0,1,0,0},{0,1,0,1},{0,1,0,2},{0,1,0,3},
+{0,1,1,0},{0,1,1,1},{0,1,1,2},{0,1,1,3},
+{0,1,2,0},{0,1,2,1},{0,1,2,2},{0,1,2,3},
+{0,1,3,0},{0,1,3,1},{0,1,3,2},{0,1,3,3},
+{0,2,0,0},{0,2,0,1},{0,2,0,2},{0,2,0,3},
+{0,2,1,0},{0,2,1,1},{0,2,1,2},{0,2,1,3},
+{0,2,2,0},{0,2,2,1},{0,2,2,2},{0,2,2,3},
+{0,2,3,0},{0,2,3,1},{0,2,3,2},{0,2,3,3},
+{0,3,0,0},{0,3,0,1},{0,3,0,2},{0,3,0,3},
+{0,3,1,0},{0,3,1,1},{0,3,1,2},{0,3,1,3},
+{0,3,2,0},{0,3,2,1},{0,3,2,2},{0,3,2,3},
+{0,3,3,0},{0,3,3,1},{0,3,3,2},{0,3,3,3},
+{1,0,0,0},{1,0,0,1},{1,0,0,2},{1,0,0,3},
+{1,0,1,0},{1,0,1,1},{1,0,1,2},{1,0,1,3},
+{1,0,2,0},{1,0,2,1},{1,0,2,2},{1,0,2,3},
+{1,0,3,0},{1,0,3,1},{1,0,3,2},{1,0,3,3},
+{1,1,0,0},{1,1,0,1},{1,1,0,2},{1,1,0,3},
+{1,1,1,0},{1,1,1,1},{1,1,1,2},{1,1,1,3},
+{1,1,2,0},{1,1,2,1},{1,1,2,2},{1,1,2,3},
+{1,1,3,0},{1,1,3,1},{1,1,3,2},{1,1,3,3},
+{1,2,0,0},{1,2,0,1},{1,2,0,2},{1,2,0,3},
+{1,2,1,0},{1,2,1,1},{1,2,1,2},{1,2,1,3},
+{1,2,2,0},{1,2,2,1},{1,2,2,2},{1,2,2,3},
+{1,2,3,0},{1,2,3,1},{1,2,3,2},{1,2,3,3},
+{1,3,0,0},{1,3,0,1},{1,3,0,2},{1,3,0,3},
+{1,3,1,0},{1,3,1,1},{1,3,1,2},{1,3,1,3},
+{1,3,2,0},{1,3,2,1},{1,3,2,2},{1,3,2,3},
+{1,3,3,0},{1,3,3,1},{1,3,3,2},{1,3,3,3},
+{2,0,0,0},{2,0,0,1},{2,0,0,2},{2,0,0,3},
+{2,0,1,0},{2,0,1,1},{2,0,1,2},{2,0,1,3},
+{2,0,2,0},{2,0,2,1},{2,0,2,2},{2,0,2,3},
+{2,0,3,0},{2,0,3,1},{2,0,3,2},{2,0,3,3},
+{2,1,0,0},{2,1,0,1},{2,1,0,2},{2,1,0,3},
+{2,1,1,0},{2,1,1,1},{2,1,1,2},{2,1,1,3},
+{2,1,2,0},{2,1,2,1},{2,1,2,2},{2,1,2,3},
+{2,1,3,0},{2,1,3,1},{2,1,3,2},{2,1,3,3},
+{2,2,0,0},{2,2,0,1},{2,2,0,2},{2,2,0,3},
+{2,2,1,0},{2,2,1,1},{2,2,1,2},{2,2,1,3},
+{2,2,2,0},{2,2,2,1},{2,2,2,2},{2,2,2,3},
+{2,2,3,0},{2,2,3,1},{2,2,3,2},{2,2,3,3},
+{2,3,0,0},{2,3,0,1},{2,3,0,2},{2,3,0,3},
+{2,3,1,0},{2,3,1,1},{2,3,1,2},{2,3,1,3},
+{2,3,2,0},{2,3,2,1},{2,3,2,2},{2,3,2,3},
+{2,3,3,0},{2,3,3,1},{2,3,3,2},{2,3,3,3},
+{3,0,0,0},{3,0,0,1},{3,0,0,2},{3,0,0,3},
+{3,0,1,0},{3,0,1,1},{3,0,1,2},{3,0,1,3},
+{3,0,2,0},{3,0,2,1},{3,0,2,2},{3,0,2,3},
+{3,0,3,0},{3,0,3,1},{3,0,3,2},{3,0,3,3},
+{3,1,0,0},{3,1,0,1},{3,1,0,2},{3,1,0,3},
+{3,1,1,0},{3,1,1,1},{3,1,1,2},{3,1,1,3},
+{3,1,2,0},{3,1,2,1},{3,1,2,2},{3,1,2,3},
+{3,1,3,0},{3,1,3,1},{3,1,3,2},{3,1,3,3},
+{3,2,0,0},{3,2,0,1},{3,2,0,2},{3,2,0,3},
+{3,2,1,0},{3,2,1,1},{3,2,1,2},{3,2,1,3},
+{3,2,2,0},{3,2,2,1},{3,2,2,2},{3,2,2,3},
+{3,2,3,0},{3,2,3,1},{3,2,3,2},{3,2,3,3},
+{3,3,0,0},{3,3,0,1},{3,3,0,2},{3,3,0,3},
+{3,3,1,0},{3,3,1,1},{3,3,1,2},{3,3,1,3},
+{3,3,2,0},{3,3,2,1},{3,3,2,2},{3,3,2,3},
+{3,3,3,0},{3,3,3,1},{3,3,3,2},{3,3,3,3},
+};
+uint8_t unpack_8_from_1_arr[256][8]={
+{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,1},{0,0,0,0,0,0,1,0},{0,0,0,0,0,0,1,1},
+{0,0,0,0,0,1,0,0},{0,0,0,0,0,1,0,1},{0,0,0,0,0,1,1,0},{0,0,0,0,0,1,1,1},
+{0,0,0,0,1,0,0,0},{0,0,0,0,1,0,0,1},{0,0,0,0,1,0,1,0},{0,0,0,0,1,0,1,1},
+{0,0,0,0,1,1,0,0},{0,0,0,0,1,1,0,1},{0,0,0,0,1,1,1,0},{0,0,0,0,1,1,1,1},
+{0,0,0,1,0,0,0,0},{0,0,0,1,0,0,0,1},{0,0,0,1,0,0,1,0},{0,0,0,1,0,0,1,1},
+{0,0,0,1,0,1,0,0},{0,0,0,1,0,1,0,1},{0,0,0,1,0,1,1,0},{0,0,0,1,0,1,1,1},
+{0,0,0,1,1,0,0,0},{0,0,0,1,1,0,0,1},{0,0,0,1,1,0,1,0},{0,0,0,1,1,0,1,1},
+{0,0,0,1,1,1,0,0},{0,0,0,1,1,1,0,1},{0,0,0,1,1,1,1,0},{0,0,0,1,1,1,1,1},
+{0,0,1,0,0,0,0,0},{0,0,1,0,0,0,0,1},{0,0,1,0,0,0,1,0},{0,0,1,0,0,0,1,1},
+{0,0,1,0,0,1,0,0},{0,0,1,0,0,1,0,1},{0,0,1,0,0,1,1,0},{0,0,1,0,0,1,1,1},
+{0,0,1,0,1,0,0,0},{0,0,1,0,1,0,0,1},{0,0,1,0,1,0,1,0},{0,0,1,0,1,0,1,1},
+{0,0,1,0,1,1,0,0},{0,0,1,0,1,1,0,1},{0,0,1,0,1,1,1,0},{0,0,1,0,1,1,1,1},
+{0,0,1,1,0,0,0,0},{0,0,1,1,0,0,0,1},{0,0,1,1,0,0,1,0},{0,0,1,1,0,0,1,1},
+{0,0,1,1,0,1,0,0},{0,0,1,1,0,1,0,1},{0,0,1,1,0,1,1,0},{0,0,1,1,0,1,1,1},
+{0,0,1,1,1,0,0,0},{0,0,1,1,1,0,0,1},{0,0,1,1,1,0,1,0},{0,0,1,1,1,0,1,1},
+{0,0,1,1,1,1,0,0},{0,0,1,1,1,1,0,1},{0,0,1,1,1,1,1,0},{0,0,1,1,1,1,1,1},
+{0,1,0,0,0,0,0,0},{0,1,0,0,0,0,0,1},{0,1,0,0,0,0,1,0},{0,1,0,0,0,0,1,1},
+{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,1},{0,1,0,0,0,1,1,0},{0,1,0,0,0,1,1,1},
+{0,1,0,0,1,0,0,0},{0,1,0,0,1,0,0,1},{0,1,0,0,1,0,1,0},{0,1,0,0,1,0,1,1},
+{0,1,0,0,1,1,0,0},{0,1,0,0,1,1,0,1},{0,1,0,0,1,1,1,0},{0,1,0,0,1,1,1,1},
+{0,1,0,1,0,0,0,0},{0,1,0,1,0,0,0,1},{0,1,0,1,0,0,1,0},{0,1,0,1,0,0,1,1},
+{0,1,0,1,0,1,0,0},{0,1,0,1,0,1,0,1},{0,1,0,1,0,1,1,0},{0,1,0,1,0,1,1,1},
+{0,1,0,1,1,0,0,0},{0,1,0,1,1,0,0,1},{0,1,0,1,1,0,1,0},{0,1,0,1,1,0,1,1},
+{0,1,0,1,1,1,0,0},{0,1,0,1,1,1,0,1},{0,1,0,1,1,1,1,0},{0,1,0,1,1,1,1,1},
+{0,1,1,0,0,0,0,0},{0,1,1,0,0,0,0,1},{0,1,1,0,0,0,1,0},{0,1,1,0,0,0,1,1},
+{0,1,1,0,0,1,0,0},{0,1,1,0,0,1,0,1},{0,1,1,0,0,1,1,0},{0,1,1,0,0,1,1,1},
+{0,1,1,0,1,0,0,0},{0,1,1,0,1,0,0,1},{0,1,1,0,1,0,1,0},{0,1,1,0,1,0,1,1},
+{0,1,1,0,1,1,0,0},{0,1,1,0,1,1,0,1},{0,1,1,0,1,1,1,0},{0,1,1,0,1,1,1,1},
+{0,1,1,1,0,0,0,0},{0,1,1,1,0,0,0,1},{0,1,1,1,0,0,1,0},{0,1,1,1,0,0,1,1},
+{0,1,1,1,0,1,0,0},{0,1,1,1,0,1,0,1},{0,1,1,1,0,1,1,0},{0,1,1,1,0,1,1,1},
+{0,1,1,1,1,0,0,0},{0,1,1,1,1,0,0,1},{0,1,1,1,1,0,1,0},{0,1,1,1,1,0,1,1},
+{0,1,1,1,1,1,0,0},{0,1,1,1,1,1,0,1},{0,1,1,1,1,1,1,0},{0,1,1,1,1,1,1,1},
+{1,0,0,0,0,0,0,0},{1,0,0,0,0,0,0,1},{1,0,0,0,0,0,1,0},{1,0,0,0,0,0,1,1},
+{1,0,0,0,0,1,0,0},{1,0,0,0,0,1,0,1},{1,0,0,0,0,1,1,0},{1,0,0,0,0,1,1,1},
+{1,0,0,0,1,0,0,0},{1,0,0,0,1,0,0,1},{1,0,0,0,1,0,1,0},{1,0,0,0,1,0,1,1},
+{1,0,0,0,1,1,0,0},{1,0,0,0,1,1,0,1},{1,0,0,0,1,1,1,0},{1,0,0,0,1,1,1,1},
+{1,0,0,1,0,0,0,0},{1,0,0,1,0,0,0,1},{1,0,0,1,0,0,1,0},{1,0,0,1,0,0,1,1},
+{1,0,0,1,0,1,0,0},{1,0,0,1,0,1,0,1},{1,0,0,1,0,1,1,0},{1,0,0,1,0,1,1,1},
+{1,0,0,1,1,0,0,0},{1,0,0,1,1,0,0,1},{1,0,0,1,1,0,1,0},{1,0,0,1,1,0,1,1},
+{1,0,0,1,1,1,0,0},{1,0,0,1,1,1,0,1},{1,0,0,1,1,1,1,0},{1,0,0,1,1,1,1,1},
+{1,0,1,0,0,0,0,0},{1,0,1,0,0,0,0,1},{1,0,1,0,0,0,1,0},{1,0,1,0,0,0,1,1},
+{1,0,1,0,0,1,0,0},{1,0,1,0,0,1,0,1},{1,0,1,0,0,1,1,0},{1,0,1,0,0,1,1,1},
+{1,0,1,0,1,0,0,0},{1,0,1,0,1,0,0,1},{1,0,1,0,1,0,1,0},{1,0,1,0,1,0,1,1},
+{1,0,1,0,1,1,0,0},{1,0,1,0,1,1,0,1},{1,0,1,0,1,1,1,0},{1,0,1,0,1,1,1,1},
+{1,0,1,1,0,0,0,0},{1,0,1,1,0,0,0,1},{1,0,1,1,0,0,1,0},{1,0,1,1,0,0,1,1},
+{1,0,1,1,0,1,0,0},{1,0,1,1,0,1,0,1},{1,0,1,1,0,1,1,0},{1,0,1,1,0,1,1,1},
+{1,0,1,1,1,0,0,0},{1,0,1,1,1,0,0,1},{1,0,1,1,1,0,1,0},{1,0,1,1,1,0,1,1},
+{1,0,1,1,1,1,0,0},{1,0,1,1,1,1,0,1},{1,0,1,1,1,1,1,0},{1,0,1,1,1,1,1,1},
+{1,1,0,0,0,0,0,0},{1,1,0,0,0,0,0,1},{1,1,0,0,0,0,1,0},{1,1,0,0,0,0,1,1},
+{1,1,0,0,0,1,0,0},{1,1,0,0,0,1,0,1},{1,1,0,0,0,1,1,0},{1,1,0,0,0,1,1,1},
+{1,1,0,0,1,0,0,0},{1,1,0,0,1,0,0,1},{1,1,0,0,1,0,1,0},{1,1,0,0,1,0,1,1},
+{1,1,0,0,1,1,0,0},{1,1,0,0,1,1,0,1},{1,1,0,0,1,1,1,0},{1,1,0,0,1,1,1,1},
+{1,1,0,1,0,0,0,0},{1,1,0,1,0,0,0,1},{1,1,0,1,0,0,1,0},{1,1,0,1,0,0,1,1},
+{1,1,0,1,0,1,0,0},{1,1,0,1,0,1,0,1},{1,1,0,1,0,1,1,0},{1,1,0,1,0,1,1,1},
+{1,1,0,1,1,0,0,0},{1,1,0,1,1,0,0,1},{1,1,0,1,1,0,1,0},{1,1,0,1,1,0,1,1},
+{1,1,0,1,1,1,0,0},{1,1,0,1,1,1,0,1},{1,1,0,1,1,1,1,0},{1,1,0,1,1,1,1,1},
+{1,1,1,0,0,0,0,0},{1,1,1,0,0,0,0,1},{1,1,1,0,0,0,1,0},{1,1,1,0,0,0,1,1},
+{1,1,1,0,0,1,0,0},{1,1,1,0,0,1,0,1},{1,1,1,0,0,1,1,0},{1,1,1,0,0,1,1,1},
+{1,1,1,0,1,0,0,0},{1,1,1,0,1,0,0,1},{1,1,1,0,1,0,1,0},{1,1,1,0,1,0,1,1},
+{1,1,1,0,1,1,0,0},{1,1,1,0,1,1,0,1},{1,1,1,0,1,1,1,0},{1,1,1,0,1,1,1,1},
+{1,1,1,1,0,0,0,0},{1,1,1,1,0,0,0,1},{1,1,1,1,0,0,1,0},{1,1,1,1,0,0,1,1},
+{1,1,1,1,0,1,0,0},{1,1,1,1,0,1,0,1},{1,1,1,1,0,1,1,0},{1,1,1,1,0,1,1,1},
+{1,1,1,1,1,0,0,0},{1,1,1,1,1,0,0,1},{1,1,1,1,1,0,1,0},{1,1,1,1,1,0,1,1},
+{1,1,1,1,1,1,0,0},{1,1,1,1,1,1,0,1},{1,1,1,1,1,1,1,0},{1,1,1,1,1,1,1,1},
+};
+
+static
+void CC Unpack8From2(uint8_t *dst,const uint8_t *src,int32_t count)
+{
+	if(count > 0){
+		int i;
+		for(i=0;i<count/4;i++,dst+=4,src++){
+			memmove(dst,unpack_8_from_2_arr[*src],4);
+		}
+		for(i=0;i< (count&3);i++){
+			dst[i] = unpack_8_from_2_arr[*src][i];
+		}
+	}
+}
+static
+void CC Unpack8From1(uint8_t *dst,const uint8_t *src,int32_t count)
+{
+	if(count > 0){
+		int i;
+		for(i=0;i<count/8;i++,dst+=8,src++){
+			memmove(dst,unpack_8_from_1_arr[*src],8);
+		}
+		for(i=0;i< (count&7);i++){
+			dst[i] = unpack_8_from_1_arr[*src][i];
+		}
+	}
+}
+
+
+
+
+/* Unpack8
+ */
+static
+void CC Unpack8 ( uint32_t packed, uint32_t count, void *dst,
+    const void *src, bitsz_t src_off, bitsz_t ssize )
+{
+    uint64_t acc;
+    uint64_t out;
+    uint32_t abits;
+    uint64_t src_mask;
+    /* keep track of trailing bits */
+    uint32_t discard = (uint32_t)( ( 0 - ( ssize += src_off ) ) & 7 );
+
+
+    if(src_off == 0){
+	switch(packed){
+	 case 1:
+		Unpack8From1(dst,src,count);
+		return;
+	 case 2:
+		Unpack8From2(dst,src,count);
+		return;
+	}
+    }
+	
+
+
+    /* convert to bytes */
+    ssize = ( ssize + 7 ) >> 3;
+
+    /* first, get any stray source bytes */
+    for ( abits = 0, acc = 0; ( ssize & 3 ) != 0; abits += 8 )
+    {
+        acc <<= 8;
+        acc |= ( ( const uint8_t* ) src ) [ -- ssize ];
+    }
+
+    /* only reading 4 bytes at a time now */
+    ssize >>= 2;
+
+    /* if source size was even multiple of 4 bytes */
+    if ( abits == 0 )
+    {
+        assert ( ssize != 0 );
+        acc = READ_PACKED32 ( src, -- ssize );
+        abits = 32;
+    }
+    /* bytes were accumulated in backward order */
+    else if ( abits != 8 )
+    {
+        acc = bswap_32 ( ( uint32_t ) ( acc << ( 32 - abits ) ) );
+    }
+
+    /* discard alignment bits */
+    if ( discard != 0 )
+    {
+        acc >>= discard;
+        abits -= discard;
+    }
+
+    /* create source mask */
+    src_mask = ( ( uint64_t ) 1U << packed ) - 1;
+
+    /* write stray output bytes */
+    for ( ; ( count & 7 ) != 0; abits -= packed, acc >>= packed )
+    {
+        /* make sure there are enough source bits */
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+
+        /* write directly to destination */
+        ( ( uint8_t* ) dst ) [ -- count ] = ( uint8_t ) ( acc & src_mask );
+    }
+
+    /* accumulate into unpack register */
+    for ( count >>= 3; count != 0; abits -= packed, acc >>= packed )
+    {
+        /* bring in enough source bits */
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+
+        /* get byte in reverse order */
+        out = acc & src_mask;
+
+        /* drop packed bits */
+        abits -= packed;
+        acc >>= packed;
+
+        /* same for remaining output bytes */
+        out <<= 8;
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+        out |= acc & src_mask;
+        abits -= packed;
+        acc >>= packed;
+
+        out <<= 8;
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+        out |= acc & src_mask;
+        abits -= packed;
+        acc >>= packed;
+
+        out <<= 8;
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+        out |= acc & src_mask;
+        abits -= packed;
+        acc >>= packed;
+
+        out <<= 8;
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+        out |= acc & src_mask;
+        abits -= packed;
+        acc >>= packed;
+
+        out <<= 8;
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+        out |= acc & src_mask;
+        abits -= packed;
+        acc >>= packed;
+
+        out <<= 8;
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+        out |= acc & src_mask;
+        abits -= packed;
+        acc >>= packed;
+
+        out <<= 8;
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+        out |= acc & src_mask;
+
+        /* write output */
+        WRITE_UNPACKED8 ( out, dst, -- count );
+    }
+
+    /* should have written everything */
+    assert ( abits == 0 );
+    assert ( ssize == 0 );
+}
+
+
+/* Unpack16
+ */
+static
+void CC Unpack16 ( uint32_t packed, uint32_t count, void *dst,
+    const void *src, bitsz_t src_off, bitsz_t ssize )
+{
+    uint64_t acc;
+    uint32_t abits;
+
+    uint64_t src_mask;
+    uint32_t discard = (uint32_t)( ( 0 - ( ssize += src_off ) ) & 7 );
+
+    /* convert to bytes */
+    ssize = ( ssize + 7 ) >> 3;
+
+    /* first, get any stray source bytes */
+    for ( abits = 0, acc = 0; ( ssize & 3 ) != 0; abits += 8 )
+    {
+        acc <<= 8;
+        acc |= ( ( const uint8_t* ) src ) [ -- ssize ];
+    }
+
+    /* only reading 4 bytes at a time now */
+    ssize >>= 2;
+
+    /* if source size was even multiple of 4 bytes */
+    if ( abits == 0 )
+    {
+        assert ( ssize != 0 );
+        acc = READ_PACKED32 ( src, -- ssize );
+        abits = 32;
+    }
+    /* bytes were accumulated in backward order */
+    else if ( abits != 8 )
+    {
+        acc = bswap_32 ( ( uint32_t ) ( acc << ( 32 - abits ) ) );
+    }
+
+
+    /* discard alignment bits */
+    if ( discard != 0 )
+    {
+        assert ( discard < 8 );
+        acc >>= discard;
+        abits -= discard;
+    }
+
+    /* create write mask */
+    src_mask = ( ( uint64_t ) 1U << packed ) - 1;
+
+    /* write output */
+    for ( ; count != 0; abits -= packed, acc >>= packed )
+    {
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+
+        ( ( uint16_t* ) dst ) [ -- count ] = ( uint16_t ) ( acc & src_mask );
+    }
+
+    /* should have written everything */
+    assert ( abits == 0 );
+    assert ( ssize == 0 );
+}
+
+
+/* Unpack32
+ */
+static
+void CC Unpack32 ( uint32_t packed, uint32_t count, void *dst,
+    const void *src, bitsz_t src_off, bitsz_t ssize )
+{
+    uint64_t acc;
+    uint32_t abits;
+
+    uint64_t src_mask;
+    uint32_t discard = (uint32_t)( ( 0 - ( ssize += src_off ) ) & 7 );
+
+    /* convert to bytes */
+    ssize = ( ssize + 7 ) >> 3;
+
+    /* first, get any stray source bytes */
+    for ( abits = 0, acc = 0; ( ssize & 3 ) != 0; abits += 8 )
+    {
+        acc <<= 8;
+        acc |= ( ( const uint8_t* ) src ) [ -- ssize ];
+    }
+
+    /* only reading 4 bytes at a time now */
+    ssize >>= 2;
+
+    /* if source size was even multiple of 4 bytes */
+    if ( abits == 0 )
+    {
+        assert ( ssize != 0 );
+        acc = READ_PACKED32 ( src, -- ssize );
+        abits = 32;
+    }
+    /* bytes were accumulated in backward order */
+    else if ( abits != 8 )
+    {
+        acc = bswap_32 ( ( uint32_t ) ( acc << ( 32 - abits ) ) );
+    }
+
+    /* discard alignment bits */
+    if ( discard != 0 )
+    {
+        assert ( discard < 8 );
+        acc >>= discard;
+        abits -= discard;
+    }
+
+    /* create write mask */
+    src_mask = ( ( uint64_t ) 1U << packed ) - 1;
+
+    /* write output */
+    for ( ; count != 0; abits -= packed, acc >>= packed )
+    {
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+
+        ( ( uint32_t* ) dst ) [ -- count ] = ( uint32_t ) ( acc & src_mask );
+    }
+
+    /* should have written everything */
+    assert ( abits == 0 );
+    assert ( ssize == 0 );
+}
+
+
+/* Unpack64a
+ *  packed size <= 32
+ */
+static
+void CC Unpack64a ( uint32_t packed, uint32_t count, void *dst,
+    const void *src, bitsz_t src_off, bitsz_t ssize )
+{
+    uint64_t acc;
+    uint32_t abits;
+
+    uint64_t src_mask;
+    uint32_t discard = (uint32_t)( ( 0 - ( ssize += src_off ) ) & 7 );
+
+    /* convert to bytes */
+    ssize = ( ssize + 7 ) >> 3;
+
+    /* first, get any stray source bytes */
+    for ( abits = 0, acc = 0; ( ssize & 3 ) != 0; abits += 8 )
+    {
+        acc <<= 8;
+        acc |= ( ( const uint8_t* ) src ) [ -- ssize ];
+    }
+
+    /* only reading 4 bytes at a time now */
+    ssize >>= 2;
+
+    /* if source size was even multiple of 4 bytes */
+    if ( abits == 0 )
+    {
+        assert ( ssize != 0 );
+        acc = READ_PACKED32 ( src, -- ssize );
+        abits = 32;
+    }
+    /* bytes were accumulated in backward order */
+    else if ( abits != 8 )
+    {
+        acc = bswap_32 ( ( uint32_t ) ( acc << ( 32 - abits ) ) );
+    }
+
+    /* discard alignment bits */
+    if ( discard != 0 )
+    {
+        assert ( discard < 8 );
+        acc >>= discard;
+        abits -= discard;
+    }
+
+    /* create write mask */
+    src_mask = ( ( uint64_t ) 1U << packed ) - 1;
+
+    /* write output */
+    for ( ; count != 0; abits -= packed, acc >>= packed )
+    {
+        if ( abits < packed )
+        {
+            assert ( ssize != 0 );
+            acc |= ( uint64_t ) READ_PACKED32 ( src, -- ssize ) << abits;
+            abits += 32;
+            assert ( abits >= packed );
+        }
+
+        ( ( uint64_t* ) dst ) [ -- count ] = acc & src_mask;
+    }
+
+    /* should have written everything */
+    assert ( abits == 0 );
+    assert ( ssize == 0 );
+}
+
+
+/* Unpack64b
+ *  packed size > 32
+ */
+static
+void CC Unpack64b ( uint32_t packed, uint32_t count, void *dst,
+    const void *src, bitsz_t src_off, bitsz_t ssize )
+{
+    uint128_t acc;
+    uint32_t abits;
+
+    uint64_t src_mask;
+    uint32_t discard = (uint32_t)( ( 0 - ( ssize += src_off ) ) & 7 );
+
+    /* convert to bytes */
+    ssize = ( ssize + 7 ) >> 3;
+
+    /* probably still don't support native 128 bit */
+    uint128_sethi ( & acc, 0 );
+    uint128_setlo ( & acc, 0 );
+
+    /* first, get any stray source bytes */
+    for ( abits = 0; ( ssize & 7 ) != 0; abits += 8 )
+    {
+        uint128_shl ( & acc, 8 );
+        uint128_orlo ( & acc, ( ( const uint8_t* ) src ) [ -- ssize ] );
+    }
+
+    /* only reading 8 bytes at a time now */
+    ssize >>= 3;
+
+    /* if source size was even multiple of 4 bytes */
+    if ( abits == 0 )
+    {
+        assert ( ssize != 0 );
+        uint128_setlo ( & acc, READ_PACKED64 ( src, -- ssize ) );
+        abits = 64;
+    }
+    /* bytes were accumulated in backward order */
+    else if ( abits != 8 )
+    {
+        uint128_setlo ( & acc, bswap_64 ( uint128_lo ( & acc ) << ( 64 - abits ) ) );
+    }
+
+    /* discard alignment bits */
+    if ( discard != 0 )
+    {
+        assert ( discard < 8 );
+        uint128_shr ( & acc, discard );
+        abits -= discard;
+    }
+
+    /* create write mask */
+    src_mask = ( ( uint64_t ) 1U << packed ) - 1;
+
+    /* write output */
+    for ( ; count != 0; abits -= packed, uint128_shr ( & acc, packed ) )
+    {
+        if ( abits < packed )
+        {
+            uint128_t in;
+            assert ( ssize != 0 );
+            uint128_sethi ( & in, 0 );
+            uint128_setlo ( & in, READ_PACKED64 ( src, -- ssize ) );
+            uint128_shl ( & in, abits );
+            uint128_or ( & acc, & in );
+            abits += 64;
+            assert ( abits >= packed );
+        }
+
+        ( ( uint64_t* ) dst ) [ -- count ] = uint128_lo ( & acc ) & src_mask;
+    }
+
+    /* should have written everything */
+    assert ( abits == 0 );
+    assert ( ssize == 0 );
+}
+
+
+/* Unpack
+ *  accepts a series of packed source bits
+ *  produces a series of unpacked destination bits by left-padding zeros
+ *
+ *  "packed" [ IN ] - packed element size in bits
+ *
+ *  "unpacked [ IN ] - original element size in bits
+ *  must be >= "packed" and
+ *  must be in 2^^[3..6], i.e. { 8, 16, 32, 64 }
+ *
+ *  "src" [ IN ] and "src_off" [ IN ] - source buffer
+ *  bit address
+ *
+ *  "ssize" [ IN ] - number of bits in "src", not including "src_off"
+ *
+ *  "consumed" [ OUT, NULL OKAY ] - number of source bits
+ *  consumed. if NULL, then all source bits MUST be consumed
+ *  or an error will be generated.
+ *
+ *  "dst" [ OUT ] and "dsize" [ IN ] - destination buffer
+ *  where size is given in bytes
+ *
+ *  "usize" [ OUT ] - resultant unpacked size in bytes
+ *
+ * NB - "src" and "dst" may have same address since
+ *  the implementation unpacks from right to left, smaller to larger
+ */
+LIB_EXPORT rc_t CC Unpack ( uint32_t packed, uint32_t unpacked,
+    const void *src, bitsz_t src_off, bitsz_t ssize, bitsz_t *consumed,
+    void *dst, size_t dsize, size_t *usize )
+{
+    uint32_t count;
+
+    /* prepare for failure */
+    if ( consumed != NULL )
+        * consumed = 0;
+
+    /* validate output param */
+    if ( usize == NULL )
+        return RC ( rcXF, rcBuffer, rcUnpacking, rcParam, rcNull );
+    * usize = 0;
+
+    /* require power of 2 with value between 8 and 64 */
+    if ( ( ( unpacked - 1 ) & unpacked ) != 0 ||
+         unpacked < 8 || unpacked > 64 )
+        return RC ( rcXF, rcBuffer, rcUnpacking, rcParam, rcInvalid );
+
+    /* validate remaining params */
+    if ( unpacked < packed || packed == 0 )
+        return RC ( rcXF, rcBuffer, rcUnpacking, rcParam, rcInvalid );
+
+    if ( ssize == 0 )
+        return 0;
+
+    if ( src == NULL )
+        return RC ( rcXF, rcBuffer, rcUnpacking, rcParam, rcNull );
+
+    src = & ( ( const char* ) src ) [ src_off >> 3 ];
+    src_off &= 7;
+
+    /* required destination buffer size */
+    count = ( uint32_t ) ( ssize / packed );
+    if ( count == 0 )
+        return 0;
+    * usize = ( (size_t)count * unpacked ) >> 3;
+
+    if ( dsize < * usize )
+    {
+        if ( consumed == NULL )
+            return RC ( rcXF, rcBuffer, rcUnpacking, rcBuffer, rcInsufficient );
+
+        count = (uint32_t)( dsize / ( unpacked >> 3 ) );
+        ssize = (size_t)count * packed;
+        * usize = ( (size_t)count * unpacked ) >> 3;
+    }
+
+    if ( dst == NULL )
+    {
+        * usize = 0;
+        return RC ( rcXF, rcBuffer, rcUnpacking, rcParam, rcNull );
+    }
+
+    /* all parameters are validated */
+    if ( unpacked == 8 && packed == 8 && src_off == 0 )
+    {
+        if ( ( const void* ) dst != src )
+            memmove ( dst, src, ssize >> 3 );
+        return 0;
+    }
+
+    /* TBD - enable unpacking from offsets */
+    if ( src_off != 0 )
+        return RC ( rcXF, rcBuffer, rcUnpacking, rcOffset, rcUnsupported );
+
+    switch ( unpacked )
+    {
+    case 8:
+        Unpack8 ( packed, count, dst, src, src_off, ssize );
+        break;
+    case 16:
+        Unpack16 ( packed, count, dst, src, src_off, ssize );
+        break;
+    case 32:
+        Unpack32 ( packed, count, dst, src, src_off, ssize );
+        break;
+    case 64:
+        if ( packed > 32 )
+            Unpack64b ( packed, count, dst, src, src_off, ssize );
+        else
+            Unpack64a ( packed, count, dst, src, src_off, ssize );
+        break;
+    }
+
+    return 0;
+}
diff --git a/libs/klib/utf8.c b/libs/klib/utf8.c
new file mode 100644
index 0000000..095863e
--- /dev/null
+++ b/libs/klib/utf8.c
@@ -0,0 +1,1355 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/text.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+#include <wctype.h>
+
+/*--------------------------------------------------------------------------
+ * raw text strings
+ */
+
+/* string_len
+ *  length of string in characters
+ */
+LIB_EXPORT uint32_t CC string_len ( const char * str, size_t size )
+{
+    uint32_t len = 0;
+
+    if ( str != NULL )
+    {
+        size_t i;
+        for ( i = 0;; ++ len )
+        {
+            int c;
+            size_t start;
+
+            /* scan all ASCII characters */
+            for ( start = i; i < size && str [ i ] > 0; ++ i )
+                ( void ) 0;
+            len += ( uint32_t ) ( i - start );
+            if ( i >= size )
+                break;
+
+            /* handle a single UTF-8 character */
+            c = ~ ( int ) str [ i ];
+            if ( str [ i ] == 0 )
+                break;
+
+            /* str [ i ] was < 0 */
+            assert ( c > 0 && c <= 0x7F );
+
+            /* if original code was 0b10xxxxxx, illegal */
+            if ( c >= 0x40 )
+                break;
+	
+            /* original code 0b110xxxxx = 2 byte */
+            if ( c >= 0x20 )
+                i += 2;
+            /* original code 0b1110xxxx = 3 byte */
+            else if ( c >= 0x10 )
+                i += 3;
+            /* original code 0b11110xxx = 4 byte */
+            else if ( c >= 0x08 )
+                i += 4;
+            /* original code 0b111110xx = 5 byte */
+            else if ( c >= 0x04 )
+                i += 5;
+            /* original code 0b1111110x = 6 byte */
+            else if ( c >= 0x02 )
+                i += 6;
+            /* illegal code 0b1111111x */
+            else
+                break;
+	    }
+    }
+
+    return len;
+}
+
+/* string_measure
+ *  measures length of string in both characters and bytes
+ */
+LIB_EXPORT uint32_t CC string_measure ( const char * str, size_t * size )
+{
+    size_t i = 0;
+    uint32_t len = 0;
+
+    if ( str != NULL )
+    {
+        for ( ;; ++ len )
+        {
+            int c;
+            size_t start;
+
+            /* scan all ASCII characters */
+            for ( start = i; str [ i ] > 0; ++ i )
+                ( void ) 0;
+
+            /* the character that stopped scan */
+            c = ~ ( int ) str [ i ];
+
+            /* the number of characters */
+            len += ( uint32_t ) ( i - start );
+
+            /* handle a single UTF-8 character */
+            if ( str [ i ] == 0 )
+                break;
+
+            /* str [ i ] was < 0 */
+            assert ( c > 0 && c <= 0x7F );
+
+            /* if original code was 0b10xxxxxx, illegal */
+            if ( c >= 0x40 )
+                break;
+	
+            /* original code 0b110xxxxx = 2 byte */
+            if ( c >= 0x20 )
+                i += 2;
+            /* original code 0b1110xxxx = 3 byte */
+            else if ( c >= 0x10 )
+                i += 3;
+            /* original code 0b11110xxx = 4 byte */
+            else if ( c >= 0x08 )
+                i += 4;
+            /* original code 0b111110xx = 5 byte */
+            else if ( c >= 0x04 )
+                i += 5;
+            /* original code 0b1111110x = 6 byte */
+            else if ( c >= 0x02 )
+                i += 6;
+            /* illegal code 0b1111111x */
+            else
+                break;
+	    }
+    }
+
+    if ( size != NULL )
+        * size = i;
+
+    return len;
+}
+
+/* string_copy
+ *  copies whole character text into a buffer
+ *  terminates with null byte if possible
+ *  returns the number of bytes copied
+ */
+LIB_EXPORT size_t CC string_copy ( char *dst, size_t dst_size, const char *src, size_t src_size )
+{
+    size_t i;
+    char * dend;
+    const char * send;
+
+    if ( dst == NULL || src == NULL )
+        return 0;
+
+    if ( dst_size < src_size )
+        src_size = dst_size;
+
+    dend = dst + dst_size;
+    send = src + src_size;
+
+    for ( i = 0; i < src_size; )
+    {
+        uint32_t ch;
+        int len1, len2;
+
+        /* optimistic copy of ASCII data */
+        for ( ; i < src_size && src [ i ] > 0; ++ i )
+            dst [ i ] = src [ i ];
+        if ( i == src_size )
+            break;
+
+        /* read a ( hopefully complete ) UNICODE character ( detect NUL ) */
+        len1 = utf8_utf32 ( & ch, & src [ i ], send );
+        if ( len1 <= 0 || ch == 0 )
+            break;
+
+        /* write the UNICODE character in UTF-8 */
+        len2 = utf32_utf8 ( & dst [ i ], dend, ch );
+        if ( len2 <= 0 )
+            break;
+
+        /* should have been identical number of bytes */
+        if ( len1 != len2 )
+            break;
+
+        /* advance over the UTF-8 character */
+        i += len1;
+    }
+
+    if ( i < dst_size )
+        dst [ i ] = 0;
+
+    return i;
+}
+
+LIB_EXPORT size_t CC old_string_copy ( char *dst, size_t dst_size, const char *src, size_t src_size )
+{
+    const char *send;
+    char *dend, *begin;
+
+    assert ( dst != NULL && src != NULL );
+
+    if ( dst_size < src_size )
+        src_size = dst_size;
+
+    begin = dst;
+    dend = dst + dst_size;
+    send = src + src_size;
+
+    while ( src < send )
+    {
+        uint32_t ch;
+
+        /* get a complete source character */
+        int len = utf8_utf32 ( & ch, src, send );
+        if ( len <= 0 )
+            break;
+        src += len;
+
+        /* write it to the destination */
+        len = utf32_utf8 ( dst, dend, ch );
+        if ( len <= 0 )
+            break;
+        dst += len;
+    }
+
+    if ( dst < dend )
+        * dst = 0;
+
+    return ( size_t ) ( dst - begin );
+}
+
+
+/* string_copy_measure
+ *  copies whole character text into a buffer
+ *  terminates with null byte if possible
+ *  returns the number of bytes copied
+ */
+LIB_EXPORT size_t CC string_copy_measure ( char *dst, size_t dst_size, const char *src )
+{
+    size_t i;
+    char * dend;
+
+    if ( dst == NULL || src == NULL )
+        return 0;
+
+    dend = dst + dst_size;
+
+    for ( i = 0;; )
+    {
+        uint32_t ch;
+        int len1, len2;
+
+        /* optimistic copy of ASCII data ( NUL terminated ) */
+        for ( ; i < dst_size && src [ i ] > 0; ++ i )
+            dst [ i ] = src [ i ];
+        if ( i == dst_size || src [ i ] == 0 )
+            break;
+
+        /* read a ( hopefully complete ) UNICODE character */
+        len1 = utf8_utf32 ( & ch, & src [ i ], & src [ i + 6 ] );
+        if ( len1 <= 0 )
+            break;
+
+        /* write the UNICODE character in UTF-8 */
+        len2 = utf32_utf8 ( & dst [ i ], dend, ch );
+        if ( len2 <= 0 )
+            break;
+
+        /* should have been identical number of bytes */
+        if ( len1 != len2 )
+            break;
+
+        /* advance over the UTF-8 character */
+        i += len1;
+    }
+
+    if ( i < dst_size )
+        dst [ i ] = 0;
+
+    return i;
+}
+
+LIB_EXPORT size_t CC old_string_copy_measure ( char *dst, size_t dst_size, const char *src )
+{
+    char *dend, *begin;
+
+    assert ( dst != NULL && src != NULL );
+
+    begin = dst;
+    dend = dst + dst_size;
+
+    while ( dst < dend && src [ 0 ] != 0 )
+    {
+        uint32_t ch;
+
+        /* get a complete source character */
+        int len = utf8_utf32 ( & ch, src, src + 6 );
+        if ( len <= 0 )
+            break;
+        src += len;
+
+        /* write it to the destination */
+        len = utf32_utf8 ( dst, dend, ch );
+        if ( len <= 0 )
+            break;
+        dst += len;
+    }
+
+    if ( dst < dend )
+        * dst = 0;
+
+    return ( size_t ) ( dst - begin );
+}
+
+/* tolower_copy
+ *  copies whole character text in lower-case
+ *  terminates with null byte if possible
+ *  returns the number of bytes copied
+ */
+LIB_EXPORT size_t CC tolower_copy ( char *dst, size_t dst_size, const char *src, size_t src_size )
+{
+    size_t i;
+    char * dend;
+    const char * send;
+
+    if ( dst == NULL || src == NULL )
+        return 0;
+
+    if ( dst_size < src_size )
+        src_size = dst_size;
+
+    dend = dst + dst_size;
+    send = src + src_size;
+
+    for ( i = 0; i < src_size; )
+    {
+        uint32_t ch;
+        int len1, len2;
+
+        /* optimistic copy of ASCII data */
+        for ( ; i < src_size && src [ i ] > 0; ++ i )
+            dst [ i ] = ( char ) tolower ( src [ i ] );
+        if ( i == src_size )
+            break;
+
+        /* read a ( hopefully complete ) UNICODE character ( detect NUL ) */
+        len1 = utf8_utf32 ( & ch, & src [ i ], send );
+        if ( len1 <= 0 || ch == 0 )
+            break;
+
+        /* lower case it */
+        ch = towlower ( ( wint_t ) ch );
+
+        /* write the UNICODE character in UTF-8 */
+        len2 = utf32_utf8 ( & dst [ i ], dend, ch );
+        if ( len2 <= 0 )
+            break;
+
+        /* should have been identical number of bytes */
+        if ( len1 != len2 )
+            break;
+
+        /* advance over the UTF-8 character */
+        i += len1;
+    }
+
+    if ( i < dst_size )
+        dst [ i ] = 0;
+
+    return i;
+}
+
+
+LIB_EXPORT size_t CC old_tolower_copy ( char *dst, size_t dst_size, const char *src, size_t src_size )
+{
+    const char *send;
+    char *dend, *begin;
+
+    assert ( dst != NULL && src != NULL );
+
+    if ( dst_size < src_size )
+        src_size = dst_size;
+
+    begin = dst;
+    dend = dst + dst_size;
+    send = src + src_size;
+
+    while ( src < send )
+    {
+        uint32_t ch;
+
+        /* get a complete source character */
+        int len = utf8_utf32 ( & ch, src, send );
+        if ( len <= 0 )
+            break;
+        src += len;
+
+        /* lower case it */
+        ch = towlower ( ( wint_t ) ch );
+
+        /* write it to the destination */
+        len = utf32_utf8 ( dst, dend, ch );
+        if ( len <= 0 )
+            break;
+        dst += len;
+    }
+
+    if ( dst < dend )
+        * dst = 0;
+
+    return ( size_t ) ( dst - begin );
+}
+
+
+/* toupper_copy
+ *  copies whole character text in upper-case
+ *  terminates with null byte if possible
+ *  returns the number of bytes copied
+ */
+LIB_EXPORT size_t CC toupper_copy ( char *dst, size_t dst_size, const char *src, size_t src_size )
+{
+    size_t i;
+    char * dend;
+    const char * send;
+
+    if ( dst == NULL || src == NULL )
+        return 0;
+
+    if ( dst_size < src_size )
+        src_size = dst_size;
+
+    dend = dst + dst_size;
+    send = src + src_size;
+
+    for ( i = 0; i < src_size; )
+    {
+        uint32_t ch;
+        int len1, len2;
+
+        /* optimistic copy of ASCII data */
+        for ( ; i < src_size && src [ i ] > 0; ++ i )
+            dst [ i ] = ( char ) toupper ( src [ i ] );
+        if ( i == src_size )
+            break;
+
+        /* read a ( hopefully complete ) UNICODE character ( detect NUL ) */
+        len1 = utf8_utf32 ( & ch, & src [ i ], send );
+        if ( len1 <= 0 || ch == 0 )
+            break;
+
+        /* upper case it */
+        ch = towupper ( ( wint_t ) ch );
+
+        /* write the UNICODE character in UTF-8 */
+        len2 = utf32_utf8 ( & dst [ i ], dend, ch );
+        if ( len2 <= 0 )
+            break;
+
+        /* should have been identical number of bytes */
+        if ( len1 != len2 )
+            break;
+
+        /* advance over the UTF-8 character */
+        i += len1;
+    }
+
+    if ( i < dst_size )
+        dst [ i ] = 0;
+
+    return i;
+}
+
+LIB_EXPORT size_t CC old_toupper_copy ( char *dst, size_t dst_size, const char *src, size_t src_size )
+{
+    const char *send;
+    char *dend, *begin;
+
+    assert ( dst != NULL && src != NULL );
+
+    if ( dst_size < src_size )
+        src_size = dst_size;
+
+    begin = dst;
+    dend = dst + dst_size;
+    send = src + src_size;
+
+    while ( src < send )
+    {
+        uint32_t ch;
+
+        /* get a complete source character */
+        int len = utf8_utf32 ( & ch, src, send );
+        if ( len <= 0 )
+            break;
+        src += len;
+
+        /* upper case it */
+        ch = towupper ( ( wint_t ) ch );
+
+        /* write it to the destination */
+        len = utf32_utf8 ( dst, dend, ch );
+        if ( len <= 0 )
+            break;
+        dst += len;
+    }
+
+    if ( dst < dend )
+        * dst = 0;
+
+    return ( size_t ) ( dst - begin );
+}
+
+/* string_cmp
+ *  performs a safe strncmp
+ *
+ *  "max_chars" limits the extent of the comparison
+ *  to not exceed supplied value, i.e. the number of
+ *  characters actually compared will be the minimum
+ *  of asize, bsize and max_chars.
+ *
+ *  if either string size ( or both ) < max_chars and
+ *  all compared characters match, then the result will
+ *  be a comparison of asize against bsize.
+ */
+LIB_EXPORT int CC string_cmp ( const char *a, size_t asize,
+    const char *b, size_t bsize, uint32_t max_chars )
+{
+    size_t i, sz;
+    uint32_t num_chars;
+    const char *aend, *bend;
+
+    if ( max_chars == 0 )
+        return 0;
+
+    if ( b == NULL )
+        return a != NULL;
+    if ( a == NULL )
+        return -1;
+
+    sz = asize;
+    if ( asize > bsize )
+        sz = bsize;
+
+    aend = a + asize;
+    bend = b + bsize;
+    num_chars = 0;
+
+    for ( i = 0; i < sz; )
+    {
+        int len1, len2;
+        uint32_t ach, bch;
+
+        /* loop to process ASCII characters */
+        for ( ; i < sz; ++ i )
+        {
+            /* detect UTF-8 character */
+            if ( a [ i ] < 0 || b [ i ] < 0 )
+                break;
+
+            /* detect different or NUL character */
+            if ( a [ i ] != b [ i ] || a [ i ] == 0 )
+                return a [ i ] - b [ i ];
+
+            /* if char count is sufficient, we're done */
+            if ( ++ num_chars == max_chars )
+                return 0;
+        }
+
+        /* read a character from a */
+        len1 = utf8_utf32 ( & ach, & a [ i ], aend );
+        if ( len1 <= 0 )
+        {
+            asize = i;
+
+            len2 = utf8_utf32 ( & bch, & b [ i ], bend );
+            if ( len2 <= 0 )
+                bsize = i;
+
+            break;
+        }
+
+        /* read a character from b */
+        len2 = utf8_utf32 ( & bch, & b [ i ], bend );
+        if ( len2 <= 0 )
+        {
+            bsize = i;
+            break;
+        }
+
+        /* compare characters */
+        if ( ach != bch )
+        {
+            if ( ach < bch )
+                return -1;
+            return 1;
+        }
+
+        /* if char count is sufficient, we're done */
+        if ( ++ num_chars == max_chars )
+            return 0;
+
+        /* adjust the pointers */
+        if ( len1 == len2 )
+            i += len1;
+        else
+        {
+            sz -= i;
+            a += i + len1;
+            b += i + len2;
+            i = 0;
+        }
+    }
+
+    /* one or both reached end < max_chars */
+    if ( asize < bsize )
+        return -1;
+
+    return asize > bsize;
+}
+
+LIB_EXPORT int CC old_string_cmp ( const char *a, size_t asize,
+    const char *b, size_t bsize, uint32_t max_chars )
+{
+    uint32_t num_chars;
+    const char *aend, *bend;
+
+    assert ( a != NULL && b != NULL );
+
+    if ( max_chars == 0 )
+        return 0;
+
+    aend = a + asize;
+    bend = b + bsize;
+    num_chars = 0;
+
+    while ( a < aend && b < bend )
+    {
+        uint32_t ach, bch;
+
+        /* read a character from a */
+        int len = utf8_utf32 ( & ach, a, aend );
+        if ( len <= 0 )
+        {
+            asize -= ( size_t ) ( aend - a );
+            break;
+        }
+        a += len;
+
+        /* read a character from b */
+        len = utf8_utf32 ( & bch, b, bend );
+        if ( len <= 0 )
+        {
+            bsize -= ( size_t ) ( bend - b );
+            break;
+        }
+        b += len;
+
+        /* compare characters */
+        if ( ach != bch )
+        {
+            if ( ach < bch )
+                return -1;
+            return 1;
+        }
+
+        /* if char count is sufficient, we're done */
+        if ( ++ num_chars == max_chars )
+            return 0;
+    }
+
+    /* one or both reached end < max_chars */
+    if ( asize < bsize )
+        return -1;
+    return asize > bsize;
+}
+
+/* strcase_cmp
+ *  like string_cmp except case insensitive
+ */
+LIB_EXPORT int CC strcase_cmp ( const char *a, size_t asize,
+    const char *b, size_t bsize, uint32_t max_chars )
+{
+    size_t i, sz;
+    uint32_t num_chars;
+    const char *aend, *bend;
+
+    if ( max_chars == 0 )
+        return 0;
+
+    if ( b == NULL )
+        return a != NULL;
+    if ( a == NULL )
+        return -1;
+
+    sz = asize;
+    if ( asize > bsize )
+        sz = bsize;
+
+    aend = a + asize;
+    bend = b + bsize;
+    num_chars = 0;
+
+    for ( i = 0; i < sz; )
+    {
+        int len1, len2;
+        uint32_t ach, bch;
+
+        /* loop to process ASCII characters */
+        for ( ; i < sz; ++ i )
+        {
+            /* detect UTF-8 character */
+            if ( a [ i ] < 0 || b [ i ] < 0 )
+                break;
+
+            /* detect different or NUL character */
+            if ( a [ i ] != b [ i ] || a [ i ] == 0 )
+            {
+                ach = tolower ( a [ i ] );
+                bch = tolower ( b [ i ] );
+                if ( ach != bch || ach == 0 )
+                    return ach - bch;
+            }
+
+            /* if char count is sufficient, we're done */
+            if ( ++ num_chars == max_chars )
+                return 0;
+        }
+
+        /* read a character from a */
+        len1 = utf8_utf32 ( & ach, & a [ i ], aend );
+        if ( len1 <= 0 )
+        {
+            asize = i;
+
+            len2 = utf8_utf32 ( & bch, & b [ i ], bend );
+            if ( len2 <= 0 )
+                bsize = i;
+
+            break;
+        }
+
+        /* read a character from b */
+        len2 = utf8_utf32 ( & bch, & b [ i ], bend );
+        if ( len2 <= 0 )
+        {
+            bsize = i;
+            break;
+        }
+
+        /* compare characters */
+        if ( ach != bch )
+        {
+            /* only go lower case if they differ */
+            ach = towlower ( ( wint_t ) ach );
+            bch = towlower ( ( wint_t ) bch );
+
+            if ( ach != bch )
+            {
+                if ( ach < bch )
+                    return -1;
+                return 1;
+            }
+        }
+
+        /* if char count is sufficient, we're done */
+        if ( ++ num_chars == max_chars )
+            return 0;
+
+        /* adjust the pointers */
+        if ( len1 == len2 )
+            i += len1;
+        else
+        {
+            sz -= i;
+            a += i + len1;
+            b += i + len2;
+            i = 0;
+        }
+    }
+
+    /* one or both reached end < max_chars */
+    if ( asize < bsize )
+        return -1;
+    return asize > bsize;
+}
+
+LIB_EXPORT int CC old_strcase_cmp ( const char *a, size_t asize,
+    const char *b, size_t bsize, uint32_t max_chars )
+{
+    uint32_t num_chars;
+    const char *aend, *bend;
+
+    assert ( a != NULL && b != NULL );
+
+    if ( max_chars == 0 )
+        return 0;
+
+    aend = a + asize;
+    bend = b + bsize;
+    num_chars = 0;
+
+    while ( a < aend && b < bend )
+    {
+        uint32_t ach, bch;
+
+        /* read a character from a */
+        int len = utf8_utf32 ( & ach, a, aend );
+        if ( len <= 0 )
+        {
+            asize -= ( size_t ) ( aend - a );
+            break;
+        }
+        a += len;
+
+        /* read a character from b */
+        len = utf8_utf32 ( & bch, b, bend );
+        if ( len <= 0 )
+        {
+            bsize -= ( size_t ) ( bend - b );
+            break;
+        }
+        b += len;
+
+        /* compare characters with case */
+        if ( ach != bch )
+        {
+            /* only go lower case if they differ */
+            ach = towlower ( ( wint_t ) ach );
+            bch = towlower ( ( wint_t ) bch );
+
+            if ( ach != bch )
+            {
+                if ( ach < bch )
+                    return -1;
+                return 1;
+            }
+        }
+
+        /* if char count is sufficient, we're done */
+        if ( ++ num_chars == max_chars )
+            return 0;
+    }
+
+    /* one or both reached end < max_chars */
+    if ( asize < bsize )
+        return -1;
+    return asize > bsize;
+}
+
+/* string_match
+ *  returns the number of matching characters
+ *
+ *  "max_chars" limits the extent of the comparison
+ *  to not exceed supplied value, i.e. the number of
+ *  characters actually compared will be the minimum
+ *  of asize, bsize and max_chars.
+ *
+ *  "msize" will be set to the size of the matched string
+ *  if not NULL
+ */
+LIB_EXPORT uint32_t CC string_match ( const char *a_orig, size_t asize,
+    const char *b, size_t bsize, uint32_t max_chars, size_t *msize )
+{
+    uint32_t i;
+    const char *a, *aend, *bend;
+
+    assert ( a_orig != NULL && b != NULL );
+
+    a = a_orig;
+    aend = a_orig + asize;
+    bend = b + bsize;
+
+    for ( i = 0; i < max_chars && a < aend && b < bend; ++ i )
+    {
+        int lena, lenb;
+        uint32_t ach, bch;
+
+        /* read a character from a */
+        lena = utf8_utf32 ( & ach, a, aend );
+        if ( lena <= 0 )
+            break;
+
+        /* read a character from b */
+        lenb = utf8_utf32 ( & bch, b, bend );
+        if ( lenb <= 0 )
+            break;
+
+        /* compare characters */
+        if ( ach != bch )
+            break;
+
+        a += lena;
+        b += lenb;
+    }
+
+    if ( msize != NULL )
+        * msize = ( size_t ) ( a - a_orig );
+    return i;
+}
+
+/* strcase_match
+ *  like string_match except case insensitive
+ */
+LIB_EXPORT uint32_t CC strcase_match ( const char *a_orig, size_t asize,
+    const char *b, size_t bsize, uint32_t max_chars, size_t *msize )
+{
+    uint32_t i;
+    const char *a, *aend, *bend;
+
+    assert ( a_orig != NULL && b != NULL );
+
+    a = a_orig;
+    aend = a_orig + asize;
+    bend = b + bsize;
+
+    for ( i = 0; i < max_chars && a < aend && b < bend; ++ i )
+    {
+        int lena, lenb;
+        uint32_t ach, bch;
+
+        /* read a character from a */
+        lena = utf8_utf32 ( & ach, a, aend );
+        if ( lena <= 0 )
+            break;
+
+        /* read a character from b */
+        lenb = utf8_utf32 ( & bch, b, bend );
+        if ( lenb <= 0 )
+            break;
+
+        /* compare characters */
+        if ( ach != bch )
+        {
+            /* only go lower case if they differ */
+            ach = towlower ( ( wint_t ) ach );
+            bch = towlower ( ( wint_t ) bch );
+
+            if ( ach != bch )
+                break;
+        }
+
+        a += lena;
+        b += lenb;
+    }
+
+    if ( msize != NULL )
+        * msize = ( size_t ) ( a - a_orig );
+    return i;
+}
+
+/* string_chr
+ *  performs a safe strchr
+ *  "ch" is in UTF32
+ */
+LIB_EXPORT char * CC string_chr ( const char *str, size_t size, uint32_t ch )
+{
+    size_t i;
+
+    if ( str == NULL || size == 0 )
+        return NULL;
+
+    if ( ch < 128 )
+    {
+        /* looking for an ASCII character */
+        for ( i = 0; i < size; ++ i )
+        {
+            /* perform direct ASCII match */
+            if ( str [ i ] == ( char ) ch )
+                return ( char * ) & str [ i ];
+        }
+    }
+    else
+    {
+        int len;
+        uint32_t c;
+        const char *end = str + size;
+
+        for ( i = 0; i < size; )
+        {
+            /* skip over ASCII */
+            for ( ; i < size && str [ i ] > 0; ++ i )
+                ( void ) 0;
+            if ( i == size )
+                break;
+
+            /* read UTF-8 */
+            len = utf8_utf32 ( & c, & str [ i ], end );
+            if ( len <= 0 )
+                break;
+            if ( c == ch )
+                return ( char* ) & str [ i ];
+            i += len;
+        }
+    }
+    return NULL;
+}
+
+LIB_EXPORT char * CC old_string_chr ( const char *str, size_t size, uint32_t ch )
+{
+    const char *end;
+
+    if ( str == NULL )
+        return NULL;
+
+    end = str + size;
+    while ( str < end )
+    {
+        uint32_t c;
+        int len = utf8_utf32 ( & c, str, end );
+        if ( len <= 0 )
+            break;
+        if ( c == ch )
+            return ( char* ) str;
+        str += len;
+    }
+    return NULL;
+}
+
+/* string_rchr
+ *  performs a safe strrchr
+ */
+LIB_EXPORT char * CC string_rchr ( const char *str, size_t size, uint32_t ch )
+{
+    int64_t i;
+
+    if ( str == NULL || size == 0 )
+        return NULL;
+
+    if ( ch < 128 )
+    {
+        /* looking for an ASCII character */
+        for ( i = ( int64_t ) size - 1; i >= 0; -- i )
+        {
+            /* perform direct ASCII match */
+            if ( str [ i ] == ( char ) ch )
+                return ( char * ) & str [ i ];
+        }
+    }
+    else
+    {
+        int len;
+        uint32_t c;
+        const char *end;
+
+        for ( i = ( int64_t ) size - 1; i >= 0; -- i )
+        {
+            /* skip over ASCII */
+            for ( ; i >= 0 && str [ i ] > 0; -- i )
+                ( void ) 0;
+            if ( i < 0 )
+                break;
+
+            /* back over UTF-8 */
+            for ( end = & str [ i + 1 ]; i >= 0 && ( str [ i ] & 0xC0 ) == 0x80; -- i )
+                ( void ) 0;
+            if ( i < 0 )
+                break;
+
+            /* read UTF-8 */
+            len = utf8_utf32 ( & c, & str [ i ], end );
+            if ( len <= 0 || & str [ i + len ] != end )
+                break;
+            if ( c == ch )
+                return ( char* ) & str [ i ];
+        }
+    }
+    return NULL;
+}
+
+LIB_EXPORT char * CC old_string_rchr ( const char *str, size_t size, uint32_t ch )
+{
+    const char *end;
+
+    if ( str == NULL )
+        return NULL;
+
+    end = str + size;
+    while ( end > str )
+    {
+        int len;
+        uint32_t c;
+        const char *p = end - 1;
+
+        /* back up to find beginning of character */
+        while ( p > str && ( * p & 0xC0 ) == 0x80 )
+            -- p;
+
+        len = utf8_utf32 ( & c, p, end );
+        if ( len <= 0 )
+            break;
+        if ( c == ch )
+            return ( char* ) p;
+        end = p;
+    }
+    return NULL;
+}
+
+/* string_idx
+ *  seek an indexed character
+ */
+LIB_EXPORT char * CC string_idx ( const char *str, size_t size, uint32_t idx )
+{
+    uint32_t i;
+    const char *end;
+
+    if ( str == NULL )
+        return NULL;
+
+    end = str + size;
+    for ( i = 0; str < end; ++ i )
+    {
+        uint32_t c;
+        int len = utf8_utf32 ( & c, str, end );
+        if ( len <= 0 )
+            break;
+        if ( i == idx )
+            return ( char* ) str;
+        str += len;
+    }
+    return NULL;
+}
+
+/* conversion from UTF-16 to internal standard */
+LIB_EXPORT uint32_t CC utf16_cvt_string_len ( const uint16_t *src,
+    size_t src_size, size_t *dst_size )
+{
+    size_t size;
+    uint32_t i, src_len = ( uint32_t ) ( src_size >> 1 );
+
+    for ( size = 0, i = 0; i < src_len; ++ i )
+    {
+        uint32_t ch = src [ i ];
+
+        char ignore [ 8 ];
+        int ch_len = utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch );
+        if ( ch_len <= 0 )
+            break;
+        size += ch_len;
+    }
+
+    * dst_size = size;
+    return i;
+}
+
+LIB_EXPORT uint32_t CC utf16_cvt_string_measure ( const uint16_t *src,
+    size_t *src_size, size_t *dst_size )
+{
+    size_t size;
+    uint32_t i, ch;
+
+    for ( size = 0, ch = src [ i = 0 ]; ch != 0; ch = src [ ++ i ] )
+    {
+        char ignore [ 8 ];
+        int ch_len = utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch );
+        if ( ch_len <= 0 )
+            break;
+        size += ch_len;
+    }
+
+    * src_size = i * sizeof * src;
+    * dst_size = size;
+    return i;
+}
+
+LIB_EXPORT size_t CC utf16_cvt_string_copy ( char *dst, size_t dst_size,
+    const uint16_t *src, size_t src_size )
+{
+    char *begin = dst;
+    char *dend = dst + dst_size;
+    const uint16_t *send = ( const uint16_t* ) ( ( const char* ) src + src_size );
+
+    while ( dst < dend && src < send )
+    {
+        uint32_t ch = * src ++;
+        int ch_len = utf32_utf8 ( dst, dend, ch );
+        if ( ch_len <= 0 )
+            break;
+        dst += ch_len;
+    }
+
+    if ( dst < dend )
+        * dst = 0;
+    return ( size_t ) ( dst - begin );
+}
+
+/* conversion from UTF-32 to internal standard */
+LIB_EXPORT uint32_t CC utf32_cvt_string_len ( const uint32_t *src,
+    size_t src_size, size_t *dst_size )
+{
+    size_t size;
+    uint32_t i, src_len = ( uint32_t ) ( src_size >> 2 );
+
+    for ( size = 0, i = 0; i < src_len; ++ i )
+    {
+        uint32_t ch = src [ i ];
+
+        char ignore [ 8 ];
+        int ch_len = utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch );
+        if ( ch_len <= 0 )
+            break;
+        size += ch_len;
+    }
+
+    * dst_size = size;
+    return i;
+}
+
+LIB_EXPORT uint32_t CC utf32_cvt_string_measure ( const uint32_t *src,
+    size_t *src_size, size_t *dst_size )
+{
+    size_t size;
+    uint32_t i, ch;
+
+    for ( size = 0, ch = src [ i = 0 ]; ch != 0; ch = src [ ++ i ] )
+    {
+        char ignore [ 8 ];
+        int ch_len = utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch );
+        if ( ch_len <= 0 )
+            break;
+        size += ch_len;
+    }
+
+    * src_size = i * sizeof * src;
+    * dst_size = size;
+    return i;
+}
+
+LIB_EXPORT size_t CC utf32_cvt_string_copy ( char *dst, size_t dst_size,
+    const uint32_t *src, size_t src_size )
+{
+    char *begin = dst;
+    char *dend = dst + dst_size;
+    const uint32_t *send = ( const uint32_t* ) ( ( const char* ) src + src_size );
+
+    while ( dst < dend && src < send )
+    {
+        uint32_t ch = * src ++;
+        int ch_len = utf32_utf8 ( dst, dend, ch );
+        if ( ch_len <= 0 )
+            break;
+        dst += ch_len;
+    }
+
+    if ( dst < dend )
+        * dst = 0;
+    return ( size_t ) ( dst - begin );
+}
+
+/* conversion from wchar_t to internal standard */
+LIB_EXPORT uint32_t CC wchar_cvt_string_len ( const wchar_t *src,
+    size_t src_size, size_t *dst_size )
+{
+    size_t size;
+    uint32_t i, src_len = ( uint32_t ) ( src_size / sizeof * src );
+
+    for ( size = 0, i = 0; i < src_len; ++ i )
+    {
+        uint32_t ch = src [ i ];
+
+        char ignore [ 8 ];
+        int ch_len = utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch );
+        if ( ch_len <= 0 )
+            break;
+        size += ch_len;
+    }
+
+    * dst_size = size;
+    return i;
+}
+
+LIB_EXPORT uint32_t CC wchar_cvt_string_measure ( const wchar_t *src,
+    size_t *src_size, size_t *dst_size )
+{
+    size_t size;
+    uint32_t i, ch;
+
+    for ( size = 0, ch = src [ i = 0 ]; ch != 0; ch = src [ ++ i ] )
+    {
+        char ignore [ 8 ];
+        int ch_len = utf32_utf8 ( ignore, & ignore [ sizeof ignore ], ch );
+        if ( ch_len <= 0 )
+            break;
+        size += ch_len;
+    }
+
+    * src_size = i * sizeof * src;
+    * dst_size = size;
+    return i;
+}
+
+LIB_EXPORT size_t CC wchar_cvt_string_copy ( char *dst, size_t dst_size,
+    const wchar_t *src, size_t src_size )
+{
+    char *begin = dst;
+    char *dend = dst + dst_size;
+    const wchar_t *send = ( const wchar_t* ) ( ( const char* ) src + src_size );
+
+    while ( dst < dend && src < send )
+    {
+        uint32_t ch = * src ++;
+        int ch_len = utf32_utf8 ( dst, dend, ch );
+        if ( ch_len <= 0 )
+            break;
+        dst += ch_len;
+    }
+
+    if ( dst < dend )
+        * dst = 0;
+
+    return ( size_t ) ( dst - begin );
+}
+
+LIB_EXPORT size_t CC string_cvt_wchar_copy ( wchar_t *dst, size_t dst_size,
+    const char *src, size_t src_size )
+{
+    uint32_t len, blen = ( uint32_t ) ( dst_size / sizeof *dst );
+    const char *send = ( const char* ) src + src_size;
+
+    for ( len = 0; len < blen && src < send; ++ len )
+    {
+        uint32_t ch;
+        int consumed = utf8_utf32 ( &ch, src, send );
+        if ( consumed <= 0 )
+            break;
+        dst [ len ] = ( wchar_t ) ch;
+        src += consumed;
+    }
+
+    if ( len < blen )
+        dst [ len ] = 0;
+
+    return ( size_t ) ( len );
+}
diff --git a/libs/klib/vector.c b/libs/klib/vector.c
new file mode 100644
index 0000000..c4978ef
--- /dev/null
+++ b/libs/klib/vector.c
@@ -0,0 +1,626 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/vector.h>
+#include <klib/sort.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * Vector
+ *  simple vector of void*
+ */
+
+
+/* Init
+ *  initialize vector
+ *
+ *  "block" [ IN ] - selects the number of elements in
+ *  a vector block; used for allocating and extending
+ */
+LIB_EXPORT void CC VectorInit ( Vector *self, uint32_t start, uint32_t block )
+{
+    if ( self != NULL )
+    {
+        self -> v = NULL;
+        self -> start = start;
+        self -> len = 0;
+
+        if ( block == 0 )
+            block = 64;
+
+        if ( ( ( block - 1 ) & block ) != 0 )
+        {
+            uint32_t blk;
+            for ( blk = 1; blk < block; blk <<= 1 )
+                ( void ) 0;
+            block = blk;
+        }
+
+        /* force a minimum of two */
+        self -> mask = ( block - 1 ) | 1;
+    }
+}
+
+
+/* Copy
+ *  initialize a new vector from an existing one
+ *  performs a shallow copy
+ */
+LIB_EXPORT rc_t CC VectorCopy ( const Vector *self, Vector *copy )
+{
+    uint32_t cap;
+
+    if ( copy == NULL )
+        return RC ( rcCont, rcVector, rcCopying, rcParam, rcNull );
+    if ( self == NULL )
+        return RC ( rcCont, rcVector, rcCopying, rcSelf, rcNull );
+
+    VectorInit ( copy, self -> start, self -> mask + 1 );
+    cap = ( self -> len + self -> mask ) & ~ self -> mask;
+    copy -> v = malloc ( sizeof copy -> v [ 0 ] * cap );
+    if ( copy -> v == NULL )
+        return RC ( rcCont, rcVector, rcCopying, rcMemory, rcExhausted );
+
+    memmove ( copy -> v, self -> v, self -> len * sizeof copy -> v [ 0 ] );
+    copy -> len = self -> len;
+
+    return 0;
+}
+
+
+/* Get
+ *  retrieve an indexed element
+ */
+LIB_EXPORT  void* CC VectorGet ( const Vector *self, uint32_t idx )
+{
+    if ( self != NULL && idx >= self -> start )
+    {
+        idx -= self -> start;
+        if ( idx < self -> len )
+            return self -> v [ idx ];
+    }
+    return NULL;
+}
+
+
+/* Set
+ *  sets an indexed element
+ *  extends vector as required
+ *
+ *  "idx" [ IN ] - item index
+ *
+ *  "item" [ IN, OPAQUE ] - item to be appended to vector
+ *
+ *  returns rcExists if element is not NULL
+ */
+LIB_EXPORT rc_t CC VectorSet ( Vector *self, uint32_t idx, const void *item )
+{
+    uint32_t curcap, newcap;
+
+    if ( self == NULL )
+        return RC ( rcCont, rcVector, rcInserting, rcSelf, rcNull );
+    if ( idx < self -> start )
+        return RC ( rcCont, rcVector, rcInserting, rcParam, rcInvalid );
+    if ( ( idx -= self -> start ) < self -> len )
+    {
+        if ( self -> v [ idx ] != NULL )
+            return SILENT_RC ( rcCont, rcVector, rcInserting, rcItem, rcExists );
+        self -> v [ idx ] = ( void* ) item;
+        return 0;
+    }
+
+    curcap = ( self -> len + self -> mask ) & ~ self -> mask;
+    newcap = ( idx + self -> mask + 1 ) & ~ self -> mask;
+    if ( newcap > curcap )
+    {
+        void **v = realloc ( self -> v, newcap * sizeof * v );
+        if ( v == NULL )
+            return RC ( rcCont, rcVector, rcInserting, rcMemory, rcExhausted );
+        self -> v = v;
+    }
+
+    if ( idx > self -> len )
+        memset ( & self -> v [ self -> len ], 0, ( idx - self -> len ) * sizeof self -> v [ 0 ] );
+
+    self -> v [ idx ] = ( void* ) item;
+    self -> len = idx + 1;
+
+    return 0;
+}
+
+
+/* Swap
+ *  swaps value of an indexed element
+ *  behaves like Set except that it allows overwrite
+ *
+ *  "idx" [ IN ] - item index
+ *
+ *  "item" [ IN, OPAQUE ] - new element value
+ *
+ *  "prior" [ OUT ] - prior element value
+ */
+LIB_EXPORT rc_t CC VectorSwap ( Vector *self, uint32_t idx,
+    const void *item, void **prior )
+{
+    rc_t rc;
+
+    if ( prior == NULL )
+        rc = RC ( rcCont, rcVector, rcInserting, rcParam, rcNull );
+    else
+    {
+        rc = VectorSet ( self, idx, item );
+        if ( GetRCState ( rc ) == rcExists )
+        {
+            idx -= self -> start;
+            * prior = self -> v [ idx ];
+
+            /* if swapping NULL for the last item
+               just drop the count */
+            if ( item == NULL && ( idx + 1 ) == self -> len )
+                -- self -> len;
+            else
+                self -> v [ idx ] = ( void* ) item;
+
+            return 0;
+        }
+
+        * prior = NULL;
+    }
+    return rc;
+}
+
+
+/* Append
+ *  appends item to end of vector
+ *
+ *  "idx" [ OUT, NULL OKAY ] - optional return parameter for item index
+ *
+ *  "item" [ IN, OPAQUE ] - item to be appended to vector
+ */
+LIB_EXPORT rc_t CC VectorAppend ( Vector *self, uint32_t *idx, const void *item )
+{
+    if ( self == NULL )
+        return RC ( rcCont, rcVector, rcInserting, rcSelf, rcNull );
+
+    if ( ( self -> len & self -> mask ) == 0 )
+    {
+        void **v = realloc ( self -> v, ( self -> len + self -> mask + 1 ) * sizeof * v );
+        if ( v == NULL )
+            return RC ( rcCont, rcVector, rcInserting, rcMemory, rcExhausted );
+        self -> v = v;
+    }
+
+    self -> v [ self -> len ] = ( void* ) item;
+
+    if ( idx != NULL )
+        * idx = self -> len + self -> start;
+
+    ++ self -> len;
+
+    return 0;
+}
+
+
+/* First
+ * Last
+ *  get item at either end of vector
+ */
+LIB_EXPORT void* CC VectorFirst ( const Vector *self )
+{
+    if ( self != NULL && self -> len != 0 )
+        return self -> v [ 0 ];
+    return NULL;
+}
+
+LIB_EXPORT  void* CC VectorLast ( const Vector *self )
+{
+    if ( self != NULL && self -> len != 0 )
+        return self -> v [ self -> len - 1 ];
+    return NULL;
+}
+
+
+/* Find
+ *  find an object within ordered vector
+ *
+ *  "key" [ IN ] - find criteria
+ *
+ *  "idx" [ OUT, NULL OKAY ] - optional return parameter for item index
+ *
+ *  "cmp" [ IN ] - comparison function that returns
+ *  equivalent of "key" - "n"
+ */
+LIB_EXPORT void* CC VectorFind ( const Vector *self, const void *key, uint32_t *idx,
+    int64_t ( CC * cmp ) ( const void *key, const void *n ) )
+{
+    if ( self != NULL && cmp != NULL )
+    {
+        uint32_t left, right;
+
+        for ( left = 0, right = self -> len; left < right; )
+        {
+            uint32_t i, mid = ( left + right ) >> 1;
+            void *n = self -> v [ i = mid ];
+            while ( n == NULL && i > left )
+                n = self -> v [ -- i ];
+            if ( n == NULL )
+                left = mid + 1;
+            else
+            {
+                int64_t diff = ( * cmp ) ( key, n );
+                if ( diff == 0 )
+                {
+                    if ( idx != NULL )
+                        * idx = i + self -> start;
+                    return n;
+                }
+                if ( diff < 0 )
+                    right = mid;
+                else
+                    left = mid + 1;
+            }
+        }
+    }
+
+    return NULL;
+}
+
+
+/* Insert
+ *  insert an object to vector, even if duplicate
+ *
+ *  "item" [ IN ] - object to insert
+ *
+ *  "idx" [ OUT, NULL OKAY ] - optional return parameter for item index
+ *
+ *  "sort" [ IN ] - comparison function that returns
+ *  equivalent of "item" - "n"
+ *
+ *  the treatment of order for items reported as identical
+ *  i.e. sort function returns zero when they are compared,
+ *  is undefined.
+ *
+ *  the current implementation treats '<=' as '<' such
+ *  that all inserts are converted to a '<' or '>' comparison,
+ *  but this should not be relied upon.
+ */
+LIB_EXPORT rc_t CC VectorInsert ( Vector *self, const void *item, uint32_t *idx,
+    int64_t ( CC * sort ) ( const void *item, const void *n ) )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcCont, rcVector, rcInserting, rcSelf, rcNull );
+    if ( sort == NULL )
+        return RC ( rcCont, rcVector, rcInserting, rcFunction, rcNull );
+
+    /* let append handle vector expansion */
+    rc = VectorAppend ( self, NULL, item );
+    if ( rc == 0 )
+    {
+        uint32_t left, right;
+
+        for ( left = 0, right = ( int ) self -> len - 1; left < right; )
+        {
+            uint32_t i, mid = ( left + right ) >> 1;
+            void *n = self -> v [ i = mid ];
+            while ( n == NULL && i > left )
+                n = self -> v [ -- i ];
+            if ( n == NULL )
+                left = mid + 1;
+            else
+            {
+                int64_t diff = ( * sort ) ( item, n );
+                if ( diff <= 0 )
+                    right = mid;
+                else
+                    left = mid + 1;
+            }
+        }
+
+        if ( self -> len > ++ right )
+        {
+            memmove ( & self -> v [ right ], & self -> v [ left ],
+                ( self -> len - right ) * sizeof self -> v [ 0 ] );
+            self -> v [ left ] = ( void* ) item;
+        }
+
+        if ( idx != NULL )
+            * idx = left + self -> start;
+    }
+
+    return rc;
+}
+
+
+/* InsertUnique
+ *  insert an object to vector, but only if unique.
+ *
+ *  "item" [ IN ] - object to insert
+ *
+ *  "idx" [ OUT, NULL OKAY ] - optional return parameter for
+ *  item index. when return code state is rcExists, this value
+ *  will be that of the existing item.
+ *
+ *  "sort" [ IN ] - comparison function that returns
+ *  equivalent of "item" - "n"
+ */
+LIB_EXPORT rc_t CC VectorInsertUnique ( Vector *self, const void *item, uint32_t *idx,
+    int64_t ( CC * sort ) ( const void *item, const void *n ) )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcCont, rcVector, rcInserting, rcSelf, rcNull );
+    if ( sort == NULL )
+        return RC ( rcCont, rcVector, rcInserting, rcFunction, rcNull );
+
+    rc = VectorAppend ( self, NULL, item );
+    if ( rc == 0 )
+    {
+        uint32_t left, right;
+
+        for ( left = 0, right = ( int ) self -> len - 1; left < right; )
+        {
+            uint32_t i, mid = ( left + right ) >> 1;
+            void *n = self -> v [ i = mid ];
+            while ( n == NULL && i > left )
+                n = self -> v [ -- i ];
+            if ( n == NULL )
+                left = mid + 1;
+            else
+            {
+                int64_t diff = ( * sort ) ( item, n );
+                if ( diff == 0 )
+                {
+                    -- self -> len;
+                    if ( idx != NULL )
+                        * idx = i + self -> start;
+                    return SILENT_RC ( rcCont, rcVector, rcInserting, rcNode, rcExists );
+                }
+                if ( diff < 0 )
+                    right = mid;
+                else
+                    left = mid + 1;
+            }
+        }
+
+        if ( self -> len > ++ right )
+        {
+            memmove ( & self -> v [ right ], & self -> v [ left ],
+                ( self -> len - right ) * sizeof self -> v [ 0 ] );
+            self -> v [ left ] = ( void* ) item;
+        }
+
+        if ( idx != NULL )
+            * idx = left + self -> start;
+    }
+
+    return rc;
+}
+
+
+/* Merge
+ *  merge a sorted vector into an existing, sorted vector
+ *
+ *  "unique" [ IN ] - eliminate duplicates if true
+ *
+ *  "v" [ IN ] - sorted vector of elements to merge
+ *
+ *  "sort" [ IN ] - comparison function that returns
+ *  equivalent of "item" - "n"
+ */
+LIB_EXPORT rc_t CC VectorMerge ( Vector *self, bool unique, const Vector *v,
+    int64_t ( CC * sort ) ( const void *item, const void *n ) )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcCont, rcVector, rcInserting, rcSelf, rcNull );
+    else if ( v == NULL )
+        rc = RC ( rcCont, rcVector, rcInserting, rcParam, rcNull );
+    else if ( sort == NULL )
+        rc = RC ( rcCont, rcVector, rcInserting, rcFunction, rcNull );
+    else
+    {
+        void **out = malloc ( ( self -> len + v -> len ) * sizeof out [ 0 ] );
+        if ( out == NULL )
+            rc = RC ( rcCont, rcVector, rcInserting, rcMemory, rcExhausted );
+        else
+        {
+            uint32_t i, a, b;
+            for ( rc = 0, i = a = b = 0; a < self -> len && b < v -> len; ++ i )
+            {
+                int64_t diff = ( * sort ) ( self -> v [ a ], v -> v [ b ] );
+                if ( diff == 0 )
+                {
+                    out [ i ] = self -> v [ a ++ ];
+                    if ( ! unique )
+                        out [ ++ i ] = v -> v [ b ];
+                    ++ b;
+                }
+                else if ( diff < 0 )
+                    out [ i ] = self -> v [ a ++ ];
+                else
+                    out [ i ] = v -> v [ b ++ ];
+            }
+            for ( ; a < self -> len; ++ i, ++ a )
+                out [ i ] = self -> v [ a ];
+            for ( ; b < v -> len; ++ i, ++ b )
+                out [ i ] = v -> v [ b ];
+
+            self -> len = i;
+            free ( self -> v );
+            self -> v = out;
+        }
+    }
+
+    return rc;
+}
+
+
+/* Remove
+ *  retrieves value at given index
+ *  shifts all elements to right of index toward start,
+ *  preserving order and decrements length by 1
+ *  return removed item
+ *
+ *  "idx" [ IN ] - item index
+ *
+ *  "removed" [ OUT ] - removed element value
+ */
+LIB_EXPORT rc_t CC VectorRemove ( Vector *self, uint32_t idx, void **removed )
+{
+    rc_t rc;
+    if ( removed == NULL )
+        rc = RC ( rcCont, rcVector, rcRemoving, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcCont, rcVector, rcRemoving, rcSelf, rcNull );
+        else if ( idx < self -> start )
+            rc = RC ( rcCont, rcVector, rcRemoving, rcParam, rcInvalid );
+        else if ( ( idx -= self -> start ) >= self -> len )
+            rc = RC ( rcCont, rcVector, rcRemoving, rcParam, rcInvalid );
+        else
+        {
+            * removed = self -> v [ idx ];
+            if ( -- self -> len > idx )
+            {
+                memmove ( & self -> v [ idx ], & self -> v [ idx + 1 ],
+                    ( self -> len - idx ) * sizeof self -> v [ 0 ] );
+            }
+            return 0;
+        }
+
+        * removed = NULL;
+    }
+    return rc;
+}
+
+
+/* Reorder
+ *  execute qsort on vector with provided function
+ *  not particularly well formed ( i.e. doesn't have a function param ),
+ *  but works within a limited context
+ */
+LIB_EXPORT void CC VectorReorder ( Vector *self,
+    int64_t ( CC * f ) ( const void**, const void**, void* ), void *data )
+{
+    if ( self != NULL && f != NULL && self -> len != 0 )
+    {
+        assert ( self -> v != NULL );
+        ksort ( self -> v, self -> len, sizeof self -> v [ 0 ],
+            ( int64_t ( CC * ) ( const void*, const void*, void* ) ) f, data );
+    }
+}
+
+
+/* ForEach
+ *  executes a function on each vector element
+ */
+LIB_EXPORT void CC VectorForEach ( const Vector *self, bool reverse,
+    void ( CC * f ) ( void *item, void *data ), void *data )
+{
+    if ( self != NULL && f != NULL )
+    {
+        uint32_t i;
+
+        assert ( self -> len == 0 || self -> v != NULL );
+
+        if ( reverse ) for ( i = self -> len; i > 0; )
+        {
+            ( * f ) ( self -> v [ -- i ], data );
+        }
+        else for ( i = 0; i < self -> len; ++ i )
+        {
+            ( * f ) ( self -> v [ i ], data );
+        }
+    }
+}
+
+
+/* DoUntil
+ *  executes a function on each element
+ *  until the function returns true
+ *
+ *  return values:
+ *    false unless the function returns true
+ */
+LIB_EXPORT bool CC VectorDoUntil ( const Vector *self, bool reverse,
+    bool ( CC * f ) ( void *item, void *data ), void *data )
+{
+    if ( self != NULL && f != NULL )
+    {
+        uint32_t i;
+
+        assert ( self -> len == 0 || self -> v != NULL );
+
+        if ( reverse ) for ( i = self -> len; i > 0; )
+        {
+            if ( ( * f ) ( self -> v [ -- i ], data ) )
+                return true;
+        }
+        else for ( i = 0; i < self -> len; ++ i )
+        {
+            if ( ( * f ) ( self -> v [ i ], data ) )
+                return true;
+        }
+    }
+
+    return false;
+}
+
+
+/* Whack
+ *  removes entries from vector and
+ *  executes a user provided destructor
+ */
+LIB_EXPORT void CC VectorWhack ( Vector *self, 
+    void ( CC * whack ) ( void *item, void *data ), void *data )
+{
+    if ( self != NULL )
+    {
+        uint32_t i;
+
+        assert ( self -> len == 0 || self -> v != NULL );
+
+        if ( whack != NULL ) for ( i = 0; i < self -> len; ++ i )
+            ( * whack ) ( self -> v [ i ], data );
+
+        free ( self -> v );
+
+        self -> v = NULL;
+        self -> len = 0;
+    }
+}
diff --git a/libs/klib/vector_namelist.c b/libs/klib/vector_namelist.c
new file mode 100644
index 0000000..ae6daa4
--- /dev/null
+++ b/libs/klib/vector_namelist.c
@@ -0,0 +1,633 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+
+/*typedef struct VNamelist VNamelist;*/
+#define KNAMELIST_IMPL VNamelist
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/vector.h>
+#include <klib/impl.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * KVectorNamelist ... a generic Namelist based on a Vector
+ */
+struct VNamelist
+{
+    KNamelist dad;
+    Vector name_vector;
+};
+
+
+static
+void CC VNameListDestroyNode( void* node, void* data )
+{
+    if ( node != NULL ) free( node );
+}
+
+static
+rc_t CC VNameListDestroy ( VNamelist *self )
+{
+    VectorWhack ( &(self->name_vector), VNameListDestroyNode, NULL );
+    free ( self );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VNameListCount ( const VNamelist *self, uint32_t *count )
+{
+    * count = VectorLength ( &(self->name_vector) );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VNameListGet ( const VNamelist *self, uint32_t idx, const char **name )
+{
+    if ( idx >= VectorLength ( &(self->name_vector) ) )
+        return RC ( rcCont, rcNamelist, rcAccessing, rcParam, rcExcessive );
+    * name = VectorGet ( &(self->name_vector), idx );
+    return 0;
+}
+
+static KNamelist_vt_v1 sVNameList_vt =
+{
+    1, 0,
+    VNameListDestroy,
+    VNameListCount,
+    VNameListGet
+};
+
+LIB_EXPORT rc_t CC VNamelistMake( VNamelist **names, const uint32_t alloc_blocksize  )
+{
+    rc_t rc;
+
+    if ( names == NULL )
+        rc = RC ( rcCont, rcNamelist, rcConstructing, rcParam, rcNull );
+    else
+    {
+        (*names)=malloc( sizeof(**names) );
+        if (*names != NULL )
+        {
+            rc = KNamelistInit( &(*names)->dad, (const KNamelist_vt*) &sVNameList_vt );
+            if ( rc == 0 )
+            {
+                VectorInit ( & (*names)->name_vector, 0, alloc_blocksize );
+            }
+            else
+            {
+                free( *names );
+                *names = NULL;
+            }
+        }
+        else
+        {
+            rc = RC( rcCont, rcNamelist, rcListing, rcParam, rcNull );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VNamelistRelease( const VNamelist *self )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        rc = KNamelistRelease( &(self->dad) );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VNamelistToNamelist( VNamelist *self, KNamelist **cast )
+{
+    rc_t rc;
+    if ( cast == NULL )
+        rc = RC ( rcCont, rcNamelist, rcCasting, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcCont, rcNamelist, rcCasting, rcSelf, rcNull );
+        else
+        {
+            rc = KNamelistAddRef ( & self -> dad );
+            if ( rc == 0 )
+            {
+                * cast = & self -> dad;
+                return 0;
+            }
+        }
+
+        * cast = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VNamelistToConstNamelist( const VNamelist *self, const KNamelist **cast )
+{
+    return VNamelistToNamelist ( ( VNamelist* ) self, ( KNamelist** ) cast );
+}
+
+LIB_EXPORT rc_t CC VNamelistAppend( VNamelist *self, const char* src )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcCont, rcNamelist, rcInserting, rcSelf, rcNull );
+    else
+    {
+        if ( src == NULL )
+            rc = RC( rcCont, rcNamelist, rcInserting, rcString, rcNull );
+        else
+        {
+            char* my_copy = string_dup( src, string_size( src ) );
+            if ( my_copy == NULL )
+                rc = RC( rcCont, rcNamelist, rcInserting, rcMemory, rcExhausted );
+            else
+            {
+                rc = VectorAppend( &(self->name_vector), NULL, my_copy );
+                if ( rc != 0 )
+                    free ( my_copy );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VNamelistAppendString( VNamelist *self, const String * src )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcCont, rcNamelist, rcInserting, rcSelf, rcNull );
+    else
+    {
+        if ( src == NULL )
+            rc = RC( rcCont, rcNamelist, rcInserting, rcString, rcNull );
+        else if ( src->addr == NULL )
+            rc = RC( rcCont, rcNamelist, rcInserting, rcString, rcEmpty );
+        else
+        {
+            char* my_copy = string_dup ( src->addr, src->len );
+            if ( my_copy == NULL )
+                rc = RC( rcCont, rcNamelist, rcInserting, rcMemory, rcExhausted );
+            else
+            {
+                rc = VectorAppend( &(self->name_vector), NULL, my_copy );
+                if ( rc != 0 )
+                    free ( my_copy );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VNamelistIndexOf( VNamelist *self, const char* s, uint32_t *found )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcCont, rcNamelist, rcSearching, rcSelf, rcNull );
+    else
+    {
+        if ( s == NULL )
+            rc = RC( rcCont, rcNamelist, rcSearching, rcString, rcNull );
+        else if ( s[0] == 0 )
+            rc = RC( rcCont, rcNamelist, rcSearching, rcString, rcEmpty );
+        else if ( found == NULL )
+            rc = RC( rcCont, rcNamelist, rcSearching, rcParam, rcNull );
+        else
+        {
+            uint32_t count;
+            rc = VNameListCount ( self, &count );
+            if ( rc == 0 )
+            {
+                uint32_t idx;
+                size_t n1 = string_size ( s );
+                for ( idx = 0; idx < count; ++idx )
+                {
+                    const char * name;
+                    rc = VNameListGet ( self, idx, &name );
+                    if ( rc == 0 )
+                    {
+                        size_t n2 = string_size ( name );
+                        if ( string_cmp ( s, n1, name, n2, (uint32_t) ( ( n1 < n2 ) ? n2 : n1 ) ) == 0 )
+                        {
+                            *found = idx;
+                            return 0;
+                        }
+                    }
+                }
+                rc = RC( rcCont, rcNamelist, rcSearching, rcString, rcNotFound );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VNamelistRemoveIdx( VNamelist *self, uint32_t idx )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC ( rcCont, rcNamelist, rcSearching, rcSelf, rcNull );
+    else
+    {
+        char *removed;
+        rc = VectorRemove ( &(self->name_vector), idx, (void **)&removed );
+        if ( rc == 0 )
+            free( removed );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VNamelistRemove( VNamelist *self, const char* s )
+{
+    uint32_t idx;
+
+    rc_t rc = VNamelistIndexOf( self, s, &idx );
+    if ( rc == 0 )
+        rc = VNamelistRemoveIdx( self, idx );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VNamelistRemoveAll( VNamelist *self )
+{
+    rc_t rc = 0;
+    uint32_t count = 1;
+    while ( count > 0 && rc == 0 )
+    {
+        rc = VNameListCount ( self, &count );
+        if ( rc == 0 && count > 0 )
+            rc = VNamelistRemoveIdx( self, count - 1 );
+    }
+    return rc;
+}
+
+
+/* Reorder
+ *  sort the names according to case sensitivity
+ *  and UNICODE character code ordering
+ *
+ *  "case_insensitive" [ IN ] - when true, perform "tolower" on
+ *   each character before compare
+ */
+static
+int64_t CC vect_string_cmp ( const void **a, const void **b, void *ignore )
+{
+    return strcmp ( * a, * b );
+}
+
+static
+int64_t CC vect_string_cmp_case ( const void **a, const void **b, void *ignore )
+{
+    uint32_t i;
+
+    const char *ap = * a;
+    const char *bp = * b;
+
+    if ( ap == NULL )
+        return bp != NULL;
+    if ( bp == NULL )
+        return -1;
+
+    for ( i = 0; ; ++ i )
+    {
+        if ( ap [ i ] != bp [ i ] )
+        {
+            /* TBD - this should perform UTF-8 to UNICODE conversion
+               but for that, create a function in text module */
+            int64_t diff = (int64_t)tolower ( ap [ i ] ) - (int64_t)tolower ( bp [ i ] );
+            if ( diff == 0 )
+                continue;
+
+            return diff;
+        }
+
+        if ( ap [ i ] == 0 )
+            break;
+    }
+
+    return 0;
+}
+
+LIB_EXPORT void CC VNamelistReorder ( VNamelist *self, bool case_insensitive )
+{
+    if ( self != NULL )
+    {
+        VectorReorder ( & self -> name_vector, case_insensitive ? vect_string_cmp_case : vect_string_cmp, NULL );
+    }
+}
+
+
+/* ---- split and join of strings ---------------------------------------------------------------- */
+
+LIB_EXPORT rc_t CC foreach_String_part( const String * src, const uint32_t delim,
+                                     rc_t ( CC * f ) ( const String * part, void *data ), void * data )
+{
+    rc_t rc = 0;
+    if ( src == NULL || f == NULL )
+        rc = RC ( rcCont, rcNamelist, rcParsing, rcParam, rcNull );
+    else
+    {
+        String tmp, part;
+        char * cptr;
+        char last_cptr_char = 0;
+        
+        StringInit( &tmp, src -> addr, src -> size, src -> len );
+        cptr = string_chr( tmp.addr, tmp.size, delim );
+        if ( cptr != NULL ) last_cptr_char = cptr[ 0 ];
+        while ( rc == 0 && cptr != NULL && tmp.len > 0 )
+        {
+            uint32_t l = ( cptr - tmp.addr );
+            StringInit( &part, tmp.addr, l, l );
+            rc = f( &part, data );
+            if ( rc == 0 )
+            {
+                tmp.addr = cptr + 1;
+                tmp.size -= l + 1;
+                tmp.len -= l + 1;
+                cptr = string_chr( tmp.addr, tmp.size, delim );
+                if ( cptr != NULL ) last_cptr_char = cptr[ 0 ];
+            }
+        }
+        if ( rc == 0 )
+        {
+            if ( tmp.len > 0 )
+                rc = f( &tmp, data );
+            else if ( last_cptr_char == delim )
+            {
+                part.addr = &last_cptr_char;
+                part.size = 0;
+                part.len = 0;
+                rc = f( &part, data );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC foreach_Str_part( const char * src, const uint32_t delim,
+                                  rc_t ( CC * f ) ( const String * part, void *data ), void * data )
+{
+    rc_t rc;
+    if ( src == NULL || f == NULL )
+        rc = RC ( rcCont, rcNamelist, rcParsing, rcParam, rcNull );
+    else
+    {
+        String S;
+        StringInitCString( &S, src );
+        rc = foreach_String_part( &S, delim, f, data );
+    }
+    return rc;
+}
+
+
+static rc_t CC add_to_nl( const String * part, void * data )
+{
+    return VNamelistAppendString ( data, part );
+}
+
+
+LIB_EXPORT rc_t CC VNamelistSplitString ( VNamelist * list, const String * str, const uint32_t delim )
+{
+    rc_t rc = 0;
+    if ( list == NULL )
+        rc = RC ( rcCont, rcNamelist, rcParsing, rcSelf, rcNull );
+    else if ( str == NULL )
+        rc = RC ( rcCont, rcNamelist, rcParsing, rcParam, rcNull );
+    else
+        rc = foreach_String_part( str, delim, add_to_nl, list );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VNamelistSplitStr ( VNamelist * list, const char * str, const uint32_t delim )
+{
+    String S;
+    StringInitCString( &S, str );
+    return VNamelistSplitString ( list, &S, delim );
+}
+
+
+LIB_EXPORT rc_t CC VNamelistFromString ( VNamelist ** list, const String * str, const uint32_t delim )
+{
+    rc_t rc = VNamelistMake( list, 10 );
+    if ( rc == 0 )
+    {
+        rc = VNamelistSplitString ( *list, str, delim );
+        if ( rc != 0 )
+        {
+            VNamelistRelease( *list );
+            *list = NULL;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VNamelistFromStr ( VNamelist ** list, const char * str, const uint32_t delim )
+{
+    String S;
+    StringInitCString( &S, str );
+    return VNamelistFromString ( list, &S, delim );
+}
+
+
+static rc_t join_size( const VNamelist * list, uint32_t count, size_t * size )
+{
+    rc_t rc = 0;
+    uint32_t idx;
+    *size = 0;
+    for ( idx = 0; rc == 0 && idx < count; ++idx )
+    {
+        const char * item;
+        rc = VNameListGet ( list, idx, &item );
+        if ( rc == 0 )
+            *size += string_size ( item );
+    }
+    *size += ( count - 1 );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VNamelistJoin( const VNamelist * list, const uint32_t delim, const String ** rslt )
+{
+    rc_t rc = 0;
+    if ( rslt == NULL )
+        rc = RC ( rcCont, rcNamelist, rcRetrieving, rcParam, rcNull );
+    else
+    {
+        *rslt = NULL;
+        if ( list == NULL )
+            rc = RC ( rcCont, rcNamelist, rcRetrieving, rcSelf, rcNull );
+        else
+        {
+            uint32_t count;
+            char empty[ 1 ];
+            
+            rc = VNameListCount ( list, &count );
+            if ( rc == 0 )
+            {
+                String j;
+                char * buffer = NULL;
+                if ( count < 1 )
+                {
+                    j.addr = empty;
+                    empty[ 0 ] = 0;
+                    j.len = 0;
+                    j.size = 1;
+                }
+                else if ( count == 1 )
+                {
+                    const char * item;
+                    rc = VNameListGet ( list, 0, &item );
+                    if ( rc == 0 )
+                        StringInitCString( &j, item );
+                }
+                else
+                {
+                    size_t js;
+                    rc = join_size( list, count, &js );
+                    if ( rc == 0 )
+                    {
+                        buffer = malloc( js + 1 );
+                        if ( buffer == NULL )
+                            rc = RC ( rcCont, rcNamelist, rcRetrieving, rcMemory, rcExhausted );
+                        else
+                        {
+                            uint32_t idx, dst = 0;
+                            size_t dst_size = js;
+                            for ( idx = 0; rc == 0 && idx < count; ++ idx )
+                            {
+                                const char * item;
+                                rc = VNameListGet ( list, idx, &item );
+                                if ( rc == 0 )
+                                {
+                                    size_t item_size = string_size ( item );
+                                    string_copy ( &buffer[ dst ], dst_size, item, item_size );
+                                    dst += item_size;
+                                    if ( idx < ( count - 1 ) )
+                                    {
+                                        buffer[ dst++ ] = delim;
+                                        dst_size -= ( item_size + 1 );
+                                    }
+                                }
+                            }
+                            if ( rc == 0 )
+                            {
+                                buffer[ dst ] = 0;
+                                StringInitCString( &j, buffer );
+                                /*
+                                j.addr = buffer;
+                                j.len  = ( uint32_t )( dst & 0xFFFFFFFF );
+                                j.size = dst;
+                                */
+                            }
+                        }
+                    }
+                }
+                if ( rc == 0 )
+                    rc = StringCopy ( rslt, &j );
+                if ( buffer != NULL )
+                    free( ( void * ) buffer );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VNamelistContainsString( const VNamelist * list,
+    const String * item, int32_t * idx )
+{
+    rc_t rc = 0;
+    if ( idx == NULL )
+        rc = RC ( rcCont, rcNamelist, rcRetrieving, rcParam, rcNull );
+    else
+    {
+        *idx = -1;
+        if ( item == NULL )
+            rc = RC ( rcCont, rcNamelist, rcRetrieving, rcParam, rcNull );
+        else if ( list == NULL )
+            rc = RC ( rcCont, rcNamelist, rcRetrieving, rcSelf, rcNull );
+        else
+        {
+            uint32_t count, i;
+            rc = VNameListCount ( list, &count );
+            for ( i = 0; rc == 0 && *idx < 0 && i < count; ++i )
+            {
+                const char * s;
+                rc = VNameListGet ( list, i, &s );
+                if ( rc == 0 )
+                {
+                    int cmp;
+                    String S;
+                    StringInitCString( &S, s );
+                    cmp = StringCompare( item, &S );
+                    if ( cmp == 0 )
+                        *idx = i;
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VNamelistContainsStr( const VNamelist * list,
+        const char * item, int32_t * idx )
+{
+    rc_t rc = 0;
+    if ( idx == NULL )
+        rc = RC ( rcCont, rcNamelist, rcRetrieving, rcParam, rcNull );
+    else
+    {
+        *idx = -1;
+        if ( item == NULL )
+            rc = RC ( rcCont, rcNamelist, rcRetrieving, rcParam, rcNull );
+        else if ( list == NULL )
+            rc = RC ( rcCont, rcNamelist, rcRetrieving, rcSelf, rcNull );
+        else
+        {
+            String S;
+            StringInitCString( &S, item );
+            return VNamelistContainsString( list, &S, idx );
+        }
+    }
+    return rc;
+}
diff --git a/libs/klib/vlen-encode.c b/libs/klib/vlen-encode.c
new file mode 100644
index 0000000..76611bb
--- /dev/null
+++ b/libs/klib/vlen-encode.c
@@ -0,0 +1,773 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/extern.h>
+#include <klib/vlen-encode.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <byteswap.h>
+#include <endian.h>
+#include <string.h>
+
+LIB_EXPORT rc_t CC vlen_encode1(void *Dst, uint64_t dsize, uint64_t *psize, int64_t X) {
+    int sgn = 0;
+    uint64_t x;
+    uint8_t *dst = Dst;
+    
+    if (dst == NULL)
+        dsize = 0;
+    
+    if (X < 0) {
+        sgn = 0x40;
+        x = -X;
+    }
+    else
+        x = X;
+    /* 6 -> 8 */
+    if (x < 0x40) {
+        if (psize)
+            *psize = 1;
+        if (dsize < 1)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = (uint8_t)sgn | ( (uint8_t)x & 0x3F );
+        return 0;
+    }
+    /* 13 -> 16 */
+    if (x < 0x2000) {
+        if (psize)
+            *psize = 2;
+        if (dsize < 2)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | (uint8_t)sgn | ( (uint8_t)( x >> 7 ) & 0x3F );
+        dst[1] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 20 -> 24 */
+    if (x < 0x100000) {
+        if (psize)
+            *psize = 3;
+        if (dsize < 3)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | (uint8_t)sgn | ( (uint8_t)( x >> 14 ) & 0x3F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[2] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 27 -> 32 */
+    if (x < 0x8000000) {
+        if (psize)
+            *psize = 4;
+        if (dsize < 4)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | (uint8_t)sgn | ( (uint8_t)( x >> 21 ) & 0x3F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[3] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 34 -> 40 */
+    if (x < ( ( uint64_t ) 0x4 << 32 ) ) {
+        if (psize)
+            *psize = 5;
+        if (dsize < 5)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | (uint8_t)sgn | ( (uint8_t)( x >> 28 ) & 0x3F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[3] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[4] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 41 -> 48 */
+    if (x < ( ( uint64_t ) 0x200 << 32 ) ) {
+        if (psize)
+            *psize = 6;
+        if (dsize < 6)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | (uint8_t)sgn | ( (uint8_t)( x >> 35 ) & 0x3F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 28 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+        dst[3] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[4] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[5] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 48 -> 56 */
+    if (x < ( ( uint64_t ) 0x10000 << 32 ) ) {
+        if (psize)
+            *psize = 7;
+        if (dsize < 7)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | (uint8_t)sgn | ( (uint8_t)( x >> 42 ) & 0x3F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 35 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 28 ) & 0x7F );
+        dst[3] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+        dst[4] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[5] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[6] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 55 -> 64 */
+    if (x < ( ( uint64_t ) 0x800000 << 32 ) ) {
+        if (psize)
+            *psize = 8;
+        if (dsize < 8)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | (uint8_t)sgn | ( (uint8_t)( x >> 49 ) & 0x3F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 42 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 35 ) & 0x7F );
+        dst[3] = 0x80 | ( (uint8_t)( x >> 28 ) & 0x7F );
+        dst[4] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+        dst[5] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[6] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[7] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 62 -> 72 */
+    if (x < ( ( uint64_t ) 0x40000000 << 32 ) ) {
+        if (psize)
+            *psize = 9;
+        if (dsize < 9)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | (uint8_t)sgn | ( (uint8_t)( x >> 56 ) & 0x3F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 49 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 42 ) & 0x7F );
+        dst[3] = 0x80 | ( (uint8_t)( x >> 35 ) & 0x7F );
+        dst[4] = 0x80 | ( (uint8_t)( x >> 28 ) & 0x7F );
+        dst[5] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+        dst[6] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[7] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[8] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 64 -> 80 */
+    if (psize)
+        *psize = 10;
+    if (dsize < 10)
+        return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+    dst[0] = 0x80 | (uint8_t)sgn | ( (uint8_t)( x >> 63 ) & 0x3F );
+    dst[1] = 0x80 | ( (uint8_t)( x >> 56 ) & 0x7F );
+    dst[2] = 0x80 | ( (uint8_t)( x >> 49 ) & 0x7F );
+    dst[3] = 0x80 | ( (uint8_t)( x >> 42 ) & 0x7F );
+    dst[4] = 0x80 | ( (uint8_t)( x >> 35 ) & 0x7F );
+    dst[5] = 0x80 | ( (uint8_t)( x >> 28 ) & 0x7F );
+    dst[6] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+    dst[7] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+    dst[8] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+    dst[9] = ( (uint8_t)x & 0x7F );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC vlen_decode1 ( int64_t *dst, const void *Src, uint64_t ssize, uint64_t *consumed ) {
+    const uint8_t *src = Src;
+    int x;
+    int i;
+    int sgn;
+    int64_t y;
+
+    if (dst == NULL || src == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcNull);
+    if (ssize == 0)
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcInvalid);
+    if (ssize > 10)
+        ssize = 10;
+    
+    x = src[0];
+    sgn = x & 0x40;
+    y = x & 0x3F;
+    i = 1;
+    if ((x & 0x80) != 0) {
+        if (i == ssize)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+        x = src[i];
+        y = (y << 7) | (x & 0x7F);
+        ++i;
+        if ((x & 0x80) != 0) {
+            if (i == ssize)
+                return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+            x = src[i];
+            y = (y << 7) | (x & 0x7F);
+            ++i;
+            if ((x & 0x80) != 0) {
+                if (i == ssize)
+                    return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+                x = src[i];
+                y = (y << 7) | (x & 0x7F);
+                ++i;
+                if ((x & 0x80) != 0) {
+                    if (i == ssize)
+                        return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+                    x = src[i];
+                    y = (y << 7) | (x & 0x7F);
+                    ++i;
+                    if ((x & 0x80) != 0) {
+                        if (i == ssize)
+                            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+                        x = src[i];
+                        y = (y << 7) | (x & 0x7F);
+                        ++i;
+                        if ((x & 0x80) != 0) {
+                            if (i == ssize)
+                                return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+                            x = src[i];
+                            y = (y << 7) | (x & 0x7F);
+                            ++i;
+                            if ((x & 0x80) != 0) {
+                                if (i == ssize)
+                                    return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+                                x = src[i];
+                                y = (y << 7) | (x & 0x7F);
+                                ++i;
+                                if ((x & 0x80) != 0) {
+                                    if (i == ssize)
+                                        return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+                                    x = src[i];
+                                    y = (y << 7) | (x & 0x7F);
+                                    ++i;
+                                    if ((x & 0x80) != 0) {
+                                        if (i == ssize)
+                                            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+                                        x = src[i];
+                                        y = (y << 7) | (x & 0x7F);
+                                        ++i;
+                                        if ((x & 0x80) != 0)
+                                            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    *dst = sgn ? -y : y;
+    if (consumed)
+        *consumed = i;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC vlen_encode ( void *Dst, uint64_t dsize, uint64_t *act_size,
+    const int64_t x[], uint32_t xcount ) {
+    uint32_t i;
+    uint64_t n;
+    uint64_t m = 0;
+    rc_t rc = 0;
+    uint8_t *dst = Dst;
+    
+    if (dst != NULL) {
+        for (i = 0, rc = 0; rc == 0 && i != xcount; ++i) {
+            rc = vlen_encode1(dst, dsize, &n, x[i]);
+            dst += n;
+            dsize -= n;
+            m += n;
+        }
+        if (rc == 0)
+            goto DONE;
+    }
+    else
+        i = 0;
+    for (; i != xcount; ++i) {
+        vlen_encode1(0, 0, &n, x[i]);
+        m += n;
+    }
+DONE:
+    if (act_size)
+        *act_size = m;
+    return rc;
+}
+
+LIB_EXPORT rc_t CC vlen_decode ( int64_t *Y, uint64_t ycount, 
+    const void *Src, uint64_t ssize, uint64_t *consumed ) {
+    const uint8_t *src = Src;
+    uint64_t i, j;
+    
+    if (Y == NULL || Src == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcNull);
+    if (ssize == 0)
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcInvalid);
+    if (ssize < ycount)
+        return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+    
+    for (i = 0, j = 0; j != ycount && i + 10 < ssize; ++j) {
+        int64_t y;
+        int sgn;
+#define XTYPE_SIZE 64
+#if XTYPE_SIZE == 64
+#define XTYPE uint64_t
+#elif XTYPE_SIZE == 32
+#define XTYPE uint32_t
+#else
+#endif
+        XTYPE x;
+        
+        memmove (& x, src + i, sizeof x); /* may be misaligned */        
+#if __BYTE_ORDER == __BIG_ENDIAN
+#if XTYPE_SIZE == 32
+        x = bswap_32(x);
+#elif XTYPE_SIZE == 64
+        x = bswap_64(x);
+#endif
+#endif
+        sgn = (int)x & 0x40;
+        y = x & 0x3F;
+        ++i;
+        if ((x & 0x80) != 0) {
+            x >>= 8;
+            y = (y << 7) | (x & 0x7F);
+            ++i;
+            if ((x & 0x80) != 0) {
+                x >>= 8;
+                y = (y << 7) | (x & 0x7F);
+                ++i;
+                if ((x & 0x80) != 0) {
+                    x >>= 8;
+                    y = (y << 7) | (x & 0x7F);
+                    ++i;
+                    if ((x & 0x80) != 0) {
+#if XTYPE_SIZE == 32
+                        x = *(const XTYPE *)(src + i);
+#if __BYTE_ORDER == __BIG_ENDIAN
+                        x = bswap_32(x);
+#endif
+#elif XTYPE_SIZE == 64
+                        x >>= 8;
+#endif
+                        y = (y << 7) | (x & 0x7F);
+                        ++i;
+                        if ((x & 0x80) != 0) {
+                            x >>= 8;
+                            y = (y << 7) | (x & 0x7F);
+                            ++i;
+                            if ((x & 0x80) != 0) {
+                                x >>= 8;
+                                y = (y << 7) | (x & 0x7F);
+                                ++i;
+                                if ((x & 0x80) != 0) {
+                                    x >>= 8;
+                                    y = (y << 7) | (x & 0x7F);
+                                    ++i;
+                                    if ((x & 0x80) != 0) {
+                                        x = src[i];
+                                        y = (y << 7) | (x & 0x7F);
+                                        ++i;
+                                        if ((x & 0x80) != 0) {
+                                            x = src[i];
+                                            y = (y << 7) | (x & 0x7F);
+                                            ++i;
+                                            if ((x & 0x80) != 0)
+                                                return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        Y[j] = sgn ? -y : y;
+    }
+    for ( ; j != ycount; ++j) {
+        uint64_t n;
+        rc_t rc = vlen_decode1(Y + j, src + i, ssize - i, &n);
+        if (rc)
+            return rc;
+        i += n;
+    }
+    if (consumed)
+        *consumed = i;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC vlen_encodeU1 ( void *Dst, uint64_t dsize,
+    uint64_t *psize, uint64_t X ) {
+    uint64_t x = X;
+    uint8_t *dst = Dst;
+    
+    if (dst == NULL)
+        dsize = 0;
+    
+    /* 7 -> 8 */
+    if (x < 0x80) {
+        if (psize)
+            *psize = 1;
+        if (dsize < 1)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = (uint8_t)x & 0x7F;
+        return 0;
+    }
+    /* 14 -> 16 */
+    if (x < 0x4000) {
+        if (psize)
+            *psize = 2;
+        if (dsize < 2)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F);
+        dst[1] = (uint8_t)x & 0x7F;
+        return 0;
+    }
+    /* 21 -> 24 */
+    if (x < 0x200000) {
+        if (psize)
+            *psize = 3;
+        if (dsize < 3)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[2] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 28 -> 32 */
+    if (x < 0x10000000) {
+        if (psize)
+            *psize = 4;
+        if (dsize < 4)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[3] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 35 -> 40 */
+    if (x < ( ( uint64_t ) 0x8 << 32 ) ) {
+        if (psize)
+            *psize = 5;
+        if (dsize < 5)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | ( (uint8_t)( x >> 28 ) & 0x7F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[3] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[4] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 42 -> 48 */
+    if (x < ( ( uint64_t ) 0x400 << 32 ) ) {
+        if (psize)
+            *psize = 6;
+        if (dsize < 6)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | ( (uint8_t)( x >> 35 ) & 0x7F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 28 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+        dst[3] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[4] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[5] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 49 -> 56 */
+    if (x < ( ( uint64_t ) 0x20000 << 32 ) ) {
+        if (psize)
+            *psize = 7;
+        if (dsize < 7)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | ( (uint8_t)( x >> 42 ) & 0x7F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 35 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 28 ) & 0x7F );
+        dst[3] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+        dst[4] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[5] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[6] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 56 -> 64 */
+    if (x < ( ( uint64_t ) 0x1000000 << 32 ) ) {
+        if (psize)
+            *psize = 8;
+        if (dsize < 8)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | ( (uint8_t)( x >> 49 ) & 0x7F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 42 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 35 ) & 0x7F );
+        dst[3] = 0x80 | ( (uint8_t)( x >> 28 ) & 0x7F );
+        dst[4] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+        dst[5] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[6] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[7] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 63 -> 72 */
+    if (x < ( ( uint64_t ) 0x80000000 << 32 ) ) {
+        if (psize)
+            *psize = 9;
+        if (dsize < 9)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        dst[0] = 0x80 | ( (uint8_t)( x >> 56 ) & 0x7F );
+        dst[1] = 0x80 | ( (uint8_t)( x >> 49 ) & 0x7F );
+        dst[2] = 0x80 | ( (uint8_t)( x >> 42 ) & 0x7F );
+        dst[3] = 0x80 | ( (uint8_t)( x >> 35 ) & 0x7F );
+        dst[4] = 0x80 | ( (uint8_t)( x >> 28 ) & 0x7F );
+        dst[5] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+        dst[6] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+        dst[7] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+        dst[8] = ( (uint8_t)x & 0x7F );
+        return 0;
+    }
+    /* 64 -> 80 */
+    if (psize)
+        *psize = 10;
+    if (dsize < 10)
+        return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+    dst[0] = 0x80 | ( (uint8_t)( x >> 63 ) & 0x7F );
+    dst[1] = 0x80 | ( (uint8_t)( x >> 56 ) & 0x7F );
+    dst[2] = 0x80 | ( (uint8_t)( x >> 49 ) & 0x7F );
+    dst[3] = 0x80 | ( (uint8_t)( x >> 42 ) & 0x7F );
+    dst[4] = 0x80 | ( (uint8_t)( x >> 35 ) & 0x7F );
+    dst[5] = 0x80 | ( (uint8_t)( x >> 28 ) & 0x7F );
+    dst[6] = 0x80 | ( (uint8_t)( x >> 21 ) & 0x7F );
+    dst[7] = 0x80 | ( (uint8_t)( x >> 14 ) & 0x7F );
+    dst[8] = 0x80 | ( (uint8_t)( x >> 7 ) & 0x7F );
+    dst[9] = ( (uint8_t)x & 0x7F );
+    return 0;
+}
+
+static
+rc_t vlen_decodeU1_imp ( uint64_t *dst, const void *Src,
+    uint64_t ssize, uint64_t *consumed ) {
+    const uint8_t *src = Src;
+    uint64_t y;
+    int c;
+    
+    if (ssize > 10)
+        ssize = 10;
+    
+	c = src[0];
+	if ((c & 0x80) == 0) {
+		*dst = c;
+		*consumed = 1;
+		return 0;
+	}
+	if (ssize != 1) {
+		y = c & 0x7F;
+        c = src[1];
+        if ((c & 0x80) == 0) {
+            *dst = (y << 7) | c;
+            *consumed = 2;
+            return 0;
+        }
+        if (ssize != 2) {
+            y = (y << 7) | (c & 0x7F);
+            c = src[2];
+            if ((c & 0x80) == 0) {
+                *dst = (y << 7) | c;
+                *consumed = 3;
+                return 0;
+            }
+            if (ssize != 3) {
+                y = (y << 7) | (c & 0x7F);
+                c = src[3];
+                if ((c & 0x80) == 0) {
+                    *dst = (y << 7) | c;
+                    *consumed = 4;
+                    return 0;
+                }
+                if (ssize != 4) {
+                    y = (y << 7) | (c & 0x7F);
+                    c = src[4];
+                    if ((c & 0x80) == 0) {
+                        *dst = (y << 7) | c;
+                        *consumed = 5;
+                        return 0;
+                    }
+                    if (ssize != 5) {
+                        y = (y << 7) | (c & 0x7F);
+                        c = src[5];
+                        if ((c & 0x80) == 0) {
+                            *dst = (y << 7) | c;
+                            *consumed = 6;
+                            return 0;
+                        }
+                        if (ssize != 6) {
+                            y = (y << 7) | (c & 0x7F);
+                            c = src[6];
+                            if ((c & 0x80) == 0) {
+                                *dst = (y << 7) | c;
+                                *consumed = 7;
+                                return 0;
+                            }
+                            if (ssize != 7) {
+                                y = (y << 7) | (c & 0x7F);
+                                c = src[7];
+                                if ((c & 0x80) == 0) {
+                                    *dst = (y << 7) | c;
+                                    *consumed = 8;
+                                    return 0;
+                                }
+                                if (ssize != 8) {
+                                    y = (y << 7) | (c & 0x7F);
+                                    c = src[8];
+                                    if ((c & 0x80) == 0) {
+                                        *dst = (y << 7) | c;
+                                        *consumed = 9;
+                                        return 0;
+                                    }
+                                    if (ssize != 9) {
+                                        y = (y << 7) | (c & 0x7F);
+                                        c = src[9];
+                                        if ((c & 0x80) == 0) {
+                                            *dst = (y << 7) | c;
+                                            *consumed = 10;
+                                            return 0;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+                                            
+    return RC(rcRuntime, rcFunction, rcExecuting, rcData, rcInvalid);
+}
+
+LIB_EXPORT rc_t CC vlen_decodeU1( uint64_t *dst, const void *Src,
+    uint64_t ssize, uint64_t *consumed ) {
+    if (dst == NULL || Src == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcNull);
+    if (ssize == 0)
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcInvalid);
+    
+    return vlen_decodeU1_imp(dst, Src, ssize, consumed);
+}
+
+LIB_EXPORT rc_t CC vlen_encodeU( void *Dst, uint64_t dsize,
+    uint64_t *act_size, const uint64_t x[], uint32_t xcount ) {
+    uint32_t i;
+    uint64_t n;
+    uint64_t m = 0;
+    rc_t rc = 0;
+    uint8_t *dst = Dst;
+    
+    if (dst != NULL) {
+        for (i = 0, rc = 0; rc == 0 && i != xcount; ++i) {
+            rc = vlen_encodeU1(dst, dsize, &n, x[i]);
+            dst += n;
+            dsize -= n;
+            m += n;
+        }
+        if (rc == 0)
+            goto DONE;
+    }
+    else
+        i = 0;
+    for (; i != xcount; ++i) {
+        vlen_encodeU1(0, 0, &n, x[i]);
+        m += n;
+    }
+DONE:
+    if (act_size)
+        *act_size = m;
+    return rc;
+}
+
+LIB_EXPORT rc_t CC vlen_decodeU ( uint64_t Y[], uint64_t ycount,
+    const void *Src, uint64_t ssize, uint64_t *consumed ) {
+    const uint8_t *src = Src;
+    uint64_t i, j;
+    
+    if (Y == NULL || Src == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcNull);
+    if (ssize == 0)
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcInvalid);
+    if (ssize < ycount)
+        return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+    
+    for (j = i = 0; j != ycount; ++j) {
+        uint64_t n;
+        rc_t rc = vlen_decodeU1_imp(Y + j, src + i, ssize - i, &n);
+        if (rc)
+            return rc;
+        i += n;
+    }
+    if (consumed)
+        *consumed = i;
+    return 0;
+}
+
+#if 0
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+
+static void print ( const unsigned char *buf, int n ) {
+    int i;
+    for (i = 0; i != n; ++i)
+        printf("%02X ", buf[i]);
+    puts("");
+}
+
+#define N 128
+void test( void ) {
+    unsigned char buf[N * 10];
+    uint32_t i;
+    uint64_t y[N], x[N];
+    unsigned s[8];
+    uint64_t bsz;
+    uint64_t temp;
+    uint32_t total;
+    uint64_t min = 640;
+    uint64_t max = 0;
+    int j;
+    
+    for (i = 0; i != 8; ++i) {
+        sranddev();
+        s[i] = random();
+    }
+    for (j = 0, total = 0; j != 1024 * 1024; ++j) {
+        for (i = 0; i != N; ++i)
+            x[i] = random();
+        vlen_encodeU(buf, 1024, &bsz, x, N);
+        total += bsz;
+        if (max < bsz)
+            max = bsz;
+        if (min > bsz)
+            min = bsz;
+        vlen_decodeU(y, N, buf, bsz, &temp);
+        assert(temp == bsz);
+        assert(memcmp(y, x, sizeof(y)) == 0);
+    }
+    for (j = 0, total = 0; j != 1024 * 1024; ++j) {
+        for (i = 0; i != N; ++i)
+            x[i] = random();
+        vlen_encode(buf, 1024, &bsz, x, N);
+        total += bsz;
+        if (max < bsz)
+            max = bsz;
+        if (min > bsz)
+            min = bsz;
+        vlen_decode(y, N, buf, bsz, &temp);
+        assert(temp == bsz);
+        assert(memcmp(y, x, sizeof(y)) == 0);
+    }
+    printf("min: %u\tmax: %u\tavg: %f\n", (int)min, (int)max, ((float)total) / j);
+}
+#endif
diff --git a/libs/klib/writer-priv.h b/libs/klib/writer-priv.h
new file mode 100644
index 0000000..9a1c190
--- /dev/null
+++ b/libs/klib/writer-priv.h
@@ -0,0 +1,169 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_writer_priv_
+#define _h_writer_priv_
+
+#include <klib/writer.h>
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_log_
+#include <klib/log.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t KWrtSysInit(void** h_stdout, void** h_stderr);
+
+size_t KWrtFmt_rc_t  (char * buffer, size_t bufsize, const char * fmt, rc_t rc_in);
+size_t KWrtFmt_KTime_t (char * buffer, size_t bufsize, const char * fmt_ignored, KTime_t time_in);
+
+
+/* -----
+ * write into the buffer a textual string describing the system specific
+ * error code represented by the third parameter.  Will be NUL terminated.
+ * expected to be used within string_printf and associated functions only.
+ */
+size_t KWrtFmt_error_code (char * buffer, size_t bufsize, uint32_t error_code);
+
+/* -----
+ * We have a default writer is the part that will possibly vary by O/S type
+ */
+rc_t CC KWrt_DefaultWriter (void* data, const char * buffer, size_t bufsize, size_t * num_writ);
+
+/* -----
+ * The default writer uses this data type object.
+ * The actual definition might vary to work on non-Unix operating systems.  The port to Windows
+ * might well force the full definition to a system file.
+ */
+typedef struct KWrt_DefaultWriterData DefaultWriterData;
+
+/*
+ * Windows or other O/S port might have to move this struct definition to a system specific file
+ */
+struct KWrt_DefaultWriterData
+{
+    int sysfile_handle;
+};
+
+/*
+ * We will have two common default writer data objects for the C library expected stdout and stderr
+ *
+ * These are the normal data stream and error data stream that will have to be set up for
+ * windows console I/O
+ */
+extern void *KWrt_DefaultWriterDataStdOut;
+extern void *KWrt_DefaultWriterDataStdErr;
+
+/* fix up windows printf shortcomings for integer types 
+ * current format is len long at fmt with max max size for the format
+ * len is updated to new length if fmt is changed
+ */
+void print_int_fixup   (char * fmt, size_t * len, size_t max);
+void print_float_fixup (char * fmt, size_t * len, size_t max);
+void print_char_fixup  (char * fmt, size_t * len, size_t max);
+
+extern const char *gRCModule_str [];
+extern const char *gRCTarget_str [];
+extern const char *gRCContext_str [];
+extern const char *gRCObject_str [];
+extern const char *gRCState_str [];
+
+extern const char *gRCModuleIdx_str [];
+extern const char *gRCTargetIdx_str [];
+extern const char *gRCContextIdx_str [];
+extern const char *gRCObjectIdx_str [];
+extern const char *gRCStateIdx_str [];
+
+/* GetRCModuleText
+ */
+const char *GetRCModuleText ( enum RCModule mod );
+
+/* GetRCTargetText
+ */
+const char *GetRCTargetText ( enum RCTarget targ );
+
+/* GetRCContextText
+ */
+const char *GetRCContextText ( enum RCContext ctx );
+
+/* GetRCObjectText
+ *  obj can be RCTarget or RCObject
+ */
+const char *GetRCObjectText ( int obj );
+
+/* GetRCStateText
+ */
+const char *GetRCStateText ( enum RCState state );
+
+
+/* GetRCModuleIdxText
+ */
+const char *GetRCModuleIdxText ( enum RCModule mod );
+
+/* GetRCTargetIdxText
+ */
+const char *GetRCTargetIdxText ( enum RCTarget targ );
+
+/* GetRCContextIdxText
+ */
+const char *GetRCContextIdxText ( enum RCContext ctx );
+
+/* GetRCObjectIdxText
+ *  obj can be RCTarget or RCObject
+ */
+const char *GetRCObjectIdxText ( int obj );
+
+/* GetRCStateIdxText
+ */
+const char *GetRCStateIdxText ( enum RCState state );
+
+
+extern const char * RCModuleStrings[];
+extern const char * RCTargetStrings[];
+extern const char * RCContextStrings[];
+extern const char * RCObjectStrings[];
+extern const char * RCStateStrings[];
+
+enum ERCExplain2Options
+{
+    eRCExOpt_NoMessageIfNoError,
+    eRCExOpt_ObjAndStateOnlyIfError,
+    eRCExOpt_CompleteMsg
+};
+
+KLIB_EXTERN rc_t CC RCExplain2 ( rc_t rc, char *buffer, size_t bsize, size_t *num_writ, enum ERCExplain2Options options );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_writer_priv_ */
diff --git a/libs/klib/writer.c b/libs/klib/writer.c
new file mode 100644
index 0000000..dd812c7
--- /dev/null
+++ b/libs/klib/writer.c
@@ -0,0 +1,645 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/extern.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/sort.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include "writer-priv.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+#include <os-native.h>
+
+static char wrt_app[32];
+static size_t wrt_app_length;
+static char wrt_vers[16];
+static size_t wrt_vers_length;
+
+void* KWrt_DefaultWriterDataStdOut = NULL;
+void* KWrt_DefaultWriterDataStdErr = NULL;
+
+typedef struct RCCreateLoc RCCreateLoc;
+struct RCCreateLoc
+{
+    const char *filename;
+    const char *function;
+    uint32_t lineno;
+    rc_t rc;
+};
+
+static RCCreateLoc RC_loc_queue [ 3 ];
+static atomic32_t RC_loc_reserve, RC_loc_written, RC_loc_read;
+#define RC_LOC_QUEUE_SIZE ( sizeof RC_loc_queue / sizeof RC_loc_queue [ 0 ] )
+#define RC_LOC_QUEUE_MASK ( RC_LOC_QUEUE_SIZE - 1 )
+static bool reporting_unread = false;
+
+/*
+ *  "appname" [ IN ] - identity of executable, usually argv[0]
+ *
+ *  "vers" [ IN ] - 4-part version code: 0xMMmmrrrr, where
+ *      MM = major release
+ *      mm = minor release
+ *    rrrr = bug-fix release
+ */
+LIB_EXPORT rc_t CC KWrtInit( const char* appname, uint32_t vers )
+{
+    rc_t rc;
+
+    if ( appname == NULL )
+        return RC ( rcRuntime, rcLog, rcConstructing, rcString, rcNull );
+    if ( appname [ 0 ] == 0 )
+        return RC ( rcRuntime, rcLog, rcConstructing, rcString, rcEmpty );
+
+    do
+    {
+        const char* progname;
+        const char* ext;
+        size_t progname_z;
+
+        /* find whichever is last \ or / */
+        string_measure(appname, &progname_z);
+        progname = string_rchr(appname, progname_z, '/');
+        if( progname == NULL ) {
+            progname = appname;
+        } else {
+            progname++;
+            string_measure(progname, &progname_z);
+        }
+        appname = string_rchr(progname, progname_z, '\\');
+        if( appname == NULL ) {
+            appname = progname;
+        } else {
+            appname++;
+        }
+        string_measure(appname, &progname_z);
+
+        ext = string_chr(appname, progname_z, '.');
+
+        if( ext != NULL ) {
+            wrt_app_length = ext - appname;
+        } else {
+            wrt_app_length = progname_z;
+        }
+        if ( wrt_app_length >= sizeof(wrt_app) ) {
+            wrt_app_length = sizeof(wrt_app) - 1;
+        }
+        memmove(wrt_app, appname, wrt_app_length);
+        wrt_app[wrt_app_length] = '\0';
+
+        rc = string_printf ( wrt_vers, sizeof wrt_vers, & wrt_vers_length,
+            "%.3V", vers );
+        assert ( rc == 0 );
+
+        rc = KWrtSysInit(&KWrt_DefaultWriterDataStdOut, &KWrt_DefaultWriterDataStdErr);
+        if (rc) break;
+
+        rc = KOutInit();
+        if (rc) break;
+
+        rc = KLogInit();
+        if (rc) break;
+
+        rc = KStsInit();
+        if (rc) break;
+
+        rc = KDbgInit();
+    } while (0);
+
+    return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * nvp - name/value pair
+ */
+static
+int64_t CC wrt_nvp_cmp_func(const void *a, const void *b, void * ignored)
+{
+    int i = 0;
+    const char *key = a;
+    const char *name = ( ( const wrt_nvp_t* ) b ) -> name;
+
+    while(key[i] == name[i]) {
+        if( key[i] == '\0' || name[i] == '\0' ) {
+            break;
+        }
+        ++i;
+    }
+    /* treat \0 or right-paren as key terminator */
+    if( key[i] != 0 && key[i] != ')' ) {
+        return (int64_t)key[i] - (int64_t)name[i];
+    }
+    return (int64_t)0 - (int64_t)name[i];
+}
+
+static
+int64_t CC wrt_nvp_sort_func(const void *a, const void *b, void * ignored)
+{
+    const wrt_nvp_t *left = a;
+    const wrt_nvp_t *right = b;
+    return strcmp ( left -> name, right -> name );
+}
+
+LIB_EXPORT void CC wrt_nvp_sort( size_t argc, wrt_nvp_t argv[])
+{
+    if( argc > 1 ) {
+        ksort(argv, argc, sizeof(argv[0]), wrt_nvp_sort_func, NULL);
+    }
+}
+
+LIB_EXPORT const wrt_nvp_t* CC wrt_nvp_find( size_t argc, const wrt_nvp_t argv[], const char* key )
+{
+    if( argc > 0 ) {
+        return kbsearch(key, argv, argc, sizeof(argv[0]), wrt_nvp_cmp_func, NULL);
+    }
+    return NULL;
+}
+
+LIB_EXPORT const char* CC wrt_nvp_find_value( size_t argc, const wrt_nvp_t argv[], const char* key )
+{
+    if( argc > 0 ) {
+        const wrt_nvp_t* n = (const wrt_nvp_t*)kbsearch(key, argv, argc, sizeof(argv[0]), wrt_nvp_cmp_func, NULL);
+        if( n != NULL ) {
+            return n->value;
+        }
+    }
+    return NULL;
+}
+
+static
+rc_t RCLiteral ( rc_t self, char *buffer, size_t bsize, size_t *num_writ )
+{
+#if ! _DEBUGGING && RECORD_RC_FILE_LINE
+    ( void ) GetRCLineno ();
+#endif
+    return string_printf ( buffer, bsize, num_writ
+#if _DEBUGGING
+        , "rc = %s:%u:$s:%u.%u.%u.%u.%u"
+        , GetRCFilename(), GetRCLineno (), GetRCFunction ()
+#else
+        , "rc = %u.%u.%u.%u.%u"
+#endif
+        , ( uint32_t ) GetRCModule ( self )
+        , ( uint32_t ) GetRCTarget ( self )
+        , ( uint32_t ) GetRCContext ( self )
+        , ( uint32_t ) GetRCObject ( self )
+        , ( uint32_t ) GetRCState ( self )
+    );
+}
+
+LIB_EXPORT rc_t CC RCExplain ( rc_t rc, char *buffer, size_t bsize, size_t *num_writ )
+{
+    return RCExplain2
+        ( rc, buffer, bsize, num_writ, eRCExOpt_CompleteMsg );
+}
+
+LIB_EXPORT rc_t CC RCExplain2 ( rc_t rc, char *buffer, size_t bsize, size_t *num_writ,
+                                enum ERCExplain2Options options )
+{
+    bool noMessageIfNoError =
+        (options == eRCExOpt_NoMessageIfNoError || 
+         options == eRCExOpt_ObjAndStateOnlyIfError);
+    int len;
+    size_t total = 0;
+
+    const char *mod = GetRCModuleText ( GetRCModule ( rc ) );
+    const char *targ = GetRCTargetText ( GetRCTarget ( rc ) );
+    const char *ctx = GetRCContextText ( GetRCContext ( rc ) );
+    const char *obj = GetRCObjectText ( GetRCObject ( rc ) );
+    const char *state = GetRCStateText ( GetRCState ( rc ) );
+
+    assert( buffer && num_writ );
+
+    *num_writ = 0;
+    if( rc == 0 && noMessageIfNoError ) {
+        buffer[0] = '\0';
+        return 0;
+    }
+
+    /* English'ish formatting */
+#if _DEBUGGING
+    {
+        const char *function = GetRCFunction ();
+        if ( function != NULL )
+        {
+            len = snprintf(buffer + total, bsize - total, "%s:%u:%s: ", GetRCFilename(), GetRCLineno (), function );
+            if( len < 0 || ( total + len ) >= bsize ) {
+                return RCLiteral ( rc, buffer, bsize, num_writ );
+            }
+            total += len;
+        }
+    }
+#elif RECORD_RC_FILE_LINE
+    ( void ) GetRCLineno ();
+#endif
+    if( obj != NULL ) {
+        len = snprintf(buffer + total, bsize - total, "%s", obj);
+        if( len < 0 || ( total + len ) >= bsize ) {
+            return RCLiteral ( rc, buffer, bsize, num_writ );
+        }
+        total += len;
+    }
+    if( state != NULL ) {
+        len = snprintf(buffer + total, bsize - total, "%s%s", total ? " " : "", state);
+        if( len < 0 || ( total + len ) >= bsize ) {
+            return RCLiteral ( rc, buffer, bsize, num_writ );
+        }
+        total += len;
+    }
+    if( rc != 0 && options == eRCExOpt_CompleteMsg ) {
+        if( ctx != NULL ) {
+            len = snprintf ( buffer + total, bsize - total, "%swhile %s", total ? " " : "", ctx );
+            if ( len < 0 || ( total + len ) >= bsize ) {
+                return RCLiteral ( rc, buffer, bsize, num_writ );
+            }
+            total += len;
+            if( targ != NULL ) {
+                len = snprintf ( buffer + total, bsize - total, "%s%s", total ? " " : "", targ );
+                if( len < 0 || ( total + len ) >= bsize ) {
+                    return RCLiteral ( rc, buffer, bsize, num_writ );
+                }
+                total += len;
+            }
+        } else if( targ != NULL ) {
+            len = snprintf ( buffer + total,
+                bsize - total, "%swhile acting upon %s", total ? " " : "", targ );
+            if( len < 0 || ( total + len ) >= bsize ) {
+                return RCLiteral ( rc, buffer, bsize, num_writ );
+            }
+            total += len;
+        }
+    }
+    if( mod != NULL && options == eRCExOpt_CompleteMsg ) {
+        len = snprintf(buffer + total, bsize - total, "%swithin %s module", total ? " " : "", mod);
+        if( len < 0 || ( total + len ) >= bsize ) {
+            return RCLiteral ( rc, buffer, bsize, num_writ );
+        }
+        total += len;
+    }
+    *num_writ = total;
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * RC
+ */
+
+
+/* GetRCModuleText
+ */
+const char *GetRCModuleText ( enum RCModule mod )
+{
+    if ( ( int ) mod < 0 || ( int ) mod >= ( int ) rcLastModule_v1_1 )
+        return "<INVALID-MODULE>";
+    return gRCModule_str [ ( int ) mod ];
+}
+
+/* GetRCModuleIdxText
+ */
+const char *GetRCModuleIdxText ( enum RCModule mod )
+{
+    if ( ( int ) mod < 0 || ( int ) mod >= ( int ) rcLastModule_v1_1 )
+        return "<INVALID-MODULE>";
+    return gRCModuleIdx_str [ ( int ) mod ];
+}
+
+/* GetRCTargetText
+ */
+const char *GetRCTargetText ( enum RCTarget targ )
+{
+    if ( ( int ) targ < 0 || ( int ) targ >= ( int ) rcLastTarget_v1_1 )
+        return "<INVALID-TARGET>";
+    return gRCTarget_str [ ( int ) targ ];
+}
+
+/* GetRCTargetIdxText
+ */
+const char *GetRCTargetIdxText ( enum RCTarget targ )
+{
+    if ( ( int ) targ < 0 || ( int ) targ >= ( int ) rcLastTarget_v1_1 )
+        return "<INVALID-TARGET>";
+    return gRCTargetIdx_str [ ( int ) targ ];
+}
+
+/* GetRCContextText
+ */
+const char *GetRCContextText ( enum RCContext ctx )
+{
+    if ( ( int ) ctx < 0 || ( int ) ctx >= ( int ) rcLastContext_v1_1 )
+        return "<INVALID-CONTEXT>";
+    return gRCContext_str [ ( int ) ctx ];
+}
+
+/* GetRCContextIdxText
+ */
+const char *GetRCContextIdxText ( enum RCContext ctx )
+{
+    if ( ( int ) ctx < 0 || ( int ) ctx >= ( int ) rcLastContext_v1_1 )
+        return "<INVALID-CONTEXT>";
+    return gRCContextIdx_str [ ( int ) ctx ];
+}
+
+/* GetRCObjectText
+ */
+const char *GetRCObjectText ( int obj )
+{
+    if ( ( int ) obj < 0 || ( int ) obj >= ( int ) rcLastObject_v1_1 )
+        return "<INVALID-OBJECT>";
+    if ( ( int ) obj < ( int ) rcLastTarget_v1_1 )
+        return gRCTarget_str [ ( int ) obj ];
+    return gRCObject_str [ ( int ) obj - ( int ) ( rcLastTarget_v1_1 - 1 ) ];
+}
+
+/* GetRCObjectIdxText
+ */
+const char *GetRCObjectIdxText ( int obj )
+{
+    if ( ( int ) obj < 0 || ( int ) obj >= ( int ) rcLastObject_v1_1 )
+        return "<INVALID-OBJECT>";
+    if ( ( int ) obj < ( int ) rcLastTarget_v1_1 )
+        return gRCTargetIdx_str [ ( int ) obj ];
+    return gRCObjectIdx_str [ ( int ) obj - ( int ) ( rcLastTarget_v1_1 - 1 ) ];
+}
+
+/* GetRCStateText
+ */
+const char *GetRCStateText ( enum RCState state )
+{
+    if ( ( int ) state < 0 || ( int ) state >= ( int ) rcLastState_v1_1 )
+        return "<INVALID-STATE>";
+    return gRCState_str [ ( int ) state ];
+}
+
+/* GetRCStateIdxText
+ */
+const char *GetRCStateIdxText ( enum RCState state )
+{
+    if ( ( int ) state < 0 || ( int ) state >= ( int ) rcLastState_v1_1 )
+        return "<INVALID-STATE>";
+    return gRCStateIdx_str [ ( int ) state ];
+}
+
+static
+uint32_t read_rc_loc_head ( void )
+{
+    int32_t idx = atomic32_read ( & RC_loc_written );
+    if ( ! reporting_unread )
+    {
+        atomic32_set ( & RC_loc_read, idx );
+    }
+    return idx;
+}
+
+static
+const char *get_rc_filename ( uint32_t idx )
+{
+    const char *p = RC_loc_queue [ idx & RC_LOC_QUEUE_MASK ] . filename;
+    if( p != NULL )
+    {
+        int i;
+        const char *sep;
+        const char *RC_filename = p;
+#if WINDOWS
+        static char win_rc_filename [ 4096 ];
+        size_t w, len = string_copy_measure ( win_rc_filename, sizeof win_rc_filename - 1, p );
+        if ( len >= 2 && isalpha ( win_rc_filename [ 0 ] ) && win_rc_filename [ 1 ] == ':' )
+        {
+            win_rc_filename [ 1 ] = win_rc_filename [ 0 ];
+            win_rc_filename [ 0 ] = '/';
+        }
+        for ( w = 0; w < len; ++ w )
+        {
+            if ( win_rc_filename [ w ] == '\\' )
+                win_rc_filename [ w ] = '/';
+        }
+        p = RC_filename = win_rc_filename;
+#endif
+        if ( (p = strstr(RC_filename, "/interfaces/")) != NULL ||
+             (p = strstr(RC_filename, "/libs/")) != NULL ||
+             (p = strstr(RC_filename, "/services/")) != NULL ||
+             (p = strstr(RC_filename, "/tools/")) != NULL ||
+             (p = strstr(RC_filename, "/asm-trace/")) != NULL )
+        {
+            return p + 1;
+        }
+
+        for ( i = 0, sep = strrchr ( p = RC_filename, '/' ); sep != NULL && i < 3; ++ i )
+        {
+            p = sep + 1;
+            sep = string_rchr ( RC_filename, sep - RC_filename, '/' );
+        }
+    }
+
+    return p;
+}
+
+LIB_EXPORT const char * CC GetRCFilename ( void )
+{
+    return get_rc_filename ( read_rc_loc_head () );
+}
+
+/* InsertSpace
+ *  inserts a division after current text
+ *
+ *  "spacer" [ IN, NULL OKAY ] - optional characters to insert
+ */
+LIB_EXPORT rc_t CC LogInsertSpace(const char *spacer, char *buffer, size_t bsize, size_t *num_writ)
+{
+    int len;
+
+    if ( spacer == NULL )
+    {
+        if ( bsize < 2 )
+            return RC ( rcRuntime, rcLog, rcLogging, rcBuffer, rcInsufficient );
+        buffer [ 0 ] = ' ';
+        buffer [ 1 ] = 0;
+        * num_writ = 1;
+        return 0;
+    }
+
+    len = snprintf ( buffer, bsize, "%s", spacer );
+
+    * num_writ = len;
+
+    if ( len < 0 || (size_t)len >= bsize )
+    {
+        if ( len < 0 )
+            * num_writ = 0;
+        return RC ( rcRuntime, rcLog, rcLogging, rcBuffer, rcInsufficient );
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC LogAppName(char *buffer, size_t bsize, size_t *num_writ)
+{
+    if( wrt_app_length > bsize ) {
+        return RC(rcRuntime, rcLog, rcLogging, rcBuffer, rcInsufficient);
+    }
+    memmove(buffer, wrt_app, wrt_app_length);
+    *num_writ = wrt_app_length;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC LogAppVersion(char *buffer, size_t bsize, size_t *num_writ)
+{
+    if( wrt_vers_length > bsize ) {
+        return RC(rcRuntime, rcLog, rcLogging, rcBuffer, rcInsufficient);
+    }
+    memmove(buffer, wrt_vers, wrt_vers_length);
+    *num_writ = wrt_vers_length;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC LogFlush ( const KWrtHandler* handler, const char *buffer, const size_t bsize)
+{
+    rc_t rc = 0;
+    size_t num_written;
+    size_t remaining;
+
+    assert(handler != NULL);
+    assert(buffer != NULL);
+
+    for(remaining = bsize; rc == 0 && remaining > 0; remaining -= num_written, buffer += num_written) {
+        rc = handler->writer(handler->data, buffer, remaining, &num_written);
+    }
+    return rc;
+}
+
+static
+const char *get_rc_function ( uint32_t idx )
+{
+    return RC_loc_queue [ idx & RC_LOC_QUEUE_MASK ] . function;
+}
+
+LIB_EXPORT const char * CC GetRCFunction ( void )
+{
+    return get_rc_function ( read_rc_loc_head () );
+}
+
+static
+uint32_t get_rc_lineno ( uint32_t idx )
+{
+    return RC_loc_queue [ idx & RC_LOC_QUEUE_MASK ] . lineno;
+}
+
+LIB_EXPORT uint32_t CC GetRCLineno ( void )
+{
+    return get_rc_lineno ( read_rc_loc_head () );
+}
+
+static
+rc_t get_rc_code ( uint32_t idx )
+{
+    return RC_loc_queue [ idx & RC_LOC_QUEUE_MASK ] . rc;
+}
+
+LIB_EXPORT rc_t CC SetRCFileFuncLine ( rc_t rc, const char *filename, const char *funcname, uint32_t lineno )
+{
+    /* the limit based upon last guy successfully written */
+    int32_t lim = atomic32_read ( & RC_loc_written ) + RC_LOC_QUEUE_SIZE;
+
+    /* try to reserve a slot for writing */
+    int32_t rsrv = atomic32_read_and_add_lt ( & RC_loc_reserve, 1, lim ) + 1;
+
+    /* see if we got the reservation */
+    if ( rsrv <= lim )
+    {
+        uint32_t idx = rsrv & RC_LOC_QUEUE_MASK;
+        RC_loc_queue [ idx ] . filename = filename;
+        RC_loc_queue [ idx ] . function = funcname;
+        RC_loc_queue [ idx ] . lineno = lineno;
+        RC_loc_queue [ idx ] . rc = rc;
+        /* TBD - proper release sequence */
+        atomic32_set ( & RC_loc_written, rsrv );
+    }
+
+    return rc;
+}
+
+/* GetUnreadRCInfo
+ *  expected to be called after all threads are quiet
+ */
+LIB_EXPORT bool CC GetUnreadRCInfo ( rc_t *rc, const char **filename, const char **funcname, uint32_t *lineno )
+{
+    int32_t last_writ;
+
+    reporting_unread = true;
+
+    /* these are not atomic, but the ordering is important */
+    last_writ = atomic32_read ( & RC_loc_written );
+    if ( last_writ > 0 )
+    {
+        /* this arrangement attempts to make the access to
+           RC_loc_read dependent upon access to RC_loc_written */
+        int32_t last_read = atomic32_read ( & RC_loc_read );
+        if ( last_read < last_writ )
+        {
+            /* check reserved slots */
+            int32_t rsrv = atomic32_read ( & RC_loc_reserve );
+
+            /* adjust last read */
+            if ( last_writ - last_read > RC_LOC_QUEUE_SIZE )
+                last_read = last_writ - RC_LOC_QUEUE_SIZE;
+
+            /* any reserved rows must be considered overwritten */
+            last_read += rsrv - last_writ;
+
+            /* these are the rows we can report */
+            if ( last_read < last_writ )
+            {
+                int32_t idx = last_read + 1;
+                atomic32_set ( & RC_loc_read, idx );
+
+                if ( filename != NULL )
+                    * filename = get_rc_filename ( idx );
+                if ( funcname != NULL )
+                    * funcname = get_rc_function ( idx );
+                if ( lineno != NULL )
+                    * lineno = get_rc_lineno ( idx );
+                if ( rc != NULL )
+                    * rc = get_rc_code ( idx );
+
+                return true;
+            }
+        }
+    }
+    reporting_unread = false;
+    return false;
+}
diff --git a/libs/kns/Makefile b/libs/kns/Makefile
new file mode 100644
index 0000000..e6f3067
--- /dev/null
+++ b/libs/kns/Makefile
@@ -0,0 +1,116 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: all
+
+TOP ?= $(abspath ../..)
+MODULE = libs/kns
+
+INT_LIBS = \
+	libkns
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(KNS_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+RWORKDIR = $(TOP)/$(MODULE)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+
+# we are building it on all platforms now, because dependency on libcurl is removed
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# kns
+#
+$(ILIBDIR)/libkns: $(addprefix $(ILIBDIR)/libkns.,$(ILIBEXT))
+
+KNS_NO_HTTP_SRC = \
+	kns_manager-ext \
+	manager \
+	buffered-stream \
+	stream \
+	stream-from-files \
+	stream-from-streams \
+	endpoint \
+	sysendpoint \
+	syssock \
+	sysstream \
+	sysmgr \
+	tls
+
+ifneq (win,$(OS))
+KNS_NO_HTTP_SRC += \
+	syspoll
+endif
+
+KNS_SRC = \
+	$(KNS_NO_HTTP_SRC) \
+	http-file          \
+	http-client        \
+	http-retrier       \
+	http               \
+
+KNS_OBJ = \
+	$(addsuffix .$(LOBX),$(KNS_SRC))
+
+KNS_LIB = \
+    -lkfs \
+	-dklib
+
+$(ILIBDIR)/libkns.$(LIBX): $(KNS_OBJ)
+	$(LD) --slib -o $@ $^ $(KNS_LIB)
+
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/kns/buffered-stream.c b/libs/kns/buffered-stream.c
new file mode 100644
index 0000000..c0ae3e9
--- /dev/null
+++ b/libs/kns/buffered-stream.c
@@ -0,0 +1,249 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+typedef struct KBufferedStream KBufferedStream;
+#define KSTREAM_IMPL KBufferedStream
+
+#include <kns/extern.h>
+#include <kns/stream.h>
+#include <kns/impl.h>
+#include <kfs/file.h>
+#include <kfs/impl.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "stream-priv.h"
+
+#define DEFAULT_BUFFER_SIZE ( 32 * 1024 )
+
+/* the object structure for THIS implementation */
+struct  KBufferedStream
+{
+    /* THIS MUST COME FIRST */
+    KStream dad;
+
+    const KStream * in;
+    KStream * out;
+
+    size_t buffer_size;
+
+    uint8_t * in_buffer;
+    size_t in_marker;
+    size_t in_limit;
+
+    uint8_t * out_buffer;
+    size_t out_marker;
+};
+
+
+/* the required methods */
+
+static
+rc_t CC KBufferedStreamWhack ( KBufferedStream *self )
+{
+    if ( self -> out_buffer != NULL && self -> out_marker != 0 )
+    {
+        size_t num_writ;
+        KStreamWriteAll ( self -> out, self -> out_buffer, self -> out_marker, & num_writ );
+    }
+
+    KStreamRelease ( self -> in );
+    KStreamRelease ( self -> out );
+
+    if ( self -> in_buffer != NULL )
+        free ( self -> in_buffer );
+    if ( self -> out_buffer != NULL )
+        free ( self -> out_buffer );
+
+    free ( self );
+    return 0;
+}
+
+static
+rc_t CC KBufferedStreamRead ( const KBufferedStream *cself,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    KBufferedStream * self = ( KBufferedStream * ) cself;
+
+    size_t avail = self -> in_limit - self -> in_marker;
+    if ( avail == 0 )
+    {
+        size_t limit;
+        rc_t rc = KStreamRead ( self -> in, self -> in_buffer, self -> buffer_size, & limit );
+        if ( rc != 0 )
+        {
+            * num_read = 0;
+            return rc;
+        }
+
+        self -> in_marker = 0;
+        avail = self -> in_limit = limit;
+
+        if ( limit == 0 )
+        {
+            * num_read = 0;
+            return 0;
+        }
+    }
+
+    if ( bsize > avail )
+        bsize = avail;
+
+    memmove ( buffer, & self -> in_buffer [ self -> in_marker ], bsize );
+    self -> in_marker += bsize;
+
+    * num_read = bsize;
+    return 0;
+}
+
+static
+rc_t CC KBufferedStreamWrite ( KBufferedStream * self,
+    const void * buffer, size_t size, size_t * total_writ )
+{
+    const uint8_t * p = buffer;
+
+    size_t total, num_writ = 0;
+    for ( total = 0; total < size; total += num_writ )
+    {
+        size_t avail = self -> buffer_size - self -> out_marker;
+        if ( avail == 0 )
+        {
+            rc_t rc = KStreamWriteAll ( self -> out, self -> out_buffer, self -> out_marker, & num_writ );
+            if ( rc != 0 )
+            {
+                * total_writ = 0;
+                return rc;
+            }
+            if ( num_writ != self -> out_marker )
+            {
+                * total_writ = total;
+                return RC ( rcNS, rcStream, rcWriting, rcTransfer, rcIncomplete );
+            }
+
+            self -> out_marker = 0;
+            avail = self -> buffer_size;
+        }
+
+        num_writ = size - total;
+        if ( num_writ > avail )
+            num_writ = avail;
+
+        memmove ( & self -> out_buffer [ self -> out_marker ], & p [ total ], num_writ );
+        self -> out_marker += num_writ;
+    }
+
+    * total_writ = total;
+    return 0;
+}
+
+/* the vtable */
+static KStream_vt_v1 vtKBufferedStream =
+{
+    1, 0,
+    KBufferedStreamWhack,
+    KBufferedStreamRead,
+    KBufferedStreamWrite
+};
+
+
+/* MakeBuffered
+ *  makes a one or two-way stream buffer
+ */
+LIB_EXPORT rc_t CC KStreamMakeBuffered ( KStream ** buffered,
+    const KStream * in, KStream * out, size_t buffer_size )
+{
+    rc_t rc;
+
+    if ( buffered == NULL )
+        rc = RC ( rcNS, rcStream, rcConstructing, rcParam, rcNull );
+    else
+    {
+        bool can_read = ( in == NULL ) ? false : in -> read_enabled;
+        bool can_write = ( out == NULL ) ? false : out -> write_enabled;
+
+        if ( ! can_read && ! can_write )
+            rc = RC ( rcNS, rcStream, rcConstructing, rcStream, rcNoPerm );
+        else
+        {
+            KBufferedStream * bs = calloc ( 1, sizeof * bs );
+            if ( bs == NULL )
+                rc = RC ( rcNS, rcStream, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KStreamInit ( & bs -> dad, ( const KStream_vt* ) & vtKBufferedStream, 
+                    "KBufferedStream", "adapter", can_read, can_write );
+                if ( rc == 0 )
+                {
+                    bs -> buffer_size = buffer_size ? buffer_size : DEFAULT_BUFFER_SIZE;
+                    if ( in != NULL )
+                        bs -> in_buffer = malloc ( bs -> buffer_size );
+                    if ( out != NULL )
+                        bs -> out_buffer = malloc ( bs -> buffer_size );
+                    if ( ( in != NULL && bs -> in_buffer == NULL ) ||
+                         ( out != NULL && bs -> out_buffer == NULL ) )
+                    {
+                        rc = RC ( rcNS, rcStream, rcConstructing, rcMemory, rcExhausted );
+                    }
+                    else
+                    {
+                        rc = KStreamAddRef ( in );
+                        if ( rc == 0 )
+                        {
+                            rc = KStreamAddRef ( out );
+                            if ( rc ==  0 )
+                            {
+                                bs -> in = in;
+                                bs -> out = out;
+                                * buffered = & bs -> dad;
+                                
+                                return 0;
+                            }
+                            
+                            KStreamRelease ( in );
+                        }
+                    }
+
+                    if ( bs -> in_buffer != NULL )
+                        free ( bs -> in_buffer );
+                    if ( bs -> out_buffer != NULL )
+                        free ( bs -> out_buffer );
+                }
+
+                free ( bs );
+            }
+        }
+
+        * buffered = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/kns/endpoint.c b/libs/kns/endpoint.c
new file mode 100644
index 0000000..b1b76b9
--- /dev/null
+++ b/libs/kns/endpoint.c
@@ -0,0 +1,155 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kns/impl.h>
+#include <kns/endpoint.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include "stream-priv.h"
+
+#include <string.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+
+/* InitIPv4Endpoint
+ *  initialize the endpoint with an IPv4 address and port
+ *
+ *  "ep" [ OUT ] - address of endpoint block to be intialized
+ *
+ *  "ipv4" [ IN, DEFAULT 0 ] - binary IPv4 address in native integer byte order
+ *   i.e. 0x7F000001 represents 127.0.0.1. if the special address 0 is given, it
+ *   represents any host-local interface address.
+ *
+ *  "port" [ IN, DEFAULT 0 ] - binary port number in native integer byte order.
+ *   if the special port number 0 is given, it represents any available port.
+ */
+LIB_EXPORT 
+rc_t CC KNSManagerInitIPv4Endpoint ( struct KNSManager const *self,
+    KEndPoint *ep, uint32_t ipv4, uint16_t port )
+{
+    rc_t rc;
+
+    if ( ep == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcInitializing, rcParam, rcNull);
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcInitializing, rcSelf, rcNull );
+        else
+        {
+            ep -> type = epIPV4;
+            ep -> u . ipv4. addr = ipv4;
+            ep -> u. ipv4 . port = port;
+            return 0;
+        }
+
+        memset ( ep, 0, sizeof * ep );
+    }
+    return rc;
+}
+
+
+/* InitIPv6Endpoint
+ *  initialize the endpoint with an IPv6 address and port
+ *
+ *  "ep" [ OUT ] - address of endpoint block to be intialized
+ *
+ *  "ipv6" [ IN, DEFAULT NULL ] - binary IPv6 address in native integer byte order
+ *   has to point to a 16-byte long array ( = 128 bit ). The function will make
+ *   a copy of this array. 0x1 represents 0:0:0:0:0:0:0:1 the loopback-device.
+ *   If the special address ::0 is given, it represents any host-local interface
+ *   address. ( in6addr_any is a 16-byte array with all bytes set to zero )
+ *   If a NULL-pointer is passed in, the function treats it as in6addr_any.
+ *
+ *  "port" [ IN, DEFAULT 0 ] - binary port number in native integer byte order.
+ *   if the special port number 0 is given, it represents any available port.
+ */
+LIB_EXPORT
+rc_t CC KNSManagerInitIPv6Endpoint ( struct KNSManager const *self,
+    KEndPoint *ep, uint8_t *ipv6, uint16_t port )
+{
+    rc_t rc;
+
+    if ( ep == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcInitializing, rcParam, rcNull);
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcInitializing, rcSelf, rcNull );
+        else
+        {
+            ep -> type = epIPV6;
+            if ( ipv6 == NULL )
+                memset ( ep -> u . ipv6 . addr, 0, sizeof ( ep -> u . ipv6 . addr ) );
+            else
+                memmove ( ep -> u . ipv6 . addr, ipv6, sizeof ( ep -> u . ipv6 . addr ) );
+            ep -> u. ipv6 . port = port;
+            return 0;
+        }
+
+        memset ( ep, 0, sizeof * ep );
+    }
+    return rc;
+}
+
+
+
+/* InitIPCEndpoint
+ *  initialize the endpoint for interprocess communication
+ *
+ *  "ep" [ OUT ] - address of endpoint block to be intialized
+ *
+ *  "name" [ IN ] - IPC channel name (a POSIX path to a Unix socket, or a name of a Windows pipe)
+ */
+LIB_EXPORT 
+rc_t CC KNSManagerInitIPCEndpoint ( struct KNSManager const *self,
+    KEndPoint *ep, struct String const * name )
+{
+    rc_t rc;
+
+    if ( ep == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcInitializing, rcParam, rcNull);
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcInitializing, rcSelf, rcNull );
+        else
+        {
+            size_t copied = string_copy(ep -> u.ipc_name, IPC_NAME_MAX - 1, name->addr, name->len);
+            if (copied != name->len)
+                rc = RC ( rcNS, rcNoTarg, rcInitializing, rcSize, rcExcessive );
+            ep -> u.ipc_name[copied] = 0;
+            ep -> type = epIPC;
+            return 0;
+        }
+
+        memset ( ep, 0, sizeof * ep );
+    }
+    return rc;
+}
diff --git a/libs/kns/http-client.c b/libs/kns/http-client.c
new file mode 100644
index 0000000..b022e1b
--- /dev/null
+++ b/libs/kns/http-client.c
@@ -0,0 +1,3575 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+
+#include <kns/extern.h>
+
+#define KSTREAM_IMPL KClientHttpStream
+typedef struct KClientHttpStream KClientHttpStream;
+
+#include <kns/manager.h>
+#include <kns/http.h>
+#include <kns/adapt.h>
+#include <kns/endpoint.h>
+#include <kns/http-priv.h> /* KClientHttpResultFormatMsg */
+#include <kns/socket.h>
+#include <kns/stream.h>
+#include <kns/tls.h>
+#include <kns/impl.h>
+#include <vfs/path.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#ifdef ERR
+#undef ERR
+#endif
+
+#include <klib/debug.h>
+#include <klib/text.h>
+#include <klib/container.h>
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/status.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <klib/vector.h>
+#include <kproc/timeout.h>
+
+#include <strtol.h>
+#include <va_copy.h>
+
+#include "mgr-priv.h"
+#include "stream-priv.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+#include "http-priv.h"
+
+
+#if _DEBUGGING && 0
+#include <stdio.h>
+#define TRACE( x, ... ) \
+    fprintf ( stderr, "@@ %s:%d: %s: " x, __FILE__, __LINE__, __func__, __VA_ARGS__ )
+#elif _DEBUGGING && defined _h_klib_status_ && 0
+#define TRACE( x, ... ) \
+    STATUS ( 0, "@@ %s:%d: %s: " x, __FILE__, __LINE__, __func__, __VA_ARGS__ )
+#else
+#define TRACE( x, ... ) \
+    ( ( void ) 0 )
+#endif
+
+static 
+void  KDataBufferClear ( KDataBuffer *buf )
+{
+    memset ( buf, 0, sizeof *buf );
+    buf -> elem_bits = 8;
+}
+
+#if _DEBUGGING
+static
+bool KDataBufferContainsString ( const KDataBuffer *buf, const String *str )
+{
+    return str -> addr >= ( const char* ) buf -> base &&
+        & str -> addr [ str -> size ] <= & ( ( const char* ) buf -> base ) [ buf -> elem_count ];
+}
+#endif
+
+/*--------------------------------------------------------------------------
+ * KClientHttp
+ *  hyper text transfer protocol 
+ *  structure that will act as the 'client' for networking tasks
+ */
+struct KClientHttp
+{
+    const KNSManager *mgr;
+    KStream * sock;
+
+    /* buffer for accumulating response data from "sock" */
+    KDataBuffer block_buffer;
+    size_t block_valid;         /* number of valid response bytes in buffer            */
+    size_t block_read;          /* number of bytes read out by line reader or stream   */
+    size_t body_start;          /* offset to first byte in body                        */
+
+    KDataBuffer line_buffer;    /* data accumulates for reading headers and chunk size */
+    size_t line_valid;
+
+    KDataBuffer hostname_buffer;
+    String hostname; 
+    uint32_t port;
+
+    ver_t vers;
+
+    KRefcount refcount;
+
+    int32_t read_timeout;
+    int32_t write_timeout;
+
+    KEndPoint ep;
+    bool ep_valid;
+    bool proxy_ep;
+    bool proxy_default_port;
+    
+    bool reliable;
+    bool tls;
+};
+
+
+#define KClientHttpBlockBufferIsEmpty( self ) \
+    ( ( self ) -> block_read == ( self ) -> block_valid )
+
+#define KClientHttpBlockBufferReset( self ) \
+    ( ( void ) ( ( self ) -> block_valid = ( self ) -> block_read = 0 ) )
+
+#define KClientHttpLineBufferReset( self ) \
+    ( ( void ) ( ( self ) -> line_valid = 0 ) )
+    
+void KClientHttpClose ( KClientHttp *self )
+{
+    KStreamRelease ( self -> sock );
+    self -> sock = NULL;
+
+    KClientHttpBlockBufferReset ( self );
+    KClientHttpLineBufferReset ( self );
+#if 0
+    TRACE ( "closed connection%c", '\n' );
+#endif
+}
+
+
+/* used to be in whack function, but we needed the ability
+   to clear out the http object for redirection */
+static
+rc_t KClientHttpClear ( KClientHttp *self )
+{
+    KClientHttpClose ( self );
+
+    KDataBufferWhack ( & self -> hostname_buffer );
+    self -> tls = false;
+
+    return 0;
+}
+
+static
+rc_t KClientHttpWhack ( KClientHttp * self )
+{
+    KClientHttpClear ( self );
+    
+    KDataBufferWhack ( & self -> block_buffer );
+    KDataBufferWhack ( & self -> line_buffer );
+    KNSManagerRelease ( self -> mgr );
+    KRefcountWhack ( & self -> refcount, "KClientHttp" );
+    free ( self );
+
+    return 0;
+}
+
+
+typedef struct KEndPointArgsIterator KEndPointArgsIterator;
+struct KEndPointArgsIterator
+{
+    const HttpProxy * proxy;
+    const String * hostname;
+    uint16_t port;
+    uint16_t dflt_proxy_ports [ 2 ];
+    size_t dflt_proxy_ports_idx;
+    bool done;
+};
+
+static
+void KEndPointArgsIteratorMake ( KEndPointArgsIterator * self,
+    const KNSManager * mgr, const String * hostname, uint16_t port )
+{
+    assert ( self );
+    memset ( self, 0, sizeof * self );
+
+    self -> dflt_proxy_ports [ 0 ] = 3128;
+    self -> dflt_proxy_ports [ 1 ] = 8080;
+
+    if ( ! mgr -> http_proxy_only )
+    {
+        self -> hostname = hostname;
+        self -> port = port;
+    }
+
+    if ( mgr -> http_proxy_enabled )
+        self -> proxy = KNSManagerGetHttpProxy ( mgr );
+
+    if ( self -> hostname == NULL && self -> proxy == NULL )
+        self -> done = true;
+}
+
+static
+bool KEndPointArgsIteratorNext ( KEndPointArgsIterator * self,
+    const String ** hostname, uint16_t * port,
+    bool * proxy_default_port, bool * proxy_ep )
+{
+    static const uint16_t dflt_proxy_ports_sz =
+        sizeof self -> dflt_proxy_ports / sizeof self -> dflt_proxy_ports [ 0 ];
+
+    assert ( self != NULL );
+
+    if ( self -> done )
+        return false;
+
+    assert ( hostname && port && proxy_default_port && proxy_ep );
+
+    /* DO NOT WHACK hostname !!! */
+    HttpProxyGet ( self -> proxy, hostname, port );
+
+    * proxy_default_port = false;
+
+    if ( * hostname != NULL )
+    {
+        if ( * port != 0 )
+            self -> dflt_proxy_ports_idx = 0;
+        else
+        {
+            assert ( self -> dflt_proxy_ports_idx < dflt_proxy_ports_sz );
+            * port = self -> dflt_proxy_ports [ self -> dflt_proxy_ports_idx ];
+
+            if ( ++ self -> dflt_proxy_ports_idx >= dflt_proxy_ports_sz )
+                self -> dflt_proxy_ports_idx = 0;
+
+            * proxy_default_port = true;
+        }
+
+        if ( self -> dflt_proxy_ports_idx == 0 )
+            self -> proxy = HttpProxyGetNextHttpProxy ( self -> proxy );
+
+        * proxy_ep = true;
+        return true;
+    }
+
+    self -> done = true;
+    if ( self -> hostname != NULL )
+    {
+        * hostname = self -> hostname;
+        * port = self -> port;
+        * proxy_ep = false;
+        return true;
+    }
+
+    return false;
+}
+
+static
+rc_t KClientHttpGetLine ( KClientHttp *self, struct timeout_t *tm );
+
+static
+rc_t KClientHttpGetStatusLine ( KClientHttp *self, timeout_t *tm, String *msg, uint32_t *status, ver_t *version );
+
+static
+rc_t KClientHttpProxyConnect ( KClientHttp * self, const String * hostname, uint32_t port, KSocket * sock,
+    const String * phostname, uint32_t pport )
+{
+    rc_t rc;
+
+    STATUS ( STAT_GEEK, "%s - extracting stream from socket\n", __func__ );
+    assert ( sock != NULL );
+    rc = KSocketGetStream ( sock, & self -> sock );
+    if ( rc == 0 )
+    {
+        uint32_t port_save;
+        String hostname_save, hostname_copy;
+
+        size_t len;
+        char buffer [ 4096 ];
+
+        STATUS ( STAT_GEEK, "%s - saving hostname and port\n", __func__ );
+        hostname_save = self -> hostname;
+        port_save = self -> port;
+
+        STATUS ( STAT_GEEK, "%s - saving hostname param\n", __func__ );
+        hostname_copy = * hostname;
+
+        assert ( hostname != NULL );
+        STATUS ( STAT_GEEK, "%s - setting hostname and port to '%S:%u'\n", __func__, phostname, pport );
+        self -> hostname = * phostname;
+        self -> port = pport;
+
+        /* format CONNECT request */
+        rc = string_printf ( buffer, sizeof buffer, & len,
+                             "CONNECT %S:%u HTTP/1.1\r\n"
+                             "Host: %S:%u\r\n\r\n"
+                             , & hostname_copy
+                             , port
+                             , & hostname_copy
+                             , port
+            );
+
+        if ( rc != 0 )
+            DBGMSG ( DBG_KNS, DBG_FLAG ( DBG_KNS ), ( "Failed to create proxy request: %R\n", rc ) );
+        else
+        {
+            size_t sent;
+            timeout_t tm;
+
+            STATUS ( STAT_QA, "%s - created proxy request '%.*s'\n", __func__, ( uint32_t ) len, buffer );
+
+            /* send request and receive a response */
+            STATUS ( STAT_PRG, "%s - sending proxy request\n", __func__ );
+            TimeoutInit ( & tm, self -> write_timeout );
+            rc = KStreamTimedWriteAll ( self -> sock, buffer, len, & sent, & tm );
+            if ( rc != 0 )
+                DBGMSG ( DBG_KNS, DBG_FLAG ( DBG_KNS ), ( "Failed to send proxy request: %R\n", rc ) );
+            else
+            {
+                String msg;
+                ver_t version;
+                uint32_t status;
+
+                assert ( sent == len );
+
+                STATUS ( STAT_PRG, "%s - reading proxy response status line\n", __func__ );
+                TimeoutInit ( & tm, self -> read_timeout );
+                rc = KClientHttpGetStatusLine ( self, & tm, & msg, & status, & version );
+                if ( rc != 0 )
+                    DBGMSG ( DBG_KNS, DBG_FLAG ( DBG_KNS ), ( "Failed to read proxy response: %R\n", rc ) );
+                else
+                {
+                    if ( ( status / 100 ) != 2 )
+                    {
+                        rc = RC ( rcNS, rcNoTarg, rcOpening, rcConnection, rcFailed );
+                        DBGMSG ( DBG_KNS, DBG_FLAG ( DBG_KNS ), ( "Failed to create proxy tunnel: %03u '%S'\n", status, & msg ) );
+                        KClientHttpBlockBufferReset ( self );
+                        KClientHttpLineBufferReset ( self );
+                    }
+                    else
+                    {
+                        STATUS ( STAT_QA, "%s - read proxy response status line: %03u '%S'\n", __func__, status, & msg );
+                        do
+                            rc = KClientHttpGetLine ( self, & tm );
+                        while ( self -> line_valid != 0 );
+                    }
+                }
+            }
+        }
+
+        STATUS ( STAT_GEEK, "%s - restoring hostname and port\n", __func__ );
+        self -> hostname = hostname_save;
+        self -> port = port_save;
+
+        STATUS ( STAT_GEEK, "%s - releasing socket stream\n", __func__ );
+        KStreamRelease ( self -> sock );
+        self -> sock = NULL;
+    }
+
+    return rc;
+}
+
+
+static
+rc_t KClientHttpOpen ( KClientHttp * self, const String * aHostname, uint32_t aPort )
+{
+    rc_t rc = 0;
+    KSocket * sock = NULL;
+    const String * hostname = NULL;
+    uint16_t port = 0;
+    bool proxy_default_port = false;
+    bool proxy_ep = false;
+    KEndPointArgsIterator it;
+    const KNSManager * mgr = NULL;
+
+    STATUS ( STAT_QA, "%s - opening socket to %S:%u\n", __func__, aHostname, aPort );
+
+    assert ( self != NULL );
+    mgr = self -> mgr;
+
+    KEndPointArgsIteratorMake ( & it, mgr, aHostname, aPort  );
+    while ( KEndPointArgsIteratorNext
+        ( & it, & hostname, & port, & proxy_default_port, & proxy_ep ) )
+    {
+        rc = KNSManagerInitDNSEndpoint ( mgr, & self -> ep, hostname, port );
+        if ( rc == 0 )
+        {
+            self -> proxy_default_port = proxy_default_port;
+            self -> proxy_ep = proxy_ep;
+        }
+        if ( rc == 0 )
+        {
+            /* try to establish a connection */
+            rc = KNSManagerMakeTimedConnection ( mgr, & sock,
+              self -> read_timeout, self -> write_timeout, NULL, & self -> ep );
+
+            /* if we connected to a proxy, try to follow-through to server */
+            if ( proxy_ep && self -> tls && rc == 0 )
+                rc = KClientHttpProxyConnect ( self, aHostname, aPort, sock, hostname, port );
+
+            if ( rc == 0 )
+            {
+                /* this is a good endpoint */
+                self -> ep_valid = true;
+                break;
+            }
+
+            /* here rc is not 0, so we release the socket */
+            KSocketRelease ( sock );
+            sock = NULL;
+        }
+    }
+
+    /* if the connection is open */
+    if ( rc == 0 )
+    {
+        STATUS ( STAT_USR, "%s - connected to %S\n", __func__, hostname );
+        if ( self -> tls )
+        {
+            KTLSStream * tls_stream;
+
+            STATUS ( STAT_PRG, "%s - creating TLS wrapper on socket\n", __func__ );
+            rc = KNSManagerMakeTLSStream ( mgr, & tls_stream, sock, aHostname );
+
+            if ( rc != 0 )
+            {
+                if ( ! proxy_ep )
+                    DBGMSG ( DBG_KNS, DBG_FLAG ( DBG_KNS ), ( "Failed to create TLS stream for '%S'\n", aHostname ) );
+                else
+                {
+                    STATUS ( STAT_PRG, "%s - retrying TLS wrapper on socket with proxy hostname\n", __func__ );
+                    rc = KNSManagerMakeTLSStream ( mgr, & tls_stream, sock, hostname );
+                    if ( rc != 0 )
+                        DBGMSG ( DBG_KNS, DBG_FLAG ( DBG_KNS ), ( "Failed to create TLS stream for '%S'\n", hostname ) );
+                }
+            }
+
+            KSocketRelease ( sock );
+
+            if ( rc == 0 )
+            {
+                STATUS ( STAT_USR, "%s - verifying CA cert\n", __func__ );
+                rc = KTLSStreamVerifyCACert ( tls_stream );
+                if ( rc != 0 )
+                {
+                    LOGERR ( klogErr, rc, "failed to verify CA cert" );
+                    STATUS ( STAT_QA, "%s - WARNING: failed to verify CA cert - %R\n", __func__, rc );
+                }
+
+                if ( rc == 0 )
+                {
+                    STATUS ( STAT_PRG, "%s - extracting TLS wrapper as stream\n", __func__ );
+                    rc = KTLSStreamGetStream ( tls_stream, & self -> sock );
+                }
+
+                KTLSStreamRelease ( tls_stream );
+            }
+        }
+        else
+        {
+            STATUS ( STAT_PRG, "%s - extracting stream from socket\n", __func__ );
+            rc = KSocketGetStream ( sock, & self -> sock );
+            KSocketRelease ( sock );
+        }
+
+        if ( rc == 0 )
+        {
+            STATUS ( STAT_PRG, "%s - setting port number - %d\n", __func__, aPort );
+            self -> port = aPort;
+            return 0;
+        }
+    }
+
+    self -> sock = NULL;
+    return rc;
+}
+
+
+#if _DEBUGGING
+/* we need this hook to be able to test the re-connection logic */
+static struct KStream * (*ClientHttpReopenCallback) ( void ) = NULL;
+
+void SetClientHttpReopenCallback ( struct KStream * (*fn) ( void ) )
+{
+    ClientHttpReopenCallback = fn;
+}
+#endif
+
+rc_t KClientHttpReopen ( KClientHttp * self )
+{
+#if _DEBUGGING
+    if ( ClientHttpReopenCallback != NULL )
+    {
+        self -> sock = ClientHttpReopenCallback ();
+        return 0;
+    }
+#endif
+    
+    KClientHttpClose ( self );
+    return KClientHttpOpen ( self, & self -> hostname, self -> port );
+}
+
+/* Initialize KClientHttp object */
+static
+rc_t KClientHttpInit ( KClientHttp * http, const KDataBuffer *hostname_buffer, KStream * conn, ver_t _vers, const String * _host, uint32_t port, bool tls )
+{
+    rc_t rc;
+
+    if ( port == 0 )
+        rc = RC ( rcNS, rcNoTarg, rcInitializing, rcParam, rcInvalid );
+
+    /* early setting of TLS property */
+    http -> tls = tls;
+
+    /* we accept a NULL connection ( from ) */
+    if ( conn == NULL )
+        rc = KClientHttpOpen ( http, _host, port );
+    else
+    {
+        rc = KStreamAddRef ( conn );
+        if ( rc == 0 )
+            http -> sock = conn;
+    }
+
+    if ( rc == 0 )
+    {
+        http -> port = port;
+        http -> vers = _vers & 0xFFFF0000; /* safety measure - limit to major.minor */
+
+
+        /* YOU NEED AN assert HERE TO ENSURE _host IS WITHIN hostname_buffer */
+        assert ( KDataBufferContainsString ( hostname_buffer, _host ) );
+
+        /* initialize hostname buffer from external buffer */
+        rc = KDataBufferSub ( hostname_buffer, &http -> hostname_buffer,
+                              ( _host -> addr - ( const char* ) hostname_buffer -> base ),
+                              _host -> size );
+        if ( rc == 0 )
+        {
+            /* Its safe to assign pointer because we know
+               that the pointer is within the buffer */
+            http -> hostname = * _host;
+        }
+    }
+    
+    return rc;
+} 
+
+
+/* MakeHttp
+ *  create an HTTP protocol
+ *
+ *  "http" [ OUT ] - return parameter for HTTP object
+ *
+ *  "opt_conn" [ IN ] - previously opened stream for communications.
+ *
+ *  "vers" [ IN ] - http version
+ *   the only legal types are 1.0 ( 0x01000000 ) and 1.1 ( 0x01010000 )
+ *
+ *  "host" [ IN ] - parameter to give the host dns name for the connection
+ *
+ *  "port" [ IN, DEFAULT ZERO ] - if zero, defaults to standard for scheme
+ *   if non-zero, is taken as explicit port specification
+ *
+ *  "reliable" [ IN ] - if true, then trust that the settings are good
+ *   and apply extra stubbornness to fail
+ *
+ *  "tls" [ IN ] - if true, wrap socket in a TLS encryption protocol
+ */
+rc_t KNSManagerMakeClientHttpInt ( const KNSManager *self, KClientHttp **_http,
+    const KDataBuffer *hostname_buffer,  KStream *opt_conn,
+    ver_t vers, int32_t readMillis, int32_t writeMillis,
+    const String *host, uint32_t port, bool reliable, bool tls )
+{
+    rc_t rc;
+
+    KClientHttp * http = ( KClientHttp * ) calloc ( 1, sizeof * http );
+    if ( http == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcAllocating, rcMemory, rcNull );
+    else
+    {
+        rc = KNSManagerAddRef ( self );
+        if ( rc == 0 )
+        {
+            char save, *text;
+
+            http -> mgr = self;
+            http -> read_timeout = readMillis;
+            http -> write_timeout = writeMillis;
+
+            /* Dont use MakeBytes because we dont need to allocate memory
+               and we only need to know that the elem size is 8 bits */
+            KDataBufferClear ( & http -> block_buffer );
+            KDataBufferClear ( & http -> line_buffer );
+
+            /* make sure address of bost is within hostname_buffer */
+            assert ( KDataBufferContainsString ( hostname_buffer, host ) );
+
+            /* SET TEXT TO POINT TO THE HOST NAME AND NUL TERMINATE IT FOR DEBUGGING
+             Its safe to modify the const char array because we allocated the buffer*/ 
+            text = ( char* ) ( host -> addr );
+            save = text [ host -> size ];
+            text [ host -> size ] = 0;
+        
+            /* initialize reference counter on object to 1 - text is now nul-terminated */
+            KRefcountInit ( & http -> refcount, 1, "KClientHttp", "make", text );
+
+            text [ host -> size ] = save;
+
+            /* init the KClientHttp object */
+            rc = KClientHttpInit ( http, hostname_buffer, opt_conn, vers, host, port, tls );
+            if ( rc == 0 )
+            {
+                http -> reliable = reliable;
+
+                /* assign to OUT http param */
+                * _http = http;
+                return 0;
+            }
+
+            KNSManagerRelease ( self );
+        }
+                
+        free ( http );
+    }
+
+    return rc;
+}
+
+static
+rc_t KNSManagerMakeTimedClientHttpInt ( const KNSManager *self,
+    KClientHttp **_http, KStream *opt_conn, ver_t vers, int32_t readMillis, int32_t writeMillis,
+    const String *host, uint32_t port, uint32_t dflt_port, bool tls )
+{
+    rc_t rc;
+    
+    /* check return parameters */
+    if ( _http == NULL )
+        rc = RC ( rcNS, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        /* check input parameters */
+        if ( self == NULL )
+            rc = RC ( rcNS, rcMgr, rcConstructing, rcSelf, rcNull );
+        /* make sure we have one of the two versions supported - 1.0, 1.1 */
+        else if ( vers < 0x01000000 || vers > 0x01010000 )
+            rc = RC ( rcNS, rcMgr, rcConstructing, rcParam, rcBadVersion );
+        else if ( host == NULL )
+            rc = RC ( rcNS, rcMgr, rcConstructing, rcPath, rcNull );
+        /* make sure there is data in the host name */
+        else if ( host -> size == 0 )
+            rc = RC ( rcNS, rcMgr, rcConstructing, rcPath, rcEmpty );
+        else
+        {
+            KDataBuffer hostname_buffer;
+
+            /* create storage buffer for hostname */
+            rc = KDataBufferMakeBytes ( & hostname_buffer, host -> size + 1 );
+            if ( rc == 0 )
+            {
+                String _host;
+
+                /* copy hostname with nul termination */
+                string_copy ( ( char * ) hostname_buffer . base,
+                              ( size_t ) hostname_buffer . elem_count,
+                              host -> addr, host -> size );
+
+                /* create copy of host that points into new buffer */
+                StringInit ( & _host, ( const char * ) hostname_buffer . base,
+                             host -> size, host -> len );
+
+                /* limit timeouts */
+                if ( readMillis < 0 )
+                    readMillis = -1;
+                else if ( readMillis > MAX_HTTP_READ_LIMIT )
+                    readMillis = MAX_HTTP_READ_LIMIT;
+                if ( writeMillis < 0 )
+                    writeMillis = -1;
+                else if ( writeMillis > MAX_HTTP_WRITE_LIMIT )
+                    writeMillis = MAX_HTTP_WRITE_LIMIT;
+
+                /* default port */
+                if ( port == 0 )
+                    port = dflt_port;
+
+                /* initialize http object - will create a new reference to hostname buffer */
+                rc = KNSManagerMakeClientHttpInt ( self, _http, & hostname_buffer,
+                    opt_conn, vers, readMillis, writeMillis, &_host, port, false, tls );
+
+                /* release our reference to buffer */
+                KDataBufferWhack ( & hostname_buffer );
+
+                if ( rc == 0 )
+                    return 0;
+            }
+        }
+
+        * _http = NULL;
+    }
+    
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KNSManagerMakeTimedClientHttp ( const KNSManager *self,
+    KClientHttp ** http, KStream *opt_conn, ver_t vers, int32_t readMillis, int32_t writeMillis,
+    const String *host, uint32_t port )
+{
+    return KNSManagerMakeTimedClientHttpInt ( self, http, opt_conn, vers, readMillis, writeMillis, host, port, 80, false );
+}
+
+LIB_EXPORT rc_t CC KNSManagerMakeClientHttp ( const KNSManager *self,
+    KClientHttp **http, KStream *opt_conn, ver_t vers, const String *host, uint32_t port )
+{
+    if ( self == NULL )
+    {
+        if ( http == NULL )
+            return RC ( rcNS, rcMgr, rcValidating, rcParam, rcNull );
+
+        * http = NULL;
+
+        return RC ( rcNS, rcMgr, rcValidating, rcSelf, rcNull );
+    }
+
+    return KNSManagerMakeTimedClientHttp ( self, http, opt_conn, vers,
+        self -> http_read_timeout, self -> http_write_timeout, host, port );
+}
+
+LIB_EXPORT rc_t CC KNSManagerMakeTimedClientHttps ( const KNSManager *self,
+    KClientHttp ** https, KStream *opt_conn, ver_t vers, int32_t readMillis, int32_t writeMillis,
+    const String *host, uint32_t port )
+{
+    return KNSManagerMakeTimedClientHttpInt ( self, https, opt_conn, vers, readMillis, writeMillis, host, port, 443, true );
+}
+
+LIB_EXPORT rc_t CC KNSManagerMakeClientHttps ( const KNSManager *self,
+    KClientHttp **https, KStream *opt_conn, ver_t vers, const String *host, uint32_t port )
+{
+    if ( self == NULL )
+    {
+        if ( https == NULL )
+            return RC ( rcNS, rcMgr, rcValidating, rcParam, rcNull );
+
+        * https = NULL;
+
+        return RC ( rcNS, rcMgr, rcValidating, rcSelf, rcNull );
+    }
+
+    return KNSManagerMakeTimedClientHttps ( self, https, opt_conn, vers,
+        self -> http_read_timeout, self -> http_write_timeout, host, port );
+}
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KClientHttpAddRef ( const KClientHttp *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KClientHttp" ) )
+        {
+        case krefLimit:
+            return RC ( rcNS, rcNoTarg, rcAttaching, rcRange, rcExcessive );
+        case krefNegative:
+            return RC ( rcNS, rcNoTarg, rcAttaching, rcSelf, rcInvalid );
+        default:
+            break;
+        }
+    }
+    
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KClientHttpRelease ( const KClientHttp *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KClientHttp" ) )
+        {
+        case krefWhack:
+            return KClientHttpWhack ( ( KClientHttp* ) self );
+        case krefNegative:
+            return RC ( rcNS, rcNoTarg, rcReleasing, rcRange, rcExcessive );
+        default:
+            break;
+        }
+    }
+    
+    return 0;
+}
+
+/* Communication Methods
+ *  Read in the http response and return 1 char at a time
+ */
+static
+rc_t KClientHttpGetCharFromResponse ( KClientHttp *self, char *ch, struct timeout_t *tm )
+{
+    rc_t rc;
+    char * buffer = ( char * ) self -> block_buffer . base;
+
+    /* check for data in buffer */
+    if ( KClientHttpBlockBufferIsEmpty ( self ) )
+    {
+        /* check to see ho many bytes are in the buffer */
+        size_t bsize = KDataBufferBytes ( & self -> block_buffer );
+
+        /* First time around, bsize will be 0 */
+        if ( bsize == 0 )
+        {
+            bsize = 64 * 1024;
+            rc = KDataBufferResize ( & self -> block_buffer, bsize );
+            if ( rc != 0 )
+                return rc;
+
+            /* re-assign new base pointer */
+            buffer = ( char * ) self -> block_buffer . base;
+        }
+
+        /* zero out offsets */
+        KClientHttpBlockBufferReset ( self );
+
+        /* read from the stream into the buffer, and record the bytes read
+           into block_valid */
+        /* NB - do NOT use KStreamReadAll or it will block with http 1.1 
+           because http/1.1 uses keep alive and the read will block until the server 
+           drops the connection */
+        rc = KStreamTimedRead ( self -> sock, buffer, bsize, & self -> block_valid, tm );
+        if ( rc != 0 )
+        {
+            KClientHttpClose ( self );
+            return rc;
+        }
+
+        /* if nothing was read, we have reached the end of the stream */
+        if ( self -> block_valid == 0 )
+        {
+            KClientHttpClose ( self );
+
+            /* return nul char */
+            * ch = 0;
+            return 0;
+        }
+    }
+
+    /* return the next char in the buffer */
+    * ch = buffer [ self -> block_read ++ ];
+    return 0;
+}
+
+/* Read and return entire lines ( until \r\n ) */
+static
+rc_t KClientHttpGetLine ( KClientHttp *self, struct timeout_t *tm )
+{
+    rc_t rc;
+
+    char * buffer = ( char * ) self -> line_buffer . base;
+    size_t bsize = KDataBufferBytes ( & self -> line_buffer );
+
+    /* num_valid bytes read starts at 0 */
+    self -> line_valid = 0;
+    while ( 1 )
+    {
+        char ch;
+
+        /* get char */
+        rc = KClientHttpGetCharFromResponse ( self, &ch, tm );
+        if ( rc != 0 )
+            break;
+
+        if ( ch == '\n' )
+        {
+            /* check that there are valid bytes read and the previous char is '\r' */
+            if ( self -> line_valid > 0 && buffer [ self -> line_valid - 1 ] == '\r' )
+            {
+                /* decrement number of valid bytes to remove '\r' */
+                -- self -> line_valid;
+            }
+            /* record end of line */
+            ch = 0;
+        }
+
+        /* check if the buffer is full */
+        if ( self -> line_valid == bsize )
+        {
+            /* I assume that the header lines will not be too large
+               so only need to increment  by small chunks */
+            bsize += 256;
+
+            /* TBD - place an upper limit on resize */
+
+            /* resize */
+            rc = KDataBufferResize ( & self -> line_buffer, bsize );
+            if ( rc != 0 )
+                return rc;
+
+            /* assign new base pointer */
+            buffer = ( char * ) self -> line_buffer . base;
+        }
+
+        /* buffer is not full, insert char into the buffer */
+        buffer [ self -> line_valid ] = ch;
+        
+        /* get out of loop if end of line */
+        if ( ch == 0 )
+        {
+#if _DEBUGGING
+            if ( KNSManagerIsVerbose ( self -> mgr ) ) {
+                size_t i = 0;
+                KOutMsg ( "KClientHttpGetLine: '" );
+                for (i = 0; i <= self->line_valid; ++i) {
+                    if (isprint(buffer[i])) {
+                        KOutMsg("%c", buffer[i]);
+                    }
+                    else {
+                        KOutMsg("\\%02X", buffer[i]);
+                    }
+                }
+                KOutMsg ( "'\n" );
+            }
+#endif
+            break;
+        }
+        /* not end of line - increase num of valid bytes read */
+        ++ self -> line_valid;
+    }
+
+    return rc;
+}
+
+/* AddHeaderString
+ *  performs task of entering a header into BSTree
+ *  or updating an existing node
+ *
+ * If header exists:
+ *  if (add) then add "value" to "header value"
+ *  else     replace "header value" with "value"
+ *
+ *  Headers are always made up of a name: value pair
+ */
+static
+rc_t KClientHttpAddHeaderString
+( BSTree *hdrs, bool add, const String *name, const String *value )
+{
+    rc_t rc = 0;
+
+    /* if there is no name - error */
+    if ( name -> size == 0 )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcInsufficient );
+    else
+    {
+        /* test for previous existence of node by name */
+        KHttpHeader * node = ( KHttpHeader * ) BSTreeFind ( hdrs, name, KHttpHeaderCmp );
+        if ( node == NULL )
+        {
+            /* node doesnt exist - allocate memory for a new one */
+            node = ( KHttpHeader * ) calloc ( 1, sizeof * node );
+            if ( node == NULL )
+                rc = RC ( rcNS, rcNoTarg, rcAllocating, rcMemory, rcNull );
+            else
+            {
+                /* size of the KDataBuffer to store string data */
+                size_t bsize = name -> size + value ->  size + 1;
+                rc = KDataBufferMakeBytes ( & node -> value_storage, bsize );
+                if ( rc == 0 )
+                {
+                    /* copy the string data into storage */
+                    rc = string_printf ( ( char *) node -> value_storage . base,
+                                         bsize, NULL,
+                                         "%S%S"
+                                         , name
+                                         , value );
+                    if ( rc == 0 )
+                    {
+                        /* initialize the Strings to point into KHttpHeader node */
+                        StringInit ( & node -> name,
+                            ( const char * ) node -> value_storage . base,
+                            name -> size, name -> len );
+                        StringInit ( & node -> value, node -> name . addr + name -> size, value -> size, value -> len );
+                        
+                        /* insert into tree, sorted by alphabetical order */
+                        BSTreeInsert ( hdrs, & node -> dad, KHttpHeaderSort );
+                        
+                        return 0;
+                    }
+                    
+                    KDataBufferWhack ( & node -> value_storage );
+                }
+                
+                free ( node );
+            }
+        }
+        
+        /* node exists
+           check that value param has data */
+        else if ( value -> size != 0 )
+        {
+          /* find the current size of the data in the node */
+          size_t cursize = node -> name . size + node -> value . size;
+          if ( add ) { /* add value to node -> value */
+            /* resize databuffer to hold the additional value data + comma + nul */
+            rc = KDataBufferResize ( & node -> value_storage, cursize + value -> size + 1 + 1 );
+            if ( rc == 0 )
+            {
+                char * buffer = ( char * ) node -> value_storage . base;
+
+                /* copy string data into buffer */
+                rc = string_printf ( & buffer [ cursize ], value -> size + 2, NULL,
+                                     ",%S"
+                                     , value ); 
+                if ( rc == 0 )
+                {
+                    /* update size and len of value in the node */
+                    node -> value . size += value -> size + 1;
+                    node -> value . len += value -> len + 1;
+                    return 0;
+                }
+                
+                /* In case of almost impossible error
+                   restore values to what they were */
+                KDataBufferResize ( & node -> value_storage, cursize + 1 );
+            }
+          } else { /* replace value with node -> value */
+            if ( ! StringEqual ( & node -> value, value ) )
+            /* values are not equal - need to replace */
+            {
+                /* size of the KDataBuffer to store string data */
+                size_t bsize = name -> size + value ->  size + 1;
+                if ( value -> size > node -> value . size
+                  || value -> len > node -> value . len )
+                {   /* new value is longer */
+                    KDataBufferResize ( & node -> value_storage, bsize );
+                }
+                /* copy the string data into storage */
+                rc = string_printf ( ( char * ) node -> value_storage . base,
+                    bsize, NULL, "%S%S", name, value );
+                if ( rc == 0 )
+                {
+                    /* initialize the Strings to point into KHttpHeader node */
+                    StringInit ( & node -> name,
+                        ( const char * ) node -> value_storage . base,
+                        name -> size, name -> len );
+                    StringInit ( & node -> value,
+                        node -> name . addr + name -> size,
+                        value -> size, value -> len );
+                }
+            }
+          }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t KClientHttpVAddHeader ( BSTree *hdrs, bool add,
+    const char *_name, const char *_val, va_list args )
+{
+    rc_t rc;
+
+    size_t bsize;
+    String name, value;
+    char buf [ 4096 ];
+
+    /* initialize name string from param */
+    StringInitCString ( & name, _name );
+
+    /* copy data into buf, using va_list for value format */
+    rc = string_vprintf ( buf, sizeof buf, &bsize, _val, args );
+    if ( rc == 0 )
+    {
+        /* get length of buf */
+        size_t blen = string_len ( buf, bsize );
+
+        /* init value */
+        StringInit ( & value, buf, bsize, ( uint32_t ) blen );
+
+        rc = KClientHttpAddHeaderString ( hdrs, add, & name, & value );
+    }
+
+    return rc;
+}
+
+static
+rc_t KClientHttpAddHeader
+( BSTree *hdrs, const char *name, const char *val, ... )
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, val );
+    rc = KClientHttpVAddHeader ( hdrs, true, name, val, args );
+    va_end ( args );
+    return rc;
+}
+
+static
+rc_t KClientHttpReplaceHeader
+( BSTree *hdrs, const char *name, const char *val, ... )
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, val );
+    rc = KClientHttpVAddHeader ( hdrs, false, name, val, args );
+    va_end ( args );
+    return rc;
+}
+
+/* Capture each header line to add to BSTree */
+static
+rc_t KClientHttpGetHeaderLine ( KClientHttp *self, timeout_t *tm, BSTree *hdrs,
+    bool * blank, bool * len_zero, bool * close_connection )
+{
+    /* Starting from the second line of the response */
+    rc_t rc = KClientHttpGetLine ( self, tm );
+    if ( rc == 0 )
+    {
+        /* blank = empty line_buffer = separation between headers and body of response */
+        if ( self -> line_valid == 0 )
+            * blank = true;
+        else
+        {
+            char * sep;
+            const char * buffer = ( char * ) self -> line_buffer . base;
+            const char * end = buffer + self -> line_valid;
+
+            DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS), ("HTTP receive '%s'\n", buffer));
+
+            /* find the separation between name: value */
+            sep = string_chr ( buffer, end - buffer, ':' );
+            if ( sep == NULL )
+            {
+                rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+                TRACE ( "badly formed header: '%.*s'\n", ( int ) ( end - buffer ), buffer );
+            }
+            else
+            {
+                String name, value;
+                const char * last = sep;
+                
+                /* trim white space around name */
+                while ( buffer < last && isspace ( buffer [ 0 ] ) )
+                    ++ buffer;
+                while ( buffer < last && isspace ( last [ -1 ] ) )
+                    -- last;
+
+                /* assign the name data into the name string */
+                StringInit ( & name, buffer, last - buffer, ( uint32_t ) ( last - buffer ) );
+                
+                /* move the buffer forward to value */
+                buffer = sep + 1;
+                last = end;
+                
+                /* trim white space around value */
+                while ( buffer < last && isspace ( buffer [ 0 ] ) )
+                    ++ buffer;
+                while ( buffer < last && isspace ( last [ -1 ] ) )
+                    -- last;
+
+                /* assign the value data into the value string */
+                StringInit ( & value, buffer, last - buffer, ( uint32_t ) ( last - buffer ) );
+
+                switch ( name . size )
+                {
+                case sizeof "Connection" - 1:
+                    if ( value . size == sizeof "close" - 1 )
+                    {
+                        if ( tolower ( name . addr [ 0 ] ) == 'c' && tolower ( value . addr [ 0 ] ) == 'c' )
+                        {
+                            if ( strcase_cmp ( name . addr, name . size, "Connection", name . size, ( uint32_t ) name . size ) == 0 &&
+                                 strcase_cmp ( value . addr, value . size, "close", value . size, ( uint32_t ) value . size ) == 0 )
+                            {
+                                DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS),
+                                       ("*** seen connection close ***\n"));
+                                * close_connection = true;
+                            }
+                        }
+                    }
+                    break;
+                case sizeof "Content-Length" - 1:
+                    if ( value . size == sizeof "0" - 1 )
+                    {
+                        if ( tolower ( name . addr [ 0 ] ) == 'c' && value . addr [ 0 ] == '0' )
+                        {
+                            if ( strcase_cmp ( name . addr, name . size, "Content-Length", name . size, ( uint32_t ) name . size ) == 0 )
+                            {
+                                * len_zero = true;
+                            }
+                        }
+                    }
+                    break;
+                }
+                
+                rc = KClientHttpAddHeaderString
+                    ( hdrs, true, & name, & value );
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* Locate a KhttpHeader obj in BSTree */
+static
+rc_t KClientHttpFindHeader ( const BSTree *hdrs, const char *_name, char *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc = 0;
+    String name;
+    KHttpHeader * node;
+
+    StringInitCString ( &name, _name );
+
+    /* find the header */
+    node = ( KHttpHeader * ) BSTreeFind ( hdrs, &name, KHttpHeaderCmp );
+    if ( node == NULL )
+    {
+        rc = SILENT_RC ( rcNS, rcTree, rcSearching, rcName, rcNotFound );
+    }
+    else
+    {
+        /* make sure buffer is large enough */
+        if ( bsize < node -> value . size )
+        {
+            /* return the amount needed */
+            * num_read = node -> value . size;
+            
+            return RC ( rcNS, rcNoTarg, rcParsing, rcParam, rcInsufficient );
+        }
+        
+        /* copy data and return the num_read */
+        * num_read = string_copy ( buffer, bsize, node -> value . addr, node -> value . size );
+    }
+    return rc;
+}
+
+static
+rc_t KClientHttpGetStatusLine ( KClientHttp *self, timeout_t *tm, String *msg, uint32_t *status, ver_t *version )
+{
+    /* First time reading the response */
+    rc_t rc = KClientHttpGetLine ( self, tm );
+
+    if (rc == 0 && self->line_valid == 0) {
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_ERR), (
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2 %s empty HttpStatusLine @@@@@@@@@@@@@@@@"
+            "\n", __FILE__));
+        rc = RC(rcNS, rcNoTarg, rcReading, rcNoObj, rcIncomplete);
+    }
+
+    if ( rc == 0 )
+    {
+        char * sep;
+        const char * buffer = ( char * ) self -> line_buffer . base;
+        const char * end = buffer + self -> line_valid;
+
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS), ("HTTP receive '%s'\n", buffer));
+
+        /* Detect protocol
+           expect HTTP/1.[01]<sp><digit>+<sp><msg>\r\n */
+        sep = string_chr ( buffer, end - buffer, '/' );
+        if ( sep == NULL )
+        {
+            rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+            TRACE ( "badly formed status line: '%.*s'\n", ( int ) ( end - buffer ), buffer );
+        }
+        else
+        {
+            /* make sure it is http */
+            if ( strcase_cmp ( "http", 4, buffer, sep - buffer, 4 ) != 0 )
+            {
+                rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcUnsupported );
+                DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS), ("%s: protocol given as '%.*s'\n", __func__, ( uint32_t ) ( sep - buffer ), buffer ));
+            }
+            else
+            {
+                /* move buffer up to version */
+                buffer = sep + 1;
+
+                /* find end of version */
+                sep = string_chr ( buffer, end - buffer, ' ' );
+                if ( sep == NULL )
+                {
+                    rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+                    TRACE ( "badly formed HTTP version: '%.*s'\n", ( int ) ( end - buffer ), buffer );
+                }
+                else
+                {
+                    /* must be 1.0 or 1.1 */
+                    if ( ( string_cmp ( "1.0", 3, buffer, sep - buffer, 3 ) != 0 ) &&
+                         ( string_cmp ( "1.1", 3, buffer, sep - buffer, 3 ) != 0 ) )
+                        rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcUnsupported );
+                    else
+                    {
+                        /* which version was returned? */
+                        * version = string_cmp ( "1.0", 3, buffer, sep - buffer, -1 ) == 0 ? 0x01000000 : 0x01010000;
+                        
+                        /* move up to status code */
+                        buffer = sep + 1;
+
+                        /* record status as uint32 
+                         sep should point to 1 byte after end of status text */
+                        * status = strtou32 ( buffer, & sep, 10 );
+
+                        /* if at the end of buffer or sep didnt land on a space - error */
+                        if ( sep == buffer || * sep != ' ' )
+                        {
+                            rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+                            TRACE ( "badly formed HTTP version: '%.*s': numeral ends on '%c'\n", ( int ) ( end - buffer ), buffer, ( sep == buffer ) ? 0 : * sep );
+                        }
+                        else
+                        {
+                            /* move up to status msg */
+                            buffer = sep + 1;
+
+                            /* initialize the msg String with the proper size and length */
+                            StringInit ( msg, buffer, end - buffer, ( uint32_t ) ( end - buffer ) );
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * ClientHttpStream
+ *  structure that represents the body of the response
+ */
+struct KClientHttpStream
+{
+    KStream dad;
+    
+    /* content_length is the size of the chunk
+       total_read is the number of read from the chunk */
+    uint64_t content_length;
+    uint64_t total_read;
+
+    KClientHttp * http;
+
+    uint8_t state; /* keeps track of state for chunked reader */
+    bool size_unknown; /* for HTTP/1.0 dynamic */
+};
+
+enum 
+{
+    end_chunk,
+    new_chunk,
+    within_chunk,
+    end_stream,
+    error_state
+};
+
+static
+rc_t CC KClientHttpStreamWhack ( KClientHttpStream *self )
+{
+    KClientHttpRelease ( self -> http );
+    free ( self );
+    return 0;
+}
+
+/* Read from stream - either not chunked or within a chunk */
+static
+rc_t CC KClientHttpStreamTimedRead ( const KClientHttpStream *cself,
+    void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm )
+{
+    rc_t rc;
+    KClientHttpStream *self = ( KClientHttpStream * ) cself;
+    KClientHttp *http = self -> http;
+
+    /* minimum of bytes requested and bytes available in stream */
+    uint64_t num_to_read = self -> content_length - self -> total_read;
+
+    /* take the minimum of bytes avail or bytes requested */
+    if ( self -> size_unknown || bsize < num_to_read )
+        num_to_read = bsize;
+
+    /* Should be 0 because nothing has been read. Caller
+       sets its to 0 */
+    assert ( * num_read == 0 );
+    /* exit if there is nothing to read */
+    if ( num_to_read == 0 )
+        return 0;
+
+    /* read directly from stream 
+       check if the buffer is empty */
+    if ( KClientHttpBlockBufferIsEmpty ( http ) )
+    {
+        /* ReadAll blocks for 1.1. Server will drop the connection */
+        rc =  KStreamTimedRead ( http -> sock, buffer, num_to_read, num_read, tm );
+        if ( rc != 0 )
+        {
+            /* handle dropped connection - may want to reestablish */
+            KClientHttpClose ( http );
+
+            /* LOOK FOR DROPPED CONNECTION && SIZE UNKNOWN - HTTP/1.0 DYNAMIC CASE */
+            if ( self -> size_unknown )
+                rc = 0;
+        }
+
+        /* if nothing was read - end of stream */
+        else if ( * num_read == 0 )
+        {
+            KClientHttpClose ( http );
+
+            /* if the size was known, it is an incomplete transfer */
+            if ( ! self -> size_unknown )
+                rc = RC ( rcNS, rcNoTarg, rcTransfer, rcNoObj, rcIncomplete);
+        }
+    }
+    else
+    {
+        const char * buf = NULL;
+
+        /* bytes available in buffer */
+        uint64_t bytes_in_buffer = http -> block_valid - http -> block_read;
+
+        /* take the minimum of bytes avail or bytes requested */
+        if ( num_to_read > bytes_in_buffer )
+            num_to_read = bytes_in_buffer;
+
+        /* capture base pointer */
+        buf = ( char * ) http -> block_buffer . base;
+
+        /* copy data into the user buffer from the offset of bytes not yet read */
+        memmove ( buffer, & buf [ http -> block_read ], num_to_read );
+
+        /* update the amount read */
+        http -> block_read += num_to_read;
+
+        /* return how much was read */
+        * num_read = num_to_read;
+
+        rc = 0;
+    }
+
+    /* update the total from the stream
+       keep track of total bytes read within the chunk */
+    self -> total_read += * num_read;
+
+    return rc;
+}
+
+static
+rc_t CC KClientHttpStreamRead ( const KClientHttpStream *self,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    return KClientHttpStreamTimedRead ( self, buffer, bsize, num_read, NULL );
+}
+
+/* Uses a state machine*/
+static
+rc_t CC KClientHttpStreamTimedReadChunked ( const KClientHttpStream *cself,
+    void *buffer, size_t bsize, size_t *num_read, timeout_t *tm )
+{
+    rc_t rc;
+    char * sep;
+    KClientHttpStream *self = ( KClientHttpStream * ) cself;
+    KClientHttp * http = self -> http;
+
+    assert ( * num_read == 0 );
+
+    switch ( self -> state )
+    {
+    case end_chunk:
+        rc = KClientHttpGetLine ( http, tm );
+        if ( rc != 0 )
+        {
+            self -> state = error_state;
+            break;
+        }
+
+        /* this should be the CRLF following chunk */
+        if ( http -> line_valid != 0 )
+        {
+            KClientHttpClose ( http );
+            rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcIncorrect);
+            self -> state = error_state;
+            break;
+        }
+
+        self -> state = new_chunk;
+
+        /* NO BREAK */
+
+        /* start */
+    case new_chunk:
+
+        /* Get chunk size */
+        rc = KClientHttpGetLine ( http, tm );
+        if ( rc != 0 )
+        {
+            self -> state = error_state;
+            break;
+        }
+
+        /* convert the hex number containing chunk size to uint64 
+           sep should be pointing at nul byte */
+        self -> content_length 
+          = strtou64 ( ( const char * ) http -> line_buffer . base, & sep, 16 );
+
+        /* TBD - eat spaces here? */
+        /* check if there was no hex number, or sep isn't pointing to nul byte */
+        if ( sep == http -> line_buffer . base || ( * sep != 0 && * sep != ';' ) )
+        {
+            KClientHttpClose ( http );
+            rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcIncorrect);
+            self -> state = error_state;
+            break;
+        }
+
+        /* check for end of stream */
+        if ( self -> content_length == 0 )
+        {
+            self -> state = end_stream;
+            return 0;
+        }
+
+        /* havent read anything - start at 0 */
+        self -> total_read = 0;
+
+        /* now within a chunk */
+        self -> state = within_chunk;
+
+        /* NO BREAK */
+
+    case within_chunk: 
+        /* start reading */
+        rc = KClientHttpStreamRead ( self, buffer, bsize, num_read );
+        if ( rc != 0 )
+            self -> state = error_state;
+        /* incomplete if nothing to read */
+        else if ( * num_read == 0 )
+        {
+            KClientHttpClose ( http );
+            rc = RC ( rcNS, rcNoTarg, rcTransfer, rcNoObj, rcIncomplete);
+            self -> state = error_state;
+        }
+        /* check for end of chunk */
+        else if ( self -> total_read == self -> content_length )
+            self -> state = end_chunk;
+        break;
+
+    case end_stream:
+        return 0;
+
+    case error_state:
+        rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcIncorrect );
+        break;
+
+    default:
+        /* internal error */
+        rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcError );
+    }
+
+    return rc;
+}
+
+static
+rc_t CC KClientHttpStreamReadChunked ( const KClientHttpStream *self,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    return KClientHttpStreamTimedReadChunked ( self, buffer, bsize, num_read, NULL );
+}
+
+/* cannot write - for now */
+static
+rc_t CC KClientHttpStreamTimedWrite ( KClientHttpStream *self,
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm )
+{
+    return RC ( rcNS, rcNoTarg, rcWriting, rcFunction, rcUnsupported );
+}
+
+static
+rc_t CC KClientHttpStreamWrite ( KClientHttpStream *self,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    return RC ( rcNS, rcNoTarg, rcWriting, rcFunction, rcUnsupported );
+}
+
+static KStream_vt_v1 vtKClientHttpStream = 
+{
+    1, 1,
+    KClientHttpStreamWhack,
+    KClientHttpStreamRead,
+    KClientHttpStreamWrite,
+    KClientHttpStreamTimedRead,
+    KClientHttpStreamTimedWrite
+};
+
+static KStream_vt_v1 vtKClientHttpStreamChunked =
+{
+    1, 1,
+    KClientHttpStreamWhack,
+    KClientHttpStreamReadChunked,
+    KClientHttpStreamWrite,
+    KClientHttpStreamTimedReadChunked,
+    KClientHttpStreamTimedWrite
+};
+
+/* Make a KClientHttpStream object */
+static
+rc_t KClientHttpStreamMake ( KClientHttp *self, KStream **sp, const char *strname, size_t content_length, bool size_unknown )
+{
+    rc_t rc;
+    KClientHttpStream * s = ( KClientHttpStream * ) calloc ( 1, sizeof * s );
+    if ( s == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KStreamInit ( & s -> dad, ( const KStream_vt * ) & vtKClientHttpStream, 
+                           "KClientHttpStream", strname, true, false );
+        if ( rc == 0 )
+        {                                       
+            rc = KClientHttpAddRef ( self );
+            if ( rc == 0 )
+            {
+                s -> http = self;
+                s -> content_length = content_length;
+                s -> size_unknown = size_unknown;
+                *sp = & s -> dad;
+                return 0;
+            }
+        }
+        free ( s );
+    }
+    *sp = NULL;
+
+    return rc;
+}
+
+static
+rc_t KClientHttpStreamMakeChunked ( KClientHttp *self, KStream **sp, const char *strname )
+{
+    rc_t rc;
+    KClientHttpStream * s = ( KClientHttpStream * ) calloc ( 1, sizeof * s );
+    if ( s == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = KStreamInit ( & s -> dad, ( const KStream_vt * ) & vtKClientHttpStreamChunked, 
+                           "KClientHttpStreamChunked", strname, true, false );
+        if ( rc == 0 )
+        {
+            rc = KClientHttpAddRef ( self );
+            if ( rc == 0 )
+            {
+                s -> http = self;
+
+                /* state should be new_chunk */
+                s -> state = new_chunk;
+
+                *sp = & s -> dad;
+                return 0;
+            }
+        }
+        free ( s );
+    }
+    *sp = NULL;
+
+    return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * KClientHttpResult
+ *  hyper text transfer protocol
+ *  Holds all the headers in a BSTree
+ *  Records the status msg, status code and version of the response 
+ */
+struct KClientHttpResult
+{
+    KClientHttp *http;
+    
+    BSTree hdrs;
+    
+    String msg;
+    uint32_t status;
+    ver_t version;
+
+    KRefcount refcount;
+    bool len_zero;
+    bool close_connection;
+};
+
+static
+rc_t KClientHttpResultWhack ( KClientHttpResult * self )
+{
+    BSTreeWhack ( & self -> hdrs, KHttpHeaderWhack, NULL );
+    if ( self -> close_connection )
+    {
+        DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS),
+            ("*** closing connection ***\n"));
+        KClientHttpClose ( self -> http );
+    }
+    KClientHttpRelease ( self -> http );
+    KRefcountWhack ( & self -> refcount, "KClientHttpResult" );
+    free ( self );
+    return 0;
+}
+
+
+/* Sends the request and receives the response into a KClientHttpResult obj */
+static 
+rc_t KClientHttpSendReceiveMsg ( KClientHttp *self, KClientHttpResult **rslt,
+    const char *buffer, size_t len, const KDataBuffer *body, const char *url )
+{
+    rc_t rc = 0;
+    size_t sent;
+    timeout_t tm;
+    uint32_t status;
+
+    /* TBD - may want to assert that there is an empty line in "buffer" */
+#if _DEBUGGING
+    if ( KNSManagerIsVerbose ( self -> mgr ) )
+        KOutMsg ( "KClientHttpSendReceiveMsg: '%.*s'\n", len, buffer );
+#endif
+    DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS),
+        ("HTTP send '%S' '%.*s'\n\n", &self->hostname, len, buffer));
+
+    /* reopen connection if NULL */
+    if ( self -> sock == NULL )
+        rc = KClientHttpOpen ( self, & self -> hostname, self -> port );
+
+    /* ALWAYS want to use write all when sending */
+    if ( rc == 0 )
+    {
+        TimeoutInit ( & tm, self -> write_timeout );
+        rc = KStreamTimedWriteAll ( self -> sock, buffer, len, & sent, & tm ); 
+        if ( rc != 0 )
+        {
+            rc_t rc2 = KClientHttpReopen ( self );
+            if ( rc2 == 0 )
+            {
+                TimeoutInit ( & tm, self -> write_timeout );
+                rc2 = KStreamTimedWriteAll ( self -> sock, buffer, len, & sent, & tm );
+                if ( rc2 == 0 )
+                    rc = 0;
+            }
+        }
+    }
+
+    /* check the data was completely sent */
+    if ( rc == 0 && sent != len )
+    {
+        rc = RC ( rcNS, rcNoTarg, rcWriting, rcTransfer, rcIncomplete );
+        KClientHttpClose ( self );
+    }
+    if ( rc == 0 && body != NULL  && body -> elem_count > 0 )
+    {
+        /* "body" contains bytes plus trailing NUL */
+        size_t to_send = ( size_t ) body -> elem_count - 1;
+        rc = KStreamTimedWriteAll ( self -> sock, body -> base, to_send, & sent, & tm );
+        if ( rc == 0 && sent != to_send )
+        {
+            rc = RC ( rcNS, rcNoTarg, rcWriting, rcTransfer, rcIncomplete );
+            KClientHttpClose ( self );
+        }
+    }
+
+    for ( status = 100; rc == 0 && status == 100; )
+    {
+        String msg;
+        ver_t version;
+
+        /* reinitialize the timeout for reading */
+        TimeoutInit ( & tm, self -> read_timeout );
+
+        /* we have now received a response 
+           start reading the header lines */
+        rc = KClientHttpGetStatusLine ( self, & tm, & msg, & status, & version );
+        if ( rc == 0 )
+        {
+            /* create a result object with enough space for msg string + nul */
+            KClientHttpResult * result = ( KClientHttpResult * )
+                                    malloc ( sizeof * result + msg . size + 1 );
+            if ( result == NULL )
+                rc = RC ( rcNS, rcNoTarg, rcAllocating, rcMemory, rcExhausted );
+            else
+            {
+                /* zero out */
+                memset ( result, 0, sizeof * result );
+                
+                rc = KClientHttpAddRef ( self );
+                if ( rc == 0 )
+                {
+                    bool blank;
+
+                    /* treat excess allocation memory as text space */
+                    char *text = ( char* ) ( result + 1 );
+
+                    /* copy in the data to the text space */
+                    string_copy ( text, msg . size + 1, msg . addr, msg . size );
+
+                    /* initialize the result members
+                       "hdrs" is initialized via "memset" above
+                     */
+                    result -> http = self;
+                    result -> status = status;
+                    result -> version = version;
+
+                    /* correlate msg string in result to the text space */
+                    StringInit ( & result -> msg, text, msg . size, msg . len );
+
+                    /* TBD - pass in URL as instance identifier */
+                    KRefcountInit ( & result -> refcount, 1, "KClientHttpResult", "sending-msg", url );
+
+                    /* receive and parse all header lines 
+                       blank = end of headers */
+                    for ( blank = false; ! blank && rc == 0; )
+                    {
+                        rc = KClientHttpGetHeaderLine ( self, & tm, & result -> hdrs,
+                            & blank, & result -> len_zero, & result -> close_connection );
+                    }
+
+                    if ( rc == 0 && status != 100 )
+                    {
+                        /* assign to OUT result obj */
+                        * rslt = result;
+                        return 0; 
+                    }
+
+                    BSTreeWhack ( & result -> hdrs, KHttpHeaderWhack, NULL );
+                }
+
+                KClientHttpRelease ( self );
+            }
+
+            free ( result );
+        }
+    }
+
+    return rc;
+}
+
+/* test */
+/*static
+void KClientHttpForceSocketClose(const KClientHttp *self)
+{
+    KStreamForceSocketClose(self->sock);
+}
+*/
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KClientHttpResultAddRef ( const KClientHttpResult *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KClientHttpResult" ) )
+        {
+        case krefLimit:
+            return RC ( rcNS, rcNoTarg, rcAttaching, rcRange, rcExcessive );
+        case krefNegative:
+            return RC ( rcNS, rcNoTarg, rcAttaching, rcSelf, rcInvalid );
+        default:
+            break;
+        }
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KClientHttpResultRelease ( const KClientHttpResult *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KClientHttpResult" ) )
+        {
+        case krefWhack:
+            return KClientHttpResultWhack ( ( KClientHttpResult* ) self );
+        case krefNegative:
+            return RC ( rcNS, rcNoTarg, rcReleasing, rcRange, rcExcessive );
+        default:
+            break;
+        }
+    }
+
+    return 0;
+}
+
+
+/* Status
+ *  access the response status code
+ *  and optionally the message
+ *
+ *  "code" [ OUT ] - return parameter for status code
+ *
+ *  "msg_buff" [ IN, NULL OKAY ] and "buff_size" [ IN, ZERO OKAY ] -
+ *   buffer for capturing returned message. if "msg_buff" is not
+ *   NULL and "buff_size" is insufficient for copying status message,
+ *   the message returns rcBuffer, rcInsufficient.
+ *
+ *  "msg_size" [ OUT, NULL OKAY ] - size of returned message in bytes.
+ *   if not NULL, returns the size of status message. if "msg_buff" is
+ *   NULL, returns rcBuffer, rcNull.
+ */
+LIB_EXPORT rc_t CC KClientHttpResultStatus ( const KClientHttpResult *self, uint32_t *code,
+    char *msg_buff, size_t buff_size, size_t *msg_size )
+{
+    rc_t rc;
+
+    /* check OUT parameters */
+    if ( code == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+    else
+    {
+        /* IN parameters */
+        if ( self == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcSelf, rcNull );
+        else
+        {
+            /* capture the status code to OUT param */
+            * code = self -> status;
+            rc = 0;
+
+            /* if asking about msg size */
+            if ( msg_size != NULL )
+            {
+                /* capture the msg size */
+                * msg_size = self -> msg . size;
+
+                /* catch NULL buffer pointer */
+                if ( msg_buff == NULL )
+                    rc = RC ( rcNS, rcNoTarg, rcValidating, rcBuffer, rcNull );
+            }
+
+            /* if they apparently want the message */
+            if ( msg_buff != NULL )
+            {
+                /* check for an insufficient buffer size */
+                if ( buff_size < self -> msg . size )
+                    rc = RC ( rcNS, rcNoTarg, rcValidating, rcBuffer, rcInsufficient );
+                else
+                    /* copy out the message */
+                    string_copy ( msg_buff, buff_size, self -> msg . addr, self -> msg . size );
+            }
+
+            return rc;
+        }
+
+        * code = 0;
+    }
+
+    return rc;
+}
+
+
+/* KeepAlive
+ *  retrieves keep-alive property of response
+ */
+LIB_EXPORT bool CC KClientHttpResultKeepAlive ( const KClientHttpResult *self )
+{
+    rc_t rc;
+
+    if ( self != NULL )
+    {
+        /* we're requiring version 1.1 -
+           some 1.0 servers also supported it... */
+        if ( self -> version == 0x01010000 )
+        {
+            size_t num_writ;
+            char buffer [ 1024 ];
+            size_t bsize = sizeof buffer;
+
+            /* retreive the node that has the keep-alive property */
+            rc = KClientHttpResultGetHeader ( self, "Connection", buffer, bsize, & num_writ );
+            if ( rc == 0 )
+            {
+                String keep_alive, compare;
+
+                /* init strings */
+                StringInitCString ( & keep_alive, buffer );
+                CONST_STRING ( & compare, "keep-alive" );
+
+                /* compare strings for property value */
+                if ( StringCaseCompare ( & keep_alive, & compare ) == 0 )
+                    return true;
+            }
+        }
+    }
+    return false;
+}
+
+
+/* Range
+ *  retrieves position and partial size for partial requests
+ *
+ *  "pos" [ OUT ] - offset to beginning portion of response
+ *
+ *  "bytes" [ OUT ] - size of range
+ *
+ *  HERE WE NEED TO HAVE PASSED THE RANGE REQUEST TO THE RESULT ON CREATION,
+ *  AND WE WILL RESPOND TO THE HTTP "PARTIAL RESULT" OR WHATEVER RETURN CODE,
+ *  AND BASICALLY UPDATE WHAT THE RANGE WAS.
+ */
+static
+rc_t KClientHttpResultHandleContentRange ( const KClientHttpResult *self, uint64_t *pos, size_t *bytes )
+{
+    rc_t rc;
+    size_t num_read;
+    char buffer [ 1024 ];
+    const size_t bsize = sizeof buffer;
+
+    /* get Content-Range
+     *  expect: "bytes <first-position>-<last-position>/<total-size>"
+     */
+    rc = KClientHttpResultGetHeader ( self, "Content-Range", buffer, bsize, & num_read );
+    if ( rc == 0 )
+    {
+        char * sep;
+        char *buf = buffer;
+        const char *end = & buffer [ num_read ];
+
+        /* look for separation of 'bytes' and first position */
+        sep = string_chr ( buf, end - buf, ' ' );
+        if ( sep == NULL )
+        {
+            rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+            TRACE ( "badly formed Content-Range header: '%.*s': lacks a space separator\n", ( int ) ( end - buffer ), buffer );
+        }
+        else
+        {
+            uint64_t start_pos;
+                        
+            /* buf now points to value */
+            buf = sep + 1;
+
+            /* capture starting position 
+               sep should land on '-' */
+            start_pos = strtou64 ( buf, & sep, 10 );
+
+            /* check if we didnt read anything or sep didnt land on '-' */
+            if ( sep == buf || * sep != '-' )
+            {
+                rc =  RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+                TRACE ( "badly formed Content-Range header: '%.*s': numeral ends on '%c'\n", ( int ) ( end - buffer ), buffer, ( sep == buffer ) ? 0 : * sep );
+            }
+            else
+            {
+                uint64_t end_pos;
+
+                buf = sep + 1;
+                end_pos = strtou64 ( buf, & sep, 10 );
+                if ( sep == buf || * sep != '/' )
+                {
+                    rc =  RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+                    TRACE ( "badly formed Content-Range header: '%.*s': numeral ends on '%c'\n", ( int ) ( end - buffer ), buffer, ( sep == buffer ) ? 0 : * sep );
+                }
+                else
+                {
+                    uint64_t total;
+
+                    buf = sep +1;
+                    total = strtou64 ( buf, &sep, 10 );
+                    if ( sep == buf || * sep != 0 )
+                    {
+                        rc =  RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+                        TRACE ( "badly formed Content-Range header: '%.*s': numeral ends on '%c'\n", ( int ) ( end - buffer ), buffer, ( sep == buffer ) ? 0 : * sep );
+                    }
+                    else
+                    {
+                        /* check variables */
+                        if ( total == 0 ||
+                             start_pos > total ||
+                             end_pos < start_pos ||
+                             end_pos > total )
+                        {
+                            rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+                            TRACE ( "badly formed Content-Range header: total=%lu, start_pos=%lu, end_pos=%lu\n", total, start_pos, end_pos );
+                            if ( total == 0 )
+                                TRACE ( "badly formed Content-Range header: total==0 : ERROR%c", '\n' );
+                            if ( start_pos > total )
+                                TRACE ( "badly formed Content-Range header: start_pos=%lu > total=%lu : ERROR\n", start_pos, total );
+                            if ( end_pos < start_pos )
+                                TRACE ( "badly formed Content-Range header: end_pos=%lu < start_pos=%lu : ERROR\n", end_pos, start_pos );
+                            if ( end_pos > total )
+                                TRACE ( "badly formed Content-Range header: end_pos=%lu > total=%lu : ERROR\n", end_pos, total );
+                        }
+                        else
+                        {
+                            uint64_t length;
+                                        
+                            /* get content-length to confirm bytes sent */
+                            rc = KClientHttpResultGetHeader ( self, "Content-Length", buffer, bsize, & num_read );
+                            if ( rc != 0 )
+                            {
+                                            
+                                /* remember that we can have chunked encoding,
+                                   so "Content-Length" may not exist. */
+                                * pos = start_pos;
+                                * bytes = end_pos - start_pos + 1; 
+                                            
+                                return 0;
+                            }
+
+                            buf = buffer;
+                            end = & buffer [ num_read ];
+                                            
+                            /* capture the length */
+                            length  = strtou64 ( buf, & sep, 10 );
+                            if ( sep == buf || * sep != 0 )
+                            {
+                                rc =  RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+                                TRACE ( "badly formed Content-Length header: '%.*s': numeral ends on '%c'\n", ( int ) ( end - buffer ), buffer, ( sep == buffer ) ? 0 : * sep );
+                            }                                
+                            else 
+                            {
+                                /* finally check all the acquired information */
+                                if ( ( length != ( ( end_pos - start_pos ) + 1 ) ) ||
+                                     ( length > total ) )
+                                {
+                                    rc = RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+                                    TRACE ( "badly formed Content-Length header: length=%lu, range_len=%lu, total=%lu\n", length, ( end_pos - start_pos ) + 1, total );
+                                    if ( length != ( end_pos - start_pos ) + 1 )
+                                        TRACE ( "badly formed Content-Length header: length=%lu != 0 : ERROR\n", length );
+                                    if ( start_pos > total )
+                                        TRACE ( "badly formed Content-Length header: start_pos=%lu > range_len=%lu : ERROR\n", length, ( end_pos - start_pos ) + 1 );
+                                    if ( length > total )
+                                        TRACE ( "badly formed Content-Length header: length=%lu > total=%lu : ERROR\n", length, total );
+                                }
+                                else
+                                {
+                                    /* assign to OUT params */
+                                    * pos = start_pos;
+                                    * bytes = length; 
+                                                    
+                                    return 0;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KClientHttpResultRange ( const KClientHttpResult *self, uint64_t *pos, size_t *bytes )
+{
+    rc_t rc;
+
+    if ( pos ==  NULL || bytes == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+    else if ( self == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcSelf, rcNull );
+    else
+    {
+        switch ( self -> status )
+        {
+        case 206:
+            /* partial content */
+            rc = KClientHttpResultHandleContentRange ( self, pos, bytes );
+            if ( rc == 0 )
+                return 0;
+
+        case 416:
+            /* unsatisfiable range */
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcError, rcIncorrect );
+            break;
+
+        default:
+            /* codes not handling right now */
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcError, rcUnsupported );
+        }
+    }
+
+    if ( pos != NULL )
+        * pos = 0;
+    if ( bytes != NULL )
+        * bytes = 0;
+
+    return rc;
+}
+
+
+/* Size
+ *  retrieves overall size of entity, if known
+ *
+ *  "size" [ OUT ] - size in bytes of response
+ *   this is the number of bytes that may be expected from the input stream
+ *
+ */
+LIB_EXPORT bool CC KClientHttpResultSize ( const KClientHttpResult *self, uint64_t *size )
+{
+    if ( size != NULL && self != NULL )
+    {
+        rc_t rc;
+        size_t num_read;
+        char buffer [ 1024 ];
+        const size_t bsize = sizeof buffer;
+        
+        /* check for content-length */
+        rc = KClientHttpResultGetHeader ( self, "Content-Length", buffer, bsize, & num_read );
+        if ( rc == 0 )
+        {
+            char * sep;
+            
+            /* capture length as uint64 */
+            uint64_t length = strtou64 ( buffer, & sep, 10 );
+            if ( sep == buffer || * sep != 0 )
+            {
+                rc =  RC ( rcNS, rcNoTarg, rcParsing, rcNoObj, rcNotFound );
+                TRACE ( "badly formed Content-Length header: '%.*s': numeral ends on '%c'\n", ( int ) num_read, buffer, ( sep == buffer ) ? 0 : * sep );
+            }
+            else
+            {
+                /* assign to OUT param */
+                * size = length;
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+/* AddHeader
+ *  allow addition of an arbitrary HTTP header to RESPONSE
+ *  this can be used to repair or normalize odd server behavior
+ *
+ */
+LIB_EXPORT rc_t CC KClientHttpResultAddHeader ( KClientHttpResult *self,
+    const char *name, const char *val, ... )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcSelf, rcNull );
+    else if ( name == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+    /* have to test for empty name */
+    else if ( name [ 0 ] == 0 )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcInsufficient );
+    else if ( val == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+    /* same for empty value fmt string */
+    else if ( val [ 0 ] == 0 )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcInsufficient );
+    else
+    {
+        va_list args;
+        va_start ( args, val );
+        
+        rc = KClientHttpVAddHeader ( & self -> hdrs, false, name, val, args );
+        
+        va_end ( args );
+    }
+    return rc;
+}
+
+
+/* GetHeader
+ *  retrieve named header if present
+ *  this cand potentially return a comma separated value list
+ */
+LIB_EXPORT rc_t CC KClientHttpResultGetHeader ( const KClientHttpResult *self, const char *name,
+    char *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc = 0;
+
+    if ( num_read == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+    else
+    {
+        * num_read = 0;
+
+        if ( self == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcSelf, rcNull );
+        else if ( name == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+        else if ( buffer == NULL && bsize != 0 )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+        else
+        {
+            rc = KClientHttpFindHeader ( & self -> hdrs, name, buffer, bsize, num_read );
+        }
+    }
+
+    return rc;
+}
+
+#if _DEBUGGING
+static
+void PrintHeaders ( BSTNode *n, void *ignore )
+{
+    KHttpHeader *node = ( KHttpHeader * ) n;
+
+    KOutMsg ( "%S: %S\n",
+              & node -> name,
+              & node -> value );
+}
+#endif
+
+/* GetInputStream
+ *  access the body of response as a stream
+ *  only reads are supported
+ *
+ *  "s" [ OUT ] - return parameter for input stream reference
+ *   must be released via KStreamRelease
+ */
+LIB_EXPORT rc_t CC KClientHttpResultGetInputStream ( KClientHttpResult *self, KStream ** s )
+{
+    rc_t rc;
+    
+    if ( s == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcSelf, rcNull );
+        else
+        {
+            char buffer [ 512 ];
+            size_t num_read = 0;
+            uint64_t content_length = 0;
+
+            /* find header to check for type of data being received 
+               assign bytes read from value to num_read */
+            rc = KClientHttpResultGetHeader ( self, "Transfer-Encoding", buffer, sizeof buffer, & num_read );
+            if ( rc == 0 && num_read > 0 )
+            {
+                /* check if chunked encoding */
+                if ( strcase_cmp ( "chunked", sizeof "chunked" - 1,
+                    buffer, num_read, sizeof "chunked" - 1 ) == 0 )
+                {
+                    return KClientHttpStreamMakeChunked ( self -> http, s, "KClientHttpStreamChunked" );
+                }
+                /* TBD - print actual value */
+                LOGERR ( klogSys, rc, "Transfer-Encoding does not provide a value" );
+
+            }
+            /* get the content length of the entire stream if known */
+            if ( KClientHttpResultSize ( self, & content_length ) )
+                return KClientHttpStreamMake ( self -> http, s, "KClientHttpStream", content_length, false );
+
+            /* detect connection: close or pre-HTTP/1.1 dynamic content */
+            if ( self -> close_connection || self -> version < 0x01010000 )
+                return KClientHttpStreamMake ( self -> http, s, "KClientHttpStream", 0, true );
+
+#if _DEBUGGING
+            KOutMsg ( "HTTP/%.2V %03u %S\n", self -> version, self -> status, & self -> msg );
+            BSTreeForEach ( & self -> hdrs, false, PrintHeaders, NULL );
+#endif            
+
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcMessage, rcUnsupported );
+            LOGERR ( klogInt, rc, "HTTP response does not give content length" ); 
+
+        }
+    }
+    
+    * s = NULL;
+    
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KClientHttpRequest
+ *  hyper text transfer protocol
+ */
+
+struct KClientHttpRequest
+{
+    KClientHttp * http;
+
+    URLBlock url_block;
+    KDataBuffer url_buffer;
+
+    KDataBuffer body;
+    
+    BSTree hdrs;
+
+    KRefcount refcount;
+    bool accept_not_modified;
+};
+
+static
+rc_t KClientHttpRequestClear ( KClientHttpRequest *self )
+{
+    KDataBufferWhack ( & self -> url_buffer );
+
+    return 0;
+}
+
+static
+rc_t KClientHttpRequestWhack ( KClientHttpRequest * self )
+{
+    KClientHttpRequestClear ( self );
+
+    KClientHttpRelease ( self -> http );
+    KDataBufferWhack ( & self -> body );
+    
+    BSTreeWhack  ( & self -> hdrs, KHttpHeaderWhack, NULL );
+    KRefcountWhack ( & self -> refcount, "KClientHttpRequest" );
+    free ( self );
+    return 0;
+}
+
+static 
+rc_t KClientHttpRequestInit ( KClientHttpRequest * req,
+    const URLBlock *b, const KDataBuffer *buf )
+{
+    rc_t rc = KDataBufferSub ( buf, & req -> url_buffer, 0, UINT64_MAX );
+    if ( rc == 0 )
+    {
+        /* assign url_block */
+        req -> url_block = * b;
+    }
+    return rc;
+}
+        
+
+/* MakeRequestInt[ernal]
+ */
+rc_t KClientHttpMakeRequestInt ( const KClientHttp *self,
+    KClientHttpRequest **_req, const URLBlock *block, const KDataBuffer *buf )
+{
+    rc_t rc;
+
+    /* create the object with empty buffer */
+    KClientHttpRequest * req = calloc ( 1, sizeof * req );
+    if ( req == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcAllocating, rcMemory, rcNull );
+    else
+    {
+        rc = KClientHttpAddRef ( self );
+        if ( rc == 0 )
+        {
+            /* assign http */
+            req -> http = ( KClientHttp* ) self; 
+
+            /* initialize body to zero size */
+            KDataBufferClear ( & req -> body );
+                
+            KRefcountInit ( & req -> refcount, 1, "KClientHttpRequest", "make", buf -> base ); 
+
+            /* fill out url_buffer with URL */
+            rc = KClientHttpRequestInit ( req, block, buf );
+            if ( rc == 0 )
+            {
+                * _req = req;
+                return 0;
+            }
+
+            KClientHttpRelease ( self );
+        }
+    }
+    
+    free ( req );
+
+    return rc;
+}
+
+/* MakeRequest
+ *  create a request that can be used to contact HTTP server
+ *
+ *  "req" [ OUT ] - return parameter for HTTP request object
+ *
+ *  "vers" [ IN ] - http version
+ *
+ *  "conn" [ IN, NULL OKAY ] - previously opened stream for communications.
+ *
+ *  "url" [ IN ] - full resource identifier. if "conn" is NULL,
+ *   the url is parsed for remote endpoint and is opened by mgr.
+ */
+LIB_EXPORT rc_t CC KClientHttpVMakeRequest ( const KClientHttp *self,
+    KClientHttpRequest **_req, const char *url, va_list args )
+{
+    rc_t rc;
+    
+    if ( _req == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+    else
+    {
+        * _req = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcSelf, rcNull );
+        else if ( url ==  NULL )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+        else if ( url [ 0 ] == 0 )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcInsufficient );
+        else
+        {
+            KDataBuffer buf;
+
+            /* make a KDataBuffer and copy in url with the va_lis */
+            /* rc = KDataBufferMakeBytes ( & buf, 4096 );*/
+            KDataBufferClear ( &buf );
+            
+            rc = KDataBufferVPrintf ( &buf, url, args );
+            if ( rc == 0 )
+            {
+                /* parse the URL */
+                URLBlock block;
+                rc = ParseUrl ( & block, buf . base, buf . elem_count - 1 );
+                if ( rc == 0 )
+                    rc = KClientHttpMakeRequestInt ( self, _req, & block, & buf );
+            }
+
+            KDataBufferWhack ( & buf );
+        }
+    }
+
+    return rc;
+}
+
+/* MakeRequest
+ *  create a request that can be used to contact HTTP server
+ *
+ *  "req" [ OUT ] - return parameter for HTTP request object
+ *
+ *  "url" [ IN ] - full resource identifier. if "conn" is NULL,
+ *   the url is parsed for remote endpoint and is opened by mgr.
+ */
+LIB_EXPORT rc_t CC KClientHttpMakeRequest ( const KClientHttp *self,
+    KClientHttpRequest **_req, const char *url, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, url );
+    rc = KClientHttpVMakeRequest ( self, _req, url, args );
+    va_end ( args );
+
+    return rc;
+}
+
+/* MakeRequest
+ *  create a request that can be used to contact HTTP server
+ *
+ *  "req" [ OUT ] - return parameter for HTTP request object
+ *
+ *  "vers" [ IN ] - http version
+ *
+ *  "conn" [ IN, NULL OKAY ] - previously opened stream for communications.
+ *
+ *  "url" [ IN ] - full resource identifier. if "conn" is NULL,
+ *   the url is parsed for remote endpoint and is opened by mgr.
+ */
+static
+rc_t CC KNSManagerMakeClientRequestInt ( const KNSManager *self,
+    KClientHttpRequest **req, ver_t vers, KStream *conn, bool reliable, const char *url, va_list args )
+{
+    rc_t rc;
+
+    if ( req == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+    else
+    {
+        * req = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcSelf, rcNull );
+        else if ( vers < 0x01000000 || vers > 0x01010000 )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcIncorrect );
+        else if ( url == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcString, rcNull );
+        else if ( url [ 0 ] == 0 )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcString, rcEmpty );
+        else
+        {
+            KDataBuffer buf;
+            
+            KDataBufferClear ( &buf );
+                /* convert var-arg "url" to a full string */
+            rc = KDataBufferVPrintf ( & buf, url, args );
+            if ( rc == 0 )
+            {
+                /* parse the URL */
+                URLBlock block;
+                rc = ParseUrl ( & block, buf . base, buf . elem_count - 1 );
+                if ( rc == 0 )
+                {
+                    KClientHttp * http;
+                    
+                    rc = KNSManagerMakeClientHttpInt ( self, & http, & buf, conn, vers,
+                        self -> http_read_timeout, self -> http_write_timeout, & block . host, block . port, reliable, block . tls );
+                    if ( rc == 0 )
+                    {
+                        rc = KClientHttpMakeRequestInt ( http, req, & block, & buf );
+                        KClientHttpRelease ( http );
+                    }
+                }
+            }
+            KDataBufferWhack ( & buf );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KNSManagerMakeClientRequest ( const KNSManager *self,
+    KClientHttpRequest **req, ver_t vers, KStream *conn, const char *url, ... )
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, url );
+    rc = KNSManagerMakeClientRequestInt ( self, req, vers, conn, false, url, args );
+    va_end ( args );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KNSManagerMakeReliableClientRequest ( const KNSManager *self,
+    KClientHttpRequest **req, ver_t vers, KStream *conn, const char *url, ... )
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, url );
+    rc = KNSManagerMakeClientRequestInt ( self, req, vers, conn, true, url, args );
+    va_end ( args );
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KClientHttpRequestAddRef ( const KClientHttpRequest *self )
+{
+        if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KClientHttpRequest" ) )
+        {
+        case krefLimit:
+            return RC ( rcNS, rcNoTarg, rcAttaching, rcRange, rcExcessive );
+        case krefNegative:
+            return RC ( rcNS, rcNoTarg, rcAttaching, rcSelf, rcInvalid );
+        default:
+            break;
+        }
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KClientHttpRequestRelease ( const KClientHttpRequest *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KClientHttpRequest" ) )
+        {
+        case krefWhack:
+            return KClientHttpRequestWhack ( ( KClientHttpRequest* ) self );
+        case krefNegative:
+            return RC ( rcNS, rcNoTarg, rcReleasing, rcRange, rcExcessive );
+        default:
+            break;
+        }
+    }
+
+    return 0;
+}
+
+
+/* Connection
+ *  sets connection management headers
+ *
+ *  "close" [ IN ] - if "true", inform the server to close the connection
+ *   after its response ( default for version 1.0 ). when "false" ( default
+ *   for version 1.1 ), ask the server to keep the connection open.
+ *
+ * NB - the server is not required to honor the request
+ */
+LIB_EXPORT rc_t CC KClientHttpRequestConnection ( KClientHttpRequest *self, bool close )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcSelf, rcNull );
+    else
+    {
+        String name, value;
+        
+        CONST_STRING ( & name, "Connection" );
+        /* if version is 1.1 and close is true, add 'close' to Connection header value. */
+        /* if version if 1.1 default is false - no action needed */
+        if ( self -> http -> vers == 0x01010000 && close == true )
+            CONST_STRING ( & value, "close" );
+        else if ( self -> http -> vers == 0x01000000 && close == false )
+            CONST_STRING ( & value, "keep-alive" );
+        else
+            return 0;
+
+        rc = KClientHttpRequestAddHeader ( self,  name . addr, value . addr );
+            
+    }
+    return rc;
+}
+
+
+/* SetNoCache
+ *  guard against over-eager proxies that try to cache entire files
+ *  and handle byte-ranges locally.
+ */
+LIB_EXPORT rc_t CC KClientHttpRequestSetNoCache ( KClientHttpRequest *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcUpdating, rcSelf, rcNull );
+    else
+    {
+        rc = KClientHttpRequestAddHeader ( self, "Cache-Control", "no-cache, no-store, max-age=0, no-transform, must-revalidate" );
+        if ( rc == 0 )
+            rc = KClientHttpRequestAddHeader ( self, "Pragma", "no-cache" );
+        if ( rc == 0 )
+            rc = KClientHttpRequestAddHeader ( self, "Expires", "0" );
+    }
+
+    return rc;
+}
+
+
+/* ByteRange
+ *  set requested byte range of response
+ *
+ *  "pos" [ IN ] - beginning offset within remote entity
+ *
+ *  "bytes" [ IN ] - the number of bytes being requested
+ */
+LIB_EXPORT rc_t CC KClientHttpRequestByteRange ( KClientHttpRequest *self, uint64_t pos, size_t bytes )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcSelf, rcNull);
+    else
+    {
+        char  range [ 256 ];
+        size_t num_writ;
+        String name, value;
+        
+        CONST_STRING ( & name, "Range" );
+        rc = string_printf ( range, sizeof range, & num_writ, "bytes=%lu-%lu"
+                             , pos
+                             , pos + bytes - 1);
+        if ( rc == 0 )
+        {
+            StringInitCString ( & value, range );
+
+            rc = KClientHttpRequestAddHeader ( self, name . addr, value . addr );
+        }
+    }
+    return rc;
+}
+
+
+/* AddHeader
+ *  allow addition of an arbitrary HTTP header to message
+ */
+LIB_EXPORT rc_t CC KClientHttpRequestAddHeader ( KClientHttpRequest *self,
+    const char *name, const char *val, ... )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcSelf, rcNull);
+    else
+    {
+        if ( name == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+        /* have to test for empty name, too */
+        else if ( name [ 0 ] == 0 )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcInsufficient );
+        else if ( val == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+        /* same for empty value fmt string */
+        else if ( val [ 0 ] == 0 )
+            rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcInsufficient );
+        else
+        {
+            size_t name_size;
+            bool accept_not_modified;
+
+            va_list args;
+            va_start ( args, val );
+
+            /* disallow setting of "Host" and other headers */
+            name_size = string_size ( name );
+
+#define CSTRLEN( str ) \
+            sizeof ( str ) - 1
+#define NAMEIS( str ) \
+            strcase_cmp ( name, name_size, str, sizeof str, CSTRLEN ( str ) ) == 0
+
+            rc = 0;
+            accept_not_modified = false;
+            
+            switch ( name_size )
+            {
+            case CSTRLEN ( "Host" ):
+                if ( NAMEIS ( "Host" ) )
+                    rc = RC ( rcNS, rcNoTarg, rcComparing, rcParam, rcUnsupported );
+                break;
+            case CSTRLEN ( "Content-Length" ):
+                if ( NAMEIS ( "Content-Length" ) )
+                    rc = RC ( rcNS, rcNoTarg, rcComparing, rcParam, rcUnsupported );
+                break;
+            case CSTRLEN ( "If-None-Match" ):
+                if ( NAMEIS ( "If-None-Match" ) )
+                    accept_not_modified = true;
+                break;
+            case CSTRLEN ( "If-Modified-Since" ):
+                if ( NAMEIS ( "If-Modified-Since" ) )
+                    accept_not_modified = true;
+                break;
+            }
+
+#undef CSTRLEN
+#undef NAMEIS
+
+            if ( rc == 0 )
+            {
+                rc = KClientHttpVAddHeader
+                    ( & self -> hdrs, false, name, val, args );
+                if ( rc == 0 && accept_not_modified )
+                    self -> accept_not_modified = true;
+            }
+
+            va_end ( args );
+        }
+    }
+    return rc;
+}
+
+/* AddPostParam
+ *  adds a parameter for POST
+ */
+LIB_EXPORT rc_t CC KClientHttpRequestVAddPostParam ( KClientHttpRequest *self, const char *fmt, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcSelf, rcNull );
+    else if ( fmt == NULL )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+    else if ( fmt [ 0 ] == 0 )
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcParam, rcNull );
+    else
+    {
+
+        /* TBD - reject embedded newlines */
+        /* TBD - URL-encoding or at least detect need for it */
+
+        /* first param */
+        if ( self -> body . elem_count == 0 )
+            rc = KDataBufferVPrintf ( & self -> body, fmt, args );
+        else
+        {
+            /* additional param - add separator */
+            rc = KDataBufferPrintf ( & self -> body, "&" );
+            if ( rc == 0 )
+                rc = KDataBufferVPrintf ( & self -> body, fmt, args );
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KClientHttpRequestAddPostParam ( KClientHttpRequest *self, const char *fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+    rc = KClientHttpRequestVAddPostParam ( self, fmt, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KClientHttpResultFormatMsg (
+    const struct KClientHttpResult * self, char * buffer,
+    size_t bsize, size_t * len, const char * bol, const char * eol )
+{
+    rc_t rc = 0;
+    size_t total = 0;
+
+    if ( self == NULL ) {
+        return RC ( rcNS, rcNoTarg, rcReading, rcSelf, rcNull );
+    }
+
+    if ( len == NULL || bol == NULL || eol == NULL ) {
+        return RC ( rcNS, rcNoTarg, rcReading, rcParam, rcNull );
+    }
+
+    rc = string_printf ( buffer, bsize, len, 
+            "%sHTTP/%.2V %d %S%s", bol
+            , self -> version
+            , self -> status
+            , & self -> msg, eol
+        );
+    total = * len;
+
+    if ( rc == 0 ||
+        ( GetRCObject ( rc ) == ( enum RCObject ) rcBuffer &&
+          GetRCState ( rc ) == rcInsufficient ) )
+    {
+        const KHttpHeader * node = NULL;
+        for ( node = ( const KHttpHeader* ) BSTreeFirst ( & self -> hdrs );
+              node != NULL;
+              node = ( const KHttpHeader* ) BSTNodeNext ( & node -> dad ) )
+        {
+            size_t p_bsize
+                = rc == 0
+                    ? bsize >= total ? bsize - total : 0
+                    : 0;
+            /* add header line */
+            rc_t r2 = string_printf ( & buffer [ total ], p_bsize, len,
+                             "%s%S: %S\r%s", bol
+                             , & node -> name
+                             , & node -> value, eol );
+            total += * len;
+            if ( rc == 0 ) {
+                rc = r2;
+            }
+        }
+    }
+
+    if ( GetRCObject ( rc ) == ( enum RCObject ) rcBuffer &&
+        GetRCState ( rc ) == rcInsufficient )
+    {
+        ++ total;
+    }
+
+
+    * len = total;
+
+    return rc;
+}
+
+
+LIB_EXPORT
+rc_t CC KClientHttpRequestFormatMsg ( const KClientHttpRequest *self,
+    char *buffer, size_t bsize, const char *method, size_t *len )
+{
+    rc_t rc;
+    rc_t r2 = 0;
+    bool have_user_agent = false;
+    String user_agent_string;
+    size_t total;
+    size_t p_bsize = 0;
+    const KHttpHeader *node;
+    size_t dummy;
+
+    const char * has_query = NULL;
+    String hostname;
+    KClientHttp * http = NULL;
+
+    if ( self == NULL ) {
+         return RC ( rcNS, rcNoTarg, rcReading, rcSelf, rcNull );
+    }
+    if ( buffer == NULL ) {
+         return RC ( rcNS, rcNoTarg, rcReading, rcParam, rcNull );
+    }
+
+    if ( len == NULL ) {
+        len = & dummy;
+    }
+
+    http = self -> http;
+
+    /* determine if there is a query */
+    has_query = ( self -> url_block . query . size == 0 ) ? "" : "?";
+
+
+    /* there are 2 places where the can be a host name stored
+       we give preference to the one attached to the url_block, because
+       it is the most recently determined.
+       If that one is empty, we look at the http object for its
+       host name.
+       Error if both are empty */
+    hostname = self -> url_block . host;
+    if ( hostname . size == 0 )
+    {
+        hostname = http -> hostname;
+        if ( hostname . size == 0 )
+            return RC ( rcNS, rcNoTarg, rcValidating, rcName, rcEmpty );
+    }
+
+    CONST_STRING ( &user_agent_string, "User-Agent" );
+
+    /* start building the buffer that will be sent 
+       We are inlining the host:port, instead of
+       sending it in its own header */
+
+    if ( ! http -> proxy_ep )
+    {
+        rc = string_printf ( buffer, bsize, len, 
+                             "%s %S%s%S HTTP/%.2V\r\nHost: %S\r\nAccept: */*\r\n"
+                             , method
+                             , & self -> url_block . path
+                             , has_query
+                             , & self -> url_block . query
+                             , http -> vers
+                             , & hostname
+            );
+    }
+    else if ( http -> port != 80 )
+    {
+        rc = string_printf ( buffer, bsize, len, 
+                             "%s %S://%S:%u%S%s%S HTTP/%.2V\r\nHost: %S\r\nAccept: */*\r\n"
+                             , method
+                             , & self -> url_block . scheme
+                             , & hostname
+                             , http -> port
+                             , & self -> url_block . path
+                             , has_query
+                             , & self -> url_block . query
+                             , http -> vers
+                             , & hostname
+            );
+    }
+    else
+    {
+        rc = string_printf ( buffer, bsize, len, 
+                             "%s %S://%S%S%s%S HTTP/%.2V\r\nHost: %S\r\nAccept: */*\r\n"
+                             , method
+                             , & self -> url_block . scheme
+                             , & hostname
+                             , & self -> url_block . path
+                             , has_query
+                             , & self -> url_block . query
+                             , http -> vers
+                             , & hostname
+            );
+    }
+
+    /* print all headers remaining into buffer */
+    total = * len;
+    for ( node = ( const KHttpHeader* ) BSTreeFirst ( & self -> hdrs );
+          ( rc == 0  ||
+            ( GetRCObject ( rc ) == ( enum RCObject ) rcBuffer &&
+              GetRCState ( rc ) == rcInsufficient )
+          ) && node != NULL;
+          node = ( const KHttpHeader* ) BSTNodeNext ( & node -> dad ) )
+    {
+        /* look for "User-Agent" */
+        if ( !have_user_agent && node -> name . len == 10 )
+        {
+            if ( StringCaseCompare ( & node -> name, & user_agent_string ) == 0 )
+                have_user_agent = true;
+        }
+
+        p_bsize = bsize >= total ? bsize - total : 0;
+
+        /* add header line */
+        r2 = string_printf ( & buffer [ total ], p_bsize, len,
+                             "%S: %S\r\n"
+                             , & node -> name
+                             , & node -> value );
+        total += * len;
+        if ( rc == 0 ) {
+            rc = r2;
+        }
+    }
+
+    /* add an User-Agent header from the kns-manager if we did not find one already in the header tree */
+    if ( !have_user_agent )
+    {
+        const char * ua = NULL;
+        rc_t r3 = KNSManagerGetUserAgent ( &ua );
+        if ( r3 == 0 )
+        {
+            p_bsize = bsize >= total ? bsize - total : 0;
+            r2 = string_printf ( & buffer [ total ],
+                p_bsize, len, "User-Agent: %s\r\n", ua );
+            total += * len;
+            if ( rc == 0 ) {
+                rc = r2;
+            }
+        }
+    }
+
+    /* add terminating empty header line */
+    if ( rc == 0 ||
+        ( GetRCObject ( rc ) == ( enum RCObject ) rcBuffer &&
+          GetRCState ( rc ) == rcInsufficient ) )
+    {
+        p_bsize = bsize >= total ? bsize - total : 0;
+        r2 = string_printf ( & buffer [ total ], p_bsize, len, "\r\n" );
+        total += * len;
+        if ( rc == 0 ) {
+            rc = r2;
+        }
+    }
+    
+    if ( GetRCObject ( rc ) == ( enum RCObject ) rcBuffer &&
+        GetRCState ( rc ) == rcInsufficient )
+    {
+        ++ total;
+    }
+
+    * len = total;
+
+    return rc;
+}
+
+static
+rc_t KClientHttpRequestHandleRedirection ( KClientHttpRequest *self, KClientHttpResult *rslt )
+{
+    rc_t rc = 0;
+    String Location;
+    KHttpHeader *loc;
+
+    /* find relocation URI */
+    CONST_STRING ( & Location, "Location" );
+    loc = ( KHttpHeader* ) BSTreeFind ( & rslt -> hdrs, & Location, KHttpHeaderCmp );
+    if ( loc == NULL )
+    {
+        LOGERR ( klogSys, rc, "Location header not found on relocate msg" );
+        return RC ( rcNS, rcNoTarg, rcValidating, rcNode, rcNull );
+    }
+
+    /* capture the new URI in loc -> value_storage */
+    if ( loc -> value . size == 0 )
+    {
+        LOGERR ( klogSys, rc, "Location does not provide a value" );
+        rc = RC ( rcNS, rcNoTarg, rcValidating, rcNode, rcIncorrect );
+    }
+    else
+    {
+        URLBlock b;
+        KDataBuffer uri;
+        /* pull out uri */
+        rc = KDataBufferSub ( &loc -> value_storage, &uri, loc -> name . size, loc -> value . size + 1 );
+        if ( rc == 0 )
+        {
+            /* parse the URI into local url_block */
+            rc = ParseUrl ( &b, uri . base, uri . elem_count - 1 );
+            if ( rc == 0 )
+            {
+                KClientHttp *http = self -> http;
+
+                /* close the open http connection and clear out all data except for the manager */
+                KClientHttpClear ( http );
+
+                /* clear the previous endpoint */
+                http -> ep_valid = false;
+
+                /* reinitialize the http from uri */
+                rc = KClientHttpInit ( http, &uri, NULL, http -> vers , &b . host, b . port, b . tls );
+                if ( rc == 0 )
+                {
+                    KClientHttpRequestClear ( self );
+                    rc = KClientHttpRequestInit ( self, &b, &uri );
+                    if ( rc == 0 )
+                        KClientHttpResultRelease ( rslt );
+                }
+            }
+
+            KDataBufferWhack ( & uri );
+        }
+        
+    } 
+
+    return rc;
+}
+
+static
+rc_t KClientHttpRequestSendReceiveNoBodyInt ( KClientHttpRequest *self, KClientHttpResult **_rslt, const char *method )
+{   
+    rc_t rc = 0;
+
+    KClientHttpResult *rslt;
+
+    uint32_t i;
+    const uint32_t max_redirect = 5;
+
+    /* TBD - may want to prevent a Content-Type or other headers here */
+
+    if ( self -> body . elem_count != 0 )
+        return RC ( rcNS, rcNoTarg, rcValidating, rcNoObj, rcIncorrect );
+
+    for ( i = 0; i < max_redirect; ++ i )
+    {
+        size_t len;
+        char buffer [ 4096 ];
+
+        /* create message */
+        rc = KClientHttpRequestFormatMsg ( self, buffer, sizeof buffer, method, & len );
+        if ( rc != 0 )
+            break;
+
+        /* send the message and create a response */
+        rc = KClientHttpSendReceiveMsg ( self -> http, _rslt, buffer, len, NULL, self -> url_buffer . base );
+        if ( rc != 0 )
+        {
+            KClientHttpClose ( self -> http );
+            rc = KClientHttpSendReceiveMsg ( self -> http, _rslt, buffer, len, NULL, self -> url_buffer . base );
+            if ( rc != 0 )
+                break;
+        }
+
+        /* look at status code */
+        rslt = * _rslt;
+        switch ( rslt -> status )
+        {
+        case 200:
+        case 206:
+            return 0;
+        case 304:
+            /* check for "If-Modified-Since" or "If-None-Match" header in request and allow if present */
+            if ( self -> accept_not_modified )
+                return 0;
+            break;
+        }
+
+        TRACE ( "unusual status code: %d\n", ( int ) rslt -> status );
+        
+        switch ( rslt -> status )
+        {
+            /* TBD - need to include RFC rule for handling codes for HEAD and GET */
+        case 301: /* "moved permanently" */
+        case 302: /* "found" - okay to reissue for HEAD and GET, but not for POST */
+        case 303: /* "see other" - the response to the request can be found under another URI using a GET method */
+        case 307: /* "moved temporarily" */
+        case 308: /* "permanent redirect" */
+            break;
+
+        case 505: /* HTTP Version Not Supported */
+            if ( self -> http -> vers > 0x01000000 )
+            {
+                /* downgrade version requested */
+                self -> http -> vers -= 0x00010000;
+                /* TBD - remove any HTTP/1.1 specific headers */
+                continue;
+            }
+
+            /* NO BREAK */
+
+        default:
+
+            if ( ! rslt -> len_zero || rslt -> close_connection )
+            {
+                /* the connection is no good */
+                KClientHttpClose ( self -> http );
+            }
+            
+            /* rslt -> status may be looked at by the caller to determine actual success */
+            return 0;
+        }
+
+        /* reset connection, reset request */
+        rc = KClientHttpRequestHandleRedirection ( self, rslt );
+        if ( rc != 0 )
+            break;
+    }
+
+    if ( rc != 0 )
+        KClientHttpClose ( self -> http );
+    
+    return rc;
+}
+
+static
+rc_t KClientHttpRequestSendReceiveNoBody ( KClientHttpRequest *self, KClientHttpResult **_rslt, const char *method )
+{   
+    KHttpRetrier retrier;
+    rc_t rc = KHttpRetrierInit ( & retrier, self -> url_buffer . base, self -> http -> mgr ); 
+    
+    if ( rc == 0 )
+    {
+        while ( rc == 0 ) 
+        {
+            rc = KClientHttpRequestSendReceiveNoBodyInt ( self, _rslt, method );
+            if ( rc != 0 ) 
+            {   /* a non-HTTP problem */
+                break;
+            }
+            if ( ! self -> http -> reliable || ! KHttpRetrierWait ( & retrier, ( * _rslt ) -> status ) )
+            {   /* We are either not configured to retry, or HTTP status is not retriable, or we exhausted
+                    the max number of retries or the total wait time.
+                    rc is 0, but the caller will have to look at _rslt->status to determine success */
+                break;
+            }
+            KClientHttpResultRelease ( * _rslt );
+        }
+        
+        {
+            rc_t rc2 = KHttpRetrierDestroy ( & retrier );
+            if ( rc == 0 )
+                rc = rc2;
+        }
+    }
+    
+    return rc;
+}
+
+/* HEAD
+ *  send HEAD message
+ */
+LIB_EXPORT rc_t CC KClientHttpRequestHEAD ( KClientHttpRequest *self, KClientHttpResult **rslt )
+{
+    return KClientHttpRequestSendReceiveNoBody ( self, rslt, "HEAD" );
+} 
+
+/* GET
+ *  send GET message
+ *  all query AND post parameters are combined in URL
+ */
+LIB_EXPORT rc_t CC KClientHttpRequestGET ( KClientHttpRequest *self, KClientHttpResult **rslt )
+{
+    return KClientHttpRequestSendReceiveNoBody ( self, rslt, "GET" );
+}
+
+rc_t CC KClientHttpRequestPOST_Int ( KClientHttpRequest *self, KClientHttpResult **_rslt )
+{   
+    rc_t rc = 0;
+
+    KClientHttpResult *rslt;
+
+    uint32_t i;
+    const uint32_t max_redirect = 5;
+
+    /* TBD comment - add debugging test to ensure "Content-Length" header not present */
+
+    /* fix headers for POST params */
+    if ( self -> body . elem_count > 1 )
+    {
+        /* "body" contains data plus NUL byte */
+        rc = KClientHttpReplaceHeader ( & self -> hdrs,
+            "Content-Length", "%lu", self -> body . elem_count - 1 );
+        if ( rc == 0 )
+        {
+            String Content_Type;
+            const KHttpHeader *node;
+
+            CONST_STRING ( & Content_Type, "Content-Type" );
+
+            node = ( const KHttpHeader* ) BSTreeFind ( & self -> hdrs, & Content_Type, KHttpHeaderCmp );
+            if ( node == NULL )
+            {
+                /* add content type for form parameters */
+                /* TBD - before general application, need to perform URL-encoding! */
+                rc = KClientHttpAddHeader ( & self -> hdrs, "Content-Type", "application/x-www-form-urlencoded" );
+            }
+        }
+
+        if ( rc != 0 )
+        {
+            KClientHttpClose ( self -> http );
+            return rc;
+        }
+    }
+
+    for ( i = 0; i < max_redirect; ++ i )
+    {
+        const KDataBuffer *body = & self -> body;
+        size_t len;
+        char buffer [ 4096 ];
+
+        /* create message */
+        rc = KClientHttpRequestFormatMsg ( self, buffer, sizeof buffer, "POST", & len );
+        if ( rc != 0 )
+            break;
+
+        /* Try to add body to buffer to avoid double socket write */
+        if (body != NULL && body -> base != NULL && body -> elem_count > 0 && 
+                len + body -> elem_count - 1 <= sizeof buffer) 
+        {
+            memmove(buffer + len, body -> base, body -> elem_count - 1);
+            len += body -> elem_count - 1;
+            body = NULL;
+        }
+
+        /* send the message and create a response */
+        rc = KClientHttpSendReceiveMsg ( self -> http, _rslt, buffer, len, body, self -> url_buffer . base );
+        if ( rc != 0 )
+        {
+            KClientHttpClose ( self -> http );
+            rc = KClientHttpSendReceiveMsg ( self -> http, _rslt, buffer, len, NULL, self -> url_buffer . base );
+            if ( rc != 0 )
+                break;
+        }
+
+        /* look at status code */
+        rslt = * _rslt;
+        switch ( rslt -> status )
+        {
+        case 200:
+        case 206:
+            return 0;
+        case 304:
+            /* check for "If-Modified-Since" or "If-None-Match" header in request and allow if present */
+            if ( self -> accept_not_modified )
+                return 0;
+            break;
+        }
+
+        TRACE ( "unusual status code: %d\n", ( int ) rslt -> status );
+        
+        switch ( rslt -> status )
+        {
+            /* TBD - Add RFC rules about POST */
+        case 301: /* "moved permanently" */
+        case 307: /* "moved temporarily" */
+        case 308: /* "permanent redirect" */
+            break;
+
+        case 505: /* HTTP Version Not Supported */
+            if ( self -> http -> vers > 0x01000000 )
+            {
+                /* downgrade version requested */
+                self -> http -> vers -= 0x00010000;
+                /* TBD - remove any HTTP/1.1 specific headers */
+                continue;
+            }
+
+            /* NO BREAK */
+
+        default:
+
+            if ( ! rslt -> len_zero || rslt -> close_connection )
+            {
+                /* the connection is no good */
+                KClientHttpClose ( self -> http );
+            }
+
+            /* rslt -> status may be looked at by the caller to determine actual success */
+            return 0;
+        }
+
+        /* reset connection, reset request */
+        rc = KClientHttpRequestHandleRedirection ( self, rslt );
+        if ( rc != 0 )
+            break;
+    }
+
+    if ( rc != 0 )
+        KClientHttpClose ( self -> http );
+
+    return rc;
+}
+
+typedef enum {
+    eUPSBegin,
+    eUPSHost,
+    eUPSDone,
+} EUrlParseState;
+static bool GovSiteByHttp ( const char * path ) {
+    if ( path != NULL ) {
+        size_t path_size = string_measure ( path, NULL );
+        size_t size = 0;
+        String http;
+        CONST_STRING ( & http, "http://" );
+        size = http . size;
+
+        /* resolver-cgi is called over http */
+        if ( path_size > size &&
+             strcase_cmp ( path, size, http . addr, size, size ) == 0 )
+        {
+            EUrlParseState state = eUPSBegin;
+            int i = 0;
+            for ( i = 7; i < path_size && state != eUPSDone; ++i ) {
+                switch ( state ) {
+                    case eUPSBegin:
+                        if ( path [ i ] != '/' ) {
+                            state = eUPSHost;
+                        }
+                        break;
+                    case eUPSHost:
+                        if ( path [ i ] == '/' ) {
+                            state = eUPSDone;
+                        }
+                        break;
+                    default:
+                        break;
+                }
+            }
+
+            if ( state == eUPSBegin ) {
+                return false;
+            }
+            else {
+                size_t size = 0;
+                String gov;
+                CONST_STRING ( & gov, ".gov" );
+                size = gov . size;
+                if ( strcase_cmp
+                    ( path + i - 5, size, gov . addr, size, size ) == 0 )
+                {
+                    return true;
+                }
+            }
+        }
+    }
+
+    return false;
+}
+
+/* POST
+ *  send POST message
+ *  query parameters are sent in URL
+ *  post parameters are sent in body
+ */
+LIB_EXPORT rc_t CC KClientHttpRequestPOST ( KClientHttpRequest *self, KClientHttpResult **_rslt )
+{
+    KHttpRetrier retrier;
+    rc_t rc = 0;
+
+    if ( self == NULL ) {
+        return RC ( rcNS, rcNoTarg, rcUpdating, rcSelf, rcNull );
+    }
+    if ( _rslt == NULL ) {
+        return RC ( rcNS, rcNoTarg, rcUpdating, rcParam, rcNull );
+    }
+
+    rc = KHttpRetrierInit ( & retrier, self -> url_buffer . base, self -> http -> mgr ); 
+    
+    if ( rc == 0 )
+    {
+        while ( rc == 0 ) 
+        {
+            rc = KClientHttpRequestPOST_Int ( self, _rslt );
+            if ( rc != 0 ) 
+            {   /* a non-HTTP problem */
+                break;
+            }
+
+            assert ( * _rslt );
+
+            if ( ( * _rslt ) -> status  == 403 &&
+                 GovSiteByHttp ( self -> url_buffer . base ) )
+            {
+                break;
+            }
+
+            if ( ! self -> http -> reliable || ! KHttpRetrierWait ( & retrier, ( * _rslt ) -> status ) )
+            {   /* We are either not configured to retry, or HTTP status is not retriable, or we exhausted
+                    the max number of retries or the total wait time.
+                    rc is 0, but the caller will have to look at _rslt->status to determine success */
+                break;
+            }
+
+            KClientHttpResultRelease ( * _rslt );
+        }
+        
+        {
+            rc_t rc2 = KHttpRetrierDestroy ( & retrier );
+            if ( rc == 0 ) rc = rc2;
+        }
+    }
+    
+    return rc;
+}
diff --git a/libs/kns/http-file.c b/libs/kns/http-file.c
new file mode 100644
index 0000000..33f0852
--- /dev/null
+++ b/libs/kns/http-file.c
@@ -0,0 +1,638 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+#include <kns/extern.h>
+
+#define KFILE_IMPL KHttpFile
+typedef struct KHttpFile KHttpFile;
+#include <kfs/impl.h>
+
+#include "http-priv.h"
+#include "mgr-priv.h"
+#include "stream-priv.h"
+
+#include <kproc/lock.h>
+#include <kns/adapt.h>
+#include <kns/endpoint.h>
+#include <kns/http.h>
+#include <kns/impl.h>
+#include <kns/kns-mgr-priv.h> /* KHttpRetrier */
+#include <kns/manager.h>
+#include <kns/socket.h>
+#include <kns/stream.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#ifdef ERR
+#undef ERR
+#endif
+
+#include <klib/container.h>
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/refcount.h>
+#include <klib/text.h>
+#include <klib/time.h> /* KSleep */
+#include <klib/vector.h>
+
+#include <kproc/timeout.h>
+
+#include <os-native.h>
+#include <strtol.h>
+#include <va_copy.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#if _DEBUGGING && 0
+#include <stdio.h>
+#define TRACE( x, ... ) \
+    fprintf ( stderr, "@@ %s:%d: %s: " x, __FILE__, __LINE__, __func__, __VA_ARGS__ )
+#else
+#define TRACE( x, ... ) \
+    ( ( void ) 0 )
+#endif
+
+#define USE_CACHE_CONTROL 1
+#define NO_CACHE_LIMIT ( ( uint64_t ) ( 16 * 1024 * 1024 ) )
+
+
+/*--------------------------------------------------------------------------
+ * KHttpFile
+ */
+struct KHttpFile
+{
+    KFile dad;
+    
+    uint64_t file_size;
+
+    const KNSManager * kns;
+
+    KLock * lock;
+    KClientHttp *http;
+
+    KDataBuffer url_buffer;
+
+    bool no_cache;
+};
+
+static
+rc_t CC KHttpFileDestroy ( KHttpFile *self )
+{
+    KLockRelease ( self -> lock );
+    KNSManagerRelease ( self -> kns );
+    KClientHttpRelease ( self -> http );
+    KDataBufferWhack ( & self -> url_buffer );
+    free ( self );
+
+    return 0;
+}
+
+static
+struct KSysFile* CC KHttpFileGetSysFile ( const KHttpFile *self, uint64_t *offset )
+{
+    * offset = 0;
+    return NULL;
+}
+
+static
+rc_t CC KHttpFileRandomAccess ( const KHttpFile *self )
+{
+    /* we ensure during construction that the server accepts partial range requests */
+    return 0;
+}
+
+/* KHttpFile must have a file size to be created
+   impossible for this funciton to fail */
+static
+rc_t CC KHttpFileSize ( const KHttpFile *self, uint64_t *size )
+{
+    * size = self -> file_size;
+    return 0;
+}
+
+static
+rc_t CC KHttpFileSetSize ( KHttpFile *self, uint64_t size )
+{
+    return RC ( rcNS, rcFile, rcUpdating, rcFile, rcReadonly );
+}
+
+static
+rc_t KHttpFileTimedReadInt ( const KHttpFile *cself,
+    uint64_t aPos, void *aBuf, size_t aBsize,
+    size_t *num_read, struct timeout_t *tm, uint32_t * http_status )
+{
+    uint64_t pos = aPos;
+    rc_t rc = 0;
+    KHttpFile *self = ( KHttpFile * ) cself;
+    KClientHttp *http = self -> http;
+    
+    * http_status = 0; 
+
+    /* starting position was beyond EOF */
+    if ( pos >= self -> file_size )
+    {
+        *num_read = 0;
+        return 0;
+    }
+#if 0
+    /* position is within http header buffer */
+    else if ( KClientHttpBlockBufferContainsPos ( http, pos ) )
+    {
+
+    }
+#endif
+    /* starting position was within file but the range fell beyond EOF */
+    else 
+    {
+        KClientHttpRequest *req;
+
+/* When we call KFileRead(HttpFile, pos > 0, bsize < 256)
+  several times on the same socket,
+  the server returns HTTP headers twice and no content: See VDB-1256, SYS-185053
+*/
+        char buf [ 256 ] = "";
+        void *bPtr = aBuf;
+        size_t bsize = aBsize;
+        uint32_t proxy_retries;
+
+        /* extend buffer size to MIN_SZ */
+        if ( bsize < sizeof buf )
+        {
+            bPtr = buf;
+            bsize = sizeof buf;
+        }
+
+        /* limit request to file size */
+        if ( pos + bsize > self -> file_size )
+        {
+            bsize = self -> file_size - pos;
+            if (bsize < sizeof buf)
+            {
+                size_t d = sizeof buf - bsize;
+                if (pos >= d)
+                {
+                    bsize += d;
+                    pos -= d;
+                }
+                else { /* TODO: Downloading file with size < 256:
+need to reopen the connection now;
+otherwise we are going to hit "Apache return HTTP headers twice" bug */
+                    bsize += pos;
+                    pos = 0;
+                }
+            }
+        }
+
+        assert(bsize >= sizeof buf || (pos == 0 && bsize == self -> file_size));
+
+        for ( proxy_retries = 5; rc == 0 && proxy_retries != 0; )
+        {
+            rc = KClientHttpMakeRequest ( http, &req, self -> url_buffer . base );
+            if ( rc != 0 )
+            {
+                TRACE ( "KClientHttpMakeRequest ( http, & req, url=\"%s\" ); failed: rc=%u\n", ( const char* ) self -> url_buffer . base, rc );
+                break;
+            }
+
+#if USE_CACHE_CONTROL
+            /* tell proxies not to cache if file is above limit */
+            if ( rc == 0 && self -> no_cache )
+                rc = KClientHttpRequestSetNoCache ( req );
+#endif
+            if ( rc == 0 )
+            {
+                /* request min ( bsize, file_size ) bytes */
+                rc = KClientHttpRequestByteRange ( req, pos, bsize );
+                if ( rc != 0 )
+                    TRACE ( "KClientHttpRequestByteRange ( req, pos=%lu, bsize=%lu ); failed: rc=%u\n", pos, bsize, rc );
+                else
+                {
+                    KClientHttpResult *rslt;
+                
+                    rc = KClientHttpRequestGET ( req, &rslt );
+                    if ( rc != 0 )
+                        TRACE ( "KClientHttpRequestGET ( req, & rslt ); failed: rc=%u\n", rc );
+                    else
+                    {
+                        /* dont need to know what the response message was */
+                        rc = KClientHttpResultStatus ( rslt, http_status, NULL, 0, NULL );
+                        if ( rc != 0 )
+                            TRACE ( "KClientHttpResultStatus ( rslt, & http_status, NULL, 0, NULL ); failed: rc=%u\n", rc );
+                        else
+                        {
+                            switch ( * http_status )
+                            {
+                            case 206:
+                            {
+                                uint64_t start_pos;
+                                size_t result_size;
+
+                                /* don't need retries now */
+                                proxy_retries = 0;
+
+                                /* extract actual amount being returned by server */
+                                rc = KClientHttpResultRange ( rslt, &start_pos, &result_size );
+                                if ( rc != 0 || start_pos != pos || result_size != bsize )
+                                {
+                                    if ( rc != 0 )
+                                        TRACE ( "KClientHttpResultRange ( rslt, & start_pos, & result_size ); failed: rc=%u\n", rc );
+                                    else
+                                    {
+                                        if ( start_pos != pos )
+                                            TRACE ( "KClientHttpResultRange ( rslt, & start_pos, & result_size ); failed: start_pos=%lu != pos=%lu\n", start_pos, pos );
+                                        if ( result_size != bsize )
+                                            TRACE ( "KClientHttpResultRange ( rslt, & start_pos, & result_size ); failed: result_size=%lu != bsize=%lu\n", result_size, bsize );
+                                    }
+                                }
+                                else
+                                {
+                                    KStream *response;
+                                
+                                    rc = KClientHttpResultGetInputStream ( rslt, &response );
+                                    if ( rc == 0 )
+                                    {
+                                        size_t skip = 0;
+
+                                        rc = KStreamTimedReadExactly( response, bPtr, result_size, tm );
+                                        if ( rc != 0 )
+                                        {
+                                            KStreamRelease ( response );
+                                            KClientHttpResultRelease ( rslt );
+                                            KClientHttpRequestRelease ( req );
+                                            KClientHttpClose ( http );
+                                            return ResetRCContext ( rc, rcNS, rcFile, rcReading );
+                                        }
+
+                                        if (pos != aPos)
+                                        {
+                                            assert(pos < aPos);
+                                            skip = aPos - pos;
+                                            assert(result_size >= skip);
+                                            result_size -= skip;
+                                        }
+
+                                        if (result_size > aBsize)
+                                            result_size = aBsize;
+
+                                        if (bPtr == buf)
+                                            memmove(aBuf, buf + skip, result_size);
+                                        else if (skip > 0)
+                                        {
+                                            const void *src = ( const char * ) aBuf + skip;
+                                            memmove(aBuf, src, result_size);
+                                        }
+
+                                        * num_read = result_size;
+
+                                        KStreamRelease ( response );
+                                    }
+                                }
+                                break;
+                            }
+
+                            case 403:
+                            case 404:
+                                if ( -- proxy_retries != 0 )
+                                {
+                                    TRACE ( "KClientHttpResultStatus ( rslt, & http_status, NULL, 0, NULL ); unexpected status=%d - sleeping and retrying\n", * http_status );
+                                    KSleep ( 1 );
+                                    rc = 0;
+                                    break;
+                                }
+
+                                /* NO BREAK */
+
+                            default:
+                                rc = RC ( rcNS, rcFile, rcReading, rcData, rcUnexpected );
+                                TRACE ( "KClientHttpResultStatus ( rslt, & http_status, NULL, 0, NULL ); unexpected status=%d\n", * http_status );
+                                break;
+                            }
+                        }
+
+                        KClientHttpResultRelease ( rslt );
+                    }
+                }
+
+                KClientHttpRequestRelease ( req );
+            }
+        }
+    }
+
+    if ( rc != 0 || * num_read == 0 )
+        KClientHttpClose ( http );
+    
+    return rc;
+}
+
+static
+rc_t KHttpFileTimedReadLocked ( const KHttpFile *cself,
+    uint64_t aPos, void *aBuf, size_t aBsize,
+    size_t * num_read, struct timeout_t * tm, uint32_t * http_status )
+{
+    rc_t rc = KLockAcquire ( cself -> lock );
+    if ( rc == 0 )
+    {
+        rc = KHttpFileTimedReadInt ( cself, aPos, aBuf, aBsize, num_read, tm, http_status );
+        KLockUnlock ( cself -> lock );
+    }
+    return rc;
+}
+
+static
+rc_t CC KHttpFileTimedRead ( const KHttpFile *self,
+    uint64_t pos, void *buffer, size_t bsize,
+    size_t *num_read, struct timeout_t *tm )
+{
+    KHttpRetrier retrier;
+    rc_t rc = KHttpRetrierInit ( & retrier, self -> url_buffer . base, self -> kns );
+    
+    if ( rc == 0 )
+    {
+        DBGMSG ( DBG_KNS, DBG_FLAG ( DBG_KNS_HTTP ), ( "KHttpFileTimedRead(pos=%lu)\n", pos ) );
+        
+        /* loop using existing KClientHttp object */
+        while ( rc == 0 ) 
+        {
+            uint32_t http_status;
+            rc = KHttpFileTimedReadLocked ( self, pos, buffer, bsize, num_read, tm, & http_status );
+            if ( rc != 0 ) 
+            {   
+                rc_t rc2=KClientHttpReopen ( self -> http );
+                DBGMSG ( DBG_KNS, DBG_FLAG ( DBG_KNS_HTTP ), ( "KHttpFileTimedRead: KHttpFileTimedReadLocked failed, reopening\n" ) );
+                if ( rc2 == 0 )
+                {
+                    rc2 = KHttpFileTimedReadLocked ( self, pos, buffer, bsize, num_read, tm, & http_status );
+                    if ( rc2 == 0 ) 
+                    {
+                        DBGMSG ( DBG_KNS, DBG_FLAG ( DBG_KNS_HTTP ), ( "KHttpFileTimedRead: reopened successfully\n" ) );
+                        rc= 0;
+                    }
+                    else 
+                    {
+                        DBGMSG ( DBG_KNS, DBG_FLAG ( DBG_KNS_HTTP ), ( "KHttpFileTimedRead: reopen failed\n" ) );
+                        break;
+                    }
+                }
+            }
+            if ( ! KHttpRetrierWait ( & retrier, http_status ) )
+            {
+                break;
+            }
+            rc = KClientHttpReopen ( self -> http );
+        }
+        
+        {
+            rc_t rc2 = KHttpRetrierDestroy ( & retrier );
+            if ( rc == 0 ) rc = rc2;
+        }
+    }
+    
+    return rc;
+}
+
+static
+rc_t CC KHttpFileRead ( const KHttpFile *self, uint64_t pos,
+     void *buffer, size_t bsize, size_t *num_read )
+{
+    struct timeout_t tm;
+    TimeoutInit ( & tm, self -> kns -> http_read_timeout );
+    return KHttpFileTimedRead ( self, pos, buffer, bsize, num_read, & tm );
+}
+
+static
+rc_t CC KHttpFileWrite ( KHttpFile *self, uint64_t pos, 
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    return RC ( rcNS, rcFile, rcUpdating, rcInterface, rcUnsupported );
+}
+
+static
+rc_t CC KHttpFileTimedWrite ( KHttpFile *self, uint64_t pos, 
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm )
+{
+    return RC ( rcNS, rcFile, rcUpdating, rcInterface, rcUnsupported );
+}
+
+static
+uint32_t CC KHttpFileGetType ( const KHttpFile *self )
+{
+    assert ( self != NULL );
+
+    /* the HTTP file behaves like a read-only file
+       returning kfdSocket would be imply absence of
+       random access: the HTTP protocol adds that. */
+
+    return kfdFile;
+}
+
+static KFile_vt_v1 vtKHttpFile = 
+{
+    1, 2,
+
+    KHttpFileDestroy,
+    KHttpFileGetSysFile,
+    KHttpFileRandomAccess,
+    KHttpFileSize,
+    KHttpFileSetSize,
+    KHttpFileRead,
+    KHttpFileWrite,
+    KHttpFileGetType,
+    KHttpFileTimedRead,
+    KHttpFileTimedWrite
+};
+
+static rc_t KNSManagerVMakeHttpFileInt ( const KNSManager *self,
+    const KFile **file, KStream *conn, ver_t vers, bool reliable,
+    const char *url, va_list args )
+{
+    rc_t rc;
+
+    if ( file == NULL )
+        rc = RC ( rcNS, rcFile, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC( rcNS, rcNoTarg, rcConstructing, rcParam, rcNull );
+        else if ( url == NULL )
+            rc = RC ( rcNS, rcFile, rcConstructing, rcPath, rcNull );
+        else if ( url [ 0 ] == 0 )
+            rc = RC ( rcNS, rcFile, rcConstructing, rcPath, rcInvalid );
+        else
+        {
+            KHttpFile *f;
+
+            f = calloc ( 1, sizeof *f );
+            if ( f == NULL )
+                rc = RC ( rcNS, rcFile, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KFileInit ( &f -> dad, ( const KFile_vt * ) &vtKHttpFile, "KHttpFile", url, true, false );
+                if ( rc == 0 )
+                {
+                    rc = KLockMake ( & f -> lock );
+                    if ( rc == 0 )
+                    {
+                        KDataBuffer *buf = & f -> url_buffer;
+                        buf -> elem_bits = 8;
+                        rc = KDataBufferVPrintf ( buf, url, args );
+                        if ( rc == 0 )
+                        {
+                            URLBlock block;
+                            rc = ParseUrl ( &block, buf -> base, buf -> elem_count - 1 );
+                            if ( rc == 0 ) 
+                            {
+                                KClientHttp *http;
+                          
+                                rc = KNSManagerMakeClientHttpInt ( self, & http, buf, conn, vers,
+                                    self -> http_read_timeout, self -> http_write_timeout, &block . host, block . port, reliable, block . tls );
+                                if ( rc == 0 )
+                                {
+                                    KClientHttpRequest *req;
+
+                                    rc = KClientHttpMakeRequestInt ( http, &req, &block, buf );
+                                    if ( rc == 0 )
+                                    {
+                                        KClientHttpResult *rslt;
+                                        rc = KClientHttpRequestHEAD ( req, & rslt );
+                                        KClientHttpRequestRelease ( req );
+
+                                        if ( rc == 0 )
+                                        {
+                                            uint64_t size;
+                                            uint32_t status;
+
+                                            size_t num_read;
+                                            char buffer [ 64 ];
+
+                                            /* get the file size from HEAD query */
+                                            bool have_size = KClientHttpResultSize ( rslt, & size );
+
+                                            /* see if the server accepts partial content range requests */
+                                            bool accept_ranges = false;
+                                            rc = KClientHttpResultGetHeader ( rslt, "Accept-Ranges", buffer, sizeof buffer, & num_read );
+                                            if ( rc == 0 && num_read == sizeof "bytes" - 1 &&
+                                                 strcase_cmp ( buffer, num_read, "bytes", sizeof "bytes" - 1, -1 ) == 0 )
+                                            {
+                                                accept_ranges = true;
+                                            }
+
+                                            /* check the result status */
+                                            rc = KClientHttpResultStatus ( rslt, & status, NULL, 0, NULL );
+
+                                            /* done with result */
+                                            KClientHttpResultRelease ( rslt );
+
+                                            /* check for error status */
+                                            if ( rc == 0 )
+                                            {
+                                                switch ( status )
+                                                {
+                                                case 200:
+                                                    if ( ! have_size )
+                                                        rc = RC ( rcNS, rcFile, rcOpening, rcSize, rcUnknown );
+                                                    else if ( ! accept_ranges )
+                                                        rc = RC ( rcNS, rcFile, rcOpening, rcFunction, rcUnsupported );
+                                                    break;
+                                                case 403:
+                                                    rc = RC ( rcNS, rcFile, rcOpening, rcFile, rcUnauthorized );
+                                                    break;
+                                                case 404:
+                                                    rc = RC ( rcNS, rcFile, rcOpening, rcFile, rcNotFound );
+                                                    break;
+                                                default:
+                                                    rc = RC ( rcNS, rcFile, rcValidating, rcNoObj, rcEmpty );
+                                                }
+
+                                                if ( rc == 0 )
+                                                {
+                                                    rc = KNSManagerAddRef ( self );
+                                                    if ( rc == 0 )
+                                                    {
+                                                        f -> kns = self;
+                                                        f -> file_size = size;
+                                                        f -> http = http;
+                                                        f -> no_cache = size >= NO_CACHE_LIMIT;
+                                                        
+                                                        * file = & f -> dad;
+                                                        return 0;
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+
+                                    KClientHttpRelease ( http );
+                                }
+                            }
+                        }
+
+                        KDataBufferWhack ( buf );
+                        KLockRelease ( f -> lock );
+                    }
+                }
+                free ( f );
+            }
+        }
+
+        * file = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KNSManagerMakeHttpFile(const KNSManager *self,
+    const KFile **file, struct KStream *conn, ver_t vers, const char *url, ...)
+{
+    rc_t rc = 0;
+    va_list args;
+    va_start(args, url);
+    rc = KNSManagerVMakeHttpFileInt ( self, file, conn, vers, false, url, args);
+    va_end(args);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KNSManagerMakeReliableHttpFile(const KNSManager *self,
+    const KFile **file, struct KStream *conn, ver_t vers, const char *url, ...)
+{
+    rc_t rc = 0;
+    va_list args;
+    va_start(args, url);
+    rc = KNSManagerVMakeHttpFileInt ( self, file, conn, vers, true, url, args);
+    va_end(args);
+    return rc;
+}
+
+LIB_EXPORT bool CC KFileIsKHttpFile ( const struct KFile * self )
+{
+    return self != NULL && &self->vt->v1 == &vtKHttpFile;
+}
diff --git a/libs/kns/http-priv.h b/libs/kns/http-priv.h
new file mode 100644
index 0000000..5019bd6
--- /dev/null
+++ b/libs/kns/http-priv.h
@@ -0,0 +1,132 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_http_priv_
+#define _h_http_priv_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_klib_data_buffer
+#include <klib/data-buffer.h>
+#endif
+
+#ifndef _h_klib_container
+#include <klib/container.h>
+#endif
+
+#ifndef MAX_HTTP_READ_LIMIT
+#define MAX_HTTP_READ_LIMIT ( 30 * 1000 )
+#endif
+
+#ifndef MAX_HTTP_WRITE_LIMIT
+#define MAX_HTTP_WRITE_LIMIT ( 15 * 1000 )
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+    
+struct KFile;
+struct KNSManager;
+struct KClientHttp;
+struct KClientHttpRequest;
+struct KStream;
+struct timeout_t;
+struct URLBlock;
+
+/*--------------------------------------------------------------------------
+ * KHttpHeader
+ *  node structure to place http header lines into a BSTree
+ */
+typedef struct KHttpHeader KHttpHeader;
+struct KHttpHeader
+{
+    BSTNode dad;
+    String name;
+    String value;
+    KDataBuffer value_storage;
+};
+    
+extern void KHttpHeaderWhack ( BSTNode *n, void *ignore );
+extern int64_t CC KHttpHeaderSort ( const BSTNode *na, const BSTNode *nb );
+extern int64_t CC KHttpHeaderCmp ( const void *item, const BSTNode *n );
+/*
+extern rc_t KHttpGetHeaderLine ( struct KClientHttp *self, struct timeout_t *tm, BSTree *hdrs, bool *blank, bool *close_connection );
+extern rc_t KHttpGetStatusLine ( struct KClientHttp *self, struct timeout_t *tm, String *msg, uint32_t *status, ver_t *version );
+*/
+
+/* compatibility for existing code */
+/*
+#define KHttpGetHeaderLine KClientHttpGetHeaderLine
+#define KHttpGetStatusLine KClientHttpGetStatusLine
+*/
+
+/*--------------------------------------------------------------------------
+ * KClientHttp
+ */
+
+/*
+rc_t KClientHttpOpen ( struct KClientHttp * self, const String * hostname, uint32_t port );
+*/
+void KClientHttpClose ( struct KClientHttp * self );
+rc_t KClientHttpReopen ( struct KClientHttp * self );
+
+rc_t KNSManagerMakeClientHttpInt ( struct KNSManager const *self, struct KClientHttp **_http,
+    const KDataBuffer *hostname_buffer,  struct KStream *opt_conn,
+    ver_t vers, int32_t readMillis, int32_t writeMillis,
+    const String *host, uint32_t port, bool reliable, bool tls );
+
+/* test */
+/*
+void KClientHttpForceSocketClose(const struct KClientHttp *self);
+*/
+
+/*--------------------------------------------------------------------------
+ * KClientHttpRequest
+ */
+rc_t KClientHttpMakeRequestInt ( struct KClientHttp const *self,
+    struct KClientHttpRequest **req, const struct URLBlock *block, const KDataBuffer *buf );
+
+
+/* exported private functions
+*/
+
+/* a hook to redefine KClientHttpReopen (for testing,_DEBUG only) */
+#if _DEBUGGING
+extern void SetClientHttpReopenCallback ( struct KStream * (*fn) ( void ) ); 
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kttp_priv_ */
diff --git a/libs/kns/http-retrier.c b/libs/kns/http-retrier.c
new file mode 100644
index 0000000..e72d31f
--- /dev/null
+++ b/libs/kns/http-retrier.c
@@ -0,0 +1,503 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+#include <kns/extern.h>
+
+#define KFILE_IMPL KHttpFile
+typedef struct KHttpFile KHttpFile;
+#include <kfs/impl.h>
+
+#include <kns/manager.h>
+
+#include <kfg/config.h>
+
+#include <klib/log.h>
+#include <klib/time.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+
+#include "mgr-priv.h"
+
+struct HttpRetrySchedule
+{
+    uint16_t    code; // 5 for 5xx, 4 for 4xx, otherwise http status code from 400 to 599
+    uint8_t     max_retries;
+    bool        open_ended; /* true = retry with the last sleep time until global retry limit or max sleep time is reached */
+    
+    uint16_t    sleep_before_retry[1]; // actual size determined at construction
+    /*do not define anything here*/
+};
+typedef struct HttpRetrySchedule HttpRetrySchedule;
+
+static
+void AddSleepTime ( uint16_t * retries, uint16_t idx, uint16_t value )
+{   /* make sure new value is not less than the previous */
+    if ( idx == 0 || value >= retries [ idx - 1 ] )
+    {
+        retries [ idx ] = value;
+    }
+    else
+    {
+        retries [ idx ] = retries [ idx - 1 ];
+    }
+}
+
+static
+rc_t HttpRetryCodesConfig( HttpRetrySchedule** self, uint16_t code, const String* retries )
+{   /* extract body, count commas, make sure all other characters are decimals */
+
+    /* make sure only decimals and commas are used, count commas */
+    String s = *retries; 
+    uint16_t retryCount = 0;
+    uint32_t ch;
+    bool in_number = false;
+    while ( StringPopHead ( &s, &ch ) == 0 && ch != 0 )
+    {
+        if ( ch == ',' )
+        {   
+            in_number = false;
+        }
+        else if ( ch == '+' )
+        {   /* + is only allowed immediately after the last number */
+            if ( ( s.len == 0 || s.addr [ 0 ] == 0 ) 
+                 && 
+                 in_number )
+            {
+                break;
+            }
+            else
+            {
+                return RC ( rcNS, rcData, rcCreating, rcNumeral, rcInvalid );
+            }
+        }
+        else if ( isdigit ( ch ) )
+        {
+            if ( ! in_number ) 
+            {   /* first digit of a new number */
+                ++retryCount;
+            }
+            in_number = true;
+        }
+        else
+        {
+            return RC ( rcNS, rcData, rcCreating, rcNumeral, rcInvalid );
+        }
+    }
+    
+    *self = (HttpRetrySchedule*) malloc( sizeof ( HttpRetrySchedule ) + sizeof ( uint16_t ) * ( retryCount - 1 ) ); 
+    if ( *self == NULL )
+    {
+        return RC ( rcNS, rcData, rcCreating, rcMemory, rcExhausted );
+    }
+    (*self) -> code = code;
+    (*self) -> max_retries = retryCount;
+    (*self) -> open_ended = false;
+    
+    {   /* populate sleep_before_retry and open_ended */
+        uint16_t cur_value = 0;
+        uint16_t curRetry = 0;
+        s = *retries; 
+        in_number = false;
+        while ( StringPopHead ( &s, &ch ) == 0 && ch != 0 )
+        {
+            if ( ch == ',' )
+            {   
+                if ( in_number )
+                {
+                    AddSleepTime ( (*self) -> sleep_before_retry, curRetry, cur_value );
+                    ++ curRetry;
+                }
+                in_number = false;
+            }
+            else if ( ch == '+' )
+            {
+                (*self) -> open_ended = true;
+                AddSleepTime ( (*self) -> sleep_before_retry, curRetry, cur_value );
+                return 0;
+            }
+            else if ( isdigit ( ch ) )
+            {
+                if ( ! in_number ) 
+                {   /* first digit of a new number */
+                    cur_value = ch - '0';
+                }
+                else
+                {
+                    cur_value = cur_value * 10 + ch - '0';
+                }
+                in_number = true;
+            }
+            else 
+            {
+                return RC ( rcNS, rcData, rcCreating, rcNumeral, rcInvalid );
+            }
+        }
+        if ( in_number ) 
+        {
+            AddSleepTime ( (*self) -> sleep_before_retry, curRetry, cur_value );
+        }
+    }    
+    return 0;
+}
+
+static
+rc_t HttpRetryCodesDefault ( HttpRetrySchedule** self, uint16_t code )
+{
+    String def;
+    CONST_STRING(&def, "0,5,10,15,30,60");
+    return HttpRetryCodesConfig ( self, code, &def );
+}
+
+static
+rc_t HttpRetrySpecsConfigNode ( const KConfigNode* node, const char* name, HttpRetrySchedule** self, uint16_t code )
+{
+    rc_t rc;
+    rc_t rc2;
+    const KConfigNode *child;
+    rc = KConfigNodeOpenNodeRead ( node, &child, "%s", name );
+    if ( rc == 0 )
+    {
+        String * value;
+        rc = KConfigNodeReadString ( child, &value );
+        if ( rc == 0 )
+        {
+            rc = HttpRetryCodesConfig( self, code, value);
+            free(value);
+        }
+        rc2 = KConfigNodeRelease ( child );
+        if ( rc == 0 )
+        {
+            rc = rc2;
+        }
+    }
+    return rc;
+}                
+
+static
+rc_t HttpRetrySpecsFromConfig ( HttpRetrySpecs* self, const KConfigNode* node )
+{   /* retrieves only 5xx and 4xx codes */
+    uint32_t total = 0;
+    bool has4xx = false;
+    bool has5xx = false;
+    KNamelist * names;
+    uint32_t nameCount;
+    rc_t rc = KConfigNodeListChildren ( node, & names );
+    if ( rc == 0 )
+    {   /* count 4xx and 5xx */
+        uint32_t i;
+        rc = KNamelistCount ( names, & nameCount );
+        if ( rc == 0 )
+        {
+            for ( i = 0; i < nameCount; ++ i )
+            {
+                const char *name;
+                size_t size; 
+                rc = KNamelistGet ( names, i, & name );
+                if (rc != 0)
+                {
+                    KNamelistRelease ( names );
+                    break;
+                }
+                size = string_size(name);
+                if ( size == 3 )
+                {
+                    if ( string_cmp ( name, string_size(name), "4xx", 3, 3 ) == 0 )
+                    {
+                        has4xx = true;
+                        ++total;
+                    }
+                    else if ( string_cmp ( name, string_size(name), "5xx", 3, 3 ) == 0 )
+                    {
+                        has5xx = true;
+                        ++total;
+                    }
+                    else if ( name[0] == '4' || name[0] == '5' )
+                    {
+                        ++total;
+                    }
+                    else
+                    { /*LOG a bad name*/
+                    }
+                }
+                else
+                {/*LOG a bad name*/
+                }
+            }
+        }
+        /* add extra for 4xx and 5xx catch-alls if not specified */
+        if ( ! has4xx ) ++total;
+        if ( ! has5xx ) ++total;
+    }
+    
+    if (rc == 0)
+    {
+        rc_t rc2;
+        uint32_t i;
+        uint32_t cur = 0;
+        self -> count = total;
+        self -> codes = (HttpRetrySchedule**) calloc ( self -> count, sizeof * self -> codes );
+        for ( i = 0; i < nameCount; ++ i )
+        {
+            const char *name;
+            rc = KNamelistGet ( names, i, & name );  
+            
+            /* convert name to code */
+            assert ( string_size(name) == 3 );
+            if ( string_cmp ( name, 3, "4xx", 3, 3 ) == 0 )
+                rc = HttpRetrySpecsConfigNode ( node, name, & self -> codes [ cur ], 4 );
+            else if ( string_cmp ( name, 3, "5xx", 3, 3 ) == 0 )
+                rc = HttpRetrySpecsConfigNode ( node, name, & self -> codes [ cur ], 5 );
+            else if ( name[0] == '4' || name[0] == '5' )
+                rc = HttpRetrySpecsConfigNode ( node, name, & self -> codes [ cur ], ( uint16_t ) strtoul ( name, NULL, 10 ) );
+            else            
+            { /* invalid code, skip */
+                continue;
+            }
+            
+            if ( rc != 0 )
+            {
+                break;
+            }
+            ++cur;
+        }
+        
+        rc2 = KNamelistRelease ( names );
+        if ( rc == 0 )
+        {
+            rc = rc2;
+        }
+        if ( rc == 0 )
+        {
+            /* if 4xx and/or 5xx were not specified, fill in the defaults */
+            if ( ! has4xx ) 
+            {
+                rc = HttpRetryCodesDefault ( & self -> codes [cur], 4 );
+                if ( rc != 0 )
+                {
+                    free ( self -> codes );
+                    return rc;
+                }
+                ++cur;
+            }
+            if ( ! has5xx ) 
+            {
+                rc = HttpRetryCodesDefault ( & self -> codes [cur], 5 );
+                if ( rc != 0 )
+                {
+                    free ( self -> codes );
+                    return rc;
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+rc_t CC HttpRetrySpecsDestroy(HttpRetrySpecs* self)
+{
+    uint8_t i;
+    for ( i = 0; i < self -> count; ++i )
+    {
+        free ( self -> codes [ i ] );
+    }
+    free ( self -> codes );
+    return 0;
+}
+
+rc_t CC HttpRetrySpecsInit(HttpRetrySpecs* self, KConfig* kfg)
+{
+    const KConfigNode* node;
+    rc_t rc = KConfigOpenNodeRead ( kfg, &node, "http/reliable" );
+    if ( rc == 0 )
+    {   
+        rc_t rc2;
+        rc = HttpRetrySpecsFromConfig ( self, node );
+        rc2 = KConfigNodeRelease(node);
+        if ( rc == 0 )
+            rc = rc2;
+    }
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {   /* set to defaults */
+        self -> count = 2;
+        self -> codes = (HttpRetrySchedule**) malloc ( ( sizeof * self -> codes ) * self -> count );
+        if ( self -> codes  == NULL )
+        {
+            return RC ( rcNS, rcData, rcCreating, rcMemory, rcExhausted );
+        }
+        
+        rc = HttpRetryCodesDefault ( & self -> codes [0], 4 );
+        if ( rc != 0 )
+        {
+            HttpRetrySpecsDestroy ( self );
+            return rc;
+        }
+        rc = HttpRetryCodesDefault ( & self -> codes [1], 5 );
+        if ( rc != 0 )
+        {
+            HttpRetrySpecsDestroy ( self );
+            return rc;
+        }
+    }   
+    
+    return rc;
+}
+
+bool HttpGetRetryCodes ( const HttpRetrySpecs* self, 
+                         uint16_t code, 
+                         uint8_t * max_retries, 
+                         const uint16_t ** sleep_before_retry, 
+                         bool * open_ended )
+{
+    int8_t catchAllIdx = -1;
+    uint8_t i;
+    
+    assert ( self );
+    assert ( max_retries );
+    assert ( sleep_before_retry );
+    assert ( open_ended );
+    
+    for ( i = 0; i < self -> count; ++i )
+    {
+        if ( self -> codes [ i ] -> code == code ) 
+        {
+            * max_retries = self -> codes [ i ] -> max_retries;
+            * sleep_before_retry = self -> codes [ i ] -> sleep_before_retry;
+            * open_ended = self -> codes [ i ] -> open_ended;
+            return true;
+        }
+        if ( catchAllIdx == -1 && self -> codes [ i ] -> code == code / 100 ) /* if more than one catch-all, use the first */
+        {
+            catchAllIdx = i;
+        }
+    }
+    
+    if ( catchAllIdx != -1 )
+    {   // code not found but there is a common setting for its group (4xx or 5xx)
+        * max_retries = self -> codes [ catchAllIdx ] -> max_retries;
+        * sleep_before_retry = self -> codes [ catchAllIdx ] -> sleep_before_retry;
+        * open_ended = self -> codes [ catchAllIdx ] -> open_ended;
+        return true;
+    }
+    
+    return false;
+}
+
+rc_t KHttpRetrierInit ( KHttpRetrier * self,    
+                        const char * url, 
+                        const struct KNSManager * kns )
+{
+    rc_t rc;
+    assert ( self );
+    assert ( kns );
+
+    memset ( self, 0, sizeof *self );
+
+    self -> url = url;
+    
+    rc = KNSManagerAddRef ( kns );
+    if ( rc != 0 )
+    {
+        return rc;
+    }
+    
+    self -> kns = kns;
+    self -> max_retries = kns -> maxNumberOfRetriesOnFailureForReliableURLs;
+    self -> max_total_wait_ms = kns -> maxTotalWaitForReliableURLs_ms;
+    
+    return 0;
+}
+
+rc_t KHttpRetrierDestroy ( KHttpRetrier * self )
+{
+    return KNSManagerRelease ( self -> kns );
+}
+
+bool KHttpRetrierWait ( KHttpRetrier * self, uint32_t status )
+{
+    assert ( self );
+    
+    if ( self -> last_status != status )
+    {
+        self -> last_status = status;
+        self -> retries_count = 0;
+        self -> total_wait_ms = 0;
+    }
+    
+    if ( self -> retries_count >= self -> max_retries || self -> total_wait_ms >= self -> max_total_wait_ms )
+    {
+        return false;
+    }
+    else
+    {
+        uint32_t to_sleep;
+        uint8_t max_retries;
+        const uint16_t * sleep_before_retry;
+        bool open_ended;
+        if ( ! HttpGetRetryCodes ( & self -> kns -> retry_specs, status, & max_retries, & sleep_before_retry, & open_ended ) )
+        {
+            return false;
+        }
+        
+        if ( self -> retries_count >= max_retries )
+        {   
+            if ( open_ended )
+            {
+                to_sleep = sleep_before_retry [ max_retries - 1 ];
+            }
+            else
+            {
+                return false;
+            }
+        }
+        else
+        {
+            to_sleep = sleep_before_retry [ self -> retries_count ];
+        }
+        
+        if ( self -> total_wait_ms + to_sleep > self -> max_total_wait_ms )
+        {
+            to_sleep = self -> max_total_wait_ms - self -> total_wait_ms;
+        }
+        self -> last_sleep = to_sleep;
+        KSleepMs( to_sleep );
+        self -> total_wait_ms += to_sleep;
+        ++ self -> retries_count;
+        
+        PLOGMSG (klogInfo, ( klogInfo, "HTTP read failure: URL=\"$(u)\" status=$(s); tried $(c)/$(m) times for $(t) milliseconds total",
+                            "u=%s,s=%d,c=%d,m=%d,t=%d", 
+                            self -> url, 
+                            status,
+                            self -> retries_count,
+                            open_ended ? self -> max_retries : max_retries, 
+                            self -> total_wait_ms ) );        
+        
+        return true;
+    }
+}
+
diff --git a/libs/kns/http.c b/libs/kns/http.c
new file mode 100644
index 0000000..5d9547f
--- /dev/null
+++ b/libs/kns/http.c
@@ -0,0 +1,341 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+#include <kns/extern.h>
+
+#include <kns/manager.h>
+#include <kns/http.h>
+#include <kns/adapt.h>
+#include <kns/endpoint.h>
+#include <kns/socket.h>
+#include <kns/stream.h>
+#include <kns/impl.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#ifdef ERR
+#undef ERR
+#endif
+
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/text.h>
+#include <klib/container.h>
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <klib/vector.h>
+#include <kproc/timeout.h>
+
+#include <os-native.h>
+#include <strtol.h>
+#include <va_copy.h>
+
+#include "mgr-priv.h"
+#include "stream-priv.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "http-priv.h"
+
+/*--------------------------------------------------------------------------
+ * URLBlock
+ *  RFC 3986
+ *
+ * TBD - replace with VPath
+ */
+
+/* Init
+ *  Initialize to default values in case portions are missing
+ */
+void URLBlockInit ( URLBlock *self )
+{
+    CONST_STRING ( & self -> scheme, "http" );
+    CONST_STRING ( & self -> host, "" );
+    CONST_STRING ( & self -> path, "/" );
+    CONST_STRING ( & self -> query, "" );
+    CONST_STRING ( & self -> fragment, "" );
+
+    self -> port = 0; /* 0 = DEFAULT 80 for http, 443 for https */
+
+    self -> scheme_type = st_NONE;
+    self -> tls = false;
+
+    self -> port_dflt = true;
+}
+
+/* ParseUrl
+ *  accept standard, full http URL:
+ *    <scheme>://<host>[:<port>]/<path>[?<query>][#<fragment>]
+ *
+ *  scheme can be missing, i.e.:
+ *    //<host>[:<port>]/<path>[?<query>][#<fragment>]
+ *
+ *  we can also accept missing path[query][fragment], i.e.:
+ *    <scheme>://<host>[:<port>]
+ *    //<host>[:<port>]
+ *
+ *  finally, we can accept path without host, i.e.:
+ *    /<path>[?<query>][#<fragment>]
+ *
+ *  patterns to reject:
+ *    <scheme>:/<path>...    # scheme followed by anything other than '//'
+ *    <path>...              # no leading '/'
+ */
+rc_t ParseUrl ( URLBlock * b, const char * url, size_t url_size ) 
+{
+    rc_t rc;
+    char * sep;
+    const char * buf = url;
+    const char * end = buf + url_size;
+
+    bool have_host, have_scheme;
+
+    URLBlockInit ( b );
+
+    /* scheme default to false because url may be a path */
+    have_scheme = false;
+
+    /* check if url is empty
+       scheme cannot start with a forward slash - detecting an absolute path */
+    if ( buf < end && buf [ 0 ] != '/' )
+    {
+        /* here we identify the scheme by finding the ':' */
+        sep = string_chr ( url, end - buf, ':' );
+        if ( sep != NULL )
+        {
+            String http;
+            CONST_STRING ( & http, "http" );
+
+            /* assign scheme to the url_block */
+            StringInit ( & b -> scheme, buf, sep - buf, ( uint32_t ) ( sep - buf ) );
+
+            /* here we assume the scheme will be http */
+            b -> port = 80;
+            b -> scheme_type = st_HTTP;
+            if ( ! StringCaseEqual ( & b -> scheme, & http ) )
+            {
+                String https;
+                CONST_STRING ( & https, "https" );
+
+                /* check for https */
+                b -> port = 443;
+                b -> scheme_type = st_HTTPS;
+                b -> tls = true;
+                if ( ! StringCaseEqual ( & b -> scheme, & https ) )
+                {
+                    String s3;
+                    CONST_STRING ( & s3, "s3" );
+                
+                    /* it is not http, check for s3 */
+                    b -> port = 80;
+                    b -> scheme_type = st_S3;
+                    b -> tls = false;
+                    if ( ! StringCaseEqual ( & b -> scheme, & s3 ) )
+                    {
+                        b -> port = 0;
+                        b -> scheme_type = st_NONE;
+                        rc = RC ( rcNS, rcUrl, rcEvaluating, rcName, rcIncorrect );
+                        PLOGERR ( klogErr ,( klogErr, rc, "Scheme is '$(scheme)'", "scheme=%S", & b -> scheme ) );
+                        return rc;
+                    }
+                }
+            }
+
+            /* accept scheme - skip past */
+            buf = sep + 1;
+            have_scheme = true;
+        }
+    }
+    
+    /* discard fragment - not sending to server, but still record it */
+    sep = string_rchr ( buf, end - buf,  '#' );
+    if ( sep != NULL )
+    {
+        /* advance to first character in fragment */
+        const char *frag = sep + 1;
+
+        /* assign fragment to the url_block */
+        StringInit ( & b -> fragment, frag, end - frag, ( uint32_t ) ( end - frag ) );
+
+        /* remove fragment from URL */
+        end = sep;
+    }
+                         
+    /* detect host */
+    have_host = false;
+    
+    /* check for '//' in the first two elements 
+       will fail if no scheme was detected */
+    if ( string_match ( "//", 2, buf, end - buf, 2, NULL ) == 2 )
+    {
+        /* skip ahead to host spec */
+        buf += 2;
+
+        /* if we ran into the end of the string, we dont have a host */
+        if ( buf == end )
+        {
+            rc = RC ( rcNS, rcUrl, rcParsing, rcOffset, rcIncorrect );
+            PLOGERR ( klogErr ,( klogErr, rc, "expected hostspec in url '$(url)'", "url=%.*s", ( uint32_t ) url_size, url ) );
+            return rc;
+        }
+
+        have_host = true;
+    }
+
+    /* if there is a scheme but no host, error */
+    if ( have_scheme && ! have_host )
+    {
+        rc = RC ( rcNS, rcUrl, rcParsing, rcName, rcNotFound );
+        PLOGERR ( klogErr ,( klogErr, rc, "Host is '$(host)'", "host=%s", "NULL" ) );
+        return rc;
+    }
+        
+    /* find dividing line between host and path, which MUST start with '/' */
+    sep = string_chr ( buf, end - buf, '/' );
+
+    /* detect no path */
+    if ( sep == NULL )
+    {
+        /* no path and no host */
+        if ( ! have_host )
+        {
+            rc = RC ( rcNS, rcUrl, rcParsing, rcName, rcNotFound );
+            PLOGERR ( klogErr ,( klogErr, rc, "Path is '$(path)'", "path=%s", "/" ) );
+            return rc;
+        }
+        /* no path but have host 
+           default value for path is already '/' */
+        sep = ( char* ) end;
+    }
+
+    /* capture host ( could be empty - just given a file system path ) */
+    if ( have_host )
+    {
+        /* assign host to url_block */
+        StringInit ( & b -> host, buf, sep - buf, ( uint32_t ) ( sep - buf ) );
+
+        /* advance to path */
+        buf = sep;
+    }
+
+    /* detect relative path 
+       <hostname>/<path> - OK, handled above
+       /<path> - OK
+    */
+    if ( buf != sep )
+    {
+        rc = RC ( rcNS, rcPath, rcParsing, rcOffset, rcIncorrect );
+        PLOGERR ( klogErr ,( klogErr, rc, "Path is '$(path)'", "path=%s", "NULL" ) );
+        return rc;
+    }
+
+    /* if we dont have a host we must have a path
+       if we DO have a host and the path is not empty */
+    if ( ! have_host || buf != end )
+    {
+        /* check for query */
+        sep = string_chr ( buf, end - buf,  '?' );
+        if ( sep != NULL )
+        {
+            const char *query = sep + 1;
+            /* assign query to url_block */
+            StringInit ( & b -> query, query, end - query, ( uint32_t ) ( end - query ) ); 
+
+            /* advance end to sep */
+            end = sep;
+        }
+
+        /* assign path ( could also be empty ) */
+        StringInit ( & b -> path, buf, end - buf, ( uint32_t ) ( end - buf ) );
+    }
+
+    /* if we have a host, split on ':' to check for a port
+       OK if not found */
+    if ( have_host )
+    {
+        buf = b -> host . addr;
+        end = buf + b -> host . size;
+
+        /* check for port */
+        sep = string_chr ( buf, end - buf,  ':' );
+        if ( sep != NULL )
+        {
+            char *term;
+            const char * port = sep + 1;
+            /* assign port to url block converting to 32 bit int 
+             term should point to end */
+            b -> port = strtou32 ( port, & term, 10 );
+
+            /* error if 0 or term isnt at the end of the buffer */
+            if ( b -> port == 0 || ( const char* ) term != end )
+            {
+                rc = RC ( rcNS, rcUrl, rcParsing, rcNoObj, rcIncorrect );
+                PLOGERR ( klogErr ,( klogErr, rc, "Port is '$(port)'", "port=%u", b -> port ) );
+                return rc;
+            }
+
+            b -> port_dflt = false;
+
+            /* assign host to url_block */
+            StringInit ( & b -> host, buf, sep - buf, ( uint32_t ) ( sep - buf ) );
+        }
+    }
+    
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * KHttpHeader
+ *  node structure to place http header lines into a BSTree
+ */
+
+void CC KHttpHeaderWhack ( BSTNode *n, void *ignore )
+{
+    KHttpHeader * self = ( KHttpHeader* ) n;
+    KDataBufferWhack ( & self -> value_storage );
+    free ( self );
+}
+
+int64_t CC KHttpHeaderSort ( const BSTNode *na, const BSTNode *nb )
+{
+    const KHttpHeader *a = ( const KHttpHeader* ) na;
+    const KHttpHeader *b = ( const KHttpHeader* ) nb;
+
+    return StringCaseCompare ( & a -> name, & b -> name );
+}
+
+int64_t CC KHttpHeaderCmp ( const void *item, const BSTNode *n )
+{
+    const String *a = item;
+    const KHttpHeader *b = ( const KHttpHeader * ) n;
+
+    return StringCaseCompare ( a, & b -> name );
+}
diff --git a/libs/kns/kns_manager-ext.c b/libs/kns/kns_manager-ext.c
new file mode 100644
index 0000000..0d82f7a
--- /dev/null
+++ b/libs/kns/kns_manager-ext.c
@@ -0,0 +1,157 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kns/extern.h>
+
+#include <kns/manager-ext.h>
+#include <kns/http.h>
+#include <kns/stream.h>
+
+#include <klib/sra-release-version.h>
+#include <klib/data-buffer.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+
+
+/** These functions belong to Extended KNSManager **/
+
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+static rc_t CC KNSManagerNewReleaseVersionImpl(const struct KNSManager *self,
+    SraReleaseVersion *newVersion)
+{
+    rc_t rc = 0;
+    KDataBuffer result;
+    KHttpRequest *req = NULL;
+    KHttpResult *rslt = NULL;
+    if (newVersion == NULL) {
+        return RC(rcNS, rcArgv, rcAccessing, rcParam, rcNull);
+    }
+    memset(newVersion, 0, sizeof *newVersion);
+    if (self == NULL) {
+        return RC(rcNS, rcArgv, rcAccessing, rcSelf, rcNull);
+    }
+    memset(&result, 0, sizeof result);
+    if (rc == 0) {
+        rc = KNSManagerMakeRequest(self, &req, 0x01010000, NULL,
+  "https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/current/sratoolkit.current.version"
+        );
+    }
+    if (rc == 0) {
+        rc = KHttpRequestGET(req, &rslt);
+    }
+    if (rc == 0) {
+        uint32_t code = 0;
+        rc = KHttpResultStatus(rslt, &code, NULL, 0, NULL);
+        if (rc == 0) {
+            if (code != 200) {
+                rc = RC(rcNS, rcFile, rcReading, rcFile, rcInvalid);
+            }
+        }
+    }
+    if (rc == 0) {
+        size_t total = 0;
+        KStream *response = NULL;
+        rc = KHttpResultGetInputStream(rslt, &response);
+        if (rc == 0) {
+            rc = KDataBufferMakeBytes(&result, 1024);
+        }
+        while (rc == 0) {
+            size_t num_read = 0;
+            uint8_t *base = NULL;
+            uint64_t avail = result.elem_count - total;
+            if (avail < 256) {
+                rc = KDataBufferResize(&result, result.elem_count + 1024);
+                if (rc != 0) {
+                    break;
+                }
+            }
+            base = result.base;
+            rc = KStreamRead(response, &base[total], result.elem_count - total,
+                &num_read);
+            if (num_read > 0 || rc != 0) {
+                DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS), ("KStreamRead"
+                    "(sratoolkit.current.version, %zu) = %R\n", num_read, rc));
+            }
+            if (rc != 0) {
+                /* TBD - look more closely at rc */
+                if (num_read > 0) {
+                    rc = 0;
+                }
+                else {
+                    break;
+                }
+            }
+            if (num_read == 0) {
+                break;
+            }
+            total += num_read;
+        }
+        RELEASE(KStream, response);
+        if (rc == 0) {
+            DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS),
+                ("sratoolkit.current.version (%zu)\n", total));
+            result.elem_count = total;
+        }
+    }
+
+    if (rc == 0) {
+        const char *start = (const void*)(result.base);
+        size_t size = KDataBufferBytes(&result);
+        DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS),
+            ("sratoolkit.current.version = '%.*s'\n", (uint32_t)size, start));
+        rc = SraReleaseVersionInit(newVersion, start, size);
+    }
+
+    KDataBufferWhack(&result);
+    RELEASE(KHttpResult, rslt);
+    RELEASE(KHttpRequest, req);
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KNSManagerNewReleaseVersion(const struct KNSManager *self,
+    SraReleaseVersion *newVersion)
+{
+    rc_t rc = 0;
+    int i = 0, retryOnFailure = 2;
+    for (i = 0; i < retryOnFailure; ++i) {
+        rc = KNSManagerNewReleaseVersionImpl(self, newVersion);
+        if (rc == 0) {
+            break;
+        }
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_ERR), (
+            "@@@@@@@@2: KNSManagerNewReleaseVersion %d/%d = %R"
+            "\n", i + 1, retryOnFailure, rc));
+    }
+    return rc;
+}
diff --git a/libs/kns/kns_manager.c b/libs/kns/kns_manager.c
new file mode 100644
index 0000000..a0dbc2c
--- /dev/null
+++ b/libs/kns/kns_manager.c
@@ -0,0 +1,346 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kns/extern.h>
+
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <kfs/dyload.h>
+#include <kfs/directory.h>
+#include <kfs/impl.h>
+
+#include "kns_mgr_priv.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+#include <sysalloc.h>
+
+static const char knsmanager_classname [] = "KNSManager";
+static struct KNSManager * kns_mgr_singleton = NULL;
+static KDylib *lib_curl_handle = NULL;
+
+
+LIB_EXPORT rc_t CC KNSManagerAddRef ( const struct KNSManager *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd( &self->refcount, knsmanager_classname ) )
+        {
+        case krefOkay:
+            break;
+        case krefZero:
+            return RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcIncorrect);
+        case krefLimit:
+            return RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcExhausted);
+        case krefNegative:
+            return RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid);
+        default:
+            return RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcUnknown);
+        }
+    }
+    return 0;
+}
+
+
+static rc_t KNSManager_Make_DlCurl( KDyld ** dl )
+{
+    rc_t rc = KDyldMake ( dl );
+#if ! WINDOWS
+    if ( rc == 0 )
+    {
+        const KDirectory * dir;
+        rc = KDyldHomeDirectory ( *dl, &dir, ( fptr_t ) KNSManager_Make_DlCurl );
+        if ( rc == 0 )
+        {
+            struct KSysDir const *sysdir = KDirectoryGetSysDir ( dir );
+            if ( sysdir != NULL )
+            {
+                char int_path[ 4096 ];
+                rc = KSysDirRealPath ( sysdir, int_path, sizeof int_path, "." );
+                if ( rc == 0 )
+                {
+                    KDyldAddSearchPath ( *dl, int_path );
+                }
+            }
+            KDirectoryRelease( dir );
+        }
+        rc = 0;
+    }
+#endif
+    return rc;
+}
+
+static rc_t KNSManagerLoadLib( struct KNSManager *self )
+{
+#ifdef HAVE_LIBCURL /* just link directly */
+    self->curl_easy_init_fkt      = &curl_easy_init;
+    self->curl_easy_cleanup_fkt   = &curl_easy_cleanup;
+    self->curl_easy_setopt_fkt    = &curl_easy_setopt;
+    self->curl_easy_perform_fkt   = &curl_easy_perform;
+    self->curl_easy_getinfo_fkt   = &curl_easy_getinfo;
+    self->curl_slist_append_fkt   = &curl_slist_append;
+    self->curl_slist_free_all_fkt = &curl_slist_free_all;
+
+    return 0;
+#else
+    KDyld *dl;
+    /* make a dynamic-library loader */
+    rc_t rc = KDyldMake ( &dl );
+    if ( rc == 0 )
+    {
+        /* load the curl-library */
+        rc = KDyldLoadLib( dl, &lib_curl_handle, LPFX "curl" SHLX );
+        if ( rc != 0 )
+        {
+            KDyldRelease ( dl );
+            rc = KNSManager_Make_DlCurl( &dl );
+            if ( rc == 0 )
+            {
+                rc = KDyldLoadLib( dl, &lib_curl_handle, LPFX "curl" SHLX );
+            }
+        }
+        if ( rc == 0 )
+        {
+            KSymAddr *sym;
+
+            /* resolve symbols */
+
+            /* curl_easy_init() */
+            rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_init" );
+            if ( rc == 0 )
+            {
+                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_init_fkt) );
+                KSymAddrRelease( sym );
+            }
+
+            /* curl_easy_cleanup() */
+            if ( rc == 0 )
+            {
+                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_cleanup" );
+                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_cleanup_fkt) );
+                KSymAddrRelease( sym );
+            }
+
+            /* curl_easy_setopt() */
+            if ( rc == 0 )
+            {
+                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_setopt" );
+                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_setopt_fkt) );
+                KSymAddrRelease( sym );
+            }
+
+            /* curl_easy_perform() */
+            if ( rc == 0 )
+            {
+                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_perform" );
+                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_perform_fkt) );
+                KSymAddrRelease( sym );
+            }
+
+            /* curl_easy_getinfo() */
+            if ( rc == 0 )
+            {
+                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_getinfo" );
+                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_getinfo_fkt) );
+                KSymAddrRelease( sym );
+            }
+
+            /* curl_slist_append() */
+            if ( rc == 0 )
+            {
+                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_slist_append" );
+                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_slist_append_fkt) );
+                KSymAddrRelease( sym );
+            }
+
+            /* curl_version() */
+            if ( rc == 0 )
+            {
+                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_version" );
+                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_version_fkt) );
+                KSymAddrRelease( sym );
+            }
+
+            /* curl_slist_free_all() */
+            if ( rc == 0 )
+            {
+                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_slist_free_all" );
+                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_slist_free_all_fkt) );
+                KSymAddrRelease( sym );
+            }
+
+            /* bail on error */
+            if ( rc != 0 )
+            {
+                KDylibRelease ( lib_curl_handle );
+                lib_curl_handle = NULL;
+                self->curl_easy_init_fkt = NULL;
+                self->curl_easy_cleanup_fkt = NULL;
+                self->curl_easy_setopt_fkt = NULL;
+                self->curl_easy_perform_fkt = NULL;
+                self->curl_slist_append_fkt = NULL;
+                self->curl_version_fkt = NULL;
+                self->curl_easy_getinfo_fkt = NULL;
+            }
+        }
+        KDyldRelease ( dl );
+    }
+
+    return rc;
+#endif
+}
+
+
+LIB_EXPORT rc_t CC KNSManagerMake( struct KNSManager **self )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        return RC( rcNS, rcMgr, rcConstructing, rcSelf, rcNull );
+
+    *self = kns_mgr_singleton;
+    if ( kns_mgr_singleton != NULL )
+    {
+/*      fprintf(stderr, "%p KNSManagerMake(KNSManagerAddRef)\n", *self); */
+        rc = KNSManagerAddRef( kns_mgr_singleton );
+        if ( rc != 0 )
+            *self = NULL;
+    }
+    else
+    {
+        struct KNSManager *tmp;
+        tmp = calloc( 1, sizeof * tmp );
+        if ( tmp == NULL )
+            rc = RC( rcNS, rcMgr, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KNSManagerInit ( tmp );
+            if ( rc != 0 )
+            {
+                free ( tmp );
+                tmp = NULL;
+            }
+            else
+            {
+                tmp->create_rc = KNSManagerLoadLib( tmp );
+                KRefcountInit( &tmp->refcount, 1, "KNS", "make", knsmanager_classname );
+
+/*              fprintf(stderr,
+                    "%p KNSManagerLoadLib = %d\n", tmp, tmp->create_rc); */
+            }
+        }
+        *self = tmp;
+        kns_mgr_singleton = tmp;
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KNSManagerAvail( const struct KNSManager *self )
+{
+    if ( self == NULL )
+        return RC( rcNS, rcMgr, rcReading, rcSelf, rcNull );
+    return self->create_rc;
+}
+
+
+LIB_EXPORT rc_t CC KNSManagerCurlVersion( const struct KNSManager *self, const char ** version_string )
+{
+    if ( self == NULL )
+        return RC( rcNS, rcMgr, rcReading, rcSelf, rcNull );
+    if ( version_string == NULL )
+        return RC( rcNS, rcMgr, rcReading, rcParam, rcNull );
+    if ( self->create_rc != 0 )
+        return self->create_rc;
+    *version_string = self->curl_version_fkt();
+    return 0;
+}
+
+
+LIB_EXPORT void KNSManagerSetVerbose ( struct KNSManager *self, bool verbosity )
+{
+    if ( self != NULL )
+        self->verbose = verbosity;
+}
+
+
+LIB_EXPORT bool KNSManagerIsVerbose ( struct KNSManager *self )
+{
+    if ( self != NULL )
+        return self->verbose;
+    else
+        return false;
+}
+
+
+static rc_t KNSManagerDestroy( struct KNSManager *self )
+{
+    if ( self == NULL )
+        return RC( rcNS, rcFile, rcDestroying, rcSelf, rcNull );
+
+/*  fprintf(stderr, "%p KNSManagerDestroy\n", self); */
+
+    KDylibRelease ( lib_curl_handle );
+    lib_curl_handle = NULL;
+
+    KNSManagerCleanup ( self );
+
+    KRefcountWhack( &self->refcount, knsmanager_classname );
+
+    memset(self, 0, sizeof *self);
+    free( self );
+    kns_mgr_singleton = NULL;
+    
+    return 0;
+}
+
+
+LIB_EXPORT rc_t CC KNSManagerRelease( const struct KNSManager *self )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop( &self->refcount, knsmanager_classname ) )
+        {
+        case krefOkay:
+        case krefZero:
+/*        fprintf(stderr, "%p KNSManagerRelease(!KNSManagerDestroy)\n", self);*/
+            break;
+        case krefWhack:
+            rc = KNSManagerDestroy( ( struct KNSManager * )self );
+            break;
+        case krefNegative:
+            return RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid );
+        default:
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcUnknown );
+            break;            
+        }
+    }
+    return rc;
+}
diff --git a/libs/kns/linux/sysendpoint.c b/libs/kns/linux/sysendpoint.c
new file mode 100644
index 0000000..88f3e77
--- /dev/null
+++ b/libs/kns/linux/sysendpoint.c
@@ -0,0 +1,158 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kns/impl.h>
+#include <kns/endpoint.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+
+#include "stream-priv.h"
+
+#include <string.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+#include <assert.h>
+
+#include <errno.h>  /* ERANGE definition */
+
+#include <sysalloc.h>
+
+extern int h_errno;
+
+/* InitDNSEndpoint
+ *  initialize the endpoint with a DNS name and a port number
+ *
+ *  "ep" [ OUT ] - address of endpoint block to be intialized
+ *
+ *  "dns" [ IN ] - textual DNS address.
+ *
+ *  "port" [ IN, DEFAULT 0 ] - binary port number in native integer byte order.
+ *   if the special port number 0 is given, it represents any available port.
+ */
+LIB_EXPORT
+rc_t CC KNSManagerInitDNSEndpoint ( struct KNSManager const *self,
+    KEndPoint *ep, struct String const *dns, uint16_t port )
+{
+    rc_t rc = 0;
+
+    if ( ep == NULL )
+        rc = RC (rcNS, rcNoTarg, rcInitializing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcInitializing, rcSelf, rcNull );
+        else if ( dns == NULL )
+            rc = RC ( rcNS, rcNoTarg, rcInitializing, rcParam, rcNull );
+        else if ( dns -> size == 0 )
+            rc = RC ( rcNS, rcNoTarg, rcInitializing, rcSelf, rcInsufficient );
+        else
+        {
+            KDataBuffer b;
+            char buffer [ 4096 ], * hostname = buffer;
+            size_t buff_size = sizeof buffer;
+
+            if ( dns -> size >= sizeof buffer )
+            {
+                rc = KDataBufferMakeBytes ( & b, dns -> size + 1 );
+                if ( rc == 0 )
+                {
+                    hostname = b . base;
+                    buff_size = ( size_t ) b . elem_count;
+                }
+            }
+
+            if ( rc == 0 )
+            {
+                size_t size;
+                rc = string_printf ( hostname, buff_size, & size, "%S", dns );
+
+                assert ( rc == 0 );
+                assert ( size < buff_size );
+                assert ( hostname [ size ] == 0 );
+
+                if ( rc ==  0 )
+                {
+                    char BB [ 1024 ];
+                    struct hostent ret;
+                    struct hostent * remote = NULL;
+                    int h_errnop = 0;
+                    int ghbnr = 0;
+
+                    ghbnr = gethostbyname_r (
+                                        hostname,
+                                        & ret,
+                                        BB,
+                                        sizeof ( BB ),
+                                        & remote,
+                                        & h_errnop
+                                        );
+                    if ( ghbnr == 0 && remote != NULL )
+                    { 
+                        ep -> type = epIPV4;
+                        memmove ( & ep -> u . ipv4 . addr, remote -> h_addr_list [ 0 ], sizeof ep -> u . ipv4 . addr );
+                        ep -> u . ipv4 . addr = htonl ( ep -> u . ipv4 . addr );
+                        ep -> u . ipv4 . port = ( uint16_t ) port;
+                    }
+                    else switch ( h_errnop )
+                    {
+                    case HOST_NOT_FOUND: /* The specified host is unknown */
+                        rc = RC ( rcNS, rcNoTarg, rcValidating, rcConnection, rcNotFound );
+                        break;
+                    case NO_ADDRESS: /* The requested names valid but does not have an IP address */
+                        rc = RC ( rcNS, rcNoTarg, rcValidating, rcConnection, rcInconsistent );
+                        break;
+#if ! defined NO_ADDRESS || ! defined NO_DATA || NO_ADDRESS != NO_DATA
+                    case NO_DATA: /* The requested name s valid but does not have an IP address */
+                        rc = RC ( rcNS, rcNoTarg, rcValidating, rcConnection, rcEmpty );
+                        break;
+#endif
+                    case NO_RECOVERY: /* A nonrecoverable name server error occured */
+                        rc = RC ( rcNS, rcNoTarg, rcValidating, rcConnection, rcDestroyed );
+                        break;
+                    case TRY_AGAIN: /* A temporary error occured on an authoritative name server. Try again later */
+                        rc = RC ( rcNS, rcNoTarg, rcValidating, rcConnection, rcBusy );
+                        break;
+                    case ERANGE:
+                        rc = RC ( rcNS, rcNoTarg, rcValidating, rcConnection, rcExhausted );
+                        break;
+                    default :
+                        rc = RC ( rcNS, rcNoTarg, rcValidating, rcConnection, rcUnknown );
+                    }
+                }
+            }
+
+            if ( hostname != buffer )
+                KDataBufferWhack ( & b );
+        }
+
+        if ( rc != 0 )
+            memset ( ep, 0, sizeof * ep );        
+    }
+
+    return rc;
+}
diff --git a/libs/kns/linux/syspoll.c b/libs/kns/linux/syspoll.c
new file mode 100644
index 0000000..6e3014f
--- /dev/null
+++ b/libs/kns/linux/syspoll.c
@@ -0,0 +1,107 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include <kns/extern.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <kproc/timeout.h>
+#include <os-native.h>
+
+#include "poll-priv.h"
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+#include <os-native.h>
+
+#include <poll.h>
+#include <unistd.h>
+#include <errno.h>
+
+
+/* socket_wait
+ *  wait for an event or a timeout
+ */
+int socket_wait ( int fd, int events, timeout_t *tm )
+{
+    int i, status;
+    struct pollfd fds [ 1 ];
+        
+    /* poll for data with no delay */
+    for ( i = 0; i < 2; ++ i )
+    {
+        fds [ 0 ] . fd = fd;
+        fds [ 0 ] . events = events;
+        fds [ 0 ] . revents = 0;
+        
+        status = poll ( fds, sizeof fds / sizeof fds [ 0 ], 0 );
+        if ( status > 0 )
+            return fds [ 0 ] . revents;
+        if ( status < 0 )
+            return -1;
+    }
+
+    /* test for infinite timeout */
+    while ( tm == NULL )
+    {
+        status = poll ( fds, sizeof fds / sizeof fds [ 0 ], 1000 );
+        if ( status > 0 )
+            return fds [ 0 ] . revents;
+        if ( status < 0 )
+            return -1;
+
+        /* TBD - check for quitting event
+           this may want to be a callback on the manager
+           or on the socket */
+    }
+
+    /* no blocking */
+    if ( tm -> mS == 0 )
+        return 0;
+
+#if PPOLL_USED_A_PROPER_TIMEOUT_INSTEAD_OF_BEING_CLOWNS
+
+    /* convert to absolute time */
+    if ( ! tm -> prepared )
+        TimeoutPrepare ( tm );
+
+    /* wait until final guy */
+    status = ppoll ( fds, sizeof fds / sizeof fds [ 0 ], & tm -> ts, NULL );
+
+#elif WHY_BOTHER_WITH_PPOLL_WHEN_POLL_TAKES_A_RELATIVE_TIMEOUT_ALREADY || 1
+
+    /* wait until final guy */
+    status = poll ( fds, sizeof fds / sizeof fds [ 0 ], tm -> mS );
+
+#endif
+
+    if ( status > 0 )
+        return fds [ 0 ] . revents;
+
+    return status;
+}
diff --git a/libs/kns/manager.c b/libs/kns/manager.c
new file mode 100644
index 0000000..8fe8e37
--- /dev/null
+++ b/libs/kns/manager.c
@@ -0,0 +1,1033 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kns/extern.h>
+
+#include "http-priv.h"
+#include "mgr-priv.h"
+#include "stream-priv.h"
+#include "sysmgr.h"
+#include "../klib/release-vers.h"
+
+#include <kfg/config.h>
+
+#include <klib/printf.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+
+#include <kproc/timeout.h>
+
+#include <kns/manager.h>
+#include <kns/socket.h>
+#include <kns/http.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <atomic.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <stdio.h> /* fprintf */
+
+#ifndef MAX_CONN_LIMIT
+#define MAX_CONN_LIMIT ( 60 * 1000 )
+#endif
+
+#ifndef MAX_CONN_READ_LIMIT
+#define MAX_CONN_READ_LIMIT ( 10 * 60 * 1000 )
+#endif
+
+#ifndef MAX_CONN_WRITE_LIMIT
+#define MAX_CONN_WRITE_LIMIT ( 10 * 60 * 1000 )
+#endif
+
+static char kns_manager_user_agent [ 128 ] = "ncbi-vdb";
+
+#define USE_SINGLETON 1
+
+#if USE_SINGLETON
+static atomic_ptr_t kns_singleton;
+#endif
+
+#define RELEASE( type, obj ) do { rc_t rc2 = type##Release ( obj ); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while ( false )
+
+struct HttpProxy {
+    const struct String * http_proxy;
+    uint16_t http_proxy_port;
+    struct HttpProxy * next;
+};
+
+const HttpProxy * HttpProxyGetNextHttpProxy ( const HttpProxy * self ) {
+    if ( self == NULL ) {
+        return NULL;
+    }
+    while ( self -> next != NULL ) {
+        self = self -> next;
+        if ( self -> http_proxy != NULL ) {
+            return self;
+        }
+    }
+    return NULL;
+}
+
+/* N.B.: DO NOT WHACK THE RETURNED http_proxy String !!! */
+void HttpProxyGet ( const HttpProxy * self,
+    const String ** http_proxy, uint16_t * http_proxy_port )
+{
+    assert ( http_proxy && http_proxy_port );
+    if ( self != NULL ) {
+        * http_proxy = self -> http_proxy;
+        * http_proxy_port = self -> http_proxy_port;
+    }
+    else {
+        * http_proxy = NULL;
+        * http_proxy_port = 0;
+    }
+}
+
+static HttpProxy * HttpProxyClear ( HttpProxy * self ) {
+    assert ( self );
+
+    StringWhack ( self -> http_proxy );
+
+    self -> http_proxy = NULL;
+    self -> http_proxy_port = 0;
+
+    return self -> next;
+}
+
+static rc_t HttpProxyWhack ( HttpProxy * self, HttpProxy ** next ) {
+    assert ( next );
+    * next = HttpProxyClear ( self );
+
+    memset ( self, 0, sizeof *self );
+
+    free (self );
+
+    return 0;
+}
+
+static
+rc_t HttpProxyGetHttpProxyPath
+    ( const HttpProxy * self, const String ** proxy )
+{
+    rc_t rc = 0;
+
+    if ( proxy == NULL )
+        rc = RC ( rcNS, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcMgr, rcAccessing, rcSelf, rcNull );
+        else if ( self -> http_proxy != NULL )
+        {
+            return StringCopy ( proxy, self -> http_proxy );
+        }
+
+        * proxy = NULL;
+    }
+
+    return rc;
+}
+
+static
+rc_t HttpProxyAddHttpProxyPath ( HttpProxy * self,
+    const String * proxy, uint16_t proxy_port, KNSManager * mgr )
+{
+    assert ( self );
+
+    if ( proxy == NULL ) {
+        return 0;
+    }
+
+    while ( self -> http_proxy != NULL ) {
+        if ( self -> next == NULL ) {
+            self -> next = calloc ( 1, sizeof * self -> next );
+            if ( self -> next == NULL ) {
+                return RC ( rcNS, rcMgr, rcAllocating, rcMemory, rcExhausted );
+            }
+        }
+        self = self -> next;
+    }
+
+    self -> http_proxy = proxy;
+    self -> http_proxy_port = proxy_port;
+
+    if ( ! mgr -> http_proxy_enabled ) {
+        mgr -> http_proxy_enabled = ( proxy != NULL );
+    }
+
+    return 0;
+}
+
+
+static rc_t KNSManagerHttpProxyClear ( KNSManager * self ) {
+    HttpProxy * p = self -> http_proxy;
+    while ( p ) {
+        p = HttpProxyClear ( p );
+    }
+    return 0;
+}
+
+static rc_t KNSManagerHttpProxyWhack ( const KNSManager * self ) {
+    HttpProxy * p = self -> http_proxy;
+    while ( p ) {
+        HttpProxy * next = NULL;
+        HttpProxyWhack ( p, & next );
+        p = next;
+    }
+    return 0;
+}
+
+static
+rc_t KNSManagerAddHTTPProxyPathImpl ( KNSManager * self,
+    const String * proxy, uint16_t proxy_port )
+{
+    if ( self -> http_proxy == NULL ) {
+        self -> http_proxy = calloc ( 1, sizeof * self -> http_proxy );
+        if ( self -> http_proxy == NULL ) {
+            return RC ( rcNS, rcMgr, rcAllocating, rcMemory, rcExhausted );
+        }
+    }
+
+    return
+     HttpProxyAddHttpProxyPath ( self -> http_proxy, proxy, proxy_port, self );
+}
+
+
+void HttpProxyGetHTTPProxy ( const HttpProxy * self,
+    const struct String ** http_proxy, uint16_t * http_proxy_port )
+{
+    assert ( self && http_proxy && http_proxy_port);
+
+    * http_proxy = self -> http_proxy;
+    * http_proxy_port = self -> http_proxy_port;
+}
+
+const HttpProxy * KNSManagerGetHttpProxy ( const KNSManager * self ) {
+    if ( self == NULL) {
+        return NULL;
+    }
+    if ( self -> http_proxy != NULL ) {
+        return self -> http_proxy;
+    }
+    return HttpProxyGetNextHttpProxy ( self -> http_proxy );
+}
+
+
+static
+rc_t KNSManagerWhack ( KNSManager * self )
+{
+    rc_t rc;
+
+#if USE_SINGLETON
+    KNSManager * our_mgr = atomic_test_and_set_ptr ( & kns_singleton, NULL, NULL );
+    if ( self == our_mgr )
+        return 0;
+#endif
+
+    KNSManagerHttpProxyWhack ( self );
+
+    if ( self -> aws_access_key_id != NULL )
+        StringWhack ( self -> aws_access_key_id );
+
+    if ( self -> aws_secret_access_key != NULL )
+        StringWhack ( self -> aws_secret_access_key );
+
+    if ( self -> aws_region != NULL )
+        StringWhack ( self -> aws_region );
+
+    if ( self -> aws_output != NULL )
+        StringWhack ( self -> aws_output );
+    
+    rc = HttpRetrySpecsDestroy ( & self -> retry_specs );
+
+    KTLSGlobalsWhack ( & self -> tlsg );
+
+    free ( self );
+
+    KNSManagerCleanup ();
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KNSManagerAddRef ( const KNSManager *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd( &self->refcount, "KNSManager" ) )
+        {
+        case krefLimit:
+            return RC ( rcNS, rcMgr, rcAttaching, rcRefcount, rcExcessive );
+        case krefNegative:
+            return RC ( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid );
+        }
+    }
+    return 0;
+}
+
+
+LIB_EXPORT rc_t CC KNSManagerRelease ( const KNSManager *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KNSManager" ) )
+        {
+        case krefWhack:
+            return KNSManagerWhack ( ( KNSManager * ) self );
+        case krefNegative:
+            return RC ( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid );
+        }
+    }
+    return 0;
+}
+
+static
+void KNSManagerLoadAWS ( struct KNSManager *self, const KConfig * kfg )
+{
+    rc_t rc;
+
+    const KConfigNode *aws_node;
+
+    if ( self == NULL )
+        return;
+
+    rc = KConfigOpenNodeRead ( kfg, &aws_node, "AWS" );
+    if ( rc == 0 )
+    {
+        do
+        {
+            String *access_key_id = NULL, *secret_access_key = NULL, *region = NULL, *output = NULL;
+            const KConfigNode *access_key_id_node, *secret_access_key_node, *region_node, *output_node;
+
+            rc = KConfigNodeOpenNodeRead ( aws_node, &access_key_id_node, "aws_access_key_id" );
+            if ( rc == 0 )
+            {
+                rc = KConfigNodeReadString ( access_key_id_node, &access_key_id );
+
+                KConfigNodeRelease ( access_key_id_node );
+
+                if( rc != 0 )
+                    break;
+            }
+
+
+            rc = KConfigNodeOpenNodeRead ( aws_node, &secret_access_key_node, "aws_secret_access_key" );
+            if ( rc == 0 )
+            {
+                rc = KConfigNodeReadString ( secret_access_key_node, &secret_access_key );
+
+                KConfigNodeRelease ( secret_access_key_node );
+
+                if ( rc != 0 )
+                    break;
+            }
+        
+            rc = KConfigNodeOpenNodeRead ( aws_node, &region_node, "region" );
+            if ( rc == 0 )
+            {
+                rc = KConfigNodeReadString ( region_node, &region );
+
+                KConfigNodeRelease ( region_node );
+
+                if ( rc != 0 )
+                    break;
+            }
+
+            rc = KConfigNodeOpenNodeRead ( aws_node, &output_node, "output" );
+            if ( rc == 0 )
+            {
+                rc = KConfigNodeReadString ( output_node, &output );
+
+                KConfigNodeRelease ( output_node );
+                
+                if ( rc != 0 )
+                    break;
+            }
+
+            self -> aws_access_key_id = access_key_id;
+            self -> aws_secret_access_key = secret_access_key;
+            self -> aws_region = region;
+            self -> aws_output = output;
+
+        } while ( 0 );
+
+        KConfigNodeRelease ( aws_node );
+    }
+}
+
+LIB_EXPORT rc_t CC KNSManagerMake ( KNSManager ** mgrp )
+{
+    rc_t rc;
+
+    if ( mgrp == NULL )
+        rc = RC ( rcNS, rcMgr, rcAllocating, rcParam, rcNull );
+    else
+    {
+        KConfig * kfg;
+        KNSManager * our_mgr;
+
+        * mgrp = NULL;
+
+#if USE_SINGLETON
+        /* grab single-shot singleton */
+        our_mgr = atomic_test_and_set_ptr ( & kns_singleton, NULL, NULL );
+        if ( our_mgr != NULL )
+        {
+            /* add a new reference and return */
+            rc = KNSManagerAddRef ( our_mgr );
+            if ( rc == 0 )
+                * mgrp = our_mgr;
+            return rc;
+        }
+#endif
+
+        /* singleton was NULL. make from scratch. */
+        rc = KConfigMake ( & kfg, NULL );
+        if ( rc == 0 )
+        {
+            rc = KNSManagerMakeConfig ( & our_mgr, kfg );
+            KConfigRelease ( kfg );
+
+            if ( rc == 0 )
+            {
+#if USE_SINGLETON
+                /* try to set single-shot ( set once, never reset ) */
+                KNSManager * new_mgr = atomic_test_and_set_ptr ( & kns_singleton, our_mgr, NULL );
+                if ( new_mgr != NULL )
+                {
+                    /* somebody else got here first - drop our version */
+                    assert ( our_mgr != new_mgr );
+                    KNSManagerRelease ( our_mgr );
+
+                    /* use the new manager, just add a reference and return */
+                    rc = KNSManagerAddRef ( new_mgr );
+                    if ( rc == 0 )
+                        * mgrp = new_mgr;
+                    return rc;
+                }
+#endif
+
+                /* return parameter */
+                * mgrp = our_mgr;
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT void KNSManagerSetVerbose ( KNSManager *self, bool verbosity )
+{
+    if ( self != NULL )
+        self -> verbose = verbosity;
+}
+
+
+LIB_EXPORT bool KNSManagerIsVerbose ( const KNSManager *self )
+{
+    return ( self != NULL ) ? self -> verbose : false;
+}
+
+
+/* MakeConnection
+ *  create a connection-oriented stream
+ *
+ *  "conn" [ OUT ] - a stream for communication with the server
+ *
+ *  "from" [ IN ] - client endpoint
+ *
+ *  "to" [ IN ] - server endpoint 
+ *
+ *  both endpoints have to be of type epIP; creates a TCP connection
+ */
+LIB_EXPORT rc_t CC KNSManagerMakeConnection ( const KNSManager * self,
+    struct KSocket **conn, struct KEndPoint const *from, struct KEndPoint const *to )
+{
+    timeout_t tm;
+
+    if ( self == NULL )
+    {
+        if ( conn == NULL )
+            return RC ( rcNS, rcStream, rcConstructing, rcParam, rcNull );
+
+        * conn = NULL;
+
+        return RC ( rcNS, rcStream, rcConstructing, rcSelf, rcNull );
+    }
+
+    TimeoutInit ( & tm, self -> conn_timeout );
+
+    return KNSManagerMakeRetryTimedConnection ( self, conn, 
+        & tm, self -> conn_read_timeout, self -> conn_write_timeout, from, to );
+}
+/* MakeTimedConnection
+ *  create a connection-oriented stream
+ *
+ *  "conn" [ OUT ] - a stream for communication with the server
+ *
+ *  "retryTimeout" [ IN ] - if connection is refused, retry with 1ms intervals: when negative, retry infinitely,
+ *   when 0, do not retry, positive gives maximum wait time in seconds 
+ *
+ *  "readMillis" [ IN ] and "writeMillis" - when negative, infinite timeout
+ *   when 0, return immediately, positive gives maximum wait time in mS
+ *   for reads and writes respectively.
+ *
+ *  "from" [ IN ] - client endpoint
+ *
+ *  "to" [ IN ] - server endpoint 
+ *
+ *  both endpoints have to be of type epIP; creates a TCP connection
+ */
+LIB_EXPORT rc_t CC KNSManagerMakeTimedConnection ( struct KNSManager const * self,
+    struct KSocket **conn, int32_t readMillis, int32_t writeMillis,
+    struct KEndPoint const *from, struct KEndPoint const *to )
+{
+    timeout_t tm;
+
+    if ( self == NULL )
+    {
+        if ( conn == NULL )
+            return RC ( rcNS, rcStream, rcConstructing, rcParam, rcNull );
+
+        * conn = NULL;
+
+        return RC ( rcNS, rcStream, rcConstructing, rcSelf, rcNull );
+    }
+
+    TimeoutInit ( & tm, self -> conn_timeout );
+
+    return KNSManagerMakeRetryTimedConnection ( self, conn, 
+        & tm, readMillis, writeMillis, from, to );
+}    
+    
+/* MakeRetryConnection
+ *  create a connection-oriented stream
+ *
+ *  "conn" [ OUT ] - a stream for communication with the server
+ *
+ *  "retryTimeout" [ IN ] - if connection is refused, retry with 1ms intervals: when negative, retry infinitely,
+ *   when 0, do not retry, positive gives maximum wait time in seconds 
+ *
+ *  "from" [ IN ] - client endpoint
+ *
+ *  "to" [ IN ] - server endpoint 
+ *
+ *  both endpoints have to be of type epIP; creates a TCP connection
+ */    
+LIB_EXPORT rc_t CC KNSManagerMakeRetryConnection ( struct KNSManager const * self,
+    struct KSocket ** conn, timeout_t * retryTimeout,
+    struct KEndPoint const * from, struct KEndPoint const * to )
+{
+    if ( self == NULL )
+    {
+        if ( conn == NULL )
+            return RC ( rcNS, rcStream, rcConstructing, rcParam, rcNull );
+
+        * conn = NULL;
+
+        return RC ( rcNS, rcStream, rcConstructing, rcSelf, rcNull );
+    }
+
+    return KNSManagerMakeRetryTimedConnection ( self, conn, 
+        retryTimeout, self -> conn_read_timeout, self -> conn_write_timeout, from, to );
+}    
+
+/* SetConnectionTimeouts
+ *  sets default connect/read/write timeouts to supply to sockets
+ *
+ *  "connectMillis", "readMillis", "writeMillis" [ IN ] - when negative, infinite timeout
+ *  when 0, return immediately, positive gives maximum wait time in sec/mS
+ *  for connects, reads and writes respectively.
+ */
+LIB_EXPORT rc_t CC KNSManagerSetConnectionTimeouts ( KNSManager *self,
+    int32_t connectMillis, int32_t readMillis, int32_t writeMillis )
+{
+    if ( self == NULL )
+        return RC ( rcNS, rcMgr, rcUpdating, rcSelf, rcNull );
+
+    /* limit values */
+    if ( connectMillis < 0 || connectMillis > MAX_CONN_LIMIT )
+        connectMillis = MAX_CONN_LIMIT;
+        
+    if ( readMillis < 0 || readMillis > MAX_CONN_READ_LIMIT )
+        readMillis = MAX_CONN_READ_LIMIT;
+
+    if ( writeMillis < 0 || writeMillis > MAX_CONN_WRITE_LIMIT )
+        writeMillis = MAX_CONN_WRITE_LIMIT;
+
+    self -> conn_timeout = connectMillis;
+    self -> conn_read_timeout = readMillis;
+    self -> conn_write_timeout = writeMillis;
+
+    return 0;
+}
+
+
+/* SetHTTPTimeouts
+ *  sets default read/write timeouts to supply to HTTP connections
+ *
+ *  "readMillis" [ IN ] and "writeMillis" - when negative, infinite timeout
+ *  when 0, return immediately, positive gives maximum wait time in mS
+ *  for reads and writes respectively.
+ */
+LIB_EXPORT rc_t CC KNSManagerSetHTTPTimeouts ( KNSManager *self,
+    int32_t readMillis, int32_t writeMillis )
+{
+    if ( self == NULL )
+        return RC ( rcNS, rcMgr, rcUpdating, rcSelf, rcNull );
+
+    /* limit values */
+    if ( readMillis < 0 || readMillis > MAX_HTTP_READ_LIMIT )
+        readMillis = MAX_HTTP_READ_LIMIT;
+
+    if ( writeMillis < 0 || writeMillis > MAX_HTTP_WRITE_LIMIT )
+        writeMillis = MAX_HTTP_WRITE_LIMIT;
+
+    self -> http_read_timeout = readMillis;
+    self -> http_write_timeout = writeMillis;
+
+    return 0;
+}
+
+
+/* GetHTTPProxyPath
+ *  returns path to HTTP proxy server ( if set ) or NULL.
+ *  return status is 0 if the path is valid, non-zero otherwise
+ */
+LIB_EXPORT rc_t CC KNSManagerGetHTTPProxyPath ( const KNSManager * self, const String ** proxy )
+{
+    fprintf ( stderr,
+"WARNING : KNSManagerGetHTTPProxyPath IS DEPRECATED AND SHOULD NOT BE USED\n" );
+    return HttpProxyGetHttpProxyPath ( self -> http_proxy, proxy );
+}
+
+
+/* SetHTTPProxyPath
+ *  sets a path to HTTP proxy server.
+ *  a NULL path value removes all proxy settings.
+ *
+ *  the VPath passed in must still be released using VPathRelease,
+ *  because KNSManager will attach a new reference to it.
+ */
+LIB_EXPORT rc_t CC KNSManagerSetHTTPProxyPath ( KNSManager * self, const char * fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+    rc = KNSManagerVSetHTTPProxyPath ( self, fmt, args );
+    va_end ( args );
+
+    return rc;
+}
+
+static rc_t CC KNSManagerVSetHTTPProxyPathImpl
+    ( KNSManager * self, const char * fmt, va_list args, bool clear )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC ( rcNS, rcMgr, rcUpdating, rcSelf, rcNull );
+    else
+    {
+        if ( clear ) {
+            rc = KNSManagerHttpProxyClear ( self );
+        }
+
+        if ( rc == 0 && fmt != NULL && fmt [ 0 ] != 0 )
+        {
+            size_t psize;
+            char path [ 4096 * 2 ];
+            const char * p = path;
+            rc = string_vprintf ( path, sizeof path, & psize, fmt, args );
+            if ( rc == 0 ) {
+              while ( psize != 0 ) {
+                size_t s = psize;
+                uint16_t proxy_port = 0;
+                const String * proxy = NULL;
+                const char * colon = NULL;
+                const char * comma = string_chr ( p, psize, ',' );
+                if ( comma != NULL ) {
+#ifdef MULTIPLE_PROXIES
+                    s = comma - p;
+#else
+                    rc = RC ( rcNS, rcMgr, rcUpdating, rcPath, rcInvalid );
+                    break;
+#endif
+                }
+                colon = string_rchr ( p, s, ':' );
+                if ( colon != NULL )
+                {
+                    char * end;
+                    const char * port_spec = colon + 1;
+                    /* it is true that some day we might read symbolic port names... */
+                    long port_num = strtol ( port_spec, & end, 10 );
+                    if ( port_num <= 0 || port_num >= 0x10000 ||
+                         ( end [ 0 ] != 0 && comma == NULL ) )
+                        rc = RC ( rcNS, rcMgr, rcUpdating, rcPath, rcInvalid );
+                    else
+                    {
+                        proxy_port = ( uint64_t ) port_num;
+                        s = colon - p;
+                    }
+                }
+
+                if ( rc == 0 )
+                {
+                    String tmp;
+                    StringInit ( & tmp, p, s, string_len ( p, s ) );
+                    rc = StringCopy ( & proxy, & tmp );
+                }
+
+                if ( rc == 0 ) {
+                    rc =
+                     KNSManagerAddHTTPProxyPathImpl ( self, proxy, proxy_port );
+                }
+                if ( comma == NULL) {
+                    psize = 0;
+                }
+                else {
+                    s = comma - p + 1;
+                    if ( s > psize ) {
+                        psize = 0;
+                    }
+                    else {
+                        psize -= s;
+                        p += s;
+                    }
+                }
+              }
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KNSManagerVSetHTTPProxyPath ( KNSManager * self, const char * fmt, va_list args )
+{   return KNSManagerVSetHTTPProxyPathImpl (self, fmt, args, true); }
+
+static
+rc_t CC KNSManagerAddHTTPProxyPath ( KNSManager * self, const char * fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+    rc = KNSManagerVSetHTTPProxyPathImpl ( self, fmt, args, false );
+    va_end ( args );
+
+    return rc;
+}
+
+static
+bool KNSManagerHttpProxyInitFromEnvVar ( KNSManager * self, const char * name )
+{
+    const char * path = getenv ( name );
+    if ( path != NULL ) {
+        if ( KNSManagerAddHTTPProxyPath ( self, path ) != 0 ) {
+            return false;
+        }
+
+        assert ( self -> http_proxy_enabled );
+        return true;
+    }
+
+    return false;
+}
+
+static bool KNSManagerHttpProxyInitFromEnv ( KNSManager * self ) {
+    bool loaded = false;
+
+    const char * env_list [] = {
+        "https_proxy",
+        "HTTPS_PROXY",
+        "all_proxy",
+        "ALL_PROXY",
+        "http_proxy",
+        "HTTP_PROXY",
+    };
+
+    int i = 0;
+    for ( i = 0; i < sizeof env_list / sizeof env_list [ 0 ]; ++ i ) {
+        loaded |= KNSManagerHttpProxyInitFromEnvVar ( self, env_list [i] );
+    }
+
+    return loaded;
+}
+
+static
+bool KNSManagerHttpProxyInitFromKfg ( KNSManager * self, const KConfig * kfg )
+{
+    bool fromKfg = false;
+
+    const KConfigNode * proxy;
+    rc_t rc = KConfigOpenNodeRead ( kfg, & proxy, "/http/proxy" );
+    if ( rc == 0 )
+    {
+        const KConfigNode * proxy_path;
+        rc = KConfigNodeOpenNodeRead ( proxy, & proxy_path, "path" );
+        if ( rc == 0 )
+        {
+            String * path;
+            rc = KConfigNodeReadString ( proxy_path, & path );
+            if ( rc == 0 )
+            {
+                rc = KNSManagerAddHTTPProxyPath ( self, "%S", path );
+                if ( rc == 0 ) {
+                    fromKfg = true;
+                }
+
+                StringWhack ( path );
+            }
+
+            KConfigNodeRelease ( proxy_path );
+        }
+
+        KConfigNodeRelease ( proxy );
+    }
+
+    return fromKfg;
+}
+
+static bool StringCmp ( const String * self, const char * val )
+{
+    String v;
+    StringInitCString ( & v, val );
+    return StringEqual ( self, & v );
+}
+
+static rc_t StringRelease ( String * self )
+{
+    StringWhack ( self );
+    return 0;
+}
+
+static
+void KNSManagerHttpProxyInit ( KNSManager * self, const KConfig * kfg )
+{
+    int i = 0;
+
+    int n = 2;
+
+    typedef enum {
+        eEnv,
+        eKfg,
+    } EType;
+
+    EType type [ 2 ] = { eKfg, eEnv };
+
+    rc_t rc = KConfigReadBool
+        ( kfg, "/http/proxy/enabled", & self -> http_proxy_enabled );
+    if ( rc != 0 ) {
+        if ( GetRCState ( rc ) == rcNotFound ) {
+            rc = 0;
+        } else {
+            KNSManagerSetHTTPProxyPath ( self, NULL );
+            assert ( self -> http_proxy_enabled == false );
+        }
+    } else {
+        if ( ! self -> http_proxy_enabled ) {
+            return;
+        }
+    }
+
+    {
+        bool proxy_only = false;
+        rc_t rc = KConfigReadBool ( kfg, "/http/proxy/only",  & proxy_only );
+        if ( rc == 0 && proxy_only ) {
+            self -> http_proxy_only = true;
+        }
+    }
+
+    {
+        String * result = NULL;
+        rc = KConfigReadString ( kfg, "/http/proxy/use", & result );
+        if ( rc == 0 ) {
+            if ( StringCmp ( result, "env") ) {
+                n = 1;
+                type [ 0 ] = eEnv;
+            } else if ( StringCmp ( result, "kfg") ) {
+                n = 1;
+                type [ 0 ] = eKfg;
+            } else if ( StringCmp ( result, "none") ) {
+                n = 0;
+            } else if ( StringCmp ( result, "env,kfg") ) {
+                n = 2;
+                type [ 0 ] = eEnv;
+                type [ 1 ] = eKfg;
+            } else if ( StringCmp ( result, "kfg,env") ) {
+                n = 2;
+                type [ 0 ] = eKfg;
+                type [ 1 ] = eEnv;
+            }
+        }
+        RELEASE ( String, result );
+    }
+
+    for ( i = 0; i < n; ++i ) {
+        switch ( type [ i] ) {
+            case eEnv:
+                KNSManagerHttpProxyInitFromEnv ( self );
+                break;
+            case eKfg:
+                KNSManagerHttpProxyInitFromKfg ( self, kfg );
+                break;
+            default:
+                assert ( 0 );
+                break;
+        }
+    }
+}
+
+/* GetHTTPProxyEnabled
+ *  returns true if a non-NULL proxy path exists and user wants to use it
+ *  users indicate desire to use proxy through configuration or SetHTTPProxyEnabled
+ */
+LIB_EXPORT bool CC KNSManagerGetHTTPProxyEnabled ( const KNSManager * self )
+{
+    if ( self != NULL )
+        return self -> http_proxy_enabled;
+
+    return false;
+}
+
+
+/* SetHTTPProxyEnabled
+ *  sets http-proxy enabled state to supplied value
+ *  returns the prior value as a convenience
+ */
+LIB_EXPORT bool CC KNSManagerSetHTTPProxyEnabled ( KNSManager * self, bool enabled )
+{
+    bool prior = false;
+    if ( self != NULL )
+    {
+        prior = self -> http_proxy_enabled;
+        self -> http_proxy_enabled = enabled;
+    }
+    return prior;
+}
+
+
+LIB_EXPORT rc_t CC KNSManagerMakeConfig ( KNSManager **mgrp, KConfig* kfg )
+{
+    rc_t rc;
+
+    if ( mgrp == NULL )
+        rc = RC ( rcNS, rcMgr, rcAllocating, rcParam, rcNull );
+    else
+    {
+        KNSManager * mgr = calloc ( 1, sizeof * mgr );
+        if ( mgr == NULL )
+            rc = RC ( rcNS, rcMgr, rcAllocating, rcMemory, rcExhausted );
+        else
+        {
+            KRefcountInit ( & mgr -> refcount, 1, "KNSManager", "init", "kns" );
+            mgr -> conn_timeout = MAX_CONN_LIMIT;
+            mgr -> conn_read_timeout = MAX_CONN_READ_LIMIT;
+            mgr -> conn_write_timeout = MAX_CONN_WRITE_LIMIT;
+            mgr -> http_read_timeout = MAX_HTTP_READ_LIMIT;
+            mgr -> http_write_timeout = MAX_HTTP_WRITE_LIMIT;
+            mgr -> maxTotalWaitForReliableURLs_ms = 10 * 60 * 1000; /* 10 min */
+            mgr -> maxNumberOfRetriesOnFailureForReliableURLs = 10;
+            mgr -> verbose = false;
+
+            rc = KNSManagerInit (); /* platform specific init in sysmgr.c ( in unix|win etc. subdir ) */
+            if ( rc == 0 )
+            {
+                /* the manager is not a proper singleton */
+                if ( kns_manager_user_agent [ 0 ] == 0 )
+                {
+                    ver_t version = RELEASE_VERS;
+                    KNSManagerSetUserAgent ( mgr, PKGNAMESTR " ncbi-vdb.%V", version );
+                }
+
+                rc = HttpRetrySpecsInit ( & mgr -> retry_specs, kfg );
+                if ( rc == 0 )
+                {
+                    rc = KTLSGlobalsInit ( & mgr -> tlsg, kfg );
+                    if ( rc == 0 )
+                    {
+                        KNSManagerLoadAWS ( mgr, kfg );
+                        KNSManagerHttpProxyInit ( mgr, kfg );
+                        * mgrp = mgr;
+                        return 0;
+                    }
+                }
+            }
+
+            free ( mgr );
+        }
+
+        * mgrp = NULL;
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KNSManagerSetUserAgent ( KNSManager * self, const char * fmt, ... )
+{
+    /* 6/18/14 - don't check "self", since the current implementation
+       is actually static. Later implementations will not be... */
+
+    rc_t rc = 0;
+    if ( fmt == NULL )
+        rc = RC( rcNS, rcMgr, rcUpdating, rcParam, rcNull );
+    else
+    {
+        size_t bytes;
+        char scratch [ sizeof kns_manager_user_agent ];
+
+        va_list args;
+        va_start ( args, fmt );
+        rc = string_vprintf ( scratch, sizeof scratch, & bytes, fmt, args );
+        va_end ( args );
+
+        if ( rc == 0 )
+            string_copy ( kns_manager_user_agent, sizeof kns_manager_user_agent, scratch, bytes );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KNSManagerGetUserAgent ( const char ** user_agent )
+{
+    rc_t rc = 0;
+    if ( user_agent == NULL )
+        rc = RC( rcNS, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        ( *user_agent ) = kns_manager_user_agent;
+    }
+    return rc;
+}
diff --git a/libs/kns/mgr-priv.h b/libs/kns/mgr-priv.h
new file mode 100644
index 0000000..3bf479e
--- /dev/null
+++ b/libs/kns/mgr-priv.h
@@ -0,0 +1,92 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_libs_kns_mgr_priv_
+#define _h_libs_kns_mgr_priv_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef _h_kns_mgr_priv_
+#include <kns/kns-mgr-priv.h>
+#endif
+
+#ifndef _h_libs_kns_tls_priv_
+#include "tls-priv.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct String;
+struct KConfig;
+struct HttpRetrySpecs;
+
+struct KNSManager
+{
+    KRefcount refcount;
+    
+    struct String const *aws_access_key_id;
+    struct String const *aws_secret_access_key;
+    struct String const *aws_region;
+    struct String const *aws_output;
+    
+    struct HttpRetrySpecs retry_specs;
+
+    KTLSGlobals tlsg;
+
+    int32_t conn_timeout;
+    int32_t conn_read_timeout;
+    int32_t conn_write_timeout;
+    int32_t http_read_timeout;
+    int32_t http_write_timeout;
+    
+    uint32_t maxTotalWaitForReliableURLs_ms;
+
+    uint8_t  maxNumberOfRetriesOnFailureForReliableURLs;
+
+    bool http_proxy_enabled; /* TBD - does this need to be static today? */
+    bool http_proxy_only; /* no direct connection - proxy only */
+    HttpProxy * http_proxy;
+
+    bool verbose;
+};
+
+/* test */
+struct KStream;
+void KStreamForceSocketClose ( struct KStream const * self );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_libs_kns_mgr_priv_ */
diff --git a/libs/kns/poll-priv.h b/libs/kns/poll-priv.h
new file mode 100644
index 0000000..b0cbbe2
--- /dev/null
+++ b/libs/kns/poll-priv.h
@@ -0,0 +1,51 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_poll_priv_
+#define _h_poll_priv_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct timeout_t;
+
+
+/* socket_wait
+ *  wait for an event or a timeout
+ */
+int socket_wait ( int fd, int events, struct timeout_t *tm );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_poll_priv_ */
diff --git a/libs/kns/stream-from-files.c b/libs/kns/stream-from-files.c
new file mode 100644
index 0000000..2ac4e0b
--- /dev/null
+++ b/libs/kns/stream-from-files.c
@@ -0,0 +1,168 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+typedef struct KStreamFromFiles KStreamFromFiles;
+#define KSTREAM_IMPL KStreamFromFiles
+
+#include <kns/extern.h>
+#include <kns/stream.h>
+#include <kns/impl.h>
+#include <kfs/file.h>
+#include <kfs/impl.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include "stream-priv.h"
+
+
+/* the object structure for THIS implementation */
+struct  KStreamFromFiles
+{
+    /* THIS MUST COME FIRST */
+    KStream dad;
+
+    uint64_t in_pos;
+    uint64_t out_pos;
+
+    const KFile *in;
+    KFile *out;
+};
+
+
+/* the required methods */
+
+static
+rc_t CC KStreamFromFilesWhack ( KStreamFromFiles *self )
+{
+    KFileRelease ( self -> in );
+    KFileRelease ( self -> out );
+    free ( self );
+    return 0;
+}
+
+static
+rc_t CC KStreamFromFilesRead ( const KStreamFromFiles *cself,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc = KFileRead ( cself -> in, cself -> in_pos, buffer, bsize, num_read );
+    if ( rc == 0 )
+    {
+        KStreamFromFiles *self = ( KStreamFromFiles* ) cself;
+        self -> in_pos += * num_read;
+    }
+
+    return rc;
+}
+
+static
+rc_t CC KStreamFromFilesWrite ( KStreamFromFiles *self,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    rc_t rc = KFileWrite ( self -> out, self -> out_pos, buffer, size, num_writ );
+    if ( rc == 0 )
+        self -> out_pos += * num_writ;
+
+    return rc;
+}
+
+/* the vtable */
+static KStream_vt_v1 vtKStreamFromFiles =
+{
+    1, 0,
+    KStreamFromFilesWhack,
+    KStreamFromFilesRead,
+    KStreamFromFilesWrite
+};
+
+
+/* FromKFilePair
+ *  create a KStream from a pair of KFiles
+ *  maintains a "pos" marker for input and output files
+ *
+ *  "strm" [ OUT ] - resultant KStream
+ *
+ *  "read" [ IN, NULL OKAY ] - file to use for stream reading
+ *
+ *  "write" [ IN, NULL OKAY ] - file to use for stream writing
+ *
+ * NB - EITHER "read" or "write" may be NULL, but not both.
+ */
+LIB_EXPORT rc_t CC KStreamFromKFilePair ( KStream **strm,
+    const KFile *read, KFile *write )
+{
+    rc_t rc;
+
+    if ( strm == NULL )
+        rc = RC ( rcNS, rcStream, rcConstructing, rcParam, rcNull );
+    else
+    {
+        bool can_read = ( read == NULL ) ? false : read -> read_enabled;
+        bool can_write = ( write == NULL ) ? false : write -> write_enabled;
+
+        if ( ! can_read && ! can_write )
+            rc = RC ( rcNS, rcStream, rcConstructing, rcFile, rcNoPerm );
+        else
+        {
+            KStreamFromFiles *sff = calloc ( 1, sizeof *sff );
+            if ( sff == NULL )
+                rc = RC ( rcNS, rcStream, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KStreamInit ( & sff -> dad, ( const KStream_vt* ) & vtKStreamFromFiles, 
+                                   "KStreamFromFilePair", "adapter", can_read, can_write );
+                if ( rc == 0 )
+                {
+                    rc = KFileAddRef ( read );
+                    if ( rc == 0 )
+                    {
+                        rc = KFileAddRef ( write );
+                        if ( rc ==  0 )
+                        {
+                            sff -> in = read;
+                            sff -> out = write;
+                            *strm = & sff -> dad;
+
+                            return 0;
+                        }
+
+                        KFileRelease ( read );
+                    }
+                }
+
+                free ( sff );
+            }
+        }
+
+        *strm = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/kns/stream-from-streams.c b/libs/kns/stream-from-streams.c
new file mode 100644
index 0000000..a788403
--- /dev/null
+++ b/libs/kns/stream-from-streams.c
@@ -0,0 +1,150 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+typedef struct KStreamFromStreams KStreamFromStreams;
+#define KSTREAM_IMPL KStreamFromStreams
+
+#include <kns/extern.h>
+#include <kns/stream.h>
+#include <kns/impl.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include "stream-priv.h"
+
+/* the object structure for THIS implementation */
+struct  KStreamFromStreams
+{
+    /* THIS MUST COME FIRST */
+    KStream dad;
+
+    const KStream *in;
+    KStream *out;
+};
+
+
+/* the required methods */
+
+static
+rc_t CC KStreamFromStreamsWhack ( KStreamFromStreams *self )
+{
+    KStreamRelease ( self -> in );
+    KStreamRelease ( self -> out );
+    free ( self );
+    return 0;
+}
+
+static
+rc_t CC KStreamFromStreamsRead ( const KStreamFromStreams *self,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    return KStreamRead ( self -> in, buffer, bsize, num_read );
+}
+
+static
+rc_t CC KStreamFromStreamsWrite ( KStreamFromStreams *self,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    return KStreamWrite ( self -> out, buffer, size, num_writ );
+}
+
+/* the vtable */
+static KStream_vt_v1 vtKStreamFromStreams =
+{
+    1, 0,
+    KStreamFromStreamsWhack,
+    KStreamFromStreamsRead,
+    KStreamFromStreamsWrite
+};
+
+
+/* FromKStreamPair
+ *  create a KStream from a pair of KStreams
+ *
+ *  "strm" [ OUT ] - resultant KStream
+ *
+ *  "read" [ IN, NULL OKAY ] - stream to use for input
+ *
+ *  "write" [ IN, NULL OKAY ] - stream to use for output
+ *
+ * NB - EITHER "read" or "write" may be NULL, but not both.
+ */
+LIB_EXPORT rc_t CC KStreamFromKStreamPair ( KStream **strm,
+    const KStream *read, KStream *write )
+{
+    rc_t rc;
+
+    if ( strm == NULL )
+        rc = RC ( rcNS, rcStream, rcConstructing, rcParam, rcNull );
+    else
+    {
+        bool can_read = ( read == NULL ) ? false : read -> read_enabled;
+        bool can_write = ( write == NULL ) ? false : write -> write_enabled;
+
+        if ( ! can_read && ! can_write )
+            rc = RC ( rcNS, rcStream, rcConstructing, rcStream, rcNoPerm );
+        else
+        {
+            KStreamFromStreams *sfs = calloc ( 1, sizeof *sfs );
+            if ( sfs == NULL )
+                rc = RC ( rcNS, rcStream, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KStreamInit ( & sfs -> dad, ( const KStream_vt* ) & vtKStreamFromStreams, 
+                                   "KStreamFromStreamPair", "adapter", can_read, can_write );
+                if ( rc == 0 )
+                {
+                    rc = KStreamAddRef ( read );
+                    if ( rc == 0 )
+                    {
+                        rc = KStreamAddRef ( write );
+                        if ( rc ==  0 )
+                        {
+                            sfs -> in = read;
+                            sfs -> out = write;
+                            *strm = & sfs -> dad;
+
+                            return 0;
+                        }
+
+                        KStreamRelease ( read );
+                    }
+                }
+
+                free ( sfs );
+            }
+        }
+
+        *strm = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/kns/stream-priv.h b/libs/kns/stream-priv.h
new file mode 100644
index 0000000..82b7073
--- /dev/null
+++ b/libs/kns/stream-priv.h
@@ -0,0 +1,52 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_libs_kns_stream_priv_
+#define _h_libs_kns_stream_priv_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* VDB.v2 is end of life, and introducing new object types is
+   dangerous. For our purposes, just call a stream a file */
+#ifndef rcStream
+#define rcStream rcFile
+#endif
+
+#ifndef rcSocket
+#define rcSocket rcFile
+#endif
+
+#ifndef rcUrl
+#define rcUrl rcPath
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_libs_kns_stream_priv_ */
diff --git a/libs/kns/stream.c b/libs/kns/stream.c
new file mode 100644
index 0000000..e8d98b6
--- /dev/null
+++ b/libs/kns/stream.c
@@ -0,0 +1,782 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kns/extern.h>
+#include <kns/impl.h>
+#include <klib/rc.h>
+#include <kproc/timeout.h>
+
+#include <os-native.h>
+
+#include <sysalloc.h>
+
+#include "stream-priv.h"
+
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * KStream
+ *  a file
+ */
+
+/* Destroy
+ *  destroy stream
+ */
+static
+rc_t KStreamDestroy ( KStream *self )
+{
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcDestroying, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . destroy ) ( self );
+    }
+
+    return RC ( rcNS, rcStream, rcDestroying, rcInterface, rcBadVersion );
+}
+
+/* AddRef
+ *  creates a new reference
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KStreamAddRef ( const KStream *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KStream" ) )
+        {
+        case krefLimit:
+            return RC ( rcNS, rcStream, rcAttaching, rcRange, rcExcessive );
+        case krefNegative:
+            return RC ( rcNS, rcStream, rcAttaching, rcSelf, rcInvalid );
+        default:
+            break;
+        }
+    }
+    return 0;
+}
+
+/* Release
+ *  discard reference to file
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KStreamRelease ( const KStream *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KStream" ) )
+        {
+        case krefWhack:
+            return KStreamDestroy ( ( KStream* ) self );
+        case krefNegative:
+            return RC ( rcNS, rcStream, rcReleasing, rcRange, rcExcessive );
+        default:
+            break;
+        }
+    }
+
+    return 0;
+}
+
+/* Read
+ * TimedRead
+ *  read data from stream
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of stream.
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+LIB_EXPORT rc_t CC KStreamRead ( const KStream *self,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    if ( num_read == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcParam, rcNull );
+
+    * num_read = 0;
+
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcNS, rcStream, rcReading, rcStream, rcNoPerm );
+
+    if ( buffer == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcBuffer, rcNull );
+    if ( bsize == 0 )
+        return RC ( rcNS, rcStream, rcReading, rcBuffer, rcInsufficient );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . read ) ( self, buffer, bsize, num_read );
+    }
+
+    return RC ( rcNS, rcStream, rcReading, rcInterface, rcBadVersion );
+}
+
+LIB_EXPORT rc_t CC KStreamTimedRead ( const KStream *self,
+    void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm )
+{
+    if ( num_read == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcParam, rcNull );
+
+    * num_read = 0;
+
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcNS, rcStream, rcReading, rcStream, rcNoPerm );
+
+    if ( buffer == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcBuffer, rcNull );
+    if ( bsize == 0 )
+        return RC ( rcNS, rcStream, rcReading, rcBuffer, rcInsufficient );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 1 )
+            return ( * self -> vt -> v1 . timed_read ) ( self, buffer, bsize, num_read, tm );
+        if ( tm == NULL )
+            return ( * self -> vt -> v1 . read ) ( self, buffer, bsize, num_read );
+        break;
+    }
+
+
+    return RC ( rcNS, rcStream, rcReading, rcInterface, rcBadVersion );
+}
+
+
+/* ReadAll
+ * TimedReadAll
+ *  read from stream until "bsize" bytes have been retrieved
+ *  or until end-of-input
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT ] - return parameter giving number of bytes
+ *  actually read. when returned value is zero and return code is
+ *  also zero, interpreted as end of stream.
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+LIB_EXPORT rc_t CC KStreamReadAll ( const KStream *self,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+    uint8_t *b;
+    size_t total, count;
+
+    if ( num_read == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcParam, rcNull );
+
+    * num_read = 0;
+
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcNS, rcStream, rcReading, rcStream, rcNoPerm );
+
+    if ( buffer == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcBuffer, rcNull );
+    if ( bsize == 0 )
+        return RC ( rcNS, rcStream, rcReading, rcBuffer, rcInsufficient );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        count = 0;
+        rc = ( * self -> vt -> v1 . read ) ( self, buffer, bsize, & count );
+        total = count;
+
+        if ( rc == 0 && count != 0 && count < bsize )
+        {
+            if ( self -> vt -> v1 . min >= 1 )
+            {
+                timeout_t no_block;
+                TimeoutInit ( & no_block, 0 );
+
+                for ( rc = 0, b = buffer; total < bsize; total += count )
+                {
+                    count = 0;
+                    rc = ( * self -> vt -> v1 . timed_read ) ( self, b + total, bsize - total, & count, & no_block );
+                    if ( rc != 0 )
+                        break;
+                    if ( count == 0 )
+                        break;
+                }
+            }
+            else
+            {
+                for ( rc = 0, b = buffer; total < bsize; total += count )
+                {
+                    count = 0;
+                    rc = ( * self -> vt -> v1 . read ) ( self, b + total, bsize - total, & count );
+                    if ( rc != 0 )
+                        break;
+                    if ( count == 0 )
+                        break;
+                }
+            }
+        }
+        break;
+
+    default:
+        return RC ( rcNS, rcStream, rcReading, rcInterface, rcBadVersion );
+    }
+
+    if ( total != 0 )
+    {
+        * num_read = total;
+        return 0;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KStreamTimedReadAll ( const KStream *self,
+    void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm )
+{
+    rc_t rc;
+    uint8_t *b;
+    size_t total, count;
+
+    if ( num_read == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcParam, rcNull );
+
+    * num_read = 0;
+
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcNS, rcStream, rcReading, rcStream, rcNoPerm );
+
+    if ( buffer == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcBuffer, rcNull );
+    if ( bsize == 0 )
+        return RC ( rcNS, rcStream, rcReading, rcBuffer, rcInsufficient );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 1 )
+        {
+            count = 0;
+            rc = ( * self -> vt -> v1 . timed_read ) ( self, buffer, bsize, & count, tm );
+            total = count;
+
+            if ( rc == 0 && count != 0 && count < bsize )
+            {
+                timeout_t no_block;
+                TimeoutInit ( & no_block, 0 );
+                
+                for ( b = buffer; total < bsize; total += count )
+                {
+                    count = 0;
+                    rc = ( * self -> vt -> v1 . timed_read ) ( self, b + total, bsize - total, & count, & no_block );
+                    if ( rc != 0 )
+                        break;
+                    if ( count == 0 )
+                        break;
+                }
+            }
+            break;
+        }
+
+        if ( tm == NULL )
+        {
+            for ( rc = 0, b = buffer, total = 0; total < bsize; total += count )
+            {
+                count = 0;
+                rc = ( * self -> vt -> v1 . read ) ( self, b + total, bsize - total, & count );
+                if ( rc != 0 )
+                    break;
+                if ( count == 0 )
+                    break;
+            }
+            break;
+        }
+
+        /* no break */
+
+    default:
+        return RC ( rcNS, rcStream, rcReading, rcInterface, rcBadVersion );
+    }
+
+    if ( total != 0 )
+    {
+        * num_read = total;
+        return 0;
+    }
+
+    return rc;
+}
+
+
+/* ReadExactly
+ * TimedReadExactly
+ *  read from stream until "bytes" have been retrieved
+ *  or return incomplete transfer
+ *
+ *  "buffer" [ OUT ] and "bytes" [ IN ] - return buffer for read
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed reads. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+LIB_EXPORT rc_t CC KStreamReadExactly ( const KStream *self,
+    void *buffer, size_t bytes )
+{
+    rc_t rc;
+    uint8_t *b;
+    size_t total, count;
+
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcNS, rcStream, rcReading, rcStream, rcNoPerm );
+
+    if ( bytes == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        assert ( bytes != 0 );
+        for ( b = buffer, total = 0; total < bytes; total += count )
+        {
+            count = 0;
+            rc = ( * self -> vt -> v1 . read ) ( self, b + total, bytes - total, & count );
+            if ( rc != 0 )
+            {
+                if ( GetRCObject ( rc ) != ( enum RCObject )rcTimeout || GetRCState ( rc ) != rcExhausted )
+                    break;
+            }
+            else if ( count == 0 )
+            {
+                rc = RC ( rcNS, rcStream, rcReading, rcTransfer, rcIncomplete );
+                break;
+            }
+        }
+        break;
+
+    default:
+        return RC ( rcNS, rcStream, rcReading, rcInterface, rcBadVersion );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KStreamTimedReadExactly ( const KStream *self,
+    void *buffer, size_t bytes, struct timeout_t *tm )
+{
+    rc_t rc;
+    uint8_t *b;
+    size_t total, count;
+
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcSelf, rcNull );
+
+    if ( ! self -> read_enabled )
+        return RC ( rcNS, rcStream, rcReading, rcStream, rcNoPerm );
+
+    if ( bytes == 0 )
+        return RC ( rcNS, rcStream, rcReading, rcBuffer, rcInsufficient );
+    if ( buffer == NULL )
+        return RC ( rcNS, rcStream, rcReading, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 1 )
+        {
+            assert ( bytes != 0 );
+            for ( b = buffer, total = 0; total < bytes; total += count )
+            {
+                count = 0;
+                rc = ( * self -> vt -> v1 . timed_read ) ( self, b + total, bytes - total, & count, tm );
+                if ( rc != 0 )
+                {
+                    if ( tm != NULL )
+                        break;
+                    if ( GetRCObject ( rc ) != ( enum RCObject ) rcTimeout || GetRCState ( rc ) != rcExhausted )
+                        break;
+                }
+                else if ( count == 0 )
+                {
+                    rc = RC ( rcNS, rcStream, rcReading, rcTransfer, rcIncomplete );
+                    break;
+                }
+            }
+
+            break;
+        }
+
+        if ( tm == NULL )
+        {
+            assert ( bytes != 0 );
+            for ( b = buffer, total = 0; total < bytes; total += count )
+            {
+                count = 0;
+                rc = ( * self -> vt -> v1 . read ) ( self, b + total, bytes - total, & count );
+                if ( rc != 0 )
+                {
+                    if ( GetRCObject ( rc ) != ( enum RCObject )rcTimeout || GetRCState ( rc ) != rcExhausted )
+                        break;
+                }
+                else if ( count == 0 )
+                {
+                    rc = RC ( rcNS, rcStream, rcReading, rcTransfer, rcIncomplete );
+                    break;
+                }
+            }
+            break;
+        }
+
+        /* no break */
+
+    default:
+        return RC ( rcNS, rcStream, rcReading, rcInterface, rcBadVersion );
+    }
+
+    return rc;
+}
+
+/* Write
+ * TimedWrite
+ *  send data to stream
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed writes. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+LIB_EXPORT rc_t CC KStreamWrite ( KStream *self,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    size_t ignore;
+    if ( num_writ == NULL )
+        num_writ = & ignore;
+
+    * num_writ = 0;
+
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcWriting, rcSelf, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcNS, rcStream, rcWriting, rcStream, rcNoPerm );
+
+    if ( size == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcNS, rcStream, rcWriting, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . write ) ( self, buffer, size, num_writ );
+    }
+
+    return RC ( rcNS, rcStream, rcWriting, rcInterface, rcBadVersion );
+}
+
+LIB_EXPORT rc_t CC KStreamTimedWrite ( KStream *self,
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm )
+{
+    size_t ignore;
+    if ( num_writ == NULL )
+        num_writ = & ignore;
+
+    * num_writ = 0;
+
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcWriting, rcSelf, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcNS, rcStream, rcWriting, rcStream, rcNoPerm );
+
+    if ( size == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcNS, rcStream, rcWriting, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 1 )
+            return ( * self -> vt -> v1 . timed_write ) ( self, buffer, size, num_writ, tm );
+        if ( tm == NULL )
+            return ( * self -> vt -> v1 . write ) ( self, buffer, size, num_writ );
+        break;
+    }
+
+    return RC ( rcNS, rcStream, rcWriting, rcInterface, rcBadVersion );
+}
+
+/* WriteAll
+ * TimedWriteAll
+ *  write to stream until "size" bytes have been transferred
+ *  or until no further progress can be made
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ *  "tm" [ IN/OUT, NULL OKAY ] - an optional indicator of
+ *  blocking behavior. not all implementations will support
+ *  timed writes. a NULL timeout will block indefinitely,
+ *  a value of "tm->mS == 0" will have non-blocking behavior
+ *  if supported by implementation, and "tm->mS > 0" will indicate
+ *  a maximum wait timeout.
+ */
+LIB_EXPORT rc_t CC KStreamWriteAll ( KStream *self,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    rc_t rc;
+    const uint8_t *b;
+    size_t total, count;
+
+    size_t ignore;
+    if ( num_writ == NULL )
+        num_writ = & ignore;
+
+    * num_writ = 0;
+
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcWriting, rcSelf, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcNS, rcStream, rcWriting, rcStream, rcNoPerm );
+
+    if ( size == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcNS, rcStream, rcWriting, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        count = 0;
+        rc = ( * self -> vt -> v1 . write ) ( self, buffer, size, & count );
+        total = count;
+
+        if ( rc == 0 && count != 0 && count < size )
+        {
+            if ( self -> vt -> v1 . min >= 1 )
+            {
+                timeout_t no_block;
+                TimeoutInit ( & no_block, 0 );
+
+                for ( b = buffer; total < size; total += count )
+                {
+                    count = 0;
+                    rc = ( * self -> vt -> v1 . timed_write ) ( self, b + total, size - total, & count, & no_block );
+                    if ( rc != 0 )
+                        break;
+                    if ( count == 0 )
+                        break;
+                }
+            }
+            else
+            {
+                for ( b = buffer; total < size; total += count )
+                {
+                    count = 0;
+                    rc = ( * self -> vt -> v1 . write ) ( self, b + total, size - total, & count );
+                    if ( rc != 0 )
+                        break;
+                    if ( count == 0 )
+                        break;
+                }
+            }
+        }
+        break;
+
+    default:
+        return RC ( rcNS, rcStream, rcWriting, rcInterface, rcBadVersion );
+    }
+
+    * num_writ = total;
+    if ( total == size )
+        return 0;
+    if ( rc == 0 )
+        return RC ( rcNS, rcStream, rcWriting, rcTransfer, rcIncomplete );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KStreamTimedWriteAll ( KStream *self,
+    const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm )
+{
+    rc_t rc;
+    const uint8_t *b;
+    size_t total, count;
+
+    size_t ignore;
+    if ( num_writ == NULL )
+        num_writ = & ignore;
+
+    * num_writ = 0;
+
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcWriting, rcSelf, rcNull );
+
+    if ( ! self -> write_enabled )
+        return RC ( rcNS, rcStream, rcWriting, rcStream, rcNoPerm );
+
+    if ( size == 0 )
+        return 0;
+    if ( buffer == NULL )
+        return RC ( rcNS, rcStream, rcWriting, rcBuffer, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        if ( self -> vt -> v1 . min >= 1 )
+        {
+            for ( rc = 0, b = buffer, total = 0; total < size; total += count )
+            {
+                count = 0;
+                rc = ( * self -> vt -> v1 . timed_write ) ( self, b + total, size - total, & count, tm );
+                if ( rc != 0 )
+                    break;
+                if ( count == 0 )
+                    break;
+            }
+            break;
+        }
+
+        if ( tm == NULL )
+        {
+            for ( rc = 0, b = buffer, total = 0; total < size; total += count )
+            {
+                count = 0;
+                rc = ( * self -> vt -> v1 . write ) ( self, b + total, size - total, & count );
+                if ( rc != 0 )
+                    break;
+                if ( count == 0 )
+                    break;
+            }
+            break;
+        }
+
+        /* no break */
+
+    default:
+        return RC ( rcNS, rcStream, rcWriting, rcInterface, rcBadVersion );
+    }
+
+    * num_writ = total;
+    if ( total == size )
+        return 0;
+    if ( rc == 0 )
+        return RC ( rcNS, rcStream, rcWriting, rcTransfer, rcIncomplete );
+    return rc;
+}
+
+
+/* Init
+ *  initialize a newly allocated stream object
+ */
+LIB_EXPORT rc_t CC KStreamInit ( KStream *self, const KStream_vt *vt,
+    const char *classname, const char *strname,
+    bool read_enabled, bool write_enabled )
+{
+    if ( self == NULL )
+        return RC ( rcNS, rcStream, rcConstructing, rcSelf, rcNull );
+    if ( vt == NULL )
+        return RC ( rcNS, rcStream, rcConstructing, rcInterface, rcNull );
+    switch ( vt -> v1 . maj )
+    {
+    case 0:
+        return RC ( rcNS, rcStream, rcConstructing, rcInterface, rcInvalid );
+
+    case 1:
+        switch ( vt -> v1 . min )
+        {
+            /* ADD NEW MINOR VERSION CASES HERE */
+        case 1:
+#if _DEBUGGING
+            if ( vt -> v1 . timed_write == NULL ||
+                 vt -> v1 . timed_read == NULL )
+                return RC ( rcNS, rcStream, rcConstructing, rcInterface, rcNull );
+#endif
+        case 0:
+#if _DEBUGGING
+        if ( vt -> v1 . write == NULL         ||
+             vt -> v1 . read == NULL          ||
+             vt -> v1 . destroy == NULL )
+        return RC ( rcNS, rcStream, rcConstructing, rcInterface, rcNull );
+#endif
+            break;
+        default:
+            return RC ( rcNS, rcStream, rcConstructing, rcInterface, rcBadVersion );
+        }
+        break;
+
+    default:
+        return RC ( rcNS, rcStream, rcConstructing, rcInterface, rcBadVersion );
+    }
+
+    self -> vt = vt;
+    KRefcountInit ( & self -> refcount, 1, classname, "init", strname );
+    self -> read_enabled = ( uint8_t ) ( read_enabled != 0 );
+    self -> write_enabled = ( uint8_t ) ( write_enabled != 0 );
+
+    return 0;
+}
diff --git a/libs/kns/sysmgr.h b/libs/kns/sysmgr.h
new file mode 100644
index 0000000..1e45eed
--- /dev/null
+++ b/libs/kns/sysmgr.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sysmgr_
+#define _h_sysmgr_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t KNSManagerInit();
+void KNSManagerCleanup();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libs/kns/tls-priv.h b/libs/kns/tls-priv.h
new file mode 100644
index 0000000..767345b
--- /dev/null
+++ b/libs/kns/tls-priv.h
@@ -0,0 +1,80 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_libs_kns_tls_priv_
+#define _h_libs_kns_tls_priv_
+
+#ifndef _h_kns_tls_
+#include <kns/tls.h>
+#endif
+
+#if ! defined ( MBEDTLS_CONFIG_FILE )
+#include <mbedtls/config.h>
+#else
+#include MBEDTLS_CONFIG_FILE 
+#endif
+
+#include <mbedtls/net.h>
+#include <mbedtls/debug.h>
+#include <mbedtls/ssl.h>
+#include <mbedtls/aes.h>
+#include <mbedtls/entropy.h>
+#include <mbedtls/ctr_drbg.h>
+#include <mbedtls/error.h>
+#include <mbedtls/certs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct KConfig;
+
+/*--------------------------------------------------------------------------
+ * KTLSGlobals
+ */
+typedef struct KTLSGlobals KTLSGlobals;
+struct KTLSGlobals
+{
+    mbedtls_x509_crt cacert;
+    mbedtls_ctr_drbg_context ctr_drbg;
+    mbedtls_entropy_context entropy;
+    mbedtls_ssl_config config;
+};
+
+/* Init
+ */
+rc_t KTLSGlobalsInit ( KTLSGlobals * tlsg, struct KConfig const * kfg );
+
+/* Whack
+ */
+void KTLSGlobalsWhack ( KTLSGlobals * self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_libs_kns_tls_priv_ */
diff --git a/libs/kns/tls.c b/libs/kns/tls.c
new file mode 100644
index 0000000..3b50efd
--- /dev/null
+++ b/libs/kns/tls.c
@@ -0,0 +1,1087 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+struct KTLSStream;
+#define KSTREAM_IMPL struct KTLSStream
+
+#include <kns/extern.h>
+#include <kns/manager.h>
+#include <kns/tls.h>
+#include <kns/impl.h>
+#include <kns/socket.h>
+#include <klib/rc.h>
+#include <klib/status.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/namelist.h>
+#include <kproc/timeout.h>
+#include <kfg/config.h>
+
+#include <os-native.h>
+
+#include <sysalloc.h>
+
+#include "mgr-priv.h"
+#include "stream-priv.h"
+
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if ! defined ( MBEDTLS_CONFIG_FILE )
+#include <mbedtls/config.h>
+#else
+#include MBEDTLS_CONFIG_FILE 
+#endif
+
+#include <mbedtls/net.h>
+#include <mbedtls/debug.h>
+#include <mbedtls/ssl.h>
+#include <mbedtls/aes.h>
+#include <mbedtls/entropy.h>
+#include <mbedtls/ctr_drbg.h>
+#include <mbedtls/error.h>
+#include <mbedtls/certs.h>
+
+static const char ca_crt_ncbi1 [] =
+    "-----BEGIN CERTIFICATE-----\r\n"
+    "MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\r\n"
+    "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n"
+    "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\r\n"
+    "QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\r\n"
+    "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\r\n"
+    "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\r\n"
+    "9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\r\n"
+    "CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\r\n"
+    "nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\r\n"
+    "43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\r\n"
+    "T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\r\n"
+    "gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\r\n"
+    "BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\r\n"
+    "TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\r\n"
+    "DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\r\n"
+    "hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\r\n"
+    "06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\r\n"
+    "PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\r\n"
+    "YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\r\n"
+    "CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4wOTAeBggrBgEFBQcD\r\n"
+    "BAYIKwYBBQUHAwEGCCsGAQUFBwMDDBdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQQ==\r\n"
+    "-----END CERTIFICATE-----\r\n";
+
+static const char ca_crt_ncbi2 [] =
+    "-----BEGIN CERTIFICATE-----\r\n"
+    "MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\r\n"
+    "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n"
+    "d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\r\n"
+    "ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\r\n"
+    "MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\r\n"
+    "LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\r\n"
+    "RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm\r\n"
+    "+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW\r\n"
+    "PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM\r\n"
+    "xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB\r\n"
+    "Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3\r\n"
+    "hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg\r\n"
+    "EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF\r\n"
+    "MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA\r\n"
+    "FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec\r\n"
+    "nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z\r\n"
+    "eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF\r\n"
+    "hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2\r\n"
+    "Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\r\n"
+    "vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep\r\n"
+    "+OkuE6N36B9KMEQwHgYIKwYBBQUHAwQGCCsGAQUFBwMBBggrBgEFBQcDAwwiRGln\r\n"
+    "aUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQQ==\r\n"
+    "-----END CERTIFICATE-----\r\n";
+
+
+/*--------------------------------------------------------------------------
+ * mbedtls_strerror
+ */
+
+static
+const char * mbedtls_strerror2 ( int err )
+{
+    static char buffer [ 256 ];
+    mbedtls_strerror ( err, buffer, sizeof buffer );
+    return buffer;
+}
+
+/*--------------------------------------------------------------------------
+ * KTLSGlobals
+ */
+
+static
+rc_t tlsg_seed_rng ( KTLSGlobals *self )
+{
+    int ret;
+    const char *pers = "vdb_tls_client";
+    const size_t pers_size = sizeof "vdb_tls_client" - 1;
+
+    STATUS ( STAT_QA, "Seeding the random number generator\n" );
+
+    ret = mbedtls_ctr_drbg_seed ( &self -> ctr_drbg, mbedtls_entropy_func, 
+                                  &self -> entropy, ( const unsigned char * ) pers, pers_size );
+
+    if ( ret != 0 )
+    {
+        rc_t rc = RC ( rcKrypto, rcRng, rcInitializing, rcSeed, rcFailed );
+        PLOGERR ( klogSys, ( klogSys, rc
+                             , "mbedtls_ctr_drbg_seed returned $(ret) ( $(expl) )"
+                             , "ret=%d,expl=%s"
+                             , ret
+                             , mbedtls_strerror2 ( ret )
+                      ) );
+        return rc;
+    }
+   
+    return 0;
+}
+
+static 
+rc_t tlsg_init_certs ( KTLSGlobals *self, const KConfig * kfg )
+{
+    int ret;
+
+    rc_t rc = 0;
+    uint32_t nidx, num_certs = 0;
+
+    static char * node_names [] =
+    {
+        "/tls/ca.crt",
+        "/tls/self-signed"
+    };
+
+    STATUS ( STAT_QA, "Loading CA root certificates\n" );
+
+    for ( nidx = 0; rc == 0 && nidx < sizeof node_names / sizeof node_names [ 0 ]; ++ nidx )
+    {
+        const KConfigNode * ca_crt;
+        const char * node_name = node_names [ nidx ];
+
+        rc = KConfigOpenNodeRead ( kfg, & ca_crt, "%s", node_name );
+        if ( rc != 0 )
+            rc = 0;
+        else
+        {
+            KNamelist * cert_names;
+
+            STATUS ( STAT_PRG, "Listing CA root certificates\n" );
+            rc = KConfigNodeListChildren ( ca_crt, & cert_names );
+            if ( rc != 0 )
+            {
+                rc = ResetRCContext ( rc, rcKrypto, rcToken, rcInitializing );
+                PLOGERR ( klogInt, ( klogInt, rc
+                                     , "failed to list config node '$(node)'"
+                                     , "node=%s"
+                                     , node_name
+                              ) );
+            }
+            else
+            {
+                uint32_t count;
+
+                STATUS ( STAT_GEEK, "Counting CA root certificates\n" );
+                rc = KNamelistCount ( cert_names, & count );
+                if ( rc != 0 )
+                {
+                    rc = ResetRCContext ( rc, rcKrypto, rcToken, rcInitializing );
+                    PLOGERR ( klogInt, ( klogInt, rc
+                                         , "failed to count names in config node '$(node)'"
+                                         , "node=%s"
+                                         , node_name
+                                  ) );
+                }
+                else
+                {
+                    uint32_t i;
+                    String * cert_string;
+                    const KConfigNode * root_cert;
+
+                    STATUS ( STAT_GEEK, "Found %u names in CA root certificates\n", count );
+                    STATUS ( STAT_PRG, "Retrieving names in CA root certificates\n" );
+                    for ( i = 0; i < count; ++ i )
+                    {
+                        const char * cert_name;
+
+                        STATUS ( STAT_GEEK, "Retrieving name %u in CA root certificates\n", i );
+                        rc = KNamelistGet ( cert_names, i, & cert_name );
+                        if ( rc != 0 )
+                        {
+                            rc = ResetRCContext ( rc, rcKrypto, rcToken, rcInitializing );
+                            PLOGERR ( klogInt, ( klogInt, rc
+                                                 , "failed to read cert $(idx) in config node '$(node)'"
+                                                 , "node=%s,idx=%u"
+                                                 , node_name
+                                                 , i
+                                          ) );
+                            break;
+                        }
+                        
+                        STATUS ( STAT_GEEK, "Retrieving node '%s' from CA root certificates\n", cert_name );
+                        rc = KConfigNodeOpenNodeRead ( ca_crt, & root_cert, "%s", cert_name );
+                        if ( rc != 0 )
+                        {
+                            rc = ResetRCContext ( rc, rcKrypto, rcToken, rcInitializing );
+                            PLOGERR ( klogInt, ( klogInt, rc
+                                                 , "failed to read node for cert '$(name)' in config node '$(node)'"
+                                                 , "node=%s,name=%s"
+                                                 , node_name
+                                                 , cert_name
+                                          ) );
+                            break;
+                        }
+                        
+                        STATUS ( STAT_GEEK, "Retrieving text for node '%s' from CA root certificates\n", cert_name );
+                        rc = KConfigNodeReadString ( root_cert, & cert_string );
+                        KConfigNodeRelease ( root_cert );
+                        
+                        if ( rc != 0 )
+                        {
+                            rc = ResetRCContext ( rc, rcKrypto, rcToken, rcInitializing );
+                            PLOGERR ( klogInt, ( klogInt, rc
+                                                 , "failed to read node text for cert '$(name)' in config node '$(node)'"
+                                                 , "node=%s,name=%s"
+                                                 , node_name
+                                                 , cert_name
+                                          ) );
+                            break;
+                        }
+
+
+                        /* these guys take a length, so presumably the string is not NUL terminated.
+                           yet, the first thing they do is see if the NUL is included in the length! */
+                        STATUS ( STAT_GEEK, "Parsing text for node '%s' from CA root certificates\n", cert_name );
+                        ret = mbedtls_x509_crt_parse ( &self -> cacert,
+                            ( const unsigned char * ) cert_string -> addr, cert_string -> size + 1 );
+                    
+                        StringWhack ( cert_string );
+                    
+                        if ( ret < 0 )
+                        {        
+                            rc = RC ( rcKrypto, rcToken, rcInitializing, rcEncryption, rcFailed );
+                            PLOGERR ( klogSys, ( klogSys, rc
+                                                 , "mbedtls_x509_crt_parse returned $(ret) ( $(expl) )"
+                                                 , "ret=%d,expl=%s"
+                                                 , ret
+                                                 , mbedtls_strerror2 ( ret )
+                                          ) );
+                            break;
+                        }
+                        
+                        ++ num_certs;
+                    }
+                }
+            
+                KNamelistRelease ( cert_names );
+            }
+
+            KConfigNodeRelease ( ca_crt );
+        }
+    }
+
+#if _DEBUGGING
+    {
+        const KConfigNode * ca_crt;
+        rc_t rc2 = KConfigOpenNodeRead ( kfg, & ca_crt, "/tls/path/ca.crt" );
+        if ( rc2 == 0 )
+        {
+            String * ca_crt_path;
+            STATUS ( STAT_GEEK, "Retrieving path to CA root certificate file\n" );
+            rc2 = KConfigNodeReadString ( ca_crt, & ca_crt_path );
+            if ( rc2 == 0 )
+            {
+                STATUS ( STAT_GEEK, "Parsing text from CA root certificate file '%S'\n", ca_crt_path );
+                ret = mbedtls_x509_crt_parse_file ( &self -> cacert, ca_crt_path -> addr );
+                if ( ret < 0 )
+                {
+                    PLOGMSG ( klogWarn, ( klogWarn
+                                          , "mbedtls_x509_crt_parse_file ( '$(path)' ) returned $(ret) ( $(expl) )"
+                                          , "ret=%d,expl=%s,path=%S"
+                                          , ret
+                                          , mbedtls_strerror2 ( ret )
+                                          , ca_crt_path
+                                  ) );
+                }                
+                StringWhack ( ca_crt_path );
+            }
+            KConfigNodeRelease ( ca_crt );
+        }
+    }
+#endif
+
+    if ( num_certs == 0 )
+    {
+        STATUS ( STAT_QA, "Parsing text for default CA root certificates\n" );
+        ret = mbedtls_x509_crt_parse ( &self -> cacert,
+            ( const unsigned char * ) ca_crt_ncbi1, sizeof ca_crt_ncbi1 );
+                    
+        if ( ret < 0 )
+        {        
+            rc = RC ( rcKrypto, rcToken, rcInitializing, rcEncryption, rcFailed );
+            PLOGERR ( klogSys, ( klogSys, rc
+                                 , "mbedtls_x509_crt_parse returned $(ret) ( $(expl) )"
+                                 , "ret=%d,expl=%s"
+                                 , ret
+                                 , mbedtls_strerror2 ( ret )
+                          ) );
+        }
+        else
+        {
+            num_certs = 1;
+            
+            ret = mbedtls_x509_crt_parse ( &self -> cacert,
+                ( const unsigned char * ) ca_crt_ncbi2, sizeof ca_crt_ncbi2 );
+
+            if ( ret >= 0 )
+                ++ num_certs;
+            else
+            {
+                rc = RC ( rcKrypto, rcToken, rcInitializing, rcEncryption, rcFailed );
+                PLOGERR ( klogSys, ( klogSys, rc
+                                     , "mbedtls_x509_crt_parse returned $(ret) ( $(expl) )"
+                                     , "ret=%d,expl=%s"
+                                     , ret
+                                     , mbedtls_strerror2 ( ret )
+                              ) );
+            }
+        }
+    }
+
+    return num_certs == 0 ? rc : 0;
+}
+
+static
+rc_t tlsg_setup ( KTLSGlobals * self )
+{
+    int ret;
+
+    STATUS ( STAT_QA, "Configuring SSl defaults\n" );
+
+    ret = mbedtls_ssl_config_defaults ( &self -> config,
+                                        MBEDTLS_SSL_IS_CLIENT,
+                                        MBEDTLS_SSL_TRANSPORT_STREAM,
+                                        MBEDTLS_SSL_PRESET_DEFAULT );
+
+    if ( ret != 0 )
+    {
+        rc_t rc = RC ( rcKrypto, rcNoTarg, rcFormatting, rcEncryption, rcFailed );
+        PLOGERR ( klogSys, ( klogSys, rc
+                             , "mbedtls_ssl_config_defaults returned $(ret) ( $(expl) )"
+                             , "ret=%d,expl=%s"
+                             , ret
+                             , mbedtls_strerror2 ( ret )
+                      ) );
+        return rc;
+    }
+
+    mbedtls_ssl_conf_authmode( &self -> config, MBEDTLS_SSL_VERIFY_REQUIRED );
+    mbedtls_ssl_conf_ca_chain( &self -> config, &self -> cacert, NULL );
+    mbedtls_ssl_conf_rng( &self -> config, mbedtls_ctr_drbg_random, &self -> ctr_drbg );
+
+    return 0;
+}
+
+/* Init
+ */
+rc_t KTLSGlobalsInit ( KTLSGlobals * tlsg, const KConfig * kfg )
+{
+    rc_t rc;
+
+    mbedtls_x509_crt_init ( &tlsg -> cacert );
+    mbedtls_ctr_drbg_init ( &tlsg -> ctr_drbg );
+    mbedtls_entropy_init ( &tlsg -> entropy );
+    mbedtls_ssl_config_init ( &tlsg -> config );
+
+    rc = tlsg_seed_rng ( tlsg );
+    if ( rc == 0 )
+    {
+        rc = tlsg_init_certs ( tlsg, kfg );
+        if ( rc == 0 )
+            rc = tlsg_setup ( tlsg );
+    }
+
+    return rc;
+}
+
+/* Whack
+ */
+void KTLSGlobalsWhack ( KTLSGlobals * self )
+{
+    mbedtls_ssl_config_free ( &self -> config );
+    mbedtls_entropy_free ( &self -> entropy );
+    mbedtls_ctr_drbg_free ( &self -> ctr_drbg );
+    mbedtls_x509_crt_free ( &self -> cacert );
+
+    memset ( self, 0, sizeof * self );
+}
+
+/*--------------------------------------------------------------------------
+ * KTLSStream
+ */
+
+struct KTLSStream
+{
+    KStream dad;
+
+    /* hold a reference to manager */
+    const KNSManager * mgr;
+
+    /* hold a reference to ciphertext object */
+    KStream * ciphertext;
+
+    /* optional timeout */
+    struct timeout_t * tm;
+
+    /* mbed library specific data */
+    mbedtls_ssl_context ssl;
+
+    /* error returned from ciphertext stream */
+    rc_t rd_rc;
+    rc_t wr_rc;
+};
+
+static
+void KTLSStreamDestroy ( KTLSStream *self )
+{
+    /* tear down all of the stuff created during Make */
+    mbedtls_ssl_close_notify( &self -> ssl ); /* close connection - this might need to be elsewhere */
+    mbedtls_ssl_free ( &self -> ssl );
+
+    /* release the ciphertext object */
+    KStreamRelease ( self -> ciphertext );
+    self -> ciphertext = NULL;
+}
+
+static
+rc_t CC KTLSStreamWhack ( KTLSStream *self )
+{
+    KTLSStreamDestroy ( self );
+
+    /* release the manager */
+    KNSManagerRelease ( self -> mgr );
+    self -> mgr = NULL;
+
+    /* done */
+    free ( self );
+    return 0;
+}
+
+static
+rc_t CC KTLSStreamRead ( const KTLSStream * cself,
+    void * buffer, size_t bsize, size_t * num_read )
+{
+    int ret;
+    rc_t rc = 0;
+    KTLSStream * self = ( KTLSStream * ) cself;
+
+    if ( self -> ciphertext == NULL )
+    {
+        * num_read = 0;
+        return RC ( rcNS, rcSocket, rcReading, rcSocket, rcInvalid );
+    }
+
+    STATUS ( STAT_QA, "Reading from server..." );
+
+    self -> rd_rc = 0;
+
+    while ( 1 )
+    {
+        /* read through TLS library */
+        ret = mbedtls_ssl_read( &self -> ssl, buffer, bsize );
+
+        /* no error */
+        if ( ret >= 0 )
+        {
+            STATUS ( STAT_PRG, "%u bytes read", ret );
+            break;
+        }
+
+        /* detect error at socket level */
+        if ( self -> rd_rc != 0 )
+        {
+            rc = self -> rd_rc;
+            PLOGERR ( klogSys, ( klogSys, rc
+                                 , "mbedtls_ssl_read returned $(ret) ( $(expl) )"
+                                 , "ret=%d,expl=%s"
+                                 , ret
+                                 , mbedtls_strerror2 ( ret )
+                          ) );
+
+            ret = 0;
+            self -> rd_rc = 0;
+            break;
+        }
+    
+        /* this is a TLS error */
+        switch ( ret )
+        {
+            /* The ret is anything other than the following 3, then the ssl context becomes
+             * becomes unusable and should either be freed or call
+             * mbedtls_ssl_session_reset () before a new connection; current connection
+             * must be closed
+             */
+        case MBEDTLS_ERR_SSL_WANT_READ: 
+        case MBEDTLS_ERR_SSL_WANT_WRITE:
+            continue; /* TBD - allow the app to check signals */
+        case MBEDTLS_ERR_SSL_CLIENT_RECONNECT: 
+            /* can only happen server-side:   When this function return MBEDTLS_ERR_SSL_CLIENT_RECONNECT
+             * (which can only happen server-side), it means that a client
+             * is initiating a new connection using the same source port.
+             * You can either treat that as a connection close and wait
+             * for the client to resend a ClientHello, or directly
+             * continue with \c mbedtls_ssl_handshake() with the same
+             * context (as it has beeen reset internally). Either way, you
+             * should make sure this is seen by the application as a new
+             * connection: application state, if any, should be reset, and
+             * most importantly the identity of the client must be checked
+             * again. WARNING: not validating the identity of the client
+             * again, or not transmitting the new identity to the
+             * application layer, would allow authentication bypass!*/
+            rc = RC ( rcNS, rcSocket, rcReading, rcMode, rcUnsupported );
+            break;
+
+        case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY: /* check - only place their advanced sample client checks for this */
+            break;
+        case MBEDTLS_ERR_NET_CONN_RESET:
+            rc = RC ( rcNS, rcSocket, rcWriting, rcConnection, rcCanceled );
+            break;
+        case MBEDTLS_ERR_SSL_BAD_INPUT_DATA:
+            rc = RC ( rcNS, rcSocket, rcReading, rcParam, rcInvalid );
+            break;
+        case MBEDTLS_ERR_SSL_INTERNAL_ERROR: /* should never happen */
+        case MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE:
+        default:
+            rc = RC ( rcNS, rcSocket, rcReading, rcError, rcUnexpected );
+        }
+
+        /* invalidate the stream for any further use */
+        KTLSStreamDestroy ( self );
+        ret = 0;
+        break;
+    }
+
+    *num_read = ret;
+    return rc;
+}
+
+static
+rc_t CC KTLSStreamWrite ( KTLSStream * self,
+    const void * buffer, size_t size, size_t * num_writ )
+{
+    int ret;
+    rc_t rc = 0;
+
+    if ( self -> ciphertext == NULL )
+    {
+        * num_writ = 0;
+        return RC ( rcNS, rcSocket, rcWriting, rcSocket, rcInvalid );
+    }
+
+    STATUS ( STAT_PRG, "Writing %zu bytes to to server\n", size );
+    
+    self -> wr_rc = 0;
+
+    while ( 1 )
+    {
+        /* write through TLS library 
+        *  This function will do partial writes in some cases. If the
+        *  return value is non-negative but less than length, the
+        *  function must be called again with updated arguments:
+        *  buf + ret, len - ret (if ret is the return value) until
+        *  it returns a value equal to the last 'len' argument.
+        *
+        *  We expect to be called through KStreamWriteAll that will
+        *  avoid the issue above. 
+        */
+        ret = mbedtls_ssl_write ( &self -> ssl, buffer, size );
+
+        /* no error */
+        if ( ret >= 0 )
+        {
+            STATUS ( STAT_PRG, "%u bytes written", ret );
+            break;
+        }
+
+        /* detect error at socket level */
+        if ( self -> wr_rc != 0 )
+        {
+            rc = self -> wr_rc;
+            PLOGERR ( klogSys, ( klogSys, rc
+                                 , "mbedtls_ssl_write returned $(ret) ( $(expl) )"
+                                 , "ret=%d,expl=%s"
+                                 , ret
+                                 , mbedtls_strerror2 ( ret )
+                          ) );
+            ret = 0;
+            self -> wr_rc = 0;
+            break;
+        }
+
+        /* this is a TLS error */
+        switch ( ret )
+        {
+        case MBEDTLS_ERR_SSL_WANT_READ:
+        case MBEDTLS_ERR_SSL_WANT_WRITE:
+            continue;
+        case MBEDTLS_ERR_SSL_BAD_INPUT_DATA:
+            rc = RC ( rcNS, rcSocket, rcReading, rcParam, rcInvalid );
+            break;
+        default:
+            rc = RC ( rcNS, rcSocket, rcWriting, rcError, rcUnknown );
+            break;
+        }
+
+        ret = 0;
+        break;
+    }
+
+    * num_writ = ret;
+    return rc;
+}
+
+static
+rc_t CC KTLSStreamTimedRead ( const KTLSStream *cself,
+    void * buffer, size_t bsize, size_t * num_read, struct timeout_t * tm )
+{
+    rc_t rc;
+    KTLSStream * self = ( KTLSStream * ) cself;
+
+    self -> tm = tm;
+    rc = KTLSStreamRead ( self, buffer, bsize, num_read );
+    self -> tm = NULL;
+
+    return rc;
+}
+
+static
+rc_t CC KTLSStreamTimedWrite ( KTLSStream *self,
+    const void * buffer, size_t size, size_t * num_writ, struct timeout_t * tm )
+{
+    rc_t rc;
+
+    self -> tm = tm;
+    rc = KTLSStreamWrite ( self, buffer, size, num_writ );
+    self -> tm = NULL;
+
+    return rc;
+}
+
+
+static KStream_vt_v1 vtKTLSStream =
+{
+    1, 1,
+
+    KTLSStreamWhack,
+    KTLSStreamRead,
+    KTLSStreamWrite,
+    KTLSStreamTimedRead,
+    KTLSStreamTimedWrite
+};
+
+static
+int CC ktls_net_send ( void *ctx, const unsigned char *buf, size_t len )
+{
+    KTLSStream * self = ctx;
+
+    size_t num_writ;
+
+    if ( self -> tm != NULL )
+        self -> wr_rc = KStreamTimedWriteAll ( self -> ciphertext, buf, len, & num_writ, self -> tm );
+    else
+        self -> wr_rc = KStreamWriteAll ( self -> ciphertext, buf, len, & num_writ );
+
+    if ( self -> wr_rc != 0 )
+    {
+        switch ( GetRCObject ( self -> wr_rc ) )
+        {
+        case rcConnection: /* EPIPE && ECONNRESET */
+            if ( GetRCState ( self -> wr_rc ) == rcCanceled ||
+                 GetRCState ( self -> wr_rc ) == rcInterrupted )
+                return MBEDTLS_ERR_NET_CONN_RESET;
+        case rcTransfer: /* EINTR */
+            return MBEDTLS_ERR_SSL_WANT_WRITE;
+        default:
+            return MBEDTLS_ERR_NET_SEND_FAILED;
+        }
+    }
+
+    return ( int ) num_writ;
+}
+
+/* called by mbedtls_ssl_fetch_input */
+static
+int CC ktls_net_recv ( void *ctx, unsigned char *buf, size_t len )
+{
+    size_t num_read;
+    KTLSStream * self = ctx;
+
+    if ( self -> tm != NULL )
+        self -> rd_rc = KStreamTimedRead ( self -> ciphertext, buf, len, & num_read, self -> tm );
+    else
+        self -> rd_rc = KStreamRead ( self -> ciphertext, buf, len, & num_read );
+
+    if ( self -> rd_rc != 0 )
+    {
+        /* TBD - discover if the read timed out - possibly return MBEDTLS_ERR_SSL_WANT_READ */
+        switch ( ( int ) GetRCObject ( self -> rd_rc ) )
+        {
+        case rcData:
+            return MBEDTLS_ERR_SSL_TIMEOUT;
+        case rcConnection: /* EPIPE && ECONNRESET */
+            if ( GetRCState ( self -> rd_rc ) == rcCanceled ||
+                 GetRCState ( self -> rd_rc ) == rcInterrupted )
+                return MBEDTLS_ERR_NET_CONN_RESET;
+        case rcTransfer: /* EINTR */
+            return MBEDTLS_ERR_SSL_WANT_READ;
+        default:
+            return MBEDTLS_ERR_NET_RECV_FAILED;
+        }
+    }
+
+    return ( int ) num_read;
+}
+
+static 
+rc_t ktls_ssl_setup ( KTLSStream *self, const String *host )
+{
+    int ret;
+    const String * hostz;
+    const KTLSGlobals * tlsg;
+
+    STATUS ( STAT_QA, "Setting up SSL/TLS structure" );
+
+    assert ( self -> mgr != NULL );
+    tlsg = & self -> mgr -> tlsg;
+
+    ret = mbedtls_ssl_setup( &self -> ssl, &tlsg -> config );
+    if ( ret != 0 )
+    {
+        rc_t rc = RC ( rcKrypto, rcSocket, rcFormatting, rcEncryption, rcFailed );
+        PLOGERR ( klogSys, ( klogSys, rc
+                             , "mbedtls_ssl_setup returned $(ret) ( $(expl) )"
+                             , "ret=%d,expl=%s"
+                             , ret
+                             , mbedtls_strerror2 ( ret )
+                      ) );
+        return rc;
+    }
+
+    /* HEURISTIC - no memory pages will be less than 4K in size.
+       we can safely test for a NUL byte at the end of the address
+       only if we know that this address is not exactly at a potential
+       page boundary. If the NUL byte would be on a potential page boundary,
+       it is not safe to test and we must reallocate.
+
+       Also, if not NUL terminated.
+
+       Finally, this will make Valgrind lose its mind...
+    */
+
+#if ! _DEBUGGING
+    assert ( host != NULL );
+    assert ( host -> addr != NULL );
+
+    if ( ( ( size_t ) ( & host -> addr [ host -> size ] ) & ( 4096 - 1 ) ) != 0 &&
+         host -> addr [ host -> size ] == 0 )
+    {
+        hostz = host;
+    }
+    else
+#endif
+    {
+        rc_t rc = StringCopy ( & hostz, host );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    ret = mbedtls_ssl_set_hostname( &self -> ssl, hostz -> addr );
+
+    if ( hostz != host )
+        StringWhack ( hostz );
+
+    if ( ret != 0 )
+    {
+        rc_t rc = RC ( rcKrypto, rcSocket, rcFormatting, rcEncryption, rcFailed );
+        PLOGERR ( klogSys, ( klogSys, rc
+                             , "mbedtls_ssl_set_hostname returned $(ret) ( $(expl) )"
+                             , "ret=%d,expl=%s"
+                             , ret
+                             , mbedtls_strerror2 ( ret )
+                      ) );
+        return rc;
+    }
+
+
+    mbedtls_ssl_set_bio( &self -> ssl, ( void * ) self, ktls_net_send, ktls_net_recv, NULL );
+
+    return 0;
+}
+
+static 
+rc_t ktls_handshake ( KTLSStream *self )
+{
+    int ret;
+
+    STATUS ( STAT_QA, "Performing SSL/TLS handshake...\n" );
+
+    ret = mbedtls_ssl_handshake( &self -> ssl );
+    while ( ret != 0 )
+    {
+        if ( ret != MBEDTLS_ERR_SSL_WANT_READ && 
+             ret != MBEDTLS_ERR_SSL_WANT_WRITE )
+        {
+            rc_t rc = RC ( rcKrypto, rcSocket, rcOpening, rcConnection, rcFailed );
+
+            PLOGERR ( klogSys, ( klogSys, rc
+                                 , "mbedtls_ssl_handshake returned $(ret) ( $(expl) )"
+                                 , "ret=%d,expl=%s"
+                                 , ret
+                                 , mbedtls_strerror2 ( ret )
+                          ) );
+
+            if ( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED )
+            {
+                uint32_t flags = mbedtls_ssl_get_verify_result( &self -> ssl );
+                if ( flags != 0 )
+                {
+                    char buf [ 4096 ];
+                    mbedtls_x509_crt_verify_info ( buf, sizeof( buf ), " !! ", flags );
+
+                    PLOGMSG ( klogSys, ( klogSys
+                                         , "mbedtls_ssl_get_verify_result returned $(flags) ( $(info) )"
+                                         , "flags=0x%X,info=%s"
+                                         , flags
+                                         , buf
+                                  ) );
+                }
+            }
+
+            return rc;
+        }
+        ret = mbedtls_ssl_handshake( &self -> ssl );
+    }
+
+    return 0;
+}
+
+
+static
+rc_t KTLSStreamMake ( KTLSStream ** objp, const KNSManager * mgr, const KSocket *ciphertext )
+{
+    rc_t rc;
+    KTLSStream * obj;
+
+    STATUS ( STAT_PRG, "%s\n", __func__ );
+
+    obj = calloc ( 1, sizeof * obj );
+    if ( obj == NULL )
+        rc = RC ( rcNS, rcMgr, rcAllocating, rcMemory, rcExhausted );
+    else
+    {
+        /* initialize the stream parent */
+        STATUS ( STAT_PRG, "%s - initializing KStream\n", __func__ );
+        rc = KStreamInit ( & obj -> dad, ( const KStream_vt* ) & vtKTLSStream, "KTLSStream", "", true, true );
+        if ( rc == 0 )
+        {
+            STATUS ( STAT_GEEK, "%s - attaching to KNSManager\n", __func__ );
+            rc = KNSManagerAddRef ( mgr );
+            if ( rc == 0 )
+            {
+                STATUS ( STAT_GEEK, "%s - accessing KStream from socket\n", __func__ );
+                rc = KSocketGetStream ( ciphertext, & obj -> ciphertext );
+                if ( rc == 0 )
+                {
+                    obj -> mgr = mgr;
+
+                    STATUS ( STAT_PRG, "%s - initializing tls wrapper\n", __func__ );
+                    mbedtls_ssl_init ( &obj -> ssl );
+
+                    * objp = obj;
+                    return 0;
+                }
+
+                KNSManagerRelease ( mgr );
+            }
+        }
+
+        free ( obj );
+    }
+
+    DBGMSG ( DBG_KNS, DBG_FLAG ( DBG_KNS ), ( "Failed to create TLS stream: %R\n", rc ) );
+
+    * objp = NULL;
+    return rc;
+}
+
+
+/* MakeTLSStream
+ *  create a TLS wrapper upon an existing KStream
+ *
+ *  data read from or written to TLS stream is in plaintext
+ *  data from to or wrapped stream is in ciphertext
+ *
+ *  "plaintext" [ OUT ] - return parameter for TLS stream
+ *
+ *  "ciphertext" [ IN ] - existing stream of ciphertext
+ *
+ *  "host" [ IN ] - host dns name
+ */
+LIB_EXPORT rc_t CC KNSManagerMakeTLSStream ( const KNSManager * self,
+    KTLSStream ** plaintext, const KSocket * ciphertext, const String * host )
+{
+    rc_t rc;
+
+    if ( plaintext == NULL )
+        rc = RC ( rcNS, rcMgr, rcAllocating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcMgr, rcAllocating, rcSelf, rcNull );
+        else if ( ciphertext == NULL )
+            rc = RC ( rcNS, rcMgr, rcAllocating, rcParam, rcNull );
+        else
+        {
+            KTLSStream * ktls;
+
+            /* create KTLSStream object */
+            rc = KTLSStreamMake ( & ktls, self, ciphertext );
+            if ( rc == 0 )
+            {
+                /* perform all initialization possible with information given */
+                rc = ktls_ssl_setup ( ktls, host );
+                if ( rc == 0 )
+                {
+                    rc = ktls_handshake ( ktls );
+                    if ( rc == 0 )
+                    {
+                        ktls -> mgr = self;
+                        *plaintext = ktls;
+                        return 0;
+                    }
+                }
+
+                KTLSStreamWhack ( ktls );
+            }
+        }
+
+        * plaintext = NULL;
+    }
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KTLSStreamAddRef ( const KTLSStream * self )
+{
+    /* works because address of self == address of self -> dad,
+       and if self == NULL, & self -> dad == NULL */
+    return KStreamAddRef ( & self -> dad );
+}
+
+LIB_EXPORT rc_t CC KTLSStreamRelease ( const KTLSStream * self )
+{
+    /* works because address of self == address of self -> dad,
+       and if self == NULL, & self -> dad == NULL */
+    return KStreamRelease ( & self -> dad );
+}
+
+/* VerifyCACert
+ */
+LIB_EXPORT rc_t CC KTLSStreamVerifyCACert ( const KTLSStream * self )
+{
+    rc_t rc = 0;
+
+   STATUS ( STAT_QA, "Verifying peer X.509 certificate..." );
+   
+   if ( self == NULL )
+       rc = RC ( rcKrypto, rcToken, rcValidating, rcSelf, rcNull );
+   else
+   {
+       uint32_t flags = mbedtls_ssl_get_verify_result( &self -> ssl );
+       if ( flags != 0 )
+       {
+           char buf [ 4096 ];
+           rc_t rc = RC ( rcKrypto, rcToken, rcValidating, rcEncryption, rcFailed );
+
+           mbedtls_x509_crt_verify_info ( buf, sizeof( buf ), "  ! ", flags );        
+
+           PLOGERR ( klogSys, ( klogSys, rc
+                                , "mbedtls_ssl_get_verify_result returned $(flags) ( $(info) )"
+                                , "flags=0x%X,info=%s"
+                                , flags
+                                , buf
+                         ) );
+           return rc;
+       }
+   }
+   
+   return rc;
+}
+
+
+/* GetStream
+ *  reference-counted cast operation
+ *  creates a reference to a KStream from a KTLSStream
+ */
+LIB_EXPORT rc_t CC KTLSStreamGetStream ( const KTLSStream * self,
+    struct KStream ** strm )
+{
+    rc_t rc;
+
+    if ( strm == NULL )
+        rc = RC ( rcNS, rcStream, rcValidating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcStream, rcValidating, rcSelf, rcNull );
+        else if ( self -> dad . vt != ( const KStream_vt* ) & vtKTLSStream )
+            rc = RC (rcNS, rcStream, rcValidating, rcInterface, rcNull );
+        else
+        {
+            /* at this point, the object must be in a fully
+               constructed and validated state. If not, it
+               is an error to access it as a stream. */
+
+            rc = KStreamAddRef ( & self -> dad );
+            if ( rc == 0 )
+            {
+                * strm = & ( ( KTLSStream * ) self ) -> dad;
+                return 0;
+            }
+        }
+
+        * strm = NULL;
+    }
+
+    return rc;
+}
+
diff --git a/libs/kns/unix/sysmgr.c b/libs/kns/unix/sysmgr.c
new file mode 100644
index 0000000..ac031a9
--- /dev/null
+++ b/libs/kns/unix/sysmgr.c
@@ -0,0 +1,37 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include "sysmgr.h"
+
+rc_t KNSManagerInit ( void )
+{
+    return 0;
+} 
+
+void KNSManagerCleanup ( void )
+{
+}
diff --git a/libs/kns/unix/syssock.c b/libs/kns/unix/syssock.c
new file mode 100644
index 0000000..d778f4b
--- /dev/null
+++ b/libs/kns/unix/syssock.c
@@ -0,0 +1,1435 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+#define KSTREAM_IMPL KSocket
+
+#include <kns/extern.h>
+#include <kns/manager.h>
+#include <kns/socket.h>
+#include <kns/impl.h>
+#include <kns/endpoint.h>
+
+#ifdef ERR
+#undef ERR
+#endif
+
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/time.h>
+
+#include <kproc/timeout.h>
+
+#include "mgr-priv.h"
+#include "stream-priv.h"
+#include "poll-priv.h"
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+#include <os-native.h>
+
+#include <arpa/inet.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <netinet/tcp.h>
+#include <poll.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <pwd.h>
+
+#ifndef POLLRDHUP
+#define POLLRDHUP 0
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KSocket
+ *  a socket IS a stream
+ *
+ *  in Berkeley socket terminology, a STREAM implies a CONTINUOUS stream,
+ *  which is implemented by the TCP connection. A "chunked" or discontiguous
+ *  stream would be a datagram stream, implemented usually by UDP.
+ *
+ *  in VDB terminology, a STREAM is a fluid, moving target that is observed
+ *  from a stationary point, whereas a FILE or OBJECT is a static stationary
+ *  target observed from a movable window. This means that a STREAM cannot be
+ *  addressed randomly, whereas a FILE or OBJECT can.
+ */
+struct KSocket
+{
+    KStream dad;
+    const char * path;
+    uint32_t type;
+    int32_t read_timeout;
+    int32_t write_timeout;
+
+    int fd;
+    union
+    {
+        struct sockaddr_in  v4;     /* for ipv4 */
+        struct sockaddr_in6 v6;     /* for ipv6 */
+    } remote_addr;
+    bool remote_addr_valid;
+};
+
+LIB_EXPORT rc_t CC KSocketAddRef( const KSocket *self )
+{
+    return KStreamAddRef ( & self -> dad );
+}
+
+LIB_EXPORT rc_t CC KSocketRelease ( const KSocket *self )
+{
+    return KStreamRelease ( & self -> dad );
+}
+
+/* GetStream
+ */
+LIB_EXPORT rc_t CC KSocketGetStream ( const KSocket * self, KStream ** s )
+{
+    rc_t rc;
+
+    if ( s == NULL )
+        rc = RC ( rcNS, rcSocket, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcSocket, rcOpening, rcSelf, rcNull );
+        else
+        {
+            rc = KSocketAddRef ( self );
+            if ( rc == 0 )
+            {
+                * s = & ( ( KSocket* ) self ) -> dad;
+                return 0;
+            }
+        }
+
+        * s = NULL;
+    }
+
+    return rc;
+}
+
+
+static
+rc_t CC KSocketWhack ( KSocket *self )
+{
+    assert ( self != NULL );
+
+    shutdown ( self -> fd, SHUT_WR );
+    
+    while ( 1 ) 
+    {
+        char buffer [ 1024 ];
+        ssize_t result = recv ( self -> fd, buffer, sizeof buffer, MSG_DONTWAIT );
+        if ( result <= 0 )
+            break;
+    }
+
+    shutdown ( self -> fd, SHUT_RD );
+
+    close ( self -> fd );
+
+    if ( self -> path != NULL )
+    {
+        unlink ( self -> path );
+        free ( ( void* ) self -> path );
+    }
+        
+    free ( self );
+
+    return 0;
+}
+
+static
+rc_t KSocketHandleSocknameCall ( int status )
+{
+    switch ( status )
+    {
+    case EBADF:
+        return RC ( rcNS, rcSocket, rcIdentifying, rcSocket, rcInvalid );
+    case EFAULT:
+    case EINVAL:
+        return RC ( rcNS, rcSocket, rcIdentifying, rcParam, rcInvalid );
+    case ENOBUFS:
+        return RC ( rcNS, rcSocket, rcIdentifying, rcBuffer, rcExhausted );
+    case ENOTCONN:
+        return RC ( rcNS, rcSocket, rcIdentifying, rcSocket, rcNotOpen );
+    case ENOTSOCK:
+        return RC ( rcNS, rcSocket, rcIdentifying, rcSocket, rcIncorrect );
+    }
+
+    return RC ( rcNS, rcSocket, rcIdentifying, rcError, rcUnknown );
+}
+
+static
+rc_t KSocketHandleSocketCall ( int status )
+{
+    switch ( status )
+    {
+    case EACCES:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcUnauthorized );
+    case EAFNOSUPPORT:
+    case EPROTONOSUPPORT:
+        return RC ( rcNS, rcSocket, rcCreating, rcInterface, rcUnsupported );
+    case EINVAL:
+        return RC ( rcNS, rcSocket, rcCreating, rcInterface, rcUnrecognized );
+    case EMFILE:
+    case ENFILE:
+        return RC ( rcNS, rcSocket, rcCreating, rcFileDesc, rcExhausted );
+    case ENOBUFS:
+        return RC ( rcNS, rcSocket, rcCreating, rcBuffer, rcExhausted );
+    case ENOMEM:
+        return RC ( rcNS, rcSocket, rcCreating, rcMemory, rcExhausted );
+    }
+
+    return RC ( rcNS, rcSocket, rcCreating, rcError, rcUnknown );
+}
+
+static
+rc_t KSocketHandleBindCall ( int status )
+{
+    switch ( status )
+    {
+    case EACCES:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcUnauthorized );
+    case EADDRINUSE:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcBusy );
+    case EADDRNOTAVAIL:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcNotAvailable);
+    case EBADF:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcInvalid );
+    case EFAULT:
+    case EINVAL:
+        return RC ( rcNS, rcSocket, rcCreating, rcParam, rcInvalid );
+    case ELOOP:
+        return RC ( rcNS, rcSocket, rcCreating, rcError, rcCorrupt );
+    case ENAMETOOLONG:
+        return RC ( rcNS, rcSocket, rcCreating, rcName, rcExcessive );
+    case ENOENT:
+        return RC ( rcNS, rcSocket, rcCreating, rcFile, rcNotFound );
+    case ENOMEM:
+        return RC ( rcNS, rcSocket, rcCreating, rcMemory, rcExhausted );
+    case ENOTDIR:
+        return RC ( rcNS, rcSocket, rcCreating, rcName, rcIncorrect );
+    case ENOTSOCK:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcIncorrect );
+    case EROFS:
+        return RC ( rcNS, rcSocket, rcCreating, rcDirectory, rcReadonly );
+    }
+
+    return RC ( rcNS, rcSocket, rcCreating, rcError, rcUnknown );
+}
+
+static
+rc_t KSocketHandleConnectCall ( int status )
+{
+    switch ( status )
+    {
+    case EACCES:
+    case EPERM:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcUnauthorized );
+    case EADDRINUSE:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcBusy );
+    case EADDRNOTAVAIL:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcNotAvailable );
+    case EAFNOSUPPORT:
+        return RC ( rcNS, rcSocket, rcCreating, rcInterface, rcUnsupported );
+    case EALREADY:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcBusy );
+    case EBADF:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcInvalid );
+    case ECONNREFUSED:
+        return RC ( rcNS, rcSocket, rcCreating, rcConnection, rcFailed );
+    case EFAULT:
+        return RC ( rcNS, rcSocket, rcCreating, rcParam, rcInvalid );
+    case EINPROGRESS:
+        return RC ( rcNS, rcSocket, rcCreating, rcConnection, rcBusy );
+    case EINTR:
+        return 0;
+    case EISCONN:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcBusy );
+    case ENETUNREACH:
+        return RC ( rcNS, rcSocket, rcCreating, rcConnection, rcNotAvailable );
+    case ENOTSOCK:
+        return RC ( rcNS, rcSocket, rcCreating, rcSocket, rcIncorrect );
+    case ETIMEDOUT:
+        return RC ( rcNS, rcSocket, rcCreating, rcTimeout, rcExhausted );
+    }
+
+    return RC ( rcNS, rcSocket, rcCreating, rcError, rcUnknown );
+}
+
+static
+rc_t KSocketHandleAcceptCall ( int status )
+{
+    switch ( status )
+    {
+    case EWOULDBLOCK:
+        return RC ( rcNS, rcSocket, rcOpening, rcData, rcNotAvailable );
+    case EBADF:
+        return RC ( rcNS, rcSocket, rcOpening, rcSocket, rcInvalid );
+    case ECONNABORTED:
+        return RC ( rcNS, rcSocket, rcOpening, rcConnection, rcCanceled );
+    case EFAULT:
+    case EINVAL:
+        return RC ( rcNS, rcSocket, rcOpening, rcData, rcNotAvailable );
+    case EINTR:
+        return 0;
+    case EMFILE:
+    case ENFILE:
+        return RC ( rcNS, rcSocket, rcOpening, rcFileDesc, rcExhausted );
+    case ENOBUFS:
+        return RC ( rcNS, rcSocket, rcOpening, rcBuffer, rcExhausted );
+    case ENOMEM:
+        return RC ( rcNS, rcSocket, rcOpening, rcMemory, rcExhausted );
+    case ENOTSOCK:
+        return RC ( rcNS, rcSocket, rcOpening, rcSocket, rcIncorrect );
+    case EOPNOTSUPP:
+        return RC ( rcNS, rcSocket, rcOpening, rcSocket, rcUnsupported );
+    case EPROTO:
+    case EPERM: /* LINUX ONLY */
+        return RC ( rcNS, rcSocket, rcOpening, rcConstraint, rcViolated );
+    }
+
+    return RC ( rcNS, rcSocket, rcOpening, rcError, rcUnknown );
+}
+
+
+
+
+static rc_t KSocketGetEndpointV6 ( const KSocket * self, KEndPoint * ep, bool remote )
+{
+    rc_t rc = 0;
+    struct sockaddr_in6 addr;
+    socklen_t l = sizeof addr;
+    int res = 0;
+
+    if ( ! remote )
+        res = getsockname( self -> fd, ( struct sockaddr * )&addr, &l );
+    else if ( ! self -> remote_addr_valid )
+        res = getpeername( self -> fd, ( struct sockaddr * )&addr, &l );
+    else
+    {
+        /* the remote part was already recorded through calling accept() */
+        memmove ( ep -> u . ipv6 . addr,
+                 self -> remote_addr . v6 . sin6_addr . s6_addr,
+                 sizeof ( ep -> u . ipv6 . addr ) );
+        ep->u.ipv6.port = ntohs( self -> remote_addr . v6 . sin6_port );
+        ep->type = epIPV6;
+        return 0;
+    }
+
+    if ( res == 0 )
+    {
+        memmove ( ep -> u . ipv6 . addr,
+                 addr . sin6_addr . s6_addr,
+                 sizeof ( ep -> u . ipv6 . addr ) );
+        ep->u.ipv6.port = ntohs( addr . sin6_port );
+        ep->type = epIPV6;
+        return 0;
+    }
+
+    rc = KSocketHandleSocknameCall ( errno );
+
+    ep -> type = epInvalid;
+
+    return rc;
+}
+
+
+static rc_t KSocketGetEndpointV4 ( const KSocket * self, KEndPoint * ep, bool remote )
+{
+    rc_t rc = 0;
+    struct sockaddr_in addr;
+    socklen_t l = sizeof addr;
+    int res = 0;
+
+    if ( ! remote )
+        res = getsockname( self -> fd, ( struct sockaddr * )&addr, &l );
+    else if ( ! self -> remote_addr_valid )
+        res = getpeername( self -> fd, ( struct sockaddr * )&addr, &l );
+    else
+    {
+        /* the remote part was already recorded through calling accept() */
+        addr.sin_addr.s_addr = self -> remote_addr.v4.sin_addr.s_addr;
+        addr.sin_port        = self -> remote_addr.v4.sin_port;
+    }
+
+    if ( res == 0 )
+    {
+        ep->u.ipv4.addr = ntohl( addr.sin_addr.s_addr );
+        ep->u.ipv4.port = ntohs( addr.sin_port );
+        ep->type = epIPV4;
+        return 0;
+    }
+
+    rc = KSocketHandleSocknameCall ( errno );
+
+    ep -> type = epInvalid;
+
+    return rc;
+}
+
+
+static rc_t KSocketGetEndpoint ( const KSocket * self, KEndPoint * ep, bool remote )
+{
+    rc_t rc = 0;
+    if ( ep == NULL )
+        rc = RC ( rcNS, rcSocket, rcEvaluating, rcParam, rcNull );
+    else
+    {
+        ep -> type = epInvalid;
+
+        if ( self == NULL )
+            rc = RC ( rcNS, rcSocket, rcEvaluating, rcSelf, rcNull );
+        else
+        {
+            switch( self->type )
+            {
+            case epIPV4: 
+                rc = KSocketGetEndpointV4( self, ep, remote ); 
+                break;
+            case epIPV6: 
+                rc = KSocketGetEndpointV6( self, ep, remote ); 
+                break;
+            default: 
+                rc = RC ( rcNS, rcSocket, rcEvaluating, rcFunction, rcUnsupported );
+                break;
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KSocketGetRemoteEndpoint ( const KSocket * self, KEndPoint * ep )
+{
+    return KSocketGetEndpoint ( self, ep, true );
+}
+
+
+LIB_EXPORT rc_t CC KSocketGetLocalEndpoint ( const KSocket * self, KEndPoint * ep )
+{
+    return KSocketGetEndpoint ( self, ep, false );
+}
+
+
+static
+rc_t CC KSocketTimedRead ( const KSocket *self,
+    void *buffer, size_t bsize, size_t *num_read, timeout_t *tm )
+{
+    rc_t rc;
+    int revents;
+    
+    assert ( self != NULL );
+    assert ( num_read != NULL );
+
+    DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedRead(%d, %d)...\n", self, bsize, tm == NULL ? -1 : tm -> mS ) );
+    
+    /* wait for socket to become readable */
+    revents = socket_wait ( self -> fd
+                            , POLLIN
+                            | POLLRDNORM
+                            | POLLRDBAND
+                            | POLLPRI
+                            | POLLRDHUP
+                            , tm );
+
+    /* check for error */
+    if ( revents < 0 )
+    {
+        switch ( errno )
+        {
+        case EFAULT:
+        case EINVAL:
+            rc = RC ( rcNS, rcSocket, rcReading, rcParam, rcInvalid );
+            break;
+        case EINTR:
+            rc = RC ( rcNS, rcSocket, rcReading, rcTransfer, rcInterrupted );
+            break;
+        case ENOMEM:
+            rc = RC ( rcNS, rcSocket, rcReading, rcMemory, rcExhausted );
+            break;
+        default:
+            rc = RC ( rcNS, rcSocket, rcReading, rcError, rcUnknown );
+            break;
+        }
+
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedRead socket_wait returned '%!'\n", self, errno ) );
+        return rc;
+    }
+
+    /* no error in errno - check for other potential errors */
+    if ( ( revents & ( POLLERR | POLLNVAL ) ) != 0 )
+    {
+        if ( ( revents & POLLERR ) != 0)
+        {
+            int optval = 0;
+            socklen_t optlen = sizeof optval;
+            if ( ( getsockopt ( self -> fd, SOL_SOCKET, SO_ERROR, & optval, & optlen ) == 0 ) && optval > 0 )
+            {
+                errno = optval;
+                DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedRead socket_wait/getsockopt returned '%!'\n", 
+                                                            self, optval ) );
+                switch ( errno )
+                {
+                case EFAULT:
+                case EINVAL:
+                    rc = RC ( rcNS, rcSocket, rcReading, rcParam, rcInvalid );
+                    break;
+                case EINTR:
+                    rc = RC ( rcNS, rcSocket, rcReading, rcTransfer, rcInterrupted );
+                    break;
+                case ENOMEM:
+                    rc = RC ( rcNS, rcSocket, rcReading, rcMemory, rcExhausted );
+                    break;
+                default:
+                    rc = RC ( rcNS, rcSocket, rcReading, rcError, rcUnknown );
+                    break;
+                }
+
+                return rc;
+            }
+        }
+
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedRead socket_wait returned POLLERR | POLLNVAL\n", self ) );
+        return RC ( rcNS, rcSocket, rcReading, rcError, rcUnknown );
+    }
+
+    /* check for read availability */
+    if ( ( revents & ( POLLRDNORM | POLLRDBAND ) ) != 0 )
+    {
+        ssize_t count = recv ( self -> fd, buffer, bsize, 0 );
+        if ( count >= 0 )
+        {
+            * num_read = count;
+            return 0;
+        }
+
+        switch ( errno )
+        {
+        case EWOULDBLOCK:
+            rc = RC ( rcNS, rcSocket, rcReading, rcData, rcNotAvailable );
+            break;
+        case EBADF:
+            rc = RC ( rcNS, rcSocket, rcReading, rcSocket, rcInvalid );
+            break;
+        case ECONNREFUSED:
+            rc = RC ( rcNS, rcSocket, rcReading, rcConnection, rcFailed );
+            break;
+        case EFAULT:
+        case EINVAL:
+            rc = RC ( rcNS, rcSocket, rcReading, rcParam, rcInvalid );
+            break;
+        case EINTR:
+            rc = RC ( rcNS, rcSocket, rcReading, rcTransfer, rcInterrupted );
+            break;
+        case ENOMEM:
+            rc = RC ( rcNS, rcSocket, rcReading, rcMemory, rcExhausted );
+            break;
+        case ENOTCONN:
+            rc = RC ( rcNS, rcSocket, rcReading, rcConnection, rcInvalid );
+            break;
+        case ENOTSOCK:
+            rc = RC ( rcNS, rcSocket, rcReading, rcSocket, rcIncorrect );
+            break;
+        default:
+            rc = RC ( rcNS, rcSocket, rcReading, rcError, rcUnknown );
+            break;
+        }
+
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedRead recv returned count %d\n", self, count ) );
+        return rc;
+    }
+
+    /* check for broken connection */
+    if ( ( revents & ( POLLHUP | POLLRDHUP ) ) != 0 )
+    {
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedRead broken connection\n", self ) );
+        * num_read = 0;
+        return 0;
+    }
+
+    /* anything else in revents is an error */
+    if ( ( revents & ~ POLLIN ) != 0 && errno != 0 )
+    {
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedRead error '%!'\n", self, errno ) );
+        return RC ( rcNS, rcSocket, rcReading, rcError, rcUnknown );
+    }
+
+    /* finally, call this a timeout */
+    DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedRead timeout\n", self ) );
+    return RC ( rcNS, rcStream, rcReading, rcTimeout, rcExhausted );
+}
+
+static
+rc_t CC KSocketRead ( const KSocket *self,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    timeout_t tm;
+    assert ( self != NULL );
+
+    if ( self -> read_timeout < 0 )
+        return KSocketTimedRead ( self, buffer, bsize, num_read, NULL );
+
+    TimeoutInit ( & tm, self -> read_timeout );
+    return KSocketTimedRead ( self, buffer, bsize, num_read, & tm );
+}
+
+static
+rc_t CC KSocketTimedWrite ( KSocket *self,
+    const void *buffer, size_t bsize, size_t *num_writ, timeout_t *tm )
+{
+    rc_t rc;
+    int revents;
+    ssize_t count;
+
+    assert ( self != NULL );
+    assert ( buffer != NULL );
+    assert ( bsize != 0 );
+    assert ( num_writ != NULL );
+
+    DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedWrite(%d, %d)...\n", self, bsize, tm == NULL ? -1 : tm -> mS ) );
+
+    /* wait for socket to become writable */
+    revents = socket_wait ( self -> fd
+                            , POLLOUT
+                            | POLLWRNORM
+                            | POLLWRBAND
+                            , tm );
+
+    /* check for error */
+    if ( revents < 0 )
+    {
+        switch ( errno )
+        {
+        case EFAULT:
+        case EINVAL:
+            rc = RC ( rcNS, rcSocket, rcWriting, rcParam, rcInvalid );
+            break;
+        case EINTR:
+            rc = RC ( rcNS, rcSocket, rcWriting, rcTransfer, rcInterrupted );
+            break;
+        case ENOMEM:
+            rc = RC ( rcNS, rcSocket, rcWriting, rcMemory, rcExhausted );
+            break;
+        default:
+            rc = RC ( rcNS, rcSocket, rcWriting, rcError, rcUnknown );
+            break;
+        }
+
+        assert ( rc != 0 );
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedWrite socket_wait returned '%s'\n", self, strerror ( errno ) ) );
+        return rc;
+    }
+
+    if ( ( revents & ( POLLERR | POLLNVAL ) ) != 0 )
+    {
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedWrite socket_wait returned POLLERR | POLLNVAL\n", self ) );
+        return RC ( rcNS, rcStream, rcWriting, rcNoObj, rcUnknown );
+    }
+
+    /* check for broken connection */
+    if ( ( revents & POLLHUP ) != 0 )
+    {
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: POLLHUP received\n", self ) );
+        * num_writ = 0;
+        return  RC ( rcNS, rcFile, rcWriting, rcTransfer, rcIncomplete );
+    }
+
+    /* check for ability to send */
+    if ( ( revents & ( POLLWRNORM | POLLWRBAND ) ) != 0 )
+    {
+        count = send ( self -> fd, buffer, bsize, 0 );
+        if ( count < 0 )
+        {
+            switch ( errno )
+            {
+            case EACCES:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcSocket, rcUnauthorized);
+                break;
+            case EWOULDBLOCK:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcData, rcNotAvailable );
+                break;
+            case EBADF:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcSocket, rcInvalid );
+                break;
+            case ECONNRESET:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcConnection, rcCanceled );
+                break;
+            case EINTR:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcTransfer, rcInterrupted );
+                break;
+            case EFAULT:
+            case EINVAL:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcParam, rcInvalid );
+                break;
+            case EMSGSIZE:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcData, rcExcessive );
+                break;
+            case ENOBUFS:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcBuffer, rcExhausted );
+                break;
+            case ENOMEM:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcMemory, rcExhausted );
+                break;
+            case ENOTCONN:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcConnection, rcInvalid );
+                break;
+            case ENOTSOCK:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcSocket, rcIncorrect );
+                break;
+            case EOPNOTSUPP:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcParam, rcIncorrect );
+                break;
+            case EPIPE:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcConnection, rcInterrupted );
+                break;
+            default:
+                rc = RC ( rcNS, rcSocket, rcWriting, rcError, rcUnknown );
+                break;
+            }
+
+            DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedWrite recv returned count %d\n", self, count ) );
+            return rc;
+        }
+
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: %d bytes written\n", self, count ) );
+        * num_writ = count;
+        return 0;
+    }
+
+    /* anything else in revents is an error */
+    if ( ( revents & ~ POLLOUT ) != 0 && errno != 0 )
+    {
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedWrite error '%s'\n", self, strerror ( errno ) ) );
+        return RC ( rcNS, rcSocket, rcWriting, rcError, rcUnknown );
+    }
+
+    /* finally, call this a timeout */
+    DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketTimedWrite timeout\n", self ) );
+    return RC ( rcNS, rcStream, rcWriting, rcTimeout, rcExhausted );
+}
+
+static
+rc_t CC KSocketWrite ( KSocket *self,
+    const void *buffer, size_t bsize, size_t *num_writ )
+{
+    timeout_t tm;
+    assert ( self != NULL );
+
+    if ( self -> write_timeout < 0 )
+        return KSocketTimedWrite ( self, buffer, bsize, num_writ, NULL );
+
+    TimeoutInit ( & tm, self -> write_timeout );
+    return KSocketTimedWrite ( self, buffer, bsize, num_writ, & tm );
+}
+
+static KStream_vt_v1 vtKSocket =
+{
+    1, 1,
+    KSocketWhack,
+    KSocketRead,
+    KSocketWrite,
+    KSocketTimedRead,
+    KSocketTimedWrite
+};
+
+/* for testing */
+void KStreamForceSocketClose(const struct KStream *self) {
+    assert(self);
+    close(((KSocket*)self)->fd);
+}
+
+static
+rc_t KSocketMakePath ( const char * name, char * buf, size_t buf_size )
+{
+    size_t num_writ;
+#if 0
+    rc_t rc;
+    struct passwd* pwd;
+    errno = 0; /* man page claims errno should be set to 0 before call if wanting to check after */
+    pwd = getpwuid ( geteuid () );
+    if ( pwd == NULL )
+    {
+        /* check the context 'rcAccessing' */
+        switch ( errno )
+        {
+        case EBADF:
+            rc = RC ( rcNS, rcFile, rcAccessing, rcFormat, rcInvalid );
+            break;
+        case EINTR:
+            rc = RC ( rcNS, rcFile, rcAccessing, rcConnection, rcInterrupted );
+            break;
+        case EIO:
+            rc = RC ( rcNS, rcFile, rcAccessing, rcNoObj, rcUndefined);
+            break;
+        case EMFILE:
+        case ENFILE:
+            rc = RC ( rcNS, rcFile, rcAccessing, rcFileDesc, rcExhausted );
+            break;
+        case ENOMEM:
+            rc = RC ( rcNS, rcFile, rcAccessing, rcMemory, rcExhausted );
+            break;
+        case ERANGE:
+            rc = RC ( rcNS, rcFile, rcAccessing, rcBuffer, rcInsufficient );
+            break;
+        default:
+            rc = RC ( rcNS, rcFile, rcAccessing, rcError, rcUnknown );
+            break;
+        }
+
+        return rc;
+    }
+
+    return string_printf ( buf, buf_size, & num_writ, "%s/.ncbi/%s", pwd -> pw_dir, name );
+#else
+    const char *HOME = getenv ( "HOME" );
+    if ( HOME == NULL )
+        return RC ( rcNS, rcProcess, rcAccessing, rcPath, rcNotFound );
+
+    return string_printf ( buf, buf_size, & num_writ, "%s/.ncbi/%s", HOME, name );
+#endif
+}
+
+static
+rc_t KSocketConnectIPv4 ( KSocket *self, const KEndPoint *from, const KEndPoint *to )
+{
+    rc_t rc = 0;
+
+    /* create the OS socket */
+    self -> fd = socket ( AF_INET, SOCK_STREAM, 0 );
+    if ( self -> fd < 0 )
+        rc = KSocketHandleSocketCall ( errno );
+    else
+    {
+        /* disable nagle algorithm */
+        int flag = 1;
+        setsockopt ( self -> fd, IPPROTO_TCP, TCP_NODELAY, ( char* ) & flag, sizeof flag );
+
+        struct sockaddr_in ss;
+        memset ( & ss, 0, sizeof ss );
+        ss . sin_family = AF_INET;
+        if ( from != NULL )
+        {
+            ss . sin_addr . s_addr = htonl ( from -> u . ipv4 . addr );
+            ss . sin_port = htons ( from -> u . ipv4 . port );
+        }
+
+        /* bind */
+        if ( bind ( self -> fd, ( struct sockaddr* ) & ss, sizeof ss ) != 0 )
+            rc = KSocketHandleBindCall ( errno );
+                
+        if ( rc == 0 )
+        {
+            ss . sin_port = htons ( to -> u . ipv4 . port );
+            ss . sin_addr . s_addr = htonl ( to -> u . ipv4 . addr );
+
+            /* connect */
+            if ( connect ( self -> fd, ( struct sockaddr* ) & ss, sizeof ss ) != 0 )
+#warning "have an issue with EINTR here and other places"
+                rc = KSocketHandleConnectCall ( errno );
+            else
+            {
+                /* set non-blocking mode */
+                flag = fcntl ( self -> fd, F_GETFL );
+                fcntl ( self -> fd, F_SETFL, flag | O_NONBLOCK );
+                return 0;
+            }
+        }
+
+        /* dump socket */
+        close ( self -> fd );
+        self -> fd = -1;
+    }
+
+    DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketConnectIPv4 failed - %R\n", self, rc ) );
+
+    return rc;
+}
+
+
+static
+rc_t KSocketConnectIPv6 ( KSocket *self, const KEndPoint *from, const KEndPoint *to )
+{
+    rc_t rc = 0;
+    struct sockaddr_in6 ss_from, ss_to;
+
+    memset ( & ss_from, 0, sizeof ss_from );
+    if ( from != NULL )
+    {
+        ss_from . sin6_family = AF_INET6;
+        memmove ( ss_from . sin6_addr . s6_addr,
+                 from -> u . ipv6 . addr,
+                 sizeof ( from -> u . ipv6 . addr ) );
+        ss_from . sin6_port = htons ( from -> u . ipv6 . port );
+    }
+
+    memset ( & ss_to, 0, sizeof ss_to );
+    ss_to . sin6_family = AF_INET6;
+    memmove ( ss_to . sin6_addr . s6_addr,
+             to -> u . ipv6 . addr,
+             sizeof ( to -> u . ipv6 . addr ) );
+    ss_to . sin6_port = htons ( to -> u . ipv6 . port );
+
+    /* create the OS socket */
+    self -> fd = socket ( AF_INET6, SOCK_STREAM, 0 );
+    if ( self -> fd < 0 )
+        rc = KSocketHandleSocketCall ( errno );
+    else
+    {
+        /* disable nagle algorithm */
+        int flag = 1;
+        setsockopt ( self -> fd, IPPROTO_TCP, TCP_NODELAY, ( char* ) & flag, sizeof flag );
+
+        /* bind */
+        if ( from != NULL && bind ( self -> fd, ( struct sockaddr* ) & ss_from, sizeof ss_from ) != 0 )
+            rc = KSocketHandleBindCall ( errno );
+
+        if ( rc == 0 )
+        {
+            /* connect */
+            if ( connect ( self -> fd, ( struct sockaddr* ) & ss_to, sizeof ss_to ) != 0 )
+                rc = KSocketHandleConnectCall ( errno );
+            else
+            {
+                /* set non-blocking mode */
+                flag = fcntl ( self -> fd, F_GETFL );
+                fcntl ( self -> fd, F_SETFL, flag | O_NONBLOCK );
+                return 0;
+            }
+        }
+
+        /* dump socket */
+        close ( self -> fd );
+        self -> fd = -1;
+    }
+    
+    DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketConnectIPv6 failed - %R\n", self, rc ) );
+
+    return rc;
+}
+
+
+static
+rc_t KSocketConnectIPC ( KSocket *self, const KEndPoint *to )
+{
+    rc_t rc = 0;
+    struct sockaddr_un ss_to;
+
+    memset ( & ss_to, 0, sizeof ss_to );
+    ss_to . sun_family = AF_UNIX;
+    rc = KSocketMakePath ( to -> u . ipc_name, ss_to . sun_path, sizeof ss_to . sun_path );
+
+    /* create the OS socket */
+    self -> fd = socket ( AF_UNIX, SOCK_STREAM, 0 );
+    if ( self -> fd < 0 )
+        rc = KSocketHandleSocketCall ( errno );
+    else
+    {
+        /* connect */
+        if ( connect ( self -> fd, ( struct sockaddr* ) & ss_to, sizeof ss_to ) != 0 )
+            rc = KSocketHandleConnectCall ( errno );
+        else
+            return 0;
+            
+        /* dump socket */
+        close ( self -> fd );
+        self -> fd = -1;
+    }
+
+    DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET), ( "%p: KSocketConnectIPC failed - %R\n", self, rc ) );
+
+    return rc;
+ }
+
+KNS_EXTERN rc_t CC KNSManagerMakeRetryTimedConnection ( struct KNSManager const * self,
+    struct KSocket ** out, timeout_t * retryTimeout, int32_t readMillis, int32_t writeMillis,
+    struct KEndPoint const * from, struct KEndPoint const * to )
+{
+    rc_t rc;
+
+    if ( out == NULL )
+        rc = RC ( rcNS, rcStream, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcStream, rcConstructing, rcSelf, rcNull );
+        else if ( retryTimeout == NULL || to == NULL )
+            rc = RC ( rcNS, rcStream, rcConstructing, rcParam, rcNull );
+        else if ( from != NULL && from -> type != to -> type )
+            rc = RC ( rcNS, rcStream, rcConstructing, rcParam, rcIncorrect );
+        else
+        {
+            KSocket *conn = calloc ( 1, sizeof * conn );
+            if ( conn == NULL )
+                rc = RC ( rcNS, rcStream, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                conn -> fd = -1;
+                conn -> read_timeout = readMillis;
+                conn -> write_timeout = writeMillis;
+
+                rc = KStreamInit ( & conn -> dad, ( const KStream_vt* ) & vtKSocket,
+                                   "KSocket", "", true, true );
+
+                /* prepare the timeout */
+                if ( rc == 0 )
+                    rc = TimeoutPrepare ( retryTimeout );
+
+                if ( rc == 0 )
+                {
+                    uint32_t retry;
+
+                    switch ( to -> type )
+                    {
+
+                    /* ensure the type is correct */
+                    case epIPV4:
+                    case epIPV6:
+                    case epIPC:
+
+                        /* a retry loop - retry upon a schedule for the alloted time */
+                        for ( retry = 0; ; ++ retry )
+                        {
+                            uint32_t remaining, delay;
+
+                            /* try to connect using appropriate protocol */
+                            conn -> type = to -> type;
+                            switch ( to -> type )
+                            {
+                            case epIPV4:
+                                rc = KSocketConnectIPv4 ( conn, from, to );
+                                break;
+
+                            case epIPV6:
+                                rc = KSocketConnectIPv6 ( conn, from, to );
+                                break;
+
+                            case epIPC:
+                                rc = KSocketConnectIPC ( conn, to );
+                                break;
+                            }
+
+                            /* if connection was successful, return socket */
+                            if ( rc == 0 )
+                            {
+                                * out = conn;
+                                return 0;
+                            }
+
+                            /* check time remaining on timeout ( if any ) */
+                            remaining = TimeoutRemaining ( retryTimeout );
+
+                            /* break out of loop if no time left */
+                            if ( remaining == 0 )
+                                break;
+
+                            /* apply delay schedule */
+                            switch ( retry )
+                            {
+                            case 0:
+                                /* try immediately */
+                                continue;
+                            case 1:
+                            case 2:
+                            case 3:
+                                /* wait for 100mS between tries */
+                                delay = 100;
+                                break;
+                            default:
+                                /* wait for 250mS between tries */
+                                delay = 250;
+                            }
+
+                            /* never wait for more than the remaining timeout */
+                            if ( delay > remaining )
+                                delay = remaining;
+
+                            KSleepMs ( delay );
+                        }
+
+                        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_SOCKET),
+                               ( "%p: KSocketConnect timed out\n", self ) ); 
+                       break;
+
+                    default:
+                        rc = RC ( rcNS, rcStream, rcConstructing, rcParam, rcIncorrect );
+                    }
+                }
+
+                free ( conn );
+            }
+        }
+
+        * out = NULL;
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KListener
+ */
+static
+rc_t KNSManagerMakeIPv6Listener ( KSocket *listener, const KEndPoint * ep )
+{
+    rc_t rc;
+
+    listener -> fd = socket ( AF_INET6, SOCK_STREAM, 0 );
+    if ( listener -> fd < 0 )
+        rc = KSocketHandleSocketCall ( errno );
+    else
+    {
+        struct sockaddr_in6 ss;
+
+        int on = 1;
+        setsockopt ( listener -> fd, SOL_SOCKET, SO_REUSEADDR, ( char* ) & on, sizeof on );
+
+        memset ( & ss, 0, sizeof ss );
+        ss . sin6_family = AF_INET6;
+
+        memmove ( ss . sin6_addr . s6_addr,
+                 ep -> u . ipv6 . addr,
+                 sizeof ( ep -> u . ipv6 . addr ) );
+
+        ss . sin6_port = htons ( ep -> u . ipv6 . port );
+
+        if ( bind ( listener -> fd, ( struct sockaddr* ) & ss, sizeof ss ) != 0 )
+           rc = KSocketHandleBindCall ( errno );
+        else
+            return 0;
+        
+        close ( listener -> fd );
+        listener -> fd = -1;
+    }
+
+    return rc;
+}
+
+
+static
+rc_t KNSManagerMakeIPv4Listener ( KSocket *listener, const KEndPoint * ep )
+{
+    rc_t rc;
+
+    listener -> fd = socket ( AF_INET, SOCK_STREAM, 0 );
+    if ( listener -> fd < 0 )
+        rc = KSocketHandleSocketCall ( errno );
+    else
+    {
+        struct sockaddr_in ss;
+
+        int on = 1;
+        setsockopt ( listener -> fd, SOL_SOCKET, SO_REUSEADDR, ( char* ) & on, sizeof on );
+
+        memset ( & ss, 0, sizeof ss );
+        ss . sin_family = AF_INET;
+        ss . sin_addr . s_addr = htonl ( ep -> u . ipv4 . addr );
+        ss . sin_port = htons ( ep -> u . ipv4 . port );
+
+        if ( bind ( listener -> fd, ( struct sockaddr* ) & ss, sizeof ss ) != 0 )
+            rc = KSocketHandleBindCall ( errno );
+        else
+            return 0;
+
+        close ( listener -> fd );
+        listener -> fd = -1;
+    }
+
+    return rc;
+}
+
+static
+rc_t KNSManagerMakeIPCListener ( KSocket *listener, const KEndPoint * ep )
+{
+    rc_t rc;
+
+    listener -> fd = socket ( AF_UNIX, SOCK_STREAM, 0 );
+    if ( listener -> fd < 0 )
+        rc = KSocketHandleSocketCall ( errno );
+    else
+    {
+        struct sockaddr_un ss;
+        memset ( & ss, 0, sizeof ss );
+        ss.sun_family = AF_UNIX;
+        rc = KSocketMakePath ( ep -> u. ipc_name, ss . sun_path, sizeof ss . sun_path );
+        if ( rc == 0 )
+        {
+            char * path = string_dup ( ss . sun_path, string_measure ( ss . sun_path, NULL ) );
+            if ( path == NULL )
+                rc = RC ( rcNS, rcSocket, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                unlink ( ss . sun_path );
+                if ( bind ( listener -> fd, ( struct sockaddr* ) & ss, sizeof ss ) != 0 )
+                    rc = KSocketHandleBindCall ( errno );
+                else
+                {
+                    listener -> path = path;
+                    return 0;
+                }
+
+                free ( path );
+            }
+        }
+
+        close ( listener -> fd );
+        listener -> fd = -1;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KNSManagerMakeListener ( const KNSManager *self,
+    KListener ** out, const KEndPoint * ep )
+{   
+    rc_t rc;
+
+    if ( out == NULL )
+        rc = RC ( rcNS, rcSocket, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcSocket, rcConstructing, rcSelf, rcNull );
+        else if ( ep == NULL )
+            rc = RC ( rcNS, rcSocket, rcConstructing, rcParam, rcNull );
+        else
+        {
+            KSocket *listener = calloc ( 1, sizeof * listener );
+            if ( listener == NULL )
+                rc = RC ( rcNS, rcSocket, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                listener -> fd = -1;
+
+                /* pass these along to accepted sockets */
+                listener -> read_timeout = self -> conn_read_timeout;
+                listener -> write_timeout = self -> conn_write_timeout;
+
+                rc = KStreamInit ( & listener -> dad, ( const KStream_vt* ) & vtKSocket,
+                                   "KSocket", "", true, true );
+                if ( rc == 0 )
+                {
+                    listener -> type = ep -> type;
+                    switch ( ep -> type )
+                    {
+                    case epIPV6:
+                        rc = KNSManagerMakeIPv6Listener ( listener, ep );
+                        break;
+
+                    case epIPV4:
+                        rc = KNSManagerMakeIPv4Listener ( listener, ep );
+                        break;
+
+                    case epIPC:
+                        rc = KNSManagerMakeIPCListener ( listener, ep );
+                        break;
+
+                    default:
+                        rc = RC ( rcNS, rcSocket, rcConstructing, rcParam, rcIncorrect );
+                    }
+
+                    if ( rc == 0 )
+                    {
+                        /* the classic 5 connection queue... ? */
+                        if ( listen ( listener -> fd, 5 ) == 0 )
+                        {
+                            * out = ( KListener* ) listener;
+                            return 0;
+                        }
+                        else
+                        {
+                            switch ( errno )
+                            {
+                            case EADDRINUSE:
+                                rc = RC ( rcNS, rcSocket, rcCreating, rcSocket, rcBusy );
+                                break;
+                            case EBADF:
+                                rc = RC ( rcNS, rcSocket, rcCreating, rcSocket, rcInvalid );
+                                break;
+                            case ENOTSOCK:
+                                rc = RC ( rcNS, rcSocket, rcCreating, rcSocket, rcIncorrect );
+                                break;
+                            case EOPNOTSUPP:
+                                rc = RC ( rcNS, rcSocket, rcCreating, rcInterface, rcUnsupported );
+                                break;
+                            default:
+                                rc = RC ( rcNS, rcSocket, rcCreating, rcError, rcUnknown );
+                                break;
+                            }
+                        }
+                        
+                        if ( listener -> path != NULL )
+                            free ( ( void* ) listener -> path );
+                    }
+                }
+
+                free ( listener );
+            }
+        }
+
+        * out = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KListenerAddRef( const KListener *self )
+{
+    return KSocketAddRef ( ( const KSocket* ) self );
+}
+
+LIB_EXPORT rc_t CC KListenerRelease ( const KListener *self )
+{
+    return KSocketRelease ( ( const KSocket* ) self );
+}
+
+static
+rc_t KListenerAcceptIPv4 ( KSocket *self, KSocket *conn )
+{
+    socklen_t len = sizeof conn->remote_addr.v4;
+    conn -> fd = accept ( self -> fd, ( struct sockaddr * ) & conn->remote_addr.v4, & len );
+    if ( conn -> fd < 0 )
+        return KSocketHandleAcceptCall ( errno );
+
+    if ( len > sizeof conn->remote_addr.v4 )
+        return RC ( rcNS, rcConnection, rcWaiting, rcBuffer, rcInsufficient );
+
+    return 0;
+}
+
+
+static
+rc_t KListenerAcceptIPv6 ( KSocket *self, KSocket *conn )
+{
+    socklen_t len = sizeof conn->remote_addr.v6;
+    conn -> fd = accept ( self -> fd, ( struct sockaddr * ) & conn->remote_addr.v6, & len );
+    if ( conn -> fd < 0 )
+        return KSocketHandleAcceptCall ( errno );
+
+    if ( len > sizeof conn->remote_addr.v6 )
+        return RC ( rcNS, rcConnection, rcWaiting, rcBuffer, rcInsufficient );
+
+    return 0;
+}
+
+static
+rc_t KListenerAcceptIPC ( KSocket *self, KSocket *conn )
+{
+    struct sockaddr_un remote;
+    socklen_t len = sizeof remote;
+    conn -> fd = accept ( self -> fd, ( struct sockaddr* ) & remote, & len );
+    if ( conn -> fd < 0 )
+        return KSocketHandleAcceptCall ( errno );
+
+    if ( len > sizeof remote )
+        return RC ( rcNS, rcConnection, rcWaiting, rcBuffer, rcInsufficient );
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KListenerAccept ( KListener *iself, struct KSocket **out )
+{
+    rc_t rc;
+    KSocket * self = ( KSocket* ) iself;
+
+
+    if ( out == NULL )
+        rc = RC ( rcNS, rcConnection, rcWaiting, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcNS, rcConnection, rcWaiting, rcSelf, rcNull);
+        else
+        {
+            KSocket tmp_socket; /* we only need to populate fd and remote_addr */
+            tmp_socket . fd = -1;
+
+            switch ( self -> type )
+            {
+            case epIPV6:
+                rc = KListenerAcceptIPv6 ( self, & tmp_socket );
+                break;
+
+            case epIPV4:
+                rc = KListenerAcceptIPv4 ( self, & tmp_socket );
+                break;
+
+            case epIPC:
+                rc = KListenerAcceptIPC ( self, & tmp_socket );
+                break;
+
+            default:
+                rc = RC ( rcNS, rcSocket, rcConstructing, rcSelf, rcCorrupt );
+            }
+
+            if ( rc == 0 )
+            {
+                KSocket * new_socket = calloc ( 1, sizeof * new_socket );
+                if ( new_socket == NULL )
+                    rc = RC ( rcNS, rcConnection, rcWaiting, rcMemory, rcExhausted );
+                else
+                {
+                    new_socket -> fd                = tmp_socket . fd;
+                    new_socket -> remote_addr       = tmp_socket . remote_addr;
+                    new_socket -> read_timeout      = self -> read_timeout;
+                    new_socket -> write_timeout     = self -> write_timeout;
+                    new_socket -> remote_addr_valid = true;
+
+                    rc = KStreamInit ( & new_socket -> dad, ( const KStream_vt* ) & vtKSocket,
+                                       "KSocket", "", true, true );
+                    if ( rc == 0 )
+                    {
+                        * out = new_socket;
+                        return 0;
+                    }
+                    
+                    free ( new_socket );
+                }
+            }
+        }
+
+        * out = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/kns/unix/sysstream.c b/libs/kns/unix/sysstream.c
new file mode 100644
index 0000000..de03f29
--- /dev/null
+++ b/libs/kns/unix/sysstream.c
@@ -0,0 +1,251 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+#define KSTREAM_IMPL KStdIOStream
+typedef struct KStdIOStream KStdIOStream;
+
+#include <kns/extern.h>
+#include <kns/stream.h>
+#include <kns/impl.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+
+#include "stream-priv.h"
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KStdIOStream
+ *  a virtual stream
+ */
+struct KStdIOStream
+{
+    KStream dad;
+    int fd;
+};
+
+static
+rc_t CC KStdIOStreamWhack ( KStdIOStream *self )
+{
+    /* we don't close self->fd because we did not open it */
+    free ( self );
+    return 0;
+}
+
+static
+rc_t CC KStdIOStreamRead ( const KStdIOStream *self,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    rc_t rc;
+    assert ( self != NULL );
+
+    while ( 1 )
+    {
+        int lerrno;
+
+        ssize_t count = read ( self -> fd, buffer, bsize );
+
+        if ( count < 0 ) switch ( lerrno = errno )
+        {
+        case ENOSPC:
+            rc = RC ( rcNS, rcStream, rcReading, rcStorage, rcExhausted );
+            LOGERR (klogSys, rc, "system device full error");
+            return rc;
+
+        case EINTR:
+            continue;
+
+        case EFBIG:
+            rc = RC ( rcNS, rcStream, rcReading, rcStream, rcExcessive );
+            LOGERR (klogErr, rc, "system file too big error");
+            return rc;
+
+        case EIO:
+            rc = RC ( rcNS, rcStream, rcReading, rcTransfer, rcUnknown );
+            LOGERR (klogErr, rc, "system I/O error - broken pipe");
+            return rc;
+            
+        case EBADF:
+            rc = RC ( rcNS, rcStream, rcReading, rcFileDesc, rcInvalid );
+            PLOGERR (klogInt,
+                     (klogInt, rc, "system bad file descriptor error fd=$(F)",
+                      "F=%d", lerrno, self->fd));
+            return rc;
+
+        case EINVAL:
+            rc = RC ( rcNS, rcStream, rcReading, rcParam, rcInvalid );
+            LOGERR (klogInt, rc, "system invalid argument error");
+            return rc;
+
+        default:
+            rc = RC ( rcNS, rcStream, rcReading, rcNoObj, rcUnknown );
+            PLOGERR (klogErr,
+                     (klogErr, rc, "unknown system error '$(S)($(E))'",
+                      "S=%!,E=%d", lerrno, lerrno));
+            return rc;
+        }
+
+        assert ( num_read != NULL );
+        * num_read = count;
+        break;
+    }
+
+    return 0;
+}
+
+static
+rc_t CC KStdIOStreamWrite ( KStdIOStream *self,
+    const void *buffer, size_t size, size_t *num_writ )
+{
+    rc_t rc;
+    assert ( self != NULL );
+
+    while ( 1 )
+    {
+        int lerrno;
+
+        ssize_t count = write ( self -> fd, buffer, size );
+
+        if ( count < 0 ) switch ( lerrno = errno )
+        {
+        case ENOSPC:
+            rc = RC ( rcNS, rcStream, rcWriting, rcStorage, rcExhausted );
+            LOGERR (klogSys, rc, "system device full error");
+            return rc;
+
+        case EINTR:
+            continue;
+
+        case EFBIG:
+            rc = RC ( rcNS, rcStream, rcWriting, rcStream, rcExcessive );
+            LOGERR (klogErr, rc, "system file too big error");
+            return rc;
+
+        case EIO:
+            rc = RC ( rcNS, rcStream, rcWriting, rcTransfer, rcUnknown );
+            LOGERR (klogErr, rc, "system I/O error - broken pipe");
+            return rc;
+            
+        case EBADF:
+            rc = RC ( rcNS, rcStream, rcWriting, rcFileDesc, rcInvalid );
+            PLOGERR (klogInt,
+                     (klogInt, rc, "system bad file descriptor error fd=$(F)",
+                      "F=%d", lerrno, self->fd));
+            return rc;
+
+        case EINVAL:
+            rc = RC ( rcNS, rcStream, rcWriting, rcParam, rcInvalid );
+            LOGERR (klogInt, rc, "system invalid argument error");
+            return rc;
+
+        default:
+            rc = RC ( rcNS, rcStream, rcWriting, rcNoObj, rcUnknown );
+            PLOGERR (klogErr,
+                     (klogErr, rc, "unknown system error '$(S)($(E))'",
+                      "S=%!,E=%d", lerrno, lerrno));
+            return rc;
+        }
+
+        assert ( num_writ != NULL );
+        * num_writ = count;
+        break;
+    }
+
+    return 0;
+}
+
+static KStream_vt_v1 vtKStdIOStream =
+{
+    1, 0,
+    KStdIOStreamWhack,
+    KStdIOStreamRead,
+    KStdIOStreamWrite
+};
+
+
+static
+rc_t KStdIOStreamMake ( KStream **sp, int fd, const char *strname,
+    bool read_enabled, bool write_enabled )
+{
+    rc_t rc;
+
+    if ( sp == NULL )
+        rc = RC ( rcNS, rcStream, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KStdIOStream *s = calloc ( sizeof *s, 1 );
+        if ( s == NULL )
+            rc = RC ( rcNS, rcStream, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KStreamInit ( & s -> dad, ( const KStream_vt* ) & vtKStdIOStream,
+                               "KStdIOStream", strname, read_enabled, write_enabled );
+            if ( rc == 0 )
+            {
+                s -> fd = fd;
+                * sp = & s -> dad;
+                return 0;
+            }
+
+            free ( s );
+        }
+
+        * sp = NULL;
+    }
+
+    return rc;
+}
+
+/* MakeStdIn
+ *  creates a read-only stream on stdin
+ */
+LIB_EXPORT rc_t CC KStreamMakeStdIn ( const KStream **std_in )
+{
+    return KStdIOStreamMake ( ( KStream** ) std_in, 0, "stdin", true, false );
+}
+
+/* MakeStdOut
+ * MakeStdErr
+ *  creates a write-only stream on stdout or stderr
+ */
+LIB_EXPORT rc_t CC KStreamMakeStdOut ( KStream **std_out )
+{
+    return KStdIOStreamMake ( std_out, 1, "stdout", false, true );
+}
+
+LIB_EXPORT rc_t CC KStreamMakeStdErr ( KStream **std_err )
+{
+    return KStdIOStreamMake ( std_err, 2, "stderr", false, true );
+}
diff --git a/libs/kns/url-fetcher-curl.c b/libs/kns/url-fetcher-curl.c
new file mode 100644
index 0000000..e5159f2
--- /dev/null
+++ b/libs/kns/url-fetcher-curl.c
@@ -0,0 +1,255 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kns/extern.h>
+#include <klib/rc.h>
+#include <kns/manager.h>
+#include <kns/url-fetcher.h>
+
+/* IMPORTANT define this before including the *-impl.h !!!! */
+#define KURL_FETCHER_IMPL KUrlFetcherCurl
+#include "url-fetcher-impl.h"
+
+#include "kns_mgr_priv.h"
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+/*
+#include <curl/curl.h>
+#include <curl/types.h>
+#include <curl/easy.h>
+*/
+
+/*--------------------------------------------------------------------------
+ * KVectorNamelist ... a generic Namelist based on a Vector
+ */
+struct KUrlFetcherCurl
+{
+    KUrlFetcher dad;
+
+    struct KNSManager *kns_mgr;
+    CURL *curl_handle;
+
+    /* this buffer is passed in from read() to the callback 
+       it is owned by the caller not this class */
+    char *buff;
+    size_t buffsize;
+    size_t in_buff;
+    
+    /* this is the spill-over buffer, used by the callback
+       if the caller-provided buffer is too small */
+    char *spill_over_buff;
+    size_t spill_over_buffsize;
+};
+
+/* implementation of the the virtual KUrlFetcher-Interface for curl */
+
+static
+rc_t CC KUrlFetcherCurlDestroy ( KUrlFetcherCurl *self )
+{
+    self->kns_mgr->curl_easy_cleanup_fkt( self -> curl_handle );
+    KNSManagerRelease( self->kns_mgr );
+
+    if ( self -> spill_over_buff != NULL )
+        free( self -> spill_over_buff );
+    free ( self );
+    return 0;
+}
+
+static
+size_t CC KUrlFetcherCurlCallback( void *ptr, size_t size, size_t nmemb, void *data )
+{
+    size_t given_bytes = size * nmemb; /* calculate the size given in ptr */
+    KUrlFetcherCurl *self = ( KUrlFetcherCurl * )data;
+    if ( self != NULL )
+    {
+        if ( ( self -> in_buff + given_bytes ) > self -> buffsize )
+        {
+            /* the caller-provided buffer IS NOT enough... */
+            size_t to_copy = ( self -> buffsize - self -> in_buff );
+            if ( to_copy > 0 )
+            {
+                /* the caller-provided buffer can hold a part of it... */
+                if ( self -> buff )
+                {
+                    memmove( &( self -> buff [ self -> in_buff ] ), ptr, given_bytes );
+                    self -> in_buff += given_bytes;
+                }
+            }
+            else
+            {
+                /* the spill-over-buffer has to take care of the rest... */
+                size_t remaining = ( given_bytes - to_copy );
+                if ( self -> spill_over_buff == NULL )
+                    self -> spill_over_buff = malloc( remaining );
+                else
+                    self -> spill_over_buff = realloc( self -> spill_over_buff,
+                                                       self -> spill_over_buffsize + remaining );
+                if ( self -> spill_over_buff != NULL )
+                {
+                    memmove( &( self -> spill_over_buff [ self -> spill_over_buffsize ] ), ptr, remaining );
+                    self -> spill_over_buffsize += remaining;
+                }
+            }
+        }
+        else
+        {
+            /* the caller-provided buffer IS enough... */
+            if ( self -> buff )
+            {
+                memmove( &( self -> buff [ self -> in_buff ] ), ptr, given_bytes );
+                self -> in_buff += given_bytes;
+            }
+        }
+    }
+    return given_bytes;
+}
+
+
+static
+rc_t CC KUrlFetcherCurlRead( KUrlFetcherCurl *self, const char * uri,
+                          void *dst, size_t to_read, size_t *num_read )
+{
+    CURLcode rcc;
+
+    /* the virtual interface has already checked that self is not NULL */
+    if ( uri == NULL || dst == NULL || to_read == 0 )
+        return RC ( rcApp, rcFunction, rcConstructing, rcParam, rcNull );
+
+    self -> buff = dst;
+    self -> buffsize = to_read;
+    self -> in_buff = 0;
+
+    if ( self -> spill_over_buff != NULL )
+        free( self -> spill_over_buff );
+    self -> spill_over_buff = NULL;
+    self -> spill_over_buffsize = 0;
+
+    if ( self -> curl_handle == NULL )
+        return RC ( rcApp, rcFunction, rcConstructing, rcParam, rcNull );
+
+    rcc = self->kns_mgr->curl_easy_setopt_fkt( self -> curl_handle, CURLOPT_URL, uri );
+    if ( rcc != CURLE_OK )
+    {
+        if ( num_read ) *num_read = 0;
+        return RC ( rcApp, rcFunction, rcConstructing, rcParam, rcNull );
+    }
+    else
+    {
+        rcc = self->kns_mgr->curl_easy_perform_fkt( self-> curl_handle );
+        if ( rcc != CURLE_OK )
+        {
+            if ( num_read ) *num_read = 0;
+            return RC ( rcApp, rcFunction, rcConstructing, rcParam, rcNull );
+        }
+    }
+    
+    if ( num_read )
+        *num_read = self -> in_buff;
+
+    return 0;
+}
+
+static KUrlFetcher_vt_v1 sKUrlFetcherCurl_vt =
+{
+    1, 0,
+    KUrlFetcherCurlDestroy,
+    KUrlFetcherCurlRead,
+};
+
+LIB_EXPORT rc_t CC KUrlFetcherCurlMake( KUrlFetcher **fetcher, const bool verbose )
+{
+    rc_t rc;
+
+    if ( fetcher == NULL )
+        rc = RC ( rcApp, rcFunction, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KUrlFetcherCurl * tmp;
+        *fetcher = NULL;
+        tmp = malloc( sizeof( * tmp ) );
+        if ( tmp != NULL )
+        {
+            rc = KUrlFetcherInit ( &(tmp)->dad, (const KUrlFetcher_vt*)&sKUrlFetcherCurl_vt );
+            if ( rc != 0 )
+                free( tmp );
+            else
+            {
+                tmp -> buff = NULL;
+                tmp -> buffsize = 0;
+                tmp -> in_buff = 0;
+
+                tmp -> spill_over_buff = NULL;
+                tmp -> spill_over_buffsize = 0;
+
+                rc = KNSManagerMake( &tmp->kns_mgr );
+                if ( rc == 0 )
+                {
+                    tmp -> curl_handle = tmp -> kns_mgr -> curl_easy_init_fkt();
+                    if ( tmp -> curl_handle == NULL )
+                    {
+                        KNSManagerRelease( tmp->kns_mgr );
+                        free( tmp );
+                        rc = RC ( rcApp, rcFunction, rcConstructing, rcParam, rcNull );
+                    }
+                    else
+                    {
+                        CURLcode rcc;
+                        
+                        if ( verbose )
+                            tmp -> kns_mgr -> curl_easy_setopt_fkt( tmp -> curl_handle, CURLOPT_VERBOSE , 1 );
+                        
+                        rcc = tmp -> kns_mgr -> curl_easy_setopt_fkt( tmp -> curl_handle, CURLOPT_WRITEFUNCTION, KUrlFetcherCurlCallback );
+                        if ( rcc != CURLE_OK )
+                        {
+                            KNSManagerRelease( tmp -> kns_mgr );
+                            free( tmp );
+                            rc = RC ( rcApp, rcFunction, rcConstructing, rcParam, rcNull );
+                        }
+                        else
+                        {
+                            rcc = tmp -> kns_mgr -> curl_easy_setopt_fkt( tmp -> curl_handle, CURLOPT_WRITEDATA, (void *)tmp );
+                            if ( rcc != CURLE_OK )
+                            {
+                                KNSManagerRelease( tmp -> kns_mgr );
+                                free( tmp );
+                                rc = RC ( rcApp, rcFunction, rcConstructing, rcParam, rcNull );
+                            }
+                            else
+                                *fetcher = & tmp -> dad;
+                        }
+                    }
+                }
+            }
+        }
+        else
+            rc = RC( rcApp, rcFunction, rcListing, rcParam, rcNull );
+    }
+    return rc;
+}
diff --git a/libs/kns/url-fetcher-impl.h b/libs/kns/url-fetcher-impl.h
new file mode 100644
index 0000000..0965bfa
--- /dev/null
+++ b/libs/kns/url-fetcher-impl.h
@@ -0,0 +1,109 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*--------------------------------------------------------------------------
+ * this file contains the private parts (v-table) of a generic url-fetcher
+    the user has to provide 3 things to the fetcher:
+        (1) the url to fetch via vt->set_url()
+        (2) eventually a context pointer via vt->set_context()
+        (3) a callback function via vt->set_callback()
+    before the user can "start" the fetcher:
+        via vt->fetch()
+ */
+
+#ifndef _h_url_fetcher_impl_
+#define _h_url_fetcher_impl_
+
+#ifndef _h_kns_extern_
+#include <kns/extern.h>
+#endif
+
+#ifndef _h_kfs_file_
+#include <kfs/file.h>
+#endif
+
+#ifndef _h_url_fetcher_
+#include <kns/url-fetcher.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+typedef union KUrlFetcher_vt KUrlFetcher_vt;
+
+/*--------------------------------------------------------------------------
+ * KUrl_fetcher
+ *  a virtual url-fetcher
+ */
+struct KUrlFetcher
+{
+    const KUrlFetcher_vt *vt;
+    KRefcount refcount;
+};
+
+
+#ifndef KURL_FETCHER_IMPL
+#define KURL_FETCHER_IMPL KUrlFetcher
+#endif
+
+
+typedef struct KUrlFetcher_vt_v1 KUrlFetcher_vt_v1;
+struct KUrlFetcher_vt_v1
+{
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t ( CC * destroy ) ( KURL_FETCHER_IMPL *self );
+    rc_t ( CC * read ) ( KURL_FETCHER_IMPL *self, const char * uri,
+                      void *dst, size_t to_read, size_t *num_read );
+    rc_t ( CC * get_size ) ( KURL_FETCHER_IMPL *self, size_t *num_size );
+    /* end minor version == 0 */
+};
+
+union KUrlFetcher_vt
+{
+    KUrlFetcher_vt_v1 v1;
+};
+
+/* Init
+ */
+KNS_EXTERN rc_t CC KUrlFetcherInit ( KUrlFetcher *self, const KUrlFetcher_vt *vt );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libs/kns/url-fetcher.c b/libs/kns/url-fetcher.c
new file mode 100644
index 0000000..ff9e16b
--- /dev/null
+++ b/libs/kns/url-fetcher.c
@@ -0,0 +1,129 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kns/extern.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include "url-fetcher-impl.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+
+/* to define the latest version of the url-fetcher in the vt */
+#define KURLFETCHER_LATEST 1
+
+static const char classname[] = "KUrlFetcher";
+
+/* AddRef
+ *  creates a new reference
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KUrlFetcherAddRef ( const KUrlFetcher *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, classname ) )
+        {
+        case krefLimit:
+            return RC ( rcApp, rcFunction, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Release
+ *  discard reference to list
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KUrlFetcherRelease ( const KUrlFetcher *cself )
+{
+    KUrlFetcher *self = ( KUrlFetcher* ) cself;
+    if ( cself != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, classname ) )
+        {
+        case krefWhack:
+            {
+                rc_t rc;
+                switch ( self -> vt -> v1 . maj )
+                {
+                case 1:
+                    rc = ( * self -> vt -> v1 . destroy ) ( self );
+                    break;
+
+                default:
+                    rc = RC ( rcApp, rcFunction, rcReleasing, rcInterface, rcBadVersion );
+                }
+
+                if ( rc != 0 )
+                    KRefcountInit ( & self -> refcount, 1, classname, "failed-release", "orphan" );
+                return rc;
+            }
+        case krefLimit:
+            return RC ( rcApp, rcFunction, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Read
+ *  reads data from the internal buffer ...
+ */
+LIB_EXPORT rc_t CC KUrlFetcherRead( KUrlFetcher *self, const char * uri,
+                      void *dst, size_t to_read, size_t *num_read )
+{
+    if ( self == NULL )
+        return RC ( rcApp, rcFunction, rcAccessing, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . read ) ( self, uri, dst, to_read, num_read );
+    }
+
+    return RC ( rcApp, rcFunction, rcAccessing, rcInterface, rcBadVersion );
+}
+
+
+/* Init
+ *  polymorphic parent constructor
+ */
+LIB_EXPORT rc_t CC KUrlFetcherInit ( KUrlFetcher *self, const KUrlFetcher_vt *vt )
+{
+    if ( self == NULL || vt == NULL )
+        return RC ( rcApp, rcFunction, rcConstructing, rcSelf, rcNull );
+
+    if ( vt -> v1 . maj == 0 )
+        return RC ( rcApp, rcFunction, rcConstructing, rcInterface, rcInvalid );
+
+    if ( vt -> v1 . maj > KURLFETCHER_LATEST )
+        return RC ( rcApp, rcFunction, rcConstructing, rcInterface, rcBadVersion );
+
+    self -> vt = vt;
+    KRefcountInit ( & self -> refcount, 1, classname, "initialized", "regular" );
+    return 0;
+}
diff --git a/libs/kproc/Makefile b/libs/kproc/Makefile
new file mode 100644
index 0000000..e344aa5
--- /dev/null
+++ b/libs/kproc/Makefile
@@ -0,0 +1,162 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/kproc
+
+include $(TOP)/build/Makefile.env
+
+INT_LIBS = \
+	libksproc \
+	libkproc
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES =       \
+	$(PROC_OBJ)  \
+	$(SPROC_OBJ)
+
+ifneq (win,$(OS))
+INT_LIBS += libkq
+OBJFILES += $(Q_OBJ)
+endif
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# multi-threaded process support
+#
+$(ILIBDIR)/libkproc: $(addprefix $(ILIBDIR)/libkproc.,$(ILIBEXT))
+
+PROC_CMN = \
+	task \
+	sysmgr \
+	procmgr
+
+PROC_SRC = \
+	$(PROC_CMN)
+
+ifneq (win,$(OS))
+PROC_SRC += \
+	systimeout \
+	syslock \
+	systhread \
+	syscond \
+	sem
+else
+PROC_SRC += \
+	systimeout \
+	syslock \
+	systhread \
+	syscond
+endif
+
+PROC_OBJ = \
+	$(addsuffix .$(LOBX),$(PROC_SRC))
+
+ifneq (win,$(OS))
+PROC_LIB = \
+	-dpthread
+else
+PROC_LIB = \
+	-dklib
+endif
+
+$(ILIBDIR)/libkproc.$(LIBX): $(PROC_OBJ)
+	$(LD) --slib -o $@ $^ $(PROC_LIB)
+
+
+#-------------------------------------------------------------------------------
+# single-threaded process support
+#
+$(ILIBDIR)/libksproc: $(addprefix $(ILIBDIR)/libksproc.,$(ILIBEXT))
+
+SPROC_SRC = \
+	$(PROC_CMN) \
+	sttimeout \
+	stlock \
+	stcond \
+	stsem \
+	stthread \
+	stbarrier
+
+SPROC_OBJ = \
+	$(addsuffix .$(LOBX),$(SPROC_SRC))
+
+SPROC_LIB = \
+	-dklib
+
+$(ILIBDIR)/libksproc.$(LIBX): $(SPROC_OBJ)
+	$(LD) --slib -o $@ $^ $(SPROC_LIB)
+
+
+#-------------------------------------------------------------------------------
+# cross-thread reference queue
+#
+$(ILIBDIR)/libkq: $(addprefix $(ILIBDIR)/libkq.,$(ILIBEXT))
+
+Q_SRC = \
+	queue
+
+Q_OBJ = \
+	$(addsuffix .$(LOBX),$(Q_SRC))
+
+Q_LIB = \
+	-dkproc \
+	-dklib
+
+$(ILIBDIR)/libkq.$(LIBX): $(Q_OBJ)
+	$(LD) --slib -o $@ $^ $(Q_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/kproc/bsd/syslock-priv.h b/libs/kproc/bsd/syslock-priv.h
new file mode 100644
index 0000000..438888f
--- /dev/null
+++ b/libs/kproc/bsd/syslock-priv.h
@@ -0,0 +1,72 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_syslock_priv_
+#define _h_syslock_priv_
+
+#include <pthread.h>
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_atomic32_
+#include <atomic32.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * KLock
+ *  a POSIX-style mutual exclusion lock
+ */
+struct KLock
+{
+    pthread_mutex_t mutex;
+    atomic32_t refcount;
+};
+
+/*--------------------------------------------------------------------------
+ * KTimedLock
+ *  a POSIX-style mutual exclusion lock
+ *  with some facilities for timed operations
+ */
+struct KTimedLock
+{
+    pthread_mutex_t mutex;
+    pthread_mutex_t cond_lock;
+    pthread_cond_t cond;
+    uint32_t waiters;
+    atomic32_t refcount;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_syslock_priv_ */
diff --git a/libs/kproc/bsd/syslock.c b/libs/kproc/bsd/syslock.c
new file mode 100644
index 0000000..c28c81e
--- /dev/null
+++ b/libs/kproc/bsd/syslock.c
@@ -0,0 +1,932 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/extern.h>
+#include "syslock-priv.h"
+#include "syscond-priv.h"
+#include <kproc/timeout.h>
+#include <kproc/lock.h>
+#include <kproc/cond.h>
+#include <os-native.h>
+#include <kproc/lock.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <errno.h>
+
+/*--------------------------------------------------------------------------
+ * pthread_mutex
+ */
+static
+rc_t pthread_mutex_whack ( pthread_mutex_t *mutex )
+{
+    int status = pthread_mutex_destroy ( mutex );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EBUSY:
+        return RC ( rcPS, rcLock, rcDestroying, rcLock, rcBusy );
+    case EINVAL:
+        return RC ( rcPS, rcLock, rcDestroying, rcLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcLock, rcDestroying, rcNoObj, rcUnknown );
+    }
+    return 0;
+}
+
+static
+rc_t pthread_mutex_acquire ( pthread_mutex_t *mutex )
+{
+/*    pthread_t t = pthread_self();
+    fprintf(stdout, "pthread_mutex_lock(%p), thread=%x\n", mutex, t);*/
+    int status = pthread_mutex_lock ( mutex );
+/*fprintf(stdout, "pthread_mutex_lock, thread=%x, status = %d\n", t, status);*/
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EDEADLK:
+        return RC ( rcPS, rcLock, rcLocking, rcThread, rcDeadlock );
+    case EINVAL:
+        return RC ( rcPS, rcLock, rcLocking, rcLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcLock, rcLocking, rcNoObj, rcUnknown );
+    }
+    return 0;
+}
+
+static
+int pthread_mutex_tryacquire ( pthread_mutex_t *mutex )
+{
+/*    pthread_t t = pthread_self();
+fprintf(stdout, "pthread_mutex_trylock(%p), thread=%x\n", mutex, t);*/
+    int status = pthread_mutex_trylock ( mutex );
+/*fprintf(stdout, "pthread_mutex_trylock, thread=%x, status = %d\n", t, status);*/
+    return status;
+}
+
+static
+rc_t pthread_mutex_release ( pthread_mutex_t *mutex )
+{
+/*    pthread_t t = pthread_self();
+fprintf(stdout, "pthread_mutex_unlock(%p), thread=%x\n", mutex, t);*/
+    int status = pthread_mutex_unlock ( mutex );
+/*fprintf(stdout, "pthread_mutex_unlock, thread=%x, status = %d\n", t, status);*/
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EPERM:
+        return RC ( rcPS, rcLock, rcUnlocking, rcThread, rcIncorrect );
+    case EINVAL:
+        return RC ( rcPS, rcLock, rcUnlocking, rcLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcLock, rcUnlocking, rcNoObj, rcUnknown );
+    }
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * pthread_condition
+ */
+static
+rc_t pthread_condition_init ( pthread_cond_t *cond )
+ {
+    int status = pthread_cond_init ( cond, NULL );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EAGAIN:
+        return RC ( rcPS, rcCondition, rcConstructing, rcCondition, rcExhausted );
+    case ENOMEM:
+        return RC ( rcPS, rcCondition, rcConstructing, rcMemory, rcExhausted );
+    case EBUSY:
+        return RC ( rcPS, rcCondition, rcConstructing, rcCondition, rcBusy );
+    case EINVAL:
+        return RC ( rcPS, rcCondition, rcConstructing, rcCondition, rcInvalid );
+    default:
+        return RC ( rcPS, rcCondition, rcConstructing, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+static
+rc_t pthread_condition_whack ( pthread_cond_t *cond )
+{
+    int status = pthread_cond_destroy ( cond );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EBUSY:
+        return RC ( rcPS, rcLock, rcDestroying, rcCondition, rcBusy );
+    case EINVAL:
+        return RC ( rcPS, rcLock, rcDestroying, rcCondition, rcInvalid );
+    default:
+        return RC ( rcPS, rcLock, rcDestroying, rcNoObj, rcUnknown );
+    }
+    return 0;
+}
+
+static
+rc_t pthread_condition_wait ( pthread_cond_t *cond, pthread_mutex_t *mutex )
+{
+/*    pthread_t t = pthread_self();
+fprintf(stdout, "pthread_cond_wait(%p, %p), thread=%x\n", cond, mutex, t);*/
+    int status = pthread_cond_wait( cond, mutex );
+/*fprintf(stdout, "pthread_cond_wait, thread=%x, status = %d\n", t, status);*/
+    
+    switch ( status )
+    {
+    case 0:
+        break;
+    default:
+        return RC ( rcPS, rcLock, rcSignaling, rcCondition, rcUnknown );
+    }
+    return 0;
+}
+
+static
+rc_t pthread_condition_timedwait ( pthread_cond_t *cond, pthread_mutex_t *mutex, struct timespec *ts )
+{
+    int status = pthread_cond_timedwait ( cond, mutex, ts );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case ETIMEDOUT:
+        return RC ( rcPS, rcCondition, rcWaiting, rcTimeout, rcExhausted );
+    case EINTR:
+        return RC ( rcPS, rcCondition, rcWaiting, rcThread, rcInterrupted );
+    default:
+        return RC ( rcPS, rcCondition, rcWaiting, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+static
+rc_t pthread_condition_signal( pthread_cond_t *cond )
+{
+    int status = pthread_cond_signal ( cond );
+    switch ( status )
+    {
+    case 0:
+        break;
+    default:
+        return RC ( rcPS, rcCondition, rcSignaling, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+static
+rc_t pthread_condition_broadcast ( pthread_cond_t *cond )
+{
+    int status = pthread_cond_broadcast ( cond );
+    switch ( status )
+    {
+    case 0:
+        break;
+    default:
+        return RC ( rcPS, rcCondition, rcSignaling, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * KLock
+ *  a POSIX-style mutual exclusion lock
+ */
+
+/* Destroy
+ */
+static
+rc_t KLockDestroy ( KLock *self )
+{
+    return pthread_mutex_whack ( & self -> mutex );
+}
+
+/* Whack
+ */
+static
+rc_t KLockWhack ( KLock *self )
+{
+    rc_t rc = KLockDestroy ( self );
+    if ( rc == 0 )
+        free ( self );
+    return rc;
+}
+
+/* Init
+ */
+static
+rc_t KLockInit ( KLock *self )
+{
+    int status = pthread_mutex_init ( & self -> mutex, NULL );
+    switch ( status )
+    {
+    case 0:
+        atomic32_set ( & self -> refcount, 1 );
+        return 0;
+    case EAGAIN:
+        return RC ( rcPS, rcLock, rcConstructing, rcResources, rcInsufficient );
+    case ENOMEM:
+        return RC ( rcPS, rcLock, rcConstructing, rcMemory, rcInsufficient );
+    }
+
+    return RC ( rcPS, rcLock, rcConstructing, rcNoObj, rcUnknown );
+ }
+
+
+/* Make
+ *  make a simple mutex
+ */
+LIB_EXPORT rc_t CC KLockMake ( KLock **lockp )
+{
+    rc_t rc;
+    if ( lockp == NULL )
+        rc = RC ( rcPS, rcLock, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KLock *lock = malloc ( sizeof * lock );
+        if ( lock == NULL )
+            rc = RC ( rcPS, rcLock, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KLockInit ( lock );
+            if ( rc == 0 )
+            {
+                * lockp = lock;
+                return 0;
+            }
+
+            free ( lock );
+        }
+
+        * lockp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KLockAddRef ( const KLock *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KLock* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLockRelease ( const KLock *cself )
+{
+    KLock *self = ( KLock* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+        {
+            atomic32_set ( & self -> refcount, 1 );
+            return KLockWhack ( self );
+        }
+    }
+    return 0;
+}
+
+
+/* Acquire
+ *  acquires lock
+ */
+LIB_EXPORT rc_t CC KLockAcquire ( KLock *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcPS, rcLock, rcLocking, rcSelf, rcNull );
+    else
+    {
+        rc = pthread_mutex_acquire ( & self -> mutex );
+    }
+
+    return rc;
+}
+
+/* Unlock
+ *  releases lock
+ */
+LIB_EXPORT rc_t CC KLockUnlock ( KLock *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcLock, rcUnlocking, rcSelf, rcNull );
+        
+    /* release the guy */
+    rc = pthread_mutex_release ( & self -> mutex );
+
+    return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * KTimedLock
+ *  a POSIX-style mutual exclusion lock with support for timed acquire
+ */
+
+/* Destroy
+ */
+static
+rc_t KTimedLockDestroy ( KTimedLock *self )
+{
+    rc_t rc = pthread_mutex_whack ( & self -> mutex );
+    if ( rc == 0 )
+    {
+        pthread_mutex_whack ( & self -> cond_lock );
+        pthread_condition_whack ( & self -> cond );
+    }
+    return rc;
+}
+
+/* Whack
+ */
+static
+rc_t KTimedLockWhack ( KTimedLock *self )
+{
+    rc_t rc = KTimedLockDestroy ( self );
+    if ( rc == 0 )
+        free ( self );
+    return rc;
+}
+
+/* Init
+ */
+static
+rc_t KTimedLockInit ( KTimedLock *self )
+{
+    int status = pthread_mutex_init ( & self -> mutex, NULL );
+    if ( status == 0 )
+    {
+        status = pthread_mutex_init ( & self -> cond_lock, NULL );
+        if ( status == 0 )
+        {
+            status = pthread_cond_init ( & self -> cond, NULL );
+            if ( status == 0 )
+            {
+                self -> waiters = 0;
+                atomic32_set ( & self -> refcount, 1 );
+                return 0;
+            }
+
+            pthread_mutex_destroy ( & self -> cond_lock );
+        }
+
+        pthread_mutex_destroy ( & self -> mutex );
+    }
+
+    switch ( status )
+    {
+    case EAGAIN:
+        return RC ( rcPS, rcLock, rcConstructing, rcResources, rcInsufficient );
+    case ENOMEM:
+        return RC ( rcPS, rcLock, rcConstructing, rcMemory, rcInsufficient );
+    }
+
+    return RC ( rcPS, rcLock, rcConstructing, rcNoObj, rcUnknown );
+ }
+
+
+/* Make
+ *  make a simple mutex
+ */
+LIB_EXPORT rc_t CC KTimedLockMake ( KTimedLock **lockp )
+{
+    rc_t rc;
+    if ( lockp == NULL )
+        rc = RC ( rcPS, rcLock, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KTimedLock *lock = malloc ( sizeof * lock );
+        if ( lock == NULL )
+            rc = RC ( rcPS, rcLock, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KTimedLockInit ( lock );
+            if ( rc == 0 )
+            {
+                * lockp = lock;
+                return 0;
+            }
+
+            free ( lock );
+        }
+
+        * lockp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KTimedLockAddRef ( const KTimedLock *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KTimedLock* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KTimedLockRelease ( const KTimedLock *cself )
+{
+    KTimedLock *self = ( KTimedLock* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+        {
+            atomic32_set ( & self -> refcount, 1 );
+            return KTimedLockWhack ( self );
+        }
+    }
+    return 0;
+}
+
+
+/* Acquire
+ *  acquires lock
+ */
+LIB_EXPORT rc_t CC KTimedLockAcquire ( KTimedLock *self, timeout_t *tm )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcLock, rcLocking, rcSelf, rcNull );
+
+    if ( tm == NULL )
+        return pthread_mutex_acquire ( & self -> mutex );
+
+    /* this is ugly, but don't want to prepare inside lock */
+    if ( ! tm -> prepared )
+        TimeoutPrepare ( tm );
+
+    rc = pthread_mutex_acquire ( & self -> cond_lock );
+    if ( rc == 0 )
+    {
+        int status = pthread_mutex_tryacquire ( & self -> mutex );
+        if ( status == EBUSY )
+        {
+            while ( 1 )
+            {
+                ++ self -> waiters;
+                status = pthread_cond_timedwait ( & self -> cond, & self -> cond_lock, & tm -> ts );
+                -- self -> waiters;
+
+                if ( status == EINTR )
+                    continue;
+                if ( status != 0 )
+                    break;
+                status = pthread_mutex_tryacquire ( & self -> mutex );
+                if ( status != EBUSY )
+                    break;
+            }
+        }
+
+        pthread_mutex_release ( & self -> cond_lock );
+
+        switch ( status )
+        {
+        case 0:
+            break;
+        case ETIMEDOUT:
+            rc = RC ( rcPS, rcLock, rcLocking, rcTimeout, rcExhausted );
+            break;
+        case EBUSY:
+            rc = RC ( rcPS, rcLock, rcLocking, rcLock, rcBusy );
+            break;
+        case EINVAL:
+            rc = RC ( rcPS, rcLock, rcLocking, rcLock, rcInvalid );
+            break;
+        default:
+            rc = RC ( rcPS, rcLock, rcLocking, rcNoObj, rcUnknown );
+        }
+    }
+
+    return rc;
+}
+
+/* Unlock
+ *  releases lock
+ */
+LIB_EXPORT rc_t CC KTimedLockUnlock ( KTimedLock *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcLock, rcUnlocking, rcSelf, rcNull );
+
+    rc = pthread_mutex_acquire ( & self -> cond_lock );
+    if ( rc == 0 )
+    {
+        /* release the guy */
+        rc = pthread_mutex_release ( & self -> mutex );
+
+        if ( self -> waiters != 0 )
+            pthread_condition_signal ( & self -> cond );
+
+        pthread_mutex_release ( & self -> cond_lock );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KRWLock
+ *  a POSIX-style read/write lock
+ */
+struct KRWLock
+{
+    KLock lock;
+    pthread_cond_t rcond;
+    pthread_cond_t wcond;
+    uint32_t rwait;
+    uint32_t wwait;
+    int32_t count;
+    atomic32_t refcount;
+    
+    /* used in KRWLockTimedAcquire */
+    pthread_mutex_t timed_lock;
+    pthread_cond_t  timed_cond;
+    uint32_t        timed_waiters;
+};
+
+
+/* Whack
+ */
+static
+rc_t KRWLockWhack ( KRWLock *self )
+{
+    rc_t rc;
+    if ( self -> count || self -> rwait || self -> wwait )
+        return RC ( rcPS, rcRWLock, rcDestroying, rcRWLock, rcBusy );
+
+    rc = KLockDestroy ( & self -> lock );
+    if ( rc == 0 )
+    {
+        pthread_cond_destroy ( & self -> rcond );
+        pthread_cond_destroy ( & self -> wcond );
+       
+        pthread_cond_destroy ( & self -> timed_cond );
+        pthread_mutex_whack ( & self -> timed_lock );
+        
+        free ( self );
+    }
+
+    return rc;
+}
+
+
+/* Make
+ *  make a simple read/write lock
+ */
+LIB_EXPORT rc_t CC KRWLockMake ( KRWLock **lockp )
+{
+    rc_t rc;
+
+    if ( lockp == NULL )
+        rc = RC ( rcPS, rcRWLock, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KRWLock *lock = malloc ( sizeof * lock );
+        if ( lock == NULL )
+            rc = RC ( rcPS, rcRWLock, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KLockInit ( & lock -> lock );
+            if ( rc == 0 )
+            {
+                rc = pthread_condition_init ( & lock -> rcond );
+                if ( rc == 0 )
+                {
+                    rc = pthread_condition_init ( & lock -> wcond );
+                    if ( rc == 0 )
+                    {
+                        rc = pthread_condition_init ( & lock -> timed_cond );
+                        if ( rc == 0 )
+                        {
+                            int status = pthread_mutex_init ( & lock -> timed_lock, NULL );
+                            if ( status == 0 )
+                            {
+                            
+                                lock -> rwait = lock -> wwait = 0;
+                                lock -> count = 0;
+                                atomic32_set ( & lock -> refcount, 1 );
+                                lock -> timed_waiters = 0;
+                                * lockp = lock;
+                                return 0;
+                            }
+                            pthread_cond_destroy ( & lock -> timed_cond );
+                        }
+                        pthread_cond_destroy ( & lock -> wcond );
+                    }
+
+                    pthread_cond_destroy ( & lock -> rcond );
+                }
+
+                KLockDestroy ( & lock -> lock );
+            }
+
+            free ( lock );
+        }
+
+        * lockp = NULL;
+    }
+
+    return rc;
+}
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KRWLockAddRef ( const KRWLock *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KRWLock* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KRWLockRelease ( const KRWLock *cself )
+{
+    KRWLock *self = ( KRWLock* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+        {
+            atomic32_set ( & self -> refcount, 1 );
+            return KRWLockWhack ( self );
+        }
+    }
+    return 0;
+}
+
+
+/* AcquireShared
+ *  acquires read ( shared ) lock
+ */
+LIB_EXPORT rc_t CC KRWLockAcquireShared ( KRWLock *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    rc = KLockAcquire ( & self -> lock );
+    if ( rc == 0 )
+    {
+        ++ self -> rwait;
+        while ( self -> count < 0 || self -> wwait != 0 )
+        {
+            rc = pthread_condition_wait ( & self -> rcond, & self -> lock . mutex );
+            if ( rc != 0 )
+                break;
+        }
+        -- self -> rwait;
+
+        if ( rc == 0 )
+        {
+            ++ self -> count;
+        }
+
+        KLockUnlock ( & self -> lock );
+    }
+
+    return rc;
+}
+
+static
+rc_t KRWLockTimedAcquire( KRWLock *self, timeout_t *tm )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcLock, rcLocking, rcSelf, rcNull );
+
+    if ( tm == NULL )
+        return pthread_mutex_acquire ( & self -> lock . mutex );
+
+    /* this is ugly, but don't want to prepare inside lock */
+    if ( ! tm -> prepared )
+        TimeoutPrepare ( tm );
+
+    rc = pthread_mutex_acquire ( & self -> timed_lock );
+    if ( rc == 0 )
+    {
+        int status = pthread_mutex_tryacquire ( & self -> lock . mutex );
+        if ( status == EBUSY )
+        {
+            while ( 1 )
+            {
+                ++ self -> timed_waiters;
+                status = pthread_cond_timedwait ( & self -> timed_cond, & self -> timed_lock, & tm -> ts );
+                -- self -> timed_waiters;
+
+                if ( status == EINTR )
+                    continue;
+                if ( status != 0 )
+                    break;
+                status = pthread_mutex_tryacquire ( & self -> lock . mutex );
+                if ( status != EBUSY )
+                    break;
+            }
+        }
+
+        pthread_mutex_release ( & self -> timed_lock );
+
+        switch ( status )
+        {
+        case 0:
+            break;
+        case ETIMEDOUT:
+            rc = RC ( rcPS, rcLock, rcLocking, rcTimeout, rcExhausted );
+            break;
+        case EBUSY:
+            rc = RC ( rcPS, rcLock, rcLocking, rcLock, rcBusy );
+            break;
+        case EINVAL:
+            rc = RC ( rcPS, rcLock, rcLocking, rcLock, rcInvalid );
+            break;
+        default:
+            rc = RC ( rcPS, rcLock, rcLocking, rcNoObj, rcUnknown );
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KRWLockTimedAcquireShared ( KRWLock *self, timeout_t *tm )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    rc = KRWLockTimedAcquire ( self, tm );
+    if ( rc == 0 )
+    {
+        ++ self -> rwait;
+        while ( self -> count < 0 || self -> wwait != 0 )
+        {
+            rc = pthread_condition_timedwait ( & self -> rcond, & self -> lock .  mutex, & tm -> ts );
+            if ( rc != 0 )
+            {
+                if ( GetRCState ( rc ) == rcExhausted && GetRCObject ( rc ) == rcTimeout )
+                    rc = ResetRCContext ( rc, rcPS, rcRWLock, rcLocking );
+                break;
+            }
+        }
+        -- self -> rwait;
+
+        if ( rc == 0 )
+        {
+            ++ self -> count;
+        }
+
+        KLockUnlock ( & self -> lock );
+    }
+
+    return rc;
+}
+
+/* AcquireExcl
+ *  acquires write ( exclusive ) lock
+ */
+LIB_EXPORT rc_t CC KRWLockAcquireExcl ( KRWLock *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    rc = KLockAcquire ( & self -> lock );
+    if ( rc == 0 )
+    {
+        ++ self -> wwait;
+        while ( self -> count != 0 )
+        {
+            rc = pthread_condition_wait ( & self -> wcond, & self -> lock . mutex );
+            if ( rc != 0 )
+                break;
+        }
+        -- self -> wwait;
+
+        if ( rc == 0 )
+        {
+            self -> count = -1;
+        }
+
+        KLockUnlock ( & self -> lock );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KRWLockTimedAcquireExcl ( KRWLock *self, timeout_t *tm )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    rc = KRWLockTimedAcquire ( self, tm );
+    if ( rc == 0 )
+    {
+        ++ self -> wwait;
+        while ( self -> count != 0 )
+        {
+            rc = pthread_condition_timedwait ( & self -> wcond, & self -> lock . mutex, & tm -> ts );
+            if ( rc != 0 )
+            {
+                if ( GetRCState ( rc ) == rcExhausted && GetRCObject ( rc ) == rcTimeout )
+                    rc = ResetRCContext ( rc, rcPS, rcRWLock, rcLocking );
+                break;
+            }
+        }
+        -- self -> wwait;
+
+        if ( rc == 0 )
+        {
+            self -> count = -1;
+        }
+
+        KLockUnlock ( & self -> lock );
+    }
+
+    return rc;
+}
+
+/* Unlock
+ *  releases lock
+ */
+LIB_EXPORT rc_t CC KRWLockUnlock ( KRWLock *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcUnlocking, rcSelf, rcNull );
+
+    rc = KLockAcquire ( & self -> lock );
+    if ( rc == 0 )
+    {
+        /* release the count */
+        if ( self -> count < 0 )
+            self -> count = 0;
+        else if ( self -> count > 0 )
+            -- self -> count;
+
+        /* if there are writers waiting... */
+        if ( self -> wwait != 0 )
+        {
+            /* don't bother unless the lock is free */
+            if ( self -> count == 0 )
+                pthread_condition_signal ( & self -> wcond );
+        }
+
+        /* if there are readers waiting */
+        else if ( self -> rwait != 0 )
+        {
+            /* any number of readers can come through now */
+            pthread_condition_broadcast ( & self -> rcond );
+        }
+
+        KLockUnlock ( & self -> lock );
+    }
+
+    return rc;
+}
diff --git a/libs/kproc/bsd/sysmgr.c b/libs/kproc/bsd/sysmgr.c
new file mode 100644
index 0000000..58345b4
--- /dev/null
+++ b/libs/kproc/bsd/sysmgr.c
@@ -0,0 +1,38 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/extern.h>
+#include <kproc/procmgr.h>
+
+#include <pthread.h>
+
+/* OnMainThread
+ *  returns true if running on main thread
+ */
+LIB_EXPORT bool CC KProcMgrOnMainThread ( void )
+{
+    return pthread_main_np () != 0;
+}
diff --git a/libs/kproc/linux/sysbarrier.c b/libs/kproc/linux/sysbarrier.c
new file mode 100644
index 0000000..2b1ccaa
--- /dev/null
+++ b/libs/kproc/linux/sysbarrier.c
@@ -0,0 +1,170 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/extern.h>
+#include <kproc/barrier.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <pthread.h>
+#include <stdlib.h>
+#include <errno.h>
+
+
+/*--------------------------------------------------------------------------
+ * KBarrier
+ *  a thread synchronization device
+ *  detains all callers until the required number has been reached
+ */
+struct KBarrier
+{
+    pthread_barrier_t barrier;
+    atomic32_t refcount;
+};
+
+
+/* Whack
+ */
+static
+rc_t KBarrierWhack ( KBarrier *self )
+{
+    int status = pthread_barrier_destroy ( & self -> barrier );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EBUSY:
+        return RC ( rcPS, rcBarrier, rcDestroying, rcBarrier, rcBusy );
+    case EINVAL:
+        return RC ( rcPS, rcBarrier, rcDestroying, rcBarrier, rcInvalid );
+    default:
+        return RC ( rcPS, rcBarrier, rcDestroying, rcNoObj, rcUnknown );
+    }
+    return 0;
+}
+
+
+/* Make
+ *  create a barrier
+ *
+ *  "count" [ IN ] - the number of threads to block
+ */
+LIB_EXPORT rc_t CC KBarrierMake ( KBarrier **bp, uint32_t count )
+{
+    rc_t rc;
+    if ( bp == NULL )
+        rc = RC ( rcPS, rcBarrier, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KBarrier *b = malloc ( sizeof * b );
+        if ( b == NULL )
+            rc = RC ( rcPS, rcBarrier, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            int status = pthread_barrier_init ( & b -> barrier, NULL, count );
+            if ( status == 0 )
+            {
+                atomic32_set ( & b -> refcount, 1 );
+                * bp = b;
+                return 0;
+            }
+
+            switch ( status )
+            {
+            case EINVAL:
+                rc = RC ( rcPS, rcBarrier, rcConstructing, rcParam, rcInvalid );
+                break;
+            case EBUSY:
+                rc = RC ( rcPS, rcBarrier, rcConstructing, rcBarrier, rcBusy );
+                break;
+            case EAGAIN:
+                rc = RC ( rcPS, rcBarrier, rcConstructing, rcBarrier, rcExhausted );
+                break;
+            case ENOMEM:
+                rc = RC ( rcPS, rcBarrier, rcConstructing, rcMemory, rcExhausted );
+                break;
+            default:
+                rc = RC ( rcPS, rcBarrier, rcConstructing, rcNoObj, rcUnknown );
+            }
+
+            free ( b );
+        }
+
+        * bp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KBarrierAddRef ( const KBarrier *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KBarrier* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KBarrierRelease ( const KBarrier *cself )
+{
+    KBarrier *self = ( KBarrier* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+        {
+            atomic32_set ( & self -> refcount, 1 );
+            return KBarrierWhack ( self );
+        }
+    }
+    return 0;
+}
+
+
+/* Wait
+ *  block until the required number of callers has been reached
+ */
+LIB_EXPORT rc_t CC KBarrierWait ( KBarrier *self )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcBarrier, rcWaiting, rcSelf, rcNull );
+
+    status = pthread_barrier_wait ( & self -> barrier );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EINVAL:
+        return RC ( rcPS, rcBarrier, rcWaiting, rcBarrier, rcInvalid );
+    default:
+        return RC ( rcPS, rcBarrier, rcWaiting, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
diff --git a/libs/kproc/linux/syslock-priv.h b/libs/kproc/linux/syslock-priv.h
new file mode 100644
index 0000000..1b2adff
--- /dev/null
+++ b/libs/kproc/linux/syslock-priv.h
@@ -0,0 +1,68 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_syslock_priv_
+#define _h_syslock_priv_
+
+/* BEGIN HACK to get rwlocks defined */
+#include <stdint.h>
+#include <stddef.h>
+
+#undef __USE_UNIX98
+#define __USE_UNIX98 1
+
+#undef __USE_XOPEN2K
+#define __USE_XOPEN2K 1
+/* END HACK */
+
+#include <pthread.h>
+#include <atomic32.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * KLock
+ *  a POSIX-style mutual exclusion lock
+ */
+struct KLock
+{
+    pthread_mutex_t mutex;
+    atomic32_t refcount;
+};
+
+struct KTimedLock
+{
+    pthread_mutex_t mutex;
+    atomic32_t refcount;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_syslock_priv_ */
diff --git a/libs/kproc/linux/syslock.c b/libs/kproc/linux/syslock.c
new file mode 100644
index 0000000..dffd05f
--- /dev/null
+++ b/libs/kproc/linux/syslock.c
@@ -0,0 +1,617 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/extern.h>
+#include "syslock-priv.h"
+#include <os-native.h>
+#include <kproc/timeout.h>
+#include <kproc/lock.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <errno.h>
+
+/*--------------------------------------------------------------------------
+ * KLock
+ *  a POSIX-style mutual exclusion lock
+ */
+
+/* Whack
+ */
+static
+rc_t KLockWhack ( KLock *self )
+{
+    int status = pthread_mutex_destroy ( & self -> mutex );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EBUSY:
+        return RC ( rcPS, rcLock, rcDestroying, rcLock, rcBusy );
+    case EINVAL:
+        return RC ( rcPS, rcLock, rcDestroying, rcLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcLock, rcDestroying, rcNoObj, rcUnknown );
+    }
+
+    free ( self );
+    return 0;
+}
+
+/* Make
+ *  make a simple mutex
+ */
+LIB_EXPORT rc_t CC KLockMake ( KLock **lockp )
+{
+    rc_t rc;
+    if ( lockp == NULL )
+        rc = RC ( rcPS, rcLock, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KLock *lock = malloc ( sizeof * lock );
+        if ( lock == NULL )
+            rc = RC ( rcPS, rcLock, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            int status = pthread_mutex_init ( & lock -> mutex, NULL );
+            if ( status == 0 )
+            {
+                atomic32_set ( & lock -> refcount, 1 );
+                * lockp = lock;
+                return 0;
+            }
+
+            /* pthread_mutex_init is documented as always returning 0 */
+            rc = RC ( rcPS, rcLock, rcConstructing, rcNoObj, rcUnknown );
+
+            free ( lock );
+        }
+
+        * lockp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KLockAddRef ( const KLock *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KLock* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLockRelease ( const KLock *cself )
+{
+    KLock *self = ( KLock* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+        {
+            atomic32_set ( & self -> refcount, 1 );
+            return KLockWhack ( self );
+        }
+    }
+    return 0;
+}
+
+
+/* Acquire
+ *  acquires lock
+ */
+LIB_EXPORT rc_t CC KLockAcquire ( KLock *self )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcLock, rcLocking, rcSelf, rcNull );
+
+    status = pthread_mutex_lock ( & self -> mutex );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EDEADLK:
+        return RC ( rcPS, rcLock, rcLocking, rcThread, rcDeadlock );
+    case EINVAL:
+        return RC ( rcPS, rcLock, rcLocking, rcLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcLock, rcLocking, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+/* Unlock
+ *  releases lock
+ */
+LIB_EXPORT rc_t CC KLockUnlock ( KLock *self )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcLock, rcUnlocking, rcSelf, rcNull );
+
+    status = pthread_mutex_unlock ( & self -> mutex );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EPERM:
+        return RC ( rcPS, rcLock, rcUnlocking, rcThread, rcIncorrect );
+    case EINVAL:
+        return RC ( rcPS, rcLock, rcUnlocking, rcLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcLock, rcUnlocking, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * KTimedLock
+ *  a POSIX-style mutual exclusion lock with support for timed Acquire
+ */
+
+ /* Whack
+ */
+static
+rc_t KTimedLockWhack ( KTimedLock *self )
+{
+    int status = pthread_mutex_destroy ( & self -> mutex );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EBUSY:
+        return RC ( rcPS, rcLock, rcDestroying, rcLock, rcBusy );
+    case EINVAL:
+        return RC ( rcPS, rcLock, rcDestroying, rcLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcLock, rcDestroying, rcNoObj, rcUnknown );
+    }
+
+    free ( self );
+    return 0;
+}
+
+/* Make
+ *  make a simple mutex
+ */
+LIB_EXPORT rc_t CC KTimedLockMake ( KTimedLock **lockp )
+{
+    rc_t rc;
+    if ( lockp == NULL )
+        rc = RC ( rcPS, rcLock, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KTimedLock *lock = malloc ( sizeof * lock );
+        if ( lock == NULL )
+            rc = RC ( rcPS, rcLock, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            int status = pthread_mutex_init ( & lock -> mutex, NULL );
+            if ( status == 0 )
+            {
+                atomic32_set ( & lock -> refcount, 1 );
+                * lockp = lock;
+                return 0;
+            }
+
+            /* pthread_mutex_init is documented as always returning 0 */
+            rc = RC ( rcPS, rcLock, rcConstructing, rcNoObj, rcUnknown );
+
+            free ( lock );
+        }
+
+        * lockp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KTimedLockAddRef ( const KTimedLock *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KLock* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KTimedLockRelease ( const KTimedLock *cself )
+{
+    KTimedLock *self = ( KTimedLock* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+        {
+            atomic32_set ( & self -> refcount, 1 );
+            return KTimedLockWhack ( self );
+        }
+    }
+    return 0;
+}
+
+
+/* Acquire
+ *  acquires lock with a timeout
+ */
+LIB_EXPORT rc_t CC KTimedLockAcquire ( KTimedLock *self, timeout_t *tm )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcLock, rcLocking, rcSelf, rcNull );
+
+    status = pthread_mutex_trylock ( & self -> mutex );
+    switch ( status )
+    {
+    case 0:
+        return 0;
+    case EBUSY:
+        if ( tm != NULL )
+            break;
+        return RC ( rcPS, rcLock, rcLocking, rcLock, rcBusy );
+    case EINVAL:
+        return RC ( rcPS, rcLock, rcLocking, rcLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcLock, rcLocking, rcNoObj, rcUnknown );
+    }
+
+    if ( ! tm -> prepared )
+        TimeoutPrepare ( tm );
+
+    status = pthread_mutex_timedlock ( & self -> mutex, & tm -> ts );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case ETIMEDOUT:
+        return RC ( rcPS, rcLock, rcLocking, rcTimeout, rcExhausted );
+    case EINVAL:
+        return RC ( rcPS, rcLock, rcLocking, rcTimeout, rcInvalid );
+    default:
+        return RC ( rcPS, rcLock, rcLocking, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+/* Unlock
+ *  releases lock
+ */
+LIB_EXPORT rc_t CC KTimedLockUnlock ( KTimedLock *self )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcLock, rcUnlocking, rcSelf, rcNull );
+
+    status = pthread_mutex_unlock ( & self -> mutex );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EPERM:
+        return RC ( rcPS, rcLock, rcUnlocking, rcThread, rcIncorrect );
+    case EINVAL:
+        return RC ( rcPS, rcLock, rcUnlocking, rcLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcLock, rcUnlocking, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * KRWLock
+ *  a POSIX-style read/write lock
+ */
+struct KRWLock
+{
+    pthread_rwlock_t lock;
+    atomic32_t refcount;
+};
+
+
+/* Whack
+ */
+static
+rc_t KRWLockWhack ( KRWLock *self )
+{
+    int status = pthread_rwlock_destroy ( & self -> lock );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EBUSY:
+        return RC ( rcPS, rcRWLock, rcDestroying, rcRWLock, rcBusy );
+    case EINVAL:
+        return RC ( rcPS, rcRWLock, rcDestroying, rcRWLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcRWLock, rcDestroying, rcNoObj, rcUnknown );
+    }
+
+    free ( self );
+    return 0;
+}
+
+
+/* Make
+ *  make a simple read/write lock
+ */
+LIB_EXPORT rc_t CC KRWLockMake ( KRWLock **lockp )
+{
+    rc_t rc;
+
+    if ( lockp == NULL )
+        rc = RC ( rcPS, rcRWLock, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KRWLock *lock = malloc ( sizeof * lock );
+        if ( lock == NULL )
+            rc = RC ( rcPS, rcRWLock, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            int status = pthread_rwlock_init ( & lock -> lock, NULL );
+            if ( status == 0 )
+            {
+                atomic32_set ( & lock -> refcount, 1 );
+                * lockp = lock;
+                return 0;
+            }
+
+            switch ( status )
+            {
+            case EAGAIN:
+                rc = RC ( rcPS, rcRWLock, rcConstructing, rcRWLock, rcExhausted );
+                break;
+            case ENOMEM:
+                rc = RC ( rcPS, rcRWLock, rcConstructing, rcMemory, rcExhausted );
+                break;
+            case EPERM:
+                rc = RC ( rcPS, rcRWLock, rcConstructing, rcProcess, rcUnauthorized );
+                break;
+            case EBUSY:
+                rc = RC ( rcPS, rcRWLock, rcConstructing, rcRWLock, rcBusy );
+                break;
+            default:
+                rc = RC ( rcPS, rcRWLock, rcConstructing, rcNoObj, rcUnknown );
+            }
+
+            free ( lock );
+        }
+
+        * lockp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KRWLockAddRef ( const KRWLock *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KRWLock* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KRWLockRelease ( const KRWLock *cself )
+{
+    KRWLock *self = ( KRWLock* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+        {
+            atomic32_set ( & self -> refcount, 1 );
+            return KRWLockWhack ( self );
+        }
+    }
+    return 0;
+}
+
+
+/* AcquireShared
+ *  acquires read ( shared ) lock
+ */
+LIB_EXPORT rc_t CC KRWLockAcquireShared ( KRWLock *self )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    status = pthread_rwlock_rdlock ( & self -> lock );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EDEADLK:
+        return RC ( rcPS, rcRWLock, rcLocking, rcThread, rcDeadlock );
+    case EAGAIN:
+        return RC ( rcPS, rcRWLock, rcLocking, rcRWLock, rcExhausted );
+    case EINVAL:
+        return RC ( rcPS, rcRWLock, rcLocking, rcRWLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcRWLock, rcLocking, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KRWLockTimedAcquireShared ( KRWLock *self, timeout_t *tm )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    status = pthread_rwlock_tryrdlock ( & self -> lock );
+    switch ( status )
+    {
+    case 0:
+        return 0;
+    case EBUSY:
+        if ( tm != NULL )
+            break;
+        return RC ( rcPS, rcLock, rcLocking, rcRWLock, rcBusy );
+    case EAGAIN:
+        return RC ( rcPS, rcRWLock, rcLocking, rcRWLock, rcExhausted );
+    case EINVAL:
+        return RC ( rcPS, rcRWLock, rcLocking, rcRWLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcRWLock, rcLocking, rcNoObj, rcUnknown );
+    }
+
+    if ( ! tm -> prepared )
+        TimeoutPrepare ( tm );
+
+    status = pthread_rwlock_timedrdlock ( & self -> lock, & tm -> ts );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case ETIMEDOUT:
+        return RC ( rcPS, rcRWLock, rcLocking, rcTimeout, rcExhausted );
+    case EAGAIN:
+        return RC ( rcPS, rcRWLock, rcLocking, rcRWLock, rcExhausted );
+    case EDEADLK:
+        return RC ( rcPS, rcRWLock, rcLocking, rcThread, rcDeadlock );
+    case EINVAL:
+        return RC ( rcPS, rcRWLock, rcLocking, rcTimeout, rcInvalid );
+    default:
+        return RC ( rcPS, rcRWLock, rcLocking, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+
+/* AcquireExcl
+ *  acquires write ( exclusive ) lock
+ */
+LIB_EXPORT rc_t CC KRWLockAcquireExcl ( KRWLock *self )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    status = pthread_rwlock_wrlock ( & self -> lock );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EDEADLK:
+        return RC ( rcPS, rcRWLock, rcLocking, rcThread, rcDeadlock );
+    case EINVAL:
+        return RC ( rcPS, rcRWLock, rcLocking, rcRWLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcRWLock, rcLocking, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KRWLockTimedAcquireExcl ( KRWLock *self, timeout_t *tm )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    status = pthread_rwlock_trywrlock ( & self -> lock );
+    switch ( status )
+    {
+    case 0:
+        return 0;
+    case EBUSY:
+        if ( tm != NULL )
+            break;
+        return RC ( rcPS, rcRWLock, rcLocking, rcLock, rcBusy );
+    case EINVAL:
+        return RC ( rcPS, rcRWLock, rcLocking, rcRWLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcRWLock, rcLocking, rcNoObj, rcUnknown );
+    }
+
+    if ( ! tm -> prepared )
+        TimeoutPrepare ( tm );
+
+    status = pthread_rwlock_timedwrlock ( & self -> lock, & tm -> ts );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case ETIMEDOUT:
+        return RC ( rcPS, rcRWLock, rcLocking, rcTimeout, rcExhausted );
+    case EDEADLK:
+        return RC ( rcPS, rcRWLock, rcLocking, rcThread, rcDeadlock );
+    case EINVAL:
+        return RC ( rcPS, rcRWLock, rcLocking, rcTimeout, rcInvalid );
+    default:
+        return RC ( rcPS, rcRWLock, rcLocking, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+
+/* Unlock
+ *  releases lock
+ */
+LIB_EXPORT rc_t CC KRWLockUnlock ( KRWLock *self )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcUnlocking, rcSelf, rcNull );
+
+    status = pthread_rwlock_unlock ( & self -> lock );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EPERM:
+        return RC ( rcPS, rcRWLock, rcUnlocking, rcThread, rcIncorrect );
+    case EINVAL:
+        return RC ( rcPS, rcRWLock, rcUnlocking, rcRWLock, rcInvalid );
+    default:
+        return RC ( rcPS, rcRWLock, rcUnlocking, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
diff --git a/libs/kproc/linux/sysmgr.c b/libs/kproc/linux/sysmgr.c
new file mode 100644
index 0000000..c3e6ff6
--- /dev/null
+++ b/libs/kproc/linux/sysmgr.c
@@ -0,0 +1,52 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/extern.h>
+#include <kproc/procmgr.h>
+
+#include <unistd.h>
+#include <sys/syscall.h>
+
+static __thread bool have_tid, on_main_thread;
+
+static
+pid_t gettid ( void )
+{
+    return syscall ( SYS_gettid );
+}
+
+/* OnMainThread
+ *  returns true if running on main thread
+ */
+LIB_EXPORT bool CC KProcMgrOnMainThread ( void )
+{
+    if ( ! have_tid )
+    {
+        on_main_thread = gettid () == getpid ();
+        have_tid = true;
+    }
+    return on_main_thread;
+}
diff --git a/libs/kproc/procmgr.c b/libs/kproc/procmgr.c
new file mode 100644
index 0000000..22ca7cd
--- /dev/null
+++ b/libs/kproc/procmgr.c
@@ -0,0 +1,445 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/extern.h>
+
+#include <kproc/procmgr.h>
+#include <kproc/task.h>
+#include <kproc/lock.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <atomic.h>
+
+#define rcTask rcCmd
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KCleanupTaskQueue
+ */
+typedef struct KCleanupTaskQueue KCleanupTaskQueue;
+struct KCleanupTaskQueue
+{
+    uint64_t count;
+    uint64_t capacity;
+    uint64_t start;
+    KTask *q [ 1 ];
+};
+
+
+/*--------------------------------------------------------------------------
+ * KProcMgr
+ */
+struct KProcMgr
+{
+    KCleanupTaskQueue *cleanup;
+    KRefcount refcount;
+};
+
+static atomic_ptr_t s_proc_mgr = { NULL };
+
+static atomic_ptr_t cleanup_lock_ptr = { NULL };
+#define cleanup_lock ( ( KLock * ) cleanup_lock_ptr . ptr )
+
+/* Whack
+ *  tear down proc mgr
+ *  runs any outstanding cleanup tasks
+ *  deletes the singleton object
+ *  intended to be called from an "atexit()" or similar task
+ */
+LIB_EXPORT rc_t CC KProcMgrWhack ( void )
+{
+    rc_t rc = 0;
+
+    /* check to see if the singleton was created and
+       try to zero out the static variable */
+    KProcMgr * test, * self = s_proc_mgr . ptr;
+    if ( self != NULL ) do
+        self = atomic_test_and_set_ptr ( & s_proc_mgr, NULL, test = self );
+    while ( self != NULL && self != test );
+
+    /* check to see if this thread will be cleaning up on procmgr */
+    if ( self != NULL )
+    {
+        rc = KLockAcquire ( cleanup_lock );
+        if ( rc == 0 )
+        {
+            uint64_t i;
+
+            KCleanupTaskQueue *cleanup = self -> cleanup;
+            self -> cleanup = NULL;
+            KLockUnlock ( cleanup_lock );
+
+            if ( cleanup != NULL )
+            {
+                for ( i = 0; i < cleanup -> count; ++ i )
+                {
+                    KTask *task = cleanup -> q [ i ];
+                    if ( task != NULL )
+                    {
+                        rc_t task_rc = KTaskExecute ( task );
+                        if ( rc == 0 )
+                            rc = task_rc;
+
+                        cleanup -> q [ i ] = NULL;
+                        KTaskRelease ( task );
+                    }
+                }
+
+                free ( cleanup );
+            }
+        }
+
+        free ( self );
+    }
+
+    return rc;
+}
+
+
+/* Init
+ *  initialize the proc mgr
+ *  creates the singleton object
+ */
+LIB_EXPORT rc_t CC KProcMgrInit ( void )
+{
+    rc_t rc = 0;
+
+    if ( s_proc_mgr . ptr == NULL )
+    {
+        KProcMgr * mgr = calloc ( 1, sizeof * mgr );
+        if ( mgr == NULL )
+        {
+            rc = RC ( rcPS, rcMgr, rcInitializing, rcMemory, rcExhausted );
+        }
+        else
+        {
+            KProcMgr * rslt;
+
+            mgr -> cleanup = NULL;
+            KRefcountInit ( & mgr -> refcount, 0, "KProcMgr", "init", "process mgr" );
+
+            rslt = atomic_test_and_set_ptr ( & s_proc_mgr, mgr, NULL );
+            if ( rslt == NULL && s_proc_mgr .ptr == mgr )
+            {
+                KLock* lock;
+                rc = KLockMake ( & lock );
+                if ( rc == 0 )
+                {
+                    KLock* lock_rslt = atomic_test_and_set_ptr ( & cleanup_lock_ptr, lock, NULL );
+                    if ( lock_rslt == NULL && cleanup_lock_ptr . ptr == lock )
+                    {
+                        return 0;
+                    }
+                    KLockRelease ( lock );
+                }
+                s_proc_mgr . ptr = NULL;
+            }
+            /* someone beat us to it */
+            free ( mgr );
+        }
+    }
+
+    return rc;
+}
+
+
+/* MakeSingleton
+ *  make or access singleton process manager
+ *  VDB-2 ONLY
+ */
+LIB_EXPORT rc_t CC KProcMgrMakeSingleton ( KProcMgr ** mgrp )
+{
+    rc_t rc;
+
+    if ( mgrp == NULL )
+        rc = RC ( rcPS, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        * mgrp = s_proc_mgr . ptr;
+
+        if ( * mgrp == NULL )
+            rc = RC ( rcPS, rcMgr, rcConstructing, rcMgr, rcNull );
+        else
+            rc = KProcMgrAddRef ( * mgrp );
+    }
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KProcMgrAddRef ( const KProcMgr *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KProcMgr" ) )
+        {
+        case krefLimit:
+            return RC ( rcPS, rcMgr, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KProcMgrRelease ( const KProcMgr *self )
+{
+    if ( self != NULL )
+    {
+        if ( KLockAcquire ( cleanup_lock ) == 0 ) /* once created, cleanup_lock does not go away */
+        {
+            if ( s_proc_mgr . ptr != NULL )
+            {
+                rc_t rc = KRefcountDrop ( & self -> refcount, "KProcMgr" );
+                KLockUnlock ( cleanup_lock );
+                switch ( rc )
+                {
+                case krefWhack:
+                    return 0;
+                case krefNegative:
+                    return RC ( rcPS, rcMgr, rcReleasing, rcRange, rcExcessive );
+                }
+                return rc;
+            }
+            else
+            {   /* VDB-3067: the singleton may have been destroyed by the main thread exiting; */
+                /* if so, this pointer is dead but we are on a thread that is terminating anyway, do nothing */
+                KLockUnlock ( cleanup_lock );
+            }
+        }
+    }
+    return 0;
+}
+
+/* AddCleanupTask
+ *  add a task to be performed at process exit time
+ *
+ *  "ticket" [ OUT ] - an id that can be used later to remove task
+ *
+ *  "task" [ IN ] - task object that will be executed at process
+ *   exit, unless previously removed ( see RemoveCleanupTask ).
+ *   NB - a new reference to "task" will be created
+ */
+LIB_EXPORT rc_t CC KProcMgrAddCleanupTask ( KProcMgr *self, KTaskTicket *ticket, KTask *task )
+{
+    rc_t rc;
+
+    if ( ticket == NULL )
+        rc = RC ( rcPS, rcQueue, rcInserting, rcId, rcNull );
+    else
+    {
+        memset ( ticket, 0, sizeof * ticket );
+
+        if ( self == NULL )
+            rc = RC ( rcPS, rcQueue, rcInserting, rcSelf, rcNull );
+        else if ( self != s_proc_mgr . ptr )
+            rc = RC ( rcPS, rcQueue, rcInserting, rcSelf, rcIncorrect );
+        else if ( task == NULL )
+            rc = RC ( rcPS, rcQueue, rcInserting, rcTask, rcNull );
+        else
+        {
+            rc = KTaskAddRef ( task );
+            if ( rc == 0 )
+            {
+                rc = KLockAcquire ( cleanup_lock );
+                if ( rc == 0 )
+                {
+                    const uint64_t extend = 1024;
+                    KCleanupTaskQueue *cleanup = self -> cleanup;
+
+                    /* on first insert, allocate queue */
+                    if ( self -> cleanup == NULL )
+                    {
+                        cleanup = malloc ( sizeof * cleanup - sizeof cleanup -> q
+                            + sizeof cleanup -> q [ 0 ] * extend );
+                        if ( cleanup == NULL )
+                            rc = RC ( rcPS, rcQueue, rcInserting, rcMemory, rcExhausted );
+                        else
+                        {
+                            cleanup -> count = 0;
+                            cleanup -> capacity = extend;
+                            cleanup -> start = 0;
+
+                            self -> cleanup = cleanup;
+                        }
+                    }
+
+                    /* if queue is full */
+                    else if ( cleanup -> count == cleanup -> capacity )
+                    {
+                        uint64_t empty;
+
+                        /* determine number of empty slots at start */
+                        for ( empty = 0; empty < cleanup -> count; ++ empty )
+                        {
+                            if ( cleanup -> q [ empty ] != NULL )
+                                break;
+                        }
+
+                        /* if none are empty, simply reallocate - probably bad... */
+                        if ( empty == 0 )
+                        {
+                            cleanup = realloc ( cleanup, sizeof * cleanup - sizeof cleanup -> q
+                                + sizeof cleanup -> q [ 0 ] * ( cleanup -> capacity + extend ) );
+                            if ( cleanup == NULL )
+                                rc = RC ( rcPS, rcQueue, rcInserting, rcMemory, rcExhausted );
+                            else
+                            {
+                                cleanup -> capacity += extend;
+                                self -> cleanup = cleanup;
+                            }
+                        }
+
+                        /* otherwise, rewrite to remove empty slots */
+                        else
+                        {
+                            uint64_t i;
+                            const KCleanupTaskQueue *orig = cleanup;
+
+                            /* only bother with resize if there are enough to recover */
+                            if ( empty >= 4096 )
+                            {
+                                cleanup = malloc ( sizeof * cleanup - sizeof cleanup -> q
+                                    + sizeof cleanup -> q [ 0 ] * ( orig -> capacity - empty + extend ) );
+                                if ( cleanup == NULL )
+                                    rc = RC ( rcPS, rcQueue, rcInserting, rcMemory, rcExhausted );
+                                else
+                                {
+                                    cleanup -> capacity = orig -> capacity - empty + extend;
+                                }
+                            }
+
+                            /* rewrite count to remove leading NULL entries */
+                            cleanup -> count = orig -> count - empty;
+
+                            /* accumulate NULL entries into the start offset */
+                            cleanup -> start = orig -> start + empty;
+
+                            /* copy the tasks */
+                            for ( i = 0; i < cleanup -> count; ++ i )
+                                cleanup -> q [ i ] = orig -> q [ empty + i ];
+
+                            if ( ( const KCleanupTaskQueue* ) cleanup != orig )
+                            {
+                                self -> cleanup = cleanup;
+                                free ( ( void* ) orig );
+                            }
+                        }
+                    }
+
+                    /* detect valid queue for insertion */
+                    if ( rc == 0 )
+                    {
+                        /* assert that there is space for a task */
+                        assert ( cleanup -> count < cleanup -> capacity );
+
+                        /* record reference to task */
+                        cleanup -> q [ cleanup -> count ] = task;
+
+                        /* fill out the ticket information */
+                        ticket -> info [ 0 ] =  cleanup -> start + cleanup -> count;
+                        ticket -> info [ 1 ] = ( size_t ) task;
+                        ticket -> info [ 0 ] ^= ( size_t ) self;
+                        ticket -> info [ 1 ] ^= ( size_t ) self;
+                        ticket -> info [ 0 ] ^= ( size_t ) task;
+
+                        /* account for insertion */
+                        ++ cleanup -> count;
+                    }
+
+                    KLockUnlock ( cleanup_lock );
+                }
+
+                if ( rc != 0 )
+                    KTaskRelease ( task );
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* RemoveCleanupTask
+ *  remove a task from exit queue
+ *  releases reference to task object
+ *  returns an rcNotFound code if task no longer exists
+ */
+LIB_EXPORT rc_t CC KProcMgrRemoveCleanupTask ( KProcMgr *self, const KTaskTicket *ticket )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcPS, rcQueue, rcRemoving, rcSelf, rcNull );
+    else if ( self != s_proc_mgr . ptr )
+        rc = RC ( rcPS, rcQueue, rcRemoving, rcSelf, rcIncorrect );
+    else if ( ticket == NULL )
+        rc = RC ( rcPS, rcQueue, rcRemoving, rcId, rcNull );
+    else
+    {
+        /* recover task* and idx */
+        KTask *task = ( KTask* ) ( ( size_t ) ticket -> info [ 1 ] ^ ( size_t ) self );
+        uint64_t idx = ticket -> info [ 0 ] ^ ( size_t ) task;
+        idx ^= ( size_t ) self;
+
+        /* go into queue */
+        rc = KLockAcquire ( cleanup_lock );
+        if ( rc == 0 )
+        {
+            KCleanupTaskQueue *cleanup = self -> cleanup;
+            if ( self -> cleanup == NULL )
+                rc = RC ( rcPS, rcQueue, rcRemoving, rcItem, rcNotFound );
+            else if ( idx < cleanup -> start )
+                rc = RC ( rcPS, rcQueue, rcRemoving, rcItem, rcNotFound );
+            else
+            {
+                idx -= cleanup -> start;
+                if ( idx >= cleanup -> count )
+                    rc = RC ( rcPS, rcQueue, rcRemoving, rcItem, rcNotFound );
+                else if ( cleanup -> q [ idx ] != task )
+                    rc = RC ( rcPS, rcQueue, rcRemoving, rcItem, rcNotFound );
+                else
+                {
+                    cleanup -> q [ idx ] = NULL;
+                }
+            }
+
+            KLockUnlock ( cleanup_lock );
+        }
+
+        if ( rc == 0 )
+            KTaskRelease ( task );
+    }
+
+    return rc;
+}
diff --git a/libs/kproc/queue.c b/libs/kproc/queue.c
new file mode 100644
index 0000000..205079f
--- /dev/null
+++ b/libs/kproc/queue.c
@@ -0,0 +1,428 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/q-extern.h>
+#include <kproc/queue.h>
+#include <kproc/timeout.h>
+#include <kproc/lock.h>
+#include <kproc/sem.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+#include <atomic32.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+#if _DEBUGGING && 0
+#define QMSG( msg, ... ) \
+    KOutMsg ( msg, __VA_ARGS__ )
+#else
+#define QMSG( msg, ... ) \
+    ( void ) 0
+#endif
+
+/*--------------------------------------------------------------------------
+ * KQueue
+ *  a simple thread-safe queue structure supporting push/pop operation
+ *  makes use of semaphore objects for synchronization
+ */
+struct KQueue
+{
+    KSemaphore *rc;
+    KSemaphore *wc;
+
+    KLock *rl;
+    KLock *wl;
+
+    uint32_t capacity;
+    uint32_t bmask, imask;
+    volatile uint32_t read, write;
+    atomic32_t refcount;
+    volatile bool sealed;
+    uint8_t align [ 7 ];
+    void *buffer [ 16 ];
+};
+
+
+/* Whack
+ */
+static
+rc_t KQueueWhack ( KQueue *self )
+{
+    rc_t rc;
+    QMSG ( "%s: releasing write semaphore\n", __func__ );
+    rc = KSemaphoreRelease ( self -> wc );
+    if ( rc == 0 )
+    {
+        QMSG ( "%s: releasing read semaphore\n", __func__ );
+        KSemaphoreRelease ( self -> rc );
+        QMSG ( "%s: releasing write lock\n", __func__ );
+        KLockRelease ( self -> wl );
+        QMSG ( "%s: releasing read lock\n", __func__ );
+        KLockRelease ( self -> rl );
+        free ( self );
+        QMSG ( "%s: done\n", __func__ );
+    }
+    return rc;
+}
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KQueueAddRef ( const KQueue *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KQueue* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KQueueRelease ( const KQueue *cself )
+{
+    KQueue *self = ( KQueue* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+            return KQueueWhack ( self );
+    }
+    return 0;
+}
+
+/* Make
+ * create an empty queue object
+ *
+ *  "capacity" [ IN ] - minimum queue length
+ *  always expands to a power of 2, i.e. providing
+ *  a length of 10 will result in a length of 16.
+ */
+LIB_EXPORT rc_t CC KQueueMake ( KQueue **qp, uint32_t capacity )
+{
+    rc_t rc;
+    if ( qp == NULL )
+        rc = RC ( rcCont, rcQueue, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KQueue *q;
+
+        uint32_t cap = 1;
+        while ( cap < capacity )
+            cap += cap;
+
+        q = malloc ( sizeof * q - sizeof q -> buffer + cap * sizeof q -> buffer [ 0 ] );
+        if ( q == NULL )
+            rc = RC ( rcCont, rcQueue, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KSemaphoreMake ( & q -> rc, 0 );
+            if ( rc == 0 )
+            {
+                rc = KSemaphoreMake ( & q -> wc, cap );
+                if ( rc == 0 )
+                {
+                    rc = KLockMake ( & q -> rl );
+                    if ( rc == 0 )
+                    {
+                        rc = KLockMake ( & q -> wl );
+                        if ( rc == 0 )
+                        {
+                            q -> capacity = cap;
+                            q -> bmask = cap - 1;
+                            q -> imask = ( cap + cap ) - 1;
+                            q -> read = q -> write = 0;
+                            atomic32_set ( & q -> refcount, 1 );
+                            q -> sealed = false;
+
+                            QMSG ( "%s: created queue with capacity %u, "
+                                   "bmask %#032b, imask %#032b.\n"
+                                   , __func__, q -> capacity, q -> bmask, q -> imask
+                                );
+
+                            * qp = q;
+                            return 0;
+                        }
+
+                        KLockRelease ( q -> rl );
+                    }
+
+                    KSemaphoreRelease ( q -> wc );
+                }
+
+                KSemaphoreRelease ( q -> rc );
+            }
+            free ( q );
+        }
+        * qp = NULL;
+    }
+    return rc;
+}
+
+/* Push
+ *  add an object to the queue
+ *
+ *  "item" [ IN, OPAQUE ] - pointer to item being queued
+ *
+ *  "tm" [ IN, NULL OKAY ] - pointer to system specific timeout
+ *  structure. if the queue is full, wait for indicated period
+ *  of time for space to become available, or return status
+ *  code indicating a timeout. when NULL and queue is full,
+ *  Push will time out immediately and return status code.
+ */
+LIB_EXPORT rc_t CC KQueuePush ( KQueue *self, const void *item, timeout_t *tm )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        return RC ( rcCont, rcQueue, rcInserting, rcSelf, rcNull );
+    if ( self -> sealed )
+    {
+        QMSG ( "%s: failed to insert into queue due to seal\n", __func__ );
+        return RC ( rcCont, rcQueue, rcInserting, rcQueue, rcReadonly );
+    }
+    if ( item == NULL )
+        return RC ( rcCont, rcQueue, rcInserting, rcParam, rcNull );
+
+    QMSG ( "%s: acquiring write lock ( %p )...\n", __func__, self -> wl );
+    rc = KLockAcquire ( self -> wl );
+    QMSG ( "%s: ...done, rc = %R\n", __func__, rc );
+    if ( rc == 0 )
+    {
+        QMSG ( "%s: waiting on write semaphore...\n", __func__ );
+        rc = KSemaphoreTimedWait ( self -> wc, self -> wl, tm );
+        QMSG ( "%s: ...done, rc = %R.\n", __func__, rc );
+
+        if ( rc == 0 )
+        {
+            uint32_t w;
+
+            /* re-check the seal */
+            if ( self -> sealed )
+            {
+                QMSG ( "%s: queue has been sealed\n", __func__ );
+
+                /* not a disaster if semaphore not signaled */
+                QMSG ( "%s: signaling write semaphore\n", __func__ );
+                KSemaphoreSignal ( self -> wc );
+                QMSG ( "%s: unlocking write lock\n", __func__ );
+                KLockUnlock ( self -> wl );
+
+                QMSG ( "%s: failed to insert into queue due to seal\n", __func__ );
+                return RC ( rcCont, rcQueue, rcInserting, rcQueue, rcReadonly );
+            }
+
+            /* insert item */
+            w = self -> write & self -> imask;
+            QMSG ( "%s: write index is %u, masked against 0x%x\n", __func__, w, self -> imask );
+            self -> buffer [ w & self -> bmask ] = ( void* ) item;
+            QMSG ( "%s: inserted item into buffer [ %u ], using mask 0x%x\n", __func__, w & self -> bmask, self -> bmask );
+            self -> write = w + 1;
+
+            QMSG ( "%s: unlocking write lock ( %p ).\n", __func__, self -> wl );
+            KLockUnlock ( self -> wl );
+
+            /* let listeners know about item */
+            QMSG ( "%s: acquiring read lock ( %p )\n", __func__, self -> rl );
+            if ( KLockAcquire ( self -> rl ) == 0 )
+            {
+                QMSG ( "%s: signaling read semaphore\n", __func__ );
+                KSemaphoreSignal ( self -> rc );
+                QMSG ( "%s: unlocking read lock ( %p )\n", __func__, self -> rl );
+                KLockUnlock ( self -> rl );
+            }
+        }
+        else
+        {
+            QMSG ( "%s: unlocking write lock ( %p ).\n", __func__, self -> wl );
+            KLockUnlock ( self -> wl );
+
+            if ( self -> sealed )
+            {
+                switch ( ( int ) GetRCObject ( rc ) )
+                {
+                case ( int ) rcTimeout:
+                case ( int ) rcSemaphore:
+                    rc = RC ( rcCont, rcQueue, rcInserting, rcQueue, rcReadonly );
+                    QMSG ( "%s: resetting rc to %R\n", __func__, rc );
+                    break;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* Pop
+ *  pop an object from queue
+ *
+ *  "item" [ OUT, OPAQUE* ] - return parameter for popped item
+ *
+ *  "tm" [ IN, NULL OKAY ] - pointer to system specific timeout
+ *  structure. if the queue is empty, wait for indicated period
+ *  of time for an object to become available, or return status
+ *  code indicating a timeout. when NULL and queue is empty,
+ *  Pop will time out immediately and return status code.
+ */
+LIB_EXPORT rc_t CC KQueuePop ( KQueue *self, void **item, timeout_t *tm )
+{
+    rc_t rc;
+
+    if ( item == NULL )
+        rc = RC ( rcCont, rcQueue, rcRemoving, rcParam, rcNull );
+    else
+    {
+        * item = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcCont, rcQueue, rcRemoving, rcSelf, rcNull );
+        else
+        {
+            QMSG ( "%s: acquiring read lock ( %p )\n", __func__, self -> rl );
+            rc = KLockAcquire ( self -> rl );
+            if ( rc == 0 )
+            {
+                QMSG ( "%s: waiting on read semaphore...\n", __func__ );
+                rc = KSemaphoreTimedWait ( self -> rc, self -> rl, self -> sealed ? NULL : tm );
+                QMSG ( "%s: ...done, rc = %R.\n", __func__, rc );
+
+                if ( rc == 0 )
+                {
+                    uint32_t r, idx;
+
+                    /* got an element */
+                    QMSG ( "%s: asserting  self -> read ( %u ) != self -> write ( %u )\n",
+                           __func__, self -> read, self -> write
+                        );
+                    assert ( self -> read != self -> write );
+
+                    /* read element */
+                    r = self -> read & self -> imask;
+                    QMSG ( "%s: read index is %u, masked against 0x%x\n", __func__, r, self -> imask );
+                    idx = r & self -> bmask;
+                    * item = self -> buffer [ idx ];
+                    QMSG ( "%s: read item from buffer [ %u ], using mask 0x%x\n", __func__, idx, self -> bmask );
+                    self -> buffer [ idx ] = NULL;
+                    self -> read = r + 1;
+
+                    QMSG ( "%s: unlocking read lock. ( %p )\n", __func__, self -> rl );
+                    KLockUnlock ( self -> rl );
+
+                    /* let write know there's a free slot available */
+                    QMSG ( "%s: acquiring write lock ( %p )\n", __func__, self -> wl );
+                    if ( KLockAcquire ( self -> wl ) == 0 )
+                    {
+                        QMSG ( "%s: signaling write semaphore\n", __func__ );
+                        KSemaphoreSignal ( self -> wc );
+                        QMSG ( "%s: unlocking write lock ( %p )\n", __func__, self -> wl );
+                        KLockUnlock ( self -> wl );
+                    }
+                }
+                else
+                {
+                    QMSG ( "%s: unlocking read lock. ( %p )\n", __func__, self -> rl );
+                    KLockUnlock ( self -> rl );
+
+                    if ( self -> sealed )
+                    {
+                        switch ( ( int ) GetRCObject ( rc ) )
+                        {
+                        case ( int ) rcTimeout:
+                        case ( int ) rcSemaphore:
+                            rc = RC ( rcCont, rcQueue, rcRemoving, rcData, rcDone );
+                            QMSG ( "%s: resetting rc to %R\n", __func__, rc );
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* Sealed
+ *  ask if the queue has been closed off
+ *  meaning there will be no further push operations
+ *
+ *  NB - if "self" is NULL, the return value is "true"
+ *  since a NULL queue cannot accept items via push
+ */
+LIB_EXPORT bool CC KQueueSealed ( const KQueue *self )
+{
+    QMSG ( "%s called\n", __func__ );
+    if ( self != NULL )
+        return self -> sealed;
+    return false;
+}
+
+
+/* Seal
+ *  indicate that the queue has been closed off
+ *  meaning there will be no further push operations
+ *  if "writes" is true, and no further pop operations
+ *  otherwise.
+ */
+LIB_EXPORT rc_t CC KQueueSeal ( KQueue *self )
+{
+    rc_t rc = 0;
+
+    QMSG ( "%s called\n", __func__ );
+
+    if ( self == NULL )
+        return RC ( rcCont, rcQueue, rcFreezing, rcSelf, rcNull );
+
+    self -> sealed = true;
+
+#if 1
+    QMSG ( "%s: acquiring write lock ( %p )\n", __func__, self -> wl );
+    rc = KLockAcquire ( self -> wl );
+    if ( rc == 0 )
+    {
+        QMSG ( "%s: canceling write semaphore...\n", __func__ );
+        rc = KSemaphoreCancel ( self -> wc );
+        QMSG ( "%s: ...done, rc = %R.\n", __func__, rc );
+        KLockUnlock ( self -> wl );
+
+        if ( rc == 0 )
+        {
+            QMSG ( "%s: acquiring read lock ( %p )\n", __func__, self -> rl );
+            rc = KLockAcquire ( self -> rl );
+            if ( rc == 0 )
+            {
+                QMSG ( "%s: canceling read semaphore...\n", __func__ );
+                rc = KSemaphoreCancel ( self -> rc );
+                QMSG ( "%s: ...done, rc = %R.\n", __func__, rc );
+                KLockUnlock ( self -> rl );
+            }
+        }
+    }
+#endif
+
+    return rc;
+}
diff --git a/libs/kproc/sem.c b/libs/kproc/sem.c
new file mode 100644
index 0000000..b728818
--- /dev/null
+++ b/libs/kproc/sem.c
@@ -0,0 +1,472 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "syscond-priv.h"
+#include <kproc/extern.h>
+#include <kproc/sem.h>
+#include <kproc/cond.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdlib.h>
+
+#if _DEBUGGING && 0
+#define SMSG( msg, ... ) \
+    KOutMsg ( msg, __VA_ARGS__ )
+#else
+#define SMSG( msg, ... ) \
+    ( void ) 0
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KSemaphore
+ *  a metering device
+ */
+struct KSemaphore
+{
+    volatile uint64_t avail;
+    volatile uint64_t requested;
+    volatile uint64_t min_requested;
+    KCondition* cond;
+    volatile uint32_t waiting;
+    volatile bool uniform;
+    volatile bool canceled;
+};
+
+
+/* Whack
+ */
+static
+rc_t KSemaphoreWhack ( KSemaphore *self )
+{
+    rc_t rc;
+
+    if ( self -> waiting != 0 )
+        return RC ( rcPS, rcSemaphore, rcDestroying, rcSemaphore, rcBusy );
+
+    rc = KConditionRelease ( self -> cond );
+    if ( rc != 0 )
+        return ResetRCContext ( rc, rcPS, rcSemaphore, rcDestroying );
+
+    free ( self );
+    return 0;
+}
+
+
+/* Make
+ *
+ *  "count" [ IN ] - initial count value
+ */
+LIB_EXPORT rc_t CC KSemaphoreMake ( KSemaphore **semp, uint64_t count )
+{
+    rc_t rc;
+    if ( semp == NULL )
+        rc = RC ( rcPS, rcSemaphore, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KSemaphore *sem = calloc ( 1, sizeof * sem );
+        if ( sem == NULL )
+            rc = RC ( rcPS, rcSemaphore, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KConditionMake( & sem -> cond );
+            if ( rc == 0 )
+            {
+                sem -> avail = count;
+                * semp = sem;
+                return 0;
+            }
+
+            free ( sem );
+        }
+
+        * semp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KSemaphoreAddRef ( const KSemaphore *cself )
+{
+    if ( cself != NULL )
+        return KConditionAddRef ( cself -> cond );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KSemaphoreRelease ( const KSemaphore *cself )
+{
+    if ( cself != NULL )
+    {
+        if ( KConditionDropRef ( cself -> cond ) )
+            return KSemaphoreWhack ( ( KSemaphore* ) cself );
+    }
+    return 0;
+}
+
+
+/* Wait
+ *  block until a count becomes available
+ *
+ *  "lock" [ IN ] - externally acquired lock
+ */
+LIB_EXPORT rc_t CC KSemaphoreWait ( KSemaphore *self, struct KLock *lock )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcSelf, rcNull );
+
+    if ( self -> avail == 0 )
+    {
+        if ( ++ self -> waiting == 1 )
+        {
+            self -> requested = self -> min_requested = 1;
+            self -> uniform = true;
+        }
+        else if ( self -> requested != 1 )
+        {
+            self -> min_requested = 1;
+            self -> uniform = false;
+        }
+
+        do
+        {
+            rc_t rc;
+
+            if ( self -> canceled )
+            {
+                SMSG ( "%s[%p]: wait was canceled - decrementing wait count\n", __func__, self );
+                -- self -> waiting;
+                return RC ( rcPS, rcSemaphore, rcWaiting, rcSemaphore, rcCanceled );
+            }
+
+            rc = KConditionWait ( self -> cond, lock );
+            if ( rc != 0 )
+            {
+                -- self -> waiting;
+                return ResetRCContext ( rc, rcPS, rcSemaphore, rcWaiting );
+            }
+        }
+        while ( self -> avail == 0 );
+
+        -- self -> waiting;
+    }
+
+    -- self -> avail;
+    return 0;
+}
+
+/* TimedWait
+ *  block until a count becomes available
+ *
+ *  "lock" [ IN ] - externally acquired lock
+ *
+ *  "tm" [ IN, NULL OKAY ] - optional timeout where
+ *  NULL means timeout value of 0
+ */
+LIB_EXPORT rc_t CC KSemaphoreTimedWait ( KSemaphore *self,
+    struct KLock *lock, struct timeout_t *tm )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcSelf, rcNull );
+
+    if ( self -> avail == 0 )
+    {
+        SMSG ( "%s[%p]: avail == 0\n", __func__, self );
+        if ( tm == NULL )
+        {
+            SMSG ( "%s[%p]: non-blocking mode - return timeout exhausted\n", __func__, self );
+            return RC ( rcPS, rcSemaphore, rcWaiting, rcTimeout, rcExhausted );
+        }
+
+        if ( ++ self -> waiting == 1 )
+        {
+            SMSG ( "%s[%p]: first waiter\n", __func__, self );
+            self -> requested = self -> min_requested = 1;
+            self -> uniform = true;
+        }
+        else if ( self -> requested != 1 )
+        {
+            SMSG ( "%s[%p]: multiple waiters ( %u )\n", __func__, self, self -> waiting );
+            self -> min_requested = 1;
+            self -> uniform = false;
+        }
+
+        do
+        {
+            rc_t rc;
+
+            if ( self -> canceled )
+            {
+                SMSG ( "%s[%p]: wait was canceled - decrementing wait count\n", __func__, self );
+                -- self -> waiting;
+                return RC ( rcPS, rcSemaphore, rcWaiting, rcSemaphore, rcCanceled );
+            }
+
+            SMSG ( "%s[%p]: wait on condition...\n", __func__, self );
+            rc = KConditionTimedWait ( self -> cond, lock, tm );
+            SMSG ( "%s[%p]:...done, rc = %R\n", __func__, self, rc );
+            if ( rc != 0 )
+            {
+                SMSG ( "%s[%p]: timed out - decrementing wait count\n", __func__, self );
+                -- self -> waiting;
+                return ResetRCContext ( rc, rcPS, rcSemaphore, rcWaiting );
+            }
+
+            SMSG ( "%s[%p]: condition signaled - avail = %lu\n", __func__, self, self -> avail );
+        }
+        while ( self -> avail == 0 );
+
+        SMSG ( "%s[%p]: finished waiting\n", __func__, self );
+        -- self -> waiting;
+    }
+
+    SMSG ( "%s[%p]: decrementing count from %lu\n", __func__, self, self -> avail );
+    -- self -> avail;
+    return 0;
+}
+
+
+/* Cancel
+ *  signal that the count will never increase
+ */
+LIB_EXPORT rc_t CC KSemaphoreCancel ( KSemaphore *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcSignaling, rcSelf, rcNull );
+
+    self -> canceled = true;
+
+    if ( self -> waiting != 0 )
+    {
+        SMSG ( "%s[%p]: canceling %u waiters\n", __func__, self, self -> waiting );
+        return KConditionBroadcast ( self -> cond );
+    }
+
+    SMSG ( "%s[%p]: cancel request ( no waiters )\n", __func__, self );
+    return 0;
+}
+
+
+/* Signal
+ *  signal that a count has become available
+ */
+LIB_EXPORT rc_t CC KSemaphoreSignal ( KSemaphore *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcSignaling, rcSelf, rcNull );
+
+    if ( self -> canceled )
+        return RC ( rcPS, rcSemaphore, rcSignaling, rcSemaphore, rcCanceled );
+
+    ++ self -> avail;
+    if ( self -> waiting != 0 && self -> avail >= self -> min_requested )
+    {
+        /* whacky logic
+           - if everyone has requested the same amount
+           - and only one request can be satisfied
+           - then signal. otherwise, broadcast */
+        if ( self -> uniform && self -> avail / self -> min_requested == 1 )
+            return KConditionSignal ( self -> cond );
+        return KConditionBroadcast ( self -> cond );
+    }
+
+    return 0;
+}
+
+
+/* Alloc
+ *  allocate a count
+ *  used for resource metering
+ *
+ *  "lock" [ IN ] - externally acquired lock
+ *
+ *  "count" [ IN ] - the resource count
+ */
+LIB_EXPORT rc_t CC KSemaphoreAlloc ( KSemaphore *self,
+    struct KLock *lock, uint64_t count )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcSelf, rcNull );
+
+    if ( self -> avail < count )
+    {
+        if ( ++ self -> waiting == 1 )
+        {
+            self -> requested = self -> min_requested = count;
+            self -> uniform = true;
+        }
+        else if ( self -> requested != count )
+        {
+            if ( self -> min_requested > count )
+                self -> min_requested = count;
+            self -> uniform = false;
+        }
+
+        do
+        {
+            rc_t rc;
+
+            if ( self -> canceled )
+            {
+                -- self -> waiting;
+                return RC ( rcPS, rcSemaphore, rcWaiting, rcSemaphore, rcCanceled );
+            }
+
+            rc = KConditionWait ( self -> cond, lock );
+            if ( rc != 0 )
+            {
+                -- self -> waiting;
+                return ResetRCContext ( rc, rcPS, rcSemaphore, rcWaiting );
+            }
+        }
+        while ( self -> avail < count );
+
+        -- self -> waiting;
+    }
+
+    self -> avail -= count;
+    return 0;
+}
+
+/* TimedAlloc
+ *  allocate a count
+ *  used for resource metering
+ *
+ *  "lock" [ IN ] - externally acquired lock
+ *
+ *  "count" [ IN ] - the resource count
+ *
+ *  "tm" [ IN, NULL OKAY ] - optional timeout where
+ *  NULL means timeout value of 0
+ */
+LIB_EXPORT rc_t CC KSemaphoreTimedAlloc ( KSemaphore *self,
+    struct KLock *lock, uint64_t count, struct timeout_t *tm )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcSelf, rcNull );
+
+    if ( self -> avail < count )
+    {
+        if ( tm == NULL )
+            return RC ( rcPS, rcSemaphore, rcWaiting, rcTimeout, rcExhausted );
+
+        if ( ++ self -> waiting == 1 )
+        {
+            self -> requested = self -> min_requested = count;
+            self -> uniform = true;
+        }
+        else if ( self -> requested != count )
+        {
+            if ( self -> min_requested > count )
+                self -> min_requested = count;
+            self -> uniform = false;
+        }
+
+        do
+        {
+            rc_t rc;
+
+            if ( self -> canceled )
+            {
+                -- self -> waiting;
+                return RC ( rcPS, rcSemaphore, rcWaiting, rcSemaphore, rcCanceled );
+            }
+
+            rc = KConditionTimedWait ( self -> cond, lock, tm );
+            if ( rc != 0 )
+            {
+                -- self -> waiting;
+                return ResetRCContext ( rc, rcPS, rcSemaphore, rcWaiting );
+            }
+        }
+        while ( self -> avail < count );
+
+        -- self -> waiting;
+    }
+
+    self -> avail -= count;
+    return 0;
+}
+
+
+/* Free
+ *  signal that resources have become available
+ */
+LIB_EXPORT rc_t CC KSemaphoreFree ( KSemaphore *self, uint64_t count )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcSignaling, rcSelf, rcNull );
+
+    if ( self -> canceled )
+        return RC ( rcPS, rcSemaphore, rcSignaling, rcSemaphore, rcCanceled );
+
+    self -> avail += count;
+    if ( self -> waiting != 0 && self -> avail >= self -> min_requested )
+    {
+        /* whacky logic
+           - if everyone has requested the same amount
+           - and only one request can be satisfied
+           - then signal. otherwise, broadcast */
+        if ( self -> uniform && self -> avail / self -> min_requested == 1 )
+            return KConditionSignal ( self -> cond );
+        return KConditionBroadcast ( self -> cond );
+    }
+
+    return 0;
+}
+
+
+/* Count
+ *  request the current resource usage
+ *  valid only within lock
+ *
+ *  "count" [ OUT ] - return parameter for current count
+ */
+LIB_EXPORT rc_t CC KSemaphoreCount ( const KSemaphore *self, uint64_t *count )
+{
+    rc_t rc;
+    if ( count == NULL )
+        rc = RC ( rcPS, rcSemaphore, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcPS, rcSemaphore, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * count = self -> avail;
+            return 0;
+        }
+
+        * count = 0;
+    }
+    return rc;
+}
diff --git a/libs/kproc/stbarrier.c b/libs/kproc/stbarrier.c
new file mode 100644
index 0000000..56b621b
--- /dev/null
+++ b/libs/kproc/stbarrier.c
@@ -0,0 +1,128 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/extern.h>
+#include <kproc/barrier.h>
+#include <klib/rc.h>
+#include <atomic32.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+
+/*--------------------------------------------------------------------------
+ * KBarrier
+ *  a thread synchronization device
+ *  detains all callers until the required number has been reached
+ */
+struct KBarrier
+{
+    atomic32_t refcount;
+    uint32_t barrier;
+    uint32_t count;
+};
+
+
+/* Whack
+ */
+static
+rc_t KBarrierWhack ( KBarrier *self )
+{
+    free ( self );
+    return 0;
+}
+
+
+/* Make
+ *  create a barrier
+ *
+ *  "count" [ IN ] - the number of threads to block
+ */
+LIB_EXPORT rc_t CC KBarrierMake ( KBarrier **bp, uint32_t count )
+{
+    rc_t rc;
+    if ( bp == NULL )
+        rc = RC ( rcPS, rcBarrier, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KBarrier *b = malloc ( sizeof * b );
+        if ( b == NULL )
+            rc = RC ( rcPS, rcBarrier, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            atomic32_set ( & b -> refcount, 1 );
+            b -> barrier = count;
+            b -> count = 0;
+            * bp = b;
+            return 0;
+        }
+
+        * bp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KBarrierAddRef ( const KBarrier *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KBarrier* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KBarrierRelease ( const KBarrier *cself )
+{
+    KBarrier *self = ( KBarrier* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+        {
+            atomic32_set ( & self -> refcount, 1 );
+            return KBarrierWhack ( self );
+        }
+    }
+    return 0;
+}
+
+
+/* Wait
+ *  block until the required number of callers has been reached
+ */
+LIB_EXPORT rc_t CC KBarrierWait ( KBarrier *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcBarrier, rcWaiting, rcSelf, rcNull );
+
+    if ( ++ self -> count < self -> barrier )
+    {
+        -- self -> count;
+        return RC ( rcPS, rcBarrier, rcWaiting, rcThread, rcDeadlock );
+    }
+
+    return 0;
+}
diff --git a/libs/kproc/stcond.c b/libs/kproc/stcond.c
new file mode 100644
index 0000000..79084bf
--- /dev/null
+++ b/libs/kproc/stcond.c
@@ -0,0 +1,152 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kproc/extern.h>
+#include <kproc/cond.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdlib.h>
+
+
+/*--------------------------------------------------------------------------
+ * KCondition
+ *  a POSIX-style condition object
+ */
+struct KCondition
+{
+    atomic32_t refcount;
+};
+
+
+/* Whack
+ */
+static
+rc_t KConditionWhack ( KCondition *self )
+{
+    free ( self );
+    return 0;
+}
+
+
+/* Make
+ *  create a condition
+ */
+LIB_EXPORT rc_t CC KConditionMake ( KCondition **condp )
+{
+    rc_t rc;
+    if ( condp == NULL )
+        rc = RC ( rcPS, rcCondition, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KCondition *cond = malloc ( sizeof * cond );
+        if ( cond == NULL )
+            rc = RC ( rcPS, rcCondition, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            atomic32_set ( & cond -> refcount, 1 );
+            * condp = cond;
+            return 0;
+        }
+
+        * condp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KConditionAddRef ( const KCondition *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KCondition* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KConditionRelease ( const KCondition *cself )
+{
+    KCondition *self = ( KCondition* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+            return KConditionWhack ( self );
+    }
+    return 0;
+}
+
+
+/* Wait
+ *  block on external lock until signaled
+ */
+LIB_EXPORT rc_t CC KConditionWait ( KCondition *self, struct KLock *lock )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcCondition, rcWaiting, rcSelf, rcNull );
+    if ( lock == NULL )
+        return RC ( rcPS, rcCondition, rcWaiting, rcLock, rcNull );
+
+    return RC ( rcPS, rcCondition, rcWaiting, rcThread, rcDeadlock );
+}
+
+LIB_EXPORT rc_t CC KConditionTimedWait ( KCondition *self, struct KLock *lock, struct timeout_t *tm )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcCondition, rcWaiting, rcSelf, rcNull );
+    if ( lock == NULL )
+        return RC ( rcPS, rcCondition, rcWaiting, rcLock, rcNull );
+    if ( tm == NULL )
+        return RC ( rcPS, rcCondition, rcWaiting, rcTimeout, rcNull );
+
+    return RC ( rcPS, rcCondition, rcWaiting, rcThread, rcDeadlock );
+}
+
+
+/* Signal
+ *  signal waiting threads
+ *  awaken at most a single thread
+ */
+LIB_EXPORT rc_t CC KConditionSignal ( KCondition *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcCondition, rcSignaling, rcSelf, rcNull );
+
+    return RC ( rcPS, rcCondition, rcSignaling, rcThread, rcDeadlock );
+}
+
+
+/* Broadcast
+ *  signal waiting threads
+ *  awaken all waiting thread
+ */
+LIB_EXPORT rc_t CC KConditionBroadcast ( KCondition *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcCondition, rcSignaling, rcSelf, rcNull );
+
+    return RC ( rcPS, rcCondition, rcSignaling, rcThread, rcDeadlock );
+}
diff --git a/libs/kproc/stlock.c b/libs/kproc/stlock.c
new file mode 100644
index 0000000..dc5a961
--- /dev/null
+++ b/libs/kproc/stlock.c
@@ -0,0 +1,311 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kproc/extern.h>
+#include <kproc/lock.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdlib.h>
+
+/*--------------------------------------------------------------------------
+ * KLock
+ *  a POSIX-style mutual exclusion lock
+ */
+struct KLock
+{
+    atomic32_t refcount;
+    int32_t count;
+};
+
+
+/* Whack
+ */
+static
+rc_t KLockWhack ( KLock *self )
+{
+    if ( self -> count > 0 )
+        return RC ( rcPS, rcLock, rcDestroying, rcLock, rcBusy );
+
+    free ( self );
+    return 0;
+}
+
+
+/* Make
+ *  make a simple mutex
+ */
+LIB_EXPORT rc_t CC KLockMake ( KLock **lockp )
+{
+    rc_t rc;
+    if ( lockp == NULL )
+        rc = RC ( rcPS, rcLock, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KLock *lock = malloc ( sizeof * lock );
+        if ( lock == NULL )
+            rc = RC ( rcPS, rcLock, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            atomic32_set ( & lock -> refcount, 1 );
+            lock -> count = 0;
+            * lockp = lock;
+            return 0;
+        }
+
+        * lockp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KLockAddRef ( const KLock *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KLock* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLockRelease ( const KLock *cself )
+{
+    KLock *self = ( KLock* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+        {
+            atomic32_set ( & self -> refcount, 1 );
+            return KLockWhack ( self );
+        }
+    }
+    return 0;
+}
+
+
+/* Acquire
+ *  acquires lock
+ */
+LIB_EXPORT rc_t CC KLockAcquire ( KLock *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcLock, rcLocking, rcSelf, rcNull );
+
+    ++ self -> count;
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KLockTimedAcquire ( KLock *self, struct timeout_t *tm )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcLock, rcLocking, rcSelf, rcNull );
+
+    ++ self -> count;
+
+    return 0;
+}
+
+/* Unlock
+ *  releases lock
+ */
+LIB_EXPORT rc_t CC KLockUnlock ( KLock *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcLock, rcUnlocking, rcSelf, rcNull );
+
+    /* pthread_mutex_unlock's man page states that the only
+       unlock error we could see is that another thread tries
+       to release a lock. what if the lock is not locked? */
+    if ( self -> count <= 0 )
+        return RC ( rcPS, rcLock, rcUnlocking, rcThread, rcIncorrect );
+
+    -- self -> count;
+
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KRWLock
+ *  a POSIX-style read/write lock
+ */
+struct KRWLock
+{
+    atomic32_t refcount;
+    int32_t count;
+};
+
+
+/* Whack
+ */
+static
+rc_t KRWLockWhack ( KRWLock *self )
+{
+    if ( self -> count != 0 )
+        return RC ( rcPS, rcRWLock, rcDestroying, rcRWLock, rcBusy );
+
+    free ( self );
+    return 0;
+}
+
+
+/* Make
+ *  make a simple read/write lock
+ */
+LIB_EXPORT rc_t CC KRWLockMake ( KRWLock **lockp )
+{
+    rc_t rc;
+
+    if ( lockp == NULL )
+        rc = RC ( rcPS, rcRWLock, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KRWLock *lock = malloc ( sizeof * lock );
+        if ( lock == NULL )
+            rc = RC ( rcPS, rcRWLock, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            atomic32_set ( & lock -> refcount, 1 );
+            lock -> count = 0;
+            * lockp = lock;
+            return 0;
+        }
+
+        * lockp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KRWLockAddRef ( const KRWLock *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KRWLock* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KRWLockRelease ( const KRWLock *cself )
+{
+    KRWLock *self = ( KRWLock* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+        {
+            atomic32_set ( & self -> refcount, 1 );
+            return KRWLockWhack ( self );
+        }
+    }
+    return 0;
+}
+
+
+/* AcquireShared
+ *  acquires read ( shared ) lock
+ */
+LIB_EXPORT rc_t CC KRWLockAcquireShared ( KRWLock *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    if ( self -> count < 0 )
+        return RC ( rcPS, rcRWLock, rcLocking, rcThread, rcDeadlock );
+
+    ++ self -> count;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KRWLockTimedAcquireShared ( KRWLock *self, struct timeout_t *tm )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    if ( self -> count < 0 )
+    {
+        if ( tm == NULL )
+            return RC ( rcPS, rcLock, rcLocking, rcRWLock, rcBusy );
+        return RC ( rcPS, rcRWLock, rcLocking, rcTimeout, rcExhausted );
+    }
+
+    ++ self -> count;
+    return 0;
+}
+
+
+/* AcquireExcl
+ *  acquires write ( exclusive ) lock
+ */
+LIB_EXPORT rc_t CC KRWLockAcquireExcl ( KRWLock *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    if ( self -> count != 0 )
+        return RC ( rcPS, rcRWLock, rcLocking, rcThread, rcDeadlock );
+
+    -- self -> count;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KRWLockTimedAcquireExcl ( KRWLock *self, struct timeout_t *tm )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcLocking, rcSelf, rcNull );
+
+    if ( self -> count != 0 )
+    {
+        if ( tm == NULL )
+            return RC ( rcPS, rcLock, rcLocking, rcRWLock, rcBusy );
+        return RC ( rcPS, rcRWLock, rcLocking, rcTimeout, rcExhausted );
+    }
+
+    -- self -> count;
+    return 0;
+}
+
+
+/* Unlock
+ *  releases lock
+ */
+LIB_EXPORT rc_t CC KRWLockUnlock ( KRWLock *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcRWLock, rcUnlocking, rcSelf, rcNull );
+
+    if ( self -> count < 0 )
+        self -> count = 0;
+    else if ( self -> count > 0 )
+        -- self -> count;
+    else
+        return RC ( rcPS, rcRWLock, rcUnlocking, rcThread, rcIncorrect );
+
+    return 0;
+}
diff --git a/libs/kproc/stsem.c b/libs/kproc/stsem.c
new file mode 100644
index 0000000..458c9ce
--- /dev/null
+++ b/libs/kproc/stsem.c
@@ -0,0 +1,233 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/extern.h>
+#include <kproc/sem.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdlib.h>
+
+
+/*--------------------------------------------------------------------------
+ * KSemaphore
+ *  a metering device
+ */
+struct KSemaphore
+{
+    uint64_t avail;
+    atomic32_t refcount;
+};
+
+
+/* Whack
+ */
+static
+rc_t KSemaphoreWhack ( KSemaphore *self )
+{
+    free ( self );
+    return 0;
+}
+
+
+/* Make
+ *
+ *  "count" [ IN ] - initial count value
+ */
+LIB_EXPORT rc_t CC KSemaphoreMake ( KSemaphore **semp, uint64_t count )
+{
+    rc_t rc;
+    if ( semp == NULL )
+        rc = RC ( rcPS, rcSemaphore, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KSemaphore *sem = malloc ( sizeof * sem );
+        if ( sem == NULL )
+            rc = RC ( rcPS, rcSemaphore, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            sem -> avail = count;
+            atomic32_set ( & sem -> refcount, 1 );
+            * semp = sem;
+            return 0;
+        }
+
+        * semp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KSemaphoreAddRef ( const KSemaphore *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KSemaphore* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KSemaphoreRelease ( const KSemaphore *cself )
+{
+    KSemaphore *self = ( KSemaphore* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+            return KSemaphoreWhack ( self );
+    }
+    return 0;
+}
+
+
+/* Wait
+ *  block until a count becomes available
+ *
+ *  "lock" [ IN ] - externally acquired lock
+ */
+LIB_EXPORT rc_t CC KSemaphoreWait ( KSemaphore *self, struct KLock *lock )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcSelf, rcNull );
+
+    if ( self -> avail == 0 )
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcThread, rcDeadlock );
+
+    -- self -> avail;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KSemaphoreTimedWait ( KSemaphore *self,
+    struct KLock *lock, struct timeout_t *tm )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcSelf, rcNull );
+
+    if ( self -> avail == 0 )
+    {
+        if ( tm == NULL )
+            return RC ( rcPS, rcSemaphore, rcWaiting, rcTimeout, rcNull );
+
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcThread, rcDeadlock );
+    }
+
+    -- self -> avail;
+    return 0;
+}
+
+
+/* Signal
+ *  signal that a count has become available
+ */
+LIB_EXPORT rc_t CC KSemaphoreSignal ( KSemaphore *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcSignaling, rcSelf, rcNull );
+
+    ++ self -> avail;
+    return 0;
+}
+
+
+/* Alloc
+ *  allocate a count
+ *  used for resource metering
+ *
+ *  "lock" [ IN ] - externally acquired lock
+ *
+ *  "count" [ IN ] - the resource count
+ */
+LIB_EXPORT rc_t CC KSemaphoreAlloc ( KSemaphore *self,
+    struct KLock *lock, uint64_t count )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcSelf, rcNull );
+
+    if ( self -> avail < count )
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcThread, rcDeadlock );
+
+    self -> avail -= count;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KSemaphoreTimedAlloc ( KSemaphore *self,
+    struct KLock *lock, uint64_t count, struct timeout_t *tm )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcSelf, rcNull );
+
+    if ( self -> avail < count )
+    {
+        if ( tm == NULL )
+            return RC ( rcPS, rcSemaphore, rcWaiting, rcTimeout, rcNull );
+
+        return RC ( rcPS, rcSemaphore, rcWaiting, rcThread, rcDeadlock );
+    }
+
+    self -> avail -= count;
+    return 0;
+}
+
+
+/* Free
+ *  signal that resources have become available
+ */
+LIB_EXPORT rc_t CC KSemaphoreFree ( KSemaphore *self, uint64_t count )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcSemaphore, rcSignaling, rcSelf, rcNull );
+
+    self -> avail += count;
+    return 0;
+}
+
+
+/* Count
+ *  request the current resource usage
+ *  valid only within lock
+ *
+ *  "count" [ OUT ] - return parameter for current count
+ */
+LIB_EXPORT rc_t CC KSemaphoreCount ( const KSemaphore *self, uint64_t *count )
+{
+    rc_t rc;
+    if ( count == NULL )
+        rc = RC ( rcPS, rcSemaphore, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcPS, rcSemaphore, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * count = self -> avail;
+            return 0;
+        }
+
+        * count = 0;
+    }
+    return rc;
+}
diff --git a/libs/kproc/stthread.c b/libs/kproc/stthread.c
new file mode 100644
index 0000000..982b13b
--- /dev/null
+++ b/libs/kproc/stthread.c
@@ -0,0 +1,149 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kproc/extern.h>
+#include <kproc/thread.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdlib.h>
+
+/*--------------------------------------------------------------------------
+ * KThread
+ *  a CPU execution thread
+ */
+struct KThread
+{
+    atomic32_t refcount;
+    rc_t rc;
+};
+
+
+/* Whack
+ */
+static
+rc_t KThreadWhack ( KThread *self )
+{
+    free ( self );
+    return 0;
+}
+
+
+/* Make
+ *  create and run a thread
+ *
+ *  "run_thread" [ IN ] - thread entrypoint
+ *
+ *  "data" [ IN, OPAQUE ] - user-supplied thread data
+ */
+LIB_EXPORT rc_t CC KThreadMake ( KThread **tp,
+    rc_t ( * run_thread ) ( const KThread*, void* ), void *data )
+{
+    rc_t rc;
+    if ( tp == NULL )
+        rc = RC ( rcPS, rcThread, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( run_thread == NULL )
+            rc = RC ( rcPS, rcThread, rcCreating, rcFunction, rcNull );
+        else
+        {
+            KThread *t = malloc ( sizeof * t );
+            if ( t == NULL )
+                rc = RC ( rcPS, rcThread, rcCreating, rcMemory, rcExhausted );
+            else
+            {
+                /* run function on current thread */
+                atomic32_set ( & t -> refcount, 1 );
+                t -> rc = ( * run_thread ) ( t, data );
+                * tp = t;
+                return 0;
+            }
+        }
+
+        * tp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KThreadAddRef ( const KThread *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KThread* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KThreadRelease ( const KThread *cself )
+{
+    KThread *self = ( KThread* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+            return KThreadWhack ( self );
+    }
+    return 0;
+}
+
+
+/* Cancel
+ *  signal the thread to finish
+ */
+LIB_EXPORT rc_t CC KThreadCancel ( KThread *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcThread, rcSignaling, rcSelf, rcNull );
+    return RC ( rcPS, rcThread, rcSignaling, rcThread, rcDestroyed );
+}
+
+
+/* Wait
+ *  waits for a thread to exit
+ *
+ *  "status" [ OUT ] - return parameter for thread's exit code
+ */
+LIB_EXPORT rc_t CC KThreadWait ( KThread *self, rc_t *status )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcThread, rcWaiting, rcSelf, rcNull );
+    if ( status != NULL )
+        * status = self -> rc;
+    return 0;
+}
+
+
+/* Detach
+ *  allow thread to run independently of group
+ */
+LIB_EXPORT rc_t CC KThreadDetach ( KThread *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcThread, rcDetaching, rcSelf, rcNull );
+    return RC ( rcPS, rcThread, rcDetaching, rcThread, rcDestroyed );
+}
diff --git a/libs/kproc/sttimeout.c b/libs/kproc/sttimeout.c
new file mode 100644
index 0000000..47ba6cc
--- /dev/null
+++ b/libs/kproc/sttimeout.c
@@ -0,0 +1,65 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/extern.h>
+#include <kproc/timeout.h>
+#include <os-native.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+/*--------------------------------------------------------------------------
+ * timeout_t
+ *  a structure for communicating a timeout
+ */
+
+/* Init
+ *  initialize a timeout in milliseconds
+ */
+LIB_EXPORT rc_t CC TimeoutInit ( timeout_t *tm, uint32_t msec )
+{
+    if ( tm == NULL )
+        return RC ( rcPS, rcTimeout, rcConstructing, rcSelf, rcNull );
+
+    tm -> mS = msec;
+    tm -> prepared = false;
+
+    return 0;
+}
+
+/* Prepare
+ *  ensures that a timeout is prepared with an absolute value
+*/
+LIB_EXPORT rc_t CC TimeoutPrepare ( timeout_t *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcTimeout, rcUpdating, rcSelf, rcNull );
+
+    if ( ! self -> prepared )
+        self -> prepared = true;
+
+    return 0;
+}
diff --git a/libs/kproc/task.c b/libs/kproc/task.c
new file mode 100644
index 0000000..3a7fcc7
--- /dev/null
+++ b/libs/kproc/task.c
@@ -0,0 +1,156 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/extern.h>
+
+#include <kproc/task.h>
+#include <kproc/impl.h>
+#include <klib/rc.h>
+
+#define rcTask rcCmd
+
+
+/*--------------------------------------------------------------------------
+ * KTask
+ *  a deferred task abstraction
+ *  specific task objects are constructed with required parameters
+ *  and implement the Execute method to perform their operation
+ */
+
+
+/* Whack
+ */
+static
+rc_t KTaskWhack ( KTask * self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcTask, rcDestroying, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . destroy ) ( self );
+    }
+
+    return RC ( rcPS, rcTask, rcDestroying, rcInterface, rcBadVersion );
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KTaskAddRef ( const KTask *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KTask" ) )
+        {
+        case krefLimit:
+            return RC ( rcPS, rcTask, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KTaskRelease ( const KTask *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "KTask" ) )
+        {
+        case krefWhack:
+            return KTaskWhack ( ( KTask* ) self );
+        case krefNegative:
+            return RC ( rcPS, rcTask, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Execute
+ *  perform deferred operation
+ */
+LIB_EXPORT rc_t CC KTaskExecute ( KTask *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcTask, rcExecuting, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return ( * self -> vt -> v1 . execute ) ( self );
+    }
+
+    return RC ( rcPS, rcTask, rcExecuting, rcInterface, rcBadVersion );
+}
+
+
+/* Init
+ *  initialize a newly allocated task object
+ */
+LIB_EXPORT rc_t CC KTaskInit ( KTask *self, const KTask_vt *vt, const char *clsname, const char *name )
+{
+    if ( self == NULL )
+        return RC ( rcFS, rcTask, rcConstructing, rcSelf, rcNull );
+    if ( vt == NULL )
+        return RC ( rcFS, rcTask, rcConstructing, rcInterface, rcNull );
+    switch ( vt -> v1 . maj )
+    {
+    case 1:
+        switch ( vt -> v1 . min )
+        {
+            /* insert new minor versions in reverse order */
+        case 0:
+#if _DEBUGGING
+            if ( vt -> v1 . destroy == NULL ||
+                 vt -> v1 . execute == NULL )
+            return RC ( rcFS, rcTask, rcConstructing, rcInterface, rcNull );
+#endif
+            break;
+        default:
+            return RC ( rcFS, rcTask, rcConstructing, rcInterface, rcInvalid );
+        }
+        break;
+    default:
+        return RC ( rcFS, rcTask, rcConstructing, rcInterface, rcInvalid );
+    }
+
+    self -> vt = vt;
+    KRefcountInit ( & self -> refcount, 1, clsname, "init", name );
+    return 0;
+}
+
+
+/* Destroy
+ *  destroy task
+ */
+LIB_EXPORT rc_t CC KTaskDestroy ( KTask *self, const char *clsname )
+{
+    if ( self != NULL )
+        KRefcountWhack ( & self -> refcount, clsname );
+    return 0;
+}
diff --git a/libs/kproc/unix/syscond-priv.h b/libs/kproc/unix/syscond-priv.h
new file mode 100644
index 0000000..ba8ba01
--- /dev/null
+++ b/libs/kproc/unix/syscond-priv.h
@@ -0,0 +1,78 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_syscond_priv_
+#define _h_syscond_priv_
+
+#include <pthread.h>
+#include <atomic32.h>
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * KCondition
+ *  a POSIX-style condition object
+ *  ( requires an external lock object )
+ *
+ *  usage: the user first acquires an external lock. then, depending upon
+ *  the operation, will either test for a condition or establish it, where
+ *  the former involves the potential to wait for a signal and the latter
+ *  to generate a signal using the external lock for blocking.
+ */
+struct KCondition
+{
+    pthread_cond_t cond;
+    atomic32_t refcount;
+};
+
+/* Init
+ *  initialize an inline KCondition
+ */
+rc_t KConditionInit ( struct KCondition *self );
+
+/* Destroy
+ *  run destructor on inline KCondition
+ */
+rc_t KConditionDestroy ( struct KCondition *self );
+
+/* DropRef
+ *  manipulates reference counter
+ *  returns true if last ref
+ */
+int KConditionDropRef ( struct KCondition const *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_syscond_priv_ */
diff --git a/libs/kproc/unix/syscond.c b/libs/kproc/unix/syscond.c
new file mode 100644
index 0000000..8eb008c
--- /dev/null
+++ b/libs/kproc/unix/syscond.c
@@ -0,0 +1,320 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "syslock-priv.h"
+#include "syscond-priv.h"
+
+#include <kproc/extern.h>
+#include <os-native.h>
+#include <kproc/timeout.h>
+#include <kproc/cond.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdlib.h>
+#include <errno.h>
+#include <assert.h>
+
+#if _DEBUGGING && 0
+#define CMSG( msg, ... ) \
+    KOutMsg ( msg, __VA_ARGS__ )
+#else
+#define CMSG( msg, ... ) \
+    ( void ) 0
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KCondition
+ *  a POSIX-style condition object
+ *  ( requires an external lock object )
+ *
+ *  usage: the user first acquires an external lock. then, depending upon
+ *  the operation, will either test for a condition or establish it, where
+ *  the former involves the potential to wait for a signal and the latter
+ *  to generate a signal using the external lock for blocking.
+ */
+
+
+/* Destroy
+ */
+LIB_EXPORT rc_t CC KConditionDestroy ( KCondition *self )
+{
+    int status = pthread_cond_destroy ( & self -> cond );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EBUSY:
+        return RC ( rcPS, rcCondition, rcDestroying, rcCondition, rcBusy );
+    default:
+        return RC ( rcPS, rcCondition, rcDestroying, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+
+/* Whack
+ */
+static
+rc_t KConditionWhack ( KCondition *self )
+{
+    rc_t rc = KConditionDestroy ( self );
+    if ( rc == 0 )
+        free ( self );
+    return rc;
+}
+
+/* Init
+ */
+LIB_EXPORT rc_t CC KConditionInit ( KCondition *self )
+{
+    int status;
+
+    assert ( self != NULL );
+    status = pthread_cond_init ( & self -> cond, NULL );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case EAGAIN:
+        return RC ( rcPS, rcCondition, rcConstructing, rcCondition, rcExhausted );
+    case ENOMEM:
+        return RC ( rcPS, rcCondition, rcConstructing, rcMemory, rcExhausted );
+    case EBUSY:
+        return RC ( rcPS, rcCondition, rcConstructing, rcCondition, rcBusy );
+    case EINVAL:
+        return RC ( rcPS, rcCondition, rcConstructing, rcCondition, rcInvalid );
+    default:
+        return RC ( rcPS, rcCondition, rcConstructing, rcNoObj, rcUnknown );
+    }
+
+    atomic32_set ( & self -> refcount, 1 );
+    return 0;
+}
+
+
+/* Make
+ *  create a condition
+ */
+LIB_EXPORT rc_t CC KConditionMake ( KCondition **condp )
+{
+    rc_t rc;
+    if ( condp == NULL )
+        rc = RC ( rcPS, rcCondition, rcConstructing, rcParam, rcNull );
+    else
+    {
+        KCondition *cond = malloc ( sizeof * cond );
+        if ( cond == NULL )
+            rc = RC ( rcPS, rcCondition, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KConditionInit ( cond );
+            if ( rc == 0 )
+            {
+                * condp = cond;
+                return 0;
+            }
+            
+            free ( cond );
+        }
+
+        * condp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KConditionAddRef ( const KCondition *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KCondition* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KConditionRelease ( const KCondition *cself )
+{
+    KCondition *self = ( KCondition* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_read_and_add ( & self -> refcount, -1 ) <= 1 )
+            return KConditionWhack ( self );
+    }
+    return 0;
+}
+
+/* DropRef
+ *  manipulates reference counter
+ *  returns true if last ref
+ */
+LIB_EXPORT int CC KConditionDropRef ( const KCondition *cself )
+{
+    assert ( cself != NULL );
+    return atomic32_dec_and_test ( & ( ( KCondition* ) cself ) -> refcount );
+}
+
+
+/* Wait
+ *  block on external lock until signaled
+ */
+LIB_EXPORT rc_t CC KConditionWait ( KCondition *self, struct KLock *lock )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcCondition, rcWaiting, rcSelf, rcNull );
+    if ( lock == NULL )
+        return RC ( rcPS, rcCondition, rcWaiting, rcLock, rcNull );
+
+    status = pthread_cond_wait ( & self -> cond, & lock -> mutex );
+    switch ( status )
+    {
+    case 0:
+        break;
+    default:
+        return RC ( rcPS, rcCondition, rcWaiting, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KConditionTimedWait ( KCondition *self, struct KLock *lock, timeout_t *tm )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcCondition, rcWaiting, rcSelf, rcNull );
+    if ( lock == NULL )
+        return RC ( rcPS, rcCondition, rcWaiting, rcLock, rcNull );
+    if ( tm == NULL )
+        return RC ( rcPS, rcCondition, rcWaiting, rcTimeout, rcNull );
+
+    CMSG ( "%s[%p]: testing timeout structure\n", __func__, self );
+    if ( ! tm -> prepared )
+    {
+        CMSG ( "%s[%p]: preparing timeout...\n", __func__, self );
+        TimeoutPrepare ( tm );
+        CMSG ( "%s[%p]: ...done preparing timeout\n", __func__, self );
+    }
+
+#if 1
+    CMSG ( "%s[%p]: calling 'pthread_cond_timedwait ( cond = %p, mutex = %p, ts = %p )'...\n"
+           , __func__, self, & self -> cond, & lock -> mutex, & tm -> ts
+        );
+    status = pthread_cond_timedwait ( & self -> cond, & lock -> mutex, & tm -> ts );
+#else
+    CMSG ( "%s[%p]: calling 'pthread_cond_wait ( cond = %p, mutex = %p )'...\n"
+           , __func__, self, & self -> cond, & lock -> mutex, & tm -> ts
+        );
+    status = pthread_cond_wait ( & self -> cond, & lock -> mutex );
+#endif
+    CMSG ( "%s[%p]: ...done, OS status = %!\n", __func__, self, status );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case ETIMEDOUT:
+        return SILENT_RC ( rcPS, rcCondition, rcWaiting, rcTimeout, rcExhausted );
+/*
+  The pthread_cond_timedwait() function shall fail if:
+
+  ETIMEDOUT
+  The time specified by abstime to pthread_cond_timedwait() has passed.
+
+  The pthread_cond_timedwait() and pthread_cond_wait() functions may fail if:
+
+  EINVAL The value specified by cond, mutex, or abstime is invalid.
+
+  EINVAL Different mutexes were supplied for concurrent pthread_cond_timedwait()
+  or pthread_cond_wait() operations on the same condition variable.
+
+  EPERM  The mutex was not owned by the current thread at the time of the call.
+
+  *** These functions shall not return an error code of [EINTR]. ***
+
+ */
+    case EINTR:
+        return RC ( rcPS, rcCondition, rcWaiting, rcThread, rcInterrupted );
+    default:
+        return RC ( rcPS, rcCondition, rcWaiting, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+
+/* Signal
+ *  signal waiting threads
+ *  awaken at most a single thread
+ */
+LIB_EXPORT rc_t CC KConditionSignal ( KCondition *self )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcCondition, rcSignaling, rcSelf, rcNull );
+
+    status = pthread_cond_signal ( & self -> cond );
+    switch ( status )
+    {
+    case 0:
+        break;
+    default:
+        return RC ( rcPS, rcCondition, rcSignaling, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+
+/* Broadcast
+ *  signal waiting threads
+ *  awaken all waiting thread
+ */
+LIB_EXPORT rc_t CC KConditionBroadcast ( KCondition *self )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcCondition, rcSignaling, rcSelf, rcNull );
+
+    status = pthread_cond_broadcast ( & self -> cond );
+    switch ( status )
+    {
+    case 0:
+        break;
+    default:
+        return RC ( rcPS, rcCondition, rcSignaling, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
diff --git a/libs/kproc/unix/systhread.c b/libs/kproc/unix/systhread.c
new file mode 100644
index 0000000..5707d41
--- /dev/null
+++ b/libs/kproc/unix/systhread.c
@@ -0,0 +1,272 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kproc/extern.h>
+#include <kproc/thread.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <pthread.h>
+#include <stdlib.h>
+#include <errno.h>
+
+
+/*--------------------------------------------------------------------------
+ * KThread
+ *  a CPU execution thread
+ */
+struct KThread
+{
+    /* thread entrypoint and data */
+    rc_t ( * run ) ( const KThread*, void* );
+    void *data;
+
+    pthread_t thread;
+    atomic32_t waiting;
+    atomic32_t refcount;
+    rc_t rc;
+    bool join;
+};
+
+
+/* Whack
+ */
+static
+rc_t KThreadWhack ( KThread *self )
+{
+    if ( self -> join )
+    {
+        void *td;
+        pthread_join ( self -> thread, & td );
+    }
+
+    free ( self );
+    return 0;
+}
+
+
+/* Run
+ */
+static
+void *KThreadRun ( void *td )
+{
+    KThread *self = td;
+
+    /* run the function */
+    self -> rc = ( * self -> run ) ( self, self -> data );
+
+    /* release thread's reference */
+    if ( atomic32_dec_and_test ( & self -> refcount ) )
+        free ( self );
+
+    return NULL;
+}
+
+
+/* Make
+ *  create and run a thread
+ *
+ *  "run_thread" [ IN ] - thread entrypoint
+ *
+ *  "data" [ IN, OPAQUE ] - user-supplied thread data
+ */
+LIB_EXPORT rc_t CC KThreadMake ( KThread **tp,
+    rc_t ( CC * run_thread ) ( const KThread*, void* ), void *data )
+{
+    rc_t rc;
+    if ( tp == NULL )
+        rc = RC ( rcPS, rcThread, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( run_thread == NULL )
+            rc = RC ( rcPS, rcThread, rcCreating, rcFunction, rcNull );
+        else
+        {
+            KThread *t = malloc ( sizeof * t );
+            if ( t == NULL )
+                rc = RC ( rcPS, rcThread, rcCreating, rcMemory, rcExhausted );
+            else
+            {
+                int status;
+
+                /* finish constructing thread */
+                t -> run = run_thread;
+                t -> data = data;
+                atomic32_set ( & t -> waiting, 0 );
+                atomic32_set ( & t -> refcount, 2 );
+                t -> rc = 0;
+                t -> join = true;
+
+                /* attempt to create thread */
+                status = pthread_create ( & t -> thread, 0, KThreadRun, t );
+                if ( status == 0 )
+                {
+                    * tp = t;
+                    return 0;
+                }
+
+                /* see why we failed */
+                switch ( status )
+                {
+                case EAGAIN:
+                    rc = RC ( rcPS, rcThread, rcCreating, rcThread, rcExhausted );
+                    break;
+                default:
+                    rc = RC ( rcPS, rcThread, rcCreating, rcNoObj, rcUnknown );
+                }
+
+                free ( t );
+            }
+        }
+
+        * tp = NULL;
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC KThreadAddRef ( const KThread *cself )
+{
+    if ( cself != NULL )
+        atomic32_inc ( & ( ( KThread* ) cself ) -> refcount );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KThreadRelease ( const KThread *cself )
+{
+    KThread *self = ( KThread* ) cself;
+    if ( cself != NULL )
+    {
+        if ( atomic32_dec_and_test ( & self -> refcount ) )
+            return KThreadWhack ( self );
+    }
+    return 0;
+}
+
+
+/* Cancel
+ *  signal the thread to finish
+ */
+LIB_EXPORT rc_t CC KThreadCancel ( KThread *self )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcThread, rcSignaling, rcSelf, rcNull );
+
+    status = pthread_cancel ( self -> thread );
+    switch ( status )
+    {
+    case 0:
+        break;
+    case ESRCH:
+        self -> join = false;
+        return RC ( rcPS, rcThread, rcSignaling, rcThread, rcDestroyed );
+    default:
+        return RC ( rcPS, rcThread, rcSignaling, rcNoObj, rcUnknown );
+    }
+
+    return 0;
+}
+
+
+/* Wait
+ *  waits for a thread to exit
+ *
+ *  "status" [ OUT ] - return parameter for thread's exit code
+ */
+LIB_EXPORT rc_t CC KThreadWait ( KThread *self, rc_t *out )
+{
+    void *td;
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcThread, rcWaiting, rcSelf, rcNull );
+
+    /* prevent multiple waiters */
+    if ( atomic32_test_and_set ( & self -> waiting, 0, 1 ) != 0 )
+        return RC ( rcPS, rcThread, rcWaiting, rcThread, rcBusy );
+
+    status = pthread_join ( self -> thread, & td );
+
+    /* release waiter lock */                                                                                                                                                                                   
+    atomic32_set ( & self -> waiting, 0 );
+
+    switch ( status )
+    {
+    case 0:
+        break;
+    case ESRCH:
+        return RC ( rcPS, rcThread, rcWaiting, rcThread, rcDestroyed );
+    case EINVAL:
+        return RC ( rcPS, rcThread, rcWaiting, rcThread, rcDetached );
+    case EDEADLK:
+        return RC ( rcPS, rcThread, rcWaiting, rcThread, rcDeadlock );
+    default:
+        return RC ( rcPS, rcThread, rcWaiting, rcNoObj, rcUnknown );
+    }
+
+    self -> join = false;
+
+    if ( td == PTHREAD_CANCELED )
+        self -> rc = RC ( rcPS, rcThread, rcWaiting, rcThread, rcCanceled );
+
+    if ( out != NULL )
+        * out = self -> rc;
+
+    return 0;
+}
+
+
+/* Detach
+ *  allow thread to run independently of group
+ */
+LIB_EXPORT rc_t CC KThreadDetach ( KThread *self )
+{
+    int status;
+
+    if ( self == NULL )
+        return RC ( rcPS, rcThread, rcDetaching, rcSelf, rcNull );
+
+    status = pthread_detach ( self -> thread );
+    switch ( status )
+    {
+    case 0:
+    case EINVAL:
+        break;
+    case ESRCH:
+        return RC ( rcPS, rcThread, rcDetaching, rcThread, rcDestroyed );
+    default:
+        return RC ( rcPS, rcThread, rcDetaching, rcNoObj, rcUnknown );
+    }
+
+    self -> join = false;
+    return 0;
+}
diff --git a/libs/kproc/unix/systimeout.c b/libs/kproc/unix/systimeout.c
new file mode 100644
index 0000000..64c23e5
--- /dev/null
+++ b/libs/kproc/unix/systimeout.c
@@ -0,0 +1,128 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sysalloc.h>
+#include <kproc/timeout.h>
+#include <os-native.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+
+
+/*--------------------------------------------------------------------------
+ * timeout_t
+ *  a structure for communicating a timeout
+ *  which under Unix converts to an absolute time once prepared
+ */
+
+
+/* Init
+ *  initialize a timeout in milliseconds
+ */
+LIB_EXPORT rc_t TimeoutInit ( timeout_t *tm, uint32_t msec )
+{
+    if ( tm == NULL )
+        return RC ( rcPS, rcTimeout, rcConstructing, rcSelf, rcNull );
+
+    tm -> mS = msec;
+    tm -> prepared = false;
+
+    return 0;
+}
+
+/* Prepare
+ *  ensures that a timeout is prepared with an absolute value
+*/
+LIB_EXPORT rc_t TimeoutPrepare ( timeout_t *self )
+{
+    if ( self == NULL )
+        return RC ( rcPS, rcTimeout, rcUpdating, rcSelf, rcNull );
+
+    if ( ! self -> prepared )
+    {
+        struct timeval tv;
+        struct timezone tz;
+        int64_t abs_micros;
+
+        /* current time in seconds and uS */
+        gettimeofday ( & tv, & tz );
+    
+        /* convert to uS */
+        abs_micros = tv . tv_sec;
+        abs_micros = abs_micros * 1000 * 1000 + tv . tv_usec;
+    
+        /* add wait period for future timeout */
+        abs_micros += ( uint64_t ) self -> mS * 1000;
+    
+        /* convert to seconds and nS */
+        self -> ts . tv_sec = ( time_t ) ( abs_micros / 1000000 );
+        self -> ts . tv_nsec = ( uint32_t ) ( ( abs_micros % 1000000 ) * 1000 );
+        self -> prepared = true;
+    }
+
+    return 0;
+}
+
+/* Remaining
+ *  ask how many milliseconds remain before timeout expires
+ */
+LIB_EXPORT uint32_t TimeoutRemaining ( timeout_t * self )
+{
+    struct timeval tv;
+    struct timezone tz;
+    int64_t cur_micros, end_micros;
+
+    if ( self == NULL )
+        return 0;
+
+    /* expect timeout to be prepared, but if it isn't
+       prepare it so that use within a loop eventually terminates */
+    if ( ! self -> prepared )
+    {
+        /* prepare an absolute timeout */
+        TimeoutPrepare ( self );
+
+        /* return the entire timeout */
+        return self -> mS;
+    }
+
+    /* current time in seconds and uS */
+    gettimeofday ( & tv, & tz );
+    
+    /* convert to uS */
+    cur_micros = tv . tv_sec;
+    cur_micros = cur_micros * 1000 * 1000 + tv . tv_usec;
+
+    /* capture end time in uS */
+    end_micros = self -> ts . tv_sec;
+    end_micros = end_micros * 1000 * 1000 + ( ( self -> ts . tv_nsec + 500 ) / 1000 );
+
+    /* never return negative */
+    if ( cur_micros >= end_micros )
+        return 0;
+
+    /* return positive difference as mS - truncated */
+    return ( end_micros - cur_micros ) / 1000;
+}
diff --git a/libs/krypto/.gitignore b/libs/krypto/.gitignore
new file mode 100644
index 0000000..4525e83
--- /dev/null
+++ b/libs/krypto/.gitignore
@@ -0,0 +1,2 @@
+*.list
+
diff --git a/libs/krypto/Makefile b/libs/krypto/Makefile
new file mode 100644
index 0000000..11e16ec
--- /dev/null
+++ b/libs/krypto/Makefile
@@ -0,0 +1,297 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: all
+
+USE_GCC_IF_ICC = 1
+
+TOP ?= $(abspath ../..)
+MODULE = libs/krypto
+
+INT_LIBS = \
+	libkrypto
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(KRYPTO_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+ifeq ($(OS),linux)
+	INT_LIBS += libkryptotest
+	OBJFILES += $(KRYPTOTEST_OBJ)
+endif
+
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+# This differs from other sister Makefiles in needing three other symbols defined
+# VEC_SUPPORTED, VECREG_SUPPORTED and AESNI_SUPPORTED
+# The successive symbols are additive
+# In order they are the compiler supports  the vector 'container' type,
+# the processor has supported vector registers
+# the processor supports the Intel AES-NI instruction set
+#
+# The prerequisite call to make compiler-test will have tried to compile objects
+# that show such support if the objec can be made
+all std: makedirs compiler-test compile
+	@ $(MAKE_CMD) \
+		VEC_SUPPORTED=$(shell if test -f $(OBJDIR)/compile-test.vec.$(LOBX) ; then echo "true"; else echo "false" ; fi) \
+		VECREG_SUPPORTED=$(shell if test -f $(OBJDIR)/compile-test.vecreg.$(LOBX) ; then echo "true"; else echo "false" ; fi) \
+		AESNI_SUPPORTED=$(shell if test -f $(OBJDIR)/compile-test.aes-ni.$(LOBX) ; then echo "true"; else echo "false" ; fi) \
+		$(TARGDIR)/std || \
+	( echo "reattempting without AES-NI instructions"; \
+	  $(MAKE_CMD) \
+		VEC_SUPPORTED=$(shell if test -f $(OBJDIR)/compile-test.vec.$(LOBX) ; then echo "true"; else echo "false" ; fi) \
+		VECREG_SUPPORTED=$(shell if test -f $(OBJDIR)/compile-test.vecreg.$(LOBX) ; then echo "true"; else echo "false" ; fi) \
+		AESNI_SUPPORTED=false \
+		$(TARGDIR)/std ) || \
+	( echo "reattempting without vector register instructions"; \
+	  $(MAKE_CMD) \
+		VEC_SUPPORTED=$(shell if test -f $(OBJDIR)/compile-test.vec.$(LOBX) ; then echo "true"; else echo "false" ; fi) \
+		VECREG_SUPPORTED=false \
+		AESNI_SUPPORTED=false \
+		$(TARGDIR)/std ) || \
+	( echo "reattempting without vector instructions"; \
+	  $(MAKE_CMD) \
+		VEC_SUPPORTED=false \
+		VECREG_SUPPORTED=false \
+		AESNI_SUPPORTED=false \
+		$(TARGDIR)/std )
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+#	@echo VEC_SUPPORTED $(VEC_SUPPORTED)
+#	@echo VECREG_SUPPORTED $(VECREG_SUPPORTED)
+#	@echo AESNI_SUPPORTED $(AESNI_SUPPORTED)
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# compiler-test
+#
+.PHONY: compiler-test $(TARGDIR)/compiler-test
+
+# Silently try to compile three objects
+compiler-test : makedirs
+	@ $(MAKE_CMD) -i $(TARGDIR)/compiler-test >/dev/null 2>/dev/null
+
+
+COMPILE_TEST_SRC = \
+	compile-test.vec \
+	compile-test.vecreg \
+	compile-test.aes-ni
+
+COMPILE_TEST_OBJ = \
+	$(addsuffix .$(LOBX),$(COMPILE_TEST_SRC))
+
+$(TARGDIR)/compiler-test : $(COMPILE_TEST_OBJ)
+	@echo VEC_SUPPORTED $(VEC_SUPPORTED)
+	@echo VECREG_SUPPORTED $(VECREG_SUPPORTED)
+	@echo AESNI_SUPPORTED $(AESNI_SUPPORTED)
+
+#-------------------------------------------------------------------------------
+# define some additional compiler flags for special object file types
+# currently only gcc is supported and it turns out only with 4.4.0 and up
+# though other compilers could also be supported
+ifeq ($(COMP),gcc)
+CC_LISTING = -Wa,-ahlms=$(<D)/$(@F).list
+_CC_AES_NI  = -funsafe-math-optimizations -mmmx -msse -msse2 -msse3 -mssse3 -msse4.1 -maes -Wa,-march=generic64+aes $(CC_LISTING)
+_CC_VECREG  = -funsafe-math-optimizations -mmmx -msse -msse2 -msse3 -mssse3 -msse4.1 -Wa,-march=generic64+sse4 $(CC_LISTING)
+_CC_VEC     = $(CC_LISTING)
+else
+_CC_LISTING =
+_CC_AES_NI  =
+_CC_VECREG  =
+_CC_VEC     =
+endif
+
+ifeq ($(VEC_SUPPORTED),true)
+CC_VEC = $(_CC_VEC)
+else
+CC_VEC =
+endif
+
+ifeq ($(VECREG_SUPPORTED),true)
+CC_VECREG = $(_CC_VECREG)
+else
+CC_VECREG = 
+endif
+
+ifeq ($(AESNI_SUPPORTED),true)
+CC_AES_NI = $(_CC_AES_NI)
+else
+CC_AES_NI = 
+endif
+
+# Rules for making objects using compiler vectors
+compile-test.vec.pic.o : compile-test.c
+	@ echo +++++ Making $@ using its own rule
+	@ echo $@ $(_CC_VEC)
+	$(CC) -o $@ -fPIC $(OPT) -D_LIBRARY -DUSEVEC $(_CC_VEC) $<
+
+
+%.vec.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) -D_LIBRARY -DUSEVEC $(CC_VEC) $<
+
+
+# Rules for making objects using vectors in registers
+compile-test.vecreg.pic.o : compile-test.c
+	@ echo +++++ Making $@ using its own rule
+	@ echo $@ $(_CC_VECREG)
+	$(CC) -o $@ -fPIC $(OPT) -D_LIBRARY -DUSEVEC -DUSEVECREG $(_CC_VECREG) $<
+
+%.vecreg.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) -D_LIBRARY -DUSEVEC -DUSEVECREG $(CC_VECREG) $<
+
+
+# Rules for making objects using AES-NI extensions vectors in registers
+compile-test.aes-ni.pic.o : compile-test.c
+	@ echo +++++ Making $@ using its own rule
+	@ echo $@ $(_CC_AES_NI)
+	$(CC) -o $@ -fPIC $(OPT) -D_LIBRARY -DUSEVEC -DUSEVECREG -DUSEAESNI $(_CC_AES_NI) $<
+
+%.aes-ni.$(LOBX): %.c
+	$(CC) -o $@ -fPIC $(OPT) -D_LIBRARY -DUSEVEC -DUSEVECREG -DUSEAESNI $(CC_AES_NI) $<
+
+
+
+#-------------------------------------------------------------------------------
+# krypto
+#
+$(ILIBDIR)/libkrypto: $(addprefix $(ILIBDIR)/libkrypto.,$(ILIBEXT))
+
+ALL_LIB_SRC = \
+	ciphermgr \
+	wgaencrypt \
+	encfile \
+	encfilev2 \
+	cipher \
+	aes_core \
+	aes-byte \
+	cipher-byte \
+	key \
+	reencfile
+
+LIB_SRC = \
+	no-null-ncbi
+
+TEST_LIB_SRC =  \
+	testcipher
+
+ifeq ($(VEC_SUPPORTED),true)
+ALL_LIB_SRC += \
+	cipher-vec.vec \
+	aes-ncbi.vec
+LIB_SRC += \
+	no-null-ncbi.vec
+TEST_LIB_SRC += 
+else
+ALL_LIB_SRC += \
+	cipher-no-vec.vec
+LIB_SRC += \
+	no-null-ncbi.vec
+TEST_LIB_SRC += 
+endif
+
+ifeq ($(VECREG_SUPPORTED),true)
+ALL_LIB_SRC += \
+	cipher-vec.vecreg \
+	aes-ncbi.vecreg
+LIB_SRC += \
+	no-null-ncbi.vecreg
+TEST_LIB_SRC += 
+else
+ALL_LIB_SRC += \
+	cipher-no-vec.vecreg
+LIB_SRC += \
+	no-null-ncbi.vecreg
+TEST_LIB_SRC += 
+endif
+
+ifeq ($(AESNI_SUPPORTED),true)
+ALL_LIB_SRC += \
+	cipher-vec.aes-ni \
+	aes-ncbi.aes-ni
+LIB_SRC += \
+	no-null-ncbi.aes-ni
+TEST_LIB_SRC += 
+else
+ALL_LIB_SRC += \
+	cipher-no-vec.aes-ni
+LIB_SRC += \
+	no-null-ncbi.aes-ni
+TEST_LIB_SRC += 
+endif
+
+
+KRYPTO_SRC = $(ALL_LIB_SRC) $(LIB_SRC)
+
+KRYPTO_OBJ = \
+	$(addsuffix .$(LOBX),$(KRYPTO_SRC))
+
+KRYPTO_LIB = \
+
+$(ILIBDIR)/libkrypto.$(LIBX): $(KRYPTO_OBJ)
+	$(LD) --slib -o $@ $^ $(KRYPTO_LIB)
+
+
+#-------------------------------------------------------------------------------
+# kryptotest
+#
+
+$(ILIBDIR)/libkryptotest: $(addprefix $(ILIBDIR)/libkryptotest.,$(ILIBEXT))
+
+KRYPTOTEST_SRC = $(TEST_LIB_SRC)
+
+KRYPTOTEST_OBJ = \
+	$(addsuffix .$(LOBX),$(KRYPTOTEST_SRC))
+
+KRYPTOTEST_LIB = \
+
+$(ILIBDIR)/libkryptotest.$(LIBX): $(KRYPTOTEST_OBJ)
+	$(LD) --slib -o $@ $^ $(KRYPTOTEST_LIB)
+
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/krypto/aes-byte.c b/libs/krypto/aes-byte.c
new file mode 100644
index 0000000..29e104b
--- /dev/null
+++ b/libs/krypto/aes-byte.c
@@ -0,0 +1,236 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <krypto/extern.h>
+#include <klib/defs.h>
+
+#include "aes-priv.h"
+#include "cipher-priv.h"
+
+#include <klib/rc.h>
+
+#include <string.h>
+#include <assert.h>
+
+
+/* instantiate for class functions that use the VT */
+#define BLOCKCIPHER_BYTE_IMPL KAESBlockCipherByte
+#include "blockcipher-impl.h"
+
+static const char KAESByteBlockCipherClassName[] = "KAESCipherByte";
+
+static
+void KAESBlockCipherByteDestroy (const KAESBlockCipherByte * self)
+{
+    /* we use a constant object */
+}
+
+
+static
+uint32_t KAESBlockCipherByteBlockSize ()
+{
+    return AES_BLOCK_SIZE;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KeySize
+ *   How large is the stored key for this cipher?  Not the user key used
+ *   to create this key (key schedule)
+ *
+ *   This is needed by KCipher to know how large the KCipher objecr is at
+ *   allocation and to know how much of a buffer each decryption/encryption is
+ */
+static
+uint32_t KAESBlockCipherByteKeySize ()
+{
+    return  (uint32_t)sizeof (AES_KEY);
+}
+
+
+/* ----------------------------------------------------------------------
+ * SetEncryptKey
+ *   The KCipher calls this to have the block cipher build an encryption
+ *   key in the KCipher object
+ *
+ */
+static
+rc_t KAESBlockCipherByteSetEncryptKey (void * encrypt_key,
+                                       const char * user_key,
+                                       uint32_t user_key_size)
+{
+    int iii;
+    rc_t rc;
+
+    assert (encrypt_key);
+    assert (user_key);
+    assert (user_key_size != 0);
+
+    iii = AES_set_encrypt_key((const unsigned char *)user_key,
+                              (int)user_key_size * 8,
+                              encrypt_key);
+    if (iii == 0)
+        rc = 0;
+    else
+    {
+        switch (iii)
+        {
+        default: /* not in the code when this was written */
+            rc = RC (rcKrypto, rcCipher, rcUpdating, rcEncryptionKey, rcUnknown);
+            break;
+
+        case -1: /* bad parameters */
+            rc = RC (rcKrypto, rcCipher, rcUpdating, rcParam, rcInvalid);
+            break;
+
+        case -2: /* bad bit count */
+            rc = RC (rcKrypto, rcCipher, rcUpdating, rcParam, rcIncorrect);
+            break;
+        }
+        memset (encrypt_key, 0, sizeof (AES_KEY));
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * SetDecryptKey
+ *   The KCipher calls this to have the block cipher build an decryption
+ *   key in the KCipher object
+ *
+ */
+static
+rc_t KAESBlockCipherByteSetDecryptKey (void * decrypt_key,
+                                       const char * user_key,
+                                       uint32_t user_key_size)
+{
+    int iii;
+    rc_t rc;
+
+    assert (decrypt_key);
+    assert (user_key);
+    assert (user_key_size != 0);
+
+    iii = AES_set_decrypt_key((const unsigned char *)user_key, (int)user_key_size * 8,
+                              decrypt_key);
+    if (iii == 0)
+        rc = 0;
+    else
+    {
+        switch (iii)
+        {
+        default: /* not in the code when this was written */
+            rc = RC (rcKrypto, rcCipher, rcUpdating, rcEncryptionKey, rcUnknown);
+            break;
+
+        case -1: /* bad parameters */
+            rc = RC (rcKrypto, rcCipher, rcUpdating, rcParam, rcInvalid);
+            break;
+
+        case -2: /* bad bit count */
+            rc = RC (rcKrypto, rcCipher, rcUpdating, rcParam, rcIncorrect);
+            break;
+        }
+        memset (decrypt_key, 0, sizeof (AES_KEY));
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Encrypt
+ *
+ *   Perform an encryption of a single block.  Chained modes and stream
+ *   cipher modes will call this multiple times.
+ *
+ */
+static
+void KAESBlockCipherByteEncrypt (const CipherBlock in,
+                                 CipherBlock out,
+                                 const void * key)
+{
+    assert (in);
+    assert (out);
+    assert (key);
+
+    AES_encrypt ((const uint8_t*)in, (uint8_t*)out, key);
+}
+
+
+/* ----------------------------------------------------------------------
+ * Decrypt
+ *
+ *   Perform a decryption of a single block.  Chained modes and stream
+ *   cipher modes will call this multiple times.
+ *
+ */
+static
+void KAESBlockCipherByteDecrypt (const CipherBlock in,
+                                 CipherBlock out,
+                                 const void * key)
+{
+    assert (in);
+    assert (out);
+    assert (key);
+
+    AES_decrypt ((const uint8_t*)in, (uint8_t*)out, key);
+}
+
+
+static const struct
+KBlockCipherByte_vt_v1 aes_vt = 
+{
+    /* .version */
+    { 1, 0 },
+
+    KAESBlockCipherByteDestroy,
+
+    KAESBlockCipherByteBlockSize,
+    KAESBlockCipherByteKeySize,
+
+    KAESBlockCipherByteSetEncryptKey,
+    KAESBlockCipherByteSetDecryptKey,
+
+    KAESBlockCipherByteEncrypt,
+    KAESBlockCipherByteDecrypt
+};
+
+
+rc_t KAESBlockCipherByteMake (KBlockCipherByte ** pobj)
+{
+    rc_t rc;
+
+    if (pobj == NULL)
+        rc = RC (rcKrypto, rcBlockCipher, rcConstructing, rcSelf, rcNull);
+
+    else
+    {
+        rc = 0;
+        *pobj = (KBlockCipherByte*)&aes_vt;
+    }
+    return rc;
+}
+
+/* EOF */
+
diff --git a/libs/krypto/aes-impl.c b/libs/krypto/aes-impl.c
new file mode 100644
index 0000000..328ba6d
--- /dev/null
+++ b/libs/krypto/aes-impl.c
@@ -0,0 +1 @@
+#error "Obsolete do not use"
diff --git a/libs/krypto/aes-ncbi-ni.c b/libs/krypto/aes-ncbi-ni.c
new file mode 100644
index 0000000..a139771
--- /dev/null
+++ b/libs/krypto/aes-ncbi-ni.c
@@ -0,0 +1,2 @@
+#error "Obsolete do not use"
+
diff --git a/libs/krypto/aes-ncbi-priv.h b/libs/krypto/aes-ncbi-priv.h
new file mode 100644
index 0000000..5738029
--- /dev/null
+++ b/libs/krypto/aes-ncbi-priv.h
@@ -0,0 +1,227 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#ifndef _h_krypto_aes_ncbi_priv_libs_
+#define _h_krypto_aes_ncbi_priv_libs_
+
+#include <klib/defs.h>
+#include <v128.h>
+
+#include "ncbi-priv.h"
+#include "cipher-impl.h"
+#include "blockcipher-impl.h"
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+
+/* ======================================================================
+ * FIPS-197 2.1
+ */
+#define AES_BLOCK_BITS (128)
+#define AES_BLOCK_BYTES (AES_BLOCK_BITS/8)
+
+
+/* ======================================================================
+ * FIPS-197 3,4 - 3.5
+ *
+ * FIPS-197 defines Nk as number of 32-bit words in the user key
+ */
+#define AES_Nk_128 (4)
+#define AES_Nk_192 (6)
+#define AES_Nk_256 (8)
+
+
+/*
+ * FIPS-197 defines Nb as number of 32-bit words in the cipher block
+ *
+ * There is much odd naming in the document from the perspective of a software
+ * engineer.
+ */
+#define AES_Nb (4)
+#define AES_Nb_128 (AES_Nb)
+#define AES_Nb_192 (AES_Nb)
+#define AES_Nb_256 (AES_Nb)
+
+
+/* 
+ * FIPS-197 defines Nr as the number of rounds for a cipher of a given original 
+ * user key length.
+ *
+ * Another odd naming as it is really the zero based highest round offset
+ * as 1 first round + Nr-1 middle rounds + 1 last round are performed for
+ * each encrypt or decrypt block.  There are thus Nr + 1 round keys needed
+ * in the encryption and decryption key schedules
+ */
+#define AES_Nr_128 (10)
+#define AES_Nr_192 (12)
+#define AES_Nr_256 (14)
+#define AES_Nr_MAX (15)
+
+/* Most useful for testingg against Appendix A-C of the FIPS-197 document */
+#define DEBUG_OBJECT(msg) DBGMSG(DBG_AES,DBG_FLAG(DBG_AES_OBJECT), msg)
+#define DEBUG_KEYEXP(msg) DBGMSG(DBG_AES,DBG_FLAG(DBG_AES_KEYEXP), msg)
+#define DEBUG_CIPHER(msg) DBGMSG(DBG_AES,DBG_FLAG(DBG_AES_CIPHER), msg)
+#define DEBUG_INVKEYEXP(msg) DBGMSG(DBG_AES,DBG_FLAG(DBG_AES_INVKEYEXP), msg)
+#define DEBUG_INVCIPHER(msg) DBGMSG(DBG_AES,DBG_FLAG(DBG_AES_INVCIPHER), msg)
+
+#define DEBUG_CIPHER_MVECTOR(M,v)                                   \
+    DBGMSG(DBG_AES,DBG_FLAG(DBG_AES_CIPHER),                        \
+           ("%s:\t%0.8x %0.8x %0.8x %0.8x\n",M,                     \
+            v.columns[0],v.columns[1],v.columns[2],v.columns[3]))
+#define DEBUG_INVCIPHER_MVECTOR(M,v)                                \
+    DBGMSG(DBG_AES,DBG_FLAG(DBG_AES_INVCIPHER),                     \
+           ("%s:\t%0.8x %0.8x %0.8x %0.8x\n",M,                     \
+            v.columns[0],v.columns[1],v.columns[2],v.columns[3]))
+
+#if _DEBUGGING
+#if 1
+#define DEBUG_CIPHER_VECTOR(M,V)                        \
+    {                                                   \
+        CipherVec_AES_u v; v.state = V;                 \
+        DBGMSG(DBG_AES,DBG_FLAG(DBG_AES_CIPHER),        \
+               ("%s:\t%0.8x %0.8x %0.8x %0.8x\n", M,    \
+                bswap_32(v.columns[0]),                 \
+                bswap_32(v.columns[1]),                 \
+                bswap_32(v.columns[2]),                 \
+                bswap_32(v.columns[3])));               \
+            }
+#define DEBUG_INVCIPHER_VECTOR(M,V)                     \
+    {                                                   \
+        CipherVec_AES_u v; v.state = V;                 \
+        DBGMSG(DBG_AES,DBG_FLAG(DBG_AES_INVCIPHER),     \
+               ("%s:\t%0.8x %0.8x %0.8x %0.8x\n", M,    \
+                bswap_32(v.columns[0]),                 \
+                bswap_32(v.columns[1]),                 \
+                bswap_32(v.columns[2]),                 \
+                bswap_32(v.columns[3])));               \
+            }
+#else
+#define DEBUG_CIPHER_VECTOR(M,v)                              \
+    KOutMsg ( "%s:\t%0.8x %0.8x %0.8x %0.8x\n", M,            \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[0]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[1]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[2]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[3]))
+#define DEBUG_INVCIPHER_VECTOR(M,v)                           \
+    KOutMsg ( "%s:\t%0.8x %0.8x %0.8x %0.8x\n", M,            \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[0]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[1]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[2]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[3]))
+#endif
+#define DDEBUG_CIPHER_VECTOR(M,v)                             \
+    KOutMsg ( "%s:\t%0.8x %0.8x %0.8x %0.8x\n", M,            \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[0]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[1]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[2]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[3]))
+#define DDEBUG_INVCIPHER_VECTOR(M,v)                          \
+    KOutMsg ( "%s:\t%0.8x %0.8x %0.8x %0.8x\n", M,            \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[0]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[1]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[2]), \
+              bswap_32(((CipherVec_AES_u*)&(v))->columns[3]))
+
+#else
+#define DEBUG_CIPHER_VECTOR(M,V)
+#define DEBUG_INVCIPHER_VECTOR(M,V)
+#endif
+
+/* -----
+ * 8 and 32 bit unsigned integers
+ */
+typedef uint8_t  AESByte;
+typedef uint32_t AESWord;
+typedef union AESColumn AESColumn;
+union AESColumn
+{
+    AESWord word;
+    AESByte bytes [sizeof(AESWord)];
+};
+
+
+/* -----
+ * 128 byte block in various forms
+ */
+typedef AESByte AESBlock [AES_Nb*sizeof(AESWord)];
+
+typedef v128_u8_t  CipherVecByte;
+typedef v128_u32_t CipherVecWord;
+
+
+typedef struct AESKeySchedule  AESKeySchedule;
+struct AESKeySchedule
+{
+    CipherVec round_keys [AES_Nr_MAX];
+    uint32_t number_of_rounds;
+};
+
+/* ======================================================================
+ * FIPS-197 3,4 - 3.5
+ *
+ * An AES State is the same size as the cipher block size.
+ * They are eaither 4 columns of 32 bits or 16 individual bytes.
+ * The columns can be accessed by their individual bytes s0
+ * there are 4X32, 4X4X8 or 16X8 bits in a state.
+ */
+typedef union
+{
+    CipherVec   state;
+    uint64_t    u64     [AES_Nb/2];
+    AESWord     columns [AES_Nb];
+    AESByte     bytes   [AES_Nb * sizeof (AESWord)];
+    AESByte     grid    [AES_Nb][sizeof (AESWord)];
+} CipherVec_AES_u;
+
+
+typedef union
+{
+    CipherVec   state;
+    v128_u32_t columns;
+} CipherVec_uu __attribute__ ((aligned(16)));
+
+/* 
+ * KCipher with 128 bit alignment.
+ */
+typedef struct CipherAes CipherAes;
+struct CipherAes
+{
+    KCipher dad;
+    AESKeySchedule e_key;
+    AESKeySchedule d_key;
+    CipherVec    e_ivec;
+    CipherVec    d_ivec;
+};
+
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif /* #ifndef _h_krypto_aes_ncbi_priv_libs_ */
+
+
diff --git a/libs/krypto/aes-ncbi.c b/libs/krypto/aes-ncbi.c
new file mode 100644
index 0000000..8ee5ff7
--- /dev/null
+++ b/libs/krypto/aes-ncbi.c
@@ -0,0 +1,2641 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+
+#include <krypto/extern.h>
+
+#include "ncbi-priv.h"
+#include "aes-ncbi-priv.h"
+#include "cipher-priv.h"
+#include "blockcipher-priv.h"
+
+#include <klib/debug.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+
+#include <byteswap.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <sysalloc.h>
+
+#if USE_VEC
+#include <cpuid.h>
+#endif
+
+#if USE_VECREG
+#include <v128.h>
+#endif
+
+/*
+ * This implements the AES cipher as defined by FIPS-197 from NIST
+ *  
+ * Notes on implmentation:
+ *
+ * NOTE:
+ * Byte ordering in AES is not critical but unllike the original implmentation
+ * bytes are not re-ordered to a big endian order upon reading them in and this
+ * code will expect to run on an Intel/AMD type processor and might have issues
+ * on some big endian processors.
+ *
+ * NOTE:
+ * Many functions are written as static inline functions to
+ * facilitate GCC type assembly language optimization on various processors
+ *
+ * NOTE:
+ * This implements the Equivalent Inverse Cipher not the Inverse Cipher.  In
+ * general functions will match those defined in the FIPS-197 document where they
+ * do not get optimized away for Intel/AMD XMM registers and AES-NI instructions.
+ *
+ * NOTE:
+ * C-99 types are used for specific sized types.  An unaddornded unsigned type
+ * is used for many index type variables to allow the compiler choice in
+ * size where size does not matter very much.  As these index variables do
+ * not go above 16 any size would do but the compiler can choose the size most
+ * suited for array subscripting.
+ */
+
+static const
+CipherVec vec_00 =  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+static const
+CipherVec vec_01 =  { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+                      0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
+
+static const
+CipherVec vec_0F =  { 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+                      0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F };
+
+static const
+CipherVec vec_10 =  { 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+                      0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 };
+
+
+
+/* ======================================================================
+ * These functions implment the Advanced Encryption Standard AES as defined
+ * in the FIPS (Federal Information Processing Standars Publication 197
+ * Of Nevember 26, 2001.
+ */
+
+/* ======================================================================
+ * FIPS-197 5.1
+ */
+
+/*
+ * Read a blocks worth of bytes into an CipherVec
+ *
+ * With vector registers it is a single instruction, without them it
+ * is a memmove call
+ */
+static __inline__ 
+CipherVec AESBCMEMBER(StateIn) (const void * ain)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(StateIn) (const void * ain)
+{
+#if USE_VEC_REG
+
+    register CipherVec vec;
+    __asm__ (
+        "movdqu (%[a]),%[s]" : [s] "=x" (vec) : [a] "D" (ain)
+        );
+    return vec;
+
+#else
+
+    CipherVec_AES_u u;
+    memmove (&u.bytes, ain, sizeof (u));
+    return u.state;
+
+#endif
+}
+
+
+/*
+ * Write a block's worth of bytes out from an CipherVec
+ *
+ * With vector registers it is a single instruction, without them it
+ * is a memmove call
+ */
+static __inline__
+void AESBCMEMBER(StateOut) (const CipherVec vec, void * rout)
+    __attribute__ ((always_inline));
+
+static __inline__
+void AESBCMEMBER(StateOut) (const CipherVec vec, void * rout)
+{
+#if USE_VEC_REG
+
+    register CipherVec rvec = vec;
+    __asm__ (
+        "movdqu %[s],(%[a])" : : [s] "x" (rvec), [a] "D" (rout)
+        );
+
+#else
+
+    memmove (rout, &vec, sizeof (vec));
+
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecXor) (CipherVec v1, CipherVec v2)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecXor) (CipherVec v1, CipherVec v2)
+{
+#if USE_VEC
+
+    return v1 ^ v2;
+
+#else
+
+    CipherVec_AES_u u1, u2; /* state and key not countries :) */
+    unsigned ix;
+
+    u1.state = v1;
+    u2.state = v2;
+
+    for (ix = 0; ix < AES_Nb; ++ix)
+        u1.columns[ix] ^= u2.columns[ix];
+
+    return u1.state;
+
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecAnd) (CipherVec v1, CipherVec v2)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecAnd) (CipherVec v1, CipherVec v2)
+{
+#if USE_VEC
+
+    return v1 & v2;
+
+#else
+
+    CipherVec_AES_u u1, u2; /* state and key not countries :) */
+    unsigned ix;
+
+    u1.state = v1;
+    u2.state = v2;
+
+    for (ix = 0; ix < AES_Nb; ++ix)
+        u1.columns[ix] &= u2.columns[ix];
+
+    return u1.state;
+
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecOr) (CipherVec v1, CipherVec v2)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecOr) (CipherVec v1, CipherVec v2)
+{
+#if USE_VEC
+
+    return v1 | v2;
+
+#else
+
+    CipherVec_AES_u u1, u2; /* state and key not countries :) */
+    unsigned ix;
+
+    u1.state = v1;
+    u2.state = v2;
+
+    for (ix = 0; ix < AES_Nb; ++ix)
+        u1.columns[ix] |= u2.columns[ix];
+
+    return u1.state;
+
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecAdd) (CipherVec v1, CipherVec v2)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecAdd) (CipherVec v1, CipherVec v2)
+{
+#if USE_VEC
+
+    return v1 + v2;
+
+#else
+
+    CipherVec_AES_u u1, u2; /* state and key not countries :) */
+    unsigned ix;
+
+    u1.state = v1;
+    u2.state = v2;
+
+    for (ix = 0; ix < AES_Nb; ++ix)
+        u1.columns[ix] += u2.columns[ix];
+
+    return u1.state;
+
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecSub) (CipherVec v1, CipherVec v2)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecSub) (CipherVec v1, CipherVec v2)
+{
+#if USE_VEC
+
+    return v1 - v2;
+
+#else
+
+    CipherVec_AES_u u1, u2; /* state and key not countries :) */
+    unsigned ix;
+
+    u1.state = v1;
+    u2.state = v2;
+
+    for (ix = 0; ix < AES_Nb; ++ix)
+        u1.columns[ix] -= u2.columns[ix];
+
+    return u1.state;
+
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecMul) (CipherVec v1, CipherVec v2)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecMul) (CipherVec v1, CipherVec v2)
+{
+#if USE_VEC
+
+    return v1 * v2;
+
+#else
+
+    CipherVec_AES_u u1, u2; /* state and key not countries :) */
+    unsigned ix;
+
+    u1.state = v1;
+    u2.state = v2;
+
+    for (ix = 0; ix < AES_Nb; ++ix)
+        u1.columns[ix] *= u2.columns[ix];
+
+    return u1.state;
+
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecDiv) (CipherVec v1, CipherVec v2)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecDiv) (CipherVec v1, CipherVec v2)
+{
+#if USE_VEC
+
+    return v1 / v2;
+
+#else
+
+    CipherVec_AES_u u1, u2; /* state and key not countries :) */
+    unsigned ix;
+
+    u1.state = v1;
+    u2.state = v2;
+
+    for (ix = 0; ix < AES_Nb; ++ix)
+        u1.columns[ix] /= u2.columns[ix];
+
+    return u1.state;
+
+#endif
+}
+
+static __inline__ 
+CipherVec AESBCMEMBER(PackShuffleBytes) (CipherVec dest, CipherVec mask)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(PackShuffleBytes) (CipherVec dest, CipherVec mask)
+{
+#if USE_VEC_REG
+
+    return op_PSHUFB128 (dest, mask);
+
+#else
+
+    CipherVec_AES_u out, in, gate;
+    unsigned ix;
+
+    in.state = dest;
+    gate.state = mask;
+
+    for (ix = 0; ix < sizeof dest; ++ix)
+    {
+        if (gate.bytes[ix] & 0x80)
+            out.bytes[ix] = 0;
+        else
+            out.bytes[ix] = in.bytes[gate.bytes[ix] & 0x0F];
+    }
+
+    return out.state;
+
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecSLLBI) (CipherVec v, const int k)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecSLLBI) (CipherVec v, const int k)
+{
+#if USE_VEC_REG
+    static const CipherVec sl_mask [9] = 
+        {
+            { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+              0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+            { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
+              0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE },
+            { 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+              0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC },
+            { 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
+              0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8 },
+            { 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+              0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 },
+            { 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
+              0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0 },
+            { 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+              0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0 },
+            { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+              0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 },
+            { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+        };
+    CipherVec vv = v;
+
+    assert (k <= 8);
+    
+
+/*     DEBUG_CIPHER_VECTOR ("mask", sl_mask[k]); */
+/*     DEBUG_CIPHER_VECTOR ("v 1", vv); */
+    vv = op_PSLLDI128 (vv, k);
+/*     DEBUG_CIPHER_VECTOR ("v 2", vv); */
+    vv = AESBCMEMBER(VecAnd) (vv, sl_mask[k]);
+/*     DEBUG_CIPHER_VECTOR ("v 3", vv); */
+    return vv;
+
+#else
+
+    CipherVec_AES_u vv; /* state and key not countries :) */
+    unsigned ix;
+
+    vv.state = v;
+
+    for (ix = 0; ix < sizeof (v); ++ix)
+    {
+        KOutMsg ("SLLBI %d %x ", k, vv.bytes[ix]);
+        vv.bytes[ix] <<= k;
+        KOutMsg ("%x\n", vv.bytes[ix]);
+    }
+    return vv.state;
+
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecSRLBI) (CipherVec v, const int k)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(VecSRLBI) (CipherVec v, const int k)
+{
+#if USE_VEC_REG
+    static const CipherVec sr_mask [9] = 
+        {
+            { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+              0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+            { 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
+              0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F },
+            { 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
+              0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F },
+            { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
+              0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F },
+            { 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+              0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F },
+            { 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+              0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07 },
+            { 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+              0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 },
+            { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+              0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
+            { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+        };
+
+    v = op_PSRLDI128 (v, k);
+    v = AESBCMEMBER(VecAnd) (v, sr_mask[(k<8)?k:8]);
+    return v;
+
+#else
+
+    CipherVec_AES_u vv; /* state and key not countries :) */
+    unsigned ix;
+
+    vv.state = v;
+
+    for (ix = 0; ix < sizeof (v); ++ix)
+    {
+        KOutMsg ("SRLBI %d %x ", k, vv.bytes[ix]);
+        vv.bytes[ix] >>= k;
+        KOutMsg ("%x\n", vv.bytes[ix]);
+    }
+    return vv.state;
+
+#endif
+}
+
+
+static __inline__
+CipherVec AESBCMEMBER(SetColumn) (CipherVec state, AESWord column, const int which)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(SetColumn) (CipherVec state, AESWord column, const int which)
+{
+#if USE_VEC_REG
+    state = op_PINSRUD (state, column, which);
+#else
+    CipherVec_AES_u u;
+    u.state = state;
+    u.columns [which] = column;
+    state = u.state;
+#endif
+    return state;
+}
+
+
+/* ======================================================================
+ * FIPS-197 5.1.4
+ *
+ * The AddRoundKey transformation is a sinple exclusive or of all 128 bits
+ * in the current block against a round key.  This operation is used in all
+ * Cipher and EqInvCipher rounds
+ *
+ * With vector types it is a single operation that with vector registers is
+ * a single op-code.
+ */
+static __inline__ 
+CipherVec AESBCMEMBER(AddRoundKey) (CipherVec state, CipherVec round_key)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(AddRoundKey) (CipherVec state, CipherVec round_key)
+{
+    return AESBCMEMBER(VecXor) (state, round_key);
+}
+
+
+/* ======================================================================
+ * FIPS-197 5.1.2
+ *
+ * FIPS 197 describes the state in column major format
+ * while C and assembly programmers tend to think in row major
+ * The byte order is 0,1,2,3,,...F as shown in the first diagram.
+ *
+ *  ShiftRows() is defined as leaving this state
+ * +---+---+---+---+     +---+---+---+---+
+ * | 0 | 4 | 8 | C |     | 0 | 4 | 8 | C |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 1 | 5 | 9 | D |     | 5 | 9 | D | 1 |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 2 | 6 | A | E |     | A | E | 2 | 6 |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 3 | 7 | B | F |     | F | 3 | 7 | B |
+ * +---+---+---+---+     +---+---+---+---+
+ */
+static __inline__
+CipherVec AESBCMEMBER(ShiftRows) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(ShiftRows) (CipherVec state)
+{
+static const
+    CipherVec ShiftRowTable
+    /*   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 */
+    = {  0,  5, 10, 15,  4,  9, 14,  3,  8, 13,  2,  7, 12,  1,  6, 11 };
+
+    state = AESBCMEMBER(PackShuffleBytes) (state, ShiftRowTable);
+    return state;
+}
+
+
+/* ======================================================================
+ * FIPS-197 5.3.1
+ *
+ * InvShiftRows() is defined as leaving this state
+ * +---+---+---+---+     +---+---+---+---+
+ * | 0 | 4 | 8 | C |     | 0 | 4 | 8 | C |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 1 | 5 | 9 | D |     | D | 1 | 5 | 9 |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 2 | 6 | A | E |     | A | E | 2 | 6 |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 3 | 7 | B | F |     | 7 | B | F | 3 |
+ * +---+---+---+---+     +---+---+---+---+
+ */
+static __inline__
+CipherVec AESBCMEMBER(InvShiftRows) (CipherVec state)
+    __attribute__ ((always_inline));
+
+
+static __inline__
+CipherVec AESBCMEMBER(InvShiftRows) (CipherVec state)
+{
+    static const CipherVecByte InvShiftRowTable
+        /*   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 */
+        = {  0, 13, 10,  7,  4,  1, 14, 11,  8,  5,  2, 15, 12,  9,  6,  3 };
+
+    state = AESBCMEMBER(PackShuffleBytes) (state, InvShiftRowTable);
+    return state;
+}
+
+
+/* ======================================================================
+ * +---+---+---+---+     +---+---+---+---+
+ * | 0 | 4 | 8 | C |     | 3 | 7 | B | F |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 1 | 5 | 9 | D |     | 0 | 4 | 8 | C |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 2 | 6 | A | E |     | 1 | 5 | 9 | D |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 3 | 7 | B | F |     | 2 | 6 | A | E |
+ * +---+---+---+---+     +---+---+---+---+
+ */
+static __inline__
+CipherVec AESBCMEMBER(RotBytesRight) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(RotBytesRight) (CipherVec state)
+{
+static const
+    CipherVec ShiftRowTable
+    /*   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 */
+    = {  3,  0,  1,  2,  7,  4,  5,  6, 11,  8,  9, 10, 15, 12, 13, 14 };
+
+    state = AESBCMEMBER(PackShuffleBytes) (state, ShiftRowTable);
+    return state;
+}
+
+
+/* ======================================================================
+ * +---+---+---+---+     +---+---+---+---+
+ * | 0 | 4 | 8 | C |     | 1 | 5 | B | D |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 1 | 5 | 9 | D |     | 2 | 6 | 8 | E |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 2 | 6 | A | E |     | 3 | 7 | 9 | F |
+ * +---+---+---+---+     +---+---+---+---+
+ * | 3 | 7 | B | F |     | 0 | 4 | 8 | C |
+ * +---+---+---+---+     +---+---+---+---+
+ */
+static __inline__
+CipherVec AESBCMEMBER(RotBytesLeft) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(RotBytesLeft) (CipherVec state)
+{
+    static const CipherVec ShiftRowTable
+        /*   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 */
+        = {  1,  2,  3,  0,  5,  6,  7,  4,  9, 10, 11,  8, 13, 14, 15, 12 };
+
+    state = AESBCMEMBER(PackShuffleBytes) (state, ShiftRowTable);
+    return state;
+}
+
+
+/* ======================================================================
+ * FIPS-197 5.1.1
+ */
+
+
+/*
+ * SubBytes replaces each byte in a state with a specific byte value from
+ * A Rijndael Substitution box
+ */
+static const 
+AESByte AESBCMEMBER(RijndaelSBox)[256] = 
+{
+/*        -0    -1    -2    -3    -4    -5    -6    -7    -8    -9    -A    -B    -C    -D    -E    -F */
+/* 0- */ 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
+/* 1- */ 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
+/* 2- */ 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
+/* 3- */ 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
+/* 4- */ 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
+/* 5- */ 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
+/* 6- */ 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
+/* 7- */ 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
+/* 8- */ 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
+/* 9- */ 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
+/* A- */ 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
+/* B- */ 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
+/* C- */ 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
+/* D- */ 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
+/* E- */ 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
+/* F- */ 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
+};
+
+
+#if 0
+static __inline__
+CipherVec AESBCMEMBER(SubBytes) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(SubBytes) (CipherVec state)
+{
+    CipherVec_AES_u u;
+    unsigned ix;
+
+    u.state = state;
+
+    for (ix = 0; ix < sizeof (u.bytes); ++ix)
+    {
+        u.bytes[ix] = AESBCMEMBER(RijndaelSBox)[u.bytes[ix]];
+    }
+
+    return u.state;
+}
+#endif
+
+/*
+ * SubWord performs the same operation as SubBytes but on
+ * the four bytes of a column and not a whole state
+ */
+static __inline__
+AESWord AESBCMEMBER(SubWord) (AESWord w)
+    __attribute__ ((always_inline));
+
+static __inline__
+AESWord AESBCMEMBER(SubWord) (AESWord w)
+{
+    AESColumn col;
+    unsigned ix;
+
+    col.word = w;
+    for (ix = 0; ix < sizeof (col); ++ix)
+        col.bytes[ix] = AESBCMEMBER(RijndaelSBox)[(unsigned)col.bytes[ix]];
+    return col.word;
+}
+
+#if 0
+/*
+ * InvSubBytes replaces each byte in a state with a specific byte value from
+ * an Inversze Rijndael Substitution box.  That is InvSubBytes undoes SubBytes
+ */
+static const 
+uint8_t AESBCMEMBER(RijndaelInvSBox)[256] = 
+{
+/*        -0    -1    -2    -3    -4    -5    -6    -7    -8    -9    -A    -B    -C    -D    -E    -F */
+/* 0- */ 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
+/* 1- */ 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
+/* 2- */ 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
+/* 3- */ 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
+/* 4- */ 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
+/* 5- */ 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
+/* 6- */ 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
+/* 7- */ 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
+/* 8- */ 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
+/* 9- */ 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
+/* A- */ 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
+/* B- */ 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
+/* C- */ 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
+/* D- */ 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
+/* E- */ 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
+/* F- */ 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
+};
+
+
+static __inline__
+CipherVec AESBCMEMBER(InvSubBytes) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(InvSubBytes) (CipherVec state)
+{
+    CipherVec_AES_u u;
+    unsigned ix;
+
+    u.state = state;
+    for (ix = 0; ix < sizeof (u.bytes); ++ix)
+        u.bytes[ix] = AESBCMEMBER(RijndaelInvSBox)[u.bytes[ix]];
+
+    return u.state;
+}
+#endif
+
+static const
+CipherVec AESBCMEMBER(RijndaelSBoxV)[16] = 
+{
+/*     -0    -1    -2    -3    -4    -5    -6    -7    -8    -9    -A    -B    -C    -D    -E    -F */
+    { 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76 },
+    { 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0 },
+    { 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15 },
+    { 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75 },
+    { 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84 },
+    { 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF },
+    { 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8 },
+    { 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2 },
+    { 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73 },
+    { 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB },
+    { 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79 },
+    { 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08 },
+    { 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A },
+    { 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E },
+    { 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF },
+    { 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 }
+};
+
+static const
+CipherVec AESBCMEMBER(RijndaelInvSBoxV)[16] = 
+{
+/*     -0    -1    -2    -3    -4    -5    -6    -7    -8    -9    -A    -B    -C    -D    -E    -F */
+    { 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB },
+    { 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB },
+    { 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E },
+    { 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25 },
+    { 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92 },
+    { 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84 },
+    { 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06 },
+    { 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B },
+    { 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73 },
+    { 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E },
+    { 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B },
+    { 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4 },
+    { 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F },
+    { 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF },
+    { 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61 },
+    { 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D }
+};
+
+
+static const
+CipherVec lo_filter = { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+                        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
+
+static __inline__
+CipherVec AESBCMEMBER(SubBytesInt) (CipherVec state, const CipherVec box [16])
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(SubBytesInt) (CipherVec state, const CipherVec box [16])
+{
+    CipherVec lo, hi, tmp, out;
+    unsigned ix;
+
+    out = vec_00;
+
+/*     DEBUG_CIPHER_VECTOR ("state", state); */
+    lo = AESBCMEMBER(VecAnd) (state, vec_0F);
+/*     DEBUG_CIPHER_VECTOR ("lo", lo); */
+#if USE_VEC_REG
+    hi = op_PSRLDI128 (state, 4);
+/*     DEBUG_CIPHER_VECTOR ("hi", hi); */
+    hi = AESBCMEMBER(VecAnd) (hi, vec_0F);
+/*     DEBUG_CIPHER_VECTOR ("hi", hi); */
+#else
+    hi = AESBCMEMBER(VecDiv) (state, vec_10);
+/*     DEBUG_CIPHER_VECTOR ("hi", hi); */
+#endif
+
+    for (ix = 0; ix < sizeof (state); ++ix)
+    {
+        tmp = AESBCMEMBER(PackShuffleBytes) (lo_filter, hi);
+/*         DEBUG_CIPHER_VECTOR ("tmp", tmp); */
+        tmp = AESBCMEMBER(VecOr) (lo, tmp);
+/*         DEBUG_CIPHER_VECTOR ("tmp", tmp); */
+        tmp = AESBCMEMBER(PackShuffleBytes) (box[ix], tmp);
+/*         DEBUG_CIPHER_VECTOR ("tmp", tmp); */
+        out = AESBCMEMBER(VecOr) (out, tmp);
+/*         DEBUG_CIPHER_VECTOR ("out", out); */
+        hi  = AESBCMEMBER(VecSub) (hi, vec_01);
+/*         DEBUG_CIPHER_VECTOR ("hi", hi); */
+        hi  = AESBCMEMBER(VecAnd) (hi, vec_0F);
+/*         DEBUG_CIPHER_VECTOR ("hi", hi); */
+    }
+/*     DEBUG_CIPHER_VECTOR ("out", out); */
+    return out;
+}
+
+
+static __inline__
+CipherVec AESBCMEMBER(SubBytes) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(SubBytes) (CipherVec state)
+{
+    return AESBCMEMBER(SubBytesInt) (state, AESBCMEMBER(RijndaelSBoxV));
+}
+
+
+static __inline__
+CipherVec AESBCMEMBER(InvSubBytes) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(InvSubBytes) (CipherVec state)
+{
+    return AESBCMEMBER(SubBytesInt) (state, AESBCMEMBER(RijndaelInvSBoxV));
+}
+
+
+/* ======================================================================
+ * FIPS-197 5.1.3
+ */
+
+/*
+ * there are no psllb or psrlb instructions so shift words not bytes
+ * and then cut off bits that would have been zeroed if there were
+ * such instructions
+ *
+ * 
+ */
+static const CipherVec FF_tab = 
+{ 0x00, 0x1B, 0x36, 0x2D, 0x6C, 0x77, 0x5A, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+static __inline__
+CipherVec AESBCMEMBER(FF_mul) (register CipherVec state, const int bits)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(FF_mul) (register CipherVec state, const int bits)
+{
+    CipherVec sl, sr;
+
+    assert (bits <= 8);
+
+    DEBUG_CIPHER_VECTOR ("state", state);
+    sr = AESBCMEMBER(VecSRLBI) (state, 8 - bits);
+    DEBUG_CIPHER_VECTOR ("sr", sr);
+    sl = AESBCMEMBER(VecSLLBI) (state, bits);
+    DEBUG_CIPHER_VECTOR ("sl", sl);
+    sr = AESBCMEMBER(PackShuffleBytes) (FF_tab, sr);
+    return AESBCMEMBER(VecXor)(sl, sr);
+}
+
+
+static __inline__
+CipherVec AESBCMEMBER(FF_mul_02) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(FF_mul_02) (register CipherVec state)
+{
+    DEBUG_CIPHER_VECTOR ("state", state);
+
+    state =  AESBCMEMBER(FF_mul) (state, 1);
+    DEBUG_CIPHER_VECTOR ("state", state);
+
+    return state;
+}
+
+
+static __inline__
+CipherVec AESBCMEMBER(FF_mul_04) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(FF_mul_04) (CipherVec state)
+{
+    DEBUG_CIPHER_VECTOR ("state", state);
+
+    state =  AESBCMEMBER(FF_mul) (state, 2);
+    DEBUG_CIPHER_VECTOR ("state", state);
+
+    return state;
+}
+
+
+static __inline__
+CipherVec AESBCMEMBER(FF_mul_08) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(FF_mul_08) (CipherVec state)
+{
+    DEBUG_CIPHER_VECTOR ("state", state);
+
+    state =  AESBCMEMBER(FF_mul) (state, 3);
+    DEBUG_CIPHER_VECTOR ("state", state);
+
+    return state;
+}
+
+
+static AESByte AESBCMEMBER(FFtable)[] = { 0x00, 0x1b, 0x36, 0x2d, 0x6c, 0x77, 0x5a, 0x41 };
+
+
+static __inline__ 
+AESByte AESBCMEMBER(FFtab) (uint8_t x)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+AESByte AESBCMEMBER(FFtab) (uint8_t x)
+{
+    return AESBCMEMBER(FFtable)[x];
+}
+
+
+static __inline__ 
+AESByte AESBCMEMBER(FFmul02) (AESByte b)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+AESByte AESBCMEMBER(FFmul02) (AESByte b)
+{
+    return (b << 1) ^ AESBCMEMBER(FFtab)(b >> 7);
+}
+
+
+static __inline__ 
+AESByte AESBCMEMBER(FFmul04) (AESByte b)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+AESByte AESBCMEMBER(FFmul04) (AESByte b)
+{
+    return (b << 2) ^ AESBCMEMBER(FFtab)(b >> 6);
+}
+
+
+static __inline__ 
+AESByte AESBCMEMBER(FFmul08) (AESByte b)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+AESByte AESBCMEMBER(FFmul08) (AESByte b)
+{
+    return (b << 3) ^ AESBCMEMBER(FFtab)(b >> 5);
+}
+
+
+static __inline__
+CipherVec AESBCMEMBER(MixColumns) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(MixColumns) (CipherVec state)
+{
+    register CipherVec c0, c1, c2, c3;
+    
+    c1 = AESBCMEMBER(RotBytesLeft) (state);
+    c2 = AESBCMEMBER(RotBytesLeft) (c1);
+    c3 = AESBCMEMBER(RotBytesLeft) (c2);
+    c0 = AESBCMEMBER(VecXor) (state, c1);
+
+
+#if USE_VEC_REG
+    c0 = AESBCMEMBER(FF_mul_02) (c0);
+#else
+    {
+        CipherVec_AES_u tmp;
+        unsigned ix;
+
+        tmp.state = c0;
+    
+        for (ix = 0; ix < sizeof tmp; ++ix)
+            tmp.bytes[ix] = AESBCMEMBER(FFmul02)(tmp.bytes[ix]);
+        c0 = tmp.state;
+    }
+#endif
+    c1 = AESBCMEMBER(VecXor) (c1, c2);
+    c1 = AESBCMEMBER(VecXor) (c1, c3);
+    c1 = AESBCMEMBER(VecXor) (c1, c0);
+
+    return c1;
+/* obsoleted 
+    CipherVec_AES_u in, out;
+    unsigned ix;
+
+    in.state = state;
+
+    for (ix = 0; ix < sizeof (out.bytes); ix += 4)
+    {
+        unsigned const s0 = in.bytes[ix + 0];
+        unsigned const s1 = in.bytes[ix + 1];
+        unsigned const s2 = in.bytes[ix + 2];
+        unsigned const s3 = in.bytes[ix + 3];
+
+        out.bytes[ix + 0] =      s1 ^ s2 ^ s3 ^ AESBCMEMBER(FFmul02)(s0 ^ s1);
+        out.bytes[ix + 1] = s0      ^ s2 ^ s3 ^ AESBCMEMBER(FFmul02)(s1 ^ s2);
+        out.bytes[ix + 2] = s0 ^ s1      ^ s3 ^ AESBCMEMBER(FFmul02)(s2 ^ s3);
+        out.bytes[ix + 3] = s0 ^ s1 ^ s2      ^ AESBCMEMBER(FFmul02)(s3 ^ s0);
+    }
+    return out.state;
+*/
+}
+
+static __inline__
+CipherVec AESBCMEMBER(InvMixColumns) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(InvMixColumns) (CipherVec state)
+{
+#if USE_AES_NI
+    state = op_AESIMC (state);
+#else
+    register CipherVec r1, r2, r3, f2, f4, f8;
+
+    r1 = AESBCMEMBER(RotBytesLeft) (state);
+    r2 = AESBCMEMBER(RotBytesLeft) (r1);
+    r3 = AESBCMEMBER(RotBytesLeft) (r2);        
+
+    f4 = AESBCMEMBER(VecXor) (state, r2);
+    f2 = AESBCMEMBER(VecXor) (state, r1);
+    f8 = AESBCMEMBER(VecXor) (r2, r3);
+    state = AESBCMEMBER(VecXor) (f8, r1);
+    f8 = AESBCMEMBER(VecXor) (f8, f2);
+
+
+#if USE_VEC_REG
+    f2 = AESBCMEMBER(FF_mul) (f2,1);
+    f4 = AESBCMEMBER(FF_mul) (f4,2);
+    f8 = AESBCMEMBER(FF_mul) (f8,3);
+#else
+    {
+        CipherVec_AES_u fu2, fu4, fu8;
+        unsigned ix;
+
+        fu2.state = f2;
+        fu4.state = f4;
+        fu8.state = f8;
+
+        for (ix = 0; ix < sizeof fu2; ++ix)
+        {
+            fu2.bytes[ix] = AESBCMEMBER(FFmul02)(fu2.bytes[ix]);
+            fu4.bytes[ix] = AESBCMEMBER(FFmul04)(fu4.bytes[ix]);
+            fu8.bytes[ix] = AESBCMEMBER(FFmul08)(fu8.bytes[ix]);
+        }
+        f2 = fu2.state;
+        f4 = fu4.state;
+        f8 = fu8.state;
+    }
+#endif
+
+    state = AESBCMEMBER(VecXor) (state, f2);
+    state = AESBCMEMBER(VecXor) (state, f4);
+    state = AESBCMEMBER(VecXor) (state, f8);
+
+#endif
+
+    return state;
+/*
+    CipherVec_AES_u in, out;
+    unsigned ix;
+
+    in.state = state;
+
+    for (ix = 0; ix < sizeof (out.bytes); ix += AES_Nb)
+    {
+        AESWord s0 = in.bytes[ix + 0];
+        AESWord s1 = in.bytes[ix + 1];
+        AESWord s2 = in.bytes[ix + 2];
+        AESWord s3 = in.bytes[ix + 3];
+        AESWord p, q;
+
+        q =     AESBCMEMBER(FFmul08)(s0 ^ s1 ^ s2 ^ s3);
+        p = q ^ AESBCMEMBER(FFmul04)(s0 ^ s2);
+        q = q ^ AESBCMEMBER(FFmul04)(s1 ^ s3);
+
+        out.bytes[ix + 0] =      s1 ^ s2 ^ s3 ^ AESBCMEMBER(FFmul02)(s0 ^ s1) ^ p;
+        out.bytes[ix + 1] = s0      ^ s2 ^ s3 ^ AESBCMEMBER(FFmul02)(s1 ^ s2) ^ q;
+        out.bytes[ix + 2] = s0 ^ s1      ^ s3 ^ AESBCMEMBER(FFmul02)(s2 ^ s3) ^ p;
+        out.bytes[ix + 3] = s0 ^ s1 ^ s2      ^ AESBCMEMBER(FFmul02)(s3 ^ s0) ^ q;
+    }
+
+    return out.state;
+*/
+}
+
+
+/* ======================================================================
+ * FIPS-197 5.2
+ */
+static const
+AESWord AESBCMEMBER(Rcon)[] = {
+    0x00000001, 0x00000002, 0x00000004, 0x00000008,
+    0x00000010, 0x00000020, 0x00000040, 0x00000080,
+    0x0000001B, 0x00000036
+};
+
+
+static __inline__
+AESWord AESBCMEMBER(RotWord) (AESWord w)
+    __attribute__ ((always_inline));
+
+static __inline__
+AESWord AESBCMEMBER(RotWord) (AESWord w)
+{
+    return (w >> 8) | (w << 24);
+}
+
+
+static __inline__
+AESWord AESBCMEMBER(GetWord) (const AESByte * pointer)
+    __attribute__ ((always_inline));
+
+static __inline__
+AESWord AESBCMEMBER(GetWord) (const AESByte * pointer)
+{
+    /*
+     * not portable to architectures which require aligned multibyte reads
+     * but as this only runs on Intel at this point it is fine for now
+     */
+    return *(AESWord*)pointer;
+}
+
+
+
+static __inline__
+void AESBCMEMBER(KeyExpansion) (CipherVec * r, const AESByte * key, unsigned Nr, unsigned Nk)
+{
+    AESWord * w = (AESWord*)r;
+    const AESWord * pRcon;
+    unsigned ix, limit;
+    AESWord temp;
+
+
+    DEBUG_KEYEXP(("%s (w (%p), key (%p), Nr (%u) Nk (%u))\n", __func__, w, key, Nr, Nk));
+
+    for (ix = 0; ix < Nk; ++ix)
+    {
+        DEBUG_KEYEXP(("i (dec): %u\n", ix));
+        temp = AESBCMEMBER(GetWord) (key+(ix*4));
+        w[ix] = temp;
+        DEBUG_KEYEXP(("kw[%i]: %0.8x\n", ix, temp));
+    }
+
+    limit = AES_Nb * (Nr + 1);
+    pRcon = AESBCMEMBER(Rcon);
+    DEBUG_KEYEXP(("Nk (%u) Nr (%u) limit (%u)\n", Nk, Nr, limit));
+        
+    for (; ix < limit; ++ix)
+    {
+
+        DEBUG_KEYEXP(("i (dec): %u %u\n", ix, limit));
+
+        /* temp should already be set */
+        DEBUG_KEYEXP(("temp: %0.8x\n", temp));
+        if ((ix % Nk) == 0)
+        {
+            temp = AESBCMEMBER(RotWord)(temp);
+            DEBUG_KEYEXP(("after RotWord: %0.8x \n", temp));
+            temp = AESBCMEMBER(SubWord) (temp);
+            DEBUG_KEYEXP(("after SubWord: %0.8x \n", temp));
+            DEBUG_KEYEXP(("Rcon [i/Nk]: %0.8x\n", *pRcon));
+            temp ^= *pRcon++;
+            DEBUG_KEYEXP(("after XOR with Rcon: %0.8x \n", temp));
+        }
+        else if ((Nk > 6) && ((ix % Nk) == 4))
+        {
+            temp = AESBCMEMBER(SubWord) (temp);
+            DEBUG_KEYEXP(("after SubWord: %0.8x \n", temp));
+        }
+        DEBUG_KEYEXP(("w[i-Nk]: %0.8x\n", w[ix-Nk]));
+        temp ^= w [ix - Nk];
+        DEBUG_KEYEXP(("kw[ix]: %0.8x\n", temp));
+        w [ix] = temp;
+    }
+}
+
+
+static __inline__
+CipherVec AESBCMEMBER(StateShiftLeft32) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(StateShiftLeft32) (CipherVec state)
+{
+#if (USE_VEC_REG)
+    static const CipherVec mask = { 0xFF, 0xFF, 0xFF, 0xFF, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+    return AESBCMEMBER(PackShuffleBytes) (state, mask);
+#else
+    CipherVec_AES_u temp;
+
+    temp.state = state;
+    temp.columns[3] = temp.columns[2];
+    temp.columns[2] = temp.columns[1];
+    temp.columns[1] = temp.columns[0];
+    temp.columns[0] = 0;
+    return temp.state;
+#endif
+}
+
+
+static __inline__
+CipherVec AESBCMEMBER(StateShiftRight64) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(StateShiftRight64) (CipherVec state)
+{
+#if (USE_VEC_REG)
+    static const CipherVec mask = { 8, 9, 10, 11, 12, 13, 14, 15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
+    return AESBCMEMBER(PackShuffleBytes) (state, mask);
+#else
+    CipherVec_AES_u temp;
+
+    temp.state = state;
+    temp.columns[0] = temp.columns[2];
+    temp.columns[1] = temp.columns[3];
+    temp.columns[2] = 0;
+    temp.columns[3] = 0;
+    return temp.state;
+#endif
+}
+
+
+static __inline__
+CipherVec AESBCMEMBER(StateShiftLeft64) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(StateShiftLeft64) (CipherVec state)
+{
+#if (USE_VEC_REG)
+    static const CipherVec mask = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 1, 2, 3, 4, 5, 6, 7 };
+    return AESBCMEMBER(PackShuffleBytes) (state, mask);
+#else
+    CipherVec_AES_u temp;
+
+    temp.state = state;
+    temp.columns[3] = temp.columns[2];
+    temp.columns[2] = temp.columns[1];
+    temp.columns[1] = temp.columns[0];
+    temp.columns[0] = 0;
+    return temp.state;
+#endif
+}
+
+
+/*
+ * incoming vector in words
+ *     W0:W1:W2:W3
+ *
+ * output vector in words
+ *     W3:W3:W3:W3
+ */
+static __inline__
+CipherVec AESBCMEMBER(StateDupColumn3) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(StateDupColumn3) (CipherVec state)
+{
+#if (USE_VEC_REG)
+    return op_PSHUFD128 (state,0xFF);
+#else
+    CipherVec_AES_u temp;
+
+    temp.state = state;
+    temp.columns[2] = temp.columns[3];
+    temp.columns[1] = temp.columns[3];
+    temp.columns[0] = temp.columns[3];
+    return temp.state;
+#endif
+}
+
+
+/*
+ * incoming vector in words
+ *     W0:W1:W2:W3
+ *
+ * output vector in words
+ *     W2:W2:W2:W2
+ */
+static __inline__
+CipherVec AESBCMEMBER(StateDupColumn2) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(StateDupColumn2) (CipherVec state)
+{
+#if (USE_VEC_REG)
+    return op_PSHUFD128 (state,0xAA);
+#else
+    CipherVec_AES_u temp;
+
+    temp.state = state;
+    temp.columns[3] = temp.columns[2];
+    temp.columns[1] = temp.columns[2];
+    temp.columns[0] = temp.columns[2];
+    return temp.state;
+#endif
+}
+
+
+/*
+ * incoming vector in words
+ *     W0:W1:W2:W3
+ *
+ * output vector in words
+ *     W2:W2:W2:W2
+ */
+static __inline__
+CipherVec AESBCMEMBER(StateDupColumn1) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(StateDupColumn1) (CipherVec state)
+{
+#if (USE_VEC_REG)
+    return op_PSHUFD128 (state,0x55);
+#else
+    CipherVec_AES_u temp;
+
+    temp.state = state;
+    temp.columns[3] = temp.columns[1];
+    temp.columns[2] = temp.columns[1];
+    temp.columns[0] = temp.columns[1];
+    return temp.state;
+#endif
+}
+
+
+/*
+ * incoming vector in words
+ *     W0:W1:W2:W3
+ *
+ * output vector in words
+ *     W0:W0:W0:W0
+ */
+static __inline__
+CipherVec AESBCMEMBER(StateDupColumn0) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(StateDupColumn0) (CipherVec state)
+{
+#if (USE_VEC_REG)
+    return op_PSHUFD128 (state,0x00);
+#else
+    CipherVec_AES_u temp;
+
+    temp.state = state;
+    temp.columns[3] = temp.columns[0];
+    temp.columns[2] = temp.columns[0];
+    temp.columns[1] = temp.columns[0];
+    return temp.state;
+#endif
+}
+
+
+/*
+ * incoming vector in words
+ *     W0:W1:W2:W3
+ *     X0:X1:X2:X3
+ *
+ * output vector in words
+ *     W0:W1:X0:X1
+ */
+static __inline__
+CipherVec AESBCMEMBER(StateMerge1) (CipherVec w, CipherVec x)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(StateMerge1) (CipherVec w, CipherVec x)
+{
+#if USE_VEC_REG
+    return op_SHUFPD (w, x, 0x00);
+#else
+    CipherVec_AES_u ww;
+    CipherVec_AES_u xx;
+
+    ww.state = w;
+    xx.state = x;
+
+    ww.columns[2] = xx.columns[0];
+    ww.columns[3] = xx.columns[1];
+
+    return ww.state;
+#endif
+}
+
+
+/*
+ * incoming vector in words
+ *     W0:W1:W2:W3
+ *     X0:X1:X2:X3
+ *
+ * output vector in words
+ *     X2:X3:W0:W1
+ */
+static __inline__
+CipherVec AESBCMEMBER(StateMerge2) (CipherVec w, CipherVec x)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(StateMerge2) (CipherVec w, CipherVec x)
+{
+#if USE_VEC_REG
+    return op_SHUFPD (w, x, 0x01);
+#else
+    CipherVec_AES_u ww;
+    CipherVec_AES_u xx;
+
+    ww.state = w;
+    xx.state = x;
+
+    ww.columns[0] = ww.columns[2];
+    ww.columns[1] = ww.columns[3];
+    ww.columns[2] = xx.columns[0];
+    ww.columns[3] = xx.columns[1];
+
+    return ww.state;
+#endif
+}
+
+
+/*
+ * incoming vector in words
+ *     W0:W1:W2:W3
+ *     X0:X1:X2:X3
+ *
+ * output vector in words
+ *     X2:X3:W0:W1
+ */
+static __inline__
+CipherVec AESBCMEMBER(StateMerge3) (CipherVec v0, CipherVec v1)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(StateMerge3) (CipherVec v0, CipherVec v1)
+{
+#if USE_VEC_REG
+    return op_SHUFPD (v0, v1, 0x02);
+#else
+    CipherVec_AES_u t0;
+    CipherVec_AES_u t1;
+
+    t0.state = v0;
+    t1.state = v1;
+
+    t0.columns[2] = t0.columns[0];
+    t0.columns[3] = t0.columns[1];
+    t0.columns[0] = t1.columns[2];
+    t0.columns[1] = t1.columns[3];
+
+    return t0.state;
+#endif
+}
+
+
+/*
+ * incoming vector in words
+ *     W0:W1:W2:W3
+ *
+ * output vector in words
+ *     W0:W0^W1:W0^W1^W2:W0^W1^W2^W3
+ */
+static __inline__
+CipherVec AESBCMEMBER(ShiftXorColumns) (CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(ShiftXorColumns) (CipherVec state)
+{
+#if USE_VEC
+    register CipherVec shift = state;
+
+    state ^= shift = AESBCMEMBER(StateShiftLeft32) (shift);
+    state ^= shift = AESBCMEMBER(StateShiftLeft32) (shift);
+    state ^= shift = AESBCMEMBER(StateShiftLeft32) (shift);
+
+    return state;
+#else
+    CipherVec_AES_u temp;
+
+    temp.state = state;
+
+    temp.columns[1] ^= temp.columns[0];
+    temp.columns[2] ^= temp.columns[1];
+    temp.columns[3] ^= temp.columns[2];
+
+    return temp.state;
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(AesKeyGenAssist) (register CipherVec state, const int rcon)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(AesKeyGenAssist) (register CipherVec state, const int rcon)
+{
+#if (USE_AES_NI)
+    return op_AESKEYGENASSIST (state, rcon);
+#else
+    CipherVec_AES_u in;
+    CipherVec_AES_u out;
+    AESWord rconw;
+
+    rconw = (AESWord)(AESByte)rcon;
+    in.state = state;
+
+    out.columns[0] = AESBCMEMBER(SubWord)(in.columns[1]);
+    out.columns[1] = AESBCMEMBER(RotWord)(out.columns[0]) ^ rconw;
+    out.columns[2] = AESBCMEMBER(SubWord)(in.columns[3]);
+    out.columns[3] = AESBCMEMBER(RotWord)(out.columns[2]) ^ rconw;
+
+    return out.state;
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(AesKeyGenAssistColumn1) (register CipherVec state, const int rcon)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(AesKeyGenAssistColumn1) (register CipherVec state, const int rcon)
+{
+#if (USE_AES_NI)
+    register CipherVec tmp = state;
+    tmp = op_AESKEYGENASSIST (tmp, rcon);
+    return  AESBCMEMBER(StateDupColumn1) (tmp);
+#else
+    CipherVec_AES_u u;
+    AESWord rconw;
+    AESWord temp;
+
+    rconw = (AESWord)(AESByte)rcon;
+    u.state = state;
+    temp  = AESBCMEMBER(SubWord)(u.columns[1]);
+    temp  = AESBCMEMBER(RotWord)(temp);
+    temp ^= rconw;
+
+    u.columns [0] = u.columns [1] = u.columns [2] = u.columns [3] = temp;
+    return u.state;
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(AesKeyGenAssistColumn2) (register CipherVec state)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(AesKeyGenAssistColumn2) (register CipherVec state)
+{
+#if (USE_AES_NI)
+    register CipherVec tmp = state;
+    tmp = op_AESKEYGENASSIST (tmp, 0);
+    return  AESBCMEMBER(StateDupColumn2) (tmp);
+#else
+    CipherVec_AES_u u;
+    AESWord temp;
+
+    u.state = state;
+    temp  = AESBCMEMBER(SubWord)(u.columns[3]);
+
+    u.columns [0] = u.columns [1] = u.columns [2] = u.columns [3] = temp;
+    return u.state;
+#endif
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(AesKeyGenAssistColumn3) (register CipherVec state, const int rcon)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(AesKeyGenAssistColumn3) (register CipherVec state, const int rcon)
+{
+#if (USE_AES_NI)
+    register CipherVec tmp = state;
+    tmp = op_AESKEYGENASSIST (tmp, rcon);
+    return  AESBCMEMBER(StateDupColumn3) (tmp);
+
+#else
+    register CipherVec vrcon;
+    register CipherVec tmp;
+
+    vrcon = AESBCMEMBER(SetColumn) (vec_00, (AESWord)rcon, 3);
+    tmp = AESBCMEMBER(SubBytes) (state);
+    DEBUG_CIPHER_VECTOR ("SubBytes", tmp);
+    tmp = AESBCMEMBER(RotBytesLeft) (tmp);
+    DEBUG_CIPHER_VECTOR ("RotBytesLeft", tmp);
+    tmp = AESBCMEMBER(VecXor)(tmp, vrcon);
+    DEBUG_CIPHER_VECTOR ("VecXor", tmp);
+    tmp = AESBCMEMBER(StateDupColumn3) (tmp);
+    DEBUG_CIPHER_VECTOR ("StateDupColumn3", tmp);
+    return tmp;
+
+#endif
+/*
+#elif USE_VEC && 1
+    register CipherVec tmp;
+    CipherVec_AES_u u;
+    
+    u.columns [3] = rcon;
+
+    tmp = AESBCMEMBER(SubBytes) (state);
+    DEBUG_CIPHER_VECTOR ("SubBytes", tmp);
+    tmp = AESBCMEMBER(RotBytesLeft) (tmp);
+    DEBUG_CIPHER_VECTOR ("RotBytesLeft", tmp);
+    tmp = AESBCMEMBER(VecXor)(tmp, u.state);
+    DEBUG_CIPHER_VECTOR ("VecXor", tmp);
+    tmp = AESBCMEMBER(StateDupColumn3) (tmp);
+    DEBUG_CIPHER_VECTOR ("StateDupColumn3", tmp);
+    return tmp;
+
+#else
+    CipherVec_AES_u u;
+    AESWord rconw;
+    AESWord temp;
+
+    rconw = (AESWord)(AESByte)rcon;
+    u.state = state;
+    temp  = AESBCMEMBER(SubWord)(u.columns[3]);
+    temp  = AESBCMEMBER(RotWord)(temp);
+    temp ^= rconw;
+
+    u.columns [0] = u.columns [1] = u.columns [2] = u.columns [3] = temp;
+    return u.state;
+#endif
+*/
+}
+
+
+#if USE_VEC
+static __inline__
+void AESBCMEMBER(KeyExpansion128) (CipherVec * round_keys, const AESByte * key)
+{
+    CipherVec state;
+    CipherVec kgastate;
+
+    state = AESBCMEMBER(StateIn) (key);
+    round_keys[0] = state;
+
+#define KE128(rcon,offset) \
+    kgastate = AESBCMEMBER(AesKeyGenAssistColumn3) (state, rcon); \
+    state = AESBCMEMBER(ShiftXorColumns) (state); \
+    state ^= kgastate; \
+    round_keys[offset] = state
+
+    KE128(0x01,1);
+    KE128(0x02,2);
+    KE128(0x04,3);
+    KE128(0x08,4);
+    KE128(0x10,5);
+    KE128(0x20,6);
+    KE128(0x40,7);
+    KE128(0x80,8);
+    KE128(0x1B,9);
+    KE128(0x36,10);
+}
+#else
+static __inline__
+void AESBCMEMBER(KeyExpansion128) (CipherVec * w, const AESByte * key)
+{
+    OUTMSG(("\n\n\n%s: Not my code\n\n\n",__func__));
+    AESBCMEMBER(KeyExpansion) (w, key, AES_Nr_128, AES_Nk_128);
+}
+#endif
+
+
+#if USE_VEC
+static __inline__
+void AESBCMEMBER(KeyExpansion192) (CipherVec * round_keys, const AESByte * key)
+{
+    /* work on three blocks at a time which is two Nr worth
+     * we'll build it with 6 words in v0:v1 and 6 words in w0:w1
+     * but move them them into v0:v1:v2 before writing them to
+     * the key schedule
+     */
+
+    register CipherVec v0, v1, v2, v3, v4;
+    register CipherVec k;          /* we'll only need one of the key gen assist blocks at a time */
+
+/* pattern 0 */
+    v0  = AESBCMEMBER(StateIn) (key);              /* k0    : k1    : k2     : k3           */
+    v1  = AESBCMEMBER(StateIn) (key+8);            /* k2    : k3    : k4     : k5           */
+    v1  = AESBCMEMBER(StateShiftRight64) (v1);     /* k4    : k5    : 0      : 0            */
+
+    round_keys[0] = v0; /* K0:K1:K2:K3 */
+
+/* pattern 1 */
+/* start the working pattern with 6 ready words in v0:v1 */
+
+    k   = AESBCMEMBER(AesKeyGenAssistColumn1)
+        (k = v1, 0x01);                            /* F(k5) : F(k5) : F(k5)  : F(k5)        */
+    v3  = AESBCMEMBER(ShiftXorColumns) (v0);       /* k0    : k0^k1 :k0^k1^k2:k0^k1^k2^k3   */
+    v3 ^= k;                                       /* k6    : k7    : k8     : k9           */
+    v4  = AESBCMEMBER(ShiftXorColumns) (v1);       /* k4    : k4^k5 : k4^k5  : k4^k5        */
+    k   = AESBCMEMBER(StateDupColumn3) (k = v3);   /* k9    : k9    : k9     : k9           */
+    v4 ^= k;                                       /* k10   : k11   : k10    : k11          */
+    v1  = AESBCMEMBER(StateMerge1) (v1,v3);        /* k4    : k5    : k6     : k7           */
+    round_keys[1] = v1; /* K4:K5:K6:K7 */
+
+    v2  = AESBCMEMBER(StateMerge2) (v3,v4);        /* k8    : k9    : k10    : k11          */
+    round_keys[2] = v2; /* K8:K9:K10:K11 */
+
+/* pattern 2 */
+    v0  = AESBCMEMBER(ShiftXorColumns) (v3);       /* k6    : k6^k7 :k6^k7^k8:k6^k7^k8^k9   */
+    v1  = AESBCMEMBER(ShiftXorColumns) (v4);       /* k10   :k10^k11: k10^k11: k10^k11      */
+    k   = AESBCMEMBER(AesKeyGenAssistColumn3)
+        (k = v2,0x02);                             /* F(k11): F(k11): F(k11) : F(k11)       */
+    v0 ^= k;                                       /* k12   : k13   : k14    : k15          */
+    round_keys[3] = v0; /* K12:K13:K14:K15 */
+    k   = AESBCMEMBER(StateDupColumn3) (k = v0);   /* k15   : k15   : k15    : k15          */
+    v1 ^= k;                                       /* k16   : k17   : k16    : k17          */
+
+
+/* pattern 1 */
+/* start the working pattern with 6 ready words in v0:v1 */
+
+    k   = AESBCMEMBER(AesKeyGenAssistColumn1)
+        (k = v1,0x04);                             /* F(k17): F(k17): F(k17) : F(k17)       */
+    v3  = AESBCMEMBER(ShiftXorColumns) (v0);       /* k12   :k12^k13:k12^k13^k14:k12^k13^k14^k15 */
+    v3 ^= k;                                       /* k18   : k19   : k20    : k21          */
+    v4  = AESBCMEMBER(ShiftXorColumns) (v1);       /* k16   :k16^k17: k17    : 0            */
+    k   = AESBCMEMBER(StateDupColumn3) (k = v3);   /* k21   : k21   : k21    : k21          */
+    v4 ^= k;                                       /* k22   : k23   : x      : x            */
+    v1  = AESBCMEMBER(StateMerge1) (v1,v3);        /* k16   : k17   : k18    : k19          */
+    round_keys[4] = v1; /* K16:K17:K18:K19 */
+
+    v2  = AESBCMEMBER(StateMerge2) (v3,v4);        /* k20   : k21   : k22    : k23          */
+    round_keys[5] = v2; /* K20:K21:K22:K23 */
+
+/* pattern 2 */
+    v0  = AESBCMEMBER(ShiftXorColumns) (v3);       /* k18   :k18^k19:k18^k19^k20:k18^k19^k20^k21 */
+    v1  = AESBCMEMBER(ShiftXorColumns) (v4);       /* k22   :k22^k23: k23    : 0            */
+    k   = AESBCMEMBER(AesKeyGenAssistColumn3)
+        (k = v2,0x08);                             /* F(k23): F(k23): F(k23) : F(k23)       */
+    v0 ^= k;                                       /* k24   : k25   : k26    : k27          */
+    k   = AESBCMEMBER(StateDupColumn3) (k = v0);   /* k27   : k27   : k27    : k27          */
+    v1 ^= k;                                       /* k28   : k29   : x      : x            */
+
+    round_keys[6] = v0; /* K24:K25:K26:K27 */
+
+/* pattern 1 4-15 = 28-39 */
+/* start the working pattern with 6 ready words in v0:v1 */
+
+    k   = AESBCMEMBER(AesKeyGenAssistColumn1)
+        (k = v1,0x10);                             /* F(k29): F(k29): F(k29) : F(k29)       */
+    v3  = AESBCMEMBER(ShiftXorColumns) (v0);       /* k24   :k24^k25:k24^k25^k26:k24^k25^k26^k27 */
+    v3 ^= k;                                       /* k30   : k31   : k32    : k33          */
+    v4  = AESBCMEMBER(ShiftXorColumns) (v1);       /* k26   :k28^k29: k29    : 0            */
+    k   = AESBCMEMBER(StateDupColumn3) (k = v3);   /* k33   : k33   : k33    : k33          */
+    v4 ^= k;                                       /* k34   : k35   : x      : x            */
+    v1  = AESBCMEMBER(StateMerge1) (v1,v3);        /* k28   : k29   : k30    : k31          */
+
+    round_keys[7] = v1; /* K28:K29:K30:K31 */
+
+    v2  = AESBCMEMBER(StateMerge2) (v3,v4);        /* k32   : k33   : k34    : k35          */
+    round_keys[8] = v2; /* K32:K33:K34:K35 */
+/* pattern 2 */
+    v0  = AESBCMEMBER(ShiftXorColumns) (v3);       /* k30   :k30^k31:k30^k31^k32:k30^k31^k32^k33 */
+    v1  = AESBCMEMBER(ShiftXorColumns) (v4);       /* k26   :k26^k27: k27    : 0            */
+    k   = AESBCMEMBER(AesKeyGenAssistColumn3)
+        (k = v2,0x20);                             /* F(k35): F(k35): F(k35) : F(k35)       */
+    v0 ^= k;                                       /* k36   : k37   : k38    : k39          */
+    k   = AESBCMEMBER(StateDupColumn3) (v0);       /* k39   : k39   : k39    : k39          */
+    v1 ^= k;                                       /* k40   : k41   : x      : x            */
+
+    round_keys[9] = v0; /* K36:K37:K38:K39 */
+
+/* pattern 1 4-15 = 40-55 but we only need through 51 so we change from pattern 2 to pattern 3 */
+/* start the working pattern with 6 ready words in v0:v1 */
+
+    k   = AESBCMEMBER(AesKeyGenAssistColumn1)
+        (k = v1,0x40);                             /* F(k41): F(k41): F(k41) : F(k41)       */
+    v3  = AESBCMEMBER(ShiftXorColumns) (v0);       /* k36   :k36^k37:k36^k37^k38:k36^k37^k38^k39 */
+    v4  = AESBCMEMBER(ShiftXorColumns) (v1);       /* k40   :k40^k41: x   5  : x            */
+    v3 ^= k;                                       /* k42   : k43   : k44    : k45          */
+    k   = AESBCMEMBER(StateDupColumn3) (k = v3);   /* k45   : k45   : k45    : k45          */
+    v4 ^= k;                                       /* k46   : k47   : x      : x            */
+    v1  = AESBCMEMBER(StateMerge1) (v1,v3);        /* k40   : k41   : k42    : k43          */
+    round_keys[10] = v1; /* K40:K41:K42:K43 */
+    v2  = AESBCMEMBER(StateMerge2) (v3,v4);        /* k44   : k45   : k46    : k47          */
+    round_keys[11] = v2; /* K44:K45:K46:K47 */
+
+/* pattern 3 */
+    v0  = AESBCMEMBER(ShiftXorColumns) (v3);       /* k42   :k42^k43:k42^k43^k44:k42^k43^k44^k45  */
+    k   = AESBCMEMBER(AesKeyGenAssistColumn3)
+                                       (v2,0x80);  /* F(k47): F(k47): F(k47) : F(k47)       */
+    v0 ^= k;                                       /* k48   : k49   : k50    : k51          */
+    round_keys[12] = v0;                           /* K48:K49:K50:K51 */
+}
+#else
+static __inline__
+void AESBCMEMBER(KeyExpansion192) (CipherVec * w, const AESByte * key)
+{
+    AESBCMEMBER(KeyExpansion) (w, key, AES_Nr_192, AES_Nk_192);
+}
+#endif
+
+
+
+
+/* ----- */
+
+#if USE_VEC || 1
+static __inline__
+void AESBCMEMBER(KeyExpansion256) (CipherVec * round_keys, const AESByte * key)
+{
+    CipherVec v0, v1;
+    CipherVec k;
+
+    v0 = AESBCMEMBER (StateIn) (key);
+    v1 = AESBCMEMBER (StateIn) (key + sizeof v0);
+
+    round_keys[0] = v0; /* k0  : k1  : k2  : k3  */
+    round_keys[1] = v1; /* k4  : k5  : k6  : k7  */
+
+#define KE256_1(offset,rcon)                            \
+    k   = AESBCMEMBER(AesKeyGenAssistColumn3)(v1,rcon); \
+    v0  = AESBCMEMBER(ShiftXorColumns) (v0);            \
+    v0  = AESBCMEMBER(VecXor) (v0, k);                  \
+    round_keys[offset] = v0
+
+#define KE256_2(offset) \
+    k   = AESBCMEMBER(AesKeyGenAssistColumn2)(v0);      \
+    v1  = AESBCMEMBER(ShiftXorColumns) (v1);            \
+    v1  = AESBCMEMBER(VecXor) (v1, k);                  \
+    round_keys[offset] = v1
+
+    KE256_1(2,0x01);    /* k8  : k9  : k10 : k11 */
+    KE256_2(3);         /* k12 : k13 : k14 : k15 */
+    KE256_1(4,0x02);    /* k16 : k17 : k18 : k19 */
+    KE256_2(5);         /* k20 : k21 : k22 : k23 */
+    KE256_1(6,0x04);    /* k24 : k25 : k26 : k27 */
+    KE256_2(7);         /* k28 : k29 : k30 : k31 */
+    KE256_1(8,0x08);    /* k32 : k33 : k34 : k35 */
+    KE256_2(9);         /* k36 : k37 : k38 : k39 */
+    KE256_1(10,0x10);   /* k40 : k41 : k42 : k43 */
+    KE256_2(11);        /* k44 : k45 : k46 : k47 */
+    KE256_1(12,0x20);   /* k48 : k49 : k50 : k51 */
+    KE256_2(13);        /* k52 : k53 : k54 : k55 */
+    KE256_1(14,0x40);   /* k56 : k57 : k58 : k59 */
+}
+#else
+static __inline__
+void AESBCMEMBER(KeyExpansion256) (CipherVec * w, const AESByte * key)
+{
+    AESBCMEMBER(KeyExpansion) (w, key, AES_Nr_256, AES_Nk_256);
+}
+#endif
+
+
+static __inline__
+void AESBCMEMBER(EqInvKeyExpansion) (CipherVec * r, const CipherVec * dr, unsigned Nr)
+{
+    unsigned ix, jx;
+
+    jx = Nr;
+    ix = 0;
+    r[ix++] = dr[jx--];
+    while (jx)
+        r[ix++] = AESBCMEMBER(InvMixColumns)(dr[jx--]);
+    r[ix] = dr[jx];
+}
+
+
+static __inline__
+void AESBCMEMBER(EqInvKeyExpansion128) (CipherVec * w, const CipherVec * kw)
+{
+    AESBCMEMBER(EqInvKeyExpansion) (w, kw, AES_Nr_128);
+}
+
+
+static __inline__
+void AESBCMEMBER(EqInvKeyExpansion192) (CipherVec * w, const CipherVec * kw)
+{
+    AESBCMEMBER(EqInvKeyExpansion) (w, kw, AES_Nr_192);
+}
+
+
+static __inline__
+void AESBCMEMBER(EqInvKeyExpansion256) (CipherVec * w, const CipherVec * kw)
+{
+    AESBCMEMBER(EqInvKeyExpansion) (w, kw, AES_Nr_256);
+}
+
+
+/*
+ * Cipher First Round
+ */
+static __inline__ 
+CipherVec AESBCMEMBER(FirstRound) (CipherVec state, const CipherVec round_keys)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(FirstRound) (CipherVec state, const CipherVec round_keys)
+{
+    DEBUG_CIPHER_VECTOR("Start of Round", state);
+
+    DEBUG_CIPHER_VECTOR("Round Key", round_keys);
+
+    state = AESBCMEMBER(AddRoundKey) (state, round_keys);
+
+    DEBUG_CIPHER_VECTOR("End 1st Round", state);
+
+    return state;
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(MiddleRound) (register CipherVec state,
+                                    register const CipherVec round_keys)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(MiddleRound) (register CipherVec state,
+                                    register const CipherVec round_keys)
+{
+#if _DEBUGGING
+    CipherVec mstate;
+    mstate = state;
+
+    DEBUG_CIPHER_VECTOR("Start of Round", mstate);
+
+#endif
+
+#if USE_AES_NI
+    state = op_AESENC (state, round_keys);
+#else
+    state = AESBCMEMBER(SubBytes) (state);
+
+    DEBUG_CIPHER_VECTOR("After SubBytes", state);
+
+    state = AESBCMEMBER(ShiftRows) (state);
+
+    DEBUG_CIPHER_VECTOR("After ShiftRow", state);
+
+    state = AESBCMEMBER(MixColumns) (state);
+
+    /* ommited n on purpose */
+    DEBUG_CIPHER_VECTOR("After MixColum", state);
+
+    state = AESBCMEMBER(AddRoundKey) (state, round_keys);
+#endif
+    DEBUG_CIPHER_VECTOR("Round Key", round_keys);
+    DEBUG_CIPHER_VECTOR("End of Round", state);
+
+    return state;
+}
+
+
+static __inline__ 
+CipherVec AESBCMEMBER(LastRound) (register CipherVec state, register CipherVec round_keys)
+    __attribute__ ((always_inline));
+
+static __inline__ 
+CipherVec AESBCMEMBER(LastRound) (register CipherVec state, register CipherVec round_keys)
+{
+    DEBUG_CIPHER_VECTOR("Start of Round", state);
+
+#if USE_AES_NI
+    state = op_AESENCLAST (state, round_keys);
+#else
+    state = AESBCMEMBER(SubBytes) (state);
+
+    DEBUG_CIPHER_VECTOR("After SubBytes", state);
+
+    state = AESBCMEMBER(ShiftRows) (state);
+
+    DEBUG_CIPHER_VECTOR("After ShiftRow", state);
+
+    state = AESBCMEMBER(AddRoundKey) (state, round_keys);
+#endif
+    DEBUG_CIPHER_VECTOR("Round Key", round_keys);
+    DEBUG_CIPHER_VECTOR("End of Round", state);
+
+    return state;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Cipher
+ */
+/*
+ * 
+This implementation as stated
+ * above for simplifaction broke out the three types of rounds into
+ * first round, middle rounds, and last round.  This approach was taken
+ * for ease of coding for optimization using smaller bytes of code
+ * but inlining of the functions for efficiency
+ */
+static __inline__ 
+CipherVec AESBCMEMBER(Cipher) (CipherVec state, const CipherVec * key,
+                            unsigned Nr)
+{
+    unsigned ix = 0;
+
+    state = AESBCMEMBER(FirstRound) (state, key[ix++]);
+
+    for ( ; ix < Nr; ++ix)
+        state = AESBCMEMBER(MiddleRound) (state, key[ix] );
+
+    return AESBCMEMBER(LastRound) (state, key[ix]);
+}
+
+
+/* 
+ * Section 5.1 of FIPS 197
+ *
+ *   This set of routines implements our structured wrapping of the 
+ *   FIPS-197 Section 5.3.5 Equivalent Inverse Cipher.  In particular
+ *   figure 15 Pseudo Code for the Equivalent Inverse Cipher.
+ *
+ *   The FIPS pseudocode has a single function which we have broken out 
+ *   into three kinds of rounds - first round, middle rounds and last
+ *   round as we have also done with the cipher rountine.
+ *
+ *   The EqInvCipher operates on whole cipher blocks so the Byte and Block
+ *   code is the same here until subroutines of the round functions are
+ *   called.  
+ */
+
+/* 
+ * First round of equivalent inverse cipher is merely an XOR against the
+ * round key.
+ */
+static __inline__
+CipherVec AESBCMEMBER(EqInvFirstRound) (CipherVec state, CipherVec round_keys)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(EqInvFirstRound) (CipherVec state, CipherVec round_keys)
+{
+    DEBUG_INVCIPHER_VECTOR("Start of Round", state);
+
+    state =  AESBCMEMBER(AddRoundKey) (state, round_keys);
+
+    DEBUG_INVCIPHER_VECTOR("Round Key", round_keys);
+    DEBUG_INVCIPHER_VECTOR("End of Round", state);
+    return state;
+}
+
+
+/*
+ * middle rounds of the equivalent inverse cipher perform four steps
+ *   InvSubBytes (inverse substitute bytes
+ *   InvShiftRows (inverse shift rows
+ *   InvMixColumns (inverse mix columns)
+ *   AddRoundKey   (xor against the round key)
+ *
+ * the AES-NI instruction set from until implments all four steps with 
+ * a single instruction
+ */
+
+static __inline__
+CipherVec AESBCMEMBER(EqInvMiddleRound) (register CipherVec state,
+                                         register CipherVec round_keys)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(EqInvMiddleRound) (register CipherVec state,
+                                         register CipherVec round_keys)
+{
+#if _DEBUGGING
+    CipherVec mstate;
+    CipherVec mround_keys;
+
+    mstate = state;
+    mround_keys = round_keys;
+#endif
+
+    DEBUG_INVCIPHER_VECTOR("Start of Round", mstate);
+
+    /* 
+     * AES-NI implmentation
+     */
+#if USE_AES_NI
+
+    state = op_AESDEC (state, round_keys);
+
+#else /* #if USE_AES_NI */
+
+    /*
+     * All other implementations
+     */
+    state = AESBCMEMBER(InvSubBytes) (state);
+
+# if _DEBUGGING
+    mstate = state;
+
+    DEBUG_INVCIPHER_VECTOR("After InvSubBy", mstate);
+# endif
+
+    state = AESBCMEMBER(InvShiftRows) (state);
+
+# if _DEBUGGING
+    mstate = state;
+
+    DEBUG_INVCIPHER_VECTOR("After InvShift", mstate);
+# endif
+
+    state = AESBCMEMBER(InvMixColumns) (state);
+
+# if _DEBUGGING
+    mstate = state;
+
+    DEBUG_INVCIPHER_VECTOR("After InvMixCo", mstate);
+# endif
+
+    state = AESBCMEMBER(AddRoundKey) (state, round_keys);
+#endif
+
+#if _DEBUGGING
+    mstate = state;
+
+    DEBUG_INVCIPHER_VECTOR("Round Key", mround_keys);
+
+    DEBUG_INVCIPHER_VECTOR("End of Round", mstate);
+#endif /* #if USE_AES_NI */
+
+    return state;
+}
+
+
+/*
+ * The final round of the equivalent inverse cipher is the same as 
+ * the middle rounds with the ommission of the InvMixColumns step.
+ */
+static __inline__
+CipherVec AESBCMEMBER(EqInvLastRound) (register CipherVec state,
+                                       register CipherVec round_keys)
+    __attribute__ ((always_inline));
+
+static __inline__
+CipherVec AESBCMEMBER(EqInvLastRound) (register CipherVec state,
+                                       register CipherVec round_keys)
+{
+    DEBUG_INVCIPHER_VECTOR("Start of Round", state);
+
+#if USE_AES_NI
+    state = op_AESDECLAST (state, round_keys);
+#else
+
+    state = AESBCMEMBER(InvSubBytes) (state);
+
+    DEBUG_INVCIPHER_VECTOR("After InvSubBy", state);
+
+    state = AESBCMEMBER(InvShiftRows) (state);
+
+    DEBUG_INVCIPHER_VECTOR("After InvShift", state);
+
+    state = AESBCMEMBER(AddRoundKey) (state, round_keys);
+#endif
+    DEBUG_INVCIPHER_VECTOR("Round Key", round_keys);
+    DEBUG_INVCIPHER_VECTOR("End of Round", state);
+
+    return state;
+}
+
+
+/*
+ * The EqInvCipher functions (is defined in Figure 15 'Pseudo Code for
+ * for the Equivalent Inverse Cipher.  This implementation as stated
+ * above for simplifaction broke out the three types of rounds into
+ * first round, middle rounds, and last round.  This approach was taken
+ * for ease of coding for optimization using smaller bytes of code
+ * but inlining of the functions for efficiency
+ */
+static /*__inline__*/
+CipherVec AESBCMEMBER(EqInvCipher) (CipherVec state, const CipherVec * key,
+                                    unsigned Nr)
+{
+    unsigned ix = 0;
+
+    state = AESBCMEMBER(EqInvFirstRound) (state, key[ix++]);
+
+    for ( ; ix < Nr; ++ix)
+        state = AESBCMEMBER(EqInvMiddleRound) (state, key[ix] );
+
+    return AESBCMEMBER(EqInvLastRound) (state, key[ix]);
+}
+
+
+/* ======================================================================
+ * This section of the file is the use of the cipher defined above within
+ * our BlockCipherObject.
+ *
+ * These are the functions that will be directly referenced in the vector
+ * table for the block cipher.  These are not specifically derived from
+ * the FIPS-197 document.
+ */
+#include "blockcipher-impl.h"
+
+typedef struct AES_CLASS AES_CLASS;
+
+static const char AESBCMEMBER(aes_ncbi_name) [] = CLASS_STRING(AES_CLASS);
+
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *   How large is the stored key for this cipher?  Not the user key used
+ *   to create this key (key schedule)
+ *
+ *   This is needed by KCipher to know how large the KCipher objecr is at
+ *   allocation and to know how much of a buffer each decryption/encryption is
+ */
+static
+void AESBCMEMBER(Destroy) (const BLOCKCIPHER_VEC_IMPL * self)
+{
+    /* we use a constant object so do nothing */
+}
+
+
+/* ----------------------------------------------------------------------
+ * BlockSize
+ */
+static
+uint32_t AESBCMEMBER(BlockSize) ()
+{
+    return (uint32_t) sizeof (AESBlock);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KeySize
+ *   How large is the stored key for this cipher?  Not the user key used
+ *   to create this key (key schedule)
+ *
+ *   This is needed by KCipher to know how large the KCipher objecr is at
+ *   allocation and to know how much of a buffer each decryption/encryption is
+ */
+static
+uint32_t AESBCMEMBER(KeySize) ()
+{
+    return (uint32_t) sizeof (AESKeySchedule);
+}
+
+
+/* ----------------------------------------------------------------------
+ * SetEncryptKey
+ *   The KCipher calls this to have the block cipher build an encryption
+ *   key in the KCipher object
+ *
+ */
+static
+rc_t AESBCMEMBER(SetEncryptKey) (void * encrypt_key, const char * user_key,
+                                 uint32_t user_key_size)
+{
+    rc_t rc;
+    AESKeySchedule * key;
+
+    rc = 0;
+    key = encrypt_key;
+
+    switch (user_key_size)
+    {
+    case AES_Nk_128 * sizeof (AESWord):
+        key->number_of_rounds = AES_Nr_128;
+        AESBCMEMBER(KeyExpansion128) (key->round_keys, (AESByte*)user_key);
+        break;
+
+    case AES_Nk_192 * sizeof (AESWord):
+        key->number_of_rounds = AES_Nr_192;
+        AESBCMEMBER(KeyExpansion192) (key->round_keys, (AESByte*)user_key);
+        break;
+
+    case AES_Nk_256 * sizeof (AESWord):
+        key->number_of_rounds = AES_Nr_256;
+        AESBCMEMBER(KeyExpansion256) (key->round_keys, (AESByte*)user_key);
+        break;
+
+    default:
+        key->number_of_rounds = 0;
+        memset (key, 0, sizeof (*key));
+        rc = RC (rcKrypto, rcBlockCipher, rcUpdating, rcParam, rcInvalid);
+        break;
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * SetDecryptKey
+ *   The KCipher calls this to have the block cipher build an decryption
+ *   key in the KCipher object
+ *
+ */
+static
+rc_t AESBCMEMBER(SetDecryptKey) (void * decrypt_key,
+                                 const char * user_key,
+                                 uint32_t user_key_size)
+{
+    AESKeySchedule encrypt_key;
+    rc_t rc;
+
+    rc = AESBCMEMBER(SetEncryptKey) (&encrypt_key, user_key, user_key_size);
+    if (rc == 0)
+    {
+        AESKeySchedule * key;
+
+        key = decrypt_key;
+
+        switch (key->number_of_rounds = encrypt_key.number_of_rounds)
+        {
+        case AES_Nr_128:
+            AESBCMEMBER(EqInvKeyExpansion128) (key->round_keys,
+                                               encrypt_key.round_keys);
+            break;
+
+        case AES_Nr_192:
+            AESBCMEMBER(EqInvKeyExpansion192) (key->round_keys,
+                                               encrypt_key.round_keys);
+            break;
+
+        case AES_Nr_256:
+            AESBCMEMBER(EqInvKeyExpansion256) (key->round_keys,
+                                               encrypt_key.round_keys);
+            break;
+        }
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Encrypt
+ *
+ *   Perform an encryption of a single block.  Chained modes and stream
+ *   cipher modes will call this multiple times.
+ *
+ */
+static
+CipherVec AESBCMEMBER(Encrypt) (CipherVec state,
+                                const void * encrypt_key)
+{
+    const AESKeySchedule * key = encrypt_key;
+    assert (key);
+
+    switch (key->number_of_rounds)
+    {
+    default:
+        state = vec_00;
+        break;
+
+    case AES_Nr_128:
+        state = AESBCMEMBER(Cipher) (state, key->round_keys, AES_Nr_128);
+        break;
+
+    case AES_Nr_192:
+        state = AESBCMEMBER(Cipher) (state, key->round_keys, AES_Nr_192);
+        break;
+
+    case AES_Nr_256:
+        state = AESBCMEMBER(Cipher) (state, key->round_keys, AES_Nr_256);
+        break;
+    }
+
+    return state;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Decrypt
+ *
+ *   Perform a decryption of a single block.  Chained modes and stream
+ *   cipher modes will call this multiple times.
+ */
+static
+CipherVec AESBCMEMBER(Decrypt) (CipherVec state,
+                                const void * decrypt_key)
+{
+    const AESKeySchedule * key = decrypt_key;
+
+    assert (key);
+
+    switch (key->number_of_rounds)
+    {
+    default:
+        state = vec_00; /* for an illegal cipher key schedule just write zeroes */
+        break;
+
+    case AES_Nr_128:
+        state = AESBCMEMBER(EqInvCipher) (state, key->round_keys,
+                                          AES_Nr_128);
+        break;
+
+    case AES_Nr_192:
+        state = AESBCMEMBER(EqInvCipher) (state, key->round_keys,
+                                          AES_Nr_192);
+        break;
+
+    case AES_Nr_256:
+        state = AESBCMEMBER(EqInvCipher) (state, key->round_keys,
+                                          AES_Nr_256);
+        break;
+    }
+
+    return state;
+}
+
+
+/* ----------------------------------------------------------------------
+ * MakeProcessorSupport
+ *
+ * Run-time check for support of this particular AES implmentation by
+ * checking the flags given via the cpuid instruction.
+ */
+static __inline__
+bool AESBCMEMBER(ProcessorSupport) ()
+{
+    uint32_t level = 1, a, b, c, d;
+    bool ret = true;
+
+    __get_cpuid (level, &a, &b, &c, &d);
+
+    DEBUG_OBJECT(("%s: level %x a %x, b %x c %x d %x\n",__func__, level, a,b,c,d));
+
+#if USE_AES_NI
+    /*
+     * Only one flag tells whether the AES-NI instructions
+     * are implmented in this CPU
+     */
+    if ( ! (c & bit_AES))
+    {
+        DEBUG_OBJECT(("%s: failed no AES\n",__func__));
+        ret = false;
+    } else
+#endif
+
+#if USE_VEC_REG
+    /*
+     * Several flags indicate different levels of SSE
+     * instruction implmentation
+     *
+     * we require SSE4.1
+     *
+     * that dates from 2006 so is most likely good enough
+     */
+        /* if ( ! (c & (bit_SSE4_2))
+    {
+        DEBUG_OBJECT(("%s: failed no SSSE3\n",__func__));
+        ret = false;
+    }
+
+    else */
+        if ( ! (c & bit_SSE4_1))
+    {
+        DEBUG_OBJECT(("%s: failed no SSSE3\n",__func__));
+        ret = false;
+    }
+
+    else if ( ! (c & bit_SSSE3))
+    {
+        DEBUG_OBJECT(("%s: failed no SSSE3\n",__func__));
+        ret = false;
+    }
+
+    else if ( ! (c & bit_SSE3))
+    {
+        DEBUG_OBJECT(("%s: failed no SSE3\n",__func__));
+        ret = false;
+    }
+
+    else if ( ! (d & bit_SSE2))
+    {
+        DEBUG_OBJECT(("%s: failed no SSE2\n",__func__));
+        ret = false;
+    }
+
+    else if ( ! (d & bit_SSE))
+    {
+        DEBUG_OBJECT(("%s: failed no SSE\n",__func__));
+        ret = false;
+    }
+#endif
+    DEBUG_OBJECT(("%s: passed\n",__func__));
+    return ret;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Init
+ *
+ *   Initialize the fields of this object.  The derived class will call this
+ *   during it's initialization.
+ *
+ * self      object to initialze
+ * vt        the virtual table of the derived class
+ * mgr       the cipher manager that is the construction factory block cipher
+ *           objects hold references to the manager while the manager merely
+ *           points at the block ciphers when all block ciphers are destroyed
+ *           the manager loses its references and it too can be destroyed if not
+ *           held elsewhere
+ * name      ASCIZ c-string the name of this class
+ */
+static const
+KBlockCipherVec_vt_v1 AESBCMEMBER(_vt_) = 
+{
+    { 1, 1 },
+
+    AESBCMEMBER(Destroy),
+    AESBCMEMBER(BlockSize),
+    AESBCMEMBER(KeySize),
+    AESBCMEMBER(SetEncryptKey),
+    AESBCMEMBER(SetDecryptKey),
+    AESBCMEMBER(Encrypt),
+    AESBCMEMBER(Decrypt)
+};
+
+
+/* ----------------------------------------------------------------------
+ * Make
+ *
+ * Create a new AES Block Cipher object.
+ * The processor is checked to see if this particular version is supported on
+ * this particular CPU.
+ */
+rc_t AESBCMEMBER(Make) (KBlockCipher ** new_obj)
+{
+    rc_t rc;
+
+    DEBUG_OBJECT(("%s: %p\n",__func__,new_obj));
+
+    /* Check parameter first */
+    if (new_obj == NULL)
+        rc = RC (rcKrypto, rcBlockCipher, rcConstructing, rcSelf, rcNull);
+
+    else
+    {
+        *new_obj = NULL;
+
+        /* check for processor support of this flavor */
+        if ( ! AESBCMEMBER(ProcessorSupport)())
+            rc = RC (rcKrypto, rcBlockCipher, rcConstructing, rcFunction, rcUnsupported);
+
+        else
+        {
+            rc = 0;
+            *new_obj = (KBlockCipher*)&(AESBCMEMBER(_vt_));
+        }
+    }
+    return rc;
+}
+
+/* end of file lib/krypto/aes-ncbi.c */
diff --git a/libs/krypto/aes-priv.h b/libs/krypto/aes-priv.h
new file mode 100644
index 0000000..4ebdbb0
--- /dev/null
+++ b/libs/krypto/aes-priv.h
@@ -0,0 +1,94 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#ifndef _h_krypto_aes_priv_
+#define _h_krypto_aes_priv_
+
+/*
+ * This header file was written to integrate the public domain AES code
+ * with the SRA project
+ */
+
+#define AES_ENCRYPT	1
+#define AES_DECRYPT	0
+
+/* Because array size can't be a const in C, the following two are macros.
+   Both sizes are in bytes. */
+#define AES_MAXNR (14)
+#define AES_BLOCK_SIZE (16)
+
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+typedef uint8_t AES_BYTE;
+typedef uint32_t AES_WORD;
+
+
+
+
+/* typedef int64_t AESState  __attribute__ ((vector_size (AES_BLOCK_SIZE))); */
+
+typedef struct AES_KEY AES_KEY;
+struct AES_KEY
+{
+    uint32_t rd_key [sizeof (AES_WORD) * (AES_MAXNR + 1)];
+    uint32_t rounds;
+};
+
+
+int AES_set_encrypt_key(const uint8_t *userKey, const uint32_t bits,
+                        AES_KEY *key);
+
+int AES_set_decrypt_key(const uint8_t *userKey, const uint32_t bits,
+                        AES_KEY *key);
+
+void AES_encrypt(const uint8_t *in, uint8_t *out,
+                 const AES_KEY *key);
+void AES_decrypt(const uint8_t *in, uint8_t *out,
+                 const AES_KEY *key);
+
+
+int AESx86_set_encrypt_key(const uint8_t *userKey, const uint32_t bits,
+                        AES_KEY *key);
+
+int AESx86_set_decrypt_key(const uint8_t *userKey, const uint32_t bits,
+                        AES_KEY *key);
+
+void AESx86_encrypt(const uint8_t *in, uint8_t *out,
+                 const AES_KEY *key);
+void AES_decrypt(const uint8_t *in, uint8_t *out,
+                 const AES_KEY *key);
+
+
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif /* #ifndef _h_krypto_aes_priv_ */
+
+
diff --git a/libs/krypto/aes.c b/libs/krypto/aes.c
new file mode 100644
index 0000000..328ba6d
--- /dev/null
+++ b/libs/krypto/aes.c
@@ -0,0 +1 @@
+#error "Obsolete do not use"
diff --git a/libs/krypto/aes_core.c b/libs/krypto/aes_core.c
new file mode 100644
index 0000000..afc614b
--- /dev/null
+++ b/libs/krypto/aes_core.c
@@ -0,0 +1,1181 @@
+/*
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was modified as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *  Tweaked to match standards of the NCBI SRA project
+ * We obatined this file from version 1.0.0e of OpenSSL but we have
+ * eliminated the OpenSSL code where it could be identified
+ *
+ * We created our own header file as there was no public domain
+ * header file associated with this public domain C file.
+ */
+
+/**
+ * rijndael-alg-fst.c
+ *
+ * @version 3.0 (December 2000)
+ *
+ * Optimised ANSI C code for the Rijndael cipher (now AES)
+ *
+ * @author Vincent Rijmen <vincent.rijmen at esat.kuleuven.ac.be>
+ * @author Antoon Bosselaers <antoon.bosselaers at esat.kuleuven.ac.be>
+ * @author Paulo Barreto <paulo.barreto at terra.com.br>
+ *
+ * This code is hereby placed in the public domain.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS 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.
+ */
+
+
+#include <krypto/extern.h>
+#include <klib/defs.h>
+
+#include "aes-priv.h"
+
+#include <assert.h>
+
+
+#define FULL_UNROLL (true)
+
+# define GETU32(pt) (((uint32_t)(pt)[0] << 24) ^ ((uint32_t)(pt)[1] << 16) ^ ((uint32_t)(pt)[2] <<  8) ^ ((uint32_t)(pt)[3]))
+# define PUTU32(ct, st) (((ct)[0] = (uint8_t)((st) >> 24)), ((ct)[1] = (uint8_t)((st) >> 16)),((ct)[2] = (uint8_t)((st) >>  8)),((ct)[3] = (uint8_t)(st)))
+
+/*
+Te0[x] = S [x].[02, 01, 01, 03];
+Te1[x] = S [x].[03, 02, 01, 01];
+Te2[x] = S [x].[01, 03, 02, 01];
+Te3[x] = S [x].[01, 01, 03, 02];
+
+Td0[x] = Si[x].[0e, 09, 0d, 0b];
+Td1[x] = Si[x].[0b, 0e, 09, 0d];
+Td2[x] = Si[x].[0d, 0b, 0e, 09];
+Td3[x] = Si[x].[09, 0d, 0b, 0e];
+Td4[x] = Si[x].[01];
+*/
+
+static const uint32_t Te0[256] = {
+    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
+    0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
+    0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
+    0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
+    0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
+    0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
+    0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
+    0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
+    0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
+    0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
+    0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
+    0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
+    0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
+    0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
+    0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
+    0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
+    0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
+    0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
+    0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
+    0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
+    0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
+    0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
+    0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
+    0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
+    0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
+    0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
+    0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
+    0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
+    0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
+    0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
+    0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
+    0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
+    0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
+    0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
+    0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
+    0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
+    0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
+    0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
+    0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
+    0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
+    0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
+    0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
+    0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
+    0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
+    0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
+    0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
+    0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
+    0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
+    0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
+    0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
+    0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
+    0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
+    0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
+    0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
+    0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
+    0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
+    0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
+    0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
+    0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
+    0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
+    0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
+    0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
+    0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
+    0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
+};
+static const uint32_t Te1[256] = {
+    0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
+    0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
+    0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
+    0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
+    0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
+    0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
+    0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
+    0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
+    0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
+    0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
+    0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
+    0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
+    0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
+    0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
+    0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
+    0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
+    0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
+    0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
+    0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
+    0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
+    0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
+    0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
+    0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
+    0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
+    0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
+    0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
+    0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
+    0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
+    0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
+    0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
+    0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
+    0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
+    0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
+    0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
+    0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
+    0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
+    0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
+    0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
+    0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
+    0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
+    0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
+    0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
+    0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
+    0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
+    0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
+    0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
+    0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
+    0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
+    0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
+    0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
+    0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
+    0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
+    0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
+    0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
+    0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
+    0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
+    0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
+    0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
+    0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
+    0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
+    0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
+    0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
+    0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
+    0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
+};
+static const uint32_t Te2[256] = {
+    0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
+    0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
+    0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
+    0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
+    0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
+    0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
+    0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
+    0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
+    0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
+    0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
+    0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
+    0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
+    0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
+    0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
+    0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
+    0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
+    0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
+    0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
+    0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
+    0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
+    0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
+    0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
+    0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
+    0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
+    0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
+    0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
+    0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
+    0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
+    0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
+    0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
+    0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
+    0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
+    0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
+    0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
+    0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
+    0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
+    0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
+    0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
+    0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
+    0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
+    0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
+    0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
+    0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
+    0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
+    0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
+    0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
+    0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
+    0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
+    0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
+    0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
+    0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
+    0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
+    0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
+    0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
+    0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
+    0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
+    0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
+    0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
+    0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
+    0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
+    0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
+    0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
+    0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
+    0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
+};
+static const uint32_t Te3[256] = {
+    0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
+    0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
+    0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
+    0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
+    0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
+    0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
+    0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
+    0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
+    0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
+    0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
+    0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
+    0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
+    0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
+    0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
+    0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
+    0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
+    0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
+    0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
+    0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
+    0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
+    0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
+    0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
+    0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
+    0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
+    0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
+    0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
+    0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
+    0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
+    0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
+    0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
+    0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
+    0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
+    0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
+    0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
+    0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
+    0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
+    0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
+    0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
+    0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
+    0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
+    0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
+    0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
+    0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
+    0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
+    0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
+    0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
+    0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
+    0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
+    0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
+    0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
+    0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
+    0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
+    0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
+    0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
+    0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
+    0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
+    0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
+    0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
+    0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
+    0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
+    0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
+    0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
+    0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
+    0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
+};
+
+static const uint32_t Td0[256] = {
+    0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
+    0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
+    0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
+    0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
+    0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
+    0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
+    0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
+    0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
+    0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
+    0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
+    0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
+    0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
+    0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
+    0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
+    0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
+    0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
+    0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
+    0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
+    0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
+    0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
+    0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
+    0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
+    0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
+    0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
+    0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
+    0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
+    0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
+    0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
+    0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
+    0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
+    0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
+    0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
+    0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
+    0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
+    0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
+    0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
+    0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
+    0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
+    0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
+    0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
+    0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
+    0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
+    0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
+    0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
+    0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
+    0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
+    0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
+    0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
+    0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
+    0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
+    0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
+    0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
+    0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
+    0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
+    0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
+    0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
+    0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
+    0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
+    0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
+    0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
+    0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
+    0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
+    0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
+    0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
+};
+static const uint32_t Td1[256] = {
+    0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
+    0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
+    0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
+    0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
+    0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
+    0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
+    0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
+    0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
+    0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
+    0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
+    0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
+    0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
+    0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
+    0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
+    0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
+    0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
+    0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
+    0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
+    0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
+    0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
+    0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
+    0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
+    0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
+    0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
+    0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
+    0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
+    0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
+    0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
+    0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
+    0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
+    0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
+    0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
+    0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
+    0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
+    0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
+    0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
+    0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
+    0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
+    0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
+    0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
+    0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
+    0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
+    0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
+    0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
+    0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
+    0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
+    0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
+    0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
+    0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
+    0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
+    0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
+    0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
+    0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
+    0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
+    0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
+    0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
+    0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
+    0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
+    0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
+    0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
+    0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
+    0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
+    0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
+    0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
+};
+static const uint32_t Td2[256] = {
+    0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
+    0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
+    0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
+    0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
+    0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
+    0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
+    0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
+    0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
+    0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
+    0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
+    0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
+    0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
+    0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
+    0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
+    0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
+    0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
+    0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
+    0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
+    0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
+    0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
+    0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
+    0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
+    0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
+    0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
+    0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
+    0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
+    0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
+    0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
+    0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
+    0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
+    0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
+    0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
+    0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
+    0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
+    0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
+    0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
+    0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
+    0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
+    0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
+    0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
+    0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
+    0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
+    0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
+    0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
+    0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
+    0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
+    0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
+    0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
+    0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
+    0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
+    0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
+    0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
+    0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
+    0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
+    0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
+    0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
+    0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
+    0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
+    0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
+    0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
+    0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
+    0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
+    0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
+    0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
+};
+static const uint32_t Td3[256] = {
+    0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
+    0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
+    0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
+    0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
+    0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
+    0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
+    0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
+    0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
+    0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
+    0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
+    0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
+    0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
+    0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
+    0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
+    0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
+    0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
+    0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
+    0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
+    0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
+    0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
+    0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
+    0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
+    0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
+    0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
+    0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
+    0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
+    0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
+    0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
+    0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
+    0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
+    0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
+    0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
+    0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
+    0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
+    0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
+    0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
+    0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
+    0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
+    0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
+    0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
+    0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
+    0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
+    0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
+    0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
+    0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
+    0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
+    0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
+    0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
+    0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
+    0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
+    0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
+    0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
+    0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
+    0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
+    0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
+    0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
+    0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
+    0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
+    0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
+    0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
+    0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
+    0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
+    0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
+    0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
+};
+static const uint8_t Td4[256] = {
+    0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,
+    0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU,
+    0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U,
+    0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU,
+    0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU,
+    0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU,
+    0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U,
+    0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U,
+    0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U,
+    0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U,
+    0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,
+    0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U,
+    0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU,
+    0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U,
+    0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U,
+    0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU,
+    0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU,
+    0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U,
+    0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U,
+    0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU,
+    0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U,
+    0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,
+    0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U,
+    0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U,
+    0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U,
+    0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU,
+    0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU,
+    0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU,
+    0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U,
+    0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U,
+    0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U,
+    0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU,
+};
+static const uint32_t rcon[] = {
+	0x01000000, 0x02000000, 0x04000000, 0x08000000,
+	0x10000000, 0x20000000, 0x40000000, 0x80000000,
+	0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
+};
+
+/**
+ * Expand the cipher key into the encryption key schedule.
+ */
+int AES_set_encrypt_key(const uint8_t *userKey, const uint32_t bits,
+			AES_KEY *key) {
+
+	uint32_t *rk;
+   	int i = 0;
+	uint32_t temp;
+
+	if (!userKey || !key)
+		return -1;
+	if (bits != 128 && bits != 192 && bits != 256)
+		return -2;
+
+	rk = key->rd_key;
+
+	if (bits==128)
+		key->rounds = 10;
+	else if (bits==192)
+		key->rounds = 12;
+	else
+		key->rounds = 14;
+
+	rk[0] = GETU32(userKey     );
+	rk[1] = GETU32(userKey +  4);
+	rk[2] = GETU32(userKey +  8);
+	rk[3] = GETU32(userKey + 12);
+	if (bits == 128) {
+		while (1) {
+			temp  = rk[3];
+			rk[4] = rk[0] ^
+				(Te2[(temp >> 16) & 0xff] & 0xff000000) ^
+				(Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^
+				(Te0[(temp      ) & 0xff] & 0x0000ff00) ^
+				(Te1[(temp >> 24)       ] & 0x000000ff) ^
+				rcon[i];
+			rk[5] = rk[1] ^ rk[4];
+			rk[6] = rk[2] ^ rk[5];
+			rk[7] = rk[3] ^ rk[6];
+			if (++i == 10) {
+				return 0;
+			}
+			rk += 4;
+		}
+	}
+	rk[4] = GETU32(userKey + 16);
+	rk[5] = GETU32(userKey + 20);
+	if (bits == 192) {
+		while (1) {
+			temp = rk[ 5];
+			rk[ 6] = rk[ 0] ^
+				(Te2[(temp >> 16) & 0xff] & 0xff000000) ^
+				(Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^
+				(Te0[(temp      ) & 0xff] & 0x0000ff00) ^
+				(Te1[(temp >> 24)       ] & 0x000000ff) ^
+				rcon[i];
+			rk[ 7] = rk[ 1] ^ rk[ 6];
+			rk[ 8] = rk[ 2] ^ rk[ 7];
+			rk[ 9] = rk[ 3] ^ rk[ 8];
+			if (++i == 8) {
+				return 0;
+			}
+			rk[10] = rk[ 4] ^ rk[ 9];
+			rk[11] = rk[ 5] ^ rk[10];
+			rk += 6;
+		}
+	}
+	rk[6] = GETU32(userKey + 24);
+	rk[7] = GETU32(userKey + 28);
+	if (bits == 256) {
+		while (1) {
+			temp = rk[ 7];
+			rk[ 8] = rk[ 0] ^
+				(Te2[(temp >> 16) & 0xff] & 0xff000000) ^
+				(Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^
+				(Te0[(temp      ) & 0xff] & 0x0000ff00) ^
+				(Te1[(temp >> 24)       ] & 0x000000ff) ^
+				rcon[i];
+			rk[ 9] = rk[ 1] ^ rk[ 8];
+			rk[10] = rk[ 2] ^ rk[ 9];
+			rk[11] = rk[ 3] ^ rk[10];
+			if (++i == 7) {
+				return 0;
+			}
+			temp = rk[11];
+			rk[12] = rk[ 4] ^
+				(Te2[(temp >> 24)       ] & 0xff000000) ^
+				(Te3[(temp >> 16) & 0xff] & 0x00ff0000) ^
+				(Te0[(temp >>  8) & 0xff] & 0x0000ff00) ^
+				(Te1[(temp      ) & 0xff] & 0x000000ff);
+			rk[13] = rk[ 5] ^ rk[12];
+			rk[14] = rk[ 6] ^ rk[13];
+			rk[15] = rk[ 7] ^ rk[14];
+
+			rk += 8;
+        	}
+	}
+	return 0;
+}
+
+/**
+ * Expand the cipher key into the decryption key schedule.
+ */
+int AES_set_decrypt_key(const uint8_t *userKey, const uint32_t bits,
+                        AES_KEY *key) {
+
+	int status;
+    uint32_t *rk;
+	uint32_t i, j, temp;
+
+	/* first, start with an encryption schedule */
+	status = AES_set_encrypt_key(userKey, bits, key);
+	if (status < 0)
+		return status;
+
+	rk = key->rd_key;
+
+	/* invert the order of the round keys: */
+	for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) {
+		temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
+		temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
+		temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
+		temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
+	}
+	/* apply the inverse MixColumn transform to all round keys but the first and the last: */
+	for (i = 1; i < (key->rounds); i++) {
+		rk += 4;
+		rk[0] =
+			Td0[Te1[(rk[0] >> 24)       ] & 0xff] ^
+			Td1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^
+			Td2[Te1[(rk[0] >>  8) & 0xff] & 0xff] ^
+			Td3[Te1[(rk[0]      ) & 0xff] & 0xff];
+		rk[1] =
+			Td0[Te1[(rk[1] >> 24)       ] & 0xff] ^
+			Td1[Te1[(rk[1] >> 16) & 0xff] & 0xff] ^
+			Td2[Te1[(rk[1] >>  8) & 0xff] & 0xff] ^
+			Td3[Te1[(rk[1]      ) & 0xff] & 0xff];
+		rk[2] =
+			Td0[Te1[(rk[2] >> 24)       ] & 0xff] ^
+			Td1[Te1[(rk[2] >> 16) & 0xff] & 0xff] ^
+			Td2[Te1[(rk[2] >>  8) & 0xff] & 0xff] ^
+			Td3[Te1[(rk[2]      ) & 0xff] & 0xff];
+		rk[3] =
+			Td0[Te1[(rk[3] >> 24)       ] & 0xff] ^
+			Td1[Te1[(rk[3] >> 16) & 0xff] & 0xff] ^
+			Td2[Te1[(rk[3] >>  8) & 0xff] & 0xff] ^
+			Td3[Te1[(rk[3]      ) & 0xff] & 0xff];
+	}
+	return 0;
+}
+
+/*
+ * Encrypt a single block
+ * in and out can overlap
+ */
+void AES_encrypt(const uint8_t *in, uint8_t *out,
+		 const AES_KEY *key) {
+
+	const uint32_t *rk;
+	uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
+#ifndef FULL_UNROLL
+	int r;
+#endif /* ?FULL_UNROLL */
+
+	assert(in && out && key);
+	rk = key->rd_key;
+
+	/*
+	 * map byte array block to cipher state
+	 * and add initial round key:
+	 */
+	s0 = GETU32(in     ) ^ rk[0];
+	s1 = GETU32(in +  4) ^ rk[1];
+	s2 = GETU32(in +  8) ^ rk[2];
+	s3 = GETU32(in + 12) ^ rk[3];
+#ifdef FULL_UNROLL
+	/* round 1: */
+   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
+   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
+   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
+   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
+   	/* round 2: */
+   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
+   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
+   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
+   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
+	/* round 3: */
+   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
+   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
+   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
+   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
+   	/* round 4: */
+   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
+   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
+   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
+   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
+	/* round 5: */
+   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
+   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
+   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
+   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
+   	/* round 6: */
+   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
+   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
+   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
+   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
+	/* round 7: */
+   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
+   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
+   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
+   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
+   	/* round 8: */
+   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
+   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
+   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
+   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
+	/* round 9: */
+   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
+   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
+   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
+   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
+    if (key->rounds > 10) {
+        /* round 10: */
+        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
+        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
+        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
+        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
+        /* round 11: */
+        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
+        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
+        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
+        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
+        if (key->rounds > 12) {
+            /* round 12: */
+            s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
+            s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
+            s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
+            s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
+            /* round 13: */
+            t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
+            t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
+            t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
+            t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
+        }
+    }
+    rk += key->rounds << 2;
+#else  /* !FULL_UNROLL */
+    /*
+     * Nr - 1 full rounds:
+     */
+    r = key->rounds >> 1;
+    for (;;) {
+        t0 =
+            Te0[(s0 >> 24)       ] ^
+            Te1[(s1 >> 16) & 0xff] ^
+            Te2[(s2 >>  8) & 0xff] ^
+            Te3[(s3      ) & 0xff] ^
+            rk[4];
+        t1 =
+            Te0[(s1 >> 24)       ] ^
+            Te1[(s2 >> 16) & 0xff] ^
+            Te2[(s3 >>  8) & 0xff] ^
+            Te3[(s0      ) & 0xff] ^
+            rk[5];
+        t2 =
+            Te0[(s2 >> 24)       ] ^
+            Te1[(s3 >> 16) & 0xff] ^
+            Te2[(s0 >>  8) & 0xff] ^
+            Te3[(s1      ) & 0xff] ^
+            rk[6];
+        t3 =
+            Te0[(s3 >> 24)       ] ^
+            Te1[(s0 >> 16) & 0xff] ^
+            Te2[(s1 >>  8) & 0xff] ^
+            Te3[(s2      ) & 0xff] ^
+            rk[7];
+
+        rk += 8;
+        if (--r == 0) {
+            break;
+        }
+
+        s0 =
+            Te0[(t0 >> 24)       ] ^
+            Te1[(t1 >> 16) & 0xff] ^
+            Te2[(t2 >>  8) & 0xff] ^
+            Te3[(t3      ) & 0xff] ^
+            rk[0];
+        s1 =
+            Te0[(t1 >> 24)       ] ^
+            Te1[(t2 >> 16) & 0xff] ^
+            Te2[(t3 >>  8) & 0xff] ^
+            Te3[(t0      ) & 0xff] ^
+            rk[1];
+        s2 =
+            Te0[(t2 >> 24)       ] ^
+            Te1[(t3 >> 16) & 0xff] ^
+            Te2[(t0 >>  8) & 0xff] ^
+            Te3[(t1      ) & 0xff] ^
+            rk[2];
+        s3 =
+            Te0[(t3 >> 24)       ] ^
+            Te1[(t0 >> 16) & 0xff] ^
+            Te2[(t1 >>  8) & 0xff] ^
+            Te3[(t2      ) & 0xff] ^
+            rk[3];
+    }
+#endif /* ?FULL_UNROLL */
+    /*
+	 * apply last round and
+	 * map cipher state to byte array block:
+	 */
+	s0 =
+		(Te2[(t0 >> 24)       ] & 0xff000000) ^
+		(Te3[(t1 >> 16) & 0xff] & 0x00ff0000) ^
+		(Te0[(t2 >>  8) & 0xff] & 0x0000ff00) ^
+		(Te1[(t3      ) & 0xff] & 0x000000ff) ^
+		rk[0];
+	PUTU32(out     , s0);
+	s1 =
+		(Te2[(t1 >> 24)       ] & 0xff000000) ^
+		(Te3[(t2 >> 16) & 0xff] & 0x00ff0000) ^
+		(Te0[(t3 >>  8) & 0xff] & 0x0000ff00) ^
+		(Te1[(t0      ) & 0xff] & 0x000000ff) ^
+		rk[1];
+	PUTU32(out +  4, s1);
+	s2 =
+		(Te2[(t2 >> 24)       ] & 0xff000000) ^
+		(Te3[(t3 >> 16) & 0xff] & 0x00ff0000) ^
+		(Te0[(t0 >>  8) & 0xff] & 0x0000ff00) ^
+		(Te1[(t1      ) & 0xff] & 0x000000ff) ^
+		rk[2];
+	PUTU32(out +  8, s2);
+	s3 =
+		(Te2[(t3 >> 24)       ] & 0xff000000) ^
+		(Te3[(t0 >> 16) & 0xff] & 0x00ff0000) ^
+		(Te0[(t1 >>  8) & 0xff] & 0x0000ff00) ^
+		(Te1[(t2      ) & 0xff] & 0x000000ff) ^
+		rk[3];
+	PUTU32(out + 12, s3);
+}
+
+/*
+ * Decrypt a single block
+ * in and out can overlap
+ */
+void AES_decrypt(const uint8_t *in, uint8_t *out,
+		 const AES_KEY *key) {
+
+	const uint32_t *rk;
+	uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
+#ifndef FULL_UNROLL
+	int r;
+#endif /* ?FULL_UNROLL */
+
+	assert(in && out && key);
+	rk = key->rd_key;
+
+	/*
+	 * map byte array block to cipher state
+	 * and add initial round key:
+	 */
+    s0 = GETU32(in     ) ^ rk[0];
+    s1 = GETU32(in +  4) ^ rk[1];
+    s2 = GETU32(in +  8) ^ rk[2];
+    s3 = GETU32(in + 12) ^ rk[3];
+#ifdef FULL_UNROLL
+    /* round 1: */
+    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
+    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
+    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
+    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
+    /* round 2: */
+    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
+    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
+    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
+    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
+    /* round 3: */
+    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
+    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
+    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
+    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
+    /* round 4: */
+    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
+    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
+    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
+    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
+    /* round 5: */
+    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
+    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
+    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
+    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
+    /* round 6: */
+    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
+    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
+    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
+    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
+    /* round 7: */
+    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
+    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
+    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
+    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
+    /* round 8: */
+    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
+    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
+    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
+    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
+    /* round 9: */
+    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
+    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
+    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
+    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
+    if (key->rounds > 10) {
+        /* round 10: */
+        s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
+        s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
+        s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
+        s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
+        /* round 11: */
+        t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
+        t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
+        t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
+        t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
+        if (key->rounds > 12) {
+            /* round 12: */
+            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
+            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
+            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
+            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
+            /* round 13: */
+            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
+            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
+            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
+            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
+        }
+    }
+	rk += key->rounds << 2;
+#else  /* !FULL_UNROLL */
+    /*
+     * Nr - 1 full rounds:
+     */
+    r = key->rounds >> 1;
+    for (;;) {
+        t0 =
+            Td0[(s0 >> 24)       ] ^
+            Td1[(s3 >> 16) & 0xff] ^
+            Td2[(s2 >>  8) & 0xff] ^
+            Td3[(s1      ) & 0xff] ^
+            rk[4];
+        t1 =
+            Td0[(s1 >> 24)       ] ^
+            Td1[(s0 >> 16) & 0xff] ^
+            Td2[(s3 >>  8) & 0xff] ^
+            Td3[(s2      ) & 0xff] ^
+            rk[5];
+        t2 =
+            Td0[(s2 >> 24)       ] ^
+            Td1[(s1 >> 16) & 0xff] ^
+            Td2[(s0 >>  8) & 0xff] ^
+            Td3[(s3      ) & 0xff] ^
+            rk[6];
+        t3 =
+            Td0[(s3 >> 24)       ] ^
+            Td1[(s2 >> 16) & 0xff] ^
+            Td2[(s1 >>  8) & 0xff] ^
+            Td3[(s0      ) & 0xff] ^
+            rk[7];
+
+        rk += 8;
+        if (--r == 0) {
+            break;
+        }
+
+        s0 =
+            Td0[(t0 >> 24)       ] ^
+            Td1[(t3 >> 16) & 0xff] ^
+            Td2[(t2 >>  8) & 0xff] ^
+            Td3[(t1      ) & 0xff] ^
+            rk[0];
+        s1 =
+            Td0[(t1 >> 24)       ] ^
+            Td1[(t0 >> 16) & 0xff] ^
+            Td2[(t3 >>  8) & 0xff] ^
+            Td3[(t2      ) & 0xff] ^
+            rk[1];
+        s2 =
+            Td0[(t2 >> 24)       ] ^
+            Td1[(t1 >> 16) & 0xff] ^
+            Td2[(t0 >>  8) & 0xff] ^
+            Td3[(t3      ) & 0xff] ^
+            rk[2];
+        s3 =
+            Td0[(t3 >> 24)       ] ^
+            Td1[(t2 >> 16) & 0xff] ^
+            Td2[(t1 >>  8) & 0xff] ^
+            Td3[(t0      ) & 0xff] ^
+            rk[3];
+    }
+#endif /* ?FULL_UNROLL */
+    /*
+	 * apply last round and
+	 * map cipher state to byte array block:
+	 */
+   	s0 =
+   		(Td4[(t0 >> 24)       ] << 24) ^
+   		(Td4[(t3 >> 16) & 0xff] << 16) ^
+   		(Td4[(t2 >>  8) & 0xff] <<  8) ^
+   		(Td4[(t1      ) & 0xff])       ^
+   		rk[0];
+	PUTU32(out     , s0);
+   	s1 =
+   		(Td4[(t1 >> 24)       ] << 24) ^
+   		(Td4[(t0 >> 16) & 0xff] << 16) ^
+   		(Td4[(t3 >>  8) & 0xff] <<  8) ^
+   		(Td4[(t2      ) & 0xff])       ^
+   		rk[1];
+	PUTU32(out +  4, s1);
+   	s2 =
+   		(Td4[(t2 >> 24)       ] << 24) ^
+   		(Td4[(t1 >> 16) & 0xff] << 16) ^
+   		(Td4[(t0 >>  8) & 0xff] <<  8) ^
+   		(Td4[(t3      ) & 0xff])       ^
+   		rk[2];
+	PUTU32(out +  8, s2);
+   	s3 =
+   		(Td4[(t3 >> 24)       ] << 24) ^
+   		(Td4[(t2 >> 16) & 0xff] << 16) ^
+   		(Td4[(t1 >>  8) & 0xff] <<  8) ^
+   		(Td4[(t0      ) & 0xff])       ^
+   		rk[3];
+	PUTU32(out + 12, s3);
+}
+
diff --git a/libs/krypto/aes_x86core.c b/libs/krypto/aes_x86core.c
new file mode 100644
index 0000000..a139771
--- /dev/null
+++ b/libs/krypto/aes_x86core.c
@@ -0,0 +1,2 @@
+#error "Obsolete do not use"
+
diff --git a/libs/krypto/aesx86.c b/libs/krypto/aesx86.c
new file mode 100644
index 0000000..d45c73b
--- /dev/null
+++ b/libs/krypto/aesx86.c
@@ -0,0 +1 @@
+#error "obsolete do not use"
diff --git a/libs/krypto/blockcipher-byte-impl.h b/libs/krypto/blockcipher-byte-impl.h
new file mode 100644
index 0000000..2186c98
--- /dev/null
+++ b/libs/krypto/blockcipher-byte-impl.h
@@ -0,0 +1,113 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#error "no direct includes"
+
+#ifndef _h_krypto_blockcipher_byte_impl_
+#define _h_krypto_blockcipher_byte_impl_
+
+/* 
+ * NOTE:  Currently this is being written to support cipher blocks of
+ * exactly 128 bits.  It will have to be amended if alternative block
+ * sizes are need for other cipher blocks
+ */
+
+#include <krypto/extern.h>
+#include <klib/defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * CIPHER
+ *  
+ */
+#define CIPHER_BLOCK_MAX (16)
+
+typedef char CipherBlock [CIPHER_BLOCK_MAX];
+typedef struct CipherVec { CipherBlock block; } CipherVec;
+typedef union KBlockCipherByte KBlockCipherByte;
+
+#ifndef BLOCKCIPHER_BYTE_IMPL
+#define BLOCKCIPHER_BYTE_IMPL KBlockCipherByte
+#else
+typedef union KBlockCipherByte BLOCKCIPHER_BYTE_IMPL;
+#endif
+
+typedef struct KBlockCipherByte_vt KBlockCipherByte_vt;
+struct KBlockCipherByte_vt
+{
+    uint32_t maj;
+    uint32_t min;
+};
+
+
+typedef struct KBlockCipherByte_vt_v1 KBlockCipherByte_vt_v1;
+struct KBlockCipherByte_vt_v1
+{
+    KBlockCipherByte_vt version;
+
+    /* version == 1.x */
+
+    /* start minor version == 0 */
+    void        (* destroy         )(const BLOCKCIPHER_BYTE_IMPL * self);
+
+    uint32_t    (* block_size      )();
+
+    uint32_t    (* key_size        )();
+
+    rc_t        (* set_encrypt_key )(void * encrypt_key,
+                                     const char * user_key,
+                                     uint32_t user_key_bits);
+
+    rc_t        (* set_decrypt_key )(void * decrypt_key,
+                                     const char * user_key,
+                                     uint32_t user_key_bits);
+
+    void        (* encrypt         )(const CipherBlock in,
+                                     CipherBlock out,
+                                     const void * encrypt_key);
+
+    void        (* decrypt         )(const CipherBlock in,
+                                     CipherBlock out,
+                                     const void * encrypt_key);
+
+    /* end minor version == 0 */
+
+};
+
+union KBlockCipherByte
+{
+    KBlockCipherByte_vt    version;
+    KBlockCipherByte_vt_v1 v1;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_krypto_blockcipher_byte_impl_ */
diff --git a/libs/krypto/blockcipher-impl.h b/libs/krypto/blockcipher-impl.h
new file mode 100644
index 0000000..5d7d257
--- /dev/null
+++ b/libs/krypto/blockcipher-impl.h
@@ -0,0 +1,187 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_krypto_blockcipher_impl_
+#define _h_krypto_blockcipher_impl_
+
+/* 
+ * NOTE:  Currently this is being written to support cipher blocks of
+ * exactly 128 bits.  It will have to be amended if alternative block
+ * sizes are need for other cipher blocks
+ */
+
+#include <krypto/extern.h>
+#include <klib/defs.h>
+
+/*
+ * we need to know whether we are supporting vectors as 
+ * XMM type registers or as structs
+ */
+#include "ncbi-priv.h"
+
+
+#ifndef USE_VEC
+#error "USE_VEC most be defined true or false"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CIPHER_BLOCK_MAX (16)
+
+typedef char CipherBlock [CIPHER_BLOCK_MAX];
+
+#if USEVEC
+#include <v128.h>
+typedef v128_u8_t CipherVec;
+#else
+typedef struct CipherVec
+{
+    CipherBlock block;
+} CipherVec;
+#endif
+
+typedef struct KBlockCipher_vt KBlockCipher_vt;
+struct KBlockCipher_vt
+{
+    uint32_t maj;
+    uint32_t min;
+};
+
+typedef uint32_t BlockCipherType;
+enum block_cipher_type
+{
+    blockcipher_type_byte,
+    blockcipher_type_vec
+};
+
+
+typedef struct KBlockCipherByte_vt_v1 KBlockCipherByte_vt_v1;
+typedef union KBlockCipherByte KBlockCipherByte;
+
+#ifndef BLOCKCIPHER_BYTE_IMPL
+#define BLOCKCIPHER_BYTE_IMPL KBlockCipherByte
+#else
+typedef union KBlockCipherByte BLOCKCIPHER_BYTE_IMPL;
+#endif
+
+
+struct KBlockCipherByte_vt_v1
+{
+    KBlockCipher_vt version;
+
+    /* version == 1.x */
+
+    /* start minor version == 0 */
+    void        (* destroy         )(const BLOCKCIPHER_BYTE_IMPL * self);
+
+    uint32_t    (* block_size      )();
+
+    uint32_t    (* key_size        )();
+
+    rc_t        (* set_encrypt_key )(void * encrypt_key,
+                                     const char * user_key,
+                                     uint32_t user_key_bits);
+
+    rc_t        (* set_decrypt_key )(void * decrypt_key,
+                                     const char * user_key,
+                                     uint32_t user_key_bits);
+
+    void        (* encrypt         )(const CipherBlock in,
+                                     CipherBlock out,
+                                     const void * encrypt_key);
+
+    void        (* decrypt         )(const CipherBlock in,
+                                     CipherBlock out,
+                                     const void * encrypt_key);
+
+    /* end minor version == 0 */
+
+};
+
+union KBlockCipherByte
+{
+    KBlockCipher_vt        version;
+    KBlockCipherByte_vt_v1 v1;
+};
+
+
+typedef struct KBlockCipherVec_vt_v1 KBlockCipherVec_vt_v1;
+typedef union KBlockCipherVec KBlockCipherVec;
+
+#ifndef BLOCKCIPHER_VEC_IMPL
+#define BLOCKCIPHER_VEC_IMPL KBlockCipherVec
+#else
+typedef union KBlockCipherVec BLOCKCIPHER_VEC_IMPL;
+#endif
+
+
+struct KBlockCipherVec_vt_v1
+{
+    KBlockCipher_vt version;
+
+    /* version == 1.x */
+
+    /* start minor version == 0 */
+    void        (* destroy         )(const BLOCKCIPHER_VEC_IMPL * self);
+
+    uint32_t    (* block_size      )();
+
+    uint32_t    (* key_size        )();
+
+    rc_t        (* set_encrypt_key )(void * encrypt_key,
+                                     const char * user_key,
+                                     uint32_t user_key_size);
+
+    rc_t        (* set_decrypt_key )(void * decrypt_key,
+                                     const char * user_key,
+                                     uint32_t user_key_size);
+
+    CipherVec   (* encrypt         )(CipherVec block,
+                                     const void * encrypt_key);
+
+    CipherVec   (* decrypt         )(CipherVec block,
+                                     const void * decrypt_key);
+
+    /* end minor version == 0 */
+
+};
+
+union KBlockCipherVec
+{
+    KBlockCipher_vt       version;
+    KBlockCipherVec_vt_v1 v1;
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#endif /* _h_krypto_blockcipher_impl_ */
+
diff --git a/libs/krypto/blockcipher-priv.h b/libs/krypto/blockcipher-priv.h
new file mode 100644
index 0000000..d812f23
--- /dev/null
+++ b/libs/krypto/blockcipher-priv.h
@@ -0,0 +1,90 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_krypto_blockcipher_priv_
+#define _h_krypto_blockcipher_priv_
+
+#include <krypto/extern.h>
+#include "cipher-impl.h"
+
+#include "blockcipher-impl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ======================================================================
+ */
+/* typedef struct KBlockCipher KBlockCipher; */
+/*     typedef union KBlockCipher_vt KBlockCipher_vt; */
+
+/* ----------------------------------------------------------------------
+ * Init
+ *
+ *   Initialize the fields of this object.  The derived class will call this
+ *   during it's initialization.
+ *
+ * self      object to initialze
+ * vt        the virtual table of the derived class
+ * mgr       the cipher manager that is the construction factory block cipher
+ *           objects hold references to the manager while the manager merely
+ *           points at the block ciphers when all block ciphers are destroyed
+ *           the manager loses its references and it too can be destroyed if not
+ *           held elsewhere
+ * name      ASCIZ c-string the name of this class
+ */
+/* rc_t KBlockCipherInit (KBlockCipher * self, */
+/*                        const KBlockCipher_vt * vt, */
+/*                        const char * name); */
+
+
+typedef union KBlockCipher KBlockCipher;
+union KBlockCipher
+{
+    KBlockCipherByte byte;
+    KBlockCipherVec  vec;
+};
+
+
+rc_t KAESBlockCipherVecAesNiMake  (KBlockCipher ** vec_cipher);
+rc_t KAESBlockCipherVecRegMake    (KBlockCipher ** vec_cipher);
+rc_t KAESBlockCipherVecMake       (KBlockCipher ** vec_cipher);
+rc_t KAESBlockCipherByteMake      (KBlockCipher ** byte_cipher);
+
+rc_t KNullBlockCipherVecAesNiMake (KBlockCipher ** vec_cipher);
+rc_t KNullBlockCipherVecRegMake   (KBlockCipher ** vec_cipher);
+rc_t KNullBlockCipherVecMake      (KBlockCipher ** vec_cipher);
+rc_t KNullBlockCipherByteMake     (KBlockCipher ** byte_cipher);
+
+
+/* KRYPTO_EXTERN rc_t CC KBlockCipherAlloc (KBlockCipher ** obj, size_t z); */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* #ifndef _h_krypto_blockcipher_priv_ */
diff --git a/libs/krypto/blockcipher-vec-impl.h b/libs/krypto/blockcipher-vec-impl.h
new file mode 100644
index 0000000..798a643
--- /dev/null
+++ b/libs/krypto/blockcipher-vec-impl.h
@@ -0,0 +1,119 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#error "no direct includes"
+
+#ifndef _h_krypto_blockcipher_vec_impl_
+#define _h_krypto_blockcipher_vec_impl_
+
+/* 
+ * NOTE:  Currently this is being written to support cipher blocks of
+ * exactly 128 bits.  It will have to be amended if alternative block
+ * sizes are need for other cipher blocks
+ */
+
+#include <krypto/extern.h>
+#include <klib/defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * CIPHER
+ *  
+ */
+#define CIPHER_BLOCK_MAX (16)
+
+#ifdef GNUC
+#include <v128.h>
+typedef v128_u8_t CipherVec;
+#else
+typedef struct CipherVec CipherVec;
+#endif
+
+
+typedef union KBlockCipherVec KBlockCipherVec;
+
+#ifndef BLOCKCIPHER_VEC_IMPL
+#define BLOCKCIPHER_VEC_IMPL KBlockCipherVec
+#else
+typedef union KBlockCipherVec BLOCKCIPHER_VEC_IMPL;
+#endif
+
+typedef struct KBlockCipherVec_vt KBlockCipherVec_vt;
+struct KBlockCipherVec_vt
+{
+    uint32_t maj;
+    uint32_t min;
+};
+
+
+typedef struct KBlockCipherVec_vt_v1 KBlockCipherVec_vt_v1;
+struct KBlockCipherVec_vt_v1
+{
+    KBlockCipherVec_vt version;
+
+    /* version == 1.x */
+
+    /* start minor version == 0 */
+    void        (* destroy         )(const BLOCKCIPHER_VEC_IMPL * self);
+
+    uint32_t    (* block_size      )();
+
+    uint32_t    (* key_size        )();
+
+    rc_t        (* set_encrypt_key )(void * encrypt_key,
+                                     const char * user_key,
+                                     uint32_t user_key_size);
+
+    rc_t        (* set_decrypt_key )(void * decrypt_key,
+                                     const char * user_key,
+                                     uint32_t user_key_size);
+
+    CipherVec   (* encrypt         )(CipherVec block,
+                                     const void * encrypt_key);
+
+    CipherVec   (* decrypt         )(CipherVec block,
+                                     const void * decrypt_key);
+
+    /* end minor version == 0 */
+
+};
+
+union KBlockCipherVec
+{
+    KBlockCipherVec_vt    version;
+    KBlockCipherVec_vt_v1 v1;
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_krypto_blockcipher_vec_impl_ */
+
diff --git a/libs/krypto/blockcipher.c b/libs/krypto/blockcipher.c
new file mode 100644
index 0000000..22539eb
--- /dev/null
+++ b/libs/krypto/blockcipher.c
@@ -0,0 +1,3 @@
+#error "OBSOLETE do not use"
+
+
diff --git a/libs/krypto/cipher-byte.c b/libs/krypto/cipher-byte.c
new file mode 100644
index 0000000..e012a2a
--- /dev/null
+++ b/libs/krypto/cipher-byte.c
@@ -0,0 +1,522 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+/*
+ * KCipherByte is a byte oriented KCipher that can work on all processors
+ * and be built with all compilers
+ */
+#include <krypto/extern.h>
+#include <klib/defs.h>
+#include <krypto/cipher.h>
+
+#include "ncbi-priv.h"
+
+#include "blockcipher-impl.h"
+
+#include "cipher-impl.h"
+#include "cipher-priv.h"
+#include "blockcipher-priv.h"
+
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+const char MEMBER(ClassName)[] = CLASS_STRING(CIPHER_IMPL);
+
+/* 
+ * KCipher with unaligned data.  Byte alignment.
+ */
+struct KCipherByte
+{
+    KCipher dad;
+
+    const KBlockCipherByte * block_cipher;
+};
+
+
+static rc_t MEMBER(Destroy) (KCipherByte * self)
+{
+    rc_t rc = 0;
+
+    if (self)
+    {
+        rc =  KCipherDestroy (&self->dad);
+        free (self);
+    }
+    return rc;
+}
+
+
+static rc_t MEMBER(SetEncryptKey) (KCipherByte * self,
+                                   const char * user_key,
+                                   uint32_t user_key_bits)
+{
+    rc_t rc = 0;
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcUpdating, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        rc = self->block_cipher->v1.set_encrypt_key (self->dad.encrypt_key, user_key,
+                                                     user_key_bits);
+        break;
+    }
+    return rc;
+}
+
+
+static rc_t MEMBER(SetDecryptKey) (KCipherByte * self,
+                                   const char * user_key,
+                                   uint32_t user_key_bits)
+{
+    rc_t rc = 0;
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcDestroying, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        rc = self->block_cipher->v1.set_decrypt_key (self->dad.decrypt_key, user_key,
+                                                     user_key_bits);
+        break;
+    }
+    return rc;
+}
+
+
+static rc_t MEMBER(SetEncryptIvec)(KCipherByte * self,
+                                   const void * ivec)
+{
+    assert (self);
+    assert (ivec);
+
+    memmove (self->dad.encrypt_ivec, ivec, self->dad.block_size);
+
+    return 0;
+}
+
+
+static rc_t MEMBER(SetDecryptIvec)(KCipherByte * self,
+                                   const void * ivec)
+{
+    assert (self);
+    assert (ivec);
+
+    memmove (self->dad.decrypt_ivec, ivec, self->dad.block_size);
+
+    return 0;
+}
+
+
+static rc_t MEMBER(SetEncryptCounterFunc)(KCipherByte * self,
+                                          cipher_ctr_func func)
+{
+    assert (self);
+    assert (func);
+
+    self->dad.encrypt_counter_func = func;
+
+    return 0;
+}
+
+
+static rc_t MEMBER(SetDecryptCounterFunc)(KCipherByte * self,
+                                          cipher_ctr_func func)
+{
+    assert (self);
+    assert (func);
+
+    self->dad.decrypt_counter_func = func;
+
+    return 0;
+}
+
+
+static rc_t MEMBER(Encrypt)(const KCipherByte * self,
+                            const void * in, void * out)
+{
+    rc_t rc = 0;
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcEncoding, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        self->block_cipher->v1.encrypt (in, out, self->dad.encrypt_key);
+        break;
+    }
+    return rc;
+}
+
+
+static rc_t MEMBER(Decrypt)(const KCipherByte * self,
+                            const void * in, void * out)
+{
+    rc_t rc = 0;
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcEncoding, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        self->block_cipher->v1.decrypt (in, out, self->dad.decrypt_key);
+        break;
+    }
+    return rc;
+}
+
+
+static rc_t MEMBER(EncryptEcb)(const KCipherByte * self,
+                               const void * in, void * out,
+                               uint32_t block_count)
+{
+    rc_t rc = 0;
+    const char * pin = in;
+    char * pout = out;
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcEncoding, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        for (; block_count; --block_count)
+        {
+            self->block_cipher->v1.encrypt (pin, pout, self->dad.encrypt_key);
+
+            pin += self->dad.block_size;
+            pout += self->dad.block_size;
+        }
+        break;
+    }
+    return rc;
+}
+
+
+static rc_t MEMBER(DecryptEcb)(const KCipherByte * self,
+                               const void * in, void * out,
+                               uint32_t block_count)
+{
+    rc_t rc = 0;
+    const char * pin = in;
+    char * pout = out;
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcEncoding, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        for (; block_count; --block_count)
+        {
+            self->block_cipher->v1.decrypt (pin, pout, self->dad.decrypt_key);
+
+            pin += self->dad.block_size;
+            pout += self->dad.block_size;
+        }
+        break;
+    }
+    return rc;
+}
+
+
+static rc_t MEMBER(EncryptCbc)(KCipherByte * self,
+                               const void * in, void * out,
+                               uint32_t block_count)
+{
+    rc_t rc = 0;
+    const char * pin = in;
+    char * pout = out;
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcEncoding, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        if (block_count)
+        {
+            CipherBlock block;
+            unsigned ix;
+
+            memmove (block, self->dad.encrypt_ivec, self->dad.block_size);
+
+            do
+            {
+                for (ix = 0; ix < self->dad.block_size; ++ix)
+                    block[ix] ^= pin[ix];
+
+                self->block_cipher->v1.encrypt (block, block,
+                                                self->dad.encrypt_key);
+
+                memmove (pout, block, self->dad.block_size);
+
+                pin += self->dad.block_size;
+                pout += self->dad.block_size;
+
+            } while (--block_count);
+
+            memmove (self->dad.encrypt_ivec, block, self->dad.block_size);
+        }
+        break;
+    }
+    return rc;
+}
+
+
+static rc_t MEMBER(DecryptCbc)(KCipherByte * self,
+                               const void * in, void * out,
+                               uint32_t block_count)
+{
+    rc_t rc = 0;
+    const char * pin = in;
+    char * pout = out;
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcEncoding, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        if (block_count)
+        {
+            CipherBlock ivec;
+            CipherBlock block;
+            unsigned ix;
+
+            memmove (ivec, self->dad.decrypt_ivec, self->dad.block_size);
+
+            do
+            {
+                self->block_cipher->v1.decrypt (pin, block,
+                                                self->dad.decrypt_key);
+
+                for (ix = 0; ix < self->dad.block_size; ++ix)
+                    pout[ix] = block[ix] ^ ivec[ix];
+
+                memmove (ivec, pin, self->dad.block_size); 
+
+                pin += self->dad.block_size;
+                pout += self->dad.block_size;
+
+            } while (--block_count);
+
+            memmove (self->dad.decrypt_ivec, ivec, self->dad.block_size);
+        }
+        break;
+    }
+    return rc;
+}
+
+
+static rc_t MEMBER(EncryptPcbc)(KCipherByte * self,
+                                const void * in, void * out,
+                                uint32_t block_count)
+{
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+}
+
+
+static rc_t MEMBER(DecryptPcbc)(KCipherByte * self,
+                                const void * in, void * out,
+                                uint32_t block_count)
+{
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+}
+
+
+static rc_t MEMBER(EncryptCfb)(KCipherByte * self,
+                               const void * in, void * out,
+                               uint32_t block_count)
+{
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+}
+
+
+static rc_t MEMBER(DecryptCfb)(KCipherByte * self,
+                               const void * in, void * out,
+                               uint32_t block_count)
+{
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+}
+
+
+static rc_t MEMBER(EncryptOfb)(KCipherByte * self,
+                               const void * in, void * out,
+                               uint32_t block_count)
+{
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+}
+
+
+static rc_t MEMBER(DecryptOfb)(KCipherByte * self,
+                               const void * in, void * out,
+                               uint32_t block_count)
+{
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+}
+
+
+static rc_t MEMBER(EncryptCtr)(KCipherByte * self,
+                               const void * in, void * out,
+                               uint32_t block_count)
+{
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+}
+
+
+static rc_t MEMBER(DecryptCtr)(KCipherByte * self,
+                               const void * in, void * out,
+                               uint32_t block_count)
+{
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+}
+
+
+static struct KCipher_vt_v1 MEMBER(_vt_v1) =
+{
+    { 1, 0 },
+
+    MEMBER(Destroy),
+    MEMBER(SetEncryptKey),
+    MEMBER(SetDecryptKey),
+    MEMBER(SetEncryptIvec),
+    MEMBER(SetDecryptIvec),
+    MEMBER(SetEncryptCounterFunc),
+    MEMBER(SetDecryptCounterFunc),
+    MEMBER(Encrypt),
+    MEMBER(Decrypt),
+    MEMBER(EncryptEcb),
+    MEMBER(DecryptEcb),
+    MEMBER(EncryptCbc),
+    MEMBER(DecryptCbc),
+    MEMBER(EncryptPcbc),
+    MEMBER(DecryptPcbc),
+    MEMBER(EncryptCfb),
+    MEMBER(DecryptCfb),
+    MEMBER(EncryptOfb),
+    MEMBER(DecryptOfb),
+    MEMBER(EncryptCtr),
+    MEMBER(DecryptCtr)
+};
+
+
+static __inline__ rc_t MEMBER(Alloc)(KCipherByte ** pobj,
+                                     const KBlockCipher * block_cipher)
+{
+    size_t block_size = block_cipher->byte.v1.block_size();
+    size_t key_size = block_cipher->byte.v1.key_size();
+    rc_t rc = 0;
+
+    *pobj = calloc (1, sizeof (**pobj) + 2 * key_size + 2 * block_size);
+    if (*pobj == NULL)
+        rc = RC (rcKrypto, rcCipher, rcConstructing, rcMemory, rcExhausted);
+
+    return rc;
+}
+
+
+static __inline__ rc_t MEMBER(Init)(KCipherByte * self,
+                                    const KBlockCipher * block_cipher)
+{
+    KCipher * dad = &self->dad;
+    size_t block_size = block_cipher->byte.v1.block_size();
+    size_t key_size = block_cipher->byte.v1.key_size();
+
+    KCipherInit (dad, (uint32_t) block_size,
+                 (const KCipher_vt*)&MEMBER(_vt_v1),
+                 MEMBER(ClassName));
+
+    dad->encrypt_key = (uint8_t *)(self + 1);
+    dad->decrypt_key = ((uint8_t *)dad->encrypt_key) + key_size;
+    dad->encrypt_ivec = ((uint8_t *)dad->decrypt_key) + key_size;
+    dad->decrypt_ivec = ((uint8_t *)dad->encrypt_ivec) + block_size;
+
+    self->block_cipher = &block_cipher->byte;
+
+    return 0;
+}
+
+
+rc_t MEMBER(Make) (KCipher ** new_obj, kcipher_type type)
+{
+    rc_t rc;
+    KBlockCipher * block_cipher;
+
+    if (new_obj == NULL)
+        return RC (rcKrypto, rcCipher, rcConstructing, rcSelf, rcNull);
+
+    *new_obj = NULL;
+
+    switch (type)
+    {
+    default:
+        return RC (rcKrypto, rcCipher, rcConstructing, rcParam, rcInvalid);
+
+    case kcipher_null:
+        rc = NULLBCMEMBER(Make)(&block_cipher);
+        break;
+
+    case kcipher_AES:
+        rc = AESBCMEMBER(Make)(&block_cipher);
+        break;
+    }
+
+    if (rc == 0)
+    {
+        KCipherByte * obj;
+
+        rc = MEMBER(Alloc)(&obj, block_cipher);
+        if (rc == 0)
+        {
+            rc = MEMBER(Init)(obj, block_cipher);
+            if (rc == 0)
+                *new_obj = &obj->dad;
+            else
+                free (obj);
+        }
+    }
+    return rc;
+}
+
+/* EOF */
diff --git a/libs/krypto/cipher-impl.h b/libs/krypto/cipher-impl.h
new file mode 100644
index 0000000..fbccdb5
--- /dev/null
+++ b/libs/krypto/cipher-impl.h
@@ -0,0 +1,174 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_krypto_cipher_impl_
+#define _h_krypto_cipher_impl_
+
+#include <krypto/extern.h>
+#include <klib/defs.h>
+#include <klib/refcount.h>
+#include <krypto/cipher.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifndef CIPHER_IMPL
+#define CIPHER_IMPL KCipher
+#else
+struct CIPHER_IMPL;
+typedef struct CIPHER_IMPL CIPHER_IMPL;
+#endif
+
+typedef struct KCipher_vt KCipher_vt;
+struct KCipher_vt
+{
+    uint32_t maj;
+    uint32_t min;
+};
+
+
+typedef struct KCipher_vt_v1 KCipher_vt_v1;
+struct KCipher_vt_v1
+{
+    KCipher_vt version;
+
+    /* version == 1.x */
+    /* start minor version == 0 */
+    rc_t ( CC * destroy             )(CIPHER_IMPL * self);
+
+    rc_t ( CC * set_encrypt_key     )(CIPHER_IMPL * self,
+                                      const char * user_key,
+                                      uint32_t user_key_bits);
+
+    rc_t ( CC * set_decrypt_key     )(CIPHER_IMPL * self,
+                                      const char * user_key,
+                                      uint32_t user_key_bits);
+
+    rc_t ( CC * set_encrypt_ivec    )(CIPHER_IMPL * self,
+                                      const void * ivec);
+
+    rc_t ( CC * set_decrypt_ivec    )(CIPHER_IMPL * self,
+                                      const void * ivec);
+
+    rc_t ( CC * set_encrypt_ctr_func)(CIPHER_IMPL * self,
+                                      cipher_ctr_func enc_ctr_func);
+
+    rc_t ( CC * set_decrypt_ctr_func)(CIPHER_IMPL * self,
+                                      cipher_ctr_func enc_ctr_func);
+
+    /* single block encryption */
+    rc_t ( CC * encrypt             )(const CIPHER_IMPL * self,
+                                      const void * in,
+                                      void * out);
+    rc_t ( CC * decrypt             )(const CIPHER_IMPL * self,
+                                      const void * in,
+                                      void * out);
+
+    /* electronic code book */
+    rc_t ( CC * encrypt_ecb         )(const CIPHER_IMPL * self,
+                                      const void * in,
+                                      void * out,
+                                      uint32_t block_count);
+
+    rc_t ( CC * decrypt_ecb         )(const CIPHER_IMPL * self,
+                                      const void * in,
+                                      void * out,
+                                      uint32_t block_count);
+
+    /* cipher-block chaining */
+    rc_t ( CC * encrypt_cbc         )(CIPHER_IMPL * self,
+                                      const void * in,
+                                      void * out,
+                                      uint32_t block_count);
+    rc_t ( CC * decrypt_cbc         )(CIPHER_IMPL * self,
+                                      const void * in,
+                                      void * out,
+                                      uint32_t block_count);
+
+    /* propagating cipher-block chaining */
+    rc_t ( CC * encrypt_pcbc        )(CIPHER_IMPL * self, const void * in,
+                                      void * out, uint32_t block_count);
+    rc_t ( CC * decrypt_pcbc        )(CIPHER_IMPL * self, const void * in,
+                                      void * out, uint32_t block_count);
+
+    /* cipher feedback */
+    rc_t ( CC * encrypt_cfb         )(CIPHER_IMPL * self, const void * in,
+                                      void * out, uint32_t block_count);
+    rc_t ( CC * decrypt_cfb         )(CIPHER_IMPL * self, const void * in,
+                                      void * out, uint32_t block_count);
+
+    /* output feedback */
+    rc_t ( CC * encrypt_ofb         )(CIPHER_IMPL * self, const void * in,
+                                      void * out, uint32_t block_count);
+    rc_t ( CC * decrypt_ofb         )(CIPHER_IMPL * self, const void * in,
+                                      void * out, uint32_t block_count);
+
+    /* Counter */
+    rc_t ( CC * encrypt_ctr         )(CIPHER_IMPL * self, const void * in,
+                                      void * out, uint32_t block_count);
+    rc_t ( CC * decrypt_ctr         )(CIPHER_IMPL * self, const void * in,
+                                      void * out, uint32_t block_count);
+
+    /* end minor version == 0 */
+
+    /* ANY NEW ENTRIES MUST BE REFLECTED IN libs/krypto/cipher.c
+       BY BOTH THE CORRESPONDING MESSAGE DISPATCH FUNCTION(s) AND
+       VTABLE VALIDITY CHECKS IN CIPHERInit */
+};
+
+typedef union KCipher_ptr KCipher_ptr;
+union KCipher_ptr
+{
+    const KCipher_vt    * version;
+    const KCipher_vt_v1 * v1;
+};
+
+
+struct KCipher
+{
+    KRefcount refcount;
+    uint32_t block_size;
+    KCipher_ptr vt;
+    const char * name;
+    void * encrypt_key;
+    void * decrypt_key;
+    void * encrypt_ivec;
+    void * decrypt_ivec;
+    cipher_ctr_func encrypt_counter_func;
+    cipher_ctr_func decrypt_counter_func;
+};
+
+void KCipherInit (KCipher * self, uint32_t block_size,
+                  const KCipher_vt * vt, const char * name);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_krypto_cipher_impl_ */
diff --git a/libs/krypto/cipher-no-vec.c b/libs/krypto/cipher-no-vec.c
new file mode 100644
index 0000000..7e0eded
--- /dev/null
+++ b/libs/krypto/cipher-no-vec.c
@@ -0,0 +1,41 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <krypto/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+
+#include <krypto/ciphermgr.h>
+#include "cipher-priv.h"
+#include "ncbi-priv.h"
+
+struct KCipher;
+
+rc_t CMEMBER(Make) (struct KCipher ** new_obj, kcipher_type type)
+{
+    return RC (rcKrypto, rcCipher, rcConstructing, rcFunction, rcUnsupported);
+}
+
+
+/* EOF */
diff --git a/libs/krypto/cipher-priv.h b/libs/krypto/cipher-priv.h
new file mode 100644
index 0000000..bcc39e5
--- /dev/null
+++ b/libs/krypto/cipher-priv.h
@@ -0,0 +1,79 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#ifndef _h_krypto_cipher_priv_
+#define _h_krypto_cipher_priv_
+
+#include <krypto/extern.h>
+#include <krypto/ciphermgr.h>
+#include <krypto/cipher.h>
+
+#include <klib/refcount.h>
+
+/*
+ * klib/rc.h ran out of room for new targets so we'll fake it for now
+ * with a now unused target that will unfortunately leave some
+ * confusing rc to english translations
+ */
+#define rcBlockCipher rcRng
+#define rcCipher      rcRng
+
+/*
+ * for use within krypto and krypto testing
+ */
+
+enum e_aes_type
+{
+    kcipher_AES_core,     /* Rijndael aes_core.c portable */
+    kcipher_AES_ncbi_sim, /* clean AES written for NCBI specifically from the  */
+    kcipher_AES_ncbi_vec, /* xmm vector version version */
+    kcipher_AES_ncbi_ni,  /* 64 bit AES-NI version */
+    kcipher_AES_count
+};
+
+rc_t KCipherMake         (struct KCipher ** new_cipher,
+                          kcipher_type type);
+rc_t KCipherVecAesNiMake (struct KCipher ** new_cipher,
+                          kcipher_type type);
+rc_t KCipherVecRegMake   (struct KCipher ** new_cipher,
+                          kcipher_type type);
+rc_t KCipherVecMake      (struct KCipher ** new_cipher,
+                          kcipher_type type);
+rc_t KCipherByteMake     (struct KCipher ** new_cipher,
+                          kcipher_type type);
+
+/*
+ * not for use outside krypto
+ */
+rc_t KCipherDestroy (struct KCipher * self);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* #ifndef _h_krypto_cipher_priv_ */
diff --git a/libs/krypto/cipher-vec.c b/libs/krypto/cipher-vec.c
new file mode 100644
index 0000000..761ab79
--- /dev/null
+++ b/libs/krypto/cipher-vec.c
@@ -0,0 +1,808 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <krypto/extern.h>
+#include <klib/defs.h>
+
+/* CIPHER_IMPL and BLOCKCIPHER_IMPL are defined in this header */
+#include "ncbi-priv.h"
+/* CIPHER_IMPL is used in this header */
+#include "cipher-impl.h"
+/* BLOCKCIPHER_IMPL is used in this header */
+#include "blockcipher-impl.h"
+
+#include "aes-ncbi-priv.h"
+#include "null-ncbi-priv.h"
+#include "cipher-priv.h"
+#include "blockcipher-priv.h"
+
+#include <krypto/cipher.h>
+#include <krypto/ciphermgr.h>
+
+#include <klib/defs.h>
+#include <klib/refcount.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+const char CMEMBER(ClassName)[] = CLASS_STRING(CIPHER_IMPL);
+
+
+
+struct CIPHER_IMPL
+{
+    KCipher dad;
+    const KBlockCipherVec * block_cipher;
+};
+
+typedef union CipherVec_u
+{
+    CipherVec   vec;
+    CipherBlock block;
+} CipherVec_u;
+
+/*
+ * Read a blocks worth of bytes into an AESState
+ */
+static __inline__ CipherVec CipherVecIn (const void * cvin)
+{
+#if USE_VEC_REG
+    register CipherVec cv;
+
+    __asm__ (
+        "movdqu (%[a]),%[s]" : [s] "=x" (cv) : [a] "D" (cvin)
+        );
+
+    return cv;
+#else
+    CipherVec_u u;
+
+    memmove (&u.block, cvin, sizeof (u));
+    return u.vec;
+#endif
+}
+
+
+
+/*
+ * Write a block's worth of bytes out from an AESState
+ */
+static __inline__ void CipherVecOut (const CipherVec cv, void * cvout)
+{
+#if USE_VEC_REG
+    register CipherVec rcv = cv;
+
+    __asm__ (
+        "movdqu %[s],(%[a])" : : [s] "x" (rcv), [a] "D" (cvout)
+        );
+#else
+    CipherVec lcv = cv;
+    memmove (cvout, &lcv, sizeof (lcv));
+#endif
+}
+
+
+static rc_t CMEMBER(Destroy) (CIPHER_IMPL * self)
+{
+    rc_t rc = 0;
+
+    if (self)
+    {
+        rc =  KCipherDestroy (&self->dad);
+        free (self);
+    }
+    return rc;
+}
+
+
+static rc_t CMEMBER(SetEncryptKey)(CIPHER_IMPL * self,
+                                  const char * user_key,
+                                  uint32_t user_key_bits)
+{
+    rc_t rc = 0;
+
+    assert (self);
+    assert (user_key);
+    assert (user_key_bits);
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcUpdating, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        self->block_cipher->v1.set_encrypt_key (self->dad.encrypt_key, user_key,
+                                                user_key_bits);
+        break;
+    }
+    return rc;
+}
+
+
+static rc_t CMEMBER(SetDecryptKey)(CIPHER_IMPL * self,
+                                  const char * user_key,
+                                  uint32_t user_key_bits)
+{
+    rc_t rc = 0;
+
+    assert (self);
+    assert (user_key);
+    assert (user_key_bits);
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcUpdating, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        self->block_cipher->v1.set_decrypt_key (self->dad.decrypt_key, user_key,
+                                                    user_key_bits);
+        break;
+    }
+    return rc;
+}
+
+
+static
+rc_t CMEMBER(SetEncryptIvec) (CIPHER_IMPL * self,
+                             const void * ivec)
+{
+    assert (self);
+    assert (ivec);
+
+    memmove (self->dad.encrypt_ivec, ivec, self->dad.block_size);
+
+    return 0;
+}
+
+
+static
+rc_t CMEMBER(SetDecryptIvec) (CIPHER_IMPL * self,
+                             const void * ivec)
+{
+    assert (self);
+    assert (ivec);
+
+    memmove (self->dad.decrypt_ivec, ivec, self->dad.block_size);
+
+    return 0;
+}
+
+
+static
+rc_t CMEMBER(SetEncryptCounterFunc) (CIPHER_IMPL * self,
+                                    cipher_ctr_func func)
+{
+    assert (self);
+    assert (func);
+
+    self->dad.encrypt_counter_func = func;
+
+    return 0;
+}
+
+
+static
+rc_t CMEMBER(SetDecryptCounterFunc) (CIPHER_IMPL * self,
+                                    cipher_ctr_func func)
+{
+    assert (self);
+    assert (func);
+
+    self->dad.decrypt_counter_func = func;
+
+    return 0;
+}
+
+
+static __inline__ CipherVec CMEMBER(EncryptV1)(const CIPHER_IMPL * self,
+                                              register CipherVec cv)
+{
+    return self->block_cipher->v1.encrypt (cv, self->dad.encrypt_key);
+}
+
+
+static __inline__ CipherVec  CMEMBER(DecryptV1)(const CIPHER_IMPL * self,
+                                              register CipherVec cv)
+{
+    return self->block_cipher->v1.decrypt (cv, self->dad.decrypt_key);
+}
+
+
+static __inline__ rc_t CMEMBER(EncryptV1Int)(const CIPHER_IMPL * self,
+                                            const void * in, void * out)
+{
+    CipherVec cv;
+
+    cv = CipherVecIn(in);
+    cv = CMEMBER(EncryptV1)(self, cv);
+    CipherVecOut(cv, out);
+    return 0;
+}
+
+
+static __inline__ rc_t CMEMBER(DecryptV1Int)(const CIPHER_IMPL * self,
+                                            const void * in, void * out)
+{
+    CipherVec cv;
+
+    cv = CipherVecIn(in);
+    cv = CMEMBER(DecryptV1)(self, cv);
+    CipherVecOut(cv, out);
+    return 0;
+}
+
+
+static rc_t CMEMBER(Encrypt) (const CIPHER_IMPL * self, const void * in, void * out)
+{
+    rc_t rc;
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcEncoding, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        rc = CMEMBER(EncryptV1Int)(self, in, out);
+        break;
+    }
+
+    return rc;
+}
+
+
+static
+rc_t CMEMBER(Decrypt) (const CIPHER_IMPL * self, const void * in, void * out)
+{
+    rc_t rc = 0;
+
+    switch (self->block_cipher->version.maj)
+    {
+    default:
+        rc = RC (rcKrypto, rcCipher, rcEncoding, rcBlockCipher, rcBadVersion);
+        break;
+
+    case 1:
+        rc = CMEMBER(DecryptV1Int)(self, in, out);
+        break;
+    }
+
+    return rc;
+}
+
+
+/* ====================
+ * longer runs of multiple blocks.
+ *
+ * The algorithms are well defined and standard in most cases
+ *
+ * These aremore or elss equivalent to class functions as they do not depend upon
+ * the operation of the cipher and the algorithms are independent of anything about
+ * the cipher other than its block size.
+ *
+ * PT: plain text block
+ * CT: cipher text block
+ * EK: encryption key
+ * DK: decryption key (might be sthe same as EK)
+ * ENC: encrypt cipher function on a block using a key
+ * DEC: decrypt cipher function on a block using a key
+ * IV: initialization vector - used as feedback for chaining
+ * N:  number used once (nonce)
+ * FB: feedback is the next IV in a chained/feedback mode
+ */
+
+
+/* -----
+ * NOTE:
+ * 'in' can be the same as 'out' but other overlaps are dangers as a block at a
+ * time is written. The code does not look for overlaps at this point.
+ */
+
+/* ----------
+ * Electronic Code Book - simple cipher with no chaining feedback  just iterate
+ * simple encrypt/decrypt with the plain, text, cipher text and key/
+ *
+ * CT = ENC (PT,EK)
+ * PT = DEC (CT,DK)
+ */
+
+/* -----
+ * NOTE: currently an implmentation detail limits us to 8192 bit cipher block
+ * size.  Changing MAX_BLOCK_SIZE in cipher.c can up that limit without 
+ * causing any other compatibility issues. 
+ *
+ * Two local byte arrays are defined on the stack of 1024 bytes or 8192 bits.
+ */
+static
+rc_t CMEMBER(EncryptEcb) (const CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+    const uint8_t * pin;
+    uint8_t * pout;
+
+    for ((pin = in), (pout = out);
+         block_count --; 
+         (pin += self->dad.block_size), (pout += self->dad.block_size))
+    {
+        CMEMBER(EncryptV1Int)(self, pin, pout);
+    }
+    return 0;
+}
+
+
+static
+rc_t CMEMBER(DecryptEcb) (const CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+    const uint8_t * pin;
+    uint8_t * pout;
+
+    for ((pin = in), (pout = out);
+         block_count --; 
+         (pin += self->dad.block_size), (pout += self->dad.block_size))
+    {
+        CMEMBER(DecryptV1Int)(self, pin, pout);
+    }
+
+    return 0;
+}
+
+
+/* ----------
+ * Cipher-Block Chaining
+ * CT = (FB = ENC (PT^IV, EK))
+ * PT = DEC ((FB = CT), DK)
+ */
+static
+rc_t CMEMBER(EncryptCbc) (CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+    CipherVec cv;
+    CipherVec ivec;
+    const uint8_t * pin;
+    uint8_t * pout;
+
+#if 0
+    ivec = *(const CipherVec*)self->dad.encrypt_ivec;
+#else
+    ivec = CipherVecIn (self->dad.encrypt_ivec);
+#endif
+
+    for ((pin = in), (pout = out);
+         block_count --; 
+         (pin += self->dad.block_size), (pout += self->dad.block_size))
+    {
+        cv = CipherVecIn (pin);
+        cv ^= ivec;
+        ivec = CMEMBER(EncryptV1)(self, cv);
+        CipherVecOut (ivec, pout);
+    }
+
+#if 0
+    *(CipherVec*)self->dad.encrypt_ivec = ivec;
+#else
+    CipherVecOut (ivec, self->dad.encrypt_ivec);
+#endif
+
+    return 0;
+}    
+
+
+static
+rc_t CMEMBER(DecryptCbc) (CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+    CipherVec cv;
+    CipherVec ivec;
+    const uint8_t * pin;
+    uint8_t * pout;
+
+    ivec = CipherVecIn (self->dad.decrypt_ivec);
+
+    for ((pin = in), (pout = out);
+         block_count --; 
+         (pin += self->dad.block_size), (pout += self->dad.block_size))
+    {
+        CipherVec temp;
+
+        cv = CipherVecIn (pin);
+#if 0
+        temp = cv;
+        temp = CMEMBER(DecryptV1)(self, temp);
+#else
+        temp = CMEMBER(DecryptV1)(self, cv);
+#endif
+        temp ^= ivec;
+        CipherVecOut (temp, pout);
+        ivec = cv;
+    }
+
+    *(CipherVec*)self->dad.decrypt_ivec = ivec;
+    return 0;
+}
+
+
+/* ----------
+ * Propagating cipher-block chaining
+ * FB = PT ^ (CT = ENC ((PT^IV), EK))
+ * FB = CT ^ (PT = DEC (CT,DK) ^ IV)
+ */
+static
+rc_t CMEMBER(EncryptPcbc) (CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+#if 1
+    CipherVec cv;
+    CipherVec ivec;
+    const uint8_t * pin;
+    uint8_t * pout;
+
+    ivec = *(const CipherVec*)self->dad.encrypt_ivec;
+
+    for ((pin = in), (pout = out);
+         block_count --; 
+         (pin += self->dad.block_size), (pout += self->dad.block_size))
+    {
+        CipherVec temp;
+
+        cv = CipherVecIn (pin);
+        temp = cv ^ ivec;
+        temp = CMEMBER(EncryptV1)(self, temp); 
+        ivec = cv ^ temp;
+        CipherVecOut (temp, pout);
+    }
+
+    *(CipherVec*)self->dad.encrypt_ivec = ivec;
+
+    return 0;
+#else
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+#endif
+}
+
+
+static
+rc_t CMEMBER(DecryptPcbc) (CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+#if 1
+    CipherVec cv;
+    CipherVec ivec;
+    const uint8_t * pin;
+    uint8_t * pout;
+
+    ivec = *(const CipherVec*)self->dad.encrypt_ivec;
+
+    for ((pin = in), (pout = out);
+         block_count --; 
+         (pin += self->dad.block_size), (pout += self->dad.block_size))
+    {
+        CipherVec temp;
+
+        cv = CipherVecIn (pin);
+        temp = CMEMBER(DecryptV1)(self, cv);
+        ivec ^= temp;
+        CipherVecOut (temp, pout);
+    }
+
+    *(CipherVec*)self->dad.encrypt_ivec = ivec;
+
+    return 0;
+#else
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+#endif
+}
+
+
+/* ----------
+ * Cipher Feedback
+ * CT = (FB = PT) ^ ENC (IV, EK))
+ * PT = (FB = CT) ^ DEC (IV, DK)
+ */
+static
+rc_t CMEMBER(EncryptCfb) (CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+#if 1
+    CipherVec cv;
+    CipherVec ivec;
+    const uint8_t * pin;
+    uint8_t * pout;
+
+    ivec = *(const CipherVec*)self->dad.encrypt_ivec;
+
+    for ((pin = in), (pout = out);
+         block_count --; 
+         (pin += self->dad.block_size), (pout += self->dad.block_size))
+    {
+        ivec = CMEMBER(EncryptV1)(self, ivec); 
+        cv = CipherVecIn (pin);
+        ivec ^= cv;
+        CipherVecOut (ivec, pout);
+    }
+
+    *(CipherVec*)self->dad.encrypt_ivec = ivec;
+
+    return 0;
+#else
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+#endif
+}
+
+
+static
+rc_t CMEMBER(DecryptCfb) (CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+#if 1
+    CipherVec cv;
+    CipherVec ivec;
+    const uint8_t * pin;
+    uint8_t * pout;
+
+    ivec = *(const CipherVec*)self->dad.encrypt_ivec;
+
+    for ((pin = in), (pout = out);
+         block_count --; 
+         (pin += self->dad.block_size), (pout += self->dad.block_size))
+    {
+        cv = CMEMBER(EncryptV1)(self, ivec); 
+        ivec = CipherVecIn (pin);
+        cv ^= ivec;
+        CipherVecOut (cv, pout);
+    }
+
+    *(CipherVec*)self->dad.encrypt_ivec = ivec;
+
+    return 0;
+#else
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+#endif
+}
+
+
+/* ----------
+ * Output Feedback
+ * CT = PT ^ (FB = ENC (IV, EK))
+ * PT = CT ^ (FB = DEC (IV, DK))
+ */
+static
+rc_t CMEMBER(EncryptOfb) (CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+#if 1
+    CipherVec cv;
+    CipherVec ivec;
+    const uint8_t * pin;
+    uint8_t * pout;
+
+    ivec = *(const CipherVec*)self->dad.encrypt_ivec;
+
+    for ((pin = in), (pout = out);
+         block_count --; 
+         (pin += self->dad.block_size), (pout += self->dad.block_size))
+    {
+        ivec = CMEMBER(EncryptV1)(self, ivec); 
+        cv = CipherVecIn (pin);
+        cv ^= ivec;
+        CipherVecOut (cv, pout);
+    }
+
+    *(CipherVec*)self->dad.encrypt_ivec = ivec;
+
+    return 0;
+#else
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+#endif
+}
+
+
+static
+rc_t CMEMBER(DecryptOfb) (CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+    return CMEMBER(EncryptOfb)(self, in, out, block_count);
+}
+
+
+/* Counter
+ * IV is a nonce and not re-used as FB
+ * CT = PT ^ ENC (N, EK)
+ * PT = CT ^ ENC (N, DK) 
+ * Note decrypt is encrypt.
+ * nonce is a function that given an iv generates the next iv
+ */
+static
+rc_t CMEMBER(EncryptCtr) (CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+}
+
+
+static
+rc_t CMEMBER(DecryptCtr) (CIPHER_IMPL * self, const void * in, void * out, uint32_t block_count)
+{
+    return RC (rcKrypto, rcCipher, rcEncoding, rcFunction, rcUnsupported);
+}
+
+static
+struct KCipher_vt_v1 CMEMBER(_vt_v1) =
+{
+    { 1, 0 },
+
+    CMEMBER(Destroy),
+    CMEMBER(SetEncryptKey),
+    CMEMBER(SetDecryptKey),
+    CMEMBER(SetEncryptIvec),
+    CMEMBER(SetDecryptIvec),
+    CMEMBER(SetEncryptCounterFunc),
+    CMEMBER(SetDecryptCounterFunc),
+    CMEMBER(Encrypt),
+    CMEMBER(Decrypt),
+    CMEMBER(EncryptEcb),
+    CMEMBER(DecryptEcb),
+    CMEMBER(EncryptCbc),
+    CMEMBER(DecryptCbc),
+    CMEMBER(EncryptPcbc),
+    CMEMBER(DecryptPcbc),
+    CMEMBER(EncryptCfb),
+    CMEMBER(DecryptCfb),
+    CMEMBER(EncryptOfb),
+    CMEMBER(DecryptOfb),
+    CMEMBER(EncryptCtr),
+    CMEMBER(DecryptCtr)
+};
+
+
+static __inline__
+rc_t CMEMBER(AllocAes)(CIPHER_IMPL ** pobj,
+                       const KBlockCipher * block_cipher)
+{
+    CipherAes * obj;
+
+    obj = calloc (1, sizeof (*obj));
+    *pobj = (CIPHER_IMPL*)obj;
+
+    return (obj ? 0 : RC (rcKrypto, rcCipher, rcConstructing, rcMemory, rcExhausted));
+}
+
+
+static __inline__
+rc_t CMEMBER(InitAes) (CIPHER_IMPL * self,
+                      const KBlockCipher * block_cipher)
+{
+    KCipher * dad = &self->dad;
+    CipherAes * aes = (struct CipherAes*)self;
+
+    KCipherInit (dad, sizeof (CipherVec),
+                 (const KCipher_vt*)&CMEMBER(_vt_v1),
+                 CMEMBER(ClassName));
+
+    dad->encrypt_key = &aes->e_key;
+    dad->decrypt_key = &aes->d_key;
+    dad->encrypt_ivec = &aes->e_ivec;
+    dad->decrypt_ivec = &aes->d_ivec;
+
+    self->block_cipher = &block_cipher->vec;
+
+    return 0;
+}
+
+
+static __inline__
+rc_t CMEMBER(AllocNull)(CIPHER_IMPL ** pobj,
+                        const KBlockCipher * block_cipher)
+{
+    CipherNull * obj;
+
+    obj = calloc (1, sizeof (*obj));
+    *pobj = (CIPHER_IMPL*)obj;
+
+    return (obj ? 0 : RC (rcKrypto, rcCipher, rcConstructing, rcMemory, rcExhausted));
+}
+
+
+static __inline__
+rc_t CMEMBER(InitNull) (CIPHER_IMPL * self,
+                        const KBlockCipher * block_cipher)
+{
+    KCipher * dad = &self->dad;
+    CipherNull * null = (CipherNull*)self;
+
+    KCipherInit (dad, sizeof (CipherVec),
+                 (const KCipher_vt*)&CMEMBER(_vt_v1),
+                 CMEMBER(ClassName));
+
+    dad->encrypt_key = &null->e_ivec;
+    dad->decrypt_key = &null->d_ivec;
+    dad->encrypt_ivec = &null->e_ivec;
+    dad->decrypt_ivec = &null->d_ivec;
+
+    self->block_cipher = &block_cipher->vec;
+
+    return 0;
+}
+
+
+rc_t CMEMBER(Make) (KCipher ** new_obj, kcipher_type type)
+{
+    rc_t rc;
+    KBlockCipher * block_cipher;
+
+    if (new_obj == NULL)
+        return RC (rcKrypto, rcCipher, rcConstructing, rcSelf, rcNull);
+
+    *new_obj = NULL;
+
+    switch (type)
+    {
+    default:
+        return RC (rcKrypto, rcCipher, rcConstructing, rcParam, rcInvalid);
+
+    case kcipher_null:
+        rc = NULLBCMEMBER(Make)(&block_cipher);
+        break;
+
+    case kcipher_AES:
+        rc = AESBCMEMBER(Make)(&block_cipher);
+        break;
+    }
+
+    if (rc == 0)
+    {
+        CIPHER_IMPL * obj;
+
+        switch (type)
+        {
+        case kcipher_null:
+            rc = CMEMBER(AllocNull) (&obj, block_cipher);
+            if (rc == 0)
+            {
+                rc = CMEMBER(InitNull) (obj, block_cipher);
+                if (rc == 0)
+                    *new_obj = (KCipher*)obj;
+                else
+                    free (obj);
+            }
+            break;
+        case kcipher_AES:
+            rc = CMEMBER(AllocAes) (&obj, block_cipher);
+            if (rc == 0)
+            {
+                rc = CMEMBER(InitAes) (obj, block_cipher);
+                if (rc == 0)
+                    *new_obj = (KCipher*)obj;
+                else
+                    free (obj);
+            }
+        default:
+            /* can't really get here */
+            break;
+        }
+    }
+    return rc;
+}
+
+
+/* EOF */
diff --git a/libs/krypto/cipher.c b/libs/krypto/cipher.c
new file mode 100644
index 0000000..2f5935a
--- /dev/null
+++ b/libs/krypto/cipher.c
@@ -0,0 +1,543 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <krypto/extern.h>
+#include <klib/defs.h>
+
+#include <krypto/cipher.h>
+#include <krypto/ciphermgr.h>
+#include <krypto/testciphermgr.h>
+#include "cipher-priv.h"
+#include "cipher-impl.h"
+
+#include <klib/rc.h>
+
+
+static const char KCipherClassName[] = "KCipherClassName";
+
+/* ----------------------------------------------------------------------
+ * Init
+ *
+ *   Initialize the fields of this object.  The derived class will call this
+ *   during it's initialization.
+ *
+ * self      object to initialze
+ * vt        the virtual table of the derived class
+ * mgr       the cipher manager that is the construction factory block cipher
+ *           objects hold references to the manager while the manager merely
+ *           points at the block ciphers when all block ciphers are destroyed
+ *           the manager loses its references and it too can be destroyed if not
+ *           held elsewhere
+ * name      ASCIZ c-string the name of this class; pointer is expected to remain valid
+ *           for the life of the object
+ */
+void KCipherInit (KCipher * self,
+                  uint32_t block_size,
+                  const KCipher_vt * vt,
+                  const char * name)
+{
+    KRefcountInit (&self->refcount, 1, KCipherClassName, "init", name);
+    self->block_size = block_size;
+    self->vt.version = vt;
+    self->name = name;
+
+    /* the remaining fields have to be initialized in the derived object init */
+}
+
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *   base class destruction called during the derived class destruction
+ *
+ * self is the cipher object
+ *
+ * memory release is the repsonsibility of the derived class destructor
+ */
+rc_t KCipherDestroy (KCipher * self)
+{
+    if (self)
+    {
+        KRefcountWhack (&self->refcount, self->name);
+    }
+    return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * AddRef
+ *   add a new owner to this class.  This will mean another instance of 
+ *   KCipher used this Block Cipher
+ */
+KRYPTO_EXTERN
+rc_t CC KCipherAddRef (const KCipher * self)
+{
+    if (self)
+    {
+        switch (KRefcountAdd (&self->refcount, KCipherClassName))
+        {
+        case krefLimit:
+            return RC (rcKrypto, rcCipher, rcAttaching, rcRange, rcExcessive);
+        }
+    }
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Release
+ *   
+ */
+static __inline__ rc_t KCipherWhack (KCipher * self)
+{
+    switch (self->vt.version->maj)
+    {
+    case 1:
+        return self->vt.v1->destroy (self);
+    }
+    return RC (rcKrypto, rcCipher, rcDestroying, rcInterface, rcBadVersion);
+}
+
+
+KRYPTO_EXTERN
+rc_t CC KCipherRelease (const KCipher * self)
+{
+    if ( self != NULL )
+    {
+        switch (KRefcountDrop ( & self -> refcount, KCipherClassName))
+        {
+        case krefWhack:
+            return KCipherWhack ((KCipher *)self);
+
+        case krefNegative:
+            return RC ( rcKrypto, rcCipher, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Some Cipher Methods are really pass through methods to the block cipher
+ *   
+ */
+KRYPTO_EXTERN rc_t CC KCipherBlockSize (const KCipher * self, size_t * bytes)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcSelf, rcNull);
+
+    if (bytes == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcParam, rcNull);
+
+    *bytes = self->block_size;
+
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * 
+ *   
+ */
+KRYPTO_EXTERN rc_t CC KCipherSetEncryptKey (KCipher * self, const void * user_key, size_t user_key_size)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcSelf, rcNull);
+
+    if ((user_key == NULL)||(user_key_size == 0))
+        return RC (rcKrypto, rcCipher, rcAccessing, rcParam, rcNull);
+
+    switch (self->vt.version->maj)
+    {
+    case 1:
+        return self->vt.v1->set_encrypt_key (self, user_key, (uint32_t) user_key_size);
+    }
+    return RC (rcKrypto, rcCipher, rcUpdating, rcInterface, rcBadVersion);
+}
+
+
+/* ----------------------------------------------------------------------
+ * 
+ *   
+ */
+KRYPTO_EXTERN rc_t CC KCipherSetDecryptKey (KCipher * self, const void * user_key, size_t user_key_size)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcSelf, rcNull);
+
+    if ((user_key == NULL)||(user_key_size == 0))
+        return RC (rcKrypto, rcCipher, rcAccessing, rcParam, rcNull);
+
+    switch (self->vt.version->maj)
+    {
+    case 1:
+        return self->vt.v1->set_decrypt_key (self, user_key, (uint32_t) user_key_size);
+    }
+    return RC (rcKrypto, rcCipher, rcUpdating, rcInterface, rcBadVersion);
+}
+
+
+
+/* ----------------------------------------------------------------------
+ *  
+ *
+ * Set the ivec (Initialization vector or feedback) for the cipher
+ *
+ * the size of ivec  must match KCipherBlockSize
+ *
+ * the ivec is copied into the cipher not used in place
+ */
+KRYPTO_EXTERN rc_t CC KCipherSetEncryptIVec (KCipher * self, const void * ivec)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcSelf, rcNull);
+
+    if (ivec == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcParam, rcNull);
+
+    switch (self->vt.version->maj)
+    {
+    case 1:
+        return self->vt.v1->set_encrypt_ivec (self, ivec);
+    }
+    return RC (rcKrypto, rcCipher, rcUpdating, rcInterface, rcBadVersion);
+}
+
+
+/* ----------------------------------------------------------------------
+ * 
+ *   
+ */
+KRYPTO_EXTERN rc_t CC KCipherSetDecryptIVec (KCipher * self, const void * ivec)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcSelf, rcNull);
+
+    if (ivec == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcParam, rcNull);
+
+    switch (self->vt.version->maj)
+    {
+    case 1:
+        return self->vt.v1->set_decrypt_ivec (self, ivec);
+    }
+    return RC (rcKrypto, rcCipher, rcUpdating, rcInterface, rcBadVersion);
+}
+
+
+/* ----------------------------------------------------------------------
+ * 
+ *   
+ */
+KRYPTO_EXTERN rc_t CC KCipherSetEncryptCtrFunc (KCipher * self, cipher_ctr_func func)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcSelf, rcNull);
+
+    if (func == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcParam, rcNull);
+
+    switch (self->vt.version->maj)
+    {
+    case 1:
+        return self->vt.v1->set_encrypt_ctr_func (self, func);
+    }
+    return RC (rcKrypto, rcCipher, rcUpdating, rcInterface, rcBadVersion);
+}
+
+
+/* ----------------------------------------------------------------------
+ * 
+ *   
+ */
+KRYPTO_EXTERN rc_t CC KCipherSetDecryptCtrFunc (KCipher * self, cipher_ctr_func func)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcSelf, rcNull);
+
+    if (func == NULL)
+        return RC (rcKrypto, rcCipher, rcAccessing, rcParam, rcNull);
+
+    switch (self->vt.version->maj)
+    {
+    case 1:
+        return self->vt.v1->set_decrypt_ctr_func (self, func);
+    }
+    return RC (rcKrypto, rcCipher, rcUpdating, rcInterface, rcBadVersion);
+}
+
+
+KRYPTO_EXTERN rc_t CC KCipherEncrypt (KCipher * self, const void * in, void * out)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcCipher, rcEncoding, rcSelf, rcNull);
+
+    if ((in == NULL) || (out == NULL))
+        return RC (rcKrypto, rcCipher, rcEncoding, rcParam, rcNull);
+
+    switch (self->vt.version->maj)
+    {
+    case 1:
+        return self->vt.v1->encrypt (self, in, out);
+    }
+    return RC (rcKrypto, rcCipher, rcAccessing, rcInterface, rcBadVersion);
+}
+
+
+KRYPTO_EXTERN rc_t CC KCipherDecrypt (KCipher * self, const void * in, void * out)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcCipher, rcEncoding, rcSelf, rcNull);
+
+    if ((in == NULL) || (out == NULL))
+        return RC (rcKrypto, rcCipher, rcEncoding, rcParam, rcNull);
+
+    switch (self->vt.version->maj)
+    {
+    case 1:
+        return self->vt.v1->decrypt (self, in, out);
+    }
+    return RC (rcKrypto, rcCipher, rcAccessing, rcInterface, rcBadVersion);
+}
+
+
+/* ====================
+ * longer runs of multiple blocks.
+ *
+ * The algorithms are well defined and standard in most cases
+ *
+ * These aremore or elss equivalent to class functions as they do not depend upon
+ * the operation of the cipher and the algorithms are independent of anything about
+ * the cipher other than its block size.
+ *
+ * PT: plain text block
+ * CT: cipher text block
+ * EK: encryption key
+ * DK: decryption key (might be sthe same as EK)
+ * ENC: encrypt cipher function on a block using a key
+ * DEC: decrypt cipher function on a block using a key
+ * IV: initialization vector - used as feedback for chaining
+ * N:  number used once (nonce)
+ * FB: feedback is the next IV in a chained/feedback mode
+ */
+
+/* -----
+ * NOTE:
+ * 'in' can be the same as 'out' but other overlaps are dangers as a block at a
+ * time is written. The code does not look for overlaps at this point.
+ *
+ * NOTE: currently an implementation detail limits us to 8192 bit cipher block
+ * size.  Changing MAX_BLOCK_SIZE in cipher.c can up that limit without 
+ * causing any other compatibility issues. 
+ *
+ * Two local byte arrays are defined on the stack of 1024 bytes or 8192 bits.
+ */
+/*
+ * NOTE: if in and out overlap incorrectly this will fail
+ */
+#define BLOCK_FUNC_PASTE(A,B) A##B
+#define BLOCK_FUNC(MODE,METHOD) \
+    KRYPTO_EXTERN rc_t CC BLOCK_FUNC_PASTE(KCipher,MODE)                \
+        (KCipher * self, const void * in, void * out,                   \
+         uint32_t block_count)                                          \
+    {                                                                   \
+        rc_t rc;                                                        \
+                                                                        \
+        if (self == NULL)                                               \
+            rc = RC (rcKrypto, rcCipher, rcEncoding, rcSelf, rcNull);   \
+                                                                        \
+        else if (in == NULL)                                            \
+            rc = RC (rcKrypto, rcCipher, rcEncoding, rcParam, rcNull);  \
+                                                                        \
+        else if (out == NULL)                                           \
+            rc = RC (rcKrypto, rcCipher, rcEncoding, rcParam, rcNull);  \
+                                                                        \
+        else if (block_count == 0)                                      \
+            rc = 0;                                                     \
+                                                                        \
+        else                                                            \
+        {                                                               \
+            switch (self->vt.version->maj)                              \
+            {                                                           \
+            case 1:                                                     \
+                return self->vt.v1->METHOD(self, in, out, block_count); \
+            }                                                           \
+            rc = RC (rcKrypto, rcCipher, rcAccessing, rcInterface,      \
+                     rcBadVersion);                                     \
+        }                                                               \
+                                                                        \
+        return rc;                                                      \
+    }
+
+/* ----------
+ * Electronic Code Book - simple cipher with no chaining feedback  just iterate
+ * simple encrypt/decrypt with the plain, text, cipher text and key/
+ *
+ * CT = ENC (PT,EK)
+ * PT = DEC (CT,DK)
+ */
+BLOCK_FUNC(EncryptECB,encrypt_ecb)
+BLOCK_FUNC(DecryptECB,decrypt_ecb)
+
+/* ----------
+ * Cipher-Block Chaining
+ * CT = (FB = ENC (PT^IV, EK))
+ * PT = DEC ((FB = CT), DK)
+ */
+BLOCK_FUNC(EncryptCBC,encrypt_cbc)
+BLOCK_FUNC(DecryptCBC,decrypt_cbc)
+
+/* ----------
+ * Propagating cipher-block chaining
+ * FB = PT ^ (CT = ENC ((PT^IV), EK))
+ * FB = CT ^ (PT = DEC (CT,DK) ^ IV)
+ */
+BLOCK_FUNC(EncryptPCBC,encrypt_pcbc)
+BLOCK_FUNC(DecryptPCBC,decrypt_pcbc)
+
+/* ----------
+ * Cipher Feedback
+ * CT = (FB = PT) ^ ENC (IV, EK))
+ * PT = (FB = CT) ^ DEC (IV, DK)
+ */
+BLOCK_FUNC(EncryptCFB,encrypt_cfb)
+BLOCK_FUNC(DecryptCFB,decrypt_cfb)
+
+/* ----------
+ * Output Feedback
+ * CT = PT ^ (FB = ENC (IV, EK))
+ * PT = CT ^ (FB = DEC (IV, DK))
+ */
+BLOCK_FUNC(EncryptOFB,encrypt_ofb)
+BLOCK_FUNC(DecryptOFB,decrypt_ofb)
+
+/* Counter
+ * IV is a nonce and not re-used as FB
+ * CT = PT ^ ENC (N, EK)
+ * PT = CT ^ ENC (N, DK) 
+ *
+ * The enc_ctr_func (or dec_ctr_func) will be called to update the ivec before
+ * to be the nonce (number used once) before each call to the block cipher 
+ * encrypt function.  The encrypt function is used for decryption mode as well
+ */
+BLOCK_FUNC(EncryptCTR,encrypt_ctr)
+BLOCK_FUNC(DecryptCTR,decrypt_ctr)
+
+
+#ifndef USE_SLOW_ONES
+#define USE_SLOW_ONES _DEBUGGING
+#endif
+
+#include <stdio.h>
+rc_t KCipherMakeInt (KCipher ** new_cipher, kcipher_type type)
+{
+    rc_t rc;
+
+    *new_cipher = NULL;
+
+#ifndef WIN32
+    rc = KCipherVecAesNiMake (new_cipher, type);
+    /*printf("KCipherVecAesNiMake %s (%u) \n", rc ? "FAILED" : "succeeded", rc);*/
+    if (rc)
+    {
+        if (GetRCState(rc) == rcUnsupported)
+        {
+#if USE_SLOW_ONES
+            rc = KCipherVecRegMake (new_cipher, type);
+            /*printf("KCipherVecRegMake %s (%u) \n", rc ? "FAILED" : "succeeded", rc);*/
+            if (rc)
+            {
+                if (GetRCState(rc) == rcUnsupported)
+                {
+                    rc = KCipherVecMake (new_cipher, type);
+                    /*printf("KCipherVecMake %s (%u) \n", rc ? "FAILED" : "succeeded", rc);*/
+                    if (GetRCState(rc) == rcUnsupported)
+                    {
+#endif
+#endif
+                        rc = KCipherByteMake (new_cipher, type);
+                        /*printf("KCipherByteMake %s (%u) \n", rc ? "FAILED" : "succeeded", rc);*/
+#ifndef WIN32
+#if USE_SLOW_ONES
+                    }
+                }
+            }
+#endif
+        }
+    }
+#endif
+    return rc;
+}
+
+kcipher_subtype KCipherSubType = ksubcipher_none;
+
+rc_t KCipherMake (KCipher ** new_cipher, kcipher_type type)
+{
+    rc_t rc;
+    if (new_cipher == NULL)
+        rc = RC (rcKrypto, rcCipher, rcConstructing, rcSelf, rcNull);
+
+    else
+    {
+        switch (type)
+        {
+        case kcipher_null:
+        case kcipher_AES:
+            switch (KCipherSubType)
+            {
+            case ksubcipher_byte:
+                rc = KCipherByteMake (new_cipher, type);
+                break;
+#ifdef USEVEC
+            case ksubcipher_vec:
+                rc = KCipherVecMake (new_cipher, type);
+                break;
+#endif
+#ifdef USEVECREG
+            case ksubcipher_vecreg:
+                rc = KCipherVecRegMake (new_cipher, type);
+                break;
+#endif
+#ifdef USEAESNI
+            case ksubcipher_accelerated:
+                rc = KCipherVecAesNiMake (new_cipher, type);
+                break;
+#endif
+            default:
+                rc = KCipherMakeInt (new_cipher, type);
+                break;
+            }
+            break;
+        default:
+            rc = RC (rcKrypto, rcCipher, rcConstructing, rcBlockCipher, rcInvalid);
+            break;
+        }
+    }
+    return rc;
+}
+
+
+
+
+
+
+/* EOF */
diff --git a/libs/krypto/ciphermgr.c b/libs/krypto/ciphermgr.c
new file mode 100644
index 0000000..f038259
--- /dev/null
+++ b/libs/krypto/ciphermgr.c
@@ -0,0 +1,295 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define USE_AES_NI false
+
+#include <krypto/extern.h>
+#include <krypto/ciphermgr.h>
+#include <krypto/cipher.h>
+
+#include "cipher-priv.h"
+
+#include <kproc/lock.h>
+
+#include <klib/rc.h>
+#include <klib/refcount.h>
+#include <klib/debug.h>
+
+#include <sysalloc.h>
+
+#include <atomic.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+#ifdef _DEBUGGING
+#define MGR_DEBUG(msg) DBGMSG(DBG_KFS,DBG_FLAG(DBG_KFS_MGR), msg)
+#else
+#define MGR_DEBUG(msg)
+#endif
+
+
+
+static const char kciphermanager_classname [] = "KCipherManager";
+
+
+/*--------------------------------------------------------------------------
+ * KCipherManager
+ */
+/* currently expected to be a singleton and not use a vtable but
+ * be fully fleshed out here */
+static atomic_ptr_t singleton;
+/*static KCipherManager * singleton = NULL;*/
+
+struct KCipherManager
+{
+    KRefcount refcount;
+
+    KLock * lock;
+
+};
+
+
+static
+rc_t KCipherManagerAlloc (KCipherManager ** ppobj)
+{
+    KCipherManager * pobj;
+
+    assert (ppobj);
+
+    pobj = calloc (sizeof *pobj, 1);
+    if (pobj)
+    {
+        *ppobj = pobj;
+        return 0;
+    }
+
+    *ppobj = NULL;
+    return RC (rcKrypto, rcMgr, rcConstructing, rcMemory, rcExhausted);
+}
+
+
+static
+rc_t KCipherManagerInit (KCipherManager * self)
+{
+    rc_t rc;
+
+    rc = KLockMake (&self->lock);
+    if (rc == 0)
+    {
+        KRefcountInit (&self->refcount, 1, kciphermanager_classname, "init",
+                       "singleton");
+    }
+
+    return rc;
+}
+
+
+/* Destroy
+ *  destroy
+ */
+LIB_EXPORT rc_t CC KCipherManagerDestroy ( KCipherManager *self )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC ( rcKrypto, rcMgr, rcDestroying, rcSelf, rcNull );
+    else
+    {
+        if (self == singleton . ptr)
+        {
+            KCipherManager * reread;
+
+            reread = atomic_test_and_set_ptr (&singleton, NULL, self);
+
+            /* ignore results: just going for guaranteed atomicity though might not need it */
+            ( void ) reread;
+        }
+
+        /* no return value */
+        KRefcountWhack (&self->refcount, kciphermanager_classname);
+
+        rc = KLockRelease (self->lock);
+
+        free (self);
+    }
+    return rc;
+}
+
+
+/* AddRef
+ *  creates a new reference
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KCipherManagerAddRef ( const KCipherManager *self )
+{
+    if (self != NULL)
+    {
+        switch (KRefcountAdd (&self->refcount, kciphermanager_classname))
+        {
+        case krefOkay:
+            break;
+        case krefZero:
+            return RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcIncorrect);
+        case krefLimit:
+            return RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcExhausted);
+        case krefNegative:
+            return RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcInvalid);
+        default:
+            return RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcUnknown);
+        }
+    }
+    return 0;
+}
+
+
+/* Release
+ *  discard reference to manager
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC KCipherManagerRelease ( const KCipherManager *self )
+{
+    rc_t rc = 0;
+    if (self != NULL)
+    {
+        switch (KRefcountDrop (&self->refcount, kciphermanager_classname))
+        {
+        case krefOkay:
+        case krefZero:
+            break;
+        case krefWhack:
+            rc = KCipherManagerDestroy ((KCipherManager*)self);
+            break;
+        case krefNegative:
+            return RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcInvalid);
+        default:
+            rc = RC (rcFS, rcMgr, rcAttaching, rcRefcount, rcUnknown);
+            break;            
+        }
+    }
+    return rc;
+}
+
+
+/* Make
+ *  we have a shared singleton for the cipher manager
+ *  first call actually makes the managerblo
+ *  subsequent calls get added references
+ */
+LIB_EXPORT rc_t CC KCipherManagerMake (KCipherManager ** mgr)
+{
+    rc_t rc = 0;
+
+    if (mgr == NULL)
+        return RC (rcKrypto, rcMgr, rcConstructing, rcSelf, rcNull);
+
+    *mgr = NULL;
+
+make_race_retry:
+
+    if (singleton . ptr)
+    {
+        rc = KCipherManagerAddRef (singleton.ptr);
+        if (rc == 0)
+        {
+            *mgr = singleton . ptr;
+            return 0;
+        }
+    }
+    else
+    {
+        KCipherManager * self;
+
+        rc = KCipherManagerAlloc (&self);
+        if (rc == 0)
+        {
+            rc = KCipherManagerInit (self);
+            if (rc == 0)
+            {
+                KCipherManager * reread;
+
+                reread = atomic_test_and_set_ptr (&singleton, self, NULL);
+
+                if (reread)
+                {
+                    KCipherManagerDestroy (self);
+                    goto make_race_retry;
+                }
+
+                *mgr = self;
+                return 0;
+            }
+            else
+            {
+                KCipherManagerDestroy (self);
+            }
+        }
+    }
+    return rc;
+}
+
+
+static __inline__
+rc_t KCipherManagerMakeCipherInt (const KCipherManager *self,
+                                  KCipher ** pcipher,
+                                  kcipher_type type)
+{
+    KCipher * pc;
+    rc_t rc;
+
+    assert (self);
+    assert (pcipher);
+
+    rc = KCipherMake (&pc, type);
+
+    *pcipher = rc ? NULL : pc;
+
+    return rc;
+}
+
+
+LIB_EXPORT
+rc_t CC KCipherManagerMakeCipher (const KCipherManager * self,
+                                  struct KCipher ** pcipher,
+                                  kcipher_type type)
+{
+    rc_t rc;
+    
+    if (self == NULL)
+        return RC (rcKrypto, rcMgr, rcConstructing, rcSelf, rcNull);
+
+    if (pcipher == NULL)
+        return RC (rcKrypto, rcMgr, rcConstructing, rcParam, rcNull);
+
+    *pcipher = NULL;
+
+    rc = KCipherManagerMakeCipherInt (self, pcipher, type);
+
+    return rc;
+}
+
+
+
diff --git a/libs/krypto/ciphertest.c b/libs/krypto/ciphertest.c
new file mode 100644
index 0000000..2faca1d
--- /dev/null
+++ b/libs/krypto/ciphertest.c
@@ -0,0 +1,80 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <krypto/extern.h>
+#include <klib/defs.h>
+
+#include <krypto/cipher.h>
+#include "cipher-priv.h"
+
+#include <klib/rc.h>
+
+
+rc_t KCipherMakeSub (KCipher ** new_cipher, kcipher_type type, uint32_t subtype)
+{
+    rc_t rc;
+
+    if (new_cipher == NULL)
+        rc = RC (rcKrypto, rcCipher, rcConstructing, rcSelf, rcNull);
+
+    else
+    {
+        switch (type)
+        {
+        case kcipher_AES:
+            switch (subtype)
+            {
+            default:
+                rc = RC (rcKrypto, rcCipher, rcConstructing, rcBlockCipher, rcInvalid);
+                break;
+
+            case kcipher_AES_core:
+                rc = KCipherByteMake (new_cipher, type);
+                break;
+
+            case kcipher_AES_ncbi_sim:
+                rc = KCipherVecSimMake (new_cipher, type);
+                break;
+
+            case kcipher_AES_ncbi_vec:
+                rc = KCipherVecRegMake (new_cipher, type);
+                break;
+
+            case kcipher_AES_ncbi_ni:
+                rc = KCipherVecAesNiMake (new_cipher, type);
+                break;
+            }
+            break;
+        default:
+            rc = RC (rcKrypto, rcCipher, rcConstructing, rcBlockCipher, rcInvalid);
+            break;
+        }
+    }
+    return rc;
+}
+
+
+
+
+/* EOF */
diff --git a/libs/krypto/compile-test.c b/libs/krypto/compile-test.c
new file mode 100644
index 0000000..1d3de7a
--- /dev/null
+++ b/libs/krypto/compile-test.c
@@ -0,0 +1,50 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+
+#include <cpuid.h>
+#include <v128.h>
+
+#include "ncbi-priv.h"
+#include "blockcipher-impl.h"
+
+
+
+const
+CipherVec CMEMBER(test) (void)
+{
+#if USEVEC
+    CipherVec zero  =  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+    CipherVec one   =  { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
+#else
+    CipherVec zero  =  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+    CipherVec one   =  { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
+#endif
+    return zero + one;
+}
diff --git a/libs/krypto/csprng.c b/libs/krypto/csprng.c
new file mode 100644
index 0000000..4ee747b
--- /dev/null
+++ b/libs/krypto/csprng.c
@@ -0,0 +1,163 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include <krypto/extern.h>
+
+#include <krypto/rng.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/refcount.h>
+
+#include <sysalloc.h>
+
+#include <openssl/rand.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+
+typedef KRng KCSPRng;
+
+#define KRNG_IMPL KCSPRng
+#include <krypto/rng-impl.h>
+
+
+
+static
+rc_t CC KCSPRngDestroy (KCSPRng * self)
+{
+    free (self);
+    return 0;
+}
+
+static
+rc_t CC KCSPRngSeed (KRng * self)
+{
+    rc_t rc;
+    uint8_t buff [16];
+
+    if (self == NULL)
+        return RC (rcKrypto, rcRng, rcWriting, rcSelf, rcNull);
+
+    /* get some system entropy */
+    rc = KRngSysEntropy (self, buff, sizeof (buff));
+    if (rc)
+        return rc;
+
+    RAND_seed (buff, sizeof (buff));
+
+    return 0;
+}
+
+static
+rc_t CC KCSPRngReseed (KRng * self, const void * buffer_, 
+                       size_t buff_size)
+{
+    const char * buffer;
+    rc_t rc;
+    int32_t ix;
+    uint8_t buff [256];
+
+    if (self == NULL)
+        return RC (rcKrypto, rcRng, rcUpdating, rcSelf, rcNull);
+
+    if (((buffer = buffer_) == NULL) && (buff_size != 0))
+        return RC (rcKrypto, rcRng, rcUpdating, rcParam, rcNull);
+
+    rc = KRngSysEntropy (self, buff, 16);
+    if (rc)
+        return rc;
+
+    if (buffer)
+        for (ix = (buff_size + sizeof (buff) - 1)/sizeof (buff);
+             ix > 0; 
+             (ix -= sizeof (buff)),
+                 (buff_size -= sizeof(buff)),
+                 (buffer += sizeof (buff)))
+        {
+            int32_t jx = (buff_size>sizeof (buff))?sizeof(buff):buff_size;
+            while (--jx > 0)
+                buff[jx] ^= buffer[jx];
+        }
+
+    RAND_add (buffer, buff_size, 1); /* what is that entropy supposed to do? */
+
+    return 0;
+}
+
+static
+rc_t CC KCSPRngRead (const KCSPRng * self, void * buffer, uint32_t bsize, uint32_t * num_read)
+{
+    int ret;
+
+    ret = RAND_bytes (buffer, bsize);
+    if (ret == -1)
+    {
+        *num_read = 0;
+        return RC (rcKrypto, rcRng, rcReading, rcSelf, rcInsufficient);
+    }
+    *num_read = bsize;
+    return 0;
+}
+
+static const
+KRng_vt_v1 vt = 
+{
+    1, 0,
+
+    /* start minor version == 0 */
+    KCSPRngDestroy,
+    KCSPRngSeed,
+    KCSPRngReseed,
+    KCSPRngRead
+    /* end minor version == 0 */
+};
+    
+LIB_EXPORT rc_t CC KCSPRngMake (KRng ** pself)
+{
+    KCSPRng * self;
+    rc_t rc;
+
+    if (pself == NULL)
+        return RC (rcRuntime, 0, rcConstructing, rcSelf, rcNull);
+    else
+    {
+        *pself = NULL;
+
+        self = malloc (sizeof (*self));
+        if (self == NULL)
+            return RC (rcRuntime, 0, rcConstructing, rcMemory, rcExhausted);
+
+        else
+        {
+            rc = KRngInit (self, (union KRng_vt*)&vt, "KCSPRng");
+            *pself = self;
+            return 0;
+        }
+    }
+    return rc;
+}
diff --git a/libs/krypto/encfile-priv.h b/libs/krypto/encfile-priv.h
new file mode 100644
index 0000000..5221226
--- /dev/null
+++ b/libs/krypto/encfile-priv.h
@@ -0,0 +1,162 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#ifndef _h_krypto_encfile_priv_libs_
+#define _h_krypto_encfile_priv_libs_
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+/* ----------------------------------------------------------------------
+ * Offset conversions between encrypted file offset, decrypted file offset
+ * and block ID and block offset
+ */
+
+/* BlockId_to_CiphertextOffset
+ *  converts zero-based block id to byte offset into ciphertext
+ */
+static __inline__
+uint64_t BlockId_to_CiphertextOffset ( uint64_t block_id )
+{
+    return ( sizeof ( KEncFileHeader ) + block_id * sizeof ( KEncFileBlock ) );
+}
+
+/* BlockId_to_DecryptedPos
+ *  converts zero-based block id to byte offset into plaintext
+ */
+static __inline__
+uint64_t BlockId_to_PlaintextOffset ( uint64_t block_id )
+{
+    return block_id * sizeof ( KEncFileData );
+}
+
+/* PlaintextOffset_to_BlockId
+ *  converts from byte offset into plaintext to a zero-based block id
+ *  NB - will FAIL ( horribly ) if used with a plaintext SIZE
+ */
+static __inline__
+uint64_t PlaintextOffset_to_BlockId ( uint64_t pt_offset, uint32_t * poffset )
+{
+    uint64_t block_id = pt_offset / sizeof ( KEncFileData );
+
+    if ( poffset != NULL )
+        * poffset = ( uint32_t ) ( pt_offset - BlockId_to_PlaintextOffset ( block_id ) );
+
+    return block_id;
+}
+
+static __inline__
+uint64_t PlaintextSize_to_BlockCount ( uint64_t pt_size, uint32_t * padding )
+{
+    uint64_t block_count = ( pt_size + sizeof ( KEncFileData ) - 1 ) / sizeof ( KEncFileData );
+
+    if ( padding != NULL )
+        * padding = ( uint32_t ) ( BlockId_to_PlaintextOffset ( block_count ) - pt_size );
+
+    return block_count;
+}
+
+static __inline__
+uint64_t EncryptedPos_to_BlockId (uint64_t enc_offset, uint32_t * poffset,
+                                     bool * in_block)
+{
+    uint64_t block_id;
+
+    if (enc_offset < sizeof (KEncFileHeader))
+    {
+        if (poffset)
+            *poffset = 0;
+        if (in_block)
+            *in_block = false;
+        block_id = 0;
+    }
+    else
+    {
+        uint64_t offset;
+
+        enc_offset -= sizeof (KEncFileHeader);
+        block_id = enc_offset / sizeof (KEncFileBlock);
+        offset = enc_offset % sizeof (KEncFileBlock);
+
+        if (offset <= sizeof(KEncFileKey))
+        {
+            if (poffset)
+                *poffset = 0;
+            if (in_block)
+                *in_block = false;
+        }
+        else
+        {
+            offset -= sizeof(KEncFileKey);
+
+            if (offset >= sizeof(KEncFileData))
+            {
+                if (poffset)
+                    *poffset = 0;
+                if (in_block)
+                    *in_block = false;
+            }
+            else
+            {
+                if (poffset)
+                    *poffset = (uint32_t)offset;
+                if (in_block)
+                    *in_block = true;
+            }
+        }
+    }
+    return block_id;
+}
+
+struct KFile;
+struct KKey;
+
+KRYPTO_EXTERN rc_t CC KEncFileWriteHeader (struct KFile * self);
+KRYPTO_EXTERN rc_t CC KEncFileWriteHeader_v1 (struct KFile * self);
+KRYPTO_EXTERN rc_t CC KEncFileWriteHeader_v2 (struct KFile * self);
+KRYPTO_EXTERN rc_t CC KEncFileMakeWriteBlock (struct KFile ** pself, 
+                                              struct KFile * encrypted,
+                                              const struct KKey * key);
+
+KRYPTO_EXTERN rc_t CC KEncFileMakeBlock_v2 (struct KFile ** pself,
+                                         struct KFile * encrypted,
+                                         const struct KKey * key);
+
+
+#if 0
+#if USE_UPDATE_V1
+#define KEncFileWriteHeader KEncFileWriteHeader_v1
+#else
+#define KEncFileWriteHeader KEncFileWriteHeader_v2
+#endif
+#endif
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif /* #ifndef _h_krypto_encfile_priv_libs_ */
+
+
diff --git a/libs/krypto/encfile.c b/libs/krypto/encfile.c
new file mode 100644
index 0000000..5b4506e
--- /dev/null
+++ b/libs/krypto/encfile.c
@@ -0,0 +1,2019 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <krypto/extern.h>
+#include <krypto/encfile.h>
+#include <krypto/encfile-priv.h>
+#include <krypto/key.h>
+#include <krypto/ciphermgr.h>
+#include <krypto/cipher.h>
+#include "aes-priv.h"
+#include "encfile-priv.h"
+
+#include <klib/rc.h>
+#include <klib/checksum.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/debug.h>
+#include <klib/vector.h>
+#include <klib/status.h>
+#include <kfs/file.h>
+
+#include <sysalloc.h>
+
+#include <byteswap.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+#include <klib/out.h>
+
+#define USE_READ_V1     false
+#define USE_WRITE_V1    false
+#define USE_UPDATE_V1   false
+#define USE_BLOCK_V1    false
+/* KReencFile and KEncryptFile need to use update v1 as it is different */
+#define USE_VALIDATE_V1 false
+#define USE_ISENC_V1    false
+
+#define ENABLE_V2 true
+
+
+/* ----------------------------------------------------------------------
+ * KEncFileV1
+ *   Base object class for the encryption, decryption and validation of
+ *   the file format defined above
+ */
+typedef struct KEncFileV1  KEncFileV1;
+#define KFILE_IMPL struct KEncFileV1
+#include <kfs/impl.h>
+
+
+#include "encfile-priv.h"
+
+/* ----------
+ * BufferCalcMD5
+ *    Generate the MD5 digest for a buffer
+ */
+static
+void BufferCalcMD5 (const void * buffer, size_t size, uint8_t digest [16])
+{
+    MD5State state;
+
+    assert (buffer);
+    assert (size);
+    assert (digest);
+
+    MD5StateInit (&state);
+    MD5StateAppend (&state, buffer, size);
+    MD5StateFinish (&state, digest);
+}
+
+
+typedef struct KEncFileCiphers KEncFileCiphers;
+struct KEncFileCiphers
+{
+    KCipher * master;
+    KCipher * block;
+};
+
+typedef uint8_t KEncFileIVec [16];
+/* -----
+ */
+struct KEncFileV1
+{
+    KFile dad;                  /* base class */
+    KFile * encrypted;          /* encrypted file as a KFile */
+    KEncFileCiphers ciphers;
+    KEncFileBlock block;        /* */
+    uint64_t encrypted_max;     /* highest read/written point in the encrypted file */
+    KEncFileFooter foot;        /* contains rcrchecksum and blockcount */
+#if ENABLE_V2
+    KEncFileVersion version;
+#endif
+    bool dirty;                 /* data written but not flushed */
+    bool bswap;
+    bool eof;
+    bool seekable;
+    bool written;
+    bool swarm;
+};
+
+
+/* ----------------------------------------------------------------------
+ * Buffer - just some part of the encrypted file read or written
+ *
+ *   these functions exist to hide the potential multiple calls needed
+ *   if the KFileRead or KFileWrite called on the encrypted file break up
+ *   the requested amount into partial reads or writes
+ */
+
+/* ----------
+ * BufferRead
+ *    Fill a buffer with a requested number of bytes from the encrypted file.  
+ *    Read either the requested number of bytes or up through EOF.
+ *    The caller has to handle an EOF shorted buffer.
+ */
+static
+rc_t KEncFileV1BufferRead (const KEncFileV1 * cself, uint64_t pos, void * buffer,
+                         size_t bsize, size_t * pnum_read)
+{
+    KEncFileV1 * self;   /* for mutable fields */
+    rc_t rc;
+
+    assert (cself);
+    assert (buffer);
+    assert (pnum_read);
+
+    *pnum_read = 0;
+
+    self = (KEncFileV1*)cself; /* to hit mutable fields */
+
+    /* we want to read a full requested size if possible so keep trying if we
+     * haven't read enough yet. 
+     * We can quit early only if EOF (i.e. read 0 bytes.
+     */
+    rc = KFileReadAll (self->encrypted, pos, buffer, bsize, pnum_read);
+    if (rc)
+        PLOGERR (klogErr,
+                 (klogErr, rc,
+                  "error reading position '$(P)' in encrypted file",
+                  "P=%lu", pos));
+
+    else if (self->encrypted_max < pos)
+        self->encrypted_max = pos;
+            
+    return rc;
+}
+
+
+/* ----------
+ * BufferWrite
+ *    Write a buffer of requested size out to the encrypted file.
+ *    return the number of bytes successfully written
+ */
+static
+rc_t KEncFileV1BufferWrite (KEncFileV1 * self, uint64_t pos, const void * buffer,
+                          size_t bsize, size_t * pnum_writ)
+{
+    rc_t rc;
+
+    rc =  KFileWriteAll (self->encrypted, pos, buffer, bsize, pnum_writ);
+    if ((rc == 0) && (self->encrypted_max < pos))
+        self->encrypted_max = pos;
+
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * operations on KEncFileHeader
+ *
+ * The header only needs to be read and validated or written  we need not 
+ * reatian within the KEncFile object any information about the header in
+ * the initial version of this file format.
+ */
+
+/* -----
+ * the first eight bytes of the file are two four byte strings
+ *  The first is a common "NCBI"
+ *  The second is the format specific "nenc"
+ */
+static const KEncFileSig KEncFileSignature = "NCBInenc";
+
+/* -----
+ * the common constant used throughout the project to check the byte order 
+ * as written by the system which created the file
+ */
+/* enum fails to handle these due to integer overflow */
+
+#define eByteOrderTag     (0x05031988)
+#define eByteOrderReverse (0x88190305)
+
+/* ----
+ * Not unexpectedly the first version of this file will be "1"
+ */
+#if ENABLE_V2
+
+#define eCurrentVersion (0x00000002)
+#define eCurrentVersionReverse (0x02000000)
+
+static
+const KEncFileHeader const_header_v1
+= { "NCBInenc", eByteOrderTag, 0x00000001 };
+
+static
+const KEncFileHeader const_bswap_header_v1
+= { "NCBInenc", eByteOrderReverse, 0x01000000 };
+    
+#else
+
+#define eCurrentVersion (0x00000001)
+#define eCurrentVersionReverse (0x01000000)
+
+#endif
+    
+static
+const KEncFileHeader const_header
+= { "NCBInenc", eByteOrderTag, eCurrentVersion };
+
+static
+const KEncFileHeader const_bswap_header
+= { "NCBInenc", eByteOrderReverse, eCurrentVersionReverse };
+
+
+/* ----------
+ * HeaderRead
+ *    Read the header of an encrypted file and validate it.
+ */
+static
+rc_t KEncFileV1HeaderRead (KEncFileV1 * self)
+{
+    KEncFileHeader header;
+    size_t num_read;
+    rc_t rc;
+
+    assert (self);
+
+    rc = KEncFileV1BufferRead (self, 0, &header, sizeof (header), &num_read);
+    if (rc)
+        return rc;
+
+    if (num_read != sizeof (header))
+    {
+        rc = RC (rcFS, rcFile, rcConstructing, rcHeader, rcTooShort);
+        PLOGERR (klogErr,
+                 (klogErr, rc, "error reading full header of encrypted "
+                  "file  wanted '$(S)' got '$(N); bytes read", "S=%u,N=%u",
+                  sizeof (header), num_read));
+        return rc;
+    }
+
+    /* expected is encrypted on a system of the same endianess */
+    if (memcmp (&header, &const_header, sizeof (header)) == 0)
+    {
+        self->bswap = false;
+#if ENABLE_V2
+        self->version = eCurrentVersion;
+#endif
+        return 0;
+    }
+
+    /* next most likely is encrypted on a machine of opposite endianess */
+    if (memcmp (&header, &const_bswap_header, sizeof (header)) == 0)
+    {
+        self->bswap = true;
+#if ENABLE_V2
+        self->version = eCurrentVersion;
+#endif
+        return 0;
+    }
+
+#if ENABLE_V2
+    if (memcmp (&header, &const_header_v1, sizeof (header)) == 0)
+    {
+        self->bswap = false;
+        self->version = 1;
+        return 0;
+    }
+
+    /* next most likely is encrypted on a machine of opposite endianess */
+    if (memcmp (&header, &const_bswap_header_v1, sizeof (header)) == 0)
+    {
+        self->bswap = true;
+        self->version = 1;
+        return 0;
+    }
+#endif
+
+    /* okay it's a "bad" header, so figure out why */
+    if (memcmp (&header, &const_header, sizeof (header.file_sig)) != 0)
+    {
+        rc = RC (rcKrypto, rcFile, rcReading, rcHeader, rcInvalid);
+        LOGERR (klogErr, rc, "file is not the NCBI encrypted file format");
+        /* if this fails the rest doesn't matter */
+        return rc;
+    }
+
+    switch (header.byte_order)
+    {
+    default:
+        rc = RC (rcFS, rcFile, rcConstructing, rcByteOrder, rcInvalid);
+        PLOGERR (klogErr, 
+                 (klogErr, rc, "invalid byte order flag '$(F); in "
+                  "encrypted file", "F=%X", header.byte_order));
+        /* we don't return to possibly log other version errors */
+        break;
+    case eByteOrderReverse:
+    case eByteOrderTag:
+        break;
+    }
+
+    switch (header.version)
+    {
+    default:
+        rc = RC (rcFS, rcFile, rcConstructing, rcHeader, rcBadVersion);
+        PLOGERR (klogErr, 
+                 (klogErr, rc, "can not decrypt version '$(V)'",
+                  "V=%u", header.version));
+        break;
+
+    case 1:
+#if ENABLE_V2
+    case 2:
+#endif
+        break;
+    }
+    return rc;
+}
+
+
+/* -----
+ * HeaderWrite
+ *
+ * build a ram copy of the header and write it to the file
+ */
+static
+rc_t KEncFileV1HeaderWrite (KEncFileV1 * self)
+{
+    size_t num_writ;
+    rc_t rc;
+
+    rc = KEncFileV1BufferWrite (self, 0, &const_header, sizeof (const_header),
+                              &num_writ);
+    if (rc == 0)
+    {
+        if (num_writ != sizeof (const_header))
+            rc = RC (rcFS, rcFile, rcWriting, rcHeader, rcInsufficient);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KEncFileV1WriteHeader_v1  (KFile * self)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcFile, rcWriting, rcSelf, rcNull);
+    return KEncFileV1HeaderWrite ((KEncFileV1*)self);
+}
+
+
+/* ----------------------------------------------------------------------
+ * operations on KEncFileFooter
+ */
+
+/* ----------
+ * Validate
+ * we expect to read a Footer when we expect a Block so we validate in RAM
+ * without a Read
+ *
+ * we're just comparing the values in the footer against expected values
+ */
+static
+rc_t KEncFileV1FooterValidate (const KEncFileV1 * self,
+                             uint64_t block_count, uint64_t crc_checksum)
+{
+    rc_t rc1 = 0, rc2 = 0;
+
+    if (self->foot.block_count != block_count)
+    {
+        rc2 = RC (rcKrypto, rcFile, rcValidating, rcFile, rcCorrupt);
+        LOGERR (klogErr, rc1, "bad block count in encrypted file footer");
+    }
+    if ((self->foot.crc_checksum != crc_checksum)
+#if ENABLE_V2
+        &&((crc_checksum != 0) || (self->version == 1))
+#endif
+        )
+    {
+        rc1 = RC (rcKrypto, rcFile, rcValidating, rcChecksum, rcCorrupt);
+        LOGERR (klogErr, rc2, "bad crc checksum in encrypted file footer");
+    }
+    return (rc1 ? rc1 : rc2);
+}
+
+
+/* ----------
+ * Write
+ * when we write a footer we write from the values in the object.  They
+ * are stored in the same object format as the footer so its very simple
+ */
+static
+rc_t KEncFileV1FooterWrite (KEncFileV1 * self)
+{
+    KEncFileFooter foot;
+    uint64_t offset;
+    size_t num_writ;
+    rc_t rc;
+
+    memmove (&foot, &self->foot, sizeof (foot));
+    if (self->bswap)
+    {
+        foot.block_count = bswap_64 (foot.block_count);
+        foot.crc_checksum = bswap_64 (foot.crc_checksum);
+    }
+
+    offset = BlockId_to_CiphertextOffset ( self -> foot . block_count );
+
+/*     assert ((self->encrypted_max == offset) || */
+/*             (self->encrypted_max + sizeof(self->foot) == offset)); */
+
+    rc = KEncFileV1BufferWrite (self, offset, &foot, sizeof (foot),
+                              &num_writ);
+    if (rc == 0)
+    {
+        if (num_writ != sizeof (foot))
+            rc = RC (rcFS, rcFile, rcWriting, rcFile, rcInsufficient);
+    }
+    return rc;
+}
+
+
+/* ----------
+ * IvecInit
+ *    create the ivec for a given block
+ *    done in a function to ensure decrypt and encrypt use the same code to
+ *    generate this.  Anything used to create this has to be available to
+ *    code that doesn't know the content of the data or the state of the file
+ *    beyond the location of the block with in the file.
+ *
+ *    This is definitely over-kill using the MD5.
+ */
+static
+void KEncFileV1IVecInit (const KEncFileV1 * self, KEncFileIVec ivec)
+{
+    BufferCalcMD5 (&self->block.id, sizeof self->block.id, ivec);
+}
+
+ 
+/* ----------
+ * BlockEncrypt
+ */
+
+static
+rc_t KEncFileV1BlockEncrypt (KEncFileV1 * self, KEncFileBlock * e)
+{
+    SHA256State state;
+    uint64_t id;
+    uint16_t valid;
+    uint16_t saved_valid;
+    KEncFileCRC crc;
+    uint8_t ivec [16];
+    rc_t rc;
+
+    assert (self);
+    assert (e);
+
+    /*
+     * First we finish preparing the two ciphers by creating the block
+     * user key out of the first part of the data and the shared Initialization
+     * vector for Chained Block Cipher mode encryption out of the block id
+     * 
+     * create the initialization vector for this block
+     */
+    KEncFileV1IVecInit (self, ivec);
+
+    /*
+     * set the ivec for both the master and data block ciphers
+     */
+    rc = KCipherSetEncryptIVec (self->ciphers.master, ivec);
+    if (rc)
+        return rc;
+
+    rc = KCipherSetEncryptIVec (self->ciphers.block, ivec);
+    if (rc)
+        return rc;
+
+    /*
+     * create the block user key out of the first 4kb of data and the block id 
+     */
+    saved_valid = valid = self->block.u.valid;
+    id = self->block.id;
+
+    SHA256StateInit (&state);
+    SHA256StateAppend (&state, self->block.data, 
+                       valid > 4096 ? 4096 : valid);
+    SHA256StateAppend (&state, &id, sizeof (id));
+    SHA256StateFinish (&state, self->block.key);
+        
+    /*
+     * create the block key schedule out of the block user key
+     */
+    rc = KCipherSetEncryptKey (self->ciphers.block, self->block.key,
+                               sizeof self->block.key);
+    if (rc)
+        return rc;
+
+    /* 
+     * Salt the block using the randomish user key to randomly select
+     * data from the valid data.
+     *
+     * This will cover the data portion of the block past the last valid
+     * byte.
+     *
+     * NOTE we are accessing a byte array as a word array.
+     *
+     * NOTE we are using the array named data to access data beyond it's end.
+     */
+    {
+        uint16_t * pw;
+        unsigned int windex;
+        unsigned int rindex;
+        size_t bindex;
+
+        pw = (uint16_t*)self->block.key;
+        windex = 0;
+
+        for (bindex = valid;
+             bindex < sizeof self->block.data + sizeof self->block.u; 
+             ++ bindex)
+        {
+            /* this goes beyond the end of the data array by design */
+            rindex = (size_t)pw[windex];
+            rindex %= bindex;
+
+            self->block.data[bindex] = self->block.data[rindex];
+        
+            ++rindex;
+            if (rindex >= sizeof self->block.key / sizeof *pw)
+                rindex = 0;
+        }
+    }
+
+    /* 
+     * If we are modifying a block created on a system with a different default
+     * Endian choice we'll need to byte swap the block id and the block valid
+     * count
+     */
+    if (self->bswap)
+    {
+        id = bswap_64 (id);
+        valid = bswap_16 (valid);
+    }
+
+
+    if (saved_valid == sizeof self->block.data)
+        self->block.u.valid |= valid;
+    else
+        self->block.u.valid = valid;
+
+    e->id = id;
+
+    /* 
+     * encrypt the block user key into the buffer
+     */
+    rc = KCipherEncryptCBC (self->ciphers.master, self->block.key, e->key,
+                            sizeof (self->block.key) / sizeof (ivec));
+    if (rc)
+        return rc;
+
+    /*
+     * encrypt the data, offset and valid values
+     */
+    rc = KCipherEncryptCBC (self->ciphers.block, 
+                            self->block.data, e->data,
+                            (sizeof self->block.data + sizeof self->block.u) / sizeof (ivec));
+    if (rc)
+        return rc;
+
+    self->block.u.valid = saved_valid;
+
+    crc = CRC32 (0, e, (char*)(&e->crc)-(char*)e);
+
+    self->block.crc = crc;
+
+    if (self->bswap)
+    {
+        crc = bswap_32 (crc);
+    }
+    e->crc_copy = e->crc = crc;
+    
+    return 0;
+}
+
+
+/* ----------
+ * BlockDecrypt
+ *   decrypt decrypts the data from a KEncFileBlock into the KEncFileBlock
+ *   in the KEncFile object
+ */
+
+static
+rc_t KEncFileV1BlockDecrypt (KEncFileV1 * self, KEncFileBlock * e)
+{
+    uint8_t ivec [16];
+    rc_t rc;
+
+    assert (self);
+    assert (e);
+
+    /* create the initialization vector for this block */
+    KEncFileV1IVecInit (self, ivec);
+
+    /*
+     * set the ivec for both the master and data block ciphers
+     */
+    rc = KCipherSetDecryptIVec (self->ciphers.master, ivec);
+    if (rc)
+        return rc;
+
+    rc = KCipherSetDecryptIVec (self->ciphers.block, ivec);
+    if (rc)
+        return rc;
+
+    /* 
+     * decrypt the block key and initial vector using the user key and 
+     * the computer ivec
+     */
+    rc = KCipherDecryptCBC (self->ciphers.master, e->key, self->block.key,
+                            (sizeof e->key) / sizeof ivec);
+    if (rc)
+        return rc;
+
+    /* 
+     * now create the AES key for the block from the newly decrypted 
+     * block key
+     */
+    rc = KCipherSetDecryptKey (self->ciphers.block, self->block.key,
+                               sizeof self->block.key);
+    if (rc)
+        return rc;
+    rc = KCipherDecryptCBC (self->ciphers.block, e->data, 
+                            self->block.data, 
+                            (sizeof e->data + sizeof e->u) / sizeof ivec);
+    if (rc)
+        return rc;
+
+    if (self->bswap)
+    {
+        self->block.u.valid = bswap_16 (self->block.u.valid);
+/*         self->block.id = bswap_64 (self->block.id); */
+    }
+
+    /* we choose not to flag errors in decryption so don't validate these */
+    if (self->block.u.valid & 0x8000)
+        self->block.u.valid = 0x8000;
+
+    return rc;
+}
+
+
+/* ----------
+ * BlockRead
+ *    read a requested block from the encrypted file; 
+ *    decryption is a separate step
+ */
+static
+rc_t KEncFileV1BlockRead (const KEncFileV1 * cself, uint64_t block_id,
+                        KEncFileBlock * block, bool validate)
+{
+    KEncFileV1 * self;    /* mutable fields */
+    uint64_t pos;
+    uint64_t max;
+    size_t num_read;
+    rc_t rc;
+    KEncFileBlock e;
+
+    assert (cself);
+    assert (block);
+
+    self = (KEncFileV1*)cself;
+    pos = BlockId_to_CiphertextOffset ( block_id );
+
+    /* set aside the current maximum position within the encrypted file */
+    max = self->encrypted_max;
+
+    memset (&self->block, 0, sizeof self->block);
+    self->block.id = block_id;
+    self->block.u.valid = 0;
+    self->dirty = false;
+
+    rc = KEncFileV1BufferRead (self, pos, &e, sizeof e, &num_read);
+    if (rc)
+        PLOGERR (klogErr,
+                 (klogErr, rc,
+                  "error in reading block '$(BID)' from encrypted file",
+                  "BID=%lu", block_id));
+    else
+    {
+        uint32_t crc;
+
+        /* we'll judge the success of the read now on how many bytes read
+         * there are only three legitimate values:  
+         *   + size of a block 
+         *   + size of a footer
+         *   + zero meaning no footer yet
+         *
+         * This might have to change to handled streamed files where the 
+         * producer jsut hasn't finished yet
+         */
+        switch (num_read)
+        {
+        default: /* bad value means a truncated file most likely */
+            rc = RC (rcKrypto, rcFile, rcReading, rcFile, rcInsufficient);
+            PLOGERR (klogErr,
+                     (klogErr, rc, "wrong size reading block '$(B)' at '$(P)' "
+                      "from encrypted file - likely truncated", "B=%lu,P=%lu",
+                      block_id, pos));
+            break;
+
+        case sizeof e:
+            if (max <= pos) /* if we hadn't read this far do accounting */
+            {
+                if (self->bswap)
+                {
+                    e.crc = bswap_32 (e.crc);
+                    e.id = bswap_64 (e.id);
+                }
+
+                if (block_id != e.id)
+                {
+                    PLOGERR (klogErr,
+                             (klogErr,
+                              RC (rcKrypto, rcFile, rcValidating, rcIndex, rcIncorrect),
+                              "error validating id for block '$(BID)' is not $(C2)", 
+                              "BID=%lu,C2=%lu", block_id, e.id));
+                }
+
+                if (validate)
+                {
+                    crc = CRC32 (0, &e, (char*)(&e.crc)-(char*)&e);
+
+
+                    if (crc != e.crc)
+                    {
+                        PLOGERR (klogErr,
+                                 (klogErr,
+                                  RC (rcKrypto, rcFile, rcValidating, rcCrc, rcCorrupt),
+                                  "error validating crc for block '$(BID)' $(C1) is not $(C2)", 
+                                  "BID=%lu,C1=0x%X,C2=0x%X", block_id,
+                                  crc, e.crc));
+                    }
+                }
+
+                ++self->foot.block_count;
+/* Byte Endian problem! */
+                self->foot.crc_checksum += e.crc;
+            }
+            memmove (block, &e, sizeof e);
+            self->eof = false;
+            break;
+
+        case sizeof (self->foot):
+            {
+                KEncFileFooter foot;
+                memmove (&foot, &e, sizeof foot);
+                if (self->bswap)
+                {
+                    foot.block_count = bswap_64 (foot.block_count);
+                    foot.crc_checksum = bswap_64 (foot.crc_checksum);
+                }
+                if (validate && !self->written)
+                {
+                    rc = KEncFileV1FooterValidate (self, foot.block_count,
+                                                 foot.crc_checksum);
+                    if (rc)
+                        break;
+                }
+            }
+            /* fall through */
+        case 0:
+            self->block.u.valid = 0;
+            self->block.crc = 0;
+            self->eof = true;
+            return 0;
+
+        }
+    }
+    return rc;
+}
+
+static
+rc_t KEncFileV1BlockWrite (KEncFileV1 * self)
+{
+    KEncFileBlock e;
+    uint64_t block_offset;
+    size_t num_writ;
+    rc_t rc;
+ 
+    assert (self);
+
+    if (self->block.u.valid > sizeof self->block.data)
+        return RC (rcFS, rcFile, rcWriting, rcBuffer, rcCorrupt);
+
+    /* where in the file is this block */
+    block_offset = BlockId_to_CiphertextOffset ( self -> block . id );
+
+    /* if this is an update to a block take out the old crc value */
+    if (block_offset < self->encrypted_max)
+        self->foot.crc_checksum -= self->block.crc;
+
+    /* if it's not we need to add it as a new block in the count */
+    else
+        ++self->foot.block_count;
+
+    rc = KEncFileV1BlockEncrypt (self, &e);
+    if (rc)
+        return rc;
+
+/* Byte Endian problem */
+    self->foot.crc_checksum += self->block.crc;
+
+    /* now write the buffer to the encrypted file */
+    rc = KEncFileV1BufferWrite (self, block_offset, &e, sizeof e, &num_writ);
+
+    if ((rc == 0) && (num_writ != sizeof e))
+    {
+        rc = RC (rcFS, rcFile, rcWriting, rcFile, rcTooShort);
+        PLOGERR (klogErr,
+                 (klogErr, rc, "incomplete block write '$(B)' wanted"
+                  " '$(V)' got '$(N)'", "B=%lu,V=%u,N=%u",
+                  self->foot.block_count+1, self->block.u.valid, num_writ));
+    }
+    return rc;
+}
+
+
+static
+rc_t KEncFileV1BlockFlush (KEncFileV1 *self)
+{
+    rc_t rc = 0;
+
+    assert (self);
+    assert (self->block.u.valid);
+    assert (self->block.u.valid <= sizeof (self->block.data));
+
+    /* first do we need to deal with the file header? 
+     * if the encrypted file has not been written to we do */
+    if ((self->encrypted_max == 0) && (self->swarm == false))
+    {
+        rc = KEncFileV1HeaderWrite (self);
+        if (rc)
+            return rc;
+    }
+
+    if (self->dirty)
+    {
+        rc = KEncFileV1BlockWrite (self);
+        if (rc == 0)
+            self->dirty = false;
+    }
+    return rc;
+}
+
+
+/*
+ * block_id - which block to read and decrypt
+ * fill - if not false, we fill in zero blocks up through this block
+ *
+ */
+static
+rc_t KEncFileV1BlockSeek (KEncFileV1 * self, uint64_t block_id, bool fill, bool validate)
+{
+    KEncFileBlock b;
+    rc_t rc;
+
+    if (block_id != self->block.id)
+    {
+        if (self->dirty)
+        {
+            /* flush what we got */
+            rc = KEncFileV1BlockFlush (self);
+            if (rc)
+                return rc;
+        }
+
+        if (validate && (block_id > self->block.id))
+        {
+            uint64_t tid;
+
+            for (tid = self->block.id + 1; tid < block_id; ++tid)
+            {
+                if ( self -> encrypted_max > BlockId_to_CiphertextOffset ( block_id ) )
+                    continue;
+
+                memset (&b, 0, sizeof b);
+
+                rc = KEncFileV1BlockRead (self, tid, &b, validate);
+                if (rc)
+                    return rc;
+
+                if (self->eof)
+                {
+                    if (fill)
+                    {
+                        self->eof = false;
+                        memset (self->block.data, 0, sizeof (self->block.data));
+                        self->block.u.valid = sizeof (self->block.data);
+                        self->dirty = true;
+                        rc = KEncFileV1BlockFlush (self);
+                        if (rc)
+                            return rc;
+                    }
+                    else
+                        return 0;
+                }
+                /* in this loop a less than full block is end of file */
+                else if (fill)
+                {
+                    rc = KEncFileV1BlockDecrypt (self, &b);
+                    if (rc)
+                        return rc;
+
+                    if (self->block.u.valid < sizeof self->block.u.valid)
+                    {
+                        memset (self->block.data + self->block.u.valid, 0, 
+                                sizeof (self->block.data) - self->block.u.valid);
+                        self->dirty = true;
+                        rc = KEncFileV1BlockFlush (self);
+                        if (rc)
+                            return rc;
+                    }
+                    else
+                    {
+                        return 0;
+                    }
+                }
+            }
+        }
+    }
+    /* done with intervening blocks */
+    memset (&b, 0, sizeof b);
+
+    rc = KEncFileV1BlockRead (self, block_id, &b, validate);
+    if (rc)
+        return rc;
+
+    if (! self->eof)
+    {
+        rc = KEncFileV1BlockDecrypt (self, &b);
+    }
+    if (fill)
+    {
+        self->block.id = block_id;
+        self->block.u.valid = 0;
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Interface Functions
+ *
+ * Destroy
+ *
+ */
+static
+rc_t CC KEncFileV1DestroyRead (KEncFileV1 *self)
+{
+    rc_t rc1 = 0;
+    rc_t rc2 = 0;
+    rc_t rc3 = 0;
+
+    if (self)
+    {
+        rc1 = KFileRelease (self->encrypted);
+        rc2 = KCipherRelease (self->ciphers.master);
+        rc3 = KCipherRelease (self->ciphers.block);
+        free (self);
+        return rc1 ?  rc1 : rc2 ? rc2 : rc3;
+    }
+    return 0;
+}
+
+
+static
+rc_t CC KEncFileV1DestroyWrite (KEncFileV1 *self)
+{
+    rc_t rc1;
+    rc_t rc2;
+
+    rc1 = (self->block.u.valid) ? KEncFileV1BlockFlush (self) : 0;
+    if ((rc1 == 0)&&(self->encrypted_max != 0))
+        rc1 = KEncFileV1FooterWrite (self);
+    rc2 = KFileRelease (self->encrypted);
+
+    return (rc1 ?  rc1 : rc2);
+}
+
+
+static
+rc_t CC KEncFileV1DestroySwarm (KEncFileV1 *self)
+{
+    rc_t rc1 = 0;
+    rc_t rc2 = 0;
+    rc_t rc3 = 0;
+
+    if (self)
+    {
+        rc1 = KFileRelease (self->encrypted);
+        rc2 = KCipherRelease (self->ciphers.master);
+        rc3 = KCipherRelease (self->ciphers.block);
+        free (self);
+        return rc1 ?  rc1 : rc2 ? rc2 : rc3;
+    }
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ *
+ * We do not allow this for read, write or update as you can not memory map the 
+ * unencrypted file in a meaningful way.
+ */
+static
+struct KSysFile *CC KEncFileV1GetSysFileUnsupported (const KEncFileV1 *self, uint64_t *offset)
+{
+    assert (self);
+    assert (offset);
+    return NULL;
+}
+
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t CC KEncFileV1RandomAccess (const KEncFileV1 *self)
+{
+    assert (self != NULL);
+    assert (self->encrypted != NULL);
+    return KFileRandomAccess (self->encrypted);
+}
+
+
+static
+rc_t CC KEncFileV1RandomAccessUnsupported (const KEncFileV1 *self)
+{
+    return RC ( rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported );
+}
+
+
+/* ----------------------------------------------------------------------
+ * Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KEncFileV1SizeUnsupported (const KEncFileV1 *self, uint64_t *size)
+{
+    return RC ( rcFS, rcFile, rcAccessing, rcFunction, rcUnsupported );
+}
+
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KEncFileV1SetSizeUnsupported (KEncFileV1 *self, uint64_t size)
+{
+    assert (self);
+    return RC ( rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported );
+}
+
+
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t CC KEncFileV1ReadUnsupported (const KEncFileV1 *self,
+                                 uint64_t pos,
+                                 void *buffer,
+                                 size_t bsize,
+                                 size_t *num_read)
+{
+    return RC ( rcFS, rcFile, rcReading, rcFunction, rcUnsupported );
+}
+
+
+static
+rc_t CC KEncFileV1Read	(const KEncFileV1 *cself,
+                         uint64_t pos,
+                         void *buffer,
+                         size_t bsize,
+                         size_t *num_read)
+{
+    KEncFileV1 * self = (KEncFileV1 *)cself; /* mutable values */
+    uint64_t block_id;
+    uint32_t offset;
+    size_t to_copy;
+    rc_t rc = 0;
+
+    assert (self); /* checked in file.c KFileRead() */
+    /* pos can be 'anything' */
+    assert (buffer); /* checked in file.c KFileRead() */
+    assert (bsize); /* checked in file.c KFileRead() */
+    assert (num_read); /* checked in file.c KFileRead() */
+
+    *num_read = 0;
+
+    block_id = PlaintextOffset_to_BlockId (pos, &offset);
+
+    /*
+     * are we on the wrong block?
+     * Or are do we need to read the first block?
+     */
+    if ((block_id != self->block.id) || (self->block.u.valid == 0))
+    {
+        rc = KEncFileV1BlockSeek (self, block_id, false, false);
+        if (rc)
+            return rc;
+    }
+
+    /*
+     * if we are trying to read past the end of the file 
+     * return 0 with nothing read
+     */
+    if (self->eof || (block_id != self->block.id) ||
+        (offset >= self->block.u.valid))
+        return 0;
+
+    to_copy = self->block.u.valid - offset;
+    if (to_copy > bsize)
+        to_copy = bsize;
+
+    memmove (buffer, self->block.data + offset, to_copy);
+    *num_read = to_copy;
+
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ * Unsupported as we now treat archives as READ ONLY
+ */
+static
+rc_t CC KEncFileV1WriteUnsupported (KEncFileV1 *self, uint64_t pos,
+                                  const void *buffer, size_t bsize,
+                                  size_t *num_writ)
+{
+    rc_t rc = RC (rcFS, rcFile, rcReading, rcFunction, rcUnsupported);
+    LOGERR (klogInt, rc, "KFileRead failed to filter call");
+    return rc;
+}
+
+static
+rc_t KEncFileV1WriteInt (KEncFileV1 *self, uint64_t block_id, uint32_t block_offset,
+                       const void *buffer, size_t bsize,
+                       size_t *pnum_writ, bool seek)
+{
+    const uint8_t * pb;
+    size_t tot_writ;
+    rc_t rc;
+
+    assert (self);
+    assert (self->block.u.valid <= sizeof (self->block.data));
+    assert (block_offset < sizeof (self->block.data));
+    assert (buffer);
+    assert (bsize);
+    assert (pnum_writ);
+
+    if (seek)
+    {
+        /* if we need to change blocks */
+        if (block_id != self->block.id)
+        {
+            rc = KEncFileV1BlockSeek (self, block_id, true, false);
+            if (rc)
+                return rc;
+        }
+        /* do we have to fill some of this block */
+        if (self->block.u.valid < block_id)
+        {
+            memset (self->block.data + self->block.u.valid, 0,
+                    block_offset - self->block.u.valid);
+            self->block.u.valid = block_offset;
+        }
+    }
+
+    /*
+     * is the full write within this block?
+     * doesn't matter whether we are skipping back or not
+     */
+    if ((block_offset + bsize) <= sizeof (self->block.data))
+    {
+        memmove (self->block.data + block_offset, buffer, bsize);
+        self->dirty = true;
+        if (block_offset + bsize > self->block.u.valid)
+            self->block.u.valid = (KEncFileBlockValid) ( block_offset + bsize );
+        *pnum_writ = bsize;
+        return 0;
+    }
+
+    /* we are either forcing ourselves backward or not */
+    else 
+        self->block.u.valid = block_offset;
+
+    /* by this point we are 'at' the right place in the file */
+    /* do we have an existing (possibly partial) block? */
+
+    /* change to a sized target pointer */
+    pb = buffer;
+    tot_writ = 0;
+
+    /* handle this first block with some data in it */
+    if (self->block.u.valid != 0)
+    {
+        size_t remaining;
+
+        /* how many bytes left in this block */
+        remaining = sizeof self->block.data - self->block.u.valid;
+
+        memmove (self->block.data + self->block.u.valid, buffer, remaining);
+        self->block.u.valid = sizeof self->block.data;
+
+        self->dirty = true;
+        rc = KEncFileV1BlockFlush (self);
+        if (rc)
+        {
+            LOGERR (klogErr, rc, "error flushing block in encrypt");
+            return rc;
+        }
+
+        tot_writ = remaining;
+        pb += remaining;
+        bsize -= remaining; 
+        ++block_id;
+    }
+
+    /* now loop through complete blocks to write */
+    for (; bsize >= sizeof self->block.data; bsize -= sizeof self->block.data)
+    {
+        memmove (self->block.data, pb, sizeof self->block.data);
+
+        self->block.u.valid = sizeof self->block.data;
+        self->block.id = block_id;
+        self->dirty = true;
+        rc = KEncFileV1BlockFlush (self);
+        if (rc)
+        {
+            LOGERR (klogErr, rc, "error flushing block in encrypt");
+            return rc;
+        }
+        pb += sizeof self->block.data;
+	tot_writ += sizeof self->block.data;
+        ++block_id;
+    }
+
+    /* now any last partial block that starts at the beginning of a block */
+    if (bsize != 0)
+    {
+        KEncFileBlock b;
+
+        if ( self -> encrypted_max > BlockId_to_CiphertextOffset ( block_id ) )
+        {
+            rc = KEncFileV1BlockRead (self, block_id, &b, false);
+            if (rc)
+                return rc;
+            /* if valid is not 0 we actually read something */
+            if (b.u.valid)
+                rc = KEncFileV1BlockDecrypt (self, &b);
+        }
+        else
+        {
+            self->block.u.valid = 0;
+            self->block.id = block_id;
+        }
+
+        memmove (self->block.data, pb, bsize);
+
+        if (bsize > self->block.u.valid)
+            self->block.u.valid = (KEncFileBlockValid) bsize;
+
+        self->dirty = true;
+        tot_writ += bsize;
+    }
+    *pnum_writ = tot_writ;
+    return 0;
+}
+
+
+static
+rc_t CC KEncFileV1Write (KEncFileV1 *self, uint64_t pos,
+                       const void *buffer, size_t bsize,
+                       size_t *pnum_writ)
+{
+    uint64_t block_id;
+    uint64_t curr_block_id;
+    uint32_t block_offset;
+    uint32_t curr_block_offset;
+    rc_t rc = 0;
+
+    /* -----
+     * check for incorrect call with a seek attempt
+     * we only allow seeks on read or read/write files
+     *
+     * find our location in the encrypted file by block id
+     * and offset
+     */
+    block_id = PlaintextOffset_to_BlockId (pos, &block_offset);
+    curr_block_id = PlaintextOffset_to_BlockId
+        ( BlockId_to_PlaintextOffset ( self -> block . id ) + self -> block . u . valid,
+         &curr_block_offset);
+
+    /* are we writing to the wrong block/offset? */
+    if ((block_id != curr_block_id) || (block_offset != curr_block_offset))
+    {
+        rc = RC (rcFS, rcFile, rcWriting, rcOffset, rcIncorrect);
+        PLOGERR (klogErr, (klogErr, rc, "attempt to seek in encryption write at"
+                           " '$(O)' seek to '$(P)'", "O=%lu,P=%lu",
+                           BlockId_to_CiphertextOffset ( self -> block . id ), pos ) );
+    }
+    else
+    {
+        if ((block_id != 0) && (block_id != self->block.id))
+        {
+            rc = KEncFileV1BlockFlush (self);
+            if (rc == 0)
+            {
+                ++self->block.id;
+                self->block.u.valid = 0;
+            }
+        }
+        
+        if (rc == 0)
+            rc = KEncFileV1WriteInt (self, block_id, block_offset, buffer,
+                                       bsize, pnum_writ, false);
+    }
+    return rc;
+}
+
+
+static
+rc_t CC KEncFileV1WriteSwarm (KEncFileV1 *self, uint64_t pos,
+                            const void *buffer, size_t bsize,
+                            size_t *pnum_writ)
+{
+    uint32_t block_offset;
+    rc_t rc;
+
+    self->block.id = PlaintextOffset_to_BlockId (pos, &block_offset);
+    self->block.u.valid = 0;
+    if (bsize > sizeof self->block.data - block_offset)
+        bsize = sizeof self->block.data - block_offset;
+
+    rc = KEncFileV1WriteInt (self, self->block.id, block_offset, buffer,
+                           bsize, pnum_writ, false);
+    if (rc == 0)
+        rc = KEncFileV1BlockFlush (self);
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KEncFileV1Type (const KEncFileV1 *self)
+{
+    assert (self != NULL);
+    assert (self->encrypted != NULL);
+
+    return KFileType (self->encrypted);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KEncFileV1Make
+ *  create a new file object
+ */
+
+/* ----------
+ * KeysInit
+ */
+static
+rc_t KEncFileV1CiphersInit (KEncFileV1 * self, const KKey * key, bool read, bool write)
+{
+    KCipherManager * mgr;
+    size_t z;
+    rc_t rc;
+
+    switch ( key->type)
+    {
+    default:
+        return RC (rcKrypto, rcEncryptionKey, rcConstructing, rcParam, rcInvalid);
+
+    case kkeyNone:
+        return RC (rcKrypto, rcEncryptionKey, rcConstructing, rcParam, rcIncorrect);
+
+    case kkeyAES128:
+        z = 128/8; break;
+
+    case kkeyAES192:
+        z = 192/8; break;
+
+    case kkeyAES256:
+        z = 256/8; break;
+    }
+    rc = KCipherManagerMake (&mgr);
+    if (rc == 0)
+    {
+        rc = KCipherManagerMakeCipher (mgr, &self->ciphers.master, kcipher_AES);
+        if (rc == 0)
+        {
+            rc = KCipherManagerMakeCipher (mgr, &self->ciphers.block, kcipher_AES);
+            if (rc == 0)
+            {
+                rc = KCipherSetDecryptKey (self->ciphers.master, key->text, z);
+                if (rc == 0)
+                {
+                    rc = KCipherSetEncryptKey (self->ciphers.master, key->text, z);
+                    if (rc == 0)
+                        goto keep_ciphers;
+                }
+                KCipherRelease (self->ciphers.block);
+                self->ciphers.block = NULL;
+            }
+            KCipherRelease (self->ciphers.master);
+            self->ciphers.master = NULL;
+        }
+    keep_ciphers:
+        KCipherManagerRelease (mgr);
+    }
+    return rc;
+}
+
+
+
+/* ----------
+ * MakeInt
+ *    common make for all encryptor/decryptors
+ */
+static
+rc_t KEncFileV1MakeInt (KEncFileV1 ** pself, KFile * encrypted,
+                      const KFile_vt_v1 * vt, bool r, bool w, bool v)
+{
+    KEncFileV1 * self;
+    rc_t rc;
+
+    assert (pself);
+    assert (encrypted);
+
+    /* allocate and zero out an object since we want much of it to be zeroed */
+    self = calloc (sizeof *self, 1);
+    if (self == NULL)
+    {
+        rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+        LOGERR (klogSys, rc,
+                "out of memory creating encrypter and/or decryptor");
+    }
+    else
+    {
+        /* all KFiles get this initialization */
+        rc = KFileInit (&self->dad, (const KFile_vt*)vt, "KEncFileV1", "no-name", r, w);
+        if (rc)
+            LOGERR (klogInt, rc, "failure initialize encrypted file root class");
+        else
+        {
+            rc = KFileAddRef (encrypted);
+            if (rc == 0)
+            {
+                self->encrypted = encrypted;
+                *pself = self;
+                return 0;
+            }
+        }
+        free (self);
+    }
+    return rc;
+}
+
+
+/* ----------
+ * MakeCmn
+ * common parameter validation for all encryptor/decryptors
+ */
+static
+rc_t KEncFileV1MakeCmn (KEncFileV1 ** pself, KFile * encrypted, const KKey * key,
+                      const KFile_vt_v1 * vt, bool r, bool w)
+{
+    rc_t rc = 0;
+
+    do
+    {
+        CRC32Init();    /* likely to be called way too often */
+
+        if (pself == NULL)
+        {
+            rc = RC (rcFS, rcFile, rcConstructing, rcSelf, rcNull);
+            LOGERR (klogErr, rc,
+                    "pointer to self NULL when creating "
+                    "an encryptor/decryptor");
+            break;
+        }
+        *pself = NULL;
+
+        if (encrypted == NULL)
+        {
+            rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcNull);
+            LOGERR (klogErr, rc, 
+                    "encrypted file not supplied when creating "
+                    "an encryptor/decryptor");
+            break;
+        }
+
+        if (key == NULL)
+        {
+            rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcNull);
+            LOGERR (klogErr, rc, 
+                    "key not supplied when creating an encryptor/decryptor");
+            break;
+        }
+
+        switch (key->type)
+        {
+        default:
+            rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcInvalid);
+            PLOGERR (klogErr,
+                     (klogErr, rc, "invalid key type '$(T)' should be "
+                      "kkeyAES128(1), kkeyAES192(2) or kkeyAES256(3)",
+                      "T=%u", key->type));
+            break;
+
+        case kkeyAES128:
+        case kkeyAES192:
+        case kkeyAES256:
+            break;
+        }
+        if (rc == 0)
+        {
+            KEncFileV1 * self;
+
+            assert (vt);
+            assert ((r == true) || (r == false));
+            assert ((w == true) || (w == false));
+
+            rc = KEncFileV1MakeInt (&self, encrypted, vt, r, w, false);
+            if (rc == 0)
+            {
+                rc = KEncFileV1CiphersInit (self, key, r, w);
+                if (rc == 0)
+                {
+                    *pself = self;
+                    return 0;
+                }
+                KFileRelease (&self->dad);
+            }
+        }
+    } while (0);
+    return rc;
+}
+
+
+
+static const KFile_vt_v1 vtKEncFileV1Read =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KEncFileV1DestroyRead,
+    KEncFileV1GetSysFileUnsupported,
+    KEncFileV1RandomAccess,
+    KEncFileV1SizeUnsupported,
+    KEncFileV1SetSizeUnsupported,
+    KEncFileV1Read,
+    KEncFileV1WriteUnsupported,
+
+    /* 1.1 */
+    KEncFileV1Type
+};
+static const KFile_vt_v1 vtKEncFileV1Write =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KEncFileV1DestroyWrite,
+    KEncFileV1GetSysFileUnsupported,
+    KEncFileV1RandomAccessUnsupported,
+    KEncFileV1SizeUnsupported,
+    KEncFileV1SetSizeUnsupported,
+    KEncFileV1ReadUnsupported,
+    KEncFileV1Write,
+
+    /* 1.1 */
+    KEncFileV1Type
+};
+static const KFile_vt_v1 vtKEncFileV1Update =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KEncFileV1DestroySwarm,
+    KEncFileV1GetSysFileUnsupported,
+    KEncFileV1RandomAccess,
+    KEncFileV1SizeUnsupported,
+    KEncFileV1SetSizeUnsupported,
+    KEncFileV1ReadUnsupported,
+    KEncFileV1WriteSwarm,
+
+    /* 1.1 */
+    KEncFileV1Type
+};
+static const KFile_vt_v1 vtKEncFileV1Validate =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KEncFileV1DestroyRead,
+    KEncFileV1GetSysFileUnsupported,
+    KEncFileV1RandomAccessUnsupported,
+    KEncFileV1SizeUnsupported,
+    KEncFileV1SetSizeUnsupported,
+    KEncFileV1ReadUnsupported,
+    KEncFileV1WriteUnsupported,
+
+    /* 1.1 */
+    KEncFileV1Type
+};
+
+
+/* ----------
+ * Read mode is fully seekable if the underlying KFile is seekable some
+ * integrity checking will not be performed in allowing this seeking.
+ */
+LIB_EXPORT rc_t CC KEncFileMakeRead_v1 (const KFile ** pself, 
+                                        const KFile * encrypted,
+                                        const KKey * key)
+{
+    KEncFileV1 * self;
+    rc_t rc;
+    rc = KEncFileV1MakeCmn (&self, (KFile *)encrypted, key, &vtKEncFileV1Read, 
+                          true, false);
+    if (rc)
+        LOGERR (klogErr, rc, "error constructing decryptor");
+    else
+    {
+        rc = KEncFileV1HeaderRead (self);
+        if (rc)
+            LOGERR (klogErr, rc, "error reading encrypted file header");
+        else
+        {
+            *pself = &self->dad;
+            return 0;
+        }
+        KFileRelease (&self->dad);
+    }
+    return rc;
+}
+
+
+/* ----------
+ * Write mode encrypted file can only be written straight through form the
+ * first byte to the last.
+ */
+LIB_EXPORT rc_t CC KEncFileMakeWrite_v1 (KFile ** pself, 
+                                         KFile * encrypted,
+                                         const KKey * key)
+{
+    KEncFileV1 * self;
+    rc_t rc;
+
+    rc = KFileSetSize (encrypted, 0);
+#if 0
+    if (rc)
+        LOGERR (klogWarn, rc, "error truncating output file - "
+                "corrupted file might result");
+#endif
+
+    rc = KEncFileV1MakeCmn (&self, encrypted, key, &vtKEncFileV1Write, 
+                          false, true);
+    if (rc)
+        LOGERR (klogErr, rc, "error creating encryptor");
+    else
+        *pself = &self->dad;
+    return rc;
+}
+
+
+/* ----------
+ * Update mode is read/write mode where seeking within the file is allowed.
+ */
+
+
+LIB_EXPORT rc_t CC KEncFileV1MakeUpdate_v1 (KFile ** pself, 
+                                          KFile * encrypted,
+                                          const KKey * key)
+{
+    KEncFileV1 * self;
+    rc_t rc;
+
+    rc = KEncFileV1MakeCmn (&self, encrypted, key, &vtKEncFileV1Update, 
+                          false, true);
+    if (rc)
+        LOGERR (klogErr, rc, "error creating encryptor");
+    else
+    {
+        self->swarm = true;
+        *pself = &self->dad;
+    }
+    return rc;
+}
+
+
+/* ----------
+ * Validate mode is useful only for the KFileEncValidate function
+ */
+static
+rc_t KEncFileV1MakeValidate (const KEncFileV1 ** pself, const KFile * encrypted)
+{
+    KEncFileV1 * self;
+    rc_t rc;
+
+    assert (pself);
+    assert (encrypted);
+
+    rc = KEncFileV1MakeInt (&self, (KFile*)encrypted, &vtKEncFileV1Validate, true, false, true);
+    if (rc)
+        LOGERR (klogErr, rc, "error making KEncFileV1");
+    else
+    {
+        rc = KEncFileV1HeaderRead (self);
+        if (rc)
+            LOGERR (klogErr, rc, "error reading encrypted file header");
+        else
+        {
+            *pself = self;
+            return 0;
+        }
+    }
+    *pself = NULL;
+    return rc;
+}
+
+
+/* ----------
+ * Validate mode can not be read or written.
+ * Upon open the whole file is read from begining to end and all CRC
+ * and other integrity checks are performed immedaitely
+ */
+LIB_EXPORT rc_t CC KEncFileV1Validate_v1 (const KFile * encrypted)
+{
+    const KEncFileV1 * file;
+    rc_t rc;
+
+    /* fail if a NULL parameter: can't validate all addresses */
+    if (encrypted == NULL)
+    {
+        rc = RC (rcKrypto, rcFile, rcValidating, rcParam, rcNull);
+        LOGERR (klogErr, rc, "encrypted file was null when trying to validate");
+        return rc;
+    }
+
+    /* if the parameter is already a KEncFileV1 work on the file behind it instead */
+    /* we definitely can't work on a file being written that has not been closed */
+    if (encrypted->vt == (const KFile_vt*)&vtKEncFileV1Read)
+        encrypted = (const KFile *)(((const KEncFileV1*)encrypted)->encrypted);
+
+    /* file header is validated within the call to Make Validate */
+    rc = KEncFileV1MakeValidate (&file, encrypted);
+    if (rc)
+        LOGERR (klogErr, rc,
+                "unable to validate encrypted file due to "
+                "inability to open as encrypted file");
+    else
+    {
+        uint64_t pos;             /* position within the encrypted file */
+        uint64_t block_count = 0; /* how many blocks have we read */
+
+        /* loop through all data blocks */
+        pos = sizeof (KEncFileHeader);
+        for (block_count = 0; ; ++block_count)
+        {
+            KEncFileBlock block;
+
+            STSMSG (2, ("reading block '%u' at '%lu'", block_count,
+                        BlockId_to_CiphertextOffset ( block_count ) ) );
+           
+            rc = KEncFileV1BlockRead (file, block_count, &block, true);
+            if (rc)
+            {
+                STSMSG (2, ("read error at block '%u'", block_count));
+                break;
+            }
+            if (file->eof)
+            {
+                STSMSG (2, ("block '%u' was end", block_count));
+
+                break;
+            }
+            pos += sizeof (KEncFileData);
+        }
+        KFileRelease (&file->dad);
+    }
+    return (rc);
+}
+
+
+LIB_EXPORT rc_t CC KFileIsEnc_v1 (const char * buffer, size_t buffer_size)
+{
+    const KEncFileHeader * header;
+
+    if ((buffer == NULL) || (buffer_size == 0))
+        return RC  (rcFS, rcFile, rcIdentifying, rcParam, rcNull); 
+
+    header = (const KEncFileHeader*)buffer;
+
+    if (buffer_size < sizeof header->file_sig)
+        return RC (rcFS, rcFile, rcIdentifying, rcBuffer, rcInsufficient); 
+
+    if (buffer_size > sizeof (*header))
+        buffer_size = sizeof (*header);
+
+    if ((memcmp (header, &const_header, buffer_size) == 0) ||
+        (memcmp (header, &const_bswap_header, buffer_size) == 0)
+#if ENABLE_V2
+        ||
+        (memcmp (header, &const_header_v1, buffer_size) == 0) ||
+        (memcmp (header, &const_bswap_header_v1, buffer_size) == 0)
+#endif
+        )
+        return 0;
+
+    return RC (rcFS, rcFile, rcIdentifying, rcFile, rcWrongType); 
+}
+
+
+
+/* ----------
+ * Read mode is fully seekable if the underlying KFile is seekable some
+ * integrity checking will not be performed in allowing this seeking.
+ */
+LIB_EXPORT rc_t CC KEncFileMakeRead (const struct KFile ** pself,
+                                        const struct KFile * encrypted_input,
+                                        const struct KKey * key)
+{
+#if USE_READ_V1
+    return KEncFileV1MakeRead_v1 (pself, encrypted_input, key);
+#else
+    return KEncFileMakeRead_v2 (pself, encrypted_input, key);
+#endif
+}
+
+
+/* ----------
+ * Write mode encrypted file can only be written straight through from the
+ * first byte to the last.
+ */
+LIB_EXPORT rc_t CC KEncFileMakeWrite (struct KFile ** pself,
+                                         struct KFile * encrypted_output,
+                                         const struct KKey * key)
+{
+#if USE_WRITE_V1
+    return KEncFileV1MakeWrite_v1 (pself, encrypted_output, key);
+#else
+    return KEncFileMakeWrite_v2 (pself, encrypted_output, key);
+#endif
+}
+
+/* ----------
+ * Update mode is read/write mode where seeking within the file is allowed.
+ *
+ * NOTE this is in the private interface because it is not actually working
+ * yet.
+ */
+LIB_EXPORT rc_t CC KEncFileMakeUpdate (struct KFile ** pself, 
+                                       struct KFile * encrypted,
+                                       const struct KKey * key)
+{
+#if USE_UPDATE_V1
+    return KEncFileV1MakeUpdate_v1 (pself, encrypted, key);
+#else
+    return KEncFileMakeUpdate_v2 (pself, encrypted, key);
+#endif
+}
+LIB_EXPORT rc_t CC KEncFileMakeWriteBlock (struct KFile ** pself, 
+                                           struct KFile * encrypted,
+                                           const struct KKey * key)
+{
+#if USE_BLOCK_V1
+    return KEncFileV1MakeUpdate_v1 (pself, encrypted, key);
+#else
+    return KEncFileMakeBlock_v2 (pself, encrypted, key);
+#endif
+}
+
+
+LIB_EXPORT rc_t CC KEncFileWriteHeader  (KFile * self)
+{
+#if USE_BLOCK_V1
+    return KEncFileV1WriteHeader_v1  (self);
+#else
+    return KEncFileWriteHeader_v2  (self);
+#endif
+}
+
+
+/* ----------
+ * Validate mode can not be read or written.
+ * Upon open the whole file is read from begining to end and all CRC
+ * and other integrity checks are performed immedaitely
+ */
+LIB_EXPORT rc_t CC KEncFileValidate (const struct KFile * encrypted)
+{
+#if USE_VALIDATE_V1
+    return KEncFileV1Validate_v1 (encrypted);
+#else
+    return KEncFileValidate_v2 (encrypted);
+#endif
+}
+
+
+/* ----------
+ * Identify whether a file is a KEncFile type encrypted file by the header.
+ * read the header into a buffer and pass it into this function.  
+ * The buffer_size needs to be at least 8 but more bytes lead to a better
+ * check up to the size of the header of a KEncFile type encrypted file.
+ * As the header may change in the future (in a backwards compatible way)
+ * that size might change from the current 16.
+ *
+ * Possible returns:
+ * 0:
+ *      the file is an identified KEncFile type file.  False positives are
+ *      possible if a file happens to match at 8 or more bytes
+ *
+ * RC (rcFS, rcFile, rcIdentifying, rcFile, rcWrongType)
+ *      the file is definitely not a KEncFile type encrypted file.
+ *     
+ * RC (rcFS, rcFile, rcIdentifying, rcParam, rcNull)
+ *      bad parameters in the call
+ *
+ * RC (rcFS, rcFile, rcIdentifying, rcBuffer, rcInsufficient)
+ *      not a large enough buffer to make an identification
+ */
+LIB_EXPORT rc_t CC KFileIsEnc (const char * buffer, size_t buffer_size)
+{
+#if USE_ISENC_V1
+    return KFileIsEnc_v1 (buffer, buffer_size);
+#else
+    return KFileIsEnc_v2 (buffer, buffer_size);
+#endif
+}
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+/* end of file encfile.c */
+
diff --git a/libs/krypto/encfilev2.c b/libs/krypto/encfilev2.c
new file mode 100644
index 0000000..050f766
--- /dev/null
+++ b/libs/krypto/encfilev2.c
@@ -0,0 +1,2622 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <krypto/extern.h>
+#include <krypto/encfile.h>
+#include <krypto/encfile-priv.h>
+#include "encfile-priv.h"
+#include <krypto/cipher.h>
+#include <krypto/ciphermgr.h>
+#include <krypto/key.h>
+
+/* #include "aes-priv.h" */
+
+#include <klib/rc.h>
+#include <klib/checksum.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/debug.h>
+#include <klib/status.h>
+/* #include <klib/vector.h> */
+/* #include <klib/status.h> */
+#include <kfs/file.h>
+#include <kfs/sra.h>
+#include <sysalloc.h>
+
+#include <byteswap.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+/* #include <klib/out.h> */
+
+
+/* ----------------------------------------------------------------------
+ * KEncFile
+ *   Base object class for the encryption, decryption and validation of
+ *   the file format defined above
+ */
+
+#define KFILE_IMPL struct KEncFile
+#include <kfs/impl.h>
+
+
+#include "encfile-priv.h"
+
+typedef struct KEncFileCiphers KEncFileCiphers;
+struct KEncFileCiphers
+{
+    KCipher * master;
+    KCipher * block;
+};
+
+
+typedef struct KEncFileIVec { uint8_t ivec [16]; } KEncFileIVec;
+
+/* -----
+ */
+struct KEncFile
+{
+    KFile dad;                  /* base class */
+    KFile * encrypted;          /* encrypted file as a KFile */
+    KEncFileCiphers ciphers;    /* file and block ciphers */
+    KEncFileBlock block;        /* current data block */
+    KEncFileFooter foot;        /* contains crc checksum and block count */
+    uint64_t dec_size;          /* size of decrypted file */
+    uint64_t enc_size;          /* size of encrypted file */
+    bool dirty;                 /* data written but not flushed set in Write cleared in Flush*/
+    bool seekable;              /* we can seek within the encrypted file */
+    bool size_known;            /* can we know the size? Only streaming read can not know */
+    bool bswap;                 /* file created on system of opposite endianess */
+    bool changed;               /* some write has happened cleared in Make, set in BufferWrite */
+    bool sought;                /* did a seek on a read or write invalidating crc checksum */
+    bool has_header;            /* have we read or written a header? */
+    bool eof;                   
+    bool sra;                   /* we know we are encrypting an SRA/KAR archive file */
+    bool swarm;                 /* block mode for swarm mode using KReencFile or KEncryptFile */
+    KEncFileVersion version;    /* version from the header if read; or the one being written */
+};
+
+
+/* ----------
+ * BufferCalcMD5
+ *    Generate the MD5 digest for a buffer
+ */
+static __inline__
+void BufferCalcMD5 (const void * buffer, size_t size, uint8_t digest [16])
+{
+    MD5State state;
+
+    assert (buffer);
+    assert (size);
+    assert (digest);
+
+    MD5StateInit (&state);
+    MD5StateAppend (&state, buffer, size);
+    MD5StateFinish (&state, digest);
+}
+
+
+/* -----
+ * return true or false as to whether the the buffer described is all 0 bits
+ */
+static __inline__
+bool BufferAllZero (const void * buffer_, size_t size)
+{
+    const uint8_t * buffer;
+    size_t count;
+    bool ret;
+
+    assert (buffer_);
+
+    buffer = buffer_;
+    ret = true;
+
+    for (count = 0; count < size; ++count)
+    {
+        if (buffer[count] != '\0')
+        {
+            ret = false;
+            break;
+        }
+    }
+    return ret;
+}
+
+
+/* ----------
+ * BufferRead
+ *    Read from an encrypted file and update size if warranted
+ *
+ * Read's aren't guaranteed to get full amount
+ */
+static
+rc_t KEncFileBufferRead (KEncFile * self, uint64_t offset, void * buffer,
+                         size_t bsize, size_t * num_read)
+{
+    rc_t rc;
+
+    assert (self);
+    assert (self->encrypted);
+    assert (buffer);
+    assert (bsize > 0);
+    assert (num_read);
+
+    rc = KFileReadAll (self->encrypted, offset, buffer, bsize, num_read);
+    if (rc == 0)
+    {
+        if (self->enc_size < offset + *num_read)
+        {
+            self->enc_size = offset + *num_read;
+        }
+    }
+/* leave logging to callers? */
+    else
+        PLOGERR (klogErr, (klogErr, rc, "Error reading from encrypted file "
+                           "at '$(P)", "P=%lu", offset));
+
+    return rc;
+}
+
+
+/* ----------
+ * BufferWrite
+ *    write to an encrypted file, mark it as changed and update size if warranted
+ */
+static
+rc_t KEncFileBufferWrite (KEncFile * self, uint64_t offset, const void * buffer,
+                          size_t bsize, size_t * num_writ)
+{
+    rc_t rc = 0;
+
+    assert (self);
+    assert (self->encrypted);
+    assert (buffer);
+    assert (bsize > 0);
+    assert (num_writ);
+
+    rc = KFileWriteAll (self->encrypted, offset, buffer, bsize, num_writ);
+    if (rc != 0)
+    {
+/* leave logging to callers? */
+        PLOGERR (klogErr, (klogErr, rc, "Error writing to encrypted file "
+                           "at '$(P)", "P=%lu", offset));
+        // make sure we don't crash later in destructor
+        if (self->enc_size > offset + *num_writ)
+        {
+            self->enc_size = offset + *num_writ;
+        }
+        return rc;
+    }
+    
+    if (bsize != *num_writ)
+    {
+/*         KOutMsg ("%s: bsize %zu *num_writ %zu\n",__func__, bsize, *num_writ); */
+        rc = RC (rcKrypto, rcFile, rcWriting, rcTransfer, rcIncomplete);
+/* leave logging to callers? */
+        PLOGERR (klogErr, (klogErr, rc, "Error writing full buffer to"
+                           " encrypted file at '$(P) wrote '$(W)'",
+                           "P=%lu,W=%zu", offset, *num_writ));
+    }
+    else if (*num_writ > 0)
+    {
+        self->changed = true;
+        if (self->enc_size < offset + *num_writ)
+        {
+            self->enc_size = offset + *num_writ;
+        }
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * operations on KEncFileHeader
+ *
+ * The header only needs to be read and validated or written  we need not 
+ * reatian within the KEncFile object any information about the header in
+ * the initial version of this file format.
+ */
+
+/* -----
+ * the first eight bytes of the file are two four byte strings
+ *  The first is a common "NCBI"
+ *  The second is the format specific "nenc"
+ */
+static const KEncFileSig KEncFileSignature = "NCBInenc";
+
+
+/* -----
+ * the common constant used throughout the project to check the byte order 
+ * as written by the system which created the file
+ */
+/* enum fails to handle these due to integer overflow */
+
+#define eEncFileByteOrderTag     (0x05031988)
+#define eEncFileByteOrderReverse (0x88190305)
+
+/* ----
+ */
+#define eCurrentVersion        (0x00000002)
+#define eCurrentVersionReverse (0x02000000)
+
+
+static
+const KEncFileHeader const_header
+= { "NCBInenc", eEncFileByteOrderTag, eCurrentVersion };
+
+
+static
+const KEncFileHeader const_bswap_header
+= { "NCBInenc", eEncFileByteOrderReverse, eCurrentVersionReverse };
+
+/* skipping v1 for NCBIkenc */
+static
+const KEncFileHeader const_header_sra
+= { "NCBIsenc", eEncFileByteOrderTag, eCurrentVersion };
+
+
+static
+const KEncFileHeader const_bswap_header_sra
+= { "NCBIsenc", eEncFileByteOrderReverse, eCurrentVersionReverse };
+
+    
+/* ----------
+ * HeaderRead
+ *    Read the header of an encrypted file and validate it.
+ *
+ * We only allow a missing header for an empty file opened for update
+ */
+static
+rc_t KEncFileHeaderRead (KEncFile * self)
+{
+    KEncFileHeader header;
+    size_t num_read;
+    rc_t rc;
+
+    assert (self);
+
+    rc = KEncFileBufferRead (self, 0, &header, sizeof (header), &num_read);
+    if (rc)
+        LOGERR (klogErr, rc, "error reading encrypted file header");
+
+    else if ((num_read == 0) && (self->dad.write_enabled))
+    {
+        /* only allow read to fail with zero length if opened with write */
+        self->version = eCurrentVersion;
+        self->bswap = false;
+        self->enc_size = 0; /* redundant? */
+        self->dec_size = 0; /* redundant? */
+    }
+    else if (num_read != sizeof (header))
+    {
+        rc = RC (rcFS, rcFile, rcConstructing, rcHeader, rcTooShort);
+        PLOGERR (klogErr,
+                 (klogErr, rc, "error reading full header of encrypted "
+                  "file  wanted '$(S)' got '$(N); bytes read", "S=%u,N=%u",
+                  sizeof (header), num_read));
+    }
+    else
+    {
+        rc_t orc;
+
+        if (memcmp (header.file_sig, const_header.file_sig,
+                     sizeof (header.file_sig)) == 0)
+            self->sra = false;
+        else if (memcmp (header.file_sig, const_header_sra.file_sig,
+                         sizeof (header.file_sig)) == 0)
+            self->sra = true;
+        else
+        {
+            rc = RC (rcFS, rcFile, rcConstructing, rcHeader, rcInvalid);
+            LOGERR (klogErr, rc, "file signature not correct for encrypted file");
+        }
+
+        switch (header.byte_order)
+        {
+        case eEncFileByteOrderTag:
+            self->bswap = false;
+            self->version = header.version;
+            break;
+
+        case eEncFileByteOrderReverse:
+            self->bswap = true;
+
+            /* assert for the right bswap call */
+            assert (sizeof (self->version) == 4);
+
+            self->version = bswap_32 (header.version);
+            break;
+
+        default:
+            orc = RC (rcFS, rcFile, rcConstructing, rcByteOrder, rcInvalid);
+            PLOGERR (klogErr, (klogErr, rc, "invalid byte order flag '$(F); in "
+                               "encrypted file header", "F=%X",
+                               header.byte_order));
+            if (rc == 0)
+                rc = orc;
+            break;
+        }
+
+        if ((self->version > eCurrentVersion) || (self->version == 0))
+        {
+            orc = RC (rcFS, rcFile, rcConstructing, rcHeader, rcBadVersion);
+            PLOGERR (klogErr, (klogErr, orc, "can not decrypt version '$(V)'",
+                               "V=%u", header.version));
+            if (rc == 0)
+                rc = orc;
+        }
+        if (rc == 0)
+            self->has_header = true;
+    }
+    return rc;
+}
+
+
+/* -----
+ * HeaderWrite
+ */
+#ifndef SENC_IS_NENC_FOR_WRITER
+#define SENC_IS_NENC_FOR_WRITER 1
+#endif
+
+static
+rc_t KEncFileHeaderWrite (KEncFile * self)
+{
+    rc_t rc;
+    size_t num_writ;
+    const KEncFileHeader * head;
+
+#if SENC_IS_NENC_FOR_WRITER
+    head = self->sra 
+        ? (self->bswap ? &const_bswap_header_sra : &const_header_sra)
+        : (self->bswap ? &const_bswap_header : &const_header);
+#else
+    head = self->bswap ? &const_bswap_header : &const_header;
+#endif
+
+    rc = KEncFileBufferWrite (self, 0, head, sizeof * head, &num_writ);
+    if (rc)
+        LOGERR (klogErr, rc, "Failed to write encrypted file header");
+
+    else
+        /* forced upgrade by writing the header */
+        self->version = eCurrentVersion;
+
+    if (rc == 0)
+        self->has_header = true;
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KEncFileWriteHeader_v2  (KFile * self)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcFile, rcWriting, rcSelf, rcNull);
+
+    return KEncFileHeaderWrite ((KEncFile*)self);
+}
+
+
+
+/* ----------------------------------------------------------------------
+ * operations on KEncFileFooter
+ */
+
+/* ----------
+ * Validate
+ * we expect to read a Footer when we expect a Block so we validate in RAM
+ * without a Read
+ *
+ * we're just comparing the values in the footer against expected values
+ */
+static
+rc_t KEncFileFooterValidate (const KEncFile * self, 
+                             const uint64_t block_count,
+                             const uint64_t crc_checksum)
+{
+    rc_t rc1 = 0, rc2 = 0;
+
+    assert (self);
+
+    if (self->foot.block_count != block_count)
+    {
+        rc1 = RC (rcKrypto, rcFile, rcValidating, rcFile, rcCorrupt);
+        LOGERR (klogErr, rc1, "bad block count in encrypted file footer");
+    }
+    /*
+     * crcs should match or the crc should be 0 and the version is 1
+     */
+    if ((self->foot.crc_checksum != crc_checksum) &&
+        ((self->version == 1) || (crc_checksum != 0)))
+    {
+        rc2 = RC (rcKrypto, rcFile, rcValidating, rcChecksum, rcCorrupt);
+        LOGERR (klogErr, rc2, "bad crc checksum in encrypted file footer");
+    }
+    return (rc1 ? rc1 : rc2);
+}
+
+
+static __inline__
+void KEncFileFooterSwap (const KEncFile * self, KEncFileFooter * foot)
+{
+    assert (self);
+    assert (foot);
+
+    if (self->bswap)
+    {
+        assert (sizeof (foot->block_count) == 8);
+        foot->block_count = bswap_64 (foot->block_count);
+
+        assert (sizeof (foot->crc_checksum) == 8);
+        foot->crc_checksum = bswap_64 (foot->crc_checksum);
+    }
+}
+
+
+/* ----------
+ * Read
+ * If we know where the footer is we can read it specifically
+ */
+#if 0
+static
+rc_t KEncFileFooterRead (KEncFile * self, const uint64_t pos,
+                         const bool validate)
+{
+    union foot_plus
+    {
+        KEncFileFooter foot;
+        uint8_t bytes [sizeof (KEncFileFooter) + 1];
+    } u;
+    size_t num_read;
+    rc_t rc;
+
+    assert ((self->size_known == true) || (self->size_known == false));
+    assert (((self->size_known == true) &&
+             ((pos + sizeof (u.foot)) == self->enc_size)) ||
+            (pos == self->enc_size));
+
+    /* try to read too much just to validate nothing after the footer */
+    rc = KEncFileBufferRead (self, pos, u.bytes, sizeof u.bytes, &num_read);
+    if (rc)
+        PLOGERR (klogErr, (klogErr, rc, "failed to read encrypted file footer "
+                           "at '$(P)'", "P=%lu", pos));
+
+    else if (num_read == sizeof u.foot)
+    {
+        KEncFileFooterSwap (self, &u.foot);
+
+        if (validate)
+            rc = KEncFileFooterValidate (self, u.foot.block_count,
+                                         u.foot.crc_checksum);
+
+        if (rc == 0)
+        {
+            self->foot.block_count = u.foot.block_count;
+            self->foot.crc_checksum = u.foot.crc_checksum;
+        }
+    }
+    else if (num_read < sizeof u.foot)
+        rc = RC (rcKrypto, rcFile, rcReading, rcSize, rcInsufficient);
+
+    else
+    {
+        assert (num_read > sizeof u.foot);
+        rc = RC (rcKrypto, rcFile, rcReading, rcSize, rcExcessive);
+    }
+
+    return rc;
+}
+#endif
+
+/* ----------
+ * Write
+ * when we write a footer we write from the values in the object.  They
+ * are stored in the same object format as the footer so its very simple
+ */
+static
+rc_t KEncFileFooterWrite (KEncFile * self)
+{
+    KEncFileFooter foot;
+    uint64_t pos;
+    size_t num_writ;
+    rc_t rc;
+
+    if (self->sought)
+    {
+        self -> foot . block_count = foot . block_count =
+            PlaintextSize_to_BlockCount ( self -> dec_size, NULL );
+        foot . crc_checksum = 0;
+    }
+    else
+    {
+        memmove ( & foot, & self -> foot, sizeof foot );
+    }
+
+    KEncFileFooterSwap (self, &foot);
+
+    if (self->sought)
+        foot.crc_checksum = 0;
+
+    pos = BlockId_to_CiphertextOffset ( self -> foot . block_count );
+
+    assert ((self->size_known == true) || (self->size_known == false));
+
+    rc = KEncFileBufferWrite (self, pos, &foot, sizeof (foot),
+                              &num_writ);
+    if (rc == 0)
+    {
+        if (num_writ != sizeof (foot))
+        {
+            rc = RC (rcFS, rcFile, rcWriting, rcFile, rcInsufficient);
+            LOGERR (klogErr, rc, "faled to write correctly sized fotter "
+                    "for encrypted file");
+        }
+        else
+            assert ((pos + sizeof (foot)) == self->enc_size);
+    }
+    return rc;
+}
+
+
+/* ----------
+ * IvecInit
+ *    create the ivec for a given block
+ *    done in a function to ensure decrypt and encrypt use the same code to
+ *    generate this.  Anything used to create this has to be available to
+ *    code that doesn't know the content of the data or the state of the file
+ *    beyond the location of the block with in the file.
+ *
+ *    This is definitely over-kill using the MD5.
+ */
+static __inline__
+void KEncFileIVecInit (const uint64_t block_id, KEncFileIVec * ivec)
+{
+    BufferCalcMD5 (&block_id, sizeof block_id, ivec->ivec);
+}
+
+ 
+/* ----------
+ * BlockEncrypt
+ *
+ * Not thread safe - use of cipher schedules ivec and block key in the ciphers
+ *
+ * If this function were a protected region where only one thread could be in
+ * the body of this function at a time it could be made thread safe.
+ */
+static
+rc_t KEncFileBlockEncrypt (KEncFile * self, KEncFileBlock * d,
+                           KEncFileBlock * e)
+{
+    SHA256State state;
+    uint64_t id;
+    uint16_t valid;
+    uint16_t saved_valid;
+    KEncFileCRC crc;
+    KEncFileIVec ivec;
+    rc_t rc;
+
+    assert (self);
+    assert (d);
+    assert (e);
+
+    /*
+     * First we finish preparing the two ciphers by creating the block
+     * user key out of the first part of the data and the shared Initialization
+     * vector for Chained Block Cipher mode encryption out of the block id
+     * 
+     * create the initialization vector for this block
+     */
+    KEncFileIVecInit (d->id, &ivec);
+
+    /*
+     * set the ivec for both the master and data block ciphers
+     */
+    rc = KCipherSetEncryptIVec (self->ciphers.master, &ivec);
+    if (rc)
+        return rc;
+
+    rc = KCipherSetEncryptIVec (self->ciphers.block, &ivec);
+    if (rc)
+        return rc;
+
+    /*
+     * create the block user key out of the first 4kb of data and the block id 
+     */
+    saved_valid = valid = d->u.valid;
+    id = d->id;
+
+    SHA256StateInit (&state);
+    SHA256StateAppend (&state, d->data, 
+                       valid > 4096 ? 4096 : valid);
+    SHA256StateAppend (&state, &id, sizeof (id));
+    SHA256StateFinish (&state, d->key);
+        
+    /*
+     * create the block key schedule out of the block user key
+     */
+    rc = KCipherSetEncryptKey (self->ciphers.block, d->key, sizeof d->key);
+    if (rc)
+        return rc;
+
+    /* 
+     * Salt the block using the randomish user key to randomly select
+     * data from the valid data.
+     *
+     * This will cover the data portion of the block past the last valid
+     * byte.
+     *
+     * NOTE we are accessing a byte array as a word array. COuld be trouble
+     *      on some archaic processors such as the MC68000 family.
+     *
+     * NOTE we are using the array named data to access data beyond it's end
+     *      based on knowledge of the structure of the KEncFileBlock.
+     */
+    {
+        uint16_t * pw;
+        unsigned int windex;
+        unsigned int rindex;
+        size_t bindex;
+
+        pw = (uint16_t*)d->key;
+        windex = 0;
+
+        for (bindex = valid;
+             bindex < sizeof d->data + sizeof d->u; 
+             ++ bindex)
+        {
+            /* this goes beyond the end of the data array by design */
+            rindex = (size_t)pw[windex];
+            rindex %= bindex;
+
+            d->data[bindex] = d->data[rindex];
+        
+            ++rindex;
+            if (rindex >= sizeof self->block.key / sizeof *pw)
+                rindex = 0;
+        }
+    }
+
+    /* 
+     * If we are modifying a block created on a system with a different default
+     * Endian choice we'll need to byte swap the block id and the block valid
+     * count
+     */
+    if (self->bswap)
+    {
+        assert (sizeof id == 8);
+        id = bswap_64 (id);
+
+        assert (sizeof (valid = 2));
+        valid = bswap_16 (valid);
+    }
+
+    /* is this a bswap problem? */
+    if (saved_valid == sizeof d->data)
+        d->u.valid |= valid;
+    else
+        d->u.valid = valid;
+
+    e->id = id;
+
+    /* 
+     * encrypt the block user key into the buffer
+     */
+#if 0
+    {
+        unsigned iii;
+        KOutMsg ("v2 decrypted key %lu\n", d->id);
+        for (iii = 0; iii < sizeof (d->key); +++ iii) 
+            KOutMsg ("%2.2x ", d->key[iii]);
+        KOutMsg ("\n");
+    }
+#endif
+    rc = KCipherEncryptCBC (self->ciphers.master, d->key, e->key,
+                            sizeof (d->key) / sizeof (ivec));
+    if (rc)
+        return rc;
+#if 0
+    {
+        unsigned iii;
+        KOutMsg ("v2 encrypted key\n");
+        for (iii = 0; iii < sizeof (e->key); +++ iii) 
+            KOutMsg ("%2.2x ", e->key[iii]);
+        KOutMsg ("\n");
+    }
+#endif
+    /*
+     * encrypt the data, offset and valid values
+     */
+    rc = KCipherEncryptCBC (self->ciphers.block, 
+                            d->data, e->data,
+                            (sizeof d->data + sizeof d->u) / sizeof (ivec));
+    if (rc)
+        return rc;
+
+    d->u.valid = saved_valid;
+
+    crc = CRC32 (0, e, (char*)(&e->crc)-(char*)e);
+
+    self->block.crc = crc;
+
+    if (self->bswap)
+    {
+        assert (sizeof crc == 4);
+        crc = bswap_32 (crc);
+    }
+    e->crc_copy = e->crc = crc;
+
+/*     KOutMsg ("%s: %lu %lu %lu ", __func__, self->foot.block_count, self->foot.crc_checksum,self->block.id); */
+    if (self->foot.block_count <= self->block.id)
+        self->foot.block_count = self->block.id + 1;
+
+    if (!self->sought)
+        self->foot.crc_checksum += crc;
+
+/*     KOutMsg ("%lu %lu\n", __func__, self->foot.block_count, self->foot.crc_checksum); */
+
+    return 0;
+}
+
+
+/* ----------
+ * BlockDecrypt
+ *   decrypt decrypts the data from a KEncFileBlock into the KEncFileBlock
+ *   in the KEncFile object
+ *
+ * Not thread safe - use of cipher schedules ivec and block key in the ciphers
+ *
+ * If this function were a protected region where only one thread could be in
+ * the body of this function at a time it could be made thread safe.
+ */
+static
+rc_t KEncFileBlockDecrypt (KEncFile * self, KEncFileBlockId bid,
+                           const KEncFileBlock * e, KEncFileBlock * d)
+{
+    KEncFileIVec ivec;
+    rc_t rc;
+
+    d->id = e->id;
+
+    /* create the initialization vector for this block */
+    KEncFileIVecInit (bid, &ivec);
+
+    /*
+     * set the ivec for both the master and data block ciphers
+     */
+    rc = KCipherSetDecryptIVec (self->ciphers.master, &ivec);
+    if (rc)
+        return rc;
+
+    rc = KCipherSetDecryptIVec (self->ciphers.block, &ivec);
+    if (rc)
+        return rc;
+
+    /* 
+     * decrypt the block key and initial vector using the user key and 
+     * the computer ivec
+     */
+    rc = KCipherDecryptCBC (self->ciphers.master, e->key, d->key,
+                            (sizeof e->key) / sizeof ivec);
+    if (rc)
+        return rc;
+
+    /* 
+     * now create the AES key for the block from the newly decrypted 
+     * block key
+     */
+    rc = KCipherSetDecryptKey (self->ciphers.block, d->key,
+                               sizeof d->key);
+    if (rc)
+        return rc;
+
+    rc = KCipherDecryptCBC (self->ciphers.block, e->data, d->data,
+                            (sizeof e->data + sizeof e->u) / sizeof ivec);
+    if (rc)
+        return rc;
+
+    if (self->bswap)
+    {
+        assert (sizeof d->u.valid == 2);
+        d->u.valid = bswap_16 (d->u.valid);
+    }
+
+    if (d->u.valid >= sizeof d->data)
+        d->u.valid = sizeof d->data;
+    else
+        memset (d->data + d->u.valid, 0, sizeof d->data - d->u.valid);
+
+    return rc;
+}
+
+
+/*
+ * if not decrypting block can be NULL
+ */
+
+/*
+  TBD: figure out rational way to handle bad password making blocks look really weird
+  If we have one that looks like a partial but isn't the last block -what do we do?
+*/
+
+static
+rc_t KEncFileBlockRead (KEncFile * self, KEncFileBlock * block, 
+                        KEncFileBlockId block_id, bool validate)
+{
+    union
+    {
+        KEncFileBlock b;
+        KEncFileFooter f;
+    } u;
+    size_t num_read;
+    uint64_t epos, dpos;
+    rc_t vrc, rc = 0;
+    bool missing;
+
+    assert (self);
+    assert ((validate == false) || (validate == true));
+    /* we should be decrypting or validating - maybe both */
+    assert ((block != NULL) || (validate == true));
+
+    /* translate block id into both encrypted and decrypted addresses */
+    epos = BlockId_to_CiphertextOffset ( block_id );
+    dpos = BlockId_to_PlaintextOffset ( block_id );
+
+    missing = false;
+
+    /* clear out target block */
+    if (block != NULL)
+        memset (block, 0, sizeof * block);
+
+    rc = KEncFileBufferRead (self, epos, &u.b, sizeof u.b, &num_read);
+    if (rc)
+    {
+        PLOGERR (klogErr, (klogErr, rc, "Failure to read block '$(B)' at '$(E)'"
+                           " in encrypted file decrypted at '$(D)",
+                           "B=%lu,E=%lu,D=%lu", block_id, epos, dpos));
+    }
+    else
+    {
+        switch (num_read)
+        {
+        case 0:
+            self->eof = true;
+            /* ain't got no block here */
+            break;
+
+        default:
+            /* Invalid size */
+            rc = RC (rcKrypto, rcFile, rcReading, rcBuffer, rcInsufficient);
+            PLOGERR (klogErr, (klogErr, rc, "Failure to read full block '$(B)' "
+                               "at '$(E)' in encrypted file decrypted at '$(D)",
+                               "B=%lu,E=%lu,D=%lu", block_id, epos, dpos));
+            break;
+
+        case sizeof (u.f):
+            /* footer */
+            if (validate) /* validate before checking as missing */
+            {
+                KEncFileFooterSwap (self, &u.f);
+
+                if (u.f.block_count != block_id)
+                {
+                    vrc = RC (rcKrypto, rcFile, rcValidating, rcSize,
+                              rcIncorrect);
+                    PLOGERR (klogErr,  (klogErr, vrc, "read footer block count "
+                                        "'$(B)' does not match actual block "
+                                        "count '$(A)'", "B=%lu,A=%lu",
+                                        u.f.block_count, block_id));
+                    if ( rc == 0 )
+                        rc = vrc;
+                }
+                vrc = KEncFileFooterValidate (self, u.f.block_count,
+                                              u.f.crc_checksum);
+
+#if 1
+                if ( rc == 0 )
+                    rc = vrc;
+#else
+                /* what is the significance of a NULL block? */
+                if (block == NULL)
+                    rc = vrc;
+#endif
+            }
+
+            /* is it a "missing" footer? */
+            /* or if the footer appears invalid - make it "valid" */
+            if (((missing = BufferAllZero(&u.f, sizeof u.f)) == true) ||
+                (self->foot.block_count != block_id))
+            {
+/*                 self->foot.block_count = block_id; */
+                self->foot.crc_checksum = 0;
+            }
+
+            /* force some values though they might already be known */
+            self->enc_size = epos + sizeof u.f;
+            self->size_known = true;
+            self->dec_size = dpos;
+            self->eof = true;
+            break;
+
+        case sizeof (u.b):
+            /* block */
+            self->eof = false;
+            /* is it a "missing" block? */
+            if ((missing = BufferAllZero(&u.b, sizeof u.b)) == true)
+            {
+                if (validate)
+                {
+                    vrc = RC (rcKrypto, rcFile, rcValidating,
+                                   rcData, rcNull);
+
+                    PLOGERR (klogErr, (klogErr, vrc, "read missing block at "
+                                       "block number '$(I)' encrypted position "
+                                       "$(E) decrypted postion $(D)",
+                                       "I=%lu,E=%lu,D=%lu", block_id, epos,
+                                       dpos));
+                    if ( rc == 0 )
+                        rc = vrc;
+                }
+                u.b.id = block_id;
+                u.b.u.valid = sizeof u.b.data;
+
+                /* if we can only learn of the size by reading and are thus scanning
+                 * through the current decrypt position must be the current known
+                 * decrypted side size
+                 */
+                if (!self->size_known)
+                {
+                    assert (dpos == self->dec_size);
+                    self->dec_size = dpos + sizeof u.b.data;
+                }
+                /*
+                 * if we know the decrypted size and it is less than what we
+                 * read, adjust the valid.  BUT this must not be for the block read
+                 * for the last block to know the decrypted size. A chicken and egg
+                 * problem.
+                 */
+                else if ((self->dec_size >= dpos) &&
+                         (self->dec_size < dpos + sizeof u.b.data))
+                    u.b.u.valid  = (uint16_t)(self->dec_size - dpos);
+            }
+
+            /* we read a full block that wasn't all zeroes */
+            else
+            {
+                /* since we've chosen not to standardize the file format byte ordering */
+                if (self->bswap)
+                {
+                    assert (sizeof u.b.crc == 4);
+                    u.b.crc = bswap_32 (u.b.crc);
+                    u.b.crc_copy = bswap_32 (u.b.crc_copy);
+
+                    assert (sizeof u.b.id == 8);
+                    u.b.id = bswap_64 (u.b.id);
+                }
+
+                if (validate)
+                {
+                    uint32_t crc;
+
+                    if (block_id != u.b.id)
+                    {
+                        vrc = RC (rcKrypto, rcFile, rcValidating, rcIndex,
+                                  rcIncorrect);
+                        PLOGERR (klogErr, (klogErr, vrc, "error validating id "
+                                           "for block '$(BID)' is not $(C2)", 
+                                           "BID=%lu,C2=%lu", block_id, u.b.id));
+                        if ( rc == 0 )
+                            rc = vrc;
+                    }
+
+                    crc = CRC32 (0, &u.b, (char*)&u.b.crc - (char*)&u.b);
+
+                    if (crc != u.b.crc)
+                    {
+                        vrc = RC (rcKrypto, rcFile, rcValidating, rcChecksum, rcCorrupt);
+                        PLOGERR (klogErr,
+                                 (klogErr,
+                                  vrc,
+                                  "error validating crc for block '$(BID)' $(C1) is not $(C2)", 
+                                  "BID=%lu,C1=0x%X,C2=0x%X", block_id,
+                                  crc, u.b.crc));
+                        if ( rc == 0 )
+                            rc = vrc;
+                    }
+                    if (crc != u.b.crc_copy)
+                    {
+                        vrc = RC (rcKrypto, rcFile, rcValidating, rcChecksum, rcCorrupt);
+                        PLOGERR (klogErr,
+                                 (klogErr,
+                                  vrc,
+                                  "error validating crc_copy for block '$(BID)' $(C1) is not $(C2)", 
+                                  "BID=%lu,C1=0x%X,C2=0x%X", block_id,
+                                  crc, u.b.crc_copy));
+                        if ( rc == 0 )
+                            rc = vrc;
+                    }
+                }
+            }
+            if (self->sought == false)
+            {
+                if (block_id == 0)
+                {
+                    self->foot.block_count = 1;
+                    self->foot.crc_checksum = u.b.crc;
+                }
+                else
+                {
+                    ++self->foot.block_count;
+                    self->foot.crc_checksum += u.b.crc;
+                }
+            }
+
+            if (block != NULL)
+            {
+                if (missing)
+                {
+                    if (self->dad.write_enabled == false)
+                        rc = RC (rcKrypto, rcFile, rcReading, rcData, rcIncomplete);
+                    else
+                    {
+                        memmove (block, &u.b, sizeof u.b);
+                        rc = 0;
+                    }
+                }
+                else
+                {
+                    rc = KEncFileBlockDecrypt (self, block_id, &u.b, block);
+                    if (rc == 0)
+                    {
+                        if (block_id == 0)
+                        {
+                            rc_t sra = KFileIsSRA ((const char *)block->data, block->u.valid);
+                            self->sra =  (sra == 0);
+                        }
+
+                        if (!self->size_known)
+                        {
+                            assert (dpos == self->dec_size);
+                            self->dec_size = dpos + sizeof u.b.u.valid;
+                            if (u.b.u.valid != sizeof u.b.data)
+                            {
+                                self->size_known = true;
+                                self->enc_size = epos + sizeof u.b + sizeof self->foot;
+                            }
+                        }
+                    }
+                }
+            }
+            break;
+        }
+    }
+    return rc;
+}
+
+
+/*
+ * Take a dirty block, encrypt it and write it to the backing file
+ */
+static
+rc_t KEncFileBlockFlush (KEncFile * self, KEncFileBlock * dec_block)
+{
+    rc_t rc = 0;
+
+    assert (self);
+    assert (dec_block);
+
+
+    if (dec_block->id == 0)
+    {
+        rc = KFileIsSRA ((const char *)(dec_block->data), sizeof (KSraHeader));
+
+        /* we wait ALL the way until we try to flush the first block before we set
+         * the sra flag for write only files.
+         * we get it when we read the first block otherwise.
+         */
+        if (self->sra != (rc == 0))
+        {
+            self->sra = (rc == 0);
+            self->has_header = false;
+        }
+    }
+    if ((dec_block->id == 0) || (self->seekable))
+    {
+        if (!self->has_header)
+        {
+            if (!self->swarm)
+            {
+                rc = KEncFileHeaderWrite (self);
+                if (rc)
+                    return rc;
+            }
+            else if (dec_block->id == 0)
+                self->enc_size = sizeof (KEncFileHeader);
+        }
+    }
+
+/*     if (self->dirty) */
+    {
+        KEncFileBlock enc_block;
+
+        rc = KEncFileBlockEncrypt (self, dec_block, &enc_block);
+        if (rc == 0)
+        {
+            KEncFileBlockId block_id;
+            uint64_t pos;
+            size_t num_writ;
+
+            block_id = dec_block->id;
+
+            pos = BlockId_to_CiphertextOffset ( block_id );
+
+            rc = KEncFileBufferWrite (self, pos, &enc_block, sizeof enc_block,
+                                      &num_writ);
+
+            if (rc)
+                PLOGERR (klogErr, (klogErr, rc,
+                                   "error writing encrypted block '$(B)'",
+                                   "B=%lu", block_id));
+
+            else if (num_writ != sizeof enc_block)
+            {
+                rc = RC (rcKrypto, rcFile, rcWriting, rcBuffer, rcInsufficient);
+                PLOGERR (klogErr, (klogErr, rc, "error writing encrypted block "
+                                   "'$(B)' wrote '$(Z)' not '$(Y)'",
+                                   "B=%lu, Z=%zu", block_id, num_writ,
+                                   sizeof enc_block));
+            }
+            else
+                self->dirty = false;
+        }
+    }
+
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Interface Functions
+ *
+ * Destroy
+ *
+ */
+static
+rc_t CC KEncFileDestroy (KEncFile *self)
+{
+    rc_t rc1 = 0;
+    rc_t rc2 = 0;
+    rc_t rc3 = 0;
+    rc_t rc4 = 0;
+    rc_t rc5 = 0;
+    rc_t rc6 = 0;
+
+    assert (self);
+
+    if (self->dad.write_enabled)
+    {
+        /*
+         * write the header if we've written nothing to an empty file
+         * or if we've written something which will mean a change to v2
+         * of the encrypted file format
+         */
+        if ((self->dec_size == 0) || (self->seekable && self->changed) ||
+            ((self->dec_size == 0) && (!self->dad.read_enabled) && self->changed && (self->has_header == false)))
+/* SMURF IX
+            (self->has_header == false))
+ */
+            rc1 = KEncFileHeaderWrite (self);
+
+        /* write any dirty block */
+        if (self->dirty)
+            rc2 = KEncFileBlockFlush (self, &self->block);
+
+        /* [re]write footer */
+        if (self->changed)
+            rc3 = KEncFileFooterWrite (self);
+    }
+    rc4 = KFileRelease (self->encrypted);
+    rc5 = KCipherRelease (self->ciphers.master);
+    rc6 = KCipherRelease (self->ciphers.block);
+
+    free (self);
+    
+    if (rc1)
+        return rc1;
+    if (rc2)
+        return rc2;
+    if (rc3)
+        return rc3;
+    if (rc4)
+        return rc4;
+    if (rc5)
+        return rc5;
+    return rc6;
+}
+
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ *
+ * We do not allow this for read, write or update as you can not memory map the 
+ * unencrypted file in a meaningful way.
+ */
+static
+struct KSysFile *CC KEncFileGetSysFile (const KEncFile *self, uint64_t *offset)
+{
+    assert (self);
+    assert (offset);
+
+    return NULL;
+}
+
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t CC KEncFileRandomAccess (const KEncFile *self)
+{
+    assert (self != NULL);
+    assert ((self->seekable == true) || (self->seekable == false));
+
+    /* we checked for random access in the contructor */
+    if (self->seekable)
+        return 0;
+
+    return RC (rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KEncFileSize (const KEncFile *self, uint64_t *size)
+{
+    if (!self->size_known)
+        return RC (rcKrypto, rcFile, rcAccessing, rcSize, rcUnsupported);
+
+    *size = self->dec_size;
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ *
+ * This is the size of the decrypted payload not of the encrypted file
+ */
+static
+rc_t KEncFileSetSizeBlockFull (KEncFile *self, uint64_t block_id)
+{
+    if ((self->block.id == block_id) && (self->block.u.valid != 0))
+    {
+        if (self->block.u.valid < sizeof self->block.data)
+        {
+            self->block.u.valid = sizeof self->block.data;
+            self->dirty = true;
+        }
+        else
+            assert (self->block.u.valid  == sizeof self->block.data);
+    }
+    else
+    {
+        KEncFileBlock block;
+        rc_t rc;
+
+        rc = KEncFileBlockRead (self, &block, block_id, false);
+        if (rc)
+            return rc;
+
+/*         if (self->block.u.valid  != sizeof self->block.data) */
+/*         { */
+/*             OUTMSG (("%s: %u %u\n", __func__,self->block.u.valid,sizeof self->block.data)); */
+/*             OUTMSG (("%s: %lu %lu\n", __func__,self->block.id,block_id)); */
+/*         } */
+
+        /* only change block if not "missing" */
+        if (BufferAllZero (&block, sizeof block) == false)
+        {
+            assert (block.id == block_id);
+
+            /* only change if not already full - shouldnt get here if not? */
+            if (block.u.valid < sizeof block.data)
+            {
+                self->changed = self->sought = true;
+                block.u.valid = sizeof block.data;
+
+                rc = KEncFileBlockFlush (self, &block);
+                if (rc)
+                    return rc;
+            }
+            else
+                assert (self->block.u.valid  == sizeof self->block.data);
+        }
+    }
+    return 0;
+}
+
+
+static
+rc_t KEncFileSetSizeBlockPartial (KEncFile *self, uint64_t block_id, uint32_t valid)
+{
+    if ((self->block.id == block_id) && (self->block.u.valid != 0))
+    {
+        if (self->block.u.valid != valid)
+        {
+            self->block.u.valid = valid;
+            self->dirty = true;
+        }
+    }
+    else
+    {
+        KEncFileBlock block;
+        rc_t rc;
+
+        rc = KEncFileBlockRead (self, &block, block_id, false);
+        if (rc)
+            return rc;
+
+        /* only change block if not "missing" */
+        if (BufferAllZero (&block, sizeof block) == false)
+        {
+            assert (block.id == block_id);
+
+            if (block.u.valid != valid)
+            {
+                self->changed = self->sought = true;
+                block.u.valid = valid;
+                
+                rc = KEncFileBlockFlush (self, &block);
+                if (rc)
+                    return rc;
+            }
+        }
+    }
+    return 0;
+}
+
+
+static
+rc_t KEncFileSetSizeInt (KEncFile *self, uint64_t dec_size)
+{
+    uint64_t trim_size = 0;
+    uint64_t enc_size;
+    bool do_size = true;
+
+    rc_t rc = 0;
+
+    /* should we not have been called? */
+    if ((dec_size == self->dec_size) && (self->enc_size != 0))
+        return 0;
+
+    /* if wiping out the whole file */
+    if (dec_size == 0)
+    {
+        trim_size = sizeof (KEncFileHeader);
+        enc_size = (sizeof (KEncFileHeader) + sizeof (KEncFileFooter));
+
+        /* if we did clear out the RAM structures to match */
+        memset (&self->block, 0, sizeof self->block);
+        memset (&self->foot, 0, sizeof self->foot);
+        self->dirty = false;
+        self->size_known = true;
+        self->bswap = false;
+        self->changed = true;
+        self->sought = false;
+        self->has_header = false;
+        self->version = eCurrentVersion;
+    }
+    else
+    {
+        KEncFileBlockId new_bid;    /* block id of new last block */
+        KEncFileBlockId new_fid;    /* block id of new footer / block count */
+        uint32_t        new_doff;   /* bytes into last partial block */
+
+        /*
+         * determine sizes of decrypted virtual file
+         * and encrypted 'real' file
+         */
+
+        /*
+          NB - the following code utilizes a function for converting
+          an OFFSET to a zero-based block-id. However, it passes in a size.
+          By examining new_doff, it detects the case where "dec_size" is an
+          exact multiple of plaintext block size, and takes the return to
+          be a "block-id" of the footer, and new_bid to be the last block.
+
+          in the case where "new_doff" is zero, "new_bid" will be the effective
+          id of the footer, and "new_bid" will need to be adjusted to the previous
+          full block.
+
+          in the case where "new_doff" is not zero, "new_bid" will be the
+          last data block id, and the footer will be one beyond.
+
+          although the code utilizes incorrect and misleading primitives,
+          it works.
+         */
+
+        new_fid = new_bid = PlaintextOffset_to_BlockId (dec_size, &new_doff);
+        if (new_doff == 0)
+            --new_bid; /* exactly fills a block */
+        else
+            ++new_fid;  /* leaves a partial block */
+    
+        enc_size = BlockId_to_CiphertextOffset ( new_fid ) + sizeof self->foot;
+
+        /* are we starting with an empty file? It's easy if we are */
+        if (self->dec_size == 0)
+        {
+            /* TBD - this looks incorrect... what about KEncFileHeader?
+               the code below would use BlockId_to_CiphertextOffset()
+             */
+            trim_size = sizeof (KEncFileHeader);
+
+            /* if we did clear out the RAM structures to match */
+            memset (&self->block, 0, sizeof self->block);
+            self->bswap = false;
+            self->changed = true;
+            self->version = eCurrentVersion;
+        }
+        else
+        {
+            KEncFileBlockId old_bid;    /* block id of old last block */
+            KEncFileBlockId old_fid;    /* block id of old footer / block count */
+            uint32_t        old_doff;   /* bytes into last partial block */
+
+            old_fid = old_bid = PlaintextOffset_to_BlockId (self->dec_size, &old_doff);
+            if (old_doff == 0)
+                --old_bid; /* exactly fills a block */
+            else
+                ++old_fid;  /* leaves a partial block */
+
+            /* are we only changing the last block? */
+            if (old_bid == new_bid)
+            {
+                assert ((self->dad.read_enabled == false) || (self->enc_size == enc_size));
+
+                if (new_doff == 0)
+                {
+                    /* change from partial to full last block */
+                    rc = KEncFileSetSizeBlockFull (self, new_bid);
+                }
+                else
+                {
+                    /* resize last block */
+                    rc = KEncFileSetSizeBlockPartial (self, new_bid, new_doff);
+                }
+
+                /* no need to resize underlying file */
+                do_size = false;
+            }
+            else
+            {
+
+                /* truncating the file? */
+                if (dec_size < self->dec_size)
+                {
+                    trim_size = BlockId_to_CiphertextOffset ( new_fid );
+
+                    /* do we throw away the block in the object? */
+                    if (self->block.id > new_bid)
+                    {
+                        self->dirty = false;
+                        memset (&self->block, 0, sizeof self->block);
+                    }
+
+                    /* we only change the new last block if its now partial */
+                    if ( new_doff != 0 )
+                        rc = KEncFileSetSizeBlockPartial (self, new_bid, new_doff);
+
+                }
+                /* expanding the file */
+                else
+                {
+                    assert (dec_size > self->dec_size);
+
+                    trim_size = BlockId_to_CiphertextOffset ( old_fid );
+
+                    /* make old last block a full block if it wasn't already */
+                    if ( old_doff != 0 )
+                        rc = KEncFileSetSizeBlockFull (self, old_bid);
+                }
+            }
+        }
+    }
+    if (rc == 0)
+    {
+        if (do_size)
+        {
+            /* first trim for some reason... sparse files? */
+            rc = KFileSetSize (self->encrypted, trim_size);
+            if (rc)
+                LOGERR (klogErr, rc, "failure to trim size of encrypted file");
+            else
+            {
+                /* now extend to encrypted size */
+                rc = KFileSetSize (self->encrypted, enc_size);
+                if (rc)
+                    LOGERR (klogErr, rc, "failure to file size of encrypted file");
+            }
+        }
+        if (rc == 0)
+        {
+            self->enc_size = enc_size;
+            self->dec_size = dec_size;
+        }
+    }
+    return rc;
+}
+
+
+static
+rc_t CC KEncFileSetSize (KEncFile *self, uint64_t dec_size)
+{
+    assert (self);
+    assert (self->encrypted);
+
+    if (self->dad.write_enabled == false)
+        return RC (rcKrypto, rcFile, rcResizing, rcFile, rcNoPerm);
+
+    if ((self->seekable == false) || (self->size_known == false))
+        return RC(rcKrypto, rcFile, rcAccessing, rcFunction, rcUnsupported);
+
+    /* silently ignore changes in size that don't change the size */
+    if (dec_size == self->dec_size)
+        return 0;
+
+    else
+        return KEncFileSetSizeInt (self, dec_size);
+}
+
+
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t CC KEncFileRead (const KEncFile *cself,
+                      uint64_t pos,
+                      void *buffer,
+                      size_t bsize,
+                      size_t *num_read)
+{
+    KEncFile * self = (KEncFile *)cself; /* mutable values */
+    uint64_t max_bid;
+    uint64_t block_id;
+    uint32_t offset;
+    rc_t rc = 0;
+
+    assert (self); /* checked in file.c KFileRead() */
+    /* pos can be 'anything' */
+    assert (buffer); /* checked in file.c KFileRead() */
+    assert (bsize); /* checked in file.c KFileRead() */
+    assert (num_read); /* checked in file.c KFileRead() */
+
+    assert (self->dad.read_enabled);
+    assert (self->encrypted);
+
+    /* do we have a decrypted_size? */
+
+    block_id = PlaintextOffset_to_BlockId (pos, &offset);
+
+    switch ( ( uint32_t ) self->size_known)
+    {
+    case 0:
+
+        max_bid = EncryptedPos_to_BlockId (self->enc_size, NULL, NULL);
+
+        /* if past end of file as we know it so far quick out */
+        if (max_bid <= block_id)
+            return 0;
+        break;
+
+    case 1:
+        /* if past end of file quick out */
+        if (pos > self->dec_size)
+            return 0;
+        break;
+
+    default:
+        assert (0 && self->size_known);
+        break;
+    }
+
+    /*
+     * are we on the wrong block?
+     * Or are do we need to read the first block?
+     */
+    if ((block_id != self->block.id) || (self->block.u.valid == 0))
+    {
+        if ((!self->seekable) && (self->block.id + 1 != block_id))
+        {
+            rc = RC (rcFS, rcFile, rcReading, rcOffset, rcIncorrect);
+            PLOGERR (klogErr, (klogErr, rc, "attempt to seek in encryption write at"
+                               " '$(O)' seek to '$(P)'", "O=%lu,P=%lu",
+                               BlockId_to_CiphertextOffset(self->block.id), pos));
+        }
+        else
+        {
+            /* flush any dirty block */
+            if (self->dirty)
+            {
+                assert (self->dad.write_enabled);
+                rc = KEncFileBlockFlush (self, &self->block);
+            }
+
+            /* now try to read in a new block */
+            if (rc == 0)
+                rc = KEncFileBlockRead (self, &self->block, block_id, false);
+
+            if (rc == 0)
+            {
+                uint64_t read_max;
+
+                read_max = BlockId_to_PlaintextOffset ( block_id ) + self -> block . u . valid;
+                if (self->dec_size < read_max)
+                    self->dec_size = read_max;
+            }
+        }
+    }
+
+    /*
+     * if we are trying to read past the end of the file 
+     * return 0 with nothing read
+     */
+    if ((rc == 0) &&
+        (block_id == self->block.id) &&
+        (offset < self->block.u.valid))
+    {
+        size_t to_copy;
+
+        to_copy = self->block.u.valid - offset;
+        if (to_copy > bsize)
+            to_copy = bsize;
+
+        memmove (buffer, self->block.data + offset, to_copy);
+        *num_read = to_copy;
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+static
+rc_t CC KEncFileWrite (KEncFile *self, uint64_t pos,
+                       const void *buffer, size_t bsize,
+                       size_t *pnum_writ)
+{
+    rc_t rc = 0;
+
+    assert (self);
+    assert (buffer);
+    assert (bsize > 0);
+    assert (pnum_writ);
+
+    assert (self->dad.write_enabled);
+    assert (self->encrypted);
+
+/*     KOutMsg ("+++++\n%s: pos %lu\n",__func__,pos); */
+
+    if (self->dec_size != pos)
+    {
+        /* write only does not allow seeks */
+        if ((!self->dad.read_enabled) && (!self->swarm))
+        {
+            rc = RC (rcFS, rcFile, rcWriting, rcOffset, rcIncorrect);
+            PLOGERR (klogErr, (klogErr, rc, "attempt to seek in encryption write at"
+                               " '$(O)' seek to '$(P)'", "O=%lu,P=%lu",
+                               BlockId_to_CiphertextOffset(self->block.id), pos));
+        }
+        else
+            self->sought = true;
+    }
+    if (rc == 0)
+    {
+        uint64_t block_id;
+        uint32_t offset;
+        uint64_t block_max;
+        uint64_t new_size;
+
+        rc = 0;
+        /* Block Id for this write */
+        block_id = PlaintextOffset_to_BlockId (pos, &offset);
+
+        block_max = BlockId_to_PlaintextOffset ( block_id + 1 );
+
+        new_size = pos + bsize;
+        if (new_size > block_max)
+            bsize = block_max - new_size;
+
+
+        /* is the new position beyond the current file length? */
+        if ((new_size > self->dec_size) && (self->dad.read_enabled) && (!self->swarm))
+        {
+            rc = KEncFileSetSizeInt (self, new_size);
+            if (rc)
+                return rc;
+        }
+
+        /* are we going to a new block? */
+        if ((block_id != self->block.id) || (self->block.u.valid == 0))
+        {
+            /* do we have sometihng to flush first? */
+            if (self->dirty)
+            {
+                assert (self->dad.write_enabled);
+                rc = KEncFileBlockFlush (self, &self->block);
+            }
+
+            if (rc == 0)
+            {
+                /* if we are going to over write the whole block */
+                if ((!self->dad.read_enabled) ||
+                    ((offset == 0) && (bsize >= sizeof (self->block.data))))
+                {
+                    memset (&self->block, 0, sizeof self->block);
+                    self->block.id = block_id;
+                }
+                /* else try to fetch an existing block */
+                else
+                    rc = KEncFileBlockRead (self, &self->block, block_id, false);
+            }
+        }
+
+        if (rc == 0)
+        {
+            /* we are at the right block and ready to write */
+            uint32_t new_valid;
+            size_t to_copy;
+
+            /*
+             * force block id to be right even if fetch was beyond end of 
+             * existing file
+             */
+            self->block.id = block_id;
+
+/*             to_copy = sizeof self->block.data - self->block.u.valid; */
+            to_copy = sizeof self->block.data - offset;
+
+            if (to_copy > bsize)
+                to_copy = bsize;
+
+            memmove (self->block.data + offset, buffer, to_copy);
+            self->dirty = true;
+            *pnum_writ = to_copy;
+
+            new_valid = (uint32_t) ( offset + to_copy );
+            if (new_valid > self->block.u.valid)
+            {
+                uint64_t new_size;
+
+                self->block.u.valid = new_valid;
+
+                new_size = pos + to_copy;
+                if (new_size > self->dec_size)
+                    self->dec_size = new_size;
+            }
+
+            if (self->swarm)
+                rc = KEncFileBlockFlush (self, &self->block);
+
+
+        }
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ *
+ * Just return what the backing file says...
+ */
+static
+uint32_t CC KEncFileType (const KEncFile *self)
+{
+    assert (self != NULL);
+    assert (self->encrypted != NULL);
+
+    return KFileType (self->encrypted);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KEncFileMake
+ *  create a new file object
+ */
+
+/* ----------
+ * KeysInit
+ */
+static
+rc_t KEncFileCiphersInit (KEncFile * self, const KKey * key, bool read, bool write)
+{
+    KCipherManager * mgr;
+    size_t z;
+    rc_t rc;
+
+    switch ( key->type)
+    {
+    default:
+        return RC (rcKrypto, rcEncryptionKey, rcConstructing, rcParam, rcInvalid);
+
+    case kkeyNone:
+        return RC (rcKrypto, rcEncryptionKey, rcConstructing, rcParam, rcIncorrect);
+
+    case kkeyAES128:
+        z = 128/8; break;
+
+    case kkeyAES192:
+        z = 192/8; break;
+
+    case kkeyAES256:
+        z = 256/8; break;
+    }
+    rc = KCipherManagerMake (&mgr);
+    if (rc == 0)
+    {
+        rc = KCipherManagerMakeCipher (mgr, &self->ciphers.master, kcipher_AES);
+        if (rc == 0)
+        {
+            rc = KCipherManagerMakeCipher (mgr, &self->ciphers.block, kcipher_AES);
+            if (rc == 0)
+            {
+                rc = KCipherSetDecryptKey (self->ciphers.master, key->text, z);
+                if (rc == 0)
+                {
+                    rc = KCipherSetEncryptKey (self->ciphers.master, key->text, z);
+                    if (rc == 0)
+                        goto keep_ciphers;
+                }
+                KCipherRelease (self->ciphers.block);
+                self->ciphers.block = NULL;
+            }
+            KCipherRelease (self->ciphers.master);
+            self->ciphers.master = NULL;
+        }
+    keep_ciphers:
+        KCipherManagerRelease (mgr);
+    }
+    return rc;
+}
+
+
+
+static const KFile_vt_v1 vtKEncFile =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KEncFileDestroy,
+    KEncFileGetSysFile,
+    KEncFileRandomAccess,
+    KEncFileSize,
+    KEncFileSetSize,
+    KEncFileRead,
+    KEncFileWrite,
+    
+    /* 1.1 */
+    KEncFileType
+};
+
+
+static
+rc_t  KEncFileMakeIntValidSize (uint64_t enc_size, bool w)
+{
+
+    if (enc_size == 0)
+    {
+        if (w)
+            return 0;
+    }
+    else
+    {
+        uint64_t min_size = sizeof (KEncFileHeader) + sizeof (KEncFileFooter);
+        uint64_t block_count;
+
+        if (enc_size >= min_size)
+        {
+            block_count = EncryptedPos_to_BlockId (enc_size, NULL, NULL);
+
+            if (enc_size - BlockId_to_CiphertextOffset (block_count) == sizeof (KEncFileFooter))
+                return 0;
+        }
+    }
+    return RC (rcKrypto, rcFile, rcConstructing, rcSize, rcIncorrect);
+}
+
+
+/* ----------
+ * MakeInt
+ *    common make for all encryptor/decryptors
+ */
+static
+rc_t KEncFileMakeInt (KEncFile ** pself, KFile * encrypted,
+                      bool r, bool w, bool v, bool s)
+{
+    uint64_t enc_size;
+    rc_t rc = 0, orc;
+    bool seekable;
+    bool size_known;
+
+    assert (pself);
+    assert (encrypted);
+    assert (((r == true) || (r == false)) &&
+            ((w == true) || (w == false)) &&
+            ((v == true) || (v == false)));
+
+    /* must be able to do at elast one of read and write */
+    assert (r || w);
+
+    /* expecting to validate read only right now */
+/*     assert ((v && r && !w) || (!v)); */
+
+    if (w && ! encrypted->write_enabled)
+    {
+        rc = RC (rcKrypto, rcFile, rcConstructing, rcFile, rcReadonly);
+        LOGERR (klogErr, rc, "Can not make a encryptor for a unwritable file");
+    }
+    if (r && ! encrypted->read_enabled)
+    {
+        orc = RC (rcKrypto, rcFile, rcConstructing, rcFile, rcWriteonly);
+        LOGERR (klogErr, orc, "Can not make a decryptor for an unreadable file");
+        if (rc == 0)
+            rc = orc;
+    }
+    if (rc)
+        return rc;
+
+    /* determine whether the original file can tell us the size */
+    rc = KFileSize (encrypted, &enc_size);
+    if (rc == 0)
+        size_known = true;
+
+    else if (GetRCState(rc) == rcUnsupported)
+        size_known = false;
+    
+    else
+        return rc;
+
+    if (!v && size_known)
+    {
+        rc = KEncFileMakeIntValidSize (enc_size, w);
+        if (rc)
+            return rc;
+    }
+
+    /* determine whether the original file allows seeks */
+    rc = KFileRandomAccess (encrypted);
+    if (rc == 0)
+        seekable = true;
+
+    else if (GetRCState(rc) == rcUnsupported)
+        seekable = false;
+
+    else
+    {
+        LOGERR (klogErr, rc, "error checking random access building "
+                "encrypted file");
+        return rc;
+    }
+
+    /* We are currently only supporting update on seekable and size_known original files */
+    if (r && w && ((!seekable) || (!size_known)))
+    {
+        rc = RC (rcKrypto, rcFile, rcConstructing, rcFile, rcIncorrect);
+        LOGERR (klogErr, rc, "encryptor/decryptor requires seek and size ability");
+        return rc;
+    }
+
+    rc = KFileAddRef (encrypted);
+    if (rc)
+    {
+        LOGERR (klogErr, rc, "Could not add reference to encrypted file");
+        return rc;
+    }
+    else
+    {
+        KEncFile * self;
+
+        /* allocate and zero out an object since we want much of it to be zeroed */
+        self = calloc (1, sizeof *self);
+        if (self == NULL)
+        {
+            rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+            LOGERR (klogSys, rc,
+                    "out of memory creating encryptor and/or decryptor");
+        }
+        else
+        {
+            /* all KFiles get this initialization */
+            rc = KFileInit (&self->dad, (const KFile_vt*)&vtKEncFile, "KEncFile", "no-name", r, w);
+            if (rc)
+                LOGERR (klogInt, rc, "error with init for encrypted file");
+
+            else
+            {
+                self->encrypted = encrypted;
+                self->swarm = s;
+
+                /* write only or empty updatable */
+                if ((!r) || (w && size_known && (enc_size == 0)))
+                {
+                    /* dummy size to make the SetSizeInt work */
+                    self->enc_size = enc_size;
+                    rc = KEncFileSetSizeInt (self, 0);
+                    self->seekable = r && seekable;
+                }
+                else
+                {
+                    self->enc_size = enc_size;
+                    self->seekable = seekable;
+                    self->size_known = size_known;
+                    rc = KEncFileHeaderRead (self);
+                }
+                if (rc == 0)
+                {
+                    *pself = self;
+                    return 0;
+                }
+            }
+            free (self);
+        }
+        KFileRelease (encrypted);
+    }
+    return rc;
+}
+
+
+static
+rc_t KEncFileMakeSize (KEncFile *self)
+{
+    KEncFileBlockId fid;
+    rc_t rc;
+
+    assert (self->seekable);
+
+    /*
+     * turn the encrypted size into a block/offset
+     * the offset should be 0 for a missing footer
+     * or the size of a footer
+     */
+    fid = EncryptedPos_to_BlockId (self->enc_size, NULL, NULL);
+
+    assert (BlockId_to_CiphertextOffset(fid) + sizeof (self->foot) == self->enc_size);
+
+    if (fid == 0)
+        self->dec_size = 0;
+
+    else
+    {
+        KEncFileBlockId bid = fid - 1;
+        KEncFileBlock b;
+
+        /*
+         * not calling this a seek as its not reading a data block
+         * out of order that will be modified
+         */
+        rc = KEncFileBlockRead (self, &b, bid, false);
+        if (rc)
+            return rc;
+        else
+        {
+            if (BufferAllZero(&b, sizeof b) == true)
+                self->dec_size = BlockId_to_PlaintextOffset (bid) + 
+                    sizeof self->block.data;
+
+            else
+                self->dec_size = BlockId_to_PlaintextOffset (bid) + b.u.valid;
+        }
+    }
+    self->size_known = true;
+    return 0;
+}
+
+
+/* ----------
+ * MakeCmn
+ * common parameter validation for all encryptor/decryptors
+ */
+static
+rc_t KEncFileMakeCmn (KEncFile ** pself, KFile * encrypted, const KKey * key,
+                      bool r, bool w, bool s)
+{
+    rc_t rc = 0, orc;
+
+    assert (((r == true)||(r == false))&&((w == true)||(w == false)));
+    assert (w || r);
+
+    if (pself == NULL)
+    {
+        rc = RC (rcKrypto, rcFile, rcConstructing, rcSelf, rcNull);
+        LOGERR (klogErr, rc,
+                "pointer to self NULL when creating "
+                "an encryptor/decryptor");
+    }
+    else
+        *pself = NULL;
+
+    if (encrypted == NULL)
+    {
+        orc = RC (rcFS, rcFile, rcConstructing, rcParam, rcNull);
+        LOGERR (klogErr, orc, 
+                "encrypted file not readable when creating "
+                "an encryptor/decryptor");
+        if (rc == 0)
+            rc = orc;
+    }
+
+    if (key == NULL)
+    {
+        orc = RC (rcFS, rcFile, rcConstructing, rcParam, rcNull);
+        LOGERR (klogErr, orc, 
+                "key not supplied when creating an encryptor/decryptor");
+        if (rc == 0)
+            rc = orc;
+    }
+
+    CRC32Init();    /* likely to be called way too often */
+
+    switch (key->type)
+    {
+    default:
+        orc = RC (rcFS, rcFile, rcConstructing, rcParam, rcInvalid);
+        PLOGERR (klogErr,
+                 (klogErr, orc, "invalid key type '$(T)' should be "
+                  "kkeyAES128(1), kkeyAES192(2) or kkeyAES256(3)",
+                  "T=%u", key->type));
+        if (rc == 0)
+            rc = orc;
+        break;
+
+    case kkeyAES128:
+    case kkeyAES192:
+    case kkeyAES256:
+        break;
+    }
+    if (rc == 0)
+    {
+        KEncFile * self;
+
+        assert ((r == true) || (r == false));
+        assert ((w == true) || (w == false));
+
+        rc = KEncFileMakeInt (&self, encrypted, r, w, false, s);
+        if (rc == 0)
+        {
+            rc = KEncFileCiphersInit (self, key, r, w);
+            if (rc == 0)
+            {
+                
+                if (self->seekable && self->size_known)
+                    rc = KEncFileMakeSize (self);
+
+                if (rc == 0)
+                {
+                    *pself = self;
+                    return 0;
+                }
+            }
+            KFileRelease (&self->dad);
+        }
+    }
+    return rc;
+}
+
+
+/* ----------
+ * Read mode is fully seekable if the underlying KFile is seekable some
+ * integrity checking will not be performed in allowing this seeking.
+ */
+LIB_EXPORT rc_t CC KEncFileMakeRead_v2 (const KFile ** pself, 
+                                        const KFile * encrypted,
+                                        const KKey * key)
+{
+    KEncFile * self;
+    rc_t rc;
+
+    /*
+     * casting encrypted dowsn't actually make it writable
+     * it just lets us use a common constructor
+     */
+    rc = KEncFileMakeCmn (&self, (KFile *)encrypted, key, true, false, false);
+    if (rc)
+        LOGERR (klogErr, rc, "error constructing decryptor");
+
+    else
+        *pself = &self->dad;
+
+    return rc;
+}
+
+
+/* ----------
+ * Write mode encrypted file can only be written straight through form the
+ * first byte to the last.
+ *
+ * Existing content is lost.
+ */
+LIB_EXPORT rc_t CC KEncFileMakeWrite_v2 (KFile ** pself, 
+                                         KFile * encrypted,
+                                         const KKey * key)
+{
+    KEncFile * self;
+    rc_t rc;
+
+    rc = KEncFileMakeCmn (&self, encrypted, key, false, true, false);
+    if (rc)
+        LOGERR (klogErr, rc, "error constructing encryptor");
+
+    else
+        *pself = &self->dad;
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KEncFileMakeUpdate_v2 (KFile ** pself, 
+                                          KFile * encrypted,
+                                          const KKey * key)
+{
+    KEncFile * self;
+    rc_t rc;
+
+/*     static int count = 0; */
+
+/*     KOutMsg ("%s: %d\n",__func__,++count); */
+
+    rc = KEncFileMakeCmn (&self, (KFile *)encrypted, key, true, true, false);
+    if (rc)
+        LOGERR (klogErr, rc, "error constructing encryptor/decryptor");
+
+    else
+        *pself = &self->dad;
+
+    return rc;
+}
+
+
+/* ----------
+ * Swarm mode encrypted file can be writtenout of order but the footer is not
+ * handled automatically
+ */
+LIB_EXPORT rc_t CC KEncFileMakeBlock_v2 (KFile ** pself, 
+                                         KFile * encrypted,
+                                         const KKey * key)
+{
+    KEncFile * self;
+    rc_t rc;
+
+/*     static int count = 0; */
+
+/*     KOutMsg ("%s: %d\n",__func__,++count); */
+
+    rc = KEncFileMakeCmn (&self, (KFile *)encrypted, key, false, true, true);
+    if (rc)
+        LOGERR (klogErr, rc, "error constructing encryptor/decryptor");
+
+    else
+        *pself = &self->dad;
+
+    return rc;
+}
+
+
+/* ----------
+ * Validate mode is useful only for the KFileEncValidate function
+ */
+static
+rc_t KEncFileMakeValidate (KEncFile ** pself, const KFile * encrypted)
+{
+    KEncFile * self;
+    rc_t rc;
+
+    assert (pself);
+    assert (encrypted);
+
+    rc = KEncFileMakeInt (&self, (KFile*)encrypted, true, false, true, false);
+    if (rc)
+        LOGERR (klogErr, rc, "error making KEncFile");
+    else
+    {
+        rc = KEncFileHeaderRead (self);
+        if (rc)
+            LOGERR (klogErr, rc, "error reading encrypted file header");
+        else
+        {
+            *pself = self;
+            return 0;
+        }
+    }
+    *pself = NULL;
+    return rc;
+}
+
+
+/* ======================================================================
+ * Interface extensions
+ */
+
+
+/* ----------
+ * Validate mode can not be read or written.
+ * Upon open the whole file is read from begining to end and all CRC
+ * and other integrity checks are performed immedaitely
+ *
+ * This will fail if the file being tested is not "at position 0" and can not
+ * be sought back to 0.
+ */
+
+
+
+LIB_EXPORT rc_t CC KEncFileValidate_v2 (const KFile * encrypted)
+{
+    KEncFile * file;
+    rc_t rc = 0;
+
+    /* fail if a NULL parameter: can't validate all addresses */
+    if (encrypted == NULL)
+    {
+        rc = RC (rcKrypto, rcFile, rcValidating, rcParam, rcNull);
+        LOGERR (klogErr, rc, "encrypted file was null when trying to validate");
+        return rc;
+    }
+
+    /* file header is validated within the call to Make Validate */
+    rc = KEncFileMakeValidate (&file, encrypted);
+    if (rc)
+        LOGERR (klogErr, rc,
+                "unable to validate encrypted file due to "
+                "inability to open as encrypted file");
+    else
+    {
+        uint64_t pos;             /* position within the encrypted file */
+        uint64_t block_count = 0; /* how many blocks have we read */
+
+        /* loop through all data blocks */
+        pos = sizeof (KEncFileHeader);
+        for (block_count = 0; ; ++block_count)
+        {
+            rc_t vrc;
+            STSMSG (2, ("reading block '%u' at '%lu'", block_count,
+                        BlockId_to_CiphertextOffset(block_count)));
+           
+            vrc = KEncFileBlockRead (file, NULL, block_count, true);
+            if (vrc != 0)
+            {
+                if ( rc == 0 )
+                    rc = vrc;
+                if ( GetRCContext( vrc ) != rcValidating )
+                {
+                    STSMSG (2, ("read error at block '%u'", block_count));
+                    break;
+                }
+            }
+            if (file->eof)
+            {
+                STSMSG (2, ("block '%u' was end", block_count));
+                break;
+            }
+            pos += sizeof (KEncFileData);
+        }   
+        KFileRelease (&file->dad);
+    }
+    return (rc);
+}
+
+
+LIB_EXPORT rc_t CC KEncFileHeaderWrite_v2 (KFile * dad)
+{
+    rc_t rc;
+
+    if (dad->vt != (const KFile_vt*)&vtKEncFile)
+    {
+        rc = RC (rcKrypto, rcFile, rcWriting, rcType, rcIncorrect);
+        LOGERR (klogErr, rc, "file not an encryptor requested writing header");
+    }
+    else
+    {
+        KEncFile * self;
+        self = (KEncFile*)dad;
+
+        rc = KEncFileHeaderWrite (self);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KEncFileFooterWrite_v2 (KFile * dad)
+{
+    rc_t rc;
+
+    if (dad->vt != (const KFile_vt*)&vtKEncFile)
+    {
+        rc = RC (rcKrypto, rcFile, rcWriting, rcType, rcIncorrect);
+        LOGERR (klogErr, rc, "file not an encryptor requested writing footer");
+    }
+    else
+    {
+        KEncFile * self;
+        self = (KEncFile*)dad;
+
+        rc = KEncFileFooterWrite (self);
+    }
+    return rc;
+}
+
+/* ----------
+ * Identify whether a file is a KEncFile type encrypted file by the header.
+ * read the header into a buffer and pass it into this function.  
+ * The buffer_size needs to be at least 8 but more bytes lead to a better
+ * check up to the size of the header of a KEncFile type encrypted file.
+ * As the header may change in the future (in a backwards compatible way)
+ * that size might change from the current 16.
+ *
+ * Possible returns:
+ * 0:
+ *      the file is an identified KEncFile type file.  False positives are
+ *      possible if a file happens to match at 8 or more bytes
+ *
+ * RC (rcFS, rcFile, rcIdentifying, rcFile, rcWrongType)
+ *      the file is definitely not a KEncFile type encrypted file.
+ *     
+ * RC (rcFS, rcFile, rcIdentifying, rcParam, rcNull)
+ *      bad parameters in the call
+ *
+ * RC (rcFS, rcFile, rcIdentifying, rcBuffer, rcInsufficient)
+ *      not a large enough buffer to make an identification
+ */
+LIB_EXPORT rc_t CC KFileIsEnc_v2 (const char * buffer, size_t buffer_size)
+{
+    KEncFileHeader header;
+    size_t count;
+    bool byte_swapped;
+
+    if ((buffer == NULL) || (buffer_size == 0))
+        return RC  (rcFS, rcFile, rcIdentifying, rcParam, rcNull); 
+
+    /* must have the signature to consider it an Encrypted file */
+    if (buffer_size < sizeof (header.file_sig))
+        return RC (rcFS, rcFile, rcIdentifying, rcBuffer, rcInsufficient); 
+
+    if ((memcmp (buffer, &const_header.file_sig, sizeof const_header.file_sig ) != 0) &&
+        (memcmp (buffer, &const_header_sra.file_sig, sizeof const_header_sra.file_sig ) != 0))
+        return SILENT_RC (rcFS, rcFile, rcIdentifying, rcFile, rcWrongType); 
+
+    /* can we also check the byte order? It's okay if we can't */
+    if (buffer_size < sizeof header.file_sig + sizeof header.byte_order)
+        return 0; 
+    
+    count = buffer_size > sizeof header ? sizeof header : buffer_size;
+
+    memmove (&header, buffer, count);
+
+    if (header.byte_order == const_header.byte_order)
+        byte_swapped = false;
+
+    else if (header.byte_order == const_bswap_header.byte_order)
+        byte_swapped = true;
+
+    /* but if it's not we fail with a different error */
+    else
+        return RC (rcFS, rcFile, rcIdentifying, rcFile, rcOutoforder); 
+
+    /* can we check the version as well? It's okay if we can't */
+    if (buffer_size < sizeof (header))
+        return 0; 
+
+    assert (sizeof (header.version) == 4);
+    if (byte_swapped)
+        header.version = bswap_32(header.version);
+
+    /* and it's a different error if the version is not within our range */
+    if ((header.version <= 0) || (header.version > eCurrentVersion))
+        return RC (rcKrypto, rcFile, rcClassifying, rcFile, rcBadVersion);
+
+    return 0;
+}
+
+
+LIB_EXPORT rc_t CC KFileIsSraEnc (const char * buffer, size_t buffer_size)
+{
+    KEncFileHeader header;
+    size_t count;
+    bool byte_swapped;
+
+    if ((buffer == NULL) || (buffer_size == 0))
+        return RC  (rcFS, rcFile, rcIdentifying, rcParam, rcNull); 
+
+
+    if (buffer_size < sizeof (header.file_sig))
+        return RC (rcFS, rcFile, rcIdentifying, rcBuffer, rcInsufficient); 
+
+    if (memcmp (buffer, &const_header_sra.file_sig, sizeof const_header.file_sig ) != 0)
+        return RC (rcFS, rcFile, rcIdentifying, rcFile, rcWrongType); 
+
+    if (buffer_size < sizeof header.file_sig + sizeof header.byte_order)
+        return 0; 
+    
+    count = buffer_size > sizeof header ? sizeof header : buffer_size;
+
+    memmove (&header, buffer, count);
+
+    if (header.byte_order == const_header.byte_order)
+        byte_swapped = false;
+
+    else if (header.byte_order == const_bswap_header.byte_order)
+        byte_swapped = true;
+
+    else
+        return RC (rcFS, rcFile, rcIdentifying, rcFile, rcOutoforder); 
+
+    if (buffer_size < sizeof (header))
+        return 0; 
+
+    assert (sizeof (header.version) == 4);
+    if (byte_swapped)
+        header.version = bswap_32(header.version);
+
+    if ((header.version <= 0) || (header.version > eCurrentVersion))
+        return RC (rcKrypto, rcFile, rcClassifying, rcFile, rcBadVersion);
+
+    return 0;
+}
+
+/* end of file encfile.c */
+
+
+
diff --git a/libs/krypto/key.c b/libs/krypto/key.c
new file mode 100644
index 0000000..63af499
--- /dev/null
+++ b/libs/krypto/key.c
@@ -0,0 +1,126 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <krypto/extern.h>
+#include <krypto/key.h>
+#include <kapp/args.h>
+#include <klib/checksum.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <string.h>
+
+KRYPTO_EXTERN_DATA KKey KKeyEncrypt;
+KRYPTO_EXTERN_DATA KKey KKeyDecrypt;
+KRYPTO_EXTERN_DATA char WGAEncryptPassword[WGA_MAX_PASSWORD];
+KRYPTO_EXTERN_DATA char WGADecryptPassword[WGA_MAX_PASSWORD];
+
+
+static rc_t KKeyInitInt (KKey * self, KKeyType key_type, 
+                         const void * password, size_t password_size)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcEncryptionKey, rcConstructing, rcSelf, rcNull);
+
+    if (key_type >= kkeyTypeCount)
+        return RC (rcKrypto, rcEncryptionKey, rcConstructing, rcParam, rcInvalid);
+
+    if (key_type == kkeyNone)
+        return RC (rcKrypto, rcEncryptionKey, rcConstructing, rcParam, rcIncorrect);
+
+    if (password == NULL)
+        return RC (rcKrypto, rcEncryptionKey, rcConstructing, rcParam, rcNull);
+
+    if (password_size == 0)
+        return RC (rcKrypto, rcEncryptionKey, rcConstructing, rcParam, rcTooShort);
+
+    {
+        SHA256State state;
+        size_t z;
+        uint8_t digest [64];
+
+
+        SHA256StateInit (&state);
+        SHA256StateAppend (&state, password, password_size);
+        SHA256StateFinish (&state, digest);
+        
+        switch (self->type = key_type)
+        {
+        default:
+            z = 0;
+            break;
+
+        case kkeyAES128:
+            z = 128/8;
+            break;
+
+        case kkeyAES192:
+            z = 192/8;
+            break;
+
+        case kkeyAES256:
+            z = 256/8;
+            break;
+        }
+        memmove (self->text, digest, z);
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KKeyInitRead (KKey * self, KKeyType key_type, 
+                                 const void * password, size_t password_size)
+{
+    return KKeyInitInt (self, key_type, password, password_size);
+}
+
+LIB_EXPORT rc_t CC KKeyInitUpdate (KKey * self, KKeyType key_type, 
+                                   const void * password, size_t password_size)
+{
+    if (password_size < kkeyMinimumSize)
+    {
+        rc_t rc = RC (rcKrypto, rcEncryptionKey, rcConstructing, rcParam, 
+                      rcTooShort);
+#if FAIL_SHORT_PASSWORD
+        return rc;
+#else
+        PLOGERR (klogWarn, (klogWarn, rc,
+                            "Password is shorter than recommended '$(P)' is less than '$(Q)'"
+                            , "P=%zu,Q=%u"
+                            , password_size
+                            , ( uint32_t ) kkeyMinimumSize
+                     ));
+#endif
+    }
+    return KKeyInitInt (self, key_type, password, password_size);
+}
+    
+
+
+LIB_EXPORT rc_t CC KKeyInitHex()
+{
+    return 0;
+}
+
+/* end of file encfile.c */
+
diff --git a/libs/krypto/manager.c b/libs/krypto/manager.c
new file mode 100644
index 0000000..8b8c766
--- /dev/null
+++ b/libs/krypto/manager.c
@@ -0,0 +1,11 @@
+#error "obsolete do not use"
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/krypto/ncbi-priv.h b/libs/krypto/ncbi-priv.h
new file mode 100644
index 0000000..d5f692a
--- /dev/null
+++ b/libs/krypto/ncbi-priv.h
@@ -0,0 +1,122 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#ifndef _h_krypto_ncbi_priv_
+#define _h_krypto_ncbi_priv_
+
+#include <klib/defs.h>
+
+#ifdef _GNUC_
+#include <v128.h>
+#endif
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#if defined (USEVEC)
+#if defined (USEAESNI)
+
+# if ! defined (USEVECREG)
+/*
+ * AES_NI && ! VECREG
+ * Illegal
+ */
+#  error "Bad combination of defines"
+
+# else
+
+/*
+ * AESNI && VECREG
+ * use AES-NI, and SSSE3 and lower
+ */
+
+# define USE_AES_NI             1
+# define USE_VEC_REG            1
+# define USE_VEC                1
+# define CMEMBER(name)          KCipherVecAesNi##name
+# define CIPHER_IMPL            KCipherVecAesNi
+# define AESBCMEMBER(name)      KAESBlockCipherVecAesNi##name
+# define AESBCIPHER_IMPL        KAESBlockCipherVecAesNi
+# define NULLBCMEMBER(name)     KNullBlockCipherVecAesNi##name
+# define NULLBCIPHER_IMPL       KNullBlockCipherVecAesNi
+# define BCIPHER_VALUE          CipherVec
+
+# endif
+#elif defined (USEVECREG)
+
+# define USE_AES_NI             0
+# define USE_VEC_REG            1
+# define USE_VEC                1
+# define CMEMBER(name)          KCipherVecReg##name
+# define CIPHER_IMPL            KCipherVecReg
+# define AESBCMEMBER(name)      KAESBlockCipherVecReg##name
+# define AESBCIPHER_IMPL        KAESBlockCipherVecReg
+# define NULLBCMEMBER(name)     KNullBlockCipherVecReg##name
+# define NULLBCIPHER_IMPL       KNullBlockCipherVecReg
+# define BCIPHER_VALUE          CipherVec
+
+#else
+
+# define USE_AES_NI             0
+# define USE_VEC_REG            0
+# define USE_VEC                1
+# define CMEMBER(name)          KCipherVec##name
+# define CIPHER_IMPL            KCipherVec
+# define AESBCMEMBER(name)      KAESBlockCipherVec##name
+# define AESBCIPHER_IMPL        KAESBlockCipherVec
+# define NULLBCMEMBER(name)     KNullBlockCipherVec##name
+# define NULLBCIPHER_IMPL       KNullBlockCipherVec
+# define BCIPHER_VALUE          CipherVec
+
+#endif
+
+#else /* ! defined (USEVEC) */
+
+
+# define USE_AES_NI             0
+# define USE_VEC_REG            0
+# define USE_VEC                0
+# define MEMBER(name)           KCipherByte##name
+# define CMEMBER(name)          KCipherByte##name
+# define CIPHER_IMPL            KCipherByte
+# define AESBCMEMBER(name)      KAESBlockCipherByte##name
+# define AESBCIPHER_IMPL        KAESBlockCipherByte
+# define NULLBCMEMBER(name)     KNullBlockCipherByte##name
+# define NULLBCIPHER_IMPL       KNullBlockCipherByte
+# define BCIPHER_VALUE          CipherBlock
+
+#endif /* defined (USEVEC) */
+
+#define CLASS_STRING(name)  #name
+
+
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif /* #ifndef _h_krypto_ncbi_priv_ */
+
+
diff --git a/libs/krypto/no-null-ncbi.c b/libs/krypto/no-null-ncbi.c
new file mode 100644
index 0000000..7477512
--- /dev/null
+++ b/libs/krypto/no-null-ncbi.c
@@ -0,0 +1,59 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <krypto/extern.h>
+
+#include "ncbi-priv.h"
+#include "cipher-priv.h"
+/* #include "blockcipher-priv.h" */
+
+#include <klib/rc.h>
+
+/* ----------------------------------------------------------------------
+ * Make
+ *
+ * Create a new Null Block Cipher object.
+ * The processor is checked to see if this particular version is supported on
+ * this particular CPU.
+ */
+struct KBlockCipher;
+rc_t NULLBCMEMBER(Make) (struct KBlockCipher ** new_obj)
+{
+    rc_t rc;
+
+    /* Check parameter first */
+    if (new_obj == NULL)
+        rc = RC (rcKrypto, rcBlockCipher, rcConstructing, rcSelf, rcNull);
+
+    else
+    {
+        *new_obj = NULL;
+
+        rc = RC (rcKrypto, rcBlockCipher, rcConstructing, rcFunction, rcUnsupported);
+    }
+    return rc;
+}
+
+/* end of file lib/krypto/aes-ncbi.c */
diff --git a/libs/krypto/null-ncbi-priv.h b/libs/krypto/null-ncbi-priv.h
new file mode 100644
index 0000000..1e485bd
--- /dev/null
+++ b/libs/krypto/null-ncbi-priv.h
@@ -0,0 +1,56 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#ifndef _h_krypto_null_ncbi_priv_libs_
+#define _h_krypto_null_ncbi_priv_libs_
+
+#include <klib/defs.h>
+#include <v128.h>
+
+#include "ncbi-priv.h"
+#include "cipher-impl.h"
+#include "blockcipher-impl.h"
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+
+typedef struct CipherNull CipherNull;
+struct CipherNull
+{
+    KCipher dad;
+    CipherVec    e_ivec;
+    CipherVec    d_ivec;
+};
+
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif /* #ifndef _h_krypto_null_ncbi_priv_libs_ */
+
+
diff --git a/libs/krypto/null-ncbi.c b/libs/krypto/null-ncbi.c
new file mode 100644
index 0000000..fe5e7bc
--- /dev/null
+++ b/libs/krypto/null-ncbi.c
@@ -0,0 +1,251 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <krypto/extern.h>
+
+#include "ncbi-priv.h"
+#include "cipher-priv.h"
+#include "blockcipher-priv.h"
+
+#include <klib/rc.h>
+
+
+#include <byteswap.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <sysalloc.h>
+
+#include "blockcipher-impl.h"
+
+#if USE_VEC
+#include <cpuid.h>
+#endif
+#if USE_VECREG
+#include <v128.h>
+#endif
+
+
+#if USE_VEC
+#define BLOCKCIPHER_IMPL BLOCKCIPHER_VEC_IMPL
+#else
+#define BLOCKCIPHER_IMPL BLOCKCIPHER_BYTE_IMPL
+#endif
+
+typedef struct NULL_CLASS NULL_CLASS;
+
+static const char NULLBCMEMBER(aes_ncbi_name) [] = CLASS_STRING(AES_CLASS);
+
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *   How large is the stored key for this cipher?  Not the user key used
+ *   to create this key (key schedule)
+ *
+ *   This is needed by KCipher to know how large the KCipher objecr is at
+ *   allocation and to know how much of a buffer each decryption/encryption is
+ */
+static
+void NULLBCMEMBER(Destroy)    (const BLOCKCIPHER_IMPL * self)
+{
+    /* we use a constant object so do nothing */
+}
+
+
+/* ----------------------------------------------------------------------
+ * BlockSize
+ */
+static
+uint32_t NULLBCMEMBER(BlockSize) ()
+{
+    return 16;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KeySize
+ *   How large is the stored key for this cipher?  Not the user key used
+ *   to create this key (key schedule)
+ *
+ *   This is needed by KCipher to know how large the KCipher objecr is at
+ *   allocation and to know how much of a buffer each decryption/encryption is
+ */
+static uint32_t NULLBCMEMBER(KeySize) ()
+{
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * SetEncryptKey
+ *   The KCipher calls this to have the block cipher build an encryption
+ *   key in the KCipher object
+ *
+ */
+static rc_t NULLBCMEMBER(SetEncryptKey) (void * encrypt_key, const char * user_key,
+                                         uint32_t user_key_size)
+{
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * SetDecryptKey
+ *   The KCipher calls this to have the block cipher build an decryption
+ *   key in the KCipher object
+ *
+ */
+static rc_t NULLBCMEMBER(SetDecryptKey) (void * decrypt_key,
+                                     const char * user_key,
+                                     uint32_t user_key_size)
+{
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Encrypt
+ *
+ *   Perform an encryption of a single block.  Chained modes and stream
+ *   cipher modes will call this multiple times.
+ *
+ */
+#if USE_VEC
+static CipherVec NULLBCMEMBER(Encrypt) (CipherVec state,
+                                        const void * encrypt_key)
+{
+    return state;
+}
+#else
+static void NULLBCMEMBER(Encrypt) (const CipherBlock in,
+                                   CipherBlock * out,
+                                   const void * encrypt_key)
+{
+}
+#endif
+
+
+/* ----------------------------------------------------------------------
+ * Decrypt
+ *
+ *   Perform a decryption of a single block.  Chained modes and stream
+ *   cipher modes will call this multiple times.
+ */
+#if USE_VEC
+static CipherVec NULLBCMEMBER(Decrypt) (CipherVec state,
+                                        const void * decrypt_key)
+{
+    return state;
+}
+#else
+static void NULLBCMEMBER(Decrypt) (const CipherBlock in,
+                                   CipherBlock * out,
+                                   const void * encrypt_key)
+{
+}
+#endif
+
+
+/* ----------------------------------------------------------------------
+ * MakeProcessorSupport
+ *
+ * Run-time check for support of this particular AES implementation by
+ * checking the flags given via the cpuid instruction.
+ */
+static __inline__
+bool NULLBCMEMBER(ProcessorSupport) ()
+{
+    return true;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Init
+ *
+ *   Initialize the fields of this object.  The derived class will call this
+ *   during it's initialization.
+ *
+ * self      object to initialze
+ * vt        the virtual table of the derived class
+ * mgr       the cipher manager that is the construction factory block cipher
+ *           objects hold references to the manager while the manager merely
+ *           points at the block ciphers when all block ciphers are destroyed
+ *           the manager loses its references and it too can be destroyed if not
+ *           held elsewhere
+ * name      ASCIZ c-string the name of this class
+ */
+static const
+#if USE_VEC
+KBlockCipherVec_vt_v1
+#else
+KBlockCipherByte_vt_v1
+#endif
+NULLBCMEMBER(_vt_) = {
+    { 1, 1 },
+
+    NULLBCMEMBER(Destroy),
+    NULLBCMEMBER(BlockSize),
+    NULLBCMEMBER(KeySize),
+    NULLBCMEMBER(SetEncryptKey),
+    NULLBCMEMBER(SetDecryptKey),
+    NULLBCMEMBER(Encrypt),
+    NULLBCMEMBER(Decrypt)
+};
+
+
+/* ----------------------------------------------------------------------
+ * Make
+ *
+ * Create a new Null Block Cipher object.
+ * The processor is checked to see if this particular version is supported on
+ * this particular CPU.
+ */
+rc_t NULLBCMEMBER(Make) (KBlockCipher ** new_obj)
+{
+    rc_t rc;
+
+    /* Check parameter first */
+    if (new_obj == NULL)
+        rc = RC (rcKrypto, rcBlockCipher, rcConstructing, rcSelf, rcNull);
+
+    else
+    {
+        *new_obj = NULL;
+
+        /* check for processor support of this flavor */
+        if ( ! NULLBCMEMBER(ProcessorSupport)())
+            rc = RC (rcKrypto, rcBlockCipher, rcConstructing, rcFunction, rcUnsupported);
+
+        else
+        {
+            rc = 0;
+            *new_obj = (KBlockCipher*)&(NULLBCMEMBER(_vt_));
+        }
+    }
+    return rc;
+}
+
+/* end of file lib/krypto/aes-ncbi.c */
diff --git a/libs/krypto/reencfile.c b/libs/krypto/reencfile.c
new file mode 100644
index 0000000..cba8739
--- /dev/null
+++ b/libs/krypto/reencfile.c
@@ -0,0 +1,1243 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <krypto/extern.h>
+#include <krypto/reencfile.h>
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+#include <krypto/encfile-priv.h>
+#include "encfile-priv.h"
+
+#include <klib/rc.h>
+#include <klib/checksum.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/debug.h>
+#include <klib/vector.h>
+#include <klib/status.h>
+#include <kfs/file.h>
+#include <kfs/ramfile.h>
+
+#include <sysalloc.h>
+
+#include <byteswap.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <klib/out.h>
+
+#define USE_MISSING_VECTOR false
+
+/* ----------------------------------------------------------------------
+ * KReencFile
+ *   Base object class for the encryption, decryption and validation of
+ *   the file format defined above
+ */
+#define KFILE_IMPL KReencFile
+#include <kfs/impl.h>
+
+/* -----
+ */
+struct KReencFile
+{
+    KFile         dad;          /* base class */
+    const KFile * encrypted;    /* encrypted file we start from */
+    const KFile * dec;          /* decryptor of the original */
+    KFile *       enc;          /* encryptor */
+    KFile *       ram;          /* a file that works from a sliding window buffer */
+
+    size_t        num_read;
+    size_t        num_writ;
+/* block id's can not max out a 64 bit number as that is a file that is 32K times too big */
+#define NO_CURRENT_BLOCK (~(uint64_t)0)
+    uint64_t      block_id;
+    uint64_t      footer_block; /* if zero, file does not have any content blocks */
+
+    uint64_t      size;         /* size as known from the original file [see known_size] */
+    bool          known_size;   /* is the size of the original file known? */
+
+    char          plain_text  [ENC_DATA_BLOCK_SIZE];
+    union
+    {
+        KEncFileBlock block;
+        char          text [sizeof (KEncFileBlock)];
+    } block;
+    union
+    {
+        KEncFileFooter foot;
+        char           text [sizeof (KEncFileFooter)];
+    } foot;
+
+};
+
+/* ----------------------------------------------------------------------
+ * Interface Functions
+ *
+ * Destroy
+ *
+ */
+static
+rc_t CC KReencFileDestroy (KReencFile *self)
+{
+    if (self)
+    {
+        rc_t rc1, rc2, rc3, rc4;
+
+        rc1 = KFileRelease (self->encrypted);
+        if (rc1)
+            LOGERR (klogInt, rc1, "Re-enc failed to release encrypted file");
+
+        rc2 = KFileRelease (self->dec);
+        if (rc2)
+            LOGERR (klogInt, rc2, "Re-enc failed to release decryptor");
+
+        rc3 = KFileRelease (self->ram);
+        if (rc3)
+            LOGERR (klogInt, rc3, "Re-enc failed to release ram file");
+
+        rc4 = KFileRelease (self->enc);
+        if (rc4)
+            LOGERR (klogInt, rc4, "Re-enc failed to release encryptor");
+
+        free (self);
+
+        return (rc1 ? rc1 :
+                rc2 ? rc2 :
+                rc3 ? rc3 :
+                rc4);
+    }
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ *
+ * We do not allow this for read, write or update as you can not memory map the 
+ * unencrypted file in a meaningful way.
+ */
+static
+struct KSysFile *CC KReencFileGetSysFileUnsupported (const KReencFile *self, uint64_t *offset)
+{
+    assert (self);
+    assert (offset);
+
+    return NULL;
+}
+
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t CC KReencFileRandomAccess (const KReencFile *self)
+{
+    assert (self != NULL);
+    assert (self->encrypted != NULL);
+
+    return KFileRandomAccess (self->encrypted);
+}
+
+
+/* ----------------------------------------------------------------------
+ * Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KReencFileSize (const KReencFile *self, uint64_t *size)
+{
+    assert (self != NULL);
+    assert (self->encrypted != NULL);
+
+    /* -----
+     * the re-encrypted file will be the same size as the 
+     * previously encrypted file and we have the same understanding
+     * about knowing the size
+     */
+    return KFileSize (self->encrypted, size);
+}
+
+
+static
+rc_t CC KEncryptFileSize (const KReencFile *self, uint64_t *size)
+{
+    uint64_t z;
+    rc_t rc;
+
+    assert (self != NULL);
+    assert (self->encrypted != NULL);
+
+    /* -----
+     * the re-encrypted file will be the same size as the 
+     * previously encrypted file and we have the same understanding
+     * about knowing the size
+     */
+    rc = KFileSize (self->encrypted, &z);
+
+    if (rc == 0)
+    {
+        uint64_t bid = PlaintextSize_to_BlockCount ( z, NULL );
+        *size = BlockId_to_CiphertextOffset ( bid ) + sizeof ( KEncFileFooter );
+    }
+    else
+    {
+        *size = z;
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KReencFileSetSizeUnsupported (KReencFile *self, uint64_t size)
+{
+    assert (self);
+
+    return RC ( rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported );
+}
+
+
+/*
+ * The next three functions do the actual Out from a KFileRead.
+ * We will only out from the header, or a footer or a single
+ * encrypted block rather than try to fully satisfy all of a
+ * KFileRead. USe KFileReadAll to get more than one part
+ *
+ * For all we have an offset within the part which is the
+ * position from the original read request for the header
+ */
+static __inline__
+rc_t KReencFileReadHeaderOut (KReencFile * self, size_t offset, void * buffer,
+                              size_t bsize, size_t *num_read)
+{
+    assert (self);
+    assert (offset < sizeof (KEncFileHeader));
+    assert (buffer);
+    assert (bsize);
+    assert (num_read);
+
+    /* trim request if necessary */
+    if (offset + bsize > sizeof (KEncFileHeader))
+        bsize = sizeof (KEncFileHeader) - offset;
+
+    memmove (buffer, self->block.text + offset, bsize);
+    self->block_id = NO_CURRENT_BLOCK;
+    *num_read = bsize;
+    
+    return 0;
+}
+
+
+static __inline__
+rc_t KReencFileReadBlockOut (KReencFile * self, size_t offset, void * buffer,
+                             size_t bsize, size_t * num_read)
+{
+    assert (self);
+    assert (offset < sizeof self->block);
+    assert (buffer);
+    assert (bsize);
+    assert (num_read);
+
+    if (offset + bsize > sizeof self->block)
+        bsize = sizeof self->block - offset;
+
+    memmove (buffer, self->block.text + offset, bsize);
+    *num_read = bsize;
+
+    return 0;
+}
+
+
+static __inline__
+rc_t KReencFileReadFooterOut (KReencFile * self, size_t offset,
+                              void * buffer, size_t bsize, size_t * num_read)
+{
+    /* for the footer we will copy out from the footer in self */
+
+    assert (self);
+    assert (offset < sizeof self->foot);
+    assert (buffer);
+    assert (bsize);
+    assert (num_read);
+
+/* KOutMsg ("%s: offset '%zu' bsize '%zu'",__func__,offset,bsize); */
+    if (offset + bsize > sizeof self->foot)
+        bsize = sizeof self->foot - offset;
+
+    memmove (buffer, self->foot.text + offset, bsize);
+    self->block_id = NO_CURRENT_BLOCK;
+    *num_read = bsize;
+
+/* KOutMsg (" *num_read '%zu'\n",bsize); */
+/* { */
+/*     size_t ix; */
+/*     char * b = buffer; */
+/*     KOutMsg ("%s:",__func__); */
+/*     for (ix = 0; ix < bsize; ++ix) */
+/*         KOutMsg (" %2.2x",b[ix]); */
+/*     KOutMsg ("\n"); */
+
+/* } */
+    return 0;
+}
+
+
+/*
+ * Handle Read within the Encrypted file header
+ *
+ * We use a private interface into the KEncFile then 
+ * the Out function below to take what we write with
+ * the Encryptor and copy it to the callers read buffer.
+ */
+static
+rc_t KReencFileReadHandleBlock (KReencFile *self,
+                                uint64_t pos,
+                                void *buffer,
+                                size_t bsize,
+                                size_t *num_read);
+
+static __inline__
+rc_t KReencFileReadHandleHeader (KReencFile *self,
+                                 uint64_t pos,
+                                 void *buffer,
+                                 size_t bsize,
+                                 size_t *num_read)
+{
+    rc_t rc;
+
+    assert (self);
+    assert (pos < sizeof (KEncFileHeader));
+    assert (buffer);
+    assert (bsize);
+    assert (num_read);
+
+    if ( !self->known_size || self->size != sizeof(KEncFileHeader) + sizeof(KEncFileFooter) )
+    {
+        /* added to support NCBInenc and NCBIsenc variants of KEncFile
+         * read the first block of the source file but don't write any of it
+         *
+         * If the source is stream mode only then the next block to be read is the
+         * first and this will not violate by seeking. It will just have already
+         * read the block it will want to read real soon. Likewith within a
+         * single call to KFileReadAll.
+         */
+        rc = KReencFileReadHandleBlock (self, 0, NULL, 0, NULL);
+        if (rc)
+            return rc;
+    }
+
+    /* use a private function from KEncFile to generate a header */
+    rc = KEncFileWriteHeader (self->enc);
+    if (rc)
+        LOGERR (klogErr, rc, "re-enc error generating encrypted header");
+    else
+    {
+        /*
+         * assume it worked and its the right size 
+         * copy the requested portion of the header out to finish the read
+         */
+        rc = KReencFileReadHeaderOut (self, pos, buffer, bsize, num_read);
+        if (rc)
+            LOGERR (klogErr, rc, "re-enc error filling read request");
+    }
+    return rc;
+}
+
+
+/*
+ * Read the requested block form the source encrypted file
+ */
+static
+rc_t KReencFileReadABlock (KReencFile * self, uint64_t block_id)
+{
+    rc_t rc;
+
+
+/*     OUTMSG (("%s: block_id %lu\n",__func__,block_id)); */
+
+    if (block_id + 1 == self->footer_block)
+        memset (self->plain_text, 0, sizeof self->plain_text);
+
+    /* -----
+     * simple call down to the decryptor to get the plain text data
+     * for this block. We will regenerate the framing when we re-encrypt
+     */
+    rc = KFileReadAll (self->dec, BlockId_to_PlaintextOffset ( block_id ),
+                       &self->plain_text, sizeof (self->plain_text),
+                       &self->num_read);
+    if (rc)
+        LOGERR (klogErr, rc, "re-enc error reading a block");
+
+    /*
+     * interpret bytes read for validity
+     *
+     * zero means we hit a premature end of file where we expected a block
+     */
+    else if (self->num_read == 0)
+    {
+        /*misleading RC? */
+        rc = RC (rcKrypto, rcFile, rcReading, rcSize, rcInsufficient);
+        LOGERR (klogErr, rc, "re-enc no block read");
+    }
+    /*
+     * less than a full block must be in the last block
+     */
+    else if (self->num_read < sizeof self->plain_text)
+    {
+/*         KOutMsg ("%s: block_id '%lu'num_read '%zu' of '%zu' last_block '%lu'\n", */
+/*                  __func__, block_id, self->num_read, sizeof self->plain_text, */
+/*                  self->footer_block); */
+
+        if (block_id + 1 != self->footer_block)
+        {
+            rc = RC (rcKrypto, rcFile, rcReading, rcSize, rcInsufficient);
+            LOGERR (klogErr, rc, "re-enc incomplete block read");
+        }
+    }
+    /*
+     * unlikely scenario, read too much
+     */
+    else if (self->num_read > sizeof self->plain_text)
+    {
+        rc = RC (rcKrypto, rcFile, rcReading, rcBuffer, rcIncorrect);
+        LOGERR (klogErr, rc, "re-enc no block read");
+    }
+    if (rc == 0)
+        self->block_id = block_id;
+    return rc;
+}
+
+
+static
+rc_t KReencFileWriteABlock (KReencFile * self, uint64_t block_id)
+{
+    rc_t rc;
+
+    /* -----
+     * simple call to encrypt an entire data section for the relevant block
+     * We send in up to 32KB of plain text which through two element KFiles will
+     * we written into a buffer back in this KFile. More data will be written
+     * to that buffer than requested here - that is the framing and also the
+     * header if the block is the first one.
+     */
+    rc = KFileWriteAll (self->enc, BlockId_to_PlaintextOffset ( block_id ),
+                         self->plain_text, self->num_read, &self->num_writ);
+
+    if (rc)
+        LOGERR (klogInt, rc, "re-enc error encrypting a block");
+
+    else if (self->num_writ != self->num_read)
+    {
+        rc = RC (rcKrypto, rcFile, rcWriting, rcFile, rcIncomplete);
+        LOGERR (klogErr, rc, "re-enc failure encrypting all of block");
+    }
+
+    /* trigger a flush */
+/*     if (rc == 0) */
+/*         rc = KFileWriteAll (self->enc, BlockId_to_DecryptedPos (block_id^1), */
+/*                          self->plain_text, self->num_read, &self->num_writ); */
+
+    return rc;
+}
+
+
+/*
+ * Add the current encrypted block to the footer statistics
+ */
+static __inline__
+rc_t KReencFileAddToFooter (KReencFile * self)
+{
+    assert (self);
+/*     KOutMsg ("%s: ",__func__);  */
+
+    if (self->block.block.crc != self->block.block.crc_copy)
+    {
+        rc_t rc = RC (rcKrypto, rcFile, rcReading, rcChecksum, rcInvalid);
+        LOGERR (klogInt, rc, "rc-enc block CRCs disagree");
+        return rc;
+    }
+
+    ++ self->foot.foot.block_count;
+    self->foot.foot.crc_checksum += self->block.block.crc;
+
+/*     KOutMsg ("%lu %lu %lu\n",self->foot.foot.block_count,self->block.block.crc,self->foot.foot.crc_checksum); */
+    return 0;
+}
+
+
+/*
+ * Read a block from the source encrypted block and Write it which reencrypts it
+ *
+ * The new_block parameter says whether this is the first time we've seen this
+ * block. If it is we need to add data to the footer
+ */
+static
+rc_t KReencFileReencBlock (KReencFile * self, uint64_t block_id, bool new_block)
+{
+    rc_t rc;
+
+    assert (self);
+
+/*     KOutMsg ("%s: %lu %lu\n", __func__, block_id, self->footer_block); */
+    assert (block_id <= self->footer_block);
+    assert ((new_block == true) || (new_block == false));
+
+    rc = KReencFileReadABlock (self, block_id);
+    if (rc)
+        LOGERR (klogErr, rc, "re-enc failure to read a block");
+    else
+    {
+        if ((self->num_read == 0) || (self->num_read > sizeof (self->plain_text)))
+        {
+            rc = RC (rcFS, rcFile, rcReading, rcSize, rcIncorrect);
+            LOGERR (klogErr, rc, "Bad length on block read of encrypted file");
+        }
+        else
+        {
+            rc = KReencFileWriteABlock (self, block_id);
+            if (rc)
+                LOGERR (klogErr, rc, "re-enc failure to write a block");
+
+            else if (new_block)
+            {
+                rc = KReencFileAddToFooter (self);
+                if (rc)
+                    LOGERR (klogErr, rc,
+                            "re-enc failure to do block accounting");
+            }
+        }
+    }
+    return rc;
+}
+
+
+/*
+ * Handle Read within the Encrypted file footer
+ */
+static __inline__
+rc_t KReencFileReadHandleFooter (KReencFile *self,
+                                 uint64_t pos,
+                                 void *buffer,
+                                 size_t bsize,
+                                 size_t *num_read)
+{
+    uint64_t block_id;  /* block id for the footer gets us the start of footer */
+    size_t offset;
+    rc_t rc;
+
+/* KOutMsg ("\n\n\n%s: pos '%lu' bsize '%zu'\n",__func__,pos,bsize); */
+
+    assert (self);
+    assert (pos >= sizeof (KEncFileHeader));
+    assert (buffer);
+    assert (bsize);
+    assert (num_read);
+
+    rc = 0;
+    block_id = EncryptedPos_to_BlockId (pos, NULL, NULL);
+
+    assert (block_id == self->footer_block);
+
+    offset = pos - BlockId_to_CiphertextOffset ( block_id );
+
+    assert (offset < sizeof self->foot);
+
+    /* if we are tying to treat this as a footer but it wasn't the next
+     * expected block mark all inbetween as missing to handle in the 
+     * function just below this
+     */
+
+/* KOutMsg ("%s: self->next_block %lu\n",__func__, self->next_block); */
+
+    self->foot.foot.block_count = block_id;
+    self->foot.foot.crc_checksum = 0;
+
+    if (rc == 0)
+    {
+        uint64_t header_pos;
+
+        header_pos = BlockId_to_CiphertextOffset ( block_id );
+
+        assert (header_pos <= pos);
+        assert (pos - header_pos <= sizeof self->foot);
+
+        rc = KReencFileReadFooterOut (self, (size_t)(pos - header_pos),
+                                      buffer, bsize, num_read);
+
+/*             KOutMsg ("%s: footer '%lu' '%lx'\n",__func__, */
+/*                      self->foot.foot.block_count, */
+/*                      self->foot.foot.crc_checksum); */
+
+        if (rc)
+            LOGERR (klogInt, rc, "re-enc failed to output footer");
+    }
+    return rc;
+}
+
+
+/*
+ *
+ */
+static
+rc_t KReencFileReadHandleBlock (KReencFile *self,
+                                uint64_t pos,
+                                void *buffer,
+                                size_t bsize,
+                                size_t *num_read)
+{ 
+    rc_t rc = 0;            /* we have a path where we need to check this without set */
+    uint64_t block_id;      /* block id for the requeted position */
+    uint32_t offset;        /* how far into the encrypted block */
+    bool new_block;         /* is this the first time for this block */
+
+    /* -----
+     * figure out what block this corresponds to. 
+     * the header is for this purpose part of the first block
+     * when we decide what to give the reader. We only care
+     * about which block and not whether it is in the payload
+     * or framing.
+     * This block id is not to a known to exist block. It could be 
+     * to the header, the footer or past the end of the file.
+     *
+     * NOTE: This could be a pre-fetch of the first block when
+     * processing the header - it will have some funny values
+     * with just a self and all other parameters 0s.
+     * pos of zero gives block_id of 0 and the bsize of zero
+     * means we never look at the others. Thi sis to allow the 
+     * (at the time this was written) new feature of two
+     * different file-signatures for encrypted files.
+     */
+    block_id = EncryptedPos_to_BlockId (pos, NULL, NULL);
+
+    if (block_id != self->block_id)
+    {
+        new_block = true;
+
+        if (rc == 0)
+        {
+            /* read requested block */
+            rc = KReencFileReencBlock (self, block_id, new_block);
+            if (rc)
+            {
+                LOGERR (klogErr, rc,
+                        "re-enc failure re-encryptinng a requested block");
+            }
+        }
+    }
+    if ((rc == 0) && (bsize > 0))
+    {
+        /* satisfy read request
+         *
+         * if we are here we decrypted and re-encrypted the
+         * expected block
+         */
+        offset = ( uint32_t ) ( pos - BlockId_to_CiphertextOffset ( block_id ) );
+        rc = KReencFileReadBlockOut (self, offset, buffer, bsize, num_read);
+        if (rc)
+            LOGERR (klogErr, rc, "re-enc error copying out from block");
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t CC KReencFileReadUnsupported (const KReencFile *self,
+                                   uint64_t pos,
+                                   void *buffer,
+                                   size_t bsize,
+                                   size_t *num_read)
+{
+    assert (self);
+    assert (buffer);
+    assert (bsize);
+    assert (num_read);
+
+    return RC ( rcFS, rcFile, rcReading, rcFunction, rcUnsupported );
+}
+
+
+/*
+ * Read will often return only a partial read.
+ *
+ * We take the less complex route here and return only from the header, a
+ * single block or the footer, whatever is at the beginning of the requested
+ * region.
+ */
+static
+rc_t CC KReencFileRead (const KReencFile *self_,
+                        uint64_t pos,
+                        void *buffer,
+                        size_t bsize,
+                        size_t *num_read)
+{
+    /* make it all mutable and stop using self_ */
+    KReencFile * self = (KReencFile *)self_;
+    rc_t rc = 0;
+
+    assert (self);
+    assert (buffer);
+    assert (bsize);
+    assert (num_read);
+
+    *num_read = 0;
+
+    /* -----
+     * the size of the re-encrypted file will be the same as the size of the
+     * previously encrypted file so we can bail early if we know we can.
+     *
+     * The initial use case is that the file will just be lying out on disk
+     * and a KSysfile so that we do know the size.
+     *
+     * There are three pieces to an encrypted file:
+     * 1 Header
+     * 2 One or More Blocks
+     * 3 Footer
+     *
+     * We will only know if we are in the footer if we already know the size of
+     * the file. Else we have to find the footer by not finding a block when we
+     * try to read it. We'll thus look for the header first, then the footer else
+     * we try to find a block,
+     */
+
+    /* Header */
+    if (pos < sizeof (KEncFileHeader))
+        rc = KReencFileReadHandleHeader (self, pos, buffer, bsize, num_read);
+
+    /* if past the whole encrypted file */
+    else if (pos >= self->size)
+        rc = 0;
+
+    /* Footer */
+    else if (pos >= self->size - sizeof self->foot)
+        rc = KReencFileReadHandleFooter (self, pos, buffer, bsize, num_read);
+
+    /* Blocks */
+    else
+        rc = KReencFileReadHandleBlock (self, pos, buffer, bsize, num_read);
+
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ * Unsupported as we now treat archives as READ ONLY
+ */
+static
+rc_t CC KReencFileWriteUnsupported (KReencFile *self, uint64_t pos,
+                                    const void *buffer, size_t bsize,
+                                    size_t *num_writ)
+{
+    rc_t rc = RC (rcFS, rcFile, rcReading, rcFunction, rcUnsupported);
+
+    assert (self);
+    assert (buffer);
+    assert (bsize);
+    assert (num_writ);
+
+    assert (false);
+
+    LOGERR (klogInt, rc, "KFileRead failed to filter call");
+
+    return rc;
+}
+
+static
+rc_t CC KReencFileWrite (KReencFile *self, uint64_t pos,
+                         const void *buffer, size_t bsize,
+                         size_t *num_writ)
+{
+    assert (self);
+    assert (buffer);
+    assert (bsize);
+    assert (num_writ);
+
+    assert (REENCFILE_WRITE_SUPPORTED);
+
+    /* this needs to be finished before we can support Write open */
+
+    return KReencFileWriteUnsupported (self, pos, buffer, bsize, num_writ);
+}
+
+
+/* ----------------------------------------------------------------------
+ * Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KReencFileType (const KReencFile *self)
+{
+    assert (self != NULL);
+    assert (self->encrypted != NULL);
+
+    return KFileType (self->encrypted);
+}
+
+
+/* ----------------------------------------------------------------------
+ * KReencFileMake
+ *  create a new file object
+ */
+
+
+/* ----------
+ * MakeParamValidate
+ * common parameter validation for both reencryptors
+ */
+static
+rc_t KReencFileMakeParamValidate (const KFile ** pself, const KFile * encrypted, 
+                                  const KKey * deckey, const KKey * enckey)
+{
+    rc_t rc = 0;
+
+    do
+    {
+        if (pself == NULL)
+        {
+            rc = RC (rcFS, rcFile, rcConstructing, rcSelf, rcNull);
+            LOGERR (klogErr, rc,
+                    "pointer to self NULL when creating "
+                    "a re-encryptor");
+            break;
+        }
+
+        *pself = NULL;
+
+        if (encrypted == NULL)
+        {
+            rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcNull);
+            LOGERR (klogErr, rc, 
+                    "encrypted file not supplied when creating "
+                    "an encryptor/decryptor");
+            break;
+        }
+
+        if ((enckey == NULL) || (deckey == NULL))
+        {
+            rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcNull);
+            LOGERR (klogErr, rc, 
+                    "key not supplied when creating a re-encryptor");
+            break;
+        }
+
+        switch (deckey->type)
+        {
+        default:
+            rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcInvalid);
+            PLOGERR (klogErr,
+                     (klogErr, rc, "invalid key type '$(T)' should be "
+                      "kkeyAES128(1), kkeyAES192(2) or kkeyAES256(3)",
+                      "T=%u", deckey->type));
+            break;
+
+        case kkeyAES128:
+        case kkeyAES192:
+        case kkeyAES256:
+            break;
+        }
+        switch (enckey->type)
+        {
+        default:
+            rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcInvalid);
+            PLOGERR (klogErr,
+                     (klogErr, rc, "invalid key type '$(T)' should be "
+                      "kkeyAES128(1), kkeyAES192(2) or kkeyAES256(3)",
+                      "T=%u", enckey->type));
+            break;
+
+        case kkeyAES128:
+        case kkeyAES192:
+        case kkeyAES256:
+            break;
+        }
+    } while (0);
+    return rc;
+}
+
+
+/* ----------
+ * Read mode is fully seekable if the underlying KFile is seekable some
+ * integrity checking will not be performed in allowing this seeking.
+ */
+static const KFile_vt_v1 vtKReencFileRead =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KReencFileDestroy,
+    KReencFileGetSysFileUnsupported,
+    KReencFileRandomAccess,
+    KReencFileSize,
+    KReencFileSetSizeUnsupported,
+    KReencFileRead,
+    KReencFileWriteUnsupported,
+
+    /* 1.1 */
+    KReencFileType
+};
+
+
+LIB_EXPORT rc_t CC KReencFileMakeRead (const KFile ** pself, 
+                                       const KFile * encrypted,
+                                       const KKey * deckey,
+                                       const KKey * enckey)
+{
+    KReencFile * self;
+    uint64_t size;
+    uint64_t block_count;
+    rc_t rc;
+
+    rc = KReencFileMakeParamValidate (pself, encrypted, deckey, enckey);
+    if (rc)
+    {
+        LOGERR (klogErr, rc, "error constructing decryptor");
+        return rc;
+    }
+
+    rc = KFileSize (encrypted, &size);
+    if (GetRCState (rc) == rcUnsupported)
+    {
+        size = 0;
+        rc = RC (rcKrypto, rcFile, rcConstructing, rcSize, rcUnsupported);
+        LOGERR (klogErr, rc, "Can't re-encrypt files that don't support KFileSize");
+        return rc;
+    }
+    
+    if (rc)
+    {
+        LOGERR (klogErr, rc, "Unable to attempt to size encrypted file for reencryption");
+        return rc;
+    }
+
+    rc = KFileAddRef (encrypted);
+    if (rc)
+    {
+        LOGERR (klogErr, rc, "Unable to add reference to encrypted file for re-encryptor");
+        return rc;
+    }
+
+    if (size == 0)
+    {
+        *pself = encrypted;
+        return rc;
+    }
+    if (size < sizeof (KEncFileHeader) + sizeof (KEncFileFooter))
+    {
+        rc = RC (rcKrypto, rcFile, rcConstructing, rcSize, rcInvalid);
+        LOGERR (klogErr, rc, "encrypted file too short to be valied for re-encryption");
+        KFileRelease (encrypted);
+        return rc;
+    }
+
+    {
+        uint64_t temp;
+
+        temp = size - (sizeof (KEncFileHeader) + sizeof (KEncFileFooter));
+        block_count = temp / sizeof (KEncFileBlock);
+        if ((block_count * sizeof (KEncFileBlock)) != temp)
+        {
+            rc = RC (rcKrypto, rcFile, rcConstructing, rcSize, rcInvalid);
+            LOGERR (klogErr, rc, "encrypted file invalid size for re-encryption");
+            KFileRelease (encrypted);
+            return rc;
+        }
+    }
+
+    self = calloc (1,sizeof (*self));
+
+    if (self == NULL)
+    {
+        rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+        LOGERR (klogSys, rc,
+                "out of memory creating encrypter and/or decryptor");
+    }
+    else
+    {
+        rc = KFileInit (&self->dad, (const KFile_vt*)&vtKReencFileRead, "KReencFile", "no-name", true, false);
+        if (rc)
+            LOGERR (klogInt, rc, "failed in initialize reenc base class");
+        else
+        {
+            self->encrypted = encrypted;
+            /* dec, enc, ram need to be Make */
+            /* num_read, num_write stay 0 */
+            self->block_id = NO_CURRENT_BLOCK;
+            /* missing needs to be Made */
+            /* next_block stays 0 */
+            /* seek_block stays 0 - obsolete */
+            self->footer_block = EncryptedPos_to_BlockId (size, NULL, NULL);
+            self->size = size;
+            self->known_size = true; /* obsolete */
+            /* plain_text and block stay 0 */
+            self->foot.foot.block_count = self->footer_block;
+
+            rc = KEncFileMakeRead (&self->dec, encrypted, deckey);
+            if (rc)
+                LOGERR (klogErr, rc, "Failed to create re-enc decryptor");
+
+            else
+            {
+                rc = KRamFileMakeUpdate (&self->ram, self->block.text, 
+                                         sizeof self->block.text);
+                if (rc)
+                    LOGERR (klogErr, rc, 
+                            "Failed to create re-enc encryptor");
+                else
+                {
+
+                    rc = KEncFileMakeWriteBlock (&self->enc, self->ram, enckey);
+                    if (rc)
+                        LOGERR (klogErr, rc,
+                                "Failed to create RAM file for reenc");
+                    else
+                    {
+                        *pself = &self->dad;
+                        return 0;
+                    }
+                    KFileRelease (self->ram);
+                }
+                KFileRelease (self->dec);
+            }
+        }
+        free (self);
+    }
+    KFileRelease (encrypted);
+    return rc;
+}
+
+
+static const KFile_vt_v1 vtKEncryptFileRead =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KReencFileDestroy,
+    KReencFileGetSysFileUnsupported,
+    KReencFileRandomAccess,
+    KEncryptFileSize,
+    KReencFileSetSizeUnsupported,
+    KReencFileRead,
+    KReencFileWriteUnsupported,
+
+    /* 1.1 */
+    KReencFileType
+};
+
+
+LIB_EXPORT rc_t CC KEncryptFileMakeRead (const KFile ** pself, 
+                                         const KFile * encrypted,
+                                         const KKey * enckey)
+{
+    KReencFile * self;
+    uint64_t rawsize;
+    uint64_t size;
+    rc_t rc;
+
+    rc = KReencFileMakeParamValidate (pself, encrypted, enckey, enckey);
+    if (rc)
+    {
+        LOGERR (klogErr, rc, "error constructing decryptor");
+        return rc;
+    }
+
+    rc = KFileSize (encrypted, &rawsize);
+    if (GetRCState (rc) == rcUnsupported)
+    {
+        size = 0;
+        rc = RC (rcKrypto, rcFile, rcConstructing, rcSize, rcUnsupported);
+        LOGERR (klogErr, rc, "Can't encrypt files that don't support KFileSize");
+        return rc;
+    }
+    
+    if (rc)
+    {
+        LOGERR (klogErr, rc, "Unable to attempt to size encrypted file for encryption");
+        return rc;
+    }
+
+    rc = KFileAddRef (encrypted);
+    if (rc)
+    {
+        LOGERR (klogErr, rc, "Unable to add reference to unencrypted file for encryptor");
+        return rc;
+    }
+
+    self = calloc (1,sizeof (*self));
+
+    if (self == NULL)
+    {
+        rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+        LOGERR (klogSys, rc,
+                "out of memory creating encrypter and/or decryptor");
+    }
+    else
+    {
+        rc = KFileInit (&self->dad, (const KFile_vt*)&vtKEncryptFileRead, "KEncryptFile", "no-path", true, false);
+        if (rc)
+            LOGERR (klogInt, rc, "failed in initialize reenc base class");
+        else
+        {
+            self->encrypted = encrypted;
+            /* dec, enc, ram need to be made below */
+            /* num_read, num_write stay 0 */
+            self->block_id = NO_CURRENT_BLOCK;
+            /* missing needs to be Made */
+            /* next_block stays 0 */
+            /* seek_block stays 0 - obsolete */
+
+            self->footer_block = PlaintextSize_to_BlockCount ( rawsize, NULL );
+            size = BlockId_to_CiphertextOffset ( self -> footer_block ) + sizeof ( KEncFileFooter );
+            self->size = size;
+            self->known_size = true; /* obsolete */
+
+            /* plain_text and block stay 0 */
+            self->foot.foot.block_count = self->footer_block;
+
+            rc = KFileAddRef (self->dec = encrypted);
+            if (rc)
+                LOGERR (klogErr, rc, "Unable to add reference to unencrypted file for encryptor");
+
+            else
+            {
+                rc = KRamFileMakeUpdate (&self->ram, self->block.text, 
+                                         sizeof self->block.text);
+                if (rc)
+                    LOGERR (klogErr, rc, 
+                            "Failed to create ram file for encryptor");
+                else
+                {
+                    
+                    rc = KEncFileMakeWriteBlock (&self->enc, self->ram, enckey);
+                    if (rc)
+                        LOGERR (klogErr, rc,
+                                "Failed to create RAM file for enc");
+                    else
+                    {
+                        *pself = &self->dad;
+                        return 0;
+                    }
+                    KFileRelease (self->ram);
+                }
+                KFileRelease (self->dec);
+            }
+        }
+        free (self);
+    }
+    KFileRelease (encrypted);
+    return rc;
+}
+
+
+/* ----------
+ * Write mode re-encrypted file 
+ */
+static const KFile_vt_v1 vtKReencFileWrite =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KReencFileDestroy,
+    KReencFileGetSysFileUnsupported,
+    KReencFileRandomAccess,
+    KReencFileSize,
+    KReencFileSetSizeUnsupported,
+    KReencFileReadUnsupported,
+    KReencFileWrite,
+
+    /* 1.1 */
+    KReencFileType
+};
+
+
+LIB_EXPORT rc_t CC KReencFileMakeWrite (KFile ** pself, 
+                                        KFile * encrypted,
+                                        const KKey * deckey,
+                                        const KKey * enckey)
+{
+#if REENCFILE_WRITE_SUPPORTED
+    KReencFile * self;
+    rc_t rc;
+
+    rc = KFileSetSize (encrypted, 0);
+#if 0
+    if (rc)
+        LOGERR (klogWarn, rc, "error truncating output file - "
+                "corrupted file might result");
+#endif
+
+    rc = KReencFileMakeParamValidate (&self, encrypted, deckey, enckey,
+                                      &vtKEncFileWrite, true);
+    if (rc)
+        LOGERR (klogErr, rc, "error creating encryptor");
+    else
+        *pself = &self->dad;
+    return rc;
+#else
+    return RC ( rcFS, rcFile, rcCreating, rcFunction, rcUnsupported );
+#endif
+}
+
+
+/* end of file reencfile.c */
+
+
diff --git a/libs/krypto/rng-impl.h b/libs/krypto/rng-impl.h
new file mode 100644
index 0000000..04b3418
--- /dev/null
+++ b/libs/krypto/rng-impl.h
@@ -0,0 +1,91 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kryptoimpl_
+#define _h_kryptoimpl_
+
+#include <klib/rc.h>
+#include <klib/refcount.h>
+#include <atomic.h>
+#include <krypto/rng.h>
+#include "rng-priv.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+typedef union KRng_vt KRng_vt;
+
+
+
+
+#ifndef KRNG_IMPL
+#define KRNG_IMPL KRng
+#endif
+
+typedef struct KRng_vt_v1 KRng_vt_v1;
+struct KRng_vt_v1
+{
+    /* version == 1.x */
+    uint32_t maj;
+    uint32_t min;
+
+    /* start minor version == 0 */
+    rc_t (CC * destroy) (KRNG_IMPL * self);
+    rc_t (CC * seed)    (KRNG_IMPL * self);
+    rc_t (CC * reseed)  (KRNG_IMPL * self, const void * buff, size_t buff_size);
+    rc_t (CC * read)    (const KRNG_IMPL *self, void * buff, uint32_t buff_len,
+                         uint32_t * num_read);
+    /* end minor version == 0 */
+    /* start minor version == 1 */
+    /* end minor version == 1 */
+    /* end version == 1.x */
+};
+
+union KRng_vt
+{
+    KRng_vt_v1 v1;
+};
+
+static
+rc_t KRngInit (KRng * self, union KRng_vt * vt, const char * type)
+{
+    self->vt = vt;
+    KRefcountInit (&self->refcount, 1, "KRng", "Init", type);
+    return 0;
+}
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kryptoimpl_ */
diff --git a/src/test/java/htsjdk/tribble/source/.gitignore b/libs/krypto/rng-priv.h
similarity index 100%
rename from src/test/java/htsjdk/tribble/source/.gitignore
rename to libs/krypto/rng-priv.h
diff --git a/libs/krypto/rng.c b/libs/krypto/rng.c
new file mode 100644
index 0000000..f19c4f9
--- /dev/null
+++ b/libs/krypto/rng.c
@@ -0,0 +1,120 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <krypto/extern.h>
+#include <krypto/rng.h>
+#include <krypto/rng-impl.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/refcount.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+LIB_EXPORT rc_t CC KRngAddRef (const KRng * self)
+{
+    if (self) switch (KRefcountAdd (&self->refcount, "KRng"))
+    {
+    case krefLimit:
+        return RC (rcRuntime, rcNoTarg, rcAttaching, rcRange, rcExcessive);
+    }
+
+    return 0;
+}
+
+
+LIB_EXPORT rc_t CC KRngRelease (const KRng * self)
+{
+    if (self) switch (KRefcountDrop (&self->refcount, "KRng"))
+    {
+    case krefWhack:
+        switch (self->vt->v1.maj)
+        {
+        case 1:
+            return (self->vt->v1.destroy ((KRng*)self));
+        }
+        return RC (rcKrypto, rcRng, rcAccessing, rcSelf, rcBadVersion);
+    }
+    return 0;
+}
+
+
+LIB_EXPORT rc_t CC KRngSeed (KRng * self)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcRng, rcReading, rcSelf, rcNull);
+
+    switch (self->vt->v1.maj)
+    {
+    case 1:
+        return (self->vt->v1.seed (self));
+    }
+    return RC (rcKrypto, rcRng, rcAccessing, rcSelf, rcBadVersion);
+}
+
+
+LIB_EXPORT rc_t CC KRngReseed (KRng * self, void * buffer, size_t bsize)
+{
+    if (self == NULL)
+        return RC (rcKrypto, rcRng, rcReading, rcSelf, rcNull);
+    if (buffer == NULL)
+        return RC (rcKrypto, rcRng, rcReading, rcBuffer, rcNull);
+
+    switch (self->vt->v1.maj)
+    {
+    case 1:
+        return (self->vt->v1.reseed (self, buffer, bsize));
+    }
+    return RC (rcKrypto, rcRng, rcAccessing, rcSelf, rcBadVersion);
+}
+
+LIB_EXPORT rc_t CC KRngRead (const KRng * self, void * buffer, uint32_t bsize, uint32_t * num_read)
+{
+    if (num_read == NULL)
+        return RC (rcKrypto, rcRng, rcReading, rcParam, rcNull);
+    *num_read = 0;
+    if (self == NULL)
+        return RC (rcKrypto, rcRng, rcReading, rcSelf, rcNull);
+    if (buffer == NULL)
+        return RC (rcKrypto, rcRng, rcReading, rcBuffer, rcNull);
+
+    switch (self->vt->v1.maj)
+    {
+    case 1:
+        return (self->vt->v1.read (self, buffer, bsize, num_read));
+    }
+    return RC (rcKrypto, rcRng, rcAccessing, rcSelf, rcBadVersion);
+}
+
+LIB_EXPORT rc_t CC KRngInit (KRng * self, union KRng_vt * vt, const char * type)
+{
+    self->vt = vt;
+    KRefcountInit (&self->refcount, 1, "KRng", "Init", type);
+    return 0;
+}
+
+    
diff --git a/libs/krypto/testcipher.c b/libs/krypto/testcipher.c
new file mode 100644
index 0000000..d23257f
--- /dev/null
+++ b/libs/krypto/testcipher.c
@@ -0,0 +1,76 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <krypto/extern.h>
+#include <klib/defs.h>
+
+#include <krypto/cipher-test.h>
+#include "cipher-priv.h"
+#include <klib/rc.h>
+
+
+KRYPTO_EXTERN
+rc_t KCipherTestVecAesNiMake (struct KCipher ** new_cipher, kcipher_type type)
+{
+    if (new_cipher == NULL)
+        return RC (rcKrypto, rcCipher, rcConstructing, rcSelf, rcNull);
+
+    else
+        return KCipherVecAesNiMake (new_cipher, type);
+}
+
+
+KRYPTO_EXTERN
+rc_t KCipherTestVecRegMake   (struct KCipher ** new_cipher, kcipher_type type)
+{
+    if (new_cipher == NULL)
+        return RC (rcKrypto, rcCipher, rcConstructing, rcSelf, rcNull);
+
+    else
+        return KCipherVecRegMake (new_cipher, type);
+}
+
+
+KRYPTO_EXTERN
+rc_t KCipherTestVecMake      (struct KCipher ** new_cipher, kcipher_type type)
+{
+    if (new_cipher == NULL)
+        return RC (rcKrypto, rcCipher, rcConstructing, rcSelf, rcNull);
+
+    else
+        return KCipherVecMake (new_cipher, type);
+}
+
+
+KRYPTO_EXTERN
+rc_t KCipherTestByteMake     (struct KCipher ** new_cipher, kcipher_type type)
+{
+    if (new_cipher == NULL)
+        return RC (rcKrypto, rcCipher, rcConstructing, rcSelf, rcNull);
+
+    else
+        return KCipherByteMake (new_cipher, type);
+}
+
+
diff --git a/libs/krypto/unix/sysrng.c b/libs/krypto/unix/sysrng.c
new file mode 100644
index 0000000..0c9a936
--- /dev/null
+++ b/libs/krypto/unix/sysrng.c
@@ -0,0 +1,114 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <krypto/extern.h>
+#include <krypto/rng.h>
+#include "rng-priv.h"
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/checksum.h>
+
+
+#include <time.h>
+
+#include <unistd.h> /* unix specific so unix specific header is ok too */
+#include <string.h>
+
+rc_t KRngSysEntropy (KRng * self, uint8_t * buffer, size_t buff_size)
+{
+    MD5State state;
+    KDirectory * dir;
+    const KFile * file;
+    uint64_t file_pos;
+    rc_t rc;
+
+    if (self == NULL)
+        return RC (rcKrypto, rcRng, rcWriting, rcSelf, rcNull);
+    if (buffer == NULL)
+        return RC (rcKrypto, rcRng, rcWriting, rcParam, rcNull);
+
+    rc = KDirectoryNativeDir (&dir);
+    if (rc == 0)
+    {
+        rc = KDirectoryOpenFileRead (dir, &file, "/dev/random");
+        if (rc)
+            file = NULL;
+    }
+
+    file_pos = 0;
+    MD5StateInit (&state);
+
+    while (buff_size > 0)
+    {
+
+        if (file)
+        {
+            size_t to_read;
+            size_t num_read;
+
+            to_read = (buff_size > 16) ? 16 : buff_size;
+
+            rc = KFileRead (file, file_pos, buffer, to_read, &num_read);
+            if (rc == 0)
+            {
+                buffer += num_read;
+                buff_size -= num_read;
+                file_pos += num_read; /* superfluous? */
+            }
+        }
+        if (buff_size > 0)
+        {
+            uint8_t digest [16];
+            char buff [1024];
+            size_t ii;
+
+            string_printf (buff, sizeof (buff), &ii,
+                           "%p%zu%lu%lu%lu%lu%s%s%lu",
+                           buffer, buff_size, (uint64_t)clock(),
+                           (uint64_t)time(NULL), (uint64_t)getpid(), 
+                           (uint64_t)getuid(), getlogin(), ttyname(0),
+                           (uint64_t)getgid());
+
+            MD5StateAppend (&state, buff, sizeof buff);
+            MD5StateFinish (&state, digest);
+
+            ii = (buff_size < sizeof (digest)) ? buff_size : sizeof (digest);
+            memmove (buffer, digest, ii);
+            buff_size -= ii;
+            buffer += ii;
+        }
+    }
+
+    KFileRelease (file);
+    KDirectoryRelease (dir);
+    
+    return 0;
+}
diff --git a/libs/krypto/wgaencrypt.c b/libs/krypto/wgaencrypt.c
new file mode 100644
index 0000000..a07259a
--- /dev/null
+++ b/libs/krypto/wgaencrypt.c
@@ -0,0 +1,1254 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <krypto/extern.h>
+#include <krypto/cipher.h>
+#include <krypto/ciphermgr.h>
+
+#include <krypto/wgaencrypt.h>
+
+#include <kfs/file.h>
+#include <kfs/countfile.h>
+#include <kfs/md5.h>
+#include <kfs/buffile.h>
+#include <kfs/nullfile.h>
+
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/checksum.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+
+#include <sysalloc.h>
+
+#include <strtol.h>
+
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <os-native.h> /* strncasecmp on Windows */
+
+/* retain errors in encryption to be compatible with C++ */
+#define RETAINED_COMPATIBILTY_WITH_ERROR 1
+
+
+#define WGA_AES_BITS (256)
+#define ECB_BYTES (16)
+#define DEFAULT_BUFF_SIZE       (32*1024)
+
+
+#define DEBUG_STS(msg)     DBGMSG(DBG_KRYPTO,DBG_FLAG(DBG_KRYPTO_STS),msg)
+#define DEBUG_CFG(msg)     DBGMSG(DBG_KRYPTO,DBG_FLAG(DBG_KRYPTO_CFG_,msg)
+#define DEBUG_ENCRYPT(msg) DBGMSG(DBG_KRYPTO,DBG_FLAG(DBG_KRYPTO_ENCRYPT_,msg)
+#define DEBUG_DECRYPT(msg) DBGMSG(DBG_KRYPTO,DBG_FLAG(DBG_KRYPTO_DECRYPT_,msg)
+
+static
+void CalcMD5 (void * buffer, size_t size, char hexstr [32])
+{
+    static const char to_hex[16] = "0123456789abcdef";
+    MD5State state;
+    uint8_t digest [16];
+    uint8_t * bin;
+    char * hex;
+    int ix;
+
+    MD5StateInit (&state);
+    MD5StateAppend (&state, buffer, size);
+    MD5StateFinish (&state, digest);
+
+    bin = digest;
+    hex = hexstr;
+
+    for (ix = 0; ix < sizeof digest; ++ix)
+    {
+        uint8_t upper;
+        uint8_t lower;
+
+        upper = *bin++;
+        lower = upper & 0xF;
+        upper >>= 4;
+
+        *hex++ = to_hex [upper];
+        *hex++ = to_hex[lower];
+    }
+}
+
+
+/* ----------------------------------------------------------------------
+ * KWGAEncFileMagic is extracted from 
+ *      internal/WGA/access_countrol/src/wga/fuse/enc_reader.[ch]pp
+ * 
+ * the size 9 is not commented on but appears to be the size of ASCIZ
+ * that is the 'magic' pattern including the NUL.
+ *
+ * There is no version number in the header and that NUL could be turned
+ * into a single byte version.
+ */
+typedef char KWGAEncFileMagic [9];
+static const KWGAEncFileMagic ncbi_crypt_magic = "NeCnBcIo";
+
+/* ----------------------------------------------------------------------
+ * Some values are stored in the encrypted file header using an odd radix 33
+ */
+#define KWGA_ENC_FILE_HEADER_RADIX      (33)
+
+static
+const char KWGAEncFileHeaderAlphabet[] = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+
+/* ----------------------------------------------------------------------
+ * KWGAEncFileHeader is extracted from 
+ *      internal/WGA/access_countrol/src/wga/fuse/enc_reader.[ch]pp
+ *
+ * There is no version number in this header; see the comment about KWGAEncFileMagic
+ */
+typedef uint8_t FER_ENCODING;
+enum
+{
+    fer_encDES,
+    fer_encBLF,
+    fer_encAES
+};
+
+typedef struct KWGAEncFileHeader
+{
+    char magic [9];     /* "NeCnBcIo" -- NUL could be turned into a version */          /* 00 */
+    char block_sz [8];  /* radixx33 encoded: block size in bytes / usually 4096  */     /* 09 */
+    char file_sz [16];  /* radixx33 encoded: total size of unencrypted file */          /* 11 */
+    char mtime [8];     /* radixx33 encoded: 32 bit time_t  */                          /* 21 */
+    char fer_enc;       /* see FER_ENCODING */                                          /* 29 */
+    char md5_here;      /* bool if non zero, the whole file MD5 is below */             /* 2A */
+    char md5 [32];      /* whole file MD5 is ASCII hex */                               /* 2B */
+    char md51 [32];     /* first block MD5 */                                           /* 4B */
+    char reserved [21];                                                                 /* 6B */
+} KWGAEncFileHeader;                                                                    /* 80 */
+
+/* Original definition is in internal/WGA/access_countrol/src/wga/fuse/enc_reader.hpp */
+static const int8_t header_table[sizeof (KWGAEncFileHeader)] =
+{
+    101,  -6,   -23,  5,    -93,  20,   -128, -36,      /* 00 */
+    -42,  74,   -98,  104,  42,   12,   127,  37,       /* 08 */
+    -47,  -61,  124,  54,   -124, -94,  47,   72,       /* 10 */
+    70,   17,   -10,  108,  8,    31,   37,   -38,      /* 18 */
+    104,  -6,   -117, 79,   115,  89,   33,   -93,      /* 20 */
+    -47,  -105, -87,  -38,  90,   -45,  -59,  -46,      /* 28 */
+    -96,  106,  15,   -87,  -110, -101, 106,  -117,     /* 30 */
+    39,   73,   120,  -30,  -63,  21,   127,  -32,      /* 38 */
+    98,   -104, -3,   -81,  -60,  -120, 13,   -108,     /* 40 */
+    -53,  88,   123,  7,    103,  32,   -14,  -113,     /* 48 */
+    -68,  -27,  44,   109,  -122, -7,   81,   -13,      /* 50 */
+    64,   42,   -88,  -37,  -1,   -19,  66,   -105,     /* 58 */
+    -75,  -108, -5,   -121, -86,  47,   -120, -18,      /* 60 */
+    -69,  -29,  -68,  124,  -53,  -104, -28,  42,       /* 68 */
+    120,  52,   -80,  -23,  -110, -101, 106,  -117,     /* 70 */
+    -21,  -35,  12,   -117, 9,    -122, -21,  31        /* 78 */
+};                                                      /* 80 */
+
+static const KWGAEncFileHeader header_const =
+{
+    "NeCnBcIo", /* NUL terminator is significant */
+    {0},{0},{0},/* not constant */
+    fer_encAES, /* constant as DES and Blowfish are not implmented */
+    0,{0},{0},  /* not constant */
+    {0}         /* constant */
+};
+
+/* the header is obscured by XOR against a predefined pattern */
+static
+void KWGAEncFileHeaderDecrypt (KWGAEncFileHeader * header)
+{
+    size_t ix;
+    int8_t * p = (int8_t*)header;
+
+    assert (header);
+    for (ix = 0; ix < sizeof (*header); ++ix)
+        p[ix] ^= header_table[ix];
+}
+
+KRYPTO_EXTERN rc_t CC KFileIsWGAEnc (const void * buffer, size_t buffer_size)
+{
+    const uint8_t * ph;
+    const uint8_t * pt;
+    const uint8_t * pb;
+    size_t ix;
+    size_t lim;
+
+    if ((buffer == NULL) || (buffer_size == 0))
+        return RC  (rcFS, rcFile, rcIdentifying, rcParam, rcNull); 
+
+    /* bare minimum size to identify we decide is the first 8 
+     * obsfucated ASCII bytes */
+
+    if (buffer_size < (sizeof (header_const.magic) - 1))
+        return RC (rcFS, rcFile, rcIdentifying, rcBuffer, rcInsufficient); 
+
+    /* a match is ph[X] ^ pt[X] == pb[X] at specially identified points
+     * we could have put the ^ into a constant for a tad faster operation
+     * but meh...
+     */
+    ph = (const uint8_t*)&header_const;
+    pt = (const uint8_t*)&header_table;
+    pb = (const uint8_t*)buffer;
+
+    ix = offsetof (struct KWGAEncFileHeader, magic);
+    lim = ix + sizeof (header_const.magic);
+    if (lim > buffer_size)
+        lim = buffer_size;
+    for (; (ix < lim) && (ix < buffer_size); ++ix)
+        if ((ph[ix] ^ pt[ix]) != pb[ix])
+            return SILENT_RC (rcFS, rcFile, rcIdentifying, rcFile, rcWrongType); 
+
+    if (buffer_size < offsetof (struct KWGAEncFileHeader, fer_enc))
+        return 0;
+
+    if ((ph[offsetof (struct KWGAEncFileHeader, fer_enc)] ^ pt[offsetof (struct KWGAEncFileHeader, fer_enc)])
+        != pb[offsetof (struct KWGAEncFileHeader, fer_enc)])
+        return RC (rcFS, rcFile, rcIdentifying, rcFile, rcWrongType); 
+
+
+    ix = offsetof (struct KWGAEncFileHeader, reserved);
+    if (buffer_size < ix)
+        return 0;
+
+    lim = ix + sizeof (header_const.reserved);
+
+    if (lim > buffer_size)
+        lim = buffer_size;
+    
+    for (; ix < lim; ++ix)
+        if ((ph[ix] ^ pt[ix]) != pb[ix])
+            return RC (rcFS, rcFile, rcIdentifying, rcFile, rcWrongType);
+
+    return 0;
+}
+
+
+
+
+
+
+/* ======================================================================
+ * KWGAEncFile
+ */
+
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+typedef struct KWGAEncFile KWGAEncFile;
+#define KFILE_IMPL struct KWGAEncFile
+
+#include <kfs/impl.h>
+
+struct KWGAEncFile
+{
+    KFile dad;                  /* base class */
+    const KFile * encrypted;    /* encrypted file as a read only KFile */
+    uint64_t file_size;         /* as read from the encrypted file header */
+    KTime_t mtime;              /* as read from the encrypted file header */
+    uint32_t block_size;        /* block size is in KB  not bytes */
+    KCipher * cipher;
+
+    char inkey [32];
+    size_t inkey_size;
+
+    bool md5_here;              /* was the md5 in the header? */
+    char md5[32];            /* external md5 loaded into the header as ASCII hex */
+    char md51[32];           /* md5 of first block loaded into the header as ASCII hex */
+    struct
+    {
+        uint64_t  offset;       /* position with in the unencrypted file */
+        uint32_t  valid;        /* how much usable at data */
+        uint8_t   data [DEFAULT_BUFF_SIZE];
+    } buffer;
+};
+
+
+/* ----------------------------------------------------------------------
+ * InitKey
+ *
+ * This method mimics the prepare_key method in the WGA C++ code including
+ * what looks like programming errors.
+ *
+ * The goal is compatibility not 'correctness'.
+ */
+static
+rc_t KWGAEncFileKeyInit (KWGAEncFile * self, const char * key, size_t key_size)
+{
+    rc_t rc;
+    char g_key [32];  /* original used 513 but no key uses that much */
+
+    /* scary! */
+    /* this is copied directly from enc_read.cpp with all the 'possibly wrong' code */
+    memset (g_key, 0, sizeof g_key);
+    if (key_size > sizeof (g_key))
+        key_size = sizeof (g_key);
+    memmove (g_key, key, key_size);
+
+    if (key_size < 16) /* even though g_key and some cipher keys are larger than 16 */
+    {
+        size_t jx, ix;
+        for ((jx = key_size),(ix = 0); jx < 16; ++jx, ++ix)
+        {
+            g_key[jx] = self->md51[ix] | g_key[ix%(jx?jx:1)];    /* cringe? */
+        }
+    }
+
+    /* okay we'll use 32 bytes from g_key though is is highly
+     * likely we've only got 16 non-zero bytes */
+     rc = KCipherSetDecryptKey (self->cipher, g_key, WGA_AES_BITS/8);
+
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *
+ */
+static
+rc_t CC KWGAEncFileDestroyRead (KWGAEncFile *self)
+{
+    rc_t rc = 0;
+
+    if (self)
+    {
+        rc = KFileRelease (self->encrypted);
+        free (self);
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ *
+ * We do not allow this for read, write or update as you can not memory map the 
+ * unencrypted file in a meaningful way.
+ */
+static
+struct KSysFile *CC KWGAEncFileGetSysFile (const KWGAEncFile *self, uint64_t *offset)
+{
+    assert (self);
+    assert (offset);
+    return NULL;
+}
+
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t CC KWGAEncFileRandomAccess (const KWGAEncFile *self)
+{
+    assert (self != NULL);
+    assert (self->encrypted != NULL);
+    return KFileRandomAccess (self->encrypted);
+}
+
+
+/* ----------------------------------------------------------------------
+ * Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC KWGAEncFileSize (const KWGAEncFile *self, uint64_t *size)
+{
+    uint64_t esize;
+    rc_t rc;
+    assert (self != NULL);
+    assert (self->encrypted != NULL);
+    assert (size != NULL);
+
+    *size = 0;
+    rc = KFileSize (self->encrypted, &esize);
+    if (rc == 0)
+        *size = esize - sizeof (KWGAEncFileHeader);
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KWGAEncFileSetSize (KWGAEncFile *self, uint64_t size)
+{
+    assert (self);
+
+    return RC ( rcFS, rcFile, rcUpdating, rcFunction, rcUnsupported );
+}
+
+
+/* ----------------------------------------------------------------------
+ * Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+
+/* local fill the buffer with block or more  */
+static
+rc_t KWGAEncFileReadInt (KWGAEncFile * self, uint64_t pos, size_t bsize)
+{
+    uint64_t adjpos;
+    size_t tot_read;
+    size_t num_read;
+    rc_t rc = 0;
+
+    assert (self);
+    assert (bsize);
+    assert (bsize <= 32 * 1024);
+    assert (128%16 == 0);
+
+    memset (self->buffer.data, 0, sizeof self->buffer.data);
+    tot_read = num_read = 0;
+    adjpos = pos + sizeof (KWGAEncFileHeader);
+#if 0
+    do
+    {
+        rc = KFileRead (self->encrypted, adjpos + tot_read,
+                        self->buffer.data + tot_read, bsize - tot_read,
+                        &num_read);
+        if (rc)
+            return rc;        
+        tot_read += num_read;
+    } while ((tot_read < bsize) && (num_read > 0));
+#else
+    rc = KFileReadAll (self->encrypted, adjpos, self->buffer.data, bsize,
+                       &tot_read);
+#endif
+    self->buffer.offset = pos;
+    self->buffer.valid = (uint32_t)tot_read;
+
+    if (tot_read & 15)
+        rc = RC (rcKrypto, rcFile, rcReading, rcSize, rcInsufficient);
+    else if (tot_read > 0)
+    {
+#if 1
+
+#if RETAINED_COMPATIBILTY_WITH_ERROR
+        KCipherDecryptECB (self->cipher, self->buffer.data, self->buffer.data,
+                           (uint32_t)(tot_read / ECB_BYTES));
+#else
+/* Well this is wrong for even being wrong now */
+        KCipherDecryptECB (self->cipher, self->buffer.data, self->buffer.data,
+                           tot_read);
+#endif
+
+#else
+        uint32_t count;
+        uint32_t ix;
+
+        /* this loop can be replaced by the KCipherDecryptECB
+         * with care taken to match the error in the original
+         * C++
+         */
+
+#if RETAINED_COMPATIBILTY_WITH_ERROR
+        count = tot_read / ECB_BYTES;
+#else
+        /* do all full 16 byte blocks plus a last partial block */
+        count = (tot_read + (ECB_BYTES-1)) / ECB_BYTES;
+#endif
+        for (ix = 0; ix < count; ++ix)
+        {
+            uint8_t * pb = self->buffer.data + (ix * ECB_BYTES);
+
+            rc = KCipherDecrypt (self->cipher, pb, pb);
+            if (rc)
+                break;
+        }
+#endif
+    }
+    return rc;
+}
+
+
+static
+rc_t CC KWGAEncFileRead	(const KWGAEncFile *cself,
+                         uint64_t pos,
+                         void *buffer,
+                         size_t bsize,
+                         size_t *num_read)
+{
+    KWGAEncFile * self = (KWGAEncFile *)cself; /* mutable values */
+    rc_t rc = 0;
+
+    assert (cself);
+    assert (buffer);
+    assert (num_read);
+
+
+    *num_read = 0;
+
+    /* are we even within the file? If not just say no. Drugs are bad Mmmkay */
+    if (pos >= self->file_size)
+    {}
+    /* are we not reading from out what is already in the decrypted buffer space? */
+    else
+    {
+        if ((self->buffer.valid == 0) ||
+            (pos < self->buffer.offset) ||
+            (pos >= (self->buffer.offset + self->buffer.valid)))
+        {
+            if (pos < self->block_size) /* we'll be reading from the first 'block' */
+            {
+                rc = KWGAEncFileReadInt (self, 0, self->block_size);
+                if (rc)
+                {
+                    LOGERR (klogErr, rc, "error reading first data block of"
+                            " encrypted file");
+                    return rc;
+                }
+                if (self->buffer.valid > self->block_size)
+                {
+                    rc = RC (rcFS, rcFile, rcReading, rcBuffer, rcTooBig);
+                    LOGERR (klogInt, rc, "read wrong amount for first block");
+                    return rc;
+                }
+                else
+                {
+                    size_t md5_size;
+                    size_t nudge = 0;
+                    char md51_comp [32];
+
+                    if (self->buffer.valid & (ECB_BYTES-1))
+                        nudge = ECB_BYTES - (self->buffer.valid & (ECB_BYTES-1));
+                    if (nudge)
+                        memset (self->buffer.data + self->buffer.valid, 0, nudge);
+
+                    md5_size = self->buffer.valid + nudge;
+
+                    CalcMD5 (self->buffer.data, md5_size, md51_comp);
+
+#if 1
+                    if (strcase_cmp (self->md51, string_size(self->md51),
+                                     md51_comp, string_size(md51_comp), 32) != 0)
+#else
+                    if (strncasecmp (self->md51, md51_comp, 32) != 0)
+#endif
+                    {
+                        rc = RC (rcFS, rcFile, rcReading, rcConstraint, rcCorrupt);
+                        LOGERR (klogErr, rc, "MD5 does not match in decryption");
+                        return rc;
+                    }
+                }
+            }
+            else /* if (pos >= self->block_size) */
+            {
+                rc = KWGAEncFileReadInt (self, (pos & ~ ( uint64_t ) (16-1)),
+                                         DEFAULT_BUFF_SIZE);
+                if (rc)
+                {
+                    LOGERR (klogErr, rc, "error reading data block of"
+                            " encrypted file");
+                    return rc;
+                }
+            }  /* if (pos < self->block_size) */
+        } /* if ((self->buffer.valid == 0) || etc. */
+        /* if here we have a valid buffer and it contains the start pos requested */
+/*     assert (pos >= self->buffer.offset); */
+/*     assert (pos < (self->buffer.offset +self->buffer.valid)); */
+        {
+            size_t start;
+            size_t limit;
+
+            /* find offset of start for copy within the buffer */
+            start = (size_t)(pos - self->buffer.offset);
+            /* how many bytes available starting here */
+            limit = self->buffer.valid - start;
+
+            if (pos + limit > self->file_size)
+                limit = self->file_size - pos;
+
+            /* are we asking to read more than we have? is so trim the request */
+            if (limit < bsize)
+                bsize = limit;
+
+            memmove (buffer, self->buffer.data + start, bsize);
+            *num_read = bsize;
+        }
+    }
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ *
+ * Unsupported as we now treat archives as READ ONLY
+ */
+static
+rc_t CC KWGAEncFileWriteFail (KWGAEncFile *self, uint64_t pos,
+                              const void *buffer, size_t bsize,
+                              size_t *num_writ)
+{
+    assert (self);
+    return RC (rcFS, rcFile, rcReading, rcFunction, rcUnsupported);
+}
+
+
+/* ----------------------------------------------------------------------
+ * Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t CC KWGAEncFileType (const KWGAEncFile *self)
+{
+    assert (self != NULL);
+    assert (self->encrypted != NULL);
+
+    return KFileType (self->encrypted);
+}
+
+
+static const KFile_vt_v1 vtKWGAEncFileRead =
+{
+    /* version */
+    1, 1,
+
+    /* 1.0 */
+    KWGAEncFileDestroyRead,
+    KWGAEncFileGetSysFile,
+    KWGAEncFileRandomAccess,
+    KWGAEncFileSize,
+    KWGAEncFileSetSize,
+    KWGAEncFileRead,
+    KWGAEncFileWriteFail,
+
+    /* 1.1 */
+    KWGAEncFileType
+};
+
+
+static
+rc_t KWGAEncFileHeaderRead (KWGAEncFile * self)
+{
+    KWGAEncFileHeader header;
+    uint8_t * pb;
+    size_t num_read;
+    size_t tot_read;
+    rc_t rc;
+
+    assert (self);
+    assert (sizeof (KWGAEncFileHeader) == 128);
+
+
+    DEBUG_STS (("s: Enter '%p'\n", __func__, self));
+    pb = (void*)&header;
+    for (num_read = tot_read = 0; tot_read < sizeof header; )
+    {
+        rc = KFileRead (self->encrypted, (uint64_t)tot_read, pb, 
+                        sizeof (header) - tot_read, &num_read);
+        if (rc)
+        {
+            LOGERR (klogErr, rc, "Error reading the header for an encrypted file");
+            return rc;
+        }
+
+        if (num_read == 0)
+        {
+            rc =  RC (rcFS, rcFile, rcReading, rcFile, rcInsufficient);
+            LOGERR (klogErr, rc, "Header incomplete for an encrypted file");
+            return rc;
+        }
+        tot_read += num_read;
+        pb += num_read;
+    }
+
+    KWGAEncFileHeaderDecrypt (&header);
+
+    if (memcmp (header.magic, ncbi_crypt_magic, sizeof ncbi_crypt_magic) != 0)
+    {
+        rc = RC (rcFS, rcFile, rcReading, rcHeader, rcCorrupt);
+        LOGERR (klogErr, rc, "Header's magic bad for encrypted file");
+        return rc;
+    }
+
+    /* so far unknown legal range */
+    self->block_size = strtou32 (header.block_sz, NULL, KWGA_ENC_FILE_HEADER_RADIX);
+
+    self->file_size = strtou64 (header.file_sz, NULL, KWGA_ENC_FILE_HEADER_RADIX);
+
+    /* file format has limiting feature of a 32 bit timestamp */
+    self->mtime = (KTime_t)strtol (header.mtime, NULL, KWGA_ENC_FILE_HEADER_RADIX);
+
+    switch ((FER_ENCODING)header.fer_enc)
+    {
+    default:
+        rc = RC (rcFS, rcFile, rcReading, rcHeader, rcOutofrange);
+        LOGERR (klogErr, rc, "Enryption type code out of range");
+        return rc;
+    case fer_encDES:
+    case fer_encBLF:
+        rc = RC (rcFS, rcFile, rcReading, rcHeader, rcIncorrect);
+        LOGERR (klogErr, rc, "Enryption type code not supported");
+        return rc;
+    case fer_encAES:
+        break;
+    }
+
+    self->md5_here = (header.md5_here != 0);
+
+    if (self->md5_here)
+        memmove (self->md5, header.md5, sizeof (self->md5));
+
+    memmove (self->md51, header.md51, sizeof (self->md51));
+
+    return 0; /* yeah not really checking later errors am i? */
+}
+
+/* ----------------------------------------------------------------------
+ * KWGAEncFileMake
+ *  create a new file object
+ *
+ * pself        where to put pointer to new object
+ * encrypted    a readable file that is encrypted
+ * cipher       a cipher object that must support AES with 256 bit key
+ *              not verified except through failure to decrypt a file
+ * key          bytes containing the user key - should be utf-8 but with no
+ *              control characters
+ * key_size     how many bytes to use from the key 
+ */
+/* read only version for decrypting of existing files */
+KRYPTO_EXTERN rc_t CC KFileMakeWGAEncRead (const struct KFile ** pself, 
+                                           const struct KFile * encrypted,
+                                           const char * key,
+                                           size_t key_size)
+{
+    rc_t rc;
+
+    if (pself == NULL)
+    {
+        rc = RC (rcFS, rcFile, rcConstructing, rcSelf, rcNull);
+        LOGERR (klogErr, rc, "key parameter for WGA encrypted file is empty");
+        return rc;
+    }
+
+    *pself = NULL;
+
+    if ((encrypted == NULL)||(key == NULL))
+    {
+        rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcNull);
+        LOGERR (klogErr, rc, "missing WGA encrypted file passed in to constructor");
+    }
+
+    else if (key_size == 0)
+    {
+        rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcInvalid);
+        LOGERR (klogErr, rc, "missing WGA encrypted file passed in to constructor");
+    }
+
+    else if (encrypted->read_enabled == 0)
+    {
+        rc = RC (rcFS, rcFile, rcConstructing, rcParam, rcIncorrect);
+        LOGERR (klogErr, rc, "encrypted file not readable");
+    }
+    else
+    {
+        KCipherManager * cipher_mgr;
+
+        rc = KCipherManagerMake (&cipher_mgr);
+        if (rc == 0)
+        {
+            KCipher * cipher;
+
+            rc = KCipherManagerMakeCipher (cipher_mgr, &cipher, kcipher_AES);
+            if (rc == 0)
+            {
+                size_t z;
+
+                rc = KCipherBlockSize (cipher, &z);
+                if (rc)
+                {
+                    LOGERR (klogErr, rc, "unable to get block size for WGA "
+                            "encrypted file cipher passed in to constructor");
+                }
+                else
+                {
+                    if (z != ECB_BYTES)
+                    {
+                        rc = RC (rcFS, rcFile, rcConstructing, rcParam,
+                                 rcInvalid);
+                        LOGERR (klogErr, rc, "wrong block size for WGA "
+                                "encrypted file cipher passed in to "
+                                "constructor");
+                    }
+                    else
+                    {
+                        KWGAEncFile * self;
+
+                        self = calloc (sizeof (*self), sizeof (uint8_t));
+                        if (self == NULL)
+                        {
+                            rc = RC (rcFS, rcFile, rcConstructing, rcMemory,
+                                     rcExhausted);
+                            LOGERR (klogErr, rc, "out of memory while "
+                                    "constructing decryptor");
+                        }
+                        else
+                        {
+                            rc = KFileAddRef (encrypted);
+                            if (rc)
+                                LOGERR (klogErr, rc, "unable to add reference "
+                                "to encrypted file");
+                            else
+                            {
+                                /* cast to strip const */
+                                self->encrypted = encrypted;
+                                self->cipher = cipher;
+
+                                /* read the header of the encrypted file for
+                                 * details about the  decrypted file */
+                                DEBUG_STS(("%s: calling KWGAEncFileHeaderRead\n",
+                                           __func__));
+                                rc = KWGAEncFileHeaderRead (self);
+                                if (rc == 0)
+                                {
+                                    /* using the file header's stored encoding
+                                     * key build a key from the parameter key */
+                                    DEBUG_STS(("%s: calling "
+                                               "KWGAEncFileHeaderRead\n",
+                                               __func__));
+                                    rc = KWGAEncFileKeyInit (self, key,
+                                                             key_size);
+                                }
+                                if (rc == 0)
+                                {
+                                    rc = KFileInit (&self->dad, 
+                                                    (const KFile_vt*)
+                                                    &vtKWGAEncFileRead,
+                                                    "KWGAEncFile", "no-name",
+                                                    true, false);
+                                    if (rc)
+                                        LOGERR (klogInt, rc, "Failed to initialize decrypting file");
+                                    else
+                                    {
+                                        *pself = &self->dad;
+                                        self->buffer.offset = 0;
+                                        self->buffer.valid = 0;
+                                        KCipherManagerRelease (cipher_mgr);
+                                        return 0;
+                                    }
+                                }
+                                /* release of encrypted handled in destroy() */
+                            }
+                            KWGAEncFileDestroyRead (self);
+                        }
+                    }
+                }
+                KCipherRelease (cipher);
+            }           
+        }
+    }
+    return rc; 
+}
+
+static __inline__
+rc_t WGAEncValidateHeader (const KWGAEncFileHeader * header,
+                           size_t header_size)
+{
+    rc_t rc = 0;
+    unsigned ix;
+
+    if (header_size != sizeof * header)
+    {
+        rc = RC (rcKrypto, rcFile, rcValidating, rcHeader, rcInsufficient);
+        LOGERR (klogErr, rc, "incomplete header");
+        return rc;
+    }
+
+    if (memcmp (header, &header_const, sizeof header->magic) != 0)
+    {
+        rc = RC (rcKrypto, rcFile, rcValidating, rcHeader, rcInvalid);
+        LOGERR (klogErr, rc, "bad signature in encrypted file header");
+        return rc;
+    }
+
+#if 0
+    /* check block_size */
+    do
+    {
+        for (ix = 0; isspace(header->block_sz[ix]); ++ix)
+            ;
+
+        if (ix >= sizeof (header->block_sz))
+            break;
+
+        if (header->block_sz[ix] == '+')
+            ++ix;
+
+        if (ix >= sizeof (header->block_sz))
+            break;
+
+        for (; (ix < sizeof header->block_sz); ++ix)
+        {
+            if (isdigit (header->block_sz[ix]))
+                ;
+            else if ((header->block_sz[ix] >= 'a') &&
+                     (header->block_sz[ix] <= 'w'))
+                ;
+            else if ((header->block_sz[ix] >= 'A') &&
+                     (header->block_sz[ix] <= 'W'))
+                ;
+            else
+                break;
+        }
+        for (; (ix < sizeof header->block_sz); ++ix)
+        {
+            if (header->block_sz[ix] == '\0')
+                ;
+            else
+                break;
+        }
+        if (rc)
+        
+
+
+        for (ix = 0; ix < sizeof header->block_size; ++ix)
+        {
+            if ()
+                ;
+                }
+        
+            ;
+        else if (header->block_sz[ix] == '-')
+            ;
+        else
+            ;
+    }while (0);
+    /* check file_sz */
+    /* check mtime */
+#endif
+
+    if (header->fer_enc != fer_encAES)
+    {
+        rc = RC (rcKrypto, rcFile, rcValidating, rcHeader, rcInvalid);
+        LOGERR (klogErr, rc, "bad encoding flag in encrypted file header");
+        return rc;
+    }
+
+    if ((header->md5_here != true) && (header->md5_here != false))
+    {
+        rc = RC (rcKrypto, rcFile, rcValidating, rcHeader, rcInvalid);
+        LOGERR (klogErr, rc, "bad checksum flag in encrypted file header");
+        return rc;
+    }
+
+    /* check md5 */
+    /* check md51 */
+
+    for (ix = 0; ix < sizeof header->reserved; ++ix)
+    {
+        if (header->reserved[ix] != 0)
+        {
+            rc = RC (rcKrypto, rcFile, rcValidating, rcHeader, rcInvalid);
+            LOGERR (klogErr, rc, "bad reserved space in encrypted file header");
+            return rc;
+        }
+    }
+
+    return 0;
+}
+
+
+KRYPTO_EXTERN rc_t CC WGAEncValidate (const KFile * encrypted, 
+                                      const char * key,
+                                      size_t key_size)
+{
+    const KFile * buffile;
+    rc_t rc, orc;
+
+    rc = KBufFileMakeRead (&buffile, encrypted, 64*1024);
+    if (rc)
+        LOGERR (klogErr, rc, "unable to buffer encrypted file");
+
+    else
+    {
+        KWGAEncFileHeader header;
+        size_t num_read;
+
+        /* first let's disect the header */
+        rc = KFileReadAll (buffile, 0, &header, sizeof header, &num_read);
+        if (rc)
+            LOGERR (klogErr, rc, "unable to read encrypted file header");
+
+        else
+        {
+            uint64_t file_size;
+            uint64_t header_file_size;
+            char ascii_md5 [32];
+            char header_ascii_md5 [32];
+
+            KWGAEncFileHeaderDecrypt (&header);
+
+            rc = WGAEncValidateHeader (&header, num_read);
+            if (rc)
+                ;
+
+            else
+            {
+                if (key_size == 0)
+                {
+                    const KFile * countfile;
+                    rc = KFileMakeCounterRead (&countfile, encrypted, &file_size, NULL, false);
+                    if (rc)
+                    {
+                        LOGERR (klogErr, rc, "error making file size counter");
+                        file_size = 0;
+                    }
+                    else
+                    {
+                        KFileAddRef (encrypted);
+                        KFileRelease (countfile);
+
+                        file_size -= sizeof header;
+                    }
+                }
+                else
+                {
+                    union
+                    {
+                        const KFile * decrypted;
+                        const KWGAEncFile * decryptor;
+                    } u;
+
+                    rc = KFileMakeWGAEncRead (&u.decrypted, buffile, key, key_size);
+                    if (rc)
+                        LOGERR (klogErr, rc, "error making decryptor");
+
+                    else
+                    {
+                        KFile * nullfile;
+
+                        rc = KFileMakeNullUpdate (&nullfile);
+                        if (rc)
+                            LOGERR (klogInt, rc, "error making data sync");
+
+                        else
+                        {
+                            KMD5SumFmt * fmt;
+                            static const char name[] = "wgaencrypt";
+
+                            rc = KMD5SumFmtMakeUpdate (&fmt, nullfile);
+                            if (rc)
+                            {
+                                LOGERR (klogInt, rc, "error making md5sum database");
+                                KFileRelease (nullfile);
+                            }
+                            else
+                            {
+                                const KFile * md5file;
+
+                                rc = KFileMakeNewMD5Read (&md5file, u.decrypted, fmt, name);
+                                if (rc)
+                                    LOGERR (klogInt, rc, "error making MD5 calculator");
+
+                                else
+                                {
+                                    /*
+                                     * ill mannered md5file steals
+                                     * references instead of adding one
+                                     */
+                                    rc = KFileAddRef (u.decrypted);
+                                    if (rc)
+                                        LOGERR (klogInt, rc, "error adding reference to decryptor");
+
+                                    else
+                                    {
+
+                                        const KFile * countfile;
+                                        rc = KFileMakeCounterRead (&countfile,
+                                                                   md5file,
+                                                                   &file_size, NULL,
+                                                                   true);
+                                        if (rc)
+                                            LOGERR (klogErr, rc,
+                                                    "error making file size "
+                                                    "counter");
+                                        else
+                                        {
+                                            /*
+                                             * ill mannered countfile steals
+                                             * references instead of adding one
+                                             */
+                                            KFileAddRef (md5file);
+                                            rc = KFileRelease (countfile);
+                                        }
+
+                                        orc = KFileRelease (md5file);
+                                    
+                                        if (rc == 0)
+                                            rc = orc;
+
+                                        if (rc == 0)
+                                        {
+                                            uint8_t md5 [16];
+                                            bool bin;
+
+                                            rc = KMD5SumFmtFind (fmt, name, md5, &bin);
+                                            if (rc)
+                                                LOGERR (klogInt, rc, "error locating MD5");
+
+                                            else
+                                            {
+                                                size_t zz;
+                                                unsigned ix;
+                                                for (ix = 0; ix < 16; ++ix)
+                                                {
+                                                    string_printf (&ascii_md5[2*ix], 2, &zz, "%2.2x",
+                                                               (unsigned)(uint8_t)md5[ix]);
+                                                }
+                                                memmove (header_ascii_md5,
+                                                        u.decryptor->md5,
+                                                        sizeof header_ascii_md5);
+                                            }
+                                        }
+                                    }
+                                }
+                                KMD5SumFmtRelease (fmt);
+                            }
+                        }
+                        KFileRelease (u.decrypted);
+                    }                
+                }
+            }
+            if (rc == 0)
+            {
+                uint64_t sys_file_size;
+                uint64_t pad_file_size = 0;
+                rc_t orc;
+
+                /* ccheck file size */
+
+                orc = KFileSize (encrypted, &sys_file_size);
+                if (orc == 0)
+                {
+                    pad_file_size = file_size + 15;
+                    pad_file_size &= ~ ( uint64_t ) 15;
+                    pad_file_size += sizeof (KWGAEncFileHeader);
+                }
+                header_file_size = strtou64 (header.file_sz, NULL, KWGA_ENC_FILE_HEADER_RADIX);
+
+                if (key_size == 0)
+                {
+                    header_file_size += 15;
+                    header_file_size &= ~ ( uint64_t ) 15;
+                }
+
+                if (file_size < header_file_size)
+                    rc = RC (rcKrypto, rcFile, rcValidating, rcSize, rcInsufficient);
+                
+                else if (file_size > header_file_size)
+                    rc = RC (rcKrypto, rcFile, rcValidating, rcSize, rcExcessive);
+
+                else if ((orc == 0) &&
+                         (sys_file_size > pad_file_size))
+                    rc = RC (rcKrypto, rcFile, rcValidating, rcSize, rcExcessive);
+
+                /* check md5 */
+                else if (!header.md5_here)
+                {
+                    /* rc = RC (rcKrypto, rcFile, rcValidating, rcEncryption, rcNotFound); */
+                }
+                else if (key_size == 0)
+                    rc = RC (rcKrypto, rcFile, rcValidating, rcEncryption, rcNull);
+
+                else
+                {
+                    int cmp;
+
+                    cmp = strcase_cmp (ascii_md5, sizeof ascii_md5, 
+                                       header_ascii_md5, sizeof header_ascii_md5,
+                                       sizeof ascii_md5);
+                    if (cmp)
+                    {
+                        rc = RC (rcKrypto, rcFile, rcValidating, rcChecksum,
+                                 rcInvalid);
+                        LOGERR (klogErr, rc, "Encrypted file MD5 does not match");
+                    }
+                }
+            }
+        }
+        KFileRelease (buffile);
+    }
+    return rc;
+}
+#if 0
+        /* not working as planned */
+        if (rc == 0)
+        {
+            uint32_t this_read;
+
+            /* try to read past size now obtained */
+            do
+            {
+                uint8_t throwaway [8192];
+
+                rc = KFileRead (encrypted, z + sizeof (KWGAEncFileHeader), throwaway, sizeof throwaway,
+                                &this_read);
+                if (rc)
+                {
+                    LOGERR (klogErr, rc, "Error reading file");
+                    break;
+                }
+                z += this_read;
+
+            } while (this_read);
+        }
+#endif
+
+/* end of file wgaencrypt.c */
+
diff --git a/libs/ktst/Makefile b/libs/ktst/Makefile
new file mode 100644
index 0000000..ff938ef
--- /dev/null
+++ b/libs/ktst/Makefile
@@ -0,0 +1,87 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/ktst
+
+INT_LIBS = \
+    libktst
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(TST_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# testing framework
+#
+$(ILIBDIR)/libktst: $(addprefix $(ILIBDIR)/libktst.,$(LIBX))
+
+TST_SRC = \
+	testenv \
+    systestenv \
+	testcase \
+	testrunner
+
+TST_OBJ = \
+	$(addsuffix .$(LOBX),$(TST_SRC))
+
+$(ILIBDIR)/libktst.$(LIBX): $(TST_OBJ)
+	$(LP) --slib -o $@ $^ $(TST_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/ktst/testcase.cpp b/libs/ktst/testcase.cpp
new file mode 100644
index 0000000..d9e1493
--- /dev/null
+++ b/libs/ktst/testcase.cpp
@@ -0,0 +1,108 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/printf.h> 
+
+#include <cstring> // strlen
+#include <ctime> // time
+
+using namespace ncbi::NK;
+
+void TestCase::Init(const char* name)  { _name = name; _ec = 0; } 
+
+void TestCase::report_error(const char* msg, const char* file, int line, bool is_msg, bool isCritical)
+{
+    ncbi::NK::saveLocation(file, line);
+    ++_ec;
+    LOG(LogLevel::e_error, TestEnv::FormatLocation(file, line));
+    if (isCritical) 
+    {
+        LOG(LogLevel::e_error, "fatal ");
+    }
+    LOG(LogLevel::e_error, "error in \"" << _name << "\": ");
+    if (is_msg) 
+    {
+        LOG(LogLevel::e_error, msg);
+    }
+    else 
+    {
+        if (isCritical) 
+        {
+            LOG(LogLevel::e_error, "critical ");
+        }
+        LOG(LogLevel::e_error, "check " << msg << " failed");
+    }
+    LOG(LogLevel::e_error, std::endl);
+    if (isCritical)
+    { 
+        throw ncbi::NK::execution_aborted(); 
+    }
+}
+
+void TestCase::report_passed(const char* msg, const char* file, int line) 
+{
+    ncbi::NK::saveLocation(file, line);
+    LOG(LogLevel::e_all, file << "(" << line << "): info: " "check " << msg << " passed" << std::endl);
+}
+
+void TestCase::_REPORT_CRITICAL_ERROR_(const std::string& msg, const char* file, int line, bool is_msg)
+{ 
+    report_error( msg.c_str(), file, line, is_msg, true ); 
+}
+
+void TestCase::report_rc(rc_t rc, const char* callStr, const char* file, int line, int successExpected, bool isCritical)
+{
+    if ((successExpected && rc != 0) || (!successExpected && rc == 0))
+    {
+        const int BufSize=1024;
+        char buf[BufSize];
+        size_t num_writ=0;
+        if (0 == string_printf (buf, BufSize, &num_writ, "Unexpected return code from %s: %R\n", callStr, rc))
+        {
+            report_error(buf, file, line, true, isCritical);
+        }
+        else
+        {
+            report_error("***error message too large to print***", file, line, true, isCritical);
+        }
+    }
+    else {
+        ncbi::NK::saveLocation(file, line);
+        time_t t = time(NULL);
+        char *pp = ctime(&t);
+        size_t s = strlen(pp);
+        if (s > 0) {
+            --s;
+        }
+        pp[s] = '\0';
+        LOG(LogLevel::e_all, file << "(" << line << "): [" << pp
+            << "] info: " "check " << callStr << " "
+            << (successExpected ? "=" : "!") << "= 0 passed" << std::endl);
+    }
+}
+
diff --git a/libs/ktst/testenv.cpp b/libs/ktst/testenv.cpp
new file mode 100644
index 0000000..00fe506
--- /dev/null
+++ b/libs/ktst/testenv.cpp
@@ -0,0 +1,518 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <ktst/unit_test.hpp>
+
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+
+#include <kapp/main.h> // KAppVersion
+#include <kapp/args.h> // ArgsWhack
+#include <klib/out.h> // KOutMsg
+
+#endif
+
+#include <klib/rc.h>
+#include <sstream> 
+#include <csignal>
+#include <cstdlib>
+#include <cstring>
+
+using namespace ::ncbi::NK;
+using std::string;
+
+//const int TestEnv::TEST_CASE_TIMED_OUT=14; //SIGALRM
+//const int TestEnv::TEST_CASE_FAILED=255;
+
+bool TestEnv::in_child_process = false;
+
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+struct Args* TestEnv::args = 0;
+#endif
+
+TestEnv::TestEnv(int argc, char* argv[], ArgsHandler* argsHandler) 
+    : catch_system_errors(true)
+    , argc2(0)
+    , argv2(NULL)
+{
+    rc_t rc = process_args(argc, argv, argsHandler);
+    if (rc != 0) {
+        throw rc;
+    }
+}
+
+TestEnv::~TestEnv ()
+{
+    if (argv2 != NULL) {
+        for (int i = 0; i < argc2; ++i) {
+            free(argv2[i]);
+            argv2[i] = NULL;
+        }
+        free(argv2);
+    }
+
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+    ArgsWhack(args);
+    args = NULL;
+#endif
+}
+
+string TestEnv::lastLocation;
+LogLevel::E TestEnv::verbosity = LogLevel::e_error;
+bool TestEnv::verbositySet = false;
+
+void CC TestEnv::TermHandler() 
+{
+    SigHandler(SIGTERM);
+}
+
+void CC TestEnv::SigHandler(int sig) 
+{
+    switch (sig)
+    {
+        case SIGABRT:
+            LOG(ncbi::NK::LogLevel::e_fatal_error,
+                "fatal error: signal: SIGABRT(Abort call)\n");
+            break;
+        case SIGFPE:
+            LOG(ncbi::NK::LogLevel::e_fatal_error,
+                "fatal error: signal: SIGFPE(Floating point exception)\n");
+            break;
+        case SIGILL:
+            LOG(ncbi::NK::LogLevel::e_fatal_error,
+                "fatal error: signal: SIGILL(Illegal instruction)\n");
+            break;
+        case SIGSEGV:
+            LOG(ncbi::NK::LogLevel::e_fatal_error,
+                "fatal error: signal: SIGSEGV(Segmentation fault)\n");
+            break;
+        default:
+            LOG(ncbi::NK::LogLevel::e_fatal_error,
+                "fatal error: signal: " << sig << "\n");
+            break;
+    }
+    if (!ncbi::NK::TestEnv::lastLocation.empty())
+    {
+        LOG(ncbi::NK::LogLevel::e_fatal_error,
+            ncbi::NK::TestEnv::lastLocation << ": last checkpoint\n");
+    }
+    LOG(ncbi::NK::LogLevel::e_fatal_error, "Test is aborted\n");
+    exit(sig);
+}
+
+
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+
+#define OPTION_DBG "verbose_cmd_line"
+#define ALIAS_DBG "a"
+static const char * dbg_usage[] = { "print command line argument processing information", NULL };
+
+#define OPTION_CSE "catch_system_errors"
+#define ALIAS_CSE "c"
+static const char * cse_usage[] = { "[yes|y|no|n] catch system errors, default is yes", NULL };
+
+#define OPTION_LOG "test_log_level"
+#define ALIAS_LOG "t"
+static const char * log_usage[] = { "test log level, one of:",
+    "'all':       report all log messages",
+    "             including the passed test notification;",
+    "'test_suite': show test suite messages;",
+    "'message':   show user messages",
+    "'warning':   report warnings issued by user;",
+    "'error':     report all error conditions (default);",
+    "'fatal_error': report user or system originated fatal errors",
+    "             (for example, memory access violation);",
+    "'nothing':   do not report any information", NULL };
+
+OptDef Options[] = {
+      { OPTION_DBG, ALIAS_DBG, NULL, dbg_usage, 1, false, false }
+    , { OPTION_CSE, ALIAS_CSE, NULL, cse_usage, 1, true , false }
+    , { OPTION_LOG, ALIAS_LOG, NULL, log_usage, 1, true , false }
+};
+
+#endif
+
+rc_t TestEnv::process_args(int argc, char* argv[], ArgsHandler* argsHandler) 
+{
+    int arg2 = 9;
+    argv2 = static_cast<char**>(calloc(arg2, sizeof *argv2));
+    if (argv2 == NULL)
+    {   return RC (rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted); }
+    argv2[argc2] = strdup(argv[argc2]);
+    if (argv2[argc2] == NULL)
+    {   return RC (rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted); }
+    ++argc2;
+
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+
+    rc_t rc = ArgsMakeAndHandle(&args, argc, argv, 1,
+        Options, sizeof Options / sizeof (OptDef));
+    if (rc)
+    {   return rc; }
+
+    bool debug = false;
+    LogLevel::E detected = LogLevel::e_undefined;
+    do {
+        uint32_t pcount = 0;
+
+        rc = ArgsOptionCount(args, OPTION_DBG, &pcount);
+        if (rc)
+        {   return rc; }
+        if (pcount) {
+            debug = true;
+            LOG(LogLevel::e_nothing, "debug: debug was set to true\n");
+        }
+
+        rc = ArgsOptionCount(args, OPTION_CSE, &pcount);
+        if (rc)
+        {   return rc; }
+        if (pcount) {
+            const char* pc = NULL;
+            rc = ArgsOptionValue(args, OPTION_CSE, 0, (const void **)&pc);
+            if (rc)
+            {   return rc; }
+            if (!strcmp(pc, "n") || !strcmp(pc, "no")) {
+                catch_system_errors = false;
+                if (debug) {
+                    LOG(LogLevel::e_nothing,
+                       "debug: arg_catch_system_errors was set to false\n");
+                }
+            }
+            else {
+                if (debug) {
+                    LOG(LogLevel::e_nothing,
+                       "debug: arg_catch_system_errors was set to true\n");
+                }
+            }
+        }
+
+        rc = ArgsOptionCount(args, OPTION_LOG, &pcount);
+        if (rc)
+        {   return rc; }
+        if (pcount) {
+            const char* a = NULL;
+            rc = ArgsOptionValue(args, OPTION_LOG, 0, (const void **)&a);
+            if (rc)
+            {   return rc; }
+            if (!strcmp(a, "test_suite"))
+            { detected = LogLevel::e_test_suite; }
+            else if (strcmp(a, "all"    ) == 0)
+            { detected = LogLevel::e_all; }
+            else if (strcmp(a, "message") == 0)
+            { detected = LogLevel::e_message; }
+            else if (strcmp(a, "warning") == 0)
+            { detected = LogLevel::e_warning; }
+            else if (strcmp(a, "error"  ) == 0)
+            { detected = LogLevel::e_error; }
+            else if (strcmp(a, "nothing") == 0)
+            { detected = LogLevel::e_nothing; }
+            else if (strcmp(a, "fatal_error") == 0)
+            { detected = LogLevel::e_fatal_error; }
+            if (detected != LogLevel::e_undefined) {
+                verbosity = detected;
+                if (debug) {
+                    LOG(LogLevel::e_nothing,
+                        "debug: log_level was set to " << a << std::endl);
+                }
+            }
+            else {
+                verbosity = LogLevel::e_error;
+                if (debug) {
+                    LOG(LogLevel::e_nothing,
+                        "debug: log_level was set to error\n");
+                }
+            }
+        }
+    } while (0);
+
+    if (verbosity == LogLevel::e_undefined) {
+        verbosity = LogLevel::e_error;
+        if (debug) {
+            LOG(LogLevel::e_nothing,
+                "debug: log_level was set to error\n");
+        }
+    }
+#else
+
+    rc_t rc = 0;
+
+    bool debug = false;
+    LogLevel::E detected = LogLevel::e_undefined;
+    char arg_catch_system_errors[] = "-catch_system_errors=";
+    char arg_log_level          [] = "-l=";
+    char arg_app_args           [] = "-app_args=";
+    for (int i = 1; i < argc; ++i)
+    {
+        if (verbositySet) {
+            break;
+        }
+        if (strncmp(argv[i], arg_log_level, strlen(arg_log_level))
+            == 0)
+        {
+            char* a = argv[i] + strlen(arg_log_level);
+            if (strcmp(a, "test_suite") == 0)
+                detected = LogLevel::e_test_suite;
+            else if (strcmp(a, "all"    ) == 0)
+                detected = LogLevel::e_all;
+            else if (strcmp(a, "message") == 0)
+                detected = LogLevel::e_message;
+            else if (strcmp(a, "warning") == 0)
+                detected = LogLevel::e_warning;
+            else if (strcmp(a, "error"  ) == 0)
+                detected = LogLevel::e_error;
+            else if (strcmp(a, "nothing") == 0)
+                detected = LogLevel::e_nothing;
+            else if (strcmp(a, "fatal_error") == 0)
+                detected = LogLevel::e_fatal_error;
+            if (detected != LogLevel::e_undefined)
+            {
+                verbosity = detected;
+                if (debug)
+                {
+                    LOG(LogLevel::e_nothing,
+                        "debug: log_level was set to " << a << std::endl);
+                }
+            }
+            else
+            {
+                verbosity = LogLevel::e_error;
+                if (debug)
+                {
+                    LOG(LogLevel::e_nothing,
+                        "debug: log_level was set to error\n");
+                }
+            }
+        }
+        else if (strncmp(argv[i], arg_catch_system_errors,
+            strlen(arg_catch_system_errors)) == 0)
+        {
+            char* a = argv[i] + strlen(arg_catch_system_errors);
+            if (strcmp(a, "n") == 0 || strcmp(a, "no") == 0)
+            {
+                catch_system_errors = false;
+                if (debug)
+                {
+                    LOG(LogLevel::e_nothing,
+                       "debug: arg_catch_system_errors was set to false\n");
+                }
+            }
+            else
+            {
+                if (debug)
+                {
+                    LOG(LogLevel::e_nothing,
+                       "debug: arg_catch_system_errors was set to true\n");
+                }
+            }
+        }
+        else if (strcmp(argv[i], "-debug") == 0)
+        {
+            debug = true;
+            LOG(LogLevel::e_nothing, "debug: debug was set to true\n");
+        }
+        else if (strcmp(argv[i], "-h") == 0)
+        {
+            if (debug)
+            {
+                LOG(LogLevel::e_nothing, "debug: help was set to true\n");
+            }
+            std::cout << "Usage:\n"
+                      << argv[0]
+                      << " [-debug] [-catch_system_errors=[yes|y|no|n]]\n"
+                         "      [-app_args='<value>'] [-l=<value>] [-h]\n"
+                "where:\n"
+                "debug              - Print recognized command line arguments\n"
+                "                     (should be specified first)\n"
+                "catch_system_errors -  Allows to switch between catching\n"
+                "                     and ignoring system errors (signals)\n"
+                "app_args           - Allows to pass command line arguments\n"
+                "                     to application handler\n"
+                "    (see unit_test.hpp/FIXTURE_TEST_SUITE_WITH_ARGS_HANDLER)\n"
+                "\n"
+                "l (log_level)       - Specifies log level\n"
+                "\tall        - report all log messages\n"
+                "\t             including the passed test notification\n"
+                "\ttest_suite - show test suite messages\n"
+                "\tmessage    - show user messages\n"
+                "\twarning    - report warnings issued by user\n"
+                "\terror      - report all error conditions (default)\n"
+                "\tfatal_error- report user or system originated fatal errors\n"
+                "\t             (for example, memory access violation)\n"
+                "\tnothing    - do not report any information\n"
+                "\n"
+                "h (help)            - this help message\n";
+            exit(0);
+        }
+        else if (strncmp(argv[i], arg_app_args, strlen(arg_app_args)) == 0)
+        {
+            char* a = argv[i] + strlen(arg_app_args);
+            if (debug)
+            {
+                LOG(LogLevel::e_nothing,
+                    string("debug: arg_app_args was detected: ") + a + "\n");
+            }
+            char* pch = strtok(a ," ");
+            while (pch != NULL) {
+                if (argc2 >= arg2) {
+                    arg2 *= 2;
+                    char** tmp = static_cast<char**>(
+                        realloc(argv2, arg2 * sizeof *argv2));
+                    if (tmp == NULL) {
+                        return RC(
+                            rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted);
+                    }
+                    argv2 = tmp;
+                }
+                argv2[argc2] = strdup(pch);
+                if (argv2[argc2] == NULL) {
+                    return RC(
+                        rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted);
+                }
+                ++argc2;
+                pch = strtok(NULL, " ");
+            }
+        }
+    }
+
+    if (verbosity == LogLevel::e_undefined)
+    {
+        verbosity = LogLevel::e_error;
+        if (debug)
+        {
+            LOG(LogLevel::e_nothing,
+                "debug: log_level was set to error\n");
+        }
+    }
+#endif
+
+    if (rc == 0) {
+        if (argsHandler)
+        {	rc = argsHandler(argc2, argv2); }
+    }
+
+    return rc;
+}
+
+void ::ncbi::NK::saveLocation(const char* file, int line) 
+{
+    std::ostringstream s;
+    s << file << "(" << line << ")";
+    TestEnv::lastLocation = s.str();
+}
+
+void ::ncbi::NK::_REPORT_CRITICAL_ERROR_(const string& msg, const char* file, int line, bool is_msg)
+{
+    LOG(ncbi::NK::LogLevel::e_error, file << "(" << line << "): ");
+    LOG(ncbi::NK::LogLevel::e_error, "fatal ");
+    LOG(ncbi::NK::LogLevel::e_error, "error in fixture: ");
+    if (is_msg) {
+        LOG(ncbi::NK::LogLevel::e_error, msg);
+    }
+    else {
+        LOG(ncbi::NK::LogLevel::e_error, "critical ");
+        LOG(ncbi::NK::LogLevel::e_error, "check " << msg << " failed");
+    }
+    LOG(ncbi::NK::LogLevel::e_error, std::endl);
+    throw ncbi::NK::execution_aborted();
+ }
+
+ncbi::NK::TestRunner* 
+ncbi::NK::GetTestSuite(void)
+{ 
+    static ncbi::NK::TestRunner t; 
+    return &t; 
+}
+
+rc_t CC TestEnv::UsageSummary(const char* progname) {
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+    return KOutMsg(
+        "Usage:\n"
+        "  %s [--verbose_cmd_line] [--catch_system_errors [yes|y|no|n]] "
+        "[-t <value>] [-h] [...]\n", progname);
+#else
+    std::cout
+        << "Usage:\n"
+        << progname
+        << " [-debug] [-catch_system_errors=[yes|y|no|n]] "
+        "[-l=<value>] [-h] [...]\n";
+    return 0;
+#endif
+}
+
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+rc_t CC TestEnv::Usage(const Args* args)
+{
+    const char* progname = UsageDefaultName;
+    const char* fullpath = UsageDefaultName;
+
+    rc_t rc = (args == NULL) ?
+        RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull):
+        ArgsProgram(args, &fullpath, &progname);
+
+    if (rc != 0)
+        progname = fullpath = UsageDefaultName;
+
+    UsageSummary(progname);
+
+    KOutMsg("\nOptions:\n");
+    
+    HelpOptionLine(ALIAS_DBG, OPTION_DBG, NULL, dbg_usage);
+    HelpOptionLine(ALIAS_CSE, OPTION_CSE, NULL, cse_usage);
+    HelpOptionLine(ALIAS_LOG, OPTION_LOG, NULL, log_usage);
+    KOutMsg("\n");
+    HelpOptionsStandard();
+    HelpVersion(fullpath, KAppVersion());
+    
+    return rc;
+}
+#else
+rc_t CC TestEnv::Usage(const char *progname)
+{
+    UsageSummary ( progname );
+    std::cout <<
+        "where:\n"
+        "debug - Print recognized command line arguments (should be specified first)\n"
+        "catch_system_errors - "
+        "Allows to switch between catching and ignoring system errors (signals)\n"
+        "l (log_level) - Specifies log level\n"
+        "\tall        - report all log messages\n"
+        "\t             including the passed test notification\n"
+        "\ttest_suite - show test suite messages\n"
+        "\tmessage    - show user messages\n"
+        "\twarning    - report warnings issued by user\n"
+        "\terror      - report all error conditions (default)\n"
+        "\tfatal_error- report user or system originated fatal errors\n"
+        "\t             (for example, memory access violation)\n"
+        "\tnothing    - do not report any information\n"
+        "h (help) - this help message\n";
+    return 0;
+}
+#endif
+
+bool TestEnv::Sleep(unsigned int seconds)
+{
+    return TestEnv::SleepMs(seconds*1000);
+}
+
diff --git a/libs/ktst/testrunner.cpp b/libs/ktst/testrunner.cpp
new file mode 100644
index 0000000..0b4fbd6
--- /dev/null
+++ b/libs/ktst/testrunner.cpp
@@ -0,0 +1,86 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <ktst/unit_test.hpp>
+
+using namespace ncbi::NK;
+
+TestRunner::TestRunner() : argc(0), argv(NULL) {}
+
+void TestRunner::ReportTestNumber(void) 
+{
+    T::size_type sz = _cases.size();
+    if (sz == 1) {
+       LOG(LogLevel::e_fatal_error, "Running " << sz << " test case...\n");
+    } else if (sz > 1) {
+       LOG(LogLevel::e_fatal_error, "Running " << sz << " test cases...\n");
+    }
+}
+
+void TestRunner::SetArgs(int argc, char* argv[]) 
+{
+    this->argc = argc;
+    this->argv = argv;
+}
+
+void TestRunner::Add(ncbi::NK::TestInvoker* t) 
+{
+    if (t) 
+    {
+        _cases.push_back(t);
+    }
+}
+
+counter_t TestRunner::Run(void* globalFixture) const throw ()
+{
+    counter_t ec = 0;
+    for (TCI it = _cases.begin(); it != _cases.end(); ++it) 
+    {
+        ncbi::NK::TestInvoker* c = *it;
+        try {
+            LOG(LogLevel::e_test_suite,
+                "Entering test case \"" << c->GetName() << "\"\n");
+            c->Run(globalFixture);
+        } 
+        catch (...) 
+        {
+            if (c->GetErrorCounter() == 0)
+                ++ec;
+        }
+        counter_t tc = c->GetErrorCounter();
+        if (tc == 0) {
+            LOG(LogLevel::e_test_suite,
+                "Leaving test case \"" << c->GetName() << "\"\n");
+        }
+        else {
+            LOG(LogLevel::e_test_suite,
+                "Leaving failed test case \"" << c->GetName() << "\"\n");
+        }
+        ec += tc;
+    }
+    return ec;
+}
+
diff --git a/libs/ktst/unix/systestenv.cpp b/libs/ktst/unix/systestenv.cpp
new file mode 100644
index 0000000..a41e747
--- /dev/null
+++ b/libs/ktst/unix/systestenv.cpp
@@ -0,0 +1,137 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <ktst/unit_test_suite.hpp>
+
+#include <sstream>
+
+#include <csignal> // sigaction, not necessarily in csignal :-/
+#include <cstdlib>
+#include <cstring>
+
+#include <time.h>
+#include <unistd.h> /* fork */
+
+#include <sys/wait.h>
+#include <sys/types.h>
+
+using namespace std;
+using namespace ncbi::NK;
+
+#undef REPORT_ERROR
+#define REPORT_ERROR(msg) _REPORT_CRITICAL_ERROR_("TestEnv::" msg, __FILE__, __LINE__, true);
+
+static void alarmHandler(int)
+{
+    cerr << "child process timed out" << endl;
+    
+    exit(TestEnv::TEST_CASE_TIMED_OUT);
+}
+
+int TestEnv::RunProcessTestCase(TestCase& obj, void(TestCase::*meth)(), int timeout)
+{
+    int pid=fork();
+    if (pid == -1)
+    {
+        REPORT_ERROR("RunProcessTestCase: fork() failed");
+    }
+    if (pid == 0)
+    {   /* child process */
+        if (timeout != 0)
+        {
+            struct sigaction act;
+            memset(&act, 0, sizeof act);
+            act.sa_handler = alarmHandler;
+            act.sa_flags = SA_RESETHAND;
+            sigaction(SIGALRM , &act, NULL);        
+            alarm(timeout);
+        }
+        try 
+        {
+            in_child_process = true;
+            (obj.*meth)();
+        }   
+        catch (const exception& ex)
+        {
+            cerr << obj.GetName() << " threw " << ex.what() << endl;
+            exit(TEST_CASE_FAILED);
+        }
+        catch (const ncbi::NK::execution_aborted&)
+        {
+            cerr << obj.GetName() << " aborted " << endl;
+            exit(TEST_CASE_FAILED);
+        }
+        catch (...)
+        {
+            cerr << obj.GetName() << " threw something " << endl;
+            exit(TEST_CASE_FAILED);  
+        }
+        exit(0);
+    }
+    /* parent process */
+    int status;
+    if (waitpid(pid, &status, 0) != pid) /* suspend until the child terminates */
+    {   
+        REPORT_ERROR("RunProcessTestCase: wait() failed");
+    }
+    if (!WIFEXITED(status)) 
+    {   
+        REPORT_ERROR("RunProcessTestCase: child exited abnormally");
+    }
+    
+    return WEXITSTATUS(status); /* exit status of the child process */
+}
+
+bool TestEnv::SleepMs(unsigned int milliseconds)
+{
+    struct timespec time = { milliseconds / 1000, (milliseconds % 1000) * 1000 * 1000 };
+    return nanosleep(&time, NULL) == 0; 
+}
+
+void TestEnv::set_handlers(void)
+{
+    struct sigaction act;
+    memset(&act, 0, sizeof act);
+    act.sa_handler = SigHandler;
+    act.sa_flags = SA_RESETHAND;
+    if (sigaction(SIGFPE , &act, NULL) != 0)    REPORT_ERROR("set_handlers: sigaction() failed");
+    if (sigaction(SIGILL , &act, NULL) != 0)    REPORT_ERROR("set_handlers: sigaction() failed");
+    if (sigaction(SIGSEGV , &act, NULL) != 0)   REPORT_ERROR("set_handlers: sigaction() failed");
+}
+
+string TestEnv::GetPidString()
+{
+    ostringstream str;
+    str << getpid();
+    return str.str();
+}
+
+string TestEnv::FormatLocation(const string& p_file, uint64_t p_line)
+{
+    ostringstream out;
+    out << p_file << ":" << p_line << ": ";
+    return out.str();
+}
diff --git a/libs/kxml/Makefile b/libs/kxml/Makefile
new file mode 100644
index 0000000..3635fa3
--- /dev/null
+++ b/libs/kxml/Makefile
@@ -0,0 +1,117 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/kxml
+
+INT_LIBS = \
+	libkxml \
+	libkxfs
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+ifeq (1,$(HAVE_XML2))
+
+ifneq (,$(XML2_INCDIR))
+INCDIRS += $(addprefix -I,$(XML2_INCDIR))
+endif
+
+all std: makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+else
+
+all std: $(ALL_LIBS)
+
+$(INT_LIBS):
+	@ echo "NOTE - internal library $(@F) cannot be built:"         \
+	       "It requires 'libxml2' and its development headers."
+
+$(EXT_LIBS):
+	@ echo "NOTE - library $(@F) cannot be built:"                  \
+	       "It requires 'libxml2' and its development headers."
+endif
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# tiny, lightweight interface to libxml
+#
+$(ILIBDIR)/libkxml: $(addprefix $(ILIBDIR)/libkxml.,$(ILIBEXT))
+
+XML_SRC = \
+	xml
+
+XML_OBJ = \
+	$(addsuffix .$(LOBX),$(XML_SRC))
+
+XML_LIB = \
+    
+$(ILIBDIR)/libkxml.$(LIBX): $(XML_OBJ)
+	$(LD) --slib -o $@ $^ $(XML_LIB)
+
+#-------------------------------------------------------------------------------
+# kxfs
+#
+$(ILIBDIR)/libkxfs: $(addprefix $(ILIBDIR)/libkxfs.,$(ILIBEXT))
+
+KXFS_SRC = \
+	xtoc \
+	xtoc-parsexml
+
+KXFS_OBJ = \
+	$(addsuffix .$(LOBX),$(KXFS_SRC))
+
+KXFS_LIB = \
+
+$(ILIBDIR)/libkxfs.$(LIBX): $(KXFS_OBJ)
+	$(LD) --slib -o $@ $^ $(KXFS_LIB)
+
diff --git a/libs/kxml/xml.c b/libs/kxml/xml.c
new file mode 100644
index 0000000..ce44542
--- /dev/null
+++ b/libs/kxml/xml.c
@@ -0,0 +1,1705 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+struct s_KNodeNamelist;
+#define KNAMELIST_IMPL struct s_KNodeNamelist
+
+#include <sysalloc.h>
+#include <kxml/xml.h>
+
+#include <klib/impl.h>
+#include <kfs/file.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+#include <klib/text.h>
+
+#include <os-native.h> /* for strndup on mac */
+#include <strtol.h>
+
+#include <libxml/xmlreader.h>
+#include <libxml/xpath.h>
+
+#include <assert.h>
+#include <string.h>
+
+
+#define XML_DEBUG(msg) DBGMSG (DBG_XML, DBG_FLAG(DBG_XML_XML), msg)
+
+/********* XML manager ********/
+
+struct KXMLMgr {
+    atomic32_t refcount;
+};
+
+static KXMLMgr s_KXMLMgr;
+/** calls vsnprintf and converts errors into KXMLErr */
+static rc_t s_KXML_vsnprintf(char *str,
+    size_t size,
+    const char *format,
+    va_list ap)
+{
+    int printed = vsnprintf(str, size, format, ap);
+    if (printed < 0) {
+        return RC ( rcXML, rcDoc, rcConstructing, rcData, rcCorrupt );
+    }
+    if ((size_t) printed >= size) { /* buffer is too small */
+        return RC ( rcXML, rcDoc, rcConstructing, rcBuffer, rcExhausted );
+    }
+    return 0;
+}
+
+rc_t KXMLMgrMakeRead(const KXMLMgr **result)
+{
+    if (!result) {
+        return RC ( rcXML, rcMgr, rcConstructing, rcParam, rcNull );
+    }
+    if (atomic32_read_and_add(&s_KXMLMgr.refcount, 1) == 0) {
+        xmlInitParser();
+    }
+    *result = &s_KXMLMgr;
+    return 0;
+}
+
+rc_t KXMLMgrAddRef(const KXMLMgr *cself)
+{
+    if (cself) {
+        KXMLMgr *self = (KXMLMgr*) cself;
+        atomic32_inc(&self->refcount);
+    }
+    return 0;
+}
+
+rc_t KXMLMgrRelease(const KXMLMgr *cself)
+{
+    if (cself) {
+        KXMLMgr *self = (KXMLMgr*) cself;
+        if (atomic32_dec_and_test(&self->refcount)) {
+            xmlCleanupParser();
+        }
+    }
+    return 0;
+}
+
+/********* XML doucument ********/
+struct KXMLDoc {
+    const KXMLMgr* parent;
+    xmlDocPtr doc;
+    xmlXPathContextPtr xpathCtx;
+    atomic32_t refcount;
+};
+
+/*static int s_XmlInputReadCallback(void * context, 
+					 char * buffer, 
+					 int len)
+{
+    static size_t offset = 0;
+    KFile *src = (KFile*) context;
+    assert(src);
+    {
+        size_t num_read = 0;
+        rc_t rc = KFileRead(src, offset, buffer, len, &num_read);
+        if (rc)
+        {   return -1; }
+        offset += num_read;
+        return num_read;
+    }
+}*/
+
+/* SchemaValidate
+ *  validates an XML source file against an XSD schema.
+ * schema parameter is the path to the schema
+ */
+#if 0
+rc_t KXMLMgrSchemaValidate ( const KXMLMgr *self,
+    struct KFile const *src,
+    const char *schema )
+{
+    if (!src || !schema)
+    {   return RC(rcXML, rcDoc, rcValidating, rcParam, rcNull); }
+
+    {
+        rc_t rc = 0;
+        xmlTextReaderPtr reader
+            = xmlReaderForIO(s_XmlInputReadCallback, 0, (void*)src, "/", 0, 0);
+        if (!reader)
+        {   return RC(rcXML, rcDoc, rcValidating, rcSchema, rcUnknown); }
+        {
+            int r = xmlTextReaderSchemaValidate(reader, schema);
+            if (r != 0) {
+                rc = RC(rcXML, rcDoc, rcValidating, rcSchema, rcUnknown);
+            } else {
+                do {
+                    r = xmlTextReaderRead(reader);
+                } while (r == 1);
+                if (r == -1) {
+                    rc = RC(rcXML, rcDoc, rcValidating, rcDoc, rcInvalid);
+                } else {
+                    assert(r == 0);
+                    r = xmlTextReaderIsValid(reader);
+                    if (r != 1)
+                    {   rc = RC(rcXML, rcDoc, rcValidating, rcDoc, rcInvalid); }
+                }
+            }
+        }
+        xmlTextReaderClose(reader);
+        return rc;
+    }
+}
+#endif
+
+static void s_xmlGenericErrorDefaultFunc(void *ctx ATTRIBUTE_UNUSED,
+    const char *msg,
+    ...)
+{
+    va_list args;
+    va_start(args, msg);
+/*  vfprintf(stderr, msg, args); */
+    va_end(args);
+}
+
+static rc_t s_XmlReadFile(const KFile *src, char** aBuffer, uint64_t* aSize)
+{
+    rc_t rc = 0;
+    bool unknownFileSize = false;
+    uint64_t size = 0;
+    uint32_t t = KFileType(src);
+    assert(aBuffer && aSize);
+    *aBuffer = NULL;
+    *aSize = 0;
+
+    /* Read KFile by KFileRead: can use mmap instead */
+    if (t == kfdFIFO) {
+        XML_DEBUG (("%s: reading stdin ?", __func__));
+        unknownFileSize = true;
+        size = 0x10000;
+    }
+    else {
+        rc = KFileSize(src, &size);
+        if (rc)
+        {   return rc; }
+        if (!size) {
+            rc = RC(rcXML, rcDoc, rcConstructing, rcFile, rcEmpty);
+            return rc;
+        }
+    }
+    {
+        size_t num_read = 0;
+        char* buffer = (char*) malloc(size);
+        if (!buffer)
+        {   return RC(rcXML, rcDoc, rcConstructing, rcMemory, rcExhausted); }
+        rc = KFileRead(src, 0, buffer, size, &num_read);
+        if (rc == 0) {
+            if (!unknownFileSize) {
+                if (num_read != size) {
+                    rc = RC(rcXML, rcDoc, rcConstructing, rcFile, rcIncomplete);
+                }
+            }
+            else {
+                if (num_read == size) {
+                    rc = RC(rcXML, rcDoc, rcConstructing, rcFile, rcTooBig);
+                }
+            }
+        }
+        if (rc) {
+            free(buffer);
+            return rc;
+        }
+        *aBuffer = buffer;
+        *aSize = size;
+    }
+
+    return rc;
+}
+
+static int s_UseDefaultErrorHandler = 0;
+
+rc_t KXMLMgrMakeDocRead(const KXMLMgr *self,
+    const KXMLDoc **result,
+    const KFile *src)
+{
+    rc_t rc = 0;
+    if (self && src) {
+        char* buffer = NULL;
+        uint64_t size = 0;
+        rc = s_XmlReadFile(src, &buffer, &size);
+        if (rc)
+        {    return rc; }
+        rc = KXMLMgrMakeDocReadFromMemory(self, result, buffer, size);
+        free(buffer);
+    }
+    else
+    {    rc = RC ( rcXML, rcDoc, rcConstructing, rcParam, rcNull ); }
+    return rc;
+}
+
+rc_t KXMLMgrMakeDocReadFromMemory(const KXMLMgr *self,
+    const KXMLDoc **result,
+    const char* buffer,
+    uint64_t size)
+{
+    rc_t rc = 0;
+    if (!s_UseDefaultErrorHandler)
+    {   xmlSetGenericErrorFunc(0, s_xmlGenericErrorDefaultFunc); }
+    if (!result)
+    {   return RC ( rcXML, rcDoc, rcConstructing, rcParam, rcNull ); }
+    *result = 0;
+    if (self && buffer && size) {
+        KXMLDoc *obj = (KXMLDoc*) malloc(sizeof(KXMLDoc));
+        if (!obj)
+        {   return RC ( rcXML, rcDoc, rcConstructing, rcMemory, rcExhausted ); }
+        atomic32_set(&obj->refcount, 1);
+        obj->parent = self;
+        KXMLMgrAddRef(obj->parent);
+        obj->doc = 0;
+        obj->xpathCtx = 0;
+
+        /* Load XML document */
+        obj->doc = xmlParseMemory(buffer, size);
+
+        if (!obj->doc) {
+            KXMLDocRelease(obj);
+            return RC ( rcXML, rcDoc, rcConstructing, rcXmlDoc, rcInvalid );
+        }
+
+        /* Create xpath evaluation context */
+        obj->xpathCtx = xmlXPathNewContext(obj->doc);
+        if (!obj->xpathCtx) {
+            KXMLDocRelease(obj);
+            return RC ( rcXML, rcDoc, rcConstructing, rcMemory, rcCorrupt );
+        }
+        *result = obj;
+        rc = 0;
+    }
+    else {
+        rc = RC ( rcXML, rcDoc, rcConstructing, rcParam, rcNull );
+    }
+    return rc;
+}
+
+rc_t KXMLDocAddRef(const KXMLDoc *cself)
+{
+    if (cself) {
+        KXMLDoc *self = (KXMLDoc*) cself;
+        atomic32_inc(&self->refcount);
+    }
+    return 0;
+}
+
+rc_t KXMLDocRelease(const KXMLDoc *cself)
+{
+    if (cself) {
+        KXMLDoc *self = (KXMLDoc*) cself;
+        if (atomic32_dec_and_test(&self->refcount)) {
+            if (self->xpathCtx) {
+                xmlXPathFreeContext(self->xpathCtx);
+                self->xpathCtx = 0;
+            }
+            if (self->doc) {
+                xmlFreeDoc(self->doc);
+                self->doc = 0;
+            }
+            KXMLMgrRelease(self->parent);
+            self->parent = 0;
+            free(self);
+        }
+    }
+    return 0;
+}
+
+/********* XML node set ********/
+
+struct KXMLNodeset {
+    atomic32_t refcount;
+    const KXMLDoc *parent;
+    char *path;
+    xmlXPathObjectPtr xpathObj;
+};
+
+/** KXMLNodeset constructor */
+static rc_t KXMLNodeset_cTor(const KXMLDoc *parent,
+    const KXMLNodeset **result,
+    const char *path)
+{
+    assert(parent && result && path && path[0]);
+    if (!parent->xpathCtx) {
+        return RC ( rcXML, rcDoc, rcConstructing, rcData, rcIncorrect );
+    }
+    {
+        size_t size;
+        KXMLNodeset *obj = (KXMLNodeset*) malloc(sizeof(KXMLNodeset));
+        if (!obj) {
+            return RC ( rcXML, rcDoc, rcConstructing, rcMemory, rcExhausted );
+        }
+        atomic32_set(&obj->refcount, 1);
+        obj->parent = parent;
+        obj->path = 0;
+        KXMLDocAddRef(obj->parent);
+        obj->xpathObj = xmlXPathEvalExpression(BAD_CAST path, parent->xpathCtx);
+        if (!obj->xpathObj) {
+            KXMLNodesetRelease(obj);
+            return RC ( rcXML, rcDoc, rcConstructing, rcData, rcCorrupt );
+        }
+        if( obj->xpathObj->type != XPATH_NODESET ) {
+            KXMLNodesetRelease(obj);
+            return RC(rcXML, rcDoc, rcConstructing, rcData, rcUnsupported );
+        }
+        obj->path = string_dup(path, string_measure(path, &size));
+        if (!obj->path) {
+            KXMLNodesetRelease(obj);
+            return RC ( rcXML, rcDoc, rcConstructing, rcMemory, rcExhausted );
+        }
+        *result = obj;
+    }
+    return 0;
+}
+
+static rc_t s_KXML_snprintf(char *str,
+    size_t size,
+    const char *format,
+    ...)
+{
+    va_list args;
+    va_start(args, format);
+    {
+        rc_t rc = s_KXML_vsnprintf(str, size, format, args);
+        va_end(args);
+        return rc;
+    }
+}
+
+#define XPATH_MAX_LEN 1001
+/** Opens a node set relative to current node */
+rc_t KXMLDocOpenNodesetRead(const KXMLDoc *self,
+    const KXMLNodeset **result,
+    const char *path,
+    ...)
+{
+    rc_t rc = 0;
+    va_list args;
+    va_start ( args, path );
+    rc = KXMLDocVOpenNodesetRead ( self, result, path, args );
+    va_end ( args );
+    return rc;
+}
+
+rc_t KXMLDocVOpenNodesetRead(const KXMLDoc *self,
+    const KXMLNodeset **result,
+    const char *path,
+    va_list args)
+{
+    rc_t rc = 0;
+
+    if (!result || !path || !path[0]) {
+        return RC ( rcXML, rcDoc, rcConstructing, rcParam, rcNull );
+    }
+
+    *result = 0;
+
+    if (self) {
+        char buffer[XPATH_MAX_LEN];
+        rc = s_KXML_vsnprintf(buffer, sizeof(buffer), path, args);
+        if (rc != 0) {
+            return rc;
+        }
+        rc = KXMLNodeset_cTor(self, result, buffer);
+    }
+    else { rc = RC ( rcXML, rcDoc, rcConstructing, rcSelf, rcNull ); }
+
+    return rc;
+}
+
+rc_t KXMLNodesetAddRef(const KXMLNodeset *cself)
+{
+    if (cself) {
+        KXMLNodeset *self = (KXMLNodeset*) cself;
+        atomic32_inc(&self->refcount);
+    }
+    return 0;
+}
+
+rc_t KXMLNodesetRelease(const KXMLNodeset *cself)
+{
+    if (cself) {
+        KXMLNodeset *self = (KXMLNodeset*) cself;
+        if (atomic32_dec_and_test(&self->refcount)) {
+            if (self->xpathObj) {
+                xmlXPathFreeObject(self->xpathObj);
+                self->xpathObj = 0;
+            }
+            KXMLDocRelease(self->parent);
+            self->parent = 0;
+            if (self->path) {
+                free(self->path);
+                self->path = 0;
+            }
+            free(self);
+        }
+    }
+    return 0;
+}
+
+rc_t KXMLNodesetCount(const KXMLNodeset *self,
+    uint32_t *result)
+{
+    if (!result)
+    { return RC ( rcXML, rcDoc, rcListing, rcParam, rcNull ); }
+
+    *result = 0;
+
+    if (self && self->xpathObj) {
+        const xmlNodeSetPtr nodes = self->xpathObj->nodesetval;
+        if (nodes)
+        { *result = nodes->nodeNr; }
+        return 0;
+    }
+    else {
+        return RC ( rcXML, rcDoc, rcAccessing, rcSelf, rcNull );
+    }
+}
+
+/********* XML node ********/
+
+struct KXMLNode {
+    const KXMLNodeset *parent;
+    /* use parent's refcount; */
+
+    /* parent and index are used to find a node within a nodeset
+    (when children == 0) */
+    int32_t idx;
+
+    /* when children != 0 then children is an XML node,
+    path is node's path relative to parent's path */
+    const struct _xmlNode *children;
+    char *path;
+};
+
+static rc_t s_KXMLNode_cTor(const KXMLNodeset *self,
+    const KXMLNode **result,
+    uint32_t idx,
+    const struct _xmlNode *children,
+    char *path)
+{
+    KXMLNode *obj = (KXMLNode*) malloc(sizeof(KXMLNode));
+    if (!obj) {
+        return RC ( rcXML, rcDoc, rcAccessing, rcMemory, rcExhausted );
+    }
+    obj->parent = self;
+    obj->path = 0;
+    obj->children = children;
+    if (children) {
+        size_t size = 0;
+        size_t path_size;
+        if (path)
+        {   size += string_measure(path, &path_size) + 1; }
+        if (children->name)
+        {   
+            size_t sz;
+            size += string_measure((char*)children->name, &sz); 
+        }
+        obj->path = (char*)malloc(size + 1);
+        if (!obj->path) {
+            free(obj);
+            return RC ( rcXML, rcDoc, rcAccessing, rcMemory, rcExhausted );
+        }
+        *obj->path = 0;
+        if (path && path[0]) {
+            string_copy(obj->path, size + 1, path, path_size);
+            strcat(obj->path, "/");
+        }
+        strcat(obj->path, (char*)children->name);
+    }
+    KXMLNodesetAddRef(obj->parent);
+    obj->idx = idx;
+    *result = obj;
+    return 0;
+}
+
+/* GetName
+ */
+rc_t KXMLNodeGetName ( const KXMLNode *self, const char **name ) {
+    if (!self)
+    {   return RC ( rcXML, rcNode, rcAccessing, rcSelf, rcNull ); }
+    if (!name)
+    {   return RC ( rcXML, rcNode, rcAccessing, rcParam, rcNull ); }
+    *name = 0;
+    if (!self->children) {
+        assert(self->parent);
+        *name = self->parent->path;
+        /*TODO
+        here name if not the last node name but absolute name from xml root*/
+    } else {
+        *name = (const char*)self->children->name;
+    }
+    return 0;
+}
+
+rc_t KXMLNodeElementName ( const KXMLNode *self, const char **name )
+{
+    if( self == NULL ) {
+        return RC ( rcXML, rcNode, rcAccessing, rcSelf, rcNull );
+    }
+    if( name == NULL ) {
+        return RC ( rcXML, rcNode, rcAccessing, rcParam, rcNull );
+    }
+    *name = NULL;
+    if( self->children == NULL ) {
+        *name = (const char*)self->parent->xpathObj->nodesetval->nodeTab[self->idx]->name;
+    } else {
+        *name = (const char*)self->children->name;
+    }
+    return 0;
+}
+
+rc_t KXMLNodesetGetNodeRead(const KXMLNodeset *self,
+    const KXMLNode **result,
+    uint32_t idx)
+{
+    rc_t rc = 0;
+    uint32_t count = 0;
+
+    if (!result)
+    { return RC ( rcXML, rcNode, rcAccessing, rcParam, rcNull ); }
+
+    *result = 0;
+
+    if (self) {
+        rc = KXMLNodesetCount(self, &count);
+        if (rc == 0) {
+            assert(count >= 0);
+            if (count == 0) {
+            /* TODO: this test should be made when KXMLNodeset is created */
+                rc = RC(rcXML, rcNode, rcAccessing, rcNode, rcNotFound);
+            }
+            else if (idx < count) {
+                rc = s_KXMLNode_cTor(self, result, idx, NULL, NULL);
+            }
+            else {
+                rc = RC (rcXML, rcNode, rcAccessing, rcParam, rcIncorrect);
+            }
+        }
+    }
+    else {
+        rc = RC ( rcXML, rcDoc, rcAccessing, rcSelf, rcCorrupt );
+    }
+    return rc;
+}
+
+/** Opens a node set relative to current node */
+rc_t KXMLNodeVOpenNodesetRead ( const KXMLNode *self,
+    struct KXMLNodeset const **result, const char *path, va_list args )
+{
+    rc_t rc = 0;
+
+    if (!result || !path || !path[0])
+    { return RC ( rcXML, rcNode, rcAccessing, rcParam, rcNull ); }
+
+    *result = 0;
+
+    if (self == NULL)
+    {  return RC ( rcXML, rcNode, rcAccessing, rcSelf, rcNull );}
+
+    if (self && self->parent && self->parent->path) {
+        char *newPath = 0;
+        char buffer[XPATH_MAX_LEN];
+        char outpath[XPATH_MAX_LEN];
+        rc = s_KXML_vsnprintf(outpath, sizeof(outpath), path, args);
+        if (rc != 0)
+        { return rc; }
+
+        if (path[0] == '/')
+        { newPath = outpath; }
+        else {
+            size_t size;
+            if ((string_measure(self->parent->path, &size) + 1 + string_measure(outpath, &size) + 1 + 3)
+                > XPATH_MAX_LEN)
+            {
+                /* buffer is too small */
+                return RC
+                    ( rcXML, rcNode, rcAccessing, rcBuffer, rcExhausted );
+            }
+            if( self->parent->path[0] == '/' && self->parent->path[1] == '\0' ) {
+                /* correctly construct child path if parent path is "/" */
+                rc = s_KXML_snprintf(buffer, sizeof(buffer), "/%s", outpath);
+            } else {
+                rc = s_KXML_snprintf(buffer, sizeof(buffer), "(%s)[%d]/%s", self->parent->path, self->idx + 1, outpath);
+            }
+            newPath = buffer;
+        }
+        assert(self->parent && self->parent->parent);
+        rc = KXMLNodeset_cTor(self->parent->parent, result, newPath);
+    }
+    else { rc = RC ( rcXML, rcNode, rcAccessing, rcSelf, rcCorrupt ); }
+
+    return rc;
+}
+
+/** Opens a node set relative to current node */
+rc_t KXMLNodeOpenNodesetRead(const KXMLNode *self,
+    const KXMLNodeset **result,
+    const char *path,
+    ...)
+{
+    rc_t rc = 0;
+    va_list args;
+    va_start ( args, path );
+    rc = KXMLNodeVOpenNodesetRead ( self, result, path, args );
+    va_end ( args );
+    return rc;
+}
+
+rc_t KXMLNodeRelease(const KXMLNode *cself) {
+    if (cself) {
+        KXMLNode *self = (KXMLNode*) cself;
+        KXMLNodesetRelease(self->parent);
+        free(self->path);
+        free(self);
+    }
+    return 0;
+}
+
+/** Reads node's value.
+remaining can be NULL */
+/* Implementation:
+Iterates over all XML_TEXT_NODE children starting from firstChild.
+Uses state machine.
+
+Initial state is eNotFound.
+First it skips all nodes until their cumulative size is < offset;
+Then it copies the [part of] the first node considering offset:
+if the buffer is filled then state changes to eFilled,
+otherwise to eStarted.
+
+If the state is eStarted: node is added to buffer.
+State remains eStarted or changes to eFilled.
+
+If the state is eFilled then remaining value is added up. */
+int s_KXMLNode_readTextNode(const xmlNodePtr firstChild,
+    void *buffer,
+    size_t bsize,
+    size_t *num_read,
+    size_t *remaining,
+    size_t offset)
+{
+    enum EState {
+        eNotFound,
+        eStarted,
+        eFilled
+    } state = eNotFound;
+
+    size_t head = 0;
+    size_t copied = 0;
+    size_t remains = 0;
+    xmlNodePtr node = firstChild;
+
+    if (!firstChild)
+    {   return RC ( rcXML, rcNode, rcReading, rcParam, rcNull ); }
+
+    assert(num_read);
+
+    while (node) {
+        if (node->type == XML_TEXT_NODE) {
+            char* content = (char*) node->content;
+            size_t size;
+            size_t chunkSz = string_measure(content, &size);
+            switch (state) {
+                case eNotFound: {
+                    if (offset < head + chunkSz) {
+                        size_t chunkOffset = offset - head;
+                        size_t readySz = chunkOffset + chunkSz;
+                        size_t size = readySz;
+                        if (readySz >= (bsize - copied)) {
+                            size = bsize - copied;
+                            state = eFilled;
+                        }
+                        else {
+                            state = eStarted;
+                        }
+                        if (size) {
+                            assert(buffer);
+                            string_copy((char*) buffer + copied, bsize - copied, 
+                                content + chunkOffset, size);
+                        }
+                        copied += size;
+                        if (state == eFilled) {
+                            remains = readySz - size;
+                        }
+                    }
+                    break;
+                }
+                case eStarted: {
+                    size_t chunkOffset = 0;
+                    size_t readySz = chunkSz;
+                    size_t size = readySz;
+                    if (readySz >= (bsize - copied)) {
+                        size = bsize - copied;
+                        state = eFilled;
+                    }
+                    if (size) {
+                        assert(buffer);
+                        string_copy((char*) buffer + copied, bsize - copied,
+                            content + chunkOffset, size);
+                    }
+                    copied += size;
+                    if (state == eFilled) {
+                        remains = readySz - size;
+                    }
+                    break;
+                }
+                case eFilled:
+                    remains += chunkSz;
+                    break;
+                default:
+                    assert(0);
+                    break;
+            }
+        }
+        node = node->next;
+    }
+
+    *num_read = copied;
+
+    if (remaining)
+    { *remaining = remains; }
+
+    return 0;
+}
+
+/** Reads XML Node value
+    remaining can be NULL.
+Can have bsize parameter equal to 0:
+can be used to find out the node value length.
+*/
+rc_t KXMLNodeRead(const KXMLNode *self,
+    size_t offset,
+    void *buffer,
+    size_t bsize,
+    size_t *num_read,
+    size_t *remaining)
+{
+    rc_t rc = 0;
+
+    if (!num_read)
+    { return RC ( rcXML, rcNode, rcReading, rcParam, rcNull ); }
+    if (bsize && !buffer)
+    { return RC ( rcXML, rcNode, rcReading, rcParam, rcNull ); }
+
+    *num_read = 0;
+
+    if (remaining)
+    { *remaining = 0; }
+
+    if (self) {
+        const struct _xmlNode *children = NULL;
+        if (self->children) {
+            /*the case when (KXMLNode::children != NULL) is implemented here*/
+            if (self->children->children)
+            { children = self->children->children; }
+        }
+        else if (self->parent && self->parent->xpathObj) {
+            xmlNodePtr node = NULL;
+            int32_t idx = self->idx;
+            const xmlXPathObjectPtr xpathObj = self->parent->xpathObj;
+            assert(xpathObj->nodesetval && idx < xpathObj->nodesetval->nodeNr);
+            node = xpathObj->nodesetval->nodeTab[idx];
+            if (node && node->type == XML_ELEMENT_NODE) {
+                children = node->children;
+            }
+            rc = 0;
+        }
+        if (children != NULL) {
+            return s_KXMLNode_readTextNode( ( xmlNodePtr )
+                children, buffer, bsize, num_read, remaining, offset);
+        }
+    }
+    else { rc = RC ( rcXML, rcNode, rcReading, rcNode, rcCorrupt ); }
+
+    return rc;
+}
+
+
+#define MAX_I16      0x8000 /* 32768 */
+#define MAX_U16     0x10000
+#define MAX_I32  0x80000000
+#define MAX_U32 0x100000000
+
+static
+rc_t s_KXMLNodeReadNodeOrAttrCString(const KXMLNode *self,
+    char *buffer, size_t bsize, size_t *size, const char *attr)
+{
+    if (attr)
+    { return KXMLNodeReadAttrCString(self, attr, buffer, bsize, size); }
+    else { return KXMLNodeReadCString(self, buffer, bsize, size); }
+}
+
+static
+rc_t s_KXMLNodeReadNodeOrAttrAs_long(const KXMLNode *self, long *l,
+    const char *attr)
+{
+    rc_t rc;
+    size_t num_read;
+    char buffer [ 256 ];
+
+    assert ( l );
+
+    rc = s_KXMLNodeReadNodeOrAttrCString
+        ( self, buffer, sizeof buffer, & num_read, attr );
+
+    if ( rc == 0 )
+    {
+        char *end;
+        *l = strtol ( buffer, & end, 0 );
+        if ( end [ 0 ] != 0 )
+            rc = RC ( rcXML, rcNode, rcReading, rcType, rcIncorrect );
+    }
+
+    return rc;
+}
+
+static
+rc_t s_KXMLNodeReadNodeOrAttrAs_ulong(const KXMLNode *self, unsigned long *l,
+    const char *attr)
+{
+    rc_t rc;
+    size_t num_read;
+    char buffer [ 256 ];
+
+    assert ( l );
+
+    rc = s_KXMLNodeReadNodeOrAttrCString
+        ( self, buffer, sizeof buffer, & num_read, attr );
+
+    if ( rc == 0 )
+    {
+        char *end;
+        *l = strtoul ( buffer, & end, 0 );
+
+        if ( end [ 0 ] != 0 )
+        {
+    #if 1
+            rc = RC ( rcXML, rcNode, rcReading, rcType, rcIncorrect );
+    #else
+            if ( end [ 0 ] != '-' && end [ 0 ] != '+' )
+                rc = RC ( rcXML, rcNode, rcReading, rcType, rcIncorrect );
+            else
+            {
+                /* read signed, cast to unsigned... ? */
+            }
+    #endif
+        }
+    }
+
+    return rc;
+}
+
+/* ReadAs ( formatted )
+ *  reads as integer or float value in native byte order
+ *  casts smaller-sized values to desired size, e.g.
+ *    uint32_t to uint64_t
+ *
+ *  "i" [ OUT ] - return parameter for signed integer
+ *  "u" [ OUT ] - return parameter for unsigned integer
+ *  "f" [ OUT ] - return parameter for double float
+ */
+static
+rc_t s_KXMLNodeReadNodeOrAttrAsI16 ( const KXMLNode *self, int16_t *i,
+    const char *attr )
+{
+    rc_t rc = 0;
+    long val = 0;
+
+    if ( i == NULL )
+        return RC ( rcXML, rcNode, rcReading, rcParam, rcNull );
+
+    rc = s_KXMLNodeReadNodeOrAttrAs_long ( self, &val, attr );
+
+    if ( rc == 0 )
+    {
+        if ( val < -32768  || val >= 32768 )
+            rc = RC ( rcXML, rcNode, rcReading, rcRange, rcExcessive );
+        else
+            * i = ( int16_t ) val;
+    }
+
+    return rc;
+}
+
+rc_t KXMLNodeReadAsI16 ( const KXMLNode *self, int16_t *i )
+{ return s_KXMLNodeReadNodeOrAttrAsI16(self, i, NULL); }
+static 
+rc_t s_KXMLNodeReadNodeOrAttrAsU16 ( const KXMLNode *self, uint16_t *u,
+    const char *attr )
+{
+    rc_t rc = 0;
+    unsigned long val = 0;
+
+    if ( u == NULL )
+        return RC ( rcXML, rcNode, rcReading, rcParam, rcNull );
+
+    rc = s_KXMLNodeReadNodeOrAttrAs_ulong(self, &val, attr);
+
+    if ( rc == 0 )
+    {
+        if ( val >= 0x10000 )
+            rc = RC ( rcXML, rcNode, rcReading, rcRange, rcExcessive );
+        else
+            * u = ( uint16_t ) val;
+    }
+
+    return rc;
+}
+
+rc_t KXMLNodeReadAsU16 ( const KXMLNode *self, uint16_t *u )
+{ return s_KXMLNodeReadNodeOrAttrAsU16(self, u, NULL); }
+static
+rc_t s_KXMLNodeReadNodeOrAttrAsI32 ( const KXMLNode *self, int32_t *i,
+    const char *attr )
+{
+    rc_t rc = 0;
+    long val = 0;
+
+    if ( i == NULL )
+        return RC ( rcXML, rcNode, rcReading, rcParam, rcNull );
+
+    rc = s_KXMLNodeReadNodeOrAttrAs_long ( self, &val, attr );
+
+    if ( rc == 0 )
+    {
+        * i = ( int32_t ) val;
+        if ( ( long ) ( * i ) != val )
+            rc = RC ( rcXML, rcNode, rcReading, rcRange, rcExcessive );
+    }
+
+    return rc;
+}
+
+rc_t KXMLNodeReadAsI32 ( const KXMLNode *self, int32_t *i )
+{ return s_KXMLNodeReadNodeOrAttrAsI32(self, i, NULL); }
+rc_t s_KXMLNodeReadNodeOrAttrAsU32 ( const KXMLNode *self, uint32_t *u,
+    const char *attr )
+{
+    rc_t rc = 0;
+    unsigned long val = 0;
+
+    if ( u == NULL )
+        return RC ( rcXML, rcNode, rcReading, rcParam, rcNull );
+
+    rc = s_KXMLNodeReadNodeOrAttrAs_ulong(self, &val, attr);
+
+    if ( rc == 0 )
+    {
+        * u = ( uint32_t ) val;
+        if ( ( unsigned long ) ( * u ) != val )
+            rc = RC ( rcXML, rcNode, rcReading, rcRange, rcExcessive );
+    }
+
+    return rc;
+}
+rc_t KXMLNodeReadAsU32 ( const KXMLNode *self, uint32_t *u )
+{ return s_KXMLNodeReadNodeOrAttrAsU32(self, u, NULL); }
+static
+rc_t s_KXMLNodeReadNodeOrAttrAsI64 ( const KXMLNode *self, int64_t *i,
+    const char *attr )
+{
+    rc_t rc;
+
+    if ( i == NULL )
+        rc = RC ( rcXML, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t num_read;
+        char buffer [ 256 ];
+
+        rc = s_KXMLNodeReadNodeOrAttrCString
+            ( self, buffer, sizeof buffer, & num_read, attr );
+
+        if ( rc == 0 )
+        {
+            char *end;
+            int64_t val = strtoi64 ( buffer, & end, 0 );
+
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcXML, rcNode, rcReading, rcType, rcIncorrect );
+            else
+                * i = val;
+        }
+    }
+
+    return rc;
+}
+rc_t KXMLNodeReadAsI64 ( const KXMLNode *self, int64_t *i )
+{ return s_KXMLNodeReadNodeOrAttrAsI64(self, i, NULL); }
+
+rc_t s_KXMLNodeReadNodeOrAttrAsU64 ( const KXMLNode *self, uint64_t *u,
+    const char *attr )
+{
+    rc_t rc;
+
+    if ( u == NULL )
+        rc = RC ( rcXML, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t num_read;
+        char buffer [ 256 ];
+
+        rc = s_KXMLNodeReadNodeOrAttrCString
+            ( self, buffer, sizeof buffer, & num_read, attr );
+
+        if ( rc == 0 )
+        {
+            char *end;
+            uint64_t val = strtou64 ( buffer, & end, 0 );
+
+            if ( end [ 0 ] != 0 )
+            {
+        #if 1
+                rc = RC ( rcXML, rcNode, rcReading, rcType, rcIncorrect );
+        #else
+                if ( end [ 0 ] != '-' && end [ 0 ] != '+' )
+                    rc = RC ( rcXML, rcNode, rcReading, rcType, rcIncorrect );
+                else
+                {
+                    /* read signed, cast to unsigned... ? */
+                    /* FYI
+                       centos64: strtou64("-1") = 0xffff...
+                       errno = 1; end[0] = '\0' */
+                }
+        #endif
+            }
+            else
+                * u = val;
+        }
+    }
+
+    return rc;
+}
+
+rc_t KXMLNodeReadAsU64 ( const KXMLNode *self, uint64_t *u )
+{ return s_KXMLNodeReadNodeOrAttrAsU64(self, u, NULL); }
+rc_t s_KXMLNodeReadNodeOrAttrAsF64 ( const KXMLNode *self, double *f,
+    const char *attr )
+{
+    rc_t rc;
+
+    if ( f == NULL )
+        rc = RC ( rcXML, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t num_read;
+        char buffer [ 256 ];
+
+        rc = s_KXMLNodeReadNodeOrAttrCString
+            ( self, buffer, sizeof buffer, & num_read, attr );
+
+        if ( rc == 0 )
+        {
+            char *end;
+            * f = strtod ( buffer, & end );
+            if ( end [ 0 ] != 0 )
+                rc = RC ( rcXML, rcNode, rcReading, rcType, rcIncorrect );
+        }
+    }
+
+    return rc;
+}
+rc_t KXMLNodeReadAsF64 ( const KXMLNode *self, double *f )
+{ return s_KXMLNodeReadNodeOrAttrAsF64(self, f, NULL); }
+
+/* Read ( formatted )
+ *  reads as C-string
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated string.
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+rc_t KXMLNodeReadCString ( const KXMLNode *self,
+    char *buffer, size_t bsize, size_t *size )
+{
+    rc_t rc;
+
+    if ( size == NULL )
+        rc = RC ( rcXML, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t remaining;
+        rc = KXMLNodeRead ( self, 0, buffer, bsize, size, & remaining );
+        if ( rc == 0 )
+        {
+            if ( * size == bsize )
+            {
+                rc = RC ( rcXML, rcNode, rcReading, rcBuffer, rcInsufficient );
+                * size += remaining;
+            }
+            else
+            {
+                buffer [ * size ] = 0;
+            }
+        }
+    }
+
+    return rc;
+}
+
+rc_t KXMLNodeReadCStr( const KXMLNode *self, char** str, const char* default_value)
+{
+    rc_t rc = 0;
+
+    if( self == NULL || str == NULL ) {
+        rc = RC( rcXML, rcNode, rcReading, rcParam, rcNull);
+    } else { 
+        char b[10240];
+        size_t to_read = sizeof(b) - 1, nread = 0;
+        
+        *str = NULL;
+        if( (rc = KXMLNodeReadCString(self, b, to_read, &nread)) == 0 ) {
+            if( nread == 0 && default_value != NULL ) {
+                size_t size;
+                *str = string_dup(default_value, string_measure(default_value, &size));
+            } else {
+                *str = string_dup(b, nread);
+            }
+            if( *str == NULL ) {
+                rc = RC(rcXML, rcNode, rcReading, rcMemory, rcInsufficient);
+            }
+        }
+    }
+    return rc;
+}
+
+
+/** Reads XML Node attribute value
+attr: attribute name
+    remaining can be NULL.
+Can have bsize parameter equal to 0:
+can be used to find out the attribute value length.
+*/
+rc_t KXMLNodeReadAttr(const KXMLNode *self,
+     const char *attr,
+     void *buffer,
+     size_t bsize,
+     size_t *num_read,
+     size_t *remaining)
+{
+    rc_t status = 0;
+    struct _xmlAttr* properti = NULL;
+    if (!attr || !num_read) {
+        return RC ( rcXML, rcAttr, rcReading, rcParam, rcNull );
+    }
+    if (bsize && !buffer)
+    {   return RC ( rcXML, rcNode, rcReading, rcParam, rcNull ); }
+    *num_read = 0;
+    if (remaining) {
+        *remaining = 0;
+    }
+    if (!self)
+    {   return RC ( rcXML, rcAttr, rcReading, rcSelf, rcCorrupt ); }
+    if (self->children) {
+        properti = self->children->properties;
+    }
+    else if (self->parent && self->parent->xpathObj) {
+        int32_t idx = self->idx;
+        const xmlXPathObjectPtr xpathObj = self->parent->xpathObj;
+        assert(xpathObj->nodesetval && idx < xpathObj->nodesetval->nodeNr);
+        {
+            xmlNodePtr node = xpathObj->nodesetval->nodeTab[idx];
+            if (node && node->type == XML_ELEMENT_NODE)
+            {   properti = node->properties; }
+        }
+    }
+    else {
+        status = RC ( rcXML, rcAttr, rcReading, rcSelf, rcCorrupt );
+    }
+    if (properti) {
+        while (properti) {
+            if (!xmlStrcmp(BAD_CAST attr, properti->name)) {
+                return s_KXMLNode_readTextNode(properti->children,
+                    buffer, bsize, num_read, remaining, 0);
+            }
+            properti = properti->next;
+        }
+    }
+    status = RC ( rcXML, rcAttr, rcReading, rcAttr, rcNotFound );
+    return status;
+}
+
+
+/* ReadAttrAs ( formatted )
+ *  reads as integer or float value in native byte order
+ *  casts smaller-sized values to desired size, e.g.
+ *    uint32_t to uint64_t
+ *
+ *  "i" [ OUT ] - return parameter for signed integer
+ *  "u" [ OUT ] - return parameter for unsigned integer
+ *  "f" [ OUT ] - return parameter for double float
+ */
+rc_t KXMLNodeReadAttrAsI16
+    ( const KXMLNode *self, const char *attr, int16_t *i )
+{ return s_KXMLNodeReadNodeOrAttrAsI16(self, i, attr); }
+
+rc_t KXMLNodeReadAttrAsU16
+    ( const KXMLNode *self, const char *attr, uint16_t *u )
+{ return s_KXMLNodeReadNodeOrAttrAsU16(self, u, attr); }
+
+rc_t KXMLNodeReadAttrAsI32 ( const KXMLNode *self,
+    const char *attr, int32_t *i )
+{ return s_KXMLNodeReadNodeOrAttrAsI32(self, i, attr); }
+
+rc_t KXMLNodeReadAttrAsU32
+    ( const KXMLNode *self, const char *attr, uint32_t *u )
+{ return s_KXMLNodeReadNodeOrAttrAsU32(self, u, attr); }
+
+rc_t KXMLNodeReadAttrAsI64
+    ( const KXMLNode *self, const char *attr, int64_t *i )
+{ return s_KXMLNodeReadNodeOrAttrAsI64(self, i, attr); }
+
+rc_t KXMLNodeReadAttrAsU64
+    ( const KXMLNode *self, const char *attr, uint64_t *u )
+{ return s_KXMLNodeReadNodeOrAttrAsU64(self, u, attr); }
+
+rc_t KXMLNodeReadAttrAsF64 ( const KXMLNode *self, const char *attr, double *f )
+{ return s_KXMLNodeReadNodeOrAttrAsF64(self, f, attr); }
+
+
+/* ReadAttrCString ( formatted )
+ *  reads as C-string
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated string.
+ *
+ *  "size" [ OUT ] - return parameter giving size of string
+ *  not including NUL byte. the size is set both upon success
+ *  and insufficient buffer space error.
+ */
+rc_t KXMLNodeReadAttrCString ( const KXMLNode *self, const char *attr,
+    char *buffer, size_t bsize, size_t *size )
+{
+    rc_t rc;
+
+    if ( size == NULL )
+        rc = RC ( rcXML, rcAttr, rcReading, rcParam, rcNull );
+    else
+    {
+        size_t remaining;
+        rc = KXMLNodeReadAttr ( self, attr, buffer, bsize, size, & remaining );
+        if ( rc == 0 )
+        {
+            if ( * size == bsize )
+            {
+                rc = RC ( rcXML, rcAttr, rcReading, rcBuffer, rcInsufficient );
+                * size += remaining;
+            }
+            else
+            {
+                buffer [ * size ] = 0;
+            }
+        }
+    }
+
+    return rc;
+}
+
+rc_t KXMLNodeReadAttrCStr( const KXMLNode *self, const char *attr, char** str, const char* default_value)
+{
+    rc_t rc = 0;
+
+    if( self == NULL || attr == NULL || str == NULL ) {
+        rc = RC( rcXML, rcNode, rcReading, rcParam, rcNull);
+    } else { 
+        char b[10240];
+        size_t to_read = sizeof(b) - 1, nread = 0;
+        
+        *str = NULL;
+        if( (rc = KXMLNodeReadAttrCString(self, attr, b, to_read, &nread)) == 0 ) {
+            if( nread == 0 && default_value != NULL ) {
+                size_t size;
+                *str = string_dup(default_value, string_measure(default_value, &size));
+            } else {
+                *str = string_dup(b, nread);
+            }
+        } else if( GetRCState(rc) == rcNotFound && default_value != NULL ) {
+            size_t size;
+            *str = string_dup(default_value, string_measure(default_value, &size));
+            rc = 0;
+        }
+        if( rc == 0 && *str == NULL ) {
+            rc = RC(rcXML, rcNode, rcReading, rcMemory, rcInsufficient);
+        }
+    }
+    return rc;
+}
+
+
+struct s_KNodeNamelist {
+    KNamelist dad;
+    struct _xmlAttr* properties;
+    struct _xmlNode* children;
+};
+typedef struct s_KNodeNamelist s_KNodeNamelist;
+static rc_t KNodeNamelistDestroy (s_KNodeNamelist *self)
+{
+    free(self);
+    return 0;
+}
+
+static rc_t s_LibXmlCount(uint32_t *count,
+    const struct _xmlNode* children,
+    const struct _xmlAttr* properties)
+{
+    assert(count);
+
+    *count = 0;
+
+    /* It neither of properties nor children exists
+    then this node does not have children */
+
+    if (properties) {
+        while (properties) {
+            ++(*count);
+            properties = properties->next;
+        }
+    }
+    else if (children) {
+        while (children) {
+            if (children->type == XML_ELEMENT_NODE) {
+                ++(*count);
+            }
+            children = children->next;
+        }
+    }
+
+    return 0;
+}
+
+static rc_t KNodeNamelistCount(const s_KNodeNamelist *self,
+    uint32_t *count)
+{
+    if (!count) {
+        return RC ( rcXML, rcNamelist, rcListing, rcParam, rcNull );
+    }
+
+    return s_LibXmlCount(count, self->children, self->properties);
+}
+
+static rc_t s_LibXmlGetNode(const struct _xmlNode** result,
+    uint32_t idx,
+    const struct _xmlNode* children)
+{
+    uint32_t count = 0;
+    while (children) {
+        if (children->type == XML_ELEMENT_NODE) {
+            if (count == idx) {
+                *result = children;
+                return 0;
+            }
+            ++count;
+        }
+        children = children->next;
+    }
+    return RC ( rcXML, rcNode, rcReading, rcIndex, rcNotFound );
+}
+
+/* TODO:
+quick and dirty version: bad style and code copying: has to be refactored */
+rc_t KXMLNodeGetNodeRead ( const KXMLNode *self,
+    const KXMLNode **result,
+    uint32_t idx )
+{
+    if (!self)
+    {   return RC ( rcXML, rcNode, rcReading, rcSelf, rcNull ); }
+    if (!result)
+    {   return RC ( rcXML, rcNode, rcReading, rcParam, rcNull ); }
+
+    *result = 0;
+
+    {
+        uint32_t count = 0;
+        rc_t rc = KXMLNodeCountChildNodes(self, &count);
+        if (rc)
+        {   return rc; }
+        if (idx >= count)
+        {   return RC ( rcXML, rcNode, rcCreating, rcIndex, rcInvalid ); }
+
+        {
+            const struct _xmlNode *resultChildren = 0;
+            const struct _xmlNode *children = self->children;
+            if (children) {
+                children = children->children;
+                assert(children);
+            }
+            else {
+                if (self && self->parent && self->parent->xpathObj) {
+                    const xmlNodeSetPtr nodesetval
+                        = self->parent->xpathObj->nodesetval;
+                    if (nodesetval) {
+                        if ((nodesetval->nodeNr > 0)
+                            && nodesetval->nodeTab)
+                        {
+                            if (nodesetval->nodeNr <= self->idx) {
+                                return RC ( rcXML, rcNode, rcCreating,
+                                    rcSelf, rcCorrupt );
+                            }
+                            if (nodesetval->nodeTab[self->idx]) {
+                                children
+                                    = nodesetval->nodeTab[self->idx]->children;
+                            /*parent node for our requested parent->child[idx]*/
+                                assert(children);
+                            }
+                            else {
+                                return RC ( rcXML, rcNode, rcCreating,
+                                    rcSelf, rcCorrupt );
+                            }
+                        }
+                        else {
+                            return RC ( rcXML, rcNode, rcCreating,
+                                rcSelf, rcCorrupt );
+                        }
+                    } else {
+                        return RC(rcXML, rcNode, rcCreating, rcSelf, rcCorrupt);
+                    }
+                } else {
+                    return RC ( rcXML, rcNode, rcCreating, rcSelf, rcCorrupt );
+                }
+            }
+            rc = s_LibXmlGetNode(&resultChildren, idx, children);
+            if (rc)
+            {   return rc; }
+            rc = s_KXMLNode_cTor
+                (self->parent, result, 0, resultChildren, self->path);
+            return rc;
+        }
+    }
+}
+
+static rc_t KNodeNamelistGet(const s_KNodeNamelist *self,
+    uint32_t idx,
+    const char **name)
+{
+    uint32_t count = 0;
+    if (self->properties) {
+        struct _xmlAttr* properties = self->properties;
+        while (properties) {
+            if (count == idx) {
+                *name = (const char*)properties->name;
+                return 0;
+            }
+            ++count;
+            properties = properties->next;
+        }
+    }
+    else if (self->children) {
+        const struct _xmlNode *result = 0;
+        rc_t rc = s_LibXmlGetNode(&result, idx, self->children);
+        if (rc)
+        { return rc; }
+        *name = (const char*)result->name;
+        return 0;
+    }
+    return RC ( rcXML, rcNode, rcReading, rcIndex, rcNotFound );
+}
+
+static KNamelist_vt_v1 vtKNodeNamelist = {
+    /* version 1.0 */
+    1, 0,
+
+    /* start minor version 0 methods */
+    KNodeNamelistDestroy,
+    KNodeNamelistCount,
+    KNodeNamelistGet
+    /* end minor version 0 methods */
+};
+
+enum EKNodeNamelistType {
+    eAttr,
+    eNode
+};
+
+/** KAttrNamelist factory method */
+static int s_KXMLNode_createKNodeNamelist(const KXMLNode *self,
+    const KNamelist **list,
+    uint32_t type)
+{
+    /*TODO it seems
+    that the case when (KXMLNode::children != NULL) is not implemented*/
+    rc_t status = 0;
+    *list = 0;
+    if (self && self->parent && self->parent->xpathObj) {
+        s_KNodeNamelist* obj
+            = (s_KNodeNamelist*) malloc(sizeof(s_KNodeNamelist));
+        if (!obj) {
+            return RC ( rcXML, rcNamelist, rcCreating, rcMemory, rcExhausted );
+        }
+        status
+            = KNamelistInit(&obj->dad, (const KNamelist_vt*) &vtKNodeNamelist);
+        if (status != 0) {
+            free(obj);
+            return status;
+        }
+        obj->properties = 0;
+        obj->children = 0;
+        *list = &obj->dad;
+        if( self->children ) {
+            switch (type) {
+                case eAttr:
+                    obj->properties = self->children->properties;
+                    break;
+                case eNode:
+                    obj->children = self->children->children;
+                    break;
+                default:
+                    assert(0);
+                    break;
+            }
+        } else {
+            const xmlNodeSetPtr nodesetval = self->parent->xpathObj->nodesetval;
+            if (nodesetval) {
+                if ((nodesetval->nodeNr > 0) && nodesetval->nodeTab) {
+                    if (nodesetval->nodeNr <= self->idx) {
+                        free(obj);
+                        *list = 0;
+                        return RC
+                            (rcXML, rcNamelist, rcCreating, rcSelf, rcCorrupt);
+                    }
+                    if (nodesetval->nodeTab[self->idx]) {
+                        switch (type) {
+                            case eAttr:
+                                obj->properties =
+                                    nodesetval->nodeTab[self->idx]->properties;
+                                break;
+                            case eNode:
+                                obj->children =
+                                    nodesetval->nodeTab[self->idx]->children;
+                                break;
+                            default:
+                                assert(0);
+                                break;
+                        }
+                    }
+                }
+            }
+        }
+        status = 0;
+    }
+    else {
+        status = RC ( rcXML, rcNamelist, rcCreating, rcSelf, rcCorrupt );
+    }
+    return status;
+}
+rc_t KXMLNodeListAttr(const KXMLNode *self,
+    const KNamelist **names)
+{
+    return s_KXMLNode_createKNodeNamelist(self, names, eAttr);
+}
+
+rc_t KXMLNodeListChild(const KXMLNode *self,
+    const KNamelist **names)
+{
+    return s_KXMLNode_createKNodeNamelist(self, names, eNode);
+}
+
+rc_t KXMLNodeCountChildNodes(const KXMLNode *self,
+    uint32_t *count)
+{
+    if (!self)
+    {   return RC ( rcXML, rcNode, rcListing, rcSelf, rcNull ); }
+    if (!count)
+    {   return RC ( rcXML, rcNode, rcListing, rcParam, rcNull ); }
+    *count = 0;
+    if (self && self->parent && self->parent->xpathObj) {
+        const xmlNodeSetPtr nodesetval = self->parent->xpathObj->nodesetval;
+        if (nodesetval) {
+            if ((nodesetval->nodeNr > 0) && nodesetval->nodeTab) {
+                if (nodesetval->nodeNr <= self->idx) {
+                    return RC(rcXML, rcNamelist, rcCreating, rcSelf, rcCorrupt);
+                }
+                if (nodesetval->nodeTab[self->idx]) {
+                    if (!self->children) {
+                        return s_LibXmlCount(
+                            count, nodesetval->nodeTab[self->idx]->children, 0);
+                    } else { 
+                        /*assert(0); // not implemented*/
+                        if (!self->children->children)
+        /* 'self->children'
+         is a node that should contain its children in self->children->children.
+         If (self->children->children == NULL) then the node has no child. */
+                        {   return 0; }
+                        else {
+                            return s_LibXmlCount
+                                (count, self->children->children, 0);
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return RC ( rcXML, rcNamelist, rcCreating, rcSelf, rcCorrupt );
+}
+
+/* GetFirstChildNodeRead
+ *  Returns the first(with index 0) sub-node of self using path.
+ *  Is equivalent to:
+ *          KXMLNodeOpenNodesetRead(self, &nc, path, ...);
+ *          KXMLNodesetGetNodeRead(ns, node, 0);
+ */
+rc_t KXMLNodeVGetFirstChildNodeRead ( const KXMLNode *self,
+    const KXMLNode **node, const char *path, va_list args )
+{
+    rc_t rc = 0;
+
+    struct KXMLNodeset const *ns = NULL;
+
+    if (node == NULL) {
+        return RC(rcXML, rcNode, rcReading, rcParam, rcNull);
+    }
+
+    *node = NULL;
+
+    rc = KXMLNodeVOpenNodesetRead(self, &ns, path, args);
+
+    if (rc == 0) {
+        rc = KXMLNodesetGetNodeRead(ns, node, 0);
+        KXMLNodesetRelease(ns);
+    }
+
+    return rc;
+}
+
+rc_t KXMLNodeGetFirstChildNodeRead ( const KXMLNode *self,
+    const KXMLNode **node, const char *path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start(args, path);
+    rc = KXMLNodeVGetFirstChildNodeRead(self, node, path, args);
+    va_end(args);
+
+    return rc;
+}
+
+/* EOF */
diff --git a/libs/kxml/xtoc-parsexml.c b/libs/kxml/xtoc-parsexml.c
new file mode 100644
index 0000000..b2093d2
--- /dev/null
+++ b/libs/kxml/xtoc-parsexml.c
@@ -0,0 +1,576 @@
+/*******************************************************************************
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * =============================================================================
+ */
+
+#include "xtoc-priv.h" /* XTocParseXml */
+
+#include <kxml/xml.h> /* KXMLNode */
+/* #include <klib/log.h> LOGERR */
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/printf.h>
+#include <klib/out.h>
+#include <klib/rc.h> /* RC */
+
+#include "os-native.h"
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdio.h> /* printf */
+#include <stdlib.h> /* free */
+#include <string.h> /* memset */
+#include <time.h>      /* timegm */
+#include <os-native.h> /* timegm */
+
+typedef struct KFile KFile;
+
+/*#define DISP_RC(rc, msg) (void) ( (rc == 0) ? 0 : LOGERR(klogInt, rc, msg) )*/
+#define DISP_RC(rc, msg) (void) ( 0 )
+
+/* copy-paste from libs/kfs/md5.c */
+
+static
+int hex_to_int ( char hex )
+{
+    int i = hex - '0';
+    if ( hex > '9' )
+    {
+        if ( hex < 'a' )
+            i = hex - 'A' + 10;
+        else
+            i = hex - 'a' + 10;
+
+        if ( i > 15 )
+            return -1;
+    }
+    return i;
+}
+
+static
+rc_t MD5SumExtract(const char* str, uint8_t digest[16])
+{
+    rc_t rc = 0;
+
+    int i = 0;
+    /* parse checksum */
+    for ( i = 0; i < 16; ++ i )
+    {
+        int l, u = hex_to_int ( str [ i + i + 0 ] );
+        l = hex_to_int ( str [ i + i + 1 ] );
+        if ( u < 0 || l < 0 )
+        {
+            rc = RC ( rcFS, rcXmlDoc, rcReading, rcFormat, rcInvalid );
+            break;
+        }
+
+        digest [ i ] = ( uint8_t ) ( ( u << 4 ) | l );
+    }
+
+    return rc;
+}
+
+typedef enum NodeType {
+     eUndefined
+    ,eROOT
+    ,eArchive
+    ,eContainer
+    ,eDirectory
+    ,eFile
+    ,eSymlink
+} NodeType;
+typedef struct NodeData {
+    const char* nodeName;
+
+/* need to free */
+    char* nodeValue;
+
+/* attributes */
+    char* id;
+    char* path;
+    char* name;
+    char* mtime;
+    char* filetype;
+    char* md5;
+    char* crc32;
+    char* size;
+    char* offset;
+
+/* parsed node information */
+    NodeType nodeType;
+    uint8_t digest[16];
+    uint64_t iSize;
+    uint64_t iOffset;
+    KTime_t tMtime;
+} NodeData;
+
+static
+NodeType GetNodeType(const char* nodeName)
+{
+    NodeType t = eUndefined;
+
+    if (nodeName == NULL) {
+        t = eUndefined;
+    }
+    else if (!strcmp(nodeName, "archive")) {
+        t = eArchive;
+    }
+    else if (!strcmp(nodeName, "container")) {
+        t = eContainer;
+    }
+    else if (!strcmp(nodeName, "directory")) {
+        t = eDirectory;
+    }
+    else if (!strcmp(nodeName, "file")) {
+        t = eFile;
+    }
+    else if (!strcmp(nodeName, "symlink")) {
+        t = eSymlink;
+    }
+    else if (strstr(nodeName, "ROOT")) {
+        t = eROOT;
+    }
+
+    return t;
+}
+
+#define DEBUG_PRINT false /* true false */
+
+/* TODO: check possible errors */
+/* Reverse to KTimePrint for tools/copycat/cctree-dump.c */
+static
+rc_t CC StrToKTime(const char* str, KTime_t* t)
+{
+    rc_t rc = 0;
+
+    assert(t);
+
+    if (str) {
+        int y, m, d, hr, mn, sc;
+        struct tm gmt;
+        memset(&gmt, 0, sizeof gmt);
+        sscanf(str, "%04d-%02d-%02dT%02d:%02d:%02dZ",
+                                &y, &m, &d, &hr, &mn, &sc);
+        gmt.tm_year = y - 1900;
+        gmt.tm_mon  = m - 1;
+        gmt.tm_mday = d;
+        gmt.tm_hour = hr;
+        gmt.tm_min  = mn;
+        gmt.tm_sec  = sc;
+        *t = timegm(&gmt);
+
+        if (DEBUG_PRINT) {
+            time_t t2 = ( time_t ) * t;
+            size_t len;
+            char buffer [ 64 ];
+
+            struct tm gmt;
+#if SUN
+	    gmt = * gmtime ( & t2 );
+#else
+            gmtime_r ( & t2, & gmt );
+#endif
+            rc = string_printf ( buffer, sizeof buffer, & len
+                , "%04d-%02d-%02dT%02d:%02d:%02dZ"
+                , gmt . tm_year + 1900
+                , gmt . tm_mon + 1
+                , gmt . tm_mday
+                , gmt . tm_hour
+                , gmt . tm_min
+                , gmt . tm_sec
+            );
+            
+            OUTMSG((">> %s\n", str));
+            OUTMSG(("<< %s\n", buffer));
+        }
+    }
+
+    return rc;
+}
+
+#define READ_ATTR(NODE, V) \
+    if (rc == 0) { \
+        rc = KXMLNodeReadAttrCStr(NODE, #V, &data->V, NULL); \
+        if (rc != 0) { \
+            if (GetRCState(rc) == rcNotFound) \
+                rc = 0; \
+        } \
+    }
+/*          else if (data->nodeName) \
+                PLOGERR(klogErr, (klogErr, rc, \
+                    "while calling KXMLNodeReadAttrCStr($(name)/@$(attr))", \
+                    "name=%s,attr=%s", data->nodeName, #V)); */
+
+#define PRN_ATTR(NM, V) \
+    if (DEBUG_PRINT && data->V) OUTMSG(("%s=\"%s\" ", NM, data->V))
+
+#define GET_ATTR(NODE, V) READ_ATTR(NODE, V); PRN_ATTR(#V, V)
+
+static rc_t CC NodeDataReadAttribs(NodeData* data, const KXMLNode* node,
+    const char* parentName, uint32_t idx)
+{
+    rc_t rc = 0;
+
+    assert(node && parentName && data);
+
+    if (DEBUG_PRINT) OUTMSG(("<%s ", data->nodeName));
+
+    GET_ATTR(node, id);
+    GET_ATTR(node, path);
+    GET_ATTR(node, name);
+    GET_ATTR(node, mtime);
+    GET_ATTR(node, filetype);
+    GET_ATTR(node, md5);
+    GET_ATTR(node, crc32);
+
+    READ_ATTR(node, size);
+    READ_ATTR(node, offset);
+
+    if (rc == 0)
+    {
+/* TODO: what size is negative no error is detected */
+        char * attr = "size";
+        rc = KXMLNodeReadAttrAsU64(node, attr, &data->iSize);
+        if (rc != 0) {
+            if (GetRCState(rc) == rcNotFound) {
+                rc = 0;
+            }
+        }
+
+        attr = "offset";
+        rc = KXMLNodeReadAttrAsU64(node, attr, &data->iOffset);
+        if (rc != 0) {
+            if (GetRCState(rc) == rcNotFound) {
+                rc = 0;
+            }
+        }
+/*          else if (data->nodeName) {
+                PLOGERR(klogErr, (klogErr, rc,
+                    "while calling KXMLNodeReadAttrAsU64($(name)/@$(attr))",
+                    "name=%s,attr=%s", data->nodeName, attr));
+            }*/
+        if (DEBUG_PRINT) 
+        {
+            OUTMSG(("%s=\"%lu\" ", attr, data->iSize));
+            OUTMSG(("%s=\"%lu\" ", attr, data->iOffset));
+        }
+    }
+
+    if (DEBUG_PRINT) OUTMSG((">"));
+    if (DEBUG_PRINT && data->nodeValue) OUTMSG(("%s", data->nodeValue));
+    if (DEBUG_PRINT) OUTMSG(("</%s>\n", data->nodeName));
+
+    return rc;
+}
+
+#define FREE(V) free(data->V); data->V = NULL
+
+static
+rc_t CC NodeDataDestroy(NodeData* data)
+{
+    assert(data);
+
+    FREE(nodeValue);
+    FREE(id);
+    FREE(path);
+    FREE(name);
+    FREE(mtime);
+    FREE(filetype);
+    FREE(md5);
+    FREE(crc32);
+    FREE(size);
+    FREE(offset);
+
+    return 0;
+}
+
+static rc_t CC NodeDataInit(NodeData* data, const KXMLNode* node,
+    const char* parentName, uint32_t idx)
+{
+    rc_t rc = 0;
+
+    assert(node && parentName && data);
+
+    memset(data, 0, sizeof *data);
+
+    rc = KXMLNodeGetName(node, &data->nodeName);
+/*  if (rc != 0) {
+        PLOGERR(klogErr, (klogErr, rc,
+            "while calling KXMLNodeGetName($(parent)[$(i)]",
+            "parent=%s,i=%d", parentName, idx));
+    }*/
+
+    if (rc == 0
+        && data->nodeName && !strcmp(data->nodeName, "symlink"))
+    {
+        rc = KXMLNodeReadCStr(node, &data->nodeValue, NULL);
+/*      if (rc != 0) {
+            PLOGERR(klogErr, (klogErr, rc,
+                "while calling KXMLNodeReadCStr($(name))",
+                "name=%s", data->nodeName));
+        }*/
+    }
+
+    if (rc == 0) {
+        rc = NodeDataReadAttribs(data, node, parentName, idx);
+    }
+
+    if (rc == 0) {
+        data->nodeType = GetNodeType(data->nodeName);
+
+        if (data->md5) {
+            if (strlen(data->md5) != 32) {
+                rc = RC(rcFS, rcXmlDoc, rcReading, rcFormat, rcInvalid);
+/*              PLOGERR(klogErr, (klogErr, rc,
+                    "md5sum '$(md5)'", "md5=%s", data->md5));*/
+            }
+            else {
+                rc = MD5SumExtract(data->md5, data->digest);
+            }
+        }
+    }
+
+    if (rc == 0) {
+        rc = StrToKTime(data->mtime, &data->tMtime);
+    }
+
+    return rc;
+}
+
+static
+rc_t CC NodeDataAddToXToc(NodeData* data,
+                          struct XTocEntry* xSelf, struct XTocEntry* xContainer,
+                          struct XTocEntry** xEntry, bool *isContainer)
+{
+    rc_t rc = 0;
+
+    assert(data && xEntry && isContainer);
+
+    *isContainer = false;
+
+    switch (data->nodeType) {
+        case eUndefined:
+            rc = RC(rcFS, rcTocEntry, rcInflating, rcData, rcInvalid);
+/*          LOGERR(klogErr, rc, "undefined node type in DataXAdd");*/
+            break;
+        case eROOT: /* ignore root node */
+            *xEntry = xSelf;
+            break;
+        case eArchive:
+            *isContainer = true;
+            rc = XTocTreeAddArchive(xSelf, xEntry, xContainer,
+                data->name, data->tMtime, data->id, 
+                data->filetype, data->iSize, data->iOffset, data->digest);
+            break;
+        case eContainer:
+            *isContainer = true;
+            rc = XTocTreeAddContainer(xSelf, xEntry, xContainer,
+                data->name, data->tMtime, data->id, 
+                data->filetype, data->iSize, data->iOffset, data->digest);
+            break;
+        case eDirectory:
+            rc = XTocTreeAddDir(xSelf, xEntry, xContainer,
+                data->name, data->tMtime);
+            break;
+        case eFile:
+            rc = XTocTreeAddFile(xSelf, xEntry, xContainer,
+                data->name, data->tMtime,  data->id, 
+                data->filetype, data->iSize, data->iOffset, data->digest);
+            break;
+        case eSymlink:
+            rc = XTocTreeAddSymlink(xSelf, xEntry, xContainer,
+                data->name, data->tMtime, data->nodeValue);
+            break;
+    }
+
+    return rc;
+}
+
+static
+rc_t ProcessNode(const KXMLNode* node,
+    const char* parentName, uint32_t idx,
+    struct XTocEntry* xSelf, struct XTocEntry* xContainer)
+{
+    rc_t rc = 0;
+    uint32_t count = 0;
+    uint32_t i = 0;
+    struct XTocEntry* xEntry = NULL;
+    bool isContainer = false;
+    NodeData data;
+
+    assert(node && parentName);
+
+    if (rc == 0) {
+        rc = NodeDataInit(&data, node, parentName, idx);
+    }
+
+    if (rc == 0) {
+        DBGMSG(DBG_APP,DBG_COND_1,
+            ("%s[%i] = %s\n", parentName, idx, data.nodeName));
+        rc = NodeDataAddToXToc(&data, xSelf, xContainer, &xEntry, &isContainer);
+        if (isContainer) {
+            xContainer = xEntry;
+        }
+    }
+
+    if (rc == 0) {
+        rc = KXMLNodeCountChildNodes(node, &count);
+        if (rc != 0) {
+/*          PLOGERR(klogErr, (klogErr, rc,
+                "while calling KXMLNodeCountChildNodes($(parent)[$(i)])",
+                "parent=%s,i=%d", parentName, idx));*/
+        }
+        else {
+/*          DBGMSG(DBG_APP,DBG_COND_1,
+                ("KXMLNodeCountChildNodes(%s) = %i\n", data.nodeName, count));*/
+        }
+    }
+
+    for (i = 0; i < count && rc == 0; ++i) {
+        const KXMLNode* child = NULL;
+
+        rc = KXMLNodeGetNodeRead(node, &child, i);
+        if (rc != 0) {
+/*          PLOGERR(klogErr, (klogErr, rc,
+                "while calling KXMLNodeCountChildNodes($(parent)[$(i)][$(j)]",
+                "parent=%s,i=%d,j=%d", parentName, idx, i));*/
+        }
+        else {
+/*          DBGMSG(DBG_APP,DBG_COND_1,
+                ("KXMLNodeGetNodeRead(%s[%i])\n", data.nodeName, idx, i));*/
+            ProcessNode(child, data.nodeName, i, xEntry, xContainer);
+        }
+
+        {
+            rc_t rc2 = KXMLNodeRelease(child);
+            if (rc == 0)
+            {   rc = rc2; }
+            child = NULL;
+        }
+    }
+
+    NodeDataDestroy(&data);
+
+    return rc;
+}
+
+rc_t XTocParseXml(struct XTocEntry* xRoot, const KFile* file)
+{
+    rc_t rc = 0;
+
+    const KXMLMgr* mgr = NULL;
+    const KXMLDoc* doc = NULL;
+    const KXMLNodeset* root = NULL;
+    const char rootName[] = "/ROOT";
+
+/**** INIT ****/
+
+    if (rc == 0) {
+        rc = KXMLMgrMakeRead(&mgr);
+        DISP_RC(rc, "while calling KXMLMgrMakeRead");
+    }
+
+    if (rc == 0) {
+        KXMLMgrMakeDocRead(mgr, &doc, file);
+        DISP_RC(rc, "while calling KXMLMgrMakeDocRead");
+    }
+
+    if (rc == 0) {
+        rc = KXMLDocOpenNodesetRead(doc, &root, rootName);
+        if (rc != 0) {
+/*          PLOGERR(klogErr, (klogErr, rc,
+                "while calling KXMLDocOpenNodesetRead $(name)",
+                "name=%s", rootName));*/
+        }
+    }
+
+    if (rc == 0) {
+        uint32_t count = 0;
+        rc = KXMLNodesetCount(root, &count);
+        if (rc != 0) {
+/*          PLOGERR(klogErr, (klogErr, rc,
+                "while calling KXMLNodesetCount($(name))", "name=%s",
+                rootName));*/
+        }
+        else if (count != 1) {
+            rc = RC(rcFS, rcXmlDoc, rcReading,
+                rcTag, count ? rcExcessive : rcNotFound);
+/*          PLOGERR(klogErr, (klogErr, rc, "$(name)", "name=%s", rootName));*/
+        }
+        else if (false) {
+            DBGMSG(DBG_APP,DBG_COND_1,
+                ("KXMLNodesetCount(%s)=%d\n", rootName, count));
+        }
+    }
+
+/**** READ AND PROCESS THE ROOT XML NODE ****/
+
+    if (rc == 0) {
+        uint32_t i = 0;
+        const KXMLNode *node = NULL;
+
+        rc = KXMLNodesetGetNodeRead(root, &node, i);
+        if (rc == 0) {
+            ProcessNode(node, rootName, i, xRoot, xRoot);
+        }
+/*      else {
+*            PLOGERR(klogErr, (klogErr, rc,
+                "while calling KXMLNodesetGetNodeRead($(name), $(i))",
+                "name=%s,i=%d", rootName, i));
+        }*/
+
+        {
+            rc_t rc2 = KXMLNodeRelease(node);
+            if (rc == 0)
+            {   rc = rc2; }
+            node = NULL;
+        }
+    }
+
+/**** RELEASE ****/
+
+    {
+        rc_t rc2 = KXMLDocRelease(doc);
+        if (rc == 0)
+        {   rc = rc2; }
+        doc = NULL;
+    }
+
+    {
+        rc_t rc2 = KXMLNodesetRelease(root);
+        if (rc == 0)
+        {   rc = rc2; }
+        root = NULL;
+    }
+
+    {
+        rc_t rc2 = KXMLMgrRelease(mgr);
+        if (rc == 0)
+        {   rc = rc2; }
+        mgr = NULL;
+    }
+
+    return rc;
+}
+
+/************************************ EOF ****************** ******************/
diff --git a/libs/kxml/xtoc-priv.h b/libs/kxml/xtoc-priv.h
new file mode 100644
index 0000000..688ec88
--- /dev/null
+++ b/libs/kxml/xtoc-priv.h
@@ -0,0 +1,124 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kfs_xtoc_priv_h_
+#define _h_kfs_xtoc_priv_h_
+
+#include <klib/defs.h>
+#include <klib/text.h>
+#include <klib/container.h>
+#include <stdarg.h>
+
+struct KFile;
+struct KDirectory;
+struct XToc;
+struct XTocEntry;
+struct XTocEntryDir;
+struct XTocEntryFile;
+struct XTocListing;
+
+/* ======================================================================
+ * shared path routines that really should be their own class
+ */
+
+rc_t XTocPathMakePath (char ** ppath, bool canon, const char * path,
+                       va_list args);
+
+/*
+ * In parsing the copycat XML we add nodes stating at the root XTocEntry
+ * of the XToc.
+ *
+ * For each node in the DOM add one entry in the XTocEntry for the containing
+ * container/archive/directory
+ *
+ * use the id="xxx" attribute to create a symbolic link in the root.
+ * we'll come up with a safe version of the name such as "id:1" using a name
+ * that won't exist in the regular filename space.
+ *
+ *Parameters:
+ *   self:      Use the inner most archive, directory, or container for self.
+ *              Use the root for the entries inside of root
+ *
+ *   entry:     Use a local XTocEntry pointer for each new node.  Some will 
+ *              remembered for a while and some won't.  It depends upon whether
+ *              it has subnodes.  Do not free or release these pointers.  Just
+ *              stop using them as they are not referenced counted and freed only
+ *              by the KToc itself when it is Whacked.
+ *
+ *   container: Use the most recent containing archive or container XTocEntry for
+ *              each new node.  Use root for those outside the outer most
+ *              container or archive.  Do not use directory nodes for this.
+ *
+ *   name:      comes directly form the XML as is
+ *
+ *   mtime:     comes directly form the XML converted to 64 bit unsigned
+ *
+ *   filetype:  comes directly form the XML as is
+ *
+ *   md5:       comes directly form the XML converted from hex string to byte string
+ *
+ *   size:      comes directly form the XML converty to 64 bit unsigned
+ *
+ * For each directory node in the XML use XTocTreeAddDir()
+ * For each archive node in the XML use XTocTreeAddArchive()
+ * For each container node in the XML use XTocTreeAddContainer()
+ * For each file node in the XML use XTocTreeAddFile()
+ * For each symlink node in the XML use XTocTreeAddSymLink()
+ *
+ * For each file, container, or archive use XTocTreeAddSymLink()
+ *  use the original root as self, a local pointer, name, mtime from the target and
+ *  path of the file, archive or container from the XML as target
+ *
+ * All of these are local and in Windows build they do not get the CC needed for inter-library calls.
+ */
+rc_t XTocParseXml (struct XTocEntry * root, const struct KFile * xml);
+
+rc_t XTocTreeAddFile      (struct XTocEntry * self, struct XTocEntry ** pentry,
+                           struct XTocEntry * container, const char * name,
+                           KTime_t mtime, const char * id, const char * filetype, 
+                           uint64_t size, uint64_t offset, uint8_t md5 [16]);
+
+rc_t XTocTreeAddContainer (struct XTocEntry * self, struct XTocEntry ** pentry,
+                           struct XTocEntry * container, const char * name,
+                           KTime_t mtime, const char * id, const char * filetype, 
+                           uint64_t size, uint64_t offset, uint8_t md5 [16]);
+
+rc_t XTocTreeAddArchive (struct XTocEntry * self, struct XTocEntry ** pentry,
+                         struct XTocEntry * container, const char * name,
+                         KTime_t mtime, const char * id, const char * filetype,
+                         uint64_t size, uint64_t offset, uint8_t md5 [16]);
+
+rc_t XTocTreeAddDir       (struct XTocEntry * self, struct XTocEntry ** entry,
+                           struct XTocEntry * container, const char * name,
+                           KTime_t mtime);
+
+rc_t XTocTreeAddSymlink   (struct XTocEntry * self, struct XTocEntry ** entry,
+                           struct XTocEntry * container, const char * name,
+                           KTime_t mtime, const char * target);
+
+
+#endif /* #ifndef _h_kfs_xtoc_priv_h_ */
+/* end of file */
diff --git a/libs/kxml/xtoc.c b/libs/kxml/xtoc.c
new file mode 100644
index 0000000..5f91869
--- /dev/null
+++ b/libs/kxml/xtoc.c
@@ -0,0 +1,3464 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/extern.h>
+
+#include <kxml/xml.h>
+
+#include <klib/defs.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/refcount.h>
+#include <klib/vector.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/namelist.h>
+
+#include <kfs/file.h>
+#include <kfs/bzip.h>
+#include <kfs/gzip.h>
+#include <kfs/directory.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <assert.h>
+
+#include <klib/debug.h>
+#define DBGTOC(m)   DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_TOC), m)
+#define DBGENTRY(m) DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_TOC), m)
+#define DBGCACHE(m) DBGMSG (DBG_KFS, DBG_FLAG(DBG_KFS_TOC), m)
+
+#include "xtoc-priv.h"
+
+struct KSysFile;
+
+typedef struct XToc XToc;
+static rc_t XTocRelease (const XToc * self);
+static rc_t XTocAddRef (const XToc * self);
+
+typedef struct XTocListing XTocListing;
+typedef struct XTocEntry XTocEntry;
+typedef struct KXTocDir KXTocDir;
+typedef struct KXTocFile KXTocFile;
+typedef struct XTocCache XTocCache;
+
+
+/* ======================================================================
+ * XTocEntry_t
+ *   Each node in the XToc tree needs to be one of a limited number of types
+ *   these relate to the KPathType for KDirectory but are more limited in
+ *   number.  However the file can explicity be treated as a directory if
+ *   flagged as such.
+ */
+
+typedef uint32_t XTocEntry_t;
+typedef enum XTocEntry_e
+{
+    xtoce_undefined,
+    xtoce_root,
+    xtoce_id,
+    xtoce_file,
+    xtoce_dir,
+    xtoce_link
+} XTocEntry_e;
+
+#define KDIR_IMPL struct KXTocDir
+#define KFILE_IMPL struct KXTocFile
+#include <kfs/impl.h>
+
+
+#define KNAMELIST_IMPL struct XTocListing
+#include <klib/impl.h>
+
+
+/* ======================================================================
+ * XTocEntry
+ *
+ * TBD:  More efficient use of memory might be obtained by converting
+ *       the union into space allocated after the main entry
+ */
+struct XTocEntry
+{
+    BSTNode     node;           /* book keeping for the tree structure */
+    String	name;           /* leaf name */
+    XTocEntry * parent;         /* directory containing this entry */
+    XTocEntry * container;      /* compressed file or archive holding this */
+    XTocEntry * root;           /* base entry of the TOC that is '/' */
+    XTocCache * cache;          /* if opened this will be non-NULL */
+    KTime_t     mtime;          /* object modified time/date from the XML */
+    BSTree      tree;           /* objects below this (inverse of parent */
+    XTocEntry_t type;           /* XTocEntry_e */
+    union utype
+    {
+        struct /* idtype - name conflict on Solaris */
+        {
+            XTocEntry * target;
+        } id;
+
+        struct dirtype
+        {
+            int ignored;        /* currently nothing is here */
+        } dir;
+
+        struct filetype
+        {
+            String   filetype;  /* string from copycat XML describing file */
+            uint64_t size;      /* size of file within archive or decompressed */
+            uint64_t offset;    /* offset with in containing file */
+            uint8_t  md5 [16];  /* md5 sum digest */
+            bool has_tree;      /* tree is meaningfull if not false: see next two */
+            bool archive;       /* set if this is an archive, has_tree also set */
+            bool container;     /* set if this is acompressed file, has_tree also set */
+        } file;
+
+        struct linktype
+        {
+            String target;      /* path of the symbolic link */
+        } link;
+    } u;
+};
+
+#if _DEBUGGING
+#define DBG_XTocEntry(p)                                                \
+    {                                                                   \
+        DBGENTRY(("XTocEntry: %p\n", p));                               \
+        if (p)                                                          \
+        {                                                               \
+            DBGENTRY(("    name:      %S\n", &(p)->name));              \
+            DBGENTRY(("    parent:    %p\n", (p)->parent));             \
+            DBGENTRY(("    container: %p\n", (p)->container));          \
+            DBGENTRY(("    root:      %p\n", (p)->root));               \
+            DBGENTRY(("    cache:     %p\n", (p)->cache));              \
+            DBGENTRY(("    tree:      %p\n", (p)->tree));               \
+            DBGENTRY(("    type:      %u\n", (p)->type));               \
+            if ((p)->type == xtoce_id)                                  \
+                DBGENTRY(("    target:      %p\n", &(p)->u.id.target)); \
+            else if ((p)->type == xtoce_link)                          \
+                DBGENTRY(("    target:      %S\n", &(p)->u.link.target)); \
+            else if((p)->type == xtoce_file)                            \
+            {                                                           \
+                DBGENTRY(("    filetype:     %S\n", &(p)->u.file.filetype)); \
+                DBGENTRY(("    size:         %lu\n", (p)->u.file.size)); \
+                DBGENTRY(("    offset:       %lu\n", (p)->u.file.offset)); \
+                DBGENTRY(("    base_tree:    %u\n", (p)->u.file.has_tree)); \
+                DBGENTRY(("    archive:      %u\n", (p)->u.file.archive)); \
+                DBGENTRY(("    container:    %u\n", (p)->u.file.container));  }}}
+#else
+#define DBG_XTocEntry(p)
+#endif
+
+/* function for BSTreeInsert or BSTreeInsertUnique */
+static
+int64_t CC XTocEntrySort (const BSTNode * item, const BSTNode * n)
+{
+    return StringCompare (&((const XTocEntry*)item)->name,
+                          &((const XTocEntry*)n)->name);
+}
+
+/* function for BSTreeFind */
+static
+int64_t CC XTocEntryCmpString (const void * item, const BSTNode * n)
+{
+    return (int)StringCompare ((const String *)item, 
+                               &((const XTocEntry*)n)->name);
+}
+
+/* forward as we have a loop in calls */
+static
+void XTocTreeWhack (BSTNode * item, void * data);
+
+/*
+ * XTocEntryDestroy
+ *  object destructor
+ *  It recursively destroys entries in its tree
+ */
+static
+void XTocEntryDestroy (XTocEntry * self)
+{
+    if (self)
+    {
+        switch (self->type)
+        {
+        case xtoce_root:
+        case xtoce_dir:
+        case xtoce_file:
+            /* delete an entries below this one */
+            BSTreeWhack (&self->tree, XTocTreeWhack, NULL);
+            break;
+        case xtoce_link:
+        case xtoce_id:
+        default:
+            break;
+        }
+        free (self);
+    }
+}
+
+/* recursive destructor call for BSTreeWhack */
+static
+void XTocTreeWhack (BSTNode * item, void * data)
+{
+    XTocEntryDestroy ((XTocEntry*)item);
+}
+
+
+rc_t XTocEntryResolvePath (const XTocEntry * self, const char * path_, bool follow_link,
+                           XTocEntry ** pnode)
+{
+    rc_t rc = 0;
+    const char * path;
+    const char * limit;
+    XTocEntry * node;
+    size_t size;
+
+    assert (self);
+    assert (path_);
+    assert (pnode);
+#if 0
+    DBGENTRY (("%s: resolve %s from %p\n", __func__, path_, self));
+#endif
+    node = (XTocEntry *)self;
+#if 0
+    DBGENTRY(("%s: node starts at %s\n", __func__, node ? node->name.addr : "NULL"));
+#endif
+    path = path_;
+#if 0
+    /* this was causing a seg fault for some reason */
+    limit = path + string_size (path);
+#else
+    limit = path + string_measure(path, &size);
+#endif
+
+    do
+    {
+        String s;
+        char * slash;
+        size_t z;
+        BSTree * t;
+#if 0
+        DBGENTRY (("%s: path %s size %lu %p - %p = %lu\n", __func__, path, string_size(path), limit, path, limit-path));
+#endif
+        while (*path == '/')
+                ++path;
+
+        z = limit - path;
+        if (z == 0)
+            break;
+#if 0
+        DBGENTRY (("%s: path %s z %lu %p - %p = %lu\n", __func__, path, z, limit, path, limit-path));
+        DBG_XTocEntry(node);
+#endif
+        switch (node->type)
+        {
+        case xtoce_link:
+        {
+            XTocEntry * nnode;
+            rc = XTocEntryResolvePath (node, node->u.link.target.addr,
+                                       follow_link, &nnode);
+#if 0
+            DBGENTRY(("%s: node becomes %s\n", __func__, node ? node->name.addr : "NULL"));
+#endif
+            if (rc)
+                return rc;
+
+            node = nnode;
+            continue;
+        }
+        case xtoce_id:
+            /* this needed to be a leaf */
+            rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid);
+            LOGERR (klogErr, rc, "bad path resolving path by id in XML FS");
+            return rc;
+        default:
+            return RC (rcFS, rcDirectory, rcResolving, rcPath, rcIncorrect);
+
+        case xtoce_file:
+            if ( ! node->u.file.has_tree)
+            {
+                /* this needed to be a leaf */
+                rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid);
+                LOGERR (klogErr, rc, "bad path resolving path by name in XML FS");
+                return rc;
+            }
+            /* fall through */
+        case xtoce_root:
+        case xtoce_dir:
+            t = &node->tree;
+            break;
+        }
+        slash = string_chr (path, z, '/');
+        if (slash)
+            z = slash - path;
+
+        StringInit (&s, path, z, string_len (path, z));
+#if 0
+        DBGENTRY (("%s: as String %S\n", __func__, &s));
+#endif
+        node = (XTocEntry*)BSTreeFind (t, &s, XTocEntryCmpString);
+#if 0
+        DBGENTRY (("%s: node is now %p\n", __func__, node));
+#endif
+        if (node == NULL)
+            return RC (rcFS, rcDirectory, rcResolving, rcPath, rcNotFound);
+
+        path += StringSize (&s);
+#if 0
+        DBGENTRY (("%s: looping at %s %p %p\n", __func__, path, path, limit-1));
+#endif
+    } while (path < limit-1);
+
+    if (rc == 0)
+    {
+        if(path[0] == '\0')
+        {
+            switch (node->type)
+            {
+            case xtoce_id:
+                node = node->u.id.target;
+                if (node == NULL)
+                    rc = RC (rcFS, rcDirectory, rcResolving, rcLink, rcCorrupt);
+                break;
+            case xtoce_link:
+                if (follow_link)
+                    return XTocEntryResolvePath (node, path, follow_link, pnode);
+            default:
+                break;
+            }
+        }
+        *pnode = node;
+    }
+#if 1
+    DBGENTRY(("%s: %R\n",__func__, rc));
+#endif
+    return rc;
+}
+
+
+KPathType XTocEntryPathType (const XTocEntry * self, const char * path)
+{
+    rc_t rc;
+    KPathType type = 0;
+    XTocEntry * node;
+
+    rc = XTocEntryResolvePath (self, path, false, &node);
+    if ((rc == 0) && (node->type == xtoce_link))
+        type = kptAlias;
+
+    rc = XTocEntryResolvePath (self, path, true, &node);
+    if (rc)
+    {
+        if (GetRCState (rc) == rcNotFound)
+            return type | kptNotFound;
+        return type | kptBadPath;
+    }
+
+    switch (node->type)
+    {
+    default:
+    case xtoce_undefined:
+        return type | kptBadPath;
+
+    case xtoce_root:
+    case xtoce_dir:
+        return type | kptDir;
+
+    case xtoce_file:
+#if 0
+    /* archives and containers are files */
+        return type | kptFile;
+#else
+    /* archives and containers are directories */
+        return type | (node->u.file.has_tree) ? kptDir : kptFile;
+#endif
+        /* not sure how we'd get here */
+    case xtoce_link:
+        return type | kptBadPath;
+    }
+}
+
+
+/* ======================================================================
+ * rc_t XTocTree
+ *   This set of functions is the API for building up the entries within an 
+ *   XToc.
+ */
+
+/*
+ * XTocEntryMakeInt
+ *
+ *  This function creates and initializes the common part of the
+ *  XTocEntry
+ *
+ *  extra_alloc is space set aside for string space not initialized
+ *              here.  target path in links for example
+ */
+static
+rc_t XTocEntryMakeInt (XTocEntry ** pself, const char * name,
+                       XTocEntry * parent, XTocEntry * container,
+                       KTime_t mtime, size_t extra_alloc)
+{
+    XTocEntry * self;
+    char * pc;
+    size_t  z;
+    rc_t rc = 0;
+
+    assert ((container != NULL) || (strcmp(name,"/") == 0));
+    assert (name);
+    assert (pself);
+
+    z = string_size (name) + 1;
+
+    if (z <= 1)
+    {
+        rc = RC (rcFS, rcTocEntry, rcConstructing, rcName, rcTooShort);
+        LOGERR (klogErr, rc, "No name for directory entry in XML TOC");
+        return rc;
+    }
+
+    /* allocate the memory for the entry node.  
+     * size of the node, space for the name and extra space requested
+     * by the caller of this intermediate function
+     */
+    self = malloc (sizeof (*self) + z + extra_alloc);
+    DBGENTRY (("%s: entry %p name %s\n",__func__,self,name));
+    if (self == NULL)
+        rc = RC (rcFS, rcToc, rcConstructing, rcMemory, rcExhausted);
+
+    else
+    {
+        /* copy the name immediately after the common section */
+        pc = (char*)(self+1);
+        string_copy (pc, z, name, z);
+        z --;
+        StringInit (&self->name, pc, z, string_len (pc, z));
+
+        self->container = container;
+        self->parent = parent;
+        self->root = container == NULL ? container : container->root;
+        self->cache = NULL;
+        self->mtime = mtime;
+        BSTreeInit (&self->tree);
+        if (parent)
+            rc = BSTreeInsert (&parent->tree, &self->node, XTocEntrySort);
+        if (rc == 0)
+        {
+            *pself = self;
+            return 0;
+        }
+        XTocEntryDestroy (self);
+    }
+    return rc;
+}
+
+static
+rc_t XTocTreeAddID (XTocEntry * self, const char * name, KTime_t mtime, 
+                    XTocEntry * target)
+{
+    XTocEntry * entry;
+    rc_t rc;
+
+    DBGENTRY(("%s: self %p name %s target %p\n", __func__, self, name, target));
+    rc = XTocEntryMakeInt (&entry, name, self, self, mtime, 0);
+    if (rc == 0)
+    {
+        entry->u.id.target = target;
+        entry->type = xtoce_id;
+        DBG_XTocEntry (entry);
+    }
+    return rc;
+}
+
+
+rc_t XTocTreeAddDir (XTocEntry * self, XTocEntry ** pentry, XTocEntry * container,
+                           const char * name, KTime_t mtime)
+{
+    rc_t rc = XTocEntryMakeInt (pentry, name, self, container, mtime, 0);
+    if (rc == 0)
+    {
+        (*pentry)->type = xtoce_dir;
+        DBG_XTocEntry (*pentry);
+    }
+    return rc;
+}
+
+
+rc_t XTocTreeAddSymlink   (XTocEntry * self, XTocEntry ** pentry, XTocEntry * container,
+                           const char * name, KTime_t mtime, const char * target)
+{
+    XTocEntry * entry;
+    size_t z = string_size (target) + 1;
+    rc_t rc = XTocEntryMakeInt (&entry, name, self, container, mtime, z);
+
+    if (rc == 0)
+    {
+        char * pc = (char *)entry->name.addr + entry->name.size + 1;
+        string_copy (pc, z, target, z);
+        z--;
+        StringInit (&entry->u.link.target, pc, z, string_len (pc, z));
+        entry->type = xtoce_link;
+        DBG_XTocEntry (entry);
+    }
+    *pentry = entry;
+    return rc;
+}
+
+
+rc_t XTocTreeAddFile      (XTocEntry * self, XTocEntry ** pentry,
+                           XTocEntry * container, const char * name,
+                           KTime_t mtime, const char * id,
+                           const char * filetype, uint64_t size,
+                           uint64_t offset, uint8_t md5 [16])
+{
+    XTocEntry * entry;
+    size_t z;
+    rc_t rc;
+
+    DBGENTRY (("%s: name %s id %s filetype %s\n", __func__, name, id, filetype));
+
+    z = string_size (filetype) + 1;
+    rc = XTocEntryMakeInt (&entry, name, self, container, mtime, z);
+    if (rc == 0)
+    {
+        char * pc;
+
+        pc = (char*)entry->name.addr + entry->name.size + 1;
+        string_copy (pc, z, filetype, z);
+        z--;
+
+        StringInit (&entry->u.file.filetype, pc, z, string_len (pc, z));
+        entry->u.file.size = size;
+        entry->u.file.offset = offset;
+        memmove (entry->u.file.md5, md5, sizeof entry->u.file.md5);
+        entry->u.file.has_tree = false;
+        entry->u.file.archive = false;
+        entry->u.file.container = false;
+        entry->type = xtoce_file;
+
+        DBGENTRY (("%s: entry %p entry->root %p id %s\n",
+                   __func__, entry, id, entry->root));
+        rc = XTocTreeAddID (entry->root, id, mtime, entry);
+        if (rc)
+        {
+            LOGERR (klogErr, rc, "failed to create alias id - continuing");
+            rc = 0;
+        }
+        DBG_XTocEntry (entry);
+    }
+    *pentry = entry;
+    return rc;
+}
+
+
+rc_t XTocTreeAddContainer (XTocEntry * self, XTocEntry ** pentry,
+                           XTocEntry * container, const char * name,
+                           KTime_t mtime, const char * id,
+                           const char * filetype, uint64_t size,
+                           uint64_t offset, uint8_t md5 [16])
+{
+    rc_t rc = XTocTreeAddFile (self, pentry, container, name, mtime, id, 
+                               filetype, size, offset, md5);
+    if (rc == 0)
+    {
+        (*pentry)->u.file.has_tree = true;
+        (*pentry)->u.file.container = true;
+        DBG_XTocEntry ((*pentry));
+    }
+    return rc;
+}
+
+
+rc_t XTocTreeAddArchive (XTocEntry * self, XTocEntry ** pentry,
+                         XTocEntry * container, const char * name,
+                         KTime_t mtime, const char * id,
+                         const char * filetype, uint64_t size,
+                         uint64_t offset, uint8_t md5 [16])
+{
+    rc_t rc = XTocTreeAddFile (self, pentry, container, name, mtime, id, 
+                               filetype, size, offset, md5);
+    if (rc == 0)
+    {
+        (*pentry)->u.file.has_tree = true;
+        (*pentry)->u.file.archive = true;
+        DBG_XTocEntry ((*pentry));
+    }
+    return rc;
+}
+
+
+/* ======================================================================
+ * XTocCache
+ *
+ * When an entry in the TOC is opened as either a file or a directory
+ * it is recorded in the tree indexed by path.  The objects in that
+ * tree are of tupe XTocCache
+ */
+struct XTocCache
+{
+    BSTNode node;
+    KRefcount refcount;
+    String path;
+    XToc * toc;                 /* ref counted keep daddy alive */
+
+    /* these three references are not reference counted */
+    XTocEntry * entry;
+
+    /* these references are back pointers for "re-opens" */
+    const KXTocFile * file;
+    const KXTocDir * dir;
+};
+static const char XTocCacheClassname[] = "XTocCache";
+
+#if _DEBUGGING
+#define DBG_XTocCache(p)                                                \
+    {   DBGCACHE(("XTocCache: %p\n", (p)));                             \
+        if (p) {                                                        \
+            DBGCACHE(("    refcount: %u\n",*(unsigned*)&(p)->refcount)); \
+            DBGCACHE(("    path:     %S\n",&(p)->path));                \
+            DBGCACHE(("    toc:      %p\n",(p)->toc));                  \
+            DBGCACHE(("    entry:    %p\n",(p)->entry));                \
+            DBGCACHE(("    file:     %p\n",(p)->file));                 \
+            DBGCACHE(("    dir:      %p\n",(p)->dir));                  \
+            if ((p)->file) DBG_KXTocDir((p)->file);                     \
+            if ((p)->dir) DBG_KXTocDir((p)->dir); }}
+#else
+#define DBG_XTocCache(p)
+#endif
+
+/* Sort
+ *   A sort comparitor suitable for BSTreeInsert/NSTreInsertUnique
+ */
+static
+int64_t CC XTocCacheSort (const BSTNode * item, const BSTNode * n)
+{
+    return StringCompare (&((const XTocCache*)item)->path,
+                          &((const XTocCache*)n)->path);
+}
+
+
+/* 
+ * Cmp
+ *   A sort comparitor suitable for BSTreeFind
+ */
+static
+int64_t CC XTocCacheCmp (const void * item, const BSTNode * n)
+{
+    const String * s = item;
+    const XTocCache * node = (const XTocCache *)n;
+    return StringCompare (s, &node->path);
+}
+
+
+/* 
+ * Destroy
+ */
+static void XTocCacheDestroy (XTocCache * self);
+
+
+/*
+ * AddRef
+ */
+static
+rc_t XTocCacheAddRef (const XTocCache * self)
+{
+    assert (self);
+    switch (KRefcountAdd (&self->refcount, XTocCacheClassname))
+    {
+    case krefLimit:
+        return RC (rcFS, rcToc, rcAttaching, rcRange, rcExcessive);
+    }
+    return 0;
+}
+
+
+/*
+ * Release
+ */
+static
+rc_t XTocCacheRelease (const XTocCache * cself)
+{
+    if (cself)
+    {
+        XTocCache * self = (XTocCache*)cself;
+        switch (KRefcountDrop (&self->refcount, XTocCacheClassname))
+        {
+        case krefWhack:
+            XTocCacheDestroy (self);
+        }
+    }
+    return 0;    
+}
+
+
+/*
+ * Make
+ *
+ * This creates the node with one reference.  The file or directory
+ * are not opened by this, nor are they initialized to non-NULL.
+ */
+static
+rc_t XTocCacheMake (XTocCache ** pself, String * path,
+                         XToc * toc, XTocEntry * entry)
+{
+    XTocCache * self;
+    char * pc;
+    rc_t rc;
+
+    assert (pself);
+    assert (path);
+    assert (entry);
+
+    *pself = NULL;
+
+    rc = XTocAddRef (toc);
+    if (rc)
+        return rc;
+
+    self = calloc (sizeof (*self) + 1 + StringSize (path), 1);
+    if (self == NULL)
+        return RC (rcFS, rcTocEntry, rcConstructing, rcMemory, rcExhausted);
+
+
+    KRefcountInit (&self->refcount, 1,  XTocCacheClassname, "Init",
+                   path->addr);
+
+    self->entry = entry;
+    self->toc = toc;
+
+    pc = (char *)(self + 1);
+    string_copy (pc, StringSize (path), path->addr, StringSize (path));
+    StringInit (&self->path, pc, StringSize(path), StringLength(path));
+    *pself = self;
+    return 0;
+}
+
+
+/* ======================================================================
+ * XToc
+ */
+
+/* ----------------------------------------------------------------------
+ * XToc
+ *   The flagshop class for this is a very simple class.  It has no use 
+ *   outside of NCBI at this point.
+ *
+ *   It maintains in debugging situations the path for the object that
+ *   was opened upon creation.
+ *
+ *   It maintains the directory like entries created by copycat when it
+ *    cataloged a submission.
+ *
+ *   It maintains a list of what fiels and directories within that catalog
+ *   are currently open.  A request to open it again will end up just reusing
+ *   the same KFile/KDirectory
+ */
+
+struct XToc
+{
+    String base_path;
+    KRefcount refcount;
+    XTocEntry * root;   /* binary search tree full objects of type XTocEntry */
+    BSTree open;        /* opened entries stored in an XTocCache */
+    XTocCache * cache;  /* shortcut to "/" cache entry - not ref counted */
+};
+static char XTocClassname[] = "XToc";
+
+#if _DEBUGGING
+#define DBG_XToc(p) \
+    {   DBGTOC(("XToc: %p\n", (p))); \
+        if (p) {                                                        \
+            DBGTOC(("    base_path: %S\n", &(p)->base_path));           \
+            DBGTOC(("    refcount:  %u\n", *(unsigned*)&(p)->refcount)); \
+            DBGTOC(("    root       %p\n", (p)->root));                 \
+            DBGTOC(("    open       %p\n", *(void**)&(p)->open)); \
+            DBGTOC(("    cache      %p\n", (p)->cache)); \
+            if((p)->root) DBG_XTocEntry((p)->root); \
+            if((p)->cache) DBGXTocCache((p)->cache); }}
+#else
+#define DBG_XToc(p)
+#endif
+
+static
+rc_t XTocDestroy (XToc * self)
+{
+    XTocEntryDestroy (self->root);
+    /* the open tree will be empty for us to get here */
+    free (self);
+    return 0;
+}
+
+
+static
+rc_t XTocAddRef (const XToc * self)
+{
+    if (self)
+        switch (KRefcountAdd (&self->refcount, XTocClassname))
+        {
+        case krefLimit:
+            return RC (rcFS, rcToc, rcAttaching, rcRange, rcExcessive);
+        }
+    return 0;
+}
+
+
+static
+rc_t XTocRelease (const XToc * cself)
+{
+    if (cself)
+    {
+        XToc * self = (XToc*)cself;
+        switch (KRefcountDrop (&self->refcount, XTocClassname))
+        {
+        case krefWhack:
+            XTocDestroy (self);
+        }
+    }
+    return 0;    
+}
+
+
+static
+void XTocCacheDestroy (XTocCache * self)
+{
+    assert (self);
+    BSTreeUnlink (&self->toc->open, &self->node);
+    self->entry->cache = NULL;
+    XTocRelease (self->toc);
+    free (self);
+}
+
+
+static
+rc_t XTocMake (XToc ** pself, const String * base_path)
+{
+    XToc * self;
+    char * pc;
+    rc_t rc;
+
+    assert (pself);
+    assert (base_path);
+
+    self = malloc (sizeof (*self) + StringSize(base_path) + 1);
+    if (self == NULL)
+        return RC (rcFS, rcToc, rcConstructing, rcMemory, rcExhausted);
+
+    pc = (char*)(self+1);
+    memmove (pc, base_path->addr, StringSize(base_path));
+    pc[StringSize(base_path)] = '\0';
+    StringInit (&self->base_path, pc, StringSize(base_path),
+                StringLength(base_path));
+
+    KRefcountInit (&self->refcount, 1, XTocClassname, "Init", base_path->addr);
+
+    rc = XTocEntryMakeInt (&self->root, "/", NULL, NULL,
+                           (KTime_t)time(NULL), 0);
+    if (rc)
+    {
+        free (self);
+        return rc;
+    }
+    self->root->type = xtoce_root;
+    self->root->container = self->root->root = self->root;
+    
+    BSTreeInit (&self->open);
+
+    *pself = self;
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * KXTocFile
+ *  
+ *
+ * This type exists only to keep the XToc Open
+ */
+struct KXTocFile
+{
+    KFile dad;
+    const KFile * base;
+    XTocCache * cache;
+    XTocEntry * entry;
+    String base_path;
+};
+#if _DEBUGGING
+#define DBG_KXTocFile(p)                             \
+    {   DBGTOC(("  KXTocFile: %p\n", (p)));                               \
+        if (p) {                                                        \
+            DBGTOC(("    dad.vt:            %p\n", (p)->dad.vt));           \
+            DBGTOC(("    dad.file:          %p\n",(p)->dad.dir));           \
+            DBGTOC(("    dad.refcount:      %u\n",*(unsigned*)&(p)->dad.refcount)); \
+            DBGTOC(("    dad.read_enabled:  %u\n",*(unsigned*)&(p)->dad.read_enabled)); \
+            DBGTOC(("    dad.write_enabled: %u\n",*(unsigned*)&(p)->dad.write_enabled)); \
+            DBGTOC(("    base:              %p\n",(p)->base));              \
+            DBGTOC(("    cache:             %p\n",(p)->cache));             \
+            DBGTOC(("    entry:             %p\n",(p)->entry));             \
+            DBGTOC(("    base_path:         %S\n",&(p)->base_path));        \
+            if ((p)->base){                                             \
+                DBGTOC(("      base->vt:            %p\n", (p)->base->vt));       \
+                DBGTOC(("      base->file:          %p\n",(p)->base->dir));       \
+                DBGTOC(("      base->refcount:      %u\n",*(unsigned*)&(p)->base->refcount)); \
+                DBGTOC(("      base->read_enabled:  %u\n",*(unsigned*)&(p)->base->read_enabled)); \
+                DBGTOC(("      base->write_enabled: %u\n",*(unsigned*)&(p)->base->write_enabled)); \
+            }}}
+#else
+#define DBG_KXTocFile(p)
+#endif
+
+/* Destroy
+ */
+static
+rc_t KXTocFileDestroy ( KXTocFile *self )
+{
+    assert (self);
+    KFileRelease (self->base);
+    XTocCacheRelease (self->cache);
+    free (self);
+    return 0;
+}
+
+/* GetSysFile
+ *  returns an underlying system file object
+ *  and starting offset to contiguous region
+ *  suitable for memory mapping, or NULL if
+ *  no such file is available.
+ */
+static
+struct KSysFile *KXTocFileGetSysFile ( const KXTocFile *self, uint64_t *offset )
+{
+#if 1
+    return NULL;
+#else
+    struct KSysfile * sf;
+    uint64_t loffset;
+
+    assert (self);
+    assert (offset);
+
+    sf = KFileGetSysFile (self->base, &loffset);
+    if (sf)
+        *offset = 0;
+    else
+        *offset = loffset + self->entry->u.file.offset;
+    return sf;
+#endif
+}
+
+/* RandomAccess
+ *  ALMOST by definition, the file is random access
+ *  certain file types ( notably compressors ) will refuse random access
+ *
+ *  returns 0 if random access, error code otherwise
+ */
+static
+rc_t KXTocFileRandomAccess ( const KXTocFile *self )
+{
+    assert (self);
+    return KFileRandomAccess (self->base);
+}
+
+
+/* Type
+ *  returns a KFileDesc
+ *  not intended to be a content type,
+ *  but rather an implementation class
+ */
+static
+uint32_t KXTocFileType ( const KXTocFile *self )
+{
+    assert (self);
+    return KFileType (self->base);
+}
+
+
+/* Size
+ *  returns size in bytes of file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t KXTocFileSize ( const KXTocFile *self, uint64_t *size )
+{
+    assert (self);
+    assert (size);
+    *size = self->entry->u.file.size;
+    return 0;
+}
+
+
+/* SetSize
+ *  sets size in bytes of file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t KXTocFileSetSize ( KXTocFile *self, uint64_t size )
+{
+    return RC (rcFS, rcFile, rcUpdating, rcSelf, rcUnsupported);
+}
+
+
+/* Read
+ *  read file from known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ *  "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually read
+ */
+static
+rc_t CC KXTocFileRead ( const KXTocFile *self, uint64_t pos,
+    void *buffer, size_t bsize, size_t *num_read )
+{
+    uint64_t size;
+    uint64_t limit;
+
+    assert (self);
+    assert (buffer);
+    assert (num_read);
+
+    DBG_XTocEntry(self->entry);
+
+    size = self->entry->u.file.size;    /* how big is our portion of the file */
+    if(pos >= size)  {                  /* if past end of file we're done */
+        *num_read = 0;
+        return 0;
+    }
+    limit = pos + bsize;                /* requested limit */
+    if(limit > size) {                  /* if beyond end of file trim it down */
+        limit = size;
+    }
+    return KFileRead (self->base, pos + self->entry->u.file.offset, buffer,
+                      limit - pos, num_read);
+}
+
+
+/* Write
+ *  write file at known position
+ *
+ *  "pos" [ IN ] - starting position within file
+ *
+ *  "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ *  "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ *  giving number of bytes actually written
+ */
+static
+rc_t KXTocFileWrite ( KXTocFile *self, uint64_t pos,
+    const void *buffer, size_t size, size_t *num_writ)
+{
+    return RC (rcFS, rcFile, rcUpdating, rcSelf, rcUnsupported);
+}
+
+
+/* Make
+ *  create a new file object
+ *  from file descriptor
+ */
+static KFile_vt_v1 vtKXTocFile =
+{
+    /* version 1.1 */
+    1, 1,
+
+    /* start minor version 0 methods */
+    KXTocFileDestroy,
+    KXTocFileGetSysFile,
+    KXTocFileRandomAccess,
+    KXTocFileSize,
+    KXTocFileSetSize,
+    KXTocFileRead,
+    KXTocFileWrite,
+    /* end minor version 0 methods */
+
+    /* start minor version == 1 */
+    KXTocFileType
+    /* end minor version == 1 */
+};
+
+
+static
+ rc_t KXTocFileMake (KXTocFile **pself, const KFile * base,
+                     XTocCache * cache, XTocEntry * entry,
+                     const String *path)
+{
+    KXTocFile * self;
+    rc_t rc;
+
+    assert (pself);
+    assert (base);
+    assert (cache);
+    assert (path);
+
+    self = malloc (sizeof (*self) + 1 + StringSize (path));
+    if (self == NULL)
+        rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+    else
+    {
+        rc = KFileInit (&self->dad, (const KFile_vt*)&vtKXTocFile, "KXTocFile", "no-name", true, false);
+        if (rc == 0)
+        {
+            rc = KFileAddRef (base);
+            if (rc == 0)
+            {
+                rc = XTocCacheAddRef (cache);
+                if (rc == 0)
+                {
+                    char * pc;
+
+                    pc = (char*)(self+1);
+                    string_copy (pc, StringSize(path), path->addr, StringSize(path));
+                    pc[StringSize(path)] = '\0';
+                    StringInit (&self->base_path, pc, StringSize (path),
+                                StringLength (path));
+                    self->base = base;
+                    self->entry = entry;
+                    self->cache = cache;
+
+                    cache -> file = self;
+
+                    * pself = self;
+                    return 0;
+                }
+
+                KFileRelease ( base );
+            }
+        }
+
+        free ( self );
+    }
+
+    PLOGERR (klogErr, 
+             (klogErr, rc,
+              "Unable to make/open $(F)",
+              "F=%S", path));
+
+    *pself = NULL;
+    return rc;
+}
+
+
+struct KXTocDir
+{
+    KDirectory dad;
+    const KDirectory * base;
+    XToc * toc;
+    XTocCache * cache;    /* owns a reference */
+    XTocEntry * entry;
+    XTocEntry * container;
+    XTocEntry * root;
+    String      base_path;
+};
+
+#if _DEBUGGING
+#define DBG_KXTocDir(p)                                                 \
+    {   if (p)                                                          \
+            DBGTOC(("KXTocDir -   %p\n"                                 \
+                    "   base_path %S\n"                                 \
+                    "   base      %p\n"                                 \
+                    "   cache     %p\n"                                 \
+                    "   entry     %p\n"                                 \
+                    "   container %p\n"                                 \
+                    "   root      %p\n",                                \
+                    p, &p->base_path, p->base, p->cache,                \
+                    p->entry, p->container, p->root));                  \
+        else DBGTOC(("KXTocDir @ NULL\n")); }
+#else
+#define DBG_KXTocDir(p)
+#endif
+/*--------------------------------------------------------------------------
+ * XTocListing
+ *  a directory listing
+ *
+ * NOTE:
+ * This is nearly identical to KSysDirListing but both are currently private to
+ * their compilation units.
+ */
+struct XTocListing
+{
+    KNamelist dad;      /* base class */
+    Vector    list;
+    XTocEntry * entry;
+};
+
+
+
+/* ======================================================================
+ * shared path routines that really should be their own class
+ */
+/* ----------------------------------------------------------------------
+ * KXTocDirCanonPath
+ *
+ * In this context CanonPath means to make the path a pure /x/y/z with no back tracking 
+ * by using ~/../~ or redundant ~/./~ or ~//~ here notations.  Not exactly the usage of 
+ * canonical in describing a path in other places but consistent within KFS.  It matches
+ * the common meaning of canonical path as the one true path except that processing out
+ * of sym links isn't done here but would normally have been.  Not processing the 
+ * links means potentially more than one canonical path can reach the same target 
+ * violating the usual meaning of canonical path as the one true shortest path to any
+ * element.
+ *
+ * const KXTocDir *		self		Object oriented C; KXTocDir object for this method
+ * enum RCContext 		ctx
+ * char * 			path
+ * size_t			psize
+ */
+static
+rc_t XTocPathCanonize (char * path, size_t psize)
+{
+    char *	low;	/* a pointer to the root location in path; not changed after initialization */
+    char *	dst;	/* a target reference for compressing a path to remove . and .. references */
+    char *	last;	/* the end of the last processed facet of the path */
+    char *	end;	/* absolute end of the incoming path */
+    char * 	src;	/* the start of the current facet to be processed */
+
+    /* end is the character after the end of the incoming path */
+    end = path + psize;
+
+    /* point all other temp pointers at the root point in the incoming path */
+    last = path;
+
+    /* handle windows / / network path starter */
+    if ((last == path) && (last[0] == '/') && (last[1] == '/'))
+      last ++;
+
+    low = dst = last;
+
+    for (;;)
+    {
+
+	/* point at the first / after the most recent processed facet */
+	src = string_chr (last + 1, end-last-1, '/');
+	if (src == NULL)	/* if no '/' point to the end */
+	    src = end;
+
+	/* detect special sequences */
+	switch (src - last)
+	{
+	case 1: /* / / (with nothing between) is a superflouous / hurting us to parse later;
+		 * /. is a here reference to the same directory as the previous */
+	    if ((last[1] == '/')||(last[1] == '.'))
+	    {
+		/* skip over */
+		last = src;
+		if (src != end)
+		    continue;
+	    }
+	    break;
+	case 2: /* /./ is a "here" reference point and is omitted by not copying it over */
+	    if (last[1] == '.')
+	    {
+		/* skip over */
+		last = src;
+		if (src != end)
+		    continue;
+	    }
+	    break;
+
+	case 3: /* /../ is a up one directory and is processed by deleting the last facet copied */
+	    if (last [1] == '.' && last [2] == '.')
+	    {
+		/* remove previous leaf in path */
+		dst [ 0 ] = 0;
+		dst = string_rchr (path, end-path, '/');
+		/* can't up a directory past the root */
+		if (dst == NULL || dst < low)
+		{
+		    return RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid);
+		}
+
+		last = src;
+		if (src != end)
+		    continue;
+	    }
+	    break;
+	}
+
+	/* if rewriting, copy leaf */
+	if (dst != last)
+	{
+	    memmove (dst, last, src - last);
+	}
+
+	/* move destination ahead */
+	dst += src - last;
+        
+	/* if we're done, go */
+	if (src == end)
+	    break;
+
+	/* find next separator */
+	last = src;
+    }
+
+    /* NUL terminate if modified */
+    if (dst != end)
+	* dst = 0;
+
+    /* say we did did it with no problems */
+    return 0;
+}
+
+
+rc_t XTocMakePath (const char ** ppath, bool canon, const char * path, va_list args)
+{
+    char * b;
+    size_t bz;  /* size to allocate */
+    rc_t rc = 0;
+    bool   use_printf;
+
+    assert (ppath);
+    assert (path);
+#if 0
+    DBGTOC(("%s: make path from %s\n", __func__, path));
+#endif
+    b = NULL;
+    bz = string_size (path) + 1;  /* start assuming out is same size as in */
+
+    use_printf = (string_chr (path, bz, '%') != NULL);
+    if (use_printf)
+    {
+        char shortbuff [32];
+        int  pz = vsnprintf (shortbuff, sizeof shortbuff, path, args);
+        if (pz < 0)
+        {
+            rc = RC (rcFS, rcDirectory, rcFormatting, rcPath, rcInvalid);
+            DBGTOC(("%s: invalid path %s\n", __func__, path));
+            LOGERR(klogErr, rc, "Error building XTOC path");
+            return rc;
+        }
+        bz = pz + 1;
+    }
+
+    b = malloc (bz);
+    if (b == NULL)
+        return RC (rcFS, rcDirectory, rcFormatting, rcMemory, rcExhausted);
+
+    if (use_printf)
+    {
+        int pz = vsnprintf (b, bz, path, args);
+        if (pz < 0)
+            rc = RC (rcFS, rcDirectory, rcFormatting, rcPath, rcInvalid);
+        else
+            b[pz] = '\0';
+    }
+    else
+        string_copy (b, bz, path, bz);
+
+    if ((rc == 0) && canon)
+        rc = XTocPathCanonize (b, bz);
+
+    if (rc == 0)
+        *ppath = b;
+    else
+        free (b);
+    return 0;
+}
+
+static char * XTocEntryMakeFullPathRecur (XTocEntry * self, size_t also, 
+                                          char ** phere)
+{
+    char * path;
+    char * here;
+
+    assert (self);
+
+#if 0
+    DBGENTRY(("%s: self %p also %lu  %p\n",__func__,self,also,phere));
+    DBG_XTocEntry(self);
+#endif
+    if (self->type == xtoce_root)
+    {
+        *phere = NULL;
+        path = malloc (2 + also);
+        if (path != NULL)
+        {
+            path[0] = '/';
+            path[1] = '\0';
+            *phere = path;
+        }
+#if 0
+        DBGENTRY (("%s: path %s %p %p\n", __func__, path, path, *phere));
+#endif
+    }
+    else
+    {
+        path = XTocEntryMakeFullPathRecur (self->parent,
+                                           also + 1 + StringSize (&self->name),
+                                           &here);
+        if (path == NULL)
+        {
+            *phere = NULL;
+            return NULL;
+        }
+#if 0
+        DBGENTRY (("%s: path '%s' %p '%s' %p\n",__func__, path, path, here, here));
+#endif
+        here[0] = '/';
+        string_copy (here+1, StringSize (&self->name) + 1,
+                     self->name.addr, StringSize (&self->name));
+        *phere = here + 1 + StringSize (&self->name);
+    }
+    return path;
+}
+
+static
+rc_t XTocEntryMakeFullPath (XTocEntry * self, const char ** pfull)
+{
+    char * ignored;
+    char * full_path;
+#if 0
+    DBGENTRY(("%s: self %p pfull %p\n",__func__,self,pfull));
+#endif
+    assert (pfull);
+    *pfull = NULL;
+    full_path = XTocEntryMakeFullPathRecur (self, 0, &ignored);
+    if (full_path == NULL)
+        return RC (rcFS, rcPath, rcCreating, rcMemory, rcExhausted);
+    *pfull = full_path;
+    return 0;
+}
+
+
+
+/* ======================================================================
+ */
+/* ----------------------------------------------------------------------
+ * XTocListingDestroy
+ * Class destructor
+ *
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [INOUT] XTocListing *	self		Listing self reference: object oriented in C
+ */
+static
+rc_t CC XTocListingDestroy (XTocListing *self)
+{
+    VectorWhack (&self->list, NULL, NULL);
+    free (self);
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * XTocListingCount
+ *
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]  const XTocListing *	self		Listing self reference: object oriented in C
+ * [OUT] uint32_t *		count		Where to put the count of names
+ */
+static rc_t CC XTocListingCount (const XTocListing *self, uint32_t *count)
+{
+    *count = VectorLength (&self->list);
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * XTocListingGet
+ *
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]  const XTocListing *	self		Listing self reference: object oriented in C
+ * [IN]  uint32_t		idx		?
+ * [OUT] const char **		name		Where to put the name
+ */
+static rc_t CC XTocListingGet (const XTocListing *self, uint32_t idx, const char **name)
+{
+    uint32_t count;
+    rc_t rc;
+
+    rc = XTocListingCount(self, &count);
+    if (rc == 0)
+    {
+        if (idx >= count)
+            return RC (rcFS, rcNamelist, rcAccessing, rcParam, rcExcessive);
+        *name = VectorGet (&self->list, idx);
+    }
+    return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * XTocListingSort
+ *
+ * This function has the signature needed to use with the NameList base class for
+ * XTocListings to determine the order of two names.  Matches the signature of
+ * strcmp() and other functions suitable for use by qsort() and others
+ *
+ * [RET] int					0:  if a == b 
+ *						<0: if a < b
+ *						>0: if a > b
+ * [IN] const void *		a
+ * [IN] const void *		b
+ *
+ * Elements are typed as const void * to match the signature needed for 
+ * a call to qsort() but they should be pointers to namelist elements
+ */
+#if NOT_YET
+static int CC XTocListingSort (const void *a, const void *b, void * ignored)
+{
+    return strcmp (*(const char**)a, *(const char**)b);
+}
+#endif
+static KNamelist_vt_v1 vtXTocListing =
+{
+    /* version 1.0 */
+    1, 0,
+
+    /* start minor version 0 methods */
+    XTocListingDestroy,
+    XTocListingCount,
+    XTocListingGet
+    /* end minor version 0 methods */
+};
+
+
+/* ----------------------------------------------------------------------
+ * XTocListingInit
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [INOUT] XTocListing *	self		Listing self reference: object oriented in C
+ * [IN]    const char *		path		?
+ * [IN]    const KDirectory *	dir		?
+ * [IN]    bool (* 		f	)(const KDirectory*, const char*, void*),
+ *						This is a filter function - any listing element
+ *						passed to this function will generate a true ot
+ *						a false.  If false that listing element is dropped.
+ *						If this parameter is NULL all elements are kept.
+ * [IN]	   void *		data		Ignored.  May use NULL if permitted
+ *						by 'f'.
+ */
+struct XTocListingInitData
+{
+    Vector * v;
+    rc_t rc;
+};
+static
+void CC XTocListingAdd (BSTNode * n_, void * data_)
+{
+    struct XTocListingInitData * data = data_;
+    const XTocEntry * n = (const XTocEntry *)n_;
+
+    if (data->rc == 0)
+    {
+        data->rc = VectorAppend (data->v, NULL, n->name.addr);
+    }
+}
+
+
+rc_t XTocListingMake (XTocListing ** pself, XTocEntry * entry,
+                      bool (CC* f) (const KDirectory*, const char*, void*),
+                      void *data)
+{
+    XTocListing * self;
+    BSTree * tree;
+    rc_t rc;
+
+    /* is self parameter possibly NULL? */
+    if (pself == NULL)
+    {
+	return  RC (rcFS, rcDirectory, rcConstructing, rcSelf, rcNull);
+    }
+    *pself = NULL;
+
+    self = malloc (sizeof (*self));
+    if (self == NULL)
+        return RC (rcFS, rcListing, rcConstructing, rcMemory, rcExhausted);
+
+    switch (entry->type)
+    {
+    default:
+        return RC (rcFS, rcDirectory, rcConstructing, rcListing, rcIncorrect);
+
+    case xtoce_file:
+    case xtoce_dir:
+        tree = &entry->tree;
+        break;
+    }
+
+    /* start with an empty name list */
+    VectorInit (&self->list, 0, 16);
+
+    /* initialize the Namelist base class */
+    if ((rc = KNamelistInit (& self -> dad,
+			     (const KNamelist_vt*)&vtXTocListing)) == 0)
+    {
+        struct XTocListingInitData data;
+
+        data.v = &self->list;
+        data.rc = 0;
+
+        BSTreeForEach (tree, false, XTocListingAdd, &data);
+
+        rc = data.rc;
+    }
+    if (rc == 0)
+        *pself = self;
+    return rc;
+}
+
+
+static
+rc_t XTocFindXTocCache (XToc * self, XTocCache ** pcache,
+                        const String * spath)
+{
+    XTocCache * cache;
+    assert (self);
+    assert (pcache);
+    assert (spath);
+
+    DBGTOC(("%s: self %p pcache %p spath %S\n",__func__,self,pcache,spath));
+    cache = (XTocCache*)BSTreeFind (&self->open, spath, XTocCacheCmp);
+    DBGTOC(("%s: found cache %p\n",__func__,cache));
+    *pcache = cache;
+    return cache ? 0 : RC (rcFS, rcToc, rcSearching, rcNode, rcNotFound);
+}
+
+
+static
+rc_t XTocMakeXTocCache (XToc * self, XTocCache ** pcache,
+                        String * path, XTocEntry * entry)
+{
+    XTocCache * cache;
+    rc_t rc;
+
+    assert (self);
+    assert (pcache);
+    assert (path);
+
+/*     DBGTOC(("%s: %S\n",path)); */
+    *pcache = NULL;
+    rc = XTocCacheMake (&cache, path, self, entry);
+    if (rc)
+        PLOGERR (klogErr,
+                 (klogErr, rc, "error creating cache entry for $(P)",
+                  "P=%S", path));
+    else
+    {
+        union
+        {
+            BSTNode * b;
+            XTocCache * x;
+        } exist;
+        DBGTOC(("%s: insert cache\n",__func__));
+        rc = BSTreeInsertUnique (&self->open, &cache->node, &exist.b, XTocCacheSort);
+        if (rc)
+            PLOGERR (klogErr,
+                     (klogErr, rc, "error inserting cache entry for $(P)",
+                      "P=%S", path));
+        else
+        {
+            *pcache = entry->cache = cache;
+            return 0;
+        }
+        XTocCacheDestroy (cache);
+    }
+    return rc;
+}
+
+
+static
+rc_t XTocDirGetCache (const KXTocDir * self, const char * path_, XTocCache ** pcache)
+{
+    const char * path;  /* absolute canonical path in ASCIZ */
+    String spath;       /* absolute canonical path as a String */
+    XTocEntry * entry;  /* toc entry for the path */
+    XTocCache * cache;  /* cache entry for the path */
+    rc_t rc;
+
+    assert (self);
+    assert (path_);
+    assert (pcache);
+
+    DBGCACHE(("%s: Get cache node for %s\n", __func__, path_));
+
+    /* assume not found or errors */
+    *pcache = NULL;
+
+    /* first resolve the path to an entry node */
+    rc = XTocEntryResolvePath (self->entry, path_, true, &entry);
+    DBGCACHE (("%s: path resolved\n",__func__));
+    if (rc)
+    {
+        PLOGERR (klogErr, 
+                 (klogErr, rc, "Unable to resolve path $(P)",
+                  "P=%s", path_));
+        return rc;
+    }
+
+    DBGCACHE(("%s: entry  %p\n",__func__,entry));
+
+    /* now create a actual canonical path from the root to the located entry
+     * the incoming path could have had symbolic links or the like so we're
+     * making it a single non-ambiguous version
+     */
+    rc = XTocEntryMakeFullPath (entry, &path);
+    if (rc)
+    {
+        PLOGERR (klogErr, 
+                 (klogErr, rc, "Unable to build full path for $(P)",
+                  "P=%s", path_));
+        return rc;
+    }
+
+    /* make a String version as that is what the cache holds */
+    StringInitCString (&spath, path);
+    DBGCACHE(("%s: made full path %S %s\n",__func__,&spath,path));
+
+    /* see if it's already open */
+
+    rc = XTocFindXTocCache (self->toc, &cache, &spath);
+    if (rc == 0)
+    {
+        DBGCACHE(("%s: found an existing cache node for %S\n",__func__,&spath));
+        XTocCacheAddRef (cache);
+    }
+    else
+    {
+        DBGCACHE(("%s: did not find an existing cache node for %S\n",__func__,&spath));
+        /* not found is not an error condition */
+        if (GetRCState(rc) == rcNotFound)
+        {
+            /* not found so make one */
+            rc = XTocMakeXTocCache (self->toc, &cache, &spath, entry);
+            DBGCACHE(("%s: made a cache node %p\n",__func__,cache));
+        }
+    }
+    /* for rc to be 0 here we either found or created a cache node
+     * we will have an ownership apassed to the caller
+     */
+    if (rc == 0)
+        *pcache = cache;
+    /* free allocated path in a buffer */
+    free ((void*)path);
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KXTocDirDestroy
+ */
+static
+rc_t CC KXTocDirDestroy (KXTocDir *self)
+{
+    assert (self);
+
+    XTocCacheRelease (self->cache);
+    KDirectoryRelease (self->base);
+    free (self);
+    return 0;
+}
+
+
+
+
+/* ----------------------------------------------------------------------
+ * KXTocDirList
+ *  create a directory listing
+ *
+ *  "list" [ OUT ] - return parameter for list object
+ *
+ *  "path" [ IN, NULL OKAY ] - optional parameter for target
+ *  directory. if NULL, interpreted to mean "."
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]	 const KXTocDir *	self		Object oriented C; KXTocDir object for this method
+ * [OUT] KNamelist **		listp,
+ * [IN]  bool (* 		f	)(const KDirectory*,const char *, void *)
+ * [IN]  void *			data
+ * [IN]  const char *		path
+ * [IN]  va_list		args
+ */
+static
+rc_t CC KXTocDirList (const KXTocDir *self,
+                     KNamelist **listp,
+                     bool (CC* f) (const KDirectory *dir, const char *name, void *data),
+                     void *data,
+                     const char *path_,
+                     va_list args)
+{
+    const char * path;
+    rc_t rc;
+
+    if (path_ == NULL)
+        path_ = "/";
+
+    rc = XTocMakePath (&path, true, path_, args);
+    if (rc == 0)
+    {
+        struct XTocEntry * node;
+
+        rc = XTocEntryResolvePath (self->entry->root, path, true, &node);
+        if (rc == 0)
+        {
+            rc = XTocListingMake ((struct XTocListing **)listp, node, f, data);
+        }
+        free ((void*)path);
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KXTocDirPathType
+ *  returns a KPathType
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ *
+ * [RET] uint32_t
+ * [IN]  const KXTocDir *	self		Object oriented C; KXTocDir object for this method
+ * [IN]  const char *		path
+ * [IN]  va_list		args
+ */
+static KPathType CC KXTocDirPathType (const KXTocDir *self, const char *path_, va_list args)
+{
+    const char * path;
+    rc_t rc;
+    KPathType type = kptBadPath;
+
+    rc = XTocMakePath (&path, true, path_, args);
+    if (rc == 0)
+    {
+        type = XTocEntryPathType (self->cache->entry->root, path);
+        free ((void*)path);
+    }
+    return type;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KXTocDirRelativePath
+ *
+ * KXTocDirRelativePath
+ *  makes "path" relative to "root"
+ *  both "root" and "path" MUST be absolute
+ *  both "root" and "path" MUST be canonical, i.e. have no "//", "/./" or "/../" sequences
+ *
+ * [RET] rc_t					0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN] const KXTocDir *		self		Object oriented C; KXTocDir object for this method
+ * [IN] enum RCContext 		ctx
+ * [IN] const char *		root
+ * [IN] char *			path
+ * [IN] size_t			path_max
+ */
+#if not_USED
+static
+rc_t KXTocDirRelativePath (const KXTocDir *self, enum RCContext ctx,
+                           const char *root, char *path, size_t path_max)
+{
+#if 1
+    return -1;
+#else
+    int backup;
+    size_t bsize, psize;
+    size_t size;
+
+    const char *r = root + self -> root;
+    const char *p = path + self -> root;
+
+    assert (r != NULL && r [ 0 ] == '/');
+    assert (p != NULL && p [ 0 ] == '/');
+
+    for (; * r == * p; ++ r, ++ p)
+    {
+	/* disallow identical paths */
+	if (* r == 0)
+	    return RC (rcFS, rcDirectory, ctx, rcPath, rcInvalid);
+    }
+
+    /* paths are identical up to "r","p"
+       if "r" is within a leaf name, then no backup is needed
+       by counting every '/' from "r" to end, obtain backup count */
+    for (backup = 0; * r != 0; ++ r)
+    {
+	if (* r == '/')
+	    ++ backup;
+    }
+
+    /* the number of bytes to be inserted */
+    bsize = backup * 3;
+
+    /* align "p" to last directory separator */
+    while (p [ -1 ] != '/') -- p;
+
+    /* the size of the remaining relative path */
+    psize = string_measure(p, &size);
+
+    /* open up space if needed */
+    if ( (size_t)(p - path) < bsize )
+    {
+	/* prevent overflow */
+	if (bsize + psize >= path_max)
+	    return RC (rcFS, rcDirectory, ctx, rcPath, rcExcessive);
+	memmove (path + bsize, p, psize);
+    }
+
+    /* insert backup sequences */
+    for (bsize = 0; backup > 0; bsize += 3, -- backup)
+	memmove (& path [ bsize ], "../", 3);
+
+    /* close gap */
+    if ( (size_t)( p - path ) > bsize )
+	{
+        size_t size;
+		string_copy (& path [ bsize ], path_max - bsize, p, measure_string(p, &size));
+	}
+
+	return 0;
+#endif
+}
+#endif
+
+/* ----------------------------------------------------------------------
+ * KXTocDirVisit
+ *  visit each path under designated directory,
+ *  recursively if so indicated
+ *
+ *  "recurse" [ IN ] - if non-zero, recursively visit sub-directories
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to execute
+ *  on each path. receives a base directory and relative path
+ *  for each entry, where each path is also given the leaf name
+ *  for convenience. if "f" returns non-zero, the iteration will
+ *  terminate and that value will be returned. NB - "dir" will not
+ *  be the same as "self".
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+/* ----------------------------------------------------------------------
+ * KXTocDirVisitDir
+ *
+ * [IN] KXTocDirVisitData *	pb
+ */
+#if NOT_YET
+typedef struct KXTocDirVisitData
+{
+    int nada;
+} KXTocDirVisitData;
+static
+rc_t KXTocDirVisitDir(KXTocDirVisitData *pb)
+{
+    return -1;
+}
+#endif
+static 
+rc_t CC KXTocDirVisit (const KXTocDir *self, 
+                      bool recurse,
+                      rc_t (CC* f) (const KDirectory *, uint32_t, const char *, void *), 
+                      void *data,
+                      const char *path,
+                      va_list args)
+{
+#if 1
+    return RC (rcFS, rcDirectory, rcVisiting, rcSelf, rcUnsupported);
+#else
+    char * full_path;
+    rc_t   rc;
+
+    if (path == NULL)
+        path = "/";
+
+    /* -----
+     * First fix the path to make it useable
+     */
+    rc = KXTocDirMakePath (self, rcVisiting, true, &full_path, path, args);
+    if (rc != 0)
+    {
+	LOGERR (klogInt, rc, "failed to make path in Visit");
+    }
+    else
+    {
+	const XTocEntry * pnode;
+
+	/* -----
+	 * Now find that path as a node and validate it is a directory
+	 */
+	rc = KXTocEntryResolvePath (&self->toc->root, full_path, true, &pnode);
+	if (rc != 0)
+	{
+	    PLOGERR (klogInt, (klogInt, rc, "failed to resolve path $(P) in Visit", "P=%s", full_path));
+	}
+	else
+	{
+            switch (pnode->type)
+            {
+            case xtoce_file:
+                if (pnode->u.file.has_tree)
+                    break;
+            default:
+                rc = RC (rcFS, rcDirectory, rcVisiting, rcPath, rcInvalid);
+                break;
+            case xtoce_dir:
+                break;
+            }
+
+            if (rc == 0)
+            {
+                size_t size;
+		KXTocDir * full_dir;
+		uint32_t path_size;
+
+		/* -----
+		 * make a locally accessible private KDirectory/KXTocDir
+		 */
+		for ( path_size = (uint32_t)string_measure( full_path, &size );
+		      ( path_size > self->root ) && ( full_path[ path_size - 1 ] == '/' );
+		      -- path_size )
+		{}
+		rc = KXTocDirMake (&full_dir, 
+				  rcVisiting,
+				  self->parent,
+				  self->toc,
+				  pnode,
+				  self->archive.v,
+				  self->arctype,
+				  self->root,
+				  full_path,
+				  path_size, 
+				  true,
+				  false);
+		if (rc == 0)
+		{
+		    KXTocDirVisitData pb;
+
+		    pb.f = f;
+		    pb.data = data;
+		    pb.dir = full_dir;
+		    pb.recurse = recurse;
+/*		    pb.dir.path[--pb.dir.size] = 0; */
+
+		    rc = KXTocDirVisitDir (&pb);
+
+		    KXTocDirDestroy (full_dir);
+		}
+	    }
+	    else
+	    {
+		rc = RC (rcFS, rcDirectory, rcVisiting, rcPath, rcIncorrect);
+		LOGERR (klogInt, rc, "Type is not a directory");
+	    }
+	}
+	free (full_path);
+    }
+    return rc;
+#endif
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirVisitUpdate
+ */
+static rc_t CC KXTocDirVisitUpdate (KXTocDir *self,
+                                   bool recurse,
+                                   rc_t (CC*f) (KDirectory *,uint32_t,const char *,void *),
+                                   void *data,
+                                   const char *path,
+                                   va_list args)
+{
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirResolvePath
+ *
+ *  resolves path to an absolute or directory-relative path
+ *
+ * [IN]  const KXTocDir *self		Objected oriented self
+ * [IN]	 bool 		absolute	if non-zero, always give a path starting
+ *  					with '/'. NB - if the directory is 
+ *					chroot'd, the absolute path
+ *					will still be relative to directory root.
+ * [OUT] char *		resolved	buffer for NUL terminated result path in 
+ *					directory-native character set
+ * [IN]	 size_t		rsize		limiting size of resolved buffer
+ * [IN]  const char *	path		NUL terminated string in directory-native
+ *					character set denoting target path. 
+ *					NB - need not exist.
+ */
+static rc_t CC KXTocDirResolvePath (const KXTocDir *self,
+                                   bool absolute,
+                                   char *resolved,
+                                   size_t rsize,
+                                   const char *path_,
+                                   va_list args)
+{
+    rc_t rc;
+    const char * path;
+
+    KOutMsg ("+++++\n%s: absolute %d\n", __func__, absolute);
+
+    assert (self);
+    assert (resolved);
+    assert (path_);
+
+    *resolved = '\0';
+    rc = XTocMakePath (&path, false, path_, args);
+    KOutMsg ("%s: rc %R new '%s' old '%s'\n", __func__, rc, path, path_);
+    if (rc != 0)
+    {
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Error building path based on $(P)", "P=%s", path_));
+    }
+    else
+    {
+        size_t path_sz = string_size(path);
+
+        if (absolute)
+        {
+            XTocEntry * entry;
+
+            rc = XTocEntryResolvePath (self->entry, path, false, &entry);
+
+            if (rc)
+                PLOGERR (klogErr,
+                         (klogErr, rc, "Error resolving path based on $(P)", "P=%s", path_));
+            else
+            {
+                free ((void*)path);
+                path = NULL;
+                rc = XTocEntryMakeFullPath (entry, &path);
+                if (rc == 0)
+                {
+                    size_t k = self->toc->base_path.size;
+                    if (k > 1)
+                    {
+                        memmove (resolved, self->toc->base_path.addr, k);
+                        resolved += k;
+                        rsize -= k;
+                    }
+                }
+            }
+        }
+        if (rc == 0)
+        {
+            if (rsize < (path_sz - 1))
+                rc = RC(rcFS, rcDirectory, rcResolving, rcBuffer, rcInsufficient);
+            else
+                string_copy(resolved, rsize, path, path_sz);
+        }
+        if (path)
+            free ((void*)path);
+    }
+    return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirResolveAlias
+ *  resolves an alias path to its immediate target
+ *  NB - the resolved path may be yet another alias
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting an object presumed to be an alias.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static rc_t CC KXTocDirResolveAlias (const KXTocDir * self, 
+				 bool absolute,
+				 char * resolved,
+				 size_t rsize,
+				 const char *path_,
+				 va_list args)
+{
+#if 0
+    return -1;
+#else
+    rc_t rc;
+    const char * path;
+
+    assert (self);
+    assert (resolved);
+    assert (path_);
+
+    *resolved = '\0';
+    rc = XTocMakePath (&path, false, path_, args);
+    if (rc != 0)
+    {
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Error building path based on $(P)", "P=%s", path_));
+    }
+    else
+    {
+        XTocEntry * entry;
+
+        rc = XTocEntryResolvePath (self->entry, path, true , &entry);
+        if (rc)
+            PLOGERR (klogErr,
+                     (klogErr, rc, "Error resolving path based on $(P)", "P=%s", path_));
+        else
+        {
+            free ((void*)path);
+            path = NULL;
+            rc = XTocEntryMakeFullPath (entry, &path);
+        }
+    }
+
+/* THIS IS WRONG!
+ * this is the absolute path not the relative one
+ */
+    if (rc == 0)
+        string_copy (resolved, rsize, path, string_size (path));
+    
+    if (path)
+        free ((void*)path);
+
+    return rc;
+#endif
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirRename
+ *  rename an object accessible from directory, replacing
+ *  any existing target object of the same type
+ *
+ *  "from" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ *
+ *  "to" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ */
+static
+rc_t CC KXTocDirRename (KXTocDir *self, bool force, const char *from, const char *to)
+{
+    assert (self != NULL);
+    assert (from != NULL);
+    assert (to != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirRemove
+ *  remove an accessible object from its directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "force" [ IN ] - if non-zero and target is a directory,
+ *  remove recursively
+ */
+static
+rc_t CC KXTocDirRemove (KXTocDir *self, bool force, const char *path, va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirClearDir
+ *  remove all directory contents
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "force" [ IN ] - if non-zero and directory entry is a
+ *  sub-directory, remove recursively
+ */
+static
+rc_t CC KXTocDirClearDir (KXTocDir *self, bool force, const char *path, va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirAccess
+ *  get access to object
+ *
+ *  "access" [ OUT ] - return parameter for Unix access mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+static rc_t CC KXTocDirVAccess (const KXTocDir *self,
+			    uint32_t *access,
+			    const char *path_,
+			    va_list args)
+{
+#if 1
+    return -1;
+#else
+    char * path;
+    rc_t rc;
+
+    if (path_ == NULL)
+        path_ = "/";
+
+    rc = KXTocDirMakePath (self, rcAccessing, true, &path, path_, args);
+    if (rc == 0)
+    {
+        XTocEntry * node;
+
+        rc = XTocEntryResolvePath (&self->toc->root, path, true, &node);
+
+
+    const KTocEntry *	entry;
+    rc_t 		rc;
+    uint32_t		acc;
+    KTocEntryType	type;
+    char * 		full;
+
+    assert (self != NULL);
+    assert (access != NULL);
+    assert (path != NULL);
+
+    /* -----
+     * by C standard the nested ifs (if A { if B { if C ... could have been if A && B && C
+     */
+    if ((rc = KXTocDirMakePath (self, rcAccessing, false, &full, path, args)) == 0)
+    {
+	if ((rc = KXTocDirResolvePathNode (self, rcAccessing, path, true, &entry, &type)) == 0)
+	{
+	    if ((rc = KTocEntryGetAccess (entry, &acc)) == 0)
+	    {
+                /*
+                 * We want to filter the access because within an Archive
+                 * a file is unwritable
+                 */
+		*access = acc & ~(S_IWRITE|S_IWGRP|S_IWOTH);
+		rc = 0;
+	    }
+	}
+    }
+    if (full != NULL)
+	free (full);
+    return rc;
+#endif
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirSetAccess
+ *  set access to object a la Unix "chmod"
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "access" [ IN ] and "mask" [ IN ] - definition of change
+ *  where "access" contains new bit values and "mask defines
+ *  which bits should be changed.
+ *
+ *  "recurse" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ */
+static rc_t CC KXTocDirSetAccess (KXTocDir *self,
+			      bool recurse,
+			      uint32_t access,
+			      uint32_t mask,
+			      const char *path,
+			      va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+
+static	rc_t CC KXTocDirVDate		(const KXTocDir *self,
+					 KTime_t *date,
+					 const char *path_,
+					 va_list args)
+{
+    const char * path;
+    rc_t rc;
+
+    assert (self);
+    assert (date);
+    assert (path_);
+
+    *date = 0;
+    path = NULL;
+    rc = XTocMakePath (&path, false, path_, args);
+    if (rc)
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Error resolving path from $(P)", "P=%s", path_));
+    else
+    {
+        XTocEntry * entry;
+        rc = XTocEntryResolvePath (self->entry, path, false, &entry);
+        if (rc)
+            PLOGERR (klogErr,
+                     (klogErr, rc, "Error resolving path from $(P)", "P=%s", path_));
+        else
+            *date = entry->mtime;
+        free ((void*)path);
+    }
+    return rc;
+}
+
+static	rc_t CC KXTocDirSetDate		(KXTocDir *self,
+					 bool recurse,
+					 KTime_t date,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+static
+struct KSysDir *CC KXTocDirGetSysDir ( const KXTocDir *self )
+{
+    return NULL;
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirCreateAlias
+ *  creates a path alias according to create mode
+ *
+ *  "targ" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target alias
+ *
+ *  "access" [ IN ] - standard Unix directory access mode
+ *  used when "mode" has kcmParents set and alias path does
+ *  not exist.
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC KXTocDirCreateAlias (KXTocDir *self,
+			 uint32_t access,
+			 KCreateMode mode,
+			 const char *targ,
+			 const char *alias)
+{
+    assert (self != NULL);
+    assert (targ != NULL);
+    assert (alias != NULL);
+
+    return RC (rcFS, rcArc, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirOpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t  KXTocDirOpenFileReadInt	(const KXTocDir *self,
+                                 const KXTocFile **f,
+                                 const char *path)
+{
+    XTocCache * cache;
+    rc_t rc;
+
+    DBGTOC (("%s: Opening %s\n", __func__, path));
+    /* resolve path to a cache entry - one will be created if it did not yet exist */
+    rc = XTocDirGetCache (self, path, &cache);
+    DBGTOC(("%s: got cache %p\n",__func__,cache));
+    if (rc == 0)
+    {
+        /* if the file is already open this is easiest */
+        if (cache->file)
+        {
+            DBGTOC(("%s: found open\n",__func__));
+            rc = KFileAddRef (&cache->file->dad);
+            if (rc)
+                *f = cache->file;
+        }
+        else
+        {
+            do
+            {
+                const KFile * bfile = NULL;     /* base file for this new KXTocFile */
+                XTocEntry * entry;
+
+                entry = cache->entry;
+
+                /* next easiest is files not in a container or archive
+                 * the base file will be a KSysFile (most likely) */
+                if (entry->container == entry->root)
+                {
+                    DBGTOC(("%s: NOT in a container or archive\n",__func__));
+                    rc = KDirectoryOpenFileRead (((const KXTocDir*)self->toc->cache->dir)->base,
+                                                 &bfile, "%s", path);
+                }
+                else do
+                {
+                    /* more difficult is a file inside a compressed container
+                     * or an archive container */
+                    const KXTocFile * cfile;    /* container's KXTocFile */
+                    XTocCache * ccache;
+
+                    DBGTOC(("%s: in a container or archive\n",__func__));
+                    ccache = entry->container->cache;
+
+                    /* is the container open? */
+                    if (ccache)
+                    {
+                        /* was the container open but not the file?
+                         * not sure if this is possible */
+                        if (ccache->file == NULL)
+                        {
+                            rc = KXTocDirOpenFileReadInt (self->toc->cache->dir, 
+                                                          &cfile, 
+                                                          ccache->path.addr);
+                            if (rc)
+                                break;
+                        }
+                        else
+                            cfile = ccache->file;
+                    }
+                    /* else the container was not yet open */
+                    else
+                    {
+                        /* build the conatiner's path */
+                        const char * cpath;
+                        rc = XTocEntryMakeFullPath (entry->container, &cpath);
+                        if (rc)
+                            break;
+                        else
+                        {
+                            /* now open the container's KXTocFile */
+                            rc = KXTocDirOpenFileReadInt (self->toc->cache->dir, &cfile, cpath);
+                            free ((void*)cpath);
+                            if (rc)
+                                break;
+                        }                        
+                    }
+
+                    /* we should now have an opened container file
+                     * it might be our base file or the source for our base */
+                    DBGTOC(("%s: we have a container file %p\n", __func__, cfile));
+                    DBG_KXTocFile (cfile);
+                    
+                    if (entry->container->u.file.archive) /* extracting from an archive file */
+                    {
+                        /* base file is the container file for an archive */
+                        bfile = &cfile->dad;
+                            DBGTOC(("%s: archive file set cfile %p bfile %p\n",
+                                    __func__, cfile, bfile));
+                    }
+                    else if (entry->container->u.file.container) /* extracting from a compressed file */
+                    {
+                        /* the base file is built from the container's file via decompression */
+                        if (strcmp (entry->container->u.file.filetype.addr, "Compressed/GnuZip") == 0)
+                        {
+                            rc = KFileMakeGzipForRead (&bfile, &cfile->dad);
+                        }
+                        else if (strcmp (entry->container->u.file.filetype.addr, "Compressed/Bzip") == 0)
+                        {
+                            rc = KFileMakeBzip2ForRead (&bfile, &cfile->dad);
+                        }
+                        else
+                        {
+                            DBGTOC(("%s: unsupported %s %s\n",__func__, cfile, 
+                                    entry->container->u.file.filetype.addr));
+                            LOGERR (klogErr, rc, "Unsupported compression type");
+                            rc = RC (rcFS, rcToc, rcOpening, rcToc, rcUnsupported);
+                        }
+                        if (rc == 0)
+                        {
+                            /* release the container file leaving only the
+                             * decompressed file owning it */
+                            KFileRelease (&cfile->dad);
+                            DBGTOC(("%s: container file created cfile %p bfile %p\n",
+                                    __func__, cfile, bfile));
+                        }
+                    }
+                    else
+                        rc = RC (rcFS, rcToc, rcOpening, rcToc, rcCorrupt);
+                }  while (0);
+                if (rc == 0)
+                {
+                    /* now we have a base file for our XTocFile */
+                    String spath;
+                    KXTocFile * xfile;
+                    StringInitCString (&spath, path);
+                    rc = KXTocFileMake (&xfile, bfile, cache, entry, &spath);
+                    DBGTOC(("%s: we have a new KXTocFile file %p bfile %p)\n", __func__, xfile, bfile));
+                    DBG_KXTocFile(xfile);
+                    if (rc == 0)
+                        *f = xfile;
+                }
+                KFileRelease (bfile);
+            } while (0);
+        }
+        XTocCacheRelease (cache);
+    }
+    return rc;
+}
+
+
+static
+rc_t CC KXTocDirOpenFileRead	(const KXTocDir *self,
+                                 const KFile **f,
+                                 const char *path_,
+                                 va_list args)
+{
+    const char * path;
+    rc_t rc;
+
+    assert (self);
+    assert (f);
+    assert (path_);
+
+    DBGTOC (("%s: open %s\n", __func__, path_));
+
+    /* make sure we'll write something to the output pointer */
+    *f = NULL;
+
+    /* build path from format and arguments or just the format that is a path in and of itself */
+    rc = XTocMakePath (&path, true, path_, args);
+    if (rc)
+    {
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Error opening file $(P)", "P=%s", path_));
+    }
+    else
+        rc = KXTocDirOpenFileReadInt (self, (const KXTocFile**)f, path);
+    free ((void*)path);
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KXTocDirOpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ */
+static
+rc_t CC KXTocDirOpenFileWrite	(KXTocDir *self,
+					 KFile **f,
+					 bool update,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (f != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirCreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC KXTocDirCreateFile	(KXTocDir *self,
+					 KFile **f,
+					 bool update,
+					 uint32_t access,
+					 KCreateMode cmode,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (f != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirFileLocator
+ *  returns locator in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "locator" [ OUT ] - return parameter for file locator
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC KXTocDirFileLocator		(const KXTocDir *self,
+					 uint64_t *locator,
+					 const char *path_,
+					 va_list args)
+{
+    const char * path;
+    rc_t rc;
+
+    assert (self);
+    assert (locator);
+    assert (path_);
+
+    *locator = 0;
+    path = NULL;
+    rc = XTocMakePath (&path, false, path_, args);
+    if (rc)
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Error resolving path from $(P)", "P=%s", path_));
+    else
+    {
+        XTocEntry * entry;
+        rc = XTocEntryResolvePath (self->entry, path, false, &entry);
+        if (rc)
+            PLOGERR (klogErr,
+                     (klogErr, rc, "Error resolving path from $(P)", "P=%s", path_));
+        else if (entry->type != xtoce_file)
+            rc = RC (rcFS, rcDirectory, rcAccessing, rcPath, rcIncorrect);
+        else
+            *locator = entry->u.file.offset;
+        free ((void*)path);
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KXTocDirFileSize
+ *  returns size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC KXTocDirFileSize		(const KXTocDir *self,
+					 uint64_t *size,
+					 const char *path_,
+					 va_list args)
+{
+    const char * path;
+    rc_t rc;
+
+    assert (self);
+    assert (size);
+    assert (path_);
+
+    *size = 0;
+    path = NULL;
+    rc = XTocMakePath (&path, false, path_, args);
+    if (rc)
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Error resolving path from $(P)", "P=%s", path_));
+    else
+    {
+        XTocEntry * entry;
+        rc = XTocEntryResolvePath (self->entry, path, false, &entry);
+        if (rc)
+            PLOGERR (klogErr,
+                     (klogErr, rc, "Error resolving path from $(P)", "P=%s", path_));
+        else if (entry->type != xtoce_file)
+            rc = RC (rcFS, rcDirectory, rcAccessing, rcPath, rcIncorrect);
+        else
+            *size = entry->u.file.size;
+        free ((void*)path);
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KXTocDirFileSize
+ *  returns size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC KXTocDirFilePhysicalSize        (const KXTocDir *self,
+					 uint64_t *size,
+					 const char *path_,
+					 va_list args)
+{
+    const char * path;
+    rc_t rc;
+
+    assert (self);
+    assert (size);
+    assert (path_);
+
+    *size = 0;
+    path = NULL;
+    rc = XTocMakePath (&path, false, path_, args);
+    if (rc)
+        PLOGERR (klogErr,
+                 (klogErr, rc, "Error resolving path from $(P)", "P=%s", path_));
+    else
+    {
+        XTocEntry * entry;
+        rc = XTocEntryResolvePath (self->entry, path, false, &entry);
+        if (rc)
+            PLOGERR (klogErr,
+                     (klogErr, rc, "Error resolving path from $(P)", "P=%s", path_));
+        else if (entry->type != xtoce_file)
+            rc = RC (rcFS, rcDirectory, rcAccessing, rcPath, rcIncorrect);
+        else
+            *size = entry->u.file.size;
+        free ((void*)path);
+    }
+    return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KXTocDirSetFileSize
+ *  sets size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC KXTocDirSetFileSize	(KXTocDir *self,
+					 uint64_t size,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcWriting, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirOpenDirRead
+ *
+ *  opens a sub-directory
+ *
+ * [IN]  const KXTocDir *	self	Object Oriented C KXTocDir self
+ * [OUT] const KDirectory **	subp	Where to put the new KDirectory/KXTocDir
+ * [IN]  bool			chroot	Create a chroot cage for this new subdirectory
+ * [IN]  const char *		path	Path to the directory to open
+ * [IN]  va_list		args	So far the only use of args is possible additions to path
+ */
+static 
+rc_t CC KXTocDirOpenDirRead	(const KXTocDir *self,
+					 const KDirectory **subp,
+					 bool chroot,
+					 const char *path,
+					 va_list args)
+{
+#if 1
+    return -1;
+#else
+    char * full;
+    rc_t rc;
+    size_t size;
+
+    assert (self != NULL);
+    assert (subp != NULL);
+    assert (path != NULL);
+
+    rc = KXTocDirMakePath (self, rcOpening, true, &full, path, args);
+    if (rc == 0)
+    {
+	const KTocEntry *	pnode;
+	KTocEntryType		type;
+	size_t path_size = string_measure (full, &size);
+
+	/* -----
+	 * get rid of any extra '/' characters at the end of path
+	 */
+	while (path_size > 0 && full [ path_size - 1 ] == '/')
+	    full [ -- path_size ] = 0;
+
+	/* -----
+	 * get the node for this path 
+	 */
+	rc = KXTocDirResolvePathNode (self, rcOpening, full, true, &pnode, &type);
+	if (rc == 0)
+	{
+            switch (type)
+            {
+            default:
+		/* fail */
+		rc = RC (rcFS, rcDirectory, rcOpening, rcPath, rcIncorrect);
+                break;
+            case ktocentrytype_dir:
+            case ktocentrytype_hardlink:
+	    {
+		KXTocDir *	sub;
+
+		rc = KXTocDirMake (&sub,
+				  rcOpening,
+				  self->parent,
+				  self->toc,
+				  pnode,
+				  self->archive.v,
+				  self->arctype,
+				  self->root,
+				  full,
+				  (uint32_t)path_size,
+				  false,
+				  chroot);
+		if (rc == 0)
+		{
+		    /* succeed */
+		    *subp = &sub->dad;
+		}
+	    }
+            }
+	}
+	free (full);
+    }
+    return rc;
+#endif
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirOpenDirUpdate
+ *  opens a sub-directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "chroot" [ IN ] - if non-zero, the new directory becomes
+ *  chroot'd and will interpret paths beginning with '/'
+ *  relative to itself.
+ */
+static
+rc_t CC KXTocDirOpenDirUpdate	(KXTocDir *self,
+					 KDirectory ** subp, 
+					 bool chroot, 
+					 const char *path, 
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (subp != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirCreateDir
+ *  create a sub-directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "access" [ IN ] - standard Unix directory permissions
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC KXTocDirCreateDir	(KXTocDir *self,
+					 uint32_t access,
+					 KCreateMode mode,
+					 const char *path,
+					 va_list args)
+{
+    assert (self != NULL);
+    assert (path != NULL);
+
+    return RC (rcFS, rcArc, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirDestroyFile
+ */
+static
+rc_t CC KXTocDirDestroyFile	(KXTocDir *self,
+					 KFile * f)
+{
+    assert (self != NULL);
+    assert (f != NULL);
+
+    return RC (rcFS, rcArc, rcDestroying, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * KXTocDirFileContiguous
+ *  
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "contiguous" [ OUT ] - return parameter for file status
+ */
+static
+rc_t CC KXTocDirFileContiguous		(const KXTocDir *self,
+                                         bool * contiguous,
+					 const char *path,
+                                         va_list args)
+{
+#if 1
+    return -1;
+#else
+    char *		full_path;
+    rc_t		rc;
+
+    assert (self != NULL);
+    assert (contiguous != NULL);
+    assert (path != NULL);
+
+    rc = KXTocDirMakePath (self, rcResolving, true,
+			  &full_path, path, args);
+
+    if (rc != 0)
+    {
+	/* can't "fix" path */
+	/*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+    }
+    else
+    {
+	const KTocEntry * pnode;
+	KTocEntryType     type;
+
+	rc = KXTocDirResolvePathNode (self, rcResolving, full_path, /*follow links*/true, &pnode, &type);
+
+	if (rc != 0)
+	{
+	    /* can't resolve path */
+	    /*rc = RC (rcFS, rcDirectory, rcResolving, rcPath, rcInvalid); ? or tweak it? */
+	}
+	else
+	{
+	    switch (type)
+	    {
+	    default:
+                *contiguous = false;
+		break;
+	    case ktocentrytype_emptyfile:
+	    case ktocentrytype_file:
+                *contiguous = true;
+		break;
+	    }
+	}
+	free (full_path);
+    }
+    return rc;
+#endif
+}
+/* ----------------------------------------------------------------------
+ *
+ */
+static KDirectory_vt_v1 vtKXTocDir =
+{
+    /* version 1.0 */
+    1, 3,
+
+    /* start minor version 0 methods*/
+    KXTocDirDestroy,
+    KXTocDirList,
+    KXTocDirVisit,
+    KXTocDirVisitUpdate,
+    KXTocDirPathType,
+    KXTocDirResolvePath,
+    KXTocDirResolveAlias,
+    KXTocDirRename,
+    KXTocDirRemove,
+    KXTocDirClearDir,
+    KXTocDirVAccess,
+    KXTocDirSetAccess,
+    KXTocDirCreateAlias,
+    KXTocDirOpenFileRead,
+    KXTocDirOpenFileWrite,
+    KXTocDirCreateFile,
+    KXTocDirFileSize,
+    KXTocDirSetFileSize,
+    KXTocDirOpenDirRead,
+    KXTocDirOpenDirUpdate,
+    KXTocDirCreateDir,
+    KXTocDirDestroyFile,
+    /* end minor version 0 methods*/
+    /* start minor version 1 methods*/
+    KXTocDirVDate,
+    KXTocDirSetDate,
+    KXTocDirGetSysDir,
+    /* end minor version 2 methods*/
+    KXTocDirFileLocator,
+    /* end minor version 2 methods*/
+    /* end minor version 3 methods*/
+    KXTocDirFilePhysicalSize,
+    KXTocDirFileContiguous
+    /* end minor version 3 methods*/
+};
+
+static
+rc_t KXTocDirMake (const KXTocDir ** pself, const KDirectory * base,
+                   XToc * toc, XTocCache * cache, XTocEntry * entry,
+                   const String * path)
+{
+    rc_t rc;
+    KXTocDir * self;
+
+    assert (pself);
+    assert (base);
+    assert (toc);
+    assert (cache);
+    assert (entry);
+    assert (path);
+
+    self = malloc (sizeof (*self) + 1 + StringSize (path));
+    if (self == NULL)
+        rc = RC (rcFS, rcDirectory, rcConstructing, rcMemory, rcExhausted);
+    else
+    {
+        char * pc;
+
+        self->base = base;        /* we take ownership of base */
+        self->toc = toc;
+        self->cache = cache;
+        self->entry = entry;
+        self->container = entry->container;
+        self->root = toc->root;
+
+        pc = (char *)(self + 1);
+        string_copy (pc, StringSize (path), path->addr, StringSize (path));
+        StringInit (&self->base_path, pc, StringSize (path), StringLength (path));
+
+        rc = KDirectoryInit (&self->dad, (const KDirectory_vt*)&vtKXTocDir,
+                             "KXTocDir", pc, false);
+        if (rc == 0)
+        {
+            *pself = self;
+            return 0;
+        }
+        free (self);
+    }
+    return rc;
+}
+
+
+static 
+rc_t KDirectoryOpenXTocDirReadInt (const KDirectory * dir,
+                                   const KDirectory ** pnew_dir,
+                                   const KFile * xml,
+                                   const String * spath)
+{
+    XToc * xtoc;
+    rc_t rc;
+
+    rc = XTocMake (&xtoc, spath);
+    if (rc)
+        LOGERR (klogErr, rc, "Error creating toc for xtc directory");
+    else
+    {
+        String sroot;
+        XTocCache * cache;
+
+        StringInitCString (&sroot, ".");
+        rc = XTocMakeXTocCache (xtoc, &cache, &sroot, xtoc->root);
+        if (rc)
+            LOGERR (klogErr, rc, 
+                    "Failed to make cache for root for "
+                    "xtoc directory");
+        else
+        {
+            const KXTocDir * xdir;
+
+            /* now that we have a cache node we should release
+             * the original reference to the xtoc */
+/* ??? */
+            XTocRelease (xtoc);
+
+            xtoc->cache = xtoc->root->cache = cache;
+
+            rc = KXTocDirMake (&xdir, dir, xtoc, cache, xtoc->root,
+                               &sroot);
+            if (rc)
+                LOGERR (klogErr, rc, "Error making xtoc directory");
+            else
+            {
+                DBG_KXTocDir((xdir));
+                cache->dir = xdir;
+
+                rc = XTocParseXml (xtoc->root, xml);
+                if (rc)
+                    LOGERR (klogErr, rc, "Error parsing copycat xml file");
+                else
+                {
+                    *pnew_dir = &xdir->dad;
+                    return 0;
+                }
+                KDirectoryRelease (&xdir->dad);
+            }                
+            XTocCacheRelease (cache);
+        }
+        XTocRelease (xtoc);
+    }
+    return rc;
+}
+
+rc_t CC KDirectoryOpenXTocDirReadDir (const KDirectory * self,
+                                                 const KDirectory ** pnew_dir,
+                                                 const KFile * xml,
+                                                 const String * spath)
+{
+    rc_t rc;
+    
+    /* loosely validate parameters */
+    if (pnew_dir == NULL)
+    {
+        rc = RC (rcFS, rcDirectory, rcOpening, rcParam, rcNull);
+        LOGERR (klogErr, rc,
+                "new directory parameter is NULL for opening XToc Directory");
+        return rc;
+    }
+    *pnew_dir = NULL;
+
+    if (self == NULL)
+    {
+        rc = RC (rcFS, rcDirectory, rcOpening, rcSelf, rcNull);
+        LOGERR (klogErr, rc, "self is NULL for opening XToc Directory");
+        return rc;
+    }
+    else if (xml == NULL)
+    {
+        rc = RC (rcFS, rcDirectory, rcOpening, rcParam, rcNull);
+        LOGERR (klogErr, rc, "xml parameter is NULL for opening XToc Directory");
+        return rc;
+    }
+    else if (spath == NULL)
+    {
+        rc = RC (rcFS, rcDirectory, rcOpening, rcParam, rcNull);
+        LOGERR (klogErr, rc, "base path parameter is NULL for opening XToc Directory");
+        return rc;
+    }
+    else
+    {
+        rc = KDirectoryOpenXTocDirReadInt (self, pnew_dir, xml, spath);
+    }
+    return rc;
+}
+
+
+rc_t CC KDirectoryVOpenXTocDirRead (const KDirectory * self,
+                                               const KDirectory ** pnew_dir,
+                                               bool chroot,
+                                               const KFile * xml,
+                                               const char * _path,
+                                               va_list args )
+{
+    rc_t rc;
+    
+    /* loosely validate parameters */
+    if (pnew_dir == NULL)
+    {
+        rc = RC (rcFS, rcDirectory, rcOpening, rcParam, rcNull);
+        LOGERR (klogErr, rc,
+                "new directory parameter is NULL for opening XToc Directory");
+        return rc;
+    }
+    *pnew_dir = NULL;
+
+    if (self == NULL)
+    {
+        rc = RC (rcFS, rcDirectory, rcOpening, rcSelf, rcNull);
+        LOGERR (klogErr, rc, "self is NULL for opening XToc Directory");
+        return rc;
+    }
+    else if (xml == NULL)
+    {
+        rc = RC (rcFS, rcDirectory, rcOpening, rcParam, rcNull);
+        LOGERR (klogErr, rc, "xml parameter is NULL for opening XToc Directory");
+        return rc;
+    }
+    else if (_path == NULL)
+    {
+        rc = RC (rcFS, rcDirectory, rcOpening, rcParam, rcNull);
+        LOGERR (klogErr, rc, "base path parameter is NULL for opening XToc Directory");
+        return rc;
+    }
+    else
+    /* okay none of our parameters are NULL; they could still be bad but let's start */
+    {
+        String spath;
+        const KDirectory * bdir;
+        KPathType type;
+        char path [8192];
+
+        rc = KDirectoryVResolvePath (self, true, path, sizeof path, _path, args);
+        if (rc)
+            return rc;
+
+        type = KDirectoryPathType (self, "%s", path);
+        switch (type & ~kptAlias)
+        {
+        case kptNotFound:
+            rc = RC (rcFS, rcDirectory, rcOpening, rcParam, rcNotFound);
+            LOGERR (klogErr, rc, "base path parameter is not found when opening XToc Directory");
+            return rc;
+
+        case kptBadPath:
+            rc = RC (rcFS, rcDirectory, rcOpening, rcParam, rcInvalid);
+            LOGERR (klogErr, rc, "base path parameter is a bad path when opening XToc Directory");
+            return rc;
+
+        case kptFile:
+        case kptCharDev:
+        case kptBlockDev:
+        case kptFIFO:
+        case kptZombieFile:
+        case kptDataset:
+        case kptDatatype:
+            KOutMsg ("%s: type '%u' path '%s'\n",type,path);
+            rc = RC (rcFS, rcDirectory, rcOpening, rcParam, rcWrongType);
+            LOGERR (klogErr, rc, "base path parameter is an unusable type when opening XToc Directory");
+            return rc;
+
+        default:
+            rc = RC (rcFS, rcDirectory, rcOpening, rcParam, rcCorrupt);
+            LOGERR (klogErr, rc, "base path parameter is not a known type when opening XToc Directory");
+            return rc;
+
+        case kptDir:
+            break;
+        }
+
+        rc = KDirectoryVOpenDirRead (self, &bdir, true, path, args);
+        if (rc)
+        {
+            LOGERR (klogErr, rc, "failed to open base directory for XToc directory");
+            return rc;
+        }
+        else
+        {
+            static const char absroot[] = "/";
+
+            if (chroot)
+                StringInitCString (&spath, absroot);
+            else
+                StringInitCString (&spath, path);
+
+            rc = KDirectoryOpenXTocDirReadInt (bdir, pnew_dir, xml, &spath);
+            if (rc == 0)
+                return 0;
+
+            KDirectoryRelease (bdir);
+        }
+    }
+    return rc;
+}
+
+
+rc_t CC KDirectoryOpenXTocDirRead (const KDirectory * self,
+                                              const KDirectory ** pnew_dir,
+                                              bool chroot,
+                                              const KFile * xml,
+                                              const char * path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start (args, path);
+    rc = KDirectoryVOpenXTocDirRead (self, pnew_dir, chroot, xml, path, args);
+    va_end (args);
+
+    return rc;
+}
+
+
+struct VFSManager;
+
+rc_t CC VFSManagerOpenXTocDirRead (const struct VFSManager * self,
+                                              const struct KDirectory ** pnew_dir,
+                                              const struct KFile * xml,
+                                              const struct VPath * path)
+{
+    rc_t rc = 0;
+
+    /* needs to be replaced with proper checking and rc returns */
+    assert (pnew_dir);
+
+    *pnew_dir = NULL;
+
+    assert (self);
+    assert (xml);
+    assert (path);
+
+    if (rc == 0)
+    {
+        const KDirectory * dir;
+
+        rc = VFSManagerOpenDirectoryRead (self, &dir, path);
+        if (rc == 0)
+        {
+            char pbuff [8192];
+            size_t z;
+
+            rc = VPathReadPath (path, pbuff, sizeof pbuff, &z);
+            if (rc == 0)
+            {
+                String string;
+
+                StringInit (&string, pbuff, z, string_len (pbuff, z));
+
+                rc = KDirectoryOpenXTocDirReadDir (dir, pnew_dir, xml, &string);
+                if (rc == 0)
+                    return 0;
+            }
+
+            KDirectoryRelease (dir);
+        }
+    }
+    return rc;
+}
+
+
+
+/* end of file */
diff --git a/libs/loader/Makefile b/libs/loader/Makefile
new file mode 100644
index 0000000..d4fe442
--- /dev/null
+++ b/libs/loader/Makefile
@@ -0,0 +1,88 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: all
+
+TOP ?= $(abspath ../..)
+MODULE = libs/loader
+
+INT_LIBS = \
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(LOADER_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# libloader
+#
+$(ILIBDIR)/libloader: $(ILIBDIR)/libloader.$(LIBX)
+
+LOADER_SRC = \
+    mmarray \
+	common-reader \
+	common-writer \
+	sequence-writer \
+	reference-writer \
+	alignment-writer
+
+LOADER_OBJ = \
+	$(addsuffix .$(LOBX),$(LOADER_SRC))
+
+$(ILIBDIR)/libloader.$(LIBX): $(LOADER_OBJ)
+	$(LD) --slib -o $@ $^ $(LOADER_LIB)
+
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/loader/alignment-writer.c b/libs/loader/alignment-writer.c
new file mode 100644
index 0000000..b865b0d
--- /dev/null
+++ b/libs/loader/alignment-writer.c
@@ -0,0 +1,271 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+#include <klib/out.h>
+
+#include <vdb/vdb-priv.h>
+#include <klib/data-buffer.h>
+
+#include <loader/alignment-writer.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+enum e_tables {
+    tblPrimary,
+    tblSecondary,
+    tblN
+};
+
+struct AlignmentWriter {
+    VDatabase *db;
+    TableWriterAlgn const *tbl[tblN];
+    int64_t rowId;
+    int st;
+};
+
+AlignmentWriter *AlignmentMake(VDatabase *db) {
+    AlignmentWriter *self = calloc(1, sizeof(*self));
+    
+    if (self) {
+        self->db = db;
+        VDatabaseAddRef(self->db);
+    }
+    return self;
+}
+
+static rc_t SetColumnDefaults(TableWriterAlgn const *tbl)
+{
+    return 0;
+}
+
+static rc_t WritePrimaryRecord(AlignmentWriter *const self, AlignmentRecord *const data, bool expectUnsorted)
+{
+    if (self->tbl[tblPrimary] == NULL) {
+        rc_t rc = TableWriterAlgn_Make(&self->tbl[tblPrimary], self->db,
+                                       ewalgn_tabletype_PrimaryAlignment,
+                                       ewalgn_co_TMP_KEY_ID + 
+                                       (expectUnsorted ? ewalgn_co_unsorted : 0));
+        if (rc)
+            return rc;
+        rc = SetColumnDefaults(self->tbl[tblPrimary]);
+        if (rc)
+            return rc;
+    }
+    return TableWriterAlgn_Write(self->tbl[tblPrimary], &data->data, &data->alignId);
+}
+
+static rc_t WriteSecondaryRecord(AlignmentWriter *const self, AlignmentRecord *const data, bool expectUnsorted)
+{
+    if (self->tbl[tblSecondary] == NULL) {
+        rc_t rc = TableWriterAlgn_Make(&self->tbl[tblSecondary], self->db,
+                                       ewalgn_tabletype_SecondaryAlignment,
+                                       ewalgn_co_TMP_KEY_ID + 
+                                       (expectUnsorted ? ewalgn_co_unsorted : 0));
+        if (rc)
+            return rc;
+        rc = SetColumnDefaults(self->tbl[tblSecondary]);
+        if (rc)
+            return rc;
+    }
+#if 1
+    /* try to make consistent with cg-load */
+    if (data->mate_ref_pos == 0) {
+        data->data.mate_ref_orientation.elements = 0;
+    }
+#endif
+    return TableWriterAlgn_Write(self->tbl[tblSecondary], &data->data, &data->alignId);
+}
+
+rc_t AlignmentWriteRecord(AlignmentWriter *const self, AlignmentRecord *const data, bool expectUnsorted)
+{
+    return data->isPrimary ? WritePrimaryRecord(self, data, expectUnsorted) : WriteSecondaryRecord(self, data, expectUnsorted);
+}
+
+rc_t AlignmentStartUpdatingSpotIds(AlignmentWriter *const self)
+{
+    return 0;
+}
+
+rc_t AlignmentGetSpotKey(AlignmentWriter * const self, uint64_t *keyId, int64_t *alignId, bool *isPrimary)
+{
+    rc_t rc;
+    
+    switch (self->st) {
+    case 0:
+        rc = TableWriterAlgn_TmpKeyStart(self->tbl[tblPrimary]);
+        if (rc)
+            break;
+        self->rowId = 0;
+        ++self->st;
+    case 1:
+        rc = TableWriterAlgn_TmpKey(self->tbl[tblPrimary], ++self->rowId, keyId);
+        if (rc == 0) {
+            *alignId = self->rowId;
+            *isPrimary = true;
+            break;
+        }
+        ++self->st;
+        if (GetRCState(rc) != rcNotFound || GetRCObject(rc) != rcRow || self->tbl[tblSecondary] == NULL)
+            break;
+    case 2:
+        rc = TableWriterAlgn_TmpKeyStart(self->tbl[tblSecondary]);
+        if (rc)
+            break;
+        self->rowId = 0;
+        ++self->st;
+    case 3:
+        rc = TableWriterAlgn_TmpKey(self->tbl[tblSecondary], ++self->rowId, keyId);
+        if (rc == 0) {
+            *alignId = self->rowId;
+            *isPrimary = false;
+            break;
+        }
+        if (GetRCState(rc) != rcNotFound || GetRCObject(rc) != rcRow)
+            break;
+        ++self->st;
+        break;
+    default:
+        rc = RC(rcAlign, rcTable, rcUpdating, rcError, rcIgnored);
+        break;
+    }
+    return rc;
+}
+
+rc_t AlignmentGetRefPos(AlignmentWriter *const self, int64_t row, ReferenceStart *const rslt)
+{
+    switch (self->st) {
+    case 1:
+        return TableWriterAlgn_RefStart(self->tbl[tblPrimary], self->rowId, rslt);
+    case 3:
+    default:
+        return RC(rcAlign, rcTable, rcUpdating, rcSelf, rcInconsistent);
+    }
+}
+
+rc_t AlignmentUpdateInfo(AlignmentWriter * const self, int64_t const spotId, int64_t const mateId, ReferenceStart const *mateRefPos)
+{
+    switch (self->st) {
+    case 1:
+        return TableWriterAlgn_Write_SpotInfo(self->tbl[tblPrimary], self->rowId, spotId, mateId, mateRefPos);
+    case 3:
+        return TableWriterAlgn_Write_SpotInfo(self->tbl[tblSecondary], self->rowId, spotId, 0, 0);
+    default:
+        return RC(rcAlign, rcTable, rcUpdating, rcSelf, rcInconsistent);
+    }
+}
+
+rc_t AlignmentWhack(AlignmentWriter * const self, bool const commit) 
+{
+    rc_t const rc = TableWriterAlgn_Whack(self->tbl[tblPrimary], commit, NULL);
+    rc_t const rc2 = self->tbl[tblSecondary] ? TableWriterAlgn_Whack(self->tbl[tblSecondary], commit | (rc == 0), NULL) : 0;
+
+    VDatabaseRelease(self->db);
+    free(self);
+    return rc ? rc : rc2;
+}
+
+static size_t AlignmentRecordBufferSize(unsigned const readlen, bool const hasMismatchQual)
+{
+    AlignmentRecord const *const dummy = NULL;
+    size_t const elemSize = sizeof(AR_OFFSET(*dummy)[0])
+					      + sizeof(AR_OFFSET_TYPE(*dummy)[0])
+                          + sizeof(AR_HAS_MISMATCH(*dummy)[0])
+                          + sizeof(AR_HAS_OFFSET(*dummy)[0])
+                          + sizeof(AR_MISMATCH(*dummy)[0])
+                          + (hasMismatchQual ? sizeof(AR_MISMATCH_QUAL(*dummy)[0]) : 0);
+    
+    return elemSize * readlen;
+}
+
+rc_t AlignmentRecordInit(AlignmentRecord *self, unsigned readlen,
+                         bool expectUnsorted,
+                         bool hasMismatchQual
+                         )
+{
+    KDataBuffer buffer = self->buffer;
+
+    memset(self, 0, sizeof(*self));
+    buffer.elem_bits = 8;
+    {
+        size_t const need = AlignmentRecordBufferSize(readlen, hasMismatchQual);
+        rc_t const rc = KDataBufferResize(&buffer, need);
+        if (rc) return rc;
+    }
+    self->buffer = buffer;
+
+    self->data.seq_read_id.buffer = &self->read_id;
+    self->data.seq_read_id.elements = 1;
+    self->data.ref_id.buffer = &self->ref_id;
+    self->data.ref_id.elements = 1;
+    if (expectUnsorted) {
+        self->data.ref_start.buffer = &self->ref_start;
+        self->data.ref_start.elements = 1;
+    }
+    else {
+        self->data.global_ref_start.buffer = &self->global_ref_start;
+        self->data.global_ref_start.elements = 1;
+    }
+    self->data.ref_orientation.buffer = &self->ref_orientation;
+    self->data.ref_orientation.elements = 1;
+    self->data.mapq.buffer = &self->mapq;
+    self->data.mapq.elements = 1;
+    self->data.tmp_key_id.buffer = &self->tmp_key_id;
+    self->data.tmp_key_id.elements = 1;
+    
+    self->data.read_start.buffer = &self->read_start;
+    self->data.read_start.elements = 1;
+    self->data.read_len.buffer = &self->read_len;
+    self->data.read_len.elements = 1;
+    
+    self->data.mate_ref_orientation.buffer = &self->mate_ref_orientation;
+    self->data.mate_ref_orientation.elements = 1;
+    self->data.mate_ref_id.buffer = &self->mate_ref_id;
+    self->data.mate_ref_id.elements = 1;
+    self->data.mate_ref_pos.buffer = &self->mate_ref_pos;
+    self->data.mate_ref_pos.elements = 1;
+    self->data.mate_align_id.buffer = &self->mate_align_id;
+    self->data.mate_align_id.elements = 1;
+    self->data.template_len.buffer = &self->template_len;
+    self->data.template_len.elements = 1;
+    
+    self->data.ref_offset.buffer = buffer.base;
+    self->data.ref_offset_type.buffer = &AR_OFFSET(*self)[readlen];
+    self->data.has_mismatch.buffer = &AR_OFFSET_TYPE(*self)[readlen];
+    self->data.has_mismatch.elements = readlen;
+    self->data.has_ref_offset.buffer = &AR_HAS_MISMATCH(*self)[readlen];
+    self->data.has_ref_offset.elements = readlen;
+    self->data.mismatch.buffer = &AR_HAS_OFFSET(*self)[readlen];
+    
+    if (hasMismatchQual)
+        self->data.mismatch_qual.buffer = (uint8_t *)&AR_MISMATCH(*self)[readlen];
+    
+    return 0;
+}
diff --git a/libs/loader/common-reader.c b/libs/loader/common-reader.c
new file mode 100644
index 0000000..cde2bcf
--- /dev/null
+++ b/libs/loader/common-reader.c
@@ -0,0 +1,614 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <loader/common-reader-priv.h>
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include <klib/rc.h>
+
+/*--------------------------------------------------------------------------
+ ReaderFile
+ */
+rc_t CC ReaderFileAddRef ( const ReaderFile *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "ReaderFile" ) )
+        {
+        case krefLimit:
+            return RC ( RC_MODULE, rcFile, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+rc_t CC ReaderFileRelease ( const ReaderFile *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "ReaderFile" ) )
+        {
+        case krefWhack:
+            return self->vt.v1->destroy( (ReaderFile *)self );
+        case krefNegative:
+            return RC ( RC_MODULE, rcFile, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+rc_t CC ReaderFileGetRecord( const ReaderFile *self, const Record** result)
+{
+    assert(self);
+    assert(result);
+    return self->vt.v1->getRecord( self, result );
+}
+
+float CC ReaderFileGetProportionalPosition ( const READERFILE_IMPL *self )
+{
+    assert(self);
+    assert(self->vt.v1->getProportionalPosition);
+    return self->vt.v1->getProportionalPosition( self );
+}
+
+rc_t CC ReaderFileGetReferenceInfo ( const ReaderFile *self, const ReferenceInfo** result )
+{
+    assert(self);
+    assert(self->vt.v1->getReferenceInfo);
+    return self->vt.v1->getReferenceInfo( self, result );
+}
+
+/* Init
+ *  polymorphic parent constructor
+ */
+rc_t CC ReaderFileInit ( ReaderFile *self )
+{
+    if ( self == NULL )
+        return RC ( RC_MODULE, rcFileFormat, rcConstructing, rcSelf, rcNull );
+
+    KRefcountInit ( & self -> refcount, 1, "ReaderFile", "ReaderFileInit", "");
+
+    self->pathname = NULL;
+
+    return 0;
+}
+
+rc_t CC ReaderFileWhack ( ReaderFile *self )
+{
+    if ( self == NULL )
+        return RC ( RC_MODULE, rcFileFormat, rcConstructing, rcSelf, rcNull );
+
+    free( self->pathname );
+
+    return 0;
+}
+
+const char* CC ReaderFileGetPathname ( const ReaderFile *self )
+{
+    if ( self == NULL )
+        return NULL;
+    return self->pathname;
+}
+
+/*--------------------------------------------------------------------------
+ Record
+ */
+
+rc_t CC RecordAddRef ( const Record *self )
+{
+    assert(self);
+    assert(self->vt.v1->addRef);
+    return self->vt.v1->addRef(self);
+}
+
+rc_t CC RecordRelease ( const Record *self )
+{
+    assert(self);
+    assert(self->vt.v1->release);
+    return self->vt.v1->release(self);
+}
+
+rc_t CC RecordGetSequence ( const Record *self, const Sequence** result)
+{
+    assert(self);
+    assert(result);
+    assert(self->vt.v1->getSequence);
+    return self->vt.v1->getSequence(self, result);
+}
+
+rc_t CC RecordGetAlignment( const Record *self, const Alignment** result)
+{
+    assert(self);
+    assert(result);
+    assert(self->vt.v1->getAlignment);
+    return self->vt.v1->getAlignment(self, result);
+}
+
+rc_t CC RecordGetRejected ( const Record *self, const Rejected** result)
+{
+    assert(self);
+    assert(result);
+    assert(self->vt.v1->getRejected);
+    return self->vt.v1->getRejected(self, result);
+}
+
+/*--------------------------------------------------------------------------
+ Sequence
+ */
+rc_t CC SequenceAddRef ( const Sequence *self )
+{
+    assert(self);
+    assert(self->vt.v1->addRef);
+    return self->vt.v1->addRef(self);
+}
+
+rc_t CC SequenceRelease ( const Sequence *self )
+{
+    assert(self);
+    assert(self->vt.v1->release);
+    return self->vt.v1->release(self);
+}
+
+rc_t CC SequenceGetReadLength ( const Sequence *self, uint32_t *length )
+{
+    assert(self);
+    assert(length);
+    assert(self->vt.v1->getReadLength);
+    return self->vt.v1->getReadLength(self, length);
+}
+
+rc_t CC SequenceGetRead( const Sequence *self, char *sequence )
+{
+    assert(self);
+    assert(sequence);
+    assert(self->vt.v1->getRead);
+    return self->vt.v1->getRead(self, sequence);
+}
+
+rc_t CC SequenceGetRead2 ( const Sequence *self, char *sequence, uint32_t start, uint32_t stop)
+{
+    assert(self);
+    assert(sequence);
+    assert(self->vt.v1->getRead2);
+    return self->vt.v1->getRead2(self, sequence, start, stop);
+}
+
+rc_t CC SequenceGetQuality(const Sequence *self, const int8_t **quality, uint8_t *offset, int *qualType)
+{
+    assert(self);
+    assert(quality);
+    assert(offset);
+    assert(qualType);
+    assert(self->vt.v1->getQuality);
+    return self->vt.v1->getQuality(self, quality, offset, qualType);
+}
+
+rc_t CC SequenceGetSpotGroup ( const Sequence *self, const char **name, size_t *length )
+{
+    assert(self);
+    assert(name);
+    assert(length);
+    assert(self->vt.v1->getSpotGroup);
+    return self->vt.v1->getSpotGroup(self, name, length);
+}
+
+rc_t CC SequenceGetSpotName ( const Sequence *self, const char **name, size_t *length )
+{
+    assert(self);
+    assert(name);
+    assert(length);
+    assert(self->vt.v1->getSpotName);
+    return self->vt.v1->getSpotName(self, name, length);
+}
+
+bool CC SequenceIsColorSpace ( const Sequence *self )
+{
+    assert(self);
+    assert(self->vt.v1->isColorSpace);
+    return self->vt.v1->isColorSpace(self);
+}
+
+rc_t CC SequenceGetCSKey ( const Sequence *self, char cskey[1] )
+{
+    assert(self);
+    assert(self->vt.v1->getCSKey);
+    return self->vt.v1->getCSKey(self, cskey);
+}
+
+rc_t CC SequenceGetCSReadLength ( const Sequence *self, uint32_t *length )
+{
+    assert(self);
+    assert(self->vt.v1->getCSReadLength);
+    return self->vt.v1->getCSReadLength(self, length);
+}
+
+rc_t CC SequenceGetCSRead( const Sequence *self, char *sequence )
+{
+    assert(self);
+    assert(self->vt.v1->getCSRead);
+    return self->vt.v1->getCSRead(self, sequence);
+}
+
+rc_t CC SequenceGetCSQuality(const Sequence *self, const int8_t **quality, uint8_t *offset, int *qualType)
+{
+    assert(self);
+    assert(quality);
+    assert(offset);
+    assert(qualType);
+    assert(self->vt.v1->getCSQuality);
+    return self->vt.v1->getCSQuality(self, quality, offset, qualType);
+}
+
+bool CC SequenceWasPaired     ( const Sequence *self )
+{
+    assert(self);
+    assert(self->vt.v1->wasPaired);
+    return self->vt.v1->wasPaired(self);
+}
+
+int CC SequenceGetOrientationSelf( const Sequence *self )
+{
+    assert(self);
+    assert(self->vt.v1->orientationSelf);
+    return self->vt.v1->orientationSelf(self);
+}
+ 
+int CC SequenceGetOrientationMate( const Sequence *self )
+{
+    assert(self);
+    assert(self->vt.v1->orientationMate);
+    return self->vt.v1->orientationMate(self);
+}
+
+bool CC SequenceIsFirst       ( const Sequence *self )
+{
+    assert(self);
+    assert(self->vt.v1->isFirst);
+    return self->vt.v1->isFirst(self);
+}
+
+bool CC SequenceIsSecond      ( const Sequence *self )
+{
+    assert(self);
+    assert(self->vt.v1->isSecond);
+    return self->vt.v1->isSecond(self);
+}
+
+rc_t SequenceGetTI(Sequence const *self, uint64_t *ti)
+{
+    assert(self);
+    assert(ti);
+    assert(self->vt.v1->getTI);
+    return self->vt.v1->getTI(self, ti);
+}
+
+bool CC SequenceIsDuplicate( const Sequence *self )
+{
+    assert(self);
+    assert(self->vt.v1->isDuplicate);
+    return self->vt.v1->isDuplicate(self);
+}
+
+bool CC SequenceIsLowQuality( const Sequence *self )
+{
+    assert(self);
+    assert(self->vt.v1->isLowQuality);
+    return self->vt.v1->isLowQuality(self);
+}
+
+/*--------------------------------------------------------------------------
+ Alignment
+ */
+
+rc_t CC AlignmentAddRef ( const Alignment *self )
+{
+    assert(self);
+    assert(self->vt.v1->addRef);
+    return self->vt.v1->addRef(self);
+}
+
+rc_t CC AlignmentRelease ( const Alignment *self )
+{
+    assert(self);
+    assert(self->vt.v1->release);
+    return self->vt.v1->release(self);
+}
+
+rc_t CC AlignmentGetRefSeqId ( const Alignment *self, int32_t *refSeqId )
+{
+    assert(self);
+    assert(refSeqId);
+    assert(self->vt.v1->getRefSeqId);
+    return self->vt.v1->getRefSeqId(self, refSeqId);
+}
+
+rc_t CC AlignmentGetMateRefSeqId ( const Alignment *self, int32_t *refSeqId )
+{
+    assert(self);
+    assert(refSeqId);
+    assert(self->vt.v1->getMateRefSeqId);
+    return self->vt.v1->getMateRefSeqId(self, refSeqId);
+}
+
+rc_t CC AlignmentGetPosition ( const Alignment *self, int64_t *pos )
+{
+    assert(self);
+    assert(pos);
+    assert(self->vt.v1->getPosition);
+    return self->vt.v1->getPosition(self, pos);
+}
+
+rc_t CC AlignmentGetMatePosition ( const Alignment *self, int64_t *pos )
+{
+    assert(self);
+    assert(pos);
+    assert(self->vt.v1->getMatePosition);
+    return self->vt.v1->getMatePosition(self, pos);
+}
+
+rc_t CC AlignmentGetMapQuality ( const Alignment *self, uint8_t *qual )
+{
+    assert(self);
+    assert(qual);
+    assert(self->vt.v1->getMapQuality);
+    return self->vt.v1->getMapQuality(self, qual);
+}
+
+rc_t CC AlignmentGetAlignmentDetail ( const Alignment *self,
+                                      AlignmentDetail *rslt, 
+                                      uint32_t count, 
+                                      uint32_t *actual,
+                                      int32_t *firstMatch, 
+                                      int32_t *lastMatch )
+{
+    assert(self);
+    assert(self->vt.v1->getAlignmentDetail);
+    return self->vt.v1->getAlignmentDetail(self, rslt, count, actual, firstMatch, lastMatch);
+}
+
+rc_t CC AlignmentGetAlignOpCount ( const Alignment *self, uint32_t *n )
+{
+    assert(self);
+    assert(n);
+    assert(self->vt.v1->getAlignOpCount);
+    return self->vt.v1->getAlignOpCount(self, n);
+}
+
+rc_t CC AlignmentGetInsertSize ( const Alignment *self, int64_t *size )
+{
+    assert(self);
+    assert(size);
+    assert(self->vt.v1->getInsertSize);
+    return self->vt.v1->getInsertSize(self, size);
+}
+
+rc_t AlignmentGetCGData ( const ALIGNMENT_IMPL *self, const CGData** result)
+{
+    assert(self);
+    assert(result);
+    assert(self->vt.v1->getCG);
+    return self->vt.v1->getCG(self, result);
+}
+
+rc_t AlignmentGetBAMCigar ( const ALIGNMENT_IMPL *self, uint32_t const **rslt, uint32_t *length )
+{
+    assert(self);
+    assert(rslt);
+    assert(length);
+    assert(self->vt.v1->getBAMCigar);
+    return self->vt.v1->getBAMCigar(self, rslt, length);
+}
+
+bool AlignmentIsSecondary( const Alignment *self )
+{
+    assert(self);
+    assert(self->vt.v1->isSecondary);
+    return self->vt.v1->isSecondary(self);
+}
+
+/*--------------------------------------------------------------------------
+ * CGData
+ */
+rc_t CC CGDataAddRef ( const CGData *self )
+{
+    assert(self);
+    assert(self->vt.v1->addRef);
+    return self->vt.v1->addRef(self);
+}
+
+rc_t CC CGDataRelease ( const CGData *self )
+{
+    assert(self);
+    assert(self->vt.v1->release);
+    return self->vt.v1->release(self);
+}
+
+/* CGGetSeqQual
+ */
+rc_t CC CGDataGetSeqQual ( const CGData* self,
+                           char sequence[/* 35 */],
+                           uint8_t quality[/* 35 */] )
+{
+    assert(self);
+    assert(sequence);
+    assert(quality);
+    assert(self->vt.v1->getSeqQual);
+    return self->vt.v1->getSeqQual(self, sequence, quality); 
+}                       
+
+/* CGGetCigar
+ */
+rc_t CC CGDataGetCigar ( const CGData* self,
+                         uint32_t *cigar,
+                         uint32_t cig_max,
+                         uint32_t *cig_act )
+{
+    assert(self);
+    assert(cigar);
+    assert(cig_act);
+    assert(self->vt.v1->getCigar);
+    return self->vt.v1->getCigar(self, cigar, cig_max, cig_act);
+}                     
+
+/* CGGetAlignGroup
+ */
+rc_t CC CGDataGetAlignGroup ( const CGData* self,
+                              char buffer[],
+                              size_t max_size,
+                              size_t *act_size )
+{
+    assert(self);
+    assert(act_size);
+    assert(self->vt.v1->getAlignGroup);
+    return self->vt.v1->getAlignGroup(self, buffer, max_size, act_size);
+}
+                          
+/*--------------------------------------------------------------------------
+ * Rejected
+ */
+
+rc_t CC RejectedInit ( Rejected *self )
+{
+    KRefcountInit ( & self -> refcount, 1, "Rejected", "RejectedInit", "");
+    StringInit(&self->source, 0, 0, 0);
+    self->message = 0;
+    self->column = 0;
+    self->line = 0;
+    self->fatal = false;
+    return 0;
+}
+
+static rc_t CC RejectedWhack ( const Rejected *self )
+{
+    free( (void*)self->source.addr );
+    free( (void*)self->message );
+    free( (void*)self );
+    return 0;
+}
+
+rc_t CC RejectedAddRef ( const Rejected *self )
+{
+    assert(self);
+    KRefcountAdd( & self->refcount, "Rejected" );
+    /* TODO: handle rc from KRefcountAdd */
+    return 0;
+}
+
+rc_t CC RejectedRelease ( const Rejected *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "Rejected" ) )
+        {
+        case krefWhack:
+            RejectedWhack( self );
+            break;
+        default:
+            /* TODO: handle other values */
+            break;
+        }
+    }
+    return 0;
+}
+
+rc_t CC RejectedGetError( const Rejected* self, const char** text, uint64_t* line, uint64_t* column, bool* fatal )
+{
+    assert(self);
+    assert(text);
+    assert(line);
+    assert(column);
+    *text = self->message;
+    *line = self->line;
+    *column = self->column;
+    *fatal = self->fatal;
+    return 0;
+}
+
+rc_t CC RejectedGetData( const Rejected* self, const void** data, size_t* length )
+{
+    assert(self);
+    assert(data);
+    assert(length);
+    *data = self->source.addr;
+    *length = StringSize( & self->source );
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * ReferenceInfo
+ */
+rc_t CC ReferenceInfoAddRef ( const ReferenceInfo *self )
+{
+    assert(self);
+    assert(self->vt.v1->addRef);
+    return self->vt.v1->addRef(self);
+}
+
+rc_t CC ReferenceInfoRelease ( const ReferenceInfo *self )
+{
+    assert(self);
+    assert(self->vt.v1->release);
+    return self->vt.v1->release(self);
+}
+
+rc_t CC ReferenceInfoGetRefSeqCount ( const ReferenceInfo *self, uint32_t* count )
+{
+    assert(self);
+    assert(self->vt.v1->getRefSeqCount);
+    return self->vt.v1->getRefSeqCount(self, count);
+}
+
+rc_t CC ReferenceInfoGetRefSeq ( const ReferenceInfo *self, uint32_t n, ReferenceSequence *result )
+{
+    assert(self);
+    assert(self->vt.v1->getRefSeq);
+    return self->vt.v1->getRefSeq(self, n, result);
+}
+
+rc_t CC ReferenceInfoGetReadGroupCount ( const ReferenceInfo *self, uint32_t *count )
+{
+    assert(self);
+    assert(self->vt.v1->getReadGroupCount);
+    return self->vt.v1->getReadGroupCount(self, count);
+}
+
+rc_t CC ReferenceInfoGetReadGroup ( const ReferenceInfo *self, unsigned n, ReadGroup *result )
+{
+    assert(self);
+    assert(self->vt.v1->getReadGroup);
+    return self->vt.v1->getReadGroup(self, n, result);
+}
+
+rc_t CC ReferenceInfoGetReadGroupByName ( const ReferenceInfo *self, const char *name, ReadGroup *result )
+{
+    assert(self);
+    assert(self->vt.v1->getReadGroupByName );
+    return self->vt.v1->getReadGroupByName(self, name, result);
+}
diff --git a/libs/loader/common-writer.c b/libs/loader/common-writer.c
new file mode 100644
index 0000000..248fa97
--- /dev/null
+++ b/libs/loader/common-writer.c
@@ -0,0 +1,2067 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+ 
+#include <sysalloc.h>
+#include <string.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <klib/status.h>
+
+#include <kdb/btree.h>
+
+#include <kfs/pmem.h>
+#include <kfs/file.h>
+#include <kfs/pagefile.h>
+
+#include <kapp/progressbar.h>
+#include <kapp/main.h>
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+
+#include <loader/sequence-writer.h>
+#include <loader/alignment-writer.h>
+#include <loader/reference-writer.h>
+#include <loader/common-writer.h>
+#include <loader/common-reader-priv.h>
+
+/*--------------------------------------------------------------------------
+ * ctx_value_t, FragmentInfo
+ */
+typedef struct {
+    uint32_t primaryId[2];
+    uint32_t spotId;
+    uint32_t fragmentId;
+    uint16_t seqHash[2];
+    uint8_t  platform;
+    uint8_t  pId_ext[2];
+    uint8_t  spotId_ext;
+    uint8_t  alignmentCount[2]; /* 0..254; 254: saturated max; 255: special meaning "too many" */
+    uint8_t  unmated: 1,
+             pcr_dup: 1,
+             has_a_read: 1,
+             unaligned_1: 1,
+             unaligned_2: 1;
+} ctx_value_t;
+
+#define CTX_VALUE_SET_P_ID(O,N,V) do { int64_t tv = (V); (O).primaryId[N] = (uint32_t)tv; (O).pId_ext[N] = tv >> 32; } while(0);
+#define CTX_VALUE_GET_P_ID(O,N) ((((int64_t)((O).pId_ext[N])) << 32) | (O).primaryId[N])
+
+#define CTX_VALUE_SET_S_ID(O,V) do { int64_t tv = (V); (O).spotId = (uint32_t)tv; (O).spotId_ext = tv >> 32; } while(0);
+#define CTX_VALUE_GET_S_ID(O) ((((int64_t)(O).spotId_ext) << 32) | (O).spotId)
+
+typedef struct FragmentInfo {
+    uint64_t ti;
+    uint32_t readlen;
+    uint8_t  aligned;
+    uint8_t  is_bad;
+    uint8_t  orientation;
+    uint8_t  otherReadNo;
+    uint8_t  sglen;
+    uint8_t  cskey;
+} FragmentInfo;
+
+
+rc_t OpenKBTree(const CommonWriterSettings* settings, struct KBTree **const rslt, size_t const n, size_t const max)
+{
+    size_t const cacheSize = (((settings->cache_size - (settings->cache_size / 2) - (settings->cache_size / 8)) / max)
+                            + 0xFFFFF) & ~((size_t)0xFFFFF);
+    KFile *file = NULL;
+    KDirectory *dir;
+    char fname[4096];
+    rc_t rc;
+
+    rc = KDirectoryNativeDir(&dir);
+    if (rc)
+        return rc;
+    
+    rc = string_printf(fname, sizeof(fname), NULL, "%s/key2id.%u.%u", settings->tmpfs, settings->pid, n); if (rc) return rc;
+    STSMSG(1, ("Path for scratch files: %s\n", fname));
+    rc = KDirectoryCreateFile(dir, &file, true, 0600, kcmInit, "%s", fname);
+    KDirectoryRemove(dir, 0, "%s", fname);
+    KDirectoryRelease(dir);
+    if (rc == 0) {
+        rc = KBTreeMakeUpdate(rslt, file, cacheSize,
+                              false, kbtOpaqueKey,
+                              1, 255, sizeof ( uint32_t ),
+                              NULL
+                              );
+        KFileRelease(file);
+#if PERF
+        if (rc == 0) {
+            static unsigned treecount = 0;
+
+            (void)PLOGMSG(klogInfo, (klogInfo, "Number of trees: $(cnt)", "cnt=%u", ++treecount));
+        }
+#endif
+    }
+    return rc;
+}
+
+rc_t GetKeyIDOld(const CommonWriterSettings* settings, SpotAssembler* const ctx, uint64_t *const rslt, bool *const wasInserted, char const key[], char const name[], size_t const namelen)
+{
+    size_t const keylen = strlen(key);
+    rc_t rc;
+    uint64_t tmpKey;
+
+    if (ctx->key2id_count == 0) {
+        rc = OpenKBTree(settings, &ctx->key2id[0], 1, 1);
+        if (rc) return rc;
+        ctx->key2id_count = 1;
+    }
+    if (keylen == 0 || memcmp(key, name, keylen) == 0) {
+        /* qname starts with read group; no append */
+        tmpKey = ctx->idCount[0];
+        rc = KBTreeEntry(ctx->key2id[0], &tmpKey, wasInserted, name, namelen);
+    }
+    else {
+        char sbuf[4096];
+        char *buf = sbuf;
+        char *hbuf = NULL;
+        size_t bsize = sizeof(sbuf);
+        size_t actsize;
+        
+        if (keylen + namelen + 2 > bsize) {
+            hbuf = malloc(bsize = keylen + namelen + 2);
+            if (hbuf == NULL)
+                return RC(rcExe, rcName, rcAllocating, rcMemory, rcExhausted);
+            buf = hbuf;
+        }
+        rc = string_printf(buf, bsize, &actsize, "%s\t%.*s", key, (int)namelen, name);
+        
+        tmpKey = ctx->idCount[0];
+        rc = KBTreeEntry(ctx->key2id[0], &tmpKey, wasInserted, buf, actsize);
+        if (hbuf)
+            free(hbuf);
+    }
+    if (rc == 0) {
+        *rslt = tmpKey;
+        if (*wasInserted)
+            ++ctx->idCount[0];
+    }
+    return rc;
+}
+
+#if _DEBUGGING
+/*
+static char const *Print_ctx_value_t(ctx_value_t const *const self)
+{
+    static char buffer[4096];
+    uint8_t const *const flag = self->alignmentCount + 2;
+    rc_t rc = string_printf(buffer, sizeof(buffer), NULL,
+                            "pid: { %lu, %lu }, sid: %lu, fid: %u, alc: { %u, %u }, flg: %x",
+                            CTX_VALUE_GET_P_ID(*self, 0),
+                            CTX_VALUE_GET_P_ID(*self, 1),
+                            CTX_VALUE_GET_S_ID(*self),
+                            self->fragmentId,
+                            self->alignmentCount[0],
+                            self->alignmentCount[1],
+                            *flag);
+
+    if (rc)
+        return 0;
+    return buffer;
+}
+*/
+#endif
+
+static unsigned HashKey(void const *const key, size_t const keylen)
+{
+    /* There is nothing special about this hash. It was randomly generated. */
+    static const uint8_t T1[] = {
+         64, 186,  39, 203,  54, 211,  98,  32,  26,  23, 219,  94,  77,  60,  56, 184,
+        129, 242,  10,  91,  84, 192,  19, 197, 231, 133, 125, 244,  48, 176, 160, 164,
+         17,  41,  57, 137,  44, 196, 116, 146, 105,  40, 122,  47, 220, 226, 213, 212,
+        107, 191,  52, 144,   9, 145,  81, 101, 217, 206,  85, 134, 143,  58, 128,  20,
+        236, 102,  83, 149, 148, 180, 167, 163,  12, 239,  31,   0,  73, 152,   1,  15,
+         75, 200,   4, 165,   5,  66,  25, 111, 255,  70, 174, 151,  96, 126, 147,  34,
+        112, 161, 127, 181, 237,  78,  37,  74, 222, 123,  21, 132,  95,  51, 141,  45,
+         61, 131, 193,  68,  62, 249, 178,  33,   7, 195, 228,  82,  27,  46, 254,  90,
+        185, 240, 246, 124, 205, 182,  42,  22, 198,  69, 166,  92, 169, 136, 223, 245,
+        118,  97, 115,  80, 252, 209,  49,  79, 221,  38,  28,  35,  36, 208, 187, 248,
+        158, 201, 202, 168,   2,  18, 189, 119, 216, 214,  11,   6,  89,  16, 229, 109,
+        120,  43, 162, 106, 204,   8, 199, 235, 142, 210,  86, 153, 227, 230,  24, 100,
+        224, 113, 190, 243, 218, 215, 225, 173,  99, 238, 138,  59, 183, 154, 171, 232,
+        157, 247, 233,  67,  88,  50, 253, 251, 140, 104, 156, 170, 150, 103, 117, 110,
+        155,  72, 207, 250, 159, 194, 177, 130, 135,  87,  71, 175,  14,  55, 172, 121,
+        234,  13,  30, 241,  93, 188,  53, 114,  76,  29,  65,   3, 179, 108,  63, 139
+    };
+    unsigned h = 0x55;
+    size_t i = keylen;
+    
+    do { h = T1[h ^ ((uint8_t)i)]; } while ((i >>= 8) != 0);
+
+    for (i = 0; i != keylen; ++i)
+        h = T1[h ^ ((uint8_t const *)key)[i]];
+
+    return h;
+}
+
+static unsigned SeqHashKey(void const *const key, size_t const keylen)
+{
+    /* There is nothing special about this hash. It was randomly generated. */
+    static const uint8_t T1[] = {
+         64, 186,  39, 203,  54, 211,  98,  32,  26,  23, 219,  94,  77,  60,  56, 184,
+        129, 242,  10,  91,  84, 192,  19, 197, 231, 133, 125, 244,  48, 176, 160, 164,
+         17,  41,  57, 137,  44, 196, 116, 146, 105,  40, 122,  47, 220, 226, 213, 212,
+        107, 191,  52, 144,   9, 145,  81, 101, 217, 206,  85, 134, 143,  58, 128,  20,
+        236, 102,  83, 149, 148, 180, 167, 163,  12, 239,  31,   0,  73, 152,   1,  15,
+         75, 200,   4, 165,   5,  66,  25, 111, 255,  70, 174, 151,  96, 126, 147,  34,
+        112, 161, 127, 181, 237,  78,  37,  74, 222, 123,  21, 132,  95,  51, 141,  45,
+         61, 131, 193,  68,  62, 249, 178,  33,   7, 195, 228,  82,  27,  46, 254,  90,
+        185, 240, 246, 124, 205, 182,  42,  22, 198,  69, 166,  92, 169, 136, 223, 245,
+        118,  97, 115,  80, 252, 209,  49,  79, 221,  38,  28,  35,  36, 208, 187, 248,
+        158, 201, 202, 168,   2,  18, 189, 119, 216, 214,  11,   6,  89,  16, 229, 109,
+        120,  43, 162, 106, 204,   8, 199, 235, 142, 210,  86, 153, 227, 230,  24, 100,
+        224, 113, 190, 243, 218, 215, 225, 173,  99, 238, 138,  59, 183, 154, 171, 232,
+        157, 247, 233,  67,  88,  50, 253, 251, 140, 104, 156, 170, 150, 103, 117, 110,
+        155,  72, 207, 250, 159, 194, 177, 130, 135,  87,  71, 175,  14,  55, 172, 121,
+        234,  13,  30, 241,  93, 188,  53, 114,  76,  29,  65,   3, 179, 108,  63, 139
+    };
+    unsigned h1 = 0x55;
+    unsigned h2 = 0x22;
+    size_t i = keylen;
+    
+    do { h1 = T1[h1 ^ ((uint8_t)i)]; } while ((i >>= 8) != 0);
+
+    for (i = 0; i != keylen; ++i)
+    {
+        unsigned temp = ((uint8_t const *)key)[i];
+        h1 = T1[h1 ^ temp];
+        h2 = T1[h2 ^ temp];
+    }
+
+    return (h1 << 8) | h2;
+}
+
+#define USE_ILLUMINA_NAMING_POUND_NUMBER_SLASH_HACK 1
+
+static size_t GetFixedNameLength(char const name[], size_t const namelen)
+{
+#if USE_ILLUMINA_NAMING_POUND_NUMBER_SLASH_HACK
+    char const *const pound = string_chr(name, namelen, '#');
+    
+    if (pound && pound + 2u < name + namelen && pound[1] >= '0' && pound[1] <= '9' && pound[2] == '/') {
+        return (size_t)(pound - name) + 2u;
+    }
+#endif
+    return namelen;
+}
+
+rc_t GetKeyID(CommonWriterSettings *const settings,
+              SpotAssembler *const ctx,
+              uint64_t *const rslt,
+              bool *const wasInserted,
+              char const key[],
+              char const name[],
+              size_t const o_namelen)
+{
+    size_t const namelen = GetFixedNameLength(name, o_namelen);
+
+    if (ctx->key2id_max == 1)
+        return GetKeyIDOld(settings, ctx, rslt, wasInserted, key, name, namelen);
+    else {
+        size_t const keylen = strlen(key);
+        unsigned const h = HashKey(key, keylen);
+        size_t f;
+        size_t e = ctx->key2id_count;
+        uint64_t tmpKey;
+        
+        *rslt = 0;
+        {{
+            uint32_t const bucket_value = ctx->key2id_hash[h];
+            unsigned const n  = (uint8_t) bucket_value;
+            unsigned const i1 = (uint8_t)(bucket_value >>  8);
+            unsigned const i2 = (uint8_t)(bucket_value >> 16);
+            unsigned const i3 = (uint8_t)(bucket_value >> 24);
+            
+            if (n > 0 && strcmp(key, ctx->key2id_names + ctx->key2id_name[i1]) == 0) {
+                f = i1;
+                /*
+                ctx->key2id_hash[h] = (i3 << 24) | (i2 << 16) | (i1 << 8) | n;
+                 */
+                goto GET_ID;
+            }
+            if (n > 1 && strcmp(key, ctx->key2id_names + ctx->key2id_name[i2]) == 0) {
+                f = i2;
+                ctx->key2id_hash[h] = (i3 << 24) | (i1 << 16) | (i2 << 8) | n;
+                goto GET_ID;
+            }
+            if (n > 2 && strcmp(key, ctx->key2id_names + ctx->key2id_name[i3]) == 0) {
+                f = i3;
+                ctx->key2id_hash[h] = (i2 << 24) | (i1 << 16) | (i3 << 8) | n;
+                goto GET_ID;
+            }
+        }}
+        f = 0;
+        while (f < e) {
+            size_t const m = (f + e) / 2;
+            size_t const oid = ctx->key2id_oid[m];
+            int const diff = strcmp(key, ctx->key2id_names + ctx->key2id_name[oid]);
+            
+            if (diff < 0)
+                e = m;
+            else if (diff > 0)
+                f = m + 1;
+            else {
+                f = oid;
+                goto GET_ID;
+            }
+        }
+        if (ctx->key2id_count < ctx->key2id_max) {
+            size_t const name_max = ctx->key2id_name_max + keylen + 1;
+            KBTree *tree;
+            rc_t rc = OpenKBTree(settings, &tree, ctx->key2id_count + 1, 1); /* ctx->key2id_max); */
+            
+            if (rc) return rc;
+            
+            if (ctx->key2id_name_alloc < name_max) {
+                size_t alloc = ctx->key2id_name_alloc;
+                void *tmp;
+                
+                if (alloc == 0)
+                    alloc = 4096;
+                while (alloc < name_max)
+                    alloc <<= 1;
+                tmp = realloc(ctx->key2id_names, alloc);
+                if (tmp == NULL)
+                    return RC(rcExe, rcName, rcAllocating, rcMemory, rcExhausted);
+                ctx->key2id_names = tmp;
+                ctx->key2id_name_alloc = alloc;
+            }
+            if (f < ctx->key2id_count) {
+                memmove(&ctx->key2id_oid[f + 1], &ctx->key2id_oid[f], (ctx->key2id_count - f) * sizeof(ctx->key2id_oid[f]));
+            }
+            ctx->key2id_oid[f] = ctx->key2id_count;
+            ++ctx->key2id_count;
+            f = ctx->key2id_oid[f];
+            ctx->key2id_name[f] = ctx->key2id_name_max;
+            ctx->key2id_name_max = name_max;
+
+            memmove(&ctx->key2id_names[ctx->key2id_name[f]], key, keylen + 1);
+            ctx->key2id[f] = tree;
+            ctx->idCount[f] = 0;
+            if ((uint8_t)ctx->key2id_hash[h] < 3) {
+                unsigned const n = (uint8_t)ctx->key2id_hash[h] + 1;
+                
+                ctx->key2id_hash[h] = (uint32_t)((((ctx->key2id_hash[h] & ~(0xFFu)) | f) << 8) | n);
+            }
+            else {
+                /* the hash function isn't working too well
+                 * keep the 3 mru
+                 */
+                ctx->key2id_hash[h] = (uint32_t)((((ctx->key2id_hash[h] & ~(0xFFu)) | f) << 8) | 3);
+            }
+        GET_ID:
+            tmpKey = ctx->idCount[f];
+            rc = KBTreeEntry(ctx->key2id[f], &tmpKey, wasInserted, name, namelen);
+            if (rc == 0) {
+                *rslt = (((uint64_t)f) << 32) | tmpKey;
+                if (*wasInserted)
+                    ++ctx->idCount[f];
+                assert(tmpKey < ctx->idCount[f]);
+            }
+            return rc;
+        }
+        return RC(rcExe, rcTree, rcAllocating, rcConstraint, rcViolated);
+    }
+}
+
+static rc_t OpenMMapFile(const CommonWriterSettings* settings, SpotAssembler *const ctx, KDirectory *const dir)
+{
+    KFile *file = NULL;
+    char fname[4096];
+    rc_t rc = string_printf(fname, sizeof(fname), NULL, "%s/id2value.%u", settings->tmpfs, settings->pid);
+    
+    if (rc)
+        return rc;
+    
+    rc = KDirectoryCreateFile(dir, &file, true, 0600, kcmInit, "%s", fname);
+    KDirectoryRemove(dir, 0, "%s", fname);
+    if (rc == 0)
+        rc = MMArrayMake(&ctx->id2value, file, sizeof(ctx_value_t));
+    KFileRelease(file);
+    return rc;
+}
+
+static rc_t OpenMBankFile(const CommonWriterSettings* settings, SpotAssembler *const ctx, KDirectory *const dir)
+{
+    KFile *file = NULL;
+    char fname[4096];
+    KMemBank **const mbank = &ctx->fragsBoth;
+    rc_t rc = string_printf(fname, sizeof(fname), NULL, "%s/fragments.%u", settings->tmpfs, settings->pid);
+    
+    if (rc)
+        return rc;
+    
+    rc = KDirectoryCreateFile(dir, &file, true, 0600, kcmInit, "%s", fname);
+    KDirectoryRemove(dir, 0, "%s", fname);
+    if (rc == 0) {
+        rc = KMemBankMake(mbank, 0, 0, file);
+        KFileRelease(file);
+    }
+    return rc;
+}
+
+rc_t SetupContext(const CommonWriterSettings* settings, SpotAssembler *ctx)
+{
+    rc_t rc = 0;
+
+    memset(ctx, 0, sizeof(*ctx));
+    
+    ctx->pass = 1;
+    
+    if (settings->mode == mode_Archive) {
+        KDirectory *dir;
+
+        STSMSG(1, ("Cache size: %uM\n", settings->cache_size / 1024 / 1024));
+        
+        rc = KLoadProgressbar_Make(&ctx->progress[0], 0); if (rc) return rc;
+        rc = KLoadProgressbar_Make(&ctx->progress[1], 0); if (rc) return rc;
+        rc = KLoadProgressbar_Make(&ctx->progress[2], 0); if (rc) return rc;
+        rc = KLoadProgressbar_Make(&ctx->progress[3], 0); if (rc) return rc;
+        
+        KLoadProgressbar_Append(ctx->progress[0], 100 * settings->numfiles);
+        
+        rc = KDirectoryNativeDir(&dir);
+        if (rc == 0)
+            rc = OpenMMapFile(settings, ctx, dir);
+        if (rc == 0)
+            rc = OpenMBankFile(settings, ctx, dir);
+        KDirectoryRelease(dir);
+    }
+    return rc;
+}
+
+void ContextReleaseMemBank(SpotAssembler *ctx)
+{
+    KMemBankRelease(ctx->fragsBoth);
+    ctx->fragsBoth = NULL;
+}
+
+void ContextRelease(SpotAssembler *ctx)
+{
+    KLoadProgressbar_Release(ctx->progress[0], true);
+    KLoadProgressbar_Release(ctx->progress[1], true);
+    KLoadProgressbar_Release(ctx->progress[2], true);
+    KLoadProgressbar_Release(ctx->progress[3], true);
+    MMArrayWhack(ctx->id2value);
+}
+
+static
+rc_t WriteSoloFragments(const CommonWriterSettings* settings, SpotAssembler* ctx, SequenceWriter *seq)
+{
+    uint32_t i;
+    unsigned j;
+    uint64_t idCount = 0;
+    rc_t rc;
+    KDataBuffer fragBuf;
+    SequenceRecord srec;
+    
+    ++ctx->pass;
+    memset(&srec, 0, sizeof(srec));
+    
+    rc = KDataBufferMake(&fragBuf, 8, 0);
+    if (rc) {
+        (void)LOGERR(klogErr, rc, "KDataBufferMake failed");
+        return rc;
+    }
+    for (idCount = 0, j = 0; j < ctx->key2id_count; ++j) {
+        idCount += ctx->idCount[j];
+    }
+    KLoadProgressbar_Append(ctx->progress[ctx->pass - 1], idCount);
+    
+    for (idCount = 0, j = 0; j < ctx->key2id_count; ++j) {
+        for (i = 0; i != ctx->idCount[j]; ++i, ++idCount) {
+            uint64_t const keyId = ((uint64_t)j << 32) | i;
+            ctx_value_t *value;
+            size_t rsize;
+            uint64_t id;
+            uint64_t sz;
+            unsigned readLen[2];
+            unsigned read = 0;
+            FragmentInfo const *fip;
+            uint8_t const *src;
+            KMemBank *frags = ctx->fragsBoth;
+            
+            rc = MMArrayGet(ctx->id2value, (void **)&value, keyId);
+            if (rc)
+                break;
+            KLoadProgressbar_Process(ctx->progress[ctx->pass - 1], 1, false);
+
+            id = value->fragmentId;
+            if (id == 0)
+                continue;
+            
+            rc = KMemBankSize(frags, id, &sz);
+            if (rc) {
+                (void)LOGERR(klogErr, rc, "KMemBankSize failed");
+                break;
+            }
+            rc = KDataBufferResize(&fragBuf, (size_t)sz);
+            if (rc) {
+                (void)LOGERR(klogErr, rc, "KDataBufferResize failed");
+                break;
+            }
+            rc = KMemBankRead(frags, id, 0, fragBuf.base, sz, &rsize);
+            if (rc) {
+                (void)LOGERR(klogErr, rc, "KMemBankRead failed");
+                break;
+            }
+            assert( rsize == sz );
+            fip = (FragmentInfo const *)fragBuf.base;
+            src = (uint8_t const *)&fip[1];
+            
+            readLen[0] = readLen[1] = 0;
+            if (!value->unmated && (   (fip->aligned && CTX_VALUE_GET_P_ID(*value, 0) == 0)
+                                     || (value->unaligned_2)))
+            {
+                read = 1;
+            }
+            
+            readLen[read] = fip->readlen;
+            rc = SequenceRecordInit(&srec, value->unmated ? 1 : 2, readLen);
+            if (rc) {
+                (void)LOGERR(klogErr, rc, "SequenceRecordInit failed");
+                break;
+            }
+            
+            srec.ti[read] = fip->ti;
+            srec.aligned[read] = fip->aligned;
+            srec.is_bad[read] = fip->is_bad;
+            srec.orientation[read] = fip->orientation;
+            srec.cskey[read] = fip->cskey;
+            memmove(srec.seq + srec.readStart[read], src, srec.readLen[read]);
+            src += fip->readlen;
+            
+            memmove(srec.qual + srec.readStart[read], src, srec.readLen[read]);
+            src += fip->readlen;
+            srec.spotGroup = (char *)src;
+            srec.spotGroupLen = fip->sglen;
+            srec.keyId = keyId;
+            
+            rc = SequenceWriteRecord(seq, &srec, ctx->isColorSpace, value->pcr_dup, value->platform, 
+                                    settings->keepMismatchQual, settings->no_real_output, settings->hasTI, settings->QualQuantizer);
+            if (rc) {
+                (void)LOGERR(klogErr, rc, "SequenceWriteRecord failed");
+                break;
+            }
+            /*rc = KMemBankFree(frags, id);*/
+            CTX_VALUE_SET_S_ID(*value, ++ctx->spotId);
+        }
+    }
+    /*printf("DONE_SOLO:\tcnt2=%d\tcnt1=%d\n",fcountBoth,fcountOne);*/
+    KDataBufferWhack(&fragBuf);
+    KDataBufferWhack(&srec.storage);
+    return rc;
+}
+
+static
+rc_t AlignmentUpdateSpotInfo(SpotAssembler *ctx, struct AlignmentWriter *align, uint64_t maxDistance)
+{
+    rc_t rc;
+    
+    ++ctx->pass;
+
+    KLoadProgressbar_Append(ctx->progress[ctx->pass - 1], ctx->alignCount);
+
+    rc = AlignmentStartUpdatingSpotIds(align);
+    while (rc == 0 && (rc = Quitting()) == 0) {
+        ctx_value_t const *value;
+        uint64_t keyId;
+        int64_t alignId;
+        bool isPrimary;
+        
+        rc = AlignmentGetSpotKey(align, &keyId, &alignId, &isPrimary);
+        if (rc) {
+            if (GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound)
+                rc = 0;
+            break;
+        }
+        assert(keyId >> 32 < ctx->key2id_count);
+        assert((uint32_t)keyId < ctx->idCount[keyId >> 32]);
+        rc = MMArrayGet(ctx->id2value, (void **)&value, keyId);
+        if (rc == 0) {
+            int64_t const spotId = CTX_VALUE_GET_S_ID(*value);
+            int64_t const id[] = {
+                CTX_VALUE_GET_P_ID(*value, 0),
+                CTX_VALUE_GET_P_ID(*value, 1)
+            };
+            int64_t mateId = 0;
+            ReferenceStart mateGlobalRefPos;
+            
+            memset(&mateGlobalRefPos, 0, sizeof(mateGlobalRefPos));
+            if (spotId == 0) {
+                assert(!isPrimary);
+                (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(id)' was never assigned a spot id, probably has no primary alignments", "id=%lx", keyId));
+                /* (void)PLOGMSG(klogWarn, (klogWarn, "Spot #$(i): { $(s) }", "i=%lu,s=%s", keyId, Print_ctx_value_t(value))); */
+            }
+            if (isPrimary) {
+                if (id[0] != 0 && id[1] != 0)
+                    mateId = alignId == id[0] ? id[1] : id[0];
+                
+                if (mateId && maxDistance && (id[0] > id[1] ? id[0] - id[1] : id[1] - id[0]) > maxDistance) {
+                    rc = AlignmentGetRefPos(align, mateId, &mateGlobalRefPos);
+                    if (rc) break;
+                }
+            }
+            rc = AlignmentUpdateInfo(align, spotId, mateId, &mateGlobalRefPos);
+        }
+        KLoadProgressbar_Process(ctx->progress[ctx->pass - 1], 1, false);
+    }
+    return rc;
+}
+
+rc_t SequenceUpdateAlignInfo(SpotAssembler *ctx, struct SequenceWriter *seq)
+{
+    rc_t rc = 0;
+    uint64_t row;
+    const ctx_value_t *value;
+    uint64_t keyId;
+    
+    ++ctx->pass;
+    KLoadProgressbar_Append(ctx->progress[ctx->pass - 1], ctx->spotId + 1);
+    
+    for (row = 1; row <= ctx->spotId; ++row) {
+        rc = SequenceReadKey(seq, row, &keyId);
+        if (rc) {
+            (void)PLOGERR(klogErr, (klogErr, rc, "Failed to get key for row $(row)", "row=%u", (unsigned)row));
+            break;
+        }
+        rc = MMArrayGet(ctx->id2value, (void **)&value, keyId);
+        if (rc) {
+            (void)PLOGERR(klogErr, (klogErr, rc, "Failed to read info for row $(row), index $(idx)", "row=%u,idx=%u", (unsigned)row, (unsigned)keyId));
+            break;
+        }
+        if (row != CTX_VALUE_GET_S_ID(*value)) {
+            rc = RC(rcApp, rcTable, rcWriting, rcData, rcUnexpected);
+            (void)PLOGMSG(klogErr, (klogErr, "Unexpected spot id $(spotId) for row $(row), index $(idx)", "spotId=%u,row=%u,idx=%u", (unsigned)CTX_VALUE_GET_S_ID(*value), (unsigned)row, (unsigned)keyId));
+            break;
+        }
+        {{
+            int64_t primaryId[2];
+            /*uint64_t const spotId = CTX_VALUE_GET_S_ID(*value);*/
+            
+            primaryId[0] = CTX_VALUE_GET_P_ID(*value, 0);
+            primaryId[1] = CTX_VALUE_GET_P_ID(*value, 1);
+            
+            rc = SequenceUpdateAlignData(seq, row, value->unmated ? 1 : 2,
+                                         primaryId,
+                                         value->alignmentCount);
+        }}
+        if (rc) {
+            (void)LOGERR(klogErr, rc, "Failed updating AlignmentWriter data in sequence table");
+            break;
+        }
+        KLoadProgressbar_Process(ctx->progress[ctx->pass - 1], 1, false);
+    }
+    return rc;
+}
+
+void EditAlignedQualities(const CommonWriterSettings* settings, uint8_t qual[], bool const hasMismatch[], unsigned readlen) /* generic */
+{
+    unsigned i;
+    
+    for (i = 0; i < readlen; ++i) {
+        uint8_t const q = hasMismatch[i] ? settings->alignedQualValue : qual[i];
+        
+        qual[i] = q;
+    }
+}
+
+void EditUnalignedQualities(uint8_t qual[], bool const hasMismatch[], unsigned readlen) /* generic */
+{
+    unsigned i;
+    
+    for (i = 0; i < readlen; ++i) {
+        uint8_t const q = (qual[i] & 0x7F) | (hasMismatch[i] ? 0x80 : 0);
+        
+        qual[i] = q;
+    }
+}
+
+bool platform_cmp(char const platform[], char const test[])
+{
+    unsigned i;
+
+    for (i = 0; ; ++i) {
+        int ch1 = test[i];
+        int ch2 = toupper(platform[i]);
+        
+        if (ch1 != ch2)
+            break;
+        if (ch1 == 0)
+            return true;
+    }
+    return false;
+}
+
+rc_t CheckLimitAndLogError(CommonWriterSettings* settings)
+{
+    ++settings->errCount;
+    if (settings->maxErrCount > 0 && settings->errCount > settings->maxErrCount) {
+        (void)PLOGERR(klogErr, (klogErr, RC(rcAlign, rcFile, rcReading, rcError, rcExcessive), 
+                                "Number of errors $(cnt) exceeds limit of $(max): Exiting", "cnt=%lu,max=%lu", 
+                                settings->errCount, settings->maxErrCount));
+        return RC(rcAlign, rcFile, rcReading, rcError, rcExcessive);
+    }
+    return 0;
+}
+
+void RecordNoMatch(const CommonWriterSettings* settings, char const readName[], char const refName[], uint32_t const refPos)
+{
+    if (settings->noMatchLog) {
+        static uint64_t lpos = 0;
+        char logbuf[256];
+        size_t len;
+        
+        if (string_printf(logbuf, sizeof(logbuf), &len, "%s\t%s\t%u\n", readName, refName, refPos) == 0) {
+            KFileWrite(settings->noMatchLog, lpos, logbuf, len, NULL);
+            lpos += len;
+        }
+    }
+}
+
+rc_t LogNoMatch(CommonWriterSettings* settings, char const readName[], char const refName[], unsigned rpos, unsigned matches)
+{
+    rc_t const rc = CheckLimitAndLogError(settings);
+    static unsigned count = 0;
+    
+    ++count;
+    if (rc) {
+        (void)PLOGMSG(klogInfo, (klogInfo, "This is the last warning; this class of warning occurred $(occurred) times",
+                                 "occurred=%u", count));
+        (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' contains too few ($(count)) matching bases to reference '$(ref)' at $(pos)",
+                                 "name=%s,ref=%s,pos=%u,count=%u", readName, refName, rpos, matches));
+    }
+    else if (settings->maxWarnCount_NoMatch == 0 || count < settings->maxWarnCount_NoMatch)
+        (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' contains too few ($(count)) matching bases to reference '$(ref)' at $(pos)",
+                                 "name=%s,ref=%s,pos=%u,count=%u", readName, refName, rpos, matches));
+    return rc;
+}
+
+rc_t LogDupConflict(CommonWriterSettings* settings, char const readName[])
+{
+    rc_t const rc = CheckLimitAndLogError(settings);
+    static unsigned count = 0;
+    
+    ++count;
+    if (rc) {
+        (void)PLOGMSG(klogInfo, (klogInfo, "This is the last warning; this class of warning occurred $(occurred) times",
+                                 "occurred=%u", count));
+        (void)PLOGERR(klogWarn, (klogWarn, RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+                                 "Spot '$(name)' is both a duplicate and NOT a duplicate!",
+                                 "name=%s", readName));
+    }
+    else if (settings->maxWarnCount_DupConflict == 0 || count < settings->maxWarnCount_DupConflict)
+        (void)PLOGERR(klogWarn, (klogWarn, RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+                                 "Spot '$(name)' is both a duplicate and NOT a duplicate!",
+                                 "name=%s", readName));
+    return rc;
+}
+
+void COPY_QUAL(uint8_t D[], uint8_t const S[], unsigned const L, bool const R)
+{
+    if (R) {
+        unsigned i;
+        unsigned j;
+        
+        for (i = 0, j = L - 1; i != L; ++i, --j)
+            D[i] = S[j];
+    }
+    else
+        memmove(D, S, L);
+}
+
+void COPY_READ(INSDC_dna_text D[], INSDC_dna_text const S[], unsigned const L, bool const R)
+{
+    static INSDC_dna_text const compl[] = {
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         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', '3',  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 , 'T', 'V', 'G', 'H',  0 ,  0 , 'C', 
+        'D',  0 ,  0 , 'M',  0 , 'K', 'N',  0 , 
+         0 ,  0 , 'Y', 'S', 'A', 'A', 'B', 'W', 
+         0 , 'R',  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 , 'T', 'V', 'G', 'H',  0 ,  0 , 'C', 
+        'D',  0 ,  0 , 'M',  0 , 'K', 'N',  0 , 
+         0 ,  0 , 'Y', 'S', 'A', 'A', 'B', 'W', 
+         0 , 'R',  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
+         0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0
+    };
+    if (R) {
+        unsigned i;
+        unsigned j;
+        
+        for (i = 0, j = L - 1; i != L; ++i, --j)
+            D[i] = compl[((uint8_t const *)S)[j]];
+    }
+    else
+        memmove(D, S, L);
+}
+
+/*--------------------------------------------------------------------------
+ * ArchiveFile
+ */
+static uint8_t GetMapQ(Alignment const *rec)
+{
+    uint8_t mapQ;
+    
+    AlignmentGetMapQuality(rec, &mapQ);
+    return mapQ;
+}
+
+INSDC_SRA_platform_id PlatformToId(const char* name)
+{
+    if (name != NULL)
+    {
+        switch (toupper(name[0])) {
+        case 'C':
+            if (platform_cmp(name, "COMPLETE GENOMICS") || platform_cmp(name, "COMPLETE_GENOMICS"))
+                return SRA_PLATFORM_COMPLETE_GENOMICS;
+            if (platform_cmp(name, "CAPILLARY"))
+                return SRA_PLATFORM_CAPILLARY;
+            break;
+        case 'H':
+            if (platform_cmp(name, "HELICOS"))
+                return SRA_PLATFORM_HELICOS;
+            break;
+        case 'I':
+            if (platform_cmp(name, "ILLUMINA"))
+                return SRA_PLATFORM_ILLUMINA;
+            if (platform_cmp(name, "IONTORRENT"))
+                return SRA_PLATFORM_ION_TORRENT;
+            break;
+        case 'L':
+            if (platform_cmp(name, "LS454"))
+                return SRA_PLATFORM_454;
+            break;
+        case 'N':
+            if (platform_cmp(name, "NANOPORE"))
+                return SRA_PLATFORM_OXFORD_NANOPORE;
+            break;
+        case 'O':
+            if (platform_cmp(name, "OXFORD_NANOPORE"))
+                return SRA_PLATFORM_OXFORD_NANOPORE;
+            break;
+        case 'P':
+            if (platform_cmp(name, "PACBIO"))
+                return SRA_PLATFORM_PACBIO_SMRT;
+            break;
+        case 'S':
+            if (platform_cmp(name, "SOLID"))
+                return SRA_PLATFORM_ABSOLID;
+            if (platform_cmp(name, "SANGER"))
+                return SRA_PLATFORM_CAPILLARY;
+            break;
+        default:
+            break;
+        }
+    }
+    return SRA_PLATFORM_UNDEFINED;
+}
+
+INSDC_SRA_platform_id GetINSDCPlatform(ReferenceInfo const *ref, char const name[]) {
+    if (ref != NULL && name != NULL) {
+        ReadGroup rg;
+
+        rc_t rc = ReferenceInfoGetReadGroupByName(ref, name, &rg);
+        if (rc == 0 && rg.platform) 
+            return PlatformToId(rg.platform) ;
+    }
+    return SRA_PLATFORM_UNDEFINED;
+}
+
+void ParseSpotName(char const name[], size_t* namelen)
+{ /* remove trailing #... */
+    const char* hash = string_chr(name, *namelen, '#');
+    if (hash)
+        *namelen = hash - name;
+}
+
+
+static const int8_t toPhred[] =
+{
+              0, 1, 1, 2, 2, 3, 3,
+     4, 4, 5, 5, 6, 7, 8, 9,10,10,
+    11,12,13,14,15,16,17,18,19,20,
+    21,22,23,24,25,26,27,28,29,30,
+    31,32,33,34,35,36,37,38,39,40
+};
+
+static int8_t LogOddsToPhred ( int8_t logOdds )
+{ /* conversion table copied from interface/ncbi/seq.vschema */
+    if (logOdds < -6)
+        return 0;
+    if (logOdds > 40)
+        return 40;
+    return toPhred[logOdds + 6];
+}
+
+rc_t ArchiveFile(const struct ReaderFile *const reader,
+                 CommonWriterSettings *const G,
+                 struct SpotAssembler *const ctx,
+                 struct Reference *const ref,
+                 struct SequenceWriter *const seq,
+                 struct AlignmentWriter *const align,
+                 bool *const had_alignments,
+                 bool *const had_sequences)
+{
+    KDataBuffer buf;
+    KDataBuffer fragBuf;
+    KDataBuffer cigBuf;
+    rc_t rc;
+    int32_t lastRefSeqId = -1;
+    size_t rsize;
+    uint64_t keyId = 0;
+    uint64_t reccount = 0;
+    SequenceRecord srec;
+    char spotGroup[512];
+    size_t namelen;
+    unsigned progress = 0;
+    unsigned warned = 0;
+    int skipRefSeqId = -1;
+    int unmapRefSeqId = -1;
+    uint64_t recordsProcessed = 0;
+    uint64_t filterFlagConflictRecords=0; /*** counts number of conflicts between flags 'duplicate' and 'lowQuality' ***/
+#define MAX_WARNINGS_FLAG_CONFLICT 10000 /*** maximum errors to report ***/
+
+    bool isColorSpace = false;
+    bool isNotColorSpace = G->noColorSpace;
+    char alignGroup[32];
+    size_t alignGroupLen;
+    AlignmentRecord data;
+    
+    const ReferenceInfo* header = NULL;
+
+    memset(&data, 0, sizeof(data));
+    
+    rc = ReaderFileGetReferenceInfo(reader, &header);
+    if (rc)
+        return rc;
+
+    if (ctx->key2id_max == 0) {
+        if (header != NULL) {
+            uint32_t rgcount;
+            unsigned rgi;
+            
+            ReferenceInfoGetReadGroupCount(header, &rgcount);
+            if (rgcount > (sizeof(ctx->key2id)/sizeof(ctx->key2id[0]) - 1))
+                ctx->key2id_max = 1;
+            else
+                ctx->key2id_max = sizeof(ctx->key2id)/sizeof(ctx->key2id[0]);
+            
+            for (rgi = 0; rgi != rgcount; ++rgi) {
+                ReadGroup rg;
+                
+                rc_t rc2 = ReferenceInfoGetReadGroup(header, rgi, &rg);
+                if (rc2 == 0 && rg.platform && platform_cmp(rg.platform, "CAPILLARY")) {
+                    G->hasTI = true;
+                    break;
+                }
+            }
+        }
+        else
+            ctx->key2id_max = 1;        
+    }
+    
+    memset(&srec, 0, sizeof(srec));
+    
+    rc = KDataBufferMake(&cigBuf, 32, 0);
+    if (rc)
+        return rc;
+    
+    rc = KDataBufferMake(&fragBuf, 8, FRAG_CHUNK_SIZE);
+    if (rc)
+        return rc;
+    
+    rc = KDataBufferMake(&buf, 16, 0);
+    if (rc)
+        return rc;
+    
+    if (rc == 0) {
+        (void)PLOGMSG(klogInfo, (klogInfo, "Loading '$(file)'", "file=%s", ReaderFileGetPathname(reader)));
+    }
+    
+    *had_alignments = false;
+    *had_sequences = false;
+    
+    while (rc == 0 && (rc = Quitting()) == 0) {
+        bool aligned;
+        uint32_t readlen;
+        int64_t rpos=0;
+        char *seqDNA;
+        ReferenceSequence refSeq;
+        ctx_value_t *value;
+        bool wasInserted;
+        int32_t refSeqId=-1;
+        uint8_t *qual;
+        bool mated;
+        const char *name;
+        char cskey = 0;
+        bool originally_aligned;
+        bool isPrimary;
+        uint32_t opCount;
+        bool hasCG;
+        uint64_t ti = 0;
+        uint32_t csSeqLen = 0;
+        int readOrientation;
+        uint8_t rna_orient = ' ';
+        
+        const Record* record;
+        const Sequence* sequence = NULL;
+        const Alignment* alignment = NULL;
+        const CGData* cg = NULL;
+
+        rc = ReaderFileGetRecord(reader, &record);
+        if (GetRCObject(rc) == rcRow && (GetRCState(rc) == rcInvalid || GetRCState(rc) == rcEmpty)) {
+            (void)PLOGERR(klogWarn, (klogWarn, rc, "ArchiveFile: '$(file)' - row $(row)", "file=%s,row=%lu", ReaderFileGetPathname(reader), reccount + 1));
+            rc = CheckLimitAndLogError(G);
+        }
+        else if (rc || record == 0)
+            break;
+
+        {
+            const Rejected* rej;
+            rc = RecordGetRejected(record, &rej);
+            if (rc)
+            {
+                (void)LOGERR(klogErr, rc, "ArchiveFile: RecordGetSequence failed");
+                break;
+            }
+            if (rej != NULL)
+            {
+                const char* message;
+                uint64_t line;
+                uint64_t col;
+                bool fatal;
+                rc = RejectedGetError(rej, &message, &line, &col, &fatal);
+                if (rc)
+                {
+                    (void)LOGERR(klogErr, rc, "ArchiveFile: RejectedGetError failed");
+                    break;
+                }
+                (void)PLOGMSG(fatal ? klogErr : klogWarn, (fatal ? klogErr : klogWarn, 
+                              "$(file):$(l):$(c):$(msg)", "file=%s,l=%lu,c=%lu,msg=%s", 
+                              ReaderFileGetPathname(reader), line, col, message));
+                rc = CheckLimitAndLogError(G);
+                RejectedRelease(rej);
+                
+                if (fatal)
+                {
+                    rc = RC(rcExe, rcFile, rcParsing, rcFormat, rcUnsupported);
+                    break;
+                }
+                    
+                goto LOOP_END;
+            }
+        }
+        rc = RecordGetSequence(record, &sequence);
+        if (rc)
+        {
+            (void)LOGERR(klogErr, rc, "ArchiveFile: RecordGetSequence failed");
+            break;
+        }
+        rc = RecordGetAlignment(record, &alignment);
+        if (rc)
+        {
+            (void)LOGERR(klogErr, rc, "ArchiveFile: RecordGetAlignment failed");
+            break;
+        }
+        if (alignment != NULL)
+        {
+            rc = AlignmentGetCGData(alignment, &cg);      
+            if (rc)
+            {
+                (void)LOGERR(klogErr, rc, "ArchiveFile: AlignmentGetCG failed");
+                break;
+            }
+        }
+        
+        if ((unsigned)(ReaderFileGetProportionalPosition(reader) * 100.0) > progress) { 
+            unsigned new_value = ReaderFileGetProportionalPosition(reader) * 100.0;
+            KLoadProgressbar_Process(ctx->progress[0], new_value - progress, false);
+            progress = new_value;
+        }
+
+
+        /**************************************************************/
+        if (!G->noColorSpace) {
+            if (SequenceIsColorSpace(sequence)) {
+                if (isNotColorSpace) {
+                MIXED_BASE_AND_COLOR:
+                    rc = RC(rcApp, rcFile, rcReading, rcData, rcInconsistent);  
+                    (void)PLOGERR(klogErr, (klogErr, rc, "File '$(file)' contains base space and color space", "file=%s", ReaderFileGetPathname(reader)));
+                    goto LOOP_END;
+                }
+                ctx->isColorSpace = isColorSpace = true;
+            }
+            else if (isColorSpace)
+                goto MIXED_BASE_AND_COLOR;
+            else
+                isNotColorSpace = true;
+        }
+        hasCG = cg != NULL;
+        if (hasCG) {
+            AlignmentGetAlignOpCount(alignment, &opCount);
+            rc = KDataBufferResize(&cigBuf, opCount * 2 + 5);
+            if (rc) {
+                (void)LOGERR(klogErr, rc, "Failed to resize CIGAR buffer");
+                goto LOOP_END;
+            }
+            
+            rc = AlignmentRecordInit(&data, readlen = 35, G->expectUnsorted, G->compressQuality);
+            if (rc == 0)
+	            rc = KDataBufferResize(&buf, readlen);
+            if (rc) {
+                (void)LOGERR(klogErr, rc, "Failed to resize record buffer");
+                goto LOOP_END;
+            }
+            
+            seqDNA = buf.base;
+            qual = (uint8_t *)&seqDNA[readlen];
+        }
+        else {
+            if (alignment != 0)
+            {
+                uint32_t const *tmp;
+                AlignmentGetBAMCigar(alignment, &tmp, &opCount);
+                rc = KDataBufferResize(&cigBuf, opCount);
+                if (rc) {
+                    (void)LOGERR(klogErr, rc, "Failed to resize CIGAR buffer");
+                    goto LOOP_END;
+                }
+                memmove(cigBuf.base, tmp, opCount * sizeof(uint32_t));
+            }
+            
+            SequenceGetReadLength(sequence, &readlen);
+            if (isColorSpace) {
+                SequenceGetCSReadLength(sequence, &csSeqLen);
+                if (readlen > csSeqLen) {
+                    rc = RC(rcAlign, rcRow, rcReading, rcData, rcInconsistent);
+                    (void)LOGERR(klogErr, rc, "SequenceWriter length and CS SequenceWriter length are inconsistent");
+                    goto LOOP_END;
+                }
+                else if (readlen < csSeqLen)
+                {
+                    readlen = 0; /* will be hard clipped */
+                }
+            }
+            else if (readlen == 0) {
+            }
+            rc = AlignmentRecordInit(&data, readlen | csSeqLen, G->expectUnsorted, G->compressQuality);
+            if (rc == 0)
+	            rc = KDataBufferResize(&buf, readlen | csSeqLen);
+            if (rc) {
+                (void)LOGERR(klogErr, rc, "Failed to resize record buffer");
+                goto LOOP_END;
+            }
+            
+            seqDNA = buf.base;
+            qual = (uint8_t *)&seqDNA[readlen | csSeqLen];
+        }
+        SequenceGetSpotName(sequence, &name, &namelen);
+        if (G->parseSpotName)
+            ParseSpotName(name, &namelen);
+        SequenceGetRead(sequence, seqDNA);
+        
+        {
+            int8_t const *squal;
+            uint8_t qoffset = 0;
+            int qualType=0;            
+            unsigned i;
+            
+            rc = SequenceGetQuality(sequence, &squal, &qoffset, &qualType);
+            if (rc) {
+                (void)PLOGERR(klogErr, (klogErr, rc, "Spot '$(name)': length of original quality does not match sequence", 
+                                                        "name=%.*s", (uint32_t)namelen, name));
+                rc = CheckLimitAndLogError(G);
+                goto LOOP_END;
+            }
+            else if (squal == NULL)
+                memset(qual, 30, readlen); /* SRA-2932: 30 is the preferred quality value for fasta */
+            else 
+            {  
+                if (G->useQUAL)
+                    memmove(qual, squal, readlen);
+                else
+                {
+                    switch (qualType)
+                    {
+                    case QT_LogOdds:
+                        for (i = 0; i != readlen; ++i)
+                            qual[i] = LogOddsToPhred(squal[i] - qoffset);
+                        break;
+                        
+                    case QT_Phred:
+                        if (qoffset) {
+                            for (i = 0; i != readlen; ++i)
+                                qual[i] = squal[i] - qoffset;
+                        }
+                        else
+                            memmove(qual, squal, readlen);
+                        break;
+                        
+                    default:
+                        memmove(qual, squal, readlen);
+                        break;
+                    }
+                }
+            }
+        }
+        
+        if (hasCG) {
+            rc = CGDataGetSeqQual(cg, seqDNA, qual);
+            if (rc == 0)
+                rc = CGDataGetCigar(cg, cigBuf.base, cigBuf.elem_count, &opCount);
+            if (rc) {
+                (void)LOGERR(klogErr, rc, "Failed to read CG data");
+                goto LOOP_END;
+            }
+        }
+        if (G->hasTI) {
+            rc = SequenceGetTI(sequence, &ti);
+            if (rc)
+                ti = 0;
+            rc = 0;
+        }
+        data.data.align_group.buffer = alignGroup;
+        if (hasCG && CGDataGetAlignGroup(cg, alignGroup, sizeof(alignGroup), &alignGroupLen) == 0)
+            data.data.align_group.elements = alignGroupLen;
+        else
+            data.data.align_group.elements = 0;
+
+        if (alignment != 0)
+            AR_MAPQ(data) = GetMapQ(alignment);
+        {{
+            char const *rgname;
+            size_t rgnamelen;
+
+            SequenceGetSpotGroup(sequence, &rgname, &rgnamelen);
+            if (rgname)
+            {
+                string_copy(spotGroup, sizeof(spotGroup), rgname, rgnamelen);
+                spotGroup[rgnamelen] = '\0';
+            }
+            else
+                spotGroup[0] = '\0';
+        }}        
+        readOrientation = SequenceGetOrientationSelf(sequence);
+        AR_REF_ORIENT(data) = readOrientation == ReadOrientationReverse;
+        isPrimary = alignment == 0 || ! AlignmentIsSecondary(alignment);
+        if (G->noSecondary && !isPrimary)
+            goto LOOP_END;
+        originally_aligned = (alignment != 0);
+        aligned = originally_aligned && (AR_MAPQ(data) >= G->minMapQual);
+        
+        if (isColorSpace && readlen == 0)   /* detect hard clipped colorspace   */
+            aligned = false;                /* reads and make unaligned         */
+
+        if (aligned && align == NULL) {
+            rc = RC(rcApp, rcFile, rcReading, rcData, rcInconsistent);
+            (void)PLOGERR(klogErr, (klogErr, rc, "File '$(file)' contains aligned records", "file=%s", ReaderFileGetPathname(reader)));
+            goto LOOP_END;
+        }
+        if (header != NULL)
+        {
+            while (aligned) {
+                AlignmentGetPosition(alignment, &rpos);
+                AlignmentGetRefSeqId(alignment, &refSeqId);
+                if (rpos >= 0 && refSeqId >= 0) {
+                    if (refSeqId == skipRefSeqId)
+                        goto LOOP_END;
+                    if (refSeqId == unmapRefSeqId) {
+                        aligned = false;
+                        break;
+                    }
+                    if (refSeqId == lastRefSeqId)
+                        break;
+                    rc = ReferenceInfoGetRefSeq(header, refSeqId, &refSeq);
+                    if (rc != 0) {
+                        rc = RC(rcApp, rcFile, rcReading, rcData, rcInconsistent);
+                        (void)PLOGERR(klogWarn, (klogWarn, rc, "File '$(file)': Spot '$(name)' refers to an unknown Reference number $(refSeqId)", "file=%s,refSeqId=%i,name=%s", ReaderFileGetPathname(reader), (int)refSeqId, name));
+                        rc = CheckLimitAndLogError(G);
+                        goto LOOP_END;
+                    }
+                    else {
+                        bool shouldUnmap = false;
+                        
+                        if (G->refFilter && strcmp(G->refFilter, refSeq.name) != 0) {
+                            (void)PLOGMSG(klogInfo, (klogInfo, "Skipping Reference '$(name)'", "name=%s", refSeq.name));
+                            skipRefSeqId = refSeqId;
+                            goto LOOP_END;
+                        }
+                        
+                        rc = ReferenceSetFile(ref, refSeq.name, refSeq.length, refSeq.checksum, G->maxSeqLen, &shouldUnmap);
+                        if (rc == 0) {
+                            lastRefSeqId = refSeqId;
+                            if (shouldUnmap) {
+                                unmapRefSeqId = refSeqId;
+                                aligned = false;
+                            }
+                            break;
+                        }
+                        if (GetRCObject(rc) == rcConstraint && GetRCState(rc) == rcViolated) {
+                            int const level = G->limit2config ? klogWarn : klogErr;
+                            
+                            (void)PLOGMSG(level, (level, "Could not find a Reference to match { name: '$(name)', length: $(rlen) }", "name=%s,rlen=%u", refSeq.name, (unsigned)refSeq.length));
+                        }
+                        else if (!G->limit2config)
+                            (void)PLOGERR(klogErr, (klogErr, rc, "File '$(file)': Spot '$(sname)' refers to an unknown Reference '$(rname)'", "file=%s,rname=%s,sname=%s", ReaderFileGetPathname(reader), refSeq.name, name));
+                        if (G->limit2config)
+                            rc = 0;
+                        goto LOOP_END;
+                    }
+                }
+                else {
+                    (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' was marked aligned, but reference id = $(id) and reference position = $(pos) are invalid", "name=%.*s,id=%i,pos=%i", namelen, name, refSeqId, rpos));
+                    if ((rc = CheckLimitAndLogError(G)) != 0) goto LOOP_END;
+                }
+
+                aligned = false;
+            }
+        }
+        if (!aligned && (G->refFilter != NULL || G->limit2config))
+            goto LOOP_END;
+        
+        rc = GetKeyID(G, ctx, &keyId, &wasInserted, spotGroup, name, namelen);
+        if (rc) {
+            (void)PLOGERR(klogErr, (klogErr, rc, "KBTreeEntry: failed on key '$(key)'", "key=%.*s", namelen, name));
+            goto LOOP_END;
+        }
+        rc = MMArrayGet(ctx->id2value, (void **)&value, keyId);
+        if (rc) {
+            (void)PLOGERR(klogErr, (klogErr, rc, "MMArrayGet: failed on id '$(id)'", "id=%u", keyId));
+            goto LOOP_END;
+        }
+        
+        AR_KEY(data) = keyId;
+        
+        mated = false;
+        if (SequenceWasPaired(sequence)) {
+            if (SequenceIsFirst(sequence))
+                AR_READNO(data) |= 1;
+            if (SequenceIsSecond(sequence))
+                AR_READNO(data) |= 2;
+            switch (AR_READNO(data)) {
+            case 1:
+            case 2:
+                mated = true;
+                break;
+            case 0:
+                if ((warned & 1) == 0) {
+                    (void)LOGMSG(klogWarn, "Spots without fragment info have been encountered");
+                    warned |= 1;
+                }
+                break;
+            case 3:
+                if ((warned & 2) == 0) {
+                    (void)LOGMSG(klogWarn, "Spots with more than two fragments have been encountered");
+                    warned |= 2;
+                }
+                break;
+            }
+        }
+        if (!mated)
+            AR_READNO(data) = 1;
+        
+        if (wasInserted) {
+            memset(value, 0, sizeof(*value));
+            value->unmated = !mated;
+            value->pcr_dup = SequenceIsDuplicate(sequence);
+            value->platform = GetINSDCPlatform(header, spotGroup);
+            if (value->platform == SRA_PLATFORM_UNDEFINED)
+                value->platform = G->platform;
+        }
+        else {
+            if (!G->acceptBadDups && value->pcr_dup != SequenceIsDuplicate(sequence)) {
+                rc = LogDupConflict(G, name);
+                goto LOOP_END; /* TODO: is this correct? */
+            }
+            value->pcr_dup &= SequenceIsDuplicate(sequence);
+            if (mated && value->unmated) {
+                (void)PLOGERR(klogWarn, (klogWarn, RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+                                         "Spot '$(name)', which was first seen without mate info, now has mate info",
+                                         "name=%s", name));
+                rc = CheckLimitAndLogError(G);
+                goto LOOP_END;
+            }
+            else if (!mated && !value->unmated) {
+                (void)PLOGERR(klogWarn, (klogWarn, RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+                                         "Spot '$(name)', which was first seen with mate info, now has no mate info",
+                                         "name=%s", name));
+                rc = CheckLimitAndLogError(G);
+                goto LOOP_END;
+            }
+        }
+        
+        ++recordsProcessed;
+
+        if (isPrimary) {
+            switch (AR_READNO(data)) {
+            case 1:
+                if (CTX_VALUE_GET_P_ID(*value, 0) != 0)
+                {
+                    isPrimary = false;
+                    if (value->seqHash[0] != SeqHashKey(seqDNA, readlen))
+                    {
+                        (void)PLOGERR(klogWarn, (klogWarn, RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+                                                 "Read 1 of spot '$(name)', possible sequence mismatch", "name=%s", name));
+                        rc = CheckLimitAndLogError(G);
+                        goto LOOP_END;
+                    }
+                }
+                else if (aligned && value->unaligned_1) {
+                    (void)PLOGMSG(klogWarn, (klogWarn, "Read 1 of spot '$(name)', which was unmapped, is now being mapped at position $(pos) on reference '$(ref)'; this alignment will be considered as secondary", "name=%s,ref=%s,pos=%u", name, refSeq.name, rpos));
+                    isPrimary = false;
+                }
+                break;
+            case 2:
+                if (CTX_VALUE_GET_P_ID(*value, 1) != 0)
+                {
+                    isPrimary = false;
+                    if (value->seqHash[1] != SeqHashKey(seqDNA, readlen))
+                    {
+                        (void)PLOGERR(klogWarn, (klogWarn, RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+                                                 "Read 2 of spot '$(name)', possible sequence mismatch", "name=%s", name));
+                        rc = CheckLimitAndLogError(G);
+                        goto LOOP_END;
+                    }
+                }
+                else if (aligned && value->unaligned_2) {
+                    (void)PLOGMSG(klogWarn, (klogWarn, "Read 2 of spot '$(name)', which was unmapped, is now being mapped at position $(pos) on reference '$(ref)'; this alignment will be considered as secondary", "name=%s,ref=%s,pos=%u", name, refSeq.name, rpos));
+                    isPrimary = false;
+                }
+                break;
+            default:
+                break;
+            }
+        }
+        data.isPrimary = isPrimary;
+        if (aligned) {
+            uint32_t matches = 0;
+            
+            /* TODO: get rna orientation from XS:A tag */
+            rc = ReferenceRead(ref, &data, rpos, cigBuf.base, opCount,
+                               seqDNA, readlen, rna_orient,
+                               &matches, G->acceptNoMatch, G->minMatchCount, G->maxSeqLen);
+            if (rc) {
+                aligned = false;
+                
+                if (   (GetRCState(rc) == rcViolated  && GetRCObject(rc) == rcConstraint)
+                    || (GetRCState(rc) == rcExcessive && GetRCObject(rc) == rcRange))
+                {
+                    RecordNoMatch(G, name, refSeq.name, rpos);
+                }
+                if (GetRCState(rc) == rcViolated && GetRCObject(rc) == rcConstraint) {
+                    rc = LogNoMatch(G, name, refSeq.name, (unsigned)rpos, (unsigned)matches);
+                }
+                else if (GetRCObject(rc) == (enum RCObject)rcData && GetRCState(rc) == rcInvalid) {
+                    (void)PLOGERR(klogWarn, (klogWarn, rc, "Spot '$(name)': bad alignment to reference '$(ref)' at $(pos)", "name=%s,ref=%s,pos=%u", name, refSeq.name, rpos));
+                    rc = CheckLimitAndLogError(G);
+                }
+                else if (GetRCObject(rc) == (enum RCObject)rcData) {
+                    (void)PLOGERR(klogWarn, (klogWarn, rc, "Spot '$(name)': bad alignment to reference '$(ref)' at $(pos)", "name=%s,ref=%s,pos=%u", name, refSeq.name, rpos));
+                    rc = CheckLimitAndLogError(G);
+                }
+                else {
+                    (void)PLOGERR(klogWarn, (klogWarn, rc, "Spot '$(name)': error reading reference '$(ref)' at $(pos)", "name=%s,ref=%s,pos=%u", name, refSeq.name, rpos));
+                    rc = CheckLimitAndLogError(G);
+                }
+                if (rc) goto LOOP_END;
+            }
+        }
+        if (isColorSpace) {
+            /* must be after ReferenceRead */
+            SequenceGetCSKey(sequence, &cskey);
+            SequenceGetCSRead(sequence, seqDNA);
+            if (!aligned && !G->useQUAL) {
+                int8_t const *squal;
+                uint8_t qoffset = 0;
+                int qualType=0;                
+                
+                rc = SequenceGetCSQuality(sequence, &squal, &qoffset, &qualType);
+                if (rc) {
+                    (void)PLOGERR(klogErr, (klogErr, rc, "Spot '$(name)': length of colorspace quality does not match sequence", "name=%s", name));
+                    goto LOOP_END;
+                }
+                if (qoffset) {
+                    unsigned i;
+                    
+                    for (i = 0; i < csSeqLen; ++i)
+                        qual[i] = squal[i] - qoffset;
+                }
+                else if (squal != NULL)
+                    memmove(qual, squal, csSeqLen);
+                else
+                    memset(qual, 0, csSeqLen);
+                readlen = csSeqLen;
+            }
+        }
+        
+        if (aligned) {
+            if (G->editAlignedQual ) EditAlignedQualities  (G, qual, AR_HAS_MISMATCH(data), readlen);
+            if (G->keepMismatchQual) EditUnalignedQualities(qual, AR_HAS_MISMATCH(data), readlen);
+
+            if (AR_MISMATCH_QUAL(data) == NULL) {
+                AR_NUM_MISMATCH_QUAL(data) = 0;
+            }
+            else {
+                size_t i;
+                size_t n;
+                bool const *const has_mismatch = AR_HAS_MISMATCH(data);
+                uint8_t *const mismatch = AR_MISMATCH_QUAL(data);
+                
+                for (n = i = 0; i < readlen; ++i) {
+                    if (has_mismatch[i])
+                        mismatch[n++] = qual[i];
+                }
+                AR_NUM_MISMATCH_QUAL(data) = n;
+            }
+        }
+        else if (isPrimary) {
+            switch (AR_READNO(data)) {
+            case 1:
+                value->unaligned_1 = 1;
+                break;
+            case 2:
+                value->unaligned_2 = 1;
+                break;
+            default:
+                break;
+            }
+        }
+        if (isPrimary) {
+            switch (AR_READNO(data)) {
+            case 1:
+                if (CTX_VALUE_GET_P_ID(*value, 0) == 0 && aligned) {
+                    data.alignId = ++ctx->primaryId;
+                    CTX_VALUE_SET_P_ID(*value, 0, data.alignId);
+                }
+                break;
+            case 2:
+                if (CTX_VALUE_GET_P_ID(*value, 1) == 0 && aligned) {
+                    data.alignId = ++ctx->primaryId;
+                    CTX_VALUE_SET_P_ID(*value, 1, data.alignId);
+                }
+                break;
+            default:
+                break;
+            }
+        }
+        if (mated) {
+            if (isPrimary || !originally_aligned) {
+                if (CTX_VALUE_GET_S_ID(*value) != 0) {
+                    (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' has already been assigned a spot id", "name=%.*s", namelen, name));
+                }
+                else if (!value->has_a_read) {
+                    /* new mated fragment - do spot assembly */
+                    unsigned sz;
+                    uint64_t    fragmentId;
+                    FragmentInfo fi;
+                    KMemBank *frags = ctx->fragsBoth;
+                    int32_t mate_refSeqId = -1;
+                    int64_t pnext = 0;
+                    
+                    value->seqHash[AR_READNO(data) - 1] = SeqHashKey(seqDNA, readlen);
+                    
+                    memset(&fi, 0, sizeof(fi));
+                    fi.aligned = aligned;
+                    fi.ti = ti;
+                    fi.orientation = readOrientation;
+                    fi.otherReadNo = AR_READNO(data);
+                    fi.sglen   = strlen(spotGroup);
+                    fi.readlen = readlen;
+                    fi.cskey = cskey;
+                    fi.is_bad = SequenceIsLowQuality(sequence);
+                    sz = sizeof(fi) + 2*fi.readlen + fi.sglen;
+                    if (align && aligned) {
+                        AlignmentGetMateRefSeqId(alignment, &mate_refSeqId);
+                        AlignmentGetMatePosition(alignment, &pnext);
+                    }
+                    rc = KMemBankAlloc(frags, &fragmentId, sz, 0);
+                    value->fragmentId = fragmentId;
+                    if (rc) {
+                        (void)LOGERR(klogErr, rc, "KMemBankAlloc failed");
+                        goto LOOP_END;
+                    }
+                    
+                    rc = KDataBufferResize(&fragBuf, sz);
+                    if (rc) {
+                        (void)LOGERR(klogErr, rc, "Failed to resize fragment buffer");
+                        goto LOOP_END;
+                    }
+                    {{
+                        uint8_t *dst = (uint8_t*) fragBuf.base;
+                        memmove(dst,&fi,sizeof(fi));
+                        dst += sizeof(fi);
+                        COPY_READ((char *)dst, seqDNA, fi.readlen, (isColorSpace && !aligned) ? 0 : fi.orientation == ReadOrientationReverse);
+                        dst += fi.readlen;
+                        COPY_QUAL(dst, qual, fi.readlen, (isColorSpace && !aligned) ? 0 : fi.orientation == ReadOrientationReverse);
+                        dst += fi.readlen;
+                        memmove(dst,spotGroup,fi.sglen);
+                    }}
+                    rc = KMemBankWrite(frags, fragmentId, 0, fragBuf.base, sz, &rsize);
+                    if (rc) {
+                        (void)PLOGERR(klogErr, (klogErr, rc, "KMemBankWrite failed writing fragment $(id)", "id=%u", fragmentId));
+                        goto LOOP_END;
+                    }
+                    value->has_a_read = 1;
+                }
+                else if (value->fragmentId != 0 ) {
+                    /* might be second fragment */
+                    uint64_t sz;
+                    FragmentInfo *fip;
+                    KMemBank *frags = ctx->fragsBoth;
+                    
+                    rc = KMemBankSize(frags, value->fragmentId, &sz);
+                    if (rc) {
+                        (void)PLOGERR(klogErr, (klogErr, rc, "KMemBankSize failed on fragment $(id)", "id=%u", value->fragmentId));
+                        goto LOOP_END;
+                    }
+                    rc = KDataBufferResize(&fragBuf, (size_t)sz);
+                    if (rc) {
+                        (void)PLOGERR(klogErr, (klogErr, rc, "Failed to resize fragment buffer", ""));
+                        goto LOOP_END;
+                    }
+                    rc = KMemBankRead(frags, value->fragmentId, 0, fragBuf.base, sz, &rsize);
+                    if (rc) {
+                        (void)PLOGERR(klogErr, (klogErr, rc, "KMemBankRead failed on fragment $(id)", "id=%u", value->fragmentId));
+                        goto LOOP_END;
+                    }
+                    
+                    assert( rsize == sz );
+                    fip = (FragmentInfo *) fragBuf.base;
+                    if(AR_READNO(data) != fip->otherReadNo) {
+                        /* mate found */
+                        unsigned readLen[2];
+                        unsigned read1 = 0;
+                        unsigned read2 = 1;
+                        uint8_t  *src  = (uint8_t*) fip + sizeof(*fip);
+                        
+                        value->seqHash[AR_READNO(data) - 1] = SeqHashKey(seqDNA, readlen);
+                        
+                        if (AR_READNO(data) < fip->otherReadNo) {
+                            read1 = 1;
+                            read2 = 0;
+                        }
+                        readLen[read1] = fip->readlen;
+                        readLen[read2] = readlen;
+                        rc = SequenceRecordInit(&srec, 2, readLen);
+                        if (rc) {
+                            (void)PLOGERR(klogErr, (klogErr, rc, "Failed resizing sequence record buffer", ""));
+                            goto LOOP_END;
+                        }
+                        srec.ti[read1] = fip->ti;
+                        srec.aligned[read1] = fip->aligned;
+                        srec.is_bad[read1] = fip->is_bad;
+                        srec.orientation[read1] = fip->orientation;
+                        srec.cskey[read1] = fip->cskey;
+                        memmove(srec.seq + srec.readStart[read1], src, fip->readlen);
+                        src += fip->readlen;
+                        memmove(srec.qual + srec.readStart[read1], src, fip->readlen);
+                        src += fip->readlen;
+                        
+                        srec.orientation[read2] = readOrientation;
+                        COPY_READ(srec.seq + srec.readStart[read2], 
+                                  seqDNA, 
+                                  srec.readLen[read2], 
+                                  (isColorSpace && !aligned) ? 0 : srec.orientation[read2] == ReadOrientationReverse);
+                        COPY_QUAL(srec.qual + srec.readStart[read2], 
+                                  qual, 
+                                  srec.readLen[read2],  
+                                  (isColorSpace && !aligned) ? 0 : srec.orientation[read2] == ReadOrientationReverse);
+
+                        srec.keyId = keyId;
+                        srec.is_bad[read2] = SequenceIsLowQuality(sequence);
+                        srec.aligned[read2] = aligned;
+                        srec.cskey[read2] = cskey;
+                        srec.ti[read2] = ti;
+                        
+                        srec.spotGroup = spotGroup;
+                        srec.spotGroupLen = strlen(spotGroup);
+                        if (value->pcr_dup && (srec.is_bad[0] || srec.is_bad[1])) {
+                            filterFlagConflictRecords++;
+                            if (filterFlagConflictRecords < MAX_WARNINGS_FLAG_CONFLICT) {
+                                (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)': both 'duplicate' and 'lowQuality' flag bits set, only 'duplicate' will be saved", "name=%s", name));
+                            }
+                            else if(filterFlagConflictRecords == MAX_WARNINGS_FLAG_CONFLICT) {
+                                (void)PLOGMSG(klogWarn, (klogWarn, "Last reported warning: Spot '$(name)': both 'duplicate' and 'lowQuality' flag bits set, only 'duplicate' will be saved", "name=%s", name));
+                            }
+                        }
+                        rc = SequenceWriteRecord(seq, &srec, isColorSpace, value->pcr_dup, value->platform, 
+                                                G->keepMismatchQual, G->no_real_output, G->hasTI, G->QualQuantizer);
+                        if (rc) {
+                            (void)LOGERR(klogErr, rc, "SequenceWriteRecord failed");
+                            goto LOOP_END;
+                        }
+                        CTX_VALUE_SET_S_ID(*value, ++ctx->spotId);
+                        rc = KMemBankFree(frags, value->fragmentId);
+                        if (rc) {
+                            (void)PLOGERR(klogErr, (klogErr, rc, "KMemBankFree failed on fragment $(id)", "id=%u", value->fragmentId));
+                            goto LOOP_END;
+                        }
+                        value->fragmentId = 0;
+                    }
+                }
+            }
+            if (!isPrimary && aligned) {
+                int32_t bam_mrid;
+                int64_t mpos;
+                int64_t mrid;
+                int64_t tlen;
+                
+                AlignmentGetMatePosition(alignment, &mpos);
+                AlignmentGetMateRefSeqId(alignment, &bam_mrid);
+                AlignmentGetInsertSize(alignment, &tlen);
+                
+                if (mpos >= 0 && bam_mrid >= 0 && tlen != 0 && header != NULL) {
+                    ReferenceSequence mref;
+                    if (ReferenceInfoGetRefSeq(header, bam_mrid, &mref) == 0) {
+                        rc_t rc_temp = ReferenceGet1stRow(ref, &mrid, mref.name);
+                        if (rc_temp == 0) {
+                            data.mate_ref_pos = mpos;
+                            data.template_len = tlen;
+                            data.mate_ref_orientation = (SequenceGetOrientationMate(sequence) == ReadOrientationReverse);
+                        }
+                        else {
+                            (void)PLOGERR(klogWarn, (klogWarn, rc_temp, "Failed to get refID for $(name)", "name=%s", mref.name));
+                            mrid = 0;
+                        }
+                        data.mate_ref_id = mrid;
+                    }
+                }
+            }
+        }
+        else if (CTX_VALUE_GET_S_ID(*value) == 0 && (isPrimary || !originally_aligned)) {
+            /* new unmated fragment - no spot assembly */
+            unsigned readLen[1];
+
+            value->seqHash[0] = SeqHashKey(seqDNA, readlen);
+            
+            readLen[0] = readlen;
+            rc = SequenceRecordInit(&srec, 1, readLen);
+            if (rc) {
+                (void)PLOGERR(klogErr, (klogErr, rc, "Failed resizing sequence record buffer", ""));
+                goto LOOP_END;
+            }
+            srec.ti[0] = ti;
+            srec.aligned[0] = aligned;
+            srec.is_bad[0] = SequenceIsLowQuality(sequence);
+            srec.orientation[0] = readOrientation;
+            srec.cskey[0] = cskey;
+            COPY_READ(srec.seq  + srec.readStart[0], seqDNA, readlen, (isColorSpace && !aligned) ? 0 : srec.orientation[0] == ReadOrientationReverse);
+            COPY_QUAL(srec.qual + srec.readStart[0], qual, readlen, (isColorSpace && !aligned) ? 0 : srec.orientation[0] == ReadOrientationReverse);
+         
+            srec.keyId = keyId;
+            
+            srec.spotGroup = spotGroup;
+            srec.spotGroupLen = strlen(spotGroup);
+            if (value->pcr_dup && srec.is_bad[0]) {
+                filterFlagConflictRecords++;
+                if (filterFlagConflictRecords < MAX_WARNINGS_FLAG_CONFLICT) {
+                    (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)': both 'duplicate' and 'lowQuality' flag bits set, only 'duplicate' will be saved", "name=%s", name));
+                }
+                else if (filterFlagConflictRecords == MAX_WARNINGS_FLAG_CONFLICT) {
+                    (void)PLOGMSG(klogWarn, (klogWarn, "Last reported warning: Spot '$(name)': both 'duplicate' and 'lowQuality' flag bits set, only 'duplicate' will be saved", "name=%s", name));
+                }
+            }
+            
+            srec.spotName = (char*)name;
+            srec.spotNameLen = namelen;
+            
+            rc = SequenceWriteRecord(seq, &srec, isColorSpace, value->pcr_dup, value->platform, 
+                                                G->keepMismatchQual, G->no_real_output, G->hasTI, G->QualQuantizer);
+            if (rc) {
+                (void)PLOGERR(klogErr, (klogErr, rc, "SequenceWriteRecord failed", ""));
+                goto LOOP_END;
+            }
+            CTX_VALUE_SET_S_ID(*value, ++ctx->spotId);
+            value->fragmentId = 0;
+        }
+        
+        if (aligned) {
+            if (value->alignmentCount[AR_READNO(data) - 1] < 254)
+                ++value->alignmentCount[AR_READNO(data) - 1];
+            ++ctx->alignCount;
+            
+            assert(keyId >> 32 < ctx->key2id_count);
+            assert((uint32_t)keyId < ctx->idCount[keyId >> 32]);
+            
+            rc = AlignmentWriteRecord(align, &data, G->expectUnsorted);
+            if (rc == 0) {
+                if (!isPrimary)
+                    data.alignId = ++ctx->secondId;
+                
+                rc = ReferenceAddAlignId(ref, data.alignId, isPrimary);
+                if (rc) {
+                    (void)PLOGERR(klogErr, (klogErr, rc, "ReferenceAddAlignId failed", ""));
+                }
+                else {
+                    *had_alignments = true;
+                }
+            }
+            else {
+                (void)PLOGERR(klogErr, (klogErr, rc, "AlignmentWriteRecord failed", ""));
+            }
+        }
+        /**************************************************************/
+        
+    LOOP_END:
+        RecordRelease(record);
+        if (sequence != NULL)
+            SequenceRelease(sequence);
+        if (alignment != NULL)
+            AlignmentRelease(alignment);
+        if (cg != NULL)
+            CGDataRelease(cg);
+        
+        ++reccount;
+        if (G->maxAlignCount > 0 && reccount >= G->maxAlignCount)
+            break;
+        if (rc == 0)
+            *had_sequences = true;
+    }
+    
+    if (header != NULL)
+        ReferenceInfoRelease(header);
+    
+    if (filterFlagConflictRecords > 0) {
+        (void)PLOGMSG(klogWarn, (klogWarn, "$(cnt1) out of $(cnt2) records contained warning : both 'duplicate' and 'lowQuality' flag bits set, only 'duplicate' will be saved", "cnt1=%lu,cnt2=%lu", filterFlagConflictRecords,recordsProcessed));
+    }
+    if (rc == 0 && recordsProcessed == 0) {
+        (void)LOGMSG(klogWarn, (G->limit2config || G->refFilter != NULL) ? 
+                     "All records from the file were filtered out" :
+                     "The file contained no records that were processed.");
+        rc = RC(rcAlign, rcFile, rcReading, rcData, rcEmpty);
+    }
+    if (rc == 0 && reccount > 0) {
+        double percentage = ((double)G->errCount) / reccount; 
+        double allowed = G->maxErrPct/ 100.0;
+        if (percentage > allowed) {
+            rc = RC(rcExe, rcTable, rcClosing, rcData, rcInvalid);
+            (void)PLOGERR(klogErr, 
+                            (klogErr, rc,
+                             "Too many bad records: "
+                                 "records: $(records), bad records: $(bad_records), "
+                                 "bad records percentage: $(percentage), "
+                                 "allowed percentage: $(allowed)",
+                             "records=%lu,bad_records=%lu,percentage=%.2f,allowed=%.2f",
+                             reccount, G->errCount, percentage, allowed));
+        }
+    }
+
+    KDataBufferWhack(&buf);
+    KDataBufferWhack(&fragBuf);
+    KDataBufferWhack(&srec.storage);
+    KDataBufferWhack(&cigBuf);
+    KDataBufferWhack(&data.buffer);
+    return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * CommonWriter
+ */
+ 
+rc_t CommonWriterInit(CommonWriter* self, struct VDBManager *mgr, struct VDatabase *db, const CommonWriterSettings* G)
+{
+    rc_t rc; 
+    assert(self);
+    assert(mgr);
+    assert(db);
+    
+    memset(self, 0, sizeof(*self));
+    if (G)
+        self->settings = *G;
+
+    self->ref = malloc(sizeof(*self->ref));
+    if (self->ref == 0)
+        return RC(rcAlign, rcArc, rcAllocating, rcMemory, rcExhausted);
+        
+    rc = ReferenceInit(self->ref, 
+                       mgr, 
+                       db, 
+                       self->settings.expectUnsorted, 
+                       self->settings.acceptHardClip, 
+                       self->settings.refXRefPath, 
+                       self->settings.inpath, 
+                       self->settings.maxSeqLen, 
+                       self->settings.refFiles);
+    if (rc == 0)
+    {
+        self->seq = malloc(sizeof(*self->seq));
+        if (self->seq == 0)
+        {
+            ReferenceWhack(self->ref, false, 0, NULL);
+            free(self->ref);
+            return RC(rcAlign, rcArc, rcAllocating, rcMemory, rcExhausted);
+        }
+        SequenceWriterInit(self->seq, db);
+        
+        self->align = AlignmentMake(db);
+        if (self->align == 0)
+        {
+            ReferenceWhack(self->ref, false, 0, NULL);
+            free(self->ref);
+            
+            SequenceWhack(self->seq, false);
+            free(self->seq);
+            
+            return RC(rcAlign, rcArc, rcAllocating, rcMemory, rcExhausted);
+        }
+        
+        rc = SetupContext(&self->settings, &self->ctx);
+        if (rc != 0)
+        {
+            ReferenceWhack(self->ref, false, 0, NULL);
+            free(self->ref);
+            
+            SequenceWhack(self->seq, false);
+            free(self->seq);
+            
+            AlignmentWhack(self->align, false);
+        }
+    }
+    if (self->settings.tmpfs == NULL)
+        self->settings.tmpfs = "/tmp";
+
+    self->commit = true;
+    
+    return rc;
+}
+
+rc_t CommonWriterArchive(CommonWriter *const self,
+                         const struct ReaderFile *const reader)
+{
+    rc_t rc;
+
+    assert(self);
+    rc = ArchiveFile(reader,
+                     &self->settings,
+                     &self->ctx,
+                     self->ref,
+                     self->seq,
+                     self->align,
+                     &self->had_alignments,
+                     &self->had_sequences);
+    if (rc)
+        self->commit = false;
+    
+    self->err_count += self->settings.errCount;
+    return rc;
+}
+
+rc_t CommonWriterComplete(CommonWriter* self, bool quitting, uint64_t maxDistance)
+{
+    rc_t rc=0;
+    /*** No longer need memory for key2id ***/
+    size_t i;
+    for (i = 0; i != self->ctx.key2id_count; ++i) {
+        KBTreeDropBacking(self->ctx.key2id[i]);
+        KBTreeRelease(self->ctx.key2id[i]);
+        self->ctx.key2id[i] = NULL;
+    }
+    free(self->ctx.key2id_names);
+    self->ctx.key2id_names = NULL;
+    /*******************/
+
+    if (self->had_sequences) {
+        if (!quitting) {
+            (void)LOGMSG(klogInfo, "Writing unpaired sequences");
+            rc = WriteSoloFragments(&self->settings, &self->ctx, self->seq);
+            ContextReleaseMemBank(&self->ctx);
+            if (rc == 0) {
+                rc = SequenceDoneWriting(self->seq);
+                if (rc == 0) {
+                    (void)LOGMSG(klogInfo, "Updating sequence alignment info");
+                    rc = SequenceUpdateAlignInfo(&self->ctx, self->seq);
+                }
+            }
+        }
+        else
+            ContextReleaseMemBank(&self->ctx);
+    }
+    
+    if (self->had_alignments && !quitting) {
+        (void)LOGMSG(klogInfo, "Writing alignment spot ids");
+        rc = AlignmentUpdateSpotInfo(&self->ctx, self->align, maxDistance);
+    }
+
+    return rc;
+}
+
+rc_t CommonWriterWhack(CommonWriter* self)
+{
+    rc_t rc = 0;
+    assert(self);
+    
+    ContextRelease(&self->ctx);
+    
+    if (self->align)
+        rc = AlignmentWhack(self->align, self->commit);
+        
+    if (self->seq)
+    {
+        SequenceWhack(self->seq, self->commit);
+        free(self->seq);
+    }
+
+    if (self->ref)
+    {
+        rc_t rc2 = ReferenceWhack(self->ref, self->commit, self->settings.maxSeqLen, Quitting);
+        if (rc == 0)
+            rc = rc2;
+        free(self->ref);
+    }
+
+    return rc;
+}
+
diff --git a/libs/loader/mmarray.c b/libs/loader/mmarray.c
new file mode 100644
index 0000000..9a62fd2
--- /dev/null
+++ b/libs/loader/mmarray.c
@@ -0,0 +1,131 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <loader/mmarray.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+
+#include <klib/rc.h>
+
+#include <kfs/mmap.h>
+#include <kfs/file.h>
+
+#define MMA_NUM_CHUNKS_BITS (24u)
+#define MMA_NUM_SUBCHUNKS_BITS ((32u)-(MMA_NUM_CHUNKS_BITS))
+#define MMA_SUBCHUNK_SIZE (1u << MMA_NUM_CHUNKS_BITS)
+#define MMA_SUBCHUNK_COUNT (1u << MMA_NUM_SUBCHUNKS_BITS)
+
+typedef struct MMArray {
+    KFile *fp;
+    size_t elemSize;
+    uint64_t fsize;
+    struct mma_map_s {
+        struct mma_submap_s {
+            uint8_t *base;
+            KMMap *mmap;
+        } submap[MMA_SUBCHUNK_COUNT];
+    } map[NUM_ID_SPACES];
+} MMArray;
+
+rc_t MMArrayMake(struct MMArray **rslt, KFile *fp, uint32_t elemSize)
+{
+    MMArray *const self = calloc(1, sizeof(*self));
+
+    if (self == NULL)
+        return RC(rcExe, rcMemMap, rcConstructing, rcMemory, rcExhausted);
+    self->elemSize = (elemSize + 3) & ~(3u); /** align to 4 byte **/
+    self->fp = fp;
+    KFileAddRef(fp);
+    *rslt = self;
+    return 0;
+}
+
+#define PERF 0
+
+rc_t MMArrayGet(struct MMArray *const self, void **const value, uint64_t const element)
+{
+    unsigned const bin_no = element >> 32;
+    unsigned const subbin = ((uint32_t)element) >> MMA_NUM_CHUNKS_BITS;
+    unsigned const in_bin = (uint32_t)element & (MMA_SUBCHUNK_SIZE - 1);
+
+    if (bin_no >= sizeof(self->map)/sizeof(self->map[0]))
+        return RC(rcExe, rcMemMap, rcConstructing, rcId, rcExcessive);
+    
+    if (self->map[bin_no].submap[subbin].base == NULL) {
+        size_t const chunk = MMA_SUBCHUNK_SIZE * self->elemSize;
+        size_t const fsize = self->fsize + chunk;
+        rc_t rc = KFileSetSize(self->fp, fsize);
+        
+        if (rc == 0) {
+            KMMap *mmap;
+            
+            self->fsize = fsize;
+            rc = KMMapMakeRgnUpdate(&mmap, self->fp, self->fsize, chunk);
+            if (rc == 0) {
+                void *base;
+                
+                rc = KMMapAddrUpdate(mmap, &base);
+                if (rc == 0) {
+#if PERF
+                    static unsigned mapcount = 0;
+
+                    (void)PLOGMSG(klogInfo, (klogInfo, "Number of mmaps: $(cnt)", "cnt=%u", ++mapcount));
+#endif
+                    self->map[bin_no].submap[subbin].mmap = mmap;
+                    self->map[bin_no].submap[subbin].base = base;
+
+                    goto GET_MAP;
+                }
+                KMMapRelease(mmap);
+            }
+        }
+        return rc;
+    }
+GET_MAP:
+    *value = &self->map[bin_no].submap[subbin].base[(size_t)in_bin * self->elemSize];
+    return 0;
+}
+
+void MMArrayWhack(struct MMArray *self)
+{
+    unsigned i;
+
+    for (i = 0; i != sizeof(self->map)/sizeof(self->map[0]); ++i) {
+        unsigned j;
+        
+        for (j = 0; j != sizeof(self->map[0].submap)/sizeof(self->map[0].submap[0]); ++j) {
+            if (self->map[i].submap[j].mmap)
+                KMMapRelease(self->map[i].submap[j].mmap);
+            self->map[i].submap[j].mmap = NULL;
+            self->map[i].submap[j].base = NULL;
+        }
+    }
+    KFileRelease(self->fp);
+    free(self);
+}
+
+
diff --git a/libs/loader/reference-writer.c b/libs/loader/reference-writer.c
new file mode 100644
index 0000000..5fe517b
--- /dev/null
+++ b/libs/loader/reference-writer.c
@@ -0,0 +1,483 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <kfs/file.h>
+
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <align/writer-refseq.h>
+
+#include <loader/reference-writer.h>
+
+#include <stdlib.h>
+#include <limits.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+
+#define SORTED_OPEN_TABLE_LIMIT (2)
+#define SORTED_CACHE_SIZE ((2 * 1024 * 1024)/(SORTED_OPEN_TABLE_LIMIT))
+
+#ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
+#define UNSORTED_OPEN_TABLE_LIMIT (8)
+#define UNSORTED_CACHE_SIZE ((1024 * 1024 * 1024)/(UNSORTED_OPEN_TABLE_LIMIT))
+#else
+#define UNSORTED_OPEN_TABLE_LIMIT (64)
+#define UNSORTED_CACHE_SIZE (350 * 1024 * 1024)
+#endif
+
+#if _DEBUGGING
+#define DUMP_CONFIG 1
+#endif
+
+struct overlap_s {
+    uint32_t min; /* minimum start pos of any alignment that ends in this chunk */
+    uint32_t max; /* maximum end pos of any alignment that starts before this chunk and ends in this chunk */
+};
+
+extern void ReferenceMgr_DumpConfig(ReferenceMgr const *const self);
+
+rc_t ReferenceInit(Reference *self, 
+                   const VDBManager *mgr, 
+                   VDatabase *db, 
+                   bool expectUnsorted,
+                   bool acceptHardClip,
+                   char const *refXRefPath,
+                   char const *inpath,
+                   uint32_t maxSeqLen,
+                   char const** refFiles
+                   )
+{
+    rc_t rc;
+    size_t const cache = expectUnsorted ? UNSORTED_CACHE_SIZE : SORTED_CACHE_SIZE;
+    unsigned const open_count = expectUnsorted ? UNSORTED_OPEN_TABLE_LIMIT : SORTED_OPEN_TABLE_LIMIT;
+    
+    memset(self, 0, sizeof(*self));
+    
+    self->coverage.elem_bits = self->mismatches.elem_bits = self->indels.elem_bits = 32;
+    self->pri_align.elem_bits = self->sec_align.elem_bits = 64;
+    self->pri_overlap.elem_bits = self->sec_overlap.elem_bits = sizeof(struct overlap_s) * 8;
+    
+    self->acceptHardClip = acceptHardClip;
+    
+    rc = ReferenceMgr_Make(&self->mgr, db, mgr, 
+                           ewrefmgr_co_Coverage,
+                           refXRefPath, inpath,
+                           maxSeqLen, cache, open_count);
+    if (rc == 0 && refFiles != NULL) {
+        unsigned i;
+        
+        for (i = 0; refFiles[i]; ++i) {
+            rc = ReferenceMgr_FastaPath(self->mgr, refFiles[i]);
+            if (rc) {
+                (void)PLOGERR(klogWarn, (klogWarn, rc, "fasta file '$(file)'", "file=%s", refFiles[i]));
+                break;
+            }
+        }
+#if DUMP_CONFIG
+        if (rc == 0) {
+            ReferenceMgr_DumpConfig(self->mgr);
+        }
+#endif
+    }
+    return rc;
+}
+
+static
+void Unsorted(Reference *self) {
+    bool dummy1 = false;
+    bool dummy2 = false;
+    
+    (void)LOGMSG(klogWarn, "Alignments are unsorted");
+    
+    self->out_of_order = true;
+    
+    ReferenceSeq_Release(self->rseq);
+    ReferenceMgr_SetCache(self->mgr, UNSORTED_CACHE_SIZE, UNSORTED_OPEN_TABLE_LIMIT);
+    ReferenceMgr_GetSeq(self->mgr, &self->rseq, self->last_id, &dummy1, true, &dummy2);
+    
+    KDataBufferWhack(&self->sec_align);
+    KDataBufferWhack(&self->pri_align);
+    KDataBufferWhack(&self->mismatches);
+    KDataBufferWhack(&self->indels);
+    KDataBufferWhack(&self->coverage);
+    KDataBufferWhack(&self->pri_overlap);
+    KDataBufferWhack(&self->sec_overlap);
+}
+
+#define BAIL_ON_FAIL(STMT) do { rc_t const rc__ = (STMT); if (rc__) return rc__; } while(0)
+
+static rc_t FlushBuffers(Reference *self, uint64_t upto, bool full, bool final, uint32_t maxSeqLen)
+{
+    if (!self->out_of_order && upto > 0) {
+        size_t offset = 0;
+        unsigned *const miss = (unsigned *)self->mismatches.base;
+        unsigned *const indel = (unsigned *)self->indels.base;
+        unsigned *const cov = (unsigned *)self->coverage.base;
+        struct overlap_s *const pri_overlap = (struct overlap_s *)self->pri_overlap.base;
+        struct overlap_s *const sec_overlap = (struct overlap_s *)self->sec_overlap.base;
+        unsigned chunk = 0;
+        
+        while ((self->curPos + offset + (full ? 0 : maxSeqLen)) <= upto) {
+            ReferenceSeqCoverage data;
+            uint64_t const curPos = self->curPos + offset;
+            unsigned const n = self->endPos > (curPos + maxSeqLen) ?
+                               maxSeqLen : (self->endPos - curPos);
+            unsigned const m = curPos + n > upto ? upto - curPos : n;
+            unsigned i;
+            unsigned hi;
+            unsigned lo;
+            
+            if (n == 0) break;
+            
+            memset(&data, 0, sizeof(data));
+            
+            data.ids[ewrefcov_primary_table].elements = self->pri_align.elem_count;
+            data.ids[ewrefcov_primary_table].buffer = self->pri_align.base;
+            data.overlap_ref_pos[ewrefcov_primary_table] = pri_overlap[chunk].min;
+            data.overlap_ref_len[ewrefcov_primary_table] = pri_overlap[chunk].max ? pri_overlap[chunk].max - curPos : 0;
+            
+            data.ids[ewrefcov_secondary_table].elements = self->sec_align.elem_count;
+            data.ids[ewrefcov_secondary_table].buffer = self->sec_align.base;
+            data.overlap_ref_pos[ewrefcov_secondary_table] = sec_overlap[chunk].min;
+            data.overlap_ref_len[ewrefcov_secondary_table] = sec_overlap[chunk].max ? sec_overlap[chunk].max - curPos : 0;
+            
+            for (hi = 0, lo = UINT_MAX, i = 0; i != m; ++i) {
+                unsigned const coverage = cov[offset + i];
+                
+                if (hi < coverage)
+                    hi = coverage;
+                if (lo > coverage)
+                    lo = coverage;
+            }
+            data.low  = lo > 255 ? 255 : lo;
+            data.high = hi > 255 ? 255 : hi;
+            
+            for (i = 0; i != m; ++i)
+                data.mismatches += miss[offset + i];
+
+            for (i = 0; i != m; ++i)
+                data.indels += indel[offset + i];
+            
+            {
+                rc_t rc = ReferenceSeq_AddCoverage(self->rseq, curPos, &data);
+                
+                if (rc) {
+                    Unsorted(self);
+                    return 0;
+                }
+            }
+            
+            KDataBufferResize(&self->pri_align, 0);
+            KDataBufferResize(&self->sec_align, 0);
+            offset += n;
+            ++chunk;
+        }
+        if (!final && offset > 0) {
+            unsigned const newChunkCount = self->pri_overlap.elem_count - chunk;
+            unsigned const newBaseCount = self->endPos - self->curPos - offset;
+            
+            memmove(self->pri_overlap.base, pri_overlap + chunk, newChunkCount * sizeof(pri_overlap[0]));
+            memmove(self->sec_overlap.base, sec_overlap + chunk, newChunkCount * sizeof(sec_overlap[0]));
+            memmove(self->mismatches.base, miss + offset, newBaseCount * sizeof(miss[0]));
+            memmove(self->indels.base, indel + offset, newBaseCount * sizeof(indel[0]));
+            memmove(self->coverage.base, cov + offset, newBaseCount * sizeof(cov[0]));
+
+            KDataBufferResize(&self->pri_overlap, newChunkCount);
+            KDataBufferResize(&self->sec_overlap, newChunkCount);
+            
+            self->curPos += offset;
+        }
+    }
+    return 0;
+}
+
+rc_t ReferenceSetFile(Reference *self, const char id[],
+                      uint64_t length, uint8_t const md5[16],
+                      uint32_t maxSeqLen, bool *shouldUnmap)
+{
+    ReferenceSeq const *rseq;
+    bool wasRenamed = false;
+    unsigned n;
+    
+    for (n = 0; ; ++n) {
+        if (self->last_id[n] != id[n])
+            break;
+        if (self->last_id[n] == 0 && id[n] == 0)
+            return 0;
+    }
+    while (id[n])
+        ++n;
+    if (n >= sizeof(self->last_id))
+        return RC(rcApp, rcTable, rcAccessing, rcParam, rcTooLong);
+    
+    BAIL_ON_FAIL(FlushBuffers(self, self->length, true, true, maxSeqLen));
+    BAIL_ON_FAIL(ReferenceMgr_GetSeq(self->mgr, &rseq, id, shouldUnmap, true, &wasRenamed));
+
+    if (self->rseq)
+        ReferenceSeq_Release(self->rseq);
+
+    self->rseq = rseq;
+    
+    memmove(self->last_id, id, n + 1);
+    self->curPos = self->endPos = 0;
+    self->length = length;
+    self->lastOffset = 0;
+
+    if(!self->out_of_order) (void)PLOGMSG(klogInfo, (klogInfo, "Processing Reference '$(id)'", "id=%s", id));
+    
+    return 0;
+}
+
+rc_t ReferenceVerify(Reference const *self, char const id[], uint64_t length, uint8_t const md5[16])
+{
+    bool dummy = false;
+    return ReferenceMgr_Verify(self->mgr, id, length, md5, true, &dummy);
+}
+
+rc_t ReferenceGet1stRow(Reference const *self, int64_t *refID, char const refName[])
+{
+    ReferenceSeq const *rseq;
+    bool shouldUnmap = false;
+    bool wasRenamed = false;
+    rc_t rc = ReferenceMgr_GetSeq(self->mgr, &rseq, refName, &shouldUnmap, true, &wasRenamed);
+    if (rc == 0) {
+        assert(shouldUnmap == false);
+        rc = ReferenceSeq_Get1stRow(rseq, refID);
+        ReferenceSeq_Release(rseq);
+    }
+    return rc;
+}
+
+static
+rc_t ReferenceAddCoverage(Reference *const self,
+                          unsigned const refStart,
+                          unsigned const refLength,
+                          uint32_t const mismatches,
+                          uint32_t const indels,
+                          bool const isPrimary,
+                          uint32_t maxSeqLen
+                          )
+{
+    unsigned const refEnd = refStart + refLength;
+    
+    if (refEnd > self->endPos) {
+        unsigned const t1 = refEnd + (maxSeqLen - 1);
+        unsigned const adjust = t1 % maxSeqLen;
+        unsigned const newEndPos = t1 - adjust;
+        unsigned const baseCount = self->endPos - self->curPos;
+        unsigned const newBaseCount = newEndPos - self->curPos;
+        
+        BAIL_ON_FAIL(KDataBufferResize(&self->coverage, newBaseCount));
+        BAIL_ON_FAIL(KDataBufferResize(&self->mismatches, newBaseCount));
+        BAIL_ON_FAIL(KDataBufferResize(&self->indels, newBaseCount));
+        
+        memset(&((unsigned *)self->coverage.base)[baseCount], 0, (newBaseCount - baseCount) * sizeof(unsigned));
+        memset(&((unsigned *)self->mismatches.base)[baseCount], 0, (newBaseCount - baseCount) * sizeof(unsigned));
+        memset(&((unsigned *)self->indels.base)[baseCount], 0, (newBaseCount - baseCount) * sizeof(unsigned));
+        self->endPos = newEndPos;
+    }
+    if ((refEnd - self->curPos) / maxSeqLen >= self->pri_overlap.elem_count) {
+        unsigned const chunks = (refEnd - self->curPos) / maxSeqLen + 1;
+        unsigned const end = self->pri_overlap.elem_count;
+        
+        BAIL_ON_FAIL(KDataBufferResize(&self->pri_overlap, chunks));
+        BAIL_ON_FAIL(KDataBufferResize(&self->sec_overlap, chunks));
+        
+        memset(&((struct overlap_s *)self->pri_overlap.base)[end], 0, (chunks - end) * sizeof(struct overlap_s));
+        memset(&((struct overlap_s *)self->sec_overlap.base)[end], 0, (chunks - end) * sizeof(struct overlap_s));
+    }
+    BAIL_ON_FAIL(FlushBuffers(self, refStart, false, false, maxSeqLen));
+    if (!self->out_of_order) {
+        unsigned const startBase = refStart - self->curPos;
+        unsigned const endChunk = (startBase + refLength) / maxSeqLen;
+        KDataBuffer *const overlapBuffer = isPrimary ? &self->pri_overlap : &self->sec_overlap;
+        unsigned *const cov = &((unsigned *)self->coverage.base)[startBase];
+        unsigned i;
+        
+        ((unsigned *)self->mismatches.base)[startBase] += mismatches;
+        ((unsigned *)self->indels.base)[startBase] += indels;
+        
+        if (((struct overlap_s *)overlapBuffer->base)[endChunk].min == 0 || 
+            ((struct overlap_s *)overlapBuffer->base)[endChunk].min > refStart)
+        {
+            ((struct overlap_s *)overlapBuffer->base)[endChunk].min = refStart;
+        }
+        if (endChunk != 0 &&
+            ((struct overlap_s *)overlapBuffer->base)[endChunk].max < refStart + refLength)
+        {
+            ((struct overlap_s *)overlapBuffer->base)[endChunk].max = refStart + refLength;
+        }
+        
+        for (i = 0; i != refLength; ++i) {
+            if (cov[i] < UINT_MAX)
+                ++cov[i];
+        }
+    }
+    return 0;
+}
+
+static void GetCounts(AlignmentRecord const *data, unsigned const seqLen,
+                      unsigned *const nMatch,
+                      unsigned *const nMiss,
+                      unsigned *const nIndels)
+{
+    bool const *const has_mismatch = data->data.has_mismatch.buffer;
+    bool const *const has_offset = data->data.has_ref_offset.buffer;
+    int32_t const *const ref_offset = data->data.ref_offset.buffer;
+    uint8_t const *const ref_offset_type = data->data.ref_offset_type.buffer;
+    unsigned misses = 0;
+    unsigned matchs = 0;
+    unsigned insert = 0;
+    unsigned delete = 0;
+    unsigned j = 0;
+    unsigned i;
+    
+    for (i = 0; i < seqLen; ) {
+        if (has_offset[i]) {
+            int const offs = ref_offset[j];
+            int const type = ref_offset_type[j];
+            
+            ++j;
+            if (type == 0) {
+                if (offs < 0)
+                    ++insert;
+                else
+                    ++delete;
+            }
+            if (offs < 0) {
+                i += (unsigned)(-offs);
+                continue;
+            }
+        }
+        if (has_mismatch[i])
+            ++misses;
+        else
+            ++matchs;
+        ++i;
+    }
+    *nMatch = matchs;
+    *nMiss  = misses;
+    *nIndels = insert + delete;
+}
+
+rc_t ReferenceRead(Reference *self, AlignmentRecord *data,
+                   uint64_t const pos,
+                   uint32_t const rawCigar[], uint32_t const cigCount,
+                   char const seqDNA[], uint32_t const seqLen,
+                   uint8_t const rna_orient, uint32_t *matches,
+                   bool acceptNoMatch, unsigned minMatchCount, uint32_t maxSeqLen)
+{
+    *matches = 0;
+    BAIL_ON_FAIL(ReferenceSeq_Compress(self->rseq, 
+                                       (self->acceptHardClip ? ewrefmgr_co_AcceptHardClip : 0) + ewrefmgr_cmp_Binary, 
+                                       pos,
+                                       seqDNA, seqLen, rawCigar, cigCount, 0, NULL, 0, 0, NULL, 0, rna_orient, &data->data));
+
+    if (!acceptNoMatch && data->data.ref_len == 0)
+        return RC(rcApp, rcFile, rcReading, rcConstraint, rcViolated);
+    
+    if (!self->out_of_order && pos < self->lastOffset) {
+        Unsorted(self);
+    }
+    if (self->out_of_order)
+        return 0;
+    else {
+        unsigned nmis;
+        unsigned nmatch;
+        unsigned indels;
+
+        self->lastOffset = data->data.effective_offset;
+        GetCounts(data, seqLen, &nmatch, &nmis, &indels);
+        *matches = nmatch;
+        
+        if (acceptNoMatch || nmatch >= minMatchCount)
+            return ReferenceAddCoverage(self, data->data.effective_offset,
+                                        data->data.ref_len, nmis, indels,
+                                        data->isPrimary, maxSeqLen);
+        else
+            return RC(rcApp, rcFile, rcReading, rcConstraint, rcViolated);
+    }
+}
+
+static rc_t IdVecAppend(KDataBuffer *vec, uint64_t id)
+{
+    uint64_t const end = vec->elem_count;
+    
+    BAIL_ON_FAIL(KDataBufferResize(vec, end + 1));
+    ((uint64_t *)vec->base)[end] = id;
+    return 0;
+}
+
+rc_t ReferenceAddAlignId(Reference *self,
+                         int64_t align_id,
+                         bool is_primary
+                         )
+{
+    if (self->out_of_order)
+        return 0;
+    return IdVecAppend(is_primary ? &self->pri_align : &self->sec_align, align_id);
+}
+
+rc_t ReferenceWhack(Reference *self, bool commit, uint32_t maxSeqLen,
+                    rc_t (*const quitting)(void)
+                    )
+{
+    rc_t rc = 0;
+    
+    if (self) {
+#if DUMP_CONFIG
+        if (self->mgr)
+            ReferenceMgr_DumpConfig(self->mgr);
+#endif
+        if (commit) {
+            rc = FlushBuffers(self, self->length, true, true, maxSeqLen);
+            if (rc != 0)
+                commit = false;
+        }
+        KDataBufferWhack(&self->sec_align);
+        KDataBufferWhack(&self->pri_align);
+        KDataBufferWhack(&self->mismatches);
+        KDataBufferWhack(&self->indels);
+        KDataBufferWhack(&self->coverage);
+        KDataBufferWhack(&self->pri_overlap);
+        KDataBufferWhack(&self->sec_overlap);
+        if (self->rseq)
+            rc = ReferenceSeq_Release(self->rseq);
+        if (self->out_of_order) {
+            (void)LOGMSG(klogInfo, "Starting coverage calculation");
+            rc = ReferenceMgr_Release(self->mgr, commit, NULL, true, quitting);
+        }
+        else {
+            rc = ReferenceMgr_Release(self->mgr, commit, NULL, false, NULL);
+        }
+    }
+    return rc;
+}
diff --git a/libs/loader/sequence-writer.c b/libs/loader/sequence-writer.c
new file mode 100644
index 0000000..a646059
--- /dev/null
+++ b/libs/loader/sequence-writer.c
@@ -0,0 +1,366 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <vdb/database.h>
+
+#include <kdb/manager.h>
+
+#include <insdc/sra.h>
+#include <insdc/insdc.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include <align/writer-sequence.h>
+
+#include <loader/sequence-writer.h>
+#include <loader/common-reader.h>
+
+/* MARK: SequenceWriter Object */
+
+SequenceWriter *SequenceWriterInit(SequenceWriter *self, VDatabase *db) {
+    memset(self, 0, sizeof(*self));
+    self->db = db;
+    VDatabaseAddRef(db);
+    return self;
+}
+
+rc_t SequenceWriteRecord(SequenceWriter *self,
+                         SequenceRecord const *rec,
+                         bool color,
+                         bool isDup,
+                         INSDC_SRA_platform_id platform,
+                         bool keepMismatchQual,
+                         bool no_real_output,
+                         bool hasTI,
+                         char const *QualQuantizer
+                         )
+{
+    rc_t rc = 0;
+    uint8_t nreads = rec->numreads;
+    unsigned i;
+    unsigned seqLen;
+    int64_t dummyRowId;
+    
+    uint8_t readInfo[4096];
+    void *h_readInfo = NULL;
+    
+    INSDC_coord_zero *readStart = (void *)readInfo;
+    INSDC_coord_len *readLen;
+    uint8_t *alcnt;
+    INSDC_SRA_xread_type *readType;
+    INSDC_SRA_read_filter *readFilter;
+    bool *mask = NULL;
+    size_t const elemSize = sizeof(alcnt[0]) + sizeof(readType[0])
+                          + sizeof(readStart[0]) + sizeof(readLen[0])
+                          + sizeof(readFilter[0]);
+    
+    TableWriterSeqData data;
+
+    for (i = seqLen = 0; i != nreads; ++i) {
+        seqLen += rec->readLen[i];
+    }
+    
+    if (nreads * elemSize + keepMismatchQual * seqLen * sizeof(mask[0]) > sizeof(readInfo))
+    {
+        h_readInfo = malloc(nreads * elemSize + keepMismatchQual * seqLen * sizeof(mask[0]));
+        if (h_readInfo == NULL)
+            return RC(rcAlign, rcTable, rcWriting, rcMemory, rcExhausted);
+        readStart = h_readInfo;
+    }
+    readLen = (INSDC_coord_len *)&readStart[nreads];
+    alcnt = (uint8_t *)&readLen[nreads];
+    readType = (INSDC_SRA_xread_type *)&alcnt[nreads];
+    readFilter = (INSDC_SRA_read_filter *)&readType[nreads];
+    
+    if (keepMismatchQual) {
+        mask = (bool *)&readFilter[nreads];
+        
+        for (i = 0; i != seqLen; ++i) {
+            mask[i] = (rec->qual[i] & 0x80) != 0;
+        }
+    }
+    
+    for (i = 0; i != nreads; ++i) {
+        alcnt[i] = rec->aligned[i] ? 1 : 0;
+        readLen[i] = rec->readLen[i];
+        readStart[i] = rec->readStart[i];
+        readType[i] = readLen[i] ? SRA_READ_TYPE_BIOLOGICAL : SRA_READ_TYPE_TECHNICAL;
+        switch ( rec->orientation[i] )
+        {
+            case ReadOrientationForward:
+                readType[i] |= SRA_READ_TYPE_FORWARD;
+                break;
+            case ReadOrientationReverse:
+                readType[i] |= SRA_READ_TYPE_REVERSE;
+                break;
+            case ReadOrientationUnknown:
+            default:
+                break;
+        }
+        readFilter[i] = isDup ? SRA_READ_FILTER_CRITERIA
+                      : rec->is_bad[i] ? SRA_READ_FILTER_REJECT : SRA_READ_FILTER_PASS;
+    }
+
+    memset(&data, 0, sizeof(data));
+    
+    data.sequence.buffer = rec->seq;
+    data.sequence.elements = seqLen;
+    
+    data.quality.buffer = rec->qual;
+    data.quality.elements = seqLen;
+    
+    if (keepMismatchQual) {
+        data.no_quantize_mask.buffer = mask;
+        data.no_quantize_mask.elements = seqLen;
+    }
+    
+    data.alignment_count.buffer = alcnt;
+    data.alignment_count.elements = nreads;
+    
+    data.nreads = nreads;
+    
+    data.read_type.buffer = readType;
+    data.read_type.elements = nreads;
+    
+    data.read_start.buffer = readStart;
+    data.read_start.elements = nreads;
+    
+    data.read_len.buffer = readLen;
+    data.read_len.elements = nreads;
+    
+    data.tmp_key_id = rec->keyId;
+    
+    data.spot_group.buffer = rec->spotGroup;
+    data.spot_group.elements = rec->spotGroupLen;
+    
+    data.cskey.buffer = rec->cskey;
+    data.cskey.elements = nreads;
+    
+    data.read_filter.buffer = readFilter;
+    data.read_filter.elements = nreads;
+    
+    data.platform.buffer = &platform;
+    data.platform.elements = 1;
+    
+    data.ti.buffer = rec->ti;
+    data.ti.elements = nreads;
+    
+    data.spot_name.buffer = rec->spotName;
+    data.spot_name.elements = rec->spotNameLen;
+    
+    if (!no_real_output) {
+        if (self->tbl == NULL) {
+            int csoption = (color ? ewseq_co_ColorSpace : 0);
+
+            if(hasTI) csoption |= ewseq_co_TI;
+            
+            rc = TableWriterSeq_Make(&self->tbl, self->db,
+                                     csoption | ewseq_co_NoLabelData | ewseq_co_SpotGroup /*| ewseq_co_SpotName*/, QualQuantizer);
+        }
+        if (rc == 0) {
+            rc = TableWriterSeq_Write(self->tbl, &data, &dummyRowId);
+        }
+    }
+    
+    if (h_readInfo)
+        free(h_readInfo);
+    
+    return rc;
+}
+
+rc_t SequenceDoneWriting(SequenceWriter *self)
+{
+    return TableWriterSeq_TmpKeyStart(self->tbl);
+}
+
+rc_t SequenceReadKey(const SequenceWriter *cself, int64_t row, uint64_t *keyId)
+{
+    return TableWriterSeq_TmpKey(cself->tbl, row, keyId);
+}
+
+rc_t SequenceUpdateAlignData(SequenceWriter *self, int64_t rowId, unsigned nreads,
+                             int64_t const primeId[/* nreads */],
+                             uint8_t const algnCnt[/* nreads */])
+{
+    TableWriterData data[2];
+    
+    data[0].buffer = primeId; data[0].elements = nreads;
+    data[1].buffer = algnCnt; data[1].elements = nreads;
+    
+    return TableWriterSeq_WriteAlignmentData(self->tbl, rowId, &data[0], &data[1]);
+}
+
+void SequenceWhack(SequenceWriter *self, bool commit) {
+    uint64_t dummyRows;
+    /* rc_t rc; */
+    
+    VDatabaseRelease(self->db);
+    
+    if (self->tbl == NULL)
+        return;
+    
+    /* rc = */ TableWriterSeq_Whack(self->tbl, commit, &dummyRows);
+}
+
+/* MARK: SequenceRecord Object */
+static
+rc_t SequenceRecordResize(SequenceRecord *self,
+                          KDataBuffer *storage,
+                          unsigned numreads,
+                          unsigned seqLen)
+{
+    size_t sz;
+    rc_t rc;
+    
+    sz = seqLen * (sizeof(self->seq[0]) + sizeof(self->qual[0])) +
+         numreads * (sizeof(self->ti) +
+                     sizeof(self->readStart[0]) +
+                     sizeof(self->readLen[0]) +
+                     sizeof(self->aligned[0]) + 
+                     sizeof(self->orientation[0]) +
+                     sizeof(self->alignmentCount[0]) +
+                     sizeof(self->cskey[0])
+                     );
+    storage->elem_bits = 8;
+    rc = KDataBufferResize(storage, sz);
+    if (rc)
+        return rc;
+    self->numreads = numreads;
+    
+    self->ti = (uint64_t *)storage->base;
+    self->readStart = (uint32_t *)&self->ti[numreads];
+    self->readLen = (uint32_t *)&self->readStart[numreads];
+    self->aligned = (bool *)&self->readLen[numreads];
+    self->orientation = (uint8_t *)&self->aligned[numreads];
+    self->is_bad = (uint8_t *)&self->orientation[numreads];
+    self->alignmentCount = (uint8_t *)&self->is_bad[numreads];
+    self->cskey = (char *)&self->alignmentCount[numreads];
+    self->seq = (char *)&self->cskey[numreads];
+    self->qual = (uint8_t *)&self->seq[seqLen];
+
+    self->spotGroup = NULL;
+    self->spotGroupLen = 0;
+    self->spotName = NULL;
+    self->spotNameLen = 0;
+    
+    return 0;
+}
+
+rc_t SequenceRecordInit(SequenceRecord *self, unsigned numreads, unsigned readLen[])
+{
+    unsigned i;
+    unsigned seqlen = 0;
+    rc_t rc;
+    
+    for (i = 0; i != numreads; ++i) {
+        seqlen += readLen[i];
+    }
+    rc = SequenceRecordResize(self, &self->storage, numreads, seqlen);
+    if (rc)
+        return rc;
+    memset(self->storage.base, 0, KDataBufferBytes(&self->storage));
+    
+    for (seqlen = 0, i = 0; i != numreads; ++i) {
+        self->readLen[i] = readLen[i];
+        self->readStart[i] = seqlen;
+        seqlen += readLen[i];
+    }
+    self->numreads = numreads;
+    memset(self->cskey, 'T', numreads);
+    return 0;
+}
+
+rc_t SequenceRecordAppend(SequenceRecord *self,
+                          const SequenceRecord *other
+                          )
+{
+    /* save the locations of the original data */
+    unsigned const seq = (uint8_t const *)self->seq - (uint8_t const *)self->storage.base;
+    unsigned const qual = (uint8_t const *)self->qual - (uint8_t const *)self->storage.base;
+    unsigned const cskey = (uint8_t const *)self->cskey - (uint8_t const *)self->storage.base;
+    unsigned const alignmentCount = (uint8_t const *)self->alignmentCount - (uint8_t const *)self->storage.base;
+    unsigned const is_bad = (uint8_t const *)self->is_bad - (uint8_t const *)self->storage.base;
+    unsigned const orientation = (uint8_t const *)self->orientation - (uint8_t const *)self->storage.base;
+    unsigned const aligned = (uint8_t const *)self->aligned - (uint8_t const *)self->storage.base;
+    unsigned const ti = (uint8_t const *)self->ti - (uint8_t const *)self->storage.base;
+    unsigned const readLen = (uint8_t const *)self->readLen - (uint8_t const *)self->storage.base;
+/*    unsigned const readStart = (uint8_t const *)self->readStart - (uint8_t const *)self->storage.base;*/
+
+    rc_t rc;
+    unsigned seqlen;
+    unsigned otherSeqlen;
+    unsigned i;
+    unsigned numreads = self->numreads;
+    
+    for (seqlen = 0, i = 0; i != numreads; ++i) {
+        seqlen += self->readLen[i];
+    }
+    for (otherSeqlen = 0, i = 0; i != other->numreads; ++i) {
+        otherSeqlen += other->readLen[i];
+    }
+
+    rc = SequenceRecordResize(self, &self->storage, self->numreads + other->numreads, seqlen + otherSeqlen);
+    if (rc)
+        return rc;
+    /* this needs to be reverse order from assignment in Resize function
+     * these regions can overlap
+     */
+    memmove(self->qual,             &((uint8_t const *)self->storage.base)[qual],              seqlen);
+    memmove(self->seq,              &((uint8_t const *)self->storage.base)[seq],               seqlen);
+    memmove(self->cskey,            &((uint8_t const *)self->storage.base)[cskey],             numreads * sizeof(self->cskey[0]));
+    memmove(self->alignmentCount,   &((uint8_t const *)self->storage.base)[alignmentCount],    numreads * sizeof(self->alignmentCount[0]));
+    memmove(self->is_bad,           &((uint8_t const *)self->storage.base)[is_bad],            numreads * sizeof(self->is_bad[0]));
+    memmove(self->orientation,      &((uint8_t const *)self->storage.base)[orientation],       numreads * sizeof(self->orientation[0]));
+    memmove(self->aligned,          &((uint8_t const *)self->storage.base)[aligned],           numreads * sizeof(self->aligned[0]));
+    memmove(self->readLen,          &((uint8_t const *)self->storage.base)[readLen],           numreads * sizeof(self->readLen[0]));
+    memmove(self->ti,               &((uint8_t const *)self->storage.base)[ti],                numreads * sizeof(self->ti[0]));
+    
+    memmove(&self->ti[numreads],             other->ti,              other->numreads * sizeof(self->ti[0]));
+    memmove(&self->readLen[numreads],        other->readLen,         other->numreads * sizeof(self->readLen[0]));
+    memmove(&self->aligned[numreads],        other->aligned,         other->numreads * sizeof(self->aligned[0]));
+    memmove(&self->orientation[numreads],    other->orientation,     other->numreads * sizeof(self->orientation[0]));
+    memmove(&self->is_bad[numreads],         other->is_bad,          other->numreads * sizeof(self->is_bad[0]));
+    memmove(&self->alignmentCount[numreads], other->alignmentCount,  other->numreads * sizeof(self->alignmentCount[0]));
+    memmove(&self->cskey[numreads],          other->cskey,           other->numreads * sizeof(self->cskey[0]));
+    memmove(&self->seq[seqlen],              other->seq,             otherSeqlen);
+    memmove(&self->qual[seqlen],             other->qual,            otherSeqlen);
+    
+    for (i = 0, seqlen = 0; i != self->numreads; ++i) {
+        self->readStart[i] = seqlen;
+        seqlen += self->readLen[i];
+    }
+    
+    return 0;
+}
diff --git a/libs/ncbi-vdb/Makefile b/libs/ncbi-vdb/Makefile
new file mode 100644
index 0000000..d654c6a
--- /dev/null
+++ b/libs/ncbi-vdb/Makefile
@@ -0,0 +1,160 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/ncbi-vdb
+
+EXT_LIBS = \
+	libncbi-vdb \
+	libncbi-wvdb
+
+ALL_LIBS = \
+	$(EXT_LIBS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(EXT_LIBS): makedirs
+	@ $(MAKE_CMD) $(LIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(LIBDIR)/,$(EXT_LIBS))
+
+.PHONY: $(TARGDIR)/all $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# virtual db library
+# made in both static and shared versions
+$(LIBDIR)/libncbi-vdb: $(addprefix $(LIBDIR)/libncbi-vdb.,$(LIBX) $(SHLX))
+
+ifeq (64,$(BITS))
+  LIBVDB_BLAST = vdb-blast
+else
+  LIBVDB_BLAST =
+endif
+
+ifeq (win,$(OS))
+LIBKQ =
+else
+LIBKQ = kq
+endif
+
+ifeq (1,$(HAVE_XML2))
+LIBKXML = kxml kxfs
+ifneq (,$(XML2_LIBDIR))
+LDFLAGS += -L$(XML2_LIBDIR)
+endif
+endif
+
+VDB_LIB_CMN =    \
+	align-access \
+	ncbi-bam     \
+	vfs          \
+	$(LIBKXML)   \
+	mbedx509     \
+	mbedtls      \
+	mbedcrypto   \
+	kns          \
+	kfg          \
+	krypto       \
+	ksrch        \
+	kfs          \
+	klib         \
+	kproc        \
+	$(LIBKQ)     \
+	kfc          \
+	bz2          \
+	z
+
+VDB_LIB_RD =              \
+	align-reader          \
+	ascp                  \
+	$(EXT_SCHEMA_MODULES) \
+	srareader             \
+	sradb                 \
+	$(LIBVDB_BLAST)       \
+	vdb                   \
+	kdb                   \
+	$(VDB_LIB_CMN)        \
+	ngs-jni               \
+	ngs-py                \
+	ngs                   \
+
+VDB_OBJ = \
+	$(addprefix $(ILIBDIR)/lib,$(addsuffix .a,$(VDB_LIB_RD)))
+
+VDB_LIB = \
+	$(addprefix -s,$(VDB_LIB_RD))
+
+$(LIBDIR)/libncbi-vdb.$(SHLX): $(VDB_OBJ)
+	echo $(SRCDIR)
+	$(LD) --dlib --vers $(SRCDIR)/libncbi-vdb.vers -o $@ $(VDB_LIB)
+
+$(LIBDIR)/libncbi-vdb.$(LIBX): $(VDB_OBJ)
+	$(LD) --slib --vers $(SRCDIR)/libncbi-vdb.vers -o $@ $(VDB_LIB)
+
+#-------------------------------------------------------------------------------
+# update version
+#
+$(LIBDIR)/libncbi-wvdb: $(addprefix $(LIBDIR)/libncbi-wvdb.,$(LIBX) $(SHLX))
+
+VDB_LIB_RDWR =                           \
+	align-writer                         \
+	$(addprefix w,$(EXT_SCHEMA_MODULES)) \
+	wsradb                               \
+	wvdb                                 \
+	wkdb                                 \
+	$(VDB_LIB_CMN)
+
+WVDB_OBJ = \
+	$(addprefix $(ILIBDIR)/lib,$(addsuffix .a,$(VDB_LIB_RDWR)))
+
+WVDB_LIB = \
+	$(addprefix -s,$(VDB_LIB_RDWR))
+
+$(LIBDIR)/libncbi-wvdb.$(SHLX): $(WVDB_OBJ)
+	$(LD) --dlib --vers $(SRCDIR)/libncbi-vdb.vers -o $@ $(WVDB_LIB)
+
+$(LIBDIR)/libncbi-wvdb.$(LIBX): $(WVDB_OBJ)
+	$(LD) --slib --vers $(SRCDIR)/libncbi-vdb.vers -o $@ $(WVDB_LIB)
diff --git a/libs/ncbi-vdb/libncbi-vdb.vers b/libs/ncbi-vdb/libncbi-vdb.vers
new file mode 100644
index 0000000..dbe5900
--- /dev/null
+++ b/libs/ncbi-vdb/libncbi-vdb.vers
@@ -0,0 +1 @@
+2.8.1
diff --git a/libs/ngs-c++/Makefile b/libs/ngs-c++/Makefile
new file mode 100644
index 0000000..bdfe614
--- /dev/null
+++ b/libs/ngs-c++/Makefile
@@ -0,0 +1,103 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/ngs-c++
+
+INT_LIBS = \
+
+EXT_LIBS = \
+	libncbi-ngs-c++
+
+ALL_LIBS = \
+	$(INT_LIBS) \
+	$(EXT_LIBS)
+
+OBJFILES = \
+	$(NGS_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+INCDIRS += \
+	-I$(SRCDIR)/../ngs \
+	-I$(TOP)/../ngs/ngs-sdk
+
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs # compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+$(EXT_LIBS): makedirs
+	@ $(MAKE_CMD) $(LIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+	$(addprefix $(LIBDIR)/,$(EXT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# ncbi-ngs-c++
+#
+$(LIBDIR)/libncbi-ngs-c++: $(addprefix $(LIBDIR)/libncbi-ngs-c++.,$(LIBX))
+
+NGS_SRC = \
+	NCBI-NGS
+
+NGS_OBJ = \
+	$(addsuffix .$(LOBX),$(NGS_SRC))
+
+NGS_LIB = \
+
+$(LIBDIR)/libncbi-ngs-c++.$(LIBX): $(NGS_OBJ)
+	$(LP) --slib --vers $(SRCDIR)/../ncbi-vdb/libncbi-vdb.vers -o $@ $^ $(NGS_LIB)
+
+
+testy-the-bear: $(TEST_BINDIR)/testy-the-ngs-bear
+
+$(TEST_BINDIR)/testy-the-ngs-bear: testy-the-bear.o
+	$(LP) --exe -o $@ $^ -lkapp -lncbi-ngs-c++ -lncbi-vdb
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/ngs-c++/NCBI-NGS.cpp b/libs/ngs-c++/NCBI-NGS.cpp
new file mode 100644
index 0000000..7b6959b
--- /dev/null
+++ b/libs/ngs-c++/NCBI-NGS.cpp
@@ -0,0 +1,106 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <ngs/ncbi/NGS.hpp>
+
+#include <kns/manager.h>
+
+#include <ngs/itf/ErrBlock.hpp>
+
+#include <ngs/itf/ReadCollectionItf.h>
+#include <ngs/itf/ReferenceSequenceItf.h>
+#include "NCBI-NGS.h"
+#include "../klib/release-vers.h"
+
+namespace ncbi
+{
+
+    static bool have_user_version_string;
+
+    /* setAppVersionString
+     *  updates User-Agent header in HTTP communications
+     *
+     *  example usage:
+     *    ncbi::NGS::setAppVersionString ( "pileup-stats.1.0.0" );
+     */
+    void NGS :: setAppVersionString ( const String & app_version )
+        throw ()
+    {
+        // get a KNSManager
+        KNSManager * kns;
+        rc_t rc = KNSManagerMake ( & kns );
+        if ( rc == 0 )
+        {
+            have_user_version_string = true;
+            KNSManagerSetUserAgent ( kns, "ncbi-ngs.%V %.*s", RELEASE_VERS, ( uint32_t ) app_version . size (), app_version . data () );
+            KNSManagerRelease ( kns );
+        }
+    }
+
+    /* open
+     *  create an object representing a named collection of reads
+     *  "spec" may be a path to an object
+     *  or may be an id, accession, or URL
+     */
+    ReadCollection NGS :: openReadCollection ( const String & spec )
+        throw ( ErrorMsg )
+    {
+        if ( ! have_user_version_string )
+            setAppVersionString ( "ncbi-ngs: unknown-application" );
+
+        // call directly into ncbi-vdb library
+        ngs :: ErrBlock err;
+        NGS_ReadCollection_v1 * ret = NCBI_NGS_OpenReadCollection ( spec . c_str (), & err );
+
+        // check for errors
+        err . Check ();
+
+        // create ReadCollection object
+        return ReadCollection ( ( ngs :: ReadCollectionRef ) ret );
+    }
+
+    /* open
+     *  create an object representing a named reference
+     *  "spec" may be a path to an object
+     *  or may be an id, accession, or URL
+     */
+    ReferenceSequence NGS :: openReferenceSequence ( const String & spec )
+        throw ( ErrorMsg )
+    {
+        if ( ! have_user_version_string )
+            setAppVersionString ( "ncbi-ngs: unknown-application" );
+
+        // call directly into ncbi-vdb library
+        ngs :: ErrBlock err;
+        NGS_ReferenceSequence_v1 * ret = NCBI_NGS_OpenReferenceSequence ( spec . c_str (), & err );
+
+        // check for errors
+        err . Check ();
+
+        // create ReferenceSequence object
+        return ReferenceSequence ( ( ngs :: ReferenceSequenceRef ) ret );
+    }
+}
diff --git a/libs/ngs-c++/testy-the-bear.cpp b/libs/ngs-c++/testy-the-bear.cpp
new file mode 100644
index 0000000..b5abed6
--- /dev/null
+++ b/libs/ngs-c++/testy-the-bear.cpp
@@ -0,0 +1,277 @@
+#include <ngs/NCBI-NGS.hpp>
+#include <ngs/ReadCollection.hpp>
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/xcdefs.h>
+#include <kfc/except.h>
+#include <klib/printf.h>
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+
+#include <kapp/args.h>
+
+#include <iostream>
+
+#include <stdarg.h>
+
+#define FAKE_CTX_RECOVER 0
+#define FAKE_CTX_ERROR 0
+#define FAKE_MAKE_VDATABASE 0
+namespace ngs
+{
+    static
+    void run ()
+    {
+#if 1
+        ReadCollection run = NCBI :: NGS :: openReadCollection ( "SRR000001" );
+#elif 1
+        ReadCollection run = NCBI :: NGS :: openReadCollection ( "SRR1063272" );
+#endif
+        ReadIterator it = run . getReads ( Read :: all );
+        
+        String run_name = run . getName ();
+
+        int i;
+        for ( i = 0;
+#if 0
+              i < 5 &&
+#endif
+              it . nextRead (); ++ i )
+        {
+            StringRef read_name = it . getReadName ();
+            StringRef bases = it . getReadBases ();
+            StringRef qual = it . getReadQualities ();
+
+            
+            std :: cout 
+                << '@'
+                << run_name
+                << '.'
+                << it . getReadId ()
+                << ' '
+                << read_name
+                << " length="
+                << bases . size ()
+                << std :: endl
+                << bases
+                << std :: endl
+                << '+'
+                << run_name
+                << '.'
+                << it . getReadId ()
+                << ' '
+                << read_name
+                << " length="
+                << qual . size ()
+                << std :: endl
+                << qual
+                << std :: endl;
+        }
+
+        std :: cerr
+            << "Read "
+            << i
+            << " spots for "
+            << run_name
+            << std :: endl
+            << "Written "
+            << i
+            << " spots for "
+            << run_name
+            << std :: endl;
+
+    }
+}
+
+extern "C"
+{
+#if FAKE_CTX_RECOVER
+    ctx_t ctx_recover ( KCtx * new_ctx, const KFuncLoc * func_loc, uint32_t rsrc_bits )
+    {
+        static KCtx fake_ctx;
+        static KRsrc fake_rsrc;
+        static bool initialized;
+
+        if ( ! initialized )
+        {
+            VDBManagerMakeRead ( ( const VDBManager** ) & fake_rsrc . vdb, NULL );
+            VDBManagerOpenKDBManagerRead ( fake_rsrc . vdb, ( const KDBManager** ) & fake_rsrc . kdb );
+            fake_ctx . rsrc = & fake_rsrc;
+            fake_ctx . loc = func_loc;
+            initialized = true;
+        }
+
+        * new_ctx = fake_ctx;
+        return new_ctx;
+    }
+#endif
+
+#if FAKE_CTX_ERROR
+    static
+    void print_stack_trace ( ctx_t ctx )
+    {
+        if ( ctx != NULL )
+        {
+            print_stack_trace ( ctx -> caller );
+            std :: cerr
+                << ctx -> loc -> src -> mod
+                << '/'
+                << ctx -> loc -> src -> file
+                << '.'
+                << ctx -> loc -> src -> ext
+                << ':'
+                << ctx -> loc -> func
+                << std :: endl
+                ;
+        }
+    }
+
+    static
+    void print_xc ( xc_t xc )
+    {
+        const XCErr * err = ( const XCErr* ) xc;
+        std :: cerr
+            << err -> name
+            << ": "
+            ;
+
+        while ( err -> dad != NULL )
+            err = err -> dad;
+
+        const XCObj * obj = err -> obj;
+        while ( obj -> dad != NULL )
+            obj = obj -> dad;
+
+        const XCState * state = err -> state;
+        while ( state -> dad != NULL )
+            state = state -> dad;
+
+        std :: cerr
+            << obj -> desc
+            << ' '
+            << state -> desc
+            << ": "
+            ;
+    }
+
+    static
+    rc_t make_rc ( rc_t rc_ctx, xc_t xc )
+    {
+        const XCErr * err = ( const XCErr* ) xc;
+        while ( err -> dad != NULL )
+            err = err -> dad;
+
+        const XCObj * obj = err -> obj;
+        while ( obj -> dad != NULL )
+            obj = obj -> dad;
+
+        const XCState * state = err -> state;
+        while ( state -> dad != NULL )
+            state = state -> dad;
+
+        return rc_ctx | ( obj -> rc_obj << 6 ) | state -> rc_state;
+    }
+
+    void ctx_error ( ctx_t ctx, uint32_t lineno, xc_sev_t sev, xc_t xc, const char *msg, ... )
+    {
+        static const char * severity_strings [ 3 ] = { "SYSTEM", "INTERNAL", "USER" };
+        char buffer [ 4096 ];
+        va_list args;
+
+        va_start ( args, msg );
+
+        print_stack_trace ( ctx -> caller );
+        std :: cerr
+            << ctx -> loc -> src -> mod
+            << '/'
+            << ctx -> loc -> src -> file
+            << '.'
+            << ctx -> loc -> src -> ext
+            << ':'
+            << ctx -> loc -> func
+            << ':'
+            << lineno
+            << ": "
+            << severity_strings [ sev ]
+            << " ERROR: "
+            ;
+
+        print_xc ( xc );
+
+        string_vprintf ( buffer, sizeof buffer, NULL, msg, args );
+
+        va_end ( args );
+
+        std :: cerr
+            << buffer
+            << std :: endl
+            ;
+
+        KCtx * mctx = const_cast < KCtx* > ( ctx );
+        mctx -> rc = make_rc ( ctx -> loc -> rc_context, xc );
+        mctx -> annotated = mctx -> error = true;
+        while ( 1 )
+        {
+            mctx = const_cast < KCtx* > ( mctx -> caller );
+            if ( mctx == 0 )
+                break;
+            if ( mctx -> error )
+            {
+                if ( ! mctx -> clear_error_stop )
+                    mctx -> clear_error_stop = true;
+                break;
+            }
+
+            assert ( ! mctx -> clear_error_stop );
+            mctx -> error = true;
+        }
+    }
+#endif
+
+#if FAKE_MAKE_VDATABASE
+    NGS_ReadCollection * NGS_ReadCollectionMakeVDatabase ( ctx_t ctx, struct VDatabase const *db, const char * spec )
+    {
+        return 0;
+    }
+#endif
+
+    ver_t CC KAppVersion ( void )
+    {
+        return 0;
+    }
+    rc_t CC UsageSummary (const char * progname)
+    {
+        return 0;
+    }
+
+    rc_t CC Usage ( const Args * args )
+    {
+        return 0;
+    }
+
+    const char UsageDefaultName[] = "testy-the-ngs-bear";    
+
+    rc_t KMain ( int argc, char * argv [] )
+    {
+        try
+        {
+            ngs :: run ();
+        }
+        catch ( ngs :: ErrorMsg & x )
+        {
+            :: std :: cerr
+                << "ngs :: Error - "
+                << x . what ()
+                << std :: endl;
+        }
+        catch ( ... )
+        {
+            :: std :: cerr
+                << "unknown error"
+                << std :: endl;
+        }
+        
+        return 0;
+    }
+}
+
diff --git a/libs/ngs-jni/.gitignore b/libs/ngs-jni/.gitignore
new file mode 100644
index 0000000..116806e
--- /dev/null
+++ b/libs/ngs-jni/.gitignore
@@ -0,0 +1 @@
+headers-generated
diff --git a/libs/ngs-jni/Makefile b/libs/ngs-jni/Makefile
new file mode 100644
index 0000000..1ba6cba
--- /dev/null
+++ b/libs/ngs-jni/Makefile
@@ -0,0 +1,109 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/ngs-jni
+
+INT_LIBS = \
+	libngs-jni
+
+EXT_LIBS = \
+
+ALL_LIBS = \
+	$(INT_LIBS) \
+	$(EXT_LIBS)
+
+include $(TOP)/build/Makefile.env
+
+INCDIRS += \
+	-I$(SRCDIR)/../ngs
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs jnihdrs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+$(EXT_LIBS): makedirs jnihdrs
+	@ $(MAKE_CMD) $(LIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+	$(addprefix $(LIBDIR)/,$(EXT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# JNI headers
+#
+jnihdrs: # headers-generated
+
+$(CLSPATH)/ngs-java.jar:
+	@ echo "don't know where $@ is"
+
+JNI_BASE =  \
+	Manager
+
+JNI_INC = \
+	$(addprefix jni_,$(addsuffix .h,$(JNI_BASE)))
+
+headers-generated: $(CLSPATH)/ngs-java.jar
+	javah -classpath $^ $(addprefix gov.nih.nlm.ncbi.ngs.,$(JNI_BASE))
+	@ echo 'for f in gov_nih_nlm_ncbi_ngs_*.h; do mv $$f jni_$${f#gov_nih_nlm_ncbi_ngs_}; done' | bash
+	@ touch $@
+
+#-------------------------------------------------------------------------------
+# ncbi-ngs-jni
+#
+$(ILIBDIR)/libngs-jni: $(addprefix $(ILIBDIR)/libngs-jni.,$(LIBX))
+
+JNI_FIXED =  \
+	String   \
+	ErrorMsg
+
+JNI_SRC = \
+	$(addprefix jni_,$(JNI_BASE) $(JNI_FIXED))
+
+JNI_OBJ = \
+	$(addsuffix .$(LOBX),$(JNI_SRC))
+
+$(ILIBDIR)/libngs-jni.$(LIBX): $(JNI_OBJ)
+	$(LD) --slib -o $@ $^
diff --git a/libs/ngs-jni/jni_ErrorMsg.c b/libs/ngs-jni/jni_ErrorMsg.c
new file mode 100644
index 0000000..385d4a7
--- /dev/null
+++ b/libs/ngs-jni/jni_ErrorMsg.c
@@ -0,0 +1,173 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "jni_ErrorMsg.h"
+
+/* prevent generation of static block
+   since this file doesn't participate in stack
+ */
+#define SRC_LOC_DEFINED 1
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/printf.h>
+
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+
+/*--------------------------------------------------------------------------
+ * ErrorMsg
+ */
+
+/* VThrow
+ */
+static
+void ErrorVThrow ( JNIEnv * jenv, jclass jexcept_cls,
+    ctx_t ctx, uint32_t lineno, const char * fmt, va_list args )
+{
+    const char * msg;
+
+    /* if the error was from C code, get message */
+    if ( FAILED () )
+        msg = WHAT ();
+    else
+    {
+        /* otherwise, use provided message */
+        rc_t rc;
+        size_t msg_size = 0;
+        char msg_buffer [ 4096 ];
+
+#if _DEBUGGING
+        size_t i;
+        const char * fname = ctx -> loc -> func;
+        assert ( fname != NULL );
+        if ( memcmp ( fname, "Java_", sizeof "Java_" - 1 ) == 0 )
+            fname += sizeof "Java_" - 1;
+        rc = string_printf ( msg_buffer, sizeof msg_buffer, & msg_size, "%s:%u ", fname, lineno );
+        for ( i = 0; i < msg_size; ++ i )
+        {
+            if ( msg_buffer [ i ] == '_' )
+                msg_buffer [ i ] = '.';
+        }
+#endif
+
+        rc = string_vprintf ( & msg_buffer [ msg_size ], sizeof msg_buffer - msg_size, NULL, fmt, args );
+        if ( rc != 0 )
+            string_printf ( & msg_buffer [ msg_size ], sizeof msg_buffer - msg_size, NULL, "** BAD MESSAGE STRING **" );
+
+        msg = msg_buffer;
+    }
+
+    /* create error object, put JVM thread into Exception state */
+    ( ( * jenv ) -> ThrowNew ) ( jenv, jexcept_cls, msg );
+
+    /* if error was from C code, pull out stack trace */
+    if ( FAILED () )
+    {
+        jthrowable x = ( * jenv ) -> ExceptionOccurred ( jenv );
+        if ( x != NULL )
+        {
+            /* get the stack depth */
+            /* allocate array of StackTraceElement */
+            /* access stack trace from C */
+            /* walk stack trace, filling in array */
+            /* set StackTraceElement on "x" */
+        }
+
+        /* don't leave exception on C thread state */
+        CLEAR ();
+    }
+}
+
+
+/* Throw
+ *  throw a Java ngs.ErrorMsg object taken from the C context block
+ *  may temporarily take information from point of throw
+ */
+void ErrorMsgThrow ( JNIEnv * jenv, ctx_t ctx, uint32_t lineno, const char *fmt, ... )
+{
+    va_list args;
+
+    /* locate ErrorMsg class */
+    jclass jexcept_cls = ( ( * jenv ) -> FindClass ) ( jenv, "ngs/ErrorMsg" );
+    if ( jexcept_cls == NULL )
+    {
+        /* turn it into a RuntimeException */
+        jexcept_cls = ( ( * jenv ) -> FindClass ) ( jenv, "java/lang/RuntimeException" );
+    }
+
+    /* package up arguments */
+    va_start ( args, fmt );
+
+    /* throw the exception */
+    ErrorVThrow ( jenv, jexcept_cls, ctx, lineno, fmt, args );
+
+    /* probably never get here */
+    va_end ( args );
+}
+
+
+void RuntimeExceptionThrow ( JNIEnv * jenv, ctx_t ctx, uint32_t lineno, const char *fmt, ... )
+{
+    va_list args;
+
+    /* locate RuntimeException class */
+    jclass jexcept_cls = ( ( * jenv ) -> FindClass ) ( jenv, "java/lang/RuntimeException" );
+
+    /* package up arguments */
+    va_start ( args, fmt );
+
+    /* throw the exception */
+    ErrorVThrow ( jenv, jexcept_cls, ctx, lineno, fmt, args );
+
+    /* probably never get here */
+    va_end ( args );
+}
+
+
+/* AssertU32
+ * AssertU64
+ */
+void ErrorMsgAssertU32 ( JNIEnv * jenv, ctx_t ctx, uint32_t lineno, jint i )
+{
+    if ( i < 0 )
+    {
+        USER_ERROR ( xcIntegerOutOfBounds, "expected unsigned integer but found %d", i );
+        ErrorMsgThrow ( jenv, ctx, lineno, "integer sign violation" );
+    }
+}
+
+void ErrorMsgAssertU64 ( JNIEnv * jenv, ctx_t ctx, uint32_t lineno, jlong i )
+{
+    if ( i < 0 )
+    {
+        USER_ERROR ( xcIntegerOutOfBounds, "expected unsigned integer but found %ld", i );
+        ErrorMsgThrow ( jenv, ctx, lineno, "integer sign violation" );
+    }
+}
diff --git a/libs/ngs-jni/jni_ErrorMsg.h b/libs/ngs-jni/jni_ErrorMsg.h
new file mode 100644
index 0000000..2630ca9
--- /dev/null
+++ b/libs/ngs-jni/jni_ErrorMsg.h
@@ -0,0 +1,89 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_jni_ErrorMsg_
+#define _h_jni_ErrorMsg_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#include "jni.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * ErrorMsg
+ */
+
+
+/* Throw
+ *  throw a Java ngs.ErrorMsg object taken from the C context block
+ */
+void ErrorMsgThrow ( JNIEnv * jenv, ctx_t ctx, uint32_t lineno, const char *msg, ... );
+
+
+/* AssertUnsignedInt
+ */
+void ErrorMsgAssertU32 ( JNIEnv * jenv, ctx_t ctx, uint32_t lineno, jint i );
+#define ErrorMsgAssertUnsignedInt( jenv, ctx, i ) \
+    if ( ( i ) < 0 )                               \
+        ErrorMsgAssertU32 ( jenv, ctx, __LINE__, i )
+
+/* AssertUnsignedLong
+ */
+void ErrorMsgAssertU64 ( JNIEnv * jenv, ctx_t ctx, uint32_t lineno, jlong i );
+#define ErrorMsgAssertUnsignedLong( jenv, ctx, i ) \
+    if ( ( i ) < 0 )                               \
+        ErrorMsgAssertU64 ( jenv, ctx, __LINE__, i )
+
+
+/*--------------------------------------------------------------------------
+ * RuntimeException
+ */
+
+
+/* Throw
+ *  throw a Java RuntimeException object taken from the C context block
+ */
+void RuntimeExceptionThrow ( JNIEnv * jenv, ctx_t ctx, uint32_t lineno, const char *msg, ... );
+
+
+/* UNIMPLEMENTED
+ *  while the stubs are being brought up
+ */
+#define JNI_UNIMPLEMENTED( jenv, ctx )                                  \
+    RuntimeExceptionThrow ( jenv, ctx, __LINE__, "UNIMPLEMENTED" )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_jni_ErrorMsg_ */
diff --git a/libs/ngs-jni/jni_Manager.c b/libs/ngs-jni/jni_Manager.c
new file mode 100644
index 0000000..55047e6
--- /dev/null
+++ b/libs/ngs-jni/jni_Manager.c
@@ -0,0 +1,250 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "jni_Manager.h"
+#include "jni_ErrorMsg.h"
+#include "jni_String.h"
+
+#include <kdb/manager.h> /* KDBManager */
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <kfc/rc.h>
+
+#include <kfc/rsrc-global.h>
+
+#include <kns/manager.h>
+#include <klib/ncbi-vdb-version.h> /* GetPackageVersion */
+
+#include <vfs/manager.h> /* VFSManager */
+#include <vfs/path.h> /* VPath */
+
+#include "NGS_ReadCollection.h"
+#include "NGS_ReferenceSequence.h"
+#include "../klib/release-vers.h"
+
+#include <assert.h>
+
+static bool have_user_version_string;
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    Initialize
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_Initialize
+    ( JNIEnv * jenv, jclass jcls )
+{
+    DECLARE_FUNC_LOC ( rcSRA, rcMgr, rcConstructing );
+
+    KCtx local_ctx, * ctx = & local_ctx;
+    TRY ( KRsrcGlobalInit ( & local_ctx, & s_func_loc, true ) )
+    {
+        return NULL;
+    }
+
+    return JStringMake ( ctx, jenv, "KRsrcGlobalInit failed with rc = %R", local_ctx . rc );
+}
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    Shutdown
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_Shutdown
+    ( JNIEnv * jenv, jclass jcls )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcMgr, rcDestroying );
+    KRsrcGlobalWhack ( ctx );
+}
+
+static
+void set_app_version_string ( const char * app_version )
+{
+    // get a KNSManager
+    KNSManager * kns;
+    rc_t rc = KNSManagerMake ( & kns );
+    if ( rc == 0 )
+    {
+        have_user_version_string = true;
+        KNSManagerSetUserAgent ( kns, "ncbi-ngs.%V %s", RELEASE_VERS, app_version );
+        KNSManagerRelease ( kns );
+    }
+}
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    SetAppVersionString
+ * Signature: (Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_SetAppVersionString
+    ( JNIEnv * jenv, jclass jcls, jstring japp_version )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcMgr, rcUpdating );
+
+    const char * app_version = JStringData ( japp_version, ctx, jenv );
+
+    set_app_version_string ( app_version );
+}
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    OpenReadCollection
+ * Signature: (Ljava/lang/String;)J
+ */
+JNIEXPORT jlong JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_OpenReadCollection
+    ( JNIEnv * jenv, jclass jcls, jstring jspec )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcMgr, rcConstructing );
+
+    NGS_ReadCollection * new_ref = NULL;
+    const char * spec = JStringData ( jspec, ctx, jenv );
+
+    if ( ! have_user_version_string )
+        set_app_version_string ( "ncbi-ngs: unknown-application" );
+
+    new_ref = NGS_ReadCollectionMake ( ctx, spec );
+    if ( FAILED () )
+    {
+        ErrorMsgThrow ( jenv, ctx, __LINE__, "failed to create ReadCollection from spec '%s'"
+                         , spec
+            );
+        JStringReleaseData ( jspec, ctx, jenv, spec );
+        return 0;
+    }
+
+    JStringReleaseData ( jspec, ctx, jenv, spec );
+
+    assert ( new_ref != NULL );
+    return ( jlong ) ( size_t ) new_ref;
+}
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    OpenReferenceSequence
+ * Signature: (Ljava/lang/String;)J
+ */
+JNIEXPORT jlong JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_OpenReferenceSequence
+    ( JNIEnv * jenv, jclass jcls, jstring jspec )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcMgr, rcConstructing );
+
+    NGS_ReferenceSequence* new_ref = NULL;
+    const char * spec = JStringData ( jspec, ctx, jenv );
+
+    if ( ! have_user_version_string )
+        set_app_version_string ( "ncbi-ngs: unknown-application" );
+
+    new_ref = NGS_ReferenceSequenceMake ( ctx, spec );
+    if ( FAILED () )
+    {
+        ErrorMsgThrow ( jenv, ctx, __LINE__, "failed to create ReferenceSequence from spec '%s'"
+                         , spec
+            );
+        JStringReleaseData ( jspec, ctx, jenv, spec );
+        return 0;
+    }
+
+    JStringReleaseData ( jspec, ctx, jenv, spec );
+
+    assert ( new_ref != NULL );
+    return ( jlong ) ( size_t ) new_ref;
+}
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    IsValid
+ * Signature: (Ljava/lang/String;)Z
+ */
+JNIEXPORT jboolean JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_IsValid
+  ( JNIEnv * jenv, jclass jcls, jstring jspec )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcMgr, rcAccessing );
+
+    jboolean result = false;
+
+    VFSManager * vfs = NULL;
+    rc_t rc = VFSManagerMake ( & vfs );
+
+    if ( rc == 0 ) {
+        const char * spec = JStringData ( jspec, ctx, jenv );
+
+        VPath * path = NULL;
+        rc = VFSManagerMakePath ( vfs, & path, spec );
+
+        if ( rc == 0 ) {
+            const KDBManager * kdb = NULL;
+            rc = KDBManagerMakeRead ( & kdb, NULL );
+
+            if ( rc == 0 ) {
+                KPathType t = KDBManagerPathTypeVP ( kdb, path );
+                if (t == kptDatabase || t == kptTable) {
+                    result = true;
+                }
+
+                KDBManagerRelease ( kdb );
+                kdb = NULL;
+            }
+
+            VPathRelease ( path );
+            path = NULL;
+        }
+
+        VFSManagerRelease ( vfs );
+        vfs = NULL;
+    }
+
+    return result;
+}
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    release
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_release
+    ( JNIEnv * jenv, jclass jcls, jlong jref )
+{
+    if ( jref != 0 )
+    {
+        HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcReleasing );
+        NGS_RefcountRelease ( ( void* ) ( size_t ) jref, ctx );
+    }
+}
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    Version
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_Version
+  (JNIEnv *jenv, jclass jcls)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcMgr, rcAccessing );
+    return JStringMake(ctx, jenv, GetPackageVersion());
+}
diff --git a/libs/ngs-jni/jni_Manager.h b/libs/ngs-jni/jni_Manager.h
new file mode 100644
index 0000000..b821e22
--- /dev/null
+++ b/libs/ngs-jni/jni_Manager.h
@@ -0,0 +1,77 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class gov_nih_nlm_ncbi_ngs_Manager */
+
+#ifndef _Included_gov_nih_nlm_ncbi_ngs_Manager
+#define _Included_gov_nih_nlm_ncbi_ngs_Manager
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    Version
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_Version
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    Initialize
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_Initialize
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    Shutdown
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_Shutdown
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    SetAppVersionString
+ * Signature: (Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_SetAppVersionString
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    OpenReadCollection
+ * Signature: (Ljava/lang/String;)J
+ */
+JNIEXPORT jlong JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_OpenReadCollection
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    OpenReferenceSequence
+ * Signature: (Ljava/lang/String;)J
+ */
+JNIEXPORT jlong JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_OpenReferenceSequence
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    IsValid
+ * Signature: (Ljava/lang/String;)Z
+ */
+JNIEXPORT jboolean JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_IsValid
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     gov_nih_nlm_ncbi_ngs_Manager
+ * Method:    release
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_gov_nih_nlm_ncbi_ngs_Manager_release
+  (JNIEnv *, jclass, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libs/ngs-jni/jni_String.c b/libs/ngs-jni/jni_String.c
new file mode 100644
index 0000000..13ed62f
--- /dev/null
+++ b/libs/ngs-jni/jni_String.c
@@ -0,0 +1,195 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "jni_String.h"
+#include "jni_ErrorMsg.h"
+#include "NGS_String.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+
+#include <sysalloc.h>
+
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * JString
+ * NGS_String
+ */
+
+
+
+/* Make
+ *  make with string_printf format
+ */
+jstring JStringMake ( ctx_t ctx, JNIEnv * jenv, const char * fmt, ... )
+{
+    jstring jstr;
+
+    va_list args;
+    va_start ( args, fmt );
+
+    jstr = JStringVMake ( ctx, jenv, fmt, args );
+
+    va_end ( args );
+
+    return jstr;
+}
+
+jstring JStringVMake ( ctx_t ctx, JNIEnv * jenv, const char * fmt, va_list args )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcString, rcConstructing );
+
+    rc_t rc;
+    size_t size;
+    char buffer [ 4096 ];
+
+    assert ( jenv != NULL );
+
+    /* if the format string is NULL or empty */
+    if ( fmt == NULL || fmt [ 0 ] == 0 )
+        return ( ( * jenv ) -> NewStringUTF ) ( jenv, "" );
+
+    rc = string_vprintf ( buffer, sizeof buffer, & size, fmt, args );
+    if ( rc != 0 )
+        INTERNAL_ERROR ( xcStringCreateFailed, "string_printf: rc = %R", rc );
+    else
+    {
+        return ( ( * jenv ) -> NewStringUTF ) ( jenv, buffer );
+    }
+
+    /* something is really bad with the string */
+    RuntimeExceptionThrow ( jenv, ctx, __LINE__, "failed to make a String" );
+
+    /* should never reach here */
+    return NULL;
+}
+
+
+/* Data
+ *  access Java String data
+ */
+const char * JStringData ( jstring jself, ctx_t ctx, JNIEnv * jenv )
+{
+    jboolean is_copy;
+    if ( jself != NULL )
+        return ( ( * jenv ) -> GetStringUTFChars ) ( jenv, jself, & is_copy );
+    return NULL;
+}
+
+
+/* ReleaseData
+ *  release Java String data
+ */
+void JStringReleaseData ( jstring jself, ctx_t ctx, JNIEnv * jenv, const char * data )
+{
+    ( ( * jenv ) -> ReleaseStringUTFChars ) ( jenv, jself, data );
+}
+
+/* CopyToJString
+ *  copy a Java String from an NGS_String
+ */
+jstring NGS_StringCopyToJString ( const NGS_String * self, ctx_t ctx, JNIEnv * jenv )
+{
+    size_t size;
+
+    assert ( jenv != NULL );
+
+    /* if the NGS_String is NULL */
+    if ( self == NULL )
+        return ( ( * jenv ) -> NewStringUTF ) ( jenv, "" );
+
+    TRY ( size = NGS_StringSize ( self, ctx ) )
+    {
+        const char * data;
+
+        /* if NGS_String is empty */
+        if ( size == 0 )
+            return ( ( * jenv ) -> NewStringUTF ) ( jenv, "" );
+
+        TRY ( data = NGS_StringData ( self, ctx ) )
+        {
+            char * copy;
+
+            /* the Java gods did not see fit to provide a version
+               of NewString that takes a pointer and a length,
+               at least when it comes to UTF-8 character sets... */
+
+            /* an awful, but effective, test to see if the string
+               is already NUL terminated. */
+            if ( ( ( ( size_t ) & data [ size ] ) & 0xFFF ) != 0 )
+            {
+                /* we can read this address without fear of a seg-fault.
+                   if it's NUL, then we can send the string in directly. */
+                if ( data [ size ] == 0 )
+                    return ( ( * jenv ) -> NewStringUTF ) ( jenv, data );
+            }
+
+            /* create a copy for the benefit of our Java friends */
+            copy = malloc ( size + 1 );
+            if ( copy == NULL )
+                SYSTEM_ERROR ( xcNoMemory, "out of memory allocating a string copy to plug in a NUL byte" );
+            else
+            {
+                jstring jstr;
+
+                memmove ( copy, data, size );
+                copy [ size ] = 0;
+
+                jstr = ( ( * jenv ) -> NewStringUTF ) ( jenv, copy );
+
+                free ( copy );
+
+                return jstr;
+            }
+        }
+    }
+
+    /* something is really bad with the string */
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcString, rcConstructing );
+        RuntimeExceptionThrow ( jenv, ctx, __LINE__, "failed to make a String" );
+    }
+
+    /* should never reach here */
+    return NULL;
+}
+
+/* ConvertToJavaString
+ *  make a Java String from an NGS_String
+ */
+jstring NGS_StringConvertToJString ( NGS_String * self, ctx_t ctx, JNIEnv * jenv )
+{
+    jstring jstr = NGS_StringCopyToJString ( self, ctx, jenv );
+    NGS_StringRelease ( self, ctx );
+    return jstr;
+}
diff --git a/libs/ngs-jni/jni_String.h b/libs/ngs-jni/jni_String.h
new file mode 100644
index 0000000..4d750a5
--- /dev/null
+++ b/libs/ngs-jni/jni_String.h
@@ -0,0 +1,91 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_jni_String_
+#define _h_jni_String_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#include "jni.h"
+
+#include <stdarg.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_String;
+
+
+/*--------------------------------------------------------------------------
+ * JString
+ * NGS_String
+ */
+
+
+/* Make
+ *  make with string_printf format
+ */
+jstring JStringMake ( ctx_t ctx, JNIEnv * jenv, const char * fmt, ... );
+jstring JStringVMake ( ctx_t ctx, JNIEnv * jenv, const char * fmt, va_list args );
+
+
+/* Data
+ *  access Java String data
+ */
+const char * JStringData ( jstring jself, ctx_t ctx, JNIEnv * jenv );
+
+
+/* ReleaseData
+ *  release Java String data
+ */
+void JStringReleaseData ( jstring jself, ctx_t ctx, JNIEnv * jenv, const char * data );
+
+
+/* CopyToJString
+ *  copy a Java String from an NGS_String
+ */
+jstring NGS_StringCopyToJString ( struct NGS_String const * self, ctx_t ctx, JNIEnv * jenv  );
+
+
+/* ConvertToJavaString
+ *  make a Java String from an NGS_String
+ */
+jstring NGS_StringConvertToJString ( struct NGS_String * self, ctx_t ctx, JNIEnv * jenv );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_jni_ErrorMsg_ */
diff --git a/libs/ngs-py/Makefile b/libs/ngs-py/Makefile
new file mode 100644
index 0000000..f0bc3c0
--- /dev/null
+++ b/libs/ngs-py/Makefile
@@ -0,0 +1,87 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/ngs-py
+
+INT_LIBS = \
+	libngs-py
+
+EXT_LIBS = \
+
+ALL_LIBS = \
+	$(INT_LIBS) \
+	$(EXT_LIBS)
+
+include $(TOP)/build/Makefile.env
+
+INCDIRS += \
+	-I$(SRCDIR)/../ngs
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/all $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# ngs-py
+#
+$(ILIBDIR)/libngs-py: $(addprefix $(ILIBDIR)/libngs-py.,$(LIBX))
+
+NGS_PY_SRC = \
+	py_Manager
+
+NGS_PY_LIB = \
+
+NGS_PY_OBJ = \
+	$(addsuffix .$(LOBX),$(NGS_PY_SRC))
+
+
+$(ILIBDIR)/libngs-py.$(LIBX): $(NGS_PY_OBJ)
+	$(LD) --slib -o $@ $^
+
diff --git a/libs/ngs-py/py_Manager.c b/libs/ngs-py/py_Manager.c
new file mode 100644
index 0000000..182ee02
--- /dev/null
+++ b/libs/ngs-py/py_Manager.c
@@ -0,0 +1,218 @@
+#include "py_Manager.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <kfc/rc.h>
+
+#include <kfc/rsrc-global.h>
+
+#include "NGS_String.h"
+#include "NGS_ReadCollection.h"
+#include "NGS_ReferenceSequence.h"
+#include "NGS_Refcount.h"
+
+#include <kdb/manager.h> /* KDBManager */
+#include <kns/manager.h>
+#include <klib/ncbi-vdb-version.h> /* GetPackageVersion */
+#include "../klib/release-vers.h"
+
+#include <vfs/manager.h> /* VFSManager */
+#include <vfs/path.h> /* VPath */
+
+#include <assert.h>
+#include <string.h>
+
+static PY_RES_TYPE NGSErrorHandler(ctx_t ctx, char* pStrError, size_t nStrErrorBufferSize)
+{
+    char const* pszErrorDesc = WHAT();
+    assert(pStrError);
+    strncpy(pStrError, pszErrorDesc, nStrErrorBufferSize);
+    pStrError[nStrErrorBufferSize - 1] = '\n';
+    CLEAR();
+    return PY_RES_ERROR; /* TODO: return error (exception) type */
+}
+
+
+static bool have_user_version_string;
+
+static void set_app_version_string ( const char * app_version )
+{
+    // get a KNSManager
+    KNSManager * kns;
+    rc_t rc = KNSManagerMake ( & kns );
+    if ( rc == 0 )
+    {
+        have_user_version_string = true;
+        KNSManagerSetUserAgent ( kns, "ncbi-ngs.%V %s", RELEASE_VERS, app_version );
+        KNSManagerRelease ( kns );
+    }
+}
+
+LIB_EXPORT PY_RES_TYPE PY_NGS_Engine_SetAppVersionString(char const* app_version, char* pStrError, size_t nStrErrorBufferSize)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcMgr, rcUpdating );
+
+    set_app_version_string ( app_version );
+
+    if (FAILED())
+    {
+        return NGSErrorHandler(ctx, pStrError, nStrErrorBufferSize);
+    }
+
+    CLEAR();
+    return PY_RES_OK;
+}
+
+LIB_EXPORT PY_RES_TYPE PY_NGS_Engine_GetVersion(char const** pRet, char* pStrError, size_t nStrErrorBufferSize)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcMgr, rcUpdating );
+
+    char const* ret = GetPackageVersion();
+
+    if (FAILED())
+    {
+        return NGSErrorHandler(ctx, pStrError, nStrErrorBufferSize);
+    }
+
+    assert ( pRet != NULL );
+    *pRet = ret;
+
+    CLEAR();
+    return PY_RES_OK;
+}
+
+LIB_EXPORT PY_RES_TYPE PY_NGS_Engine_IsValid(char const* spec, int* pRet, char* pStrError, size_t nStrErrorBufferSize)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcMgr, rcAccessing );
+
+    int ret = false;
+
+    VFSManager * vfs = NULL;
+    rc_t rc = VFSManagerMake ( & vfs );
+
+    if ( rc == 0 )
+    {
+        VPath * path = NULL;
+        rc = VFSManagerMakePath ( vfs, & path, spec );
+
+        if ( rc == 0 )
+        {
+            const KDBManager * kdb = NULL;
+            rc = KDBManagerMakeRead ( & kdb, NULL );
+
+            if ( rc == 0 )
+            {
+                KPathType t = KDBManagerPathTypeVP ( kdb, path );
+                if (t == kptDatabase || t == kptTable)
+                {
+                    ret = true;
+                }
+
+                KDBManagerRelease ( kdb );
+                kdb = NULL;
+            }
+
+            VPathRelease ( path );
+            path = NULL;
+        }
+
+        VFSManagerRelease ( vfs );
+        vfs = NULL;
+    }
+
+    assert ( pRet != NULL );
+
+    *pRet = ret;
+
+    CLEAR();
+    return PY_RES_OK;
+}
+
+
+LIB_EXPORT PY_RES_TYPE PY_NGS_Engine_ReadCollectionMake(char const* spec, void** ppReadCollection, char* pStrError, size_t nStrErrorBufferSize)
+{
+    HYBRID_FUNC_ENTRY(rcSRA, rcMgr, rcConstructing);
+
+    void* pRet = NULL;
+
+    if ( ! have_user_version_string )
+        set_app_version_string ( "ncbi-ngs: unknown-application" );
+
+    pRet = (void*)NGS_ReadCollectionMake(ctx, spec);
+
+    if (FAILED())
+    {
+        return NGSErrorHandler(ctx, pStrError, nStrErrorBufferSize);
+    }
+
+    assert(pRet != NULL);
+    assert(ppReadCollection != NULL);
+
+    *ppReadCollection = pRet;
+
+    CLEAR();
+    return PY_RES_OK;
+}
+
+LIB_EXPORT PY_RES_TYPE PY_NGS_Engine_ReferenceSequenceMake(char const* spec, void** ppReadCollection, char* pStrError, size_t nStrErrorBufferSize)
+{
+    HYBRID_FUNC_ENTRY(rcSRA, rcMgr, rcConstructing);
+
+    void* pRet = NULL;
+
+    if ( ! have_user_version_string )
+        set_app_version_string ( "ncbi-ngs: unknown-application" );
+
+    pRet = (void*)NGS_ReferenceSequenceMake(ctx, spec);
+
+    if (FAILED())
+    {
+        return NGSErrorHandler(ctx, pStrError, nStrErrorBufferSize);
+    }
+
+    assert(pRet != NULL);
+    assert(ppReadCollection != NULL);
+
+    *ppReadCollection = pRet;
+
+    CLEAR();
+    return PY_RES_OK;
+}
+
+#if 0
+PY_RES_TYPE PY_NGS_Engine_RefcountRelease(void* pRefcount, char* pStrError, size_t nStrErrorBufferSize)
+{
+    HYBRID_FUNC_ENTRY(rcSRA, rcRefcount, rcReleasing);
+
+    NGS_RefcountRelease((NGS_Refcount*)pRefcount, ctx);
+
+    if (FAILED())
+    {
+        return NGSErrorHandler(ctx, pStrError, nStrErrorBufferSize);
+    }
+
+    CLEAR();
+    return PY_RES_OK;
+}
+
+PY_RES_TYPE PY_NGS_Engine_StringData(void const* pNGSString, char const** pRetBufPtr/* TODO: add new error return? */)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcString, rcAccessing );
+    assert(pRetBufPtr);
+    *pRetBufPtr = NGS_StringData(pNGSString, ctx);
+    return PY_RES_OK;
+}
+
+PY_RES_TYPE PY_NGS_Engine_StringSize(void const* pNGSString, size_t* pRetSize/*TODO: add new error return?*/)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcString, rcAccessing );
+    assert(pRetSize);
+    *pRetSize = NGS_StringSize(pNGSString, ctx);
+    return PY_RES_OK;
+}
+#endif
+
+
+
diff --git a/libs/ngs-py/py_Manager.h b/libs/ngs-py/py_Manager.h
new file mode 100644
index 0000000..e0cd90c
--- /dev/null
+++ b/libs/ngs-py/py_Manager.h
@@ -0,0 +1,27 @@
+#ifndef _Included_py_ngs_ncbi_Manager
+#define _Included_py_ngs_ncbi_Manager
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "py_ngs_defs.h"
+#include <stddef.h>
+
+LIB_EXPORT PY_RES_TYPE PY_NGS_Engine_SetAppVersionString(char const* app_version, char* pStrError, size_t nStrErrorBufferSize);
+LIB_EXPORT PY_RES_TYPE PY_NGS_Engine_GetVersion(char const** pRet, char* pStrError, size_t nStrErrorBufferSize);
+LIB_EXPORT PY_RES_TYPE PY_NGS_Engine_IsValid(char const* spec, int* pRet, char* pStrError, size_t nStrErrorBufferSize);
+LIB_EXPORT PY_RES_TYPE PY_NGS_Engine_ReadCollectionMake(char const* spec, void** ppReadCollection, char* pStrError, size_t nStrErrorBufferSize);
+LIB_EXPORT PY_RES_TYPE PY_NGS_Engine_ReferenceSequenceMake(char const* spec, void** ppReadCollection, char* pStrError, size_t nStrErrorBufferSize);
+/*
+These functions are not needed:
+*We don't export yet another string from engine
+
+LIB_EXPORT PY_RES_TYPE PY_NGS_Engine_RefcountRelease(void* pRefcount, char* pStrError, size_t nStrErrorBufferSize);
+PY_RES_TYPE PY_NGS_Engine_StringData(void const* pNGSString, char const** pRetBufPtr);
+PY_RES_TYPE PY_NGS_Engine_StringSize(void const* pNGSString, size_t* pRetSize);
+*/
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libs/ngs-py/py_ngs_defs.h b/libs/ngs-py/py_ngs_defs.h
new file mode 100644
index 0000000..e32eec7
--- /dev/null
+++ b/libs/ngs-py/py_ngs_defs.h
@@ -0,0 +1,15 @@
+/* py_ngs_defs.h */
+
+#ifndef _h_ngs_defs_
+#define _h_ngs_defs_
+
+#define PY_RES_TYPE   int
+#define PY_RES_OK     0
+#define PY_RES_ERROR  1
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif
+
diff --git a/libs/ngs/BAM_Alignment.c b/libs/ngs/BAM_Alignment.c
new file mode 100644
index 0000000..65618aa
--- /dev/null
+++ b/libs/ngs/BAM_Alignment.c
@@ -0,0 +1,657 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "CSRA1_Alignment.h"
+
+typedef struct BAM_Alignment BAM_Alignment;
+#define NGS_ALIGNMENT void
+
+#include "NGS_Alignment.h"
+
+#include "NGS_ReadCollection.h"
+
+#include <sysalloc.h>
+
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+
+#include <klib/printf.h>
+#include <klib/rc.h>
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include "NGS_Refcount.h"
+#include "NGS_String.h"
+
+#include <string.h>
+#include <limits.h>
+
+#include "BAM_Record.h"
+
+struct BAM_Alignment {
+    NGS_Alignment super;
+    struct BAM_Record *(*provider_f)(struct NGS_ReadCollection *, ctx_t);
+    struct NGS_ReadCollection *provider;
+    BAM_Record *cur;
+    bool primary;
+    bool secondary;
+};
+
+static void BAM_AlignmentWhack(void * const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    free(self->cur);
+    NGS_RefcountRelease(&self->provider->dad, ctx);
+}
+
+static NGS_String *BAM_AlignmentAlignmentId(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    (void)self;
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+static NGS_String * BAM_AlignmentReferenceSpec(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return NGS_StringMake(ctx, self->cur->RNAME, strlen(self->cur->RNAME));
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return NULL;
+}
+
+
+static int BAM_AlignmentMappingQuality(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return self->cur->MAPQ;
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return 0;
+}
+
+
+static NGS_String * BAM_AlignmentReferenceBases(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    (void)self;
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+
+static bool FindRG(void *const vp, ctx_t ctx, unsigned const ord, BAM_Record_Extra_Field const *const fld)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+
+    if (fld->tag[0] == 'R' && fld->tag[1] == 'G' && fld->val_type == 'Z') {
+        NGS_String **const prslt = vp;
+
+        *prslt = NGS_StringMakeCopy(ctx, fld->value->string, fld->elemcount);
+        return false; /* done */
+    }
+    return true; /* keep going */
+}
+
+static NGS_String * BAM_AlignmentReadGroup(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur) {
+        NGS_String *rslt = NULL;
+
+        BAM_Record_ForEachExtra(self->cur, ctx, FindRG, &rslt);
+        return rslt;
+    }
+    USER_ERROR(xcRowNotFound, "no current row");
+    return NULL;
+}
+
+
+static NGS_String * BAM_AlignmentReadId(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return self->cur->QNAME ? NGS_StringMake(ctx, self->cur->QNAME, strlen(self->cur->QNAME)) : NULL;
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return NULL;
+}
+
+
+typedef struct {
+    unsigned start;
+    unsigned length;
+} clipped_t;
+
+static clipped_t const get_clipping(BAM_Record const *rec)
+{
+    clipped_t rslt = { 0, rec->seqlen };
+
+    if (rec->ncigar > 0 && (rec->cigar[0] & 0x0F) == 4) {
+        unsigned const length = rec->cigar[0] >> 4;
+
+        rslt.start += length;
+        rslt.length -= length;
+    }
+    if (rec->ncigar > 1 && (rec->cigar[rec->ncigar - 1] & 0x0F) == 4) {
+        unsigned const length = rec->cigar[rec->ncigar - 1] >> 4;
+
+        rslt.length -= length;
+    }
+    return rslt;
+}
+
+static NGS_String * BAM_AlignmentClippedFragmentBases(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur) {
+        if (self->cur->seqlen) {
+            clipped_t const clipping = get_clipping(self->cur);
+            return NGS_StringMake(ctx, self->cur->SEQ + clipping.start, clipping.length);
+        }
+        return NULL;
+    }
+    USER_ERROR(xcRowNotFound, "no current row");
+    return NULL;
+}
+
+
+static NGS_String * BAM_AlignmentClippedFragmentQualities(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur) {
+        if (self->cur->seqlen && self->cur->QUAL[0] != -1) {
+            clipped_t const clipping = get_clipping(self->cur);
+            return NGS_StringMake(ctx, self->cur->QUAL + clipping.start, clipping.length);
+        }
+        return NULL;
+    }
+    USER_ERROR(xcRowNotFound, "no current row");
+    return NULL;
+}
+
+
+static bool BAM_AlignmentIsPrimary(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return (self->cur->FLAG & 0x0900) == 0 ? true : false;
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return false;
+}
+
+
+static int64_t BAM_AlignmentAlignmentPosition(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return self->cur->POS - 1;
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return -1;
+}
+
+
+static unsigned ComputeRefLen(size_t const count, uint32_t const cigar[])
+{
+    unsigned rslt = 0;
+    unsigned i;
+
+    for (i = 0; i < count; ++i) {
+        uint32_t const op = cigar[i];
+        unsigned const len = op >> 4;
+        int const code = op & 0x0F;
+
+        switch (code) {
+        case 0: /* M */
+        case 2: /* D */
+        case 3: /* N */
+        case 7: /* = */
+        case 8: /* X */
+            rslt += len;
+            break;
+        }
+    }
+    return rslt;
+}
+
+static uint64_t BAM_AlignmentAlignmentLength(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return ComputeRefLen(self->cur->ncigar, self->cur->cigar);
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return 0;
+}
+
+
+static bool BAM_AlignmentIsReversedOrientation(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return (self->cur->FLAG & 0x0010) == 0 ? false : true;
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return false;
+}
+
+
+static int BAM_AlignmentSoftClip(void *const vp, ctx_t ctx, bool left)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur) {
+        unsigned const end = left ? 0 : (self->cur->ncigar - 1);
+        uint32_t const op = self->cur->cigar[end];
+        int const code = op & 0x0F;
+        int const len = op >> 4;
+
+        return code == 4 ? len : 0;
+    }
+    USER_ERROR(xcRowNotFound, "no current row");
+    return false;
+}
+
+
+static uint64_t BAM_AlignmentTemplateLength(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return self->cur->TLEN;
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return 0;
+}
+
+
+static char const *FormatCIGAR(char *dst, char const OPCODE[], size_t const count, uint32_t const cigar[])
+{
+    uint32_t const *src = cigar + count;
+    unsigned i;
+    char *last_out;
+    char last_code = 0;
+    uint32_t last_len = 0;
+
+    last_out = dst;
+    for (i = 0; i < count; ++i) {
+        uint32_t const op = *--src;
+        char const code = OPCODE[op & 0x0F];
+        uint32_t const len1 = op >> 4;
+        uint32_t len = code == last_code ? ((dst = last_out), last_len + len1) : len1;
+
+        last_len = len;
+        last_code = code;
+        last_out = dst;
+        *--dst = code;
+        for ( ; ; ) {
+            *--dst = len % 10 + '0';
+            if ((len /= 10) == 0)
+                break;
+        }
+    }
+    return dst;
+}
+
+static NGS_String *CIGAR(ctx_t ctx, char const OPCODE[], size_t const count, uint32_t const cigar[])
+{
+    size_t const max = 10 * count;
+#if DEBUG
+    char buffer[max + 1];
+    buffer[max] = '\0';
+#else
+    char buffer[max];
+#endif
+    char *const endp = buffer + max;
+    char const *const rslt = FormatCIGAR(endp, OPCODE, count, cigar);
+    size_t const len = endp - rslt;
+
+    return NGS_StringMakeCopy(ctx, rslt, len);
+}
+
+static NGS_String *CIGAR_clipped(ctx_t ctx, char const OPCODE[], bool const clipped, size_t const count, uint32_t const cigar[])
+{
+    if (!clipped)
+        return CIGAR(ctx, OPCODE, count, cigar);
+    else {
+        char const first = cigar[0] & 0x0F;
+        char const last  = cigar[count - 1] & 0x0F;
+        unsigned const cfirst = (first == 4 || first == 5) ? 1 : 0;
+        unsigned const clast  = (last  == 4 || last  == 5) ? 1 : 0;
+
+        return CIGAR(ctx, OPCODE, count - cfirst - clast, &cigar[cfirst]);
+    }
+}
+
+static NGS_String * BAM_AlignmentShortCigar(void *const vp, ctx_t ctx, bool clipped)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return CIGAR_clipped(ctx, "MIDNSHPMM???????", clipped, self->cur->ncigar, self->cur->cigar);
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return NULL;
+}
+
+
+static NGS_String * BAM_AlignmentLongCigar(void *const vp, ctx_t ctx, bool clipped)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return CIGAR_clipped(ctx, "MIDNSHP=X???????", clipped, self->cur->ncigar, self->cur->cigar);
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return NULL;
+}
+
+
+static bool BAM_AlignmentHasMate(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return (self->cur->FLAG & 0x0001) == 0 ? false : true;
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return false;
+}
+
+
+static NGS_String * BAM_AlignmentMateAlignmentId(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    (void)self;
+    UNIMPLEMENTED();
+    return 0;
+}
+
+
+static void * BAM_AlignmentMateAlignment(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    (void)self;
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+
+static NGS_String * BAM_AlignmentMateReferenceSpec(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return self->cur->RNEXT ? NGS_StringMake(ctx, self->cur->RNEXT, strlen(self->cur->RNEXT)) : NULL;
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return NULL;
+}
+
+
+static bool BAM_AlignmentMateIsReversedOrientation(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur)
+        return (self->cur->FLAG & 0x0020) == 0 ? false : true;
+
+    USER_ERROR(xcRowNotFound, "no current row");
+    return false;
+}
+
+static bool BAM_AlignmentIsFirst(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur) {
+        bool const isMated = (self->cur->FLAG & 0x001) == 0 ? false : true;
+        bool const isFirst = (self->cur->FLAG & 0x040) == 0 ? false : true;
+        bool const isLast  = (self->cur->FLAG & 0x080) == 0 ? false : true;
+        return (isMated && isFirst && !isLast);
+    }
+    USER_ERROR(xcRowNotFound, "no current row");
+    return false;
+}
+
+
+/*--------------------------------------------------------------------------
+ * NGS_AlignmentIterator
+ */
+
+static bool ShouldSkip(BAM_Alignment const *const self)
+{
+    if (!self->cur->RNAME) /* not aligned */
+        return true;
+
+    if ((self->cur->FLAG & 0x0900) == 0 && !self->primary) /* is primary and don't want primary */
+        return true;
+
+    if ((self->cur->FLAG & 0x0900) != 0 && !self->secondary) /* is secondary and don't want secondary */
+        return true;
+
+    return false;
+}
+
+static bool BAM_AlignmentIteratorNext(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    do {
+        if (self->cur)
+            free(self->cur);
+        self->cur = self->provider_f(self->provider, ctx);
+        if (FAILED() || !self->cur)
+            break;
+    } while (ShouldSkip(self));
+
+    return self->cur != NULL;
+}
+
+
+static NGS_String * BAM_AlignmentFragmentGetId(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur) {
+        return self->cur->QNAME ? NGS_StringMake(ctx, self->cur->QNAME, strlen(self->cur->QNAME)) : NGS_StringMake(ctx, "", 0);
+    }
+    USER_ERROR(xcRowNotFound, "no current row");
+    return NULL;
+}
+
+
+static NGS_String * BAM_AlignmentFragmentGetBases(void *const vp, ctx_t ctx,
+                                                  uint64_t offset, uint64_t length)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur) {
+        if (offset + length < self->cur->seqlen) {
+            return NGS_StringMake(ctx, self->cur->SEQ + offset, length);
+        }
+        USER_ERROR(xcRowNotFound, "invalid offset or length");
+        return NULL;
+    }
+    USER_ERROR(xcRowNotFound, "no current row");
+    return NULL;
+}
+
+
+static NGS_String * BAM_AlignmentFragmentGetQualities(void *const vp, ctx_t ctx,
+                                                      uint64_t offset, uint64_t length)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    if (self->cur) {
+        if (offset + length < self->cur->seqlen) {
+            return NGS_StringMake(ctx, self->cur->QUAL + offset, length);
+        }
+        USER_ERROR(xcRowNotFound, "invalid offset or length");
+        return NULL;
+    }
+    USER_ERROR(xcRowNotFound, "no current row");
+    return NULL;
+}
+
+
+static bool BAM_AlignmentFragmentNext(void *const vp, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_Alignment *const self = (BAM_Alignment *)vp;
+
+    (void)self;
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+
+
+static NGS_Alignment_vt const vt =
+{
+    {
+        {
+            /* NGS_Refcount */
+            BAM_AlignmentWhack
+        },
+
+        /* NGS_Fragment */
+        BAM_AlignmentFragmentGetId,
+        BAM_AlignmentFragmentGetBases,
+        BAM_AlignmentFragmentGetQualities,
+        BAM_AlignmentFragmentNext
+    },
+
+    BAM_AlignmentAlignmentId,
+    BAM_AlignmentReferenceSpec,
+    BAM_AlignmentMappingQuality,
+    BAM_AlignmentReferenceBases,
+    BAM_AlignmentReadGroup,
+    BAM_AlignmentReadId,
+    BAM_AlignmentClippedFragmentBases,
+    BAM_AlignmentClippedFragmentQualities,
+    NULL,
+    BAM_AlignmentIsPrimary,
+    BAM_AlignmentAlignmentPosition,
+    BAM_AlignmentAlignmentLength,
+    BAM_AlignmentIsReversedOrientation,
+    BAM_AlignmentSoftClip,
+    BAM_AlignmentTemplateLength,
+    BAM_AlignmentShortCigar,
+    BAM_AlignmentLongCigar,
+    BAM_AlignmentHasMate,
+    BAM_AlignmentMateAlignmentId,
+    BAM_AlignmentMateAlignment,
+    BAM_AlignmentMateReferenceSpec,
+    BAM_AlignmentMateIsReversedOrientation,
+    BAM_AlignmentIsFirst,
+
+    /* Iterator */
+    BAM_AlignmentIteratorNext
+};
+
+static void BAM_AlignmentInit(BAM_Alignment *const self, ctx_t ctx, bool const primary, bool const secondary,
+                              struct BAM_Record *(*const provider_f)(struct NGS_ReadCollection *, ctx_t),
+                              struct NGS_ReadCollection *const provider)
+{
+    self->provider = provider;
+    self->provider_f = provider_f;
+    self->primary = primary;
+    self->secondary = secondary;
+}
+
+struct NGS_Alignment *BAM_AlignmentMake(ctx_t ctx, bool const primary, bool const secondary,
+                                        struct BAM_Record *(*const provider_f)(struct NGS_ReadCollection *, ctx_t),
+                                        struct NGS_ReadCollection *const provider,
+                                        char const name[])
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcReading);
+    void *self = calloc(1, sizeof(BAM_Alignment));
+    if (self) {
+        NGS_Alignment *const super = &((BAM_Alignment *)self)->super;
+
+        TRY(NGS_AlignmentInit(ctx, super, &vt, "BAM_Alignment", name)) {
+            TRY(BAM_AlignmentInit(self, ctx, primary, secondary, provider_f, provider)) {
+                return self;
+            }
+        }
+        free(self);
+    }
+    else {
+        SYSTEM_ABORT(xcNoMemory, "allocating BAM_Alignment ( '%s' )", name);
+    }
+    return NULL;
+}
diff --git a/libs/ngs/BAM_Alignment.h b/libs/ngs/BAM_Alignment.h
new file mode 100644
index 0000000..c819ade
--- /dev/null
+++ b/libs/ngs/BAM_Alignment.h
@@ -0,0 +1,58 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_csra1_alignment_
+#define _h_csra1_alignment_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+struct String;
+struct VCursor;
+struct NGS_Alignment;
+struct NGS_ReadCollection;
+struct BAM_Record;
+    
+extern
+struct NGS_Alignment *BAM_AlignmentMake(ctx_t, bool primary, bool secondary,
+            struct BAM_Record *(*provider)(struct NGS_ReadCollection *, ctx_t),
+            struct NGS_ReadCollection *,
+            char const name[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_csra1_alignment_ */
diff --git a/libs/ngs/BAM_ReadCollection.c b/libs/ngs/BAM_ReadCollection.c
new file mode 100644
index 0000000..4d07a10
--- /dev/null
+++ b/libs/ngs/BAM_ReadCollection.c
@@ -0,0 +1,1522 @@
+/* ===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <klib/rc.h>
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <kfs/file.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <klib/sort.h>
+
+#include <strtol.h> /* for strtoi64 */
+
+#include <stddef.h>
+#include <assert.h>
+#include <string.h>
+
+#include <sysalloc.h>
+
+#include <zlib.h>
+
+#define NGS_REFCOUNT void
+
+#include "NGS_ReadCollection.h"
+#include "NGS_ReadGroup.h"
+#include "NGS_Reference.h"
+#include "NGS_Alignment.h"
+#include "NGS_Read.h"
+#include "NGS_String.h"
+
+#include "BAM_Record.h"
+
+#define IO_BLK_SIZE (1024u * 1024u)
+#define BAM_BLK_MAX (64u * 1024u)
+
+typedef struct BAM_rec BAM_rec;
+struct BAM_rec {
+    struct {
+        uint8_t
+        refID[4],
+        pos[4],
+        bin_mq_nl[4],
+        flag_nc[4],
+        l_seq[4],
+        next_refID[4],
+        next_pos[4],
+        tlen[4],
+        readname[1];
+    } const *data;
+    void *allocated;
+    uint64_t pos;
+    size_t size;
+};
+
+#define MAX_INDEX_SEQ_LEN ((1u << 29) - 1)
+#define MAX_BIN  (37449u)
+#define NUMINTV ((MAX_INDEX_SEQ_LEN + 1) >> 14)
+
+typedef struct RefIndexBinInfo RefIndexBinInfo;
+struct RefIndexBinInfo {
+    unsigned offset, count;
+};
+
+typedef struct RefIndexChunk RefIndexChunk;
+struct RefIndexChunk {
+    uint64_t first /*, last */;
+};
+
+typedef struct RefIndex RefIndex;
+struct RefIndex {
+    uint64_t off_beg, off_end, n_mapped, n_unmapped;
+    uint32_t numintv, numchnk;
+    uint64_t interval[NUMINTV];
+    RefIndexBinInfo bins[MAX_BIN];
+    RefIndexChunk chunk[1];
+};
+
+typedef struct HeaderRefInfo HeaderRefInfo;
+struct HeaderRefInfo {
+    RefIndex *index;
+    char *name;
+    int32_t length;
+    int32_t ordinal;
+};
+
+typedef struct BAM_ReferenceInfo BAM_ReferenceInfo;
+struct BAM_ReferenceInfo {
+    int32_t count;
+    HeaderRefInfo ref[1];
+};
+
+typedef struct BAM_ReadCollection BAM_ReadCollection;
+struct BAM_ReadCollection
+{
+    NGS_ReadCollection dad;
+    struct KFile const *fp;
+    char *path;                     /* path used to open the BAM file       */
+    uint8_t *iobuffer;              /* raw io buffer, compressed BAM data   */
+
+    BAM_ReferenceInfo *references;
+    char *headerText;
+
+    uint64_t cpos;                  /* file position of iobuffer  */
+    uint64_t bpos;                  /* file position of bambuffer */
+    uint64_t fpos;                  /* file position of next read */
+    z_stream zs;
+
+    /* name is substr(path, namestart, namelen) */
+    unsigned namestart;
+    unsigned namelen;
+    unsigned bam_cur;               /* current offset in bambuffer */
+    
+    uint8_t bambuffer[BAM_BLK_MAX];
+};
+
+typedef struct BAM_Reference BAM_Reference;
+struct BAM_Reference
+{
+    NGS_Reference dad;
+    BAM_ReadCollection *parent;
+    int32_t cur;
+    int state;
+};
+
+typedef struct BAM_RefIndexSlice BAM_RefIndexSlice;
+struct BAM_RefIndexSlice
+{
+    NGS_Refcount dad;
+    BAM_ReadCollection *parent;
+    uint64_t start;
+    uint64_t end;
+    int32_t chunks;
+    int32_t cur;
+    unsigned refID;
+    uint64_t chunk[1];
+};
+
+extern NGS_Alignment *BAM_AlignmentMake(ctx_t, bool, bool, struct BAM_Record *(*)(NGS_Refcount *, ctx_t), NGS_Refcount *, char const *);
+
+static void BAM_ReferenceInfoWhack(BAM_ReferenceInfo *);
+
+static void BAM_ReadCollectionWhack(void *const object, ctx_t ctx) {
+    BAM_ReadCollection *const self = (BAM_ReadCollection *)object;
+    
+    if (self->references) {
+        BAM_ReferenceInfoWhack(self->references);
+        free(self->references);
+    }
+    free(self->headerText);
+    free(self->iobuffer);
+    free(self->path);
+    KFileRelease(self->fp);
+}
+
+static NGS_String * BAM_ReadCollectionName(NGS_ReadCollection *const vp, ctx_t ctx) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_ReadCollection *const self = (BAM_ReadCollection *)vp;
+
+    return NGS_StringMake(ctx, self->path + self->namestart, self->namelen);
+}
+
+static NGS_ReadGroup * BAM_ReadCollectionReadGroups(NGS_ReadCollection *const vp, ctx_t ctx) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+static NGS_ReadGroup * BAM_ReadCollectionReadGroup(NGS_ReadCollection *const vp, ctx_t ctx, char const spec[]) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+static NGS_String *BAM_ReferenceGetCommonName(NGS_Reference *const base, ctx_t ctx)
+{
+    BAM_Reference *const self = (BAM_Reference *)base;
+    char const *name = self->parent->references->ref[self->cur].name;
+    
+    return NGS_StringMakeCopy(ctx, name, strlen(name));
+}
+
+static NGS_String *BAM_ReferenceGetCanonicalName(NGS_Reference *const base, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    USER_ERROR(xcFunctionUnsupported, "not supported for SAM/BAM");
+    return NULL;
+}
+
+static bool BAM_ReferenceGetIsCircular(NGS_Reference const *const base, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    USER_ERROR(xcFunctionUnsupported, "not supported for SAM/BAM");
+    return NULL;
+}
+
+static uint64_t BAM_ReferenceGetLength(NGS_Reference *const base, ctx_t ctx)
+{
+    BAM_Reference *const self = (BAM_Reference *)base;
+    
+    return self->parent->references->ref[self->cur].length;
+}
+
+static NGS_String *BAM_ReferenceGetBases(NGS_Reference *const base, ctx_t ctx, uint64_t offset, uint64_t size)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    USER_ERROR(xcFunctionUnsupported, "not supported for SAM/BAM");
+    return NULL;
+}
+
+static NGS_String *BAM_ReferenceGetChunk(NGS_Reference *const base, ctx_t ctx, uint64_t offset, uint64_t size)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    USER_ERROR(xcFunctionUnsupported, "not supported for SAM/BAM");
+    return NULL;
+}
+
+static NGS_Alignment *BAM_ReferenceGetAlignment(NGS_Reference *const base, ctx_t ctx, char const spec[])
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    USER_ERROR(xcFunctionUnsupported, "not supported for SAM/BAM");
+    return NULL;
+}
+
+static NGS_Alignment *BAM_ReferenceGetAlignments(NGS_Reference *const base, ctx_t ctx, bool wants_primary, bool wants_secondary)
+{
+    BAM_Reference *const self = (BAM_Reference *)base;
+    HeaderRefInfo const *const ref = &self->parent->references->ref[self->cur];
+    
+    if (!wants_primary || !wants_secondary || ref->index == NULL) {
+        USER_ERROR(xcFunctionUnsupported, "not supported for unindexed BAM");
+        return 0;
+    }
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+static uint64_t BAM_ReferenceGetAlignmentCount(NGS_Reference const *const base, ctx_t ctx, bool wants_primary, bool wants_secondary)
+{
+    BAM_Reference const *const self = (BAM_Reference *)base;
+    HeaderRefInfo const *const ref = &self->parent->references->ref[self->cur];
+    
+    if (!wants_primary || !wants_secondary || ref->index == NULL) {
+        USER_ERROR(xcFunctionUnsupported, "not supported for unindexed BAM");
+        return 0;
+    }
+    return ref->index->n_mapped;
+}
+
+static int IndexSlice(RefIndex const *const self,
+                      uint64_t **rslt,
+                      unsigned const beg,
+                      unsigned const end);
+
+static BAM_Record *BAM_GetRecordSliced(NGS_Refcount *const self, ctx_t ctx);
+
+static void BAM_RefIndexSliceWhack(void *const object, ctx_t ctx)
+{
+    BAM_RefIndexSlice *const self = (BAM_RefIndexSlice *)object;
+    
+    NGS_RefcountRelease(&self->parent->dad.dad, ctx);
+}
+
+static NGS_Alignment *BAM_ReferenceGetAlignmentSlice(NGS_Reference *const object,
+                                                     ctx_t ctx,
+                                                     bool wants_primary,
+                                                     bool wants_secondary,
+                                                     uint64_t offset,
+                                                     uint64_t size)
+{
+    BAM_Reference *const self = (BAM_Reference *)object;
+
+    if (!wants_primary && !wants_secondary)
+EMPTY_ITERATOR: {
+        return NGS_AlignmentMakeNull(ctx, self->parent->path + self->parent->namestart, self->parent->namelen);
+    }
+    else {
+        HeaderRefInfo const *const ref = &self->parent->references->ref[self->cur];
+
+        if (ref->index == NULL) {
+            USER_ERROR(xcFunctionUnsupported, "not supported for unindexed BAM");
+            return 0;
+        }
+        if (offset > ref->length) {
+            goto EMPTY_ITERATOR;
+        }
+        if (offset + size > ref->length) {
+            size = ref->length - offset;
+        }
+        uint64_t *chunk;
+        int const chunks = IndexSlice(ref->index, &chunk, (uint32_t)offset, (uint32_t)(offset + size));
+        
+        if (chunks >= 0) {
+            BAM_RefIndexSlice *const slice = calloc(1, ((uint8_t const *)&((BAM_RefIndexSlice const *)NULL)->chunk[chunks]) - ((uint8_t const *)NULL));
+
+            if (slice) {
+                static NGS_Refcount_vt const vt = {
+                    BAM_RefIndexSliceWhack
+                };
+                
+                NGS_RefcountInit(ctx, &slice->dad, &vt, "BAM_RefIndexSlice", ref->name);
+                slice->parent = NGS_RefcountDuplicate(&self->parent->dad.dad, ctx);
+                slice->start = offset;
+                slice->end = offset + size;
+                slice->chunks = chunks;
+                slice->refID = self->cur;
+                if (chunks)
+                    memmove(slice->chunk, chunk, chunks * sizeof(*chunk));
+
+                free(slice);
+                
+                NGS_Alignment *const rslt = BAM_AlignmentMake(ctx, wants_primary, wants_secondary, BAM_GetRecordSliced,
+                                                              NGS_RefcountDuplicate(&self->dad.dad, ctx),
+                                                              self->parent->path + self->parent->namestart);
+                
+                return rslt;
+            }
+        }
+        USER_ABORT(xcNoMemory, "out of memory allocating index slice");
+        return NULL;
+    }
+}
+
+static struct NGS_Pileup *BAM_ReferenceGetPileups(NGS_Reference *const base, ctx_t ctx, bool wants_primary, bool wants_secondary)
+{
+    USER_ERROR(xcFunctionUnsupported, "not supported for SAM/BAM");
+    return NULL;
+}
+
+static void BAM_ReferenceWhack(void *const base, ctx_t ctx)
+{
+    BAM_Reference *const self = (BAM_Reference *)base;
+    
+    NGS_RefcountRelease(&self->parent->dad.dad, ctx);
+}
+
+bool BAM_ReferenceIteratorNext(NGS_Reference *const base, ctx_t ctx)
+{
+    BAM_Reference *const self = (BAM_Reference *)base;
+    
+    switch (self->state) {
+        case 0:
+            self->state = 1;
+        case 1:
+            ++self->cur;
+            if (self->cur < self->parent->references->count)
+                return true;
+            else
+                self->state = 2;
+        case 2:
+            break;
+        case 3:
+            USER_ERROR(xcCursorExhausted, "No more rows available");
+    }
+    return false;
+}
+
+BAM_Reference *BAM_ReferenceMake(BAM_ReadCollection *parent, ctx_t ctx, char const name[])
+{
+    static NGS_Reference_vt const vt =
+    {
+        /* NGS_Refcount */
+        { BAM_ReferenceWhack },
+        
+        /* NGS_Reference */
+        BAM_ReferenceGetCommonName,
+        BAM_ReferenceGetCanonicalName,
+        BAM_ReferenceGetIsCircular,
+        BAM_ReferenceGetLength,
+        BAM_ReferenceGetBases,
+        BAM_ReferenceGetChunk,
+        BAM_ReferenceGetAlignment,
+        BAM_ReferenceGetAlignments,
+        BAM_ReferenceGetAlignmentCount,
+        BAM_ReferenceGetAlignmentSlice,
+        BAM_ReferenceGetPileups,
+        
+        /* NGS_ReferenceIterator */
+        BAM_ReferenceIteratorNext,
+    };
+    FUNC_ENTRY(ctx, rcSRA, rcCursor, rcConstructing);
+    
+    BAM_Reference *const rslt = calloc(1, sizeof(*rslt));
+    if (rslt) {
+        NGS_RefcountInit(ctx, &rslt->dad.dad, &vt.dad, "BAM_Reference", name);
+        rslt->parent = (BAM_ReadCollection *)NGS_RefcountDuplicate(&parent->dad.dad, ctx);
+    }
+    else
+        SYSTEM_ABORT(xcNoMemory, "allocating BAM_Reference %u bytes", sizeof(*rslt));
+
+    return rslt;
+}
+
+static NGS_Reference * BAM_ReadCollectionReferences(NGS_ReadCollection *const vp, ctx_t ctx) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_ReadCollection *const self = (BAM_ReadCollection *)vp;
+    
+    BAM_Reference *const rslt = BAM_ReferenceMake(self, ctx, self->path + self->namestart);
+
+    return &rslt->dad;
+}
+
+static int32_t FindReference(BAM_ReadCollection const *const self, char const name[])
+{
+    int32_t i;
+    int32_t const n = self->references->count;
+    size_t const nlen = strlen(name);
+    
+    for (i = 0; i < n; ++i) {
+        char const *const fnd = self->references->ref[i].name;
+        size_t const flen = strlen(fnd);
+        
+        if (flen == nlen && strcase_cmp(name, nlen, fnd, nlen, (uint32_t)nlen) == 0)
+            return i;
+    }
+    return -1;
+}
+
+static NGS_Reference * BAM_ReadCollectionReference(NGS_ReadCollection *const vp, ctx_t ctx, char const spec[]) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_ReadCollection *const self = (BAM_ReadCollection *)vp;
+    
+    int32_t const fnd = FindReference(self, spec);
+    if (fnd >= 0) {
+        BAM_Reference *const rslt = BAM_ReferenceMake(self, ctx, self->path + self->namestart);
+
+        if (!FAILED()) {
+            rslt->state = 3;
+            rslt->cur = fnd;
+        }
+        return &rslt->dad;
+    }
+    else {
+        USER_ERROR(xcStringNotFound, "Read Group '%s' is not found", spec);
+        return NULL;
+    }
+}
+
+static NGS_Alignment * BAM_ReadCollectionAlignments(NGS_ReadCollection *const vp, ctx_t ctx, bool const wants_primary, bool const wants_secondary) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+    BAM_ReadCollection *const self = (BAM_ReadCollection *)vp;
+    
+    if (!wants_primary && !wants_secondary) {
+        return NGS_AlignmentMakeNull(ctx, self->path + self->namestart, self->namelen);
+    }
+    else {
+        NGS_Alignment *const rslt = BAM_AlignmentMake(ctx, wants_primary, wants_secondary, BAM_GetRecord, NGS_RefcountDuplicate(&self->dad.dad, ctx), self->path + self->namestart);
+        
+        return rslt;
+    }
+}
+
+static NGS_Alignment * BAM_ReadCollectionAlignment(NGS_ReadCollection *const vp, ctx_t ctx, char const alignmentIdStr[]) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+static uint64_t BAM_ReadCollectionAlignmentCount(NGS_ReadCollection *const vp, ctx_t ctx, bool const wants_primary, bool const wants_secondary) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+
+    UNIMPLEMENTED();
+    return 0;
+}
+
+static NGS_Alignment * BAM_ReadCollectionAlignmentRange(NGS_ReadCollection *const vp, ctx_t ctx, uint64_t const first, uint64_t const count, bool const wants_primary, bool const wants_secondary) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+static struct NGS_Read * BAM_ReadCollectionReads(NGS_ReadCollection *const vp, ctx_t ctx, bool const wants_full, bool const wants_partial, bool const wants_unaligned) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+static struct NGS_Read * BAM_ReadCollectionRead(NGS_ReadCollection *const vp, ctx_t ctx, char const readIdStr[]) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+static uint64_t BAM_ReadCollectionReadCount(NGS_ReadCollection *const vp, ctx_t ctx) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+
+    UNIMPLEMENTED();
+    return 0;
+}
+
+static struct NGS_Read * BAM_ReadCollectionReadRange(NGS_ReadCollection *const vp, ctx_t ctx, uint64_t const first, uint64_t const count, bool const wants_full, bool const wants_partial, bool const wants_unaligned) {
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcAccessing);
+
+    UNIMPLEMENTED();
+    return NULL;
+}
+
+static void *Alloc(ctx_t ctx, size_t const size, bool const clear)
+{
+    void *const rslt = clear ? calloc(1, size) : malloc(size);
+    
+    if (rslt == NULL) {
+        SYSTEM_ABORT(xcNoMemory, "allocating %u bytes", size);
+    }
+    return rslt;
+}
+
+static bool FillBuffer(BAM_ReadCollection *const self, ctx_t ctx, uint64_t const fpos)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcReading);
+    size_t nread;
+    rc_t const rc = KFileRead(self->fp, fpos,
+                              self->iobuffer,
+                              IO_BLK_SIZE, &nread);
+    
+    if (rc == 0) {
+        self->cpos = fpos;
+        self->fpos = fpos + nread;
+        self->zs.avail_in = (uInt)nread;
+        self->zs.next_in = (Bytef *)self->iobuffer;
+        
+        return true;
+    }
+
+    SYSTEM_ABORT(xcUnexpected, "reading '%s' rc = %R", self->path, rc);
+    return false;
+}
+
+static bool ReadZlib(BAM_ReadCollection *self, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcData, rcDecoding);
+    uint64_t const bpos = (self->cpos << 16) + (self->zs.next_in ? (self->zs.next_in - self->iobuffer) : 0);
+    int zrc;
+
+    self->zs.next_out = self->bambuffer;
+    self->zs.avail_out = BAM_BLK_MAX;
+    self->zs.total_out = 0;
+    self->bam_cur = 0;
+
+    if (self->zs.avail_in == 0) {
+FILL_BUFFER:
+        FillBuffer(self, ctx, self->fpos);
+        if (self->zs.avail_in == 0) /* EOF */
+            return true;
+    }
+    zrc = inflate(&self->zs, Z_FINISH);
+    if (zrc == Z_STREAM_END) {
+        /* inflateReset clobbers this value but we want it */
+        uLong const total_out = self->zs.total_out;
+        
+        zrc = inflateReset(&self->zs);
+        assert(zrc == Z_OK);
+        self->zs.total_out = total_out;
+        self->bpos = bpos;
+        return true;
+    }
+    if (zrc != Z_OK && zrc != Z_BUF_ERROR) {
+        INTERNAL_ABORT(xcUnexpected, "reading '%s' zrc = %i, message = '%s'",
+                       self->path, zrc, self->zs.msg);
+        return false;
+    }
+    assert(self->zs.avail_in == 0);
+    goto FILL_BUFFER;
+}
+
+static void Seek(BAM_ReadCollection *self, ctx_t ctx, uint64_t const ipos)
+{
+    uint64_t const fpos = (uint64_t)(ipos / BAM_BLK_MAX);
+    unsigned const bpos = (unsigned)(ipos % BAM_BLK_MAX);
+    
+    if (fpos < self->cpos || fpos >= self->fpos || self->zs.next_in == NULL) {
+        uint64_t const fudg = fpos % IO_BLK_SIZE;
+        
+        FillBuffer(self, ctx, fpos - fudg);
+        if ((unsigned)self->zs.avail_in < fudg)
+            return;
+        self->zs.next_in += fudg;
+        self->zs.avail_in -= fudg;
+        self->zs.total_out = 0;
+    }
+    if (self->zs.total_out <= bpos)
+        ReadZlib(self, ctx);
+
+    self->bam_cur = bpos;
+}
+
+static size_t ReadN(BAM_ReadCollection *self, ctx_t ctx, size_t const N, void *Dst)
+{
+    uint8_t *const dst = Dst;
+    size_t n = 0;
+    
+    while (n < N) {
+        size_t const avail_out = N - n;
+        size_t const avail_in = self->zs.total_out - self->bam_cur;
+
+        if (avail_in) {
+            size_t const copy = avail_out < avail_in ? avail_out : avail_in;
+            
+            memmove(dst + n, self->bambuffer + self->bam_cur, copy);
+            self->bam_cur += copy;
+            n += copy;
+            if (n == N)
+                break;
+        }
+        if (!ReadZlib(self, ctx) || self->zs.total_out == 0)
+            break;
+    }
+    return n;
+}
+
+static uint16_t LE2UInt16(void const *src)
+{
+#if BYTE_ORDER == LITTLE_ENDIAN
+    union {
+        uint8_t ch[2];
+        uint16_t u16;
+    } u;
+    memmove(&u, src, 2);
+    return u.u16;
+#else
+    return ((uint16_t)((uint8_t const *)src)[0]) | (((uint16_t)((uint8_t const *)src)[1]) << 8);
+#endif
+}
+
+static uint32_t LE2UInt32(void const *src)
+{
+#if BYTE_ORDER == LITTLE_ENDIAN
+    union {
+        uint8_t ch[4];
+        uint32_t u32;
+    } u;
+    memmove(&u, src, 4);
+    return u.u32;
+#else
+    return (uint32_t)(LE2UInt16(src)) || (((uint32_t)(LE2UInt16(((uint8_t const *)src) + 2))) << 16);
+#endif
+}
+
+static uint64_t LE2UInt64(void const *src)
+{
+#if BYTE_ORDER == LITTLE_ENDIAN
+    union {
+        uint8_t ch[8];
+        uint64_t u64;
+    } u;
+    memmove(&u, src, 8);
+    return u.u64;
+#else
+    return (uint64_t)(LE2UInt32(src)) || (((uint64_t)(LE2UInt32(((uint8_t const *)src) + 4))) << 32);
+#endif
+}
+
+static int16_t LE2Int16(void const *src)
+{
+    return (int16_t)LE2UInt16(src);
+}
+
+static int32_t LE2Int32(void const *src)
+{
+    return (int32_t)LE2UInt32(src);
+}
+
+static int32_t ReadI32(BAM_ReadCollection *self, ctx_t ctx)
+{
+    int8_t ch[4];
+    size_t const n = ReadN(self, ctx, 4, ch);
+    
+    if (FAILED())
+        return 0;
+    
+    if (n == 4)
+        return LE2Int32(ch);
+    
+    if (n)
+        USER_ERROR(xcUnexpected, "reading '%s'; premature end of file", self->path);
+    
+    return 0;
+}
+
+static uint32_t ReadU32(BAM_ReadCollection *self, ctx_t ctx)
+{
+    return (uint32_t)ReadI32(self, ctx);
+}
+
+static int32_t get_refID(BAM_rec const *const rec)
+{
+    return LE2Int32(rec->data->refID);
+}
+
+static int32_t get_pos(BAM_rec const *const rec)
+{
+    return LE2Int32(rec->data->pos);
+}
+
+static uint8_t get_mq(BAM_rec const *const rec)
+{
+    return rec->data->bin_mq_nl[1];
+}
+
+static uint8_t get_nl(BAM_rec const *const rec)
+{
+    return rec->data->bin_mq_nl[0];
+}
+
+static uint16_t get_flag(BAM_rec const *const rec)
+{
+    return LE2Int16(&rec->data->flag_nc[2]);
+}
+
+static uint16_t get_nc(BAM_rec const *const rec)
+{
+    return LE2Int16(&rec->data->flag_nc[0]);
+}
+
+static int32_t get_lseq(BAM_rec const *const rec)
+{
+    return LE2Int32(rec->data->l_seq);
+}
+
+static int32_t get_next_refID(BAM_rec const *const rec)
+{
+    return LE2Int32(rec->data->next_refID);
+}
+
+static int32_t get_next_pos(BAM_rec const *const rec)
+{
+    return LE2Int32(rec->data->next_pos);
+}
+
+static int32_t get_tlen(BAM_rec const *const rec)
+{
+    return LE2Int32(rec->data->tlen);
+}
+
+static bool ReadBAMRecord(BAM_ReadCollection *const self, ctx_t ctx, BAM_rec out[1])
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcOpening);
+    memset(out, 0, sizeof(out[0]));
+    TRY(int32_t const datasize = ReadI32(self, ctx)) {
+        if (datasize < 0) {
+            USER_ABORT(xcUnexpected, "reading '%s', BAM record size < 0", self->path);
+            return false;
+        }
+        if (datasize == 0)  /* EOF */
+            return false;
+
+        out[0].pos = (self->bpos << 16) | ((uint16_t)self->bam_cur - 4);
+        if (datasize <= 32) {
+            USER_ABORT(xcUnexpected, "reading '%s', BAM record too small, only %u bytes", self->path, (unsigned)datasize);
+            return false;
+        }
+        out[0].size = datasize;
+        if (self->bam_cur + datasize <= self->zs.total_out) {
+            out[0].data = (void const *)(self->bambuffer + self->bam_cur);
+            self->bam_cur += datasize;
+            return true;
+        }
+        /* this probably never happens; it might even be an error */
+        TRY(void *const tmp = Alloc(ctx, datasize, false)) {
+            if (datasize != ReadN(self, ctx, datasize, tmp) && !FAILED()) {
+                free(tmp);
+                USER_ERROR(xcUnexpected, "reading '%s'; premature end of file", self->path);
+                return false;
+            }
+            out[0].data = out[0].allocated = tmp;
+            return true;
+        }
+    }
+    return false;
+}
+
+static void CopyCIGAR(uint32_t dst[], uint32_t const src[], unsigned const count)
+{
+    unsigned i;
+    
+    for (i = 0; i < count; ++i) {
+        uint32_t const value = LE2Int32(src + i);
+        
+        dst[i] = value;
+    }
+}
+
+static void CopySEQ(char dst[], uint8_t const src[], unsigned const count)
+{
+    static char const tr[16] = "=ACMGRSVTWYHKDBN";
+    unsigned i;
+    unsigned const n = count >> 1;
+    
+    for (i = 0; i < n; ++i) {
+        uint8_t const value = src[i];
+        uint8_t const lo = value & 0x0F;
+        uint8_t const hi = value >> 4;
+        
+        dst[2 * i + 0] = tr[hi];
+        dst[2 * i + 1] = tr[lo];
+    }
+    if (count & 1) {
+        uint8_t const value = src[n];
+        uint8_t const hi = value >> 4;
+        
+        dst[count - 1] = tr[hi];
+    }
+}
+
+static void CopyQUAL(char dst[], uint8_t const src[], unsigned const n)
+{
+    unsigned i;
+    
+    for (i = 0; i < n; ++i) {
+        int const ch = src[i] + 33;
+        
+        dst[i] = ch < 0xFF ? ch : -1;
+    }
+}
+
+BAM_Record *BAM_GetRecord(NGS_Refcount *const object, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcOpening);
+    BAM_ReadCollection *const self = (BAM_ReadCollection *)object;
+    BAM_rec raw;
+    
+    if (ReadBAMRecord(self, ctx, &raw)) {
+        BAM_Record *rslt = NULL;
+        bool self_unmapped = false;
+        bool mate_unmapped = false;
+        uint16_t const flag = get_flag(&raw);
+        uint16_t const raw_nc = get_nc(&raw);
+        int32_t const refID = get_refID(&raw);
+        int32_t const pos = get_pos(&raw);
+        int32_t const next_refID = get_next_refID(&raw);
+        int32_t const next_pos = get_next_pos(&raw);
+        
+        if ((flag & 0x0004) != 0 || 0 > refID || refID >= self->references->count || pos < 0 || raw_nc == 0)
+            self_unmapped = true;
+        if ((flag & 0x0001) == 0 || (flag & 0x0008) != 0 || 0 > next_refID || next_refID >= self->references->count || next_pos < 0)
+            mate_unmapped = true;
+        {
+            uint8_t const raw_nl = get_nl(&raw);
+            unsigned const nl = raw_nl < 2 ? 0 : raw_nl;
+            unsigned const nc = self_unmapped ? 0 : raw_nc;
+            unsigned const sl = get_lseq(&raw);
+            char const *read_name = (void const *)raw.data->readname;
+            uint32_t const *cigar = (void const *)(&read_name[nl]);
+            uint8_t const *seq    = (void const *)(&cigar[nc]);
+            uint8_t const *qual   = (void const *)(&seq[(sl + 1) >> 1]);
+            uint8_t const *extra  = (void const *)(&qual[sl]);
+            size_t const extralen = &raw.data->refID[raw.size] - extra;
+            size_t const need = (uint8_t const *)&(((BAM_Record const *)NULL)->cigar[nc]) - ((uint8_t const *)NULL) + 2 * sl + nl + extralen;
+
+            rslt = Alloc(ctx, need, false);
+            rslt->seqlen   = sl;
+            rslt->ncigar   = nc;
+            rslt->extralen = (unsigned)extralen;
+            rslt->SEQ      = (void const *)&rslt->cigar[nc];
+            rslt->QUAL     = (void const *)&rslt->SEQ[sl];
+            rslt->QNAME    = (void const *)&rslt->QUAL[sl];
+            rslt->extra    = (void const *)&rslt->QNAME[nl];
+            if (nl == 0)
+                rslt->QNAME = NULL;
+            
+            rslt->TLEN = get_tlen(&raw);
+            rslt->FLAG = flag;
+            rslt->MAPQ = get_mq(&raw);
+            if (self_unmapped) {
+                rslt->POS = 0;
+                rslt->RNAME = NULL;
+                rslt->REFID = -1;
+            }
+            else {
+                rslt->POS = pos + 1;
+                rslt->REFID = refID;
+                rslt->RNAME = self->references->ref[refID].name;
+            }
+            if (mate_unmapped) {
+                rslt->PNEXT = 0;
+                rslt->RNEXT = NULL;
+            }
+            else {
+                rslt->PNEXT = next_pos + 1;
+                rslt->RNEXT = self->references->ref[next_refID].name;
+            }
+
+            memmove((void *)rslt->extra, extra, extralen);
+            CopySEQ((void *)rslt->SEQ, seq, sl);
+            CopyQUAL((void *)rslt->QUAL, qual, sl);
+            
+            if (nl)
+                memmove((void *)rslt->QNAME, read_name, nl);
+
+            if (!self_unmapped)
+                CopyCIGAR((void *)rslt->cigar, cigar, nc);
+        }
+        free(raw.allocated);
+        return rslt;
+    }
+    return NULL;
+}
+
+static unsigned ComputeRefLen(size_t const count, uint32_t const cigar[])
+{
+    unsigned rslt = 0;
+    unsigned i;
+    
+    for (i = 0; i < count; ++i) {
+        uint32_t const op = cigar[i];
+        unsigned const len = op >> 4;
+        int const code = op & 0x0F;
+        
+        switch (code) {
+            case 0: /* M */
+            case 2: /* D */
+            case 3: /* N */
+            case 7: /* = */
+            case 8: /* X */
+                rslt += len;
+                break;
+        }
+    }
+    return rslt;
+}
+
+static BAM_Record *BAM_GetRecordSliced(NGS_Refcount *const object, ctx_t ctx)
+{
+    BAM_RefIndexSlice *const self = (BAM_RefIndexSlice *)object;
+    
+    if (self->chunk == NULL || self->chunks == self->cur)
+        return NULL;
+    for ( ; ; ) {
+        BAM_Record *const rec = BAM_GetRecord(&self->parent->dad.dad, ctx);
+        bool done = true;
+
+        if (rec) do {
+            if (rec->POS > 0) {
+                if (rec->REFID != self->refID)
+                    break;
+                
+                uint64_t const pos = rec->POS - 1;
+                if (pos >= self->end)
+                    break;
+
+                unsigned const reflen = ComputeRefLen(rec->ncigar, rec->cigar);
+                if (pos + reflen > self->start)
+                    return rec;
+
+                if (self->cur + 1 >= self->chunks)
+                    break;
+                
+                Seek(self->parent, ctx, self->chunk[++self->cur]);
+            }
+            done = false;
+        } while (0);
+        free(rec);
+        if (done)
+            return NULL;
+    }
+}
+
+static unsigned CountWhereLess(uint64_t const max,
+                               unsigned const N,
+                               RefIndexChunk const chunk[])
+{
+    if (max) {
+        unsigned count = 0;
+        unsigned i;
+        
+        for (i = 0; i < N; ++i) {
+            if (chunk[i].first < max)
+                ++count;
+        }
+        return count;
+    }
+    else
+        return N;
+}
+
+static unsigned CopyWhereLess(uint64_t rslt[], uint64_t const max,
+                              unsigned const N, RefIndexChunk const chunk[])
+{
+    if (max) {
+        unsigned count = 0;
+        unsigned i;
+        
+        for (i = 0; i < N; ++i) {
+            uint64_t const first = chunk[i].first;
+            
+            if (first < max) {
+                rslt[count] = first;
+                ++count;
+            }
+        }
+        return count;
+    }
+    else {
+        unsigned i;
+        
+        for (i = 0; i < N; ++i)
+            rslt[i] = chunk[i].first;
+        
+        return N;
+    }
+}
+
+static void SortPositions(unsigned const N, uint64_t array[])
+{
+#define SAVE(A) uint64_t const tmp = array[A]
+#define LOAD(A) ((void)(array[A] = tmp))
+#define COPY(DST, SRC) ((void)(array[(DST)] = array[(SRC)]))
+#define LESS(A, B) (array[A] < array[B])
+    ELEMSORT(N);
+#undef SAVE
+#undef LOAD
+#undef COPY
+#undef LESS
+}
+
+static int IndexSlice(RefIndex const *const self,
+                      uint64_t **rslt,
+                      unsigned const beg,
+                      unsigned const end)
+{
+    unsigned const first[] = { 1, 9, 73, 585, 4681 };
+    unsigned const cnt = end - 1 - beg;
+    unsigned const maxintvl = (end >> 14) + 1;
+    uint64_t const maxpos = maxintvl < self->numintv ?
+                            self->interval[maxintvl] : self->off_end;
+    unsigned int_beg[5], int_cnt[5];
+    unsigned i;
+    unsigned count = CountWhereLess(maxpos, self->bins[0].count,
+                                    &self->chunk[self->bins[0].offset]);
+    
+    for (i = 0; i < 5; ++i) {
+        unsigned const shift = 14 + 3 * (4 - i);
+        
+        int_beg[i] = (beg >> shift) + first[i];
+        int_cnt[i] = (cnt >> shift) + 1;
+    }
+    for (i = 0; i < 5; ++i) {
+        unsigned const beg = int_beg[i];
+        unsigned const N = int_cnt[i];
+        unsigned j;
+        
+        for (j = 0; j < N; ++j) {
+            RefIndexBinInfo const bin = self->bins[beg + j];
+            
+            count += CountWhereLess(maxpos, bin.count, &self->chunk[bin.offset]);
+        }
+    }
+    if (count == 0)
+        return 0;
+    else {
+        uint64_t array[count];
+        unsigned j = CopyWhereLess(array, maxpos, self->bins[0].count,
+                                   &self->chunk[self->bins[0].offset]);
+
+        for (i = 0; i < 5; ++i) {
+            unsigned const beg = int_beg[i];
+            unsigned const N = int_cnt[i];
+            unsigned ii;
+            
+            for (ii = 0; ii < N; ++ii) {
+                RefIndexBinInfo const bin = self->bins[beg + ii];
+                unsigned const copied = CopyWhereLess(&array[j], maxpos,
+                                                      bin.count,
+                                                      &self->chunk[bin.offset]);
+                
+                j += copied;
+            }
+        }
+        SortPositions(count, array);
+
+        if ((*rslt = malloc(count * sizeof(array[0]))) == NULL)
+            return -1;
+
+        memmove(*rslt, array, count * sizeof(array[0]));
+        return count;
+    }
+}
+
+static void LoadIndex_Bins(RefIndex *const self,
+                           unsigned const N, char const data[])
+{
+    unsigned i;
+    unsigned j = 0;
+    size_t offset = 0;
+    
+    for (i = 0; i < N; ++i) {
+        uint32_t const bin    = LE2UInt32(data + offset + 0);
+        int32_t  const n_chunk = LE2Int32(data + offset + 4);
+        
+        if (bin == MAX_BIN && n_chunk == 2) {
+            uint64_t const off_beg    = LE2UInt64(data + offset +  8);
+            uint64_t const off_end    = LE2UInt64(data + offset + 16);
+            uint64_t const n_mapped   = LE2UInt64(data + offset + 24);
+            uint64_t const n_unmapped = LE2UInt64(data + offset + 32);
+            
+            self->off_beg    = off_beg;
+            self->off_end    = off_end;
+            self->n_mapped   = n_mapped;
+            self->n_unmapped = n_unmapped;
+        }
+        else if (bin < MAX_BIN) {
+            unsigned ii;
+            
+            self->bins[bin].count = n_chunk;
+            self->bins[bin].offset = j;
+            for (ii = 0; ii < n_chunk; ++ii) {
+                uint64_t const beg = LE2UInt64(data + offset + 16 * ii +  8);
+             /* uint64_t const end = LE2UInt64(data + offset + 16 * ii + 16); */
+                
+                self->chunk[j + ii].first = beg;
+             /* self->chunk[j + ii].last  = end; */
+            }
+            j += n_chunk;
+        }
+        offset += 8 + 16 * n_chunk;
+    }
+    self->numchnk = j;
+}
+
+static void LoadIndex_Intervals(RefIndex *const self,
+                                unsigned const N, char const data[])
+{
+    uint64_t last = 0;
+    unsigned i;
+    
+    for (i = 0; i < N; ++i) {
+        uint64_t const intvl = LE2UInt64(data + 8 * i);
+        
+        self->interval[i] = intvl == last ? 0 : intvl;
+        last = intvl;
+    }
+    while (i > 0 && self->interval[i - 1] == 0)
+        --i;
+    self->numintv = i;
+}
+
+static size_t LoadIndex_3(HeaderRefInfo *const self, char const data[],
+                          void const *const endp)
+{
+    if ((void const *)(data + 4) < endp) {
+        int32_t const n_bin = LE2Int32(data);
+        unsigned chunks = 0;
+        size_t offset = 4;
+        unsigned i;
+        
+        if (n_bin < 0)
+            return 0;
+        
+        for (i = 0; i < n_bin; ++i) {
+            if ((void const *)(data + offset + 8) < endp) {
+                int32_t const n_chunk = LE2Int32(data + offset + 4);
+                
+                if (n_chunk < 0)
+                    return 0;
+                
+                chunks += n_chunk;
+                offset += 8 + 16 * n_chunk;
+                continue;
+            }
+            return 0;
+        }
+        if ((void const *)(data + offset + 4) < endp) {
+            int32_t const n_intv = LE2Int32(data + offset);
+            
+            if ((void const *)(data + offset + 4 + n_intv * 8) <= endp) {
+                self->index = calloc(1, ((uint8_t const *)&((RefIndex const *)NULL)->chunk[chunks])-((uint8_t const *)NULL));
+                if (self->index) {
+                    LoadIndex_Bins(self->index, n_bin, data + 4);
+                    LoadIndex_Intervals(self->index, n_intv, data + offset + 4);
+
+                    return offset + 4 + n_intv * 8;
+                }
+            }
+        }
+    }
+    return 0;
+}
+
+static void LoadIndex_2(BAM_ReadCollection *const self, ctx_t ctx,
+                        size_t const datasize, char const data[])
+{
+    void const *const endp = data + datasize;
+    
+    if (datasize >= 8 && memcmp(data, "BAI\1", 4) == 0) {
+        int32_t const n_ref = LE2Int32(data + 4);
+        
+        if (n_ref == self->references->count) {
+            size_t offset = 8;
+            unsigned i;
+            
+            for (i = 0; i < n_ref; ++i) {
+                size_t const size = LoadIndex_3(&self->references->ref[i], data + offset, endp);
+                
+                if (size == 0)
+                    goto BAD;
+                
+                offset += size;
+            }
+        }
+    }
+    return;
+    
+BAD:
+    {
+        unsigned i;
+    
+        for (i = 0; i < self->references->count; ++i) {
+            free(self->references->ref[i].index);
+            self->references->ref[i].index = NULL;
+        }
+    }
+}
+
+static rc_t OpenIndex(KFile const **const rslt, char const basename[])
+{
+    KDirectory *dir;
+    rc_t rc = KDirectoryNativeDir(&dir);
+    
+    if (rc == 0) {
+        rc = KDirectoryOpenFileRead(dir, rslt, "%s.bai", basename);
+        KDirectoryRelease(dir);
+    }
+    return rc;
+}
+
+static void LoadIndex(BAM_ReadCollection *const self, ctx_t ctx)
+{
+    KFile const *fp;
+    rc_t rc = OpenIndex(&fp, self->path);
+    
+    if (rc == 0) {
+        uint64_t fsize;
+        size_t nread;
+        char *data;
+        
+        rc = KFileSize(fp, &fsize);
+        data = malloc(fsize);
+        if (data) {
+            rc = KFileReadAll(fp, 0, data, fsize, &nread);
+            if (rc == 0 && nread == fsize) {
+                LoadIndex_2(self, ctx, fsize, data);
+            }
+            free(data);
+        }
+        KFileRelease(fp);
+    }
+}
+
+static void BAM_ReferenceInfoWhack(BAM_ReferenceInfo *const self)
+{
+    unsigned i;
+
+    for (i = 0; i < self->count; ++i) {
+        free(self->ref[i].name);
+        free(self->ref[i].index);
+    }
+}
+
+static void LoadHeaderRefs(BAM_ReadCollection *const self, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcOpening);
+    unsigned i;
+    unsigned const nrefs = self->references->count;
+    HeaderRefInfo *const ref = &self->references->ref[0];
+    
+    for (i = 0; i < nrefs; ++i) {
+        TRY(uint32_t const namelen = ReadU32(self, ctx)) {
+            if (namelen > INT32_MAX) {
+                USER_ERROR(xcUnexpected, "reading '%s', reference name length < 0", self->path);
+                break;
+            }
+            ref[i].ordinal = i;
+            ON_FAIL(ref[i].name = Alloc(ctx, namelen, false)) break;
+            ON_FAIL(ReadN(self, ctx, namelen, ref[i].name)) break;
+            ON_FAIL(ref[i].length = ReadU32(self, ctx)) break;
+        }
+        else
+            break;
+    }
+    if (FAILED()) {
+        BAM_ReferenceInfoWhack(self->references);
+    }
+}
+
+static void ReadHeaderRefs(BAM_ReadCollection *const self, ctx_t ctx, char text[], unsigned const lines, unsigned const ends[])
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcOpening);
+    TRY(uint32_t const nrefs = ReadU32(self, ctx)) {
+        if (nrefs > INT32_MAX) {
+            USER_ERROR(xcUnexpected, "reading '%s', reference count < 0", self->path);
+            return;
+        }
+        TRY(self->references = Alloc(ctx, ((uint8_t const *)&(((BAM_ReferenceInfo const *)NULL)->ref[nrefs]))-((uint8_t const *)NULL), true)) {
+            self->references->count = nrefs;
+            TRY(LoadHeaderRefs(self, ctx)) {
+                return;
+            }
+            free(self->references);
+            self->references = NULL;
+        }
+    }
+}
+
+static char *ReadHeaderText(BAM_ReadCollection *const self, ctx_t ctx, size_t *const length)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcOpening);
+    TRY(uint32_t const textlen = ReadU32(self, ctx)) {
+        if (textlen > INT32_MAX) {
+            USER_ERROR(xcUnexpected, "reading '%s', header length < 0", self->path);
+        }
+        else if (textlen > 0) {
+            TRY(char *const text = Alloc(ctx, textlen, false)) {
+                if (textlen == ReadN(self, ctx, textlen, text) && !FAILED()) {
+                    *length = textlen;
+                    return text;
+                }
+                free(text);
+            }
+        }
+    }
+    *length = 0;
+    return NULL;
+}
+
+static bool HeaderCheckSignature(BAM_ReadCollection *const self, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcOpening);
+    static char const sig[4] = "BAM\1";
+    char act[4];
+    
+    if (ReadN(self, ctx, 4, act) == 4)
+        return memcmp(sig, act, 4) == 0;
+    return false;
+}
+
+static void ReadHeader(BAM_ReadCollection *self, ctx_t ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcOpening);
+
+    if (HeaderCheckSignature(self, ctx)) {
+        size_t textlen;
+        TRY(char *const text = ReadHeaderText(self, ctx, &textlen)) {
+            self->headerText = text;
+            ReadHeaderRefs(self, ctx, NULL, 0, NULL);
+        }
+    }
+    else {
+        USER_ERROR(xcUnexpected, "reading '%s', invalid BAM signature", self->path);
+    }
+}
+
+static KDirectory *GetCWD(ctx_t ctx)
+{
+    KDirectory *dir;
+    rc_t const rc = KDirectoryNativeDir(&dir);
+    if (rc) {
+        INTERNAL_ABORT(xcUnexpected, "KDirectoryNativeDir failed rc = %R", rc);
+        return NULL;
+    }
+    return dir;
+}
+
+static KFile const *OpenRead(ctx_t ctx, char const path[])
+{
+    KFile const *fp = NULL;
+    TRY(KDirectory *const dir = GetCWD(ctx))
+    {
+        rc_t const rc = KDirectoryOpenFileRead(dir, &fp, path);
+        
+        KDirectoryRelease(dir);
+        if (rc) {
+            USER_ERROR(xcUnexpected, "'%s' failed to open for read rc = %R", path, rc);
+            return NULL;
+        }
+    }
+    return fp;
+}
+
+static void *AllocIOBuffer(ctx_t ctx)
+{
+    return Alloc(ctx, IO_BLK_SIZE, false);
+}
+
+static char *DuplicatePath(ctx_t ctx, char const path[], size_t const n)
+{
+    TRY(void *const rslt = Alloc(ctx, n + 1, false)) {
+        memmove(rslt, path, n + 1);
+        return rslt;
+    }
+    return NULL;
+}
+
+static size_t LastPathElement(size_t const length, char const path[/* length */])
+{
+    size_t i = length;
+    
+    while (i) {
+        size_t const j = i - 1;
+        int const ch = path[j];
+        
+        if (ch == '/')
+            return i;
+
+        i = j;
+    }
+    return 0;
+}
+
+static void InflateInit(BAM_ReadCollection *const self, ctx_t ctx)
+{
+    int const zrc = inflateInit2(&self->zs, MAX_WBITS + 16);
+    
+    switch (zrc) {
+    case Z_OK:
+        break;
+    case Z_MEM_ERROR:
+        SYSTEM_ABORT(xcNoMemory, "allocating decompressor");
+        break;
+    default:
+        INTERNAL_ABORT(xcUnexpected, "allocating decompressor zlib rc = %i", zrc);
+        break;
+    }
+}
+
+static
+BAM_ReadCollection *BAM_ReadCollectionInit(BAM_ReadCollection *const self, ctx_t ctx, char const path[])
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcOpening);
+    size_t const namelen = strlen(path);
+    
+    TRY(char *const pathcopy = DuplicatePath(ctx, path, namelen)) {
+        size_t const namestart = LastPathElement(namelen, pathcopy);
+        
+        self->path = pathcopy;
+        self->namelen = (unsigned)(namelen - namestart);
+        self->namestart = (unsigned)namestart;
+        
+        TRY(self->fp = OpenRead(ctx, path)) {
+            TRY(self->iobuffer = AllocIOBuffer(ctx)) {
+                TRY(InflateInit(self, ctx)) {
+                    TRY(ReadHeader(self, ctx)) {
+                        LoadIndex(self, ctx);
+                    }
+                }
+            }
+        }
+    }
+    return self;
+}
+
+NGS_ReadCollection * NGS_ReadCollectionMakeBAM(ctx_t ctx, char const path[])
+{
+    FUNC_ENTRY(ctx, rcSRA, rcFile, rcOpening);
+    void *self = malloc(sizeof(BAM_ReadCollection));
+    if (self) {
+        static NGS_ReadCollection_vt const vt =
+        {
+            /* NGS_Refcount */
+            { BAM_ReadCollectionWhack },
+            
+            /* NGS_ReadCollection */
+            BAM_ReadCollectionName,
+            BAM_ReadCollectionReadGroups,
+            BAM_ReadCollectionReadGroup,
+            BAM_ReadCollectionReferences,
+            BAM_ReadCollectionReference,
+            BAM_ReadCollectionAlignments,
+            BAM_ReadCollectionAlignment,
+            BAM_ReadCollectionAlignmentCount,
+            BAM_ReadCollectionAlignmentRange,
+            BAM_ReadCollectionReads,
+            BAM_ReadCollectionRead,
+            BAM_ReadCollectionReadCount,
+            BAM_ReadCollectionReadRange,
+        };
+        NGS_ReadCollection *const super = &((BAM_ReadCollection *)self)->dad;
+
+        memset(self, 0, sizeof(BAM_ReadCollection));
+        TRY(NGS_ReadCollectionInit(ctx, super, &vt, "BAM_ReadCollection", path)) {
+            TRY(BAM_ReadCollectionInit(self, ctx, path)) {
+                return super;
+            }
+        }
+        free(self);
+    }
+    else {
+        SYSTEM_ABORT(xcNoMemory, "allocating BAM_ReadCollection ( '%s' )", path);
+    }
+    return NULL;
+}
diff --git a/libs/ngs/BAM_Record.c b/libs/ngs/BAM_Record.c
new file mode 100644
index 0000000..d6c4eb0
--- /dev/null
+++ b/libs/ngs/BAM_Record.c
@@ -0,0 +1,142 @@
+/* ===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <klib/rc.h>
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <stddef.h>
+#include <assert.h>
+#include <string.h>
+
+#include <sysalloc.h>
+
+#include "NGS_ReadGroup.h"
+#include "NGS_Reference.h"
+#include "NGS_Alignment.h"
+#include "NGS_Read.h"
+#include "NGS_String.h"
+
+#include "BAM_Record.h"
+
+static int GetSize(int const type)
+{
+    switch (type) {
+        case 'A':
+        case 'C':
+        case 'c':
+            return 1;
+        case 'S':
+        case 's':
+            return 2;
+        case 'F':
+        case 'I':
+        case 'i':
+            return 4;
+        default:
+            return -1;
+    }
+}
+
+static void NextArrayField(BAM_Record_Extra_Field *const rslt)
+{
+    if (rslt->fieldsize >= 8) {
+        char const *const value = rslt->value->string;
+        int const size  = GetSize(value[0]);
+        
+        if (size > 0) {
+            rslt->val_type  = value[0];
+            rslt->elemcount = (value[1] + (value[2] << 8) + (value[3] << 16) + (value[4] << 24));
+            rslt->value = (void const *)(value + 5);
+            rslt->fieldsize = size * rslt->elemcount;
+        }
+        else
+            rslt->fieldsize = -1;
+        return;
+    }
+    rslt->value = NULL;
+}
+
+static void NextStringField(BAM_Record_Extra_Field *const rslt)
+{
+    unsigned const max = rslt->fieldsize - 3;
+    for (rslt->elemcount = 0; rslt->elemcount < max; ++rslt->elemcount) {
+        if (rslt->value->string[rslt->elemcount] == '\0') {
+            rslt->fieldsize = rslt->elemcount + 1;
+            return;
+        }
+    }
+    rslt->value = NULL;
+}
+
+static void NextField(BAM_Record_Extra_Field *const rslt)
+{
+    if (rslt->fieldsize >= 4) {
+        if (rslt->val_type == 'B')
+            NextArrayField(rslt);
+        else if (rslt->val_type == 'Z' || rslt->val_type == 'H')
+            NextStringField(rslt);
+        else
+            rslt->fieldsize = GetSize(rslt->val_type);
+        return;
+    }
+    rslt->value = NULL;
+}
+
+unsigned BAM_Record_ForEachExtra(BAM_Record const *const self, ctx_t ctx,
+                                 BAM_Record_ForEachExtra_cb const cb,
+                                 void *const usr_ctx)
+{
+    FUNC_ENTRY(ctx, rcSRA, rcRow, rcReading);
+    char const *extra = (char const *)self->extra;
+    char const *const endp = extra + self->extralen;
+    unsigned cnt = 0;
+    
+    while (extra < endp) {
+        BAM_Record_Extra_Field fld = {
+            extra,
+            (void const *)(extra + 3),
+            1,
+            (int)(endp - extra),
+            extra[2]
+        };
+        
+        NextField(&fld);
+        if (fld.fieldsize <= 0) {
+            USER_WARNING(xcUnexpected, "unexpected type code '%c'", fld.val_type);
+            break;
+        }
+        extra = fld.tag + fld.fieldsize;
+        if (fld.value == NULL || extra > endp) {
+            USER_WARNING(xcUnexpected, "record is truncated");
+            break;
+        }
+        if (!cb(usr_ctx, ctx, cnt++, &fld))
+            break;
+    }
+    return cnt;
+}
diff --git a/libs/ngs/BAM_Record.h b/libs/ngs/BAM_Record.h
new file mode 100644
index 0000000..6b809d8
--- /dev/null
+++ b/libs/ngs/BAM_Record.h
@@ -0,0 +1,82 @@
+/* ===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+struct BAM_ReadCollection;
+
+typedef struct BAM_Record BAM_Record;
+struct BAM_Record {
+    uint8_t const *extra;
+    char const *QNAME;
+    char const *RNAME;
+    char const *RNEXT;
+    char const *SEQ;
+    char const *QUAL;
+
+    uint32_t POS;
+    uint32_t PNEXT;
+
+    int32_t TLEN;
+    int32_t REFID;
+
+    uint32_t seqlen;
+    uint32_t ncigar;
+    uint32_t extralen;
+
+    uint16_t FLAG;
+    uint8_t MAPQ;
+    uint8_t padd;
+
+    uint32_t cigar[1];
+};
+
+typedef struct BAM_Record_Extra_Field BAM_Record_Extra_Field;
+struct BAM_Record_Extra_Field {
+    char const *tag;
+    union {
+        uint8_t   u8[4]; /* for val_type == 'C' */
+        uint16_t u16[2]; /* for val_type == 'S' */
+        uint32_t u32[1]; /* for val_type == 'I' */
+        int8_t    i8[4]; /* for val_type == 'c' */
+        int16_t  i16[2]; /* for val_type == 's' */
+        int32_t  i32[1]; /* for val_type == 'i' */
+        float    f32[1]; /* for val_type == 'f' */
+        char  string[1]; /* for val_type == 'A', 'Z', or 'H'
+                          * for 'Z' and 'H' elemcount is strlen 
+                          * but the value is still null terminated */
+    } const *value;      /* all multi-byte values are little-endian,
+                          * byte swap as needed */
+    int elemcount;
+    int fieldsize;
+    char val_type;
+};
+
+typedef bool (*BAM_Record_ForEachExtra_cb)( void *usr_ctx, ctx_t ctx,
+                                            unsigned ordinal,
+                                            BAM_Record_Extra_Field const *fld );
+
+unsigned BAM_Record_ForEachExtra(BAM_Record const *self, ctx_t ctx,
+                                 BAM_Record_ForEachExtra_cb, void *usr_ctx);
+
+BAM_Record *BAM_GetRecord(struct NGS_Refcount *const self, ctx_t ctx);
diff --git a/libs/ngs/CSRA1_Alignment.c b/libs/ngs/CSRA1_Alignment.c
new file mode 100644
index 0000000..98cdcba
--- /dev/null
+++ b/libs/ngs/CSRA1_Alignment.c
@@ -0,0 +1,1451 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "CSRA1_Alignment.h"
+
+typedef struct CSRA1_Alignment CSRA1_Alignment;
+#define NGS_ALIGNMENT CSRA1_Alignment
+
+#include "NGS_Alignment.h"
+#include "NGS_ReadCollection.h"
+#include "NGS_Refcount.h"
+#include "NGS_Read.h"
+
+#include "NGS_Id.h"
+#include "NGS_String.h"
+#include "NGS_Cursor.h"
+
+#include "CSRA1_ReadCollection.h"
+
+#include <sysalloc.h>
+
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+
+#include <klib/printf.h>
+#include <klib/rc.h>
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <limits.h>
+
+#ifndef min
+#   define min(a,b) ( (a) < (b) ? (a) : (b) )
+#endif
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Alignment
+ */
+
+/* align_col_specs must be kept in sync with enum AlignmentTableColumns */
+static const char * align_col_specs [] =
+{
+    "(I32)MAPQ",
+    "(INSDC:SRA:read_filter)READ_FILTER",
+    "(ascii)CIGAR_LONG",
+    "(ascii)CIGAR_SHORT",
+    "(ascii)CLIPPED_CIGAR_LONG",
+    "(ascii)CLIPPED_CIGAR_SHORT",
+    "(INSDC:quality:phred)CLIPPED_QUALITY",
+    "(INSDC:dna:text)CLIPPED_READ",
+    "(INSDC:coord:len)LEFT_SOFT_CLIP",
+    "(INSDC:coord:len)RIGHT_SOFT_CLIP",
+    "(INSDC:quality:phred)QUALITY",
+    "(INSDC:dna:text)RAW_READ",
+    "(INSDC:dna:text)READ",
+    "(I64)REF_ID",
+    "(INSDC:coord:len)REF_LEN",
+    "(ascii)REF_SEQ_ID",	/* was REF_NAME changed March 23 2015 */
+    "(bool)REF_ORIENTATION",
+    "(INSDC:coord:zero)REF_POS",
+    "(INSDC:dna:text)REF_READ",
+    "(INSDC:coord:one)SEQ_READ_ID",
+    "(I64)SEQ_SPOT_ID",
+    "(ascii)SPOT_GROUP",
+    "(I32)TEMPLATE_LEN",
+    "(ascii)RNA_ORIENTATION",
+    "(I64)MATE_ALIGN_ID",
+    "(ascii)MATE_REF_SEQ_ID",
+    "(ascii)MATE_REF_NAME", /* to be used if MATE_REF_SEQ_ID is absent */
+    "(bool)MATE_REF_ORIENTATION",
+    "(bool)HAS_REF_OFFSET",
+    "(I32)REF_OFFSET"
+};
+/* Made changes to align_col_specs? - Make the same in enum AlignmentTableColumns! */
+
+/* enum AlignmentTableColumns must be kept in sync with align_col_specs */
+enum AlignmentTableColumns
+{
+    align_MAPQ,
+    align_READ_FILTER,
+    align_CIGAR_LONG,
+    align_CIGAR_SHORT,
+    align_CLIPPED_CIGAR_LONG,
+    align_CLIPPED_CIGAR_SHORT,
+    align_CLIPPED_QUALITY,
+    align_CLIPPED_READ,
+    align_LEFT_SOFT_CLIP,
+    align_RIGHT_SOFT_CLIP,
+    align_QUALITY,
+    align_RAW_READ,
+    align_READ,
+    align_REF_ID,
+    align_REF_LEN,
+    align_REF_SEQ_ID,
+    align_REF_ORIENTATION,
+    align_REF_POS,
+    align_REF_READ,
+    align_SEQ_READ_ID,
+    align_SEQ_SPOT_ID,
+    align_SPOT_GROUP,
+    align_TEMPLATE_LEN,
+    align_RNA_ORIENTATION,
+    align_MATE_ALIGN_ID,
+    align_MATE_REF_SEQ_ID,
+    align_MATE_REF_NAME,
+    align_MATE_REF_ORIENTATION,
+    align_HAS_REF_OFFSET,
+    align_REF_OFFSET,
+
+    align_NUM_COLS
+};
+/* Made changes to enum AlignmentTableColumns? - Make the same in align_col_specs! */
+
+
+struct NGS_Cursor const* CSRA1_AlignmentMakeDb ( ctx_t ctx,
+                                                 struct VDatabase const* db,
+                                                 struct NGS_String const* run_name,
+                                                 char const* table_name )
+{
+    return NGS_CursorMakeDb ( ctx, db, run_name, table_name, align_col_specs, align_NUM_COLS );
+}
+
+struct CSRA1_Alignment
+{
+    NGS_Refcount dad;
+    struct CSRA1_ReadCollection * coll;
+    const NGS_String * run_name;
+
+    int64_t cur_row;
+    int64_t row_max;
+
+    const NGS_Cursor * primary_curs;
+    const NGS_Cursor * secondary_curs;
+    NGS_String * col_data [ align_NUM_COLS ];
+
+	uint64_t id_offset;
+
+    bool seen_first;
+	bool in_primary;
+
+    /* for use in slices */
+	int64_t secondary_start;
+	int64_t secondary_max;
+
+    /* data to be accessed via CellData */
+    void const* cell_data [ align_NUM_COLS ];
+    uint32_t cell_len [ align_NUM_COLS ];
+};
+
+static void const* CSRA1_AlignmentGetCellData ( CSRA1_Alignment * self,
+                                                ctx_t ctx,
+                                                uint32_t col_idx
+                                                )
+{
+    if ( self -> cell_data [ col_idx ] == NULL )
+    {
+        assert ( self -> cell_len [ col_idx ] == 0 );
+
+        if ( ! self -> seen_first )
+        {
+            USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+            return NULL;
+        }
+
+        NGS_CursorCellDataDirect ( self -> in_primary ? self->primary_curs : self->secondary_curs,
+            ctx,
+            self->cur_row,
+            col_idx,
+            NULL,
+            & self -> cell_data [ col_idx ],
+            NULL,
+            & self -> cell_len [ col_idx ]
+        );
+
+        if ( FAILED() )
+        {
+            self -> cell_data [ col_idx ] = NULL;
+            self -> cell_len [ col_idx ] = 0;
+        }
+    }
+
+    return self -> cell_data [ col_idx ];
+}
+
+#define GetCursor( self ) ( self -> in_primary ? self -> primary_curs : self -> secondary_curs )
+
+/* Whack
+ */
+static
+void CSRA1_AlignmentWhack ( CSRA1_Alignment * self, ctx_t ctx )
+{
+    uint32_t i;
+    for ( i = 0; i < align_NUM_COLS; ++ i )
+    {
+        NGS_StringRelease ( self -> col_data [ i ], ctx );
+        self -> col_data [ i ] = NULL;
+    }
+
+    NGS_CursorRelease ( self -> primary_curs, ctx );
+    NGS_CursorRelease ( self -> secondary_curs, ctx );
+
+    NGS_StringRelease ( self -> run_name, ctx );
+    CSRA1_ReadCollectionRelease ( self -> coll, ctx );
+}
+
+static
+void CSRA1_AlignmentInitRegion ( CSRA1_Alignment * self,
+                                 ctx_t ctx,
+                                 const NGS_Cursor * primary,
+                                 const NGS_Cursor * secondary,
+                                 int64_t start,
+                                 uint64_t count )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+/*printf("CSRA1_AlignmentInitRegion(primary=%p, secondary=%p, start=%ld, count=%lu, offset=%lu)\n",
+        (void*)primary, (void*)secondary, start, count, self -> id_offset);    */
+
+    /* split the requested region across primary/secondary table, adjust the boundaries as necessary */
+    if ( ! FAILED () )
+    {
+        if ( primary != NULL )
+        {
+            int64_t primary_start;
+            uint64_t primary_count;
+            TRY ( NGS_CursorGetRowRange ( primary, ctx, & primary_start, & primary_count ) )
+            {
+                uint64_t table_end;
+
+                if ( start < primary_start )
+                {
+                    count -= ( primary_start - start );
+                    start = primary_start;
+                }
+
+                table_end = primary_start + primary_count;
+
+                if ( start < (int64_t)table_end )
+                {
+                    self -> cur_row = start;
+                    self -> row_max = min ( table_end, (uint64_t)start + min ( count, primary_count ) );
+
+                    if ( self -> row_max == table_end )
+                    {   /* a part of the range is in the secondary; reduce the count by the number or records from primary */
+                        count -= (uint64_t) ( (int64_t)self -> row_max - self -> cur_row );
+                        start = 1; /* this will be the starting rowId in the secondary */
+                    }
+                }
+                else
+                {   /* the entire range is beyond the primary cursor;
+                       set up so that the first call to Next() will go into the secondary cursor */
+                    self -> cur_row = self -> row_max = table_end;
+                    start -= self -> id_offset; /* this will be the starting rowId in the secondary */
+                    self -> in_primary = false;
+                }
+            }
+        }
+        else
+        {   /* primary not requested */
+            if ( start <= (int64_t)self -> id_offset )
+            {   /* range overlaps the primary ID space; adjust the range to exclude primary */
+                count -= ( self -> id_offset - start + 1 );
+                start = 1;
+            }
+            else
+            {
+                start -= self -> id_offset; /* this will be the starting rowId in the secondary */
+            }
+            /* make sure the first call to Next() will switch to the secondary cursor */
+            self -> cur_row = self -> row_max = self -> id_offset + 1;
+            self -> in_primary = false;
+        }
+
+        if ( ! FAILED () && secondary != NULL )
+        {
+            int64_t  secondary_start;
+            uint64_t secondary_count;
+            TRY ( NGS_CursorGetRowRange ( secondary, ctx, & secondary_start, & secondary_count ) )
+            {
+                uint64_t table_end;
+                if ( start < secondary_start )
+                {
+                    count -= ( secondary_start - start );
+                    start = secondary_start;
+                }
+
+                table_end = secondary_start + secondary_count;
+
+                if ( start < (int64_t)table_end )
+                {
+                    self -> secondary_start = start;
+                    self -> secondary_max = min ( table_end, (uint64_t)start + min ( count, secondary_count ) );
+                }
+                else
+                {
+                    self -> secondary_start = self -> secondary_max = table_end;
+                }
+            }
+            if ( ! self -> in_primary )
+            {
+                self -> cur_row = self -> secondary_start;
+                self -> row_max = self -> secondary_max;
+            }
+        }
+/*    printf("cur_row=%ld, row_max=%lu, secondary_start=%ld, secondary_max=%lu)\n",
+            self->cur_row, self->row_max, self -> secondary_start, self -> secondary_max);    */
+    }
+}
+
+NGS_String * CSRA1_AlignmentGetAlignmentId( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+
+    /* if current row is valid, read data */
+    if ( self -> cur_row < self -> row_max )
+    {
+        if ( self -> in_primary )
+        {
+            return NGS_IdMake ( ctx, self -> run_name, NGSObject_PrimaryAlignment, self -> cur_row );
+        }
+        else
+        {
+            return NGS_IdMake ( ctx, self -> run_name, NGSObject_SecondaryAlignment, self -> cur_row + self -> id_offset );
+        }
+    }
+
+    USER_ERROR ( xcCursorExhausted, "No more rows available" );
+    return NULL;
+}
+
+struct NGS_String* CSRA1_AlignmentGetReferenceSpec( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+
+    return NGS_CursorGetString ( GetCursor ( self ), ctx, self -> cur_row, align_REF_SEQ_ID );
+}
+
+int CSRA1_AlignmentGetMappingQuality( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return 0;
+    }
+    return NGS_CursorGetInt32 ( GetCursor ( self ), ctx, self -> cur_row, align_MAPQ );
+}
+
+INSDC_read_filter CSRA1_AlignmentGetReadFilter( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return 0;
+    }
+    assert ( sizeof ( INSDC_read_filter ) == sizeof ( char ) );
+    return ( uint8_t ) NGS_CursorGetChar ( GetCursor ( self ), ctx, self -> cur_row, align_READ_FILTER );
+}
+
+struct NGS_String* CSRA1_AlignmentGetReferenceBases( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+    return NGS_CursorGetString ( GetCursor ( self ), ctx, self -> cur_row, align_REF_READ );
+}
+
+struct NGS_String* CSRA1_AlignmentGetReadGroup( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+    else
+    {
+        TRY ( NGS_String* ret = NGS_CursorGetString ( GetCursor ( self ), ctx, self -> cur_row, align_SPOT_GROUP ) )
+        {
+            return ret;
+        }
+        CATCH_ALL ()
+        {
+            CLEAR();
+        }
+        return NGS_StringMake ( ctx, "", 0 );
+    }
+}
+
+NGS_String * CSRA1_AlignmentGetReadId( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return 0;
+    }
+
+    {
+        TRY ( int64_t readId = NGS_CursorGetInt64 ( GetCursor ( self ), ctx, self -> cur_row, align_SEQ_SPOT_ID ) )
+        {
+            return NGS_IdMake ( ctx, self -> run_name, NGSObject_Read, readId );
+        }
+    }
+    return NULL;
+}
+
+struct NGS_String* CSRA1_AlignmentGetClippedFragmentBases( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+
+    return NGS_CursorGetString ( GetCursor ( self ), ctx, self -> cur_row, align_CLIPPED_READ );
+}
+
+struct NGS_String* CSRA1_AlignmentGetClippedFragmentQualities( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+
+    {
+        NGS_String* phred = NGS_CursorGetString ( GetCursor ( self ), ctx, self -> cur_row, align_CLIPPED_QUALITY );
+        /* convert to ascii-33 */
+        size_t size = NGS_StringSize ( phred, ctx );
+        char * copy = malloc ( size + 1 );
+        if ( copy == NULL )
+        {
+            SYSTEM_ERROR ( xcNoMemory,
+                           "allocating %u bytes for %s row %ld",
+                           size + 1, "CLIPPED_QUALITY", self -> cur_row );
+            NGS_StringRelease ( phred, ctx );
+            return NULL;
+        }
+        else
+        {
+            NGS_String* ret;
+            const char* orig = NGS_StringData ( phred, ctx );
+            size_t i;
+            for ( i = 0; i < size ; ++ i )
+                copy [ i ] = ( char ) ( (uint8_t)(orig [ i ]) + 33 );
+            copy [ i ] = 0;
+
+            ret = NGS_StringMakeOwned ( ctx, copy, size );
+            if ( FAILED () )
+                free ( copy );
+            NGS_StringRelease ( phred, ctx );
+            return ret;
+        }
+    }
+}
+
+struct NGS_String* CSRA1_AlignmentGetAlignedFragmentBases( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+
+    return NGS_CursorGetString ( GetCursor ( self ), ctx, self -> cur_row, align_READ );
+}
+
+bool CSRA1_AlignmentIsPrimary( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return false;
+    }
+
+    return self -> in_primary;
+}
+
+int64_t CSRA1_AlignmentGetAlignmentPosition( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return 0;
+    }
+
+    return NGS_CursorGetInt32 ( GetCursor ( self ), ctx, self -> cur_row, align_REF_POS);
+}
+
+uint64_t CSRA1_AlignmentGetReferencePositionProjectionRange( CSRA1_Alignment* self, ctx_t ctx, int64_t ref_pos )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    uint64_t ret;
+    bool const* HAS_REF_OFFSET;
+    int32_t const* REF_OFFSET;
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return (uint64_t)-1;
+    }
+
+    REF_OFFSET = CSRA1_AlignmentGetCellData ( self, ctx, align_REF_OFFSET );
+    /* Check for error, REF_OFFSET == NULL? if (  ) */
+
+    /* if there is no indels just calculate projection as (ref_pos - REF_POS) with len = 1 */
+    if ( self -> cell_len [ align_REF_OFFSET ] == 0 )
+    {
+        int32_t align_len = NGS_CursorGetInt32 ( GetCursor ( self ), ctx, self -> cur_row, align_REF_LEN);
+        ret = ref_pos - NGS_CursorGetInt32 ( GetCursor ( self ), ctx, self -> cur_row, align_REF_POS);
+
+        if ( FAILED() )
+        {
+            SYSTEM_ERROR ( xcIteratorUninitialized, "Failed to access REF_LEN or REF_POS" );
+            return (uint64_t)-1;
+        }
+        else if ( ret >= align_len )
+        {
+            /* calculated projection is out of bounds, i.e. ref_pos
+               doesn't project on the alignment
+               (it also catches ref_pos < align_REF_POS case)
+            */
+            ret = (uint64_t)-1;
+        }
+        else
+        {
+            /* ref_pos has a projection on the current alignment -
+               pack it and make its length = 1
+            */
+            ret <<= 32;
+            ret |= 1;
+        }
+    }
+    else /* we have indels */
+    {
+        int32_t read_len;
+        int32_t idx_ref, idx_HAS_REF_OFFSET = 0, idx_REF_OFFSET = 0;
+        int32_t align_pos;
+        uint32_t proj_len;
+
+        HAS_REF_OFFSET = CSRA1_AlignmentGetCellData ( self, ctx, align_HAS_REF_OFFSET );
+        /* Check for error, HAS_REF_OFFSET == NULL? if (  ) */
+
+        if ( HAS_REF_OFFSET == NULL )
+        {
+            SYSTEM_ERROR ( xcIteratorUninitialized, "Failed to access HAS_REF_OFFSET" );
+            return (uint64_t)-1;
+        }
+
+        read_len = self -> cell_len [ align_HAS_REF_OFFSET ];
+        idx_ref = NGS_CursorGetInt32 ( GetCursor ( self ), ctx, self -> cur_row, align_REF_POS);
+
+        if ( FAILED () )
+        {
+            SYSTEM_ERROR ( xcIteratorUninitialized, "Failed to access REF_POS" );
+            return (uint64_t)-1;
+        }
+
+        if ( idx_ref > ref_pos )
+        {
+            /* the alignment starts beyond given ref_pos
+                out of bounds
+            */
+            ret = (uint64_t)-1;
+        }
+        else
+        {
+            for ( align_pos = 0, proj_len = 1; idx_ref < ref_pos && align_pos < read_len ; align_pos += proj_len )
+            {
+                bool has_ref_offset = HAS_REF_OFFSET [ idx_HAS_REF_OFFSET++ ];
+                if ( has_ref_offset == 0) /* match/mismatch */
+                {
+                    ++idx_ref;
+                    proj_len = 1;
+                }
+                else /* indel */
+                {
+                    int32_t ref_offset = REF_OFFSET [ idx_REF_OFFSET++ ];
+
+                    if ( ref_offset < 0 )
+                    {
+                        /* insertion */
+                        proj_len = (uint32_t)-ref_offset;
+                        ++idx_ref;
+                    }
+                    else
+                    {
+                        /* deletion */
+                        assert ( ref_offset > 0 );
+
+                        idx_ref += ref_offset;
+                        proj_len = 0;
+                    }
+                }
+            }
+
+            /* in the case we exited from the loop at the insertion, align_pos points beyond
+               the insertion - it should be restored to point to the beginning of the insertion
+            */
+            if ( proj_len > 1 )
+                align_pos -= proj_len;
+
+            if ( align_pos >= read_len )
+            {
+                align_pos = -1;
+                proj_len = 0;
+            }
+
+            ret = ((uint64_t)align_pos << 32) | proj_len;
+        }
+    }
+
+    return ret;
+}
+
+uint64_t CSRA1_AlignmentGetAlignmentLength( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return 0;
+    }
+
+    return NGS_CursorGetInt32 ( GetCursor ( self ), ctx, self -> cur_row, align_REF_LEN);
+}
+
+bool CSRA1_AlignmentGetIsReversedOrientation( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return false;
+    }
+
+    return NGS_CursorGetBool ( GetCursor ( self ), ctx, self -> cur_row, align_REF_ORIENTATION);
+}
+
+int CSRA1_AlignmentGetSoftClip( CSRA1_Alignment* self, ctx_t ctx, bool left )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return 0;
+    }
+
+    return NGS_CursorGetInt32 ( GetCursor ( self ), ctx, self -> cur_row, left ? align_LEFT_SOFT_CLIP : align_RIGHT_SOFT_CLIP );
+}
+
+uint64_t CSRA1_AlignmentGetTemplateLength( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return 0;
+    }
+
+    return NGS_CursorGetInt32 ( GetCursor ( self ), ctx, self -> cur_row, align_TEMPLATE_LEN);
+}
+
+struct NGS_String* CSRA1_AlignmentGetShortCigar( CSRA1_Alignment* self, ctx_t ctx, bool clipped )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+
+    return NGS_CursorGetString ( GetCursor ( self ), ctx, self -> cur_row, clipped ? align_CLIPPED_CIGAR_SHORT: align_CIGAR_SHORT );
+}
+
+struct NGS_String* CSRA1_AlignmentGetLongCigar( CSRA1_Alignment* self, ctx_t ctx, bool clipped )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+
+    return NGS_CursorGetString ( GetCursor ( self ), ctx, self -> cur_row, clipped ? align_CLIPPED_CIGAR_LONG : align_CIGAR_LONG );
+}
+
+char CSRA1_AlignmentGetRNAOrientation( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+    }
+    else
+    {
+        TRY ( char ret = NGS_CursorGetChar ( GetCursor ( self ), ctx, self -> cur_row, align_RNA_ORIENTATION ) )
+        {
+            return ret;
+        }
+        CATCH_ALL ()
+        {
+            CLEAR();
+        }
+    }
+    return '?';
+}
+
+bool CSRA1_AlignmentHasMate( CSRA1_Alignment* self, ctx_t ctx )
+{
+    int64_t mate_id;
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_WARNING ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return false;
+    }
+
+    TRY ( mate_id = NGS_CursorGetInt64 ( GetCursor ( self ), ctx, self -> cur_row, align_MATE_ALIGN_ID ) )
+    {
+        int64_t mate_seq_spot_id;
+
+        if ( self -> in_primary )
+            return true;
+
+        TRY ( mate_seq_spot_id = NGS_CursorGetInt64 ( self -> secondary_curs, ctx, self -> cur_row, align_SEQ_SPOT_ID ) )
+        {
+            if ( mate_seq_spot_id > 0 )
+                return true;
+        }
+    }
+
+    CLEAR();
+
+    return false;
+}
+
+NGS_String * CSRA1_AlignmentGetMateAlignmentId( CSRA1_Alignment* self, ctx_t ctx )
+{
+    int64_t mateId;
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return 0;
+    }
+
+    TRY ( mateId = NGS_CursorGetInt64 ( GetCursor ( self ), ctx, self -> cur_row, align_MATE_ALIGN_ID ) )
+    {
+        if ( ! self -> in_primary )
+        {
+            TRY ( int64_t mate_seq_spot_id = NGS_CursorGetInt64 ( self -> secondary_curs, ctx, mateId, align_SEQ_SPOT_ID ) )
+            {
+                if ( mate_seq_spot_id <= 0 )
+                {
+                    INTERNAL_ERROR ( xcSecondaryAlignmentMissingPrimary,
+                                     "secondary mate alignment id ( %li ) missing primary within %.*s",
+                                     mateId + self -> id_offset,
+                                     NGS_StringSize ( self -> run_name, ctx ),
+                                     NGS_StringData ( self -> run_name, ctx ) );
+                }
+            }
+        }
+
+        if ( ! FAILED () )
+        {
+            return NGS_IdMake ( ctx,
+                                self -> run_name,
+                                self -> in_primary ? NGSObject_PrimaryAlignment : NGSObject_SecondaryAlignment,
+                                self -> in_primary ? mateId : mateId + self -> id_offset );
+        }
+    }
+    return NULL;
+}
+
+struct NGS_String* CSRA1_AlignmentGetMateReferenceSpec( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+
+    {
+        NGS_String* ret;
+        TRY ( ret = NGS_CursorGetString ( GetCursor ( self ), ctx, self -> cur_row, align_MATE_REF_SEQ_ID) )
+        {
+            return ret;
+        }
+        if ( (int)GetRCObject ( ctx -> rc ) == rcColumn && GetRCState ( ctx -> rc ) == rcNotFound )
+        {
+            CLEAR ();
+            return NGS_CursorGetString ( GetCursor ( self ), ctx, self -> cur_row, align_MATE_REF_NAME );
+        }
+    }
+    return NULL;
+}
+
+bool CSRA1_AlignmentGetMateIsReversedOrientation( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return false;
+    }
+
+    return NGS_CursorGetBool ( GetCursor ( self ), ctx, self -> cur_row, align_MATE_REF_ORIENTATION);
+}
+
+bool CSRA1_AlignmentIsFirst( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    int32_t seq_read_id;
+
+    assert ( self );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return false;
+    }
+
+    TRY ( seq_read_id = NGS_CursorGetInt64 ( GetCursor ( self ), ctx, self -> cur_row, align_SEQ_READ_ID ) )
+    {
+        return seq_read_id == 1;
+    }
+    return false;
+}
+
+
+/*--------------------------------------------------------------------------
+ * NGS_AlignmentIterator
+ */
+static
+bool CSRA1_AlignmentIteratorNext ( CSRA1_Alignment* self, ctx_t ctx )
+{
+    assert ( self != NULL );
+
+    if ( !self -> seen_first )
+    {
+        self -> seen_first = true;
+    }
+    else
+    {
+        ++ self -> cur_row;
+    }
+
+    for ( ; self -> cur_row < self -> row_max; ++ self -> cur_row )
+    {
+        int64_t seq_spot_id;
+
+        if ( self -> in_primary )
+            return true;
+
+        TRY ( seq_spot_id = NGS_CursorGetInt64 ( self -> secondary_curs, ctx, self -> cur_row, align_SEQ_SPOT_ID ) )
+        {
+            if ( seq_spot_id > 0 )
+                return true;
+        }
+
+        CLEAR ();
+    }
+
+    /* see if we need to switch over to the next cursor */
+    if ( self -> in_primary && self -> secondary_curs != NULL )
+    {
+        self -> in_primary = false;
+
+        self -> cur_row = self -> secondary_start;
+        self -> row_max = self -> secondary_max;
+
+        // let's re-run "next" again to check SEQ_SPOT_ID
+        self -> seen_first = false;
+        return CSRA1_AlignmentIteratorNext ( self, ctx );
+    }
+
+    return false;
+}
+
+static CSRA1_Alignment* CSRA1_AlignmentGetMateAlignment( CSRA1_Alignment* self, ctx_t ctx );
+
+static
+NGS_String* CSRA1_FragmentGetId ( CSRA1_Alignment * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self != NULL );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+
+    {
+        TRY ( int32_t fragId = NGS_CursorGetInt32 ( GetCursor ( self ), ctx, self -> cur_row, align_SEQ_READ_ID ) )
+        {
+            return NGS_IdMakeFragment ( ctx, self -> run_name, true, self -> cur_row, fragId - 1 );
+        }
+    }
+    return NULL;
+}
+
+static
+struct NGS_String * CSRA1_FragmentGetSequence ( CSRA1_Alignment * self, ctx_t ctx, uint64_t offset, uint64_t length )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    NGS_String * seq;
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return NULL;
+    }
+
+    TRY ( seq = NGS_CursorGetString ( GetCursor ( self ), ctx, self -> cur_row, align_RAW_READ ) )
+    {
+        TRY ( NGS_String * sub = NGS_StringSubstrOffsetSize ( seq, ctx, offset, length ) )
+        {
+            NGS_StringRelease ( seq, ctx );
+            seq = sub;
+        }
+    }
+
+    return seq;
+}
+
+static
+struct NGS_String * CSRA1_FragmentGetQualities ( CSRA1_Alignment * self, ctx_t ctx, uint64_t offset, uint64_t length )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    NGS_String * ret = NULL;
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+    }
+    else
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        TRY ( NGS_CursorCellDataDirect ( GetCursor ( self ), ctx, self -> cur_row, align_QUALITY, & elem_bits, & base, & boff, & row_len ) )
+        {
+            assert ( elem_bits == 8 );
+            assert ( boff == 0 );
+
+            if ( offset > row_len )
+            {
+                length = 0;
+            }
+            else if ( offset + length > row_len )
+            {
+                length = row_len - offset;
+            }
+
+            {   /* convert to ascii-33 */
+                char * copy = malloc ( length + 1 );
+                if ( copy == NULL )
+                    SYSTEM_ERROR ( xcNoMemory, "allocating %u bytes for QUALITY row %ld", row_len + 1, self -> cur_row );
+                else
+                {
+                    uint32_t i;
+                    const uint8_t * orig = base;
+                    for ( i = 0; i < length; ++ i )
+                    {
+                        copy [ i ] = ( char ) ( orig [ offset + i ] + 33 );
+                    }
+                    copy [ length ] = 0;
+
+                    ret = NGS_StringMakeOwned ( ctx, copy, length );
+                    if ( FAILED () )
+                    {
+                        free ( copy );
+                    }
+                }
+            }
+        }
+    }
+
+    return ret;
+}
+
+static
+bool CSRA1_FragmentIsPaired ( CSRA1_Alignment * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    int64_t id;
+    int32_t idx;
+    bool ret = false;
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return false;
+    }
+
+    TRY ( id = NGS_CursorGetInt64 ( GetCursor ( self ), ctx, self -> cur_row, align_MATE_ALIGN_ID ) )
+    {
+    }
+    CATCH_ALL ()
+    {
+        /* if we failed, it means that MATE_ALIGN_ID column is empty, so lets assign it to 0 and move forward */
+        CLEAR();
+        id = 0;
+    }
+
+    /* if MATE_ALIGN_ID != 0, it's paired */
+    if ( id != 0 )
+        return true;
+
+    TRY ( idx = NGS_CursorGetInt32 ( GetCursor ( self ), ctx, self -> cur_row, align_SEQ_READ_ID ) )
+    {
+        /* if SEQ_READ_ID > 1, it's paired. */
+        if ( idx > 1 )
+            return true;
+
+        TRY ( id = NGS_CursorGetInt64 ( GetCursor ( self ), ctx, self -> cur_row, align_SEQ_SPOT_ID ) )
+        {
+            NGS_String * readId;
+
+            /* otherwise, have to get spot id and consult SEQUENCE table */
+            TRY ( readId = NGS_IdMake ( ctx, self -> run_name, NGSObject_Read, id ) )
+            {
+                const char * readIdStr = NGS_StringData ( readId, ctx );
+                TRY ( NGS_Read * read = NGS_ReadCollectionGetRead ( ( NGS_ReadCollection * ) self -> coll, ctx, readIdStr ) )
+                {
+                    uint32_t numFragments = NGS_ReadNumFragments(read, ctx);
+                    ret = numFragments > 1;
+
+                    NGS_ReadRelease ( read, ctx );
+                }
+
+                NGS_StringRelease ( readId, ctx );
+            }
+        }
+    }
+
+    return ret;
+}
+
+static
+bool CSRA1_FragmentIsAligned ( CSRA1_Alignment * self, ctx_t ctx )
+{
+    assert ( self != NULL );
+    return true;
+}
+
+static
+bool CSRA1_FragmentNext ( CSRA1_Alignment * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Alignment accessed before a call to AlignmentIteratorNext()" );
+        return false;
+    }
+
+    UNIMPLEMENTED(); /* CSRA1_FragmentNext; should not be called - Alignment is not a FragmentIterator */
+
+    return false;
+}
+
+
+static NGS_Alignment_vt CSRA1_Alignment_vt_inst =
+{
+    {
+        {
+            /* NGS_Refcount */
+            CSRA1_AlignmentWhack
+        },
+
+        /* NGS_Fragment */
+        CSRA1_FragmentGetId,
+        CSRA1_FragmentGetSequence,
+        CSRA1_FragmentGetQualities,
+        CSRA1_FragmentIsPaired,
+        CSRA1_FragmentIsAligned,
+        CSRA1_FragmentNext
+    },
+
+    CSRA1_AlignmentGetAlignmentId,
+    CSRA1_AlignmentGetReferenceSpec,
+    CSRA1_AlignmentGetMappingQuality,
+    CSRA1_AlignmentGetReadFilter,
+    CSRA1_AlignmentGetReferenceBases,
+    CSRA1_AlignmentGetReadGroup,
+    CSRA1_AlignmentGetReadId,
+    CSRA1_AlignmentGetClippedFragmentBases,
+    CSRA1_AlignmentGetClippedFragmentQualities,
+    CSRA1_AlignmentGetAlignedFragmentBases,
+    CSRA1_AlignmentIsPrimary,
+    CSRA1_AlignmentGetAlignmentPosition,
+    CSRA1_AlignmentGetReferencePositionProjectionRange,
+    CSRA1_AlignmentGetAlignmentLength,
+    CSRA1_AlignmentGetIsReversedOrientation,
+    CSRA1_AlignmentGetSoftClip,
+    CSRA1_AlignmentGetTemplateLength,
+    CSRA1_AlignmentGetShortCigar,
+    CSRA1_AlignmentGetLongCigar,
+    CSRA1_AlignmentGetRNAOrientation,
+    CSRA1_AlignmentHasMate,
+    CSRA1_AlignmentGetMateAlignmentId,
+    CSRA1_AlignmentGetMateAlignment,
+    CSRA1_AlignmentGetMateReferenceSpec,
+    CSRA1_AlignmentGetMateIsReversedOrientation,
+    CSRA1_AlignmentIsFirst,
+
+    /* Iterator */
+    CSRA1_AlignmentIteratorNext
+};
+
+/* Init
+ */
+static
+void CSRA1_AlignmentInit ( NGS_ALIGNMENT* ref,
+                           ctx_t ctx,
+                           struct CSRA1_ReadCollection * coll,
+                           const char *clsname,
+                           const char *instname,
+                           const char * run_name, size_t run_name_size,
+                           bool exclusive,
+                           bool primary,
+                           bool secondary,
+                           uint64_t id_offset )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    if ( ref == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    else
+    {
+        TRY ( NGS_AlignmentInit ( ctx, ref, & CSRA1_Alignment_vt_inst, clsname, instname ) )
+        {
+            if ( primary  )
+            {
+                ON_FAIL ( ref -> primary_curs = CSRA1_ReadCollectionMakeAlignmentCursor ( coll,
+                                                                                          ctx,
+                                                                                          true,
+                                                                                          exclusive ) )
+                    return;
+                ref -> in_primary   = true;
+            }
+
+            if ( secondary )
+            {
+                ON_FAIL ( ref -> secondary_curs = CSRA1_ReadCollectionMakeAlignmentCursor ( coll,
+                                                                                            ctx,
+                                                                                            false,
+                                                                                            exclusive ) )
+                    CLEAR(); /* missing SECONDARY_ALIGNMENTS table is OK */
+            }
+
+            ref -> id_offset = id_offset;
+
+            ON_FAIL ( ref -> coll = CSRA1_ReadCollectionDuplicate ( coll, ctx ) )
+                return;
+            ON_FAIL ( ref -> run_name = NGS_StringMakeCopy ( ctx, run_name, run_name_size ) )
+                return;
+        }
+    }
+}
+
+
+static
+void SetRowId ( CSRA1_Alignment* self, ctx_t ctx, int64_t rowId, bool primary )
+{   /* validate the requested rowId */
+    if ( rowId <= 0 )
+    {
+        INTERNAL_ERROR ( xcCursorAccessFailed,
+                         "rowId ( %li ) out of range for %.*s",
+                         rowId,
+                         NGS_StringSize ( self -> run_name, ctx ),
+                         NGS_StringData ( self -> run_name, ctx ) );
+    }
+    else
+    {
+        int64_t id = rowId;
+        int64_t  start = 0;
+        uint64_t count = 0;
+
+        if ( primary )
+        {
+            if ( self -> primary_curs != NULL )
+                ON_FAIL ( NGS_CursorGetRowRange ( self -> primary_curs, ctx, & start, & count ) )
+                    return;
+        }
+        else if ( self -> secondary_curs != NULL )
+        {
+            ON_FAIL ( NGS_CursorGetRowRange ( self -> secondary_curs, ctx, & start, & count ) )
+                return;
+            id -= self -> id_offset;
+        }
+
+        if ( (uint64_t)id >= start + count )
+        {
+            INTERNAL_ERROR ( xcCursorAccessFailed,
+                             "rowId ( %li ) out of range for %.*s",
+                             rowId,
+                             NGS_StringSize ( self -> run_name, ctx ),
+                             NGS_StringData ( self -> run_name, ctx ) );
+        }
+        else
+        {
+            if ( ! primary && self -> secondary_curs != NULL )
+            {
+                TRY ( int64_t spot_id = NGS_CursorGetInt64 ( self -> secondary_curs, ctx, id, align_SEQ_SPOT_ID ) )
+                {
+                    if ( spot_id <= 0 )
+                    {
+                        INTERNAL_ERROR ( xcSecondaryAlignmentMissingPrimary,
+                                         "secondary alignment id ( %li ) missing primary within %.*s",
+                                         rowId,
+                                         NGS_StringSize ( self -> run_name, ctx ),
+                                         NGS_StringData ( self -> run_name, ctx ) );
+                    }
+                }
+            }
+
+            if ( ! FAILED () )
+            {
+                self -> cur_row = id;
+                self -> row_max = id + 1;
+            }
+        }
+    }
+}
+
+/* Make
+ *  makes a common alignment from VCursor
+ */
+NGS_Alignment * CSRA1_AlignmentMake ( ctx_t ctx,
+                                        struct CSRA1_ReadCollection * coll,
+                                        int64_t alignId,
+                                        char const* run_name, size_t run_name_size,
+                                        bool primary,
+                                        uint64_t id_offset )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    CSRA1_Alignment * ref;
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory,
+                       "allocating CSRA1_Alignment(%lu) on '%.*s'",
+                       alignId,
+                       run_name_size,
+                       run_name );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname,
+                        sizeof instname,
+                        NULL,
+                        "%.*s(%lu)",
+                        run_name_size,
+                        run_name,
+                        alignId );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        TRY ( CSRA1_AlignmentInit ( ref, ctx, coll, "CSRA1_Alignment", instname, run_name, run_name_size, false, primary, ! primary, id_offset ) )
+        {
+            TRY ( SetRowId( ref, ctx, alignId, primary ) )
+            {
+                ref -> seen_first = true;
+                return ( NGS_Alignment * ) ref;
+            }
+            CSRA1_AlignmentWhack ( ref, ctx );
+        }
+        free ( ref );
+    }
+
+    return NULL;
+}
+
+CSRA1_Alignment* CSRA1_AlignmentGetMateAlignment( CSRA1_Alignment* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    TRY ( int64_t mate_row = NGS_CursorGetInt64 ( GetCursor ( self ), ctx, self -> cur_row, align_MATE_ALIGN_ID ) )
+    {
+        if ( ! self -> in_primary )
+        {
+            mate_row += self -> id_offset;
+        }
+
+        {
+            TRY ( NGS_String * mate_id = NGS_IdMake( ctx,
+                                                     self -> run_name,
+                                                     self -> in_primary ? NGSObject_PrimaryAlignment : NGSObject_SecondaryAlignment,
+                                                     mate_row ) )
+            {
+                CSRA1_Alignment* ret = (CSRA1_Alignment*)
+                    NGS_ReadCollectionGetAlignment ( CSRA1_ReadCollectionToNGS_ReadCollection ( self -> coll, ctx ),
+                                                     ctx,
+                                                     NGS_StringData ( mate_id, ctx ) );
+                NGS_StringRelease (mate_id, ctx );
+                return ret;
+            }
+        }
+    }
+    return NULL;
+}
+
+NGS_Alignment * CSRA1_AlignmentIteratorMake ( ctx_t ctx,
+                                              struct CSRA1_ReadCollection * coll,
+                                              bool primary,
+                                              bool secondary,
+                                              const NGS_String * run_name,
+                                              uint64_t id_offset )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    CSRA1_Alignment * ref;
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory,
+                       "allocating NGS_AlignmentIterator on '%.*s'",
+                       NGS_StringSize ( run_name, ctx ),
+                       NGS_StringData ( run_name, ctx ) );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname,
+                        sizeof instname,
+                        NULL,
+                        "%.*s",
+                        NGS_StringSize ( run_name, ctx ),
+                        NGS_StringData ( run_name, ctx ) );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        TRY ( CSRA1_AlignmentInit ( ref, ctx, coll, "NGS_AlignmentIterator", instname, NGS_StringData (run_name, ctx), NGS_StringSize (run_name, ctx), true, primary, secondary, id_offset ) )
+        {
+            TRY ( CSRA1_AlignmentInitRegion ( ref, ctx, ref -> primary_curs, ref -> secondary_curs, 0, ULLONG_MAX ) )
+            {
+                return ( NGS_Alignment * ) ref;
+            }
+            CSRA1_AlignmentWhack ( ref, ctx );
+        }
+
+        free ( ref );
+    }
+
+    return NULL;
+}
+
+NGS_Alignment * CSRA1_AlignmentRangeMake ( ctx_t ctx,
+                                           struct CSRA1_ReadCollection * coll,
+                                           bool primary,
+                                           bool secondary,
+                                           const NGS_String * run_name,
+                                           uint64_t id_offset,
+                                           int64_t first,
+                                           uint64_t count)
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    CSRA1_Alignment * ref;
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory,
+                       "allocating NGS_AlignmentRange on '%.*s'",
+                       NGS_StringSize ( run_name, ctx ),
+                       NGS_StringData ( run_name, ctx ) );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname,
+                        sizeof instname,
+                        NULL,
+                        "%.*s",
+                        NGS_StringSize ( run_name, ctx ),
+                        NGS_StringData ( run_name, ctx ) );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        TRY ( CSRA1_AlignmentInit ( ref, ctx, coll, "NGS_AlignmentRange", instname, NGS_StringData( run_name, ctx ), NGS_StringSize( run_name, ctx ), true, primary, secondary, id_offset ) )
+        {
+            TRY ( CSRA1_AlignmentInitRegion ( ref, ctx, ref -> primary_curs, ref -> secondary_curs, first, count ) )
+            {
+                return ( NGS_Alignment * ) ref;
+            }
+            CSRA1_AlignmentWhack ( ref, ctx );
+        }
+
+        free ( ref );
+    }
+
+    return NULL;
+}
+
diff --git a/libs/ngs/CSRA1_Alignment.h b/libs/ngs/CSRA1_Alignment.h
new file mode 100644
index 0000000..bd0846b
--- /dev/null
+++ b/libs/ngs/CSRA1_Alignment.h
@@ -0,0 +1,83 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_csra1_alignment_
+#define _h_csra1_alignment_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+struct VCursor;
+struct VDatabase;
+struct NGS_String;
+struct NGS_Cursor;
+struct NGS_Alignment;
+struct CSRA1_ReadCollection;
+
+struct NGS_Cursor const* CSRA1_AlignmentMakeDb( ctx_t ctx,
+                                                struct VDatabase const* db,
+                                                struct NGS_String const* run_name,
+                                                char const* table_name );
+
+struct NGS_Alignment * CSRA1_AlignmentMake ( ctx_t ctx, 
+                                             struct CSRA1_ReadCollection * coll,
+                                             int64_t alignId, 
+                                             char const* run_name, size_t run_name_size,
+                                             bool primary, 
+                                             uint64_t id_offset );
+
+struct NGS_Alignment * CSRA1_AlignmentIteratorMake( ctx_t ctx, 
+                                                    struct CSRA1_ReadCollection * coll,
+                                                    bool primary, 
+                                                    bool secondary, 
+                                                    const struct NGS_String  * run_name, 
+                                                    uint64_t id_offset );
+
+struct NGS_Alignment * CSRA1_AlignmentRangeMake( ctx_t ctx, 
+                                                 struct CSRA1_ReadCollection * coll,
+                                                 bool primary, 
+                                                 bool secondary, 
+                                                 const struct NGS_String  * run_name, 
+                                                 uint64_t id_offset,
+                                                 int64_t first,
+                                                 uint64_t count);
+
+struct NGS_Alignment * CSRA1_AlignmentIteratorMakeEmpty( ctx_t ctx );
+                                                 
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_csra1_alignment_ */
diff --git a/libs/ngs/CSRA1_Pileup.c b/libs/ngs/CSRA1_Pileup.c
new file mode 100644
index 0000000..f1cf19e
--- /dev/null
+++ b/libs/ngs/CSRA1_Pileup.c
@@ -0,0 +1,1921 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+struct CSRA1_Pileup;
+#define NGS_PILEUP struct CSRA1_Pileup
+
+#include "CSRA1_Pileup.h"
+#include "CSRA1_PileupEvent.h"
+#include "NGS_Reference.h"
+#include "NGS_Cursor.h"
+#include "NGS_String.h"
+
+#include <vdb/blob.h>
+#include <vdb/cursor.h>
+#include <klib/refcount.h>
+#include <klib/vector.h>
+#include <klib/sort.h>
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+
+#include <klib/rc.h>
+
+#if UNIX
+#include <sys/resource.h>
+#endif
+
+/* to turn off blob caching entirely, set to 0 */
+#define CACHED_BLOB_LIMIT ( 1 << 30 )
+
+/* The READ_AHEAD_LIMIT sets the total number of alignment ids to gather
+   at one time from the REFERENCE table indices. This is given as a constant,
+   although in the code it is passed as a parameter. We may want to make it
+   dependent upon detecting whether alignments are sorted. */
+#define READ_AHEAD_LIMIT 10000
+
+/* Heuristic quantity for gathering maximum projected alignment length */
+#define MIN_ALIGN_OBSERVE 100
+
+#if _DEBUGGING
+
+#define IGNORE_OVERLAP_REF_POS 0
+#define IGNORE_OVERLAP_REF_LEN 0
+#define IGNORE_SYSTEM_RLIMIT   0
+
+#include <stdio.h>
+static bool printing;
+void enable_pileup_printing ( void ) { printing = true; }
+#define PRINT( fmt, ... ) if ( printing ) fprintf ( stderr, fmt, __VA_ARGS__ )
+
+#else
+#define PRINT( fmt, ... ) ( ( void ) 0 )
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Pileup_Entry
+ */
+
+static
+void CC CSRA1_Pileup_EntryWhack ( DLNode * node, void * param )
+{
+    uint32_t i;
+    ctx_t ctx = ( ctx_t ) param;
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcDestroying );
+
+    CSRA1_Pileup_Entry * self = ( CSRA1_Pileup_Entry * ) node;
+
+    /* tear down stuff here */
+    for ( i = 0; i < sizeof self -> blob / sizeof self -> blob [ 0 ]; ++ i )
+    {
+        const VBlob * blob = self -> blob [ i ];
+        if ( blob != NULL )
+            VBlobRelease ( blob );
+    }
+
+    free ( self );
+}
+
+static
+CSRA1_Pileup_Entry * CSRA1_Pileup_EntryMake ( ctx_t ctx, int64_t row_id,
+    int64_t ref_zstart, uint64_t ref_len, bool secondary )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    CSRA1_Pileup_Entry * obj = calloc ( 1, sizeof * obj );
+    if ( obj == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating CSRA1_Pileup_Entry" );
+    else
+    {
+        obj -> row_id = row_id;
+        obj -> zstart = ref_zstart;
+        obj -> xend = ref_zstart + ref_len;
+        obj -> secondary = secondary;
+
+        obj -> status = pileup_entry_status_INITIAL;
+    }
+
+    return obj;
+}
+
+static
+int CSRA1_Pileup_EntryCmp ( const CSRA1_Pileup_Entry * a, const CSRA1_Pileup_Entry * b )
+{
+    if ( a -> zstart < b -> zstart )
+        return -1;
+    if ( a -> zstart > b -> zstart )
+        return 1;
+    if ( a -> xend > b -> xend )
+        return -1;
+    if ( a -> xend < b -> xend )
+        return 1;
+    if ( a -> secondary != b -> secondary )
+        return a -> secondary - b -> secondary;
+    if ( a -> row_id < b -> row_id )
+        return -1;
+    return a -> row_id > b -> row_id;
+}
+
+static
+void CSRA1_Pileup_EntrySort ( CSRA1_Pileup_Entry ** base, size_t count )
+{
+#define SWAP( a, b, off, size )                                                \
+    do                                                                         \
+    {                                                                          \
+        CSRA1_Pileup_Entry * tmp = * ( CSRA1_Pileup_Entry ** ) ( a );          \
+        * ( CSRA1_Pileup_Entry ** ) ( a ) = * ( CSRA1_Pileup_Entry ** ) ( b ); \
+        * ( CSRA1_Pileup_Entry ** ) ( b ) = tmp;                               \
+    }                                                                          \
+    while ( 0 )
+
+#define CMP( a, b )                                                                                 \
+    CSRA1_Pileup_EntryCmp ( * ( CSRA1_Pileup_Entry ** ) ( a ), * ( CSRA1_Pileup_Entry ** ) ( b ) )
+
+    KSORT ( base, count, sizeof * base, 0, sizeof * base );
+
+#undef SWAP
+#undef CMP
+}
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Pileup_AlignList
+ */
+
+static
+void CSRA1_Pileup_AlignListWhack ( CSRA1_Pileup_AlignList * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcDestroying );
+    DLListWhack ( & self -> pileup, CSRA1_Pileup_EntryWhack, ( void* ) ctx );
+    DLListWhack ( & self -> waiting, CSRA1_Pileup_EntryWhack, ( void* ) ctx );
+    self -> depth = self -> avail = 0;
+}
+
+static
+void CSRA1_PileupAlignListSort ( CSRA1_Pileup_AlignList * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    if ( self -> avail > 1 )
+    {
+        CSRA1_Pileup_Entry ** a = malloc ( self -> avail * sizeof * a );
+        if ( a == NULL )
+            SYSTEM_ERROR ( xcNoMemory, "allocating CSRA1_Pileup_Entry" );
+        else
+        {
+            CSRA1_Pileup_Entry * e = ( CSRA1_Pileup_Entry * )
+                DLListHead ( & self -> waiting );
+
+            uint32_t i, count = self -> avail;
+            for ( i = 0; i < count; ++ i )
+            {
+                a [ i ] = e;
+                e = ( CSRA1_Pileup_Entry * ) DLNodeNext ( & e -> node );
+            }
+
+            CSRA1_Pileup_EntrySort ( a, count );
+
+            DLListInit ( & self -> waiting );
+            for ( i = 0; i < count; ++ i )
+            {
+                e = a [ i ];
+                DLListPushTail ( & self -> waiting, & e -> node );
+            }
+
+            free ( a );
+        }
+    }
+}
+
+static
+void CSRA1_PileupAlignListMerge ( CSRA1_Pileup_AlignList * self, DLList * pa_waiting, uint32_t pa_avail )
+{
+    DLList sa_waiting = self -> waiting;
+    CSRA1_Pileup_Entry * pe = ( CSRA1_Pileup_Entry * ) DLListHead ( pa_waiting );
+    CSRA1_Pileup_Entry * se = ( CSRA1_Pileup_Entry * ) DLListHead ( & sa_waiting );
+
+    DLListInit ( & self -> waiting );
+
+    while ( pe != NULL && se != NULL )
+    {
+        if ( CSRA1_Pileup_EntryCmp ( pe, se ) < 0 )
+        {
+            DLListUnlink ( pa_waiting, & pe -> node );
+            DLListPushTail ( & self -> waiting, & pe -> node );
+            pe = ( CSRA1_Pileup_Entry * ) DLListHead ( pa_waiting );
+        }
+        else
+        {
+            DLListUnlink ( & sa_waiting, & se -> node );
+            DLListPushTail ( & self -> waiting, & se -> node );
+            se = ( CSRA1_Pileup_Entry * ) DLListHead ( & sa_waiting );
+        }
+    }
+
+    DLListAppendList ( & self -> waiting, pa_waiting );
+    DLListAppendList ( & self -> waiting, & sa_waiting );
+
+    self -> avail += pa_avail;
+}
+
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Pileup_RefCursorData
+ */
+
+static
+void CSRA1_Pileup_RefCursorDataWhack ( CSRA1_Pileup_RefCursorData * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    assert ( self != NULL );
+    KVectorRelease ( self -> pa_ids );
+    KVectorRelease ( self -> sa_ids );
+
+    NGS_CursorRelease ( self -> curs, ctx );
+}
+
+static
+void CSRA1_Pileup_RefCursorDataInit ( ctx_t ctx, CSRA1_Pileup_RefCursorData * obj,
+    const NGS_Cursor * curs, int64_t reference_start_id )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcDestroying );
+
+    assert ( obj != NULL );
+    assert ( curs != NULL );    
+
+    TRY ( obj -> curs = NGS_CursorDuplicate ( curs, ctx ) )
+    {
+        obj -> max_seq_len = NGS_CursorGetUInt32 ( curs, ctx, reference_start_id, reference_MAX_SEQ_LEN );
+    }
+}
+
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Pileup_AlignCursorData
+ */
+
+static
+void CSRA1_Pileup_AlignCursorDataWhack ( CSRA1_Pileup_AlignCursorData * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcDestroying );
+
+    uint32_t i;
+    for ( i = 0; i < sizeof self -> blob / sizeof self -> blob [ 0 ]; ++ i )
+        VBlobRelease ( self -> blob [ i ] );
+
+    VCursorRelease ( self -> curs );
+}
+
+static
+void CSRA1_Pileup_AlignCursorDataGetCell ( CSRA1_Pileup_AlignCursorData * self, ctx_t ctx,
+    int64_t row_id, uint32_t col_idx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    rc_t rc;
+    uint32_t elem_bits, boff;
+
+    if ( self -> blob [ col_idx ] != NULL )
+    {
+        rc = VBlobCellData ( self -> blob [ col_idx ], row_id, & elem_bits,
+            & self -> cell_data [ col_idx ], & boff, & self -> cell_len [ col_idx ] );
+        if ( rc == 0 )
+            return;
+
+        VBlobRelease ( self -> blob [ col_idx ] );
+        self -> blob [ col_idx ] = NULL;
+    }
+
+    self -> cell_data [ col_idx ] = NULL;
+
+    rc = VCursorGetBlobDirect ( self -> curs, & self -> blob [ col_idx ], row_id, self -> col_idx [ col_idx ] );
+    if ( rc != 0 )
+        INTERNAL_ERROR ( xcStorageExhausted, "VCursorGetBlobDirect rc = %R", rc );
+    else
+    {
+        rc = VBlobCellData ( self -> blob [ col_idx ], row_id, & elem_bits,
+            & self -> cell_data [ col_idx ], & boff, & self -> cell_len [ col_idx ] );
+        if ( rc != 0 )
+            INTERNAL_ERROR ( xcStorageExhausted, "VBlobCellData rc = %R", rc );
+    }
+}
+
+static
+void CSRA1_Pileup_AlignCursorDataGetNonEmptyCell ( CSRA1_Pileup_AlignCursorData * self, ctx_t ctx,
+    int64_t row_id, uint32_t col_idx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    TRY ( CSRA1_Pileup_AlignCursorDataGetCell ( self, ctx, row_id, col_idx ) )
+    {
+        if ( self -> cell_len [ col_idx ] == 0 )
+            INTERNAL_ERROR ( xcColumnEmpty, "zero-length cell data (row_id = %ld, col_idx = %u)", row_id, col_idx );
+    }
+}
+
+/*static
+uint8_t CSRA1_Pileup_AlignCursorDataGetUInt8 ( CSRA1_Pileup_AlignCursorData * self, ctx_t ctx,
+    int64_t row_id, uint32_t col_idx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    TRY ( CSRA1_Pileup_AlignCursorDataGetNonEmptyCell ( self, ctx, row_id, col_idx ) )
+    {
+        const uint8_t * p = self -> cell_data [ col_idx ];
+        return p [ 0 ];
+    }
+
+    return 0;
+}*/
+
+static
+int32_t CSRA1_Pileup_AlignCursorDataGetInt32 ( CSRA1_Pileup_AlignCursorData * self, ctx_t ctx,
+    int64_t row_id, uint32_t col_idx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    TRY ( CSRA1_Pileup_AlignCursorDataGetNonEmptyCell ( self, ctx, row_id, col_idx ) )
+    {
+        const int32_t * p = self -> cell_data [ col_idx ];
+        return p [ 0 ];
+    }
+
+    return 0;
+}
+
+static
+uint32_t CSRA1_Pileup_AlignCursorDataGetUInt32 ( CSRA1_Pileup_AlignCursorData * self, ctx_t ctx,
+    int64_t row_id, uint32_t col_idx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    TRY ( CSRA1_Pileup_AlignCursorDataGetNonEmptyCell ( self, ctx, row_id, col_idx ) )
+    {
+        const uint32_t * p = self -> cell_data [ col_idx ];
+        return p [ 0 ];
+    }
+
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Pileup
+ */
+
+enum
+{
+    /* the initial state of a pileup iterator object */
+    pileup_state_invalid,
+
+    /* the iterator needs to advance to the next position */
+    pileup_state_position,
+
+    /* the iterator needs to advance to the next chunk */
+    pileup_state_chunk,
+
+    /* the iterator needs to read alignment ids
+       and populate the alignment list */
+    pileup_state_populate,
+
+    /* the iterator has not yet had "next" called,
+       and needs to be primed for further operation */
+    pileup_state_initial,
+    pileup_state_initial_position,
+    pileup_state_initial_chunk,
+    pileup_state_initial_populate,
+
+    /* terminated states */
+    pileup_state_finished,
+    pileup_state_err,
+
+    /* object has been destroyed */
+    pileup_state_zombie
+};
+
+
+/* TBD - check these error types */
+static
+void CSRA1_PileupStateTest ( const CSRA1_Pileup * self, ctx_t ctx, uint32_t lineno )
+{
+    assert ( self != NULL );
+
+    switch ( self -> state )
+    {
+    case pileup_state_invalid:
+        ctx_event ( ctx, lineno, xc_sev_fail, xc_org_internal, xcIteratorUninitialized, "PileupIterator invalid state" );
+        break;
+    case pileup_state_position:
+    case pileup_state_chunk:
+    case pileup_state_populate:
+        break;
+    case pileup_state_initial:
+    case pileup_state_initial_position:
+    case pileup_state_initial_chunk:
+    case pileup_state_initial_populate:
+        ctx_event ( ctx, lineno, xc_sev_fail, xc_org_user, xcIteratorUninitialized,
+                    "Pileup accessed before a call to PileupIteratorNext()" );
+        break;
+    case pileup_state_finished:
+        ctx_event ( ctx, lineno, xc_sev_fail, xc_org_user, xcCursorExhausted, "No more rows available" );
+        break;
+    case pileup_state_err:
+        ctx_event ( ctx, lineno, xc_sev_fail, xc_org_user, xcIteratorUninitialized, "PileupIterator invalid state" );
+        break;
+    case pileup_state_zombie:
+        ctx_event ( ctx, lineno, xc_sev_fail, xc_org_internal, xcIteratorUninitialized, "PileupIterator accessed after destruction" );
+        break;
+    default:
+        ctx_event ( ctx, lineno, xc_sev_fail, xc_org_internal, xcIteratorUninitialized, "PileupIterator unknown state" );
+    }
+}
+
+#define CHECK_STATE( self, ctx ) \
+    CSRA1_PileupStateTest ( self, ctx, __LINE__ )
+
+
+static
+void CSRA1_PileupWhack ( CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    self -> state = pileup_state_zombie;
+
+    /* any alignments */
+    CSRA1_Pileup_AlignListWhack ( & self -> align, ctx );
+
+    /* alignment cursors, blobs */
+    CSRA1_Pileup_AlignCursorDataWhack ( & self -> pa, ctx );
+    CSRA1_Pileup_AlignCursorDataWhack ( & self -> sa, ctx );
+
+    /* reference cursor, blobs */
+    CSRA1_Pileup_RefCursorDataWhack ( & self -> ref, ctx );
+    
+    CSRA1_PileupEventWhack ( & self -> dad, ctx );
+}
+
+static
+NGS_String * CSRA1_PileupGetReferenceSpec ( const CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        return NGS_ReferenceGetCanonicalName ( self -> dad . dad . dad . ref, ctx );
+    }
+
+    return NULL;
+}
+
+static
+int64_t CSRA1_PileupGetReferencePosition ( const CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        return self -> ref_zpos;
+    }
+
+    return 0;
+}
+
+static
+char CSRA1_PileupGetReferenceBase ( const CSRA1_Pileup * cself, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    CSRA1_Pileup * self = ( CSRA1_Pileup * ) cself;
+
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        if ( self -> ref_base == 0 )
+        {
+            if ( self -> ref_chunk_bases == NULL )
+            {
+                const void * base;
+                uint32_t elem_bits, boff, row_len;
+                ON_FAIL ( NGS_CursorCellDataDirect ( self -> ref . curs, ctx, self -> ref_chunk_id,
+                    reference_READ, & elem_bits, & base, & boff, & row_len ) )
+                {
+                    return 0;
+                }
+
+                self -> ref_chunk_bases = base;
+                assert ( row_len == self -> ref . max_seq_len ||
+                         self -> ref_chunk_xend - self -> ref . max_seq_len + row_len >= self -> slice_xend );
+            }
+
+            assert ( self -> ref . max_seq_len != 0 );
+            self -> ref_base = self -> ref_chunk_bases [ self -> ref_zpos % self -> ref . max_seq_len ]; 
+        }
+
+        return self -> ref_base;
+
+    }
+
+    return 0;
+}
+
+static
+unsigned int CSRA1_PileupGetDepth ( const CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        return ( unsigned int ) self -> align . depth;
+    }
+
+    return 0;
+}
+
+static
+bool CSRA1_PileupPosition ( CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    if ( self -> align . avail != 0 )
+    {
+
+        CSRA1_Pileup_Entry * head = ( CSRA1_Pileup_Entry * )
+            DLListHead ( & self -> align . waiting );
+
+        uint32_t avail = 0;
+        CSRA1_Pileup_Entry * prev = NULL;
+        CSRA1_Pileup_Entry * entry = head;
+
+        /* walk the waiting list, adding everything to the end of pileup list */
+        while ( entry != NULL )
+        {
+            if ( entry -> zstart > self -> ref_zpos )
+                break;
+
+PRINT ( ">>> adding alignment at refpos %ld, row-id %ld: %ld-%ld ( zero-based, half-closed )\n",
+         self -> ref_zpos, entry -> row_id, entry -> zstart, entry -> xend );
+
+            prev = entry;
+
+            ++ avail;
+
+            entry = ( CSRA1_Pileup_Entry * )
+                DLNodeNext ( & entry -> node );
+        }
+
+        /* if "entry" is NULL, then everything waiting is ready */
+        if ( entry == NULL )
+        {
+            assert ( self -> align . avail == avail );
+
+            DLListAppendList ( & self -> align . pileup, & self -> align . waiting );
+            self -> align . depth += avail;
+            self -> align . avail = 0;
+        }
+
+        /* otherwise, just take the top guys off the end */
+        else if ( prev != NULL )
+        {
+            if ( head == prev )
+            {
+                assert ( avail == 1 );
+                DLListPopHead ( & self -> align . waiting );
+                DLListPushTail ( & self -> align . pileup, & head -> node );
+                self -> align . avail -= 1;
+                self -> align . depth += 1;
+            }
+            else
+            {
+                DLList transfer;
+
+                /* TBD - add this functionality to DLList */
+
+                /* sever the ties */
+                prev -> node . next = NULL;
+                entry -> node . prev = NULL;
+
+                /* put the new guys onto transfer list */
+                transfer . head = & head -> node;
+                transfer . tail = & prev -> node;
+
+                /* update the waiting list */
+                self -> align . waiting . head = & entry -> node;
+                self -> align . avail -= avail;
+
+                /* transfer elements */
+                DLListAppendList ( & self -> align . pileup, & transfer );
+                self -> align . depth += avail;
+            }
+        }
+    }
+
+    /* update cached REFERENCE values at current position */
+    self -> ref_base = 0;
+    
+    return self -> ref_zpos< self -> slice_xend;
+}
+
+static
+bool CSRA1_PileupAdvance ( CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    CSRA1_Pileup_Entry * entry;
+
+    /* see if advance is possible */
+    if ( ++ self -> ref_zpos >= self -> slice_xend )
+    {
+        /* should never go over */
+        assert ( self -> ref_zpos == self -> slice_xend );
+        self -> state = pileup_state_finished;
+        return false;
+    }
+
+    /* test for end of chunk */
+    if ( self -> ref_zpos == self -> ref_chunk_xend )
+    {
+        -- self -> ref_zpos;
+        self -> ref_chunk_id += 1;
+        self -> state = pileup_state_chunk;
+        return false;
+    }
+
+    /* drop everything that ends at current position */
+    entry = ( CSRA1_Pileup_Entry * )
+        DLListHead ( & self -> align . pileup );
+
+    while ( entry != NULL )
+    {
+        CSRA1_Pileup_Entry * next = ( CSRA1_Pileup_Entry * )
+            DLNodeNext ( & entry -> node );
+
+        /* test for temporarily cached data */
+        if ( entry -> temporary )
+        {
+            uint32_t i;
+#if _DEBUGGING
+            uint32_t num_flushed = 0;
+#endif
+
+            for ( i = 0; i < sizeof entry -> cell_data / sizeof entry -> cell_data [ 0 ]; ++ i )
+            {
+                if ( entry -> cell_data [ i ] != NULL && entry -> blob [ i ] == NULL )
+                {
+                    entry -> cell_data [ i ] = NULL;
+                    entry -> cell_len [ i ] = 0;
+#if _DEBUGGING
+                    ++ num_flushed;
+#endif
+                }
+            }
+
+PRINT ( ">>> flushed %u columns of temporary cell data\n", num_flushed );
+
+            entry -> temporary = false;
+        }
+
+        if ( entry -> xend == self -> ref_zpos || entry -> status == pileup_entry_status_DONE )
+        {
+PRINT ( ">>> dropping alignment at refpos %ld, row-id %ld: %ld-%ld ( zero-based, half-closed )\n",
+         self -> ref_zpos, entry -> row_id, entry -> zstart, entry -> xend );
+
+            DLListUnlink ( & self -> align . pileup, & entry -> node );
+            self -> align . depth -= 1;
+            self -> cached_blob_total -= entry -> blob_total;
+            CSRA1_Pileup_EntryWhack ( & entry -> node, ( void* ) ctx );
+        }
+
+        entry = next;
+    }
+
+    return CSRA1_PileupPosition ( self, ctx );
+}
+
+static
+void CSRA1_PileupChunk ( CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    /* zero out any cached REFERENCE cells for current chunk */
+    self -> ref_chunk_bases = NULL;
+    self -> ref_base = 0;
+
+    /* prepare next chunk */
+    self -> ref_chunk_xend = ( self -> ref_chunk_id - self -> reference_start_id + 1 ) * self -> ref . max_seq_len;
+
+    /* detect need to populate */
+    if ( self -> ref_chunk_id >= self -> idx_chunk_id )
+        self -> state = pileup_state_populate;
+    else
+        self -> state = pileup_state_position;
+}
+
+static
+uint32_t CSRA1_PileupGatherCategoryIds ( CSRA1_Pileup * self, ctx_t ctx, const KVector * ids, uint32_t col_idx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    const void * base;
+    uint32_t elem_bits, boff, row_len = 0;
+
+    TRY ( NGS_CursorCellDataDirect ( self -> ref . curs, ctx,
+          self -> idx_chunk_id, col_idx, & elem_bits, & base, & boff, & row_len ) )
+    {
+        uint32_t i;
+        const int64_t * cell = base;
+
+        /* test for alignment */
+        assert ( ( ( size_t ) cell & ( sizeof * cell - 1 ) ) == 0 );
+
+        /* copy the row ids */
+        for ( i = 0; i < row_len; ++ i )
+        {
+            rc_t rc = KVectorSetBool ( ( KVector * ) ids, cell [ i ], true );
+            if ( rc != 0 )
+            {
+                INTERNAL_ERROR ( xcStorageExhausted, "KVectorSetBool rc = %R", rc );
+                break;
+            }
+        }
+    }
+
+    return row_len;
+}
+
+static
+uint32_t CSRA1_PileupGatherChunkIds ( CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    uint32_t pa_ids = 0;
+    uint32_t sa_ids = 0;
+
+    if ( self -> pa . curs != NULL )
+    {
+        ON_FAIL ( pa_ids = CSRA1_PileupGatherCategoryIds ( self, ctx, self -> ref . pa_ids, reference_PRIMARY_ALIGNMENT_IDS ) )
+            return 0;
+    }
+
+    if ( self -> sa . curs != NULL )
+    {
+        ON_FAIL ( sa_ids = CSRA1_PileupGatherCategoryIds ( self, ctx, self -> ref . sa_ids, reference_SECONDARY_ALIGNMENT_IDS ) )
+            return 0;
+    }
+
+    return pa_ids + sa_ids;
+}
+
+static
+void CSRA1_PileupGatherIds ( CSRA1_Pileup * self, ctx_t ctx, uint32_t id_limit )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    rc_t rc;
+    KVector * v;
+    uint32_t total_ids;
+
+    /* create empty KVectors for each category in use */
+    if ( self -> pa . curs != NULL )
+    {
+        KVectorRelease ( self -> ref . pa_ids );
+        rc = KVectorMake ( & v );
+        self -> ref . pa_ids = v;
+        if ( rc != 0 )
+            INTERNAL_ERROR ( xcStorageExhausted, "KVectorMake rc = %R", rc );
+    }
+    if ( ! FAILED () && self -> sa . curs != NULL )
+    {
+        KVectorRelease ( self -> ref . sa_ids );
+        rc = KVectorMake ( & v );
+        self -> ref . sa_ids = v;
+        if ( rc != 0 )
+            INTERNAL_ERROR ( xcStorageExhausted, "KVectorMake rc = %R", rc );
+    }
+
+    /* set row ids appropriately */
+    self -> idx_chunk_id = self -> ref_chunk_id;
+
+    /* loop until we reach a limit */
+    total_ids = 0;
+    do
+    {
+        uint32_t align_ids;
+
+        ON_FAIL ( align_ids = CSRA1_PileupGatherChunkIds ( self, ctx ) )
+            break;
+
+        total_ids += align_ids;
+        ++ self -> idx_chunk_id;
+
+    }
+    while ( total_ids < id_limit && self -> idx_chunk_id <= self -> slice_end_id );
+}
+
+/*  Get RD_FILTER and check if it's present
+    e.g for SRR1164787 SECONDARY_ALIGNMENT row_id == 3
+    has invalid data (SEQ_ID == 0, no RD_FILTER) - 
+    we need to ignore such records
+
+    return: true - there is a valid RD_FILTER value in the db
+            false - there is no RD_FILTER in the db
+*/
+static bool CSRA1_Pileup_GetReadFilter ( CSRA1_Pileup * self, ctx_t ctx,
+    int64_t row_id, CSRA1_Pileup_AlignCursorData * cd, INSDC_read_filter* ret_val )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    TRY ( CSRA1_Pileup_AlignCursorDataGetCell ( cd, ctx, row_id, pileup_align_col_READ_FILTER ) )
+    {
+        if ( cd -> cell_len [ pileup_align_col_READ_FILTER ] == 0 )
+            return false;
+    }
+
+    * ret_val = *( (INSDC_read_filter*) cd -> cell_data [ pileup_align_col_READ_FILTER ]);
+    return true;
+}
+
+static
+bool CSRA1_PileupFilterAlignment ( CSRA1_Pileup * self, ctx_t ctx,
+    int64_t row_id, CSRA1_Pileup_AlignCursorData * cd )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    int32_t map_qual;
+    INSDC_read_filter read_filter;
+
+    if ( CSRA1_Pileup_GetReadFilter ( self, ctx, row_id, cd, & read_filter ) == true )
+    /*TRY ( read_filter = CSRA1_Pileup_AlignCursorDataGetUInt8 ( cd, ctx, row_id, pileup_align_col_READ_FILTER ) )*/
+    {
+        switch ( read_filter )
+        {
+        case READ_FILTER_PASS:
+
+            /* unless looking at mapping quality, accept */
+            if ( ( self -> filters & NGS_PileupFilterBits_map_qual ) == 0 )
+                return true;
+
+            /* look at mapping quality for alignment */
+            TRY ( map_qual = CSRA1_Pileup_AlignCursorDataGetInt32 ( cd, ctx, row_id, pileup_event_col_MAPQ ) )
+            {
+                /* generally specify a minimum mapping quality */
+                if ( ( self -> filters & NGS_PileupFilterBits_min_map_qual ) != 0 )
+                    return map_qual >= self -> map_qual;
+
+                /* but allow a maximum as well */
+                return map_qual <= self -> map_qual;
+            }
+            break;
+
+        case READ_FILTER_REJECT:
+            return ( self -> filters & NGS_PileupFilterBits_pass_bad ) != 0;
+
+        case READ_FILTER_CRITERIA:
+            return ( self -> filters & NGS_PileupFilterBits_pass_dups ) != 0;
+
+        case READ_FILTER_REDACTED:
+            /* do not include */
+            break;
+        }
+    }
+    return false;
+}
+
+static
+CSRA1_Pileup_Entry * CSRA1_PileupReadAlignment ( CSRA1_Pileup * self, ctx_t ctx,
+    int64_t row_id, CSRA1_Pileup_AlignCursorData * cd )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    bool pass;
+    uint64_t ref_len;
+    int64_t ref_zstart;
+    bool secondary = ( cd == & self -> sa );
+
+    TRY ( pass = CSRA1_PileupFilterAlignment ( self, ctx, row_id, cd ) )
+    {
+        if ( pass )
+        {
+            TRY ( ref_zstart = CSRA1_Pileup_AlignCursorDataGetUInt32 ( cd, ctx, row_id, pileup_align_col_REF_POS ) )
+            {
+                /* adjust for circular reference wrap-around.
+                   applied when gathering initial alignments whose
+                   effective starting coordinates will go negative */
+                ref_zstart += self -> effective_ref_zstart;
+
+                /* could perform early filtering here, but we want to
+                   detect the longest REF_LEN, so don't exclude */
+                TRY ( ref_len = CSRA1_Pileup_AlignCursorDataGetUInt32 ( cd, ctx, row_id, pileup_align_col_REF_LEN ) )
+                {
+                    int64_t ref_xend = ref_zstart + ref_len;
+
+                    self -> align . observed += 1;
+                    if ( ( uint32_t ) ref_len > self -> align . max_ref_len )
+                        self -> align . max_ref_len = ( uint32_t ) ref_len;
+
+                    if ( ref_zstart < self -> slice_xend && ref_xend > self -> slice_zstart )
+                    {
+                        CSRA1_Pileup_Entry * entry;
+
+                        TRY ( entry = CSRA1_Pileup_EntryMake ( ctx, row_id, ref_zstart, ref_len, secondary ) )
+                        {
+                            DLListPushTail ( & self -> align . waiting, & entry -> node );
+                            self -> align . avail += 1;
+                            return entry;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return NULL;
+}
+
+static
+bool CSRA1_PileupPopulateCategory ( CSRA1_Pileup * self, ctx_t ctx,
+    const KVector * ids, CSRA1_Pileup_AlignCursorData * cd )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    uint64_t cur, next;
+    bool ordered = true;
+    CSRA1_Pileup_Entry * last = NULL;
+
+    /* get first id */
+    bool ignore;
+    const char * vfunc = "First";
+    rc_t rc = KVectorGetFirstBool ( ids, & next, & ignore );
+
+    for ( cur = next; rc == 0; cur = next )
+    {
+        CSRA1_Pileup_Entry * entry;
+
+        /* "next" is our row-id */
+        ON_FAIL ( entry = CSRA1_PileupReadAlignment ( self, ctx, ( int64_t ) cur, cd ) )
+            break;
+
+        /* detect out of order alignments */
+        if ( ordered && entry != NULL )
+        {
+            if ( last != NULL && CSRA1_Pileup_EntryCmp ( entry, last ) < 0 )
+                ordered = false;
+
+            last = entry;
+        }
+
+        /* get next id */
+        vfunc = "Next";
+        rc = KVectorGetNextBool ( ids, & next, cur, & ignore );
+    }
+
+    if ( rc != 0 && GetRCState ( rc ) != rcNotFound )
+        INTERNAL_ERROR ( xcStorageExhausted, "KVectorGet%sBool rc = %R", vfunc, rc );
+
+    return ordered;
+}
+
+static
+void CSRA1_PileupPopulate ( CSRA1_Pileup * self, ctx_t ctx, uint32_t id_limit )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    /* read some ids */
+    TRY ( CSRA1_PileupGatherIds ( self, ctx, id_limit ) )
+    {
+        bool ordered = true;
+
+        /* gather primary alignments */
+        if ( self -> pa . curs != NULL )
+        {
+            TRY ( ordered = CSRA1_PileupPopulateCategory ( self, ctx, self -> ref . pa_ids, & self -> pa ) )
+            {
+                if ( ! ordered )
+                    CSRA1_PileupAlignListSort ( & self -> align, ctx );
+            }
+        }
+
+        /* gather secondary alignments */
+        if ( ! FAILED () && self -> sa . curs != NULL )
+        {
+            /* capture the waiting guys from primary alignment */
+            DLList pa_waiting = self -> align . waiting;
+            uint32_t pa_avail = self -> align . avail;
+
+            /* erase the list for secondary */
+            DLListInit ( & self -> align . waiting );
+            self -> align . avail = 0;
+
+            /* populate with secondary alignments */
+            TRY ( ordered = CSRA1_PileupPopulateCategory ( self, ctx, self -> ref . sa_ids, & self -> sa ) )
+            {
+                if ( ! ordered )
+                    CSRA1_PileupAlignListSort ( & self -> align, ctx );
+
+                if ( pa_avail != 0 )
+                    CSRA1_PileupAlignListMerge ( & self -> align, & pa_waiting, pa_avail );
+            }
+            CATCH_ALL ()
+            {
+                /* put anything that was already gathered onto list for destruction */
+                DLListPrependList ( & self -> align . waiting, & pa_waiting );
+                self -> align . avail += pa_avail;
+            }
+        }
+    }
+}
+
+static
+bool CSRA1_PileupGetOverlapPossible ( const CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    const void * base;
+    uint32_t elem_bits, boff, row_len;
+
+#if IGNORE_OVERLAP_REF_LEN
+    return true;
+#endif
+
+    /* read OVERLAP_REF_LEN */
+    TRY ( NGS_CursorCellDataDirect ( self -> ref . curs, ctx, self -> slice_start_id,
+              reference_OVERLAP_REF_LEN, & elem_bits, & base, & boff, & row_len ) )
+    {
+        const uint32_t * OVERLAP_REF_LEN = base;
+        uint32_t slice_start = ( uint32_t ) ( self -> slice_zstart % self -> ref . max_seq_len );
+
+        assert ( ( ( size_t ) OVERLAP_REF_LEN & ( sizeof * OVERLAP_REF_LEN - 1 ) ) == 0 );
+
+        if ( self -> pa . curs != NULL )
+        {
+            if ( OVERLAP_REF_LEN [ 0 ] > slice_start )
+                return true;
+        }
+        if ( self -> sa . curs != NULL )
+        {
+            if ( OVERLAP_REF_LEN [ 1 ] > slice_start )
+                return true;
+        }
+
+        /* according to the recorded data, no overlap is possible for linear references */
+        return self -> circular;
+    }
+    CATCH_ALL ()
+    {
+        CLEAR ();
+    }
+
+    return true;
+}
+
+static
+bool CSRA1_PileupGetOverlapChunkId ( CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    const void * base;
+    uint32_t elem_bits, boff, row_len;
+
+    /* TBD - there are cases when this may be valid even when circular */
+    if ( self -> circular )
+        return false;
+
+#if IGNORE_OVERLAP_REF_POS
+    return false;
+#endif
+
+    /* read OVERLAP_REF_POS */
+    TRY ( NGS_CursorCellDataDirect ( self -> ref . curs, ctx, self -> slice_start_id,
+              reference_OVERLAP_REF_POS, & elem_bits, & base, & boff, & row_len ) )
+    {
+        bool have_overlap_ref_pos = false;
+        const int32_t * OVERLAP_REF_POS = base;
+        int64_t new_chunk_id, ref_chunk_id = self -> ref_chunk_id;
+
+        assert ( ( ( size_t ) OVERLAP_REF_POS & ( sizeof * OVERLAP_REF_POS - 1 ) ) == 0 );
+
+        if ( self -> pa . curs != NULL && OVERLAP_REF_POS [ 0 ] > 0 )
+        {
+            new_chunk_id = ( OVERLAP_REF_POS [ 0 ] - 1 ) / self -> ref . max_seq_len + self -> reference_start_id;
+            if ( new_chunk_id < ref_chunk_id )
+                ref_chunk_id = new_chunk_id;
+            have_overlap_ref_pos = true;
+        }
+
+        if ( self -> sa . curs != NULL && OVERLAP_REF_POS [ 1 ] > 0 )
+        {
+            new_chunk_id = ( OVERLAP_REF_POS [ 1 ] - 1 ) / self -> ref . max_seq_len + self -> reference_start_id;
+            if ( new_chunk_id < ref_chunk_id )
+                ref_chunk_id = new_chunk_id;
+            have_overlap_ref_pos = true;
+        }
+
+        self -> ref_chunk_id = ref_chunk_id;
+        return have_overlap_ref_pos;
+    }
+    CATCH_ALL ()
+    {
+        CLEAR ();
+    }
+
+    return false;
+}
+
+static
+void CSRA1_PileupOverlap ( CSRA1_Pileup * self, ctx_t ctx, int64_t stop_xid )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    while ( ! FAILED () )
+    {
+        /* detect circular wrap around */
+        if ( self -> ref_chunk_id > self -> reference_last_id )
+        {
+            assert ( self -> circular );
+            assert ( self -> effective_ref_zstart != 0 );
+            self -> ref_chunk_id = self -> reference_start_id;
+            self -> effective_ref_zstart = 0;
+        }
+
+        /* exit condition #1: at end of overlap */
+        if ( self -> ref_chunk_id == stop_xid )
+            break;
+
+        /* run population from ref_chunk_id to stop_xid ( exclusive ) */
+        CSRA1_PileupPopulate ( self, ctx, 0 );
+        self -> ref_chunk_id = self -> idx_chunk_id;
+    }
+}
+
+static
+void CSRA1_PileupRevOverlap ( CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    while ( ! FAILED () )
+    {
+        DLList waiting;
+        uint32_t avail;
+
+        /* exit condition #1: at start of non-circular reference */
+        if ( ! self -> circular && self -> ref_chunk_id == self -> reference_start_id )
+            break;
+
+        /* exit condition #2: have seen sufficient alignments to
+           obtain a maximum projected length, and have backed up
+           far enough to include this length */
+        if ( self -> align . observed >= MIN_ALIGN_OBSERVE )
+        {
+            int64_t stop_xid = self -> ref_chunk_id;
+            int64_t overlap_zstart = self -> slice_zstart - self -> align . max_ref_len;
+
+            if ( overlap_zstart >= 0 )
+                self -> ref_chunk_id = overlap_zstart / self -> ref . max_seq_len + self -> reference_start_id;
+            else if ( ! self -> circular )
+                self -> ref_chunk_id = self -> reference_start_id;
+            else
+            {
+                uint64_t ref_len = NGS_ReferenceGetLength ( self -> dad . dad . dad . ref, ctx );
+                overlap_zstart += ref_len;
+                self -> ref_chunk_id = overlap_zstart / self -> ref . max_seq_len + self -> reference_start_id;
+                self -> effective_ref_zstart -= ref_len;
+            }
+
+            CSRA1_PileupOverlap ( self, ctx, stop_xid );
+            break;
+        }
+
+        /* save previous results */
+        waiting = self -> align . waiting;
+        avail = self -> align . avail;
+
+        /* reset accumulator */
+        DLListInit ( & self -> align . waiting );
+        self -> align . avail = 0;
+
+        /* need to back up one chunk and continue */
+        if ( self -> ref_chunk_id != self -> reference_start_id )
+            self -> ref_chunk_id -= 1;
+        else
+        {
+            assert ( self -> circular );
+
+            /* this should never occur */
+            if ( self -> effective_ref_zstart != 0 )
+                break;
+
+            /* linearize circularity */
+            self -> effective_ref_zstart -= NGS_ReferenceGetLength ( self -> dad . dad . dad . ref, ctx );
+
+            /* wrap around */
+            self -> ref_chunk_id = self -> reference_last_id;
+        }
+
+        CSRA1_PileupPopulate ( self, ctx, 0 );
+
+        /* regardless of error state, merge old results back in */
+        DLListAppendList ( & self -> align . waiting, & waiting );
+        self -> align . avail += avail;
+    }
+}
+
+static
+void CSRA1_PileupFirst ( CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    /* APPROACH
+
+       The general task here is to get all of the alignments in the
+       first chunk whose projection contains THE CURRENT POSITION,
+       in addition to all alignments within preceding chunks that also
+       contain the current position. So the process is almost exactly
+       like processing every normal chunk, with the differences that
+
+         a) we look for intersection rather than entry
+         b) we look outside ( to the left ) of the slice
+
+       Circular references with chunks 1..N may be linearized as
+
+         -N..2N
+
+       When looking to the left of the first chunk, we are limited by
+
+         a) the start of non-circular references
+         b) the maximum length of any alignment's projection, i.e.
+            only back up to current position - length of longest projection
+
+       An optimization exists that utilizes pre-calculated overlap
+       chunk row-ids. This optimization does not apply for circular
+       references.
+
+       In reality, we are interested in knowing the exact value of the
+       longest projection onto the reference of any alignment. If this is
+       not known a-priori, then a sampling of some number of alignments gives
+       a reasonable estimate. This sample count needs to be added to the
+       limitation "b" above, such that we can only know the maximum projection
+       once the sample size conditions are met.
+
+     */
+
+    /* initialize current chunk */
+    self -> ref_chunk_id = self -> slice_start_id;
+    self -> state = pileup_state_initial_populate;
+
+    /* test if there is even any possibility of overlap */
+    if ( ! CSRA1_PileupGetOverlapPossible ( self, ctx ) )
+        return;
+
+    /* process the current chunk */
+    TRY ( CSRA1_PileupPopulate ( self, ctx, READ_AHEAD_LIMIT ) )
+    {
+        /* we read ahead this far */
+        int64_t idx_chunk_id = self -> idx_chunk_id;
+
+        /* must save current avail list */
+        DLList waiting = self -> align . waiting;
+        uint32_t avail = self -> align . avail;
+
+        /* reinitialize */
+        DLListInit ( & self -> align . waiting );
+        self -> align . avail = 0;
+
+        /* look for OVERLAP_REF_POS optimization */
+        if ( CSRA1_PileupGetOverlapChunkId ( self, ctx ) )
+            CSRA1_PileupOverlap ( self, ctx, self -> slice_start_id );
+
+        /* scan backward for overlaps */
+        else
+            CSRA1_PileupRevOverlap ( self, ctx );
+
+        /* append previously saved waiting */
+        DLListAppendList ( & self -> align . waiting, & waiting );
+        self -> align . avail += avail;
+
+        /* restore to prior value */
+        self -> idx_chunk_id = idx_chunk_id;
+    }
+
+    /* restore to original value */
+    self -> ref_chunk_id = self -> slice_start_id;
+    self -> effective_ref_zstart = 0;
+    self -> state = pileup_state_initial_chunk;
+}
+
+static
+bool CSRA1_PileupIteratorGetNext ( CSRA1_Pileup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    bool pos_valid = false;
+
+    assert ( self != NULL );
+
+    while ( 1 )
+    {
+        switch ( self -> state )
+        {
+
+        case pileup_state_position:
+
+            ON_FAIL ( pos_valid = CSRA1_PileupAdvance ( self, ctx ) )
+            {
+                self -> state = pileup_state_err;
+                break;
+            }
+
+            if ( ! pos_valid )
+            {
+                assert ( self -> state != pileup_state_position );
+                continue;
+            }
+
+            break;
+
+        case pileup_state_chunk:
+
+            ON_FAIL ( CSRA1_PileupChunk ( self, ctx ) )
+            {
+                self -> state = pileup_state_err;
+                break;
+            }
+
+            assert ( self -> state != pileup_state_chunk );
+            continue;
+
+        case pileup_state_populate:
+
+            ON_FAIL ( CSRA1_PileupPopulate ( self, ctx, READ_AHEAD_LIMIT ) )
+            {
+                self -> state = pileup_state_err;
+                break;
+            }
+
+            self -> state = pileup_state_position;
+            continue;
+
+        case pileup_state_initial:
+
+            ON_FAIL ( CSRA1_PileupFirst ( self, ctx ) )
+            {
+                self -> state = pileup_state_err;
+                break;
+            }
+            continue;
+
+        case pileup_state_initial_position:
+
+            ON_FAIL ( pos_valid = CSRA1_PileupPosition ( self, ctx ) )
+            {
+                self -> state = pileup_state_err;
+                break;
+            }
+
+            if ( ! pos_valid )
+            {
+                assert ( self -> state != pileup_state_position );
+                continue;
+            }
+
+            self -> state = pileup_state_position;
+            break;
+
+        case pileup_state_initial_chunk:
+
+            ON_FAIL ( CSRA1_PileupChunk ( self, ctx ) )
+            {
+                self -> state = pileup_state_err;
+                break;
+            }
+
+            self -> state = pileup_state_initial_position;
+            continue;
+
+        case pileup_state_initial_populate:
+
+            ON_FAIL ( CSRA1_PileupPopulate ( self, ctx, READ_AHEAD_LIMIT ) )
+            {
+                self -> state = pileup_state_err;
+                break;
+            }
+
+            self -> state = pileup_state_initial_chunk;
+            continue;
+
+        case pileup_state_finished:
+
+            /* nothing to do */
+            break;
+
+        default:
+
+            /* generate exception */
+            CSRA1_PileupStateTest ( self, ctx, __LINE__ );
+        }
+
+        break;
+    }
+
+    /* partially reset the event iterator */
+    if ( ! FAILED () )
+    {
+        self -> dad . entry = ( CSRA1_Pileup_Entry * ) DLListHead ( & self -> align . pileup );
+        self -> dad . seen_first = false;
+    }
+
+    return pos_valid;
+}
+
+static NGS_Pileup_vt CSRA1_Pileup_vt =
+{
+    {
+        {
+            /* NGS_Refcount */
+            CSRA1_PileupWhack
+        },
+
+        /* NGS_PileupEvent */
+        CSRA1_PileupEventGetMappingQuality,
+        CSRA1_PileupEventGetAlignmentId,
+        CSRA1_PileupEventGetAlignmentPosition,
+        CSRA1_PileupEventGetFirstAlignmentPosition,
+        CSRA1_PileupEventGetLastAlignmentPosition,
+        CSRA1_PileupEventGetEventType,
+        CSRA1_PileupEventGetAlignmentBase,
+        CSRA1_PileupEventGetAlignmentQuality,
+        CSRA1_PileupEventGetInsertionBases,
+        CSRA1_PileupEventGetInsertionQualities,
+        CSRA1_PileupEventGetRepeatCount,
+        CSRA1_PileupEventGetIndelType,
+        CSRA1_PileupEventIteratorNext,
+        CSRA1_PileupEventIteratorReset
+    },
+
+    CSRA1_PileupGetReferenceSpec,    
+    CSRA1_PileupGetReferencePosition,
+    CSRA1_PileupGetReferenceBase,           
+    CSRA1_PileupGetDepth,            
+    CSRA1_PileupIteratorGetNext     
+};
+
+
+static
+void CSRA1_PileupPopulateAlignCurs ( ctx_t ctx, const VCursor * curs, uint32_t * col_idx, const char * tblname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    /* use preprocessor symbol that will disable assert() macro */
+#if defined NDEBUG
+#define COL_STRUCT                                                      \
+    struct { const char * spec; bool opt; }
+#define COL_SPEC1( cast, name )                                         \
+    { cast stringize ( name ), false }
+#define COL_SPEC2( cast, name )                                         \
+    { cast stringize ( name ), true }
+#define COL_SPEC3( cast, name )                                         \
+    { cast stringize ( name ), false }
+#else
+    /* assert() macro will evaluate expression */
+#define COL_STRUCT                                                      \
+    struct { const char * spec; size_t idx; bool opt; }
+#define COL_SPEC1( cast, name )                                         \
+    { cast stringize ( name ), pileup_event_col_ ## name, false }
+#define COL_SPEC2( cast, name )                                         \
+    { cast stringize ( name ), pileup_event_col_ ## name, true }
+#define COL_SPEC3( cast, name )                                         \
+    { cast stringize ( name ), pileup_align_col_ ## name, false }
+#endif
+
+    static COL_STRUCT cols [] =
+    {
+        /* pileup-event */
+        COL_SPEC1 ( "", MAPQ ),
+        COL_SPEC1 ( "", REF_OFFSET ),
+        COL_SPEC1 ( "(bool)", HAS_REF_OFFSET ),
+        COL_SPEC1 ( "", MISMATCH ),
+        COL_SPEC1 ( "(bool)", HAS_MISMATCH ),
+        COL_SPEC1 ( "", REF_ORIENTATION ),
+        COL_SPEC1 ( "", QUALITY ),
+
+        /* optional pileup-event */
+        COL_SPEC2 ( "", REF_OFFSET_TYPE ),
+
+        /* pileup only */
+        COL_SPEC3 ( "(INSDC:coord:zero)", REF_POS ),
+        COL_SPEC3 ( "(INSDC:coord:len)", REF_LEN ),
+        COL_SPEC3 ( "(INSDC:SRA:read_filter)", READ_FILTER )
+    };
+
+    rc_t rc;
+    size_t i;
+
+    for ( i = 0; i < sizeof cols / sizeof cols [ 0 ]; ++ i )
+    {
+        assert ( i == cols [ i ] . idx );
+
+        if ( ! cols [ i ] . opt )
+        {
+            rc = VCursorAddColumn ( curs, & col_idx [ i ], "%s", cols [ i ] . spec );
+            if ( rc != 0 )
+            {
+                INTERNAL_ERROR ( xcColumnNotFound, "VCursorAddColumn '%s' rc = %R", cols [ i ] . spec, rc );
+                return;
+            }
+            assert ( col_idx [ i ] != 0 );
+        }
+    }
+
+    rc = VCursorPermitPostOpenAdd ( curs );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcCursorOpenFailed,
+                         "ERROR: VCursorPermitPostOpenAdd(%s) failed with error: 0x%08x (%u) [%R]",
+                         tblname, rc, rc, rc );
+        return;
+    }
+
+    rc = VCursorOpen ( curs );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcCursorOpenFailed,
+                         "ERROR: VCursorOpen(%s) failed with error: 0x%08x (%u) [%R]",
+                         tblname, rc, rc, rc );
+        return;
+    }
+
+    for ( i = 0; i < sizeof cols / sizeof cols [ 0 ]; ++ i )
+    {
+        assert ( i == cols [ i ] . idx );
+
+        if ( cols [ i ] . opt )
+            VCursorAddColumn ( curs, & col_idx [ i ], "%s", cols [ i ] . spec );
+    }
+}
+
+static
+void CSRA1_PileupPopulatePACurs ( CSRA1_Pileup * obj, ctx_t ctx, const char * tblname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    const void * base;
+    uint32_t elem_bits, boff, row_len;
+    
+    /* need to ensure PRIMARY_ALIGNMENT_IDS are in ref_curs */
+    TRY ( NGS_CursorCellDataDirect ( obj -> ref . curs, ctx, obj -> reference_start_id,
+              reference_PRIMARY_ALIGNMENT_IDS, & elem_bits, & base, & boff, & row_len ) )
+    {
+        /* populate cursor with known stuff */
+        CSRA1_PileupPopulateAlignCurs ( ctx, obj -> pa . curs, obj -> pa . col_idx, tblname );
+    }
+}
+
+static
+void CSRA1_PileupPopulateSACurs ( CSRA1_Pileup * obj, ctx_t ctx, const char * tblname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    const void * base;
+    uint32_t elem_bits, boff, row_len;
+    
+    /* need to ensure SECONDARY_ALIGNMENT_IDS are in ref_curs */
+    TRY ( NGS_CursorCellDataDirect ( obj -> ref . curs, ctx, obj -> reference_start_id,
+              reference_SECONDARY_ALIGNMENT_IDS, & elem_bits, & base, & boff, & row_len ) )
+    {
+        /* populate cursor with known stuff */
+        CSRA1_PileupPopulateAlignCurs ( ctx, obj -> sa . curs, obj -> sa . col_idx, tblname );
+    }
+}
+
+static
+void CSRA1_PileupInitAlignment ( CSRA1_Pileup * obj, ctx_t ctx,
+    const VDatabase * db, const char * tblname, const VCursor ** curs,
+    void ( * init_curs ) ( CSRA1_Pileup * obj, ctx_t ctx, const char * tblname ) )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+    
+    const VTable * tbl;
+    rc_t rc = VDatabaseOpenTableRead ( db, & tbl, "%s", tblname );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcTableOpenFailed, 
+                         "ERROR: VDatabaseOpenTableRead(%s) failed with error: 0x%08x (%u) [%R]", 
+                         tblname, rc, rc, rc );
+    }
+    else
+    {
+        rc = VTableCreateCursorRead ( tbl, curs );
+        if ( rc != 0 )
+        {
+            INTERNAL_ERROR ( xcCursorCreateFailed,
+                             "ERROR: VTableCreateCursorRead(%s) failed with error: 0x%08x (%u) [%R]",
+                             tblname, rc, rc, rc);
+        }
+        else
+        {
+            ( * init_curs ) ( obj, ctx, tblname );
+        }
+
+        VTableRelease ( tbl );
+    }
+}
+
+
+static
+void CSRA1_PileupInit ( ctx_t ctx, CSRA1_Pileup * obj, const char * instname, 
+    NGS_Reference * ref, const VDatabase * db, const NGS_Cursor * ref_curs,
+    int64_t first_row_id, int64_t last_row_id, bool wants_primary, bool wants_secondary,
+    uint32_t filters, int32_t map_qual )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+    
+    assert ( obj != NULL );
+    assert ( ref != NULL );
+
+    /* initialize superclass */    
+    TRY ( CSRA1_PileupEventInit ( ctx, & obj -> dad, & CSRA1_Pileup_vt, "CSRA1_Pileup", instname, ref ) ) 
+    {
+        /* capture reference cursor */
+        TRY ( CSRA1_Pileup_RefCursorDataInit ( ctx, & obj -> ref, ref_curs, first_row_id ) )
+        {
+            TRY ( obj -> slice_xend = ( int64_t ) NGS_ReferenceGetLength ( ref, ctx ) )
+            {
+                /* determine whether the reference is circular */
+                TRY ( obj -> circular = NGS_ReferenceGetIsCircular ( ref, ctx ) )
+                {
+                    /* capture row range - these are the rows within REFERENCE table
+                       that represent the actual chromosome being analyzed */
+                    obj -> reference_start_id = obj -> slice_start_id = first_row_id;
+                    obj -> reference_last_id = obj -> slice_end_id = last_row_id;
+
+                    /* record filter criteria */
+                    obj -> filters = filters;
+                    obj -> map_qual = map_qual;
+
+                    /* set cache limits */
+                    obj -> cached_blob_limit = CACHED_BLOB_LIMIT;
+#if ! IGNORE_SYSTEM_RLIMIT
+#if UNIX
+                    {
+                        struct rlimit rlim;
+                        int status = getrlimit ( RLIMIT_AS, & rlim );
+                        if ( status == 0 )
+                            obj -> cached_blob_limit = rlim . rlim_cur >> 1;
+                    }
+#endif
+#endif
+                    /* initialize against one or more alignment tables */
+                    if ( wants_primary )
+                        CSRA1_PileupInitAlignment ( obj, ctx, db, "PRIMARY_ALIGNMENT", & obj -> pa . curs, CSRA1_PileupPopulatePACurs );
+                    if ( wants_secondary && ! FAILED () )
+                    {
+                        ON_FAIL ( CSRA1_PileupInitAlignment ( obj, ctx, db, "SECONDARY_ALIGNMENT", & obj -> sa . curs, CSRA1_PileupPopulateSACurs ) )
+                        {
+                            /* TBD - need the ability to convert hard error to warning
+                               stating that we have primary, but no secondary */
+                            if ( wants_primary )
+                                CLEAR ();
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+NGS_Pileup * CSRA1_PileupIteratorMake ( ctx_t ctx,
+    NGS_Reference * ref, const VDatabase * db, const NGS_Cursor * curs_ref,
+    int64_t first_row_id, int64_t last_row_id, bool wants_primary, bool wants_secondary,
+    uint32_t filters, int32_t map_qual )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    CSRA1_Pileup * obj;
+
+    assert ( db != NULL );
+    assert ( curs_ref != NULL );
+    assert ( wants_primary || wants_secondary );
+
+    obj = calloc ( 1, sizeof * obj );
+    if ( obj == NULL )
+    {
+        TRY ( NGS_String * ref_spec = NGS_ReferenceGetCommonName ( ref, ctx ) )
+        {
+            SYSTEM_ERROR ( xcNoMemory, 
+                           "allocating CSRA1_Pileup on '%.*s'", 
+                           NGS_StringSize ( ref_spec, ctx ), 
+                           NGS_StringData ( ref_spec, ctx ) );
+            NGS_StringRelease ( ref_spec, ctx );
+        }
+        CATCH_ALL ()
+        {
+            CLEAR ();
+            SYSTEM_ERROR ( xcNoMemory, "allocating CSRA1_Pileup" );
+        }
+    }
+    else
+    {
+#if TRACK_REFERENCES
+        char instname [ 256 ];
+        TRY ( NGS_String * ref_spec = NGS_ReferenceGetCommonName ( ref, ctx ) )
+        {
+            string_printf ( instname, 
+                            sizeof instname, 
+                            NULL, 
+                            "%.*s", 
+                            NGS_StringSize ( ref_spec, ctx ), 
+                            NGS_StringData ( ref_spec, ctx )
+                );
+            NGS_StringRelease ( ref_spec, ctx );
+            instname [ sizeof instname - 1 ] = 0;
+        }
+        CATCH_ALL ()
+        {
+            CLEAR ();
+            string_copy_measure ( instname, sizeof instname, "unknown" );
+        }
+#else
+        const char * instname = "unknown";
+#endif
+        TRY ( CSRA1_PileupInit ( ctx, obj, instname, ref, db, curs_ref, first_row_id, last_row_id, wants_primary, wants_secondary, filters, map_qual ) )
+        {
+            obj -> state = pileup_state_initial;
+            return & obj -> dad . dad;
+        }
+
+        CSRA1_PileupWhack ( obj, ctx );
+        free ( obj );
+    }
+
+    return NULL;
+}
+
+NGS_Pileup * CSRA1_PileupIteratorMakeSlice ( ctx_t ctx,
+    NGS_Reference * ref, const VDatabase * db, const NGS_Cursor * curs_ref,
+    int64_t first_row_id, int64_t last_row_id, uint64_t slice_zstart, 
+    uint64_t slice_size, bool wants_primary, bool wants_secondary,
+    uint32_t filters, int32_t map_qual )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+    uint64_t ref_len;
+
+    assert ( ref != NULL );
+
+    TRY ( ref_len = NGS_ReferenceGetLength ( ref, ctx ) )
+    {
+        if ( slice_zstart >= ref_len )
+        {
+            TRY ( NGS_String * ref_spec = NGS_ReferenceGetCommonName ( ref, ctx ) )
+            {
+                USER_ERROR ( xcParamOutOfBounds, 
+                             "slice start %lu, reference length %lu, "
+                             "allocating CSRA1_Pileup on '%.*s'", 
+                             slice_zstart,
+                             ref_len,
+                             NGS_StringSize ( ref_spec, ctx ), 
+                             NGS_StringData ( ref_spec, ctx ) );
+                NGS_StringRelease ( ref_spec, ctx );
+            }
+            CATCH_ALL ()
+            {
+                CLEAR ();
+                USER_ERROR ( xcParamOutOfBounds, "slice start %lu, reference length %lu, "
+                             "allocating CSRA1_Pileup", slice_zstart, ref_len );
+            }
+        }
+        else
+        {
+            TRY ( NGS_Pileup * obj = CSRA1_PileupIteratorMake ( ctx, ref, db, curs_ref,
+                first_row_id, last_row_id, wants_primary, wants_secondary, filters, map_qual ) )
+            {
+                CSRA1_Pileup * self = ( CSRA1_Pileup * ) obj;
+
+                /* limit slice length */
+                if ( self -> circular )
+                {
+                    /* limit to ref_len */
+                    if ( slice_size > ref_len ) 
+                        slice_size = ref_len;
+                }
+                else
+                {
+                    /* limit to end of reference */
+                    if ( slice_zstart + slice_size > ref_len )
+                        slice_size = ref_len - slice_zstart;
+                }
+
+                /* add slice boundaries */
+                self -> ref_zpos        = slice_zstart;
+                self -> slice_zstart    = slice_zstart;
+                self -> slice_xend      = slice_zstart + slice_size;
+
+                /* update slice row-ids */
+                assert ( self -> ref . max_seq_len != 0 );
+                self -> slice_start_id  = slice_zstart / self -> ref . max_seq_len + self -> reference_start_id;
+                self -> slice_end_id    = ( self -> slice_xend - 1 ) / self -> ref . max_seq_len + self -> reference_start_id;
+
+                return obj;
+            }
+        }
+    }
+
+    return NULL;
+}
+
+/* GetEntry
+ */
+const void * CSRA1_PileupGetEntry ( CSRA1_Pileup * self, ctx_t ctx,
+    CSRA1_Pileup_Entry * entry, uint32_t col_idx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    rc_t rc;
+    CSRA1_Pileup_AlignCursorData * cd = entry -> secondary ? & self -> sa : & self -> pa;
+
+    assert ( entry -> blob [ col_idx ] == NULL );
+
+    ON_FAIL ( CSRA1_Pileup_AlignCursorDataGetCell ( cd, ctx, entry -> row_id, col_idx ) )
+        return NULL;
+
+    /* if the entry is not already marked as having temporary data */
+    if ( ! entry -> temporary )
+    {
+        /* get the size of the newly loaded blob */
+        size_t blob_size;
+        const VBlob * blob = cd -> blob [ col_idx ];
+        rc = VBlobSize ( blob, & blob_size );
+
+        /* a failure would generally represent an internal error */
+        if ( rc != 0 )
+        {
+PRINT ( ">>> failed to determine blob size: rc = %u\n", rc );
+            entry -> temporary = true;
+        }
+
+        /* test if caching this blob would exceed limit, and mark temporary if so */
+        else if ( self -> cached_blob_total + blob_size > self -> cached_blob_limit )
+        {
+PRINT ( ">>> marking blob caching as temporary due to limits: %lu in cache, %lu in blob, limit %lu.\n"
+        , ( unsigned long ) self -> cached_blob_total
+        , ( unsigned long ) blob_size
+        , ( unsigned long ) self -> cached_blob_limit
+    );
+
+            entry -> temporary = true;
+        }
+        else
+        {
+            /* cache the blob on entry */
+            rc = VBlobAddRef ( blob );
+            if ( rc != 0 )
+            {
+#if 1
+                /* having the ability to NOT cache, eat error */
+                entry -> temporary = true;
+#else
+                INTERNAL_ERROR ( xcRefcountOutOfBounds, "VBlob at %#p", cd -> blob [ col_idx ] );
+                return NULL;
+#endif
+            }
+            else
+            {
+                /* record the blob reference on entry */
+                entry -> blob [ col_idx ] = cd -> blob [ col_idx ];
+
+                /* accounting */
+                entry -> blob_total += blob_size;
+                self -> cached_blob_total += blob_size;
+            }
+        }
+    }
+
+    /* in all cases, record the cell data */
+    entry -> cell_len [ col_idx ] = cd -> cell_len [ col_idx ];
+    return entry -> cell_data [ col_idx ] = cd -> cell_data [ col_idx ];
+}
diff --git a/libs/ngs/CSRA1_Pileup.h b/libs/ngs/CSRA1_Pileup.h
new file mode 100644
index 0000000..2fd39d4
--- /dev/null
+++ b/libs/ngs/CSRA1_Pileup.h
@@ -0,0 +1,341 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_csra1_pileup_
+#define _h_csra1_pileup_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_insdc_insdc_
+#include <insdc/insdc.h>
+#endif
+
+#ifndef _h_ngs_pileup_
+#include "NGS_Pileup.h"
+#endif
+
+#ifndef _h_csra1_reference_
+#include "CSRA1_Reference.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VBlob;
+struct VTable;
+struct VCursor;
+struct KVector;
+struct VDatabase;
+struct NGS_Cursor;
+struct NGS_Reference;
+
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Pileup_Entry
+ *  holds extracted data from an alignment record
+ *  kept in a list of alignments that intersect the current pileup position
+ */
+enum
+{
+    pileup_event_col_MAPQ,
+    pileup_event_col_REF_OFFSET,
+    pileup_event_col_HAS_REF_OFFSET,
+    pileup_event_col_MISMATCH,
+    pileup_event_col_HAS_MISMATCH,
+    pileup_event_col_REF_ORIENTATION,
+    pileup_event_col_QUALITY,
+
+    pileup_event_col_REF_OFFSET_TYPE,           /* OPTIONAL */
+
+    pileup_event_col_count
+};
+
+typedef struct CSRA1_Pileup_Entry_State CSRA1_Pileup_Entry_State;
+struct CSRA1_Pileup_Entry_State
+{
+    /* insertion count */
+    uint32_t ins_cnt;
+
+    /* deletion count */
+    uint32_t del_cnt;
+
+    /* offset into REF_OFFSET */
+    uint32_t ref_off_idx;
+
+    /* offset into MISMATCH */
+    uint32_t mismatch_idx;
+
+    /* offset into aligned sequence */
+    uint32_t seq_idx;
+
+    /* adjustment to "zstart" for current alignment */
+    volatile int32_t zstart_adj; /* TODO: find out why volatile or remove it */
+
+    /* set to a base or NUL if not set */
+    char mismatch;
+};
+
+enum 
+{
+    pileup_entry_status_INITIAL,
+    pileup_entry_status_VALID,
+    pileup_entry_status_DONE
+};
+
+typedef struct CSRA1_Pileup_Entry CSRA1_Pileup_Entry;
+struct CSRA1_Pileup_Entry
+{
+    /* list node */
+    DLNode node;
+
+    /* row id within the alignment table indicated by "secondary" */
+    int64_t row_id;
+
+    /* projected range upon reference */
+    int64_t zstart;
+    int64_t xend;  /* EXCLUSIVE */
+
+    /* blob cache to ensure cell-data remain valid */
+    struct VBlob const * blob [ pileup_event_col_count ];
+    size_t blob_total;
+
+    /* cell data of interest to pileup event */
+    const void * cell_data [ pileup_event_col_count ];
+    uint32_t cell_len [ pileup_event_col_count ];
+
+    /* current state of the event */
+    CSRA1_Pileup_Entry_State state_curr;
+
+    /* to properly set the current state we have to look ahead */
+    CSRA1_Pileup_Entry_State state_next;
+
+    /* true if alignment comes from secondary table */
+    bool secondary;
+
+    /* true if blobs were not entirely cached */
+    bool temporary;
+
+    /* true if event has already been seen */
+    bool seen;
+
+    /* the status of the entry: one of pileup_entry_status_* */
+    int status;
+};
+
+
+/*--------------------------------------------------------------------------
+ * CSRA1_PileupEvent
+ *  built-in base class iterator
+ */
+struct CSRA1_PileupEvent
+{
+    NGS_Pileup dad;
+
+    /* current alignment being examined */
+    CSRA1_Pileup_Entry * entry;
+
+    /* set to true within "next" */
+    bool seen_first;
+};
+
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Pileup_AlignList
+ *  list of alignments that intersect the current pileup position
+ */
+typedef struct CSRA1_Pileup_AlignList CSRA1_Pileup_AlignList;
+struct CSRA1_Pileup_AlignList
+{
+    DLList pileup;
+    DLList waiting;
+    uint32_t depth;
+    uint32_t avail;
+    uint32_t observed;
+    uint32_t max_ref_len;
+};
+
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Pileup_RefCursorData
+ *  cursor and cell data from REFERENCE table
+ */
+typedef struct CSRA1_Pileup_RefCursorData CSRA1_Pileup_RefCursorData;
+struct CSRA1_Pileup_RefCursorData
+{
+    struct NGS_Cursor const * curs;
+    struct KVector const * pa_ids;
+    struct KVector const * sa_ids;
+    uint32_t max_seq_len;
+};
+
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Pileup_AlignCursorData
+ *  cursor, blobs, cell data and column indices from *_ALIGNMENT table
+ */
+enum
+{
+    /* pileup-align columns are in a different space from pileup-event columns */
+    pileup_align_col_REF_POS = pileup_event_col_count,
+    pileup_align_col_REF_LEN,
+    pileup_align_col_READ_FILTER,
+
+    /* total of combined columns managed by pileup */
+    pileup_align_col_total
+};
+
+typedef struct CSRA1_Pileup_AlignCursorData CSRA1_Pileup_AlignCursorData;
+struct CSRA1_Pileup_AlignCursorData
+{
+    struct VCursor const * curs;
+    struct VBlob const * blob [ pileup_align_col_total ];
+    const void * cell_data [ pileup_align_col_total ];
+    uint32_t cell_len [ pileup_align_col_total ];
+    uint32_t col_idx [ pileup_align_col_total ];
+    bool missing_REF_OFFSET_TYPE;
+};
+
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Pileup
+ *  represents a pileup iterator
+ */
+typedef struct CSRA1_Pileup CSRA1_Pileup;
+struct CSRA1_Pileup
+{
+    struct CSRA1_PileupEvent dad;   
+
+    /* rows for this chromosome: [ reference_start_id, reference_last_id ] */
+    int64_t reference_start_id;
+    int64_t reference_last_id;
+
+    /* effective reference start */
+    int64_t effective_ref_zstart; /* ZERO-BASED */
+
+    /* rows for this slice: [ slice_start_id, slice_end_id ] */
+    int64_t slice_start_id;
+    int64_t slice_end_id;
+
+    /* reference coordinate window: [ slice_start, slice_xend ) */
+    int64_t slice_zstart;    /* ZERO-BASED */
+    int64_t slice_xend;      /* EXCLUSIVE  */
+
+    /* current iterator position on reference and its chunk id */
+    int64_t ref_zpos;
+    int64_t ref_chunk_id;
+
+    /* end of current chunk */
+    int64_t ref_chunk_xend;
+
+    /* current chunk for reading alignment ids */
+    int64_t idx_chunk_id;
+
+    /* cached vblob limit and sum */
+    size_t cached_blob_limit;
+    size_t cached_blob_total;
+
+    /* pointer to bases of current reference chunk */
+    const INSDC_dna_text * ref_chunk_bases;
+
+    /* list of alignments under this position */
+    CSRA1_Pileup_AlignList align;
+
+    /* reference cursor/data */
+    CSRA1_Pileup_RefCursorData ref;
+
+    /* alignment cursor/data */
+    CSRA1_Pileup_AlignCursorData pa, sa;
+
+    /* alignment filters */
+    uint32_t filters;
+    int32_t map_qual;
+
+    /* reference base - lazily populated */
+    char ref_base;
+
+    uint8_t state;
+    bool circular;      /* true iff Reference is circular */
+};
+
+/* Make
+ *  make an iterator across entire reference
+ */
+struct NGS_Pileup * CSRA1_PileupIteratorMake ( ctx_t ctx, struct NGS_Reference * ref,
+    struct VDatabase const * db, struct NGS_Cursor const * curs_ref,
+    int64_t first_row_id, int64_t last_row_id, bool wants_primary, bool wants_secondary,
+    uint32_t filters, int32_t map_qual );
+
+/* MakeSlice
+ *  make an iterator across a portion of reference
+ */
+struct NGS_Pileup * CSRA1_PileupIteratorMakeSlice ( ctx_t ctx, struct NGS_Reference * ref,
+    struct VDatabase const * db, struct NGS_Cursor const * curs_ref,
+    int64_t first_row_id, int64_t last_row_id, uint64_t slice_start, 
+    uint64_t slice_size, bool wants_primary, bool wants_secondary,
+    uint32_t filters, int32_t map_qual );
+
+/* GetEntry
+ */
+const void * CSRA1_PileupGetEntry ( CSRA1_Pileup * self, ctx_t ctx,
+    CSRA1_Pileup_Entry * entry, uint32_t col_idx );
+
+/* PileupEntry method declarations */
+void CSRA1_PileupEventWhack ( struct CSRA1_PileupEvent * self, ctx_t ctx );
+int CSRA1_PileupEventGetMappingQuality ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+struct NGS_String * CSRA1_PileupEventGetAlignmentId ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+struct NGS_Alignment * CSRA1_PileupEventGetAlignment ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+int64_t CSRA1_PileupEventGetAlignmentPosition ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+int64_t CSRA1_PileupEventGetFirstAlignmentPosition ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+int64_t CSRA1_PileupEventGetLastAlignmentPosition ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+int CSRA1_PileupEventGetEventType ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+char CSRA1_PileupEventGetAlignmentBase ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+char CSRA1_PileupEventGetAlignmentQuality ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+struct NGS_String * CSRA1_PileupEventGetInsertionBases ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+struct NGS_String * CSRA1_PileupEventGetInsertionQualities ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+unsigned int CSRA1_PileupEventGetRepeatCount ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+int CSRA1_PileupEventGetIndelType ( struct CSRA1_PileupEvent const * self, ctx_t ctx );
+bool CSRA1_PileupEventIteratorNext ( struct CSRA1_PileupEvent * self, ctx_t ctx );
+void CSRA1_PileupEventIteratorReset ( struct CSRA1_PileupEvent * self, ctx_t ctx );
+void CSRA1_PileupEventInit ( ctx_t ctx, struct CSRA1_PileupEvent * obj, const NGS_Pileup_vt * vt,
+    const char * clsname, const char * instname, struct NGS_Reference * ref );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_csra1_pileup_ */
diff --git a/libs/ngs/CSRA1_PileupEvent.c b/libs/ngs/CSRA1_PileupEvent.c
new file mode 100644
index 0000000..c56cd82
--- /dev/null
+++ b/libs/ngs/CSRA1_PileupEvent.c
@@ -0,0 +1,931 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+typedef struct CSRA1_PileupEvent CSRA1_PileupEvent;
+#define NGS_PILEUPEVENT CSRA1_PileupEvent
+#include "NGS_PileupEvent.h"
+
+#include "CSRA1_PileupEvent.h"
+#include "CSRA1_Pileup.h"
+#include "NGS_Pileup.h"
+#include "NGS_Reference.h"
+#include "NGS_ReadCollection.h"
+#include "NGS_Id.h"
+#include "NGS_String.h"
+#include "NGS_Cursor.h"
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <align/align.h>
+
+#include <klib/printf.h>
+
+#include "NGS_String.h"
+#include "NGS_Pileup.h"
+
+#include <sysalloc.h>
+#include <string.h> /* memset */
+
+#define CSRA1_PileupEventGetPileup( self ) \
+    ( ( CSRA1_Pileup * ) ( self ) )
+
+static
+void CSRA1_PileupEventStateTest ( const CSRA1_PileupEvent * self, ctx_t ctx, uint32_t lineno )
+{
+    assert ( self != NULL );
+
+    if ( ! self -> seen_first )
+    {
+        ctx_event ( ctx, lineno, xc_sev_fail, xc_org_user, xcIteratorUninitialized,
+                    "PileupEvent accessed before a call to PileupEventIteratorNext()" );
+    }
+    else if ( self -> entry == NULL )
+    {
+        ctx_event ( ctx, lineno, xc_sev_fail, xc_org_user, xcCursorExhausted, "No more rows available" );
+    }
+}
+
+#define CHECK_STATE( self, ctx ) \
+    CSRA1_PileupEventStateTest ( self, ctx, __LINE__ )
+
+
+void CSRA1_PileupEventWhack ( CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcDestroying );
+    NGS_PileupWhack ( & self -> dad, ctx );
+}
+
+static
+const void * CSRA1_PileupEventGetEntry ( const CSRA1_PileupEvent * self, ctx_t ctx,
+    CSRA1_Pileup_Entry * entry, uint32_t col_idx )
+{
+    if ( entry -> cell_data [ col_idx ] == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        return CSRA1_PileupGetEntry ( CSRA1_PileupEventGetPileup ( self ), ctx, entry, col_idx );
+    }
+
+    return entry -> cell_data [ col_idx ];
+}
+
+static
+const void * CSRA1_PileupEventGetNonEmptyEntry ( const CSRA1_PileupEvent * self, ctx_t ctx,
+    CSRA1_Pileup_Entry * entry, uint32_t col_idx )
+{
+    if ( entry -> cell_len [ col_idx ] == 0 )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+        if ( entry -> cell_data [ col_idx ] == NULL )
+            CSRA1_PileupGetEntry ( CSRA1_PileupEventGetPileup ( self ), ctx, entry, col_idx );
+        
+        if ( entry -> cell_len [ col_idx ] == 0 )
+        {
+            INTERNAL_ERROR ( xcColumnEmpty, "zero-length cell data (row_id = %ld, col_idx = %u)", entry->row_id, col_idx );
+            return NULL;
+        }
+    }
+    return entry -> cell_data [ col_idx ];
+}
+
+int CSRA1_PileupEventGetMappingQuality ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        const int32_t * MAPQ;
+        TRY ( MAPQ = CSRA1_PileupEventGetNonEmptyEntry ( self, ctx, self -> entry, pileup_event_col_MAPQ ) )
+        {
+            return MAPQ [ 0 ];
+        }
+    }
+    return 0;
+}
+
+struct NGS_String * CSRA1_PileupEventGetAlignmentId ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        NGS_ReadCollection * coll = self -> dad . dad . ref -> coll;
+        TRY ( const NGS_String * run = NGS_ReadCollectionGetName ( coll, ctx ) )
+        {
+            enum NGS_Object obj_type = self -> entry -> secondary ?
+                NGSObject_SecondaryAlignment : NGSObject_PrimaryAlignment;
+            return NGS_IdMake ( ctx, run, obj_type, self -> entry -> row_id );
+        }
+    }
+    return NULL;
+}
+
+int64_t CSRA1_PileupEventGetAlignmentPosition ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        return self -> entry -> state_curr . seq_idx;
+    }
+
+    return 0;
+}
+
+int64_t CSRA1_PileupEventGetFirstAlignmentPosition ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        return self -> entry -> zstart;
+    }
+
+    return 0;
+}
+
+int64_t CSRA1_PileupEventGetLastAlignmentPosition ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        return self -> entry -> xend - 1;
+    }
+    return 0;
+}
+
+int CSRA1_PileupEventGetEventType ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    int event_type = 0;
+
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        const bool * REF_ORIENTATION;
+
+        CSRA1_Pileup_Entry * entry = self -> entry;
+
+        /*
+          during "next" we took these steps:
+          1. if within a deletion, decrement deletion repeat && exit if ! 0
+          2. check HAS_REF_OFFSET. if not false:
+             a. a positive REF_OFFSET[ref_offset_idx] indicates a deletion
+             b. a negative REF_OFFSET[ref_offset_idx] indicates an insertion
+          3. move current offset ahead until ref_pos >= that of pileup
+          
+          so here, we first detect a deletion event
+          next, we detect a match or mismatch by checking HAS_MISMATCH.
+          if there was a prior insertion, we or that onto the event.
+          if this event starts a new alignment, or start onto event.
+          if it ends an alignment, or that onto the event.
+        */
+
+        if ( entry -> state_curr . del_cnt != 0 )
+            event_type = NGS_PileupEventType_deletion;
+        else
+        {
+            const bool * HAS_MISMATCH = entry -> cell_data [ pileup_event_col_HAS_MISMATCH ];
+            assert ( HAS_MISMATCH != NULL );
+            assert ( entry -> state_curr . seq_idx < entry -> cell_len [ pileup_event_col_HAS_MISMATCH ] );
+            event_type = HAS_MISMATCH [ entry -> state_curr . seq_idx ];
+        }
+
+        /* detect prior insertion */
+        if ( entry -> state_curr . ins_cnt != 0 )
+            event_type |= NGS_PileupEventType_insertion;
+
+        /* detect initial event */
+        if ( CSRA1_PileupEventGetPileup ( self ) -> ref_zpos == entry -> zstart )
+            event_type |= NGS_PileupEventType_start;
+
+        /* detect final event */
+        if ( CSRA1_PileupEventGetPileup ( self ) -> ref_zpos + 1 == entry -> xend ||
+            entry -> status == pileup_entry_status_DONE)
+        {
+            event_type |= NGS_PileupEventType_stop;
+        }
+
+        /* detect minus strand */
+        TRY ( REF_ORIENTATION = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_REF_ORIENTATION ) )
+        {
+            assert ( REF_ORIENTATION != NULL );
+            assert ( entry -> cell_len [ pileup_event_col_REF_ORIENTATION ] == 1 );
+            if ( REF_ORIENTATION [ 0 ] )
+                event_type |= NGS_PileupEventType_minus_strand;
+        }
+
+    }
+    
+    return event_type;
+}
+
+char CSRA1_PileupEventGetAlignmentBase ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        CSRA1_Pileup * pileup;
+        CSRA1_Pileup_Entry * entry = self -> entry;
+        const bool * HAS_MISMATCH = entry -> cell_data [ pileup_event_col_HAS_MISMATCH ];
+
+        if ( entry -> state_curr . del_cnt != 0 )
+            return '-';
+
+        assert ( HAS_MISMATCH != NULL );
+        assert ( entry -> state_curr . seq_idx < entry -> cell_len [ pileup_event_col_HAS_MISMATCH ] );
+
+        if ( HAS_MISMATCH [ entry -> state_curr . seq_idx ] )
+        {
+            if ( entry -> state_curr . mismatch == 0 )
+            {
+                const INSDC_dna_text * MISMATCH;
+                TRY ( MISMATCH = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_MISMATCH ) )
+                {
+                    if ( entry -> state_curr . mismatch_idx < entry -> cell_len [ pileup_event_col_MISMATCH ] )
+                        entry -> state_curr . mismatch = MISMATCH [ entry -> state_curr . mismatch_idx ];
+                }
+            }
+
+            return entry -> state_curr . mismatch;
+        }
+
+        pileup = CSRA1_PileupEventGetPileup ( self );
+        if ( pileup -> ref_base == 0 )
+        {
+            if ( pileup -> ref_chunk_bases == NULL )
+            {
+                const void * base;
+                uint32_t elem_bits, boff, row_len;
+                ON_FAIL ( NGS_CursorCellDataDirect ( pileup -> ref . curs, ctx, pileup -> ref_chunk_id,
+                    reference_READ, & elem_bits, & base, & boff, & row_len ) )
+                {
+                    return 0;
+                }
+
+                pileup -> ref_chunk_bases = base;
+                assert ( row_len == pileup -> ref . max_seq_len ||
+                         pileup -> ref_chunk_xend - pileup -> ref . max_seq_len + row_len >= pileup -> slice_xend );
+            }
+
+            assert ( pileup -> ref . max_seq_len != 0 );
+            pileup -> ref_base = pileup -> ref_chunk_bases [ CSRA1_PileupEventGetPileup ( self ) -> ref_zpos % pileup -> ref . max_seq_len ]; 
+        }
+
+        return pileup -> ref_base;
+    }
+    return 0;
+}
+
+char CSRA1_PileupEventGetAlignmentQuality ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        const INSDC_quality_phred * QUALITY;
+
+        CSRA1_Pileup_Entry * entry = self -> entry;
+
+        if ( entry -> state_curr . del_cnt != 0 )
+            return '!';
+        
+        TRY ( QUALITY = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_QUALITY ) )
+        {
+            assert ( QUALITY != NULL );
+            assert ( entry -> state_curr . seq_idx < entry -> cell_len [ pileup_event_col_QUALITY ] );
+            return ( char ) ( QUALITY [ entry -> state_curr . seq_idx ] + 33 );
+        }
+    }
+    return 0;
+}
+
+struct NGS_String * CSRA1_PileupEventGetInsertionBases ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        CSRA1_Pileup_Entry * entry = self -> entry;
+
+        /* handle the case where there is no insertion */
+        if ( entry -> state_curr . ins_cnt == 0 )
+        {
+            return NGS_StringMake ( ctx, "", 0 );
+        }
+        else
+        {
+            /* allocate a buffer for the NGS_String */
+            char * buffer = calloc ( 1, entry -> state_curr . ins_cnt + 1 );
+            if ( buffer == NULL )
+                SYSTEM_ERROR ( xcNoMemory, "allocating %zu bytes", entry -> state_curr . ins_cnt + 1 );
+            else
+            {
+                const INSDC_dna_text * MISMATCH;
+                const bool * HAS_MISMATCH = entry -> cell_data [ pileup_event_col_HAS_MISMATCH ];
+                assert ( HAS_MISMATCH != NULL );
+
+                /* it is "possible" but not likely that we may not need the MISMATCH cell.
+                   this would be the case if there was an insertion that exactly repeated
+                   a region of the reference, such that there were no mismatches in it.
+                   but even so, it should not be a problem to prefetch MISMATCH */
+                TRY ( MISMATCH = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_MISMATCH ) )
+                {
+                    uint32_t ref_first = entry -> state_curr . seq_idx;
+                    uint32_t mismatch_idx = entry -> state_curr . mismatch_idx;
+                    uint32_t seq_idx, ins_start = entry -> state_curr . seq_idx - entry -> state_curr . ins_cnt;
+
+                    assert ( MISMATCH != 0 );
+
+                    /* seq_idx MUST be > ins_cnt, which is non-zero, ...
+                       for seq_idx to be == ins_cnt implies that the sequence
+                       starts with an insertion, otherwise considered a soft-clip,
+                       and not an insertion at all.
+                     */
+                    assert ( entry -> state_curr . seq_idx > entry -> state_curr . ins_cnt );
+
+                    /* fill in the buffer with each entry from mismatch */
+                    for ( seq_idx = entry -> state_curr . seq_idx - 1; seq_idx >= ins_start; -- seq_idx )
+                    {
+                        /* pull base from MISMATCH */
+                        if ( HAS_MISMATCH [ seq_idx ] )
+                            buffer [ seq_idx - ins_start ] = MISMATCH [ -- mismatch_idx ];
+
+                        /* will need to get base from reference */
+                        else
+                            ref_first = seq_idx;
+                    }
+
+                    /* if there are some to be filled from reference */
+                    if ( entry -> state_curr . mismatch_idx - mismatch_idx != entry -> state_curr . ins_cnt )
+                    {
+                        CSRA1_Pileup * pileup = CSRA1_PileupEventGetPileup ( self );
+
+                        /* a little more complex than we'd like here...
+                           chances are quite good that the matched portion of the reference
+                           is in our current chunk, but it's not guaranteed,
+                           nor is it guaranteed to be in a single chunk. */
+
+                        /* the number of characters in string that could come from reference */
+                        uint32_t str_len = entry -> state_curr . seq_idx - ref_first;
+
+                        /* offset the string buffer to the first base to be filled by reference */
+                        char * rbuffer = & buffer [ entry -> state_curr . ins_cnt - str_len ];
+
+                        /* the current chunk of reference bases or NULL */
+                        const INSDC_dna_text * READ = pileup -> ref_chunk_bases;
+
+                        /* generate range of reference positions */
+                        int64_t ins_ref_zstart = CSRA1_PileupEventGetPileup ( self ) -> ref_zpos - ( int64_t ) str_len;
+                        int64_t ins_ref_last = CSRA1_PileupEventGetPileup ( self ) -> ref_zpos - 1;
+
+                        /* generate range of reference chunk ids */
+                        int64_t ins_ref_start_id = ins_ref_zstart / pileup -> ref . max_seq_len + pileup -> reference_start_id;
+                        int64_t ins_ref_last_id = ins_ref_last / pileup -> ref . max_seq_len + pileup -> reference_start_id;
+
+                        /* the starting offset into the left-most reference chunk */
+                        uint32_t ref_off = ( uint32_t ) ( ins_ref_zstart % pileup -> ref . max_seq_len );
+
+                        /* check for error in the starting position: must be >= 0 */
+                        if ( ins_ref_zstart < 0 )
+                        {
+                            INTERNAL_ERROR ( xcParamOutOfBounds, "insertion string accessing reference at position %ld", ins_ref_zstart );
+                            free ( buffer );
+                            return NULL;
+                        }
+
+                        /* try to take advantage of the chunk that's loaded right now */
+                        if ( READ != NULL && pileup -> ref_chunk_id == ins_ref_last_id )
+                        {
+                            /* most common case - everything within this chunk */
+                            if ( ins_ref_start_id == ins_ref_last_id )
+                            {
+                                /* "seq_off" is implied 0, i.e. start of insertion sequence.
+                                   "ref_off" is calculated start of insert in reference coords modulo chunk size */
+                                for ( seq_idx = 0; seq_idx < str_len; ++ seq_idx )
+                                {
+                                    if ( rbuffer [ seq_idx ] == 0 )
+                                        rbuffer [ seq_idx ] = READ [ ref_off + seq_idx ];
+                                }
+                                goto buffer_complete;
+                            }
+                            /* less common case - share only part of this chunk */
+                            else
+                            {
+                                /* "ref_off" is implied 0, i.e. start of reference chunk which is
+                                   known to be the last but not first chunk, therefore the start is
+                                   at 0 where the insertion crosses chunk boundaries.
+                                   "seq_off" is the start of the last portion of the string to
+                                   intersect this reference chunk. */
+                                uint32_t seq_off = str_len - ( uint32_t ) ( CSRA1_PileupEventGetPileup ( self ) -> ref_zpos % pileup -> ref . max_seq_len );
+                                for ( seq_idx = seq_off; seq_idx < str_len; ++ seq_idx )
+                                {
+                                    if ( rbuffer [ seq_idx ] == 0 )
+                                        rbuffer [ seq_idx ] = READ [ seq_idx - seq_off ];
+                                }
+
+                                /* the last part of the string has been completed */
+                                str_len = seq_off;
+                                -- ins_ref_last_id;
+                            }
+                        }
+
+                        /* forget current reference chunk */
+                        pileup -> ref_chunk_bases = NULL;
+                        pileup -> ref_base = 0;
+
+                        /* set the reference offset of initial chunk */
+                        ref_off = ( uint32_t ) ( ins_ref_zstart % pileup -> ref . max_seq_len );
+
+                        /* walk from ins_ref_start_id to ins_ref_last_id */
+                        for ( seq_idx = 0; ins_ref_start_id <= ins_ref_last_id; ++ ins_ref_start_id, ref_off = 0 )
+                        {
+                            const void * base;
+                            uint32_t limit, seq_off, row_len;
+                            ON_FAIL ( NGS_CursorCellDataDirect ( pileup -> ref . curs, ctx, ins_ref_start_id,
+                                reference_READ, & limit, & base, & seq_off, & row_len ) )
+                            {
+                                READ = NULL;
+                                break;
+                            }
+
+                            READ = base;
+
+                            /* the total number of bases left in insertion string */
+                            limit = str_len - seq_idx;
+
+                            /* cannot exceed the bases available in this chunk */
+                            if ( ref_off + limit > row_len )
+                                limit = row_len - ref_off;
+
+                            /* end index within string */
+                            limit += seq_idx;
+
+                            for ( seq_off = seq_idx; seq_idx < limit; ++ seq_idx )
+                            {
+                                if ( rbuffer [ seq_idx ] == 0 )
+                                    rbuffer [ seq_idx ] = READ [ ref_off + seq_idx - seq_off ];
+                            }
+
+                            /* we stopped either due to:
+                               1. end of string, or
+                               2. end of chunk - in which case
+                                  a. must not be an end chunk, i.e. has row_len == MAX_SEQ_LEN, and
+                                  b. we must loop again
+                            */
+                            assert ( seq_idx == str_len || ( row_len == pileup -> ref . max_seq_len && ins_ref_start_id < ins_ref_last_id ) );
+                        }
+
+                        /* finally, if at this point we have cached the READ for reference
+                           and within our current chunk, save it on the pileup */
+                        if ( ins_ref_last_id == pileup -> ref_chunk_id )
+                            pileup -> ref_chunk_bases = READ;
+                    }
+
+                    if ( ! FAILED () )
+                    {
+                        NGS_String * bases;
+
+                    buffer_complete:
+
+                        TRY ( bases = NGS_StringMakeOwned ( ctx, buffer, entry -> state_curr . ins_cnt ) )
+                        {
+                            return bases;
+                        }
+                    }
+                }
+
+                free ( buffer );
+            }
+        }
+    }
+
+    return NULL;
+}
+
+struct NGS_String * CSRA1_PileupEventGetInsertionQualities ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        CSRA1_Pileup_Entry * entry = self -> entry;
+
+        /* handle the case where there is no insertion */
+        if ( entry -> state_curr . ins_cnt == 0 )
+        {
+            return NGS_StringMake ( ctx, "", 0 );
+        }
+        else
+        {
+            /* allocate a buffer for the NGS_String */
+            char * buffer = calloc ( 1, entry -> state_curr . ins_cnt + 1 );
+            if ( buffer == NULL )
+                SYSTEM_ERROR ( xcNoMemory, "allocating %zu bytes", entry -> state_curr . ins_cnt + 1 );
+            else
+            {
+                const INSDC_quality_phred * QUALITY;
+                TRY ( QUALITY = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_QUALITY ) )
+                {
+                    NGS_String * bases;
+                    uint32_t i, qstart = entry -> state_curr . seq_idx - entry -> state_curr . ins_cnt;
+
+                    assert ( QUALITY != NULL );
+                    assert ( entry -> state_curr . seq_idx <= entry -> cell_len [ pileup_event_col_QUALITY ] );
+                    assert ( entry -> state_curr . seq_idx >= entry -> state_curr . ins_cnt );
+
+                    for ( i = 0; i < entry -> state_curr . ins_cnt; ++ i )
+                        buffer [ i ] = ( char ) ( QUALITY [ qstart + i ] + 33 );
+
+                    TRY ( bases = NGS_StringMakeOwned ( ctx, buffer, entry -> state_curr . ins_cnt ) )
+                    {
+                        return bases;
+                    }
+                }
+
+                free ( buffer );
+            }
+        }
+    }
+
+    return NULL;
+}
+
+unsigned int CSRA1_PileupEventGetRepeatCount ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        bool event_type;
+        uint32_t repeat, limit;
+        const bool * HAS_MISMATCH, * HAS_REF_OFFSET;
+        const CSRA1_Pileup_Entry * entry = self -> entry;
+
+        /* handle the easy part first */
+        if ( entry -> state_curr . del_cnt != 0 )
+            return entry -> state_curr . del_cnt;
+
+        /* now, count the number of repeated matches or mismatches,
+           WITHOUT any intervening insertions or deletions */
+        HAS_MISMATCH = entry -> cell_data [ pileup_event_col_HAS_MISMATCH ];
+        HAS_REF_OFFSET = entry -> cell_data [ pileup_event_col_HAS_REF_OFFSET ];
+        limit = entry -> xend - ( entry -> zstart + entry -> state_curr . zstart_adj );
+
+        /* grab the type of event we have now */
+        event_type = HAS_MISMATCH [ entry -> state_curr . seq_idx ];
+        
+        for ( repeat = 1; repeat < limit; ++ repeat )
+        {
+            if ( HAS_REF_OFFSET [ entry -> state_curr . seq_idx + repeat ] )
+                break;
+            if ( HAS_MISMATCH [ entry -> state_curr . seq_idx + repeat ] != event_type )
+                break;
+        }
+
+        return repeat;
+    }
+    return 0;
+}
+
+int CSRA1_PileupEventGetIndelType ( const CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    TRY ( CHECK_STATE ( self, ctx ) )
+    {
+        CSRA1_Pileup_Entry * entry = self -> entry;
+
+        if ( entry -> state_curr . del_cnt != 0 || entry -> state_curr . ins_cnt != 0 )
+        {
+            CSRA1_Pileup * pileup = CSRA1_PileupEventGetPileup ( self );
+            CSRA1_Pileup_AlignCursorData * cd = entry -> secondary ? & pileup -> sa : & pileup -> pa;
+            if ( ! cd -> missing_REF_OFFSET_TYPE )
+            {
+                const NCBI_align_ro_type * REF_OFFSET_TYPE;
+                TRY ( REF_OFFSET_TYPE = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_REF_OFFSET_TYPE ) )
+                {
+                    assert ( REF_OFFSET_TYPE != NULL );
+                    assert ( entry -> state_curr . ref_off_idx > 0 );
+                    assert ( entry -> state_curr . ref_off_idx <= entry -> cell_len [ pileup_event_col_REF_OFFSET_TYPE ] );
+                    switch ( REF_OFFSET_TYPE [ entry -> state_curr . ref_off_idx - 1 ] )
+                    {
+                    case NCBI_align_ro_normal:
+                    case NCBI_align_ro_soft_clip:
+                        break;
+                    case NCBI_align_ro_intron_plus:
+                        return NGS_PileupIndelType_intron_plus;
+                    case NCBI_align_ro_intron_minus:
+                        return NGS_PileupIndelType_intron_minus;
+                    case NCBI_align_ro_intron_unknown:
+                        return NGS_PileupIndelType_intron_unknown;
+                    case NCBI_align_ro_complete_genomics:
+                        if ( entry -> state_curr . ins_cnt != 0 )
+                            return NGS_PileupIndelType_read_overlap;
+                        assert ( entry -> state_curr . del_cnt != 0 );
+                        return NGS_PileupIndelType_read_gap;
+                    }
+                }
+                CATCH_ALL ()
+                {
+                    CLEAR ();
+                    cd -> missing_REF_OFFSET_TYPE = true;
+                }
+            }
+        }
+
+        return NGS_PileupIndelType_normal;
+    }
+    return 0;
+}
+
+static
+void CSRA1_PileupEventEntryFocus ( CSRA1_PileupEvent * self, CSRA1_Pileup_Entry * entry )
+{
+    const bool * HAS_MISMATCH = entry -> cell_data [ pileup_event_col_HAS_MISMATCH ];
+    const bool * HAS_REF_OFFSET = entry -> cell_data [ pileup_event_col_HAS_REF_OFFSET ];
+    const int32_t * REF_OFFSET = entry -> cell_data [ pileup_event_col_REF_OFFSET ];
+
+    /* we need the entry to be fast-forwarded */
+    int32_t ref_zpos_adj, plus_end_pos;
+    uint32_t next_ins_cnt;
+
+advance_to_the_next_position: /* TODO: try to reorganise the function not to have this goto */
+
+    ref_zpos_adj = CSRA1_PileupEventGetPileup ( self ) -> ref_zpos - entry -> zstart;
+    plus_end_pos = entry->status == pileup_entry_status_INITIAL ? 0 : 1;
+    assert ( ref_zpos_adj >= 0 );
+
+    /* always lose any insertion, forget cached values */
+    /*entry -> state_next . ins_cnt = 0;*/
+    entry -> state_next . mismatch = 0;
+    next_ins_cnt = 0; /* this variable is needed not to erase
+                         state_curr.ins_count on the first iteration
+                         of the next while-loop */ /* TODO: advise with Kurt about the case with INITIAL - should it be reset? */
+
+    /* must advance in all but initial case */
+    assert ( ref_zpos_adj + plus_end_pos > entry -> state_next . zstart_adj || entry -> state_next . zstart_adj == 0 );
+
+    /* walk forward */
+    while ( ref_zpos_adj + plus_end_pos > entry -> state_next . zstart_adj )
+    {
+        entry -> state_curr = entry -> state_next;
+
+        /* within a deletion */
+        if ( entry -> state_next . del_cnt != 0 )
+            -- entry -> state_next . del_cnt;
+
+        else
+        {
+            uint32_t prior_seq_idx = entry -> state_next . seq_idx ++;
+
+            /* adjust mismatch_idx */
+            assert ( HAS_MISMATCH != NULL );
+            assert ( prior_seq_idx < entry -> cell_len [ pileup_event_col_HAS_MISMATCH ] );
+            entry -> state_next . mismatch_idx += HAS_MISMATCH [ prior_seq_idx ];
+
+            /* if the current sequence address is beyond end, bail */
+            if ( entry -> state_next . seq_idx >= entry -> cell_len [ pileup_event_col_HAS_REF_OFFSET ] )
+            {
+                entry -> status = pileup_entry_status_DONE;
+                entry -> state_next . ins_cnt = next_ins_cnt;
+                return;
+            }
+
+            /* retry point for merging events */
+        merge_adjacent_indel_events:
+
+            /* adjust alignment */
+            if ( HAS_REF_OFFSET [ entry -> state_next . seq_idx ] )
+            {
+                assert ( REF_OFFSET != NULL );
+                if ( REF_OFFSET [ entry -> state_next . ref_off_idx ] < 0 )
+                {
+                    /* insertion */
+                    uint32_t i, ins_cnt = - REF_OFFSET [ entry -> state_next . ref_off_idx ];
+
+                    /* clip to SEQUENCE length */
+                    if ( ( uint32_t ) ( entry -> state_next . seq_idx + ins_cnt ) > entry -> cell_len [ pileup_event_col_HAS_REF_OFFSET ] )
+                        ins_cnt = ( int32_t ) entry -> cell_len [ pileup_event_col_HAS_REF_OFFSET ] - entry -> state_next . seq_idx;
+
+                    /* combine adjacent inserts */
+                    /*entry -> state_next . ins_cnt += ins_cnt;*/
+                    next_ins_cnt += ins_cnt;
+
+                    /* scan over insertion to adjust mismatch index */
+                    for ( i = 0; i < ins_cnt; ++ i )
+                        entry -> state_next . mismatch_idx += HAS_MISMATCH [ entry -> state_next . seq_idx + i ];
+
+                    entry -> state_next . seq_idx += ins_cnt;
+                    if ( entry -> state_next . seq_idx >= entry -> cell_len [ pileup_event_col_HAS_REF_OFFSET ] )
+                    {
+                        entry -> status = pileup_entry_status_DONE;
+                        entry -> state_next . ins_cnt = next_ins_cnt;
+                        return;
+                    }
+
+                    /* NB - there may be entries in HAS_REF_OFFSET that are set
+                       within the insertion. These are used to split the insertion
+                       for preserving boundaries indicated by Complete Genomics BAM
+                       cigar encoding. for Pileup, we treat the entire subsequence as a
+                       single insertion.
+
+                       The "true" values in HAS_REF_OFFSET within an insertion do NOT
+                       represent a corresponding entry in REF_OFFSET, so they are ignored here.
+                    */
+
+                    /* detect the case of an insertion followed by a deletion */
+                    if ( entry -> state_next . seq_idx < entry -> cell_len [ pileup_event_col_HAS_REF_OFFSET ] )
+                    {
+                        ++ entry -> state_next . ref_off_idx;
+                        goto merge_adjacent_indel_events;
+                    }
+                }
+
+                else
+                {
+                    /* deletion */
+                    entry -> state_next . del_cnt += REF_OFFSET [ entry -> state_next . ref_off_idx ];
+
+                    /* clip to PROJECTION length */
+                    if ( ( int64_t ) entry -> state_next . del_cnt > entry -> xend - ( entry -> zstart + entry -> state_next . zstart_adj ) )
+                        entry -> state_next . del_cnt = ( int32_t ) ( entry -> xend - ( entry -> zstart + entry -> state_next . zstart_adj ) );
+                }
+
+                ++ entry -> state_next . ref_off_idx;
+            }
+        }
+
+        ++ entry -> state_next . zstart_adj;
+        entry -> state_next . ins_cnt = next_ins_cnt;
+
+    }
+
+    if ( entry->status == pileup_entry_status_INITIAL )
+    {
+        entry->status = pileup_entry_status_VALID;
+        goto advance_to_the_next_position;
+    }
+}
+
+static
+void CSRA1_PileupEventEntryInit ( CSRA1_PileupEvent * self, ctx_t ctx, CSRA1_Pileup_Entry * entry )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    const bool * HAS_MISMATCH;
+
+    TRY ( HAS_MISMATCH = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_HAS_MISMATCH ) )
+    {
+        const int32_t * REF_OFFSET;
+
+        TRY ( REF_OFFSET = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_REF_OFFSET ) )
+        {
+            const bool * HAS_REF_OFFSET;
+
+            TRY ( HAS_REF_OFFSET = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_HAS_REF_OFFSET ) )
+            {
+                /* if there are no offsets, then there are no indels, which means
+                   that there are only match and mismatch events */
+                if ( entry -> cell_len [ pileup_event_col_REF_OFFSET ] == 0 )
+                    return;
+
+                /* check for left soft-clip */
+                while ( HAS_REF_OFFSET [ entry -> state_next . seq_idx ] && REF_OFFSET [ entry -> state_next . ref_off_idx ] < 0 )
+                {
+                    uint32_t i, end = entry -> state_next . seq_idx - REF_OFFSET [ entry -> state_next . ref_off_idx ++ ];
+
+                    /* safety check */
+                    if ( end > entry -> cell_len [ pileup_event_col_HAS_REF_OFFSET ] )
+                        end = entry -> cell_len [ pileup_event_col_HAS_REF_OFFSET ];
+
+                    /* skip over soft-clip */
+                    for ( i = entry -> state_next . seq_idx; i < end; ++ i )
+                        entry -> state_next . mismatch_idx += HAS_MISMATCH [ i ];
+
+                    entry -> state_next . seq_idx = end;
+                }
+
+                /* capture initial deletion - should never occur */
+                if ( HAS_REF_OFFSET [ entry -> state_next . seq_idx ] && REF_OFFSET [ entry -> state_next . ref_off_idx ] > 0 )
+                    entry -> state_next . del_cnt = REF_OFFSET [ entry -> state_next . ref_off_idx ];
+
+                /* TODO: maybe pileup_entry_status_VALID must be set here */
+
+                return;
+            }
+        }
+    }
+
+    self -> entry = NULL;
+}
+
+static
+void CSRA1_PileupEventRefreshEntry ( CSRA1_PileupEvent * self, ctx_t ctx, CSRA1_Pileup_Entry * entry )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    const bool * HAS_MISMATCH;
+    TRY ( HAS_MISMATCH = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_HAS_MISMATCH ) )
+    {
+        const int32_t * REF_OFFSET;
+        TRY ( REF_OFFSET = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_REF_OFFSET ) )
+        {
+            const bool * HAS_REF_OFFSET;
+            TRY ( HAS_REF_OFFSET = CSRA1_PileupEventGetEntry ( self, ctx, entry, pileup_event_col_HAS_REF_OFFSET ) )
+            {
+                assert ( HAS_MISMATCH != NULL );
+                assert ( HAS_REF_OFFSET != NULL );
+                assert ( REF_OFFSET != NULL );
+
+                (void)HAS_MISMATCH;
+                (void)HAS_REF_OFFSET;
+                (void)REF_OFFSET;
+            }
+        }
+    }
+}
+
+
+bool CSRA1_PileupEventIteratorNext ( CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    CSRA1_Pileup_Entry * entry;
+#if _DEBUGGING
+    CSRA1_Pileup * pileup = CSRA1_PileupEventGetPileup ( self );
+    assert ( pileup != NULL );
+#endif
+
+    /* go to next entry */
+    if ( ! self -> seen_first )
+        self -> seen_first = true;
+    else if ( self -> entry != NULL )
+        self -> entry = ( CSRA1_Pileup_Entry * ) DLNodeNext ( & self -> entry -> node );
+
+    /* detect end of pileup */
+    entry = self -> entry;
+    if ( self -> entry == NULL )
+        return false;
+
+    /* detect new entry */
+    if ( ! entry -> seen )
+    {
+        ON_FAIL ( CSRA1_PileupEventEntryInit ( self, ctx, entry ) )
+            return false;
+        entry -> seen = true;
+        assert ( self -> entry != NULL );
+    }
+    else if ( entry -> cell_data [ pileup_event_col_REF_OFFSET ] == NULL )
+    {
+        ON_FAIL ( CSRA1_PileupEventRefreshEntry ( self, ctx, entry ) )
+            return false;
+    }
+
+    /* this is an entry we've seen before */
+    CSRA1_PileupEventEntryFocus ( self, entry );
+
+    return true;
+}
+
+void CSRA1_PileupEventIteratorReset ( CSRA1_PileupEvent * self, ctx_t ctx )
+{
+    CSRA1_Pileup_Entry * entry;
+
+    CSRA1_Pileup * pileup = CSRA1_PileupEventGetPileup ( self );
+    self -> entry = ( CSRA1_Pileup_Entry * ) DLListHead ( & pileup -> align . pileup );
+    self -> seen_first = false;
+
+    for ( entry = self -> entry; entry != NULL; entry = ( CSRA1_Pileup_Entry * ) DLNodeNext ( & entry -> node ) )
+    {
+        memset ( & entry-> state_curr, 0, sizeof (entry-> state_curr) );
+        memset ( & entry-> state_next, 0, sizeof (entry-> state_next) );
+
+        /*entry -> status = pileup_entry_status_INITIAL;*/ /* TODO: remove comment */
+    }
+}
+
+void CSRA1_PileupEventInit ( ctx_t ctx, CSRA1_PileupEvent * obj, const NGS_Pileup_vt * vt,
+    const char * clsname, const char * instname, NGS_Reference * ref )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+    
+    assert ( obj != NULL );
+    
+    NGS_PileupInit ( ctx, & obj -> dad, vt, clsname, instname, ref );
+}
diff --git a/libs/ngs/CSRA1_PileupEvent.h b/libs/ngs/CSRA1_PileupEvent.h
new file mode 100644
index 0000000..d1267e6
--- /dev/null
+++ b/libs/ngs/CSRA1_PileupEvent.h
@@ -0,0 +1,50 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_csra1_pileupevent_
+#define _h_csra1_pileupevent_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct CSRA1_Pileup;
+struct NGS_PileupEvent;
+
+struct NGS_PileupEvent * CSRA1_PileupEventIteratorMake( ctx_t ctx, struct CSRA1_Pileup * pileup );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_csra1_pileupevent_ */
diff --git a/libs/ngs/CSRA1_Read.c b/libs/ngs/CSRA1_Read.c
new file mode 100644
index 0000000..4290962
--- /dev/null
+++ b/libs/ngs/CSRA1_Read.c
@@ -0,0 +1,463 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "CSRA1_Read.h"
+
+#include "NGS_String.h"
+#include "NGS_Cursor.h"
+#include "NGS_Id.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/refcount.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+
+#include <stddef.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+#ifndef min
+#   define min(a,b) ( (a) < (b) ? (a) : (b) )
+#endif
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Read
+ */
+struct CSRA1_Read
+{
+    SRA_Read dad;
+};
+
+static bool                CSRA1_FragmentIsAligned ( CSRA1_Read * self, ctx_t ctx );
+static bool                CSRA1_ReadFragIsAligned ( CSRA1_Read * self, ctx_t ctx, uint32_t frag_idx );
+
+static NGS_Read_vt CSRA1_Read_vt_inst =
+{
+    {
+        {
+            /* NGS_Refcount */
+            SRA_ReadWhack
+        },
+
+        /* NGS_Fragment */
+        SRA_FragmentGetId,
+        SRA_FragmentGetSequence,
+        SRA_FragmentGetQualities,
+        SRA_FragmentIsPaired,
+        CSRA1_FragmentIsAligned,
+        SRA_FragmentNext
+    },
+
+    /* NGS_Read */
+    SRA_ReadGetId,
+    SRA_ReadGetName,
+    SRA_ReadGetReadGroup,
+    SRA_ReadGetCategory,
+    SRA_ReadGetSequence,
+    SRA_ReadGetQualities,
+    SRA_ReadNumFragments,
+    CSRA1_ReadFragIsAligned,
+    SRA_ReadIteratorNext,
+    SRA_ReadIteratorGetCount,
+};
+
+/* Init
+ */
+static
+void CSRA1_ReadInit ( ctx_t ctx, SRA_Read * self, const char *clsname, const char *instname, const NGS_String * run_name )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    else
+    {
+        TRY ( NGS_ReadInit ( ctx, & self -> dad, & CSRA1_Read_vt_inst, clsname, instname ) )
+        {
+            TRY ( self -> run_name = NGS_StringDuplicate ( run_name, ctx ) )
+            {
+                self -> wants_full      = true;
+                self -> wants_partial   = true;
+                self -> wants_unaligned = true;
+            }
+        }
+    }
+}
+
+/* Release
+ *  release reference
+ */
+void CSRA1_ReadRelease ( const CSRA1_Read * self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        NGS_ReadRelease ( & self -> dad . dad, ctx );
+    }
+}
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadIterator
+ */
+
+static
+void CSRA1_ReadIteratorInit ( ctx_t ctx,
+                             CSRA1_Read * cself,
+                             const char *clsname,
+                             const char *instname,
+                             const NGS_String * run_name,
+                             bool wants_full,
+                             bool wants_partial,
+                             bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    if ( cself == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    else
+    {
+        SRA_Read * self = & cself -> dad;
+        TRY ( NGS_ReadIteratorInit ( ctx, & self -> dad, & CSRA1_Read_vt_inst, clsname, instname ) )
+        {
+            TRY ( self -> run_name = NGS_StringDuplicate ( run_name, ctx ) )
+            {
+                self -> wants_full      = wants_full;
+                self -> wants_partial   = wants_partial;
+                self -> wants_unaligned = wants_unaligned;
+            }
+        }
+    }
+}
+
+/* Make
+ */
+NGS_Read * CSRA1_ReadIteratorMake ( ctx_t ctx,
+                                 const NGS_Cursor * curs,
+                                 const NGS_String * run_name,
+                                 bool wants_full,
+                                 bool wants_partial,
+                                 bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    CSRA1_Read * cref;
+    SRA_Read * ref;
+
+    assert ( curs != NULL );
+
+    cref = calloc ( 1, sizeof * cref );
+    if ( cref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating CSRA1_ReadIterator on '%.*s'", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname, sizeof instname, NULL, "%.*s", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        TRY ( CSRA1_ReadIteratorInit ( ctx, cref, "CSRA1_ReadIterator", instname, run_name, wants_full, wants_partial, wants_unaligned ) )
+        {
+            ref = & cref -> dad;
+
+            ref -> curs = NGS_CursorDuplicate ( curs, ctx );
+            TRY ( NGS_CursorGetRowRange ( ref -> curs, ctx, & ref -> cur_row, & ref -> row_count ) )
+            {
+                ref -> row_max = ref -> cur_row + ref -> row_count;
+                return & ref -> dad;
+            }
+            CSRA1_ReadRelease ( cref, ctx );
+            return NULL;
+        }
+
+        free ( cref );
+    }
+
+    return NULL;
+}
+
+/* MakeRange
+ */
+NGS_Read * CSRA1_ReadIteratorMakeRange ( ctx_t ctx,
+                                      const NGS_Cursor * curs,
+                                      const NGS_String * run_name,
+                                      uint64_t first,
+                                      uint64_t count,
+                                      bool wants_full,
+                                      bool wants_partial,
+                                      bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    CSRA1_Read * cref;
+    SRA_Read * ref;
+
+    assert ( curs != NULL );
+
+    cref = calloc ( 1, sizeof * ref );
+    if ( cref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating CSRA1_ReadIterator on '%.*s'", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname, sizeof instname, NULL, "%.*s", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        TRY ( CSRA1_ReadIteratorInit ( ctx, cref, "CSRA1_ReadIterator", instname, run_name, wants_full, wants_partial, wants_unaligned ) )
+        {
+            ref = & cref -> dad;
+
+            ref -> curs = NGS_CursorDuplicate ( curs, ctx );
+            TRY ( NGS_CursorGetRowRange ( ref -> curs, ctx, & ref -> cur_row, & ref -> row_count ) )
+            {
+                ref -> row_max = min ( first + count, ref -> cur_row + ref -> row_count );
+                ref -> cur_row = first;
+                return & ref -> dad;
+            }
+            CSRA1_ReadRelease ( cref, ctx );
+            return NULL;
+        }
+
+        free ( cref );
+    }
+
+    return NULL;
+}
+
+/* MakeReadGroup
+ */
+NGS_Read * CSRA1_ReadIteratorMakeReadGroup ( ctx_t ctx,
+                                          const NGS_Cursor * curs,
+                                          const NGS_String * run_name,
+                                          const NGS_String * group_name,
+                                          uint64_t first,
+                                          uint64_t count,
+                                          bool wants_full,
+                                          bool wants_partial,
+                                          bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    TRY ( CSRA1_Read * cref = (CSRA1_Read*) CSRA1_ReadIteratorMakeRange ( ctx,
+                                                                  curs,
+                                                                  run_name,
+                                                                  first,
+                                                                  count,
+                                                                  wants_full,
+                                                                  wants_partial,
+                                                                  wants_unaligned ) )
+    {
+        SRA_Read * ref = & cref -> dad;
+        TRY ( ref -> group_name = NGS_StringDuplicate ( group_name, ctx ) )
+        {
+            return & ref -> dad;
+        }
+
+        CSRA1_ReadRelease ( cref, ctx );
+    }
+    return NULL;
+}
+
+NGS_Read * CSRA1_ReadMake ( ctx_t ctx, const NGS_Cursor * curs, int64_t readId, const struct NGS_String * run_name )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    CSRA1_Read * cref;
+    SRA_Read * ref;
+
+    assert ( curs != NULL );
+
+    cref = calloc ( 1, sizeof * cref );
+    if ( cref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating SRA_Read(%lu) on '%.*s'", readId, NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname, sizeof instname, NULL, "%.*s(%lu)", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ), readId );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        ref = & cref -> dad;
+
+        TRY ( CSRA1_ReadInit ( ctx, ref, "CSRA1_Read", instname, run_name ) )
+        {
+            uint64_t row_count = NGS_CursorGetRowCount ( curs, ctx );
+
+            /* validate the requested rowId and seek to it */
+            if ( readId <= 0 || (uint64_t)readId > row_count )
+            {
+                INTERNAL_ERROR ( xcCursorAccessFailed, "rowId ( %li ) out of range for %.*s", readId, NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+            }
+            else
+            {
+                ref -> curs = NGS_CursorDuplicate ( curs, ctx );
+                ref -> cur_row = readId;
+                TRY ( SRA_ReadIteratorInitFragment ( cref , ctx ) )
+                {
+                    ref -> row_max = readId + 1;
+                    ref -> row_count = 1;
+                    ref -> seen_first = true;
+                    return & ref -> dad;
+                }
+            }
+
+            CSRA1_ReadRelease ( cref, ctx );
+            return NULL;
+        }
+        free ( cref );
+    }
+
+    return NULL;
+}
+
+bool CSRA1_FragmentIsAligned ( CSRA1_Read * cself, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    const SRA_Read * self;
+
+    assert ( cself != NULL );
+
+    self = & cself -> dad;
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Read accessed before a call to nextRead()" );
+        return false;
+    }
+
+    if ( self -> cur_row >= self -> row_max )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return false;
+    }
+
+    if ( ! self -> seen_first_frag )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Fragment accessed before a call to nextFragment()" );
+        return false;
+    }
+
+    if ( self -> frag_idx >= self -> frag_max )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more fragments available" );
+        return false;
+    }
+
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        ON_FAIL ( NGS_CursorCellDataDirect ( self -> curs, ctx, self -> cur_row, seq_PRIMARY_ALIGNMENT_ID, & elem_bits, & base, & boff, & row_len ) )
+        {
+            CLEAR();
+            return false;
+        }
+
+        {
+            const int64_t * orig = base;
+            assert(elem_bits == 64);
+            assert(boff == 0);
+
+            return orig[self -> frag_idx] != 0;
+        }
+    }
+
+}
+
+bool CSRA1_ReadFragIsAligned ( CSRA1_Read * cself, ctx_t ctx, uint32_t frag_idx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    const SRA_Read * self;
+
+    assert ( cself != NULL );
+
+    self = & cself -> dad;
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Read accessed before a call to nextRead()" );
+        return false;
+    }
+
+    if ( self -> cur_row >= self -> row_max )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return false;
+    }
+
+    if ( frag_idx >= self -> bio_frags )
+    {
+        USER_ERROR ( xcIntegerOutOfBounds, "bad fragment index" );
+        return false;
+    }
+
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        TRY ( NGS_CursorCellDataDirect ( self -> curs, ctx, self -> cur_row, seq_PRIMARY_ALIGNMENT_ID, & elem_bits, & base, & boff, & row_len ) )
+        {
+            uint32_t idx, bidx;
+            const int64_t * orig = base;
+            assert ( base != NULL );
+            assert ( elem_bits == 64 );
+            assert ( boff == 0 );
+            assert ( row_len == self -> frag_max );
+
+            /* technically, we do not expect technical reads (fragments) within CSRA1,
+               but it is correct to check for this possibility
+               same applies to 0-length biological fragments (VDB-3132)
+            */
+            if ( self -> bio_frags == self -> frag_max )
+                return orig [ frag_idx ] != 0;
+
+            for ( idx = bidx = 0; idx < row_len; ++ idx )
+            {
+                if ( ( self -> READ_TYPE [ idx ] & READ_TYPE_BIOLOGICAL ) != 0 && self -> READ_LEN [ idx ] != 0 )
+                {
+                    if ( bidx == frag_idx )
+                        return orig [ idx ] != 0;
+
+                    ++ bidx;
+                }
+            }
+        }
+    }
+
+    CLEAR();
+    return false;
+}
diff --git a/libs/ngs/CSRA1_Read.h b/libs/ngs/CSRA1_Read.h
new file mode 100644
index 0000000..cc90a69
--- /dev/null
+++ b/libs/ngs/CSRA1_Read.h
@@ -0,0 +1,96 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_csra1_read_
+#define _h_csra1_read_
+
+typedef struct CSRA1_Read CSRA1_Read;
+
+#ifndef NGS_READ
+#define NGS_READ CSRA1_Read
+#endif
+
+#ifndef _h_sra_read_
+#include "SRA_Read.h"
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Read
+ */
+
+/* Make
+ * a single read
+ */
+struct NGS_Read * CSRA1_ReadMake ( ctx_t ctx, const struct NGS_Cursor * curs, int64_t readId, const struct NGS_String * spec );
+
+/* IteratorMake
+ */
+struct NGS_Read * CSRA1_ReadIteratorMake ( ctx_t ctx, 
+                                               const struct NGS_Cursor * curs, 
+                                               const struct NGS_String * run_name, 
+                                               bool wants_full, 
+                                               bool wants_partial, 
+                                               bool wants_unaligned );
+
+/* IteratorMakeRange
+ * all reads in the specified range of rowIds
+ */
+struct NGS_Read * CSRA1_ReadIteratorMakeRange ( ctx_t ctx, 
+                                              const struct NGS_Cursor * curs, 
+                                              const struct NGS_String * run_name, 
+                                              uint64_t first, 
+                                              uint64_t count, 
+                                              bool wants_full, 
+                                              bool wants_partial, 
+                                              bool wants_unaligned );
+
+/* IteratorMakeReadGroup
+ * within the specified range of rowIds, will only return reads belonging to the specified read group (groupName)
+ */
+struct NGS_Read * CSRA1_ReadIteratorMakeReadGroup ( ctx_t ctx, 
+                                                  const struct NGS_Cursor * curs, 
+                                                  const struct NGS_String * run_name, 
+                                                  const struct NGS_String * group_name, 
+                                                  uint64_t first, 
+                                                  uint64_t count, 
+                                                  bool wants_full, 
+                                                  bool wants_partial, 
+                                                  bool wants_unaligned );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_csra1_read_ */
diff --git a/libs/ngs/CSRA1_ReadCollection.c b/libs/ngs/CSRA1_ReadCollection.c
new file mode 100644
index 0000000..a497fe1
--- /dev/null
+++ b/libs/ngs/CSRA1_ReadCollection.c
@@ -0,0 +1,753 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+typedef struct CSRA1_ReadCollection CSRA1_ReadCollection;
+#define NGS_READCOLLECTION CSRA1_ReadCollection
+
+#include "NGS_ReadCollection.h"
+
+#include "CSRA1_ReadCollection.h"
+
+#include "NGS_Reference.h"
+#include "NGS_Alignment.h"
+#include "NGS_Read.h"
+#include "NGS_FragmentBlobIterator.h"
+
+#include "NGS_Cursor.h"
+#include "NGS_String.h"
+#include "NGS_Id.h"
+
+#include "CSRA1_Read.h"
+#include "SRA_Read.h"
+#include "SRA_ReadGroup.h"
+#include "SRA_ReadGroupInfo.h"
+#include "SRA_Statistics.h"
+
+#include "CSRA1_Alignment.h"
+#include "CSRA1_Reference.h"
+
+#include <klib/rc.h>
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <kdb/meta.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+
+#include <strtol.h> /* for strtoi64 */
+
+#include <stddef.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+
+/*--------------------------------------------------------------------------
+ * CSRA1_ReadCollection
+ */
+
+struct CSRA1_ReadCollection
+{
+    NGS_ReadCollection dad;
+    const NGS_String * run_name;
+
+    const VDatabase * db;
+
+    /* shared cursors (reused for all non-iterating objects) */
+    const NGS_Cursor* reference_curs;
+    const NGS_Cursor* sequence_curs;
+    const NGS_Cursor* primary_al_curs;
+    const NGS_Cursor* secondary_al_curs;
+    bool has_secondary;
+
+    uint64_t primaryId_count;
+
+    const struct SRA_ReadGroupInfo* group_info;
+};
+
+/* REFCOUNT */
+
+struct CSRA1_ReadCollection * CSRA1_ReadCollectionDuplicate ( struct CSRA1_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    assert ( self != NULL );
+    return NGS_RefcountDuplicate ( & self -> dad . dad, ctx );
+}
+
+void CSRA1_ReadCollectionRelease ( struct CSRA1_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    assert ( self != NULL );
+    NGS_RefcountRelease( & self -> dad . dad, ctx );
+}
+
+struct NGS_ReadCollection * CSRA1_ReadCollectionToNGS_ReadCollection ( struct CSRA1_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    assert ( self != NULL );
+    return & self -> dad;
+}
+
+static
+void CSRA1_ReadCollectionWhack ( CSRA1_ReadCollection * self, ctx_t ctx )
+{
+    NGS_CursorRelease ( self -> secondary_al_curs, ctx );
+    NGS_CursorRelease ( self -> primary_al_curs, ctx );
+    NGS_CursorRelease ( self -> sequence_curs, ctx );
+    NGS_CursorRelease ( self -> reference_curs, ctx );
+    SRA_ReadGroupInfoRelease ( self -> group_info, ctx );
+    NGS_StringRelease ( self -> run_name, ctx );
+    VDatabaseRelease ( self -> db );
+}
+
+static const char * reference_col_specs [] =
+{
+    "(bool)CIRCULAR",
+    "(utf8)NAME",
+    "(ascii)SEQ_ID",
+    "(INSDC:coord:len)SEQ_LEN",
+    "(INSDC:coord:one)SEQ_START",
+    "(U32)MAX_SEQ_LEN",
+    "(ascii)READ",
+    "(I64)PRIMARY_ALIGNMENT_IDS",
+    "(I64)SECONDARY_ALIGNMENT_IDS",
+    "(INSDC:coord:len)OVERLAP_REF_LEN",
+    "(INSDC:coord:zero)OVERLAP_REF_POS"
+};
+
+const NGS_Cursor* CSRA1_ReadCollectionMakeAlignmentCursor ( CSRA1_ReadCollection * self,
+                                                            ctx_t ctx,
+                                                            bool primary,
+                                                            bool exclusive )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    assert ( self );
+
+    if ( exclusive )
+    {   /* detach and return cached cursor if its refcount == 1 */
+        if ( primary )
+        {
+            NGS_Refcount * refc = ( NGS_Refcount * ) ( self -> primary_al_curs ) ;
+            if ( self -> primary_al_curs && atomic32_read ( & refc -> refcount ) == 1 )
+            {
+                const NGS_Cursor* ret = self -> primary_al_curs;
+                self -> primary_al_curs = NULL;
+                return ret;
+            }
+        }
+        else
+        {
+            NGS_Refcount * refc = ( NGS_Refcount * ) ( self -> secondary_al_curs ) ;
+            if ( self -> secondary_al_curs && atomic32_read ( & refc -> refcount ) == 1 )
+            {
+                const NGS_Cursor* ret = self -> secondary_al_curs;
+                self -> secondary_al_curs = NULL;
+                return ret;
+            }
+        }
+        return CSRA1_AlignmentMakeDb ( ctx, self -> db, self -> run_name, primary ? "PRIMARY_ALIGNMENT" : "SECONDARY_ALIGNMENT" );
+    }
+    if ( primary )
+    {
+        if ( self -> primary_al_curs == NULL )
+        {
+            self -> primary_al_curs = CSRA1_AlignmentMakeDb ( ctx, self -> db, self -> run_name, "PRIMARY_ALIGNMENT" );
+        }
+        return NGS_CursorDuplicate ( self -> primary_al_curs, ctx );
+    }
+    else if ( self -> has_secondary )
+    {
+        if ( self -> secondary_al_curs == NULL )
+        {
+            self -> secondary_al_curs = CSRA1_AlignmentMakeDb ( ctx, self->db, self->run_name, "SECONDARY_ALIGNMENT" );
+        }
+        return NGS_CursorDuplicate ( self -> secondary_al_curs, ctx );
+    }
+    else
+    {
+        INTERNAL_ERROR ( xcCursorAccessFailed, "Secondary alignments table is missing");
+        return NULL;
+    }
+}
+
+/* READCOLLECTION */
+
+static
+NGS_String * CSRA1_ReadCollectionGetName ( CSRA1_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    return NGS_StringDuplicate ( self -> run_name, ctx );
+}
+
+static
+const struct SRA_ReadGroupInfo* GetGroupInfo ( CSRA1_ReadCollection * self, ctx_t ctx )
+{
+    if ( self -> group_info == NULL )
+    {
+        const VTable * table;
+        rc_t rc = VDatabaseOpenTableRead ( self -> db, & table, "SEQUENCE" );
+        if ( rc != 0 )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "VDatabaseOpenTableRead(SEQUENCE) rc = %R", rc );
+        }
+        ON_FAIL ( self -> group_info = SRA_ReadGroupInfoMake ( ctx, table ) )
+        {
+            VTableRelease ( table );
+            return NULL;
+        }
+        VTableRelease ( table );
+    }
+    return self -> group_info;
+}
+
+static
+NGS_ReadGroup * CSRA1_ReadCollectionGetReadGroups ( CSRA1_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    TRY ( const NGS_Cursor * curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+    {
+        TRY ( GetGroupInfo ( self, ctx ) )
+        {
+            NGS_ReadGroup * ret = SRA_ReadGroupIteratorMake ( ctx, curs, self -> group_info, self -> run_name );
+            NGS_CursorRelease ( curs, ctx );
+            return ret;
+        }
+    }
+    return NULL;
+
+}
+
+static
+bool CSRA1_ReadCollectionHasReadGroup ( CSRA1_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    bool ret = false;
+
+    if ( self -> sequence_curs == NULL )
+    {
+        self -> sequence_curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS );
+    }
+
+    TRY ( GetGroupInfo ( self, ctx ) )
+    {
+        TRY ( SRA_ReadGroupInfoFind ( self -> group_info, ctx, spec, string_size ( spec ) ) )
+        {
+            ret = true;
+        }
+        CATCH_ALL()
+        {
+            CLEAR();
+        }
+
+    }
+
+    return ret;
+}
+
+static
+NGS_ReadGroup * CSRA1_ReadCollectionGetReadGroup ( CSRA1_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    if ( self -> sequence_curs == NULL )
+    {
+        self -> sequence_curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS );
+    }
+
+    TRY ( GetGroupInfo ( self, ctx ) )
+    {
+        NGS_ReadGroup * ret = SRA_ReadGroupMake ( ctx, self -> sequence_curs, self -> group_info, self -> run_name, spec, string_size( spec ));
+        return ret;
+    }
+
+    return NULL;
+}
+
+static
+NGS_Reference * CSRA1_ReadCollectionGetReferences ( CSRA1_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+
+    /* Iterators have their own cursors */
+    TRY ( const NGS_Cursor* curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "REFERENCE", reference_col_specs, reference_NUM_COLS ) )
+    {
+        NGS_Reference * ret = CSRA1_ReferenceIteratorMake ( ctx, & self -> dad, self -> db, curs, self -> primaryId_count );
+        NGS_CursorRelease ( curs, ctx );
+        return ret;
+    }
+
+    return NULL;
+}
+
+static
+NGS_Reference * CSRA1_ReadCollectionGetReference ( CSRA1_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+
+    const NGS_Cursor * curs;
+    NGS_Reference * ret;
+#if 0
+    if ( self -> reference_curs == NULL )
+    {
+#endif
+        ON_FAIL ( curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "REFERENCE", reference_col_specs, reference_NUM_COLS ) )
+            return NULL;
+#if 0
+        self -> reference_curs = curs;
+    }
+#endif
+
+    ret = CSRA1_ReferenceMake ( ctx, & self -> dad, self -> db, curs, spec, self -> primaryId_count );
+#if ! 0
+    // release cursor if we generate new cursor for the reference each time
+    NGS_CursorRelease ( curs, ctx );
+#endif
+
+    return ret;
+}
+
+static
+bool CSRA1_ReadCollectionHasReference ( CSRA1_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+
+    const NGS_Cursor * curs;
+    bool ret = false;
+
+    ON_FAIL ( curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "REFERENCE", reference_col_specs, reference_NUM_COLS ) )
+        return false;
+
+    ret = CSRA1_ReferenceFind ( curs, ctx, spec, NULL, NULL );
+
+    NGS_CursorRelease ( curs, ctx );
+    CLEAR ();
+
+    return ret;
+}
+
+static
+NGS_Alignment * CSRA1_ReadCollectionGetAlignments ( CSRA1_ReadCollection * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+
+    return CSRA1_AlignmentIteratorMake ( ctx, self, wants_primary, wants_secondary, self -> run_name, self -> primaryId_count );
+}
+
+static
+NGS_Alignment * CSRA1_ReadCollectionGetAlignment ( CSRA1_ReadCollection * self, ctx_t ctx, const char * alignmentIdStr )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+
+    TRY ( struct NGS_Id id = NGS_IdParse ( alignmentIdStr, string_size ( alignmentIdStr ), ctx ) )
+    {
+        if ( string_cmp ( NGS_StringData ( self -> run_name, ctx ),
+            NGS_StringSize ( self -> run_name, ctx ),
+            id . run . addr,
+            id . run . size,
+            id . run . len ) != 0 )
+        {
+            INTERNAL_ERROR ( xcArcIncorrect,
+                " expected '%.*s', actual '%.*s'",
+                NGS_StringSize ( self -> run_name, ctx ),
+                NGS_StringData ( self -> run_name, ctx ),
+                id . run . size,
+                id . run . addr );
+        }
+        else if ( id . object == NGSObject_PrimaryAlignment )
+        {
+            return CSRA1_AlignmentMake ( ctx, self, id . rowId, NGS_StringData( self -> run_name, ctx ), NGS_StringSize( self->run_name, ctx ), true, 0 );
+        }
+        else if ( id . object == NGSObject_SecondaryAlignment )
+        {
+            return CSRA1_AlignmentMake ( ctx, self, id . rowId, NGS_StringData( self -> run_name, ctx ), NGS_StringSize( self -> run_name, ctx ), false, self -> primaryId_count );
+        }
+        else
+        {
+            INTERNAL_ERROR ( xcTypeIncorrect,
+                " expected alignment (%i or %i), actual %i",
+                NGSObject_PrimaryAlignment,
+                NGSObject_SecondaryAlignment,
+                id . object );
+        }
+    }
+    return NULL;
+}
+
+static
+uint64_t CSRA1_ReadCollectionGetAlignmentCount ( CSRA1_ReadCollection * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+    uint64_t ret = 0;
+    if ( wants_primary )
+    {
+        ret += ( self -> primaryId_count );
+    }
+    if ( wants_secondary && self -> has_secondary )
+    {
+        if ( self -> secondary_al_curs == NULL )
+        {
+            ON_FAIL ( self -> secondary_al_curs = CSRA1_AlignmentMakeDb ( ctx,
+                                                                     self -> db,
+                                                                     self -> run_name,
+                                                                     "SECONDARY_ALIGNMENT" ) )
+                return 0;
+        }
+        ret += NGS_CursorGetRowCount ( self -> secondary_al_curs, ctx );
+    }
+    return ret;
+}
+
+static
+NGS_Alignment * CSRA1_ReadCollectionGetAlignmentRange ( CSRA1_ReadCollection * self,
+                                                        ctx_t ctx,
+                                                        uint64_t first,
+                                                        uint64_t count,
+                                                        bool wants_primary,
+                                                        bool wants_secondary )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+
+    return CSRA1_AlignmentRangeMake ( ctx, self, wants_primary, wants_secondary, self -> run_name, self -> primaryId_count, first, count );
+}
+
+struct NGS_Read * CSRA1_ReadCollectionGetReads ( CSRA1_ReadCollection * self, ctx_t ctx,
+    bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    TRY ( const NGS_Cursor * curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+    {
+        TRY ( NGS_Read * ref = CSRA1_ReadIteratorMake ( ctx, curs, self -> run_name, wants_full, wants_partial, wants_unaligned ) )
+        {
+            NGS_CursorRelease ( curs, ctx );
+            return ref;
+        }
+
+        NGS_CursorRelease ( curs, ctx );
+    }
+
+    return NULL;
+}
+
+struct NGS_Read * CSRA1_ReadCollectionGetRead ( CSRA1_ReadCollection * self, ctx_t ctx, const char * readIdStr )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    TRY ( struct NGS_Id id = NGS_IdParse ( readIdStr, string_size ( readIdStr ), ctx ) )
+    {
+        if ( string_cmp ( NGS_StringData ( self -> run_name, ctx ),
+            NGS_StringSize ( self -> run_name, ctx ),
+            id . run . addr,
+            id . run . size,
+            id . run . len ) != 0 )
+        {
+            INTERNAL_ERROR ( xcArcIncorrect,
+                " expected '%.*s', actual '%.*s'",
+                NGS_StringSize ( self -> run_name, ctx ),
+                NGS_StringData ( self -> run_name, ctx ),
+                id . run . size,
+                id . run . addr );
+        }
+        else
+        {
+            /* individual reads share one iterator attached to ReadCollection */
+            if ( self -> sequence_curs == NULL )
+            {
+                ON_FAIL ( self -> sequence_curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+                    return NULL;
+            }
+            return CSRA1_ReadMake ( ctx, self -> sequence_curs, id . rowId, self -> run_name );
+        }
+    }
+    return NULL;
+}
+
+static
+uint64_t CSRA1_ReadCollectionGetReadCount ( CSRA1_ReadCollection * self, ctx_t ctx,
+    bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+
+    if ( self -> sequence_curs == NULL )
+    {
+        ON_FAIL ( self -> sequence_curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+        {
+            return 0;
+        }
+    }
+
+    if ( wants_full && wants_partial && wants_unaligned )
+        return NGS_CursorGetRowCount ( self -> sequence_curs, ctx );
+
+    { /* scan the SEQUENCE table */
+        int64_t first;
+        uint64_t count;
+        TRY ( NGS_CursorGetRowRange ( self -> sequence_curs, ctx, & first, & count ) )
+        {
+            uint64_t ret = 0;
+            uint64_t count_full = 0;
+            uint64_t count_partial = 0;
+            uint64_t count_unaligned = 0;
+            uint64_t i;
+            for ( i = 0; i < count; ++i )
+            {
+                const void * base;
+                uint32_t elem_bits, boff, row_len;
+                ON_FAIL ( NGS_CursorCellDataDirect ( self -> sequence_curs, ctx, first + i, seq_PRIMARY_ALIGNMENT_ID, & elem_bits, & base, & boff, & row_len ) )
+                {   /* count as unaligned, to mirror the behavior of SRA_ReadGetCategory() (see SRA_Read.c) */
+                    CLEAR();
+                    ++ count_unaligned;
+                }
+                else
+                {
+                    uint32_t j;
+                    bool seen_aligned = false;
+                    bool seen_unaligned = false;
+                    const int64_t * orig = base;
+                    assert(elem_bits == 64);
+                    for ( j = 0; j < row_len; ++ j )
+                    {
+                        if (orig[j] == 0)
+                            seen_unaligned = true;
+                        else
+                            seen_aligned = true;
+                    }
+                    if ( seen_aligned )
+                    {
+                        if ( seen_unaligned )
+                            ++ count_partial;
+                        else
+                            ++ count_full;
+                    }
+                    else
+                        ++ count_unaligned;
+                }
+            }
+            if ( wants_full )
+                ret += count_full;
+            if ( wants_partial )
+                ret += count_partial;
+            if ( wants_unaligned )
+                ret += count_unaligned;
+            return ret;
+        }
+    }
+
+    return 0;
+}
+
+struct NGS_Read * CSRA1_ReadCollectionGetReadRange ( CSRA1_ReadCollection * self,
+                                                     ctx_t ctx,
+                                                     uint64_t first,
+                                                     uint64_t count,
+                                                     bool wants_full,
+                                                     bool wants_partial,
+                                                     bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    TRY ( const NGS_Cursor* curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+    {
+        NGS_Read * ret = CSRA1_ReadIteratorMakeRange ( ctx, curs, self -> run_name, first, count, wants_full, wants_partial, wants_unaligned );
+        NGS_CursorRelease ( curs, ctx );
+        return ret;
+    }
+    return NULL;
+}
+
+static void LoadTableStats ( CSRA1_ReadCollection * self, ctx_t ctx, const char* table_name, NGS_Statistics * stats )
+{
+    const VTable * table;
+    rc_t rc = VDatabaseOpenTableRead ( self -> db, & table, table_name );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "VDatabaseOpenTableRead(%s) rc = %R", table_name, rc );
+    }
+    else
+    {
+        SRA_StatisticsLoadTableStats ( stats, ctx, table, table_name );
+        VTableRelease ( table );
+    }
+}
+
+static struct NGS_Statistics* CSRA1_ReadCollectionGetStatistics ( CSRA1_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    TRY ( NGS_Statistics * ret = SRA_StatisticsMake ( ctx ) )
+    {
+        TRY ( LoadTableStats ( self, ctx, "SEQUENCE", ret ) )
+        {
+            TRY ( LoadTableStats ( self, ctx, "REFERENCE", ret ) )
+            {
+                TRY ( LoadTableStats ( self, ctx, "PRIMARY_ALIGNMENT", ret ) )
+                {
+                    /* SECONDARY_ALIGNMENT may be missing */
+                    ON_FAIL ( LoadTableStats ( self, ctx, "SECONDARY_ALIGNMENT", ret ) ) CLEAR ();
+                    return ret;
+                }
+            }
+        }
+        NGS_StatisticsRelease ( ret, ctx );
+    }
+
+    return NULL;
+}
+
+static struct NGS_FragmentBlobIterator* CSRA1_ReadCollectionGetFragmentBlobs ( CSRA1_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    const VTable * table;
+    rc_t rc = VDatabaseOpenTableRead ( self -> db, & table, "SEQUENCE" );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "VDatabaseOpenTableRead(SEQUENCE) rc = %R", rc );
+    }
+    else
+    {
+        TRY ( NGS_FragmentBlobIterator* ret = NGS_FragmentBlobIteratorMake ( ctx, self -> run_name, table ) )
+        {
+            VTableRelease ( table );
+            return ret;
+        }
+        VTableRelease ( table );
+    }
+
+    return NULL;
+}
+
+
+static NGS_ReadCollection_vt CSRA1_ReadCollection_vt =
+{
+    /* NGS_Refcount */
+    { CSRA1_ReadCollectionWhack },
+
+    /* NGS_ReadCollection */
+    CSRA1_ReadCollectionGetName,
+    CSRA1_ReadCollectionGetReadGroups,
+    CSRA1_ReadCollectionHasReadGroup,
+    CSRA1_ReadCollectionGetReadGroup,
+    CSRA1_ReadCollectionGetReferences,
+    CSRA1_ReadCollectionHasReference,
+    CSRA1_ReadCollectionGetReference,
+    CSRA1_ReadCollectionGetAlignments,
+    CSRA1_ReadCollectionGetAlignment,
+    CSRA1_ReadCollectionGetAlignmentCount,
+    CSRA1_ReadCollectionGetAlignmentRange,
+    CSRA1_ReadCollectionGetReads,
+    CSRA1_ReadCollectionGetRead,
+    CSRA1_ReadCollectionGetReadCount,
+    CSRA1_ReadCollectionGetReadRange,
+    CSRA1_ReadCollectionGetStatistics,
+    CSRA1_ReadCollectionGetFragmentBlobs
+};
+
+NGS_ReadCollection * NGS_ReadCollectionMakeCSRA ( ctx_t ctx, const VDatabase *db, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcConstructing );
+
+    size_t spec_size;
+    CSRA1_ReadCollection * ref;
+
+    assert ( db != NULL );
+
+    assert ( spec != NULL );
+    spec_size = string_size ( spec );
+    assert ( spec_size != 0 );
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating CSRA1_ReadCollection ( '%s' )", spec );
+    else
+    {
+        TRY ( NGS_ReadCollectionInit ( ctx, & ref -> dad, & CSRA1_ReadCollection_vt, "CSRA1_ReadCollection", spec ) )
+        {
+            const char * name, * dot, * end;
+
+            ref -> db = db;
+
+            end = & spec [ spec_size ];
+
+            /* TBD - this is a hack */
+            name = string_rchr ( spec, spec_size, '/' );
+            if ( name ++ == NULL )
+                name = spec;
+
+            dot = string_rchr ( name, end - name, '.' );
+            if ( dot != NULL )
+            {
+                if ( strcase_cmp ( dot, end - dot, ".ncbi_enc", sizeof ".ncbi_enc" - 1, -1 ) == 0 )
+                {
+                    end = dot;
+                    dot = string_rchr ( name, end - name, '.' );
+                }
+                if ( dot != NULL && strcase_cmp ( dot, end - dot, ".sra", sizeof ".sra" - 1, -1 ) == 0 )
+                    end = dot;
+            }
+
+            /* initialize "run_name" */
+            TRY ( ref -> run_name = NGS_StringMakeCopy ( ctx, name, end - name ) )
+            {
+                TRY ( ref -> primary_al_curs = CSRA1_AlignmentMakeDb ( ctx, ref -> db, ref -> run_name, "PRIMARY_ALIGNMENT" ) )
+                {
+                    TRY ( ref -> primaryId_count = NGS_CursorGetRowCount ( ref -> primary_al_curs, ctx ) )
+                    {
+                        /* check for existence of SECONDARY_ALIGNMENT table */
+                        const VTable * table;
+                        if ( VDatabaseOpenTableRead ( db, & table, "SECONDARY_ALIGNMENT" ) == 0 )
+                        {
+                            ref -> has_secondary = true;
+                            VTableRelease ( table );
+                        }
+
+                        return & ref -> dad;
+                    }
+                }
+            }
+
+            CSRA1_ReadCollectionWhack ( ref, ctx );
+            return NULL;
+        }
+
+        free ( ref );
+    }
+
+    VDatabaseRelease ( db );
+
+    return NULL;
+}
diff --git a/libs/ngs/CSRA1_ReadCollection.h b/libs/ngs/CSRA1_ReadCollection.h
new file mode 100644
index 0000000..2fa6baa
--- /dev/null
+++ b/libs/ngs/CSRA1_ReadCollection.h
@@ -0,0 +1,58 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_csra1_readcollection_
+#define _h_csra1_readcollection_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_Cursor;
+struct CSRA1_ReadCollection;
+
+struct CSRA1_ReadCollection * CSRA1_ReadCollectionDuplicate ( struct CSRA1_ReadCollection * self, ctx_t ctx );
+void CSRA1_ReadCollectionRelease ( struct CSRA1_ReadCollection * self, ctx_t ctx );
+struct NGS_ReadCollection * CSRA1_ReadCollectionToNGS_ReadCollection ( struct CSRA1_ReadCollection * self, ctx_t ctx );
+
+const struct NGS_Cursor* CSRA1_ReadCollectionMakeAlignmentCursor ( struct CSRA1_ReadCollection * self, 
+                                                                   ctx_t ctx, 
+                                                                   bool primary, 
+                                                                   bool exclusive );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_csra1_readcollection_ */
diff --git a/libs/ngs/CSRA1_Reference.c b/libs/ngs/CSRA1_Reference.c
new file mode 100644
index 0000000..9442e6e
--- /dev/null
+++ b/libs/ngs/CSRA1_Reference.c
@@ -0,0 +1,1102 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "CSRA1_Reference.h"
+
+typedef struct CSRA1_Reference CSRA1_Reference;
+#define NGS_REFERENCE CSRA1_Reference
+#include "NGS_Reference.h"
+
+#include "NGS_ReadCollection.h"
+#include "NGS_Alignment.h"
+
+#include "NGS_String.h"
+#include "NGS_Cursor.h"
+
+#include "SRA_Statistics.h"
+
+#include "CSRA1_ReferenceWindow.h"
+#include "CSRA1_Pileup.h"
+
+#include "VByteBlob.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/refcount.h>
+
+#include <vdb/table.h>
+#include <vdb/database.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <vdb/blob.h>
+#include "../vdb/blob-priv.h"
+
+#include <stddef.h>
+#include <assert.h>
+
+#include <strtol.h>
+#include <string.h>
+
+#include <sysalloc.h>
+
+/*--------------------------------------------------------------------------
+ * CSRA1_Reference
+ */
+static void                     CSRA1_ReferenceWhack ( CSRA1_Reference * self, ctx_t ctx );
+static NGS_String *             CSRA1_ReferenceGetCommonName ( CSRA1_Reference * self, ctx_t ctx );
+static NGS_String *             CSRA1_ReferenceGetCanonicalName ( CSRA1_Reference * self, ctx_t ctx );
+static bool                     CSRA1_ReferenceGetIsCircular ( const CSRA1_Reference * self, ctx_t ctx );
+static uint64_t                 CSRA1_ReferenceGetLength ( CSRA1_Reference * self, ctx_t ctx );
+static struct NGS_String *      CSRA1_ReferenceGetBases ( CSRA1_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size );
+static struct NGS_String *      CSRA1_ReferenceGetChunk ( CSRA1_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size );
+static struct NGS_Alignment*    CSRA1_ReferenceGetAlignment ( CSRA1_Reference * self, ctx_t ctx, const char * alignmentId );
+static struct NGS_Alignment*    CSRA1_ReferenceGetAlignments ( CSRA1_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+static uint64_t                 CSRA1_ReferenceGetAlignmentCount ( const CSRA1_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary );
+static struct NGS_Alignment*    CSRA1_ReferenceGetAlignmentSlice ( CSRA1_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size,
+    bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+static struct NGS_Pileup*       CSRA1_ReferenceGetPileups ( CSRA1_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+static struct NGS_Pileup*       CSRA1_ReferenceGetPileupSlice ( CSRA1_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size, bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+struct NGS_Statistics*          CSRA1_ReferenceGetStatistics ( const CSRA1_Reference * self, ctx_t ctx );
+static bool                     CSRA1_ReferenceIteratorNext ( CSRA1_Reference * self, ctx_t ctx );
+
+static NGS_Reference_vt CSRA1_Reference_vt_inst =
+{
+    /* NGS_Refcount */
+    { CSRA1_ReferenceWhack },
+
+    /* NGS_Reference */
+    CSRA1_ReferenceGetCommonName,
+    CSRA1_ReferenceGetCanonicalName,
+    CSRA1_ReferenceGetIsCircular,
+    CSRA1_ReferenceGetLength,
+    CSRA1_ReferenceGetBases,
+    CSRA1_ReferenceGetChunk,
+    CSRA1_ReferenceGetAlignment,
+    CSRA1_ReferenceGetAlignments,
+    CSRA1_ReferenceGetAlignmentCount,
+    CSRA1_ReferenceGetAlignmentSlice,
+    CSRA1_ReferenceGetPileups,
+    CSRA1_ReferenceGetPileupSlice,
+    CSRA1_ReferenceGetStatistics,
+
+    /* NGS_ReferenceIterator */
+    CSRA1_ReferenceIteratorNext,
+};
+
+struct CSRA1_Reference
+{
+    NGS_Reference dad;
+
+    uint32_t chunk_size;
+
+    int64_t first_row;
+    int64_t last_row;  /* inclusive */
+    const struct VDatabase * db; /* pointer to the opened db, cannot be NULL */
+    const struct NGS_Cursor * curs; /* can be NULL if created for an empty iterator */
+    uint64_t align_id_offset;
+    uint64_t cur_length; /* size of current reference in bases (0 = not yet counted) */
+
+    int64_t iteration_row_last; /* 0 = not iterating */
+
+    bool seen_first;
+};
+
+int64_t CSRA1_Reference_GetFirstRowId ( const struct NGS_Reference * self, ctx_t ctx )
+{
+    assert ( ( void * ) self -> dad . vt == ( void * ) & CSRA1_Reference_vt_inst );
+    return ( ( CSRA1_Reference const * ) self ) -> first_row;
+}
+
+int64_t CSRA1_Reference_GetLastRowId ( const struct NGS_Reference * self, ctx_t ctx )
+{
+    assert ( ( void * ) self -> dad . vt == ( void * ) & CSRA1_Reference_vt_inst );
+    return ( ( CSRA1_Reference const * ) self ) -> last_row;
+}
+
+/* Init
+ */
+static
+void CSRA1_ReferenceInit ( ctx_t ctx,
+                           CSRA1_Reference * ref,
+                           NGS_ReadCollection * coll,
+                           const char *clsname,
+                           const char *instname,
+                           uint64_t align_id_offset )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    if ( ref == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    else
+    {
+        TRY ( NGS_ReferenceInit ( ctx, & ref -> dad, & CSRA1_Reference_vt_inst, clsname, instname, coll ) )
+        {
+            ref -> align_id_offset = align_id_offset;
+        }
+    }
+}
+
+/* Whack
+ */
+static
+void CSRA1_ReferenceWhack ( CSRA1_Reference * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcDestroying );
+
+    NGS_CursorRelease ( self -> curs, ctx );
+
+    VDatabaseRelease ( self -> db );
+    self -> db = NULL;
+
+    NGS_ReferenceWhack ( & self -> dad, ctx );
+}
+
+NGS_String * CSRA1_ReferenceGetCommonName ( CSRA1_Reference * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self != NULL );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Reference accessed before a call to ReferenceIteratorNext()" );
+        return NULL;
+    }
+
+    return NGS_CursorGetString ( self -> curs, ctx, self -> first_row, reference_NAME );
+}
+
+NGS_String * CSRA1_ReferenceGetCanonicalName ( CSRA1_Reference * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self != NULL );
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Reference accessed before a call to ReferenceIteratorNext()" );
+        return NULL;
+    }
+
+    return NGS_CursorGetString ( self -> curs, ctx, self -> first_row, reference_SEQ_ID);
+}
+
+bool CSRA1_ReferenceGetIsCircular ( const CSRA1_Reference * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return false;
+    }
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Reference accessed before a call to ReferenceIteratorNext()" );
+        return false;
+    }
+
+    /* if current row is valid, read data */
+    if ( self -> first_row <= self -> last_row )
+    {
+        return NGS_CursorGetBool ( self -> curs, ctx, self -> first_row, reference_CIRCULAR );
+    }
+
+    return false;
+}
+
+static
+uint64_t CountRows ( NGS_Cursor const * curs, ctx_t ctx, uint32_t colIdx, const void* value, uint32_t value_size, int64_t firstRow, uint64_t end_row)
+{   /* count consecutive rows having the same value in column # colIdx as in firstRow, starting from and including firstRow */
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    const void* last_value = value;
+    uint64_t cur_row = (uint64_t)firstRow + 1;
+    while (cur_row < end_row)
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        ON_FAIL ( NGS_CursorCellDataDirect ( curs, ctx, cur_row, colIdx, & elem_bits, & base, & boff, & row_len ) )
+            return 0;
+
+        if (base != last_value)
+        {
+            if ( value_size != row_len || memcmp ( base, last_value, row_len ) != 0 )
+                break;
+
+            last_value = base;
+        }
+
+        ++ cur_row;
+    }
+    return cur_row - firstRow;
+}
+
+uint64_t CSRA1_ReferenceGetLength ( CSRA1_Reference * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return 0;
+    }
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Reference accessed before a call to ReferenceIteratorNext()" );
+        return 0;
+    }
+
+    if ( self -> cur_length == 0 ) /* not yet calculated */
+    {
+        self -> cur_length =  self -> chunk_size * ( self -> last_row - self -> first_row ) +
+                              NGS_CursorGetUInt32 ( self -> curs,
+                                                    ctx,
+                                                    self -> last_row,
+                                                    reference_SEQ_LEN );
+    }
+
+    return self -> cur_length;
+}
+
+struct NGS_String * CSRA1_ReferenceGetBases ( CSRA1_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Reference accessed before a call to ReferenceIteratorNext()" );
+        return NULL;
+    }
+
+    {
+        uint64_t totalBases = CSRA1_ReferenceGetLength ( self, ctx );
+        if ( offset >= totalBases )
+        {
+            return NGS_StringMake ( ctx, "", 0 );
+        }
+        else
+        {
+            uint64_t basesToReturn = totalBases - offset;
+            char* data;
+
+            if (size != (size_t)-1 && basesToReturn > size)
+                basesToReturn = size;
+
+            data = (char*) malloc ( basesToReturn );
+            if ( data == NULL )
+            {
+                SYSTEM_ERROR ( xcNoMemory, "allocating %lu bases", basesToReturn );
+                return NGS_StringMake ( ctx, "", 0 );
+            }
+            else
+            {
+                size_t cur_offset = 0;
+                while ( cur_offset < basesToReturn )
+                {
+                    /* we will potentially ask for more than available in the current blob;
+                        CSRA1_ReferenceGetChunk will return only as much as is available in the blob */
+                    NGS_String* chunk;
+                    ON_FAIL ( chunk = CSRA1_ReferenceGetChunk ( self, ctx, offset + cur_offset, basesToReturn - cur_offset ) )
+                    {
+                        free ( data );
+                        return NULL;
+                    }
+                    cur_offset += string_copy ( data + cur_offset, basesToReturn - cur_offset,
+                                                NGS_StringData ( chunk, ctx ), NGS_StringSize ( chunk, ctx ) );
+                    NGS_StringRelease ( chunk, ctx );
+                }
+                return NGS_StringMakeOwned ( ctx, data, basesToReturn );
+            }
+        }
+    }
+}
+
+struct NGS_String * CSRA1_ReferenceGetChunk ( CSRA1_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{   /* return maximum available contiguous bases starting from the offset */
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    NGS_String* ret = NULL;
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+    }
+    else if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Reference accessed before a call to ReferenceIteratorNext()" );
+    }
+    else if ( offset >= CSRA1_ReferenceGetLength ( self, ctx ) )
+    {
+        ret = NGS_StringMake ( ctx, "", 0 );
+    }
+    else
+    {
+        uint64_t totalBases = CSRA1_ReferenceGetLength ( self, ctx );
+        if ( offset >= totalBases )
+        {
+            return NGS_StringMake ( ctx, "", 0 );
+        }
+        else
+        {
+            int64_t rowId = self -> first_row + offset / self -> chunk_size;
+            TRY ( const VBlob* blob = NGS_CursorGetVBlob ( self -> curs, ctx, rowId, reference_READ ) )
+            {
+                rc_t rc;
+                const void* data;
+                uint64_t cont_size;
+                TRY ( VByteBlob_ContiguousChunk ( blob, ctx, rowId, &data, &cont_size, true ) ) /* stop at a repeated row */
+                {
+                    uint64_t offsetInBlob =  offset % self -> chunk_size;
+                    if ( size == (uint64_t)-1 || offsetInBlob + size > cont_size )
+                    {
+                        size = cont_size - offsetInBlob;
+                    }
+                    if ( offset + size > totalBases )
+                    {   /* when requested more bases than there are in the reference, be careful not to return a part of the next reference sitting in the same blob */
+                        size = totalBases - offset;
+                    }
+                    ret = NGS_StringMakeCopy ( ctx, (const char*)data + offsetInBlob, size ); /* have to make a copy since otherwise would have to hold on to the entire blob, with no idea when to release it */
+                }
+
+                rc = VBlobRelease ( (VBlob*) blob );
+                if ( rc != 0 )
+                {
+                    INTERNAL_ERROR ( xcUnexpected, "VBlobRelease() rc = %R", rc );
+                }
+            }
+        }
+    }
+    return ret;
+}
+
+struct NGS_Alignment* CSRA1_ReferenceGetAlignment ( CSRA1_Reference * self, ctx_t ctx, const char * alignmentIdStr )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Reference accessed before a call to ReferenceIteratorNext()" );
+        return NULL;
+    }
+
+    {
+        TRY ( NGS_Alignment* ref = NGS_ReadCollectionGetAlignment ( self -> dad . coll, ctx, alignmentIdStr ) )
+        {
+            TRY ( NGS_String * spec = NGS_AlignmentGetReferenceSpec( ref, ctx ) )
+            {
+                TRY ( NGS_String * commonName = CSRA1_ReferenceGetCommonName ( self, ctx ) )
+                {
+                    if ( string_cmp( NGS_StringData ( spec, ctx ),
+                                     NGS_StringSize ( spec, ctx ),
+                                     NGS_StringData ( commonName, ctx ),
+                                     NGS_StringSize ( commonName, ctx ),
+                                     (uint32_t)NGS_StringSize ( spec, ctx ) ) == 0 )
+                    {
+                        NGS_StringRelease ( spec, ctx );
+                        NGS_StringRelease ( commonName, ctx );
+                        return ref;
+                    }
+
+                    USER_ERROR ( xcWrongReference,
+                                "Requested alignment is on a wrong reference: reference '%.*s', alignment has '%.*s'",
+                                NGS_StringSize ( commonName, ctx ), NGS_StringData ( commonName, ctx ),
+                                NGS_StringSize ( spec, ctx ), NGS_StringData ( spec, ctx ) );
+
+                    NGS_StringRelease ( commonName, ctx );
+                }
+                NGS_StringRelease ( spec, ctx );
+            }
+            NGS_AlignmentRelease ( ref, ctx );
+        }
+    }
+    return NULL;
+}
+
+struct NGS_Alignment* CSRA1_ReferenceGetAlignments ( CSRA1_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Reference accessed before a call to ReferenceIteratorNext()" );
+        return NULL;
+    }
+
+    {
+        TRY ( bool circular = CSRA1_ReferenceGetIsCircular ( self, ctx ) )
+        {
+            TRY ( uint64_t ref_len = CSRA1_ReferenceGetLength ( self, ctx ) )
+            {
+                /* wants_with_window does not matter, this is not a slice */
+                filters &= ~ NGS_AlignmentFilterBits_start_within_window;
+
+                return CSRA1_ReferenceWindowMake ( ctx,
+                                                   self -> dad . coll,
+                                                   self -> curs,
+                                                   circular,
+                                                   ref_len,
+                                                   self -> chunk_size,
+                                                   self -> first_row,
+                                                   self -> first_row,
+                                                   self -> last_row + 1,
+                                                   0,
+                                                   0,
+                                                   wants_primary,
+                                                   wants_secondary,
+                                                   filters,
+                                                   map_qual,
+                                                   self -> align_id_offset );
+            }
+        }
+    }
+
+    return NULL;
+}
+
+
+uint64_t CSRA1_ReferenceGetAlignmentCount ( const CSRA1_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return 0;
+    }
+
+    {
+        uint64_t res = 0;
+        uint64_t cur_row = self -> first_row;
+
+        while ( cur_row <= self -> last_row )
+        {
+            const void * base;
+            uint32_t elem_bits, boff, row_len;
+
+            if ( wants_primary )
+            {
+                ON_FAIL ( NGS_CursorCellDataDirect ( self -> curs, ctx, cur_row, reference_PRIMARY_ALIGNMENT_IDS,
+                                                     & elem_bits, & base, & boff, & row_len ) )
+                    return res;
+
+                res += row_len;
+            }
+
+            if ( wants_secondary )
+            {
+                ON_FAIL ( NGS_CursorCellDataDirect ( self -> curs, ctx, cur_row, reference_SECONDARY_ALIGNMENT_IDS,
+                                                     & elem_bits, & base, & boff, & row_len ) )
+                    return res;
+
+                res += row_len;
+            }
+
+            cur_row ++;
+        }
+        return res;
+    }
+}
+
+/*
+    Calculate starting reference chunk to cover alignments overlapping with the slice;
+    separately for primary and secondary alignments
+*/
+static
+void LoadOverlaps ( CSRA1_Reference * self,
+                    ctx_t ctx,
+                    uint32_t chunk_size,
+                    uint64_t offset,
+                    int64_t * primary_begin,
+                    int64_t * secondary_begin)
+{
+    int64_t first_row = self -> first_row + offset / chunk_size;
+    uint32_t primary_len;
+    uint32_t secondary_len;
+    int32_t primary_pos;
+    int32_t secondary_pos;
+    uint32_t offset_in_chunk = offset % chunk_size;
+
+    {   /*OVERLAP_REF_LEN*/
+        const void* base;
+        uint32_t elem_bits, boff, row_len;
+        ON_FAIL ( NGS_CursorCellDataDirect ( self -> curs, ctx, first_row, reference_OVERLAP_REF_LEN, & elem_bits, & base, & boff, & row_len ) )
+        {   /* no overlap columns, apply 10-chunk lookback */
+            CLEAR ();
+            if ( first_row > 11 )
+            {
+                *primary_begin =
+                *secondary_begin = first_row - 10;
+            }
+            else
+            {
+                *primary_begin =
+                *secondary_begin = 1;
+            }
+            return;
+        }
+
+        assert ( elem_bits == 32 );
+        assert ( boff == 0 );
+        assert ( row_len == 3 );
+
+        primary_len     = ( (const uint32_t*)base ) [0];
+        secondary_len   = ( (const uint32_t*)base ) [1];
+    }
+
+    if (primary_len == 0 && secondary_len == 0)
+    {
+        *primary_begin = *secondary_begin = first_row;
+    }
+    else
+    {   /*OVERLAP_REF_POS*/
+        const void* base;
+        uint32_t elem_bits, boff, row_len;
+        ON_FAIL( NGS_CursorCellDataDirect ( self -> curs, ctx, first_row, reference_OVERLAP_REF_POS, & elem_bits, & base, & boff, & row_len ) )
+            return;
+
+        assert ( elem_bits == 32 );
+        assert ( boff == 0 );
+        assert ( row_len == 3 );
+
+        primary_pos     = ( (const int32_t*)base ) [0];
+        secondary_pos   = ( (const int32_t*)base ) [1];
+
+        if ( primary_len == 0 || primary_len < offset_in_chunk )
+        {
+            * primary_begin = first_row;
+        }
+        else
+        {
+            * primary_begin = self -> first_row + primary_pos / chunk_size;
+        }
+
+        if ( secondary_len == 0 || secondary_len < offset_in_chunk )
+        {
+            * secondary_begin = first_row;
+        }
+        else
+        {
+            * secondary_begin = self -> first_row + secondary_pos / chunk_size;
+        }
+    }
+}
+
+struct NGS_Alignment* CSRA1_ReferenceGetAlignmentSlice ( CSRA1_Reference * self,
+                                                         ctx_t ctx,
+                                                         uint64_t offset,
+                                                         uint64_t size,
+                                                         bool wants_primary,
+                                                         bool wants_secondary,
+                                                         uint32_t filters,
+                                                         int32_t map_qual )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Reference accessed before a call to ReferenceIteratorNext()" );
+        return NULL;
+    }
+
+    if ( size == 0 )
+    {
+        NGS_Alignment* ret = NGS_AlignmentMakeNull ( ctx, "", 0 );
+        return ret;
+    }
+
+    {
+        TRY ( bool circular = CSRA1_ReferenceGetIsCircular ( self, ctx ) )
+        {
+            TRY ( uint64_t ref_len = CSRA1_ReferenceGetLength ( self, ctx ) )
+            {
+                if ( circular )
+                {   /* for a circular reference, always look at the whole of it
+                       (to account for alignments that start near the end and overlap with the first chunk) */
+                    return CSRA1_ReferenceWindowMake ( ctx,
+                                                       self -> dad . coll,
+                                                       self -> curs,
+                                                       true, /* circular */
+                                                       ref_len,
+                                                       self -> chunk_size,
+                                                       self->first_row, /*primary_begin*/
+                                                       self->first_row, /*secondary_begin*/
+                                                       self -> last_row + 1,
+                                                       offset,
+                                                       size,
+                                                       wants_primary,
+                                                       wants_secondary,
+                                                       filters,
+                                                       map_qual,
+                                                       self -> align_id_offset );
+                }
+                else
+                {   /* for non-circular references, restrict the set of chunks to go through */
+                    int64_t primary_begin   = self->first_row;
+                    int64_t secondary_begin = self->first_row;
+
+                    /* calculate the row range taking "overlaps" into account */
+                    TRY ( LoadOverlaps ( self, ctx, self -> chunk_size, offset, & primary_begin, & secondary_begin ) )
+                    {
+                        /* calculate the last chunk (same for all types of alignments) */
+                        int64_t end = self -> first_row + ( offset + size - 1 ) / self -> chunk_size + 1;
+                        if ( end > self -> last_row )
+                            end = self -> last_row + 1;
+
+                        return CSRA1_ReferenceWindowMake ( ctx,
+                                                           self -> dad . coll,
+                                                           self -> curs,
+                                                           false,
+                                                           ref_len,
+                                                           self -> chunk_size,
+                                                           primary_begin,
+                                                           secondary_begin,
+                                                           end,
+                                                           offset,
+                                                           size,
+                                                           wants_primary,
+                                                           wants_secondary,
+                                                           filters,
+                                                           map_qual,
+                                                           self -> align_id_offset );
+                    }
+                }
+            }
+        }
+        return NULL;
+    }
+}
+
+struct NGS_Pileup* CSRA1_ReferenceGetPileups ( CSRA1_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Reference accessed before a call to ReferenceIteratorNext()" );
+        return NULL;
+    }
+
+    return CSRA1_PileupIteratorMake ( ctx,
+                                      & self -> dad,
+                                      self -> db,
+                                      self -> curs,
+                                      CSRA1_Reference_GetFirstRowId ( (NGS_Reference const*)self, ctx ),
+                                      CSRA1_Reference_GetLastRowId ( (NGS_Reference const*)self, ctx ),
+                                      wants_primary,
+                                      wants_secondary,
+                                      filters,
+                                      map_qual );
+}
+
+static struct NGS_Pileup* CSRA1_ReferenceGetPileupSlice ( CSRA1_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size, bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Reference accessed before a call to ReferenceIteratorNext()" );
+        return NULL;
+    }
+
+    return CSRA1_PileupIteratorMakeSlice ( ctx,
+                                           & self -> dad,
+                                           self -> db,
+                                           self -> curs,
+                                           CSRA1_Reference_GetFirstRowId ( (NGS_Reference const*)self, ctx ),
+                                           CSRA1_Reference_GetLastRowId ( (NGS_Reference const*)self, ctx ),
+                                           offset,
+                                           size,
+                                           wants_primary,
+                                           wants_secondary,
+                                           filters,
+                                           map_qual );
+}
+
+struct NGS_Statistics* CSRA1_ReferenceGetStatistics ( const CSRA1_Reference * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+    /* for now, return an empty stats object */
+    return SRA_StatisticsMake ( ctx );
+}
+
+bool CSRA1_ReferenceFind ( NGS_Cursor const * curs, ctx_t ctx, const char * spec, int64_t* firstRow, uint64_t* rowCount )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    int64_t firstRow_local;
+    uint64_t rowCount_local;
+
+    if ( firstRow == NULL )
+        firstRow = & firstRow_local;
+
+    if ( rowCount == NULL )
+        rowCount = & rowCount_local;
+
+    assert ( curs != NULL );
+    assert ( spec != NULL );
+
+    {   /* use index on reference name if available */
+        TRY ( const VTable* table = NGS_CursorGetTable ( curs, ctx ) )
+        {
+            const KIndex *index;
+            rc_t rc = VTableOpenIndexRead( table, & index, "i_name" );
+            VTableRelease( table );
+            if ( rc == 0 )
+            {
+                rc = KIndexFindText ( index, spec, firstRow, rowCount, NULL, NULL );
+                KIndexRelease ( index );
+                if ( rc == 0 )
+                    return true;
+            }
+        }
+    }
+    /* index not available - do a table scan */
+    {
+        int64_t cur_row;
+        int64_t end_row;
+        uint64_t total_row_count;
+
+        size_t spec_size = string_size ( spec );
+
+        TRY ( NGS_CursorGetRowRange ( curs, ctx, & cur_row, & total_row_count ) )
+        {
+            const void * prev_NAME_base = NULL;
+            const void * prev_SEQ_ID_base = NULL;
+            end_row = cur_row + total_row_count;
+            while ( cur_row < end_row )
+            {
+                const void * base;
+                uint32_t elem_bits, boff, row_len;
+
+                /* try NAME */
+                ON_FAIL ( NGS_CursorCellDataDirect ( curs, ctx, cur_row, reference_NAME, & elem_bits, & base, & boff, & row_len ) )
+                    return false;
+
+                /* if the value has not changed, the base ptr will not be updated */
+                if ( prev_NAME_base != base )
+                {
+                    if ( ( size_t ) row_len == spec_size )
+                    {
+                        assert ( elem_bits == 8 );
+                        assert ( boff == 0 );
+
+                        if ( memcmp ( spec, base, row_len ) == 0 )
+                        {
+                            *firstRow = cur_row;
+                            *rowCount = CountRows( curs, ctx, reference_NAME, base, row_len, * firstRow, end_row );
+                            return true;
+                        }
+                    }
+
+                    prev_NAME_base = base;
+                }
+
+                /* try SEQ_ID */
+                ON_FAIL ( NGS_CursorCellDataDirect ( curs, ctx, cur_row, reference_SEQ_ID, & elem_bits, & base, & boff, & row_len ) )
+                    return false;
+
+                /* if the value has not changed, the base ptr will not be updated */
+                if ( prev_SEQ_ID_base != base )
+                {
+                    if ( ( size_t ) row_len == spec_size )
+                    {
+                        assert ( elem_bits == 8 );
+                        assert ( boff == 0 );
+
+                        if ( memcmp ( spec, base, row_len ) == 0 )
+                        {
+                            *firstRow = cur_row;
+                            *rowCount = CountRows( curs, ctx, reference_SEQ_ID, base, row_len, * firstRow, end_row );
+                            return true;
+                        }
+                    }
+
+                    prev_SEQ_ID_base = base;
+                }
+
+                ++cur_row;
+            }
+        }
+    }
+
+    return false;
+}
+
+NGS_Reference * CSRA1_ReferenceMake ( ctx_t ctx,
+                                      struct NGS_ReadCollection * coll,
+                                      const struct VDatabase * db,
+                                      const struct NGS_Cursor * curs,
+                                      const char * spec,
+                                      uint64_t align_id_offset )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    assert ( coll != NULL );
+    assert ( curs != NULL );
+
+    {
+        TRY ( NGS_String * collName = NGS_ReadCollectionGetName ( coll, ctx ) )
+        {
+            CSRA1_Reference * ref = calloc ( 1, sizeof * ref );
+            if ( ref == NULL )
+            {
+                SYSTEM_ERROR ( xcNoMemory, "allocating CSRA1_Reference(%s) on '%.*s'"
+                               , spec
+                               , ( uint32_t ) NGS_StringSize ( collName, ctx ), NGS_StringData ( collName, ctx )
+                    );
+            }
+            else
+            {
+#if _DEBUGGING
+                char instname [ 256 ];
+                string_printf ( instname, sizeof instname, NULL, "%.*s(%s)"
+                               , ( uint32_t ) NGS_StringSize ( collName, ctx ), NGS_StringData ( collName, ctx )
+                                , spec );
+                instname [ sizeof instname - 1 ] = 0;
+#else
+                const char *instname = "";
+#endif
+                TRY ( CSRA1_ReferenceInit ( ctx, ref, coll, "CSRA1_Reference", instname, align_id_offset ) )
+                {
+                    uint64_t rowCount;
+
+                    ref -> curs = NGS_CursorDuplicate ( curs, ctx );
+
+                    ref -> db = db;
+                    VDatabaseAddRef ( ref -> db );
+
+
+                    /* find requested name */
+                    if ( CSRA1_ReferenceFind ( ref -> curs, ctx, spec, & ref -> first_row, & rowCount ) )
+                    {
+                        TRY ( ref -> chunk_size = NGS_CursorGetUInt32 ( ref -> curs, ctx, ref -> first_row, reference_MAX_SEQ_LEN ) )
+                        {
+                            ref -> iteration_row_last = 0;
+                            ref -> last_row = ref -> first_row + rowCount - 1;
+                            ref -> seen_first = true;
+                            NGS_StringRelease ( collName, ctx );
+                            return ( NGS_Reference * ) ref;
+                        }
+                    }
+
+                    INTERNAL_ERROR ( xcRowNotFound, "Reference not found ( NAME = %s )", spec );
+                    CSRA1_ReferenceWhack ( ref, ctx );
+                }
+
+                free ( ref );
+            }
+            NGS_StringRelease ( collName, ctx );
+        }
+    }
+
+    return NULL;
+}
+
+/*--------------------------------------------------------------------------
+ * NGS_ReferenceIterator
+ */
+
+/* Make
+ */
+NGS_Reference * CSRA1_ReferenceIteratorMake ( ctx_t ctx,
+                                                    struct NGS_ReadCollection * coll,
+                                                    const struct VDatabase * db,
+                                                    const struct NGS_Cursor * curs,
+                                                    uint64_t align_id_offset )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    assert ( coll != NULL );
+    assert ( db != NULL );
+    assert ( curs != NULL );
+
+    {
+        TRY ( NGS_String * collName = NGS_ReadCollectionGetName ( coll, ctx ) )
+        {
+            CSRA1_Reference * ref = calloc ( 1, sizeof * ref );
+            if ( ref == NULL )
+            {
+                SYSTEM_ERROR ( xcNoMemory, "allocating CSRA1_ReferenceIterator on '%.*s'"
+                               , ( uint32_t ) NGS_StringSize ( collName, ctx ), NGS_StringData ( collName, ctx )
+                    );
+            }
+            else
+            {
+#if _DEBUGGING
+                char instname [ 256 ];
+                string_printf ( instname, sizeof instname, NULL, "%.*s"
+                               , ( uint32_t ) NGS_StringSize ( collName, ctx ), NGS_StringData ( collName, ctx )
+                    );
+                instname [ sizeof instname - 1 ] = 0;
+#else
+                const char *instname = "";
+#endif
+                TRY ( CSRA1_ReferenceInit ( ctx, ref, coll, "CSRA1_Reference", instname, align_id_offset ) )
+                {
+                    uint64_t row_count;
+
+                    ref -> curs = NGS_CursorDuplicate ( curs, ctx );
+
+                    ref -> db = db;
+                    VDatabaseAddRef ( ref -> db );
+
+                    TRY ( NGS_CursorGetRowRange ( ref -> curs, ctx, & ref -> first_row, & row_count ) )
+                    {
+                        TRY ( ref -> chunk_size = NGS_CursorGetUInt32 ( ref -> curs, ctx, ref -> first_row, reference_MAX_SEQ_LEN ) )
+                        {
+                            ref -> iteration_row_last = ref -> first_row + row_count - 1;
+                            ref -> last_row     = 0; /* will be set by CSRA1_ReferenceIteratorNext*/
+                            ref -> seen_first   = false;
+                            NGS_StringRelease ( collName, ctx );
+                            return & ref -> dad;
+                        }
+                    }
+                    CSRA1_ReferenceWhack ( ref, ctx );
+                }
+
+                free ( ref );
+            }
+            NGS_StringRelease ( collName, ctx );
+        }
+    }
+
+    return NULL;
+}
+
+/* Next
+ */
+bool CSRA1_ReferenceIteratorNext ( CSRA1_Reference * self, ctx_t ctx )
+{
+    assert ( self != NULL );
+
+    if ( self -> curs == NULL  || self -> first_row > self -> iteration_row_last)
+        return false; /* iteration over or not initialized */
+
+    self -> cur_length = 0;
+
+    if ( self -> seen_first )
+    {   /* skip to the next reference */
+        self -> first_row = self -> last_row + 1;
+        if ( self -> first_row > self -> iteration_row_last)
+        {   /* end of iteration */
+            self -> last_row = self -> first_row;
+            return false;
+        }
+    }
+    else
+    {   /* first reference */
+        self -> seen_first = true;
+    }
+
+    {   /* update self -> last_row */
+        const void * refNameBase = NULL;
+        uint32_t nameLength;
+
+        {   /* get the new reference's name */
+            uint32_t elem_bits, boff;
+            ON_FAIL ( NGS_CursorCellDataDirect ( self -> curs, ctx, self -> first_row, reference_NAME,
+                                                 & elem_bits, & refNameBase, & boff, & nameLength ) )
+                return false;
+            assert ( elem_bits == 8 );
+            assert ( boff == 0 );
+        }
+
+        {   /* use index on reference name if available */
+            uint64_t rowCount;
+            rc_t rc = 1; /* != 0 in case the following TRY fails */
+            TRY ( const VTable* table = NGS_CursorGetTable ( self -> curs, ctx ) )
+            {
+                const KIndex *index;
+                rc = VTableOpenIndexRead( table, & index, "i_name" );
+                VTableRelease( table );
+                if ( rc == 0 )
+                {
+                    char* key = string_dup ( ( const char * ) refNameBase, nameLength );
+                    int64_t firstRow;
+                    rc = KIndexFindText ( index, key, & firstRow, & rowCount, NULL, NULL );
+                    assert ( firstRow == self -> first_row );
+                    KIndexRelease ( index );
+                    free ( key );
+                }
+            }
+
+            CLEAR();
+
+            if ( rc != 0 )
+            {   /* index is not available, do a table scan */
+                rowCount = CountRows ( self -> curs, ctx, reference_NAME, refNameBase, nameLength, self -> first_row, self -> iteration_row_last );
+            }
+
+            self -> last_row = self -> first_row + rowCount - 1;
+        }
+    }
+
+    return true;
+}
diff --git a/libs/ngs/CSRA1_Reference.h b/libs/ngs/CSRA1_Reference.h
new file mode 100644
index 0000000..2989947
--- /dev/null
+++ b/libs/ngs/CSRA1_Reference.h
@@ -0,0 +1,96 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_csra1_reference_
+#define _h_csra1_reference_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_Cursor;
+struct NGS_ReadCollection;
+struct NGS_Reference;
+struct VDatabase;
+
+
+enum ReferenceTableColumns
+{
+    reference_CIRCULAR,
+    reference_NAME,
+    reference_SEQ_ID,
+    reference_SEQ_LEN,
+    reference_SEQ_START,
+    reference_MAX_SEQ_LEN,
+    reference_READ,
+    reference_PRIMARY_ALIGNMENT_IDS,
+    reference_SECONDARY_ALIGNMENT_IDS,
+    reference_OVERLAP_REF_LEN,
+    reference_OVERLAP_REF_POS,
+
+    reference_NUM_COLS
+};
+
+
+struct NGS_Reference * CSRA1_ReferenceMake ( ctx_t ctx, 
+                                             struct NGS_ReadCollection * coll,
+                                             const struct VDatabase * db,
+                                             const struct NGS_Cursor * curs, 
+                                             const char * spec,
+                                             uint64_t align_id_offset );
+
+struct NGS_Reference * CSRA1_ReferenceIteratorMake ( ctx_t ctx, 
+                                                     struct NGS_ReadCollection * coll,
+                                                     const struct VDatabase * db,
+                                                     const struct NGS_Cursor * curs,
+                                                     uint64_t align_id_offset );
+
+int64_t CSRA1_Reference_GetFirstRowId ( const struct NGS_Reference * self, ctx_t ctx );
+int64_t CSRA1_Reference_GetLastRowId ( const struct NGS_Reference * self, ctx_t ctx );
+
+/*
+CSRA1_ReferenceFind
+    curs - the cursor opened for table REFERENCE
+    spec - the reference name to find
+    firstRow [OUT, NULL OK] - the first row id for the reference found in the case when the function returns non-zero
+    rowCount  [OUT, NULL OK] - the number of row ids for the reference found in the case when the function returns non-zero
+
+    return: 0 (false) if the reference is not found, otherwise (true) - the reference is found
+*/
+bool CSRA1_ReferenceFind ( struct NGS_Cursor const * curs, ctx_t ctx, const char * spec, int64_t* firstRow, uint64_t* rowCount );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_csra1_reference_ */
diff --git a/libs/ngs/CSRA1_ReferenceWindow.c b/libs/ngs/CSRA1_ReferenceWindow.c
new file mode 100644
index 0000000..b3453ff
--- /dev/null
+++ b/libs/ngs/CSRA1_ReferenceWindow.c
@@ -0,0 +1,1062 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "CSRA1_ReferenceWindow.h"
+
+typedef struct CSRA1_ReferenceWindow CSRA1_ReferenceWindow;
+#define NGS_ALIGNMENT CSRA1_ReferenceWindow
+
+#include "NGS_Alignment.h"
+#include "NGS_ReadCollection.h"
+#include "NGS_Refcount.h"
+
+#include "NGS_Cursor.h"
+#include "NGS_String.h"
+#include "NGS_Id.h"
+
+#include "CSRA1_Reference.h"
+#include "CSRA1_Alignment.h"
+
+#include <sysalloc.h>
+
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/sort.h>
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <limits.h>
+
+#ifndef min
+#   define min(a,b) ( (a) < (b) ? (a) : (b) )
+#endif
+
+/*--------------------------------------------------------------------------
+ * CSRA1_ReferenceWindow
+ */
+enum
+{
+    Primary     = 0,
+    Secondary   = 1
+};
+struct AlignmentInfo
+{
+    int64_t id;
+                        /* sort order */
+    int64_t     pos;    /* asc */
+    uint64_t    len;    /* desc */
+    int8_t      cat;    /* prim, sec */
+    int32_t     mapq;   /* desc */
+};
+typedef struct AlignmentInfo AlignmentInfo;
+
+struct CSRA1_ReferenceWindow
+{
+    NGS_Refcount dad;
+    NGS_ReadCollection * coll;
+
+    const NGS_Cursor * reference_curs;
+
+    bool circular;
+    bool primary;
+    bool secondary;
+    uint32_t filters;  /* uses NGS_AlignmentFilterBits from NGS_Alignment.h */
+    int32_t map_qual;
+
+    uint32_t chunk_size;
+    uint64_t ref_length; /* total reference length in bases */
+    uint64_t id_offset;
+
+    /* remaining range of chunks in the reference table */
+    int64_t ref_begin;
+    int64_t ref_end;
+
+    /* for use in a slice iterator: */
+    /* slice (0, 0) = all */
+    uint64_t slice_offset;
+    uint64_t slice_size; /* 0 = the rest of the reference */
+    /* starting chunks for primary/secondary tables */
+    int64_t ref_primary_begin;
+    int64_t ref_secondary_begin;
+
+    /* false - not positioned on any chunk */
+    bool seen_first;
+
+    /* alignments against current chunk, sorted in canonical order */
+    AlignmentInfo* align_info;
+    size_t align_info_cur;
+    size_t align_info_total;
+    NGS_Alignment* cur_align; /* cached current alignment, corresponds to align_info_cur */
+};
+
+/* access to filter bits
+ *  NB - the polarity of "pass-bad" and "pass-dups" has been inverted,
+ *  making these same bits now mean "drop-bad" and "drop-dups". this
+ *  was done so that the bits can be tested for non-zero to indicate
+ *  need to apply filters.
+ */
+#define CSRA1_ReferenceWindowFilterDropBad( self )                                 \
+    ( ( ( self ) -> filters & NGS_AlignmentFilterBits_pass_bad ) != 0 )
+#define CSRA1_ReferenceWindowFilterDropDups( self )                                \
+    ( ( ( self ) -> filters & NGS_AlignmentFilterBits_pass_dups ) != 0 )
+#define CSRA1_ReferenceWindowFilterMinMapQual( self )                              \
+    ( ( ( self ) -> filters & NGS_AlignmentFilterBits_min_map_qual ) != 0 )
+#define CSRA1_ReferenceWindowFilterMaxMapQual( self )                              \
+    ( ( ( self ) -> filters & NGS_AlignmentFilterBits_max_map_qual ) != 0 )
+#define CSRA1_ReferenceWindowFilterMapQual( self )                                 \
+    ( ( ( self ) -> filters & NGS_AlignmentFilterBits_map_qual ) != 0 )
+#define CSRA1_ReferenceWindowFilterNoWraparound( self )                            \
+    ( ( ( self ) -> filters & NGS_AlignmentFilterBits_no_wraparound ) != 0 )
+#define CSRA1_ReferenceWindowFilterStartWithinWindow( self )                       \
+    ( ( ( self ) -> filters & NGS_AlignmentFilterBits_start_within_window ) != 0 )
+
+#define NGS_AlignmentFilterBits_prop_mask \
+    ( NGS_AlignmentFilterBits_pass_bad | NGS_AlignmentFilterBits_pass_dups | NGS_AlignmentFilterBits_map_qual )
+
+
+/* Whack
+ */
+static
+void CSRA1_ReferenceWindowWhack ( CSRA1_ReferenceWindow * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcDestroying );
+
+    NGS_AlignmentRelease ( self -> cur_align, ctx );
+    free ( self -> align_info );
+    NGS_CursorRelease ( self -> reference_curs, ctx );
+    NGS_RefcountRelease ( & self -> coll -> dad, ctx );
+}
+
+static
+NGS_Alignment* GetAlignment ( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    if ( self -> seen_first &&
+         ( self -> circular || self -> ref_begin < self ->ref_end ) && /* for circular references, all chunks are loaded at once */
+         self -> align_info_cur < self -> align_info_total )
+    {
+        if ( self -> cur_align == NULL )
+        {
+            TRY ( NGS_String * run_name = NGS_ReadCollectionGetName ( self -> coll, ctx ) )
+            {
+                TRY ( const NGS_String * id = NGS_IdMake ( ctx,
+                                                           run_name,
+                                                           self -> align_info [ self -> align_info_cur ] . cat == Primary ?
+                                                            NGSObject_PrimaryAlignment:
+                                                            NGSObject_SecondaryAlignment,
+                                                           self -> align_info [ self -> align_info_cur ] . id /* + self -> id_offset ? */) )
+                {
+                    self -> cur_align = NGS_ReadCollectionGetAlignment ( self -> coll, ctx, NGS_StringData ( id, ctx ) );
+                    NGS_StringRelease ( id, ctx );
+                }
+                NGS_StringRelease ( run_name, ctx );
+            }
+        }
+        return self -> cur_align;
+    }
+    USER_ERROR ( xcIteratorUninitialized, "Invalid alignment" );
+    return NULL;
+}
+
+
+static
+NGS_String* CSRA1_FragmentGetId ( CSRA1_ReferenceWindow * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_FragmentGetId ( (NGS_Fragment*)ref, ctx );
+    }
+    return NULL;
+}
+
+static
+struct NGS_String * CSRA1_FragmentGetSequence ( CSRA1_ReferenceWindow * self, ctx_t ctx, uint64_t offset, uint64_t length )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_FragmentGetSequence ( (NGS_Fragment*)ref, ctx, offset, length );
+    }
+    return NULL;
+}
+
+static
+struct NGS_String * CSRA1_FragmentGetQualities ( CSRA1_ReferenceWindow * self, ctx_t ctx, uint64_t offset, uint64_t length )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_FragmentGetQualities ( (NGS_Fragment*)ref, ctx, offset, length );
+    }
+    return NULL;
+}
+
+static
+bool CSRA1_FragmentIsPaired ( CSRA1_ReferenceWindow * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_FragmentIsPaired ( (NGS_Fragment*)ref, ctx );
+    }
+    return false;
+}
+
+static
+bool CSRA1_FragmentIsAligned ( CSRA1_ReferenceWindow * self, ctx_t ctx )
+{
+    assert ( self != NULL );
+    return true;
+}
+
+static
+bool CSRA1_FragmentNext ( CSRA1_ReferenceWindow * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    UNIMPLEMENTED(); /* CSRA1_FragmentNext; should not be called - Alignment is not a FragmentIterator */
+    return false;
+}
+
+static
+NGS_String * CSRA1_ReferenceWindowGetAlignmentId( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetAlignmentId ( ref, ctx );
+    }
+    return NULL;
+}
+
+static
+struct NGS_String* CSRA1_ReferenceWindowGetReferenceSpec( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetReferenceSpec ( ref, ctx );
+    }
+    return NULL;
+}
+
+static
+int CSRA1_ReferenceWindowGetMappingQuality( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetMappingQuality ( ref, ctx );
+    }
+    return 0;
+}
+
+static
+INSDC_read_filter CSRA1_ReferenceWindowGetReadFilter( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetReadFilter ( ref, ctx );
+    }
+    return 0;
+}
+
+static
+struct NGS_String* CSRA1_ReferenceWindowGetReferenceBases( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetReferenceBases ( ref, ctx );
+    }
+    return NULL;
+}
+
+static
+struct NGS_String* CSRA1_ReferenceWindowGetReadGroup( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetReadGroup ( ref, ctx );
+    }
+    return NULL;
+}
+
+static
+NGS_String * CSRA1_ReferenceWindowGetReadId( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetReadId ( ref, ctx );
+    }
+    return NULL;
+}
+
+static
+struct NGS_String* CSRA1_ReferenceWindowGetClippedFragmentBases( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetClippedFragmentBases ( ref, ctx );
+    }
+    return NULL;
+}
+
+static
+struct NGS_String* CSRA1_ReferenceWindowGetClippedFragmentQualities( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetClippedFragmentQualities ( ref, ctx );
+    }
+    return NULL;
+}
+
+static
+struct NGS_String* CSRA1_ReferenceWindowGetAlignedFragmentBases( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetAlignedFragmentBases ( ref, ctx );
+    }
+    return NULL;
+}
+
+static
+bool CSRA1_ReferenceWindowIsPrimary( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentIsPrimary ( ref, ctx );
+    }
+    return false;
+}
+
+static
+int64_t CSRA1_ReferenceWindowGetAlignmentPosition( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetAlignmentPosition ( ref, ctx );
+    }
+    return 0;
+}
+
+static
+uint64_t CSRA1_ReferenceWindowGetReferencePositionProjectionRange( CSRA1_ReferenceWindow* self, ctx_t ctx, int64_t ref_pos )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetReferencePositionProjectionRange ( ref, ctx, ref_pos );
+    }
+    return 0;
+}
+
+static
+uint64_t CSRA1_ReferenceWindowGetAlignmentLength( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetAlignmentLength ( ref, ctx );
+    }
+    return 0;
+}
+
+static
+bool CSRA1_ReferenceWindowGetIsReversedOrientation( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetIsReversedOrientation ( ref, ctx );
+    }
+    return false;
+}
+
+static
+int CSRA1_ReferenceWindowGetSoftClip( CSRA1_ReferenceWindow* self, ctx_t ctx, bool left )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetSoftClip ( ref, ctx, left );
+    }
+    return 0;
+}
+
+static
+uint64_t CSRA1_ReferenceWindowGetTemplateLength( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetTemplateLength ( ref, ctx );
+    }
+    return 0;
+}
+
+static
+struct NGS_String* CSRA1_ReferenceWindowGetShortCigar( CSRA1_ReferenceWindow* self, ctx_t ctx, bool clipped )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetShortCigar ( ref, ctx, clipped );
+    }
+    return NULL;
+}
+
+static
+struct NGS_String* CSRA1_ReferenceWindowGetLongCigar( CSRA1_ReferenceWindow* self, ctx_t ctx, bool clipped )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetLongCigar ( ref, ctx, clipped );
+    }
+    return NULL;
+}
+
+static
+char CSRA1_ReferenceWindowGetRNAOrientation( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetRNAOrientation ( ref, ctx );
+    }
+    return false;
+}
+
+static
+bool CSRA1_ReferenceWindowHasMate( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentHasMate ( ref, ctx );
+    }
+    CLEAR(); /* we do not want HasMate to ever throw, as a favor to C++/Java front ends */
+    return false;
+}
+
+static
+struct NGS_String* CSRA1_ReferenceWindowGetMateAlignmentId( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetMateAlignmentId ( ref, ctx );
+    }
+    return 0;
+}
+
+static
+CSRA1_ReferenceWindow* CSRA1_ReferenceWindowGetMateAlignment( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return ( CSRA1_ReferenceWindow * ) NGS_AlignmentGetMateAlignment( ref, ctx );
+    }
+    return NULL;
+}
+
+static
+struct NGS_String* CSRA1_ReferenceWindowGetMateReferenceSpec( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetMateReferenceSpec ( ref, ctx );
+    }
+    return NULL;
+}
+
+static
+bool CSRA1_ReferenceWindowGetMateIsReversedOrientation( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentGetMateIsReversedOrientation ( ref, ctx );
+    }
+    return false;
+}
+
+static
+bool CSRA1_ReferenceWindowIsFirst( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* ref = GetAlignment ( self, ctx ) )
+    {
+        return NGS_AlignmentIsFirst ( ref, ctx );
+    }
+    return false;
+}
+
+/*--------------------------------------------------------------------------
+ * Iterator
+ */
+static
+int64_t AlignmentSort ( const void * p_a, const void * p_b, void *data )
+{
+    const struct AlignmentInfo* a = ( const struct AlignmentInfo * ) p_a;
+    const struct AlignmentInfo* b = ( const struct AlignmentInfo * ) p_b;
+
+    if ( a -> pos < b -> pos )
+        return -1;
+    else if ( a -> pos > b -> pos )
+        return 1;
+
+    /* cannot use uint64_t - uint64_t because of possible overflow */
+    if ( a -> len < b -> len ) return 1;
+    if ( a -> len > b -> len ) return -1;
+
+    if ( a -> cat != b -> cat )
+        return (int64_t) a -> cat - (int64_t) b -> cat;
+
+    /* sort by mapq in reverse order */
+    if ( a -> mapq != b -> mapq )
+        return (int64_t) b -> mapq - (int64_t) a -> mapq;
+
+    /* use row id as the last resort, to make sorting more predictable */
+    return a -> id < b -> id ? -1 : a -> id > b -> id;
+}
+
+static
+void LoadAlignmentInfo ( CSRA1_ReferenceWindow* self, ctx_t ctx, size_t* idx, int64_t id, bool primary, int64_t offset, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    TRY ( NGS_Alignment* al = CSRA1_AlignmentMake ( ctx,
+                                                    ( struct CSRA1_ReadCollection * ) self -> coll,
+                                                    id,
+                                                    "", 0,
+                                                    primary,
+                                                    self -> id_offset ) )
+    {
+        int64_t pos = NGS_AlignmentGetAlignmentPosition ( al, ctx );
+        int64_t len = (int64_t) NGS_AlignmentGetAlignmentLength ( al, ctx );
+
+        if ( ! CSRA1_ReferenceWindowFilterStartWithinWindow ( self ) || pos >= offset )
+        {
+            bool overlaps = true;
+
+            if ( size > 0 )
+            {   /* a slice*/
+                int64_t end_slice =  offset + (int64_t)size;
+                if ( end_slice > (int64_t) self -> ref_length )
+                {
+                    end_slice = self -> ref_length;
+                }
+                if ( ! CSRA1_ReferenceWindowFilterStartWithinWindow ( self ) &&
+                     ! CSRA1_ReferenceWindowFilterNoWraparound ( self ) &&
+                     pos + len >= (int64_t) self -> ref_length )
+                {   /* account for possible carryover on a circular reference */
+                    pos -= self -> ref_length;
+                }
+                overlaps = pos < end_slice && ( pos + len > offset );
+            }
+
+            /* use single-pass loop as a sort of sanctimonious goto mechanism */
+            while ( overlaps )
+            {
+                int32_t map_qual = 0;
+                bool have_map_qual = false;
+
+                /* test for additional filtering */
+                if ( ( self -> filters & NGS_AlignmentFilterBits_prop_mask ) != 0 )
+                {
+                    TRY ( INSDC_read_filter read_filter = NGS_AlignmentGetReadFilter ( al, ctx ) )
+                    {
+                        switch ( read_filter )
+                        {
+                        case READ_FILTER_PASS:
+                            if ( CSRA1_ReferenceWindowFilterMapQual ( self ) )
+                            {
+                                TRY ( map_qual = NGS_AlignmentGetMappingQuality ( al, ctx ) )
+                                {
+                                    have_map_qual = true;
+                                    if ( CSRA1_ReferenceWindowFilterMinMapQual ( self ) )
+                                    {
+                                        /* map_qual must be >= filter level */
+                                        if ( map_qual < self -> map_qual )
+                                            overlaps = false;
+                                    }
+                                    else
+                                    {
+                                        /* map qual must be <= filter level */
+                                        if ( map_qual > self -> map_qual )
+                                            overlaps = false;
+                                    }
+                                }
+                            }
+                            break;
+                        case READ_FILTER_REJECT:
+                            if ( CSRA1_ReferenceWindowFilterDropBad ( self ) )
+                                overlaps = false;
+                            break;
+                        case READ_FILTER_CRITERIA:
+                            if ( CSRA1_ReferenceWindowFilterDropDups ( self ) )
+                                overlaps = false;
+                            break;
+                        case READ_FILTER_REDACTED:
+                            overlaps = false;
+                            break;
+                        }
+
+                        if ( ! overlaps )
+                            break;
+                    }
+                }
+
+                /* accept record */
+
+    /*printf("%li, %li, %i, %li\n", pos, len, NGS_AlignmentGetMappingQuality ( al, ctx ), id);        */
+                self -> align_info [ *idx ] . id = id;
+                self -> align_info [ *idx ] . pos = pos;
+                self -> align_info [ *idx ] . len = len;
+                self -> align_info [ *idx ] . cat = primary ? Primary : Secondary;
+                self -> align_info [ *idx ] . mapq = have_map_qual ? map_qual : NGS_AlignmentGetMappingQuality ( al, ctx );
+                ++ ( * idx );
+
+                /* MUST break here to exit single pass */
+                break;
+            }
+        }
+
+        NGS_AlignmentRelease ( al, ctx );
+    }
+    CATCH ( xcSecondaryAlignmentMissingPrimary )
+    {
+        CLEAR ();
+    }
+}
+
+static
+void LoadAlignmentIndex ( CSRA1_ReferenceWindow* self, ctx_t ctx, int64_t row_id, uint32_t id_col_idx, const int64_t**  p_base, uint32_t* p_length )
+{
+    const void * base;
+    uint32_t elem_bits, boff, row_len;
+    TRY ( NGS_CursorCellDataDirect ( self -> reference_curs,
+                                     ctx,
+                                     row_id,
+                                     id_col_idx,
+                                     & elem_bits,
+                                     & base,
+                                     & boff,
+                                     & row_len ) )
+    {
+        assert ( elem_bits == 64 );
+        assert ( boff == 0 );
+        *p_base = ( const int64_t* ) base;
+        *p_length = row_len;
+    }
+}
+
+static
+int64_t AlignmentSortCircular ( const void * p_a, const void * p_b, void *data )
+{
+    const struct AlignmentInfo* a = ( const struct AlignmentInfo * ) p_a;
+    const struct AlignmentInfo* b = ( const struct AlignmentInfo * ) p_b;
+
+    uint64_t total = *(uint64_t*)data;
+    int64_t a_start = a -> pos;
+    int64_t b_start = b -> pos;
+    if ( ( (uint64_t)a-> pos ) + a -> len > total )
+    {
+        a_start -= total;
+    }
+    if ( ( (uint64_t)b -> pos ) + b -> len > total )
+    {
+        b_start -= total;
+    }
+
+    if ( a_start < b_start )
+        return -1;
+    else if ( a_start > b_start )
+        return 1;
+
+    /* cannot use uint64_t - uint64_t because of possible overflow */
+    if ( a -> len < b -> len ) return 1;
+    if ( a -> len > b -> len ) return -1;
+
+    if ( a -> cat != b -> cat )
+        return (int64_t) a -> cat - (int64_t) b -> cat;
+
+    /* sort by mapq in reverse order */
+    if ( a -> mapq != b -> mapq )
+        return (int64_t) b -> mapq - (int64_t) a -> mapq;
+
+    /* use row id as the last resort, to make sorting more predictable */
+    return a -> id < b -> id ? -1 : a -> id > b -> id;
+}
+
+static
+void LoadAlignments ( CSRA1_ReferenceWindow* self, ctx_t ctx, int64_t chunk_row_id, int64_t offset, uint64_t size )
+{   /* append alignments for the specified chunk to self -> align_info */
+    const int64_t* primary_idx = NULL;
+    uint32_t primary_idx_end = 0;
+    const int64_t* secondary_idx = NULL;
+    uint32_t secondary_idx_end = 0;
+    uint32_t total_added = 0;
+
+    if ( self -> primary && self -> ref_primary_begin <= chunk_row_id )
+    {
+        ON_FAIL ( LoadAlignmentIndex ( self, ctx, chunk_row_id, reference_PRIMARY_ALIGNMENT_IDS, & primary_idx, & primary_idx_end ) )
+            return;
+    }
+
+    if ( self -> secondary && self -> ref_secondary_begin <= chunk_row_id )
+    {
+        ON_FAIL ( LoadAlignmentIndex ( self, ctx, chunk_row_id, reference_SECONDARY_ALIGNMENT_IDS, & secondary_idx, & secondary_idx_end ) )
+        {
+            if ( GetRCObject ( ctx -> rc ) == ( enum RCObject )rcColumn && GetRCState ( ctx -> rc ) == rcNotFound )
+            {   /* SECONDARY_ALIGNMENT_IDS is missing; no problem */
+                self -> secondary = false; /* do not try anymore */
+                CLEAR();
+            }
+            else
+            {
+                return;
+            }
+        }
+    }
+
+    total_added = primary_idx_end + secondary_idx_end;
+    if ( total_added > 0 )
+    {
+        self -> align_info = realloc ( self -> align_info, ( self -> align_info_total + total_added ) * sizeof ( * self -> align_info ) );
+        if ( self -> align_info == NULL )
+        {
+            SYSTEM_ERROR ( xcNoMemory, "allocating CSRA1_ReferenceWindow chunk" );
+            return;
+        }
+        else
+        {
+            uint32_t i;
+            for ( i = 0; i < primary_idx_end; ++i )
+            {
+                ON_FAIL ( LoadAlignmentInfo( self, ctx, & self -> align_info_total, primary_idx [ i ], true, offset, size ) )
+                    return;
+            }
+            for ( i = 0; i < secondary_idx_end; ++i )
+            {
+                ON_FAIL ( LoadAlignmentInfo( self, ctx, & self -> align_info_total, secondary_idx [ i ] + self -> id_offset, false, offset, size ) )
+                    return;
+            }
+        }
+    }
+    /* now self -> align_info_total is the actual number of alignments currently loaded into self->align_info (can be less than allocated for) */
+}
+
+static
+bool LoadFirstCircular ( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{   /* load the first chunk of a circular reference (other chunks will go through LoadNextChunk) */
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    int64_t last_chunk = self -> ref_end - 1;
+    assert ( self );
+
+    self -> align_info_total = 0;
+
+    /* for windows on circular references, self->ref_begin and and self->ref_end - 1
+        are the rowId's of the first and last chunk of the reference, regardless of slicing */
+    if ( ! CSRA1_ReferenceWindowFilterNoWraparound ( self ) && self -> ref_begin < last_chunk )
+    {   /* load the last chunk of the reference, to cover possible overlaps into the first chunk */
+        if ( self -> slice_size == 0 )
+        {   /* loading possible overlaps with the first chunk */
+            ON_FAIL ( LoadAlignments ( self, ctx, last_chunk, 0, self -> chunk_size ) )
+                return false;
+        }
+        else if ( self -> slice_offset < self -> chunk_size )
+        {   /* loading possible overlaps with a slice inside the first chunk */
+            ON_FAIL ( LoadAlignments ( self, ctx, last_chunk, self -> slice_offset, self -> chunk_size - self -> slice_offset ) )
+                return false;
+        }
+        /* target slice is not in the first chunk, no need to look for overlaps from the end of the reference */
+    }
+
+    ON_FAIL ( LoadAlignments ( self, ctx, self -> ref_begin, self -> slice_offset, self -> slice_size ) )
+        return false;
+
+    if ( self -> align_info_total > 0 )
+    {
+        ksort ( self -> align_info, self -> align_info_total, sizeof ( * self -> align_info ), AlignmentSortCircular, & self -> ref_length );
+        self -> align_info_cur = 0;
+        return true;
+    }
+    return false;
+}
+
+static
+bool LoadNextChunk ( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+
+    self -> align_info_total = 0;
+    while ( self -> ref_begin < self -> ref_end )
+    {
+        ON_FAIL ( LoadAlignments ( self, ctx, self -> ref_begin, self -> slice_offset, self -> slice_size ) )
+            return false;
+
+        if ( self -> align_info_total > 0 )
+        {
+            ksort ( self -> align_info, self -> align_info_total, sizeof ( * self -> align_info ), AlignmentSort, NULL );
+            self -> align_info_cur = 0;
+
+            return true;
+        }
+
+        /* this chunk had no alignments - move to the next one */
+        ++ self -> ref_begin;
+    }
+
+    return false;
+}
+
+static
+bool CSRA1_ReferenceWindowIteratorNext ( CSRA1_ReferenceWindow* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    if ( ! self -> seen_first )
+    {   /* first call - position on the first alignment */
+        self -> seen_first = true;
+        if ( self -> circular )
+        {
+            return LoadFirstCircular ( self, ctx );
+        }
+    }
+    else
+    {
+        /* clear cached alignment*/
+        NGS_AlignmentRelease ( self -> cur_align, ctx );
+        self -> cur_align = NULL;
+
+        ++ self -> align_info_cur;
+        if ( self -> align_info_cur < self -> align_info_total )
+            return true;
+
+        ++ self -> ref_begin;
+    }
+
+    return LoadNextChunk ( self, ctx );
+}
+
+static NGS_Alignment_vt CSRA1_ReferenceWindow_vt_inst =
+{
+    {
+        {   /* NGS_Refcount */
+            CSRA1_ReferenceWindowWhack
+        },
+
+        /* NGS_Fragment */
+        CSRA1_FragmentGetId,
+        CSRA1_FragmentGetSequence,
+        CSRA1_FragmentGetQualities,
+        CSRA1_FragmentIsPaired,
+        CSRA1_FragmentIsAligned,
+        CSRA1_FragmentNext
+    },
+
+    CSRA1_ReferenceWindowGetAlignmentId,
+    CSRA1_ReferenceWindowGetReferenceSpec,
+    CSRA1_ReferenceWindowGetMappingQuality,
+    CSRA1_ReferenceWindowGetReadFilter,
+    CSRA1_ReferenceWindowGetReferenceBases,
+    CSRA1_ReferenceWindowGetReadGroup,
+    CSRA1_ReferenceWindowGetReadId,
+    CSRA1_ReferenceWindowGetClippedFragmentBases,
+    CSRA1_ReferenceWindowGetClippedFragmentQualities,
+    CSRA1_ReferenceWindowGetAlignedFragmentBases,
+    CSRA1_ReferenceWindowIsPrimary,
+    CSRA1_ReferenceWindowGetAlignmentPosition,
+    CSRA1_ReferenceWindowGetReferencePositionProjectionRange,
+    CSRA1_ReferenceWindowGetAlignmentLength,
+    CSRA1_ReferenceWindowGetIsReversedOrientation,
+    CSRA1_ReferenceWindowGetSoftClip,
+    CSRA1_ReferenceWindowGetTemplateLength,
+    CSRA1_ReferenceWindowGetShortCigar,
+    CSRA1_ReferenceWindowGetLongCigar,
+    CSRA1_ReferenceWindowGetRNAOrientation,
+    CSRA1_ReferenceWindowHasMate,
+    CSRA1_ReferenceWindowGetMateAlignmentId,
+    CSRA1_ReferenceWindowGetMateAlignment,
+    CSRA1_ReferenceWindowGetMateReferenceSpec,
+    CSRA1_ReferenceWindowGetMateIsReversedOrientation,
+    CSRA1_ReferenceWindowIsFirst,
+
+    /* Iterator */
+    CSRA1_ReferenceWindowIteratorNext
+};
+
+static
+void CSRA1_ReferenceWindowInit ( CSRA1_ReferenceWindow * ref,
+                                 ctx_t ctx,
+                                 NGS_ReadCollection * coll,
+                                 const struct NGS_Cursor* curs,
+                                 bool circular,
+                                 uint64_t ref_length,
+                                 uint32_t chunk_size,
+                                 int64_t primary_begin_row,
+                                 int64_t secondary_begin_row,
+                                 int64_t end_row,
+                                 uint64_t offset,
+                                 uint64_t size, /* 0 - all remaining */
+                                 bool primary,
+                                 bool secondary,
+                                 uint32_t filters,
+                                 int32_t map_qual,
+                                 uint64_t id_offset )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    TRY ( NGS_AlignmentInit ( ctx, ref, & CSRA1_ReferenceWindow_vt_inst, "CSRA1_ReferenceWindow", "" ) )
+    {
+        TRY ( ref -> coll = (NGS_ReadCollection *) NGS_RefcountDuplicate ( & coll -> dad, ctx ) )
+        {
+            ref -> reference_curs       = NGS_CursorDuplicate ( curs, ctx );
+            ref -> circular             = circular;
+            ref -> primary              = primary;
+            ref -> secondary            = secondary;
+            /* see comment above about inverting polarity of the "pass" bits to create "drop" bits */
+            ref -> filters              = filters ^ ( NGS_AlignmentFilterBits_pass_bad | NGS_AlignmentFilterBits_pass_dups );
+            ref -> map_qual             = map_qual;
+            ref -> chunk_size           = chunk_size;
+            ref -> ref_length           = ref_length;
+            ref -> id_offset            = id_offset;
+            ref -> ref_begin            = min (primary_begin_row, secondary_begin_row);
+            ref -> ref_primary_begin    = primary_begin_row;
+            ref -> ref_secondary_begin  = secondary_begin_row;
+            ref -> ref_end              = end_row;
+            ref -> slice_offset         = offset;
+            ref -> slice_size           = size;
+        }
+    }
+}
+
+/* MakeCommon
+ *  makes a common alignment from VCursor
+ */
+NGS_Alignment * CSRA1_ReferenceWindowMake ( ctx_t ctx,
+                                            struct NGS_ReadCollection * coll,
+                                            const struct NGS_Cursor* curs,
+                                            bool circular,
+                                            uint64_t ref_length,
+                                            uint32_t chunk_size,
+                                            int64_t primary_begin_row,
+                                            int64_t secondary_begin_row,
+                                            int64_t end_row,
+                                            uint64_t offset,
+                                            uint64_t size, /* 0 - all remaining */
+                                            bool primary,
+                                            bool secondary,
+                                            uint32_t filters,
+                                            int32_t map_qual,
+                                            uint64_t id_offset )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    CSRA1_ReferenceWindow * ref;
+
+    assert ( coll != NULL );
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating CSRA1_ReferenceWindow" );
+    else
+    {
+        TRY ( CSRA1_ReferenceWindowInit ( ref,
+                                          ctx,
+                                          coll,
+                                          curs,
+                                          circular,
+                                          ref_length,
+                                          chunk_size,
+                                          primary_begin_row,
+                                          secondary_begin_row,
+                                          end_row,
+                                          offset,
+                                          size,
+                                          primary,
+                                          secondary,
+                                          filters,
+                                          map_qual,
+                                          id_offset ) )
+        {
+            return ( NGS_Alignment * ) ref;
+        }
+
+        free ( ref );
+    }
+
+    return NULL;
+}
diff --git a/libs/ngs/CSRA1_ReferenceWindow.h b/libs/ngs/CSRA1_ReferenceWindow.h
new file mode 100644
index 0000000..a48658b
--- /dev/null
+++ b/libs/ngs/CSRA1_ReferenceWindow.h
@@ -0,0 +1,67 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_csra1_reference_window_
+#define _h_csra1_reference_window_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+struct NGS_Cursor;
+struct NGS_Alignment;
+struct NGS_ReadCollection;
+
+struct NGS_Alignment * CSRA1_ReferenceWindowMake ( ctx_t ctx, 
+                                                   struct NGS_ReadCollection * coll, 
+                                                   const struct NGS_Cursor* curs,
+                                                   bool circular,
+                                                   uint64_t ref_length,
+                                                   uint32_t chunk_size,
+                                                   int64_t primary_begin_row,
+                                                   int64_t secondary_begin_row,
+                                                   int64_t end_row,
+                                                   uint64_t offset,
+                                                   uint64_t size, /* 0 - all remaining */
+                                                   bool wants_primary, 
+                                                   bool wants_secondary,
+                                                   uint32_t filters,
+                                                   int32_t map_qual,
+                                                   uint64_t id_offset );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_csra1_alignment_ */
diff --git a/libs/ngs/EBI_ReferenceSequence.c b/libs/ngs/EBI_ReferenceSequence.c
new file mode 100644
index 0000000..7fd8472
--- /dev/null
+++ b/libs/ngs/EBI_ReferenceSequence.c
@@ -0,0 +1,402 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "EBI_ReferenceSequence.h"
+
+typedef struct EBI_ReferenceSequence EBI_ReferenceSequence;
+#define NGS_REFERENCESEQUENCE EBI_ReferenceSequence
+#include "NGS_ReferenceSequence.h"
+
+#include "NGS_String.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <kns/http.h>
+#include <kns/stream.h>
+#include <kns/manager.h>
+
+#include <stddef.h>
+#include <assert.h>
+
+#include <strtol.h>
+#include <string.h>
+
+#include <sysalloc.h>
+
+/*--------------------------------------------------------------------------
+ * EBI_ReferenceSequence
+ */
+
+static void                EBI_ReferenceSequenceWhack ( EBI_ReferenceSequence * self, ctx_t ctx );
+static NGS_String *        EBI_ReferenceSequenceGetCanonicalName ( EBI_ReferenceSequence * self, ctx_t ctx );
+static bool                EBI_ReferenceSequenceGetIsCircular ( EBI_ReferenceSequence const* self, ctx_t ctx );
+static uint64_t            EBI_ReferenceSequenceGetLength ( EBI_ReferenceSequence * self, ctx_t ctx );
+static struct NGS_String * EBI_ReferenceSequenceGetBases ( EBI_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size );
+static struct NGS_String * EBI_ReferenceSequenceGetChunk ( EBI_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size );
+
+static NGS_ReferenceSequence_vt EBI_ReferenceSequence_vt_inst =
+{
+    /* NGS_Refcount */
+    { EBI_ReferenceSequenceWhack }
+
+    /* NGS_ReferenceSequence */
+    ,EBI_ReferenceSequenceGetCanonicalName
+    ,EBI_ReferenceSequenceGetIsCircular
+    ,EBI_ReferenceSequenceGetLength
+    ,EBI_ReferenceSequenceGetBases
+    ,EBI_ReferenceSequenceGetChunk
+};
+
+
+struct EBI_ReferenceSequence
+{
+    NGS_ReferenceSequence dad;
+
+    uint64_t cur_length; /* size of current reference in bases (0 = not yet counted) */
+
+    char* buf_ref_data;     /* contains reference data
+                            */
+    NGS_String* ebi_ref_spec;
+};
+
+static
+void EBI_ReferenceSequenceWhack ( EBI_ReferenceSequence * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcNS, rcTable, rcClosing );
+
+    if ( self->buf_ref_data != NULL )
+    {
+        free ( self->buf_ref_data );
+        self->buf_ref_data = NULL;
+        self->cur_length = 0;
+    }
+
+    NGS_StringRelease ( self -> ebi_ref_spec, ctx );
+}
+
+/* Init
+ */
+static
+void EBI_ReferenceSequenceInit ( ctx_t ctx,
+                           EBI_ReferenceSequence * ref,
+                           const char *clsname,
+                           const char *instname )
+{
+    FUNC_ENTRY ( ctx, rcNS, rcTable, rcOpening );
+
+    if ( ref == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    else
+    {
+        TRY ( NGS_ReferenceSequenceInit ( ctx, & ref -> dad, & EBI_ReferenceSequence_vt_inst, clsname, instname ) )
+        {
+            /* TODO: maybe initialize more*/
+        }
+    }
+}
+
+static bool is_md5 ( const char * spec )
+{
+    size_t char_count = 32;
+    const char allowed_chars[] = "0123456789abcdefABCDEF";
+
+    size_t i;
+    for ( i = 0; spec [i] != '\0' && i < char_count; ++i )
+    {
+        if ( strchr ( allowed_chars, spec[i] ) == NULL )
+        {
+            return false;
+        }
+    }
+
+    return i == char_count;
+}
+
+/* TBD - WHAT IS THIS? IT TAKES A CONTEXT AND RETURNS AN RC!!
+   THIS CODE CAN'T WORK AS INTENDED.
+*/
+static rc_t NGS_ReferenceSequenceComposeEBIUrl ( ctx_t ctx, const char * spec, bool ismd5, char* url, size_t url_size )
+{
+    /* TBD - obtain these from configuration */
+    char const url_templ_md5[] = "http://www.ebi.ac.uk/ena/cram/md5/%s";
+    char const url_templ_acc[] = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nucleotide&rettype=fasta&id=%s";
+
+    size_t num_written = 0;
+    rc_t rc = string_printf ( url, url_size, & num_written, ismd5 ? url_templ_md5 : url_templ_acc, spec );
+
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcStorageExhausted, "insufficient url buffer for NGS_ReferenceSequenceComposeEBIUrl" );
+    }
+
+    return rc;
+}
+
+static rc_t NGS_ReferenceSequenceEBIInitReference (
+    ctx_t ctx, bool ismd5, EBI_ReferenceSequence * ref,
+    const char* ebi_data, size_t ebi_data_size)
+{
+    rc_t rc = 0;
+    ref -> buf_ref_data = malloc ( ebi_data_size );
+    if ( ref -> buf_ref_data == NULL )
+        return RC ( rcRuntime, rcBuffer, rcAllocating, rcMemory, rcExhausted );
+
+    if ( ismd5 )
+    {
+        memmove ( ref->buf_ref_data, ebi_data, ebi_data_size );
+        ref -> cur_length = ebi_data_size;
+    }
+    else
+    {
+        size_t i, i_dst;
+
+        /* this is FASTA file - skip first line and parse out all other '\n' */
+
+        /* 1. skip 1st line */
+        for ( i = 0; i < ebi_data_size && ebi_data [i] != '\0'; ++i )
+        {
+            if ( ebi_data [i] == '\n' )
+            {
+                ++i;
+                break;
+            }
+        }
+
+        if ( i == ebi_data_size || ebi_data [i] == '\0' )
+            return RC ( rcText, rcDoc, rcParsing, rcFormat, rcInvalid );
+
+        /* copy everything except '\n' to the reference buffer */
+
+        i_dst = 0;
+        for (; i < ebi_data_size && ebi_data [i] != '\0'; ++i)
+        {
+            if ( ebi_data [i] != '\n' )
+                ref->buf_ref_data [i_dst++] = ebi_data [i];
+        }
+        ref -> cur_length = i_dst;
+    }
+
+    return rc;
+}
+
+
+#define URL_SIZE 512
+
+static rc_t NGS_ReferenceSequenceOpenEBI ( ctx_t ctx, const char * spec, EBI_ReferenceSequence * ref )
+{
+    rc_t rc = 0;
+    KDataBuffer result;
+    KHttpRequest *req = NULL;
+    KHttpResult *rslt = NULL;
+    bool ismd5 = is_md5 ( spec );
+    KNSManager * mgr;
+
+    size_t const url_size = URL_SIZE;
+    char url_request [ URL_SIZE ];
+
+    rc = KNSManagerMake ( & mgr );
+    if ( rc != 0 )
+        return rc;
+
+    memset(&result, 0, sizeof result);
+    rc = NGS_ReferenceSequenceComposeEBIUrl ( ctx, spec, ismd5, url_request, url_size );
+
+    if ( rc == 0 )
+        rc = KNSManagerMakeRequest (mgr, &req, 0x01010000, NULL,url_request);
+
+    if ( rc == 0 )
+        rc = KHttpRequestGET(req, &rslt);
+
+    if ( rc == 0 )
+    {
+        uint32_t code = 0;
+        rc = KHttpResultStatus(rslt, &code, NULL, 0, NULL);
+        if (rc == 0 && code != 200)
+            rc = RC(rcNS, rcFile, rcReading, rcFile, rcInvalid);
+    }
+
+    if ( rc == 0 )
+    {
+        size_t total = 0;
+        KStream *response = NULL;
+        rc = KHttpResultGetInputStream(rslt, &response);
+        if (rc == 0)
+            rc = KDataBufferMakeBytes(&result, 1024);
+
+        while (rc == 0)
+        {
+            size_t num_read = 0;
+            uint8_t *base = NULL;
+            uint64_t avail = result.elem_count - total;
+            if (avail < 256)
+            {
+                rc = KDataBufferResize(&result, result.elem_count + 1024);
+                if (rc != 0)
+                    break;
+            }
+            base = result.base;
+            rc = KStreamRead(response, &base[total], result.elem_count - total, &num_read);
+            if (rc != 0)
+            {
+                /* TBD - look more closely at rc */
+                if (num_read > 0)
+                    rc = 0;
+                else
+                    break;
+            }
+            if (num_read == 0)
+                break;
+
+            total += num_read;
+        }
+        KStreamRelease ( response );
+        if (rc == 0)
+        {
+            result.elem_count = total;
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        const char* start = (const char*) result.base;
+        size_t size = KDataBufferBytes ( & result );
+
+        rc = NGS_ReferenceSequenceEBIInitReference ( ctx, ismd5, ref, start, size );
+        if (rc == 0)
+            ref->ebi_ref_spec = NGS_StringMakeCopy ( ctx, spec, strlen(spec) );
+    }
+
+    /* TODO: release only if they were allocated */
+    KDataBufferWhack ( &result );
+    KHttpResultRelease ( rslt );
+    KHttpRequestRelease ( req );
+
+    KNSManagerRelease ( mgr );
+
+    return rc;
+}
+
+NGS_ReferenceSequence * NGS_ReferenceSequenceMakeEBI ( ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcNS, rcTable, rcOpening );
+
+    EBI_ReferenceSequence * ref;
+
+    assert ( spec != NULL );
+    assert ( spec [0] != '\0' );
+
+    ref = calloc ( 1, sizeof *ref );
+    if ( ref == NULL )
+    {
+        SYSTEM_ERROR ( xcNoMemory, "allocating EBI_ReferenceSequence ( '%s' )", spec );
+    }
+    else
+    {
+        TRY ( EBI_ReferenceSequenceInit ( ctx, ref, "NGS_ReferenceSequence", spec ) )
+        {
+            rc_t rc = NGS_ReferenceSequenceOpenEBI ( ctx, spec, ref );
+            if ( rc != 0 )
+            {
+                INTERNAL_ERROR ( xcUnexpected, "failed to open table '%s': rc = %R", spec, rc );
+            }
+            else
+            {
+                return (NGS_ReferenceSequence*) ref;
+            }
+            EBI_ReferenceSequenceWhack ( ref , ctx );
+        }
+        free ( ref );
+    }
+    return NULL;
+}
+
+
+NGS_String * EBI_ReferenceSequenceGetCanonicalName ( EBI_ReferenceSequence * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcNS, rcDoc, rcReading );
+
+    assert ( self != NULL );
+
+    return NGS_StringDuplicate ( self -> ebi_ref_spec, ctx );
+}
+
+bool EBI_ReferenceSequenceGetIsCircular ( const EBI_ReferenceSequence * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcNS, rcDoc, rcReading );
+
+    assert ( self );
+
+    return false;
+}
+
+uint64_t EBI_ReferenceSequenceGetLength ( EBI_ReferenceSequence * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcNS, rcDoc, rcReading );
+
+    assert ( self );
+
+    return self -> cur_length;
+}
+
+struct NGS_String * EBI_ReferenceSequenceGetBases ( EBI_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcNS, rcDoc, rcReading );
+
+    assert ( self );
+
+    {
+        uint64_t totalBases = EBI_ReferenceSequenceGetLength ( self, ctx );
+        if ( offset >= totalBases )
+        {
+            return NGS_StringMake ( ctx, "", 0 );
+        }
+        else
+        {
+            uint64_t basesToReturn = totalBases - offset;
+
+            if (size != (size_t)-1 && basesToReturn > size)
+                basesToReturn = size;
+
+            return NGS_StringMakeCopy ( ctx, (const char*) self -> buf_ref_data + offset, basesToReturn );
+        }
+    }
+}
+
+struct NGS_String * EBI_ReferenceSequenceGetChunk ( EBI_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcNS, rcDoc, rcReading );
+
+    assert ( self );
+
+    return EBI_ReferenceSequenceGetBases ( self, ctx, offset, size );
+}
diff --git a/libs/ngs/EBI_ReferenceSequence.h b/libs/ngs/EBI_ReferenceSequence.h
new file mode 100644
index 0000000..09b67f2
--- /dev/null
+++ b/libs/ngs/EBI_ReferenceSequence.h
@@ -0,0 +1,51 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ebi_referencesequence_
+#define _h_ebi_referencesequence_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_ReferenceSequenceSequence;
+
+
+struct NGS_ReferenceSequence * NGS_ReferenceSequenceMakeEBI ( ctx_t ctx,
+                                             const char * spec );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ebi_referencesequence_ */
diff --git a/libs/ngs/Makefile b/libs/ngs/Makefile
new file mode 100644
index 0000000..9fa6100
--- /dev/null
+++ b/libs/ngs/Makefile
@@ -0,0 +1,129 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/ngs
+
+INT_LIBS = \
+	libngs
+
+EXT_LIBS = \
+
+ALL_LIBS = \
+	$(INT_LIBS) \
+	$(EXT_LIBS)
+
+OBJFILES = \
+	$(NGS_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+INCDIRS += -I$(TOP)/../ngs/ngs-sdk
+
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+$(EXT_LIBS): makedirs
+	@ $(MAKE_CMD) $(LIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+	$(addprefix $(LIBDIR)/,$(EXT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# ngs
+#  will be included in ncbi-vdb
+#
+$(ILIBDIR)/libngs: $(addprefix $(ILIBDIR)/libngs.,$(ILIBEXT))
+
+NGS_SRC =                 \
+	NCBI-NGS              \
+	CSRA1_PileupEvent     \
+	CSRA1_Pileup          \
+	CSRA1_Alignment       \
+	CSRA1_ReferenceWindow \
+	CSRA1_Reference       \
+	CSRA1_ReadCollection  \
+	CSRA1_Read            \
+	EBI_ReferenceSequence \
+	SRA_Statistics        \
+	SRA_DB_ReadCollection \
+	SRA_Read              \
+	SRA_ReadGroup         \
+	SRA_ReadGroupInfo     \
+	SRA_ReadCollection    \
+	SRA_ReferenceSequence \
+	NGS_Statistics        \
+	NGS_ReadCollection    \
+	NGS_PileupEvent       \
+	NGS_Pileup            \
+	NGS_ReadGroup         \
+	NGS_Alignment         \
+	NGS_Reference         \
+	NGS_ReferenceSequence \
+	NGS_Read              \
+	NGS_Fragment          \
+	NGS_Cursor            \
+	NGS_Refcount          \
+	NGS_String            \
+	NGS_Id                \
+	NGS_ErrBlock          \
+	NGS_FragmentBlob      \
+	NGS_FragmentBlobIterator      \
+    VByteBlob    \
+
+NGS_OBJ = \
+	$(addsuffix .$(LOBX),$(NGS_SRC))
+
+NGS_LIB = \
+
+$(ILIBDIR)/libngs.$(LIBX): $(NGS_OBJ)
+	$(LD) --slib -o $@ $^ $(NGS_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/ngs/Model.graphml b/libs/ngs/Model.graphml
new file mode 100644
index 0000000..8c55c74
--- /dev/null
+++ b/libs/ngs/Model.graphml
@@ -0,0 +1,661 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.12-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="30.0" width="205.0" x="399.0" y="360.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="115.75048828125" x="44.624755859375" y="3.0">NGS_PileupEvent<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="30.0" width="176.0" x="-583.0" y="-10.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="111.51025390625" x="32.244873046875" y="3.0">NGS_ReadGroup<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="30.0" width="205.0" x="-282.5" y="-256.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="136.20263671875" x="34.398681640625" y="3.0">SRA_ReadCollection<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="30.0" width="212.0" x="-14.0" y="-203.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="161.19970703125" x="25.400146484375" y="3.0">SRA_DB_ReadCollection<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="30.0" width="205.0" x="249.5" y="-164.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="154.03955078125" x="25.480224609375" y="3.0">CSRA1_ReadCollection<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d4"/>
+      <data key="d6">
+        <y:UMLClassNode>
+          <y:Geometry height="28.0" width="205.0" x="408.0" y="-237.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="181.18212890625" x="11.908935546875" y="3.0">BAM_ReadCollection (TBD)<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true">
+            <y:AttributeLabel/>
+            <y:MethodLabel/>
+          </y:UML>
+        </y:UMLClassNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="22.0" width="238.0" x="34.0" y="-401.5"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="120.671875" x="58.6640625" y="1.93359375">NGS_ReadCollection<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="parallelogram"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="238.0" x="595.0" y="-157.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="91.24609375" x="73.376953125" y="5.93359375">NGS_Reference<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="parallelogram"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="238.0" x="296.5" y="183.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="93.970703125" x="72.0146484375" y="5.93359375">NGS_Alignment<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="parallelogram"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="238.0" x="-351.5" y="68.5"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="70.041015625" x="83.9794921875" y="5.93359375">NGS_Read2<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="parallelogram"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="238.0" x="-90.0" y="283.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="96.865234375" x="70.5673828125" y="5.93359375">NGS_Fragment2<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="parallelogram"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="238.0" x="662.5" y="283.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="69.255859375" x="84.3720703125" y="5.93359375">NGS_Pileup<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="parallelogram"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="205.0" x="-73.5" y="114.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.783203125" x="72.1083984375" y="5.93359375">SRA_Read<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n13">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="205.0" x="468.0" y="-62.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="105.466796875" x="49.7666015625" y="5.93359375">CSRA1_Reference<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n14">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="205.0" x="161.5" y="54.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="108.19140625" x="48.404296875" y="5.93359375">CSRA1_Alignment<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n15">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="205.0" x="587.0" y="149.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="83.4765625" x="60.76171875" y="5.93359375">CSRA1_Pileup<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n16">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="176.0" x="-473.0" y="209.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="127.861328125" x="24.0693359375" y="5.93359375">NGS_ReadGroupFilter<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n17">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="238.0" x="-361.5" y="-49.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="62.453125" x="87.7734375" y="5.93359375">NGS_Read<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n18">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="238.0" x="-569.5" y="-213.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="89.27734375" x="74.361328125" y="5.93359375">NGS_Fragment<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <edge id="e0" source="n2" target="n6">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n3" target="n6">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n4" target="n6">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n5" target="n6">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n13" target="n7">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n12" target="n9">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n15" target="n11">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n14" target="n8">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n16" target="n9">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n4" target="n13">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n4" target="n14">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n9" target="n10">
+      <data key="d8"/>
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n1" target="n16">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n13" target="n15">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n13" target="n14">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n4" target="n12">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e16" source="n3" target="n12">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e17" source="n2" target="n12">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e18" source="n15" target="n0">
+      <data key="d8"/>
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e19" source="n8" target="n10">
+      <data key="d8"/>
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e20" source="n12" target="n10">
+      <data key="d8"/>
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e21" source="n14" target="n10">
+      <data key="d8"/>
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e22" source="n3" target="n17">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e23" source="n17" target="n18">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e24" source="n2" target="n17">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e25" source="n4" target="n17">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources/>
+  </data>
+</graphml>
diff --git a/libs/ngs/NCBI-NGS.c b/libs/ngs/NCBI-NGS.c
new file mode 100644
index 0000000..c90a6e0
--- /dev/null
+++ b/libs/ngs/NCBI-NGS.c
@@ -0,0 +1,66 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NCBI-NGS.h"
+#include "NGS_ErrBlock.h"
+#include "NGS_ReadCollection.h"
+#include "NGS_ReferenceSequence.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+/*--------------------------------------------------------------------------
+ * NCBI NGS engine
+ *  link against ncbi-vdb library
+ */
+
+LIB_EXPORT struct NGS_ReadCollection_v1 * NCBI_NGS_OpenReadCollection ( const char * spec, struct NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcDatabase, rcOpening );
+
+    ON_FAIL ( NGS_ReadCollection * ret = NGS_ReadCollectionMake ( ctx, spec ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_ReadCollection_v1 * ) ret;
+}
+
+LIB_EXPORT struct NGS_ReferenceSequence_v1 * NCBI_NGS_OpenReferenceSequence ( const char * spec, struct NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcTable, rcOpening );
+
+    ON_FAIL ( NGS_ReferenceSequence * ret = NGS_ReferenceSequenceMake ( ctx, spec ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_ReferenceSequence_v1 * ) ret;
+}
diff --git a/libs/ngs/NCBI-NGS.h b/libs/ngs/NCBI-NGS.h
new file mode 100644
index 0000000..0fe584e
--- /dev/null
+++ b/libs/ngs/NCBI-NGS.h
@@ -0,0 +1,58 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_NCBI_NGS_
+#define _h_ngs_NCBI_NGS_
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_ErrBlock_v1;
+struct NGS_ReadCollection_v1;
+struct NGS_ReferenceSequence_v1;
+
+/*--------------------------------------------------------------------------
+ * NCBI NGS engine
+ *  link against ncbi-vdb library
+ */
+LIB_EXPORT struct NGS_ReadCollection_v1 * NCBI_NGS_OpenReadCollection ( const char * spec, struct NGS_ErrBlock_v1 * err );
+LIB_EXPORT struct NGS_ReferenceSequence_v1 * NCBI_NGS_OpenReferenceSequence ( const char * spec, struct NGS_ErrBlock_v1 * err );
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_NCBI_NGS_ */
diff --git a/libs/ngs/NGS_Alignment.c b/libs/ngs/NGS_Alignment.c
new file mode 100644
index 0000000..1bd0b2a
--- /dev/null
+++ b/libs/ngs/NGS_Alignment.c
@@ -0,0 +1,993 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_Alignment.h"
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/FragmentItf.h>
+#include <ngs/itf/AlignmentItf.h>
+
+#include "NGS_Refcount.h"
+#include "NGS_String.h"
+
+#include <sysalloc.h>
+
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+
+#include <klib/printf.h>
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+/*--------------------------------------------------------------------------
+ * NGS_Alignment_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_Alignment* ) ( obj ) )
+
+static NGS_String_v1 * ITF_Alignment_v1_get_id ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetAlignmentId ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Alignment_v1_get_ref_spec ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetReferenceSpec ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static int32_t ITF_Alignment_v1_get_map_qual ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( int32_t ret = NGS_AlignmentGetMappingQuality ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static NGS_String_v1 * ITF_Alignment_v1_get_ref_bases ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetReferenceBases ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Alignment_v1_get_read_group ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetReadGroup ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Alignment_v1_get_read_id ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetReadId ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Alignment_v1_get_clipped_frag_bases ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetClippedFragmentBases ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Alignment_v1_get_clipped_frag_quals ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetClippedFragmentQualities ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Alignment_v1_get_aligned_frag_bases ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetAlignedFragmentBases ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static bool ITF_Alignment_v1_is_primary ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_AlignmentIsPrimary ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static int64_t ITF_Alignment_v1_get_align_pos ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( int64_t ret = NGS_AlignmentGetAlignmentPosition ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static uint64_t ITF_Alignment_v1_get_ref_pos_projection_range ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err, int64_t ref_pos )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint64_t ret = NGS_AlignmentGetReferencePositionProjectionRange ( Self ( self ), ctx, ref_pos ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static uint64_t ITF_Alignment_v1_get_align_length ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint64_t ret = NGS_AlignmentGetAlignmentLength ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static bool ITF_Alignment_v1_get_is_reversed ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_AlignmentGetIsReversedOrientation ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static int32_t ITF_Alignment_v1_get_soft_clip ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err, uint32_t edge )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( int32_t ret = NGS_AlignmentGetSoftClip ( Self ( self ), ctx, edge == 0 ) ) /* TODO: use an enum from <ngs/itf/AlignmentItf.h> */
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static uint64_t ITF_Alignment_v1_get_template_len ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint64_t ret = NGS_AlignmentGetTemplateLength ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static NGS_String_v1 * ITF_Alignment_v1_get_short_cigar ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err, bool clipped )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetShortCigar ( Self ( self ), ctx, clipped ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Alignment_v1_get_long_cigar ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err, bool clipped )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetLongCigar ( Self ( self ), ctx, clipped ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static char ITF_Alignment_v1_get_rna_orientation ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( char ret = NGS_AlignmentGetRNAOrientation ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static bool ITF_Alignment_v1_has_mate ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_AlignmentHasMate ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static NGS_String_v1 * ITF_Alignment_v1_get_mate_id ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetMateAlignmentId ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_Alignment_v1 * ITF_Alignment_v1_get_mate_alignment ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_Alignment * ret = NGS_AlignmentGetMateAlignment ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_Alignment_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Alignment_v1_get_mate_ref_spec ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_AlignmentGetMateReferenceSpec ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static bool ITF_Alignment_v1_get_mate_is_reversed ( const NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_AlignmentGetMateIsReversedOrientation ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static bool ITF_Alignment_v1_next ( NGS_Alignment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_AlignmentIteratorNext ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+#undef Self
+
+
+NGS_Alignment_v1_vt ITF_Alignment_vt =
+{
+    {
+        "NGS_Alignment",
+        "NGS_Alignment_v1",
+        2,
+        & ITF_Fragment_vt . dad
+    },
+
+    /* v1.0 */
+    ITF_Alignment_v1_get_id,
+    ITF_Alignment_v1_get_ref_spec,
+    ITF_Alignment_v1_get_map_qual,
+    ITF_Alignment_v1_get_ref_bases,
+    ITF_Alignment_v1_get_read_group,
+    ITF_Alignment_v1_get_read_id,
+    ITF_Alignment_v1_get_clipped_frag_bases,
+    ITF_Alignment_v1_get_clipped_frag_quals,
+    ITF_Alignment_v1_get_aligned_frag_bases,
+    ITF_Alignment_v1_is_primary,
+    ITF_Alignment_v1_get_align_pos,
+    ITF_Alignment_v1_get_align_length,
+    ITF_Alignment_v1_get_is_reversed,
+    ITF_Alignment_v1_get_soft_clip,
+    ITF_Alignment_v1_get_template_len,
+    ITF_Alignment_v1_get_short_cigar,
+    ITF_Alignment_v1_get_long_cigar,
+    ITF_Alignment_v1_has_mate,
+    ITF_Alignment_v1_get_mate_id,
+    ITF_Alignment_v1_get_mate_alignment,
+    ITF_Alignment_v1_get_mate_ref_spec,
+    ITF_Alignment_v1_get_mate_is_reversed,
+    ITF_Alignment_v1_next,
+
+    /* v1.1 */
+    ITF_Alignment_v1_get_rna_orientation,
+
+    /* v1.2 */
+    ITF_Alignment_v1_get_ref_pos_projection_range
+};
+
+
+#define VT( self, msg ) \
+    ( ( ( const NGS_Alignment_vt* ) ( self ) -> dad . dad . vt ) -> msg )
+
+/* Init
+ */
+void NGS_AlignmentInit ( ctx_t ctx, NGS_Alignment * ref, const NGS_Alignment_vt *vt, const char *clsname, const char *instname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    if ( ref == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    else
+    {
+        TRY ( NGS_FragmentInit ( ctx, & ref -> dad, & ITF_Alignment_vt . dad, & vt -> dad, clsname, instname ) )
+        {
+        }
+    }
+}
+
+struct NGS_String * NGS_AlignmentGetAlignmentId( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetAlignmentId failed" );
+    }
+    else
+    {
+        return VT ( self, getId ) ( self, ctx );
+    }
+    return 0;
+}
+
+struct NGS_String* NGS_AlignmentGetReferenceSpec( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetReferenceSpec failed" );
+    }
+    else
+    {
+        return VT ( self, getReferenceSpec ) ( self, ctx );
+    }
+    return NULL;
+}
+
+int NGS_AlignmentGetMappingQuality( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetMappingQuality failed" );
+    }
+    else
+    {
+        return VT ( self, getMappingQuality ) ( self, ctx );
+    }
+    return 0;
+}
+
+INSDC_read_filter NGS_AlignmentGetReadFilter( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetReadFilter failed" );
+    }
+    else
+    {
+        return VT ( self, getReadFilter ) ( self, ctx );
+    }
+    return 0;
+}
+
+struct NGS_String* NGS_AlignmentGetReferenceBases( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetMappingQuality failed" );
+    }
+    else
+    {
+        return VT ( self, getReferenceBases ) ( self, ctx );
+    }
+    return NULL;
+}
+
+struct NGS_String* NGS_AlignmentGetReadGroup( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetMappingQuality failed" );
+    }
+    else
+    {
+        return VT ( self, getReadGroup ) ( self, ctx );
+    }
+    return NULL;
+}
+
+struct NGS_String * NGS_AlignmentGetReadId( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetReadId failed" );
+    }
+    else
+    {
+        return VT ( self, getReadId ) ( self, ctx );
+    }
+    return 0;
+}
+
+struct NGS_String* NGS_AlignmentGetClippedFragmentBases( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetFragmentBases failed" );
+    }
+    else
+    {
+        return VT ( self, getClippedFragmentBases ) ( self, ctx );
+    }
+    return NULL;
+}
+
+struct NGS_String* NGS_AlignmentGetClippedFragmentQualities( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetFragmentQualities failed" );
+    }
+    else
+    {
+        return VT ( self, getClippedFragmentQualities ) ( self, ctx );
+    }
+    return NULL;
+}
+
+struct NGS_String* NGS_AlignmentGetAlignedFragmentBases( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetAlignedFragmentBases failed" );
+    }
+    else
+    {
+        return VT ( self, getAlignedFragmentBases ) ( self, ctx );
+    }
+    return NULL;
+}
+
+bool NGS_AlignmentIsPrimary( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentIsPrimary failed" );
+    }
+    else
+    {
+        return VT ( self, isPrimary ) ( self, ctx );
+    }
+    return false;
+}
+
+int64_t NGS_AlignmentGetAlignmentPosition( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetAlignmentPosition failed" );
+    }
+    else
+    {
+        return VT ( self, getAlignmentPosition ) ( self, ctx );
+    }
+    return 0;
+}
+
+uint64_t NGS_AlignmentGetReferencePositionProjectionRange( NGS_Alignment* self, ctx_t ctx, int64_t ref_pos )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetReferencePositionProjectionRange failed" );
+    }
+    else
+    {
+        return VT ( self, getReferencePositionProjectionRange ) ( self, ctx, ref_pos );
+    }
+    return 0;
+}
+
+uint64_t NGS_AlignmentGetAlignmentLength( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetAlignmentLength failed" );
+    }
+    else
+    {
+        return VT ( self, getAlignmentLength ) ( self, ctx );
+    }
+    return 0;
+}
+
+bool NGS_AlignmentGetIsReversedOrientation( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetIsReversedOrientation failed" );
+    }
+    else
+    {
+        return VT ( self, getIsReversedOrientation ) ( self, ctx );
+    }
+    return false;
+}
+
+int NGS_AlignmentGetSoftClip( NGS_Alignment* self, ctx_t ctx, bool left )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetSoftClip failed" );
+    }
+    else
+    {
+        return VT ( self, getSoftClip ) ( self, ctx, left );
+    }
+    return 0;
+}
+
+uint64_t NGS_AlignmentGetTemplateLength( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetTemplateLength failed" );
+    }
+    else
+    {
+        return VT ( self, getTemplateLength ) ( self, ctx );
+    }
+    return 0;
+}
+
+struct NGS_String* NGS_AlignmentGetShortCigar( NGS_Alignment* self, ctx_t ctx, bool clipped )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetShortCigar failed" );
+    }
+    else
+    {
+        return VT ( self, getShortCigar ) ( self, ctx, clipped );
+    }
+    return NULL;
+}
+
+struct NGS_String* NGS_AlignmentGetLongCigar( NGS_Alignment* self, ctx_t ctx, bool clipped )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetLongCigar failed" );
+    }
+    else
+    {
+        return VT ( self, getLongCigar ) ( self, ctx, clipped );
+    }
+    return NULL;
+}
+
+char NGS_AlignmentGetRNAOrientation( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetRNAOrientation failed" );
+    }
+    else
+    {
+        return VT ( self, getRNAOrientation ) ( self, ctx );
+    }
+    return '?';
+}
+
+bool NGS_AlignmentHasMate ( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentHasMate failed" );
+    }
+    else
+    {
+        return VT ( self, hasMate ) ( self, ctx );
+    }
+    return false;
+}
+
+struct NGS_String* NGS_AlignmentGetMateAlignmentId( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetMateAlignmentId failed" );
+    }
+    else
+    {
+        return VT ( self, getMateAlignmentId ) ( self, ctx );
+    }
+    return 0;
+}
+
+NGS_Alignment* NGS_AlignmentGetMateAlignment( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetMateAlignment failed" );
+    }
+    else
+    {
+        return VT ( self, getMateAlignment ) ( self, ctx );
+    }
+    return NULL;
+}
+
+struct NGS_String* NGS_AlignmentGetMateReferenceSpec( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetMateReferenceSpec failed" );
+    }
+    else
+    {
+        return VT ( self, getMateReferenceSpec ) ( self, ctx );
+    }
+    return NULL;
+}
+
+bool NGS_AlignmentGetMateIsReversedOrientation( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentGetMateIsReversedOrientation failed" );
+    }
+    else
+    {
+        return VT ( self, getMateIsReversedOrientation ) ( self, ctx );
+    }
+    return false;
+}
+
+bool NGS_AlignmentIsFirst ( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "NGS_AlignmentIsFirst failed" );
+    }
+    else
+    {
+        return VT ( self, isFirst ) ( self, ctx );
+    }
+    return false;
+}
+
+/*--------------------------------------------------------------------------
+ * NGS_AlignmentIterator
+ */
+bool NGS_AlignmentIteratorNext( NGS_Alignment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to increment iterator" );
+    }
+    else
+    {
+        return VT ( self, next ) ( self, ctx );
+    }
+
+    return false;
+}
+
+
+/*--------------------------------------------------------------------------
+ * Null_Alignment
+ */
+static
+void NullAlignmentWhack ( NGS_Alignment * self, ctx_t ctx )
+{
+}
+
+static
+struct NGS_String * NullAlignment_FragmentToString ( NGS_Alignment * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static
+struct NGS_String * NullAlignment_FragmentOffsetLenToString ( NGS_Alignment * self, ctx_t ctx, uint64_t offset, uint64_t length )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static
+bool NullAlignment_FragmentToBool ( NGS_Alignment * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+
+static int64_t NullAlignment_toI64 ( NGS_ALIGNMENT* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static struct NGS_String* NullAlignment_toString ( NGS_ALIGNMENT* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return NULL;
+}
+
+static int NullAlignment_toInt ( NGS_ALIGNMENT* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static struct NGS_String* NullAlignment_boolToString ( NGS_ALIGNMENT* self, ctx_t ctx, bool b )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return NULL;
+}
+
+static bool NullAlignment_toBool ( NGS_ALIGNMENT* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return false;
+}
+
+static uint8_t NullAlignment_toU8 ( NGS_ALIGNMENT* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static uint64_t NullAlignment_toU64 ( NGS_ALIGNMENT* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static int NullAlignment_boolToInt ( NGS_ALIGNMENT* self, ctx_t ctx, bool b )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static NGS_ALIGNMENT* NullAlignment_toAlignment ( NGS_ALIGNMENT* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return NULL;
+}
+
+static bool NullAlignment_noNext( NGS_ALIGNMENT* self, ctx_t ctx )
+{   /* trying to advance an empty iterator - not an error */
+    return false;
+}
+
+static char NullAlignment_RNAOrientation ( NGS_ALIGNMENT * self, ctx_t ctx )
+{
+    return '?';
+}
+
+static uint64_t NullAlignment_ReferencePositionProjectionRange ( NGS_ALIGNMENT * self, ctx_t ctx, int64_t ref_pos )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return -1 ^ (uint64_t)0xffffffff;
+}
+
+static NGS_Alignment_vt NullAlignment_vt_inst =
+{
+    {
+        {
+             /* NGS_Refcount */
+            NullAlignmentWhack
+        },
+
+        /* NGS_Fragment */
+        NullAlignment_FragmentToString,
+        NullAlignment_FragmentOffsetLenToString,
+        NullAlignment_FragmentOffsetLenToString,
+        NullAlignment_FragmentToBool,
+        NullAlignment_FragmentToBool,
+        NullAlignment_FragmentToBool
+    },
+
+    NullAlignment_toString,        /* getId                        */
+    NullAlignment_toString,        /* getReferenceSpec             */
+    NullAlignment_toInt,           /* getMappingQuality            */
+    NullAlignment_toU8,            /* getReadFilter                */
+    NullAlignment_toString,        /* getReferenceBases            */
+    NullAlignment_toString,        /* getReadGroup                 */
+    NullAlignment_toString,        /* getReadId                    */
+    NullAlignment_toString,        /* getClippedFragmentBases      */
+    NullAlignment_toString,        /* getClippedFragmentQualities  */
+    NullAlignment_toString,        /* getAlignedFragmentBases      */
+    NullAlignment_toBool,          /* isPrimary                    */
+    NullAlignment_toI64,           /* getAlignmentPosition         */
+    NullAlignment_ReferencePositionProjectionRange, /* getReferencePositionProjectionRange */
+    NullAlignment_toU64,           /* getAlignmentLength           */
+    NullAlignment_toBool,          /* getIsReversedOrientation     */
+    NullAlignment_boolToInt,       /* getSoftClip                  */
+    NullAlignment_toU64,           /* getTemplateLength            */
+    NullAlignment_boolToString,    /* getShortCigar                */
+    NullAlignment_boolToString,    /* getLongCigar                 */
+    NullAlignment_RNAOrientation,  /* getRNAOrientation            */
+    NullAlignment_toBool,          /* hasMate                      */
+    NullAlignment_toString,        /* getMateAlignmentId           */
+    NullAlignment_toAlignment,     /* getMateAlignment             */
+    NullAlignment_toString,        /* getMateReferenceSpec         */
+    NullAlignment_toBool,          /* getMateIsReversedOrientation */
+    NullAlignment_toBool,          /* isFirst                      */
+
+    /* Iterator */
+    NullAlignment_noNext           /* next                         */
+};
+
+struct NGS_Alignment * NGS_AlignmentMakeNull ( ctx_t ctx, char const * run_name, size_t run_name_size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    NGS_Alignment * ref;
+
+    assert ( run_name != NULL );
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating NullAlignment on '%.*s'", run_name_size, run_name );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname, sizeof instname, NULL, "%.*s(NULL)", run_name_size, run_name );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        TRY ( NGS_AlignmentInit ( ctx, ref, & NullAlignment_vt_inst, "NullAlignment", instname ) )
+        {
+            return ref;
+        }
+        free ( ref );
+    }
+
+    return NULL;
+}
+
+
diff --git a/libs/ngs/NGS_Alignment.h b/libs/ngs/NGS_Alignment.h
new file mode 100644
index 0000000..c06fd71
--- /dev/null
+++ b/libs/ngs/NGS_Alignment.h
@@ -0,0 +1,209 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_alignment_
+#define _h_ngs_alignment_
+
+typedef struct NGS_Alignment NGS_Alignment;
+#ifndef NGS_ALIGNMENT
+#define NGS_ALIGNMENT NGS_Alignment
+#endif
+
+#ifndef _h_ngs_fragment_
+#define NGS_FRAGMENT NGS_ALIGNMENT
+#include "NGS_Fragment.h"
+#endif
+
+#ifndef _h_insdc_sra_
+#include <insdc/sra.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+struct NGS_String;
+struct NGS_Fragment;
+struct NGS_Alignment_v1_vt;
+extern struct NGS_Alignment_v1_vt ITF_Alignment_vt;
+
+/*--------------------------------------------------------------------------
+ * NGS_Alignment
+ */
+
+enum NGS_AlignmentFilterBits
+{
+    NGS_AlignmentFilterBits_pass_bad            = 0x01,
+    NGS_AlignmentFilterBits_pass_dups           = 0x02,
+    NGS_AlignmentFilterBits_min_map_qual        = 0x04,
+    NGS_AlignmentFilterBits_max_map_qual        = 0x08,
+    NGS_AlignmentFilterBits_no_wraparound       = 0x10,
+    NGS_AlignmentFilterBits_start_within_window = 0x20,
+
+    NGS_AlignmentFilterBits_map_qual = NGS_AlignmentFilterBits_min_map_qual | NGS_AlignmentFilterBits_max_map_qual
+};
+
+ /* ToRefcount
+ *  inline cast that preserves const
+ */
+#define NGS_AlignmentToRefcount( self ) \
+    ( NGS_FragmentToRefcount ( & ( self ) -> dad ) )
+
+
+/* Release
+ *  release reference
+ */
+#define NGS_AlignmentRelease( self, ctx ) \
+    NGS_RefcountRelease ( NGS_AlignmentToRefcount ( self ), ctx )
+
+/* Duplicate
+ *  duplicate reference
+ */
+#define NGS_AlignmentDuplicate( self, ctx ) \
+    ( ( NGS_Alignment* ) NGS_RefcountDuplicate ( NGS_AlignmentToRefcount ( self ), ctx ) )
+
+
+struct NGS_String * NGS_AlignmentGetAlignmentId( NGS_Alignment* self, ctx_t ctx );
+
+struct NGS_String * NGS_AlignmentGetReferenceSpec( NGS_Alignment* self, ctx_t ctx );
+
+int NGS_AlignmentGetMappingQuality( NGS_Alignment* self, ctx_t ctx );
+
+INSDC_read_filter NGS_AlignmentGetReadFilter ( NGS_Alignment * self, ctx_t ctx );
+
+struct NGS_String* NGS_AlignmentGetReferenceBases( NGS_Alignment* self, ctx_t ctx );
+
+struct NGS_String* NGS_AlignmentGetReadGroup( NGS_Alignment* self, ctx_t ctx );
+
+struct NGS_String * NGS_AlignmentGetReadId( NGS_Alignment* self, ctx_t ctx );
+
+struct NGS_String* NGS_AlignmentGetClippedFragmentBases( NGS_Alignment* self, ctx_t ctx );
+
+struct NGS_String* NGS_AlignmentGetClippedFragmentQualities( NGS_Alignment* self, ctx_t ctx );
+
+struct NGS_String* NGS_AlignmentGetAlignedFragmentBases( NGS_Alignment* self, ctx_t ctx );
+
+bool NGS_AlignmentIsPrimary( NGS_Alignment* self, ctx_t ctx );
+
+int64_t NGS_AlignmentGetAlignmentPosition( NGS_Alignment* self, ctx_t ctx );
+
+uint64_t NGS_AlignmentGetReferencePositionProjectionRange( NGS_Alignment* self, ctx_t ctx, int64_t ref_pos );
+
+uint64_t NGS_AlignmentGetAlignmentLength( NGS_Alignment* self, ctx_t ctx );
+
+bool NGS_AlignmentGetIsReversedOrientation( NGS_Alignment* self, ctx_t ctx );
+
+int NGS_AlignmentGetSoftClip( NGS_Alignment* self, ctx_t ctx, bool left );
+
+uint64_t NGS_AlignmentGetTemplateLength( NGS_Alignment* self, ctx_t ctx );
+
+struct NGS_String* NGS_AlignmentGetShortCigar( NGS_Alignment* self, ctx_t ctx, bool clipped );
+
+struct NGS_String* NGS_AlignmentGetLongCigar( NGS_Alignment* self, ctx_t ctx, bool clipped );
+
+char NGS_AlignmentGetRNAOrientation( NGS_Alignment* self, ctx_t ctx );
+
+bool NGS_AlignmentHasMate ( NGS_Alignment* self, ctx_t ctx );
+
+struct NGS_String* NGS_AlignmentGetMateAlignmentId( NGS_Alignment* self, ctx_t ctx );
+
+NGS_Alignment* NGS_AlignmentGetMateAlignment( NGS_Alignment* self, ctx_t ctx );
+
+struct NGS_String* NGS_AlignmentGetMateReferenceSpec( NGS_Alignment* self, ctx_t ctx );
+
+bool NGS_AlignmentGetMateIsReversedOrientation( NGS_Alignment* self, ctx_t ctx );
+
+bool NGS_AlignmentIsFirst ( NGS_Alignment* self, ctx_t ctx );
+
+/*--------------------------------------------------------------------------
+ * NGS_AlignmentIterator
+ */
+
+bool NGS_AlignmentIteratorNext ( NGS_Alignment* self, ctx_t ctx );
+
+/*--------------------------------------------------------------------------
+ * implementation details
+ */
+struct NGS_Alignment
+{
+    NGS_Fragment dad;
+};
+
+typedef struct NGS_Alignment_vt NGS_Alignment_vt;
+struct NGS_Alignment_vt
+{
+    NGS_Fragment_vt dad;
+
+    /* Alignment */
+    struct NGS_String*      ( * getId )                         ( NGS_ALIGNMENT* self, ctx_t ctx );
+    struct NGS_String*      ( * getReferenceSpec )              ( NGS_ALIGNMENT* self, ctx_t ctx );
+    int                     ( * getMappingQuality )             ( NGS_ALIGNMENT* self, ctx_t ctx );
+    INSDC_read_filter       ( * getReadFilter )                 ( NGS_ALIGNMENT* self, ctx_t ctx );
+    struct NGS_String*      ( * getReferenceBases )             ( NGS_ALIGNMENT* self, ctx_t ctx );
+    struct NGS_String*      ( * getReadGroup )                  ( NGS_ALIGNMENT* self, ctx_t ctx );
+    struct NGS_String*      ( * getReadId )                     ( NGS_ALIGNMENT* self, ctx_t ctx );
+    struct NGS_String*      ( * getClippedFragmentBases )       ( NGS_ALIGNMENT* self, ctx_t ctx );
+    struct NGS_String*      ( * getClippedFragmentQualities )   ( NGS_ALIGNMENT* self, ctx_t ctx );
+    struct NGS_String*      ( * getAlignedFragmentBases )       ( NGS_ALIGNMENT* self, ctx_t ctx );
+    bool                    ( * isPrimary )                     ( NGS_ALIGNMENT* self, ctx_t ctx );
+    int64_t                 ( * getAlignmentPosition )          ( NGS_ALIGNMENT* self, ctx_t ctx );
+    uint64_t                ( * getReferencePositionProjectionRange )( NGS_ALIGNMENT* self, ctx_t ctx, int64_t ref_pos );
+    uint64_t                ( * getAlignmentLength )            ( NGS_ALIGNMENT* self, ctx_t ctx );
+    bool                    ( * getIsReversedOrientation )      ( NGS_ALIGNMENT* self, ctx_t ctx );
+    int                     ( * getSoftClip )                   ( NGS_ALIGNMENT* self, ctx_t ctx, bool left );
+    uint64_t                ( * getTemplateLength )             ( NGS_ALIGNMENT* self, ctx_t ctx );
+    struct NGS_String*      ( * getShortCigar )                 ( NGS_ALIGNMENT* self, ctx_t ctx, bool clipped );
+    struct NGS_String*      ( * getLongCigar )                  ( NGS_ALIGNMENT* self, ctx_t ctx, bool clipped );
+    char                    ( * getRNAOrientation )             ( NGS_ALIGNMENT* self, ctx_t ctx );
+    bool                    ( * hasMate )                       ( NGS_ALIGNMENT* self, ctx_t ctx );
+    struct NGS_String*      ( * getMateAlignmentId )            ( NGS_ALIGNMENT* self, ctx_t ctx );
+    NGS_ALIGNMENT*          ( * getMateAlignment )              ( NGS_ALIGNMENT* self, ctx_t ctx );
+    struct NGS_String*      ( * getMateReferenceSpec )          ( NGS_ALIGNMENT* self, ctx_t ctx );
+    bool                    ( * getMateIsReversedOrientation )  ( NGS_ALIGNMENT* self, ctx_t ctx );
+    bool                    ( * isFirst )                       ( NGS_ALIGNMENT* self, ctx_t ctx );
+
+    /* Iterator */
+    bool                    ( * next )                          ( NGS_ALIGNMENT* self, ctx_t ctx );
+};
+
+/* Init
+ */
+void NGS_AlignmentInit ( ctx_t ctx, NGS_ALIGNMENT * ref, const NGS_Alignment_vt *vt, const char *clsname, const char *instname );
+
+/* NullAlignment
+ * will error out on any call; can be used as an empty alignment iterator
+ */
+struct NGS_Alignment * NGS_AlignmentMakeNull ( ctx_t ctx, char const * run_name, size_t run_name_size );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_alignment_ */
diff --git a/libs/ngs/NGS_Cursor.c b/libs/ngs/NGS_Cursor.c
new file mode 100644
index 0000000..b8fdcef
--- /dev/null
+++ b/libs/ngs/NGS_Cursor.c
@@ -0,0 +1,611 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_Cursor.h"
+
+#include "NGS_String.h"
+#include <ngs/itf/Refcount.h>
+
+#include <sysalloc.h>
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <vdb/table.h>
+#include <vdb/database.h>
+
+#include <klib/rc.h>
+
+/*--------------------------------------------------------------------------
+ * NGS_Cursor
+ *  Shareable cursor with lazy adding of columns
+ *  reference counted
+ */
+
+struct NGS_Cursor
+{
+    NGS_Refcount dad;
+
+    VCursor* curs;
+
+    uint32_t num_cols;
+    char ** col_specs;      /* [num_cols] */
+    uint32_t* col_idx;      /* [num_cols] */
+    NGS_String ** col_data; /* [num_cols] */
+
+    /* row range */
+    int64_t first;
+    uint64_t count;
+};
+
+void NGS_CursorWhack ( NGS_Cursor * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcConstructing );
+
+    uint32_t i;
+
+    VCursorRelease ( self -> curs );
+
+    for ( i = 0; i < self -> num_cols; ++i )
+    {
+        free ( self -> col_specs [ i ] );
+        NGS_StringRelease ( self -> col_data [ i ], ctx );
+    }
+
+    free ( self -> col_specs );
+    free ( self -> col_data );
+
+    free ( self -> col_idx );
+}
+
+static NGS_Refcount_vt NGS_Cursor_vt =
+{
+    NGS_CursorWhack
+};
+
+/* Make
+ */
+const NGS_Cursor * NGS_CursorMake ( ctx_t ctx, const struct VTable* table, const char * col_specs[], uint32_t num_cols )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    NGS_Cursor* ref = calloc( 1, sizeof (*ref) );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating NGS_Cursor" );
+    else
+    {
+        TRY ( NGS_RefcountInit ( ctx, (NGS_Refcount*) & ref -> dad, & ITF_Refcount_vt . dad, & NGS_Cursor_vt, "NGS_Cursor", "" ) )
+        {
+            rc_t rc = VTableCreateCursorRead ( table, (const VCursor**) & ref -> curs );
+            if ( rc != 0 )
+            {
+                INTERNAL_ERROR ( xcCursorCreateFailed, "VTableCreateCursorRead rc = %R", rc );
+                NGS_CursorWhack ( ref, ctx );
+                free ( ref );
+                return NULL;
+            }
+
+            ref -> num_cols = num_cols;
+
+            /* make a copy of col specs */
+            ref -> col_specs = malloc ( num_cols * sizeof ( col_specs [ 0 ] ) );
+            if ( ref -> col_specs == NULL )
+            {
+                SYSTEM_ERROR ( xcNoMemory, "allocating NGS_Cursor . col_specs" );
+                NGS_CursorWhack ( ref, ctx );
+                free ( ref );
+                return NULL;
+            }
+
+            {
+                uint32_t i;
+                for ( i = 0; i < num_cols; ++i )
+                {
+                    ref -> col_specs [ i ] = string_dup ( col_specs [ i ], string_size ( col_specs [ i ] ) );
+                    if ( ref -> col_specs [ i ] == NULL )
+                    {
+                        SYSTEM_ERROR ( xcNoMemory, "populating NGS_Cursor . col_specs" );
+                        NGS_CursorWhack ( ref, ctx );
+                        free ( ref );
+                        return NULL;
+                    }
+                }
+            }
+
+            ref -> col_idx = calloc ( num_cols,  sizeof ( ref -> col_idx [ 0 ] ) );
+            if ( ref -> col_idx == NULL )
+            {
+                SYSTEM_ERROR ( xcNoMemory, "allocating NGS_Cursor . col_idx" );
+                NGS_CursorWhack ( ref, ctx );
+                free ( ref );
+                return NULL;
+            }
+
+            ref -> col_data = calloc ( num_cols,  sizeof ( ref -> col_data[ 0 ] ) );
+            if ( ref -> col_idx == NULL )
+            {
+                SYSTEM_ERROR ( xcNoMemory, "allocating NGS_Cursor . col_data" );
+                NGS_CursorWhack ( ref, ctx );
+                free ( ref );
+                return NULL;
+            }
+
+            {   /* add first column; leave other for lazy add */
+                const char * col_spec = col_specs [ 0 ];
+                rc_t rc = VCursorAddColumn ( ref -> curs, & ref -> col_idx [ 0 ], "%s", col_spec );
+                if ( rc != 0 )
+                {
+                    INTERNAL_ERROR ( xcColumnNotFound, "VCursorAddColumn %s rc = %R", col_spec, rc );
+                    NGS_CursorWhack ( ref, ctx );
+                    free ( ref );
+                    return NULL;
+                }
+
+                rc = VCursorPermitPostOpenAdd ( ref -> curs );
+                if ( rc != 0 )
+                {
+                    INTERNAL_ERROR ( xcCursorOpenFailed, "PostOpenAdd failed rc = %R", rc );
+                    NGS_CursorWhack ( ref, ctx );
+                    free ( ref );
+                    return NULL;
+                }
+
+                /* open cursor */
+                rc = VCursorOpen ( ref -> curs );
+                if ( rc != 0 )
+                {
+                    INTERNAL_ERROR ( xcCursorOpenFailed, "VCursorOpen failed rc = %R", rc );
+                    NGS_CursorWhack ( ref, ctx );
+                    free ( ref );
+                    return NULL;
+                }
+
+                rc = VCursorIdRange ( ref -> curs, 0, & ref -> first, & ref -> count );
+                if ( rc != 0 )
+                {
+                    INTERNAL_ERROR ( xcCursorOpenFailed, "VCursorIdRange failed rc = %R", rc );
+                    NGS_CursorWhack ( ref, ctx );
+                    free ( ref );
+                    return NULL;
+                }
+
+                return ref;
+            }
+        }
+    }
+
+    return NULL;
+}
+
+const NGS_Cursor* NGS_CursorMakeDb ( ctx_t ctx,
+                                     const VDatabase* db,
+                                     const NGS_String* run_name,
+                                     const char* tableName,
+                                     const char * col_specs[],
+                                     uint32_t num_cols )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcConstructing );
+
+    const VTable * table;
+    rc_t rc = VDatabaseOpenTableRead ( db, & table, "%s", tableName );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcTableOpenFailed, "%.*s.%s rc = %R", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ), tableName, rc );
+        return NULL;
+    }
+
+    {
+        const NGS_Cursor* ret = NGS_CursorMake ( ctx, table, col_specs, num_cols );
+        VTableRelease ( table );
+        return ret;
+    }
+}
+
+/* Release
+ *  release reference
+ */
+void NGS_CursorRelease ( const NGS_Cursor * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcDestroying );
+
+    if ( self != NULL )
+    {
+        NGS_RefcountRelease ( & self -> dad, ctx );
+    }
+}
+
+/* Duplicate
+ *  duplicate reference
+ */
+const NGS_Cursor * NGS_CursorDuplicate ( const NGS_Cursor * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcConstructing );
+
+    if ( self != NULL )
+    {
+        NGS_RefcountDuplicate( & self -> dad, ctx );
+    }
+    return ( NGS_Cursor* ) self;
+}
+
+static
+void
+AddColumn ( const NGS_Cursor *self, ctx_t ctx, uint32_t colIdx )
+{   /* lazy add */
+    if ( self -> col_idx [ colIdx ] == 0 )
+    {
+        const char * col_spec = self -> col_specs [ colIdx ];
+        rc_t rc = VCursorAddColumn ( self -> curs, & self -> col_idx [ colIdx ], "%s", col_spec );
+        if ( rc != 0 && GetRCState ( rc ) != rcExists )
+        {
+            INTERNAL_ERROR ( xcColumnNotFound, "VCursorAddColumn failed: '%s' rc = %R", col_spec, rc );
+        }
+    }
+}
+
+void NGS_CursorCellDataDirect ( const NGS_Cursor *self,
+                                ctx_t ctx,
+                                int64_t rowId,
+                                uint32_t colIdx,
+                                uint32_t *elem_bits,
+                                const void **base,
+                                uint32_t *boff,
+                                uint32_t *row_len )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    rc_t rc;
+
+    assert ( self != NULL );
+
+    TRY ( AddColumn ( self, ctx, colIdx ) )
+    {
+        rc = VCursorCellDataDirect ( self -> curs, rowId, self -> col_idx [ colIdx ], elem_bits, base, boff, row_len );
+        if ( rc != 0 )
+        {
+            INTERNAL_ERROR ( xcColumnNotFound, "VCursorCellDataDirect failed: '%s' [%ld] rc = %R", self -> col_specs [ colIdx ], rowId, rc );
+        }
+    }
+}
+
+/* GetRowCount
+ */
+uint64_t NGS_CursorGetRowCount ( const NGS_Cursor * self, ctx_t ctx )
+{
+    assert ( self != NULL );
+
+    return self -> count;
+}
+
+/* GetRowRange
+ */
+void NGS_CursorGetRowRange ( const NGS_Cursor * self, ctx_t ctx, int64_t* first, uint64_t* count )
+{
+    assert ( self != NULL );
+    assert ( first != NULL );
+    assert ( count != NULL );
+
+    *first = self -> first;
+    *count = self -> count;
+}
+
+NGS_String * NGS_CursorGetString ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    assert ( self -> col_data );
+    assert ( self -> curs );
+
+    /* invalidate any outstanding string */
+    NGS_StringInvalidate ( self -> col_data [ colIdx ], ctx );
+
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        TRY ( NGS_CursorCellDataDirect ( self, ctx, rowId, colIdx, & elem_bits, & base, & boff, & row_len ) )
+        {
+            NGS_String * new_data;
+
+            assert ( elem_bits == 8 );
+            assert ( boff == 0 );
+
+            /* create new string */
+            TRY ( new_data = NGS_StringMake ( ctx, base, row_len ) )
+            {
+                NGS_StringRelease ( self -> col_data [ colIdx ], ctx );
+                self -> col_data [ colIdx ] = new_data;
+                return NGS_StringDuplicate ( self -> col_data [ colIdx ], ctx );
+            }
+        }
+    }
+    return NULL;
+}
+
+/* GetInt64
+*/
+int64_t NGS_CursorGetInt64 ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    assert ( self -> col_data );
+    assert ( self -> col_idx );
+
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        TRY ( NGS_CursorCellDataDirect ( self, ctx, rowId, colIdx, & elem_bits, & base, & boff, & row_len ) )
+        {
+            if ( base == 0 || row_len == 0 )
+                INTERNAL_ERROR ( xcColumnReadFailed, "cell value is missing" );
+            else
+            {
+                assert ( elem_bits == 64 || elem_bits == 32 );
+                assert ( boff == 0 );
+
+                if ( elem_bits == 64 )
+                    return *(int64_t*)base;
+                else
+                    return *(int32_t*)base;
+            }
+        }
+    }
+
+    return 0;
+}
+
+/* GetUInt64
+*/
+uint64_t NGS_CursorGetUInt64 ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    assert ( self -> col_data );
+    assert ( self -> col_idx );
+
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        TRY ( NGS_CursorCellDataDirect ( self, ctx, rowId, colIdx, & elem_bits, & base, & boff, & row_len ) )
+        {
+            if ( base == 0 || row_len == 0 )
+                INTERNAL_ERROR ( xcColumnReadFailed, "cell value is missing" );
+            else
+            {
+                assert ( elem_bits == 64 || elem_bits == 32 );
+                assert ( boff == 0 );
+
+                if ( elem_bits == 64 )
+                    return *(uint64_t*)base;
+                else
+                    return *(uint32_t*)base;
+            }
+        }
+    }
+
+    return 0;
+}
+
+
+/* GetInt32
+*/
+int32_t NGS_CursorGetInt32 ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    assert ( self -> col_data );
+    assert ( self -> col_idx );
+
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        TRY ( NGS_CursorCellDataDirect ( self, ctx, rowId, colIdx, & elem_bits, & base, & boff, & row_len ) )
+        {
+            if ( base == 0 || row_len == 0 )
+                INTERNAL_ERROR ( xcColumnReadFailed, "cell value is missing" );
+            else
+            {
+                assert ( elem_bits == 32 );
+                assert ( boff == 0 );
+
+                return *(int32_t*)base;
+            }
+        }
+    }
+
+    return 0;
+}
+
+/* GetUInt32
+*/
+uint32_t NGS_CursorGetUInt32 ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    assert ( self -> col_data );
+    assert ( self -> col_idx );
+
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        TRY ( NGS_CursorCellDataDirect ( self, ctx, rowId, colIdx, & elem_bits, & base, & boff, & row_len ) )
+        {
+            if ( base == 0 || row_len == 0 )
+                INTERNAL_ERROR ( xcColumnReadFailed, "cell value is missing" );
+            else
+            {
+                assert ( elem_bits == 32 );
+                assert ( boff == 0 );
+
+                return *(uint32_t*)base;
+            }
+        }
+    }
+
+    return 0;
+}
+
+/* GetBool
+*/
+bool NGS_CursorGetBool ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    assert ( self -> col_data );
+    assert ( self -> col_idx );
+
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        TRY ( NGS_CursorCellDataDirect ( self, ctx, rowId, colIdx, & elem_bits, & base, & boff, & row_len ) )
+        {
+            if ( base == 0 || row_len == 0 )
+                INTERNAL_ERROR ( xcColumnReadFailed, "cell value is missing" );
+            else
+            {
+                assert ( elem_bits == 8 );
+                assert ( boff == 0 );
+
+                return *(bool*)base;
+            }
+        }
+    }
+
+    return false;
+}
+
+/* GetChar
+*/
+char NGS_CursorGetChar ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    assert ( self -> col_data );
+    assert ( self -> col_idx );
+
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        TRY ( NGS_CursorCellDataDirect ( self, ctx, rowId, colIdx, & elem_bits, & base, & boff, & row_len ) )
+        {
+            if ( base == 0 || row_len == 0 )
+                INTERNAL_ERROR ( xcColumnReadFailed, "cell value is missing" );
+            else
+            {
+                assert ( elem_bits == 8 );
+                assert ( boff == 0 );
+
+                return *(char*)base;
+            }
+        }
+    }
+
+    return '?';
+}
+
+
+/* GetTable
+ */
+const VTable* NGS_CursorGetTable ( const NGS_Cursor * self, ctx_t ctx )
+{
+    assert ( self );
+	{
+		const VTable* tbl;
+		rc_t rc = VCursorOpenParentRead( self -> curs, &tbl );
+		if ( rc == 0 )
+		{
+			return tbl;
+		}
+		INTERNAL_ERROR ( xcCursorAccessFailed, "VCursorOpenParentRead rc = %R", rc );
+		return NULL;
+	}
+}
+
+/* GetVCursor
+ */
+const VCursor* NGS_CursorGetVCursor ( const NGS_Cursor * self )
+{
+    assert ( self );
+    return self -> curs;
+}
+
+uint32_t NGS_CursorGetColumnIndex ( const NGS_Cursor * self, ctx_t ctx, uint32_t column_id )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    ON_FAIL ( AddColumn ( self, ctx, column_id ) )
+    {
+        return 0;
+    }
+    return self -> col_idx [ column_id ];
+}
+
+/* GetVBlob
+ */
+const struct VBlob* NGS_CursorGetVBlob ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t column_id )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    rc_t rc = VCursorSetRowId ( self -> curs, rowId );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "VCursorSetRowId() rc = %R", rc );
+    }
+    else
+    {
+        rc = VCursorOpenRow ( self -> curs );
+        if ( rc != 0 )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "VCursorOpenRow() rc = %R", rc );
+        }
+        else
+        {
+            const struct VBlob* ret;
+            rc = VCursorGetBlob ( self -> curs, & ret, NGS_CursorGetColumnIndex ( self, ctx, column_id ) );
+            if ( rc != 0 || FAILED () )
+            {
+                VCursorCloseRow ( self -> curs );
+                INTERNAL_ERROR ( xcUnexpected, "VCursorGetBlob(READ) rc = %R", rc );
+            }
+            else
+            {
+                VCursorCloseRow ( self -> curs );
+                return ret;
+            }
+        }
+    }
+    return NULL;
+}
diff --git a/libs/ngs/NGS_Cursor.h b/libs/ngs/NGS_Cursor.h
new file mode 100644
index 0000000..0e3ba32
--- /dev/null
+++ b/libs/ngs/NGS_Cursor.h
@@ -0,0 +1,140 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_cursor_
+#define _h_ngs_cursor_
+
+typedef struct NGS_Cursor NGS_Cursor;
+#ifndef _h_ngs_refcount_
+#define NGS_REFCOUNT NGS_Cursor
+#include "NGS_Refcount.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct VDatabase;
+struct VTable;
+struct VCursor;
+struct VBlob;
+struct NGS_String;
+
+/*--------------------------------------------------------------------------
+ * NGS_Cursor
+ *  Shareable cursor with lazy adding of columns
+ *  reference counted
+ */
+
+/* Make
+ */
+const NGS_Cursor* NGS_CursorMake ( ctx_t ctx, const struct VTable* table, const char * col_specs[], uint32_t num_cols );
+const NGS_Cursor* NGS_CursorMakeDb ( ctx_t ctx,
+                                     const struct VDatabase* db,
+                                     const struct NGS_String* run_name,
+                                     const char* tableName,
+                                     const char * col_specs[],
+                                     uint32_t num_cols );
+
+/* Release
+ *  release reference
+ */
+void NGS_CursorRelease ( const NGS_Cursor * self, ctx_t ctx );
+
+/* Duplicate
+ *  duplicate reference
+ */
+const NGS_Cursor * NGS_CursorDuplicate ( const NGS_Cursor * self, ctx_t ctx );
+
+/* CellDataDirect
+ * Adds requested column if necessary and calls VCursorCellDataDirect
+*/
+void NGS_CursorCellDataDirect ( const NGS_Cursor *self,
+                                ctx_t ctx,
+                                int64_t rowId,
+                                uint32_t colIdx,
+                                uint32_t *elem_bits,
+                                const void **base,
+                                uint32_t *boff,
+                                uint32_t *row_len );
+
+/* GetString
+*/
+struct NGS_String * NGS_CursorGetString ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx );
+
+/* GetInt64
+*/
+int64_t NGS_CursorGetInt64 ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx );
+
+/* GetUInt64
+*/
+uint64_t NGS_CursorGetUInt64 ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx );
+
+/* GetInt32
+*/
+int32_t NGS_CursorGetInt32 ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx );
+
+/* GetUInt32
+*/
+uint32_t NGS_CursorGetUInt32 ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx );
+
+/* GetBool
+*/
+bool NGS_CursorGetBool ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx );
+
+/* GetChar
+*/
+char NGS_CursorGetChar ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t colIdx );
+
+/* GetRowCount
+ */
+uint64_t NGS_CursorGetRowCount ( const NGS_Cursor * self, ctx_t ctx );
+
+/* GetRowRange
+ */
+void NGS_CursorGetRowRange ( const NGS_Cursor * self, ctx_t ctx, int64_t* first, uint64_t* count );
+
+/* GetTable
+ */
+const struct VTable* NGS_CursorGetTable ( const NGS_Cursor * self, ctx_t ctx );
+
+/* GetVCursor
+ */
+const struct VCursor* NGS_CursorGetVCursor ( const NGS_Cursor * self );
+
+/* GetColumnIndex
+ */
+uint32_t NGS_CursorGetColumnIndex ( const NGS_Cursor * self, ctx_t ctx, uint32_t column_id );
+
+/* GetVBlob
+ */
+const struct VBlob* NGS_CursorGetVBlob ( const NGS_Cursor * self, ctx_t ctx, int64_t rowId, uint32_t column_id );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_cursor_ */
diff --git a/libs/ngs/NGS_ErrBlock.c b/libs/ngs/NGS_ErrBlock.c
new file mode 100644
index 0000000..eeaa47b
--- /dev/null
+++ b/libs/ngs/NGS_ErrBlock.c
@@ -0,0 +1,57 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/ErrBlock.h>
+
+#define SRC_LOC_DEFINED 1
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <klib/text.h>
+
+#include <string.h>
+
+/*--------------------------------------------------------------------------
+ * NGS_ErrBlock
+ */
+void NGS_ErrBlockThrow ( struct NGS_ErrBlock_v1 * self, ctx_t ctx )
+{
+    if ( FAILED () )
+    {
+        size_t size;
+
+        /* need to detect error type at some point... */
+        self -> xtype = xt_error_msg;
+
+        /* copy the message, up to max size */
+        size = string_copy_measure ( self -> msg, sizeof self -> msg, WHAT () );
+        if ( size >= sizeof self -> msg )
+            strcpy ( & self -> msg [ sizeof self -> msg - 4 ], "..." );
+
+        CLEAR ();
+    }
+}
diff --git a/libs/ngs/NGS_ErrBlock.h b/libs/ngs/NGS_ErrBlock.h
new file mode 100644
index 0000000..ef413e7
--- /dev/null
+++ b/libs/ngs/NGS_ErrBlock.h
@@ -0,0 +1,53 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_err_block_
+#define _h_ngs_err_block_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_ErrBlock_v1;
+
+/*--------------------------------------------------------------------------
+ * NGS_ErrBlock
+ */
+void NGS_ErrBlockThrow ( struct NGS_ErrBlock_v1 * self, ctx_t ctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_err_block_ */
diff --git a/libs/ngs/NGS_Fragment.c b/libs/ngs/NGS_Fragment.c
new file mode 100644
index 0000000..2bf0d99
--- /dev/null
+++ b/libs/ngs/NGS_Fragment.c
@@ -0,0 +1,286 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_Fragment.h"
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/Refcount.h>
+#include <ngs/itf/FragmentItf.h>
+ 
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <kfc/rc.h>
+
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * NGS_Fragment_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_Fragment* ) ( obj ) )
+    
+static    
+NGS_String_v1 * ITF_Fragment_v1_get_id ( const NGS_Fragment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_FragmentGetId ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static    
+NGS_String_v1 * ITF_Fragment_v1_get_bases ( const NGS_Fragment_v1 * self, NGS_ErrBlock_v1 * err, uint64_t offset, uint64_t length )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_FragmentGetSequence ( Self ( self ), ctx, offset, length ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static    
+NGS_String_v1 * ITF_Fragment_v1_get_quals ( const NGS_Fragment_v1 * self, NGS_ErrBlock_v1 * err, uint64_t offset, uint64_t length )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_FragmentGetQualities ( Self ( self ), ctx, offset, length ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static    
+bool ITF_Fragment_v1_is_paired ( const NGS_Fragment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_FragmentIsPaired ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static    
+bool ITF_Fragment_v1_is_aligned ( const NGS_Fragment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_FragmentIsAligned ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static    
+bool ITF_Fragment_v1_next ( NGS_Fragment_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_FragmentIteratorNext ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+#undef Self
+
+NGS_Fragment_v1_vt ITF_Fragment_vt =
+{
+    {
+        "NGS_Fragment",
+        "NGS_Fragment_v1",
+        1,
+        & ITF_Refcount_vt . dad
+    },
+
+    ITF_Fragment_v1_get_id,
+    ITF_Fragment_v1_get_bases,
+    ITF_Fragment_v1_get_quals,
+    ITF_Fragment_v1_next,
+    ITF_Fragment_v1_is_paired,
+    ITF_Fragment_v1_is_aligned
+};
+
+
+/*--------------------------------------------------------------------------
+ * NGS_Fragment
+ */
+
+#define VT( self, msg ) \
+    ( ( ( const NGS_Fragment_vt* ) ( self ) -> dad . vt ) -> msg )
+
+
+/* GetId
+ *  returns an unique id within the context of the entire ReadCollection
+ */
+struct NGS_String * NGS_FragmentGetId ( NGS_Fragment* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcRow, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get id" );
+    }
+    else
+    {
+        return VT ( self, get_id ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+
+/* GetSequence
+ *  read the Fragment sequence
+ *  offset is zero based
+ *  size is limited to bases available
+ */
+struct NGS_String * NGS_FragmentGetSequence ( NGS_Fragment * self, ctx_t ctx, uint64_t offset, uint64_t length )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcRow, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get sequence" );
+    }
+    else
+    {
+        return VT ( self, get_sequence ) ( self, ctx, offset, length );
+    }
+
+    return NULL;
+}
+
+
+/* GetQualities
+ *  read the Fragment qualities as phred-33
+ *  offset is zero based
+ *  size is limited to qualities available
+ */
+struct NGS_String * NGS_FragmentGetQualities ( NGS_Fragment * self, ctx_t ctx, uint64_t offset, uint64_t length )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcRow, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get qualities" );
+    }
+    else
+    {
+        return VT ( self, get_qualities ) ( self, ctx, offset, length );
+    }
+
+    return NULL;
+}
+
+
+/* IsPaired
+ */
+bool NGS_FragmentIsPaired ( NGS_Fragment * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcRow, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to test alignment" );
+    }
+    else
+    {
+        return VT ( self, is_paired ) ( self, ctx );
+    }
+
+    return false;
+}
+
+
+/* IsAligned
+ */
+bool NGS_FragmentIsAligned ( NGS_Fragment * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcRow, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to test alignment" );
+    }
+    else
+    {
+        return VT ( self, is_aligned ) ( self, ctx );
+    }
+
+    return false;
+}
+
+
+/* Next
+ *  advance to next Fragment
+ *  returns false if no more Fragments are available.
+ *  throws exception if more Fragments should be available,
+ *  but could not be accessed.
+ */
+bool NGS_FragmentIteratorNext ( NGS_Fragment * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcRow, rcSelecting );
+        INTERNAL_ERROR ( xcSelfNull, "failed to advance to next Fragment" );
+    }
+    else
+    {
+        return VT ( self, next ) ( self, ctx );
+    }
+
+    return false;
+}
+
+
+/* Init
+ */
+void NGS_FragmentInit ( ctx_t ctx, NGS_Fragment * frag, const NGS_VTable * ivt, 
+    const NGS_Fragment_vt * vt, const char *clsname, const char *instname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcRow, rcConstructing );
+
+    TRY ( NGS_RefcountInit ( ctx, & frag -> dad, ivt, & vt -> dad, clsname, instname ) )
+    {
+        assert ( vt -> get_id != NULL );
+        assert ( vt -> get_sequence != NULL );
+        assert ( vt -> get_qualities != NULL );
+    }
+}
diff --git a/libs/ngs/NGS_Fragment.h b/libs/ngs/NGS_Fragment.h
new file mode 100644
index 0000000..4a0c0ab
--- /dev/null
+++ b/libs/ngs/NGS_Fragment.h
@@ -0,0 +1,175 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_fragment_
+#define _h_ngs_fragment_
+
+#ifndef _h_ngs_extern_
+#include "extern.h"
+#endif
+
+typedef struct NGS_Fragment NGS_Fragment;
+#ifndef NGS_FRAGMENT
+#define NGS_FRAGMENT NGS_Fragment
+#endif
+
+#ifndef _h_ngs_refcount_
+#define NGS_REFCOUNT NGS_FRAGMENT
+#include "NGS_Refcount.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_String;
+struct NGS_Read;
+struct NGS_Fragment_v1_vt;
+extern struct NGS_Fragment_v1_vt ITF_Fragment_vt;
+
+
+/*--------------------------------------------------------------------------
+ * NGS_Fragment
+ */
+
+
+/* ToRefcount
+ *  inline cast that preserves const
+ */
+#define NGS_FragmentToRefcount( self ) \
+    ( & ( self ) -> dad )
+
+
+#if 0
+
+/* Release
+ *  release reference
+ */
+#define NGS_FragmentRelease( self, ctx ) \
+    NGS_RefcountRelease ( NGS_FragmentToRefcount ( self ), ctx )
+
+/* Duplicate
+ *  duplicate reference
+ */
+#define NGS_FragmentDuplicate( self, ctx ) \
+    ( ( NGS_Fragment* ) NGS_RefcountDuplicate ( NGS_FragmentToRefcount ( self ), ctx ) )
+
+#endif
+
+
+/* GetId
+ *  returns an unique id within the context of the entire ReadCollection
+ */
+NGS_EXTERN struct NGS_String * CC NGS_FragmentGetId ( NGS_Fragment* self, ctx_t ctx );
+
+
+/* GetSequence
+ *  read the Fragment sequence
+ *  offset is zero based
+ *  size is limited to bases available
+ */
+struct NGS_String * NGS_FragmentGetSequence ( NGS_Fragment * self, ctx_t ctx, uint64_t offset, uint64_t length );
+
+
+/* GetQualities
+ *  read the Fragment qualities as phred-33
+ *  offset is zero based
+ *  size is limited to qualities available
+ */
+struct NGS_String * NGS_FragmentGetQualities ( NGS_Fragment * self, ctx_t ctx, uint64_t offset, uint64_t length );
+
+
+/* IsPaired
+ */
+bool NGS_FragmentIsPaired ( NGS_Fragment * self, ctx_t ctx );
+
+
+/* IsAligned
+ */
+bool NGS_FragmentIsAligned ( NGS_Fragment * self, ctx_t ctx );
+
+
+/* Make [ OBSOLETE ]
+ *  make a stand-alone Fragment from Read
+ */
+NGS_Fragment * NGS_ReadFragmentMake ( ctx_t ctx, struct NGS_Read const* read , uint32_t idx );
+
+
+
+/*--------------------------------------------------------------------------
+ * NGS_FragmentIterator
+ */
+
+/* Next
+ *  advance to the next Fragment
+ *  for a Read, this is the next biological Fragment of the Read
+ *  for any other iterator, simply returns the next Fragment
+ */
+bool NGS_FragmentIteratorNext ( NGS_Fragment * self, ctx_t ctx );
+
+
+/*--------------------------------------------------------------------------
+ * implementation details
+ */
+struct NGS_Fragment
+{
+    NGS_Refcount dad;
+};
+
+typedef struct NGS_Fragment_vt NGS_Fragment_vt;
+struct NGS_Fragment_vt
+{
+    NGS_Refcount_vt dad;
+
+    /* Fragment interface */
+    struct NGS_String * ( * get_id ) ( NGS_FRAGMENT * self, ctx_t ctx );
+    struct NGS_String * ( * get_sequence ) ( NGS_FRAGMENT * self, ctx_t ctx, uint64_t offset, uint64_t length );
+    struct NGS_String * ( * get_qualities ) ( NGS_FRAGMENT * self, ctx_t ctx, uint64_t offset, uint64_t length );
+    bool ( * is_paired ) ( NGS_FRAGMENT * self, ctx_t ctx );
+    bool ( * is_aligned ) ( NGS_FRAGMENT * self, ctx_t ctx );
+
+    /* FragmentIterator interface */
+    bool ( * next ) ( NGS_FRAGMENT * self, ctx_t ctx );
+};
+
+/* Init
+ */
+void NGS_FragmentInit ( ctx_t ctx, NGS_Fragment * frag, const struct NGS_VTable * ivt, const NGS_Fragment_vt * vt, const char *clsname, const char *instname );
+
+/* Whack
+ *  needed to release the ReadCollection
+ */
+void NGS_FragmentWhack ( NGS_Fragment * self, ctx_t ctx );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_fragment_ */
diff --git a/libs/ngs/NGS_FragmentBlob.c b/libs/ngs/NGS_FragmentBlob.c
new file mode 100644
index 0000000..43ec0e7
--- /dev/null
+++ b/libs/ngs/NGS_FragmentBlob.c
@@ -0,0 +1,414 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_FragmentBlob.h"
+
+#include <ngs/itf/Refcount.h>
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <klib/rc.h>
+
+#include <vdb/cursor.h>
+#include <vdb/blob.h>
+#include <../libs/vdb/blob-priv.h>
+#include <../libs/vdb/page-map.h>
+
+#include "NGS_String.h"
+#include "NGS_Id.h"
+#include "NGS_Cursor.h"
+#include "SRA_Read.h"
+#include "VByteBlob.h"
+
+struct NGS_FragmentBlob
+{
+    NGS_Refcount dad;
+
+    int64_t rowId;      /* rowId of the first row in the blob (can differ from the first row of VBlob) */
+    const void* data;   /* start of the first row */
+    uint64_t size;      /* from the start of the first row until the end of the blob */
+
+    const NGS_String* run;
+    const NGS_Cursor* curs;
+    const VBlob* blob_READ;
+    const VBlob* blob_READ_LEN;
+    const VBlob* blob_READ_TYPE;
+};
+
+
+void
+NGS_FragmentBlobWhack ( NGS_FragmentBlob * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcDestroying );
+    if ( self != NULL )
+    {
+        VBlobRelease ( (VBlob*) self -> blob_READ );
+        VBlobRelease ( (VBlob*) self -> blob_READ_LEN );
+        VBlobRelease ( (VBlob*) self -> blob_READ_TYPE );
+        NGS_CursorRelease ( self -> curs, ctx );
+        NGS_StringRelease ( self -> run, ctx );
+    }
+}
+
+static NGS_Refcount_vt NGS_FragmentBlob_vt =
+{
+    NGS_FragmentBlobWhack
+};
+
+NGS_FragmentBlob *
+NGS_FragmentBlobMake ( ctx_t ctx, const NGS_String* run, const struct NGS_Cursor* curs, int64_t rowId )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcConstructing );
+    if ( run == NULL )
+    {
+        INTERNAL_ERROR ( xcParamNull, "NULL run name" );
+    }
+    else if ( curs == NULL )
+    {
+        INTERNAL_ERROR ( xcParamNull, "NULL cursor object" );
+    }
+    else
+    {
+
+        NGS_FragmentBlob * ret = calloc ( 1, sizeof * ret );
+        if ( ret == NULL )
+        {
+            SYSTEM_ERROR ( xcNoMemory, "allocating NGS_FragmentBlob" );
+        }
+        else
+        {
+            TRY ( NGS_RefcountInit ( ctx, & ret -> dad, & ITF_Refcount_vt . dad, & NGS_FragmentBlob_vt, "NGS_FragmentBlob", "" ) )
+            {
+                TRY ( ret -> run = NGS_StringDuplicate ( run, ctx ) )
+                {
+                    TRY ( ret -> blob_READ = NGS_CursorGetVBlob ( curs, ctx, rowId, seq_READ ) )
+                    {
+                        TRY ( ret -> blob_READ_LEN = NGS_CursorGetVBlob ( curs, ctx, rowId, seq_READ_LEN ) )
+                        {
+                            TRY ( ret -> blob_READ_TYPE = NGS_CursorGetVBlob ( curs, ctx, rowId, seq_READ_TYPE ) );
+                            {
+                                ret -> rowId = rowId;
+                                ret -> curs = NGS_CursorDuplicate ( curs, ctx );
+                                TRY ( VByteBlob_ContiguousChunk ( ret -> blob_READ, ctx, ret -> rowId, &ret -> data, &ret -> size, false ) )
+                                {
+                                    return ret;
+                                }
+                            }
+                        }
+                    }
+                }
+                NGS_FragmentBlobWhack ( ret, ctx );
+            }
+            free ( ret );
+        }
+    }
+
+    return NULL;
+}
+
+void
+NGS_FragmentBlobRelease ( struct NGS_FragmentBlob * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcAccessing );
+    if ( self != NULL )
+    {
+        NGS_RefcountRelease ( & self -> dad, ctx );
+    }
+}
+
+NGS_FragmentBlob *
+NGS_FragmentBlobDuplicate (  struct NGS_FragmentBlob * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcAccessing );
+    if ( self != NULL )
+    {
+        NGS_RefcountDuplicate ( & self -> dad, ctx );
+    }
+    return self;
+}
+
+void
+NGS_FragmentBlobRowRange ( const struct NGS_FragmentBlob * self, ctx_t ctx,  int64_t* p_first, uint64_t* p_count )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcAccessing );
+
+    if ( self == NULL )
+    {
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    }
+    else
+    {
+        int64_t first;
+        uint64_t count;
+        rc_t rc = VBlobIdRange ( self -> blob_READ, & first, & count );
+        if ( rc != 0  )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "VBlobIdRange() rc = %R", rc );
+        }
+        /* 1st row of VBlob may differ from our first row */
+        assert ( first <= self -> rowId );
+        if ( p_first != NULL )
+        {
+            *p_first = self -> rowId;
+        }
+        if ( p_count != NULL )
+        {
+            *p_count = count - ( self -> rowId - first );
+        }
+    }
+}
+
+const void*
+NGS_FragmentBlobData ( const struct NGS_FragmentBlob * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcAccessing );
+
+    if ( self == NULL )
+    {
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    }
+    else
+    {
+        return self -> data;
+    }
+    return 0;
+}
+
+uint64_t
+NGS_FragmentBlobSize ( const struct NGS_FragmentBlob * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcAccessing );
+
+    if ( self == NULL )
+    {
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    }
+    else
+    {
+        return self -> size;
+    }
+    return 0;
+}
+
+static
+void
+GetFragInfo ( const NGS_FragmentBlob * self, ctx_t ctx, int64_t p_rowId, uint64_t p_offsetInRow, uint64_t* fragStart, uint64_t* baseCount, int32_t* bioNumber )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcConstructing );
+    uint32_t elem_bits;
+    const void *base;
+    uint32_t boff;
+    uint32_t row_len;
+    rc_t rc = VBlobCellData ( self -> blob_READ_LEN,
+                              p_rowId,
+                              & elem_bits,
+                              & base,
+                              & boff,
+                              & row_len );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "VBlobCellData() rc = %R", rc );
+    }
+    else
+    {
+        uint32_t i = 0 ;
+        uint64_t offset = 0;
+        uint32_t bioFragNum = 0;
+        assert ( base != NULL );
+        assert ( elem_bits % 8 == 0 );
+        assert ( boff == 0 );
+
+        while ( i < row_len )
+        {
+            uint64_t frag_length;
+            switch ( elem_bits )
+            {
+                case 64:
+                {
+                    frag_length = ( (const uint64_t*)base ) [ i ];
+                    break;
+                }
+                case 32:
+                {
+                    frag_length = ( (const uint32_t*)base ) [ i ];
+                    break;
+                }
+                case 16:
+                {
+                    frag_length = ( (const uint16_t*)base ) [ i ];
+                    break;
+                }
+                case 8:
+                {
+                    frag_length = ( (const uint8_t*)base ) [ i ];
+                    break;
+                }
+                default:
+                {
+                    INTERNAL_ERROR ( xcUnexpected, "Unexpected elem_bits: %u", elem_bits );
+                    return;
+                }
+            }
+
+            {
+                uint32_t frag_type_elem_bits;
+                const void *frag_type_base;
+                uint32_t frag_type_boff;
+                uint32_t frag_type_row_len;
+                rc = VBlobCellData ( self -> blob_READ_TYPE,
+                                     p_rowId,
+                                     & frag_type_elem_bits,
+                                     & frag_type_base,
+                                     & frag_type_boff,
+                                     & frag_type_row_len );
+                if ( rc != 0 )
+                {
+                    INTERNAL_ERROR ( xcUnexpected, "VBlobCellData() rc = %R", rc );
+                }
+                else
+                {
+                    const uint8_t* frag_types = (const uint8_t*)frag_type_base;
+                    bool isBiological;
+                    assert ( frag_type_row_len == row_len );
+                    assert ( frag_type_base != NULL );
+                    assert ( frag_type_elem_bits == 8 );
+                    assert ( frag_type_boff == 0 );
+
+                    isBiological = frag_types [ i ] & READ_TYPE_BIOLOGICAL;
+                    if ( p_offsetInRow < offset + frag_length )
+                    {
+                        if ( fragStart != NULL )
+                        {
+                            * fragStart = offset;
+                        }
+                        if ( baseCount != NULL )
+                        {
+                            * baseCount = frag_length;
+                        }
+                        if ( bioNumber != NULL )
+                        {
+                            * bioNumber = isBiological ? bioFragNum : -1;
+                        }
+                        return;
+                    }
+
+                    if ( isBiological )
+                    {
+                        ++ bioFragNum;
+                    }
+                }
+            }
+            offset += frag_length;
+            ++i;
+        }
+        /* out of fragments */
+        INTERNAL_ERROR ( xcUnexpected, "fragment not found in blob: rowId=%li offset=%lu", p_rowId, p_offsetInRow );
+    }
+}
+
+void
+NGS_FragmentBlobInfoByOffset ( const struct NGS_FragmentBlob * self, ctx_t ctx,  uint64_t offsetInBases, int64_t* rowId, uint64_t* fragStart, uint64_t* baseCount, int32_t* bioNumber )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcAccessing );
+    if ( self == NULL )
+    {
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    }
+    else
+    {
+        int64_t first;
+        uint64_t count;
+        rc_t rc = VBlobIdRange ( self -> blob_READ, &first, &count );
+        if ( rc != 0  )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "VBlobIdRange() rc = %R", rc );
+        }
+        else
+        {
+            PageMapIterator pmIt;
+            rc = PageMapNewIterator ( (const PageMap*)self->blob_READ->pm, &pmIt, 0, count );
+            if ( rc != 0 )
+            {
+                INTERNAL_ERROR ( xcUnexpected, "PageMapNewIterator() rc = %R", rc );
+            }
+            else
+            {
+                row_count_t rowInBlob = 0;
+                do
+                {
+                    elem_count_t length = PageMapIteratorDataLength ( &pmIt );
+                    elem_count_t offset = PageMapIteratorDataOffset ( &pmIt );
+                    row_count_t  repeat = PageMapIteratorRepeatCount ( &pmIt );
+/*TODO: with the updated design:
+                    assert ( repeat == 1 );
+ */
+                    if ( offsetInBases < offset + length * repeat )
+                    {
+                        while ( repeat > 1 )
+                        {
+                            if ( offsetInBases < offset + length )
+                            {
+                                break;
+                            }
+                            offset += length;
+                            ++rowInBlob;
+                        }
+                        if ( rowId != NULL )
+                        {
+                            * rowId = first + rowInBlob + ( offsetInBases - offset ) / length;
+                        }
+                        GetFragInfo ( self, ctx, *rowId, offsetInBases - offset, fragStart, baseCount, bioNumber );
+                        if ( fragStart != NULL )
+                        {
+                            * fragStart += offset;
+                        }
+                        break;
+                    }
+                    ++rowInBlob;
+                }
+                while ( PageMapIteratorNext ( &pmIt ) );
+            }
+        }
+    }
+}
+
+NGS_String*
+NGS_FragmentBlobMakeFragmentId ( const struct NGS_FragmentBlob * self, ctx_t ctx, int64_t rowId, uint32_t fragNumber )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcAccessing );
+
+    if ( self == NULL )
+    {
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    }
+    else
+    {
+        return NGS_IdMakeFragment ( ctx, self -> run, false, rowId, fragNumber );
+    }
+    return NULL;
+}
diff --git a/libs/ngs/NGS_FragmentBlob.h b/libs/ngs/NGS_FragmentBlob.h
new file mode 100644
index 0000000..613ab16
--- /dev/null
+++ b/libs/ngs/NGS_FragmentBlob.h
@@ -0,0 +1,125 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_NGS_FragmentBlob_
+#define _h_NGS_FragmentBlob_
+
+typedef struct NGS_FragmentBlob NGS_FragmentBlob;
+#ifndef _h_ngs_refcount_
+#define NGS_REFCOUNT NGS_FragmentBlob
+#include "NGS_Refcount.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct NGS_FragmentBlob;
+struct NGS_Cursor;
+struct NGS_String;
+
+/*--------------------------------------------------------------------------
+ * NGS_FragmentBlob
+ *  Access to blobs in a SEQUENCE.READ column
+ *  reference counted
+ */
+
+/* Make
+ *  create a blob containing the given rowId
+ *  run - accession name
+ */
+struct NGS_FragmentBlob * NGS_FragmentBlobMake ( ctx_t ctx, const struct NGS_String * run, const struct NGS_Cursor* curs, int64_t rowId );
+
+/* Release
+ *  release reference
+ */
+void NGS_FragmentBlobRelease ( struct NGS_FragmentBlob * self, ctx_t ctx );
+
+/* Duplicate
+ *  duplicate reference
+ */
+NGS_FragmentBlob * NGS_FragmentBlobDuplicate (  struct NGS_FragmentBlob * self, ctx_t ctx );
+
+/* RowRange
+ *  return the range of row Ids in the blob
+ */
+void NGS_FragmentBlobRowRange ( const struct NGS_FragmentBlob * self, ctx_t ctx,  int64_t* first, uint64_t* count );
+
+/* Data
+ *  returns the contents of the blob (concatenated bases of all fragments)
+ */
+const void* NGS_FragmentBlobData ( const struct NGS_FragmentBlob * self, ctx_t ctx );
+/* Size
+ *  returns the size of contents of the blob (total of bases in all fragments)
+ */
+uint64_t NGS_FragmentBlobSize ( const struct NGS_FragmentBlob * self, ctx_t ctx );
+
+/* InfoByOffset
+ *  retrieve fragment info by offset in the blob
+ *  offsetInBases - an offset into the blob
+ *  rowId [OUT, NULL OK]- rowId of the row containing the base at the offset
+ *  fragStart [OUT, NULL OK] - offset to the first base of the row
+ *  baseCount [OUT, NULL OK]- number of bases in the row
+ *  bioNumber [OUT, NULL OK]- for a biological frament, 0-based biological fragment number inside the read; for a technical number, -1
+ */
+void NGS_FragmentBlobInfoByOffset ( const struct NGS_FragmentBlob * self, ctx_t ctx,  uint64_t offsetInBases, int64_t* rowId, uint64_t* fragStart, uint64_t* baseCount, int32_t* bioNumber );
+
+
+/* ReadFragmentCount
+ *  retrieve number of fragment in a read by read's rowId
+ *  rowId - rowId of the read (must be inside the blob)
+ *  returns number of fragments in the read
+ *
+ *  NOTE: implementation TBD
+ */
+uint32_t NGS_FragmentBlobReadFragmentCount ( const struct NGS_FragmentBlob * self, ctx_t ctx, int64_t rowId );
+
+/* InfoByRowId
+ *  retrieve fragment info by rowId and fragment number
+ *  rowId - rowId of the read (must be inside the blob)
+ *  fragmentNumber  - 0-based fragment number inside the read
+ *  fragStart [OUT, NULL OK] - offset to the first base of the row
+ *  baseCount [OUT, NULL OK]- number of bases in the row
+ *  biological [OUT, NULL OK]- true if the fragment is biological, false if technical
+ *
+ *  NOTE: implementation TBD
+ */
+void NGS_FragmentBlobInfoByRowId ( const struct NGS_FragmentBlob * self, ctx_t ctx,  int64_t rowId, uint32_t fragNumber, uint64_t* fragStart, uint64_t* baseCount, bool* biological );
+
+/* MakeFragmentId
+ *  retrieve (biological) fragment Id  by rowId and fragment number
+ *  rowId - rowId of the read (must be inside the blob)
+ *  fragmentNumber  - 0-based biological fragment number inside the read
+ *
+ *  returns the ID string of the specified fragment
+ */
+struct NGS_String* NGS_FragmentBlobMakeFragmentId ( const struct NGS_FragmentBlob * self, ctx_t ctx,  int64_t rowId, uint32_t fragNumber );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_NGS_FragmentBlob_ */
diff --git a/libs/ngs/NGS_FragmentBlobIterator.c b/libs/ngs/NGS_FragmentBlobIterator.c
new file mode 100644
index 0000000..4baa0c1
--- /dev/null
+++ b/libs/ngs/NGS_FragmentBlobIterator.c
@@ -0,0 +1,185 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_FragmentBlobIterator.h"
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <ngs/itf/Refcount.h>
+
+#include <vdb/cursor.h>
+
+#include "NGS_String.h"
+#include "NGS_Cursor.h"
+#include "SRA_Read.h"
+#include "NGS_FragmentBlob.h"
+
+struct NGS_FragmentBlobIterator
+{
+    NGS_Refcount dad;
+
+    const NGS_String* run;
+    const NGS_Cursor* curs;
+    int64_t last_row;
+    int64_t next_row;
+};
+
+void
+NGS_FragmentBlobIteratorWhack ( NGS_FragmentBlobIterator * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcDestroying );
+    if ( self != NULL )
+    {
+        NGS_CursorRelease ( self->curs, ctx );
+        NGS_StringRelease ( self->run, ctx );
+    }
+}
+
+static NGS_Refcount_vt NGS_FragmentBlobIterator_vt =
+{
+    NGS_FragmentBlobIteratorWhack
+};
+
+NGS_FragmentBlobIterator*
+NGS_FragmentBlobIteratorMake ( ctx_t ctx, const NGS_String* run, const struct VTable* tbl )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcConstructing );
+    if ( tbl == NULL )
+    {
+        INTERNAL_ERROR ( xcParamNull, "NULL table object" );
+    }
+    else
+    {
+        NGS_FragmentBlobIterator* ret = malloc ( sizeof * ret );
+        if ( ret == NULL )
+        {
+            SYSTEM_ERROR ( xcNoMemory, "allocating NGS_FragmentBlobIterator" );
+        }
+        else
+        {
+            TRY ( NGS_RefcountInit ( ctx, & ret -> dad, & ITF_Refcount_vt . dad, & NGS_FragmentBlobIterator_vt, "NGS_FragmentBlobIterator", "" ) )
+            {
+                TRY ( ret -> curs = NGS_CursorMake ( ctx, tbl, sequence_col_specs, seq_NUM_COLS ) )
+                {
+                    TRY ( ret -> run = NGS_StringDuplicate ( run, ctx ) )
+                    {
+                        ret -> last_row = NGS_CursorGetRowCount ( ret->curs, ctx );
+                        ret -> next_row = 1;
+                        return ret;
+                    }
+                    NGS_CursorRelease ( ret -> curs, ctx );
+                }
+            }
+            free ( ret );
+        }
+    }
+    return NULL;
+}
+
+/* Release
+ *  release reference
+ */
+void
+NGS_FragmentBlobIteratorRelease ( NGS_FragmentBlobIterator * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcReleasing );
+    if ( self != NULL )
+    {
+        NGS_RefcountRelease ( & self -> dad, ctx );
+    }
+}
+
+/* Duplicate
+ *  duplicate reference
+ */
+NGS_FragmentBlobIterator *
+NGS_FragmentBlobIteratorDuplicate ( NGS_FragmentBlobIterator * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcAccessing );
+    if ( self != NULL )
+    {
+        NGS_RefcountDuplicate( & self -> dad, ctx );
+    }
+    return ( NGS_FragmentBlobIterator* ) self;
+}
+
+/* HasMore
+ *  return true if there are more blobs to iterate on
+ */
+bool
+NGS_FragmentBlobIteratorHasMore ( NGS_FragmentBlobIterator * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcRow, rcSelecting );
+        INTERNAL_ERROR ( xcSelfNull, "NULL FragmentBlobIterator accessed" );
+        return false;
+    }
+    return self != NULL && self -> next_row <= self -> last_row;
+}
+
+/* Next
+ *  return the next blob, to be Release()d by the caller.
+ *  NULL if there are no more blobs
+ */
+NGS_FragmentBlob*
+NGS_FragmentBlobIteratorNext ( NGS_FragmentBlobIterator * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcAccessing );
+
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcRow, rcSelecting );
+        INTERNAL_ERROR ( xcSelfNull, "NULL FragmentBlobIterator accessed" );
+    }
+    else if ( self -> next_row <= self -> last_row )
+    {
+        int64_t nextRow;
+        rc_t rc = VCursorFindNextRowIdDirect ( NGS_CursorGetVCursor ( self -> curs ),
+                                               NGS_CursorGetColumnIndex ( self -> curs, ctx, seq_READ ),
+                                               self -> next_row,
+                                               & nextRow );
+        if ( rc == 0 )
+        {
+            TRY ( NGS_FragmentBlob* ret = NGS_FragmentBlobMake ( ctx, self -> run, self -> curs, nextRow ) )
+            {
+                int64_t first;
+                uint64_t count;
+                TRY ( NGS_FragmentBlobRowRange ( ret, ctx, & first, & count ) )
+                {
+                    self -> next_row = first + count;
+                    return ret;
+                }
+                NGS_FragmentBlobRelease ( ret, ctx );
+            }
+        }
+        self -> next_row = self -> last_row + 1;
+    }
+
+    return NULL;
+}
diff --git a/libs/ngs/NGS_FragmentBlobIterator.h b/libs/ngs/NGS_FragmentBlobIterator.h
new file mode 100644
index 0000000..dcacd83
--- /dev/null
+++ b/libs/ngs/NGS_FragmentBlobIterator.h
@@ -0,0 +1,79 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_NGS_FragmentBlobIterator_
+#define _h_NGS_FragmentBlobIterator_
+
+typedef struct NGS_FragmentBlobIterator NGS_FragmentBlobIterator;
+#ifndef _h_ngs_refcount_
+#define NGS_REFCOUNT NGS_FragmentBlobIterator
+#include "NGS_Refcount.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct VTable;
+struct NGS_String;
+struct NGS_FragmentBlob;
+
+/*--------------------------------------------------------------------------
+ * NGS_FragmentBlobIterator
+ *  Iteration over blobs in the SEQUENCE.READ column
+ *  reference counted
+ */
+
+/* Make
+ */
+NGS_FragmentBlobIterator* NGS_FragmentBlobIteratorMake ( ctx_t ctx, const struct NGS_String* run, const struct VTable* sequence );
+
+/* Release
+ *  release reference
+ */
+void NGS_FragmentBlobIteratorRelease ( NGS_FragmentBlobIterator * self, ctx_t ctx );
+
+/* Duplicate
+ *  duplicate reference
+ */
+NGS_FragmentBlobIterator * NGS_FragmentBlobIteratorDuplicate ( NGS_FragmentBlobIterator * self, ctx_t ctx );
+
+/* HasMore
+ *  return true if there are more blobs to iterate on
+ */
+bool NGS_FragmentBlobIteratorHasMore ( NGS_FragmentBlobIterator * self, ctx_t ctx );
+
+/* Next
+ *  return the next blob, to be Release()d by the caller.
+ *  NULL if there are no more blobs
+ */
+struct NGS_FragmentBlob* NGS_FragmentBlobIteratorNext ( NGS_FragmentBlobIterator * self, ctx_t ctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_NGS_FragmentBlob_ */
diff --git a/libs/ngs/NGS_Id.c b/libs/ngs/NGS_Id.c
new file mode 100644
index 0000000..1051f19
--- /dev/null
+++ b/libs/ngs/NGS_Id.c
@@ -0,0 +1,179 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include "NGS_Id.h"
+
+#include "NGS_String.h"
+
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <klib/printf.h>
+#include <klib/text.h>
+
+#include <strtol.h> /* for strtoi64 */
+#include <string.h>
+
+NGS_String * NGS_IdMake ( ctx_t ctx, const NGS_String * run, enum NGS_Object object, int64_t rowId )
+{
+    size_t num_writ;
+    char buf[265];
+    const char* obj;
+    rc_t rc;
+    
+    switch ( object )
+    {
+    case NGSObject_Read:                obj = "R"; break;
+    case NGSObject_PrimaryAlignment:    obj = "PA"; break;
+    case NGSObject_SecondaryAlignment:  obj = "SA"; break;
+    case NGSObject_ReadFragment:            
+    case NGSObject_AlignmentFragment:            
+        INTERNAL_ERROR ( xcParamUnexpected, "wrong object type NGSObject_Fragment", object);
+        return NULL;
+    default:
+        INTERNAL_ERROR ( xcParamUnexpected, "unrecognized object type %i", object);
+        return NULL;
+    }
+    
+    rc = string_printf ( buf, 
+                         sizeof ( buf ), 
+                         & num_writ, 
+                         "%.*s.%s.%li", 
+                         NGS_StringSize ( run, ctx ), 
+                         NGS_StringData ( run, ctx ), 
+                         obj, 
+                         rowId );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "string_printf rc = %R", rc );
+        return NULL;
+    }
+    
+    return NGS_StringMakeCopy ( ctx, buf, num_writ );
+}
+
+struct NGS_String * NGS_IdMakeFragment ( ctx_t ctx, const NGS_String * run, bool alignment, int64_t rowId, uint32_t frag_num )
+{
+    size_t num_writ;
+    char buf[265];
+    rc_t rc = string_printf ( buf, 
+                              sizeof ( buf ), 
+                              & num_writ, 
+                              "%.*s.%s%i.%li", 
+                              NGS_StringSize ( run, ctx ), 
+                              NGS_StringData ( run, ctx ), 
+                              alignment ? "FA" : "FR", 
+                              frag_num, 
+                              rowId );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "string_printf rc = %R", rc );
+        return NULL;
+    }
+    return NGS_StringMakeCopy ( ctx, buf, num_writ );
+}
+
+struct NGS_Id NGS_IdParse ( char const * self, size_t self_size, ctx_t ctx )
+{
+    struct NGS_Id ret;
+    
+    /* parse from the back using '.' as delimiters */
+    const char* start = self;
+    const char* dot = string_rchr ( start, self_size, '.' );
+    
+    memset ( & ret, 0, sizeof ( ret ) );
+    
+    if ( dot == NULL || dot == start )
+    {
+        INTERNAL_ERROR ( xcParamUnexpected, "Badly formed ID string: %.*s", self_size, self );
+        return ret;
+    }    
+
+    /* rowid*/    
+    ret . rowId = strtoi64 ( dot + 1, NULL, 10 );
+    if ( ret . rowId == 0 )
+    {
+        INTERNAL_ERROR ( xcParamUnexpected, "Badly formed ID string (rowId): %.*s", self_size, self );
+        return ret;
+    }    
+    
+    /* object type and fragment number */
+    dot = string_rchr ( start, dot - start - 1, '.' );
+    if ( dot == NULL || dot == start )
+    {
+        INTERNAL_ERROR ( xcParamUnexpected, "Badly formed ID string (object type ?): %.*s", self_size, self );
+        return ret;
+    }    
+    switch ( dot [ 1 ] )
+    {
+    case 'R': 
+        ret . object =  NGSObject_Read;
+        break;
+        
+    case 'P': 
+        if ( dot [ 2 ] == 'A' )
+            ret . object = NGSObject_PrimaryAlignment;
+        else
+        {
+            INTERNAL_ERROR ( xcParamUnexpected, "Badly formed ID string (object type P?): %.*s", self_size, self );
+            return ret;
+        }
+        break;
+        
+    case 'S': 
+        if ( dot [ 2 ] == 'A' )
+            ret . object = NGSObject_SecondaryAlignment;
+        else
+        {
+            INTERNAL_ERROR ( xcParamUnexpected, "Badly formed ID string (object type S?): %.*s", self_size, self );
+            return ret;
+        }
+        break;
+        
+    case 'F': 
+        switch ( dot [ 2 ] )
+        {
+        case 'R' : 
+            ret . object = NGSObject_ReadFragment;
+            break;
+        case 'A' : 
+            ret . object = NGSObject_AlignmentFragment;
+            break;
+        default  : 
+            INTERNAL_ERROR ( xcParamUnexpected, "Badly formed ID string (object type F?): %.*s", self_size, self );
+            return ret;
+        }
+        ret . fragId = strtoul( dot + 3, NULL, 10 ); /* even if missing/invalid, set to 0 */
+        break;
+    }    
+    
+    /* run */
+    StringInit ( & ret . run, start, dot - start, ( uint32_t )  ( dot - start ) );
+    
+    return ret;
+}
+
diff --git a/libs/ngs/NGS_Id.h b/libs/ngs/NGS_Id.h
new file mode 100644
index 0000000..b6be68a
--- /dev/null
+++ b/libs/ngs/NGS_Id.h
@@ -0,0 +1,93 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_id_
+#define _h_ngs_id_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_String;
+
+/*--------------------------------------------------------------------------
+ * NGS_Id
+ *  a unique identifier of an NGS object
+ * Represented with a string of the following format:
+ *   <runName>.<objectType>.<rowId>
+ * where 
+ *   rowId is the object's row number in the corresponding table
+ *   object type is one of "R" (read), 
+ *                         "FR<fragId>" (fragment; rowId refers to the fragment's read, 
+ *                         "FA<fragId>" (fragment; rowId refers to the fragment's alignment, 
+ *                                          fragId is the fragment's 0-based number within the read; 
+ *                                          only biological fragments are counted), 
+ *                         "PA" (primary alignment), 
+ *                         "SA" (secondary alignment)
+ *   runName is the name of the accession
+ */
+
+enum NGS_Object
+{
+    NGSObject_Read,
+    NGSObject_ReadFragment,
+    NGSObject_AlignmentFragment,
+    NGSObject_PrimaryAlignment,
+    NGSObject_SecondaryAlignment,
+};
+
+struct NGS_Id
+{
+    String run;
+    int64_t rowId;
+    int32_t object; /* enum NGS_Object */
+    uint32_t fragId;
+};
+
+/* Make
+ * the returned NGS_String is guaranteed to be NUL-terminated
+ */
+struct NGS_String* NGS_IdMake ( ctx_t ctx, const struct NGS_String * run, enum NGS_Object object, int64_t rowId );
+struct NGS_String* NGS_IdMakeFragment ( ctx_t ctx, const struct NGS_String * run, bool alignment, int64_t rowId, uint32_t frag_num );
+
+struct NGS_Id NGS_IdParse ( char const * self, size_t self_size, ctx_t ctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_id */
diff --git a/libs/ngs/NGS_Pileup.c b/libs/ngs/NGS_Pileup.c
new file mode 100644
index 0000000..35b6f76
--- /dev/null
+++ b/libs/ngs/NGS_Pileup.c
@@ -0,0 +1,235 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_Pileup.h"
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/Refcount.h>
+#include <ngs/itf/PileupItf.h>
+#include <ngs/itf/PileupEventItf.h>
+
+#include "NGS_String.h"
+#include "NGS_Reference.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+/*--------------------------------------------------------------------------
+ * NGS_Pileup_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_Pileup* ) ( obj ) )
+    
+static NGS_String_v1 * NGS_Pileup_v1_get_ref_spec ( const NGS_Pileup_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcCursor, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_PileupGetReferenceSpec ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static int64_t NGS_Pileup_v1_get_ref_pos ( const NGS_Pileup_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcCursor, rcAccessing );
+    ON_FAIL ( int64_t ret = NGS_PileupGetReferencePosition ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static char NGS_Pileup_v1_get_ref_base ( const NGS_Pileup_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcCursor, rcAccessing );
+    ON_FAIL ( char ret = NGS_PileupGetReferenceBase ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static uint32_t NGS_Pileup_v1_get_pileup_depth ( const NGS_Pileup_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcCursor, rcAccessing );
+    ON_FAIL ( uint32_t ret = NGS_PileupGetPileupDepth ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static bool NGS_Pileup_v1_next ( NGS_Pileup_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcCursor, rcAccessing );
+    ON_FAIL ( bool ret = NGS_PileupIteratorNext ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+#undef Self
+
+
+NGS_Pileup_v1_vt ITF_Pileup_vt =
+{
+    {
+        "NGS_Pileup",
+        "NGS_Pileup_v1",
+        0,
+        & ITF_PileupEvent_vt . dad
+    },
+
+    NGS_Pileup_v1_get_ref_spec,
+    NGS_Pileup_v1_get_ref_pos,
+    NGS_Pileup_v1_get_ref_base,
+    NGS_Pileup_v1_get_pileup_depth,
+    NGS_Pileup_v1_next
+};
+
+/*--------------------------------------------------------------------------
+ * NGS_Pileup
+ */
+
+#define VT( self, msg ) \
+    ( ( ( const NGS_Pileup_vt* ) ( self ) -> dad . dad . vt ) -> msg )
+
+void NGS_PileupInit ( ctx_t ctx, 
+                      struct NGS_Pileup * obj, 
+                      const NGS_Pileup_vt * vt, 
+                      const char *clsname, 
+                      const char *instname, 
+                      struct NGS_Reference* ref )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcRow, rcConstructing );
+    
+    TRY ( NGS_PileupEventInit ( ctx, & obj -> dad, & ITF_Pileup_vt . dad, & vt -> dad, clsname, instname, ref ) )
+    {
+        assert ( vt -> get_reference_spec != NULL );
+        assert ( vt -> get_reference_position != NULL );
+        assert ( vt -> get_reference_base != NULL );
+        assert ( vt -> get_pileup_depth != NULL );
+        assert ( vt -> next != NULL );
+    }
+}
+
+/* Whack
+*/                         
+void NGS_PileupWhack ( struct NGS_Pileup * self, ctx_t ctx )
+{
+    NGS_PileupEventWhack ( & self -> dad, ctx );
+}
+    
+struct NGS_String* NGS_PileupGetReferenceSpec ( const NGS_Pileup* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get reference spec" );
+    }
+    else
+    {
+        return VT ( self, get_reference_spec ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+int64_t NGS_PileupGetReferencePosition ( const NGS_Pileup* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get reference position" );
+    }
+    else
+    {
+        return VT ( self, get_reference_position ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+char NGS_PileupGetReferenceBase ( const NGS_Pileup* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get reference base" );
+    }
+    else
+    {
+        return VT ( self, get_reference_base ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+unsigned int NGS_PileupGetPileupDepth ( const NGS_Pileup* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get pileup depth" );
+    }
+    else
+    {
+        return VT ( self, get_pileup_depth) ( self, ctx );
+    }
+
+    return 0;
+}
+
+bool NGS_PileupIteratorNext ( NGS_Pileup* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get next pileup" );
+    }
+    else
+    {
+        return VT ( self, next ) ( self, ctx );
+    }
+
+    return false;
+}
+
diff --git a/libs/ngs/NGS_Pileup.h b/libs/ngs/NGS_Pileup.h
new file mode 100644
index 0000000..bc54c26
--- /dev/null
+++ b/libs/ngs/NGS_Pileup.h
@@ -0,0 +1,147 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_pileup_
+#define _h_ngs_pileup_
+
+typedef struct NGS_Pileup NGS_Pileup;
+#ifndef NGS_PILEUP
+#define NGS_PILEUP NGS_Pileup
+#endif
+
+#ifndef _h_ngs_refcount_
+#define NGS_REFCOUNT NGS_PILEUP
+#include "NGS_Refcount.h"
+#endif
+
+#ifndef _h_ngs_pileupevent_
+
+#ifndef NGS_PILEUPEVENT
+struct CSRA1_PileupEvent;
+#define NGS_PILEUPEVENT struct CSRA1_PileupEvent
+#endif
+
+#include "NGS_PileupEvent.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_String;
+struct NGS_PileupEvent;
+struct NGS_Reference;
+
+/*--------------------------------------------------------------------------
+ * NGS_Pileup
+ */
+
+enum NGS_PileupFilterBits
+{
+    NGS_PileupFilterBits_pass_bad            = 0x01,
+    NGS_PileupFilterBits_pass_dups           = 0x02,
+    NGS_PileupFilterBits_min_map_qual        = 0x04,
+    NGS_PileupFilterBits_max_map_qual        = 0x08,
+    NGS_PileupFilterBits_no_wraparound       = 0x10,
+    NGS_PileupFilterBits_start_within_window = 0x20,
+
+    NGS_PileupFilterBits_map_qual = NGS_PileupFilterBits_min_map_qual | NGS_PileupFilterBits_max_map_qual
+};
+ 
+
+/* ToPileupEvent
+ *  inline cast that preserves const
+ */
+#define NGS_PileupToPileupEvent( self ) \
+    ( & ( self ) -> dad )
+
+/* Release
+ *  release reference
+ */
+#define NGS_PileupRelease( self, ctx ) \
+    NGS_PileupEventRelease ( NGS_PileupToPileupEvent ( self ), ctx )
+
+/* Duplicate
+ *  duplicate reference
+ */
+#define NGS_PileupDuplicate( self, ctx ) \
+    ( ( NGS_Pileup* ) NGS_PileupEventDuplicate ( NGS_PileupToPileupEvent ( self ), ctx ) )
+
+struct NGS_String* NGS_PileupGetReferenceSpec ( const NGS_Pileup* self, ctx_t ctx );
+
+int64_t NGS_PileupGetReferencePosition ( const NGS_Pileup* self, ctx_t ctx );
+
+char NGS_PileupGetReferenceBase ( const NGS_Pileup* self, ctx_t ctx );
+
+unsigned int NGS_PileupGetPileupDepth ( const NGS_Pileup* self, ctx_t ctx );
+ 
+bool NGS_PileupIteratorNext ( NGS_Pileup* self, ctx_t ctx );
+
+
+/*--------------------------------------------------------------------------
+ * implementation details
+ */
+struct NGS_Pileup
+{
+    NGS_PileupEvent dad;
+};
+
+typedef struct NGS_Pileup_vt NGS_Pileup_vt;
+struct NGS_Pileup_vt
+{
+    NGS_PileupEvent_vt dad;
+
+    /* Pileup interface */
+    struct NGS_String *         ( * get_reference_spec )        ( const NGS_PILEUP * self, ctx_t ctx );
+    int64_t                     ( * get_reference_position )    ( const NGS_PILEUP * self, ctx_t ctx );
+    char                        ( * get_reference_base )        ( const NGS_PILEUP * self, ctx_t ctx );
+    unsigned int                ( * get_pileup_depth )          ( const NGS_PILEUP * self, ctx_t ctx );
+
+    /* PileupIterator interface */
+    bool ( * next ) ( NGS_PILEUP * self, ctx_t ctx );
+};
+
+/* Init
+*/
+void NGS_PileupInit ( ctx_t ctx, 
+                      struct NGS_Pileup * self, 
+                      const NGS_Pileup_vt * vt, 
+                      const char *clsname, 
+                      const char *instname, 
+                      struct NGS_Reference* ref );
+
+/* Whack
+*/                         
+void NGS_PileupWhack ( struct NGS_Pileup * self, ctx_t ctx );                      
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_pileup_ */
diff --git a/libs/ngs/NGS_PileupEvent.c b/libs/ngs/NGS_PileupEvent.c
new file mode 100644
index 0000000..8826ee1
--- /dev/null
+++ b/libs/ngs/NGS_PileupEvent.c
@@ -0,0 +1,493 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_PileupEvent.h"
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/Refcount.h>
+#include <ngs/itf/PileupEventItf.h>
+
+#include "NGS_String.h"
+#include "NGS_Reference.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+/*--------------------------------------------------------------------------
+ * NGS_PileupEvent_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_PileupEvent* ) ( obj ) )
+    
+static int32_t NGS_PileupEvent_v1_get_map_qual ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( int32_t ret = NGS_PileupEventGetMappingQuality ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static NGS_String_v1 * NGS_PileupEvent_v1_get_align_id ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_PileupEventGetAlignmentId ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static int64_t NGS_PileupEvent_v1_get_align_pos ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( int64_t ret = NGS_PileupEventGetAlignmentPosition ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static int64_t NGS_PileupEvent_v1_get_first_align_pos ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( int64_t ret = NGS_PileupEventGetFirstAlignmentPosition ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static int64_t NGS_PileupEvent_v1_get_last_align_pos ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( int64_t ret = NGS_PileupEventGetLastAlignmentPosition ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static uint32_t NGS_PileupEvent_v1_get_event_type ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint32_t ret = NGS_PileupEventGetEventType ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static char NGS_PileupEvent_v1_get_align_base ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( char ret = NGS_PileupEventGetAlignmentBase ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static char NGS_PileupEvent_v1_get_align_qual ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( char ret = NGS_PileupEventGetAlignmentQuality ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static NGS_String_v1 * NGS_PileupEvent_v1_get_ins_bases ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_PileupEventGetInsertionBases ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * NGS_PileupEvent_v1_get_ins_quals ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_PileupEventGetInsertionQualities ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static uint32_t NGS_PileupEvent_v1_get_rpt_count ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint32_t ret = NGS_PileupEventGetRepeatCount ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static uint32_t NGS_PileupEvent_v1_get_indel_type ( const NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint32_t ret = NGS_PileupEventGetIndelType ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static bool NGS_PileupEvent_v1_next ( NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcCursor, rcAccessing );
+    ON_FAIL ( bool ret = NGS_PileupEventIteratorNext ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static void NGS_PileupEvent_v1_reset ( NGS_PileupEvent_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcCursor, rcUpdating );
+    ON_FAIL ( NGS_PileupEventIteratorReset ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+}
+
+#undef Self
+
+
+NGS_PileupEvent_v1_vt ITF_PileupEvent_vt =
+{
+    {
+        "NGS_PileupEvent",
+        "NGS_PileupEvent_v1",
+        0,
+        & ITF_Refcount_vt . dad
+    },
+
+    NGS_PileupEvent_v1_get_map_qual,
+    NGS_PileupEvent_v1_get_align_id,
+    NGS_PileupEvent_v1_get_align_pos,
+    NGS_PileupEvent_v1_get_first_align_pos,
+    NGS_PileupEvent_v1_get_last_align_pos,
+    NGS_PileupEvent_v1_get_event_type,
+    NGS_PileupEvent_v1_get_align_base,
+    NGS_PileupEvent_v1_get_align_qual,
+    NGS_PileupEvent_v1_get_ins_bases,
+    NGS_PileupEvent_v1_get_ins_quals,
+    NGS_PileupEvent_v1_get_rpt_count,
+    NGS_PileupEvent_v1_get_indel_type,
+    NGS_PileupEvent_v1_next,
+    NGS_PileupEvent_v1_reset
+};
+
+/*--------------------------------------------------------------------------
+ * NGS_Pileup
+ */
+
+#define VT( self, msg ) \
+    ( ( ( const NGS_PileupEvent_vt* ) ( self ) -> dad . vt ) -> msg )
+
+void NGS_PileupEventInit ( ctx_t ctx, struct NGS_PileupEvent * obj, 
+    struct NGS_VTable const * ivt, const NGS_PileupEvent_vt * vt, 
+    const char *clsname, const char *instname, struct NGS_Reference * ref )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcRow, rcConstructing );
+    
+    TRY ( NGS_RefcountInit ( ctx, & obj -> dad, ivt, & vt -> dad, clsname, instname ) )
+    {
+        assert ( vt -> get_mapping_quality != NULL );
+        assert ( vt -> get_alignment_id != NULL );
+        assert ( vt -> get_alignment_position != NULL );
+        assert ( vt -> get_first_alignment_position != NULL );
+        assert ( vt -> get_last_alignment_position != NULL );
+        assert ( vt -> get_event_type != NULL );
+        assert ( vt -> get_alignment_base != NULL );
+        assert ( vt -> get_alignment_quality != NULL );
+        assert ( vt -> get_insertion_bases != NULL );
+        assert ( vt -> get_insertion_qualities != NULL );
+        assert ( vt -> get_repeat_count != NULL );
+        assert ( vt -> get_indel_type != NULL );
+        assert ( vt -> next != NULL );
+        assert ( vt -> reset != NULL );
+    
+        assert ( ref != NULL );
+        obj -> ref = NGS_ReferenceDuplicate ( ref, ctx );
+    }
+}
+
+void NGS_PileupEventWhack( struct NGS_PileupEvent * self, ctx_t ctx )
+{
+    NGS_ReferenceRelease ( self -> ref, ctx );
+}
+    
+int NGS_PileupEventGetMappingQuality( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get mapping quality " );
+    }
+    else
+    {
+        return VT ( self, get_mapping_quality ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+struct NGS_String * NGS_PileupEventGetAlignmentId( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignment id" );
+    }
+    else
+    {
+        return VT ( self, get_alignment_id ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+int64_t NGS_PileupEventGetAlignmentPosition( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignment position " );
+    }
+    else
+    {
+        return VT ( self, get_alignment_position ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+int64_t NGS_PileupEventGetFirstAlignmentPosition( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get first alignment position " );
+    }
+    else
+    {
+        return VT ( self, get_first_alignment_position ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+int64_t NGS_PileupEventGetLastAlignmentPosition( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to last alignment position" );
+    }
+    else
+    {
+        return VT ( self, get_last_alignment_position ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+/*TODO: use uint32_t to represent all enums */
+int NGS_PileupEventGetEventType( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get event type " );
+    }
+    else
+    {
+        return VT ( self, get_event_type ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+char NGS_PileupEventGetAlignmentBase( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignment base" );
+    }
+    else
+    {
+        return VT ( self, get_alignment_base ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+char NGS_PileupEventGetAlignmentQuality( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignment quality " );
+    }
+    else
+    {
+        return VT ( self, get_alignment_quality ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+struct NGS_String * NGS_PileupEventGetInsertionBases( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get insertion bases" );
+    }
+    else
+    {
+        return VT ( self, get_insertion_bases) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+struct NGS_String * NGS_PileupEventGetInsertionQualities( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get insertion qualities" );
+    }
+    else
+    {
+        return VT ( self, get_insertion_qualities) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+unsigned int NGS_PileupEventGetRepeatCount( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get repeat count" );
+    }
+    else
+    {
+        return VT ( self, get_repeat_count ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+int NGS_PileupEventGetIndelType( const NGS_PileupEvent * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get indel type " );
+    }
+    else
+    {
+        return VT ( self, get_indel_type ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * NGS_PileupEventIterator
+ */
+bool NGS_PileupEventIteratorNext ( NGS_PileupEvent* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get next pileup event" );
+    }
+    else
+    {
+        return VT ( self, next ) ( self, ctx );
+    }
+
+    return false;
+}
+
+void NGS_PileupEventIteratorReset ( NGS_PileupEvent* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to reset pileup event iterator" );
+    }
+    else
+    {
+        VT ( self, reset ) ( self, ctx );
+    }
+}
diff --git a/libs/ngs/NGS_PileupEvent.h b/libs/ngs/NGS_PileupEvent.h
new file mode 100644
index 0000000..cfd425c
--- /dev/null
+++ b/libs/ngs/NGS_PileupEvent.h
@@ -0,0 +1,179 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_pileupevent_
+#define _h_ngs_pileupevent_
+
+typedef struct NGS_PileupEvent NGS_PileupEvent;
+#ifndef NGS_PILEUPEVENT
+#define NGS_PILEUPEVENT NGS_PileupEvent
+#endif
+
+#ifndef _h_ngs_refcount_
+#define NGS_REFCOUNT NGS_PILEUPEVENT
+#include "NGS_Refcount.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_String;
+struct NGS_Alignment;
+struct NGS_Reference;
+struct NGS_PileupEvent_v1_vt;
+extern struct NGS_PileupEvent_v1_vt ITF_PileupEvent_vt;
+
+/*--------------------------------------------------------------------------
+ * NGS_PileupEvent
+ */
+ 
+/* ToRefcount
+ *  inline cast that preserves const
+ */
+#define NGS_PileupEventToRefcount( self ) \
+    ( & ( self ) -> dad )
+
+/* Release
+ *  release reference
+ */
+#define NGS_PileupEventRelease( self, ctx ) \
+    NGS_RefcountRelease ( NGS_PileupEventToRefcount ( self ), ctx )
+
+/* Duplicate
+ *  duplicate reference
+ */
+#define NGS_PileupEventDuplicate( self, ctx ) \
+    ( ( NGS_PileupEvent* ) NGS_RefcountDuplicate ( NGS_PileupEventToRefcount ( self ), ctx ) ) 
+ 
+int NGS_PileupEventGetMappingQuality( const NGS_PileupEvent * self, ctx_t ctx );
+
+struct NGS_String * NGS_PileupEventGetAlignmentId( const NGS_PileupEvent * self, ctx_t ctx );
+
+int64_t NGS_PileupEventGetAlignmentPosition( const NGS_PileupEvent * self, ctx_t ctx );
+
+int64_t NGS_PileupEventGetFirstAlignmentPosition( const NGS_PileupEvent * self, ctx_t ctx );
+
+int64_t NGS_PileupEventGetLastAlignmentPosition( const NGS_PileupEvent * self, ctx_t ctx );
+
+enum NGS_PileupEventType
+{
+    /* basic event types */
+    NGS_PileupEventType_match        = 0,
+    NGS_PileupEventType_mismatch     = 1,
+    NGS_PileupEventType_deletion     = 2,
+
+    /* event modifiers */
+    NGS_PileupEventType_insertion    = 0x08,
+    NGS_PileupEventType_minus_strand = 0x20,
+    NGS_PileupEventType_stop         = 0x40,
+    NGS_PileupEventType_start        = 0x80
+};        
+int NGS_PileupEventGetEventType( const NGS_PileupEvent * self, ctx_t ctx );
+
+char NGS_PileupEventGetAlignmentBase( const NGS_PileupEvent * self, ctx_t ctx );
+
+char NGS_PileupEventGetAlignmentQuality( const NGS_PileupEvent * self, ctx_t ctx );
+
+struct NGS_String * NGS_PileupEventGetInsertionBases( const NGS_PileupEvent * self, ctx_t ctx );
+
+struct NGS_String * NGS_PileupEventGetInsertionQualities( const NGS_PileupEvent * self, ctx_t ctx );
+
+unsigned int NGS_PileupEventGetRepeatCount( const NGS_PileupEvent * self, ctx_t ctx );
+
+enum NGS_PileupIndelType
+{
+    NGS_PileupIndelType_normal         = 0,
+    NGS_PileupIndelType_intron_plus    = 1,
+    NGS_PileupIndelType_intron_minus   = 2,
+    NGS_PileupIndelType_intron_unknown = 3,
+    NGS_PileupIndelType_read_overlap   = 4,
+    NGS_PileupIndelType_read_gap       = 5
+};
+int NGS_PileupEventGetIndelType( const NGS_PileupEvent * self, ctx_t ctx );
+
+/*--------------------------------------------------------------------------
+ * NGS_PileupEventIterator
+ */
+
+/* Next
+ */
+bool NGS_PileupEventIteratorNext ( NGS_PileupEvent * self, ctx_t ctx );
+
+/* Reset
+ */
+void NGS_PileupEventIteratorReset ( NGS_PileupEvent * self, ctx_t ctx );
+
+
+/*--------------------------------------------------------------------------
+ * implementation details
+ */
+struct NGS_PileupEvent
+{
+    NGS_Refcount dad;
+    struct NGS_Reference * ref;
+};
+
+typedef struct NGS_PileupEvent_vt NGS_PileupEvent_vt;
+struct NGS_PileupEvent_vt
+{
+    NGS_Refcount_vt dad;
+    
+    int                     ( * get_mapping_quality )           ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    struct NGS_String *     ( * get_alignment_id )              ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    int64_t                 ( * get_alignment_position )        ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    int64_t                 ( * get_first_alignment_position )  ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    int64_t                 ( * get_last_alignment_position )   ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    int                     ( * get_event_type )                ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    char                    ( * get_alignment_base )            ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    char                    ( * get_alignment_quality )         ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    struct NGS_String *     ( * get_insertion_bases )           ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    struct NGS_String *     ( * get_insertion_qualities )       ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    unsigned int            ( * get_repeat_count )              ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    int                     ( * get_indel_type )                ( const NGS_PILEUPEVENT * self, ctx_t ctx );
+    bool                    ( * next )                          ( NGS_PILEUPEVENT * self, ctx_t ctx );    
+    void                    ( * reset )                         ( NGS_PILEUPEVENT * self, ctx_t ctx );    
+};
+
+
+/* Init
+*/
+void NGS_PileupEventInit ( ctx_t ctx, struct NGS_PileupEvent * obj, 
+    struct NGS_VTable const * ivt, const NGS_PileupEvent_vt * vt, 
+    const char *clsname, const char *instname, struct NGS_Reference * ref );
+
+/* Whack
+*/
+void NGS_PileupEventWhack ( struct NGS_PileupEvent * self, ctx_t ctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_pileupevent_ */
diff --git a/libs/ngs/NGS_Read.c b/libs/ngs/NGS_Read.c
new file mode 100644
index 0000000..b652141
--- /dev/null
+++ b/libs/ngs/NGS_Read.c
@@ -0,0 +1,522 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include "NGS_Read.h"
+
+#include "NGS_String.h"
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/FragmentItf.h>
+#include <ngs/itf/ReadItf.h>
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/refcount.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+
+#include <sysalloc.h>
+
+#include <stddef.h>
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * NGS_Read_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_Read* ) ( obj ) )
+    
+static NGS_String_v1 * ITF_Read_v1_get_id ( const NGS_Read_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReadGetReadId ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static uint32_t ITF_Read_v1_get_num_frags ( const NGS_Read_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint32_t ret = NGS_ReadNumFragments ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static bool ITF_Read_v1_frag_is_aligned ( const NGS_Read_v1 * self, NGS_ErrBlock_v1 * err, uint32_t frag_idx )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_ReadFragIsAligned ( Self ( self ), ctx, frag_idx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static uint32_t ITF_Read_v1_get_category ( const NGS_Read_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint32_t ret = NGS_ReadGetReadCategory ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static NGS_String_v1 * ITF_Read_v1_get_read_group ( const NGS_Read_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReadGetReadGroup ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Read_v1_get_name ( const NGS_Read_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReadGetReadName ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Read_v1_get_bases ( const NGS_Read_v1 * self, NGS_ErrBlock_v1 * err, uint64_t offset, uint64_t length )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReadGetReadSequence ( Self ( self ), ctx, offset, length ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Read_v1_get_quals ( const NGS_Read_v1 * self, NGS_ErrBlock_v1 * err, uint64_t offset, uint64_t length )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReadGetReadQualities ( Self ( self ), ctx, offset, length ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static bool ITF_Read_v1_next ( NGS_Read_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_ReadIteratorNext ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+#undef Self
+
+
+NGS_Read_v1_vt ITF_Read_vt =
+{
+    {
+        "NGS_Read",
+        "NGS_Read_v1",
+        1,
+        & ITF_Fragment_vt . dad
+    },
+
+    ITF_Read_v1_get_id,
+    ITF_Read_v1_get_num_frags,
+    ITF_Read_v1_get_category,
+    ITF_Read_v1_get_read_group,
+    ITF_Read_v1_get_name,
+    ITF_Read_v1_get_bases,
+    ITF_Read_v1_get_quals,
+    ITF_Read_v1_next,
+
+    /* 1.1 */
+    ITF_Read_v1_frag_is_aligned
+};
+
+/*--------------------------------------------------------------------------
+ * NGS_Read
+ */
+#define VT( self, msg ) \
+    ( ( ( const NGS_Read_vt* ) ( self ) -> dad . dad . vt ) -> msg )
+
+NGS_String * NGS_ReadGetReadName ( NGS_Read * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read name" );
+    }
+    else
+    {
+        return VT ( self, get_name ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+NGS_String * NGS_ReadGetReadId ( NGS_Read * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read id" );
+    }
+    else
+    {
+        return VT ( self, get_id ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+NGS_String * NGS_ReadGetReadGroup ( NGS_Read * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read group" );
+    }
+    else
+    {
+        return VT ( self, get_read_group ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+enum NGS_ReadCategory NGS_ReadGetReadCategory ( const NGS_Read * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read category" );
+    }
+    else
+    {
+        return VT ( self, get_category ) ( self, ctx );
+    }
+
+    return NGS_ReadCategory_unaligned;
+}
+
+NGS_String * NGS_ReadGetReadSequence ( NGS_Read * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read sequence" );
+    }
+    else
+    {
+        return VT ( self, get_sequence ) ( self, ctx, offset, size );
+    }
+
+    return NULL;
+}
+
+NGS_String * NGS_ReadGetReadQualities( NGS_Read * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read qualities" );
+    }
+    else
+    {
+        return VT ( self, get_qualities ) ( self, ctx, offset, size );
+    }
+
+    return NULL;
+}
+
+uint32_t NGS_ReadNumFragments ( NGS_Read * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read fragment count" );
+    }
+    else
+    {
+        return VT ( self, get_num_fragments ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+bool NGS_ReadFragIsAligned ( NGS_Read * self, ctx_t ctx, uint32_t frag_idx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to test fragment alignment" );
+    }
+    else
+    {
+        return VT ( self, frag_is_aligned ) ( self, ctx, frag_idx );
+    }
+
+    return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadIterator
+ */
+
+bool NGS_ReadIteratorNext ( NGS_Read * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to advance read iterator" );
+    }
+    else
+    {
+        return VT ( self, next ) ( self, ctx );
+    }
+
+    return false;
+}
+
+uint64_t NGS_ReadIteratorGetCount ( const NGS_Read * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read iterator count" );
+    }
+    else
+    {
+        return VT ( self, get_count ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+void NGS_ReadInit ( ctx_t ctx, NGS_Read * read, const NGS_Read_vt * vt, const char *clsname, const char *instname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcRow, rcConstructing );
+
+    TRY ( NGS_FragmentInit ( ctx, & read -> dad, & ITF_Read_vt . dad, & vt -> dad, clsname, instname ) )
+    {
+        assert ( vt -> get_id != NULL );
+        assert ( vt -> get_name != NULL );
+        assert ( vt -> get_read_group != NULL );
+        assert ( vt -> get_category != NULL );
+        assert ( vt -> get_sequence != NULL );
+        assert ( vt -> get_qualities != NULL ); 
+        assert ( vt -> get_num_fragments != NULL );
+   }
+}
+
+void NGS_ReadIteratorInit ( ctx_t ctx, NGS_Read * read, const NGS_Read_vt * vt, const char *clsname, const char *instname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcRow, rcConstructing );
+
+    TRY ( NGS_ReadInit ( ctx, read, vt, clsname, instname ) )
+    {
+        assert ( vt -> next != NULL ); 
+        assert ( vt -> get_count != NULL );
+   }
+}
+
+/*--------------------------------------------------------------------------
+ * NGS_NullRead
+ */
+
+static 
+void NullRead_ReadWhack ( NGS_Read * self, ctx_t ctx )
+{
+}
+
+static 
+struct NGS_String * NullRead_FragmentToString ( NGS_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static 
+struct NGS_String * NullRead_FragmentOffsetLenToString ( NGS_Read * self, ctx_t ctx, uint64_t offset, uint64_t length )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static 
+bool NullRead_FragmentToBool ( NGS_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static 
+struct NGS_String * NullRead_ReadToString ( NGS_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static 
+enum NGS_ReadCategory NullRead_ConstReadToCategory ( const NGS_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static struct NGS_String * NullRead_ReadOffsetLenToString ( NGS_Read * self, ctx_t ctx, uint64_t offset, uint64_t length )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static uint32_t NullRead_ReadToU32 ( NGS_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return 0;
+}
+
+static bool NullRead_FragIsAligned ( NGS_Read * self, ctx_t ctx, uint32_t frag_idx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Alignment accessed" );
+    return false;
+}
+
+static bool NullRead_ReadToBool_NoError ( NGS_Read * self, ctx_t ctx )
+{
+    return false;
+}
+
+static uint64_t NullRead_ConstReadToU64_NoError ( const NGS_Read * self, ctx_t ctx )
+{
+    return 0;
+}
+
+static NGS_Read_vt NullRead_vt_inst =
+{
+    {
+        {
+            /* NGS_Refcount */
+            NullRead_ReadWhack
+        },
+
+        /* NGS_Fragment */
+        NullRead_FragmentToString,
+        NullRead_FragmentOffsetLenToString,
+        NullRead_FragmentOffsetLenToString,
+        NullRead_FragmentToBool,
+        NullRead_FragmentToBool
+    },
+    
+    /* NGS_Read */
+    NullRead_ReadToString,                     /* get-id          */
+    NullRead_ReadToString,                     /* get-name        */
+    NullRead_ReadToString,                     /* get-read-group  */
+    NullRead_ConstReadToCategory,              /* get-category    */
+    NullRead_ReadOffsetLenToString,            /* get-sequence    */
+    NullRead_ReadOffsetLenToString,            /* get-qualities   */
+    NullRead_ReadToU32,                        /* get-num-frags   */
+    NullRead_FragIsAligned,                    /* frag-is-aligned */
+    
+    /* NGS_ReadIterator */
+    NullRead_ReadToBool_NoError,               /* next            */
+    NullRead_ConstReadToU64_NoError,           /* get-count       */
+}; 
+
+struct NGS_Read * NGS_ReadMakeNull ( ctx_t ctx, const NGS_String * run_name )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    NGS_Read * ref;
+
+    assert ( run_name != NULL );
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating NullRead on '%.*s'", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname, sizeof instname, NULL, "%.*s(NULL)", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+		TRY ( NGS_ReadInit ( ctx, ref, & NullRead_vt_inst, "NullRead", instname ) )
+        {
+            return ref;
+        }
+        free ( ref );
+    }
+
+    return NULL;
+}
+
+
+
diff --git a/libs/ngs/NGS_Read.h b/libs/ngs/NGS_Read.h
new file mode 100644
index 0000000..53689ad
--- /dev/null
+++ b/libs/ngs/NGS_Read.h
@@ -0,0 +1,190 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_read_
+#define _h_ngs_read_
+
+typedef struct NGS_Read NGS_Read;
+
+#ifndef NGS_READ
+#define NGS_READ NGS_Read
+#endif
+
+#ifndef _h_ngs_fragment_
+#define NGS_FRAGMENT NGS_READ
+#include "NGS_Fragment.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct String;
+struct VCursor;
+struct NGS_String;
+struct NGS_Read_v1_vt;
+extern struct NGS_Read_v1_vt ITF_Read_vt;
+
+/*--------------------------------------------------------------------------
+ * NGS_Read
+ */
+ 
+/* MakeCommon
+ *  makes a common read from VCursor
+ *  MAKES A STANDALONE READ - A SEPARATE IMPLEMENTATION CLASS
+ *  mostly, it cannot iterate, and should throw an error when trying
+ */
+NGS_Read * NGS_ReadMakeCommon ( ctx_t ctx, struct VCursor const * curs, int64_t readId, struct String const * spec );
+
+
+/* ToRefcount
+ *  inline cast that preserves const
+ */
+#define NGS_ReadToRefcount( self ) \
+    ( NGS_FragmentToRefcount ( & ( self ) -> dad ) )
+
+
+/* Release
+ *  release reference
+ */
+#define NGS_ReadRelease( self, ctx ) \
+    NGS_RefcountRelease ( NGS_ReadToRefcount ( self ), ctx )
+
+/* Duplicate
+ *  duplicate reference
+ */
+#define NGS_ReadDuplicate( self, ctx ) \
+    ( ( NGS_Read* ) NGS_RefcountDuplicate ( NGS_ReadToRefcount ( self ), ctx ) )
+
+
+/* GetReadName
+ */
+struct NGS_String * NGS_ReadGetReadName ( NGS_Read * self, ctx_t ctx );
+
+/* GetReadId
+ */
+struct NGS_String * NGS_ReadGetReadId ( NGS_Read * self, ctx_t ctx );
+
+/* GetReadGroup
+ */
+struct NGS_String * NGS_ReadGetReadGroup ( NGS_Read * self, ctx_t ctx );
+
+/* GetReadCategory
+ */
+enum NGS_ReadCategory
+{	/* keep in synch with ngs :: Read :: ReadCategory */
+	/* TODO: use an enum from <ngs/itf/ReadItf.h> */
+    NGS_ReadCategory_fullyAligned = 1,
+    NGS_ReadCategory_partiallyAligned = 2,
+    NGS_ReadCategory_unaligned = 4,
+};
+
+enum NGS_ReadCategory NGS_ReadGetReadCategory ( const NGS_Read * self, ctx_t ctx );
+
+/* GetReadSequence
+ * GetReadSubSequence
+ */
+struct NGS_String * NGS_ReadGetReadSequence ( NGS_Read * self, ctx_t ctx, uint64_t offset, uint64_t length );
+
+
+/* GetReadQualities
+ * GetReadSubQualities
+ */
+struct NGS_String * NGS_ReadGetReadQualities ( NGS_Read * self, ctx_t ctx, uint64_t offset, uint64_t length );
+
+
+/* NumFragments
+ */
+uint32_t NGS_ReadNumFragments ( NGS_Read * self, ctx_t ctx );
+
+
+/* FragIsAligned
+ */
+bool NGS_ReadFragIsAligned ( NGS_Read * self, ctx_t ctx, uint32_t frag_idx );
+
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadIterator
+ */
+
+/* Next
+ */
+bool NGS_ReadIteratorNext ( NGS_Read * self, ctx_t ctx );
+
+/* GetCount
+ */
+uint64_t NGS_ReadIteratorGetCount ( const NGS_Read * self, ctx_t ctx );
+
+
+/*--------------------------------------------------------------------------
+ * implementation details
+ */
+struct NGS_Read
+{
+    NGS_Fragment dad;
+};
+
+typedef struct NGS_Read_vt NGS_Read_vt;
+struct NGS_Read_vt
+{
+    NGS_Fragment_vt dad;
+
+    /* Read interface */
+    struct NGS_String *     ( * get_id )            ( NGS_READ * self, ctx_t ctx );
+    struct NGS_String *     ( * get_name )          ( NGS_READ * self, ctx_t ctx );
+    struct NGS_String *     ( * get_read_group )    ( NGS_READ * self, ctx_t ctx );
+    enum NGS_ReadCategory   ( * get_category )      ( const NGS_READ * self, ctx_t ctx );
+    struct NGS_String *     ( * get_sequence )      ( NGS_READ * self, ctx_t ctx, uint64_t offset, uint64_t length );
+    struct NGS_String *     ( * get_qualities )     ( NGS_READ * self, ctx_t ctx, uint64_t offset, uint64_t length );
+    uint32_t                ( * get_num_fragments ) ( NGS_READ * self, ctx_t ctx );
+    bool                    ( * frag_is_aligned )   ( NGS_READ * self, ctx_t ctx, uint32_t frag_idx );
+
+    /* ReadIterator interface */
+    bool ( * next ) ( NGS_READ * self, ctx_t ctx );
+    uint64_t ( * get_count ) ( const NGS_READ * self, ctx_t ctx );
+    
+};
+
+/* Init
+ */
+void NGS_ReadInit ( ctx_t ctx, NGS_Read * read,
+    const NGS_Read_vt * vt, const char *clsname, const char *instname );
+void NGS_ReadIteratorInit ( ctx_t ctx, NGS_Read * read,
+    const NGS_Read_vt * vt, const char *clsname, const char *instname );
+
+/* NullRead
+ * will error out on any call
+ */
+struct NGS_Read * NGS_ReadMakeNull ( ctx_t ctx, const struct NGS_String * spec );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_read_ */
diff --git a/libs/ngs/NGS_ReadCollection.c b/libs/ngs/NGS_ReadCollection.c
new file mode 100644
index 0000000..7f70e63
--- /dev/null
+++ b/libs/ngs/NGS_ReadCollection.c
@@ -0,0 +1,674 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_ReadCollection.h"
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/Refcount.h>
+#include <ngs/itf/ReadCollectionItf.h>
+
+#include "NGS_String.h"
+#include "NGS_ReadGroup.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <kfg/kfg-priv.h>
+#include <kfg/repository.h>
+
+#include <vdb/vdb-priv.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <sra/sraschema.h>
+
+#include <stddef.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadCollection_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_ReadCollection* ) ( obj ) )
+
+static NGS_String_v1 * NGS_ReadCollection_v1_get_name ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_ReadCollectionGetName ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static struct NGS_ReadGroup_v1 * NGS_ReadCollection_v1_get_read_groups ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_ReadGroup * ret = NGS_ReadCollectionGetReadGroups ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_ReadGroup_v1 * ) ret;
+}
+
+static bool NGS_ReadCollection_v1_has_read_group ( const NGS_ReadCollection_v1 * self, const char * spec )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    bool ret = NGS_ReadCollectionHasReadGroup ( Self ( self ), ctx, spec );
+    CLEAR ();
+    return ret;
+}
+
+static struct NGS_ReadGroup_v1 * NGS_ReadCollection_v1_get_read_group ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err, const char * spec )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_ReadGroup * ret = NGS_ReadCollectionGetReadGroup ( Self ( self ), ctx, spec ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_ReadGroup_v1 * ) ret;
+}
+
+static struct NGS_Reference_v1 * NGS_ReadCollection_v1_get_references ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Reference * ret = NGS_ReadCollectionGetReferences ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Reference_v1 * ) ret;
+}
+
+static bool NGS_ReadCollection_v1_has_reference ( const NGS_ReadCollection_v1 * self, const char * spec )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    bool ret = NGS_ReadCollectionHasReference ( Self ( self ), ctx, spec );
+    CLEAR ();
+    return ret;
+}
+
+static struct NGS_Reference_v1 * NGS_ReadCollection_v1_get_reference ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err, const char * spec )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Reference * ret = NGS_ReadCollectionGetReference ( Self ( self ), ctx, spec ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Reference_v1 * ) ret;
+}
+
+static struct NGS_Alignment_v1 * NGS_ReadCollection_v1_get_alignment ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err, const char * alignmentId )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Alignment * ret = NGS_ReadCollectionGetAlignment ( Self ( self ), ctx, alignmentId ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Alignment_v1 * ) ret;
+}
+
+static struct NGS_Alignment_v1 * NGS_ReadCollection_v1_get_alignments ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err, bool wants_primary, bool wants_secondary )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Alignment * ret = NGS_ReadCollectionGetAlignments ( Self ( self ), ctx, wants_primary, wants_secondary ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Alignment_v1 * ) ret;
+}
+
+static uint64_t NGS_ReadCollection_v1_get_align_count ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err, bool wants_primary, bool wants_secondary )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint64_t ret = NGS_ReadCollectionGetAlignmentCount ( Self ( self ), ctx, wants_primary, wants_secondary ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static struct NGS_Alignment_v1 * NGS_ReadCollection_v1_get_align_range ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err, uint64_t first, uint64_t count, bool wants_primary, bool wants_secondary )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Alignment * ret = NGS_ReadCollectionGetAlignmentRange ( Self ( self ), ctx, first, count, wants_primary, wants_secondary ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Alignment_v1 * ) ret;
+}
+
+static struct NGS_Read_v1 * NGS_ReadCollection_v1_get_read ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err, const char * readId )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Read * ret = NGS_ReadCollectionGetRead ( Self ( self ), ctx, readId ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Read_v1 * ) ret;
+}
+
+static struct NGS_Read_v1 * NGS_ReadCollection_v1_get_reads ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err, bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Read * ret = NGS_ReadCollectionGetReads ( Self ( self ), ctx, wants_full, wants_partial, wants_unaligned ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Read_v1 * ) ret;
+}
+
+static uint64_t NGS_ReadCollection_v1_get_read_count ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err, bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint64_t ret = NGS_ReadCollectionGetReadCount ( Self ( self ), ctx, wants_full, wants_partial, wants_unaligned ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+struct NGS_Read_v1 * NGS_ReadCollection_v1_read_range ( const NGS_ReadCollection_v1 * self, NGS_ErrBlock_v1 * err, uint64_t first, uint64_t count, bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Read * ret = NGS_ReadCollectionGetReadRange ( Self ( self ), ctx, first, count, wants_full, wants_partial, wants_unaligned ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Read_v1 * ) ret;
+}
+
+#undef Self
+
+
+NGS_ReadCollection_v1_vt ITF_ReadCollection_vt =
+{
+    {
+        "NGS_ReadCollection",
+        "NGS_ReadCollection_v1",
+        1,
+        & ITF_Refcount_vt . dad
+    },
+
+    /* v1.0 */
+    NGS_ReadCollection_v1_get_name,
+    NGS_ReadCollection_v1_get_read_groups,
+    NGS_ReadCollection_v1_get_read_group,
+    NGS_ReadCollection_v1_get_references,
+    NGS_ReadCollection_v1_get_reference,
+    NGS_ReadCollection_v1_get_alignment,
+    NGS_ReadCollection_v1_get_alignments,
+    NGS_ReadCollection_v1_get_align_count,
+    NGS_ReadCollection_v1_get_align_range,
+    NGS_ReadCollection_v1_get_read,
+    NGS_ReadCollection_v1_get_reads,
+    NGS_ReadCollection_v1_get_read_count,
+	NGS_ReadCollection_v1_read_range,
+
+    /* v1.1 */
+	NGS_ReadCollection_v1_has_read_group,
+	NGS_ReadCollection_v1_has_reference
+};
+
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadCollection
+ */
+
+#define VT( self, msg ) \
+    ( ( ( const NGS_ReadCollection_vt* ) ( self ) -> dad . vt ) -> msg )
+
+/* GetName
+ */
+struct NGS_String * NGS_ReadCollectionGetName ( NGS_ReadCollection * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get name" );
+    }
+    else
+    {
+        return VT ( self, get_name ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+
+/* READ GROUPS
+ */
+struct NGS_ReadGroup * NGS_ReadCollectionGetReadGroups ( NGS_ReadCollection * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read group iterator" );
+    }
+    else
+    {
+        return VT ( self, get_read_groups ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+bool NGS_ReadCollectionHasReadGroup ( NGS_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    if ( self == NULL )
+        INTERNAL_WARNING ( xcSelfNull, "failed to get read group '%.128s'", spec );
+    else if ( spec == NULL )
+        INTERNAL_WARNING ( xcParamNull, "read group spec" );
+    else
+    {
+        POP_CTX ( ctx );
+        return VT ( self, has_read_group ) ( self, ctx, spec [ 0 ] == 0 ? DEFAULT_READGROUP_NAME : spec );
+    }
+
+    return false;
+}
+
+struct NGS_ReadGroup * NGS_ReadCollectionGetReadGroup ( NGS_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read group '%.128s'", spec );
+    else if ( spec == NULL )
+        INTERNAL_ERROR ( xcParamNull, "read group spec" );
+    else
+    {
+        POP_CTX ( ctx );
+        return VT ( self, get_read_group ) ( self, ctx, spec [ 0 ] == 0 ? DEFAULT_READGROUP_NAME : spec );
+    }
+
+    return NULL;
+}
+
+
+/* REFERENCES
+ */
+struct NGS_Reference * NGS_ReadCollectionGetReferences ( NGS_ReadCollection * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get reference iterator" );
+    }
+    else
+    {
+        return VT ( self, get_references ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+bool NGS_ReadCollectionHasReference ( NGS_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    if ( self == NULL )
+        INTERNAL_WARNING ( xcSelfNull, "failed to get reference '%.128s'", spec );
+    else if ( spec == NULL )
+        INTERNAL_WARNING ( xcParamNull, "reference spec" );
+    else if ( spec [ 0 ] == 0 )
+        INTERNAL_WARNING ( xcStringEmpty, "reference spec" );
+    else
+    {
+        POP_CTX ( ctx );
+        return VT ( self, has_reference ) ( self, ctx, spec );
+    }
+
+    return false;
+}
+
+struct NGS_Reference * NGS_ReadCollectionGetReference ( NGS_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get reference '%.128s'", spec );
+    else if ( spec == NULL )
+        INTERNAL_ERROR ( xcParamNull, "reference spec" );
+    else if ( spec [ 0 ] == 0 )
+        INTERNAL_ERROR ( xcStringEmpty, "reference spec" );
+    else
+    {
+        POP_CTX ( ctx );
+        return VT ( self, get_reference ) ( self, ctx, spec );
+    }
+
+    return NULL;
+}
+
+
+/* ALIGNMENTS
+ */
+struct NGS_Alignment * NGS_ReadCollectionGetAlignments ( NGS_ReadCollection * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignment iterator" );
+    }
+    else
+    {
+        return VT ( self, get_alignments ) ( self, ctx, wants_primary, wants_secondary );
+    }
+
+    return NULL;
+}
+
+struct NGS_Alignment * NGS_ReadCollectionGetAlignment ( NGS_ReadCollection * self, ctx_t ctx, const char * alignmentId )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignment '%.128s'", alignmentId );
+    else if ( alignmentId == NULL )
+        INTERNAL_ERROR ( xcParamNull, "alignment id" );
+    else if ( alignmentId [ 0 ] == 0 )
+        INTERNAL_ERROR ( xcStringEmpty, "alignment id" );
+    else
+    {
+        return VT ( self, get_alignment ) ( self, ctx, alignmentId );
+    }
+
+    return NULL;
+}
+
+uint64_t NGS_ReadCollectionGetAlignmentCount ( NGS_ReadCollection * self, ctx_t ctx, bool wants_primary, bool wants_secondary )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignment count" );
+    }
+    else
+    {
+        return VT ( self, get_alignment_count ) ( self, ctx, wants_primary, wants_secondary );
+    }
+
+    return 0;
+}
+
+struct NGS_Alignment * NGS_ReadCollectionGetAlignmentRange ( NGS_ReadCollection * self, ctx_t ctx, uint64_t first, uint64_t count,
+    bool wants_primary, bool wants_secondary )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read range first = %lu count = %lu", first, count );
+    }
+    else
+    {
+        return VT ( self, get_alignment_range ) ( self, ctx, first, count, wants_primary, wants_secondary );
+    }
+
+    return NULL;
+}
+
+/* READS
+ */
+struct NGS_Read * NGS_ReadCollectionGetReads ( NGS_ReadCollection * self, ctx_t ctx,
+    bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read iterator" );
+    }
+    else
+    {
+        return VT ( self, get_reads ) ( self, ctx, wants_full, wants_partial, wants_unaligned );
+    }
+
+    return NULL;
+}
+
+struct NGS_Read * NGS_ReadCollectionGetRead ( NGS_ReadCollection * self, ctx_t ctx, const char * readId )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read '%.128s'", readId );
+    else if ( readId == NULL )
+        INTERNAL_ERROR ( xcParamNull, "read id" );
+    else if ( readId [ 0 ] == 0 )
+        INTERNAL_ERROR ( xcStringEmpty, "read id" );
+    else
+    {
+        return VT ( self, get_read ) ( self, ctx, readId );
+    }
+
+    return NULL;
+}
+
+uint64_t NGS_ReadCollectionGetReadCount ( NGS_ReadCollection * self, ctx_t ctx,
+    bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read count" );
+    }
+    else
+    {
+        return VT ( self, get_read_count ) ( self, ctx, wants_full, wants_partial, wants_unaligned );
+    }
+
+    return 0;
+}
+
+struct NGS_Read * NGS_ReadCollectionGetReadRange ( NGS_ReadCollection * self, ctx_t ctx, uint64_t first, uint64_t count,
+        bool wants_full, bool wants_partial, bool wants_unaligned  )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read range first = %lu count = %lu", first, count );
+    }
+    else
+    {
+        return VT ( self, get_read_range ) ( self, ctx, first, count, wants_full, wants_partial, wants_unaligned );
+    }
+
+    return NULL;
+}
+
+struct NGS_Statistics* NGS_ReadCollectionGetStatistics ( NGS_ReadCollection * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get statistics" );
+    }
+    else
+    {
+        return VT ( self, get_statistics ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+struct NGS_FragmentBlobIterator* NGS_ReadCollectionGetFragmentBlobs ( NGS_ReadCollection * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get fragment blobs" );
+    }
+    else
+    {
+        return VT ( self, get_frag_blobs ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+
+/* Make
+ *  use provided specification to create an object
+ *  any error returns NULL as a result and sets error in ctx
+ */
+NGS_ReadCollection * NGS_ReadCollectionMake ( ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcConstructing );
+
+    if ( spec == NULL )
+        USER_ERROR ( xcParamNull, "NULL read-collection specification string" );
+    else if ( spec [ 0 ] == 0 )
+        USER_ERROR ( xcStringEmpty, "empty read-collection specification string" );
+    else
+    {
+        rc_t rc;
+        const VDatabase *db;
+        VSchema *sra_schema;
+
+        /* the first order of work is to determine what type of object is in "spec" */
+        const VDBManager * mgr = ctx -> rsrc -> vdb;
+        assert ( mgr != NULL );
+
+        /* try as VDB database */
+        rc = VDBManagerOpenDBRead ( mgr, & db, NULL, "%s", spec );
+        if ( rc == 0 )
+        {
+            /* test for cSRA */
+            if ( VDatabaseIsCSRA ( db ) )
+                return NGS_ReadCollectionMakeCSRA ( ctx, db, spec );
+
+            /* non-aligned */
+            return NGS_ReadCollectionMakeVDatabase ( ctx, db, spec );
+        }
+
+        /* try as VDB table */
+        rc = VDBManagerMakeSRASchema ( mgr, & sra_schema );
+        if ( rc != 0 )
+            INTERNAL_ERROR ( xcUnexpected, "failed to make default SRA schema: rc = %R", rc );
+        else
+        {
+            const VTable *tbl;
+            rc = VDBManagerOpenTableRead ( mgr, & tbl, sra_schema, "%s", spec );
+            VSchemaRelease ( sra_schema );
+
+            if ( rc == 0 )
+            {   /* VDB-2641: examine the schema name to make sure this is an SRA table */
+                char ts_buff[1024];
+                rc = VTableTypespec ( tbl, ts_buff, sizeof ( ts_buff ) );
+                if ( rc != 0 )
+                {
+                    INTERNAL_ERROR ( xcUnexpected, "VTableTypespec failed: rc = %R", rc );
+                }
+                else
+                {
+                    const char SRA_PREFIX[] = "NCBI:SRA:";
+                    size_t pref_size = sizeof ( SRA_PREFIX ) - 1;
+                    if ( string_match ( SRA_PREFIX, pref_size, ts_buff, string_size ( ts_buff ), pref_size, NULL ) == pref_size )
+                    {
+                        return NGS_ReadCollectionMakeVTable ( ctx, tbl, spec );
+                    }
+                    USER_ERROR ( xcTableOpenFailed, "Cannot open accession '%s' as an SRA table.", spec );
+                }
+            }
+            else
+            {
+                KConfig* kfg = NULL;
+                const KRepositoryMgr* repoMgr = NULL;
+                if ( KConfigMakeLocal ( & kfg, NULL ) != 0 ||
+                     KConfigMakeRepositoryMgrRead ( kfg, & repoMgr ) != 0 ||
+                     KRepositoryMgrHasRemoteAccess ( repoMgr ) )
+                {
+                    USER_ERROR ( xcTableOpenFailed, "Cannot open accession '%s', rc = %R", spec, rc );
+                }
+                else
+                {
+                    USER_ERROR ( xcTableOpenFailed, "Cannot open accession '%s', rc = %R. Note: remote access is disabled in the configuration.", spec, rc );
+                }
+                KRepositoryMgrRelease ( repoMgr );
+                KConfigRelease ( kfg );
+            }
+            VTableRelease ( tbl );
+        }
+    }
+
+    return NULL;
+}
+
+/* Init
+ */
+void NGS_ReadCollectionInit ( ctx_t ctx, NGS_ReadCollection * ref,
+    const NGS_ReadCollection_vt *vt, const char *clsname, const char *instname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcConstructing );
+    TRY ( NGS_RefcountInit ( ctx, & ref -> dad, & ITF_ReadCollection_vt . dad, & vt -> dad, clsname, instname ) )
+    {
+        assert ( vt -> get_name != NULL );
+        assert ( vt -> get_read_groups != NULL );
+        assert ( vt -> has_read_group != NULL );
+        assert ( vt -> get_read_group != NULL );
+        assert ( vt -> get_references != NULL );
+        assert ( vt -> has_reference != NULL );
+        assert ( vt -> get_reference != NULL );
+        assert ( vt -> get_alignments != NULL );
+        assert ( vt -> get_alignment != NULL );
+        assert ( vt -> get_alignment_count != NULL );
+        assert ( vt -> get_alignment_range != NULL );
+        assert ( vt -> get_reads != NULL );
+        assert ( vt -> get_read != NULL );
+        assert ( vt -> get_read_range != NULL );
+        assert ( vt -> get_read_count != NULL );
+        assert ( vt -> get_statistics != NULL );
+        assert ( vt -> get_frag_blobs != NULL );
+    }
+}
diff --git a/libs/ngs/NGS_ReadCollection.h b/libs/ngs/NGS_ReadCollection.h
new file mode 100644
index 0000000..d67848b
--- /dev/null
+++ b/libs/ngs/NGS_ReadCollection.h
@@ -0,0 +1,194 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_read_collection_
+#define _h_ngs_read_collection_
+
+typedef struct NGS_ReadCollection NGS_ReadCollection;
+#ifndef NGS_READCOLLECTION
+#define NGS_READCOLLECTION NGS_ReadCollection
+#endif
+
+#ifndef _h_NGS_Refcount_
+    #ifndef NGS_REFCOUNT
+    #define NGS_REFCOUNT NGS_READCOLLECTION
+    #endif
+#include "NGS_Refcount.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VDatabase;
+struct VTable;
+struct NGS_Read;
+struct NGS_String;
+struct NGS_ReadCollection_v1_vt;
+extern struct NGS_ReadCollection_v1_vt ITF_ReadCollection_vt;
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadCollection
+ */
+
+/* ToRefcount
+ *  inline cast that preserves const
+ */
+#define NGS_ReadCollectionToRefcount( self ) \
+    ( & ( self ) -> dad )
+
+/* Release
+ *  release reference
+ */
+#define NGS_ReadCollectionRelease( self, ctx ) \
+    NGS_RefcountRelease ( NGS_ReadCollectionToRefcount ( self ), ctx )
+
+/* Duplicate
+ *  duplicate reference
+ */
+#define NGS_ReadCollectionDuplicate( self, ctx ) \
+    ( ( NGS_ReadCollection* ) NGS_RefcountDuplicate ( NGS_ReadCollectionToRefcount ( self ), ctx ) )
+
+/* Make
+ *  use provided specification to create an object
+ *  any error returns NULL as a result and sets error in ctx
+ */
+NGS_ReadCollection * NGS_ReadCollectionMake ( ctx_t ctx, const char * spec );
+
+/* additional make functions
+ *  use provided specification to create an object
+ *  any error returns NULL as a result and sets error in ctx
+ */
+NGS_ReadCollection * NGS_ReadCollectionMakeCSRA ( ctx_t ctx, struct VDatabase const *db, const char * spec );
+NGS_ReadCollection * NGS_ReadCollectionMakeVDatabase ( ctx_t ctx, struct VDatabase const *db, const char * spec );
+NGS_ReadCollection * NGS_ReadCollectionMakeVTable ( ctx_t ctx, struct VTable const *tbl, const char * spec );
+
+
+/* GetName
+ */
+struct NGS_String * NGS_ReadCollectionGetName ( NGS_ReadCollection * self, ctx_t ctx );
+
+
+/* READ GROUPS
+ */
+struct NGS_ReadGroup * NGS_ReadCollectionGetReadGroups ( NGS_ReadCollection * self, ctx_t ctx );
+bool NGS_ReadCollectionHasReadGroup ( NGS_ReadCollection * self, ctx_t ctx, const char * spec );
+struct NGS_ReadGroup * NGS_ReadCollectionGetReadGroup ( NGS_ReadCollection * self, ctx_t ctx, const char * spec );
+
+
+/* REFERENCES
+ */
+struct NGS_Reference * NGS_ReadCollectionGetReferences ( NGS_ReadCollection * self, ctx_t ctx );
+bool NGS_ReadCollectionHasReference ( NGS_ReadCollection * self, ctx_t ctx, const char * spec );
+struct NGS_Reference * NGS_ReadCollectionGetReference ( NGS_ReadCollection * self, ctx_t ctx, const char * spec );
+
+
+/* ALIGNMENTS
+ */
+struct NGS_Alignment * NGS_ReadCollectionGetAlignments ( NGS_ReadCollection * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary );
+struct NGS_Alignment * NGS_ReadCollectionGetAlignment ( NGS_ReadCollection * self, ctx_t ctx, const char * alignmentId );
+
+uint64_t NGS_ReadCollectionGetAlignmentCount ( NGS_ReadCollection * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary );
+
+struct NGS_Alignment * NGS_ReadCollectionGetAlignmentRange ( NGS_ReadCollection * self, ctx_t ctx, uint64_t first, uint64_t count,
+    bool wants_primary, bool wants_secondary );
+
+/* READS
+ */
+struct NGS_Read * NGS_ReadCollectionGetRead ( NGS_ReadCollection * self, ctx_t ctx, const char * readId );
+struct NGS_Read * NGS_ReadCollectionGetReads ( NGS_ReadCollection * self, ctx_t ctx,
+    bool wants_full, bool wants_partial, bool wants_unaligned );
+
+uint64_t NGS_ReadCollectionGetReadCount ( NGS_ReadCollection * self, ctx_t ctx,
+    bool wants_full, bool wants_partial, bool wants_unaligned );
+
+struct NGS_Read * NGS_ReadCollectionGetReadRange ( NGS_ReadCollection * self,
+                                                   ctx_t ctx,
+                                                   uint64_t first,
+                                                   uint64_t count,
+                                                   bool wants_full,
+                                                   bool wants_partial,
+                                                   bool wants_unaligned );
+
+/* STATISTICS
+ */
+struct NGS_Statistics* NGS_ReadCollectionGetStatistics ( NGS_ReadCollection * self, ctx_t ctx );
+
+/* FRAGMENT BLOBS
+ */
+struct NGS_FragmentBlobIterator* NGS_ReadCollectionGetFragmentBlobs ( NGS_ReadCollection * self, ctx_t ctx );
+
+/*--------------------------------------------------------------------------
+ * implementation details
+ */
+struct NGS_ReadCollection
+{
+    NGS_Refcount dad;
+};
+
+typedef struct NGS_ReadCollection_vt NGS_ReadCollection_vt;
+struct NGS_ReadCollection_vt
+{
+    NGS_Refcount_vt dad;
+
+    struct NGS_String*      ( * get_name )              ( NGS_READCOLLECTION * self, ctx_t ctx );
+    struct NGS_ReadGroup*   ( * get_read_groups )       ( NGS_READCOLLECTION * self, ctx_t ctx );
+           bool             ( * has_read_group )        ( NGS_READCOLLECTION * self, ctx_t ctx, const char * spec );
+    struct NGS_ReadGroup*   ( * get_read_group )        ( NGS_READCOLLECTION * self, ctx_t ctx, const char * spec );
+    struct NGS_Reference*   ( * get_references )        ( NGS_READCOLLECTION * self, ctx_t ctx );
+           bool             ( * has_reference )         ( NGS_READCOLLECTION * self, ctx_t ctx, const char * spec );
+    struct NGS_Reference*   ( * get_reference )         ( NGS_READCOLLECTION * self, ctx_t ctx, const char * spec );
+    struct NGS_Alignment*   ( * get_alignments )        ( NGS_READCOLLECTION * self, ctx_t ctx, bool wants_primary, bool wants_secondary );
+    struct NGS_Alignment*   ( * get_alignment )         ( NGS_READCOLLECTION * self, ctx_t ctx, const char * alignmentId );
+    uint64_t                ( * get_alignment_count )   ( NGS_READCOLLECTION * self, ctx_t ctx, bool wants_primary, bool wants_secondary );
+    struct NGS_Alignment*   ( * get_alignment_range )   ( NGS_READCOLLECTION * self, ctx_t ctx, uint64_t first, uint64_t count, bool wants_primary, bool wants_secondary );
+    struct NGS_Read*        ( * get_reads )             ( NGS_READCOLLECTION * self, ctx_t ctx, bool wants_full, bool wants_partial, bool wants_unaligned );
+    struct NGS_Read*        ( * get_read )              ( NGS_READCOLLECTION * self, ctx_t ctx, const char * readId );
+    uint64_t                ( * get_read_count )        ( NGS_READCOLLECTION * self, ctx_t ctx,
+        bool wants_full, bool wants_partial, bool wants_unaligned );
+    struct NGS_Read*        ( * get_read_range )        ( NGS_READCOLLECTION * self, ctx_t ctx, uint64_t first, uint64_t count, bool wants_full, bool wants_partial, bool wants_unaligned );
+    struct NGS_Statistics*  ( * get_statistics )        ( NGS_READCOLLECTION * self, ctx_t ctx );
+
+    struct NGS_FragmentBlobIterator *  ( * get_frag_blobs ) ( NGS_READCOLLECTION * self, ctx_t ctx );
+};
+
+
+/* Init
+ */
+void NGS_ReadCollectionInit ( ctx_t ctx, NGS_ReadCollection * ref,
+    const NGS_ReadCollection_vt *vt, const char *clsname, const char *instname );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_read_collection_ */
diff --git a/libs/ngs/NGS_ReadGroup.c b/libs/ngs/NGS_ReadGroup.c
new file mode 100644
index 0000000..d073503
--- /dev/null
+++ b/libs/ngs/NGS_ReadGroup.c
@@ -0,0 +1,229 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_ReadGroup.h"
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/Refcount.h>
+#include <ngs/itf/ReadGroupItf.h>
+
+#include "NGS_String.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <klib/text.h>
+
+#include <vdb/vdb-priv.h>
+
+#include <stddef.h>
+#include <assert.h>
+#include <string.h>
+
+#include <sysalloc.h>
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadGroup_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_ReadGroup* ) ( obj ) )
+    
+static NGS_String_v1 * ITF_ReadGroup_v1_get_name ( const NGS_ReadGroup_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_ReadGroupGetName ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static struct NGS_Statistics_v1 * ITF_ReadGroup_v1_get_stats ( const NGS_ReadGroup_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Statistics * ret = NGS_ReadGroupGetStatistics ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Statistics_v1 * ) ret;
+}
+
+static bool ITF_ReadGroup_v1_next ( NGS_ReadGroup_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_ReadGroupIteratorNext ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+#undef Self
+
+
+NGS_ReadGroup_v1_vt ITF_ReadGroup_vt =
+{
+    {
+        "NGS_ReadGroup",
+        "NGS_ReadGroup_v1",
+        0,
+        & ITF_Refcount_vt . dad
+    },
+
+    ITF_ReadGroup_v1_get_name,
+    ITF_ReadGroup_v1_get_stats,
+    ITF_ReadGroup_v1_next
+};
+
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadGroup
+ */
+
+#define VT( self, msg ) \
+    ( ( ( const NGS_ReadGroup_vt* ) ( self ) -> dad . vt ) -> msg )
+
+/* Init
+*/    
+void NGS_ReadGroupInit ( ctx_t ctx, NGS_ReadGroup * self, NGS_ReadGroup_vt * vt, const char *clsname, const char *instname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcRow, rcConstructing );
+    
+    TRY ( NGS_RefcountInit ( ctx, & self -> dad, & ITF_ReadGroup_vt . dad, & vt -> dad, clsname, instname ) )
+    {
+        assert ( vt -> get_name != NULL );
+        assert ( vt -> get_reads != NULL );
+        assert ( vt -> get_read != NULL );
+        assert ( vt -> get_statistics != NULL );
+        assert ( vt -> get_next != NULL );
+    }
+}
+    
+/* GetName
+ */
+struct NGS_String * NGS_ReadGroupGetName ( const NGS_ReadGroup * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get name" );
+    }
+    else
+    {
+        NGS_String* ret = VT ( self, get_name ) ( self, ctx );
+        if ( ret != NULL && string_cmp ( DEFAULT_READGROUP_NAME, 
+                                         strlen ( DEFAULT_READGROUP_NAME ), 
+                                         NGS_StringData ( ret, ctx ),
+                                         NGS_StringSize ( ret, ctx ),
+                                         ( uint32_t ) NGS_StringSize ( ret, ctx ) ) == 0 )
+        {
+            NGS_String* tmp = ret;
+            ret = NGS_StringSubstrOffsetSize ( ret, ctx, 0, 0 );
+            NGS_StringRelease ( tmp, ctx );
+        }
+        return ret;
+    }
+
+    return NULL;
+}
+
+#if READ_GROUP_SUPPORTS_READS
+struct NGS_Read * NGS_ReadGroupGetReads ( const NGS_ReadGroup * self, ctx_t ctx,
+    bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read iterator" );
+    }
+    else
+    {
+        return VT ( self, get_reads ) ( self, ctx, wants_full, wants_partial, wants_unaligned );
+    }
+
+    return NULL;
+}
+
+struct NGS_Read * NGS_ReadGroupGetRead ( const NGS_ReadGroup * self, ctx_t ctx, const char * readId )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get read %ld", readId );
+    }
+    else
+    {
+        return VT ( self, get_read ) ( self, ctx, readId );
+    }
+
+    return NULL;
+}
+#endif
+
+struct NGS_Statistics* NGS_ReadGroupGetStatistics ( const NGS_ReadGroup * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get statistics" );
+    }
+    else
+    {
+        return VT ( self, get_statistics ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadGroupIterator
+ */
+
+bool NGS_ReadGroupIteratorNext ( NGS_ReadGroup* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get next read group " );
+    }
+    else
+    {
+        return VT ( self, get_next) ( self, ctx );
+    }
+
+    return false;
+}
+
diff --git a/libs/ngs/NGS_ReadGroup.h b/libs/ngs/NGS_ReadGroup.h
new file mode 100644
index 0000000..de4ef56
--- /dev/null
+++ b/libs/ngs/NGS_ReadGroup.h
@@ -0,0 +1,127 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_read_group_
+#define _h_ngs_read_group_
+
+typedef struct NGS_ReadGroup NGS_ReadGroup;
+#ifndef NGS_READGROUP
+#define NGS_READGROUP NGS_ReadGroup
+#endif
+
+#ifndef _h_ngs_refcount_
+#define NGS_REFCOUNT NGS_READGROUP
+#include "NGS_Refcount.h"
+#endif
+
+#define READ_GROUP_SUPPORTS_READS 0
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+struct NGS_String;
+struct NGS_Read;
+struct NGS_Statistics;
+struct NGS_ReadGroup_v1_vt;
+extern struct NGS_ReadGroup_v1_vt ITF_ReadGroup_vt;
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadGroup
+ */
+ 
+#define DEFAULT_READGROUP_NAME "default"
+
+/* ToRefcount
+ *  inline cast that preserves const
+ */
+#define NGS_ReadGroupToRefcount( self ) \
+    ( & ( self ) -> dad )
+
+/* Release
+ *  release reference
+ */
+#define NGS_ReadGroupRelease( self, ctx ) \
+    NGS_RefcountRelease ( NGS_ReadGroupToRefcount ( self ), ctx )
+
+/* Duplicate
+ *  duplicate reference
+ */
+#define NGS_ReadGroupDuplicate( self, ctx ) \
+    ( ( NGS_ReadGroup* ) NGS_RefcountDuplicate ( NGS_ReadGroupToRefcount ( self ), ctx ) )
+ 
+struct NGS_String* NGS_ReadGroupGetName ( const NGS_ReadGroup * self, ctx_t ctx );
+
+#if READ_GROUP_SUPPORTS_READS
+struct NGS_Read* NGS_ReadGroupGetRead ( const NGS_ReadGroup * self, ctx_t ctx, const char * readId );
+
+struct NGS_Read* NGS_ReadGroupGetReads ( const NGS_ReadGroup * self, ctx_t ctx, bool wants_full, bool wants_partial, bool wants_unaligned );
+#endif
+
+struct NGS_Statistics* NGS_ReadGroupGetStatistics ( const NGS_ReadGroup * self, ctx_t ctx );
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadGroupIterator
+ */
+
+/* Next
+ */
+bool NGS_ReadGroupIteratorNext ( NGS_ReadGroup * self, ctx_t ctx );
+
+
+/*--------------------------------------------------------------------------
+ * implementation details
+ */
+struct NGS_ReadGroup
+{
+    NGS_Refcount dad;
+};
+
+typedef struct NGS_ReadGroup_vt NGS_ReadGroup_vt;
+struct NGS_ReadGroup_vt
+{
+    NGS_Refcount_vt dad;
+
+    struct NGS_String*      ( * get_name )          ( const NGS_READGROUP * self, ctx_t ctx );
+    struct NGS_Read*        ( * get_reads )         ( const NGS_READGROUP * self, ctx_t ctx, bool wants_full, bool wants_partial, bool wants_unaligned );
+    struct NGS_Read*        ( * get_read )          ( const NGS_READGROUP * self, ctx_t ctx, const char * readId );
+    struct NGS_Statistics*  ( * get_statistics )    ( const NGS_READGROUP * self, ctx_t ctx );
+    bool                    ( * get_next )          ( NGS_READGROUP * self, ctx_t ctx );
+};
+
+/* Init
+*/
+void NGS_ReadGroupInit ( ctx_t ctx, struct NGS_ReadGroup * self, NGS_ReadGroup_vt * vt, const char *clsname, const char *instname );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_read_group_ */
diff --git a/libs/ngs/NGS_Refcount.c b/libs/ngs/NGS_Refcount.c
new file mode 100644
index 0000000..96890e0
--- /dev/null
+++ b/libs/ngs/NGS_Refcount.c
@@ -0,0 +1,182 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_Refcount.h"
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/refcount.h>
+
+#include <ngs/itf/Refcount.h>
+#include "NGS_ErrBlock.h"
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+
+/*--------------------------------------------------------------------------
+ * NGS_Refcount
+ */
+
+
+/* Whack
+ */
+static
+void NGS_RefcountWhack ( NGS_Refcount * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcRefcount, rcDestroying );
+
+    assert ( self -> vt != NULL );
+    assert ( self -> vt -> whack != NULL );
+
+    ( * self -> vt -> whack ) ( self, ctx );
+
+    free ( self );
+}
+
+
+/* Release
+ *  release reference
+ */
+void NGS_RefcountRelease ( const NGS_Refcount * self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "NGS_Refcount" ) )
+        {
+        case krefOkay:
+            break;
+        case krefWhack:
+            NGS_RefcountWhack ( ( NGS_Refcount* ) self, ctx );
+            break;
+        case krefNegative:
+        {
+            FUNC_ENTRY ( ctx, rcSRA, rcRefcount, rcReleasing );
+            INTERNAL_ERROR ( xcSelfZombie, "NGS object at %#p", self );
+            atomic32_set ( & ( ( NGS_Refcount* ) self ) -> refcount, 0 );
+            break;
+        }}
+    }
+}
+
+
+/* Duplicate
+ *  add 1 to reference count
+ *  return original pointer
+ */
+void * NGS_RefcountDuplicate ( const NGS_Refcount * self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "NGS_Refcount" ) )
+        {
+        case krefOkay:
+            break;
+        case krefLimit:
+        {
+            FUNC_ENTRY ( ctx, rcSRA, rcRefcount, rcAttaching );
+            INTERNAL_ERROR ( xcRefcountOutOfBounds, "NGS object at %#p", self );
+            atomic32_set ( & ( ( NGS_Refcount* ) self ) -> refcount, 0 );
+            break;
+        }}
+    }
+
+    return ( void* ) self;
+}
+
+
+/* Init
+ */
+void NGS_RefcountInit ( ctx_t ctx, NGS_Refcount * ref,
+    const NGS_VTable * ivt, const NGS_Refcount_vt * vt,
+    const char *clsname, const char *instname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcRefcount, rcConstructing );
+
+    if ( ref == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    else if ( ivt == NULL || vt == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad vt reference" );
+    else
+    {
+        assert ( vt -> whack != NULL );
+
+        ref -> ivt = ivt;
+        ref -> vt = vt;
+        KRefcountInit ( & ref -> refcount, 1, clsname, "init", instname );
+        ref -> filler = 0;
+    }
+}
+
+
+/*--------------------------------------------------------------------------
+ * NGS_Refcount_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_Refcount* ) ( obj ) )
+
+static
+void ITF_Refcount_v1_release ( NGS_Refcount_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcReleasing );
+    ON_FAIL ( NGS_RefcountRelease ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+}
+
+static
+void* ITF_Refcount_v1_duplicate ( const NGS_Refcount_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcReleasing );
+    ON_FAIL ( void * ref = NGS_RefcountDuplicate ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+
+    return ref;
+}
+
+NGS_Refcount_v1_vt ITF_Refcount_vt =
+{
+    {
+        "NGS_Refcount",
+        "NGS_Refcount_v1"
+    },
+
+    ITF_Refcount_v1_release,
+    ITF_Refcount_v1_duplicate
+};
+
+#undef Self
diff --git a/libs/ngs/NGS_Refcount.h b/libs/ngs/NGS_Refcount.h
new file mode 100644
index 0000000..9833d8c
--- /dev/null
+++ b/libs/ngs/NGS_Refcount.h
@@ -0,0 +1,102 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_refcount_
+#define _h_ngs_refcount_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards & externs
+ */
+struct NGS_VTable;
+struct NGS_Refcount_v1_vt;
+extern struct NGS_Refcount_v1_vt ITF_Refcount_vt;
+
+
+/*--------------------------------------------------------------------------
+ * NGS_Refcount
+ */
+typedef struct NGS_Refcount NGS_Refcount;
+
+/* Release
+ *  resilient to NULL self
+ */
+void NGS_RefcountRelease ( const NGS_Refcount * self, ctx_t ctx );
+
+/* Duplicate
+ *  resilient to NULL self
+ */
+void * NGS_RefcountDuplicate ( const NGS_Refcount * self, ctx_t ctx );
+
+
+/*--------------------------------------------------------------------------
+ * implementation details
+ */
+typedef struct NGS_Refcount_vt NGS_Refcount_vt;
+struct NGS_Refcount
+{
+    /* interface vtable from NGS SDK */
+    struct NGS_VTable const * ivt;
+
+    /* internal vtable for NGS polymorphism */
+    const NGS_Refcount_vt * vt;
+
+    /* the counter */
+    KRefcount refcount;
+    uint32_t filler;
+};
+
+#ifndef NGS_REFCOUNT
+#define NGS_REFCOUNT NGS_Refcount
+#endif
+
+struct NGS_Refcount_vt
+{
+    void ( * whack ) ( NGS_REFCOUNT * self, ctx_t ctx );
+};
+
+/* Init
+ */
+void NGS_RefcountInit ( ctx_t ctx, NGS_Refcount * ref,
+    struct NGS_VTable const * ivt, const NGS_Refcount_vt * vt,
+    const char *clsname, const char *instname );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_refcount_ */
diff --git a/libs/ngs/NGS_Reference.c b/libs/ngs/NGS_Reference.c
new file mode 100644
index 0000000..2fb07fe
--- /dev/null
+++ b/libs/ngs/NGS_Reference.c
@@ -0,0 +1,916 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include "NGS_Reference.h"
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/Refcount.h>
+#include <ngs/itf/ReferenceItf.h>
+
+#include "NGS_String.h"
+#include "NGS_ReadCollection.h"
+#include "NGS_Alignment.h"
+#include "NGS_Pileup.h"
+
+#include <sysalloc.h>
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+/*--------------------------------------------------------------------------
+ * NGS_Reference_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_Reference* ) ( obj ) )
+    
+static NGS_String_v1 * ITF_Reference_v1_get_cmn_name ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReferenceGetCommonName ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Reference_v1_get_canon_name ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReferenceGetCanonicalName ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static bool ITF_Reference_v1_is_circular ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_ReferenceGetIsCircular ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static uint64_t ITF_Reference_v1_get_length ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint64_t ret = NGS_ReferenceGetLength ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static NGS_String_v1 * ITF_Reference_v1_get_ref_bases ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err, uint64_t offset, uint64_t length )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReferenceGetBases ( Self ( self ), ctx, offset, length ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_Reference_v1_get_ref_chunk ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err, uint64_t offset, uint64_t length )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReferenceGetChunk ( Self ( self ), ctx, offset, length ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static uint64_t ITF_Reference_v1_get_align_count ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err, bool wants_primary, bool wants_secondary )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint64_t ret = NGS_ReferenceGetAlignmentCount ( Self ( self ), ctx, wants_primary, wants_secondary ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static struct NGS_Alignment_v1 * ITF_Reference_v1_get_alignment ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err, const char * alignmentId )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Alignment * ret = NGS_ReferenceGetAlignment ( Self ( self ), ctx, alignmentId ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Alignment_v1 * ) ret;
+}
+
+static struct NGS_Alignment_v1 * ITF_Reference_v1_get_alignments ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err, bool wants_primary, bool wants_secondary )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Alignment * ret = NGS_ReferenceGetAlignments ( Self ( self ), ctx, wants_primary, wants_secondary ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Alignment_v1 * ) ret;
+}
+
+#if _DEBUGGING
+static
+uint32_t align_flags_to_filters ( uint32_t flags )
+{
+    static bool tested_bits;
+    if ( ! tested_bits )
+    {
+        assert ( NGS_ReferenceAlignFlags_pass_bad >> 2 == NGS_AlignmentFilterBits_pass_bad );
+        assert ( NGS_ReferenceAlignFlags_pass_dups >> 2 == NGS_AlignmentFilterBits_pass_dups );
+        assert ( NGS_ReferenceAlignFlags_min_map_qual >> 2 == NGS_AlignmentFilterBits_min_map_qual );
+        assert ( NGS_ReferenceAlignFlags_max_map_qual >> 2 == NGS_AlignmentFilterBits_max_map_qual);
+        assert ( NGS_ReferenceAlignFlags_no_wraparound >> 2 == NGS_AlignmentFilterBits_no_wraparound);
+        assert ( NGS_ReferenceAlignFlags_start_within_window >> 2 == NGS_AlignmentFilterBits_start_within_window);
+        tested_bits = true;
+    }
+    return flags >> 2;
+}
+#else
+#define align_flags_to_filters( flags ) \
+    ( ( flags ) >> 2 )
+#endif
+
+static struct NGS_Alignment_v1 * ITF_Reference_v1_get_filtered_alignments ( const NGS_Reference_v1 * self, 
+                                                                            NGS_ErrBlock_v1 * err, 
+                                                                            enum NGS_ReferenceAlignFlags flags, 
+                                                                            int32_t map_qual )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    
+    bool wants_primary = ( flags & NGS_ReferenceAlignFlags_wants_primary ) != 0;
+    bool wants_secondary = ( flags & NGS_ReferenceAlignFlags_wants_secondary ) != 0;
+    uint32_t filters = align_flags_to_filters ( flags );
+    
+    /*TODO: reject unimplemented flags */
+    ON_FAIL ( struct NGS_Alignment * ret = NGS_ReferenceGetFilteredAlignments ( Self ( self ), ctx,
+        wants_primary, wants_secondary, filters, map_qual ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Alignment_v1 * ) ret;
+}
+
+static struct NGS_Alignment_v1 * ITF_Reference_v1_get_align_slice ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err, int64_t start, uint64_t length, bool wants_primary, bool wants_secondary )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Alignment * ret = NGS_ReferenceGetAlignmentSlice ( Self ( self ), ctx, start, length, wants_primary, wants_secondary ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Alignment_v1 * ) ret;
+}
+
+static struct NGS_Alignment_v1 * ITF_Reference_v1_get_filtered_align_slice ( const NGS_Reference_v1 * self, 
+                                                                             NGS_ErrBlock_v1 * err, 
+                                                                             int64_t start, 
+                                                                             uint64_t length, 
+                                                                             enum NGS_ReferenceAlignFlags flags, 
+                                                                             int32_t map_qual )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    
+    bool wants_primary = ( flags & NGS_ReferenceAlignFlags_wants_primary ) != 0;
+    bool wants_secondary = ( flags & NGS_ReferenceAlignFlags_wants_secondary ) != 0;
+    uint32_t filters = align_flags_to_filters ( flags );
+    
+    /*TODO: reject unimplemented flags */
+    ON_FAIL ( struct NGS_Alignment * ret = NGS_ReferenceGetFilteredAlignmentSlice ( Self ( self ), ctx, start, length, wants_primary, wants_secondary, filters, map_qual ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Alignment_v1 * ) ret;
+}
+
+static struct NGS_Pileup_v1 * ITF_Reference_v1_get_pileups ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err, bool wants_primary, bool wants_secondary )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Pileup * ret = NGS_ReferenceGetPileups( Self ( self ), ctx, wants_primary, wants_secondary ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Pileup_v1 * ) ret;
+}
+
+static struct NGS_Pileup_v1 * ITF_Reference_v1_get_pileup_slice ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err, int64_t start, uint64_t length, bool wants_primary, bool wants_secondary )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_Pileup * ret = NGS_ReferenceGetPileupSlice ( Self ( self ), ctx, start, length, wants_primary, wants_secondary ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Pileup_v1 * ) ret;
+}
+
+static bool ITF_Reference_v1_next ( NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_ReferenceIteratorNext ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+#if _DEBUGGING
+static
+uint32_t pileup_flags_to_filters ( uint32_t flags )
+{
+    static bool tested_bits;
+    if ( ! tested_bits )
+    {
+        assert ( NGS_ReferenceAlignFlags_pass_bad >> 2 == NGS_PileupFilterBits_pass_bad );
+        assert ( NGS_ReferenceAlignFlags_pass_dups >> 2 == NGS_PileupFilterBits_pass_dups );
+        assert ( NGS_ReferenceAlignFlags_min_map_qual >> 2 == NGS_PileupFilterBits_min_map_qual );
+        assert ( NGS_ReferenceAlignFlags_max_map_qual >> 2 == NGS_PileupFilterBits_max_map_qual);
+        assert ( NGS_ReferenceAlignFlags_no_wraparound >> 2 == NGS_PileupFilterBits_no_wraparound);
+        assert ( NGS_ReferenceAlignFlags_start_within_window >> 2 == NGS_PileupFilterBits_start_within_window);
+        tested_bits = true;
+    }
+    return flags >> 2;
+}
+#else
+#define pileup_flags_to_filters( flags ) \
+    ( ( flags ) >> 2 )
+#endif
+
+static struct NGS_Pileup_v1 * ITF_Reference_v1_get_filtered_pileups ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err,
+    uint32_t flags, int32_t map_qual )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+
+    bool wants_primary = ( flags & NGS_ReferenceAlignFlags_wants_primary ) != 0;
+    bool wants_secondary = ( flags & NGS_ReferenceAlignFlags_wants_secondary ) != 0;
+    uint32_t filters = pileup_flags_to_filters ( flags );
+
+    ON_FAIL ( struct NGS_Pileup * ret = NGS_ReferenceGetFilteredPileups ( Self ( self ), ctx, wants_primary, wants_secondary, filters, map_qual ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Pileup_v1 * ) ret;
+}
+
+static struct NGS_Pileup_v1 * ITF_Reference_v1_get_filtered_pileup_slice ( const NGS_Reference_v1 * self, NGS_ErrBlock_v1 * err,
+    int64_t start, uint64_t length, uint32_t flags, int32_t map_qual )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+
+    bool wants_primary = ( flags & NGS_ReferenceAlignFlags_wants_primary ) != 0;
+    bool wants_secondary = ( flags & NGS_ReferenceAlignFlags_wants_secondary ) != 0;
+    uint32_t filters = pileup_flags_to_filters ( flags );
+
+    ON_FAIL ( struct NGS_Pileup * ret = NGS_ReferenceGetFilteredPileupSlice ( Self ( self ), ctx, start, length, wants_primary, wants_secondary, filters, map_qual ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( struct NGS_Pileup_v1 * ) ret;
+}
+
+
+#undef Self
+
+
+NGS_Reference_v1_vt ITF_Reference_vt =
+{
+    {
+        "NGS_Reference",
+        "NGS_Reference_v1",
+        3,
+        & ITF_Refcount_vt . dad
+    },
+
+    /* 1.0 */
+    ITF_Reference_v1_get_cmn_name,
+    ITF_Reference_v1_get_canon_name,
+    ITF_Reference_v1_is_circular,
+    ITF_Reference_v1_get_length,
+    ITF_Reference_v1_get_ref_bases,
+    ITF_Reference_v1_get_ref_chunk,
+    ITF_Reference_v1_get_alignment,
+    ITF_Reference_v1_get_alignments,
+    ITF_Reference_v1_get_align_slice,
+    ITF_Reference_v1_get_pileups,
+    ITF_Reference_v1_get_pileup_slice,
+    ITF_Reference_v1_next,
+
+    /* 1.1 */
+    ITF_Reference_v1_get_filtered_pileups,
+    ITF_Reference_v1_get_filtered_pileup_slice,
+
+    /* 1.2 */
+    ITF_Reference_v1_get_align_count,
+    
+    /* 1.3 */
+    ITF_Reference_v1_get_filtered_alignments,
+    ITF_Reference_v1_get_filtered_align_slice
+};
+
+
+/*--------------------------------------------------------------------------
+ * NGS_Reference
+ */
+#define VT( self, msg ) \
+    ( ( ( const NGS_Reference_vt* ) ( self ) -> dad . vt ) -> msg )
+    
+/* Init
+*/
+void NGS_ReferenceInit ( ctx_t ctx, 
+                         struct NGS_Reference * self, 
+                         NGS_Reference_vt * vt, 
+                         const char *clsname, 
+                         const char *instname, 
+                         struct NGS_ReadCollection * coll )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcRow, rcConstructing );
+    
+    assert ( self );
+    assert ( vt );
+    
+    TRY ( NGS_RefcountInit ( ctx, & self -> dad, & ITF_Reference_vt . dad, & vt -> dad, clsname, instname ) )
+    {
+        assert ( vt -> get_common_name    != NULL );
+        assert ( vt -> get_canonical_name != NULL );
+        assert ( vt -> get_is_circular    != NULL );
+        assert ( vt -> get_length         != NULL );
+        assert ( vt -> get_bases          != NULL );
+        assert ( vt -> get_chunk          != NULL );
+        assert ( vt -> get_alignment      != NULL );
+        assert ( vt -> get_alignments     != NULL );
+        assert ( vt -> get_count          != NULL );
+        assert ( vt -> get_slice          != NULL );
+        assert ( vt -> get_pileups        != NULL );
+        assert ( vt -> get_pileup_slice   != NULL );
+        assert ( vt -> get_statistics     != NULL );
+        assert ( vt -> next               != NULL );
+    }
+    
+    assert ( coll );
+    self -> coll = NGS_ReadCollectionDuplicate ( coll, ctx );
+}
+
+void NGS_ReferenceWhack( NGS_Reference * self, ctx_t ctx )
+{
+    NGS_ReadCollectionRelease ( self -> coll, ctx );
+}
+                         
+/*--------------------------------------------------------------------------
+ * NGS_ReferenceIterator
+ */
+
+struct NGS_String * NGS_ReferenceGetCommonName ( NGS_Reference * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get common name" );
+    }
+    else
+    {
+        return VT ( self, get_common_name) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+/* GetCanonicalName
+ */
+struct NGS_String * NGS_ReferenceGetCanonicalName ( NGS_Reference * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get canonical name" );
+    }
+    else
+    {
+        return VT ( self, get_canonical_name ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+/* GetisCircular
+ */
+bool NGS_ReferenceGetIsCircular ( const NGS_Reference * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get circular" );
+    }
+    else
+    {
+        return VT ( self, get_is_circular ) ( self, ctx );
+    }
+
+    return false;
+}
+
+/* GetLength
+ */
+uint64_t NGS_ReferenceGetLength ( NGS_Reference * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get reference length" );
+    }
+    else
+    {
+        return VT ( self, get_length ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+
+/* GetBases
+ */
+struct NGS_String * NGS_ReferenceGetBases ( NGS_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get reference bases" );
+    }
+    else
+    {
+        return VT ( self, get_bases ) ( self, ctx, offset, size );
+    }
+
+    return NULL;
+}
+
+
+/* GetChunk
+ */
+struct NGS_String * NGS_ReferenceGetChunk ( NGS_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get reference chunk" );
+    }
+    else
+    {
+        return VT ( self, get_chunk ) ( self, ctx, offset, size );
+    }
+
+    return NULL;
+}
+
+
+/* GetAlignment
+ */
+struct NGS_Alignment* NGS_ReferenceGetAlignment ( NGS_Reference * self, ctx_t ctx, const char * alignmentId )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignment" );
+    }
+    else
+    {
+        return VT ( self, get_alignment ) ( self, ctx, alignmentId );
+    }
+
+    return NULL;
+}
+
+
+/* GetAlignments
+ */
+struct NGS_Alignment* NGS_ReferenceGetAlignments ( NGS_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignments" );
+    }
+    else
+    {
+        // alignment iterator does not filter out bad reads and duplicates by default
+        const uint32_t filters = NGS_AlignmentFilterBits_pass_bad | NGS_AlignmentFilterBits_pass_dups;
+        return VT ( self, get_alignments ) ( self, ctx, wants_primary, wants_secondary, filters, 0 );
+    }
+
+    return NULL;
+}
+
+/* GetFilteredAlignments
+ */
+struct NGS_Alignment* NGS_ReferenceGetFilteredAlignments ( NGS_Reference * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignments" );
+    }
+    else
+    {
+        return VT ( self, get_alignments ) ( self, ctx, wants_primary, wants_secondary, filters, map_qual );
+    }
+
+    return NULL;
+}
+
+/* GetAlignmentCount
+ */
+uint64_t NGS_ReferenceGetAlignmentCount ( NGS_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignment count" );
+    }
+    else
+    {
+        return VT ( self, get_count ) ( self, ctx, wants_primary, wants_secondary );
+    }
+
+    return 0;
+}
+
+/* GetAlignmentSlice
+ */
+struct NGS_Alignment* NGS_ReferenceGetAlignmentSlice ( NGS_Reference * self, 
+                                                       ctx_t ctx, 
+                                                       uint64_t offset, 
+                                                       uint64_t size,
+                                                       bool wants_primary, 
+                                                       bool wants_secondary )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignment slice" );
+    }
+    else
+    {
+        // alignment iterator does not filter out bad reads and duplicates by default
+        const uint32_t filters = NGS_AlignmentFilterBits_pass_bad | NGS_AlignmentFilterBits_pass_dups;
+        return VT ( self, get_slice ) ( self, ctx, offset, size, wants_primary, wants_secondary, filters, 0 );
+    }
+
+    return NULL;
+}
+
+/* GetFilteredAlignmentSlice
+ */
+struct NGS_Alignment* NGS_ReferenceGetFilteredAlignmentSlice ( NGS_Reference * self, 
+    ctx_t ctx, uint64_t offset, uint64_t size, bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get alignment slice" );
+    }
+    else
+    {
+        return VT ( self, get_slice ) ( self, ctx, offset, size, wants_primary, wants_secondary, filters, map_qual );
+    }
+
+    return NULL;
+}
+
+/* GetPileups
+ */
+struct NGS_Pileup* NGS_ReferenceGetPileups ( NGS_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get pileups" );
+    }
+    else
+    {
+        // pileup filters out bad reads and duplicates by default
+        return VT ( self, get_pileups ) ( self, ctx, wants_primary, wants_secondary, 0, 0 );
+    }
+
+    return NULL;
+}
+
+/* GetFilteredPileups
+ */
+struct NGS_Pileup* NGS_ReferenceGetFilteredPileups ( NGS_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get pileups" );
+    }
+    else
+    {
+        return VT ( self, get_pileups ) ( self, ctx, wants_primary, wants_secondary, filters, map_qual );
+    }
+
+    return NULL;
+}
+
+/* GetPileupSlice
+ */
+struct NGS_Pileup* NGS_ReferenceGetPileupSlice ( NGS_Reference * self, 
+                                                 ctx_t ctx, 
+                                                 uint64_t offset, 
+                                                 uint64_t size,
+                                                 bool wants_primary, 
+                                                 bool wants_secondary ) 
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get pileups" );
+    }
+    else
+    {
+        return VT ( self, get_pileup_slice ) ( self, ctx, offset, size, wants_primary, wants_secondary, 0, 0 );
+    }
+
+    return NULL;
+}
+
+/* GetFilteredPileupSlice
+ */
+struct NGS_Pileup* NGS_ReferenceGetFilteredPileupSlice ( NGS_Reference * self, 
+                                                         ctx_t ctx, 
+                                                         uint64_t offset, 
+                                                         uint64_t size,
+                                                         bool wants_primary, 
+                                                         bool wants_secondary,
+                                                         uint32_t filters,
+                                                         int32_t map_qual ) 
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get pileups" );
+    }
+    else
+    {
+        return VT ( self, get_pileup_slice ) ( self, ctx, offset, size, wants_primary, wants_secondary, filters, map_qual );
+    }
+
+    return NULL;
+}
+
+/* GetStatistics
+ */
+struct NGS_Statistics* NGS_ReferenceGetStatistics ( const NGS_Reference * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get statistics" );
+    }
+    else
+    {
+        return VT ( self, get_statistics ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+
+/*--------------------------------------------------------------------------
+ * NGS_ReferenceIterator
+ */
+ 
+/* Next
+ */
+bool NGS_ReferenceIteratorNext ( NGS_Reference * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get next reference " );
+    }
+    else
+    {
+        return VT ( self, next ) ( self, ctx );
+    }
+
+    return false;
+}
+
+ /* NullReference
+ * will error out on any call
+ */
+static void Null_ReferenceWhack ( NGS_Reference * self, ctx_t ctx )
+{
+    NGS_ReadCollectionRelease ( self -> coll, ctx );
+}
+
+static NGS_String * Null_ReferenceGetCommonName ( NGS_Reference * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return NULL;
+}
+
+static NGS_String * Null_ReferenceGetCanonicalName ( NGS_Reference * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return NULL;
+}
+
+static bool Null_ReferenceGetIsCircular ( const NGS_Reference * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return false;
+}
+
+static uint64_t Null_ReferenceGetLength ( NGS_Reference * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return 0;
+}
+
+static struct NGS_String * Null_ReferenceGetBases ( NGS_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return NULL;
+}
+
+static struct NGS_String * Null_ReferenceGetChunk ( NGS_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return NULL;
+}
+
+static struct NGS_Alignment * Null_ReferenceGetAlignment ( NGS_Reference * self, ctx_t ctx, const char * alignmentId )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return NULL;
+}
+
+static struct NGS_Alignment * Null_ReferenceGetAlignments ( NGS_Reference * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return NULL;
+}
+
+static uint64_t Null_ReferenceGetAlignmentCount ( const NGS_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return 0;
+}
+
+static struct NGS_Alignment* Null_ReferenceGetAlignmentSlice ( NGS_Reference * self, 
+                                                               ctx_t ctx, 
+                                                               uint64_t offset, 
+                                                               uint64_t size, 
+                                                               bool wants_primary, 
+                                                               bool wants_secondary,
+                                                               uint32_t filters,
+                                                               int32_t map_qual)
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return NULL;
+}
+
+static struct NGS_Pileup * Null_ReferenceGetPileups ( NGS_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return NULL;
+}
+
+static struct NGS_Pileup * Null_ReferenceGetPileupSlice ( NGS_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size, bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return NULL;
+}
+
+struct NGS_Statistics* Null_ReferenceGetStatistics ( const NGS_Reference * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing);
+    INTERNAL_ERROR ( xcSelfNull, "NULL Reference accessed" );
+    return NULL;
+}
+
+static bool Null_ReferenceIteratorNext ( NGS_Reference * self, ctx_t ctx )
+{
+    return false;
+}
+
+
+static NGS_Reference_vt Null_Reference_vt_inst =
+{
+    /* NGS_Refcount */
+    { Null_ReferenceWhack },
+    
+    /* NGS_Reference */
+    Null_ReferenceGetCommonName,
+    Null_ReferenceGetCanonicalName,
+    Null_ReferenceGetIsCircular,
+    Null_ReferenceGetLength,
+    Null_ReferenceGetBases,
+    Null_ReferenceGetChunk,
+    Null_ReferenceGetAlignment,
+    Null_ReferenceGetAlignments,
+    Null_ReferenceGetAlignmentCount,
+    Null_ReferenceGetAlignmentSlice,
+    Null_ReferenceGetPileups,
+    Null_ReferenceGetPileupSlice,
+    Null_ReferenceGetStatistics,
+    
+    /* NGS_ReferenceIterator */
+    Null_ReferenceIteratorNext
+};
+ 
+struct NGS_Reference * NGS_ReferenceMakeNull ( ctx_t ctx, struct NGS_ReadCollection * coll )
+ {
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    NGS_Reference * ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating an empty NGS_ReferenceIterator" );
+    else
+    {
+        TRY ( NGS_ReferenceInit ( ctx, ref, & Null_Reference_vt_inst, "NGS_Reference", "NullReference", coll ) )
+        {
+            return ref;
+        }
+
+        free ( ref );
+    }
+
+    return NULL;
+ }
diff --git a/libs/ngs/NGS_Reference.h b/libs/ngs/NGS_Reference.h
new file mode 100644
index 0000000..3e02e24
--- /dev/null
+++ b/libs/ngs/NGS_Reference.h
@@ -0,0 +1,214 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_reference_
+#define _h_ngs_reference_
+
+typedef struct NGS_Reference NGS_Reference;
+#ifndef NGS_REFERENCE
+#define NGS_REFERENCE NGS_Reference
+#endif
+
+#ifndef _h_ngs_refcount_
+#define NGS_REFCOUNT NGS_REFERENCE
+#include "NGS_Refcount.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VCursor;
+struct NGS_ReadCollection;
+struct NGS_Alignment;
+struct NGS_Pileup;
+struct NGS_Reference_v1_vt;
+extern struct NGS_Reference_v1_vt ITF_Reference_vt;
+
+/*--------------------------------------------------------------------------
+ * NGS_Reference
+ */
+
+/* ToRefcount
+ *  inline cast that preserves const
+ */
+#define NGS_ReferenceToRefcount( self ) \
+    ( & ( self ) -> dad )
+
+/* Release
+ *  release reference
+ */
+#define NGS_ReferenceRelease( self, ctx ) \
+    NGS_RefcountRelease ( NGS_ReferenceToRefcount ( self ), ctx )
+
+/* Duplicate
+ *  duplicate reference
+ */
+#define NGS_ReferenceDuplicate( self, ctx ) \
+    ( ( NGS_Reference* ) NGS_RefcountDuplicate ( NGS_ReferenceToRefcount ( self ), ctx ) )
+    
+/* GetCommonName
+ */
+struct NGS_String * NGS_ReferenceGetCommonName ( NGS_Reference * self, ctx_t ctx );
+
+/* GetCanonicalName
+ */
+struct NGS_String * NGS_ReferenceGetCanonicalName ( NGS_Reference * self, ctx_t ctx );
+
+/* GetisCircular
+ */
+bool NGS_ReferenceGetIsCircular ( const NGS_Reference * self, ctx_t ctx );
+
+/* GetLength
+ */
+uint64_t NGS_ReferenceGetLength ( NGS_Reference * self, ctx_t ctx );
+
+/* GetBases
+ */
+struct NGS_String * NGS_ReferenceGetBases ( NGS_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size );
+
+/* GetChunk
+ */
+struct NGS_String * NGS_ReferenceGetChunk ( NGS_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size );
+
+/* GetAlignment
+ */
+struct NGS_Alignment* NGS_ReferenceGetAlignment ( NGS_Reference * self, ctx_t ctx, const char * alignmentId );
+
+/* GetAlignments
+ */
+struct NGS_Alignment* NGS_ReferenceGetAlignments ( NGS_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary );
+
+/* GetFilteredAlignments
+ */
+struct NGS_Alignment* NGS_ReferenceGetFilteredAlignments ( NGS_Reference * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+
+/* GetAlignmentCount
+ */
+uint64_t NGS_ReferenceGetAlignmentCount ( NGS_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary );
+
+/* GetAlignmentSlice
+ */
+struct NGS_Alignment* NGS_ReferenceGetAlignmentSlice ( NGS_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size, bool wants_primary, bool wants_secondary );
+
+/* GetFilteredAlignmentSlice
+ */
+struct NGS_Alignment* NGS_ReferenceGetFilteredAlignmentSlice ( NGS_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size,
+    bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+
+/* GetPileups
+ */
+struct NGS_Pileup* NGS_ReferenceGetPileups ( NGS_Reference * self, ctx_t ctx, bool wants_primary, bool wants_secondary );
+
+/* GetFilteredPileups
+ */
+struct NGS_Pileup* NGS_ReferenceGetFilteredPileups ( NGS_Reference * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+
+/* GetPileupSlice
+ */
+struct NGS_Pileup* NGS_ReferenceGetPileupSlice ( NGS_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size,
+    bool wants_primary, bool wants_secondary );
+
+/* GetFilteredPileupSlice
+ */
+struct NGS_Pileup* NGS_ReferenceGetFilteredPileupSlice ( NGS_Reference * self, ctx_t ctx, uint64_t offset, uint64_t size,
+    bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+
+/* GetStatistics
+ */
+struct NGS_Statistics* NGS_ReferenceGetStatistics ( const NGS_Reference * self, ctx_t ctx );
+
+
+/*--------------------------------------------------------------------------
+ * NGS_ReferenceIterator
+ */
+ 
+/* Next
+ */
+bool NGS_ReferenceIteratorNext ( NGS_Reference * self, ctx_t ctx );
+ 
+/*--------------------------------------------------------------------------
+ * implementation details
+ */
+struct NGS_Reference
+{
+    NGS_Refcount dad;
+    
+    struct NGS_ReadCollection * coll;
+};
+
+typedef struct NGS_Reference_vt NGS_Reference_vt;
+struct NGS_Reference_vt
+{
+    NGS_Refcount_vt dad;
+    
+    struct NGS_String *     ( * get_common_name    ) ( NGS_REFERENCE * self, ctx_t ctx );
+    struct NGS_String *     ( * get_canonical_name ) ( NGS_REFERENCE * self, ctx_t ctx );
+    bool                    ( * get_is_circular    ) ( const NGS_REFERENCE * self, ctx_t ctx );
+    uint64_t                ( * get_length         ) ( NGS_REFERENCE * self, ctx_t ctx );
+    struct NGS_String *     ( * get_bases          ) ( NGS_REFERENCE * self, ctx_t ctx, uint64_t offset, uint64_t size );
+    struct NGS_String *     ( * get_chunk          ) ( NGS_REFERENCE * self, ctx_t ctx, uint64_t offset, uint64_t size );
+    struct NGS_Alignment*   ( * get_alignment      ) ( NGS_REFERENCE * self, ctx_t ctx, const char * alignmentId );
+    struct NGS_Alignment*   ( * get_alignments     ) ( NGS_REFERENCE * self, ctx_t ctx,
+        bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+    uint64_t                ( * get_count          ) ( const NGS_REFERENCE * self, ctx_t ctx, bool wants_primary, bool wants_secondary );
+    struct NGS_Alignment*   ( * get_slice          ) ( NGS_REFERENCE * self, ctx_t ctx, uint64_t offset, uint64_t size,
+        bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+    struct NGS_Pileup*      ( * get_pileups        ) ( NGS_REFERENCE * self, ctx_t ctx, bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+    struct NGS_Pileup*      ( * get_pileup_slice   ) ( NGS_REFERENCE * self, ctx_t ctx, uint64_t offset, uint64_t size,
+        bool wants_primary, bool wants_secondary, uint32_t filters, int32_t map_qual );
+    struct NGS_Statistics*  ( * get_statistics     ) ( const NGS_REFERENCE * self, ctx_t ctx );
+    bool                    ( * next               ) ( NGS_REFERENCE * self, ctx_t ctx );
+};
+
+/* Init
+*/
+void NGS_ReferenceInit ( ctx_t ctx, 
+                         struct NGS_Reference * self, 
+                         NGS_Reference_vt * vt, 
+                         const char *clsname, 
+                         const char *instname, 
+                         struct NGS_ReadCollection * coll );
+                         
+/* Whack
+*/                         
+void NGS_ReferenceWhack ( NGS_Reference * self, ctx_t ctx );
+                         
+/* NullReference
+ * will error out on any call
+ */
+struct NGS_Reference * NGS_ReferenceMakeNull ( ctx_t ctx, struct NGS_ReadCollection * coll );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_reference_ */
diff --git a/libs/ngs/NGS_ReferenceSequence.c b/libs/ngs/NGS_ReferenceSequence.c
new file mode 100644
index 0000000..f398873
--- /dev/null
+++ b/libs/ngs/NGS_ReferenceSequence.c
@@ -0,0 +1,282 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include "NGS_ReferenceSequence.h"
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/Refcount.h>
+#include <ngs/itf/ReferenceSequenceItf.h>
+
+#include "NGS_String.h"
+
+#include <sysalloc.h>
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/rc.h>
+
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+
+/*--------------------------------------------------------------------------
+ * NGS_ReferenceSequence_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_ReferenceSequence* ) ( obj ) )
+    
+static NGS_String_v1 * ITF_ReferenceSequence_v1_get_canon_name ( const NGS_ReferenceSequence_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReferenceSequenceGetCanonicalName ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static bool ITF_ReferenceSequence_v1_is_circular ( const NGS_ReferenceSequence_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( bool ret = NGS_ReferenceSequenceGetIsCircular ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static uint64_t ITF_ReferenceSequence_v1_get_length ( const NGS_ReferenceSequence_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint64_t ret = NGS_ReferenceSequenceGetLength ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static NGS_String_v1 * ITF_ReferenceSequence_v1_get_ref_bases ( const NGS_ReferenceSequence_v1 * self, NGS_ErrBlock_v1 * err, uint64_t offset, uint64_t length )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReferenceSequenceGetBases ( Self ( self ), ctx, offset, length ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static NGS_String_v1 * ITF_ReferenceSequence_v1_get_ref_chunk ( const NGS_ReferenceSequence_v1 * self, NGS_ErrBlock_v1 * err, uint64_t offset, uint64_t length )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( struct NGS_String * ret = NGS_ReferenceSequenceGetChunk ( Self ( self ), ctx, offset, length ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+#undef Self
+
+
+NGS_ReferenceSequence_v1_vt ITF_ReferenceSequence_vt =
+{
+    {
+        "NGS_ReferenceSequence",
+        "NGS_ReferenceSequence_v1",
+        2,
+        & ITF_Refcount_vt . dad
+    },
+
+    /* 1.0 */
+    ITF_ReferenceSequence_v1_get_canon_name,
+    ITF_ReferenceSequence_v1_is_circular,
+    ITF_ReferenceSequence_v1_get_length,
+    ITF_ReferenceSequence_v1_get_ref_bases,
+    ITF_ReferenceSequence_v1_get_ref_chunk,
+};
+
+
+/*--------------------------------------------------------------------------
+ * NGS_ReferenceSequence
+ */
+#define VT( self, msg ) \
+    ( ( ( const NGS_ReferenceSequence_vt* ) ( self ) -> dad . vt ) -> msg )
+    
+/* Make
+ *  use provided specification to create an object
+ *  any error returns NULL as a result and sets error in ctx
+ */
+NGS_ReferenceSequence * NGS_ReferenceSequenceMake ( ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcOpening );
+
+    if ( spec == NULL )
+        USER_ERROR ( xcParamNull, "NULL reference sequence specification string" );
+    else if ( spec [ 0 ] == 0 )
+        USER_ERROR ( xcStringEmpty, "empty reference sequence specification string" );
+    else
+    {
+        NGS_ReferenceSequence* ref = NGS_ReferenceSequenceMakeSRA ( ctx, spec );
+
+        if ( FAILED() &&
+            (GetRCState ( ctx->rc ) == rcNotFound || GetRCState ( ctx->rc ) == rcUnexpected) )
+        {
+            CLEAR();
+            assert ( ref == NULL );
+            ref = NGS_ReferenceSequenceMakeEBI ( ctx, spec );
+        }
+
+        return ref;
+    }
+
+    return NULL;
+}
+
+
+/* Init
+*/
+void NGS_ReferenceSequenceInit ( ctx_t ctx, 
+                         struct NGS_ReferenceSequence * self, 
+                         NGS_ReferenceSequence_vt * vt, 
+                         const char *clsname, 
+                         const char *instname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcRow, rcConstructing );
+    
+    assert ( self );
+    assert ( vt );
+    
+    TRY ( NGS_RefcountInit ( ctx, & self -> dad, & ITF_ReferenceSequence_vt . dad, & vt -> dad, clsname, instname ) )
+    {
+        assert ( vt -> get_canonical_name != NULL );
+        assert ( vt -> get_is_circular    != NULL );
+        assert ( vt -> get_length         != NULL );
+        assert ( vt -> get_bases          != NULL );
+        assert ( vt -> get_chunk          != NULL );
+    }
+}
+
+
+/* GetCanonicalName
+ */
+struct NGS_String * NGS_ReferenceSequenceGetCanonicalName ( NGS_ReferenceSequence * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get canonical name" );
+    }
+    else
+    {
+        return VT ( self, get_canonical_name ) ( self, ctx );
+    }
+
+    return NULL;
+}
+
+/* GetisCircular
+ */
+bool NGS_ReferenceSequenceGetIsCircular ( NGS_ReferenceSequence const* self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get circular" );
+    }
+    else
+    {
+        return VT ( self, get_is_circular ) ( self, ctx );
+    }
+
+    return false;
+}
+
+/* GetLength
+ */
+uint64_t NGS_ReferenceSequenceGetLength ( NGS_ReferenceSequence * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get reference length" );
+    }
+    else
+    {
+        return VT ( self, get_length ) ( self, ctx );
+    }
+
+    return 0;
+}
+
+
+/* GetBases
+ */
+struct NGS_String * NGS_ReferenceSequenceGetBases ( NGS_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get reference bases" );
+    }
+    else
+    {
+        return VT ( self, get_bases ) ( self, ctx, offset, size );
+    }
+
+    return NULL;
+}
+
+
+/* GetChunk
+ */
+struct NGS_String * NGS_ReferenceSequenceGetChunk ( NGS_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get reference chunk" );
+    }
+    else
+    {
+        return VT ( self, get_chunk ) ( self, ctx, offset, size );
+    }
+
+    return NULL;
+}
+
diff --git a/libs/ngs/NGS_ReferenceSequence.h b/libs/ngs/NGS_ReferenceSequence.h
new file mode 100644
index 0000000..cbfe1b1
--- /dev/null
+++ b/libs/ngs/NGS_ReferenceSequence.h
@@ -0,0 +1,138 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_NGS_ReferenceSequencesequence_
+#define _h_NGS_ReferenceSequencesequence_
+
+typedef struct NGS_ReferenceSequence NGS_ReferenceSequence;
+#ifndef NGS_REFERENCESEQUENCE
+#define NGS_REFERENCESEQUENCE NGS_ReferenceSequence
+#endif
+
+#ifndef _h_ngs_refcount_
+#define NGS_REFCOUNT NGS_REFERENCESEQUENCE
+#include "NGS_Refcount.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_ReferenceSequence_v1_vt;
+extern struct NGS_ReferenceSequence_v1_vt ITF_ReferenceSequence_vt;
+
+/*--------------------------------------------------------------------------
+ * NGS_ReferenceSequence
+ */
+
+/* ToRefcount
+ *  inline cast that preserves const
+ */
+#define NGS_ReferenceSequenceToRefcount( self ) \
+    ( & ( self ) -> dad )
+
+/* Release
+ *  release reference
+ */
+#define NGS_ReferenceSequenceRelease( self, ctx ) \
+    NGS_RefcountRelease ( NGS_ReferenceSequenceToRefcount ( self ), ctx )
+
+/* Duplicate
+ *  duplicate reference
+ */
+#define NGS_ReferenceSequenceDuplicate( self, ctx ) \
+    ( ( NGS_ReferenceSequence* ) NGS_RefcountDuplicate ( NGS_ReferenceSequenceToRefcount ( self ), ctx ) )
+    
+/* GetCanonicalName
+ */
+struct NGS_String * NGS_ReferenceSequenceGetCanonicalName ( NGS_ReferenceSequence* self, ctx_t ctx );
+
+/* GetisCircular
+ */
+bool NGS_ReferenceSequenceGetIsCircular ( NGS_ReferenceSequence const* self, ctx_t ctx );
+
+/* GetLength
+ */
+uint64_t NGS_ReferenceSequenceGetLength ( NGS_ReferenceSequence* self, ctx_t ctx );
+
+/* GetBases
+ */
+struct NGS_String * NGS_ReferenceSequenceGetBases ( NGS_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size );
+
+/* GetChunk
+ */
+struct NGS_String * NGS_ReferenceSequenceGetChunk ( NGS_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size );
+
+/*--------------------------------------------------------------------------
+ * implementation details
+ */
+struct NGS_ReferenceSequence
+{
+    NGS_Refcount dad;
+};
+
+typedef struct NGS_ReferenceSequence_vt NGS_ReferenceSequence_vt;
+struct NGS_ReferenceSequence_vt
+{
+    NGS_Refcount_vt dad;
+    
+    struct NGS_String * ( * get_canonical_name ) ( NGS_REFERENCESEQUENCE * self, ctx_t ctx );
+    bool                ( * get_is_circular    ) ( NGS_REFERENCESEQUENCE const* self, ctx_t ctx );
+    uint64_t            ( * get_length         ) ( NGS_REFERENCESEQUENCE * self, ctx_t ctx );
+    struct NGS_String * ( * get_bases          ) ( NGS_REFERENCESEQUENCE * self, ctx_t ctx, uint64_t offset, uint64_t size );
+    struct NGS_String * ( * get_chunk          ) ( NGS_REFERENCESEQUENCE * self, ctx_t ctx, uint64_t offset, uint64_t size );
+};
+
+/* Make
+ *  use provided specification to create an object
+ *  any error returns NULL as a result and sets error in ctx
+ */
+NGS_ReferenceSequence * NGS_ReferenceSequenceMake ( ctx_t ctx, const char * spec );
+
+/* additional make functions
+ *  use provided specification to create an object
+ *  any error returns NULL as a result and sets error in ctx
+ */
+NGS_ReferenceSequence * NGS_ReferenceSequenceMakeSRA ( ctx_t ctx, const char * spec );
+NGS_ReferenceSequence * NGS_ReferenceSequenceMakeEBI ( ctx_t ctx, const char * spec );
+
+/* Init
+*/
+void NGS_ReferenceSequenceInit ( ctx_t ctx, 
+                         struct NGS_ReferenceSequence * self, 
+                         NGS_ReferenceSequence_vt * vt, 
+                         const char *clsname, 
+                         const char *instname );
+                         
+                        
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_NGS_ReferenceSequencesequence_ */
diff --git a/libs/ngs/NGS_Statistics.c b/libs/ngs/NGS_Statistics.c
new file mode 100644
index 0000000..b04dd8a
--- /dev/null
+++ b/libs/ngs/NGS_Statistics.c
@@ -0,0 +1,336 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_Statistics.h"
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/Refcount.h>
+#include <ngs/itf/StatisticsItf.h>
+
+#include "NGS_String.h"
+
+#include <klib/text.h>
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <sysalloc.h>
+
+/*--------------------------------------------------------------------------
+ * NGS_Statistics_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_Statistics* ) ( obj ) )
+    
+static
+uint32_t NGS_Statistics_v1_get_type ( const NGS_Statistics_v1 * self, NGS_ErrBlock_v1 * err, const char * path )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint32_t ret = NGS_StatisticsGetValueType ( Self ( self ), ctx, path ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static
+NGS_String_v1 * NGS_Statistics_v1_as_string ( const NGS_Statistics_v1 * self, NGS_ErrBlock_v1 * err, const char * path )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( NGS_String * ret = NGS_StatisticsGetAsString ( Self ( self ), ctx, path ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+static
+int64_t NGS_Statistics_v1_as_I64 ( const NGS_Statistics_v1 * self, NGS_ErrBlock_v1 * err, const char * path )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( int64_t ret = NGS_StatisticsGetAsI64( Self ( self ), ctx, path ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static
+uint64_t NGS_Statistics_v1_as_U64 ( const NGS_Statistics_v1 * self, NGS_ErrBlock_v1 * err, const char * path )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( uint64_t ret = NGS_StatisticsGetAsU64( Self ( self ), ctx, path ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static
+double NGS_Statistics_v1_as_F64 ( const NGS_Statistics_v1 * self, NGS_ErrBlock_v1 * err, const char * path )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    ON_FAIL ( double ret = NGS_StatisticsGetAsDouble( Self ( self ), ctx, path ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+    return ret;
+}
+
+static
+NGS_String_v1 * NGS_Statistics_v1_next_path ( const NGS_Statistics_v1 * self, NGS_ErrBlock_v1 * err, const char * path )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRefcount, rcAccessing );
+    NGS_String * ret;
+    const char* new_path;
+    ON_FAIL ( bool more = NGS_StatisticsNextPath( Self ( self ), ctx, path, & new_path ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+        return NULL;
+    }
+    
+    if ( more )
+    {
+        ON_FAIL ( ret = NGS_StringMakeCopy ( ctx, new_path, string_size ( new_path ) ) )
+        {
+            NGS_ErrBlockThrow ( err, ctx );
+        }
+    }
+    else
+    {
+        ON_FAIL ( ret = NGS_StringMake ( ctx, "", 0 ) )
+        {
+            NGS_ErrBlockThrow ( err, ctx );
+        }
+    }
+
+    CLEAR ();
+    return ( NGS_String_v1 * ) ret;
+}
+
+#undef Self
+
+
+NGS_Statistics_v1_vt ITF_Statistics_vt =
+{
+    {
+        "NGS_Statistics",
+        "NGS_Statistics_v1",
+        0,
+        & ITF_Refcount_vt . dad
+    },
+
+    NGS_Statistics_v1_get_type,
+    NGS_Statistics_v1_as_string,
+    NGS_Statistics_v1_as_I64,
+    NGS_Statistics_v1_as_U64,
+    NGS_Statistics_v1_as_F64,
+    NGS_Statistics_v1_next_path
+};
+
+/*--------------------------------------------------------------------------
+ * NGS_Statistics
+ */
+
+#define VT( self, msg ) \
+    ( ( ( const NGS_Statistics_vt* ) ( self ) -> dad . vt ) -> msg )
+    
+void NGS_StatisticsInit ( ctx_t ctx, struct NGS_Statistics * self, NGS_Statistics_vt * vt, const char *clsname, const char *instname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcRow, rcConstructing );
+    
+    TRY ( NGS_RefcountInit ( ctx, & self -> dad, & ITF_Statistics_vt . dad, & vt -> dad, clsname, instname ) )
+    {
+        assert ( VT ( self, get_value_type ) != NULL );
+        assert ( VT ( self, get_as_string ) != NULL );
+        assert ( VT ( self, get_as_int64 ) != NULL );
+        assert ( VT ( self, get_as_uint64 ) != NULL );
+        assert ( VT ( self, get_as_double ) != NULL );
+        assert ( VT ( self, next_path ) != NULL );
+        assert ( VT ( self, add_string ) != NULL );
+        assert ( VT ( self, add_int64  ) != NULL );
+        assert ( VT ( self, add_uint64 ) != NULL );
+        assert ( VT ( self, add_double ) != NULL );
+    }
+}
+   
+
+uint32_t NGS_StatisticsGetValueType ( const NGS_Statistics * self, ctx_t ctx, const char * path )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get value type" );
+    }
+    else
+    {
+        return VT ( self, get_value_type ) ( self, ctx, path );
+    }
+
+    return NGS_StatisticValueType_Undefined;
+}
+    
+struct NGS_String* NGS_StatisticsGetAsString ( const NGS_Statistics * self, ctx_t ctx, const char * path )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get value type" );
+    }
+    else
+    {
+        return VT ( self, get_as_string ) ( self, ctx, path );
+    }
+
+    return NULL;
+}
+
+int64_t NGS_StatisticsGetAsI64 ( const NGS_Statistics * self, ctx_t ctx, const char * path )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get value as I64" );
+    }
+    else
+    {
+        return VT ( self, get_as_int64 ) ( self, ctx, path );
+    }
+
+    return 0;
+}
+
+uint64_t NGS_StatisticsGetAsU64 ( const NGS_Statistics * self, ctx_t ctx, const char * path )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get value as U64" );
+    }
+    else
+    {
+        return VT ( self, get_as_uint64) ( self, ctx, path );
+    }
+
+    return 0;
+}
+
+double NGS_StatisticsGetAsDouble ( const NGS_Statistics * self, ctx_t ctx, const char * path )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get value as Double" );
+    }
+    else
+    {
+        return VT ( self, get_as_double) ( self, ctx, path );
+    }
+
+    return 0.0;
+}
+
+bool NGS_StatisticsNextPath ( const NGS_Statistics * self, ctx_t ctx, const char * path, const char ** next )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to get next path" );
+    }
+    else
+    {
+        return VT ( self, next_path ) ( self, ctx, path, next );
+    }
+
+    return false;
+}
+
+void NGS_StatisticsAddString ( NGS_Statistics * self, ctx_t ctx, const char * path, const NGS_String * value )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to add '%s'", path );
+    }
+    else
+    {
+        VT ( self, add_string ) ( self, ctx, path, value );
+    }
+}
+
+void NGS_StatisticsAddI64 ( NGS_Statistics * self, ctx_t ctx, const char * path, int64_t value )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to add '%s'", path );
+    }
+    else
+    {
+        VT ( self, add_int64 ) ( self, ctx, path, value );
+    }
+}
+
+void NGS_StatisticsAddU64 ( NGS_Statistics * self, ctx_t ctx, const char * path, uint64_t value )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to add '%s'", path );
+    }
+    else
+    {
+        VT ( self, add_uint64 ) ( self, ctx, path, value );
+    }
+}
+
+void NGS_StatisticsAddDouble ( NGS_Statistics * self, ctx_t ctx, const char * path, double value )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "failed to add '%s'", path );
+    }
+    else
+    {
+        VT ( self, add_double ) ( self, ctx, path, value );
+    }
+}
+
+
diff --git a/libs/ngs/NGS_Statistics.h b/libs/ngs/NGS_Statistics.h
new file mode 100644
index 0000000..782f5f7
--- /dev/null
+++ b/libs/ngs/NGS_Statistics.h
@@ -0,0 +1,143 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_statistics_
+#define _h_ngs_statistics_
+
+typedef struct NGS_Statistics NGS_Statistics;
+#ifndef NGS_STATISTICS
+#define NGS_STATISTICS NGS_Statistics
+#endif
+
+#ifndef _h_ngs_refcount_
+#define NGS_REFCOUNT NGS_STATISTICS
+#include "NGS_Refcount.h"
+#endif
+
+#define READ_GROUP_SUPPORTS_READS 0
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+struct NGS_String;
+struct NGS_ReadGroup_v1_vt;
+extern struct NGS_ReadGroup_v1_vt ITF_ReadGroup_vt;
+
+/*--------------------------------------------------------------------------
+ * NGS_Statistics
+ */
+ 
+/* ToRefcount
+ *  inline cast that preserves const
+ */
+#define NGS_StatisticsToRefcount( self ) \
+    ( & ( self ) -> dad )
+
+/* Release
+ *  release reference
+ */
+#define NGS_StatisticsRelease( self, ctx ) \
+    NGS_RefcountRelease ( NGS_StatisticsToRefcount ( self ), ctx )
+
+/* Duplicate
+ *  duplicate reference
+ */
+#define NGS_StatisticsDuplicate( self, ctx ) \
+    ( ( NGS_Statistics* ) NGS_RefcountDuplicate ( NGS_StatisticsToRefcount ( self ), ctx ) )
+ 
+    
+uint32_t NGS_StatisticsGetValueType ( const NGS_Statistics * self, ctx_t ctx, const char * path );
+    
+struct NGS_String* NGS_StatisticsGetAsString ( const NGS_Statistics * self, ctx_t ctx, const char * path );
+
+int64_t NGS_StatisticsGetAsI64 ( const NGS_Statistics * self, ctx_t ctx, const char * path );
+
+uint64_t NGS_StatisticsGetAsU64 ( const NGS_Statistics * self, ctx_t ctx, const char * path );
+
+double NGS_StatisticsGetAsDouble ( const NGS_Statistics * self, ctx_t ctx, const char * path );
+
+bool NGS_StatisticsNextPath ( const NGS_Statistics * self, ctx_t ctx, const char * path, const char ** next );
+
+void NGS_StatisticsAddString ( NGS_Statistics * self, ctx_t ctx, const char * path, const struct NGS_String * value );
+
+void NGS_StatisticsAddI64 ( NGS_Statistics * self, ctx_t ctx, const char * path, int64_t value );
+
+void NGS_StatisticsAddU64 ( NGS_Statistics * self, ctx_t ctx, const char * path, uint64_t value );
+ 
+void NGS_StatisticsAddDouble ( NGS_Statistics * self, ctx_t ctx, const char * path, double value );
+
+/*--------------------------------------------------------------------------
+ * implementation details
+ */
+struct NGS_Statistics
+{
+    NGS_Refcount dad;
+};
+
+enum NGS_StatisticValueType
+{
+    NGS_StatisticValueType_Undefined,
+    NGS_StatisticValueType_String,
+    /* other int types ? */
+    NGS_StatisticValueType_Int64,
+    NGS_StatisticValueType_UInt64,
+    NGS_StatisticValueType_Real
+};
+
+typedef struct NGS_Statistics_vt NGS_Statistics_vt;
+struct NGS_Statistics_vt
+{
+    NGS_Refcount_vt dad;
+    
+    uint32_t ( * get_value_type ) ( const NGS_STATISTICS * self, ctx_t ctx, const char * path ); 
+    
+    struct NGS_String * ( * get_as_string ) ( const NGS_STATISTICS * self, ctx_t ctx, const char * path ); 
+    int64_t             ( * get_as_int64 )  ( const NGS_STATISTICS * self, ctx_t ctx, const char * path ); 
+    uint64_t            ( * get_as_uint64 ) ( const NGS_STATISTICS * self, ctx_t ctx, const char * path ); 
+    double              ( * get_as_double ) ( const NGS_STATISTICS * self, ctx_t ctx, const char * path ); 
+    
+    bool ( * next_path  ) ( const NGS_STATISTICS * self, ctx_t ctx, const char * path, const char ** new_path );     
+    
+    void ( * add_string )   ( NGS_STATISTICS * self, ctx_t ctx, const char * path, const struct NGS_String * value );
+    void ( * add_int64 )    ( NGS_STATISTICS * self, ctx_t ctx, const char * path, int64_t value );
+    void ( * add_uint64 )   ( NGS_STATISTICS * self, ctx_t ctx, const char * path, uint64_t value );
+    void ( * add_double )   ( NGS_STATISTICS * self, ctx_t ctx, const char * path, double value );
+};
+
+/* Init
+*/
+void NGS_StatisticsInit ( ctx_t ctx, struct NGS_Statistics * self, NGS_Statistics_vt * vt, const char *clsname, const char *instname );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_statistics_ */
diff --git a/libs/ngs/NGS_String.c b/libs/ngs/NGS_String.c
new file mode 100644
index 0000000..e3e3c22
--- /dev/null
+++ b/libs/ngs/NGS_String.c
@@ -0,0 +1,413 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "NGS_String.h"
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+
+#include "NGS_ErrBlock.h"
+#include <ngs/itf/Refcount.h>
+#include <ngs/itf/StringItf.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+
+/*--------------------------------------------------------------------------
+ * NGS_String
+ *  a reference into NGS string data
+ *  reference counted, temporary
+ */
+struct NGS_String
+{
+    NGS_Refcount dad;   
+
+    NGS_String * orig;
+    char * owned;
+    const char * str;
+    size_t size;
+};
+
+
+/* Whack
+ */
+static
+void NGS_StringWhack ( NGS_String * self, ctx_t ctx )
+{
+    if ( self -> orig != NULL )
+        NGS_StringRelease ( self -> orig, ctx );
+    if ( self -> owned != NULL )
+        free ( self -> owned );
+}
+
+
+/* Release
+ *  release reference
+ */
+void NGS_StringRelease ( const NGS_String * self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        NGS_RefcountRelease ( & self -> dad, ctx );
+    }
+}
+
+
+/* Duplicate
+ *  duplicate reference
+ */
+NGS_String * NGS_StringDuplicate ( const NGS_String * self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        NGS_RefcountDuplicate( & self -> dad, ctx );
+    }
+    return ( NGS_String* ) self;
+}
+
+
+/* Invalidate
+ */
+void NGS_StringInvalidate ( NGS_String * self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        NGS_String * orig = self -> orig;
+        self -> size = 0;
+        self -> str = "";
+        if ( orig != NULL )
+        {
+            self -> orig = NULL;
+            NGS_StringRelease ( orig, ctx );
+        }
+    }
+}
+
+
+/* Data
+ *  retrieve data pointer
+ */
+const char * NGS_StringData ( const NGS_String * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcString, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "attempt to access NULL NGS_String" );
+        return NULL;
+    }
+
+    return self -> str;
+}
+
+
+/* Size
+ *  retrieve data length
+ */
+size_t NGS_StringSize ( const NGS_String * self, ctx_t ctx )
+{
+    if ( self == NULL )
+    {
+        FUNC_ENTRY ( ctx, rcSRA, rcString, rcAccessing );
+        INTERNAL_ERROR ( xcSelfNull, "attempt to access NULL NGS_String" );
+        return 0;
+    }
+
+    return self -> size;
+}
+
+
+/* Substr
+ *  create a new allocation
+ *  returns a substring, either at a simple offset
+ *  or at an offset with length
+ */
+NGS_String * NGS_StringSubstrOffset ( const NGS_String * self, ctx_t ctx, uint64_t offset )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcString, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "attempt to access NULL NGS_String" );
+    else if ( offset == 0 )
+        return NGS_StringDuplicate ( self, ctx );
+    else
+    {
+        NGS_String * dup;
+
+        if ( offset > ( uint64_t ) self -> size )
+            offset = self -> size;
+
+        TRY ( dup = NGS_StringMake ( ctx, self -> str + offset, self -> size - ( size_t ) offset ) )
+        {
+            dup -> orig = NGS_StringDuplicate ( self, ctx );
+            return dup;
+        }
+    }
+
+    return NULL;
+}
+
+NGS_String * NGS_StringSubstrOffsetSize ( const NGS_String * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcString, rcAccessing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "attempt to access NULL NGS_String" );
+    else if ( offset == 0 && size >= ( uint64_t ) self -> size )
+        return NGS_StringDuplicate ( self, ctx );
+    else
+    {
+        NGS_String * dup;
+
+        if ( offset > ( uint64_t ) self -> size )
+        {
+            offset = self -> size;
+            size = 0;
+        }
+        else
+        {
+            uint64_t remainder = ( uint64_t ) self -> size - offset;
+            if ( size > remainder )
+                size = remainder;
+        }
+
+        TRY ( dup = NGS_StringMake ( ctx, self -> str + offset, ( size_t ) size ) )
+        {
+            dup -> orig = NGS_StringDuplicate ( self, ctx );
+            return dup;
+        }
+    }
+
+    return NULL;
+}
+
+static NGS_Refcount_vt NGS_String_vt =
+{
+    NGS_StringWhack
+};
+
+
+/*--------------------------------------------------------------------------
+ * NGS_String_v1
+ */
+
+#define Self( obj ) \
+    ( ( NGS_String* ) ( obj ) )
+
+static
+const char* ITF_String_v1_data ( const NGS_String_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcString, rcAccessing );
+    ON_FAIL ( const char * data = NGS_StringData ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+
+    return data;
+}
+
+static
+size_t ITF_String_v1_size ( const NGS_String_v1 * self, NGS_ErrBlock_v1 * err )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcString, rcAccessing );
+    ON_FAIL ( size_t size = NGS_StringSize ( Self ( self ), ctx ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+
+    return size;
+}
+
+static
+NGS_String_v1* ITF_String_v1_substr ( const NGS_String_v1 * self, NGS_ErrBlock_v1 * err,
+    size_t offset, size_t size )
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcString, rcAccessing );
+    ON_FAIL ( NGS_String * ref = NGS_StringSubstrOffsetSize ( Self ( self ), ctx, offset, size ) )
+    {
+        NGS_ErrBlockThrow ( err, ctx );
+    }
+
+    CLEAR ();
+
+    return ( NGS_String_v1* ) ref;
+}
+
+#undef Self
+
+static NGS_String_v1_vt ITF_String_vt =
+{
+    {
+        "NGS_String",
+        "NGS_String_v1",
+        0,
+        & ITF_Refcount_vt . dad
+    },
+
+    ITF_String_v1_data,
+    ITF_String_v1_size,
+    ITF_String_v1_substr
+};
+
+/*--------------------------------------------------------------------------
+ * NGS_String
+ */
+
+/* Make
+ */
+NGS_String * NGS_StringMake ( ctx_t ctx, const char * data, size_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcString, rcConstructing );
+
+    if ( data == NULL )
+        USER_ERROR ( xcParamNull, "bad input" );
+    else
+    {
+        NGS_String * ref = calloc ( 1, sizeof * ref );
+        if ( ref == NULL )
+            SYSTEM_ERROR ( xcNoMemory, "allocating %zu bytes", ( size_t ) sizeof * ref );
+        else
+        {
+            TRY ( NGS_RefcountInit ( ctx, & ref -> dad, & ITF_String_vt . dad, & NGS_String_vt, "NGS_String", "" ) )
+            {
+                ref -> str = data;
+                ref -> size = size;
+                return ref;
+            }
+
+            free ( ref );
+        }
+    }
+
+    return NULL;
+}
+
+NGS_String * NGS_StringMakeOwned ( ctx_t ctx, char * owned_data, size_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcString, rcConstructing );
+
+    if ( owned_data == NULL )
+        USER_ERROR ( xcParamNull, "bad input" );
+    else
+    {
+        NGS_String * ref = calloc ( 1, sizeof * ref );
+        if ( ref == NULL )
+            SYSTEM_ERROR ( xcNoMemory, "allocating %zu bytes", ( size_t ) sizeof * ref );
+        else
+        {
+            TRY ( NGS_RefcountInit ( ctx, & ref -> dad, & ITF_String_vt . dad, & NGS_String_vt, "NGS_String", "" ) )
+            {
+                ref -> owned = owned_data;
+                ref -> str = owned_data;
+                ref -> size = size;
+                return ref;
+            }
+
+            free ( ref );
+        }
+    }
+
+    return NULL;
+}
+
+NGS_String * NGS_StringMakeCopy ( ctx_t ctx, const char * temp_data, size_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcString, rcConstructing );
+
+    if ( temp_data == NULL )
+        USER_ERROR ( xcParamNull, "bad input" );
+    else
+    {
+        char * owned_data = malloc ( size + 1 );
+        if ( owned_data == NULL )
+            SYSTEM_ERROR ( xcNoMemory, "allocating %zu bytes", size + 1 );
+        else
+        {
+            memmove ( owned_data, temp_data, size );
+            owned_data [ size ] = 0;
+            {
+                TRY ( NGS_String * ref = NGS_StringMakeOwned ( ctx, owned_data, size ) )
+                {
+                    return ref;
+                }
+            }
+
+            free ( owned_data );
+        }
+    }
+
+    return NULL;
+}
+
+NGS_String * NGS_StringFromI64 ( ctx_t ctx, int64_t i )
+{
+    size_t size;
+    char buffer [ 128 ];
+    rc_t rc = string_printf ( buffer, sizeof buffer, & size, "%ld", i );
+
+    if ( rc == 0 )
+        return NGS_StringMakeCopy ( ctx, buffer, size );
+
+    INTERNAL_ERROR ( xcStringCreateFailed, "rc = %R", rc );
+    return NULL;
+}
+
+
+/* MakeNULTerminatedString
+ *  allocates a NUL-terminated version of self
+ *  returned value should be disposed using "free()"
+ */
+char * NGS_StringMakeNULTerminatedString ( const NGS_String * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcString, rcConstructing );
+
+    char * nul_term = NULL;
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcSelfNull, "attempt to access NULL NGS_String" );
+    else
+    {
+        size_t dst_size = self -> size + 1;
+        nul_term = malloc ( dst_size );
+        if ( nul_term == NULL )
+            SYSTEM_ERROR ( xcNoMemory, "allocating %zu bytes", dst_size );
+        else
+            string_copy ( nul_term, dst_size, self -> str, self -> size );
+    }
+
+    return nul_term;
+}
diff --git a/libs/ngs/NGS_String.h b/libs/ngs/NGS_String.h
new file mode 100644
index 0000000..5378b11
--- /dev/null
+++ b/libs/ngs/NGS_String.h
@@ -0,0 +1,109 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_string_
+#define _h_ngs_string_
+
+typedef struct NGS_String NGS_String;
+#ifndef NGS_STRING
+#define NGS_STRING NGS_String
+#endif
+
+#ifndef _h_ngs_refcount_
+#define NGS_REFCOUNT NGS_STRING
+#include "NGS_Refcount.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * NGS_String
+ *  a reference into NGS string data
+ *  reference counted, temporary
+ */
+
+
+/* Make
+ */
+NGS_String * NGS_StringMake ( ctx_t ctx, const char * data, size_t size );
+NGS_String * NGS_StringMakeOwned ( ctx_t ctx, char * owned_data, size_t size );
+NGS_String * NGS_StringMakeCopy ( ctx_t ctx, const char * temp_data, size_t size );
+
+/* TEMPORARY */
+NGS_String * NGS_StringFromI64 ( ctx_t ctx, int64_t i );
+
+/* Invalidate
+ */
+void NGS_StringInvalidate ( NGS_String * self, ctx_t ctx );
+
+
+/* Release
+ *  release reference
+ */
+void NGS_StringRelease ( const NGS_String * self, ctx_t ctx );
+
+
+/* Duplicate
+ *  duplicate reference
+ */
+NGS_String * NGS_StringDuplicate ( const NGS_String * self, ctx_t ctx );
+
+
+/* Data
+ *  retrieve data pointer
+ */
+const char * NGS_StringData ( const NGS_String * self, ctx_t ctx );
+
+
+/* Size
+ *  retrieve data size
+ */
+size_t NGS_StringSize ( const NGS_String * self, ctx_t ctx );
+
+
+/* Substr
+ *  create a new allocation
+ *  returns a substring, either at a simple offset
+ *  or at an offset with size
+ */
+NGS_String * NGS_StringSubstrOffset ( const NGS_String * self, ctx_t ctx, uint64_t offset );
+NGS_String * NGS_StringSubstrOffsetSize ( const NGS_String * self, ctx_t ctx, uint64_t offset, uint64_t size );
+
+
+/* MakeNULTerminatedString
+ *  allocates a NUL-terminated version of self
+ *  returned value should be disposed using "free()"
+ */
+char * NGS_StringMakeNULTerminatedString ( const NGS_String * self, ctx_t ctx );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ngs_string_ */
diff --git a/libs/ngs/NOTES.txt b/libs/ngs/NOTES.txt
new file mode 100644
index 0000000..8af89a1
--- /dev/null
+++ b/libs/ngs/NOTES.txt
@@ -0,0 +1,128 @@
+NGS LIBRARY NOTES
+
+C++ Structure:
+
+The "interface" file is in interfaces/ngs/*.hpp and is named to be consistent
+with Java conventions in order to avoid potential problems with IDEs, etc. So
+for the interface class "ngs::Read", it is in its own file <ngs/Read.hpp>.
+
+C++ "interfaces" in this library are actually references, or "smart pointers".
+They must NEVER have a virtual table or be allocated, although they do support
+copy constructors and assignment operators in general. They have no inline
+methods because the interface is being proposed as a standard for several
+institutions to implement, meaning we can't imply ANYTHING about the underlying
+implementation.
+
+The implementation of the C++ interfaces is private to NCBI, and is currently
+defined in this directory. So for example, <ngs/Read.hpp> is imlemented here as
+Read.cpp.
+
+The main purpose of methods in Read.cpp is to simply dispatch the message to a
+ReadItf object, which is polymorphic. Philosophically the other job of these
+methods ( Read.cpp ) is to wrap allocations in references ( smart pointers ),
+e.g. creating a String or StringRef from a StringItf*, etc. So far, I've just
+been letting the polymorphic dispatcher class throw the exceptions.
+
+The smart pointer's reference to the opaque polymorphic interface class is
+forward declared in the <ngs/Read.hpp> as "typedef class ReadItf * ReadRef;" or
+something like that. The interface class is opened within this directory by
+ReadItf.hpp. This declaration is entirely used for type punning, so again there
+cannot be any virtual methods.
+
+The methods of the ReadItf will be happy to return pointers now, since they'll
+be wrapped by the Read class' methods. ReadItf.cpp is also responsible for
+re-dispatching, but serves the additional and important function of establishing
+thread context for the C code upon entry, and checking for C exceptions before
+returning.
+
+QUICK SUMMARY:
+  ReadItf.cpp methods
+    - establish C context
+    - redispatch to C code, casting "this" pointer to C type
+    - throw appropriate C++ exceptions upon error detection
+    - return values from C code, type-punned as appropriate
+
+  NGS_Read.c methods
+    - directly implement interface to VDB, or
+    - redispatch through C vtables
+	- provides iteration methods
+
+  ReadItf.hpp
+    - declares the main C++ wrapper methods, generally mirroring public
+      interface
+    - declare a pair of casting operators I've been calling "self()"
+    - can never be directly instantiated, so always use the macro
+      "NON_INSTANTIABLE(classname)" to prevent this.
+    - generally inherit from Refcount<classname>
+
+  NGS_Read.h
+    - forward declare C version of *Itf, e.g. NGS_Read == ReadItf
+    - the actual struct definition includes NGS_Refcount dad as first thing.
+      the structure type has to be an NGS_Refcount to inherit from Refcount<T>.
+    - sometimes will describe the C vtable
+	- also declares iteration functions, more later
+
+  Read.cpp
+    - dispatch to self, which is a ReadItf*
+	- allow exceptions to flow through from ReadItf
+	- provide type wrappers on pointers returned from ReadItf
+
+
+It's a little over-complicated, as always, but it satisfies many simultaneous
+requirements. There's a lot I'd rather put higher up in C++, such as
+polymorphism, where I'd declare ReadItf as an abstract class and put the calls
+to VDB in a C++ ReadImpl.cpp or whatever.
+
+  Read.cpp -> vt ( ReadItf ) -> <impl>.cpp -> VDB
+
+
+But doing so would leave Java native methods out of the picture, since they call
+through to C code.
+
+  Read.java -> ReadItf.java -> JNI_Read.c -+
+                                           |
+                                           +-> NGS_Read.c -> vt -> <impl>.c -> VDB
+                                           |
+  Read.cpp -> ReadItf.cpp -----------------+
+
+
+==========================
+ITERATORS
+
+The iterators are, as you have seen, sub-classes of the interface they are
+iterating upon, which removes the need to allocate objects in Java. So there is
+generally a <ngs/Read.hpp> and <ngs/ReadIterator.hpp>.
+
+For implementation, there should be ReadIterator.cpp, but the iteration methods
+are included under ReadItf.hpp (or should be). This is because sending an
+iteration message to an object is package private, so only the ReadIterator
+should be able to send such a message, and it should know that it holds an
+object capable of iterating.
+
+ReadItf is a type-punned version of NGS_Read, so the latter also should declare
+its iteration methods.
+
+An implementation that cannot iterate should mark an error in C code with
+INTERNAL_ERROR macro. The *Itf version that called it should turn this into an
+ErrorMsg or subclass thereof, because there should be no way that the message
+was ever sent.
+
+An implementation that CAN iterate but has only a single element would allow the
+first "nextRead" or whatever to succeed, but return false on all subsequent ones
+(and not throw an exception).
+
+
+=========================
+
+TODO:
+
+I left the code in a semi-catatonic state, because initially I had Read.cpp
+calling through directly to NGS_Read. Technically, we could still do that and
+maybe it'd make sense... but again I'm trying to keep some parallel between the
+Java and C++ code.
+
+So all of the stuff in interfaces needs to be reflected in the libraries. After
+getting the code together, we'll have to look at restructuring to include the C
+code into libncbi-vdb, and the C++ code in its own static and dynamic external
+libraries, versioned independently from our releases, since they will now
+reflect the API version (1.0.x).
diff --git a/libs/ngs/SRA_DB_ReadCollection.c b/libs/ngs/SRA_DB_ReadCollection.c
new file mode 100644
index 0000000..ef0bfaa
--- /dev/null
+++ b/libs/ngs/SRA_DB_ReadCollection.c
@@ -0,0 +1,456 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+typedef struct SRA_DB_ReadCollection SRA_DB_ReadCollection;
+#define NGS_READCOLLECTION SRA_DB_ReadCollection
+
+#include "NGS_ReadCollection.h"
+#include "NGS_Reference.h"
+#include "NGS_Alignment.h"
+#include "NGS_Read.h"
+#include "NGS_FragmentBlobIterator.h"
+
+#include "NGS_Cursor.h"
+#include "NGS_String.h"
+#include "NGS_Id.h"
+
+#include "SRA_Read.h"
+#include "SRA_ReadGroup.h"
+#include "SRA_ReadGroupInfo.h"
+#include "SRA_Statistics.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <strtol.h> /* strtoi64 */
+
+#include <stddef.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+
+/*--------------------------------------------------------------------------
+ * SRA_DB_ReadCollection
+ */
+
+struct SRA_DB_ReadCollection
+{
+    NGS_ReadCollection dad;
+    const NGS_String * run_name;
+
+    const VDatabase * db;
+
+    const NGS_Cursor* curs; /* used for individual reads */
+    const struct SRA_ReadGroupInfo* group_info;
+};
+
+static
+void SRA_DB_ReadCollectionWhack ( SRA_DB_ReadCollection * self, ctx_t ctx )
+{
+    NGS_CursorRelease ( self -> curs, ctx );
+    SRA_ReadGroupInfoRelease ( self -> group_info, ctx );
+    VDatabaseRelease ( self -> db );
+    NGS_StringRelease ( self -> run_name, ctx );
+}
+
+static
+NGS_String * SRA_DB_ReadCollectionGetName ( SRA_DB_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    return NGS_StringDuplicate ( self -> run_name, ctx );
+}
+
+static
+void GetReadGroupInfo( SRA_DB_ReadCollection * self, ctx_t ctx )
+{
+    if ( self -> group_info == NULL )
+    {
+        const VTable * table;
+        rc_t rc = VDatabaseOpenTableRead ( self -> db, & table, "SEQUENCE" );
+        if ( rc != 0 )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "VDatabaseOpenTableRead(SEQUENCE) rc = %R", rc );
+        }
+        else
+        {
+            self -> group_info = SRA_ReadGroupInfoMake ( ctx, table );
+            VTableRelease ( table );
+        }
+    }
+}
+
+static
+NGS_ReadGroup * SRA_DB_ReadCollectionGetReadGroups ( SRA_DB_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    TRY ( GetReadGroupInfo( self, ctx ) )
+    {
+        TRY ( const NGS_Cursor * curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+        {
+            NGS_ReadGroup * ret = SRA_ReadGroupIteratorMake ( ctx, curs, self -> group_info, self -> run_name );
+            NGS_CursorRelease ( curs, ctx );
+            return ret;
+        }
+    }
+    return NULL;
+}
+
+static
+bool SRA_DB_ReadCollectionHasReadGroup ( SRA_DB_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    bool ret = false;
+
+    if ( self -> curs == NULL )
+    {
+        ON_FAIL ( self -> curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+            return ret;
+    }
+    TRY ( GetReadGroupInfo( self, ctx ) )
+    {
+        TRY ( SRA_ReadGroupInfoFind ( self -> group_info, ctx, spec, string_size ( spec ) ) )
+        {
+            ret = true;
+        }
+        CATCH_ALL()
+        {
+            CLEAR();
+        }
+    }
+    return ret;
+}
+
+static
+NGS_ReadGroup * SRA_DB_ReadCollectionGetReadGroup ( SRA_DB_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    if ( self -> curs == NULL )
+    {
+        ON_FAIL ( self -> curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+            return NULL;
+    }
+    TRY ( GetReadGroupInfo( self, ctx ) )
+    {
+        NGS_ReadGroup * ret = SRA_ReadGroupMake ( ctx, self -> curs, self -> group_info, self -> run_name, spec, string_size ( spec ));
+        return ret;
+    }
+    return NULL;
+}
+
+static
+NGS_Reference * SRA_DB_ReadCollectionGetReferences ( SRA_DB_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    // create empty reference iterator
+    return NGS_ReferenceMakeNull ( ctx, & self -> dad );
+}
+
+static
+bool SRA_DB_ReadCollectionHasReference ( SRA_DB_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    return false;
+}
+
+static
+NGS_Reference * SRA_DB_ReadCollectionGetReference ( SRA_DB_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    // always fail
+    INTERNAL_ERROR ( xcRowNotFound, "Reference not found ( NAME = %s )", spec );
+    return NULL;
+}
+
+static
+NGS_Alignment * SRA_DB_ReadCollectionGetAlignments ( SRA_DB_ReadCollection * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    // create empty alignment iterator
+    return NGS_AlignmentMakeNull ( ctx, NGS_StringData(self -> run_name, ctx), NGS_StringSize(self -> run_name, ctx) );
+}
+
+static
+NGS_Alignment * SRA_DB_ReadCollectionGetAlignment ( SRA_DB_ReadCollection * self, ctx_t ctx, const char * alignmentId )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    // always fail
+    INTERNAL_ERROR ( xcRowNotFound, "Aligment not found ( ID = %ld )", alignmentId );
+    return NULL;
+}
+
+static
+uint64_t SRA_DB_ReadCollectionGetAlignmentCount ( SRA_DB_ReadCollection * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary )
+{
+    return 0;
+}
+
+static
+NGS_Alignment * SRA_DB_ReadCollectionGetAlignmentRange ( SRA_DB_ReadCollection * self, ctx_t ctx, uint64_t first, uint64_t count,
+    bool wants_primary, bool wants_secondary )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    // create empty alignment iterator
+    return NGS_AlignmentMakeNull ( ctx, NGS_StringData(self -> run_name, ctx), NGS_StringSize(self -> run_name, ctx) );
+}
+
+NGS_Read * SRA_DB_ReadCollectionGetReads ( SRA_DB_ReadCollection * self, ctx_t ctx,
+    bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    if ( ! wants_unaligned )
+    {
+        return NGS_ReadMakeNull ( ctx, self -> run_name );
+    }
+    else
+    {
+        TRY ( const NGS_Cursor * curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+        {
+            NGS_Read * ret =  SRA_ReadIteratorMake ( ctx, curs, self -> run_name, wants_full, wants_partial, wants_unaligned );
+            NGS_CursorRelease ( curs, ctx );
+            return ret;
+        }
+    }
+
+    return NULL;
+}
+
+NGS_Read * SRA_DB_ReadCollectionGetRead ( SRA_DB_ReadCollection * self, ctx_t ctx, const char * readIdStr )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    TRY ( struct NGS_Id id = NGS_IdParse ( readIdStr, string_size ( readIdStr ), ctx ) )
+    {
+        if ( string_cmp ( NGS_StringData ( self -> run_name, ctx ),
+            NGS_StringSize ( self -> run_name, ctx ),
+            id . run . addr,
+            id . run . size,
+            id . run . len ) != 0 )
+        {
+            INTERNAL_ERROR ( xcArcIncorrect,
+                " expected '%.*s', actual '%.*s'",
+                NGS_StringSize ( self -> run_name, ctx ),
+                NGS_StringData ( self -> run_name, ctx ),
+                id . run . size,
+                id . run . addr );
+        }
+        else
+        {
+            /* individual reads share one iterator attached to ReadCollection */
+            if ( self -> curs == NULL )
+            {
+                ON_FAIL ( self -> curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+                    return NULL;
+            }
+            return SRA_ReadMake ( ctx, self -> curs, id . rowId, self -> run_name );
+        }
+    }
+    return NULL;
+}
+
+static
+uint64_t SRA_DB_ReadCollectionGetReadCount ( SRA_DB_ReadCollection * self, ctx_t ctx, bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+
+    if ( ! wants_unaligned )
+        return 0;
+
+    if ( self -> curs == NULL )
+    {
+        ON_FAIL ( self -> curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+            return 0;
+    }
+
+    return NGS_CursorGetRowCount ( self -> curs, ctx );
+}
+
+NGS_Read * SRA_DB_ReadCollectionGetReadRange ( SRA_DB_ReadCollection * self, ctx_t ctx, uint64_t first, uint64_t count,
+        bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    TRY ( const NGS_Cursor * curs = NGS_CursorMakeDb ( ctx, self -> db, self -> run_name, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ) )
+    {
+        NGS_Read * ret = SRA_ReadIteratorMakeRange ( ctx, curs, self -> run_name, first, count, wants_full, wants_partial, wants_unaligned );
+        NGS_CursorRelease ( curs, ctx );
+        return ret;
+    }
+    return NULL;
+}
+
+
+static struct NGS_Statistics* SRADB_ReadCollectionGetStatistics ( SRA_DB_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    const VTable * table;
+    rc_t rc = VDatabaseOpenTableRead ( self -> db, & table, "SEQUENCE" );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "VDatabaseOpenTableRead(SEQUENCE) rc = %R", rc );
+        return NULL;
+    }
+    else
+    {
+        TRY ( NGS_Statistics * ret = SRA_StatisticsMake ( ctx ) )
+        {
+            TRY ( SRA_StatisticsLoadTableStats ( ret, ctx, table, "SEQUENCE" ) )
+            {
+                SRA_StatisticsLoadBamHeader ( ret, ctx, self -> db );
+                VTableRelease ( table );
+                return ret;
+            }
+            NGS_StatisticsRelease ( ret, ctx );
+        }
+        VTableRelease ( table );
+    }
+    return NULL;
+}
+
+static struct NGS_FragmentBlobIterator* SRADB_ReadCollectionGetFragmentBlobs ( SRA_DB_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    const VTable * table;
+    rc_t rc = VDatabaseOpenTableRead ( self -> db, & table, "SEQUENCE" );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "VDatabaseOpenTableRead(SEQUENCE) rc = %R", rc );
+    }
+    else
+    {
+        TRY ( NGS_FragmentBlobIterator* ret = NGS_FragmentBlobIteratorMake ( ctx, self -> run_name, table ) )
+        {
+            VTableRelease ( table );
+            return ret;
+        }
+        VTableRelease ( table );
+    }
+
+    return NULL;
+}
+
+static NGS_ReadCollection_vt SRA_DB_ReadCollection_vt =
+{
+    /* NGS_Refcount */
+    { SRA_DB_ReadCollectionWhack },
+
+    /* NGS_Read_Collection */
+    SRA_DB_ReadCollectionGetName,
+    SRA_DB_ReadCollectionGetReadGroups,
+    SRA_DB_ReadCollectionHasReadGroup,
+    SRA_DB_ReadCollectionGetReadGroup,
+    SRA_DB_ReadCollectionGetReferences,
+    SRA_DB_ReadCollectionHasReference,
+    SRA_DB_ReadCollectionGetReference,
+    SRA_DB_ReadCollectionGetAlignments,
+    SRA_DB_ReadCollectionGetAlignment,
+    SRA_DB_ReadCollectionGetAlignmentCount,
+    SRA_DB_ReadCollectionGetAlignmentRange,
+    SRA_DB_ReadCollectionGetReads,
+    SRA_DB_ReadCollectionGetRead,
+    SRA_DB_ReadCollectionGetReadCount,
+    SRA_DB_ReadCollectionGetReadRange,
+    SRADB_ReadCollectionGetStatistics,
+    SRADB_ReadCollectionGetFragmentBlobs
+};
+
+NGS_ReadCollection * NGS_ReadCollectionMakeVDatabase ( ctx_t ctx, const VDatabase *db, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcConstructing );
+
+    size_t spec_size;
+    SRA_DB_ReadCollection * ref;
+
+    assert ( db != NULL );
+
+    assert ( spec != NULL );
+    spec_size = string_size ( spec );
+    assert ( spec_size != 0 );
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating SRA_DB_ReadCollection ( '%s' )", spec );
+    else
+    {
+        TRY ( NGS_ReadCollectionInit ( ctx, & ref -> dad, & SRA_DB_ReadCollection_vt, "SRA_DB_ReadCollection", spec ) )
+        {
+            const char * name, * dot, * end;
+
+            ref -> db = db;
+
+            end = & spec [ spec_size ];
+
+            /* TBD - this is a hack */
+            name = string_rchr ( spec, spec_size, '/' );
+            if ( name ++ == NULL )
+                name = spec;
+
+            dot = string_rchr ( name, end - name, '.' );
+            if ( dot != NULL )
+            {
+                if ( strcase_cmp ( dot, end - dot, ".ncbi_enc", sizeof ".ncbi_enc" - 1, -1 ) == 0 )
+                {
+                    end = dot;
+                    dot = string_rchr ( name, end - name, '.' );
+                }
+                if ( dot != NULL && strcase_cmp ( dot, end - dot, ".sra", sizeof ".sra" - 1, -1 ) == 0 )
+                    end = dot;
+            }
+
+            /* initialize "run_name" */
+            TRY ( ref -> run_name = NGS_StringMakeCopy ( ctx, name, end - name ) )
+            {
+                return & ref -> dad;
+            }
+        }
+
+        free ( ref );
+    }
+
+    VDatabaseRelease ( db );
+
+    return NULL;
+}
diff --git a/libs/ngs/SRA_Read.c b/libs/ngs/SRA_Read.c
new file mode 100644
index 0000000..32cef46
--- /dev/null
+++ b/libs/ngs/SRA_Read.c
@@ -0,0 +1,943 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "SRA_Read.h"
+
+#include "NGS_String.h"
+#include "NGS_Cursor.h"
+#include "NGS_Id.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+
+#include <stddef.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+#ifndef min
+#   define min(a,b) ( (a) < (b) ? (a) : (b) )
+#endif
+
+/*--------------------------------------------------------------------------
+ * SRA_Read
+ */
+
+const char * sequence_col_specs [] =
+{
+    "(INSDC:dna:text)READ",
+    "READ_TYPE",
+    "(INSDC:quality:phred)QUALITY",
+    "(INSDC:coord:len)READ_LEN",
+    "NAME",
+    "SPOT_GROUP",
+    "PRIMARY_ALIGNMENT_ID",
+    "(U64)SPOT_COUNT",
+};
+
+static NGS_Read_vt NGS_Read_vt_inst =
+{
+    {
+        {
+            /* NGS_Refcount */
+            SRA_ReadWhack
+        },
+
+        /* NGS_Fragment */
+        SRA_FragmentGetId,
+        SRA_FragmentGetSequence,
+        SRA_FragmentGetQualities,
+        SRA_FragmentIsPaired,
+        SRA_FragmentIsAligned,
+        SRA_FragmentNext
+    },
+
+    /* NGS_Read */
+    SRA_ReadGetId,
+    SRA_ReadGetName,
+    SRA_ReadGetReadGroup,
+    SRA_ReadGetCategory,
+    SRA_ReadGetSequence,
+    SRA_ReadGetQualities,
+    SRA_ReadNumFragments,
+    SRA_ReadFragIsAligned,
+    SRA_ReadIteratorNext,
+    SRA_ReadIteratorGetCount,
+};
+
+/* Init
+ */
+static
+void SRA_ReadInit ( ctx_t ctx, SRA_Read * self, const char *clsname, const char *instname, const NGS_String * run_name )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    else
+    {
+        TRY ( NGS_ReadInit ( ctx, & self -> dad, & NGS_Read_vt_inst, clsname, instname ) )
+        {
+            TRY ( self -> run_name = NGS_StringDuplicate ( run_name, ctx ) )
+            {
+                self -> wants_full      = true;
+                self -> wants_partial   = true;
+                self -> wants_unaligned = true;
+            }
+        }
+    }
+}
+
+static
+void SRA_ReadIteratorInit ( ctx_t ctx,
+                            SRA_Read * self,
+                            const char *clsname,
+                            const char *instname,
+                            const NGS_String * run_name,
+                            bool wants_full,
+                            bool wants_partial,
+                            bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    else
+    {
+        TRY ( NGS_ReadIteratorInit ( ctx, & self -> dad, & NGS_Read_vt_inst, clsname, instname ) )
+        {
+            TRY ( self -> run_name = NGS_StringDuplicate ( run_name, ctx ) )
+            {
+                self -> wants_full      = wants_full;
+                self -> wants_partial   = wants_partial;
+                self -> wants_unaligned = wants_unaligned;
+            }
+        }
+    }
+}
+
+/* Whack
+ */
+void SRA_ReadWhack ( SRA_Read * self, ctx_t ctx )
+{
+    NGS_CursorRelease ( self -> curs, ctx );
+
+    NGS_StringRelease ( self -> group_name, ctx );
+    NGS_StringRelease ( self -> run_name, ctx );
+}
+
+/* Release
+ *  release reference
+ */
+void SRA_ReadRelease ( const SRA_Read * self, ctx_t ctx )
+{
+    if ( self != NULL )
+    {
+        NGS_ReadRelease ( & self -> dad, ctx );
+    }
+}
+
+/* Duplicate
+ *  duplicate reference
+ */
+SRA_Read * SRA_ReadDuplicate ( const SRA_Read * self, ctx_t ctx )
+{
+    return NGS_RefcountDuplicate ( NGS_ReadToRefcount ( & self -> dad ), ctx );
+}
+
+void SRA_ReadIteratorInitFragment ( SRA_Read * self, ctx_t ctx )
+{
+    const void * base;
+    uint32_t elem_bits, boff, row_len;
+
+    /* read from READ_TYPE must succeed */
+    TRY ( NGS_CursorCellDataDirect ( self -> curs, ctx, self -> cur_row, seq_READ_TYPE, & elem_bits, & base, & boff, & row_len ) )
+    {
+        assert ( elem_bits == 8 );
+        assert ( boff == 0 );
+        self -> READ_TYPE = base;
+
+        TRY ( NGS_CursorCellDataDirect ( self -> curs, ctx, self -> cur_row, seq_READ_LEN, & elem_bits, & base, & boff, & row_len ) )
+        {
+            uint32_t i;
+
+            assert ( elem_bits == 32 );
+            assert ( boff == 0 );
+            self -> READ_LEN = base;
+            self -> frag_max = row_len;
+
+            /* naked hackery to quickly scan types */
+            assert ( READ_TYPE_TECHNICAL == 0 );
+            assert ( READ_TYPE_BIOLOGICAL == 1 );
+
+            /* NB - should also be taking READ_FILTER into account */
+            for ( i = 0; i < row_len; ++ i )
+            {
+                if ( self -> READ_LEN [ i ] != 0 )
+                {
+                    self -> bio_frags += self -> READ_TYPE [ i ] & READ_TYPE_BIOLOGICAL;
+                }
+            }
+        }
+    }
+}
+
+NGS_Read * SRA_ReadMake ( ctx_t ctx, const NGS_Cursor * curs, int64_t readId, const struct NGS_String * run_name )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    SRA_Read * ref;
+
+    assert ( curs != NULL );
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating SRA_Read(%lu) on '%.*s'", readId, NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname, sizeof instname, NULL, "%.*s(%lu)", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ), readId );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        TRY ( SRA_ReadInit ( ctx, ref, "SRA_Read", instname, run_name ) )
+        {
+            uint64_t row_count = NGS_CursorGetRowCount ( curs, ctx );
+
+            /* validate the requested rowId and seek to it */
+            if ( readId <= 0 || (uint64_t)readId > row_count )
+            {
+                INTERNAL_ERROR ( xcCursorAccessFailed, "rowId ( %li ) out of range for %.*s", readId, NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+            }
+            else
+            {
+                ref -> curs = NGS_CursorDuplicate ( curs, ctx );
+                ref -> cur_row = readId;
+                TRY ( SRA_ReadIteratorInitFragment ( ref, ctx ) )
+                {
+                    ref -> row_max = readId + 1;
+                    ref -> row_count = 1;
+                    ref -> seen_first = true;
+                    return & ref -> dad;
+                }
+            }
+
+            SRA_ReadRelease ( ref, ctx );
+            return NULL;
+        }
+        free ( ref );
+    }
+
+    return NULL;
+}
+
+/* GetReadId
+ */
+NGS_String * SRA_ReadGetId ( SRA_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    assert ( self != NULL );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Read accessed before a call to ReadIteratorNext()" );
+        return NULL;
+    }
+
+    /* if current row is valid, read data */
+    if ( self -> cur_row < self -> row_max )
+        return NGS_IdMake ( ctx, self -> run_name, NGSObject_Read, self -> cur_row );
+
+    USER_ERROR ( xcCursorExhausted, "No more rows available" );
+    return NULL;
+}
+
+/* GetReadName
+ */
+NGS_String * SRA_ReadGetName ( SRA_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self != NULL );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Read accessed before a call to ReadIteratorNext()" );
+        return NULL;
+    }
+    else
+    {
+        NGS_String * ret;
+        ON_FAIL ( ret = NGS_CursorGetString( self -> curs, ctx, self -> cur_row, seq_NAME ) )
+        {
+            if ( GetRCObject ( ctx -> rc ) == (int)rcColumn && GetRCState ( ctx -> rc ) == rcNotFound )
+            {   /* no NAME column; synthesize a read name based on run_name and row_id */
+                CLEAR ();
+                ret = NGS_IdMake ( ctx, self -> run_name, NGSObject_Read, self -> cur_row );
+            }
+        }
+
+        return ret;
+    }
+}
+
+/* GetReadGroup
+ */
+NGS_String * SRA_ReadGetReadGroup ( SRA_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self != NULL );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Read accessed before a call to ReadIteratorNext()" );
+        return NULL;
+    }
+
+    return NGS_CursorGetString ( self -> curs, ctx, self -> cur_row, seq_GROUP );
+}
+
+enum NGS_ReadCategory SRA_ReadGetCategory ( const SRA_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    assert ( self != NULL );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Read accessed before a call to ReadIteratorNext()" );
+        return NGS_ReadCategory_unaligned;
+    }
+
+    if ( self -> cur_row < self -> row_max )
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        ON_FAIL ( NGS_CursorCellDataDirect ( self -> curs, ctx, self -> cur_row, seq_PRIMARY_ALIGNMENT_ID, & elem_bits, & base, & boff, & row_len ) )
+        {
+            CLEAR();
+            return NGS_ReadCategory_unaligned;
+        }
+
+        {
+            uint32_t i;
+            bool seen_aligned = false;
+            bool seen_unaligned = false;
+            const int64_t * orig = base;
+            assert(elem_bits == 64);
+            for ( i = 0; i < row_len; ++ i )
+            {
+                if (orig[i] == 0)
+                {
+                    if (!seen_unaligned)
+                        seen_unaligned = true;
+                }
+                else
+                {
+                    if (!seen_aligned)
+                        seen_aligned = true;
+                }
+            }
+            if (seen_aligned)
+            {
+                return seen_unaligned ? NGS_ReadCategory_partiallyAligned : NGS_ReadCategory_fullyAligned;
+            }
+            else
+            {   /* no aligned fragments */
+                return NGS_ReadCategory_unaligned;
+            }
+        }
+    }
+    USER_ERROR ( xcCursorExhausted, "No more rows available" );
+    return NGS_ReadCategory_unaligned;
+}
+
+/* GetReadSequence
+ */
+NGS_String * SRA_ReadGetSequence ( SRA_Read * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    NGS_String * seq;
+
+    assert ( self != NULL );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Read accessed before a call to ReadIteratorNext()" );
+        return NULL;
+    }
+
+    TRY ( seq = NGS_CursorGetString ( self -> curs, ctx, self -> cur_row, seq_READ ) )
+    {
+        NGS_String * sub;
+        TRY ( sub = NGS_StringSubstrOffsetSize ( seq, ctx, offset, size ) )
+        {
+            NGS_StringRelease ( seq, ctx );
+            seq = sub;
+        }
+    }
+
+    return seq;
+}
+
+/* GetReadQualities
+ * GetReadSubQualities
+ */
+static
+NGS_String * GetReadQualities ( SRA_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    /* if current row is valid, read data */
+    if ( self -> cur_row < self -> row_max )
+    {
+        const void * base;
+        uint32_t elem_bits, boff, row_len;
+        TRY ( NGS_CursorCellDataDirect ( self -> curs, ctx, self -> cur_row, seq_QUALITY, & elem_bits, & base, & boff, & row_len ) )
+        {
+            NGS_String * new_data = NULL;
+
+            assert ( elem_bits == 8 );
+            assert ( boff == 0 );
+
+            {   /* convert to ascii-33 */
+                char * copy = malloc ( row_len + 1 );
+                if ( copy == NULL )
+                    SYSTEM_ERROR ( xcNoMemory, "allocating %u bytes for QUALITY row %ld", row_len + 1, self -> cur_row );
+                else
+                {
+                    uint32_t i;
+                    const uint8_t * orig = base;
+                    for ( i = 0; i < row_len; ++ i )
+                        copy [ i ] = ( char ) ( orig [ i ] + 33 );
+                    copy [ i ] = 0;
+
+                    new_data = NGS_StringMakeOwned ( ctx, copy, row_len );
+                    if ( FAILED () )
+                        free ( copy );
+                }
+            }
+
+            if ( ! FAILED () )
+            {
+                return new_data;
+            }
+        }
+    }
+
+    return NULL;
+}
+
+NGS_String * SRA_ReadGetQualities ( SRA_Read * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+    NGS_String * qual;
+
+    assert ( self != NULL );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Read accessed before a call to ReadIteratorNext()" );
+        return NULL;
+    }
+
+    TRY ( qual = GetReadQualities ( self, ctx ) )
+    {
+        NGS_String * sub;
+        TRY ( sub = NGS_StringSubstrOffsetSize ( qual, ctx, offset, size ) )
+        {
+            NGS_StringRelease ( qual, ctx );
+            qual = sub;
+        }
+    }
+
+    return qual;
+}
+
+/* NumFragments
+ */
+uint32_t SRA_ReadNumFragments ( SRA_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self != NULL );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Read accessed before a call to ReadIteratorNext()" );
+        return 0;
+    }
+
+    if ( self -> cur_row >= self -> row_max )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return false;
+    }
+
+    return self -> bio_frags;
+}
+
+/* FragIsAligned
+ */
+bool SRA_ReadFragIsAligned ( SRA_Read * self, ctx_t ctx, uint32_t frag_idx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self != NULL );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Read accessed before a call to ReadIteratorNext()" );
+        return 0;
+    }
+
+    if ( self -> cur_row >= self -> row_max )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return false;
+    }
+
+    if ( frag_idx >= self -> bio_frags )
+    {
+        USER_ERROR ( xcIntegerOutOfBounds, "bad fragment index" );
+        return false;
+    }
+
+    return false;
+}
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadIterator
+ */
+
+/* Make
+ */
+NGS_Read * SRA_ReadIteratorMake ( ctx_t ctx,
+                                        const NGS_Cursor * curs,
+                                        const NGS_String * run_name,
+                                        bool wants_full,
+                                        bool wants_partial,
+                                        bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    SRA_Read * ref;
+
+    assert ( curs != NULL );
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating NGS_ReadIterator on '%.*s'", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname, sizeof instname, NULL, "%.*s", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        TRY ( SRA_ReadIteratorInit ( ctx, ref, "NGS_ReadIterator", instname, run_name, wants_full, wants_partial, wants_unaligned ) )
+        {
+            ref -> curs = NGS_CursorDuplicate ( curs, ctx );
+            TRY ( NGS_CursorGetRowRange ( ref -> curs, ctx, & ref -> cur_row, & ref -> row_count ) )
+            {
+                ref -> row_max = ref -> cur_row + ref -> row_count;
+                return & ref -> dad;
+            }
+            SRA_ReadRelease ( ref, ctx );
+            return NULL;
+        }
+
+        free ( ref );
+    }
+
+    return NULL;
+}
+
+/* MakeRange
+ */
+NGS_Read * SRA_ReadIteratorMakeRange ( ctx_t ctx,
+                                       const NGS_Cursor * curs,
+                                       const NGS_String * run_name,
+                                       uint64_t first,
+                                       uint64_t count,
+                                       bool wants_full,
+                                       bool wants_partial,
+                                       bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    SRA_Read * ref;
+
+    assert ( curs != NULL );
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating NGS_ReadIterator on '%.*s'", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname, sizeof instname, NULL, "%.*s", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        TRY ( SRA_ReadIteratorInit ( ctx, ref, "NGS_ReadIterator", instname, run_name, wants_full, wants_partial, wants_unaligned ) )
+        {
+            ref -> curs = NGS_CursorDuplicate ( curs, ctx );
+            TRY ( NGS_CursorGetRowRange ( ref -> curs, ctx, & ref -> cur_row, & ref -> row_count ) )
+            {
+                ref -> row_max = min ( first + count, ref -> cur_row + ref -> row_count );
+                ref -> cur_row = first;
+                return & ref -> dad;
+            }
+            SRA_ReadRelease ( ref, ctx );
+            return NULL;
+        }
+
+        free ( ref );
+    }
+
+    return NULL;
+}
+
+/* MakeReadGroup
+ */
+NGS_Read * SRA_ReadIteratorMakeReadGroup ( ctx_t ctx,
+                                           const NGS_Cursor * curs,
+                                           const NGS_String * run_name,
+                                           const NGS_String * group_name,
+                                           uint64_t first,
+                                           uint64_t count,
+                                           bool wants_full,
+                                           bool wants_partial,
+                                           bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    TRY ( SRA_Read * ref = (SRA_Read*) SRA_ReadIteratorMakeRange ( ctx,
+                                                                   curs,
+                                                                   run_name,
+                                                                   first,
+                                                                   count,
+                                                                   wants_full,
+                                                                   wants_partial,
+                                                                   wants_unaligned ) )
+    {
+        TRY ( ref -> group_name = NGS_StringDuplicate ( group_name, ctx ) )
+        {
+            return & ref -> dad;
+        }
+        SRA_ReadWhack ( ref, ctx );
+    }
+    return NULL;
+}
+
+/* Next
+ */
+bool SRA_ReadIteratorNext ( SRA_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    assert ( self != NULL );
+
+    /* reset fragment */
+    self -> seen_first_frag = false;
+    self -> seen_last_frag = false;
+
+    self -> cur_frag = 0;
+    self -> bio_frags = 0;
+    self -> frag_idx = 0;
+    self -> frag_max = 0;
+    self -> frag_start = 0;
+    self -> frag_len = 0;
+
+    self -> READ_TYPE = NULL;
+    self -> READ_LEN = NULL;
+
+    if ( self -> seen_first )
+    {   /* move to next row */
+        ++ self -> cur_row;
+    }
+    else
+    {
+        self -> seen_first = true;
+    }
+
+    while ( self -> cur_row < self -> row_max )
+    {
+        /* work the category filter */
+        if ( ! self -> wants_full ||
+             ! self -> wants_partial ||
+             ! self -> wants_unaligned )
+        {
+            ON_FAIL ( enum NGS_ReadCategory cat = SRA_ReadGetCategory ( self, ctx ) )
+                return false;
+
+            if ( ( cat == NGS_ReadCategory_fullyAligned && ! self -> wants_full )
+                 ||
+                 ( cat == NGS_ReadCategory_partiallyAligned && ! self -> wants_partial )
+                 ||
+                 ( cat == NGS_ReadCategory_unaligned && ! self -> wants_unaligned ) )
+            {
+                ++ self -> cur_row;
+                continue;
+            }
+        }
+
+        /* work the read group filter if required */
+        if ( self -> group_name != NULL )
+        {
+            uint32_t size;
+
+            ON_FAIL ( NGS_String* group = NGS_CursorGetString ( self -> curs, ctx, self -> cur_row, seq_GROUP ) )
+                return false;
+
+            size = ( uint32_t ) NGS_StringSize ( group, ctx );
+            if ( string_cmp ( NGS_StringData ( self -> group_name, ctx ),
+                              NGS_StringSize ( self -> group_name, ctx ),
+                              NGS_StringData ( group, ctx ),
+                              size,
+                              size ) != 0 )
+            {
+                NGS_StringRelease ( group, ctx );
+                ++ self -> cur_row;
+                continue;
+            }
+            NGS_StringRelease ( group, ctx );
+        }
+
+        TRY ( SRA_ReadIteratorInitFragment ( self, ctx ) )
+        {
+            return true;
+        }
+
+        break;
+    }
+
+    return false;
+}
+
+/* GetCount
+ *  TEMPORARY
+ */
+uint64_t SRA_ReadIteratorGetCount ( const SRA_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    assert ( self != NULL );
+    return self -> row_count;
+}
+
+NGS_String * SRA_FragmentGetId ( SRA_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    assert ( self != NULL );
+    if ( ! self -> seen_first_frag )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Fragment accessed before a call to FragmentIteratorNext()" );
+        return NULL;
+    }
+    if ( self -> seen_last_frag )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+
+    return NGS_IdMakeFragment ( ctx, self -> run_name, false, self -> cur_row, self -> cur_frag );
+}
+
+static
+NGS_String * GetFragmentString ( const SRA_Read * self, ctx_t ctx, NGS_String * str )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self != NULL );
+    if ( ! self -> seen_first_frag )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Fragment accessed before a call to FragmentIteratorNext()" );
+        return NULL;
+    }
+    if ( self -> seen_last_frag )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+
+    if ( self -> cur_row < self -> row_max )
+    {
+        TRY ( NGS_String * frag = NGS_StringSubstrOffsetSize ( str, ctx, self -> frag_start, self -> frag_len ) )
+        {
+            return frag;
+        }
+    }
+
+    return NULL;
+}
+
+struct NGS_String * SRA_FragmentGetSequence ( SRA_Read * self, ctx_t ctx, uint64_t offset, uint64_t length )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+    NGS_String * ret = NULL;
+
+    assert ( self != NULL );
+    if ( ! self -> seen_first_frag )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Fragment accessed before a call to FragmentIteratorNext()" );
+        return NULL;
+    }
+    if ( self -> seen_last_frag )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+
+    {
+        TRY ( NGS_String * read = NGS_CursorGetString ( self -> curs, ctx, self -> cur_row, seq_READ ) )
+        {
+            TRY ( NGS_String * seq = GetFragmentString ( self, ctx, read ) )
+            {
+                ret = NGS_StringSubstrOffsetSize ( seq, ctx, offset, length );
+                NGS_StringRelease ( seq, ctx );
+            }
+            NGS_StringRelease ( read, ctx );
+        }
+    }
+    return ret;
+}
+
+struct NGS_String * SRA_FragmentGetQualities ( SRA_Read * self, ctx_t ctx, uint64_t offset, uint64_t length )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+    NGS_String * ret = NULL;
+
+    assert ( self != NULL );
+    if ( ! self -> seen_first_frag )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Fragment accessed before a call to FragmentIteratorNext()" );
+        return NULL;
+    }
+    if ( self -> seen_last_frag )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+
+    {
+        TRY ( NGS_String * readQual = GetReadQualities ( self, ctx ) )
+        {
+            TRY ( NGS_String * fragQual = GetFragmentString ( self, ctx, readQual ) )
+            {
+                ret = NGS_StringSubstrOffsetSize ( fragQual, ctx, offset, length );
+                NGS_StringRelease ( fragQual, ctx );
+            }
+            NGS_StringRelease ( readQual, ctx );
+        }
+    }
+    return ret;
+}
+
+bool SRA_FragmentIsPaired ( SRA_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    assert ( self != NULL );
+    if ( ! self -> seen_first_frag )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Fragment accessed before a call to FragmentIteratorNext()" );
+        return false;
+    }
+    if ( self -> seen_last_frag )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return false;
+    }
+
+    return self -> bio_frags > 1;
+}
+
+bool SRA_FragmentIsAligned ( SRA_Read * self, ctx_t ctx )
+{
+    assert ( self != NULL );
+    return false;
+}
+
+bool SRA_FragmentNext ( SRA_Read * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    assert ( self != NULL );
+
+    if ( ! self -> seen_first )
+    {
+        USER_ERROR ( xcIteratorUninitialized, "Read accessed before a call to ReadIteratorNext()" );
+        return false;
+    }
+
+    if ( self -> seen_first_frag )
+    {   /* move to next fragment */
+        ++ self -> cur_frag;
+        ++ self -> frag_idx;
+    }
+
+    /* advance to next non-empty biological fragment */
+    for ( self -> seen_first_frag = true; self -> frag_idx < self -> frag_max; ++ self -> frag_idx )
+    {
+        if ( self -> READ_LEN [ self -> frag_idx ] != 0 )
+        {
+            /* get coordinates */
+            self -> frag_start += self -> frag_len;
+            self -> frag_len = self -> READ_LEN [ self -> frag_idx ];
+
+            /* test for biological fragment */
+            assert ( READ_TYPE_TECHNICAL == 0 );
+            assert ( READ_TYPE_BIOLOGICAL == 1 );
+            if ( ( self -> READ_TYPE [ self -> frag_idx ] & READ_TYPE_BIOLOGICAL ) != 0 )
+                return true;
+        }
+    }
+
+    self -> seen_last_frag = true;
+    return false;
+}
+
diff --git a/libs/ngs/SRA_Read.h b/libs/ngs/SRA_Read.h
new file mode 100644
index 0000000..e5fc797
--- /dev/null
+++ b/libs/ngs/SRA_Read.h
@@ -0,0 +1,173 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_read_
+#define _h_sra_read_
+
+typedef struct SRA_Read SRA_Read;
+
+#ifndef NGS_READ
+#define NGS_READ SRA_Read
+#endif
+
+#ifndef _h_ngs_read_
+#include "NGS_Read.h"
+#endif
+
+#ifndef _h_insdc_insdc_
+#include <insdc/insdc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_Cursor;
+struct NGS_String;
+
+enum SequenceTableColumn
+{   // keep in sync with sequence_col_specs in SRA_Read.c
+    seq_READ,
+    seq_READ_TYPE,
+    seq_QUALITY,
+    seq_READ_LEN,
+    seq_NAME,
+    seq_GROUP,
+    seq_PRIMARY_ALIGNMENT_ID,
+    seq_SPOT_COUNT,
+
+    seq_NUM_COLS
+};  // keep in sync with sequence_col_specs in SRA_Read.c
+
+extern const char * sequence_col_specs [];
+
+/*--------------------------------------------------------------------------
+ * SRA_Read
+ */
+struct SRA_Read
+{
+    NGS_Read dad;
+
+    struct NGS_String * run_name;
+    struct NGS_String * group_name; /* if not NULL, only return reads from this read group */
+
+    int64_t cur_row;
+    int64_t row_max;
+    uint64_t row_count;
+
+    const INSDC_read_type * READ_TYPE;
+    const INSDC_coord_len * READ_LEN;
+
+    struct NGS_Cursor const * curs;
+
+    uint32_t cur_frag;
+    uint32_t bio_frags;
+    uint32_t frag_idx;
+    uint32_t frag_max;
+    uint32_t frag_start;
+    uint32_t frag_len;
+
+    bool seen_first;
+    bool seen_first_frag;
+    bool seen_last_frag;
+
+    /* read filtering criteria */
+    bool wants_full;
+    bool wants_partial;
+    bool wants_unaligned;
+};
+
+void                     SRA_ReadWhack ( NGS_READ * self, ctx_t ctx );
+
+struct NGS_String * SRA_FragmentGetId ( NGS_READ * self, ctx_t ctx );
+struct NGS_String * SRA_FragmentGetSequence ( NGS_READ * self, ctx_t ctx, uint64_t offset, uint64_t length );
+struct NGS_String * SRA_FragmentGetQualities ( NGS_READ * self, ctx_t ctx, uint64_t offset, uint64_t length );
+bool                SRA_FragmentIsPaired ( NGS_READ * self, ctx_t ctx );
+bool                SRA_FragmentIsAligned ( NGS_READ * self, ctx_t ctx );
+bool                SRA_FragmentNext ( NGS_READ * self, ctx_t ctx );
+
+struct NGS_String *      SRA_ReadGetId ( NGS_READ * self, ctx_t ctx );
+struct NGS_String *      SRA_ReadGetName ( NGS_READ * self, ctx_t ctx );
+struct NGS_String *      SRA_ReadGetReadGroup ( NGS_READ * self, ctx_t ctx );
+enum NGS_ReadCategory    SRA_ReadGetCategory ( const NGS_READ * self, ctx_t ctx );
+struct NGS_String *      SRA_ReadGetSequence ( NGS_READ * self, ctx_t ctx, uint64_t offset, uint64_t length );
+struct NGS_String *      SRA_ReadGetQualities ( NGS_READ * self, ctx_t ctx, uint64_t offset, uint64_t length );
+uint32_t                 SRA_ReadNumFragments ( NGS_READ * self, ctx_t ctx );
+bool                     SRA_ReadFragIsAligned ( NGS_READ * self, ctx_t ctx, uint32_t frag_idx );
+bool                     SRA_ReadIteratorNext ( NGS_READ * self, ctx_t ctx );
+uint64_t                 SRA_ReadIteratorGetCount ( const NGS_READ * self, ctx_t ctx );
+
+/* Make
+ * a single read
+ */
+struct NGS_Read * SRA_ReadMake ( ctx_t ctx, const struct NGS_Cursor * curs, int64_t readId, const struct NGS_String * spec );
+
+/* IteratorMake
+ */
+struct NGS_Read * SRA_ReadIteratorMake ( ctx_t ctx,
+                                               const struct NGS_Cursor * curs,
+                                               const struct NGS_String * run_name,
+                                               bool wants_full,
+                                               bool wants_partial,
+                                               bool wants_unaligned );
+
+/* IteratorInitFragment
+ */
+void SRA_ReadIteratorInitFragment ( NGS_READ * self, ctx_t ctx );
+
+/* IteratorMakeRange
+ * all reads in the specified range of rowIds
+ */
+struct NGS_Read * SRA_ReadIteratorMakeRange ( ctx_t ctx,
+                                              const struct NGS_Cursor * curs,
+                                              const struct NGS_String * run_name,
+                                              uint64_t first,
+                                              uint64_t count,
+                                              bool wants_full,
+                                              bool wants_partial,
+                                              bool wants_unaligned );
+
+/* IteratorMakeReadGroup
+ * within the specified range of rowIds, will only return reads belonging to the specified read group (groupName)
+ */
+struct NGS_Read * SRA_ReadIteratorMakeReadGroup ( ctx_t ctx,
+                                                  const struct NGS_Cursor * curs,
+                                                  const struct NGS_String * run_name,
+                                                  const struct NGS_String * group_name,
+                                                  uint64_t first,
+                                                  uint64_t count,
+                                                  bool wants_full,
+                                                  bool wants_partial,
+                                                  bool wants_unaligned );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_read_ */
diff --git a/libs/ngs/SRA_ReadCollection.c b/libs/ngs/SRA_ReadCollection.c
new file mode 100644
index 0000000..355dc71
--- /dev/null
+++ b/libs/ngs/SRA_ReadCollection.c
@@ -0,0 +1,424 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+typedef struct SRA_ReadCollection SRA_ReadCollection;
+#define NGS_READCOLLECTION SRA_ReadCollection
+
+#include "NGS_ReadCollection.h"
+#include "NGS_Reference.h"
+#include "NGS_Alignment.h"
+#include "NGS_FragmentBlobIterator.h"
+
+#include "NGS_String.h"
+#include "NGS_Cursor.h"
+#include "NGS_Id.h"
+
+#include "SRA_Read.h"
+#include "SRA_ReadGroup.h"
+#include "SRA_ReadGroupInfo.h"
+#include "SRA_Statistics.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <vdb/table.h>
+#include <klib/text.h>
+
+#include <strtol.h> /* strtoi64 */
+
+#include <stddef.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+
+/*--------------------------------------------------------------------------
+ * SRA_ReadCollection
+ */
+
+struct SRA_ReadCollection
+{
+    NGS_ReadCollection dad;
+    const VTable * tbl;
+    const NGS_String * run_name;
+
+    const NGS_Cursor* curs; /* used for individual reads */
+    const struct SRA_ReadGroupInfo* group_info;
+};
+
+static
+void SRA_ReadCollectionWhack ( SRA_ReadCollection * self, ctx_t ctx )
+{
+    NGS_CursorRelease ( self -> curs, ctx );
+    NGS_StringRelease ( self -> run_name, ctx );
+    SRA_ReadGroupInfoRelease ( self -> group_info, ctx );
+    VTableRelease ( self -> tbl );
+}
+
+static
+NGS_String * SRA_ReadCollectionGetName ( SRA_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+    return NGS_StringDuplicate ( self -> run_name, ctx );
+}
+
+static
+NGS_ReadGroup * SRA_ReadCollectionGetReadGroups ( SRA_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    if ( self -> group_info == NULL )
+    {
+        ON_FAIL ( self -> group_info = SRA_ReadGroupInfoMake ( ctx, self -> tbl ) )
+            return NULL;
+    }
+
+    {
+        TRY ( const NGS_Cursor * curs = NGS_CursorMake ( ctx, self -> tbl, sequence_col_specs, seq_NUM_COLS ) )
+        {
+            NGS_ReadGroup * ret = SRA_ReadGroupIteratorMake ( ctx, curs, self -> group_info, self -> run_name );
+            NGS_CursorRelease ( curs, ctx );
+            return ret;
+        }
+    }
+    return NULL;
+}
+
+static
+bool SRA_ReadCollectionHasReadGroup ( SRA_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    bool ret = false;
+
+    if ( self -> curs == NULL )
+    {
+        ON_FAIL ( self -> curs = NGS_CursorMake ( ctx, self -> tbl, sequence_col_specs, seq_NUM_COLS ) )
+            return ret;
+    }
+    if ( self -> group_info == NULL )
+    {
+        ON_FAIL ( self -> group_info = SRA_ReadGroupInfoMake ( ctx, self -> tbl ) )
+            return ret;
+    }
+    TRY ( SRA_ReadGroupInfoFind ( self -> group_info, ctx, spec, string_size ( spec ) ) )
+    {
+        ret = true;
+    }
+    CATCH_ALL()
+    {
+        CLEAR();
+    }
+    return ret;
+}
+
+static
+NGS_ReadGroup * SRA_ReadCollectionGetReadGroup ( SRA_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    if ( self -> curs == NULL )
+    {
+        ON_FAIL ( self -> curs = NGS_CursorMake ( ctx, self -> tbl, sequence_col_specs, seq_NUM_COLS ) )
+            return 0;
+    }
+    if ( self -> group_info == NULL )
+    {
+        ON_FAIL ( self -> group_info = SRA_ReadGroupInfoMake ( ctx, self -> tbl ) )
+            return NULL;
+    }
+    {
+        TRY ( NGS_ReadGroup * ret =  SRA_ReadGroupMake ( ctx, self -> curs, self -> group_info, self -> run_name, spec, string_size ( spec ) ) )
+        {
+            return ret;
+        }
+    }
+    return NULL;
+}
+
+static
+NGS_Reference * SRA_ReadCollectionGetReferences ( SRA_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    // create empty reference iterator
+    return NGS_ReferenceMakeNull ( ctx, & self -> dad );
+}
+
+static
+bool SRA_ReadCollectionHasReference ( SRA_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    return false;
+}
+
+static
+NGS_Reference * SRA_ReadCollectionGetReference ( SRA_ReadCollection * self, ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    // always fail
+    INTERNAL_ERROR ( xcRowNotFound, "Reference not found ( NAME = %s )", spec );
+    return NULL;
+}
+
+static
+NGS_Alignment * SRA_ReadCollectionGetAlignments ( SRA_ReadCollection * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    // create empty alignment iterator
+    return NGS_AlignmentMakeNull ( ctx, NGS_StringData(self -> run_name, ctx), NGS_StringSize(self -> run_name, ctx) );
+}
+
+static
+NGS_Alignment * SRA_ReadCollectionGetAlignment ( SRA_ReadCollection * self, ctx_t ctx, const char * alignmentId )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    // always fail
+    INTERNAL_ERROR ( xcRowNotFound, "Aligment not found ( ID = %ld )", alignmentId );
+    return NULL;
+}
+
+static
+uint64_t SRA_ReadCollectionGetAlignmentCount ( SRA_ReadCollection * self, ctx_t ctx,
+    bool wants_primary, bool wants_secondary )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    return 0;
+}
+
+static
+NGS_Alignment * SRA_ReadCollectionGetAlignmentRange ( SRA_ReadCollection * self, ctx_t ctx, uint64_t first, uint64_t count,
+    bool wants_primary, bool wants_secondary )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    // create empty alignment iterator
+    return NGS_AlignmentMakeNull ( ctx, NGS_StringData(self -> run_name, ctx), NGS_StringSize(self -> run_name, ctx) );
+}
+
+struct NGS_Read * SRA_ReadCollectionGetReads ( SRA_ReadCollection * self, ctx_t ctx,
+    bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    if ( ! wants_unaligned )
+    {
+        return NGS_ReadMakeNull ( ctx, self -> run_name );
+    }
+    else
+    {   /* iterators get their own cursors */
+        TRY ( const NGS_Cursor * curs = NGS_CursorMake ( ctx, self -> tbl, sequence_col_specs, seq_NUM_COLS ) )
+        {
+            NGS_Read * ret = SRA_ReadIteratorMake ( ctx, curs, self -> run_name, wants_full, wants_partial, wants_unaligned );
+            NGS_CursorRelease ( curs, ctx );
+            return ret;
+        }
+    }
+
+    return NULL;
+}
+
+NGS_Read * SRA_ReadCollectionGetRead ( SRA_ReadCollection * self, ctx_t ctx, const char * readIdStr )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    TRY ( struct NGS_Id id = NGS_IdParse ( readIdStr, string_size ( readIdStr ), ctx ) )
+    {
+        if ( string_cmp ( NGS_StringData ( self -> run_name, ctx ),
+            NGS_StringSize ( self -> run_name, ctx ),
+            id . run . addr,
+            id . run . size,
+            id . run . len ) != 0 )
+        {
+            INTERNAL_ERROR ( xcArcIncorrect,
+                " expected '%.*s', actual '%.*s'",
+                NGS_StringSize ( self -> run_name, ctx ),
+                NGS_StringData ( self -> run_name, ctx ),
+                id . run . size,
+                id . run . addr );
+        }
+        else
+        {
+            /* individual reads share one iterator attached to ReadCollection */
+            if ( self -> curs == NULL )
+            {
+                ON_FAIL ( self -> curs = NGS_CursorMake ( ctx, self -> tbl, sequence_col_specs, seq_NUM_COLS ) )
+                    return NULL;
+            }
+            return SRA_ReadMake ( ctx, self -> curs, id . rowId, self -> run_name );
+        }
+    }
+    return NULL;
+}
+
+static
+uint64_t SRA_ReadCollectionGetReadCount ( SRA_ReadCollection * self, ctx_t ctx, bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    if ( ! wants_unaligned )
+        return 0;
+
+    if ( self -> curs == NULL )
+    {
+        ON_FAIL ( self -> curs = NGS_CursorMake ( ctx, self -> tbl, sequence_col_specs, seq_NUM_COLS ) )
+            return 0;
+    }
+
+    return NGS_CursorGetRowCount ( self -> curs, ctx );
+}
+
+NGS_Read * SRA_ReadCollectionGetReadRange ( SRA_ReadCollection * self, ctx_t ctx, uint64_t first, uint64_t count,
+        bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcAccessing );
+
+    /* iterators get their own cursors */
+    TRY ( const NGS_Cursor * curs = NGS_CursorMake ( ctx, self -> tbl, sequence_col_specs, seq_NUM_COLS ) )
+    {
+        NGS_Read * ret = SRA_ReadIteratorMakeRange ( ctx, curs, self -> run_name, first, count, wants_full, wants_partial, wants_unaligned );
+        NGS_CursorRelease ( curs, ctx );
+        return ret;
+    }
+
+    return NULL;
+}
+
+static struct NGS_Statistics* SRA_ReadCollectionGetStatistics ( SRA_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    TRY ( NGS_Statistics * ret = SRA_StatisticsMake ( ctx ) )
+    {
+        TRY ( SRA_StatisticsLoadTableStats ( ret, ctx, self -> tbl, "SEQUENCE" ) )
+        {
+            return ret;
+        }
+        NGS_StatisticsRelease ( ret, ctx );
+    }
+
+    return NULL;
+}
+
+static struct NGS_FragmentBlobIterator* SRA_ReadCollectionGetFragmentBlobs ( SRA_ReadCollection * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    TRY ( NGS_FragmentBlobIterator* ret = NGS_FragmentBlobIteratorMake ( ctx, self -> run_name, self -> tbl ) )
+    {
+        return ret;
+    }
+
+    return NULL;
+}
+
+static NGS_ReadCollection_vt SRA_ReadCollection_vt =
+{
+    /* NGS_Refcount */
+    { SRA_ReadCollectionWhack },
+
+    /* NGS_Read_Collection */
+    SRA_ReadCollectionGetName,
+    SRA_ReadCollectionGetReadGroups,
+    SRA_ReadCollectionHasReadGroup,
+    SRA_ReadCollectionGetReadGroup,
+    SRA_ReadCollectionGetReferences,
+    SRA_ReadCollectionHasReference,
+    SRA_ReadCollectionGetReference,
+    SRA_ReadCollectionGetAlignments,
+    SRA_ReadCollectionGetAlignment,
+    SRA_ReadCollectionGetAlignmentCount,
+    SRA_ReadCollectionGetAlignmentRange,
+    SRA_ReadCollectionGetReads,
+    SRA_ReadCollectionGetRead,
+    SRA_ReadCollectionGetReadCount,
+    SRA_ReadCollectionGetReadRange,
+    SRA_ReadCollectionGetStatistics,
+    SRA_ReadCollectionGetFragmentBlobs
+};
+
+NGS_ReadCollection * NGS_ReadCollectionMakeVTable ( ctx_t ctx, const VTable *tbl, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcConstructing );
+
+    size_t spec_size;
+    SRA_ReadCollection * ref;
+
+    assert ( tbl != NULL );
+
+    assert ( spec != NULL );
+    spec_size = string_size ( spec );
+    assert ( spec_size != 0 );
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating SRA_ReadCollection ( '%s' )", spec );
+    else
+    {
+        TRY ( NGS_ReadCollectionInit ( ctx, & ref -> dad, & SRA_ReadCollection_vt, "SRA_ReadCollection", spec ) )
+        {
+            const char * name, * dot, * end;
+
+            ref -> tbl = tbl;
+
+            end = & spec [ spec_size ];
+
+            /* TBD - this is a hack */
+            name = string_rchr ( spec, spec_size, '/' );
+            if ( name ++ == NULL )
+                name = spec;
+
+            dot = string_rchr ( name, end - name, '.' );
+            if ( dot != NULL )
+            {
+                if ( strcase_cmp ( dot, end - dot, ".ncbi_enc", sizeof ".ncbi_enc" - 1, -1 ) == 0 )
+                {
+                    end = dot;
+                    dot = string_rchr ( name, end - name, '.' );
+                }
+                if ( dot != NULL && strcase_cmp ( dot, end - dot, ".sra", sizeof ".sra" - 1, -1 ) == 0 )
+                    end = dot;
+            }
+
+            /* initialize "name" */
+            TRY ( ref -> run_name = NGS_StringMakeCopy ( ctx, name, end - name ) )
+            {
+                return & ref -> dad;
+            }
+        }
+
+        free ( ref );
+    }
+
+    VTableRelease ( tbl );
+
+    return NULL;
+}
diff --git a/libs/ngs/SRA_ReadGroup.c b/libs/ngs/SRA_ReadGroup.c
new file mode 100644
index 0000000..be6a96e
--- /dev/null
+++ b/libs/ngs/SRA_ReadGroup.c
@@ -0,0 +1,429 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "SRA_ReadGroup.h"
+
+#include "SRA_Read.h"
+#include "SRA_ReadGroupInfo.h"
+#include "SRA_Statistics.h"
+
+#include "NGS_String.h"
+#include "NGS_Cursor.h"
+#include "NGS_Id.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/refcount.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/insdc.h>
+
+#include <strtol.h> /* strtoi64 */
+
+#include <stddef.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+/*--------------------------------------------------------------------------
+ * SRA_Read
+ */
+
+struct SRA_ReadGroup
+{
+    NGS_ReadGroup dad;   
+    
+    const NGS_String * run_name; 
+    const NGS_String * name; /* owns the char buffer */
+    
+    const NGS_Cursor * curs;
+    const SRA_ReadGroupInfo* group_info;
+    
+    bool seen_first;
+    bool iterating;
+    
+    uint32_t cur_group;
+};
+
+static void                     SRA_ReadGroupWhack ( SRA_ReadGroup * self, ctx_t ctx );
+static struct NGS_String*       SRA_ReadGroupGetName ( const SRA_ReadGroup * self, ctx_t ctx );
+static struct NGS_Read*         SRA_ReadGroupGetReads ( const SRA_ReadGroup * self, ctx_t ctx, bool wants_full, bool wants_partial, bool wants_unaligned );
+static struct NGS_Read*         SRA_ReadGroupGetRead ( const SRA_ReadGroup * self, ctx_t ctx, const char* readId );
+static struct NGS_Statistics*   SRA_ReadGroupGetStatistics ( const SRA_ReadGroup * self, ctx_t ctx );
+static bool                     SRA_ReadGroupIteratorNext ( SRA_ReadGroup * self, ctx_t ctx );
+
+static NGS_ReadGroup_vt NGS_ReadGroup_vt_inst =
+{
+    {
+        /* NGS_RefCount */
+        SRA_ReadGroupWhack
+    },
+
+    /* NGS_ReadGroup */
+    SRA_ReadGroupGetName,
+    SRA_ReadGroupGetReads,
+    SRA_ReadGroupGetRead,
+    SRA_ReadGroupGetStatistics,
+    SRA_ReadGroupIteratorNext,
+}; 
+
+/* Init
+ */
+static
+void SRA_ReadGroupInit ( ctx_t ctx, 
+                         SRA_ReadGroup * self, 
+                         const char *clsname, 
+                         const char *instname, 
+                         const NGS_String* run_name, 
+                         const char* group_name, size_t group_name_size,
+                         const struct SRA_ReadGroupInfo* group_info )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    if ( self == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    else
+    {
+        TRY ( NGS_ReadGroupInit ( ctx, & self -> dad, & NGS_ReadGroup_vt_inst, clsname, instname ) )
+        {   
+            TRY ( self -> run_name = NGS_StringDuplicate ( run_name, ctx ) )
+            {
+                TRY ( self -> name = NGS_StringMakeCopy ( ctx, group_name, group_name_size ) )
+                {
+                    self -> group_info = SRA_ReadGroupInfoDuplicate ( group_info, ctx );
+                }
+            }
+        }
+    }
+}
+
+/* Whack
+ */
+static
+void SRA_ReadGroupWhack ( SRA_ReadGroup * self, ctx_t ctx )
+{
+    NGS_StringRelease ( self -> run_name, ctx );
+    NGS_StringRelease ( self -> name, ctx );
+    NGS_CursorRelease ( self -> curs, ctx );
+    SRA_ReadGroupInfoRelease ( self -> group_info, ctx );
+}
+
+struct NGS_String* SRA_ReadGroupGetName ( const SRA_ReadGroup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    
+    assert ( self != NULL );
+    
+    if ( ! self -> seen_first ) 
+    {
+        USER_ERROR ( xcIteratorUninitialized, "ReadGroup accessed before a call to ReadIteratorNext()" );
+        return NULL;
+    }
+    else if ( self -> cur_group >= self -> group_info -> count )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+    
+    return NGS_StringDuplicate ( self -> name, ctx );
+}
+
+struct NGS_Read* SRA_ReadGroupGetReads ( const SRA_ReadGroup * self, ctx_t ctx, bool wants_full, bool wants_partial, bool wants_unaligned )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    
+    if ( ! self -> seen_first ) 
+    {
+        USER_ERROR ( xcIteratorUninitialized, "ReadGroup accessed before a call to ReadIteratorNext()" );
+        return NULL;
+    }    
+    else if ( self -> cur_group >= self -> group_info -> count )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+    
+    {   
+        uint64_t start = self -> group_info -> groups [ self -> cur_group ] . min_row;
+        uint64_t count = self -> group_info -> groups [ self -> cur_group ] . max_row - start;
+        return SRA_ReadIteratorMakeReadGroup ( ctx,         
+                                               self -> curs, 
+                                               self -> run_name, 
+                                               self -> name, 
+                                               start, 
+                                               count, 
+                                               wants_full, 
+                                               wants_partial, 
+                                               wants_unaligned );
+    }
+}
+
+struct NGS_Read* SRA_ReadGroupGetRead ( const SRA_ReadGroup * self, ctx_t ctx, const char* readIdStr )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    
+    if ( ! self -> seen_first ) 
+    {
+        USER_ERROR ( xcIteratorUninitialized, "ReadGroup accessed before a call to ReadIteratorNext()" );
+        return NULL;
+    }    
+    else if ( self -> cur_group >= self -> group_info -> count )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+    
+    {
+        TRY ( struct NGS_Id id = NGS_IdParse ( readIdStr, string_size ( readIdStr ), ctx ) )
+        {
+            if ( string_cmp ( NGS_StringData ( self -> run_name, ctx ), 
+                NGS_StringSize ( self -> run_name, ctx ),
+                id . run . addr, 
+                id . run . size, 
+                id . run . len ) != 0 ) 
+            {
+                INTERNAL_ERROR ( xcArcIncorrect, 
+                    " expected '%.*s', actual '%.*s'", 
+                    NGS_StringSize ( self -> run_name, ctx ),
+                    NGS_StringData ( self -> run_name, ctx ), 
+                    id . run . size, 
+                    id . run . addr );
+            }    
+            else
+            {   
+                /* make sure the requested read is from this read group */
+                NGS_Read* ret;
+                TRY ( ret = SRA_ReadMake ( ctx, self -> curs, id . rowId, self -> run_name ) )
+                {   
+                    TRY ( const NGS_String* readGroup = NGS_ReadGetReadGroup ( ret, ctx ) )
+                    {
+                        if ( string_cmp ( NGS_StringData ( self -> name, ctx ), 
+                            NGS_StringSize ( self -> name, ctx ),
+                            NGS_StringData ( readGroup, ctx ), 
+                            NGS_StringSize ( readGroup, ctx ),
+                            NGS_StringSize ( readGroup, ctx ) ) == 0 ) 
+                        {
+                            NGS_StringRelease ( readGroup, ctx );
+                            return ret; 
+                        }
+                        INTERNAL_ERROR ( xcWrongReadGroup, 
+                            "Requested read is from a difference read group (expected '%.*s', actual '%.s')", 
+                            NGS_StringSize ( self -> name, ctx ),
+                            NGS_StringData ( self -> name, ctx ), 
+                            NGS_StringSize ( readGroup, ctx ),                            
+                            NGS_StringData ( readGroup, ctx ) );
+                        NGS_StringRelease ( readGroup, ctx );
+                    }
+                    NGS_ReadRelease ( ret, ctx );
+                }
+            }
+        }
+    }
+    return NULL;
+}
+
+static struct NGS_Statistics* SRA_ReadGroupGetStatistics ( const SRA_ReadGroup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    
+    if ( ! self -> seen_first ) 
+    {
+        USER_ERROR ( xcIteratorUninitialized, "ReadGroup accessed before a call to ReadIteratorNext()" );
+        return NULL;
+    }    
+    else if ( self -> cur_group >= self -> group_info -> count )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+
+    {
+        const struct SRA_ReadGroupStats * group_stats = & self -> group_info -> groups [ self -> cur_group ];
+        TRY ( NGS_Statistics * ret = SRA_StatisticsMake ( ctx ) )
+        {
+            TRY ( NGS_StatisticsAddU64 ( ret, ctx, "BASE_COUNT", group_stats -> base_count ) )
+            {
+                TRY ( NGS_StatisticsAddU64 ( ret, ctx, "BIO_BASE_COUNT", group_stats -> bio_base_count ) )
+                {
+                    TRY ( NGS_StatisticsAddU64 ( ret, ctx, "SPOT_COUNT", group_stats -> row_count ) )
+                    {
+                        TRY ( NGS_StatisticsAddU64 ( ret, ctx, "SPOT_MAX", group_stats -> max_row) )
+                        {
+                            TRY ( NGS_StatisticsAddU64 ( ret, ctx, "SPOT_MIN", group_stats -> min_row) )
+                            {
+                                return ret;
+                            }
+                        }
+                    }
+                }
+            }
+            NGS_StatisticsRelease ( ret, ctx );
+        }
+    }
+    
+    return NULL;
+}
+
+struct NGS_ReadGroup * SRA_ReadGroupMake ( ctx_t ctx, 
+                                           const struct NGS_Cursor * curs, 
+                                           const struct SRA_ReadGroupInfo* group_info, 
+                                           const struct NGS_String * run_name,
+                                           const char * group_name, size_t group_name_size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+    SRA_ReadGroup * ref;
+
+    assert ( curs != NULL );
+    assert ( run_name != NULL );
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating NGS_ReadGroup on '%.*s'", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname, sizeof instname, NULL, "%.*s", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        TRY ( SRA_ReadGroupInit ( ctx, ref, "NGS_ReadGroup", instname, run_name, group_name, group_name_size, group_info ) )
+        {
+            TRY ( ref -> curs = NGS_CursorDuplicate ( curs, ctx ) )
+            {
+                TRY ( ref -> cur_group = SRA_ReadGroupInfoFind ( ref -> group_info, ctx, group_name, group_name_size ) )
+                {
+                    ref -> seen_first = true;
+                    return & ref -> dad;
+                }
+            }
+            SRA_ReadGroupWhack ( ref, ctx );
+        }
+
+        free ( ref );
+    }
+
+    return NULL;
+}                                            
+
+
+/*--------------------------------------------------------------------------
+ * NGS_ReadGroupIterator
+ */
+ 
+/* Make
+ */
+NGS_ReadGroup * SRA_ReadGroupIteratorMake ( ctx_t ctx, 
+                                                  const NGS_Cursor * curs, 
+                                                  const struct SRA_ReadGroupInfo* group_info, 
+                                                  const struct NGS_String * run_name )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    SRA_ReadGroup * ref;
+
+    assert ( curs != NULL );
+    assert ( run_name != NULL );
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating NGS_ReadGroupIterator on '%.*s'", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+    else
+    {
+#if _DEBUGGING
+        char instname [ 256 ];
+        string_printf ( instname, sizeof instname, NULL, "%.*s", NGS_StringSize ( run_name, ctx ), NGS_StringData ( run_name, ctx ) );
+        instname [ sizeof instname - 1 ] = 0;
+#else
+        const char *instname = "";
+#endif
+        TRY ( SRA_ReadGroupInit ( ctx, ref, "NGS_ReadGroupIterator", instname, run_name, "", 0, group_info ) )
+        {
+            TRY ( ref -> curs = NGS_CursorDuplicate ( curs, ctx ) )
+            {
+                ref -> iterating = true;
+                return & ref -> dad;
+            }
+            SRA_ReadGroupWhack ( ref, ctx );
+        }
+
+        free ( ref );
+    }
+
+    return NULL;
+}
+
+/* Next
+ */
+bool SRA_ReadGroupIteratorNext ( SRA_ReadGroup * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+
+    assert ( self != NULL );
+    
+    if ( ! self -> iterating )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return false;
+    }
+
+    if ( self -> seen_first )
+    {   /* move to next group */
+        ++ self -> cur_group;
+    }
+    else
+    {
+        self -> seen_first = true;
+    }
+
+    while ( self -> cur_group < self -> group_info -> count )
+    {
+        if ( self -> group_info -> groups [ self -> cur_group ] . min_row == 0 )
+        {
+           ++ self -> cur_group;
+        }
+        else
+        {
+            NGS_StringRelease ( self -> name, ctx );
+            self -> name = NULL;
+            TRY ( self -> name = NGS_StringDuplicate ( self -> group_info -> groups [ self -> cur_group ] . name, ctx ) )
+            {
+                return true;
+            }
+            /* error - make the iterator unusable */
+            self -> cur_group = self -> group_info -> count;
+            return false;
+        }
+    }
+    
+    return false;
+}
diff --git a/libs/ngs/SRA_ReadGroup.h b/libs/ngs/SRA_ReadGroup.h
new file mode 100644
index 0000000..60d111d
--- /dev/null
+++ b/libs/ngs/SRA_ReadGroup.h
@@ -0,0 +1,73 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_readgroup_
+#define _h_sra_readgroup_
+
+typedef struct SRA_ReadGroup SRA_ReadGroup;
+#ifndef _h_ngs_readgroup_
+#define NGS_READGROUP SRA_ReadGroup
+#include "NGS_ReadGroup.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_Cursor;
+struct SRA_ReadGroupInfo;
+struct NGS_String;
+
+/*--------------------------------------------------------------------------
+ * SRA_ReadGroup
+ */
+
+/* Make
+    run_name : will be used for unnamed group if name == NULL
+    group_name : NULL OK, will locate unnamed group and spec as the group's name
+ */
+struct NGS_ReadGroup * SRA_ReadGroupMake ( ctx_t ctx, 
+                                                 const struct NGS_Cursor * curs, 
+                                                 const struct SRA_ReadGroupInfo* group_info, 
+                                                 const struct NGS_String * run_name,
+                                                 const char * group_name, size_t group_name_size ); 
+
+/* IteratorMake
+    run_name : will be used for unnamed group
+ */
+struct NGS_ReadGroup * SRA_ReadGroupIteratorMake ( ctx_t ctx, 
+                                                         const struct NGS_Cursor * curs, 
+                                                         const struct SRA_ReadGroupInfo* group_info, 
+                                                         const struct NGS_String * run_name ); 
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_readgroup_ */
diff --git a/libs/ngs/SRA_ReadGroupInfo.c b/libs/ngs/SRA_ReadGroupInfo.c
new file mode 100644
index 0000000..6e7f9a0
--- /dev/null
+++ b/libs/ngs/SRA_ReadGroupInfo.c
@@ -0,0 +1,333 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "SRA_ReadGroupInfo.h"
+
+#include "NGS_String.h"
+
+#include <klib/namelist.h>
+#include <klib/rc.h>
+
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+
+#include <vdb/table.h>
+
+#include <sysalloc.h>
+#include <string.h>
+
+const SRA_ReadGroupInfo* SRA_ReadGroupInfoDuplicate ( const SRA_ReadGroupInfo* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "SRA_ReadGroupInfo" ) )
+        {
+        case krefOkay:
+            break;
+        case krefLimit:
+            {
+                FUNC_ENTRY ( ctx, rcSRA, rcRefcount, rcAttaching );
+                INTERNAL_ERROR ( xcRefcountOutOfBounds, "SRA_ReadGroupInfo at %#p", self );
+                atomic32_set ( & ( ( SRA_ReadGroupInfo * ) self ) -> refcount, 0 );
+                break;
+            }
+        }
+    }
+
+    return self;
+}
+
+static
+void
+SRA_ReadGroupInfoWhack( const SRA_ReadGroupInfo* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    uint32_t i;
+    for ( i = 0; i < self -> count; ++i )
+    {
+        NGS_StringRelease ( self -> groups [ i ] . name, ctx );
+    }
+    
+    free ( ( void * ) self );
+}
+
+static
+uint64_t ReadU64 ( const struct KMetadata * meta, ctx_t ctx, const char* fmt, const char* name )
+{
+    uint64_t ret = 0;
+    
+    const KMDataNode * node;
+    rc_t rc = KMetadataOpenNodeRead ( meta, & node, fmt, name );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "KMetadataOpenNodeRead(%s) rc = %R", name, rc );
+    }
+    else
+    {
+        rc = KMDataNodeReadAsU64 ( node, & ret );
+        if ( rc != 0 )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "KMDataNodeReadAsU64(%s) rc = %R", name, rc );
+        }
+        KMDataNodeRelease ( node );
+    }
+    
+    return ret;
+}            
+
+static
+void ParseBamHeader ( struct SRA_ReadGroupStats * self, ctx_t ctx, const struct KMetadata * meta, const char* group_name )
+{
+
+}
+
+static
+void SRA_ReadGroupStatsInit( struct SRA_ReadGroupStats * self, ctx_t ctx, const struct KMetadata * meta, const char* group_name )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    const KMDataNode * group_node;
+    bool skip_group = true;
+    rc_t rc;
+    
+    assert ( self );
+    assert ( meta );
+    assert ( group_name );
+
+    rc = KMetadataOpenNodeRead ( meta, & group_node, "STATS/SPOT_GROUP/%s", group_name );
+    if ( rc != 0 )
+    {
+        if ( strcmp ( group_name, "default" ) == 0 &&
+             rc == RC ( rcDB, rcMetadata, rcReading, rcTransfer, rcIncomplete ) )
+        {   /* no default read group - skip */ 
+        }
+        else
+        {
+            INTERNAL_ERROR ( xcUnexpected, "KMetadataOpenNodeRead(STATS/SPOT_GROUP/%s) rc = %R", group_name, rc );
+        }
+    }
+    
+    ON_FAIL ( self -> min_row = ReadU64 ( meta, ctx, "STATS/SPOT_GROUP/%s/SPOT_MIN", group_name ) )
+    {
+        if ( strcmp ( group_name, "default" ) == 0 )
+        {   /* default read group has no data - skip */ 
+            CLEAR ();
+        }
+        else
+        {
+            INTERNAL_ERROR ( xcUnexpected, "KMetadataOpenNodeRead(STATS/SPOT_GROUP/%s/SPOT_MIN) rc = %R", group_name, ctx -> rc );
+        }
+    }
+    else
+    {
+        TRY ( self -> max_row = ReadU64 ( meta, ctx, "STATS/SPOT_GROUP/%s/SPOT_MAX", group_name ) )
+        {
+            TRY ( self -> row_count = ReadU64 ( meta, ctx, "STATS/SPOT_GROUP/%s/SPOT_COUNT", group_name ) )
+            {
+                TRY ( self -> base_count = ReadU64 ( meta, ctx, "STATS/SPOT_GROUP/%s/BASE_COUNT", group_name ) )
+                {
+                    TRY ( self -> bio_base_count = ReadU64 ( meta, ctx, "STATS/SPOT_GROUP/%s/BIO_BASE_COUNT", group_name ) )
+                    {
+                        skip_group = false;
+                    }
+                }
+            }
+        }
+    }
+    
+    if ( skip_group )
+    {
+        self -> name = NGS_StringMake( ctx, "", 0 );
+    }
+    else
+    {
+        TRY ( ParseBamHeader ( self, ctx, meta, group_name ) )
+        {
+            /* if the node has attribute 'name', use it as the read group name, otherwise use the group node's key */
+            char buf[1024];
+            size_t size;
+            rc = KMDataNodeReadAttr ( group_node, "name", buf, sizeof ( buf ), & size );
+            if ( rc == 0 )
+            {
+                self -> name = NGS_StringMakeCopy ( ctx, buf, size );
+            }
+            else if ( GetRCState ( rc ) == rcNotFound )
+            {
+                self -> name = NGS_StringMakeCopy ( ctx, group_name, string_size ( group_name ) );
+            }
+            else
+            {
+                INTERNAL_ERROR ( xcUnexpected, "KMDataNodeReadAttr(STATS/SPOT_GROUP/%s, 'name') rc = %R", group_name, rc );
+            }
+        }
+    }
+    
+    KMDataNodeRelease ( group_node );
+}
+
+void SRA_ReadGroupInfoRelease ( const SRA_ReadGroupInfo* self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "NGS_Refcount" ) )
+        {
+        case krefOkay:
+            break;
+        case krefWhack:
+            SRA_ReadGroupInfoWhack ( self, ctx );
+            break;
+        case krefNegative:
+            {
+                FUNC_ENTRY ( ctx, rcSRA, rcRefcount, rcReleasing );
+                INTERNAL_ERROR ( xcSelfZombie, "SRA_ReadGroupInfo at %#p", self );
+                atomic32_set ( & ( ( SRA_ReadGroupInfo * ) self ) -> refcount, 0 );
+                break;
+            }
+        }
+    }
+}
+
+const SRA_ReadGroupInfo* SRA_ReadGroupInfoMake ( ctx_t ctx, const struct VTable* table )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    rc_t rc = 0;
+    const struct KMetadata * meta;
+    
+    assert ( table != NULL );
+    
+    rc = VTableOpenMetadataRead ( table, & meta );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "VTableOpenMetadataRead rc = %R", rc );
+    }
+    else
+    {
+        const KMDataNode * groups;
+        rc = KMetadataOpenNodeRead ( meta, & groups, "STATS/SPOT_GROUP" );
+        if ( rc != 0 )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "KMetadataOpenNodeRead rc = %R", rc );
+        }
+        else
+        {
+            struct KNamelist * names;
+            rc = KMDataNodeListChildren ( groups, & names );
+            if ( rc != 0 )
+            {
+                INTERNAL_ERROR ( xcUnexpected, "KMDataNodeListChildren rc = %R", rc );
+            }
+            else
+            {
+                uint32_t count;
+                rc = KNamelistCount ( names, & count );
+                if ( rc != 0 )
+                {
+                    INTERNAL_ERROR ( xcUnexpected, "KNamelistCount rc = %R", rc );
+                }
+                else
+                {
+                    SRA_ReadGroupInfo* ref = calloc ( 1, sizeof ( * ref ) + ( count - 1 ) * sizeof ( ref -> groups [ 0 ] ) );
+                    if ( ref == NULL )
+                    {
+                        SYSTEM_ERROR ( xcNoMemory, "allocating SRA_ReadGroupInfo" );
+                    }
+                    else
+                    {
+                        uint32_t i;
+                        
+                        KRefcountInit ( & ref -> refcount, 1, "SRA_ReadGroupInfo", "Make", "" );
+                        ref -> count = count;
+                        
+                        for ( i = 0; i < count; ++i )
+                        {
+                            const char* group_name;
+                            rc = KNamelistGet ( names, i, & group_name );
+                            if ( rc != 0 )
+                                INTERNAL_ERROR ( xcUnexpected, "KNamelistGet = %R", rc );
+                            else
+                                SRA_ReadGroupStatsInit ( & ref -> groups [ i ], ctx, meta, group_name );
+                                                       
+                            if ( FAILED () )
+                                break;
+                        }
+               
+                        if ( ! FAILED () )
+                        {
+                            KNamelistRelease ( names );
+                            KMDataNodeRelease ( groups );
+                            KMetadataRelease ( meta );
+                            
+                            return ref;
+                        }
+                        
+                        SRA_ReadGroupInfoWhack ( ref, ctx );
+                    }
+                }
+                KNamelistRelease ( names );
+            }
+            KMDataNodeRelease ( groups );
+        }
+        KMetadataRelease ( meta );
+    }
+    return NULL;
+}
+
+uint32_t SRA_ReadGroupInfoFind ( const SRA_ReadGroupInfo* self, ctx_t ctx, char const* name, size_t name_size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    assert ( self != NULL );
+    assert ( name != NULL );
+
+    {
+        uint32_t i;
+        for ( i = 0; i < self -> count; ++i )
+        {
+            if ( string_cmp ( NGS_StringData ( self -> groups [ i ] . name, ctx ), 
+                              NGS_StringSize ( self -> groups [ i ] . name, ctx ), 
+                              name, 
+                              name_size, 
+                              ( uint32_t ) name_size ) == 0 )
+            {
+                return i;
+            }
+        }
+        INTERNAL_ERROR ( xcStringNotFound, "Read Group '%.*s' is not found", name_size, name );
+    }
+    return 0;
+}
+
+
diff --git a/libs/ngs/SRA_ReadGroupInfo.h b/libs/ngs/SRA_ReadGroupInfo.h
new file mode 100644
index 0000000..af4c148
--- /dev/null
+++ b/libs/ngs/SRA_ReadGroupInfo.h
@@ -0,0 +1,89 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_readgroupinfo_
+#define _h_sra_readgroupinfo_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+typedef struct SRA_ReadGroupInfo SRA_ReadGroupInfo;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+ 
+struct VTable;
+struct NGS_String;
+
+/*--------------------------------------------------------------------------
+ * SRA_ReadGroup
+ */
+ 
+struct SRA_ReadGroupStats
+{ 
+    const struct NGS_String* name;
+    uint64_t min_row; 
+    uint64_t max_row; 
+    uint64_t row_count; 
+    uint64_t base_count; 
+    uint64_t bio_base_count; 
+    
+    /* BAM header info */
+    const struct NGS_String* bam_LB; /* Library. */
+    const struct NGS_String* bam_SM; /* Sample. */
+};
+ 
+struct SRA_ReadGroupInfo 
+{
+    KRefcount refcount;
+    
+    uint32_t count;
+    struct SRA_ReadGroupStats groups[1]; /* actual size = count */
+};
+
+const SRA_ReadGroupInfo* SRA_ReadGroupInfoMake ( ctx_t ctx, const struct VTable* table );
+
+const SRA_ReadGroupInfo* SRA_ReadGroupInfoDuplicate ( const SRA_ReadGroupInfo* self, ctx_t ctx );
+
+void SRA_ReadGroupInfoRelease ( const SRA_ReadGroupInfo* self, ctx_t ctx );
+
+uint32_t SRA_ReadGroupInfoFind ( const SRA_ReadGroupInfo* self, ctx_t ctx, char const* name, size_t name_size );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_readgroupinfo_ */
diff --git a/libs/ngs/SRA_ReferenceSequence.c b/libs/ngs/SRA_ReferenceSequence.c
new file mode 100644
index 0000000..c36501a
--- /dev/null
+++ b/libs/ngs/SRA_ReferenceSequence.c
@@ -0,0 +1,374 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "SRA_ReferenceSequence.h"
+
+typedef struct SRA_ReferenceSequence SRA_ReferenceSequence;
+#define NGS_REFERENCESEQUENCE SRA_ReferenceSequence
+#include "NGS_ReferenceSequence.h"
+
+#include "NGS_String.h"
+#include "NGS_Cursor.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/refcount.h>
+
+#include <vdb/manager.h>
+#include <vdb/table.h>
+#include <vdb/database.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+
+#include <stddef.h>
+#include <assert.h>
+
+#include <strtol.h>
+#include <string.h>
+
+#include <sysalloc.h>
+
+/*--------------------------------------------------------------------------
+ * SRA_ReferenceSequence
+ */
+
+static void                SRA_ReferenceSequenceWhack ( SRA_ReferenceSequence * self, ctx_t ctx );
+static NGS_String *        SRA_ReferenceSequenceGetCanonicalName ( SRA_ReferenceSequence * self, ctx_t ctx );
+static bool                SRA_ReferenceSequenceGetIsCircular ( SRA_ReferenceSequence const* self, ctx_t ctx );
+static uint64_t            SRA_ReferenceSequenceGetLength ( SRA_ReferenceSequence * self, ctx_t ctx );
+static struct NGS_String * SRA_ReferenceSequenceGetBases ( SRA_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size );
+static struct NGS_String * SRA_ReferenceSequenceGetChunk ( SRA_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size );
+
+static NGS_ReferenceSequence_vt SRA_ReferenceSequence_vt_inst =
+{
+    /* NGS_Refcount */
+    { SRA_ReferenceSequenceWhack },
+
+    /* NGS_ReferenceSequence */
+    SRA_ReferenceSequenceGetCanonicalName,
+    SRA_ReferenceSequenceGetIsCircular,
+    SRA_ReferenceSequenceGetLength,
+    SRA_ReferenceSequenceGetBases,
+    SRA_ReferenceSequenceGetChunk,
+};
+
+
+struct SRA_ReferenceSequence
+{
+    NGS_ReferenceSequence dad;
+
+    const VTable * tbl;
+    const struct NGS_Cursor * curs;
+
+    uint32_t chunk_size;
+
+    int64_t first_row;
+    int64_t last_row;  /* inclusive */
+    uint64_t cur_length; /* size of current reference in bases (0 = not yet counted) */
+};
+
+static char const* g_ReferenceTableColumnNames [] =
+{
+    "(bool)CIRCULAR",
+    /*"(utf8)NAME",*/
+    "(ascii)SEQ_ID",
+    "(INSDC:coord:len)SEQ_LEN",
+    /*"(INSDC:coord:one)SEQ_START",*/
+    "(U32)MAX_SEQ_LEN",
+    "(ascii)READ",
+    /*"(I64)PRIMARY_ALIGNMENT_IDS",
+    "(I64)SECONDARY_ALIGNMENT_IDS",
+    "(INSDC:coord:len)OVERLAP_REF_LEN",
+    "(INSDC:coord:zero)OVERLAP_REF_POS"*/
+};
+
+enum g_ReferenceTableColumns
+{
+    reference_CIRCULAR,
+    /*reference_NAME,*/
+    reference_SEQ_ID,
+    reference_SEQ_LEN,
+    /*reference_SEQ_START,*/
+    reference_MAX_SEQ_LEN,
+    reference_READ,
+    /*reference_PRIMARY_ALIGNMENT_IDS,
+    reference_SECONDARY_ALIGNMENT_IDS,
+    reference_OVERLAP_REF_LEN,
+    reference_OVERLAP_REF_POS,*/
+
+    reference_NUM_COLS
+};
+
+
+static
+void SRA_ReferenceSequenceWhack ( SRA_ReferenceSequence * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcClosing );
+
+    NGS_CursorRelease ( self -> curs, ctx );
+    VTableRelease ( self -> tbl );
+
+    self -> curs = NULL;
+    self -> tbl = NULL;
+}
+
+/* Init
+ */
+static
+void SRA_ReferenceSequenceInit ( ctx_t ctx,
+                           SRA_ReferenceSequence * ref,
+                           const char *clsname,
+                           const char *instname )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcOpening );
+
+    if ( ref == NULL )
+        INTERNAL_ERROR ( xcParamNull, "bad object reference" );
+    else
+    {
+        TRY ( NGS_ReferenceSequenceInit ( ctx, & ref -> dad, & SRA_ReferenceSequence_vt_inst, clsname, instname ) )
+        {
+            /* TODO: maybe initialize more*/
+        }
+    }
+}
+
+NGS_ReferenceSequence * NGS_ReferenceSequenceMakeSRA ( ctx_t ctx, const char * spec )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcTable, rcOpening );
+
+    SRA_ReferenceSequence * ref;
+
+    assert ( spec != NULL );
+    assert ( spec [0] != '\0' );
+
+    ref = calloc ( 1, sizeof *ref );
+    if ( ref == NULL )
+    {
+        SYSTEM_ERROR ( xcNoMemory, "allocating SRA_ReferenceSequence ( '%s' )", spec );
+    }
+    else
+    {
+        TRY ( SRA_ReferenceSequenceInit ( ctx, ref, "NGS_ReferenceSequence", spec ) )
+        {
+            rc_t rc;
+
+            const VDBManager * mgr = ctx -> rsrc -> vdb;
+            assert ( mgr != NULL );
+
+            rc = VDBManagerOpenTableRead ( mgr, & ref -> tbl, NULL, spec );
+            if ( rc != 0 )
+            {
+                INTERNAL_ERROR ( xcUnexpected, "failed to open table '%s': rc = %R", spec, rc );
+            }
+            else
+            {   /* VDB-2641: examine the schema name to make sure this is an SRA table */
+                char ts_buff[1024];
+                rc = VTableTypespec ( ref -> tbl, ts_buff, sizeof ( ts_buff ) );
+                if ( rc != 0 )
+                {
+                    INTERNAL_ERROR ( xcUnexpected, "VTableTypespec failed: rc = %R", rc );
+                }
+                else
+                {
+                    const char REF_PREFIX[] = "NCBI:refseq:";
+                    size_t pref_size = sizeof ( REF_PREFIX ) - 1;
+                    if ( string_match ( REF_PREFIX, pref_size, ts_buff, string_size ( ts_buff ), (uint32_t)pref_size, NULL ) != pref_size )
+                    {
+                        USER_ERROR ( xcTableOpenFailed, "Cannot open accession '%s' as a reference table.", spec );
+                    }
+                    else
+                    {
+                        ref -> curs = NGS_CursorMake ( ctx, ref -> tbl, g_ReferenceTableColumnNames, reference_NUM_COLS );
+                        if ( ref -> curs != NULL )
+                        {
+                            uint64_t row_count = 0;
+                            TRY ( NGS_CursorGetRowRange ( ref->curs, ctx, & ref -> first_row, & row_count ) )
+                            {
+                                ref -> last_row = ref -> first_row + (int64_t) row_count - 1; /* TODO: it might be incorrect in general case */
+                                TRY ( ref -> chunk_size = NGS_CursorGetUInt32 ( ref -> curs, ctx, ref -> first_row, reference_MAX_SEQ_LEN ) )
+                                {
+                                    return (NGS_ReferenceSequence*) ref;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            SRA_ReferenceSequenceWhack ( ref , ctx );
+        }
+        free ( ref );
+    }
+    return NULL;
+}
+
+
+int64_t SRA_ReferenceSequence_GetFirstRowId ( const struct NGS_ReferenceSequence * self, ctx_t ctx )
+{
+    assert ( ( void * ) self -> dad . vt == ( void * ) & SRA_ReferenceSequence_vt_inst );
+    return ( ( SRA_ReferenceSequence const * ) self ) -> first_row;
+}
+
+int64_t SRA_ReferenceSequence_GetLastRowId ( const struct NGS_ReferenceSequence * self, ctx_t ctx )
+{
+    assert ( ( void * ) self -> dad . vt == ( void * ) & SRA_ReferenceSequence_vt_inst );
+    return ( ( SRA_ReferenceSequence const * ) self ) -> last_row;
+}
+
+NGS_String * SRA_ReferenceSequenceGetCanonicalName ( SRA_ReferenceSequence * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self != NULL );
+
+    return NGS_CursorGetString ( self -> curs, ctx, self -> first_row, reference_SEQ_ID);
+}
+
+bool SRA_ReferenceSequenceGetIsCircular ( const SRA_ReferenceSequence * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return false;
+    }
+
+    /* if current row is valid, read data */
+    if ( self -> first_row <= self -> last_row )
+    {
+        return NGS_CursorGetBool ( self -> curs, ctx, self -> first_row, reference_CIRCULAR );
+    }
+
+    return false;
+}
+
+uint64_t SRA_ReferenceSequenceGetLength ( SRA_ReferenceSequence * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return 0;
+    }
+
+    if ( self -> cur_length == 0 ) /* not yet calculated */
+    {
+        self -> cur_length =  self -> chunk_size * ( self -> last_row - self -> first_row ) +
+                              NGS_CursorGetUInt32 ( self -> curs,
+                                                    ctx,
+                                                    self -> last_row,
+                                                    reference_SEQ_LEN );
+    }
+
+    return self -> cur_length;
+}
+
+struct NGS_String * SRA_ReferenceSequenceGetBases ( SRA_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+
+    {
+        uint64_t totalBases = SRA_ReferenceSequenceGetLength ( self, ctx );
+        if ( offset >= totalBases )
+        {
+            return NGS_StringMake ( ctx, "", 0 );
+        }
+        else
+        {
+            uint64_t basesToReturn = totalBases - offset;
+            char* data;
+
+            if (size != (size_t)-1 && basesToReturn > size)
+                basesToReturn = size;
+
+            data = (char*) malloc ( basesToReturn );
+            if ( data == NULL )
+            {
+                SYSTEM_ERROR ( xcNoMemory, "allocating %lu bases", basesToReturn );
+                return NGS_StringMake ( ctx, "", 0 );
+            }
+            else
+            {
+                size_t cur_offset = 0;
+                while ( cur_offset < basesToReturn )
+                {
+                    /* we will potentially ask for more than available in the current chunk;
+                    SRA_ReferenceSequenceGetChunkSize will return only as much as is available in the chunk */
+                    NGS_String* chunk = SRA_ReferenceSequenceGetChunk ( self, ctx, offset + cur_offset, basesToReturn - cur_offset );
+                    cur_offset += string_copy(data + cur_offset, basesToReturn - cur_offset,
+                        NGS_StringData ( chunk, ctx ), NGS_StringSize ( chunk, ctx ) );
+                    NGS_StringRelease ( chunk, ctx );
+                }
+                return NGS_StringMakeOwned ( ctx, data, basesToReturn );
+            }
+        }
+    }
+}
+
+struct NGS_String * SRA_ReferenceSequenceGetChunk ( SRA_ReferenceSequence * self, ctx_t ctx, uint64_t offset, uint64_t size )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcReading );
+
+    assert ( self );
+    if ( self -> curs == NULL )
+    {
+        USER_ERROR ( xcCursorExhausted, "No more rows available" );
+        return NULL;
+    }
+
+    if ( offset >= SRA_ReferenceSequenceGetLength ( self, ctx ) )
+    {
+        return NGS_StringMake ( ctx, "", 0 );
+    }
+    else
+    {
+        const NGS_String* read = NGS_CursorGetString ( self -> curs, ctx, self -> first_row + offset / self -> chunk_size, reference_READ);
+        NGS_String* ret;
+        if ( size == (size_t)-1 )
+            ret = NGS_StringSubstrOffset ( read, ctx, offset % self -> chunk_size );
+        else
+            ret = NGS_StringSubstrOffsetSize ( read, ctx, offset % self -> chunk_size, size );
+        NGS_StringRelease ( read, ctx );
+        return ret;
+    }
+}
diff --git a/libs/ngs/SRA_ReferenceSequence.h b/libs/ngs/SRA_ReferenceSequence.h
new file mode 100644
index 0000000..91f1d90
--- /dev/null
+++ b/libs/ngs/SRA_ReferenceSequence.h
@@ -0,0 +1,56 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_referencesequence_
+#define _h_sra_referencesequence_
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct NGS_Cursor;
+struct NGS_ReferenceSequenceSequence;
+struct VDatabase;
+
+
+struct NGS_ReferenceSequence * NGS_ReferenceSequenceMakeSRA ( ctx_t ctx,
+                                             const char * spec );
+
+int64_t SRA_ReferenceSequence_GetFirstRowId ( const struct NGS_ReferenceSequence * self, ctx_t ctx );
+int64_t SRA_ReferenceSequence_GetLastRowId ( const struct NGS_ReferenceSequence * self, ctx_t ctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_referencesequence_ */
diff --git a/libs/ngs/SRA_Statistics.c b/libs/ngs/SRA_Statistics.c
new file mode 100644
index 0000000..88d4a3a
--- /dev/null
+++ b/libs/ngs/SRA_Statistics.c
@@ -0,0 +1,792 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "SRA_Statistics.h"
+
+#include "NGS_String.h"
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/refcount.h>
+#include <klib/container.h>
+
+#include <kdb/meta.h>
+
+#include <vdb/table.h>
+#include <vdb/database.h>
+
+#include <sysalloc.h>
+
+#include <stddef.h>
+#include <assert.h>
+#include <limits.h>
+#include <math.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include <strtol.h>
+#include <compiler.h>
+
+/* sadly, MSVS does not define trunc */
+static double xtrunc (double x)
+{ 
+    return x < 0 ? ceil ( x ) : floor ( x );
+}
+
+/*--------------------------------------------------------------------------
+ * SRA_Read
+ */
+
+struct SRA_Statistics
+{
+    NGS_Statistics dad;   
+    
+    BSTree dictionary;
+};
+
+struct DictionaryEntry
+{
+    BSTNode dad;
+    
+    uint32_t type;
+    union 
+    {
+        int64_t     i64;
+        uint64_t    u64;
+        double      real;
+        NGS_String* str;
+    } value;
+    char path[1]; /* 0-terminated */
+};
+typedef struct DictionaryEntry DictionaryEntry;
+
+static void DictionaryEntryWhack ( BSTNode *n, void *data )
+{
+    ctx_t ctx = ( ctx_t ) data;
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcDestroying );
+    
+    DictionaryEntry* entry = ( DictionaryEntry * ) n;
+    
+    if ( entry -> type == NGS_StatisticValueType_String )
+    {
+        NGS_StringRelease ( entry -> value . str, ctx );
+    }
+    
+    free ( n );
+}
+
+static int64_t DictionaryEntryCompare ( const BSTNode *p_a, const BSTNode *p_b )
+{
+    DictionaryEntry* a = ( DictionaryEntry * ) p_a;
+    DictionaryEntry* b = ( DictionaryEntry * ) p_b;
+    
+    size_t a_path_size = string_size ( a -> path );
+    return string_cmp ( a -> path, a_path_size, b -> path, string_size ( b -> path ), ( uint32_t ) a_path_size );
+}
+
+static int64_t DictionaryEntryFind ( const void *p_a, const BSTNode *p_b )
+{
+    const char * a = ( const char * ) p_a;
+    DictionaryEntry* b = ( DictionaryEntry * ) p_b;
+    
+    size_t a_path_size = string_size ( a );
+    return string_cmp ( a, a_path_size, b -> path, string_size ( b -> path ), ( uint32_t ) a_path_size );
+}
+
+static void         SRA_StatisticsWhack         ( SRA_Statistics * self, ctx_t ctx );
+static uint32_t     SRA_StatisticsGetValueType  ( const SRA_Statistics * self, ctx_t ctx, const char * path );
+static NGS_String * SRA_StatisticsGetAsString   ( const SRA_Statistics * self, ctx_t ctx, const char * path );
+static int64_t      SRA_StatisticsGetAsI64      ( const SRA_Statistics * self, ctx_t ctx, const char * path );
+static uint64_t     SRA_StatisticsGetAsU64      ( const SRA_Statistics * self, ctx_t ctx, const char * path );
+static double       SRA_StatisticsGetAsDouble   ( const SRA_Statistics * self, ctx_t ctx, const char * path );
+static bool         SRA_StatisticsNextPath      ( const SRA_Statistics * self, ctx_t ctx, const char * path, const char ** next );
+static void         SRA_StatisticsAddString     ( SRA_Statistics * self, ctx_t ctx, const char * path, const NGS_String * value );
+static void         SRA_StatisticsAddI64        ( SRA_Statistics * self, ctx_t ctx, const char * path, int64_t value );
+static void         SRA_StatisticsAddU64        ( SRA_Statistics * self, ctx_t ctx, const char * path, uint64_t value );
+static void         SRA_StatisticsAddDouble     ( SRA_Statistics * self, ctx_t ctx, const char * path, double value );
+
+static NGS_Statistics_vt SRA_Statistics_vt_inst =
+{
+    {
+        /* NGS_RefCount */
+        SRA_StatisticsWhack
+    },
+
+    /* NGS_Statistics */
+    SRA_StatisticsGetValueType,
+    SRA_StatisticsGetAsString,
+    SRA_StatisticsGetAsI64,               
+    SRA_StatisticsGetAsU64,               
+    SRA_StatisticsGetAsDouble,
+    SRA_StatisticsNextPath,
+    SRA_StatisticsAddString,
+    SRA_StatisticsAddI64,
+    SRA_StatisticsAddU64,
+    SRA_StatisticsAddDouble,
+}; 
+
+void SRA_StatisticsWhack ( SRA_Statistics * self, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcDestroying );
+    
+    assert ( self );
+    
+    BSTreeWhack ( & self -> dictionary, DictionaryEntryWhack, ( void * ) ctx );
+}
+
+uint32_t SRA_StatisticsGetValueType ( const SRA_Statistics * self, ctx_t ctx, const char * path )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+	
+    assert ( self );
+
+    if ( path == NULL )
+        INTERNAL_ERROR ( xcParamNull, "path is NULL" );
+    else
+	{
+		DictionaryEntry * node = ( DictionaryEntry * ) 
+			BSTreeFind ( & self -> dictionary, ( const void * ) path, DictionaryEntryFind );
+        if ( node == NULL )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "dictionary item '%s' is not found", path );
+        }
+        else
+        {
+			return node -> type;
+		}
+	}
+
+    return NGS_StatisticValueType_Undefined;
+}
+
+NGS_String* SRA_StatisticsGetAsString ( const SRA_Statistics * self, ctx_t ctx, const char * path )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    assert ( self );
+    
+    if ( path == NULL )
+        INTERNAL_ERROR ( xcParamNull, "path is NULL" );
+    else
+    {
+        DictionaryEntry * node = ( DictionaryEntry * ) 
+            BSTreeFind ( & self -> dictionary, ( const void * ) path, DictionaryEntryFind );
+        if ( node == NULL )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "dictionary item '%s' is not found", path );
+        }
+        else
+        {
+            switch ( node -> type )
+            {
+            case NGS_StatisticValueType_UInt64: 
+                {
+                    char buf[1024];
+                    size_t num_writ;
+                    string_printf ( buf, sizeof(buf), &num_writ, "%lu", node -> value . u64 );
+                    return NGS_StringMakeCopy ( ctx, buf, num_writ );
+                }
+                break;
+                
+            case NGS_StatisticValueType_Int64:  
+                {
+                    char buf[1024];
+                    size_t num_writ;
+                    string_printf ( buf, sizeof(buf), &num_writ, "%li", node -> value . i64 );
+                    return NGS_StringMakeCopy ( ctx, buf, num_writ );
+                }
+                
+            case NGS_StatisticValueType_Real:   
+                {
+                    char buf[1024];
+                    size_t num_writ;
+                    string_printf ( buf, sizeof(buf), &num_writ, "%f", node -> value . real );
+                    return NGS_StringMakeCopy ( ctx, buf, num_writ );
+                }
+                
+            case NGS_StatisticValueType_String: 
+                return NGS_StringDuplicate ( node -> value . str, ctx );
+                
+            default :
+                INTERNAL_ERROR ( xcUnexpected, "unexpected type %u for dictionary item '%s'", node -> type, path );
+                break;
+            }
+        }
+    }
+    
+    return NULL;
+}
+
+static int64_t NGS_StringToI64( const NGS_String * str, ctx_t ctx )
+{
+    /* have to guarantee NUL-termination for strtoi64/strtod */
+    char buf[4096];
+    if ( sizeof(buf) > NGS_StringSize ( str, ctx ) )
+    {
+        char* end;
+        int64_t value;
+        string_copy ( buf, sizeof(buf), 
+                      NGS_StringData ( str, ctx ), NGS_StringSize ( str, ctx ) );
+        
+        errno = 0;
+        value = strtoi64 ( buf, &end, 10 );
+        if ( *end == 0 )
+        {
+            if ( errno == 0 )   
+            {   
+                return value;
+            }
+        }
+        else
+        {   /* attempt to parse as a double */
+            double dbl;
+            errno = 0;
+            dbl = strtod ( buf, &end );
+            if ( *end == 0 && errno == 0 && dbl >= LLONG_MIN && dbl <= LLONG_MAX )
+            {
+                return ( int64_t ) xtrunc ( dbl );
+            }
+        }
+    }
+    INTERNAL_ERROR ( xcUnexpected, "cannot convert dictionary value '%.*s' from string to int64", 
+                                    NGS_StringSize ( str, ctx ), NGS_StringData ( str, ctx ) );
+    return 0;
+}
+
+int64_t SRA_StatisticsGetAsI64 ( const SRA_Statistics * self, ctx_t ctx, const char * path )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+
+    assert ( self );
+    
+    if ( path == NULL )
+        INTERNAL_ERROR ( xcParamNull, "path is NULL" );
+    else
+    {
+        DictionaryEntry * node = ( DictionaryEntry * ) 
+            BSTreeFind ( & self -> dictionary, ( const void * ) path, DictionaryEntryFind );
+        if ( node == NULL )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "dictionary item '%s' is not found", path );
+        }
+        else
+        {
+            switch ( node -> type )
+            {
+            case NGS_StatisticValueType_Int64:  
+                return node -> value . i64;
+                
+            case NGS_StatisticValueType_UInt64: 
+                if ( node -> value . u64 > LLONG_MAX )
+                {
+                    INTERNAL_ERROR ( xcUnexpected, "cannot convert dictionary item '%s' from uin64_t to int64_t", path );
+                }
+                else
+                {
+                    return ( int64_t ) node -> value . u64;
+                }
+                break;
+                
+            case NGS_StatisticValueType_Real:   
+                if ( node -> value . real < LLONG_MIN || node -> value . real > LLONG_MAX )
+                {
+                    INTERNAL_ERROR ( xcUnexpected, "cannot convert dictionary item '%s' from double to int64_t", path );
+                }
+                else
+                {
+                    return ( int64_t ) xtrunc ( node -> value . real );
+                }
+                break;
+                
+            case NGS_StatisticValueType_String: 
+                return NGS_StringToI64 ( node -> value . str, ctx );
+                
+            default :
+                INTERNAL_ERROR ( xcUnexpected, "unexpected type %u for dictionary item '%s'", node -> type, path );
+                break;
+            }
+        }
+    }
+    
+    return 0;
+}
+
+static uint64_t NGS_StringToU64( const NGS_String * str, ctx_t ctx )
+{
+    /* have to guarantee NUL-termination for strtou64/strtod */
+    char buf[4096];
+    if ( sizeof(buf) > NGS_StringSize ( str, ctx ) )
+    {
+        char* end;
+        uint64_t value;
+        string_copy ( buf, sizeof(buf), 
+                      NGS_StringData ( str, ctx ), NGS_StringSize ( str, ctx ) );
+                      
+        errno = 0;
+        value = strtou64 ( buf, &end, 10 );
+        if ( *end == 0 ) 
+        {
+            if ( errno == 0 )   
+            {   
+                return value;
+            }
+        }
+        else
+        {   /* attempt to parse as a double */
+            double dbl;
+            errno = 0;
+            dbl = strtod ( buf, &end );
+            if ( *end == 0 && errno == 0 && dbl >= 0 && dbl <= ULLONG_MAX )
+            {
+                return ( uint64_t ) xtrunc ( dbl );
+            }
+        }
+    }
+    INTERNAL_ERROR ( xcUnexpected, "cannot convert dictionary value '%.*s' from string to uint64", 
+                                    NGS_StringSize ( str, ctx ), NGS_StringData ( str, ctx ) );
+    return 0;
+}
+
+uint64_t SRA_StatisticsGetAsU64 ( const SRA_Statistics * self, ctx_t ctx, const char * path )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    assert ( self );
+    
+    if ( path == NULL )
+        INTERNAL_ERROR ( xcParamNull, "path is NULL" );
+    else
+    {
+        DictionaryEntry * node = ( DictionaryEntry * ) 
+            BSTreeFind ( & self -> dictionary, ( const void * ) path, DictionaryEntryFind );
+        if ( node == NULL )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "dictionary item '%s' is not found", path );
+        }
+        else
+        {
+            switch ( node -> type )
+            {
+            case NGS_StatisticValueType_Int64:  
+                if ( node -> value . i64 < 0 )
+                {
+                    INTERNAL_ERROR ( xcUnexpected, "cannot convert dictionary item '%s' from in64_t to uint64_t", path );
+                }
+                else
+                {
+                    return ( uint64_t ) node -> value . i64;
+                }
+                break;
+                
+            case NGS_StatisticValueType_UInt64: 
+                return node -> value . i64; 
+            
+            case NGS_StatisticValueType_Real:   
+                if ( node -> value . real < 0 || node -> value . real > ULLONG_MAX )
+                {
+                    INTERNAL_ERROR ( xcUnexpected, "cannot convert dictionary item '%s' from double to uint64_t", path );
+                }
+                else
+                {
+                    return ( uint64_t ) xtrunc ( node -> value . real );
+                }
+                break;
+            
+            case NGS_StatisticValueType_String: 
+                return NGS_StringToU64 ( node -> value . str, ctx );
+                
+            default :
+                INTERNAL_ERROR ( xcUnexpected, "unexpected type %u for dictionary item '%s'", node -> type, path );
+                break;
+            }
+        }
+    }
+    
+    return 0;
+}
+
+static double NGS_StringToReal ( const NGS_String * str, ctx_t ctx )
+{
+    /* have to guarantee NUL-termination for strtod */
+    char buf[4096];
+    if ( sizeof(buf) > NGS_StringSize ( str, ctx ) )
+    {
+        char* end;
+        double real;
+        string_copy ( buf, sizeof(buf), 
+                      NGS_StringData ( str, ctx ), NGS_StringSize ( str, ctx ) );
+
+        errno = 0;
+        real = strtod ( buf, &end );
+        if ( *end == 0 && errno == 0 )   
+        {
+            return real;
+        }
+    }
+    INTERNAL_ERROR ( xcUnexpected, "cannot convert dictionary value '%.*s' from string to numeric", 
+                                    NGS_StringSize ( str, ctx ), NGS_StringData ( str, ctx ) );
+    return 0.0;
+}
+
+double SRA_StatisticsGetAsDouble ( const SRA_Statistics * self, ctx_t ctx, const char * path )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    assert ( self );
+    
+    if ( path == NULL )
+        INTERNAL_ERROR ( xcParamNull, "path is NULL" );
+    else
+    {
+        DictionaryEntry * node = ( DictionaryEntry * ) 
+            BSTreeFind ( & self -> dictionary, ( const void * ) path, DictionaryEntryFind );
+        if ( node == NULL )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "dictionary item '%s' is not found", path );
+        }
+        else
+        {
+            switch ( node -> type )
+            {
+            case NGS_StatisticValueType_Int64:  
+                return ( double ) node -> value . i64;
+                
+            case NGS_StatisticValueType_UInt64: 
+                return ( double ) node -> value . u64;
+                
+            case NGS_StatisticValueType_Real:   
+                return node -> value . real;
+                
+            case NGS_StatisticValueType_String: 
+                return NGS_StringToReal ( node -> value . str, ctx );
+                break;
+                
+            default :
+                INTERNAL_ERROR ( xcUnexpected, "unexpected type %u for dictionary item '%s'", node -> type, path );
+                break;
+            }
+        }
+    }
+    
+    return 0;
+}
+
+bool SRA_StatisticsNextPath ( const SRA_Statistics * self, ctx_t ctx, const char * path, const char** next )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    const DictionaryEntry * node = NULL;
+    
+    assert ( self );
+    
+    if ( path == NULL )
+        INTERNAL_ERROR ( xcParamNull, "path is NULL" );
+    else if ( path[0] == 0 )
+    {
+        node = ( const DictionaryEntry * ) BSTreeFirst ( & self -> dictionary );
+    }
+    else
+    {
+        node = ( const DictionaryEntry * ) BSTreeFind ( & self -> dictionary, ( const void * ) path, DictionaryEntryFind );
+        if ( node == NULL )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "dictionary item '%s' is not found", path );
+        }
+        else
+        {
+            node = ( const DictionaryEntry * ) BSTNodeNext ( & node -> dad );
+        }
+    }
+    
+    if ( node == NULL )
+    {
+        *next = NULL;
+        return false;
+    }
+    *next = node -> path;
+    return true;
+}
+
+static
+DictionaryEntry * MakeNode ( SRA_Statistics * self, ctx_t ctx, const char * path )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    size_t path_size = string_size ( path );
+    DictionaryEntry * node = malloc ( sizeof ( * node ) + path_size );
+    if ( node == NULL )
+    {
+        SYSTEM_ERROR ( xcNoMemory, "allocating dictionary item" );
+    }
+    else
+    {
+        rc_t rc;
+        string_copy ( node -> path, path_size + 1, path, path_size );
+        
+        /*TODO: decide whether to allow overwriting (not allowed now) */
+        rc = BSTreeInsertUnique ( & self -> dictionary, & node -> dad, NULL, DictionaryEntryCompare );
+        if ( rc == 0 )
+        {
+            return node;
+        }
+        
+        INTERNAL_ERROR ( xcUnexpected, "inserting dictionary item '%s' rc = %R", node -> path, rc );
+        free ( node );
+    }
+    return NULL;
+}
+
+void SRA_StatisticsAddString ( SRA_Statistics * self, ctx_t ctx, const char * path, const NGS_String * value )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    assert ( self );
+    
+    if ( path == NULL )
+        INTERNAL_ERROR ( xcParamNull, "path is NULL" );
+    else
+    {
+        TRY ( DictionaryEntry * node = MakeNode ( self, ctx, path ) )
+        {
+            node -> type = NGS_StatisticValueType_String;
+            node -> value . str = NGS_StringDuplicate ( value, ctx );
+        }
+    }
+}
+
+void SRA_StatisticsAddI64 ( SRA_Statistics * self, ctx_t ctx, const char * path, int64_t value )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    assert ( self );
+    
+    if ( path == NULL )
+        INTERNAL_ERROR ( xcParamNull, "path is NULL" );
+    else
+    {
+        TRY ( DictionaryEntry * node = MakeNode ( self, ctx, path ) )
+        {
+            node -> type = NGS_StatisticValueType_Int64;
+            node -> value . i64 = value;
+        }
+    }
+}
+
+void SRA_StatisticsAddU64 ( SRA_Statistics * self, ctx_t ctx, const char * path, uint64_t value )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    assert ( self );
+    
+    if ( path == NULL )
+        INTERNAL_ERROR ( xcParamNull, "path is NULL" );
+    else
+    {
+        TRY ( DictionaryEntry * node = MakeNode ( self, ctx, path ) )
+        {
+            node -> type = NGS_StatisticValueType_UInt64;
+            node -> value . u64 = value;
+        }
+    }
+}
+
+void SRA_StatisticsAddDouble ( SRA_Statistics * self, ctx_t ctx, const char * path, double value )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing );
+    
+    assert ( self );
+    
+    if ( path == NULL )
+        INTERNAL_ERROR ( xcParamNull, "path is NULL" );
+    else if ( isnan ( value ) )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "NAN is not supported" );
+    }
+    else
+    {
+        TRY ( DictionaryEntry * node = MakeNode ( self, ctx, path ) )
+        {
+            node -> type = NGS_StatisticValueType_Real;
+            node -> value . real = value;
+        }
+    }
+}
+
+NGS_Statistics * SRA_StatisticsMake ( ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcConstructing );
+
+    SRA_Statistics * ref;
+
+    ref = calloc ( 1, sizeof * ref );
+    if ( ref == NULL )
+        SYSTEM_ERROR ( xcNoMemory, "allocating SRA_Statistics" );
+    else
+    {
+        TRY ( NGS_StatisticsInit ( ctx, & ref -> dad, & SRA_Statistics_vt_inst, "SRA_Statistics", "" ) )
+        {   
+            BSTreeInit ( & ref -> dictionary );
+            return & ref -> dad;
+        }
+        
+        free ( ref );
+    }
+
+    return NULL;
+}
+
+static
+uint64_t KMetadata_ReadU64 ( const struct KMetadata * meta, ctx_t ctx, const char* name )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    
+    uint64_t ret = 0;
+    
+    const KMDataNode * node;
+    rc_t rc = KMetadataOpenNodeRead ( meta, & node, "%s", name );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "KMetadataOpenNodeRead(%s) rc = %R", name, rc );
+    }
+    else
+    {
+        rc = KMDataNodeReadAsU64 ( node, & ret );
+        if ( rc != 0 )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "KMDataNodeReadAsU64(%s) rc = %R", name, rc );
+        }
+        KMDataNodeRelease ( node );
+    }
+    
+    return ret;
+}            
+
+static
+NGS_String * KMetadata_ReadString ( const struct KMetadata * meta, ctx_t ctx, const char* name )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    
+    const KMDataNode * node;
+    rc_t rc = KMetadataOpenNodeRead ( meta, & node, "%s", name );
+    if ( rc == 0 )
+    {
+        char dummy;
+        size_t num_read;
+        size_t remaining;
+        char * buf;
+        KMDataNodeRead ( node, 0, & dummy, 0, & num_read, & remaining );
+        
+        buf = malloc ( remaining );
+        if ( buf == NULL )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "malloc (%u) failed", remaining );
+        }
+        else
+        {
+            rc = KMDataNodeRead ( node, 0, buf, remaining, & num_read, NULL );
+            if ( rc != 0 )
+            {
+                INTERNAL_ERROR ( xcUnexpected, "KMDataNodeRead(%s) rc = %R", name, rc );
+            }
+            else
+            {
+                NGS_String * ret = NGS_StringMakeOwned ( ctx, buf, remaining );
+                KMDataNodeRelease ( node );
+                return ret;
+            }
+            free ( buf );
+        }
+        KMDataNodeRelease ( node );
+    }
+    
+    return NULL;
+}            
+
+void AddWithPrefix( NGS_Statistics * self, ctx_t ctx, const char* prefix, const char* path, uint64_t value )
+{
+    char full_path[1024];
+    string_printf( full_path, sizeof (full_path ), NULL, "%s/%s", prefix, path );
+    NGS_StatisticsAddU64 ( self, ctx, full_path, value );
+}
+
+void SRA_StatisticsLoadTableStats ( NGS_Statistics * self, ctx_t ctx, const struct VTable* tbl, const char* prefix )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    
+    const struct KMetadata * meta;
+    
+    rc_t rc = VTableOpenMetadataRead ( tbl, & meta );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "VTableOpenMetadataRead rc = %R", rc );
+    }
+    else
+    {
+        ON_FAIL ( AddWithPrefix ( self, ctx, prefix, "BASE_COUNT",
+                                  KMetadata_ReadU64 ( meta, ctx, "STATS/TABLE/BASE_COUNT" ) ) ) CLEAR ();
+        ON_FAIL ( AddWithPrefix ( self, ctx, prefix, "BIO_BASE_COUNT",   
+                                  KMetadata_ReadU64 ( meta, ctx, "STATS/TABLE/BIO_BASE_COUNT" ) ) ) CLEAR ();
+        ON_FAIL ( AddWithPrefix ( self, ctx, prefix, "CMP_BASE_COUNT",   
+                                  KMetadata_ReadU64 ( meta, ctx, "STATS/TABLE/CMP_BASE_COUNT" ) ) ) CLEAR ();
+        ON_FAIL ( AddWithPrefix ( self, ctx, prefix, "SPOT_COUNT",       
+                                  KMetadata_ReadU64 ( meta, ctx, "STATS/TABLE/SPOT_COUNT" ) ) ) CLEAR ();
+        ON_FAIL ( AddWithPrefix ( self, ctx, prefix, "SPOT_MAX",         
+                                  KMetadata_ReadU64 ( meta, ctx, "STATS/TABLE/SPOT_MAX" ) ) ) CLEAR ();
+        ON_FAIL ( AddWithPrefix ( self, ctx, prefix, "SPOT_MIN",         
+                                  KMetadata_ReadU64 ( meta, ctx, "STATS/TABLE/SPOT_MIN" ) ) ) CLEAR ();
+        
+        KMetadataRelease ( meta );
+    }
+}
+
+void SRA_StatisticsLoadBamHeader ( NGS_Statistics * self, ctx_t ctx, const struct VDatabase * db )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcCursor, rcAccessing );
+    
+    const struct KMetadata * meta;
+    
+    rc_t rc = VDatabaseOpenMetadataRead ( db, & meta );
+    if ( rc != 0 )
+    {
+        INTERNAL_ERROR ( xcUnexpected, "VDatabaseOpenMetadataRead rc = %R", rc );
+    }
+    else
+    {
+        TRY ( NGS_String * str = KMetadata_ReadString ( meta, ctx, "BAM_HEADER" ) )
+        {
+            if ( str != NULL )
+            {
+                NGS_StatisticsAddString ( self, ctx, "BAM_HEADER", str );
+                NGS_StringRelease ( str, ctx );
+            }
+        }
+        KMetadataRelease ( meta );
+    }
+}
+
diff --git a/libs/ngs/SRA_Statistics.h b/libs/ngs/SRA_Statistics.h
new file mode 100644
index 0000000..c31bf8c
--- /dev/null
+++ b/libs/ngs/SRA_Statistics.h
@@ -0,0 +1,61 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_statistics_
+#define _h_sra_statistics_
+
+typedef struct SRA_Statistics SRA_Statistics;
+#ifndef _h_ngs_statistics_
+#define NGS_STATISTICS SRA_Statistics
+#include "NGS_Statistics.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+struct VTable;
+struct VDatabase;
+ 
+/*--------------------------------------------------------------------------
+ * SRA_Statistics
+ */
+
+NGS_Statistics * SRA_StatisticsMake ( ctx_t ctx ); 
+
+void SRA_StatisticsLoadTableStats ( NGS_Statistics * self, ctx_t ctx, const struct VTable* tbl, const char* prefix );
+
+void SRA_StatisticsLoadBamHeader ( NGS_Statistics * self, ctx_t ctx, const struct VDatabase * db );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_sra_statistics_ */
diff --git a/libs/ngs/VByteBlob.c b/libs/ngs/VByteBlob.c
new file mode 100644
index 0000000..80e5e79
--- /dev/null
+++ b/libs/ngs/VByteBlob.c
@@ -0,0 +1,117 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "VByteBlob.h"
+
+#include <kfc/except.h>
+#include <kfc/xc.h>
+
+#include <vdb/blob.h>
+#include <../libs/vdb/blob-priv.h>
+#include <../libs/vdb/page-map.h>
+
+/* Calculate the biggest available contiguous data portion of the blob:
+*  starts at rowId, ends before a repeated value or at the end of the blob
+*/
+void
+VByteBlob_ContiguousChunk ( const VBlob* p_blob,  ctx_t ctx, int64_t rowId, const void** p_data, uint64_t* p_size, bool p_stopAtRepeat )
+{
+    FUNC_ENTRY ( ctx, rcSRA, rcBlob, rcAccessing );
+
+    assert ( p_blob );
+    assert ( p_data );
+    assert ( p_size );
+
+    {
+        uint32_t elem_bits;
+        const void *base;
+        uint32_t boff;
+        uint32_t row_len;
+        rc_t rc = VBlobCellData ( p_blob,
+                                  rowId,
+                                  & elem_bits,
+                                  & base,
+                                  & boff,
+                                  & row_len );
+        if ( rc != 0 )
+        {
+            INTERNAL_ERROR ( xcUnexpected, "VBlobCellData() rc = %R", rc );
+        }
+        else
+        {
+			rc_t rc;
+            int64_t first;
+            uint64_t count;
+
+            assert( elem_bits == 8 );
+            assert( boff == 0 );
+            *p_data = base;
+            *p_size = 0;
+
+            rc = VBlobIdRange ( p_blob, & first, & count );
+            if ( rc != 0  )
+            {
+                INTERNAL_ERROR ( xcUnexpected, "VBlobIdRange() rc = %R", rc );
+            }
+            else if ( p_stopAtRepeat )
+            {
+                PageMapIterator pmIt;
+
+                assert ( rowId >= first && rowId < first + (int64_t)count );
+
+                if ( rowId - first + 1 < (int64_t)count ) /* more rows in the blob */
+                {   /* *p_size is the size of value on rowId. Increase size to include subsequent rows, until we see a repeat or the blob ends */
+                    rc = PageMapNewIterator ( (const PageMap*)p_blob->pm, &pmIt, rowId - first, count - ( rowId - first ) ); /* here, rowId is relative to the blob */
+                    if ( rc != 0 )
+                    {
+                        INTERNAL_ERROR ( xcUnexpected, "PageMapNewIterator() rc = %R", rc );
+                    }
+                    else
+                    {
+                        do
+                        {
+                            *p_size += PageMapIteratorDataLength ( &pmIt );
+                            if ( PageMapIteratorRepeatCount ( &pmIt ) > 1 )
+                            {
+                                break;
+                            }
+                        }
+                        while ( PageMapIteratorNext ( &pmIt ) );
+                    }
+                }
+                else
+                {
+                    *p_size = row_len;
+                }
+            }
+            else
+            {   /* set the size to include the rest of the blob's data */
+                *p_size = BlobBufferBytes ( p_blob ) - ( (const uint8_t*)( base ) - (const uint8_t*)( p_blob -> data . base ) );
+            }
+        }
+    }
+}
+
diff --git a/libs/ngs/VByteBlob.h b/libs/ngs/VByteBlob.h
new file mode 100644
index 0000000..e9d623b
--- /dev/null
+++ b/libs/ngs/VByteBlob.h
@@ -0,0 +1,47 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vbyteblob_
+#define _h_vbyteblob_
+
+#include <kfc/ctx.h>
+
+struct VBlob;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Calculate the biggest available contiguous data portion of the blob:
+*  starts at rowId, ends before a repeated value or at the end of the blob
+*/
+void VByteBlob_ContiguousChunk ( const struct VBlob* blob,  ctx_t ctx, int64_t rowId, const void** data, uint64_t* size, bool stopAtRepeat );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vbyteblob_ */
diff --git a/libs/ngs/extern.h b/libs/ngs/extern.h
new file mode 100644
index 0000000..7d545df
--- /dev/null
+++ b/libs/ngs/extern.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_extern_
+#define _h_ngs_extern_
+
+#if ! defined EXPORT_LATCH && defined _LIBRARY
+#define NGS_EXTERN LIB_EXPORT
+#define EXPORT_LATCH 1
+#else
+#define NGS_EXTERN LIB_IMPORT
+#endif
+
+#ifndef _h_klib_extern_
+#include <klib/extern.h>
+#endif
+
+#endif /* _h_ngs_extern_ */
diff --git a/src/test/resources/htsjdk/tribble/tmp/.gitignore b/libs/search/.gitignore
similarity index 100%
rename from src/test/resources/htsjdk/tribble/tmp/.gitignore
rename to libs/search/.gitignore
diff --git a/libs/search/Makefile b/libs/search/Makefile
new file mode 100644
index 0000000..4dc54c0
--- /dev/null
+++ b/libs/search/Makefile
@@ -0,0 +1,98 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/search
+
+INT_LIBS = \
+	libksrch
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(SEARCH_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/all $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+	@ rm -f $(addsuffix .*,$(addprefix $(ILIBDIR)/,libnucstrstr libgrep))
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# search
+#
+$(ILIBDIR)/libksrch: $(addprefix $(ILIBDIR)/libksrch.,$(ILIBEXT))
+
+SEARCH_SRC = \
+	search \
+	fgrep-dumb \
+	fgrep-boyermoore \
+	fgrep-aho \
+	agrep-wumanber \
+	agrep-myers \
+	agrep-myersunltd \
+	agrep-dp \
+	sw-search \
+	nucstrstr
+
+SEARCH_OBJ = \
+	$(addsuffix .$(LOBX),$(SEARCH_SRC))
+
+SEARCH_LIB = \
+	-dklib \
+	-dm
+
+$(ILIBDIR)/libksrch.$(LIBX): $(SEARCH_OBJ)
+	$(LD) --slib -o $@ $^ $(SEARCH_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/search/agrep-dp.c b/libs/search/agrep-dp.c
new file mode 100644
index 0000000..0f0efe8
--- /dev/null
+++ b/libs/search/agrep-dp.c
@@ -0,0 +1,880 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*
+  From Gene Myers, 1998, 
+  "A Fast Bit-vector Algorithm for Approxsimat String Matching
+  Based on Dynamic Programming" -- explains dp pretty well.
+
+  If we place the pattern down the left of a matrix,
+  and the scored text along the top horizontally,
+  pattern p(length m) and text t(length n),
+  we can compute the dynamic programming matrix C[0..m, 0..n] as 
+
+  C[i,j] = min{C[i-1,j-1]+(if p(i)=t(j) then 0 else 1), C[i-1,j]+1, C[i,j-1]+1}
+
+  given that C[0,j] = 0 for all j.
+  We can replace the constants with table-driven scores,
+  so that we have a match cost for (P(i),t(i)), 
+  and costs for skippings parts of the pattern (first 1) or text (second 1).
+*/
+
+#include <search/extern.h>
+#include <os-native.h>
+#include <compiler.h>
+#include <sysalloc.h>
+#include "search-priv.h"
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h> /* lroundf */
+
+#define _TRACE 0
+
+static
+void reverse_string(const char* from, int32_t len, char *to) 
+{
+    const char* p = from + len;
+    while( p != from ) {
+        *to++ = *--p;
+    }
+    *to = '\0';
+}
+
+struct DPParams {
+    char *pattern;
+    char *rpattern;
+    AgrepFlags mode;
+    int32_t plen;
+};
+
+rc_t AgrepDPMake( DPParams **self, AgrepFlags mode, const char *pattern )
+{
+    rc_t rc = 0;
+
+    if( (*self = malloc(sizeof(**self))) == NULL ) {
+        rc = RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+    } else {
+        int32_t i;
+        (*self)->mode = mode;
+        (*self)->pattern = strdup(pattern);
+        (*self)->plen = strlen(pattern);
+        (*self)->rpattern = malloc((*self)->plen + 1);
+        if( (*self)->pattern == NULL || (*self)->rpattern == NULL ) {
+            rc = RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+        } else if( mode & AGREP_MODE_ASCII ) {
+            if( mode & AGREP_IGNORE_CASE ) {
+                for(i = 0; i < (*self)->plen; i++) {
+                    (*self)->pattern[i] = tolower((*self)->pattern[i]);
+                }
+            }
+        }
+    }
+    if( rc != 0 ) {
+        AgrepDPFree(*self);
+    } else {
+        reverse_string((*self)->pattern, (*self)->plen, (*self)->rpattern);
+    }
+    return rc;
+}
+
+void AgrepDPFree( DPParams *self )
+{
+    if ( self != NULL )
+    {
+        if (self->pattern != NULL)
+            free(self->pattern);
+        if (self->rpattern != NULL)
+            free(self->rpattern);
+        free(self);
+    }
+}
+
+#if _TRACE
+static
+void print_col_as_row(int32_t *col, int32_t plen) 
+{
+    int32_t i;
+    for (i=0; i<=plen; i++) {
+        printf("%2d ", col[i]);
+    }
+    printf("\n");
+}
+#endif
+
+static
+void init_col(const char *p, int32_t plen, int32_t *col)
+{
+    int32_t i;
+    col[0] = 0;
+    for (i=1; i<=plen; i++) {
+        col[i] = col[i-1] + 1;
+    }  
+}
+
+bool na4_match(unsigned char p, unsigned char c)
+{
+    if( p == c )
+    {
+        return true;
+    }
+    else
+    {
+        const unsigned char* ps = IUPAC_decode[p];
+        const unsigned char* cs = IUPAC_decode[c];
+
+        if ( ps != NULL && cs != NULL )
+        {
+            size_t i_ps, i_cs;
+            for (i_ps = 0; ps[i_ps] != '\0'; ++i_ps)
+            {
+                for (i_cs = 0; cs[i_cs] != '\0'; ++i_cs)
+                {
+                    if (ps[i_ps] == cs[i_cs])
+                        return true;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+#undef min
+#define min(a,b) ((a)<(b)?(a):(b))
+
+/* No longer returns a return code. */
+static
+void compute_dp_next_col(const char *p, int32_t plen, AgrepFlags mode, int32_t startcost, char t, int32_t *prev, int32_t *nxt)
+{
+    int32_t i;
+    int32_t matchscore = 0;
+    nxt[0] = startcost;
+
+    if( (mode & AGREP_TEXT_EXPANDED_2NA) && t < 5 ) {
+        t = "ACGTN"[(unsigned char)t];
+    }
+    for(i = 1; i <= plen; i++)
+    {
+        if( p[i - 1] == t )
+        {
+            matchscore = 0;
+        }
+        else if( mode & AGREP_MODE_ASCII )
+        {
+            if( mode & AGREP_IGNORE_CASE )
+                t = tolower(t);
+
+            matchscore = p[i - 1] == t ? 0 : 1;
+        }
+        else if( (mode & AGREP_PATTERN_4NA) && na4_match(p[i - 1], t) )
+        {
+            matchscore = 0;
+        }
+        else
+        {
+            matchscore = 1;
+        }
+
+        nxt[i] = min(min(prev[i-1] + matchscore,
+                         nxt[i-1] + 1),
+                     prev[i] + 1);
+    }
+}
+
+/*
+This is new functionality to support partial matches at the beginning
+or end of a sequence.
+Errors is the number of errors over the whole pattern,
+so we can assume a constant error rate, or do something more sophisticated.
+Bestpos is the last position that seems to be a match,
+and returns the number of "hits" and "misses" where a hit decreases the
+edit distance score, and a miss is everything else.
+
+The way to use this is use it in the "forward" direction to find an endpoint,
+then assume that's the end of the pattern, and do a reverse search
+compare with the (reversed) pattern to see if it really matches
+the end of the pattern.  See how it's used in the system for more hints.
+*/
+
+LIB_EXPORT void CC dp_scan_for_left_match ( char *pattern, int errors, char *buf, 
+    int buflen, int *bestpos, int *ret_hits, int *ret_misses )
+{
+    int plen = strlen(pattern);
+    int *prev = malloc(sizeof(int)*(plen+1));
+    int *nxt = malloc(sizeof(int)*(plen+1));
+    int *tmp;
+    int i;
+
+    int patlen = strlen(pattern);
+    float errrate = (float)errors / (float)patlen;
+    float play;
+
+    int hits = 0;
+    int misses = 0;
+
+    int change;
+
+    int lastscore = plen;
+
+    int cont = 1;
+
+    int lastwasmiss = 0;
+    int trailing_misses = 0;
+
+    *bestpos = -1;
+#if _TRACE
+    printf("Err rate is %f\n", errrate);
+#endif
+
+    init_col(pattern, plen, nxt);
+#if _TRACE
+    print_col_as_row(nxt, plen);
+#endif
+    for (i=0; i<buflen && cont; i++) {
+        tmp = prev; prev = nxt; nxt = tmp;
+        compute_dp_next_col(pattern, plen, 0, buf[i], i, prev, nxt);
+
+        change = lastscore - nxt[plen];
+        if (change == 1) {
+            lastwasmiss = 0;
+            trailing_misses = 0;
+            hits++;
+        } else {
+            if (lastwasmiss)
+                trailing_misses++;
+            else
+                trailing_misses = 1;
+            misses++;
+            lastwasmiss = 1;
+        }
+
+        play = errrate * (i+1);
+
+        cont = (misses < (1.0+play));
+
+#if _TRACE
+        printf("i %d char %c score %d diff %d continue %d misses %d play %f\n", 
+               i, buf[i], nxt[plen], lastscore - nxt[plen], cont, misses, play);
+#endif
+        lastscore = nxt[plen];
+
+    }
+    /* Settle up */
+    i--;
+#if _TRACE
+    printf("Total hits: %d trailing misses: %d  position: %d\n",
+           hits, trailing_misses, i);
+#endif
+    free(prev);
+    free(nxt);
+
+    *bestpos = i - trailing_misses;
+    /* Not our usual score. */
+    *ret_hits = hits;
+    *ret_misses = misses;
+}
+
+
+static
+AgrepContinueFlag dp_callback_begin(const AgrepCallArgs *args, int32_t end, int32_t forwardscore)
+{
+    AgrepFlags mode = args->self->mode;
+    char *reverse_pattern = args->self->dp->rpattern;
+    int32_t threshold = args->threshold;
+    const char *buf = args->buf;
+    AgrepMatchCallback cb = args->cb;
+    void *cbinfo = args->cbinfo;
+
+    int32_t plen = strlen(reverse_pattern);
+    int32_t *prev = malloc(sizeof(int32_t)*(plen+1));
+    int32_t *nxt = malloc(sizeof(int32_t)*(plen+1));
+    AgrepMatch match;
+    AgrepContinueFlag cont;
+    int32_t *tmp;
+    int32_t i;
+
+    int32_t curscore = 0;
+    int32_t curlast = 0;
+    int32_t continuing = 0;
+
+    int32_t limit;
+
+    init_col(reverse_pattern, plen, nxt);
+#if _TRACE
+    print_col_as_row(nxt, plen);
+#endif
+
+    limit = end - args->self->dp->plen - threshold - 1;
+    if (limit < 0)
+        limit = 0;
+    
+    for (i=end; i>=limit; i--) {
+        tmp = prev; prev = nxt; nxt = tmp;
+        /* For the reverse scan, we need to make the initial cost
+           of the column depend upon the price of skipping the
+           suffix (up to this point) of the text */
+        compute_dp_next_col(reverse_pattern, plen, mode, end-i+1,
+                            buf[i], prev, nxt);
+
+        if ((mode & AGREP_LEFT_MAINTAIN_SCORE)?
+            nxt[plen] <= forwardscore:
+            nxt[plen] <= threshold)
+        {
+            if (continuing) {
+                if (nxt[plen] < curscore) {
+                    curscore = nxt[plen];
+                    curlast = i;
+                } else if (nxt[plen] == curscore &&
+                           (mode & AGREP_EXTEND_SAME)) {
+                    curlast = i;
+                } else {
+                    continuing = 0;
+                    match.score = curscore;
+                    match.position = curlast;
+                    match.length = end - curlast + 1;
+                    cont = AGREP_CONTINUE;
+                    (*cb)(cbinfo, &match, &cont);
+                    if (cont != AGREP_CONTINUE)
+                        goto EXIT;
+                }
+            } else if ((mode & AGREP_EXTEND_SAME) ||
+                       (mode & AGREP_EXTEND_BETTER)) {
+                curscore = nxt[plen];
+                curlast = i;
+                continuing = 1;
+            } else {
+                match.score = nxt[plen];
+                match.position = i;
+                match.length = end - i + 1;
+                cont = AGREP_CONTINUE;
+                (*cb)(cbinfo, &match, &cont);
+                if (cont != AGREP_CONTINUE)
+                    goto EXIT;
+            }
+        }
+#if _TRACE
+        print_col_as_row(nxt, plen);
+#endif
+    }
+    if (continuing) {
+        continuing = 0;
+        match.score = curscore;
+        match.position = curlast;
+        match.length = end - curlast + 1;
+        cont = AGREP_CONTINUE;
+        (*cb)(cbinfo, &match, &cont);
+        goto EXIT;
+    }
+    cont = AGREP_CONTINUE;
+EXIT:
+    free(prev);
+    free(nxt);
+    return cont;
+}
+
+rc_t CC dp_end_callback( const void *cbinfo, const AgrepMatch *match, AgrepContinueFlag *flag )
+{
+    const AgrepCallArgs *cbi = cbinfo;
+    *flag = dp_callback_begin(cbi, match->position, match->score);
+    return 0;
+}
+
+
+static
+void dp_callback_end( const AgrepCallArgs *args )
+{
+    AgrepFlags mode = args->self->mode;
+    char *pattern = args->self->dp->pattern;
+    int32_t threshold = args->threshold;
+    const char *buf = args->buf;
+    int32_t buflen = args->buflen;
+
+    AgrepMatchCallback cb = dp_end_callback;
+    const void *cbinfo = args;
+
+    int32_t plen = strlen(pattern);
+    int32_t *prev = malloc(sizeof(int32_t)*(plen+1));
+    int32_t *nxt = malloc(sizeof(int32_t)*(plen+1));
+    int32_t curscore = 0;
+    int32_t curlast = 0;
+    int32_t continuing = 0;
+
+    int32_t startingcost = 0;
+    int32_t limit;
+
+    AgrepMatch match;
+    AgrepContinueFlag cont;
+    int32_t *tmp;
+    int32_t i;
+
+    init_col(pattern, plen, nxt);
+#if _TRACE
+    print_col_as_row(nxt, plen);
+#endif
+    
+    limit = buflen;
+    if (mode & AGREP_ANCHOR_LEFT) {
+        limit = args->self->dp->plen + threshold+1;
+        if (limit > buflen) {
+            limit = buflen;
+        }
+        cb = args->cb;
+        cbinfo = args->cbinfo;
+    }
+
+    for (i=0; i<limit; i++) {
+        tmp = prev; prev = nxt; nxt = tmp;
+
+        if (mode & AGREP_ANCHOR_LEFT) 
+            startingcost = i+1;
+        compute_dp_next_col(pattern, plen, mode, startingcost, 
+                            buf[i], prev, nxt);
+        if (nxt[plen] <= threshold) {
+
+            if (continuing) {
+                if (nxt[plen] < curscore &&
+                    ((mode & AGREP_EXTEND_BETTER) ||
+                     (mode & AGREP_EXTEND_SAME))) {
+                    curscore = nxt[plen];
+                    curlast = i;
+                } else if (nxt[plen] == curscore &&
+                           ((mode & AGREP_EXTEND_BETTER) ||
+                            (mode & AGREP_EXTEND_SAME))) {
+                    if (mode & AGREP_EXTEND_SAME) {
+                        curlast = i;
+                    }
+                } else {
+                    continuing = 0;
+                    match.score = curscore;
+                    if (mode & AGREP_ANCHOR_LEFT) {
+                        match.position = 0;
+                        match.length = curlast+1;
+                    } else {
+                        match.position = curlast;
+                        match.length = -1;
+                    }
+                    cont = AGREP_CONTINUE;
+                    (*cb)(cbinfo, &match, &cont);
+                    if (cont != AGREP_CONTINUE)
+                        goto EXIT;
+                }
+            } else if ((mode & AGREP_EXTEND_SAME) ||
+                       (mode & AGREP_EXTEND_BETTER)) {
+                curscore = nxt[plen];
+                curlast = i;
+                continuing = 1;
+            } else {
+                match.score = nxt[plen];
+                if (mode & AGREP_ANCHOR_LEFT) {
+                    match.position = 0;
+                    match.length = i+1;
+                } else {
+                    match.position = i;
+                    match.length = -1;
+                }
+                cont = AGREP_CONTINUE;
+                (*cb)(cbinfo, &match, &cont);
+                if (cont != AGREP_CONTINUE)
+                    goto EXIT;
+            }
+            /* If we're no longer under the threshold, we might
+               have been moving forward looking for a better match 
+            */
+        } else if (continuing) {
+            continuing = 0;
+            match.score = curscore;
+            if (mode & AGREP_ANCHOR_LEFT) {
+                match.position = 0;
+                match.length = curlast+1;
+            } else {
+                match.position = curlast;
+                match.length = -1;
+            }
+            cont = AGREP_CONTINUE;
+            (*cb)(cbinfo, &match, &cont);
+            if (cont != AGREP_CONTINUE)
+                goto EXIT;
+        }
+#if _TRACE
+        print_col_as_row(nxt, plen);
+#endif
+    }
+    if (continuing) {
+        continuing = 0;
+        match.score = curscore;
+        if (mode & AGREP_ANCHOR_LEFT) {
+            match.position = 0;
+            match.length = curlast+1;
+        } else {
+            match.position = curlast;
+            match.length = -1;
+        }
+        (*cb)(cbinfo, &match, &cont);
+    }
+EXIT:
+    free(prev);
+    free(nxt);
+}
+
+
+
+static
+uint32_t dp_find_end(const char *pattern, AgrepFlags mode, int32_t threshold, const char *buf, int32_t buflen, int32_t *bestpos, int32_t *bestscore) 
+{
+    int32_t plen = strlen(pattern);
+    int32_t *prev = malloc(sizeof(int32_t)*(plen+1));
+    int32_t *nxt = malloc(sizeof(int32_t)*(plen+1));
+    int32_t *tmp;
+    int32_t i;
+
+    int32_t foundit = 0;
+
+
+    *bestscore = 10000;
+    *bestpos = 1;
+
+    init_col(pattern, plen, nxt);
+#if _TRACE
+    print_col_as_row(nxt, plen);
+#endif
+    for (i=0; i<buflen; i++) {
+        tmp = prev; prev = nxt; nxt = tmp;
+        compute_dp_next_col(pattern, plen, mode, 0, buf[i], prev, nxt);
+        if (nxt[plen] <= threshold) {
+            if (foundit) {
+                if (nxt[plen] <= *bestscore) {
+                    *bestpos = i;
+                    *bestscore = nxt[plen];
+                } else {
+                    /* Here we'd extend even if the score was equal, maybe */
+                }
+            } else {
+                /* Ok, we have a match under threshold.
+                   Let's continue and see if we can improve on it.
+                */
+                *bestpos = i;
+                *bestscore = nxt[plen];
+                foundit = 1;
+            }
+        } else {
+            if (foundit)
+                goto EXIT;
+        }
+#if _TRACE
+        print_col_as_row(nxt, plen);
+#endif
+    }
+EXIT:
+    free(prev);
+    free(nxt);
+    if (foundit)
+        return 1;
+    return 0;
+}
+
+
+
+
+static
+uint32_t dp_find_begin(char *reverse_pattern, AgrepFlags mode, int32_t threshold, const char *buf, int32_t buflen, int32_t end, int32_t *begin) 
+{
+    int32_t plen = strlen(reverse_pattern);
+    int32_t *prev = malloc(sizeof(int32_t)*(plen+1));
+    int32_t *nxt = malloc(sizeof(int32_t)*(plen+1));
+    int32_t *tmp;
+    int32_t i;
+
+    int32_t limit;
+
+    int32_t foundit = 0;
+    /* int32_t bestscore = 10000; */
+
+    *begin = 0;
+
+    limit = end - plen - threshold - 1;
+    if (limit < 0)
+        limit = 0;
+
+    init_col(reverse_pattern, plen, nxt);
+#if _TRACE
+    print_col_as_row(nxt, plen);
+#endif
+    for (i=end; i>=limit; i--) {
+        tmp = prev; prev = nxt; nxt = tmp;
+        /* We need to make the initial cost of this column
+           reflect the cost of skipping the suffix (up to this point)
+           of the text */
+        compute_dp_next_col(reverse_pattern, plen, mode, end-i, buf[i], prev, nxt);
+
+        if (nxt[plen] <= threshold) {
+            *begin = i;
+            /* bestscore = nxt[plen]; */
+            foundit = 1;
+        } else {
+            if (foundit)
+                goto EXIT;
+        }
+#if _TRACE
+        print_col_as_row(nxt, plen);
+#endif
+    }
+EXIT:
+    free(prev);
+    free(nxt);
+    if (foundit)
+        return 1;
+    return 0;
+}
+
+
+uint32_t AgrepDPFindFirst ( const DPParams *self, int32_t threshold, AgrepFlags mode, 
+        const char *buf, int32_t buflen, AgrepMatch *match )
+{
+    int32_t begin, end;
+    int32_t score;
+    if (dp_find_end(self->pattern, mode, threshold, buf, buflen, &end, &score)) {
+        if (dp_find_begin(self->rpattern, mode, threshold, buf, buflen, end, &begin)) {
+            match->position = begin;
+            match->length = end-begin+1;
+            match->score = score;
+            return 1;
+        }
+    }
+    return 0;
+}
+
+
+void AgrepDPFindAll( const AgrepCallArgs *args )
+{
+    dp_callback_end( args );
+}
+
+
+/* Try the longest match first. */
+LIB_EXPORT uint32_t CC has_left_approx_match( char *pattern, uint32_t errors, 
+                               char *buf, size_t buflen, 
+                               uint32_t *length, uint32_t *errcnt )
+{
+    int32_t plen = strlen(pattern);
+    int32_t *prev = malloc(sizeof(int)*(plen+1));
+    int32_t *nxt = malloc(sizeof(int)*(plen+1));
+    int32_t *tmp;
+    int32_t i, j;
+    int32_t allowable;
+    char *subpattern;
+    int32_t dist;
+
+    int32_t found = 0;
+    int32_t foundpos = 0;
+    int32_t founderr = 0;
+
+    for (i=plen; i>=8; i--) {
+
+        /* See if the first i chars of the text match the last i
+           chars of the pattern with (errors) errors.
+        */
+        subpattern = pattern + (plen - i);
+        init_col(subpattern, i, nxt);
+        for (j=0; j<i; j++) {
+            tmp = prev; prev = nxt; nxt = tmp;
+            compute_dp_next_col(subpattern, i, 0, buf[j], j, prev, nxt);
+        }
+        dist = nxt[i];
+        allowable = 1+lroundf((float)i * (float)errors / (float)plen);
+        if (found) {
+            if (dist <= founderr) {
+                foundpos = i-1;
+                founderr = dist;
+            } else {
+                goto DONE;
+            }
+        } else if (dist <= allowable) {
+            /* Found a match */
+            found = 1;
+            foundpos = i-1;
+            founderr = dist;
+
+            /* Continue a bit to see if something's equally good or better */
+        }
+    }
+    DONE:
+    free(prev);
+    free(nxt);
+    if (found) {
+        *length = foundpos+1;
+        *errcnt = founderr;
+        return 1;
+    }
+    return 0;
+}
+
+
+/* Try the longest match first. */
+LIB_EXPORT uint32_t CC has_right_approx_match( char *pattern, uint32_t errors, 
+                                char *buf, size_t buflen, 
+                                uint32_t *bestpos, uint32_t *errcnt )
+{
+    uint32_t plen = strlen(pattern);
+    int32_t *prev = malloc(sizeof(int)*(plen+1));
+    int32_t *nxt = malloc(sizeof(int)*(plen+1));
+    int32_t *tmp;
+    int32_t i, j;
+    int32_t allowable;
+    char *subpattern, chBackup;
+    char *subpattern_r;
+    int32_t dist;
+
+    int32_t found = 0;
+    int32_t foundpos = 0;
+    int32_t founderr = 0;
+    int32_t bufj;
+
+    int bound = plen;
+    if (buflen < bound) {
+        bound = buflen;
+    }
+
+    subpattern = malloc(plen + 1);
+    subpattern_r = malloc(plen + 1);
+    strncpy(subpattern, pattern, plen);
+
+    for (i=bound; i>=8; i--, subpattern[i] = chBackup) {
+
+        /* See if the first i chars of the pattern match the last i
+           chars of the text with (errors) errors.
+           We match in reverse, so the initial penalty of skipping
+           the "first part" of the pattern means skipping the end
+        */
+        /* making prefix of length i out of pattern
+        (subpattern contains full copy of pattern)*/
+        chBackup = subpattern[i];
+        subpattern[i] = '\0';
+
+        reverse_string(subpattern, i, subpattern_r);
+        init_col(subpattern_r, i, nxt);
+
+        for (j=0; j<i; j++) {
+            bufj = buflen - j - 1;
+            tmp = prev; prev = nxt; nxt = tmp;
+            compute_dp_next_col(subpattern_r, i, 0, buf[bufj], j, prev, nxt);
+        }
+        dist = nxt[i];
+        allowable = 1+lroundf((float)i * (float)errors / (float)plen);
+        if (found) {
+            if (dist <= founderr) {
+                foundpos = buflen - i;
+                founderr = dist;
+            } else {
+                goto DONE;
+            }
+        } else if (dist <= allowable) {
+            /* Found a match */
+            found = 1;
+            foundpos = buflen - i;
+            founderr = dist;
+
+            /* Continue a bit to see if something's equally good or better */
+        }
+    }
+    DONE:
+    free(subpattern);
+    free(subpattern_r);
+    free(prev);
+    free(nxt);
+    if (found) {
+        *bestpos = foundpos;
+        *errcnt = founderr;
+        return 1;
+    }
+    return 0;
+}
+
+
+
+/* Try the longest match first. */
+/* Call with pattern as the text, text as pattern. */
+LIB_EXPORT uint32_t CC has_inside_approx_match( char *pattern, uint32_t plen, uint32_t errors, 
+                                 char *buf, size_t buflen, 
+                                 uint32_t *skip, uint32_t *errcnt )
+{
+    int32_t *prev = malloc(sizeof(int)*(plen+1));
+    int32_t *nxt = malloc(sizeof(int)*(plen+1));
+    int32_t *tmp;
+    int32_t j;
+    int32_t allowable;
+    int32_t dist;
+
+    int32_t found = 0;
+    int32_t foundpos = 0;
+    int32_t founderr = 0;
+
+    allowable = 1+lroundf((float)errors * plen / (float)buflen);
+
+
+    init_col(pattern, plen, nxt);
+    
+    for (j=0; j<buflen; j++) {
+        tmp = prev; prev = nxt; nxt = tmp;
+        compute_dp_next_col(pattern, plen, 0, buf[j], 0, prev, nxt);
+
+        dist = nxt[plen];
+
+        /* 
+           We still have to do this kind of thing because otherwise
+           the match will extend past the end of the text (here pattern),
+           and will match "useless" letters that just increase the score.
+           So we continue looking at smaller subsequences of the pattern
+           to see if something smaller matches better. 
+        */
+        
+        if (found) {
+            if (dist <= founderr && dist <= allowable) {
+                foundpos = j;
+                founderr = dist;
+            } else {
+                goto DONE;
+            }
+        } else if (dist <= allowable) {
+            /* Found a match */
+            found = 1;
+            foundpos = j;
+            founderr = dist;
+
+            /* Continue a bit to see if something's equally good or better */
+        }
+    }
+DONE:
+    free(prev);
+    free(nxt);
+    if (found) {
+        *skip = foundpos;
+        *errcnt = founderr;
+        return 1;
+    }
+    return 0;
+}
diff --git a/libs/search/agrep-myers.c b/libs/search/agrep-myers.c
new file mode 100644
index 0000000..5b2660e
--- /dev/null
+++ b/libs/search/agrep-myers.c
@@ -0,0 +1,644 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <search/extern.h>
+#include <compiler.h>
+#include <os-native.h>
+#include <sysalloc.h>
+#include <assert.h>
+#include "search-priv.h"
+#include "debug.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#define DBG_SEARCH_METHOD DBG_SEARCH_MYERS
+
+#define UBITTYPE uint64_t
+
+struct MyersSearch {
+    AgrepFlags mode;
+    int32_t m;
+    UBITTYPE PEq[256];
+    UBITTYPE PEq_R[256];
+};
+
+static
+rc_t myers_translate(AgrepFlags mode, UBITTYPE* PEq, unsigned char p, UBITTYPE val)
+{
+    /* For now always set 2na bits */
+    set_bits_2na(PEq, p, val);
+
+    if( mode & AGREP_PATTERN_4NA ) {
+        return na4_set_bits(mode, PEq, p, val);
+    } else if( mode & AGREP_MODE_ASCII ) {
+        if( mode & AGREP_IGNORE_CASE ) {
+            PEq[tolower(p)] |= val;
+            PEq[toupper(p)] |= val;
+        } else {
+            PEq[p] |= val;
+        }
+    }
+    return 0;
+}
+
+#if _DEBUGGING
+static
+void printbits( UBITTYPE in )
+{
+    char buf[9];
+    int32_t j, k;
+    unsigned char byte;
+    buf[8] = '\0';
+    for (j=0; j<sizeof(UBITTYPE); j++) {
+        byte = in >> (8*(sizeof(UBITTYPE) - j - 1));
+        for (k=0; k<8; k++) {
+            buf[k] = "01"[1&(byte>>(7-k))];
+        }
+        SEARCH_DBGF(("%s ", buf));
+    }
+}
+#else
+#define printbits(in) ((void)0)
+#endif
+
+void AgrepMyersFree( MyersSearch *self )
+{
+    free(self);
+}
+  
+rc_t AgrepMyersMake( MyersSearch **self, AgrepFlags mode, const char *pattern )
+{
+    rc_t rc = 0;
+    uint32_t max_pattern_length = sizeof(UBITTYPE) * 8;
+    int32_t m = strlen(pattern);
+
+    *self = NULL;
+    if( m > max_pattern_length ) {
+        rc = RC(rcText, rcString, rcSearching, rcParam, rcExcessive);
+    } else if( (*self = malloc(sizeof(**self))) == NULL ) {
+        rc = RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+    } else {            
+        int32_t j;
+        const unsigned char *upattern = (const unsigned char *)pattern;
+
+        (*self)->m = m;
+        (*self)->mode = mode;
+        memset((*self)->PEq, 0, sizeof((*self)->PEq));
+        for(j = 0; rc == 0 && j < m; j++) {
+            rc = myers_translate(mode, (*self)->PEq, upattern[j], (UBITTYPE)1 << j);
+        }
+        SEARCH_DBG("pattern '%s'", upattern);
+        for(j = 0; j < sizeof((*self)->PEq) / sizeof((*self)->PEq[0]); j++) {
+            if( (*self)->PEq[j] ) {
+                printbits((*self)->PEq[j]);
+                SEARCH_DBGF((" <- %c\n", j));
+            }
+        }
+        memset((*self)->PEq_R, 0, sizeof((*self)->PEq_R));
+        for(j = 0; rc == 0 && j < m; j++) {
+            rc = myers_translate(mode, (*self)->PEq_R, upattern[m - j - 1], (UBITTYPE)1 << j);
+        }
+        SEARCH_DBG("pattern rev '%s'", upattern);
+        for(j = 0; j < sizeof((*self)->PEq) / sizeof((*self)->PEq[0]); j++) {
+            if( (*self)->PEq[j] ) {
+                printbits((*self)->PEq[j]);
+                SEARCH_DBGF((" <- %c\n", j));
+            }
+        }
+    }
+    return rc;
+}
+
+/* 
+   This finds the first match forward in the string less than or equal
+   the threshold.  If nonzero, this will be a prefix of any exact match.
+*/
+
+uint32_t MyersFindFirst( MyersSearch *self, int32_t threshold, 
+                   const char* text, size_t n,
+                   AgrepMatch *match )
+{
+    const unsigned char *utext = (const unsigned char *)text;
+    UBITTYPE Pv;
+    UBITTYPE Mv;
+
+    int32_t m = self->m;
+    int32_t Score;
+    int32_t BestScore = m;
+    int32_t from = 0;
+    int32_t to = -1;
+
+    int32_t j;
+    UBITTYPE Eq, Xv, Xh, Ph, Mh;
+
+    Score = m;
+    Pv = (UBITTYPE)-1;
+    Mv = (UBITTYPE)0;
+    
+    for(j = 0; j < n; j++) {
+        Eq = self->PEq[utext[j]];
+        Xv = Eq | Mv;
+        Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq;
+        Ph = Mv | ~ (Xh | Pv);
+        Mh = Pv & Xh;
+        if(Ph & ((UBITTYPE)1 << (m - 1))) {
+            Score++;
+        } else if(Mh & ((UBITTYPE)1 << (m - 1))) {
+            Score--;
+        }
+        Ph <<= 1;
+        Mh <<= 1;
+        Pv = Mh | ~(Xv | Ph);
+        Mv = Ph & Xv;
+        SEARCH_DBG("1st: %3d. '%c' score %d", j, utext[j], Score);
+        if (Score <= threshold) {
+            BestScore = Score;
+            to = j;
+            break;
+        }
+    }
+
+    if (BestScore <= threshold) {
+
+        /* Continue while score decreases under the threshold */
+        for(j++; j < n; j++) {
+            Eq = self->PEq[utext[j]];
+            Xv = Eq | Mv;
+            Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq;
+            Ph = Mv | ~ (Xh | Pv);
+            Mh = Pv & Xh;
+            if(Ph & ((UBITTYPE)1 << (m - 1))) {
+                Score++;
+            } else if(Mh & ((UBITTYPE)1 << (m - 1))) {
+                Score--;
+            }
+            Ph <<= 1;
+            Mh <<= 1;
+            Pv = Mh | ~(Xv | Ph);
+            Mv = Ph & Xv;
+            SEARCH_DBG("2nd: %3d. '%c' score %d", j, utext[j], Score);
+            if( Score < BestScore ||
+                ( (self->mode & (AGREP_EXTEND_BETTER | AGREP_EXTEND_SAME)) && Score <= BestScore) ) {
+                BestScore = Score;
+                to = j;
+            } else {
+                break;
+            }
+        }
+    }
+
+    if (BestScore <= threshold) {
+        /* Re-initialize for next scan! */
+        Score = m;
+        Pv = (UBITTYPE)-1;
+        Mv = (UBITTYPE)0;
+        
+        for(j = to; j >= 0; j--) {
+            Eq = self->PEq_R[utext[j]];
+            Xv = Eq | Mv;
+            Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq;
+            Ph = Mv | ~ (Xh | Pv);
+            Mh = Pv & Xh;
+            if(Ph & ((UBITTYPE)1 << (m - 1))) {
+                Score++;
+            } else if(Mh & ((UBITTYPE)1 << (m - 1))) {
+                Score--;
+            }
+            Ph <<= 1;
+            Mh <<= 1;
+            Pv = Mh | ~(Xv | Ph);
+            Mv = Ph & Xv;
+            SEARCH_DBG("Rvs: %3d. '%c' score %d", j, utext[j], Score);
+            if(Score <= BestScore) {
+                from = j;
+                break;
+            }
+        }
+    }
+    if (BestScore <= threshold) {
+        match->position = from;
+        match->length = to-from+1;
+        match->score = BestScore;
+        SEARCH_DBG("Hit: [%d,%d] '%.*s' score %d", match->position, match->length,
+                    match->length, &utext[match->position], match->score);
+        return 1;
+    }
+    return 0;
+}
+
+  
+
+/* 
+   Returns non-negative if something found.
+   Return value is the number of mismatches.
+*/
+LIB_EXPORT int32_t CC MyersFindBest ( MyersSearch *self, const char* text, 
+    size_t n, int32_t *pos, int32_t *len )
+{
+    const unsigned char *utext = (const unsigned char *)text;
+    UBITTYPE Pv;
+    UBITTYPE Mv;
+
+    int32_t m = self->m;
+    int32_t Score;
+    int32_t BestScore = m;
+    int32_t from = 0;
+    int32_t to = -1;
+
+    int32_t j;
+    UBITTYPE Eq, Xv, Xh, Ph, Mh;
+
+    Score = m;
+    Pv = (UBITTYPE)-1;
+    Mv = (UBITTYPE)0;
+    
+    for(j = 0; j < n; j++) {
+        Eq = self->PEq[utext[j]];
+        Xv = Eq | Mv;
+        Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq;
+        Ph = Mv | ~ (Xh | Pv);
+        Mh = Pv & Xh;
+        if(Ph & ((UBITTYPE)1 << (m - 1))) {
+            Score++;
+        } else if(Mh & ((UBITTYPE)1 << (m - 1))) {
+            Score--;
+        }
+        Ph <<= 1;
+        Mh <<= 1;
+        Pv = Mh | ~(Xv | Ph);
+        Mv = Ph & Xv;
+        SEARCH_DBG("Fwd: %3d. '%c' score %d", j, utext[j], Score);
+        if( Score < BestScore ) {
+            BestScore = Score;
+            to = j;
+        }
+    }
+
+    /* Re-initialize for next scan! */
+    Score = m;
+    Pv = (UBITTYPE)-1;
+    Mv = (UBITTYPE)0;
+    
+    for(j = to; j >= 0; j--) {
+        Eq = self->PEq_R[utext[j]];
+        Xv = Eq | Mv;
+        Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq;
+        Ph = Mv | ~ (Xh | Pv);
+        Mh = Pv & Xh;
+        if(Ph & ((UBITTYPE)1 << (m - 1))) {
+            Score++;
+        } else if(Mh & ((UBITTYPE)1 << (m - 1))) {
+            Score--;
+        }
+        Ph <<= 1;
+        Mh <<= 1;
+        Pv = Mh | ~(Xv | Ph);
+        Mv = Ph & Xv;
+        SEARCH_DBG("Rvs: %3d. '%c' score %d", j, utext[j], Score);
+        if(Score <= BestScore) {
+            from = j;
+            break;
+        }
+    }
+    
+    *pos = from;
+    *len = to-from+1;
+    SEARCH_DBG("Hit: [%d,%d] '%.*s' score %d", *pos, *len, *len, &utext[*pos], BestScore);
+    return BestScore;
+}
+
+/* 
+   This finds the first match forward in the string less than or equal
+   the threshold.  If nonzero, this will be a prefix of any exact match.
+*/
+
+/*
+    MyersFindAllOld is the old implementation of MyersFindAll.
+    It uses inline copy-pasted Myers core algorithm steps therefore
+    it might be faster than the new MyersFindAll (if compiler doesn't optimize it enough)
+    Also for some reason it uses unoptimized dp algorithm to find starting point of the match.
+
+    Leaving it in CVS for a while just in case (with fixed bug in "const void *cbinfo = args->cbinfo;"
+    and some minor improvements like marking data being used for read only as explicitly const)
+*/
+#if 0
+void MyersFindAllOld ( const AgrepCallArgs *args )
+{
+    AgrepFlags const mode = args->self->mode;
+    MyersSearch const* self = args->self->myers;
+    int32_t const threshold = args->threshold;
+    const unsigned char *utext = (const unsigned char *)args->buf;
+    int32_t const n = args->buflen;
+    AgrepMatchCallback cb = dp_end_callback;
+    const void *cbinfo = args->cbinfo;
+
+    AgrepMatch match;
+    AgrepContinueFlag cont;
+
+    UBITTYPE Pv;
+    UBITTYPE Mv;
+
+    int32_t const m = self->m;
+    int32_t Score;
+    int32_t BestScore;
+
+    int32_t j;
+    UBITTYPE Eq, Xv, Xh, Ph, Mh;
+
+    int32_t curscore = 0;
+    int32_t curlast = 0;
+    int32_t continuing = 0;
+    
+    BestScore = m;
+    Score = m;
+    Pv = (UBITTYPE)-1;
+    Mv = (UBITTYPE)0;
+    
+    for (j = 0; j < n; j++)
+    {
+        Eq = self->PEq[utext[j]];
+        Xv = Eq | Mv;
+        Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq;
+        Ph = Mv | ~ (Xh | Pv);
+        Mh = Pv & Xh;
+
+        SEARCH_DBG("%d: Ph ", j);
+        printbits(Ph);
+        SEARCH_DBG(" %s ", "Mh");
+        printbits(Mh);
+        SEARCH_DBG("%s", "");
+
+        if(Ph & ((UBITTYPE)1 << (m - 1))) {
+            Score++;
+        } else if(Mh & ((UBITTYPE)1 << (m - 1))) {
+            Score--;
+        }
+        Ph <<= 1;
+        Mh <<= 1;
+        Pv = Mh | ~(Xv | Ph);
+        Mv = Ph & Xv;
+        SEARCH_DBG("%3d. '%c' score %d", j, utext[j], Score);
+        if (Score <= threshold) {
+            /* At this point we let the DP algorithm find the starting point. */
+            /* This just passes the end position. */
+
+            if (continuing) {
+                if (Score < curscore &&
+                    ((mode & AGREP_EXTEND_BETTER) ||
+                     (mode & AGREP_EXTEND_SAME))) {
+                    curscore = Score;
+                    curlast = j;
+                } else if (Score == curscore &&
+                           ((mode & AGREP_EXTEND_BETTER) ||
+                            (mode & AGREP_EXTEND_SAME))) {
+                    if (mode & AGREP_EXTEND_SAME) {
+                        curlast = j;
+                    }
+                } else {
+                    continuing = 0;
+                    match.score = curscore;
+                    match.position = curlast;
+                    match.length = -1;
+                    cont = AGREP_CONTINUE;
+                    (*cb)(cbinfo, &match, &cont);
+                    if (cont != AGREP_CONTINUE)
+                        return;
+                }
+            } else if ((mode & AGREP_EXTEND_SAME) ||
+                       (mode & AGREP_EXTEND_BETTER)) {
+                curscore = Score;
+                curlast = j;
+                continuing = 1;
+            } else {
+                match.score = Score;
+                match.position = j;
+                match.length = -1;
+                cont = AGREP_CONTINUE;
+                (*cb)(cbinfo, &match, &cont);
+                if (cont != AGREP_CONTINUE)
+                    return;
+            }
+            /* If we're no longer under the threshold, we might
+               have been moving forward looking for a better match 
+            */
+        } else if (continuing) {
+            continuing = 0;
+            match.score = curscore;
+            match.position = curlast;
+            match.length = -1;
+            cont = AGREP_CONTINUE;
+            (*cb)(cbinfo, &match, &cont);
+            if (cont != AGREP_CONTINUE)
+                return;
+        }
+    }
+    if (continuing) {
+        continuing = 0;
+        match.score = curscore;
+        match.position = curlast;
+        match.length = -1;
+        (*cb)(cbinfo, &match, &cont);
+    }
+}
+#endif
+
+
+/* The core of the Myers algorithm - calculation of j-th score
+    Now using for new MyersFindAll only but can be used by all other Myers-find
+    functons if there is no issues with performance because of function call with
+    so many parameters and locals
+*/
+
+#define MACRO_MYERS_CORE_STEP(ch, m, PEq, Mv, Pv, Score)\
+    Eq = PEq[ch];\
+    Xv = Eq | Mv;\
+    Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq;\
+    Ph = Mv | ~ (Xh | Pv);\
+    Mh = Pv & Xh;\
+    if (Ph & ((UBITTYPE)1 << (m - 1)))\
+        ++(Score);\
+    else if (Mh & ((UBITTYPE)1 << (m - 1)))\
+        --(Score);\
+\
+    Ph <<= 1;\
+    Mh <<= 1;\
+    Pv = Mh | ~(Xv | Ph);\
+    Mv = Ph & Xv;
+
+
+static void MyersCoreStep(unsigned char ch, int32_t const m
+    ,UBITTYPE const* PEq, UBITTYPE* Mv, UBITTYPE* Pv, int32_t *Score
+)
+{
+    UBITTYPE Eq, Xv, Xh, Ph, Mh;
+
+    Eq = PEq[ch];
+    Xv = Eq | *Mv;
+    Xh = (((Eq & *Pv) + *Pv) ^ *Pv) | Eq;
+    Ph = *Mv | ~ (Xh | *Pv);
+    Mh = *Pv & Xh;
+    if (Ph & ((UBITTYPE)1 << (m - 1)))
+        ++(*Score);
+    else if (Mh & ((UBITTYPE)1 << (m - 1)))
+        --(*Score);
+
+    Ph <<= 1;
+    Mh <<= 1;
+    *Pv = Mh | ~(Xv | Ph);
+    *Mv = Ph & Xv;
+
+}
+
+/* Return start position of the match given its end position and score */
+
+
+    /*
+        Here we're guaranteed that score will be decreasing down to:
+        1) TargetScore in the case when indexEnd points to the
+            string with deletions/modifications from the pattern
+        2) 0 in the case when indexEnd points to the string with
+            insertions to the end of the pattern
+        So we need to search backwards until Score is non-increasing
+    */
+#define MACRO_MYERS_GET_MATCH_STARTING_POSITION(Mv, Pv, Score, TargetScore, indexEnd)\
+    Score = self->m;\
+    ScorePrev = self->m;\
+    Pv = (UBITTYPE)-1;\
+    Mv = (UBITTYPE)0;\
+    for (indexStart = indexEnd; indexStart >= 0; --indexStart, ScorePrev = Score)\
+    {\
+        MACRO_MYERS_CORE_STEP(utext[indexStart], m, self->PEq_R, Mv, Pv, Score)\
+        if (Score > ScorePrev && ScorePrev <= TargetScore)\
+        {\
+            ++indexStart;\
+            break;\
+        }\
+        if (indexStart == 0 && Score <= TargetScore)\
+            break;\
+    }\
+    assert(indexStart >= 0);
+
+
+static int32_t MyersGetMatchStartingPosition(AgrepCallArgs const* args
+    ,int32_t const indexEnd, int32_t const TargetScore
+)
+{
+    MyersSearch const* self = args->self->myers;
+    unsigned char const* utext = (unsigned char const*)args->buf;
+    int32_t const m = self->m;
+
+    UBITTYPE Pv;
+    UBITTYPE Mv;
+
+    int32_t Score, ScorePrev;
+
+    int32_t j;
+
+    Score = m;
+    ScorePrev = m;
+    Pv = (UBITTYPE)-1;
+    Mv = (UBITTYPE)0;
+    /*
+        Here we're guaranteed that score will be decreasing down to:
+        1) TargetScore in the case when indexEnd points to the
+            string with deletions/modifications from the pattern
+        2) 0 in the case when indexEnd points to the string with
+            insertions to the end of the pattern
+        So we need to search backwards until Score is non-increasing
+    */
+    for (j = indexEnd; j >= 0; --j, ScorePrev = Score)
+    {
+        MyersCoreStep(utext[j], m, self->PEq_R, &Mv, &Pv, &Score);
+        SEARCH_DBG("Rvs: %3d. '%c' score %d", j, utext[j], Score);
+        if (Score > ScorePrev && ScorePrev <= TargetScore)
+        {
+            ++j;
+            break;
+        }
+        if (j == 0 && Score <= TargetScore)
+            break;
+    }
+    assert(j >= 0);
+    return j;
+}
+
+void MyersFindAll(AgrepCallArgs const *args )
+{
+    MyersSearch const* self = args->self->myers;
+    int32_t const threshold = args->threshold;
+    const unsigned char *utext = (const unsigned char *)args->buf;
+    int32_t const n = args->buflen;
+    const void *cbinfo = args->cbinfo;
+
+    AgrepMatch match;
+    AgrepContinueFlag cont;
+
+    UBITTYPE Pv;
+    UBITTYPE Mv;
+
+    int32_t const m = self->m;
+    int32_t Score;
+
+    int32_t j, indexStart;
+
+    Score = m;
+    Pv = (UBITTYPE)-1;
+    Mv = (UBITTYPE)0;
+    
+    for (j = 0; j < n; ++j)
+    {
+        MyersCoreStep(utext[j], m, self->PEq, &Mv, &Pv, &Score);
+        /*MACRO_MYERS_CORE_STEP(utext[j], m, self->PEq, Mv, Pv, Score)*/
+
+        if (Score <= threshold)
+        {
+            indexStart = MyersGetMatchStartingPosition(args, j, Score);
+            /*MACRO_MYERS_GET_MATCH_STARTING_POSITION(MvRev, PvRev, ScoreRev, Score, j)*/
+
+            /* found starting point indexStart for current match ending at j with Score */
+            /* TODO:
+                the algorithm behaves suspiciously on the boundary, e.g.:
+
+                input text: CCGGGTTTTTTAAAAACCCGGAATTCAAACCCTTTCGGTTCCATGTTGAATCACTAGACCCATCATCAGAAACAATTAGCTCATCCTGATCTCGTAAACACCCAAGAATACTATTAATTTGCTCGGCTATATATCTCTCACCATTATAGCTTGCAAGACATACTGATATTTTCACTTTAATATATACTTAATTATATCTGAAGAAGAATATAGATAGTTATTGTCAAAGATAGATCTCATTAGCCTTTTACTAGGGCAAGCTTATATAGTAGTATTTCAAACGGCTTTCTTAAAAAACTTTAGGCCGGGTTTTTTAAAAACCCGGAATTCAAACCCTTTCGGTTCCA
+                should find match for GTTGGAACCGAAAGGGTTTGAATTCAAACCCTTTCGGTTCCAAC at pos=6 and pos=310 (len=38) (the same fragment TTTTTTAAAAACCCGGAATTCAAACCCTTTCGGTTCCA) with the same score
+                but in fact for pos=310 (310+38=boundary, i.e. the end of line) it finds it with score=13 and for pos=6 - with score=14
+            */
+            match.score = Score;
+            match.position = indexStart;
+            match.length = j - indexStart + 1;
+            cont = AGREP_CONTINUE;
+            (*args->cb)(cbinfo, &match, &cont);
+            if (cont != AGREP_CONTINUE)
+            {
+                return;
+            }
+        }
+    }
+}
diff --git a/libs/search/agrep-myersunltd.c b/libs/search/agrep-myersunltd.c
new file mode 100644
index 0000000..bb47527
--- /dev/null
+++ b/libs/search/agrep-myersunltd.c
@@ -0,0 +1,1039 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <search/extern.h>
+#include <compiler.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "search-priv.h"
+
+
+/* 
+   We don't use longs here because the addition means we need to keep
+   some bits in reserve to calculate carries.
+*/   
+
+typedef int32_t schunk;
+typedef uint32_t uchunk;
+
+typedef struct CHUNK {
+    int32_t size;
+    uchunk *chunks;
+} CHUNK;
+
+struct MyersUnlimitedSearch {
+    int32_t m;
+    CHUNK *PEq[256];
+    CHUNK *PEq_R[256];
+};
+
+static const char NA2KEY [] = "ACGT";
+static const char NA4KEY [] = " ACMGRSVTWYHKDBN";
+
+static
+int32_t any_non_4na_chars(const char *pattern)
+{
+    int32_t len = strlen(pattern);
+    int32_t i;
+    char *p;
+
+    for ( i=0; i<len; i++ )
+    {
+        p = strchr( NA4KEY, pattern[i] );
+        if ( p == NULL )
+            return 1;
+    }
+    return 0;
+}
+
+static
+int32_t na4key_matches(AgrepFlags mode, char na4, char acgt)
+{
+    char *p;
+    int32_t pos4, pos2;
+    p = strchr( NA4KEY, na4 );
+    if ( p == NULL )
+    {
+        p = strchr( NA4KEY, 'N' );
+    }
+    pos4 = p - NA4KEY;
+    pos2 = strchr( NA2KEY, acgt ) - NA2KEY;
+    if ( pos4 & ( 1 << pos2 ) )
+        return 1;
+    return 0;
+}
+
+
+
+
+int32_t chunksize(int32_t size) {
+    int32_t ret;
+    ret = 1 + (size / (8*sizeof(uchunk)));
+    return ret;
+}
+
+void chunk_or_in(CHUNK *chunk, CHUNK *or)
+{
+    int32_t i;
+    int32_t size = chunk->size;
+    for (i=0; i<size; i++)
+        chunk->chunks[i] |= or->chunks[i];
+}
+
+void chunk_xor_in(CHUNK *chunk, CHUNK *xor)
+{
+    int32_t i;
+    int32_t size = chunk->size;
+    for (i=0; i<size; i++)
+        chunk->chunks[i] ^= xor->chunks[i];
+}
+
+
+void chunk_and_in(CHUNK *chunk, CHUNK *and)
+{
+    int32_t i;
+    int32_t size = chunk->size;
+    for (i=0; i<size; i++)
+        chunk->chunks[i] &= and->chunks[i];
+}
+
+void chunk_add_in(CHUNK *chunk, CHUNK *add)
+{
+    int32_t i;
+    int32_t size = chunk->size;
+    uint64_t carry = 0;
+    uint64_t newcarry;
+    for (i=size-1; i>=0; i--) {
+        newcarry = 
+            ((uint64_t)chunk->chunks[i] + (uint64_t)add->chunks[i]
+             + carry)
+            >> (8*sizeof(uchunk));
+        chunk->chunks[i] += add->chunks[i] + carry;
+        carry = newcarry;
+    }
+}
+
+
+void chunk_set(CHUNK *chunk, CHUNK *copy)
+{
+    int32_t i;
+    for (i=0; i<chunk->size; i++) {
+        chunk->chunks[i] = copy->chunks[i];
+    }
+}
+
+
+int32_t chunk_isbit_set(CHUNK *chunk, int32_t bit)
+{
+    int32_t cn = chunk->size - 1 - (bit / (8*sizeof(uchunk)));
+    int32_t chunkbit = bit % (8*sizeof(uchunk));
+    return chunk->chunks[cn] & (1 << chunkbit);
+}
+
+
+void chunk_set_bit(CHUNK *chunk, int32_t bit) 
+{
+    int32_t cn = chunk->size - 1 - (bit / (8*sizeof(uchunk)));
+    int32_t chunkbit = bit % (8*sizeof(uchunk));
+    chunk->chunks[cn] |= (1 << chunkbit);
+}
+
+
+void chunk_negate(CHUNK *chunk)
+{
+    int32_t i;
+    for (i=0; i<chunk->size; i++) {
+        chunk->chunks[i] = ~chunk->chunks[i];
+    }
+}
+
+void alloc_chunk_and_zero(CHUNK *chunk, int32_t size)
+{
+    chunk->chunks = malloc(size * sizeof(uchunk));
+    memset(chunk->chunks, 0, size * sizeof(uchunk));
+}
+
+void free_chunk_parts(CHUNK *chunk)
+{
+    free(chunk->chunks);
+    chunk->chunks = NULL;
+}
+
+void free_chunk(CHUNK *chunk)
+{
+    free(chunk->chunks);
+    free(chunk);
+}
+
+
+CHUNK *alloc_chunk(int32_t size)
+{
+    CHUNK *ret;
+    ret = malloc(sizeof(CHUNK));
+    ret->size = size;
+    ret->chunks = malloc(size * sizeof(uchunk));
+    memset(ret->chunks, 0, size * sizeof(uchunk));
+    return ret;
+}
+  
+void chunk_set_minusone(CHUNK *src)
+{
+    int32_t i;
+    for (i=0; i<src->size; i++) {
+        src->chunks[i] = (uchunk)-1;
+    }
+}
+
+void chunk_zero(CHUNK *src)
+{
+    int32_t i;
+    for (i=0; i<src->size; i++) {
+        src->chunks[i] = (uchunk)0;
+    }
+}
+
+void print_chunk(CHUNK *src)
+{
+    uchunk chunk;
+    unsigned char byte;
+    char buf[9];
+    int32_t i, j, k;
+    buf[8] = '\0';
+    for (i=0; i<src->size; i++) {
+        chunk = src->chunks[i];
+        for (j=0; j<sizeof(uchunk); j++) {
+            byte = chunk >> (8*(sizeof(uchunk) - j - 1));
+            for (k=0; k<8; k++) {
+                buf[k] = "01"[1&(byte>>(7-k))];
+            }
+            printf("%s ", buf);
+        }
+    }
+    printf("\n");
+}
+
+
+/*
+  This currently does not preserve the sign bit.
+*/
+void lshift_chunk(CHUNK *dest, CHUNK *src, int32_t n)
+{
+    int32_t i, j;
+    uchunk slop;
+    int32_t chunkshift = n / (8*sizeof(uchunk));
+    int32_t rem = n % (8*sizeof(uchunk));
+    /* Assumes they're both the same size. */
+    int32_t size = src->size;
+
+
+    /* i is the destination chunk */
+    slop = 0;
+    for (i=size-1; i>=0; i--) {
+        j = i+chunkshift;
+        if (j >= size) {
+            dest->chunks[i] = 0;
+        } else {
+            dest->chunks[i] = slop | src->chunks[j] << rem;
+            slop = src->chunks[j] >> (8*sizeof(uchunk) - rem);
+        }
+    }
+}
+
+void chunk_lshift_one_inplace(CHUNK *dest)
+{
+    int32_t i;
+    uchunk slop, newslop;
+    int32_t size = dest->size;
+
+    slop = 0;
+    for (i=size-1; i>=0; i--) {
+        newslop = dest->chunks[i] >> (8*sizeof(uchunk) - 1);
+        dest->chunks[i] = slop | dest->chunks[i] << 1;
+        slop = newslop;
+    }
+}
+
+
+void chunk_lshift_one(CHUNK *dest, CHUNK *src)
+{
+    int32_t i;
+    uchunk slop;
+    int32_t size = src->size;
+
+    slop = 0;
+    for (i=size-1; i>=0; i--) {
+        dest->chunks[i] = slop | src->chunks[i] << 1;
+        slop = src->chunks[i] >> (8*sizeof(uchunk) - 1);
+    }
+}
+
+
+
+#ifdef UNUSED_MAY_NOT_WORK  
+  
+/*
+ * In this, chunks are big-endian, meaning 0 is the most significant chunk.
+ */
+void rshift_uchunk(CHUNK *dest, CHUNK *src, int32_t n)
+{
+    int32_t size = src->size;
+    uchunk slop;
+    int32_t chunkshift = n / (8*sizeof(uchunk));
+    int32_t rem = n % (8*sizeof(uchunk));
+    int32_t i, j;
+
+    /* i is the destination chunk */
+    slop = 0;
+    for (i=0; i<size; i++) {
+        j = i-chunkshift;
+        if (j < 0) {
+            dest->chunks[i] = 0;
+        } else {
+            dest->chunks[i] = slop | src->chunks[j] >> rem;
+            slop = src->chunks[j] << (8*sizeof(uchunk) - rem);
+        }
+    }
+}
+
+void rshift_schunk(CHUNK *dest, CHUNK *src, int32_t n)
+{
+    uchunk slop;
+    int32_t chunkshift = n / (8*sizeof(uchunk));
+    int32_t rem = n % (8*sizeof(uchunk));
+    int32_t i, j, size;
+
+    /* i is the destination chunk */
+    slop = -1;
+    for (i=0; i<size; i++) {
+        j = i-chunkshift;
+        if (j < 0) {
+            dest->chunks[i] = -1;
+        } else {
+            dest->chunks[i] = slop | src->chunks[j] >> rem;
+            slop = src->chunks[j] << (8*sizeof(uchunk) - rem);
+        }
+    }
+}
+
+#endif
+
+
+void MyersUnlimitedFree ( MyersUnlimitedSearch *self )
+{
+    int32_t j;
+    for (j=0; j<256; j++) {
+        free_chunk(self->PEq[j]);
+        free_chunk(self->PEq_R[j]);
+    }
+    free(self);
+}
+  
+
+rc_t MyersUnlimitedMake ( MyersUnlimitedSearch **self,
+        AgrepFlags mode, const char *pattern )
+{
+    const unsigned char *upattern = (const unsigned char *)pattern;
+    int32_t rc;
+    int32_t len = strlen(pattern);
+    int32_t plen = len;
+    int32_t i, j;
+    int32_t m;
+    int32_t chunks;
+
+    if (!(mode & AGREP_ANYTHING_ELSE_IS_N) &&
+        any_non_4na_chars(pattern))
+        /* This should be a return code. */
+        return RC( rcText, rcString, rcSearching, rcParam, rcUnrecognized);
+
+
+    *self = malloc(sizeof(MyersUnlimitedSearch));
+    m = (*self)->m = len;
+    chunks = chunksize(m);
+    for (j=0; j<256; j++) {
+        (*self)->PEq[j] = alloc_chunk(chunks);
+        (*self)->PEq_R[j] = alloc_chunk(chunks);
+    }
+
+    for(j = 0; j < m; j++) {
+        chunk_set_bit((*self)->PEq[upattern[j]], j);
+        if( pattern[j] == 'a' ) {
+            chunk_set_bit((*self)->PEq['t'], j); /* t == a */
+        }
+    }
+
+    for(j = 0; j < m; j++) {
+        chunk_set_bit((*self)->PEq_R[upattern[m-j-1]], j);
+        if( pattern[m-j-1] == 'a' ) {
+            chunk_set_bit((*self)->PEq_R['t'], j); /* t == a */
+        }
+    }
+
+    for (i=0; i<4; i++) {
+        unsigned char acgt = NA2KEY[i];
+        for (j=0; j<plen; j++) {
+            if (na4key_matches(mode, pattern[j], acgt)) {
+                /* bits |= (unsigned long)1<<j; */
+                chunk_set_bit((*self)->PEq[acgt], j);
+                if (mode & AGREP_TEXT_EXPANDED_2NA)
+                    chunk_set_bit((*self)->PEq[i], j);
+            }
+        }
+    }
+    for (i=0; i<4; i++) {
+        unsigned char acgt = NA2KEY[i];
+        for (j=0; j<plen; j++) {
+            if (na4key_matches(mode, pattern[plen-j-1], acgt)) {
+                chunk_set_bit((*self)->PEq_R[acgt], j);
+                if (mode & AGREP_TEXT_EXPANDED_2NA)
+                    chunk_set_bit((*self)->PEq_R[i], j);
+            }
+        }
+    }
+    return 0;
+
+    for (j=0; j<256; j++) {
+        free_chunk((*self)->PEq[j]);
+        free_chunk((*self)->PEq_R[j]);
+    }
+    free(*self);
+    *self = NULL;
+    return rc;
+
+}
+
+
+/* 
+   This finds the first match forward in the string less than or equal
+   the threshold.  If nonzero, this will be a prefix of any exact match.
+*/
+uint32_t MyersUnlimitedFindFirst ( MyersUnlimitedSearch *self, 
+        int32_t threshold, const char* text, size_t n, AgrepMatch *match )
+{
+    const unsigned char *utext = (const unsigned char *)text;
+    CHUNK *Pv;
+    CHUNK *Mv;
+    CHUNK *Xv, *Xh, *Ph, *Mh;
+
+    int32_t m = self->m;
+    int32_t csize = chunksize(m);
+    int32_t Score;
+    int32_t BestScore = m;
+    int32_t from = 0;
+    int32_t to = -1;
+
+    int32_t j;
+
+    CHUNK *Eq;
+
+    Pv = alloc_chunk(csize);
+    Mv = alloc_chunk(csize);
+    Xv = alloc_chunk(csize);
+    Xh = alloc_chunk(csize);
+    Ph = alloc_chunk(csize);
+    Mh = alloc_chunk(csize);
+
+
+    Score = m;
+    chunk_set_minusone(Pv);
+    chunk_zero(Mv);
+    
+    for(j = 0; j < n; j++) {
+#ifdef DEBUG
+        printf("%d j loop\n", j);
+#endif
+        Eq = self->PEq[utext[j]];
+#ifdef DEBUG
+        printf("Eq: "); print_chunk(Eq); printf("\n");
+#endif
+        /* Xv = Eq | Mv; */
+        chunk_set(Xv, Eq);
+        chunk_or_in(Xv, Mv);
+#ifdef DEBUG
+        printf("Xv: "); print_chunk(Xv); printf("\n");
+#endif
+        /* Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq; */
+        chunk_set(Xh, Eq);
+        chunk_and_in(Xh, Pv);
+        chunk_add_in(Xh, Pv);
+        chunk_xor_in(Xh, Pv);
+        chunk_or_in(Xh, Eq);
+#ifdef DEBUG
+        printf("Xh: "); print_chunk(Xh); printf("\n");
+#endif
+        /* Ph = Mv | ~ (Xh | Pv); */
+        chunk_set(Ph, Xh);
+        chunk_or_in(Ph, Pv);
+        chunk_negate(Ph);
+        chunk_or_in(Ph, Mv);
+#ifdef DEBUG
+        printf("Ph: "); print_chunk(Ph); printf("\n");
+#endif
+        /* Mh = Pv & Xh; */
+        chunk_set(Mh, Pv);
+        chunk_and_in(Mh, Xh);
+#ifdef DEBUG
+        printf("Mh: "); print_chunk(Mh); printf("\n");
+#endif
+        /* Ph & (1 << (m - 1)) */
+        if (chunk_isbit_set(Ph, m-1)) {
+            Score++;
+            /* Mh & (1 << (m - 1)) */
+        } else if (chunk_isbit_set(Mh, m-1)) {
+            Score--;
+        }
+        /* Ph <<= 1; */
+        chunk_lshift_one_inplace(Ph);
+#ifdef DEBUG
+        printf("Ph: "); print_chunk(Ph); printf("\n");
+#endif
+        /* Mh <<= 1; */
+        chunk_lshift_one_inplace(Mh);
+#ifdef DEBUG
+        printf("Mh: "); print_chunk(Mh); printf("\n");
+#endif
+        /* Pv = Mh | ~(Xv | Ph); */
+        chunk_set(Pv, Xv);
+        chunk_or_in(Pv, Ph);
+        chunk_negate(Pv);
+        chunk_or_in(Pv, Mh);
+#ifdef DEBUG
+        printf("Pv: "); print_chunk(Pv); printf("\n");
+#endif
+        /* Mv = Ph & Xv; */
+        chunk_set(Mv, Ph);
+        chunk_and_in(Mv, Xv);
+#ifdef DEBUG
+        printf("Mv: "); print_chunk(Mv); printf("\n");
+#endif
+#ifdef DEBUG
+        printf("%3d. score %d\n", j, Score);
+#endif
+        if (Score <= threshold) {
+            BestScore = Score;
+            to = j;
+            break;
+        }
+    }
+
+    /* Continue while score decreases under the threshold */
+    for(j++; j < n; j++) {
+        Eq = self->PEq[utext[j]];
+        /* Xv = Eq | Mv; */
+        chunk_set(Xv, Eq);
+        chunk_or_in(Xv, Mv);
+        /* Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq; */
+        chunk_set(Xh, Eq);
+        chunk_and_in(Xh, Pv);
+        chunk_add_in(Xh, Pv);
+        chunk_xor_in(Xh, Pv);
+        chunk_or_in(Xh, Eq);
+        /* Ph = Mv | ~ (Xh | Pv); */
+        chunk_set(Ph, Xh);
+        chunk_or_in(Ph, Pv);
+        chunk_negate(Ph);
+        chunk_or_in(Ph, Mv);
+        /* Mh = Pv & Xh; */
+        chunk_set(Mh, Pv);
+        chunk_and_in(Mh, Xh);
+        /* Ph & (1 << (m - 1)) */
+        if (chunk_isbit_set(Ph, m-1)) {
+            Score++;
+            /* Mh & (1 << (m - 1)) */
+        } else if (chunk_isbit_set(Mh, m-1)) {
+            Score--;
+        }
+        /* Ph <<= 1; */
+        chunk_lshift_one_inplace(Ph);
+        /* Mh <<= 1; */
+        chunk_lshift_one_inplace(Mh);
+        /* Pv = Mh | ~(Xv | Ph); */
+        chunk_set(Pv, Xv);
+        chunk_or_in(Pv, Ph);
+        chunk_negate(Pv);
+        chunk_or_in(Pv, Mh);
+        /* Mv = Ph & Xv; */
+        chunk_set(Mv, Ph);
+        chunk_and_in(Mv, Xv);
+
+#ifdef DEBUG	
+        printf("%3d. score %d\n", j, Score);
+#endif
+        if (Score < BestScore) {
+            BestScore = Score;
+            to = j;
+        } else {
+            break;
+        }
+    }
+
+    /* Re-initialize for next scan! */
+    Score = m;
+    chunk_set_minusone(Pv);
+    chunk_zero(Mv);
+    
+    for(j = to; j >= 0; j--) {
+        Eq = self->PEq_R[utext[j]]; 	/* This line is different. */
+        /* Xv = Eq | Mv; */
+        chunk_set(Xv, Eq);
+        chunk_or_in(Xv, Mv);
+        /* Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq; */
+        chunk_set(Xh, Eq);
+        chunk_and_in(Xh, Pv);
+        chunk_add_in(Xh, Pv);
+        chunk_xor_in(Xh, Pv);
+        chunk_or_in(Xh, Eq);
+        /* Ph = Mv | ~ (Xh | Pv); */
+        chunk_set(Ph, Xh);
+        chunk_or_in(Ph, Pv);
+        chunk_negate(Ph);
+        chunk_or_in(Ph, Mv);
+        /* Mh = Pv & Xh; */
+        chunk_set(Mh, Pv);
+        chunk_and_in(Mh, Xh);
+        /* Ph & (1 << (m - 1)) */
+        if (chunk_isbit_set(Ph, m-1)) {
+            Score++;
+            /* Mh & (1 << (m - 1)) */
+        } else if (chunk_isbit_set(Mh, m-1)) {
+            Score--;
+        }
+        /* Ph <<= 1; */
+        chunk_lshift_one_inplace(Ph);
+        /* Mh <<= 1; */
+        chunk_lshift_one_inplace(Mh);
+        /* Pv = Mh | ~(Xv | Ph); */
+        chunk_set(Pv, Xv);
+        chunk_or_in(Pv, Ph);
+        chunk_negate(Pv);
+        chunk_or_in(Pv, Mh);
+        /* Mv = Ph & Xv; */
+        chunk_set(Mv, Ph);
+        chunk_and_in(Mv, Xv);
+
+#ifdef DEBUG	
+        printf("%3d. score %d\n", j, Score); 
+#endif
+        if(Score <= BestScore) {
+#ifdef DEBUG	    
+            printf("rev match at position %d\n", j);
+#endif
+            from = j;
+            break;
+        }
+    }
+
+    free_chunk(Pv);
+    free_chunk(Mv);
+    free_chunk(Xv);
+    free_chunk(Xh);
+    free_chunk(Ph);
+    free_chunk(Mh);
+    
+    if (BestScore <= threshold) {
+        match->position = from;
+        match->length = to-from+1;
+        match->score = BestScore;
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+/* 
+   This finds the first match forward in the string less than or equal
+   the threshold.  If nonzero, this will be a prefix of any exact match.
+*/
+void MyersUnlimitedFindAll ( const AgrepCallArgs *args )
+{
+    AgrepFlags mode = args->self->mode;
+    MyersUnlimitedSearch *self = args->self->myersunltd;
+    int32_t threshold = args->threshold;
+    const unsigned char *utext = (const unsigned char *)args->buf;
+    int32_t n = args->buflen;
+    AgrepMatchCallback cb = dp_end_callback;
+    const void *cbinfo = args;
+
+    AgrepMatch match;
+    AgrepContinueFlag cont;
+
+    CHUNK *Pv;
+    CHUNK *Mv;
+    CHUNK *Xv, *Xh, *Ph, *Mh;
+
+    int32_t m = self->m;
+    int32_t csize = chunksize(m);
+    int32_t Score;
+
+    int32_t curscore = 0;
+    int32_t curlast = 0;
+    int32_t continuing = 0;
+
+    int32_t j;
+
+    CHUNK *Eq;
+
+
+
+    Pv = alloc_chunk(csize);
+    Mv = alloc_chunk(csize);
+    Xv = alloc_chunk(csize);
+    Xh = alloc_chunk(csize);
+    Ph = alloc_chunk(csize);
+    Mh = alloc_chunk(csize);
+
+    Score = m;
+    chunk_set_minusone(Pv);
+    chunk_zero(Mv);
+    
+    for(j = 0; j < n; j++) {
+#ifdef DEBUG
+        printf("%d j loop\n", j);
+#endif
+        Eq = self->PEq[utext[j]];
+#ifdef DEBUG
+        printf("Eq: "); print_chunk(Eq); printf("\n");
+#endif
+        /* Xv = Eq | Mv; */
+        chunk_set(Xv, Eq);
+        chunk_or_in(Xv, Mv);
+#ifdef DEBUG
+        printf("Xv: "); print_chunk(Xv); printf("\n");
+#endif
+        /* Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq; */
+        chunk_set(Xh, Eq);
+        chunk_and_in(Xh, Pv);
+        chunk_add_in(Xh, Pv);
+        chunk_xor_in(Xh, Pv);
+        chunk_or_in(Xh, Eq);
+#ifdef DEBUG
+        printf("Xh: "); print_chunk(Xh); printf("\n");
+#endif
+        /* Ph = Mv | ~ (Xh | Pv); */
+        chunk_set(Ph, Xh);
+        chunk_or_in(Ph, Pv);
+        chunk_negate(Ph);
+        chunk_or_in(Ph, Mv);
+#ifdef DEBUG
+        printf("Ph: "); print_chunk(Ph); printf("\n");
+#endif
+        /* Mh = Pv & Xh; */
+        chunk_set(Mh, Pv);
+        chunk_and_in(Mh, Xh);
+#ifdef DEBUG
+        printf("Mh: "); print_chunk(Mh); printf("\n");
+#endif
+        /* Ph & (1 << (m - 1)) */
+        if (chunk_isbit_set(Ph, m-1)) {
+            Score++;
+            /* Mh & (1 << (m - 1)) */
+        } else if (chunk_isbit_set(Mh, m-1)) {
+            Score--;
+        }
+        /* Ph <<= 1; */
+        chunk_lshift_one_inplace(Ph);
+#ifdef DEBUG
+        printf("Ph: "); print_chunk(Ph); printf("\n");
+#endif
+        /* Mh <<= 1; */
+        chunk_lshift_one_inplace(Mh);
+#ifdef DEBUG
+        printf("Mh: "); print_chunk(Mh); printf("\n");
+#endif
+        /* Pv = Mh | ~(Xv | Ph); */
+        chunk_set(Pv, Xv);
+        chunk_or_in(Pv, Ph);
+        chunk_negate(Pv);
+        chunk_or_in(Pv, Mh);
+#ifdef DEBUG
+        printf("Pv: "); print_chunk(Pv); printf("\n");
+#endif
+        /* Mv = Ph & Xv; */
+        chunk_set(Mv, Ph);
+        chunk_and_in(Mv, Xv);
+#ifdef DEBUG
+        printf("Mv: "); print_chunk(Mv); printf("\n");
+#endif
+#ifdef DEBUG
+        printf("%3d. score %d\n", j, Score);
+#endif
+        if (Score <= threshold) {
+            if (continuing) {
+                if (Score < curscore &&
+                    ((mode & AGREP_EXTEND_BETTER) ||
+                     (mode & AGREP_EXTEND_SAME))) {
+                    curscore = Score;
+                    curlast = j;
+                } else if (Score == curscore &&
+                           ((mode & AGREP_EXTEND_BETTER) ||
+                            (mode & AGREP_EXTEND_SAME))) {
+                    if (mode & AGREP_EXTEND_SAME) {
+                        curlast = j;
+                    }
+                } else {
+                    continuing = 0;
+                    match.score = curscore;
+                    match.position = curlast;
+                    match.length = -1;
+                    cont = AGREP_CONTINUE;
+                    (*cb)(cbinfo, &match, &cont);
+                    if (cont != AGREP_CONTINUE)
+                        goto EXIT;
+                }
+            } else if ((mode & AGREP_EXTEND_SAME) ||
+                       (mode & AGREP_EXTEND_BETTER)) {
+                curscore = Score;
+                curlast = j;
+                continuing = 1;
+            } else {
+                match.score = Score;
+                match.position = j;
+                match.length = -1;
+                cont = AGREP_CONTINUE;
+                (*cb)(cbinfo, &match, &cont);
+                if (cont != AGREP_CONTINUE)
+                    goto EXIT;
+            }
+            /* If we're no longer under the threshold, we might
+               have been moving forward looking for a better match 
+            */
+        } else if (continuing) {
+            continuing = 0;
+            match.score = curscore;
+            match.position = curlast;
+            match.length = -1;
+            cont = AGREP_CONTINUE;
+            (*cb)(cbinfo, &match, &cont);
+            if (cont != AGREP_CONTINUE)
+                goto EXIT;
+        }
+        /* print_col_as_row(nxt, plen); */
+    }
+    if (continuing) {
+        continuing = 0;
+        match.score = curscore;
+        match.position = curlast;
+        match.length = -1;
+        (*cb)(cbinfo, &match, &cont);
+    }
+
+EXIT:
+
+    free_chunk(Pv);
+    free_chunk(Mv);
+    free_chunk(Xv);
+    free_chunk(Xh);
+    free_chunk(Ph);
+    free_chunk(Mh);
+}
+
+
+LIB_EXPORT int32_t CC MyersUnlimitedFindBest ( MyersUnlimitedSearch *self,
+        const char* text, size_t n, int32_t *pos, int32_t *len )
+{
+    const unsigned char *utext = (const unsigned char *)text;
+    CHUNK *Pv;
+    CHUNK *Mv;
+    CHUNK *Xv, *Xh, *Ph, *Mh;
+
+    int32_t m = self->m;
+    int32_t csize = chunksize(m);
+    int32_t Score;
+    int32_t BestScore = m;
+    int32_t from = 0;
+    int32_t to = -1;
+
+    int32_t j;
+
+    CHUNK *Eq;
+
+    Pv = alloc_chunk(csize);
+    Mv = alloc_chunk(csize);
+    Xv = alloc_chunk(csize);
+    Xh = alloc_chunk(csize);
+    Ph = alloc_chunk(csize);
+    Mh = alloc_chunk(csize);
+
+
+    Score = m;
+    chunk_set_minusone(Pv);
+    chunk_zero(Mv);
+    
+    for(j = 0; j < n; j++) {
+#ifdef DEBUG
+        printf("%d j loop\n", j);
+#endif
+        Eq = self->PEq[utext[j]];
+#ifdef DEBUG
+        printf("Eq: "); print_chunk(Eq); printf("\n");
+#endif
+        /* Xv = Eq | Mv; */
+        chunk_set(Xv, Eq);
+        chunk_or_in(Xv, Mv);
+#ifdef DEBUG
+        printf("Xv: "); print_chunk(Xv); printf("\n");
+#endif
+        /* Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq; */
+        chunk_set(Xh, Eq);
+        chunk_and_in(Xh, Pv);
+        chunk_add_in(Xh, Pv);
+        chunk_xor_in(Xh, Pv);
+        chunk_or_in(Xh, Eq);
+#ifdef DEBUG
+        printf("Xh: "); print_chunk(Xh); printf("\n");
+#endif
+        /* Ph = Mv | ~ (Xh | Pv); */
+        chunk_set(Ph, Xh);
+        chunk_or_in(Ph, Pv);
+        chunk_negate(Ph);
+        chunk_or_in(Ph, Mv);
+#ifdef DEBUG
+        printf("Ph: "); print_chunk(Ph); printf("\n");
+#endif
+        /* Mh = Pv & Xh; */
+        chunk_set(Mh, Pv);
+        chunk_and_in(Mh, Xh);
+#ifdef DEBUG
+        printf("Mh: "); print_chunk(Mh); printf("\n");
+#endif
+        /* Ph & (1 << (m - 1)) */
+        if (chunk_isbit_set(Ph, m-1)) {
+            Score++;
+            /* Mh & (1 << (m - 1)) */
+        } else if (chunk_isbit_set(Mh, m-1)) {
+            Score--;
+        }
+        /* Ph <<= 1; */
+        chunk_lshift_one_inplace(Ph);
+#ifdef DEBUG
+        printf("Ph: "); print_chunk(Ph); printf("\n");
+#endif
+        /* Mh <<= 1; */
+        chunk_lshift_one_inplace(Mh);
+#ifdef DEBUG
+        printf("Mh: "); print_chunk(Mh); printf("\n");
+#endif
+        /* Pv = Mh | ~(Xv | Ph); */
+        chunk_set(Pv, Xv);
+        chunk_or_in(Pv, Ph);
+        chunk_negate(Pv);
+        chunk_or_in(Pv, Mh);
+#ifdef DEBUG
+        printf("Pv: "); print_chunk(Pv); printf("\n");
+#endif
+        /* Mv = Ph & Xv; */
+        chunk_set(Mv, Ph);
+        chunk_and_in(Mv, Xv);
+#ifdef DEBUG
+        printf("Mv: "); print_chunk(Mv); printf("\n");
+#endif
+#ifdef DEBUG
+        printf("%3d. score %d\n", j, Score);
+#endif
+        if (Score < BestScore) {
+            BestScore = Score;
+            to = j;
+        }
+    }
+
+    /* Re-initialize for next scan! */
+    Score = m;
+    chunk_set_minusone(Pv);
+    chunk_zero(Mv);
+    
+    for(j = to; j >= 0; j--) {
+        Eq = self->PEq_R[utext[j]]; 	/* This line is different. */
+        /* Xv = Eq | Mv; */
+        chunk_set(Xv, Eq);
+        chunk_or_in(Xv, Mv);
+        /* Xh = (((Eq & Pv) + Pv) ^ Pv) | Eq; */
+        chunk_set(Xh, Eq);
+        chunk_and_in(Xh, Pv);
+        chunk_add_in(Xh, Pv);
+        chunk_xor_in(Xh, Pv);
+        chunk_or_in(Xh, Eq);
+        /* Ph = Mv | ~ (Xh | Pv); */
+        chunk_set(Ph, Xh);
+        chunk_or_in(Ph, Pv);
+        chunk_negate(Ph);
+        chunk_or_in(Ph, Mv);
+        /* Mh = Pv & Xh; */
+        chunk_set(Mh, Pv);
+        chunk_and_in(Mh, Xh);
+        /* Ph & (1 << (m - 1)) */
+        if (chunk_isbit_set(Ph, m-1)) {
+            Score++;
+            /* Mh & (1 << (m - 1)) */
+        } else if (chunk_isbit_set(Mh, m-1)) {
+            Score--;
+        }
+        /* Ph <<= 1; */
+        chunk_lshift_one_inplace(Ph);
+        /* Mh <<= 1; */
+        chunk_lshift_one_inplace(Mh);
+        /* Pv = Mh | ~(Xv | Ph); */
+        chunk_set(Pv, Xv);
+        chunk_or_in(Pv, Ph);
+        chunk_negate(Pv);
+        chunk_or_in(Pv, Mh);
+        /* Mv = Ph & Xv; */
+        chunk_set(Mv, Ph);
+        chunk_and_in(Mv, Xv);
+
+#ifdef DEBUG
+        printf("%3d. score %d\n", j, Score); 
+#endif
+        if(Score <= BestScore) {
+#ifdef DEBUG
+            printf("rev match at position %d\n", j);
+#endif
+            from = j;
+            break;
+        }
+    }
+
+    free_chunk(Pv);
+    free_chunk(Mv);
+    free_chunk(Xv);
+    free_chunk(Xh);
+    free_chunk(Ph);
+    free_chunk(Mh);
+    
+    *pos = from;
+    *len = to-from+1;
+
+    return BestScore;
+
+    /* printf("Found [%d,%d]\n", from, to);
+       printf("Found '%.*s'\n", to - from + 1, &text[from]); */
+}
+
diff --git a/libs/search/agrep-wumanber.c b/libs/search/agrep-wumanber.c
new file mode 100644
index 0000000..881b83d
--- /dev/null
+++ b/libs/search/agrep-wumanber.c
@@ -0,0 +1,415 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <search/extern.h>
+#include <compiler.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "search-priv.h"
+
+static
+int32_t debug = 0;
+
+struct AgrepWuParams {
+    unsigned char* pattern;
+    int32_t len;
+    uint64_t alphabits[256];
+    uint64_t r_alphabits[256];
+    int64_t patmask; /* Actually an inverse mask (0's in the pattern positions) */
+};
+
+/* This now computes the alphabits for a 4na pattern. */
+static
+rc_t compute_alphabits_4na(AgrepWuParams *self, AgrepFlags mode)
+{
+    rc_t rc = 0;
+    int32_t i;
+
+    self->patmask = ((uint64_t) -1) << self->len;
+
+    for(i = 0; i < 256; i++) {
+        self->alphabits[i] = self->patmask;
+        self->r_alphabits[i] = self->patmask;
+    }
+    for(i = 0; rc == 0 && i < self->len; i++) {
+        if( (rc = na4_set_bits(mode, self->alphabits, self->pattern[i], (uint64_t)1<<(self->len-i-1))) == 0 ) {
+            rc = na4_set_bits(mode, self->r_alphabits, self->pattern[self->len-i-1], (uint64_t)1<<(self->len-i-1));
+        }
+    }
+    return rc;
+}
+
+static
+void compute_alphabits(AgrepWuParams *self)
+{
+    int32_t i, j;
+    uint64_t bits, patmask;
+
+    patmask = self->patmask = ((uint64_t)-1) << self->len;
+ 
+    /* TBD use AGREP_IGNORE_CASE */
+    for (i=0; i<256; i++) {
+        bits = 0;
+        for (j=0; j<self->len; j++) {
+            if (self->pattern[j] == i) {
+                bits |= (uint64_t)1<<(self->len-j-1);
+            }
+        }
+        self->alphabits[i] = bits | patmask;
+    }
+    for (i=0; i<256; i++) {
+        bits = 0;
+        for (j=0; j<self->len; j++) {
+            if (self->pattern[self->len-j-1] == i) {
+                bits |= (uint64_t)1<<(self->len-j-1);
+            }
+        }
+        self->r_alphabits[i] = bits | patmask;
+    }
+}
+
+rc_t AgrepWuMake( AgrepWuParams **self, AgrepFlags mode, const char *pattern )
+{
+    rc_t rc = 0;
+
+    *self = NULL;
+    if(strlen(pattern) > 63) {
+        rc = RC( rcText, rcString, rcSearching, rcParam, rcExcessive);
+    } else if( (*self = malloc(sizeof(**self))) == NULL ) {
+        rc = RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+    } else {
+        (*self)->pattern = (unsigned char*)strdup(pattern);
+        (*self)->len = strlen(pattern);
+        if( (*self)->pattern == NULL ) {
+            rc = RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+        } else if(mode & AGREP_PATTERN_4NA) {
+            rc = compute_alphabits_4na(*self, mode);
+        } else {
+            compute_alphabits(*self);
+        }
+    }
+    if( rc != 0 ) {
+        AgrepWuFree(*self);
+        *self = NULL;
+    }
+    return rc;
+}
+
+void AgrepWuFree ( AgrepWuParams *self )
+{
+    if( self != NULL ) {
+        free(self->pattern);
+        free(self);
+    }
+}
+
+static
+void callback_with_end( const AgrepCallArgs *args )
+{
+    AgrepFlags mode = args->self->mode;
+    AgrepWuParams *self = args->self->wu;
+    int32_t threshold = args->threshold;
+    unsigned char *buf = (unsigned char *)args->buf;
+    int32_t buflen = args->buflen;
+    AgrepMatchCallback cb = dp_end_callback;
+    const void *cbinfo = args;
+    
+    AgrepMatch match;
+    AgrepContinueFlag cont;
+    int32_t i, k;
+    int64_t *R = malloc(sizeof(int64_t) * (threshold + 1));
+    int64_t *Rnew = malloc(sizeof(int64_t) * (threshold + 1));
+    int64_t *tmp;
+
+    int32_t Score;
+    int32_t curscore = 0;
+    int32_t curlast = 0;
+    int32_t continuing = 0;
+
+    for (k=0; k<=threshold; k++) {
+        R[k] = self->patmask>>k;
+    }
+
+    for (i=0; i<buflen; i++) {
+        /* Not with 2na, you don't! 
+        if (buf[i] == '\0')
+        break; */
+
+        uint64_t bits = self->alphabits[buf[i]];
+        Rnew[0] = (R[0] >> 1) & bits;
+        for (k=1; k<=threshold; k++) {
+            Rnew[k] = ((R[k] >> 1) & bits) | R[k-1]>>1 | Rnew[k-1]>>1 | R[k-1];
+        }
+        Score = -1;
+        for (k=0; k<=threshold; k++) {
+            if (Rnew[k] & 1) {
+                /* Found a match -- report ending position, use DP for backscan */
+                Score = k;
+                break;
+            }
+        }
+        if (Score >= 0) {
+            if (continuing) {
+                if (Score < curscore &&
+                    ((mode & AGREP_EXTEND_BETTER) ||
+                     (mode & AGREP_EXTEND_SAME))) {
+                    curscore = Score;
+                    curlast = i;
+                } else if (Score == curscore &&
+                           ((mode & AGREP_EXTEND_BETTER) ||
+                            (mode & AGREP_EXTEND_SAME))) {
+                    if (mode & AGREP_EXTEND_SAME) {
+                        curlast = i;
+                    }
+                } else {
+                    continuing = 0;
+                    match.score = curscore;
+                    match.position = curlast;
+                    match.length = -1;
+                    cont = AGREP_CONTINUE;
+                    (*cb)(cbinfo, &match, &cont);
+                    if (cont != AGREP_CONTINUE)
+                        goto EXIT;
+                }
+            } else if ((mode & AGREP_EXTEND_SAME) ||
+                       (mode & AGREP_EXTEND_BETTER)) {
+                curscore = Score;
+                curlast = i;
+                continuing = 1;
+            } else {
+                match.score = Score;
+                match.position = i;
+                match.length = -1;
+                cont = AGREP_CONTINUE;
+                (*cb)(cbinfo, &match, &cont);
+                if (cont != AGREP_CONTINUE)
+                    goto EXIT;
+            }
+            /* If we're no longer under the threshold, we might
+               have been moving forward looking for a better match 
+            */
+        } else if (continuing) {
+            continuing = 0;
+            match.score = curscore;
+            match.position = curlast;
+            match.length = -1;
+            cont = AGREP_CONTINUE;
+            (*cb)(cbinfo, &match, &cont);
+            if (cont != AGREP_CONTINUE)
+                goto EXIT;
+        }
+        tmp = R; R = Rnew; Rnew = tmp;
+    }
+    if (continuing) {
+        continuing = 0;
+        match.score = curscore;
+        match.position = curlast;
+        match.length = -1;
+        (*cb)(cbinfo, &match, &cont);
+    }
+EXIT:
+    free(R);
+    free(Rnew);
+}
+
+/* 
+   Returns -1 if no match found, otherwise returns ENDING position.
+*/
+
+static
+int32_t find_end(const AgrepWuParams *self, int32_t threshold, const char *buf, int32_t buflen, int32_t *score)
+{
+    const unsigned char *ubuf = (const unsigned char *)buf;
+    int32_t i, k;
+    int64_t *R = malloc(sizeof(int64_t) * (threshold + 1));
+    int64_t *Rnew = malloc(sizeof(int64_t) * (threshold + 1));
+    int64_t *tmp;
+    int32_t foundit = 0;
+    int32_t found = -1; /* This is the value. */
+    int32_t stillunderthreshold = 0;
+    uint64_t bits;
+
+    *score = threshold;
+
+    for (k=0; k<=threshold; k++) {
+        R[k] = self->patmask>>k;
+    }
+
+    for (i=0; i<buflen; i++) {
+
+        if (buf[i] == '\0')
+            break;
+        bits = self->alphabits[ubuf[i]];
+        Rnew[0] = (R[0] >> 1) & bits;
+        if (Rnew[0] & 1) {
+            /* Exact match */
+            *score = 0;
+            if (debug) {
+                printf("Found end match at position %d\n", i);
+            }
+            free(R);
+            free(Rnew);
+            return i;
+        }
+        stillunderthreshold = 0;
+        for (k=1; k<=threshold; k++) {
+
+            Rnew[k] = ((R[k] >> 1) & bits) | R[k-1]>>1 | Rnew[k-1]>>1 | R[k-1];
+
+            if (Rnew[k] & 1) {
+                stillunderthreshold = 1;
+                /* Approx match */
+                if (k <= *score) {
+                    *score = k;
+                    if (debug) {
+                        printf("Found approx match at position %d\n", i);
+                    }
+                    foundit = 1;
+                    found = i;
+                }
+            }
+        }
+        /* If we're here, we haven't found anything at the threshold we're looking. */
+        if (foundit && !stillunderthreshold) {
+            free(R);
+            free(Rnew);
+            return found;
+        }
+        tmp = R; R = Rnew; Rnew = tmp;
+    }
+    free(R);
+    free(Rnew);
+    if (foundit)
+        return found;
+    return -1;
+}
+
+/*
+We only need to compute up to the score we're searching for.
+
+Returns nonnegative if found, otherwise returns -1.
+*/
+static
+int32_t find_begin(const AgrepWuParams *self, const char *buf, int32_t buflen, int32_t end, int32_t score )
+{
+    const unsigned char *ubuf = (const unsigned char *)buf;
+    int32_t i, k;
+    int64_t *R = malloc(sizeof(int64_t) * (score + 1));
+    int64_t *Rnew = malloc(sizeof(int64_t) * (score + 1));
+    int64_t *tmp;
+    int32_t foundit = 0;
+    int32_t found = -1;
+
+    for (k=0; k<=score; k++) {
+        R[k] = self->patmask>>k;
+    }
+
+    for (i=end; i>=0; i--) {
+
+        uint64_t bits = self->r_alphabits[ubuf[i]];
+        Rnew[0] = (R[0] >> 1) & bits;
+        if (Rnew[0] & 1) {
+            /* Exact match */
+            if (debug) {
+                printf("Found begin match at position %d\n", i);
+            }
+            free(R);
+            free(Rnew);
+            return i;
+        }
+        for (k=1; k<=score; k++) {
+
+            Rnew[k] = ((R[k] >> 1) & bits) | R[k-1]>>1 | Rnew[k-1]>>1 | R[k-1];
+
+            if (Rnew[k] & 1) {
+                /* Approx match */
+                if (debug) {
+                    printf("Found approx begin match at position %d\n", i);
+                }
+                score = k; /* Not sure this has an effect */
+                foundit = 1;
+                found = i;
+                goto CONTINUE;
+            }
+        }
+        /* If we're here, we haven't found anything at the threshold we're looking */
+        if (foundit) {
+            free(R);
+            free(Rnew);
+            return found;
+        }
+    CONTINUE:
+        tmp = R; R = Rnew; Rnew = tmp;
+    }
+    free(R);
+    free(Rnew);
+    if (foundit)
+        return found;
+    return -1;
+}
+
+/* 
+Returns nonzero if found something.
+*/
+uint32_t AgrepWuFindFirst( const AgrepWuParams *self, 
+        int32_t threshold, const char *buf, int32_t buflen, AgrepMatch *match )
+{
+    int32_t end, begin;
+    int32_t score;
+    while (-1 != (end = find_end(self, threshold, buf, buflen, &score))) {
+        begin = find_begin(self, buf, buflen, end, threshold);
+        if (begin < 0) {
+            /* This is some kind of error condition -- when the reverse search
+               goes past the beginning.  I think I wasn't biasing the 
+               reverse search, so a "best" reverse search didn't necessarily 
+               start at the end of the matching sequence. */
+            /* printf("It happened\n"); */
+            begin = end-self->len - threshold;
+            if (begin < 0) {
+                begin = 0;
+            }
+        }
+        match->position = begin;
+        match->length = end - begin + 1;
+        match->score = score;
+        return 1;
+    }
+    return 0;
+}
+
+void AgrepWuFindAll( const AgrepCallArgs *args )
+{
+    callback_with_end( args );
+}
+    
+
diff --git a/libs/search/debug.h b/libs/search/debug.h
new file mode 100644
index 0000000..cbbb709
--- /dev/null
+++ b/libs/search/debug.h
@@ -0,0 +1,43 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_search_debug_
+#define _h_search_debug_
+
+#include <klib/debug.h>
+
+#if _DEBUGGING
+#define SEARCH_DBGF(msg) DBGMSG(DBG_SEARCH, DBG_FLAG(DBG_SEARCH_METHOD), msg)
+#define SEARCH_DBG(fmt, ...) SEARCH_DBGF(("%s:%u: " fmt "\n", __func__, __LINE__, __VA_ARGS__))
+#define SEARCH_DBGERR(rc) SEARCH_DBGF(("%s:%u: %R\n", __func__, __LINE__, rc))
+#define SEARCH_DBGERRP(fmt, rc, ...) SEARCH_DBGF(("%s:%u: %R " fmt "\n", __func__, __LINE__, rc, __VA_ARGS__))
+#else
+#define SEARCH_DBG(fmt, ...) ((void)0)
+#define SEARCH_DBGERR(rc) ((void)0)
+#define SEARCH_DBGERRP(fmt, rc, ...) ((void)0)
+#define SEARCH_DBGF(msg) ((void)0)
+#endif
+
+#endif /* _h_search_debug_ */
diff --git a/libs/search/fgrep-aho.c b/libs/search/fgrep-aho.c
new file mode 100644
index 0000000..9490597
--- /dev/null
+++ b/libs/search/fgrep-aho.c
@@ -0,0 +1,363 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <search/extern.h>
+#include <compiler.h>
+#include <os-native.h>
+#include "search-priv.h"
+#include <sysalloc.h>
+
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+struct FgrepAhoParams {
+    struct trie *trie;
+    int32_t charskips[256];
+    int32_t minlength;
+};
+
+/*
+  Need tries for large alphabets -- maybe based on hashtable
+  of (state, char) pairs.
+  Can build alphabet-indexed trie for small alphabets.
+
+  Given a set of strings we're looking for, we have minlength.
+  We start looking at curpos + minlength.
+*/
+
+static int32_t quiet = 1;
+
+typedef struct out_s {
+    const char *s;
+    int32_t whichpattern;
+    struct out_s *nxt;
+} out_s;
+
+void push_out(out_s **where, const char *out, int32_t whichpattern)
+{
+    out_s *newout = malloc(sizeof(out_s));
+    newout->s = out;
+    newout->whichpattern = whichpattern;
+    newout->nxt = *where;
+    *where = newout;
+}
+    
+static void free_out ( out_s* self )
+{
+    if ( self != NULL )
+    {
+        out_s* next = self -> nxt;
+        free ( self );
+        free_out ( next );
+    }
+}
+
+struct trie {
+    struct trie *next[256];  
+    struct trie *fail; /* New for aho-corasick */
+    out_s *outs;
+    char *debugs;
+    int32_t depth;
+    int32_t hasmatch; /* Has match below here in the trie. */
+};
+
+static
+void print_trie_node(struct trie *self, char *car)
+{
+    out_s *outs;
+    if (!quiet) {
+        printf("%s: %s: outputs ", car, self->debugs);
+        outs = self->outs;
+        while (outs != NULL) {
+            printf("%s ", outs->s);
+            outs = outs->nxt;
+        }
+    }
+}
+
+static
+void free_trie(struct trie *self)
+{
+    int i;
+    for (i=0; i<256; i++) {
+        if (self->next[i] != NULL) {
+            free_trie(self->next[i]);
+            self->next[i] = NULL;
+        }
+    }
+    free_out ( self -> outs );
+    free ( self -> debugs );
+    free ( self );
+}
+
+static
+void print_trie(struct trie *self, char *car) 
+{
+    int32_t i;
+    char buf[2];
+    if (!quiet) {
+        for (i=0; i<self->depth; i++) 
+            printf(" ");
+        print_trie_node(self, car);
+        for (i=0; i<256; i++) {
+            if (self->next[i] != NULL) {
+                buf[0] = i;
+                buf[1] = '\0';
+                print_trie(self->next[i], buf);
+            }
+        }
+    }
+}
+
+static
+void trie_enter(struct trie *self, int32_t whichpattern, const char *s, int32_t minlen)
+{
+    struct trie *cur = self;
+    struct trie *newone = NULL;
+    int32_t len;
+    int32_t i;
+    len = strlen(s);
+    for (i=0; i<len; i++) {
+        unsigned char c = (unsigned char)s[i];
+        if (NULL != cur->next[c]) {
+            cur->hasmatch = 1;
+            cur = cur->next[c];
+        } else {
+            newone = (struct trie *)malloc(sizeof(struct trie));
+            newone->fail = NULL;
+            newone->outs = NULL;
+            newone->debugs = create_substring(s, i+1);
+            newone->depth = i+1;
+            newone->hasmatch = 1;
+            memset( newone->next, 0, sizeof( newone->next ) );
+            cur->next[c] = newone;
+            cur = newone;
+        }
+    }
+    push_out(&cur->outs, s, whichpattern);
+}
+
+static
+void trie_calc_failure_links(struct trie *self)
+{
+    struct queue_s {
+        struct trie *trie;
+        struct queue_s *nxt;
+    };
+    struct queue_s *queue = NULL;
+    struct queue_s *queueend = NULL;
+    struct queue_s *newq, *tmpqueue;
+    struct trie *r, *u, *v;
+    struct trie *trie;
+    int32_t i;
+    out_s *outs;
+
+    for (i = 0; i<256; i++) {
+        if ((trie = self->next[i]) != NULL) {
+            trie->fail = self;
+            newq = malloc(sizeof(struct queue_s));
+            newq->nxt = NULL;
+            newq->trie = trie;
+            if (queueend != NULL) {
+                queueend->nxt = newq;
+                queueend = newq;
+            } else {
+                queue = queueend = newq;
+            }
+        }
+    }
+    while (queue != NULL) {
+        r = queue->trie;
+        tmpqueue = queue;
+        queue = queue->nxt;
+        free(tmpqueue);
+        if (queueend == tmpqueue) {
+            queueend = NULL;
+        }
+
+        if (r == NULL) {
+            printf("It happened.\n");
+            continue;
+        }
+        
+        for (i = 0; i<256; i++) {
+            if ((u = r->next[i]) != NULL) {            
+                newq = malloc(sizeof(struct queue_s));
+                newq->trie = u;
+                newq->nxt = NULL;
+                if (queueend != NULL) {
+                    queueend->nxt = newq;
+                    queueend = newq;
+                } else {
+                    queue = queueend = newq;
+                }
+                /* Not sure about this stuff here. */
+                v = r->fail;
+                while (v != NULL && v->next[i] == NULL) {
+                    v = v->fail;
+                }
+                if (v != NULL && v->next[i] != NULL) {
+                    u->fail = v->next[i];
+                } else {
+                    u->fail = self;
+                }
+                outs = u->fail->outs;
+                while (outs != NULL) {
+                    push_out(&trie->outs, outs->s, outs->whichpattern);
+                    outs = outs->nxt;
+                }
+            }
+        }
+    }
+}
+
+static 
+void buildtrie(struct trie **self, const char *strings[], int32_t numstrings)
+{
+    int32_t i;
+    int32_t minlen = 1000000;
+    int32_t len;
+
+    for (i=0; i<numstrings; i++) {
+        len = strlen(strings[i]);
+        if (len < minlen) {
+            minlen = len;
+        }
+    }
+    
+    *self = (struct trie *)malloc(sizeof(struct trie));
+    for (i=0; i<256; i++) {
+        (*self)->next[i] = NULL;
+    }
+    (*self)->fail = NULL;
+    (*self)->outs = NULL;
+    (*self)->debugs = NULL;
+    (*self)->depth = 0;
+    (*self)->hasmatch = 0;
+  
+    for (i=0; i<numstrings; i++) {
+        trie_enter(*self, i, strings[i], minlen);
+    }
+    trie_calc_failure_links(*self);
+}
+
+void FgrepAhoFree( FgrepAhoParams *self )
+{
+    free_trie(self->trie);
+    free(self);
+}
+
+void FgrepAhoMake ( FgrepAhoParams **self,
+        const char *strings[], uint32_t numstrings )
+{
+    int32_t i;
+    struct trie *trie;
+    int32_t len;
+    buildtrie(&trie, strings, numstrings);
+    if (!quiet) {
+        print_trie(trie, "");
+    }
+    *self = (FgrepAhoParams *)malloc(sizeof(FgrepAhoParams));
+    (*self)->trie = trie;
+    (*self)->minlength = 10000;
+    for (i=0; i<numstrings; i++) {
+        len = strlen(strings[i]);
+        if (len < (*self)->minlength) {
+            (*self)->minlength = len;
+        }
+    }
+}
+
+
+/* 
+Returns nonzero when found something.
+*/  
+uint32_t FgrepAhoFindFirst ( FgrepAhoParams *self,
+        const char *buf, size_t len, FgrepMatch *match )
+{
+    unsigned char *ubuf = (unsigned char *)buf;
+    struct trie *trie;
+    struct trie *newtrie;
+    
+    unsigned char nxt;
+    int32_t mend = 0;
+    
+    trie = self->trie;
+    while (mend < len) {
+        nxt = ubuf[mend++];
+        newtrie = trie->next[nxt];
+        if (newtrie == NULL) {
+            newtrie = trie->fail;
+            mend--;
+        }
+        if (newtrie == NULL) {
+            trie = self->trie;
+            mend++;
+        } else if (newtrie->outs != NULL) {
+            match->position = mend - newtrie->depth;
+            match->length = newtrie->depth;
+            match->whichpattern = newtrie->outs->whichpattern;
+            return 1;
+        } else {
+            trie = newtrie;
+        }
+    }
+    return 0;
+}
+
+int32_t FgrepAhoFindAll ( FgrepAhoParams *self,
+    char *buf, int32_t len, int32_t *whichpattern )
+{
+    unsigned char *ubuf = (unsigned char *)buf;
+    struct trie *trie;
+    struct trie *newtrie;
+
+    unsigned char nxt;
+    int32_t mend = 0;
+    
+    trie = self->trie;
+    while (mend < len) {
+        nxt = ubuf[mend++];
+        newtrie = trie->next[nxt];
+        if (newtrie == NULL) {
+            newtrie = trie->fail;
+            mend--;
+        }
+        if (newtrie == NULL) {
+            trie = self->trie;
+            mend++;
+        } else if (newtrie->outs != NULL) {
+            *whichpattern = newtrie->outs->whichpattern;
+            return mend - newtrie->depth;
+        } else {
+            trie = newtrie;
+        }
+    }
+    return -1;
+}
diff --git a/libs/search/fgrep-boyermoore.c b/libs/search/fgrep-boyermoore.c
new file mode 100644
index 0000000..0d0fa2a
--- /dev/null
+++ b/libs/search/fgrep-boyermoore.c
@@ -0,0 +1,462 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <search/extern.h>
+#include <compiler.h>
+#include <os-native.h>
+#include "search-priv.h"
+#include <sysalloc.h>
+
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/*
+  Need tries for large alphabets -- maybe based on hashtable
+  of (state, char) pairs.
+  Can build alphabet-indexed trie for small alphabets.
+
+  Given a set of strings we're looking for, we have minlength.
+  We start looking at curpos + minlength.
+*/
+
+static
+char *reverse_string(const char *s) 
+{
+    int32_t len = strlen(s);
+    char *ret = malloc(len+1);
+    char *rp = ret;
+    const char *src = s+len;
+    while (--src >= s) {
+        *rp++ = *src;
+    }
+    *rp = '\0';
+    return ret;
+}
+
+
+struct trie {
+    struct trie *next[256];
+    char *s;
+#ifdef DEBUG
+    char *debugs;
+#endif
+    int32_t whichpattern;
+    int32_t depth;
+    int32_t hasmatch; /* Has match below here in the trie. */
+    /*
+      Used to be called "contained".  Basically we have a pattern that
+      has been matched in the text, so we either need to contain this,
+      or use a suffix of this as a prefix of our pattern.
+
+      Any prospective pattern must either have its prefix here,
+      or contain what we've seen.
+      Note: this will be less than the skip below.
+    */
+    int32_t minskip_matched; 
+
+    /* 
+       The pattern contained unmatched chars.  This used to be called prefix.
+       Basically we have some unmatched characters, so it doesn't help to 
+       contain this pattern, we need to start our string using some suffix
+       of this pattern.  Note: the whole pattern could start a match.
+
+       Any prospective pattern must have its prefix match a suffix of this.
+    */
+    int32_t minskip_unmatched; 
+};
+
+#ifdef DEBUG
+
+static
+void print_trie_node(struct trie *self, char *car)
+{
+    printf("%s: %s: %s hasmatch %d matched %d unmatched %d\n",
+           car, self->debugs, self->s, self->hasmatch, self->minskip_matched, self->minskip_unmatched);
+}
+
+static
+void print_trie(struct trie *self, char *car) 
+{
+    int32_t i;
+    char buf[2];
+    for (i=0; i<self->depth; i++) 
+        printf(" ");
+    print_trie_node(self, car);
+    for (i=0; i<256; i++) {
+        if (self->next[i] != NULL) {
+            buf[0] = i;
+            buf[1] = '\0';
+            print_trie(self->next[i], buf);
+        }
+    }
+}
+
+#endif /* DEBUG */
+
+
+static
+void free_trie(struct trie *self)
+{
+    int i;
+    for (i=0; i<256; i++) {
+        if (self->next[i] != NULL) {
+            free_trie(self->next[i]);
+            self->next[i] = NULL;
+        }
+    }
+    free(self);
+}
+
+
+static
+void trie_enter(struct trie *self, int32_t whichpattern, char *s, int32_t minlen)
+{
+    struct trie *cur = self;
+    struct trie *newone = NULL;
+    int32_t len;
+    int32_t i;
+    len = strlen(s);
+    for (i=0; i<len; i++) {
+        unsigned char c = (unsigned char)s[i];
+        if (NULL != cur->next[c]) {
+            cur->hasmatch = 1;
+            cur = cur->next[c];
+        } else {
+            newone = (struct trie *)malloc(sizeof(struct trie));
+            newone->s = NULL;
+#ifdef DEBUG
+            newone->debugs = create_substring(s, i+1);
+#endif
+            newone->depth = i+1;
+            newone->hasmatch = 1;
+            newone->minskip_matched = minlen;
+            newone->minskip_unmatched = minlen;
+            memset( newone->next, 0, sizeof( newone->next ) );
+            cur->next[c] = newone;
+            cur = newone;
+        }
+    }
+    cur->whichpattern = whichpattern;
+    cur->s = s;
+}
+
+static
+void trie_enter_suffixes(struct trie *self, char *s, int32_t minlen)
+{
+    struct trie *cur;
+    struct trie *newone;
+    int32_t suf;
+    int32_t i;
+    int32_t len;
+    len = strlen(s);
+    for (suf = 1; suf<len; suf++) {
+        cur = self;
+        for (i=0; suf+i<len; i++) {
+            unsigned char c = s[suf+i];
+            if (NULL != cur->next[c]) {
+                cur = cur->next[c];
+#ifdef NOPE
+                if (!cur->hasmatch)
+                    break;
+#endif
+            } else {
+                newone = (struct trie *)malloc(sizeof(struct trie));
+                newone->s = NULL;
+#ifdef DEBUG
+                newone->debugs = create_substring(s+suf, i+1);
+#endif
+                newone->depth = i+1;
+                newone->hasmatch = 0;
+                newone->minskip_matched = suf;
+                newone->minskip_unmatched = minlen;
+                memset( newone->next, 0, sizeof( newone->next ) );
+                cur->next[c] = newone;
+                cur = newone;
+            }
+        }
+    }
+}
+
+
+/* This recurses down the trie and sets the prefix_skip
+   based upon what's computer in trie_set_minskip for the prefix skip.
+*/
+static
+void trie_recurse_prefix_minskip(struct trie *trie, int32_t skip) 
+{
+    int32_t i;
+    if (skip < trie->minskip_unmatched) {
+#ifdef DEBUG
+        if (trie->debugs == NULL) {
+            fprintf(stderr, "Setting minskip prefix unmatched of (something) to %d\n", skip);
+        } else {
+            fprintf(stderr, "Setting minskip prefix unmatched of %s to %d\n", trie->debugs, skip);
+        }
+#endif
+        trie->minskip_unmatched = skip;
+    }
+    if (skip < trie->minskip_matched) {
+#ifdef DEBUG
+        if (trie->debugs == NULL) {
+            fprintf(stderr, "Setting minskip prefix matched of (something) to %d\n", skip);
+        } else {
+            fprintf(stderr, "Setting minskip prefix matched of %s to %d\n", trie->debugs, skip);
+        }
+#endif
+        trie->minskip_matched = skip;
+    }
+    for (i=0; i<256; i++) {
+        if (trie->next[i] != NULL) {
+            trie_recurse_prefix_minskip(trie->next[i], skip);
+        }
+    }
+}
+
+static
+void trie_set_minskip(struct trie *trie, const char *s, const char *rs)
+{
+    unsigned char *urs = (unsigned char *)rs;
+    unsigned char *us = (unsigned char *)s;
+    struct trie *cur;
+    int32_t len;
+    int32_t i;
+    int32_t skip;
+    char buf[1024];
+    int32_t prefix;
+    len = strlen(rs);
+    for (skip=1; skip<len; skip++) {
+        cur = trie->next[urs[skip]];
+        for (i=1; i<len-skip && cur != NULL; i++) {
+            if (skip < cur->minskip_matched) {
+                strncpy(buf, rs+skip, i);
+                buf[i] = '\0';
+#ifdef DEBUG
+                fprintf(stderr, "Setting minskip contained of %s to %d\n", buf, skip);
+#endif                    
+                cur->minskip_matched = skip;
+            }
+            cur = cur->next[urs[skip+i]];
+        }
+    }
+    /* Now we need to set up minskip_prefix --
+       We need to walk down the tree from any prefix of our word,
+       and set the minskip_prefix based upon (wordlen-prefix).
+       Note: non-empty prefixes, so start at 1.
+    */
+    for (prefix = 1; prefix<len; prefix++) {
+        skip = len - prefix;
+        cur = trie;
+        for (i=prefix-1; i>=0 && cur != NULL; i--) {
+            cur = cur->next[us[i]];
+        }
+        if (cur != NULL) {
+#ifdef DEBUG
+            fprintf(stderr, "Setting minskip to at most %d in:\n", skip);
+            print_trie_node(cur, s);
+#endif            
+            trie_recurse_prefix_minskip(cur, skip);
+        }
+    }
+}
+
+static    
+void buildreversetrie(struct trie **self, const char *strings[], int32_t numstrings)
+{
+    int32_t i;
+    int32_t minlen = 1000000;
+    int32_t len;
+    char *reversestrings[10000];
+
+    for (i=0; i<numstrings; i++) {
+        len = strlen(strings[i]);
+        if (len < minlen) {
+            minlen = len;
+        }
+    }
+
+    *self = (struct trie *)malloc(sizeof(struct trie));
+    for (i=0; i<256; i++) {
+        (*self)->next[i] = NULL;
+    }
+    (*self)->s = NULL;
+  
+    for (i=0; i<numstrings; i++) {
+        reversestrings[i] = reverse_string(strings[i]);
+    }
+    for (i=0; i<numstrings; i++) {
+        trie_enter(*self, i, reversestrings[i], minlen);
+    }
+    for (i=0; i<numstrings; i++) {
+        trie_enter_suffixes(*self, reversestrings[i], minlen);
+    }
+    for (i=0; i<numstrings; i++) {
+        trie_set_minskip(*self, strings[i], reversestrings[i]);
+    }
+    (*self)->minskip_matched = 1;
+    (*self)->minskip_unmatched = minlen;
+    
+    for (i=0; i<numstrings; i++) {
+        free ( reversestrings [ i ] );
+    }
+}
+
+
+
+struct FgrepBoyerParams {
+    struct trie *trie;
+    int32_t charskips[256];
+    int32_t minlength;
+};
+
+
+void FgrepBoyerSearchFree( FgrepBoyerParams *self )
+{
+    free_trie(self->trie);
+    free(self);
+}
+
+
+void FgrepBoyerSearchMake ( FgrepBoyerParams **self,
+        const char *strings[], uint32_t numstrings )
+{
+    int32_t i;
+    struct trie *trie;
+    int32_t len;
+    buildreversetrie(&trie, strings, numstrings);
+#ifdef DEBUG
+    print_trie(trie, "");
+#endif
+    *self = (FgrepBoyerParams *)malloc(sizeof(FgrepBoyerParams));
+    (*self)->trie = trie;
+    (*self)->minlength = 10000;
+    for (i=0; i<numstrings; i++) {
+        len = strlen(strings[i]);
+        if (len < (*self)->minlength) {
+            (*self)->minlength = len;
+        }
+    }
+}
+
+/*
+  Currently implementing for bytes.
+  Returns non-negative if found, -1 if not.
+*/
+uint32_t FgrepBoyerFindFirst ( FgrepBoyerParams *self,
+        const char *buf, size_t len, FgrepMatch *match )
+{
+    unsigned char *ubuf = (unsigned char *)buf;
+    struct trie *trie;
+    struct trie *newtrie;
+    unsigned char *p = ubuf;
+    unsigned char *startp;
+    unsigned char *endp = ubuf+len;
+    int32_t skips = 0;
+
+    /* fprintf(stderr, "Searching %10s... for %d chars\n", buf, len); */
+    p = ubuf + self->minlength;
+    while (1) {
+        if (p >= endp)
+            break;
+        startp = p;
+        trie = self->trie;
+    CONT:
+        if (NULL == (newtrie = trie->next[*--p])) {
+            p = startp + trie->minskip_unmatched;
+            skips += trie->minskip_unmatched;
+            continue;
+        }
+        if (!newtrie->hasmatch) {
+            while (newtrie) {
+                trie = newtrie;
+                newtrie = newtrie->next[*--p];
+            }
+            p = startp + trie->minskip_unmatched;
+            skips += trie->minskip_unmatched;
+            continue;
+        }
+        if (newtrie->s != NULL) {
+            match->position = p - ubuf;
+            match->length = newtrie->depth;
+            match->whichpattern = newtrie->whichpattern;
+            return 1;
+        }
+        trie = newtrie;
+        goto CONT;
+    }
+    return 0;
+}
+
+void FgrepBoyerFindAll ( FgrepBoyerParams *self,
+        char *buf, int32_t len, FgrepMatchCallback cb, void *cbinfo )
+{
+    unsigned char *ubuf = (unsigned char *)buf;
+    struct trie *trie;
+    struct trie *newtrie;
+    unsigned char *p = ubuf;
+    unsigned char *startp;
+    unsigned char *endp = ubuf+len;
+    int32_t skips = 0;
+    FgrepContinueFlag cont;
+    FgrepMatch match;
+
+    /* fprintf(stderr, "Searching %10s... for %d chars\n", buf, len); */
+    p = ubuf + self->minlength;
+    while (1) {
+        if (p >= endp)
+            break;
+        startp = p;
+        trie = self->trie;
+    CONT:
+        if (NULL == (newtrie = trie->next[*--p])) {
+            p = startp + trie->minskip_unmatched;
+            skips += trie->minskip_unmatched;
+            continue;
+        }
+        if (!newtrie->hasmatch) {
+            while (newtrie) {
+                trie = newtrie;
+                newtrie = newtrie->next[*--p];
+            }
+            p = startp + trie->minskip_unmatched;
+            skips += trie->minskip_unmatched;
+            continue;
+        }
+        if (newtrie->s != NULL) {
+            cont = FGREP_CONTINUE;
+            match.position = p - ubuf;
+            match.length = newtrie->depth;
+            match.whichpattern = newtrie->whichpattern;
+            (*cb)(cbinfo, &match, &cont);
+            if (cont != FGREP_CONTINUE)
+                return;
+        }
+        trie = newtrie;
+        goto CONT;
+    }
+}
diff --git a/libs/search/fgrep-dumb.c b/libs/search/fgrep-dumb.c
new file mode 100644
index 0000000..ef546eb
--- /dev/null
+++ b/libs/search/fgrep-dumb.c
@@ -0,0 +1,326 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <search/extern.h>
+#include <compiler.h>
+#include <os-native.h>
+#include "search-priv.h"
+#include <sysalloc.h>
+
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/*
+  Need tries for large alphabets -- maybe based on hashtable
+  of (state, char) pairs.
+  Can build alphabet-indexed trie for small alphabets.
+
+  Given a set of strings we're looking for, we have minlength.
+  We start looking at curpos + minlength.
+*/
+
+struct trie {
+    struct trie *next[256];
+    const char *s;
+#ifdef DEBUG
+    char *debugs;
+#endif
+    int32_t whichpattern;
+    int32_t depth;
+    int32_t hasmatch; /* Has match below here in the trie. */
+};
+
+struct FgrepDumbParams {
+    struct trie *trie;
+};
+
+
+#ifdef DEBUG
+
+static
+void print_trie_node(struct trie *self, char *car)
+{
+    printf("%s: %s: %s hasmatch %d\n",
+           car, self->debugs, self->s, 0);
+}
+
+static
+void print_trie(struct trie *self, char *car) 
+{
+    int32_t i;
+    char buf[2];
+    for (i=0; i<self->depth; i++) 
+        printf(" ");
+    print_trie_node(self, car);
+    for (i=0; i<256; i++) {
+        if (self->next[i] != NULL) {
+            buf[0] = i;
+            buf[1] = '\0';
+            print_trie(self->next[i], buf);
+        }
+    }
+}
+
+#endif /* DEBUG */
+
+static
+void free_trie(struct trie *self)
+{
+    int i;
+    for (i=0; i<256; i++) {
+        if (self->next[i] != NULL) {
+            free_trie(self->next[i]);
+            self->next[i] = NULL;
+        }
+    }
+    free(self);
+}
+
+static
+void trie_enter(struct trie *self, const char *s, int32_t minlen)
+{
+    struct trie *cur = self;
+    struct trie *newone = NULL;
+    int32_t len;
+    int32_t i;
+    len = strlen(s);
+    for (i=0; i<len; i++) {
+        unsigned char c = s[i];
+        if (NULL != cur->next[c]) {
+            cur->hasmatch = 1;
+            cur = cur->next[c];
+        } else {
+            newone = (struct trie *)malloc(sizeof(struct trie));
+            newone->s = NULL;
+#ifdef DEBUG
+            newone->debugs = create_substring(s, i+1);
+#endif
+            newone->depth = i+1;
+            newone->hasmatch = 1;
+            memset( newone->next, 0, sizeof( newone->next ) );
+            cur->next[c] = newone;
+            cur = newone;
+        }
+    }
+    cur->s = s;
+}
+
+
+static
+void buildtrie(struct trie **self, const char *strings[], int32_t numstrings)
+{
+    int32_t i;
+    int32_t minlen = 1000000;
+    int32_t len;
+
+    for (i=0; i<numstrings; i++) {
+        len = strlen(strings[i]);
+        if (len < minlen) {
+            minlen = len;
+        }
+    }
+
+    *self = (struct trie *)malloc(sizeof(struct trie));
+    for (i=0; i<256; i++) {
+        (*self)->next[i] = NULL;
+    }
+    (*self)->s = NULL;
+  
+    for (i=0; i<numstrings; i++) {
+        trie_enter(*self, strings[i], minlen);
+    }
+}
+
+void FgrepDumbSearchFree( FgrepDumbParams *self )
+{
+    free_trie(self->trie);
+    free(self);
+}
+
+void FgrepDumbSearchMake( FgrepDumbParams **self,
+        const char *strings[], uint32_t numstrings )
+{
+    /* int32_t i; */
+    struct trie *trie;
+    /* int32_t len; */
+    buildtrie(&trie, strings, numstrings);
+    *self = (FgrepDumbParams *)malloc(sizeof(FgrepDumbParams));
+    (*self)->trie = trie;
+    /* for (i=0; i<numstrings; i++) {
+        len = strlen(strings[i]);
+    } */
+}
+
+uint32_t FgrepDumbFindFirst( FgrepDumbParams *self,
+        const char *buf, size_t len, FgrepMatch *match )
+{
+    struct trie *trie;
+    struct trie *newtrie;
+    unsigned char *p = (unsigned char *)buf;
+    unsigned char *startp;
+    unsigned char *endp = (unsigned char *)buf+len;
+
+    for (startp = (unsigned char *)buf; startp < endp; startp++) {
+        p = startp;
+        trie = self->trie;
+        while (p < endp) {
+            newtrie = trie->next[*p++];
+            if (newtrie == NULL) {
+                break;
+            }
+            trie = newtrie;
+            if (trie->s != NULL) {
+                match->position = startp-(unsigned char *)buf;
+                match->length = trie->depth;
+                match->whichpattern = trie->whichpattern;
+                return 1;
+            }
+        }
+    }
+    return 0;
+}
+
+void FgrepDumbFindAll ( FgrepDumbParams *self,
+        char *buf, int32_t len, FgrepMatchCallback cb, void *cbinfo )
+{
+    unsigned char *ubuf = (unsigned char *)buf;
+    struct trie *trie;
+    struct trie *newtrie;
+    unsigned char *p = ubuf;
+    unsigned char *startp;
+    unsigned char *endp = ubuf+len;
+    FgrepContinueFlag cont;
+    FgrepMatch match;
+
+    for (startp = ubuf; startp < endp; startp++) {
+        p = startp;
+        trie = self->trie;
+        while (p < endp) {
+            newtrie = trie->next[*p++];
+            if (newtrie == NULL) {
+                break;
+            }
+            trie = newtrie;
+            if (trie->s != NULL) {
+                cont = FGREP_CONTINUE;
+                match.position = startp-ubuf;
+                match.length = trie->depth;
+                match.whichpattern = trie->whichpattern;
+                (*cb)(cbinfo, &match, &cont);
+                if (cont != FGREP_CONTINUE)
+                    return;
+            }
+        }
+    }
+}
+
+
+/* Try the longest match first. */
+LIB_EXPORT uint32_t CC has_left_exact_match( char *pattern, char *buf, size_t buflen, 
+                              int32_t *length )
+{
+    int32_t plen = strlen(pattern);
+    int32_t i, j;
+
+    /* Added bounds checking -- untested */
+    int32_t bound = plen;
+    if (buflen < bound)
+        bound = buflen;
+    
+    for (i=bound; i>=1; i--) {
+        for (j=0; j<i; j++) {
+            if (pattern[plen-i+j] != buf[j] &&
+                buf[j] != 'N')
+                goto CONT;
+        }
+        /* Found a match */
+        *length = i;
+        return 1;
+    CONT: {}
+    }
+    return 0;
+}
+
+LIB_EXPORT uint32_t CC has_right_exact_match( char *pattern, char *buf, size_t buflen, 
+                               int32_t *bestpos )
+{
+    int32_t plen = strlen(pattern);
+    int32_t bound = plen;
+    int32_t i, j;
+
+    if (buflen <= 0)
+        return 0;
+
+    if (buflen < bound) 
+        bound = buflen;
+
+    /* i is here the length of the prefix */
+    for (i=bound; i>=1; i--) {
+        for (j=0; j<i; j++) {
+            if (pattern[j] != buf[buflen-i+j] &&
+                buf[buflen-i+j] != 'N')
+                goto CONT;
+        }
+        /* Found a match */
+        *bestpos = buflen-i;
+        return 1;
+    CONT: {}
+    }
+    return 0;
+}
+
+
+/* Try the longest match first. */
+/* Used to assume that the text to be matched was at least as long as 
+the pattern.  No more. 
+*/
+LIB_EXPORT uint32_t CC has_inside_exact_match( char *pattern, char *buf, size_t buflen, 
+                                int32_t *skip )
+{
+    int32_t plen = strlen(pattern);
+    int32_t i, j;
+
+    if (buflen <= 0)
+        return 0;
+
+    /* i is here the start in the pattern */
+    for (i=1; i<=plen; i++) {
+        for (j=0; j<buflen; j++) {
+            if (pattern[i+j] != buf[j] &&
+                buf[j] != 'N')
+                goto CONT;
+        }
+        /* Found a match */
+        *skip = i;
+        return 1;
+    CONT: {}
+    }
+    return 0;
+}
+
diff --git a/libs/search/nucstrstr.c b/libs/search/nucstrstr.c
new file mode 100644
index 0000000..bef516c
--- /dev/null
+++ b/libs/search/nucstrstr.c
@@ -0,0 +1,4621 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <search/extern.h>
+#include <search/nucstrstr.h>
+#include <arch-impl.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <errno.h>
+#include <assert.h>
+#include <stdio.h>
+#include <byteswap.h>
+
+#define TRACE_OPERATIONS 0
+#define TRACE_PARSE 1
+#define TRACE_HEADER 1
+#define TRACE_RESULT 1
+#define TRACE_PATMASK 1
+
+#if __INTEL_COMPILER || defined __SSE2__
+
+#include <emmintrin.h>
+#define NEVER_MATCH 0
+#define RETURN_LOCATION 1
+#define USE_MEMALIGN 0
+
+#endif
+
+#if USE_MEMALIGN
+#include <malloc.h>
+#endif
+
+#define RELOAD_BUFFER 1
+#define NA2_LIMIT 61
+#define NA4_LIMIT 29
+typedef __m128i nucreg_t;
+typedef union
+{
+    uint8_t b [ 16 ];
+    uint16_t w [ 8 ];
+    uint32_t i [ 4 ];
+    uint64_t l [ 2 ];
+    uint128_t s;
+} nucpat_t;
+
+
+
+static int8_t fasta_2na_map [ 128 ];
+static int8_t fasta_4na_map [ 128 ];
+static uint16_t expand_2na [ 256 ] =
+   /* AAAA    AAAC    AAAG    AAAT    AACA    AACC    AACG    AACT */
+{   0x1111, 0x1112, 0x1114, 0x1118, 0x1121, 0x1122, 0x1124, 0x1128,
+   /* AAGA    AAGC    AAGG    AAGT    AATA    AATC    AATG    AATT */
+    0x1141, 0x1142, 0x1144, 0x1148, 0x1181, 0x1182, 0x1184, 0x1188,
+   /* ACAA    ACAC    ACAG    ACAT    ACCA    ACCC    ACCG    ACCT */
+    0x1211, 0x1212, 0x1214, 0x1218, 0x1221, 0x1222, 0x1224, 0x1228,
+   /* ACGA    ACGC    ACGG    ACGT    ACTA    ACTC    ACTG    ACTT */
+    0x1241, 0x1242, 0x1244, 0x1248, 0x1281, 0x1282, 0x1284, 0x1288,
+   /* AGAA    AGAC    AGAG    AGAT    AGCA    AGCC    AGCG    AGCT */
+    0x1411, 0x1412, 0x1414, 0x1418, 0x1421, 0x1422, 0x1424, 0x1428,
+   /* AGGA    AGGC    AGGG    AGGT    AGTA    AGTC    AGTG    AGTT */
+    0x1441, 0x1442, 0x1444, 0x1448, 0x1481, 0x1482, 0x1484, 0x1488,
+   /* ATAA    ATAC    ATAG    ATAT    ATCA    ATCC    ATCG    ATCT */
+    0x1811, 0x1812, 0x1814, 0x1818, 0x1821, 0x1822, 0x1824, 0x1828,
+   /* ATGA    ATGC    ATGG    ATGT    ATTA    ATTC    ATTG    ATTT */
+    0x1841, 0x1842, 0x1844, 0x1848, 0x1881, 0x1882, 0x1884, 0x1888,
+   /* CAAA    CAAC    CAAG    CAAT    CACA    CACC    CACG    CACT */
+    0x2111, 0x2112, 0x2114, 0x2118, 0x2121, 0x2122, 0x2124, 0x2128,
+   /* CAGA    CAGC    CAGG    CAGT    CATA    CATC    CATG    CATT */
+    0x2141, 0x2142, 0x2144, 0x2148, 0x2181, 0x2182, 0x2184, 0x2188,
+   /* CCAA    CCAC    CCAG    CCAT    CCCA    CCCC    CCCG    CCCT */
+    0x2211, 0x2212, 0x2214, 0x2218, 0x2221, 0x2222, 0x2224, 0x2228,
+   /* CCGA    CCGC    CCGG    CCGT    CCTA    CCTC    CCTG    CCTT */
+    0x2241, 0x2242, 0x2244, 0x2248, 0x2281, 0x2282, 0x2284, 0x2288,
+   /* CGAA    CGAC    CGAG    CGAT    CGCA    CGCC    CGCG    CGCT */
+    0x2411, 0x2412, 0x2414, 0x2418, 0x2421, 0x2422, 0x2424, 0x2428,
+   /* CGGA    CGGC    CGGG    CGGT    CGTA    CGTC    CGTG    CGTT */
+    0x2441, 0x2442, 0x2444, 0x2448, 0x2481, 0x2482, 0x2484, 0x2488,
+   /* CTAA    CTAC    CTAG    CTAT    CTCA    CTCC    CTCG    CTCT */
+    0x2811, 0x2812, 0x2814, 0x2818, 0x2821, 0x2822, 0x2824, 0x2828,
+   /* CTGA    CTGC    CTGG    CTGT    CTTA    CTTC    CTTG    CTTT */
+    0x2841, 0x2842, 0x2844, 0x2848, 0x2881, 0x2882, 0x2884, 0x2888,
+   /* GAAA    GAAC    GAAG    GAAT    GACA    GACC    GACG    GACT */
+    0x4111, 0x4112, 0x4114, 0x4118, 0x4121, 0x4122, 0x4124, 0x4128,
+   /* GAGA    GAGC    GAGG    GAGT    GATA    GATC    GATG    GATT */
+    0x4141, 0x4142, 0x4144, 0x4148, 0x4181, 0x4182, 0x4184, 0x4188,
+   /* GCAA    GCAC    GCAG    GCAT    GCCA    GCCC    GCCG    GCCT */
+    0x4211, 0x4212, 0x4214, 0x4218, 0x4221, 0x4222, 0x4224, 0x4228,
+   /* GCGA    GCGC    GCGG    GCGT    GCTA    GCTC    GCTG    GCTT */
+    0x4241, 0x4242, 0x4244, 0x4248, 0x4281, 0x4282, 0x4284, 0x4288,
+   /* GGAA    GGAC    GGAG    GGAT    GGCA    GGCC    GGCG    GGCT */
+    0x4411, 0x4412, 0x4414, 0x4418, 0x4421, 0x4422, 0x4424, 0x4428,
+   /* GGGA    GGGC    GGGG    GGGT    GGTA    GGTC    GGTG    GGTT */
+    0x4441, 0x4442, 0x4444, 0x4448, 0x4481, 0x4482, 0x4484, 0x4488,
+   /* GTAA    GTAC    GTAG    GTAT    GTCA    GTCC    GTCG    GTCT */
+    0x4811, 0x4812, 0x4814, 0x4818, 0x4821, 0x4822, 0x4824, 0x4828,
+   /* GTGA    GTGC    GTGG    GTGT    GTTA    GTTC    GTTG    GTTT */
+    0x4841, 0x4842, 0x4844, 0x4848, 0x4881, 0x4882, 0x4884, 0x4888,
+   /* TAAA    TAAC    TAAG    TAAT    TACA    TACC    TACG    TACT */
+    0x8111, 0x8112, 0x8114, 0x8118, 0x8121, 0x8122, 0x8124, 0x8128,
+   /* TAGA    TAGC    TAGG    TAGT    TATA    TATC    TATG    TATT */
+    0x8141, 0x8142, 0x8144, 0x8148, 0x8181, 0x8182, 0x8184, 0x8188,
+   /* TCAA    TCAC    TCAG    TCAT    TCCA    TCCC    TCCG    TCCT */
+    0x8211, 0x8212, 0x8214, 0x8218, 0x8221, 0x8222, 0x8224, 0x8228,
+   /* TCGA    TCGC    TCGG    TCGT    TCTA    TCTC    TCTG    TCTT */
+    0x8241, 0x8242, 0x8244, 0x8248, 0x8281, 0x8282, 0x8284, 0x8288,
+   /* TGAA    TGAC    TGAG    TGAT    TGCA    TGCC    TGCG    TGCT */
+    0x8411, 0x8412, 0x8414, 0x8418, 0x8421, 0x8422, 0x8424, 0x8428,
+   /* TGGA    TGGC    TGGG    TGGT    TGTA    TGTC    TGTG    TGTT */
+    0x8441, 0x8442, 0x8444, 0x8448, 0x8481, 0x8482, 0x8484, 0x8488,
+   /* TTAA    TTAC    TTAG    TTAT    TTCA    TTCC    TTCG    TTCT */
+    0x8811, 0x8812, 0x8814, 0x8818, 0x8821, 0x8822, 0x8824, 0x8828,
+   /* TTGA    TTGC    TTGG    TTGT    TTTA    TTTC    TTTG    TTTT */
+    0x8841, 0x8842, 0x8844, 0x8848, 0x8881, 0x8882, 0x8884, 0x8888
+};
+
+
+/*--------------------------------------------------------------------------
+ * debugging printf
+ */
+#if TRACE_OPERATIONS
+
+#define COPY_NUCREG( to, from ) \
+    _mm_storeu_si128 ( ( __m128i* ) ( to ) . b, ( from ) )
+
+/* sprintf_2na
+ *  print 2na sequence
+ */
+static
+const char *sprintf_2na ( char *str, size_t ssize, nucreg_t nr )
+{
+    int b, i, j;
+    nucpat_t np;
+    const char *ncbi2na = "ACGT";
+
+    if ( ssize <= sizeof np * 4 )
+        return "** BUFFER TOO SMALL **";
+
+    COPY_NUCREG ( np, nr );
+
+    for ( i = j = 0; i < sizeof np . b; j += 4, ++ i )
+    {
+        b = np . b [ i ];
+        str [ j + 0 ] = ncbi2na [ ( b >> 6 ) & 3 ];
+        str [ j + 1 ] = ncbi2na [ ( b >> 4 ) & 3 ];
+        str [ j + 2 ] = ncbi2na [ ( b >> 2 ) & 3 ];
+        str [ j + 3 ] = ncbi2na [ ( b >> 0 ) & 3 ];
+    }
+
+    str [ sizeof np * 4 ] = 0;
+
+    return str;
+}
+
+/* sprintf_4na
+ *  print 4na sequence
+ */
+static
+const char *sprintf_4na ( char *str, size_t ssize, nucreg_t nr )
+{
+    int b, i, j;
+    nucpat_t np;
+    const char *ncbi4na = "-ACMGRSVTWYHKDBN";
+
+    if ( ssize <= sizeof np * 2 )
+        return "** BUFFER TOO SMALL **";
+
+    COPY_NUCREG ( np, nr );
+
+    for ( i = j = 0; i < sizeof np . b; j += 2, ++ i )
+    {
+        b = np . b [ i ];
+        str [ j + 0 ] = ncbi4na [ ( b >> 4 ) & 15 ];
+        str [ j + 1 ] = ncbi4na [ ( b >> 0 ) & 15 ];
+    }
+
+    str [ sizeof np * 2 ] = 0;
+
+    return str;
+}
+
+/* sprintf_m2na
+ *  print 2na mask
+ */
+static
+const char *sprintf_m2na ( char *str, size_t ssize, nucreg_t mask )
+{
+    int b, i, j;
+    nucpat_t mp;
+    const char *amask = " ??x";
+
+    if ( ssize <= sizeof mp * 4 )
+        return "** BUFFER TOO SMALL **";
+
+    COPY_NUCREG ( mp, mask );
+
+    for ( i = j = 0; i < mp . b; j += 4, ++ i )
+    {
+        b = mp . b [ i ];
+        str [ j + 0 ] = amask [ ( b >> 6 ) & 3 ];
+        str [ j + 1 ] = amask [ ( b >> 4 ) & 3 ];
+        str [ j + 2 ] = amask [ ( b >> 2 ) & 3 ];
+        str [ j + 3 ] = amask [ ( b >> 0 ) & 3 ];
+    }
+
+    str [ sizeof mp * 4 ] = 0;
+
+    return str;
+}
+
+/* sprintf_m4na
+ *  print 4na mask
+ */
+static
+const char *sprintf_m4na ( char *str, size_t ssize, nucreg_t mask )
+{
+    int b, i, j;
+    nucpat_t mp;
+    const char *amask = " ??????????????x";
+
+    if ( ssize <= sizeof mp * 2 )
+        return "** BUFFER TOO SMALL **";
+
+    COPY_NUCREG ( mp, mask );
+
+    for ( i = j = 0; i < sizeof mp . b; j += 2, ++ i )
+    {
+        b = mp . b [ i ];
+        str [ j + 0 ] = amask [ ( b >> 4 ) & 15 ];
+        str [ j + 1 ] = amask [ ( b >> 0 ) & 15 ];
+    }
+
+    str [ sizeof mp * 2 ] = 0;
+
+    return str;
+}
+
+/* sprintf_a2na
+ *  print 2na alignment, where buffer has source,
+ *  pattern has some set of valid pattern bases,
+ *  and mask defines which parts are valid
+ */
+static
+const char *sprintf_a2na ( char *str, size_t ssize,
+    nucreg_t buffer, nucreg_t pattern, nucreg_t mask )
+{
+    nucpat_t bp, pp, mp;
+    int s, b, m, i, j, k, l, s_ch, b_ch;
+    const char *ncbi2na = "    ????????ACGT";
+
+    if ( ssize <= sizeof bp * 4 )
+        return "** BUFFER TOO SMALL **";
+
+    COPY_NUCREG ( bp, buffer );
+    COPY_NUCREG ( pp, pattern );
+    COPY_NUCREG ( mp, mask );
+
+    for ( i = j = 0; i < sizeof bp . b; j += 4, ++ i )
+    {
+        s = bp . b [ i ];
+        b = pp . b [ i ];
+        m = ( int ) mp . b [ i ] << 2;
+
+        for ( k = 0, l = 6; k < 4; l -= 2, ++ k )
+        {
+            s_ch = ncbi2na [ 12 | ( ( s >> l ) & 3 ) ];
+            b_ch = ncbi2na [ ( ( m >> l ) & 12 ) | ( ( b >> l ) & 3 ) ];
+            str [ j + k ] = ( s_ch == b_ch ) ? ( char ) b_ch : ( char ) tolower ( b_ch );
+        }
+    }
+
+    str [ sizeof bp * 4 ] = 0;
+
+    return str;
+}
+
+/* sprintf_a4na
+ *  print 4na alignment, where buffer has source,
+ *  pattern has some set of valid pattern bases,
+ *  and mask defines which parts are valid
+ */
+static
+const char *sprintf_a4na ( char *str, size_t ssize,
+    nucreg_t buffer, nucreg_t pattern, nucreg_t mask )
+{
+    nucpat_t bp, pp, mp;
+    int s, b, m, i, j, k, l, s_ch, b_ch;
+    const char *ncbi4na =
+        "                ????????????????????????????????????????????????"
+        "????????????????????????????????????????????????????????????????"
+        "????????????????????????????????????????????????????????????????"
+        "????????????????????????????????????????????????""-ACMGRSVTWYHKDBN";
+    /* the odd ??""- is to prevent a ??- trigraph for ~ */
+
+    if ( ssize <= sizeof bp * 2 )
+        return "** BUFFER TOO SMALL **";
+
+    COPY_NUCREG ( bp, buffer );
+    COPY_NUCREG ( pp, pattern );
+    COPY_NUCREG ( mp, mask );
+
+    for ( i = j = 0; i < sizeof bp . b; j += 2, ++ i )
+    {
+        s = bp . b [ i ];
+        b = pp . b [ i ];
+        m = ( int ) mp . b [ i ] << 4;
+
+        for ( k = 0, l = 4; k < 2; l -= 4, ++ k )
+        {
+            s_ch = ncbi4na [ ( ( m >> l ) & 0xF0 ) | ( ( s >> l ) & 15 ) ];
+            b_ch = ncbi4na [ ( ( m >> l ) & 0xF0 ) | ( ( b >> l ) & 15 ) ];
+            str [ j + k ] =
+                ( ( fasta_4na_map [ s_ch ] & fasta_4na_map [ b_ch ] ) != 0 ) ?
+                ( char ) s_ch : ( char ) tolower ( b_ch );
+        }
+    }
+
+    str [ sizeof bp * 2 ] = 0;
+
+    return str;
+}
+
+/* sprintf_r2na
+ *  print results of 2na comparison
+ */
+static
+const char *sprintf_r2na ( char *str, size_t ssize, nucreg_t result, nucreg_t mask )
+{
+    nucpat_t rp;
+    int b, i, j;
+    const char *amask = " ??x";
+
+    if ( ssize <= sizeof rp * 4 )
+        return "** BUFFER TOO SMALL **";
+
+    COPY_NUCREG ( rp, result );
+
+    for ( i = j = 0; i < sizeof rp . b; j += 4, ++ i )
+    {
+        b = rp . b [ i ];
+        str [ j + 0 ] = amask [ ( b >> 6 ) & 3 ];
+        str [ j + 1 ] = amask [ ( b >> 4 ) & 3 ];
+        str [ j + 2 ] = amask [ ( b >> 2 ) & 3 ];
+        str [ j + 3 ] = amask [ ( b >> 0 ) & 3 ];
+    }
+
+    str [ sizeof rp * 4 ] = 0;
+
+    return str;
+}
+
+static
+const char *sprintf_r4na ( char *str, size_t ssize, nucreg_t result, nucreg_t mask )
+{
+    int b, i, j;
+    nucpat_t rp;
+    const char *amask = " ??????????????x";
+
+    if ( ssize <= sizeof rp * 2 )
+        return "** BUFFER TOO SMALL **";
+
+    COPY_NUCREG ( rp, result );
+
+    for ( i = j = 0; i < sizeof rp . b; j += 2, ++ i )
+    {
+        b = rp . b [ i ];
+        str [ j + 0 ] = amask [ ( b >> 4 ) & 15 ];
+        str [ j + 1 ] = amask [ ( b >> 0 ) & 15 ];
+    }
+
+    str [ sizeof rp * 2 ] = 0;
+
+    return str;
+}
+
+#endif
+
+#if TRACE_OPERATIONS && TRACE_PARSE
+static
+void PARSE_2NA_PATTERN ( const char *fasta, size_t size,
+    nucpat_t pattern, nucpat_t mask )
+{
+    char str [ 65 ];
+    nucreg_t nr = _mm_loadu_si128 ( ( const __m128i* ) pattern . b );
+    nucreg_t nm = _mm_loadu_si128 ( ( const __m128i* ) mask . b );
+
+    assert ( size < sizeof str );
+    memmove ( str, fasta, size );
+    str [ size ] = 0;
+
+    printf ( "  %s - original FASTA\n", str );
+    printf ( "  %s - pattern\n", sprintf_2na ( str, sizeof str, nr ) );
+    printf ( "  %s - mask\n", sprintf_m2na ( str, sizeof str, nm ) );
+}
+
+static
+void PARSE_4NA_PATTERN ( const char *fasta, size_t size,
+    nucpat_t pattern, nucpat_t mask )
+{
+    char str [ 33 ];
+    nucreg_t nr = _mm_loadu_si128 ( ( const __m128i* ) pattern . b );
+    nucreg_t nm = _mm_loadu_si128 ( ( const __m128i* ) mask . b );
+
+    assert ( size < sizeof str );
+    memmove ( str, fasta, size );
+    str [ size ] = 0;
+
+    printf ( "  %s - original FASTA\n", str );
+    printf ( "  %s - pattern\n", sprintf_4na ( str, sizeof str, nr ) );
+    printf ( "  %s - mask\n", sprintf_m4na ( str, sizeof str, nm ) );
+}
+
+static
+void PARSE_2NA_SHIFT ( unsigned int idx, nucpat_t pattern, nucpat_t mask )
+{
+    char str [ 65 ];
+    nucreg_t nr = _mm_loadu_si128 ( ( const __m128i* ) pattern . b );
+    nucreg_t nm = _mm_loadu_si128 ( ( const __m128i* ) mask . b );
+
+    printf ( "  %s - pattern [ %u ]\n", sprintf_2na ( str, sizeof str, nr ), idx );
+    printf ( "  %s - mask [ %u ]\n", sprintf_m2na ( str, sizeof str, nm ), idx );
+}
+
+static
+void PARSE_4NA_SHIFT ( unsigned int idx, nucpat_t pattern, nucpat_t mask )
+{
+    char str [ 33 ];
+    nucreg_t nr = _mm_loadu_si128 ( ( const __m128i* ) pattern . b );
+    nucreg_t nm = _mm_loadu_si128 ( ( const __m128i* ) mask . b );
+
+    printf ( "  %s - pattern [ %u ]\n", sprintf_4na ( str, sizeof str, nr ), idx );
+    printf ( "  %s - mask [ %u ]\n", sprintf_m4na ( str, sizeof str, nm ), idx );
+}
+#else
+
+#define PARSE_2NA_PATTERN( fasta, size, pattern, mask ) \
+    ( void ) 0
+
+#define PARSE_4NA_PATTERN( fasta, size, pattern, mask ) \
+    ( void ) 0
+
+#define PARSE_2NA_SHIFT( idx, pattern, mask ) \
+    ( void ) 0
+
+#define PARSE_4NA_SHIFT( idx, pattern, mask ) \
+    ( void ) 0
+
+#endif
+
+#if TRACE_OPERATIONS && TRACE_HEADER
+
+static
+void ALIGN_2NA_HEADER ( nucreg_t buffer, unsigned int pos, unsigned int len )
+{
+    unsigned int i, j;
+    char str [ 65 ];
+    unsigned int end = pos + 63;
+    str [ 64 ] = 0;
+
+    /* line separator */
+    putchar ( '\n' );
+
+    /* print a position with vertical numerals */
+    if ( end >= 1000 )
+    {
+        for ( i = pos, j = 0; i <= end; ++ j, ++ i )
+            str [ j ] = '0' + ( char) ( i / 1000 );
+        printf ( "  %s\n", str );
+    }
+    if ( end >= 100 )
+    {
+        for ( i = pos, j = 0; i <= end; ++ j, ++ i )
+            str [ j ] = '0' + ( char) ( ( i / 100 ) % 10 );
+        printf ( "  %s\n", str );
+    }
+    if ( end >= 10 )
+    {
+        for ( i = pos, j = 0; i <= end; ++ j, ++ i )
+            str [ j ] = '0' + ( char) ( ( i / 10 ) % 10 );
+        printf ( "  %s\n", str );
+    }
+
+    for ( i = pos, j = 0; i <= end; ++ j, ++ i )
+        str [ j ] = '0' + ( char) ( i % 10 );
+    printf ( "  %s\n", str );
+
+    /* now dump the buffer */
+    printf ( "  %s - buffer\n", sprintf_2na ( str, sizeof str, buffer ) );
+}
+
+static
+void ALIGN_4NA_HEADER ( nucreg_t buffer, unsigned int pos, unsigned int len )
+{
+    unsigned int i, j;
+    char str [ 33 ];
+    unsigned int end = pos + 31;
+    str [ 32 ] = 0;
+
+    /* line separator */
+    putchar ( '\n' );
+
+    /* print a position with vertical numerals */
+    if ( end >= 1000 )
+    {
+        for ( i = pos, j = 0; i <= end; ++ j, ++ i )
+            str [ j ] = '0' + ( char) ( i / 1000 );
+        printf ( "  %s\n", str );
+    }
+    if ( end >= 100 )
+    {
+        for ( i = pos, j = 0; i <= end; ++ j, ++ i )
+            str [ j ] = '0' + ( char) ( ( i / 100 ) % 10 );
+        printf ( "  %s\n", str );
+    }
+    if ( end >= 10 )
+    {
+        for ( i = pos, j = 0; i <= end; ++ j, ++ i )
+            str [ j ] = '0' + ( char) ( ( i / 10 ) % 10 );
+        printf ( "  %s\n", str );
+    }
+
+    for ( i = pos, j = 0; i <= end; ++ j, ++ i )
+        str [ j ] = '0' + ( char) ( i % 10 );
+    printf ( "  %s\n", str );
+
+    /* now dump the buffer */
+    printf ( "  %s - buffer\n", sprintf_4na ( str, sizeof str, buffer ) );
+}
+
+#else
+
+#define ALIGN_2NA_HEADER( buffer, pos, len ) \
+    ( void ) 0
+
+#define ALIGN_4NA_HEADER( buffer, pos, len ) \
+    ( void ) 0
+
+#endif
+
+#if TRACE_OPERATIONS && TRACE_RESULT
+
+static
+void ALIGN_2NA_RESULT ( nucreg_t buffer, nucreg_t pat, nucreg_t mask,
+    nucreg_t cmp, int bits )
+{
+    unsigned int i;
+    char str [ 65 ];
+
+    char bstr [ 17 ];
+    for ( i = 0; i < 16; bits >>= 1, ++ i )
+        bstr [ i ] = '0' + ( bits & 1 );
+    bstr [ 16 ] = 0;
+
+#if TRACE_PATMASK
+    printf ( "  %s - pattern\n", sprintf_2na ( str, sizeof str, pat ) );
+    printf ( "  %s - mask\n", sprintf_m2na ( str, sizeof str, mask ) );
+#endif
+
+    /* dump alignment and re-compare */
+    printf ( "  %s - alignment\n", sprintf_a2na ( str, sizeof str, buffer, pat, mask ) );
+    printf ( "  %s ( 0b%s )\n", sprintf_r2na ( str, sizeof str, cmp, mask ), bstr );
+}
+
+static
+void ALIGN_4NA_RESULT ( nucreg_t buffer, nucreg_t pat, nucreg_t mask,
+    nucreg_t cmp, int bits )
+{
+    unsigned int i;
+    char str [ 33 ];
+
+    char bstr [ 17 ];
+    for ( i = 0; i < 16; bits >>= 1, ++ i )
+        bstr [ i ] = '0' + ( bits & 1 );
+    bstr [ 16 ] = 0;
+
+#if TRACE_PATMASK
+    printf ( "  %s - pattern\n", sprintf_4na ( str, sizeof str, pat ) );
+    printf ( "  %s - mask\n", sprintf_m4na ( str, sizeof str, mask ) );
+#endif
+
+    /* dump alignment and re-compare */
+    printf ( "  %s - alignment\n", sprintf_a4na ( str, sizeof str, buffer, pat, mask ) );
+    printf ( "  %s ( 0b%s )\n", sprintf_r4na ( str, sizeof str, cmp, mask ), bstr );
+}
+
+#else
+
+#define ALIGN_2NA_RESULT( buffer, pat, mask, cmp, bits ) \
+    ( void ) 0
+#define ALIGN_4NA_RESULT( buffer, pat, mask, cmp, bits ) \
+    ( void ) 0
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * NucStrExpr
+ *  an expression
+ */
+typedef NucStrstr NucStrExpr;
+
+enum
+{
+    type_2na_64,
+    type_4na_64,
+    type_2na_8,
+    type_2na_16,
+    type_2na_32,
+    type_2na_128,
+    type_4na_16,
+    type_4na_32,
+    type_4na_128,
+    type_2na_pos,
+    type_4na_pos,
+    type_OP,
+    type_EXPR,
+
+    op_NOT,
+    op_HEAD,
+    op_TAIL,
+    op_AND,
+    op_OR
+};
+
+typedef struct NucStrFastaExpr NucStrFastaExpr;
+struct NucStrFastaExpr
+{
+    int32_t type;
+    uint32_t size;
+#if ! USE_MEMALIGN
+    union
+    {
+        /* actual allocation for freeing
+           since struct pointer will be
+           16 byte aligned by code */
+        void *outer;
+        uint64_t align;
+    } u;
+#endif
+    struct
+    {
+        nucpat_t pattern;
+        nucpat_t mask;
+    } query [ 4 ];
+};
+
+#if USE_MEMALIGN
+#define NucStrFastaExprAlloc( sz ) \
+    memalign ( 16, sz )
+#else
+static
+void *NucStrFastaExprAlloc ( size_t sz )
+{
+    void *outer = malloc ( sz + 16 );
+    if ( outer != NULL )
+    {
+        NucStrFastaExpr *e = ( void* )
+            ( ( ( size_t ) outer + 15 ) & ~ ( size_t ) 15 );
+        e -> u . outer = outer;
+        assert ( ( ( size_t ) & e -> query [ 0 ] . pattern & 15 ) == 0 );
+        assert ( ( ( size_t ) & e -> query [ 0 ] . mask & 15 ) == 0 );
+        return e;
+    }
+    return NULL;
+}
+#endif
+
+typedef struct NucStrOpExpr NucStrOpExpr;
+struct NucStrOpExpr
+{
+    int32_t type;
+    int32_t op;
+    NucStrExpr *left;
+    NucStrExpr *right;
+};
+
+typedef struct NucStrSubExpr NucStrSubExpr;
+struct NucStrSubExpr
+{
+    int32_t type;
+    int32_t op;
+    NucStrExpr *expr;
+};
+
+union  NucStrstr
+{
+    NucStrFastaExpr fasta;
+    NucStrOpExpr boolean;
+    NucStrSubExpr sub;
+};
+
+/* NucStrFastaExprMake
+ *  initializes for comparison based upon type
+ */
+static
+int NucStrFastaExprMake2 ( NucStrExpr **expr, int positional,
+    const char *fasta, size_t size )
+{
+    size_t i;
+    NucStrExpr *e;
+    nucpat_t pattern, mask;
+
+    /* still limiting bases */
+    if ( size > NA2_LIMIT )
+        return E2BIG;
+
+    e = NucStrFastaExprAlloc ( sizeof * e );
+    if ( e == NULL )
+        return errno;
+
+    * expr = e;
+    e -> fasta . size = ( uint32_t ) size;
+
+    /* translate FASTA to 2na */
+    for ( i = 0; i < size; ++ i )
+    {
+        uint8_t base = fasta_2na_map [ ( int ) fasta [ i ] ];
+        switch ( i & 3 )
+        {
+        case 0:
+            pattern . b [ i >> 2 ] = base << 6;
+            mask . b [ i >> 2 ] = 3 << 6;
+            break;
+        case 1:
+            pattern . b [ i >> 2 ] |= base << 4;
+            mask . b [ i >> 2 ] |= 3 << 4;
+            break;
+        case 2:
+            pattern . b [ i >> 2 ] |= base << 2;
+            mask . b [ i >> 2 ] |= 3 << 2;
+            break;
+        case 3:
+            pattern . b [ i >> 2 ] |= base;
+            mask . b [ i >> 2 ] |= 3;
+            break;
+        }
+    }
+
+    /* fill trailing with zeros */
+    for ( i = ( i + 3 ) >> 2; i < 16; ++ i )
+    {
+        pattern . b [ i ] = 0;
+        mask . b [ i ] = 0;
+    }
+
+    PARSE_2NA_PATTERN ( fasta, size, pattern, mask );
+
+    /* treat positional types specially */
+    if ( positional )
+    {
+        e -> fasta . type = type_2na_pos;
+    }
+
+    /* replicate for shorter queries */
+    else if ( size < 2 )
+    {
+        pattern . b [ 1 ] = pattern . b [ 0 ];
+        pattern . w [ 1 ] = pattern . w [ 0 ];
+        pattern . i [ 1 ] = pattern . i [ 0 ];
+        pattern . l [ 1 ] = pattern . l [ 0 ];
+            
+        mask . b [ 1 ] = mask . b [ 0 ];
+        mask . w [ 1 ] = mask . w [ 0 ];
+        mask . i [ 1 ] = mask . i [ 0 ];
+        mask . l [ 1 ] = mask . l [ 0 ];
+            
+        e -> fasta . type = type_2na_8;
+    }
+    else if ( size < 6 )
+    {
+        pattern . w [ 1 ] = pattern . w [ 0 ];
+        pattern . i [ 1 ] = pattern . i [ 0 ];
+        pattern . l [ 1 ] = pattern . l [ 0 ];
+            
+        mask . w [ 1 ] = mask . w [ 0 ];
+        mask . i [ 1 ] = mask . i [ 0 ];
+        mask . l [ 1 ] = mask . l [ 0 ];
+            
+        e -> fasta . type = type_2na_16;
+    }
+    else if ( size < 14 )
+    {
+        pattern . i [ 1 ] = pattern . i [ 0 ];
+        pattern . l [ 1 ] = pattern . l [ 0 ];
+            
+        mask . i [ 1 ] = mask . i [ 0 ];
+        mask . l [ 1 ] = mask . l [ 0 ];
+            
+        e -> fasta . type = type_2na_32;
+    }
+    else if ( size < 30 )
+    {
+        pattern . l [ 1 ] = pattern . l [ 0 ];
+        mask . l [ 1 ] = mask . l [ 0 ];
+            
+        e -> fasta . type = type_2na_64;
+    }
+    else
+    {
+        e -> fasta . type = type_2na_128;
+    }
+
+    e -> fasta . query [ 0 ] . pattern = pattern;
+    e -> fasta . query [ 0 ] . mask = mask;
+
+    /* byte swap the pattern and mask */
+    uint128_bswap ( & pattern . s );
+    uint128_bswap ( & mask . s );
+
+    /* now shifts should work as imagined */
+    uint128_shr ( & pattern . s, 2 );
+    uint128_shr ( & mask . s, 2 );
+        
+    /* restore the byte order for sse */
+    uint128_bswap_copy ( & e -> fasta . query [ 1 ] . pattern . s, & pattern . s );
+    uint128_bswap_copy ( & e -> fasta . query [ 1 ] . mask . s, & mask . s );
+
+    uint128_shr ( & pattern . s, 2 );
+    uint128_shr ( & mask . s, 2 );
+        
+    uint128_bswap_copy ( & e -> fasta . query [ 2 ] . pattern . s, & pattern . s );
+    uint128_bswap_copy ( & e -> fasta . query [ 2 ] . mask . s, & mask . s );
+
+    uint128_shr ( & pattern . s, 2 );
+    uint128_shr ( & mask . s, 2 );
+        
+    uint128_bswap_copy ( & e -> fasta . query [ 3 ] . pattern . s, & pattern . s );
+    uint128_bswap_copy ( & e -> fasta . query [ 3 ] . mask . s, & mask . s );
+        
+
+    PARSE_2NA_SHIFT ( 0, e -> fasta . query [ 0 ] . pattern,
+        e -> fasta . query [ 0 ] . mask );
+    PARSE_2NA_SHIFT ( 1, e -> fasta . query [ 1 ] . pattern,
+        e -> fasta . query [ 1 ] . mask );
+    PARSE_2NA_SHIFT ( 2, e -> fasta . query [ 2 ] . pattern,
+        e -> fasta . query [ 2 ] . mask );
+    PARSE_2NA_SHIFT ( 3, e -> fasta . query [ 3 ] . pattern,
+        e -> fasta . query [ 3 ] . mask );
+
+    return 0;
+}
+
+static
+int NucStrFastaExprMake4 ( NucStrExpr **expr, int positional,
+    const char *fasta, size_t size )
+{
+    size_t i;
+    NucStrExpr *e;
+    nucpat_t pattern, mask;
+
+    /* still limiting bases */
+    if ( size > NA4_LIMIT )
+        return E2BIG;
+
+    e = NucStrFastaExprAlloc ( sizeof * e );
+    if ( e == NULL )
+        return errno;
+
+    * expr = e;
+    e -> fasta . size = ( uint32_t ) size;
+
+    /* translate FASTA to 4na */
+    for ( i = 0; i < size; ++ i )
+    {
+        uint16_t base = fasta_4na_map [ ( int ) fasta [ i ] ];
+        switch ( i & 3 )
+        {
+        case 0:
+            pattern . w [ i >> 2 ] = base << 4;
+            mask . w [ i >> 2 ] = 15 << 4;
+            break;
+        case 1:
+            pattern . w [ i >> 2 ] |= base << 0;
+            mask . w [ i >> 2 ] |= 15 << 0;
+            break;
+        case 2:
+            pattern . w [ i >> 2 ] |= base << 12;
+            mask . w [ i >> 2 ] |= 15 << 12;
+            break;
+        case 3:
+            pattern . w [ i >> 2 ] |= base << 8;
+            mask . w [ i >> 2 ] |= 15 << 8;
+            break;
+        }
+    }
+
+    /* fill trailing with zeros */
+    for ( i = ( i + 3 ) >> 2; i < 8; ++ i )
+    {
+        pattern . w [ i ] = 0;
+        mask . w [ i ] = 0;
+    }
+
+    PARSE_4NA_PATTERN ( fasta, size, pattern, mask );
+
+    if ( positional )
+    {
+        e -> fasta . type = type_4na_pos;
+    }
+    else if ( size < 2 )
+    {
+        pattern . w [ 1 ] = pattern . w [ 0 ];
+        pattern . i [ 1 ] = pattern . i [ 0 ];
+        pattern . l [ 1 ] = pattern . l [ 0 ];
+            
+        mask . w [ 1 ] = mask . w [ 0 ];
+        mask . i [ 1 ] = mask . i [ 0 ];
+        mask . l [ 1 ] = mask . l [ 0 ];
+
+        e -> fasta . type = type_4na_16;
+    }
+    else if ( size < 6 )
+    {
+        pattern . i [ 1 ] = pattern . i [ 0 ];
+        pattern . l [ 1 ] = pattern . l [ 0 ];
+            
+        mask . i [ 1 ] = mask . i [ 0 ];
+        mask . l [ 1 ] = mask . l [ 0 ];
+
+        e -> fasta . type = type_4na_32;
+    }
+    else if ( size < 14 )
+    {
+        pattern . l [ 1 ] = pattern . l [ 0 ];
+        mask . l [ 1 ] = mask . l [ 0 ];
+
+        e -> fasta . type = type_4na_64;
+    }
+    else
+    {
+        e -> fasta . type = type_4na_128;
+    }
+
+    e -> fasta . query [ 0 ] . pattern = pattern;
+    e -> fasta . query [ 0 ] . mask = mask;
+
+    /* byte swap the pattern and mask */
+    uint128_bswap ( & pattern . s );
+    uint128_bswap ( & mask . s );
+
+    /* now shifts should work as imagined */
+    uint128_shr ( & pattern . s, 4 );
+    uint128_shr ( & mask . s, 4 );
+        
+    /* restore the byte order for sse */
+    uint128_bswap_copy ( & e -> fasta . query [ 1 ] . pattern . s, & pattern . s );
+    uint128_bswap_copy ( & e -> fasta . query [ 1 ] . mask . s, & mask . s );
+
+    uint128_shr ( & pattern . s, 4 );
+    uint128_shr ( & mask . s, 4 );
+        
+    uint128_bswap_copy ( & e -> fasta . query [ 2 ] . pattern . s, & pattern . s );
+    uint128_bswap_copy ( & e -> fasta . query [ 2 ] . mask . s, & mask . s );
+
+    uint128_shr ( & pattern . s, 4 );
+    uint128_shr ( & mask . s, 4 );
+        
+    uint128_bswap_copy ( & e -> fasta . query [ 3 ] . pattern . s, & pattern . s );
+    uint128_bswap_copy ( & e -> fasta . query [ 3 ] . mask . s, & mask . s );
+
+
+    PARSE_4NA_SHIFT ( 0, e -> fasta . query [ 0 ] . pattern,
+        e -> fasta . query [ 0 ] . mask );
+    PARSE_4NA_SHIFT ( 1, e -> fasta . query [ 1 ] . pattern,
+        e -> fasta . query [ 1 ] . mask );
+    PARSE_4NA_SHIFT ( 2, e -> fasta . query [ 2 ] . pattern,
+        e -> fasta . query [ 2 ] . mask );
+    PARSE_4NA_SHIFT ( 3, e -> fasta . query [ 3 ] . pattern,
+        e -> fasta . query [ 3 ] . mask );
+
+    return 0;
+}
+
+
+/* nss_sob
+ */
+static
+const char *nss_sob ( const char *p, const char *end )
+{
+    while ( p < end && isspace ( * ( const uint8_t* ) p ) )
+        ++ p;
+    return p;
+}
+
+/* nss_FASTA_expr
+ */
+static
+const char *nss_FASTA_expr ( const char *p, const char *end,
+    NucStrExpr **expr, int *status, int positional )
+{
+    if ( p >= end )
+        * status = EINVAL;
+    else
+    {
+        const char *start = p;
+
+        int32_t type = type_2na_64;
+        const int8_t *map = fasta_2na_map;
+        do
+        {
+            if ( * p < 0 )
+                break;
+
+            if ( map [ * ( const uint8_t* ) p ] < 0 )
+            {
+                if ( map == fasta_4na_map )
+                    break;
+                if ( fasta_4na_map [ * ( const uint8_t* ) p ] < 0 )
+                    break;
+                type = type_4na_64;
+                map = fasta_4na_map;
+            }
+        }
+        while ( ++ p < end );
+
+        if ( p <= start )
+            * status = EINVAL;
+        else if ( type == type_2na_64 )
+            * status = NucStrFastaExprMake2 ( expr, positional, start, p - start );
+        else
+            * status = NucStrFastaExprMake4 ( expr, positional, start, p - start );
+    }
+
+    return p;
+}
+
+/* nss_fasta_expr
+ */
+static
+const char *nss_fasta_expr ( const char *p, const char *end,
+    NucStrExpr **expr, int *status, int positional )
+{
+    assert ( p < end );
+    switch ( * p )
+    {
+    case '\'':
+        p = nss_FASTA_expr ( p + 1, end, expr, status, positional );
+        if ( * status == 0 && ( p == end || * p ++ != '\'' ) )
+            * status = EINVAL;
+        break;
+    case '"':
+        p = nss_FASTA_expr ( p + 1, end, expr, status, positional );
+        if ( * status == 0 && ( p == end || * p ++ != '"' ) )
+            * status = EINVAL;
+        break;
+    default:
+        return nss_FASTA_expr ( p, end, expr, status, positional );
+    }
+
+    return p;
+}
+
+/* nss_position_expr
+ */
+#if ENABLE_AT_EXPR
+static
+const char *nss_position_expr ( const char *p, const char *end,
+    NucStrExpr **expr, int *status, int positional )
+{
+    assert ( p < end );
+    if ( * p == '@' )
+    {
+        p = nss_sob ( p + 1, end );
+        if ( p == end )
+        {
+            * status = EINVAL;
+            return p;
+        }
+        positional = 1;
+    }
+
+    return nss_fasta_expr ( p, end, expr, status, positional );
+}
+#else
+#define nss_position_expr( p, end, expr, status, positional ) \
+    nss_fasta_expr ( p, end, expr, status, positional )
+#endif
+
+/* forward */
+static
+const char *nss_expr ( const char *p, const char *end,
+    NucStrExpr **expr, int *status, int positional );
+
+/* nss_primary_expr
+ */
+static
+const char *nss_primary_expr ( const char *p, const char *end,
+    NucStrExpr **expr, int *status, int positional )
+{
+    NucStrExpr *e;
+
+    assert ( p < end );
+    switch ( * p )
+    {
+    case '^':
+        e = malloc ( sizeof e -> sub );
+        if ( e == NULL )
+            * status = errno;
+        else
+        {
+            e -> sub . type = type_EXPR;
+            e -> sub . op = op_HEAD;
+            e -> sub . expr = NULL;
+            * expr = e;
+
+            p = nss_sob ( p + 1, end );
+            p = nss_position_expr ( p, end, & e -> sub . expr, status, positional );
+        }
+        return p;
+    case '(':
+        e = malloc ( sizeof e -> sub );
+        if ( e == NULL )
+            * status = errno;
+        else
+        {
+            e -> sub . type = type_EXPR;
+            e -> sub . op = 0;
+            * expr = e;
+
+            p = nss_expr ( p + 1, end, & e -> sub . expr, status, positional );
+            if ( * status == 0 )
+            {
+                if ( e -> sub . expr == NULL || p == end || * p ++ != ')' )
+                    * status = EINVAL;
+            }
+        }
+        return p;
+    }
+
+    p = nss_position_expr ( p, end, expr, status, positional );
+    if ( * status == 0 && p < end )
+    {
+        p = nss_sob ( p, end );
+        if ( p < end && * p == '$' )
+        {
+            ++ p;
+
+            e = malloc ( sizeof e -> sub );
+            if ( e == NULL )
+                * status = errno;
+            else
+            {
+                e -> sub . type = type_EXPR;
+                e -> sub . op = op_TAIL;
+                e -> sub . expr = * expr;
+                * expr = e;
+            }
+        }
+    }
+
+    return p;
+}
+
+/* nss_unary_expr
+ */
+static
+const char *nss_unary_expr ( const char *p, const char *end,
+    NucStrExpr **expr, int *status, int positional )
+{
+    assert ( p < end );
+    if ( * p != '!' )
+        return nss_primary_expr ( p, end, expr, status, positional );
+
+#if ! ALLOW_POSITIONAL_OPERATOR_MIX
+    if ( positional )
+    {
+        * status = EINVAL;
+        return p;
+    }
+#endif
+
+    p = nss_sob ( p + 1, end );
+    if ( p == end )
+        * status = EINVAL;
+    else
+    {
+        NucStrExpr *e = malloc ( sizeof e -> sub );
+        if ( e == NULL )
+            * status = errno;
+        else
+        {
+            e -> sub . type = type_EXPR;
+            e -> sub . op = op_NOT;
+            e -> sub . expr = NULL;
+            * expr = e;
+            
+            p = nss_unary_expr ( p, end, & e -> sub . expr, status, positional );
+            assert ( * status != 0 || e -> sub . expr != NULL );
+        }
+    }
+    return p;
+}
+
+/* nss_expr
+ *
+ *   expr        : <unary_expr>
+ *               | <unary_expr> <boolean_op> <expr>
+ *
+ *   boolean_op  : '&', '|', '&&', '||'
+ */
+static
+const char *nss_expr ( const char *p, const char *end,
+    NucStrExpr **expr, int *status, int positional )
+{
+    * expr = NULL;
+
+    p = nss_sob ( p, end );
+    if ( p != end )
+    {
+        p = nss_unary_expr ( p, end, expr, status, positional );
+        if ( * status == 0 )
+        {
+            p = nss_sob ( p, end );
+            if ( p != end )
+            {
+                int32_t op;
+                NucStrExpr *e;
+                assert ( * expr != NULL );
+
+                switch ( * p ++ )
+                {
+                case ')':
+                    return p - 1;
+                case '&':
+                    if ( p < end && * p == '&' )
+                        ++ p;
+                    op = op_AND;
+                    break;
+                case '|':
+                    if ( p < end && * p == '|' )
+                        ++ p;
+                    op = op_OR;
+                    break;
+                default:
+                    /* unrecognized or missing operator */
+                    * status = EINVAL;
+                    return p - 1;
+                }
+
+#if ! ALLOW_POSITIONAL_OPERATOR_MIX
+                /* boolean operators do not work in positional mode */
+                if ( positional )
+                {
+                    * status = EINVAL;
+                    return p - 1;
+                }
+#endif
+
+                e = malloc ( sizeof e -> boolean );
+                if ( e == NULL )
+                {
+                    * status = errno;
+                    return p;
+                }
+
+                e -> boolean . type = type_OP;
+                e -> boolean . op = op;
+                e -> boolean . left = * expr;
+                * expr = e;
+
+                /* evaluate right-hand */
+                p = nss_expr ( p, end, & e -> boolean . right, status, positional );
+                assert ( * status != 0 || e -> boolean . right != NULL );
+            }
+        }
+    }
+
+    return p;
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * NucStrstr
+ *  prepared handle for nucleotide k-mer strstr expression
+ */
+
+/* NucStrstrInit
+ */
+static
+void NucStrstrInit ( void )
+{
+    int ch;
+    unsigned int i;
+    const char *p, *ncbi2na = "ACGT";
+    const char *ncbi4na = "-ACMGRSVTWYHKDBN";
+
+    /* illegal under most conditions */
+    memset ( fasta_2na_map, -1, sizeof fasta_2na_map );
+    memset ( fasta_4na_map, -1, sizeof fasta_4na_map );
+        
+    /* legal ncbi2na alphabet */
+    for ( i = 0, p = ncbi2na; p [ 0 ] != 0; ++ i, ++ p )
+    {
+        ch = p [ 0 ];
+        fasta_2na_map [ ch ] = fasta_2na_map [ tolower ( ch ) ] = ( int8_t ) i;
+    }
+        
+    /* legal ncbi4na alphabet */
+    for ( i = 0, p = ncbi4na; p [ 0 ] != 0; ++ i, ++ p )
+    {
+        ch = p [ 0 ];
+        fasta_4na_map [ ch ] = fasta_4na_map [ tolower ( ch ) ] = ( int8_t ) i;
+    }
+
+    /* byte swap the 2na expand map */
+    for ( i = 0; i < 256; ++ i )
+        expand_2na [ i ] = bswap_16 ( expand_2na [ i ] );
+}
+
+/* NucStrstrMake
+ *  prepares search by parsing expression query string
+ *  returns error if conversion was not possible.
+ *
+ *  "nss" [ OUT ] - return parameter for one-time search handle
+ *
+ *  "positional" [ IN ] - if non-zero, build an expression tree
+ *  to return found position rather than simply a Boolean found.
+ *  see NucStrstrSearch.
+ *
+ *  "query" [ IN ] and "len" [ IN ] - query string expression, such that:
+ *       expr           : <primary_expr>
+ *                      | <primary_expr> <boolean_op> <expr>
+ *       primary_expr   : FASTA
+ *                      | "'" FASTA "'"
+ *                      | '"' FASTA '"'
+ *                      | '(' <expr> ')'
+ *       boolean_op     : '&', '|', '&&', '||'
+ *
+ *  return values:
+ *    EINVAL - invalid parameter or invalid expression
+ */
+LIB_EXPORT int CC NucStrstrMake ( NucStrstr **nss, int positional,
+    const char *query, unsigned int len )
+{
+    if ( nss != NULL )
+    {
+        if ( query != NULL && len != 0 )
+        {
+            int status = 0;
+            const char *end;
+
+            if ( fasta_2na_map [ 0 ] == 0 )
+                NucStrstrInit ();
+
+            end = query + len;
+            query = nss_expr ( query, end, nss, & status, positional );
+            if ( status == 0 )
+            {
+                if ( query == end )
+                    return 0;
+
+                status = EINVAL;
+            }
+
+            NucStrstrWhack ( * nss );
+            * nss = NULL;
+            return status;
+        }
+
+        * nss = NULL;
+    }
+    return EINVAL;
+}
+
+/* NucStrstrWhack
+ *  discard structure when no longer needed
+ */
+LIB_EXPORT void CC NucStrstrWhack ( NucStrstr *self )
+{
+    if ( self != NULL )
+    {
+        switch ( self -> fasta . type )
+        {
+        case type_2na_64:
+        case type_4na_64:
+        case type_2na_8:
+        case type_2na_16:
+        case type_2na_32:
+        case type_2na_128:
+        case type_4na_16:
+        case type_4na_32:
+        case type_4na_128:
+        case type_2na_pos:
+        case type_4na_pos:
+#if ! USE_MEMALIGN
+            self = self -> fasta . u . outer;
+#endif
+            break;
+        case type_OP:
+            NucStrstrWhack ( self -> boolean . left );
+            NucStrstrWhack ( self -> boolean . right );
+            break;
+        case type_EXPR:
+            NucStrstrWhack ( self -> sub . expr );
+        }
+
+        free ( self );
+    }
+}
+
+
+                        
+/*--------------------------------------------------------------------------
+ * expression evaluation
+ */
+
+
+#if ENDLESS_BUFFER
+static __inline__
+__m128i prime_buffer_2na ( const uint8_t *src, const uint8_t *ignore )
+{
+    __m128i buffer;
+    ( void ) ignore;
+    if ( ( ( size_t ) src & 15 ) == 0 )
+        buffer = _mm_load_si128 ( ( const __m128i* ) src );
+    else
+        buffer = _mm_loadu_si128 ( ( const __m128i* ) src );
+    return buffer;
+}
+#else
+static __inline__
+__m128i prime_buffer_2na ( const uint8_t *src, const uint8_t *end )
+{
+    size_t bytes;
+    __m128i buffer;
+
+    if ( ( bytes = end - src ) >= 16 )
+    {
+        if ( ( ( size_t ) src & 15 ) == 0 )
+            buffer = _mm_load_si128 ( ( const __m128i* ) src );
+        else
+            buffer = _mm_loadu_si128 ( ( const __m128i* ) src );
+    }
+    else
+    {
+        nucpat_t tmp;
+
+        /* common for Solexa */
+        if ( bytes == 7 )
+        {
+            tmp . b [ 0 ] = src [ 0 ];
+            tmp . b [ 1 ] = src [ 1 ];
+            tmp . b [ 2 ] = src [ 2 ];
+            tmp . b [ 3 ] = src [ 3 ];
+            tmp . b [ 4 ] = src [ 4 ];
+            tmp . b [ 5 ] = src [ 5 ];
+            tmp . b [ 6 ] = src [ 6 ];
+            tmp . b [ 7 ] = 0;
+            tmp . l [ 1 ] = 0;
+        }
+
+        /* currently only seen for 454 */
+        else
+        {
+            memmove ( tmp . b, src, bytes );
+            memset ( & tmp . b [ bytes ], 0, sizeof tmp . b - bytes );
+        }
+
+        buffer = _mm_loadu_si128 ( ( const __m128i* ) tmp . b );
+    }
+    return buffer;
+}
+#endif
+
+#define prime_registers( self ) \
+    p0 = _mm_load_si128 ( ( const __m128i* ) self -> query [ 0 ] . pattern . b ); \
+    m0 = _mm_load_si128 ( ( const __m128i* ) self -> query [ 0 ] . mask . b ); \
+    p1 = _mm_load_si128 ( ( const __m128i* ) self -> query [ 1 ] . pattern . b ); \
+    m1 = _mm_load_si128 ( ( const __m128i* ) self -> query [ 1 ] . mask . b ); \
+    p2 = _mm_load_si128 ( ( const __m128i* ) self -> query [ 2 ] . pattern . b ); \
+    m2 = _mm_load_si128 ( ( const __m128i* ) self -> query [ 2 ] . mask . b ); \
+    p3 = _mm_load_si128 ( ( const __m128i* ) self -> query [ 3 ] . pattern . b ); \
+    m3 = _mm_load_si128 ( ( const __m128i* ) self -> query [ 3 ] . mask . b )
+
+static
+int eval_2na_8 ( const NucStrFastaExpr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len )
+{
+#define qbytes 1
+#define _mm_cmpeq_epi( a, b ) \
+    _mm_cmpeq_epi8 ( a, b )
+#if NEVER_MATCH
+#define res_adj( res ) \
+    res = 0
+#else
+#define res_adj( res ) \
+    ( ( void ) 0 )
+#endif
+
+    /* SSE registers */
+    nucreg_t buffer, ri;
+    nucreg_t p0, p1, p2, p3, m0, m1, m2, m3;
+
+    /* result registers */
+    int ra, rb, rc, rd;
+
+    /* used for shifting buffer, testing exit */
+    unsigned int num_passes, stop;
+
+    /* kludge for streaming in a byte at a time
+       only needed when qbytes > 1 */
+#if qbytes > 1
+    int slam;
+    const uint8_t *p;
+#endif
+
+    const uint8_t *end, *src;
+    unsigned int qlen = self -> size;
+
+    /* this test is performed outside */
+    assert ( len >= qlen );
+
+    /* the effective length of the sequence,
+       including leading bases we'll ignore */
+    len += pos;
+
+    /* convert source pointer */
+    src = ( const uint8_t* ) ncbi2na + ( pos >> 2 );
+
+    /* stop testing when position passes this point */
+    stop = len - qlen;
+
+    /* the sequence end pointer */
+    end = ( const uint8_t* ) ncbi2na + ( ( len + 3 ) >> 2 );
+
+    /* prime the buffer */
+    buffer = prime_buffer_2na ( src, end );
+    src += 16;
+#if qbytes > 1
+    p = src;
+
+    /* pre-load slam for single byte streaming */
+    if ( src < end )
+        slam = ( int ) src [ -1 ] << 8;
+#endif
+
+    /* prime the registers */
+    prime_registers ( self );
+
+    /* enter the loop at an appropriate offset */
+    ra = rb = rc = 0;
+#if qbytes == 16
+    num_passes = ( stop - pos + 7 ) >> 2;
+#else
+    num_passes = qbytes;
+#endif
+
+    /* for reporting - give a buffer alignment */
+    ALIGN_2NA_HEADER ( buffer, pos & ~ 3, len );
+    switch ( pos & 3 )
+    {
+    default:
+
+        /* outer loop - performs whole buffer loads */
+        while ( 1 )
+        {
+            num_passes = qbytes;
+
+            /* inner loop - shifts in one byte at a time */
+            while ( 1 )
+            {
+                /* for reporting - give a buffer alignment */
+                ALIGN_2NA_HEADER ( buffer, pos, len );
+
+                /* perform comparisons */
+    case 0:
+                ri = _mm_and_si128 ( buffer, m0 );
+                ri = _mm_cmpeq_epi ( ri, p0 );
+                ra = _mm_movemask_epi8 ( ri );
+                res_adj ( ra );
+                ALIGN_2NA_RESULT ( buffer, p0, m0, ri, ra );
+    case 1:
+                ri = _mm_and_si128 ( buffer, m1 );
+                ri = _mm_cmpeq_epi ( ri, p1 );
+                rb = _mm_movemask_epi8 ( ri );
+                res_adj ( rb );
+                ALIGN_2NA_RESULT ( buffer, p1, m1, ri, rb );
+    case 2:
+                ri = _mm_and_si128 ( buffer, m2 );
+                ri = _mm_cmpeq_epi ( ri, p2 );
+                rc = _mm_movemask_epi8 ( ri );
+                res_adj ( rc );
+                ALIGN_2NA_RESULT ( buffer, p2, m2, ri, rc );
+    case 3:
+                ri = _mm_and_si128 ( buffer, m3 );
+                ri = _mm_cmpeq_epi ( ri, p3 );
+                rd = _mm_movemask_epi8 ( ri );
+                res_adj ( rd );
+                ALIGN_2NA_RESULT ( buffer, p3, m3, ri, rd );
+
+                /* adjust pos */
+                pos &= ~ 3;
+
+                /* test for any promising results */
+                if ( ( ra | rb | rc | rd ) != 0 )
+                {
+#if qbytes == 16
+                    switch ( stop - pos )
+                    {
+                    default:
+                        return 1;
+                    case 2:
+                        if ( rc != 0 ) return 1;
+                    case 1:
+                        if ( rb != 0 ) return 1;
+                    case 0:
+                        if ( ra != 0 ) return 1;
+                    }
+                    return 0;
+#else
+                    /* extract first non-zero bit from results
+                       where result is all zeros, bit will be -1 */
+                    int fa = uint16_lsbit ( ( uint16_t ) ra );
+                    int fb = uint16_lsbit ( ( uint16_t ) rb );
+                    int fc = uint16_lsbit ( ( uint16_t ) rc );
+                    int fd = uint16_lsbit ( ( uint16_t ) rd );
+
+                    /* convert bit number into number of bases
+                       from current position. undefined where
+                       bit is negative, but unimportant also */
+                    fa = ( fa << 2 ) + 0;
+                    fb = ( fb << 2 ) + 1;
+                    fc = ( fc << 2 ) + 2;
+                    fd = ( fd << 2 ) + 3;
+
+                    /* test for any case where result was non-zero
+                       and the resultant base index is within range */
+                    if ( ra != 0 && pos + fa <= stop ) return 1;
+                    if ( rb != 0 && pos + fb <= stop ) return 1;
+                    if ( rc != 0 && pos + fc <= stop ) return 1;
+                    if ( rd != 0 && pos + fd <= stop ) return 1;
+#endif
+                }
+
+                /* advance pos */
+                pos += 4;
+
+                /* if no further comparisons are possible */
+                if ( pos > stop )
+                    return 0;
+
+                /* if all shifting passes are complete */
+                if ( -- num_passes == 0 )
+                    break;
+
+#if qbytes > 1
+                /* shift buffer */
+                buffer = _mm_srli_si128 ( buffer, 1 );
+
+                /* bring in new byte */
+                if ( p < end )
+                {
+                    slam >>= 8;
+                    slam |= ( int ) p [ 0 ] << 8;
+                    buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                }
+                
+                /* always increment source */
+                ++ p;
+#endif
+            }
+
+            /* want to reload buffer */
+            if ( src >= end )
+                break;
+
+            /* advance position */
+            pos += ( 16 - qbytes ) << 2;
+            if ( pos > stop )
+                break;
+
+            /* reload buffer */
+#if RELOAD_BUFFER || qbytes == 1
+            buffer = prime_buffer_2na ( src, end );
+#elif qbytes == 16
+            assert ( 0 );
+#else
+            if ( p - src < 3 )
+                buffer = prime_buffer_2na ( src, end );
+            else
+            {
+                if ( ( ( size_t ) ( p - src ) & 1 ) != 0 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 1 );
+                    if ( p < end )
+                    {
+                        slam >>= 8;
+                        slam |= ( int ) p [ 0 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                    ++ p;
+                }
+
+                if ( src + 16 <= end ) switch ( p - src )
+                {
+                case 4:
+                    buffer = _mm_srli_si128 ( buffer, 12 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 5 ], 7 );
+                    break;
+                case 6:
+                    buffer = _mm_srli_si128 ( buffer, 10 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 7 );
+                    break;
+                case 8:
+                    buffer = _mm_srli_si128 ( buffer, 8 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 7 );
+                    break;
+                case 10:
+                    buffer = _mm_srli_si128 ( buffer, 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 7 );
+                    break;
+                case 12:
+                    buffer = _mm_srli_si128 ( buffer, 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 7 );
+                    break;
+                case 14:
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 7 );
+                    break;
+                }
+
+                else for ( ; p - src < 16; p += 2 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    if ( p < end )
+                    {
+                        slam = p [ 0 ];
+                        if ( p + 1 < end )
+                            slam |= ( int ) p [ 1 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                }
+            }
+#endif
+
+            /* adjust pointers */
+            src += 16;
+#if qbytes > 1
+            p = src;
+            if ( src < end )
+                slam = ( int ) src [ -1 ] << 8;
+#endif
+        }
+    }
+
+#undef qbytes
+#undef _mm_cmpeq_epi
+#undef res_adj
+
+    return 0;
+}
+
+static
+int eval_2na_16 ( const NucStrFastaExpr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len )
+{
+#define qbytes 2
+#define _mm_cmpeq_epi( a, b ) \
+    _mm_cmpeq_epi16 ( a, b )
+#if NEVER_MATCH
+#define res_adj( res ) \
+    res = 0
+#else
+#define res_adj( res ) \
+    ( ( void ) 0 )
+#endif
+
+    /* SSE registers */
+    nucreg_t buffer, ri;
+    nucreg_t p0, p1, p2, p3, m0, m1, m2, m3;
+
+    /* result registers */
+    int ra, rb, rc, rd;
+
+    /* used for shifting buffer, testing exit */
+    unsigned int num_passes, stop;
+
+    /* kludge for streaming in a byte at a time
+       only needed when qbytes > 1 */
+#if qbytes > 1
+    int slam;
+    const uint8_t *p;
+#endif
+
+    const uint8_t *end, *src;
+    unsigned int qlen = self -> size;
+
+    /* this test is performed outside */
+    assert ( len >= qlen );
+
+    /* the effective length of the sequence,
+       including leading bases we'll ignore */
+    len += pos;
+
+    /* convert source pointer */
+    src = ( const uint8_t* ) ncbi2na + ( pos >> 2 );
+
+    /* stop testing when position passes this point */
+    stop = len - qlen;
+
+    /* the sequence end pointer */
+    end = ( const uint8_t* ) ncbi2na + ( ( len + 3 ) >> 2 );
+
+    /* prime the buffer */
+    buffer = prime_buffer_2na ( src, end );
+    src += 16;
+#if qbytes > 1
+    p = src;
+
+    /* pre-load slam for single byte streaming */
+    if ( src < end )
+        slam = ( int ) src [ -1 ] << 8;
+#endif
+
+    /* prime the registers */
+    prime_registers ( self );
+
+    /* enter the loop at an appropriate offset */
+    ra = rb = rc = 0;
+#if qbytes == 16
+    num_passes = ( stop - pos + 7 ) >> 2;
+#else
+    num_passes = qbytes;
+#endif
+
+    /* for reporting - give a buffer alignment */
+    ALIGN_2NA_HEADER ( buffer, pos & ~ 3, len );
+    switch ( pos & 3 )
+    {
+    default:
+
+        /* outer loop - performs whole buffer loads */
+        while ( 1 )
+        {
+            num_passes = qbytes;
+
+            /* inner loop - shifts in one byte at a time */
+            while ( 1 )
+            {
+                /* for reporting - give a buffer alignment */
+                ALIGN_2NA_HEADER ( buffer, pos, len );
+
+                /* perform comparisons */
+    case 0:
+                ri = _mm_and_si128 ( buffer, m0 );
+                ri = _mm_cmpeq_epi ( ri, p0 );
+                ra = _mm_movemask_epi8 ( ri );
+                res_adj ( ra );
+                ALIGN_2NA_RESULT ( buffer, p0, m0, ri, ra );
+    case 1:
+                ri = _mm_and_si128 ( buffer, m1 );
+                ri = _mm_cmpeq_epi ( ri, p1 );
+                rb = _mm_movemask_epi8 ( ri );
+                res_adj ( rb );
+                ALIGN_2NA_RESULT ( buffer, p1, m1, ri, rb );
+    case 2:
+                ri = _mm_and_si128 ( buffer, m2 );
+                ri = _mm_cmpeq_epi ( ri, p2 );
+                rc = _mm_movemask_epi8 ( ri );
+                res_adj ( rc );
+                ALIGN_2NA_RESULT ( buffer, p2, m2, ri, rc );
+    case 3:
+                ri = _mm_and_si128 ( buffer, m3 );
+                ri = _mm_cmpeq_epi ( ri, p3 );
+                rd = _mm_movemask_epi8 ( ri );
+                res_adj ( rd );
+                ALIGN_2NA_RESULT ( buffer, p3, m3, ri, rd );
+
+                /* adjust pos */
+                pos &= ~ 3;
+
+                /* test for any promising results */
+                if ( ( ra | rb | rc | rd ) != 0 )
+                {
+#if qbytes == 16
+                    switch ( stop - pos )
+                    {
+                    default:
+                        return 1;
+                    case 2:
+                        if ( rc != 0 ) return 1;
+                    case 1:
+                        if ( rb != 0 ) return 1;
+                    case 0:
+                        if ( ra != 0 ) return 1;
+                    }
+                    return 0;
+#else
+                    /* extract first non-zero bit from results
+                       where result is all zeros, bit will be -1 */
+                    int fa = uint16_lsbit ( ( uint16_t ) ra );
+                    int fb = uint16_lsbit ( ( uint16_t ) rb );
+                    int fc = uint16_lsbit ( ( uint16_t ) rc );
+                    int fd = uint16_lsbit ( ( uint16_t ) rd );
+
+                    /* convert bit number into number of bases
+                       from current position. undefined where
+                       bit is negative, but unimportant also */
+                    fa = ( fa << 2 ) + 0;
+                    fb = ( fb << 2 ) + 1;
+                    fc = ( fc << 2 ) + 2;
+                    fd = ( fd << 2 ) + 3;
+
+                    /* test for any case where result was non-zero
+                       and the resultant base index is within range */
+                    if ( ra != 0 && pos + fa <= stop ) return 1;
+                    if ( rb != 0 && pos + fb <= stop ) return 1;
+                    if ( rc != 0 && pos + fc <= stop ) return 1;
+                    if ( rd != 0 && pos + fd <= stop ) return 1;
+#endif
+                }
+
+                /* advance pos */
+                pos += 4;
+
+                /* if no further comparisons are possible */
+                if ( pos > stop )
+                    return 0;
+
+                /* if all shifting passes are complete */
+                if ( -- num_passes == 0 )
+                    break;
+
+#if qbytes > 1
+                /* shift buffer */
+                buffer = _mm_srli_si128 ( buffer, 1 );
+
+                /* bring in new byte */
+                if ( p < end )
+                {
+                    slam >>= 8;
+                    slam |= ( int ) p [ 0 ] << 8;
+                    buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                }
+                
+                /* always increment source */
+                ++ p;
+#endif
+            }
+
+            /* want to reload buffer */
+            if ( src >= end )
+                break;
+
+            /* advance position */
+            pos += ( 16 - qbytes ) << 2;
+            if ( pos > stop )
+                break;
+
+            /* reload buffer */
+#if RELOAD_BUFFER || qbytes == 1
+            buffer = prime_buffer_2na ( src, end );
+#elif qbytes == 16
+            assert ( 0 );
+#else
+            if ( p - src < 3 )
+                buffer = prime_buffer_2na ( src, end );
+            else
+            {
+                if ( ( ( size_t ) ( p - src ) & 1 ) != 0 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 1 );
+                    if ( p < end )
+                    {
+                        slam >>= 8;
+                        slam |= ( int ) p [ 0 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                    ++ p;
+                }
+
+                if ( src + 16 <= end ) switch ( p - src )
+                {
+                case 4:
+                    buffer = _mm_srli_si128 ( buffer, 12 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 5 ], 7 );
+                    break;
+                case 6:
+                    buffer = _mm_srli_si128 ( buffer, 10 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 7 );
+                    break;
+                case 8:
+                    buffer = _mm_srli_si128 ( buffer, 8 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 7 );
+                    break;
+                case 10:
+                    buffer = _mm_srli_si128 ( buffer, 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 7 );
+                    break;
+                case 12:
+                    buffer = _mm_srli_si128 ( buffer, 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 7 );
+                    break;
+                case 14:
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 7 );
+                    break;
+                }
+
+                else for ( ; p - src < 16; p += 2 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    if ( p < end )
+                    {
+                        slam = p [ 0 ];
+                        if ( p + 1 < end )
+                            slam |= ( int ) p [ 1 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                }
+            }
+#endif
+
+            /* adjust pointers */
+            src += 16;
+#if qbytes > 1
+            p = src;
+            if ( src < end )
+                slam = ( int ) src [ -1 ] << 8;
+#endif
+        }
+    }
+
+#undef qbytes
+#undef _mm_cmpeq_epi
+#undef res_adj
+
+    return 0;
+}
+
+static
+int eval_2na_32 ( const NucStrFastaExpr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len )
+{
+#define qbytes 4
+#define _mm_cmpeq_epi( a, b ) \
+    _mm_cmpeq_epi32 ( a, b )
+#if NEVER_MATCH
+#define res_adj( res ) \
+    res = 0
+#else
+#define res_adj( res ) \
+    ( ( void ) 0 )
+#endif
+
+    /* SSE registers */
+    nucreg_t buffer, ri;
+    nucreg_t p0, p1, p2, p3, m0, m1, m2, m3;
+
+    /* result registers */
+    int ra, rb, rc, rd;
+
+    /* used for shifting buffer, testing exit */
+    unsigned int num_passes, stop;
+
+    /* kludge for streaming in a byte at a time
+       only needed when qbytes > 1 */
+#if qbytes > 1
+    int slam;
+    const uint8_t *p;
+#endif
+
+    const uint8_t *end, *src;
+    unsigned int qlen = self -> size;
+
+    /* this test is performed outside */
+    assert ( len >= qlen );
+
+    /* the effective length of the sequence,
+       including leading bases we'll ignore */
+    len += pos;
+
+    /* convert source pointer */
+    src = ( const uint8_t* ) ncbi2na + ( pos >> 2 );
+
+    /* stop testing when position passes this point */
+    stop = len - qlen;
+
+    /* the sequence end pointer */
+    end = ( const uint8_t* ) ncbi2na + ( ( len + 3 ) >> 2 );
+
+    /* prime the buffer */
+    buffer = prime_buffer_2na ( src, end );
+    src += 16;
+#if qbytes > 1
+    p = src;
+
+    /* pre-load slam for single byte streaming */
+    if ( src < end )
+        slam = ( int ) src [ -1 ] << 8;
+#endif
+
+    /* prime the registers */
+    prime_registers ( self );
+
+    /* enter the loop at an appropriate offset */
+    ra = rb = rc = 0;
+#if qbytes == 16
+    num_passes = ( stop - pos + 7 ) >> 2;
+#else
+    num_passes = qbytes;
+#endif
+
+    /* for reporting - give a buffer alignment */
+    ALIGN_2NA_HEADER ( buffer, pos & ~ 3, len );
+    switch ( pos & 3 )
+    {
+    default:
+
+        /* outer loop - performs whole buffer loads */
+        while ( 1 )
+        {
+            num_passes = qbytes;
+
+            /* inner loop - shifts in one byte at a time */
+            while ( 1 )
+            {
+                /* for reporting - give a buffer alignment */
+                ALIGN_2NA_HEADER ( buffer, pos, len );
+
+                /* perform comparisons */
+    case 0:
+                ri = _mm_and_si128 ( buffer, m0 );
+                ri = _mm_cmpeq_epi ( ri, p0 );
+                ra = _mm_movemask_epi8 ( ri );
+                res_adj ( ra );
+                ALIGN_2NA_RESULT ( buffer, p0, m0, ri, ra );
+    case 1:
+                ri = _mm_and_si128 ( buffer, m1 );
+                ri = _mm_cmpeq_epi ( ri, p1 );
+                rb = _mm_movemask_epi8 ( ri );
+                res_adj ( rb );
+                ALIGN_2NA_RESULT ( buffer, p1, m1, ri, rb );
+    case 2:
+                ri = _mm_and_si128 ( buffer, m2 );
+                ri = _mm_cmpeq_epi ( ri, p2 );
+                rc = _mm_movemask_epi8 ( ri );
+                res_adj ( rc );
+                ALIGN_2NA_RESULT ( buffer, p2, m2, ri, rc );
+    case 3:
+                ri = _mm_and_si128 ( buffer, m3 );
+                ri = _mm_cmpeq_epi ( ri, p3 );
+                rd = _mm_movemask_epi8 ( ri );
+                res_adj ( rd );
+                ALIGN_2NA_RESULT ( buffer, p3, m3, ri, rd );
+
+                /* adjust pos */
+                pos &= ~ 3;
+
+                /* test for any promising results */
+                if ( ( ra | rb | rc | rd ) != 0 )
+                {
+#if qbytes == 16
+                    switch ( stop - pos )
+                    {
+                    default:
+                        return 1;
+                    case 2:
+                        if ( rc != 0 ) return 1;
+                    case 1:
+                        if ( rb != 0 ) return 1;
+                    case 0:
+                        if ( ra != 0 ) return 1;
+                    }
+                    return 0;
+#else
+                    /* extract first non-zero bit from results
+                       where result is all zeros, bit will be -1 */
+                    int fa = uint16_lsbit ( ( uint16_t ) ra );
+                    int fb = uint16_lsbit ( ( uint16_t ) rb );
+                    int fc = uint16_lsbit ( ( uint16_t ) rc );
+                    int fd = uint16_lsbit ( ( uint16_t ) rd );
+
+                    /* convert bit number into number of bases
+                       from current position. undefined where
+                       bit is negative, but unimportant also */
+                    fa = ( fa << 2 ) + 0;
+                    fb = ( fb << 2 ) + 1;
+                    fc = ( fc << 2 ) + 2;
+                    fd = ( fd << 2 ) + 3;
+
+                    /* test for any case where result was non-zero
+                       and the resultant base index is within range */
+                    if ( ra != 0 && pos + fa <= stop ) return 1;
+                    if ( rb != 0 && pos + fb <= stop ) return 1;
+                    if ( rc != 0 && pos + fc <= stop ) return 1;
+                    if ( rd != 0 && pos + fd <= stop ) return 1;
+#endif
+                }
+
+                /* advance pos */
+                pos += 4;
+
+                /* if no further comparisons are possible */
+                if ( pos > stop )
+                    return 0;
+
+                /* if all shifting passes are complete */
+                if ( -- num_passes == 0 )
+                    break;
+
+#if qbytes > 1
+                /* shift buffer */
+                buffer = _mm_srli_si128 ( buffer, 1 );
+
+                /* bring in new byte */
+                if ( p < end )
+                {
+                    slam >>= 8;
+                    slam |= ( int ) p [ 0 ] << 8;
+                    buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                }
+                
+                /* always increment source */
+                ++ p;
+#endif
+            }
+
+            /* want to reload buffer */
+            if ( src >= end )
+                break;
+
+            /* advance position */
+            pos += ( 16 - qbytes ) << 2;
+            if ( pos > stop )
+                break;
+
+            /* reload buffer */
+#if RELOAD_BUFFER || qbytes == 1
+            buffer = prime_buffer_2na ( src, end );
+#elif qbytes == 16
+            assert ( 0 );
+#else
+            if ( p - src < 3 )
+                buffer = prime_buffer_2na ( src, end );
+            else
+            {
+                if ( ( ( size_t ) ( p - src ) & 1 ) != 0 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 1 );
+                    if ( p < end )
+                    {
+                        slam >>= 8;
+                        slam |= ( int ) p [ 0 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                    ++ p;
+                }
+
+                if ( src + 16 <= end ) switch ( p - src )
+                {
+                case 4:
+                    buffer = _mm_srli_si128 ( buffer, 12 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 5 ], 7 );
+                    break;
+                case 6:
+                    buffer = _mm_srli_si128 ( buffer, 10 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 7 );
+                    break;
+                case 8:
+                    buffer = _mm_srli_si128 ( buffer, 8 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 7 );
+                    break;
+                case 10:
+                    buffer = _mm_srli_si128 ( buffer, 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 7 );
+                    break;
+                case 12:
+                    buffer = _mm_srli_si128 ( buffer, 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 7 );
+                    break;
+                case 14:
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 7 );
+                    break;
+                }
+
+                else for ( ; p - src < 16; p += 2 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    if ( p < end )
+                    {
+                        slam = p [ 0 ];
+                        if ( p + 1 < end )
+                            slam |= ( int ) p [ 1 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                }
+            }
+#endif
+
+            /* adjust pointers */
+            src += 16;
+#if qbytes > 1
+            p = src;
+            if ( src < end )
+                slam = ( int ) src [ -1 ] << 8;
+#endif
+        }
+    }
+
+#undef qbytes
+#undef _mm_cmpeq_epi
+#undef res_adj
+
+    return 0;
+}
+
+static
+int eval_2na_64 ( const NucStrFastaExpr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len )
+{
+#define qbytes 8
+#define _mm_cmpeq_epi( a, b ) \
+    _mm_cmpeq_epi32 ( a, b )
+#if NEVER_MATCH
+#define res_adj( res ) \
+    res = 0
+#else
+#define res_adj( res ) \
+    ( ( res ) &= ( ( res ) & 0x0F0F ) << 4, \
+      ( res ) |= ( res ) >> 4 )
+#endif
+
+    /* SSE registers */
+    nucreg_t buffer, ri;
+    nucreg_t p0, p1, p2, p3, m0, m1, m2, m3;
+
+    /* result registers */
+    int ra, rb, rc, rd;
+
+    /* used for shifting buffer, testing exit */
+    unsigned int num_passes, stop;
+
+    /* kludge for streaming in a byte at a time
+       only needed when qbytes > 1 */
+#if qbytes > 1
+    int slam;
+    const uint8_t *p;
+#endif
+
+    const uint8_t *end, *src;
+    unsigned int qlen = self -> size;
+
+    /* this test is performed outside */
+    assert ( len >= qlen );
+
+    /* the effective length of the sequence,
+       including leading bases we'll ignore */
+    len += pos;
+
+    /* convert source pointer */
+    src = ( const uint8_t* ) ncbi2na + ( pos >> 2 );
+
+    /* stop testing when position passes this point */
+    stop = len - qlen;
+
+    /* the sequence end pointer */
+    end = ( const uint8_t* ) ncbi2na + ( ( len + 3 ) >> 2 );
+
+    /* prime the buffer */
+    buffer = prime_buffer_2na ( src, end );
+    src += 16;
+#if qbytes > 1
+    p = src;
+
+    /* pre-load slam for single byte streaming */
+    if ( src < end )
+        slam = ( int ) src [ -1 ] << 8;
+#endif
+
+    /* prime the registers */
+    prime_registers ( self );
+
+    /* enter the loop at an appropriate offset */
+    ra = rb = rc = 0;
+#if qbytes == 16
+    num_passes = ( stop - pos + 7 ) >> 2;
+#else
+    num_passes = qbytes;
+#endif
+
+    /* for reporting - give a buffer alignment */
+    ALIGN_2NA_HEADER ( buffer, pos & ~ 3, len );
+    switch ( pos & 3 )
+    {
+    default:
+
+        /* outer loop - performs whole buffer loads */
+        while ( 1 )
+        {
+            num_passes = qbytes;
+
+            /* inner loop - shifts in one byte at a time */
+            while ( 1 )
+            {
+                /* for reporting - give a buffer alignment */
+                ALIGN_2NA_HEADER ( buffer, pos, len );
+
+                /* perform comparisons */
+    case 0:
+                ri = _mm_and_si128 ( buffer, m0 );
+                ri = _mm_cmpeq_epi ( ri, p0 );
+                ra = _mm_movemask_epi8 ( ri );
+                res_adj ( ra );
+                ALIGN_2NA_RESULT ( buffer, p0, m0, ri, ra );
+    case 1:
+                ri = _mm_and_si128 ( buffer, m1 );
+                ri = _mm_cmpeq_epi ( ri, p1 );
+                rb = _mm_movemask_epi8 ( ri );
+                res_adj ( rb );
+                ALIGN_2NA_RESULT ( buffer, p1, m1, ri, rb );
+    case 2:
+                ri = _mm_and_si128 ( buffer, m2 );
+                ri = _mm_cmpeq_epi ( ri, p2 );
+                rc = _mm_movemask_epi8 ( ri );
+                res_adj ( rc );
+                ALIGN_2NA_RESULT ( buffer, p2, m2, ri, rc );
+    case 3:
+                ri = _mm_and_si128 ( buffer, m3 );
+                ri = _mm_cmpeq_epi ( ri, p3 );
+                rd = _mm_movemask_epi8 ( ri );
+                res_adj ( rd );
+                ALIGN_2NA_RESULT ( buffer, p3, m3, ri, rd );
+
+                /* adjust pos */
+                pos &= ~ 3;
+
+                /* test for any promising results */
+                if ( ( ra | rb | rc | rd ) != 0 )
+                {
+#if qbytes == 16
+                    switch ( stop - pos )
+                    {
+                    default:
+                        return 1;
+                    case 2:
+                        if ( rc != 0 ) return 1;
+                    case 1:
+                        if ( rb != 0 ) return 1;
+                    case 0:
+                        if ( ra != 0 ) return 1;
+                    }
+                    return 0;
+#else
+                    /* extract first non-zero bit from results
+                       where result is all zeros, bit will be -1 */
+                    int fa = uint16_lsbit ( ( uint16_t ) ra );
+                    int fb = uint16_lsbit ( ( uint16_t ) rb );
+                    int fc = uint16_lsbit ( ( uint16_t ) rc );
+                    int fd = uint16_lsbit ( ( uint16_t ) rd );
+
+                    /* convert bit number into number of bases
+                       from current position. undefined where
+                       bit is negative, but unimportant also */
+                    fa = ( fa << 2 ) + 0;
+                    fb = ( fb << 2 ) + 1;
+                    fc = ( fc << 2 ) + 2;
+                    fd = ( fd << 2 ) + 3;
+
+                    /* test for any case where result was non-zero
+                       and the resultant base index is within range */
+                    if ( ra != 0 && pos + fa <= stop ) return 1;
+                    if ( rb != 0 && pos + fb <= stop ) return 1;
+                    if ( rc != 0 && pos + fc <= stop ) return 1;
+                    if ( rd != 0 && pos + fd <= stop ) return 1;
+#endif
+                }
+
+                /* advance pos */
+                pos += 4;
+
+                /* if no further comparisons are possible */
+                if ( pos > stop )
+                    return 0;
+
+                /* if all shifting passes are complete */
+                if ( -- num_passes == 0 )
+                    break;
+
+#if qbytes > 1
+                /* shift buffer */
+                buffer = _mm_srli_si128 ( buffer, 1 );
+
+                /* bring in new byte */
+                if ( p < end )
+                {
+                    slam >>= 8;
+                    slam |= ( int ) p [ 0 ] << 8;
+                    buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                }
+                
+                /* always increment source */
+                ++ p;
+#endif
+            }
+
+            /* want to reload buffer */
+            if ( src >= end )
+                break;
+
+            /* advance position */
+            pos += ( 16 - qbytes ) << 2;
+            if ( pos > stop )
+                break;
+
+            /* reload buffer */
+#if RELOAD_BUFFER || qbytes == 1
+            buffer = prime_buffer_2na ( src, end );
+#elif qbytes == 16
+            assert ( 0 );
+#else
+            if ( p - src < 3 )
+                buffer = prime_buffer_2na ( src, end );
+            else
+            {
+                if ( ( ( size_t ) ( p - src ) & 1 ) != 0 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 1 );
+                    if ( p < end )
+                    {
+                        slam >>= 8;
+                        slam |= ( int ) p [ 0 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                    ++ p;
+                }
+
+                if ( src + 16 <= end ) switch ( p - src )
+                {
+                case 4:
+                    buffer = _mm_srli_si128 ( buffer, 12 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 5 ], 7 );
+                    break;
+                case 6:
+                    buffer = _mm_srli_si128 ( buffer, 10 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 7 );
+                    break;
+                case 8:
+                    buffer = _mm_srli_si128 ( buffer, 8 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 7 );
+                    break;
+                case 10:
+                    buffer = _mm_srli_si128 ( buffer, 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 7 );
+                    break;
+                case 12:
+                    buffer = _mm_srli_si128 ( buffer, 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 7 );
+                    break;
+                case 14:
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 7 );
+                    break;
+                }
+
+                else for ( ; p - src < 16; p += 2 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    if ( p < end )
+                    {
+                        slam = p [ 0 ];
+                        if ( p + 1 < end )
+                            slam |= ( int ) p [ 1 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                }
+            }
+#endif
+
+            /* adjust pointers */
+            src += 16;
+#if qbytes > 1
+            p = src;
+            if ( src < end )
+                slam = ( int ) src [ -1 ] << 8;
+#endif
+        }
+    }
+
+#undef qbytes
+#undef _mm_cmpeq_epi
+#undef res_adj
+
+    return 0;
+}
+
+static
+int eval_2na_128 ( const NucStrFastaExpr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len )
+{
+#define qbytes 16
+#define _mm_cmpeq_epi( a, b ) \
+    _mm_cmpeq_epi32 ( a, b )
+#if NEVER_MATCH
+#define res_adj( res ) \
+    res = 0
+#else
+#define res_adj( res ) \
+    ( ( res ) = - ( ( ( res ) + 1 ) >> 16 ) )
+#endif
+
+    /* SSE registers */
+    nucreg_t buffer, ri;
+    nucreg_t p0, p1, p2, p3, m0, m1, m2, m3;
+
+    /* result registers */
+    int ra, rb, rc, rd;
+
+    /* used for shifting buffer, testing exit */
+    unsigned int num_passes, stop;
+
+    /* kludge for streaming in a byte at a time
+       only needed when qbytes > 1 */
+#if qbytes > 1
+    int slam;
+    const uint8_t *p;
+#endif
+
+    const uint8_t *end, *src;
+    unsigned int qlen = self -> size;
+
+    /* this test is performed outside */
+    assert ( len >= qlen );
+
+    /* the effective length of the sequence,
+       including leading bases we'll ignore */
+    len += pos;
+
+    /* convert source pointer */
+    src = ( const uint8_t* ) ncbi2na + ( pos >> 2 );
+
+    /* stop testing when position passes this point */
+    stop = len - qlen;
+
+    /* the sequence end pointer */
+    end = ( const uint8_t* ) ncbi2na + ( ( len + 3 ) >> 2 );
+
+    /* prime the buffer */
+    buffer = prime_buffer_2na ( src, end );
+    src += 16;
+#if qbytes > 1
+    p = src;
+
+    /* pre-load slam for single byte streaming */
+    if ( src < end )
+        slam = ( int ) src [ -1 ] << 8;
+#endif
+
+    /* prime the registers */
+    prime_registers ( self );
+
+    /* enter the loop at an appropriate offset */
+    ra = rb = rc = 0;
+#if qbytes == 16
+    num_passes = ( stop - pos + 7 ) >> 2;
+#else
+    num_passes = qbytes;
+#endif
+
+    /* for reporting - give a buffer alignment */
+    ALIGN_2NA_HEADER ( buffer, pos & ~ 3, len );
+    switch ( pos & 3 )
+    {
+    default:
+
+        /* outer loop - performs whole buffer loads */
+        while ( 1 )
+        {
+            num_passes = qbytes;
+
+            /* inner loop - shifts in one byte at a time */
+            while ( 1 )
+            {
+                /* for reporting - give a buffer alignment */
+                ALIGN_2NA_HEADER ( buffer, pos, len );
+
+                /* perform comparisons */
+    case 0:
+                ri = _mm_and_si128 ( buffer, m0 );
+                ri = _mm_cmpeq_epi ( ri, p0 );
+                ra = _mm_movemask_epi8 ( ri );
+                res_adj ( ra );
+                ALIGN_2NA_RESULT ( buffer, p0, m0, ri, ra );
+    case 1:
+                ri = _mm_and_si128 ( buffer, m1 );
+                ri = _mm_cmpeq_epi ( ri, p1 );
+                rb = _mm_movemask_epi8 ( ri );
+                res_adj ( rb );
+                ALIGN_2NA_RESULT ( buffer, p1, m1, ri, rb );
+    case 2:
+                ri = _mm_and_si128 ( buffer, m2 );
+                ri = _mm_cmpeq_epi ( ri, p2 );
+                rc = _mm_movemask_epi8 ( ri );
+                res_adj ( rc );
+                ALIGN_2NA_RESULT ( buffer, p2, m2, ri, rc );
+    case 3:
+                ri = _mm_and_si128 ( buffer, m3 );
+                ri = _mm_cmpeq_epi ( ri, p3 );
+                rd = _mm_movemask_epi8 ( ri );
+                res_adj ( rd );
+                ALIGN_2NA_RESULT ( buffer, p3, m3, ri, rd );
+
+                /* adjust pos */
+                pos &= ~ 3;
+
+                /* test for any promising results */
+                if ( ( ra | rb | rc | rd ) != 0 )
+                {
+#if qbytes == 16
+                    switch ( stop - pos )
+                    {
+                    default:
+                        return 1;
+                    case 2:
+                        if ( rc != 0 ) return 1;
+                    case 1:
+                        if ( rb != 0 ) return 1;
+                    case 0:
+                        if ( ra != 0 ) return 1;
+                    }
+                    return 0;
+#else
+                    /* extract first non-zero bit from results
+                       where result is all zeros, bit will be -1 */
+                    int fa = uint16_lsbit ( ( uint16_t ) ra );
+                    int fb = uint16_lsbit ( ( uint16_t ) rb );
+                    int fc = uint16_lsbit ( ( uint16_t ) rc );
+                    int fd = uint16_lsbit ( ( uint16_t ) rd );
+
+                    /* convert bit number into number of bases
+                       from current position. undefined where
+                       bit is negative, but unimportant also */
+                    fa = ( fa << 2 ) + 0;
+                    fb = ( fb << 2 ) + 1;
+                    fc = ( fc << 2 ) + 2;
+                    fd = ( fd << 2 ) + 3;
+
+                    /* test for any case where result was non-zero
+                       and the resultant base index is within range */
+                    if ( ra != 0 && pos + fa <= stop ) return 1;
+                    if ( rb != 0 && pos + fb <= stop ) return 1;
+                    if ( rc != 0 && pos + fc <= stop ) return 1;
+                    if ( rd != 0 && pos + fd <= stop ) return 1;
+#endif
+                }
+
+                /* advance pos */
+                pos += 4;
+
+                /* if no further comparisons are possible */
+                if ( pos > stop )
+                    return 0;
+
+                /* if all shifting passes are complete */
+                if ( -- num_passes == 0 )
+                    break;
+
+#if qbytes > 1
+                /* shift buffer */
+                buffer = _mm_srli_si128 ( buffer, 1 );
+
+                /* bring in new byte */
+                if ( p < end )
+                {
+                    slam >>= 8;
+                    slam |= ( int ) p [ 0 ] << 8;
+                    buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                }
+                
+                /* always increment source */
+                ++ p;
+#endif
+            }
+
+            /* want to reload buffer */
+            if ( src >= end )
+                break;
+
+            /* advance position */
+            pos += ( 16 - qbytes ) << 2;
+            if ( pos > stop )
+                break;
+
+            /* reload buffer */
+#if RELOAD_BUFFER || qbytes == 1
+            buffer = prime_buffer_2na ( src, end );
+#elif qbytes == 16
+            assert ( 0 );
+#else
+            if ( p - src < 3 )
+                buffer = prime_buffer_2na ( src, end );
+            else
+            {
+                if ( ( ( size_t ) ( p - src ) & 1 ) != 0 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 1 );
+                    if ( p < end )
+                    {
+                        slam >>= 8;
+                        slam |= ( int ) p [ 0 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                    ++ p;
+                }
+
+                if ( src + 16 <= end ) switch ( p - src )
+                {
+                case 4:
+                    buffer = _mm_srli_si128 ( buffer, 12 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 5 ], 7 );
+                    break;
+                case 6:
+                    buffer = _mm_srli_si128 ( buffer, 10 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 7 );
+                    break;
+                case 8:
+                    buffer = _mm_srli_si128 ( buffer, 8 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 7 );
+                    break;
+                case 10:
+                    buffer = _mm_srli_si128 ( buffer, 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 7 );
+                    break;
+                case 12:
+                    buffer = _mm_srli_si128 ( buffer, 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 7 );
+                    break;
+                case 14:
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 7 );
+                    break;
+                }
+
+                else for ( ; p - src < 16; p += 2 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    if ( p < end )
+                    {
+                        slam = p [ 0 ];
+                        if ( p + 1 < end )
+                            slam |= ( int ) p [ 1 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                }
+            }
+#endif
+
+            /* adjust pointers */
+            src += 16;
+#if qbytes > 1
+            p = src;
+            if ( src < end )
+                slam = ( int ) src [ -1 ] << 8;
+#endif
+        }
+    }
+
+#undef qbytes
+#undef _mm_cmpeq_epi
+#undef res_adj
+
+    return 0;
+}
+
+static
+int eval_2na_pos ( const NucStrFastaExpr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len )
+{
+#define positional 1
+#define qbytes 16
+#define _mm_cmpeq_epi( a, b ) \
+    _mm_cmpeq_epi32 ( a, b )
+#if NEVER_MATCH
+#define res_adj( res ) \
+    res = 0
+#else
+#define res_adj( res ) \
+    ( ( res ) = - ( ( ( res ) + 1 ) >> 16 ) )
+#endif
+
+    /* SSE registers */
+    nucreg_t buffer, ri;
+    nucreg_t p0, p1, p2, p3, m0, m1, m2, m3;
+
+    /* result registers */
+    int ra, rb, rc, rd;
+
+    /* used for shifting buffer, testing exit */
+    unsigned int num_passes, stop;
+
+    /* used to hold entry position */
+#if positional
+    unsigned int start;
+#endif
+
+    /* kludge for streaming in a byte at a time
+       only needed when qbytes > 1 */
+#if qbytes > 1
+    int slam;
+    const uint8_t *p;
+#endif
+
+    const uint8_t *end, *src;
+    unsigned int qlen = self -> size;
+
+    /* this test is performed outside */
+    assert ( len >= qlen );
+
+    /* the effective length of the sequence,
+       including leading bases we'll ignore */
+    len += pos;
+
+    /* hold starting position */
+#if positional
+    start = pos;
+#endif
+
+    /* convert source pointer */
+    src = ( const uint8_t* ) ncbi2na + ( pos >> 2 );
+
+    /* stop testing when position passes this point */
+    stop = len - qlen;
+
+    /* the sequence end pointer */
+    end = ( const uint8_t* ) ncbi2na + ( ( len + 3 ) >> 2 );
+
+    /* prime the buffer */
+    buffer = prime_buffer_2na ( src, end );
+    src += 16;
+#if qbytes > 1
+    p = src;
+
+    /* pre-load slam for single byte streaming */
+    if ( src < end )
+        slam = ( int ) src [ -1 ] << 8;
+#endif
+
+    /* prime the registers */
+    prime_registers ( self );
+
+    /* enter the loop at an appropriate offset */
+    ra = rb = rc = 0;
+#if qbytes == 16
+    num_passes = ( stop - pos + 7 ) >> 2;
+#else
+    num_passes = qbytes;
+#endif
+
+    /* for reporting - give a buffer alignment */
+    ALIGN_2NA_HEADER ( buffer, pos & ~ 3, len );
+    switch ( pos & 3 )
+    {
+    default:
+
+        /* outer loop - performs whole buffer loads */
+        while ( 1 )
+        {
+            num_passes = qbytes;
+
+            /* inner loop - shifts in one byte at a time */
+            while ( 1 )
+            {
+                /* for reporting - give a buffer alignment */
+                ALIGN_2NA_HEADER ( buffer, pos, len );
+
+                /* perform comparisons */
+    case 0:
+                ri = _mm_and_si128 ( buffer, m0 );
+                ri = _mm_cmpeq_epi ( ri, p0 );
+                ra = _mm_movemask_epi8 ( ri );
+                res_adj ( ra );
+                ALIGN_2NA_RESULT ( buffer, p0, m0, ri, ra );
+    case 1:
+                ri = _mm_and_si128 ( buffer, m1 );
+                ri = _mm_cmpeq_epi ( ri, p1 );
+                rb = _mm_movemask_epi8 ( ri );
+                res_adj ( rb );
+                ALIGN_2NA_RESULT ( buffer, p1, m1, ri, rb );
+    case 2:
+                ri = _mm_and_si128 ( buffer, m2 );
+                ri = _mm_cmpeq_epi ( ri, p2 );
+                rc = _mm_movemask_epi8 ( ri );
+                res_adj ( rc );
+                ALIGN_2NA_RESULT ( buffer, p2, m2, ri, rc );
+    case 3:
+                ri = _mm_and_si128 ( buffer, m3 );
+                ri = _mm_cmpeq_epi ( ri, p3 );
+                rd = _mm_movemask_epi8 ( ri );
+                res_adj ( rd );
+                ALIGN_2NA_RESULT ( buffer, p3, m3, ri, rd );
+
+                /* adjust pos */
+                pos &= ~ 3;
+
+                /* test for any promising results */
+                if ( ( ra | rb | rc | rd ) != 0 )
+                {
+#if positional
+                    switch ( stop - pos )
+                    {
+                    case 0:
+                        if ( ra != 0 ) return pos - start + 1;
+                        break;
+                    case 1:
+                        if ( ra != 0 ) return pos - start + 1;
+                        if ( rb != 0 ) return pos - start + 2;
+                        break;
+                    case 2:
+                        if ( ra != 0 ) return pos - start + 1;
+                        if ( rb != 0 ) return pos - start + 2;
+                        if ( rc != 0 ) return pos - start + 3;
+                        break;
+                    default:
+                        if ( ra != 0 ) return pos - start + 1;
+                        if ( rb != 0 ) return pos - start + 2;
+                        if ( rc != 0 ) return pos - start + 3;
+                        if ( rd != 0 ) return pos - start + 4;
+                    }
+                    return 0;
+#elif qbytes == 16
+                    switch ( stop - pos )
+                    {
+                    default:
+                        return 1;
+                    case 2:
+                        if ( rc != 0 ) return 1;
+                    case 1:
+                        if ( rb != 0 ) return 1;
+                    case 0:
+                        if ( ra != 0 ) return 1;
+                    }
+                    return 0;
+#else
+                    /* extract first non-zero bit from results
+                       where result is all zeros, bit will be -1 */
+                    int fa = uint16_lsbit ( ( uint16_t ) ra );
+                    int fb = uint16_lsbit ( ( uint16_t ) rb );
+                    int fc = uint16_lsbit ( ( uint16_t ) rc );
+                    int fd = uint16_lsbit ( ( uint16_t ) rd );
+
+                    /* convert bit number into number of bases
+                       from current position. undefined where
+                       bit is negative, but unimportant also */
+                    fa = ( fa << 2 ) + 0;
+                    fb = ( fb << 2 ) + 1;
+                    fc = ( fc << 2 ) + 2;
+                    fd = ( fd << 2 ) + 3;
+
+                    /* test for any case where result was non-zero
+                       and the resultant base index is within range */
+                    if ( ra != 0 && pos + fa <= stop ) return 1;
+                    if ( rb != 0 && pos + fb <= stop ) return 1;
+                    if ( rc != 0 && pos + fc <= stop ) return 1;
+                    if ( rd != 0 && pos + fd <= stop ) return 1;
+#endif
+                }
+
+                /* advance pos */
+                pos += 4;
+
+                /* if no further comparisons are possible */
+                if ( pos > stop )
+                    return 0;
+
+                /* if all shifting passes are complete */
+                if ( -- num_passes == 0 )
+                    break;
+
+#if qbytes > 1
+                /* shift buffer */
+                buffer = _mm_srli_si128 ( buffer, 1 );
+
+                /* bring in new byte */
+                if ( p < end )
+                {
+                    slam >>= 8;
+                    slam |= ( int ) p [ 0 ] << 8;
+                    buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                }
+                
+                /* always increment source */
+                ++ p;
+#endif
+            }
+
+            /* want to reload buffer */
+            if ( src >= end )
+                break;
+
+            /* advance position */
+            pos += ( 16 - qbytes ) << 2;
+            if ( pos > stop )
+                break;
+
+            /* reload buffer */
+#if RELOAD_BUFFER || qbytes == 1
+            buffer = prime_buffer_2na ( src, end );
+#elif qbytes == 16
+            assert ( 0 );
+#else
+            if ( p - src < 3 )
+                buffer = prime_buffer_2na ( src, end );
+            else
+            {
+                if ( ( ( size_t ) ( p - src ) & 1 ) != 0 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 1 );
+                    if ( p < end )
+                    {
+                        slam >>= 8;
+                        slam |= ( int ) p [ 0 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                    ++ p;
+                }
+
+                if ( src + 16 <= end ) switch ( p - src )
+                {
+                case 4:
+                    buffer = _mm_srli_si128 ( buffer, 12 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 5 ], 7 );
+                    break;
+                case 6:
+                    buffer = _mm_srli_si128 ( buffer, 10 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 3 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 4 ], 7 );
+                    break;
+                case 8:
+                    buffer = _mm_srli_si128 ( buffer, 8 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 3 ], 7 );
+                    break;
+                case 10:
+                    buffer = _mm_srli_si128 ( buffer, 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 5 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 2 ], 7 );
+                    break;
+                case 12:
+                    buffer = _mm_srli_si128 ( buffer, 4 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 6 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 1 ], 7 );
+                    break;
+                case 14:
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    buffer = _mm_insert_epi16 ( buffer, ( ( const uint16_t* ) p ) [ 0 ], 7 );
+                    break;
+                }
+
+                else for ( ; p - src < 16; p += 2 )
+                {
+                    buffer = _mm_srli_si128 ( buffer, 2 );
+                    if ( p < end )
+                    {
+                        slam = p [ 0 ];
+                        if ( p + 1 < end )
+                            slam |= ( int ) p [ 1 ] << 8;
+                        buffer = _mm_insert_epi16 ( buffer, slam, 7 );
+                    }
+                }
+            }
+#endif
+
+            /* adjust pointers */
+            src += 16;
+#if qbytes > 1
+            p = src;
+            if ( src < end )
+                slam = ( int ) src [ -1 ] << 8;
+#endif
+        }
+    }
+
+#undef positional
+#undef qbytes
+#undef _mm_cmpeq_epi
+#undef res_adj
+
+    return 0;
+}
+
+
+#if ENDLESS_BUFFER
+static __inline__
+__m128i prime_buffer_4na ( const uint8_t *src, const uint8_t *ignore )
+{
+    nucpat_t tmp;
+    __m128i buffer;
+
+    ( void ) ignore;
+
+    tmp . w [ 0 ] = expand_2na [ src [ 0 ] ];
+    tmp . w [ 1 ] = expand_2na [ src [ 1 ] ];
+    tmp . w [ 2 ] = expand_2na [ src [ 2 ] ];
+    tmp . w [ 3 ] = expand_2na [ src [ 3 ] ];
+    tmp . w [ 4 ] = expand_2na [ src [ 4 ] ];
+    tmp . w [ 5 ] = expand_2na [ src [ 5 ] ];
+    tmp . w [ 6 ] = expand_2na [ src [ 6 ] ];
+    tmp . w [ 7 ] = expand_2na [ src [ 7 ] ];
+
+    buffer = _mm_loadu_si128 ( ( const __m128i* ) tmp . b );
+    return buffer;
+}
+#else
+static __inline__
+__m128i prime_buffer_4na ( const uint8_t *src, const uint8_t *end )
+{
+    nucpat_t tmp;
+    __m128i buffer;
+
+    if ( end - src >= 8 )
+    {
+        tmp . w [ 0 ] = expand_2na [ src [ 0 ] ];
+        tmp . w [ 1 ] = expand_2na [ src [ 1 ] ];
+        tmp . w [ 2 ] = expand_2na [ src [ 2 ] ];
+        tmp . w [ 3 ] = expand_2na [ src [ 3 ] ];
+        tmp . w [ 4 ] = expand_2na [ src [ 4 ] ];
+        tmp . w [ 5 ] = expand_2na [ src [ 5 ] ];
+        tmp . w [ 6 ] = expand_2na [ src [ 6 ] ];
+        tmp . w [ 7 ] = expand_2na [ src [ 7 ] ];
+    }
+    else
+    {
+        tmp . l [ 0 ] = tmp . l [ 1 ] = 0;
+        switch ( end - src )
+        {
+        default:
+            tmp . w [ 6 ] = expand_2na [ src [ 6 ] ];
+        case 6:
+            tmp . w [ 5 ] = expand_2na [ src [ 5 ] ];
+        case 5:
+            tmp . w [ 4 ] = expand_2na [ src [ 4 ] ];
+        case 4:
+            tmp . w [ 3 ] = expand_2na [ src [ 3 ] ];
+        case 3:
+            tmp . w [ 2 ] = expand_2na [ src [ 2 ] ];
+        case 2:
+            tmp . w [ 1 ] = expand_2na [ src [ 1 ] ];
+        case 1:
+            tmp . w [ 0 ] = expand_2na [ src [ 0 ] ];
+            break;
+        }
+    }
+
+    buffer = _mm_loadu_si128 ( ( const __m128i* ) tmp . b );
+    return buffer;
+}
+#endif
+
+static
+int eval_4na_16 ( const NucStrFastaExpr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len )
+{
+#define qbytes 2
+#define _mm_cmpeq_epi( a, b ) \
+    _mm_cmpeq_epi16 ( a, b )
+#if NEVER_MATCH
+#define res_adj( res ) \
+    res = 0
+#else
+#define res_adj( res ) \
+    ( ( void ) 0 )
+#endif
+
+    /* SSE registers */
+    nucreg_t buffer, ri, rj;
+    nucreg_t p0, p1, p2, p3, m0, m1, m2, m3;
+
+    /* result registers */
+    int ra, rb, rc, rd;
+
+    /* used for shifting buffer, testing exit */
+    unsigned int num_passes, stop;
+
+#if qbytes > 2
+    const uint8_t *p;
+#endif
+    const uint8_t *end, *src;
+    unsigned int qlen = self -> size;
+
+    /* this test is performed outside */
+    assert ( len >= qlen );
+
+    /* the effective length of the sequence,
+       including leading bases we'll ignore */
+    len += pos;
+
+    /* convert source pointer */
+    src = ( const uint8_t* ) ncbi2na + ( pos >> 2 );
+
+    /* stop testing when position passes this point */
+    stop = len - qlen;
+
+    /* the sequence end pointer */
+    end = ( const uint8_t* ) ncbi2na + ( ( len + 3 ) >> 2 );
+
+    /* prime the buffer */
+    buffer = prime_buffer_4na ( src, end );
+    src += 8;
+#if qbytes > 2
+    p = src;
+#endif
+
+    /* prime the registers */
+    prime_registers ( self );
+
+    /* enter the loop at an appropriate offset */
+    ra = rb = rc = 0;
+#if qbytes == 16
+    num_passes = ( stop - pos + 7 ) >> 2;
+#elif qbytes == 1
+#error "4na requires at least 2 qbytes"
+#else
+    num_passes = qbytes / 2;
+#endif
+
+    /* for reporting - give a buffer alignment */
+    ALIGN_4NA_HEADER ( buffer, pos & ~ 3, len );
+    switch ( pos & 3 )
+    {
+    default:
+
+        /* outer loop - performs whole buffer loads */
+        while ( 1 )
+        {
+            num_passes = qbytes / 2;
+
+            /* inner loop - shifts in one byte at a time */
+            while ( 1 )
+            {
+                /* for reporting - give a buffer alignment */
+                ALIGN_4NA_HEADER ( buffer, pos, len );
+
+                /* perform comparisons */
+    case 0:
+                ri = _mm_and_si128 ( buffer, p0 );
+                rj = _mm_and_si128 ( buffer, m0 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                ra = _mm_movemask_epi8 ( ri );
+                res_adj ( ra );
+                ALIGN_4NA_RESULT ( buffer, p0, m0, ri, ra );
+    case 1:
+                ri = _mm_and_si128 ( buffer, p1 );
+                rj = _mm_and_si128 ( buffer, m1 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rb = _mm_movemask_epi8 ( ri );
+                res_adj ( rb );
+                ALIGN_4NA_RESULT ( buffer, p1, m1, ri, rb );
+    case 2:
+                ri = _mm_and_si128 ( buffer, p2 );
+                rj = _mm_and_si128 ( buffer, m2 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rc = _mm_movemask_epi8 ( ri );
+                res_adj ( rc );
+                ALIGN_4NA_RESULT ( buffer, p2, m2, ri, rc );
+    case 3:
+                ri = _mm_and_si128 ( buffer, p3 );
+                rj = _mm_and_si128 ( buffer, m3 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rd = _mm_movemask_epi8 ( ri );
+                res_adj ( rd );
+                ALIGN_4NA_RESULT ( buffer, p3, m3, ri, rd );
+
+                /* adjust pos */
+                pos &= ~ 3;
+
+                /* test for any promising results */
+                if ( ( ra | rb | rc | rd ) != 0 )
+                {
+#if qbytes == 16
+                    switch ( stop - pos )
+                    {
+                    default:
+                        return 1;
+                    case 2:
+                        if ( rc != 0 ) return 1;
+                    case 1:
+                        if ( rb != 0 ) return 1;
+                    case 0:
+                        if ( ra != 0 ) return 1;
+                    }
+                    return 0;
+#else
+                    /* extract first non-zero bit from results
+                       where result is all zeros, bit will be -1 */
+                    int fa = uint16_lsbit ( ( uint16_t ) ra );
+                    int fb = uint16_lsbit ( ( uint16_t ) rb );
+                    int fc = uint16_lsbit ( ( uint16_t ) rc );
+                    int fd = uint16_lsbit ( ( uint16_t ) rd );
+
+                    /* convert bit number into number of bases
+                       from current position. undefined where
+                       bit is negative, but unimportant also */
+                    fa = ( fa << 1 ) + 0;
+                    fb = ( fb << 1 ) + 1;
+                    fc = ( fc << 1 ) + 2;
+                    fd = ( fd << 1 ) + 3;
+
+                    /* test for any case where result was non-zero
+                       and the resultant base index is within range */
+                    if ( ra != 0 && pos + fa <= stop ) return 1;
+                    if ( rb != 0 && pos + fb <= stop ) return 1;
+                    if ( rc != 0 && pos + fc <= stop ) return 1;
+                    if ( rd != 0 && pos + fd <= stop ) return 1;
+#endif
+                }
+
+                /* advance pos */
+                pos += 4;
+
+                /* if no further comparisons are possible */
+                if ( pos > stop )
+                    return 0;
+
+                /* if all shifting passes are complete */
+                if ( -- num_passes == 0 )
+                    break;
+
+#if qbytes > 2
+                /* shift buffer */
+                buffer = _mm_srli_si128 ( buffer, 2 );
+
+                /* bring in new byte */
+                if ( p < end )
+                    buffer = _mm_insert_epi16 ( buffer, expand_2na [ * p ], 7 );
+                
+                /* always increment source */
+                ++ p;
+#endif
+            }
+
+            /* want to reload buffer */
+            if ( src >= end )
+                break;
+
+            /* advance position */
+            pos += ( 8 - qbytes / 2 ) << 2;
+            if ( pos > stop )
+                break;
+
+            /* reload buffer */
+#if ENDLESS_BUFFER || qbytes == 2
+            buffer = prime_buffer_4na ( src, end );
+#elif qbytes == 16
+            assert ( 0 );
+#else
+            if ( p - src < 3 )
+                buffer = prime_buffer_4na ( src, end );
+            else for ( ; p - src < 8; ++ p )
+            {
+                buffer = _mm_srli_si128 ( buffer, 2 );
+                if ( p < end )
+                    buffer = _mm_insert_epi16 ( buffer, expand_2na [ * p ], 7 );
+            }
+#endif
+
+            /* adjust pointers */
+            src += 8;
+#if qbytes > 2
+            p = src;
+#endif
+        }
+    }
+
+#undef qbytes
+#undef _mm_cmpeq_epi
+#undef res_adj
+
+    return 0;
+}
+
+static
+int eval_4na_32 ( const NucStrFastaExpr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len )
+{
+#define qbytes 4
+#define _mm_cmpeq_epi( a, b ) \
+    _mm_cmpeq_epi32 ( a, b )
+#if NEVER_MATCH
+#define res_adj( res ) \
+    res = 0
+#else
+#define res_adj( res ) \
+    ( ( void ) 0 )
+#endif
+
+    /* SSE registers */
+    nucreg_t buffer, ri, rj;
+    nucreg_t p0, p1, p2, p3, m0, m1, m2, m3;
+
+    /* result registers */
+    int ra, rb, rc, rd;
+
+    /* used for shifting buffer, testing exit */
+    unsigned int num_passes, stop;
+
+#if qbytes > 2
+    const uint8_t *p;
+#endif
+    const uint8_t *end, *src;
+    unsigned int qlen = self -> size;
+
+    /* this test is performed outside */
+    assert ( len >= qlen );
+
+    /* the effective length of the sequence,
+       including leading bases we'll ignore */
+    len += pos;
+
+    /* convert source pointer */
+    src = ( const uint8_t* ) ncbi2na + ( pos >> 2 );
+
+    /* stop testing when position passes this point */
+    stop = len - qlen;
+
+    /* the sequence end pointer */
+    end = ( const uint8_t* ) ncbi2na + ( ( len + 3 ) >> 2 );
+
+    /* prime the buffer */
+    buffer = prime_buffer_4na ( src, end );
+    src += 8;
+#if qbytes > 2
+    p = src;
+#endif
+
+    /* prime the registers */
+    prime_registers ( self );
+
+    /* enter the loop at an appropriate offset */
+    ra = rb = rc = 0;
+#if qbytes == 16
+    num_passes = ( stop - pos + 7 ) >> 2;
+#elif qbytes == 1
+#error "4na requires at least 2 qbytes"
+#else
+    num_passes = qbytes / 2;
+#endif
+
+    /* for reporting - give a buffer alignment */
+    ALIGN_4NA_HEADER ( buffer, pos & ~ 3, len );
+    switch ( pos & 3 )
+    {
+    default:
+
+        /* outer loop - performs whole buffer loads */
+        while ( 1 )
+        {
+            num_passes = qbytes / 2;
+
+            /* inner loop - shifts in one byte at a time */
+            while ( 1 )
+            {
+                /* for reporting - give a buffer alignment */
+                ALIGN_4NA_HEADER ( buffer, pos, len );
+
+                /* perform comparisons */
+    case 0:
+                ri = _mm_and_si128 ( buffer, p0 );
+                rj = _mm_and_si128 ( buffer, m0 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                ra = _mm_movemask_epi8 ( ri );
+                res_adj ( ra );
+                ALIGN_4NA_RESULT ( buffer, p0, m0, ri, ra );
+    case 1:
+                ri = _mm_and_si128 ( buffer, p1 );
+                rj = _mm_and_si128 ( buffer, m1 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rb = _mm_movemask_epi8 ( ri );
+                res_adj ( rb );
+                ALIGN_4NA_RESULT ( buffer, p1, m1, ri, rb );
+    case 2:
+                ri = _mm_and_si128 ( buffer, p2 );
+                rj = _mm_and_si128 ( buffer, m2 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rc = _mm_movemask_epi8 ( ri );
+                res_adj ( rc );
+                ALIGN_4NA_RESULT ( buffer, p2, m2, ri, rc );
+    case 3:
+                ri = _mm_and_si128 ( buffer, p3 );
+                rj = _mm_and_si128 ( buffer, m3 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rd = _mm_movemask_epi8 ( ri );
+                res_adj ( rd );
+                ALIGN_4NA_RESULT ( buffer, p3, m3, ri, rd );
+
+                /* adjust pos */
+                pos &= ~ 3;
+
+                /* test for any promising results */
+                if ( ( ra | rb | rc | rd ) != 0 )
+                {
+#if qbytes == 16
+                    switch ( stop - pos )
+                    {
+                    default:
+                        return 1;
+                    case 2:
+                        if ( rc != 0 ) return 1;
+                    case 1:
+                        if ( rb != 0 ) return 1;
+                    case 0:
+                        if ( ra != 0 ) return 1;
+                    }
+                    return 0;
+#else
+                    /* extract first non-zero bit from results
+                       where result is all zeros, bit will be -1 */
+                    int fa = uint16_lsbit ( ( uint16_t ) ra );
+                    int fb = uint16_lsbit ( ( uint16_t ) rb );
+                    int fc = uint16_lsbit ( ( uint16_t ) rc );
+                    int fd = uint16_lsbit ( ( uint16_t ) rd );
+
+                    /* convert bit number into number of bases
+                       from current position. undefined where
+                       bit is negative, but unimportant also */
+                    fa = ( fa << 1 ) + 0;
+                    fb = ( fb << 1 ) + 1;
+                    fc = ( fc << 1 ) + 2;
+                    fd = ( fd << 1 ) + 3;
+
+                    /* test for any case where result was non-zero
+                       and the resultant base index is within range */
+                    if ( ra != 0 && pos + fa <= stop ) return 1;
+                    if ( rb != 0 && pos + fb <= stop ) return 1;
+                    if ( rc != 0 && pos + fc <= stop ) return 1;
+                    if ( rd != 0 && pos + fd <= stop ) return 1;
+#endif
+                }
+
+                /* advance pos */
+                pos += 4;
+
+                /* if no further comparisons are possible */
+                if ( pos > stop )
+                    return 0;
+
+                /* if all shifting passes are complete */
+                if ( -- num_passes == 0 )
+                    break;
+
+#if qbytes > 2
+                /* shift buffer */
+                buffer = _mm_srli_si128 ( buffer, 2 );
+
+                /* bring in new byte */
+                if ( p < end )
+                    buffer = _mm_insert_epi16 ( buffer, expand_2na [ * p ], 7 );
+                
+                /* always increment source */
+                ++ p;
+#endif
+            }
+
+            /* want to reload buffer */
+            if ( src >= end )
+                break;
+
+            /* advance position */
+            pos += ( 8 - qbytes / 2 ) << 2;
+            if ( pos > stop )
+                break;
+
+            /* reload buffer */
+#if ENDLESS_BUFFER || qbytes == 2
+            buffer = prime_buffer_4na ( src, end );
+#elif qbytes == 16
+            assert ( 0 );
+#else
+            if ( p - src < 3 )
+                buffer = prime_buffer_4na ( src, end );
+            else for ( ; p - src < 8; ++ p )
+            {
+                buffer = _mm_srli_si128 ( buffer, 2 );
+                if ( p < end )
+                    buffer = _mm_insert_epi16 ( buffer, expand_2na [ * p ], 7 );
+            }
+#endif
+
+            /* adjust pointers */
+            src += 8;
+#if qbytes > 2
+            p = src;
+#endif
+        }
+    }
+
+#undef qbytes
+#undef _mm_cmpeq_epi
+#undef res_adj
+
+    return 0;
+}
+
+static
+int eval_4na_64 ( const NucStrFastaExpr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len )
+{
+#define qbytes 8
+#define _mm_cmpeq_epi( a, b ) \
+    _mm_cmpeq_epi32 ( a, b )
+#if NEVER_MATCH
+#define res_adj( res ) \
+    res = 0
+#else
+#define res_adj( res ) \
+    ( ( res ) &= ( ( res ) & 0x0F0F ) << 4, \
+      ( res ) |= ( res ) >> 4 )
+#endif
+
+    /* SSE registers */
+    nucreg_t buffer, ri, rj;
+    nucreg_t p0, p1, p2, p3, m0, m1, m2, m3;
+
+    /* result registers */
+    int ra, rb, rc, rd;
+
+    /* used for shifting buffer, testing exit */
+    unsigned int num_passes, stop;
+
+#if qbytes > 2
+    const uint8_t *p;
+#endif
+    const uint8_t *end, *src;
+    unsigned int qlen = self -> size;
+
+    /* this test is performed outside */
+    assert ( len >= qlen );
+
+    /* the effective length of the sequence,
+       including leading bases we'll ignore */
+    len += pos;
+
+    /* convert source pointer */
+    src = ( const uint8_t* ) ncbi2na + ( pos >> 2 );
+
+    /* stop testing when position passes this point */
+    stop = len - qlen;
+
+    /* the sequence end pointer */
+    end = ( const uint8_t* ) ncbi2na + ( ( len + 3 ) >> 2 );
+
+    /* prime the buffer */
+    buffer = prime_buffer_4na ( src, end );
+    src += 8;
+#if qbytes > 2
+    p = src;
+#endif
+
+    /* prime the registers */
+    prime_registers ( self );
+
+    /* enter the loop at an appropriate offset */
+    ra = rb = rc = 0;
+#if qbytes == 16
+    num_passes = ( stop - pos + 7 ) >> 2;
+#elif qbytes == 1
+#error "4na requires at least 2 qbytes"
+#else
+    num_passes = qbytes / 2;
+#endif
+
+    /* for reporting - give a buffer alignment */
+    ALIGN_4NA_HEADER ( buffer, pos & ~ 3, len );
+    switch ( pos & 3 )
+    {
+    default:
+
+        /* outer loop - performs whole buffer loads */
+        while ( 1 )
+        {
+            num_passes = qbytes / 2;
+
+            /* inner loop - shifts in one byte at a time */
+            while ( 1 )
+            {
+                /* for reporting - give a buffer alignment */
+                ALIGN_4NA_HEADER ( buffer, pos, len );
+
+                /* perform comparisons */
+    case 0:
+                ri = _mm_and_si128 ( buffer, p0 );
+                rj = _mm_and_si128 ( buffer, m0 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                ra = _mm_movemask_epi8 ( ri );
+                res_adj ( ra );
+                ALIGN_4NA_RESULT ( buffer, p0, m0, ri, ra );
+    case 1:
+                ri = _mm_and_si128 ( buffer, p1 );
+                rj = _mm_and_si128 ( buffer, m1 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rb = _mm_movemask_epi8 ( ri );
+                res_adj ( rb );
+                ALIGN_4NA_RESULT ( buffer, p1, m1, ri, rb );
+    case 2:
+                ri = _mm_and_si128 ( buffer, p2 );
+                rj = _mm_and_si128 ( buffer, m2 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rc = _mm_movemask_epi8 ( ri );
+                res_adj ( rc );
+                ALIGN_4NA_RESULT ( buffer, p2, m2, ri, rc );
+    case 3:
+                ri = _mm_and_si128 ( buffer, p3 );
+                rj = _mm_and_si128 ( buffer, m3 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rd = _mm_movemask_epi8 ( ri );
+                res_adj ( rd );
+                ALIGN_4NA_RESULT ( buffer, p3, m3, ri, rd );
+
+                /* adjust pos */
+                pos &= ~ 3;
+
+                /* test for any promising results */
+                if ( ( ra | rb | rc | rd ) != 0 )
+                {
+#if qbytes == 16
+                    switch ( stop - pos )
+                    {
+                    default:
+                        return 1;
+                    case 2:
+                        if ( rc != 0 ) return 1;
+                    case 1:
+                        if ( rb != 0 ) return 1;
+                    case 0:
+                        if ( ra != 0 ) return 1;
+                    }
+                    return 0;
+#else
+                    /* extract first non-zero bit from results
+                       where result is all zeros, bit will be -1 */
+                    int fa = uint16_lsbit ( ( uint16_t ) ra );
+                    int fb = uint16_lsbit ( ( uint16_t ) rb );
+                    int fc = uint16_lsbit ( ( uint16_t ) rc );
+                    int fd = uint16_lsbit ( ( uint16_t ) rd );
+
+                    /* convert bit number into number of bases
+                       from current position. undefined where
+                       bit is negative, but unimportant also */
+                    fa = ( fa << 1 ) + 0;
+                    fb = ( fb << 1 ) + 1;
+                    fc = ( fc << 1 ) + 2;
+                    fd = ( fd << 1 ) + 3;
+
+                    /* test for any case where result was non-zero
+                       and the resultant base index is within range */
+                    if ( ra != 0 && pos + fa <= stop ) return 1;
+                    if ( rb != 0 && pos + fb <= stop ) return 1;
+                    if ( rc != 0 && pos + fc <= stop ) return 1;
+                    if ( rd != 0 && pos + fd <= stop ) return 1;
+#endif
+                }
+
+                /* advance pos */
+                pos += 4;
+
+                /* if no further comparisons are possible */
+                if ( pos > stop )
+                    return 0;
+
+                /* if all shifting passes are complete */
+                if ( -- num_passes == 0 )
+                    break;
+
+#if qbytes > 2
+                /* shift buffer */
+                buffer = _mm_srli_si128 ( buffer, 2 );
+
+                /* bring in new byte */
+                if ( p < end )
+                    buffer = _mm_insert_epi16 ( buffer, expand_2na [ * p ], 7 );
+                
+                /* always increment source */
+                ++ p;
+#endif
+            }
+
+            /* want to reload buffer */
+            if ( src >= end )
+                break;
+
+            /* advance position */
+            pos += ( 8 - qbytes / 2 ) << 2;
+            if ( pos > stop )
+                break;
+
+            /* reload buffer */
+#if ENDLESS_BUFFER || qbytes == 2
+            buffer = prime_buffer_4na ( src, end );
+#elif qbytes == 16
+            assert ( 0 );
+#else
+            if ( p - src < 3 )
+                buffer = prime_buffer_4na ( src, end );
+            else for ( ; p - src < 8; ++ p )
+            {
+                buffer = _mm_srli_si128 ( buffer, 2 );
+                if ( p < end )
+                    buffer = _mm_insert_epi16 ( buffer, expand_2na [ * p ], 7 );
+            }
+#endif
+
+            /* adjust pointers */
+            src += 8;
+#if qbytes > 2
+            p = src;
+#endif
+        }
+    }
+
+#undef qbytes
+#undef _mm_cmpeq_epi
+#undef res_adj
+
+    return 0;
+}
+
+static
+int eval_4na_128 ( const NucStrFastaExpr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len )
+{
+#define qbytes 16
+#define _mm_cmpeq_epi( a, b ) \
+    _mm_cmpeq_epi32 ( a, b )
+#if NEVER_MATCH
+#define res_adj( res ) \
+    res = 0
+#else
+#define res_adj( res ) \
+    ( ( res ) = - ( ( ( res ) + 1 ) >> 16 ) )
+#endif
+
+    /* SSE registers */
+    nucreg_t buffer, ri, rj;
+    nucreg_t p0, p1, p2, p3, m0, m1, m2, m3;
+
+    /* result registers */
+    int ra, rb, rc, rd;
+
+    /* used for shifting buffer, testing exit */
+    unsigned int num_passes, stop;
+
+#if qbytes > 2
+    const uint8_t *p;
+#endif
+    const uint8_t *end, *src;
+    unsigned int qlen = self -> size;
+
+    /* this test is performed outside */
+    assert ( len >= qlen );
+
+    /* the effective length of the sequence,
+       including leading bases we'll ignore */
+    len += pos;
+
+    /* convert source pointer */
+    src = ( const uint8_t* ) ncbi2na + ( pos >> 2 );
+
+    /* stop testing when position passes this point */
+    stop = len - qlen;
+
+    /* the sequence end pointer */
+    end = ( const uint8_t* ) ncbi2na + ( ( len + 3 ) >> 2 );
+
+    /* prime the buffer */
+    buffer = prime_buffer_4na ( src, end );
+    src += 8;
+#if qbytes > 2
+    p = src;
+#endif
+
+    /* prime the registers */
+    prime_registers ( self );
+
+    /* enter the loop at an appropriate offset */
+    ra = rb = rc = 0;
+#if qbytes == 16
+    num_passes = ( stop - pos + 7 ) >> 2;
+#elif qbytes == 1
+#error "4na requires at least 2 qbytes"
+#else
+    num_passes = qbytes / 2;
+#endif
+
+    /* for reporting - give a buffer alignment */
+    ALIGN_4NA_HEADER ( buffer, pos & ~ 3, len );
+    switch ( pos & 3 )
+    {
+    default:
+
+        /* outer loop - performs whole buffer loads */
+        while ( 1 )
+        {
+            num_passes = qbytes / 2;
+
+            /* inner loop - shifts in one byte at a time */
+            while ( 1 )
+            {
+                /* for reporting - give a buffer alignment */
+                ALIGN_4NA_HEADER ( buffer, pos, len );
+
+                /* perform comparisons */
+    case 0:
+                ri = _mm_and_si128 ( buffer, p0 );
+                rj = _mm_and_si128 ( buffer, m0 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                ra = _mm_movemask_epi8 ( ri );
+                res_adj ( ra );
+                ALIGN_4NA_RESULT ( buffer, p0, m0, ri, ra );
+    case 1:
+                ri = _mm_and_si128 ( buffer, p1 );
+                rj = _mm_and_si128 ( buffer, m1 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rb = _mm_movemask_epi8 ( ri );
+                res_adj ( rb );
+                ALIGN_4NA_RESULT ( buffer, p1, m1, ri, rb );
+    case 2:
+                ri = _mm_and_si128 ( buffer, p2 );
+                rj = _mm_and_si128 ( buffer, m2 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rc = _mm_movemask_epi8 ( ri );
+                res_adj ( rc );
+                ALIGN_4NA_RESULT ( buffer, p2, m2, ri, rc );
+    case 3:
+                ri = _mm_and_si128 ( buffer, p3 );
+                rj = _mm_and_si128 ( buffer, m3 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rd = _mm_movemask_epi8 ( ri );
+                res_adj ( rd );
+                ALIGN_4NA_RESULT ( buffer, p3, m3, ri, rd );
+
+                /* adjust pos */
+                pos &= ~ 3;
+
+                /* test for any promising results */
+                if ( ( ra | rb | rc | rd ) != 0 )
+                {
+#if qbytes == 16
+                    switch ( stop - pos )
+                    {
+                    default:
+                        return 1;
+                    case 2:
+                        if ( rc != 0 ) return 1;
+                    case 1:
+                        if ( rb != 0 ) return 1;
+                    case 0:
+                        if ( ra != 0 ) return 1;
+                    }
+                    return 0;
+#else
+                    /* extract first non-zero bit from results
+                       where result is all zeros, bit will be -1 */
+                    int fa = uint16_lsbit ( ( uint16_t ) ra );
+                    int fb = uint16_lsbit ( ( uint16_t ) rb );
+                    int fc = uint16_lsbit ( ( uint16_t ) rc );
+                    int fd = uint16_lsbit ( ( uint16_t ) rd );
+
+                    /* convert bit number into number of bases
+                       from current position. undefined where
+                       bit is negative, but unimportant also */
+                    fa = ( fa << 1 ) + 0;
+                    fb = ( fb << 1 ) + 1;
+                    fc = ( fc << 1 ) + 2;
+                    fd = ( fd << 1 ) + 3;
+
+                    /* test for any case where result was non-zero
+                       and the resultant base index is within range */
+                    if ( ra != 0 && pos + fa <= stop ) return 1;
+                    if ( rb != 0 && pos + fb <= stop ) return 1;
+                    if ( rc != 0 && pos + fc <= stop ) return 1;
+                    if ( rd != 0 && pos + fd <= stop ) return 1;
+#endif
+                }
+
+                /* advance pos */
+                pos += 4;
+
+                /* if no further comparisons are possible */
+                if ( pos > stop )
+                    return 0;
+
+                /* if all shifting passes are complete */
+                if ( -- num_passes == 0 )
+                    break;
+
+#if qbytes > 2
+                /* shift buffer */
+                buffer = _mm_srli_si128 ( buffer, 2 );
+
+                /* bring in new byte */
+                if ( p < end )
+                    buffer = _mm_insert_epi16 ( buffer, expand_2na [ * p ], 7 );
+                
+                /* always increment source */
+                ++ p;
+#endif
+            }
+
+            /* want to reload buffer */
+            if ( src >= end )
+                break;
+
+            /* advance position */
+            pos += ( 8 - qbytes / 2 ) << 2;
+            if ( pos > stop )
+                break;
+
+            /* reload buffer */
+#if ENDLESS_BUFFER || qbytes == 2
+            buffer = prime_buffer_4na ( src, end );
+#elif qbytes == 16
+            assert ( 0 );
+#else
+            if ( p - src < 3 )
+                buffer = prime_buffer_4na ( src, end );
+            else for ( ; p - src < 8; ++ p )
+            {
+                buffer = _mm_srli_si128 ( buffer, 2 );
+                if ( p < end )
+                    buffer = _mm_insert_epi16 ( buffer, expand_2na [ * p ], 7 );
+            }
+#endif
+
+            /* adjust pointers */
+            src += 8;
+#if qbytes > 2
+            p = src;
+#endif
+        }
+    }
+
+#undef qbytes
+#undef _mm_cmpeq_epi
+#undef res_adj
+
+    return 0;
+}
+
+static
+int eval_4na_pos ( const NucStrFastaExpr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len )
+{
+#define positional 1
+#define qbytes 16
+#define _mm_cmpeq_epi( a, b ) \
+    _mm_cmpeq_epi32 ( a, b )
+#if NEVER_MATCH
+#define res_adj( res ) \
+    res = 0
+#else
+#define res_adj( res ) \
+    ( ( res ) = - ( ( ( res ) + 1 ) >> 16 ) )
+#endif
+
+    /* SSE registers */
+    nucreg_t buffer, ri, rj;
+    nucreg_t p0, p1, p2, p3, m0, m1, m2, m3;
+
+    /* result registers */
+    int ra, rb, rc, rd;
+
+    /* used for shifting buffer, testing exit */
+    unsigned int num_passes, stop;
+
+    /* used to hold entry position */
+#if positional
+    unsigned int start;
+#endif
+
+#if qbytes > 2
+    const uint8_t *p;
+#endif
+    const uint8_t *end, *src;
+    unsigned int qlen = self -> size;
+
+    /* this test is performed outside */
+    assert ( len >= qlen );
+
+    /* the effective length of the sequence,
+       including leading bases we'll ignore */
+    len += pos;
+
+    /* hold starting position */
+#if positional
+    start = pos;
+#endif
+
+    /* convert source pointer */
+    src = ( const uint8_t* ) ncbi2na + ( pos >> 2 );
+
+    /* stop testing when position passes this point */
+    stop = len - qlen;
+
+    /* the sequence end pointer */
+    end = ( const uint8_t* ) ncbi2na + ( ( len + 3 ) >> 2 );
+
+    /* prime the buffer */
+    buffer = prime_buffer_4na ( src, end );
+    src += 8;
+#if qbytes > 2
+    p = src;
+#endif
+
+    /* prime the registers */
+    prime_registers ( self );
+
+    /* enter the loop at an appropriate offset */
+    ra = rb = rc = 0;
+#if qbytes == 16
+    num_passes = ( stop - pos + 7 ) >> 2;
+#elif qbytes == 1
+#error "4na requires at least 2 qbytes"
+#else
+    num_passes = qbytes / 2;
+#endif
+
+    /* for reporting - give a buffer alignment */
+    ALIGN_4NA_HEADER ( buffer, pos & ~ 3, len );
+    switch ( pos & 3 )
+    {
+    default:
+
+        /* outer loop - performs whole buffer loads */
+        while ( 1 )
+        {
+            num_passes = qbytes / 2;
+
+            /* inner loop - shifts in one byte at a time */
+            while ( 1 )
+            {
+                /* for reporting - give a buffer alignment */
+                ALIGN_4NA_HEADER ( buffer, pos, len );
+
+                /* perform comparisons */
+    case 0:
+                ri = _mm_and_si128 ( buffer, p0 );
+                rj = _mm_and_si128 ( buffer, m0 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                ra = _mm_movemask_epi8 ( ri );
+                res_adj ( ra );
+                ALIGN_4NA_RESULT ( buffer, p0, m0, ri, ra );
+    case 1:
+                ri = _mm_and_si128 ( buffer, p1 );
+                rj = _mm_and_si128 ( buffer, m1 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rb = _mm_movemask_epi8 ( ri );
+                res_adj ( rb );
+                ALIGN_4NA_RESULT ( buffer, p1, m1, ri, rb );
+    case 2:
+                ri = _mm_and_si128 ( buffer, p2 );
+                rj = _mm_and_si128 ( buffer, m2 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rc = _mm_movemask_epi8 ( ri );
+                res_adj ( rc );
+                ALIGN_4NA_RESULT ( buffer, p2, m2, ri, rc );
+    case 3:
+                ri = _mm_and_si128 ( buffer, p3 );
+                rj = _mm_and_si128 ( buffer, m3 );
+                ri = _mm_cmpeq_epi ( ri, rj );
+                rd = _mm_movemask_epi8 ( ri );
+                res_adj ( rd );
+                ALIGN_4NA_RESULT ( buffer, p3, m3, ri, rd );
+
+                /* adjust pos */
+                pos &= ~ 3;
+
+                /* test for any promising results */
+                if ( ( ra | rb | rc | rd ) != 0 )
+                {
+#if positional
+                    switch ( stop - pos )
+                    {
+                    case 0:
+                        if ( ra != 0 ) return pos - start + 1;
+                        break;
+                    case 1:
+                        if ( ra != 0 ) return pos - start + 1;
+                        if ( rb != 0 ) return pos - start + 2;
+                        break;
+                    case 2:
+                        if ( ra != 0 ) return pos - start + 1;
+                        if ( rb != 0 ) return pos - start + 2;
+                        if ( rc != 0 ) return pos - start + 3;
+                        break;
+                    default:
+                        if ( ra != 0 ) return pos - start + 1;
+                        if ( rb != 0 ) return pos - start + 2;
+                        if ( rc != 0 ) return pos - start + 3;
+                        if ( rd != 0 ) return pos - start + 4;
+                    }
+                    return 0;
+#elif qbytes == 16
+                    switch ( stop - pos )
+                    {
+                    default:
+                        return 1;
+                    case 2:
+                        if ( rc != 0 ) return 1;
+                    case 1:
+                        if ( rb != 0 ) return 1;
+                    case 0:
+                        if ( ra != 0 ) return 1;
+                    }
+                    return 0;
+#else
+                    /* extract first non-zero bit from results
+                       where result is all zeros, bit will be -1 */
+                    int fa = uint16_lsbit ( ( uint16_t ) ra );
+                    int fb = uint16_lsbit ( ( uint16_t ) rb );
+                    int fc = uint16_lsbit ( ( uint16_t ) rc );
+                    int fd = uint16_lsbit ( ( uint16_t ) rd );
+
+                    /* convert bit number into number of bases
+                       from current position. undefined where
+                       bit is negative, but unimportant also */
+                    fa = ( fa << 1 ) + 0;
+                    fb = ( fb << 1 ) + 1;
+                    fc = ( fc << 1 ) + 2;
+                    fd = ( fd << 1 ) + 3;
+
+                    /* test for any case where result was non-zero
+                       and the resultant base index is within range */
+                    if ( ra != 0 && pos + fa <= stop ) return 1;
+                    if ( rb != 0 && pos + fb <= stop ) return 1;
+                    if ( rc != 0 && pos + fc <= stop ) return 1;
+                    if ( rd != 0 && pos + fd <= stop ) return 1;
+#endif
+                }
+
+                /* advance pos */
+                pos += 4;
+
+                /* if no further comparisons are possible */
+                if ( pos > stop )
+                    return 0;
+
+                /* if all shifting passes are complete */
+                if ( -- num_passes == 0 )
+                    break;
+
+#if qbytes > 2
+                /* shift buffer */
+                buffer = _mm_srli_si128 ( buffer, 2 );
+
+                /* bring in new byte */
+                if ( p < end )
+                    buffer = _mm_insert_epi16 ( buffer, expand_2na [ * p ], 7 );
+                
+                /* always increment source */
+                ++ p;
+#endif
+            }
+
+            /* want to reload buffer */
+            if ( src >= end )
+                break;
+
+            /* advance position */
+            pos += ( 8 - qbytes / 2 ) << 2;
+            if ( pos > stop )
+                break;
+
+            /* reload buffer */
+#if ENDLESS_BUFFER || qbytes == 2
+            buffer = prime_buffer_4na ( src, end );
+#elif qbytes == 16
+            assert ( 0 );
+#else
+            if ( p - src < 3 )
+                buffer = prime_buffer_4na ( src, end );
+            else for ( ; p - src < 8; ++ p )
+            {
+                buffer = _mm_srli_si128 ( buffer, 2 );
+                if ( p < end )
+                    buffer = _mm_insert_epi16 ( buffer, expand_2na [ * p ], 7 );
+            }
+#endif
+
+            /* adjust pointers */
+            src += 8;
+#if qbytes > 2
+            p = src;
+#endif
+        }
+    }
+
+#undef positional
+#undef qbytes
+#undef _mm_cmpeq_epi
+#undef res_adj
+
+    return 0;
+}
+
+
+/* NucStrstrSearch
+ *  search buffer from starting position
+ *
+ *  "ncbi2na" [ IN ] - pointer to 2na data
+ *
+ *  "pos" [ IN ] - starting base position for search,
+ *  relative to "ncbi2na". may be >= 4.
+ *
+ *  "len" [ IN ] - the number of bases to include in
+ *  the search, relative to "pos".
+ *
+ *  return values:
+ *    ! 0 if the pattern was found
+ */
+LIB_EXPORT int CC NucStrstrSearch ( const NucStrstr *self,
+    const void *ncbi2na, unsigned int pos, unsigned int len , unsigned int * selflen )
+{
+    if ( self != NULL && ncbi2na != NULL && len != 0 )
+    {
+        int found;
+        unsigned int fasta_len;
+
+        switch ( self -> fasta . type )
+        {
+        case type_2na_64:
+            if ( len < self -> fasta . size ) return 0;
+	    if(selflen) *selflen=self -> fasta . size;
+            return eval_2na_64 ( & self -> fasta, ncbi2na, pos, len );
+        case type_4na_64:
+            if ( len < self -> fasta . size ) return 0;
+	    if(selflen) *selflen=self -> fasta . size;
+            return eval_4na_64 ( & self -> fasta, ncbi2na, pos, len );
+        case type_2na_8:
+            if ( len < self -> fasta . size ) return 0;
+	    if(selflen) *selflen=self -> fasta . size;
+            return eval_2na_8 ( & self -> fasta, ncbi2na, pos, len );
+        case type_2na_16:
+            if ( len < self -> fasta . size ) return 0;
+	    if(selflen) *selflen=self -> fasta . size;
+            return eval_2na_16 ( & self -> fasta, ncbi2na, pos, len );
+        case type_2na_32:
+            if ( len < self -> fasta . size ) return 0;
+	    if(selflen) *selflen=self -> fasta . size;
+            return eval_2na_32 ( & self -> fasta, ncbi2na, pos, len );
+        case type_2na_128:
+            if ( len < self -> fasta . size ) return 0;
+	    if(selflen) *selflen=self -> fasta . size;
+            return eval_2na_128 ( & self -> fasta, ncbi2na, pos, len );
+        case type_4na_16:
+            if ( len < self -> fasta . size ) return 0;
+	    if(selflen) *selflen=self -> fasta . size;
+            return eval_4na_16 ( & self -> fasta, ncbi2na, pos, len );
+        case type_4na_32:
+            if ( len < self -> fasta . size ) return 0;
+	    if(selflen) *selflen=self -> fasta . size;
+            return eval_4na_32 ( & self -> fasta, ncbi2na, pos, len );
+        case type_4na_128:
+            if ( len < self -> fasta . size ) return 0;
+	    if(selflen) *selflen=self -> fasta . size;
+            return eval_4na_128 ( & self -> fasta, ncbi2na, pos, len );
+        case type_2na_pos:
+            if ( len < self -> fasta . size ) return 0;
+	    if(selflen) *selflen=self -> fasta . size;
+            return eval_2na_pos ( & self -> fasta, ncbi2na, pos, len );
+        case type_4na_pos:
+            if ( len < self -> fasta . size ) return 0;
+	    if(selflen) *selflen=self -> fasta . size;
+            return eval_4na_pos ( & self -> fasta, ncbi2na, pos, len );
+        case type_OP:
+            found = NucStrstrSearch ( self -> boolean . left, ncbi2na, pos, len, selflen);
+            switch ( self -> boolean . op )
+            {
+            case op_OR:
+                if ( found != 0 )
+                    return found;
+                break;
+            case op_AND:
+                if ( found == 0 )
+                    return found;
+                break;
+            }
+            return NucStrstrSearch ( self -> boolean . right, ncbi2na, pos, len, selflen);
+        case type_EXPR:
+            switch ( self -> sub . op )
+            {
+            case 0:
+            case op_NOT:
+                found = NucStrstrSearch ( self -> sub . expr, ncbi2na, pos, len, selflen);
+                if ( self -> sub . op == 0 )
+                    return found;
+                if ( found == 0 )
+                    return 1;
+                break;
+            case op_HEAD:
+                fasta_len = self -> sub . expr -> fasta . size;
+                if ( fasta_len > len )
+                    return 0;
+                return NucStrstrSearch ( self -> sub . expr, ncbi2na, pos, fasta_len, selflen );
+            case op_TAIL:
+                fasta_len = self -> sub . expr -> fasta . size;
+                if ( fasta_len > len )
+                    return 0;
+                found = NucStrstrSearch ( self -> sub . expr, ncbi2na,
+                    pos + len - fasta_len, fasta_len, selflen );
+                if ( found != 0 )
+                    found += pos + len - fasta_len;
+                return found;
+            }
+            break;
+        }
+    }
+    return 0;
+}
diff --git a/libs/search/search-priv.h b/libs/search/search-priv.h
new file mode 100644
index 0000000..49f042f
--- /dev/null
+++ b/libs/search/search-priv.h
@@ -0,0 +1,140 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_search_priv_
+#define _h_search_priv_
+
+#include <search/grep.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <compiler.h>
+#include <insdc/insdc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <arch-impl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct FgrepDumbParams FgrepDumbParams;
+typedef struct FgrepBoyerParams FgrepBoyerParams;
+typedef struct FgrepAhoParams FgrepAhoParams;
+typedef struct AgrepWuParams AgrepWuParams;
+typedef struct DPParams DPParams;
+typedef struct MyersSearch MyersSearch;
+typedef struct MyersUnlimitedSearch MyersUnlimitedSearch;
+
+void FgrepDumbSearchMake(FgrepDumbParams **self, const char *strings[], uint32_t numstrings);
+void FgrepDumbSearchFree(FgrepDumbParams *self);
+
+void FgrepBoyerSearchMake(FgrepBoyerParams **self, const char *strings[], uint32_t numstrings);
+void FgrepBoyerSearchFree(FgrepBoyerParams *self);
+
+void FgrepAhoMake(FgrepAhoParams **self, const char *strings[], uint32_t numstrings);
+void FgrepAhoFree(FgrepAhoParams *self);
+
+uint32_t FgrepDumbFindFirst(FgrepDumbParams *self, const char *buf, size_t len, FgrepMatch *match);
+uint32_t FgrepBoyerFindFirst( FgrepBoyerParams *self, const char *buf, size_t len, FgrepMatch *match);
+uint32_t FgrepAhoFindFirst( FgrepAhoParams *self, const char *buf, size_t len, FgrepMatch *match);
+
+void AgrepWuFree(AgrepWuParams *self);
+void MyersUnlimitedFree(MyersUnlimitedSearch *self);
+void AgrepDPFree(DPParams *self);
+void AgrepMyersFree(MyersSearch *self);
+
+uint32_t MyersUnlimitedFindFirst(MyersUnlimitedSearch *self, int32_t threshold, const char* text, size_t n, AgrepMatch *match);
+uint32_t MyersFindFirst(MyersSearch *self, int32_t threshold, 
+                   const char* text, size_t n,
+                       AgrepMatch *match);
+uint32_t AgrepWuFindFirst(const AgrepWuParams *self, int32_t threshold, const char *buf, int32_t buflen, AgrepMatch *match);
+uint32_t AgrepDPFindFirst(const DPParams *self, int32_t threshold, AgrepFlags mode, const char *buf, int32_t buflen, AgrepMatch *match);
+
+void AgrepDPFindAll(const AgrepCallArgs *args);
+void MyersFindAll(const AgrepCallArgs *args);
+void MyersUnlimitedFindAll(const AgrepCallArgs *args);
+void AgrepWuFindAll(const AgrepCallArgs *args);
+int32_t FgrepAhoFindAll(FgrepAhoParams *self, char *buf, int32_t len, int32_t *whichpattern);
+void FgrepBoyerFindAll(FgrepBoyerParams *self, char *buf, int32_t len, FgrepMatchCallback cb, void *cbinfo);
+void FgrepDumbFindAll(FgrepDumbParams *self, char *buf, int32_t len, 
+                      FgrepMatchCallback cb, void *cbinfo);
+
+
+rc_t AgrepDPMake(DPParams **self, AgrepFlags mode, const char *pattern);
+rc_t AgrepMyersMake(MyersSearch **self, AgrepFlags mode, const char *pattern);
+rc_t MyersUnlimitedMake(MyersUnlimitedSearch **self, AgrepFlags mode, const char *pattern);
+rc_t AgrepWuMake(AgrepWuParams **self, AgrepFlags mode, const char *pattern);
+
+
+struct Fgrep {
+    struct FgrepDumbParams *dumb;
+    struct FgrepBoyerParams *boyer;
+    struct FgrepAhoParams *aho;
+    FgrepFlags mode;
+};
+
+typedef struct Fgrep FgrepParams;
+
+/* 
+We actually need to have multiple (non-union) for Myers and DP parameters,
+since the myers code uses the DP parameters.
+Some of the others could be unioned.
+*/
+struct Agrep
+{
+    struct AgrepWuParams *wu;
+    struct MyersSearch *myers;
+    struct MyersUnlimitedSearch *myersunltd;
+    struct DPParams *dp;
+    AgrepFlags mode;
+};
+
+typedef struct Agrep AgrepParams;
+
+extern const unsigned char* IUPAC_decode[256];
+rc_t na4_set_bits(const AgrepFlags mode, uint64_t* arr, const unsigned char c, const uint64_t val);
+void set_bits_2na(uint64_t* arr, unsigned char c, uint64_t val);
+
+/* Internal definitions */
+
+rc_t CC dp_end_callback( const void *cbinfo, const AgrepMatch *match, AgrepContinueFlag *flag );
+
+static __inline__
+char *create_substring ( const char *src, uint32_t sz )
+{
+    char *ret = (char*)malloc( sz + 1 );
+    strncpy ( ret, src, sz );
+    ret [ sz ] = 0;
+    return ret;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_search_priv_ */
diff --git a/libs/search/search.c b/libs/search/search.c
new file mode 100644
index 0000000..394c96d
--- /dev/null
+++ b/libs/search/search.c
@@ -0,0 +1,388 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <search/extern.h>
+#include <sysalloc.h>
+#include "search-priv.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+const unsigned char * IUPAC_decode [ 256 ];
+
+static
+void IUPAC_init ( void )
+{
+    static bool initialized;
+    if ( ! initialized )
+    {
+        const char ** t = ( const char** ) IUPAC_decode;
+
+        t['A'] = t['a'] = "Aa";
+        t['C'] = t['c'] = "Cc";
+        t['G'] = t['g'] = "Gg";
+        t['T'] = t['t'] = "Tt";
+        t['U'] = t['u'] = "Uu";
+        t['M'] = t['m'] = "AaCc";
+        t['R'] = t['r'] = "AaGg";
+        t['S'] = t['s'] = "CcGg";
+        t['V'] = t['v'] = "AaCcGg";
+        t['W'] = t['w'] = "AaTtUu";
+        t['Y'] = t['y'] = "CcTtUu";
+        t['K'] = t['k'] = "GgTtUu";
+        t['B'] = t['b'] = "CcGgTtUu";
+        t['D'] = t['d'] = "AaGgTtUu";
+        t['H'] = t['h'] = "AaCcTtUu";
+        t['N'] = t['n'] = t [ '.' ] = "AaCcGgTtUuNn.-";
+        initialized = true;
+    }
+}
+
+void set_bits_2na(uint64_t* arr, unsigned char c, uint64_t val)
+{
+    unsigned char const* tr;
+    for (tr = IUPAC_decode[c]; *tr != '\0'; ++tr)
+    {
+        switch(*tr)
+        {
+        case 'A':
+            arr[0] |= val;
+            break;
+        case 'C':
+            arr[1] |= val;
+            break;
+        case 'G':
+            arr[2] |= val;
+            break;
+        case 'T':
+        /*case 'U':*/
+            arr[3] |= val;
+            break;
+        /*case 'N':
+            arr[4] |= val;
+            break;*/
+        }
+    }
+}
+
+rc_t na4_set_bits(const AgrepFlags mode, uint64_t* arr, const unsigned char c, const uint64_t val)
+{
+    if( mode & AGREP_PATTERN_4NA ) {
+        const unsigned char* tr;
+        tr = IUPAC_decode[c];
+        if( tr == NULL ) {
+            if( (mode & AGREP_ANYTHING_ELSE_IS_N) && (c == '.' || c == '-') ) {
+                tr = IUPAC_decode['N'];
+            }
+            if( tr == NULL ) {
+                return RC(rcText, rcString, rcSearching, rcConstraint, rcOutofrange);
+            }
+        }
+        while( *tr != '\0' ) {
+            if( mode & AGREP_TEXT_EXPANDED_2NA ) {
+                switch(*tr) {
+                    case 'A':
+                        arr[0] |= val;
+                        break;
+                    case 'C':
+                        arr[1] |= val;
+                        break;
+                    case 'G':
+                        arr[2] |= val;
+                        break;
+                    case 'T':
+                    case 'U':
+                        arr[3] |= val;
+                        break;
+                    case 'N':
+                        arr[4] |= val;
+                        break;
+                }
+            }
+            arr[*tr++] |= val;
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT void CC FgrepFree( FgrepParams *self )
+{
+    if (self->dumb != NULL)
+        FgrepDumbSearchFree(self->dumb);
+    if (self->boyer != NULL)
+        FgrepBoyerSearchFree(self->boyer);
+    if (self->aho != NULL)
+        FgrepAhoFree(self->aho);
+    free(self);
+}
+
+
+LIB_EXPORT rc_t CC FgrepMake( FgrepParams **self, FgrepFlags mode, const char *strings[], uint32_t numstrings )
+{
+    *self = malloc(sizeof(FgrepParams));
+    memset(*self, 0, sizeof(FgrepParams));
+    (*self)->mode = mode;
+    if (mode & FGREP_ALG_DUMB) {
+        FgrepDumbSearchMake(&(*self)->dumb, strings, numstrings);
+    }
+    if (mode & FGREP_ALG_BOYERMOORE) {
+        FgrepBoyerSearchMake(&(*self)->boyer, strings, numstrings);
+    }
+    if (mode & FGREP_ALG_AHOCORASICK) {
+        FgrepAhoMake(&(*self)->aho, strings, numstrings);
+    }
+    return 0;
+}
+
+LIB_EXPORT uint32_t CC FgrepFindFirst( const FgrepParams *self, const char *buf, size_t len, FgrepMatch *match )
+{
+    if (self->mode & FGREP_ALG_DUMB) {
+        return FgrepDumbFindFirst(self->dumb, buf, len, match);
+    }
+    if (self->mode & FGREP_ALG_BOYERMOORE) {
+        return FgrepBoyerFindFirst(self->boyer, buf, len, match);
+    }
+    if (self->mode & FGREP_ALG_AHOCORASICK) {
+        return FgrepAhoFindFirst(self->aho, buf, len, match);
+    }
+    /* Should maybe return error code, not 1/0 */
+    return 0;
+}
+
+LIB_EXPORT rc_t CC AgrepMake( AgrepParams **self, AgrepFlags mode, const char *pattern )
+{
+    rc_t rc = 0;
+
+    if( self == NULL || pattern == NULL ) {
+        rc = RC(rcText, rcString, rcSearching, rcParam, rcNull);
+    } else if( (*self = malloc(sizeof(AgrepParams))) == NULL ) {
+        rc = RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+    } else {
+        memset((*self), 0, sizeof(**self));
+        (*self)->mode = mode;
+        if( mode & AGREP_PATTERN_4NA ) {
+            size_t i, l = strlen(pattern);
+            IUPAC_init();
+            if( l == 0 ) {
+                rc = RC(rcText, rcString, rcSearching, rcParam, rcOutofrange);
+            }
+            for(i = 0; rc == 0 && i < l; i++) {
+                if( IUPAC_decode[(signed char)(pattern[i])] == NULL ) {
+                    rc = RC(rcText, rcString, rcSearching, rcParam, rcOutofrange);
+                }
+            }
+        } else if( !(mode & AGREP_MODE_ASCII) ) {
+            rc = RC(rcText, rcString, rcSearching, rcParam, rcUnsupported);
+        }
+        if( rc == 0 ) {
+            IUPAC_init(); /* TODO: this is temporary solution */
+            if(mode & AGREP_ALG_WUMANBER) {
+                if( (rc = AgrepWuMake(&(*self)->wu, mode, pattern)) == 0 ) {
+                    rc = AgrepDPMake(&(*self)->dp, mode, pattern);
+                }
+            } else if(mode & AGREP_ALG_MYERS) {
+                if( (rc = AgrepMyersMake(&(*self)->myers, mode, pattern)) == 0 ) {
+                    /*TODO: now agrep is being used without DP, so we need to turn off AgrepDPMake here*/
+                    rc = AgrepDPMake(&(*self)->dp, mode, pattern);
+                }
+            } else if(mode & AGREP_ALG_MYERS_UNLTD) {
+                if( (rc = MyersUnlimitedMake(&(*self)->myersunltd, mode, pattern)) == 0 ) {
+                    rc = AgrepDPMake(&(*self)->dp, mode, pattern);
+                }
+            } else if(mode & AGREP_ALG_DP) {
+                rc = AgrepDPMake(&(*self)->dp, mode, pattern);
+            } else {
+                rc = RC(rcText, rcString, rcSearching, rcParam, rcInvalid);
+            }
+        }
+    }
+    if( rc != 0 ) {
+        AgrepWhack(*self);
+    }
+    return rc;
+}
+
+LIB_EXPORT void CC AgrepWhack( AgrepParams *self )
+{
+    if( self != NULL ) {
+        if( self->wu ) {
+            AgrepWuFree(self->wu);
+        }
+        if( self->myers ) {
+            AgrepMyersFree(self->myers);
+        }
+        if( self->myersunltd ) {
+            MyersUnlimitedFree(self->myersunltd);
+        }
+        if( self->dp ) {
+            AgrepDPFree(self->dp);
+        }
+        free(self);
+    }
+}
+
+LIB_EXPORT void CC AgrepFindAll( const AgrepCallArgs *args )
+{
+    if( args != NULL ) {
+        const AgrepParams *self = args->self;
+
+        if(self->mode & AGREP_ALG_WUMANBER) {
+            AgrepWuFindAll(args);
+        } else if(self->mode & AGREP_ALG_MYERS) {
+            MyersFindAll(args);
+        } else if(self->mode & AGREP_ALG_MYERS_UNLTD) {
+            MyersUnlimitedFindAll(args);
+        } else if (self->mode & AGREP_ALG_DP) {
+            AgrepDPFindAll(args);
+        }
+    }
+}
+
+LIB_EXPORT uint32_t CC AgrepFindFirst( const AgrepParams *self, int32_t threshold, const char *buf, size_t len, AgrepMatch *match )
+{
+    if( self != NULL && buf != NULL && match != NULL ) {
+        if (self->mode & AGREP_ALG_WUMANBER) {
+            return AgrepWuFindFirst(self->wu, threshold, buf, (int32_t)len, match);
+        }
+        if (self->mode & AGREP_ALG_MYERS) {
+            return MyersFindFirst(self->myers, threshold, buf, len, match);
+        }
+        if (self->mode & AGREP_ALG_MYERS_UNLTD) {
+            return MyersUnlimitedFindFirst(self->myersunltd, threshold, buf, len, match);
+        }
+        if (self->mode & AGREP_ALG_DP) {
+            return AgrepDPFindFirst(self->dp, threshold, self->mode, buf, (int32_t)len, match);
+        }
+    }
+    /* Not sure this is the right thing to return. */
+    return 0;
+}
+
+static 
+rc_t CC AgrepFindBestCallback(const void *cbinfo, const AgrepMatch *matchinfo, AgrepContinueFlag *flag)
+{
+    AgrepMatch *best = (AgrepMatch *)cbinfo;
+    if (best->score == -1 || best->score > matchinfo->score) {
+        *best = *matchinfo;
+    }
+    return 0;
+}
+
+LIB_EXPORT uint32_t CC AgrepFindBest( const AgrepParams *self, int32_t threshold, const char *buf, int32_t len, AgrepMatch *match )
+{
+    if( self != NULL && buf != NULL && match != NULL ) {
+        AgrepCallArgs args;
+
+        args.self = self;
+        args.threshold = threshold;
+        args.buf = buf;
+        args.buflen = len;
+        args.cb = AgrepFindBestCallback;
+        args.cbinfo = match;
+
+        match->score = -1;
+        
+        AgrepFindAll(&args);
+        if (match->score != -1) {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+
+LIB_EXPORT size_t CC FindLongestCommonSubstring(char const* pS1, char const* pS2, size_t const nLen1, size_t const nLen2, size_t* pRetStart1, size_t* pRetStart2)
+{
+/*
+    return: the length of the substring found
+    pRetStart1: ptr to return value - starting position on the substring found in the pS1, NULL is OK
+    pRetStart2: ptr to return value - starting position on the substring found in the pS2, NULL is OK
+
+    WARNING: the memory usage is optimized to store only one row (not column) of DP matrix
+    and there is hardcoded limit for the number of columns
+    so it's recommended to pass the shortest string as pS2 parameter.
+    Intended usage: pS1 - text (read), pS2 - pattern (linker, bar-code)
+
+    TODO: use suffix arrays + LCP to achieve O(n) complexity (n = nLen1 + nLen2)
+*/
+
+    size_t dpPrevRow[64]; /* this is row #(iRow-1) of DP matrix on each step of iRow-loop below*/
+
+    size_t dpCurNewCell;  /* this is cell (iRow, iCol) of DP matrix on each step inside iCol-loop below */
+    size_t dpPrevNewCell; /* this is cell (iRow, iCol-1) of DP matrix on each step inside iCol-loop below*/
+    size_t iRow, iCol;
+    size_t start_placeholder;
+    size_t nMaxLen = 0;
+
+    dpPrevNewCell = 0;
+    dpCurNewCell = 0;
+
+    assert(sizeof(dpPrevRow)/sizeof(dpPrevRow[0]) >= nLen2);
+
+    /* allow NULLs in pRetStart1 or pRetStart2 */
+    if (!pRetStart1)
+        pRetStart1 = &start_placeholder;
+    if (!pRetStart2)
+        pRetStart2 = &start_placeholder;
+
+    *pRetStart1 = *pRetStart2 = 0;
+
+    for (iRow = 0; iRow < nLen1; ++iRow)
+    {
+        for (iCol = 0; iCol < nLen2; ++iCol)
+        {
+            if (pS1[iRow] == pS2[iCol])
+            {
+                if (iRow == 0 || iCol == 0)
+                {
+                    dpPrevRow[iCol] = 1;
+                    dpCurNewCell = 1;
+                }
+                else
+                    dpCurNewCell = dpPrevRow[iCol - 1] + 1;
+
+                if (dpCurNewCell > nMaxLen)
+                {
+                    nMaxLen = dpCurNewCell;
+                    *pRetStart1 = iRow; /* now it's actually end. It's to be corrected before return */
+                    *pRetStart2 = iCol; /* now it's actually end. It's to be corrected before return */
+                }
+            }
+            else
+            {
+                dpCurNewCell = 0;
+            }
+
+            if (iCol > 0)
+                dpPrevRow[iCol - 1] = dpPrevNewCell;
+            dpPrevNewCell = dpCurNewCell;
+        }
+        dpPrevRow[iCol - 1] = dpCurNewCell;
+    }
+    *pRetStart1 = *pRetStart1 - nMaxLen + 1;
+    *pRetStart2 = *pRetStart2 - nMaxLen + 1;
+    return nMaxLen;
+}
diff --git a/libs/search/sw-search.c b/libs/search/sw-search.c
new file mode 100644
index 0000000..1fde81c
--- /dev/null
+++ b/libs/search/sw-search.c
@@ -0,0 +1,1496 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <search/ref-variation.h>
+#include <search/smith-waterman.h>
+
+#include <klib/rc.h>
+#include <klib/refcount.h>
+#include <klib/text.h>
+
+#include <insdc/insdc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#if WINDOWS
+#include <intrin.h>
+#ifndef __builtin_popcount
+#define __builtin_popcount __popcnt
+#endif
+#endif
+
+#include <sysalloc.h>
+
+#ifndef min
+#define min(x,y) ((y) < (x) ? (y) : (x))
+#endif
+
+#ifndef max
+#define max(x,y) ((y) >= (x) ? (y) : (x))
+#endif
+
+#define max4(x1, x2, x3, x4) (max( max((x1),(x2)), max((x3),(x4)) ))
+
+#define COMPARE_4NA 0
+#define CACHE_MAX_ROWS 0 /* and columns as well */
+#define GAP_SCORE_LINEAR 0
+#define SIMILARITY_MATCH 2
+#define SIMILARITY_MISMATCH -1
+#define SW_DEBUG_PRINT 0
+
+struct RefVariation
+{
+    KRefcount refcount;
+
+    INSDC_dna_text* var_buffer; /* in the case of deletion
+        it contains <ref_base_before><allele><ref_base_after>
+        otherwise it contains allele only */
+    INSDC_dna_text const* allele; /* points to allele in the var_buffer */
+    size_t allele_start;
+    size_t var_buffer_size;
+    size_t allele_size;
+    size_t allele_len_on_ref;
+};
+
+
+#if COMPARE_4NA == 1
+
+unsigned char const map_char_to_4na [256] =
+{
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 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,14, 2,13, 0, 0, 4,11, 0, 0,12, 0, 3,15, 0,
+    0, 0, 5, 6, 8, 0, 7, 9, 0,10, 0, 0, 0, 0, 0, 0,
+    0, 1,14, 2,13, 0, 0, 4,11, 0, 0,12, 0, 3,15, 0,
+    0, 0, 5, 6, 8, 0, 7, 9, 0,10, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static int compare_4na ( INSDC_dna_text ch2na, INSDC_dna_text ch4na )
+{
+    unsigned char bits4na = map_char_to_4na [(unsigned char)ch4na];
+    unsigned char bits2na = map_char_to_4na [(unsigned char)ch2na];
+
+    /*return (bits2na & bits4na) != 0 ? 2 : -1;*/
+
+    unsigned char popcnt4na = (unsigned char) __builtin_popcount ( bits4na );
+
+    return (bits2na & bits4na) != 0 ? 12 / popcnt4na : -6;
+}
+#endif
+
+static int similarity_func (INSDC_dna_text ch2na, INSDC_dna_text ch4na)
+{
+#if COMPARE_4NA == 1
+    return compare_4na ( ch2na, ch4na );
+#else
+    return tolower(ch2na) == tolower(ch4na) ? SIMILARITY_MATCH : SIMILARITY_MISMATCH;
+#endif
+}
+
+static int gap_score_const ( size_t idx )
+{
+    return -1;
+}
+
+static int gap_score_linear ( size_t idx )
+{
+#if COMPARE_4NA == 1
+    return -6*(int)idx;
+#else
+    return -(int)idx;
+#endif
+}
+
+static int (*gap_score_func) (size_t ) =
+#if GAP_SCORE_LINEAR != 0
+    gap_score_linear
+#else
+    gap_score_const
+#endif
+; 
+
+typedef struct ValueIndexPair
+{
+    size_t index;
+    int value;
+} ValueIndexPair;
+
+
+static char get_char (INSDC_dna_text const* str, size_t size, size_t pos, bool reverse)
+{
+    if ( !reverse )
+        return str [pos];
+    else
+        return str [size - pos - 1];
+}
+
+rc_t calculate_similarity_matrix (
+    INSDC_dna_text const* text, size_t size_text,
+    INSDC_dna_text const* query, size_t size_query,
+    bool gap_score_constant,
+    int* matrix, bool reverse, 
+    int* max_score, size_t* max_row, size_t* max_col )
+{
+
+    size_t ROWS = size_text + 1;
+    size_t COLUMNS = size_query + 1;
+    size_t i, j;
+
+    /* arrays to store maximums for all previous rows and columns */
+#if CACHE_MAX_ROWS != 0
+
+    ValueIndexPair* vec_max_cols = NULL;
+    ValueIndexPair* vec_max_rows = NULL;
+
+    vec_max_cols = calloc ( COLUMNS, sizeof vec_max_cols [ 0 ] );
+    if ( vec_max_cols == NULL)
+        return RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+
+    vec_max_rows = calloc ( ROWS, sizeof vec_max_rows [ 0 ] );
+    if ( vec_max_rows == NULL)
+    {
+        free (vec_max_cols);
+        return RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+    }
+
+#endif
+    gap_score_func = gap_score_constant ? gap_score_const : gap_score_linear;
+
+    if ( max_score != NULL )
+    {
+        *max_score = 0;
+    }
+    if ( max_row != NULL )
+    {
+        *max_row = 0;
+    }
+    if ( max_col != NULL )
+    {
+        *max_col = 0;
+    }
+    // init 1st row and column with zeros
+    memset ( matrix, 0, COLUMNS * sizeof(matrix[0]) );
+    for ( i = 1; i < ROWS; ++i )
+        matrix [i * COLUMNS] = 0;
+
+    for ( i = 1; i < ROWS; ++i )
+    {
+        for ( j = 1; j < COLUMNS; ++j )
+        {
+#if CACHE_MAX_ROWS == 0
+            size_t k, l;
+#endif
+            int cur_score_del, cur_score_ins;
+            int sim = similarity_func (
+                            get_char (text, size_text, i-1, reverse),
+                            get_char (query, size_query, j-1, reverse) );
+
+#if CACHE_MAX_ROWS != 0
+            /* TODO: incorrect logic: we cache max{matrix[x,y]}
+                instead of max{matrix[x,y] + gap_score_func(v)}
+                when it's fixed we probably will need to make adjustments here
+            */
+            cur_score_del = vec_max_cols[j].value + gap_score_func(j - vec_max_cols[j].index);
+#else
+            cur_score_del = -1;
+            for ( k = 1; k < i; ++k )
+            {
+                int cur = matrix [ (i - k)*COLUMNS + j ] + gap_score_func(k);
+                if ( cur > cur_score_del )
+                    cur_score_del = cur;
+            }
+#endif
+
+#if CACHE_MAX_ROWS != 0
+            /* TODO: incorrect logic: we cache max{matrix[x,y]}
+                instead of max{matrix[x,y] + gap_score_func(v)}
+                when it's fixed we probably will need to make adjustments here
+            */
+            cur_score_ins = vec_max_rows[i].value + gap_score_func(i - vec_max_rows[i].index);;
+#else
+            
+            cur_score_ins = -1;
+            for ( l = 1; l < j; ++l )
+            {
+                int cur = matrix [ i*COLUMNS + (j - l) ] + gap_score_func(l);
+                if ( cur > cur_score_ins )
+                    cur_score_ins = cur;
+            }
+#endif
+            {
+                int score = max4 ( 0,
+                                   matrix[(i-1)*COLUMNS + j - 1] + sim,
+                                   cur_score_del,
+                                   cur_score_ins);
+                matrix[i*COLUMNS + j] = score;
+                if ( max_score != NULL && score > *max_score )
+                {
+                    *max_score = score;
+                    if ( max_row != NULL )
+                    {
+                        *max_row = i;
+                    }
+                    if ( max_col != NULL )
+                    {
+                        *max_col = j;
+                    }
+                }
+            }
+
+#if CACHE_MAX_ROWS != 0
+            /* TODO: incorrect logic: we cache max{matrix[x,y]}
+                instead of max{matrix[x,y] + gap_score_func(v)}
+            */
+            if ( matrix[i*COLUMNS + j] > vec_max_cols[j].value )
+            {
+                vec_max_cols[j].value = matrix[i*COLUMNS + j];
+                vec_max_cols[j].index = j;
+            }
+#if GAP_SCORE_LINEAR != 0
+            vec_max_cols[j].value += gap_score_func(1);
+#endif
+
+#endif
+#if CACHE_MAX_ROWS != 0
+            /* TODO: incorrect logic: we cache max{matrix[x,y]}
+                instead of max{matrix[x,y] + gap_score_func(v)}
+            */
+            if ( matrix[i*COLUMNS + j] > vec_max_rows[i].value )
+            {
+                vec_max_rows[i].value = matrix[i*COLUMNS + j];
+                vec_max_rows[i].index = i;
+            }
+#if GAP_SCORE_LINEAR != 0
+            vec_max_rows[i].value += gap_score_func(1);
+#endif
+
+#endif
+        }
+    }
+
+#if CACHE_MAX_ROWS != 0
+    free (vec_max_cols);
+    free (vec_max_rows);
+#endif
+
+    return 0;
+}
+
+void 
+sw_find_indel_box ( int* matrix, size_t ROWS, size_t COLUMNS,
+    int* ret_row_start, int* ret_row_end,
+    int* ret_col_start, int* ret_col_end )
+{
+    size_t max_row = 0, max_col = 0;
+    size_t max_i = ROWS*COLUMNS - 1;
+
+    size_t i = max_i, j;
+    int prev_indel = 0;
+    
+    max_row = max_i / COLUMNS;
+    max_col = max_i % COLUMNS;
+
+    *ret_row_start = *ret_row_end = *ret_col_start = *ret_col_end = -1;
+
+    i = max_row;
+    j = max_col;
+
+    /* traceback to (0,0)-th element of the matrix */
+    while (1)
+    {
+        if (i > 0 && j > 0)
+        {
+            /* TODO: ? strong '>' - because we want to prefer indels over matches/mismatches here
+            (expand the window of ambiguity as much as possible)*/
+            if ( matrix [(i - 1)*COLUMNS + (j - 1)] >= matrix [i*COLUMNS + (j - 1)] &&
+                matrix [(i - 1)*COLUMNS + (j - 1)] >= matrix [(i - 1)*COLUMNS + j])
+            {
+                int diag_diff = matrix [i*COLUMNS + j] - matrix [(i - 1)*COLUMNS + (j - 1)];
+                int mismatch = diag_diff == SIMILARITY_MATCH ? 0 : 1;
+
+                if (mismatch && *ret_row_end == -1 )
+                {
+                    *ret_row_end = (int)i;
+                    *ret_col_end = (int)j;
+                }
+
+                --i;
+                --j;
+
+                if (prev_indel || mismatch)
+                {
+                    *ret_row_start = (int)i;
+                    *ret_col_start = (int)j;
+                }
+
+                prev_indel = 0;
+            }
+            else if ( matrix [(i - 1)*COLUMNS + (j - 1)] < matrix [i*COLUMNS + (j - 1)] )
+            {
+                if ( *ret_row_end == -1 )
+                {
+                    *ret_row_end = (int)i;
+                    *ret_col_end = (int)j;
+                }
+                --j;
+                prev_indel = 1;
+            }
+            else
+            {
+                if ( *ret_row_end == -1 )
+                {
+                    *ret_row_end = (int)i;
+                    *ret_col_end = (int)j;
+                }
+                --i;
+                prev_indel = 1;
+            }
+        }
+        else if ( i > 0 )
+        {
+            if ( *ret_row_end == -1 )
+            {
+                *ret_row_end = (int)i;
+                *ret_col_end = 0;
+            }
+            *ret_row_start = 0;
+            *ret_col_start = 0;
+            break;
+        }
+        else if ( j > 0 )
+        {
+            if ( *ret_row_end == -1 )
+            {
+                *ret_row_end = 0;
+                *ret_col_end = (int)j;
+            }
+            *ret_row_start = 0;
+            *ret_col_start = 0;
+            break;
+        }
+        else
+        {
+            break;
+        }
+    }
+}
+
+#if SW_DEBUG_PRINT != 0
+#include <stdio.h>
+void print_matrix ( int const* matrix,
+                    char const* ref_slice, size_t ref_slice_size,
+                    char const* query, size_t query_size,
+                    bool reverse )
+{
+    size_t COLUMNS = ref_slice_size + 1;
+    size_t ROWS = query_size + 1;
+
+    int print_width = 2;
+    size_t i, j;
+
+    printf ("  %*c ", print_width, '-');
+    for (j = 1; j < COLUMNS; ++j)
+        printf ("%*c ", print_width, get_char ( ref_slice, ref_slice_size, j-1, reverse ));
+    printf ("\n");
+
+    for (i = 0; i < ROWS; ++i)
+    {
+        if ( i == 0 )
+            printf ("%c ", '-');
+        else
+            printf ("%c ", get_char (query, query_size, i-1, reverse ));
+    
+        for (j = 0; j < COLUMNS; ++j)
+        {
+            printf ("%*d ", print_width, matrix[i*COLUMNS + j]);
+        }
+        printf ("\n");
+    }
+}
+
+#endif
+
+/*
+    FindRefVariationBounds uses Smith-Waterman algorithm
+    to find theoretical bounds of the variation for
+    the given reference slice and the query (properly preapared,
+    i.e. containing sequences of bases at the beginning and
+    the end matching the reference)
+
+    ref_slice, ref_slice_size [IN] - the reference slice on which the
+                                     variation will be looked for
+    query, query_size [IN] - the query that represents the variation placed
+                             inside the reference slice
+    ref_start, ref_len [OUT, NULL OK] - the region of ambiguity on the reference
+    have_indel [OUT] - pointer to flag indication if there is an insertion or deletion
+                       (1 - there is an indel, 0 - there is match/mismatch only)
+*/
+static
+rc_t FindRefVariationBounds (
+    INSDC_dna_text const* ref_slice, size_t ref_slice_size,
+    INSDC_dna_text const* query, size_t query_size,
+    size_t* ref_start, size_t* ref_len, bool * has_indel
+    )
+{
+    /* building sw-matrix for chosen reference slice and sequence */
+
+    size_t COLUMNS = ref_slice_size + 1;
+    size_t ROWS = query_size + 1;
+    rc_t rc = 0;
+    
+    bool gap_score_constant = ( GAP_SCORE_LINEAR == 0 );
+
+    int row_start, col_start, row_end, col_end;
+    int row_start_rev, col_start_rev, row_end_rev, col_end_rev;
+    int* matrix = malloc( ROWS * COLUMNS * sizeof (int) );
+    if (matrix == NULL)
+        return RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+    * has_indel = true;
+    
+    
+    /* forward scan */
+    rc = calculate_similarity_matrix ( query, query_size, ref_slice, ref_slice_size, gap_score_constant, matrix, false, NULL, NULL, NULL );
+    if ( rc != 0 )
+        goto free_resources;
+#if SW_DEBUG_PRINT != 0
+    print_matrix ( matrix, ref_slice, ref_slice_size, query, query_size, false );
+#endif
+
+    sw_find_indel_box ( matrix, ROWS, COLUMNS, &row_start, &row_end, &col_start, &col_end );
+    if ( row_start == -1 && row_end == -1 && col_start == -1 && col_end == -1 )
+    {
+        * has_indel = 0;
+        goto free_resources;
+    }
+#if SW_DEBUG_PRINT != 0
+    printf ("start=(%d, %d), end=(%d, %d)\n", row_start, col_start, row_end, col_end);
+#endif
+
+    /* reverse scan */
+    rc = calculate_similarity_matrix ( query, query_size, ref_slice, ref_slice_size, gap_score_constant, matrix, true, NULL, NULL, NULL );
+    if ( rc != 0 )
+        goto free_resources;
+#if SW_DEBUG_PRINT != 0
+    print_matrix ( matrix, ref_slice, ref_slice_size, query, query_size, true );
+#endif
+
+    sw_find_indel_box ( matrix, ROWS, COLUMNS, &row_start_rev, &row_end_rev, &col_start_rev, &col_end_rev );
+#if SW_DEBUG_PRINT != 0
+    printf ("start_rev=(%d, %d), end_rev=(%d, %d)\n", row_start_rev, col_start_rev, row_end_rev, col_end_rev);
+#endif
+    if ( row_start_rev != -1 || row_end_rev != -1 || col_start_rev != -1 || col_end_rev != -1 )
+    {
+        row_start = min ( (int)query_size - row_end_rev - 1, row_start );
+        row_end   = max ( (int)query_size - row_start_rev - 1, row_end );
+        col_start = min ( (int)ref_slice_size - col_end_rev - 1, col_start );
+        col_end   = max ( (int)ref_slice_size - col_start_rev - 1, col_end );
+    }
+#if SW_DEBUG_PRINT != 0
+    printf ("COMBINED: start=(%d, %d), end=(%d, %d)\n", row_start, col_start, row_end, col_end);
+#endif
+
+    if ( ref_start != NULL )
+        *ref_start = col_start + 1;
+    if ( ref_len != NULL )
+        *ref_len = col_end - col_start - 1;
+
+free_resources:
+    free (matrix);
+
+    return rc;
+}
+
+/****************************************************/
+/* yet another string helper */
+typedef struct c_string_const
+{
+    char const* str;
+    size_t size;
+} c_string_const;
+
+static void c_string_const_assign ( c_string_const* self, char const* src, size_t size )
+{
+    self -> str = src;
+    self -> size = size;
+}
+
+typedef struct c_string
+{
+    char* str;
+    size_t size;
+    size_t capacity;
+} c_string;
+
+static int c_string_make ( c_string* self, size_t capacity )
+{
+    assert ( capacity > 0 );
+    self -> str = malloc (capacity + 1);
+    if ( self -> str != NULL )
+    {
+        self -> str [0] = '\0';
+        self -> size = 0;
+        self -> capacity = capacity;
+        return 1;
+    }
+    else
+        return 0;
+}
+
+static void c_string_destruct ( c_string* self )
+{
+    if ( self->str != NULL )
+    {
+        free ( self -> str );
+        self -> str = NULL;
+        self -> size = 0;
+        self -> capacity = 0;
+    }
+}
+
+static int c_string_realloc_no_preserve ( c_string* self, size_t new_capacity )
+{
+    if ( self -> capacity < new_capacity )
+    {
+        c_string_destruct ( self );
+
+        return c_string_make ( self, new_capacity );
+    }
+    else
+    {
+        self -> str [0] = '\0';
+        self -> size = 0;
+    }
+
+    return 1;
+}
+
+static int c_string_assign ( c_string* self, char const* src, size_t src_size )
+{
+    assert ( self->capacity >= src_size );
+    if ( self->capacity < src_size && !c_string_realloc_no_preserve (self, max(self->capacity * 2, src_size)) )
+        return 0;
+
+    memmove ( self -> str, src, src_size );
+    self -> str [src_size] = '\0';
+    self -> size = src_size;
+
+    return 1;
+}
+
+static int c_string_append ( c_string* self, char const* append, size_t append_size)
+{
+    if ( append_size != 0 )
+    {
+        size_t new_size = self->size + append_size;
+        if ( self->capacity >= new_size )
+        {
+            memmove ( self->str + self->size, append, append_size );
+            self->size = new_size;
+            self->str [new_size] = '\0';
+        }
+        else
+        {
+            size_t new_capacity = max (new_size + 1, self->capacity * 2);
+            char* new_str = malloc ( new_capacity );
+            if (new_str == NULL)
+                return 0;
+
+            memmove (new_str, self->str, self->size);
+            memmove (new_str + self->size, append, append_size );
+            new_str [ new_size ] = '\0';
+
+            c_string_destruct ( self );
+        
+            self->str = new_str;
+            self->size = new_size;
+            self->capacity = new_capacity;
+        }
+    }
+
+    return 1;
+}
+
+#if 0
+static int c_string_wrap ( c_string* self,
+    char const* prefix, size_t prefix_size,
+    char const* postfix, size_t postfix_size)
+{
+    assert ( self -> str != NULL );
+    size_t new_size = self->size + prefix_size + postfix_size;
+
+    if ( new_size > self->capacity )
+    {
+        size_t new_capacity = max (new_size + 1, self->capacity * 2);
+        char* new_str = malloc ( new_capacity );
+        if (new_str == NULL)
+            return 0;
+
+        memmove ( new_str, prefix, prefix_size );
+        memmove ( new_str + prefix_size, self -> str, self -> size );
+        memmove ( new_str + prefix_size + self->size, postfix, postfix_size );
+        new_str [ new_size ] = '\0';
+
+        c_string_destruct ( self );
+        
+        self->str = new_str;
+        self->size = new_size;
+        self->capacity = new_capacity;
+    }
+    else
+    {
+        memmove ( self->str + prefix_size, self->str, self->size );
+        memmove ( self->str, prefix, prefix_size );
+        memmove (self->str + prefix_size + self->size, postfix, postfix_size );
+        self->str [new_size] = '\0';
+    }
+    return 1;
+}
+#endif
+/************************************************/
+
+
+/*
+   returns true if a new ref_slice is selected
+   returns false if the new ref_slice is the same as the previous one passed in ref_slice
+*/
+
+static bool get_ref_slice (
+            INSDC_dna_text const* ref, size_t ref_size, size_t ref_pos_var,
+            size_t var_len_on_ref,
+            size_t slice_expand_left, size_t slice_expand_right,
+            c_string_const* ref_slice)
+{
+    size_t ref_start, ref_xend;
+    if ( ref_pos_var < slice_expand_left )
+        ref_start = 0;
+    else
+        ref_start = ref_pos_var - slice_expand_left;
+
+    if ( ref_pos_var + slice_expand_right + var_len_on_ref >= ref_size )
+        ref_xend = ref_size;
+    else
+        ref_xend = ref_pos_var + slice_expand_right + var_len_on_ref;
+
+    if ( ref_slice->str == ref + ref_start && ref_slice->size == ref_xend - ref_start)
+        return false;
+
+    c_string_const_assign ( ref_slice, ref + ref_start, ref_xend - ref_start );
+    return true;
+}
+
+#if 1
+static bool make_query ( c_string_const const* ref_slice,
+        INSDC_dna_text const* variation, size_t variation_size, size_t var_len_on_ref,
+        int64_t var_start_pos_adj, /* ref_pos adjusted to the beginning of ref_slice (in the simplest case - the middle of ref_slice) */
+        c_string* query
+    )
+{
+    if ( !c_string_realloc_no_preserve (query, variation_size + ref_slice->size - var_len_on_ref) )
+        return false;
+
+    if ( !c_string_append (query, ref_slice->str, var_start_pos_adj) ||
+         !c_string_append (query, variation, variation_size) ||
+         !c_string_append (query, ref_slice->str + var_start_pos_adj + var_len_on_ref, ref_slice->size - var_start_pos_adj - var_len_on_ref) )
+    {
+         return false;
+    }
+
+    return true;
+}
+
+static bool compose_variation ( c_string_const const* ref,
+        size_t ref_start, size_t ref_len,
+        INSDC_dna_text const* query, size_t query_len,
+        int64_t ref_pos_var, size_t var_len_on_ref,
+        c_string* variation, char const** pallele, size_t* pallele_size )
+{
+    bool ret = true;
+
+    size_t ref_end_orig = (size_t)ref_pos_var + var_len_on_ref;
+    size_t ref_end_new = ref_start + ref_len;
+
+    size_t prefix_start = ref_start, prefix_len, query_trim_l;
+    size_t postfix_start = ref_end_orig, postfix_len, query_trim_r;
+
+    size_t query_len_new, var_len;
+
+    size_t allele_expanded_l = 0, allele_expanded_r = 0;
+
+    if ((int64_t)ref_start <= ref_pos_var) /* left bound is expanded */
+    {
+        prefix_len = (size_t)ref_pos_var - ref_start;
+        query_trim_l = 0;
+
+        assert ((int64_t)prefix_len >= 0);
+    }
+    else /* left bound is shrinked */
+    {
+        prefix_len = 0;
+        query_trim_l = ref_start - (size_t)ref_pos_var;
+
+        assert ((int64_t)query_trim_l >= 0);
+    }
+
+    if (ref_end_new >= ref_end_orig) /* right bound is expanded */
+    {
+        postfix_start = ref_end_orig;
+        postfix_len = ref_end_new - ref_end_orig;
+        query_trim_r = 0;
+    }
+    else /* right bound is shrinked */
+    {
+        postfix_start = ref_end_new;
+        postfix_len = 0;
+        query_trim_r = ref_end_orig - ref_end_new;
+    }
+
+    /*
+    special case: pure match/mismatch
+    algorithm gives ref_len = 0, but in this case
+    we want to have variation = input query
+    */
+    if ( ref_len == 0 && query_len == var_len_on_ref )
+    {
+        assert ( prefix_len == 0 );
+        assert ( postfix_len == 0 );
+        assert ( query_trim_l == 0 );
+        assert ( query_trim_r > 0 );
+
+        query_trim_r = 0;
+    }
+    /*
+    special case: deletion
+    we have to create a query whis is the allele
+    expanded one base to the left and to the right
+    on the reference if possible
+    */
+    else if ( var_len_on_ref > query_len )
+    {
+        if ( prefix_start > 0 )
+        {
+            allele_expanded_l = 1;
+            prefix_start -= 1;
+            ++prefix_len;
+        }
+
+        if ( postfix_start + postfix_len + 1 < ref->size)
+        {
+            allele_expanded_r = 1;
+            ++postfix_len;
+        }
+    }
+
+    query_len_new = query_len - query_trim_l - query_trim_r;
+    assert ((int64_t)query_len_new >= 0);
+    var_len = prefix_len + query_len_new + postfix_len;
+
+    if ( var_len > 0 )
+    {
+        /* non-empty variation */
+        if ( !c_string_realloc_no_preserve( variation, var_len ) )
+            ret = false;
+
+        if ( prefix_len > 0 )
+            ret = ret && c_string_assign (variation, ref->str + prefix_start, prefix_len);
+        
+        if ( query_len_new > 0 )
+            ret = ret && c_string_append (variation, query + query_trim_l, query_len_new);
+
+        if ( postfix_len > 0 )
+            ret = ret && c_string_append (variation, ref->str + postfix_start, postfix_len);
+
+        if ( ! ret )
+            c_string_destruct ( variation );
+
+        *pallele = variation->str + allele_expanded_l;
+        *pallele_size = variation->size - allele_expanded_l - allele_expanded_r;
+    }
+    else
+    {
+        /* in this case there is no query - don't allocate anything */
+        ret = true;
+        assert ( 0 ); /* since we expand deletions,
+                      this code shall not be reached.
+                      theoretically it can be reached if 
+                      reference has length == 0 only */
+    }
+
+    return ret;
+}
+
+#endif
+
+#if 0
+static bool make_query_ (
+        INSDC_dna_text const* ref, size_t ref_size, size_t ref_pos_var,
+        INSDC_dna_text const* variation, size_t variation_size, size_t var_len_on_ref,
+        size_t slice_expand_left, size_t slice_expand_right,
+        c_string* query
+    )
+{
+    size_t ref_prefix_start, ref_prefix_len, ref_suffix_start, ref_suffix_len;
+    if ( !c_string_realloc_no_preserve (query, variation_size + slice_expand_left + slice_expand_right + var_len_on_ref) )
+        return false;
+
+    if ( ref_pos_var < slice_expand_left )
+    {
+        ref_prefix_start = 0;
+        ref_prefix_len = slice_expand_left - (ref_pos_var - 1);
+    }
+    else
+    {
+        ref_prefix_start = ref_pos_var - slice_expand_left;
+        ref_prefix_len = slice_expand_left;
+    }
+
+    ref_suffix_start = ref_pos_var + var_len_on_ref;
+
+    if ( ref_suffix_start + slice_expand_right >= ref_size )
+        ref_suffix_len = ref_size - (slice_expand_right + 1);
+    else
+        ref_suffix_len = slice_expand_right;
+
+    if ( !c_string_append (query, ref + ref_prefix_start, ref_prefix_len) ||
+         !c_string_append (query, variation, variation_size) ||
+         !c_string_append (query, ref + ref_suffix_start, ref_suffix_len) )
+    {
+         return false;
+    }
+
+    return true;
+}
+#endif
+
+/*
+    FindRefVariationRegionIUPAC_SW uses Smith-Waterman algorithm
+    to find theoretical bounds of the variation for
+    the given reference, position on the reference
+    and the raw query, or variation to look for at the given
+    reference position
+
+    ref, ref_size [IN]     - the reference on which the
+                             variation will be looked for
+    ref_pos_var [IN]       - the position on reference to look for the variation
+    variation, variation_size [IN] - the variation to look for at the ref_pos_var
+    var_len_on_ref [IN]    - the length of the variation on the reference, e.g.:
+                           - mismatch, 2 bases: variation = "XY", var_len_on_ref = 2
+                           - deletion, 3 bases: variation = "", var_len_on_ref = 3
+                           - insertion, 2 bases:  variation = "XY", var_len_on_ref = 0
+
+    p_ref_start, p_ref_len [OUT, NULL OK] - the region of ambiguity on the reference
+                                            (return values)
+*/
+
+static rc_t CC FindRefVariationRegionIUPAC_SW (
+        INSDC_dna_text const* ref, size_t ref_size, size_t ref_pos_var,
+        INSDC_dna_text const* variation, size_t variation_size, size_t var_len_on_ref,
+        size_t* p_ref_start, size_t* p_ref_len
+    )
+{
+    rc_t rc = 0;
+
+    size_t var_half_len = 1;/*variation_size / 2 + 1;*/
+
+    size_t exp_l = var_half_len;
+    size_t exp_r = var_half_len;
+
+    /* previous start and end for reference slice */
+    int64_t slice_start = -1, slice_end = -1;
+
+    c_string_const ref_slice;
+    c_string query;
+
+    size_t ref_start = 0, ref_len = 0;
+
+    ref_slice.str = NULL;
+    ref_slice.size = 0;
+
+    if ( !c_string_make ( & query, ( variation_size + 1 ) * 2 ) )
+        return RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+
+    while ( 1 )
+    {
+        int64_t new_slice_start, new_slice_end;
+        int64_t ref_pos_adj;
+        int cont = 0;
+        bool has_indel = false;
+
+        /* get new expanded slice and check if it has not reached the bounds of ref */
+        bool slice_expanded = get_ref_slice ( ref, ref_size, ref_pos_var, var_len_on_ref, exp_l, exp_r, & ref_slice );
+        if ( !slice_expanded )
+            break;
+
+        /* get ref_pos relative to ref_slice start and new slice_start and end */
+        ref_pos_adj = (int64_t)ref_pos_var - ( ref_slice.str - ref );
+        new_slice_start = ref_slice.str - ref;
+        new_slice_end = new_slice_start + ref_slice.size;
+
+        /* compose a new query for newly extended ref slice */
+        /*if ( !make_query_( ref, ref_size, ref_pos_var, variation, variation_size, var_len_on_ref, exp_l, exp_r, & query ) )*/
+        if ( !make_query ( & ref_slice, variation, variation_size, var_len_on_ref, ref_pos_adj, & query ) )
+        {
+            rc = RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+            goto free_resources;
+        }
+
+        rc = FindRefVariationBounds ( ref_slice.str, ref_slice.size,
+                        query.str, query.size, & ref_start, & ref_len, & has_indel );
+
+        /* if there are no indels report that there is no ambiguity
+           for the given ref_pos_var: region starting at ref_pos_var has length = 0
+           ambiguity
+        */
+        if ( !has_indel )
+        {
+            ref_start = ref_pos_adj;
+            ref_len = 0;
+        }
+
+        if ( rc != 0 )
+            goto free_resources;
+
+        /* if we've found the ambiguity window starting at the very
+           beginning of the ref slice and if we're still able to extend
+           ref slice to the left (haven't bumped into boundary) - extend to the left
+           and repeat the search
+        */
+        if ( ref_start == 0 && (slice_start == -1 || new_slice_start != slice_start ) )
+        {
+            exp_l *= 2;
+            cont = 1;
+        }
+
+        /* if we've found the ambiguity window ending at the very
+           end of the ref slice and if we're still able to extend
+           ref slice to the right (haven't bumped into boundary) - extend to the right
+           and repeat the search
+        */
+        if ( ref_start + ref_len == ref_slice.size && (slice_end == -1 || new_slice_end != slice_end) )
+        {
+            exp_r *= 2;
+            cont = 1;
+        }
+
+        if ( !cont )
+            break;
+
+        slice_start = new_slice_start;
+        slice_end = new_slice_end;
+    }
+    if ( p_ref_start != NULL )
+        *p_ref_start = ref_start + (ref_slice.str - ref);
+    if ( p_ref_len != NULL )
+        *p_ref_len = ref_len;
+
+free_resources:
+    c_string_destruct ( &query );
+
+    return rc;
+}
+
+/*
+    FindRefVariationRegionIUPAC_RA uses Rolling-bulldozer algorithm
+    to find theoretical bounds of the variation for
+    the given reference, position on the reference
+    and the raw query, or variation to look for at the given
+    reference position
+
+    ref, ref_size [IN]     - the reference on which the
+                             variation will be looked for
+    ref_pos_var [IN]       - the position on reference to look for the variation
+    variation, variation_size [IN] - the variation to look for at the ref_pos_var
+    var_len_on_ref [IN]    - the length of the variation on the reference, e.g.:
+                           - mismatch, 2 bases: variation = "XY", var_len_on_ref = 2
+                           - deletion, 3 bases: variation = "", var_len_on_ref = 3
+                           - insertion, 2 bases:  variation = "XY", var_len_on_ref = 0
+
+    p_ref_start, p_ref_len [OUT, NULL OK] - the region of ambiguity on the reference
+                                            (return values)
+*/
+
+static rc_t CC FindRefVariationRegionIUPAC_RA (
+        INSDC_dna_text const* ref, size_t ref_size, size_t ref_pos_var,
+        INSDC_dna_text const* variation, size_t variation_size, size_t var_len_on_ref,
+        size_t* p_ref_start, size_t* p_ref_len
+    )
+{
+    rc_t rc = 0;
+    size_t del_pos_start, del_pos_xend;
+    size_t ins_pos_start, ins_pos_xend;
+
+    /* Stage 1: trying to expand deletion */
+
+    /* expanding to the left */
+    if (var_len_on_ref > 0)
+    {
+        for (del_pos_start = ref_pos_var;
+            del_pos_start != 0 && ref[del_pos_start-1] == ref[del_pos_start-1 + var_len_on_ref];
+            --del_pos_start);
+
+        /* expanding to the right */
+        for (del_pos_xend = ref_pos_var + var_len_on_ref;
+            del_pos_xend < ref_size && ref[del_pos_xend] == ref[del_pos_xend - var_len_on_ref];
+            ++del_pos_xend);
+    }
+    else
+    {
+        del_pos_start = ref_pos_var;
+        del_pos_xend = ref_pos_var;
+    }
+
+    /* Stage 2: trying to expand insertion */
+
+    /* expanding to the left */
+    /* roll first repetition to the left (avoiding % operation) */
+    if (variation_size > 0)
+    {
+        if (del_pos_start > 0)
+        {
+            for (ins_pos_start = ref_pos_var; ins_pos_start != 0; --ins_pos_start)
+            {
+                size_t pos_in_var = ins_pos_start-1 - ref_pos_var + variation_size;
+                size_t pos_in_ref = ins_pos_start-1;
+                if ( (int64_t)pos_in_var == -1l || ref[pos_in_ref] != variation[pos_in_var] )
+                    break;
+            }
+            /* roll beyond first repetition (still avoiding %) - now can compare with reference rather than with variation */
+            for (; ins_pos_start != 0 && ref[ins_pos_start-1] == ref[ins_pos_start-1 + variation_size];
+                --ins_pos_start);
+        }
+        else
+            ins_pos_start = 0;
+
+        /* roll first repetition to the right (avoiding % operation) */
+        if (del_pos_xend < ref_size)
+        {
+            for (ins_pos_xend = ref_pos_var + var_len_on_ref; ins_pos_xend < ref_size; ++ins_pos_xend)
+            {
+                size_t pos_in_var = ins_pos_xend - ref_pos_var - var_len_on_ref;
+                if (pos_in_var == variation_size || ref[ins_pos_xend] != variation[pos_in_var])
+                    break;
+            }
+            /* roll beyond first repetition (still avoiding %) - now can compare with reference rather than with variation */
+            if (ins_pos_xend - ref_pos_var - var_len_on_ref == variation_size)
+            {
+                for (; ins_pos_xend < ref_size && ref[ins_pos_xend] == ref[ins_pos_xend - variation_size];
+                    ++ins_pos_xend);
+            }
+        }
+        else
+            ins_pos_xend = ref_size;
+    }
+    else
+    {
+        ins_pos_start = ref_pos_var;
+        ins_pos_xend = ref_pos_var;
+    }
+
+
+    if (del_pos_start > ins_pos_start)
+        del_pos_start = ins_pos_start;
+    if (del_pos_xend < ins_pos_xend)
+        del_pos_xend = ins_pos_xend;
+
+    if ( p_ref_start != NULL )
+        *p_ref_start = del_pos_start;
+    if ( p_ref_len != NULL )
+        *p_ref_len = del_pos_xend - del_pos_start;
+
+    return rc;
+}
+
+/*
+    FindRefVariationRegionIUPAC
+    to find theoretical bounds of the variation for
+    the given reference, position on the reference
+    and the raw query, or variation to look for at the given
+    reference position
+
+    alg                    - algorithm to use for the search (one of RefVarAlg enum)
+    ref, ref_size [IN]     - the reference on which the
+                             variation will be looked for
+    ref_pos_var [IN]       - the position on reference to look for the variation
+    variation, variation_size [IN] - the variation to look for at the ref_pos_var
+    var_len_on_ref [IN]    - the length of the variation on the reference, e.g.:
+                           - mismatch, 2 bases: variation = "XY", var_len_on_ref = 2
+                           - deletion, 3 bases: variation = "", var_len_on_ref = 3
+                           - insertion, 2 bases:  variation = "XY", var_len_on_ref = 0
+
+    p_ref_start, p_ref_len [OUT, NULL OK] - the region of ambiguity on the reference
+                                            (return values)
+*/
+
+static rc_t CC FindRefVariationRegionIUPAC (
+        RefVarAlg alg, INSDC_dna_text const* ref, size_t ref_size, size_t ref_pos_var,
+        INSDC_dna_text const* variation, size_t variation_size, size_t var_len_on_ref,
+        size_t* p_ref_start, size_t* p_ref_len
+    )
+{
+    switch (alg)
+    {
+    case refvarAlgSW:
+        return FindRefVariationRegionIUPAC_SW ( ref, ref_size, ref_pos_var, variation, variation_size, var_len_on_ref, p_ref_start, p_ref_len );
+    case refvarAlgRA:
+        return FindRefVariationRegionIUPAC_RA ( ref, ref_size, ref_pos_var, variation, variation_size, var_len_on_ref, p_ref_start, p_ref_len );
+    }
+    return RC ( rcVDB, rcExpression, rcConstructing, rcParam, rcUnrecognized );
+}
+
+rc_t CC RefVariationIUPACMake (RefVariation ** obj,
+        INSDC_dna_text const* ref, size_t ref_len,
+        size_t deletion_pos, size_t deletion_len,
+        INSDC_dna_text const* insertion, size_t insertion_len
+#if REF_VAR_ALG
+        , RefVarAlg alg
+#endif
+    )
+{
+    struct RefVariation* new_obj;
+    rc_t rc = 0;
+
+    if ( ( insertion_len == 0 && deletion_len == 0 )
+        || ref_len == 0 )
+    {
+        return RC (rcText, rcString, rcSearching, rcParam, rcEmpty);
+    }
+
+    if ( (deletion_pos + deletion_len) > ref_len )
+    {
+        return RC (rcText, rcString, rcSearching, rcParam, rcOutofrange);
+    }
+
+    assert ( obj != NULL );
+
+    new_obj = calloc ( 1, sizeof * new_obj );
+
+    if ( new_obj == NULL )
+    {
+        rc = RC ( rcVDB, rcExpression, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        size_t ref_window_start = 0, ref_window_len = 0;
+        rc = FindRefVariationRegionIUPAC ( alg, ref, ref_len,
+                                           deletion_pos,
+                                           insertion, insertion_len, deletion_len,
+                                           & ref_window_start, & ref_window_len );
+        if ( rc != 0 )
+        {
+            free ( new_obj );
+            new_obj = NULL;
+        }
+        else
+        {
+            size_t allele_size = 0;
+            char const* allele = NULL;
+
+            c_string_const ref_str;
+            
+            c_string var_str;
+            var_str.capacity = var_str.size = 0;
+            var_str.str = NULL;
+
+            c_string_const_assign ( & ref_str, ref, ref_len );
+
+            if ( ! compose_variation ( & ref_str,
+                                       ref_window_start, ref_window_len,
+                                       insertion, insertion_len,
+                                       deletion_pos, deletion_len, & var_str,
+                                       & allele, & allele_size ) )
+            {
+                rc = RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+                free ( new_obj );
+                new_obj = NULL;
+            }
+            else
+            {
+                KRefcountInit ( & new_obj->refcount, 1, "RefVariation", "make", "ref-var" );
+                /* moving var_str to the object (so no need to destruct var_str */
+
+                new_obj->var_buffer = var_str.str;
+                new_obj->var_buffer_size = var_str.size;
+
+                new_obj->allele = allele;
+                new_obj->allele_size = allele_size;
+
+                new_obj->allele_start = ref_window_start;
+                new_obj->allele_len_on_ref = ref_window_len == 0 && insertion_len == deletion_len
+                    ? deletion_len : ref_window_len;
+            }
+        }
+    }
+
+    * obj = new_obj;
+
+    /* TODO: if Kurt insists, return non-zero rc if var_start == 0 or var_start + var_len == ref_size */
+    return rc;
+}
+
+
+rc_t CC RefVariationAddRef ( RefVariation const* self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "RefVariation" ) )
+        {
+        case krefLimit:
+            return RC ( rcVDB, rcExpression, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+static rc_t CC RefVariationIUPACWhack ( RefVariation* self )
+{
+    KRefcountWhack ( & self -> refcount, "RefVariation" );
+
+    assert ( self->var_buffer != NULL || self->var_buffer_size == 0 );
+    if ( self->var_buffer != NULL )
+        free ( self->var_buffer );
+
+    memset ( self, 0, sizeof * self );
+
+    free ( self );
+
+    return 0;
+}
+
+rc_t CC RefVariationRelease ( RefVariation const* self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "RefVariation" ) )
+        {
+        case krefWhack:
+            return RefVariationIUPACWhack ( ( RefVariation* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcExpression, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+rc_t CC RefVariationGetIUPACSearchQuery ( RefVariation const* self,
+    INSDC_dna_text const ** query, size_t * query_len, size_t * query_start )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcExpression, rcAccessing, rcParam, rcNull );
+
+    if ( query != NULL )
+        * query = self->var_buffer;
+    if ( query_len != NULL )
+        * query_len = self->var_buffer_size;
+    if ( query_start != NULL )
+        * query_start = self->allele_start - (self->allele - self->var_buffer);
+
+    return 0;
+}
+
+rc_t CC RefVariationGetSearchQueryLenOnRef ( RefVariation const* self, size_t * query_len_on_ref )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcExpression, rcAccessing, rcParam, rcNull );
+
+    if ( query_len_on_ref != NULL )
+        * query_len_on_ref = self->allele_len_on_ref + self->var_buffer_size - self->allele_size;
+
+    return 0;
+}
+
+rc_t CC RefVariationGetAllele ( RefVariation const* self,
+    INSDC_dna_text const ** allele, size_t * allele_len, size_t * allele_start )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcExpression, rcAccessing, rcParam, rcNull );
+
+    if ( allele != NULL )
+        * allele = self->allele;
+    if ( allele_len != NULL )
+        * allele_len = self->allele_size;
+    if ( allele_start != NULL )
+        * allele_start = self->allele_start;
+
+    return 0;
+}
+
+rc_t CC RefVariationGetAlleleLenOnRef ( RefVariation const* self, size_t * allele_len_on_ref )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcExpression, rcAccessing, rcParam, rcNull );
+
+    if ( allele_len_on_ref != NULL )
+        * allele_len_on_ref = self->allele_len_on_ref;
+
+    return 0;
+}
+
+//////////////// Search-oriented SmithWaterman+
+
+struct SmithWaterman
+{
+    char*   query;
+    size_t  query_size;
+    size_t  max_rows;  
+    int*    matrix; // originally NULL, grows as needed to hold enough memory for query_size * max_rows
+};
+
+LIB_EXPORT rc_t CC SmithWatermanMake( SmithWaterman** p_self, const char* p_query )
+{
+    rc_t rc = 0;
+
+    if( p_self != NULL && p_query != NULL ) 
+    {
+        SmithWaterman* ret = malloc ( sizeof ( SmithWaterman ) );
+        if ( ret != NULL )
+        {
+            ret -> query = string_dup_measure ( p_query, & ret -> query_size );
+            if ( ret -> query != NULL )
+            {
+                ret -> max_rows = 0;
+                ret -> matrix = NULL;
+                *p_self = ret;
+                return 0;
+            }
+            else
+            {
+                rc = RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+            }
+            free ( ret );
+        }
+        else
+        {
+            rc = RC(rcText, rcString, rcSearching, rcMemory, rcExhausted);
+        }
+    }
+    else
+    {
+        rc = RC(rcText, rcString, rcSearching, rcParam, rcNull);
+    } 
+
+    return rc;
+}
+
+LIB_EXPORT void CC 
+SmithWatermanWhack( SmithWaterman* self )
+{
+    free ( self -> matrix  );
+    free ( self -> query );
+    free ( self );
+}
+
+LIB_EXPORT rc_t CC 
+SmithWatermanFindFirst( SmithWaterman* p_self, uint32_t p_threshold, const char* p_buf, size_t p_buf_size, SmithWatermanMatch* p_match )
+{
+    rc_t rc = 0;
+    int score;
+    size_t max_row;
+    size_t max_col;
+
+    if (p_buf_size == 0)
+    {
+        return SILENT_RC(rcText, rcString, rcSearching, rcQuery, rcNotFound);
+    }
+    
+    if ( p_buf_size > p_self -> max_rows )
+    {
+        /* calculate_similarity_matrix adds a row and a column, adjust matrix dimensions accordingly */
+        int* new_matrix = realloc ( p_self -> matrix, (p_self->query_size + 1) * (p_buf_size + 1) * sizeof(*p_self->matrix) ); 
+        if ( new_matrix == NULL )
+        {   /* p_self -> matrix is unchanged and can be reused */
+            return RC ( rcText, rcString, rcSearching, rcMemory, rcExhausted );
+        }
+        p_self -> max_rows = p_buf_size; 
+        p_self -> matrix = new_matrix;
+    }
+    /*TODO: pass threshold into calculate_similarity_matrix, have it stop as soon as the score is sufficient */
+    rc = calculate_similarity_matrix ( p_buf, p_buf_size, p_self -> query, p_self -> query_size, false, p_self -> matrix, false, &score, &max_row, &max_col );
+    if ( rc == 0 )
+    {
+        if ( p_threshold > p_self->query_size * 2 )
+        {
+            p_threshold = p_self->query_size * 2;
+        }
+        if ( score >= p_threshold )
+        {
+            if ( p_match != NULL )
+            {
+                /* walk back from the max score row */
+                const size_t Columns = p_self->query_size + 1;
+                int row = max_row;
+                int col = max_col;
+                while ( row > 0 && col > 0 )
+                {
+                    int curr = p_self -> matrix [ row*Columns + col ];
+                    if ( curr == 0 )
+                    {
+                        break;
+                    } 
+					else
+					{
+						int left = p_self -> matrix [ row * Columns + (col - 1) ];
+						int up   = p_self -> matrix [ (row - 1)*Columns + col ];
+						int diag = p_self -> matrix [ (row - 1)*Columns + (col - 1) ]; 
+						if ( diag >= left && diag >= up )
+						{
+							--row;
+							--col;
+						}
+						else if ( diag < left )
+						{
+							--col;
+						}
+						else
+						{
+							--row;
+						}
+					}
+                }
+                
+                p_match -> position = row;
+                p_match -> length = max_row - row;
+                p_match -> score = score;
+            }    
+            return 0;
+        }
+        rc = SILENT_RC ( rcText, rcString, rcSearching, rcQuery, rcNotFound );
+    }
+    
+    return rc;
+}
+
+
diff --git a/libs/sra/.gitignore b/libs/sra/.gitignore
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/libs/sra/.gitignore
@@ -0,0 +1 @@
+
diff --git a/libs/sra/Makefile b/libs/sra/Makefile
new file mode 100644
index 0000000..eb2333a
--- /dev/null
+++ b/libs/sra/Makefile
@@ -0,0 +1,249 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+#
+# run 'make schema' to regenerate the built-in schema
+# run 'make schema std' to regenerate the built-in schema and rebuild the libraries
+#
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/sra
+
+INT_LIBS = \
+	libsraschema \
+	libwsraschema \
+	libsradb \
+	libwsradb \
+	libsrareader
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES =            \
+	$(SRADB_OBJ)      \
+	$(WSRADB_OBJ)     \
+	$(SRAREADER_OBJ)  \
+#	$(SRA_SCHEMA_OBJ) \
+	$(WSRA_SCHEMA_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+VPATH += $(OBJDIR)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS) schema: makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS) schema
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/all $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+	@ rm -f $(ILIBDIR)/libsra-schema.* $(ILIBDIR)/libwsra-schema.* $(ILIBDIR)/sra-dflt-schema*
+	@ rm -f $(BINDIR)/libsra-schema.* $(BINDIR)/libwsra-schema.*
+
+.PHONY: clean
+
+
+#-------------------------------------------------------------------------------
+# sradb embedded schema
+#
+$(ILIBDIR)/libsraschema: $(ILIBDIR)/libsraschema.$(LIBX)
+
+$(ILIBDIR)/libwsraschema: $(ILIBDIR)/libwsraschema.$(LIBX)
+
+SRA_DFLT_SCHEMA_LIBS = \
+	-skapp \
+	-svdb \
+	$(ALWAYS_STATIC_SCHEMA_LIBS) \
+	-salign-reader \
+	-skdb \
+	-svfs \
+	-skns \
+	-sksrch \
+	-skrypto \
+	-skfg \
+	-skfs \
+	-sksproc \
+	-sklib \
+    -sjudy
+
+SRA_DFLT_SCHEMA_OS_LIBS = \
+	-ldl \
+	-sz \
+	-sbz2 \
+	-lm
+
+# set workdir for RUN_REMOTELY in rwin mode 
+RWORKDIR=$(OBJDIR)
+
+$(ILIBDIR)/sra-dflt-schema: sra-dflt-schema.$(OBJX)
+	$(LD) --exe -o $@ $^ $(SRA_DFLT_SCHEMA_LIBS) $(SRA_DFLT_SCHEMA_OS_LIBS)
+
+$(ILIBDIR)/schema: $(ILIBDIR)/sra-dflt-schema $(SRCDIR)/built-in.vschema
+	$(ILIBDIR)/sra-dflt-schema -o$(SRCDIR)/sra-schema.c -I$(TOP)/interfaces -T$(OBJDIR)/sra-schema.c.d $(SRCDIR)/built-in.vschema
+
+SRA_SCHEMA_SRC = \
+	sraschema \
+	sra-schema
+
+SRA_SCHEMA_OBJ = \
+	$(addsuffix .$(LOBX),$(SRA_SCHEMA_SRC))
+
+WSRA_SCHEMA_OBJ = \
+	$(addsuffix .$(LOBX),$(SRA_SCHEMA_SRC))
+
+SRA_SCHEMA_LIB = \
+	-dvdb \
+	-dklib
+
+WSRA_SCHEMA_LIB = \
+	-dwvdb \
+	-dklib
+
+SRASCHEMA_SRC = \
+	sraschema-stub \
+
+WSRASCHEMA_SRC = \
+	wsraschema-stub
+
+SRASCHEMA_SRC += $(SRA_SCHEMA_SRC)
+WSRASCHEMA_SRC += $(SRA_SCHEMA_SRC)
+
+SRASCHEMA_OBJ = \
+	$(addsuffix .$(LOBX),$(SRASCHEMA_SRC))
+
+WSRASCHEMA_OBJ = \
+	$(addsuffix .$(LOBX),$(WSRASCHEMA_SRC))
+
+$(ILIBDIR)/libsraschema.$(LIBX): $(SRASCHEMA_OBJ) $(SRASCHEMA_DEPS)
+	$(LD) --slib -o $@ $(SRASCHEMA_OBJ) $(SRA_SCHEMA_LIB)
+
+$(ILIBDIR)/libwsraschema.$(LIBX): $(WSRASCHEMA_OBJ) $(WSRASCHEMA_DEPS)
+	$(LD) --slib -o $@ $(WSRASCHEMA_OBJ) $(WSRA_SCHEMA_LIB)
+
+
+#-------------------------------------------------------------------------------
+# sradb library
+#
+$(ILIBDIR)/libsradb: $(addprefix $(ILIBDIR)/libsradb.,$(ILIBEXT))
+
+SRADBCMN_SRC = \
+	sramgr-cmn \
+	sratbl-cmn \
+	sracol \
+	types \
+    sracache
+
+SRADB_SRC = \
+	$(SRADBCMN_SRC) \
+	sramgr \
+	sratbl
+
+SRADB_OBJ = \
+	$(addsuffix .$(LOBX),$(SRADB_SRC))
+
+SRADB_LIB = \
+	-ssraschema \
+	-dvdb \
+	-dkdb \
+	-dvfs \
+	-dkfs \
+	-lkfg \
+	-dkproc \
+	-dklib
+
+$(ILIBDIR)/libsradb.$(LIBX): $(SRADB_OBJ)
+	$(LD) --slib -o $@ $^ $(SRADB_LIB)
+
+
+#-------------------------------------------------------------------------------
+# update version
+#
+$(ILIBDIR)/libwsradb: $(addprefix $(ILIBDIR)/libwsradb.,$(ILIBEXT))
+
+WSRADB_SRC = \
+	$(SRADBCMN_SRC) \
+	wsramgr \
+	wsratbl
+
+WSRADB_OBJ = \
+	$(addsuffix .$(LOBX),$(WSRADB_SRC))
+
+WSRADB_LIB = \
+	-swsraschema \
+	-dwvdb \
+	-dwkdb \
+	-dvfs \
+	-dkfs \
+	-lkfg \
+	-dkproc \
+	-dklib
+
+$(ILIBDIR)/libwsradb.$(LIBX): $(WSRADB_OBJ)
+	$(LD) --slib -o $@ $^ $(WSRADB_LIB)
+
+
+#-------------------------------------------------------------------------------
+# libsrareader
+#
+$(ILIBDIR)/libsrareader: $(addprefix $(ILIBDIR)/libsrareader.,$(ILIBEXT))
+
+SRAREADER_SRC = \
+	reader-cmn \
+	reader-fastq \
+	reader-sff \
+	reader-illumina \
+	reader-abi
+
+SRAREADER_OBJ = \
+	$(addsuffix .$(LOBX),$(SRAREADER_SRC))
+
+SRAREADER_LIB = \
+	-dsradb \
+	-dkdb \
+	-dklib
+
+$(ILIBDIR)/libsrareader.$(LIBX): $(SRAREADER_OBJ)
+	$(LD) --slib -o $@ $^ $(SRAREADER_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/sra/built-in.vschema b/libs/sra/built-in.vschema
new file mode 100644
index 0000000..3250879
--- /dev/null
+++ b/libs/sra/built-in.vschema
@@ -0,0 +1,580 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*==========================================================================
+ * libsradb (and libwsradb) built-in schema
+ */
+version 1;
+
+include 'ncbi/ncbi.vschema';
+include 'sra/454.vschema';
+include 'sra/illumina.vschema';
+include 'sra/abi.vschema';
+include 'sra/helicos.vschema';
+include 'sra/ion-torrent.vschema';
+
+/*--------------------------------------------------------------------------
+ * functions
+ */
+
+/* read_seg_from_readn
+ *  reads in old READ_<N> read descriptors
+ *  returns segmentation information for both reads and label in vector
+ *
+ *  "nreads" [ DATA ] - a per-spot value that should generally equal
+ *  the number of READ_N descriptors found during function instantiation
+ *
+ *  "spot_len" [ DATA ] - calculated length of spot, used for dynamic
+ *  read-length calculations
+ */
+const U32 NCBI:SRA:readn:read_type   = 0;
+const U32 NCBI:SRA:readn:read_start  = 1;
+const U32 NCBI:SRA:readn:read_len    = 2;
+const U32 NCBI:SRA:readn:label_start = 3;
+const U32 NCBI:SRA:readn:label_len   = 4;
+
+extern function
+U32 [ 5 ] NCBI:SRA:read_seg_from_readn #1 ( U8 nreads, U32 spot_len );
+
+
+/* rewrite_spot_name
+ *  given an old spotname directly from skey
+ *  write according to platform rules, optionally with a prefix
+ *
+ *  "platform" [ CONST ] - which platform rules to use
+ *
+ *  "skey" [ DATA ] - skey string for row
+ *
+ *  "prefix" [ DATA, OPTIONAL ] - prefix for spot
+ */
+extern function
+ascii NCBI:SRA:rewrite_spot_name #1 < INSDC:SRA:platform_id platform > ( ascii skey * ascii prefix );
+
+/* extract coordinates
+ *  given a spotname with encoded coordinates
+ *  extract them in reverse order into a vector
+ *
+ *  "platform" [ CONST ] - which platform rules to use
+ *
+ *  "skey" [ DATA ] - skey string for row
+ */
+const U32 NCBI:SRA:coord:y      = 0;
+const U32 NCBI:SRA:coord:x      = 1;
+const U32 NCBI:SRA:coord:tile   = 2;
+const U32 NCBI:SRA:coord:lane   = 3;
+const U32 NCBI:SRA:coord:region = 2;
+const U32 NCBI:SRA:coord:panel  = 2;
+
+extern function
+INSDC:coord:val [ * ] NCBI:SRA:extract_coordinates #1 < INSDC:SRA:platform_id platform > ( ascii skey );
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:_454_:legacy
+ *  produced by all loaders prior to v2
+ */
+table NCBI:SRA:_454_:legacy #1 = NCBI:SRA:tbl:sra_nopos #1,
+    NCBI:tbl:base_space_nocol #1, NCBI:tbl:phred_quality_nocol #1,
+    NCBI:SRA:tbl:skeyname #1, NCBI:SRA:_454_:common #1
+{
+    /* COORDINATES
+     *  in addition to X and Y,
+     *  454 has REGION
+     */
+    INSDC:coord:val out_y_coord = ( INSDC:coord:val )
+        < I32 > cut < NCBI:SRA:coord:y > ( coords_from_skey );
+    INSDC:coord:val out_x_coord = ( INSDC:coord:val )
+        < I32 > cut < NCBI:SRA:coord:x > ( coords_from_skey );
+    readonly column INSDC:coord:val REGION = ( INSDC:coord:val )
+        < I32 > cut < NCBI:SRA:coord:region > ( coords_from_skey );
+    I32 [ 3 ] coords_from_skey
+        = NCBI:SRA:extract_coordinates < SRA_PLATFORM_454 > ( out_skey );
+}
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:_454_:tbl:v0
+ *  produced by original loader before the days of schema
+ */
+extern function
+__untyped NCBI:SRA:_454_:untyped_0 ();
+
+extern function U16 NCBI:SRA:decode:CLIP #1 ( opaque in );
+physical __no_header U16 NCBI:SRA:_454_:encoding:CLIP #1 =
+{ return NCBI:SRA:decode:CLIP #1 ( @ ); }
+
+extern function NCBI:SRA:pos16 NCBI:SRA:decode:POSITION #1 ( opaque in );
+physical __no_header NCBI:SRA:pos16 NCBI:SRA:_454_:encoding:POSITION #1 =
+{ return NCBI:SRA:decode:POSITION #1 ( @ ); }
+
+extern function INSDC:2na:packed NCBI:SRA:decode:READ #1 < INSDC:SRA:platform_id platform > ( opaque in );
+physical __no_header INSDC:2na:packed NCBI:SRA:_454_:encoding:READ #1 =
+{ return NCBI:SRA:decode:READ #1 < SRA_PLATFORM_454 > ( @ ); }
+
+extern function any NCBI:SRA:decode:QUALITY #1 < INSDC:SRA:platform_id platform > ( opaque in );
+physical __no_header NCBI:quality:n_encoded:phred NCBI:SRA:_454_:encoding:QUALITY #1 =
+{ return NCBI:SRA:decode:QUALITY #1 < SRA_PLATFORM_454 > ( @ ); }
+
+extern function any NCBI:SRA:decode:SIGNAL #1 < INSDC:SRA:platform_id platform > ( opaque in );
+physical __no_header NCBI:isamp1 NCBI:SRA:_454_:encoding:SIGNAL #1 =
+{ return NCBI:SRA:decode:SIGNAL #1 < SRA_PLATFORM_454 > ( @ ); }
+
+extern function
+NCBI:SRA:pos16 NCBI:SRA:_454_:process_position #1 ( U16 position,
+    * INSDC:SRA:read_filter rd_filt, NCBI:isamp1 sig );
+
+table NCBI:SRA:_454_:tbl:v0 #1 = NCBI:SRA:_454_:legacy #1
+{
+    // recognize original loader
+    __untyped = NCBI:SRA:_454_:untyped_0 ();
+
+    // platform in binary
+    INSDC:SRA:platform_id out_platform
+        = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_454 > ();
+
+    // bases and quality
+    INSDC:2na:packed out_2na_packed = .READ;
+    INSDC:quality:phred out_qual_phred = .QUALITY;
+
+    // synthesized label
+    ascii out_label
+        = < ascii > exists < "AdapterMate1LinkerMate2" > ( out_linker_sequence )
+        | < ascii > echo < "AdapterFragment" > ();
+    INSDC:coord:zero out_label_start
+        = < INSDC:coord:zero > exists < [ 0, 7, 12, 18 ] > ( out_linker_sequence )
+        | < INSDC:coord:zero > echo < [ 0, 7 ] > ();
+    INSDC:coord:len out_label_len
+        = < INSDC:coord:len > exists < [ 7, 5, 6, 5 ] > ( out_linker_sequence )
+        | < INSDC:coord:len > echo < [ 7, 8 ] > ();
+
+    // special sequences
+    INSDC:dna:text out_flow_chars
+        = < INSDC:dna:text > meta:read < "MSC454_FLOW_CHARS" > ();
+    INSDC:dna:text out_key_sequence
+        = < INSDC:dna:text > meta:read < "MSC454_KEY_SEQUENCE" > ();
+    INSDC:dna:text out_linker_sequence
+        = < INSDC:dna:text > meta:read < "MSC454_LINKER_SEQUENCE" > ();
+
+    // position column may be read directly
+    NCBI:SRA:pos16 out_position16
+        = NCBI:SRA:_454_:process_position #1 ( .POSITION, .RD_FILTER, .SIGNAL )
+        | NCBI:SRA:_454_:process_position #1 ( .POSITION, .RD_FILTER )
+        | NCBI:SRA:_454_:process_position #1 ( .POSITION );
+    INSDC:position:one out_position
+        = cast ( out_position16 );
+
+
+    /* READ DESCRIPTION
+     *  this version of 454 always has a key sequence
+     *  and may or may not have a linker
+     *  in the former case, the spot is well defined
+     *  in the latter, the linker must be dynamically located
+     */
+
+    // special function to generate reads
+    U32 [ 3 ] dynamic_read_desc
+        = NCBI:SRA:_454_:dynamic_read_desc < 4 > ( out_2na_bin, out_key_sequence, out_linker_sequence )
+        | NCBI:SRA:_454_:dynamic_read_desc ( out_2na_bin, out_key_sequence );
+
+    // fabricate nreads
+    U8 out_nreads
+        = < U8 > exists < 4 > ( out_linker_sequence )
+        | < U8 > echo < 2 > ();
+
+
+    // read_type
+    U32 read_type32
+        = < U32 > cut < NCBI:SRA:_454_:dyn_read_type > ( dynamic_read_desc );
+    INSDC:SRA:read_type out_read_type = cast ( read_type32 );
+
+    // read_seg and read_len
+    U32 uread_start
+        = < U32 > cut < NCBI:SRA:_454_:dyn_read_start > ( dynamic_read_desc );
+    INSDC:coord:zero out_read_start
+        = ( INSDC:coord:zero ) uread_start;
+    INSDC:coord:len out_read_len = ( INSDC:coord:len )
+        < U32 > cut < NCBI:SRA:_454_:dyn_read_len > ( dynamic_read_desc );
+
+    // read_filter
+    INSDC:SRA:read_filter out_rd_filter
+        = .RD_FILTER
+        | < INSDC:SRA:read_filter > echo < SRA_READ_FILTER_PASS > ( dynamic_read_desc );
+
+
+    /* clips - all may be absent although CQR is expected */
+    physical column NCBI:SRA:_454_:encoding:CLIP #1 .CLIP_ADAPTER_LEFT;
+    physical column NCBI:SRA:_454_:encoding:CLIP #1 .CLIP_ADAPTER_RIGHT;
+    physical column NCBI:SRA:_454_:encoding:CLIP #1 .CLIP_QUALITY_LEFT;
+    physical column NCBI:SRA:_454_:encoding:CLIP #1 .CLIP_QUALITY_RIGHT;
+
+    /* bases */
+    physical column NCBI:SRA:_454_:encoding:READ #1 .READ;
+    physical column NCBI:SRA:_454_:encoding:QUALITY #1 .QUALITY;
+
+    /* signal and base position */
+    physical column NCBI:SRA:_454_:encoding:SIGNAL #1 .SIGNAL;
+    physical column NCBI:SRA:_454_:encoding:POSITION #1 .POSITION;
+};
+
+
+/* NCBI:SRA:_454_:tbl:v1 #1
+ *  written with implicit table schema
+ *  columns have stored schema
+ */
+table NCBI:SRA:_454_:tbl:v1 #1 = NCBI:SRA:_454_:legacy #1, NCBI:SRA:tbl:spotdesc_nophys #1
+{
+    // platform in binary
+    INSDC:SRA:platform_id out_platform
+        = .PLATFORM
+        | < INSDC:SRA:platform_id > echo < SRA_PLATFORM_454 > ();
+
+    // bases and quality
+    INSDC:2na:packed out_2na_packed = .READ;
+    INSDC:quality:phred out_qual_phred = .QUALITY;
+
+    // special sequences
+    INSDC:dna:text out_flow_chars = .FLOW_CHARS;
+    INSDC:dna:text out_key_sequence = .KEY_SEQUENCE;
+    // linker handled by sub-table
+
+    // position needs special processing
+    NCBI:SRA:pos16 out_position16
+        = NCBI:SRA:_454_:process_position #1 ( .POSITION, .RD_FILTER, .SIGNAL )
+        | NCBI:SRA:_454_:process_position #1 ( .POSITION, .RD_FILTER )
+        | NCBI:SRA:_454_:process_position #1 ( .POSITION );
+    INSDC:position:one out_position
+        = cast ( out_position16 );
+};
+
+
+/* NCBI:SRA:_454_:tbl:v1_2 #1
+ *  no stored schema
+ *  linker ignored if present
+ */
+extern function
+__untyped NCBI:SRA:_454_:untyped_1_2a ();
+
+table NCBI:SRA:_454_:tbl:v1_2a #1 = NCBI:SRA:_454_:tbl:v1 #1
+{
+    // single linker present
+    __untyped = NCBI:SRA:_454_:untyped_1_2a ();
+
+    INSDC:dna:text out_linker_sequence = .LINKER_SEQUENCE;
+};
+
+extern function
+__untyped NCBI:SRA:_454_:untyped_1_2b ();
+
+table NCBI:SRA:_454_:tbl:v1_2b #1 = NCBI:SRA:_454_:tbl:v1 #1
+{
+    // linker missing or empty
+    __untyped = NCBI:SRA:_454_:untyped_1_2b ();
+};
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:Illumina:legacy
+ *  produced by all loaders prior to v2
+ */
+table NCBI:SRA:Illumina:legacy #1 = NCBI:SRA:tbl:sra #1,
+    NCBI:tbl:base_space_nocol #1, NCBI:SRA:Illumina:common #1
+{
+    // signal
+    column NCBI:fsamp4 SIGNAL
+        = ( NCBI:fsamp4 ) < NCBI:SRA:swapped_fsamp4 > NCBI:SRA:swap ( out_signal, out_x2na_bin )
+        | ( NCBI:fsamp4 ) < NCBI:SRA:rotated_fsamp4 > NCBI:SRA:rotate < false > ( out_signal, out_x2na_bin );
+
+    // intensity
+    column NCBI:fsamp4 INTENSITY
+        = < NCBI:fsamp4 > NCBI:SRA:denormalize ( out_norm_intensity, out_x2na_bin );
+    NCBI:fsamp4 out_norm_intensity
+        = ( NCBI:fsamp4 ) < NCBI:SRA:swapped_fsamp4 > NCBI:SRA:swap ( out_intensity, out_x2na_bin )
+        | ( NCBI:fsamp4 ) < NCBI:SRA:rotated_fsamp4 > NCBI:SRA:rotate < false > ( out_intensity, out_x2na_bin );
+
+    // noise
+    column NCBI:fsamp4 NOISE = out_noise;
+};
+
+/* NCBI:SRA:Illumina:tbl:v0
+ *  produced by original loader before the days of schema
+ */
+extern function INSDC:2na:packed NCBI:SRA:decode:READ #1 < INSDC:SRA:platform_id platform > ( opaque in );
+physical __no_header INSDC:2na:packed NCBI:SRA:Illumina:encoding:READ #1 =
+{ return NCBI:SRA:decode:READ #1 < SRA_PLATFORM_ILLUMINA > ( @ ); }
+
+extern function any NCBI:SRA:decode:QUALITY #1 < INSDC:SRA:platform_id platform > ( opaque in );
+physical __no_header NCBI:SRA:rotated_qual4 NCBI:SRA:Illumina:encoding:QUALITY #1 =
+{ return NCBI:SRA:decode:QUALITY #1 < SRA_PLATFORM_ILLUMINA > ( @ ); }
+physical __no_header NCBI:qual1 NCBI:SRA:Illumina:encoding:QUALITY2 #1 =
+{ return NCBI:SRA:decode:QUALITY #1 < SRA_PLATFORM_ILLUMINA > ( @ ); }
+
+extern function any NCBI:SRA:decode:SIGNAL #1 < INSDC:SRA:platform_id platform > ( opaque in );
+physical __no_header NCBI:SRA:rotated_fsamp4 NCBI:SRA:Illumina:encoding:SIGNAL #1 =
+{ return NCBI:SRA:decode:SIGNAL #1 < SRA_PLATFORM_ILLUMINA > ( @ ); }
+
+extern function any NCBI:SRA:decode:INTENSITY #1 ( opaque in );
+physical __no_header NCBI:SRA:rotated_fsamp4 NCBI:SRA:Illumina:encoding:INTENSITY #1 =
+{ return NCBI:SRA:decode:INTENSITY #1 ( @ ); }
+
+extern function any NCBI:SRA:decode:NOISE #1 ( opaque in );
+physical __no_header NCBI:fsamp4 NCBI:SRA:Illumina:encoding:NOISE #1 =
+{ return NCBI:SRA:decode:NOISE #1 ( @ ); }
+
+table NCBI:SRA:Illumina:tbl:v0 #1 = NCBI:SRA:Illumina:legacy #1, NCBI:SRA:tbl:skeyname #1
+{
+    // platform in binary
+    INSDC:SRA:platform_id out_platform
+        = < INSDC:SRA:platform_id > echo < SRA_PLATFORM_ILLUMINA > ();
+
+    // generate rewritten spot_name
+    ascii out_slx_prefix
+        = < ascii > meta:read < 'SLX_PREFIX' > ()
+        | < ascii > echo < '' > ();
+    ascii rewritten_spot_name
+        = NCBI:SRA:rewrite_spot_name < SRA_PLATFORM_ILLUMINA > ( out_skey, out_slx_prefix );
+
+    // coordinates
+    INSDC:coord:val out_y_coord = ( INSDC:coord:val )
+        < I32 > cut < NCBI:SRA:coord:y > ( coords_from_skey );
+    INSDC:coord:val out_x_coord = ( INSDC:coord:val )
+        < I32 > cut < NCBI:SRA:coord:x > ( coords_from_skey );
+    INSDC:coord:val out_tile_coord = ( INSDC:coord:val )
+        < I32 > cut < NCBI:SRA:coord:tile > ( coords_from_skey );
+    INSDC:coord:val out_lane_coord = ( INSDC:coord:val )
+        < I32 > cut < NCBI:SRA:coord:lane > ( coords_from_skey );
+    I32 [ 4 ] coords_from_skey
+        = NCBI:SRA:extract_coordinates < SRA_PLATFORM_ILLUMINA > ( out_skey );
+
+    // bases
+    INSDC:2na:packed out_2na_packed = .READ;
+
+    // fixed_spot_len
+    INSDC:coord:len static_fixed_spot_len = spot_len;
+
+    // nreads
+    U8 out_nreads
+        = < U8 > meta:value < 'NREADS' > ()
+        | < U8 > echo < 1 > ();
+
+    // read_start, read_len
+    INSDC:coord:zero out_read_start
+        = ( INSDC:coord:zero ) < U32 > cut < NCBI:SRA:readn:read_start > ( read_seg_from_readn )
+        | < INSDC:coord:zero > echo < 0 > ();
+    INSDC:coord:len out_read_len
+        = ( INSDC:coord:len ) < U32 > cut < NCBI:SRA:readn:read_len > ( read_seg_from_readn )
+        | spot_len;
+    U32 [ 5 ] read_seg_from_readn
+        = NCBI:SRA:read_seg_from_readn ( out_nreads, spot_len );
+
+    // read_type
+    U32 read_type_from_read_seg
+        = < U32 > cut < NCBI:SRA:readn:read_type > ( read_seg_from_readn );
+    INSDC:SRA:read_type out_read_type
+        = cast ( read_type_from_read_seg )
+        | ( INSDC:SRA:read_type ) < INSDC:SRA:xread_type > echo < SRA_READ_TYPE_BIOLOGICAL > ();
+
+    NCBI:SRA:rotated_fsamp4 out_signal = .SIGNAL;
+    NCBI:SRA:rotated_fsamp4 out_intensity = .INTENSITY;
+    NCBI:fsamp4 out_noise = .NOISE;
+
+    /* bases */
+    physical column NCBI:SRA:Illumina:encoding:READ #1 .READ;
+
+    /* signal, intensity and noise */
+    physical column NCBI:SRA:Illumina:encoding:SIGNAL #1 .SIGNAL;
+    physical column NCBI:SRA:Illumina:encoding:INTENSITY #1 .INTENSITY;
+    physical column NCBI:SRA:Illumina:encoding:NOISE #1 .NOISE;
+};
+
+
+extern function
+__untyped NCBI:SRA:Illumina:untyped_0a ();
+
+table NCBI:SRA:Illumina:tbl:v0a #1 = NCBI:SRA:Illumina:tbl:v0 #1, NCBI:SRA:Illumina:qual4_nocol #1
+{
+    __untyped = NCBI:SRA:Illumina:untyped_0a ();
+
+    // quality
+    NCBI:SRA:rotated_qual4 out_qual4_rotated = .QUALITY;
+    physical column NCBI:SRA:Illumina:encoding:QUALITY #1 .QUALITY;
+
+    INSDC:quality:phred out_qual2_phred = .QUALITY2;
+    physical column NCBI:SRA:Illumina:encoding:QUALITY2 #1 .QUALITY2;
+
+	/* INSDC:SRA:tbl:spotname inherited virtual productions
+	 *  virtual out_name_fmt = 0;
+	 */
+
+	/* INSDC:SRA:tbl:spotdesc inherited virtual productions
+	 *  virtual out_label = 0;
+	 *  virtual out_label_len = 0;
+	 *  virtual out_rd_filter = 0;
+	 *  virtual out_label_start = 0;
+	 */
+};
+
+extern function
+__untyped NCBI:SRA:Illumina:untyped_0b ();
+
+table NCBI:SRA:Illumina:tbl:v0b #1 = NCBI:SRA:Illumina:tbl:v0 #1, NCBI:tbl:phred_quality_nocol #1
+{
+    __untyped = NCBI:SRA:Illumina:untyped_0b ();
+
+    // quality
+    INSDC:quality:phred out_qual_phred
+        = .QUALITY
+        | .QUALITY2;
+
+    physical column NCBI:SRA:Illumina:encoding:QUALITY2 #1 .QUALITY;
+    physical column NCBI:SRA:Illumina:encoding:QUALITY2 #1 .QUALITY2;
+
+	/* INSDC:SRA:tbl:spotname inherited virtual productions
+	 *  virtual out_name_fmt = 0;
+	 */
+
+	/* INSDC:SRA:tbl:spotdesc inherited virtual productions
+	 *  virtual out_label = 0;
+	 *  virtual out_label_len = 0;
+	 *  virtual out_rd_filter = 0;
+	 *  virtual out_label_start = 0;
+	 */
+
+	/* INSDC:SRA:tbl:stats inherited virtual productions
+	 *  virtual max_spot_id = 0;
+	 *  virtual min_spot_id = 0;
+	 *  virtual in_stats_bin = 0;
+	 *  virtual bio_base_count = 0;
+	 */
+};
+
+table NCBI:SRA:Illumina:tbl:v1 #1 = NCBI:SRA:Illumina:legacy #1,
+    NCBI:SRA:tbl:spotdesc_nophys #1, NCBI:SRA:tbl:skeyname_nocol #2
+{
+    // platform in binary
+    INSDC:SRA:platform_id out_platform
+        = .PLATFORM
+        | < INSDC:SRA:platform_id > echo < SRA_PLATFORM_ILLUMINA > ();
+
+    // coordinates
+    INSDC:coord:val out_tile_coord = ( INSDC:coord:val )
+        < I32 > cut < NCBI:SRA:coord:tile > ( coords_from_spotname );
+    INSDC:coord:val out_lane_coord = ( INSDC:coord:val )
+        < I32 > cut < NCBI:SRA:coord:lane > ( coords_from_spotname );
+    I32 [ 4 ] coords_from_spotname
+        = NCBI:SRA:extract_coordinates < SRA_PLATFORM_ILLUMINA > ( _out_name );
+
+    // bases
+    INSDC:2na:packed out_2na_packed = .READ;
+
+    // quality2
+    INSDC:quality:phred out_qual2_phred = .QUALITY2;
+
+    // fixed_spot_len
+    INSDC:coord:len static_fixed_spot_len = spot_len;
+
+    NCBI:SRA:swapped_fsamp4 out_signal = .SIGNAL;
+    NCBI:SRA:swapped_fsamp4 out_intensity = .INTENSITY;
+    NCBI:fsamp4 out_noise = .NOISE;
+
+    // stray compatibility columns
+    physical column INSDC:dna:text .FLOW_CHARS;
+    physical column INSDC:dna:text .KEY_SEQUENCE;
+    physical column INSDC:dna:text .LINKER_SEQUENCE;
+};
+
+extern function
+__untyped NCBI:SRA:Illumina:untyped_1a ();
+
+alias NCBI:SRA:encoded_qual4 NCBI:SRA:comp_qual4;
+
+extern function
+NCBI:SRA:swapped_qual4 NCBI:SRA:qual4_decompress_v1 #1 ( any in );
+
+table NCBI:SRA:Illumina:tbl:v1a #1 = NCBI:SRA:Illumina:tbl:v1 #1, NCBI:SRA:Illumina:qual4_nocol #1
+{
+    __untyped = NCBI:SRA:Illumina:untyped_1a ();
+
+    // 4-channel quality
+    NCBI:SRA:swapped_qual4 out_qual4_swapped = .QUALITY;
+};
+
+extern function
+__untyped NCBI:SRA:Illumina:untyped_1b ();
+
+table NCBI:SRA:Illumina:tbl:v1b #1 = NCBI:SRA:Illumina:tbl:v1 #1, NCBI:tbl:phred_quality_nocol #1
+{
+    __untyped = NCBI:SRA:Illumina:untyped_1b ();
+
+    // single-channel quality
+    INSDC:quality:phred out_qual_phred = .QUALITY;
+};
+
+
+/*--------------------------------------------------------------------------
+ * NCBI:SRA:ABI:legacy
+ *  produced by all loaders prior to v2
+ */
+table NCBI:SRA:ABI:legacy #1 = NCBI:SRA:tbl:sra #1,
+    NCBI:tbl:phred_quality_nocol #1, NCBI:SRA:ABI:common #1
+{
+};
+
+extern function
+__untyped NCBI:SRA:ABI:untyped_1 ();
+
+table NCBI:SRA:ABI:tbl:v1 #1 = NCBI:SRA:ABI:legacy #1,
+    NCBI:tbl:color_space_nocol #1, NCBI:SRA:tbl:spotdesc_nophys #1,
+    NCBI:SRA:tbl:skeyname_nocol #2
+{
+    __untyped = NCBI:SRA:ABI:untyped_1 ();
+
+    // platform in binary
+    INSDC:SRA:platform_id out_platform
+        = .PLATFORM
+        | < INSDC:SRA:platform_id > echo < SRA_PLATFORM_ABSOLID > ();
+
+    // coordinates
+    INSDC:coord:val out_panel_coord = ( INSDC:coord:val )
+        < I32 > cut < NCBI:SRA:coord:panel > ( coords_from_spotname );
+    I32 [ 4 ] coords_from_spotname
+        = NCBI:SRA:extract_coordinates < SRA_PLATFORM_ABSOLID > ( out_spot_name );
+    ascii out_spot_name
+        = INSDC:SRA:format_spot_name ( out_name_fmt, out_x_coord, out_y_coord );
+
+    // bases and quality
+    INSDC:2cs:packed out_2cs_packed = .CSREAD;
+    INSDC:dna:text out_cs_key = .CS_KEY;
+    INSDC:quality:phred out_qual_phred = .QUALITY;
+
+    // fixed_spot_len
+    INSDC:coord:len static_fixed_spot_len = spot_len;
+
+    NCBI:SRA:swapped_fsamp4 out_signal_swapped = .SIGNAL;
+
+    // stray compatibility columns
+    physical column INSDC:dna:text .FLOW_CHARS;
+    physical column INSDC:dna:text .KEY_SEQUENCE;
+    physical column INSDC:dna:text .LINKER_SEQUENCE;
+};
diff --git a/libs/sra/libsra-schema.vers.h b/libs/sra/libsra-schema.vers.h
new file mode 100644
index 0000000..900a645
--- /dev/null
+++ b/libs/sra/libsra-schema.vers.h
@@ -0,0 +1,27 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ *============================================================================
+ *
+ */
+
+#define LIBVDB_VERS 0x02060004
diff --git a/libs/sra/libsradb.vers.h b/libs/sra/libsradb.vers.h
new file mode 100644
index 0000000..5c564cb
--- /dev/null
+++ b/libs/sra/libsradb.vers.h
@@ -0,0 +1,27 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define LIBSRADB_VERS 0x0301000D
diff --git a/libs/sra/libsrareader.vers.h b/libs/sra/libsrareader.vers.h
new file mode 100644
index 0000000..4def933
--- /dev/null
+++ b/libs/sra/libsrareader.vers.h
@@ -0,0 +1 @@
+#define LIBSRAREADER_VERS 0x01010006
diff --git a/libs/sra/libsraschema.vers.h b/libs/sra/libsraschema.vers.h
new file mode 100644
index 0000000..98a217f
--- /dev/null
+++ b/libs/sra/libsraschema.vers.h
@@ -0,0 +1 @@
+#define LIBSRASCHEMA_VERS 0x01010000
diff --git a/libs/sra/libwsradb.vers.h b/libs/sra/libwsradb.vers.h
new file mode 100644
index 0000000..c3d917e
--- /dev/null
+++ b/libs/sra/libwsradb.vers.h
@@ -0,0 +1 @@
+#define LIBWSRADB_VERS 0x0301000D
diff --git a/libs/sra/libwsraschema.vers.h b/libs/sra/libwsraschema.vers.h
new file mode 100644
index 0000000..9601db1
--- /dev/null
+++ b/libs/sra/libwsraschema.vers.h
@@ -0,0 +1 @@
+#define LIBWSRASCHEMA_VERS 0x01010000
diff --git a/libs/sra/reader-abi.c b/libs/sra/reader-abi.c
new file mode 100644
index 0000000..20acdea
--- /dev/null
+++ b/libs/sra/reader-abi.c
@@ -0,0 +1,473 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <sra/rd-extern.h>
+
+#include <klib/rc.h>
+#include <sra/types.h>
+#include <sra/abi.h>
+#include <sysalloc.h>
+#include <klib/text.h>
+
+#include "reader-cmn.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+
+typedef enum AbsolidReaderOptions_enum {
+    eOrigFormat  = 0x02,
+    eSignal      = 0x04,
+    eClipQual    = 0x08
+} AbsolidReaderOptions;
+
+/* column order is important here: see Init function below!!! */
+static
+const SRAReaderColumn AbsolidReader_master_columns_desc[] = {
+    {SRAREADER_COL_MANDATORY, "CSREAD", insdc_csfasta_t, NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, "CS_KEY", insdc_fasta_t, NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, "QUALITY", insdc_phred_t, NULL, NULL, 0},
+    {eClipQual, "TRIM_START", "INSDC:coord:zero", NULL, NULL, 0},
+    {eClipQual, "TRIM_LEN", "INSDC:coord:len", NULL, NULL, 0},
+    {eSignal | SRAREADER_COL_OPTIONAL, "SIGNAL", ncbi_fsamp4_t, NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, NULL, NULL, NULL, NULL, 0} /* terminator */
+};
+
+struct AbsolidReader {
+    /* SRAReader always must be a first member! */
+    SRAReader dad;
+    uint32_t minReadLen;
+    /* current spot data shortcuts */
+    const SRAReaderColumn* csread;
+    const char** cs_key;
+    const SRAReaderColumn* qual1;
+    const INSDC_coord_zero** trim_start;
+    const INSDC_coord_len** trim_len;
+    const float** signal;
+    char prefix_buf[1024];
+    size_t prefix_sz;
+};
+
+static
+rc_t AbsolidReaderInit(const AbsolidReader* self,
+                       bool origFormat, bool noClip, uint32_t minReadLen, bool signal)
+{
+    rc_t rc = 0;
+    int options = origFormat ? eOrigFormat : 0;
+
+    CHECK_SELF(AbsolidReader);
+
+    options |= signal ? eSignal : 0;
+    options |= noClip ? 0 : eClipQual;
+    me->minReadLen = minReadLen;
+
+    if( (rc = SRAReaderInit(&self->dad, options, AbsolidReader_master_columns_desc)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &AbsolidReader_master_columns_desc[0], &me->csread, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &AbsolidReader_master_columns_desc[1], NULL, (const void***)&self->cs_key)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &AbsolidReader_master_columns_desc[2], &me->qual1, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &AbsolidReader_master_columns_desc[3], NULL, (const void***)&self->trim_start)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &AbsolidReader_master_columns_desc[4], NULL, (const void***)&self->trim_len)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &AbsolidReader_master_columns_desc[5], NULL, (const void***)&self->signal)) == 0 ) {
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderMake(const AbsolidReader** self, const SRATable* table,
+                                     const char* accession, bool origFormat,
+                                     bool noClip, uint32_t minReadLen,
+                                     spotid_t minSpotId, spotid_t maxSpotId, bool signal)
+{
+    rc_t rc = SRAReaderMake((const SRAReader**)self, sizeof **self, table, accession, minSpotId, maxSpotId);
+
+    if( rc == 0 ) {
+        rc = AbsolidReaderInit(*self, origFormat, noClip, minReadLen, signal);
+    }
+    if( rc != 0 ) {
+        AbsolidReaderWhack(*self);
+        *self = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderWhack(const AbsolidReader* self)
+{
+    return SRAReaderWhack(&self->dad);
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderFirstSpot(const AbsolidReader* self)
+{
+    return SRAReaderFirstSpot(&self->dad);
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderSeekSpot(const AbsolidReader* self, spotid_t spot)
+{
+    return SRAReaderSeekSpot(&self->dad, spot);
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderNextSpot(const AbsolidReader* self)
+{
+    return SRAReaderNextSpot(&self->dad);
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderCurrentSpot(const AbsolidReader* self, spotid_t* spot)
+{
+    return SRAReaderCurrentSpot(&self->dad, spot);
+}
+
+LIB_EXPORT rc_t CC AbsolidReader_SpotInfo(const AbsolidReader* self,
+                                          const char** spotname, size_t* spotname_sz,
+                                          uint32_t* spot_len, uint32_t* num_reads)
+{
+    rc_t rc = SRAReader_SpotInfo(&self->dad, spotname, spotname_sz, spot_len, num_reads);
+    if( rc == 0 ) {
+        if( spot_len ) {
+            if( self->dad.options & eClipQual ) {
+                *spot_len = **self->trim_len;
+            }
+            if( *spot_len < self->minReadLen ) {
+                *spot_len = 0;
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderSpotName(const AbsolidReader* self,
+                                         const char** prefix, size_t* prefix_sz,
+                                         const char** suffix, size_t* suffix_sz)
+{
+    rc_t rc = 0;
+    const char* spotname;
+    size_t spotname_sz;
+
+    CHECK_SELF(AbsolidReader);
+
+    rc = SRAReader_SpotInfo(&self->dad, &spotname, &spotname_sz, NULL, NULL);
+    if( rc == 0 ) {
+        if( !self->prefix_sz || self->prefix_sz > spotname_sz || strncmp(spotname, self->prefix_buf, self->prefix_sz) != 0 ) {
+            if( spotname_sz == 0 ) {
+                me->prefix_sz = 0;
+            } else {
+                int k = 0;
+                size_t psz = spotname_sz;
+                while( psz > 0 && k < 3 ) {
+                    /* take out PLATE_X_Y and optional label _(F|R)3 */
+                    while( psz > 0 && isdigit( *(spotname + psz - 1)) ) {
+                        psz--;
+                    }
+
+                    if( *(spotname + psz - 1) == 'F' || *(spotname + psz - 1) == 'R') {
+                        /* Discard F|R and preceding underscore */
+                        if( --psz > 0 && !isdigit(*(spotname + psz - 1)) ) {
+                            psz--;
+                        }
+                        continue;
+                    } else if( psz > 0 ) {
+                        /* Discard underscore */
+                        psz--;
+                        k++;
+                    }
+                }
+                if( psz > 0 ) {
+                    /* Add one to restore underscore at end of prefix */
+                    me->prefix_sz = psz + 1;
+                    string_copy(me->prefix_buf, sizeof(me->prefix_buf), spotname, me->prefix_sz);
+                } else {
+                    me->prefix_sz = 0;
+                }
+            }
+            me->prefix_buf[me->prefix_sz] = '\0';
+        }
+        if( suffix ) {
+            *suffix = &spotname[self->prefix_sz];
+        }
+        if( suffix_sz ) {
+            *suffix_sz = spotname_sz - self->prefix_sz;
+        }
+        if( prefix ) {
+            *prefix = self->prefix_buf;
+        }
+        if( prefix_sz ) {
+            *prefix_sz = self->prefix_sz;
+        }
+    }
+    return rc;
+
+}
+
+LIB_EXPORT rc_t CC AbsolidReader_SpotReadInfo(const AbsolidReader* self, uint32_t readId, SRAReadTypes* read_type, 
+                                              const char** read_label, INSDC_coord_len* read_label_sz,
+                                              INSDC_coord_zero* read_start, INSDC_coord_len* read_len)
+{
+    INSDC_coord_zero rs;
+    INSDC_coord_len rl;
+
+    rc_t rc = SRAReader_SpotReadInfo(&self->dad, readId, read_type, read_label, read_label_sz, &rs, &rl);
+    if( rc == 0 ) {
+        if( read_start || read_len ) {
+            if( self->dad.options & eClipQual ) {
+                INSDC_coord_zero end = rs + rl - 1;
+                INSDC_coord_zero trim_end = ((**self->trim_start) + (**self->trim_len)) - 1;
+                if( end < (**self->trim_start) || rs > trim_end ) {
+                    rl = 0;
+                } else {
+                    if( (**self->trim_start) > rs && (**self->trim_start) <= end ) {
+                        rl -= (**self->trim_start) - rs;
+                        rs = (**self->trim_start);
+                    }
+                    if( end > trim_end ) {
+                        rl = trim_end - rs + 1;
+                    }
+                }
+            }
+            if( rl < self->minReadLen ) {
+                rl = 0;
+            }
+            if( read_start ) {
+                *read_start = rl ? rs : 0;
+            }
+            if( read_len ) {
+                *read_len = rl;
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderHeader(const AbsolidReader* self, uint32_t readId, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    int ret = 0;
+
+    const char* spotname;
+    size_t x;
+    int spotname_sz;
+    INSDC_coord_len read_label_sz = 0;
+    const char* read_label;
+
+    CHECK_SELF(AbsolidReader);
+    CHECK_SPOT(self->dad);
+
+    if( (rc = AbsolidReaderSpotName(me, NULL, NULL, &spotname, &x)) != 0 ) {
+        return rc;
+    }
+    spotname_sz = (int)x;
+    if( readId > 0 ) {
+        if( (rc = AbsolidReader_SpotReadInfo(self, readId, NULL, &read_label, &read_label_sz, NULL, NULL)) != 0 ) {
+            return rc;
+        }
+    }
+    if( self->dad.options & eOrigFormat ) {
+        char tmp[1024];
+        if( spotname_sz == 0 ) {
+            spotname_sz = snprintf(tmp, sizeof(tmp) - 1, "%s.%ld", self->dad.accession, self->dad.spot);
+            if ( spotname_sz < 0 )
+                return RC ( rcSRA, rcString, rcConstructing, rcData, rcCorrupt );
+            spotname = tmp;
+        }
+        if( readId > 0 && read_label_sz > 0 ) {
+            ret = snprintf(data, dsize, ">%.*s%s%.*s", spotname_sz, spotname, spotname_sz ? "_" : "", read_label_sz, read_label);
+        } else {
+            ret = snprintf(data, dsize, ">%.*s", spotname_sz, spotname);
+        }
+    } else {
+        if( readId > 0 && read_label_sz > 0 ) {
+            ret = snprintf(data, dsize, ">%s.%ld %.*s%s%.*s",
+                self->dad.accession, self->dad.spot, spotname_sz, spotname, spotname_sz ? "_" : "", read_label_sz, read_label);
+        } else {
+            ret = snprintf(data, dsize, ">%s.%ld %.*s",
+                           self->dad.accession, self->dad.spot, spotname_sz, spotname);
+        }
+    }
+#if SNPRINTF_ACTUALLY_WORKED_THE_WAY_YOU_THINK
+    if( ret < 0 ) {
+        ret = 0;
+        rc = RC(rcSRA, rcString, rcConstructing, rcMessage, rcUnknown);
+    } else if( ret >= (int)dsize ) {
+#else
+    if( ret < 0 || ret >= (int)dsize ) {
+#endif
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    }
+    if( written != NULL ) {
+        *written = ret;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderBase(const AbsolidReader* self, uint32_t readId, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    INSDC_coord_zero read_start = 0;
+    INSDC_coord_len read_len = 0;
+
+    CHECK_SELF(AbsolidReader);
+    CHECK_SPOT(self->dad);
+
+    if( readId > 0 ) {
+        if( (rc = AbsolidReader_SpotReadInfo(self, readId--, NULL, NULL, NULL, &read_start, &read_len)) != 0 ) {
+            return rc;
+        }
+    } else {
+        return RC(rcSRA, rcFormatter, rcConstructing, rcFormat, rcUnsupported);
+    }
+    if( read_len < self->minReadLen ) {
+        read_len = 0;
+    }
+    /* for cs_key */
+    read_len++;
+    if( written != NULL ) {
+        *written = read_len;
+    }
+    if( read_len >= dsize ) {
+        return RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    } else {
+        const char* b = self->csread->base;
+        data[0] = (*me->cs_key)[readId];
+        memmove(&data[1], &b[read_start], read_len - 1);
+    }
+    data[read_len] = '\0';
+    return rc;
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderQuality(const AbsolidReader* self, uint32_t readId, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    INSDC_coord_zero read_start = 0;
+    INSDC_coord_len j = 0, read_len = 0;
+
+    CHECK_SELF(AbsolidReader);
+    CHECK_SPOT(self->dad);
+
+    if( readId > 0 ) {
+        if( (rc = AbsolidReader_SpotReadInfo(self, readId, NULL, NULL, NULL, &read_start, &read_len)) != 0 ) {
+            return rc;
+        }
+    } else {
+        return RC(rcSRA, rcFormatter, rcConstructing, rcFormat, rcUnsupported);
+    }
+    if( read_len >= self->minReadLen && me->qual1->size ) {
+        const int8_t* q = me->qual1->base;
+        char* d = data;
+        INSDC_coord_len i;
+
+        /* read end */
+        read_len += read_start;
+        for(i = read_start; i < read_len; i++) {
+            int x;
+            if( j + 2 > dsize ) {
+                /* do not overflow buffer in case it's too small */
+                d = data;
+            }
+            x = snprintf(d, dsize - j, "%i ", (int)(q[i]));
+            if ( x < 0 )
+                return RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+            d += x;
+            j += x;
+        }
+        j--;
+        d[j] = '\0';
+    }
+    if( written != NULL ) {
+        *written = j;
+    }
+    if( j >= dsize ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    }
+    return rc;
+}
+
+static
+rc_t AbsolidReaderSignal(const AbsolidReader* self, uint32_t readId, int idx, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    INSDC_coord_len j = 0;
+
+    CHECK_SELF(AbsolidReader);
+    CHECK_SPOT(self->dad);
+
+    if( me->signal != NULL ) {
+        INSDC_coord_zero read_start = 0;
+        INSDC_coord_len read_len = 0;
+        if( readId > 0 ) {
+            if( (rc = AbsolidReader_SpotReadInfo(self, readId, NULL, NULL, NULL, &read_start, &read_len)) != 0 ) {
+                return rc;
+            }
+        } else {
+            return RC(rcSRA, rcFormatter, rcConstructing, rcFormat, rcUnsupported);
+        }
+        if( read_len >= self->minReadLen ) {
+            const float* s = *me->signal;
+            char* d = data;
+            INSDC_coord_len i;
+
+            /* read end */
+            read_len += read_start;
+            for(i = read_start; i < read_len; i++) {
+                int x;
+                if( j + 9 > dsize ) {
+                    /* do not overflow buffer in case it's too small */
+                    d = data;
+                }
+                x = snprintf(d, dsize - j, "%.6g ", s[i * 4 + idx]);
+                if ( x < 0 )
+                    return RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+                d += x;
+                j += x;
+            }
+            *d = '\0';
+            --j;
+        }
+    }
+    if( written != NULL ) {
+        *written = j;
+    }
+    if( j >= dsize ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    }
+    return rc;
+
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderSignalFTC(const AbsolidReader* self, uint32_t readId, char* data, size_t dsize, size_t* written)
+{
+    return AbsolidReaderSignal(self, readId, 0, data, dsize, written);
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderSignalCY3(const AbsolidReader* self, uint32_t readId, char* data, size_t dsize, size_t* written)
+{
+    return AbsolidReaderSignal(self, readId, 1, data, dsize, written);
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderSignalTXR(const AbsolidReader* self, uint32_t readId, char* data, size_t dsize, size_t* written)
+{
+    return AbsolidReaderSignal(self, readId, 2, data, dsize, written);
+}
+
+LIB_EXPORT rc_t CC AbsolidReaderSignalCY5(const AbsolidReader* self, uint32_t readId, char* data, size_t dsize, size_t* written)
+{
+    return AbsolidReaderSignal(self, readId, 3, data, dsize, written);
+}
diff --git a/libs/sra/reader-cmn.c b/libs/sra/reader-cmn.c
new file mode 100644
index 0000000..990a53f
--- /dev/null
+++ b/libs/sra/reader-cmn.c
@@ -0,0 +1,379 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <sra/extern.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <sra/types.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include "sra-debug.h"
+#include "reader-cmn.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* mandatory columns used by generic reader */
+/* column order is IMPORTANT here: see Init function below!!! */
+static
+const SRAReaderColumn SRAReader_mandatory_cols[] = {
+    {SRAREADER_COL_OPTIONAL, "NAME", "ascii", NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, "SPOT_LEN", "INSDC:coord:len", NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, "READ_START", "INSDC:coord:zero", NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, "READ_LEN", "INSDC:coord:len", NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, "READ_TYPE", sra_read_type_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL, "LABEL", vdb_ascii_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL, "LABEL_START", "INSDC:coord:zero", NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL, "LABEL_LEN", "INSDC:coord:len", NULL, NULL, 0},
+};
+
+static
+rc_t SRAReader_ColumnsOpen(SRAReader *self)
+{
+    rc_t rc = 0;
+    int i = 0;
+
+    while(self->cols[i].name != NULL) {
+        if( self->cols[i].opt == SRAREADER_COL_MANDATORY || (self->options & self->cols[i].opt) ) {
+            rc = SRATableOpenColumnRead(self->table, &self->cols[i].col, self->cols[i].name, self->cols[i].datatype);
+            if( rc != 0 ) {
+                if( ((self->cols[i].opt & SRAREADER_COL_OPTIONAL) && GetRCState(rc) == rcNotFound) ) {
+                    PLOGERR(klogInfo, (klogWarn, rc, "column $(c)", PLOG_S(c), self->cols[i].name));
+                    rc = 0;
+                } else if( GetRCState(rc) == rcExists ) {
+                    rc = 0;
+                } else {
+                    PLOGERR(klogInfo, (klogErr, rc, "column $(c)", PLOG_S(c), self->cols[i].name));
+                    break;
+                }
+            }
+        }
+        i++;
+    }
+    return rc;
+}
+
+static rc_t SRAReader_ColumnsRead( SRAReader * self )
+{
+    rc_t rc = 0;
+    int i = 0;
+
+    while ( self->cols[ i ].name != NULL )
+    {
+        if ( self->cols[ i ].col != NULL )
+        {
+            bitsz_t bitofs = 0;
+            rc = SRAColumnRead( self->cols[ i ].col, self->spot, &self->cols[ i ].base, &bitofs, &self->cols[ i ].size );
+            if ( rc != 0 || bitofs != 0 )
+            {
+                SRADBG (( "%s: read column %s spot %u %R\n", __func__, self->cols[i].name, self->spot, rc ));
+                break;
+            }
+        }
+        self->cols[ i ].size /= 8;
+        i++;
+    }
+    return rc;
+}
+
+static
+void SRAReader_ColumnsRelease(SRAReader *self)
+{
+    rc_t rc = 0;
+    int i = 0;
+
+    while(self->cols[i].name != NULL) {
+        if(self->cols[i].col != NULL && (rc = SRAColumnRelease(self->cols[i].col)) != 0) {
+            SRADBG (("%s: release column %s %R\n",
+                     __func__, self->cols[i].name, rc));
+        }
+        self->cols[i++].col = NULL;
+    }
+}
+
+static
+rc_t SRAReaderAlloc(SRAReader** reader, size_t size, const char* accession)
+{
+    if( reader == NULL || size < sizeof(**reader) || accession == NULL || accession[0] == '\0' ) {
+        return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+    }
+    *reader = calloc(1, size);
+    if( *reader == NULL ) {
+        return RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+    } else {
+		(*reader)->accession = strdup(accession);
+        if( (*reader)->accession == NULL ) {
+            free(*reader);
+            *reader = NULL;
+            return RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+        }
+    }
+    return 0;
+}
+
+rc_t SRAReaderInit(const SRAReader* self, int options, const SRAReaderColumn* const cols)
+{
+    rc_t rc = 0;
+    int i = 0, j = 0, m = sizeof(SRAReader_mandatory_cols) / sizeof(SRAReaderColumn);
+    const SRAReaderColumn* col_read_len;
+
+    CHECK_SELF(SRAReader);
+    if( cols == NULL ) {
+        return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+    }
+    me->options = SRAREADER_COL_OPTIONAL | options; /* always try to open optional cols */
+    /* copy mandatory columns */
+    memmove(me->cols, SRAReader_mandatory_cols, sizeof(SRAReader_mandatory_cols));
+    /* copy reader specific columns */
+    for(i = 0; cols[i].name != NULL && m < 64; i++, m++) {
+        for(j = 0; j < m; j++) {
+            if( strcmp(cols[i].name, self->cols[j].name) == 0 &&
+                strcmp(cols[i].datatype, self->cols[j].datatype) == 0 ) {
+                return RC(rcSRA, rcFormatter, rcConstructing, rcData, rcDuplicate);
+            }
+        }
+        memmove(&me->cols[m], &cols[i], sizeof(SRAReaderColumn));
+    }
+    if( (rc = SRAReader_ColumnsOpen(me)) == 0 &&
+        (rc = SRAReader_FindColData(me, &SRAReader_mandatory_cols[0], &me->spot_name, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(me, &SRAReader_mandatory_cols[1], NULL, (const void***)&self->spot_len)) == 0 &&
+        (rc = SRAReader_FindColData(me, &SRAReader_mandatory_cols[2], NULL, (const void***)&self->read_start)) == 0 &&
+        (rc = SRAReader_FindColData(me, &SRAReader_mandatory_cols[3], NULL, (const void***)&self->read_len)) == 0 &&
+        (rc = SRAReader_FindColData(me, &SRAReader_mandatory_cols[3], &col_read_len, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(me, &SRAReader_mandatory_cols[4], NULL, (const void***)&self->read_type)) == 0 &&
+        (rc = SRAReader_FindColData(me, &SRAReader_mandatory_cols[5], NULL, (const void***)&self->label)) == 0 &&
+        (rc = SRAReader_FindColData(me, &SRAReader_mandatory_cols[6], NULL, (const void***)&self->label_start)) == 0 &&
+        (rc = SRAReader_FindColData(me, &SRAReader_mandatory_cols[7], NULL, (const void***)&self->label_len)) == 0 ) {
+        ((SRAReader*)self)->read_len_size = &col_read_len->size;
+    }
+    return rc;
+}
+
+rc_t SRAReaderMake(const SRAReader** self, size_t size, const SRATable* table,
+                   const char* accession, spotid_t minSpotId, spotid_t maxSpotId)
+{
+    rc_t rc = 0;
+    SRAReader* me = NULL;
+
+    if( table == NULL ) {
+        rc = RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+    } else {
+        if( (rc = SRAReaderAlloc(&me, size, accession)) == 0 ) {
+            me->table = table;
+            if( (rc = SRATableMinSpotId(me->table, &me->minSpotId)) == 0 &&
+                (rc = SRATableMaxSpotId(me->table, &me->maxSpotId)) == 0 ) {
+                if( rc == 0 && minSpotId > 0 && (rc = SRAReaderSeekSpot(me, minSpotId)) == 0 ) {
+                    me->minSpotId = minSpotId;
+                }
+                if( rc == 0 && maxSpotId > 0 && (rc = SRAReaderSeekSpot(me, maxSpotId)) == 0 ) {
+                    me->maxSpotId = maxSpotId;
+                }
+            }
+            /* reset after seekspot to initial state */
+            me->spot = 0;
+        }
+    }
+    if( rc != 0 ) {
+        SRAReaderWhack(me);
+    } else {
+        *self = me;
+    }
+    return rc;
+}
+
+rc_t SRAReaderWhack ( const SRAReader* self )
+{
+    if( self != NULL) {
+        SRAReader* me = (SRAReader*)self;
+        SRAReader_ColumnsRelease(me);
+        free(me->accession);
+        free(me);
+    }
+    return 0;
+}
+
+rc_t SRAReader_FindColData ( const SRAReader* self,
+        const SRAReaderColumn* definition, const SRAReaderColumn** col, const void*** base )
+{
+    int i;
+
+    CHECK_SELF(SRAReader);
+    if( definition == NULL || (col == NULL && base == NULL) ) {
+        return RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcNull);
+    }
+    if( definition->opt != 0 && !(self->options & definition->opt) ) {
+        return 0;
+    }
+    for(i = 0; me->cols[i].name != NULL; i++) {
+        if( self->cols[i].col != NULL &&
+            strcmp(self->cols[i].name, definition->name) == 0 &&
+            strcmp(self->cols[i].datatype, definition->datatype) == 0 ) {
+            if( col != NULL ) {
+                *col = &self->cols[i];
+            } else {
+                *base = (const void**)&self->cols[i].base;
+            }
+            return 0;
+        }
+    }
+    return (definition->opt & SRAREADER_COL_OPTIONAL) ? 0 : RC(rcSRA, rcFormatter, rcAccessing, rcColumn, rcNotFound);
+}
+
+rc_t SRAReaderFirstSpot ( const SRAReader* self )
+{
+    CHECK_SELF(SRAReader);
+    return SRAReaderSeekSpot(me, self->minSpotId);
+}
+
+rc_t SRAReaderSeekSpot ( const SRAReader* self, spotid_t spot )
+{
+    rc_t rc = 0;
+
+    CHECK_SELF(SRAReader);
+
+    if( spot < self->minSpotId ) {
+        return RC(rcSRA, rcFormatter, rcAccessing, rcRow, rcTooShort);
+    }
+    if( spot > self->maxSpotId ) {
+        return RC(rcSRA, rcFormatter, rcAccessing, rcRow, rcTooBig);
+    }
+    if( me->spot != spot ) {
+        me->spot = spot;
+        if( (rc = SRAReader_ColumnsRead(me)) != 0 ) {
+            me->spot = 0;
+        }
+    }
+    return rc;
+}
+
+rc_t SRAReaderNextSpot( const SRAReader* self )
+{
+    rc_t rc = 0;
+
+    CHECK_SELF(SRAReader);
+    CHECK_SPOT(*self);
+
+    me->spot++;
+    while( me->spot <= self->maxSpotId ) {
+        if( (rc = SRAReader_ColumnsRead(me)) == 0 ) {
+            return 0;
+        }
+        if( GetRCState(rc) != rcNotFound ) {
+            me->spot = 0;
+            return rc;
+        }
+        me->spot++;
+    }
+    CHECK_SPOT(*self);
+    return 0;
+}
+
+rc_t SRAReaderCurrentSpot( const SRAReader* self, spotid_t* spot)
+{
+    CHECK_SELF(SRAReader);
+    if( spot == NULL ) {
+        return RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcNull);
+    }
+    CHECK_SPOT(*self);
+    *spot = me->spot;
+    return 0;
+}
+
+rc_t SRAReader_SpotInfo( const SRAReader* self, const char** spotname, size_t* spotname_sz,
+                                                uint32_t* spot_len, uint32_t* num_reads )
+{
+    CHECK_SELF(SRAReader);
+    CHECK_SPOT(*self);
+
+    if( spotname && !spotname_sz ) {
+        return RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcInvalid);
+    }
+    if( spotname ) {
+        if( me->spot_name ) {
+            *spotname = me->spot_name->base;
+            *spotname_sz = me->spot_name->size;
+	        if( *spotname && *spotname_sz && (*spotname)[*spotname_sz - 1] == '\0' ) {
+	            /* Consider zero-padded spotname */
+	            *spotname_sz = strlen(*spotname);
+	        }
+        } else {
+            *spotname = "";
+            *spotname_sz = 0;
+        }
+    }
+    if( spot_len ) {
+        *spot_len = **self->spot_len;
+    }
+    if( num_reads ) {
+        *num_reads = (*self->read_len_size) / sizeof(**self->read_len);
+    }
+    return 0;
+}
+
+rc_t SRAReader_SpotReadInfo( const SRAReader* self, uint32_t readId, SRAReadTypes* read_type,
+                             const char** read_label, INSDC_coord_len* read_label_sz,
+                             INSDC_coord_zero* read_start, INSDC_coord_len* read_len )
+{
+    CHECK_SELF(SRAReader);
+    CHECK_SPOT(*self);
+
+    if( read_label && !read_label_sz ) {
+        return RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcInvalid);
+    }
+    if( readId < 1 || readId > ((*(me->read_len_size)) / sizeof(**self->read_len)) ) {
+        return RC(rcSRA, rcTable, rcReading, rcId, rcInvalid);
+    }
+    --readId;
+    if( read_start ) {
+        *read_start = (*self->read_start)[readId];
+    }
+    if( read_len ) {
+        *read_len = (*self->read_len)[readId];
+    }
+    if( read_type ) {
+        *read_type = (*self->read_type)[readId];
+    }
+    if( read_label ) {
+        if( self->label && self->label_start && self->label_len ) {
+            *read_label = &((*self->label)[(*self->label_start)[readId]]);
+            *read_label_sz = (*self->label_len)[readId];
+        } else {
+            *read_label = "";
+            *read_label_sz = 0;
+        }
+    }
+    return 0;
+}
+
+rc_t SRAReader_GetCurrentSpotData( const SRAReader* self, char *data, size_t dsize, size_t* written )
+{
+    return RC(rcSRA, rcFormatter, rcReading, rcInterface, rcIncomplete);
+}
+
+rc_t SRAReader_GetNextSpotData( const SRAReader* self, char *data, size_t dsize, size_t* written )
+{
+    return RC(rcSRA, rcFormatter, rcReading, rcInterface, rcIncomplete);
+}
diff --git a/libs/sra/reader-cmn.h b/libs/sra/reader-cmn.h
new file mode 100644
index 0000000..21a5b9e
--- /dev/null
+++ b/libs/sra/reader-cmn.h
@@ -0,0 +1,161 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_sra_reader_
+#define _h_sra_reader_
+
+#ifndef _h_sra_sradb_
+#include <sra/sradb.h>
+#endif
+
+#define SRAREADER_COL_MANDATORY 0x00
+#define SRAREADER_COL_OPTIONAL 0x01
+
+typedef struct SRAReaderColumn_struct {
+    uint32_t opt;
+    const char* name;
+    const char* datatype;
+    const SRAColumn* col;
+    const void* base;
+    bitsz_t size;
+} SRAReaderColumn;
+
+typedef struct SRAReader_struct {
+    char* accession;
+    const SRATable* table;
+    spotid_t minSpotId;
+    spotid_t maxSpotId;
+    uint32_t options;
+    SRAReaderColumn cols[64]; /* max of 64 columns, must be enough, last one must have NULL name */
+    /* current spot data */
+    spotid_t spot;
+    const SRAReaderColumn* spot_name;
+    const INSDC_coord_len** spot_len;
+    const INSDC_coord_zero** read_start;
+    const INSDC_coord_len** read_len;
+    const bitsz_t* read_len_size;
+    const SRAReadTypes** read_type;
+    const char** label;
+    const INSDC_coord_zero** label_start;
+    const INSDC_coord_len** label_len;
+} SRAReader;
+
+/* Common macro for self pointer and current spot state validation */
+#define CHECK_SELF(ObjType) \
+                   ObjType* me = (ObjType*)self; \
+                   if(self == NULL) { \
+                       return RC(rcSRA, rcFormatter, rcAccessing, rcSelf, rcNull); \
+                   }
+
+#define CHECK_SPOT(Obj) \
+                   if( (Obj).spot < (Obj).minSpotId ) { \
+                       return RC(rcSRA, rcFormatter, rcAccessing, rcRow, rcUnknown); \
+                   } \
+                   if( (Obj).spot > (Obj).maxSpotId ) { \
+                       return RC(rcSRA, rcFormatter, rcAccessing, rcRow, rcExhausted); \
+                   }
+
+rc_t SRAReaderMake(const SRAReader** self, size_t size, const SRATable* table,
+                   const char* accession, spotid_t minSpotId, spotid_t maxSpotId);
+
+rc_t SRAReaderInit(const SRAReader* self, int options, const SRAReaderColumn* const cols);
+
+/* Whack
+ *  releases object obtained from SRAReaderMake
+ *  or AddRef ( see above )
+ */
+rc_t SRAReaderWhack(const SRAReader *self);
+
+/* FindColData
+ * find OPENED column by it's definition and return it's base pointer or col struct
+ */
+rc_t SRAReader_FindColData(const SRAReader* self, const SRAReaderColumn* definition, const SRAReaderColumn** col, const void*** base);
+
+/* FirstSpot
+ *  set current spot to first in the run
+ */
+rc_t SRAReaderFirstSpot(const SRAReader* self);
+
+/* SeekSpot
+ *  set current spot
+ * if error occured current spot position becomes 0
+ */
+rc_t SRAReaderSeekSpot(const SRAReader* self, spotid_t spot);
+
+/* NextSpot
+ *  Seek to next spot from current
+ */
+rc_t SRAReaderNextSpot(const SRAReader* self);
+
+/* CurrentSpot
+ *  Get current spot
+ *  sopt [OUT] - pointer to assign value of the current spot
+ * returns GetRCState(rc) == rcExhausted when out of spots
+ */
+rc_t SRAReaderCurrentSpot(const SRAReader* self, spotid_t* spot);
+
+/* SpotInfo
+ *  Get current spot information
+ *  spotname [OUT] - pointer to assign value of the current spot name (can be NULL)
+ *  spotname_sz [OUT] - pointer to assign value of the length of the spot name (can be NULL)
+ *  spot_len [OUT] - pointer to assign value of the current spot length (can be NULL)
+ *  num_reads[OUT] - pointer to assign value of the number of reads in current spot (can be NULL)
+ */
+rc_t SRAReader_SpotInfo(const SRAReader* self, const char** spotname, size_t* spotname_sz,
+                                               uint32_t* spot_len, uint32_t* num_reads);
+
+/* SpotReadInfo
+ *  Get read information for current spot
+ *  readid    [IN]  - 1-based read id
+ *  read_type [OUT] - pointer to assign value of the read type (can be NULL)
+ *  read_label[OUT] - pointer to assign value of the read label (can be NULL)
+ *  read_label_sz [OUT] - pointer to assign value of the length of the read label (can be NULL)
+ *  read_start[OUT] - pointer to assign value of the read start in spot (can be NULL)
+ *  read_len  [OUT] - pointer to assign value of the read length (can be NULL)
+ *  if start and len is == 0 read is empty
+ */
+rc_t SRAReader_SpotReadInfo(const SRAReader* self, uint32_t readId, SRAReadTypes* read_type,
+                            const char** read_label, INSDC_coord_len* read_label_sz,
+                            INSDC_coord_zero* read_start, INSDC_coord_len* read_len);
+
+/* GetCurrentSpotData
+ *  retrieve current spot data as a blob
+ *  data   [IN] - pointer to buffer for printing
+ *  dsize  [IN] - data buffer size
+ *  written [IN,OUT] - optional number of bytes occupied by buffer, may by more than dsize
+ *  MUST BE SEPARATELY DEFINED for each reader format
+ */
+rc_t SRAReader_GetCurrentSpotData(const SRAReader* self, char *data, size_t dsize, size_t* written);
+
+/* GetNextSpotData (streaming function)
+ *  move to the next spot and retrieve current spot data as a blob
+ *  data   [IN] - pointer to buffer for printing
+ *  dsize  [IN] - data buffer size
+ *  written [IN,OUT] - optional number of bytes occupied by buffer, may by more than dsize
+ *  MUST BE SEPARATELY DEFINED for each reader format
+ */
+rc_t SRAReader_GetNextSpotData(const SRAReader* self, char *data, size_t dsize, size_t* written);
+
+#endif /* _h_sra_reader_ */
diff --git a/libs/sra/reader-fastq.c b/libs/sra/reader-fastq.c
new file mode 100644
index 0000000..2940f9b
--- /dev/null
+++ b/libs/sra/reader-fastq.c
@@ -0,0 +1,623 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <sra/rd-extern.h>
+
+#include <klib/rc.h>
+#include <sra/types.h>
+#include <sra/fastq.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include "reader-cmn.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+typedef enum FastqReaderOptions_enum {
+    eBaseSpace   = 0x02,
+    eColorSpace  = 0x04,
+    eOrigFormat  = 0x08,
+    ePrintLabel  = 0x10,
+    ePrintReadId = 0x20,
+    eClipQual    = 0x40,
+    eUseQual     = 0x80,
+    eSuppressQualForCSKey   = 0x100     /* added Jan 15th 2014 ( a new fastq-variation! ) */
+} FastqReaderOptions;
+
+/* column order is important here: see Init function below!!! */
+static
+const SRAReaderColumn FastqReader_master_columns_desc[] = {
+    {eBaseSpace, "READ", insdc_fasta_t, NULL, NULL, 0},
+    {eColorSpace, "CSREAD", insdc_csfasta_t, NULL, NULL, 0},
+    {eColorSpace, "CS_KEY", insdc_fasta_t, NULL, NULL, 0},
+    {eUseQual, "QUALITY", insdc_phred_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL, "SPOT_GROUP", vdb_ascii_t, NULL, NULL, 0},
+    {eClipQual, "TRIM_START", "INSDC:coord:zero", NULL, NULL, 0},
+    {eClipQual, "TRIM_LEN", "INSDC:coord:len", NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, NULL, NULL, NULL, NULL, 0} /* terminator */
+};
+
+struct FastqReader {
+    /* SRAReader always must be a first member! */
+    SRAReader dad;
+    uint32_t minReadLen;
+    int offset;
+    char csKey;
+    /* current spot data shortcuts */
+    const SRAReaderColumn* read;
+    const SRAReaderColumn* csread;
+    const char** cs_key;
+    const uint8_t** qual1;
+    const SRAReaderColumn* spot_group;
+    const INSDC_coord_zero** trim_start;
+    const INSDC_coord_len** trim_len;
+    /* quality conversion table */
+    char q2ascii[256];
+};
+
+static
+rc_t FastqReaderInit(const FastqReader* self,
+                     bool colorSpace, bool origFormat, bool fasta, bool printLabel, bool printReadId,
+                     bool noClip, bool SuppressQualForCSKey, uint32_t minReadLen, int offset, char csKey)
+{
+    rc_t rc = 0;
+    int options = colorSpace ? eColorSpace : eBaseSpace;
+
+    CHECK_SELF(FastqReader);
+
+    options |= origFormat ? eOrigFormat : 0;
+    options |= printLabel ? ePrintLabel : 0;
+    options |= printReadId ? ePrintReadId : 0;
+    options |= noClip ? 0 : eClipQual;
+    options |= fasta ? 0 : eUseQual;
+    options |= SuppressQualForCSKey ? eSuppressQualForCSKey : 0; /* added Jan 15th 2014 ( a new fastq-variation! ) */
+
+    me->minReadLen = minReadLen;
+    me->offset = offset > 0 ? offset : 33;
+    me->csKey = csKey;
+
+    if( (rc = SRAReaderInit(&self->dad, options, FastqReader_master_columns_desc)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &FastqReader_master_columns_desc[0], &me->read, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &FastqReader_master_columns_desc[1], &me->csread, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &FastqReader_master_columns_desc[2], NULL, (const void***)&self->cs_key)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &FastqReader_master_columns_desc[3], NULL, (const void***)&self->qual1)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &FastqReader_master_columns_desc[4], &me->spot_group, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &FastqReader_master_columns_desc[5], NULL, (const void***)&self->trim_start)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &FastqReader_master_columns_desc[6], NULL, (const void***)&self->trim_len)) == 0 ) {
+        memset(me->q2ascii, '~', sizeof(self->q2ascii));
+        for(options = 0; options < 256; options++) {
+            me->q2ascii[options] = options + self->offset;
+            if( self->q2ascii[options] == '~' ) {
+                break;
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC FastqReaderMake(const FastqReader** self, const SRATable* table, const char* accession,
+                                   bool colorSpace, bool origFormat, bool fasta, bool printLabel, bool printReadId,
+                                   bool noClip, bool SuppressQualForCSKey, uint32_t minReadLen, char offset, char csKey,
+                                   spotid_t minSpotId, spotid_t maxSpotId)
+{
+    rc_t rc = SRAReaderMake((const SRAReader**)self, sizeof **self, table, accession, minSpotId, maxSpotId);
+
+    if( rc == 0 ) {
+        rc = FastqReaderInit(*self, colorSpace, origFormat, fasta,
+                             printLabel, printReadId, noClip, SuppressQualForCSKey, minReadLen, offset, csKey);
+    }
+    if( rc != 0 ) {
+        FastqReaderWhack(*self);
+        *self = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC FastqReaderWhack(const FastqReader* self)
+{
+    return SRAReaderWhack(&self->dad);
+}
+
+LIB_EXPORT rc_t CC FastqReaderFirstSpot(const FastqReader* self)
+{
+    return SRAReaderFirstSpot(&self->dad);
+}
+
+LIB_EXPORT rc_t CC FastqReaderSeekSpot(const FastqReader* self, spotid_t spot)
+{
+    return SRAReaderSeekSpot(&self->dad, spot);
+}
+
+LIB_EXPORT rc_t CC FastqReaderNextSpot(const FastqReader* self)
+{
+    return SRAReaderNextSpot(&self->dad);
+}
+
+LIB_EXPORT rc_t CC FastqReaderCurrentSpot(const FastqReader* self, spotid_t* spot)
+{
+    return SRAReaderCurrentSpot(&self->dad, spot);
+}
+
+LIB_EXPORT rc_t CC FastqReader_SpotInfo(const FastqReader* self,
+                                        const char** spotname, size_t* spotname_sz,
+                                        const char** spotgroup, size_t* spotgroup_sz,
+                                        uint32_t* spot_len, uint32_t* num_reads)
+{
+    rc_t rc = SRAReader_SpotInfo(&self->dad, spotname, spotname_sz, spot_len, num_reads);
+    if( rc == 0 ) {
+        if( spotgroup && !spotgroup_sz ) {
+            return RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcInvalid);
+        }
+        if( spot_len ) {
+            if( self->dad.options & eClipQual ) {
+                *spot_len = **self->trim_len;
+            }
+            if( *spot_len < self->minReadLen ) {
+                *spot_len = 0;
+            }
+        }
+        if( spotgroup ) {
+            if( self->spot_group != NULL ) {
+                *spotgroup = self->spot_group->base;
+                *spotgroup_sz = self->spot_group->size;
+                if(*spotgroup && *spotgroup_sz && (*spotgroup)[*spotgroup_sz - 1] == '\0' ) {
+                    /* Consider zero-padded spotgroup */
+                    *spotgroup_sz = strlen(*spotgroup);
+                }
+            } else {
+                *spotgroup = NULL;
+                *spotgroup_sz = 0;
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC FastqReader_SpotReadInfo(const FastqReader* self, uint32_t readId, SRAReadTypes* read_type, 
+                                            const char** read_label, INSDC_coord_len* read_label_sz,
+                                            INSDC_coord_zero* read_start, INSDC_coord_len* read_len)
+{
+    INSDC_coord_zero rs;
+    INSDC_coord_len rl;
+
+    rc_t rc = SRAReader_SpotReadInfo(&self->dad, readId, read_type, read_label, read_label_sz, &rs, &rl);
+    if( rc == 0 ) {
+        if( read_start || read_len ) {
+            if( self->dad.options & eClipQual ) {
+                INSDC_coord_zero end = rs + rl - 1;
+                INSDC_coord_zero trim_end = ((**self->trim_start) + (**self->trim_len)) - 1;
+                if( end < (**self->trim_start) || rs > trim_end ) {
+                    rl = 0;
+                } else {
+                    if( (**self->trim_start) > rs && (**self->trim_start) <= end ) {
+                        rl -= (**self->trim_start) - rs;
+                        rs = (**self->trim_start);
+                    }
+                    if( end > trim_end ) {
+                        rl = trim_end - rs + 1;
+                    }
+                }
+            }
+            if( rl < self->minReadLen ) {
+                rl = 0;
+            }
+            if( read_start ) {
+                *read_start = rl ? rs : 0;
+            }
+            if( read_len ) {
+                *read_len = rl;
+            }
+        }
+    }
+    return rc;
+}
+
+static
+rc_t FastqReader_Header(const FastqReader* self, bool* label, 
+                        char* buf, size_t maxlen, size_t* written,
+                        char prefix, int readId)
+{
+    rc_t rc = 0;
+    int ret = 0;
+
+    const char* spotname;
+    size_t x;
+    int spotname_sz;
+    uint32_t spot_len;
+    uint32_t num_reads;
+    INSDC_coord_len read_len, read_label_sz = 0;
+    const char* read_label;
+    bool addLabel = label ? *label : (self->dad.options & ePrintLabel);
+
+    if( (rc = FastqReader_SpotInfo(self, &spotname, &x, NULL, NULL, &spot_len, &num_reads)) != 0 ) {
+        return rc;
+    }
+    spotname_sz = (int)x;
+    if( readId > 0 ) {
+        if( (rc = FastqReader_SpotReadInfo(self, readId, NULL, &read_label, &read_label_sz, NULL, &read_len)) != 0 ) {
+            return rc;
+        }
+    }
+    /* do not add empty labels */
+    addLabel = read_label_sz > 0 ? addLabel : false;
+
+    if( self->dad.options & eOrigFormat ) {
+        char tmp[1024];
+        if( spotname_sz == 0 ) {
+            ret = snprintf(tmp, sizeof(tmp) - 1, "%s.%ld", self->dad.accession, self->dad.spot);
+            if ( ret < 0 )
+                return RC ( rcSRA, rcString, rcConstructing, rcData, rcCorrupt );
+            spotname = tmp;
+            spotname_sz = ret;
+        }
+        if( addLabel && readId > 0 ) {
+            ret = snprintf(buf, maxlen, "%c%.*s_%.*s", prefix, spotname_sz, spotname, read_label_sz, read_label);
+        } else {
+            ret = snprintf(buf, maxlen, "%c%.*s", prefix, spotname_sz, spotname);
+        }
+    } else {
+        const char* sep = spotname_sz ? " " : "";
+        if( addLabel && readId > 0 ) {
+            sep = spotname_sz ? "_" : "";
+            if( self->dad.options & ePrintReadId ) {
+                ret = snprintf(buf, maxlen, "%c%s.%ld.%d %.*s%s%.*s length=%d",
+                    prefix, self->dad.accession, self->dad.spot, readId, spotname_sz, spotname, sep, read_label_sz, read_label, read_len);
+            } else {
+                ret = snprintf(buf, maxlen, "%c%s.%ld %.*s%s%.*s length=%d",
+                    prefix, self->dad.accession, self->dad.spot, spotname_sz, spotname, sep, read_label_sz, read_label, read_len);
+            }
+        } else if( readId > 0 ) {
+            if( self->dad.options & ePrintReadId ) {
+                ret = snprintf(buf, maxlen, "%c%s.%ld.%d %.*s%slength=%d",
+                    prefix, self->dad.accession, self->dad.spot, readId, spotname_sz, spotname, sep, read_len);
+            } else {
+                ret = snprintf(buf, maxlen, "%c%s.%ld %.*s%slength=%d",
+                    prefix, self->dad.accession, self->dad.spot, spotname_sz, spotname, sep, read_len);
+            }
+        } else {
+            ret = snprintf(buf, maxlen, "%c%s.%ld %.*s%slength=%u",
+                prefix, self->dad.accession, self->dad.spot, spotname_sz, spotname, sep, spot_len);
+        }
+    }
+
+#if SNPRINTF_ACTUALLY_WORKED_THE_WAY_YOU_THINK
+    if( ret < 0 ) {
+        ret = 0;
+        rc = RC(rcSRA, rcString, rcConstructing, rcMessage, rcUnknown);
+    } else if( ret >= (int)maxlen ) {
+#else
+    if( ret < 0 || ret >= (int)maxlen ) {
+#endif
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    }
+    if( written != NULL ) {
+        *written = ret;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC FastqReaderBaseName(const FastqReader* self, uint32_t readId,
+                                       bool* label, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+
+    CHECK_SELF(FastqReader);
+    CHECK_SPOT(self->dad);
+    rc = FastqReader_Header(me, label, data, dsize, written, '@', readId);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC FastqReaderQualityName(const FastqReader* self, uint32_t readId,
+                                          bool* label, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+
+    CHECK_SELF(FastqReader);
+    CHECK_SPOT(self->dad);
+    if( self->qual1 == NULL ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMode, rcNotAvailable);
+    } else {
+        rc = FastqReader_Header(me, label, data, dsize, written, '+', readId);
+    }
+    return rc;
+}
+
+/*
+#if _DEBUGGING && defined __GNUC__
+#pragma message "TBD determine if we need conversions between color spaces at all"
+#endif
+*/
+
+static
+rc_t FastqReader_CSconvert(char from, char to, char* first)
+{
+#define CSKEY2IDX(k) (k == 'A' ? 0 : (k == 'C' ? 1 : (k == 'G' ? 2 : (k == 'T' ? 3 : -1))))
+
+    const char* x[4][4] = {
+        /*   TO:      A       C       G       T   */
+        /* F: A */ {"0123", "1032", "2301", "3210"},
+        /* R: C */ {"1032", "0123", "3210", "2301"},
+        /* O: G */ {"2301", "3210", "0123", "1032"},
+        /* M: T */ {"3210", "2301", "1032", "0123"}};
+
+    if( to != '\0' && *first != '.' && toupper(*first) != 'N' ) {
+        int ifrom = CSKEY2IDX(toupper(from));
+        int ito = CSKEY2IDX(toupper(to));
+        int ifirst = *first - '0';
+
+        if( ifrom < 0 || ito < 0 || ifirst < 0 || ifirst > 3 ) {
+            return RC(rcSRA, rcString, rcConverting, rcParam, rcInvalid);
+        }
+        *first = x[ifrom][ito][ifirst];
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC FastqReaderBase(const FastqReader* self, uint32_t readId, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    uint32_t num_reads;
+    INSDC_coord_zero read_start = 0;
+    INSDC_coord_len read_len = 0;
+
+    CHECK_SELF(FastqReader);
+    CHECK_SPOT(self->dad);
+
+    if( readId > 0 ) {
+        if( (rc = FastqReader_SpotReadInfo(self, readId--, NULL, NULL, NULL, &read_start, &read_len)) != 0 ) {
+            return rc;
+        }
+    } else if( (rc = FastqReader_SpotInfo(self, NULL, NULL, NULL, NULL, &read_len, &num_reads)) != 0 ) {
+        return rc;
+    } else if( (me->dad.options & eColorSpace) && num_reads > 2 ) {
+        return RC(rcSRA, rcFormatter, rcConstructing, rcFormat, rcUnsupported);
+    }
+    if( me->dad.options & eColorSpace ) {
+        read_len++;
+    }
+    if( written != NULL ) {
+        *written = read_len;
+    }
+    if( read_len >= dsize ) {
+        return RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    }
+    if( me->dad.options & eColorSpace ) {
+        const char* b = self->csread->base;
+        data[0] = me->csKey == '\0' ? (*self->cs_key)[readId] : me->csKey;
+        memmove(&data[1], &b[read_start], read_len - 1);
+        if( read_len > 1 ) {
+            rc = FastqReader_CSconvert((*self->cs_key)[readId], data[0], &data[1]);
+        }
+    } else {
+        const char* b = self->read->base;
+        memmove(data, &b[read_start], read_len);
+    }
+    data[read_len] = '\0';
+    return rc;
+}
+
+LIB_EXPORT rc_t CC FastqReaderQuality(const FastqReader* self, uint32_t readId, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    INSDC_coord_zero read_start = 0;
+    INSDC_coord_len read_len = 0;
+    bool print_quality_for_cskey = false; /* added Jan 15th 2014 ( a new fastq-variation! )*/
+
+    CHECK_SELF(FastqReader);
+    CHECK_SPOT(self->dad);
+
+    if( self->qual1 == NULL ) {
+        return RC(rcSRA, rcString, rcConstructing, rcMode, rcNotAvailable);
+    }
+    if( readId > 0 ) {
+        if( (rc = FastqReader_SpotReadInfo(self, readId, NULL, NULL, NULL, &read_start, &read_len)) != 0 ) {
+            return rc;
+        }
+    } else if( (rc = FastqReader_SpotInfo(self, NULL, NULL, NULL, NULL, &read_len, NULL)) != 0 ) {
+        return rc;
+    }
+
+    /* added Jan 15th 2014 ( a new fastq-variation! )*/
+    print_quality_for_cskey = ( ( me->dad.options & eColorSpace )&&( ( me->dad.options & eSuppressQualForCSKey ) == 0 ) );
+
+    if( read_len < self->minReadLen ) {
+        read_len = 0;
+    }
+    if( print_quality_for_cskey ) { /* changed Jan 15th 2014 ( a new fastq-variation! ) */
+        read_len++;
+    }
+    if( written != NULL ) {
+        *written = read_len;
+    }
+    if( read_len >= dsize ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    } else {
+        const uint8_t* q = *self->qual1;
+        char* d = data;
+        INSDC_coord_len i, j;
+
+        if ( print_quality_for_cskey ) /* changed Jan 15th 2014 ( a new fastq-variation! ) */
+        {
+            *d++ = me->offset;
+            --read_len;
+        }
+        /* read end */
+        read_len += read_start;
+        for(j = 0, i = read_start; i < read_len; i++, j++) {
+            d[j] = self->q2ascii[q[i]];
+        }
+        d[j] = '\0';
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC FastqReader_GetCurrentSpotData(const FastqReader* self, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    size_t len = 0, left = dsize, w = 0;
+    char* b = data;
+
+    CHECK_SELF(FastqReader);
+    CHECK_SPOT(me->dad);
+
+    rc = FastqReaderBaseName(self, 0, NULL, b, left, &w);
+    len += ++w;
+    if( rc != 0 ) {
+        if( rc != 0 && !(GetRCObject(rc) == rcMemory && GetRCState(rc) == rcInsufficient) ) {
+            return rc;
+        }
+        b = data, left = dsize;
+    } else {
+        b[w - 1] = '\n'; b += w; left -= w;
+    }
+
+    rc = FastqReaderBase(self, 0, b, left, &w);
+    len += ++w;
+    if( rc != 0 ) {
+        if( rc != 0 && !(GetRCObject(rc) == rcMemory && GetRCState(rc) == rcInsufficient) ) {
+            return rc;
+        }
+        b = data, left = dsize;
+    } else {
+        b[w - 1] = '\n'; b += w; left -= w;
+    }
+    if( self->qual1 != NULL ) {
+        rc = FastqReaderQualityName(self, 0, NULL, b, left, &w);
+        len += ++w;
+        if( rc != 0 ) {
+            if( rc != 0 && !(GetRCObject(rc) == rcMemory && GetRCState(rc) == rcInsufficient) ) {
+                return rc;
+            }
+            b = data, left = dsize;
+        } else {
+            b[w - 1] = '\n'; b += w; left -= w;
+        }
+        rc = FastqReaderQuality(self, 0, b, left, &w);
+        len += ++w; b[w - 1] = '\n';
+        if( rc != 0 && !(GetRCObject(rc) == rcMemory && GetRCState(rc) == rcInsufficient) ) {
+            return rc;
+        }
+    }
+    if( written != NULL ) {
+        *written = len;
+    }
+    if( len > dsize ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC FastqReader_GetCurrentSpotSplitData(const FastqReader* self, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    size_t len = 0, left = dsize, w = 0;
+    char* b = data;
+    uint32_t r, num_reads;
+
+    CHECK_SELF(FastqReader);
+    CHECK_SPOT(me->dad);
+
+    if( (rc = FastqReader_SpotInfo(self, NULL, NULL, NULL, NULL, NULL, &num_reads)) != 0 ) {
+        return rc;
+    }
+    for(r = 1; r <= num_reads; r++) {
+        rc = FastqReaderBaseName(self, r, NULL, b, left, &w);
+        len += ++w;
+        if( rc != 0 ) {
+            if( rc != 0 && !(GetRCObject(rc) == rcMemory && GetRCState(rc) == rcInsufficient) ) {
+                return rc;
+            }
+            b = data, left = dsize;
+        } else {
+            b[w - 1] = '\n'; b += w; left -= w;
+        }
+        rc = FastqReaderBase(self, r, b, left, &w);
+        len += ++w;
+        if( rc != 0 ) {
+            if( rc != 0 && !(GetRCObject(rc) == rcMemory && GetRCState(rc) == rcInsufficient) ) {
+                return rc;
+            }
+            b = data, left = dsize;
+        } else {
+            b[w - 1] = '\n'; b += w; left -= w;
+        }
+        if( self->qual1 != NULL ) {
+            rc = FastqReaderQualityName(self, r, NULL, b, left, &w);
+            len += ++w;
+            if( rc != 0 ) {
+                if( rc != 0 && !(GetRCObject(rc) == rcMemory && GetRCState(rc) == rcInsufficient) ) {
+                    return rc;
+                }
+                b = data, left = dsize;
+            } else {
+                b[w - 1] = '\n'; b += w; left -= w;
+            }
+            rc = FastqReaderQuality(self, r, b, left, &w);
+            len += ++w;
+            if( rc != 0 ) {
+                if( rc != 0 && !(GetRCObject(rc) == rcMemory && GetRCState(rc) == rcInsufficient) ) {
+                    return rc;
+                }
+                b = data, left = dsize;
+            } else {
+                b[w - 1] = '\n'; b += w; left -= w;
+            }
+        }
+    }
+
+    if( written != NULL ) {
+        *written = len;
+    }
+    if( len > dsize ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC FastqReader_GetNextSpotData(const FastqReader* self, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = FastqReaderNextSpot(self);
+    if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcUnknown ) {
+        rc = FastqReaderFirstSpot(self);
+    }
+    if( rc == 0 ) {
+        rc = FastqReader_GetCurrentSpotData(self, data, dsize, written);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC FastqReader_GetNextSpotSplitData(const FastqReader* self, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = FastqReaderNextSpot(self);
+    if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcUnknown ) {
+        rc = FastqReaderFirstSpot(self);
+    }
+    if( rc == 0 ) {
+        rc = FastqReader_GetCurrentSpotSplitData(self, data, dsize, written);
+    }
+    return rc;
+}
diff --git a/libs/sra/reader-illumina.c b/libs/sra/reader-illumina.c
new file mode 100644
index 0000000..6ee1871
--- /dev/null
+++ b/libs/sra/reader-illumina.c
@@ -0,0 +1,567 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <sra/rd-extern.h>
+
+#include <klib/rc.h>
+#include <sra/types.h>
+#include <sra/illumina.h>
+#include <os-native.h>
+#include <sysalloc.h>
+#include <va_copy.h>
+
+#include "reader-cmn.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+typedef enum IlluminaReaderOptions_enum {
+    eRead = 0x02,
+    eQual1 = 0x04,
+    eQual4 = 0x08,
+    eIntensity = 0x10,
+    eNoise = 0x20,
+    eSignal = 0x40,
+    eQSeq  = 0x80
+} IlluminaReaderOptions;
+
+/* column order is important here: see Init function below!!! */
+static
+const SRAReaderColumn IlluminaReader_master_columns_desc[] = {
+    {SRAREADER_COL_OPTIONAL, "LANE", vdb_int32_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL, "TILE", vdb_int32_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL, "X", vdb_int32_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL, "Y", vdb_int32_t, NULL, NULL, 0},
+    {eRead | eQSeq, "READ", insdc_fasta_t, NULL, NULL, 0},
+    {eQual1 | eQSeq, "QUALITY", insdc_phred_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL | eQual4, "QUALITY", ncbi_qual4_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL | eSignal, "SIGNAL", ncbi_fsamp4_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL | eNoise, "NOISE", ncbi_fsamp4_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL | eIntensity, "INTENSITY", ncbi_fsamp4_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL | eQSeq, "READ_FILTER", sra_read_filter_t, NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL | eQSeq , "SPOT_GROUP", vdb_ascii_t, NULL, NULL, 0},
+    {0, NULL, NULL, NULL, NULL, 0} /* terminator */
+};
+
+struct IlluminaReader {
+    /* SRAReader always must be a first member! */
+    SRAReader dad;
+    unsigned char phred2logodds_printable[256];
+    /* current spot data shortcuts */
+    const int32_t** lane;
+    const int32_t** tile;
+    const int32_t** x;
+    const int32_t** y;
+    const SRAReaderColumn* read;
+    const SRAReaderColumn* qual1;
+    const signed char** qual4;
+    const float** signal;
+    const float** noise;
+    const float** intensity;
+    const uint8_t** rfilter;
+    const SRAReaderColumn* spot_group;
+};
+
+static
+rc_t IlluminaReaderInit(const IlluminaReader* self, bool read, bool qual1, bool qual4, bool intensity, bool noise, bool signal, bool qseq)
+{
+    rc_t rc = 0;
+    int options = read ? eRead : 0;
+
+    CHECK_SELF(IlluminaReader);
+
+    options |= qual1 ? eQual1 : 0;
+    options |= qual4 ? eQual4 : 0;
+    options |= intensity ? eIntensity : 0;
+    options |= noise ? eNoise : 0;
+    options |= signal ? eSignal : 0;
+    options |= qseq ? eQSeq : 0;
+
+    if( (rc = SRAReaderInit(&self->dad, options, IlluminaReader_master_columns_desc)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[0], NULL, (const void***)&self->lane)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[1], NULL, (const void***)&self->tile)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[2], NULL, (const void***)&self->x)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[3], NULL, (const void***)&self->y)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[4], &me->read, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[5], &me->qual1, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[6], NULL, (const void***)&self->qual4)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[7], NULL, (const void***)&self->signal)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[8], NULL, (const void***)&self->noise)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[9], NULL, (const void***)&self->intensity)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[10], NULL, (const void***)&self->rfilter)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &IlluminaReader_master_columns_desc[11], &me->spot_group, NULL)) == 0) {
+    }
+    if( self->qual1 != NULL ) {
+        int i;
+        const float offset = (float)64.499;
+        me->phred2logodds_printable[0] = (unsigned char)offset;
+        for(i = 1; i < 256; i++) {
+            me->phred2logodds_printable[i] = (unsigned char)(10 * log(pow(10, i / 10.0) - 1) / log(10) + offset);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderMake(const IlluminaReader** self, const SRATable* table, const char* accession,
+                          bool read, bool qual1, bool qual4, bool intensity, bool noise, bool signal, bool qseq,
+                          spotid_t minSpotId, spotid_t maxSpotId)
+{
+    rc_t rc = SRAReaderMake((const SRAReader**)self, sizeof **self, table, accession, minSpotId, maxSpotId);
+    if( rc == 0 ) {
+        rc = IlluminaReaderInit(*self, read, qual1, qual4, intensity, noise, signal, qseq);
+    }
+    if( rc != 0 ) {
+        IlluminaReaderWhack(*self);
+        *self = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderWhack(const IlluminaReader* self)
+{
+    return SRAReaderWhack( &self->dad );
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderFirstSpot(const IlluminaReader* self)
+{
+    return SRAReaderFirstSpot( &self->dad );
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderSeekSpot(const IlluminaReader* self, spotid_t spot)
+{
+    return SRAReaderSeekSpot( &self->dad, spot );
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderNextSpot(const IlluminaReader* self)
+{
+    return SRAReaderNextSpot( &self->dad );
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderCurrentSpot(const IlluminaReader* self, spotid_t* spot)
+{
+    return SRAReaderCurrentSpot( &self->dad, spot );
+}
+
+LIB_EXPORT rc_t CC IlluminaReader_SpotInfo(const IlluminaReader* self,
+                                           const char** spotname, size_t* spotname_sz,
+                                           INSDC_coord_val* lane, INSDC_coord_val* tile, 
+                                           INSDC_coord_val* x, INSDC_coord_val* y,
+                                           uint32_t* spot_len, uint32_t* num_reads)
+{
+    rc_t rc = SRAReader_SpotInfo(&self->dad, spotname, spotname_sz, spot_len, num_reads);
+    if( rc == 0 ) {
+        if( lane ) {
+            *lane = (self->lane && *self->lane) ? **self->lane : 0;
+        }
+        if( tile ) {
+            *tile = (self->tile && *self->tile) ? **self->tile : ((self->dad.spot / 10001) + 1);
+        }
+        if( x ) {
+            *x = (self->x && *self->x) ? **self->x : 0;
+        }
+        if( y ) {
+            *y = (self->y && *self->y) ? **self->y : self->dad.spot;
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC IlluminaReader_SpotReadInfo(const IlluminaReader* self, uint32_t readId, SRAReadTypes* read_type,
+                                               const char** read_label, INSDC_coord_len* read_label_sz,
+                                               INSDC_coord_zero* read_start, INSDC_coord_len* read_len)
+{
+    return SRAReader_SpotReadInfo(&self->dad, readId, read_type,
+                                  read_label, read_label_sz, read_start, read_len);
+}
+
+#if 0
+static
+int kludge_snprintf ( char *buff, size_t bsize, const char *fmt, ... )
+{
+    int status;
+    va_list args, args2;
+
+    va_start ( args, fmt );
+    va_copy ( args2, args );
+
+    status = vsnprintf ( buff, bsize, fmt, args );
+    if ( status < 0 )
+    {
+        size_t kludge_size = 64 * 1024;
+        void *kludge = malloc ( kludge_size );
+        if ( kludge != NULL )
+        {
+            status = vsnprintf ( kludge, kludge_size, fmt, args2 );
+            if ( status >= 0 )
+            {
+                memmove ( buff, kludge, ( size_t ) status > bsize ? bsize : ( size_t ) status );
+                if ( ( size_t ) status < bsize )
+                    buff [ status ] = 0;
+            }
+            free ( kludge );
+        }
+    }
+
+    va_end ( args2 );
+    va_end ( args );
+
+    return status;
+}
+#endif
+
+LIB_EXPORT rc_t CC IlluminaReaderBase(const IlluminaReader* self, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    int sz = 0;
+    uint32_t spot_len;
+    INSDC_coord_val lane, tile, x, y;
+
+    CHECK_SELF(IlluminaReader);
+    CHECK_SPOT(me->dad);
+
+    if( data == NULL ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcNull);
+    } else if( !(self->dad.options & eRead) ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMessage, rcUnexpected);
+    } else if( (rc = IlluminaReader_SpotInfo(self, NULL, NULL, &lane, &tile, &x, &y, &spot_len, NULL)) == 0 ) {
+        sz = snprintf(data, dsize, "%d\t%d\t%d\t%d\t", lane, tile, x, y);
+        if( sz < 0 ) {
+#if SNPRINTF_ACTUALLY_WORKED_THE_WAY_YOU_THINK
+            rc = RC(rcSRA, rcString, rcConstructing, rcNoObj, rcUnknown);
+#else
+            /* both approaches are wrong - the error code is rcBuffer, rcInsufficient */
+            rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+#endif
+        } else {
+            sz += spot_len;
+            if( sz >= (int)dsize ) {
+                rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+            } else {
+                size_t len = 0;
+                sz -= spot_len;
+                while(len < spot_len) {
+                    const char* b = self->read->base;
+                    data[sz + len] = b[len];
+                    if( data[sz + len] == 'N' ) {
+                        data[sz + len] = '.';
+                    }
+                    ++len;
+                }
+                sz += spot_len;
+                data[sz] = '\0';
+            }
+        }
+    }
+    if( written != NULL ) {
+        *written = sz;
+    }
+    return rc;
+}
+
+static
+rc_t IlluminaReader_4floats(const IlluminaReader* self, const float** col_data, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    int sz = 0;
+    const float* f = NULL;
+    uint32_t i, spot_len;
+    INSDC_coord_val lane, tile, x, y;
+
+    CHECK_SELF(IlluminaReader);
+    CHECK_SPOT(me->dad);
+
+    if( data == NULL ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcNull);
+    } else if( (rc = IlluminaReader_SpotInfo(self, NULL, NULL, &lane, &tile, &x, &y, &spot_len, NULL)) == 0 ) {
+        if( col_data == NULL || *col_data == NULL ) {
+            /* optional column is missing */
+            if( written != NULL ) {
+                *written = 0;
+            }
+            data[0] = '\0';
+        } else {
+            f = *col_data;
+            sz = snprintf(data, dsize, "%d\t%d\t%d\t%d", lane, tile, x, y);
+            if( sz < 0 ) {
+#if SNPRINTF_ACTUALLY_WORKED_THE_WAY_YOU_THINK
+                rc = RC(rcSRA, rcString, rcConstructing, rcNoObj, rcUnknown);
+#else
+                rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+#endif
+            } else {
+                for(i = 0; rc == 0 && i < spot_len; i++, f += 4) {
+                    int x = sz >= (int)dsize ? 0 : sz;
+                    x = snprintf(&data[x], dsize - x, "\t%.*f %.*f %.*f %.*f", f[0] ? 1 : 0, f[0], f[1] ? 1 : 0, f[1],
+                                 f[2] ? 1 : 0,  f[2], f[3] ? 1 : 0,  f[3]);
+                    if( x < 0 ) {
+#if SNPRINTF_ACTUALLY_WORKED_THE_WAY_YOU_THINK
+                        rc = RC(rcSRA, rcString, rcConstructing, rcNoObj, rcUnknown);
+#else
+                        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+#endif
+                    }
+                    sz += x;
+                }
+                if( rc == 0 && written != NULL ) {
+                    *written = sz;
+                }
+            }
+        }
+    }
+    if( rc == 0 && sz >= (int)dsize ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderNoise(const IlluminaReader* self, char* data, size_t dsize, size_t* written)
+{
+    return IlluminaReader_4floats(self, self->noise, data, dsize, written);
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderIntensity(const IlluminaReader* self, char* data, size_t dsize, size_t* written)
+{
+    return IlluminaReader_4floats(self, self->intensity, data, dsize, written);
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderSignal(const IlluminaReader* self, char* data, size_t dsize, size_t* written)
+{
+    return IlluminaReader_4floats(self, self->signal, data, dsize, written);
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderQuality1(const IlluminaReader* self, uint32_t readId, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    size_t sz = 0;
+    const uint8_t* p = NULL;
+
+    CHECK_SELF(IlluminaReader);
+    CHECK_SPOT(me->dad);
+
+    if( data == NULL ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcNull);
+    } else if( !(self->dad.options & eQual1) ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMessage, rcUnexpected);
+    } else if( self->qual1 == NULL || self->qual1->size == 0 ) {
+        /* empty value */
+    } else if( readId > 0 ) {
+        INSDC_coord_zero read_start;
+        INSDC_coord_len read_len;
+        if( (rc = IlluminaReader_SpotReadInfo(self, readId, NULL, NULL, NULL, &read_start, &read_len)) == 0 ) {
+            sz = read_len;
+            p = self->qual1->base;
+            p += read_start;
+        }
+    } else {
+        uint32_t spot_len;
+        if( (rc = IlluminaReader_SpotInfo(self, NULL, NULL, NULL, NULL, NULL, NULL, &spot_len, NULL)) == 0 ) {
+            sz = spot_len;
+            p = self->qual1->base;
+        }
+    }
+    if( rc == 0 ) {
+        if( sz >= dsize ) {
+            rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+        } else {
+            size_t i;
+            for(i = 0; i < sz; i++) {
+                data[i] = self->phred2logodds_printable[p[i]];
+            }
+            data[sz] = '\0';
+        }
+    }
+    if( written != NULL ) {
+        *written = sz;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderQuality4(const IlluminaReader* self, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    uint32_t spot_len;
+
+    CHECK_SELF(IlluminaReader);
+    CHECK_SPOT(me->dad);
+
+    if( data == NULL ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcNull);
+    } else if( self->qual4 == NULL ) {
+        /* optional column is missing */
+        if( written != NULL ) {
+            *written = 0;
+        }
+        data[0] = '\0';
+    } else if( (rc = IlluminaReader_SpotInfo(self, NULL, NULL, NULL, NULL, NULL, NULL, &spot_len, NULL)) == 0 ) {
+        int sz = spot_len * 20 - 1; /* no \t at line start */
+        if( written != NULL ) {
+            *written = sz;
+        }
+        if( sz >= (int)dsize ) {
+            rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+        } else {
+            const signed char* q4 = *self->qual4;
+            int x;
+            uint32_t len = 0;
+            for(sz = 0; rc == 0 && len < spot_len; len++, q4 += 4) {
+                x = snprintf(&data[sz], dsize - sz, "%s%4d %4d %4d %4d", len > 0 ? "\t" : "", q4[0], q4[1], q4[2], q4[3]);
+#if SNPRINTF_ACTUALLY_WORKED_THE_WAY_YOU_THINK
+                if( x < 0 ) {
+                    rc = RC(rcSRA, rcString, rcConstructing, rcNoObj, rcUnknown);
+#else
+                if( x < 0 || ( size_t ) sz + x >= dsize ) {
+                    rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+#endif
+                }
+                sz += x;
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC IlluminaReaderQSeq(const IlluminaReader* self, uint32_t readId, bool spot_group,
+                                      char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    const char* spotname;
+    size_t spotname_sz;
+    uint32_t nreads, spotlen;
+    INSDC_coord_val lane, tile, x, y;
+    int sz = 0;
+
+    CHECK_SELF(IlluminaReader);
+    CHECK_SPOT(me->dad);
+
+    if( data == NULL ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcNull);
+    } else if( !(self->dad.options & eQSeq) ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMessage, rcUnexpected);
+    } else if( (rc = IlluminaReader_SpotInfo(self, &spotname, &spotname_sz, &lane, &tile, &x, &y, &spotlen, &nreads)) == 0 ) {
+        INSDC_coord_zero read_start = 0;
+        INSDC_coord_len read_len = spotlen;
+        if( readId > 0 ) {
+            rc = IlluminaReader_SpotReadInfo(self, readId, NULL, NULL, NULL, &read_start, &read_len);
+        }
+        if( rc == 0 ) {
+            const char* sg = "0";
+            int sg_sz = 1;
+            const char* runid = "0";
+            size_t runid_sz = 1;
+            int i = 0;
+
+            if( spotname_sz > 0 ) {
+                const char* c = spotname + spotname_sz;
+                while( i < 4 && c != NULL ) {
+                    c = memrchr(spotname, ':', c - spotname);
+                    if( c != NULL ) {
+                        i++;
+                    }
+                }
+                if( i == 4 ) {
+                    spotname_sz = c - spotname;
+                    c = memrchr(spotname, '_', spotname_sz);
+                    if( c != NULL ) {
+                        runid = c + 1;
+                        runid_sz = spotname_sz - (c - spotname) - 1;
+                        spotname_sz = c - spotname;
+                    }
+                } else {
+                    spotname_sz = 0;
+                }
+            }
+            if( spotname_sz == 0 ) {
+                spotname = self->dad.accession;
+                spotname_sz = strlen(spotname);
+            }
+            if( spot_group && self->spot_group && self->spot_group->size > 0 ) {
+                sg = self->spot_group->base;
+                sg_sz = self->spot_group->size;
+            }
+            i = snprintf(data, dsize, "%.*s\t%.*s\t%d\t%d\t%d\t%d\t%.*s\t%d\t",
+                (int)spotname_sz, spotname, (int)runid_sz, runid, lane, tile, x, y, sg_sz, sg, readId > 0 ? readId : 1);
+#if SNPRINTF_ACTUALLY_WORKED_THE_WAY_YOU_THINK
+            if( i < 0 ) {
+                rc = RC(rcSRA, rcString, rcConstructing, rcNoObj, rcUnknown);
+#else
+            if( i < 0 || ( size_t ) i >= dsize ) {
+                rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+#endif
+            } else {
+                sz += i;
+                i = sz; /* save length of initial part */
+
+                /* precalc full line length: seq\tqual\tflt */
+                sz += 2 * (read_len + 1) + 1;
+                if( sz >= (int)dsize ) {
+                    rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+                } else {
+                    char flt = '1';
+                    const char* b = self->read->base;
+
+                    /* reverse back to initial part length */
+                    sz = i;
+                    if( *self->rfilter != NULL ) {
+                        if( readId > 0 && (*self->rfilter)[readId - 1] != SRA_READ_FILTER_PASS ) {
+                            flt = '0';
+                        } else {
+                            for(i = 0; i < nreads; i++) {
+                                if( (*self->rfilter)[i] != SRA_READ_FILTER_PASS ) {
+                                    flt = '0';
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    for(i = 0; i < read_len; i++) {
+                        data[sz + i] = b[read_start + i];
+                        if( data[sz + i] == 'N' ) {
+                            data[sz + i] = '.';
+                        }
+                    }
+                    sz += read_len;
+                    data[sz++] = '\t';
+                    if( self->qual1 && self->qual1->size ) {
+                        const uint8_t* p = self->qual1->base;
+                        for(i = 0; i < read_len; i++) {
+                            data[sz + i] = p[read_start + i] + 64;
+                        }
+                        sz += read_len;
+                    }
+                    data[sz++] = '\t';
+                    data[sz++] = flt;
+                    data[sz] = '\0';
+                }
+            }
+        }
+    }
+    if( written != NULL ) {
+        *written = sz;
+    }
+    return rc;
+}
diff --git a/libs/sra/reader-sff.c b/libs/sra/reader-sff.c
new file mode 100644
index 0000000..c82c0cd
--- /dev/null
+++ b/libs/sra/reader-sff.c
@@ -0,0 +1,380 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <sra/rd-extern.h>
+
+#include <klib/rc.h>
+#include <sra/types.h>
+#include <sra/sff.h>
+#include <sra/sff-file.h>
+#include <sysalloc.h>
+
+#include "reader-cmn.h"
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#   include <byteswap.h>
+#else
+#   define bswap_16(x) (x)
+#   define bswap_32(x) (x)
+#endif
+#include <string.h>
+
+/* column order is important here: see Init function below!!! */
+static
+const SRAReaderColumn SFFReader_master_columns_desc[] = {
+    {SRAREADER_COL_MANDATORY, "FLOW_CHARS", insdc_fasta_t, NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, "KEY_SEQUENCE", insdc_fasta_t, NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, "READ", insdc_fasta_t, NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, "QUALITY", insdc_phred_t, NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, "SIGNAL", ncbi_isamp1_t, NULL, NULL, 0},
+    {SRAREADER_COL_MANDATORY, "POSITION", "INSDC:position:one", NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL, "CLIP_QUALITY_LEFT", "INSDC:coord:one", NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL, "CLIP_QUALITY_RIGHT", "INSDC:coord:one", NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL, "CLIP_ADAPTER_LEFT", "INSDC:coord:one", NULL, NULL, 0},
+    {SRAREADER_COL_OPTIONAL, "CLIP_ADAPTER_RIGHT", "INSDC:coord:one", NULL, NULL, 0},
+    {0, NULL, NULL, NULL, NULL, 0} /* terminator */
+};
+
+struct SFFReader {
+    /* SRAReader always must be a first member! */
+    SRAReader dad;
+    /* current spot data shortcuts */
+    const SRAReaderColumn* flow_chars;
+    const SRAReaderColumn* key_seq;
+    const SRAReaderColumn* read;
+    const SRAReaderColumn* qual1;
+    const SRAReaderColumn* signal;
+    const SRAReaderColumn* position;
+    const INSDC_coord_one** clip_q_left;
+    const INSDC_coord_one** clip_q_right;
+    const INSDC_coord_one** clip_adapter_left;
+    const INSDC_coord_one** clip_adapter_right;
+};
+
+static
+rc_t SFFReaderInit(const SFFReader* self)
+{
+    rc_t rc = 0;
+
+    CHECK_SELF(SFFReader);
+    rc = SRAReaderInit(&self->dad, 0, SFFReader_master_columns_desc);
+    if( GetRCState(rc) == rcNotFound && GetRCObject(rc) == (enum RCObject) rcColumn ) {
+        rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported);
+    } else if( rc == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &SFFReader_master_columns_desc[0], &me->flow_chars, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &SFFReader_master_columns_desc[1], &me->key_seq, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &SFFReader_master_columns_desc[2], &me->read, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &SFFReader_master_columns_desc[3], &me->qual1, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &SFFReader_master_columns_desc[4], &me->signal, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &SFFReader_master_columns_desc[5], &me->position, NULL)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &SFFReader_master_columns_desc[6], NULL, (const void***)&self->clip_q_left)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &SFFReader_master_columns_desc[7], NULL, (const void***)&self->clip_q_right)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &SFFReader_master_columns_desc[8], NULL, (const void***)&self->clip_adapter_left)) == 0 &&
+        (rc = SRAReader_FindColData(&self->dad, &SFFReader_master_columns_desc[9], NULL, (const void***)&self->clip_adapter_right)) == 0 ) {
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SFFReaderMake(const SFFReader** self, const SRATable* table,
+                   const char* accession, spotid_t minSpotId, spotid_t maxSpotId )
+{
+    rc_t rc = SRAReaderMake((const SRAReader**)self, sizeof **self, table, accession, minSpotId, maxSpotId);
+
+    if( rc == 0 ) {
+        rc = SFFReaderInit(*self);
+    }
+    if( rc != 0 ) {
+        SFFReaderWhack(*self);
+        *self = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SFFReaderWhack(const SFFReader *self)
+{
+    return SRAReaderWhack( &self->dad );
+}
+
+LIB_EXPORT rc_t CC SFFReaderFirstSpot(const SFFReader* self)
+{
+    return SRAReaderFirstSpot( &self->dad );
+}
+
+LIB_EXPORT rc_t CC SFFReaderSeekSpot(const SFFReader* self, spotid_t spot)
+{
+    return SRAReaderSeekSpot( &self->dad, spot );
+}
+
+LIB_EXPORT rc_t CC SFFReaderNextSpot(const SFFReader* self)
+{
+    return SRAReaderNextSpot( &self->dad );
+}
+
+LIB_EXPORT rc_t CC SFFReaderCurrentSpot(const SFFReader* self, spotid_t* spot)
+{
+    return SRAReaderCurrentSpot( &self->dad, spot );
+}
+
+LIB_EXPORT rc_t CC SFFReader_SpotInfo(const SFFReader* self, const char** spotname, size_t* spotname_sz,
+                                      uint32_t* spot_len, uint32_t* num_reads)
+{
+    return SRAReader_SpotInfo( &self->dad, spotname, spotname_sz, spot_len, num_reads );
+}
+
+LIB_EXPORT rc_t CC SFFReader_SpotReadInfo(const SFFReader* self, uint32_t readId, SRAReadTypes* read_type,
+                                          const char** read_label, INSDC_coord_len* read_label_sz,
+                                          INSDC_coord_zero* read_start, INSDC_coord_len* read_len)
+{
+    return SRAReader_SpotReadInfo(&self->dad, readId, read_type,
+                                  read_label, read_label_sz, read_start, read_len);
+}
+
+LIB_EXPORT rc_t CC SFFReaderHeader(const SFFReader* self, spotid_t spots, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    SFFCommonHeader h;
+
+    CHECK_SELF(SFFReader);
+
+    /* we need to read 1st spot in order to get to flow and key seq col data */
+    if( me->dad.spot == 0 && (rc = SFFReaderSeekSpot(self, me->dad.minSpotId)) != 0 ) {
+        return rc;
+    }
+    memset(&h, 0, sizeof(SFFCommonHeader));
+    memmove(&h, ".sff\0\0\0\1", 8);
+    h.number_of_reads = spots != 0 ? spots : (self->dad.maxSpotId - me->dad.minSpotId + 1);
+    h.key_length = (uint16_t)self->key_seq->size;
+    h.num_flows_per_read = (uint16_t)self->flow_chars->size;
+    h.flowgram_format_code = SFFFormatCodeUI16Hundreths;
+
+    h.header_length = SFFCommonHeader_size + h.key_length + h.num_flows_per_read;
+    /* 8-byte pad */
+    h.header_length += (h.header_length % 8) ? (8 - (h.header_length % 8)) : 0;
+    if( written != NULL ) {
+        *written = h.header_length;
+    }
+    if( h.header_length > dsize ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    } else {
+        uint16_t len = h.header_length;
+
+        h.number_of_reads = bswap_32( h.number_of_reads );
+        h.header_length = bswap_16( h.header_length );
+        h.key_length = bswap_16( h.key_length );
+        h.num_flows_per_read = bswap_16( h.num_flows_per_read );
+
+        memset(data, 0, len);
+        memmove(data, &h, SFFCommonHeader_size);
+        memmove(&data[SFFCommonHeader_size], self->flow_chars->base, self->flow_chars->size);
+        memmove(&data[SFFCommonHeader_size + self->flow_chars->size], self->key_seq->base, self->key_seq->size);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SFFReaderReadHeader(const SFFReader* self, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    size_t spotname_sz;
+    const char* spotname;
+    uint32_t spot_len;
+    SFFReadHeader h;
+
+    CHECK_SELF(SFFReader);
+    CHECK_SPOT(me->dad);
+
+    memset(&h, 0, sizeof(SFFReadHeader));
+
+    if( (rc = SFFReader_SpotInfo(self, &spotname, &spotname_sz, &spot_len, NULL)) != 0 ) {
+        return rc;
+    }
+    if( self->clip_q_left != NULL && *self->clip_q_left != NULL ) {
+        h.clip_quality_left = **self->clip_q_left;
+    }
+    if( self->clip_q_right != NULL && *self->clip_q_right != NULL ) {
+        h.clip_quality_right = **self->clip_q_right;
+    }
+    if( self->clip_adapter_left != NULL && *self->clip_adapter_left != NULL ) {
+        h.clip_adapter_left = **self->clip_adapter_left;
+    }
+    if( self->clip_adapter_right != NULL && *self->clip_adapter_right != NULL ) {
+        h.clip_adapter_right = **self->clip_adapter_right;
+    }
+    if( spotname_sz == 0 ) {
+        spotname = self->dad.accession;
+        spotname_sz = strlen(spotname);
+    }
+    h.name_length = (uint16_t)spotname_sz;
+    h.number_of_bases = spot_len;
+    h.header_length = (uint16_t)( SFFReadHeader_size + spotname_sz );
+    /* 8-byte pad */
+    h.header_length += (h.header_length % 8) ? (8 - (h.header_length % 8)) : 0;
+    if( written != NULL ) {
+        *written = h.header_length;
+    }
+    if( h.header_length > dsize ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    } else {
+        uint16_t len = h.header_length;
+
+        h.header_length = bswap_16(h.header_length);
+        h.name_length = bswap_16(h.name_length);
+        h.number_of_bases = bswap_32(h.number_of_bases);
+        h.clip_quality_right = bswap_16(h.clip_quality_right);
+        h.clip_quality_left = bswap_16(h.clip_quality_left);
+        h.clip_adapter_left = bswap_16(h.clip_adapter_left);
+        h.clip_adapter_right = bswap_16(h.clip_adapter_right);
+
+        memset(data, 0, len);
+        memmove(data, &h, SFFReadHeader_size);
+        memmove(&data[SFFReadHeader_size], spotname, spotname_sz);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SFFReaderReadData(const SFFReader* self, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    size_t flows, len, padding;
+    uint32_t spot_len;
+    /* SFF type defining vars, not used */
+    const uint16_t sff_signal;
+    const uint8_t sff_position;
+    const char sff_bases;
+    const uint8_t sff_quality;
+
+    CHECK_SELF(SFFReader);
+    CHECK_SPOT(me->dad);
+
+    /* if for some reason READ, QUAL and POSITION rows are uneqaul in size,
+       base their length on actual READ size */
+    spot_len = self->read->size / sizeof(INSDC_dna_text);
+    /* this size if fixed across the file */
+    flows = self->flow_chars->size / sizeof(INSDC_dna_text);
+
+    /* read data section size: per SFF spec types sizes + 8-byte padding */
+    len = flows * sizeof(sff_signal) + spot_len * (sizeof(sff_position) + sizeof(sff_bases) + sizeof(sff_quality));
+    padding = (len % 8) ? (8 - (len % 8)) : 0;
+    len += padding;
+
+    if( written != NULL ) {
+        *written = len;
+    }
+    if( len > dsize ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    } else {
+        size_t qty;
+        INSDC_position_one ppos;
+        const uint16_t* signal = self->signal->base;
+        uint16_t* dst_sig = (uint16_t*)data;
+        const INSDC_position_one* position = self->position->base;
+
+        qty = self->signal->size / sizeof(*signal);
+        if( qty > flows ) {
+            qty = flows;
+        }
+        for(len = 0; len < qty; len++) {
+            dst_sig[len] = bswap_16(signal[len]);
+        }
+        if( qty < flows ) {
+            memset(&data[qty * sizeof(sff_signal)], 0, (flows - qty) * sizeof(sff_signal));
+        }
+        data += flows * sizeof(sff_signal);
+
+        qty = self->position->size / sizeof(*position);
+        if( qty > spot_len ) {
+            qty = spot_len;
+        }
+        for(ppos = 0, len = 0; len < qty; len++) {
+            data[len] = (uint8_t)(position[len] - ppos);
+            ppos = position[len];
+        }
+        if( qty < spot_len ) {
+            memset(&data[qty], 0, (spot_len - qty) * sizeof(sff_position));
+        }
+        data += spot_len;
+
+        /* this are guaranteed above to be same length */
+        memmove(data, self->read->base, spot_len);
+        data += spot_len;
+
+        qty = self->qual1->size / sizeof(INSDC_quality_phred);
+        if( qty > spot_len ) {
+            qty = spot_len;
+        }
+        memmove(data, self->qual1->base, qty);
+        if( qty < spot_len ) {
+            memset(&data[qty], 0, (spot_len - qty) * sizeof(sff_quality));
+        }
+        if( padding > 0 ) {
+            memset(&data[spot_len], 0, padding);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SFFReader_GetCurrentSpotData(const SFFReader* self, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = 0;
+    size_t len = 0, left = dsize, w = 0;
+    char* b = data;
+
+    CHECK_SELF(SFFReader);
+    CHECK_SPOT(me->dad);
+
+    rc = SFFReaderReadHeader(me, b, left, &w);
+    len += w, b += w, left -= w;
+    if( rc != 0 ) {
+        if( !(GetRCObject(rc) == rcMemory && GetRCState(rc) == rcInsufficient) ) {
+            return rc;
+        }
+        b = data, left = dsize;
+    }
+    rc = SFFReaderReadData(self, b, left, &w);
+    len += w, b += w, left -= w;
+    if( rc != 0 ) {
+        if( !(GetRCObject(rc) == rcMemory && GetRCState(rc) == rcInsufficient) ) {
+            return rc;
+        }
+    }
+    if( written != NULL ) {
+        *written = len;
+    }
+    if( len > dsize ) {
+        rc = RC(rcSRA, rcString, rcConstructing, rcMemory, rcInsufficient);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SFFReader_GetNextSpotData(const SFFReader* self, char* data, size_t dsize, size_t* written)
+{
+    rc_t rc = SFFReaderNextSpot(self);
+    if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcUnknown ) {
+        rc = SFFReaderFirstSpot(self);
+    }
+    if( rc == 0 ) {
+        rc = SFFReader_GetCurrentSpotData(self, data, dsize, written);
+    }
+    return rc;
+}
diff --git a/libs/sra/sra-debug.h b/libs/sra/sra-debug.h
new file mode 100644
index 0000000..bfb7de4
--- /dev/null
+++ b/libs/sra/sra-debug.h
@@ -0,0 +1,42 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_debug_
+#define _h_sra_debug_
+
+#include <klib/debug.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SRADBG(msg) DBGMSG(DBG_SRA,DBG_FLAG(DBG_SRA_INFO),msg)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _sra_debug_ */
diff --git a/libs/sra/sra-dflt-schema.c b/libs/sra/sra-dflt-schema.c
new file mode 100644
index 0000000..8ca5ff1
--- /dev/null
+++ b/libs/sra/sra-dflt-schema.c
@@ -0,0 +1,552 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/container.h>
+#include <klib/vector.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#define WITH_DNA
+
+#define DEPENDENCY_EXTENSION "d"
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+
+
+/********************************************************************
+helper function to display failure or success message
+********************************************************************/
+static void display_rescode( const rc_t rc, const char* failure, const char* success )
+{
+    if ( rc != 0 )
+        LOGERR( klogInt, rc, failure );
+    else
+        if ( success ) LOGMSG( klogInfo, success );
+}
+
+typedef struct context
+{
+    const char *output_file;
+    char *dependency_file;
+    VNamelist *include_files;
+    VNamelist *src_files;
+} context;
+typedef context* p_context;
+
+static void context_set_str( char **dst, const char *src )
+{
+    size_t len;
+    if ( dst == NULL ) return;
+    if ( *dst != NULL ) free( *dst );
+    if ( src == NULL ) return;
+    len = strlen( src );
+    if ( len == 0 ) return;
+    *dst = (char*)malloc( len + 1 );
+    strcpy( *dst, src );
+}
+
+static bool context_init( context **ctx )
+{
+    bool res = false;
+    if ( ctx != NULL )
+    {
+        (*ctx) = malloc( sizeof( context ) );
+        if ( *ctx )
+        {
+            (*ctx)->output_file = NULL;
+            (*ctx)->dependency_file = NULL;
+            VNamelistMake( &( (*ctx)->include_files ), 5 );
+            VNamelistMake( &( (*ctx)->src_files ), 5 );
+            res = true;
+        }
+    }
+    return res;
+}
+
+static void context_destroy( p_context ctx )
+{
+    if ( ctx == NULL ) return;
+    free( (char*)ctx->output_file );
+    free( (char*)ctx->dependency_file );
+    VNamelistRelease( ctx->include_files );
+    VNamelistRelease( ctx->src_files );
+    free( ctx );
+}
+
+const char UsageDefaultName [] = "sra-dflt-schema";
+
+
+rc_t CC UsageSummary (const char * progname)
+{
+    return KOutMsg ("\n"
+                    "Usage:\n"
+                    "  %s src1 src2 -Iinclude1 -Iinclude2 -ooutput -Tdependency\n",
+                    progname);
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    rc_t rc;
+
+    if ( args == NULL )
+        rc = RC( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        const char * progname = UsageDefaultName;
+        const char * fullpath = UsageDefaultName;
+
+        rc = ArgsProgram ( args, &fullpath, &progname );
+
+        UsageSummary( progname );
+
+        KOutMsg( "%s src1 src2 -Iinclude1 -Iinclude2 -ooutput -Tdependency\n"
+                  "    src1, src2 ..........schema source-files  (mandatory))\n"
+                  " -I include1, include2 ..schema include-files (optional))\n"
+                  " -o output-file .........schema output (optional)) if none --> stdout\n"
+                  " -T dependency-file .....list of includes in make-syntax (optional))\n",
+                  progname );
+
+        HelpVersion( fullpath, KAppVersion() );
+    }
+    return rc;
+}
+
+
+/* pass the new extension without a leading dot!
+   assumes that the filename is not static, but made via malloc */
+void change_extension( char **filename, const char *new_extension )
+{
+    char *temp, *buf;
+    size_t src_len, ext_len;
+
+    if ( filename == NULL ) return;
+    if ( (*filename) == NULL ) return;
+    if ( new_extension == NULL ) return;
+    src_len = strlen( *filename );
+    if ( src_len < 1 ) return;
+    ext_len = strlen( new_extension );
+    if ( ext_len < 1 ) return;
+    buf = malloc( src_len + ext_len + 2 );
+    temp = strrchr( *filename, '.' );
+    if ( temp != NULL ) *temp = 0; /* terminate */
+    sprintf( buf, "%s.%s", *filename, new_extension );
+    temp = *filename;
+    *filename = buf;
+    free( temp );
+}
+
+#define OPTION_INCLUDE "include"
+#define OPTION_DEPENDENCY "dependency"
+#define OPTION_OUTPUT "output"
+#define ALIAS_INCLUDE "I"
+#define ALIAS_DEPENDENCY "T"
+#define ALIAS_OUTPUT "o"
+
+const char * include_usage[] = { "include schema", NULL };
+const char * dependency_usage[] = { "dependency", NULL };
+const char * output_usage[] = { "output", NULL };
+
+OptDef Options[] =
+{
+/* is their a real reason for a limit of 10? */
+    { OPTION_INCLUDE, ALIAS_INCLUDE, NULL, include_usage, 10, true, false },
+    { OPTION_DEPENDENCY, ALIAS_DEPENDENCY, NULL, dependency_usage, 1, true, false },
+    { OPTION_OUTPUT, ALIAS_OUTPUT, NULL, output_usage, 1, true, false }
+};
+
+static const char* get_str_option( const Args *my_args, const char *name )
+{
+    const char* res = NULL;
+    uint32_t count;
+    rc_t rc = ArgsOptionCount( my_args, name, &count );
+    if ( ( rc == 0 )&&( count > 0 ) )
+    {
+        ArgsOptionValue( my_args, name, 0, (const void **)&res );
+    }
+    return res;
+}
+
+static void append_str_options( const Args *my_args, const char *name, VNamelist *dst )
+{
+    uint32_t count;
+    rc_t rc = ArgsOptionCount( my_args, name, &count );
+    if ( ( rc == 0 )&&( count > 0 ) )
+    {
+        uint32_t idx;
+        for ( idx=0; idx<count; ++idx )
+        {
+            const char* s;
+            if ( ArgsOptionValue( my_args, name, idx, (const void **)&s ) == 0 )
+                VNamelistAppend( dst, s );
+        }
+    }
+}
+
+static void append_str_arguments( const Args *my_args, VNamelist *dst )
+{
+    uint32_t count;
+    rc_t rc = ArgsParamCount( my_args, &count );
+    if ( ( rc == 0 )&&( count > 0 ) )
+    {
+        uint32_t idx;
+        for ( idx=0; idx<count; ++idx )
+        {
+            const char* s;
+            if ( ArgsParamValue( my_args, idx, (const void **)&s ) == 0 )
+                VNamelistAppend( dst, s );
+        }
+    }
+}
+
+static void evaluate_options( const Args *my_args, context *ctx )
+{
+    context_set_str( (char**)&(ctx->output_file),
+                     get_str_option( my_args, OPTION_OUTPUT ) );
+    context_set_str( (char**)&(ctx->dependency_file),
+                     get_str_option( my_args, OPTION_DEPENDENCY ) );
+    append_str_options( my_args, OPTION_INCLUDE, ctx->include_files );
+    append_str_arguments( my_args, ctx->src_files );
+}
+
+static rc_t capture_arguments_and_options( Args * args, context *ctx )
+{
+    evaluate_options( args, ctx );
+    change_extension( &(ctx->dependency_file), DEPENDENCY_EXTENSION );
+
+    return 0;
+}
+
+typedef rc_t (*name_fkt)( void *data, const char *my_name );
+
+static rc_t for_each_v_name( VNamelist *names, void *data, const name_fkt f )
+{
+    KNamelist *knames;
+    uint32_t count, idx;
+    rc_t rc = VNamelistToNamelist( names, (KNamelist **)&knames );
+    display_rescode( rc, "VNamelistToNamelist failed", NULL );
+    if ( rc == 0 )
+    {
+        rc = KNamelistCount( knames, &count );
+        display_rescode( rc, "KNamelistCount failed", NULL );
+        if ( rc == 0 )
+        {
+            for ( idx=0; idx<count; ++idx )
+            {
+                const char *my_path;
+                rc = KNamelistGet( knames, idx, &my_path );
+                display_rescode( rc, "KNamelistGet failed", NULL );
+                if ( rc == 0 )
+                    rc = f( data, my_path );
+            }
+        }
+        KNamelistRelease( knames );
+    }
+    return rc;
+}
+
+static rc_t for_each_k_name( KNamelist *names, void *data, const name_fkt f )
+{
+    uint32_t count, idx;
+    rc_t rc = KNamelistCount( names, &count );
+    display_rescode( rc, "KNamelistCount failed", NULL );
+    if ( rc == 0 )
+    {
+        for ( idx=0; idx<count; ++idx )
+        {
+            const char *my_path;
+            rc = KNamelistGet( names, idx, &my_path );
+            display_rescode( rc, "KNamelistGet failed", NULL );
+            if ( rc == 0 )
+                rc = f( data, my_path );
+        }
+    }
+    return rc;
+}
+
+static uint32_t namelistcount( VNamelist *names )
+{
+    KNamelist *knames;
+    uint32_t count = 0;
+
+    if ( VNamelistToNamelist( names, (KNamelist **)&knames ) == 0 )
+        KNamelistCount( knames, &count );
+    return count;
+}
+
+static rc_t add_include( void *data, const char *my_name )
+{
+    VSchema *my_schema = (VSchema*)data;
+    rc_t rc = VSchemaAddIncludePath( my_schema, "%s", my_name );
+    display_rescode( rc, "VSchemaAddIncludePath failed", NULL );
+    return rc;
+}
+
+static rc_t add_source( void *data, const char *my_name )
+{
+    VSchema *my_schema = (VSchema*)data;
+    rc_t rc = VSchemaParseFile( my_schema, "%s", my_name );
+    display_rescode( rc, "VSchemaParseFile failed", NULL );
+    return rc;
+}
+
+struct schema_dumper_state_t {
+    FILE *fp;
+    unsigned line_pos;
+    uint32_t out_size;
+    char line_buf[255];
+};
+
+static void schema_dumper_state_write_line(struct schema_dumper_state_t *st) {
+    st->line_buf[st->line_pos] = '\n';
+    fwrite(st->line_buf, 1, st->line_pos + 1, st->fp);
+    st->line_pos = 0;
+}
+
+/********************************************************************
+helper function needed by schema-dump
+********************************************************************/
+static rc_t CC my_flush ( void *dst, const void *buffer, size_t bsize )
+{
+    struct schema_dumper_state_t *st = (struct schema_dumper_state_t *)dst;
+    size_t i;
+    
+    st->out_size += bsize;
+    for (i = 0; i != bsize; ++i) {
+        int n;
+        int c = ((const char *)buffer)[i];
+        
+        if (st->line_pos > 80)
+            schema_dumper_state_write_line(st);
+
+        if (c == '\'' || c == '\\')
+            n = sprintf(st->line_buf + st->line_pos, " '\\%c',", c);
+        else
+            n = sprintf(st->line_buf + st->line_pos, " '%c',", c);
+        st->line_pos += n;
+    }
+    return 0;
+}
+
+static rc_t Write1Dependency( void* data, const char* name )
+{
+    FILE *my_file = (FILE*)data;
+    char prefix[] = { " \\\n  " };
+    size_t to_write;
+
+    if ( my_file == NULL ) return 0;
+    if ( name == NULL ) return 0;
+    to_write = strlen( name );
+    if ( to_write == 0 ) return 0;
+    fwrite( prefix, sizeof(char), strlen(prefix), my_file );
+    fwrite( name, sizeof(char), to_write, my_file );
+    return 0;
+}
+
+static rc_t WriteDependency( VSchema *my_schema, const context *ctx )
+{
+    rc_t rc = 0;
+    FILE *my_file;
+    const KNamelist *knames;
+
+    if ( ctx->dependency_file == NULL ) return rc;
+    if ( ctx->output_file == NULL ) return rc;
+    rc = VSchemaIncludeFiles( my_schema, &knames );
+    display_rescode( rc, "VSchemaIncludeFiles failed", NULL );
+    if ( rc == 0 )
+    {
+        my_file = fopen( ctx->dependency_file, "w" );
+        if ( my_file != NULL )
+        {
+            char buf[512];
+            int len = snprintf( buf, sizeof(buf), "%s:", ctx->output_file );
+            if ( ( len < 0 )||( len >= sizeof(buf) ) )
+            {
+                rc = -1;
+            }
+            else
+            {
+                fwrite( buf, sizeof(char), len, my_file );
+                for_each_k_name( (void*)knames, my_file, Write1Dependency );
+            }
+            fclose( my_file );
+        }
+        KNamelistRelease( knames );
+    }
+    return rc;
+}
+
+static rc_t DumpSchema_to( VSchema *my_schema, const context *ctx )
+{
+    struct schema_dumper_state_t st;
+    rc_t rc = 0;
+    unsigned i;
+
+    static const char *preamble[] = {
+        "/*===========================================================================",
+        "*",
+        "*                             PUBLIC DOMAIN NOTICE",
+        "*                National Center for Biotechnology Information",
+        "*",
+        "*   This software/database is a \"United States Government Work\" under the",
+        "*   terms of the United States Copyright Act.  It was written as part of",
+        "*   the author's official duties as a United States Government employee and",
+        "*   thus cannot be copyrighted.  This software/database is freely available",
+        "*   to the public for use. The National Library of Medicine and the U.S.",
+        "*   Government have not placed any restriction on its use or reproduction.",
+        "*",
+        "*   Although all reasonable efforts have been taken to ensure the accuracy",
+        "*   and reliability of the software and data, the NLM and the U.S.",
+        "*   Government do not and cannot warrant the performance or results that",
+        "*   may be obtained by using this software or data. The NLM and the U.S.",
+        "*   Government disclaim all warranties, express or implied, including",
+        "*   warranties of performance, merchantability or fitness for any particular",
+        "*   purpose.",
+        "*",
+        "*   Please cite the author in any work or product based on this material.",
+        "*",
+        "* ===========================================================================",
+        "*",
+        "* THIS IS AN AUTO-GENERATED FILE - DO NOT EDIT",
+        "*/",
+
+        "#include \"sraschema-priv.h\"",
+        "const char sra_schema_text[] = {"
+    };
+    static const char *postamble[] = {
+        "};",
+        "const size_t sra_schema_size =",
+    };
+    
+    memset(&st, 0, sizeof(st));
+    
+    st.fp = ctx->output_file ? fopen(ctx->output_file, "w") : stdout;
+    
+    if (st.fp == NULL)
+        return RC(rcSRA, rcSchema, rcFormatting, rcFile, rcNotOpen);
+
+    for ( i = 0; i != sizeof(preamble) / sizeof(preamble[0]); ++i)
+        fprintf(st.fp, "%s\n", preamble[i]);
+    
+    rc = VSchemaDump( my_schema, sdmCompact, NULL, my_flush, &st );
+    if (rc == 0) {
+        if (st.line_pos != 0)
+            schema_dumper_state_write_line(&st);
+        fprintf(st.fp, "%s\n", postamble[0]);
+        fprintf(st.fp, "%s %u;\n", postamble[1], st.out_size);
+    }
+    if (st.fp != stdout)
+        fclose(st.fp);
+    return rc;
+}
+
+static rc_t DumpSchema( const context *ctx )
+{
+    KDirectory *my_dir;
+    rc_t rc = KDirectoryNativeDir ( &my_dir );
+    display_rescode( rc, "failed to open native dir", NULL );
+    if ( rc == 0 )
+    {
+        const VDBManager *my_manager;
+        rc = VDBManagerMakeRead ( &my_manager, my_dir );
+        display_rescode( rc, "failed to make manager", NULL );
+        if ( rc == 0 )
+        {
+            VSchema *my_schema;
+            rc = VDBManagerMakeSchema( my_manager, &my_schema );
+            display_rescode( rc, "failed to make schema", NULL );
+            if ( rc == 0 )
+            {
+                rc = for_each_v_name( ctx->include_files, my_schema, add_include );
+                if ( rc == 0 )
+                {
+                    rc = for_each_v_name( ctx->src_files, my_schema, add_source );
+                    if ( rc == 0 )
+                    {
+                        rc = DumpSchema_to( my_schema, ctx );
+                        if ( rc == 0 )
+                            rc = WriteDependency( my_schema, ctx );
+                    }
+                }
+                VSchemaRelease( my_schema );
+            }
+            VDBManagerRelease( my_manager );
+        }
+        KDirectoryRelease( my_dir );
+    }
+    return rc;
+}
+
+/****************************************************************************************
+ ***************************************************************************************/
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args * my_args;
+    rc_t rc;
+
+    rc = ArgsMakeAndHandle (&my_args, argc, argv, 1, 
+                            Options, sizeof (Options) / sizeof (OptDef));
+    if (rc == 0)
+    {
+        context *ctx;
+
+        context_init( &ctx );
+
+        rc = capture_arguments_and_options( my_args, ctx );
+        if ( rc == 0 )
+        {
+            if ( namelistcount( ctx->src_files ) > 0 )
+            {
+                rc = DumpSchema( ctx );
+            }
+            else
+            {
+                MiniUsage (my_args);
+            }
+        }
+        context_destroy( ctx );
+
+        ArgsWhack( my_args );
+    }
+    return rc;
+}
diff --git a/libs/sra/sra-priv.h b/libs/sra/sra-priv.h
new file mode 100644
index 0000000..c5798c5
--- /dev/null
+++ b/libs/sra/sra-priv.h
@@ -0,0 +1,183 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_priv_
+#define _h_sra_priv_
+
+#ifndef _h_sra_sradb_
+#include <sra/sradb.h>
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef KONST
+#define KONST const
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KMetadata;
+struct VDBManager;
+struct VSchema;
+struct VTable;
+struct VCursor;
+struct VTypedecl;
+struct VTypedef;
+struct VResolver;
+struct SRACache;
+
+#define CSRA_EXT(lite) (lite ? ".lite.sra" : ".sra")
+#define SRA_EXT(lite) (lite ? ".lite.sra" : ".sra")
+
+/*--------------------------------------------------------------------------
+ * SRAMgr
+ */
+struct SRAMgr
+{
+    struct VDBManager KONST *vmgr;
+    struct VSchema const *schema;
+#if OLD_SRAPATH_MGR
+    struct SRAPath volatile *_pmgr;
+#else
+    struct VResolver volatile *_pmgr;
+#endif
+    struct SRACache* cache;
+    KRefcount refcount;
+    KCreateMode mode;
+    bool read_only;
+};
+
+/* SRAMgrMake
+ */
+rc_t SRAMgrMake ( SRAMgr **mgr,
+    struct VDBManager const *vmgr, struct KDirectory const *wd );
+
+/* Attach
+ * Sever
+ */
+SRAMgr *SRAMgrAttach ( const SRAMgr *self );
+rc_t SRAMgrSever ( const SRAMgr *self );
+
+
+/* AccessSRAPath
+ *  returns a new reference to SRAPath
+ *  do NOT access "pmgr" directly
+ */
+struct SRAPath *SRAMgrAccessSRAPath ( const SRAMgr *self );
+
+/*--------------------------------------------------------------------------
+ * SRATable
+ */
+struct SRATable
+{
+    KONST SRAMgr *mgr;
+    struct VTable KONST *vtbl;
+    struct VCursor KONST *curs;
+    struct KMetadata KONST *meta;
+
+    Vector wcol;
+
+    KRefcount refcount;
+
+    uint32_t metavers;
+
+    KCreateMode mode;
+    bool curs_open;
+    bool read_only;
+
+    uint64_t spot_count;
+    uint64_t base_count;
+    int64_t min_spot_id;
+    int64_t max_spot_id;
+};
+
+/* Whack
+ * Destroy
+ */
+rc_t SRATableWhack ( SRATable *self );
+void SRATableDestroy ( SRATable *self );
+
+/* Attach
+ * Sever
+ */
+SRATable *SRATableAttach ( const SRATable *self );
+rc_t SRATableSever ( const SRATable *self );
+
+/* SRATableRead
+ */
+rc_t SRATableRead ( const SRATable *self, spotid_t id,
+    uint32_t cid, const void **base, bitsz_t *offset, bitsz_t *size );
+
+/* SRATableColDatatype
+ */
+rc_t SRATableColDatatype ( const SRATable *self, uint32_t idx,
+    struct VTypedecl *type, struct VTypedef *def );
+
+/* SRATableGetIdRange
+ */
+rc_t SRATableGetIdRange ( const SRATable *self, uint32_t idx,
+    spotid_t id, spotid_t *pfirst, spotid_t *last );
+
+rc_t ResolveTablePath ( const SRAMgr *mgr, char *path, size_t psize, const char *spec, va_list args );
+
+rc_t SRATableFillOut ( SRATable *self, bool update );
+    
+/*--------------------------------------------------------------------------
+ * SRAColumn
+ */
+struct SRAColumn
+{
+    const SRATable *tbl;
+    KRefcount refcount;
+    uint32_t idx;
+    uint32_t elem_bits;
+    bool read_only;
+};
+
+
+/* Whackity whack
+ */
+rc_t SRAColumnWhack ( SRAColumn *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _sra_priv_ */
diff --git a/libs/sra/sra-schema.c b/libs/sra/sra-schema.c
new file mode 100644
index 0000000..53531ae
--- /dev/null
+++ b/libs/sra/sra-schema.c
@@ -0,0 +1,4133 @@
+/*===========================================================================
+*
+*                             PUBLIC DOMAIN NOTICE
+*                National Center for Biotechnology Information
+*
+*   This software/database is a "United States Government Work" under the
+*   terms of the United States Copyright Act.  It was written as part of
+*   the author's official duties as a United States Government employee and
+*   thus cannot be copyrighted.  This software/database is freely available
+*   to the public for use. The National Library of Medicine and the U.S.
+*   Government have not placed any restriction on its use or reproduction.
+*
+*   Although all reasonable efforts have been taken to ensure the accuracy
+*   and reliability of the software and data, the NLM and the U.S.
+*   Government do not and cannot warrant the performance or results that
+*   may be obtained by using this software or data. The NLM and the U.S.
+*   Government disclaim all warranties, express or implied, including
+*   warranties of performance, merchantability or fitness for any particular
+*   purpose.
+*
+*   Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+* THIS IS AN AUTO-GENERATED FILE - DO NOT EDIT
+*/
+#include "sraschema-priv.h"
+const char sra_schema_text[] = {
+ 'v', 'e', 'r', 's', 'i', 'o', 'n', ' ', '1', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f',
+ ' ', 'I', '6', '4', ' ', 'v', 'd', 'b', ':', 'r', 'o', 'w', '_', 'i', 'd', '_', 'r',
+ 'a', 'n', 'g', 'e', '[', '2', ']', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'U',
+ '1', '6', ' ', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n', '[', '3', ']', ';',
+ 'a', 'l', 'i', 'a', 's', ' ', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't', '_', 'n', 'a', 'm',
+ 'e', '_', 't', 'o', 'k', 'e', 'n', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'a',
+ 's', 'c', 'i', 'i', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e',
+ 'x', 't', ';', 'a', 'l', 'i', 'a', 's', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n',
+ 'a', ':', 't', 'e', 'x', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'f', 'a', 's', 't',
+ 'a', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'U', '8', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f',
+ ' ', 'B', '1', ' ', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'p', 'a', 'c',
+ 'k', 'e', 'd', '[', '4', ']', ';', 'a', 'l', 'i', 'a', 's', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', '4', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', 'd', 'n', 'a', ':', '4', 'n', 'a', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f',
+ ' ', 'U', '8', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'b', 'i', 'n',
+ ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'U', '8', ' ', 'I', 'N', 'S', 'D', 'C',
+ ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f',
+ ' ', 'B', '1', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c',
+ 'k', 'e', 'd', '[', '2', ']', ';', 'a', 'l', 'i', 'a', 's', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', 'd', 'n', 'a', ':', '2', 'n', 'a', ';', 'a', 'l', 'i', 'a', 's', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'N',
+ 'C', 'B', 'I', ':', '2', 'n', 'a', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'a',
+ 's', 'c', 'i', 'i', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'l', 'o', 'r', ':',
+ 't', 'e', 'x', 't', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'U', '8', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'b', 'i', 'n', ';', 't', 'y', 'p', 'e',
+ 'd', 'e', 'f', ' ', 'U', '8', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's',
+ ':', 'b', 'i', 'n', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'B', '1', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'p', 'a', 'c', 'k', 'e', 'd', '[', '2',
+ ']', ';', 'a', 'l', 'i', 'a', 's', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'c', 's',
+ ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'l',
+ 'o', 'r', ':', '2', 'c', 's', ';', 'a', 'l', 'i', 'a', 's', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', '2', 'c', 's', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'N', 'C', 'B', 'I',
+ ':', '2', 'c', 's', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'a', 's', 'c', 'i',
+ 'i', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'r', 'o', 't', 'e', 'i', 'n', ':', 't',
+ 'e', 'x', 't', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'U', '8', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', 'a', 'a', ':', 'b', 'i', 'n', ';', 't', 'y', 'p', 'e', 'd', 'e',
+ 'f', ' ', 'U', '8', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't',
+ 'y', ':', 'p', 'h', 'r', 'e', 'd', ';', 'a', 'l', 'i', 'a', 's', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd', ' ',
+ 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', '1', ';', 't', 'y', 'p', 'e', 'd', 'e',
+ 'f', ' ', 'I', '8', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't',
+ 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ';', 't', 'y', 'p', 'e', 'd', 'e',
+ 'f', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a',
+ 'l', 'i', 't', 'y', ':', 't', 'e', 'x', 't', ':', 'p', 'h', 'r', 'e', 'd', '_', '3',
+ '3', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 't', 'e', 'x', 't',
+ ':', 'p', 'h', 'r', 'e', 'd', '_', '6', '4', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f',
+ ' ', 'a', 's', 'c', 'i', 'i', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l',
+ 'i', 't', 'y', ':', 't', 'e', 'x', 't', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's',
+ '_', '6', '4', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'I', '3', '2', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ';', 't', 'y',
+ 'p', 'e', 'd', 'e', 'f', ' ', 'U', '3', '2', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ';', 't',
+ 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'v', 'a', 'l', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'o', 'n', 'e', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'z', 'e', 'r', 'o', ';', 't',
+ 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'o', 'n', 'e', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't',
+ 'i', 'o', 'n', ':', 'o', 'n', 'e', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'U',
+ '8', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_',
+ 'f', 'i', 'l', 't', 'e', 'r', ';', 'a', 'l', 'i', 'a', 's', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r',
+ ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i',
+ 'l', 't', 'e', 'r', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'U', '8', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'x', 'r', 'e', 'a', 'd', '_', 't', 'y',
+ 'p', 'e', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'I', 'N', 'S', 'D', 'C', ':',
+ 'S', 'R', 'A', ':', 'x', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e',
+ ';', 'a', 'l', 'i', 'a', 's', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':',
+ 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ';', 't', 'y', 'p', 'e', 'd',
+ 'e', 'f', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':',
+ 'p', 'h', 'r', 'e', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', 'i', 't',
+ 'y', ':', 'n', '_', 'e', 'n', 'c', 'o', 'd', 'e', 'd', ':', 'p', 'h', 'r', 'e', 'd',
+ ';', 'a', 'l', 'i', 'a', 's', ' ', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', 'i',
+ 't', 'y', ':', 'n', '_', 'e', 'n', 'c', 'o', 'd', 'e', 'd', ':', 'p', 'h', 'r', 'e',
+ 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'n', 'c', '_', 'q', 'u',
+ 'a', 'l', '1', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'I', 'N', 'S', 'D', 'C',
+ ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's',
+ ' ', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'n', '_', 'e',
+ 'n', 'c', 'o', 'd', 'e', 'd', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ';', 't',
+ 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'I', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'i',
+ 's', 'a', 'm', 'p', '1', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'F', '3', '2',
+ ' ', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ';', 't', 'y', 'p', 'e',
+ 'd', 'e', 'f', ' ', 'F', '3', '2', ' ', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm',
+ 'p', '4', '[', '4', ']', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'B', '8', ' ',
+ 'N', 'C', 'B', 'I', ':', 'a', 's', 'n', ':', 'b', 'i', 'n', 'a', 'r', 'y', ';', 't',
+ 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'N', 'C', 'B', 'I',
+ ':', 'a', 's', 'n', ':', 't', 'e', 'x', 't', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f',
+ ' ', 'U', '6', '4', ' ', 'N', 'C', 'B', 'I', ':', 'g', 'i', ';', 't', 'y', 'p', 'e',
+ 'd', 'e', 'f', ' ', 'U', '3', '2', ' ', 'N', 'C', 'B', 'I', ':', 't', 'a', 'x', 'i',
+ 'd', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'U', '3', '2', ' ', 'N', 'C', 'B',
+ 'I', ':', 'g', 'b', '_', 's', 't', 'a', 't', 'e', ';', 't', 'y', 'p', 'e', 'd', 'e',
+ 'f', ' ', 'U', '3', '2', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's',
+ 'p', 'o', 't', 'i', 'd', '_', 't', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'U',
+ '6', '4', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't',
+ '_', 'i', 'd', 's', '_', 'f', 'o', 'u', 'n', 'd', '[', '4', ']', ';', 't', 'y', 'p',
+ 'e', 'd', 'e', 'f', ' ', 'U', '8', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A',
+ ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ';', 'a', 'l', 'i', 'a',
+ 's', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f',
+ 'o', 'r', 'm', '_', 'i', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'p',
+ 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ';', 't', 'y', 'p', 'e', 'd', 'e',
+ 'f', ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'S', 'e',
+ 'g', 'm', 'e', 'n', 't', '[', '2', ']', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ',
+ 'B', '8', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'S', 'p', 'o', 't', 'D',
+ 'e', 's', 'c', '[', '1', '6', ']', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'B',
+ '8', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'R', 'e', 'a', 'd', 'D', 'e',
+ 's', 'c', '[', '8', '0', ']', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'N', 'C',
+ 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'r', 'o', 't', 'a', 't', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', ';',
+ 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm',
+ 'p', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p',
+ 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f',
+ ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'p', 'o', 's',
+ '1', '6', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'I', 'N', 'S', 'D', 'C', ':',
+ 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ' ',
+ 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', '4', '[', '4', ']', ';', 't', 'y', 'p',
+ 'e', 'd', 'e', 'f', ' ', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', '4', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'o', 't', 'a', 't', 'e', 'd', '_', 'q',
+ 'u', 'a', 'l', '4', ';', 't', 'y', 'p', 'e', 'd', 'e', 'f', ' ', 'N', 'C', 'B', 'I',
+ ':', 'q', 'u', 'a', 'l', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's',
+ 'w', 'a', 'p', 'p', 'e', 'd', '_', 'q', 'u', 'a', 'l', '4', ';', 't', 'y', 'p', 'e',
+ 'd', 'e', 'f', ' ', 'B', '8', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e',
+ 'n', 'c', 'o', 'd', 'e', 'd', '_', 'q', 'u', 'a', 'l', '4', ';', 'a', 'l', 'i', 'a',
+ 's', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'n', 'c', 'o', 'd', 'e',
+ 'd', '_', 'q', 'u', 'a', 'l', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'c', 'o', 'm', 'p', '_', 'q', 'u', 'a', 'l', '4', ';', 't', 'y', 'p', 'e', 's', 'e',
+ 't', ' ', 'i', 'n', 't', 'e', 'g', 'e', 'r', '_', 's', 'e', 't', '{', 'U', '8', ',',
+ 'U', '1', '6', ',', 'U', '3', '2', ',', 'U', '6', '4', ',', 'I', '8', ',', 'I', '1',
+ '6', ',', 'I', '3', '2', ',', 'I', '6', '4', '}', ';', 't', 'y', 'p', 'e', 's', 'e',
+ 't', ' ', 'f', 'l', 'o', 'a', 't', '_', 's', 'e', 't', '{', 'F', '3', '2', ',', 'F',
+ '6', '4', '}', ';', 't', 'y', 'p', 'e', 's', 'e', 't', ' ', 'n', 'u', 'm', 'e', 'r',
+ 'i', 'c', '_', 's', 'e', 't', '{', 'U', '8', ',', 'U', '1', '6', ',', 'U', '3', '2',
+ ',', 'U', '6', '4', ',', 'I', '8', ',', 'I', '1', '6', ',', 'I', '3', '2', ',', 'I',
+ '6', '4', ',', 'F', '3', '2', ',', 'F', '6', '4', '}', ';', 't', 'y', 'p', 'e', 's',
+ 'e', 't', ' ', 't', 'e', 'x', 't', '_', 's', 'e', 't', '{', 'u', 't', 'f', '8', ',',
+ 'u', 't', 'f', '1', '6', ',', 'u', 't', 'f', '3', '2', ',', 'a', 's', 'c', 'i', 'i',
+ '}', ';', 't', 'y', 'p', 'e', 's', 'e', 't', ' ', 't', 'e', 'x', 't', '8', '_', 's',
+ 'e', 't', '{', 'u', 't', 'f', '8', ',', 'a', 's', 'c', 'i', 'i', '}', ';', 't', 'y',
+ 'p', 'e', 's', 'e', 't', ' ', 't', 'r', 'a', 'n', 's', 'p', 'o', 's', 'e', '_', 's',
+ 'e', 't', '{', 'B', '8', ',', 'B', '1', '6', ',', 'B', '3', '2', ',', 'B', '6', '4',
+ '}', ';', 't', 'y', 'p', 'e', 's', 'e', 't', ' ', 'p', 'a', 'c', 'k', '_', 's', 'e',
+ 't', '{', 'B', '8', ',', 'B', '1', '6', ',', 'B', '3', '2', ',', 'B', '6', '4', ',',
+ 'U', '8', ',', 'U', '1', '6', ',', 'U', '3', '2', ',', 'U', '6', '4', ',', 'I', '8',
+ ',', 'I', '1', '6', ',', 'I', '3', '2', ',', 'I', '6', '4', '}', ';', 't', 'y', 'p',
+ 'e', 's', 'e', 't', ' ', 'i', 'z', 'i', 'p', '_', 's', 'e', 't', '{', 'U', '8', ',',
+ 'U', '1', '6', ',', 'U', '3', '2', ',', 'U', '6', '4', ',', 'I', '8', ',', 'I', '1',
+ '6', ',', 'I', '3', '2', ',', 'I', '6', '4', '}', ';', 't', 'y', 'p', 'e', 's', 'e',
+ 't', ' ', 'f', 'z', 'i', 'p', '_', 's', 'e', 't', '{', 'F', '3', '2', '}', ';', 't',
+ 'y', 'p', 'e', 's', 'e', 't', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's',
+ 't', 'a', 't', 's', ':', 'q', 'u', 'a', 'l', '_', 't', 'y', 'p', 'e', '{', 'I', 'N',
+ 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd',
+ ',', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o',
+ 'g', '_', 'o', 'd', 'd', 's', ',', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l',
+ 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '[', '4', ']', '}', ';',
+ 't', 'y', 'p', 'e', 's', 'e', 't', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ '_', '4', '5', '4', '_', ':', 'd', 'r', 'd', 'p', 'a', 'r', 'a', 'm', '_', 's', 'e',
+ 't', '{', 'U', '8', ',', 'a', 's', 'c', 'i', 'i', ',', 'I', 'N', 'S', 'D', 'C', ':',
+ '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', '}', ';', 'f', 'm', 't', 'd', 'e',
+ 'f', ' ', 'm', 'e', 'r', 'g', 'e', 'd', '_', 'f', 'm', 't', ';', 'f', 'm', 't', 'd',
+ 'e', 'f', ' ', 't', 'r', 'a', 'n', 's', 'p', 'o', 's', 'e', 'd', '_', 'f', 'm', 't',
+ ';', 'f', 'm', 't', 'd', 'e', 'f', ' ', 'd', 'e', 'l', 't', 'a', '_', 'a', 'v', 'e',
+ 'r', 'a', 'g', 'e', 'd', '_', 'f', 'm', 't', ';', 'f', 'm', 't', 'd', 'e', 'f', ' ',
+ 'i', 'z', 'i', 'p', '_', 'f', 'm', 't', ';', 'f', 'm', 't', 'd', 'e', 'f', ' ', 'f',
+ 'z', 'i', 'p', '_', 'f', 'm', 't', ';', 'f', 'm', 't', 'd', 'e', 'f', ' ', 'r', 'l',
+ 'e', '_', 'f', 'm', 't', ';', 'f', 'm', 't', 'd', 'e', 'f', ' ', 'z', 'l', 'i', 'b',
+ '_', 'f', 'm', 't', ';', 'f', 'm', 't', 'd', 'e', 'f', ' ', 'b', 'z', 'i', 'p', '2',
+ '_', 'f', 'm', 't', ';', 'f', 'm', 't', 'd', 'e', 'f', ' ', 'm', 'e', 'r', 'g', 'e',
+ 'd', '_', 't', ';', 'f', 'm', 't', 'd', 'e', 'f', ' ', 'f', 'p', '_', 'e', 'n', 'c',
+ 'o', 'd', 'e', 'd', '_', 't', ';', 'f', 'm', 't', 'd', 'e', 'f', ' ', 'r', 'l', '_',
+ 'e', 'n', 'c', 'o', 'd', 'e', 'd', '_', 't', ';', 'f', 'm', 't', 'd', 'e', 'f', ' ',
+ 'N', 'C', 'B', 'I', ':', 'z', 'l', 'i', 'b', '_', 'e', 'n', 'c', 'o', 'd', 'e', 'd',
+ '_', 't', ';', 'f', 'm', 't', 'd', 'e', 'f', ' ', 'N', 'C', 'B', 'I', ':', 'f', 'p',
+ '_', 'e', 'n', 'c', 'o', 'd', 'e', 'd', '_', 't', ';', 'c', 'o', 'n', 's', 't', ' ',
+ 'U', '8', ' ', 'A', 'L', 'I', 'G', 'N', '_', 'L', 'E', 'F', 'T', '=', '0', ';', 'c',
+ 'o', 'n', 's', 't', ' ', 'U', '8', ' ', 'A', 'L', 'I', 'G', 'N', '_', 'R', 'I', 'G',
+ 'H', 'T', '=', '1', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '8', ' ', 'C', 'A', 'S',
+ 'E', '_', 'S', 'E', 'N', 'S', 'I', 'T', 'I', 'V', 'E', '=', '0', ';', 'c', 'o', 'n',
+ 's', 't', ' ', 'U', '8', ' ', 'C', 'A', 'S', 'E', '_', 'I', 'N', 'S', 'E', 'N', 'S',
+ 'I', 'T', 'I', 'V', 'E', '_', 'L', 'O', 'W', 'E', 'R', '=', '1', ';', 'c', 'o', 'n',
+ 's', 't', ' ', 'U', '8', ' ', 'C', 'A', 'S', 'E', '_', 'I', 'N', 'S', 'E', 'N', 'S',
+ 'I', 'T', 'I', 'V', 'E', '_', 'U', 'P', 'P', 'E', 'R', '=', '2', ';', 'c', 'o', 'n',
+ 's', 't', ' ', 'I', '3', '2', ' ', 'Z', '_', 'F', 'I', 'L', 'T', 'E', 'R', 'E', 'D',
+ '=', '1', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', '3', '2', ' ', 'Z', '_', 'H', 'U',
+ 'F', 'F', 'M', 'A', 'N', '_', 'O', 'N', 'L', 'Y', '=', '2', ';', 'c', 'o', 'n', 's',
+ 't', ' ', 'I', '3', '2', ' ', 'Z', '_', 'R', 'L', 'E', '=', '3', ';', 'c', 'o', 'n',
+ 's', 't', ' ', 'I', '3', '2', ' ', 'Z', '_', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '_',
+ 'S', 'T', 'R', 'A', 'T', 'E', 'G', 'Y', '=', '0', ';', 'c', 'o', 'n', 's', 't', ' ',
+ 'I', '3', '2', ' ', 'Z', '_', 'N', 'O', '_', 'C', 'O', 'M', 'P', 'R', 'E', 'S', 'S',
+ 'I', 'O', 'N', '=', '0', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', '3', '2', ' ', 'Z',
+ '_', 'B', 'E', 'S', 'T', '_', 'S', 'P', 'E', 'E', 'D', '=', '1', ';', 'c', 'o', 'n',
+ 's', 't', ' ', 'I', '3', '2', ' ', 'Z', '_', 'B', 'E', 'S', 'T', '_', 'C', 'O', 'M',
+ 'P', 'R', 'E', 'S', 'S', 'I', 'O', 'N', '=', '9', ';', 'c', 'o', 'n', 's', 't', ' ',
+ 'I', '3', '2', ' ', 'Z', '_', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '_', 'C', 'O', 'M',
+ 'P', 'R', 'E', 'S', 'S', 'I', 'O', 'N', '=', '-', '1', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'm', 'a', 'p', ':', 'B', 'I', 'N', 'S', 'E',
+ 'T', '=', '[', '0', ',', '1', ',', '2', ',', '3', ',', '4', ',', '5', ',', '6', ',',
+ '7', ',', '8', ',', '9', ',', '1', '0', ',', '1', '1', ',', '1', '2', ',', '1', '3',
+ ',', '1', '4', ',', '1', '5', ']', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'I', 'N', 'S', 'D', 'C',
+ ':', '4', 'n', 'a', ':', 'm', 'a', 'p', ':', 'C', 'H', 'A', 'R', 'S', 'E', 'T', '=',
+ '\'', '.', 'A', 'C', 'M', 'G', 'R', 'S', 'V', 'T', 'W', 'Y', 'H', 'K', 'D', 'B',
+ 'N', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd',
+ 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a',
+ ':', 'a', 'c', 'c', 'e', 'p', 't', ':', 'C', 'H', 'A', 'R', 'S', 'E', 'T', '=', '\'',
+ '.', 'A', 'C', 'M', 'G', 'R', 'S', 'V', 'T', 'W', 'Y', 'H', 'K', 'D', 'B', 'N', 'a',
+ 'c', 'm', 'g', 'r', 's', 'v', 't', 'w', 'y', 'h', 'k', 'd', 'b', 'n', '\'', ';',
+ 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'b',
+ 'i', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'm', 'a', 'p', ':',
+ 'B', 'I', 'N', 'S', 'E', 'T', '=', '[', '0', ',', '1', ',', '2', ',', '3', ']', ';',
+ 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't',
+ 'e', 'x', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'm', 'a', 'p',
+ ':', 'C', 'H', 'A', 'R', 'S', 'E', 'T', '=', '\'', 'A', 'C', 'G', 'T', '\'', ';',
+ 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't',
+ 'e', 'x', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'a', 'c', 'c',
+ 'e', 'p', 't', ':', 'C', 'H', 'A', 'R', 'S', 'E', 'T', '=', '\'', 'A', 'C', 'G',
+ 'T', 'a', 'c', 'g', 't', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', ' ', 'I', 'N', 'S', 'D', 'C',
+ ':', 'x', '2', 'n', 'a', ':', 'm', 'a', 'p', ':', 'B', 'I', 'N', 'S', 'E', 'T', '=',
+ '[', '0', ',', '1', ',', '2', ',', '3', ',', '4', ']', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'm', 'a', 'p', ':', 'C', 'H', 'A',
+ 'R', 'S', 'E', 'T', '=', '\'', 'A', 'C', 'G', 'T', 'N', '\'', ';', 'c', 'o', 'n',
+ 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'a', 'c', 'c', 'e', 'p',
+ 't', ':', 'C', 'H', 'A', 'R', 'S', 'E', 'T', '=', '\'', 'A', 'C', 'G', 'T', 'N',
+ 'a', 'c', 'g', 't', 'n', '.', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'b', 'i', 'n', ' ', 'I', 'N', 'S', 'D', 'C',
+ ':', '2', 'c', 's', ':', 'm', 'a', 'p', ':', 'B', 'I', 'N', 'S', 'E', 'T', '=', '[',
+ '0', ',', '1', ',', '2', ',', '3', ']', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'l', 'o', 'r', ':', 't', 'e', 'x', 't', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'm', 'a', 'p', ':', 'C', 'H', 'A', 'R', 'S',
+ 'E', 'T', '=', '\'', '0', '1', '2', '3', '\'', ';', 'c', 'o', 'n', 's', 't', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'l', 'o', 'r', ':', 't', 'e', 'x', 't', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'a', 'c', 'c', 'e', 'p', 't', ':',
+ 'C', 'H', 'A', 'R', 'S', 'E', 'T', '=', '\'', '0', '1', '2', '3', '\'', ';', 'c',
+ 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'b',
+ 'i', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'm', 'a', 'p',
+ ':', 'B', 'I', 'N', 'S', 'E', 'T', '=', '[', '0', ',', '1', ',', '2', ',', '3', ',',
+ '4', ']', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'l', 'o', 'r', ':', 't', 'e', 'x', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2',
+ 'c', 's', ':', 'm', 'a', 'p', ':', 'C', 'H', 'A', 'R', 'S', 'E', 'T', '=', '\'',
+ '0', '1', '2', '3', '.', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'c', 'o', 'l', 'o', 'r', ':', 't', 'e', 'x', 't', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'a', 'c', 'c', 'e', 'p', 't', ':', 'C', 'H',
+ 'A', 'R', 'S', 'E', 'T', '=', '\'', '0', '1', '2', '3', '.', '\'', ';', 'c', 'o',
+ 'n', 's', 't', ' ', 'U', '8', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'l', 'o',
+ 'r', ':', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'm', 'a', 't', 'r', 'i', 'x', '=',
+ '[', '0', ',', '1', ',', '2', ',', '3', ',', '4', ',', '1', ',', '0', ',', '3', ',',
+ '2', ',', '4', ',', '2', ',', '3', ',', '0', ',', '1', ',', '4', ',', '3', ',', '2',
+ ',', '1', ',', '0', ',', '4', ',', '4', ',', '4', ',', '4', ',', '4', ',', '4', ']',
+ ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'a', 'a', ':', 'b',
+ 'i', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'a', 'a', ':', 'm', 'a', 'p', ':', 'B',
+ 'I', 'N', 'S', 'E', 'T', '=', '[', '1', ',', '2', ',', '3', ',', '4', ',', '5', ',',
+ '6', ',', '7', ',', '8', ',', '9', ',', '1', '0', ',', '1', '1', ',', '1', '2', ',',
+ '1', '3', ',', '1', '4', ',', '1', '5', ',', '1', '6', ',', '1', '7', ',', '1', '8',
+ ',', '1', '9', ',', '2', '0', ',', '2', '1', ',', '2', '2', ',', '2', '3', ',', '2',
+ '4', ',', '2', '5', ',', '2', '6', ',', '2', '7', ']', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'r', 'o', 't', 'e', 'i', 'n', ':', 't', 'e',
+ 'x', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'a', 'a', ':', 'm', 'a', 'p', ':', 'C',
+ 'H', 'A', 'R', 'S', 'E', 'T', '=', '\'', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z', 'U', '*',
+ 'O', 'J', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':',
+ 'p', 'r', 'o', 't', 'e', 'i', 'n', ':', 't', 'e', 'x', 't', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', 'a', 'a', ':', 'a', 'c', 'c', 'e', 'p', 't', ':', 'C', 'H', 'A', 'R', 'S',
+ 'E', 'T', '=', '\'', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
+ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z', 'U', '*', 'a', 'b',
+ 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
+ 't', 'v', 'w', 'x', 'y', 'z', 'u', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'm', 'i', 'n', ':', 'o', 'n', 'e',
+ '=', '2', '1', '4', '7', '4', '8', '3', '6', '4', '9', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'm', 'a', 'x', ':', 'o',
+ 'n', 'e', '=', '1', '0', '7', '3', '7', '4', '1', '8', '2', '3', ';', 'c', 'o', 'n',
+ 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e',
+ 'r', 'o', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'm', 'i',
+ 'n', ':', 'z', 'e', 'r', 'o', '=', '2', '1', '4', '7', '4', '8', '3', '6', '4', '8',
+ ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'z', 'e', 'r', 'o', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'm', 'a', 'x', ':', 'z', 'e', 'r', 'o', '=', '1', '0', '7', '3', '7', '4',
+ '1', '8', '2', '2', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':',
+ 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', ' ', 'S',
+ 'R', 'A', '_', 'R', 'E', 'A', 'D', '_', 'F', 'I', 'L', 'T', 'E', 'R', '_', 'P', 'A',
+ 'S', 'S', '=', '0', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':',
+ 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', ' ', 'S',
+ 'R', 'A', '_', 'R', 'E', 'A', 'D', '_', 'F', 'I', 'L', 'T', 'E', 'R', '_', 'R', 'E',
+ 'J', 'E', 'C', 'T', '=', '1', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r',
+ ' ', 'S', 'R', 'A', '_', 'R', 'E', 'A', 'D', '_', 'F', 'I', 'L', 'T', 'E', 'R', '_',
+ 'C', 'R', 'I', 'T', 'E', 'R', 'I', 'A', '=', '2', ';', 'c', 'o', 'n', 's', 't', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i',
+ 'l', 't', 'e', 'r', ' ', 'S', 'R', 'A', '_', 'R', 'E', 'A', 'D', '_', 'F', 'I', 'L',
+ 'T', 'E', 'R', '_', 'R', 'E', 'D', 'A', 'C', 'T', 'E', 'D', '=', '3', ';', 'c', 'o',
+ 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'x', 'r', 'e',
+ 'a', 'd', '_', 't', 'y', 'p', 'e', ' ', 'S', 'R', 'A', '_', 'R', 'E', 'A', 'D', '_',
+ 'T', 'Y', 'P', 'E', '_', 'T', 'E', 'C', 'H', 'N', 'I', 'C', 'A', 'L', '=', '0', ';',
+ 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'x',
+ 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ' ', 'S', 'R', 'A', '_', 'R', 'E', 'A',
+ 'D', '_', 'T', 'Y', 'P', 'E', '_', 'B', 'I', 'O', 'L', 'O', 'G', 'I', 'C', 'A', 'L',
+ '=', '1', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R',
+ 'A', ':', 'x', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ' ', 'S', 'R', 'A', '_',
+ 'R', 'E', 'A', 'D', '_', 'T', 'Y', 'P', 'E', '_', 'F', 'O', 'R', 'W', 'A', 'R', 'D',
+ '=', '2', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R',
+ 'A', ':', 'x', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ' ', 'S', 'R', 'A', '_',
+ 'R', 'E', 'A', 'D', '_', 'T', 'Y', 'P', 'E', '_', 'R', 'E', 'V', 'E', 'R', 'S', 'E',
+ '=', '4', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R',
+ 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'S', 'R', 'A',
+ '_', 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M', '_', 'U', 'N', 'D', 'E', 'F', 'I', 'N',
+ 'E', 'D', '=', '0', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':',
+ 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'S',
+ 'R', 'A', '_', 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M', '_', '4', '5', '4', '=', '1',
+ ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':',
+ 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'S', 'R', 'A', '_', 'P',
+ 'L', 'A', 'T', 'F', 'O', 'R', 'M', '_', 'I', 'L', 'L', 'U', 'M', 'I', 'N', 'A', '=',
+ '2', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A',
+ ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'S', 'R', 'A', '_',
+ 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M', '_', 'A', 'B', 'S', 'O', 'L', 'I', 'D', '=',
+ '3', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A',
+ ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'S', 'R', 'A', '_',
+ 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M', '_', 'C', 'O', 'M', 'P', 'L', 'E', 'T', 'E',
+ '_', 'G', 'E', 'N', 'O', 'M', 'I', 'C', 'S', '=', '4', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o',
+ 'r', 'm', '_', 'i', 'd', ' ', 'S', 'R', 'A', '_', 'P', 'L', 'A', 'T', 'F', 'O', 'R',
+ 'M', '_', 'H', 'E', 'L', 'I', 'C', 'O', 'S', '=', '5', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o',
+ 'r', 'm', '_', 'i', 'd', ' ', 'S', 'R', 'A', '_', 'P', 'L', 'A', 'T', 'F', 'O', 'R',
+ 'M', '_', 'P', 'A', 'C', 'B', 'I', 'O', '_', 'S', 'M', 'R', 'T', '=', '6', ';', 'c',
+ 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l',
+ 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'S', 'R', 'A', '_', 'P', 'L', 'A',
+ 'T', 'F', 'O', 'R', 'M', '_', 'I', 'O', 'N', '_', 'T', 'O', 'R', 'R', 'E', 'N', 'T',
+ '=', '7', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R',
+ 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'S', 'R', 'A',
+ '_', 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M', '_', 'C', 'A', 'P', 'I', 'L', 'L', 'A',
+ 'R', 'Y', '=', '8', ';', 'c', 'o', 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':',
+ 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'S',
+ 'R', 'A', '_', 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M', '_', 'O', 'X', 'F', 'O', 'R',
+ 'D', '_', 'N', 'A', 'N', 'O', 'P', 'O', 'R', 'E', '=', '9', ';', 'c', 'o', 'n', 's',
+ 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l',
+ 'o', 'g', '_', 'o', 'd', 'd', 's', ' ', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l',
+ 'i', 't', 'y', ':', 'f', 'r', 'o', 'm', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's',
+ '=', '[', '-', '6', ',', '-', '5', ',', '-', '4', ',', '-', '3', ',', '-', '2', ',',
+ '-', '1', ',', '0', ',', '1', ',', '2', ',', '3', ',', '4', ',', '5', ',', '6', ',',
+ '7', ',', '8', ',', '9', ',', '1', '0', ',', '1', '1', ',', '1', '2', ',', '1', '3',
+ ',', '1', '4', ',', '1', '5', ',', '1', '6', ',', '1', '7', ',', '1', '8', ',', '1',
+ '9', ',', '2', '0', ',', '2', '1', ',', '2', '2', ',', '2', '3', ',', '2', '4', ',',
+ '2', '5', ',', '2', '6', ',', '2', '7', ',', '2', '8', ',', '2', '9', ',', '3', '0',
+ ',', '3', '1', ',', '3', '2', ',', '3', '3', ',', '3', '4', ',', '3', '5', ',', '3',
+ '6', ',', '3', '7', ',', '3', '8', ',', '3', '9', ',', '4', '0', ']', ';', 'c', 'o',
+ 'n', 's', 't', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y',
+ ':', 'p', 'h', 'r', 'e', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', 'i',
+ 't', 'y', ':', 't', 'o', ':', 'p', 'h', 'r', 'e', 'd', '=', '[', '0', ',', '1', ',',
+ '1', ',', '2', ',', '2', ',', '3', ',', '3', ',', '4', ',', '4', ',', '5', ',', '5',
+ ',', '6', ',', '7', ',', '8', ',', '9', ',', '1', '0', ',', '1', '0', ',', '1', '1',
+ ',', '1', '2', ',', '1', '3', ',', '1', '4', ',', '1', '5', ',', '1', '6', ',', '1',
+ '7', ',', '1', '8', ',', '1', '9', ',', '2', '0', ',', '2', '1', ',', '2', '2', ',',
+ '2', '3', ',', '2', '4', ',', '2', '5', ',', '2', '6', ',', '2', '7', ',', '2', '8',
+ ',', '2', '9', ',', '3', '0', ',', '3', '1', ',', '3', '2', ',', '3', '3', ',', '3',
+ '4', ',', '3', '5', ',', '3', '6', ',', '3', '7', ',', '3', '8', ',', '3', '9', ',',
+ '4', '0', ']', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', 'e', 'n', ':',
+ 'u', 'n', 'r', 'e', 'c', 'o', 'g', 'n', 'i', 'z', 'e', 'd', '=', '1', ';', 'c', 'o',
+ 'n', 's', 't', ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', 'e', 'n', ':', 'r', 'e', 'c', 'o', 'g', 'n',
+ 'i', 'z', 'e', 'd', '=', '2', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k',
+ 'e', 'n', ':', 'Q', '=', '3', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k',
+ 'e', 'n', ':', 'X', '=', '4', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k',
+ 'e', 'n', ':', 'Y', '=', '5', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k',
+ 'e', 'n', ':', 'T', '=', '6', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k',
+ 'e', 'n', ':', 'L', '=', '7', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k',
+ 'e', 'n', ':', 's', 'i', 'g', 'n', 'e', 'd', ':', 'X', '=', '8', ';', 'c', 'o', 'n',
+ 's', 't', ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n',
+ 'a', 'm', 'e', '_', 't', 'o', 'k', 'e', 'n', ':', 's', 'i', 'g', 'n', 'e', 'd', ':',
+ 'Y', '=', '9', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', 'e', 'n', ':',
+ 's', 'i', 'g', 'n', 'e', 'd', ':', 'T', '=', '1', '0', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm',
+ 'e', '_', 't', 'o', 'k', 'e', 'n', ':', 's', 'i', 'g', 'n', 'e', 'd', ':', 'L', '=',
+ '1', '1', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', 'e', 'n', ':', 'o',
+ 'c', 't', 'a', 'l', ':', 'X', '=', '1', '2', ';', 'c', 'o', 'n', 's', 't', ' ', 'U',
+ '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_',
+ 't', 'o', 'k', 'e', 'n', ':', 'o', 'c', 't', 'a', 'l', ':', 'Y', '=', '1', '3', ';',
+ 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', 'e', 'n', ':', 'o', 'c', 't', 'a',
+ 'l', ':', 'T', '=', '1', '4', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k',
+ 'e', 'n', ':', 'o', 'c', 't', 'a', 'l', ':', 'L', '=', '1', '5', ';', 'c', 'o', 'n',
+ 's', 't', ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n',
+ 'a', 'm', 'e', '_', 't', 'o', 'k', 'e', 'n', ':', 'h', 'e', 'x', ':', 'u', 'p', 'p',
+ 'e', 'r', ':', 'X', '=', '1', '6', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6',
+ ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o',
+ 'k', 'e', 'n', ':', 'h', 'e', 'x', ':', 'u', 'p', 'p', 'e', 'r', ':', 'Y', '=', '1',
+ '7', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', 'e', 'n', ':', 'h', 'e',
+ 'x', ':', 'u', 'p', 'p', 'e', 'r', ':', 'T', '=', '1', '8', ';', 'c', 'o', 'n', 's',
+ 't', ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a',
+ 'm', 'e', '_', 't', 'o', 'k', 'e', 'n', ':', 'h', 'e', 'x', ':', 'u', 'p', 'p', 'e',
+ 'r', ':', 'L', '=', '1', '9', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k',
+ 'e', 'n', ':', 'h', 'e', 'x', ':', 'l', 'o', 'w', 'e', 'r', ':', 'X', '=', '2', '0',
+ ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', 'e', 'n', ':', 'h', 'e', 'x',
+ ':', 'l', 'o', 'w', 'e', 'r', ':', 'Y', '=', '2', '1', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'U', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm',
+ 'e', '_', 't', 'o', 'k', 'e', 'n', ':', 'h', 'e', 'x', ':', 'l', 'o', 'w', 'e', 'r',
+ ':', 'T', '=', '2', '2', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '1', '6', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', 'e',
+ 'n', ':', 'h', 'e', 'x', ':', 'l', 'o', 'w', 'e', 'r', ':', 'L', '=', '2', '3', ';',
+ 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm', 'b', 'o', 'l', ':', 'Q',
+ '=', '\'', '$', 'Q', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i',
+ 'i', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's',
+ 'y', 'm', 'b', 'o', 'l', ':', 'X', '=', '\'', '$', 'X', '\'', ';', 'c', 'o', 'n',
+ 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm', 'b', 'o', 'l', ':', 'Y', '=', '\'',
+ '$', 'Y', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm',
+ 'b', 'o', 'l', ':', 'T', '=', '\'', '$', 'T', '\'', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'a', 's', 'c', 'i', 'i', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n',
+ 'a', 'm', 'e', '_', 's', 'y', 'm', 'b', 'o', 'l', ':', 'L', '=', '\'', '$', 'L',
+ '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm', 'b', 'o',
+ 'l', ':', 'o', 'c', 't', 'a', 'l', ':', 'X', '=', '\'', '$', 'a', '\'', ';', 'c',
+ 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm', 'b', 'o', 'l', ':', 'o', 'c',
+ 't', 'a', 'l', ':', 'Y', '=', '\'', '$', 'b', '\'', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'a', 's', 'c', 'i', 'i', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n',
+ 'a', 'm', 'e', '_', 's', 'y', 'm', 'b', 'o', 'l', ':', 'o', 'c', 't', 'a', 'l', ':',
+ 'T', '=', '\'', '$', 'c', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c',
+ 'i', 'i', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_',
+ 's', 'y', 'm', 'b', 'o', 'l', ':', 'o', 'c', 't', 'a', 'l', ':', 'L', '=', '\'',
+ '$', 'd', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm',
+ 'b', 'o', 'l', ':', 'h', 'e', 'x', ':', 'u', 'p', 'p', 'e', 'r', ':', 'X', '=', '\'',
+ '$', 'e', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm',
+ 'b', 'o', 'l', ':', 'h', 'e', 'x', ':', 'u', 'p', 'p', 'e', 'r', ':', 'Y', '=', '\'',
+ '$', 'f', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm',
+ 'b', 'o', 'l', ':', 'h', 'e', 'x', ':', 'u', 'p', 'p', 'e', 'r', ':', 'T', '=', '\'',
+ '$', 'g', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm',
+ 'b', 'o', 'l', ':', 'h', 'e', 'x', ':', 'u', 'p', 'p', 'e', 'r', ':', 'L', '=', '\'',
+ '$', 'h', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm',
+ 'b', 'o', 'l', ':', 'h', 'e', 'x', ':', 'l', 'o', 'w', 'e', 'r', ':', 'X', '=', '\'',
+ '$', 'x', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm',
+ 'b', 'o', 'l', ':', 'h', 'e', 'x', ':', 'l', 'o', 'w', 'e', 'r', ':', 'Y', '=', '\'',
+ '$', 'y', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm',
+ 'b', 'o', 'l', ':', 'h', 'e', 'x', ':', 'l', 'o', 'w', 'e', 'r', ':', 'T', '=', '\'',
+ '$', 't', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'a', 's', 'c', 'i', 'i', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'a', 'm', 'e', '_', 's', 'y', 'm',
+ 'b', 'o', 'l', ':', 'h', 'e', 'x', ':', 'l', 'o', 'w', 'e', 'r', ':', 'L', '=', '\'',
+ '$', 'l', '\'', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '3', '2', ' ', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'd', 'y', 'n', '_',
+ 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', '=', '0', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'U', '3', '2', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5',
+ '4', '_', ':', 'd', 'y', 'n', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't',
+ '=', '1', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '3', '2', ' ', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'd', 'y', 'n', '_', 'r', 'e',
+ 'a', 'd', '_', 'l', 'e', 'n', '=', '2', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '3',
+ '2', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', 'n', ':',
+ 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', '=', '0', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'U', '3', '2', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a',
+ 'd', 'n', ':', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', '=', '1', ';', 'c',
+ 'o', 'n', 's', 't', ' ', 'U', '3', '2', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'r', 'e', 'a', 'd', 'n', ':', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', '=', '2',
+ ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '3', '2', ' ', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'r', 'e', 'a', 'd', 'n', ':', 'l', 'a', 'b', 'e', 'l', '_', 's', 't',
+ 'a', 'r', 't', '=', '3', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '3', '2', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', 'n', ':', 'l', 'a', 'b',
+ 'e', 'l', '_', 'l', 'e', 'n', '=', '4', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '3',
+ '2', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'y', '=', '0', ';', 'c', 'o', 'n', 's', 't', ' ', 'U', '3', '2', ' ', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'c', 'o', 'o', 'r', 'd', ':', 'x', '=', '1', ';', 'c',
+ 'o', 'n', 's', 't', ' ', 'U', '3', '2', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 't', 'i', 'l', 'e', '=', '2', ';', 'c', 'o', 'n',
+ 's', 't', ' ', 'U', '3', '2', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'l', 'a', 'n', 'e', '=', '3', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'U', '3', '2', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'r', 'e', 'g', 'i', 'o', 'n', '=', '2', ';', 'c', 'o', 'n', 's', 't',
+ ' ', 'U', '3', '2', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'p', 'a', 'n', 'e', 'l', '=', '2', ';', 'e', 'x', 't', 'e', 'r', 'n',
+ ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ', 'c', 'a', 's',
+ 't', '#', '1', '(', 'a', 'n', 'y', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'c',
+ 'a', 's', 't', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i',
+ 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'b', 'i', 't', '_',
+ 'o', 'r', '#', '1', '<', 'U', '8', ' ', 'a', 'l', 'i', 'g', 'n', '>', '(', 'T', ' ',
+ 'A', ',', 'T', ' ', 'B', ')', '=', 'v', 'd', 'b', ':', 'b', 'i', 't', '_', 'o', 'r',
+ ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ',
+ '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 't', 'r', 'i', 'm', '#', '1', '<',
+ 'U', '8', ' ', 'a', 'l', 'i', 'g', 'n', ',', 'T', ' ', 'v', 'a', 'l', '>', '(', 'T',
+ ' ', 'A', ')', '=', 'v', 'd', 'b', ':', 't', 'r', 'i', 'm', ';', 'e', 'x', 't', 'e',
+ 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ', 'r',
+ 'e', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', '#', '1', '(', 'a', 'n', 'y', ' ',
+ 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'r', 'e', 'd', 'i', 'm', 'e', 'n', 's', 'i',
+ 'o', 'n', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o',
+ 'n', ' ', 'I', '6', '4', ' ', 'r', 'o', 'w', '_', 'i', 'd', '#', '1', '(', ')', '=',
+ 'v', 'd', 'b', ':', 'r', 'o', 'w', '_', 'i', 'd', ';', 'e', 'x', 't', 'e', 'r', 'n',
+ ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'U', '3', '2', ' ', 'r', 'o', 'w',
+ '_', 'l', 'e', 'n', '#', '1', '(', 'a', 'n', 'y', ' ', 'i', 'n', ')', '=', 'v', 'd',
+ 'b', ':', 'r', 'o', 'w', '_', 'l', 'e', 'n', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ',
+ 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'U', '3', '2', ' ', 'f', 'i', 'x', 'e',
+ 'd', '_', 'r', 'o', 'w', '_', 'l', 'e', 'n', '#', '1', '(', 'a', 'n', 'y', ' ', 'i',
+ 'n', ')', '=', 'v', 'd', 'b', ':', 'f', 'i', 'x', 'e', 'd', '_', 'r', 'o', 'w', '_',
+ 'l', 'e', 'n', ';', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', ' ', 'f', 'u', 'n', 'c',
+ 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'v', 'o', 'i', 'd',
+ ' ', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '#', '1', '<', '*', 'U', '3', '2', ' ', 's',
+ 'i', 'g', '_', 'b', 'i', 't', 's', '>', '(', 'T', ' ', 's', 'r', 'c', ',', 'T', ' ',
+ 'c', 'm', 'p', ')', '=', 'v', 'd', 'b', ':', 'c', 'o', 'm', 'p', 'a', 'r', 'e', ';',
+ 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n',
+ ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'v', 'o', 'i', 'd', ' ', 'n', 'o', '_',
+ 'c', 'o', 'm', 'p', 'a', 'r', 'e', '#', '1', '(', 'T', ' ', 's', 'r', 'c', ',', 'T',
+ ' ', 'c', 'm', 'p', ')', '=', 'v', 'd', 'b', ':', 'n', 'o', '_', 'c', 'o', 'm', 'p',
+ 'a', 'r', 'e', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i',
+ 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'r', 'a', 'n', 'g',
+ 'e', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '#', '1', '<', 'T', ' ', 'l', 'o',
+ 'w', 'e', 'r', ',', 'T', ' ', 'u', 'p', 'p', 'e', 'r', '>', '(', 'T', ' ', 'i', 'n',
+ ')', '=', 'v', 'd', 'b', ':', 'r', 'a', 'n', 'g', 'e', '_', 'v', 'a', 'l', 'i', 'd',
+ 'a', 't', 'e', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i',
+ 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 's', 'e', 'l', 'e',
+ 'c', 't', '#', '1', '(', 'T', ' ', 'f', 'i', 'r', 's', 't', ',', 'T', ' ', 's', 'e',
+ 'c', 'o', 'n', 'd', ',', '.', '.', '.', ')', '=', 'v', 'd', 'b', ':', 's', 'e', 'l',
+ 'e', 'c', 't', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i',
+ 'o', 'n', ' ', 't', 'r', 'a', 'n', 's', 'p', 'o', 's', 'e', 'd', '_', 'f', 'm', 't',
+ ' ', 't', 'r', 'a', 'n', 's', 'p', 'o', 's', 'e', '#', '1', '(', 't', 'r', 'a', 'n',
+ 's', 'p', 'o', 's', 'e', '_', 's', 'e', 't', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b',
+ ':', 't', 'r', 'a', 'n', 's', 'p', 'o', 's', 'e', ';', 'e', 'x', 't', 'e', 'r', 'n',
+ ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 't', 'r', 'a', 'n', 's', 'p', 'o',
+ 's', 'e', '_', 's', 'e', 't', ' ', 'd', 'e', 't', 'r', 'a', 'n', 's', 'p', 'o', 's',
+ 'e', '#', '1', '(', 't', 'r', 'a', 'n', 's', 'p', 'o', 's', 'e', 'd', '_', 'f', 'm',
+ 't', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'd', 'e', 't', 'r', 'a', 'n', 's',
+ 'p', 'o', 's', 'e', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't',
+ 'i', 'o', 'n', ' ', 'd', 'e', 'l', 't', 'a', '_', 'a', 'v', 'e', 'r', 'a', 'g', 'e',
+ 'd', '_', 'f', 'm', 't', ' ', 'd', 'e', 'l', 't', 'a', '_', 'a', 'v', 'e', 'r', 'a',
+ 'g', 'e', '#', '1', '(', 'a', 'n', 'y', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':',
+ 'd', 'e', 'l', 't', 'a', '_', 'a', 'v', 'e', 'r', 'a', 'g', 'e', ';', 'e', 'x', 't',
+ 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ',
+ 'u', 'n', 'd', 'e', 'l', 't', 'a', '_', 'a', 'v', 'e', 'r', 'a', 'g', 'e', '#', '1',
+ '(', 'd', 'e', 'l', 't', 'a', '_', 'a', 'v', 'e', 'r', 'a', 'g', 'e', 'd', '_', 'f',
+ 'm', 't', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'u', 'n', 'd', 'e', 'l', 't',
+ 'a', '_', 'a', 'v', 'e', 'r', 'a', 'g', 'e', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ',
+ 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'm', 'e', 'r', 'g', 'e', 'd', '_', 'f',
+ 'm', 't', ' ', 'm', 'e', 'r', 'g', 'e', '#', '1', '(', 'a', 'n', 'y', ' ', 'i', 'n',
+ ',', '.', '.', '.', ')', '=', 'v', 'd', 'b', ':', 'm', 'e', 'r', 'g', 'e', ';', 'e',
+ 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n',
+ 'y', ' ', 's', 'p', 'l', 'i', 't', '#', '1', '<', 'U', '3', '2', ' ', 'i', 'd', 'x',
+ '>', '(', 'm', 'e', 'r', 'g', 'e', 'd', '_', 'f', 'm', 't', ' ', 'i', 'n', ')', '=',
+ 'v', 'd', 'b', ':', 's', 'p', 'l', 'i', 't', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ',
+ 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>',
+ 'T', ' ', 'm', 'e', 't', 'a', ':', 'r', 'e', 'a', 'd', '#', '1', '<', 'a', 's', 'c',
+ 'i', 'i', ' ', 'n', 'o', 'd', 'e', '*', 'b', 'o', 'o', 'l', ' ', 'd', 'e', 't', 'e',
+ 'r', 'm', 'i', 'n', 'i', 's', 't', 'i', 'c', '>', '(', ')', ';', 'e', 'x', 't', 'e',
+ 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e',
+ ' ', 'T', '>', 'T', ' ', 'm', 'e', 't', 'a', ':', 'v', 'a', 'l', 'u', 'e', '#', '1',
+ '<', 'a', 's', 'c', 'i', 'i', ' ', 'n', 'o', 'd', 'e', '*', 'b', 'o', 'o', 'l', ' ',
+ 'd', 'e', 't', 'e', 'r', 'm', 'i', 'n', 'i', 's', 't', 'i', 'c', '>', '(', ')', ';',
+ 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<',
+ 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'm', 'e', 't', 'a', ':', 'w', 'r', 'i',
+ 't', 'e', '#', '1', '<', 'a', 's', 'c', 'i', 'i', ' ', 'n', 'o', 'd', 'e', '>', '(',
+ 'T', ' ', 'i', 'n', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c',
+ 't', 'i', 'o', 'n', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'm', 'e', 't', 'a', ':', 'a',
+ 't', 't', 'r', ':', 'r', 'e', 'a', 'd', '#', '1', '<', 'a', 's', 'c', 'i', 'i', ' ',
+ 'n', 'o', 'd', 'e', ',', 'a', 's', 'c', 'i', 'i', ' ', 'a', 't', 't', 'r', '*', 'b',
+ 'o', 'o', 'l', ' ', 'd', 'e', 't', 'e', 'r', 'm', 'i', 'n', 'i', 's', 't', 'i', 'c',
+ '>', '(', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i',
+ 'o', 'n', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'm', 'e', 't', 'a', ':', 'a', 't', 't',
+ 'r', ':', 'w', 'r', 'i', 't', 'e', '#', '1', '<', 'a', 's', 'c', 'i', 'i', ' ', 'n',
+ 'o', 'd', 'e', ',', 'a', 's', 'c', 'i', 'i', ' ', 'a', 't', 't', 'r', '>', '(', 'a',
+ 's', 'c', 'i', 'i', ' ', 'i', 'n', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f',
+ 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 't', 'e', 'x', 't', '8', '_', 's', 'e', 't',
+ ' ', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', ':', 'r', 'e', 'a', 'd', '#', '1',
+ '<', 'a', 's', 'c', 'i', 'i', ' ', 'n', 'a', 'm', 'e', '*', 'b', 'o', 'o', 'l', ' ',
+ 'd', 'e', 't', 'e', 'r', 'm', 'i', 'n', 'i', 's', 't', 'i', 'c', '>', '(', ')', ';',
+ 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 't',
+ 'e', 'x', 't', '8', '_', 's', 'e', 't', ' ', 'e', 'n', 'v', 'i', 'r', 'o', 'n', 'm',
+ 'e', 'n', 't', ':', 'r', 'e', 'a', 'd', '#', '1', '<', 'a', 's', 'c', 'i', 'i', ' ',
+ 'n', 'a', 'm', 'e', '>', '(', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u',
+ 'n', 'c', 't', 'i', 'o', 'n', ' ', 't', 'e', 'x', 't', '8', '_', 's', 'e', 't', ' ',
+ 'i', 'd', 'x', ':', 't', 'e', 'x', 't', ':', 'p', 'r', 'o', 'j', 'e', 'c', 't', '#',
+ '1', '.', '1', '<', 'a', 's', 'c', 'i', 'i', ' ', 'i', 'n', 'd', 'e', 'x', '_', 'n',
+ 'a', 'm', 'e', '*', 'U', '8', ' ', 'c', 'a', 's', 'e', '_', 's', 'e', 'n', 's', 'i',
+ 't', 'i', 'v', 'i', 't', 'y', '>', '(', '*', 't', 'e', 'x', 't', '8', '_', 's', 'e',
+ 't', ' ', 's', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'e', ')', ';', 'e', 'x', 't',
+ 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 't', 'e', 'x', 't',
+ '8', '_', 's', 'e', 't', ' ', 'i', 'd', 'x', ':', 't', 'e', 'x', 't', ':', 'i', 'n',
+ 's', 'e', 'r', 't', '#', '1', '.', '1', '<', 'a', 's', 'c', 'i', 'i', ' ', 'i', 'n',
+ 'd', 'e', 'x', '_', 'n', 'a', 'm', 'e', '*', 'U', '8', ' ', 'c', 'a', 's', 'e', '_',
+ 's', 'e', 'n', 's', 'i', 't', 'i', 'v', 'i', 't', 'y', '>', '(', 't', 'e', 'x', 't',
+ '8', '_', 's', 'e', 't', ' ', 'k', 'e', 'y', ')', ';', 'e', 'x', 't', 'e', 'r', 'n',
+ ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'v', 'd', 'b', ':', 'r', 'o', 'w',
+ '_', 'i', 'd', '_', 'r', 'a', 'n', 'g', 'e', ' ', 'i', 'd', 'x', ':', 't', 'e', 'x',
+ 't', ':', 'l', 'o', 'o', 'k', 'u', 'p', '#', '1', '.', '1', '<', 'a', 's', 'c', 'i',
+ 'i', ' ', 'i', 'n', 'd', 'e', 'x', '_', 'n', 'a', 'm', 'e', ',', 'a', 's', 'c', 'i',
+ 'i', ' ', 'q', 'u', 'e', 'r', 'y', '_', 'b', 'y', '_', 'n', 'a', 'm', 'e', '*', 'U',
+ '8', ' ', 'c', 'a', 's', 'e', '_', 's', 'e', 'n', 's', 'i', 't', 'i', 'v', 'i', 't',
+ 'y', '>', '(', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't',
+ 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'e', 'c', 'h',
+ 'o', '#', '1', '<', 'T', ' ', 'v', 'a', 'l', '>', '(', '*', 'a', 'n', 'y', ' ', 'r',
+ 'o', 'w', '_', 'l', 'e', 'n', ')', '=', 'v', 'd', 'b', ':', 'e', 'c', 'h', 'o', ';',
+ 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<',
+ 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'e', 'x', 'i', 's', 't', 's', '#', '1',
+ '<', '*', 'T', ' ', 'c', 'v', 'a', 'l', '>', '(', 'a', 'n', 'y', ' ', 'p', 'r', 'e',
+ 'd', 'i', 'c', 'a', 't', 'e', '*', 'T', ' ', 'd', 'v', 'a', 'l', ')', '=', 'v', 'd',
+ 'b', ':', 'e', 'x', 'i', 's', 't', 's', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f',
+ 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'A', ',', 't',
+ 'y', 'p', 'e', ' ', 'B', '>', 'B', ' ', 'm', 'a', 'p', '#', '1', '<', 'A', ' ', 'f',
+ 'r', 'o', 'm', ',', 'B', ' ', 't', 'o', '>', '(', 'A', ' ', 'i', 'n', '*', 'B', ' ',
+ 's', 'r', 'c', ')', '=', 'v', 'd', 'b', ':', 'm', 'a', 'p', ';', 'e', 'x', 't', 'e',
+ 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e',
+ ' ', 'T', '>', 'T', ' ', 'c', 'l', 'i', 'p', '#', '1', '<', 'T', ' ', 'l', 'o', 'w',
+ 'e', 'r', ',', 'T', ' ', 'u', 'p', 'p', 'e', 'r', '>', '(', 'T', ' ', 'i', 'n', ')',
+ '=', 'v', 'd', 'b', ':', 'c', 'l', 'i', 'p', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ',
+ 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', ',',
+ 'U', '3', '2', ' ', 'd', 'i', 'm', '>', 'T', '[', 'd', 'i', 'm', ']', ' ', 'v', 'c',
+ 'l', 'i', 'p', '#', '1', '<', 'T', ' ', 'l', 'o', 'w', 'e', 'r', ',', 'T', ' ', 'u',
+ 'p', 'p', 'e', 'r', '>', '(', 'T', '[', 'd', 'i', 'm', ']', ' ', 'i', 'n', ')', '=',
+ 'v', 'd', 'b', ':', 'c', 'l', 'i', 'p', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f',
+ 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'n', 'u', 'm', 'e', 'r', 'i', 'c', '_', 's',
+ 'e', 't', ' ', 'c', 'e', 'i', 'l', '#', '1', '(', 'f', 'l', 'o', 'a', 't', '_', 's',
+ 'e', 't', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'c', 'e', 'i', 'l', ';', 'e',
+ 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'n', 'u',
+ 'm', 'e', 'r', 'i', 'c', '_', 's', 'e', 't', ' ', 'f', 'l', 'o', 'o', 'r', '#', '1',
+ '(', 'f', 'l', 'o', 'a', 't', '_', 's', 'e', 't', ' ', 'i', 'n', ')', '=', 'v', 'd',
+ 'b', ':', 'f', 'l', 'o', 'o', 'r', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u',
+ 'n', 'c', 't', 'i', 'o', 'n', ' ', 'n', 'u', 'm', 'e', 'r', 'i', 'c', '_', 's', 'e',
+ 't', ' ', 'r', 'o', 'u', 'n', 'd', '#', '1', '(', 'f', 'l', 'o', 'a', 't', '_', 's',
+ 'e', 't', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'r', 'o', 'u', 'n', 'd', ';',
+ 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'n',
+ 'u', 'm', 'e', 'r', 'i', 'c', '_', 's', 'e', 't', ' ', 't', 'r', 'u', 'n', 'c', '#',
+ '1', '(', 'f', 'l', 'o', 'a', 't', '_', 's', 'e', 't', ' ', 'i', 'n', ')', '=', 'v',
+ 'd', 'b', ':', 't', 'r', 'u', 'n', 'c', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f',
+ 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T',
+ ' ', 'm', 'i', 'n', '#', '1', '(', 'T', ' ', 'a', ',', 'T', ' ', 'b', ')', '=', 'v',
+ 'd', 'b', ':', 'm', 'i', 'n', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n',
+ 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'm',
+ 'a', 'x', '#', '1', '(', 'T', ' ', 'a', ',', 'T', ' ', 'b', ')', '=', 'v', 'd', 'b',
+ ':', 'm', 'a', 'x', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't',
+ 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 's', 'u', 'm',
+ '#', '1', '<', '*', 'T', ' ', 'k', '>', '(', 'T', ' ', 'a', ',', '.', '.', '.', ')',
+ '=', 'v', 'd', 'b', ':', 's', 'u', 'm', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f',
+ 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T',
+ ' ', 'd', 'i', 'f', 'f', '#', '1', '<', '*', 'T', ' ', 'k', '>', '(', 'T', ' ', 'a',
+ '*', 'T', ' ', 'b', ')', '=', 'v', 'd', 'b', ':', 'd', 'i', 'f', 'f', ';', 'e', 'x',
+ 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y',
+ 'p', 'e', ' ', 'T', '>', 'T', ' ', 'd', 'e', 'r', 'i', 'v', '#', '1', '(', 'T', ' ',
+ 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'd', 'e', 'r', 'i', 'v', ';', 'e', 'x', 't',
+ 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p',
+ 'e', ' ', 'T', '>', 'T', ' ', 'i', 'n', 't', 'e', 'g', 'r', 'a', 'l', '#', '1', '(',
+ 'T', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'i', 'n', 't', 'e', 'g', 'r', 'a',
+ 'l', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n',
+ ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'i', 'n', 't', 'e', 'g', 'r',
+ 'a', 'l', '_', '0', '#', '1', '(', 'T', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':',
+ 'i', 'n', 't', 'e', 'g', 'r', 'a', 'l', '_', '0', ';', 'e', 'x', 't', 'e', 'r', 'n',
+ ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T',
+ '>', 'T', ' ', 'd', 'e', 'l', 't', 'a', '#', '1', '(', 'T', ' ', 'i', 'n', ')', '=',
+ 'v', 'd', 'b', ':', 'd', 'e', 'l', 't', 'a', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ',
+ 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>',
+ 'T', ' ', 'u', 'n', 'd', 'e', 'l', 't', 'a', '#', '1', '(', 'T', ' ', 'i', 'n', ')',
+ '=', 'v', 'd', 'b', ':', 'u', 'n', 'd', 'e', 'l', 't', 'a', ';', 'e', 'x', 't', 'e',
+ 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e',
+ ' ', 'T', '>', 'T', ' ', 'o', 'u', 't', 'l', 'i', 'e', 'r', '_', 'e', 'n', 'c', 'o',
+ 'd', 'e', '#', '1', '<', 'T', ' ', 'o', 'u', 't', 'l', 'i', 'e', 'r', '>', '(', 'T',
+ ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'o', 'u', 't', 'l', 'i', 'e', 'r', '_',
+ 'e', 'n', 'c', 'o', 'd', 'e', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n',
+ 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'o',
+ 'u', 't', 'l', 'i', 'e', 'r', '_', 'd', 'e', 'c', 'o', 'd', 'e', '#', '1', '<', 'T',
+ ' ', 'o', 'u', 't', 'l', 'i', 'e', 'r', '>', '(', 'T', ' ', 'i', 'n', ')', '=', 'v',
+ 'd', 'b', ':', 'o', 'u', 't', 'l', 'i', 'e', 'r', '_', 'd', 'e', 'c', 'o', 'd', 'e',
+ ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ',
+ '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'a', 'd', 'd', '_', 'r', 'o', 'w',
+ '_', 'i', 'd', '#', '1', '(', 'T', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'a',
+ 'd', 'd', '_', 'r', 'o', 'w', '_', 'i', 'd', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ',
+ 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>',
+ 'T', ' ', 's', 'u', 'b', '_', 'r', 'o', 'w', '_', 'i', 'd', '#', '1', '(', 'T', ' ',
+ 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 's', 'u', 'b', '_', 'r', 'o', 'w', '_', 'i',
+ 'd', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n',
+ ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', '[', '*', ']', ' ', 'c', 'u', 't',
+ '#', '1', '<', 'U', '3', '2', ' ', 'i', 'd', 'x', ',', '.', '.', '.', '>', '(', 'T',
+ '[', '*', ']', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'c', 'u', 't', ';', 'e',
+ 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't',
+ 'y', 'p', 'e', ' ', 'T', '>', 'T', '[', '*', ']', ' ', 'p', 'a', 's', 't', 'e', '#',
+ '1', '(', 'T', '[', '*', ']', ' ', 'i', 'n', ',', '.', '.', '.', ')', '=', 'v', 'd',
+ 'b', ':', 'p', 'a', 's', 't', 'e', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u',
+ 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ',
+ 'v', 'e', 'c', '_', 's', 'u', 'm', '#', '1', '(', 'T', '[', '*', ']', ' ', 'i', 'n',
+ ')', '=', 'v', 'd', 'b', ':', 'v', 'e', 'c', '_', 's', 'u', 'm', ';', 'e', 'x', 't',
+ 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p',
+ 'e', ' ', 'T', '>', 'T', ' ', 'f', 'i', 'x', 'e', 'd', '_', 'v', 'e', 'c', '_', 's',
+ 'u', 'm', '#', '1', '(', 'T', '[', '*', ']', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b',
+ ':', 'f', 'i', 'x', 'e', 'd', '_', 'v', 'e', 'c', '_', 's', 'u', 'm', ';', 'e', 'x',
+ 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'b', 'o', 'o',
+ 'l', ' ', 'c', 'h', 'e', 'c', 'k', 's', 'u', 'm', '#', '1', '<', 'a', 's', 'c', 'i',
+ 'i', ' ', 'n', 'o', 'd', 'e', ',', 'a', 's', 'c', 'i', 'i', ' ', 'a', 'l', 'g', 'o',
+ 'r', 'i', 't', 'h', 'm', '>', '(', 'B', '8', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b',
+ ':', 'c', 'h', 'e', 'c', 'k', 's', 'u', 'm', ';', 's', 'c', 'h', 'e', 'm', 'a', ' ',
+ 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'b', 'o', 'o', 'l', ' ', 'm', 'd', '5',
+ 's', 'u', 'm', '#', '1', '<', 'a', 's', 'c', 'i', 'i', ' ', 'n', 'o', 'd', 'e', '>',
+ '(', 'B', '8', ' ', 'i', 'n', ')', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'c', 'h',
+ 'e', 'c', 'k', 's', 'u', 'm', '#', '1', '<', 'n', 'o', 'd', 'e', ',', '\'', 'm',
+ 'd', '5', '\'', '>', '(', 'i', 'n', ')', ';', '}', 'e', 'x', 't', 'e', 'r', 'n',
+ ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'B', '1', '[', '*', ']', ' ', 'p',
+ 'a', 'c', 'k', '#', '1', '(', 'p', 'a', 'c', 'k', '_', 's', 'e', 't', ' ', 'i', 'n',
+ ')', '=', 'v', 'd', 'b', ':', 'p', 'a', 'c', 'k', ';', 'e', 'x', 't', 'e', 'r', 'n',
+ ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'p', 'a', 'c', 'k', '_', 's', 'e',
+ 't', ' ', 'u', 'n', 'p', 'a', 'c', 'k', '#', '1', '(', 'B', '1', '[', '*', ']', ' ',
+ 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'u', 'n', 'p', 'a', 'c', 'k', ';', 'e', 'x',
+ 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'i', 'z', 'i',
+ 'p', '_', 'f', 'm', 't', ' ', 'i', 'z', 'i', 'p', '#', '2', '.', '1', '(', 'i', 'z',
+ 'i', 'p', '_', 's', 'e', 't', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'i', 'z',
+ 'i', 'p', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o',
+ 'n', ' ', 'i', 'z', 'i', 'p', '_', 's', 'e', 't', ' ', 'i', 'u', 'n', 'z', 'i', 'p',
+ '#', '2', '.', '1', '(', 'i', 'z', 'i', 'p', '_', 'f', 'm', 't', ' ', 'i', 'n', ')',
+ '=', 'v', 'd', 'b', ':', 'i', 'u', 'n', 'z', 'i', 'p', ';', 'e', 'x', 't', 'e', 'r',
+ 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'f', 'z', 'i', 'p', '_', 'f',
+ 'm', 't', ' ', 'f', 'z', 'i', 'p', '#', '1', '<', 'U', '3', '2', ' ', 'm', 'a', 'n',
+ 't', 'i', 's', 's', 'a', '>', '(', 'f', 'z', 'i', 'p', '_', 's', 'e', 't', ' ', 'i',
+ 'n', ')', '=', 'v', 'd', 'b', ':', 'f', 'z', 'i', 'p', ';', 'e', 'x', 't', 'e', 'r',
+ 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'f', 'z', 'i', 'p', '_', 's',
+ 'e', 't', ' ', 'f', 'u', 'n', 'z', 'i', 'p', '#', '1', '(', 'f', 'z', 'i', 'p', '_',
+ 'f', 'm', 't', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'f', 'u', 'n', 'z', 'i',
+ 'p', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n',
+ ' ', 'r', 'l', 'e', '_', 'f', 'm', 't', ' ', 'r', 'l', 'e', 'n', 'c', 'o', 'd', 'e',
+ '#', '1', '(', 'a', 'n', 'y', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'r', 'l',
+ 'e', 'n', 'c', 'o', 'd', 'e', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n',
+ 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ', 'r', 'l', 'd', 'e', 'c', 'o', 'd',
+ 'e', '#', '1', '(', 'r', 'l', 'e', '_', 'f', 'm', 't', ' ', 'i', 'n', ')', '=', 'v',
+ 'd', 'b', ':', 'r', 'l', 'd', 'e', 'c', 'o', 'd', 'e', ';', 'e', 'x', 't', 'e', 'r',
+ 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'z', 'l', 'i', 'b', '_', 'f',
+ 'm', 't', ' ', 'z', 'i', 'p', '#', '1', '<', '*', 'I', '3', '2', ' ', 's', 't', 'r',
+ 'a', 't', 'e', 'g', 'y', ',', 'I', '3', '2', ' ', 'l', 'e', 'v', 'e', 'l', '>', '(',
+ 'a', 'n', 'y', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'z', 'i', 'p', ';', 'e',
+ 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n',
+ 'y', ' ', 'u', 'n', 'z', 'i', 'p', '#', '1', '(', 'z', 'l', 'i', 'b', '_', 'f', 'm',
+ 't', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'u', 'n', 'z', 'i', 'p', ';', 'e',
+ 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'b', 'z',
+ 'i', 'p', '2', '_', 'f', 'm', 't', ' ', 'b', 'z', 'i', 'p', '#', '1', '<', '*', 'U',
+ '3', '2', ' ', 'b', 'l', 'o', 'c', 'k', 'S', 'i', 'z', 'e', '1', '0', '0', 'k', ',',
+ 'U', '3', '2', ' ', 'w', 'o', 'r', 'k', 'F', 'a', 'c', 't', 'o', 'r', '>', '(', 'a',
+ 'n', 'y', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'b', 'z', 'i', 'p', ';', 'e',
+ 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n',
+ 'y', ' ', 'b', 'u', 'n', 'z', 'i', 'p', '#', '1', '(', 'b', 'z', 'i', 'p', '2', '_',
+ 'f', 'm', 't', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'b', 'u', 'n', 'z', 'i',
+ 'p', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n',
+ ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 's', 'i', 'm', 'p', 'l', 'e',
+ '_', 's', 'u', 'b', '_', 's', 'e', 'l', 'e', 'c', 't', '#', '1', '<', 'a', 's', 'c',
+ 'i', 'i', ' ', 't', 'b', 'l', ',', 'a', 's', 'c', 'i', 'i', ' ', 'c', 'o', 'l', '>',
+ '(', 'I', '6', '4', ' ', 'r', 'o', 'w', '*', 'I', '3', '2', ' ', 'i', 'd', 'x', ')',
+ '=', 'v', 'd', 'b', ':', 's', 'i', 'm', 'p', 'l', 'e', '_', 's', 'u', 'b', '_', 's',
+ 'e', 'l', 'e', 'c', 't', '_', '1', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u',
+ 'n', 'c', 't', 'i', 'o', 'n', ' ', 't', 'e', 'x', 't', '_', 's', 'e', 't', ' ', 'e',
+ 'x', 't', 'r', 'a', 'c', 't', '_', 't', 'o', 'k', 'e', 'n', '#', '1', '<', 'U', '3',
+ '2', ' ', 'i', 'd', 'x', '>', '(', 't', 'e', 'x', 't', '_', 's', 'e', 't', ' ', 's',
+ 't', 'r', ',', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n', ' ', 't', 'o', 'k',
+ ')', '=', 'v', 'd', 'b', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 't', 'o', 'k',
+ 'e', 'n', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o',
+ 'n', ' ', 'n', 'u', 'm', 'e', 'r', 'i', 'c', '_', 's', 'e', 't', ' ', 's', 't', 'r',
+ 't', 'o', 'n', 'u', 'm', '#', '1', '<', '*', 'U', '3', '2', ' ', 'r', 'a', 'd', 'i',
+ 'x', '>', '(', 't', 'e', 'x', 't', '_', 's', 'e', 't', ' ', 's', 't', 'r', ')', '=',
+ 'v', 'd', 'b', ':', 's', 't', 'r', 't', 'o', 'n', 'u', 'm', ';', 'e', 'x', 't', 'e',
+ 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 't', 'e', 'x', 't', '_',
+ 's', 'e', 't', ' ', 's', 'p', 'r', 'i', 'n', 't', 'f', '#', '1', '<', 'a', 's', 'c',
+ 'i', 'i', ' ', 'f', 'm', 't', '>', '(', 'a', 'n', 'y', ' ', 'p', '1', ',', '.', '.',
+ '.', ')', '=', 'v', 'd', 'b', ':', 's', 'p', 'r', 'i', 'n', 't', 'f', ';', 'e', 'x',
+ 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'm', 'e', 'r',
+ 'g', 'e', 'd', '_', 't', ' ', 'N', 'C', 'B', 'I', ':', 'm', 'e', 'r', 'g', 'e', '#',
+ '1', '(', 'a', 'n', 'y', ' ', 'i', 'n', ',', '.', '.', '.', ')', ';', 'e', 'x', 't',
+ 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ',
+ 'N', 'C', 'B', 'I', ':', 's', 'p', 'l', 'i', 't', '#', '1', '<', 'U', '3', '2', ' ',
+ 'i', 'd', 'x', '>', '(', 'm', 'e', 'r', 'g', 'e', 'd', '_', 't', ' ', 'i', 'n', ')',
+ '=', 'v', 'd', 'b', ':', 's', 'p', 'l', 'i', 't', ';', 'e', 'x', 't', 'e', 'r', 'n',
+ ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ', 'N', 'C', 'B',
+ 'I', ':', 'c', 'u', 't', '#', '1', '<', 'U', '3', '2', ' ', 'i', 'd', 'x', ',', '.',
+ '.', '.', '>', '(', 'a', 'n', 'y', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'c',
+ 'u', 't', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o',
+ 'n', ' ', 'a', 'n', 'y', ' ', 'N', 'C', 'B', 'I', ':', 'p', 'a', 's', 't', 'e', '#',
+ '1', '(', 'a', 'n', 'y', ' ', 'i', 'n', ',', '.', '.', '.', ')', '=', 'v', 'd', 'b',
+ ':', 'p', 'a', 's', 't', 'e', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n',
+ 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ', 'N', 'C', 'B', 'I', ':', 'p', 'a',
+ 'c', 'k', '#', '1', '<', 'U', '3', '2', ' ', 'f', 'r', 'o', 'm', ',', 'U', '3', '2',
+ ' ', 't', 'o', '>', '(', 'a', 'n', 'y', ' ', 'i', 'n', ')', ';', 'e', 'x', 't', 'e',
+ 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ', 'N',
+ 'C', 'B', 'I', ':', 'u', 'n', 'p', 'a', 'c', 'k', '#', '1', '<', 'U', '3', '2', ' ',
+ 'f', 'r', 'o', 'm', ',', 'U', '3', '2', ' ', 't', 'o', '>', '(', 'a', 'n', 'y', ' ',
+ 'i', 'n', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i',
+ 'o', 'n', ' ', 'a', 'n', 'y', ' ', 'N', 'C', 'B', 'I', ':', 'f', 'p', '_', 'd', 'e',
+ 'c', 'o', 'd', 'e', '#', '1', '(', 'f', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'e', 'd',
+ '_', 't', ' ', 'i', 'n', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n',
+ 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ', 'N', 'C', 'B', 'I', ':', 'f', 'p',
+ '_', 'e', 'x', 't', 'e', 'n', 'd', '#', '1', '<', 'U', '3', '2', ' ', 'b', 'i', 't',
+ 's', '>', '(', 'N', 'C', 'B', 'I', ':', 'f', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'e',
+ 'd', '_', 't', ' ', 'i', 'n', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u',
+ 'n', 'c', 't', 'i', 'o', 'n', ' ', 'r', 'l', '_', 'e', 'n', 'c', 'o', 'd', 'e', 'd',
+ '_', 't', ' ', 'N', 'C', 'B', 'I', ':', 'r', 'u', 'n', '_', 'l', 'e', 'n', 'g', 't',
+ 'h', '_', 'e', 'n', 'c', 'o', 'd', 'e', '#', '1', '(', 'a', 'n', 'y', ' ', 'i', 'n',
+ ')', '=', 'v', 'd', 'b', ':', 'r', 'l', 'e', 'n', 'c', 'o', 'd', 'e', ';', 'e', 'x',
+ 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y',
+ ' ', 'N', 'C', 'B', 'I', ':', 'r', 'u', 'n', '_', 'l', 'e', 'n', 'g', 't', 'h', '_',
+ 'd', 'e', 'c', 'o', 'd', 'e', '#', '1', '(', 'r', 'l', '_', 'e', 'n', 'c', 'o', 'd',
+ 'e', 'd', '_', 't', ' ', 'i', 'n', ')', '=', 'v', 'd', 'b', ':', 'r', 'l', 'd', 'e',
+ 'c', 'o', 'd', 'e', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't',
+ 'i', 'o', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'z', 'l', 'i', 'b', '_', 'e', 'n', 'c',
+ 'o', 'd', 'e', 'd', '_', 't', ' ', 'N', 'C', 'B', 'I', ':', 'z', 'l', 'i', 'b', '#',
+ '1', '<', '*', 'I', '3', '2', ' ', 's', 't', 'r', 'a', 't', 'e', 'g', 'y', ',', 'I',
+ '3', '2', ' ', 'l', 'e', 'v', 'e', 'l', '>', '(', 'a', 'n', 'y', ' ', 'i', 'n', ')',
+ '=', 'v', 'd', 'b', ':', 'z', 'i', 'p', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f',
+ 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ', 'N', 'C', 'B', 'I', ':',
+ 'u', 'n', 'z', 'i', 'p', '#', '1', '(', 'N', 'C', 'B', 'I', ':', 'z', 'l', 'i', 'b',
+ '_', 'e', 'n', 'c', 'o', 'd', 'e', 'd', '_', 't', ' ', 'i', 'n', ')', ';', 'a', 'l',
+ 'i', 'a', 's', ' ', 'N', 'C', 'B', 'I', ':', 'u', 'n', 'z', 'i', 'p', ' ', 'N', 'C',
+ 'B', 'I', ':', 'z', 'l', 'i', 'b', '_', 'd', 'e', 'c', 'o', 'm', 'p', 'r', 'e', 's',
+ 's', ';', 's', 'c', 'h', 'e', 'm', 'a', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n',
+ ' ', 'N', 'C', 'B', 'I', ':', 'z', 'l', 'i', 'b', '_', 'e', 'n', 'c', 'o', 'd', 'e',
+ 'd', '_', 't', ' ', 'N', 'C', 'B', 'I', ':', 'z', 'l', 'i', 'b', '_', 'h', 'u', 'f',
+ 'f', 'm', 'a', 'n', '_', 'c', 'o', 'm', 'p', 'r', 'e', 's', 's', '#', '1', '(', 'a',
+ 'n', 'y', ' ', 'i', 'n', ')', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B',
+ 'I', ':', 'z', 'l', 'i', 'b', '#', '1', '<', '3', '>', '(', 'i', 'n', ')', ';', '}',
+ 's', 'c', 'h', 'e', 'm', 'a', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'N',
+ 'C', 'B', 'I', ':', 'z', 'l', 'i', 'b', '_', 'e', 'n', 'c', 'o', 'd', 'e', 'd', '_',
+ 't', ' ', 'N', 'C', 'B', 'I', ':', 'z', 'l', 'i', 'b', '_', 'c', 'o', 'm', 'p', 'r',
+ 'e', 's', 's', '#', '1', '(', 'a', 'n', 'y', ' ', 'i', 'n', ')', '{', 'r', 'e', 't',
+ 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'z', 'l', 'i', 'b', '#', '1', '<', '0',
+ '>', '(', 'i', 'n', ')', ';', '}', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n',
+ 'c', 't', 'i', 'o', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'b',
+ 'i', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'E', 'Q', ':', 'r', 'a', 'n', 'd',
+ '_', '4', 'n', 'a', '_', '2', 'n', 'a', '#', '1', '(', 'I', 'N', 'S', 'D', 'C', ':',
+ '4', 'n', 'a', ':', 'b', 'i', 'n', ' ', 'r', 'd', '_', 'b', 'i', 'n', ')', ';', 'e',
+ 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 's',
+ 'c', 'i', 'i', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'f', 'o', 'r',
+ 'm', 'a', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', 'a',
+ 's', 'c', 'i', 'i', ' ', 'n', 'a', 'm', 'e', '_', 'f', 'm', 't', ',', 'I', '3', '2',
+ ' ', 'X', ',', 'I', '3', '2', ' ', 'Y', '*', 'a', 's', 'c', 'i', 'i', ' ', 's', 'p',
+ 'o', 't', '_', 'n', 'a', 'm', 'e', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f',
+ 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'S', 'R', 'A', ':', 'f', 'o', 'r', 'm', 'a', 't', '_', 's', 'p', 'o',
+ 't', '_', 'n', 'a', 'm', 'e', '_', 'n', 'o', '_', 'c', 'o', 'o', 'r', 'd', '#', '1',
+ '(', 'a', 's', 'c', 'i', 'i', ' ', 'n', 'a', 'm', 'e', '_', 'f', 'm', 't', '*', 'a',
+ 's', 'c', 'i', 'i', ' ', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', ')', ';', 'e',
+ 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'b', 'i', 'n', ' ', 'N', 'C', 'B', 'I',
+ ':', 'c', 'o', 'l', 'o', 'r', '_', 'f', 'r', 'o', 'm', '_', 'd', 'n', 'a', '#', '1',
+ '(', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', ' ', 'b',
+ 'i', 'n', '_', 'x', '2', 'n', 'a', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r',
+ 't', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n',
+ ' ', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'd',
+ 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'c', 's', '_', 'k', 'e', 'y', ',', 'U', '8',
+ ' ', 'c', 'o', 'l', 'o', 'r', '_', 'm', 'a', 't', 'r', 'i', 'x', ')', ';', 'e', 'x',
+ 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', ' ', 'N', 'C', 'B', 'I', ':',
+ 'd', 'n', 'a', '_', 'f', 'r', 'o', 'm', '_', 'c', 'o', 'l', 'o', 'r', '#', '1', '(',
+ 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'b', 'i', 'n', ' ', 'c', 'o',
+ 'l', 'o', 'r', '_', 'b', 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r',
+ 't', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n',
+ ' ', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'd',
+ 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'c', 's', '_', 'k', 'e', 'y', ',', 'U', '8',
+ ' ', 'c', 'o', 'l', 'o', 'r', '_', 'm', 'a', 't', 'r', 'i', 'x', ')', ';', 's', 'c',
+ 'h', 'e', 'm', 'a', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd', ' ',
+ 'N', 'C', 'B', 'I', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', 't', 'o', '_',
+ 'p', 'h', 'r', 'e', 'd', '#', '1', '(', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a',
+ 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ' ', 'q', 'u', 'a',
+ 'l', '_', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ')', '{', 'I', 'N', 'S', 'D', 'C',
+ ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's',
+ ' ', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', 'c', 'l', 'i', 'p', '=', '<', 'I',
+ 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_',
+ 'o', 'd', 'd', 's', '>', 'c', 'l', 'i', 'p', '#', '1', '<', '-', '6', ',', '4', '0',
+ '>', '(', 'q', 'u', 'a', 'l', '_', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ')', ';',
+ 'r', 'e', 't', 'u', 'r', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a',
+ 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ',', 'I', 'N', 'S',
+ 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd', '>',
+ 'm', 'a', 'p', '#', '1', '<', '[', '-', '6', ',', '-', '5', ',', '-', '4', ',', '-',
+ '3', ',', '-', '2', ',', '-', '1', ',', '0', ',', '1', ',', '2', ',', '3', ',', '4',
+ ',', '5', ',', '6', ',', '7', ',', '8', ',', '9', ',', '1', '0', ',', '1', '1', ',',
+ '1', '2', ',', '1', '3', ',', '1', '4', ',', '1', '5', ',', '1', '6', ',', '1', '7',
+ ',', '1', '8', ',', '1', '9', ',', '2', '0', ',', '2', '1', ',', '2', '2', ',', '2',
+ '3', ',', '2', '4', ',', '2', '5', ',', '2', '6', ',', '2', '7', ',', '2', '8', ',',
+ '2', '9', ',', '3', '0', ',', '3', '1', ',', '3', '2', ',', '3', '3', ',', '3', '4',
+ ',', '3', '5', ',', '3', '6', ',', '3', '7', ',', '3', '8', ',', '3', '9', ',', '4',
+ '0', ']', ',', '[', '0', ',', '1', ',', '1', ',', '2', ',', '2', ',', '3', ',', '3',
+ ',', '4', ',', '4', ',', '5', ',', '5', ',', '6', ',', '7', ',', '8', ',', '9', ',',
+ '1', '0', ',', '1', '0', ',', '1', '1', ',', '1', '2', ',', '1', '3', ',', '1', '4',
+ ',', '1', '5', ',', '1', '6', ',', '1', '7', ',', '1', '8', ',', '1', '9', ',', '2',
+ '0', ',', '2', '1', ',', '2', '2', ',', '2', '3', ',', '2', '4', ',', '2', '5', ',',
+ '2', '6', ',', '2', '7', ',', '2', '8', ',', '2', '9', ',', '3', '0', ',', '3', '1',
+ ',', '3', '2', ',', '3', '3', ',', '3', '4', ',', '3', '5', ',', '3', '6', ',', '3',
+ '7', ',', '3', '8', ',', '3', '9', ',', '4', '0', ']', '>', '(', 'l', 'o', 'g', '_',
+ 'o', 'd', 'd', 's', '_', 'c', 'l', 'i', 'p', ')', ';', '}', 'e', 'x', 't', 'e', 'r',
+ 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 's', 'c', 'i', 'i', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_',
+ 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', 'a', 's', 'c', 'i', 'i',
+ ' ', 'n', 'a', 'm', 'e', ',', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n', ' ',
+ 't', 'o', 'k', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't',
+ 'i', 'o', 'n', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 'n', 'a', 'm', 'e', '_', 'f', 'm',
+ 't', '#', '1', '<', 'a', 's', 'c', 'i', 'i', ' ', 'i', 'd', 'x', '>', '(', 'a', 's',
+ 'c', 'i', 'i', ' ', 'n', 'a', 'm', 'e', ',', 't', 'e', 'x', 't', ':', 't', 'o', 'k',
+ 'e', 'n', ' ', 't', 'o', 'k', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u',
+ 'n', 'c', 't', 'i', 'o', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'v', 'a', 'l', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'x',
+ 't', 'r', 'a', 'c', 't', '_', 'n', 'a', 'm', 'e', '_', 'c', 'o', 'o', 'r', 'd', '#',
+ '1', '<', 'U', '1', '6', ' ', 'c', 'o', 'o', 'r', 'd', '>', '(', 'a', 's', 'c', 'i',
+ 'i', ' ', 'n', 'a', 'm', 'e', ',', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n',
+ ' ', 't', 'o', 'k', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c',
+ 't', 'i', 'o', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p',
+ 'o', 't', '_', 'i', 'd', 's', '_', 'f', 'o', 'u', 'n', 'd', ' ', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'l', 'o', 'o', 'k', 'u', 'p', '#', '1', '<', 'a', 's', 'c',
+ 'i', 'i', ' ', 'i', 'n', 'd', 'e', 'x', '_', 'n', 'a', 'm', 'e', ',', 'a', 's', 'c',
+ 'i', 'i', ' ', 'q', 'u', 'e', 'r', 'y', '_', 'b', 'y', '_', 'n', 'a', 'm', 'e', ',',
+ 'U', '8', ' ', 'n', 'a', 'm', 'e', '_', 'f', 'm', 't', '_', 'v', 'e', 'r', 's', 'i',
+ 'o', 'n', '>', '(', '*', 'a', 's', 'c', 'i', 'i', ' ', 'n', 'a', 'm', 'e', '_', 'p',
+ 'r', 'e', 'f', 'i', 'x', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n',
+ 'c', 't', 'i', 'o', 'n', ' ', 'U', '8', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 's', 't', 'a', 't', 's', '_', 't', 'r', 'i', 'g', 'g', 'e', 'r', '#', '1', '(',
+ 'U', '8', ' ', 'r', 'e', 'a', 'd', '_', 'b', 'i', 'n', ',', 'U', '3', '2', ' ', 'r',
+ 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A',
+ ':', 'x', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ' ', 'r', 'e', 'a', 'd', '_',
+ 't', 'y', 'p', 'e', '*', 'a', 's', 'c', 'i', 'i', ' ', 's', 'p', 'o', 't', '_', 'g',
+ 'r', 'o', 'u', 'p', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c',
+ 't', 'i', 'o', 'n', ' ', 'U', '8', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'c', 'm', 'p', '_', 's', 't', 'a', 't', 's', '_', 't', 'r', 'i', 'g', 'g', 'e', 'r',
+ '#', '1', '(', 'B', '8', ' ', 'c', 'm', 'p', '_', 'r', 'e', 'a', 'd', '_', 'b', 'i',
+ 'n', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 't', 'a', 't', 's', ':',
+ 'q', 'u', 'a', 'l', '_', 't', 'y', 'p', 'e', ' ', 'q', 'u', 'a', 'l', '_', 'b', 'i',
+ 'n', ',', 'U', '3', '2', ' ', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'I', 'N',
+ 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'x', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p',
+ 'e', ' ', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', '*', 'a', 's', 'c', 'i', 'i',
+ ' ', 's', 'p', 'o', 't', '_', 'g', 'r', 'o', 'u', 'p', ')', ';', 'e', 'x', 't', 'e',
+ 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'U', '8', ' ', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'c', 'm', 'p', 'f', '_', 's', 't', 'a', 't', 's',
+ '_', 't', 'r', 'i', 'g', 'g', 'e', 'r', '#', '1', '(', 'B', '8', ' ', 'c', 'm', 'p',
+ '_', 'r', 'e', 'a', 'd', '_', 'b', 'i', 'n', ',', 'U', '3', '2', ' ', 's', 'p', 'o',
+ 't', '_', 'l', 'e', 'n', ',', 'U', '3', '2', ' ', 'r', 'e', 'a', 'd', '_', 'l', 'e',
+ 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'x', 'r', 'e', 'a', 'd',
+ '_', 't', 'y', 'p', 'e', ' ', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', '*', 'a',
+ 's', 'c', 'i', 'i', ' ', 's', 'p', 'o', 't', '_', 'g', 'r', 'o', 'u', 'p', ')', ';',
+ 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'U',
+ '8', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'p', 'h', 'r', 'e', 'd', '_',
+ 's', 't', 'a', 't', 's', '_', 't', 'r', 'i', 'g', 'g', 'e', 'r', '#', '1', '(', 'I',
+ 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e',
+ 'd', ' ', 'q', 'u', 'a', 'l', '_', 'b', 'i', 'n', ')', ';', 'e', 'x', 't', 'e', 'r',
+ 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':',
+ 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'b', 'i', 'o', '_', 's', 't', 'a', 'r', 't', '#', '1', '(', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'r', 'e',
+ 'a', 'd', '_', 's', 't', 'a', 'r', 't', ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R',
+ 'A', ':', 'x', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ' ', 'r', 'e', 'a', 'd',
+ '_', 't', 'y', 'p', 'e', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n',
+ 'c', 't', 'i', 'o', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'z', 'e', 'r', 'o', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'b', 'i',
+ 'o', '_', 'e', 'n', 'd', '#', '1', '<', 'b', 'o', 'o', 'l', ' ', 'i', 'n', 'c', 'l',
+ 'u', 's', 'i', 'v', 'e', '>', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'z', 'e', 'r', 'o', ' ', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't',
+ ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'x', 'r', 'e', 'a', 'd', '_',
+ 't', 'y', 'p', 'e', ' ', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ',', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 'r', 'e', 'a',
+ 'd', '_', 'l', 'e', 'n', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n',
+ 'c', 't', 'i', 'o', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'l', 'e', 'n', '[', '2', ']', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'f', 'i', 'x', '_', 'r', 'e', 'a', 'd', '_', 's', 'e', 'g', '#', '1', '(', 'U', '1',
+ '6', '[', '2', ']', ' ', 'r', 'd', '_', 's', 'e', 'g', ',', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 's', 'p', 'o', 't', '_', 'l',
+ 'e', 'n', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i',
+ 'o', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'S', 'p', 'o', 't', 'D',
+ 'e', 's', 'c', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'm', 'a', 'k', 'e',
+ '_', 's', 'p', 'o', 't', '_', 'd', 'e', 's', 'c', '#', '1', '(', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 's', 'p', 'o', 't', '_',
+ 'l', 'e', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l',
+ 'e', 'n', ' ', 'f', 'i', 'x', 'e', 'd', '_', 'l', 'e', 'n', ',', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 's', 'i', 'g', '_', 'l',
+ 'e', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e',
+ 'r', 'o', ' ', 't', 'r', 'i', 'm', '_', 's', 't', 'a', 'r', 't', ',', 'I', 'N', 'S',
+ 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 't', 'r', 'i', 'm',
+ '_', 'l', 'e', 'n', ',', 'U', '8', ' ', 'n', 'u', 'm', '_', 'r', 'e', 'a', 'd', 's',
+ ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n',
+ ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'R', 'e', 'a', 'd', 'D', 'e', 's',
+ 'c', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'm', 'a', 'k', 'e', '_', 'r',
+ 'e', 'a', 'd', '_', 'd', 'e', 's', 'c', '#', '1', '(', 'U', '8', ' ', 'n', 'u', 'm',
+ '_', 'r', 'e', 'a', 'd', 's', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'z', 'e', 'r', 'o', ' ', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't',
+ ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ',
+ 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R',
+ 'A', ':', 'x', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ' ', 'r', 'e', 'a', 'd',
+ '_', 't', 'y', 'p', 'e', ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r',
+ 'e', 'a', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', ' ', 'r', 'e', 'a', 'd', '_', 'f',
+ 'i', 'l', 't', ',', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x',
+ 't', ' ', 'c', 's', '_', 'k', 'e', 'y', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'l', 'a', 'b', 'e', 'l', '_', 's', 't',
+ 'a', 'r', 't', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l',
+ 'e', 'n', ' ', 'l', 'a', 'b', 'e', 'l', '_', 'l', 'e', 'n', ',', 'a', 's', 'c', 'i',
+ 'i', ' ', 'l', 'a', 'b', 'e', 'l', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f',
+ 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T',
+ ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'o', 't', 'a', 't', 'e', '#',
+ '1', '<', 'b', 'o', 'o', 'l', ' ', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '>', '(',
+ 'T', ' ', 'i', 'n', ',', 'U', '8', ' ', 'c', 'a', 'l', 'l', 'e', 'd', ')', ';', 'e',
+ 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't',
+ 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 's', 'w', 'a', 'p', '#', '1', '(', 'T', ' ', 'i', 'n', ',', 'U', '8', ' ', 'c', 'a',
+ 'l', 'l', 'e', 'd', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c',
+ 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', '#',
+ '1', '(', 'T', ' ', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y', ',', 'U', '8', ' ',
+ 'c', 'a', 'l', 'l', 'e', 'd', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u',
+ 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'n', 'o', 'r', 'm', 'a', 'l',
+ 'i', 'z', 'e', '#', '1', '(', 'T', ' ', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y',
+ ',', 'U', '8', ' ', 'c', 'a', 'l', 'l', 'e', 'd', ')', ';', 'e', 'x', 't', 'e', 'r',
+ 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '<', 't', 'y', 'p', 'e', ' ',
+ 'T', '>', 'T', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'm', 'a', 'k', 'e',
+ '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '#', '1', '<', 'T', ' ', 's', 't', 'a',
+ 'r', 't', '>', '(', 'a', 'n', 'y', ' ', 'b', 'a', 's', 'e', 's', ')', ';', 's', 'c',
+ 'h', 'e', 'm', 'a', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a',
+ 'm', 'p', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'f', 's', 'a', 'm',
+ 'p', '4', ':', 'd', 'e', 'c', 'o', 'd', 'e', '#', '2', '(', 'm', 'e', 'r', 'g', 'e',
+ 'd', '_', 'f', 'm', 't', ' ', 'i', 'n', ')', '{', 'f', 'z', 'i', 'p', '_', 'f', 'm',
+ 't', ' ', 'c', 'm', 'p', '0', '=', 's', 'p', 'l', 'i', 't', '#', '1', '<', '0', '>',
+ '(', 'i', 'n', ')', ';', 'f', 'z', 'i', 'p', '_', 'f', 'm', 't', ' ', 'c', 'm', 'p',
+ '1', '2', '3', '=', 's', 'p', 'l', 'i', 't', '#', '1', '<', '1', '>', '(', 'i', 'n',
+ ')', ';', 'F', '3', '2', ' ', 'c', 'h', '0', '=', 'f', 'u', 'n', 'z', 'i', 'p', '#',
+ '1', '(', 'c', 'm', 'p', '0', ')', ';', 'F', '3', '2', ' ', 'c', 'h', '1', '2', '3',
+ 'a', '=', 'f', 'u', 'n', 'z', 'i', 'p', '#', '1', '(', 'c', 'm', 'p', '1', '2', '3',
+ ')', ';', 'F', '3', '2', '[', '3', ']', ' ', 'c', 'h', '1', '2', '3', '=', 'r', 'e',
+ 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', '#', '1', '(', 'c', 'h', '1', '2', '3',
+ 'a', ')', ';', 'r', 'e', 't', 'u', 'r', 'n', ' ', '(', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4',
+ ')', '<', 'F', '3', '2', '>', 'p', 'a', 's', 't', 'e', '#', '1', '(', 'c', 'h', '0',
+ ',', 'c', 'h', '1', '2', '3', ')', ';', '}', 's', 'c', 'h', 'e', 'm', 'a', ' ', 'f',
+ 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'm', 'e', 'r', 'g', 'e', 'd', '_', 'f', 'm',
+ 't', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'f', 's', 'a', 'm', 'p', '4',
+ ':', 'e', 'n', 'c', 'o', 'd', 'e', '#', '2', '<', 'U', '3', '2', ' ', 'c', 'a', 'l',
+ 'l', 'e', 'd', ',', 'U', '3', '2', ' ', 'a', 'l', 't', '>', '(', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm',
+ 'p', '4', ' ', 'i', 'n', ')', '{', 'F', '3', '2', ' ', 'c', 'h', '0', '=', '<', 'F',
+ '3', '2', '>', 'c', 'u', 't', '#', '1', '<', '0', '>', '(', 'i', 'n', ')', ';', 'F',
+ '3', '2', '[', '3', ']', ' ', 'c', 'h', '1', '2', '3', '=', '<', 'F', '3', '2', '>',
+ 'c', 'u', 't', '#', '1', '<', '1', ',', '2', ',', '3', '>', '(', 'i', 'n', ')', ';',
+ 'f', 'z', 'i', 'p', '_', 'f', 'm', 't', ' ', 'c', 'm', 'p', '0', '=', 'f', 'z', 'i',
+ 'p', '#', '1', '<', 'c', 'a', 'l', 'l', 'e', 'd', '>', '(', 'c', 'h', '0', ')', ';',
+ 'F', '3', '2', ' ', 'c', 'h', '1', '2', '3', 'a', '=', 'r', 'e', 'd', 'i', 'm', 'e',
+ 'n', 's', 'i', 'o', 'n', '#', '1', '(', 'c', 'h', '1', '2', '3', ')', ';', 'f', 'z',
+ 'i', 'p', '_', 'f', 'm', 't', ' ', 'c', 'm', 'p', '1', '2', '3', '=', 'f', 'z', 'i',
+ 'p', '#', '1', '<', 'a', 'l', 't', '>', '(', 'c', 'h', '1', '2', '3', 'a', ')', ';',
+ 'r', 'e', 't', 'u', 'r', 'n', ' ', 'm', 'e', 'r', 'g', 'e', '#', '1', '(', 'c', 'm',
+ 'p', '0', ',', 'c', 'm', 'p', '1', '2', '3', ')', ';', '}', 'e', 'x', 't', 'e', 'r',
+ 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'U', '3', '2', '[', '3', ']',
+ ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'd',
+ 'y', 'n', 'a', 'm', 'i', 'c', '_', 'r', 'e', 'a', 'd', '_', 'd', 'e', 's', 'c', '#',
+ '1', '<', '*', 'U', '3', '2', ' ', 'e', 'd', 'i', 't', '_', 'd', 'i', 's', 't', 'a',
+ 'n', 'c', 'e', '>', '(', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5',
+ '4', '_', ':', 'd', 'r', 'd', 'p', 'a', 'r', 'a', 'm', '_', 's', 'e', 't', ' ', 's',
+ 'p', 'o', 't', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4',
+ '_', ':', 'd', 'r', 'd', 'p', 'a', 'r', 'a', 'm', '_', 's', 'e', 't', ' ', 'k', 'e',
+ 'y', '*', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':',
+ 'd', 'r', 'd', 'p', 'a', 'r', 'a', 'm', '_', 's', 'e', 't', ' ', 'l', 'i', 'n', 'k',
+ 'e', 'r', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i',
+ 'o', 'n', ' ', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n', ' ', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 't', 'o', 'k', 'e', 'n',
+ 'i', 'z', 'e', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', 'a',
+ 's', 'c', 'i', 'i', ' ', 'n', 'a', 'm', 'e', ')', ';', 'e', 'x', 't', 'e', 'r', 'n',
+ ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 't', 'e', 'x', 't', ':', 't', 'o',
+ 'k', 'e', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u',
+ 'm', 'i', 'n', 'a', ':', 't', 'o', 'k', 'e', 'n', 'i', 'z', 'e', '_', 's', 'p', 'o',
+ 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', 'a', 's', 'c', 'i', 'i', ' ', 'n', 'a',
+ 'm', 'e', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i',
+ 'o', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p',
+ 'e', 'd', '_', 'q', 'u', 'a', 'l', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'q', 'u', 'a', 'l', '4', '_', 'd', 'e', 'c', 'o', 'd', 'e', '#', '1', '(', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'n', 'c', 'o', 'd', 'e', 'd', '_', 'q',
+ 'u', 'a', 'l', '4', ' ', 'i', 'n', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f',
+ 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'e', 'n', 'c', 'o', 'd', 'e', 'd', '_', 'q', 'u', 'a', 'l', '4', ' ', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'q', 'u', 'a', 'l', '4', '_', 'e', 'n', 'c', 'o', 'd',
+ 'e', '#', '1', '(', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p',
+ 'p', 'e', 'd', '_', 'q', 'u', 'a', 'l', '4', ' ', 'i', 'n', ')', ';', 'e', 'x', 't',
+ 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 't', 'e', 'x', 't',
+ ':', 't', 'o', 'k', 'e', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'A',
+ 'B', 'I', ':', 't', 'o', 'k', 'e', 'n', 'i', 'z', 'e', '_', 's', 'p', 'o', 't', '_',
+ 'n', 'a', 'm', 'e', '#', '1', '(', 'a', 's', 'c', 'i', 'i', ' ', 'n', 'a', 'm', 'e',
+ ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n',
+ ' ', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'H', 'e', 'l', 'i', 'c', 'o', 's', ':', 't', 'o', 'k', 'e', 'n',
+ 'i', 'z', 'e', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', 'a',
+ 's', 'c', 'i', 'i', ' ', 'n', 'a', 'm', 'e', ')', ';', 'e', 'x', 't', 'e', 'r', 'n',
+ ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 't', 'e', 'x', 't', ':', 't', 'o',
+ 'k', 'e', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'o', 'n', 'T',
+ 'o', 'r', 'r', 'e', 'n', 't', ':', 't', 'o', 'k', 'e', 'n', 'i', 'z', 'e', '_', 's',
+ 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', 'a', 's', 'c', 'i', 'i', ' ',
+ 'n', 'a', 'm', 'e', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c',
+ 't', 'i', 'o', 'n', ' ', 'U', '3', '2', '[', '5', ']', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 's', 'e', 'g', '_', 'f', 'r', 'o', 'm',
+ '_', 'r', 'e', 'a', 'd', 'n', '#', '1', '(', 'U', '8', ' ', 'n', 'r', 'e', 'a', 'd',
+ 's', ',', 'U', '3', '2', ' ', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ')', ';', 'e',
+ 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 's',
+ 'c', 'i', 'i', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'e', 'w', 'r',
+ 'i', 't', 'e', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '<', 'I',
+ 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm',
+ '_', 'i', 'd', ' ', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '>', '(', 'a', 's', 'c',
+ 'i', 'i', ' ', 's', 'k', 'e', 'y', '*', 'a', 's', 'c', 'i', 'i', ' ', 'p', 'r', 'e',
+ 'f', 'i', 'x', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't',
+ 'i', 'o', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v',
+ 'a', 'l', '[', '*', ']', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'x',
+ 't', 'r', 'a', 'c', 't', '_', 'c', 'o', 'o', 'r', 'd', 'i', 'n', 'a', 't', 'e', 's',
+ '#', '1', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't',
+ 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '>',
+ '(', 'a', 's', 'c', 'i', 'i', ' ', 's', 'k', 'e', 'y', ')', ';', 'e', 'x', 't', 'e',
+ 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '_', '_', 'u', 'n', 't',
+ 'y', 'p', 'e', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5',
+ '4', '_', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd', '_', '0', '(', ')', ';', 'e', 'x',
+ 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'U', '1', '6',
+ ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'c', 'o', 'd', 'e', ':',
+ 'C', 'L', 'I', 'P', '#', '1', '(', 'o', 'p', 'a', 'q', 'u', 'e', ' ', 'i', 'n', ')',
+ ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'p', 'o', 's', '1', '6', ' ', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'c', 'o', 'd', 'e', ':', 'P', 'O', 'S',
+ 'I', 'T', 'I', 'O', 'N', '#', '1', '(', 'o', 'p', 'a', 'q', 'u', 'e', ' ', 'i', 'n',
+ ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd',
+ ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'c', 'o', 'd', 'e', ':',
+ 'R', 'E', 'A', 'D', '#', '1', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':',
+ 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'p', 'l', 'a', 't', 'f',
+ 'o', 'r', 'm', '>', '(', 'o', 'p', 'a', 'q', 'u', 'e', ' ', 'i', 'n', ')', ';', 'e',
+ 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n',
+ 'y', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'c', 'o', 'd', 'e',
+ ':', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '#', '1', '<', 'I', 'N', 'S', 'D', 'C', ':',
+ 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'p',
+ 'l', 'a', 't', 'f', 'o', 'r', 'm', '>', '(', 'o', 'p', 'a', 'q', 'u', 'e', ' ', 'i',
+ 'n', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o',
+ 'n', ' ', 'a', 'n', 'y', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e',
+ 'c', 'o', 'd', 'e', ':', 'S', 'I', 'G', 'N', 'A', 'L', '#', '1', '<', 'I', 'N', 'S',
+ 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i',
+ 'd', ' ', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '>', '(', 'o', 'p', 'a', 'q', 'u',
+ 'e', ' ', 'i', 'n', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c',
+ 't', 'i', 'o', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'p', 'o', 's',
+ '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_',
+ ':', 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n',
+ '#', '1', '(', 'U', '1', '6', ' ', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '*', 'I',
+ 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l',
+ 't', 'e', 'r', ' ', 'r', 'd', '_', 'f', 'i', 'l', 't', ',', 'N', 'C', 'B', 'I', ':',
+ 'i', 's', 'a', 'm', 'p', '1', ' ', 's', 'i', 'g', ')', ';', 'e', 'x', 't', 'e', 'r',
+ 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '_', '_', 'u', 'n', 't', 'y',
+ 'p', 'e', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4',
+ '_', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd', '_', '1', '_', '2', 'a', '(', ')', ';',
+ 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '_',
+ '_', 'u', 'n', 't', 'y', 'p', 'e', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', '_', '4', '5', '4', '_', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd', '_', '1', '_',
+ '2', 'b', '(', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't',
+ 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'd', 'e', 'c', 'o', 'd', 'e', ':', 'I', 'N', 'T', 'E', 'N', 'S', 'I', 'T', 'Y', '#',
+ '1', '(', 'o', 'p', 'a', 'q', 'u', 'e', ' ', 'i', 'n', ')', ';', 'e', 'x', 't', 'e',
+ 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'a', 'n', 'y', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'c', 'o', 'd', 'e', ':', 'N', 'O',
+ 'I', 'S', 'E', '#', '1', '(', 'o', 'p', 'a', 'q', 'u', 'e', ' ', 'i', 'n', ')', ';',
+ 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '_',
+ '_', 'u', 'n', 't', 'y', 'p', 'e', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd',
+ '_', '0', 'a', '(', ')', ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c',
+ 't', 'i', 'o', 'n', ' ', '_', '_', 'u', 'n', 't', 'y', 'p', 'e', 'd', ' ', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'u',
+ 'n', 't', 'y', 'p', 'e', 'd', '_', '0', 'b', '(', ')', ';', 'e', 'x', 't', 'e', 'r',
+ 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '_', '_', 'u', 'n', 't', 'y',
+ 'p', 'e', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u',
+ 'm', 'i', 'n', 'a', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd', '_', '1', 'a', '(', ')',
+ ';', 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_',
+ 'q', 'u', 'a', 'l', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'q', 'u',
+ 'a', 'l', '4', '_', 'd', 'e', 'c', 'o', 'm', 'p', 'r', 'e', 's', 's', '_', 'v', '1',
+ '#', '1', '(', 'a', 'n', 'y', ' ', 'i', 'n', ')', ';', 'e', 'x', 't', 'e', 'r', 'n',
+ ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '_', '_', 'u', 'n', 't', 'y', 'p',
+ 'e', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm',
+ 'i', 'n', 'a', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd', '_', '1', 'b', '(', ')', ';',
+ 'e', 'x', 't', 'e', 'r', 'n', ' ', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', '_',
+ '_', 'u', 'n', 't', 'y', 'p', 'e', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'A', 'B', 'I', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd', '_', '1', '(', ')', ';',
+ 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>',
+ 'T', ' ', 'i', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1',
+ '{', 'e', 'n', 'c', 'o', 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'i', 'z',
+ 'i', 'p', '#', '2', '.', '1', '(', '@', ')', ';', '}', 'd', 'e', 'c', 'o', 'd', 'e',
+ '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', '(', 'T', ')', 'i', 'u', 'n', 'z', 'i', 'p',
+ '#', '2', '.', '1', '(', '@', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a',
+ 'l', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'f', 'z', 'i', 'p', '_',
+ 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', '<', 'U', '3', '2', ' ', 'm', 'a',
+ 'n', 't', 'i', 's', 's', 'a', '>', '{', 'e', 'n', 'c', 'o', 'd', 'e', '{', 'r', 'e',
+ 't', 'u', 'r', 'n', ' ', 'f', 'z', 'i', 'p', '#', '1', '<', 'm', 'a', 'n', 't', 'i',
+ 's', 's', 'a', '>', '(', '@', ')', ';', '}', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'r',
+ 'e', 't', 'u', 'r', 'n', ' ', 'f', 'u', 'n', 'z', 'i', 'p', '#', '1', '(', '@', ')',
+ ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', '<', 't', 'y', 'p', 'e',
+ ' ', 'T', '>', 'T', ' ', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g',
+ '#', '1', '<', '*', 'I', '3', '2', ' ', 's', 't', 'r', 'a', 't', 'e', 'g', 'y', ',',
+ 'I', '3', '2', ' ', 'l', 'e', 'v', 'e', 'l', '>', '{', 'e', 'n', 'c', 'o', 'd', 'e',
+ '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'z', 'i', 'p', '#', '1', '<', 's', 't', 'r',
+ 'a', 't', 'e', 'g', 'y', ',', 'l', 'e', 'v', 'e', 'l', '>', '(', '@', ')', ';', '}',
+ 'd', 'e', 'c', 'o', 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'u', 'n', 'z',
+ 'i', 'p', '#', '1', '(', '@', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a',
+ 'l', ' ', 'b', 'o', 'o', 'l', ' ', 'b', 'o', 'o', 'l', '_', 'e', 'n', 'c', 'o', 'd',
+ 'i', 'n', 'g', '#', '1', '{', 'e', 'n', 'c', 'o', 'd', 'e', '{', 'U', '8', ' ', 'l',
+ 'i', 'm', '=', '<', 'U', '8', '>', 'c', 'l', 'i', 'p', '#', '1', '<', '0', ',', '1',
+ '>', '(', '@', ')', ';', 'B', '1', ' ', 'b', 'i', 't', '=', 'p', 'a', 'c', 'k', '#',
+ '1', '(', 'l', 'i', 'm', ')', ';', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'z', 'i', 'p',
+ '#', '1', '<', '3', ',', '1', '>', '(', 'b', 'i', 't', ')', ';', '}', 'd', 'e', 'c',
+ 'o', 'd', 'e', '{', 'B', '1', ' ', 'b', 'i', 't', '=', 'u', 'n', 'z', 'i', 'p', '#',
+ '1', '(', '@', ')', ';', 'r', 'e', 't', 'u', 'r', 'n', ' ', '(', 'b', 'o', 'o', 'l',
+ ')', 'u', 'n', 'p', 'a', 'c', 'k', '#', '1', '(', 'b', 'i', 't', ')', ';', '}', '}',
+ 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>',
+ 'T', ' ', 'd', 'e', 'l', 't', 'a', '_', 'i', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o',
+ 'd', 'i', 'n', 'g', '#', '1', '{', 'e', 'n', 'c', 'o', 'd', 'e', '{', 'T', ' ', 'd',
+ 'l', 't', '=', '<', 'T', '>', 'd', 'e', 'l', 't', 'a', '#', '1', '(', '@', ')', ';',
+ 'r', 'e', 't', 'u', 'r', 'n', ' ', 'i', 'z', 'i', 'p', '#', '2', '.', '1', '(', 'd',
+ 'l', 't', ')', ';', '}', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'T', ' ', 'd', 'l', 't',
+ '=', 'i', 'u', 'n', 'z', 'i', 'p', '#', '2', '.', '1', '(', '@', ')', ';', 'r', 'e',
+ 't', 'u', 'r', 'n', ' ', '<', 'T', '>', 'u', 'n', 'd', 'e', 'l', 't', 'a', '#', '1',
+ '(', 'd', 'l', 't', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ',
+ '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'd', 'e', 'l', 't', 'a', '_', 'z',
+ 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', '{', 'e', 'n', 'c',
+ 'o', 'd', 'e', '{', 'T', ' ', 'd', 'l', 't', '=', '<', 'T', '>', 'd', 'e', 'l', 't',
+ 'a', '#', '1', '(', '@', ')', ';', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'z', 'i', 'p',
+ '#', '1', '<', '3', ',', '1', '>', '(', 'd', 'l', 't', ')', ';', '}', 'd', 'e', 'c',
+ 'o', 'd', 'e', '{', 'T', ' ', 'd', 'l', 't', '=', 'u', 'n', 'z', 'i', 'p', '#', '1',
+ '(', '@', ')', ';', 'r', 'e', 't', 'u', 'r', 'n', ' ', '<', 'T', '>', 'u', 'n', 'd',
+ 'e', 'l', 't', 'a', '#', '1', '(', 'd', 'l', 't', ')', ';', '}', '}', 'p', 'h', 'y',
+ 's', 'i', 'c', 'a', 'l', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'd',
+ 'e', 'l', 't', 'a', '_', 'a', 'v', 'e', 'r', 'a', 'g', 'e', '_', 'z', 'i', 'p', '_',
+ 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', '{', 'e', 'n', 'c', 'o', 'd', 'e',
+ '{', 'd', 'e', 'l', 't', 'a', '_', 'a', 'v', 'e', 'r', 'a', 'g', 'e', 'd', '_', 'f',
+ 'm', 't', ' ', 't', '=', 'd', 'e', 'l', 't', 'a', '_', 'a', 'v', 'e', 'r', 'a', 'g',
+ 'e', '#', '1', '(', '@', ')', ';', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'z', 'i', 'p',
+ '#', '1', '<', '3', ',', '1', '>', '(', 't', ')', ';', '}', 'd', 'e', 'c', 'o', 'd',
+ 'e', '{', 'd', 'e', 'l', 't', 'a', '_', 'a', 'v', 'e', 'r', 'a', 'g', 'e', 'd', '_',
+ 'f', 'm', 't', ' ', 't', '=', 'u', 'n', 'z', 'i', 'p', '#', '1', '(', '@', ')', ';',
+ 'r', 'e', 't', 'u', 'r', 'n', ' ', 'u', 'n', 'd', 'e', 'l', 't', 'a', '_', 'a', 'v',
+ 'e', 'r', 'a', 'g', 'e', '#', '1', '(', 't', ')', ';', '}', '}', 'p', 'h', 'y', 's',
+ 'i', 'c', 'a', 'l', ' ', '<', 't', 'y', 'p', 'e', ' ', 'T', '>', 'T', ' ', 'b', 'z',
+ 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', '<', '*', 'U', '3',
+ '2', ' ', 'b', 'l', 'o', 'c', 'k', 'S', 'i', 'z', 'e', '1', '0', '0', 'k', ',', 'U',
+ '3', '2', ' ', 'w', 'o', 'r', 'k', 'F', 'a', 'c', 't', 'o', 'r', '>', '{', 'e', 'n',
+ 'c', 'o', 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'b', 'z', 'i', 'p', '#',
+ '1', '<', 'b', 'l', 'o', 'c', 'k', 'S', 'i', 'z', 'e', '1', '0', '0', 'k', ',', 'w',
+ 'o', 'r', 'k', 'F', 'a', 'c', 't', 'o', 'r', '>', '(', '@', ')', ';', '}', 'd', 'e',
+ 'c', 'o', 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'b', 'u', 'n', 'z', 'i',
+ 'p', '#', '1', '(', '@', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'e', 'n',
+ 'c', 'o', 'd', 'i', 'n', 'g', ':', 'C', 'L', 'I', 'P', '#', '2', '{', 'e', 'n', 'c',
+ 'o', 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'i', 'z', 'i', 'p', '#', '2',
+ '.', '1', '(', '@', ')', ';', '}', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'r', 'e', 't',
+ 'u', 'r', 'n', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'o', 'n', 'e', ')', 'i', 'u', 'n', 'z', 'i', 'p', '#', '2', '.', '1', '(', '@', ')',
+ ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'N', 'C', 'B', 'I', ':',
+ 'i', 's', 'a', 'm', 'p', '1', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_',
+ '4', '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'S', 'I', 'G',
+ 'N', 'A', 'L', '#', '2', '{', 'e', 'n', 'c', 'o', 'd', 'e', '{', 'r', 'e', 't', 'u',
+ 'r', 'n', ' ', 'i', 'z', 'i', 'p', '#', '2', '.', '1', '(', '@', ')', ';', '}', 'd',
+ 'e', 'c', 'o', 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', '(', 'N', 'C', 'B',
+ 'I', ':', 'i', 's', 'a', 'm', 'p', '1', ')', 'i', 'u', 'n', 'z', 'i', 'p', '#', '2',
+ '.', '1', '(', '@', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'o', 'n',
+ 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':',
+ 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ '#', '2', '{', 'e', 'n', 'c', 'o', 'd', 'e', '{', 'I', '3', '2', ' ', 'p', 'o', 's',
+ '_', '1', 's', 't', '_', 'd', 'e', 'r', 'i', 'v', '=', '<', 'I', '3', '2', '>', 'd',
+ 'e', 'r', 'i', 'v', '#', '1', '(', '@', ')', ';', 'r', 'e', 't', 'u', 'r', 'n', ' ',
+ 'i', 'z', 'i', 'p', '#', '2', '.', '1', '(', 'p', 'o', 's', '_', '1', 's', 't', '_',
+ 'd', 'e', 'r', 'i', 'v', ')', ';', '}', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'I', '3',
+ '2', ' ', 'p', 'o', 's', '_', '1', 's', 't', '_', 'd', 'e', 'r', 'i', 'v', '=', 'i',
+ 'u', 'n', 'z', 'i', 'p', '#', '2', '.', '1', '(', '@', ')', ';', 'r', 'e', 't', 'u',
+ 'r', 'n', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o',
+ 'n', ':', 'o', 'n', 'e', ')', '<', 'I', '3', '2', '>', 'i', 'n', 't', 'e', 'g', 'r',
+ 'a', 'l', '#', '1', '(', 'p', 'o', 's', '_', '1', 's', 't', '_', 'd', 'e', 'r', 'i',
+ 'v', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'q', 'u', 'a',
+ 'l', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'q', 'u', 'a', 'l', '4',
+ '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', '{', 'e', 'n', 'c', 'o', 'd',
+ 'e', '{', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'n', 'c', 'o', 'd', 'e',
+ 'd', '_', 'q', 'u', 'a', 'l', '4', ' ', 'e', 'n', 'c', 'o', 'd', 'e', 'd', '=', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'q', 'u', 'a', 'l', '4', '_', 'e', 'n', 'c',
+ 'o', 'd', 'e', '#', '1', '(', '@', ')', ';', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'z',
+ 'i', 'p', '#', '1', '<', '3', ',', '1', '>', '(', 'e', 'n', 'c', 'o', 'd', 'e', 'd',
+ ')', ';', '}', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'e', 'n', 'c', 'o', 'd', 'e', 'd', '_', 'q', 'u', 'a', 'l', '4', ' ', 'u',
+ 'n', 'z', 'i', 'p', 'p', 'e', 'd', '=', 'u', 'n', 'z', 'i', 'p', '#', '1', '(', '@',
+ ')', ';', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'q', 'u', 'a', 'l', '4', '_', 'd', 'e', 'c', 'o', 'd', 'e', '#', '1', '(', 'u',
+ 'n', 'z', 'i', 'p', 'p', 'e', 'd', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c',
+ 'a', 'l', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p',
+ 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i',
+ 'n', 'g', ':', 'S', 'I', 'G', 'N', 'A', 'L', '#', '2', '{', 'e', 'n', 'c', 'o', 'd',
+ 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'f', 's', 'a', 'm', 'p', '4', ':', 'e', 'n', 'c', 'o', 'd', 'e', '#', '2', '<',
+ '1', '4', ',', '1', '0', '>', '(', '@', ')', ';', '}', 'd', 'e', 'c', 'o', 'd', 'e',
+ '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'f', 's', 'a', 'm', 'p', '4', ':', 'd', 'e', 'c', 'o', 'd', 'e', '#', '2', '(', '@',
+ ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'N', 'C', 'B', 'I',
+ ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g',
+ ':', 'N', 'O', 'I', 'S', 'E', '#', '2', '{', 'e', 'n', 'c', 'o', 'd', 'e', '{', 'F',
+ '3', '2', ' ', 'n', 'c', 'm', 'p', '=', 'r', 'e', 'd', 'i', 'm', 'e', 'n', 's', 'i',
+ 'o', 'n', '#', '1', '(', '@', ')', ';', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'f', 'z',
+ 'i', 'p', '#', '1', '<', '1', '0', '>', '(', 'n', 'c', 'm', 'p', ')', ';', '}', 'd',
+ 'e', 'c', 'o', 'd', 'e', '{', 'F', '3', '2', ' ', 'd', 'c', 'm', 'p', '=', 'f', 'u',
+ 'n', 'z', 'i', 'p', '#', '1', '(', '@', ')', ';', 'r', 'e', 't', 'u', 'r', 'n', ' ',
+ 'r', 'e', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', '#', '1', '(', 'd', 'c', 'm',
+ 'p', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a',
+ 'm', 'p', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u',
+ 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'I', 'N', 'T',
+ 'E', 'N', 'S', 'I', 'T', 'Y', '#', '2', '{', 'e', 'n', 'c', 'o', 'd', 'e', '{', 'r',
+ 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'f', 's',
+ 'a', 'm', 'p', '4', ':', 'e', 'n', 'c', 'o', 'd', 'e', '#', '2', '<', '1', '4', ',',
+ '1', '0', '>', '(', '@', ')', ';', '}', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'r', 'e',
+ 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'f', 's', 'a',
+ 'm', 'p', '4', ':', 'd', 'e', 'c', 'o', 'd', 'e', '#', '2', '(', '@', ')', ';', '}',
+ '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'A', 'B', 'I', ':', 'e', 'n', 'c', 'o',
+ 'd', 'i', 'n', 'g', ':', 'S', 'I', 'G', 'N', 'A', 'L', '#', '2', '{', 'e', 'n', 'c',
+ 'o', 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'f', 's', 'a', 'm', 'p', '4', ':', 'e', 'n', 'c', 'o', 'd', 'e', '#',
+ '2', '<', '1', '4', ',', '1', '0', '>', '(', '@', ')', ';', '}', 'd', 'e', 'c', 'o',
+ 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'f', 's', 'a', 'm', 'p', '4', ':', 'd', 'e', 'c', 'o', 'd', 'e', '#', '2',
+ '(', '@', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'o', 'n', 'e', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'o', 'n', 'T', 'o', 'r', 'r', 'e',
+ 'n', 't', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'P', 'O', 'S', 'I', 'T',
+ 'I', 'O', 'N', '#', '1', '{', 'e', 'n', 'c', 'o', 'd', 'e', '{', 'I', '3', '2', ' ',
+ 'p', 'o', 's', '_', '1', 's', 't', '_', 'd', 'e', 'r', 'i', 'v', '=', '<', 'I', '3',
+ '2', '>', 'd', 'e', 'r', 'i', 'v', '#', '1', '(', '@', ')', ';', 'r', 'e', 't', 'u',
+ 'r', 'n', ' ', 'i', 'z', 'i', 'p', '#', '2', '.', '1', '(', 'p', 'o', 's', '_', '1',
+ 's', 't', '_', 'd', 'e', 'r', 'i', 'v', ')', ';', '}', 'd', 'e', 'c', 'o', 'd', 'e',
+ '{', 'I', '3', '2', ' ', 'p', 'o', 's', '_', '1', 's', 't', '_', 'd', 'e', 'r', 'i',
+ 'v', '=', 'i', 'u', 'n', 'z', 'i', 'p', '#', '2', '.', '1', '(', '@', ')', ';', 'r',
+ 'e', 't', 'u', 'r', 'n', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i',
+ 't', 'i', 'o', 'n', ':', 'o', 'n', 'e', ')', '<', 'I', '3', '2', '>', 'i', 'n', 't',
+ 'e', 'g', 'r', 'a', 'l', '#', '1', '(', 'p', 'o', 's', '_', '1', 's', 't', '_', 'd',
+ 'e', 'r', 'i', 'v', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ',
+ '_', '_', 'n', 'o', '_', 'h', 'e', 'a', 'd', 'e', 'r', ' ', 'U', '1', '6', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'e', 'n', 'c',
+ 'o', 'd', 'i', 'n', 'g', ':', 'C', 'L', 'I', 'P', '#', '1', '{', 'd', 'e', 'c', 'o',
+ 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'd', 'e', 'c', 'o', 'd', 'e', ':', 'C', 'L', 'I', 'P', '#', '1', '(', '@',
+ ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', '_', '_', 'n', 'o',
+ '_', 'h', 'e', 'a', 'd', 'e', 'r', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'p', 'o', 's', '1', '6', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4',
+ '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'P', 'O', 'S', 'I',
+ 'T', 'I', 'O', 'N', '#', '1', '{', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'r', 'e', 't',
+ 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'c', 'o',
+ 'd', 'e', ':', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N', '#', '1', '(', '@', ')', ';',
+ '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', '_', '_', 'n', 'o', '_', 'h',
+ 'e', 'a', 'd', 'e', 'r', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p',
+ 'a', 'c', 'k', 'e', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4',
+ '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'R', 'E', 'A', 'D',
+ '#', '1', '{', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'c', 'o', 'd', 'e', ':', 'R',
+ 'E', 'A', 'D', '#', '1', '<', '1', '>', '(', '@', ')', ';', '}', '}', 'p', 'h', 'y',
+ 's', 'i', 'c', 'a', 'l', ' ', '_', '_', 'n', 'o', '_', 'h', 'e', 'a', 'd', 'e', 'r',
+ ' ', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'n', '_', 'e',
+ 'n', 'c', 'o', 'd', 'e', 'd', ':', 'p', 'h', 'r', 'e', 'd', ' ', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i',
+ 'n', 'g', ':', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '#', '1', '{', 'd', 'e', 'c', 'o',
+ 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'd', 'e', 'c', 'o', 'd', 'e', ':', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '#',
+ '1', '<', '1', '>', '(', '@', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a',
+ 'l', ' ', '_', '_', 'n', 'o', '_', 'h', 'e', 'a', 'd', 'e', 'r', ' ', 'N', 'C', 'B',
+ 'I', ':', 'i', 's', 'a', 'm', 'p', '1', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', '_', '4', '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'S',
+ 'I', 'G', 'N', 'A', 'L', '#', '1', '{', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'r', 'e',
+ 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'c',
+ 'o', 'd', 'e', ':', 'S', 'I', 'G', 'N', 'A', 'L', '#', '1', '<', '1', '>', '(', '@',
+ ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', '_', '_', 'n', 'o',
+ '_', 'h', 'e', 'a', 'd', 'e', 'r', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a',
+ ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g',
+ ':', 'R', 'E', 'A', 'D', '#', '1', '{', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'r', 'e',
+ 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'c',
+ 'o', 'd', 'e', ':', 'R', 'E', 'A', 'D', '#', '1', '<', '2', '>', '(', '@', ')', ';',
+ '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', '_', '_', 'n', 'o', '_', 'h',
+ 'e', 'a', 'd', 'e', 'r', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'o',
+ 't', 'a', 't', 'e', 'd', '_', 'q', 'u', 'a', 'l', '4', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o',
+ 'd', 'i', 'n', 'g', ':', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '#', '1', '{', 'd', 'e',
+ 'c', 'o', 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'd', 'e', 'c', 'o', 'd', 'e', ':', 'Q', 'U', 'A', 'L', 'I', 'T',
+ 'Y', '#', '1', '<', '2', '>', '(', '@', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i',
+ 'c', 'a', 'l', ' ', '_', '_', 'n', 'o', '_', 'h', 'e', 'a', 'd', 'e', 'r', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e',
+ 'd', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i',
+ 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'Q', 'U', 'A', 'L', 'I',
+ 'T', 'Y', '2', '#', '1', '{', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'r', 'e', 't', 'u',
+ 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'c', 'o', 'd',
+ 'e', ':', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '#', '1', '<', '2', '>', '(', '@', ')',
+ ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', '_', '_', 'n', 'o', '_',
+ 'h', 'e', 'a', 'd', 'e', 'r', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r',
+ 'o', 't', 'a', 't', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', ' ', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n',
+ 'c', 'o', 'd', 'i', 'n', 'g', ':', 'S', 'I', 'G', 'N', 'A', 'L', '#', '1', '{', 'd',
+ 'e', 'c', 'o', 'd', 'e', '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'd', 'e', 'c', 'o', 'd', 'e', ':', 'S', 'I', 'G', 'N', 'A',
+ 'L', '#', '1', '<', '2', '>', '(', '@', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i',
+ 'c', 'a', 'l', ' ', '_', '_', 'n', 'o', '_', 'h', 'e', 'a', 'd', 'e', 'r', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'o', 't', 'a', 't', 'e', 'd', '_', 'f',
+ 's', 'a', 'm', 'p', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l',
+ 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'I',
+ 'N', 'T', 'E', 'N', 'S', 'I', 'T', 'Y', '#', '1', '{', 'd', 'e', 'c', 'o', 'd', 'e',
+ '{', 'r', 'e', 't', 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'd', 'e', 'c', 'o', 'd', 'e', ':', 'I', 'N', 'T', 'E', 'N', 'S', 'I', 'T', 'Y', '#',
+ '1', '(', '@', ')', ';', '}', '}', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', '_',
+ '_', 'n', 'o', '_', 'h', 'e', 'a', 'd', 'e', 'r', ' ', 'N', 'C', 'B', 'I', ':', 'f',
+ 's', 'a', 'm', 'p', '4', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l',
+ 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'N',
+ 'O', 'I', 'S', 'E', '#', '1', '{', 'd', 'e', 'c', 'o', 'd', 'e', '{', 'r', 'e', 't',
+ 'u', 'r', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd', 'e', 'c', 'o',
+ 'd', 'e', ':', 'N', 'O', 'I', 'S', 'E', '#', '1', '(', '@', ')', ';', '}', '}', 't',
+ 'a', 'b', 'l', 'e', ' ', 'I', 'N', 'S', 'D', 'C', ':', 't', 'b', 'l', ':', 's', 'e',
+ 'q', 'u', 'e', 'n', 'c', 'e', '#', '1', '.', '0', '.', '1', '{', 'd', 'e', 'f', 'a',
+ 'u', 'l', 't', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':',
+ 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'R', 'E', 'A', 'D', '{', 'r', 'e', 'a',
+ 'd', '=', 'o', 'u', 't', '_', 'd', 'n', 'a', '_', 't', 'e', 'x', 't', ';', 'v', 'a',
+ 'l', 'i', 'd', 'a', 't', 'e', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a',
+ ':', 't', 'e', 'x', 't', '>', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '#', '1', '(', 'i',
+ 'n', '_', 'd', 'n', 'a', '_', 't', 'e', 'x', 't', ',', 'o', 'u', 't', '_', 'd', 'n',
+ 'a', '_', 't', 'e', 'x', 't', ')', ';', '}', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', ' ', 'R', 'E', 'A', 'D',
+ ' ', '=', ' ', 'o', 'u', 't', '_', '4', 'n', 'a', '_', 'b', 'i', 'n', ';', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'p', 'a',
+ 'c', 'k', 'e', 'd', ' ', 'R', 'E', 'A', 'D', ' ', '=', ' ', 'o', 'u', 't', '_', '4',
+ 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', ' ', 'R', 'E',
+ 'A', 'D', ' ', '=', ' ', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n',
+ ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a',
+ ':', 'b', 'i', 'n', ' ', 'R', 'E', 'A', 'D', ' ', '=', ' ', 'o', 'u', 't', '_', '2',
+ 'n', 'a', '_', 'b', 'i', 'n', ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'R', 'E', 'A',
+ 'D', ' ', '=', ' ', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e',
+ 'd', ';', 'd', 'e', 'f', 'a', 'u', 'l', 't', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'l', 'o', 'r', ':', 't', 'e', 'x', 't', ' ',
+ 'C', 'S', 'R', 'E', 'A', 'D', '{', 'r', 'e', 'a', 'd', '=', 'o', 'u', 't', '_', 'c',
+ 'o', 'l', 'o', 'r', '_', 't', 'e', 'x', 't', ';', 'v', 'a', 'l', 'i', 'd', 'a', 't',
+ 'e', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'l', 'o', 'r', ':', 't', 'e',
+ 'x', 't', '>', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '#', '1', '(', 'i', 'n', '_', 'c',
+ 'o', 'l', 'o', 'r', '_', 't', 'e', 'x', 't', ',', 'o', 'u', 't', '_', 'c', 'o', 'l',
+ 'o', 'r', '_', 't', 'e', 'x', 't', ')', ';', '}', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'b', 'i', 'n', ' ', 'C', 'S',
+ 'R', 'E', 'A', 'D', ' ', '=', ' ', 'o', 'u', 't', '_', 'x', '2', 'c', 's', '_', 'b',
+ 'i', 'n', ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', '2',
+ 'c', 's', ':', 'b', 'i', 'n', ' ', 'C', 'S', 'R', 'E', 'A', 'D', ' ', '=', ' ', 'o',
+ 'u', 't', '_', '2', 'c', 's', '_', 'b', 'i', 'n', ';', 'c', 'o', 'l', 'u', 'm', 'n',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'p', 'a', 'c', 'k', 'e', 'd',
+ ' ', 'C', 'S', 'R', 'E', 'A', 'D', ' ', '=', ' ', 'o', 'u', 't', '_', '2', 'c', 's',
+ '_', 'p', 'a', 'c', 'k', 'e', 'd', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'b', 'o', 'o', 'l', ' ', 'C', 'S', '_', 'N', 'A',
+ 'T', 'I', 'V', 'E', ' ', '=', ' ', 'c', 's', '_', 'n', 'a', 't', 'i', 'v', 'e', ';',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':',
+ 't', 'e', 'x', 't', ' ', 'C', 'S', '_', 'K', 'E', 'Y', '{', 'r', 'e', 'a', 'd', '=',
+ 'o', 'u', 't', '_', 'c', 's', '_', 'k', 'e', 'y', ';', 'v', 'a', 'l', 'i', 'd', 'a',
+ 't', 'e', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x',
+ 't', '>', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '#', '1', '(', 'i', 'n', '_', 'c', 's',
+ '_', 'k', 'e', 'y', ',', 'o', 'u', 't', '_', 'c', 's', '_', 'k', 'e', 'y', ')', ';',
+ '}', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'U', '8', ' ', 'C', 'O', 'L', 'O', 'R', '_',
+ 'M', 'A', 'T', 'R', 'I', 'X', ' ', '=', ' ', 'o', 'u', 't', '_', 'c', 'o', 'l', 'o',
+ 'r', '_', 'm', 'a', 't', 'r', 'i', 'x', ';', 'd', 'e', 'f', 'a', 'u', 'l', 't', ' ',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l',
+ 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd', ' ', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y',
+ ' ', '=', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r', 'e', 'd',
+ ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a',
+ 'l', 'i', 't', 'y', ':', 't', 'e', 'x', 't', ':', 'p', 'h', 'r', 'e', 'd', '_', '3',
+ '3', ' ', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ' ', '=', ' ', 'o', 'u', 't', '_', 'q',
+ 'u', 'a', 'l', '_', 't', 'e', 'x', 't', '_', 'p', 'h', 'r', 'e', 'd', '_', '3', '3',
+ '|', '(', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 't',
+ 'e', 'x', 't', ':', 'p', 'h', 'r', 'e', 'd', '_', '3', '3', ')', '<', 'B', '8', '>',
+ 's', 'u', 'm', '#', '1', '<', '3', '3', '>', '(', 'o', 'u', 't', '_', 'q', 'u', 'a',
+ 'l', '_', 'p', 'h', 'r', 'e', 'd', ')', ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 't', 'e', 'x', 't',
+ ':', 'p', 'h', 'r', 'e', 'd', '_', '6', '4', ' ', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y',
+ ' ', '=', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 't', 'e', 'x', 't', '_',
+ 'p', 'h', 'r', 'e', 'd', '_', '6', '4', '|', '(', 'I', 'N', 'S', 'D', 'C', ':', 'q',
+ 'u', 'a', 'l', 'i', 't', 'y', ':', 't', 'e', 'x', 't', ':', 'p', 'h', 'r', 'e', 'd',
+ '_', '6', '4', ')', '<', 'B', '8', '>', 's', 'u', 'm', '#', '1', '<', '6', '4', '>',
+ '(', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r', 'e', 'd', ')', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 's',
+ 'i', 'g', 'n', 'a', 'l', '_', 'l', 'e', 'n', '=', '(', 'I', 'N', 'S', 'D', 'C', ':',
+ 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ')', 'r', 'o', 'w', '_', 'l', 'e', 'n',
+ '#', '1', '(', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l', ')', '|', '<', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', '>', 'e', 'c',
+ 'h', 'o', '#', '1', '<', '0', '>', '(', ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 't', 'b', 'l', ':', 'p', 'r', 'o', 't', 'e', 'i', 'n',
+ '#', '1', '{', 'd', 'e', 'f', 'a', 'u', 'l', 't', ' ', 'c', 'o', 'l', 'u', 'm', 'n',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'r', 'o', 't', 'e', 'i', 'n', ':', 't', 'e',
+ 'x', 't', ' ', 'P', 'R', 'O', 'T', 'E', 'I', 'N', '{', 'r', 'e', 'a', 'd', '=', 'o',
+ 'u', 't', '_', 'p', 'r', 'o', 't', 'e', 'i', 'n', '_', 't', 'e', 'x', 't', ';', 'v',
+ 'a', 'l', 'i', 'd', 'a', 't', 'e', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'r',
+ 'o', 't', 'e', 'i', 'n', ':', 't', 'e', 'x', 't', '>', 'c', 'o', 'm', 'p', 'a', 'r',
+ 'e', '#', '1', '(', 'i', 'n', '_', 'p', 'r', 'o', 't', 'e', 'i', 'n', '_', 't', 'e',
+ 'x', 't', ',', 'o', 'u', 't', '_', 'p', 'r', 'o', 't', 'e', 'i', 'n', '_', 't', 'e',
+ 'x', 't', ')', ';', '}', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C',
+ ':', 'a', 'a', ':', 'b', 'i', 'n', ' ', 'P', 'R', 'O', 'T', 'E', 'I', 'N', ' ', '=',
+ ' ', 'o', 'u', 't', '_', 'a', 'a', '_', 'b', 'i', 'n', ';', '}', 't', 'a', 'b', 'l',
+ 'e', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's',
+ 'p', 'o', 't', 'c', 'o', 'o', 'r', 'd', '#', '1', '{', 'd', 'e', 'f', 'a', 'u', 'l',
+ 't', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'X', ' ', '=', ' ', 'o', 'u', 't', '_', 'x',
+ '_', 'c', 'o', 'o', 'r', 'd', ';', 'd', 'e', 'f', 'a', 'u', 'l', 't', ' ', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'v', 'a', 'l', ' ', 'Y', ' ', '=', ' ', 'o', 'u', 't', '_', 'y', '_', 'c', 'o', 'o',
+ 'r', 'd', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm',
+ 'n', ' ', 'U', '1', '6', ' ', 'X', ' ', '=', ' ', 'c', 'a', 's', 't', '#', '1', '(',
+ 'x', '_', 'c', 'l', 'i', 'p', '_', 'U', '1', '6', ')', ';', 'r', 'e', 'a', 'd', 'o',
+ 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'U', '1', '6', ' ', 'Y', ' ',
+ '=', ' ', 'c', 'a', 's', 't', '#', '1', '(', 'y', '_', 'c', 'l', 'i', 'p', '_', 'U',
+ '1', '6', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v',
+ 'a', 'l', ' ', 'x', '_', 'c', 'l', 'i', 'p', '_', 'U', '1', '6', '=', '<', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', '>', 'c', 'l', 'i',
+ 'p', '#', '1', '<', '0', ',', '6', '5', '5', '3', '5', '>', '(', 'o', 'u', 't', '_',
+ 'x', '_', 'c', 'o', 'o', 'r', 'd', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'y', '_', 'c', 'l', 'i', 'p', '_', 'U', '1',
+ '6', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a',
+ 'l', '>', 'c', 'l', 'i', 'p', '#', '1', '<', '0', ',', '6', '5', '5', '3', '5', '>',
+ '(', 'o', 'u', 't', '_', 'y', '_', 'c', 'o', 'o', 'r', 'd', ')', ';', '}', 't', 'a',
+ 'b', 'l', 'e', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l',
+ ':', 's', 'p', 'o', 't', 'n', 'a', 'm', 'e', '#', '1', '.', '0', '.', '1', '=', 'I',
+ 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't',
+ 'c', 'o', 'o', 'r', 'd', '#', '1', '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'a', 's',
+ 'c', 'i', 'i', ' ', 'N', 'A', 'M', 'E', ' ', '=', ' ', '_', 'o', 'u', 't', '_', 'n',
+ 'a', 'm', 'e', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u',
+ 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't',
+ '_', 'i', 'd', 's', '_', 'f', 'o', 'u', 'n', 'd', ' ', 'S', 'P', 'O', 'T', '_', 'I',
+ 'D', 'S', '_', 'F', 'O', 'U', 'N', 'D', ' ', '=', ' ', 's', 'p', 'o', 't', '_', 'i',
+ 'd', 's', '_', 'f', 'o', 'u', 'n', 'd', ';', 'a', 's', 'c', 'i', 'i', ' ', '_', 'o',
+ 'u', 't', '_', 'n', 'a', 'm', 'e', '=', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A',
+ ':', 'f', 'o', 'r', 'm', 'a', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e',
+ '#', '1', '(', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e', '_', 'f', 'm', 't', ',', 'o',
+ 'u', 't', '_', 'x', '_', 'c', 'o', 'o', 'r', 'd', ',', 'o', 'u', 't', '_', 'y', '_',
+ 'c', 'o', 'o', 'r', 'd', ',', 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a',
+ 'm', 'e', ')', '|', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'f', 'o', 'r',
+ 'm', 'a', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', 'o',
+ 'u', 't', '_', 'n', 'a', 'm', 'e', '_', 'f', 'm', 't', ',', 'o', 'u', 't', '_', 'x',
+ '_', 'c', 'o', 'o', 'r', 'd', ',', 'o', 'u', 't', '_', 'y', '_', 'c', 'o', 'o', 'r',
+ 'd', ')', '|', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'f', 'o', 'r', 'm',
+ 'a', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 'n', 'o', '_', 'c',
+ 'o', 'o', 'r', 'd', '#', '1', '(', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e', '_', 'f',
+ 'm', 't', ')', '|', 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e',
+ ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A',
+ ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '#', '1', '.', '0',
+ '.', '2', '=', 'I', 'N', 'S', 'D', 'C', ':', 't', 'b', 'l', ':', 's', 'e', 'q', 'u',
+ 'e', 'n', 'c', 'e', '#', '1', '.', '0', '.', '1', '{', 'c', 'o', 'l', 'u', 'm', 'n',
+ ' ', 'U', '8', ' ', 'N', 'R', 'E', 'A', 'D', 'S', ' ', '=', ' ', 'o', 'u', 't', '_',
+ 'n', 'r', 'e', 'a', 'd', 's', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'l', 'e', 'n', ' ', 'S', 'P', 'O', 'T', '_', 'L', 'E', 'N', ' ', '=', ' ', 's',
+ 'p', 'o', 't', '_', 'l', 'e', 'n', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'l', 'e', 'n', ' ', 'F', 'I', 'X', 'E', 'D', '_', 'S', 'P', 'O', 'T', '_',
+ 'L', 'E', 'N', ' ', '=', ' ', 'f', 'i', 'x', 'e', 'd', '_', 's', 'p', 'o', 't', '_',
+ 'l', 'e', 'n', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u',
+ 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e',
+ 'r', 'o', ' ', 'T', 'R', 'I', 'M', '_', 'S', 'T', 'A', 'R', 'T', ' ', '=', ' ', 't',
+ 'r', 'i', 'm', '_', 's', 't', 'a', 'r', 't', '|', '<', 'I', 'N', 'S', 'D', 'C', ':',
+ 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', '>', 'e', 'c', 'h', 'o', '#', '1',
+ '<', '0', '>', '(', ')', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'o', 'n', 'e', ' ', 'T', 'R', 'I', 'M', '_', 'S', 'T', 'A', 'R', 'T', ' ', '=', ' ',
+ '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ')',
+ '<', 'I', '3', '2', '>', 's', 'u', 'm', '#', '1', '<', '1', '>', '(', 't', 'r', 'i',
+ 'm', '_', 's', 't', 'a', 'r', 't', ')', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '1',
+ '>', '(', ')', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u',
+ 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e',
+ 'n', ' ', 'T', 'R', 'I', 'M', '_', 'L', 'E', 'N', ' ', '=', ' ', 't', 'r', 'i', 'm',
+ '_', 'l', 'e', 'n', '|', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ';', 'c', 'o', 'l',
+ 'u', 'm', 'n', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'L', 'A', 'B', 'E', 'L', ' ', '=',
+ ' ', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', ';', 'c', 'o', 'l', 'u', 'm', 'n',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o',
+ ' ', 'L', 'A', 'B', 'E', 'L', '_', 'S', 'T', 'A', 'R', 'T', ' ', '=', ' ', 'o', 'u',
+ 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 's', 't', 'a', 'r', 't', ';', 'c', 'o', 'l',
+ 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l',
+ 'e', 'n', ' ', 'L', 'A', 'B', 'E', 'L', '_', 'L', 'E', 'N', ' ', '=', ' ', 'o', 'u',
+ 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 'l', 'e', 'n', ';', 'r', 'e', 'a', 'd', 'o',
+ 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'U', '1', '6', ' ', 'L', 'A',
+ 'B', 'E', 'L', '_', 'S', 'T', 'A', 'R', 'T', ' ', '=', ' ', 'c', 'a', 's', 't', '#',
+ '1', '(', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 's', 't', 'a', 'r', 't',
+ ')', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n',
+ ' ', 'U', '1', '6', ' ', 'L', 'A', 'B', 'E', 'L', '_', 'L', 'E', 'N', ' ', '=', ' ',
+ 'c', 'a', 's', 't', '#', '1', '(', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_',
+ 'l', 'e', 'n', ')', ';', 'd', 'e', 'f', 'a', 'u', 'l', 't', ' ', 'c', 'o', 'l', 'u',
+ 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'x', 'r', 'e', 'a',
+ 'd', '_', 't', 'y', 'p', 'e', ' ', 'R', 'E', 'A', 'D', '_', 'T', 'Y', 'P', 'E', ' ',
+ '=', ' ', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ';', 'r',
+ 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e',
+ ' ', 'R', 'E', 'A', 'D', '_', 'T', 'Y', 'P', 'E', ' ', '=', ' ', 'o', 'u', 't', '_',
+ 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', '|', '<', 'I', 'N', 'S', 'D', 'C', ':',
+ 'S', 'R', 'A', ':', 'x', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ',', 'I', 'N',
+ 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e',
+ '>', 'm', 'a', 'p', '#', '1', '<', '[', '0', ',', '1', ',', '2', ',', '3', ',', '4',
+ ',', '5', ',', '6', ',', '7', ']', ',', '[', '0', ',', '1', ',', '0', ',', '1', ',',
+ '0', ',', '1', ',', '0', ',', '1', ']', '>', '(', 'o', 'u', 't', '_', 'r', 'e', 'a',
+ 'd', '_', 't', 'y', 'p', 'e', ')', ';', 'd', 'e', 'f', 'a', 'u', 'l', 't', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'z', 'e', 'r', 'o', ' ', 'R', 'E', 'A', 'D', '_', 'S', 'T', 'A', 'R', 'T', ' ',
+ '=', ' ', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', ';',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'o', 'n', 'e', ' ', 'R', 'E', 'A', 'D', '_', 'S', 'T', 'A', 'R', 'T', ' ',
+ '=', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n',
+ 'e', ')', '<', 'I', '3', '2', '>', 's', 'u', 'm', '#', '1', '<', '1', '>', '(', 'o',
+ 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', ')', ';', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'l', 'e', 'n', ' ', 'R', 'E', 'A', 'D', '_', 'L', 'E', 'N', ' ', '=', ' ', 'o', 'u',
+ 't', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ';', 'r', 'e', 'a', 'd', 'o', 'n',
+ 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'U', '1', '6', ' ', 'R', 'E', 'A',
+ 'D', '_', 'S', 'T', 'A', 'R', 'T', ' ', '=', ' ', 'c', 'a', 's', 't', '#', '1', '(',
+ 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', ')', ';', 'r',
+ 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'U', '1',
+ '6', ' ', 'R', 'E', 'A', 'D', '_', 'L', 'E', 'N', ' ', '=', ' ', 'c', 'a', 's', 't',
+ '#', '1', '(', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ')', ';',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':',
+ 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', ' ', 'R', 'E', 'A', 'D', '_',
+ 'F', 'I', 'L', 'T', 'E', 'R', ' ', '=', ' ', 'o', 'u', 't', '_', 'r', 'd', '_', 'f',
+ 'i', 'l', 't', 'e', 'r', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':',
+ 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', '>', 'e', 'c', 'h', 'o', '#',
+ '1', '<', '0', '>', '(', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a',
+ 'r', 't', ')', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u',
+ 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd',
+ '_', 'f', 'i', 'l', 't', 'e', 'r', ' ', 'R', 'D', '_', 'F', 'I', 'L', 'T', 'E', 'R',
+ ' ', '=', ' ', 'o', 'u', 't', '_', 'r', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'x', 'r', 'e', 'a', 'd', '_', 't',
+ 'y', 'p', 'e', ' ', 'i', 'n', '_', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', '=',
+ 'R', 'E', 'A', 'D', '_', 'T', 'Y', 'P', 'E', '|', '_', 'a', 'l', 't', '_', 'i', 'n',
+ '_', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ';', 'I', 'N', 'S', 'D', 'C', ':',
+ 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 'i', 'n', '_', 'r', 'e', 'a', 'd',
+ '_', 'l', 'e', 'n', '=', 'R', 'E', 'A', 'D', '_', 'L', 'E', 'N', '|', '_', 'a', 'l',
+ 't', '_', 'i', 'n', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ';', 'I', 'N', 'S',
+ 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 's', 'p', 'o', 't',
+ '_', 'l', 'e', 'n', '=', 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '_', 's',
+ 'p', 'o', 't', '_', 'l', 'e', 'n', '|', 'c', 'o', 'l', 'o', 'r', '_', 's', 'p', 'a',
+ 'c', 'e', '_', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', '|', 'a', 'l', 'i', 'g', 'n',
+ '_', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 'f', 'i', 'x', 'e', 'd', '_', 's', 'p',
+ 'o', 't', '_', 'l', 'e', 'n', '=', 's', 't', 'a', 't', 'i', 'c', '_', 'f', 'i', 'x',
+ 'e', 'd', '_', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', '|', 'b', 'a', 's', 'e', '_',
+ 's', 'p', 'a', 'c', 'e', '_', 'f', 'i', 'x', 'e', 'd', '_', 's', 'p', 'o', 't', '_',
+ 'l', 'e', 'n', '|', 'c', 'o', 'l', 'o', 'r', '_', 's', 'p', 'a', 'c', 'e', '_', 'f',
+ 'i', 'x', 'e', 'd', '_', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ';', '}', 't', 'a',
+ 'b', 'l', 'e', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l',
+ ':', 's', 't', 'a', 't', 's', '#', '1', '.', '1', '{', 'r', 'e', 'a', 'd', 'o', 'n',
+ 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S',
+ 'R', 'A', ':', 's', 'p', 'o', 't', 'i', 'd', '_', 't', ' ', 'M', 'I', 'N', '_', 'S',
+ 'P', 'O', 'T', '_', 'I', 'D', ' ', '=', ' ', 'm', 'i', 'n', '_', 's', 'p', 'o', 't',
+ '_', 'i', 'd', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p',
+ 'o', 't', 'i', 'd', '_', 't', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '1', '>', '(',
+ ')', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't', 'i', 'd',
+ '_', 't', ' ', 'M', 'A', 'X', '_', 'S', 'P', 'O', 'T', '_', 'I', 'D', ' ', '=', ' ',
+ 'm', 'a', 'x', '_', 's', 'p', 'o', 't', '_', 'i', 'd', '|', 'c', 'a', 's', 't', '#',
+ '1', '(', 's', 'p', 'o', 't', '_', 'c', 'o', 'u', 'n', 't', ')', ';', 'r', 'e', 'a',
+ 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'U', '6', '4', ' ',
+ 'S', 'P', 'O', 'T', '_', 'C', 'O', 'U', 'N', 'T', ' ', '=', ' ', 's', 'p', 'o', 't',
+ '_', 'c', 'o', 'u', 'n', 't', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'U', '6', '4', ' ', 'B', 'A', 'S', 'E', '_', 'C', 'O',
+ 'U', 'N', 'T', ' ', '=', ' ', 'b', 'a', 's', 'e', '_', 'c', 'o', 'u', 'n', 't', ';',
+ 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'U',
+ '6', '4', ' ', 'B', 'I', 'O', '_', 'B', 'A', 'S', 'E', '_', 'C', 'O', 'U', 'N', 'T',
+ ' ', '=', ' ', 'b', 'i', 'o', '_', 'b', 'a', 's', 'e', '_', 'c', 'o', 'u', 'n', 't',
+ ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ 'U', '6', '4', ' ', 'C', 'M', 'P', '_', 'B', 'A', 'S', 'E', '_', 'C', 'O', 'U', 'N',
+ 'T', ' ', '=', ' ', 'c', 'm', 'p', '_', 'b', 'a', 's', 'e', '_', 'c', 'o', 'u', 'n',
+ 't', '|', 'b', 'a', 's', 'e', '_', 'c', 'o', 'u', 'n', 't', ';', 'U', '8', ' ', 's',
+ 't', 'a', 't', 's', '_', 'd', 'u', 'm', 'm', 'y', '=', 'i', 'n', '_', 's', 't', 'a',
+ 't', 's', '_', 'b', 'i', 'n', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a', '#', '1', '.',
+ '0', '.', '3', '=', 'I', 'N', 'S', 'D', 'C', ':', 't', 'b', 'l', ':', 's', 'e', 'q',
+ 'u', 'e', 'n', 'c', 'e', '#', '1', '.', '0', '.', '1', ',', 'I', 'N', 'S', 'D', 'C',
+ ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'n', 'a', 'm', 'e',
+ '#', '1', '.', '0', '.', '1', ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':',
+ 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '#', '1', '.', '0', '.',
+ '2', ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's',
+ 't', 'a', 't', 's', '#', '1', '.', '1', '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm',
+ '_', 'i', 'd', ' ', 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M', ' ', '=', ' ', '.', 'P',
+ 'L', 'A', 'T', 'F', 'O', 'R', 'M', '|', 'o', 'u', 't', '_', 'p', 'l', 'a', 't', 'f',
+ 'o', 'r', 'm', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u',
+ 'm', 'n', ' ', 'a', 's', 'c', 'i', 'i', ' ', 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M',
+ ' ', '=', ' ', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'n', 'a', 'm', 'e', ';',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':',
+ 's', 'p', 'o', 't', 'i', 'd', '_', 't', ' ', 'S', 'P', 'O', 'T', '_', 'I', 'D', ' ',
+ '=', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't',
+ 'i', 'd', '_', 't', '>', 'a', 'd', 'd', '_', 'r', 'o', 'w', '_', 'i', 'd', '#', '1',
+ '(', '.', 'S', 'P', 'O', 'T', '_', 'I', 'D', ')', '|', 'c', 'a', 's', 't', '#', '1',
+ '(', 'r', 'o', 'w', 'i', 'd', '_', '6', '4', ')', ';', 'c', 'o', 'l', 'u', 'm', 'n',
+ ' ', 'a', 's', 'c', 'i', 'i', ' ', 'S', 'P', 'O', 'T', '_', 'G', 'R', 'O', 'U', 'P',
+ ' ', '=', ' ', 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'g', 'r', 'o', 'u', 'p',
+ '|', '.', 'S', 'P', 'O', 'T', '_', 'G', 'R', 'O', 'U', 'P', '|', '<', 'a', 's', 'c',
+ 'i', 'i', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '\'', '\'', '>', '(', ')', ';',
+ 'I', '6', '4', ' ', 'r', 'o', 'w', 'i', 'd', '_', '6', '4', '=', 'r', 'o', 'w', '_',
+ 'i', 'd', '#', '1', '(', ')', ';', 'a', 's', 'c', 'i', 'i', ' ', 'i', 'n', '_', 's',
+ 'p', 'o', 't', '_', 'g', 'r', 'o', 'u', 'p', '=', 'S', 'P', 'O', 'T', '_', 'G', 'R',
+ 'O', 'U', 'P', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u',
+ 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a',
+ 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o',
+ 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M', '=',
+ 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l',
+ ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R',
+ 'A', ':', 's', 'p', 'o', 't', 'i', 'd', '_', 't', '>', 'i', 'z', 'i', 'p', '_', 'e',
+ 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'S', 'P', 'O', 'T', '_', 'I',
+ 'D', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't',
+ 'i', 'd', '_', 't', '>', 's', 'u', 'b', '_', 'r', 'o', 'w', '_', 'i', 'd', '#', '1',
+ '(', 'S', 'P', 'O', 'T', '_', 'I', 'D', ')', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a',
+ 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'a', 's', 'c', 'i', 'i', '>', 'z',
+ 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', '<', '0', ',', '1',
+ '>', ' ', '.', 'S', 'P', 'O', 'T', '_', 'G', 'R', 'O', 'U', 'P', '=', 'i', 'n', '_',
+ 's', 'p', 'o', 't', '_', 'g', 'r', 'o', 'u', 'p', ';', '}', 't', 'a', 'b', 'l', 'e',
+ ' ', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'n', '_', 'e', 'n', 'c', 'o', 'd',
+ 'i', 'n', 'g', '#', '1', '{', 'U', '8', ' ', 'n', '_', 'e', 'n', 'c', 'o', 'd', 'i',
+ 'n', 'g', '_', 'd', 'u', 'm', 'm', 'y', '=', 'r', 'e', 'a', 'd', '_', 'u', 'n', 'p',
+ 'a', 'c', 'k', '|', 'r', 'e', 'a', 'd', '_', 'n', 'd', 'e', 'c', 'o', 'd', 'e', ';',
+ '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 's',
+ 'e', 'q', 'l', 'o', 'c', '#', '1', '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'a',
+ 's', 'c', 'i', 'i', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g',
+ '#', '1', ' ', 'S', 'E', 'Q', '_', 'I', 'D', ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', '>',
+ 'i', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', 'S',
+ 'E', 'Q', '_', 'S', 'T', 'A', 'R', 'T', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y',
+ ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'S', 'E', 'Q', '_', 'S', 'T', 'A', 'R', 'T',
+ ' ', '=', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z',
+ 'e', 'r', 'o', ')', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'o', 'n', 'e', '>', 'd', 'i', 'f', 'f', '#', '1', '<', '1', '>', '(', '.', 'S', 'E',
+ 'Q', '_', 'S', 'T', 'A', 'R', 'T', ')', ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', '>', 'i',
+ 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', 'S', 'E',
+ 'Q', '_', 'L', 'E', 'N', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I',
+ ':', 't', 'b', 'l', ':', 'd', 'c', 'm', 'p', '_', 'b', 'a', 's', 'e', '_', 's', 'p',
+ 'a', 'c', 'e', '#', '1', '{', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't',
+ 'e', 'x', 't', ' ', 'd', 'c', 'm', 'p', '_', 'v', 'i', 'r', 't', 'u', 'a', 'l', '_',
+ 'p', 'r', 'o', 'd', 'u', 'c', 't', 'i', 'o', 'n', 's', '=', 'o', 'u', 't', '_', 'd',
+ 'c', 'm', 'p', '_', '4', 'n', 'a', '_', 'b', 'i', 'n', '|', 'o', 'u', 't', '_', 'd',
+ 'c', 'm', 'p', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', '|', 'o', 'u', 't', '_',
+ 'd', 'c', 'm', 'p', '_', '2', 'n', 'a', '_', 'b', 'i', 'n', '|', 'o', 'u', 't', '_',
+ 'd', 'c', 'm', 'p', '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', ';', '}',
+ 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'b', 'a',
+ 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '_', 'c', 'o', 'm', 'm', 'o', 'n', '#', '1',
+ '.', '0', '.', '3', '=', 'I', 'N', 'S', 'D', 'C', ':', 't', 'b', 'l', ':', 's', 'e',
+ 'q', 'u', 'e', 'n', 'c', 'e', '#', '1', '.', '0', '.', '1', ',', 'I', 'N', 'S', 'D',
+ 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'd', 'e', 's',
+ 'c', '#', '1', '.', '0', '.', '2', ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A',
+ ':', 't', 'b', 'l', ':', 's', 't', 'a', 't', 's', '#', '1', '.', '1', ',', 'N', 'C',
+ 'B', 'I', ':', 't', 'b', 'l', ':', 'd', 'c', 'm', 'p', '_', 'b', 'a', 's', 'e', '_',
+ 's', 'p', 'a', 'c', 'e', '#', '1', '{', 'b', 'o', 'o', 'l', ' ', 'c', 's', '_', 'n',
+ 'a', 't', 'i', 'v', 'e', '=', '<', 'b', 'o', 'o', 'l', '>', 'e', 'c', 'h', 'o', '#',
+ '1', '<', 'f', 'a', 'l', 's', 'e', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':',
+ 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'o', 'u', 't', '_', 'c', 's', '_', 'k',
+ 'e', 'y', '=', '.', 'C', 'S', '_', 'K', 'E', 'Y', '|', '<', 'I', 'N', 'S', 'D', 'C',
+ ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'e', 'c', 'h', 'o', '#', '1', '<',
+ '\'', 'T', '\'', '>', '(', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 't', 'y',
+ 'p', 'e', ')', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e',
+ 'x', 't', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '\'', 'T', '\'', '>', '(', 'o',
+ 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ')', '|', '<', 'I', 'N', 'S',
+ 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'e', 'c', 'h', 'o', '#',
+ '1', '<', '\'', 'T', '\'', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '2',
+ 'c', 's', ':', 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', '2', 'c', 's', '_', 'b', 'i',
+ 'n', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'b', 'i', 'n',
+ ',', 'I', 'N', 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'b', 'i', 'n', '>', 'm', 'a',
+ 'p', '#', '1', '<', '[', '0', ',', '1', ',', '2', ',', '3', ',', '4', ']', ',', '[',
+ '0', ',', '1', ',', '2', ',', '3', ',', '0', ']', '>', '(', 'o', 'u', 't', '_', 'x',
+ '2', 'c', 's', '_', 'b', 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n',
+ 'a', ':', 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'b', 'i', 'n',
+ '=', 'o', 'u', 't', '_', 'd', 'c', 'm', 'p', '_', '2', 'n', 'a', '_', 'b', 'i', 'n',
+ '|', '(', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'b', 'i', 'n', ')', 'u',
+ 'n', 'p', 'a', 'c', 'k', '#', '1', '(', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'p',
+ 'a', 'c', 'k', 'e', 'd', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's',
+ ':', 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', 'x', '2', 'c', 's', '_', 'b', 'i', 'n',
+ '=', 'N', 'C', 'B', 'I', ':', 'c', 'o', 'l', 'o', 'r', '_', 'f', 'r', 'o', 'm', '_',
+ 'd', 'n', 'a', '#', '1', '(', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i',
+ 'n', ',', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', ',',
+ 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'o', 'u', 't', '_',
+ 'c', 's', '_', 'k', 'e', 'y', ',', 'o', 'u', 't', '_', 'c', 'o', 'l', 'o', 'r', '_',
+ 'm', 'a', 't', 'r', 'i', 'x', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '2', 'c', 's',
+ ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'o', 'u', 't', '_', '2', 'c', 's', '_', 'p',
+ 'a', 'c', 'k', 'e', 'd', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', '2', 'c', 's', ':',
+ 'p', 'a', 'c', 'k', 'e', 'd', ')', 'p', 'a', 'c', 'k', '#', '1', '(', 'o', 'u', 't',
+ '_', '2', 'c', 's', '_', 'b', 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '4',
+ 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'o', 'u', 't', '_', '4', 'n', 'a',
+ '_', 'p', 'a', 'c', 'k', 'e', 'd', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n',
+ 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ')', 'p', 'a', 'c', 'k', '#', '1', '(', 'o',
+ 'u', 't', '_', '4', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'l', 'o', 'r', ':', 't', 'e', 'x', 't', ' ', 'o', 'u', 't', '_', 'c',
+ 'o', 'l', 'o', 'r', '_', 't', 'e', 'x', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':',
+ 'x', '2', 'c', 's', ':', 'b', 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'l', 'o', 'r', ':', 't', 'e', 'x', 't', '>', 'm', 'a', 'p', '#', '1', '<', '[', '0',
+ ',', '1', ',', '2', ',', '3', ',', '4', ']', ',', '\'', '0', '1', '2', '3', '.',
+ '\'', '>', '(', 'o', 'u', 't', '_', 'x', '2', 'c', 's', '_', 'b', 'i', 'n', ')',
+ ';', 'U', '8', ' ', 'o', 'u', 't', '_', 'c', 'o', 'l', 'o', 'r', '_', 'm', 'a', 't',
+ 'r', 'i', 'x', '=', '<', 'U', '8', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '[', '0',
+ ',', '1', ',', '2', ',', '3', ',', '4', ',', '1', ',', '0', ',', '3', ',', '2', ',',
+ '4', ',', '2', ',', '3', ',', '0', ',', '1', ',', '4', ',', '3', ',', '2', ',', '1',
+ ',', '0', ',', '4', ',', '4', ',', '4', ',', '4', ',', '4', ',', '4', ']', '>', '(',
+ ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n',
+ ' ', 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '_', 's', 'p', 'o', 't', '_',
+ 'l', 'e', 'n', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'l', 'e', 'n', ')', 'r', 'o', 'w', '_', 'l', 'e', 'n', '#', '1', '(', 'o', 'u', 't',
+ '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', ')', ';', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 'b', 'a', 's', 'e', '_',
+ 's', 'p', 'a', 'c', 'e', '_', 'f', 'i', 'x', 'e', 'd', '_', 's', 'p', 'o', 't', '_',
+ 'l', 'e', 'n', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'l', 'e', 'n', ')', 'f', 'i', 'x', 'e', 'd', '_', 'r', 'o', 'w', '_', 'l', 'e', 'n',
+ '#', '1', '(', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd',
+ ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l',
+ ':', 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '_', 'n', 'o', 'c', 'o', 'l',
+ '#', '1', '.', '0', '.', '3', '=', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'b',
+ 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '_', 'c', 'o', 'm', 'm', 'o', 'n', '#',
+ '1', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'n', '_',
+ 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', '{', 'I', 'N', 'S', 'D', 'C', ':',
+ 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'o', 'u', 't', '_', 'd', 'n', 'a', '_',
+ 't', 'e', 'x', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':',
+ 'b', 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x',
+ 't', '>', 'm', 'a', 'p', '#', '1', '<', '[', '0', ',', '1', ',', '2', ',', '3', ',',
+ '4', ']', ',', '\'', 'A', 'C', 'G', 'T', 'N', '\'', '>', '(', 'o', 'u', 't', '_',
+ 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '4',
+ 'n', 'a', ':', 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', '4', 'n', 'a', '_', 'b', 'i',
+ 'n', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n',
+ ',', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', '>', 'm', 'a',
+ 'p', '#', '1', '<', '[', '0', ',', '1', ',', '2', ',', '3', ',', '4', ']', ',', '[',
+ '1', ',', '2', ',', '4', ',', '8', ',', '1', '5', ']', '>', '(', 'o', 'u', 't', '_',
+ 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'x',
+ '2', 'n', 'a', ':', 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_',
+ 'b', 'i', 'n', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b',
+ 'i', 'n', ')', 'r', 'e', 'a', 'd', '_', 'n', 'd', 'e', 'c', 'o', 'd', 'e', ';', 'U',
+ '8', ' ', 'r', 'e', 'a', 'd', '_', 'u', 'n', 'p', 'a', 'c', 'k', '=', 'o', 'u', 't',
+ '_', '2', 'n', 'a', '_', 'b', 'i', 'n', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N',
+ 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c',
+ 'e', '#', '1', '.', '0', '.', '3', '=', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':',
+ 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '_', 'n', 'o', 'c', 'o', 'l', '#',
+ '1', '.', '0', '.', '3', '{', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p',
+ 'a', 'c', 'k', 'e', 'd', ' ', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'p', 'a', 'c',
+ 'k', 'e', 'd', '=', '.', 'R', 'E', 'A', 'D', ';', '}', 't', 'a', 'b', 'l', 'e', ' ',
+ 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'b', 'a', 's', 'e', '_', 's', 'p', 'a',
+ 'c', 'e', '#', '2', '.', '0', '.', '3', '=', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l',
+ ':', 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '_', 'c', 'o', 'm', 'm', 'o',
+ 'n', '#', '1', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':',
+ 'd', 'c', 'm', 'p', '_', 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '#', '1',
+ '{', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'i',
+ 'n', '_', 'd', 'n', 'a', '_', 't', 'e', 'x', 't', '=', '<', 'I', 'N', 'S', 'D', 'C',
+ ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ',', 'I', 'N', 'S', 'D', 'C', ':', 'd',
+ 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'm', 'a', 'p', '#', '1', '<', '\'', '.',
+ 'a', 'c', 'm', 'g', 'r', 's', 'v', 't', 'w', 'y', 'h', 'k', 'd', 'b', 'n', '\'',
+ ',', '\'', 'N', 'A', 'C', 'M', 'G', 'R', 'S', 'V', 'T', 'W', 'Y', 'H', 'K', 'D',
+ 'B', 'N', '\'', '>', '(', 'R', 'E', 'A', 'D', ')', ';', 'I', 'N', 'S', 'D', 'C',
+ ':', '4', 'n', 'a', ':', 'b', 'i', 'n', ' ', 'i', 'n', '_', '4', 'n', 'a', '_', 'b',
+ 'i', 'n', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n',
+ '>', 'r', 'a', 'n', 'g', 'e', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '#', '1',
+ '<', '0', ',', '1', '5', '>', '(', 'R', 'E', 'A', 'D', ')', '|', '(', 'I', 'N', 'S',
+ 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', ')', 'u', 'n', 'p', 'a', 'c', 'k',
+ '#', '1', '(', 'i', 'n', '_', '4', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', ')',
+ '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ',',
+ 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', '>', 'm', 'a', 'p',
+ '#', '1', '<', '\'', '.', 'A', 'C', 'M', 'G', 'R', 'S', 'V', 'T', 'W', 'Y', 'H',
+ 'K', 'D', 'B', 'N', '\'', ',', '[', '0', ',', '1', ',', '2', ',', '3', ',', '4',
+ ',', '5', ',', '6', ',', '7', ',', '8', ',', '9', ',', '1', '0', ',', '1', '1', ',',
+ '1', '2', ',', '1', '3', ',', '1', '4', ',', '1', '5', ']', '>', '(', 'i', 'n', '_',
+ 'd', 'n', 'a', '_', 't', 'e', 'x', 't', ')', '|', '<', 'I', 'N', 'S', 'D', 'C', ':',
+ 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n',
+ 'a', ':', 'b', 'i', 'n', '>', 'm', 'a', 'p', '#', '1', '<', '[', '0', ',', '1', ',',
+ '2', ',', '3', ',', '4', ']', ',', '[', '1', ',', '2', ',', '4', ',', '8', ',', '1',
+ '5', ']', '>', '(', 'i', 'n', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ',
+ 'i', 'n', '_', '4', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', '=', 'R', 'E', 'A',
+ 'D', ';', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', ' ',
+ 'i', 'n', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', '=', '<', 'I', 'N', 'S', 'D',
+ 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', '>', 'r', 'a', 'n', 'g', 'e', '_',
+ 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '#', '1', '<', '0', ',', '4', '>', '(', 'R',
+ 'E', 'A', 'D', ')', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b',
+ 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n',
+ '>', 'm', 'a', 'p', '#', '1', '<', '[', '0', ',', '1', ',', '2', ',', '3', ',', '4',
+ ',', '5', ',', '6', ',', '7', ',', '8', ',', '9', ',', '1', '0', ',', '1', '1', ',',
+ '1', '2', ',', '1', '3', ',', '1', '4', ',', '1', '5', ']', ',', '[', '4', ',', '0',
+ ',', '1', ',', '4', ',', '2', ',', '4', ',', '4', ',', '4', ',', '3', ',', '4', ',',
+ '4', ',', '4', ',', '4', ',', '4', ',', '4', ',', '4', ']', '>', '(', 'i', 'n', '_',
+ '4', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n',
+ 'a', ':', 'b', 'i', 'n', ' ', 'i', 'n', '_', '2', 'n', 'a', '_', 'b', 'i', 'n', '=',
+ '<', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'b', 'i', 'n', '>', 'r', 'a',
+ 'n', 'g', 'e', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '#', '1', '<', '0', ',',
+ '3', '>', '(', 'R', 'E', 'A', 'D', ')', '|', '(', 'I', 'N', 'S', 'D', 'C', ':', '2',
+ 'n', 'a', ':', 'b', 'i', 'n', ')', 'u', 'n', 'p', 'a', 'c', 'k', '#', '1', '(', 'i',
+ 'n', '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', ')', '|', 'I', 'N', 'S',
+ 'D', 'C', ':', 'S', 'E', 'Q', ':', 'r', 'a', 'n', 'd', '_', '4', 'n', 'a', '_', '2',
+ 'n', 'a', '#', '1', '(', 'i', 'n', '_', '4', 'n', 'a', '_', 'b', 'i', 'n', ')', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ',
+ 'i', 'n', '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', '=', 'R', 'E', 'A',
+ 'D', ';', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', ' ', 'i',
+ 'n', '_', 'a', 'l', 't', '_', '4', 'n', 'a', '_', 'b', 'i', 'n', '=', '<', 'I', 'N',
+ 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C',
+ ':', '4', 'n', 'a', ':', 'b', 'i', 'n', '>', 'm', 'a', 'p', '#', '1', '<', '[', '0',
+ ',', '1', ',', '2', ',', '3', ',', '4', ',', '5', ',', '6', ',', '7', ',', '8', ',',
+ '9', ',', '1', '0', ',', '1', '1', ',', '1', '2', ',', '1', '3', ',', '1', '4', ',',
+ '1', '5', ']', ',', '[', '1', '5', ',', '0', ',', '0', ',', '3', ',', '0', ',', '5',
+ ',', '6', ',', '7', ',', '0', ',', '9', ',', '1', '0', ',', '1', '1', ',', '1', '2',
+ ',', '1', '3', ',', '1', '4', ',', '1', '5', ']', '>', '(', 'i', 'n', '_', '4', 'n',
+ 'a', '_', 'b', 'i', 'n', ')', ';', 'U', '8', ' ', 'i', 'n', '_', 's', 't', 'a', 't',
+ 's', '_', 'b', 'i', 'n', '=', 'i', 'n', '_', '2', 'n', 'a', '_', 'b', 'i', 'n', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ',
+ 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', '=', '.', 'R',
+ 'E', 'A', 'D', '|', 'o', 'u', 't', '_', 'd', 'c', 'm', 'p', '_', '2', 'n', 'a', '_',
+ 'p', 'a', 'c', 'k', 'e', 'd', ';', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a',
+ ':', 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n',
+ '=', 'o', 'u', 't', '_', 'd', 'c', 'm', 'p', '_', 'x', '2', 'n', 'a', '_', 'b', 'i',
+ 'n', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', ',',
+ 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', '>', 'm', 'a',
+ 'p', '#', '1', '<', '[', '0', ',', '1', ',', '2', ',', '3', ',', '4', ',', '5', ',',
+ '6', ',', '7', ',', '8', ',', '9', ',', '1', '0', ',', '1', '1', ',', '1', '2', ',',
+ '1', '3', ',', '1', '4', ',', '1', '5', ']', ',', '[', '4', ',', '0', ',', '1', ',',
+ '4', ',', '2', ',', '4', ',', '4', ',', '4', ',', '3', ',', '4', ',', '4', ',', '4',
+ ',', '4', ',', '4', ',', '4', ',', '4', ']', '>', '(', 'o', 'u', 't', '_', '4', 'n',
+ 'a', '_', 'b', 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':',
+ 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', '2', 'n', 'a', '_', '4', 'n', 'a', '_', 'b',
+ 'i', 'n', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'b', 'i', 'n',
+ ',', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', '>', 'm', 'a',
+ 'p', '#', '1', '<', '[', '0', ',', '1', ',', '2', ',', '3', ']', ',', '[', '1', ',',
+ '2', ',', '4', ',', '8', ']', '>', '(', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'b',
+ 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n',
+ ' ', 'o', 'u', 't', '_', '4', 'n', 'a', '_', 'b', 'i', 'n', '=', '<', 'I', 'N', 'S',
+ 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', '>', 'b', 'i', 't', '_', 'o', 'r',
+ '#', '1', '<', '1', '>', '(', 'o', 'u', 't', '_', '2', 'n', 'a', '_', '4', 'n', 'a',
+ '_', 'b', 'i', 'n', ',', '.', 'A', 'L', 'T', 'R', 'E', 'A', 'D', ')', '|', 'o', 'u',
+ 't', '_', 'd', 'c', 'm', 'p', '_', '4', 'n', 'a', '_', 'b', 'i', 'n', '|', 'o', 'u',
+ 't', '_', '2', 'n', 'a', '_', '4', 'n', 'a', '_', 'b', 'i', 'n', ';', 'I', 'N', 'S',
+ 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'o', 'u', 't', '_', 'd',
+ 'n', 'a', '_', 't', 'e', 'x', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n',
+ 'a', ':', 'b', 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't',
+ 'e', 'x', 't', '>', 'm', 'a', 'p', '#', '1', '<', '[', '0', ',', '1', ',', '2', ',',
+ '3', ',', '4', ',', '5', ',', '6', ',', '7', ',', '8', ',', '9', ',', '1', '0', ',',
+ '1', '1', ',', '1', '2', ',', '1', '3', ',', '1', '4', ',', '1', '5', ']', ',', '\'',
+ '.', 'A', 'C', 'M', 'G', 'R', 'S', 'V', 'T', 'W', 'Y', 'H', 'K', 'D', 'B', 'N', '\'',
+ '>', '(', 'o', 'u', 't', '_', '4', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', 'p', 'h',
+ 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', '.', 'R', 'E',
+ 'A', 'D', '=', 'i', 'n', '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', '|',
+ '(', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd',
+ ')', 'p', 'a', 'c', 'k', '#', '1', '(', 'i', 'n', '_', '2', 'n', 'a', '_', 'b', 'i',
+ 'n', ')', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm',
+ 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', '>',
+ 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'A',
+ 'L', 'T', 'R', 'E', 'A', 'D', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a',
+ ':', 'b', 'i', 'n', '>', 't', 'r', 'i', 'm', '#', '1', '<', '0', ',', '0', '>', '(',
+ 'i', 'n', '_', 'a', 'l', 't', '_', '4', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', '}',
+ 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'd', 'c',
+ 'm', 'p', '_', 'c', 'o', 'l', 'o', 'r', '_', 's', 'p', 'a', 'c', 'e', '#', '1', '{',
+ 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'd', 'c',
+ 'm', 'p', '_', 'v', 'i', 'r', 't', 'u', 'a', 'l', '_', 'p', 'r', 'o', 'd', 'u', 'c',
+ 't', 'i', 'o', 'n', 's', '=', 'o', 'u', 't', '_', 'd', 'c', 'm', 'p', '_', 'x', '2',
+ 'c', 's', '_', 'b', 'i', 'n', '|', 'o', 'u', 't', '_', 'd', 'c', 'm', 'p', '_', '2',
+ 'c', 's', '_', 'b', 'i', 'n', '|', 'o', 'u', 't', '_', 'd', 'c', 'm', 'p', '_', '2',
+ 'c', 's', '_', 'p', 'a', 'c', 'k', 'e', 'd', ';', '}', 't', 'a', 'b', 'l', 'e', ' ',
+ 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'c', 'o', 'l', 'o', 'r', '_', 's', 'p',
+ 'a', 'c', 'e', '_', 'c', 'o', 'm', 'm', 'o', 'n', '#', '1', '.', '0', '.', '3', '=',
+ 'I', 'N', 'S', 'D', 'C', ':', 't', 'b', 'l', ':', 's', 'e', 'q', 'u', 'e', 'n', 'c',
+ 'e', '#', '1', '.', '0', '.', '1', ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A',
+ ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '#', '1', '.', '0',
+ '.', '2', ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':',
+ 's', 't', 'a', 't', 's', '#', '1', '.', '1', ',', 'N', 'C', 'B', 'I', ':', 't', 'b',
+ 'l', ':', 'd', 'c', 'm', 'p', '_', 'c', 'o', 'l', 'o', 'r', '_', 's', 'p', 'a', 'c',
+ 'e', '#', '1', '{', 'b', 'o', 'o', 'l', ' ', 'c', 's', '_', 'n', 'a', 't', 'i', 'v',
+ 'e', '=', '<', 'b', 'o', 'o', 'l', '>', 'e', 'c', 'h', 'o', '#', '1', '<', 't', 'r',
+ 'u', 'e', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'b',
+ 'i', 'n', ' ', 'o', 'u', 't', '_', '2', 'c', 's', '_', 'b', 'i', 'n', '=', 'o', 'u',
+ 't', '_', 'd', 'c', 'm', 'p', '_', '2', 'c', 's', '_', 'b', 'i', 'n', '|', '(', 'I',
+ 'N', 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'b', 'i', 'n', ')', 'u', 'n', 'p', 'a',
+ 'c', 'k', '#', '1', '(', 'o', 'u', 't', '_', '2', 'c', 's', '_', 'p', 'a', 'c', 'k',
+ 'e', 'd', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'b', 'i', 'n',
+ ' ', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'b', 'i', 'n', '=', '<', 'I', 'N', 'S',
+ 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C',
+ ':', '2', 'n', 'a', ':', 'b', 'i', 'n', '>', 'm', 'a', 'p', '#', '1', '<', '[', '0',
+ ',', '1', ',', '2', ',', '3', ',', '4', ']', ',', '[', '0', ',', '1', ',', '2', ',',
+ '3', ',', '0', ']', '>', '(', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i',
+ 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'b', 'i', 'n', ' ',
+ 'o', 'u', 't', '_', '4', 'n', 'a', '_', 'b', 'i', 'n', '=', '<', 'I', 'N', 'S', 'D',
+ 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':',
+ '4', 'n', 'a', ':', 'b', 'i', 'n', '>', 'm', 'a', 'p', '#', '1', '<', '[', '0', ',',
+ '1', ',', '2', ',', '3', ',', '4', ']', ',', '[', '1', ',', '2', ',', '4', ',', '8',
+ ',', '1', '5', ']', '>', '(', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i',
+ 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't',
+ ' ', 'o', 'u', 't', '_', 'd', 'n', 'a', '_', 't', 'e', 'x', 't', '=', '<', 'I', 'N',
+ 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', ',', 'I', 'N', 'S', 'D',
+ 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'm', 'a', 'p', '#', '1', '<',
+ '[', '0', ',', '1', ',', '2', ',', '3', ',', '4', ']', ',', '\'', 'A', 'C', 'G',
+ 'T', 'N', '\'', '>', '(', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i',
+ 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n',
+ ' ', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', '=', 'N', 'C', 'B',
+ 'I', ':', 'd', 'n', 'a', '_', 'f', 'r', 'o', 'm', '_', 'c', 'o', 'l', 'o', 'r', '#',
+ '1', '(', 'o', 'u', 't', '_', 'x', '2', 'c', 's', '_', 'b', 'i', 'n', ',', 'o', 'u',
+ 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', ',', 'o', 'u', 't', '_',
+ 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'o', 'u', 't', '_', 'c', 's', '_', 'k',
+ 'e', 'y', ',', 'o', 'u', 't', '_', 'c', 'o', 'l', 'o', 'r', '_', 'm', 'a', 't', 'r',
+ 'i', 'x', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c',
+ 'k', 'e', 'd', ' ', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e',
+ 'd', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k',
+ 'e', 'd', ')', 'p', 'a', 'c', 'k', '#', '1', '(', 'o', 'u', 't', '_', '2', 'n', 'a',
+ '_', 'b', 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'p',
+ 'a', 'c', 'k', 'e', 'd', ' ', 'o', 'u', 't', '_', '4', 'n', 'a', '_', 'p', 'a', 'c',
+ 'k', 'e', 'd', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', '4', 'n', 'a', ':', 'p', 'a',
+ 'c', 'k', 'e', 'd', ')', 'p', 'a', 'c', 'k', '#', '1', '(', 'o', 'u', 't', '_', '4',
+ 'n', 'a', '_', 'b', 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'l',
+ 'o', 'r', ':', 't', 'e', 'x', 't', ' ', 'o', 'u', 't', '_', 'c', 'o', 'l', 'o', 'r',
+ '_', 't', 'e', 'x', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's',
+ ':', 'b', 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'l', 'o', 'r', ':',
+ 't', 'e', 'x', 't', '>', 'm', 'a', 'p', '#', '1', '<', '[', '0', ',', '1', ',', '2',
+ ',', '3', ',', '4', ']', ',', '\'', '0', '1', '2', '3', '.', '\'', '>', '(', 'o',
+ 'u', 't', '_', 'x', '2', 'c', 's', '_', 'b', 'i', 'n', ')', ';', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 'c', 'o', 'l', 'o', 'r',
+ '_', 's', 'p', 'a', 'c', 'e', '_', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', '=', '(',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ')', 'r',
+ 'o', 'w', '_', 'l', 'e', 'n', '#', '1', '(', 'o', 'u', 't', '_', '2', 'c', 's', '_',
+ 'p', 'a', 'c', 'k', 'e', 'd', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'l', 'e', 'n', ' ', 'c', 'o', 'l', 'o', 'r', '_', 's', 'p', 'a', 'c',
+ 'e', '_', 'f', 'i', 'x', 'e', 'd', '_', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', '=',
+ '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ')',
+ 'f', 'i', 'x', 'e', 'd', '_', 'r', 'o', 'w', '_', 'l', 'e', 'n', '#', '1', '(', 'o',
+ 'u', 't', '_', '2', 'c', 's', '_', 'p', 'a', 'c', 'k', 'e', 'd', ')', ';', '}', 't',
+ 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'c', 'o', 'l',
+ 'o', 'r', '_', 's', 'p', 'a', 'c', 'e', '_', 'n', 'o', 'c', 'o', 'l', '#', '1', '.',
+ '0', '.', '3', '=', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'c', 'o', 'l', 'o',
+ 'r', '_', 's', 'p', 'a', 'c', 'e', '_', 'c', 'o', 'm', 'm', 'o', 'n', '#', '1', '.',
+ '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'n', '_', 'e', 'n',
+ 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', '{', 'U', '8', ' ', 'o', 'u', 't', '_', 'c',
+ 'o', 'l', 'o', 'r', '_', 'm', 'a', 't', 'r', 'i', 'x', '=', '<', 'U', '8', '>', 'm',
+ 'e', 't', 'a', ':', 'r', 'e', 'a', 'd', '#', '1', '<', '\'', 'C', 'O', 'L', 'O',
+ 'R', '_', 'M', 'A', 'T', 'R', 'I', 'X', '\'', '>', '(', ')', '|', '<', 'U', '8',
+ '>', 'e', 'c', 'h', 'o', '#', '1', '<', '[', '0', ',', '1', ',', '2', ',', '3', ',',
+ '4', ',', '1', ',', '0', ',', '3', ',', '2', ',', '4', ',', '2', ',', '3', ',', '0',
+ ',', '1', ',', '4', ',', '3', ',', '2', ',', '1', ',', '0', ',', '4', ',', '4', ',',
+ '4', ',', '4', ',', '4', ',', '4', ']', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C',
+ ':', 'x', '2', 'c', 's', ':', 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', 'x', '2', 'c',
+ 's', '_', 'b', 'i', 'n', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's',
+ ':', 'b', 'i', 'n', ')', 'r', 'e', 'a', 'd', '_', 'n', 'd', 'e', 'c', 'o', 'd', 'e',
+ ';', 'U', '8', ' ', 'r', 'e', 'a', 'd', '_', 'u', 'n', 'p', 'a', 'c', 'k', '=', 'o',
+ 'u', 't', '_', '2', 'c', 's', '_', 'b', 'i', 'n', ';', '}', 't', 'a', 'b', 'l', 'e',
+ ' ', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'c', 'o', 'l', 'o', 'r', '_', 's',
+ 'p', 'a', 'c', 'e', '#', '1', '.', '0', '.', '3', '=', 'N', 'C', 'B', 'I', ':', 't',
+ 'b', 'l', ':', 'c', 'o', 'l', 'o', 'r', '_', 's', 'p', 'a', 'c', 'e', '_', 'n', 'o',
+ 'c', 'o', 'l', '#', '1', '.', '0', '.', '3', '{', 'I', 'N', 'S', 'D', 'C', ':', 'd',
+ 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'o', 'u', 't', '_', 'c', 's', '_', 'k', 'e',
+ 'y', '=', '.', 'C', 'S', '_', 'K', 'E', 'Y', ';', 'I', 'N', 'S', 'D', 'C', ':', '2',
+ 'c', 's', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'o', 'u', 't', '_', '2', 'c', 's',
+ '_', 'p', 'a', 'c', 'k', 'e', 'd', '=', '.', 'C', 'S', 'R', 'E', 'A', 'D', ';', '}',
+ 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'c', 'o',
+ 'l', 'o', 'r', '_', 's', 'p', 'a', 'c', 'e', '#', '2', '.', '1', '=', 'N', 'C', 'B',
+ 'I', ':', 't', 'b', 'l', ':', 'c', 'o', 'l', 'o', 'r', '_', 's', 'p', 'a', 'c', 'e',
+ '_', 'c', 'o', 'm', 'm', 'o', 'n', '#', '1', '.', '0', '.', '3', ',', 'N', 'C', 'B',
+ 'I', ':', 't', 'b', 'l', ':', 'd', 'c', 'm', 'p', '_', 'c', 'o', 'l', 'o', 'r', '_',
+ 's', 'p', 'a', 'c', 'e', '#', '1', '{', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'l',
+ 'o', 'r', ':', 't', 'e', 'x', 't', ' ', 'i', 'n', '_', 'c', 'o', 'l', 'o', 'r', '_',
+ 't', 'e', 'x', 't', '=', 'C', 'S', 'R', 'E', 'A', 'D', ';', 'I', 'N', 'S', 'D', 'C',
+ ':', 'x', '2', 'c', 's', ':', 'b', 'i', 'n', ' ', 'i', 'n', '_', 'x', '2', 'c', 's',
+ '_', 'b', 'i', 'n', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':',
+ 'b', 'i', 'n', '>', 'r', 'a', 'n', 'g', 'e', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't',
+ 'e', '#', '1', '<', '0', ',', '4', '>', '(', 'C', 'S', 'R', 'E', 'A', 'D', ')', '|',
+ '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'l', 'o', 'r', ':', 't', 'e', 'x', 't',
+ ',', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'b', 'i', 'n', '>', 'm',
+ 'a', 'p', '#', '1', '<', '\'', '0', '1', '2', '3', '.', '\'', ',', '[', '0', ',',
+ '1', ',', '2', ',', '3', ',', '4', ']', '>', '(', 'i', 'n', '_', 'c', 'o', 'l', 'o',
+ 'r', '_', 't', 'e', 'x', 't', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '2', 'c', 's',
+ ':', 'b', 'i', 'n', ' ', 'i', 'n', '_', '2', 'c', 's', '_', 'b', 'i', 'n', '=', '<',
+ 'I', 'N', 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'b', 'i', 'n', '>', 'r', 'a', 'n',
+ 'g', 'e', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '#', '1', '<', '0', ',', '3',
+ '>', '(', 'C', 'S', 'R', 'E', 'A', 'D', ')', '|', '(', 'I', 'N', 'S', 'D', 'C', ':',
+ '2', 'c', 's', ':', 'b', 'i', 'n', ')', 'u', 'n', 'p', 'a', 'c', 'k', '#', '1', '(',
+ 'i', 'n', '_', '2', 'c', 's', '_', 'p', 'a', 'c', 'k', 'e', 'd', ')', '|', '<', 'I',
+ 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'b', 'i', 'n', ',', 'I', 'N', 'S',
+ 'D', 'C', ':', '2', 'c', 's', ':', 'b', 'i', 'n', '>', 'm', 'a', 'p', '#', '1', '<',
+ '[', '0', ',', '1', ',', '2', ',', '3', ',', '4', ']', ',', '[', '0', ',', '1', ',',
+ '2', ',', '3', ',', '0', ']', '>', '(', 'i', 'n', '_', 'x', '2', 'c', 's', '_', 'b',
+ 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'p', 'a', 'c',
+ 'k', 'e', 'd', ' ', 'i', 'n', '_', '2', 'c', 's', '_', 'p', 'a', 'c', 'k', 'e', 'd',
+ '=', 'C', 'S', 'R', 'E', 'A', 'D', ';', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c',
+ 's', ':', 'b', 'i', 'n', ' ', 'i', 'n', '_', 'a', 'l', 't', '_', 'x', '2', 'c', 's',
+ '_', 'b', 'i', 'n', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':',
+ 'b', 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'b', 'i',
+ 'n', '>', 'm', 'a', 'p', '#', '1', '<', '[', '0', ',', '1', ',', '2', ',', '3', ',',
+ '4', ']', ',', '[', '0', ',', '0', ',', '0', ',', '0', ',', '4', ']', '>', '(', 'i',
+ 'n', '_', 'x', '2', 'c', 's', '_', 'b', 'i', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C',
+ ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'i', 'n', '_', 'c', 's', '_', 'k',
+ 'e', 'y', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x',
+ 't', ',', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>',
+ 'm', 'a', 'p', '#', '1', '<', '\'', 'a', 'c', 'g', 't', '\'', ',', '\'', 'A', 'C',
+ 'G', 'T', '\'', '>', '(', 'C', 'S', '_', 'K', 'E', 'Y', ')', ';', 'U', '8', ' ',
+ 'i', 'n', '_', 'c', 'o', 'l', 'o', 'r', '_', 'm', 'a', 't', 'r', 'i', 'x', '=', '<',
+ 'U', '8', '>', 'r', 'a', 'n', 'g', 'e', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
+ '#', '1', '<', '0', ',', '4', '>', '(', 'C', 'O', 'L', 'O', 'R', '_', 'M', 'A', 'T',
+ 'R', 'I', 'X', ')', ';', 'U', '8', ' ', 'i', 'n', '_', 's', 't', 'a', 't', 's', '_',
+ 'b', 'i', 'n', '=', 'i', 'n', '_', '2', 'c', 's', '_', 'b', 'i', 'n', ';', 'I', 'N',
+ 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'o', 'u',
+ 't', '_', '2', 'c', 's', '_', 'p', 'a', 'c', 'k', 'e', 'd', '=', '.', 'C', 'S', 'R',
+ 'E', 'A', 'D', '|', 'o', 'u', 't', '_', 'd', 'c', 'm', 'p', '_', '2', 'c', 's', '_',
+ 'p', 'a', 'c', 'k', 'e', 'd', ';', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's',
+ ':', 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', 'x', '2', 'c', 's', '_', 'b', 'i', 'n',
+ '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'b', 'i', 'n', ')',
+ '<', 'U', '8', '>', 'b', 'i', 't', '_', 'o', 'r', '#', '1', '<', '1', '>', '(', 'o',
+ 'u', 't', '_', '2', 'c', 's', '_', 'b', 'i', 'n', ',', '.', 'A', 'L', 'T', 'C', 'S',
+ 'R', 'E', 'A', 'D', ')', '|', 'o', 'u', 't', '_', 'd', 'c', 'm', 'p', '_', 'x', '2',
+ 'c', 's', '_', 'b', 'i', 'n', '|', '(', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c',
+ 's', ':', 'b', 'i', 'n', ')', 'o', 'u', 't', '_', '2', 'c', 's', '_', 'b', 'i', 'n',
+ ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'o',
+ 'u', 't', '_', 'c', 's', '_', 'k', 'e', 'y', '=', '.', 'C', 'S', '_', 'K', 'E', 'Y',
+ ';', 'U', '8', ' ', 'o', 'u', 't', '_', 'c', 'o', 'l', 'o', 'r', '_', 'm', 'a', 't',
+ 'r', 'i', 'x', '=', '.', 'C', 'O', 'L', 'O', 'R', '_', 'M', 'A', 'T', 'R', 'I', 'X',
+ '|', '<', 'U', '8', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '[', '0', ',', '1', ',',
+ '2', ',', '3', ',', '4', ',', '1', ',', '0', ',', '3', ',', '2', ',', '4', ',', '2',
+ ',', '3', ',', '0', ',', '1', ',', '4', ',', '3', ',', '2', ',', '1', ',', '0', ',',
+ '4', ',', '4', ',', '4', ',', '4', ',', '4', ',', '4', ']', '>', '(', ')', ';', 'p',
+ 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', '.', 'C',
+ 'S', 'R', 'E', 'A', 'D', '=', 'i', 'n', '_', '2', 'c', 's', '_', 'p', 'a', 'c', 'k',
+ 'e', 'd', '|', '(', 'I', 'N', 'S', 'D', 'C', ':', '2', 'c', 's', ':', 'p', 'a', 'c',
+ 'k', 'e', 'd', ')', 'p', 'a', 'c', 'k', '#', '1', '(', 'i', 'n', '_', '2', 'c', 's',
+ '_', 'b', 'i', 'n', ')', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'c', 's', ':',
+ 'b', 'i', 'n', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#',
+ '1', ' ', '.', 'A', 'L', 'T', 'C', 'S', 'R', 'E', 'A', 'D', '=', '<', 'I', 'N', 'S',
+ 'D', 'C', ':', 'x', '2', 'c', 's', ':', 'b', 'i', 'n', '>', 't', 'r', 'i', 'm', '#',
+ '1', '<', '0', ',', '0', '>', '(', 'i', 'n', '_', 'a', 'l', 't', '_', 'x', '2', 'c',
+ 's', '_', 'b', 'i', 'n', ')', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':',
+ 't', 'e', 'x', 't', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g',
+ '#', '1', ' ', '.', 'C', 'S', '_', 'K', 'E', 'Y', '=', 'i', 'n', '_', 'c', 's', '_',
+ 'k', 'e', 'y', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u',
+ 'm', 'n', ' ', '<', 'U', '8', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i',
+ 'n', 'g', '#', '1', ' ', '.', 'C', 'O', 'L', 'O', 'R', '_', 'M', 'A', 'T', 'R', 'I',
+ 'X', '=', 'i', 'n', '_', 'c', 'o', 'l', 'o', 'r', '_', 'm', 'a', 't', 'r', 'i', 'x',
+ ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':',
+ 'p', 'r', 'o', 't', 'e', 'i', 'n', '#', '1', '=', 'I', 'N', 'S', 'D', 'C', ':', 't',
+ 'b', 'l', ':', 'p', 'r', 'o', 't', 'e', 'i', 'n', '#', '1', '{', 'I', 'N', 'S', 'D',
+ 'C', ':', 'p', 'r', 'o', 't', 'e', 'i', 'n', ':', 't', 'e', 'x', 't', ' ', 'i', 'n',
+ '_', 'p', 'r', 'o', 't', 'e', 'i', 'n', '_', 't', 'e', 'x', 't', '=', '<', 'I', 'N',
+ 'S', 'D', 'C', ':', 'p', 'r', 'o', 't', 'e', 'i', 'n', ':', 't', 'e', 'x', 't', ',',
+ 'I', 'N', 'S', 'D', 'C', ':', 'p', 'r', 'o', 't', 'e', 'i', 'n', ':', 't', 'e', 'x',
+ 't', '>', 'm', 'a', 'p', '#', '1', '<', '\'', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y',
+ 'z', 'u', '\'', ',', '\'', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z', 'U', '\'',
+ '>', '(', 'P', 'R', 'O', 'T', 'E', 'I', 'N', ')', ';', 'I', 'N', 'S', 'D', 'C', ':',
+ 'a', 'a', ':', 'b', 'i', 'n', ' ', 'i', 'n', '_', 'a', 'a', '_', 'b', 'i', 'n', '=',
+ '<', 'I', 'N', 'S', 'D', 'C', ':', 'a', 'a', ':', 'b', 'i', 'n', '>', 'r', 'a', 'n',
+ 'g', 'e', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '#', '1', '<', '1', ',', '2',
+ '7', '>', '(', 'P', 'R', 'O', 'T', 'E', 'I', 'N', ')', '|', '<', 'I', 'N', 'S', 'D',
+ 'C', ':', 'p', 'r', 'o', 't', 'e', 'i', 'n', ':', 't', 'e', 'x', 't', ',', 'I', 'N',
+ 'S', 'D', 'C', ':', 'a', 'a', ':', 'b', 'i', 'n', '>', 'm', 'a', 'p', '#', '1', '<',
+ '\'', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 'N', 'P', 'Q',
+ 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z', 'U', '*', 'O', 'J', '\'', ',', '[', '1',
+ ',', '2', ',', '3', ',', '4', ',', '5', ',', '6', ',', '7', ',', '8', ',', '9', ',',
+ '1', '0', ',', '1', '1', ',', '1', '2', ',', '1', '3', ',', '1', '4', ',', '1', '5',
+ ',', '1', '6', ',', '1', '7', ',', '1', '8', ',', '1', '9', ',', '2', '0', ',', '2',
+ '1', ',', '2', '2', ',', '2', '3', ',', '2', '4', ',', '2', '5', ',', '2', '6', ',',
+ '2', '7', ']', '>', '(', 'i', 'n', '_', 'p', 'r', 'o', 't', 'e', 'i', 'n', '_', 't',
+ 'e', 'x', 't', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'a', 'a', ':', 'b', 'i', 'n',
+ ' ', 'o', 'u', 't', '_', 'a', 'a', '_', 'b', 'i', 'n', '=', '.', 'P', 'R', 'O', 'T',
+ 'E', 'I', 'N', ';', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'r', 'o', 't', 'e', 'i', 'n',
+ ':', 't', 'e', 'x', 't', ' ', 'o', 'u', 't', '_', 'p', 'r', 'o', 't', 'e', 'i', 'n',
+ '_', 't', 'e', 'x', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'a', 'a', ':', 'b',
+ 'i', 'n', ',', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'r', 'o', 't', 'e', 'i', 'n', ':',
+ 't', 'e', 'x', 't', '>', 'm', 'a', 'p', '#', '1', '<', '[', '1', ',', '2', ',', '3',
+ ',', '4', ',', '5', ',', '6', ',', '7', ',', '8', ',', '9', ',', '1', '0', ',', '1',
+ '1', ',', '1', '2', ',', '1', '3', ',', '1', '4', ',', '1', '5', ',', '1', '6', ',',
+ '1', '7', ',', '1', '8', ',', '1', '9', ',', '2', '0', ',', '2', '1', ',', '2', '2',
+ ',', '2', '3', ',', '2', '4', ',', '2', '5', ',', '2', '6', ',', '2', '7', ']', ',',
+ '\'', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 'N', 'P', 'Q',
+ 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z', 'U', '*', 'O', 'J', '\'', '>', '(', 'o',
+ 'u', 't', '_', 'a', 'a', '_', 'b', 'i', 'n', ')', ';', 'p', 'h', 'y', 's', 'i', 'c',
+ 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':',
+ 'a', 'a', ':', 'b', 'i', 'n', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i',
+ 'n', 'g', '#', '1', ' ', '.', 'P', 'R', 'O', 'T', 'E', 'I', 'N', '=', 'i', 'n', '_',
+ 'a', 'a', '_', 'b', 'i', 'n', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B',
+ 'I', ':', 't', 'b', 'l', ':', 'p', 'h', 'r', 'e', 'd', '_', 'q', 'u', 'a', 'l', 'i',
+ 't', 'y', '_', 'n', 'o', 'c', 'o', 'l', '#', '1', '.', '0', '.', '1', '=', 'I', 'N',
+ 'S', 'D', 'C', ':', 't', 'b', 'l', ':', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', '#',
+ '1', '.', '0', '.', '1', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'n', '_',
+ 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', '{', 'U', '8', ' ', 'r', 'e', 'a',
+ 'd', '_', 'n', 'd', 'e', 'c', 'o', 'd', 'e', '=', '<', 'I', 'N', 'S', 'D', 'C', ':',
+ 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd', ',', 'U', '8', '>',
+ 'm', 'a', 'p', '#', '1', '<', '0', ',', '4', '>', '(', 'o', 'u', 't', '_', 'q', 'u',
+ 'a', 'l', '_', 'p', 'h', 'r', 'e', 'd', ',', 'r', 'e', 'a', 'd', '_', 'u', 'n', 'p',
+ 'a', 'c', 'k', ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':',
+ 't', 'b', 'l', ':', 'p', 'h', 'r', 'e', 'd', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y',
+ '#', '1', '.', '0', '.', '1', '=', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'p',
+ 'h', 'r', 'e', 'd', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '_', 'n', 'o', 'c', 'o',
+ 'l', '#', '1', '.', '0', '.', '1', '{', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l',
+ 'i', 't', 'y', ':', 'n', '_', 'e', 'n', 'c', 'o', 'd', 'e', 'd', ':', 'p', 'h', 'r',
+ 'e', 'd', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r', 'e', 'd',
+ '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', '}', 't', 'a', 'b', 'l', 'e', ' ',
+ 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'p', 'h', 'r', 'e', 'd', '_', 'q', 'u',
+ 'a', 'l', 'i', 't', 'y', '#', '2', '.', '0', '.', '4', '=', 'I', 'N', 'S', 'D', 'C',
+ ':', 't', 'b', 'l', ':', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', '#', '1', '.', '0',
+ '.', '1', '{', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':',
+ 'p', 'h', 'r', 'e', 'd', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h',
+ 'r', 'e', 'd', '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', 'I', 'N', 'S', 'D',
+ 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 't', 'e', 'x', 't', ':', 'p', 'h',
+ 'r', 'e', 'd', '_', '3', '3', ' ', 'i', 'n', '_', 'q', 'u', 'a', 'l', '_', 't', 'e',
+ 'x', 't', '_', 'p', 'h', 'r', 'e', 'd', '_', '3', '3', '=', 'Q', 'U', 'A', 'L', 'I',
+ 'T', 'Y', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':',
+ 't', 'e', 'x', 't', ':', 'p', 'h', 'r', 'e', 'd', '_', '6', '4', ' ', 'i', 'n', '_',
+ 'q', 'u', 'a', 'l', '_', 't', 'e', 'x', 't', '_', 'p', 'h', 'r', 'e', 'd', '_', '6',
+ '4', '=', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q',
+ 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd', ' ', 'i', 'n', '_', 'q',
+ 'u', 'a', 'l', '_', 'p', 'h', 'r', 'e', 'd', '=', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y',
+ '|', '(', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p',
+ 'h', 'r', 'e', 'd', ')', '<', 'B', '8', '>', 'd', 'i', 'f', 'f', '#', '1', '<', '3',
+ '3', '>', '(', 'i', 'n', '_', 'q', 'u', 'a', 'l', '_', 't', 'e', 'x', 't', '_', 'p',
+ 'h', 'r', 'e', 'd', '_', '3', '3', ')', '|', '(', 'I', 'N', 'S', 'D', 'C', ':', 'q',
+ 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd', ')', '<', 'B', '8', '>',
+ 'd', 'i', 'f', 'f', '#', '1', '<', '6', '4', '>', '(', 'i', 'n', '_', 'q', 'u', 'a',
+ 'l', '_', 't', 'e', 'x', 't', '_', 'p', 'h', 'r', 'e', 'd', '_', '6', '4', ')', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r',
+ 'e', 'd', ' ', 'i', 'n', '_', 's', 't', 'a', 't', 's', '_', 'q', 'u', 'a', 'l', '=',
+ 'i', 'n', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r', 'e', 'd', ';', 'p', 'h', 'y',
+ 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S',
+ 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd', '>',
+ 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'Q',
+ 'U', 'A', 'L', 'I', 'T', 'Y', '=', 'i', 'n', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h',
+ 'r', 'e', 'd', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 't',
+ 'b', 'l', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', 'q', 'u', 'a', 'l', 'i',
+ 't', 'y', '_', 'n', 'o', 'c', 'o', 'l', '#', '1', '.', '0', '.', '1', '=', 'I', 'N',
+ 'S', 'D', 'C', ':', 't', 'b', 'l', ':', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', '#',
+ '1', '.', '0', '.', '1', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'n', '_',
+ 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', '{', 'c', 'o', 'l', 'u', 'm', 'n',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o',
+ 'g', '_', 'o', 'd', 'd', 's', ' ', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ' ', '=', ' ',
+ 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's',
+ ';', 'U', '8', ' ', 'r', 'e', 'a', 'd', '_', 'n', 'd', 'e', 'c', 'o', 'd', 'e', '=',
+ '<', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o',
+ 'g', '_', 'o', 'd', 'd', 's', ',', 'U', '8', '>', 'm', 'a', 'p', '#', '1', '<', '-',
+ '6', ',', '4', '>', '(', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'l', 'o', 'g',
+ '_', 'o', 'd', 'd', 's', ',', 'r', 'e', 'a', 'd', '_', 'u', 'n', 'p', 'a', 'c', 'k',
+ ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p',
+ 'h', 'r', 'e', 'd', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r',
+ 'e', 'd', '=', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '2', '_', 'p', 'h', 'r', 'e',
+ 'd', '|', 'N', 'C', 'B', 'I', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', 't',
+ 'o', '_', 'p', 'h', 'r', 'e', 'd', '#', '1', '(', 'o', 'u', 't', '_', 'q', 'u', 'a',
+ 'l', '_', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ')', ';', '}', 't', 'a', 'b', 'l',
+ 'e', ' ', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'l', 'o', 'g', '_', 'o', 'd',
+ 'd', 's', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '#', '1', '.', '0', '.', '1', '=',
+ 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's',
+ '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '_', 'n', 'o', 'c', 'o', 'l', '#', '1', '.',
+ '0', '.', '1', '{', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':',
+ 'n', '_', 'e', 'n', 'c', 'o', 'd', 'e', 'd', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd',
+ 's', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'l', 'o', 'g', '_', 'o', 'd',
+ 'd', 's', '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', '}', 't', 'a', 'b', 'l',
+ 'e', ' ', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'l', 'o', 'g', '_', 'o', 'd',
+ 'd', 's', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '_', 'n', 'o', 'c', 'o', 'l', '#',
+ '2', '.', '1', '=', 'I', 'N', 'S', 'D', 'C', ':', 't', 'b', 'l', ':', 's', 'e', 'q',
+ 'u', 'e', 'n', 'c', 'e', '#', '1', '.', '0', '.', '1', '{', 'c', 'o', 'l', 'u', 'm',
+ 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l',
+ 'o', 'g', '_', 'o', 'd', 'd', 's', ' ', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ' ', '=',
+ ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'l', 'o', 'g', '_', 'o', 'd', 'd',
+ 's', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p',
+ 'h', 'r', 'e', 'd', ' ', 'i', 'n', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r', 'e',
+ 'd', '=', 'N', 'C', 'B', 'I', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', 't',
+ 'o', '_', 'p', 'h', 'r', 'e', 'd', '#', '1', '(', 'i', 'n', '_', 'q', 'u', 'a', 'l',
+ '_', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ')', ';', 'I', 'N', 'S', 'D', 'C', ':',
+ 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd', ' ', 'o', 'u', 't',
+ '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r', 'e', 'd', '=', 'N', 'C', 'B', 'I', ':',
+ 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', 't', 'o', '_', 'p', 'h', 'r', 'e', 'd',
+ '#', '1', '(', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'l', 'o', 'g', '_', 'o',
+ 'd', 'd', 's', ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':',
+ 't', 'b', 'l', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', 'q', 'u', 'a', 'l',
+ 'i', 't', 'y', '#', '2', '.', '1', '=', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':',
+ 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '_',
+ 'n', 'o', 'c', 'o', 'l', '#', '2', '.', '1', '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 't', 'e', 'x',
+ 't', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', '6', '4', ' ', 'Q', 'U', 'A',
+ 'L', 'I', 'T', 'Y', ' ', '=', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 't',
+ 'e', 'x', 't', '_', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', '6', '4', '|', '(',
+ 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 't', 'e', 'x',
+ 't', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', '6', '4', ')', '<', 'B', '8',
+ '>', 's', 'u', 'm', '#', '1', '<', '6', '4', '>', '(', 'o', 'u', 't', '_', 'q', 'u',
+ 'a', 'l', '_', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ')', ';', 'I', 'N', 'S', 'D',
+ 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd',
+ 's', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'l', 'o', 'g', '_', 'o', 'd',
+ 'd', 's', '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', 'I', 'N', 'S', 'D', 'C',
+ ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 't', 'e', 'x', 't', ':', 'l', 'o', 'g',
+ '_', 'o', 'd', 'd', 's', '_', '6', '4', ' ', 'i', 'n', '_', 'q', 'u', 'a', 'l', '_',
+ 't', 'e', 'x', 't', '_', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', '6', '4', '=',
+ 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a',
+ 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ' ', 'i', 'n', '_',
+ 'q', 'u', 'a', 'l', '_', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '=', 'Q', 'U', 'A',
+ 'L', 'I', 'T', 'Y', '|', '(', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i',
+ 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ')', '<', 'B', '8', '>', 'd',
+ 'i', 'f', 'f', '#', '1', '<', '6', '4', '>', '(', 'i', 'n', '_', 'q', 'u', 'a', 'l',
+ '_', 't', 'e', 'x', 't', '_', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', '6', '4',
+ ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l',
+ 'o', 'g', '_', 'o', 'd', 'd', 's', ' ', 'i', 'n', '_', 's', 't', 'a', 't', 's', '_',
+ 'q', 'u', 'a', 'l', '=', 'i', 'n', '_', 'q', 'u', 'a', 'l', '_', 'l', 'o', 'g', '_',
+ 'o', 'd', 'd', 's', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l',
+ 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't',
+ 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '>', 'z', 'i', 'p', '_', 'e', 'n',
+ 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y',
+ '=', 'i', 'n', '_', 'q', 'u', 'a', 'l', '_', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's',
+ ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'c', 'o', 'o', 'r', 'd', '#', '1', '=', 'I',
+ 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't',
+ 'c', 'o', 'o', 'r', 'd', '#', '1', '{', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u', 't', '_', 'x', '_', 'c', 'o', 'o', 'r',
+ 'd', '=', '.', 'X', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'v', 'a', 'l', ' ', 'o', 'u', 't', '_', 'y', '_', 'c', 'o', 'o', 'r', 'd', '=', '.',
+ 'Y', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l',
+ ' ', 'o', 'u', 't', '_', 't', '_', 'c', 'o', 'o', 'r', 'd', '=', '.', 'T', ';', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u',
+ 't', '_', 'l', '_', 'c', 'o', 'o', 'r', 'd', '=', '.', 'L', ';', 'p', 'h', 'y', 's',
+ 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', '>', 'i', 'z', 'i', 'p', '_',
+ 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'X', '=', 'i', 'n', '_',
+ 'x', '_', 'c', 'o', 'o', 'r', 'd', '|', 'i', 'n', '_', 'n', 'a', 'm', 'e', '_', 'x',
+ '_', 'c', 'o', 'o', 'r', 'd', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'v', 'a', 'l', '>', 'i', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i',
+ 'n', 'g', '#', '1', ' ', '.', 'Y', '=', 'i', 'n', '_', 'y', '_', 'c', 'o', 'o', 'r',
+ 'd', '|', 'i', 'n', '_', 'n', 'a', 'm', 'e', '_', 'y', '_', 'c', 'o', 'o', 'r', 'd',
+ ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', '>',
+ 'i', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.',
+ 'T', '=', 'i', 'n', '_', 't', '_', 'c', 'o', 'o', 'r', 'd', '|', 'i', 'n', '_', 'n',
+ 'a', 'm', 'e', '_', 't', '_', 'c', 'o', 'o', 'r', 'd', ';', 'p', 'h', 'y', 's', 'i',
+ 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', '>', 'i', 'z', 'i', 'p', '_', 'e',
+ 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'L', '=', 'i', 'n', '_', 'l',
+ '_', 'c', 'o', 'o', 'r', 'd', '|', 'i', 'n', '_', 'n', 'a', 'm', 'e', '_', 'l', '_',
+ 'c', 'o', 'o', 'r', 'd', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'k', 'e', 'y', 'n', 'a', 'm', 'e',
+ '#', '1', '.', '0', '.', '1', '=', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':',
+ 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'n', 'a', 'm', 'e', '#', '1', '.', '0', '.',
+ '1', '{', 'a', 's', 'c', 'i', 'i', ' ', 'o', 'u', 't', '_', 's', 'k', 'e', 'y', '=',
+ '(', 'a', 's', 'c', 'i', 'i', ')', 'i', 'd', 'x', ':', 't', 'e', 'x', 't', ':', 'p',
+ 'r', 'o', 'j', 'e', 'c', 't', '#', '1', '<', '\'', 's', 'k', 'e', 'y', '\'', '>',
+ '(', ')', ';', 'a', 's', 'c', 'i', 'i', ' ', 'o', 'u', 't', '_', 's', 'p', 'o', 't',
+ '_', 'n', 'a', 'm', 'e', '=', 'r', 'e', 'w', 'r', 'i', 't', 't', 'e', 'n', '_', 's',
+ 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '|', 'o', 'u', 't', '_', 's', 'k', 'e', 'y',
+ ';', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't', '_', 'i',
+ 'd', 's', '_', 'f', 'o', 'u', 'n', 'd', ' ', 's', 'p', 'o', 't', '_', 'i', 'd', 's',
+ '_', 'f', 'o', 'u', 'n', 'd', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A',
+ ':', 's', 'p', 'o', 't', '_', 'i', 'd', 's', '_', 'f', 'o', 'u', 'n', 'd', ')', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'l', 'o', 'o', 'k', 'u', 'p', '#', '1', '<',
+ '\'', 's', 'k', 'e', 'y', '\'', ',', '\'', 'Q', 'U', 'E', 'R', 'Y', '_', 'B', 'Y',
+ '_', 'N', 'A', 'M', 'E', '\'', ',', '1', '>', '(', 'o', 'u', 't', '_', 's', 'l',
+ 'x', '_', 'p', 'r', 'e', 'f', 'i', 'x', ')', '|', '(', 'I', 'N', 'S', 'D', 'C', ':',
+ 'S', 'R', 'A', ':', 's', 'p', 'o', 't', '_', 'i', 'd', 's', '_', 'f', 'o', 'u', 'n',
+ 'd', ')', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'l', 'o', 'o', 'k', 'u', 'p',
+ '#', '1', '<', '\'', 's', 'k', 'e', 'y', '\'', ',', '\'', 'Q', 'U', 'E', 'R', 'Y',
+ '_', 'B', 'Y', '_', 'N', 'A', 'M', 'E', '\'', ',', '0', '>', '(', ')', ';', '}',
+ 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b',
+ 'l', ':', 's', 'k', 'e', 'y', 'n', 'a', 'm', 'e', '_', 'n', 'o', 'c', 'o', 'l', '#',
+ '2', '.', '0', '.', '1', '=', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't',
+ 'b', 'l', ':', 's', 'p', 'o', 't', 'n', 'a', 'm', 'e', '#', '1', '.', '0', '.', '1',
+ '{', 'a', 's', 'c', 'i', 'i', ' ', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e', '_', 'f',
+ 'm', 't', '=', '(', 'a', 's', 'c', 'i', 'i', ')', 'i', 'd', 'x', ':', 't', 'e', 'x',
+ 't', ':', 'p', 'r', 'o', 'j', 'e', 'c', 't', '#', '1', '<', '\'', 's', 'k', 'e',
+ 'y', '\'', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':',
+ 's', 'p', 'o', 't', '_', 'i', 'd', 's', '_', 'f', 'o', 'u', 'n', 'd', ' ', 's', 'p',
+ 'o', 't', '_', 'i', 'd', 's', '_', 'f', 'o', 'u', 'n', 'd', '=', '(', 'I', 'N', 'S',
+ 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't', '_', 'i', 'd', 's', '_', 'f',
+ 'o', 'u', 'n', 'd', ')', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'l', 'o', 'o',
+ 'k', 'u', 'p', '#', '1', '<', '\'', 's', 'k', 'e', 'y', '\'', ',', '\'', 'Q', 'U',
+ 'E', 'R', 'Y', '_', 'B', 'Y', '_', 'N', 'A', 'M', 'E', '\'', ',', '2', '>', '(',
+ 'o', 'u', 't', '_', 's', 'l', 'x', '_', 'p', 'r', 'e', 'f', 'i', 'x', ')', '|', '(',
+ 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't', '_', 'i', 'd',
+ 's', '_', 'f', 'o', 'u', 'n', 'd', ')', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'l', 'o', 'o', 'k', 'u', 'p', '#', '1', '<', '\'', 's', 'k', 'e', 'y', '\'', ',',
+ '\'', 'Q', 'U', 'E', 'R', 'Y', '_', 'B', 'Y', '_', 'N', 'A', 'M', 'E', '\'', ',',
+ '2', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'v', 'a', 'l', ' ', 'o', 'u', 't', '_', 'x', '_', 'c', 'o', 'o', 'r', 'd', '=', 'c',
+ 'a', 's', 't', '#', '1', '(', '.', 'X', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u', 't', '_', 'y', '_', 'c', 'o',
+ 'o', 'r', 'd', '=', 'c', 'a', 's', 't', '#', '1', '(', '.', 'Y', ')', ';', '}', 't',
+ 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l',
+ ':', 's', 'k', 'e', 'y', 'n', 'a', 'm', 'e', '#', '2', '.', '0', '.', '1', '=', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'k', 'e', 'y', 'n',
+ 'a', 'm', 'e', '_', 'n', 'o', 'c', 'o', 'l', '#', '2', '.', '0', '.', '1', '{', 'p',
+ 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', '>', 'i', 'z',
+ 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'X', '=',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_',
+ 'n', 'a', 'm', 'e', '_', 'c', 'o', 'o', 'r', 'd', '#', '1', '<', '4', '>', '(', 'N',
+ 'A', 'M', 'E', ',', 'i', 'n', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_',
+ 't', 'o', 'k', ')', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l',
+ 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'v', 'a', 'l', '>', 'i', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g',
+ '#', '1', ' ', '.', 'Y', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'x',
+ 't', 'r', 'a', 'c', 't', '_', 'n', 'a', 'm', 'e', '_', 'c', 'o', 'o', 'r', 'd', '#',
+ '1', '<', '5', '>', '(', 'N', 'A', 'M', 'E', ',', 'i', 'n', '_', 's', 'p', 'o', 't',
+ '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', ')', ';', '}', 't', 'a', 'b', 'l', 'e',
+ ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'k', 'e',
+ 'y', 'n', 'a', 'm', 'e', '#', '3', '.', '0', '.', '1', '=', 'I', 'N', 'S', 'D', 'C',
+ ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'n', 'a', 'm', 'e',
+ '#', '1', '.', '0', '.', '1', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't',
+ 'b', 'l', ':', 's', 'p', 'o', 't', 'c', 'o', 'o', 'r', 'd', '#', '1', '{', 'a', 's',
+ 'c', 'i', 'i', ' ', 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e',
+ '=', '.', 'S', 'P', 'O', 'T', '_', 'N', 'A', 'M', 'E', ';', 'a', 's', 'c', 'i', 'i',
+ ' ', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e', '_', 'f', 'm', 't', '=', '(', 'a', 's',
+ 'c', 'i', 'i', ')', 'i', 'd', 'x', ':', 't', 'e', 'x', 't', ':', 'p', 'r', 'o', 'j',
+ 'e', 'c', 't', '#', '1', '<', '\'', 's', 'k', 'e', 'y', '\'', '>', '(', '.', 'N',
+ 'A', 'M', 'E', '_', 'F', 'M', 'T', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R',
+ 'A', ':', 's', 'p', 'o', 't', '_', 'i', 'd', 's', '_', 'f', 'o', 'u', 'n', 'd', ' ',
+ 's', 'p', 'o', 't', '_', 'i', 'd', 's', '_', 'f', 'o', 'u', 'n', 'd', '=', '(', 'I',
+ 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't', '_', 'i', 'd', 's',
+ '_', 'f', 'o', 'u', 'n', 'd', ')', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'l',
+ 'o', 'o', 'k', 'u', 'p', '#', '1', '<', '\'', 's', 'k', 'e', 'y', '\'', ',', '\'',
+ 'Q', 'U', 'E', 'R', 'Y', '_', 'B', 'Y', '_', 'N', 'A', 'M', 'E', '\'', ',', '2',
+ '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v',
+ 'a', 'l', ' ', 'i', 'n', '_', 'n', 'a', 'm', 'e', '_', 'x', '_', 'c', 'o', 'o', 'r',
+ 'd', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'x', 't', 'r', 'a', 'c',
+ 't', '_', 'n', 'a', 'm', 'e', '_', 'c', 'o', 'o', 'r', 'd', '#', '1', '<', '4', '>',
+ '(', 'N', 'A', 'M', 'E', ',', 'i', 'n', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm',
+ 'e', '_', 't', 'o', 'k', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'v', 'a', 'l', ' ', 'i', 'n', '_', 'n', 'a', 'm', 'e', '_', 'y', '_', 'c',
+ 'o', 'o', 'r', 'd', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'x', 't',
+ 'r', 'a', 'c', 't', '_', 'n', 'a', 'm', 'e', '_', 'c', 'o', 'o', 'r', 'd', '#', '1',
+ '<', '5', '>', '(', 'N', 'A', 'M', 'E', ',', 'i', 'n', '_', 's', 'p', 'o', 't', '_',
+ 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'i', 'n', '_', 'n', 'a', 'm', 'e', '_',
+ 't', '_', 'c', 'o', 'o', 'r', 'd', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 'n', 'a', 'm', 'e', '_', 'c', 'o', 'o', 'r',
+ 'd', '#', '1', '<', '6', '>', '(', 'N', 'A', 'M', 'E', ',', 'i', 'n', '_', 's', 'p',
+ 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', ')', ';', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'i', 'n', '_', 'n', 'a',
+ 'm', 'e', '_', 'l', '_', 'c', 'o', 'o', 'r', 'd', '=', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 'n', 'a', 'm', 'e', '_', 'c',
+ 'o', 'o', 'r', 'd', '#', '1', '<', '7', '>', '(', 'N', 'A', 'M', 'E', ',', 'i', 'n',
+ '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', ')', ';', 'p',
+ 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'a',
+ 's', 'c', 'i', 'i', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g',
+ '#', '1', ' ', '.', 'S', 'P', 'O', 'T', '_', 'N', 'A', 'M', 'E', '=', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 's', 'p', 'o',
+ 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', 'N', 'A', 'M', 'E', ',', 'i', 'n', '_',
+ 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', ')', ';', 'p', 'h',
+ 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'a', 's',
+ 'c', 'i', 'i', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#',
+ '1', ' ', '.', 'N', 'A', 'M', 'E', '_', 'F', 'M', 'T', '=', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 'n', 'a', 'm', 'e', '_',
+ 'f', 'm', 't', '#', '1', '<', '\'', 's', 'k', 'e', 'y', '\'', '>', '(', 'N', 'A',
+ 'M', 'E', ',', 'i', 'n', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't',
+ 'o', 'k', ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 't', 'b', 'l', ':', 's', 't', 'a', 't', 's', '#', '1', '.', '2', '=',
+ 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 't', 'a',
+ 't', 's', '#', '1', '.', '1', ',', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':',
+ 't', 'b', 'l', ':', 's', 'r', 'a', '#', '1', '.', '0', '.', '3', '{', 'I', 'N', 'S',
+ 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't', 'i', 'd', '_', 't', ' ', 'm',
+ 'i', 'n', '_', 's', 'p', 'o', 't', '_', 'i', 'd', '=', '<', 'I', 'N', 'S', 'D', 'C',
+ ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't', 'i', 'd', '_', 't', '>', 'm', 'e', 't',
+ 'a', ':', 'v', 'a', 'l', 'u', 'e', '#', '1', '<', '\'', 'S', 'T', 'A', 'T', 'S',
+ '/', 'T', 'A', 'B', 'L', 'E', '/', 'S', 'P', 'O', 'T', '_', 'M', 'I', 'N', '\'',
+ '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o',
+ 't', 'i', 'd', '_', 't', ' ', 'm', 'a', 'x', '_', 's', 'p', 'o', 't', '_', 'i', 'd',
+ '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 's', 'p', 'o', 't', 'i',
+ 'd', '_', 't', '>', 'm', 'e', 't', 'a', ':', 'v', 'a', 'l', 'u', 'e', '#', '1', '<',
+ '\'', 'S', 'T', 'A', 'T', 'S', '/', 'T', 'A', 'B', 'L', 'E', '/', 'S', 'P', 'O',
+ 'T', '_', 'M', 'A', 'X', '\'', '>', '(', ')', ';', 'U', '6', '4', ' ', 's', 'p',
+ 'o', 't', '_', 'c', 'o', 'u', 'n', 't', '=', '<', 'U', '6', '4', '>', 'm', 'e', 't',
+ 'a', ':', 'v', 'a', 'l', 'u', 'e', '#', '1', '<', '\'', 'S', 'T', 'A', 'T', 'S',
+ '/', 'T', 'A', 'B', 'L', 'E', '/', 'S', 'P', 'O', 'T', '_', 'C', 'O', 'U', 'N', 'T',
+ '\'', '>', '(', ')', ';', 'U', '6', '4', ' ', 'b', 'a', 's', 'e', '_', 'c', 'o',
+ 'u', 'n', 't', '=', '<', 'U', '6', '4', '>', 'm', 'e', 't', 'a', ':', 'v', 'a', 'l',
+ 'u', 'e', '#', '1', '<', '\'', 'S', 'T', 'A', 'T', 'S', '/', 'T', 'A', 'B', 'L',
+ 'E', '/', 'B', 'A', 'S', 'E', '_', 'C', 'O', 'U', 'N', 'T', '\'', '>', '(', ')',
+ ';', 'U', '6', '4', ' ', 'b', 'i', 'o', '_', 'b', 'a', 's', 'e', '_', 'c', 'o', 'u',
+ 'n', 't', '=', '<', 'U', '6', '4', '>', 'm', 'e', 't', 'a', ':', 'v', 'a', 'l', 'u',
+ 'e', '#', '1', '<', '\'', 'S', 'T', 'A', 'T', 'S', '/', 'T', 'A', 'B', 'L', 'E',
+ '/', 'B', 'I', 'O', '_', 'B', 'A', 'S', 'E', '_', 'C', 'O', 'U', 'N', 'T', '\'',
+ '>', '(', ')', ';', 'U', '6', '4', ' ', 'c', 'm', 'p', '_', 'b', 'a', 's', 'e', '_',
+ 'c', 'o', 'u', 'n', 't', '=', '<', 'U', '6', '4', '>', 'm', 'e', 't', 'a', ':', 'v',
+ 'a', 'l', 'u', 'e', '#', '1', '<', '\'', 'S', 'T', 'A', 'T', 'S', '/', 'T', 'A',
+ 'B', 'L', 'E', '/', 'C', 'M', 'P', '_', 'B', 'A', 'S', 'E', '_', 'C', 'O', 'U', 'N',
+ 'T', '\'', '>', '(', ')', '|', 'b', 'a', 's', 'e', '_', 'c', 'o', 'u', 'n', 't',
+ ';', 't', 'r', 'i', 'g', 'g', 'e', 'r', ' ', 'm', 'e', 't', 'a', '_', 's', 't', 'a',
+ 't', 's', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 't', 'a', 't', 's',
+ '_', 't', 'r', 'i', 'g', 'g', 'e', 'r', '#', '1', '(', 'i', 'n', '_', 's', 't', 'a',
+ 't', 's', '_', 'b', 'i', 'n', ',', 'i', 'n', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e',
+ 'n', ',', 'i', 'n', '_', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ',', 'i', 'n',
+ '_', 's', 'p', 'o', 't', '_', 'g', 'r', 'o', 'u', 'p', ')', '|', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 's', 't', 'a', 't', 's', '_', 't', 'r', 'i', 'g', 'g', 'e',
+ 'r', '#', '1', '(', 'i', 'n', '_', 's', 't', 'a', 't', 's', '_', 'b', 'i', 'n', ',',
+ 'i', 'n', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'i', 'n', '_', 'r', 'e',
+ 'a', 'd', '_', 't', 'y', 'p', 'e', ')', '|', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'c', 'm', 'p', '_', 's', 't', 'a', 't', 's', '_', 't', 'r', 'i', 'g', 'g', 'e',
+ 'r', '#', '1', '(', 'i', 'n', '_', 'c', 'm', 'p', '_', 's', 't', 'a', 't', 's', '_',
+ 'b', 'i', 'n', ',', 'i', 'n', '_', 's', 't', 'a', 't', 's', '_', 'q', 'u', 'a', 'l',
+ ',', 'i', 'n', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'i', 'n', '_', 'r',
+ 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ',', 'i', 'n', '_', 's', 'p', 'o', 't', '_',
+ 'g', 'r', 'o', 'u', 'p', ')', '|', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'c',
+ 'm', 'p', '_', 's', 't', 'a', 't', 's', '_', 't', 'r', 'i', 'g', 'g', 'e', 'r', '#',
+ '1', '(', 'i', 'n', '_', 'c', 'm', 'p', '_', 's', 't', 'a', 't', 's', '_', 'b', 'i',
+ 'n', ',', 'i', 'n', '_', 's', 't', 'a', 't', 's', '_', 'q', 'u', 'a', 'l', ',', 'i',
+ 'n', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'i', 'n', '_', 'r', 'e', 'a',
+ 'd', '_', 't', 'y', 'p', 'e', ')', '|', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'c', 'm', 'p', 'f', '_', 's', 't', 'a', 't', 's', '_', 't', 'r', 'i', 'g', 'g', 'e',
+ 'r', '#', '1', '(', 'i', 'n', '_', 'c', 'm', 'p', '_', 's', 't', 'a', 't', 's', '_',
+ 'b', 'i', 'n', ',', 'i', 'n', '_', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ',', 'i',
+ 'n', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'i', 'n', '_', 'r', 'e', 'a',
+ 'd', '_', 't', 'y', 'p', 'e', ',', 'i', 'n', '_', 's', 'p', 'o', 't', '_', 'g', 'r',
+ 'o', 'u', 'p', ')', '|', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'c', 'm', 'p',
+ 'f', '_', 's', 't', 'a', 't', 's', '_', 't', 'r', 'i', 'g', 'g', 'e', 'r', '#', '1',
+ '(', 'i', 'n', '_', 'c', 'm', 'p', '_', 's', 't', 'a', 't', 's', '_', 'b', 'i', 'n',
+ ',', 'i', 'n', '_', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ',', 'i', 'n', '_', 'r',
+ 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'i', 'n', '_', 'r', 'e', 'a', 'd', '_', 't',
+ 'y', 'p', 'e', ')', ';', 't', 'r', 'i', 'g', 'g', 'e', 'r', ' ', 'q', 'u', 'a', 'l',
+ '_', 's', 't', 'a', 't', 's', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'p',
+ 'h', 'r', 'e', 'd', '_', 's', 't', 'a', 't', 's', '_', 't', 'r', 'i', 'g', 'g', 'e',
+ 'r', '#', '1', '(', 'i', 'n', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r', 'e', 'd',
+ ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '_', 'n', 'o', 'c',
+ 'o', 'l', '#', '1', '.', '0', '.', '2', '=', 'I', 'N', 'S', 'D', 'C', ':', 't', 'b',
+ 'l', ':', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', '#', '1', '.', '0', '.', '1', ',',
+ 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'p', 'o',
+ 't', 'd', 'e', 's', 'c', '#', '1', '.', '0', '.', '2', '{', 'r', 'e', 'a', 'd', 'o',
+ 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'S', 'e', 'g', 'm', 'e', 'n', 't', ' ', 'L', 'A', 'B', 'E', 'L', '_',
+ 'S', 'E', 'G', ' ', '=', ' ', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 's',
+ 'e', 'g', '|', 'c', 'a', 's', 't', '#', '1', '(', 'o', 'u', 't', '_', 'l', 'a', 'b',
+ 'e', 'l', '_', 's', 'e', 'g', '3', '2', ')', '|', 'c', 'a', 's', 't', '#', '1', '(',
+ '_', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 's', 'e', 'g', '3', '2', ')',
+ ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'S', 'e', 'g', 'm', 'e', 'n', 't', ' ',
+ 'R', 'E', 'A', 'D', '_', 'S', 'E', 'G', ' ', '=', ' ', 'o', 'u', 't', '_', 'r', 'e',
+ 'a', 'd', '_', 's', 'e', 'g', '|', 'c', 'a', 's', 't', '#', '1', '(', 'o', 'u', 't',
+ '_', 'r', 'e', 'a', 'd', '_', 's', 'e', 'g', '3', '2', ')', '|', 'c', 'a', 's', 't',
+ '#', '1', '(', '_', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 'e', 'g', '3',
+ '2', ')', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm',
+ 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'R', 'e', 'a', 'd', 'D', 'e',
+ 's', 'c', ' ', 'R', 'E', 'A', 'D', '_', 'D', 'E', 'S', 'C', ' ', '=', ' ', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'm', 'a', 'k', 'e', '_', 'r', 'e', 'a', 'd', '_',
+ 'd', 'e', 's', 'c', '#', '1', '(', 'o', 'u', 't', '_', 'n', 'r', 'e', 'a', 'd', 's',
+ ',', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', ',', 'o',
+ 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ',', 'o', 'u', 't', '_', 'r',
+ 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ',', '_', 'o', 'u', 't', '_', 'r', 'd', '_',
+ 'f', 'i', 'l', 't', 'e', 'r', ',', 'o', 'u', 't', '_', 'c', 's', '_', 'k', 'e', 'y',
+ ',', '_', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 's', 't', 'a', 'r', 't',
+ ',', '_', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 'l', 'e', 'n', ',', '_',
+ 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', ')', ';', 'r', 'e', 'a', 'd', 'o', 'n',
+ 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'S', 'p', 'o', 't', 'D', 'e', 's', 'c', ' ', 'S', 'P', 'O', 'T', '_', 'D',
+ 'E', 'S', 'C', ' ', '=', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'm', 'a',
+ 'k', 'e', '_', 's', 'p', 'o', 't', '_', 'd', 'e', 's', 'c', '#', '1', '(', 's', 'p',
+ 'o', 't', '_', 'l', 'e', 'n', ',', 'f', 'i', 'x', 'e', 'd', '_', 's', 'p', 'o', 't',
+ '_', 'l', 'e', 'n', ',', 's', 'i', 'g', 'n', 'a', 'l', '_', 'l', 'e', 'n', ',', 't',
+ 'r', 'i', 'm', '_', 's', 't', 'a', 'r', 't', ',', 't', 'r', 'i', 'm', '_', 'l', 'e',
+ 'n', ',', 'o', 'u', 't', '_', 'n', 'r', 'e', 'a', 'd', 's', ')', ';', 'r', 'e', 'a',
+ 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 'S', 'I', 'G', 'N', 'A',
+ 'L', '_', 'L', 'E', 'N', ' ', '=', ' ', 's', 'i', 'g', 'n', 'a', 'l', '_', 'l', 'e',
+ 'n', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n',
+ ' ', 'U', '1', '6', ' ', 'S', 'I', 'G', 'N', 'A', 'L', '_', 'L', 'E', 'N', ' ', '=',
+ ' ', 'c', 'a', 's', 't', '#', '1', '(', 's', 'i', 'g', 'n', 'a', 'l', '_', 'l', 'e',
+ 'n', ')', ';', 'U', '3', '2', ' ', '_', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l',
+ '_', 's', 't', 'a', 'r', 't', 'U', '3', '2', '=', '(', 'U', '3', '2', ')', 'o', 'u',
+ 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 's', 't', 'a', 'r', 't', ';', 'U', '3', '2',
+ '[', '2', ']', ' ', '_', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 's', 'e',
+ 'g', '3', '2', '=', '<', 'U', '3', '2', '>', 'p', 'a', 's', 't', 'e', '#', '1', '(',
+ '_', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 's', 't', 'a', 'r', 't', 'U',
+ '3', '2', ',', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 'l', 'e', 'n', ')',
+ ';', 'U', '3', '2', ' ', '_', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't',
+ 'a', 'r', 't', 'U', '3', '2', '=', '(', 'U', '3', '2', ')', 'o', 'u', 't', '_', 'r',
+ 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', ';', 'U', '3', '2', '[', '2', ']', ' ',
+ '_', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 'e', 'g', '3', '2', '=', '<',
+ 'U', '3', '2', '>', 'p', 'a', 's', 't', 'e', '#', '1', '(', '_', 'o', 'u', 't', '_',
+ 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', 'U', '3', '2', ',', 'o', 'u', 't',
+ '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':',
+ 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', ' ', '_',
+ 'o', 'u', 't', '_', 'r', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', '=', 'o', 'u', 't',
+ '_', 'r', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', '|', '<', 'I', 'N', 'S', 'D', 'C',
+ ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', '>',
+ 'e', 'c', 'h', 'o', '#', '1', '<', '0', '>', '(', 'o', 'u', 't', '_', 'r', 'e', 'a',
+ 'd', '_', 's', 't', 'a', 'r', 't', ')', ';', 'a', 's', 'c', 'i', 'i', ' ', '_', 'o',
+ 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '=', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e',
+ 'l', '|', '<', 'a', 's', 'c', 'i', 'i', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '\'',
+ '\'', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'z', 'e', 'r', 'o', ' ', '_', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_',
+ 's', 't', 'a', 'r', 't', '=', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 's',
+ 't', 'a', 'r', 't', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'z', 'e', 'r', 'o', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '0', '>', '(', 'o',
+ 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', ')', ';', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', '_', 'o', 'u',
+ 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 'l', 'e', 'n', '=', 'o', 'u', 't', '_', 'l',
+ 'a', 'b', 'e', 'l', '_', 'l', 'e', 'n', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '0',
+ '>', '(', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', ')',
+ ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '_', 'n', 'o', 'p', 'h',
+ 'y', 's', '#', '1', '.', '0', '.', '2', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '_', 'n', 'o', 'c',
+ 'o', 'l', '#', '1', '.', '0', '.', '2', '{', 'U', '8', ' ', 'o', 'u', 't', '_', 'n',
+ 'r', 'e', 'a', 'd', 's', '=', '.', 'N', 'R', 'E', 'A', 'D', 'S', ';', 'a', 's', 'c',
+ 'i', 'i', ' ', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '=', '.', 'L', 'A', 'B',
+ 'E', 'L', ';', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'x', 'r', 'e', 'a',
+ 'd', '_', 't', 'y', 'p', 'e', ' ', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 't',
+ 'y', 'p', 'e', '=', '.', 'R', 'E', 'A', 'D', '_', 'T', 'Y', 'P', 'E', ';', 'I', 'N',
+ 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l', 't',
+ 'e', 'r', ' ', 'o', 'u', 't', '_', 'r', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', '=',
+ '.', 'R', 'D', '_', 'F', 'I', 'L', 'T', 'E', 'R', ';', 'I', 'N', 'S', 'D', 'C', ':',
+ 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'o', 'u', 't', '_', 'l', 'a',
+ 'b', 'e', 'l', '_', 's', 't', 'a', 'r', 't', '=', '.', 'L', 'A', 'B', 'E', 'L', '_',
+ 'S', 'T', 'A', 'R', 'T', '|', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'z', 'e', 'r', 'o', ')', '<', 'U', '3', '2', '>', 'c', 'u', 't', '#', '1',
+ '<', '0', '>', '(', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 's', 'e', 'g',
+ '3', '2', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l',
+ 'e', 'n', ' ', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 'l', 'e', 'n', '=',
+ '.', 'L', 'A', 'B', 'E', 'L', '_', 'L', 'E', 'N', '|', '(', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ')', '<', 'U', '3', '2', '>', 'c',
+ 'u', 't', '#', '1', '<', '1', '>', '(', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l',
+ '_', 's', 'e', 'g', '3', '2', ')', ';', 'U', '3', '2', '[', '2', ']', ' ', 'o', 'u',
+ 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 's', 'e', 'g', '3', '2', '=', 'c', 'a', 's',
+ 't', '#', '1', '(', '.', 'L', 'A', 'B', 'E', 'L', '_', 'S', 'E', 'G', ')', ';', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'o',
+ 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', '=', '.', 'R', 'E',
+ 'A', 'D', '_', 'S', 'T', 'A', 'R', 'T', '|', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ')', '<', 'U', '3', '2', '>', 'c', 'u',
+ 't', '#', '1', '<', '0', '>', '(', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's',
+ 'e', 'g', '3', '2', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'l', 'e', 'n', ' ', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n',
+ '=', '.', 'R', 'E', 'A', 'D', '_', 'L', 'E', 'N', '|', '(', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ')', '<', 'U', '3', '2', '>', 'c',
+ 'u', 't', '#', '1', '<', '1', '>', '(', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_',
+ 's', 'e', 'g', '3', '2', ')', ';', 'U', '3', '2', '[', '2', ']', ' ', 'o', 'u', 't',
+ '_', 'r', 'e', 'a', 'd', '_', 's', 'e', 'g', '3', '2', '=', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'f', 'i', 'x', '_', 'r', 'e', 'a', 'd', '_', 's', 'e', 'g', '#',
+ '1', '(', '.', 'R', 'E', 'A', 'D', '_', 'S', 'E', 'G', ',', 's', 'p', 'o', 't', '_',
+ 'l', 'e', 'n', ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '#',
+ '1', '.', '0', '.', '2', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b',
+ 'l', ':', 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '_', 'n', 'o', 'p', 'h', 'y', 's',
+ '#', '1', '.', '0', '.', '2', '{', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', '<', 'U', '8', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c',
+ 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'N', 'R', 'E', 'A', 'D', 'S', '=', 'N',
+ 'R', 'E', 'A', 'D', 'S', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', '<', 'a', 's', 'c', 'i', 'i', '>', 'z', 'i', 'p', '_', 'e',
+ 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'L', 'A', 'B', 'E', 'L', '=',
+ 'L', 'A', 'B', 'E', 'L', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'z', 'e', 'r', 'o', '>', 'i', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i',
+ 'n', 'g', '#', '1', ' ', '.', 'L', 'A', 'B', 'E', 'L', '_', 'S', 'T', 'A', 'R', 'T',
+ '=', 'L', 'A', 'B', 'E', 'L', '_', 'S', 'T', 'A', 'R', 'T', ';', 'p', 'h', 'y', 's',
+ 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', '>', 'i', 'z', 'i', 'p', '_',
+ 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'L', 'A', 'B', 'E', 'L',
+ '_', 'L', 'E', 'N', '=', 'L', 'A', 'B', 'E', 'L', '_', 'L', 'E', 'N', ';', 'p', 'h',
+ 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', '>', 'i', 'z',
+ 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'R', 'E',
+ 'A', 'D', '_', 'S', 'T', 'A', 'R', 'T', '=', 'R', 'E', 'A', 'D', '_', 'S', 'T', 'A',
+ 'R', 'T', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm',
+ 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e',
+ 'n', '>', 'i', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1',
+ ' ', '.', 'R', 'E', 'A', 'D', '_', 'L', 'E', 'N', '=', 'i', 'n', '_', 'r', 'e', 'a',
+ 'd', '_', 'l', 'e', 'n', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'x',
+ 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c',
+ 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'R', 'E', 'A', 'D', '_', 'T', 'Y', 'P',
+ 'E', '=', 'i', 'n', '_', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ';', 'p', 'h',
+ 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N',
+ 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l', 't',
+ 'e', 'r', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1',
+ ' ', '.', 'R', 'D', '_', 'F', 'I', 'L', 'T', 'E', 'R', '=', 'R', 'E', 'A', 'D', '_',
+ 'F', 'I', 'L', 'T', 'E', 'R', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 'p', 'o', 's', '#', '1', '.', '0',
+ '.', '1', '=', 'I', 'N', 'S', 'D', 'C', ':', 't', 'b', 'l', ':', 's', 'e', 'q', 'u',
+ 'e', 'n', 'c', 'e', '#', '1', '.', '0', '.', '1', '{', 'I', 'N', 'S', 'D', 'C', ':',
+ 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'o', 'n', 'e', ' ', 'o', 'u', 't', '_',
+ 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'p',
+ 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'o', 'n', 'e', '>', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'm', 'a', 'k', 'e', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n',
+ '#', '1', '<', '1', '>', '(', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'p', 'a', 'c',
+ 'k', 'e', 'd', ')', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't',
+ 'i', 'o', 'n', ':', 'o', 'n', 'e', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'm', 'a', 'k', 'e', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '#', '1', '<', '1',
+ '>', '(', 'o', 'u', 't', '_', '2', 'c', 's', '_', 'p', 'a', 'c', 'k', 'e', 'd', ')',
+ ';', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'p', 'o', 's', '1', '6', ' ', 'o',
+ 'u', 't', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '1', '6', '=', '<', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'p', 'o', 's', '1', '6', '>', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'm', 'a', 'k', 'e', '_', 'p', 'o', 's', 'i', 't', 'i', 'o',
+ 'n', '#', '1', '<', '1', '>', '(', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'p', 'a',
+ 'c', 'k', 'e', 'd', ')', '|', '<', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'p',
+ 'o', 's', '1', '6', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'm', 'a', 'k',
+ 'e', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '#', '1', '<', '1', '>', '(', 'o',
+ 'u', 't', '_', '2', 'c', 's', '_', 'p', 'a', 'c', 'k', 'e', 'd', ')', ';', '}', 't',
+ 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l',
+ ':', 's', 'r', 'a', '_', 'n', 'o', 'p', 'o', 's', '#', '1', '.', '0', '.', '3', '=',
+ 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a',
+ '#', '1', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't',
+ 'b', 'l', ':', 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '_', 'n', 'o', 'c', 'o', 'l',
+ '#', '1', '.', '0', '.', '2', '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'o', 'n', 'e', ' ', 'P',
+ 'O', 'S', 'I', 'T', 'I', 'O', 'N', ' ', '=', ' ', 'o', 'u', 't', '_', 'p', 'o', 's',
+ 'i', 't', 'i', 'o', 'n', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'p', 'o', 's',
+ '1', '6', ' ', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N', ' ', '=', ' ', 'o', 'u', 't',
+ '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '1', '6', ';', 'r', 'e', 'a', 'd', 'o',
+ 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':',
+ 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'z', 'e', 'r', 'o', ' ', 'P', 'O', 'S',
+ 'I', 'T', 'I', 'O', 'N', ' ', '=', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o',
+ 's', 'i', 't', 'i', 'o', 'n', ':', 'z', 'e', 'r', 'o', ')', '<', 'I', '3', '2', '>',
+ 'd', 'i', 'f', 'f', '#', '1', '<', '1', '>', '(', 'o', 'u', 't', '_', 'p', 'o', 's',
+ 'i', 't', 'i', 'o', 'n', ')', ';', 'U', '6', '4', ' ', 'b', 'a', 's', 'e', '_', 'c',
+ 'o', 'u', 'n', 't', '=', '<', 'U', '6', '4', '>', 'm', 'e', 't', 'a', ':', 'v', 'a',
+ 'l', 'u', 'e', '#', '1', '<', '\'', 'B', 'A', 'S', 'E', '_', 'C', 'O', 'U', 'N',
+ 'T', '\'', '>', '(', ')', ';', 'U', '6', '4', ' ', 's', 'p', 'o', 't', '_', 'c',
+ 'o', 'u', 'n', 't', '=', '<', 'U', '6', '4', '>', 'm', 'e', 't', 'a', ':', 'v', 'a',
+ 'l', 'u', 'e', '#', '1', '<', '\'', '.', 's', 'e', 'q', '/', 's', 'p', 'o', 't',
+ '\'', '>', '(', ')', '|', '<', 'U', '6', '4', '>', 'm', 'e', 't', 'a', ':', 'v',
+ 'a', 'l', 'u', 'e', '#', '1', '<', '\'', '.', 's', 'e', 'q', '\'', '>', '(', ')',
+ ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 't', 'b', 'l', ':', 's', 'r', 'a', '#', '1', '.', '0', '.', '3', '=', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a', '_', 'n', 'o', 'p',
+ 'o', 's', '#', '1', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 't', 'b', 'l', ':', 'p', 'o', 's', '#', '1', '.', '0', '.', '1', '{', '}', 't',
+ 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l',
+ ':', 's', 'r', 'a', '_', 'n', 'o', 'p', 'o', 's', '#', '2', '.', '1', '.', '3', '=',
+ 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a',
+ '#', '1', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't',
+ 'b', 'l', ':', 's', 'k', 'e', 'y', 'n', 'a', 'm', 'e', '#', '3', '.', '0', '.', '1',
+ ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'p', 'o',
+ 't', 'd', 'e', 's', 'c', '#', '1', '.', '0', '.', '2', ',', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 't', 'a', 't', 's', '#', '1', '.', '2',
+ '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's',
+ 'i', 't', 'i', 'o', 'n', ':', 'o', 'n', 'e', ' ', 'P', 'O', 'S', 'I', 'T', 'I', 'O',
+ 'N', ' ', '=', ' ', 'o', 'u', 't', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ';',
+ 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'p', 'o', 's', '1', '6', ' ', 'P', 'O', 'S',
+ 'I', 'T', 'I', 'O', 'N', ' ', '=', ' ', 'c', 'a', 's', 't', '#', '1', '(', '_', 'c',
+ 'l', 'i', 'p', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ')', ';', 'r', 'e', 'a',
+ 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'z', 'e', 'r', 'o', ' ', 'P',
+ 'O', 'S', 'I', 'T', 'I', 'O', 'N', ' ', '=', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':',
+ 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'z', 'e', 'r', 'o', ')', '<', 'I', '3',
+ '2', '>', 'd', 'i', 'f', 'f', '#', '1', '<', '1', '>', '(', 'o', 'u', 't', '_', 'p',
+ 'o', 's', 'i', 't', 'i', 'o', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R',
+ 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'o', 'u', 't',
+ '_', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '=', '.', 'P', 'L', 'A', 'T', 'F', 'O',
+ 'R', 'M', ';', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n',
+ ':', 'o', 'n', 'e', ' ', '_', 'c', 'l', 'i', 'p', '_', 'p', 'o', 's', 'i', 't', 'i',
+ 'o', 'n', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o',
+ 'n', ':', 'o', 'n', 'e', '>', 'c', 'l', 'i', 'p', '#', '1', '<', '0', ',', '6', '5',
+ '5', '3', '5', '>', '(', 'o', 'u', 't', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n',
+ ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 't', 'b', 'l', ':', 's', 'r', 'a', '#', '2', '.', '1', '.', '3', '=', 'I', 'N',
+ 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a', '#', '1',
+ '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l',
+ ':', 's', 'k', 'e', 'y', 'n', 'a', 'm', 'e', '#', '3', '.', '0', '.', '1', ',', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'd',
+ 'e', 's', 'c', '#', '1', '.', '0', '.', '2', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 't', 'b', 'l', ':', 's', 't', 'a', 't', 's', '#', '1', '.', '2', ',', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 'p', 'o', 's', '#', '1',
+ '.', '0', '.', '1', '{', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l',
+ 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o',
+ 'n', ':', 'o', 'n', 'e', ' ', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N', ' ', '=', ' ',
+ 'o', 'u', 't', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ';', 'r', 'e', 'a', 'd',
+ 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'p', 'o', 's', '1', '6', ' ', 'P', 'O', 'S', 'I', 'T', 'I', 'O',
+ 'N', ' ', '=', ' ', 'o', 'u', 't', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '1',
+ '6', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n',
+ ' ', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'z',
+ 'e', 'r', 'o', ' ', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N', ' ', '=', ' ', '(', 'I',
+ 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'z', 'e', 'r',
+ 'o', ')', '<', 'I', '3', '2', '>', 'd', 'i', 'f', 'f', '#', '1', '<', '1', '>', '(',
+ 'o', 'u', 't', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ')', ';', '}', 't', 'a',
+ 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':',
+ 'c', 'l', 'i', 'p', '#', '1', '.', '0', '.', '2', '=', 'I', 'N', 'S', 'D', 'C', ':',
+ 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '#',
+ '1', '.', '0', '.', '2', '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 'C', 'L', 'I', 'P', '_',
+ 'A', 'D', 'A', 'P', 'T', 'E', 'R', '_', 'L', 'E', 'F', 'T', ' ', '=', ' ', 'o', 'u',
+ 't', '_', 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_', 'l', 'e', 'f', 't',
+ ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'o', 'n', 'e', ' ', 'C', 'L', 'I', 'P', '_', 'A', 'D', 'A', 'P', 'T',
+ 'E', 'R', '_', 'R', 'I', 'G', 'H', 'T', ' ', '=', ' ', 'o', 'u', 't', '_', 'c', 'l',
+ 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_', 'r', 'i', 'g', 'h', 't', ';', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'o', 'n', 'e', ' ', 'C', 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '_',
+ 'L', 'E', 'F', 'T', ' ', '=', ' ', 'o', 'u', 't', '_', 'c', 'l', 'i', 'p', '_', 'q',
+ 'u', 'a', 'l', '_', 'l', 'e', 'f', 't', ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 'C', 'L',
+ 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '_', 'R', 'I', 'G', 'H', 'T', ' ',
+ '=', ' ', 'o', 'u', 't', '_', 'c', 'l', 'i', 'p', '_', 'q', 'u', 'a', 'l', '_', 'r',
+ 'i', 'g', 'h', 't', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l',
+ 'u', 'm', 'n', ' ', 'U', '1', '6', ' ', 'C', 'L', 'I', 'P', '_', 'A', 'D', 'A', 'P',
+ 'T', 'E', 'R', '_', 'L', 'E', 'F', 'T', ' ', '=', ' ', '.', 'C', 'L', 'I', 'P', '_',
+ 'A', 'D', 'A', 'P', 'T', 'E', 'R', '_', 'L', 'E', 'F', 'T', '|', 'c', 'a', 's', 't',
+ '#', '1', '(', 'o', 'u', 't', '_', 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't',
+ '_', 'l', 'e', 'f', 't', ')', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'U', '1', '6', ' ', 'C', 'L', 'I', 'P', '_', 'A', 'D',
+ 'A', 'P', 'T', 'E', 'R', '_', 'R', 'I', 'G', 'H', 'T', ' ', '=', ' ', '.', 'C', 'L',
+ 'I', 'P', '_', 'A', 'D', 'A', 'P', 'T', 'E', 'R', '_', 'R', 'I', 'G', 'H', 'T', '|',
+ 'c', 'a', 's', 't', '#', '1', '(', 'o', 'u', 't', '_', 'c', 'l', 'i', 'p', '_', 'a',
+ 'd', 'a', 'p', 't', '_', 'r', 'i', 'g', 'h', 't', ')', ';', 'r', 'e', 'a', 'd', 'o',
+ 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'U', '1', '6', ' ', 'C', 'L',
+ 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '_', 'L', 'E', 'F', 'T', ' ', '=',
+ ' ', 'c', 'a', 's', 't', '#', '1', '(', 'o', 'u', 't', '_', 'c', 'l', 'i', 'p', '_',
+ 'q', 'u', 'a', 'l', '_', 'l', 'e', 'f', 't', ')', ';', 'r', 'e', 'a', 'd', 'o', 'n',
+ 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'U', '1', '6', ' ', 'C', 'L', 'I',
+ 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '_', 'R', 'I', 'G', 'H', 'T', ' ', '=',
+ ' ', 'c', 'a', 's', 't', '#', '1', '(', 'o', 'u', 't', '_', 'c', 'l', 'i', 'p', '_',
+ 'q', 'u', 'a', 'l', '_', 'r', 'i', 'g', 'h', 't', ')', ';', 'r', 'e', 'a', 'd', 'o',
+ 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':',
+ 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'C', 'L', 'I', 'P', '_', 'A',
+ 'D', 'A', 'P', 'T', 'E', 'R', '_', 'L', 'E', 'F', 'T', ' ', '=', ' ', '(', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ')', '<', 'I',
+ '3', '2', '>', 'd', 'i', 'f', 'f', '#', '1', '<', '1', '>', '(', 'l', 'i', 'm', '_',
+ 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_', 'l', 'e', 'f', 't', ')', ';',
+ 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'C',
+ 'L', 'I', 'P', '_', 'A', 'D', 'A', 'P', 'T', 'E', 'R', '_', 'R', 'I', 'G', 'H', 'T',
+ ' ', '=', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z',
+ 'e', 'r', 'o', ')', '<', 'I', '3', '2', '>', 'd', 'i', 'f', 'f', '#', '1', '<', '1',
+ '>', '(', 'l', 'i', 'm', '_', 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_',
+ 'r', 'i', 'g', 'h', 't', ')', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'z', 'e', 'r', 'o', ' ', 'C', 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T',
+ 'Y', '_', 'L', 'E', 'F', 'T', ' ', '=', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ')', '<', 'I', '3', '2', '>', 'd', 'i',
+ 'f', 'f', '#', '1', '<', '1', '>', '(', 'l', 'i', 'm', '_', 'c', 'l', 'i', 'p', '_',
+ 'q', 'u', 'a', 'l', '_', 'l', 'e', 'f', 't', ')', ';', 'r', 'e', 'a', 'd', 'o', 'n',
+ 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'C', 'L', 'I', 'P', '_', 'Q', 'U',
+ 'A', 'L', 'I', 'T', 'Y', '_', 'R', 'I', 'G', 'H', 'T', ' ', '=', ' ', '(', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ')', '<', 'I',
+ '3', '2', '>', 'd', 'i', 'f', 'f', '#', '1', '<', '1', '>', '(', 'l', 'i', 'm', '_',
+ 'c', 'l', 'i', 'p', '_', 'q', 'u', 'a', 'l', '_', 'r', 'i', 'g', 'h', 't', ')', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 'o',
+ 'u', 't', '_', 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_', 'l', 'e', 'f',
+ 't', '=', 'c', 'a', 's', 't', '#', '1', '(', '.', 'C', 'L', 'I', 'P', '_', 'A', 'D',
+ 'A', 'P', 'T', 'E', 'R', '_', 'L', 'E', 'F', 'T', ')', ';', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 'o', 'u', 't', '_', 'c', 'l',
+ 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_', 'r', 'i', 'g', 'h', 't', '=', 'c', 'a',
+ 's', 't', '#', '1', '(', '.', 'C', 'L', 'I', 'P', '_', 'A', 'D', 'A', 'P', 'T', 'E',
+ 'R', '_', 'R', 'I', 'G', 'H', 'T', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 'o', 'u', 't', '_', 'c', 'l', 'i', 'p', '_',
+ 'q', 'u', 'a', 'l', '_', 'l', 'e', 'f', 't', '=', 'c', 'a', 's', 't', '#', '1', '(',
+ '.', 'C', 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '_', 'L', 'E', 'F',
+ 'T', ')', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o',
+ 'n', 'e', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '1', '>', '(', ')', ';', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 'o', 'u', 't',
+ '_', 'c', 'l', 'i', 'p', '_', 'q', 'u', 'a', 'l', '_', 'r', 'i', 'g', 'h', 't', '=',
+ 'c', 'a', 's', 't', '#', '1', '(', '.', 'C', 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L',
+ 'I', 'T', 'Y', '_', 'R', 'I', 'G', 'H', 'T', ')', '|', 'c', 'a', 's', 't', '#', '1',
+ '(', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':',
+ 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 's', 'p', 'o', 't', '_', 'r', 'i',
+ 'g', 'h', 't', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'o', 'n', 'e', ')', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ';', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 'l', 'i', 'm', '_', 'c',
+ 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_', 'l', 'e', 'f', 't', '=', '<', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', '>', 'c', 'l',
+ 'i', 'p', '#', '1', '<', '1', ',', '2', '1', '4', '7', '4', '8', '3', '6', '4', '7',
+ '>', '(', 'o', 'u', 't', '_', 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_',
+ 'l', 'e', 'f', 't', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'o', 'n', 'e', ' ', 'm', 'a', 'x', '_', 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a',
+ 'p', 't', '_', 'r', 'i', 'g', 'h', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ',', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'o', 'n', 'e', '>', 'm', 'a', 'p', '#', '1', '<', '0', ',', '2',
+ '1', '4', '7', '4', '8', '3', '6', '4', '7', '>', '(', 'o', 'u', 't', '_', 'c', 'l',
+ 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_', 'r', 'i', 'g', 'h', 't', ')', ';', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 'l', 'i',
+ 'm', '_', 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_', 'r', 'i', 'g', 'h',
+ 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n',
+ 'e', '>', 'm', 'i', 'n', '#', '1', '(', 's', 'p', 'o', 't', '_', 'r', 'i', 'g', 'h',
+ 't', ',', 'm', 'a', 'x', '_', 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_',
+ 'r', 'i', 'g', 'h', 't', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'o', 'n', 'e', ' ', 'l', 'i', 'm', '_', 'c', 'l', 'i', 'p', '_', 'q', 'u',
+ 'a', 'l', '_', 'l', 'e', 'f', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'o', 'n', 'e', '>', 'c', 'l', 'i', 'p', '#', '1', '<', '1', ',',
+ '2', '1', '4', '7', '4', '8', '3', '6', '4', '7', '>', '(', 'o', 'u', 't', '_', 'c',
+ 'l', 'i', 'p', '_', 'q', 'u', 'a', 'l', '_', 'l', 'e', 'f', 't', ')', ';', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 'm', 'a', 'x',
+ '_', 'c', 'l', 'i', 'p', '_', 'q', 'u', 'a', 'l', '_', 'r', 'i', 'g', 'h', 't', '=',
+ '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ',',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', '>', 'm',
+ 'a', 'p', '#', '1', '<', '0', ',', '2', '1', '4', '7', '4', '8', '3', '6', '4', '7',
+ '>', '(', 'o', 'u', 't', '_', 'c', 'l', 'i', 'p', '_', 'q', 'u', 'a', 'l', '_', 'r',
+ 'i', 'g', 'h', 't', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'o', 'n', 'e', ' ', 'l', 'i', 'm', '_', 'c', 'l', 'i', 'p', '_', 'q', 'u', 'a',
+ 'l', '_', 'r', 'i', 'g', 'h', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'o', 'n', 'e', '>', 'm', 'i', 'n', '#', '1', '(', 's', 'p', 'o',
+ 't', '_', 'r', 'i', 'g', 'h', 't', ',', 'm', 'a', 'x', '_', 'c', 'l', 'i', 'p', '_',
+ 'q', 'u', 'a', 'l', '_', 'r', 'i', 'g', 'h', 't', ')', ';', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', ' ', 'm', 'a', 'x', '_', 'c', 'l',
+ 'i', 'p', '_', 'l', 'e', 'f', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'o', 'n', 'e', '>', 'm', 'a', 'x', '#', '1', '(', 'l', 'i', 'm',
+ '_', 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_', 'l', 'e', 'f', 't', ',',
+ 'l', 'i', 'm', '_', 'c', 'l', 'i', 'p', '_', 'q', 'u', 'a', 'l', '_', 'l', 'e', 'f',
+ 't', ')', '|', 'l', 'i', 'm', '_', 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't',
+ '_', 'l', 'e', 'f', 't', '|', 'l', 'i', 'm', '_', 'c', 'l', 'i', 'p', '_', 'q', 'u',
+ 'a', 'l', '_', 'l', 'e', 'f', 't', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'm', 'a', 'x', '_', 'z', 'c', 'l', 'i', 'p',
+ '_', 'l', 'e', 'f', 't', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'z', 'e', 'r', 'o', ')', '<', 'I', '3', '2', '>', 'd', 'i', 'f', 'f', '#',
+ '1', '<', '1', '>', '(', 'm', 'a', 'x', '_', 'c', 'l', 'i', 'p', '_', 'l', 'e', 'f',
+ 't', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n',
+ 'e', ' ', 'm', 'i', 'n', '_', 'c', 'l', 'i', 'p', '_', 'r', 'i', 'g', 'h', 't', '=',
+ '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', '>',
+ 'm', 'i', 'n', '#', '1', '(', 'l', 'i', 'm', '_', 'c', 'l', 'i', 'p', '_', 'a', 'd',
+ 'a', 'p', 't', '_', 'r', 'i', 'g', 'h', 't', ',', 'l', 'i', 'm', '_', 'c', 'l', 'i',
+ 'p', '_', 'q', 'u', 'a', 'l', '_', 'r', 'i', 'g', 'h', 't', ')', '|', 'l', 'i', 'm',
+ '_', 'c', 'l', 'i', 'p', '_', 'a', 'd', 'a', 'p', 't', '_', 'r', 'i', 'g', 'h', 't',
+ '|', 'l', 'i', 'm', '_', 'c', 'l', 'i', 'p', '_', 'q', 'u', 'a', 'l', '_', 'r', 'i',
+ 'g', 'h', 't', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z',
+ 'e', 'r', 'o', ' ', 'b', 'i', 'o', '_', 's', 't', 'a', 'r', 't', '=', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'b', 'i', 'o', '_', 's', 't', 'a', 'r', 't', '#', '1',
+ '(', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', ',', 'o',
+ 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ')', ';', 'I', 'N', 'S',
+ 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 't', 'r', 'i',
+ 'm', '_', 's', 't', 'a', 'r', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', '>', 'm', 'a', 'x', '#', '1', '(', 'b', 'i',
+ 'o', '_', 's', 't', 'a', 'r', 't', ',', 'm', 'a', 'x', '_', 'z', 'c', 'l', 'i', 'p',
+ '_', 'l', 'e', 'f', 't', ')', '|', 'b', 'i', 'o', '_', 's', 't', 'a', 'r', 't', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ',
+ 'b', 'i', 'o', '_', 'e', 'n', 'd', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'b', 'i', 'o', '_', 'e', 'n', 'd', '#', '1', '<', 'f', 'a', 'l', 's', 'e', '>', '(',
+ 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', ',', 'o', 'u',
+ 't', '_', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ',', 'o', 'u', 't', '_', 'r',
+ 'e', 'a', 'd', '_', 'l', 'e', 'n', ')', ';', 'I', '3', '2', ' ', 't', 'r', 'i', 'm',
+ '_', 's', 't', 'o', 'p', '=', '<', 'I', '3', '2', '>', 'm', 'a', 'x', '#', '1', '(',
+ 'm', 'i', 'n', '_', 'c', 'l', 'i', 'p', '_', 'r', 'i', 'g', 'h', 't', ',', 't', 'r',
+ 'i', 'm', '_', 's', 't', 'a', 'r', 't', ')', '|', 's', 'p', 'o', 't', '_', 'r', 'i',
+ 'g', 'h', 't', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l',
+ 'e', 'n', ' ', 't', 'r', 'i', 'm', '_', 'l', 'e', 'n', '=', '(', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ')', '<', 'I', '3', '2', '>',
+ 'd', 'i', 'f', 'f', '#', '1', '(', 't', 'r', 'i', 'm', '_', 's', 't', 'o', 'p', ',',
+ 't', 'r', 'i', 'm', '_', 's', 't', 'a', 'r', 't', ')', ';', '}', 't', 'a', 'b', 'l',
+ 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':',
+ 'c', 'o', 'm', 'm', 'o', 'n', '#', '1', '.', '0', '.', '4', '=', 'I', 'N', 'S', 'D',
+ 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a', '#', '1', '.', '0',
+ '.', '3', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 'c',
+ 'l', 'i', 'p', '#', '1', '.', '0', '.', '2', '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'F', 'L',
+ 'O', 'W', '_', 'C', 'H', 'A', 'R', 'S', ' ', '=', ' ', 'o', 'u', 't', '_', 'f', 'l',
+ 'o', 'w', '_', 'c', 'h', 'a', 'r', 's', ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'K', 'E', 'Y',
+ '_', 'S', 'E', 'Q', 'U', 'E', 'N', 'C', 'E', ' ', '=', ' ', 'o', 'u', 't', '_', 'k',
+ 'e', 'y', '_', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', ';', 'c', 'o', 'l', 'u', 'm',
+ 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ',
+ 'L', 'I', 'N', 'K', 'E', 'R', '_', 'S', 'E', 'Q', 'U', 'E', 'N', 'C', 'E', ' ', '=',
+ ' ', 'o', 'u', 't', '_', 'l', 'i', 'n', 'k', 'e', 'r', '_', 's', 'e', 'q', 'u', 'e',
+ 'n', 'c', 'e', ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'i',
+ 's', 'a', 'm', 'p', '1', ' ', 'S', 'I', 'G', 'N', 'A', 'L', ' ', '=', ' ', 'o', 'u',
+ 't', '_', 's', 'i', 'g', 'n', 'a', 'l', ';', 'a', 's', 'c', 'i', 'i', ' ', 'p', 'l',
+ 'a', 't', 'f', 'o', 'r', 'm', '_', 'n', 'a', 'm', 'e', '=', '<', 'a', 's', 'c', 'i',
+ 'i', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '\'', '4', '5', '4', '\'', '>', '(',
+ ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ',
+ 'i', 'n', '_', 'f', 'l', 'o', 'w', '_', 'c', 'h', 'a', 'r', 's', '=', '<', 'I', 'N',
+ 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ',', 'I', 'N', 'S', 'D',
+ 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'm', 'a', 'p', '#', '1', '<',
+ '\'', 'a', 'c', 'g', 't', 'n', '.', '\'', ',', '\'', 'A', 'C', 'G', 'T', 'N', 'N',
+ '\'', '>', '(', 'F', 'L', 'O', 'W', '_', 'C', 'H', 'A', 'R', 'S', ')', ';', 'I',
+ 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'i', 'n', '_',
+ 'k', 'e', 'y', '_', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', '=', '<', 'I', 'N', 'S',
+ 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ',', 'I', 'N', 'S', 'D', 'C',
+ ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'm', 'a', 'p', '#', '1', '<', '\'',
+ 'a', 'c', 'g', 't', 'n', '.', '\'', ',', '\'', 'A', 'C', 'G', 'T', 'N', 'N', '\'',
+ '>', '(', 'K', 'E', 'Y', '_', 'S', 'E', 'Q', 'U', 'E', 'N', 'C', 'E', ')', ';', 'I',
+ 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'i', 'n', '_',
+ 'l', 'i', 'n', 'k', 'e', 'r', '_', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', '=', '<',
+ 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ',', 'I', 'N',
+ 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'm', 'a', 'p', '#',
+ '1', '<', '\'', 'a', 'c', 'g', 't', 'n', '.', '\'', ',', '\'', 'A', 'C', 'G', 'T',
+ 'N', 'N', '\'', '>', '(', 'L', 'I', 'N', 'K', 'E', 'R', '_', 'S', 'E', 'Q', 'U',
+ 'E', 'N', 'C', 'E', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':',
+ 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', 'f', 'l', 'o', 'w', '_', 'b', 'i', 'n', '=',
+ '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ',', 'I',
+ 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', '>', 'm', 'a', 'p',
+ '#', '1', '<', '\'', 'A', 'C', 'G', 'T', 'N', '\'', ',', '[', '0', ',', '1', ',',
+ '2', ',', '3', ',', '4', ']', '>', '(', 'o', 'u', 't', '_', 'f', 'l', 'o', 'w', '_',
+ 'c', 'h', 'a', 'r', 's', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a',
+ ':', 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', 'k', 'e', 'y', '_', 'b', 'i', 'n', '=',
+ '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ',', 'I',
+ 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i', 'n', '>', 'm', 'a', 'p',
+ '#', '1', '<', '\'', 'A', 'C', 'G', 'T', 'N', '\'', ',', '[', '0', ',', '1', ',',
+ '2', ',', '3', ',', '4', ']', '>', '(', 'o', 'u', 't', '_', 'k', 'e', 'y', '_', 's',
+ 'e', 'q', 'u', 'e', 'n', 'c', 'e', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2',
+ 'n', 'a', ':', 'b', 'i', 'n', ' ', 'o', 'u', 't', '_', 'l', 'i', 'n', 'k', 'e', 'r',
+ '_', 'b', 'i', 'n', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't',
+ 'e', 'x', 't', ',', 'I', 'N', 'S', 'D', 'C', ':', 'x', '2', 'n', 'a', ':', 'b', 'i',
+ 'n', '>', 'm', 'a', 'p', '#', '1', '<', '\'', 'A', 'C', 'G', 'T', 'N', '\'', ',',
+ '[', '0', ',', '1', ',', '2', ',', '3', ',', '4', ']', '>', '(', 'o', 'u', 't', '_',
+ 'l', 'i', 'n', 'k', 'e', 'r', '_', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', ')', ';',
+ 'N', 'C', 'B', 'I', ':', 'i', 's', 'a', 'm', 'p', '1', ' ', 'o', 'u', 't', '_', 's',
+ 'i', 'g', 'n', 'a', 'l', '=', '.', 'S', 'I', 'G', 'N', 'A', 'L', ';', '}', 't', 'a',
+ 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4',
+ '_', ':', 't', 'b', 'l', ':', 'v', '2', '#', '1', '.', '0', '.', '7', '=', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a', '_', 'n', 'o',
+ 'p', 'o', 's', '#', '2', '.', '1', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 't', 'b',
+ 'l', ':', 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '#', '2', '.', '0', '.',
+ '3', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'p', 'h', 'r', 'e', 'd', '_',
+ 'q', 'u', 'a', 'l', 'i', 't', 'y', '#', '2', '.', '0', '.', '4', ',', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'c', 'o', 'm', 'm', 'o',
+ 'n', '#', '1', '.', '0', '.', '4', '{', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'v', 'a', 'l', ' ', 'R', 'E', 'G', 'I', 'O', 'N', ' ', '=', ' ', '(', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ')', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 'n', 'a',
+ 'm', 'e', '_', 'c', 'o', 'o', 'r', 'd', '#', '1', '<', '6', '>', '(', '_', 'o', 'u',
+ 't', '_', 'n', 'a', 'm', 'e', ',', 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'n',
+ 'a', 'm', 'e', '_', 't', 'o', 'k', ')', ';', 't', 'e', 'x', 't', ':', 't', 'o', 'k',
+ 'e', 'n', ' ', 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_',
+ 't', 'o', 'k', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4',
+ '_', ':', 't', 'o', 'k', 'e', 'n', 'i', 'z', 'e', '_', 's', 'p', 'o', 't', '_', 'n',
+ 'a', 'm', 'e', '#', '1', '(', '_', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e', ')', ';',
+ 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n', ' ', 'i', 'n', '_', 's', 'p', 'o',
+ 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', '=', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 't', 'o', 'k', 'e', 'n', 'i', 'z', 'e',
+ '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', 'N', 'A', 'M', 'E',
+ ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ',
+ 'o', 'u', 't', '_', 'f', 'l', 'o', 'w', '_', 'c', 'h', 'a', 'r', 's', '=', '.', 'F',
+ 'L', 'O', 'W', '_', 'C', 'H', 'A', 'R', 'S', '|', '<', 'I', 'N', 'S', 'D', 'C', ':',
+ 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '\'',
+ 'T', 'A', 'C', 'G', '\'', '>', '(', '.', 'S', 'I', 'G', 'N', 'A', 'L', ')', '|',
+ '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'e',
+ 'c', 'h', 'o', '#', '1', '<', '\'', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T',
+ 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A',
+ 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C',
+ 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G',
+ 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T',
+ 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A',
+ 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C',
+ 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G',
+ 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T',
+ 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A',
+ 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C',
+ 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G',
+ 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T',
+ 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A',
+ 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C',
+ 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G',
+ 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T',
+ 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A',
+ 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C',
+ 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G',
+ 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T',
+ 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A',
+ 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C',
+ 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'A', 'C', 'G',
+ '\'', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't',
+ 'e', 'x', 't', ' ', 'o', 'u', 't', '_', 'k', 'e', 'y', '_', 's', 'e', 'q', 'u', 'e',
+ 'n', 'c', 'e', '=', '.', 'K', 'E', 'Y', '_', 'S', 'E', 'Q', 'U', 'E', 'N', 'C', 'E',
+ '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>',
+ 'e', 'c', 'h', 'o', '#', '1', '<', '\'', 'T', 'C', 'A', 'G', '\'', '>', '(', ')',
+ ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'o',
+ 'u', 't', '_', 'l', 'i', 'n', 'k', 'e', 'r', '_', 's', 'e', 'q', 'u', 'e', 'n', 'c',
+ 'e', '=', '.', 'L', 'I', 'N', 'K', 'E', 'R', '_', 'S', 'E', 'Q', 'U', 'E', 'N', 'C',
+ 'E', ';', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':',
+ 'o', 'n', 'e', ' ', 'o', 'u', 't', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '=',
+ '.', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a',
+ 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd',
+ 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd',
+ 'i', 'n', 'g', '#', '1', ' ', '.', 'F', 'L', 'O', 'W', '_', 'C', 'H', 'A', 'R', 'S',
+ '=', 'i', 'n', '_', 'f', 'l', 'o', 'w', '_', 'c', 'h', 'a', 'r', 's', ';', 'p', 'h',
+ 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N',
+ 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'z', 'i', 'p', '_',
+ 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'K', 'E', 'Y', '_', 'S',
+ 'E', 'Q', 'U', 'E', 'N', 'C', 'E', '=', 'i', 'n', '_', 'k', 'e', 'y', '_', 's', 'e',
+ 'q', 'u', 'e', 'n', 'c', 'e', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':',
+ 't', 'e', 'x', 't', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g',
+ '#', '1', ' ', '.', 'L', 'I', 'N', 'K', 'E', 'R', '_', 'S', 'E', 'Q', 'U', 'E', 'N',
+ 'C', 'E', '=', 'i', 'n', '_', 'l', 'i', 'n', 'k', 'e', 'r', '_', 's', 'e', 'q', 'u',
+ 'e', 'n', 'c', 'e', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l',
+ 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4',
+ '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'P', 'O', 'S', 'I', 'T', 'I',
+ 'O', 'N', '#', '2', ' ', '.', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N', '=', 'P', 'O',
+ 'S', 'I', 'T', 'I', 'O', 'N', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4',
+ '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'C', 'L', 'I', 'P',
+ '#', '2', ' ', '.', 'C', 'L', 'I', 'P', '_', 'A', 'D', 'A', 'P', 'T', 'E', 'R', '_',
+ 'L', 'E', 'F', 'T', '=', 'C', 'L', 'I', 'P', '_', 'A', 'D', 'A', 'P', 'T', 'E', 'R',
+ '_', 'L', 'E', 'F', 'T', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5',
+ '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'C', 'L', 'I', 'P', '#',
+ '2', ' ', '.', 'C', 'L', 'I', 'P', '_', 'A', 'D', 'A', 'P', 'T', 'E', 'R', '_', 'R',
+ 'I', 'G', 'H', 'T', '=', 'C', 'L', 'I', 'P', '_', 'A', 'D', 'A', 'P', 'T', 'E', 'R',
+ '_', 'R', 'I', 'G', 'H', 'T', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4',
+ '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'C', 'L', 'I', 'P',
+ '#', '2', ' ', '.', 'C', 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '_',
+ 'L', 'E', 'F', 'T', '=', 'C', 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y',
+ '_', 'L', 'E', 'F', 'T', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5',
+ '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'C', 'L', 'I', 'P', '#',
+ '2', ' ', '.', 'C', 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '_', 'R',
+ 'I', 'G', 'H', 'T', '=', 'C', 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y',
+ '_', 'R', 'I', 'G', 'H', 'T', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4',
+ '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'S', 'I', 'G', 'N',
+ 'A', 'L', '#', '2', ' ', '.', 'S', 'I', 'G', 'N', 'A', 'L', '=', 'S', 'I', 'G', 'N',
+ 'A', 'L', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'q', 'u', 'a', 'l', '4', '_',
+ 'n', 'o', 'c', 'o', 'l', '#', '1', '.', '0', '.', '1', '=', 'I', 'N', 'S', 'D', 'C',
+ ':', 't', 'b', 'l', ':', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', '#', '1', '.', '0',
+ '.', '1', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'l', 'o', 'g', '_', 'o',
+ 'd', 'd', 's', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '_', 'n', 'o', 'c', 'o', 'l',
+ '#', '1', '.', '0', '.', '1', '{', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', '4', ' ',
+ 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ' ', '=', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a',
+ 'l', '4', ';', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', '4', ' ', 'o', 'u', 't',
+ '_', 'q', 'u', 'a', 'l', '4', '=', '<', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l',
+ '4', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#', '1',
+ '(', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '4', '_', 's', 'w', 'a', 'p', 'p', 'e',
+ 'd', ',', 'r', 'e', 'a', 'd', '_', 'u', 'n', 'p', 'a', 'c', 'k', ')', '|', '<', 'N',
+ 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', '4', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'r', 'o', 't', 'a', 't', 'e', '#', '1', '<', 'f', 'a', 'l', 's', 'e', '>',
+ '(', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '4', '_', 'r', 'o', 't', 'a', 't', 'e',
+ 'd', ',', 'r', 'e', 'a', 'd', '_', 'u', 'n', 'p', 'a', 'c', 'k', ')', ';', 'I', 'N',
+ 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o',
+ 'd', 'd', 's', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '1', '_', 'c', 'h', '0',
+ '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l',
+ 'o', 'g', '_', 'o', 'd', 'd', 's', '>', 'c', 'u', 't', '#', '1', '<', '0', '>', '(',
+ 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '4', '_', 's', 'w', 'a', 'p', 'p', 'e', 'd',
+ ')', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':',
+ 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '>', 'c', 'u', 't', '#', '1', '<', '0', '>',
+ '(', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '4', '_', 'r', 'o', 't', 'a', 't', 'e',
+ 'd', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':',
+ 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l',
+ '1', '_', 'c', 'l', 'i', 'p', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a',
+ 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '>', 'c', 'l', 'i',
+ 'p', '#', '1', '<', '-', '5', ',', '1', '2', '7', '>', '(', 'o', 'u', 't', '_', 'q',
+ 'u', 'a', 'l', '1', '_', 'c', 'h', '0', ')', ';', 'U', '3', '2', ' ', 'o', 'u', 't',
+ '_', 'q', 'u', 'a', 'l', '4', '_', '3', '2', '=', 'r', 'e', 'd', 'i', 'm', 'e', 'n',
+ 's', 'i', 'o', 'n', '#', '1', '(', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '4', '_',
+ 's', 'w', 'a', 'p', 'p', 'e', 'd', ')', '|', 'r', 'e', 'd', 'i', 'm', 'e', 'n', 's',
+ 'i', 'o', 'n', '#', '1', '(', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '4', '_', 'r',
+ 'o', 't', 'a', 't', 'e', 'd', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a',
+ 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ' ', 'o', 'u', 't',
+ '_', 'q', 'u', 'a', 'l', '1', '_', 'f', 'i', 'v', 'e', 's', '=', '<', 'U', '3', '2',
+ ',', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o',
+ 'g', '_', 'o', 'd', 'd', 's', '>', 'm', 'a', 'p', '#', '1', '<', '4', '2', '2', '7',
+ '5', '9', '5', '2', '5', '9', ',', '-', '6', '>', '(', 'o', 'u', 't', '_', 'q', 'u',
+ 'a', 'l', '4', '_', '3', '2', ',', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '1', '_',
+ 'c', 'l', 'i', 'p', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i',
+ 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ' ', 'o', 'u', 't', '_', 'q',
+ 'u', 'a', 'l', '1', '_', 'n', '=', '<', 'U', '8', ',', 'I', 'N', 'S', 'D', 'C', ':',
+ 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '>',
+ 'm', 'a', 'p', '#', '1', '<', '[', '1', ',', '2', ',', '3', ']', ',', '[', '0', ',',
+ '0', ',', '0', ']', '>', '(', 'r', 'e', 'a', 'd', '_', 'u', 'n', 'p', 'a', 'c', 'k',
+ ',', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '1', '_', 'f', 'i', 'v', 'e', 's', ')',
+ ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o',
+ 'g', '_', 'o', 'd', 'd', 's', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'l',
+ 'o', 'g', '_', 'o', 'd', 'd', 's', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u',
+ 'a', 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ',', 'I', 'N',
+ 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o',
+ 'd', 'd', 's', '>', 'm', 'a', 'p', '#', '1', '<', '-', '6', ',', '-', '6', '>', '(',
+ 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '1', '_', 'n', ',', 'o', 'u', 't', '_', 'q',
+ 'u', 'a', 'l', '1', '_', 'c', 'l', 'i', 'p', ')', ';', '}', 't', 'a', 'b', 'l', 'e',
+ ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n',
+ 'a', ':', 'q', 'u', 'a', 'l', '4', '#', '1', '.', '0', '.', '1', '=', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'q', 'u',
+ 'a', 'l', '4', '_', 'n', 'o', 'c', 'o', 'l', '#', '1', '.', '0', '.', '1', '{', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'q',
+ 'u', 'a', 'l', '4', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '4', '_', 's', 'w',
+ 'a', 'p', 'p', 'e', 'd', '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', '}', 't',
+ 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l',
+ 'u', 'm', 'i', 'n', 'a', ':', 'q', 'u', 'a', 'l', '4', '#', '2', '.', '1', '=', 'N',
+ 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c',
+ 'e', '#', '2', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':',
+ 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '_',
+ 'n', 'o', 'c', 'o', 'l', '#', '2', '.', '1', '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', '4', ' ', 'Q', 'U', 'A', 'L', 'I', 'T',
+ 'Y', ' ', '=', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '4', ';', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'q', 'u', 'a',
+ 'l', '4', ' ', 'i', 'n', '_', 'q', 'u', 'a', 'l', '4', '=', '(', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'q', 'u', 'a', 'l',
+ '4', ')', '<', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', '4', '>', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#', '1', '(', 'Q', 'U', 'A', 'L',
+ 'I', 'T', 'Y', ',', 'i', 'n', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', '|',
+ '(', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd',
+ '_', 'q', 'u', 'a', 'l', '4', ')', '<', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l',
+ '4', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#', '1',
+ '(', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ',', 'i', 'n', '_', '2', 'n', 'a', '_', 'b',
+ 'i', 'n', ')', ';', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', '4', ' ', 'o', 'u',
+ 't', '_', 'q', 'u', 'a', 'l', '4', '=', '<', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'q', 'u', 'a', 'l', '4', '>', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#', '1', '(', '.', 'Q', 'U',
+ 'A', 'L', 'I', 'T', 'Y', ',', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i',
+ 'n', ')', ';', 'N', 'C', 'B', 'I', ':', 'q', 'u', 'a', 'l', '4', ' ', 'i', 'n', '_',
+ 's', 't', 'a', 't', 's', '_', 'q', 'u', 'a', 'l', '=', 'i', 'n', '_', 'q', 'u', 'a',
+ 'l', '4', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':',
+ 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', ' ', 'i', 'n', '_', 'q', 'u', 'a', 'l', '_',
+ 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'q',
+ 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '>', 'c',
+ 'u', 't', '#', '1', '<', '0', '>', '(', 'i', 'n', '_', 'q', 'u', 'a', 'l', '4', ')',
+ ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'l', 'o',
+ 'g', '_', 'o', 'd', 'd', 's', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'l',
+ 'o', 'g', '_', 'o', 'd', 'd', 's', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u',
+ 'a', 'l', 'i', 't', 'y', ':', 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '>', 'c', 'u',
+ 't', '#', '1', '<', '0', '>', '(', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ')', ';',
+ 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'q', 'u', 'a', 'l', '4', '_', 'e', 'n', 'c',
+ 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '=',
+ 'i', 'n', '_', 'q', 'u', 'a', 'l', '4', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':',
+ 'c', 'o', 'm', 'm', 'o', 'n', '#', '1', '.', '0', '.', '3', '=', 'I', 'N', 'S', 'D',
+ 'C', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a', '#', '1', '.', '0',
+ '.', '3', '{', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm',
+ 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l',
+ ' ', 'L', 'A', 'N', 'E', ' ', '=', ' ', 'o', 'u', 't', '_', 'l', 'a', 'n', 'e', '_',
+ 'c', 'o', 'o', 'r', 'd', ';', 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'v', 'a', 'l', ' ', 'T', 'I', 'L', 'E', ' ', '=', ' ', 'o', 'u', 't', '_', 't', 'i',
+ 'l', 'e', '_', 'c', 'o', 'o', 'r', 'd', ';', 'a', 's', 'c', 'i', 'i', ' ', 'p', 'l',
+ 'a', 't', 'f', 'o', 'r', 'm', '_', 'n', 'a', 'm', 'e', '=', '<', 'a', 's', 'c', 'i',
+ 'i', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '\'', 'I', 'L', 'L', 'U', 'M', 'I',
+ 'N', 'A', '\'', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'b', 'i', 'o', '_', 's', 't', 'a', 'r', 't',
+ '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'b', 'i', 'o', '_', 's', 't', 'a',
+ 'r', 't', '#', '1', '(', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 's', 't', 'a',
+ 'r', 't', ',', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ')',
+ ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o',
+ ' ', 't', 'r', 'i', 'm', '_', 's', 't', 'a', 'r', 't', '=', 'b', 'i', 'o', '_', 's',
+ 't', 'a', 'r', 't', ';', 'U', '3', '2', ' ', 't', 'r', 'i', 'm', '_', 'l', 'e', 'f',
+ 't', '=', '(', 'U', '3', '2', ')', 't', 'r', 'i', 'm', '_', 's', 't', 'a', 'r', 't',
+ ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ',
+ 't', 'r', 'i', 'm', '_', 'l', 'e', 'n', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ')', '<', 'U', '3', '2', '>', 'd', 'i', 'f',
+ 'f', '#', '1', '(', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ',', 't', 'r', 'i', 'm',
+ '_', 'l', 'e', 'f', 't', ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 't', 'b',
+ 'l', ':', 'v', '2', '#', '1', '.', '0', '.', '4', '=', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a', '#', '2', '.', '1', '.', '3', ',',
+ 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'b', 'a', 's', 'e', '_', 's', 'p', 'a',
+ 'c', 'e', '#', '2', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'c', 'o', 'm', 'm', 'o', 'n', '#',
+ '1', '.', '0', '.', '3', '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I',
+ ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'S', 'I', 'G', 'N', 'A', 'L', '{', 'r', 'e',
+ 'a', 'd', '=', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l', ';', 'v', 'a', 'l',
+ 'i', 'd', 'a', 't', 'e', '=', '<', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p',
+ '4', '>', 'n', 'o', '_', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '#', '1', '(', 'i', 'n',
+ '_', 's', 'i', 'g', 'n', 'a', 'l', ',', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a',
+ 'l', ')', ';', '}', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'f',
+ 's', 'a', 'm', 'p', '4', ' ', 'N', 'O', 'I', 'S', 'E', '{', 'r', 'e', 'a', 'd', '=',
+ 'o', 'u', 't', '_', 'n', 'o', 'i', 's', 'e', ';', 'v', 'a', 'l', 'i', 'd', 'a', 't',
+ 'e', '=', '<', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', '>', 'n', 'o',
+ '_', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '#', '1', '(', 'i', 'n', '_', 'n', 'o', 'i',
+ 's', 'e', ',', 'o', 'u', 't', '_', 'n', 'o', 'i', 's', 'e', ')', ';', '}', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ' ',
+ 'I', 'N', 'T', 'E', 'N', 'S', 'I', 'T', 'Y', '{', 'r', 'e', 'a', 'd', '=', 'o', 'u',
+ 't', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y', ';', 'v', 'a', 'l', 'i', 'd',
+ 'a', 't', 'e', '=', '<', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', '>',
+ 'n', 'o', '_', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '#', '1', '(', 'i', 'n', '_', 'i',
+ 'n', 't', 'e', 'n', 's', 'i', 't', 'y', ',', 'o', 'u', 't', '_', 'i', 'n', 't', 'e',
+ 'n', 's', 'i', 't', 'y', ')', ';', '}', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u', 't', '_', 'l', 'a', 'n', 'e', '_', 'c',
+ 'o', 'o', 'r', 'd', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'v', 'a', 'l', ')', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'x', 't',
+ 'r', 'a', 'c', 't', '_', 'n', 'a', 'm', 'e', '_', 'c', 'o', 'o', 'r', 'd', '#', '1',
+ '<', '7', '>', '(', '_', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e', ',', 'o', 'u', 't',
+ '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', ')', ';', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u',
+ 't', '_', 't', 'i', 'l', 'e', '_', 'c', 'o', 'o', 'r', 'd', '=', '(', 'I', 'N', 'S',
+ 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ')', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 'n', 'a', 'm', 'e',
+ '_', 'c', 'o', 'o', 'r', 'd', '#', '1', '<', '6', '>', '(', '_', 'o', 'u', 't', '_',
+ 'n', 'a', 'm', 'e', ',', 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm',
+ 'e', '_', 't', 'o', 'k', ')', ';', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n',
+ ' ', 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o',
+ 'k', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i',
+ 'n', 'a', ':', 't', 'o', 'k', 'e', 'n', 'i', 'z', 'e', '_', 's', 'p', 'o', 't', '_',
+ 'n', 'a', 'm', 'e', '#', '1', '(', '_', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e', ')',
+ ';', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n', ' ', 'i', 'n', '_', 's', 'p',
+ 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', '=', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 't', 'o', 'k', 'e',
+ 'n', 'i', 'z', 'e', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(',
+ 'N', 'A', 'M', 'E', ')', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4',
+ ' ', 'i', 'n', '_', 's', 'i', 'g', 'n', 'a', 'l', '=', 'S', 'I', 'G', 'N', 'A', 'L',
+ ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'o', 'u', 't', '_',
+ 's', 'i', 'g', 'n', 'a', 'l', '=', '<', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', '>', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#', '1', '(', '.', 'S', 'I',
+ 'G', 'N', 'A', 'L', ',', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n',
+ ')', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'i', 'n', '_',
+ 'n', 'o', 'i', 's', 'e', '=', 'N', 'O', 'I', 'S', 'E', ';', 'N', 'C', 'B', 'I', ':',
+ 'f', 's', 'a', 'm', 'p', '4', ' ', 'o', 'u', 't', '_', 'n', 'o', 'i', 's', 'e', '=',
+ '.', 'N', 'O', 'I', 'S', 'E', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p',
+ '4', ' ', 'i', 'n', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y', '=', 'I', 'N',
+ 'T', 'E', 'N', 'S', 'I', 'T', 'Y', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm',
+ 'p', '4', ' ', 'o', 'u', 't', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y', '=',
+ '<', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', '>', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'd', 'e', 'n', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', '#',
+ '1', '(', 'o', 'u', 't', '_', 'n', 'o', 'r', 'm', '_', 'i', 'n', 't', 'e', 'n', 's',
+ 'i', 't', 'y', ',', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', ')',
+ ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'o', 'u', 't', '_',
+ 'n', 'o', 'r', 'm', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y', '=', '(', 'N',
+ 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ')', '<', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p',
+ '4', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#', '1',
+ '(', '.', 'I', 'N', 'T', 'E', 'N', 'S', 'I', 'T', 'Y', ',', 'o', 'u', 't', '_', 'x',
+ '2', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a',
+ 'm', 'p', '4', ' ', 'i', 'n', '_', 'n', 'o', 'r', 'm', '_', 'i', 'n', 't', 'e', 'n',
+ 's', 'i', 't', 'y', '=', '<', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4',
+ '>', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'n', 'o', 'r', 'm', 'a', 'l', 'i',
+ 'z', 'e', '#', '1', '(', 'i', 'n', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y',
+ ',', 'i', 'n', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', '|', '<', 'N', 'C',
+ 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'n', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', '#', '1', '(', 'i', 'n', '_',
+ 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y', ',', 'i', 'n', '_', '2', 'n', 'a', '_',
+ 'b', 'i', 'n', ')', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l',
+ 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u',
+ 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'S', 'I', 'G',
+ 'N', 'A', 'L', '#', '2', ' ', '.', 'S', 'I', 'G', 'N', 'A', 'L', '=', '(', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's',
+ 'a', 'm', 'p', '4', ')', '<', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4',
+ '>', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#', '1', '(',
+ 'i', 'n', '_', 's', 'i', 'g', 'n', 'a', 'l', ',', 'i', 'n', '_', 'x', '2', 'n', 'a',
+ '_', 'b', 'i', 'n', ')', '|', '(', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's',
+ 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', ')', '<', 'N', 'C',
+ 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 's', 'w', 'a', 'p', '#', '1', '(', 'i', 'n', '_', 's', 'i', 'g', 'n', 'a',
+ 'l', ',', 'i', 'n', '_', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', 'p', 'h', 'y',
+ 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c',
+ 'o', 'd', 'i', 'n', 'g', ':', 'N', 'O', 'I', 'S', 'E', '#', '2', ' ', '.', 'N', 'O',
+ 'I', 'S', 'E', '=', 'i', 'n', '_', 'n', 'o', 'i', 's', 'e', ';', 'p', 'h', 'y', 's',
+ 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o',
+ 'd', 'i', 'n', 'g', ':', 'I', 'N', 'T', 'E', 'N', 'S', 'I', 'T', 'Y', '#', '2', ' ',
+ '.', 'I', 'N', 'T', 'E', 'N', 'S', 'I', 'T', 'Y', '=', '(', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p',
+ '4', ')', '<', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', '>', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#', '1', '(', 'i', 'n', '_',
+ 'n', 'o', 'r', 'm', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y', ',', 'i', 'n',
+ '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', '|', '(', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p',
+ '4', ')', '<', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', '>', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#', '1', '(', 'i', 'n', '_',
+ 'n', 'o', 'r', 'm', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y', ',', 'i', 'n',
+ '_', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a',
+ ':', 't', 'b', 'l', ':', 'q', '4', ':', 'v', '2', '#', '1', '.', '1', '=', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 't',
+ 'b', 'l', ':', 'v', '2', '#', '1', '.', '0', '.', '4', ',', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'q', 'u', 'a', 'l',
+ '4', '#', '2', '.', '1', '{', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 't', 'b', 'l',
+ ':', 'q', '1', ':', 'v', '2', '#', '1', '.', '1', '=', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 't', 'b', 'l', ':', 'v',
+ '2', '#', '1', '.', '0', '.', '4', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':',
+ 'l', 'o', 'g', '_', 'o', 'd', 'd', 's', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '#',
+ '2', '.', '1', '{', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 't', 'b', 'l', ':', 'p',
+ 'h', 'r', 'e', 'd', ':', 'v', '2', '#', '1', '.', '0', '.', '4', '=', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 't', 'b',
+ 'l', ':', 'v', '2', '#', '1', '.', '0', '.', '4', ',', 'N', 'C', 'B', 'I', ':', 't',
+ 'b', 'l', ':', 'p', 'h', 'r', 'e', 'd', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '#',
+ '2', '.', '0', '.', '4', '{', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'A', 'B', 'I', ':', 'c', 'o', 'm', 'm', 'o', 'n', '#', '1',
+ '.', '0', '.', '3', '=', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't', 'b',
+ 'l', ':', 's', 'r', 'a', '#', '1', '.', '0', '.', '3', '{', 'c', 'o', 'l', 'u', 'm',
+ 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l',
+ ' ', 'P', 'A', 'N', 'E', 'L', ' ', '=', ' ', 'o', 'u', 't', '_', 'p', 'a', 'n', 'e',
+ 'l', '_', 'c', 'o', 'o', 'r', 'd', ';', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C',
+ 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'S', 'I', 'G', 'N', 'A', 'L', ' ',
+ '=', ' ', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l', ';', 'a', 's', 'c', 'i',
+ 'i', ' ', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'n', 'a', 'm', 'e', '=', '<',
+ 'a', 's', 'c', 'i', 'i', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '\'', 'A', 'B',
+ 'S', 'O', 'L', 'I', 'D', '\'', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':',
+ 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'b', 'i', 'o', '_', 's', 't',
+ 'a', 'r', 't', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'b', 'i', 'o', '_',
+ 's', 't', 'a', 'r', 't', '#', '1', '(', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_',
+ 's', 't', 'a', 'r', 't', ',', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 't', 'y',
+ 'p', 'e', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z',
+ 'e', 'r', 'o', ' ', 't', 'r', 'i', 'm', '_', 's', 't', 'a', 'r', 't', '=', 'b', 'i',
+ 'o', '_', 's', 't', 'a', 'r', 't', ';', 'U', '3', '2', ' ', 't', 'r', 'i', 'm', '_',
+ 'l', 'e', 'f', 't', '=', '(', 'U', '3', '2', ')', 't', 'r', 'i', 'm', '_', 's', 't',
+ 'a', 'r', 't', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l',
+ 'e', 'n', ' ', 't', 'r', 'i', 'm', '_', 'l', 'e', 'n', '=', '(', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ')', '<', 'U', '3', '2', '>',
+ 'd', 'i', 'f', 'f', '#', '1', '(', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ',', 't',
+ 'r', 'i', 'm', '_', 'l', 'e', 'f', 't', ')', ';', 'N', 'C', 'B', 'I', ':', 'f', 's',
+ 'a', 'm', 'p', '4', ' ', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l', '=', '(',
+ 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ')', '<', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm',
+ 'p', '4', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#',
+ '1', '(', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l', '_', 's', 'w', 'a', 'p',
+ 'p', 'e', 'd', ',', 'o', 'u', 't', '_', 'x', '2', 'c', 's', '_', 'b', 'i', 'n', ')',
+ ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'A', 'B', 'I', ':', 't', 'b', 'l', ':', 'v', '2', '#', '1', '.', '0', '.', '4', '=',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a', '#',
+ '2', '.', '1', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'c', 'o',
+ 'l', 'o', 'r', '_', 's', 'p', 'a', 'c', 'e', '#', '2', '.', '1', ',', 'N', 'C', 'B',
+ 'I', ':', 't', 'b', 'l', ':', 'p', 'h', 'r', 'e', 'd', '_', 'q', 'u', 'a', 'l', 'i',
+ 't', 'y', '#', '2', '.', '0', '.', '4', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'A', 'B', 'I', ':', 'c', 'o', 'm', 'm', 'o', 'n', '#', '1', '.', '0', '.', '3',
+ '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm',
+ 'p', '1', ' ', 'F', 'T', 'C', '{', 'r', 'e', 'a', 'd', '=', 'o', 'u', 't', '_', 'f',
+ 't', 'c', ';', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '=', '<', 'F', '3', '2', '>',
+ 'n', 'o', '_', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '#', '1', '(', 'i', 'n', '_', 'f',
+ 't', 'c', ',', 'o', 'u', 't', '_', 'f', 't', 'c', ')', ';', '}', 'c', 'o', 'l', 'u',
+ 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ' ', 'F', 'A',
+ 'M', '{', 'r', 'e', 'a', 'd', '=', 'o', 'u', 't', '_', 'f', 'a', 'm', ';', 'v', 'a',
+ 'l', 'i', 'd', 'a', 't', 'e', '=', '<', 'F', '3', '2', '>', 'n', 'o', '_', 'c', 'o',
+ 'm', 'p', 'a', 'r', 'e', '#', '1', '(', 'i', 'n', '_', 'f', 'a', 'm', ',', 'o', 'u',
+ 't', '_', 'f', 'a', 'm', ')', ';', '}', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C',
+ 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ' ', 'C', 'Y', '3', '{', 'r', 'e', 'a',
+ 'd', '=', 'o', 'u', 't', '_', 'c', 'y', '3', ';', 'v', 'a', 'l', 'i', 'd', 'a', 't',
+ 'e', '=', '<', 'F', '3', '2', '>', 'n', 'o', '_', 'c', 'o', 'm', 'p', 'a', 'r', 'e',
+ '#', '1', '(', 'i', 'n', '_', 'c', 'y', '3', ',', 'o', 'u', 't', '_', 'c', 'y', '3',
+ ')', ';', '}', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'f', 's',
+ 'a', 'm', 'p', '1', ' ', 'T', 'X', 'R', '{', 'r', 'e', 'a', 'd', '=', 'o', 'u', 't',
+ '_', 't', 'x', 'r', ';', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '=', '<', 'F', '3',
+ '2', '>', 'n', 'o', '_', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '#', '1', '(', 'i', 'n',
+ '_', 't', 'x', 'r', ',', 'o', 'u', 't', '_', 't', 'x', 'r', ')', ';', '}', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ' ',
+ 'C', 'Y', '5', '{', 'r', 'e', 'a', 'd', '=', 'o', 'u', 't', '_', 'c', 'y', '5', ';',
+ 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '=', '<', 'F', '3', '2', '>', 'n', 'o', '_',
+ 'c', 'o', 'm', 'p', 'a', 'r', 'e', '#', '1', '(', 'i', 'n', '_', 'c', 'y', '5', ',',
+ 'o', 'u', 't', '_', 'c', 'y', '5', ')', ';', '}', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u', 't', '_', 'p', 'a', 'n', 'e',
+ 'l', '_', 'c', 'o', 'o', 'r', 'd', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'v', 'a', 'l', ')', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 'n', 'a', 'm', 'e', '_', 'c', 'o', 'o', 'r',
+ 'd', '#', '1', '<', '6', '>', '(', '_', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e', ',',
+ 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k',
+ ')', ';', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n', ' ', 'o', 'u', 't', '_',
+ 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', '=', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'A', 'B', 'I', ':', 't', 'o', 'k', 'e', 'n', 'i', 'z',
+ 'e', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', '_', 'o', 'u',
+ 't', '_', 'n', 'a', 'm', 'e', ')', ';', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e',
+ 'n', ' ', 'i', 'n', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o',
+ 'k', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'A', 'B', 'I', ':', 't', 'o',
+ 'k', 'e', 'n', 'i', 'z', 'e', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#',
+ '1', '(', 'N', 'A', 'M', 'E', ')', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm',
+ 'p', '1', ' ', 'i', 'n', '_', 'f', 't', 'c', '=', 'F', 'T', 'C', ';', 'N', 'C', 'B',
+ 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ' ', 'o', 'u', 't', '_', 'f', 't', 'c', '=',
+ '(', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ')', '<', 'F', '3', '2',
+ '>', 'c', 'u', 't', '#', '1', '<', '0', '>', '(', 'o', 'u', 't', '_', 's', 'i', 'g',
+ 'n', 'a', 'l', ')', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ' ',
+ 'i', 'n', '_', 'f', 'a', 'm', '=', 'F', 'A', 'M', ';', 'N', 'C', 'B', 'I', ':', 'f',
+ 's', 'a', 'm', 'p', '1', ' ', 'o', 'u', 't', '_', 'f', 'a', 'm', '=', '(', 'N', 'C',
+ 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ')', '<', 'F', '3', '2', '>', 'c', 'u',
+ 't', '#', '1', '<', '0', '>', '(', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l',
+ ')', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ' ', 'i', 'n', '_',
+ 'c', 'y', '3', '=', 'C', 'Y', '3', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm',
+ 'p', '1', ' ', 'o', 'u', 't', '_', 'c', 'y', '3', '=', '(', 'N', 'C', 'B', 'I', ':',
+ 'f', 's', 'a', 'm', 'p', '1', ')', '<', 'F', '3', '2', '>', 'c', 'u', 't', '#', '1',
+ '<', '1', '>', '(', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l', ')', ';', 'N',
+ 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ' ', 'i', 'n', '_', 't', 'x', 'r',
+ '=', 'T', 'X', 'R', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ' ',
+ 'o', 'u', 't', '_', 't', 'x', 'r', '=', '(', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a',
+ 'm', 'p', '1', ')', '<', 'F', '3', '2', '>', 'c', 'u', 't', '#', '1', '<', '2', '>',
+ '(', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l', ')', ';', 'N', 'C', 'B', 'I',
+ ':', 'f', 's', 'a', 'm', 'p', '1', ' ', 'i', 'n', '_', 'c', 'y', '5', '=', 'C', 'Y',
+ '5', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1', ' ', 'o', 'u', 't',
+ '_', 'c', 'y', '5', '=', '(', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '1',
+ ')', '<', 'F', '3', '2', '>', 'c', 'u', 't', '#', '1', '<', '3', '>', '(', 'o', 'u',
+ 't', '_', 's', 'i', 'g', 'n', 'a', 'l', ')', ';', 'N', 'C', 'B', 'I', ':', 'f', 's',
+ 'a', 'm', 'p', '4', ' ', 'i', 'n', '_', 's', 'i', 'g', 'n', 'a', 'l', '=', 'S', 'I',
+ 'G', 'N', 'A', 'L', '|', '(', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4',
+ ')', '<', 'F', '3', '2', '>', 'p', 'a', 's', 't', 'e', '#', '1', '(', 'i', 'n', '_',
+ 'f', 't', 'c', ',', 'i', 'n', '_', 'c', 'y', '3', ',', 'i', 'n', '_', 't', 'x', 'r',
+ ',', 'i', 'n', '_', 'c', 'y', '5', ')', '|', '(', 'N', 'C', 'B', 'I', ':', 'f', 's',
+ 'a', 'm', 'p', '4', ')', '<', 'F', '3', '2', '>', 'p', 'a', 's', 't', 'e', '#', '1',
+ '(', 'i', 'n', '_', 'f', 'a', 'm', ',', 'i', 'n', '_', 'c', 'y', '3', ',', 'i', 'n',
+ '_', 't', 'x', 'r', ',', 'i', 'n', '_', 'c', 'y', '5', ')', ';', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm',
+ 'p', '4', ' ', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l', '_', 's', 'w', 'a',
+ 'p', 'p', 'e', 'd', '=', '.', 'S', 'I', 'G', 'N', 'A', 'L', ';', 'p', 'h', 'y', 's',
+ 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'A', 'B', 'I', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':',
+ 'S', 'I', 'G', 'N', 'A', 'L', '#', '2', ' ', '.', 'S', 'I', 'G', 'N', 'A', 'L', '=',
+ '(', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd',
+ '_', 'f', 's', 'a', 'm', 'p', '4', ')', '<', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a',
+ 'm', 'p', '4', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p',
+ '#', '1', '(', 'i', 'n', '_', 's', 'i', 'g', 'n', 'a', 'l', ',', 'i', 'n', '_', 'x',
+ '2', 'c', 's', '_', 'b', 'i', 'n', ')', '|', '(', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', ')',
+ '<', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', '>', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#', '1', '(', 'i', 'n', '_', 's', 'i',
+ 'g', 'n', 'a', 'l', ',', 'i', 'n', '_', '2', 'c', 's', '_', 'b', 'i', 'n', ')', ';',
+ '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'H',
+ 'e', 'l', 'i', 'c', 'o', 's', ':', 't', 'b', 'l', ':', 'v', '2', '#', '1', '.', '0',
+ '.', '4', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's',
+ 'r', 'a', '#', '2', '.', '1', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l',
+ ':', 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '#', '2', '.', '0', '.', '3',
+ ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'p', 'h', 'r', 'e', 'd', '_', 'q',
+ 'u', 'a', 'l', 'i', 't', 'y', '#', '2', '.', '0', '.', '4', '{', 'r', 'e', 'a', 'd',
+ 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'C', 'H', 'A', 'N', 'N', 'E',
+ 'L', ' ', '=', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'v', 'a', 'l', ')', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'x', 't', 'r',
+ 'a', 'c', 't', '_', 'n', 'a', 'm', 'e', '_', 'c', 'o', 'o', 'r', 'd', '#', '1', '<',
+ '7', '>', '(', '_', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e', ',', 'o', 'u', 't', '_',
+ 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', ')', ';', 'r', 'e',
+ 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'F', 'I', 'E', 'L',
+ 'D', ' ', '=', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'v', 'a', 'l', ')', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e', 'x', 't', 'r',
+ 'a', 'c', 't', '_', 'n', 'a', 'm', 'e', '_', 'c', 'o', 'o', 'r', 'd', '#', '1', '<',
+ '6', '>', '(', '_', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e', ',', 'o', 'u', 't', '_',
+ 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', ')', ';', 'r', 'e',
+ 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'C', 'A', 'M', 'E',
+ 'R', 'A', ' ', '=', ' ', 'o', 'u', 't', '_', 'x', '_', 'c', 'o', 'o', 'r', 'd', ';',
+ 'r', 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'P', 'O',
+ 'S', ' ', '=', ' ', 'o', 'u', 't', '_', 'y', '_', 'c', 'o', 'o', 'r', 'd', ';', 'a',
+ 's', 'c', 'i', 'i', ' ', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'n', 'a', 'm',
+ 'e', '=', '<', 'a', 's', 'c', 'i', 'i', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '\'',
+ 'H', 'E', 'L', 'I', 'C', 'O', 'S', '\'', '>', '(', ')', ';', 't', 'e', 'x', 't',
+ ':', 't', 'o', 'k', 'e', 'n', ' ', 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'n',
+ 'a', 'm', 'e', '_', 't', 'o', 'k', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'H', 'e', 'l', 'i', 'c', 'o', 's', ':', 't', 'o', 'k', 'e', 'n', 'i', 'z', 'e', '_',
+ 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', '_', 'o', 'u', 't', '_',
+ 'n', 'a', 'm', 'e', ')', ';', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n', ' ',
+ 'i', 'n', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k', '=',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'H', 'e', 'l', 'i', 'c', 'o', 's', ':',
+ 't', 'o', 'k', 'e', 'n', 'i', 'z', 'e', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm',
+ 'e', '#', '1', '(', 'N', 'A', 'M', 'E', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c',
+ 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 't', 'r', 'i', 'm', '_', 's', 't',
+ 'a', 'r', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'z', 'e', 'r', 'o', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '0', '>', '(', ')', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 't',
+ 'r', 'i', 'm', '_', 'l', 'e', 'n', '=', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ';',
+ '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I',
+ 'o', 'n', 'T', 'o', 'r', 'r', 'e', 'n', 't', ':', 't', 'b', 'l', ':', 'v', '2', '#',
+ '1', '.', '0', '.', '3', '=', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 't',
+ 'b', 'l', ':', 's', 'r', 'a', '#', '1', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a', '_', 'n', 'o', 'p', 'o',
+ 's', '#', '2', '.', '1', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':',
+ 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '#', '2', '.', '0', '.', '3', ',',
+ 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'p', 'h', 'r', 'e', 'd', '_', 'q', 'u',
+ 'a', 'l', 'i', 't', 'y', '#', '2', '.', '0', '.', '4', ',', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 'c', 'l', 'i', 'p', '#', '1', '.', '0', '.',
+ '2', '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd',
+ 'n', 'a', ':', 't', 'e', 'x', 't', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd',
+ 'i', 'n', 'g', '#', '1', ' ', 'F', 'L', 'O', 'W', '_', 'C', 'H', 'A', 'R', 'S', ';',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a',
+ ':', 't', 'e', 'x', 't', '>', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n',
+ 'g', '#', '1', ' ', 'K', 'E', 'Y', '_', 'S', 'E', 'Q', 'U', 'E', 'N', 'C', 'E', ';',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'N', 'C', 'B', 'I', ':', 'i', 's', 'a', 'm',
+ 'p', '1', '>', 'i', 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#',
+ '1', ' ', 'S', 'I', 'G', 'N', 'A', 'L', ';', 'a', 's', 'c', 'i', 'i', ' ', 'p', 'l',
+ 'a', 't', 'f', 'o', 'r', 'm', '_', 'n', 'a', 'm', 'e', '=', '<', 'a', 's', 'c', 'i',
+ 'i', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '\'', 'I', 'O', 'N', '_', 'T', 'O',
+ 'R', 'R', 'E', 'N', 'T', '\'', '>', '(', ')', ';', 't', 'e', 'x', 't', ':', 't',
+ 'o', 'k', 'e', 'n', ' ', 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm',
+ 'e', '_', 't', 'o', 'k', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'o',
+ 'n', 'T', 'o', 'r', 'r', 'e', 'n', 't', ':', 't', 'o', 'k', 'e', 'n', 'i', 'z', 'e',
+ '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', '_', 'o', 'u', 't',
+ '_', 'n', 'a', 'm', 'e', ')', ';', 't', 'e', 'x', 't', ':', 't', 'o', 'k', 'e', 'n',
+ ' ', 'i', 'n', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '_', 't', 'o', 'k',
+ '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'o', 'n', 'T', 'o', 'r', 'r',
+ 'e', 'n', 't', ':', 't', 'o', 'k', 'e', 'n', 'i', 'z', 'e', '_', 's', 'p', 'o', 't',
+ '_', 'n', 'a', 'm', 'e', '#', '1', '(', 'N', 'A', 'M', 'E', ')', ';', 'I', 'N', 'S',
+ 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':', 'o', 'n', 'e', ' ', 'o',
+ 'u', 't', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '=', '.', 'P', 'O', 'S', 'I',
+ 'T', 'I', 'O', 'N', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l',
+ 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'o', 'n', 'T',
+ 'o', 'r', 'r', 'e', 'n', 't', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'P',
+ 'O', 'S', 'I', 'T', 'I', 'O', 'N', '#', '1', ' ', '.', 'P', 'O', 'S', 'I', 'T', 'I',
+ 'O', 'N', '=', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N', ';', 'p', 'h', 'y', 's', 'i',
+ 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', '>', 'i', 'z', 'i', 'p', '_', 'e',
+ 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'C', 'L', 'I', 'P', '_', 'A',
+ 'D', 'A', 'P', 'T', 'E', 'R', '_', 'L', 'E', 'F', 'T', '=', 'C', 'L', 'I', 'P', '_',
+ 'A', 'D', 'A', 'P', 'T', 'E', 'R', '_', 'L', 'E', 'F', 'T', ';', 'p', 'h', 'y', 's',
+ 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', '>', 'i', 'z', 'i', 'p', '_',
+ 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'C', 'L', 'I', 'P', '_',
+ 'A', 'D', 'A', 'P', 'T', 'E', 'R', '_', 'R', 'I', 'G', 'H', 'T', '=', 'C', 'L', 'I',
+ 'P', '_', 'A', 'D', 'A', 'P', 'T', 'E', 'R', '_', 'R', 'I', 'G', 'H', 'T', ';', 'p',
+ 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', '>', 'i', 'z',
+ 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'C', 'L',
+ 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '_', 'L', 'E', 'F', 'T', '=', 'C',
+ 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '_', 'L', 'E', 'F', 'T', ';',
+ 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', '<',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'o', 'n', 'e', '>', 'i',
+ 'z', 'i', 'p', '_', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', '#', '1', ' ', '.', 'C',
+ 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '_', 'R', 'I', 'G', 'H', 'T',
+ '=', 'C', 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '_', 'R', 'I', 'G',
+ 'H', 'T', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', '_', '4', '5', '4', '_', ':', 'l', 'e', 'g', 'a', 'c', 'y', '#', '1', '=',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'r', 'a', '_',
+ 'n', 'o', 'p', 'o', 's', '#', '1', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':',
+ 't', 'b', 'l', ':', 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '_', 'n', 'o',
+ 'c', 'o', 'l', '#', '1', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 't', 'b',
+ 'l', ':', 'p', 'h', 'r', 'e', 'd', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '_', 'n',
+ 'o', 'c', 'o', 'l', '#', '1', '.', '0', '.', '1', ',', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'k', 'e', 'y', 'n', 'a', 'm', 'e', '#', '1',
+ '.', '0', '.', '1', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5',
+ '4', '_', ':', 'c', 'o', 'm', 'm', 'o', 'n', '#', '1', '.', '0', '.', '4', '{', 'r',
+ 'e', 'a', 'd', 'o', 'n', 'l', 'y', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'R', 'E', 'G',
+ 'I', 'O', 'N', ' ', '=', ' ', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'v', 'a', 'l', ')', '<', 'I', '3', '2', '>', 'c', 'u', 't', '#', '1', '<',
+ '2', '>', '(', 'c', 'o', 'o', 'r', 'd', 's', '_', 'f', 'r', 'o', 'm', '_', 's', 'k',
+ 'e', 'y', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v',
+ 'a', 'l', ' ', 'o', 'u', 't', '_', 'y', '_', 'c', 'o', 'o', 'r', 'd', '=', '(', 'I',
+ 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ')', '<', 'I',
+ '3', '2', '>', 'c', 'u', 't', '#', '1', '<', '0', '>', '(', 'c', 'o', 'o', 'r', 'd',
+ 's', '_', 'f', 'r', 'o', 'm', '_', 's', 'k', 'e', 'y', ')', ';', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u', 't', '_', 'x',
+ '_', 'c', 'o', 'o', 'r', 'd', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'v', 'a', 'l', ')', '<', 'I', '3', '2', '>', 'c', 'u', 't', '#', '1',
+ '<', '1', '>', '(', 'c', 'o', 'o', 'r', 'd', 's', '_', 'f', 'r', 'o', 'm', '_', 's',
+ 'k', 'e', 'y', ')', ';', 'I', '3', '2', '[', '3', ']', ' ', 'c', 'o', 'o', 'r', 'd',
+ 's', '_', 'f', 'r', 'o', 'm', '_', 's', 'k', 'e', 'y', '=', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 'c', 'o', 'o', 'r', 'd',
+ 'i', 'n', 'a', 't', 'e', 's', '#', '1', '<', '1', '>', '(', 'o', 'u', 't', '_', 's',
+ 'k', 'e', 'y', ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 't', 'b', 'l', ':', 'v', '0', '#',
+ '1', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':',
+ 'l', 'e', 'g', 'a', 'c', 'y', '#', '1', '{', '_', '_', 'u', 'n', 't', 'y', 'p', 'e',
+ 'd', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':',
+ 'u', 'n', 't', 'y', 'p', 'e', 'd', '_', '0', '(', ')', ';', 'I', 'N', 'S', 'D', 'C',
+ ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ',
+ 'o', 'u', 't', '_', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '=', '<', 'I', 'N', 'S',
+ 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i',
+ 'd', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '1', '>', '(', ')', ';', 'I', 'N', 'S',
+ 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'o', 'u', 't',
+ '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', '=', '.', 'R', 'E', 'A', 'D',
+ ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h',
+ 'r', 'e', 'd', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r', 'e',
+ 'd', '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', 'a', 's', 'c', 'i', 'i', ' ',
+ 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '=', '<', 'a', 's', 'c', 'i', 'i', '>',
+ 'e', 'x', 'i', 's', 't', 's', '#', '1', '<', '\'', 'A', 'd', 'a', 'p', 't', 'e',
+ 'r', 'M', 'a', 't', 'e', '1', 'L', 'i', 'n', 'k', 'e', 'r', 'M', 'a', 't', 'e', '2',
+ '\'', '>', '(', 'o', 'u', 't', '_', 'l', 'i', 'n', 'k', 'e', 'r', '_', 's', 'e',
+ 'q', 'u', 'e', 'n', 'c', 'e', ')', '|', '<', 'a', 's', 'c', 'i', 'i', '>', 'e', 'c',
+ 'h', 'o', '#', '1', '<', '\'', 'A', 'd', 'a', 'p', 't', 'e', 'r', 'F', 'r', 'a',
+ 'g', 'm', 'e', 'n', 't', '\'', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':',
+ 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'o', 'u', 't', '_', 'l', 'a',
+ 'b', 'e', 'l', '_', 's', 't', 'a', 'r', 't', '=', '<', 'I', 'N', 'S', 'D', 'C', ':',
+ 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', '>', 'e', 'x', 'i', 's', 't', 's',
+ '#', '1', '<', '[', '0', ',', '7', ',', '1', '2', ',', '1', '8', ']', '>', '(', 'o',
+ 'u', 't', '_', 'l', 'i', 'n', 'k', 'e', 'r', '_', 's', 'e', 'q', 'u', 'e', 'n', 'c',
+ 'e', ')', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z',
+ 'e', 'r', 'o', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '[', '0', ',', '7', ']', '>',
+ '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e',
+ 'n', ' ', 'o', 'u', 't', '_', 'l', 'a', 'b', 'e', 'l', '_', 'l', 'e', 'n', '=', '<',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', '>', 'e',
+ 'x', 'i', 's', 't', 's', '#', '1', '<', '[', '7', ',', '5', ',', '6', ',', '5', ']',
+ '>', '(', 'o', 'u', 't', '_', 'l', 'i', 'n', 'k', 'e', 'r', '_', 's', 'e', 'q', 'u',
+ 'e', 'n', 'c', 'e', ')', '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'l', 'e', 'n', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '[', '7', ',', '8',
+ ']', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e',
+ 'x', 't', ' ', 'o', 'u', 't', '_', 'f', 'l', 'o', 'w', '_', 'c', 'h', 'a', 'r', 's',
+ '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>',
+ 'm', 'e', 't', 'a', ':', 'r', 'e', 'a', 'd', '#', '1', '<', '\'', 'M', 'S', 'C',
+ '4', '5', '4', '_', 'F', 'L', 'O', 'W', '_', 'C', 'H', 'A', 'R', 'S', '\'', '>',
+ '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't',
+ ' ', 'o', 'u', 't', '_', 'k', 'e', 'y', '_', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e',
+ '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', '>',
+ 'm', 'e', 't', 'a', ':', 'r', 'e', 'a', 'd', '#', '1', '<', '\'', 'M', 'S', 'C',
+ '4', '5', '4', '_', 'K', 'E', 'Y', '_', 'S', 'E', 'Q', 'U', 'E', 'N', 'C', 'E', '\'',
+ '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x',
+ 't', ' ', 'o', 'u', 't', '_', 'l', 'i', 'n', 'k', 'e', 'r', '_', 's', 'e', 'q', 'u',
+ 'e', 'n', 'c', 'e', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't',
+ 'e', 'x', 't', '>', 'm', 'e', 't', 'a', ':', 'r', 'e', 'a', 'd', '#', '1', '<', '\'',
+ 'M', 'S', 'C', '4', '5', '4', '_', 'L', 'I', 'N', 'K', 'E', 'R', '_', 'S', 'E', 'Q',
+ 'U', 'E', 'N', 'C', 'E', '\'', '>', '(', ')', ';', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'p', 'o', 's', '1', '6', ' ', 'o', 'u', 't', '_', 'p', 'o', 's', 'i',
+ 't', 'i', 'o', 'n', '1', '6', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_',
+ '4', '5', '4', '_', ':', 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'p', 'o', 's', 'i',
+ 't', 'i', 'o', 'n', '#', '1', '(', '.', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N', ',',
+ '.', 'R', 'D', '_', 'F', 'I', 'L', 'T', 'E', 'R', ',', '.', 'S', 'I', 'G', 'N', 'A',
+ 'L', ')', '|', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_',
+ ':', 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n',
+ '#', '1', '(', '.', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N', ',', '.', 'R', 'D', '_',
+ 'F', 'I', 'L', 'T', 'E', 'R', ')', '|', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ '_', '4', '5', '4', '_', ':', 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'p', 'o', 's',
+ 'i', 't', 'i', 'o', 'n', '#', '1', '(', '.', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', ':',
+ 'o', 'n', 'e', ' ', 'o', 'u', 't', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '=',
+ 'c', 'a', 's', 't', '#', '1', '(', 'o', 'u', 't', '_', 'p', 'o', 's', 'i', 't', 'i',
+ 'o', 'n', '1', '6', ')', ';', 'U', '3', '2', '[', '3', ']', ' ', 'd', 'y', 'n', 'a',
+ 'm', 'i', 'c', '_', 'r', 'e', 'a', 'd', '_', 'd', 'e', 's', 'c', '=', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'd', 'y', 'n', 'a', 'm',
+ 'i', 'c', '_', 'r', 'e', 'a', 'd', '_', 'd', 'e', 's', 'c', '#', '1', '<', '4', '>',
+ '(', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'b', 'i', 'n', ',', 'o', 'u', 't', '_',
+ 'k', 'e', 'y', '_', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', ',', 'o', 'u', 't', '_',
+ 'l', 'i', 'n', 'k', 'e', 'r', '_', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', ')', '|',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'd', 'y',
+ 'n', 'a', 'm', 'i', 'c', '_', 'r', 'e', 'a', 'd', '_', 'd', 'e', 's', 'c', '#', '1',
+ '(', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'b', 'i', 'n', ',', 'o', 'u', 't', '_',
+ 'k', 'e', 'y', '_', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', ')', ';', 'U', '8', ' ',
+ 'o', 'u', 't', '_', 'n', 'r', 'e', 'a', 'd', 's', '=', '<', 'U', '8', '>', 'e', 'x',
+ 'i', 's', 't', 's', '#', '1', '<', '4', '>', '(', 'o', 'u', 't', '_', 'l', 'i', 'n',
+ 'k', 'e', 'r', '_', 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', ')', '|', '<', 'U', '8',
+ '>', 'e', 'c', 'h', 'o', '#', '1', '<', '2', '>', '(', ')', ';', 'U', '3', '2', ' ',
+ 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', '3', '2', '=', '<', 'U', '3', '2', '>',
+ 'c', 'u', 't', '#', '1', '<', '0', '>', '(', 'd', 'y', 'n', 'a', 'm', 'i', 'c', '_',
+ 'r', 'e', 'a', 'd', '_', 'd', 'e', 's', 'c', ')', ';', 'I', 'N', 'S', 'D', 'C', ':',
+ 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', ' ', 'o', 'u', 't',
+ '_', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', '=', 'c', 'a', 's', 't', '#', '1',
+ '(', 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', '3', '2', ')', ';', 'U', '3', '2',
+ ' ', 'u', 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', '=', '<', 'U', '3', '2',
+ '>', 'c', 'u', 't', '#', '1', '<', '1', '>', '(', 'd', 'y', 'n', 'a', 'm', 'i', 'c',
+ '_', 'r', 'e', 'a', 'd', '_', 'd', 'e', 's', 'c', ')', ';', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'o', 'u', 't', '_', 'r',
+ 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', '=', '(', 'I', 'N', 'S', 'D', 'C', ':',
+ 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ')', 'u', 'r', 'e', 'a', 'd', '_',
+ 's', 't', 'a', 'r', 't', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd',
+ ':', 'l', 'e', 'n', ' ', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 'l', 'e', 'n',
+ '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n',
+ ')', '<', 'U', '3', '2', '>', 'c', 'u', 't', '#', '1', '<', '2', '>', '(', 'd', 'y',
+ 'n', 'a', 'm', 'i', 'c', '_', 'r', 'e', 'a', 'd', '_', 'd', 'e', 's', 'c', ')', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i',
+ 'l', 't', 'e', 'r', ' ', 'o', 'u', 't', '_', 'r', 'd', '_', 'f', 'i', 'l', 't', 'e',
+ 'r', '=', '.', 'R', 'D', '_', 'F', 'I', 'L', 'T', 'E', 'R', '|', '<', 'I', 'N', 'S',
+ 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_', 'f', 'i', 'l', 't', 'e',
+ 'r', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '0', '>', '(', 'd', 'y', 'n', 'a', 'm',
+ 'i', 'c', '_', 'r', 'e', 'a', 'd', '_', 'd', 'e', 's', 'c', ')', ';', 'p', 'h', 'y',
+ 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i',
+ 'n', 'g', ':', 'C', 'L', 'I', 'P', '#', '1', ' ', '.', 'C', 'L', 'I', 'P', '_', 'A',
+ 'D', 'A', 'P', 'T', 'E', 'R', '_', 'L', 'E', 'F', 'T', ';', 'p', 'h', 'y', 's', 'i',
+ 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g',
+ ':', 'C', 'L', 'I', 'P', '#', '1', ' ', '.', 'C', 'L', 'I', 'P', '_', 'A', 'D', 'A',
+ 'P', 'T', 'E', 'R', '_', 'R', 'I', 'G', 'H', 'T', ';', 'p', 'h', 'y', 's', 'i', 'c',
+ 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', '_', '4', '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':',
+ 'C', 'L', 'I', 'P', '#', '1', ' ', '.', 'C', 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L',
+ 'I', 'T', 'Y', '_', 'L', 'E', 'F', 'T', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l',
+ ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ '_', '4', '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'C', 'L',
+ 'I', 'P', '#', '1', ' ', '.', 'C', 'L', 'I', 'P', '_', 'Q', 'U', 'A', 'L', 'I', 'T',
+ 'Y', '_', 'R', 'I', 'G', 'H', 'T', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_',
+ '4', '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'R', 'E', 'A',
+ 'D', '#', '1', ' ', '.', 'R', 'E', 'A', 'D', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a',
+ 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', '_', '4', '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'Q',
+ 'U', 'A', 'L', 'I', 'T', 'Y', '#', '1', ' ', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y',
+ ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'e', 'n',
+ 'c', 'o', 'd', 'i', 'n', 'g', ':', 'S', 'I', 'G', 'N', 'A', 'L', '#', '1', ' ', '.',
+ 'S', 'I', 'G', 'N', 'A', 'L', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4',
+ '5', '4', '_', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'P', 'O', 'S', 'I',
+ 'T', 'I', 'O', 'N', '#', '1', ' ', '.', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N', ';',
+ '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_',
+ '4', '5', '4', '_', ':', 't', 'b', 'l', ':', 'v', '1', '#', '1', '=', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'l', 'e', 'g', 'a', 'c',
+ 'y', '#', '1', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':',
+ 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '_', 'n', 'o', 'p', 'h', 'y', 's', '#', '1',
+ '.', '0', '.', '2', '{', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l',
+ 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'o', 'u', 't', '_', 'p', 'l', 'a',
+ 't', 'f', 'o', 'r', 'm', '=', '.', 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M', '|', '<',
+ 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r',
+ 'm', '_', 'i', 'd', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '1', '>', '(', ')', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ',
+ 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', '=', '.', 'R',
+ 'E', 'A', 'D', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y',
+ ':', 'p', 'h', 'r', 'e', 'd', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'p',
+ 'h', 'r', 'e', 'd', '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', 'I', 'N', 'S',
+ 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', 'o', 'u', 't', '_', 'f',
+ 'l', 'o', 'w', '_', 'c', 'h', 'a', 'r', 's', '=', '.', 'F', 'L', 'O', 'W', '_', 'C',
+ 'H', 'A', 'R', 'S', ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e',
+ 'x', 't', ' ', 'o', 'u', 't', '_', 'k', 'e', 'y', '_', 's', 'e', 'q', 'u', 'e', 'n',
+ 'c', 'e', '=', '.', 'K', 'E', 'Y', '_', 'S', 'E', 'Q', 'U', 'E', 'N', 'C', 'E', ';',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'p', 'o', 's', '1', '6', ' ', 'o', 'u',
+ 't', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '1', '6', '=', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'p', 'r', 'o', 'c', 'e', 's',
+ 's', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '#', '1', '(', '.', 'P', 'O', 'S',
+ 'I', 'T', 'I', 'O', 'N', ',', '.', 'R', 'D', '_', 'F', 'I', 'L', 'T', 'E', 'R', ',',
+ '.', 'S', 'I', 'G', 'N', 'A', 'L', ')', '|', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', '_', '4', '5', '4', '_', ':', 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'p', 'o',
+ 's', 'i', 't', 'i', 'o', 'n', '#', '1', '(', '.', 'P', 'O', 'S', 'I', 'T', 'I', 'O',
+ 'N', ',', '.', 'R', 'D', '_', 'F', 'I', 'L', 'T', 'E', 'R', ')', '|', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'p', 'r', 'o', 'c', 'e',
+ 's', 's', '_', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '#', '1', '(', '.', 'P', 'O',
+ 'S', 'I', 'T', 'I', 'O', 'N', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'p', 'o', 's',
+ 'i', 't', 'i', 'o', 'n', ':', 'o', 'n', 'e', ' ', 'o', 'u', 't', '_', 'p', 'o', 's',
+ 'i', 't', 'i', 'o', 'n', '=', 'c', 'a', 's', 't', '#', '1', '(', 'o', 'u', 't', '_',
+ 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', '1', '6', ')', ';', '}', 't', 'a', 'b', 'l',
+ 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':',
+ 't', 'b', 'l', ':', 'v', '1', '_', '2', 'a', '#', '1', '=', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 't', 'b', 'l', ':', 'v', '1', '#',
+ '1', '{', '_', '_', 'u', 'n', 't', 'y', 'p', 'e', 'd', '=', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd',
+ '_', '1', '_', '2', 'a', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a',
+ ':', 't', 'e', 'x', 't', ' ', 'o', 'u', 't', '_', 'l', 'i', 'n', 'k', 'e', 'r', '_',
+ 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', '=', '.', 'L', 'I', 'N', 'K', 'E', 'R', '_',
+ 'S', 'E', 'Q', 'U', 'E', 'N', 'C', 'E', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', '_', '4', '5', '4', '_', ':', 't', 'b', 'l',
+ ':', 'v', '1', '_', '2', 'b', '#', '1', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', '_', '4', '5', '4', '_', ':', 't', 'b', 'l', ':', 'v', '1', '#', '1', '{', '_',
+ '_', 'u', 'n', 't', 'y', 'p', 'e', 'd', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', '_', '4', '5', '4', '_', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd', '_', '1', '_',
+ '2', 'b', '(', ')', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'l', 'e', 'g', 'a',
+ 'c', 'y', '#', '1', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l',
+ ':', 's', 'r', 'a', '#', '1', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 't',
+ 'b', 'l', ':', 'b', 'a', 's', 'e', '_', 's', 'p', 'a', 'c', 'e', '_', 'n', 'o', 'c',
+ 'o', 'l', '#', '1', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'c', 'o', 'm', 'm', 'o', 'n', '#',
+ '1', '.', '0', '.', '3', '{', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I',
+ ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'S', 'I', 'G', 'N', 'A', 'L', ' ', '=', ' ',
+ '(', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ')', '<', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a',
+ 'm', 'p', '4', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p',
+ '#', '1', '(', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l', ',', 'o', 'u', 't',
+ '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', '|', '(', 'N', 'C', 'B', 'I', ':',
+ 'f', 's', 'a', 'm', 'p', '4', ')', '<', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 'r', 'o', 't', 'a', 't', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', '>', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'o', 't', 'a', 't', 'e', '#', '1', '<', 'f',
+ 'a', 'l', 's', 'e', '>', '(', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l', ',',
+ 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', 'c', 'o', 'l',
+ 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'I',
+ 'N', 'T', 'E', 'N', 'S', 'I', 'T', 'Y', ' ', '=', ' ', '<', 'N', 'C', 'B', 'I', ':',
+ 'f', 's', 'a', 'm', 'p', '4', '>', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'd',
+ 'e', 'n', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', '#', '1', '(', 'o', 'u', 't', '_',
+ 'n', 'o', 'r', 'm', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y', ',', 'o', 'u',
+ 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', 'c', 'o', 'l', 'u', 'm',
+ 'n', ' ', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'N', 'O', 'I',
+ 'S', 'E', ' ', '=', ' ', 'o', 'u', 't', '_', 'n', 'o', 'i', 's', 'e', ';', 'N', 'C',
+ 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'o', 'u', 't', '_', 'n', 'o', 'r',
+ 'm', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y', '=', '(', 'N', 'C', 'B', 'I',
+ ':', 'f', 's', 'a', 'm', 'p', '4', ')', '<', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', '>', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', '#', '1', '(', 'o', 'u',
+ 't', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y', ',', 'o', 'u', 't', '_', 'x',
+ '2', 'n', 'a', '_', 'b', 'i', 'n', ')', '|', '(', 'N', 'C', 'B', 'I', ':', 'f', 's',
+ 'a', 'm', 'p', '4', ')', '<', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'o',
+ 't', 'a', 't', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', '>', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'r', 'o', 't', 'a', 't', 'e', '#', '1', '<', 'f', 'a', 'l',
+ 's', 'e', '>', '(', 'o', 'u', 't', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y',
+ ',', 'o', 'u', 't', '_', 'x', '2', 'n', 'a', '_', 'b', 'i', 'n', ')', ';', '}', 't',
+ 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l',
+ 'u', 'm', 'i', 'n', 'a', ':', 't', 'b', 'l', ':', 'v', '0', '#', '1', '=', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'l',
+ 'e', 'g', 'a', 'c', 'y', '#', '1', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 't', 'b', 'l', ':', 's', 'k', 'e', 'y', 'n', 'a', 'm', 'e', '#', '1', '.', '0', '.',
+ '1', '{', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f',
+ 'o', 'r', 'm', '_', 'i', 'd', ' ', 'o', 'u', 't', '_', 'p', 'l', 'a', 't', 'f', 'o',
+ 'r', 'm', '=', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a',
+ 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '2',
+ '>', '(', ')', ';', 'a', 's', 'c', 'i', 'i', ' ', 'o', 'u', 't', '_', 's', 'l', 'x',
+ '_', 'p', 'r', 'e', 'f', 'i', 'x', '=', '<', 'a', 's', 'c', 'i', 'i', '>', 'm', 'e',
+ 't', 'a', ':', 'r', 'e', 'a', 'd', '#', '1', '<', '\'', 'S', 'L', 'X', '_', 'P',
+ 'R', 'E', 'F', 'I', 'X', '\'', '>', '(', ')', '|', '<', 'a', 's', 'c', 'i', 'i',
+ '>', 'e', 'c', 'h', 'o', '#', '1', '<', '\'', '\'', '>', '(', ')', ';', 'a', 's',
+ 'c', 'i', 'i', ' ', 'r', 'e', 'w', 'r', 'i', 't', 't', 'e', 'n', '_', 's', 'p', 'o',
+ 't', '_', 'n', 'a', 'm', 'e', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r',
+ 'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '#',
+ '1', '<', '2', '>', '(', 'o', 'u', 't', '_', 's', 'k', 'e', 'y', ',', 'o', 'u', 't',
+ '_', 's', 'l', 'x', '_', 'p', 'r', 'e', 'f', 'i', 'x', ')', ';', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u', 't', '_', 'y',
+ '_', 'c', 'o', 'o', 'r', 'd', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'v', 'a', 'l', ')', '<', 'I', '3', '2', '>', 'c', 'u', 't', '#', '1',
+ '<', '0', '>', '(', 'c', 'o', 'o', 'r', 'd', 's', '_', 'f', 'r', 'o', 'm', '_', 's',
+ 'k', 'e', 'y', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'v', 'a', 'l', ' ', 'o', 'u', 't', '_', 'x', '_', 'c', 'o', 'o', 'r', 'd', '=', '(',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ')', '<',
+ 'I', '3', '2', '>', 'c', 'u', 't', '#', '1', '<', '1', '>', '(', 'c', 'o', 'o', 'r',
+ 'd', 's', '_', 'f', 'r', 'o', 'm', '_', 's', 'k', 'e', 'y', ')', ';', 'I', 'N', 'S',
+ 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u', 't', '_',
+ 't', 'i', 'l', 'e', '_', 'c', 'o', 'o', 'r', 'd', '=', '(', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ')', '<', 'I', '3', '2', '>', 'c',
+ 'u', 't', '#', '1', '<', '2', '>', '(', 'c', 'o', 'o', 'r', 'd', 's', '_', 'f', 'r',
+ 'o', 'm', '_', 's', 'k', 'e', 'y', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u', 't', '_', 'l', 'a', 'n', 'e', '_',
+ 'c', 'o', 'o', 'r', 'd', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r',
+ 'd', ':', 'v', 'a', 'l', ')', '<', 'I', '3', '2', '>', 'c', 'u', 't', '#', '1', '<',
+ '3', '>', '(', 'c', 'o', 'o', 'r', 'd', 's', '_', 'f', 'r', 'o', 'm', '_', 's', 'k',
+ 'e', 'y', ')', ';', 'I', '3', '2', '[', '4', ']', ' ', 'c', 'o', 'o', 'r', 'd', 's',
+ '_', 'f', 'r', 'o', 'm', '_', 's', 'k', 'e', 'y', '=', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 'c', 'o', 'o', 'r', 'd', 'i',
+ 'n', 'a', 't', 'e', 's', '#', '1', '<', '2', '>', '(', 'o', 'u', 't', '_', 's', 'k',
+ 'e', 'y', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c',
+ 'k', 'e', 'd', ' ', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e',
+ 'd', '=', '.', 'R', 'E', 'A', 'D', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o',
+ 'r', 'd', ':', 'l', 'e', 'n', ' ', 's', 't', 'a', 't', 'i', 'c', '_', 'f', 'i', 'x',
+ 'e', 'd', '_', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', '=', 's', 'p', 'o', 't', '_',
+ 'l', 'e', 'n', ';', 'U', '8', ' ', 'o', 'u', 't', '_', 'n', 'r', 'e', 'a', 'd', 's',
+ '=', '<', 'U', '8', '>', 'm', 'e', 't', 'a', ':', 'v', 'a', 'l', 'u', 'e', '#', '1',
+ '<', '\'', 'N', 'R', 'E', 'A', 'D', 'S', '\'', '>', '(', ')', '|', '<', 'U', '8',
+ '>', 'e', 'c', 'h', 'o', '#', '1', '<', '1', '>', '(', ')', ';', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ' ', 'o', 'u', 't', '_',
+ 'r', 'e', 'a', 'd', '_', 's', 't', 'a', 'r', 't', '=', '(', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', ')', '<', 'U', '3', '2', '>',
+ 'c', 'u', 't', '#', '1', '<', '1', '>', '(', 'r', 'e', 'a', 'd', '_', 's', 'e', 'g',
+ '_', 'f', 'r', 'o', 'm', '_', 'r', 'e', 'a', 'd', 'n', ')', '|', '<', 'I', 'N', 'S',
+ 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'z', 'e', 'r', 'o', '>', 'e', 'c', 'h',
+ 'o', '#', '1', '<', '0', '>', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o',
+ 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_',
+ 'l', 'e', 'n', '=', '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':',
+ 'l', 'e', 'n', ')', '<', 'U', '3', '2', '>', 'c', 'u', 't', '#', '1', '<', '2', '>',
+ '(', 'r', 'e', 'a', 'd', '_', 's', 'e', 'g', '_', 'f', 'r', 'o', 'm', '_', 'r', 'e',
+ 'a', 'd', 'n', ')', '|', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ';', 'U', '3', '2',
+ '[', '5', ']', ' ', 'r', 'e', 'a', 'd', '_', 's', 'e', 'g', '_', 'f', 'r', 'o', 'm',
+ '_', 'r', 'e', 'a', 'd', 'n', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r',
+ 'e', 'a', 'd', '_', 's', 'e', 'g', '_', 'f', 'r', 'o', 'm', '_', 'r', 'e', 'a', 'd',
+ 'n', '#', '1', '(', 'o', 'u', 't', '_', 'n', 'r', 'e', 'a', 'd', 's', ',', 's', 'p',
+ 'o', 't', '_', 'l', 'e', 'n', ')', ';', 'U', '3', '2', ' ', 'r', 'e', 'a', 'd', '_',
+ 't', 'y', 'p', 'e', '_', 'f', 'r', 'o', 'm', '_', 'r', 'e', 'a', 'd', '_', 's', 'e',
+ 'g', '=', '<', 'U', '3', '2', '>', 'c', 'u', 't', '#', '1', '<', '0', '>', '(', 'r',
+ 'e', 'a', 'd', '_', 's', 'e', 'g', '_', 'f', 'r', 'o', 'm', '_', 'r', 'e', 'a', 'd',
+ 'n', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd',
+ '_', 't', 'y', 'p', 'e', ' ', 'o', 'u', 't', '_', 'r', 'e', 'a', 'd', '_', 't', 'y',
+ 'p', 'e', '=', 'c', 'a', 's', 't', '#', '1', '(', 'r', 'e', 'a', 'd', '_', 't', 'y',
+ 'p', 'e', '_', 'f', 'r', 'o', 'm', '_', 'r', 'e', 'a', 'd', '_', 's', 'e', 'g', ')',
+ '|', '(', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'r', 'e', 'a', 'd', '_',
+ 't', 'y', 'p', 'e', ')', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'x',
+ 'r', 'e', 'a', 'd', '_', 't', 'y', 'p', 'e', '>', 'e', 'c', 'h', 'o', '#', '1', '<',
+ '1', '>', '(', ')', ';', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'r', 'o', 't',
+ 'a', 't', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', ' ', 'o', 'u', 't', '_', 's',
+ 'i', 'g', 'n', 'a', 'l', '=', '.', 'S', 'I', 'G', 'N', 'A', 'L', ';', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'r', 'o', 't', 'a', 't', 'e', 'd', '_', 'f', 's', 'a',
+ 'm', 'p', '4', ' ', 'o', 'u', 't', '_', 'i', 'n', 't', 'e', 'n', 's', 'i', 't', 'y',
+ '=', '.', 'I', 'N', 'T', 'E', 'N', 'S', 'I', 'T', 'Y', ';', 'N', 'C', 'B', 'I', ':',
+ 'f', 's', 'a', 'm', 'p', '4', ' ', 'o', 'u', 't', '_', 'n', 'o', 'i', 's', 'e', '=',
+ '.', 'N', 'O', 'I', 'S', 'E', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l',
+ 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'R',
+ 'E', 'A', 'D', '#', '1', ' ', '.', 'R', 'E', 'A', 'D', ';', 'p', 'h', 'y', 's', 'i',
+ 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S',
+ 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd',
+ 'i', 'n', 'g', ':', 'S', 'I', 'G', 'N', 'A', 'L', '#', '1', ' ', '.', 'S', 'I', 'G',
+ 'N', 'A', 'L', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u',
+ 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm',
+ 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'I', 'N', 'T', 'E',
+ 'N', 'S', 'I', 'T', 'Y', '#', '1', ' ', '.', 'I', 'N', 'T', 'E', 'N', 'S', 'I', 'T',
+ 'Y', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n',
+ ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n',
+ 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'N', 'O', 'I', 'S', 'E', '#',
+ '1', ' ', '.', 'N', 'O', 'I', 'S', 'E', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':',
+ 't', 'b', 'l', ':', 'v', '0', 'a', '#', '1', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R',
+ 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 't', 'b', 'l', ':', 'v', '0',
+ '#', '1', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm',
+ 'i', 'n', 'a', ':', 'q', 'u', 'a', 'l', '4', '_', 'n', 'o', 'c', 'o', 'l', '#', '1',
+ '.', '0', '.', '1', '{', '_', '_', 'u', 'n', 't', 'y', 'p', 'e', 'd', '=', 'N', 'C',
+ 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'u',
+ 'n', 't', 'y', 'p', 'e', 'd', '_', '0', 'a', '(', ')', ';', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'r', 'o', 't', 'a', 't', 'e', 'd', '_', 'q', 'u', 'a', 'l', '4',
+ ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '4', '_', 'r', 'o', 't', 'a', 't', 'e',
+ 'd', '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', 'I', 'N', 'S', 'D', 'C', ':',
+ 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd', ' ', 'o', 'u', 't',
+ '_', 'q', 'u', 'a', 'l', '2', '_', 'p', 'h', 'r', 'e', 'd', '=', '.', 'Q', 'U', 'A',
+ 'L', 'I', 'T', 'Y', '2', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o',
+ 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l',
+ 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'Q', 'U',
+ 'A', 'L', 'I', 'T', 'Y', '#', '1', ' ', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';',
+ 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':',
+ 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '2',
+ '#', '1', ' ', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '2', ';', '}', 't', 'a', 'b',
+ 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm',
+ 'i', 'n', 'a', ':', 't', 'b', 'l', ':', 'v', '0', 'b', '#', '1', '=', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 't', 'b',
+ 'l', ':', 'v', '0', '#', '1', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'p',
+ 'h', 'r', 'e', 'd', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '_', 'n', 'o', 'c', 'o',
+ 'l', '#', '1', '.', '0', '.', '1', '{', '_', '_', 'u', 'n', 't', 'y', 'p', 'e', 'd',
+ '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n',
+ 'a', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd', '_', '0', 'b', '(', ')', ';', 'I', 'N',
+ 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p', 'h', 'r', 'e', 'd',
+ ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r', 'e', 'd', '=', '.',
+ 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '|', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '2',
+ ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a',
+ ':', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g', ':', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y',
+ '2', '#', '1', ' ', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', 'p', 'h', 'y', 's',
+ 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'N', 'C', 'B', 'I', ':',
+ 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'e', 'n', 'c', 'o',
+ 'd', 'i', 'n', 'g', ':', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '2', '#', '1', ' ', '.',
+ 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '2', ';', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':',
+ 't', 'b', 'l', ':', 'v', '1', '#', '1', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'l', 'e', 'g', 'a', 'c', 'y', '#',
+ '1', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's', 'p',
+ 'o', 't', 'd', 'e', 's', 'c', '_', 'n', 'o', 'p', 'h', 'y', 's', '#', '1', '.', '0',
+ '.', '2', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l', ':', 's',
+ 'k', 'e', 'y', 'n', 'a', 'm', 'e', '_', 'n', 'o', 'c', 'o', 'l', '#', '2', '.', '0',
+ '.', '1', '{', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't',
+ 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'o', 'u', 't', '_', 'p', 'l', 'a', 't', 'f',
+ 'o', 'r', 'm', '=', '.', 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M', '|', '<', 'I', 'N',
+ 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_',
+ 'i', 'd', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '2', '>', '(', ')', ';', 'I', 'N',
+ 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u', 't',
+ '_', 't', 'i', 'l', 'e', '_', 'c', 'o', 'o', 'r', 'd', '=', '(', 'I', 'N', 'S', 'D',
+ 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ')', '<', 'I', '3', '2', '>',
+ 'c', 'u', 't', '#', '1', '<', '2', '>', '(', 'c', 'o', 'o', 'r', 'd', 's', '_', 'f',
+ 'r', 'o', 'm', '_', 's', 'p', 'o', 't', 'n', 'a', 'm', 'e', ')', ';', 'I', 'N', 'S',
+ 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ' ', 'o', 'u', 't', '_',
+ 'l', 'a', 'n', 'e', '_', 'c', 'o', 'o', 'r', 'd', '=', '(', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ')', '<', 'I', '3', '2', '>', 'c',
+ 'u', 't', '#', '1', '<', '3', '>', '(', 'c', 'o', 'o', 'r', 'd', 's', '_', 'f', 'r',
+ 'o', 'm', '_', 's', 'p', 'o', 't', 'n', 'a', 'm', 'e', ')', ';', 'I', '3', '2', '[',
+ '4', ']', ' ', 'c', 'o', 'o', 'r', 'd', 's', '_', 'f', 'r', 'o', 'm', '_', 's', 'p',
+ 'o', 't', 'n', 'a', 'm', 'e', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'e',
+ 'x', 't', 'r', 'a', 'c', 't', '_', 'c', 'o', 'o', 'r', 'd', 'i', 'n', 'a', 't', 'e',
+ 's', '#', '1', '<', '2', '>', '(', '_', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e', ')',
+ ';', 'I', 'N', 'S', 'D', 'C', ':', '2', 'n', 'a', ':', 'p', 'a', 'c', 'k', 'e', 'd',
+ ' ', 'o', 'u', 't', '_', '2', 'n', 'a', '_', 'p', 'a', 'c', 'k', 'e', 'd', '=', '.',
+ 'R', 'E', 'A', 'D', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't',
+ 'y', ':', 'p', 'h', 'r', 'e', 'd', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '2',
+ '_', 'p', 'h', 'r', 'e', 'd', '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', '2', ';',
+ 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 's',
+ 't', 'a', 't', 'i', 'c', '_', 'f', 'i', 'x', 'e', 'd', '_', 's', 'p', 'o', 't', '_',
+ 'l', 'e', 'n', '=', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', ';', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm',
+ 'p', '4', ' ', 'o', 'u', 't', '_', 's', 'i', 'g', 'n', 'a', 'l', '=', '.', 'S', 'I',
+ 'G', 'N', 'A', 'L', ';', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a',
+ 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', ' ', 'o', 'u', 't', '_', 'i',
+ 'n', 't', 'e', 'n', 's', 'i', 't', 'y', '=', '.', 'I', 'N', 'T', 'E', 'N', 'S', 'I',
+ 'T', 'Y', ';', 'N', 'C', 'B', 'I', ':', 'f', 's', 'a', 'm', 'p', '4', ' ', 'o', 'u',
+ 't', '_', 'n', 'o', 'i', 's', 'e', '=', '.', 'N', 'O', 'I', 'S', 'E', ';', 'p', 'h',
+ 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S',
+ 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', '.', 'F', 'L', 'O', 'W',
+ '_', 'C', 'H', 'A', 'R', 'S', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c',
+ 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't',
+ 'e', 'x', 't', ' ', '.', 'K', 'E', 'Y', '_', 'S', 'E', 'Q', 'U', 'E', 'N', 'C', 'E',
+ ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ',
+ 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', '.', 'L',
+ 'I', 'N', 'K', 'E', 'R', '_', 'S', 'E', 'Q', 'U', 'E', 'N', 'C', 'E', ';', '}', 't',
+ 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l',
+ 'u', 'm', 'i', 'n', 'a', ':', 't', 'b', 'l', ':', 'v', '1', 'a', '#', '1', '=', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':',
+ 't', 'b', 'l', ':', 'v', '1', '#', '1', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A',
+ ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 'q', 'u', 'a', 'l', '4', '_', 'n',
+ 'o', 'c', 'o', 'l', '#', '1', '.', '0', '.', '1', '{', '_', '_', 'u', 'n', 't', 'y',
+ 'p', 'e', 'd', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u',
+ 'm', 'i', 'n', 'a', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd', '_', '1', 'a', '(', ')',
+ ';', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 's', 'w', 'a', 'p', 'p', 'e', 'd',
+ '_', 'q', 'u', 'a', 'l', '4', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '4', '_',
+ 's', 'w', 'a', 'p', 'p', 'e', 'd', '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';',
+ '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I',
+ 'l', 'l', 'u', 'm', 'i', 'n', 'a', ':', 't', 'b', 'l', ':', 'v', '1', 'b', '#', '1',
+ '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l', 'u', 'm', 'i', 'n',
+ 'a', ':', 't', 'b', 'l', ':', 'v', '1', '#', '1', ',', 'N', 'C', 'B', 'I', ':', 't',
+ 'b', 'l', ':', 'p', 'h', 'r', 'e', 'd', '_', 'q', 'u', 'a', 'l', 'i', 't', 'y', '_',
+ 'n', 'o', 'c', 'o', 'l', '#', '1', '.', '0', '.', '1', '{', '_', '_', 'u', 'n', 't',
+ 'y', 'p', 'e', 'd', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'I', 'l', 'l',
+ 'u', 'm', 'i', 'n', 'a', ':', 'u', 'n', 't', 'y', 'p', 'e', 'd', '_', '1', 'b', '(',
+ ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p',
+ 'h', 'r', 'e', 'd', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r',
+ 'e', 'd', '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', '}', 't', 'a', 'b', 'l',
+ 'e', ' ', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'A', 'B', 'I', ':', 'l', 'e',
+ 'g', 'a', 'c', 'y', '#', '1', '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't',
+ 'b', 'l', ':', 's', 'r', 'a', '#', '1', '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I',
+ ':', 't', 'b', 'l', ':', 'p', 'h', 'r', 'e', 'd', '_', 'q', 'u', 'a', 'l', 'i', 't',
+ 'y', '_', 'n', 'o', 'c', 'o', 'l', '#', '1', '.', '0', '.', '1', ',', 'N', 'C', 'B',
+ 'I', ':', 'S', 'R', 'A', ':', 'A', 'B', 'I', ':', 'c', 'o', 'm', 'm', 'o', 'n', '#',
+ '1', '.', '0', '.', '3', '{', '}', 't', 'a', 'b', 'l', 'e', ' ', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'A', 'B', 'I', ':', 't', 'b', 'l', ':', 'v', '1', '#', '1',
+ '=', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'A', 'B', 'I', ':', 'l', 'e', 'g',
+ 'a', 'c', 'y', '#', '1', ',', 'N', 'C', 'B', 'I', ':', 't', 'b', 'l', ':', 'c', 'o',
+ 'l', 'o', 'r', '_', 's', 'p', 'a', 'c', 'e', '_', 'n', 'o', 'c', 'o', 'l', '#', '1',
+ '.', '0', '.', '3', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b', 'l',
+ ':', 's', 'p', 'o', 't', 'd', 'e', 's', 'c', '_', 'n', 'o', 'p', 'h', 'y', 's', '#',
+ '1', '.', '0', '.', '2', ',', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 't', 'b',
+ 'l', ':', 's', 'k', 'e', 'y', 'n', 'a', 'm', 'e', '_', 'n', 'o', 'c', 'o', 'l', '#',
+ '2', '.', '0', '.', '1', '{', '_', '_', 'u', 'n', 't', 'y', 'p', 'e', 'd', '=', 'N',
+ 'C', 'B', 'I', ':', 'S', 'R', 'A', ':', 'A', 'B', 'I', ':', 'u', 'n', 't', 'y', 'p',
+ 'e', 'd', '_', '1', '(', ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':',
+ 'p', 'l', 'a', 't', 'f', 'o', 'r', 'm', '_', 'i', 'd', ' ', 'o', 'u', 't', '_', 'p',
+ 'l', 'a', 't', 'f', 'o', 'r', 'm', '=', '.', 'P', 'L', 'A', 'T', 'F', 'O', 'R', 'M',
+ '|', '<', 'I', 'N', 'S', 'D', 'C', ':', 'S', 'R', 'A', ':', 'p', 'l', 'a', 't', 'f',
+ 'o', 'r', 'm', '_', 'i', 'd', '>', 'e', 'c', 'h', 'o', '#', '1', '<', '3', '>', '(',
+ ')', ';', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l',
+ ' ', 'o', 'u', 't', '_', 'p', 'a', 'n', 'e', 'l', '_', 'c', 'o', 'o', 'r', 'd', '=',
+ '(', 'I', 'N', 'S', 'D', 'C', ':', 'c', 'o', 'o', 'r', 'd', ':', 'v', 'a', 'l', ')',
+ '<', 'I', '3', '2', '>', 'c', 'u', 't', '#', '1', '<', '2', '>', '(', 'c', 'o', 'o',
+ 'r', 'd', 's', '_', 'f', 'r', 'o', 'm', '_', 's', 'p', 'o', 't', 'n', 'a', 'm', 'e',
+ ')', ';', 'I', '3', '2', '[', '4', ']', ' ', 'c', 'o', 'o', 'r', 'd', 's', '_', 'f',
+ 'r', 'o', 'm', '_', 's', 'p', 'o', 't', 'n', 'a', 'm', 'e', '=', 'N', 'C', 'B', 'I',
+ ':', 'S', 'R', 'A', ':', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 'c', 'o', 'o', 'r',
+ 'd', 'i', 'n', 'a', 't', 'e', 's', '#', '1', '<', '3', '>', '(', 'o', 'u', 't', '_',
+ 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', ')', ';', 'a', 's', 'c', 'i', 'i', ' ',
+ 'o', 'u', 't', '_', 's', 'p', 'o', 't', '_', 'n', 'a', 'm', 'e', '=', 'I', 'N', 'S',
+ 'D', 'C', ':', 'S', 'R', 'A', ':', 'f', 'o', 'r', 'm', 'a', 't', '_', 's', 'p', 'o',
+ 't', '_', 'n', 'a', 'm', 'e', '#', '1', '(', 'o', 'u', 't', '_', 'n', 'a', 'm', 'e',
+ '_', 'f', 'm', 't', ',', 'o', 'u', 't', '_', 'x', '_', 'c', 'o', 'o', 'r', 'd', ',',
+ 'o', 'u', 't', '_', 'y', '_', 'c', 'o', 'o', 'r', 'd', ')', ';', 'I', 'N', 'S', 'D',
+ 'C', ':', '2', 'c', 's', ':', 'p', 'a', 'c', 'k', 'e', 'd', ' ', 'o', 'u', 't', '_',
+ '2', 'c', 's', '_', 'p', 'a', 'c', 'k', 'e', 'd', '=', '.', 'C', 'S', 'R', 'E', 'A',
+ 'D', ';', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ',
+ 'o', 'u', 't', '_', 'c', 's', '_', 'k', 'e', 'y', '=', '.', 'C', 'S', '_', 'K', 'E',
+ 'Y', ';', 'I', 'N', 'S', 'D', 'C', ':', 'q', 'u', 'a', 'l', 'i', 't', 'y', ':', 'p',
+ 'h', 'r', 'e', 'd', ' ', 'o', 'u', 't', '_', 'q', 'u', 'a', 'l', '_', 'p', 'h', 'r',
+ 'e', 'd', '=', '.', 'Q', 'U', 'A', 'L', 'I', 'T', 'Y', ';', 'I', 'N', 'S', 'D', 'C',
+ ':', 'c', 'o', 'o', 'r', 'd', ':', 'l', 'e', 'n', ' ', 's', 't', 'a', 't', 'i', 'c',
+ '_', 'f', 'i', 'x', 'e', 'd', '_', 's', 'p', 'o', 't', '_', 'l', 'e', 'n', '=', 's',
+ 'p', 'o', 't', '_', 'l', 'e', 'n', ';', 'N', 'C', 'B', 'I', ':', 'S', 'R', 'A', ':',
+ 's', 'w', 'a', 'p', 'p', 'e', 'd', '_', 'f', 's', 'a', 'm', 'p', '4', ' ', 'o', 'u',
+ 't', '_', 's', 'i', 'g', 'n', 'a', 'l', '_', 's', 'w', 'a', 'p', 'p', 'e', 'd', '=',
+ '.', 'S', 'I', 'G', 'N', 'A', 'L', ';', 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ',
+ 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':',
+ 't', 'e', 'x', 't', ' ', '.', 'F', 'L', 'O', 'W', '_', 'C', 'H', 'A', 'R', 'S', ';',
+ 'p', 'h', 'y', 's', 'i', 'c', 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I',
+ 'N', 'S', 'D', 'C', ':', 'd', 'n', 'a', ':', 't', 'e', 'x', 't', ' ', '.', 'K', 'E',
+ 'Y', '_', 'S', 'E', 'Q', 'U', 'E', 'N', 'C', 'E', ';', 'p', 'h', 'y', 's', 'i', 'c',
+ 'a', 'l', ' ', 'c', 'o', 'l', 'u', 'm', 'n', ' ', 'I', 'N', 'S', 'D', 'C', ':', 'd',
+ 'n', 'a', ':', 't', 'e', 'x', 't', ' ', '.', 'L', 'I', 'N', 'K', 'E', 'R', '_', 'S',
+ 'E', 'Q', 'U', 'E', 'N', 'C', 'E', ';', '}',
+};
+const size_t sra_schema_size = 69610;
diff --git a/libs/sra/sracache.c b/libs/sra/sracache.c
new file mode 100644
index 0000000..d455af9
--- /dev/null
+++ b/libs/sra/sracache.c
@@ -0,0 +1,560 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sra/extern.h>
+#include <sra/sradb-priv.h>
+
+#include <klib/rc.h>
+#include <kproc/lock.h>
+#include <klib/refcount.h>
+#include <kfg/config.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+
+#include <strtol.h>
+
+#include "sra-priv.h"
+
+/* some of the above #defines index on sun */
+#ifdef index
+    #undef index
+#endif
+
+/*================================== SRACacheMetrics ==================================*/
+static
+void 
+MetricsInit(SRACacheMetrics* self, const SRATable* table)
+{
+    self->bytes     = 0;/* TBD */
+    self->elements  = 1;
+    self->threads   = 0;/* TBD */
+    self->fds       = 0;/* TBD */
+}
+
+LIB_EXPORT
+bool CC
+SRACacheMetricsLessThan(const SRACacheMetrics* a, const SRACacheMetrics* b)
+{
+    if (a->bytes >= 0 && b->bytes >= 0 && a->bytes > b->bytes)
+        return false;
+    if (a->elements >= 0 && b->elements >= 0 && a->elements > b->elements)
+        return false;
+    if (a->threads >= 0 && b->threads >= 0 && a->threads > b->threads)
+        return false;
+    if (a->fds >= 0 && b->fds >= 0 && a->fds > b->fds)
+        return false;
+        
+    if (a->bytes    >= 0 && b->bytes    >= 0 && a->bytes    == b->bytes && 
+        a->elements >= 0 && b->elements >= 0 && a->elements == b->elements &&
+        a->threads  >= 0 && b->threads  >= 0 && a->threads  == b->threads &&
+        a->fds      >= 0 && b->fds      >= 0 && a->fds      == b->fds)
+        return false;
+        
+    return true;
+}
+
+static
+void 
+MetricsAdd(SRACacheMetrics* a, const SRACacheMetrics* b)
+{
+    a->bytes    += b->bytes;
+    a->elements += b->elements;
+    a->threads  += b->threads;
+    a->fds      += b->fds;
+}
+
+static
+void 
+MetricsSubtract(SRACacheMetrics* a, const SRACacheMetrics* b)
+{
+    a->bytes    -= b->bytes;
+    a->elements -= b->elements;
+    a->threads  -= b->threads;
+    a->fds      -= b->fds;
+}
+
+/*================================== SRACacheElement ==================================*/
+LIB_EXPORT rc_t CC SRACacheElementMake(SRACacheElement**        self, 
+                                       SRATable*                object, 
+                                       struct SRACacheIndex*    index, 
+                                       uint32_t                 key, 
+                                       const SRACacheMetrics*   metrics)
+{
+    rc_t rc = 0;
+    if ( self == NULL || object == NULL || index == NULL || metrics == NULL )
+        return RC( rcSRA, rcNode, rcConstructing, rcParam, rcNull );
+        
+    *self = malloc(sizeof(**self));
+    if (self == NULL)
+        rc = RC ( rcSRA, rcNode, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        (*self)->dad.next = NULL;
+        (*self)->dad.prev = NULL;
+        
+        (*self)->object = object;
+        rc = SRATableAddRef(object);
+        if ( rc != 0 )
+        {
+            free (*self);
+        }
+        else
+        {
+            (*self)->index = index;
+        
+            (*self)->key = key;
+        
+            memmove(&(*self)->metrics, metrics, sizeof((*self)->metrics));
+        }
+    }
+        
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRACacheElementDestroy(SRACacheElement* self)
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        return RC( rcSRA, rcNode, rcDestroying, rcSelf, rcNull );
+        
+    rc = SRATableRelease(self->object);
+    
+    free(self);
+    
+    return rc;
+}
+
+/*================================== SRACacheIndex ==================================*/
+LIB_EXPORT rc_t CC SRACacheIndexMake(SRACacheIndex** self, String* prefix)
+{
+    rc_t rc = 0;
+    if ( self == NULL || prefix == NULL )
+        return RC( rcSRA, rcIndex, rcConstructing, rcParam, rcNull );
+        
+    *self = malloc(sizeof(**self));
+    if (self == NULL)
+        rc = RC ( rcSRA, rcIndex, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        memset(*self, 0, sizeof(**self));
+        rc = StringCopy((const String**)&(*self)->prefix, prefix);
+        if (rc == 0)
+        {
+            rc = KVectorMake(&(*self)->body);
+            if (rc != 0)
+                StringWhack((*self)->prefix);
+        }
+        
+        if (rc != 0)
+        {
+            free(*self);
+            *self = NULL;
+        }
+    }
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRACacheIndexDestroy(SRACacheIndex* self)
+{
+    rc_t rc;
+    if ( self == NULL  )
+        return RC( rcSRA, rcIndex, rcDestroying, rcSelf, rcNull );
+        
+    rc = KVectorRelease(self->body);
+    StringWhack(self->prefix);
+    free(self);
+    return rc;
+}
+
+/*================================== SRACache ==================================*/
+static
+rc_t
+ReadValue(struct KConfig* kfg, const char* path, uint64_t* value, uint64_t dflt)
+{
+    rc_t rc = 0;
+    *value = dflt;
+    if ( kfg )
+    {   /* read configuration values */
+        const KConfigNode* node;
+        rc = KConfigOpenNodeRead( kfg, &node, "%s", path );
+        if (rc == 0)
+        {
+            uint64_t temp;
+            rc = KConfigNodeReadU64( node, &temp );
+            if (rc == 0)
+                *value = temp;
+            rc = KConfigNodeRelease ( node );
+        }
+        else if (rc == RC ( rcKFG, rcNode, rcOpening, rcPath, rcNotFound ))
+            rc = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRACacheInit(SRACache** self, struct KConfig* kfg)
+{
+    rc_t rc = 0;
+    if (self == NULL)
+        return RC( rcSRA, rcData, rcConstructing, rcSelf, rcNull );
+        
+    *self = malloc(sizeof(**self));
+    if (*self == NULL)
+        rc = RC ( rcSRA, rcData, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        uint64_t v;
+#define LOAD_VALUE(target, path, default)                       \
+        if (rc == 0)                                            \
+        {                                                       \
+            rc = ReadValue(kfg, path, &v, default);             \
+            if ( rc == 0 )                                      \
+                target = v;                                    \
+        }
+
+        LOAD_VALUE((*self)->softThreshold.bytes,    "/openserver/thresholds/soft/bytes",    SRACacheThresholdSoftBytesDefault);
+        LOAD_VALUE((*self)->softThreshold.elements, "/openserver/thresholds/soft/elements", SRACacheThresholdSoftElementsDefault);
+        LOAD_VALUE((*self)->softThreshold.threads,  "/openserver/thresholds/soft/threads",  SRACacheThresholdSoftThreadsDefault);
+        LOAD_VALUE((*self)->softThreshold.fds,      "/openserver/thresholds/soft/fds",      SRACacheThresholdSoftFdsDefault);
+            
+        LOAD_VALUE((*self)->hardThreshold.bytes,    "/openserver/thresholds/hard/bytes",    SRACacheThresholdHardBytesDefault);
+        LOAD_VALUE((*self)->hardThreshold.elements, "/openserver/thresholds/hard/elements", SRACacheThresholdHardElementsDefault);
+        LOAD_VALUE((*self)->hardThreshold.threads,  "/openserver/thresholds/hard/threads",  SRACacheThresholdHardThreadsDefault);
+        LOAD_VALUE((*self)->hardThreshold.fds,      "/openserver/thresholds/hard/fds",      SRACacheThresholdHardFdsDefault);
+#undef LOAD_VALUE
+    
+        if (rc == 0)
+        {
+            BSTreeInit( & (*self)->indexes );
+            DLListInit( & (*self)->lru );
+            
+            memset(&(*self)->current, 0, sizeof(*self)->current);
+            
+            (*self)->requests         = 0;
+            (*self)->hits             = 0;
+            (*self)->misses           = 0;
+            (*self)->busy             = 0;
+            
+            rc = KLockMake(&(*self)->mutex);
+        }
+    }        
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRACacheGetSoftThreshold(SRACache* self, SRACacheMetrics* metrics)
+{
+    if (self == NULL)
+        return RC( rcSRA, rcData, rcAccessing, rcSelf, rcNull );
+    if (metrics == NULL)
+        return RC( rcSRA, rcData, rcAccessing, rcParam, rcNull );
+    memmove(metrics, &self->softThreshold, sizeof(self->softThreshold));
+    return 0;
+}
+
+LIB_EXPORT rc_t CC SRACacheSetSoftThreshold(SRACache* self, const SRACacheMetrics* metrics)
+{
+    if (self == NULL)
+        return RC( rcSRA, rcData, rcUpdating, rcSelf, rcNull );
+    if (metrics == NULL)
+        return RC( rcSRA, rcData, rcUpdating, rcParam, rcNull );
+    memmove(&self->softThreshold, metrics, sizeof(self->softThreshold));
+    return 0;
+}
+
+LIB_EXPORT rc_t CC SRACacheGetHardThreshold(SRACache* self, SRACacheMetrics* metrics)
+{
+    if (self == NULL)
+        return RC( rcSRA, rcData, rcAccessing, rcSelf, rcNull );
+    if (metrics == NULL)
+        return RC( rcSRA, rcData, rcAccessing, rcParam, rcNull );
+    memmove(metrics, &self->hardThreshold, sizeof(self->hardThreshold));
+    return 0;
+}
+
+LIB_EXPORT rc_t CC SRACacheSetHardThreshold(SRACache* self, const SRACacheMetrics* metrics)
+{
+    if (self == NULL)
+        return RC( rcSRA, rcData, rcUpdating, rcSelf, rcNull );
+    if (metrics == NULL)
+        return RC( rcSRA, rcData, rcUpdating, rcParam, rcNull );
+    memmove(&self->hardThreshold, metrics, sizeof(self->hardThreshold));
+    return 0;
+}
+
+static void CC SRACacheIndexDestructor(BSTNode *n, void *data)
+{
+    SRACacheIndexDestroy((SRACacheIndex*)n);
+}
+static void CC SRACacheElementDestructor(DLNode *n, void *data)
+{
+    SRACacheElementDestroy((SRACacheElement*)n);
+}
+
+LIB_EXPORT rc_t CC SRACacheWhack(SRACache* self)
+{
+    rc_t rc = 0;
+    if (self == NULL)
+        return RC( rcSRA, rcData, rcDestroying, rcSelf, rcNull );
+
+    BSTreeWhack(&self->indexes, SRACacheIndexDestructor, NULL);
+    DLListWhack(&self->lru, SRACacheElementDestructor, NULL);
+    
+    rc = KLockRelease(self->mutex);
+    free(self);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRACacheGetUsage(SRACache* self, SRACacheUsage* usage)
+{
+    if (self == NULL)
+        return RC( rcSRA, rcData, rcAccessing, rcSelf, rcNull );
+    if (usage == NULL)
+        return RC( rcSRA, rcData, rcAccessing, rcParam, rcNull );
+    usage->soft_threshold   = self->softThreshold.elements;
+    usage->hard_threshold   = self->hardThreshold.elements;
+    usage->elements         = self->current.elements;
+    usage->requests         = self->requests;
+    usage->hits             = self->hits;
+    usage->misses           = self->misses;
+    usage->busy             = self->busy;
+    return 0;
+}
+
+static
+int64_t CC IndexCmp (const BSTNode * item, const BSTNode * n)
+{
+    return StringCompare( ((const SRACacheIndex *)item)->prefix, ((const SRACacheIndex *)n)->prefix );
+}
+    
+static
+int64_t CC PrefixCmp (const void * item, const BSTNode * n)
+{
+    return StringCompare( (const String*)item, ((const SRACacheIndex *)n)->prefix );
+}
+    
+static
+rc_t
+AddNewIndex(BSTree* indexes, String* prefix, SRACacheIndex** newIdx)
+{
+    rc_t rc = SRACacheIndexMake(newIdx, prefix);
+    if (rc == 0)
+    {
+        rc = BSTreeInsert(indexes, &(*newIdx)->dad, IndexCmp);
+        if (rc != 0)
+            SRACacheIndexDestroy(*newIdx);
+    }
+    return rc;
+}
+
+static
+rc_t
+ParseAccessionName(const char *acc, String* prefix, uint32_t* key)
+{
+    rc_t rc = 0;
+    
+    /*  extract the alphabetic prefix from the accession's name */
+    size_t prefLen = 0;
+    while (acc[prefLen] != 0 && isalpha(acc[prefLen]))
+        ++prefLen;
+    StringInit(prefix, acc, prefLen, prefLen);
+    
+    {   /* the numeric key will be the rest of the accession's name, if fully numeric */
+        char *end;
+        *key = strtou32 ( acc + prefLen, & end, 10 );
+        if ( end [ 0 ] != 0 )
+            rc = RC( rcSRA, rcData, rcAccessing, rcName, rcInvalid );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRACacheAddTable(SRACache* self, const char* acc, SRATable* table)
+{ /* if crosses soft threshold, signal BG thread to wake up */
+    rc_t rc = 0;
+    String prefix;
+    uint32_t key;
+    
+    if (self == NULL)
+        return RC( rcSRA, rcData, rcAccessing, rcSelf, rcNull );
+    if (acc == NULL || acc[0] == 0 || table == NULL)
+        return RC( rcSRA, rcData, rcAccessing, rcParam, rcNull );
+
+    rc = ParseAccessionName(acc, &prefix, &key);
+    if (rc == 0)
+    {
+        rc = KLockAcquire(self->mutex);
+        if (rc == 0)
+        {
+            SRACacheIndex* index = (SRACacheIndex*) BSTreeFind ( &self->indexes, &prefix, PrefixCmp );
+            if (index == NULL)
+                rc = AddNewIndex( &self->indexes, &prefix, &index );
+                
+            if (rc == 0)
+            {
+                SRACacheElement* elem = NULL;
+                rc = KVectorGetPtr ( index->body, key, (void**)&elem );   
+                if (rc == 0 && elem != NULL) /* table already in cache */
+                    rc = RC( rcSRA, rcData, rcInserting, rcParam, rcExists );
+                else if (GetRCState(rc) == rcNotFound)
+                {
+                    SRACacheMetrics metrics;
+                    MetricsInit(&metrics, table);
+                    rc = SRACacheElementMake(&elem, table, index, key, &metrics);
+                    if (rc == 0)
+                    {
+                        rc = KVectorSetPtr( index->body, key, elem );
+                        if (rc != 0)
+                            SRACacheElementDestroy(elem);
+                        else
+                        {   /* success - update global usage and time-sorted list */
+                            MetricsAdd(&self->current, &metrics);
+                            DLListPushTail( &self->lru, (DLNode*)elem );
+                        }
+                    }
+                }
+            }
+                
+            {
+                rc_t rc2 = KLockUnlock(self->mutex);
+                if (rc == 0)
+                    rc = rc2;
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRACacheGetTable(SRACache* self, const char* acc, const SRATable** object)
+{
+    rc_t rc = 0;
+    String prefix;
+    uint32_t key;
+    
+    if (self == NULL)
+        return RC( rcSRA, rcData, rcAccessing, rcSelf, rcNull );
+    if (acc == NULL || acc[0] == 0 || object == NULL)
+        return RC( rcSRA, rcData, rcAccessing, rcParam, rcNull );
+
+    *object = NULL;
+    
+    rc = ParseAccessionName(acc, &prefix, &key);
+    if (rc == 0)
+    {
+        ++ self->requests;
+        
+        rc = KLockAcquire(self->mutex);
+        if (rc == 0)
+        {
+            SRACacheIndex* index = (SRACacheIndex*) BSTreeFind ( &self->indexes, &prefix, PrefixCmp );
+            if (index != NULL)
+            {
+                SRACacheElement* elem = NULL;
+                rc = KVectorGetPtr ( index->body, key, (void**)&elem );   
+                if (rc == 0 && elem != NULL) 
+                {   
+                    if (atomic32_read(&elem->object->refcount) == 1)    /* owned by cache, not used elsewhere */
+                    {
+                        ++ self->hits;
+                        
+                        /* move to the least recently used position */
+                        DLListUnlink    ( &self->lru, &elem->dad );
+                        DLListPushTail  ( &self->lru, &elem->dad );
+                        
+                        *object = elem->object;
+                        rc = SRATableAddRef(*object);
+                    }
+                    else
+                    {
+                        ++ self->busy;
+                        rc = RC( rcSRA, rcData, rcAccessing, rcParam, rcBusy);
+                    }
+                }
+                else if (GetRCState(rc) == rcNotFound || elem == NULL)
+                {
+                    ++ self->misses;
+                    rc = 0;
+                }
+            }
+            else
+                ++ self->misses;
+                
+            {
+                rc_t rc2 = KLockUnlock(self->mutex);
+                if (rc == 0)
+                {
+                    rc = rc2;
+                    if (rc != 0)
+                        SRATableRelease(*object);
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRACacheFlush(SRACache* self)
+{
+    rc_t rc = 0;
+    if (self == NULL)
+        return RC( rcSRA, rcData, rcAccessing, rcSelf, rcNull );
+        
+    rc = KLockAcquire(self->mutex);
+    if (rc == 0)
+    {
+        /* use the lower of the two thresholds */
+        const SRACacheMetrics* thr = &self->softThreshold;
+        if ( SRACacheMetricsLessThan( &self->hardThreshold, thr ) )
+            thr = &self->hardThreshold;
+            
+        while ( ! SRACacheMetricsLessThan( &self->current, thr ) )
+        {
+            SRACacheElement* toFlush = (SRACacheElement*) DLListPopHead( &self->lru );
+            if (toFlush == NULL)
+                break;
+            rc = KVectorUnset( toFlush->index->body, toFlush->key );
+            if (rc != 0)
+                break; /* something is badly wrong */
+            MetricsSubtract( &self->current, &toFlush->metrics );
+            rc = SRACacheElementDestroy(toFlush);
+            if (rc != 0)
+                break;
+        }
+        
+        {
+            rc_t rc2 = KLockUnlock(self->mutex);
+            if (rc == 0)
+                rc = rc2;
+        }
+    }
+
+    return rc;
+}
diff --git a/libs/sra/sracol.c b/libs/sra/sracol.c
new file mode 100644
index 0000000..ed0328a
--- /dev/null
+++ b/libs/sra/sracol.c
@@ -0,0 +1,235 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sra/extern.h>
+#include <sra/sradb.h>
+#include <sra/types.h>
+#include <vdb/schema.h>
+#include <vdb/cursor.h>
+#include <klib/refcount.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include "sra-priv.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#define RC_MODULE (rcSRA)
+#define RC_TARGET (rcColumn)
+#define CLASS "SRAColumn"
+
+/* AddRef
+ * Release
+ *  see REFERENCE COUNTING, above
+ */
+LIB_EXPORT rc_t CC SRAColumnAddRef( const SRAColumn *self ) {
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, CLASS ) )
+        {
+        case krefLimit:
+            return RC ( RC_MODULE, RC_TARGET, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+rc_t SRAColumnWhack ( SRAColumn *self )
+{
+    if ( self -> tbl != NULL )
+    {
+        rc_t rc = SRATableSever ( self -> tbl );
+        if ( ! self -> read_only )
+        {
+            self -> tbl = NULL;
+            return rc;
+        }
+    }
+
+    free ( self );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC SRAColumnRelease ( const SRAColumn *self )
+{
+    if ( self != NULL )
+    {
+        rc_t rc;
+
+        switch ( KRefcountDrop ( & self -> refcount, "SRAColumn" ) )
+        {
+        case krefWhack:
+            return SRAColumnWhack ( ( SRAColumn* ) self );
+
+        case krefNegative:
+            rc = RC ( RC_MODULE, RC_TARGET, rcDestroying, rcSelf, rcDestroyed );
+            PLOGERR (klogInt,(klogInt, rc, "Released a SRAColumn $(B) with no more references",
+                      PLOG_P(self)));
+            return rc;
+        }
+    }
+
+    return 0;
+}
+
+
+/* OpenColumnRead
+ *  open a column for read
+ *
+ *  "col" [ OUT ] - return parameter for newly opened column
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving column name
+ *
+ *  "datatype" [ IN, NULL OKAY ] - optional NUL terminated typedecl
+ *  string describing fully qualified column data type, or if NULL
+ *  the default type for column.
+ */
+LIB_EXPORT rc_t CC SRATableOpenColumnRead( const SRATable *self,
+        const SRAColumn **rslt, const char *name, const char *datatype )
+{
+    rc_t rc;
+
+    if ( rslt == NULL )
+        rc = RC(RC_MODULE, rcColumn, rcOpening, rcParam, rcNull);
+    else
+    {
+        if ( self == NULL )
+            rc = RC(RC_MODULE, rcTable, rcAccessing, rcSelf, rcNull);
+        else if ( name == NULL )
+            rc = RC(RC_MODULE, rcColumn, rcOpening, rcName, rcNull);
+        else if ( name [ 0 ] == 0 )
+            rc = RC(RC_MODULE, rcColumn, rcOpening, rcName, rcEmpty);
+        else
+        {
+            SRAColumn *col = malloc ( sizeof * col );
+            if ( col == NULL )
+                rc = RC(RC_MODULE, RC_TARGET, rcConstructing, rcMemory, rcExhausted);
+            else
+            {
+                rc = ( datatype != NULL && datatype [ 0 ] != 0 ) ?
+                    VCursorAddColumn ( self -> curs, & col -> idx, "(%s)%s", datatype, name ):
+                    VCursorAddColumn ( self -> curs, & col -> idx, "%s", name );
+                if ( rc == 0 || GetRCState ( rc ) == rcExists )
+                {
+                    KRefcountInit ( & col -> refcount, 1, CLASS, "OpenColumnRead", name );
+                    col -> tbl = SRATableAttach ( self );
+                    col -> read_only = true;
+                    *rslt = col;
+                    return 0;
+                }
+                else if ( GetRCState ( rc ) == rcUndefined )
+                {
+                    rc = RC ( rcSRA, rcTable, rcOpening, rcColumn, rcNotFound );
+                }
+
+                free ( col );
+            }
+        }
+
+        * rslt = NULL;
+    }
+
+    return rc;
+}
+
+
+/* Datatype
+ *  access data type
+ *
+ *  "type" [ OUT, NULL OKAY ] - returns the column type declaration
+ *
+ *  "def" [ OUT, NULL OKAY ] - returns the definition of the type
+ *  returned in "type_decl"
+ *
+ * NB - one of "type" and "def" must be non-NULL
+ */
+LIB_EXPORT rc_t CC SRAColumnDatatype( const SRAColumn *self,
+        VTypedecl *type, VTypedef *def )
+{
+    if (self != NULL)
+        return SRATableColDatatype(self->tbl, self->idx, type, def);
+
+    if ( type != NULL )
+        memset ( type, 0, sizeof * type );
+    if ( def != NULL )
+        memset ( def, 0, sizeof * def );
+
+    return RC(RC_MODULE, RC_TARGET, rcAccessing, rcSelf, rcNull);
+}
+
+
+/* GetRange
+ *  get a contiguous range around a spot id, e.g. tile for Illumina
+ *
+ *  "id" [ IN ] - return parameter for 1-based spot id
+ *
+ *  "first" [ OUT, NULL OKAY ] and "last" [ OUT, NULL OKAY ] -
+ *  id range is returned in these output parameters, where
+ *  at least ONE must be NOT-NULL
+ */
+LIB_EXPORT rc_t CC SRAColumnGetRange( const SRAColumn *self,
+        spotid_t id, spotid_t *first, spotid_t *last )
+{
+    if (self != NULL)
+        return SRATableGetIdRange(self->tbl, self->idx, id, first, last);
+
+    if ( first != NULL )
+        * first = 0;
+    if ( last != NULL )
+        * last = 0;
+
+    return RC(RC_MODULE, RC_TARGET, rcAccessing, rcSelf, rcNull);
+}
+
+
+/* Read
+ *  read row data
+ *
+ *  "id" [ IN ] - spot row id between 1 and max(spot id)
+ *
+ *  "base" [ OUT ] and "offset" [ OUT ] - pointer and bit offset
+ *  to start of spot row data.
+ *
+ *  "size" [ OUT ] - size in bits of row data
+ */
+LIB_EXPORT rc_t CC SRAColumnRead( const SRAColumn *self,
+        spotid_t id, const void **base, bitsz_t *offset, bitsz_t *size )
+{
+    if (self != NULL)
+        return SRATableRead(self->tbl, id, self->idx, base, offset, size);
+
+    if ( base != NULL )
+        * base = NULL;
+    if ( offset != NULL )
+        * offset = 0;
+    if ( size != NULL )
+        * size = 0;
+
+    return RC(RC_MODULE, RC_TARGET, rcAccessing, rcSelf, rcNull);
+}
diff --git a/libs/sra/sramgr-cmn.c b/libs/sra/sramgr-cmn.c
new file mode 100644
index 0000000..6754190
--- /dev/null
+++ b/libs/sra/sramgr-cmn.c
@@ -0,0 +1,572 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sra/extern.h>
+
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <kfs/directory.h>
+#include <kfg/config.h>
+#include <vfs/manager.h>
+#include <vfs/resolver.h>
+#include <vfs/path.h>
+#include <kdb/manager.h>
+#include <kdb/kdb-priv.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <sra/sradb.h>
+#include <sra/sraschema.h>
+#include <sra/srapath.h>
+#include <sra/sradb-priv.h>
+#include <sysalloc.h>
+#include <atomic.h>
+
+#include "sra-priv.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* Whack
+ *  will not refuse request, and ignores errors
+ */
+static
+rc_t SRAMgrWhack ( const SRAMgr *that )
+{
+    SRAMgr *self = ( SRAMgr* ) that;
+
+    VSchemaRelease ( self -> schema );
+    VDBManagerRelease ( self -> vmgr );
+    SRACacheWhack ( self -> cache );
+    
+    /* must check here for NULL because
+       SRAPathRelease is weak-linked */
+    if ( self -> _pmgr != NULL )
+    {
+#if OLD_SRAPATH_MGR
+        SRAPathRelease ( self -> _pmgr );
+#else
+        VResolverRelease ( ( const VResolver* ) self -> _pmgr );
+#endif
+    }
+
+    free ( self );
+    return 0;
+}
+
+
+/* Release
+ *  releases reference to object
+ *  obtained from MakeRead, MakeUpdate,
+ *  or AddRef(see above)
+ */
+LIB_EXPORT rc_t CC SRAMgrRelease ( const SRAMgr *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "SRAMgr" ) )
+        {
+        case krefWhack:
+            return SRAMgrWhack ( ( SRAMgr* ) self );
+        case krefNegative:
+            return RC ( rcSRA, rcMgr, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* AddRef
+ *  attach a new reference to an existing object
+ *  ( see above)
+ */
+LIB_EXPORT rc_t CC SRAMgrAddRef ( const SRAMgr *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "SRAMgr" ) )
+        {
+        case krefLimit:
+            return RC ( rcSRA, rcMgr, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Attach
+ * Sever
+ */
+SRAMgr *SRAMgrAttach ( const SRAMgr *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "SRAMgr" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( SRAMgr* ) self;
+}
+
+rc_t SRAMgrSever ( const SRAMgr *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "SRAMgr" ) )
+        {
+        case krefWhack:
+            return SRAMgrWhack ( ( SRAMgr* ) self );
+        case krefNegative:
+            return RC ( rcSRA, rcMgr, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make
+ */
+static
+rc_t SRAMgrInitPath ( SRAMgr *mgr, KConfig *kfg, const KDirectory *wd )
+{
+    VFSManager *vfs;
+    rc_t rc = VFSManagerMake ( & vfs );
+    if ( rc == 0 )
+    {
+        rc = VFSManagerMakeResolver ( vfs, ( VResolver** ) & mgr -> _pmgr, kfg );
+        VFSManagerRelease ( vfs );
+    }
+
+    if ( rc != 0 )
+        mgr -> _pmgr = NULL;
+
+    return 0;
+}
+
+rc_t SRAMgrMake ( SRAMgr **mgrp,
+    const VDBManager *vmgr, const KDirectory *wd )
+{
+    rc_t rc;
+
+    /* require sraschema object */
+    SRAMgr *mgr = malloc ( sizeof * mgr );
+    if ( mgr == NULL )
+        rc = RC ( rcSRA, rcMgr, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        VSchema *schema;
+        rc = VDBManagerMakeSRASchema ( vmgr, & schema );
+        if ( rc == 0 )
+        {
+            KConfig* kfg;
+            rc = KConfigMake ( & kfg, wd );
+            if ( rc == 0 )
+            {
+                rc = SRAMgrInitPath ( mgr, kfg, wd );
+                if ( rc == 0 )
+                {
+                    rc = SRACacheInit ( & mgr -> cache, kfg );
+                    if ( rc == 0 )
+                    {
+                        KRefcountInit ( & mgr -> refcount, 1, "SRAMgr", "SRAMgrMake", "sramgr" );
+                        mgr -> vmgr = vmgr;
+                        mgr -> schema = schema;
+                        mgr -> mode = kcmCreate; /* TBD - should this include parents? */
+                        mgr -> read_only = true;
+                        * mgrp = mgr;
+                        KConfigRelease ( kfg );
+                        return 0;
+                    }
+                }
+                KConfigRelease ( kfg );
+            }
+
+            VSchemaRelease ( schema );
+        }
+
+        free ( mgr );
+    }
+
+    * mgrp = NULL;
+    return rc;
+}
+
+
+/* Writable
+ *  returns 0 if table is writable
+ *  rcLocked if locked, rcReadonly if read-only
+ *  other code upon error
+ *
+ *  "path" [ IN ] - NUL terminated table path
+ */
+LIB_EXPORT rc_t CC SRAMgrVWritable ( const SRAMgr *self,
+        const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcSRA, rcMgr, rcAccessing, rcSelf, rcNull );
+    return VDBManagerVWritable ( self -> vmgr, path, args );
+}
+
+LIB_EXPORT rc_t CC SRAMgrWritable ( const SRAMgr *self,
+        const char *path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+
+    rc = SRAMgrVWritable ( self, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRAMgrResolve( const SRAMgr *self, const char* acc, char* buf, size_t buf_size )
+{
+    if ( self == NULL )
+        return RC ( rcSRA, rcMgr, rcResolving, rcSelf, rcNull );
+    if ( acc == NULL || buf == NULL)
+        return RC ( rcSRA, rcMgr, rcResolving, rcParam, rcNull );
+    else
+    {
+        VFSManager *vfs;
+        rc_t rc = VFSManagerMake ( & vfs );
+        if (rc == 0)
+        {
+			rc_t rc2;
+            VPath* path;
+            rc = VFSManagerMakePath(vfs, &path, "ncbi-acc:%s", acc);
+            if (rc == 0)
+            {
+                const VPath* resolved;
+                rc = VResolverQuery ( (const struct VResolver*)self->_pmgr, 0, path, &resolved, NULL, NULL );
+                if (rc == 0)
+                {
+                    rc = VPathReadPath ( resolved, buf, buf_size, NULL );
+                    rc2 = VPathRelease(resolved);
+                    if (rc == 0)
+                        rc = rc2;
+                }
+                
+                rc2 = VPathRelease(path);
+                if (rc == 0)
+                    rc = rc2;
+            }
+            rc2 = VFSManagerRelease(vfs);
+            if (rc == 0)
+                rc = rc2;
+        }
+        
+        return rc;
+    }
+}
+
+LIB_EXPORT rc_t CC SRAMgrConfigReload( const SRAMgr *cself, const KDirectory *wd )
+{
+#if OLD_SRAPATH_MGR
+    SRAMgr *self = cself;
+
+    /* create a new SRAPath object */
+    SRAPath *pnew;
+    rc_t rc = SRAPathMake ( & pnew, wd );
+    if ( rc == 0 )
+    {
+        /* swap with the old guy */
+        SRAPath *pold = self -> _pmgr;
+        if ( atomic_test_and_set_ptr ( ( void *volatile* ) & self -> _pmgr, pnew, pold ) == ( void* ) pold )
+            SRAPathRelease ( pold );
+        else
+            SRAPathRelease ( pnew );
+    }
+
+    return rc;
+#else
+    return 0;
+#endif
+
+#if 0
+
+
+    /* do not reload VDBManager config for now
+       it cannot reload properly and grows in memory */
+    rc_t rc = 0;
+    /* (not thread) safely re-instanciate sra path config */
+    SRAMgr *self = (SRAMgr*)cself;
+    SRAPath* p = cself->_pmgr;
+    self->_pmgr = NULL;
+    if( (rc = SRAMgrInitPath(self, wd)) == 0 ) {
+        SRAPathRelease(p);
+    } else {
+        /* roll back */
+        self->_pmgr = p;
+    }
+    return rc;
+#endif
+
+}
+
+/* GetVDBManager
+ *  returns a new reference to VDBManager used by SRAMgr
+ */
+LIB_EXPORT rc_t CC SRAMgrGetVDBManagerRead ( const SRAMgr *self, const VDBManager **vmgr )
+{
+    rc_t rc;
+
+    if ( vmgr == NULL )
+        rc = RC ( rcSRA, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcMgr, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * vmgr = self -> vmgr;
+            return VDBManagerAddRef ( * vmgr );
+        }
+
+        * vmgr = NULL;
+    }
+
+    return rc;
+}
+
+/* GetKDBManager
+ *  returns a new reference to KDBManager used indirectly by SRAMgr
+ */
+LIB_EXPORT rc_t CC SRAMgrGetKDBManagerRead ( const SRAMgr *self,
+        struct KDBManager const **kmgr )
+{
+    rc_t rc;
+
+    if ( kmgr == NULL )
+        rc = RC ( rcSRA, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcMgr, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            return VDBManagerGetKDBManagerRead ( self -> vmgr, kmgr );
+        }
+
+        * kmgr = NULL;
+    }
+
+    return rc;
+}
+
+
+/* ModDate
+ *  return a modification timestamp for table
+ */
+LIB_EXPORT rc_t CC SRAMgrVGetTableModDate ( const SRAMgr *self,
+    KTime_t *mtime, const char *spec, va_list args )
+{
+    rc_t rc;
+
+    if ( mtime == NULL )
+        rc = RC ( rcSRA, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        * mtime = 0;
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcMgr, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            char path[4096];
+            rc = ResolveTablePath(self, path, sizeof path, spec, args);
+            if( rc == 0 ) {
+                struct KDBManager const *kmgr;
+                rc = VDBManagerGetKDBManagerRead ( self -> vmgr, & kmgr );
+                if ( rc == 0 )
+                {
+                    rc = KDBManagerGetTableModDate(kmgr, mtime, "%s", path);
+                    KDBManagerRelease ( kmgr );
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRAMgrGetTableModDate ( const SRAMgr *self,
+    KTime_t *mtime, const char *spec, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, spec );
+    rc = SRAMgrVGetTableModDate ( self, mtime, spec, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRAMgrSingleFileArchiveExt(const SRAMgr *self, const char* spec, const bool lightweight, const char** ext)
+{
+    rc_t rc;
+
+    if( self == NULL || spec == NULL || ext == NULL ) {
+        rc = RC(rcSRA, rcFile, rcConstructing, rcParam, rcNull);
+    } else {
+        char buf[4096];
+        va_list args;
+
+        if( (rc = ResolveTablePath(self, buf, sizeof(buf), spec, args)) == 0 ) {
+            const KDBManager* kmgr;
+            if( (rc = SRAMgrGetKDBManagerRead(self, &kmgr)) == 0 ) {
+                int type = KDBManagerPathType(kmgr, "%s", buf) & ~kptAlias;
+                if( type == kptDatabase ) {
+                    *ext = CSRA_EXT(lightweight);
+                } else if( type == kptTable ) {
+                    *ext = SRA_EXT(lightweight);
+                } else {
+                    rc = RC(rcSRA, rcPath, rcResolving, rcType, rcUnknown);        
+                }
+                KDBManagerRelease(kmgr);
+            }
+        }
+    }
+    return rc;
+}
+
+/* 
+ * FlushPath
+ * FlushRun
+ * RunBGTasks
+ *  stubbed functions to manipulate a cache, if implemented
+ */
+LIB_EXPORT rc_t CC SRAMgrGetCacheUsage( const SRAMgr *self, struct SRACacheUsage* stats )
+{
+    rc_t rc = 0;
+    if ( self == NULL || stats == NULL || self->cache == NULL)
+        rc = RC(rcSRA, rcMgr, rcAccessing, rcParam, rcNull);
+    else
+        rc = SRACacheGetUsage(self->cache, stats);
+    return rc;
+}
+ 
+LIB_EXPORT rc_t CC SRAMgrFlush ( struct SRAMgr const *self, const struct SRACacheMetrics* thr )
+{
+    rc_t rc = 0;
+    if( self == NULL  || self->cache == NULL)
+        rc = RC(rcSRA, rcFile, rcProcessing, rcSelf, rcNull);
+    else if( thr == NULL )
+        rc = RC(rcSRA, rcFile, rcProcessing, rcParam, rcNull);
+    else 
+    {
+        SRACacheMetrics saved;
+        rc = SRACacheGetSoftThreshold(self->cache, &saved);
+        if (rc == 0)
+        {
+            rc = SRACacheSetSoftThreshold(self->cache, thr);
+            if (rc == 0)
+            {
+                rc_t rc2;
+                rc = SRACacheFlush(self->cache);
+                rc2 = SRACacheSetSoftThreshold(self->cache, &saved);
+                if (rc == 0)
+                    rc = rc2;
+            }
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRAMgrRunBGTasks ( const SRAMgr *self )
+{
+    rc_t rc;
+
+    if( self == NULL  )
+        rc = RC(rcSRA, rcMgr, rcProcessing, rcSelf, rcNull);
+        
+    rc = SRACacheFlush(self->cache);
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRAMgrConfigureCache( const SRAMgr *self,  int32_t soft_threshold, int32_t hard_threshold )
+{
+    rc_t rc = 0;
+    if( self == NULL  || self->cache == NULL)
+        rc = RC(rcSRA, rcFile, rcProcessing, rcSelf, rcNull);
+    else if( soft_threshold < -1  || hard_threshold < -1 )
+        rc = RC(rcSRA, rcFile, rcProcessing, rcParam, rcNull);
+    else 
+    {
+        if ( soft_threshold > -1 )
+        {
+            SRACacheMetrics metrics;
+            memset(&metrics, 0, sizeof(metrics));
+            metrics.elements = soft_threshold;
+            rc = SRACacheSetSoftThreshold(self->cache, &metrics);
+        }
+        if ( rc == 0 && hard_threshold > -1 )
+        {
+            SRACacheMetrics metrics;
+            memset(&metrics, 0, sizeof(metrics));
+            metrics.elements = hard_threshold;
+            rc = SRACacheSetHardThreshold(self->cache, &metrics);
+        }
+        /* if a new threshold is low enough to cause a flush, do it right away */
+        rc = SRACacheFlush(self->cache);
+    }
+    return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * SRANamelist
+ *  redirecting functions
+ */
+
+
+LIB_EXPORT rc_t CC SRANamelistAddRef ( const SRANamelist *self )
+{
+    return KNamelistAddRef ( ( const KNamelist* ) self );
+}
+
+LIB_EXPORT rc_t CC SRANamelistRelease ( const SRANamelist *self )
+{
+    return KNamelistRelease ( ( const KNamelist* ) self );
+}
+
+LIB_EXPORT rc_t CC SRANamelistCount ( const SRANamelist *self, uint32_t *count )
+{
+    return KNamelistCount ( ( const KNamelist* ) self, count );
+}
+
+LIB_EXPORT rc_t CC SRANamelistGet ( const SRANamelist *self, uint32_t idx, const char **name )
+{
+    return KNamelistGet ( ( const KNamelist* ) self, idx, name );
+}
diff --git a/libs/sra/sramgr.c b/libs/sra/sramgr.c
new file mode 100644
index 0000000..912697d
--- /dev/null
+++ b/libs/sra/sramgr.c
@@ -0,0 +1,186 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sra/extern.h>
+#include <sra/sradb.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <klib/refcount.h>
+#include <klib/log.h>
+
+#include <klib/out.h>
+
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include "libsradb.vers.h"
+#include "sra-priv.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* MakeRead
+ *  create library reference for read-only access
+ *
+ *  "wd" [ IN, NULL OKAY ] - optional working directory for
+ *  accessing the file system. mgr will attach its own reference
+ *
+ *  NB - not implemented in update libary
+ *  and the read-only library may not be mixed with read/write
+ */
+LIB_EXPORT rc_t CC SRAMgrMakeRead ( const SRAMgr **mgr )
+{
+    return SRAMgrMakeReadWithDir ( mgr, NULL );
+}
+
+LIB_EXPORT rc_t CC SRAMgrMakeReadWithDir ( const SRAMgr **mgrp,
+        struct KDirectory const *wd )
+{
+    rc_t rc;
+
+    if ( mgrp == NULL )
+        rc = RC ( rcSRA, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        const VDBManager *vmgr;
+        rc = VDBManagerMakeRead ( & vmgr, wd );
+        if ( rc == 0 )
+        {
+            SRAMgr *mgr;
+            rc = SRAMgrMake ( & mgr, vmgr, wd );
+            if ( rc == 0 )
+            {
+                * mgrp = mgr;
+                return 0;
+            }
+
+            VDBManagerRelease ( vmgr );
+        }
+
+        * mgrp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* GetSchema
+ *  get a reference to the schema used to create new tables
+ *
+ *  "schema" [ OUT ] - return parameter for reference to SRA schema
+ *
+ * NB - returns a new reference that must be released via VSchemaRelease
+ */
+LIB_EXPORT rc_t CC SRAMgrGetSchemaRead ( const SRAMgr *self,
+        const VSchema **schema )
+{
+    rc_t rc;
+
+    if ( schema == NULL )
+        rc = RC ( rcSRA, rcSchema, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcMgr, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = VSchemaAddRef ( self -> schema );
+            if ( rc == 0 )
+            {
+                * schema = self -> schema;
+                return 0;
+            }
+        }
+
+        * schema = NULL;
+    }
+
+    return rc;
+}
+
+/* OpenDatatypes
+ *  open datatype registry object for requested access
+ *
+ *  "dt" [ OUT ] - return parameter for datatypes object
+ */
+LIB_EXPORT rc_t CC SRAMgrOpenDatatypesRead ( const SRAMgr *self,
+        struct VDatatypes const **dt )
+{
+    return SRAMgrGetSchemaRead ( self, ( const VSchema** ) dt );
+}
+
+
+/* UseSchema
+ *  allows SRA schema to be entirely replaced
+ *  affects creation/update of all subsequent tables
+ *
+ *  "schema" [ IN ] - new schema to be applied
+ *
+ * NB - manager will attach a new reference to schema object,
+ *  you are still responsible for releasing it via VSchemaRelease
+ */
+LIB_EXPORT rc_t CC SRAMgrUseSchemaRead ( const SRAMgr *self,
+        const VSchema *schema )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcSRA, rcMgr, rcUpdating, rcSelf, rcNull );
+    else if ( schema == NULL )
+        rc = RC ( rcSRA, rcMgr, rcUpdating, rcSchema, rcNull );
+    else if ( schema == self -> schema )
+        rc = 0;
+    else
+    {
+        rc = VSchemaAddRef ( schema );
+        if ( rc == 0 )
+        {
+            VSchemaRelease ( self -> schema );
+            ( ( SRAMgr* ) self ) -> schema = schema;
+        }
+    }
+
+    return rc;
+}
+
+
+/* Version
+ *  returns the library version
+ */
+LIB_EXPORT rc_t CC SRAMgrVersion ( const SRAMgr *self,
+        uint32_t *version )
+{
+    if ( version == NULL )
+        return RC ( rcSRA, rcMgr, rcAccessing, rcParam, rcNull );
+    if ( self == NULL )
+        return RC ( rcSRA, rcMgr, rcAccessing, rcSelf, rcNull );
+
+    * version = LIBSRADB_VERS;
+    return 0;
+}
diff --git a/libs/sra/sraschema-priv.h b/libs/sra/sraschema-priv.h
new file mode 100644
index 0000000..aec84f9
--- /dev/null
+++ b/libs/sra/sraschema-priv.h
@@ -0,0 +1,36 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sraschema_priv_
+#define _h_sraschema_priv_
+
+#include <stddef.h>
+
+/* schema is built-in */
+extern const char sra_schema_text [];
+extern const size_t sra_schema_size;
+
+#endif /* _h_sraschema_priv_ */
diff --git a/libs/sra/sraschema-stub.c b/libs/sra/sraschema-stub.c
new file mode 100644
index 0000000..2cfdc97
--- /dev/null
+++ b/libs/sra/sraschema-stub.c
@@ -0,0 +1,51 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sra/sraschema.h>
+#include <sra/sradb-priv.h>
+#include <klib/rc.h>
+
+#include "sra-priv.h"
+
+/*--------------------------------------------------------------------------
+ * SRASchema
+ *  a schema object pre-loaded with default SRA schema
+ */
+
+/* Make
+ *  create an instance of the default SRA schema
+ */
+rc_t CC VDBManagerMakeSRASchema ( struct VDBManager const *self, struct VSchema **schema )
+{
+    return SRASchemaMake ( schema, self );
+}
+
+rc_t CC SRAMgrMakeSRASchema ( const SRAMgr *self, struct VSchema **schema )
+{
+    if ( self != NULL )
+        return VDBManagerMakeSRASchema ( self -> vmgr, schema );
+    return RC ( rcSRA, rcMgr, rcAccessing, rcSelf, rcNull );
+}
diff --git a/libs/sra/sraschema.c b/libs/sra/sraschema.c
new file mode 100644
index 0000000..3d73cc6
--- /dev/null
+++ b/libs/sra/sraschema.c
@@ -0,0 +1,74 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sra/sch-extern.h>
+#include <sra/sradb-priv.h>
+#include <sra/sraschema.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include "sraschema-priv.h"
+#include "sra-priv.h"
+
+
+/*--------------------------------------------------------------------------
+ * SRASchema
+ *  a schema object pre-loaded with default SRA schema
+ */
+
+/* Make
+ *  create an instance of the default SRA schema
+ */
+
+LIB_EXPORT rc_t CC SRASchemaMake ( VSchema **schema, const VDBManager *mgr )
+{
+    rc_t rc;
+
+    if ( schema == NULL )
+        rc = RC ( rcVDB, rcMgr, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( mgr == NULL )
+            rc = RC ( rcVDB, rcMgr, rcCreating, rcSelf, rcNull );
+        else
+        {
+            rc = VDBManagerMakeSchema ( mgr, schema );
+            if ( rc == 0 )
+            {
+                rc = VSchemaParseText ( * schema, "sra-schema", sra_schema_text, sra_schema_size );
+                if ( rc == 0 )
+                    return 0;
+
+                VSchemaRelease ( * schema );
+            }
+        }
+
+        * schema = NULL;
+    }
+    return rc;
+}
diff --git a/libs/sra/sratbl-cmn.c b/libs/sra/sratbl-cmn.c
new file mode 100644
index 0000000..7f6a36e
--- /dev/null
+++ b/libs/sra/sratbl-cmn.c
@@ -0,0 +1,1458 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sra/extern.h>
+
+#include <sra/sradb.h>
+#include <sra/srapath.h>
+#include <sra/types.h>
+#include <sra/sraschema.h>
+#include <sra/sradb-priv.h>
+#include <vdb/database.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <vdb/dependencies.h>
+#include <kdb/meta.h>
+#include <kdb/manager.h>
+#include <kdb/table.h>
+#include <kdb/database.h>
+#include <kdb/kdb-priv.h>
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/path-priv.h>
+#include <vfs/resolver.h>
+#include <klib/refcount.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kfs/toc.h>
+#include <kfs/file.h>
+#include <sysalloc.h>
+
+#include "sra-priv.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <va_copy.h>
+
+/* Destroy
+ */
+static
+void CC column_release ( void *item, void *ignore )
+{
+    SRAColumn *self = item;
+    self -> tbl = NULL;
+    SRAColumnWhack ( self );
+}
+
+void SRATableDestroy ( SRATable *self )
+{
+    VectorWhack ( & self -> wcol, column_release, NULL );
+    VCursorRelease(self->curs);
+    KMetadataRelease ( self -> meta );
+    VTableRelease ( self -> vtbl );
+    SRAMgrSever ( self -> mgr );
+
+    memset(self, 0, sizeof *self);
+
+    free ( self );
+}
+
+/* AddRef
+ * Release
+ *  see REFERENCE COUNTING, above
+ */
+LIB_EXPORT rc_t CC SRATableAddRef( const SRATable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "SRATable" ) )
+        {
+        case krefLimit:
+            return RC ( rcSRA, rcTable, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC SRATableRelease( const SRATable *self )
+{
+    rc_t rc = 0;
+    
+    if (self)
+    {
+        switch (KRefcountDrop(&self->refcount, "SRATable"))
+        {
+        case krefWhack:
+            return SRATableWhack ( ( SRATable* ) self );
+        case krefNegative:
+            rc = RC (rcSRA, rcTable, rcDestroying, rcSelf, rcDestroyed);
+            PLOGERR (klogInt,(klogInt, rc, "Released an SRATable $(B) with no more references",
+                      PLOG_P(self)));
+            break;
+        }
+    }
+    return rc;
+}
+
+/* Attach
+ * Sever
+ */
+SRATable *SRATableAttach ( const SRATable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "SRATable" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( SRATable* ) self;
+}
+
+rc_t SRATableSever ( const SRATable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "SRATable" ) )
+        {
+        case krefWhack:
+            return SRATableWhack ( ( SRATable* ) self );
+        case krefNegative:
+            return RC ( rcSRA, rcTable, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* FillOutTableRead
+ *  creates an empty cursor
+ *  accesses metadata
+ */
+static rc_t ReadSpotSequence_v1(SRATable *self)
+{
+    const KMDataNode *n;
+    rc_t rc = KMetadataOpenNodeRead(self->meta, &n, ".seq");
+    if (rc == 0)
+    {
+        rc = KMDataNodeReadAsU64(n, &self->spot_count);
+        KMDataNodeRelease(n);
+    }
+    return rc;
+}
+
+typedef enum {
+    eNotRead,
+    eNotFound,
+    eFailed,
+    eRead
+} EState;
+typedef struct {
+    EState state;
+    rc_t rc;
+} State;
+typedef struct {
+    uint64_t value;
+    State state;
+} U64;
+typedef struct {
+    uint32_t value;
+    State state;
+} U32;
+typedef struct {
+    U64 BASE_COUNT;
+    U32 MAX_SPOT_ID;
+    U32 MIN_SPOT_ID;
+    U64 SPOT_COUNT;
+} PseudoMeta;
+static
+rc_t VCursor_ReadPseudoMeta(rc_t rc, const VCursor *self,
+    const char *name, void *buffer, uint32_t blen, State *state)
+{
+    uint32_t idx = ~0;
+    uint32_t row_len = ~0;
+
+    assert(state);
+    state->rc = 0;
+
+    if (rc != 0)
+    {   return rc; }
+
+    state->state = eNotRead;
+
+    rc = VCursorAddColumn(self, &idx, "%s", name);
+
+    if (rc != 0) {
+        state->rc = rc;
+
+        if ( GetRCObject( rc ) == (enum RCObject)rcColumn && GetRCState( rc ) == rcNotFound ) {
+            rc = 0;
+            state->state = eNotFound;
+        }
+        else {
+            state->state = eFailed;
+        }
+    }
+
+    if (state->rc == 0) {
+        rc = VCursorReadDirect(self, 1, idx, blen * 8, buffer, blen, &row_len);
+
+        state->rc = rc;
+
+        if (rc != 0)
+        {   state->state = eFailed; }
+        else
+        {   state->state = eRead; }
+
+    }
+
+    return rc;
+}
+
+static
+rc_t VCursor_ReadPseudoMetaU32(rc_t rc, const VCursor *self,
+    const char *name, U32 *val)
+{
+    assert(val);
+    return VCursor_ReadPseudoMeta(rc, self,
+        name, &val->value, sizeof val->value, &val->state);
+}
+
+static
+rc_t VCursor_ReadPseudoMetaU64(rc_t rc, const VCursor *self,
+    const char *name, U64 *val)
+{
+    assert(val);
+    return VCursor_ReadPseudoMeta(rc, self,
+        name, &val->value, sizeof val->value, &val->state);
+}
+
+static
+rc_t PseudoMetaInit(PseudoMeta *self, const VCursor *curs,
+    bool readSpotCount, uint64_t spot_count)
+{
+    rc_t rc = 0;
+
+    assert(self);
+
+    memset(self, 0, sizeof *self);
+
+    if (readSpotCount) {
+        rc =
+         VCursor_ReadPseudoMetaU64(rc, curs, "SPOT_COUNT", &self->SPOT_COUNT);
+    }
+    else {
+        self->SPOT_COUNT.value = spot_count;
+        self->SPOT_COUNT.state.state = eRead;
+    }
+
+    rc = VCursor_ReadPseudoMetaU64(rc, curs, "BASE_COUNT", &self->BASE_COUNT);
+
+    rc = VCursor_ReadPseudoMetaU32(rc, curs, "MIN_SPOT_ID", &self->MIN_SPOT_ID); 
+
+    rc = VCursor_ReadPseudoMetaU32(rc, curs, "MAX_SPOT_ID", &self->MAX_SPOT_ID);
+
+    return rc;
+}
+
+static
+rc_t PseudoMetaFix(PseudoMeta *self)
+{
+    rc_t rc = 0;
+
+    assert(self);
+
+    if (self->MIN_SPOT_ID.state.state != eRead)
+    {   self->MIN_SPOT_ID.value = 1; }
+
+    if (self->SPOT_COUNT.state.state != eRead &&
+        self->MAX_SPOT_ID.state.state != eRead)
+    {
+        return self->SPOT_COUNT.state.rc;
+    }
+    else if (self->SPOT_COUNT.state.state == eRead) {
+        if (self->MAX_SPOT_ID.state.state != eRead) {
+            self->MAX_SPOT_ID.value
+                = self->MIN_SPOT_ID.value + self->SPOT_COUNT.value - 1;
+        }
+        else if (self->MAX_SPOT_ID.value >= self->MIN_SPOT_ID.value) {
+	    uint32_t delta = (uint32_t) (self->SPOT_COUNT.value - (self->MAX_SPOT_ID.value - self->MIN_SPOT_ID.value + 1)); /** SPOT_COUNT is 64 bit, but M*_SPOT_ID is 32; anticipate rollover **/
+            if ( delta )
+            {
+                self->SPOT_COUNT.value
+                    = self->MAX_SPOT_ID.value - self->MIN_SPOT_ID.value + 1;
+            }
+        }
+    }
+    else {
+            self->SPOT_COUNT.value
+                = self->MAX_SPOT_ID.value - self->MIN_SPOT_ID.value - 1;
+    }
+
+    return rc;
+}
+
+static
+rc_t SRATableLoadMetadata(SRATable * self)
+{
+    rc_t rc = 0;
+    PseudoMeta meta;
+    bool readSpotCount = true;
+
+    assert(self && self->curs != NULL);
+    assert(self->curs_open == true);
+
+    readSpotCount = self->metavers > 1;
+    if (!readSpotCount) {
+        rc = ReadSpotSequence_v1(self);
+        if (rc != 0)
+        {   return rc; }
+    }
+
+    rc = PseudoMetaInit(&meta, self->curs, readSpotCount, self->spot_count);
+    if (rc != 0)
+    {   return rc; }
+
+    rc = PseudoMetaFix(&meta);
+    if (rc != 0)
+    {   return rc; }
+
+    self->spot_count = meta.SPOT_COUNT.value;
+    self->base_count = meta.BASE_COUNT.value;
+    self->min_spot_id = meta.MIN_SPOT_ID.value;
+    self->max_spot_id = meta.MAX_SPOT_ID.value;
+
+    {
+	int64_t delta = self->spot_count - (self->max_spot_id-self->min_spot_id+1);
+	if(delta>0 && ((uint32_t)delta)==0){/* there was a rollover*/
+		self->max_spot_id = self->min_spot_id + self->spot_count - 1;
+	}
+    }
+
+    return rc;
+}
+
+/* detect min and max spot-id from a temp. cursor */
+static rc_t SRATableGetMinMax( SRATable * self )
+{
+    const VCursor *temp_cursor;
+    rc_t rc;
+
+    assert( self != NULL );
+    assert( self->vtbl != NULL);
+    rc = VTableCreateCursorRead( self->vtbl, &temp_cursor );
+    if ( rc == 0 )
+    {
+        uint32_t idx;
+        rc = VCursorAddColumn ( temp_cursor, &idx, "READ" );
+        if ( rc == 0 )
+        {
+            rc = VCursorOpen( temp_cursor );
+            if ( rc == 0 )
+            {
+                int64_t  first;
+                uint64_t count;
+                rc = VCursorIdRange( temp_cursor, 0, &first, &count );
+                if ( rc == 0 )
+                {
+                    self->min_spot_id = first;
+                    self->max_spot_id = first + count;
+                    self->spot_count = count;
+                }
+            }
+        }
+        VCursorRelease( temp_cursor );
+    }
+    return rc;
+}
+
+rc_t SRATableFillOut ( SRATable *self, bool update )
+{
+    rc_t rc;
+    
+    /* require these operations to succeed */
+    rc = VCursorPermitPostOpenAdd( self->curs );
+    if ( rc != 0 )
+        return rc;
+    rc = VCursorOpen( self->curs );
+    if ( rc != 0 )
+        return rc;
+    self -> curs_open = true;
+    if ( ! update )
+    {
+        rc = SRATableLoadMetadata( self );
+        if ( rc != 0 )
+            rc = SRATableGetMinMax( self );
+    }
+    return rc;
+}
+
+
+/* ResolveTablePath
+ *  takes either an accession or path
+ *  substitutes any arguments
+ *  resolves via SRAPath mgr if present
+ */
+rc_t ResolveTablePath ( const SRAMgr *mgr,
+    char *path, size_t psize, const char *spec, va_list args )
+{
+#if OLD_SRAPATH_MGR
+    int len;
+    char tblpath [ 4096 ];
+    const SRAPath *pmgr = mgr -> _pmgr;
+
+    /* if no path manager or if the spec string has embedded path separators,
+       then this can't be an accession - just print it out */
+    if ( mgr -> _pmgr == NULL || strchr( spec, '/' ) != NULL )
+    {
+        len = vsnprintf ( path, psize, spec, args );
+        if ( len < 0 || ( size_t ) len >= psize )
+            return RC ( rcSRA, rcTable, rcOpening, rcPath, rcExcessive );
+        return 0;
+    }
+
+    /* create a copy - not likely to be too large */
+    len = vsnprintf ( tblpath, sizeof tblpath, spec, args );
+    if ( len < 0 || ( size_t ) len >= sizeof tblpath )
+        return RC ( rcSRA, rcTable, rcOpening, rcPath, rcExcessive );
+
+    /* test if the path exists in current directory, i.e. with assumed dot */
+    if ( ! SRAPathTest ( pmgr, tblpath ) )
+    {
+        rc_t rc = SRAPathFind ( pmgr, tblpath, path, psize );
+        if ( rc == 0 )
+            return 0;
+    }
+
+    /* use the path given */
+    if ( ( size_t ) len >= psize )
+        return RC ( rcSRA, rcTable, rcOpening, rcBuffer, rcInsufficient );
+    strcpy ( path, tblpath );
+
+    return 0;
+#else
+    VFSManager *vfs;
+    rc_t rc = VFSManagerMake ( & vfs );
+    if ( rc == 0 )
+    {
+        VPath *accession;
+        const VPath *tblpath = NULL;
+        rc = VFSManagerVMakePath ( vfs, & accession, spec, args );
+        if ( rc == 0 )
+        {
+            rc = VResolverLocal ( ( const VResolver* ) mgr -> _pmgr, accession, & tblpath );
+            if ( rc == 0 )
+            {
+                size_t size;
+                rc = VPathReadPath ( tblpath, path, psize, & size );
+                VPathRelease ( tblpath );
+            }
+            VPathRelease ( accession );
+        }
+
+        VFSManagerRelease ( vfs );
+    }
+    return rc;
+#endif
+}
+
+/* OpenRead
+ *  open an existing table
+ *
+ *  "tbl" [ OUT ] - return parameter for table
+ *
+ *  "spec" [ IN ] - NUL terminated UTF-8 string giving path
+ *  to table.
+ */
+static
+rc_t CC SRAMgrVOpenAltTableRead ( const SRAMgr *self,
+    const SRATable **rslt, const char *altname, const char *spec, va_list args )
+{
+    rc_t rc;
+
+    if ( rslt == NULL )
+        rc = RC ( rcSRA, rcTable, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcMgr, rcAccessing, rcSelf, rcNull );
+        else if ( spec == NULL )
+            rc = RC ( rcSRA, rcTable, rcOpening, rcName, rcNull );
+        else if ( spec [ 0 ] == 0 )
+            rc = RC ( rcSRA, rcTable, rcOpening, rcName, rcEmpty );
+        else
+        {
+            SRATable *tbl = calloc ( 1, sizeof *tbl );
+            if ( tbl == NULL )
+                rc = RC ( rcSRA, rcTable, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                VSchema *schema = NULL;
+
+                rc = VDBManagerMakeSRASchema(self -> vmgr, & schema);
+                if ( rc == 0 ) 
+                {
+                    va_list args_copy;
+                    va_copy ( args_copy, args );
+                    rc = VDBManagerVOpenTableRead ( self -> vmgr, & tbl -> vtbl, schema, spec, args );
+                    if ( rc != 0 && GetRCObject ( rc ) == (enum RCObject)rcTable && GetRCState ( rc ) == rcIncorrect )
+                    {
+                        const VDatabase *db;
+                        rc_t rc2 = VDBManagerVOpenDBRead ( self -> vmgr, & db, schema, spec, args_copy );
+                        if ( rc2 == 0 )
+                        {
+                            rc2 = VDatabaseOpenTableRead ( db, & tbl -> vtbl, "%s", altname );
+                            if ( rc2 == 0 )
+                                rc = 0;
+
+                            VDatabaseRelease ( db );
+                        }
+                    }
+                    va_end ( args_copy );
+
+                    VSchemaRelease(schema);
+
+                    if ( rc == 0 )
+                    {
+                        rc = VTableOpenMetadataRead ( tbl -> vtbl, & tbl -> meta );
+                        if ( rc == 0 )
+                        {
+                            rc = KMetadataVersion ( tbl -> meta, & tbl -> metavers );
+                            if ( rc == 0 )
+                            {
+                                rc = VTableCreateCursorRead ( tbl -> vtbl, & tbl -> curs );
+                                if ( rc == 0 )
+                                {
+                                    tbl -> mode = self -> mode;
+                                    tbl -> read_only = true;
+                                    KRefcountInit ( & tbl -> refcount, 1, "SRATable", "OpenTableRead", spec );
+                                        
+                                    rc = SRATableFillOut ( tbl, false );
+                                    if ( rc == 0 )
+                                    {
+                                        * rslt = tbl;
+                                        return 0;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    
+                }
+                SRATableWhack ( tbl );
+            }
+        }
+
+        * rslt = NULL;
+    }
+    return rc;
+}
+
+/* OpenRead
+ *  open an existing table
+ *
+ *  "tbl" [ OUT ] - return parameter for table
+ *
+ *  "spec" [ IN ] - NUL terminated UTF-8 string giving path
+ *  to table.
+ */
+LIB_EXPORT rc_t CC SRAMgrVOpenTableRead ( const SRAMgr *self,
+        const SRATable **crslt, const char *spec, va_list args )
+{
+    rc_t rc;
+    char tblpath [ 4096 ];
+    int num_writ = vsnprintf ( tblpath, sizeof tblpath, spec, args );
+    if ( num_writ < 0 || ( size_t ) num_writ >= sizeof tblpath )
+        rc = RC ( rcSRA, rcMgr, rcOpening, rcPath, rcExcessive );
+    else
+    {
+        SRATable **rslt = (SRATable **)crslt; /* to avoid "const_casts" below */
+        rc = SRACacheGetTable( self->cache, tblpath, crslt );
+        if  (rc == 0 )
+        {
+            if ( *crslt == NULL )
+            {
+                rc = SRAMgrOpenAltTableRead ( self, crslt, "SEQUENCE", tblpath );
+                if ( rc == 0 )
+                {
+                    rc = SRACacheAddTable( self->cache, tblpath, *rslt);
+                    if ( GetRCObject(rc) == rcParam && GetRCState(rc) == rcExists )
+                    {           /* the same object has appeared in the cache since our call to SRACacheGetTable above;  */
+                       rc = 0;  /* return the new object, never mind the cache */
+                    }
+                    else if ( ! SRACacheMetricsLessThan(&self->cache->current, &self->cache->hardThreshold) )
+                       rc = SRACacheFlush(self->cache);
+                }
+            }
+        }
+        else if ( (GetRCObject(rc) == rcName && GetRCState(rc) == rcInvalid) ||   /* accessions with irregular names are not cached */
+                  (GetRCObject(rc) == rcParam && GetRCState(rc) == rcBusy)    )   /* in cache but in use */
+        {    
+            rc = SRAMgrOpenAltTableRead ( self, crslt, "SEQUENCE", tblpath );
+            if (rc == 0)
+                (*rslt)->mgr = SRAMgrAttach(self);
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRAMgrOpenTableRead ( const SRAMgr *self,
+        const SRATable **tbl, const char *spec, ... )
+{
+    rc_t rc;
+    
+    va_list args;
+    va_start ( args, spec );
+
+    rc = SRAMgrVOpenTableRead ( self, tbl, spec, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* Read - PRIVATE
+ *  column message sent via table
+ */
+rc_t SRATableRead ( const SRATable *self, spotid_t id, uint32_t idx,
+    const void **base, bitsz_t *offset, bitsz_t *size )
+{
+    rc_t rc;
+
+    if ( base == NULL || offset == NULL || size == NULL )
+        rc = RC ( rcSRA, rcColumn, rcReading, rcParam, rcNull );
+    else if ( self == NULL )
+        rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        rc = 0;
+
+        /* open cursor */
+        if ( ! self -> curs_open )
+        {
+            rc = VCursorOpen(self->curs);
+            if ( rc == 0 )
+                ((SRATable *)self)->curs_open = true;
+        }
+
+        if ( rc == 0 )
+        {
+            uint32_t elem_bits, elem_off, elem_cnt;
+            rc = VCursorCellDataDirect ( self -> curs, id, idx,
+                & elem_bits, base, & elem_off, & elem_cnt );
+            if ( rc == 0 )
+            {
+                * offset = elem_off * elem_bits;
+                * size   = elem_cnt * elem_bits;
+                return 0;
+            } else if( UIError(rc, NULL, self->vtbl) ) {
+                UITableLOGError(rc, self->vtbl, true);
+            }
+        }
+    }
+
+    if ( base != NULL )
+        * base = NULL;
+    if ( offset != NULL )
+        * offset = 0;
+    if ( size != NULL )
+        * size = 0;
+
+    return rc;
+}
+
+/* GetSpotId
+ *  convert spot name to spot id
+ *
+ *  "id" [ OUT ] - return parameter for min(spot_id)-max(spot_id)
+ *
+ *  "spot_name" [ IN ] - external spot name string
+ *  in platform canonical format.
+ */
+LIB_EXPORT rc_t CC SRATableGetSpotId ( const SRATable *self,
+        spotid_t *rslt, const char *spot_name )
+{
+    rc_t rc;
+    if( self == NULL || spot_name == NULL){
+        rc=RC(rcSRA, rcTable, rcListing, rcSelf, rcName);
+    } else {
+        rc=VCursorParamsSet((struct VCursorParams*)self->curs,"QUERY_BY_NAME" ,spot_name);
+        if( rc == 0) {
+            struct {
+                uint64_t start_id;
+                uint64_t id_count;
+                int64_t x;
+                int64_t y;
+            } out;
+            uint32_t idx,len;
+            rc = VCursorAddColumn(self->curs, &idx, "SPOT_IDS_FOUND");
+            if( rc == 0 || GetRCState(rc) == rcExists){
+                rc = VCursorReadDirect(self->curs,1,idx,sizeof(out) * 8,&out, 1 , &len);
+                if ( rc == 0 ) {
+                    if(out.id_count==1) {
+                        if(rslt) *rslt=out.start_id;
+                        return 0;
+                    } else if(out.id_count > 1) { /*** doing table range scan in Name space - not relying on X and Y***/
+                        uint32_t x_idx;
+                        rc = VCursorAddColumn(self->curs, &x_idx, "X");
+                        if( rc == 0 || GetRCState(rc) == rcExists){
+                            uint32_t y_idx;
+                            rc = VCursorAddColumn(self->curs, &y_idx, "Y");
+                            if(rc == 0 || GetRCState(rc) == rcExists){
+                                spotid_t rowid;
+                                for(rowid = out.start_id; rowid < out.start_id + out.id_count; rowid ++){
+                                    int32_t x,y;
+                                    rc = VCursorReadDirect(self->curs,rowid,x_idx,32,&x,1, &len);
+                                    if(rc == 0){
+                                        rc = VCursorReadDirect(self->curs,rowid,y_idx,32,&y,1, &len);
+                                        if(rc == 0 && x==out.x && y==out.y){
+                                            if(rslt) *rslt=rowid;
+                                            return 0;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    rc = RC ( rcSRA, rcIndex, rcSearching, rcColumn, rcNotFound );
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+/* ListCol
+ *  returns a list of simple column names
+ *  each name represents at least one typed column
+ *
+ *  "names" [ out ] - return parameter for names list
+ */
+LIB_EXPORT rc_t CC SRATableListCol( const SRATable *self, SRANamelist **rslt ) {
+    if ( self != NULL )
+        return VTableListCol ( self -> vtbl, (KNamelist **)rslt );
+    return RC(rcSRA, rcTable, rcListing, rcSelf, rcName);
+}
+
+
+/* ColDatatypes
+ *  returns list of typedecls for named column
+ *
+ *  "col" [ IN ] - column name
+ *
+ *  "dflt_idx" [ OUT, NULL OKAY ] - returns the zero-based index
+ *  into "typedecls" of the default datatype for the named column
+ *
+ *  "typedecls" [ OUT ] - list of datatypes available for named column
+ */
+LIB_EXPORT rc_t CC SRATableColDatatypes( const SRATable *self,
+        const char *col, uint32_t *dflt_idx, SRANamelist **rslt ) {
+    if ( self != NULL )
+        return VTableColumnDatatypes ( self -> vtbl, col, dflt_idx, (KNamelist **)rslt );
+    return RC(rcSRA, rcTable, rcListing, rcSelf, rcName);
+}
+
+rc_t SRATableColDatatype ( const SRATable *self,
+        uint32_t idx, VTypedecl *type, VTypedef *def )
+{
+    rc_t rc;
+    if ( type == NULL && def == NULL )
+        rc = RC ( rcSRA, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        union { VTypedecl td; VTypedef def; } dummy;
+        if ( type == NULL )
+            type = & dummy . td;
+        else if ( def == NULL )
+            def = & dummy . def;
+
+        if ( idx == 0 )
+            rc = RC ( rcSRA, rcColumn, rcAccessing, rcSelf, rcNull );
+        else if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            VTypedesc desc;
+            rc = VCursorDatatype ( self -> curs, idx, type, & desc );
+            if ( rc == 0 )
+            {
+                rc = VSchemaDescribeTypedef ( VCursorGetSchema(self -> curs), def, type -> type_id );
+                if ( rc == 0 )
+                    return 0;
+            }
+        }
+
+        memset ( type, 0, sizeof * type );
+        memset ( def, 0, sizeof * def );
+    }
+    return rc;
+}
+
+/* MetaRevision
+ *  returns current revision number
+ *  where 0(zero) means tip
+ */
+LIB_EXPORT rc_t CC SRATableMetaRevision( const SRATable *self, uint32_t *rslt )
+{
+    if (self == NULL)
+        return RC(rcSRA, rcTable, rcAccessing, rcSelf, rcNull);
+    return KMetadataRevision (self->meta,rslt);
+}
+
+
+/* MaxRevision
+ *  returns the maximum revision available
+ */
+LIB_EXPORT rc_t CC SRATableMaxMetaRevision( const SRATable *self, uint32_t *rslt )
+{
+    if (self == NULL)
+        return RC(rcSRA, rcTable, rcAccessing, rcSelf, rcNull);
+    return KMetadataMaxRevision(self->meta,rslt);
+}
+
+/* UseMetaRevision
+ *  opens indicated revision of metadata
+ *  all non-zero revisions are read-only
+ */
+LIB_EXPORT rc_t CC SRATableUseMetaRevision ( const SRATable *cself, uint32_t revision )
+{
+    rc_t rc;
+
+    if ( cself == NULL )
+        rc = RC ( rcSRA, rcTable, rcUpdating, rcSelf, rcNull );
+    else if ( cself -> read_only == false )
+        rc = RC ( rcSRA, rcTable, rcUpdating, rcMetadata, rcBusy );
+    else
+    {
+        uint32_t cur;
+        rc = KMetadataRevision ( cself -> meta, & cur );
+        if ( rc == 0 && cur != revision )
+        {
+            SRATable *self = ( SRATable* ) cself;
+            const KMetadata *meta;
+            rc = KMetadataOpenRevision ( self -> meta, & meta, revision );
+            if ( rc == 0 )
+            {
+                KMetadataRelease ( self -> meta );
+                self -> meta = meta;
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* OpenMDataNode
+ *  open a metadata node
+ *
+ *  "node" [ OUT ] - return parameter for metadata node
+ *
+ *  "path" [ IN ] - simple or hierarchical NUL terminated
+ *  path to node
+ */
+LIB_EXPORT rc_t CC SRATableOpenMDataNodeRead( const SRATable *self, 
+        struct KMDataNode const **node, const char *path, ... ) {
+    va_list va;
+    rc_t rc;
+    
+    va_start(va, path);
+    rc = SRATableVOpenMDataNodeRead(self, node, path, va);
+    va_end(va);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRATableVOpenMDataNodeRead( const SRATable *self,
+        struct KMDataNode const **rslt, const char *path, va_list args ) {
+    if (self == NULL)
+        return RC(rcSRA, rcTable, rcAccessing, rcSelf, rcNull);
+    
+    return KMetadataVOpenNodeRead(self->meta, rslt, path, args);
+}
+
+/* private */
+rc_t SRATableGetIdRange ( const SRATable *self,
+        uint32_t idx, spotid_t id, spotid_t *pfirst, spotid_t *plast )
+{
+    rc_t rc;
+
+    if ( pfirst == NULL && plast == NULL )
+        rc = RC ( rcSRA, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        spotid_t dummy;
+        if ( pfirst == NULL )
+            pfirst = & dummy;
+        else if ( plast == NULL )
+            plast = & dummy;
+
+        if ( idx == 0 )
+            rc = RC ( rcSRA, rcColumn, rcAccessing, rcSelf, rcNull );
+        else if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            int64_t first, last;
+            rc = VCursorPageIdRange ( self -> curs, idx, id, & first, & last );
+            if ( rc == 0 )
+            {
+                * pfirst = ( spotid_t ) first;
+                * plast = ( spotid_t ) last;
+
+                if ( ( int64_t ) * pfirst == first && ( int64_t ) * plast == last )
+                    return 0;
+
+                rc = RC ( rcSRA, rcColumn, rcAccessing, rcRange, rcExcessive );
+            }
+        }
+
+        * pfirst = * plast = 0;
+    }
+
+    return rc;
+}
+
+/* semi-private for sra-dbcc */
+LIB_EXPORT rc_t CC SRATableGetVTableRead( const SRATable *self, const VTable **rslt )
+{
+    if (rslt == NULL)
+        return RC(rcSRA, rcTable, rcAccessing, rcParam, rcNull);
+    
+    if (self == NULL)
+    {
+        * rslt = NULL;
+        return RC(rcSRA, rcTable, rcAccessing, rcSelf, rcNull);
+    }
+
+    *rslt = self->vtbl;
+    return VTableAddRef(*rslt);
+}
+
+LIB_EXPORT rc_t CC SRATableGetKTableRead ( const SRATable *self, struct KTable const **ktbl )
+{
+    rc_t rc;
+
+    if ( ktbl == NULL )
+        rc = RC ( rcSRA, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            return VTableGetKTableRead ( self -> vtbl, ktbl );
+        }
+
+        * ktbl = NULL;
+    }
+
+    return rc;
+}
+
+/* Locked
+ *  returns true if locked
+ */
+LIB_EXPORT bool CC SRATableLocked( const SRATable *self )
+{
+    return self ? VTableLocked(self->vtbl) : false;
+}
+
+LIB_EXPORT struct VSchema const* CC SRATableGetSchema ( struct SRATable const *self )
+{
+        return self ? VCursorGetSchema( self->curs ) : NULL;
+}
+
+/* sfa_filter
+ *  if a name is found in list, exclude it
+ */
+#define DEBUG_SORT(msg) DBGMSG (DBG_SRA, DBG_FLAG(DBG_SRA_SORT), msg)
+
+/* sfa_sort
+ *  reorders list
+ */
+enum sfa_path_type_id
+{
+    sfa_not_set = -1,
+    sfa_exclude,
+    sfa_non_column,
+    sfa_required,
+    sfa_preferred,
+    sfa_optional
+};
+
+#if _DEBUGGING
+const char* sfa_path_type_id[] = {
+    "not_set",
+    "exclude",
+    "non_column",
+    "required",
+    "preferred",
+    "optional"
+};
+#endif
+
+typedef struct reorder_t_struct {
+    const char * path;
+    uint64_t     size;
+    enum sfa_path_type_id type_id;
+} reorder_t;
+
+typedef enum sfa_path_type_id (CC *sfa_path_type_func)( const char *path );
+
+/*
+union u_void_sfa_path_type_func
+{
+    void * func;
+    sfa_path_type_func sptf;
+};
+
+static sfa_path_type_func void_to_sfa_path_type_func( void * func )
+{
+    union u_void_sfa_path_type_func x;
+    x.func = func;
+    return x.sptf;
+}
+*/
+
+static
+bool CC sfa_filter(const KDirectory *dir, const char *leaf, void* func)
+{
+    bool ret = true;
+    sfa_path_type_func f = (sfa_path_type_func)func; /* void_to_sfa_path_type_func( func ); */
+    enum sfa_path_type_id type = f(leaf);
+
+    ret = type >= sfa_non_column;
+    DEBUG_SORT(("%s: %s %s %s\n", __func__, leaf, sfa_path_type_id[type + 1], ret ? "keep" : "drop"));
+    return ret;
+}
+
+static
+bool CC sfa_filter_light(const KDirectory *dir, const char *leaf, void* func)
+{
+    bool ret = true;
+    sfa_path_type_func f = (sfa_path_type_func)func; /* void_to_sfa_path_type_func( func ); */
+
+    enum sfa_path_type_id type = f(leaf);
+
+    ret = type >= sfa_non_column && type < sfa_optional;
+    DEBUG_SORT(("%s: %s %s %s\n", __func__, leaf, sfa_path_type_id[type + 1], ret ? "keep" : "drop"));
+    return ret;
+}
+
+#define MATCH( ptr, str ) \
+    ( (memcmp(ptr, str, sizeof(str) - 2) == 0 && \
+       ((ptr)[sizeof(str) - 2] == '\0' || (ptr)[sizeof(str) - 2] == '/')) ? \
+        (ptr) += sizeof(str) - (((ptr)[sizeof(str) - 2] == '/') ? 1 : 2) : (const char*) 0)
+
+static
+enum sfa_path_type_id CC sfa_path_type_tbl( const char *path )
+{
+    /* use first character as distinguisher for match */
+    switch ( path [ 0 ] )
+    {
+    case 'c':
+        /* perhaps it's a column */
+        if ( MATCH ( path, "col/" ) )
+        {
+            switch ( path [ 0 ] )
+            {
+            case 'D':
+                if ( MATCH ( path, "DELETION_QV/" ) )
+                    return sfa_optional;
+                if ( MATCH ( path, "DELETION_TAG/" ) )
+                    return sfa_optional;
+                break;
+            case 'H':
+                if ( MATCH ( path, "HOLE_NUMBER/" ) )
+                    return sfa_optional;
+                if ( MATCH ( path, "HOLE_STATUS/" ) )
+                    return sfa_optional;
+                break;
+            case 'I':
+                if ( MATCH ( path, "INTENSITY/" ) )
+                    return sfa_optional;
+                if ( MATCH ( path, "INSERTION_QV/" ) )
+                    return sfa_optional;
+                break;
+            case 'N':
+                if ( MATCH ( path, "NAME_FMT/" ) )
+                    return sfa_preferred;
+                if ( MATCH ( path, "NAME/" ) )
+                    return sfa_preferred;
+                if ( MATCH ( path, "NOISE/" ) )
+                    return sfa_optional;
+                if ( MATCH ( path, "NUM_PASSES/" ) )
+                    return sfa_optional;
+                break;
+            case 'P':
+                if ( MATCH ( path, "POSITION/" ) )
+                    return sfa_optional;
+                if ( MATCH ( path, "PRE_BASE_FRAMES/" ) )
+                    return sfa_optional;
+                if ( MATCH ( path, "PULSE_INDEX/" ) )
+                    return sfa_optional;
+                break;
+            case 'Q':
+                if ( MATCH ( path, "QUALITY2/" ) )
+                    return sfa_optional;
+                break;
+            case 'S':
+                if ( MATCH ( path, "SIGNAL/" ) )
+                    return sfa_optional;
+                if ( MATCH ( path, "SPOT_NAME/" ) )
+                    return sfa_preferred;
+                if ( MATCH ( path, "SUBSTITUTION_QV/" ) )
+                    return sfa_optional;
+                if ( MATCH ( path, "SUBSTITUTION_TAG/" ) )
+                    return sfa_optional;
+                break;
+            case 'W':
+                if ( MATCH ( path, "WIDTH_IN_FRAMES/" ) )
+                    return sfa_optional;
+                break;
+            case 'X':
+            case 'Y':
+                if ( path [ 1 ] == '/' )
+                    return sfa_preferred;
+                break;
+            }
+        }
+        return sfa_required;
+
+    case 'i':
+        /* look for skey index */
+        if ( MATCH ( path, "idx/skey" ) )
+            if ( path [ 0 ] == 0 || strcmp ( path, ".md5" ) == 0 )
+                return sfa_preferred;
+        if ( MATCH ( path, "idx/fuse-" ) )
+            return sfa_exclude;
+        break;
+
+    case 's':
+        /* look for old skey index */
+        if ( MATCH ( path, "skey" ) )
+            if ( path [ 0 ] == 0 || strcmp ( path, ".md5" ) == 0 )
+                return sfa_preferred;
+        break;
+    }
+    /* anything not recognized is non-column required */
+    return sfa_non_column;
+}
+
+static
+enum sfa_path_type_id CC sfa_path_type_db ( const char *path )
+{
+    /* use first character as distinguisher for match */
+    switch ( path [ 0 ] )
+    {
+    case 't':
+        /* perhaps it's a table */
+        if ( MATCH ( path, "tbl/" ) )
+        {
+            switch ( path [ 0 ] )
+            {
+            case 0:
+                return sfa_non_column;
+            case 'S':
+                if ( MATCH ( path, "SEQUENCE/" ) )
+                    return sfa_path_type_tbl(path);
+                break;
+            case 'C':
+                if ( MATCH ( path, "CONSENSUS/" ) )
+                    return sfa_path_type_tbl(path);
+                break;
+            case 'P':
+                if ( MATCH ( path, "PRIMARY_ALIGNMENT/" ) )
+                    return sfa_path_type_tbl(path);
+                break;
+            case 'R':
+                if ( MATCH ( path, "REFERENCE/" ) )
+                    return sfa_path_type_tbl(path);
+                break;
+            }
+            /* all other tables are optional */
+            return sfa_optional;
+        }
+    }
+    /* anything not recognized is non-column required */
+    return sfa_non_column;
+}
+#undef MATCH
+
+static
+int64_t CC sfa_path_cmp ( const void **_a, const void **_b, void * ignored )
+{
+    const reorder_t * a = *_a;
+    const reorder_t * b = *_b;
+    int64_t ret;
+
+    DEBUG_SORT(("%s enter\t%s %s %lu \t%s %s %lu", __func__, 
+                a->path, sfa_path_type_id[a->type_id + 1], a->size,
+                b->path, sfa_path_type_id[b->type_id + 1], b->size));
+
+    ret = a->type_id - b->type_id;
+    if (ret == 0)
+    {
+        if (a->size > b->size)
+            ret = 1;
+        else if (a->size < b->size)
+            ret = -1;
+        else
+            ret = strcmp (a->path, b->path);
+    }
+    DEBUG_SORT(("\t%d\n", ret));
+    return ret;
+}
+
+typedef
+struct to_nv_data_struct
+{
+    const KDirectory * d;
+    Vector * v;
+    rc_t rc;
+    sfa_path_type_func path_type;
+} to_nv_data;
+
+static
+void CC to_nv (void * _item, void * _data)
+{
+    const char* path = _item;
+    to_nv_data* data = _data;
+    reorder_t* obj;
+
+    if (data->rc == 0)
+    {
+        obj = malloc (sizeof (*obj));
+        if (obj == NULL)
+            data->rc = RC (rcSRA, rcVector, rcConstructing, rcMemory, rcExhausted);
+        else
+        {
+            rc_t rc = KDirectoryFileSize (data->d, &obj->size, "%s", path);
+            if (rc == 0)
+            {
+                obj->path = path;
+                obj->type_id = data->path_type(path);
+                rc = VectorAppend (data->v, NULL, obj);
+            }
+
+            if (rc)
+            {
+                free (obj);
+                data->rc = rc;
+            }
+        }
+    }
+}
+
+static
+void CC item_whack (void * item, void * ignored)
+{
+    free (item);
+}
+
+static
+rc_t CC sfa_sort( const KDirectory *dir, Vector *v, sfa_path_type_func func )
+{
+    /* assume "v" is a vector of paths - hopefully relative to "dir" */
+    Vector nv;
+    to_nv_data data;
+    uint32_t base;
+
+    DEBUG_SORT(("%s enter\n", __func__));
+
+    base = VectorStart (v);
+    VectorInit (&nv, base, VectorLength (v));
+    data.d = dir;
+    data.v = &nv;
+    data.rc = 0;
+    data.path_type = func;
+
+    VectorForEach (v, false, to_nv, &data);
+
+    if(data.rc == 0) {
+        uint32_t idx = 0;
+        uint32_t limit = VectorLength (v) + base;
+
+        VectorReorder(&nv, sfa_path_cmp, NULL);
+
+        for (idx = base; idx < limit; ++idx) {
+            const reorder_t * tmp;
+            void * ignore;
+
+            tmp = VectorGet (&nv, idx);
+            data.rc = VectorSwap (v, idx + base, tmp->path, &ignore);
+            if(data.rc) {
+                break;
+            }
+        }
+    }
+    VectorWhack (&nv, item_whack, NULL);
+    DEBUG_SORT(("%s exit %d %R\n", __func__, data.rc, data.rc));
+    return data.rc;
+}
+
+static
+rc_t CC sfa_sort_db( const KDirectory *dir, Vector *v )
+{
+    return sfa_sort(dir, v, sfa_path_type_db);
+}
+
+static
+rc_t CC sfa_sort_tbl( const KDirectory *dir, Vector *v )
+{
+    return sfa_sort(dir, v, sfa_path_type_tbl);
+}
+
+/*
+union sptd_2_void
+{
+    sfa_path_type_func func;
+    void * ptr;
+};
+
+static void * sfa_path_type_func_to_void( sfa_path_type_func func )
+{
+    union sptd_2_void u;
+    u.func = func;
+    return u.ptr;
+}
+*/
+
+/* MakeSingleFileArchive
+ *  makes a single-file-archive file from an SRA table
+ *
+ *  contents are ordered by frequency and necessity of access
+ *
+ *  "lightweight" [ IN ] - when true, include only those components
+ *  required for read and quality operations.
+ *
+ *  "ext" [OUT,NULL] - optional file name extension to use for file
+ */
+LIB_EXPORT rc_t CC SRATableMakeSingleFileArchive ( const SRATable *self, const KFile **sfa, bool lightweight, const char** ext)
+{
+    rc_t rc;
+
+    if ( sfa == NULL )
+    {
+        rc = RC( rcSRA, rcFile, rcConstructing, rcParam, rcNull );
+    }
+    else
+    {
+        *sfa = NULL;
+        if ( self == NULL )
+        {
+            rc = RC( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        }
+        else
+        {
+            const VDatabase *db;
+            rc = VTableOpenParentRead( self->vtbl, &db );
+            if ( rc == 0 && db != NULL )
+            {
+                const KDatabase *kdb;
+                rc = VDatabaseOpenKDatabaseRead( db, &kdb );
+                if ( rc == 0 )
+                {
+                    const KDirectory *db_dir;
+                    rc = KDatabaseOpenDirectoryRead( kdb, &db_dir );
+                    if ( rc == 0 )
+                    {
+                        rc = KDirectoryOpenTocFileRead( db_dir,
+                                                        sfa,
+                                                        sraAlign4Byte,
+                                                        lightweight ? sfa_filter_light : sfa_filter,
+                                                        ( void * )sfa_path_type_db, /* sfa_path_type_func_to_void( sfa_path_type_db ), */
+                                                        sfa_sort_db );
+                        KDirectoryRelease( db_dir );
+                        if ( ext != NULL )
+                        {
+                            *ext = CSRA_EXT( lightweight );
+                        }
+                    }
+                    KDatabaseRelease( kdb );
+                }
+                VDatabaseRelease( db );
+            }
+            else
+            {
+                const KTable *ktbl;
+                rc = SRATableGetKTableRead( self, &ktbl );
+                if ( rc == 0 )
+                {
+                    const KDirectory *tbl_dir;
+                    rc = KTableGetDirectoryRead( ktbl, &tbl_dir );
+                    if ( rc == 0 )
+                    {
+                        rc = KDirectoryOpenTocFileRead( tbl_dir,
+                                                        sfa,
+                                                        sraAlign4Byte,
+                                                        lightweight ? sfa_filter_light : sfa_filter,
+                                                        ( void * )sfa_path_type_tbl, /* sfa_path_type_func_to_void( sfa_path_type_tbl ), */
+                                                        sfa_sort_tbl );
+                        KDirectoryRelease( tbl_dir );
+                        if ( ext != NULL )
+                        {
+                            *ext = SRA_EXT( lightweight );
+                        }
+                    }
+                    KTableRelease(ktbl);
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+/* OpenAltTableRead
+ *  opens a table within a database structure with a specific name
+ */
+SRA_EXTERN rc_t CC SRAMgrOpenAltTableRead ( const SRAMgr *self,
+    const SRATable **tbl, const char *altname, const char *spec, ... )
+{
+    rc_t rc;
+    
+    va_list args;
+    va_start ( args, spec );
+
+    if ( altname == NULL || altname [ 0 ] == 0 ) {
+        altname = "SEQUENCE";
+    }
+    rc = SRAMgrVOpenAltTableRead ( self, tbl, altname, spec, args );
+
+    va_end ( args );
+    return rc;
+}
diff --git a/libs/sra/sratbl.c b/libs/sra/sratbl.c
new file mode 100644
index 0000000..3f474d2
--- /dev/null
+++ b/libs/sra/sratbl.c
@@ -0,0 +1,118 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sra/extern.h>
+#include <vdb/cursor.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include "sra-priv.h"
+
+rc_t SRATableWhack ( SRATable *self )
+{
+    SRATableDestroy ( self );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC SRATableBaseCount ( const SRATable *self, uint64_t *rslt )
+{
+    rc_t rc;
+
+    if ( rslt == NULL )
+        rc = RC ( rcSRA, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            *rslt = self->base_count;
+            return 0;
+        }
+        *rslt = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRATableSpotCount ( const SRATable *self, uint64_t *rslt )
+{
+    rc_t rc;
+
+    if ( rslt == NULL )
+        rc = RC ( rcSRA, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            *rslt = self->spot_count;
+            return 0;
+        }
+        *rslt = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRATableMinSpotId ( const SRATable *self, spotid_t *rslt )
+{
+    rc_t rc;
+
+    if ( rslt == NULL )
+        rc = RC ( rcSRA, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            *rslt = self->min_spot_id;
+            return 0;
+        }
+        *rslt = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRATableMaxSpotId ( const SRATable *self, spotid_t *rslt )
+{
+    rc_t rc;
+
+    if ( rslt == NULL )
+        rc = RC ( rcSRA, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            *rslt = self->max_spot_id;
+            return 0;
+        }
+        *rslt = 0;
+    }
+    return rc;
+}
diff --git a/libs/sra/types.c b/libs/sra/types.c
new file mode 100644
index 0000000..a14b7d4
--- /dev/null
+++ b/libs/sra/types.c
@@ -0,0 +1,298 @@
+/*=======================================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sra/extern.h>
+#include <klib/defs.h>
+#include <sra/types.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * VTypedef
+ */
+
+
+/* Sizeof
+ *  returns the bit size of declared type
+ *
+ *  technically, this is self -> size * self -> dim.
+ */
+#ifndef VTypedefSizeof
+LIB_EXPORT bitsz_t CC VTypedefSizeof ( const VTypedef *self )
+{
+    if ( self == NULL )
+        return 0;
+    return ( bitsz_t ) self -> type_size * self -> dim;
+}
+#endif
+
+/*--------------------------------------------------------------------------
+ * VDatatypes
+ */
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC VDatatypesAddRef ( const VDatatypes *self )
+{
+    return VSchemaAddRef ( ( const VSchema* ) self );
+}
+
+LIB_EXPORT rc_t CC VDatatypesRelease ( const VDatatypes *self )
+{
+    return VSchemaRelease ( ( const VSchema* ) self );
+}
+
+
+/* ResolveTypedecl
+ *  converts a typedecl string to type id and vector dimension
+ *
+ *  "resolved" [ OUT ] - resolved type declaration
+ *
+ *  "typedecl" [ IN ] - type declaration
+ */
+LIB_EXPORT rc_t CC VDatatypesVResolveTypedecl ( const VDatatypes *self,
+    VTypedecl *resolved, const char *typedecl, va_list args )
+{
+    return VSchemaVResolveTypedecl ( ( const VSchema* ) self, resolved, typedecl, args );
+}
+
+LIB_EXPORT rc_t CC VDatatypesResolveTypedecl ( const VDatatypes *self,
+    VTypedecl *resolved, const char *typedecl, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, typedecl );
+    rc = VSchemaVResolveTypedecl ( ( const VSchema* ) self, resolved, typedecl, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+
+/* ResolveTypename
+ *  convert a type id into its type definition
+ *
+ *  "resolved" [ OUT ] - resolved type definition
+ *
+ *  "typname" [ IN ] - NUL-terminated type name
+ */
+LIB_EXPORT rc_t CC VDatatypesResolveTypename ( const VDatatypes *self,
+    VTypedef *resolved, const char *typname )
+{
+    rc_t rc;
+
+    if ( resolved == NULL )
+        rc = RC ( rcSRA, rcSchema, rcResolving, rcParam, rcNull );
+    else
+    {
+        VTypedecl td;
+        rc = VSchemaResolveTypedecl ( ( const VSchema* ) self, & td, "%s", typname );
+        if ( rc == 0 )
+        {
+            rc = VSchemaDescribeTypedef ( ( const VSchema* ) self, resolved, td . type_id );
+            if ( rc == 0 )
+                return rc;
+        }
+
+        memset ( resolved, 0, sizeof * resolved );
+    }
+    return rc;
+}
+
+
+/* ResolveTypeid
+ *  convert a type id into its type definition
+ *
+ *  "resolved" [ OUT ] - resolved type definition
+ *
+ *  "type_id" [ IN ] - 1-based runtime type id
+ */
+LIB_EXPORT rc_t CC VDatatypesResolveTypeid ( const VDatatypes *self,
+    VTypedef *resolved, uint32_t type_id )
+{
+    return VSchemaDescribeTypedef ( ( const VSchema* ) self, resolved, type_id );
+}
+
+
+/* SizeofTypedecl
+ *  returns the bit size of type declaration
+ */
+LIB_EXPORT rc_t CC VDatatypesSizeofTypedecl ( const VDatatypes *self,
+    bitsz_t *type_size, const VTypedecl *td )
+{
+    rc_t rc;
+    if ( type_size == NULL )
+        rc = RC ( rcSRA, rcSchema, rcAccessing, rcParam, rcNull );
+    else
+    {
+        VTypedesc desc;
+        rc = VSchemaDescribeTypedecl ( ( const VSchema* ) self, & desc, td );
+        if ( rc == 0 )
+        {
+            * type_size = VTypedescSizeof ( & desc );
+            return 0;
+        }
+
+        * type_size = 0;
+    }
+    return rc;
+}
+
+
+/* SizeofTypeid
+ *  returns the bit size of typeid
+ *
+ *  "type_size" [ OUT ] - bit size of a type
+ *
+ *  "type_id" [ IN ] - numerical index of a type
+ *
+ *  "all_elements" [ IN ] - for multi-dimesional types
+ *  return the sum of sizes, otherwise - only for a single element
+ */
+LIB_EXPORT rc_t CC VDatatypesSizeofTypeid ( const VDatatypes *self,
+    bitsz_t *type_size, uint32_t type_id, bool all_elements )
+{
+    rc_t rc;
+
+    if ( type_size == NULL )
+        rc = RC ( rcVDB, rcType, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcType, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            VTypedef td;
+            rc = VDatatypesResolveTypeid ( self, & td, type_id );
+            if ( rc == 0 )
+            {
+                * type_size = td . type_size;
+                if ( all_elements )
+                    * type_size *=  td . dim;
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* MakeTypedecl
+ *  convert a VTypedecl into canonical text
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated type declaration string
+ *
+ *  "typedecl" [ IN ] - binary representation of typedecl
+ */
+LIB_EXPORT rc_t CC VDatatypesMakeTypedecl ( const VDatatypes *self,
+    char *buffer, size_t bsize, const VTypedecl *typedecl )
+{
+    return VTypedeclToText ( typedecl, ( const VSchema* ) self, buffer, bsize );
+}
+
+
+/* ToSupertype
+ *  cast a typedecl to a size-equivalent supertype decl
+ *  returns not-found and leaves "typedecl" unchanged
+ *  if no supertype exists
+ *
+ *  "typedecl" [ IN, OUT ] - populated with a correct
+ *  type id and vector dimension on input, will be updated
+ *  to contain a supertype and equivalent dimension on
+ *  output. e.g.:
+ *
+ *    IN -  { type_id NCBI:qual4, dim 1 }
+ *    OUT - { type_id I8, dim 4 }
+ */
+LIB_EXPORT rc_t CC VDatatypesToSupertype ( const VDatatypes *self, VTypedecl *typedecl )
+{
+    return VTypedeclToSupertype ( typedecl, ( const VSchema* ) self, typedecl );
+}
+
+
+/* ToIntrinsic - DEPRECATED
+ *  cast a typedecl ( if necessary ) to a size-equivalent
+ *  intrinsic typedecl.
+ *
+ *  returns not-found and leaves "typedecl" unchanged
+ *  if no intrinsic supertype exists
+ *
+ *  leaves "typedecl" unchanged if it is already intrinsic.
+ *
+ *  "typedecl" [ IN, OUT ] - populated with a correct
+ *  type id and vector dimension on input, will be updated
+ *  to contain a supertype and equivalent dimension on
+ *  output. e.g.:
+ *
+ *    IN -  { type_id NCBI:qual4, dim 1 }
+ *    OUT - { type_id I8, dim 4 }
+ */
+LIB_EXPORT rc_t CC VDatatypesToIntrinsic ( const VDatatypes *self, VTypedecl *typedecl )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcSRA, rcType, rcCasting, rcSelf, rcNull );
+    else if ( typedecl == NULL )
+        rc = RC ( rcSRA, rcType, rcCasting, rcParam, rcNull );
+    else
+    {
+        const VSchema *schema = ( const VSchema* ) self;
+        uint32_t last_intrinsic = VSchemaLastIntrinsicTypeId ( schema );
+        if ( last_intrinsic == 0 )
+            rc = RC ( rcSRA, rcType, rcCasting, rcSelf, rcInvalid );
+        else for ( rc = 0; typedecl -> type_id > last_intrinsic; )
+        {
+            if ( ! VTypedeclToSupertype ( typedecl, schema, typedecl ) )
+                break;
+        }
+    }
+
+    return rc;
+}
+
+
+/* ToAncestor
+ *  cast a typedecl to a size-equivalent ancestor decl
+ *  returns true if cast can be performed
+ */
+LIB_EXPORT bool CC VDatatypesToAncestor ( const VDatatypes *self,
+    const VTypedecl *to, const VTypedecl *from )
+{
+    VTypedecl cast;
+    return VTypedeclToTypedecl ( from, ( const VSchema* ) self, to, & cast, NULL );
+}
diff --git a/libs/sra/wsramgr.c b/libs/sra/wsramgr.c
new file mode 100644
index 0000000..6c430bc
--- /dev/null
+++ b/libs/sra/wsramgr.c
@@ -0,0 +1,165 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sra/extern.h>
+
+#include <sra/wsradb.h>
+#include <os-native.h>
+
+#define KONST
+#include "sra-priv.h"
+#include <sra/types.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/manager.h>
+#include <klib/refcount.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+
+#include <stdlib.h>
+#include <sysalloc.h>
+
+#define RC_MODULE (rcSRA)
+#define RC_TARGET (rcMgr)
+#define CLASS "SRAMgr"
+
+
+/* MakeUpdate
+ *  create library handle for read/write access
+ *
+ *  "wd" [ IN, NULL OKAY ] - optional working directory for
+ *  accessing the file system. mgr will attach its own reference.
+ *
+ *  NB - not implemented in read-only library,
+ *  and the read-only library may not be mixed with read/write
+ */
+LIB_EXPORT rc_t CC SRAMgrMakeUpdate ( SRAMgr **mgrp, struct KDirectory *wd )
+{
+    rc_t rc;
+
+    if ( mgrp == NULL )
+        rc = RC ( rcSRA, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        VDBManager *vmgr;
+        rc = VDBManagerMakeUpdate ( & vmgr, wd );
+        if ( rc == 0 )
+        {
+            SRAMgr *mgr;
+            rc = SRAMgrMake ( & mgr, vmgr , NULL );
+            if ( rc == 0 )
+            {
+                mgr -> read_only = false;
+                * mgrp = mgr;
+                return 0;
+            }
+
+            VDBManagerRelease ( vmgr );
+        }
+
+        * mgrp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* Drop
+ *  drop an existing table
+ *
+ *  "force" [ IN ] - if true, make every attempt to remove table
+ *
+ *  "path" [ IN ]  - NUL terminated table name
+ */
+LIB_EXPORT rc_t CC SRAMgrDropTable( SRAMgr *self, bool force, const char *path, ... ) {
+    va_list va;
+    rc_t rc;
+    
+    va_start(va, path);
+    rc = SRAMgrVDropTable(self, force, path, va);
+    va_end(va);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRAMgrVDropTable( SRAMgr *self, bool force, const char *path, va_list args ) {
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcRemoving, rcSelf, rcNull);
+    if (path == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcRemoving, rcParam, rcNull);
+    return VDBManagerVDrop(self->vmgr, kptTable, path, args);
+}
+
+LIB_EXPORT rc_t CC SRAMgrVLock ( SRAMgr *self, const char *path, va_list args ) {
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcRemoving, rcSelf, rcNull);
+    if (path == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcRemoving, rcParam, rcNull);
+    return VDBManagerVLock(self->vmgr, path, args);
+}
+
+LIB_EXPORT rc_t CC SRAMgrLock ( SRAMgr *self, const char *path, ... ) {
+    va_list va;
+    rc_t rc;
+    
+    va_start(va, path);
+    rc = SRAMgrVLock(self, path, va);
+    va_end(va);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRAMgrVUnlock ( SRAMgr *self, const char *path, va_list args ) {
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcRemoving, rcSelf, rcNull);
+    if (path == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcRemoving, rcParam, rcNull);
+    return VDBManagerVUnlock(self->vmgr, path, args);
+}
+
+LIB_EXPORT rc_t CC SRAMgrUnlock ( SRAMgr *self, const char *path, ... ) {
+    va_list va;
+    rc_t rc;
+    
+    va_start(va, path);
+    rc = SRAMgrVUnlock(self, path, va);
+    va_end(va);
+    return rc;
+}
+
+
+/* SetMD5Mode
+ *  sets default MD5 file mode for all objects
+ *  opened for update under table
+ */
+LIB_EXPORT rc_t CC SRAMgrSetMD5Mode( SRAMgr *self, bool useMD5 ) {
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcUpdating, rcSelf, rcNull);
+    self->mode = useMD5 ? (self->mode | kcmMD5) : (self->mode & ~kcmMD5);
+    return 0;
+}
diff --git a/libs/sra/wsraschema-stub.c b/libs/sra/wsraschema-stub.c
new file mode 100644
index 0000000..2cfdc97
--- /dev/null
+++ b/libs/sra/wsraschema-stub.c
@@ -0,0 +1,51 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sra/sraschema.h>
+#include <sra/sradb-priv.h>
+#include <klib/rc.h>
+
+#include "sra-priv.h"
+
+/*--------------------------------------------------------------------------
+ * SRASchema
+ *  a schema object pre-loaded with default SRA schema
+ */
+
+/* Make
+ *  create an instance of the default SRA schema
+ */
+rc_t CC VDBManagerMakeSRASchema ( struct VDBManager const *self, struct VSchema **schema )
+{
+    return SRASchemaMake ( schema, self );
+}
+
+rc_t CC SRAMgrMakeSRASchema ( const SRAMgr *self, struct VSchema **schema )
+{
+    if ( self != NULL )
+        return VDBManagerMakeSRASchema ( self -> vmgr, schema );
+    return RC ( rcSRA, rcMgr, rcAccessing, rcSelf, rcNull );
+}
diff --git a/libs/sra/wsratbl.c b/libs/sra/wsratbl.c
new file mode 100644
index 0000000..f95537f
--- /dev/null
+++ b/libs/sra/wsratbl.c
@@ -0,0 +1,649 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sra/extern.h>
+#include <sra/wsradb.h>
+#include <sra/types.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/meta.h>
+#include <klib/printf.h> /* string_vprintf */
+#include <klib/refcount.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include "sra-debug.h"
+
+#define KONST
+#include "sra-priv.h"
+
+#define RC_MODULE (rcSRA)
+#define RC_TARGET (rcTable)
+#define CLASS "SRATable"
+
+/* Whack
+ */
+
+rc_t SRATableWhack ( SRATable *self )
+{
+    SRATableDestroy( self );
+    return 0;
+}
+
+/* Create
+ *  creates a new table
+ *
+ *  "tbl" [ OUT ] - return parameter for table
+ *
+ *  "path" [ IN ] - NUL terminated table name
+ */
+LIB_EXPORT rc_t CC SRAMgrCreateTable(SRAMgr *self, SRATable **tbl, const char *typespec, const char *path, ...) {
+    va_list va;
+    rc_t rc;
+    
+    va_start(va, path);
+    rc = SRAMgrVCreateTable(self, tbl, typespec, path, va);
+    va_end(va);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRAMgrVCreateTable ( SRAMgr *self, SRATable **rslt,
+    const char *typespec, const char *spec, va_list args )
+{
+    rc_t rc;
+
+    if ( rslt == NULL )
+        rc = RC ( rcSRA, rcTable, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcConstructing, rcSelf, rcNull );
+        else if ( spec == NULL )
+            rc = RC ( rcSRA, rcTable, rcConstructing, rcString, rcNull );
+        else if ( spec [ 0 ] == 0 )
+            rc = RC ( rcSRA, rcTable, rcConstructing, rcString, rcEmpty );
+        else
+        {
+            char path [ 4097 ];
+            size_t act_size = 0;
+            
+            rc = string_vprintf(path, 4097, &act_size, spec, args);
+            path[act_size] = '\0';
+            if ( rc == 0 )
+            {
+                VTable *vtbl;
+                rc = VDBManagerCreateTable ( self -> vmgr, & vtbl, self -> schema,
+                                             typespec, ( self -> mode & kcmBitMask ) | kcmCreate, "%s", path );
+                if ( rc == 0 )
+                {
+                    rc = VTableColumnCreateParams ( vtbl, kcmCreate, kcsCRC32, 0 );
+                    if ( rc == 0 )
+                    {
+                        SRATable *tbl = calloc ( 1, sizeof * tbl );
+                        if ( tbl == NULL )
+                            rc = RC ( rcSRA, rcTable, rcConstructing, rcMemory, rcExhausted );
+                        else
+                        {
+                            tbl -> vtbl = vtbl;
+
+                            rc = VTableOpenMetadataUpdate ( vtbl, & tbl -> meta );
+                            if ( rc == 0 )
+                                rc = KMetadataVersion ( tbl -> meta, & tbl -> metavers );
+                            if ( rc == 0 )
+                                rc = VTableCreateCursorWrite ( vtbl, & tbl -> curs, kcmInsert );
+                            if ( rc == 0 )
+                            {
+                                tbl -> mgr = SRAMgrAttach ( self );
+                                tbl -> mode = self -> mode;
+                                tbl -> read_only = false;
+                                KRefcountInit ( & tbl -> refcount, 1, "SRATable", "OpenTableUpdate", path );
+                                VectorInit ( & tbl -> wcol, 0, 16 );
+                                * rslt = tbl;
+                                return 0;
+                            }
+
+                            vtbl = NULL;
+                            SRATableWhack ( tbl );
+                        }
+                    }
+
+                    VTableRelease ( vtbl );
+                }
+            }
+        }
+
+        * rslt = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenUpdate
+ *  open an existing table
+ *
+ *  "run" [ OUT ] - return parameter for table
+ *
+ *  "path" [ IN ] - NUL terminated table name
+ */
+LIB_EXPORT rc_t CC SRAMgrOpenTableUpdate(SRAMgr *self, SRATable **tbl, const char *path, ...) {
+    va_list va;
+    rc_t rc;
+    
+    va_start(va, path);
+    rc = SRAMgrVOpenTableUpdate(self, tbl, path, va);
+    va_end(va);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRAMgrVOpenTableUpdate(SRAMgr *mgr, SRATable **rslt, const char *spec, va_list args) {
+    SRATable *self;
+    char path[4096];
+    rc_t rc;
+    
+    if (mgr == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcConstructing, rcSelf, rcNull);
+    if (spec == NULL || rslt == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcConstructing, rcParam, rcNull);
+    
+    *rslt = NULL;
+    
+    rc = ResolveTablePath(mgr, path, sizeof(path), spec, args);
+    if (rc)
+        return rc;
+    
+    self = calloc(1, sizeof(*self));
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcConstructing, rcMemory, rcExhausted);
+    
+    rc = VDBManagerOpenTableUpdate(mgr->vmgr, &self->vtbl, mgr->schema, "%s", path);
+    if (rc == 0) {
+        rc = VTableOpenMetadataUpdate(self->vtbl, &self->meta);
+        if (rc == 0) {
+            rc = KMetadataVersion(self->meta, &self->metavers);
+            if (rc == 0) {
+                rc = VTableCreateCursorWrite(self->vtbl, &self->curs, kcmInsert);
+                if (rc == 0) {
+                    self->mgr = SRAMgrAttach(mgr);
+                    self->mode = mgr->mode;
+                    self->read_only = false;
+                    KRefcountInit(&self->refcount, 1, "SRATable", "OpenTableUpdate", path);
+                    
+                    rc = SRATableFillOut ( self, true );
+                    if ( rc == 0 )
+                    {
+                        VectorInit ( & self -> wcol, 0, 16 );
+                    
+                        *rslt = self;
+                        return 0;
+                    }
+                }
+            }
+        }
+    }
+    SRATableWhack(self);
+    return rc;
+}
+
+/* NewSpot
+ *  creates a new spot record,
+ *  returning spot id.
+ *
+ *  "id" [ OUT ] - return parameter for id of newly created spot
+ */
+LIB_EXPORT rc_t CC SRATableNewSpot( SRATable *self, spotid_t *id ) {
+    rc_t rc;
+    
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcInserting, rcSelf, rcNull);
+    if (id == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcInserting, rcParam, rcNull);
+    
+    if (self->curs_open == false) {
+        SRADBG(("opening cursor\n"));
+        rc = VCursorOpen(self->curs);
+        if (rc)
+            return rc;
+        self->curs_open = true;
+    }
+    
+    rc = VCursorOpenRow(self->curs);
+    if (rc == 0) {
+        int64_t rowid;
+        if( (rc = VCursorRowId(self->curs, &rowid)) == 0 ) {
+            *id = rowid;
+        }
+    }
+    return rc;
+}
+
+/* OpenSpot
+ *  opens an existing spot record from id
+ *
+ *  "id" [ IN ] - 1-based spot id
+ */
+LIB_EXPORT rc_t CC SRATableOpenSpot( SRATable *self, spotid_t id ) {
+    rc_t rc;
+    
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcOpening, rcSelf, rcNull);
+#if 0
+    /* TODO: translate spot id to row id */
+    rc = VCursorSetRowId(self->curs, id);
+    if (rc == 0) {
+        rc = VCursorOpenRow(self->curs);
+    }
+#else
+    rc = RC(RC_MODULE, RC_TARGET, rcOpening, rcFunction, rcUnsupported);
+#endif
+    return rc;
+}
+
+
+/* CloseSpot
+ *  closes a spot opened with either NewSpot or OpenSpot
+ */
+LIB_EXPORT rc_t CC SRATableCloseSpot( SRATable *self ) {
+    rc_t rc;
+    
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcClosing, rcSelf, rcNull);
+    
+    rc = VCursorCommitRow(self->curs);
+    if (rc == 0)
+        return VCursorCloseRow(self->curs);
+    VCursorCloseRow(self->curs);
+    return rc;
+}
+
+
+/* Commit
+ *  commit all changes
+ */
+LIB_EXPORT rc_t CC SRATableCommit( SRATable *self ) {
+    rc_t rc;
+    
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcCommitting, rcSelf, rcNull);
+    rc = VCursorCommit(self->curs);
+    VCursorRelease(self->curs);
+    self->curs = NULL;
+    if (rc == 0)
+        rc = VTableReindex(self->vtbl);
+    return rc;
+}
+
+static int64_t CC cmp_index( const void *A, const void *B ) {
+    return (int64_t)(*(const uint32_t *)A) - (int64_t)((const SRAColumn *)B)->idx;
+}
+
+static bool find_by_index(const Vector *vec, uint32_t idx, uint32_t *cndx) {
+    uint32_t found;
+    
+    if ( VectorFind(vec, &idx, &found, cmp_index ) != NULL ) {
+        *cndx = found;
+        return true;
+    }
+    return false;
+}
+
+/* OpenColumnWrite
+ *  open a column for write
+ *
+ *  "idx" [ OUT ] - return parameter for 1-based column index.
+ *
+ *  "col" [ OUT, NULL OKAY ] - optional return parameter for
+ *  newly opened column.
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving column name
+ *
+ *  "datatype" [ IN ] - NUL terminated string in ASCII
+ *   describing fully qualified column data type
+ */
+LIB_EXPORT rc_t CC SRATableOpenColumnWrite ( SRATable *self,
+    uint32_t *idx, SRAColumn **col, const char *name, const char *datatype )
+{
+    rc_t rc;
+    SRAColumn *rslt;
+    uint32_t ndx, cndx;
+    
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcOpening, rcSelf, rcNull);
+    
+    if (name == NULL || idx == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcOpening, rcParam, rcNull);
+    
+    *idx = 0;
+    
+    if (datatype && datatype[0])
+    {
+        SRADBG(("adding column (%s)%s\n", datatype, name));
+        rc = VCursorAddColumn(self->curs, &ndx, "(%s)%s", datatype, name);
+    }
+    else
+    {
+        SRADBG(("adding column %s\n", name));
+        rc = VCursorAddColumn(self->curs, &ndx, "%s", name);
+    }
+    
+    if (rc != 0)
+    {
+        /* it's okay if the column is already there
+           any other rc is a hard error */
+        if (GetRCState ( rc ) != rcExists)
+            return rc;
+        
+        if ( ! find_by_index(&self->wcol, ndx, &cndx) )
+        {
+            /* severe internal error */
+            return RC ( RC_MODULE, RC_TARGET, rcOpening, rcNoObj, rcNotFound );
+        }
+
+        /* get the uncounted reference to column from table */
+        rslt = VectorGet(&self->wcol, cndx);
+    }
+    else
+    {
+        VTypedecl type;
+        VTypedesc desc;
+        
+        rslt = malloc(sizeof *rslt );
+        if (rslt == NULL)
+            return RC(RC_MODULE, rcColumn, rcConstructing, rcMemory, rcExhausted);
+        
+        rc = VCursorDatatype(self->curs, ndx, &type, &desc);
+        if (rc == 0)
+        {
+            /* this object will sit uncounted within the table
+               when the table goes away, it will douse the columns
+               without regard to their reference count. see below */
+            KRefcountInit(&rslt->refcount, 0, "SRAColumn", "OpenColumnWrite", name);
+
+            /* the column has no reference to the table, so after this
+               there will only be an uncounted reference from table to column */
+            rslt->tbl = NULL;
+            rslt->idx = ndx;
+            rslt->read_only = false;
+            rslt->elem_bits = VTypedescSizeof(&desc);
+
+            rc = VectorAppend(&self->wcol, &cndx, rslt);
+        }
+
+        if ( rc != 0 )
+        {
+            free ( rslt );
+            return rc;
+        }
+    }
+
+    /* see if user wants a reference */
+    if ( col != NULL )
+    {
+        /* the first column reference exported will take
+           the refcount from zero to one */
+        SRAColumnAddRef ( rslt );
+
+        /* the first exported reference will need to be reflected
+           to the table. this will ensure that the table never tries
+           to whack its columns as long as they are held externally,
+           because the table itself will be kept alive. when the last
+           column reference is released, it will also release the table */
+        if ( rslt -> tbl == NULL )
+            rslt -> tbl = SRATableAttach ( self );
+
+        *col = rslt;
+    }
+
+    *idx = cndx + 1;
+    return rc;
+}
+
+static
+rc_t lookup_and_validate(SRATable *self, const SRAColumn **rslt, uint32_t idx, const void *base, bitsz_t offset, bitsz_t size) {
+    const SRAColumn *col;
+    
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcWriting, rcSelf, rcNull);
+    
+    col = VectorGet(&self->wcol, idx - 1);
+    if (col == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcWriting, rcParam, rcInvalid);
+    
+    if (size % col->elem_bits != 0)
+        return RC(RC_MODULE, RC_TARGET, rcWriting, rcParam, rcInvalid);
+    
+    if (offset % col->elem_bits != 0)
+        return RC(RC_MODULE, RC_TARGET, rcWriting, rcParam, rcInvalid);
+    
+    *rslt = col;
+    return 0;
+}
+
+/* SetIdxColumnDefault
+ *  give a default value for column
+ *
+ *  if no value gets written to a column within an open spot,
+ *  this value is substituted.
+ *
+ *  "idx" [ IN ] - 1-based column index
+ *
+ *  "base" [ IN ] and "offset" [ IN ] - pointer and bit offset
+ *  to start of row data
+ *
+ *  "size" [ IN ] - size in bits of row data
+ */
+LIB_EXPORT rc_t CC SRATableSetIdxColumnDefault ( SRATable *self,
+        uint32_t idx, const void *base, bitsz_t offset, bitsz_t size ) {
+    const SRAColumn *col;
+    rc_t rc;
+    
+    rc = lookup_and_validate(self, &col, idx, base, offset, size);
+    if (rc == 0)
+        rc = VCursorDefault(self->curs, col->idx, col->elem_bits, base, offset / col->elem_bits, size / col->elem_bits);
+    return rc;
+}
+
+
+/* WriteIdxColumn
+ *  write row data to an indexed column
+ *
+ *  "idx" [ IN ] - 1-based column index
+ *
+ *  "base" [ IN ] and "offset" [ IN ] - pointer and bit offset
+ *  to start of row data
+ *
+ *  "size" [ IN ] - size in bits of row data
+ */
+LIB_EXPORT rc_t CC SRATableWriteIdxColumn ( SRATable *self,
+        uint32_t idx, const void *base, bitsz_t offset, bitsz_t size ) {
+    const SRAColumn *col;
+    rc_t rc;
+    
+    rc = lookup_and_validate(self, &col, idx, base, offset, size);
+    if (rc == 0)
+        rc = VCursorWrite(self->curs, col->idx, col->elem_bits, base, offset / col->elem_bits, size / col->elem_bits);
+    return rc;
+}
+
+
+/* MetaFreeze
+ *  freezes current metadata revision
+ *  further modification will begin on a copy
+ */
+LIB_EXPORT rc_t CC SRATableMetaFreeze ( SRATable *self ) {
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcOpening, rcSelf, rcNull);
+    
+    return KMetadataFreeze(self->meta);
+}
+
+
+/* OpenMDataNode
+ *  open a metadata node
+ */
+LIB_EXPORT rc_t CC SRATableOpenMDataNodeUpdate ( SRATable *self, struct KMDataNode **node, const char *path, ... ) {
+    va_list va;
+    rc_t rc;
+    
+    va_start(va, path);
+    rc = SRATableVOpenMDataNodeUpdate(self, node, path, va);
+    va_end(va);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRATableVOpenMDataNodeUpdate ( SRATable *self, struct KMDataNode **node, const char *spec, va_list args ) {
+    rc_t rc;
+    char path[4096];
+    int n;
+    
+    if (self == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcOpening, rcSelf, rcNull);
+    if (spec == NULL)
+        return RC(RC_MODULE, RC_TARGET, rcOpening, rcParam, rcNull);
+    
+    n = vsnprintf(path, sizeof(path), spec, args);
+    if (n >= sizeof(path))
+        return RC(RC_MODULE, RC_TARGET, rcOpening, rcName, rcTooLong);
+    
+    rc = KMetadataOpenNodeUpdate(self->meta, node, "%s", path);
+    if (rc)
+    {
+        SRADBG(("failed to open table metadata node '%s' %R", path, rc));
+    }
+    return rc;
+}
+
+#define RD_COLVALUE(tbl, nm, var) \
+                SRATable_ReadColBack(tbl, nm, sizeof(var) * 8, (void*)&var, sizeof(var))
+
+static
+rc_t SRATable_ReadColBack(const VTable* tbl, const char* col_name, uint32_t elem_bits, void *buffer, uint32_t blen)
+{
+    rc_t rc = 0;
+    uint32_t idx;
+    const VCursor* curs = NULL;
+   
+    if( (rc = VTableCreateCursorRead(tbl, &curs)) == 0 &&
+        (rc = VCursorAddColumn(curs, &idx, "%s", col_name)) == 0 &&
+        (rc = VCursorOpen(curs)) == 0 ) {
+        uint32_t len;
+        rc = VCursorReadDirect(curs, 1, idx, elem_bits, buffer, blen, &len);
+    }
+    VCursorRelease(curs);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRATableBaseCount ( const SRATable *self, uint64_t *rslt )
+{
+    rc_t rc;
+
+    if ( rslt == NULL )
+        rc = RC ( rcSRA, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            RD_COLVALUE(self->vtbl, "BASE_COUNT", self->base_count);
+            *rslt = self->base_count;
+            return 0;
+        }
+        *rslt = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRATableSpotCount ( const SRATable *self, uint64_t *rslt )
+{
+    rc_t rc;
+
+    if ( rslt == NULL )
+        rc = RC ( rcSRA, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            RD_COLVALUE(self->vtbl, "SPOT_COUNT", self->spot_count);
+            *rslt = self->spot_count;
+            return 0;
+        }
+        *rslt = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRATableMinSpotId ( const SRATable *self, spotid_t *rslt )
+{
+    rc_t rc;
+
+    if ( rslt == NULL )
+        rc = RC ( rcSRA, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            RD_COLVALUE(self->vtbl, "MIN_SPOT_ID", self->min_spot_id);
+            *rslt = self->min_spot_id;
+            return 0;
+        }
+        *rslt = 0;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC SRATableMaxSpotId ( const SRATable *self, spotid_t *rslt )
+{
+    rc_t rc;
+
+    if ( rslt == NULL )
+        rc = RC ( rcSRA, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcSRA, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            RD_COLVALUE(self->vtbl, "MAX_SPOT_ID", self->max_spot_id);
+            *rslt = self->max_spot_id;
+            return 0;
+        }
+        *rslt = 0;
+    }
+    return rc;
+}
diff --git a/libs/sraxf/.gitignore b/libs/sraxf/.gitignore
new file mode 100644
index 0000000..c253038
--- /dev/null
+++ b/libs/sraxf/.gitignore
@@ -0,0 +1 @@
+*.def
diff --git a/libs/sraxf/Makefile b/libs/sraxf/Makefile
new file mode 100644
index 0000000..631dca9
--- /dev/null
+++ b/libs/sraxf/Makefile
@@ -0,0 +1,152 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/sraxf
+
+INT_LIBS = \
+	libsraxf \
+	libwsraxf
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(SRAXF_OBJ) \
+	$(WSRAXF_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(ALL_LIBS): makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(TARGDIR)/,$(ALL_LIBS))
+
+.PHONY: $(TARGDIR)/all $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# sra transform library
+#
+$(TARGDIR)/libsraxf: $(addprefix $(ILIBDIR)/libsraxf.,$(ILIBEXT))
+
+SRAXF_SRC = \
+	untyped \
+	v0-decompress-init \
+	v0-decompress \
+	v0-funcs \
+	bio-start \
+	dynamic-454-read-descriptor \
+	format-spot-name \
+	extract-name_coord \
+	tokenize-spot_name-454 \
+	tokenize-spot_name-illumina \
+	tokenize-spot_name-abi \
+	tokenize-spot_name-helicos \
+	tokenize-spot_name-ion-torrent \
+	tokenize-spot_name-generic-fastq \
+	color-from-dna \
+	dna-from-color \
+	spot-desc \
+	read-desc \
+	rotate \
+	swap \
+	denormalize \
+	normalize \
+	qual4_decode \
+	read-seg-from-readn \
+	rewrite-spot-name \
+	make-position \
+	process-position \
+	extract-coordinates \
+	fpcodec \
+	index_lookup \
+	varloc
+
+SRAXF_OBJ = \
+	$(addsuffix .$(LOBX),$(SRAXF_SRC))
+
+SRAXF_LIB = \
+	-dksrch \
+	-dvdb \
+	-dkdb \
+	-dklib \
+	-dm \
+	-dz
+
+$(ILIBDIR)/libsraxf.$(LIBX): $(SRAXF_OBJ)
+	$(LD) --slib -o $@ $^ $(SRAXF_LIB)
+
+
+#-------------------------------------------------------------------------------
+# sra transform update library
+#
+$(TARGDIR)/libwsraxf: $(addprefix $(ILIBDIR)/libwsraxf.,$(ILIBEXT))
+
+WSRAXF_SRC = \
+	$(SRAXF_SRC) \
+	extract-name_fmt \
+	extract-spot_name \
+	stats \
+	stats_quality \
+	qual4_encode
+
+WSRAXF_OBJ = \
+	$(addsuffix .$(LOBX),$(WSRAXF_SRC))
+
+WSRAXF_LIB = \
+	-dwvdb \
+	-dwkdb \
+	-dksrch \
+	-dklib \
+	-dm \
+	-dz
+
+$(ILIBDIR)/libwsraxf.$(LIBX): $(WSRAXF_OBJ)
+	$(LD) --slib -o $@ $^ $(WSRAXF_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/sraxf/bio-start.c b/libs/sraxf/bio-start.c
new file mode 100644
index 0000000..6d563bd
--- /dev/null
+++ b/libs/sraxf/bio-start.c
@@ -0,0 +1,197 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+
+typedef struct self_t {
+    bool inclusive;
+} self_t;
+
+static
+void CC sraxf_bio_start_free_wrapper( void *ptr )
+{
+    free( ptr );
+}
+
+/* INSDC:coord:zero NCBI:SRA:bio_start #1
+ *   ( INSDC:coord:zero read_start, INSDC:SRA:xread_type read_type );
+ *
+ *  searches through read_type vector
+ *  returns the 0-based starting coordinate of first biological read
+ *
+ *  "read_start" [ DATA ] - vector of read start coordinates
+ *
+ *  "read_type" [ DATA ] - vector of read types
+ */
+static
+rc_t CC sra_bio_start ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    const uint8_t *src = argv [ 1 ] . u . data . base;
+    uint32_t i;
+    uint64_t count = argv [ 1 ] . u . data . elem_count;
+    for ( i = 0, src += argv [ 1 ] . u . data . first_elem; i < count; ++ i )
+    {
+        if ( ( src [ i ] & SRA_READ_TYPE_BIOLOGICAL ) != 0 )
+        {
+            rc_t rc;
+            int32_t bio_start;
+            KDataBuffer *dst = rslt -> data;
+
+            assert ( argv [ 0 ] . u . data . elem_count == argv [ 1 ] . u . data . elem_count );
+            assert ( argv [ 0 ] . u . data . elem_bits == sizeof bio_start * 8 );
+            bio_start = ( ( const int32_t* ) argv [ 0 ] . u . data . base )
+                [ argv [ 0 ] . u . data . first_elem + i ];
+
+            if ( dst -> elem_bits != sizeof bio_start * 8 )
+            {
+                rc = KDataBufferCast ( dst, dst, sizeof bio_start * 8, true );
+                if ( rc != 0 )
+                    return rc;
+            }
+
+            if ( dst -> elem_count != 1 )
+            {
+                rc = KDataBufferResize ( dst, 1 );
+                if ( rc != 0 )
+                    return rc;
+            }
+
+            * ( int32_t* ) dst -> base = bio_start;
+            rslt -> elem_count = 1;
+            return 0;
+        }
+    }
+
+    return RC ( rcSRA, rcFunction, rcSearching, rcData, rcNotFound );
+}
+
+VTRANSFACT_IMPL( NCBI_SRA_bio_start, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> u . rf = sra_bio_start;
+    rslt -> variant = vftRow;
+    return 0;
+}
+
+/* INSDC:coord:zero NCBI:SRA:bio_end #1 < bool inclusive >
+ *    ( INSDC:coord:zero read_start, INSDC:SRA:xread_type read_type, INSDC:coord:len read_len );
+ *
+ *  searcehes through read_type vector
+ *  returns the 0 based ending coording (either inclusive or exclusive) of last
+ *  biological read
+ *
+ *  "read_start" [ DATA ] - vector of read start coordinates
+ *
+ *  "read_type" [ DATA ] - vector of read types
+ *
+ *  "read_len" [ DATA ] - vector of read lengths
+ */
+static
+rc_t CC sra_bio_end ( void *Self, const VXformInfo *info, int64_t row_id,
+                       VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    const uint8_t *src = argv [ 1 ] . u . data . base;
+    int64_t i;
+    uint64_t count = argv [ 1 ] . u . data . elem_count;
+    const self_t *self = (const self_t *)Self;
+    bool inclusive = self->inclusive;
+    
+    for ( i = count - 1, src += argv [ 1 ] . u . data . first_elem; i >= 0; -- i )
+    {
+        int32_t read_len = ( ( const int32_t* ) argv [ 2 ] . u . data . base )
+            [ argv [ 2 ] . u . data . first_elem + i ];
+        
+        if ( read_len > 0 && ( src [ i ] & SRA_READ_TYPE_BIOLOGICAL ) != 0 )
+        {
+            rc_t rc;
+            int32_t bio_end;
+            KDataBuffer *dst = rslt -> data;
+            
+            assert ( argv [ 0 ] . u . data . elem_count == argv [ 1 ] . u . data . elem_count );
+            assert ( argv [ 0 ] . u . data . elem_count == argv [ 2 ] . u . data . elem_count );
+            assert ( argv [ 0 ] . u . data . elem_bits == sizeof bio_end * 8 );
+            assert ( argv [ 0 ] . u . data . elem_bits == argv [ 2 ] . u . data . elem_bits );
+            
+            bio_end = ( ( const int32_t* ) argv [ 0 ] . u . data . base )
+                [ argv [ 0 ] . u . data . first_elem + i ];
+            bio_end += read_len;
+            
+            if ( dst -> elem_bits != sizeof bio_end * 8 )
+            {
+                rc = KDataBufferCast ( dst, dst, sizeof bio_end * 8, true );
+                if ( rc != 0 )
+                    return rc;
+            }
+            
+            if ( dst -> elem_count != 1 )
+            {
+                rc = KDataBufferResize ( dst, 1 );
+                if ( rc != 0 )
+                    return rc;
+            }
+            
+            * ( int32_t* ) dst -> base = inclusive ? (bio_end - 1) : bio_end;
+            rslt -> elem_count = 1;
+            return 0;
+        }
+    }
+    
+    return RC ( rcSRA, rcFunction, rcSearching, rcData, rcNotFound );
+}
+
+VTRANSFACT_IMPL( NCBI_SRA_bio_end, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+                                                VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    self_t *self;
+    bool inclusive;
+    
+    assert ( cp->argc == 1 );
+    assert ( cp->argv[0].desc.domain == vtdBool );
+    assert ( cp->argv[0].count == 1 );
+    inclusive = cp->argv[0].data.b[0];
+    
+    self = malloc ( sizeof ( *self ));
+    if ( !self )
+    {
+        return RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    }
+    
+    self -> inclusive = inclusive;
+    
+    rslt -> self = self;
+    rslt -> whack = sraxf_bio_start_free_wrapper;
+    rslt -> u . rf = sra_bio_end;
+    rslt -> variant = vftRow;
+    return 0;
+}
diff --git a/libs/sraxf/color-from-dna.c b/libs/sraxf/color-from-dna.c
new file mode 100644
index 0000000..435985c
--- /dev/null
+++ b/libs/sraxf/color-from-dna.c
@@ -0,0 +1,151 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+static
+void color_from_dna(uint8_t csbin[], const uint8_t dnabin[], size_t n, uint8_t primer, const uint8_t conversion_matrix[]) {
+    uint8_t st;
+    size_t i;
+	
+    switch (primer) {
+    case 'A':
+        st = 0;
+        break;
+    case 'C':
+        st = 1;
+        break;
+    case 'G':
+        st = 2;
+        break;
+    case 'T':
+        st = 3;
+        break;
+    default:
+        st = 4;
+        break;
+    }
+	
+    for (i = 0; i != n; ++i) {
+        uint8_t tr = dnabin[i];
+		
+        csbin[i] = conversion_matrix[st * 5 + tr];
+        st = tr;
+    }
+}
+
+static
+rc_t CC color_from_dna_drvr ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint8_t *csbin;
+
+    uint32_t i;
+    uint64_t row_len = argv [ 0 ] . u . data . elem_count;
+    uint64_t out_len, nreads = argv [ 1 ] . u . data . elem_count;
+
+    const uint8_t *dnabin = argv [ 0 ] . u . data . base;
+    const uint32_t *read_start = argv [ 1 ] . u . data . base;
+    const uint32_t *read_len = argv [ 2 ] . u . data . base;
+    const uint8_t *cskey = argv [ 3 ] . u . data . base;
+    const uint8_t *cmatrx = argv [ 4 ] . u . data . base;
+    
+    assert(argv[0].u.data.elem_bits == 8);
+    assert(argv[1].u.data.elem_bits == 32);
+    assert(argv[2].u.data.elem_bits == 32);
+    assert(argv[3].u.data.elem_bits == 8);
+    assert(argv[4].u.data.elem_bits == 8);
+
+    assert(argv[2].u.data.elem_count == nreads);
+    assert(argv[3].u.data.elem_count == nreads);
+
+    dnabin += argv [ 0 ] . u . data . first_elem;
+    read_start += argv [ 1 ] . u . data . first_elem;
+    read_len += argv [ 2 ] . u . data . first_elem;
+    cskey += argv [ 3 ] . u . data . first_elem;
+    cmatrx += argv [ 4 ] . u . data . first_elem;
+
+    /* safety check that read structure is within bounds */
+    for ( i = 0, out_len = 0; i < nreads; ++i )
+    {
+        if ( read_start [ i ] + read_len [ i ] > row_len )
+            return RC ( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+        out_len += read_len [ i ];
+    }
+    
+    /* resize output row for the total number of reads */    
+    rslt -> data -> elem_bits = 8;
+    rc = KDataBufferResize ( rslt -> data, out_len );
+    if ( rc != 0 )
+        return rc;
+
+    /* huh? */
+    rslt -> data -> bit_offset = 0;
+
+    rslt -> elem_count = out_len;
+    csbin = rslt -> data -> base;
+
+    for ( i = 0, out_len = 0; i < nreads; ++i )
+    {
+        color_from_dna ( & csbin [ out_len ],
+            & dnabin [ read_start [ i ] ], read_len [ i ],
+            cskey [ i ], cmatrx );
+
+        out_len += read_len [ i ];
+    }
+    
+    return 0;
+}
+
+/* 
+ * function
+ * INSDC:color:bin NCBI:color_from_dna #1 ( INSDC:dna:bin dna_bin,
+ *     INSDC:coord:zero read_start, U32 read_len,
+ *     INSDC:dna:text cs_key, U8 color_matrix )
+ */
+VTRANSFACT_IMPL ( NCBI_color_from_dna, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = color_from_dna_drvr;
+    rslt->variant = vftRow;
+    
+    return 0;
+}
diff --git a/libs/sraxf/denormalize.c b/libs/sraxf/denormalize.c
new file mode 100644
index 0000000..68acb2a
--- /dev/null
+++ b/libs/sraxf/denormalize.c
@@ -0,0 +1,231 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+typedef void (*denorm_f)(void *dst, const void *src, const void *Cntrl, uint64_t vec_count);
+typedef struct self_t {
+    denorm_f f;
+} self_t;
+
+#define DENORM_0(A, B) do { (A).data[0] = (B).data[0]; (A).data[1] = (B).data[0] + (B).data[1]; (A).data[2] = (B).data[2]; (A).data[3] = (B).data[3]; } while (0)
+#define DENORM_1(A, B) A = B
+#define DENORM_2(A, B) do { (A).data[0] = (B).data[0]; (A).data[1] = (B).data[1]; (A).data[2] = (B).data[2]; (A).data[3] = (B).data[2] + (B).data[3]; } while (0)
+#define DENORM_3(A, B) A = B
+
+#define FUNC(VALTYPE) F_ ## VALTYPE
+
+#define FUNC_DEF(VALTYPE) \
+static void FUNC(VALTYPE)(void *Dst, const void *Src, const void *Cntrl, uint64_t count) { \
+    typedef struct { VALTYPE data[4]; } data4_t; \
+    data4_t *dst = (data4_t *)Dst; \
+    const data4_t *src = (const data4_t *)Src; \
+    const uint8_t *cntrl = (const uint8_t *)Cntrl; \
+    uint64_t i; \
+    \
+    for (i = 0; i != count; ++i) { \
+        switch(cntrl[i]) { \
+        default: \
+        case 0: \
+            DENORM_0(dst[i], src[i]); \
+            break; \
+        case 1: \
+            DENORM_1(dst[i], src[i]); \
+            break; \
+        case 2: \
+            DENORM_2(dst[i], src[i]); \
+            break; \
+        case 3: \
+            DENORM_3(dst[i], src[i]); \
+            break; \
+        }\
+    } \
+}
+
+FUNC_DEF(float)
+FUNC_DEF(double)
+FUNC_DEF(uint8_t)
+FUNC_DEF(uint16_t)
+FUNC_DEF(uint32_t)
+FUNC_DEF(uint64_t)
+FUNC_DEF(int8_t)
+FUNC_DEF(int16_t)
+FUNC_DEF(int32_t)
+FUNC_DEF(int64_t)
+
+static
+rc_t CC denormal_drvr (
+                void *Self,
+                const VXformInfo *info,
+                int64_t row_id,
+                VRowResult *rslt,
+                uint32_t argc,
+                const VRowData argv []
+) {
+    rc_t rc = 0;
+    const void *src;
+    const void *cntrl;
+    const self_t *self = (const self_t *)Self;
+    
+    assert(argv[0].u.data.elem_bits % 8 == 0);
+    assert(argv[1].u.data.elem_bits % 8 == 0);
+    
+    src   = &((const uint8_t *)argv[0].u.data.base)[(argv[0].u.data.first_elem * argv[0].u.data.elem_bits) / 8];
+    cntrl = &((const uint8_t *)argv[1].u.data.base)[(argv[1].u.data.first_elem * argv[1].u.data.elem_bits) / 8];
+    
+    rslt->elem_bits = rslt->data->elem_bits = argv[0].u.data.elem_bits;
+    rc = KDataBufferResize(rslt->data, argv[0].u.data.elem_count);
+    if (rc)
+        return rc;
+    rslt->elem_count = rslt->data->elem_count;
+    rslt->data->bit_offset = 0;
+    
+    self->f(rslt->data->base, src, cntrl, rslt->elem_count);
+    
+    return 0;
+}
+
+static
+void CC sraxf_denormalize_free_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* 
+ * function < type T > T [ 4 ] NCBI:SRA:denormalize #1 ( T [ 4 ] intensities, U8 called );
+ */
+VTRANSFACT_IMPL ( NCBI_SRA_denormalize, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    self_t *self;
+    
+    switch (info->fdesc.desc.domain) {
+    case vtdInt:
+    case vtdUint:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+        case 16:
+        case 32:
+        case 64:
+            break;
+        default:
+            return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+            break;
+        }
+        break;
+    case vtdFloat:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 32:
+        case 64:
+            break;
+        default:
+            return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+            break;
+        }
+        break;
+    default:
+        return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+        break;
+    }
+    
+    self = malloc(sizeof(*self));
+    if (self) {
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                self->f = FUNC(int8_t);
+                break;
+            case 16:
+                self->f = FUNC(int16_t);
+                break;
+            case 32:
+                self->f = FUNC(int32_t);
+                break;
+            case 64:
+                self->f = FUNC(int64_t);
+                break;
+            default:
+                break;
+            }
+            break;
+        case vtdUint:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                self->f = FUNC(uint8_t);
+                break;
+            case 16:
+                self->f = FUNC(uint16_t);
+                break;
+            case 32:
+                self->f = FUNC(uint32_t);
+                break;
+            case 64:
+                self->f = FUNC(uint64_t);
+                break;
+            default:
+                break;
+            }
+            break;
+        case vtdFloat:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 32:
+                self->f = FUNC(float);
+                break;
+            case 64:
+                self->f = FUNC(double);
+                break;
+            default:
+                break;
+            }
+            break;
+        default:
+            break;
+        }
+        
+        rslt->self = self;
+        rslt->whack = sraxf_denormalize_free_wrapper;
+        rslt->u.rf = denormal_drvr;
+        rslt->variant = vftRow;
+        
+        return 0;
+    }
+    return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
diff --git a/libs/sraxf/dna-from-color.c b/libs/sraxf/dna-from-color.c
new file mode 100644
index 0000000..7caee94
--- /dev/null
+++ b/libs/sraxf/dna-from-color.c
@@ -0,0 +1,150 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+static
+void dna_from_color(uint8_t dnabin[], const uint8_t csbin[], size_t n, uint8_t primer, const uint8_t conversion_matrix[]) {
+    uint8_t st;
+    size_t i;
+	
+    switch (primer) {
+    case 'A':
+        st = 0;
+        break;
+    case 'C':
+        st = 1;
+        break;
+    case 'G':
+        st = 2;
+        break;
+    case 'T':
+        st = 3;
+        break;
+    default:
+        st = 4;
+        break;
+    }
+	
+    for (i = 0; i != n && st !=4; ++i) { /*** interrupt translation after the first ambiguity in color space ***/
+        uint8_t tr = csbin[i];
+		
+        st = dnabin[i] = conversion_matrix[st * 5 + tr];
+    }
+    if(i<n) memset(dnabin+i,4,n-i); /*** translation was interrupted - the remainder is ambiguity in base space ***/
+}
+
+static
+rc_t CC dna_from_color_drvr ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint8_t *dnabin;
+
+    uint32_t i, row_len = argv [ 0 ] . u . data . elem_count;
+    uint32_t out_len, nreads = argv [ 1 ] . u . data . elem_count;
+
+    const uint8_t *csbin = argv [ 0 ] . u . data . base;
+    const uint32_t *read_start = argv [ 1 ] . u . data . base;
+    const uint32_t *read_len = argv [ 2 ] . u . data . base;
+    const uint8_t *cskey = argv [ 3 ] . u . data . base;
+    const uint8_t *cmatrx = argv [ 4 ] . u . data . base;
+    
+    assert(argv[0].u.data.elem_bits == 8);
+    assert(argv[1].u.data.elem_bits == 32);
+    assert(argv[2].u.data.elem_bits == 32);
+    assert(argv[3].u.data.elem_bits == 8);
+    assert(argv[4].u.data.elem_bits == 8);
+
+    assert(argv[2].u.data.elem_count == nreads);
+    assert(argv[3].u.data.elem_count == nreads);
+
+    csbin += argv [ 0 ] . u . data . first_elem;
+    read_start += argv [ 1 ] . u . data . first_elem;
+    read_len += argv [ 2 ] . u . data . first_elem;
+    cskey += argv [ 3 ] . u . data . first_elem;
+    cmatrx += argv [ 4 ] . u . data . first_elem;
+
+    /* safety check that read structure is within bounds */
+    for ( i = out_len = 0; i < nreads; ++i )
+    {
+        if ( read_start [ i ] + read_len [ i ] > row_len )
+            return RC ( rcXF, rcFunction, rcExecuting, rcData, rcInvalid );
+        out_len += read_len [ i ];
+    }
+    
+    /* resize output row for the total number of reads */    
+    rslt -> data -> elem_bits = 8;
+    rc = KDataBufferResize ( rslt -> data, out_len );
+    if ( rc != 0 )
+        return rc;
+
+    /* huh? */
+    rslt -> data -> bit_offset = 0;
+
+    rslt -> elem_count = out_len;
+    dnabin = rslt -> data -> base;
+
+    for ( i = out_len = 0; i < nreads; ++i )
+    {
+        dna_from_color ( & dnabin [ out_len ],
+            & csbin [ read_start [ i ] ], read_len [ i ],
+            cskey [ i ], cmatrx );
+
+        out_len += read_len [ i ];
+    }
+    
+    return 0;
+}
+
+/* 
+ * function
+ * INSDC:color:bin NCBI:dna_from_color #1 ( INSDC:dna:bin dna_bin,
+ *     INSDC:coord:zero read_start, U32 read_len,
+ *     INSDC:dna:text cs_key, U8 color_matrix )
+ */
+VTRANSFACT_IMPL ( NCBI_dna_from_color, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = dna_from_color_drvr;
+    rslt->variant = vftRow;
+    
+    return 0;
+}
diff --git a/libs/sraxf/dynamic-454-read-descriptor.c b/libs/sraxf/dynamic-454-read-descriptor.c
new file mode 100644
index 0000000..2520eed
--- /dev/null
+++ b/libs/sraxf/dynamic-454-read-descriptor.c
@@ -0,0 +1,303 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <kdb/index.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <search/grep.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* dynamic_read_desc
+ *  uses inputs to determine read type and segmentation
+ *
+ *  "spot" [ DATA ] - bases for entire spot
+ *
+ *  "key" [ DATA, CONTROL ] - bases for key sequence. for version 1,
+ *  the first base following key is taken as biological start
+ *
+ *  "linker" [ DATA, CONTROL, OPTIONAL ] - if present, is used to separate
+ *  all bases following "key" into mate pair biological reads
+ *
+ *  returns a trio for each identified read, with read type, start and length
+ */
+enum { dyn_read_type, dyn_read_start, dyn_read_len };
+
+typedef uint32_t dynamic_read_desc [ 3 ];
+
+static
+rc_t CC dynamic_read_desc_static ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    dynamic_read_desc *p;
+    KDataBuffer *dst = rslt -> data;
+
+    /* severe error if adapter is longer than spot */
+    if ( argv [ 0 ] . u . data . elem_count < argv [ 1 ] . u . data . elem_count )
+        return RC ( rcSRA, rcFunction, rcExecuting, rcData, rcCorrupt );
+
+    /* the buffer should have already been given the correct element size */
+    if ( dst -> elem_bits != 32 * 3 )
+    {
+        rc = KDataBufferCast ( dst, dst, 32 * 3, true );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* we always produce 2 reads */
+    if ( dst -> elem_count != 2 )
+    {
+        rc = KDataBufferResize ( dst, 2 );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    p = dst -> base;
+
+    /* adapter */
+    p [ 0 ] [ dyn_read_type ] = SRA_READ_TYPE_TECHNICAL;
+    p [ 0 ] [ dyn_read_start ] = 0;
+    assert(argv [ 1 ] . u . data . elem_count >> 32 == 0);
+    p [ 0 ] [ dyn_read_len ] = (uint32_t)argv [ 1 ] . u . data . elem_count;
+
+    /* fragment */
+    p [ 1 ] [ dyn_read_type ] = SRA_READ_TYPE_BIOLOGICAL;
+    p [ 1 ] [ dyn_read_start ] = p [ 0 ] [ dyn_read_len ];
+    assert(argv [ 0 ] . u . data . elem_count >> 32 == 0);
+    p [ 1 ] [ dyn_read_len ] = (uint32_t)(argv [ 0 ] . u . data . elem_count) - p [ 0 ] [ dyn_read_len ];
+
+    rslt -> elem_count = 2;
+    return 0;
+}
+
+
+/* dynamic_read_desc_with_linker
+ */
+typedef struct linker_agrep linker_agrep;
+struct linker_agrep
+{
+    /* I suspect this should be unsigned... */
+    int32_t edit_distance;
+};
+
+int32_t debug_callback(void *cbinfo, AgrepMatch *match, AgrepContinueFlag *cont)
+{
+    printf("Match: pos %d len %d score %d\n", match->position, match->length,
+           match->score);
+    return 0;
+}
+
+
+static
+rc_t CC dynamic_read_desc_with_linker ( void *xself, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    dynamic_read_desc *p;
+    KDataBuffer *dst = rslt -> data;
+    const linker_agrep *self = ( const void* ) xself;
+
+    AgrepMatch match;
+    int32_t found;
+    AgrepFlags agrepflags;
+    Agrep *agrep;
+    /* AgrepCallArgs args; */
+    
+    const char *agreppattern;
+    char buf[4096];
+    const char *text;
+    uint32_t textlen;
+
+    /* severe error if adapter is longer than spot */
+    if ( argv [ 0 ] . u . data . elem_count < argv [ 1 ] . u . data . elem_count )
+        return RC ( rcSRA, rcFunction, rcExecuting, rcData, rcCorrupt );
+
+    /* the buffer should have already been given the correct element size */
+    if ( dst -> elem_bits != 32 * 3 )
+    {
+        rc = KDataBufferCast ( dst, dst, 32 * 3, true );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* we always produce 4 reads for when the linker is present */
+    if ( dst -> elem_count != 4 )
+    {
+        rc = KDataBufferResize ( dst, 4 );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* TBD - a mechanism for detecting when this has not changed
+       since typically it will be identical for every row in a table
+       but not necessarily so */
+    agreppattern = argv[2].u.data.base;
+    agreppattern += argv[2].u.data.first_elem; 
+    textlen = (uint32_t)string_copy(buf, sizeof buf, agreppattern, argv[2].u.data.elem_count);
+    if ( textlen >= sizeof buf )
+        return RC ( rcSRA, rcFunction, rcExecuting, rcData, rcExcessive );
+
+    text = argv[0].u.data.base;
+    text += argv[0].u.data.first_elem;
+
+    assert(argv[0].u.data.elem_count >> 32 == 0);
+    textlen = (uint32_t)argv[0].u.data.elem_count;
+
+    text += argv[1].u.data.elem_count;
+    textlen -= argv[1].u.data.elem_count;
+
+    agrepflags = AGREP_TEXT_EXPANDED_2NA 
+        | AGREP_PATTERN_4NA
+        | AGREP_EXTEND_BETTER
+        | AGREP_LEFT_MAINTAIN_SCORE
+        | AGREP_ANYTHING_ELSE_IS_N;
+
+    /* This might fail due to size restrictions. */
+    rc = AgrepMake(&agrep, agrepflags | AGREP_ALG_MYERS, buf);
+    if (rc == 0) {
+        /* fprintf(stderr, "Using myers.\n"); */
+    } else {
+        rc = AgrepMake(&agrep, agrepflags | AGREP_ALG_MYERS_UNLTD, buf);
+        /* Try one more time. */
+        if (rc) {
+            rc = AgrepMake(&agrep, agrepflags | AGREP_ALG_DP, buf);
+        }
+        if (rc)
+            return rc;
+    }
+
+    found = AgrepFindBest(agrep, self->edit_distance, text, textlen, &match);
+
+    if (found) {
+
+        p = dst -> base;
+        
+        /* adapter */
+        p [ 0 ] [ dyn_read_type ] = SRA_READ_TYPE_TECHNICAL;
+        p [ 0 ] [ dyn_read_start ] = 0;
+        assert(argv [ 1 ] . u . data . elem_count >> 32 == 0);
+        p [ 0 ] [ dyn_read_len ] = (uint32_t)argv [ 1 ] . u . data . elem_count;
+        
+        /* fragment */
+        p [ 1 ] [ dyn_read_type ] = SRA_READ_TYPE_BIOLOGICAL;
+        p [ 1 ] [ dyn_read_start ] = (uint32_t)argv [ 1 ] . u . data . elem_count;
+        p [ 1 ] [ dyn_read_len ] = match.position;
+
+        /* linker */
+        p [ 2 ] [ dyn_read_type ] = SRA_READ_TYPE_TECHNICAL;
+        p [ 2 ] [ dyn_read_start ] = match.position + (uint32_t)argv[1].u.data.elem_count;
+        p [ 2 ] [ dyn_read_len ] = match.length;
+        
+        /* fragment */
+        p [ 3 ] [ dyn_read_type ] = SRA_READ_TYPE_BIOLOGICAL;
+        p [ 3 ] [ dyn_read_start ] = match.position + match.length + (uint32_t)argv[1].u.data.elem_count;
+        p [ 3 ] [ dyn_read_len ] = (uint32_t)argv [ 0 ] . u . data . elem_count - match.position - match.length - (uint32_t)argv[1].u.data.elem_count;
+        
+        rslt -> elem_count = 4;
+
+    } else {
+
+        
+        p = dst -> base;
+        
+        /* adapter */
+        p [ 0 ] [ dyn_read_type ] = SRA_READ_TYPE_TECHNICAL;
+        p [ 0 ] [ dyn_read_start ] = 0;
+        assert(argv [ 1 ] . u . data . elem_count >> 32 == 0);
+        p [ 0 ] [ dyn_read_len ] = (uint32_t)argv [ 1 ] . u . data . elem_count;
+        
+        /* fragment */
+        p [ 1 ] [ dyn_read_type ] = SRA_READ_TYPE_BIOLOGICAL;
+        p [ 1 ] [ dyn_read_start ] = (uint32_t)argv [ 1 ] . u . data . elem_count;
+        p [ 1 ] [ dyn_read_len ] = (uint32_t)argv [ 0 ] . u . data . elem_count - (uint32_t)argv [ 1 ] . u . data . elem_count;
+
+        /* linker */
+        p [ 2 ] [ dyn_read_type ] = SRA_READ_TYPE_TECHNICAL;
+        p [ 2 ] [ dyn_read_start ] = (uint32_t)argv [ 0 ] . u . data . elem_count;
+        p [ 2 ] [ dyn_read_len ] = 0;
+        
+        /* fragment */
+        p [ 3 ] [ dyn_read_type ] = SRA_READ_TYPE_BIOLOGICAL;
+        p [ 3 ] [ dyn_read_start ] = (uint32_t)argv [ 0 ] . u . data . elem_count;
+        p [ 3 ] [ dyn_read_len ] = 0;
+
+        rslt -> elem_count = 4;
+
+    }
+
+    AgrepWhack(agrep);
+
+    return 0;
+}
+
+static
+void CC dyn_454_read_desc_free_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/*
+ extern function U32 [ 3 ] NCBI:SRA:_454_:dynamic_read_desc #1 < * U32 edit_distance >
+    ( NCBI:SRA:_454_:drdparam_set spot, NCBI:SRA:_454_:drdparam_set key * NCBI:SRA:_454_:drdparam_set linker );
+ */
+VTRANSFACT_IMPL ( NCBI_SRA__454__dynamic_read_desc, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    linker_agrep *xself;
+
+    if ( dp -> argc == 2 )
+    {
+        rslt -> u . ndf = dynamic_read_desc_static;
+        rslt -> variant = vftNonDetRow;
+        return 0;
+    }
+
+    xself = malloc ( sizeof * xself );
+    if ( xself == NULL )
+        return RC ( rcSRA, rcFunction, rcConstructing, rcMemory, rcExhausted );
+
+    /* NB - this should be changed to unsigned */
+    xself -> edit_distance = 5;
+    if ( cp -> argc == 1 )
+        xself -> edit_distance = cp -> argv [ 0 ] . data . i32 [ 0 ];
+
+    rslt -> self = xself;
+    rslt -> whack = dyn_454_read_desc_free_wrapper;
+    rslt -> u . rf = dynamic_read_desc_with_linker;
+    rslt -> variant = vftRow;
+    return 0;
+}
diff --git a/libs/sraxf/extract-coordinates.c b/libs/sraxf/extract-coordinates.c
new file mode 100644
index 0000000..40d4a17
--- /dev/null
+++ b/libs/sraxf/extract-coordinates.c
@@ -0,0 +1,354 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+
+#define SLX_COORD_LEN 10
+
+static
+int non_braindead_atoi ( const char *start, const char *end )
+{
+    int val = start [ 0 ] - '0';
+    uint32_t i, count = (uint32_t)( end - start );
+    for ( i = 1; i < count; ++ i )
+    {
+        val *= 10;
+        val += start [ i ] - '0';
+    }
+    return val;
+}
+
+static
+int scan_hex ( const char *str, int count )
+{
+    int i, val = str [ 0 ] - '0';
+    if ( val > 9 )
+        val = toupper ( str [ 0 ] ) - 'A' + 10;
+    for ( i = 1; i < count; ++ i )
+    {
+        int d = str [ i ] - '0';
+        if ( d > 9 )
+            d = toupper ( str [ i ] ) - 'A' + 10;
+        val = val << 4 | d;
+    }
+    return val;
+}
+
+static
+void common_extract_coordinates ( const char *skey, uint32_t slen, uint32_t coords [ 4 ] )
+{
+    unsigned int a, b, c, d;
+    uint32_t i, j, count = slen;
+
+    /* scan hex digits */
+    for ( i = count; i > 0; )
+    {
+        if ( ! isxdigit ( skey [ -- i ] ) )
+            break;
+    }
+
+    /* detect newer format */
+    if ( count - i < ( SLX_COORD_LEN - 1 ) )
+    {
+        const char *end = skey + count;
+
+        /* new format */
+        for ( d = 0, j = 0, i = count; i > 0; )
+        {
+            if ( ! isdigit ( skey [ -- i ] ) )
+            {
+                j = i + 1;
+                break;
+            }
+        }
+        d = non_braindead_atoi ( & skey [ j ], end );
+        for ( c = 0, j = 0; i > 0; )
+        {
+            if ( ! isdigit ( skey [ -- i ] ) )
+            {
+                j = i + 1;
+                break;
+            }
+        }
+        c = atoi ( & skey [ j ] );
+        for ( b = 0, j = 0; i > 0; )
+        {
+            if ( ! isdigit ( skey [ -- i ] ) )
+            {
+                j = i + 1;
+                break;
+            }
+        }
+        b = atoi ( & skey [ j ] );
+        for ( a = 0, j = 0; i > 0; )
+        {
+            if ( ! isdigit ( skey [ -- i ] ) )
+            {
+                j = i + 1;
+                break;
+            }
+        }
+        a = atoi ( & skey [ j ] );
+        if ( j > 0 )
+        {
+            if ( i > 0 )
+                -- i;
+            while ( isalpha ( skey [ i ] ) )
+                ++ i;
+        }
+    }
+    else
+    {
+        /* original format */
+        a = scan_hex ( skey, 1 );
+        b = scan_hex ( & skey [ 1 ], 3 );
+        c = scan_hex ( & skey [ 4 ], 3 );
+        d = scan_hex ( & skey [ 7 ], 3 );
+        if ( count > SLX_COORD_LEN )
+        {
+            i = count - SLX_COORD_LEN;
+        }
+    }
+
+    coords [ 3 ] = a;
+    coords [ 2 ] = b;
+    coords [ 1 ] = c;
+    coords [ 0 ] = d;
+}
+
+static
+rc_t CC illumina_extract_coordinates ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint32_t *out;
+    KDataBuffer *dst = rslt -> data;
+
+    uint32_t coords [ 4 ];
+
+    const char *skey = argv [ 0 ] . u . data . base;
+    uint32_t i, count = argv [ 0 ] . u . data . elem_count;
+    skey += argv [ 0 ] . u . data . first_elem;
+
+    common_extract_coordinates ( skey, count, coords );
+
+    /* count the number of output coordinates */
+    count = ( uint32_t ) ( size_t ) self;
+
+    /* produce however many elements are requested */
+    dst -> elem_bits = 32 * count;
+    rc = KDataBufferResize ( dst, 1 );
+    if ( rc != 0 )
+        return rc;
+
+    out = dst -> base;
+    switch ( count )
+    {
+    default:
+        for ( i = 4; i < count; ++ i )
+            out [ i ] = 0;
+    case 4:
+        out [ 3 ] = coords [ 3 ];
+    case 3:
+        out [ 2 ] = coords [ 2 ];
+    case 2:
+        out [ 1 ] = coords [ 1 ];
+    case 1:
+        out [ 0 ] = coords [ 0 ];
+    case 0:
+        break;
+    }
+
+    rslt -> elem_count = 1;
+
+    return 0;
+}
+
+static
+rc_t CC abi_extract_coordinates ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint32_t *out;
+    KDataBuffer *dst = rslt -> data;
+
+    uint32_t coords [ 4 ];
+
+    const char *skey = argv [ 0 ] . u . data . base;
+    uint32_t i, count = argv [ 0 ] . u . data . elem_count;
+    skey += argv [ 0 ] . u . data . first_elem;
+
+    common_extract_coordinates ( skey, count, coords );
+
+    /* count the number of output coordinates */
+    count = ( uint32_t ) ( size_t ) self;
+
+    /* produce however many elements are requested */
+    dst -> elem_bits = 32 * count;
+    rc = KDataBufferResize ( dst, 1 );
+    if ( rc != 0 )
+        return rc;
+
+    out = dst -> base;
+    switch ( count )
+    {
+    default:
+        for ( i = 3; i < count; ++ i )
+            out [ i ] = 0;
+    case 3:
+        out [ 2 ] = coords [ 2 ];
+    case 2:
+        out [ 1 ] = coords [ 1 ];
+    case 1:
+        out [ 0 ] = coords [ 0 ];
+    case 0:
+        break;
+    }
+
+    rslt -> elem_count = 1;
+
+    return 0;
+}
+
+static
+rc_t CC _454_extract_coordinates ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint32_t *out;
+    unsigned int a, b, c;
+    KDataBuffer *dst = rslt -> data;
+
+    const char *skey = argv [ 0 ] . u . data . base;
+    uint32_t i, count = argv [ 0 ] . u . data . elem_count;
+    skey += argv [ 0 ] . u . data . first_elem;
+
+    /* advance skey to coordinates */
+    if ( count < 7 )
+        return RC ( rcSRA, rcName, rcParsing, rcString, rcInsufficient );
+    skey += count - 7;
+
+    /* get region */
+    if ( ! isdigit ( skey [ 0 ] ) || ! isdigit ( skey [ 1 ] ) )
+        return RC ( rcSRA, rcName, rcParsing, rcString, rcCorrupt );
+    a = ( skey [ 0 ] - '0' ) * 10 + ( skey [ 1 ] - '0' );
+
+    /* get 'Q' - base-36 encoded x/y */
+    for ( c = 0, i = 2; i < 7; ++ i )
+    {
+        c *= 36;
+        if ( isdigit ( skey [ i ] ) )
+            c += skey [ i ] - '0' + 26;
+        else if ( ! isalpha ( skey [ i ] ) )
+            return RC ( rcSRA, rcName, rcParsing, rcString, rcCorrupt );
+        else
+        {
+            /* yes, the alphabetic symbols come BEFORE the numeric */
+            c += toupper ( skey [ i ] ) - 'A';
+        }
+    }
+
+    /* convert 'Q' to x and y */
+    b = c >> 12;
+    c &= 0xFFF;
+
+    /* count the number of output coordinates */
+    count = ( uint32_t ) ( size_t ) self;
+
+    /* produce however many elements are requested */
+    dst -> elem_bits = 32 * count;
+    rc = KDataBufferResize ( dst, 1 );
+    if ( rc != 0 )
+        return rc;
+
+    out = dst -> base;
+    switch ( count )
+    {
+    default:
+        for ( i = 3; i < count; ++ i )
+            out [ i ] = 0;
+    case 3:
+        out [ 2 ] = a;
+    case 2:
+        out [ 1 ] = b;
+    case 1:
+        out [ 0 ] = c;
+    case 0:
+        break;
+    }
+
+    rslt -> elem_count = 1;
+
+    return 0;
+}
+
+/* extract coordinates
+ *  given a spotname with encoded coordinates
+ *  extract them in reverse order into a vector
+ *
+ *  "platform" [ CONST ] - which platform rules to use
+ *
+ *  "skey" [ DATA ] - skey string for row
+ */
+VTRANSFACT_IMPL ( NCBI_SRA_extract_coordinates, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    const uint8_t *platform = cp -> argv [ 0 ] . data . u8;
+    switch ( platform [ 0 ] )
+    {
+    case SRA_PLATFORM_454:
+        rslt -> u . rf = _454_extract_coordinates;
+        break;
+    case SRA_PLATFORM_ILLUMINA:
+    case SRA_PLATFORM_HELICOS:
+        rslt -> u . rf = illumina_extract_coordinates;
+        break;
+    case SRA_PLATFORM_ABSOLID:
+        rslt -> u . rf = abi_extract_coordinates;
+        break;
+    default:
+        return RC ( rcSRA, rcFunction, rcConstructing, rcType, rcUnsupported );
+    }
+
+    assert ( info -> fdesc . desc . intrinsic_bits == 32 );
+    rslt -> self = ( void* ) ( size_t ) info -> fdesc . desc . intrinsic_dim;
+    rslt -> variant = vftRow;
+    return 0;
+}
diff --git a/libs/sraxf/extract-name_coord.c b/libs/sraxf/extract-name_coord.c
new file mode 100644
index 0000000..eff59f0
--- /dev/null
+++ b/libs/sraxf/extract-name_coord.c
@@ -0,0 +1,243 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include "name-tokenizer.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+
+/* extract_name_coord
+ *  generates inputs to .X and .Y and possibly other columns
+ *
+ *  if no tokens match "coord" constant, produces an empty row
+ *  otherwise, produces binary coordinate value
+ *  if multiple tokens match criteria, all values must be equivalent
+ *  because only a single value will be output per row
+ *
+ *  "coord" [ CONST ] - either NCBI:SRA:name_token:X or NCBI:SRA:name_token:Y
+ *  both of these values also match the token NCBI:SRA:name_token:Q and extract
+ *  contents appropriately.
+ *
+ *  "name" [ DATA ] - raw spot names from NAME column
+ *
+ *  "tok" [ DATA ] - delimiting tokens produced by sub-table
+function INSDC:coord:zero
+    NCBI:SRA:extract_name_coord #1 < U16 coord > ( ascii name, NCBI:SRA:spot_name_token tok );
+*/
+
+typedef struct self_t {
+    uint16_t coordinate;
+    int position;
+} self_t;
+
+/* return 0...failed, 1...success */
+
+MOD_EXPORT uint32_t CC parse_decimal ( int32_t* base, const char* src, const uint32_t length )
+{
+    /* coordinates are normally unsigned */
+    bool negate = false;
+
+    /* fetch initial character */
+    int32_t val = src [ 0 ];
+
+    /* assume loop starts with following character */
+    uint32_t i = 1;
+
+    /* detect explicit sign */
+    switch ( val )
+    {
+    case '-':
+        negate = true;
+    case '+':
+        val = src [ 1 ];
+        i = 2;
+        break;
+    }
+
+    if ( ! isdigit ( val ) )
+        return 0;
+
+    for ( val -= '0'; i < length; ++ i )
+    {
+        val *= 10;
+        if ( ! isdigit ( src [ i ] ) )
+            return 0;
+        val += src [ i ] - '0';
+    }
+
+    * base = negate ? - val : val;
+
+    return 1;
+}
+
+MOD_EXPORT uint32_t CC parse_Q ( uint32_t* base, const char* src,
+    const uint32_t length, const uint16_t what )
+{
+    uint32_t xy, i;
+    
+    if( length != 5 ) {
+        return 0;
+    }
+    for( xy = i = 0; i < length; ++ i )
+    {
+        char n = src[i];
+        xy *= 36;
+        if( isdigit ( n ) )
+        {
+            xy += n - '0' + 26;
+        }
+        else if ( isalpha ( n ) )
+        {
+            xy += toupper ( n ) - 'A';
+        } 
+        else
+        {
+            return 0;
+        }
+    }
+    if ( what == nt_X )
+    {
+        *base = xy >> 12;
+        return 1;
+    }
+    if ( what == nt_Y )
+    {
+        *base = xy & 0xFFF;
+        return 1;
+    }
+
+    return 0;
+}
+ 
+static
+rc_t CC extract_name_coordinate ( void *Self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint32_t i, j;
+    self_t* self = Self;
+
+    const char *name;
+    const spot_name_token_t* token;
+    uint32_t name_len, num_tokens;
+
+    assert( argc == 2 );
+
+    /* name string */
+    name = argv [ 0 ] . u . data . base;
+    name_len = argv [ 0 ] . u . data . elem_count;
+    name += argv [ 0 ] . u . data . first_elem;
+
+    /* tokens */
+    token = argv [ 1 ] . u . data . base;
+    num_tokens = argv [ 1 ] . u . data . elem_count;
+    token += argv [ 1 ] . u . data . first_elem;
+
+    for ( i = j = 0; i < num_tokens; ++ i )
+    {
+        if ( token [ i ] . s . token_type != self -> coordinate )
+        {
+            if ( token [ i ] . s . token_type != nt_Q )
+                continue;
+            switch ( self -> coordinate )
+            {
+            case nt_X:
+            case nt_Y:
+                break;
+            default:
+                continue;
+            }
+        }
+
+        if ( ++ j == self->position )
+        {
+            /* check bounds */
+            if ( (uint32_t)( token [ i ] . s . position + token [ i ] . s . length ) > name_len )
+                return 0;
+
+            /* convert token */
+            rc = KDataBufferResize( rslt->data, 1 );
+            if ( rc )
+                return rc;
+
+            switch ( token [ i ] . s . token_type )
+            {
+            case nt_X:
+            case nt_Y:
+            case nt_T:
+            case nt_L:
+                rslt->elem_count = parse_decimal ( rslt -> data -> base,
+                    name + token [ i ] . s . position, token [ i ] . s . length );
+                return 0;
+            case nt_Q : rslt->elem_count = parse_Q ( rslt -> data -> base,
+                    name + token [ i ] . s . position, token [ i ] . s . length,
+                    self -> coordinate );
+                return 0;
+            }
+        }
+    }
+
+    rslt->elem_count = 0;
+    return 0;
+}
+
+static
+void CC sraxf_extract_name_coord_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_extract_name_coord, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    self_t* Self;
+
+    assert( cp->argc >= 1 );
+
+    Self = malloc( sizeof( self_t ) );
+    if ( Self == NULL ) return RC( rcSRA, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    Self->coordinate = cp->argv[0].data.u16[0];
+    Self->position = 1;
+    rslt->self = Self;
+    rslt->whack = sraxf_extract_name_coord_wrapper;
+
+    rslt->variant = vftRow;
+    rslt->u.rf = extract_name_coordinate;
+
+    return 0;
+}
diff --git a/libs/sraxf/extract-name_fmt.c b/libs/sraxf/extract-name_fmt.c
new file mode 100644
index 0000000..312a6a6
--- /dev/null
+++ b/libs/sraxf/extract-name_fmt.c
@@ -0,0 +1,240 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <kdb/index.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include "name-tokenizer.h"
+
+#include <string.h>
+
+/* extract_name_fmt
+ *  generates input to .NAME_FMT column and/or updates skey index
+ *
+ *  on NCBI:SRA:name_token:unrecognized, produces an empty row
+ *  otherwise, it creates a temporary "name_fmt" string from name row
+ *
+ *  an attempt is made to insert name_fmt into indicated text index
+ *  ( normally 'skey' ). if the insert succeeds, i.e. associates "name_fmt"
+ *  with a row_id, then the output for the row is empty.
+ *
+ *  if the insert fails due to key duplication, an attempt is made to
+ *  extend the id range of associated rows. depending upon the type of index,
+ *  this may succeed or fail, e.g. if the existing row range for "name_fmt" is
+ *  n..m where m = row_id - 1, the range can be extended to n..row_id and
+ *  the update succeeds. if the index supports discontiguous id ranges, the
+ *  update will also succeed. upon any success updating the index, the output
+ *  row will be empty.
+ *
+ *  finally, if the temporary "name_fmt" cannot be inserted into the index
+ *  nor the existing id range updated, the output for the row will be "name_fmt".
+ *
+ *  "name" [ DATA ] - raw spot names from NAME column
+ *
+ *  "tok" [ DATA ] - delimiting tokens produced by sub-table
+function ascii
+    NCBI:SRA:extract_name_fmt #1 < ascii skey > ( ascii name, NCBI:SRA:spot_name_token tok );
+ */
+
+static
+rc_t extract_name_fmt_2 (KIndex *ndx, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, const char *name, uint32_t namelen, const spot_name_token_t *tokens, uint32_t N )
+{
+    rc_t rc;
+    bool recognized;
+    uint32_t i, j, toksize, fmtsize, numtok;
+    char sbuf[4096], *name_fmt = sbuf;
+
+    for ( recognized = false, i = j = numtok = toksize = 0; i != N; ++i)
+    {
+        switch (tokens[i].s.token_type)
+        {
+        case nt_unrecognized:
+            /* should be a single token, but in any event we don't care */
+            return 0;
+        case nt_recognized:
+            /* should be a single token, but we'll check below */
+            recognized = true;
+            break;
+	case nt_Q:
+	case nt_X:
+	case nt_Y:
+            /* we should recognize the token */
+            if ( tokens [ i ] . s . token_type >= nt_max_token )
+                return RC ( rcSRA, rcToken, rcPositioning, rcName, rcOutofrange );
+
+            /* enforce serial order of tokens */
+            if ( tokens [ i ] . s . position < j )
+                return RC ( rcSRA, rcToken, rcPositioning, rcName, rcInvalid );
+            j = tokens [ i ] . s . position + tokens [ i ] . s . length;
+
+            /* accumulate total size to be removed */
+            toksize += tokens [ i ] . s . length;
+	    numtok++;
+
+            /* enforce that no token extends beyond end of name */
+            if ( j > namelen )
+                return RC ( rcSRA, rcToken, rcPositioning, rcName, rcOutofrange );
+	    break;
+        default: /*** exclude from computation ***/
+		break;
+        }
+    }
+
+    /* token stream cannot contain BOTH recognized and coordinates */
+    if ( recognized && toksize != 0 )
+        return RC ( rcSRA, rcToken, rcPositioning, rcName, rcInvalid );
+
+    /* token stream must contain at least recognized or a non-empty coordinate */
+    if ( ! recognized && toksize == 0 )
+        return RC ( rcSRA, rcToken, rcPositioning, rcName, rcInvalid );
+
+    /* calculate name_fmt buffer size */
+    fmtsize = ( recognized ? namelen : namelen - toksize + numtok + numtok ) + 1;
+
+    /* if local buffer is insufficient, allocate directly in output KDataBuffer */
+    rslt -> data -> elem_bits = 8;
+    if ( fmtsize > sizeof sbuf )
+    {
+        rc = KDataBufferResize ( rslt -> data, fmtsize );
+        if ( rc != 0 )
+            return rc;
+        name_fmt = rslt -> data -> base;
+    }
+
+    /* create NUL-terminated formatted string */
+    if ( recognized )
+        string_copy ( name_fmt, fmtsize --, name, namelen );
+    else
+    {
+        uint32_t total;
+        for ( i = j = total = 0; i < N; ++i )
+        {
+            switch( tokens[i].s.token_type ) {
+                case nt_Q:
+                case nt_X:
+                case nt_Y:
+                    {{
+                    uint32_t pos = tokens [ i ] . s . position;
+                    toksize = tokens [ i ] . s . length;
+
+                    /* detect unrecognized tokens to left */
+                    if ( pos > j )
+                    {
+                        /* copy them in, NUL-terminating */
+                        total += (uint32_t)string_copy ( & name_fmt [ total ],
+                            fmtsize - total, & name [ j ], pos - j );
+                    }
+
+                    /* move marker along */
+                    j = pos + toksize;
+
+                    /* insert symbol */
+                    name_fmt[total + 0] = '$';
+                    name_fmt[total + 1] = TOK_ALPHABET[tokens[i].s.token_type];
+                    name_fmt[total + 2] = 0;
+                    total += 2;
+                    }}
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        /* detect unrecognized tokens to right */
+        if ( j < namelen )
+        {
+            string_copy ( & name_fmt [ total ],
+                fmtsize - total, & name [ j ], namelen - j );
+        }
+    }
+
+    /* attempt to insert into index */
+    rc = KIndexInsertText ( ndx, false, name_fmt, row_id );
+    if ( rc != 0 )
+    {
+        /* insert failed for whatever reason - return name_fmt */
+        fmtsize = strlen(name_fmt);
+        if ( name_fmt == sbuf )
+        {
+            rc = KDataBufferResize ( rslt -> data, fmtsize );
+            if ( rc != 0 )
+                return rc;
+            memmove ( rslt -> data -> base, name_fmt, fmtsize );
+        }
+
+        rslt -> elem_count = fmtsize;
+    }
+
+    return 0;
+}
+
+static
+rc_t CC extract_name_fmt( void *self, const VXformInfo *info, int64_t row_id,
+                       VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    const char *name;
+    uint32_t num_tokens, name_len;
+    const spot_name_token_t *tokens;
+
+    tokens = argv [ 1 ] . u . data . base;
+    num_tokens = argv [ 1 ] . u . data . elem_count;
+    tokens += argv [ 1 ] . u . data . first_elem;
+
+    rslt -> elem_count = 0;
+    if ( num_tokens == 0 )
+        return 0;
+
+    name = argv [ 0 ] . u . data . base;
+    name_len = argv [ 0 ] . u . data . elem_count;
+    name += argv [ 0 ] . u . data . first_elem;
+
+    return extract_name_fmt_2(self, info, row_id, rslt,
+        name, name_len, tokens, num_tokens);
+}    
+
+VTRANSFACT_IMPL ( NCBI_SRA_extract_name_fmt, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    KIndex *ndx;
+    
+    rc = VTableCreateIndex ( ( VTable* ) info -> tbl, &ndx, kitText | kitProj, kcmOpen,
+                             "%.*s", cp->argv[0].count, cp->argv[0].data.ascii );
+    if( rc == 0 ) {
+        rslt->self = ndx;
+        rslt->whack = ( void ( CC * ) ( void* ) ) KIndexRelease;
+        rslt->variant = vftNonDetRow;
+        rslt->u.ndf = extract_name_fmt;
+    }    
+    return rc;
+}
diff --git a/libs/sraxf/extract-spot_name.c b/libs/sraxf/extract-spot_name.c
new file mode 100644
index 0000000..db9de7e
--- /dev/null
+++ b/libs/sraxf/extract-spot_name.c
@@ -0,0 +1,105 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include "name-tokenizer.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+
+/* extract_spot_name
+ *  generates input to .SPOT_NAME column
+ *
+ *  on NCBI:SRA:name_token:unrecognized, produces the entire spot name row
+ *  otherwise, produces an empty row
+ *
+ *  "name" [ DATA ] - raw spot names from NAME column
+ *
+ *  "tok" [ DATA ] - delimiting tokens produced by sub-table
+function ascii
+    NCBI:SRA:extract_spot_name #1 ( ascii name, NCBI:SRA:spot_name_token tok );
+ */
+
+#define NAM 0
+#define TOK 1
+
+static
+rc_t CC extract_spot_name ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    uint32_t i;
+    bool name_copy;
+
+    const spot_name_token_t *token = argv [ TOK ] . u . data . base;
+    uint32_t num_tokens = argv [ TOK ] . u . data . elem_count;
+    token += argv [ TOK ] . u . data . first_elem;
+
+    for ( name_copy = false, i = 0; i < num_tokens; ++ i )
+    {
+        if ( token [ i ] . s . token_type == nt_unrecognized )
+        {
+            name_copy = true;
+            break;
+        }
+    }
+
+    rslt -> elem_count = 0;
+    rslt -> data -> elem_bits = 8;
+
+    if ( name_copy || num_tokens == 0 )
+    {
+        const char *name = argv [ NAM ] . u . data . base;
+        uint32_t name_len = argv [ NAM ] . u . data . elem_count;
+
+        rc_t rc = KDataBufferResize ( rslt -> data, name_len );
+        if ( rc != 0 )
+            return rc;
+
+        memmove ( rslt -> data -> base, name += argv [ NAM ] . u . data . first_elem, name_len );
+        rslt -> elem_count = name_len;
+    }
+
+    return 0;
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_extract_spot_name, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftRow;
+    rslt->u.rf = extract_spot_name;
+    
+    return 0;
+}
diff --git a/libs/sraxf/fix_read_seg_impl.h b/libs/sraxf/fix_read_seg_impl.h
new file mode 100644
index 0000000..977485f
--- /dev/null
+++ b/libs/sraxf/fix_read_seg_impl.h
@@ -0,0 +1,169 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/* READ_SEG was engineered to be capable of holding
+   any sort of read description, including out-of-order,
+   non-contiguous, gapped or overlapped segments.
+
+   This property was never used, and READ_SEG is by now
+   obsolete, so we can count on it being used as a sort
+   of READ_LEN where the starts represent an integration
+   of the lengths, i.e. all segments are in order and
+   contiguous. */
+#define READ_SEGS_ALWAYS_CONTIGUOUS 1
+
+static void fix_read_seg_impl(const uint16_t *rs_src, uint32_t nreads,
+    uint32_t spot_len, uint32_t * rs_dst)
+{
+    const uint32_t nreads2 = nreads + nreads;
+        uint32_t i, total;
+
+        assert(rs_src && rs_dst);
+
+#if READ_SEGS_ALWAYS_CONTIGUOUS
+        /* first, check the stated bases within the read-seg */
+        for ( i = 1, total = 0; i < nreads2; i += 2 )
+            total += rs_src [ i ];
+
+        /* if there are no bases reported, just divide the
+           spot_len by the number of reads and rewrite */
+        if ( total == 0 )
+        {
+            /* if there is a single read, fix it */
+            if ( nreads == 1 )
+            {
+                rs_dst [ 0 ] = 0;
+                rs_dst [ 1 ] = spot_len;
+            }
+            else
+            {
+                double fstart = 0;
+                double flen = ( double ) spot_len / nreads;
+                for ( i = total = 0; i < nreads2; fstart += flen, i += 2 )
+                {
+                    long int start = lround ( fstart );
+                    long int end = lround ( fstart + flen );
+                    if ( start >= ( long int ) spot_len )
+                    {
+                        rs_dst [ i ] = spot_len;
+                        rs_dst [ i + 1 ] = 0;
+                    }
+                    else
+                    {
+                        if ( end > ( long int ) spot_len )
+                            end = ( long int ) spot_len - start;
+                        else
+                            end -= start;
+
+                        rs_dst [ i ] = ( uint32_t ) start;
+                        rs_dst [ i + 1 ] = ( uint32_t ) end;
+                    }
+
+                    total += rs_dst [ i + 1 ];
+                }
+
+                assert ( total == spot_len );
+            }
+        }
+
+        /* have the right number of bases - just rewrite starts */
+        else if ( total == spot_len )
+        {
+            for ( i = total = 0; i < nreads2; i += 2 )
+            {
+                rs_dst [ i ] = total;
+                total += ( rs_dst [ i + 1 ] = rs_src [ i + 1 ] );
+            }
+        }
+
+        /* have too many bases - trust all up to limit */
+        else if ( total > spot_len )
+        {
+            for ( i = total = 0; i < nreads2; i += 2 )
+            {
+                rs_dst [ i ] = total;
+                total += ( rs_dst [ i + 1 ] = rs_src [ i + 1 ] );
+                if ( total > spot_len )
+                {
+                    total = spot_len;
+                    rs_dst [ i + 1 ] = total - rs_dst [ i ];
+                }
+            }
+        }
+
+        /* too few bases - trust all but last */
+        else
+        {
+            for ( i = 0; i < nreads2; i += 2 )
+                rs_dst [ i + 1 ] = rs_src [ i + 1 ];
+
+            for ( ; total < spot_len && i != 0; )
+            {
+                uint32_t remaining = spot_len - total;
+                i -= 2;
+                rs_dst [ i + 1 ] += remaining;
+                total += remaining;
+            }
+
+            for ( i = 0, total = 0; i < nreads2; i += 2 )
+            {
+                rs_dst [ i ] = total;
+                total += rs_dst [ i + 1 ];
+            }
+        }
+#else
+        /* loop increments by 2
+           where the read start is even, read length odd */
+        for ( i = total = 0; i < nreads2; i += 2 )
+        {
+            /* is start greater than max? */
+            if ( rs_src [ i ] >= spot_len )
+            {
+                /* clip start to end */
+                rs_dst [ i ] = spot_len;
+                /* zero length read */
+                rs_dst [ i + 1 ] = 0;
+            }
+            /* is end greater than max? */
+            else if ( rs_src [ i ] + rs_src [ i + 1 ] > spot_len )
+            {
+                /* keep start */
+                rs_dst [ i ] = rs_src [ i ];
+                /* clip length to end */
+                rs_dst [ i + 1 ] = spot_len - rs_src [ i ];
+            }
+            else
+            {
+                /* copy existing segment */
+                rs_dst [ i ]   = rs_src [ i ];
+                rs_dst [ i + 1 ] = rs_src [ i + 1 ];
+            }
+
+            /* sum total length */
+            total += rs_src [ i + 1 ];
+        }
+#endif
+}
diff --git a/libs/sraxf/format-spot-name.c b/libs/sraxf/format-spot-name.c
new file mode 100644
index 0000000..f16d0ab
--- /dev/null
+++ b/libs/sraxf/format-spot-name.c
@@ -0,0 +1,333 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include "name-tokenizer.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+#include <os-native.h>
+
+/* format_spot_name ( ascii name_fmt, I32 X, I32 Y * ascii spot_name );
+ *  given a name format string, X, and Y
+ *  produce a reconstructed spot name string
+ *
+ *  "name_fmt" [ DATA ] - name format string ( see format explanation below )
+ *
+ *  "X" [ DATA ] - X coordinate for spot
+ *
+ *  "Y" [ DATA ] - Y coordinate for spot
+ *
+ *  "spot_name" [ DATA, OPTIONAL ] - potential source of unformatted names
+ *
+ * SYNOPSIS:
+ *  "name_fmt" may have any ASCII characters
+ *  the special character '$' is an escape symbol
+ *  when followed by a recognized format character,
+ *  both the '$' and its format character will be
+ *  replaced with a numeral generated from X and/or Y.
+ *
+ *  when "spot_name" is present and the "name_fmt" row is empty,
+ *  output is taken verbatim from "spot_name"
+ *
+ * FORMAT:
+ *  'X' ( or 'x' ) = substitute with a decimal representation for X
+ *  'Y' ( or 'y' ) = substitute with a decimal representation for Y
+ *  'Q' ( or 'q' ) = calculate 454-style base-36 representation
+ *                   for both X and Y
+ */
+static
+rc_t CC format_spot_name ( void *self,
+    const VXformInfo *info, int64_t row_id, VRowResult *rslt,
+    uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    char *name;
+    uint32_t elem_count;
+    KDataBuffer *dst = rslt -> data;
+
+    if ( dst -> elem_bits != 8 )
+    {
+        rc = KDataBufferCast ( dst, dst, 8, true );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* check for NAME_FMT */
+    if ( argv [ 0 ] . u. data . elem_count != 0 )
+    {
+        size_t num_writ;
+        char sname[1024]; /** name on stack **/
+        const char *name_fmt = ((char*)argv[0].u.data.base) + argv[0].u.data.first_elem;
+        uint32_t i, j, x, y;
+        const uint32_t fmt_size = argv [ 0 ] . u . data . elem_count;
+
+        /* the coordinates to substitute */
+        x = ( ( const int32_t* ) argv [ 1 ] . u . data . base )
+            [ argv [ 1 ] . u . data . first_elem ];
+        y = ( ( const int32_t* ) argv [ 2 ] . u . data . base )
+            [ argv [ 2 ] . u . data . first_elem ];
+
+        for ( i=j=0; i < fmt_size -1;){
+            if( name_fmt [ i ] == '$' ){
+                switch( name_fmt [ i+1 ]){
+                case 'x': case 'X':
+                    if( j > sizeof(sname) - 11){
+    					return RC ( rcXF, rcFunction, rcDecoding, rcBuffer, rcInsufficient );
+                    } else {
+                        i+=2;
+                        if( i < fmt_size -1 && name_fmt [ i ] == '%' && isdigit(name_fmt [ i+1 ])) {
+                            x += 24*1024*(name_fmt [ i+1 ]-'0');
+                            i+=2;
+                        }
+                        j+=sprintf(sname+j,"%d",x);
+                    }
+                    break;
+                case 'y': case 'Y':
+                    if( j > sizeof(sname) - 11){
+    					return RC ( rcXF, rcFunction, rcDecoding, rcBuffer, rcInsufficient );
+                    } else {
+                        i+=2;
+                        if( i < fmt_size -1 && name_fmt [ i ] == '%' && isdigit(name_fmt [ i+1 ])) {
+                            y += 24*1024*(name_fmt [ i+1 ]-'0');
+                            i+=2;
+                        }
+                        j+=sprintf(sname+j,"%d",y);
+                    }
+                    break;
+                case 'q': case 'Q':
+                    if( j > sizeof(sname) - 5) {
+    					return RC ( rcXF, rcFunction, rcDecoding, rcBuffer, rcInsufficient );
+                    } else if( y > 0xFFF) {
+                        return RC ( rcXF, rcFunction, rcDecoding, rcRange, rcTooBig);
+                    } else {
+                        uint32_t q= x << 12 | y;
+                        sname[j+4]=Q_ALPHABET[q % 36]; q /= 36;
+                        sname[j+3]=Q_ALPHABET[q % 36]; q /= 36;
+                        sname[j+2]=Q_ALPHABET[q % 36]; q /= 36;
+                        sname[j+1]=Q_ALPHABET[q % 36]; q /= 36;
+                        sname[j]  =Q_ALPHABET[q];
+                        j+=5;
+                        i+=2;
+                    }
+                    break;
+		 case 'r': case 'R':
+            rc = string_printf ( & sname [ j ], sizeof sname - j, & num_writ, "%ld", row_id );
+            assert ( rc == 0 );
+            j += ( uint32_t ) num_writ;
+		    i+=2;
+		    break;
+                default:
+                    sname[j++]=name_fmt[i++];
+                    break;
+                }
+            } else {
+                if(j < sizeof(sname)){
+                    sname[j++]=name_fmt[i++];
+                } else {
+                    return RC ( rcXF, rcFunction, rcDecoding, rcBuffer, rcInsufficient );
+                }
+            }
+            if( j > sizeof(sname)-1){	
+                return RC ( rcXF, rcFunction, rcDecoding, rcBuffer, rcInsufficient );
+            }
+        }
+        if(i==fmt_size -1) {
+            if(j < sizeof(sname)){
+                sname[j++]=name_fmt[i++];
+            } else {
+                return RC ( rcXF, rcFunction, rcDecoding, rcBuffer, rcInsufficient );
+            }
+        }
+        
+        /* j is our new element count **/
+        elem_count = j;
+
+        /* resize output */
+        if ( dst -> elem_count <= elem_count )
+        {
+            rc = KDataBufferResize ( dst, elem_count);
+            if ( rc != 0 )
+                return rc;
+        }
+        
+        /* the output name */
+        name = dst -> base;
+        
+        memmove ( name, sname, elem_count );
+        rslt -> elem_count = elem_count;
+        return 0;
+    }
+
+    /* check for NAME */
+    if( argc == 4 && argv[3].u.data.elem_count != 0 ) {
+        const char *sname = ((char*)argv[3].u.data.base) + argv[3].u.data.first_elem;
+        /* output size */
+        elem_count = argv[3].u.data.elem_count;
+
+        /* resize output */
+        if( dst -> elem_count <= elem_count ) {
+            rc = KDataBufferResize( dst, elem_count + 1 );
+            if( rc != 0 )
+                return rc;
+        }
+        name = dst->base;
+        memmove(dst->base, sname, elem_count);
+        rslt->elem_count = elem_count;
+        name[elem_count] = 0;
+        return 0;
+    }
+
+    /* spot has no name */
+    return RC ( rcSRA, rcColumn, rcReading, rcRow, rcNull );
+}
+static
+rc_t CC format_spot_name_no_coord ( void *self,
+    const VXformInfo *info, int64_t row_id, VRowResult *rslt,
+    uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    char *name;
+    uint32_t elem_count;
+    KDataBuffer *dst = rslt -> data;
+
+    if ( dst -> elem_bits != 8 )
+    {
+        rc = KDataBufferCast ( dst, dst, 8, true );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* check for NAME_FMT */
+    if ( argv [ 0 ] . u. data . elem_count != 0 )
+    {
+        size_t num_writ;
+        char sname[1024]; /** name on stack **/
+        const char *name_fmt = ((char*)argv[0].u.data.base) + argv[0].u.data.first_elem;
+        uint32_t i, j;
+        const uint32_t fmt_size = argv [ 0 ] . u . data . elem_count;
+
+        for ( i=j=0; i < fmt_size -1;){
+            if( name_fmt [ i ] == '$' ){
+                switch( name_fmt [ i+1 ]){
+		 case 'r': case 'R':
+            rc = string_printf ( & sname [ j ], sizeof sname - j, & num_writ, "%ld", row_id );
+            assert ( rc == 0 );
+		    j += ( uint32_t ) num_writ;
+		    i+=2;
+		    break;
+                default:
+                    sname[j++]=name_fmt[i++];
+                    break;
+                }
+            } else {
+                if(j < sizeof(sname)){
+                    sname[j++]=name_fmt[i++];
+                } else {
+                    return RC ( rcXF, rcFunction, rcDecoding, rcBuffer, rcInsufficient );
+                }
+            }
+            if( j > sizeof(sname)-1){	
+                return RC ( rcXF, rcFunction, rcDecoding, rcBuffer, rcInsufficient );
+            }
+        }
+        if(i==fmt_size -1) {
+            if(j < sizeof(sname)){
+                sname[j++]=name_fmt[i++];
+            } else {
+                return RC ( rcXF, rcFunction, rcDecoding, rcBuffer, rcInsufficient );
+            }
+        }
+        
+        /* j is our new element count **/
+        elem_count = j;
+
+        /* resize output */
+        if ( dst -> elem_count <= elem_count )
+        {
+            rc = KDataBufferResize ( dst, elem_count);
+            if ( rc != 0 )
+                return rc;
+        }
+        
+        /* the output name */
+        name = dst -> base;
+        
+        memmove ( name, sname, elem_count );
+        rslt -> elem_count = elem_count;
+        return 0;
+    }
+
+    /* check for NAME */
+    if( argc == 2 && argv[1].u.data.elem_count != 0 ) {
+        const char *sname = ((char*)argv[1].u.data.base) + argv[1].u.data.first_elem;
+        /* output size */
+        elem_count = argv[1].u.data.elem_count;
+
+        /* resize output */
+        if( dst -> elem_count <= elem_count ) {
+            rc = KDataBufferResize( dst, elem_count + 1 );
+            if( rc != 0 )
+                return rc;
+        }
+        name = dst->base;
+        memmove(dst->base, sname, elem_count);
+        rslt->elem_count = elem_count;
+        name[elem_count] = 0;
+        return 0;
+    }
+
+    /* spot has no name */
+    return RC ( rcSRA, rcColumn, rcReading, rcRow, rcNull );
+}
+/*
+ * extern function ascii INSDC:SRA:format_spot_name #1 ( ascii name_fmt, I32 X, I32 Y * ascii spot_name );
+ */
+VTRANSFACT_IMPL ( INSDC_SRA_format_spot_name, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> u . rf = format_spot_name;
+    rslt -> variant = vftRow;
+    return 0;
+}
+
+
+VTRANSFACT_IMPL ( INSDC_SRA_format_spot_name_no_coord, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> u . rf = format_spot_name_no_coord;
+    rslt -> variant = vftRow;
+    return 0;
+}
+
diff --git a/libs/sraxf/fpcodec.c b/libs/sraxf/fpcodec.c
new file mode 100644
index 0000000..6bf0c04
--- /dev/null
+++ b/libs/sraxf/fpcodec.c
@@ -0,0 +1,267 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <klib/data-buffer.h>
+#include <klib/pack.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <endian.h>
+#include <byteswap.h>
+#include <string.h>
+#include <zlib.h>
+#include <assert.h>
+#include <math.h>
+
+static
+rc_t
+hufDecodeBytes_zlib(void *dst, size_t dsize, bitsz_t *psize, const void *src, bitsz_t ssize)
+{
+    int result;
+    rc_t rc;
+	z_stream c_stream; /* decompression stream */
+
+	memset(&c_stream,0,sizeof(c_stream));
+
+	c_stream.next_in   = (Bytef*)src;
+	c_stream.next_out  = (Bytef*)dst;
+	c_stream.avail_in  = (uInt)( ( ssize + 7 ) >> 3 );
+	c_stream.avail_out = (uInt)dsize;
+
+	if (psize)
+        *psize = 0;
+
+    result = inflateInit(&c_stream);
+    switch (result)
+    {
+    case Z_OK:
+            
+        result = inflate ( & c_stream, Z_FINISH );
+        switch (result)
+        {
+        case Z_STREAM_END:
+                
+            result = inflateEnd ( & c_stream );
+            if ( result == Z_OK )
+            {
+                if ( psize != NULL )
+                    * psize = c_stream.total_out << 3;
+                return 0;
+            }
+            return RC ( rcXF, rcFunction, rcDecoding, rcParam, rcInvalid );
+                
+        case Z_OK:
+        case Z_BUF_ERROR:
+            rc = RC (rcXF, rcFunction, rcDecoding, rcBuffer, rcInsufficient );
+            break;
+
+        case Z_NEED_DICT:
+        case Z_DATA_ERROR:
+            rc = RC (rcXF, rcFunction, rcDecoding, rcData, rcCorrupt);
+            break;
+        
+        case Z_MEM_ERROR:
+            rc = RC(rcXF, rcFunction, rcDecoding, rcMemory, rcExhausted);
+            break;
+        
+        case Z_STREAM_ERROR:
+        default:
+            rc = RC (rcXF, rcFunction, rcDecoding, rcNoObj, rcUnexpected);
+            break;
+        }
+
+        inflateEnd ( & c_stream );
+        break;
+            
+    case Z_MEM_ERROR:
+        rc = RC(rcXF, rcFunction, rcDecoding, rcMemory, rcExhausted);
+        break;
+            
+    case Z_VERSION_ERROR:
+    default:
+        rc = RC (rcXF, rcFunction, rcDecoding, rcNoObj, rcUnexpected);
+        break;
+    }
+
+    return rc;
+}
+
+
+typedef struct {
+	uint8_t 	mbits;/* mantissa bits to keep */
+	uint8_t		sign; /* if set then mantissa is signed */
+	uint8_t		version;
+    uint8_t     exp_not_compressed;
+} fp_trunc_key;
+
+typedef struct {
+	uint32_t	count;
+	fp_trunc_key cmn;
+} fp_trunc_key_v0;
+
+typedef struct {
+	uint64_t	count;
+	fp_trunc_key cmn;
+} fp_trunc_key_v1;
+
+static
+rc_t CC fp_extend ( void *self, const VXformInfo *info,
+    VLegacyBlobResult *rslt, const KDataBuffer *in )
+{
+    rc_t rc;
+    bitsz_t bsize;
+    uint64_t i, count;
+    uint32_t count32;
+    size_t tmpsize, psize;
+
+    int32_t *dst;
+    int8_t  *dexp;
+
+    KDataBuffer *out = rslt -> dst;
+    uint32_t keep = ( uint32_t ) ( size_t ) self;
+
+    fp_trunc_key tkey;
+    size_t ssize = KDataBufferBytes ( in );
+    const uint8_t *src = in -> base;
+
+    if(ssize < sizeof(tkey))
+        return RC(rcXF, rcFunction, rcUnpacking, rcData, rcUnexpected);
+    ssize -= sizeof(tkey); 
+    memmove(&tkey,src+ssize,sizeof(tkey));
+
+    if(tkey.mbits > 24 || tkey.mbits > keep) 
+        return RC(rcXF, rcFunction, rcUnpacking, rcData, rcUnexpected);
+
+    switch ( tkey . version )
+    {
+    case 0:
+        if ( ssize < sizeof count32 )
+            return RC(rcXF, rcFunction, rcUnpacking, rcData, rcUnexpected);
+        ssize -= sizeof count32;
+        memmove ( & count32, src+ssize, sizeof count32 );
+        count = count32;
+        break;
+    case 1:
+        if ( ssize < sizeof count )
+            return RC(rcXF, rcFunction, rcUnpacking, rcData, rcUnexpected);
+        ssize -= sizeof count;
+        memmove ( & count, src+ssize, sizeof count );
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcUnpacking, rcBlob, rcBadVersion );
+    }
+
+    psize = ( ( (size_t)count * tkey.mbits + 7 ) >> 3 );
+    if(psize > ssize)
+        return RC(rcXF, rcFunction, rcUnpacking, rcData, rcUnexpected);
+
+    out -> elem_bits = 32;
+    rc = KDataBufferResize ( out, (uint32_t)count );
+    if ( rc != 0 )
+        return rc;
+
+    dst = out -> base;    
+
+    /* unpack mantissa */
+    rc = Unpack ( tkey.mbits, 32, src, 0, (bitsz_t)( count * tkey.mbits ), 
+		          NULL, dst, KDataBufferBytes ( out ), & tmpsize );
+    if ( rc != 0 )
+        return rc;
+
+    assert ( KDataBufferBytes ( out ) == tmpsize );
+
+    rslt -> byte_order = vboNative;
+    ssize -= psize;
+        
+    dexp = malloc( (size_t)count );
+    if(dexp==NULL)
+        return RC(rcXF, rcFunction, rcUnpacking, rcMemory, rcExhausted);
+
+    if ( tkey.exp_not_compressed )
+        memmove( dexp, src+psize, (size_t)count );
+    else
+        /*** uncompress the exponent ***/
+        rc = hufDecodeBytes_zlib( dexp, (size_t)count, &bsize, src+psize, ssize << 3 );
+
+    if(rc == 0)
+    {
+        float *fdst;
+
+        /* combine mantissa and exponent */
+        if(tkey.sign==0)
+        {
+            for (fdst=(float*)dst, i = 0; i < count; ++ i )
+                fdst[i]=ldexpf(dst[i],dexp[i]-tkey.mbits);/*** the highest bit is not a sign ***/
+        }
+        else
+        {
+            uint32_t sign_extend= ~((1<<(tkey.mbits-1))-1);
+            for (fdst=(float*)dst, i = 0; i < count; ++ i )
+            {
+                if(dst[i]&sign_extend)
+                {
+                    float m=(float)(int)(dst[i]|sign_extend);
+                    fdst[i]=ldexpf(m,dexp[i]-tkey.mbits+1);
+                }
+                else
+                {
+                    float m=(float)dst[i];
+                    fdst[i]=ldexpf(m,dexp[i]-tkey.mbits+1);
+                }
+            }
+        }
+    }
+
+    free(dexp);
+    
+    return rc;
+}
+
+/* F32 NCBI:fp_extend #1.0 < U32 bits > ( NCBI:fp_encoded_t in );
+ */
+VTRANSFACT_IMPL ( NCBI_fp_extend, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    VNoHdrBlobFunc f = fp_extend;
+
+    /* test bit range */
+    uint32_t bits = cp -> argv [ 0 ] . data . u32 [ 0 ];
+    if ( bits < 1 || bits > 23 )
+        return RC ( rcVDB, rcFunction, rcConstructing, rcRange, rcIncorrect );
+
+    /* pass bits to function */
+    rslt -> self = ( void* ) ( size_t ) bits;
+    rslt -> u . bf = ( VBlobFunc ) f;
+    rslt -> variant = vftLegacyBlob;
+
+    return 0;
+}
diff --git a/libs/sraxf/index_lookup.c b/libs/sraxf/index_lookup.c
new file mode 100644
index 0000000..ba5dd27
--- /dev/null
+++ b/libs/sraxf/index_lookup.c
@@ -0,0 +1,270 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/index.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/pbstree.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+
+#include <assert.h>
+
+typedef struct tag_self_t {
+    const       KIndex *ndx;
+    char        query_key[1024];
+    uint32_t    query_key_len;
+    uint8_t     name_fmt_version;
+    const struct VCursorParams * parms;
+    uint32_t    elem_bits;
+} self_t;
+
+static void CC self_whack( void *Self )
+{
+    self_t *self = Self;
+    
+    KIndexRelease( self->ndx );
+    free( self );
+}
+
+typedef struct FindFmtDataXtra{
+        int32_t x;
+        int32_t y;
+}FindFmtDataXtra;
+
+static int CC SRAPTNodeFindFmt ( const void *item, const struct PBSTNode *n, void *data )
+{
+    int i,j;
+    FindFmtDataXtra *u=(FindFmtDataXtra *)data;
+    /* compare the remainder of the key */
+    const String *rem = item;
+    const char* q=rem->addr; /** query **/
+    const char* db=n->data.addr; /** database **/
+
+    for(i=j=0;q[i]!=0 && db[j]!= 0;){
+        if(q[i] == db[j]){
+                i++;j++;
+        } else if(db[j] == '$'){
+                switch(db[j+1]){
+		 case 'q':
+                 case 'Q':
+		 {
+			int k;
+			uint32_t xy=0;
+			j+=2;
+			for(k=0;k<5 && q[i]!=0;k++,i++){
+				xy *= 36;
+				if(isdigit(q[i])){
+					xy += q[i] - '0' + 26;
+				} else if(isalpha(q[i])){
+					xy += toupper(q[i]) - 'A';
+				}
+			}
+			if(u){
+				u->x = xy >> 12;
+				u->y = xy &0xFFF;
+			}
+	       		break;
+		 }
+                 case 'x':
+                 case 'X':
+                        if(u) u->x=atoi(q+i);
+                        j+=2;
+                        while(isdigit(q[i]))i++;
+			if(q[i]=='%' && isdigit(q[i+1])){
+				u->x += 24*1024*(q[i+1]-'0');
+				j+=2;
+			}
+                        break;
+                 case 'y':
+                 case 'Y':
+                        if(u) u->y=atoi(q+i);
+                        j+=2;
+                        while(isdigit(q[i]))i++;
+			if(q[i]=='%' && isdigit(q[i+1])){
+				u->y += 24*1024*(q[i+1]-'0');
+				j+=2;
+			}
+                        break;
+                 default:
+                        return  q[i]-db[j];
+                        break;
+                }
+        } else {
+                break;
+        }
+    }
+    return  q[i]-db[j];
+}
+
+
+static
+rc_t CC index_lookup_impl(
+                          void *Self,
+                          const VXformInfo *info,
+                          int64_t row_id,
+                          VRowResult *rslt,
+                          uint32_t argc,
+                          const VRowData argv[]
+                          )
+{
+    rc_t rc;
+    const self_t *self = Self;
+    KDataBuffer *query_buf=NULL;
+    char	query[1024];
+    uint64_t id_count;
+    int64_t start_id;
+    FindFmtDataXtra fxdata={0,0};
+    struct {
+        uint64_t start_id;
+        uint64_t id_count;
+        uint64_t x;
+        uint64_t y;
+    } out;
+    
+    rc = VCursorParamsGet(self->parms,self->query_key,&query_buf);
+    if (GetRCState(rc) == rcNotFound && GetRCObject(rc) == rcName) {
+	rslt->elem_count = 0;
+	rslt->no_cache = 1;
+	return 0;
+    }
+    if(rc == 0){
+        char    *qptr=((char*)query_buf->base)+(query_buf->bit_offset >>3);
+        uint32_t qlen=query_buf->elem_count;
+        
+        if(argc > 0){
+            char *   pptr=((char*)argv[0].u.data.base) + argv[0].u.data.first_elem;
+            uint32_t plen=argv[0].u.data.elem_count;
+            while(plen > 0 &&  qlen > 0 && *pptr == *qptr){
+                pptr++;
+                qptr++;
+                plen--;
+                qlen--;
+            }
+            if(plen > 0) rc = RC ( rcVDB,rcIndex,rcSearching,rcData,rcNotFound);
+        }
+        if( rc == 0){
+            memmove(query,qptr,qlen);
+            query[query_buf->elem_count]='\0';
+            if( self -> name_fmt_version == 1){ /*** this is a strange slx format name - very first implementation ***/
+                int lane=-1,tile=-1,x=-1,y=-1;
+                qptr=query;
+                if(*qptr == ':'){ qptr++;qlen--;}
+                sscanf(qptr,"%d:%d:%d:%d",&lane,&tile,&x,&y);
+                if(lane < 0 || lane > 0xF || tile < 0 || tile > 0xFFF || x < 0 || x > 0xFFF || y < 0 || y > 0xFFF){
+                    rc = RC ( rcVDB,rcIndex,rcSearching,rcData,rcNotFound);
+                } else {
+                    sprintf(query,"%1X%03X%03X%03X",lane,tile,x,y);
+                }
+            }
+            if(rc == 0 ) {
+                if( self -> name_fmt_version  >= 2) /*** X and Y are present ***/
+                    rc = KIndexFindText(self->ndx, query, &start_id, &id_count,SRAPTNodeFindFmt,&fxdata);
+                else
+                    rc = KIndexFindText(self->ndx, query, &start_id, &id_count,NULL,NULL);
+                if(rc == 0){
+                    KDataBuffer *dst = rslt -> data;
+                    rc = KDataBufferResize ( dst, 1 );
+                    if( rc == 0) {
+                        out.start_id = start_id;
+                        out.id_count = id_count;
+                        out.x        = fxdata.x;
+                        out.y        = fxdata.y;
+                        memmove(dst -> base,&out,sizeof(out));
+                        rslt -> elem_count = 1;
+                        rslt -> no_cache = 1; /***** This row should never be cached **/
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+VTRANSFACT_IMPL(NCBI_SRA_lookup, 1, 0, 0) (
+                                           const void *Self,
+                                           const VXfactInfo *info,
+                                           VFuncDesc *rslt,
+                                           const VFactoryParams *cp,
+                                           const VFunctionParams *dp
+) {
+    rc_t rc;
+    const KIndex *ndx;
+    KIdxType type;
+    
+    rc = VTableOpenIndexRead(info->tbl, &ndx, "%.*s", (int)cp->argv[0].count, cp->argv[0].data.ascii);
+    if ( rc != 0 )
+    {
+        if ( GetRCState ( rc ) != rcNotFound )
+            PLOGERR (klogErr, (klogErr, rc, "Failed to open index '$(index)'", "index=%.*s", (int)cp->argv[0].count, cp->argv[0].data.ascii));
+        return rc;
+    }
+    
+    rc = KIndexType(ndx, &type);
+    if (rc == 0) {
+        if (type == kitProj + kitText) {
+            self_t *self;
+            
+            self = malloc(sizeof(*self));
+            if (self) {
+                self->ndx = ndx;
+                self->elem_bits = VTypedescSizeof(&info->fdesc.desc);
+		memmove(self->query_key,cp->argv[1].data.ascii,cp->argv[1].count);
+		self->query_key_len = cp->argv[1].count;
+		self->query_key[self->query_key_len]='\0';
+		self->parms=info->parms;
+		self->name_fmt_version = *cp->argv[2].data.u8;
+/*** testing::: VCursorParamsSet(self->parms,"QUERY_BY_NAME" ,"EM7LVYS01C1LWG");***/
+		
+                rslt->self = self;
+                rslt->whack = self_whack;
+                rslt->variant = vftNonDetRow;
+                rslt->u.ndf = index_lookup_impl;
+                return 0;
+            }
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+        }
+        else
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcIndex, rcIncorrect);
+    }
+    KIndexRelease(ndx);
+    return rc;
+}
diff --git a/libs/sraxf/make-position.c b/libs/sraxf/make-position.c
new file mode 100644
index 0000000..4159911
--- /dev/null
+++ b/libs/sraxf/make-position.c
@@ -0,0 +1,133 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+/* make_position
+ *  return a synthesized position row with 1-1 correspondence
+ *
+ *  "T" [ TYPE ] - position type being generated
+ *
+ *  "start" [ CONST ] - either 0 or 1, depending upon the coordinate system
+ *
+ *  "read" [ DATA ] - the actual row of bases. the output row
+ *  will be the same length, but with synthesized data
+ */
+static
+rc_t CC make_position ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt,  uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    KDataBuffer *dst = self;
+
+    if ( argv [ 0 ] . u . data . elem_count > dst -> elem_count )
+    {
+        uint32_t old = dst -> elem_count;
+        rc = KDataBufferResize ( dst, argv [ 0 ] . u . data . elem_count );
+        if ( rc != 0 )
+            return rc;
+        if ( dst -> elem_bits == 16 )
+        {
+            uint16_t i, *p = dst -> base;
+            uint16_t offset = p [ 0 ];
+            for ( i = old; i < dst -> elem_count; ++ i )
+                p [ i ] = i + offset;
+        }
+        else
+        {
+            int32_t i, *p = dst -> base;
+            int32_t offset = p [ 0 ];
+            for ( i = old; i < (int32_t)dst -> elem_count; ++ i )
+                p [ i ] = i + offset;
+        }
+    }
+
+    KDataBufferWhack ( rslt -> data );
+    rc = KDataBufferSub ( dst, rslt -> data, 0, argv [ 0 ] . u . data . elem_count );
+    if ( rc == 0 )
+        rslt -> elem_count = argv [ 0 ] . u . data . elem_count;
+
+    return rc;
+}
+
+static
+void CC whack_data_buffer ( void *data )
+{
+    KDataBufferWhack ( data );
+    free ( data );
+}
+
+VTRANSFACT_IMPL( NCBI_SRA_make_position, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    KDataBuffer *b = malloc ( sizeof * b );
+    if ( b == NULL )
+        return RC ( rcSRA, rcFunction, rcConstructing, rcMemory, rcExhausted );
+
+    rc = KDataBufferMake ( b, info -> fdesc . desc . intrinsic_bits, 4096 );
+    if ( rc != 0 )
+    {
+        free ( b );
+        return rc;
+    }
+
+    if ( info -> fdesc . desc . intrinsic_bits == 16 )
+    {
+        uint16_t i, *dst = b -> base;
+        uint16_t offset = cp -> argv [ 0 ] . data . u16 [ 0 ];
+        for ( i = 0; i < 4096; ++ i )
+            dst [ i ] = i + offset;
+    }
+    else if ( info -> fdesc . desc . intrinsic_bits == 32 )
+    {
+        int32_t i, *dst = b -> base;
+        int32_t offset = cp -> argv [ 0 ] . data . i32 [ 0 ];
+        for ( i = 0; i < 4096; ++ i )
+            dst [ i ] = i + offset;
+    }
+    else
+    {
+        /* this shouldn't really be needed */
+        whack_data_buffer ( b );
+        return RC ( rcSRA, rcFunction, rcConstructing, rcType, rcUnsupported );
+    }
+
+    rslt -> self = b;
+    rslt -> whack = whack_data_buffer;
+    rslt -> u . rf = make_position;
+    rslt -> variant = vftRow;
+
+    return 0;
+}
diff --git a/libs/sraxf/name-tokenizer.h b/libs/sraxf/name-tokenizer.h
new file mode 100644
index 0000000..dcebc27
--- /dev/null
+++ b/libs/sraxf/name-tokenizer.h
@@ -0,0 +1,121 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_name_tokenizer_
+#define _h_name_tokenizer_
+
+/* spot_name_token_t
+ *  represents a single token
+ *  the tokenizer should emit a row of zero or more of these
+ */
+typedef union spot_name_token_t spot_name_token_t;
+union spot_name_token_t
+{
+    struct
+    {
+        uint16_t token_type;
+        uint16_t position;
+        uint16_t length;
+    } s;
+    uint16_t raw [ 3 ];
+};
+
+/* name_token
+ *  token ids
+ */
+enum name_token
+{
+    nt_unrecognized = 1,
+    nt_recognized,
+
+    nt_Q,
+
+    nt_X,
+    nt_Y,
+    nt_T,
+    nt_L,
+
+    nt_signed_X,
+    nt_signed_Y,
+    nt_signed_T,
+    nt_signed_L,
+
+    nt_octal_X,
+    nt_octal_Y,
+    nt_octal_T,
+    nt_octal_L,
+
+    nt_hex_upper_X,
+    nt_hex_upper_Y,
+    nt_hex_upper_T,
+    nt_hex_upper_L,
+
+    nt_hex_lower_X,
+    nt_hex_lower_Y,
+    nt_hex_lower_T,
+    nt_hex_lower_L,
+
+    nt_max_token
+};
+
+/* token_symbol
+ *  substitution symbols
+ */
+#define TOK_ALPHABET ("---QXYTLXYTLabcdefghxytl")
+
+enum token_symbol
+{
+    ts_Q          = 'Q',
+
+    ts_X          = 'X',
+    ts_Y          = 'Y',
+    ts_T          = 'T',
+    ts_L          = 'L',
+
+    ts_signed_X   = 'X',
+    ts_signed_Y   = 'Y',
+    ts_signed_T   = 'T',
+    ts_signed_L   = 'L',
+
+    ts_oct_X      = 'a',
+    ts_oct_Y      = 'b',
+    ts_oct_T      = 'c',
+    ts_oct_L      = 'd',
+
+    ts_hex_upr_X  = 'e',
+    ts_hex_upr_Y  = 'f',
+    ts_hex_upr_T  = 'g',
+    ts_hex_upr_L  = 'h',
+
+    ts_hex_lwr_X  = 'x',
+    ts_hex_lwr_Y  = 'y',
+    ts_hex_lwr_T  = 't',
+    ts_hex_lwr_L  = 'l'
+};
+
+#define Q_ALPHABET ("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
+
+#endif /* _h_name_tokenizer_ */
diff --git a/libs/sraxf/normalize.c b/libs/sraxf/normalize.c
new file mode 100644
index 0000000..8c40dc1
--- /dev/null
+++ b/libs/sraxf/normalize.c
@@ -0,0 +1,240 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sysalloc.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+typedef void (*norm_f)(void *dst, const void *src, const void *Cntrl, uint32_t vec_count);
+typedef struct self_t {
+    norm_f f;
+} self_t;
+
+#define NORM_0(A, B) do { \
+                            (A).data[0] = (B).data[0]; \
+                            (A).data[1] = (B).data[1] - (B).data[0]; \
+                            (A).data[2] = (B).data[2]; \
+                            (A).data[3] = (B).data[3]; \
+                        } while (0)
+#define NORM_1(A, B) A = B
+#define NORM_2(A, B) do { \
+                            (A).data[0] = (B).data[0]; \
+                            (A).data[1] = (B).data[1]; \
+                            (A).data[2] = (B).data[2]; \
+                            (A).data[3] = (B).data[3] - (B).data[2]; \
+                        } while (0)
+#define NORM_3(A, B) A = B
+
+#define FUNC(VALTYPE) F_ ## VALTYPE
+
+#define FUNC_DEF(VALTYPE) \
+static void FUNC(VALTYPE)(void *Dst, const void *Src, const void *Cntrl, uint32_t count) { \
+    typedef struct { VALTYPE data[4]; } data4_t; \
+    data4_t *dst = (data4_t *)Dst; \
+    const data4_t *src = (const data4_t *)Src; \
+    const uint8_t *cntrl = (const uint8_t *)Cntrl; \
+    uint32_t i; \
+    \
+    for (i = 0; i != count; ++i) { \
+        switch(cntrl[i]) { \
+        default: \
+        case 0: \
+            NORM_0(dst[i], src[i]); \
+            break; \
+        case 1: \
+            NORM_1(dst[i], src[i]); \
+            break; \
+        case 2: \
+            NORM_2(dst[i], src[i]); \
+            break; \
+        case 3: \
+            NORM_3(dst[i], src[i]); \
+            break; \
+        }\
+    } \
+}
+
+FUNC_DEF(float)
+FUNC_DEF(double)
+FUNC_DEF(uint8_t)
+FUNC_DEF(uint16_t)
+FUNC_DEF(uint32_t)
+FUNC_DEF(uint64_t)
+FUNC_DEF(int8_t)
+FUNC_DEF(int16_t)
+FUNC_DEF(int32_t)
+FUNC_DEF(int64_t)
+
+static
+rc_t CC normal_drvr (
+                void *Self,
+                const VXformInfo *info,
+                int64_t row_id,
+                VRowResult *rslt,
+                uint32_t argc,
+                const VRowData argv []
+) {
+    rc_t rc = 0;
+    const void *src;
+    const void *cntrl;
+    const self_t *self = (const self_t *)Self;
+    
+    assert(argv[0].u.data.elem_bits % 8 == 0);
+    assert(argv[1].u.data.elem_bits % 8 == 0);
+    
+    src   = &((const uint8_t *)argv[0].u.data.base)[(argv[0].u.data.first_elem * argv[0].u.data.elem_bits) / 8];
+    cntrl = &((const uint8_t *)argv[1].u.data.base)[(argv[1].u.data.first_elem * argv[1].u.data.elem_bits) / 8];
+    
+    rslt->elem_bits = rslt->data->elem_bits = argv[0].u.data.elem_bits;
+    rc = KDataBufferResize(rslt->data, argv[0].u.data.elem_count);
+    if (rc)
+        return rc;
+    rslt->elem_count = rslt->data->elem_count;
+    rslt->data->bit_offset = 0;
+    
+    self->f(rslt->data->base, src, cntrl, rslt->elem_count);
+    
+    return 0;
+}
+
+static
+void CC sraxf_normalize_free_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* 
+ * function < type T > T [ 4 ] NCBI:SRA:normalize #1 ( T [ 4 ] intensities, U8 called );
+ */
+VTRANSFACT_IMPL ( NCBI_SRA_normalize, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    self_t *self;
+    
+    switch (info->fdesc.desc.domain) {
+    case vtdInt:
+    case vtdUint:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+        case 16:
+        case 32:
+        case 64:
+            break;
+        default:
+            return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+            break;
+        }
+        break;
+    case vtdFloat:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 32:
+        case 64:
+            break;
+        default:
+            return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+            break;
+        }
+        break;
+    default:
+        return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+        break;
+    }
+    
+    self = malloc(sizeof(*self));
+    if (self) {
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                self->f = FUNC(int8_t);
+                break;
+            case 16:
+                self->f = FUNC(int16_t);
+                break;
+            case 32:
+                self->f = FUNC(int32_t);
+                break;
+            case 64:
+                self->f = FUNC(int64_t);
+                break;
+            default:
+                break;
+            }
+            break;
+        case vtdUint:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                self->f = FUNC(uint8_t);
+                break;
+            case 16:
+                self->f = FUNC(uint16_t);
+                break;
+            case 32:
+                self->f = FUNC(uint32_t);
+                break;
+            case 64:
+                self->f = FUNC(uint64_t);
+                break;
+            default:
+                break;
+            }
+            break;
+        case vtdFloat:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 32:
+                self->f = FUNC(float);
+                break;
+            case 64:
+                self->f = FUNC(double);
+                break;
+            default:
+                break;
+            }
+            break;
+        default:
+            break;
+        }
+        
+        rslt->self = self;
+        rslt->whack = sraxf_normalize_free_wrapper;
+        rslt->u.rf = normal_drvr;
+        rslt->variant = vftRow;
+        
+        return 0;
+    }
+    return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
diff --git a/libs/sraxf/prefix-tree-to-name.c b/libs/sraxf/prefix-tree-to-name.c
new file mode 100644
index 0000000..06a2e1b
--- /dev/null
+++ b/libs/sraxf/prefix-tree-to-name.c
@@ -0,0 +1,162 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sysalloc.h>
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <kdb/index.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <string.h>
+#include <assert.h>
+
+/* ascii NCBI:SRA:prefix_tree_to_name #1 < ascii idx > ( * ascii name );
+ *  use prefix tree index data in reverse lookup
+ *  as a substitute for physical NAME column
+ *
+ *  "idx" [ CONST ] - name of prefix-tree text index
+ *
+ *  "name" [ DATA, OPTIONAL ] - source of unindexed names
+ *  when a reverse lookup on "idx" fails and this input is
+ *  present, its row is returned.
+ */
+static
+rc_t prefix_tree_to_name ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const KIndex *idx = ( const void* ) self;
+    KDataBuffer *dst = rslt -> data;
+
+    /* the buffer should have already been given the correct element size */
+    if ( dst -> elem_bits != 8 )
+    {
+        rc = KDataBufferCast ( dst, dst, 8, true );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* the actual size depends upon whether the buffer is new or was resized very small */
+    if ( dst -> elem_count < 8 )
+    {
+        rc = KDataBufferResize ( dst, 4 * 1024 );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* try to get the text with current size */
+    rc = KIndexProjectText ( idx, row_id, NULL, NULL, dst -> base, dst -> elem_count, NULL );
+    if ( GetRCState ( rc ) == rcInsufficient && GetRCObject ( rc ) == rcBuffer )
+    {
+        /* go to 4K buffer - should never fail */
+        rc = KDataBufferResize ( dst, 4 * 1024 );
+        if ( rc == 0 )
+        {
+            rc = KIndexProjectText ( idx, row_id, NULL, NULL, dst -> base, dst -> elem_count, NULL );
+            if ( GetRCState ( rc ) == rcInsufficient && GetRCObject ( rc ) == rcBuffer )
+            {
+                /* go to 16K buffer - this is absurd */
+                rc = KDataBufferResize ( dst, 16 * 1024 );
+                if ( rc == 0 )
+                {
+                    rc = KIndexProjectText ( idx, row_id, NULL, NULL, dst -> base, dst -> elem_count, NULL );
+                    if ( GetRCState ( rc ) == rcInsufficient && GetRCObject ( rc ) == rcBuffer )
+
+                        /* reject this name, it is likely garbage */
+                        rc = RC ( rcSRA, rcIndex, rcProjecting, rcName, rcExcessive );
+                }
+            }
+        }
+    }
+
+    /* test to see if we got the name */
+    if ( rc == 0 )
+    {
+        rslt -> elem_count = (uint32_t)strlen ( ( const char* ) dst -> base );
+        return 0;
+    }
+
+    /* if id was not found, check for alternate input */
+    if ( GetRCState ( rc ) == rcNotFound && argc == 1 && argv [ 0 ] . u . data . elem_count != 0 )
+    {
+        if ( dst -> elem_count < argv [ 0 ] . u . data . elem_count )
+        {
+            rc = KDataBufferResize ( dst, argv [ 0 ] . u . data . elem_count );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        rc = 0;
+
+        string_copy ( dst -> base, dst -> elem_count,
+            argv [ 0 ] . u . data . base, argv [ 0 ] . u . data . elem_count );
+    }
+
+    return rc;
+}
+
+static
+void release_prefix_tree ( void *item )
+{
+    KIndexRelease ( ( const void* ) item );
+}
+
+VTRANSFACT_IMPL( NCBI_SRA_prefix_tree_to_name, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* the first thing to do is to open the prefix tree */
+    const KIndex *idx;
+    rc_t rc = VTableOpenIndexRead ( info -> tbl, & idx, "%.*s",
+        ( int ) cp -> argv [ 0 ] . count, cp -> argv [ 0 ] . data . ascii );
+    if ( rc == 0 )
+    {
+        KIdxType type;
+        rc = KIndexType ( idx, & type );
+        if ( rc == 0 )
+        {
+            if ( type == ( kitText | kitProj ) )
+            {
+                rslt -> self = ( void* ) idx;
+                rslt -> whack = release_prefix_tree;
+                rslt -> u . rf = prefix_tree_to_name;
+                rslt -> variant = vftRow;
+                return 0;
+            }
+
+            rc = RC ( rcSRA, rcFunction, rcConstructing, rcIndex, rcIncorrect );
+        }
+
+        KIndexRelease ( idx );
+    }
+    else {
+        OUTMSG("VTableOpenIndexRead failed: %R", rc);
+    }
+
+    return rc;
+}
diff --git a/libs/sraxf/process-position.c b/libs/sraxf/process-position.c
new file mode 100644
index 0000000..e135ab7
--- /dev/null
+++ b/libs/sraxf/process-position.c
@@ -0,0 +1,198 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sysalloc.h>
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+static
+void process_position ( uint16_t *dst, const uint16_t *src, uint32_t count )
+{
+    uint32_t i, cur, prev;
+
+    for ( prev = i = 0; i < count; prev = cur, ++ i )
+    {
+        cur = src [ i ];
+        if ( cur > 0x7FFF )
+            cur = ( uint8_t ) cur;
+        while ( prev > cur )
+            cur += 256;
+        dst [ i ] = cur;
+    }
+}
+
+static
+rc_t CC process_position1 ( void *self, const VXformInfo *info,
+    int64_t row_id, const VFixedRowResult *rslt,
+    uint32_t argc, const VRowData argv [] )
+{
+    uint16_t *dst = rslt -> base;
+    const uint16_t *src = argv [ 0 ] . u . data . base;
+    uint32_t count = argv [ 0 ] . u . data . elem_count;
+
+    dst += rslt -> first_elem;
+    src += argv [ 0 ] . u . data . first_elem;
+
+    process_position ( dst, src, count );
+
+    return 0;
+}
+
+static
+rc_t CC process_position2 ( void *self, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt,
+    uint32_t argc, const VRowData argv [] )
+{
+    /* position row data */
+    const uint16_t *src = argv [ 0 ] . u . data . base;
+    uint32_t count = argv [ 0 ] . u . data . elem_count;
+
+    /* filter row data */
+    const SRAReadFilter *rd_filt = argv [ 1 ] . u . data . base;
+    uint32_t i, nreads = argv [ 1 ] . u . data . elem_count;
+
+    /* output buffer */
+    uint16_t *dst;
+    rc_t rc = KDataBufferCast ( rslt -> data, rslt -> data, 16, true );
+    if ( rc == 0 )
+        rc = KDataBufferResize ( rslt -> data, count );
+    if ( rc != 0 )
+        return rc;
+
+    /* adjust all pointers to start of row */
+    src += argv [ 0 ] . u . data . first_elem;
+    rd_filt += argv [ 1 ] . u . data . first_elem;
+    dst = rslt -> data -> base;
+
+    /* set output size */
+    rslt -> elem_count = count;
+    rslt -> elem_bits = 16;
+
+    /* walk input */
+    for ( i = 0; i < nreads; ++ i )
+    {
+        if ( rd_filt [ i ] == SRA_READ_FILTER_REDACTED )
+        {
+            memset ( dst, 0, count * sizeof * dst );
+            return 0;
+        }
+    }
+
+    process_position ( dst, src, count );
+
+    return 0;
+}
+
+static
+rc_t CC process_position3 ( void *self, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt,
+    uint32_t argc, const VRowData argv [] )
+{
+    /* position row data */
+    const uint16_t *src = argv [ 0 ] . u . data . base;
+    uint32_t count = argv [ 0 ] . u . data . elem_count;
+
+    /* filter row data */
+    const SRAReadFilter *rd_filt = argv [ 1 ] . u . data . base;
+    uint32_t i, nreads = argv [ 1 ] . u . data . elem_count;
+
+    /* signal row data */
+    const uint16_t *sig = argv [ 2 ] . u . data . base;
+
+    /* output buffer */
+    uint16_t *dst;
+    rc_t rc = KDataBufferCast ( rslt -> data, rslt -> data, 16, true );
+    if ( rc == 0 )
+        rc = KDataBufferResize ( rslt -> data, count );
+    if ( rc != 0 )
+        return rc;
+
+    /* adjust all pointers to start of row */
+    src += argv [ 0 ] . u . data . first_elem;
+    rd_filt += argv [ 1 ] . u . data . first_elem;
+    sig += argv [ 2 ] . u . data . first_elem;
+    dst = rslt -> data -> base;
+
+    /* set output size */
+    rslt -> elem_count = count;
+    rslt -> elem_bits = 16;
+
+    /* walk input */
+    for ( i = 0; i < nreads; ++ i )
+    {
+        if ( rd_filt [ i ] == SRA_READ_FILTER_REDACTED )
+        {
+            uint32_t scount = argv [ 2 ] . u . data . elem_count;
+            for ( i = 0; i < scount; ++ i )
+            {
+                if ( sig [ i ] != 0 )
+                    break;
+            }
+            if ( i == scount )
+            {
+                memset ( dst, 0, count * sizeof * dst );
+                return 0;
+            }
+            break;
+        }
+    }
+
+    process_position ( dst, src, count );
+
+    return 0;
+}
+
+
+/* process_position
+ *  convert 8 bit integration into 16 bit
+ */
+VTRANSFACT_IMPL ( NCBI_SRA__454__process_position, 1, 0, 0 ) ( const void *fself, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    if ( dp -> argc == 3 )
+    {
+        rslt -> u . rf = process_position3;
+        rslt -> variant = vftRow;
+        return 0;
+    }
+
+    if ( dp -> argc == 2 )
+    {
+        rslt -> u . rf = process_position2;
+        rslt -> variant = vftRow;
+        return 0;
+    }
+
+    rslt -> u . pf = process_position1;
+    rslt -> variant = vftFixedRow;
+    return 0;
+}
diff --git a/libs/sraxf/qstat-trigger.c b/libs/sraxf/qstat-trigger.c
new file mode 100644
index 0000000..b1b815d
--- /dev/null
+++ b/libs/sraxf/qstat-trigger.c
@@ -0,0 +1,256 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <kdb/meta.h>
+#include <sysalloc.h>
+
+#include "stat_mod.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+typedef struct self_s self_t;
+struct self_s {
+    VDatabase *db;
+    statistic stats;
+    bool alignMode;
+};
+
+static
+rc_t CC qstats_trigger_impl(void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv[])
+{
+    self_t *self = data;
+    unsigned const nreads = argv[2].u.data.elem_count;
+    unsigned nrofs = 0;
+    unsigned i;
+    unsigned start;
+    rc_t rc = 0;
+    
+    uint8_t              const *read = argv[0].u.data.base;
+    uint8_t              const *qual = argv[1].u.data.base;
+    uint32_t             const *rlen = argv[2].u.data.base;
+    INSDC_SRA_xread_type const *rtyp = argv[3].u.data.base;
+    char                 const *sgrp = argv[4].u.data.base;
+    bool                 const *hmis = NULL;
+    bool                 const *hrof = NULL;
+    int32_t              const *rofs = NULL;
+    
+    read += argv[0].u.data.first_elem;
+    qual += argv[1].u.data.first_elem;
+    rlen += argv[2].u.data.first_elem;
+    rtyp += argv[3].u.data.first_elem;
+    sgrp += argv[4].u.data.first_elem;
+    
+    if (argc > 5) {
+        hmis = argv[5].u.data.base;
+        hmis += argv[5].u.data.first_elem;
+
+        hrof = argv[6].u.data.base;
+        hrof += argv[6].u.data.first_elem;
+        
+        rofs = argv[7].u.data.base;
+        rofs += argv[7].u.data.first_elem;
+        
+        nrofs = argv[7].u.data.elem_count;
+    }
+    for (start = i = 0; i < nreads && rc == 0; ++i) {
+        row_input row;
+        unsigned const len = rlen[i];
+        
+        memset(&row, 0, sizeof(row));
+        
+        row.spotgroup = sgrp;
+        row.spotgroup_len = argv[4].u.data.elem_count;
+        
+        row.read = &read[start];
+        row.quality = &qual[start];
+        row.read_len = row.quality_len = len;
+        
+        row.reversed = (rtyp[i] & SRA_READ_TYPE_REVERSE) != 0;
+        row.base_pos_offset = start;
+        
+        start += len;
+        
+        if (hmis) {
+            row.has_mismatch = hmis;
+            row.has_roffs = hrof;
+            row.roffs = rofs;
+            
+            row.has_mismatch_len = row.has_roffs_len = len;
+            row.roffs_len = nrofs;
+        }
+        rc = extract_statistic_from_row(&self->stats, &row);
+    }
+    return rc;
+}
+
+static char const *column_name[] = {
+    "SPOT_GROUP",
+    "(U32)DIMER_OFFSET",
+    "DIMER",
+    "(U8)HPRUN",
+    "(U8)GC_CONTENT",
+    "QUALITY",
+    "(U32)TOTAL_COUNT",
+    "(U32)MISMATCH_COUNT",
+    "(U32)INSERT_COUNT",
+    "(U32)DELETE_COUNT"
+};
+
+typedef struct writer_ctx_s writer_ctx_t;
+struct writer_ctx_s {
+    VCursor *curs;
+    rc_t rc;
+    bool alignMode;
+    uint32_t cid[10];
+};
+
+static bool CC qstats_write(stat_row const *row, void *ctx)
+{
+    writer_ctx_t *self = ctx;
+    rc_t rc = VCursorOpenRow(self->curs);
+    
+    while (rc == 0) {
+        rc = VCursorWrite(self->curs, self->cid[0],  8,  row->spotgroup,  0, strlen(row->spotgroup)); if (rc) break;
+        rc = VCursorWrite(self->curs, self->cid[1], 32, &row->base_pos,   0, 1);                      if (rc) break;
+        rc = VCursorWrite(self->curs, self->cid[2],  8,  row->dimer,      0, 2);                      if (rc) break;
+        rc = VCursorWrite(self->curs, self->cid[3],  8, &row->hp_run,     0, 1);                      if (rc) break;
+        rc = VCursorWrite(self->curs, self->cid[4],  8, &row->gc_content, 0, 1);                      if (rc) break;
+        rc = VCursorWrite(self->curs, self->cid[5],  8, &row->quality,    0, 1);                      if (rc) break;
+        rc = VCursorWrite(self->curs, self->cid[6], 32, &row->count,      0, 1);                      if (rc) break;
+        
+        if (self->alignMode) {
+            rc = VCursorWrite(self->curs, self->cid[7], 32, &row->mismatch_count, 0, 1); if (rc) break;
+            rc = VCursorWrite(self->curs, self->cid[8], 32, &row->insert_count,   0, 1); if (rc) break;
+            rc = VCursorWrite(self->curs, self->cid[9], 32, &row->delete_count,   0, 1); if (rc) break;
+        }
+        rc = VCursorCommitRow(self->curs); if (rc) break;
+        rc = VCursorCloseRow(self->curs);
+    }
+    return rc == 0;
+}
+
+static rc_t OpenTableAndCursor(VDatabase *db, VTable **ptbl, VCursor **pcurs, uint32_t cid[], unsigned ncols)
+{
+    rc_t rc = VDatabaseCreateTable(db, ptbl, "READ_STATS",
+                                   kcmCreate | kcmMD5, "READ_STATS");
+    
+    if (rc == 0) {
+        rc = VTableColumnCreateParams(*ptbl, kcmCreate, kcsCRC32, 0);
+        if (rc == 0) {
+            rc = VTableCreateCursorWrite(*ptbl, &pcurs, kcmInsert);
+            if (rc == 0) {
+                unsigned i;
+                
+                for (i = 0; i < ncols && rc == 0; ++i) {
+                    rc = VCursorAddColumn(*pcurs, &cid[i], "%s", column_name[i]);
+                }
+                if (rc == 0) {
+                    rc = VCursorOpen(*pcurs);
+                    if (rc == 0)
+                        return 0;
+                }
+                VCursorRelease(*pcurs);
+            }
+        }
+        VTableRelease(*ptbl);
+    }
+    *pcurs = NULL;
+    *ptbl = NULL;
+    return rc;
+}
+
+static void CC qstats_whack(void *vp)
+{
+    self_t *self = vp;
+    VTable *tbl;
+    writer_ctx_t ctx;
+    
+    memset(&ctx, 0, sizeof(ctx));
+    ctx.alignMode = self->alignMode;
+    
+    ctx.rc = OpenTableAndCursor(self->db, &tbl, &ctx.curs, self->alignMode ? 10 : 7);
+    VDatabaseRelease(self->db);
+    if (ctx.rc == 0) {
+        foreach_statistic(&self->stat, qstats_write, self);
+        VCursorRelease(ctx.curs);
+        if (ctx.rc == 0)
+            VTableReindex(tbl);
+        VTableRelease(tbl);
+    }
+    whack_statistic(&self->stat);
+    free(self);
+}
+
+static rc_t qstats_trigger_make(const void *Self, const VXfactInfo *info, VFuncDesc *rslt,
+                 const VFactoryParams *cp, const VFunctionParams *dp, bool alignMode)
+{
+    rc_t rc = 0;
+    self_t *self = malloc(sizeof(*self));
+    
+    if (self == NULL)
+        return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    self->alignMode = no_algn_info;
+    rc = VTableOpenParentUpdate(info->tbl, &self->db);
+    if (rc == 0) {
+        rc = make_statistic(&self->stat, 7, no_algn_info);
+        if (rc == 0) {
+            rslt->self = self;
+            rslt->variant = vftIdDepRow;
+            rslt->whack = qstats_whack;
+            rslt->u.rf = qstats_trigger_impl;
+            
+            return 0;
+        }
+        VDatabaseRelease(self->db);
+    }
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_seq_stats_trigger, 1, 0, 0 )
+    ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    return qstats_trigger_make(self, info, rslt, cp, dp, false);
+}
+
+VTRANSFACT_IMPL ( NCBI_align_stats_trigger, 1, 0, 0 )
+    ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    return qstats_trigger_make(self, info, rslt, cp, dp, true);
+}
diff --git a/libs/sraxf/qual4_codec.h b/libs/sraxf/qual4_codec.h
new file mode 100644
index 0000000..9d2fd3f
--- /dev/null
+++ b/libs/sraxf/qual4_codec.h
@@ -0,0 +1,43 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef int8_t qual4[4];
+
+enum code_book {
+	known_bad = 81,
+	known_good,
+	pattern_a_1, /* val, -val, min, min */
+	pattern_a_2, /* val, min, -val, min */
+	pattern_a_3, /* val, min, min, -val */
+	pattern_b_1, /* val, -val + 1, min, min */
+	pattern_b_2, /* val, min, -val + 1, min */
+	pattern_b_3, /* val, min, min, -val + 1 */
+	pattern_c_1, /* val, -val - 1, min, min */
+	pattern_c_2, /* val, min, -val - 1, min */
+	pattern_c_3, /* val, min, min, -val - 1 */
+	cb_last
+};
+
diff --git a/libs/sraxf/qual4_decode.c b/libs/sraxf/qual4_decode.c
new file mode 100644
index 0000000..3ec3717
--- /dev/null
+++ b/libs/sraxf/qual4_decode.c
@@ -0,0 +1,257 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <klib/data-buffer.h>
+#include "qual4_codec.h"
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <endian.h>
+#include <byteswap.h>
+
+#include <assert.h>
+
+static size_t qual4_decode(
+                           qual4 *dst,
+                           size_t dcount,
+                           const uint8_t *src,
+                           size_t ssize,
+                           const int8_t qmin,
+                           const int8_t qmax
+) {
+	int st;
+	int st2;
+    size_t i;
+    size_t j;
+
+	static const qual4 all_bad = { -5,  -5,  -5,  -5 };
+
+    qual4 is_good;
+    is_good [ 0 ] = qmax;
+    is_good [ 1 ] = qmin;
+    is_good [ 2 ] = qmin;
+    is_good [ 3 ] = qmin;
+	
+	for (st = st2 = 0, j = i = 0; i != ssize && j < dcount; ++i) {
+        int val = src[i] - 40;
+        
+		switch (st) {
+		case 0:
+            if (src[i] < known_bad) {
+                dst[j][0] = val;
+                st = 1;
+            }
+            else if (src[i] == known_bad)
+                memmove(&dst[j][0], all_bad, 4);
+            else if (src[i] == known_good)
+                memmove(&dst[j][0], is_good, 4);
+            else {
+                st2 = src[i];
+                st = 4;
+            }
+			break;
+		case 1:
+			dst[j][1] = val;
+			++st;
+			break;
+		case 2:
+			dst[j][2] = val;
+			++st;
+			break;
+		case 3:
+			dst[j][3] = val;
+			st = 0;
+			break;
+        case 4:
+            switch (st2) {
+            case pattern_a_1:
+                dst[j][0] = val;
+				dst[j][1] = -val;
+				dst[j][2] = qmin;
+				dst[j][3] = qmin;
+                break;
+            case pattern_a_2:
+                dst[j][0] = val;
+				dst[j][1] = qmin;
+				dst[j][2] = -val;
+				dst[j][3] = qmin;
+                break;
+            case pattern_a_3:
+                dst[j][0] = val;
+				dst[j][1] = qmin;
+				dst[j][2] = qmin;
+				dst[j][3] = -val;
+                break;
+            case pattern_b_1:
+                dst[j][0] = val;
+				dst[j][1] = -val + 1;
+				dst[j][2] = qmin;
+				dst[j][3] = qmin;
+                break;
+            case pattern_b_2:
+                dst[j][0] = val;
+				dst[j][1] = qmin;
+				dst[j][2] = -val + 1;
+				dst[j][3] = qmin;
+                break;
+            case pattern_b_3:
+                dst[j][0] = val;
+				dst[j][1] = qmin;
+				dst[j][2] = qmin;
+				dst[j][3] = -val + 1;
+                break;
+            case pattern_c_1:
+                dst[j][0] = val;
+				dst[j][1] = -val - 1;
+				dst[j][2] = qmin;
+				dst[j][3] = qmin;
+                break;
+            case pattern_c_2:
+                dst[j][0] = val;
+				dst[j][1] = qmin;
+				dst[j][2] = -val - 1;
+				dst[j][3] = qmin;
+                break;
+            case pattern_c_3:
+                dst[j][0] = val;
+				dst[j][1] = qmin;
+				dst[j][2] = qmin;
+				dst[j][3] = -val - 1;
+                break;
+            default:
+                return 0;
+            }
+            st = 0;
+            break;
+		}
+        if (st == 0)
+            ++j;
+	}
+	return j;
+}
+
+static
+rc_t CC qual4_decode_func(
+                       void *Self,
+                       const VXformInfo *info,
+                       VBlobResult *dst,
+                       const VBlobData *src,
+                       VBlobHeader *hdr
+) {
+    size_t rcount;
+    int qmin = -40;
+    int qmax = 40;
+    
+    if (hdr) {
+        rc_t rc;
+        uint8_t val;
+        
+        rc = VBlobHeaderOpPopHead(hdr, &val);
+        if (rc == 0) {
+            qmin = val - 40;
+            rc = VBlobHeaderOpPopHead(hdr, &val);
+            if (rc == 0) {
+                qmax = val - 40;
+            }
+        }
+    }
+    
+    rcount = qual4_decode( dst->data, dst->elem_count,
+                           src->data, 
+						   ( ( (size_t)src->elem_count * src->elem_bits + 7 ) >> 3 ),
+                           qmin, qmax );
+    
+    if (rcount == dst->elem_count) {
+        dst->byte_order = vboNone;
+        return 0;
+    }
+    return RC(rcSRA, rcFunction, rcExecuting, rcData, rcInvalid);
+}
+
+/*
+ * function NCBI:SRA:swapped_qual4 NCBI:SRA:qual4_decode ( NCBI:SRA:encoded_qual4 in );
+ */
+VTRANSFACT_IMPL(NCBI_SRA_qual4_decode, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftBlob;
+    rslt->u.bf = qual4_decode_func;
+
+    return 0;
+}
+
+static
+rc_t CC legacy_qual4_decode_func ( void *self, const VXformInfo *info, VLegacyBlobResult *rslt, const KDataBuffer *src )
+{
+    unsigned dbytes = *(uint32_t *)src->base;
+    
+#if __BYTE_ORDER == __BIG_ENDIAN
+    dbytes = bswap_32 (dbytes);
+#endif
+    if ((dbytes & 3) == 0) {
+        rc_t rc;
+        unsigned rcount;
+        
+        rslt->dst->elem_bits = 32;
+        rc = KDataBufferResize(rslt->dst, dbytes >> 2);
+        if (rc)
+            return rc;
+
+        rcount = (unsigned int)qual4_decode( rslt->dst->base, rslt->dst->elem_count,
+                               ( ( const uint8_t * )src->base ) + 4, 
+							   (unsigned int)( KDataBufferBytes( src ) - 4 ),
+                               -40, 40);
+        if (rcount == rslt->dst->elem_count) {
+            rslt->byte_order = vboNone;
+            return 0;
+        }
+    }
+    return RC(rcSRA, rcFunction, rcExecuting, rcData, rcInvalid);
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_qual4_decompress_v1, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    VNoHdrBlobFunc f = legacy_qual4_decode_func;
+    rslt->variant = vftLegacyBlob;
+    rslt->u.bf = ( VBlobFunc ) f;
+
+    return 0;
+}
+
+#if TESTING
+int test_decode(const uint8_t src[], unsigned ssize, int8_t Y[], unsigned N) {
+    size_t n = qual4_decode(Y, N / 4, src, ssize, -40, 40);
+    
+    return 0;
+}
+#endif
diff --git a/libs/sraxf/qual4_encode.c b/libs/sraxf/qual4_encode.c
new file mode 100644
index 0000000..b389227
--- /dev/null
+++ b/libs/sraxf/qual4_encode.c
@@ -0,0 +1,232 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <klib/data-buffer.h>
+#include "qual4_codec.h"
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <endian.h>
+#include <byteswap.h>
+
+#include <assert.h>
+
+static size_t qual4_encode(
+						   uint8_t *Dst,
+                           size_t dsize,
+						   const qual4 src [],
+						   size_t count,
+                           int8_t qmin,
+                           int8_t qmax
+                           )
+{
+	static const qual4 all_bad = { -5, -5, -5, -5 };
+	uint8_t *dst = Dst;
+    const uint8_t * const dend = & ( ( uint8_t* ) Dst ) [ dsize ];
+	int i;
+	qual4 
+        pat_a_1, pat_a_2, pat_a_3,
+        pat_b_1, pat_b_2, pat_b_3,
+        pat_c_1, pat_c_2, pat_c_3;
+    qual4 is_good;
+
+    is_good[0] = qmax;
+    is_good[1] = is_good[2] = is_good[3] = qmin;
+	
+	pat_a_1[2] = pat_a_1[3] = pat_a_2[1] = pat_a_2[3] = pat_a_3[1] = pat_a_3[2] = qmin;
+	pat_b_1[2] = pat_b_1[3] = pat_b_2[1] = pat_b_2[3] = pat_b_3[1] = pat_b_3[2] = qmin;
+	pat_c_1[2] = pat_c_1[3] = pat_c_2[1] = pat_c_2[3] = pat_c_3[1] = pat_c_3[2] = qmin;
+	
+	for (i = 0; i != count; ++i) {
+		qual4 in_val;
+		qual4 out_val;
+		int codes;
+		
+        memmove(in_val, src + i, 4);
+		if (in_val[0] > qmax || in_val[0] < qmin ||
+            in_val[1] > qmax || in_val[1] < qmin ||
+            in_val[2] > qmax || in_val[2] < qmin ||
+            in_val[3] > qmax || in_val[3] < qmin)
+        {
+			if (in_val[0] + 40 < 0 || in_val[0] + 40 >= cb_last)
+				goto IS_BAD;
+			else
+				goto QUOTE_IT;
+		}
+		
+		do {
+			if (*(uint32_t *)in_val == *(uint32_t *)all_bad) {
+			IS_BAD:
+				codes = 1;
+				out_val[0] = known_bad;
+				break;
+			}
+			if (*(uint32_t *)in_val == *(uint32_t *)is_good) {
+				codes = 1;
+				out_val[0] = known_good;
+				break;
+			}
+			
+			codes = 2;
+			out_val[1] = in_val[0] + 40;
+			
+			pat_a_3[3] = pat_a_2[2] = pat_a_1[1] = -(pat_a_1[0] = pat_a_2[0] = pat_a_3[0] = in_val[0]);
+			if (*(uint32_t *)in_val == *(uint32_t *)pat_a_1) {
+				out_val[0] = pattern_a_1;
+				break;
+			}
+			if (*(uint32_t *)in_val == *(uint32_t *)pat_a_2) {
+				out_val[0] = pattern_a_2;
+				break;
+			}
+			if (*(uint32_t *)in_val == *(uint32_t *)pat_a_3) {
+				out_val[0] = pattern_a_3;
+				break;
+			}
+			
+			pat_b_3[3] = pat_b_2[2] = pat_b_1[1] = -(pat_b_1[0] = pat_b_2[0] = pat_b_3[0] = in_val[0]) + 1;
+			if (*(uint32_t *)in_val == *(uint32_t *)pat_b_1) {
+				out_val[0] = pattern_b_1;
+				break;
+			}
+			if (*(uint32_t *)in_val == *(uint32_t *)pat_b_2) {
+				out_val[0] = pattern_b_2;
+				break;
+			}
+			if (*(uint32_t *)in_val == *(uint32_t *)pat_b_3) {
+				out_val[0] = pattern_b_3;
+				break;
+			}
+			
+			pat_c_3[3] = pat_c_2[2] = pat_c_1[1] = -(pat_c_1[0] = pat_c_2[0] = pat_c_3[0] = in_val[0]) - 1;
+			if (*(uint32_t *)in_val == *(uint32_t *)pat_c_1) {
+				out_val[0] = pattern_c_1;
+				break;
+			}
+			if (*(uint32_t *)in_val == *(uint32_t *)pat_c_2) {
+				out_val[0] = pattern_c_2;
+				break;
+			}
+			if (*(uint32_t *)in_val == *(uint32_t *)pat_c_3) {
+				out_val[0] = pattern_c_3;
+				break;
+			}
+		QUOTE_IT:
+			codes = 4;
+			out_val[0] = in_val[0] + 40;
+			out_val[1] = in_val[1] + 40;
+			out_val[2] = in_val[2] + 40;
+			out_val[3] = in_val[3] + 40;
+		} while (0);
+        
+        if (dst + codes > dend)
+            return dst + codes - Dst;
+        
+        memmove(dst, out_val, codes);
+		dst += codes;
+	}
+	return dst - Dst;
+}
+
+static
+rc_t CC qual4_encode_func(
+                       void *Self,
+                       const VXformInfo *info,
+                       VBlobResult *dst,
+                       const VBlobData *Src,
+                       VBlobHeader *hdr
+) {
+    size_t n;
+    unsigned i;
+    const int8_t *src = Src->data;
+    int qmin = src[0];
+    int qmax = src[0];
+    rc_t rc;
+    
+    n = ((size_t)Src->elem_count * Src->elem_bits + 7) >> 3;
+    for (i = 1; i < n; ++i) {
+        int val = src[i];
+        
+        if (val < -40 || val > 40)
+            continue;
+        
+        if (qmax < val)
+            qmax = val;
+        if (qmin > val)
+            qmin = val;
+    }
+    if (qmax > 40)
+        qmax = 40;
+    if (qmin < -40)
+        qmin = -40;
+    
+    rc = VBlobHeaderOpPushTail(hdr, qmin + 40);
+    if (rc == 0) {
+        rc = VBlobHeaderOpPushTail(hdr, qmax + 40);
+        if (rc == 0) {
+            n = qual4_encode(dst->data, (dst->elem_count * dst->elem_bits + 7) >> 3,
+                             (const qual4 *)src, 
+                             n / 4,
+                             qmin, qmax );
+            
+            if (n > (dst->elem_count * dst->elem_bits + 7) >> 3)
+                return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+
+            dst->elem_count = n * 8 / dst->elem_bits;
+            dst->byte_order = vboNone;
+            
+            return 0;
+        }
+    }
+    return rc;
+}
+
+/*
+ * function NCBI:SRA:encoded_qual4 NCBI:SRA:qual4_encode #1 ( NCBI:SRA:swapped_qual4 in )
+ */
+VTRANSFACT_IMPL(NCBI_SRA_qual4_encode, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftBlob;
+    rslt->u.bf = qual4_encode_func;
+
+    return 0;
+}
+
+#if TESTING
+int test_encode(const int8_t Y[], unsigned N, uint8_t dst[], unsigned dsize) {
+    size_t n = qual4_encode(dst, dsize, Y, N / 4, -40, 40);
+
+    return n <= N ? n : 0;
+}
+#endif
diff --git a/libs/sraxf/read-desc.c b/libs/sraxf/read-desc.c
new file mode 100644
index 0000000..d3ce922
--- /dev/null
+++ b/libs/sraxf/read-desc.c
@@ -0,0 +1,143 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <string.h>
+
+static
+rc_t CC make_read_desc ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    SRAReadDesc *dst;
+
+    const uint8_t *num_reads              = argv[0].u.data.base;
+    const INSDC_coord_zero *read_start    = argv[1].u.data.base;
+    const INSDC_coord_len *read_len       = argv[2].u.data.base;
+    const INSDC_SRA_xread_type *read_type = argv[3].u.data.base;
+    const INSDC_SRA_read_filter *read_flt = argv[4].u.data.base;
+    const INSDC_dna_text *cs_key          = argv[5].u.data.base;
+    const INSDC_coord_zero *lbl_start     = argv[6].u.data.base;
+    const INSDC_coord_len *lbl_len        = argv[7].u.data.base;
+    const char *label                     = argv[8].u.data.base;
+    uint32_t label_max                    = argv[8].u.data.elem_count;
+
+    num_reads += argv[0].u.data.first_elem; /* valid for argv[0].u.data.elem_count */
+    assert( argv[0].u.data.elem_bits == (sizeof( *num_reads ) * 8 ) );
+
+    read_start += argv[1].u.data.first_elem; /* valid for argv[1].u.data.elem_count */
+    assert( argv[1].u.data.elem_bits == (sizeof( *read_start ) * 8 ) );
+    assert( argv[1].u.data.elem_count >= *num_reads ); /*** some old bug overspecified metadata **/
+
+    read_len += argv[2].u.data.first_elem; /* valid for argv[2].u.data.elem_count */
+    assert( argv[2].u.data.elem_bits == (sizeof( *read_len ) * 8 ) );
+    assert( argv[2].u.data.elem_count >= *num_reads );  /*** some old bug overspecified metadata **/
+
+    read_type += argv[3].u.data.first_elem; /* valid for argv[3].u.data.elem_count */
+    assert( argv[3].u.data.elem_bits == (sizeof( *read_type ) * 8 ) );
+    assert( argv[3].u.data.elem_count >= *num_reads );  /*** some old bug overspecified metadata **/
+
+    read_flt += argv[4].u.data.first_elem; /* valid for argv[4].u.data.elem_count */
+    assert( argv[4].u.data.elem_bits == (sizeof( *read_flt ) * 8 ) );
+    assert( argv[4].u.data.elem_count >= *num_reads );
+
+    cs_key += argv[5].u.data.first_elem; /* valid for argv[5].u.data.elem_count */
+    assert( argv[5].u.data.elem_bits == (sizeof( *cs_key ) * 8 ) );
+    assert( argv[5].u.data.elem_count >= *num_reads );
+
+    lbl_start += argv[6].u.data.first_elem; /* valid for argv[6].u.data.elem_count */
+    assert( argv[6].u.data.elem_bits == (sizeof( *lbl_start ) * 8 ) );
+    assert( argv[6].u.data.elem_count >= *num_reads );
+
+    lbl_len += argv[7].u.data.first_elem; /* valid for argv[7].u.data.elem_count */
+    assert( argv[7].u.data.elem_bits == (sizeof( *lbl_len ) * 8 ) );
+    assert( argv[7].u.data.elem_count >= *num_reads );
+
+    label += argv[8].u.data.first_elem; /* valid for argv[8].u.data.elem_count */
+    assert( argv[8].u.data.elem_bits >= (sizeof( *label ) * 8 ) );
+
+    rslt->data->elem_bits = sizeof(*dst) * 8;
+
+    rc = KDataBufferResize( rslt->data, *num_reads );
+    if ( rc == 0 )
+    {
+        uint32_t idx;
+        dst = rslt->data->base;
+        for ( idx = 0; idx < *num_reads; ++idx )
+        {
+            uint32_t label_start = lbl_start [ idx ];
+            uint32_t label_len = lbl_len [ idx ];
+            size_t   label_used;
+            if ( label_start + label_len > label_max )
+            {
+                if ( label_start > label_max )
+                    label_start = label_len = 0;
+                else
+                    label_len = label_max - label_start;
+            }
+
+            dst[idx].seg.start = (uint16_t)read_start[idx];
+            dst[idx].seg.len = (uint16_t)read_len[idx];
+            dst[idx].type = read_type[idx] & SRA_READ_TYPE_BIOLOGICAL;
+            dst[idx].cs_key = cs_key[idx];
+
+            label_used = string_copy( dst[idx].label, sizeof(dst[idx].label), 
+                                      & label [ label_start ], label_len );
+            /* Pad with NULs so that bitcmp sees fully initialized data */
+            memset( dst[idx].label + label_used, '\0',
+                    sizeof(dst[idx].label) - label_used );        
+        }
+
+        rslt->elem_bits = sizeof(*dst) * 8;
+        rslt->elem_count = *num_reads;
+
+    }
+
+    return rc;
+}
+
+/*
+ * function NCBI:SRA:ReadDesc NCBI:SRA:make_read_desc #1.0 ( U8 num_reads,
+    INSDC:coord:zero read_start, U32 read_len, INSDC:SRA:read_type read_type,
+    INSDC:SRA:read_filter read_filt, INSDC:dna:text cs_key,
+    INSDC:coord:zero label_start, U32 label_len, ascii label );
+
+ */
+VTRANSFACT_IMPL( NCBI_SRA_make_read_desc, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> u . rf = make_read_desc;
+    rslt -> variant = vftRow;
+    return 0;
+}
diff --git a/libs/sraxf/read-seg-from-readn.c b/libs/sraxf/read-seg-from-readn.c
new file mode 100644
index 0000000..9137ad9
--- /dev/null
+++ b/libs/sraxf/read-seg-from-readn.c
@@ -0,0 +1,361 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <assert.h>
+
+#include "fix_read_seg_impl.h"
+
+/* readn_read_desc
+ *  "nreads" [ DATA ] - bases for entire spot
+ */
+typedef struct readn_read_desc readn_read_desc;
+struct readn_read_desc
+{
+    uint32_t read_type;
+    uint32_t read_start;
+    uint32_t read_len;
+    uint32_t label_start;
+    uint32_t label_len;
+};
+
+static
+rc_t CC equal_reads_from_spot ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint32_t i, end;
+    readn_read_desc *rdesc;
+    KDataBuffer *dst = rslt -> data;
+
+    const uint8_t *nreads = argv [ 0 ] . u . data . base;
+    const uint32_t *spot_len = argv [ 1 ] . u . data . base;
+    nreads += argv [ 0 ] . u . data . first_elem;
+    spot_len += argv [ 1 ] . u . data . first_elem;
+
+    dst -> elem_bits = sizeof * rdesc * 8;
+    rc = KDataBufferResize ( dst, * nreads );
+    if ( rc != 0 )
+        return rc;
+
+    rdesc = dst -> base;
+
+    assert ( * spot_len > 0 );
+    assert ( * nreads != 0 );
+
+    for ( i = end = 0; i < * nreads; ++ i )
+    {
+        uint32_t rem = * nreads - i;
+        uint32_t len = ( * spot_len - end + rem - 1 ) / rem;
+
+        rdesc [ i ] . read_type = SRA_READ_TYPE_BIOLOGICAL;
+        rdesc [ i ] . read_start = end;
+        rdesc [ i ] . read_len = len;
+        rdesc [ i ] . label_start = 0;
+        rdesc [ i ] . label_len = 0;
+
+        end += len;
+    }
+
+    rslt -> elem_count = * nreads;
+
+    return 0;
+}
+
+static
+rc_t CC read_seg_from_meta ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint8_t nreads;	
+    uint32_t spot_len;
+    const KDataBuffer *self = ( const void* ) data;
+    const readn_read_desc *rd_src = self->base;
+    KDataBuffer *dst = rslt -> data;
+    readn_read_desc *rd_dst;;
+
+    nreads   = ((uint8_t*) argv[0].u.data.base)[argv[0].u.data.first_elem];
+    spot_len = ((uint32_t*)argv[1].u.data.base)[argv[1].u.data.first_elem];
+    assert ( spot_len > 0 );
+    assert ( nreads > 0 );
+
+    rc = KDataBufferResize ( dst, nreads );
+    if(rc != 0)
+        return rc;
+
+    rd_dst = dst->base;
+
+    memmove(rd_dst,rd_src,nreads*sizeof(*rd_dst));
+
+    /*** if not covered by equal_reads_from_spot() - valid for illumina consisting of bio reads only **/
+    if ( rd_dst[nreads-1].read_start+rd_dst[nreads-1].read_len==0)
+    {
+        int i;
+        rd_dst[0].read_start=0;
+        rd_dst[0].read_len=spot_len;
+        for(i=1;i<nreads;i++)
+        {
+            rd_dst[i].read_start=spot_len;
+            rd_dst[i].read_len=0;
+        }
+    }
+    /*** illumina stop reads before reaching designed cycles ***/
+    else if(rd_dst[nreads-1].read_start+rd_dst[nreads-1].read_len > spot_len)
+    {
+        int i;
+        for(i=0;i<nreads;i++)
+        {
+            if(rd_dst[i].read_start > spot_len)
+            {
+                rd_dst[i].read_start = spot_len;
+                rd_dst[i].read_len = 0;
+            }
+            else if(rd_dst[i].read_start + rd_dst[i].read_len > spot_len)
+            {
+                rd_dst[i].read_len = spot_len - rd_dst[i].read_start;
+            }
+        }
+    }
+    rslt -> elem_count = nreads;
+    return 0;
+}
+
+static
+rc_t parse_read_structure ( uint32_t idx, char *buf_val, readn_read_desc *rdesc )
+{
+    char    *rtype;
+    char    *pos;
+    int     fseqlen=0;
+    char    *ptr;
+    rc_t     rc;
+
+    memset(rdesc,0,sizeof(*rdesc));
+
+    pos = buf_val;
+
+    rtype = strsep( &pos, "|" );
+    if ( pos == NULL )
+    {
+        rc = RC ( rcSRA, rcTable, rcOpening, rcMetadata, rcCorrupt );
+        PLOGERR ( klogErr, ( klogErr, rc, "bad read struct '$(name)' = '$(value)'",
+                             "name=READ_%u,value=%s", idx, buf_val ));
+        return rc;
+    }
+
+    rdesc -> read_len = atoi ( pos );
+    strsep(&pos,"|");
+    if ( pos == NULL )
+    {
+        rc = RC ( rcSRA, rcTable, rcOpening, rcMetadata, rcCorrupt );
+        PLOGERR ( klogErr, ( klogErr, rc, "bad read struct '$(name)' = '$(value)'",
+                             "name=READ_%u,value=%s", idx, buf_val ));
+        return rc;
+    }
+
+    fseqlen = (int)strlen( pos );
+    if(fseqlen > 0)
+    {
+        if(pos[fseqlen-1]=='|') fseqlen--;
+        /* linker sequence is here */
+    }
+
+    switch ( rtype [ 0 ] )
+    {
+    case 'B':
+        rdesc -> read_type = SRA_READ_TYPE_BIOLOGICAL;
+        break;
+    case 'T':
+        rdesc -> read_type = SRA_READ_TYPE_TECHNICAL;
+        break;
+    default:
+        rc = RC ( rcSRA, rcTable, rcOpening, rcMetadata, rcCorrupt );
+        PLOGERR ( klogErr, ( klogErr, rc, "bad read struct '$(name)' = '$(value)'",
+                             "name=READ_%u,value=%s", idx, buf_val ));
+        return rc;
+    }
+    
+    pos=rtype;
+    ptr=strsep(&pos,":");
+    if( pos != NULL )
+    {
+        ptr=strsep(&pos,":");
+        /* label text is in ptr */
+        rdesc -> label_len = (uint32_t)strlen ( ptr );
+    }
+
+    return 0;
+}
+
+static
+void CC whack_data_buffer ( void *data )
+{
+    KDataBufferWhack ( data );
+    free ( data );
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_read_seg_from_readn, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    const KMetadata *meta;
+    rc_t rc = VTableOpenMetadataRead ( info -> tbl, & meta );
+    if ( rc == 0 )
+    {
+        KDataBuffer *fself;
+        readn_read_desc rd [ 16 ];
+        int32_t i, last, tech_read_cnt;
+
+        /* scan all metadata READ_N nodes */
+        for ( last = -1, i = 0; i < sizeof rd / sizeof rd [ 0 ] && rc ==0; ++ i )
+        {
+            const KMDataNode *node;
+
+            /* look for metadata descriptor */
+            rc = KMetadataOpenNodeRead ( meta, & node, "READ_%u", i );
+            if ( rc == 0 )
+            {
+                size_t bytes;
+                char str [ 4096 ];
+                rc = KMDataNodeReadCString ( node, str, sizeof str, & bytes );
+                KMDataNodeRelease ( node );
+                if ( rc == 0 )
+                {
+                    rc = parse_read_structure ( i, str, & rd [ i ] );
+                    if ( rc != 0 )
+                        break;
+                    last = i;
+                }
+            }
+
+        }
+
+        /* ignore all other errors */
+        rc = 0;
+
+        KMetadataRelease ( meta );
+
+        /* initial starts are always at 0 */
+        rd [ 0 ] . read_start = 0;
+        rd [ 0 ] . label_start = 0;
+
+        /* handle case when none-exist */
+        if ( last < 0 )
+        {
+            rslt -> u . ndf = equal_reads_from_spot;
+            rslt -> variant = vftNonDetRow;
+            return 0;
+        }
+
+        /* integrate lengths and count technical reads*/
+        for ( i = tech_read_cnt = 0; i < last; ++ i )
+        {
+            if ( rd [ i ] . read_type == SRA_READ_TYPE_TECHNICAL)
+                ++ tech_read_cnt;
+
+            rd [ i + 1 ] . read_start = rd [ i ] . read_start + rd [ i ] . read_len;
+            rd [ i + 1 ] . label_start = rd [ i ] . label_start + rd [ i ] . label_len;
+        }
+
+        /* temporary for cases where no read length has been given */
+        if ( tech_read_cnt == 0 && rd [ last ] . read_start + rd [ last ] . read_len == 0 )
+        {
+            rslt -> u . ndf = equal_reads_from_spot;
+            rslt -> variant = vftNonDetRow;
+            return 0;
+        }
+
+        /* now produce a static row */
+        fself = malloc ( sizeof * fself );
+        if ( fself == NULL )
+            rc = RC ( rcSRA, rcFunction, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KDataBufferMake ( fself, sizeof rd [ 0 ] * 8, ++ last );
+            if ( rc == 0 )
+            {
+                memmove ( fself -> base, rd, last * sizeof rd [ 0 ] );
+                rslt -> self = fself;
+                rslt -> whack = whack_data_buffer;
+                rslt -> u . ndf = read_seg_from_meta;
+                rslt -> variant = vftNonDetRow;
+                return 0;
+            }
+
+            free ( fself );
+        }
+    }
+
+    return rc;
+}
+
+
+static
+rc_t CC fix_read_seg ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+
+    const uint16_t *rs_src = argv [ 0 ] . u . data . base;
+    const uint32_t nreads = argv [ 0 ] . u . data . elem_count;
+    const uint32_t *spot_lenp = argv [ 1 ] . u . data . base;
+    const uint32_t spot_len = spot_lenp [ argv [ 1 ] . u . data . first_elem ];
+
+    rs_src += argv [ 0 ] . u . data . first_elem;
+
+    assert ( spot_len > 0 );
+    assert ( nreads > 0);
+    
+    rc = KDataBufferResize ( rslt -> data, nreads );
+    if ( rc == 0 )
+    {
+        uint32_t * rs_dst = rslt -> data -> base;
+        fix_read_seg_impl(rs_src, nreads, spot_len, rs_dst);
+        rslt -> elem_count = nreads;
+    }
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_fix_read_seg, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> variant = vftRow;
+    rslt -> u . rf = fix_read_seg;
+    return 0;
+}
diff --git a/libs/sraxf/rewrite-spot-name.c b/libs/sraxf/rewrite-spot-name.c
new file mode 100644
index 0000000..9af749e
--- /dev/null
+++ b/libs/sraxf/rewrite-spot-name.c
@@ -0,0 +1,223 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+
+#define SLX_COORD_LEN 10
+
+static
+int non_braindead_atoi ( const char *start, const char *end )
+{
+    int val = start [ 0 ] - '0';
+    uint32_t i, count = (uint32_t)( end - start );
+    for ( i = 1; i < count; ++ i )
+    {
+        val *= 10;
+        val += start [ i ] - '0';
+    }
+    return val;
+}
+
+static
+int scan_hex ( const char *str, int count )
+{
+    int i, val = str [ 0 ] - '0';
+    if ( val > 9 )
+        val = toupper ( str [ 0 ] ) - 'A' + 10;
+    for ( i = 1; i < count; ++ i )
+    {
+        int d = str [ i ] - '0';
+        if ( d > 9 )
+            d = toupper ( str [ i ] ) - 'A' + 10;
+        val = val << 4 | d;
+    }
+    return val;
+}
+
+static
+rc_t CC illumina_rewrite_spot_name ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    char buffer [ 64];
+    uint32_t coord_len;
+    uint32_t prefix_len;
+    unsigned int a, b, c, d;
+    KDataBuffer *dst = rslt -> data;
+
+    const char *prefix;
+    const char *skey = argv [ 0 ] . u . data . base;
+    uint64_t i, j, count = argv [ 0 ] . u . data . elem_count;
+    
+    skey += argv [ 0 ] . u . data . first_elem;
+
+    /* find last hex portion */
+    for ( i = count; i > 0; )
+    {
+        if ( ! isxdigit ( skey [ -- i ] ) )
+            break;
+    }
+
+    if ( count - i < ( SLX_COORD_LEN - 1 ) )
+    {
+        const char *end = skey + count;
+
+        /* new format */
+        for ( d = 0, j = 0, i = count; i > 0; )
+        {
+            if ( ! isdigit ( skey [ -- i ] ) )
+            {
+                j = i + 1;
+                break;
+            }
+        }
+        d = non_braindead_atoi ( & skey [ j ], end );
+        for ( c = 0, j = 0; i > 0; )
+        {
+            if ( ! isdigit ( skey [ -- i ] ) )
+            {
+                j = i + 1;
+                break;
+            }
+        }
+        c = atoi ( & skey [ j ] );
+        for ( b = 0, j = 0; i > 0; )
+        {
+            if ( ! isdigit ( skey [ -- i ] ) )
+            {
+                j = i + 1;
+                break;
+            }
+        }
+        b = atoi ( & skey [ j ] );
+        for ( a = 0, j = 0; i > 0; )
+        {
+            if ( ! isdigit ( skey [ -- i ] ) )
+            {
+                j = i + 1;
+                break;
+            }
+        }
+        a = atoi ( & skey [ j ] );
+        if ( j > 0 )
+        {
+            if ( i > 0 )
+                -- i;
+            while ( isalpha ( skey [ i ] ) )
+                ++ i;
+        }
+    }
+    else
+    {
+        a = scan_hex ( skey, 1 );
+        b = scan_hex ( & skey [ 1 ], 3 );
+        c = scan_hex ( & skey [ 4 ], 3 );
+        d = scan_hex ( & skey [ 7 ], 3 );
+        if ( count > SLX_COORD_LEN )
+        {
+            i = count - SLX_COORD_LEN;
+        }
+    }
+
+    /* generate coordinates */
+    coord_len = sprintf ( buffer, ":%d:%d:%d:%d", a, b, c, d );
+
+    /* get size of prefix */
+    if ( argc == 1 )
+    {
+        prefix = "";
+        prefix_len = 0;
+    }
+    else
+    {
+        prefix = argv [ 1 ] . u . data . base;
+        assert(argv [ 1 ] . u . data . elem_count >> 32 == 0);
+        prefix_len = (uint32_t)argv [ 1 ] . u . data . elem_count;
+        prefix += argv [ 1 ] . u . data . first_elem;
+    }
+
+    /* resize output buffer for prefix, name stuff, coordinates */
+    if ( dst -> elem_bits != 8 )
+    {
+        rc = KDataBufferCast ( dst, dst, 8, true );
+        if ( rc != 0 )
+            return rc;
+    }
+    rc = KDataBufferResize ( dst, prefix_len + i + coord_len + 1 );
+    if ( rc != 0 )
+        return rc;
+
+    /* copy in prefix, name prefix, coordinates */
+    rslt -> elem_count = sprintf ( dst -> base, "%.*s%.*s%s"
+        , ( int ) prefix_len, prefix
+        , ( int ) i, skey
+        , buffer );
+
+    return 0;
+}
+
+/* rewrite_spot_name
+ *  given an old spotname directly from skey
+ *  write according to platform rules, optionally with a prefix
+ *
+ *  "platform" [ CONST ] - which platform rules to use
+ *
+ *  "skey" [ DATA ] - skey string for row
+ *
+ *  "prefix" [ DATA, OPTIONAL ] - prefix for spot
+ */
+VTRANSFACT_IMPL ( NCBI_SRA_rewrite_spot_name, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    const uint8_t *platform = cp -> argv [ 0 ] . data . u8;
+    switch ( platform [ 0 ] )
+    {
+    case SRA_PLATFORM_ILLUMINA:
+        break;
+    default:
+        return RC ( rcSRA, rcFunction, rcConstructing, rcType, rcUnsupported );
+    }
+
+    rslt -> u . ndf = illumina_rewrite_spot_name;
+    rslt -> variant = vftNonDetRow;
+    return 0;
+}
diff --git a/libs/sraxf/rotate.c b/libs/sraxf/rotate.c
new file mode 100644
index 0000000..bf9e0a7
--- /dev/null
+++ b/libs/sraxf/rotate.c
@@ -0,0 +1,271 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+
+typedef void (*rotate_f)(void *dst, uint64_t offset, const void *src, const void *Cntrl, uint64_t vec_count);
+typedef struct self_t {
+    rotate_f f;
+} self_t;
+
+#define ROT_0(A, B) A = B
+#define ROT_1(A, B) do { (A).data[0] = (B).data[1]; (A).data[1] = (B).data[2]; (A).data[2] = (B).data[3]; (A).data[3] = (B).data[0]; } while (0)
+#define ROT_2(A, B) do { (A).data[0] = (B).data[2]; (A).data[1] = (B).data[3]; (A).data[2] = (B).data[0]; (A).data[3] = (B).data[1]; } while (0)
+#define ROT_3(A, B) do { (A).data[0] = (B).data[3]; (A).data[1] = (B).data[0]; (A).data[2] = (B).data[1]; (A).data[3] = (B).data[2]; } while (0)
+
+#define UNFUNC(VALTYPE) UNF_ ## VALTYPE
+
+#define UNFUNC_DEF(VALTYPE) \
+static void UNFUNC(VALTYPE)(void *Dst, uint64_t offset, const void *Src, const void *Cntrl, uint64_t count) { \
+    typedef struct { VALTYPE data[4]; } data4_t; \
+    data4_t *dst = (data4_t *)Dst; \
+    const data4_t *src = (const data4_t *)Src; \
+    const uint8_t *cntrl = (const uint8_t *)Cntrl; \
+    uint64_t i; \
+    dst += offset; \
+    for (i = 0; i != count; ++i) { \
+        switch(cntrl[i]) { \
+        default: \
+        case 0: \
+            ROT_0(dst[i], src[i]); \
+            break; \
+        case 1: \
+            ROT_3(dst[i], src[i]); \
+            break; \
+        case 2: \
+            ROT_2(dst[i], src[i]); \
+            break; \
+        case 3: \
+            ROT_1(dst[i], src[i]); \
+            break; \
+        }\
+    } \
+}
+
+#define FUNC(VALTYPE) F_ ## VALTYPE
+
+#define FUNC_DEF(VALTYPE) \
+static void FUNC(VALTYPE)(void *Dst, uint64_t offset, const void *Src, const void *Cntrl, uint64_t count) { \
+    typedef struct { VALTYPE data[4]; } data4_t; \
+    data4_t *dst = (data4_t *)Dst; \
+    const data4_t *src = (const data4_t *)Src; \
+    const uint8_t *cntrl = (const uint8_t *)Cntrl; \
+    uint64_t i; \
+    dst += offset; \
+    for (i = 0; i != count; ++i) { \
+        switch(cntrl[i]) { \
+        default: \
+        case 0: \
+            ROT_0(dst[i], src[i]); \
+            break; \
+        case 1: \
+            ROT_1(dst[i], src[i]); \
+            break; \
+        case 2: \
+            ROT_2(dst[i], src[i]); \
+            break; \
+        case 3: \
+            ROT_3(dst[i], src[i]); \
+            break; \
+        }\
+    } \
+}
+
+FUNC_DEF(float)
+FUNC_DEF(double)
+FUNC_DEF(uint8_t)
+FUNC_DEF(uint16_t)
+FUNC_DEF(uint32_t)
+FUNC_DEF(uint64_t)
+FUNC_DEF(int8_t)
+FUNC_DEF(int16_t)
+FUNC_DEF(int32_t)
+FUNC_DEF(int64_t)
+
+UNFUNC_DEF(float)
+UNFUNC_DEF(double)
+UNFUNC_DEF(uint8_t)
+UNFUNC_DEF(uint16_t)
+UNFUNC_DEF(uint32_t)
+UNFUNC_DEF(uint64_t)
+UNFUNC_DEF(int8_t)
+UNFUNC_DEF(int16_t)
+UNFUNC_DEF(int32_t)
+UNFUNC_DEF(int64_t)
+
+static
+rc_t CC rotate_drvr (
+                     void *Self,
+                     const VXformInfo *info,
+                     int64_t row_id,
+                     const VFixedRowResult *rslt,
+                     uint32_t argc,
+                     const VRowData argv []
+                     )
+{
+    const void *src;
+    const void *cntrl;
+    const self_t *self = (const self_t *)Self;
+    
+    assert(argv[0].u.data.elem_bits % 8 == 0);
+    assert(argv[1].u.data.elem_bits % 8 == 0);
+    
+    src   = &((const uint8_t *)argv[0].u.data.base)[(argv[0].u.data.first_elem * argv[0].u.data.elem_bits) / 8];
+    cntrl = &((const uint8_t *)argv[1].u.data.base)[(argv[1].u.data.first_elem * argv[1].u.data.elem_bits) / 8];
+    
+    self->f(rslt->base, rslt->first_elem, src, cntrl, rslt->elem_count);
+    
+    return 0;
+}
+
+static
+void CC sraxf_rotate_free_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* 
+ * function < type T > T [ 4 ] NCBI:SRA:rotate #1 < bool encode > ( T [ 4 ] in, U8 called );
+ */
+VTRANSFACT_IMPL ( NCBI_SRA_rotate, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    self_t *self;
+    bool encode;
+    
+    assert(cp->argc == 1);
+    assert(cp->argv[0].desc.domain == vtdBool);
+    assert(cp->argv[0].count == 1);
+    encode = cp->argv[0].data.b[0];
+    
+    switch (info->fdesc.desc.domain) {
+    case vtdInt:
+    case vtdUint:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+        case 16:
+        case 32:
+        case 64:
+            break;
+        default:
+            return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+            break;
+        }
+        break;
+    case vtdFloat:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 32:
+        case 64:
+            break;
+        default:
+            return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+            break;
+        }
+        break;
+    default:
+        return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+        break;
+    }
+    
+    self = malloc(sizeof(*self));
+    if (self) {
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                self->f = encode ? FUNC(int8_t) : UNFUNC(int8_t);
+                break;
+            case 16:
+                self->f = encode ? FUNC(int16_t) : UNFUNC(int16_t);
+                break;
+            case 32:
+                self->f = encode ? FUNC(int32_t) : UNFUNC(int32_t);
+                break;
+            case 64:
+                self->f = encode ? FUNC(int64_t) : UNFUNC(int64_t);
+                break;
+            default:
+                break;
+            }
+            break;
+        case vtdUint:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                self->f = encode ? FUNC(uint8_t) : UNFUNC(uint8_t);
+                break;
+            case 16:
+                self->f = encode ? FUNC(uint16_t) : UNFUNC(uint16_t);
+                break;
+            case 32:
+                self->f = encode ? FUNC(uint32_t) : UNFUNC(uint32_t);
+                break;
+            case 64:
+                self->f = encode ? FUNC(uint64_t) : UNFUNC(uint64_t);
+                break;
+            default:
+                break;
+            }
+            break;
+        case vtdFloat:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 32:
+                self->f = encode ? FUNC(float) : UNFUNC(float);
+                break;
+            case 64:
+                self->f = encode ? FUNC(double) : UNFUNC(double);
+                break;
+            default:
+                break;
+            }
+            break;
+        default:
+            break;
+        }
+        
+        rslt->self = self;
+        rslt->whack = sraxf_rotate_free_wrapper;
+        rslt->u.pf = rotate_drvr;
+        rslt->variant = vftFixedRow;
+        
+        return 0;
+    }
+    return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
diff --git a/libs/sraxf/spot-desc.c b/libs/sraxf/spot-desc.c
new file mode 100644
index 0000000..9a98fd0
--- /dev/null
+++ b/libs/sraxf/spot-desc.c
@@ -0,0 +1,102 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <string.h>
+#include <assert.h>
+
+static
+rc_t CC make_spot_desc ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const uint32_t *spot_len   = argv[0].u.data.base;
+    const uint32_t *fixed_len  = argv[1].u.data.base;
+    const uint32_t *sig_len    = argv[2].u.data.base;
+    const int32_t *trim_start  = argv[3].u.data.base;
+    const uint32_t *trim_len   = argv[4].u.data.base;
+    const uint8_t *num_reads   = argv[5].u.data.base;
+
+    SRASpotDesc *dst;
+
+    num_reads += argv[5].u.data.first_elem; /* valid for argv[0].u.data.elem_count */
+    assert( argv[5].u.data.elem_bits == (sizeof( *num_reads ) * 8 ) );
+
+    spot_len += argv[0].u.data.first_elem;
+    assert( argv[0].u.data.elem_bits == (sizeof( *spot_len ) * 8 ) );
+
+    fixed_len += argv[1].u.data.first_elem;
+    assert( argv[1].u.data.elem_bits == (sizeof( *fixed_len ) * 8 ) );
+
+    sig_len += argv[2].u.data.first_elem;
+    assert( argv[2].u.data.elem_bits == (sizeof( *sig_len ) * 8 ) );
+
+    trim_start += argv[3].u.data.first_elem;
+    assert( argv[3].u.data.elem_bits == (sizeof( *trim_start ) * 8 ) );
+
+    trim_len += argv[4].u.data.first_elem;
+    assert( argv[4].u.data.elem_bits == (sizeof( *trim_len ) * 8 ) );
+
+    rslt->data->elem_bits = sizeof(*dst) * 8;
+
+    rc = KDataBufferResize( rslt->data, 1 );
+    if ( rc == 0 )
+    {
+        dst = rslt->data->base;
+        dst->spot_len = (uint16_t)spot_len[0];
+        dst->fixed_len = (uint16_t)fixed_len[0];
+        dst->signal_len = (uint16_t)sig_len[0];
+        dst->clip_qual_right = (uint16_t)( trim_start[0]+trim_len[0] );
+        dst->num_reads = num_reads[0];
+
+        memset( dst->align, 0, sizeof( dst->align ) );
+        
+        rslt->elem_bits = sizeof(*dst) * 8;
+        rslt->elem_count = 1;
+    }
+
+    return rc;
+}
+
+/*
+  function NCBI:SRA:SpotDesc NCBI:SRA:make_spot_desc
+       ( U32 spot_len, U32 fixed_len,  U32 sig_len,
+        INSDC:coord:zero trim_start, U32 trim_len, U8 num_reads )
+
+ */
+VTRANSFACT_IMPL( NCBI_SRA_make_spot_desc, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> u . rf = make_spot_desc;
+    rslt -> variant = vftRow;
+    return 0;
+}
diff --git a/libs/sraxf/stat_mod.c b/libs/sraxf/stat_mod.c
new file mode 100644
index 0000000..b87ae3f
--- /dev/null
+++ b/libs/sraxf/stat_mod.c
@@ -0,0 +1,392 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/text.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "stat_mod.h"
+
+#define N_QUAL_VALUES 41
+#define N_DIMER_VALUES 17
+#define N_GC_VALUES 16
+#define N_HP_VALUES 25
+#define COUNTER_BLOCK_SIZE 100
+
+#define CASE_MATCH      0
+#define CASE_IGNORE     1
+#define CASE_MISMATCH   2
+#define CASE_INSERT     4
+#define CASE_DELETE     8
+
+typedef struct counter
+{
+    uint32_t count;
+} counter;
+
+
+typedef struct counter_vector
+{
+    counter *v;
+    uint32_t n_counters;
+} counter_vector;
+
+
+typedef struct spotgrp
+{
+    BSTNode node;
+    const String *name;
+    counter_vector cnv[ N_DIMER_VALUES ][ N_GC_VALUES ][ N_HP_VALUES ][ N_QUAL_VALUES ];
+} spotgrp;
+
+/******************************************************************************
+    for the spot-group ( tree-node ), contains a tree of counter's
+******************************************************************************/
+static void CC whack_spotgroup( BSTNode *n, void *data )
+{
+    spotgrp * sg = ( spotgrp * )n;
+    uint32_t idx, count;
+    count = ( ( sizeof sg->cnv ) / sizeof( sg->cnv[0] ) );
+    for ( idx = 0; idx < count; ++idx )
+    {
+        counter_vector * cv = (counter_vector *)&( sg->cnv[ idx ] );
+        if ( cv->v != NULL )
+        {
+            free( cv->v );
+        }
+    }
+    if ( sg->name != NULL )
+        StringWhack ( sg->name );
+    free( n );
+}
+
+
+static spotgrp * make_spotgrp( const char *src, const size_t len )
+{
+    spotgrp * sg = calloc( 1, sizeof sg[ 0 ] );
+    if ( sg != NULL )
+    {
+        String s;
+        StringInit( &s, src, len, len );
+        if ( StringCopy ( &sg->name, &s ) != 0 )
+        {
+            free( sg );
+            sg = NULL;
+        }
+    }
+    return sg;
+}
+
+
+static int64_t CC spotgroup_find( const void *item, const BSTNode *n )
+{
+    spotgrp * sg = ( spotgrp* ) n;
+    return StringCompare ( ( String* ) item, sg->name );
+}
+
+
+static spotgrp * find_spotgroup( statistic *self, const char *src, const size_t len )
+{
+    String s;
+    BSTNode *node;
+
+    StringInit( &s, src, len, len );
+    if ( self->last_used_spotgroup != NULL )
+    {
+        spotgrp * sg = ( spotgrp* )self->last_used_spotgroup;
+        if ( StringCompare ( &s, sg->name ) == 0 )
+            return sg;
+    }
+
+    node = BSTreeFind ( &self->spotgroups, &s, spotgroup_find );
+    if ( node == NULL )
+        return NULL;
+    else
+    {
+        self->last_used_spotgroup = node;
+        return ( spotgrp *) node;
+    }
+}
+
+
+static rc_t spotgroup_enter_values( spotgrp * spotgroup,
+                                    uint8_t const quality,
+                                    uint8_t const dimer_code,
+                                    uint8_t const gc_content,
+                                    uint8_t const hp_run,
+                                    uint32_t const cycle,
+                                    uint8_t const rd_case)
+{
+    uint8_t q = quality;
+    uint8_t d = dimer_code;
+    uint8_t g = gc_content;
+    uint8_t h = hp_run;
+    counter_vector * cv;
+
+    if ( q >= N_QUAL_VALUES ) q = ( N_QUAL_VALUES - 1 );
+    if ( d >= N_DIMER_VALUES ) d = ( N_DIMER_VALUES - 1 );
+    if ( g >= N_GC_VALUES ) g = ( N_GC_VALUES - 1 );
+    if ( h >= N_HP_VALUES ) h = ( N_HP_VALUES - 1 );
+    cv = &( spotgroup->cnv[ d ][ g ][ h ][ q ] );
+
+    if ( cv->v ==  NULL )
+    {
+        /* the counter-block was not used before at all */
+        cv->n_counters = ( ( cycle / COUNTER_BLOCK_SIZE ) + 1 ) * COUNTER_BLOCK_SIZE;
+        cv->v = calloc( cv->n_counters, sizeof cv->v[0] );
+        if ( cv->v == NULL )
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted );
+    }
+    else
+    {
+        if ( cycle >= cv->n_counters )
+        {
+            /* the counter-block has to be extended */
+            void * tmp;
+            uint32_t org_len = cv->n_counters;
+            counter *to_zero_out;
+            
+            cv->n_counters = ( ( cycle / COUNTER_BLOCK_SIZE ) + 1 ) * COUNTER_BLOCK_SIZE;
+            /* prevent from leaking memory by capturing the new pointer in temp. var. */
+            tmp = realloc( cv->v, cv->n_counters * ( sizeof cv->v[0] ) );
+            if ( tmp == NULL )
+	            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted );
+
+			/* the added part has to be set to zero */
+			to_zero_out = tmp;
+			to_zero_out += org_len;
+			memset( to_zero_out, 0, ( cv->n_counters - org_len ) * ( sizeof *to_zero_out ) );
+			cv->v = tmp;
+        }
+    }
+    assert( cycle < cv->n_counters );
+
+    {
+        counter * cnt = &( cv->v[ cycle ] );
+        
+        ++cnt->count;
+    }
+    return 0;
+}
+
+
+static int64_t CC spotgroup_sort( const BSTNode *item, const BSTNode *n )
+{
+    spotgrp * sg1 = ( spotgrp* ) item;
+    spotgrp * sg2 = ( spotgrp* ) n;
+    return StringCompare ( sg1->name, sg2->name );
+}
+
+
+/******************************************************************************
+    for the statistic ( tree-node ), contains a tree of spot-groups's
+******************************************************************************/
+
+
+rc_t make_statistic( statistic *self,
+                     uint32_t gc_window,
+                     bool has_alignments )
+{
+    memset( self, 0, sizeof *self );
+    
+    BSTreeInit( &self->spotgroups );
+    self->last_used_spotgroup = NULL;
+    self->gc_window = gc_window > N_GC_VALUES ? N_GC_VALUES : gc_window;
+    
+    return 0;
+}
+
+
+void whack_statistic( statistic *self )
+{
+    BSTreeWhack ( &self->spotgroups, whack_spotgroup, NULL );
+}
+
+static rc_t validate_row_data(statistic const *self, 
+                              row_input const *row_data)
+{
+    rc_t rc = RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+    unsigned const n_bases = row_data->read_len;
+    
+    if (row_data->read == NULL || row_data->quality == NULL) {
+        return rc;
+    }
+    if (n_bases != row_data->quality_len) {
+        return rc;
+    }
+    return 0;
+}
+
+rc_t extract_statistic_from_row(statistic *self, 
+                                row_input const *data)
+{
+    rc_t rc = 0;
+    spotgrp *sg;
+    char const *spotgrp_base;
+    uint32_t spotgrp_len;
+    unsigned i;
+    uint8_t lb = 4;
+    unsigned hpr = 0;
+    unsigned gcc = 0;
+    
+    if (data == NULL) {
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcNull);
+    }
+    if (self == NULL) {
+        return RC(rcXF, rcFunction, rcExecuting, rcSelf, rcNull);
+    }
+    rc = validate_row_data(self, data);
+    if (rc)
+        return rc;
+    
+    spotgrp_base = data->spotgroup;
+    spotgrp_len = data->spotgroup_len;
+    
+    if (spotgrp_base == NULL || spotgrp_len == 0) {
+        spotgrp_base = "";
+        spotgrp_len = 0;
+    }
+
+    sg = find_spotgroup( self, spotgrp_base, spotgrp_len );
+    if ( sg == NULL )
+    {
+        sg = make_spotgrp( spotgrp_base, spotgrp_len );
+        if ( sg == NULL )
+        {
+            return RC( rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted );
+        }
+        else
+        {
+            rc = BSTreeInsert ( &self->spotgroups, (BSTNode *)sg, spotgroup_sort );
+            if (rc)
+                return rc;
+        }
+    }
+    for (i = 0; i < data->read_len && rc == 0; ++i) {
+        unsigned const base = data->read[i];
+        unsigned dimer;
+
+        if (base > 3) {
+            dimer = 16;
+            hpr = 0;
+        }
+        else {
+            dimer = (lb > 3) ? 16 : ((lb << 2) | base);
+            if (lb == base)
+                ++hpr;
+            else
+                hpr = 0;
+        }
+        if (i > 0)
+            rc = spotgroup_enter_values(sg, data->quality[i], dimer, gcc, hpr, data->base_pos_offset + i, CASE_MATCH);
+
+        if (base == 1 || base == 2)
+            ++gcc;
+        if (i >= self->gc_window) {
+            unsigned const out = data->read[i - self->gc_window];
+            
+            if (out == 1 || out == 2)
+                --gcc;
+        }
+        lb = base;
+	}
+    return rc;
+}
+
+
+typedef struct iter_ctx
+{
+    bool ( CC * f ) ( stat_row const * row, void *data );
+    void * data;
+    const char * name;
+    bool run;
+    stat_row row;
+    uint64_t n;
+} iter_ctx;
+
+
+static bool CC spotgroup_iter( BSTNode *n, void *data )
+{
+    spotgrp *sg = ( spotgrp * ) n;
+    iter_ctx *ctx = ( iter_ctx * )data;
+    static char const *dimer_chars[] = {
+        "AA", "AC", "AG", "AT",
+        "CA", "CC", "CG", "CT",
+        "GA", "GC", "GG", "GT",
+        "TA", "TC", "TG", "TT",
+        "NN"
+    };
+
+    ctx->row.spotgroup = (char *)sg->name->addr;
+    for ( ctx->row.quality = 0; ctx->row.quality < N_QUAL_VALUES && ctx->run; ++ctx->row.quality )
+    {
+        uint8_t dimer_nr;
+        for ( dimer_nr = 0; dimer_nr < N_DIMER_VALUES && ctx->run; ++dimer_nr )
+        {
+            ctx->row.dimer = dimer_chars[dimer_nr];
+            for( ctx->row.gc_content = 0; ctx->row.gc_content < N_GC_VALUES; ++ctx->row.gc_content )
+            {
+                for ( ctx->row.hp_run = 0; ctx->row.hp_run < N_HP_VALUES && ctx->run; ++ctx->row.hp_run )
+                {
+                    uint32_t pos;
+                    counter_vector * cv = &sg->cnv[ dimer_nr ][ ctx->row.gc_content ][ ctx->row.hp_run ][ ctx->row.quality ];
+                    for ( pos = 0; pos < cv->n_counters; ++pos )
+                    {
+                        counter * c = &cv->v[ pos ];
+                        if ( c->count > 0 )
+                        {
+                            ctx->row.base_pos = pos;
+                            ctx->row.count = c->count;
+
+                            ctx->run = ctx->f( &ctx->row, ctx->data );
+                            ctx->n++;
+                         }
+                    }
+                }
+            }
+        }
+    }
+    return( !ctx->run );
+}
+
+
+uint64_t foreach_statistic( statistic * self,
+    bool ( CC * f ) ( stat_row const * row, void * f_data ), void *f_data )
+{
+    iter_ctx ctx;
+    ctx.f = f;
+    ctx.data = f_data;
+    ctx.run = true;
+    ctx.n = 0;
+    BSTreeDoUntil ( &self->spotgroups, false, spotgroup_iter, &ctx );
+    return ctx.n;
+}
diff --git a/libs/sraxf/stat_mod.h b/libs/sraxf/stat_mod.h
new file mode 100644
index 0000000..879d99f
--- /dev/null
+++ b/libs/sraxf/stat_mod.h
@@ -0,0 +1,80 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/defs.h>
+#include <klib/container.h>
+#include <klib/data-buffer.h>
+
+#define COUNT_INDELS 0
+
+typedef struct row_input
+{
+    char const * spotgroup;
+    uint32_t spotgroup_len;
+
+    uint8_t const * read;
+    uint32_t read_len;
+
+    uint8_t const * quality;
+    uint32_t quality_len;
+
+    uint32_t base_pos_offset;
+} row_input;
+
+
+typedef struct stat_row
+{
+    char const *spotgroup;
+    char const *dimer;
+    uint32_t base_pos;
+    uint32_t count;
+    uint8_t quality;
+    uint8_t hp_run;
+    uint8_t gc_content;
+} stat_row;
+
+
+typedef struct statistic
+{
+    void * last_used_spotgroup;
+    uint32_t gc_window;
+    BSTree spotgroups;      /* the tree contains 'spotgrp'-node, it collects the statistic */
+} statistic;
+
+
+/*************** the STATISTIC GATHERER ***************/
+rc_t make_statistic( statistic *data,
+                     uint32_t gc_window,
+                     bool ignore_mismatches );
+
+
+rc_t extract_statistic_from_row( statistic * data, 
+                                 row_input const *row_data);
+
+uint64_t foreach_statistic( statistic * data,
+    bool ( CC * f ) ( stat_row const * row, void * f_data ), void *f_data );
+
+void whack_statistic( statistic *data );
diff --git a/libs/sraxf/stats.c b/libs/sraxf/stats.c
new file mode 100644
index 0000000..3c26299
--- /dev/null
+++ b/libs/sraxf/stats.c
@@ -0,0 +1,764 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <kdb/meta.h>
+#include <os-native.h> /* strncasecmp */
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#define MAX_GROUP_COUNT (30000u)
+#define STATS_NODE_NAME_ATTR "name"
+
+static int string_buffer_add(KDataBuffer *const self,
+                             unsigned const len, char const name[/* len */])
+{
+    size_t const rslt = self->elem_count;
+    size_t const newsize = rslt + len;
+    
+    if (KDataBufferResize(self, newsize) != 0)
+        return -1;
+    
+#if 1
+    PLOGMSG(klogInfo, (klogInfo, "New spot group '$(NAME)'", "NAME=%.*s", (int)len, name));
+#endif
+    
+    memmove(((char *)self->base) + rslt, name, len);
+    
+    return (int)rslt;
+}
+
+typedef uint64_t count_t;
+typedef int64_t spot_t;
+#define MAX_SPOT_ID INT64_MAX
+#define MIN_SPOT_ID INT64_MIN
+
+typedef struct group_stats_s group_stats_t;
+typedef struct stats_data_s stats_data_t;
+
+struct group_stats_s {
+    count_t spot_count;
+    count_t base_count;
+    count_t bio_base_count;
+    count_t cmp_base_count;
+    spot_t  spot_min;
+    spot_t  spot_max;
+    unsigned name_offset;
+    unsigned name_len;
+    unsigned node_name;
+};
+
+static void group_stats_init(group_stats_t *const self,
+                             unsigned const offset,
+                             unsigned const length,
+                             unsigned const node_name)
+{
+    memset(self, 0, sizeof(*self));
+    self->name_offset = offset;
+    self->name_len = length;
+    self->node_name = node_name;
+    self->spot_min = MAX_SPOT_ID;
+    self->spot_max = MIN_SPOT_ID;
+}
+
+#define STATS_DATA_MRU_COUNT 3
+struct stats_data_s {
+    rc_t (*update)(stats_data_t *self,
+                   int64_t spot_id,
+                   uint32_t spot_len,
+                   uint32_t bio_spot_len,
+                   uint32_t cmp_spot_len,
+                   const char *grp,
+                   uint64_t grp_len);
+    rc_t (*write)(group_stats_t const *const self, KMDataNode *const node);
+    rc_t (*write_all)(stats_data_t *const self);
+    KMetadata *meta;
+    KDataBuffer names;
+    KDataBuffer group;
+    unsigned count;
+    group_stats_t *mru[STATS_DATA_MRU_COUNT];
+    group_stats_t table;
+    group_stats_t deflt;
+};
+
+static char *get_name(stats_data_t *const self, unsigned const idx)
+{
+    return ((char *)self->names.base) + idx;
+}
+
+static group_stats_t *get_group(stats_data_t *const self, unsigned const idx)
+{
+    return ((group_stats_t *)self->group.base) + idx;
+}
+
+static void stats_data_invald_mru(stats_data_t *const self) {
+    memset(self->mru, 0, sizeof(self->mru));
+}
+
+static void stats_data_update_mru(stats_data_t *const self, group_stats_t *const mru)
+{
+    if (self->mru[0] != mru) {
+        group_stats_t *newmru[STATS_DATA_MRU_COUNT];
+        unsigned di;
+        unsigned si;
+        
+        memset(newmru, 0, sizeof(self->mru));
+        newmru[0] = mru;
+        for (di = 1, si = 0; di < STATS_DATA_MRU_COUNT && si < STATS_DATA_MRU_COUNT; ++si) {
+            group_stats_t *const u = self->mru[si];
+            
+            if (u != mru) {
+                newmru[di] = u;
+                ++di;
+            }
+        }
+        memmove(self->mru, newmru, sizeof(newmru));
+    }
+}
+
+static int stats_data_name_cmp(stats_data_t *const self,
+                               group_stats_t const *const B,
+                               unsigned const Alen,
+                               char const Aname[])
+{
+    unsigned const Blen = B->name_len;
+    char const *const Bname = get_name(self, B->name_offset);
+    unsigned Ai;
+    unsigned Bi;
+    
+    for (Ai = Bi = 0; Ai < Alen && Bi < Blen; ++Ai, ++Bi) {
+        int const a = toupper(Aname[Ai]);
+        int const b = toupper(Bname[Bi]);
+        int const diff = a - b;
+        
+        if (diff != 0)
+            return diff;
+    }
+    return Alen - Blen;
+}
+
+static int stats_data_name_cmp_idx(stats_data_t *const self,
+                                   unsigned const idx,
+                                   unsigned const Alen,
+                                   char const Aname[])
+{
+    group_stats_t const *const B = get_group(self, idx);
+    return stats_data_name_cmp(self, B, Alen, Aname);
+}
+
+/* the return value is either where name was found or where it should go */
+static unsigned stats_data_search(stats_data_t *const self,
+                                        unsigned const len,
+                                        char const name[])
+{
+    unsigned f = 0;
+    unsigned e = self->count;
+    
+    while (f < e) {
+        unsigned const m = f + (e - f) / 2;
+        int const diff = stats_data_name_cmp_idx(self, m, len, name);
+        
+        if (diff < 0)
+            e = m;
+        else if (diff > 0)
+            f = m + 1;
+        else
+            return m;
+    }
+    return f;
+}
+
+static group_stats_t *stats_data_get_group(stats_data_t *const self,
+                                           unsigned const len,
+                                           char const name[])
+{
+    unsigned i;
+    unsigned which;
+    group_stats_t *fnd;
+    
+    for (i = 0; i < STATS_DATA_MRU_COUNT && i < self->count; ++i) {
+        group_stats_t *const k = self->mru[i];
+        
+        if (k && stats_data_name_cmp(self, k, len, name) == 0) {
+            fnd = k;
+            goto UPDATE_MRU;
+        }
+    }
+    which = stats_data_search(self, len, name);
+    if (which < self->count && stats_data_name_cmp_idx(self, which, len, name) == 0)
+        fnd = get_group(self, which);
+    else {
+        int const offset = string_buffer_add(&self->names, len, name);
+        unsigned const move = self->count - which;
+        
+        if (offset < 0)
+            return NULL;
+        
+        if (++self->count > MAX_GROUP_COUNT)
+            return get_group(self, MAX_GROUP_COUNT);
+        
+        if (KDataBufferResize(&self->group, self->count) != 0)
+            return NULL;
+        
+        fnd = get_group(self, which);
+        assert(fnd + move + 1 <= get_group(self, self->count) || move == 0);
+        memmove(fnd + 1, fnd, move * sizeof(*fnd));
+        
+        group_stats_init(fnd, offset, len, self->count);
+        stats_data_invald_mru(self);
+    }
+UPDATE_MRU:
+    stats_data_update_mru(self, fnd);
+    return fnd;
+}
+
+static rc_t group_stats_write_node(KMDataNode *const node,
+                                   char const name[],
+                                   void const *const value)
+{
+    KMDataNode *subnode;
+    rc_t rc = KMDataNodeOpenNodeUpdate(node, &subnode, "%s", name);
+    if (rc == 0) {
+        rc = KMDataNodeWriteB64(subnode, value);
+        KMDataNodeRelease(subnode);
+    }
+    return rc;
+}
+
+static rc_t group_stats_write_name(KMDataNode *const node,
+                                   unsigned const namelen,
+                                   char const name[/* namelen */])
+{
+    char        sbuf[4096];
+    char *const hbuf   = (namelen + 1) < sizeof(sbuf) ? NULL : malloc(namelen + 1);
+    char *const buffer = (namelen + 1) < sizeof(sbuf) ? sbuf : hbuf;
+    
+    if (buffer == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+
+    memmove(buffer, name, namelen);
+    buffer[namelen] = '\0';
+    {
+        rc_t const rc = KMDataNodeWriteAttr(node, STATS_NODE_NAME_ATTR, buffer);
+            
+        free(hbuf);
+        return rc;
+    }
+}
+
+#define RC_THROW(STMT) do { rc_t const rc = (STMT); if (rc) return rc; } while(0)
+
+static rc_t group_stats_write_no_compressed(group_stats_t const *const self,
+                                            KMDataNode *const node)
+{
+    RC_THROW(group_stats_write_node(node, "SPOT_COUNT"    , &self->spot_count    ));
+    RC_THROW(group_stats_write_node(node, "BASE_COUNT"    , &self->base_count    ));
+    RC_THROW(group_stats_write_node(node, "BIO_BASE_COUNT", &self->bio_base_count));
+    RC_THROW(group_stats_write_node(node, "SPOT_MIN"      , &self->spot_min      ));
+    RC_THROW(group_stats_write_node(node, "SPOT_MAX"      , &self->spot_max      ));
+    
+    return 0;
+}
+
+static rc_t group_stats_write_compressed(group_stats_t const *const self,
+                                         KMDataNode *const node)
+{
+    RC_THROW(group_stats_write_no_compressed(self, node));
+    RC_THROW(group_stats_write_node(node, "CMP_BASE_COUNT", &self->cmp_base_count));
+    
+    return 0;
+}
+
+static rc_t group_stats_write_1(group_stats_t const *const self,
+                                stats_data_t const *const parent,
+                                unsigned const namelen,
+                                char const name[/* namelen */],
+                                KMDataNode *const node)
+{
+    RC_THROW(group_stats_write_name(node, namelen, name));
+    RC_THROW(parent->write(self, node));
+
+    return 0;
+}
+
+static rc_t group_stats_write(group_stats_t const *const self,
+                              stats_data_t const *const parent,
+                              char const strings[])
+{
+    static char const namebase[] = "STATS/SPOT_GROUP/";
+    char namepath[sizeof(namebase) + 3]; /* sizeof(namebase) includes terminator */
+    char *const name = namepath + sizeof(namebase) - 1;
+    unsigned nodeid = self->node_name - 1;
+    KMDataNode *node;
+    rc_t rc;
+
+    memmove(namepath, namebase, sizeof(namebase));
+    name[4] = '\0';
+    name[3] = nodeid % 26 + 'A'; nodeid /= 26;
+    name[2] = nodeid % 26 + 'A'; nodeid /= 26;
+    name[1] = nodeid % 26 + 'A'; nodeid /= 26;
+    name[0] = nodeid % 26 + 'A'; nodeid /= 26;
+    
+    RC_THROW(KMetadataOpenNodeUpdate(parent->meta, &node, "%s", namepath));
+
+    rc = group_stats_write_1(self, parent,
+                             self->name_len,
+                             strings + self->name_offset,
+                             node);
+    KMDataNodeRelease(node);
+    
+    return rc;
+}
+
+static rc_t group_stats_write_default(group_stats_t const *const self,
+                                      stats_data_t const *const parent)
+{
+    KMDataNode *node;
+    rc_t rc;
+    
+    RC_THROW(KMetadataOpenNodeUpdate(parent->meta, &node, "STATS/SPOT_GROUP/default"));
+
+    rc = parent->write(self, node);
+    KMDataNodeRelease(node);
+    
+    return rc;
+}
+
+static rc_t group_stats_write_table(group_stats_t const *const self,
+                                    stats_data_t const *const parent)
+{
+    KMDataNode *node;
+    rc_t rc;
+    
+    RC_THROW(KMetadataOpenNodeUpdate(parent->meta, &node, "STATS/TABLE"));
+
+    rc = parent->write(self, node);
+    KMDataNodeRelease(node);
+    
+    return rc;
+}
+
+static rc_t stats_data_write_table(stats_data_t *const self)
+{
+    RC_THROW(group_stats_write_table(&self->table, self));
+    return 0;
+}
+
+static rc_t stats_data_write_all(stats_data_t *const self)
+{
+    unsigned i;
+
+    RC_THROW(stats_data_write_table(self));
+    if (self->count <= MAX_GROUP_COUNT) {
+        if (self->deflt.spot_count != 0)
+            RC_THROW(group_stats_write_default(&self->deflt, self));
+        RC_THROW(group_stats_write_table(&self->table, self));
+        for (i = 0; i < self->count; ++i) {
+            RC_THROW(group_stats_write(get_group(self, i), self, self->names.base));
+        }
+    }
+    return 0;
+}
+
+static
+void CC stats_data_whack(void *const data)
+{
+    stats_data_t *const self = data;
+    
+    self->write_all(self);
+    KDataBufferWhack(&self->group);
+    KDataBufferWhack(&self->names);
+    KMetadataRelease(self->meta);
+    free(self);
+}
+
+static void group_stats_update(group_stats_t *const self,
+                               spot_t const spot_id,
+                               INSDC_coord_len const spot_len,
+                               INSDC_coord_len const bio_spot_len,
+                               INSDC_coord_len const cmp_spot_len
+                               )
+{
+    if (spot_id) {
+        ++self->spot_count;
+        if (self->spot_max < spot_id)
+            self->spot_max = spot_id;
+        if (self->spot_min > spot_id)
+            self->spot_min = spot_id;
+    }
+    self->base_count     += spot_len;
+    self->bio_base_count += bio_spot_len;
+    self->cmp_base_count += cmp_spot_len;
+}
+
+static
+rc_t stats_data_update_table(stats_data_t *self,
+                             int64_t spot_id,
+                             uint32_t spot_len,
+                             uint32_t bio_spot_len,
+                             uint32_t cmp_spot_len,
+                             char const grp[],
+                             uint64_t grp_len);
+
+static
+rc_t stats_data_update_all(stats_data_t *self,
+                           int64_t spot_id,
+                           uint32_t spot_len,
+                           uint32_t bio_spot_len,
+                           uint32_t cmp_spot_len,
+                           char const grp[],
+                           uint64_t grp_len);
+
+static void stats_data_init_funcs(stats_data_t *const self, bool has_spot_groups)
+{
+    self->update    = has_spot_groups ? stats_data_update_all : stats_data_update_table;
+    self->write_all = has_spot_groups ? stats_data_write_all  : stats_data_write_table;
+}
+
+static
+rc_t stats_data_update_table(stats_data_t *self,
+                             int64_t spot_id,
+                             uint32_t spot_len,
+                             uint32_t bio_spot_len,
+                             uint32_t cmp_spot_len,
+                             char const grp[],
+                             uint64_t grp_len)
+{
+    group_stats_update(&self->table, spot_id, spot_len, bio_spot_len, cmp_spot_len);
+    return 0;
+}
+
+static
+rc_t stats_data_update_group(stats_data_t *self,
+                             int64_t spot_id,
+                             uint32_t spot_len,
+                             uint32_t bio_spot_len,
+                             uint32_t cmp_spot_len,
+                             char const grp[],
+                             uint64_t grp_len)
+{
+    if (grp_len == 0 || grp == NULL || grp[0] == '\0' ||
+        (grp_len == 7 && strncasecmp("default", grp, 7) == 0))
+    {
+        group_stats_update(&self->deflt, spot_id, spot_len, bio_spot_len, cmp_spot_len);
+    }
+    else
+    {
+        group_stats_t *const fnd = stats_data_get_group(self, (unsigned)grp_len, grp);
+        
+        if (fnd == NULL)
+            return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+        
+        if (fnd - get_group(self, 0) < MAX_GROUP_COUNT)
+            group_stats_update(fnd, spot_id, spot_len, bio_spot_len, cmp_spot_len);
+        else {
+            KDataBufferWhack(&self->group);
+            KDataBufferWhack(&self->names);
+            stats_data_init_funcs(self, false);
+            (void)PLOGMSG(klogWarn, (klogWarn, "Too many spot groups ($(count)); dropping group stats", "count=%u", (unsigned)(self->count)));
+        }
+    }
+    return 0;
+}
+
+static
+rc_t stats_data_update_all(stats_data_t *self,
+                           int64_t spot_id,
+                           uint32_t spot_len,
+                           uint32_t bio_spot_len,
+                           uint32_t cmp_spot_len,
+                           const char *grp,
+                           uint64_t grp_len)
+{
+    stats_data_update_table(self, spot_id, spot_len, bio_spot_len, cmp_spot_len, 0, 0);
+    return stats_data_update_group(self, spot_id, spot_len, bio_spot_len, cmp_spot_len, grp, grp_len);
+}
+
+static rc_t stats_data_init(stats_data_t *const self,
+                            VTable *const tbl,
+                            bool has_spot_group,
+                            bool compressed)
+{
+    stats_data_init_funcs(self, has_spot_group);
+    self->write  = compressed ? group_stats_write_compressed : group_stats_write_no_compressed;
+    
+    group_stats_init(&self->table, 0, 0, 0);
+    group_stats_init(&self->deflt, 0, 0, 0);
+
+    RC_THROW(VTableOpenMetadataUpdate(tbl, &self->meta));
+    if (has_spot_group) {
+        RC_THROW(KDataBufferMakeBytes(&self->names, 0));
+        RC_THROW(KDataBufferMake(&self->group, sizeof(group_stats_t) * 8, 0));
+    }
+    return 0;
+}
+
+static
+rc_t stats_data_make(stats_data_t **const pself,
+                     VTable *const tbl,
+                     bool has_spot_group,
+                     bool compressed)
+{
+    rc_t rc = 0;
+    stats_data_t *const self = calloc(1, sizeof(*self));
+    
+    if (self) {
+        rc = stats_data_init(self, tbl, has_spot_group, compressed);
+        if (rc == 0) {
+            *pself = self;
+            return 0;
+        }
+        KMetadataRelease(self->meta);
+        free(self);
+    }
+    return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
+
+static
+rc_t CC stats_data_update(stats_data_t* self,
+    const int64_t spot_id, const uint32_t spot_len,
+    const uint32_t bio_spot_len, const uint32_t cmp_spot_len,
+    bool has_grp, const char* grp, uint64_t grp_len)
+{
+    return self->update(self, spot_id, spot_len, bio_spot_len, cmp_spot_len, grp, grp_len);
+}
+
+static
+rc_t CC stats_data_trigger(void *data, const VXformInfo *info, int64_t row_id,
+                               VRowResult *rslt, uint32_t argc, const VRowData argv[])
+{
+    uint32_t i, bio_spot_len;
+    const char* grp = NULL;
+    uint64_t len = 0;
+
+    uint32_t spot_len = argv[0].u.data.elem_count;
+    /* take nreads from read_len */
+    uint32_t nreads = argv[1].u.data.elem_count;
+    /* get read_len and read_type */
+    const INSDC_coord_len *read_len = argv[1].u.data.base;
+    const INSDC_SRA_xread_type *read_type = argv[2].u.data.base;
+    read_len += argv[1].u.data.first_elem;
+    read_type += argv[2].u.data.first_elem;
+
+    assert(argc >= 3 && argc <= 4);
+    assert(nreads == argv[2].u.data.elem_count);
+
+    for(i = bio_spot_len = 0; i < nreads; i++) {
+        if( (read_type[i] & SRA_READ_TYPE_BIOLOGICAL) != 0 ) {
+            bio_spot_len += read_len[i];
+        }
+    }
+    if( argc == 4 ) {
+        /* get group name and length */
+        grp = argv[3].u.data.base;
+        len = argv[3].u.data.elem_count;
+        grp += argv[3].u.data.first_elem;
+    }
+    return stats_data_update(data, row_id, spot_len, bio_spot_len, 0, argc == 4, grp, len);
+}
+
+static
+rc_t CC stats_data_cmp_trigger(void *data, const VXformInfo *info, int64_t row_id,
+                                   VRowResult *rslt, uint32_t argc, const VRowData argv[])
+{
+    uint32_t i, bio_spot_len;
+    const char* grp = NULL;
+    uint64_t len = 0;
+
+    uint32_t cmp_spot_len = argv[0].u.data.elem_count;
+    uint32_t spot_len = argv[1].u.data.elem_count;
+    /* take nreads from read_len */
+    uint32_t nreads = argv[2].u.data.elem_count;
+    /* get read_len and read_type */
+    const INSDC_coord_len *read_len = argv[2].u.data.base;
+    const INSDC_SRA_xread_type *read_type = argv[3].u.data.base;
+    read_len += argv[2].u.data.first_elem;
+    read_type += argv[3].u.data.first_elem;
+
+    assert(data != NULL);
+    assert(argc >= 4 && argc <= 5);
+    assert(nreads == argv[3].u.data.elem_count);
+
+    for(i = bio_spot_len = 0; i < nreads; i++) {
+        if( (read_type[i] & SRA_READ_TYPE_BIOLOGICAL) != 0 ) {
+            bio_spot_len += read_len[i];
+        }
+    }
+    if( argc == 5 ) {
+        /* get group name and length */
+        grp = argv[4].u.data.base;
+        len = argv[4].u.data.elem_count;
+        grp += argv[4].u.data.first_elem;
+    }
+    return stats_data_update(data, row_id, spot_len, bio_spot_len, cmp_spot_len, argc == 5, grp, len);
+}
+
+static
+rc_t CC stats_data_cmpf_trigger(void *data, const VXformInfo *info, int64_t row_id,
+                                   VRowResult *rslt, uint32_t argc, const VRowData argv[])
+{
+    uint32_t i, bio_spot_len;
+    const char* grp = NULL;
+    uint64_t len = 0;
+
+    uint32_t cmp_spot_len = argv[0].u.data.elem_count;
+    const uint32_t* spot_len = argv[1].u.data.base;
+    /* take nreads from read_len */
+    uint32_t nreads = argv[2].u.data.elem_count;
+    /* get read_len and read_type */
+    const INSDC_coord_len *read_len = argv[2].u.data.base;
+    const INSDC_SRA_xread_type *read_type = argv[3].u.data.base;
+    spot_len += argv[1].u.data.first_elem;
+    read_len += argv[2].u.data.first_elem;
+    read_type += argv[3].u.data.first_elem;
+
+    assert(data != NULL);
+    assert(argc >= 4 && argc <= 5);
+    assert(nreads == argv[3].u.data.elem_count);
+
+    for(i = bio_spot_len = 0; i < nreads; i++) {
+        if( (read_type[i] & SRA_READ_TYPE_BIOLOGICAL) != 0 ) {
+            bio_spot_len += read_len[i];
+        }
+    }
+    if( argc == 5 ) {
+        /* get group name and length */
+        grp = argv[4].u.data.base;
+        len = argv[4].u.data.elem_count;
+        grp += argv[4].u.data.first_elem;
+    }
+    return stats_data_update(data, row_id, *spot_len, bio_spot_len, cmp_spot_len, argc == 5, grp, len);
+}
+
+static
+rc_t CC stats_data_csra2_trigger(void *data, const VXformInfo *info, int64_t row_id,
+                                 VRowResult *rslt, uint32_t argc, const VRowData argv[])
+{
+    uint32_t bio_spot_len;
+    const char* grp = NULL;
+    uint64_t len = 0;
+    
+    uint32_t read_len = argv[0].u.data.elem_count;
+    bio_spot_len = read_len;
+    
+    assert(argc >= 1 && argc <= 2);
+    
+    if( argc == 2 ) {
+        assert(1 == argv[1].u.data.elem_count);
+        
+        /* get group name and length */
+        grp = argv[1].u.data.base;
+        len = argv[1].u.data.elem_count;
+        grp += argv[1].u.data.first_elem;
+    }
+    return stats_data_update(data, row_id, read_len, bio_spot_len, 0, argc == 2, grp, len);
+}
+
+
+VTRANSFACT_IMPL ( NCBI_SRA_stats_trigger, 1, 0, 0 )
+    ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    stats_data_t *data;
+
+    assert(dp->argc >= 3 && dp->argc <= 4);
+
+    if( (rc = stats_data_make(&data, (VTable*)info->tbl, dp->argc > 3, false)) == 0 ) {
+        rslt->self = data;
+        rslt->whack = stats_data_whack;
+        rslt->variant = vftNonDetRow;
+        rslt->u.rf = stats_data_trigger;
+    }
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_cmp_stats_trigger, 1, 0, 0 )
+    ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    stats_data_t *data;
+
+    assert(dp->argc >= 4 && dp->argc <= 5);
+
+    if( (rc = stats_data_make(&data, (VTable*)info->tbl, dp->argc > 4, true)) == 0 ) {
+        rslt->self = data;
+        rslt->whack = stats_data_whack;
+        rslt->variant = vftNonDetRow;
+        rslt->u.rf = stats_data_cmp_trigger;
+    }
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_cmpf_stats_trigger, 1, 0, 0 )
+    ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    stats_data_t *data;
+
+    assert(dp->argc >= 4 && dp->argc <= 5);
+
+    if( (rc = stats_data_make(&data, (VTable*)info->tbl, dp->argc > 4, true)) == 0 ) {
+        rslt->self = data;
+        rslt->whack = stats_data_whack;
+        rslt->variant = vftNonDetRow;
+        rslt->u.rf = stats_data_cmpf_trigger;
+    }
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_csra2_stats_trigger, 1, 0, 0 )
+    ( const void * self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    stats_data_t *data;
+    
+    assert(dp->argc >= 1 && dp->argc <= 2);
+    
+    if( (rc = stats_data_make(&data, (VTable*)info->tbl, dp->argc > 1, false)) == 0 ) {
+        rslt->self = data;
+        rslt->whack = stats_data_whack;
+        rslt->variant = vftNonDetRow;
+        rslt->u.rf = stats_data_csra2_trigger;
+    }
+    return rc;
+}
diff --git a/libs/sraxf/stats_quality.c b/libs/sraxf/stats_quality.c
new file mode 100644
index 0000000..ddc42a3
--- /dev/null
+++ b/libs/sraxf/stats_quality.c
@@ -0,0 +1,132 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <kdb/meta.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#define MAX_QUALITY (256)
+
+typedef struct phred_stats_data_struct {
+    KMetadata* meta;
+    KMDataNode* root;
+    uint64_t count[MAX_QUALITY];
+} phred_stats_data;
+
+static
+void CC phred_stats_whack( void *data )
+{
+    uint32_t i;
+    phred_stats_data* self = data;
+
+    for(i = 0; i < MAX_QUALITY; i++) {
+        if( self->count[i] > 0 ) {
+            KMDataNode* node;
+            if( KMDataNodeOpenNodeUpdate(self->root, &node, "PHRED_%u", i) == 0 ) {
+                KMDataNodeWriteB64(node, &self->count[i]);
+                KMDataNodeRelease(node);
+            }
+        }
+    }
+    KMDataNodeRelease(self->root);
+    KMetadataRelease(self->meta);
+    free(self);
+}
+
+static
+rc_t phred_stats_make(phred_stats_data** self, VTable* vtbl)
+{
+    rc_t rc = 0;
+    phred_stats_data* data = calloc(1, sizeof(*data));
+
+    assert(self != NULL && vtbl != NULL);
+
+    if( data == NULL ) {
+        rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    } else if( (rc = VTableOpenMetadataUpdate(vtbl, &data->meta)) == 0 ) {
+        rc = KMetadataOpenNodeUpdate(data->meta, &data->root, "STATS/QUALITY");
+    }
+    if( rc == 0 ) {
+        *self = data;
+    } else {
+        phred_stats_whack(data);
+    }
+    return rc;
+}
+
+static
+rc_t CC phred_stats_trigger(void *data, const VXformInfo *info, int64_t row_id,
+                              VRowResult *rslt, uint32_t argc, const VRowData argv[])
+{
+    rc_t rc = 0;
+    phred_stats_data* self = data;
+    uint64_t len;
+
+    assert(self != NULL);
+    assert(argc == 1);
+    assert(argv[0].u.data.elem_bits == (sizeof(INSDC_quality_phred) * 8));
+
+    len = argv[0].u.data.elem_count;
+    if( len > 0 ) {
+        const INSDC_quality_phred* q = argv[0].u.data.base;
+        assert(argv[0].u.data.base != NULL);
+        q += argv[0].u.data.first_elem;
+        do {
+            self->count[q[--len]]++;
+        } while( len > 0 );
+    }
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_phred_stats_trigger, 1, 0, 0 )
+    ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    phred_stats_data *data;
+
+    assert(dp->argc == 1);
+
+    if( (rc = phred_stats_make(&data, (VTable*)info->tbl)) == 0 ) {
+        rslt->self = data;
+        rslt->whack = phred_stats_whack;
+        rslt->variant = vftNonDetRow;
+        rslt->u.rf = phred_stats_trigger;
+    }
+    return rc;
+}
diff --git a/libs/sraxf/swap.c b/libs/sraxf/swap.c
new file mode 100644
index 0000000..221c195
--- /dev/null
+++ b/libs/sraxf/swap.c
@@ -0,0 +1,228 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+
+typedef void (*swap_f)(void *dst, uint64_t offset, const void *src, const void *Cntrl, uint64_t vec_count);
+typedef struct self_t {
+    swap_f f;
+} self_t;
+
+#define SWAP_0(A, B) A = B
+#define SWAP_1(A, B) do { (A).data[0] = (B).data[1]; (A).data[1] = (B).data[0]; (A).data[2] = (B).data[2]; (A).data[3] = (B).data[3]; } while (0)
+#define SWAP_2(A, B) do { (A).data[0] = (B).data[2]; (A).data[1] = (B).data[1]; (A).data[2] = (B).data[0]; (A).data[3] = (B).data[3]; } while (0)
+#define SWAP_3(A, B) do { (A).data[0] = (B).data[3]; (A).data[1] = (B).data[1]; (A).data[2] = (B).data[2]; (A).data[3] = (B).data[0]; } while (0)
+
+#define FUNC(VALTYPE) F_ ## VALTYPE
+
+#define FUNC_DEF(VALTYPE)                                               \
+    static void FUNC(VALTYPE)(void *Dst, uint64_t offset, const void *Src, const void *Cntrl, uint64_t count) { \
+        typedef struct { VALTYPE data[4]; } data4_t;                    \
+        data4_t *dst = (data4_t *)Dst;                                  \
+        const data4_t *src = (const data4_t *)Src;                      \
+        const uint8_t *cntrl = (const uint8_t *)Cntrl;                  \
+        uint64_t i;                                                     \
+                                                                        \
+        dst += offset;                                                  \
+        for (i = 0; i != count; ++i) {                                  \
+            switch(cntrl[i]) {                                          \
+            default:                                                    \
+            case 0:                                                     \
+                SWAP_0(dst[i], src[i]);                                 \
+                break;                                                  \
+            case 1:                                                     \
+                SWAP_1(dst[i], src[i]);                                 \
+                break;                                                  \
+            case 2:                                                     \
+                SWAP_2(dst[i], src[i]);                                 \
+                break;                                                  \
+            case 3:                                                     \
+                SWAP_3(dst[i], src[i]);                                 \
+                break;                                                  \
+            }                                                           \
+        }                                                               \
+    }
+
+FUNC_DEF(float)
+FUNC_DEF(double)
+FUNC_DEF(uint8_t)
+FUNC_DEF(uint16_t)
+FUNC_DEF(uint32_t)
+FUNC_DEF(uint64_t)
+FUNC_DEF(int8_t)
+FUNC_DEF(int16_t)
+FUNC_DEF(int32_t)
+FUNC_DEF(int64_t)
+
+static
+rc_t CC swap_drvr (
+                void *Self,
+                const VXformInfo *info,
+                int64_t row_id,
+                const VFixedRowResult *rslt,
+                uint32_t argc,
+                const VRowData argv []
+) {
+    const uint8_t *src;
+    const uint8_t *cntrl;
+    const self_t *self = (const self_t *)Self;
+    
+    assert(argv[0].u.data.elem_bits % 8 == 0);
+    assert(argv[1].u.data.elem_bits % 8 == 0);
+    
+    src    = argv[0].u.data.base;
+    src   += (argv[0].u.data.first_elem * argv[0].u.data.elem_bits) / 8;
+
+    cntrl  = argv[1].u.data.base;
+    cntrl += (argv[1].u.data.first_elem * argv[1].u.data.elem_bits) / 8;
+    
+    self->f(rslt->base, rslt->first_elem, src, cntrl, rslt->elem_count);
+    
+    return 0;
+}
+
+static
+void CC sraxf_swap_free_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* 
+ * function < type T > T [ 4 ] NCBI:SRA:swap #1 ( T [ 4 ] in, U8 called );
+ */
+VTRANSFACT_IMPL ( NCBI_SRA_swap, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    self_t *self;
+    
+    switch (info->fdesc.desc.domain) {
+    case vtdInt:
+    case vtdUint:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+        case 16:
+        case 32:
+        case 64:
+            break;
+        default:
+            return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+            break;
+        }
+        break;
+    case vtdFloat:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 32:
+        case 64:
+            break;
+        default:
+            return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+            break;
+        }
+        break;
+    default:
+        return RC(rcXF, rcFunction, rcConstructing, rcType, rcInvalid);
+        break;
+    }
+    
+    self = malloc(sizeof(*self));
+    if (self) {
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                self->f = FUNC(int8_t);
+                break;
+            case 16:
+                self->f = FUNC(int16_t);
+                break;
+            case 32:
+                self->f = FUNC(int32_t);
+                break;
+            case 64:
+                self->f = FUNC(int64_t);
+                break;
+            default:
+                break;
+            }
+            break;
+        case vtdUint:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                self->f = FUNC(uint8_t);
+                break;
+            case 16:
+                self->f = FUNC(uint16_t);
+                break;
+            case 32:
+                self->f = FUNC(uint32_t);
+                break;
+            case 64:
+                self->f = FUNC(uint64_t);
+                break;
+            default:
+                break;
+            }
+            break;
+        case vtdFloat:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 32:
+                self->f = FUNC(float);
+                break;
+            case 64:
+                self->f = FUNC(double);
+                break;
+            default:
+                break;
+            }
+            break;
+        default:
+            break;
+        }
+        
+        rslt->self = self;
+        rslt->whack = sraxf_swap_free_wrapper;
+        rslt->u.pf = swap_drvr;
+        rslt->variant = vftFixedRow;
+        
+        return 0;
+    }
+    return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
diff --git a/libs/sraxf/tokenize-spot_name-454.c b/libs/sraxf/tokenize-spot_name-454.c
new file mode 100644
index 0000000..a801272
--- /dev/null
+++ b/libs/sraxf/tokenize-spot_name-454.c
@@ -0,0 +1,122 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "name-tokenizer.h"
+
+static
+rc_t CC tokenize_spot_name_454 ( void *self, const VXformInfo *info, int64_t row_id,
+                              VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const char *name;
+    unsigned region_start;
+    unsigned q_start;
+    unsigned i;
+    spot_name_token_t *spot_name_tok;
+    const int EXPECTED_NUMBER_OF_TOKENS = 2;
+    
+    assert(rslt->elem_bits == sizeof(spot_name_tok[0]) * 8);
+    rslt->data->elem_bits = sizeof(spot_name_tok[0]) * 8;
+    if( (rc = KDataBufferResize(rslt->data, EXPECTED_NUMBER_OF_TOKENS)) != 0 ) {
+        return rc;
+    }
+    
+    spot_name_tok = rslt->data->base;
+    
+    spot_name_tok[0].s.token_type = nt_unrecognized;
+    spot_name_tok[0].s.position = 0;
+    spot_name_tok[0].s.length = argv[0].u.data.elem_count;
+    rslt->elem_count = 1;
+    
+    /* /^(.{7})([0-9]{2})([A-Z0-9]{5})$/ = (name, region, XY_q) = ($1, $2, $3); */
+    if (argv[0].u.data.elem_count != 14 ) {
+        return 0;
+    }
+    
+    name = &((const char *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    q_start = argv[0].u.data.elem_count - 5;
+    region_start = q_start - 2;
+    
+    /* validate that XY_q =~ /[A-Z0-9]{5}/ */
+    for(i = 0; i != 5; i++) {
+        if(!((name[i + q_start] >= 'A' && name[i + q_start] <= 'Z') || (name[i + q_start] >= '0' && name[i + q_start] <= '9'))) {
+            return 0;
+        }
+    }
+    /* validate that region =~ /[0-9]{2}/ */
+    if( !(name[region_start] >= '0' && name[region_start] <= '9') ||
+        !(name[region_start + 1] >= '0' && name[region_start + 1] <= '9') ) {
+        return 0;
+    }
+    spot_name_tok[0].s.token_type = nt_T;
+    spot_name_tok[0].s.position = region_start;
+    spot_name_tok[0].s.length = 2;
+    
+    spot_name_tok[1].s.token_type = nt_Q;
+    spot_name_tok[1].s.position = q_start;
+    spot_name_tok[1].s.length = 5;
+
+    rslt->elem_count = EXPECTED_NUMBER_OF_TOKENS;
+    return 0;
+}
+
+/* tokenize_spot_name
+ *  scans name on input
+ *  tokenizes into parts
+
+typedef U16 NCBI:SRA:spot_name_token [ 3 ];
+const U16 NCBI:SRA:name_token:unrecognized = 1;
+const U16 NCBI:SRA:name_token:X            = 2;
+const U16 NCBI:SRA:name_token:Y            = 3;
+const U16 NCBI:SRA:name_token:Q            = 4;
+const U16 NCBI:SRA:name_token:T            = 5;
+const U16 NCBI:SRA:name_token:L            = 6;
+
+extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:_454_:tokenize_spot_name #1 ( ascii name );
+ */
+VTRANSFACT_IMPL ( NCBI_SRA__454__tokenize_spot_name, 1, 0, 0 ) ( const void *self,
+                  const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftRow;
+    rslt->u.rf = tokenize_spot_name_454;
+    
+    return 0;
+}
diff --git a/libs/sraxf/tokenize-spot_name-abi.c b/libs/sraxf/tokenize-spot_name-abi.c
new file mode 100644
index 0000000..54f40a4
--- /dev/null
+++ b/libs/sraxf/tokenize-spot_name-abi.c
@@ -0,0 +1,146 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+#include "name-tokenizer.h"
+
+static
+rc_t CC tokenize_spot_name_ABI ( void *self, const VXformInfo *info, int64_t row_id,
+                              VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const char *name, *end;
+    spot_name_token_t *spot_name_tok;
+    const int EXPECTED_NUMBER_OF_TOKENS = 3;
+    int tok = EXPECTED_NUMBER_OF_TOKENS;
+    const uint16_t types[3] = {nt_T, nt_X, nt_Y};
+    
+    assert(rslt->elem_bits == sizeof(spot_name_tok[0]) * 8);
+    rslt->data->elem_bits = sizeof(spot_name_tok[0]) * 8;
+    if( (rc = KDataBufferResize(rslt->data, EXPECTED_NUMBER_OF_TOKENS)) != 0 ) {
+        return rc;
+    }
+    
+    spot_name_tok = rslt->data->base;
+    
+    /* reverse line parse by format:
+     Dig is -> [-+0-9]
+       /^(.*+)(Dig+)!Dig+(Dig+)!Dig+(Dig+)$/ = (run_name, panel, x, y) = ($1, $2, $3, $4)
+    */
+#define is_signum(a) (isdigit(a) || a == '-' || a == '+')
+
+    name = &((const char *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    end = name + argv[0].u.data.elem_count;
+    while(rc == 0 && end > name && tok > 0) {
+        const char* c, *last_end;
+        do {
+            last_end = end--;
+        } while( tok != EXPECTED_NUMBER_OF_TOKENS && end != name && !is_signum(*end) );
+        while( end != name && is_signum(*end) ) {
+            end--;
+        }
+        c = end;
+        if( !is_signum(*c) ) {
+            c++;
+        }
+        if( c >= last_end ) {
+            /* empty token */
+            break;
+        } else if( *c == '-' ) {
+            /* keep explicit - '-000' */
+            if( last_end - c >= 2 && *(c + 1) == '0' ) {
+                c++;
+                while( *c == '0' && (c + 1) < last_end ) { c++; }
+                if( *c != '0' ) {
+                    /* cannot tokenize -0004 */
+                    break;
+                }
+            }
+        } else {
+            if( *c == '+' ) {
+                /* keep explicit + */
+                c++;
+            }
+            /* keep leading zeroes */
+            while(*c == '0' && (c + 1) < last_end ) { c++; }
+        }
+        tok--;
+        spot_name_tok[tok].s.token_type = types[tok];
+        spot_name_tok[tok].s.position = c - name;
+        spot_name_tok[tok].s.length = last_end - c;
+        if( spot_name_tok[tok].s.length == 0 ) {
+            rc = RC(rcSRA, rcFormatter, rcReading, rcName, rcInvalid);
+        }
+        while(rc == 0 && c < last_end) {
+            if( *c < '0' || *c > '9' ) {
+                rc = RC(rcSRA, rcFormatter, rcReading, rcId, rcOutofrange);
+            }
+            c++;
+        }
+    }
+    if( rc == 0 && tok != 0 ) {
+        rc = RC(rcSRA, rcFormatter, rcReading, rcName, rcInvalid);
+    }
+    if( rc != 0 ) {
+        spot_name_tok[0].s.token_type = nt_unrecognized;
+        spot_name_tok[0].s.position = 0;
+        spot_name_tok[0].s.length = argv[0].u.data.elem_count;
+        rslt->elem_count = 1;
+    } else {
+        rslt->elem_count = EXPECTED_NUMBER_OF_TOKENS;
+    }
+    return 0;
+}
+
+/* tokenize_spot_name
+ *  scans name on input
+ *  tokenizes into parts
+
+ extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:ABI:tokenize_spot_name #1 ( ascii name );
+ */
+VTRANSFACT_IMPL ( NCBI_SRA_ABI_tokenize_spot_name, 1, 0, 0 ) ( const void *self,
+                  const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftRow;
+    rslt->u.rf = tokenize_spot_name_ABI;
+    
+    return 0;
+}
diff --git a/libs/sraxf/tokenize-spot_name-generic-fastq.c b/libs/sraxf/tokenize-spot_name-generic-fastq.c
new file mode 100644
index 0000000..3f4b7d9
--- /dev/null
+++ b/libs/sraxf/tokenize-spot_name-generic-fastq.c
@@ -0,0 +1,81 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "name-tokenizer.h"
+
+static
+rc_t CC tokenize_spot_name_genericFastq ( void *self, const VXformInfo *info, int64_t row_id,
+										  VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    spot_name_token_t *spot_name_tok;
+    const int EXPECTED_NUMBER_OF_TOKENS = 1;
+    
+    assert(rslt->elem_bits == sizeof(spot_name_tok[0]) * 8);
+    rslt->data->elem_bits = sizeof(spot_name_tok[0]) * 8;
+    if( (rc = KDataBufferResize(rslt->data, EXPECTED_NUMBER_OF_TOKENS)) != 0 ) {
+        return rc;
+    }
+    
+    spot_name_tok = rslt->data->base;
+    
+    spot_name_tok[0].s.token_type = nt_recognized;
+    spot_name_tok[0].s.position = 0;
+    spot_name_tok[0].s.length = argv[0].u.data.elem_count;
+    rslt->elem_count = 1;
+    
+	return 0;
+}
+
+/* tokenize_spot_name
+ *  scans name on input
+ *  tokenizes into parts
+
+extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:GenericFastq:tokenize_spot_name #1 ( ascii name );
+ */
+VTRANSFACT_IMPL ( NCBI_SRA_GenericFastq_tokenize_spot_name, 1, 0, 0 ) ( const void *self,
+                  const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftRow;
+    rslt->u.rf = tokenize_spot_name_genericFastq;
+    
+    return 0;
+}
diff --git a/libs/sraxf/tokenize-spot_name-helicos.c b/libs/sraxf/tokenize-spot_name-helicos.c
new file mode 100644
index 0000000..e42d3c1
--- /dev/null
+++ b/libs/sraxf/tokenize-spot_name-helicos.c
@@ -0,0 +1,112 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+#include "name-tokenizer.h"
+
+static
+rc_t CC tokenize_spot_name_Helicos( void *self, const VXformInfo *info, int64_t row_id,
+                                    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const char *name, *end;
+    spot_name_token_t *spot_name_tok;
+    const int EXPECTED_NUMBER_OF_TOKENS = 4;
+    int tok = EXPECTED_NUMBER_OF_TOKENS;
+    const uint16_t types[4] = {nt_L, nt_T, nt_X, nt_Y };
+    
+    assert(rslt->elem_bits == sizeof(spot_name_tok[0]) * 8);
+    rslt->data->elem_bits = sizeof(spot_name_tok[0]) * 8;
+    if( (rc = KDataBufferResize(rslt->data, EXPECTED_NUMBER_OF_TOKENS)) != 0 ) {
+        return rc;
+    }
+    
+    spot_name_tok = rslt->data->base;
+    
+    /* reverse line parse by format:
+       /^(.+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)$/ = 
+        (name, channel, field, camera, position) = ($1, $2, $3, $4, $5)
+    */
+    name = &((const char *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    end = name + argv[0].u.data.elem_count;
+
+    while(rc == 0 && end > name && tok > 0 ) {
+        size_t l = 0;
+        while( isdigit(*--end) && end > name ) {
+            l++;
+        }
+        if( *end != '-' || l == 0 ) {
+            rc = RC(rcSRA, rcFormatter, rcReading, rcName, rcUnrecognized);
+        } else {
+            tok--;
+            spot_name_tok[tok].s.token_type = types[tok];
+            spot_name_tok[tok].s.position = end - name + 1;
+            spot_name_tok[tok].s.length = l;
+        }
+    }
+    if( rc == 0 && tok != 0 ) {
+        rc = RC(rcSRA, rcFormatter, rcReading, rcName, rcInvalid);
+    }
+    if( rc != 0 ) {
+        spot_name_tok[0].s.token_type = nt_unrecognized;
+        spot_name_tok[0].s.position = 0;
+        spot_name_tok[0].s.length = argv[0].u.data.elem_count;
+        rslt->elem_count = 1;
+    } else {
+        rslt->elem_count = EXPECTED_NUMBER_OF_TOKENS;
+    }
+    return 0;
+}
+
+/* tokenize_spot_name
+ *  scans name on input
+ *  tokenizes into parts
+
+ extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:Helicos:tokenize_spot_name #1 ( ascii name );
+ */
+VTRANSFACT_IMPL ( NCBI_SRA_Helicos_tokenize_spot_name, 1, 0, 0 ) ( const void *self,
+                  const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftRow;
+    rslt->u.rf = tokenize_spot_name_Helicos;
+    
+    return 0;
+}
diff --git a/libs/sraxf/tokenize-spot_name-illumina.c b/libs/sraxf/tokenize-spot_name-illumina.c
new file mode 100644
index 0000000..2311611
--- /dev/null
+++ b/libs/sraxf/tokenize-spot_name-illumina.c
@@ -0,0 +1,151 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+#include "name-tokenizer.h"
+
+static
+rc_t CC tokenize_spot_name_Illumina ( void *self, const VXformInfo *info, int64_t row_id,
+                                   VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const char *name, *end;
+    spot_name_token_t *spot_name_tok;
+    bool saw_end_float = false;
+    const int EXPECTED_NUMBER_OF_TOKENS = 4;
+    int tok = EXPECTED_NUMBER_OF_TOKENS;
+    const uint16_t types[4] = {nt_L, nt_T, nt_X, nt_Y };
+    
+    assert(rslt->elem_bits == sizeof(spot_name_tok[0]) * 8);
+    rslt->data->elem_bits = sizeof(spot_name_tok[0]) * 8;
+    if( (rc = KDataBufferResize(rslt->data, EXPECTED_NUMBER_OF_TOKENS)) != 0 ) {
+        return rc;
+    }
+    
+    spot_name_tok = rslt->data->base;
+    
+    /* reverse line parse by format:
+       /^(.+)[_:|]([0-9]+)[_:|]([0-9]+)[_:|]([+-0-9]+)[_:|]([+-0-9]+)([_:|][0-9]+?\.[0-9]+)?$/ = 
+        (name, lane, tile, x, y, float?) = ($1, $2, $3, $4, $5, $6?)
+    */
+    name = &((const char *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    end = name + argv[0].u.data.elem_count;
+    while(rc == 0 && end > name && tok > 0 ) {
+        const char* last_end = end--;
+        bool not_numeric = false;
+        char has_sign = 0;
+        while( end >= name && strchr(":|_", *end) == NULL ) {
+            if( !isdigit(*end) ) {
+                not_numeric = true;
+                if( (*end == '-' || *end == '+') && !has_sign ) {
+                    has_sign = *end;
+                    not_numeric = false;
+                }
+            }
+            end--;
+        }
+        end++;
+        if( not_numeric ) {
+            if( !saw_end_float ) {
+                /* skip optional trailing not integer number */
+                saw_end_float = true;
+            } else {
+                rc = RC(rcSRA, rcFormatter, rcReading, rcName, rcInvalid);
+            }
+        } else {
+            const char* c = end;
+            if( *c == '-' ) {
+                /* keep explicit - '-000' */
+                if( last_end - c >= 2 && *(c + 1) == '0' ) {
+                    c++;
+                    while( *c == '0' && (c + 1) < last_end ) { c++; }
+                    if( *c != '0' ) {
+                        /* cannot tokenize -0004 */
+                        break;
+                    }
+                }
+            } else {
+                if( *c == '+' ) {
+                    /* keep explicit + */
+                    c++;
+                }
+                /* keep leading zeroes */
+                while(*c == '0' && (c + 1) < last_end ) { c++; }
+            }
+            tok--;
+            spot_name_tok[tok].s.token_type = types[tok];
+            spot_name_tok[tok].s.position = c - name;
+            spot_name_tok[tok].s.length = last_end - c;
+            if( spot_name_tok[tok].s.length == 0 ) {
+                rc = RC(rcSRA, rcFormatter, rcReading, rcName, rcInvalid);
+            }
+        }
+        /* back up to separator */
+        end--;
+    }
+    if( rc == 0 && tok != 0 ) {
+        rc = RC(rcSRA, rcFormatter, rcReading, rcName, rcInvalid);
+    }
+    if( rc != 0 ) {
+        spot_name_tok[0].s.token_type = nt_unrecognized;
+        spot_name_tok[0].s.position = 0;
+        spot_name_tok[0].s.length = argv[0].u.data.elem_count;
+        rslt->elem_count = 1;
+    } else {
+        rslt->elem_count = EXPECTED_NUMBER_OF_TOKENS;
+    }
+    return 0;
+}
+
+/* tokenize_spot_name
+ *  scans name on input
+ *  tokenizes into parts
+
+ extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:Illumina:tokenize_spot_name #1 ( ascii name );
+ */
+VTRANSFACT_IMPL ( NCBI_SRA_Illumina_tokenize_spot_name, 1, 0, 0 ) ( const void *self,
+                  const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftRow;
+    rslt->u.rf = tokenize_spot_name_Illumina;
+    
+    return 0;
+}
diff --git a/libs/sraxf/tokenize-spot_name-ion-torrent.c b/libs/sraxf/tokenize-spot_name-ion-torrent.c
new file mode 100644
index 0000000..444bdd3
--- /dev/null
+++ b/libs/sraxf/tokenize-spot_name-ion-torrent.c
@@ -0,0 +1,136 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+#include "name-tokenizer.h"
+
+static
+rc_t CC tokenize_spot_name_IonTorrent( void *self, const VXformInfo *info, int64_t row_id,
+                                       VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const char *name, *end;
+    spot_name_token_t *spot_name_tok;
+    const int EXPECTED_NUMBER_OF_TOKENS = 2;
+    int tok = EXPECTED_NUMBER_OF_TOKENS;
+    const uint16_t types[4] = {nt_X, nt_Y};
+    
+    assert(rslt->elem_bits == sizeof(spot_name_tok[0]) * 8);
+    rslt->data->elem_bits = sizeof(spot_name_tok[0]) * 8;
+    rc = KDataBufferResize(rslt->data, EXPECTED_NUMBER_OF_TOKENS);
+    if( rc != 0 )
+        return rc;
+    
+    spot_name_tok = rslt->data->base;
+    
+    /* reverse line parse by format:
+       /^(.+):([0-9]+):([0-9]+)$/ = (name, x, x) = ($1, $2, $3)
+    */
+    name = argv[0].u.data.base;
+    name += argv[0].u.data.first_elem;
+    end = name + argv[0].u.data.elem_count;
+
+    while ( end > name && tok > 0 )
+    {
+        const char *num_start, *num_end = end;
+
+        /* examine least significant digit */
+        -- end;
+        if ( ! isdigit ( * end ) )
+            break;
+
+        /* any digit 0-9 is okay as least significant */
+        num_start = end;
+
+        /* examine remaining digits */
+        while ( end > name )
+        {
+            /* require 0-9 to stay within parse */
+            -- end;
+            if ( ! isdigit ( * end ) )
+                break;
+
+            /* only reset numeric start if not 0 */
+            if ( * end != '0' )
+                num_start = end;
+        }
+
+        /* should have stopped on ':' */
+        if ( *end != ':' )
+            break;
+
+        /* we have a numeric token
+           due to oddities, exclude leading zeros from numeral */
+        -- tok;
+        spot_name_tok[tok].s.token_type = types[tok];
+        spot_name_tok[tok].s.position = num_start - name;
+        spot_name_tok[tok].s.length = num_end - num_start;
+    }
+
+    /* if all tokens were seen, the parse was good */
+    if( tok == 0 )
+        rslt->elem_count = EXPECTED_NUMBER_OF_TOKENS;
+    else
+    {
+        /* otherwise, treat entire string as unrecognized */
+        spot_name_tok[0].s.token_type = nt_unrecognized;
+        spot_name_tok[0].s.position = 0;
+        spot_name_tok[0].s.length = argv[0].u.data.elem_count;
+        rslt->elem_count = 1;
+    }
+
+    return 0;
+}
+
+/* tokenize_spot_name
+ *  scans name on input
+ *  tokenizes into parts
+
+ extern function NCBI:SRA:spot_name_token
+    NCBI:SRA:IonTorrent:tokenize_spot_name #1 ( ascii name );
+ */
+VTRANSFACT_IMPL ( NCBI_SRA_IonTorrent_tokenize_spot_name, 1, 0, 0 ) ( const void *self,
+                  const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftRow;
+    rslt->u.rf = tokenize_spot_name_IonTorrent;
+    
+    return 0;
+}
diff --git a/libs/sraxf/untyped-priv.h b/libs/sraxf/untyped-priv.h
new file mode 100644
index 0000000..d0c9ea2
--- /dev/null
+++ b/libs/sraxf/untyped-priv.h
@@ -0,0 +1,83 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_untyped_priv
+#define _h_untyped_priv
+
+/* 454_untyped_0
+ *  recognizes all runs produced with v0 loader
+ */
+bool NCBI_SRA__454__untyped_0 ( const KTable *tbl, const KMetadata *meta );
+
+
+/* 454_untyped_1_2a
+ *  recognizes runs produced with v1.2 loader
+ *  where the linker is present
+ *  and a physical READ_SEG is present
+ */
+bool NCBI_SRA__454__untyped_1_2a ( const KTable *tbl, const KMetadata *meta );
+
+
+/* 454_untyped_1_2b
+ *  recognizes runs produced with v1.2 loader
+ *  where the linker is missing or empty
+ *  and a physical READ_SEG is present
+ */
+bool NCBI_SRA__454__untyped_1_2b ( const KTable *tbl, const KMetadata *meta );
+
+
+/* Illumina_untyped_0a
+ *  recognizes runs produced with v0 loader with 4-channel QUALITY
+ */
+bool NCBI_SRA_Illumina_untyped_0a ( const KTable *tbl, const KMetadata *meta );
+
+
+/* Illumina_untyped_0b
+ *  recognizes runs produced with v0 loader with single-channel QUALITY or QUALITY2
+ */
+bool NCBI_SRA_Illumina_untyped_0b ( const KTable *tbl, const KMetadata *meta );
+
+
+/* Illumina_untyped_1a
+ *  recognizes runs produced with v1 srf and native loaders
+ *  having 4-channel qualities
+ */
+bool NCBI_SRA_Illumina_untyped_1a ( const KTable *tbl, const KMetadata *meta );
+
+
+/* Illumina_untyped_1b
+ *  recognizes runs produced with all v1 loaders
+ *  having single-channel qualities
+ */
+bool NCBI_SRA_Illumina_untyped_1b ( const KTable *tbl, const KMetadata *meta );
+
+
+/* ABI_untyped_1
+ *  recognizes runs produced with all v1 loaders
+ */
+bool NCBI_SRA_ABI_untyped_1 ( const KTable *tbl, const KMetadata *meta );
+
+#endif
diff --git a/libs/sraxf/untyped.c b/libs/sraxf/untyped.c
new file mode 100644
index 0000000..c956636
--- /dev/null
+++ b/libs/sraxf/untyped.c
@@ -0,0 +1,378 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/manager.h>
+#include <kdb/table.h>
+#include <kdb/column.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+static
+bool KMetadataStrEqual ( const KMetadata *meta, const char *path, const char *str )
+{
+    const KMDataNode *node;
+    rc_t rc = KMetadataOpenNodeRead ( meta, & node, "%s", path );
+    if ( rc == 0 )
+    {
+        size_t num_read;
+        char buff [ 4096 ];
+        rc = KMDataNodeReadCString ( node, buff, sizeof buff, & num_read );
+        KMDataNodeRelease ( node );
+        if ( rc == 0 )
+        {
+            if ( strcmp ( buff, str ) == 0 )
+                return true;
+        }
+    }
+
+    return false;
+}
+
+static
+bool KMetadataNumEqual ( const KMetadata *meta, const char *path, int64_t num )
+{
+    const KMDataNode *node;
+    rc_t rc = KMetadataOpenNodeRead ( meta, & node, "%s", path );
+    if ( rc == 0 )
+    {
+        int64_t i;
+        rc = KMDataNodeReadAsI64 ( node, & i );
+        KMDataNodeRelease ( node );
+        if ( rc == 0 )
+        {
+            if ( i == num )
+                return true;
+        }
+    }
+
+    return false;
+}
+
+static
+bool KMetadataVersEqual ( const KMetadata *meta, const char *name, const char *vers )
+{
+    bool equal = false;
+    const KMDataNode *node;
+    rc_t rc = KMetadataOpenNodeRead ( meta, & node, "SOFTWARE/loader" );
+    if ( rc == 0 )
+    {
+        size_t num_read;
+        char attr [ 256 ];
+        rc = KMDataNodeReadAttr ( node, "name", attr, sizeof attr, & num_read );
+        if ( rc == 0 )
+        {
+            if ( memcmp ( attr, name, strlen ( name ) ) == 0 )
+            {
+                if ( vers == NULL || vers [ 0 ] == 0 )
+                    equal = true;
+                else
+                {
+                    rc = KMDataNodeReadAttr ( node, "vers", attr, sizeof attr, & num_read );
+                    if ( rc == 0 )
+                    {
+                        if ( memcmp ( attr, vers, strlen ( vers ) ) == 0 )
+                            equal = true;
+                    }
+                }
+            }
+        }
+
+        KMDataNodeRelease ( node );
+    }
+
+    return equal;
+}
+
+static
+bool KMetadataExists ( const KMetadata *meta, const char *path )
+{
+    const KMDataNode *node;
+    rc_t rc = KMetadataOpenNodeRead ( meta, & node, "%s", path );
+    if ( rc != 0 )
+        return false;
+    KMDataNodeRelease ( node );
+    return true;
+}
+
+static
+bool KMetadataEmpty ( const KMetadata *meta, const char *path )
+{
+    size_t num_read, remaining;
+    const KMDataNode *node;
+    rc_t rc = KMetadataOpenNodeRead ( meta, & node, "%s", path );
+    if ( rc != 0 )
+        return true;
+    rc = KMDataNodeRead ( node, 0, & num_read, 0, & num_read, & remaining );
+    KMDataNodeRelease ( node );
+    if ( rc == 0 && remaining != 0 )
+        return false;
+    return true;
+}
+
+static
+bool KColumnTypeEqual ( const KTable *tbl, const char *col, const char *type )
+{
+    /* TBD - this operation is expensive
+       should be addressed either by caching opened columns on table
+       or by introducing a path to open column metadata from table */
+    const KColumn *kcol;
+    rc_t rc = KTableOpenColumnRead ( tbl, & kcol, "%s", col );
+    if ( rc == 0 )
+    {
+        const KMetadata *meta;
+        rc = KColumnOpenMetadataRead ( kcol, & meta );
+        KColumnRelease ( kcol );
+        if ( rc == 0 )
+        {
+            /* this is a expected to be a v1 column
+               open its decoding node */
+            const KMDataNode *node;
+            rc = KMetadataOpenNodeRead ( meta, & node, "decoding" );
+            KMetadataRelease ( meta );
+            if ( rc == 0 )
+            {
+                /* read its type */
+                size_t size;
+                char type_expr [ 256 ];
+                rc = KMDataNodeReadAttr ( node, "type",
+                    type_expr, sizeof type_expr, & size );
+                KMDataNodeRelease ( node );
+                if ( rc == 0 )
+                {
+                    if ( memcmp ( type_expr, type, strlen ( type ) ) == 0 )
+                        return true;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+
+/* accept_untyped
+ *  recognizes any table at all
+ *  used by admin to correct corrupt tables
+ */
+MOD_EXPORT
+bool CC NCBI_SRA_accept_untyped ( const KTable *tbl, const KMetadata *meta )
+{
+    return true;
+}
+
+
+/* 454_untyped_0
+ *  recognizes all runs produced with v0 loader
+ */
+MOD_EXPORT
+bool CC NCBI_SRA__454__untyped_0 ( const KTable *tbl, const KMetadata *meta )
+{
+    if ( KMetadataStrEqual ( meta, "PLATFORM", "454" ) )
+    {
+        if ( ! KMetadataExists ( meta, "SOFTWARE" ) )
+        {
+            if ( KMetadataExists ( meta, "MSC454_FLOW_CHARS" ) &&
+                 KMetadataExists ( meta, "MSC454_KEY_SEQUENCE" ) )
+            {
+                /* don't bother looking at columns */
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+
+/* 454_untyped_1_2a
+ *  recognizes runs produced with v1.2 loader
+ *  where the linker is present
+ *  and a physical READ_SEG is present
+ */
+MOD_EXPORT
+bool CC NCBI_SRA__454__untyped_1_2a ( const KTable *tbl, const KMetadata *meta )
+{
+    if ( KMetadataVersEqual ( meta, "sff-load", "1" ) ||
+         KMetadataVersEqual ( meta, "sff-load", "0" ) )
+    {
+        if ( KMetadataExists ( meta, "col/NREADS" ) )
+        {
+            if ( ! KMetadataEmpty ( meta, "col/LINKER_SEQUENCE/row" ) )
+                return KTableExists ( tbl, kptColumn, "READ_SEG" );
+        }
+    }
+    return false;
+}
+
+
+/* 454_untyped_1_2b
+ *  recognizes runs produced with v1.2 loader
+ *  where the linker is missing or empty
+ *  and a physical READ_SEG is present
+ */
+MOD_EXPORT
+bool CC NCBI_SRA__454__untyped_1_2b ( const KTable *tbl, const KMetadata *meta )
+{
+    if ( KMetadataVersEqual ( meta, "sff-load", "1" ) ||
+         KMetadataVersEqual ( meta, "sff-load", "0" ) )
+    {
+        if ( KMetadataExists ( meta, "col/NREADS" ) )
+        {
+            if ( KMetadataEmpty ( meta, "col/LINKER_SEQUENCE/row" ) )
+                return KTableExists ( tbl, kptColumn, "READ_SEG" );
+        }
+    }
+    return false;
+}
+
+
+/* Illumina_untyped_0a
+ *  recognizes runs produced with v0 loader with 4-channel QUALITY
+ */
+MOD_EXPORT
+bool CC NCBI_SRA_Illumina_untyped_0a ( const KTable *tbl, const KMetadata *meta )
+{
+    if ( KMetadataStrEqual ( meta, "PLATFORM", "SOLEXA" ) )
+    {
+        if ( ! KMetadataExists ( meta, "SOFTWARE" ) )
+        {
+            if ( KMetadataNumEqual ( meta, "NUMBER_PRB_CHANNELS", 4 ) ||
+                 KMetadataNumEqual ( meta, "NUMBER_PRB_CHANNELS_1", 4 ) )
+            {
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+
+/* Illumina_untyped_0b
+ *  recognizes runs produced with v0 loader with single-channel QUALITY or QUALITY2
+ */
+MOD_EXPORT
+bool CC NCBI_SRA_Illumina_untyped_0b ( const KTable *tbl, const KMetadata *meta )
+{
+    if ( KMetadataStrEqual ( meta, "PLATFORM", "SOLEXA" ) )
+    {
+        if ( ! KMetadataExists ( meta, "SOFTWARE" ) )
+        {
+            if ( KMetadataNumEqual ( meta, "NUMBER_PRB_CHANNELS", 1 ) ||
+                 KMetadataNumEqual ( meta, "NUMBER_PRB_CHANNELS_1", 1 ) ||
+                 KMetadataNumEqual ( meta, "NUMBER_PRB_CHANNELS_2", 1 ) )
+            {
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+
+/* Illumina_untyped_1a
+ *  recognizes runs produced with v1 srf and native loaders
+ *  having 4-channel qualities
+ */
+MOD_EXPORT
+bool CC NCBI_SRA_Illumina_untyped_1a ( const KTable *tbl, const KMetadata *meta )
+{
+    if ( KMetadataStrEqual ( meta, "PLATFORM", "ILLUMINA" ) )
+    {
+        if ( KMetadataVersEqual ( meta, "illumina-load", "1" ) ||
+             KMetadataVersEqual ( meta, "srf-load", "1" ) )
+        {
+            return KColumnTypeEqual ( tbl, "QUALITY", "NCBI:SRA:swapped_qual4" );
+        }
+    }
+    return false;
+}
+
+
+/* Illumina_untyped_1b
+ *  recognizes runs produced with all v1 loaders
+ *  having single-channel qualities
+ */
+MOD_EXPORT
+bool CC NCBI_SRA_Illumina_untyped_1b ( const KTable *tbl, const KMetadata *meta )
+{
+    if ( KMetadataStrEqual ( meta, "PLATFORM", "ILLUMINA" ) )
+    {
+        if ( KMetadataVersEqual ( meta, "fastq-load", "1" ) ||
+             KMetadataVersEqual ( meta, "fastq-load", "0" ) )
+            return true;
+        if ( KMetadataVersEqual ( meta, "illumina-load", "1" ) ||
+             KMetadataVersEqual ( meta, "srf-load", "1" ) )
+        {
+            return ! KColumnTypeEqual ( tbl, "QUALITY", "NCBI:SRA:swapped_qual4" );
+        }
+    }
+    return false;
+}
+
+
+/* ABI_untyped_1
+ *  recognizes runs produced with all v1 loaders
+ */
+MOD_EXPORT
+bool CC NCBI_SRA_ABI_untyped_1 ( const KTable *tbl, const KMetadata *meta )
+{
+    if ( KMetadataStrEqual ( meta, "PLATFORM", "ABSOLID" ) )
+    {
+        if ( ! KMetadataExists ( meta, "SOFTWARE" ) ||
+             KMetadataVersEqual ( meta, "abi-load", "1" ) ||
+             KMetadataVersEqual ( meta, "srf-load", "1" ) )
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
+
+/* this is here simply to force the compiler to check
+   the function signatures listed above against a
+   typedef for the function used by vdb. */
+#if _DEBUGGING
+VUntypedFunc test_signature [] =
+{
+    NCBI_SRA__454__untyped_0,
+    NCBI_SRA__454__untyped_1_2a,
+    NCBI_SRA__454__untyped_1_2b,
+    NCBI_SRA_Illumina_untyped_0a,
+    NCBI_SRA_Illumina_untyped_0b,
+    NCBI_SRA_Illumina_untyped_1a,
+    NCBI_SRA_Illumina_untyped_1b,
+    NCBI_SRA_ABI_untyped_1
+};
+#endif
diff --git a/libs/sraxf/v0-decompress-init.c b/libs/sraxf/v0-decompress-init.c
new file mode 100644
index 0000000..7ba659d
--- /dev/null
+++ b/libs/sraxf/v0-decompress-init.c
@@ -0,0 +1,2838 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include "v0-decompress.h"
+#include "v0-decompress-local.h"
+#include <sra/sradb.h> /* SRA_PLATFORM_... */
+#include <klib/sort.h>
+#include <sysalloc.h>
+
+/* globals
+ */
+extern SRALocal     gv_local;
+extern SRALookup_t  gp_lookup;
+
+/* local prototypes
+ */
+
+static void _s_init_sig_454_default (void);
+static void _s_init_prb_454_default (void);
+static void _s_init_pos_454_default (void);
+
+static void _s_init_seq_default     (void);
+
+static void _s_init_sig_slx_default (void);
+static void _s_init_int_slx_default (void);
+static void _s_init_nse_slx_default (void);
+static void _s_init_prb_slx_default (void);
+
+static void _s_init_slx_convqs4to1_default (void);
+
+
+/* initialize tables with default values
+ */
+void sra_decompress_init (void)
+{ 
+  memset (&gv_local, 0, sizeof(struct SRALocal));
+
+  _s_init_sig_454_default (); 
+  _s_init_prb_454_default ();
+  _s_init_pos_454_default ();
+
+  _s_init_seq_default     ();
+
+  _s_init_sig_slx_default ();
+  _s_init_int_slx_default ();
+  _s_init_nse_slx_default ();
+  _s_init_prb_slx_default ();
+
+  _s_init_slx_convqs4to1_default ();
+}   
+
+/* local routines
+ */
+static int64_t CC _s_cmp_indexes (const void* a1, const void* a2, void *data)
+{
+  SRALookup_t plook = data;
+  uint32_t bits1    = plook[*(uint16_t*)a1].bits;
+  uint32_t bits2    = plook[*(uint16_t*)a2].bits;
+
+  return (int64_t)bits1 - (int64_t)bits2;
+}
+/*
+ */
+static void _s_sort_lookup (const SRALookup_t plook, uint16_t* idx, uint16_t size)
+{
+  uint16_t i;
+  for (i=0; i<size; i++) *(idx+i) = i;
+
+  /* make sure it will sort a corect table
+   */
+  ksort ( idx, size, sizeof(uint16_t), _s_cmp_indexes, plook );
+}
+/*
+ */
+/*
+ */
+static void _s_init_slx_convqs4to1_default (void)
+{
+  gv_local.convqs4to1 [ 0] =  0;  gv_local.convqs4to1 [ 1] =  0;
+  gv_local.convqs4to1 [ 2] =  0;  gv_local.convqs4to1 [ 3] =  0;
+  gv_local.convqs4to1 [ 4] =  0;  gv_local.convqs4to1 [ 5] =  0;
+  gv_local.convqs4to1 [ 6] =  0;  gv_local.convqs4to1 [ 7] =  0;
+  gv_local.convqs4to1 [ 8] =  0;  gv_local.convqs4to1 [ 9] =  0;
+  gv_local.convqs4to1 [10] =  0;  gv_local.convqs4to1 [11] =  0;
+  gv_local.convqs4to1 [12] =  0;  gv_local.convqs4to1 [13] =  0;
+  gv_local.convqs4to1 [14] =  0;  gv_local.convqs4to1 [15] =  0;
+  gv_local.convqs4to1 [16] =  0;  gv_local.convqs4to1 [17] =  0;
+  gv_local.convqs4to1 [18] =  0;  gv_local.convqs4to1 [19] =  0;
+  gv_local.convqs4to1 [20] =  0;  gv_local.convqs4to1 [21] =  0;
+  gv_local.convqs4to1 [22] =  0;  gv_local.convqs4to1 [23] =  0;
+  gv_local.convqs4to1 [24] =  0;  gv_local.convqs4to1 [25] =  0;
+  gv_local.convqs4to1 [26] =  0;  gv_local.convqs4to1 [27] =  0;
+  gv_local.convqs4to1 [28] =  0;  gv_local.convqs4to1 [29] =  0;
+  gv_local.convqs4to1 [30] =  0;  gv_local.convqs4to1 [31] =  1;
+  gv_local.convqs4to1 [32] =  1;  gv_local.convqs4to1 [33] =  1;
+  gv_local.convqs4to1 [34] =  1;  gv_local.convqs4to1 [35] =  1;
+  gv_local.convqs4to1 [36] =  1;  gv_local.convqs4to1 [37] =  2;
+  gv_local.convqs4to1 [38] =  2;  gv_local.convqs4to1 [39] =  3;
+  gv_local.convqs4to1 [40] =  3;  gv_local.convqs4to1 [41] =  4;
+  gv_local.convqs4to1 [42] =  4;  gv_local.convqs4to1 [43] =  5;
+  gv_local.convqs4to1 [44] =  5;  gv_local.convqs4to1 [45] =  6;
+  gv_local.convqs4to1 [46] =  7;  gv_local.convqs4to1 [47] =  8;
+  gv_local.convqs4to1 [48] =  9;  gv_local.convqs4to1 [49] = 10;
+  gv_local.convqs4to1 [50] = 10;  gv_local.convqs4to1 [51] = 11;
+  gv_local.convqs4to1 [52] = 12;  gv_local.convqs4to1 [53] = 13;
+  gv_local.convqs4to1 [54] = 14;  gv_local.convqs4to1 [55] = 15;
+  gv_local.convqs4to1 [56] = 16;  gv_local.convqs4to1 [57] = 17;
+  gv_local.convqs4to1 [58] = 18;  gv_local.convqs4to1 [59] = 19;
+  gv_local.convqs4to1 [60] = 20;  gv_local.convqs4to1 [61] = 21;
+  gv_local.convqs4to1 [62] = 22;  gv_local.convqs4to1 [63] = 23;
+  gv_local.convqs4to1 [64] = 24;  gv_local.convqs4to1 [65] = 25;
+  gv_local.convqs4to1 [66] = 26;  gv_local.convqs4to1 [67] = 27;
+  gv_local.convqs4to1 [68] = 28;  gv_local.convqs4to1 [69] = 29;
+  gv_local.convqs4to1 [70] = 30;  gv_local.convqs4to1 [71] = 31;
+  gv_local.convqs4to1 [72] = 32;  gv_local.convqs4to1 [73] = 33;
+  gv_local.convqs4to1 [74] = 34;  gv_local.convqs4to1 [75] = 35;
+  gv_local.convqs4to1 [76] = 36;  gv_local.convqs4to1 [77] = 37;
+  gv_local.convqs4to1 [78] = 38;  gv_local.convqs4to1 [79] = 39;
+  gv_local.convqs4to1 [80] = 40;
+}
+/*
+ */
+static void _s_init_prb_slx_default (void)
+{
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  int      i, j;
+  uchar_t  val;
+#endif
+
+  memset (gv_local.lookup_slx_prb, 0, sizeof(SRALookup)*PRB_SLX_HUFF_TREESIZE);
+
+  /*
+  // each bit is represented by two slashes or backslashes
+  //
+  // where / is 0
+  //      /
+  //
+  // and  \  is 1
+  //       \
+  //             1                   0 - 0000
+  //              \  /\              1 - 0100
+  //               \/  \    6        4 - 1000
+  //               /   /\  /         5 - 1010
+  //              /   /  \/   14     6 - 1100
+  //             0   /\   \  /      14 - 1110
+  //                /  \   \/       15 - 1111
+  //               4    5   \
+  //                         \
+  //                         15
+  //
+  */
+
+  gv_local.lookup_slx_prb[0].nbits = 2; gv_local.lookup_slx_prb[0].bits = 0x00000000;  /* 0: m_qmax  m_qmin  m_qmin m_qmin */
+  gv_local.lookup_slx_prb[1].nbits = 2; gv_local.lookup_slx_prb[1].bits = 0x40000000;  /* 1:     -5      -5      -5     -5 */
+  gv_local.lookup_slx_prb[2].nbits = 3; gv_local.lookup_slx_prb[2].bits = 0x80000000;  /* 2:      A      -A  m_qmin m_qmin */
+  gv_local.lookup_slx_prb[3].nbits = 3; gv_local.lookup_slx_prb[3].bits = 0xA0000000;  /* 3:      A  m_qmin      -A m_qmin */
+  gv_local.lookup_slx_prb[4].nbits = 3; gv_local.lookup_slx_prb[4].bits = 0xC0000000;  /* 4:      A  m_qmin  m_qmin     -A */
+  gv_local.lookup_slx_prb[5].nbits = 4; gv_local.lookup_slx_prb[5].bits = 0xE0000000;  /* 5: escape                        */
+  gv_local.lookup_slx_prb[6].nbits = 4; gv_local.lookup_slx_prb[6].bits = 0xF0000000;  /* 6: UNUSED                        */
+
+   _s_sort_lookup (gv_local.lookup_slx_prb, gv_local.idx_slx_prb, PRB_SLX_HUFF_TREESIZE);
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  /* reverse huffman lookup table
+   */
+  memset (gv_local.rlookup_slx_prb, 0, sizeof(uchar_t)*REV_HUFF_TREESIZE_08);
+
+  for (i=0; i<PRB_SLX_HUFF_TREESIZE; i++)
+  {
+    val = gv_local.lookup_slx_prb[i].bits >> 24;
+    gv_local.rlookup_slx_prb [val] = (uchar_t) i;
+
+    for (j=1; j<=(0xFF>>gv_local.lookup_slx_prb[i].nbits); j++)
+      gv_local.rlookup_slx_prb [val+j] = (uchar_t) i;
+  }
+#endif
+
+  gv_local.lookup_slx_prb_initialized = 1;
+}
+/*
+ */
+static void _s_init_sig_slx_default (void)
+{
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  int      i, j;
+  uint16_t val;
+#endif
+
+  memset (gv_local.lookup_slx_sig,  0, sizeof(SRALookup)*SIG_HUFF_TREESIZE);
+
+  gv_local.lookup_slx_sig[  0].nbits = 13; gv_local.lookup_slx_sig[  0].bits = 0xB5180000;
+  gv_local.lookup_slx_sig[  1].nbits = 13; gv_local.lookup_slx_sig[  1].bits = 0x3D680000;
+  gv_local.lookup_slx_sig[  2].nbits = 13; gv_local.lookup_slx_sig[  2].bits = 0xBAA00000;
+  gv_local.lookup_slx_sig[  3].nbits = 13; gv_local.lookup_slx_sig[  3].bits = 0xB7D80000;
+  gv_local.lookup_slx_sig[  4].nbits = 13; gv_local.lookup_slx_sig[  4].bits = 0x59500000;
+  gv_local.lookup_slx_sig[  5].nbits = 13; gv_local.lookup_slx_sig[  5].bits = 0xB7080000;
+  gv_local.lookup_slx_sig[  6].nbits = 13; gv_local.lookup_slx_sig[  6].bits = 0xB8180000;
+  gv_local.lookup_slx_sig[  7].nbits = 13; gv_local.lookup_slx_sig[  7].bits = 0x8B980000;
+  gv_local.lookup_slx_sig[  8].nbits = 13; gv_local.lookup_slx_sig[  8].bits = 0xB7880000;
+  gv_local.lookup_slx_sig[  9].nbits = 13; gv_local.lookup_slx_sig[  9].bits = 0x5EE80000;
+  gv_local.lookup_slx_sig[ 10].nbits = 13; gv_local.lookup_slx_sig[ 10].bits = 0xC0A00000;
+  gv_local.lookup_slx_sig[ 11].nbits = 13; gv_local.lookup_slx_sig[ 11].bits = 0xB7980000;
+  gv_local.lookup_slx_sig[ 12].nbits = 13; gv_local.lookup_slx_sig[ 12].bits = 0x8B880000;
+  gv_local.lookup_slx_sig[ 13].nbits = 13; gv_local.lookup_slx_sig[ 13].bits = 0x8B900000;
+  gv_local.lookup_slx_sig[ 14].nbits = 13; gv_local.lookup_slx_sig[ 14].bits = 0xB7900000;
+  gv_local.lookup_slx_sig[ 15].nbits = 13; gv_local.lookup_slx_sig[ 15].bits = 0xC4400000;
+  gv_local.lookup_slx_sig[ 16].nbits = 13; gv_local.lookup_slx_sig[ 16].bits = 0xBA480000;
+  gv_local.lookup_slx_sig[ 17].nbits = 13; gv_local.lookup_slx_sig[ 17].bits = 0xC0A80000;
+  gv_local.lookup_slx_sig[ 18].nbits = 13; gv_local.lookup_slx_sig[ 18].bits = 0xBD700000;
+  gv_local.lookup_slx_sig[ 19].nbits = 13; gv_local.lookup_slx_sig[ 19].bits = 0xB8100000;
+  gv_local.lookup_slx_sig[ 20].nbits = 13; gv_local.lookup_slx_sig[ 20].bits = 0xC1A00000;
+  gv_local.lookup_slx_sig[ 21].nbits = 13; gv_local.lookup_slx_sig[ 21].bits = 0xBC700000;
+  gv_local.lookup_slx_sig[ 22].nbits = 13; gv_local.lookup_slx_sig[ 22].bits = 0xC4500000;
+  gv_local.lookup_slx_sig[ 23].nbits = 13; gv_local.lookup_slx_sig[ 23].bits = 0xC5200000;
+  gv_local.lookup_slx_sig[ 24].nbits = 13; gv_local.lookup_slx_sig[ 24].bits = 0xC5780000;
+  gv_local.lookup_slx_sig[ 25].nbits = 13; gv_local.lookup_slx_sig[ 25].bits = 0xC5380000;
+  gv_local.lookup_slx_sig[ 26].nbits = 13; gv_local.lookup_slx_sig[ 26].bits = 0xC9A00000;
+  gv_local.lookup_slx_sig[ 27].nbits = 13; gv_local.lookup_slx_sig[ 27].bits = 0xCBA00000;
+  gv_local.lookup_slx_sig[ 28].nbits = 13; gv_local.lookup_slx_sig[ 28].bits = 0xC5300000;
+  gv_local.lookup_slx_sig[ 29].nbits = 13; gv_local.lookup_slx_sig[ 29].bits = 0xC0B80000;
+  gv_local.lookup_slx_sig[ 30].nbits = 13; gv_local.lookup_slx_sig[ 30].bits = 0xC5700000;
+  gv_local.lookup_slx_sig[ 31].nbits = 13; gv_local.lookup_slx_sig[ 31].bits = 0xD6280000;
+  gv_local.lookup_slx_sig[ 32].nbits = 13; gv_local.lookup_slx_sig[ 32].bits = 0xC4480000;
+  gv_local.lookup_slx_sig[ 33].nbits = 13; gv_local.lookup_slx_sig[ 33].bits = 0xD6180000;
+  gv_local.lookup_slx_sig[ 34].nbits = 13; gv_local.lookup_slx_sig[ 34].bits = 0xC9C00000;
+  gv_local.lookup_slx_sig[ 35].nbits = 13; gv_local.lookup_slx_sig[ 35].bits = 0xCA680000;
+  gv_local.lookup_slx_sig[ 36].nbits = 13; gv_local.lookup_slx_sig[ 36].bits = 0xCEF80000;
+  gv_local.lookup_slx_sig[ 37].nbits = 13; gv_local.lookup_slx_sig[ 37].bits = 0xCCD00000;
+  gv_local.lookup_slx_sig[ 38].nbits = 12; gv_local.lookup_slx_sig[ 38].bits = 0x1AA00000;
+  gv_local.lookup_slx_sig[ 39].nbits = 12; gv_local.lookup_slx_sig[ 39].bits = 0x18800000;
+  gv_local.lookup_slx_sig[ 40].nbits = 13; gv_local.lookup_slx_sig[ 40].bits = 0xD6300000;
+  gv_local.lookup_slx_sig[ 41].nbits = 12; gv_local.lookup_slx_sig[ 41].bits = 0x18900000;
+  gv_local.lookup_slx_sig[ 42].nbits = 13; gv_local.lookup_slx_sig[ 42].bits = 0xCBA80000;
+  gv_local.lookup_slx_sig[ 43].nbits = 13; gv_local.lookup_slx_sig[ 43].bits = 0xD7E80000;
+  gv_local.lookup_slx_sig[ 44].nbits = 13; gv_local.lookup_slx_sig[ 44].bits = 0xC9C80000;
+  gv_local.lookup_slx_sig[ 45].nbits = 13; gv_local.lookup_slx_sig[ 45].bits = 0xD4F80000;
+  gv_local.lookup_slx_sig[ 46].nbits = 12; gv_local.lookup_slx_sig[ 46].bits = 0x1AB00000;
+  gv_local.lookup_slx_sig[ 47].nbits = 12; gv_local.lookup_slx_sig[ 47].bits = 0x2A800000;
+  gv_local.lookup_slx_sig[ 48].nbits = 12; gv_local.lookup_slx_sig[ 48].bits = 0x2F100000;
+  gv_local.lookup_slx_sig[ 49].nbits = 12; gv_local.lookup_slx_sig[ 49].bits = 0x1B600000;
+  gv_local.lookup_slx_sig[ 50].nbits = 12; gv_local.lookup_slx_sig[ 50].bits = 0x1C500000;
+  gv_local.lookup_slx_sig[ 51].nbits = 12; gv_local.lookup_slx_sig[ 51].bits = 0x29D00000;
+  gv_local.lookup_slx_sig[ 52].nbits = 12; gv_local.lookup_slx_sig[ 52].bits = 0x2A200000;
+  gv_local.lookup_slx_sig[ 53].nbits = 12; gv_local.lookup_slx_sig[ 53].bits = 0x39400000;
+  gv_local.lookup_slx_sig[ 54].nbits = 12; gv_local.lookup_slx_sig[ 54].bits = 0x33100000;
+  gv_local.lookup_slx_sig[ 55].nbits = 12; gv_local.lookup_slx_sig[ 55].bits = 0x29C00000;
+  gv_local.lookup_slx_sig[ 56].nbits = 12; gv_local.lookup_slx_sig[ 56].bits = 0x28700000;
+  gv_local.lookup_slx_sig[ 57].nbits = 12; gv_local.lookup_slx_sig[ 57].bits = 0x32200000;
+  gv_local.lookup_slx_sig[ 58].nbits = 12; gv_local.lookup_slx_sig[ 58].bits = 0x39700000;
+  gv_local.lookup_slx_sig[ 59].nbits = 12; gv_local.lookup_slx_sig[ 59].bits = 0x39500000;
+  gv_local.lookup_slx_sig[ 60].nbits = 12; gv_local.lookup_slx_sig[ 60].bits = 0x32800000;
+  gv_local.lookup_slx_sig[ 61].nbits = 12; gv_local.lookup_slx_sig[ 61].bits = 0x34300000;
+  gv_local.lookup_slx_sig[ 62].nbits = 12; gv_local.lookup_slx_sig[ 62].bits = 0x32300000;
+  gv_local.lookup_slx_sig[ 63].nbits = 12; gv_local.lookup_slx_sig[ 63].bits = 0x2A900000;
+  gv_local.lookup_slx_sig[ 64].nbits = 12; gv_local.lookup_slx_sig[ 64].bits = 0x3FA00000;
+  gv_local.lookup_slx_sig[ 65].nbits = 12; gv_local.lookup_slx_sig[ 65].bits = 0x39B00000;
+  gv_local.lookup_slx_sig[ 66].nbits = 12; gv_local.lookup_slx_sig[ 66].bits = 0x3F900000;
+  gv_local.lookup_slx_sig[ 67].nbits = 12; gv_local.lookup_slx_sig[ 67].bits = 0x3C300000;
+  gv_local.lookup_slx_sig[ 68].nbits = 12; gv_local.lookup_slx_sig[ 68].bits = 0x5E300000;
+  gv_local.lookup_slx_sig[ 69].nbits = 12; gv_local.lookup_slx_sig[ 69].bits = 0x3E800000;
+  gv_local.lookup_slx_sig[ 70].nbits = 12; gv_local.lookup_slx_sig[ 70].bits = 0x39E00000;
+  gv_local.lookup_slx_sig[ 71].nbits = 12; gv_local.lookup_slx_sig[ 71].bits = 0x3E500000;
+  gv_local.lookup_slx_sig[ 72].nbits = 12; gv_local.lookup_slx_sig[ 72].bits = 0x88F00000;
+  gv_local.lookup_slx_sig[ 73].nbits = 12; gv_local.lookup_slx_sig[ 73].bits = 0x88000000;
+  gv_local.lookup_slx_sig[ 74].nbits = 12; gv_local.lookup_slx_sig[ 74].bits = 0x88D00000;
+  gv_local.lookup_slx_sig[ 75].nbits = 12; gv_local.lookup_slx_sig[ 75].bits = 0x5EB00000;
+  gv_local.lookup_slx_sig[ 76].nbits = 12; gv_local.lookup_slx_sig[ 76].bits = 0x3FB00000;
+  gv_local.lookup_slx_sig[ 77].nbits = 12; gv_local.lookup_slx_sig[ 77].bits = 0x59100000;
+  gv_local.lookup_slx_sig[ 78].nbits = 12; gv_local.lookup_slx_sig[ 78].bits = 0x88C00000;
+  gv_local.lookup_slx_sig[ 79].nbits = 12; gv_local.lookup_slx_sig[ 79].bits = 0x88E00000;
+  gv_local.lookup_slx_sig[ 80].nbits = 12; gv_local.lookup_slx_sig[ 80].bits = 0x88100000;
+  gv_local.lookup_slx_sig[ 81].nbits = 12; gv_local.lookup_slx_sig[ 81].bits = 0xB6800000;
+  gv_local.lookup_slx_sig[ 82].nbits = 12; gv_local.lookup_slx_sig[ 82].bits = 0xB5200000;
+  gv_local.lookup_slx_sig[ 83].nbits = 12; gv_local.lookup_slx_sig[ 83].bits = 0x5E200000;
+  gv_local.lookup_slx_sig[ 84].nbits = 12; gv_local.lookup_slx_sig[ 84].bits = 0xB7C00000;
+  gv_local.lookup_slx_sig[ 85].nbits = 12; gv_local.lookup_slx_sig[ 85].bits = 0xB8000000;
+  gv_local.lookup_slx_sig[ 86].nbits = 12; gv_local.lookup_slx_sig[ 86].bits = 0xB9200000;
+  gv_local.lookup_slx_sig[ 87].nbits = 12; gv_local.lookup_slx_sig[ 87].bits = 0xB7300000;
+  gv_local.lookup_slx_sig[ 88].nbits = 12; gv_local.lookup_slx_sig[ 88].bits = 0xC1100000;
+  gv_local.lookup_slx_sig[ 89].nbits = 12; gv_local.lookup_slx_sig[ 89].bits = 0xBA500000;
+  gv_local.lookup_slx_sig[ 90].nbits = 12; gv_local.lookup_slx_sig[ 90].bits = 0xC0900000;
+  gv_local.lookup_slx_sig[ 91].nbits = 12; gv_local.lookup_slx_sig[ 91].bits = 0xC1900000;
+  gv_local.lookup_slx_sig[ 92].nbits = 12; gv_local.lookup_slx_sig[ 92].bits = 0xB8500000;
+  gv_local.lookup_slx_sig[ 93].nbits = 12; gv_local.lookup_slx_sig[ 93].bits = 0xC1800000;
+  gv_local.lookup_slx_sig[ 94].nbits = 12; gv_local.lookup_slx_sig[ 94].bits = 0xBAE00000;
+  gv_local.lookup_slx_sig[ 95].nbits = 12; gv_local.lookup_slx_sig[ 95].bits = 0xC9B00000;
+  gv_local.lookup_slx_sig[ 96].nbits = 12; gv_local.lookup_slx_sig[ 96].bits = 0xC0800000;
+  gv_local.lookup_slx_sig[ 97].nbits = 12; gv_local.lookup_slx_sig[ 97].bits = 0xC5D00000;
+  gv_local.lookup_slx_sig[ 98].nbits = 12; gv_local.lookup_slx_sig[ 98].bits = 0xC1000000;
+  gv_local.lookup_slx_sig[ 99].nbits = 12; gv_local.lookup_slx_sig[ 99].bits = 0xC0500000;
+  gv_local.lookup_slx_sig[100].nbits = 12; gv_local.lookup_slx_sig[100].bits = 0xC8100000;
+  gv_local.lookup_slx_sig[101].nbits = 12; gv_local.lookup_slx_sig[101].bits = 0xC1C00000;
+  gv_local.lookup_slx_sig[102].nbits = 12; gv_local.lookup_slx_sig[102].bits = 0xC8600000;
+  gv_local.lookup_slx_sig[103].nbits = 12; gv_local.lookup_slx_sig[103].bits = 0xCED00000;
+  gv_local.lookup_slx_sig[104].nbits = 12; gv_local.lookup_slx_sig[104].bits = 0xCC900000;
+  gv_local.lookup_slx_sig[105].nbits = 12; gv_local.lookup_slx_sig[105].bits = 0xCE400000;
+  gv_local.lookup_slx_sig[106].nbits = 12; gv_local.lookup_slx_sig[106].bits = 0xCC500000;
+  gv_local.lookup_slx_sig[107].nbits = 12; gv_local.lookup_slx_sig[107].bits = 0xCC400000;
+  gv_local.lookup_slx_sig[108].nbits = 12; gv_local.lookup_slx_sig[108].bits = 0xCBB00000;
+  gv_local.lookup_slx_sig[109].nbits = 12; gv_local.lookup_slx_sig[109].bits = 0xCA700000;
+  gv_local.lookup_slx_sig[110].nbits = 12; gv_local.lookup_slx_sig[110].bits = 0xD6000000;
+  gv_local.lookup_slx_sig[111].nbits = 12; gv_local.lookup_slx_sig[111].bits = 0xD5D00000;
+  gv_local.lookup_slx_sig[112].nbits = 12; gv_local.lookup_slx_sig[112].bits = 0xD4E00000;
+  gv_local.lookup_slx_sig[113].nbits = 12; gv_local.lookup_slx_sig[113].bits = 0xD5C00000;
+  gv_local.lookup_slx_sig[114].nbits = 12; gv_local.lookup_slx_sig[114].bits = 0xC9E00000;
+  gv_local.lookup_slx_sig[115].nbits = 12; gv_local.lookup_slx_sig[115].bits = 0xD5700000;
+  gv_local.lookup_slx_sig[116].nbits = 11; gv_local.lookup_slx_sig[116].bits = 0x1B400000;
+  gv_local.lookup_slx_sig[117].nbits = 12; gv_local.lookup_slx_sig[117].bits = 0xD7F00000;
+  gv_local.lookup_slx_sig[118].nbits = 11; gv_local.lookup_slx_sig[118].bits = 0x1CC00000;
+  gv_local.lookup_slx_sig[119].nbits = 11; gv_local.lookup_slx_sig[119].bits = 0x18A00000;
+  gv_local.lookup_slx_sig[120].nbits = 11; gv_local.lookup_slx_sig[120].bits = 0x19000000;
+  gv_local.lookup_slx_sig[121].nbits = 11; gv_local.lookup_slx_sig[121].bits = 0x1C600000;
+  gv_local.lookup_slx_sig[122].nbits = 11; gv_local.lookup_slx_sig[122].bits = 0x1E000000;
+  gv_local.lookup_slx_sig[123].nbits = 11; gv_local.lookup_slx_sig[123].bits = 0x1E200000;
+  gv_local.lookup_slx_sig[124].nbits = 11; gv_local.lookup_slx_sig[124].bits = 0x32A00000;
+  gv_local.lookup_slx_sig[125].nbits = 11; gv_local.lookup_slx_sig[125].bits = 0x32E00000;
+  gv_local.lookup_slx_sig[126].nbits = 11; gv_local.lookup_slx_sig[126].bits = 0x33400000;
+  gv_local.lookup_slx_sig[127].nbits = 11; gv_local.lookup_slx_sig[127].bits = 0x2E200000;
+  gv_local.lookup_slx_sig[128].nbits = 11; gv_local.lookup_slx_sig[128].bits = 0x2F200000;
+  gv_local.lookup_slx_sig[129].nbits = 11; gv_local.lookup_slx_sig[129].bits = 0x2E400000;
+  gv_local.lookup_slx_sig[130].nbits = 11; gv_local.lookup_slx_sig[130].bits = 0x2F400000;
+  gv_local.lookup_slx_sig[131].nbits = 11; gv_local.lookup_slx_sig[131].bits = 0x35A00000;
+  gv_local.lookup_slx_sig[132].nbits = 11; gv_local.lookup_slx_sig[132].bits = 0x3B400000;
+  gv_local.lookup_slx_sig[133].nbits = 11; gv_local.lookup_slx_sig[133].bits = 0x33200000;
+  gv_local.lookup_slx_sig[134].nbits = 11; gv_local.lookup_slx_sig[134].bits = 0x34A00000;
+  gv_local.lookup_slx_sig[135].nbits = 11; gv_local.lookup_slx_sig[135].bits = 0x33A00000;
+  gv_local.lookup_slx_sig[136].nbits = 11; gv_local.lookup_slx_sig[136].bits = 0x35C00000;
+  gv_local.lookup_slx_sig[137].nbits = 11; gv_local.lookup_slx_sig[137].bits = 0x3DA00000;
+  gv_local.lookup_slx_sig[138].nbits = 11; gv_local.lookup_slx_sig[138].bits = 0x39800000;
+  gv_local.lookup_slx_sig[139].nbits = 11; gv_local.lookup_slx_sig[139].bits = 0x3E600000;
+  gv_local.lookup_slx_sig[140].nbits = 11; gv_local.lookup_slx_sig[140].bits = 0x3F000000;
+  gv_local.lookup_slx_sig[141].nbits = 11; gv_local.lookup_slx_sig[141].bits = 0x3D000000;
+  gv_local.lookup_slx_sig[142].nbits = 11; gv_local.lookup_slx_sig[142].bits = 0x59200000;
+  gv_local.lookup_slx_sig[143].nbits = 11; gv_local.lookup_slx_sig[143].bits = 0x3D400000;
+  gv_local.lookup_slx_sig[144].nbits = 11; gv_local.lookup_slx_sig[144].bits = 0x88200000;
+  gv_local.lookup_slx_sig[145].nbits = 11; gv_local.lookup_slx_sig[145].bits = 0x5E000000;
+  gv_local.lookup_slx_sig[146].nbits = 11; gv_local.lookup_slx_sig[146].bits = 0x5E800000;
+  gv_local.lookup_slx_sig[147].nbits = 11; gv_local.lookup_slx_sig[147].bits = 0x8BA00000;
+  gv_local.lookup_slx_sig[148].nbits = 11; gv_local.lookup_slx_sig[148].bits = 0x5EC00000;
+  gv_local.lookup_slx_sig[149].nbits = 11; gv_local.lookup_slx_sig[149].bits = 0x5F400000;
+  gv_local.lookup_slx_sig[150].nbits = 11; gv_local.lookup_slx_sig[150].bits = 0x5E600000;
+  gv_local.lookup_slx_sig[151].nbits = 11; gv_local.lookup_slx_sig[151].bits = 0x5F600000;
+  gv_local.lookup_slx_sig[152].nbits = 11; gv_local.lookup_slx_sig[152].bits = 0xB6C00000;
+  gv_local.lookup_slx_sig[153].nbits = 11; gv_local.lookup_slx_sig[153].bits = 0xB6400000;
+  gv_local.lookup_slx_sig[154].nbits = 11; gv_local.lookup_slx_sig[154].bits = 0xB8200000;
+  gv_local.lookup_slx_sig[155].nbits = 11; gv_local.lookup_slx_sig[155].bits = 0xB6600000;
+  gv_local.lookup_slx_sig[156].nbits = 11; gv_local.lookup_slx_sig[156].bits = 0xBAC00000;
+  gv_local.lookup_slx_sig[157].nbits = 11; gv_local.lookup_slx_sig[157].bits = 0xBA600000;
+  gv_local.lookup_slx_sig[158].nbits = 11; gv_local.lookup_slx_sig[158].bits = 0xBCA00000;
+  gv_local.lookup_slx_sig[159].nbits = 11; gv_local.lookup_slx_sig[159].bits = 0xC0600000;
+  gv_local.lookup_slx_sig[160].nbits = 11; gv_local.lookup_slx_sig[160].bits = 0xC0200000;
+  gv_local.lookup_slx_sig[161].nbits = 11; gv_local.lookup_slx_sig[161].bits = 0xBD400000;
+  gv_local.lookup_slx_sig[162].nbits = 11; gv_local.lookup_slx_sig[162].bits = 0xC1200000;
+  gv_local.lookup_slx_sig[163].nbits = 11; gv_local.lookup_slx_sig[163].bits = 0xBBC00000;
+  gv_local.lookup_slx_sig[164].nbits = 11; gv_local.lookup_slx_sig[164].bits = 0xC1600000;
+  gv_local.lookup_slx_sig[165].nbits = 11; gv_local.lookup_slx_sig[165].bits = 0xC0000000;
+  gv_local.lookup_slx_sig[166].nbits = 11; gv_local.lookup_slx_sig[166].bits = 0xC5000000;
+  gv_local.lookup_slx_sig[167].nbits = 11; gv_local.lookup_slx_sig[167].bits = 0xC4600000;
+  gv_local.lookup_slx_sig[168].nbits = 11; gv_local.lookup_slx_sig[168].bits = 0xBCE00000;
+  gv_local.lookup_slx_sig[169].nbits = 11; gv_local.lookup_slx_sig[169].bits = 0xC0E00000;
+  gv_local.lookup_slx_sig[170].nbits = 11; gv_local.lookup_slx_sig[170].bits = 0xC5E00000;
+  gv_local.lookup_slx_sig[171].nbits = 11; gv_local.lookup_slx_sig[171].bits = 0xC9600000;
+  gv_local.lookup_slx_sig[172].nbits = 11; gv_local.lookup_slx_sig[172].bits = 0xC8400000;
+  gv_local.lookup_slx_sig[173].nbits = 11; gv_local.lookup_slx_sig[173].bits = 0xC9800000;
+  gv_local.lookup_slx_sig[174].nbits = 11; gv_local.lookup_slx_sig[174].bits = 0xCC600000;
+  gv_local.lookup_slx_sig[175].nbits = 11; gv_local.lookup_slx_sig[175].bits = 0xCB000000;
+  gv_local.lookup_slx_sig[176].nbits = 11; gv_local.lookup_slx_sig[176].bits = 0xCA400000;
+  gv_local.lookup_slx_sig[177].nbits = 11; gv_local.lookup_slx_sig[177].bits = 0xD4C00000;
+  gv_local.lookup_slx_sig[178].nbits = 11; gv_local.lookup_slx_sig[178].bits = 0xCCA00000;
+  gv_local.lookup_slx_sig[179].nbits = 11; gv_local.lookup_slx_sig[179].bits = 0xD5400000;
+  gv_local.lookup_slx_sig[180].nbits = 11; gv_local.lookup_slx_sig[180].bits = 0xD4800000;
+  gv_local.lookup_slx_sig[181].nbits = 11; gv_local.lookup_slx_sig[181].bits = 0xD5200000;
+  gv_local.lookup_slx_sig[182].nbits = 11; gv_local.lookup_slx_sig[182].bits = 0xD7600000;
+  gv_local.lookup_slx_sig[183].nbits = 10; gv_local.lookup_slx_sig[183].bits = 0x18400000;
+  gv_local.lookup_slx_sig[184].nbits = 11; gv_local.lookup_slx_sig[184].bits = 0xD5800000;
+  gv_local.lookup_slx_sig[185].nbits = 11; gv_local.lookup_slx_sig[185].bits = 0xD5E00000;
+  gv_local.lookup_slx_sig[186].nbits = 11; gv_local.lookup_slx_sig[186].bits = 0xD7C00000;
+  gv_local.lookup_slx_sig[187].nbits = 10; gv_local.lookup_slx_sig[187].bits = 0x1C000000;
+  gv_local.lookup_slx_sig[188].nbits = 10; gv_local.lookup_slx_sig[188].bits = 0x18C00000;
+  gv_local.lookup_slx_sig[189].nbits = 10; gv_local.lookup_slx_sig[189].bits = 0x1A400000;
+  gv_local.lookup_slx_sig[190].nbits = 10; gv_local.lookup_slx_sig[190].bits = 0x1B000000;
+  gv_local.lookup_slx_sig[191].nbits = 10; gv_local.lookup_slx_sig[191].bits = 0x28000000;
+  gv_local.lookup_slx_sig[192].nbits = 10; gv_local.lookup_slx_sig[192].bits = 0x29400000;
+  gv_local.lookup_slx_sig[193].nbits = 10; gv_local.lookup_slx_sig[193].bits = 0x29000000;
+  gv_local.lookup_slx_sig[194].nbits = 10; gv_local.lookup_slx_sig[194].bits = 0x1F400000;
+  gv_local.lookup_slx_sig[195].nbits = 10; gv_local.lookup_slx_sig[195].bits = 0x2EC00000;
+  gv_local.lookup_slx_sig[196].nbits = 10; gv_local.lookup_slx_sig[196].bits = 0x1F000000;
+  gv_local.lookup_slx_sig[197].nbits = 10; gv_local.lookup_slx_sig[197].bits = 0x29800000;
+  gv_local.lookup_slx_sig[198].nbits = 10; gv_local.lookup_slx_sig[198].bits = 0x32400000;
+  gv_local.lookup_slx_sig[199].nbits = 10; gv_local.lookup_slx_sig[199].bits = 0x33C00000;
+  gv_local.lookup_slx_sig[200].nbits = 10; gv_local.lookup_slx_sig[200].bits = 0x2E800000;
+  gv_local.lookup_slx_sig[201].nbits = 10; gv_local.lookup_slx_sig[201].bits = 0x34C00000;
+  gv_local.lookup_slx_sig[202].nbits = 10; gv_local.lookup_slx_sig[202].bits = 0x37C00000;
+  gv_local.lookup_slx_sig[203].nbits = 10; gv_local.lookup_slx_sig[203].bits = 0x37800000;
+  gv_local.lookup_slx_sig[204].nbits = 10; gv_local.lookup_slx_sig[204].bits = 0x37400000;
+  gv_local.lookup_slx_sig[205].nbits = 10; gv_local.lookup_slx_sig[205].bits = 0x39000000;
+  gv_local.lookup_slx_sig[206].nbits = 10; gv_local.lookup_slx_sig[206].bits = 0x3C400000;
+  gv_local.lookup_slx_sig[207].nbits = 10; gv_local.lookup_slx_sig[207].bits = 0x3FC00000;
+  gv_local.lookup_slx_sig[208].nbits = 10; gv_local.lookup_slx_sig[208].bits = 0x58400000;
+  gv_local.lookup_slx_sig[209].nbits = 10; gv_local.lookup_slx_sig[209].bits = 0x3EC00000;
+  gv_local.lookup_slx_sig[210].nbits = 10; gv_local.lookup_slx_sig[210].bits = 0x3E000000;
+  gv_local.lookup_slx_sig[211].nbits = 10; gv_local.lookup_slx_sig[211].bits = 0x3F400000;
+  gv_local.lookup_slx_sig[212].nbits = 10; gv_local.lookup_slx_sig[212].bits = 0x59800000;
+  gv_local.lookup_slx_sig[213].nbits = 10; gv_local.lookup_slx_sig[213].bits = 0x59C00000;
+  gv_local.lookup_slx_sig[214].nbits = 10; gv_local.lookup_slx_sig[214].bits = 0x8B400000;
+  gv_local.lookup_slx_sig[215].nbits = 10; gv_local.lookup_slx_sig[215].bits = 0x88400000;
+  gv_local.lookup_slx_sig[216].nbits = 10; gv_local.lookup_slx_sig[216].bits = 0xB4000000;
+  gv_local.lookup_slx_sig[217].nbits = 10; gv_local.lookup_slx_sig[217].bits = 0xB6000000;
+  gv_local.lookup_slx_sig[218].nbits = 10; gv_local.lookup_slx_sig[218].bits = 0xB9800000;
+  gv_local.lookup_slx_sig[219].nbits = 10; gv_local.lookup_slx_sig[219].bits = 0xB9C00000;
+  gv_local.lookup_slx_sig[220].nbits = 10; gv_local.lookup_slx_sig[220].bits = 0xBC000000;
+  gv_local.lookup_slx_sig[221].nbits = 10; gv_local.lookup_slx_sig[221].bits = 0xBDC00000;
+  gv_local.lookup_slx_sig[222].nbits = 10; gv_local.lookup_slx_sig[222].bits = 0xBD000000;
+  gv_local.lookup_slx_sig[223].nbits = 10; gv_local.lookup_slx_sig[223].bits = 0xC9000000;
+  gv_local.lookup_slx_sig[224].nbits = 10; gv_local.lookup_slx_sig[224].bits = 0xC5800000;
+  gv_local.lookup_slx_sig[225].nbits = 10; gv_local.lookup_slx_sig[225].bits = 0xCA000000;
+  gv_local.lookup_slx_sig[226].nbits = 10; gv_local.lookup_slx_sig[226].bits = 0xCB400000;
+  gv_local.lookup_slx_sig[227].nbits = 10; gv_local.lookup_slx_sig[227].bits = 0xCE000000;
+  gv_local.lookup_slx_sig[228].nbits = 10; gv_local.lookup_slx_sig[228].bits = 0xD7000000;
+  gv_local.lookup_slx_sig[229].nbits =  9; gv_local.lookup_slx_sig[229].bits = 0x1B800000;
+  gv_local.lookup_slx_sig[230].nbits =  9; gv_local.lookup_slx_sig[230].bits = 0x28800000;
+  gv_local.lookup_slx_sig[231].nbits =  9; gv_local.lookup_slx_sig[231].bits = 0x2F800000;
+  gv_local.lookup_slx_sig[232].nbits =  9; gv_local.lookup_slx_sig[232].bits = 0x36000000;
+  gv_local.lookup_slx_sig[233].nbits =  9; gv_local.lookup_slx_sig[233].bits = 0x3C800000;
+  gv_local.lookup_slx_sig[234].nbits =  9; gv_local.lookup_slx_sig[234].bits = 0x58800000;
+  gv_local.lookup_slx_sig[235].nbits =  9; gv_local.lookup_slx_sig[235].bits = 0xB4800000;
+  gv_local.lookup_slx_sig[236].nbits =  9; gv_local.lookup_slx_sig[236].bits = 0xB8800000;
+  gv_local.lookup_slx_sig[237].nbits =  9; gv_local.lookup_slx_sig[237].bits = 0xC4800000;
+  gv_local.lookup_slx_sig[238].nbits =  9; gv_local.lookup_slx_sig[238].bits = 0xCA800000;
+  gv_local.lookup_slx_sig[239].nbits =  9; gv_local.lookup_slx_sig[239].bits = 0xD6800000;
+  gv_local.lookup_slx_sig[240].nbits =  8; gv_local.lookup_slx_sig[240].bits = 0x2B000000;
+  gv_local.lookup_slx_sig[241].nbits =  8; gv_local.lookup_slx_sig[241].bits = 0x3A000000;
+  gv_local.lookup_slx_sig[242].nbits =  8; gv_local.lookup_slx_sig[242].bits = 0x8A000000;
+  gv_local.lookup_slx_sig[243].nbits =  8; gv_local.lookup_slx_sig[243].bits = 0xBE000000;
+  gv_local.lookup_slx_sig[244].nbits =  8; gv_local.lookup_slx_sig[244].bits = 0xCF000000;
+  gv_local.lookup_slx_sig[245].nbits =  7; gv_local.lookup_slx_sig[245].bits = 0x30000000;
+  gv_local.lookup_slx_sig[246].nbits =  7; gv_local.lookup_slx_sig[246].bits = 0x5A000000;
+  gv_local.lookup_slx_sig[247].nbits =  7; gv_local.lookup_slx_sig[247].bits = 0xC2000000;
+  gv_local.lookup_slx_sig[248].nbits =  6; gv_local.lookup_slx_sig[248].bits = 0x20000000;
+  gv_local.lookup_slx_sig[249].nbits =  6; gv_local.lookup_slx_sig[249].bits = 0x8C000000;
+  gv_local.lookup_slx_sig[250].nbits =  6; gv_local.lookup_slx_sig[250].bits = 0xD0000000;
+  gv_local.lookup_slx_sig[251].nbits =  5; gv_local.lookup_slx_sig[251].bits = 0x50000000;
+  gv_local.lookup_slx_sig[252].nbits =  5; gv_local.lookup_slx_sig[252].bits = 0xD8000000;
+  gv_local.lookup_slx_sig[253].nbits =  4; gv_local.lookup_slx_sig[253].bits = 0x90000000;
+  gv_local.lookup_slx_sig[254].nbits =  4; gv_local.lookup_slx_sig[254].bits = 0xF0000000;
+  gv_local.lookup_slx_sig[255].nbits =  3; gv_local.lookup_slx_sig[255].bits = 0x60000000;
+  gv_local.lookup_slx_sig[256].nbits =  4; gv_local.lookup_slx_sig[256].bits = 0xE0000000;
+  gv_local.lookup_slx_sig[257].nbits =  4; gv_local.lookup_slx_sig[257].bits = 0xA0000000;
+  gv_local.lookup_slx_sig[258].nbits =  4; gv_local.lookup_slx_sig[258].bits = 0x00000000;
+  gv_local.lookup_slx_sig[259].nbits =  5; gv_local.lookup_slx_sig[259].bits = 0x80000000;
+  gv_local.lookup_slx_sig[260].nbits =  5; gv_local.lookup_slx_sig[260].bits = 0x10000000;
+  gv_local.lookup_slx_sig[261].nbits =  6; gv_local.lookup_slx_sig[261].bits = 0xB0000000;
+  gv_local.lookup_slx_sig[262].nbits =  6; gv_local.lookup_slx_sig[262].bits = 0x24000000;
+  gv_local.lookup_slx_sig[263].nbits =  7; gv_local.lookup_slx_sig[263].bits = 0xC6000000;
+  gv_local.lookup_slx_sig[264].nbits =  7; gv_local.lookup_slx_sig[264].bits = 0x5C000000;
+  gv_local.lookup_slx_sig[265].nbits =  7; gv_local.lookup_slx_sig[265].bits = 0x2C000000;
+  gv_local.lookup_slx_sig[266].nbits =  8; gv_local.lookup_slx_sig[266].bits = 0xCD000000;
+  gv_local.lookup_slx_sig[267].nbits =  8; gv_local.lookup_slx_sig[267].bits = 0xBF000000;
+  gv_local.lookup_slx_sig[268].nbits =  8; gv_local.lookup_slx_sig[268].bits = 0x89000000;
+  gv_local.lookup_slx_sig[269].nbits =  8; gv_local.lookup_slx_sig[269].bits = 0x38000000;
+  gv_local.lookup_slx_sig[270].nbits =  8; gv_local.lookup_slx_sig[270].bits = 0x1D000000;
+  gv_local.lookup_slx_sig[271].nbits =  9; gv_local.lookup_slx_sig[271].bits = 0xD4000000;
+  gv_local.lookup_slx_sig[272].nbits =  9; gv_local.lookup_slx_sig[272].bits = 0xC8800000;
+  gv_local.lookup_slx_sig[273].nbits =  9; gv_local.lookup_slx_sig[273].bits = 0xBB000000;
+  gv_local.lookup_slx_sig[274].nbits =  9; gv_local.lookup_slx_sig[274].bits = 0xB5800000;
+  gv_local.lookup_slx_sig[275].nbits =  9; gv_local.lookup_slx_sig[275].bits = 0x5F800000;
+  gv_local.lookup_slx_sig[276].nbits =  9; gv_local.lookup_slx_sig[276].bits = 0x3B800000;
+  gv_local.lookup_slx_sig[277].nbits =  9; gv_local.lookup_slx_sig[277].bits = 0x35000000;
+  gv_local.lookup_slx_sig[278].nbits =  9; gv_local.lookup_slx_sig[278].bits = 0x1F800000;
+  gv_local.lookup_slx_sig[279].nbits =  9; gv_local.lookup_slx_sig[279].bits = 0x19800000;
+  gv_local.lookup_slx_sig[280].nbits = 10; gv_local.lookup_slx_sig[280].bits = 0xD6400000;
+  gv_local.lookup_slx_sig[281].nbits = 10; gv_local.lookup_slx_sig[281].bits = 0xCE800000;
+  gv_local.lookup_slx_sig[282].nbits = 10; gv_local.lookup_slx_sig[282].bits = 0xCBC00000;
+  gv_local.lookup_slx_sig[283].nbits = 10; gv_local.lookup_slx_sig[283].bits = 0xC4000000;
+  gv_local.lookup_slx_sig[284].nbits = 10; gv_local.lookup_slx_sig[284].bits = 0xBD800000;
+  gv_local.lookup_slx_sig[285].nbits = 10; gv_local.lookup_slx_sig[285].bits = 0xBB800000;
+  gv_local.lookup_slx_sig[286].nbits = 10; gv_local.lookup_slx_sig[286].bits = 0xB9400000;
+  gv_local.lookup_slx_sig[287].nbits = 10; gv_local.lookup_slx_sig[287].bits = 0xB5400000;
+  gv_local.lookup_slx_sig[288].nbits = 10; gv_local.lookup_slx_sig[288].bits = 0x88800000;
+  gv_local.lookup_slx_sig[289].nbits = 10; gv_local.lookup_slx_sig[289].bits = 0x5F000000;
+  gv_local.lookup_slx_sig[290].nbits = 10; gv_local.lookup_slx_sig[290].bits = 0x3DC00000;
+  gv_local.lookup_slx_sig[291].nbits = 10; gv_local.lookup_slx_sig[291].bits = 0x3B000000;
+  gv_local.lookup_slx_sig[292].nbits = 10; gv_local.lookup_slx_sig[292].bits = 0x36C00000;
+  gv_local.lookup_slx_sig[293].nbits = 10; gv_local.lookup_slx_sig[293].bits = 0x34400000;
+  gv_local.lookup_slx_sig[294].nbits = 10; gv_local.lookup_slx_sig[294].bits = 0x36800000;
+  gv_local.lookup_slx_sig[295].nbits = 10; gv_local.lookup_slx_sig[295].bits = 0x2A400000;
+  gv_local.lookup_slx_sig[296].nbits = 10; gv_local.lookup_slx_sig[296].bits = 0x1EC00000;
+  gv_local.lookup_slx_sig[297].nbits = 10; gv_local.lookup_slx_sig[297].bits = 0x2AC00000;
+  gv_local.lookup_slx_sig[298].nbits = 10; gv_local.lookup_slx_sig[298].bits = 0x1AC00000;
+  gv_local.lookup_slx_sig[299].nbits = 10; gv_local.lookup_slx_sig[299].bits = 0x1E400000;
+  gv_local.lookup_slx_sig[300].nbits = 11; gv_local.lookup_slx_sig[300].bits = 0xD7400000;
+  gv_local.lookup_slx_sig[301].nbits = 11; gv_local.lookup_slx_sig[301].bits = 0xD5A00000;
+  gv_local.lookup_slx_sig[302].nbits = 11; gv_local.lookup_slx_sig[302].bits = 0xD7A00000;
+  gv_local.lookup_slx_sig[303].nbits = 10; gv_local.lookup_slx_sig[303].bits = 0x18000000;
+  gv_local.lookup_slx_sig[304].nbits = 11; gv_local.lookup_slx_sig[304].bits = 0xCCE00000;
+  gv_local.lookup_slx_sig[305].nbits = 11; gv_local.lookup_slx_sig[305].bits = 0xC9400000;
+  gv_local.lookup_slx_sig[306].nbits = 11; gv_local.lookup_slx_sig[306].bits = 0xCB800000;
+  gv_local.lookup_slx_sig[307].nbits = 11; gv_local.lookup_slx_sig[307].bits = 0xCC200000;
+  gv_local.lookup_slx_sig[308].nbits = 11; gv_local.lookup_slx_sig[308].bits = 0xCC000000;
+  gv_local.lookup_slx_sig[309].nbits = 11; gv_local.lookup_slx_sig[309].bits = 0xC8200000;
+  gv_local.lookup_slx_sig[310].nbits = 11; gv_local.lookup_slx_sig[310].bits = 0xC5400000;
+  gv_local.lookup_slx_sig[311].nbits = 11; gv_local.lookup_slx_sig[311].bits = 0xC0C00000;
+  gv_local.lookup_slx_sig[312].nbits = 11; gv_local.lookup_slx_sig[312].bits = 0xC1E00000;
+  gv_local.lookup_slx_sig[313].nbits = 11; gv_local.lookup_slx_sig[313].bits = 0xBA800000;
+  gv_local.lookup_slx_sig[314].nbits = 11; gv_local.lookup_slx_sig[314].bits = 0xBCC00000;
+  gv_local.lookup_slx_sig[315].nbits = 11; gv_local.lookup_slx_sig[315].bits = 0xBC400000;
+  gv_local.lookup_slx_sig[316].nbits = 11; gv_local.lookup_slx_sig[316].bits = 0xBC800000;
+  gv_local.lookup_slx_sig[317].nbits = 11; gv_local.lookup_slx_sig[317].bits = 0xB9000000;
+  gv_local.lookup_slx_sig[318].nbits = 11; gv_local.lookup_slx_sig[318].bits = 0xB8600000;
+  gv_local.lookup_slx_sig[319].nbits = 11; gv_local.lookup_slx_sig[319].bits = 0xB7E00000;
+  gv_local.lookup_slx_sig[320].nbits = 11; gv_local.lookup_slx_sig[320].bits = 0xBA200000;
+  gv_local.lookup_slx_sig[321].nbits = 11; gv_local.lookup_slx_sig[321].bits = 0xB7600000;
+  gv_local.lookup_slx_sig[322].nbits = 11; gv_local.lookup_slx_sig[322].bits = 0xB7400000;
+  gv_local.lookup_slx_sig[323].nbits = 11; gv_local.lookup_slx_sig[323].bits = 0xB4600000;
+  gv_local.lookup_slx_sig[324].nbits = 11; gv_local.lookup_slx_sig[324].bits = 0x8BC00000;
+  gv_local.lookup_slx_sig[325].nbits = 11; gv_local.lookup_slx_sig[325].bits = 0xB6E00000;
+  gv_local.lookup_slx_sig[326].nbits = 11; gv_local.lookup_slx_sig[326].bits = 0xB4400000;
+  gv_local.lookup_slx_sig[327].nbits = 11; gv_local.lookup_slx_sig[327].bits = 0x8BE00000;
+  gv_local.lookup_slx_sig[328].nbits = 11; gv_local.lookup_slx_sig[328].bits = 0x58000000;
+  gv_local.lookup_slx_sig[329].nbits = 11; gv_local.lookup_slx_sig[329].bits = 0x58200000;
+  gv_local.lookup_slx_sig[330].nbits = 11; gv_local.lookup_slx_sig[330].bits = 0x3D800000;
+  gv_local.lookup_slx_sig[331].nbits = 11; gv_local.lookup_slx_sig[331].bits = 0x3EA00000;
+  gv_local.lookup_slx_sig[332].nbits = 11; gv_local.lookup_slx_sig[332].bits = 0x3F200000;
+  gv_local.lookup_slx_sig[333].nbits = 11; gv_local.lookup_slx_sig[333].bits = 0x59600000;
+  gv_local.lookup_slx_sig[334].nbits = 11; gv_local.lookup_slx_sig[334].bits = 0x37000000;
+  gv_local.lookup_slx_sig[335].nbits = 11; gv_local.lookup_slx_sig[335].bits = 0x3D200000;
+  gv_local.lookup_slx_sig[336].nbits = 11; gv_local.lookup_slx_sig[336].bits = 0x33800000;
+  gv_local.lookup_slx_sig[337].nbits = 11; gv_local.lookup_slx_sig[337].bits = 0x2E000000;
+  gv_local.lookup_slx_sig[338].nbits = 11; gv_local.lookup_slx_sig[338].bits = 0x3C000000;
+  gv_local.lookup_slx_sig[339].nbits = 11; gv_local.lookup_slx_sig[339].bits = 0x2AA00000;
+  gv_local.lookup_slx_sig[340].nbits = 11; gv_local.lookup_slx_sig[340].bits = 0x34800000;
+  gv_local.lookup_slx_sig[341].nbits = 11; gv_local.lookup_slx_sig[341].bits = 0x32C00000;
+  gv_local.lookup_slx_sig[342].nbits = 11; gv_local.lookup_slx_sig[342].bits = 0x34000000;
+  gv_local.lookup_slx_sig[343].nbits = 11; gv_local.lookup_slx_sig[343].bits = 0x2E600000;
+  gv_local.lookup_slx_sig[344].nbits = 11; gv_local.lookup_slx_sig[344].bits = 0x35E00000;
+  gv_local.lookup_slx_sig[345].nbits = 11; gv_local.lookup_slx_sig[345].bits = 0x32000000;
+  gv_local.lookup_slx_sig[346].nbits = 11; gv_local.lookup_slx_sig[346].bits = 0x2A000000;
+  gv_local.lookup_slx_sig[347].nbits = 11; gv_local.lookup_slx_sig[347].bits = 0x29E00000;
+  gv_local.lookup_slx_sig[348].nbits = 11; gv_local.lookup_slx_sig[348].bits = 0x1CA00000;
+  gv_local.lookup_slx_sig[349].nbits = 11; gv_local.lookup_slx_sig[349].bits = 0x1A200000;
+  gv_local.lookup_slx_sig[350].nbits = 11; gv_local.lookup_slx_sig[350].bits = 0x19400000;
+  gv_local.lookup_slx_sig[351].nbits = 12; gv_local.lookup_slx_sig[351].bits = 0xD5100000;
+  gv_local.lookup_slx_sig[352].nbits = 11; gv_local.lookup_slx_sig[352].bits = 0x1C800000;
+  gv_local.lookup_slx_sig[353].nbits = 11; gv_local.lookup_slx_sig[353].bits = 0x19600000;
+  gv_local.lookup_slx_sig[354].nbits = 12; gv_local.lookup_slx_sig[354].bits = 0xD7900000;
+  gv_local.lookup_slx_sig[355].nbits = 12; gv_local.lookup_slx_sig[355].bits = 0xD7800000;
+  gv_local.lookup_slx_sig[356].nbits = 12; gv_local.lookup_slx_sig[356].bits = 0xCEE00000;
+  gv_local.lookup_slx_sig[357].nbits = 12; gv_local.lookup_slx_sig[357].bits = 0xD5000000;
+  gv_local.lookup_slx_sig[358].nbits = 12; gv_local.lookup_slx_sig[358].bits = 0xCC800000;
+  gv_local.lookup_slx_sig[359].nbits = 12; gv_local.lookup_slx_sig[359].bits = 0xD4A00000;
+  gv_local.lookup_slx_sig[360].nbits = 12; gv_local.lookup_slx_sig[360].bits = 0xCB300000;
+  gv_local.lookup_slx_sig[361].nbits = 12; gv_local.lookup_slx_sig[361].bits = 0xCE700000;
+  gv_local.lookup_slx_sig[362].nbits = 12; gv_local.lookup_slx_sig[362].bits = 0xCE600000;
+  gv_local.lookup_slx_sig[363].nbits = 12; gv_local.lookup_slx_sig[363].bits = 0xCCC00000;
+  gv_local.lookup_slx_sig[364].nbits = 12; gv_local.lookup_slx_sig[364].bits = 0xC1D00000;
+  gv_local.lookup_slx_sig[365].nbits = 12; gv_local.lookup_slx_sig[365].bits = 0xC5600000;
+  gv_local.lookup_slx_sig[366].nbits = 12; gv_local.lookup_slx_sig[366].bits = 0xC8000000;
+  gv_local.lookup_slx_sig[367].nbits = 12; gv_local.lookup_slx_sig[367].bits = 0xC9F00000;
+  gv_local.lookup_slx_sig[368].nbits = 12; gv_local.lookup_slx_sig[368].bits = 0xC9D00000;
+  gv_local.lookup_slx_sig[369].nbits = 12; gv_local.lookup_slx_sig[369].bits = 0xC5C00000;
+  gv_local.lookup_slx_sig[370].nbits = 12; gv_local.lookup_slx_sig[370].bits = 0xBC600000;
+  gv_local.lookup_slx_sig[371].nbits = 12; gv_local.lookup_slx_sig[371].bits = 0xC1B00000;
+  gv_local.lookup_slx_sig[372].nbits = 12; gv_local.lookup_slx_sig[372].bits = 0xBBE00000;
+  gv_local.lookup_slx_sig[373].nbits = 12; gv_local.lookup_slx_sig[373].bits = 0xC1500000;
+  gv_local.lookup_slx_sig[374].nbits = 12; gv_local.lookup_slx_sig[374].bits = 0xBAB00000;
+  gv_local.lookup_slx_sig[375].nbits = 12; gv_local.lookup_slx_sig[375].bits = 0xC1400000;
+  gv_local.lookup_slx_sig[376].nbits = 12; gv_local.lookup_slx_sig[376].bits = 0xB8400000;
+  gv_local.lookup_slx_sig[377].nbits = 12; gv_local.lookup_slx_sig[377].bits = 0xBA000000;
+  gv_local.lookup_slx_sig[378].nbits = 12; gv_local.lookup_slx_sig[378].bits = 0xB7B00000;
+  gv_local.lookup_slx_sig[379].nbits = 12; gv_local.lookup_slx_sig[379].bits = 0xC0400000;
+  gv_local.lookup_slx_sig[380].nbits = 12; gv_local.lookup_slx_sig[380].bits = 0x59400000;
+  gv_local.lookup_slx_sig[381].nbits = 12; gv_local.lookup_slx_sig[381].bits = 0x8B300000;
+  gv_local.lookup_slx_sig[382].nbits = 12; gv_local.lookup_slx_sig[382].bits = 0xB6B00000;
+  gv_local.lookup_slx_sig[383].nbits = 12; gv_local.lookup_slx_sig[383].bits = 0xBA100000;
+  gv_local.lookup_slx_sig[384].nbits = 12; gv_local.lookup_slx_sig[384].bits = 0x5EF00000;
+  gv_local.lookup_slx_sig[385].nbits = 12; gv_local.lookup_slx_sig[385].bits = 0xB5000000;
+  gv_local.lookup_slx_sig[386].nbits = 12; gv_local.lookup_slx_sig[386].bits = 0xB7200000;
+  gv_local.lookup_slx_sig[387].nbits = 12; gv_local.lookup_slx_sig[387].bits = 0xB7A00000;
+  gv_local.lookup_slx_sig[388].nbits = 12; gv_local.lookup_slx_sig[388].bits = 0x8B200000;
+  gv_local.lookup_slx_sig[389].nbits = 12; gv_local.lookup_slx_sig[389].bits = 0x3F800000;
+  gv_local.lookup_slx_sig[390].nbits = 12; gv_local.lookup_slx_sig[390].bits = 0xB7100000;
+  gv_local.lookup_slx_sig[391].nbits = 12; gv_local.lookup_slx_sig[391].bits = 0x3E400000;
+  gv_local.lookup_slx_sig[392].nbits = 12; gv_local.lookup_slx_sig[392].bits = 0x5EA00000;
+  gv_local.lookup_slx_sig[393].nbits = 12; gv_local.lookup_slx_sig[393].bits = 0xB6A00000;
+  gv_local.lookup_slx_sig[394].nbits = 12; gv_local.lookup_slx_sig[394].bits = 0x39C00000;
+  gv_local.lookup_slx_sig[395].nbits = 12; gv_local.lookup_slx_sig[395].bits = 0x3E900000;
+  gv_local.lookup_slx_sig[396].nbits = 12; gv_local.lookup_slx_sig[396].bits = 0x8B100000;
+  gv_local.lookup_slx_sig[397].nbits = 12; gv_local.lookup_slx_sig[397].bits = 0x39D00000;
+  gv_local.lookup_slx_sig[398].nbits = 12; gv_local.lookup_slx_sig[398].bits = 0x3B600000;
+  gv_local.lookup_slx_sig[399].nbits = 12; gv_local.lookup_slx_sig[399].bits = 0x3C200000;
+  gv_local.lookup_slx_sig[400].nbits = 12; gv_local.lookup_slx_sig[400].bits = 0x39600000;
+  gv_local.lookup_slx_sig[401].nbits = 12; gv_local.lookup_slx_sig[401].bits = 0x3D700000;
+  gv_local.lookup_slx_sig[402].nbits = 12; gv_local.lookup_slx_sig[402].bits = 0x35900000;
+  gv_local.lookup_slx_sig[403].nbits = 12; gv_local.lookup_slx_sig[403].bits = 0x1E900000;
+  gv_local.lookup_slx_sig[404].nbits = 12; gv_local.lookup_slx_sig[404].bits = 0x34200000;
+  gv_local.lookup_slx_sig[405].nbits = 12; gv_local.lookup_slx_sig[405].bits = 0x2F700000;
+  gv_local.lookup_slx_sig[406].nbits = 12; gv_local.lookup_slx_sig[406].bits = 0x33700000;
+  gv_local.lookup_slx_sig[407].nbits = 12; gv_local.lookup_slx_sig[407].bits = 0x33000000;
+  gv_local.lookup_slx_sig[408].nbits = 12; gv_local.lookup_slx_sig[408].bits = 0x2F000000;
+  gv_local.lookup_slx_sig[409].nbits = 12; gv_local.lookup_slx_sig[409].bits = 0x37200000;
+  gv_local.lookup_slx_sig[410].nbits = 12; gv_local.lookup_slx_sig[410].bits = 0x1C400000;
+  gv_local.lookup_slx_sig[411].nbits = 12; gv_local.lookup_slx_sig[411].bits = 0x28500000;
+  gv_local.lookup_slx_sig[412].nbits = 12; gv_local.lookup_slx_sig[412].bits = 0x1CE00000;
+  gv_local.lookup_slx_sig[413].nbits = 12; gv_local.lookup_slx_sig[413].bits = 0x1A800000;
+  gv_local.lookup_slx_sig[414].nbits = 12; gv_local.lookup_slx_sig[414].bits = 0x1EB00000;
+  gv_local.lookup_slx_sig[415].nbits = 13; gv_local.lookup_slx_sig[415].bits = 0xCEC80000;
+  gv_local.lookup_slx_sig[416].nbits = 13; gv_local.lookup_slx_sig[416].bits = 0xD6100000;
+  gv_local.lookup_slx_sig[417].nbits = 13; gv_local.lookup_slx_sig[417].bits = 0xD7E00000;
+  gv_local.lookup_slx_sig[418].nbits = 12; gv_local.lookup_slx_sig[418].bits = 0x1A100000;
+  gv_local.lookup_slx_sig[419].nbits = 12; gv_local.lookup_slx_sig[419].bits = 0x19300000;
+  gv_local.lookup_slx_sig[420].nbits = 12; gv_local.lookup_slx_sig[420].bits = 0x1CF00000;
+  gv_local.lookup_slx_sig[421].nbits = 12; gv_local.lookup_slx_sig[421].bits = 0x2A300000;
+  gv_local.lookup_slx_sig[422].nbits = 13; gv_local.lookup_slx_sig[422].bits = 0xD4B00000;
+  gv_local.lookup_slx_sig[423].nbits = 13; gv_local.lookup_slx_sig[423].bits = 0xD6380000;
+  gv_local.lookup_slx_sig[424].nbits = 12; gv_local.lookup_slx_sig[424].bits = 0x1A000000;
+  gv_local.lookup_slx_sig[425].nbits = 13; gv_local.lookup_slx_sig[425].bits = 0xCB280000;
+  gv_local.lookup_slx_sig[426].nbits = 13; gv_local.lookup_slx_sig[426].bits = 0xD4F00000;
+  gv_local.lookup_slx_sig[427].nbits = 13; gv_local.lookup_slx_sig[427].bits = 0xD4B80000;
+  gv_local.lookup_slx_sig[428].nbits = 12; gv_local.lookup_slx_sig[428].bits = 0x1B700000;
+  gv_local.lookup_slx_sig[429].nbits = 13; gv_local.lookup_slx_sig[429].bits = 0xD5680000;
+  gv_local.lookup_slx_sig[430].nbits = 13; gv_local.lookup_slx_sig[430].bits = 0xCCD80000;
+  gv_local.lookup_slx_sig[431].nbits = 13; gv_local.lookup_slx_sig[431].bits = 0xCE500000;
+  gv_local.lookup_slx_sig[432].nbits = 13; gv_local.lookup_slx_sig[432].bits = 0xCEC00000;
+  gv_local.lookup_slx_sig[433].nbits = 13; gv_local.lookup_slx_sig[433].bits = 0xC9A80000;
+  gv_local.lookup_slx_sig[434].nbits = 13; gv_local.lookup_slx_sig[434].bits = 0xCB200000;
+  gv_local.lookup_slx_sig[435].nbits = 13; gv_local.lookup_slx_sig[435].bits = 0xBD780000;
+  gv_local.lookup_slx_sig[436].nbits = 13; gv_local.lookup_slx_sig[436].bits = 0xC8780000;
+  gv_local.lookup_slx_sig[437].nbits = 13; gv_local.lookup_slx_sig[437].bits = 0xBBF00000;
+  gv_local.lookup_slx_sig[438].nbits = 13; gv_local.lookup_slx_sig[438].bits = 0xBD600000;
+  gv_local.lookup_slx_sig[439].nbits = 13; gv_local.lookup_slx_sig[439].bits = 0xC8700000;
+  gv_local.lookup_slx_sig[440].nbits = 13; gv_local.lookup_slx_sig[440].bits = 0xB7D00000;
+  gv_local.lookup_slx_sig[441].nbits = 13; gv_local.lookup_slx_sig[441].bits = 0xC4580000;
+  gv_local.lookup_slx_sig[442].nbits = 13; gv_local.lookup_slx_sig[442].bits = 0xC5280000;
+  gv_local.lookup_slx_sig[443].nbits = 13; gv_local.lookup_slx_sig[443].bits = 0xC0B00000;
+  gv_local.lookup_slx_sig[444].nbits = 13; gv_local.lookup_slx_sig[444].bits = 0xB9300000;
+  gv_local.lookup_slx_sig[445].nbits = 13; gv_local.lookup_slx_sig[445].bits = 0xBC780000;
+  gv_local.lookup_slx_sig[446].nbits = 13; gv_local.lookup_slx_sig[446].bits = 0xB7000000;
+  gv_local.lookup_slx_sig[447].nbits = 13; gv_local.lookup_slx_sig[447].bits = 0xBD680000;
+  gv_local.lookup_slx_sig[448].nbits = 13; gv_local.lookup_slx_sig[448].bits = 0xC1A80000;
+  gv_local.lookup_slx_sig[449].nbits = 13; gv_local.lookup_slx_sig[449].bits = 0xBAA80000;
+  gv_local.lookup_slx_sig[450].nbits = 13; gv_local.lookup_slx_sig[450].bits = 0xB7800000;
+  gv_local.lookup_slx_sig[451].nbits = 13; gv_local.lookup_slx_sig[451].bits = 0xB9380000;
+  gv_local.lookup_slx_sig[452].nbits = 13; gv_local.lookup_slx_sig[452].bits = 0x5E480000;
+  gv_local.lookup_slx_sig[453].nbits = 13; gv_local.lookup_slx_sig[453].bits = 0xB6980000;
+  gv_local.lookup_slx_sig[454].nbits = 13; gv_local.lookup_slx_sig[454].bits = 0xBBF80000;
+  gv_local.lookup_slx_sig[455].nbits = 13; gv_local.lookup_slx_sig[455].bits = 0x8B000000;
+  gv_local.lookup_slx_sig[456].nbits = 13; gv_local.lookup_slx_sig[456].bits = 0xB6900000;
+  gv_local.lookup_slx_sig[457].nbits = 13; gv_local.lookup_slx_sig[457].bits = 0x8B800000;
+  gv_local.lookup_slx_sig[458].nbits = 13; gv_local.lookup_slx_sig[458].bits = 0x5E400000;
+  gv_local.lookup_slx_sig[459].nbits = 13; gv_local.lookup_slx_sig[459].bits = 0xB5100000;
+  gv_local.lookup_slx_sig[460].nbits = 13; gv_local.lookup_slx_sig[460].bits = 0xB5380000;
+  gv_local.lookup_slx_sig[461].nbits = 13; gv_local.lookup_slx_sig[461].bits = 0xBA400000;
+  gv_local.lookup_slx_sig[462].nbits = 13; gv_local.lookup_slx_sig[462].bits = 0xBAF00000;
+  gv_local.lookup_slx_sig[463].nbits = 13; gv_local.lookup_slx_sig[463].bits = 0xB5300000;
+  gv_local.lookup_slx_sig[464].nbits = 13; gv_local.lookup_slx_sig[464].bits = 0x3B700000;
+  gv_local.lookup_slx_sig[465].nbits = 13; gv_local.lookup_slx_sig[465].bits = 0xBAF80000;
+  gv_local.lookup_slx_sig[466].nbits = 13; gv_local.lookup_slx_sig[466].bits = 0x8B080000;
+  gv_local.lookup_slx_sig[467].nbits = 13; gv_local.lookup_slx_sig[467].bits = 0x5EE00000;
+  gv_local.lookup_slx_sig[468].nbits = 13; gv_local.lookup_slx_sig[468].bits = 0x59580000;
+  gv_local.lookup_slx_sig[469].nbits = 13; gv_local.lookup_slx_sig[469].bits = 0x5E580000;
+  gv_local.lookup_slx_sig[470].nbits = 13; gv_local.lookup_slx_sig[470].bits = 0x59080000;
+  gv_local.lookup_slx_sig[471].nbits = 13; gv_local.lookup_slx_sig[471].bits = 0x39A00000;
+  gv_local.lookup_slx_sig[472].nbits = 13; gv_local.lookup_slx_sig[472].bits = 0x39F00000;
+  gv_local.lookup_slx_sig[473].nbits = 13; gv_local.lookup_slx_sig[473].bits = 0x37300000;
+  gv_local.lookup_slx_sig[474].nbits = 13; gv_local.lookup_slx_sig[474].bits = 0x3D600000;
+  gv_local.lookup_slx_sig[475].nbits = 13; gv_local.lookup_slx_sig[475].bits = 0x39F80000;
+  gv_local.lookup_slx_sig[476].nbits = 13; gv_local.lookup_slx_sig[476].bits = 0x28480000;
+  gv_local.lookup_slx_sig[477].nbits = 13; gv_local.lookup_slx_sig[477].bits = 0x5E500000;
+  gv_local.lookup_slx_sig[478].nbits = 13; gv_local.lookup_slx_sig[478].bits = 0x28680000;
+  gv_local.lookup_slx_sig[479].nbits = 13; gv_local.lookup_slx_sig[479].bits = 0x3B780000;
+  gv_local.lookup_slx_sig[480].nbits = 13; gv_local.lookup_slx_sig[480].bits = 0x32980000;
+  gv_local.lookup_slx_sig[481].nbits = 13; gv_local.lookup_slx_sig[481].bits = 0x2F600000;
+  gv_local.lookup_slx_sig[482].nbits = 13; gv_local.lookup_slx_sig[482].bits = 0x37380000;
+  gv_local.lookup_slx_sig[483].nbits = 13; gv_local.lookup_slx_sig[483].bits = 0x39A80000;
+  gv_local.lookup_slx_sig[484].nbits = 13; gv_local.lookup_slx_sig[484].bits = 0x35880000;
+  gv_local.lookup_slx_sig[485].nbits = 13; gv_local.lookup_slx_sig[485].bits = 0x35800000;
+  gv_local.lookup_slx_sig[486].nbits = 13; gv_local.lookup_slx_sig[486].bits = 0x1E800000;
+  gv_local.lookup_slx_sig[487].nbits = 13; gv_local.lookup_slx_sig[487].bits = 0x1EA80000;
+  gv_local.lookup_slx_sig[488].nbits = 13; gv_local.lookup_slx_sig[488].bits = 0x33680000;
+  gv_local.lookup_slx_sig[489].nbits = 13; gv_local.lookup_slx_sig[489].bits = 0x1E880000;
+  gv_local.lookup_slx_sig[490].nbits = 13; gv_local.lookup_slx_sig[490].bits = 0x2F680000;
+  gv_local.lookup_slx_sig[491].nbits = 13; gv_local.lookup_slx_sig[491].bits = 0x33600000;
+  gv_local.lookup_slx_sig[492].nbits = 14; gv_local.lookup_slx_sig[492].bits = 0xCEF40000;
+  gv_local.lookup_slx_sig[493].nbits = 13; gv_local.lookup_slx_sig[493].bits = 0x59000000;
+  gv_local.lookup_slx_sig[494].nbits = 13; gv_local.lookup_slx_sig[494].bits = 0x19200000;
+  gv_local.lookup_slx_sig[495].nbits = 13; gv_local.lookup_slx_sig[495].bits = 0x1EA00000;
+  gv_local.lookup_slx_sig[496].nbits = 13; gv_local.lookup_slx_sig[496].bits = 0x1A900000;
+  gv_local.lookup_slx_sig[497].nbits = 13; gv_local.lookup_slx_sig[497].bits = 0x32900000;
+  gv_local.lookup_slx_sig[498].nbits = 13; gv_local.lookup_slx_sig[498].bits = 0x28600000;
+  gv_local.lookup_slx_sig[499].nbits = 14; gv_local.lookup_slx_sig[499].bits = 0xCE580000;
+  gv_local.lookup_slx_sig[500].nbits = 13; gv_local.lookup_slx_sig[500].bits = 0x1A980000;
+  gv_local.lookup_slx_sig[501].nbits = 14; gv_local.lookup_slx_sig[501].bits = 0xCA640000;
+  gv_local.lookup_slx_sig[502].nbits = 13; gv_local.lookup_slx_sig[502].bits = 0x19280000;
+  gv_local.lookup_slx_sig[503].nbits = 14; gv_local.lookup_slx_sig[503].bits = 0xD6240000;
+  gv_local.lookup_slx_sig[504].nbits = 14; gv_local.lookup_slx_sig[504].bits = 0xD5600000;
+  gv_local.lookup_slx_sig[505].nbits = 13; gv_local.lookup_slx_sig[505].bits = 0x28400000;
+  gv_local.lookup_slx_sig[506].nbits = 14; gv_local.lookup_slx_sig[506].bits = 0xD6200000;
+  gv_local.lookup_slx_sig[507].nbits = 14; gv_local.lookup_slx_sig[507].bits = 0xCE5C0000;
+  gv_local.lookup_slx_sig[508].nbits = 14; gv_local.lookup_slx_sig[508].bits = 0xD5640000;
+  gv_local.lookup_slx_sig[509].nbits = 14; gv_local.lookup_slx_sig[509].bits = 0xCEF00000;
+  gv_local.lookup_slx_sig[510].nbits = 14; gv_local.lookup_slx_sig[510].bits = 0xCA600000;
+  gv_local.lookup_slx_sig[511].nbits =  4; gv_local.lookup_slx_sig[511].bits = 0x40000000;
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  /* reverse huffman lookup table
+   */
+  memset (gv_local.rlookup_slx_sig, 0, sizeof(uint16_t)*REV_HUFF_TREESIZE_16);
+
+  for (i=0; i<SIG_HUFF_TREESIZE; i++)
+  {
+    val = gv_local.lookup_slx_sig[i].bits >> 16;
+    gv_local.rlookup_slx_sig [val] = (uint16_t) i;
+    for (j=1; j<=(0xFFFF>>gv_local.lookup_slx_sig[i].nbits); j++)
+      gv_local.rlookup_slx_sig [val+j] = (uint16_t) i;
+  }
+#endif
+
+  _s_sort_lookup (gv_local.lookup_slx_sig, gv_local.idx_slx_sig, SIG_HUFF_TREESIZE);
+
+  gv_local.lookup_slx_sig_initialized = 1;
+}
+/*
+ */
+static void _s_init_int_slx_default (void)
+{
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  int      i, j;
+  uint16_t val;
+#endif
+
+  memset (gv_local.lookup_slx_int,  0, sizeof(SRALookup)*INT_HUFF_TREESIZE);
+
+  gv_local.lookup_slx_int[   0].nbits = 13; gv_local.lookup_slx_int[   0].bits = 0x9DF80000;
+  gv_local.lookup_slx_int[   1].nbits = 13; gv_local.lookup_slx_int[   1].bits = 0x9DF00000;
+  gv_local.lookup_slx_int[   2].nbits = 13; gv_local.lookup_slx_int[   2].bits = 0xA4A00000;
+  gv_local.lookup_slx_int[   3].nbits = 13; gv_local.lookup_slx_int[   3].bits = 0xA7C00000;
+  gv_local.lookup_slx_int[   4].nbits = 13; gv_local.lookup_slx_int[   4].bits = 0xA4A80000;
+  gv_local.lookup_slx_int[   5].nbits = 13; gv_local.lookup_slx_int[   5].bits = 0xA7C80000;
+  gv_local.lookup_slx_int[   6].nbits = 13; gv_local.lookup_slx_int[   6].bits = 0xB6000000;
+  gv_local.lookup_slx_int[   7].nbits = 13; gv_local.lookup_slx_int[   7].bits = 0xAF600000;
+  gv_local.lookup_slx_int[   8].nbits = 13; gv_local.lookup_slx_int[   8].bits = 0xAF680000;
+  gv_local.lookup_slx_int[   9].nbits = 13; gv_local.lookup_slx_int[   9].bits = 0xBBA00000;
+  gv_local.lookup_slx_int[  10].nbits = 13; gv_local.lookup_slx_int[  10].bits = 0xB6080000;
+  gv_local.lookup_slx_int[  11].nbits = 13; gv_local.lookup_slx_int[  11].bits = 0xBBA80000;
+  gv_local.lookup_slx_int[  12].nbits = 13; gv_local.lookup_slx_int[  12].bits = 0xBDC80000;
+  gv_local.lookup_slx_int[  13].nbits = 13; gv_local.lookup_slx_int[  13].bits = 0xBDC00000;
+  gv_local.lookup_slx_int[  14].nbits = 13; gv_local.lookup_slx_int[  14].bits = 0xCA400000;
+  gv_local.lookup_slx_int[  15].nbits = 13; gv_local.lookup_slx_int[  15].bits = 0xC1F80000;
+  gv_local.lookup_slx_int[  16].nbits = 13; gv_local.lookup_slx_int[  16].bits = 0xC1F00000;
+  gv_local.lookup_slx_int[  17].nbits = 13; gv_local.lookup_slx_int[  17].bits = 0xCA480000;
+  gv_local.lookup_slx_int[  18].nbits = 13; gv_local.lookup_slx_int[  18].bits = 0xCF600000;
+  gv_local.lookup_slx_int[  19].nbits = 13; gv_local.lookup_slx_int[  19].bits = 0xD2C00000;
+  gv_local.lookup_slx_int[  20].nbits = 13; gv_local.lookup_slx_int[  20].bits = 0xCF680000;
+  gv_local.lookup_slx_int[  21].nbits = 13; gv_local.lookup_slx_int[  21].bits = 0xD2C80000;
+  gv_local.lookup_slx_int[  22].nbits = 13; gv_local.lookup_slx_int[  22].bits = 0xDA200000;
+  gv_local.lookup_slx_int[  23].nbits = 13; gv_local.lookup_slx_int[  23].bits = 0xDE900000;
+  gv_local.lookup_slx_int[  24].nbits = 13; gv_local.lookup_slx_int[  24].bits = 0xDA280000;
+  gv_local.lookup_slx_int[  25].nbits = 12; gv_local.lookup_slx_int[  25].bits = 0x02C00000;
+  gv_local.lookup_slx_int[  26].nbits = 13; gv_local.lookup_slx_int[  26].bits = 0xDE980000;
+  gv_local.lookup_slx_int[  27].nbits = 12; gv_local.lookup_slx_int[  27].bits = 0x02D00000;
+  gv_local.lookup_slx_int[  28].nbits = 12; gv_local.lookup_slx_int[  28].bits = 0x0C400000;
+  gv_local.lookup_slx_int[  29].nbits = 12; gv_local.lookup_slx_int[  29].bits = 0x0C500000;
+  gv_local.lookup_slx_int[  30].nbits = 12; gv_local.lookup_slx_int[  30].bits = 0x1A800000;
+  gv_local.lookup_slx_int[  31].nbits = 12; gv_local.lookup_slx_int[  31].bits = 0x1A900000;
+  gv_local.lookup_slx_int[  32].nbits = 12; gv_local.lookup_slx_int[  32].bits = 0x21300000;
+  gv_local.lookup_slx_int[  33].nbits = 12; gv_local.lookup_slx_int[  33].bits = 0x21100000;
+  gv_local.lookup_slx_int[  34].nbits = 12; gv_local.lookup_slx_int[  34].bits = 0x29900000;
+  gv_local.lookup_slx_int[  35].nbits = 12; gv_local.lookup_slx_int[  35].bits = 0x3C200000;
+  gv_local.lookup_slx_int[  36].nbits = 12; gv_local.lookup_slx_int[  36].bits = 0x3C000000;
+  gv_local.lookup_slx_int[  37].nbits = 12; gv_local.lookup_slx_int[  37].bits = 0x3E600000;
+  gv_local.lookup_slx_int[  38].nbits = 12; gv_local.lookup_slx_int[  38].bits = 0x4C000000;
+  gv_local.lookup_slx_int[  39].nbits = 12; gv_local.lookup_slx_int[  39].bits = 0x4F000000;
+  gv_local.lookup_slx_int[  40].nbits = 12; gv_local.lookup_slx_int[  40].bits = 0x4C400000;
+  gv_local.lookup_slx_int[  41].nbits = 12; gv_local.lookup_slx_int[  41].bits = 0x4F300000;
+  gv_local.lookup_slx_int[  42].nbits = 12; gv_local.lookup_slx_int[  42].bits = 0x58D00000;
+  gv_local.lookup_slx_int[  43].nbits = 12; gv_local.lookup_slx_int[  43].bits = 0x4F100000;
+  gv_local.lookup_slx_int[  44].nbits = 12; gv_local.lookup_slx_int[  44].bits = 0x5BA00000;
+  gv_local.lookup_slx_int[  45].nbits = 12; gv_local.lookup_slx_int[  45].bits = 0x6D000000;
+  gv_local.lookup_slx_int[  46].nbits = 12; gv_local.lookup_slx_int[  46].bits = 0x6F200000;
+  gv_local.lookup_slx_int[  47].nbits = 12; gv_local.lookup_slx_int[  47].bits = 0x7D800000;
+  gv_local.lookup_slx_int[  48].nbits = 12; gv_local.lookup_slx_int[  48].bits = 0x84800000;
+  gv_local.lookup_slx_int[  49].nbits = 12; gv_local.lookup_slx_int[  49].bits = 0x86600000;
+  gv_local.lookup_slx_int[  50].nbits = 12; gv_local.lookup_slx_int[  50].bits = 0x8DC00000;
+  gv_local.lookup_slx_int[  51].nbits = 12; gv_local.lookup_slx_int[  51].bits = 0x8DD00000;
+  gv_local.lookup_slx_int[  52].nbits = 12; gv_local.lookup_slx_int[  52].bits = 0x91100000;
+  gv_local.lookup_slx_int[  53].nbits = 12; gv_local.lookup_slx_int[  53].bits = 0x95000000;
+  gv_local.lookup_slx_int[  54].nbits = 12; gv_local.lookup_slx_int[  54].bits = 0x9CA00000;
+  gv_local.lookup_slx_int[  55].nbits = 12; gv_local.lookup_slx_int[  55].bits = 0x9DE00000;
+  gv_local.lookup_slx_int[  56].nbits = 12; gv_local.lookup_slx_int[  56].bits = 0x9CB00000;
+  gv_local.lookup_slx_int[  57].nbits = 12; gv_local.lookup_slx_int[  57].bits = 0xA3200000;
+  gv_local.lookup_slx_int[  58].nbits = 12; gv_local.lookup_slx_int[  58].bits = 0xA5E00000;
+  gv_local.lookup_slx_int[  59].nbits = 12; gv_local.lookup_slx_int[  59].bits = 0xA9500000;
+  gv_local.lookup_slx_int[  60].nbits = 12; gv_local.lookup_slx_int[  60].bits = 0xAF400000;
+  gv_local.lookup_slx_int[  61].nbits = 12; gv_local.lookup_slx_int[  61].bits = 0xAF700000;
+  gv_local.lookup_slx_int[  62].nbits = 12; gv_local.lookup_slx_int[  62].bits = 0xB6900000;
+  gv_local.lookup_slx_int[  63].nbits = 12; gv_local.lookup_slx_int[  63].bits = 0xB6100000;
+  gv_local.lookup_slx_int[  64].nbits = 12; gv_local.lookup_slx_int[  64].bits = 0xBBB00000;
+  gv_local.lookup_slx_int[  65].nbits = 12; gv_local.lookup_slx_int[  65].bits = 0xBD900000;
+  gv_local.lookup_slx_int[  66].nbits = 12; gv_local.lookup_slx_int[  66].bits = 0xC1A00000;
+  gv_local.lookup_slx_int[  67].nbits = 12; gv_local.lookup_slx_int[  67].bits = 0xC1E00000;
+  gv_local.lookup_slx_int[  68].nbits = 12; gv_local.lookup_slx_int[  68].bits = 0xC9400000;
+  gv_local.lookup_slx_int[  69].nbits = 12; gv_local.lookup_slx_int[  69].bits = 0xCA500000;
+  gv_local.lookup_slx_int[  70].nbits = 12; gv_local.lookup_slx_int[  70].bits = 0xCB600000;
+  gv_local.lookup_slx_int[  71].nbits = 12; gv_local.lookup_slx_int[  71].bits = 0xCB700000;
+  gv_local.lookup_slx_int[  72].nbits = 12; gv_local.lookup_slx_int[  72].bits = 0xCFF00000;
+  gv_local.lookup_slx_int[  73].nbits = 12; gv_local.lookup_slx_int[  73].bits = 0xD9900000;
+  gv_local.lookup_slx_int[  74].nbits = 12; gv_local.lookup_slx_int[  74].bits = 0xD9800000;
+  gv_local.lookup_slx_int[  75].nbits = 12; gv_local.lookup_slx_int[  75].bits = 0xDA300000;
+  gv_local.lookup_slx_int[  76].nbits = 11; gv_local.lookup_slx_int[  76].bits = 0x02800000;
+  gv_local.lookup_slx_int[  77].nbits = 11; gv_local.lookup_slx_int[  77].bits = 0x02A00000;
+  gv_local.lookup_slx_int[  78].nbits = 11; gv_local.lookup_slx_int[  78].bits = 0x0C600000;
+  gv_local.lookup_slx_int[  79].nbits = 11; gv_local.lookup_slx_int[  79].bits = 0x09800000;
+  gv_local.lookup_slx_int[  80].nbits = 11; gv_local.lookup_slx_int[  80].bits = 0x0D600000;
+  gv_local.lookup_slx_int[  81].nbits = 11; gv_local.lookup_slx_int[  81].bits = 0x11200000;
+  gv_local.lookup_slx_int[  82].nbits = 11; gv_local.lookup_slx_int[  82].bits = 0x1AA00000;
+  gv_local.lookup_slx_int[  83].nbits = 11; gv_local.lookup_slx_int[  83].bits = 0x27800000;
+  gv_local.lookup_slx_int[  84].nbits = 11; gv_local.lookup_slx_int[  84].bits = 0x29400000;
+  gv_local.lookup_slx_int[  85].nbits = 11; gv_local.lookup_slx_int[  85].bits = 0x29A00000;
+  gv_local.lookup_slx_int[  86].nbits = 11; gv_local.lookup_slx_int[  86].bits = 0x32800000;
+  gv_local.lookup_slx_int[  87].nbits = 11; gv_local.lookup_slx_int[  87].bits = 0x3C600000;
+  gv_local.lookup_slx_int[  88].nbits = 11; gv_local.lookup_slx_int[  88].bits = 0x42000000;
+  gv_local.lookup_slx_int[  89].nbits = 11; gv_local.lookup_slx_int[  89].bits = 0x42E00000;
+  gv_local.lookup_slx_int[  90].nbits = 11; gv_local.lookup_slx_int[  90].bits = 0x4C200000;
+  gv_local.lookup_slx_int[  91].nbits = 11; gv_local.lookup_slx_int[  91].bits = 0x4E400000;
+  gv_local.lookup_slx_int[  92].nbits = 11; gv_local.lookup_slx_int[  92].bits = 0x58600000;
+  gv_local.lookup_slx_int[  93].nbits = 11; gv_local.lookup_slx_int[  93].bits = 0x58400000;
+  gv_local.lookup_slx_int[  94].nbits = 11; gv_local.lookup_slx_int[  94].bits = 0x58A00000;
+  gv_local.lookup_slx_int[  95].nbits = 11; gv_local.lookup_slx_int[  95].bits = 0x63E00000;
+  gv_local.lookup_slx_int[  96].nbits = 11; gv_local.lookup_slx_int[  96].bits = 0x65800000;
+  gv_local.lookup_slx_int[  97].nbits = 11; gv_local.lookup_slx_int[  97].bits = 0x6D200000;
+  gv_local.lookup_slx_int[  98].nbits = 11; gv_local.lookup_slx_int[  98].bits = 0x6D400000;
+  gv_local.lookup_slx_int[  99].nbits = 11; gv_local.lookup_slx_int[  99].bits = 0x75C00000;
+  gv_local.lookup_slx_int[ 100].nbits = 11; gv_local.lookup_slx_int[ 100].bits = 0x75E00000;
+  gv_local.lookup_slx_int[ 101].nbits = 11; gv_local.lookup_slx_int[ 101].bits = 0x84A00000;
+  gv_local.lookup_slx_int[ 102].nbits = 11; gv_local.lookup_slx_int[ 102].bits = 0x87200000;
+  gv_local.lookup_slx_int[ 103].nbits = 11; gv_local.lookup_slx_int[ 103].bits = 0x87E00000;
+  gv_local.lookup_slx_int[ 104].nbits = 11; gv_local.lookup_slx_int[ 104].bits = 0x8DE00000;
+  gv_local.lookup_slx_int[ 105].nbits = 11; gv_local.lookup_slx_int[ 105].bits = 0x90400000;
+  gv_local.lookup_slx_int[ 106].nbits = 11; gv_local.lookup_slx_int[ 106].bits = 0x91E00000;
+  gv_local.lookup_slx_int[ 107].nbits = 11; gv_local.lookup_slx_int[ 107].bits = 0x9CC00000;
+  gv_local.lookup_slx_int[ 108].nbits = 11; gv_local.lookup_slx_int[ 108].bits = 0x9CE00000;
+  gv_local.lookup_slx_int[ 109].nbits = 11; gv_local.lookup_slx_int[ 109].bits = 0xA3000000;
+  gv_local.lookup_slx_int[ 110].nbits = 11; gv_local.lookup_slx_int[ 110].bits = 0xA3A00000;
+  gv_local.lookup_slx_int[ 111].nbits = 11; gv_local.lookup_slx_int[ 111].bits = 0xA4800000;
+  gv_local.lookup_slx_int[ 112].nbits = 11; gv_local.lookup_slx_int[ 112].bits = 0xA4E00000;
+  gv_local.lookup_slx_int[ 113].nbits = 11; gv_local.lookup_slx_int[ 113].bits = 0xA7E00000;
+  gv_local.lookup_slx_int[ 114].nbits = 11; gv_local.lookup_slx_int[ 114].bits = 0xAE000000;
+  gv_local.lookup_slx_int[ 115].nbits = 11; gv_local.lookup_slx_int[ 115].bits = 0xB1A00000;
+  gv_local.lookup_slx_int[ 116].nbits = 11; gv_local.lookup_slx_int[ 116].bits = 0xB3A00000;
+  gv_local.lookup_slx_int[ 117].nbits = 11; gv_local.lookup_slx_int[ 117].bits = 0xB6A00000;
+  gv_local.lookup_slx_int[ 118].nbits = 11; gv_local.lookup_slx_int[ 118].bits = 0xBD000000;
+  gv_local.lookup_slx_int[ 119].nbits = 11; gv_local.lookup_slx_int[ 119].bits = 0xBA600000;
+  gv_local.lookup_slx_int[ 120].nbits = 11; gv_local.lookup_slx_int[ 120].bits = 0xBF000000;
+  gv_local.lookup_slx_int[ 121].nbits = 11; gv_local.lookup_slx_int[ 121].bits = 0xBF200000;
+  gv_local.lookup_slx_int[ 122].nbits = 11; gv_local.lookup_slx_int[ 122].bits = 0xC1800000;
+  gv_local.lookup_slx_int[ 123].nbits = 11; gv_local.lookup_slx_int[ 123].bits = 0xC1C00000;
+  gv_local.lookup_slx_int[ 124].nbits = 11; gv_local.lookup_slx_int[ 124].bits = 0xC9600000;
+  gv_local.lookup_slx_int[ 125].nbits = 11; gv_local.lookup_slx_int[ 125].bits = 0xCA600000;
+  gv_local.lookup_slx_int[ 126].nbits = 11; gv_local.lookup_slx_int[ 126].bits = 0xCD000000;
+  gv_local.lookup_slx_int[ 127].nbits = 11; gv_local.lookup_slx_int[ 127].bits = 0xCF800000;
+  gv_local.lookup_slx_int[ 128].nbits = 11; gv_local.lookup_slx_int[ 128].bits = 0xCF400000;
+  gv_local.lookup_slx_int[ 129].nbits = 11; gv_local.lookup_slx_int[ 129].bits = 0xD2200000;
+  gv_local.lookup_slx_int[ 130].nbits = 11; gv_local.lookup_slx_int[ 130].bits = 0xD6800000;
+  gv_local.lookup_slx_int[ 131].nbits = 11; gv_local.lookup_slx_int[ 131].bits = 0xD6A00000;
+  gv_local.lookup_slx_int[ 132].nbits = 11; gv_local.lookup_slx_int[ 132].bits = 0xD9A00000;
+  gv_local.lookup_slx_int[ 133].nbits = 11; gv_local.lookup_slx_int[ 133].bits = 0xDBA00000;
+  gv_local.lookup_slx_int[ 134].nbits = 11; gv_local.lookup_slx_int[ 134].bits = 0xDBE00000;
+  gv_local.lookup_slx_int[ 135].nbits = 10; gv_local.lookup_slx_int[ 135].bits = 0x08400000;
+  gv_local.lookup_slx_int[ 136].nbits = 10; gv_local.lookup_slx_int[ 136].bits = 0x08C00000;
+  gv_local.lookup_slx_int[ 137].nbits = 10; gv_local.lookup_slx_int[ 137].bits = 0x0A000000;
+  gv_local.lookup_slx_int[ 138].nbits = 10; gv_local.lookup_slx_int[ 138].bits = 0x0C000000;
+  gv_local.lookup_slx_int[ 139].nbits = 10; gv_local.lookup_slx_int[ 139].bits = 0x0D000000;
+  gv_local.lookup_slx_int[ 140].nbits = 10; gv_local.lookup_slx_int[ 140].bits = 0x18000000;
+  gv_local.lookup_slx_int[ 141].nbits = 10; gv_local.lookup_slx_int[ 141].bits = 0x1AC00000;
+  gv_local.lookup_slx_int[ 142].nbits = 10; gv_local.lookup_slx_int[ 142].bits = 0x21400000;
+  gv_local.lookup_slx_int[ 143].nbits = 10; gv_local.lookup_slx_int[ 143].bits = 0x21800000;
+  gv_local.lookup_slx_int[ 144].nbits = 10; gv_local.lookup_slx_int[ 144].bits = 0x26000000;
+  gv_local.lookup_slx_int[ 145].nbits = 10; gv_local.lookup_slx_int[ 145].bits = 0x2B800000;
+  gv_local.lookup_slx_int[ 146].nbits = 10; gv_local.lookup_slx_int[ 146].bits = 0x32C00000;
+  gv_local.lookup_slx_int[ 147].nbits = 10; gv_local.lookup_slx_int[ 147].bits = 0x34800000;
+  gv_local.lookup_slx_int[ 148].nbits = 10; gv_local.lookup_slx_int[ 148].bits = 0x3CC00000;
+  gv_local.lookup_slx_int[ 149].nbits = 10; gv_local.lookup_slx_int[ 149].bits = 0x3E800000;
+  gv_local.lookup_slx_int[ 150].nbits = 10; gv_local.lookup_slx_int[ 150].bits = 0x49C00000;
+  gv_local.lookup_slx_int[ 151].nbits = 10; gv_local.lookup_slx_int[ 151].bits = 0x48C00000;
+  gv_local.lookup_slx_int[ 152].nbits = 10; gv_local.lookup_slx_int[ 152].bits = 0x49800000;
+  gv_local.lookup_slx_int[ 153].nbits = 10; gv_local.lookup_slx_int[ 153].bits = 0x4E800000;
+  gv_local.lookup_slx_int[ 154].nbits = 10; gv_local.lookup_slx_int[ 154].bits = 0x56400000;
+  gv_local.lookup_slx_int[ 155].nbits = 10; gv_local.lookup_slx_int[ 155].bits = 0x5BC00000;
+  gv_local.lookup_slx_int[ 156].nbits = 10; gv_local.lookup_slx_int[ 156].bits = 0x59400000;
+  gv_local.lookup_slx_int[ 157].nbits = 10; gv_local.lookup_slx_int[ 157].bits = 0x63800000;
+  gv_local.lookup_slx_int[ 158].nbits = 10; gv_local.lookup_slx_int[ 158].bits = 0x64C00000;
+  gv_local.lookup_slx_int[ 159].nbits = 10; gv_local.lookup_slx_int[ 159].bits = 0x6F400000;
+  gv_local.lookup_slx_int[ 160].nbits = 10; gv_local.lookup_slx_int[ 160].bits = 0x6FC00000;
+  gv_local.lookup_slx_int[ 161].nbits = 10; gv_local.lookup_slx_int[ 161].bits = 0x75400000;
+  gv_local.lookup_slx_int[ 162].nbits = 10; gv_local.lookup_slx_int[ 162].bits = 0x84C00000;
+  gv_local.lookup_slx_int[ 163].nbits = 10; gv_local.lookup_slx_int[ 163].bits = 0x86800000;
+  gv_local.lookup_slx_int[ 164].nbits = 10; gv_local.lookup_slx_int[ 164].bits = 0x87400000;
+  gv_local.lookup_slx_int[ 165].nbits = 10; gv_local.lookup_slx_int[ 165].bits = 0x87800000;
+  gv_local.lookup_slx_int[ 166].nbits = 10; gv_local.lookup_slx_int[ 166].bits = 0x8D800000;
+  gv_local.lookup_slx_int[ 167].nbits = 10; gv_local.lookup_slx_int[ 167].bits = 0x93C00000;
+  gv_local.lookup_slx_int[ 168].nbits = 10; gv_local.lookup_slx_int[ 168].bits = 0x95400000;
+  gv_local.lookup_slx_int[ 169].nbits = 10; gv_local.lookup_slx_int[ 169].bits = 0x9C000000;
+  gv_local.lookup_slx_int[ 170].nbits = 10; gv_local.lookup_slx_int[ 170].bits = 0xA2400000;
+  gv_local.lookup_slx_int[ 171].nbits = 10; gv_local.lookup_slx_int[ 171].bits = 0xA3C00000;
+  gv_local.lookup_slx_int[ 172].nbits = 10; gv_local.lookup_slx_int[ 172].bits = 0xA5000000;
+  gv_local.lookup_slx_int[ 173].nbits = 10; gv_local.lookup_slx_int[ 173].bits = 0xA7800000;
+  gv_local.lookup_slx_int[ 174].nbits = 10; gv_local.lookup_slx_int[ 174].bits = 0xAF000000;
+  gv_local.lookup_slx_int[ 175].nbits = 10; gv_local.lookup_slx_int[ 175].bits = 0xAF800000;
+  gv_local.lookup_slx_int[ 176].nbits = 10; gv_local.lookup_slx_int[ 176].bits = 0xB3C00000;
+  gv_local.lookup_slx_int[ 177].nbits = 10; gv_local.lookup_slx_int[ 177].bits = 0xB6C00000;
+  gv_local.lookup_slx_int[ 178].nbits = 10; gv_local.lookup_slx_int[ 178].bits = 0xBA000000;
+  gv_local.lookup_slx_int[ 179].nbits = 10; gv_local.lookup_slx_int[ 179].bits = 0xBF400000;
+  gv_local.lookup_slx_int[ 180].nbits = 10; gv_local.lookup_slx_int[ 180].bits = 0xC1000000;
+  gv_local.lookup_slx_int[ 181].nbits = 10; gv_local.lookup_slx_int[ 181].bits = 0xC5000000;
+  gv_local.lookup_slx_int[ 182].nbits = 10; gv_local.lookup_slx_int[ 182].bits = 0xCA000000;
+  gv_local.lookup_slx_int[ 183].nbits = 10; gv_local.lookup_slx_int[ 183].bits = 0xCB000000;
+  gv_local.lookup_slx_int[ 184].nbits = 10; gv_local.lookup_slx_int[ 184].bits = 0xD2400000;
+  gv_local.lookup_slx_int[ 185].nbits = 10; gv_local.lookup_slx_int[ 185].bits = 0xD3800000;
+  gv_local.lookup_slx_int[ 186].nbits = 10; gv_local.lookup_slx_int[ 186].bits = 0xD6C00000;
+  gv_local.lookup_slx_int[ 187].nbits = 10; gv_local.lookup_slx_int[ 187].bits = 0xDB000000;
+  gv_local.lookup_slx_int[ 188].nbits = 10; gv_local.lookup_slx_int[ 188].bits = 0xDEC00000;
+  gv_local.lookup_slx_int[ 189].nbits =  9; gv_local.lookup_slx_int[ 189].bits = 0x09000000;
+  gv_local.lookup_slx_int[ 190].nbits =  9; gv_local.lookup_slx_int[ 190].bits = 0x0C800000;
+  gv_local.lookup_slx_int[ 191].nbits =  9; gv_local.lookup_slx_int[ 191].bits = 0x18800000;
+  gv_local.lookup_slx_int[ 192].nbits =  9; gv_local.lookup_slx_int[ 192].bits = 0x1B800000;
+  gv_local.lookup_slx_int[ 193].nbits =  9; gv_local.lookup_slx_int[ 193].bits = 0x27000000;
+  gv_local.lookup_slx_int[ 194].nbits =  9; gv_local.lookup_slx_int[ 194].bits = 0x32000000;
+  gv_local.lookup_slx_int[ 195].nbits =  9; gv_local.lookup_slx_int[ 195].bits = 0x3D000000;
+  gv_local.lookup_slx_int[ 196].nbits =  9; gv_local.lookup_slx_int[ 196].bits = 0x49000000;
+  gv_local.lookup_slx_int[ 197].nbits =  9; gv_local.lookup_slx_int[ 197].bits = 0x4C800000;
+  gv_local.lookup_slx_int[ 198].nbits =  9; gv_local.lookup_slx_int[ 198].bits = 0x56800000;
+  gv_local.lookup_slx_int[ 199].nbits =  9; gv_local.lookup_slx_int[ 199].bits = 0x5B000000;
+  gv_local.lookup_slx_int[ 200].nbits =  9; gv_local.lookup_slx_int[ 200].bits = 0x64000000;
+  gv_local.lookup_slx_int[ 201].nbits =  9; gv_local.lookup_slx_int[ 201].bits = 0x74800000;
+  gv_local.lookup_slx_int[ 202].nbits =  9; gv_local.lookup_slx_int[ 202].bits = 0x7D000000;
+  gv_local.lookup_slx_int[ 203].nbits =  9; gv_local.lookup_slx_int[ 203].bits = 0x89000000;
+  gv_local.lookup_slx_int[ 204].nbits =  9; gv_local.lookup_slx_int[ 204].bits = 0x90800000;
+  gv_local.lookup_slx_int[ 205].nbits =  9; gv_local.lookup_slx_int[ 205].bits = 0x95800000;
+  gv_local.lookup_slx_int[ 206].nbits =  9; gv_local.lookup_slx_int[ 206].bits = 0xA2800000;
+  gv_local.lookup_slx_int[ 207].nbits =  9; gv_local.lookup_slx_int[ 207].bits = 0xA7000000;
+  gv_local.lookup_slx_int[ 208].nbits =  9; gv_local.lookup_slx_int[ 208].bits = 0xAE800000;
+  gv_local.lookup_slx_int[ 209].nbits =  9; gv_local.lookup_slx_int[ 209].bits = 0xB3000000;
+  gv_local.lookup_slx_int[ 210].nbits =  9; gv_local.lookup_slx_int[ 210].bits = 0xBB000000;
+  gv_local.lookup_slx_int[ 211].nbits =  9; gv_local.lookup_slx_int[ 211].bits = 0xBF800000;
+  gv_local.lookup_slx_int[ 212].nbits =  9; gv_local.lookup_slx_int[ 212].bits = 0xC5800000;
+  gv_local.lookup_slx_int[ 213].nbits =  9; gv_local.lookup_slx_int[ 213].bits = 0xCB800000;
+  gv_local.lookup_slx_int[ 214].nbits =  9; gv_local.lookup_slx_int[ 214].bits = 0xD3000000;
+  gv_local.lookup_slx_int[ 215].nbits =  9; gv_local.lookup_slx_int[ 215].bits = 0xD9000000;
+  gv_local.lookup_slx_int[ 216].nbits =  9; gv_local.lookup_slx_int[ 216].bits = 0xDE000000;
+  gv_local.lookup_slx_int[ 217].nbits =  8; gv_local.lookup_slx_int[ 217].bits = 0x0B000000;
+  gv_local.lookup_slx_int[ 218].nbits =  8; gv_local.lookup_slx_int[ 218].bits = 0x19000000;
+  gv_local.lookup_slx_int[ 219].nbits =  8; gv_local.lookup_slx_int[ 219].bits = 0x28000000;
+  gv_local.lookup_slx_int[ 220].nbits =  8; gv_local.lookup_slx_int[ 220].bits = 0x33000000;
+  gv_local.lookup_slx_int[ 221].nbits =  8; gv_local.lookup_slx_int[ 221].bits = 0x3F000000;
+  gv_local.lookup_slx_int[ 222].nbits =  8; gv_local.lookup_slx_int[ 222].bits = 0x4D000000;
+  gv_local.lookup_slx_int[ 223].nbits =  8; gv_local.lookup_slx_int[ 223].bits = 0x5A000000;
+  gv_local.lookup_slx_int[ 224].nbits =  8; gv_local.lookup_slx_int[ 224].bits = 0x6C000000;
+  gv_local.lookup_slx_int[ 225].nbits =  8; gv_local.lookup_slx_int[ 225].bits = 0x7C000000;
+  gv_local.lookup_slx_int[ 226].nbits =  8; gv_local.lookup_slx_int[ 226].bits = 0x88000000;
+  gv_local.lookup_slx_int[ 227].nbits =  8; gv_local.lookup_slx_int[ 227].bits = 0x94000000;
+  gv_local.lookup_slx_int[ 228].nbits =  8; gv_local.lookup_slx_int[ 228].bits = 0xA1000000;
+  gv_local.lookup_slx_int[ 229].nbits =  8; gv_local.lookup_slx_int[ 229].bits = 0xA8000000;
+  gv_local.lookup_slx_int[ 230].nbits =  8; gv_local.lookup_slx_int[ 230].bits = 0xB2000000;
+  gv_local.lookup_slx_int[ 231].nbits =  8; gv_local.lookup_slx_int[ 231].bits = 0xBC000000;
+  gv_local.lookup_slx_int[ 232].nbits =  8; gv_local.lookup_slx_int[ 232].bits = 0xC4000000;
+  gv_local.lookup_slx_int[ 233].nbits =  8; gv_local.lookup_slx_int[ 233].bits = 0xCC000000;
+  gv_local.lookup_slx_int[ 234].nbits =  8; gv_local.lookup_slx_int[ 234].bits = 0xD7000000;
+  gv_local.lookup_slx_int[ 235].nbits =  7; gv_local.lookup_slx_int[ 235].bits = 0x00000000;
+  gv_local.lookup_slx_int[ 236].nbits =  7; gv_local.lookup_slx_int[ 236].bits = 0x12000000;
+  gv_local.lookup_slx_int[ 237].nbits =  7; gv_local.lookup_slx_int[ 237].bits = 0x24000000;
+  gv_local.lookup_slx_int[ 238].nbits =  7; gv_local.lookup_slx_int[ 238].bits = 0x36000000;
+  gv_local.lookup_slx_int[ 239].nbits =  7; gv_local.lookup_slx_int[ 239].bits = 0x4A000000;
+  gv_local.lookup_slx_int[ 240].nbits =  7; gv_local.lookup_slx_int[ 240].bits = 0x60000000;
+  gv_local.lookup_slx_int[ 241].nbits =  7; gv_local.lookup_slx_int[ 241].bits = 0x76000000;
+  gv_local.lookup_slx_int[ 242].nbits =  7; gv_local.lookup_slx_int[ 242].bits = 0x8A000000;
+  gv_local.lookup_slx_int[ 243].nbits =  7; gv_local.lookup_slx_int[ 243].bits = 0x96000000;
+  gv_local.lookup_slx_int[ 244].nbits =  7; gv_local.lookup_slx_int[ 244].bits = 0xAA000000;
+  gv_local.lookup_slx_int[ 245].nbits =  7; gv_local.lookup_slx_int[ 245].bits = 0xB4000000;
+  gv_local.lookup_slx_int[ 246].nbits =  7; gv_local.lookup_slx_int[ 246].bits = 0xC2000000;
+  gv_local.lookup_slx_int[ 247].nbits =  7; gv_local.lookup_slx_int[ 247].bits = 0xD0000000;
+  gv_local.lookup_slx_int[ 248].nbits =  7; gv_local.lookup_slx_int[ 248].bits = 0xDC000000;
+  gv_local.lookup_slx_int[ 249].nbits =  6; gv_local.lookup_slx_int[ 249].bits = 0x14000000;
+  gv_local.lookup_slx_int[ 250].nbits =  6; gv_local.lookup_slx_int[ 250].bits = 0x2C000000;
+  gv_local.lookup_slx_int[ 251].nbits =  6; gv_local.lookup_slx_int[ 251].bits = 0x44000000;
+  gv_local.lookup_slx_int[ 252].nbits =  6; gv_local.lookup_slx_int[ 252].bits = 0x5C000000;
+  gv_local.lookup_slx_int[ 253].nbits =  6; gv_local.lookup_slx_int[ 253].bits = 0x70000000;
+  gv_local.lookup_slx_int[ 254].nbits =  6; gv_local.lookup_slx_int[ 254].bits = 0x80000000;
+  gv_local.lookup_slx_int[ 255].nbits =  6; gv_local.lookup_slx_int[ 255].bits = 0x98000000;
+  gv_local.lookup_slx_int[ 256].nbits =  6; gv_local.lookup_slx_int[ 256].bits = 0x78000000;
+  gv_local.lookup_slx_int[ 257].nbits =  6; gv_local.lookup_slx_int[ 257].bits = 0x68000000;
+  gv_local.lookup_slx_int[ 258].nbits =  6; gv_local.lookup_slx_int[ 258].bits = 0x50000000;
+  gv_local.lookup_slx_int[ 259].nbits =  6; gv_local.lookup_slx_int[ 259].bits = 0x38000000;
+  gv_local.lookup_slx_int[ 260].nbits =  6; gv_local.lookup_slx_int[ 260].bits = 0x1C000000;
+  gv_local.lookup_slx_int[ 261].nbits =  6; gv_local.lookup_slx_int[ 261].bits = 0x04000000;
+  gv_local.lookup_slx_int[ 262].nbits =  7; gv_local.lookup_slx_int[ 262].bits = 0xD4000000;
+  gv_local.lookup_slx_int[ 263].nbits =  7; gv_local.lookup_slx_int[ 263].bits = 0xC6000000;
+  gv_local.lookup_slx_int[ 264].nbits =  7; gv_local.lookup_slx_int[ 264].bits = 0xB8000000;
+  gv_local.lookup_slx_int[ 265].nbits =  7; gv_local.lookup_slx_int[ 265].bits = 0xAC000000;
+  gv_local.lookup_slx_int[ 266].nbits =  7; gv_local.lookup_slx_int[ 266].bits = 0x9E000000;
+  gv_local.lookup_slx_int[ 267].nbits =  7; gv_local.lookup_slx_int[ 267].bits = 0x8E000000;
+  gv_local.lookup_slx_int[ 268].nbits =  7; gv_local.lookup_slx_int[ 268].bits = 0x7E000000;
+  gv_local.lookup_slx_int[ 269].nbits =  7; gv_local.lookup_slx_int[ 269].bits = 0x66000000;
+  gv_local.lookup_slx_int[ 270].nbits =  7; gv_local.lookup_slx_int[ 270].bits = 0x54000000;
+  gv_local.lookup_slx_int[ 271].nbits =  7; gv_local.lookup_slx_int[ 271].bits = 0x40000000;
+  gv_local.lookup_slx_int[ 272].nbits =  7; gv_local.lookup_slx_int[ 272].bits = 0x30000000;
+  gv_local.lookup_slx_int[ 273].nbits =  7; gv_local.lookup_slx_int[ 273].bits = 0x22000000;
+  gv_local.lookup_slx_int[ 274].nbits =  7; gv_local.lookup_slx_int[ 274].bits = 0x0E000000;
+  gv_local.lookup_slx_int[ 275].nbits =  8; gv_local.lookup_slx_int[ 275].bits = 0xDF000000;
+  gv_local.lookup_slx_int[ 276].nbits =  8; gv_local.lookup_slx_int[ 276].bits = 0xD8000000;
+  gv_local.lookup_slx_int[ 277].nbits =  8; gv_local.lookup_slx_int[ 277].bits = 0xCE000000;
+  gv_local.lookup_slx_int[ 278].nbits =  8; gv_local.lookup_slx_int[ 278].bits = 0xC8000000;
+  gv_local.lookup_slx_int[ 279].nbits =  8; gv_local.lookup_slx_int[ 279].bits = 0xBE000000;
+  gv_local.lookup_slx_int[ 280].nbits =  8; gv_local.lookup_slx_int[ 280].bits = 0xB7000000;
+  gv_local.lookup_slx_int[ 281].nbits =  8; gv_local.lookup_slx_int[ 281].bits = 0xB0000000;
+  gv_local.lookup_slx_int[ 282].nbits =  8; gv_local.lookup_slx_int[ 282].bits = 0xA6000000;
+  gv_local.lookup_slx_int[ 283].nbits =  8; gv_local.lookup_slx_int[ 283].bits = 0xA0000000;
+  gv_local.lookup_slx_int[ 284].nbits =  8; gv_local.lookup_slx_int[ 284].bits = 0x92000000;
+  gv_local.lookup_slx_int[ 285].nbits =  8; gv_local.lookup_slx_int[ 285].bits = 0x8C000000;
+  gv_local.lookup_slx_int[ 286].nbits =  8; gv_local.lookup_slx_int[ 286].bits = 0x85000000;
+  gv_local.lookup_slx_int[ 287].nbits =  8; gv_local.lookup_slx_int[ 287].bits = 0x6E000000;
+  gv_local.lookup_slx_int[ 288].nbits =  8; gv_local.lookup_slx_int[ 288].bits = 0x62000000;
+  gv_local.lookup_slx_int[ 289].nbits =  8; gv_local.lookup_slx_int[ 289].bits = 0x57000000;
+  gv_local.lookup_slx_int[ 290].nbits =  8; gv_local.lookup_slx_int[ 290].bits = 0x43000000;
+  gv_local.lookup_slx_int[ 291].nbits =  8; gv_local.lookup_slx_int[ 291].bits = 0x35000000;
+  gv_local.lookup_slx_int[ 292].nbits =  8; gv_local.lookup_slx_int[ 292].bits = 0x2A000000;
+  gv_local.lookup_slx_int[ 293].nbits =  8; gv_local.lookup_slx_int[ 293].bits = 0x20000000;
+  gv_local.lookup_slx_int[ 294].nbits =  8; gv_local.lookup_slx_int[ 294].bits = 0x10000000;
+  gv_local.lookup_slx_int[ 295].nbits =  8; gv_local.lookup_slx_int[ 295].bits = 0x03000000;
+  gv_local.lookup_slx_int[ 296].nbits =  9; gv_local.lookup_slx_int[ 296].bits = 0xDA800000;
+  gv_local.lookup_slx_int[ 297].nbits =  9; gv_local.lookup_slx_int[ 297].bits = 0xD6000000;
+  gv_local.lookup_slx_int[ 298].nbits =  9; gv_local.lookup_slx_int[ 298].bits = 0xCD800000;
+  gv_local.lookup_slx_int[ 299].nbits =  9; gv_local.lookup_slx_int[ 299].bits = 0xC9800000;
+  gv_local.lookup_slx_int[ 300].nbits =  9; gv_local.lookup_slx_int[ 300].bits = 0xC0800000;
+  gv_local.lookup_slx_int[ 301].nbits =  9; gv_local.lookup_slx_int[ 301].bits = 0xBA800000;
+  gv_local.lookup_slx_int[ 302].nbits =  9; gv_local.lookup_slx_int[ 302].bits = 0xB1000000;
+  gv_local.lookup_slx_int[ 303].nbits =  9; gv_local.lookup_slx_int[ 303].bits = 0xA9800000;
+  gv_local.lookup_slx_int[ 304].nbits =  9; gv_local.lookup_slx_int[ 304].bits = 0xA4000000;
+  gv_local.lookup_slx_int[ 305].nbits =  9; gv_local.lookup_slx_int[ 305].bits = 0x9D000000;
+  gv_local.lookup_slx_int[ 306].nbits =  9; gv_local.lookup_slx_int[ 306].bits = 0x93000000;
+  gv_local.lookup_slx_int[ 307].nbits =  9; gv_local.lookup_slx_int[ 307].bits = 0x8D000000;
+  gv_local.lookup_slx_int[ 308].nbits =  9; gv_local.lookup_slx_int[ 308].bits = 0x84000000;
+  gv_local.lookup_slx_int[ 309].nbits =  9; gv_local.lookup_slx_int[ 309].bits = 0x74000000;
+  gv_local.lookup_slx_int[ 310].nbits =  9; gv_local.lookup_slx_int[ 310].bits = 0x65000000;
+  gv_local.lookup_slx_int[ 311].nbits =  9; gv_local.lookup_slx_int[ 311].bits = 0x59800000;
+  gv_local.lookup_slx_int[ 312].nbits =  9; gv_local.lookup_slx_int[ 312].bits = 0x4F800000;
+  gv_local.lookup_slx_int[ 313].nbits =  9; gv_local.lookup_slx_int[ 313].bits = 0x48000000;
+  gv_local.lookup_slx_int[ 314].nbits =  9; gv_local.lookup_slx_int[ 314].bits = 0x3D800000;
+  gv_local.lookup_slx_int[ 315].nbits =  9; gv_local.lookup_slx_int[ 315].bits = 0x34000000;
+  gv_local.lookup_slx_int[ 316].nbits =  9; gv_local.lookup_slx_int[ 316].bits = 0x26800000;
+  gv_local.lookup_slx_int[ 317].nbits =  9; gv_local.lookup_slx_int[ 317].bits = 0x1B000000;
+  gv_local.lookup_slx_int[ 318].nbits =  9; gv_local.lookup_slx_int[ 318].bits = 0x11800000;
+  gv_local.lookup_slx_int[ 319].nbits =  9; gv_local.lookup_slx_int[ 319].bits = 0x0A800000;
+  gv_local.lookup_slx_int[ 320].nbits =  9; gv_local.lookup_slx_int[ 320].bits = 0x02000000;
+  gv_local.lookup_slx_int[ 321].nbits = 10; gv_local.lookup_slx_int[ 321].bits = 0xDB400000;
+  gv_local.lookup_slx_int[ 322].nbits = 10; gv_local.lookup_slx_int[ 322].bits = 0xD9C00000;
+  gv_local.lookup_slx_int[ 323].nbits = 10; gv_local.lookup_slx_int[ 323].bits = 0xD2800000;
+  gv_local.lookup_slx_int[ 324].nbits = 10; gv_local.lookup_slx_int[ 324].bits = 0xCF000000;
+  gv_local.lookup_slx_int[ 325].nbits = 10; gv_local.lookup_slx_int[ 325].bits = 0xCD400000;
+  gv_local.lookup_slx_int[ 326].nbits = 10; gv_local.lookup_slx_int[ 326].bits = 0xCA800000;
+  gv_local.lookup_slx_int[ 327].nbits = 10; gv_local.lookup_slx_int[ 327].bits = 0xC5400000;
+  gv_local.lookup_slx_int[ 328].nbits = 10; gv_local.lookup_slx_int[ 328].bits = 0xC0000000;
+  gv_local.lookup_slx_int[ 329].nbits = 10; gv_local.lookup_slx_int[ 329].bits = 0xBD400000;
+  gv_local.lookup_slx_int[ 330].nbits = 10; gv_local.lookup_slx_int[ 330].bits = 0xBBC00000;
+  gv_local.lookup_slx_int[ 331].nbits = 10; gv_local.lookup_slx_int[ 331].bits = 0xB6400000;
+  gv_local.lookup_slx_int[ 332].nbits = 10; gv_local.lookup_slx_int[ 332].bits = 0xB1C00000;
+  gv_local.lookup_slx_int[ 333].nbits = 10; gv_local.lookup_slx_int[ 333].bits = 0xAFC00000;
+  gv_local.lookup_slx_int[ 334].nbits = 10; gv_local.lookup_slx_int[ 334].bits = 0xAE400000;
+  gv_local.lookup_slx_int[ 335].nbits = 10; gv_local.lookup_slx_int[ 335].bits = 0xA9000000;
+  gv_local.lookup_slx_int[ 336].nbits = 10; gv_local.lookup_slx_int[ 336].bits = 0xA5800000;
+  gv_local.lookup_slx_int[ 337].nbits = 10; gv_local.lookup_slx_int[ 337].bits = 0xA3400000;
+  gv_local.lookup_slx_int[ 338].nbits = 10; gv_local.lookup_slx_int[ 338].bits = 0xA2000000;
+  gv_local.lookup_slx_int[ 339].nbits = 10; gv_local.lookup_slx_int[ 339].bits = 0x9C400000;
+  gv_local.lookup_slx_int[ 340].nbits = 10; gv_local.lookup_slx_int[ 340].bits = 0x93800000;
+  gv_local.lookup_slx_int[ 341].nbits = 10; gv_local.lookup_slx_int[ 341].bits = 0x91800000;
+  gv_local.lookup_slx_int[ 342].nbits = 10; gv_local.lookup_slx_int[ 342].bits = 0x91400000;
+  gv_local.lookup_slx_int[ 343].nbits = 10; gv_local.lookup_slx_int[ 343].bits = 0x90000000;
+  gv_local.lookup_slx_int[ 344].nbits = 10; gv_local.lookup_slx_int[ 344].bits = 0x89800000;
+  gv_local.lookup_slx_int[ 345].nbits = 10; gv_local.lookup_slx_int[ 345].bits = 0x86C00000;
+  gv_local.lookup_slx_int[ 346].nbits = 10; gv_local.lookup_slx_int[ 346].bits = 0x86000000;
+  gv_local.lookup_slx_int[ 347].nbits = 10; gv_local.lookup_slx_int[ 347].bits = 0x7DC00000;
+  gv_local.lookup_slx_int[ 348].nbits = 10; gv_local.lookup_slx_int[ 348].bits = 0x75000000;
+  gv_local.lookup_slx_int[ 349].nbits = 10; gv_local.lookup_slx_int[ 349].bits = 0x6F800000;
+  gv_local.lookup_slx_int[ 350].nbits = 10; gv_local.lookup_slx_int[ 350].bits = 0x6DC00000;
+  gv_local.lookup_slx_int[ 351].nbits = 10; gv_local.lookup_slx_int[ 351].bits = 0x6D800000;
+  gv_local.lookup_slx_int[ 352].nbits = 10; gv_local.lookup_slx_int[ 352].bits = 0x65C00000;
+  gv_local.lookup_slx_int[ 353].nbits = 10; gv_local.lookup_slx_int[ 353].bits = 0x64800000;
+  gv_local.lookup_slx_int[ 354].nbits = 10; gv_local.lookup_slx_int[ 354].bits = 0x63000000;
+  gv_local.lookup_slx_int[ 355].nbits = 10; gv_local.lookup_slx_int[ 355].bits = 0x59000000;
+  gv_local.lookup_slx_int[ 356].nbits = 10; gv_local.lookup_slx_int[ 356].bits = 0x58000000;
+  gv_local.lookup_slx_int[ 357].nbits = 10; gv_local.lookup_slx_int[ 357].bits = 0x4F400000;
+  gv_local.lookup_slx_int[ 358].nbits = 10; gv_local.lookup_slx_int[ 358].bits = 0x4EC00000;
+  gv_local.lookup_slx_int[ 359].nbits = 10; gv_local.lookup_slx_int[ 359].bits = 0x56000000;
+  gv_local.lookup_slx_int[ 360].nbits = 10; gv_local.lookup_slx_int[ 360].bits = 0x4E000000;
+  gv_local.lookup_slx_int[ 361].nbits = 10; gv_local.lookup_slx_int[ 361].bits = 0x42800000;
+  gv_local.lookup_slx_int[ 362].nbits = 10; gv_local.lookup_slx_int[ 362].bits = 0x42400000;
+  gv_local.lookup_slx_int[ 363].nbits = 10; gv_local.lookup_slx_int[ 363].bits = 0x3EC00000;
+  gv_local.lookup_slx_int[ 364].nbits = 10; gv_local.lookup_slx_int[ 364].bits = 0x3E000000;
+  gv_local.lookup_slx_int[ 365].nbits = 10; gv_local.lookup_slx_int[ 365].bits = 0x3C800000;
+  gv_local.lookup_slx_int[ 366].nbits = 10; gv_local.lookup_slx_int[ 366].bits = 0x34C00000;
+  gv_local.lookup_slx_int[ 367].nbits = 10; gv_local.lookup_slx_int[ 367].bits = 0x2BC00000;
+  gv_local.lookup_slx_int[ 368].nbits = 10; gv_local.lookup_slx_int[ 368].bits = 0x2B400000;
+  gv_local.lookup_slx_int[ 369].nbits = 10; gv_local.lookup_slx_int[ 369].bits = 0x29000000;
+  gv_local.lookup_slx_int[ 370].nbits = 10; gv_local.lookup_slx_int[ 370].bits = 0x26400000;
+  gv_local.lookup_slx_int[ 371].nbits = 10; gv_local.lookup_slx_int[ 371].bits = 0x27C00000;
+  gv_local.lookup_slx_int[ 372].nbits = 10; gv_local.lookup_slx_int[ 372].bits = 0x21C00000;
+  gv_local.lookup_slx_int[ 373].nbits = 10; gv_local.lookup_slx_int[ 373].bits = 0x18400000;
+  gv_local.lookup_slx_int[ 374].nbits = 10; gv_local.lookup_slx_int[ 374].bits = 0x1A000000;
+  gv_local.lookup_slx_int[ 375].nbits = 10; gv_local.lookup_slx_int[ 375].bits = 0x11400000;
+  gv_local.lookup_slx_int[ 376].nbits = 10; gv_local.lookup_slx_int[ 376].bits = 0x0DC00000;
+  gv_local.lookup_slx_int[ 377].nbits = 10; gv_local.lookup_slx_int[ 377].bits = 0x0D800000;
+  gv_local.lookup_slx_int[ 378].nbits = 10; gv_local.lookup_slx_int[ 378].bits = 0x0A400000;
+  gv_local.lookup_slx_int[ 379].nbits = 10; gv_local.lookup_slx_int[ 379].bits = 0x09C00000;
+  gv_local.lookup_slx_int[ 380].nbits = 10; gv_local.lookup_slx_int[ 380].bits = 0x08800000;
+  gv_local.lookup_slx_int[ 381].nbits = 10; gv_local.lookup_slx_int[ 381].bits = 0x08000000;
+  gv_local.lookup_slx_int[ 382].nbits = 11; gv_local.lookup_slx_int[ 382].bits = 0xDEA00000;
+  gv_local.lookup_slx_int[ 383].nbits = 11; gv_local.lookup_slx_int[ 383].bits = 0xDBC00000;
+  gv_local.lookup_slx_int[ 384].nbits = 11; gv_local.lookup_slx_int[ 384].bits = 0xDA400000;
+  gv_local.lookup_slx_int[ 385].nbits = 11; gv_local.lookup_slx_int[ 385].bits = 0xDA600000;
+  gv_local.lookup_slx_int[ 386].nbits = 11; gv_local.lookup_slx_int[ 386].bits = 0xDA000000;
+  gv_local.lookup_slx_int[ 387].nbits = 11; gv_local.lookup_slx_int[ 387].bits = 0xD3C00000;
+  gv_local.lookup_slx_int[ 388].nbits = 11; gv_local.lookup_slx_int[ 388].bits = 0xD2E00000;
+  gv_local.lookup_slx_int[ 389].nbits = 11; gv_local.lookup_slx_int[ 389].bits = 0xD2000000;
+  gv_local.lookup_slx_int[ 390].nbits = 11; gv_local.lookup_slx_int[ 390].bits = 0xCFC00000;
+  gv_local.lookup_slx_int[ 391].nbits = 11; gv_local.lookup_slx_int[ 391].bits = 0xCD200000;
+  gv_local.lookup_slx_int[ 392].nbits = 11; gv_local.lookup_slx_int[ 392].bits = 0xCFA00000;
+  gv_local.lookup_slx_int[ 393].nbits = 11; gv_local.lookup_slx_int[ 393].bits = 0xCB400000;
+  gv_local.lookup_slx_int[ 394].nbits = 11; gv_local.lookup_slx_int[ 394].bits = 0xCAC00000;
+  gv_local.lookup_slx_int[ 395].nbits = 11; gv_local.lookup_slx_int[ 395].bits = 0xC9000000;
+  gv_local.lookup_slx_int[ 396].nbits = 11; gv_local.lookup_slx_int[ 396].bits = 0xC9200000;
+  gv_local.lookup_slx_int[ 397].nbits = 11; gv_local.lookup_slx_int[ 397].bits = 0xC1600000;
+  gv_local.lookup_slx_int[ 398].nbits = 11; gv_local.lookup_slx_int[ 398].bits = 0xC1400000;
+  gv_local.lookup_slx_int[ 399].nbits = 11; gv_local.lookup_slx_int[ 399].bits = 0xC0600000;
+  gv_local.lookup_slx_int[ 400].nbits = 11; gv_local.lookup_slx_int[ 400].bits = 0xBDE00000;
+  gv_local.lookup_slx_int[ 401].nbits = 11; gv_local.lookup_slx_int[ 401].bits = 0xBDA00000;
+  gv_local.lookup_slx_int[ 402].nbits = 11; gv_local.lookup_slx_int[ 402].bits = 0xBD200000;
+  gv_local.lookup_slx_int[ 403].nbits = 11; gv_local.lookup_slx_int[ 403].bits = 0xBB800000;
+  gv_local.lookup_slx_int[ 404].nbits = 11; gv_local.lookup_slx_int[ 404].bits = 0xBA400000;
+  gv_local.lookup_slx_int[ 405].nbits = 11; gv_local.lookup_slx_int[ 405].bits = 0xB3800000;
+  gv_local.lookup_slx_int[ 406].nbits = 11; gv_local.lookup_slx_int[ 406].bits = 0xB1800000;
+  gv_local.lookup_slx_int[ 407].nbits = 11; gv_local.lookup_slx_int[ 407].bits = 0xAE200000;
+  gv_local.lookup_slx_int[ 408].nbits = 11; gv_local.lookup_slx_int[ 408].bits = 0xA9600000;
+  gv_local.lookup_slx_int[ 409].nbits = 11; gv_local.lookup_slx_int[ 409].bits = 0xA5400000;
+  gv_local.lookup_slx_int[ 410].nbits = 11; gv_local.lookup_slx_int[ 410].bits = 0xA5C00000;
+  gv_local.lookup_slx_int[ 411].nbits = 11; gv_local.lookup_slx_int[ 411].bits = 0xA5600000;
+  gv_local.lookup_slx_int[ 412].nbits = 11; gv_local.lookup_slx_int[ 412].bits = 0xA4C00000;
+  gv_local.lookup_slx_int[ 413].nbits = 11; gv_local.lookup_slx_int[ 413].bits = 0xA3800000;
+  gv_local.lookup_slx_int[ 414].nbits = 11; gv_local.lookup_slx_int[ 414].bits = 0x9DA00000;
+  gv_local.lookup_slx_int[ 415].nbits = 11; gv_local.lookup_slx_int[ 415].bits = 0x9D800000;
+  gv_local.lookup_slx_int[ 416].nbits = 11; gv_local.lookup_slx_int[ 416].bits = 0x95200000;
+  gv_local.lookup_slx_int[ 417].nbits = 11; gv_local.lookup_slx_int[ 417].bits = 0x9C800000;
+  gv_local.lookup_slx_int[ 418].nbits = 11; gv_local.lookup_slx_int[ 418].bits = 0x90600000;
+  gv_local.lookup_slx_int[ 419].nbits = 11; gv_local.lookup_slx_int[ 419].bits = 0x91C00000;
+  gv_local.lookup_slx_int[ 420].nbits = 11; gv_local.lookup_slx_int[ 420].bits = 0x89E00000;
+  gv_local.lookup_slx_int[ 421].nbits = 11; gv_local.lookup_slx_int[ 421].bits = 0x89C00000;
+  gv_local.lookup_slx_int[ 422].nbits = 11; gv_local.lookup_slx_int[ 422].bits = 0x87000000;
+  gv_local.lookup_slx_int[ 423].nbits = 11; gv_local.lookup_slx_int[ 423].bits = 0x86400000;
+  gv_local.lookup_slx_int[ 424].nbits = 11; gv_local.lookup_slx_int[ 424].bits = 0x7DA00000;
+  gv_local.lookup_slx_int[ 425].nbits = 11; gv_local.lookup_slx_int[ 425].bits = 0x75A00000;
+  gv_local.lookup_slx_int[ 426].nbits = 11; gv_local.lookup_slx_int[ 426].bits = 0x75800000;
+  gv_local.lookup_slx_int[ 427].nbits = 11; gv_local.lookup_slx_int[ 427].bits = 0x6F000000;
+  gv_local.lookup_slx_int[ 428].nbits = 11; gv_local.lookup_slx_int[ 428].bits = 0x65A00000;
+  gv_local.lookup_slx_int[ 429].nbits = 11; gv_local.lookup_slx_int[ 429].bits = 0x63600000;
+  gv_local.lookup_slx_int[ 430].nbits = 11; gv_local.lookup_slx_int[ 430].bits = 0x63C00000;
+  gv_local.lookup_slx_int[ 431].nbits = 11; gv_local.lookup_slx_int[ 431].bits = 0x5B800000;
+  gv_local.lookup_slx_int[ 432].nbits = 11; gv_local.lookup_slx_int[ 432].bits = 0x58E00000;
+  gv_local.lookup_slx_int[ 433].nbits = 11; gv_local.lookup_slx_int[ 433].bits = 0x58800000;
+  gv_local.lookup_slx_int[ 434].nbits = 11; gv_local.lookup_slx_int[ 434].bits = 0x4E600000;
+  gv_local.lookup_slx_int[ 435].nbits = 11; gv_local.lookup_slx_int[ 435].bits = 0x4C600000;
+  gv_local.lookup_slx_int[ 436].nbits = 11; gv_local.lookup_slx_int[ 436].bits = 0x48A00000;
+  gv_local.lookup_slx_int[ 437].nbits = 11; gv_local.lookup_slx_int[ 437].bits = 0x42200000;
+  gv_local.lookup_slx_int[ 438].nbits = 11; gv_local.lookup_slx_int[ 438].bits = 0x42C00000;
+  gv_local.lookup_slx_int[ 439].nbits = 11; gv_local.lookup_slx_int[ 439].bits = 0x3E400000;
+  gv_local.lookup_slx_int[ 440].nbits = 11; gv_local.lookup_slx_int[ 440].bits = 0x3C400000;
+  gv_local.lookup_slx_int[ 441].nbits = 11; gv_local.lookup_slx_int[ 441].bits = 0x32A00000;
+  gv_local.lookup_slx_int[ 442].nbits = 11; gv_local.lookup_slx_int[ 442].bits = 0x29E00000;
+  gv_local.lookup_slx_int[ 443].nbits = 11; gv_local.lookup_slx_int[ 443].bits = 0x29C00000;
+  gv_local.lookup_slx_int[ 444].nbits = 11; gv_local.lookup_slx_int[ 444].bits = 0x29600000;
+  gv_local.lookup_slx_int[ 445].nbits = 11; gv_local.lookup_slx_int[ 445].bits = 0x27A00000;
+  gv_local.lookup_slx_int[ 446].nbits = 11; gv_local.lookup_slx_int[ 446].bits = 0x1A600000;
+  gv_local.lookup_slx_int[ 447].nbits = 11; gv_local.lookup_slx_int[ 447].bits = 0x1A400000;
+  gv_local.lookup_slx_int[ 448].nbits = 11; gv_local.lookup_slx_int[ 448].bits = 0x11000000;
+  gv_local.lookup_slx_int[ 449].nbits = 11; gv_local.lookup_slx_int[ 449].bits = 0x0D400000;
+  gv_local.lookup_slx_int[ 450].nbits = 11; gv_local.lookup_slx_int[ 450].bits = 0x09A00000;
+  gv_local.lookup_slx_int[ 451].nbits = 11; gv_local.lookup_slx_int[ 451].bits = 0x02E00000;
+  gv_local.lookup_slx_int[ 452].nbits = 12; gv_local.lookup_slx_int[ 452].bits = 0xDE800000;
+  gv_local.lookup_slx_int[ 453].nbits = 12; gv_local.lookup_slx_int[ 453].bits = 0xDB900000;
+  gv_local.lookup_slx_int[ 454].nbits = 12; gv_local.lookup_slx_int[ 454].bits = 0xDB800000;
+  gv_local.lookup_slx_int[ 455].nbits = 12; gv_local.lookup_slx_int[ 455].bits = 0xD3E00000;
+  gv_local.lookup_slx_int[ 456].nbits = 12; gv_local.lookup_slx_int[ 456].bits = 0xD3F00000;
+  gv_local.lookup_slx_int[ 457].nbits = 12; gv_local.lookup_slx_int[ 457].bits = 0xCFE00000;
+  gv_local.lookup_slx_int[ 458].nbits = 12; gv_local.lookup_slx_int[ 458].bits = 0xD2D00000;
+  gv_local.lookup_slx_int[ 459].nbits = 12; gv_local.lookup_slx_int[ 459].bits = 0xCF700000;
+  gv_local.lookup_slx_int[ 460].nbits = 12; gv_local.lookup_slx_int[ 460].bits = 0xCAF00000;
+  gv_local.lookup_slx_int[ 461].nbits = 12; gv_local.lookup_slx_int[ 461].bits = 0xCAE00000;
+  gv_local.lookup_slx_int[ 462].nbits = 12; gv_local.lookup_slx_int[ 462].bits = 0xC9500000;
+  gv_local.lookup_slx_int[ 463].nbits = 12; gv_local.lookup_slx_int[ 463].bits = 0xC1B00000;
+  gv_local.lookup_slx_int[ 464].nbits = 12; gv_local.lookup_slx_int[ 464].bits = 0xC0500000;
+  gv_local.lookup_slx_int[ 465].nbits = 12; gv_local.lookup_slx_int[ 465].bits = 0xC0400000;
+  gv_local.lookup_slx_int[ 466].nbits = 12; gv_local.lookup_slx_int[ 466].bits = 0xBDD00000;
+  gv_local.lookup_slx_int[ 467].nbits = 12; gv_local.lookup_slx_int[ 467].bits = 0xBD800000;
+  gv_local.lookup_slx_int[ 468].nbits = 12; gv_local.lookup_slx_int[ 468].bits = 0xB6800000;
+  gv_local.lookup_slx_int[ 469].nbits = 12; gv_local.lookup_slx_int[ 469].bits = 0xB6300000;
+  gv_local.lookup_slx_int[ 470].nbits = 12; gv_local.lookup_slx_int[ 470].bits = 0xB6200000;
+  gv_local.lookup_slx_int[ 471].nbits = 12; gv_local.lookup_slx_int[ 471].bits = 0xAF500000;
+  gv_local.lookup_slx_int[ 472].nbits = 12; gv_local.lookup_slx_int[ 472].bits = 0xA7D00000;
+  gv_local.lookup_slx_int[ 473].nbits = 12; gv_local.lookup_slx_int[ 473].bits = 0xA5F00000;
+  gv_local.lookup_slx_int[ 474].nbits = 12; gv_local.lookup_slx_int[ 474].bits = 0xA9400000;
+  gv_local.lookup_slx_int[ 475].nbits = 12; gv_local.lookup_slx_int[ 475].bits = 0xA4B00000;
+  gv_local.lookup_slx_int[ 476].nbits = 12; gv_local.lookup_slx_int[ 476].bits = 0xA3300000;
+  gv_local.lookup_slx_int[ 477].nbits = 12; gv_local.lookup_slx_int[ 477].bits = 0x9DD00000;
+  gv_local.lookup_slx_int[ 478].nbits = 12; gv_local.lookup_slx_int[ 478].bits = 0x9DC00000;
+  gv_local.lookup_slx_int[ 479].nbits = 12; gv_local.lookup_slx_int[ 479].bits = 0x95100000;
+  gv_local.lookup_slx_int[ 480].nbits = 12; gv_local.lookup_slx_int[ 480].bits = 0x91300000;
+  gv_local.lookup_slx_int[ 481].nbits = 12; gv_local.lookup_slx_int[ 481].bits = 0x91000000;
+  gv_local.lookup_slx_int[ 482].nbits = 12; gv_local.lookup_slx_int[ 482].bits = 0x91200000;
+  gv_local.lookup_slx_int[ 483].nbits = 12; gv_local.lookup_slx_int[ 483].bits = 0x87D00000;
+  gv_local.lookup_slx_int[ 484].nbits = 12; gv_local.lookup_slx_int[ 484].bits = 0x87C00000;
+  gv_local.lookup_slx_int[ 485].nbits = 12; gv_local.lookup_slx_int[ 485].bits = 0x86700000;
+  gv_local.lookup_slx_int[ 486].nbits = 12; gv_local.lookup_slx_int[ 486].bits = 0x7D900000;
+  gv_local.lookup_slx_int[ 487].nbits = 12; gv_local.lookup_slx_int[ 487].bits = 0x84900000;
+  gv_local.lookup_slx_int[ 488].nbits = 12; gv_local.lookup_slx_int[ 488].bits = 0x6F300000;
+  gv_local.lookup_slx_int[ 489].nbits = 12; gv_local.lookup_slx_int[ 489].bits = 0x6D700000;
+  gv_local.lookup_slx_int[ 490].nbits = 12; gv_local.lookup_slx_int[ 490].bits = 0x6D100000;
+  gv_local.lookup_slx_int[ 491].nbits = 12; gv_local.lookup_slx_int[ 491].bits = 0x6D600000;
+  gv_local.lookup_slx_int[ 492].nbits = 12; gv_local.lookup_slx_int[ 492].bits = 0x5BB00000;
+  gv_local.lookup_slx_int[ 493].nbits = 12; gv_local.lookup_slx_int[ 493].bits = 0x63500000;
+  gv_local.lookup_slx_int[ 494].nbits = 12; gv_local.lookup_slx_int[ 494].bits = 0x63400000;
+  gv_local.lookup_slx_int[ 495].nbits = 12; gv_local.lookup_slx_int[ 495].bits = 0x4C500000;
+  gv_local.lookup_slx_int[ 496].nbits = 12; gv_local.lookup_slx_int[ 496].bits = 0x58C00000;
+  gv_local.lookup_slx_int[ 497].nbits = 12; gv_local.lookup_slx_int[ 497].bits = 0x4F200000;
+  gv_local.lookup_slx_int[ 498].nbits = 12; gv_local.lookup_slx_int[ 498].bits = 0x48900000;
+  gv_local.lookup_slx_int[ 499].nbits = 12; gv_local.lookup_slx_int[ 499].bits = 0x48800000;
+  gv_local.lookup_slx_int[ 500].nbits = 12; gv_local.lookup_slx_int[ 500].bits = 0x3E700000;
+  gv_local.lookup_slx_int[ 501].nbits = 12; gv_local.lookup_slx_int[ 501].bits = 0x4C100000;
+  gv_local.lookup_slx_int[ 502].nbits = 12; gv_local.lookup_slx_int[ 502].bits = 0x3C100000;
+  gv_local.lookup_slx_int[ 503].nbits = 12; gv_local.lookup_slx_int[ 503].bits = 0x2B200000;
+  gv_local.lookup_slx_int[ 504].nbits = 12; gv_local.lookup_slx_int[ 504].bits = 0x3C300000;
+  gv_local.lookup_slx_int[ 505].nbits = 12; gv_local.lookup_slx_int[ 505].bits = 0x2B300000;
+  gv_local.lookup_slx_int[ 506].nbits = 12; gv_local.lookup_slx_int[ 506].bits = 0x2B000000;
+  gv_local.lookup_slx_int[ 507].nbits = 12; gv_local.lookup_slx_int[ 507].bits = 0x2B100000;
+  gv_local.lookup_slx_int[ 508].nbits = 12; gv_local.lookup_slx_int[ 508].bits = 0x29800000;
+  gv_local.lookup_slx_int[ 509].nbits = 12; gv_local.lookup_slx_int[ 509].bits = 0x21000000;
+  gv_local.lookup_slx_int[ 510].nbits = 12; gv_local.lookup_slx_int[ 510].bits = 0x21200000;
+  gv_local.lookup_slx_int[ 511].nbits =  3; gv_local.lookup_slx_int[ 511].bits = 0xE0000000;
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  /* reverse huffman lookup table
+   */
+  memset (gv_local.rlookup_slx_int, 0, sizeof(uint16_t)*REV_HUFF_TREESIZE_16);
+
+  for (i=0; i<INT_HUFF_TREESIZE; i++)
+  {
+    val = gv_local.lookup_slx_int[i].bits >> 16;
+    gv_local.rlookup_slx_int [val] = (uint16_t) i;
+    for (j=1; j<=(0xFFFF>>gv_local.lookup_slx_int[i].nbits); j++)
+      gv_local.rlookup_slx_int [val+j] = (uint16_t) i;
+  }
+#endif
+
+  _s_sort_lookup (gv_local.lookup_slx_int, gv_local.idx_slx_int, INT_HUFF_TREESIZE);
+
+  gv_local.lookup_slx_int_initialized = 1;
+}
+/*
+ */
+static void _s_init_nse_slx_default (void)
+{
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  int      i, j;
+  uint16_t val;
+#endif
+
+  memset (gv_local.lookup_slx_nse,  0, sizeof(SRALookup)*NSE_HUFF_TREESIZE);
+
+  gv_local.lookup_slx_nse[   0].nbits = 11; gv_local.lookup_slx_nse[   0].bits = 0x6FE00000;
+  gv_local.lookup_slx_nse[   1].nbits = 11; gv_local.lookup_slx_nse[   1].bits = 0x7AC00000;
+  gv_local.lookup_slx_nse[   2].nbits = 11; gv_local.lookup_slx_nse[   2].bits = 0x6FC00000;
+  gv_local.lookup_slx_nse[   3].nbits = 11; gv_local.lookup_slx_nse[   3].bits = 0x7AE00000;
+  gv_local.lookup_slx_nse[   4].nbits = 11; gv_local.lookup_slx_nse[   4].bits = 0xC6A00000;
+  gv_local.lookup_slx_nse[   5].nbits = 11; gv_local.lookup_slx_nse[   5].bits = 0xDFC00000;
+  gv_local.lookup_slx_nse[   6].nbits = 11; gv_local.lookup_slx_nse[   6].bits = 0xD7200000;
+  gv_local.lookup_slx_nse[   7].nbits = 11; gv_local.lookup_slx_nse[   7].bits = 0xE4E00000;
+  gv_local.lookup_slx_nse[   8].nbits = 11; gv_local.lookup_slx_nse[   8].bits = 0xDA000000;
+  gv_local.lookup_slx_nse[   9].nbits = 11; gv_local.lookup_slx_nse[   9].bits = 0xD0000000;
+  gv_local.lookup_slx_nse[  10].nbits = 11; gv_local.lookup_slx_nse[  10].bits = 0xE8000000;
+  gv_local.lookup_slx_nse[  11].nbits = 11; gv_local.lookup_slx_nse[  11].bits = 0xCE400000;
+  gv_local.lookup_slx_nse[  12].nbits = 11; gv_local.lookup_slx_nse[  12].bits = 0xD7000000;
+  gv_local.lookup_slx_nse[  13].nbits = 11; gv_local.lookup_slx_nse[  13].bits = 0xD5000000;
+  gv_local.lookup_slx_nse[  14].nbits = 11; gv_local.lookup_slx_nse[  14].bits = 0xDDE00000;
+  gv_local.lookup_slx_nse[  15].nbits = 11; gv_local.lookup_slx_nse[  15].bits = 0xF2C00000;
+  gv_local.lookup_slx_nse[  16].nbits = 11; gv_local.lookup_slx_nse[  16].bits = 0xF6600000;
+  gv_local.lookup_slx_nse[  17].nbits = 11; gv_local.lookup_slx_nse[  17].bits = 0xEE400000;
+  gv_local.lookup_slx_nse[  18].nbits = 11; gv_local.lookup_slx_nse[  18].bits = 0xE4C00000;
+  gv_local.lookup_slx_nse[  19].nbits = 10; gv_local.lookup_slx_nse[  19].bits = 0x0F000000;
+  gv_local.lookup_slx_nse[  20].nbits = 11; gv_local.lookup_slx_nse[  20].bits = 0xEBC00000;
+  gv_local.lookup_slx_nse[  21].nbits = 11; gv_local.lookup_slx_nse[  21].bits = 0xF7E00000;
+  gv_local.lookup_slx_nse[  22].nbits = 11; gv_local.lookup_slx_nse[  22].bits = 0xF7C00000;
+  gv_local.lookup_slx_nse[  23].nbits = 10; gv_local.lookup_slx_nse[  23].bits = 0x18000000;
+  gv_local.lookup_slx_nse[  24].nbits = 10; gv_local.lookup_slx_nse[  24].bits = 0x22800000;
+  gv_local.lookup_slx_nse[  25].nbits = 10; gv_local.lookup_slx_nse[  25].bits = 0x0A000000;
+  gv_local.lookup_slx_nse[  26].nbits = 10; gv_local.lookup_slx_nse[  26].bits = 0x0F400000;
+  gv_local.lookup_slx_nse[  27].nbits = 10; gv_local.lookup_slx_nse[  27].bits = 0x18400000;
+  gv_local.lookup_slx_nse[  28].nbits = 10; gv_local.lookup_slx_nse[  28].bits = 0x1D800000;
+  gv_local.lookup_slx_nse[  29].nbits = 10; gv_local.lookup_slx_nse[  29].bits = 0x3CC00000;
+  gv_local.lookup_slx_nse[  30].nbits = 10; gv_local.lookup_slx_nse[  30].bits = 0x46C00000;
+  gv_local.lookup_slx_nse[  31].nbits = 10; gv_local.lookup_slx_nse[  31].bits = 0x1DC00000;
+  gv_local.lookup_slx_nse[  32].nbits = 10; gv_local.lookup_slx_nse[  32].bits = 0x42C00000;
+  gv_local.lookup_slx_nse[  33].nbits = 10; gv_local.lookup_slx_nse[  33].bits = 0x3F800000;
+  gv_local.lookup_slx_nse[  34].nbits = 10; gv_local.lookup_slx_nse[  34].bits = 0x3FC00000;
+  gv_local.lookup_slx_nse[  35].nbits = 10; gv_local.lookup_slx_nse[  35].bits = 0x4B800000;
+  gv_local.lookup_slx_nse[  36].nbits = 10; gv_local.lookup_slx_nse[  36].bits = 0x4BC00000;
+  gv_local.lookup_slx_nse[  37].nbits = 10; gv_local.lookup_slx_nse[  37].bits = 0x27C00000;
+  gv_local.lookup_slx_nse[  38].nbits = 10; gv_local.lookup_slx_nse[  38].bits = 0x46400000;
+  gv_local.lookup_slx_nse[  39].nbits = 10; gv_local.lookup_slx_nse[  39].bits = 0x52000000;
+  gv_local.lookup_slx_nse[  40].nbits = 10; gv_local.lookup_slx_nse[  40].bits = 0x58400000;
+  gv_local.lookup_slx_nse[  41].nbits = 10; gv_local.lookup_slx_nse[  41].bits = 0x50800000;
+  gv_local.lookup_slx_nse[  42].nbits = 10; gv_local.lookup_slx_nse[  42].bits = 0x56800000;
+  gv_local.lookup_slx_nse[  43].nbits = 10; gv_local.lookup_slx_nse[  43].bits = 0x56000000;
+  gv_local.lookup_slx_nse[  44].nbits = 10; gv_local.lookup_slx_nse[  44].bits = 0x57000000;
+  gv_local.lookup_slx_nse[  45].nbits = 10; gv_local.lookup_slx_nse[  45].bits = 0x62400000;
+  gv_local.lookup_slx_nse[  46].nbits = 10; gv_local.lookup_slx_nse[  46].bits = 0x56C00000;
+  gv_local.lookup_slx_nse[  47].nbits = 10; gv_local.lookup_slx_nse[  47].bits = 0x57400000;
+  gv_local.lookup_slx_nse[  48].nbits = 10; gv_local.lookup_slx_nse[  48].bits = 0x63800000;
+  gv_local.lookup_slx_nse[  49].nbits = 10; gv_local.lookup_slx_nse[  49].bits = 0x62000000;
+  gv_local.lookup_slx_nse[  50].nbits = 10; gv_local.lookup_slx_nse[  50].bits = 0x5C000000;
+  gv_local.lookup_slx_nse[  51].nbits = 10; gv_local.lookup_slx_nse[  51].bits = 0x60800000;
+  gv_local.lookup_slx_nse[  52].nbits = 10; gv_local.lookup_slx_nse[  52].bits = 0x6B000000;
+  gv_local.lookup_slx_nse[  53].nbits = 10; gv_local.lookup_slx_nse[  53].bits = 0x6B400000;
+  gv_local.lookup_slx_nse[  54].nbits = 10; gv_local.lookup_slx_nse[  54].bits = 0x67C00000;
+  gv_local.lookup_slx_nse[  55].nbits = 10; gv_local.lookup_slx_nse[  55].bits = 0x66400000;
+  gv_local.lookup_slx_nse[  56].nbits = 10; gv_local.lookup_slx_nse[  56].bits = 0x6A400000;
+  gv_local.lookup_slx_nse[  57].nbits = 10; gv_local.lookup_slx_nse[  57].bits = 0x6F800000;
+  gv_local.lookup_slx_nse[  58].nbits = 10; gv_local.lookup_slx_nse[  58].bits = 0x77000000;
+  gv_local.lookup_slx_nse[  59].nbits = 10; gv_local.lookup_slx_nse[  59].bits = 0x76400000;
+  gv_local.lookup_slx_nse[  60].nbits = 10; gv_local.lookup_slx_nse[  60].bits = 0x69800000;
+  gv_local.lookup_slx_nse[  61].nbits = 10; gv_local.lookup_slx_nse[  61].bits = 0x70000000;
+  gv_local.lookup_slx_nse[  62].nbits = 10; gv_local.lookup_slx_nse[  62].bits = 0x6A000000;
+  gv_local.lookup_slx_nse[  63].nbits = 10; gv_local.lookup_slx_nse[  63].bits = 0x76000000;
+  gv_local.lookup_slx_nse[  64].nbits = 10; gv_local.lookup_slx_nse[  64].bits = 0x79400000;
+  gv_local.lookup_slx_nse[  65].nbits = 10; gv_local.lookup_slx_nse[  65].bits = 0x7CC00000;
+  gv_local.lookup_slx_nse[  66].nbits = 10; gv_local.lookup_slx_nse[  66].bits = 0x74800000;
+  gv_local.lookup_slx_nse[  67].nbits = 10; gv_local.lookup_slx_nse[  67].bits = 0x78C00000;
+  gv_local.lookup_slx_nse[  68].nbits = 10; gv_local.lookup_slx_nse[  68].bits = 0x7B000000;
+  gv_local.lookup_slx_nse[  69].nbits = 10; gv_local.lookup_slx_nse[  69].bits = 0x6C000000;
+  gv_local.lookup_slx_nse[  70].nbits = 10; gv_local.lookup_slx_nse[  70].bits = 0xC2000000;
+  gv_local.lookup_slx_nse[  71].nbits = 10; gv_local.lookup_slx_nse[  71].bits = 0x79000000;
+  gv_local.lookup_slx_nse[  72].nbits = 10; gv_local.lookup_slx_nse[  72].bits = 0x77800000;
+  gv_local.lookup_slx_nse[  73].nbits = 10; gv_local.lookup_slx_nse[  73].bits = 0xC4C00000;
+  gv_local.lookup_slx_nse[  74].nbits = 10; gv_local.lookup_slx_nse[  74].bits = 0x78800000;
+  gv_local.lookup_slx_nse[  75].nbits = 10; gv_local.lookup_slx_nse[  75].bits = 0x7C400000;
+  gv_local.lookup_slx_nse[  76].nbits = 10; gv_local.lookup_slx_nse[  76].bits = 0xC7C00000;
+  gv_local.lookup_slx_nse[  77].nbits = 10; gv_local.lookup_slx_nse[  77].bits = 0x7A800000;
+  gv_local.lookup_slx_nse[  78].nbits = 10; gv_local.lookup_slx_nse[  78].bits = 0xC1400000;
+  gv_local.lookup_slx_nse[  79].nbits = 10; gv_local.lookup_slx_nse[  79].bits = 0x7F400000;
+  gv_local.lookup_slx_nse[  80].nbits = 10; gv_local.lookup_slx_nse[  80].bits = 0xC9C00000;
+  gv_local.lookup_slx_nse[  81].nbits = 10; gv_local.lookup_slx_nse[  81].bits = 0xCC800000;
+  gv_local.lookup_slx_nse[  82].nbits = 10; gv_local.lookup_slx_nse[  82].bits = 0xC6C00000;
+  gv_local.lookup_slx_nse[  83].nbits = 10; gv_local.lookup_slx_nse[  83].bits = 0xC0C00000;
+  gv_local.lookup_slx_nse[  84].nbits = 10; gv_local.lookup_slx_nse[  84].bits = 0xC9000000;
+  gv_local.lookup_slx_nse[  85].nbits = 10; gv_local.lookup_slx_nse[  85].bits = 0xD2800000;
+  gv_local.lookup_slx_nse[  86].nbits = 10; gv_local.lookup_slx_nse[  86].bits = 0xD0C00000;
+  gv_local.lookup_slx_nse[  87].nbits = 10; gv_local.lookup_slx_nse[  87].bits = 0xC6400000;
+  gv_local.lookup_slx_nse[  88].nbits = 10; gv_local.lookup_slx_nse[  88].bits = 0xC1800000;
+  gv_local.lookup_slx_nse[  89].nbits = 10; gv_local.lookup_slx_nse[  89].bits = 0xCE000000;
+  gv_local.lookup_slx_nse[  90].nbits = 10; gv_local.lookup_slx_nse[  90].bits = 0xC3800000;
+  gv_local.lookup_slx_nse[  91].nbits = 10; gv_local.lookup_slx_nse[  91].bits = 0xCD400000;
+  gv_local.lookup_slx_nse[  92].nbits = 10; gv_local.lookup_slx_nse[  92].bits = 0xD3000000;
+  gv_local.lookup_slx_nse[  93].nbits = 10; gv_local.lookup_slx_nse[  93].bits = 0xD7800000;
+  gv_local.lookup_slx_nse[  94].nbits = 10; gv_local.lookup_slx_nse[  94].bits = 0xD8800000;
+  gv_local.lookup_slx_nse[  95].nbits = 10; gv_local.lookup_slx_nse[  95].bits = 0xCB400000;
+  gv_local.lookup_slx_nse[  96].nbits = 10; gv_local.lookup_slx_nse[  96].bits = 0xCE800000;
+  gv_local.lookup_slx_nse[  97].nbits = 10; gv_local.lookup_slx_nse[  97].bits = 0xCB800000;
+  gv_local.lookup_slx_nse[  98].nbits = 10; gv_local.lookup_slx_nse[  98].bits = 0xE1400000;
+  gv_local.lookup_slx_nse[  99].nbits = 10; gv_local.lookup_slx_nse[  99].bits = 0xD8400000;
+  gv_local.lookup_slx_nse[ 100].nbits = 10; gv_local.lookup_slx_nse[ 100].bits = 0xE1800000;
+  gv_local.lookup_slx_nse[ 101].nbits = 10; gv_local.lookup_slx_nse[ 101].bits = 0xDD400000;
+  gv_local.lookup_slx_nse[ 102].nbits = 10; gv_local.lookup_slx_nse[ 102].bits = 0xDF400000;
+  gv_local.lookup_slx_nse[ 103].nbits = 10; gv_local.lookup_slx_nse[ 103].bits = 0xCEC00000;
+  gv_local.lookup_slx_nse[ 104].nbits = 10; gv_local.lookup_slx_nse[ 104].bits = 0xDA800000;
+  gv_local.lookup_slx_nse[ 105].nbits = 10; gv_local.lookup_slx_nse[ 105].bits = 0xD7C00000;
+  gv_local.lookup_slx_nse[ 106].nbits = 10; gv_local.lookup_slx_nse[ 106].bits = 0xE3800000;
+  gv_local.lookup_slx_nse[ 107].nbits = 10; gv_local.lookup_slx_nse[ 107].bits = 0xDB000000;
+  gv_local.lookup_slx_nse[ 108].nbits = 10; gv_local.lookup_slx_nse[ 108].bits = 0xE0400000;
+  gv_local.lookup_slx_nse[ 109].nbits = 10; gv_local.lookup_slx_nse[ 109].bits = 0xE3C00000;
+  gv_local.lookup_slx_nse[ 110].nbits = 10; gv_local.lookup_slx_nse[ 110].bits = 0xDF800000;
+  gv_local.lookup_slx_nse[ 111].nbits = 10; gv_local.lookup_slx_nse[ 111].bits = 0xD9800000;
+  gv_local.lookup_slx_nse[ 112].nbits = 10; gv_local.lookup_slx_nse[ 112].bits = 0xDE000000;
+  gv_local.lookup_slx_nse[ 113].nbits = 10; gv_local.lookup_slx_nse[ 113].bits = 0xE5800000;
+  gv_local.lookup_slx_nse[ 114].nbits = 10; gv_local.lookup_slx_nse[ 114].bits = 0xD2C00000;
+  gv_local.lookup_slx_nse[ 115].nbits = 10; gv_local.lookup_slx_nse[ 115].bits = 0xED400000;
+  gv_local.lookup_slx_nse[ 116].nbits = 10; gv_local.lookup_slx_nse[ 116].bits = 0xE7C00000;
+  gv_local.lookup_slx_nse[ 117].nbits = 10; gv_local.lookup_slx_nse[ 117].bits = 0xD3800000;
+  gv_local.lookup_slx_nse[ 118].nbits = 10; gv_local.lookup_slx_nse[ 118].bits = 0xE9800000;
+  gv_local.lookup_slx_nse[ 119].nbits = 10; gv_local.lookup_slx_nse[ 119].bits = 0xDBC00000;
+  gv_local.lookup_slx_nse[ 120].nbits = 10; gv_local.lookup_slx_nse[ 120].bits = 0xEC800000;
+  gv_local.lookup_slx_nse[ 121].nbits = 10; gv_local.lookup_slx_nse[ 121].bits = 0xED000000;
+  gv_local.lookup_slx_nse[ 122].nbits = 10; gv_local.lookup_slx_nse[ 122].bits = 0xEF800000;
+  gv_local.lookup_slx_nse[ 123].nbits = 10; gv_local.lookup_slx_nse[ 123].bits = 0xEC000000;
+  gv_local.lookup_slx_nse[ 124].nbits = 10; gv_local.lookup_slx_nse[ 124].bits = 0xF0400000;
+  gv_local.lookup_slx_nse[ 125].nbits = 10; gv_local.lookup_slx_nse[ 125].bits = 0xE1000000;
+  gv_local.lookup_slx_nse[ 126].nbits = 10; gv_local.lookup_slx_nse[ 126].bits = 0xEE000000;
+  gv_local.lookup_slx_nse[ 127].nbits = 10; gv_local.lookup_slx_nse[ 127].bits = 0xEAC00000;
+  gv_local.lookup_slx_nse[ 128].nbits = 10; gv_local.lookup_slx_nse[ 128].bits = 0xF8800000;
+  gv_local.lookup_slx_nse[ 129].nbits = 10; gv_local.lookup_slx_nse[ 129].bits = 0xE6800000;
+  gv_local.lookup_slx_nse[ 130].nbits = 10; gv_local.lookup_slx_nse[ 130].bits = 0xE6C00000;
+  gv_local.lookup_slx_nse[ 131].nbits = 10; gv_local.lookup_slx_nse[ 131].bits = 0xEB800000;
+  gv_local.lookup_slx_nse[ 132].nbits = 10; gv_local.lookup_slx_nse[ 132].bits = 0xECC00000;
+  gv_local.lookup_slx_nse[ 133].nbits = 10; gv_local.lookup_slx_nse[ 133].bits = 0xF2400000;
+  gv_local.lookup_slx_nse[ 134].nbits = 10; gv_local.lookup_slx_nse[ 134].bits = 0xF0000000;
+  gv_local.lookup_slx_nse[ 135].nbits = 10; gv_local.lookup_slx_nse[ 135].bits = 0xF5C00000;
+  gv_local.lookup_slx_nse[ 136].nbits = 10; gv_local.lookup_slx_nse[ 136].bits = 0xF7000000;
+  gv_local.lookup_slx_nse[ 137].nbits = 10; gv_local.lookup_slx_nse[ 137].bits = 0xEDC00000;
+  gv_local.lookup_slx_nse[ 138].nbits = 10; gv_local.lookup_slx_nse[ 138].bits = 0xF2800000;
+  gv_local.lookup_slx_nse[ 139].nbits = 10; gv_local.lookup_slx_nse[ 139].bits = 0xE9000000;
+  gv_local.lookup_slx_nse[ 140].nbits = 10; gv_local.lookup_slx_nse[ 140].bits = 0xF9400000;
+  gv_local.lookup_slx_nse[ 141].nbits = 10; gv_local.lookup_slx_nse[ 141].bits = 0xFF400000;
+  gv_local.lookup_slx_nse[ 142].nbits = 10; gv_local.lookup_slx_nse[ 142].bits = 0xFA800000;
+  gv_local.lookup_slx_nse[ 143].nbits = 10; gv_local.lookup_slx_nse[ 143].bits = 0xF8400000;
+  gv_local.lookup_slx_nse[ 144].nbits = 10; gv_local.lookup_slx_nse[ 144].bits = 0xEFC00000;
+  gv_local.lookup_slx_nse[ 145].nbits = 10; gv_local.lookup_slx_nse[ 145].bits = 0xEF400000;
+  gv_local.lookup_slx_nse[ 146].nbits = 10; gv_local.lookup_slx_nse[ 146].bits = 0xF9000000;
+  gv_local.lookup_slx_nse[ 147].nbits =  9; gv_local.lookup_slx_nse[ 147].bits = 0x07000000;
+  gv_local.lookup_slx_nse[ 148].nbits = 10; gv_local.lookup_slx_nse[ 148].bits = 0xF7800000;
+  gv_local.lookup_slx_nse[ 149].nbits = 10; gv_local.lookup_slx_nse[ 149].bits = 0xFF000000;
+  gv_local.lookup_slx_nse[ 150].nbits =  9; gv_local.lookup_slx_nse[ 150].bits = 0x04800000;
+  gv_local.lookup_slx_nse[ 151].nbits =  9; gv_local.lookup_slx_nse[ 151].bits = 0x08800000;
+  gv_local.lookup_slx_nse[ 152].nbits = 10; gv_local.lookup_slx_nse[ 152].bits = 0xFEC00000;
+  gv_local.lookup_slx_nse[ 153].nbits = 10; gv_local.lookup_slx_nse[ 153].bits = 0xFC000000;
+  gv_local.lookup_slx_nse[ 154].nbits =  9; gv_local.lookup_slx_nse[ 154].bits = 0x16000000;
+  gv_local.lookup_slx_nse[ 155].nbits = 10; gv_local.lookup_slx_nse[ 155].bits = 0xFB400000;
+  gv_local.lookup_slx_nse[ 156].nbits =  9; gv_local.lookup_slx_nse[ 156].bits = 0x01000000;
+  gv_local.lookup_slx_nse[ 157].nbits =  9; gv_local.lookup_slx_nse[ 157].bits = 0x08000000;
+  gv_local.lookup_slx_nse[ 158].nbits =  9; gv_local.lookup_slx_nse[ 158].bits = 0x18800000;
+  gv_local.lookup_slx_nse[ 159].nbits =  9; gv_local.lookup_slx_nse[ 159].bits = 0x0C000000;
+  gv_local.lookup_slx_nse[ 160].nbits =  9; gv_local.lookup_slx_nse[ 160].bits = 0x10800000;
+  gv_local.lookup_slx_nse[ 161].nbits =  9; gv_local.lookup_slx_nse[ 161].bits = 0x15000000;
+  gv_local.lookup_slx_nse[ 162].nbits =  9; gv_local.lookup_slx_nse[ 162].bits = 0x0A800000;
+  gv_local.lookup_slx_nse[ 163].nbits =  9; gv_local.lookup_slx_nse[ 163].bits = 0x04000000;
+  gv_local.lookup_slx_nse[ 164].nbits =  9; gv_local.lookup_slx_nse[ 164].bits = 0x22000000;
+  gv_local.lookup_slx_nse[ 165].nbits =  9; gv_local.lookup_slx_nse[ 165].bits = 0x17000000;
+  gv_local.lookup_slx_nse[ 166].nbits =  9; gv_local.lookup_slx_nse[ 166].bits = 0x1E800000;
+  gv_local.lookup_slx_nse[ 167].nbits =  9; gv_local.lookup_slx_nse[ 167].bits = 0x26000000;
+  gv_local.lookup_slx_nse[ 168].nbits =  9; gv_local.lookup_slx_nse[ 168].bits = 0x0D800000;
+  gv_local.lookup_slx_nse[ 169].nbits =  9; gv_local.lookup_slx_nse[ 169].bits = 0x10000000;
+  gv_local.lookup_slx_nse[ 170].nbits =  9; gv_local.lookup_slx_nse[ 170].bits = 0x31800000;
+  gv_local.lookup_slx_nse[ 171].nbits =  9; gv_local.lookup_slx_nse[ 171].bits = 0x29000000;
+  gv_local.lookup_slx_nse[ 172].nbits =  9; gv_local.lookup_slx_nse[ 172].bits = 0x15800000;
+  gv_local.lookup_slx_nse[ 173].nbits =  9; gv_local.lookup_slx_nse[ 173].bits = 0x29800000;
+  gv_local.lookup_slx_nse[ 174].nbits =  9; gv_local.lookup_slx_nse[ 174].bits = 0x26800000;
+  gv_local.lookup_slx_nse[ 175].nbits =  9; gv_local.lookup_slx_nse[ 175].bits = 0x1F800000;
+  gv_local.lookup_slx_nse[ 176].nbits =  9; gv_local.lookup_slx_nse[ 176].bits = 0x2E800000;
+  gv_local.lookup_slx_nse[ 177].nbits =  9; gv_local.lookup_slx_nse[ 177].bits = 0x3E000000;
+  gv_local.lookup_slx_nse[ 178].nbits =  9; gv_local.lookup_slx_nse[ 178].bits = 0x1F000000;
+  gv_local.lookup_slx_nse[ 179].nbits =  9; gv_local.lookup_slx_nse[ 179].bits = 0x34000000;
+  gv_local.lookup_slx_nse[ 180].nbits =  9; gv_local.lookup_slx_nse[ 180].bits = 0x2E000000;
+  gv_local.lookup_slx_nse[ 181].nbits =  9; gv_local.lookup_slx_nse[ 181].bits = 0x40800000;
+  gv_local.lookup_slx_nse[ 182].nbits =  9; gv_local.lookup_slx_nse[ 182].bits = 0x28000000;
+  gv_local.lookup_slx_nse[ 183].nbits =  9; gv_local.lookup_slx_nse[ 183].bits = 0x49800000;
+  gv_local.lookup_slx_nse[ 184].nbits =  9; gv_local.lookup_slx_nse[ 184].bits = 0x4A000000;
+  gv_local.lookup_slx_nse[ 185].nbits =  9; gv_local.lookup_slx_nse[ 185].bits = 0x4A800000;
+  gv_local.lookup_slx_nse[ 186].nbits =  9; gv_local.lookup_slx_nse[ 186].bits = 0x45000000;
+  gv_local.lookup_slx_nse[ 187].nbits =  9; gv_local.lookup_slx_nse[ 187].bits = 0x51000000;
+  gv_local.lookup_slx_nse[ 188].nbits =  9; gv_local.lookup_slx_nse[ 188].bits = 0x48000000;
+  gv_local.lookup_slx_nse[ 189].nbits =  9; gv_local.lookup_slx_nse[ 189].bits = 0x49000000;
+  gv_local.lookup_slx_nse[ 190].nbits =  9; gv_local.lookup_slx_nse[ 190].bits = 0x4E000000;
+  gv_local.lookup_slx_nse[ 191].nbits =  9; gv_local.lookup_slx_nse[ 191].bits = 0x4E800000;
+  gv_local.lookup_slx_nse[ 192].nbits =  9; gv_local.lookup_slx_nse[ 192].bits = 0x53000000;
+  gv_local.lookup_slx_nse[ 193].nbits =  9; gv_local.lookup_slx_nse[ 193].bits = 0x4C800000;
+  gv_local.lookup_slx_nse[ 194].nbits =  9; gv_local.lookup_slx_nse[ 194].bits = 0x57800000;
+  gv_local.lookup_slx_nse[ 195].nbits =  9; gv_local.lookup_slx_nse[ 195].bits = 0x4F800000;
+  gv_local.lookup_slx_nse[ 196].nbits =  9; gv_local.lookup_slx_nse[ 196].bits = 0x54800000;
+  gv_local.lookup_slx_nse[ 197].nbits =  9; gv_local.lookup_slx_nse[ 197].bits = 0x52800000;
+  gv_local.lookup_slx_nse[ 198].nbits =  9; gv_local.lookup_slx_nse[ 198].bits = 0x59800000;
+  gv_local.lookup_slx_nse[ 199].nbits =  9; gv_local.lookup_slx_nse[ 199].bits = 0x5A000000;
+  gv_local.lookup_slx_nse[ 200].nbits =  9; gv_local.lookup_slx_nse[ 200].bits = 0x58800000;
+  gv_local.lookup_slx_nse[ 201].nbits =  9; gv_local.lookup_slx_nse[ 201].bits = 0x5E000000;
+  gv_local.lookup_slx_nse[ 202].nbits =  9; gv_local.lookup_slx_nse[ 202].bits = 0x5E800000;
+  gv_local.lookup_slx_nse[ 203].nbits =  9; gv_local.lookup_slx_nse[ 203].bits = 0x61800000;
+  gv_local.lookup_slx_nse[ 204].nbits =  9; gv_local.lookup_slx_nse[ 204].bits = 0x6A800000;
+  gv_local.lookup_slx_nse[ 205].nbits =  9; gv_local.lookup_slx_nse[ 205].bits = 0x65800000;
+  gv_local.lookup_slx_nse[ 206].nbits =  9; gv_local.lookup_slx_nse[ 206].bits = 0x68000000;
+  gv_local.lookup_slx_nse[ 207].nbits =  9; gv_local.lookup_slx_nse[ 207].bits = 0x64000000;
+  gv_local.lookup_slx_nse[ 208].nbits =  9; gv_local.lookup_slx_nse[ 208].bits = 0x5D800000;
+  gv_local.lookup_slx_nse[ 209].nbits =  9; gv_local.lookup_slx_nse[ 209].bits = 0x6F000000;
+  gv_local.lookup_slx_nse[ 210].nbits =  9; gv_local.lookup_slx_nse[ 210].bits = 0x6D000000;
+  gv_local.lookup_slx_nse[ 211].nbits =  9; gv_local.lookup_slx_nse[ 211].bits = 0x6D800000;
+  gv_local.lookup_slx_nse[ 212].nbits =  9; gv_local.lookup_slx_nse[ 212].bits = 0x71000000;
+  gv_local.lookup_slx_nse[ 213].nbits =  9; gv_local.lookup_slx_nse[ 213].bits = 0x76800000;
+  gv_local.lookup_slx_nse[ 214].nbits =  9; gv_local.lookup_slx_nse[ 214].bits = 0x74000000;
+  gv_local.lookup_slx_nse[ 215].nbits =  9; gv_local.lookup_slx_nse[ 215].bits = 0x72000000;
+  gv_local.lookup_slx_nse[ 216].nbits =  9; gv_local.lookup_slx_nse[ 216].bits = 0x78000000;
+  gv_local.lookup_slx_nse[ 217].nbits =  9; gv_local.lookup_slx_nse[ 217].bits = 0x7D800000;
+  gv_local.lookup_slx_nse[ 218].nbits =  9; gv_local.lookup_slx_nse[ 218].bits = 0x7E800000;
+  gv_local.lookup_slx_nse[ 219].nbits =  9; gv_local.lookup_slx_nse[ 219].bits = 0xC2800000;
+  gv_local.lookup_slx_nse[ 220].nbits =  9; gv_local.lookup_slx_nse[ 220].bits = 0x7D000000;
+  gv_local.lookup_slx_nse[ 221].nbits =  9; gv_local.lookup_slx_nse[ 221].bits = 0xC4000000;
+  gv_local.lookup_slx_nse[ 222].nbits =  9; gv_local.lookup_slx_nse[ 222].bits = 0xC3000000;
+  gv_local.lookup_slx_nse[ 223].nbits =  9; gv_local.lookup_slx_nse[ 223].bits = 0xCD800000;
+  gv_local.lookup_slx_nse[ 224].nbits =  9; gv_local.lookup_slx_nse[ 224].bits = 0xE2000000;
+  gv_local.lookup_slx_nse[ 225].nbits =  9; gv_local.lookup_slx_nse[ 225].bits = 0xD4000000;
+  gv_local.lookup_slx_nse[ 226].nbits =  9; gv_local.lookup_slx_nse[ 226].bits = 0xDC800000;
+  gv_local.lookup_slx_nse[ 227].nbits =  9; gv_local.lookup_slx_nse[ 227].bits = 0xD6000000;
+  gv_local.lookup_slx_nse[ 228].nbits =  9; gv_local.lookup_slx_nse[ 228].bits = 0xDE800000;
+  gv_local.lookup_slx_nse[ 229].nbits =  9; gv_local.lookup_slx_nse[ 229].bits = 0xE2800000;
+  gv_local.lookup_slx_nse[ 230].nbits =  9; gv_local.lookup_slx_nse[ 230].bits = 0xE0800000;
+  gv_local.lookup_slx_nse[ 231].nbits =  9; gv_local.lookup_slx_nse[ 231].bits = 0xE7000000;
+  gv_local.lookup_slx_nse[ 232].nbits =  9; gv_local.lookup_slx_nse[ 232].bits = 0xEB000000;
+  gv_local.lookup_slx_nse[ 233].nbits =  9; gv_local.lookup_slx_nse[ 233].bits = 0xF3000000;
+  gv_local.lookup_slx_nse[ 234].nbits =  9; gv_local.lookup_slx_nse[ 234].bits = 0xF5000000;
+  gv_local.lookup_slx_nse[ 235].nbits =  9; gv_local.lookup_slx_nse[ 235].bits = 0xF0800000;
+  gv_local.lookup_slx_nse[ 236].nbits =  9; gv_local.lookup_slx_nse[ 236].bits = 0xFA000000;
+  gv_local.lookup_slx_nse[ 237].nbits =  9; gv_local.lookup_slx_nse[ 237].bits = 0xF4000000;
+  gv_local.lookup_slx_nse[ 238].nbits =  9; gv_local.lookup_slx_nse[ 238].bits = 0xFF800000;
+  gv_local.lookup_slx_nse[ 239].nbits =  9; gv_local.lookup_slx_nse[ 239].bits = 0xFC800000;
+  gv_local.lookup_slx_nse[ 240].nbits =  8; gv_local.lookup_slx_nse[ 240].bits = 0x03000000;
+  gv_local.lookup_slx_nse[ 241].nbits =  8; gv_local.lookup_slx_nse[ 241].bits = 0x0E000000;
+  gv_local.lookup_slx_nse[ 242].nbits =  8; gv_local.lookup_slx_nse[ 242].bits = 0x11000000;
+  gv_local.lookup_slx_nse[ 243].nbits =  8; gv_local.lookup_slx_nse[ 243].bits = 0x1B000000;
+  gv_local.lookup_slx_nse[ 244].nbits =  8; gv_local.lookup_slx_nse[ 244].bits = 0x1A000000;
+  gv_local.lookup_slx_nse[ 245].nbits =  8; gv_local.lookup_slx_nse[ 245].bits = 0x19000000;
+  gv_local.lookup_slx_nse[ 246].nbits =  8; gv_local.lookup_slx_nse[ 246].bits = 0x2C000000;
+  gv_local.lookup_slx_nse[ 247].nbits =  8; gv_local.lookup_slx_nse[ 247].bits = 0x35000000;
+  gv_local.lookup_slx_nse[ 248].nbits =  8; gv_local.lookup_slx_nse[ 248].bits = 0x37000000;
+  gv_local.lookup_slx_nse[ 249].nbits =  8; gv_local.lookup_slx_nse[ 249].bits = 0x32000000;
+  gv_local.lookup_slx_nse[ 250].nbits =  8; gv_local.lookup_slx_nse[ 250].bits = 0x39000000;
+  gv_local.lookup_slx_nse[ 251].nbits =  8; gv_local.lookup_slx_nse[ 251].bits = 0x47000000;
+  gv_local.lookup_slx_nse[ 252].nbits =  8; gv_local.lookup_slx_nse[ 252].bits = 0x2F000000;
+  gv_local.lookup_slx_nse[ 253].nbits =  8; gv_local.lookup_slx_nse[ 253].bits = 0x3D000000;
+  gv_local.lookup_slx_nse[ 254].nbits =  8; gv_local.lookup_slx_nse[ 254].bits = 0x21000000;
+  gv_local.lookup_slx_nse[ 255].nbits =  8; gv_local.lookup_slx_nse[ 255].bits = 0xD1000000;
+  gv_local.lookup_slx_nse[ 256].nbits =  8; gv_local.lookup_slx_nse[ 256].bits = 0x25000000;
+  gv_local.lookup_slx_nse[ 257].nbits =  8; gv_local.lookup_slx_nse[ 257].bits = 0x2D000000;
+  gv_local.lookup_slx_nse[ 258].nbits =  8; gv_local.lookup_slx_nse[ 258].bits = 0x30000000;
+  gv_local.lookup_slx_nse[ 259].nbits =  8; gv_local.lookup_slx_nse[ 259].bits = 0x36000000;
+  gv_local.lookup_slx_nse[ 260].nbits =  8; gv_local.lookup_slx_nse[ 260].bits = 0x33000000;
+  gv_local.lookup_slx_nse[ 261].nbits =  8; gv_local.lookup_slx_nse[ 261].bits = 0x41000000;
+  gv_local.lookup_slx_nse[ 262].nbits =  8; gv_local.lookup_slx_nse[ 262].bits = 0x2B000000;
+  gv_local.lookup_slx_nse[ 263].nbits =  8; gv_local.lookup_slx_nse[ 263].bits = 0x43000000;
+  gv_local.lookup_slx_nse[ 264].nbits =  8; gv_local.lookup_slx_nse[ 264].bits = 0x3B000000;
+  gv_local.lookup_slx_nse[ 265].nbits =  8; gv_local.lookup_slx_nse[ 265].bits = 0x2A000000;
+  gv_local.lookup_slx_nse[ 266].nbits =  8; gv_local.lookup_slx_nse[ 266].bits = 0x38000000;
+  gv_local.lookup_slx_nse[ 267].nbits =  8; gv_local.lookup_slx_nse[ 267].bits = 0x20000000;
+  gv_local.lookup_slx_nse[ 268].nbits =  8; gv_local.lookup_slx_nse[ 268].bits = 0x24000000;
+  gv_local.lookup_slx_nse[ 269].nbits =  8; gv_local.lookup_slx_nse[ 269].bits = 0x09000000;
+  gv_local.lookup_slx_nse[ 270].nbits =  8; gv_local.lookup_slx_nse[ 270].bits = 0x13000000;
+  gv_local.lookup_slx_nse[ 271].nbits =  8; gv_local.lookup_slx_nse[ 271].bits = 0x02000000;
+  gv_local.lookup_slx_nse[ 272].nbits =  8; gv_local.lookup_slx_nse[ 272].bits = 0x12000000;
+  gv_local.lookup_slx_nse[ 273].nbits =  8; gv_local.lookup_slx_nse[ 273].bits = 0x1C000000;
+  gv_local.lookup_slx_nse[ 274].nbits =  8; gv_local.lookup_slx_nse[ 274].bits = 0x05000000;
+  gv_local.lookup_slx_nse[ 275].nbits =  8; gv_local.lookup_slx_nse[ 275].bits = 0x06000000;
+  gv_local.lookup_slx_nse[ 276].nbits =  9; gv_local.lookup_slx_nse[ 276].bits = 0xFD000000;
+  gv_local.lookup_slx_nse[ 277].nbits =  8; gv_local.lookup_slx_nse[ 277].bits = 0x00000000;
+  gv_local.lookup_slx_nse[ 278].nbits =  9; gv_local.lookup_slx_nse[ 278].bits = 0xFB800000;
+  gv_local.lookup_slx_nse[ 279].nbits =  9; gv_local.lookup_slx_nse[ 279].bits = 0xF9800000;
+  gv_local.lookup_slx_nse[ 280].nbits =  9; gv_local.lookup_slx_nse[ 280].bits = 0xF6800000;
+  gv_local.lookup_slx_nse[ 281].nbits =  9; gv_local.lookup_slx_nse[ 281].bits = 0xEE800000;
+  gv_local.lookup_slx_nse[ 282].nbits =  9; gv_local.lookup_slx_nse[ 282].bits = 0xF4800000;
+  gv_local.lookup_slx_nse[ 283].nbits =  9; gv_local.lookup_slx_nse[ 283].bits = 0xE5000000;
+  gv_local.lookup_slx_nse[ 284].nbits =  9; gv_local.lookup_slx_nse[ 284].bits = 0xEA000000;
+  gv_local.lookup_slx_nse[ 285].nbits =  9; gv_local.lookup_slx_nse[ 285].bits = 0xE4000000;
+  gv_local.lookup_slx_nse[ 286].nbits =  9; gv_local.lookup_slx_nse[ 286].bits = 0xE6000000;
+  gv_local.lookup_slx_nse[ 287].nbits =  9; gv_local.lookup_slx_nse[ 287].bits = 0xDC000000;
+  gv_local.lookup_slx_nse[ 288].nbits =  9; gv_local.lookup_slx_nse[ 288].bits = 0xD5800000;
+  gv_local.lookup_slx_nse[ 289].nbits =  9; gv_local.lookup_slx_nse[ 289].bits = 0xD4800000;
+  gv_local.lookup_slx_nse[ 290].nbits =  9; gv_local.lookup_slx_nse[ 290].bits = 0xC8800000;
+  gv_local.lookup_slx_nse[ 291].nbits =  9; gv_local.lookup_slx_nse[ 291].bits = 0xCA800000;
+  gv_local.lookup_slx_nse[ 292].nbits =  9; gv_local.lookup_slx_nse[ 292].bits = 0xCA000000;
+  gv_local.lookup_slx_nse[ 293].nbits =  9; gv_local.lookup_slx_nse[ 293].bits = 0xCF000000;
+  gv_local.lookup_slx_nse[ 294].nbits =  9; gv_local.lookup_slx_nse[ 294].bits = 0xC7000000;
+  gv_local.lookup_slx_nse[ 295].nbits =  9; gv_local.lookup_slx_nse[ 295].bits = 0xC0000000;
+  gv_local.lookup_slx_nse[ 296].nbits =  9; gv_local.lookup_slx_nse[ 296].bits = 0x7F800000;
+  gv_local.lookup_slx_nse[ 297].nbits =  9; gv_local.lookup_slx_nse[ 297].bits = 0x7B800000;
+  gv_local.lookup_slx_nse[ 298].nbits =  9; gv_local.lookup_slx_nse[ 298].bits = 0x75800000;
+  gv_local.lookup_slx_nse[ 299].nbits =  9; gv_local.lookup_slx_nse[ 299].bits = 0x75000000;
+  gv_local.lookup_slx_nse[ 300].nbits =  9; gv_local.lookup_slx_nse[ 300].bits = 0x79800000;
+  gv_local.lookup_slx_nse[ 301].nbits =  9; gv_local.lookup_slx_nse[ 301].bits = 0x70800000;
+  gv_local.lookup_slx_nse[ 302].nbits =  9; gv_local.lookup_slx_nse[ 302].bits = 0x73800000;
+  gv_local.lookup_slx_nse[ 303].nbits =  9; gv_local.lookup_slx_nse[ 303].bits = 0x72800000;
+  gv_local.lookup_slx_nse[ 304].nbits =  9; gv_local.lookup_slx_nse[ 304].bits = 0x64800000;
+  gv_local.lookup_slx_nse[ 305].nbits =  9; gv_local.lookup_slx_nse[ 305].bits = 0x6C800000;
+  gv_local.lookup_slx_nse[ 306].nbits =  9; gv_local.lookup_slx_nse[ 306].bits = 0x6B800000;
+  gv_local.lookup_slx_nse[ 307].nbits =  9; gv_local.lookup_slx_nse[ 307].bits = 0x6E000000;
+  gv_local.lookup_slx_nse[ 308].nbits =  9; gv_local.lookup_slx_nse[ 308].bits = 0x67000000;
+  gv_local.lookup_slx_nse[ 309].nbits =  9; gv_local.lookup_slx_nse[ 309].bits = 0x69000000;
+  gv_local.lookup_slx_nse[ 310].nbits =  9; gv_local.lookup_slx_nse[ 310].bits = 0x5F800000;
+  gv_local.lookup_slx_nse[ 311].nbits =  9; gv_local.lookup_slx_nse[ 311].bits = 0x61000000;
+  gv_local.lookup_slx_nse[ 312].nbits =  9; gv_local.lookup_slx_nse[ 312].bits = 0x62800000;
+  gv_local.lookup_slx_nse[ 313].nbits =  9; gv_local.lookup_slx_nse[ 313].bits = 0x66800000;
+  gv_local.lookup_slx_nse[ 314].nbits =  9; gv_local.lookup_slx_nse[ 314].bits = 0x60000000;
+  gv_local.lookup_slx_nse[ 315].nbits =  9; gv_local.lookup_slx_nse[ 315].bits = 0x5F000000;
+  gv_local.lookup_slx_nse[ 316].nbits =  9; gv_local.lookup_slx_nse[ 316].bits = 0x5C800000;
+  gv_local.lookup_slx_nse[ 317].nbits =  9; gv_local.lookup_slx_nse[ 317].bits = 0x5D000000;
+  gv_local.lookup_slx_nse[ 318].nbits =  9; gv_local.lookup_slx_nse[ 318].bits = 0x5B800000;
+  gv_local.lookup_slx_nse[ 319].nbits =  9; gv_local.lookup_slx_nse[ 319].bits = 0x5B000000;
+  gv_local.lookup_slx_nse[ 320].nbits =  9; gv_local.lookup_slx_nse[ 320].bits = 0x55800000;
+  gv_local.lookup_slx_nse[ 321].nbits =  9; gv_local.lookup_slx_nse[ 321].bits = 0x59000000;
+  gv_local.lookup_slx_nse[ 322].nbits =  9; gv_local.lookup_slx_nse[ 322].bits = 0x54000000;
+  gv_local.lookup_slx_nse[ 323].nbits =  9; gv_local.lookup_slx_nse[ 323].bits = 0x50000000;
+  gv_local.lookup_slx_nse[ 324].nbits =  9; gv_local.lookup_slx_nse[ 324].bits = 0x4F000000;
+  gv_local.lookup_slx_nse[ 325].nbits =  9; gv_local.lookup_slx_nse[ 325].bits = 0x51800000;
+  gv_local.lookup_slx_nse[ 326].nbits =  9; gv_local.lookup_slx_nse[ 326].bits = 0x53800000;
+  gv_local.lookup_slx_nse[ 327].nbits =  9; gv_local.lookup_slx_nse[ 327].bits = 0x4D800000;
+  gv_local.lookup_slx_nse[ 328].nbits =  9; gv_local.lookup_slx_nse[ 328].bits = 0x45800000;
+  gv_local.lookup_slx_nse[ 329].nbits =  9; gv_local.lookup_slx_nse[ 329].bits = 0x48800000;
+  gv_local.lookup_slx_nse[ 330].nbits =  9; gv_local.lookup_slx_nse[ 330].bits = 0x4B000000;
+  gv_local.lookup_slx_nse[ 331].nbits =  9; gv_local.lookup_slx_nse[ 331].bits = 0x3E800000;
+  gv_local.lookup_slx_nse[ 332].nbits =  9; gv_local.lookup_slx_nse[ 332].bits = 0x44000000;
+  gv_local.lookup_slx_nse[ 333].nbits =  9; gv_local.lookup_slx_nse[ 333].bits = 0x3A800000;
+  gv_local.lookup_slx_nse[ 334].nbits =  9; gv_local.lookup_slx_nse[ 334].bits = 0x40000000;
+  gv_local.lookup_slx_nse[ 335].nbits =  9; gv_local.lookup_slx_nse[ 335].bits = 0x3C000000;
+  gv_local.lookup_slx_nse[ 336].nbits =  9; gv_local.lookup_slx_nse[ 336].bits = 0x27000000;
+  gv_local.lookup_slx_nse[ 337].nbits =  9; gv_local.lookup_slx_nse[ 337].bits = 0x3F000000;
+  gv_local.lookup_slx_nse[ 338].nbits =  9; gv_local.lookup_slx_nse[ 338].bits = 0x1E000000;
+  gv_local.lookup_slx_nse[ 339].nbits =  9; gv_local.lookup_slx_nse[ 339].bits = 0x3A000000;
+  gv_local.lookup_slx_nse[ 340].nbits =  9; gv_local.lookup_slx_nse[ 340].bits = 0x31000000;
+  gv_local.lookup_slx_nse[ 341].nbits =  9; gv_local.lookup_slx_nse[ 341].bits = 0x28800000;
+  gv_local.lookup_slx_nse[ 342].nbits =  9; gv_local.lookup_slx_nse[ 342].bits = 0x1D000000;
+  gv_local.lookup_slx_nse[ 343].nbits =  9; gv_local.lookup_slx_nse[ 343].bits = 0x34800000;
+  gv_local.lookup_slx_nse[ 344].nbits =  9; gv_local.lookup_slx_nse[ 344].bits = 0x14000000;
+  gv_local.lookup_slx_nse[ 345].nbits =  9; gv_local.lookup_slx_nse[ 345].bits = 0x23000000;
+  gv_local.lookup_slx_nse[ 346].nbits =  9; gv_local.lookup_slx_nse[ 346].bits = 0x23800000;
+  gv_local.lookup_slx_nse[ 347].nbits =  9; gv_local.lookup_slx_nse[ 347].bits = 0x0F800000;
+  gv_local.lookup_slx_nse[ 348].nbits =  9; gv_local.lookup_slx_nse[ 348].bits = 0x0B000000;
+  gv_local.lookup_slx_nse[ 349].nbits =  9; gv_local.lookup_slx_nse[ 349].bits = 0x0D000000;
+  gv_local.lookup_slx_nse[ 350].nbits = 10; gv_local.lookup_slx_nse[ 350].bits = 0xFE400000;
+  gv_local.lookup_slx_nse[ 351].nbits = 10; gv_local.lookup_slx_nse[ 351].bits = 0xFD800000;
+  gv_local.lookup_slx_nse[ 352].nbits =  9; gv_local.lookup_slx_nse[ 352].bits = 0x16800000;
+  gv_local.lookup_slx_nse[ 353].nbits =  9; gv_local.lookup_slx_nse[ 353].bits = 0x17800000;
+  gv_local.lookup_slx_nse[ 354].nbits = 10; gv_local.lookup_slx_nse[ 354].bits = 0xF7400000;
+  gv_local.lookup_slx_nse[ 355].nbits =  9; gv_local.lookup_slx_nse[ 355].bits = 0x0C800000;
+  gv_local.lookup_slx_nse[ 356].nbits =  9; gv_local.lookup_slx_nse[ 356].bits = 0x07800000;
+  gv_local.lookup_slx_nse[ 357].nbits = 10; gv_local.lookup_slx_nse[ 357].bits = 0xFB000000;
+  gv_local.lookup_slx_nse[ 358].nbits = 10; gv_local.lookup_slx_nse[ 358].bits = 0xFC400000;
+  gv_local.lookup_slx_nse[ 359].nbits =  9; gv_local.lookup_slx_nse[ 359].bits = 0x0B800000;
+  gv_local.lookup_slx_nse[ 360].nbits = 10; gv_local.lookup_slx_nse[ 360].bits = 0xFAC00000;
+  gv_local.lookup_slx_nse[ 361].nbits = 10; gv_local.lookup_slx_nse[ 361].bits = 0xFE800000;
+  gv_local.lookup_slx_nse[ 362].nbits = 10; gv_local.lookup_slx_nse[ 362].bits = 0xF3800000;
+  gv_local.lookup_slx_nse[ 363].nbits = 10; gv_local.lookup_slx_nse[ 363].bits = 0xF5800000;
+  gv_local.lookup_slx_nse[ 364].nbits = 10; gv_local.lookup_slx_nse[ 364].bits = 0xF3C00000;
+  gv_local.lookup_slx_nse[ 365].nbits = 10; gv_local.lookup_slx_nse[ 365].bits = 0xF1400000;
+  gv_local.lookup_slx_nse[ 366].nbits = 10; gv_local.lookup_slx_nse[ 366].bits = 0xF8C00000;
+  gv_local.lookup_slx_nse[ 367].nbits = 10; gv_local.lookup_slx_nse[ 367].bits = 0xF8000000;
+  gv_local.lookup_slx_nse[ 368].nbits = 10; gv_local.lookup_slx_nse[ 368].bits = 0xF2000000;
+  gv_local.lookup_slx_nse[ 369].nbits = 10; gv_local.lookup_slx_nse[ 369].bits = 0xED800000;
+  gv_local.lookup_slx_nse[ 370].nbits = 10; gv_local.lookup_slx_nse[ 370].bits = 0xF1C00000;
+  gv_local.lookup_slx_nse[ 371].nbits = 10; gv_local.lookup_slx_nse[ 371].bits = 0xF1800000;
+  gv_local.lookup_slx_nse[ 372].nbits = 10; gv_local.lookup_slx_nse[ 372].bits = 0xEC400000;
+  gv_local.lookup_slx_nse[ 373].nbits = 10; gv_local.lookup_slx_nse[ 373].bits = 0xDE400000;
+  gv_local.lookup_slx_nse[ 374].nbits = 10; gv_local.lookup_slx_nse[ 374].bits = 0xF1000000;
+  gv_local.lookup_slx_nse[ 375].nbits = 10; gv_local.lookup_slx_nse[ 375].bits = 0xE9400000;
+  gv_local.lookup_slx_nse[ 376].nbits = 10; gv_local.lookup_slx_nse[ 376].bits = 0xE8800000;
+  gv_local.lookup_slx_nse[ 377].nbits = 10; gv_local.lookup_slx_nse[ 377].bits = 0xEA800000;
+  gv_local.lookup_slx_nse[ 378].nbits = 10; gv_local.lookup_slx_nse[ 378].bits = 0xEF000000;
+  gv_local.lookup_slx_nse[ 379].nbits = 10; gv_local.lookup_slx_nse[ 379].bits = 0xE1C00000;
+  gv_local.lookup_slx_nse[ 380].nbits = 10; gv_local.lookup_slx_nse[ 380].bits = 0xE8C00000;
+  gv_local.lookup_slx_nse[ 381].nbits = 10; gv_local.lookup_slx_nse[ 381].bits = 0xE7800000;
+  gv_local.lookup_slx_nse[ 382].nbits = 10; gv_local.lookup_slx_nse[ 382].bits = 0xF6000000;
+  gv_local.lookup_slx_nse[ 383].nbits = 10; gv_local.lookup_slx_nse[ 383].bits = 0xDB800000;
+  gv_local.lookup_slx_nse[ 384].nbits = 10; gv_local.lookup_slx_nse[ 384].bits = 0xDAC00000;
+  gv_local.lookup_slx_nse[ 385].nbits = 10; gv_local.lookup_slx_nse[ 385].bits = 0xD9C00000;
+  gv_local.lookup_slx_nse[ 386].nbits = 10; gv_local.lookup_slx_nse[ 386].bits = 0xDD000000;
+  gv_local.lookup_slx_nse[ 387].nbits = 10; gv_local.lookup_slx_nse[ 387].bits = 0xE8400000;
+  gv_local.lookup_slx_nse[ 388].nbits = 10; gv_local.lookup_slx_nse[ 388].bits = 0xE5C00000;
+  gv_local.lookup_slx_nse[ 389].nbits = 10; gv_local.lookup_slx_nse[ 389].bits = 0xE0000000;
+  gv_local.lookup_slx_nse[ 390].nbits = 10; gv_local.lookup_slx_nse[ 390].bits = 0xE3000000;
+  gv_local.lookup_slx_nse[ 391].nbits = 10; gv_local.lookup_slx_nse[ 391].bits = 0xD8C00000;
+  gv_local.lookup_slx_nse[ 392].nbits = 10; gv_local.lookup_slx_nse[ 392].bits = 0xCCC00000;
+  gv_local.lookup_slx_nse[ 393].nbits = 10; gv_local.lookup_slx_nse[ 393].bits = 0xD9000000;
+  gv_local.lookup_slx_nse[ 394].nbits = 10; gv_local.lookup_slx_nse[ 394].bits = 0xE4800000;
+  gv_local.lookup_slx_nse[ 395].nbits = 10; gv_local.lookup_slx_nse[ 395].bits = 0xE9C00000;
+  gv_local.lookup_slx_nse[ 396].nbits = 10; gv_local.lookup_slx_nse[ 396].bits = 0xE3400000;
+  gv_local.lookup_slx_nse[ 397].nbits = 10; gv_local.lookup_slx_nse[ 397].bits = 0xD7400000;
+  gv_local.lookup_slx_nse[ 398].nbits = 10; gv_local.lookup_slx_nse[ 398].bits = 0xD6800000;
+  gv_local.lookup_slx_nse[ 399].nbits = 10; gv_local.lookup_slx_nse[ 399].bits = 0xC9800000;
+  gv_local.lookup_slx_nse[ 400].nbits = 10; gv_local.lookup_slx_nse[ 400].bits = 0xCF800000;
+  gv_local.lookup_slx_nse[ 401].nbits = 10; gv_local.lookup_slx_nse[ 401].bits = 0xD0400000;
+  gv_local.lookup_slx_nse[ 402].nbits = 10; gv_local.lookup_slx_nse[ 402].bits = 0xD5400000;
+  gv_local.lookup_slx_nse[ 403].nbits = 10; gv_local.lookup_slx_nse[ 403].bits = 0xD0800000;
+  gv_local.lookup_slx_nse[ 404].nbits = 10; gv_local.lookup_slx_nse[ 404].bits = 0xDA400000;
+  gv_local.lookup_slx_nse[ 405].nbits = 10; gv_local.lookup_slx_nse[ 405].bits = 0xD2000000;
+  gv_local.lookup_slx_nse[ 406].nbits = 10; gv_local.lookup_slx_nse[ 406].bits = 0xD3400000;
+  gv_local.lookup_slx_nse[ 407].nbits = 10; gv_local.lookup_slx_nse[ 407].bits = 0xD3C00000;
+  gv_local.lookup_slx_nse[ 408].nbits = 10; gv_local.lookup_slx_nse[ 408].bits = 0xD8000000;
+  gv_local.lookup_slx_nse[ 409].nbits = 10; gv_local.lookup_slx_nse[ 409].bits = 0xC5000000;
+  gv_local.lookup_slx_nse[ 410].nbits = 10; gv_local.lookup_slx_nse[ 410].bits = 0xC9400000;
+  gv_local.lookup_slx_nse[ 411].nbits = 10; gv_local.lookup_slx_nse[ 411].bits = 0xD6C00000;
+  gv_local.lookup_slx_nse[ 412].nbits = 10; gv_local.lookup_slx_nse[ 412].bits = 0xCD000000;
+  gv_local.lookup_slx_nse[ 413].nbits = 10; gv_local.lookup_slx_nse[ 413].bits = 0xDF000000;
+  gv_local.lookup_slx_nse[ 414].nbits = 10; gv_local.lookup_slx_nse[ 414].bits = 0xC8400000;
+  gv_local.lookup_slx_nse[ 415].nbits = 10; gv_local.lookup_slx_nse[ 415].bits = 0xC4800000;
+  gv_local.lookup_slx_nse[ 416].nbits = 10; gv_local.lookup_slx_nse[ 416].bits = 0xD2400000;
+  gv_local.lookup_slx_nse[ 417].nbits = 10; gv_local.lookup_slx_nse[ 417].bits = 0xCC400000;
+  gv_local.lookup_slx_nse[ 418].nbits = 10; gv_local.lookup_slx_nse[ 418].bits = 0xC5800000;
+  gv_local.lookup_slx_nse[ 419].nbits = 10; gv_local.lookup_slx_nse[ 419].bits = 0xDD800000;
+  gv_local.lookup_slx_nse[ 420].nbits = 10; gv_local.lookup_slx_nse[ 420].bits = 0xC8000000;
+  gv_local.lookup_slx_nse[ 421].nbits = 10; gv_local.lookup_slx_nse[ 421].bits = 0xCFC00000;
+  gv_local.lookup_slx_nse[ 422].nbits = 10; gv_local.lookup_slx_nse[ 422].bits = 0xC3C00000;
+  gv_local.lookup_slx_nse[ 423].nbits = 10; gv_local.lookup_slx_nse[ 423].bits = 0xC6000000;
+  gv_local.lookup_slx_nse[ 424].nbits = 10; gv_local.lookup_slx_nse[ 424].bits = 0xD9400000;
+  gv_local.lookup_slx_nse[ 425].nbits = 10; gv_local.lookup_slx_nse[ 425].bits = 0xCB000000;
+  gv_local.lookup_slx_nse[ 426].nbits = 10; gv_local.lookup_slx_nse[ 426].bits = 0xCC000000;
+  gv_local.lookup_slx_nse[ 427].nbits = 10; gv_local.lookup_slx_nse[ 427].bits = 0x7C000000;
+  gv_local.lookup_slx_nse[ 428].nbits = 10; gv_local.lookup_slx_nse[ 428].bits = 0xCBC00000;
+  gv_local.lookup_slx_nse[ 429].nbits = 10; gv_local.lookup_slx_nse[ 429].bits = 0x77400000;
+  gv_local.lookup_slx_nse[ 430].nbits = 10; gv_local.lookup_slx_nse[ 430].bits = 0xC2400000;
+  gv_local.lookup_slx_nse[ 431].nbits = 10; gv_local.lookup_slx_nse[ 431].bits = 0xC7800000;
+  gv_local.lookup_slx_nse[ 432].nbits = 10; gv_local.lookup_slx_nse[ 432].bits = 0xC1C00000;
+  gv_local.lookup_slx_nse[ 433].nbits = 10; gv_local.lookup_slx_nse[ 433].bits = 0xC0800000;
+  gv_local.lookup_slx_nse[ 434].nbits = 10; gv_local.lookup_slx_nse[ 434].bits = 0xC5400000;
+  gv_local.lookup_slx_nse[ 435].nbits = 10; gv_local.lookup_slx_nse[ 435].bits = 0x7E400000;
+  gv_local.lookup_slx_nse[ 436].nbits = 10; gv_local.lookup_slx_nse[ 436].bits = 0x7E000000;
+  gv_local.lookup_slx_nse[ 437].nbits = 10; gv_local.lookup_slx_nse[ 437].bits = 0xC1000000;
+  gv_local.lookup_slx_nse[ 438].nbits = 10; gv_local.lookup_slx_nse[ 438].bits = 0xC5C00000;
+  gv_local.lookup_slx_nse[ 439].nbits = 10; gv_local.lookup_slx_nse[ 439].bits = 0x7A400000;
+  gv_local.lookup_slx_nse[ 440].nbits = 10; gv_local.lookup_slx_nse[ 440].bits = 0x7A000000;
+  gv_local.lookup_slx_nse[ 441].nbits = 10; gv_local.lookup_slx_nse[ 441].bits = 0x70400000;
+  gv_local.lookup_slx_nse[ 442].nbits = 10; gv_local.lookup_slx_nse[ 442].bits = 0x7F000000;
+  gv_local.lookup_slx_nse[ 443].nbits = 10; gv_local.lookup_slx_nse[ 443].bits = 0x73400000;
+  gv_local.lookup_slx_nse[ 444].nbits = 10; gv_local.lookup_slx_nse[ 444].bits = 0x7C800000;
+  gv_local.lookup_slx_nse[ 445].nbits = 10; gv_local.lookup_slx_nse[ 445].bits = 0x7B400000;
+  gv_local.lookup_slx_nse[ 446].nbits = 10; gv_local.lookup_slx_nse[ 446].bits = 0x74C00000;
+  gv_local.lookup_slx_nse[ 447].nbits = 10; gv_local.lookup_slx_nse[ 447].bits = 0x6E800000;
+  gv_local.lookup_slx_nse[ 448].nbits = 10; gv_local.lookup_slx_nse[ 448].bits = 0x77C00000;
+  gv_local.lookup_slx_nse[ 449].nbits = 10; gv_local.lookup_slx_nse[ 449].bits = 0x73000000;
+  gv_local.lookup_slx_nse[ 450].nbits = 10; gv_local.lookup_slx_nse[ 450].bits = 0x71800000;
+  gv_local.lookup_slx_nse[ 451].nbits = 10; gv_local.lookup_slx_nse[ 451].bits = 0x6C400000;
+  gv_local.lookup_slx_nse[ 452].nbits = 10; gv_local.lookup_slx_nse[ 452].bits = 0x68C00000;
+  gv_local.lookup_slx_nse[ 453].nbits = 10; gv_local.lookup_slx_nse[ 453].bits = 0x71C00000;
+  gv_local.lookup_slx_nse[ 454].nbits = 10; gv_local.lookup_slx_nse[ 454].bits = 0x68800000;
+  gv_local.lookup_slx_nse[ 455].nbits = 10; gv_local.lookup_slx_nse[ 455].bits = 0x69C00000;
+  gv_local.lookup_slx_nse[ 456].nbits = 10; gv_local.lookup_slx_nse[ 456].bits = 0x6EC00000;
+  gv_local.lookup_slx_nse[ 457].nbits = 10; gv_local.lookup_slx_nse[ 457].bits = 0x65000000;
+  gv_local.lookup_slx_nse[ 458].nbits = 10; gv_local.lookup_slx_nse[ 458].bits = 0x67800000;
+  gv_local.lookup_slx_nse[ 459].nbits = 10; gv_local.lookup_slx_nse[ 459].bits = 0x5C400000;
+  gv_local.lookup_slx_nse[ 460].nbits = 10; gv_local.lookup_slx_nse[ 460].bits = 0x56400000;
+  gv_local.lookup_slx_nse[ 461].nbits = 10; gv_local.lookup_slx_nse[ 461].bits = 0x63400000;
+  gv_local.lookup_slx_nse[ 462].nbits = 10; gv_local.lookup_slx_nse[ 462].bits = 0x60C00000;
+  gv_local.lookup_slx_nse[ 463].nbits = 10; gv_local.lookup_slx_nse[ 463].bits = 0x65400000;
+  gv_local.lookup_slx_nse[ 464].nbits = 10; gv_local.lookup_slx_nse[ 464].bits = 0x66000000;
+  gv_local.lookup_slx_nse[ 465].nbits = 10; gv_local.lookup_slx_nse[ 465].bits = 0x63C00000;
+  gv_local.lookup_slx_nse[ 466].nbits = 10; gv_local.lookup_slx_nse[ 466].bits = 0x5AC00000;
+  gv_local.lookup_slx_nse[ 467].nbits = 10; gv_local.lookup_slx_nse[ 467].bits = 0x55400000;
+  gv_local.lookup_slx_nse[ 468].nbits = 10; gv_local.lookup_slx_nse[ 468].bits = 0x63000000;
+  gv_local.lookup_slx_nse[ 469].nbits = 10; gv_local.lookup_slx_nse[ 469].bits = 0x5A800000;
+  gv_local.lookup_slx_nse[ 470].nbits = 10; gv_local.lookup_slx_nse[ 470].bits = 0x55000000;
+  gv_local.lookup_slx_nse[ 471].nbits = 10; gv_local.lookup_slx_nse[ 471].bits = 0x58000000;
+  gv_local.lookup_slx_nse[ 472].nbits = 10; gv_local.lookup_slx_nse[ 472].bits = 0x4D000000;
+  gv_local.lookup_slx_nse[ 473].nbits = 10; gv_local.lookup_slx_nse[ 473].bits = 0x50C00000;
+  gv_local.lookup_slx_nse[ 474].nbits = 10; gv_local.lookup_slx_nse[ 474].bits = 0x46800000;
+  gv_local.lookup_slx_nse[ 475].nbits = 10; gv_local.lookup_slx_nse[ 475].bits = 0x44800000;
+  gv_local.lookup_slx_nse[ 476].nbits = 10; gv_local.lookup_slx_nse[ 476].bits = 0x4C000000;
+  gv_local.lookup_slx_nse[ 477].nbits = 10; gv_local.lookup_slx_nse[ 477].bits = 0x52400000;
+  gv_local.lookup_slx_nse[ 478].nbits = 10; gv_local.lookup_slx_nse[ 478].bits = 0x4D400000;
+  gv_local.lookup_slx_nse[ 479].nbits = 10; gv_local.lookup_slx_nse[ 479].bits = 0x42400000;
+  gv_local.lookup_slx_nse[ 480].nbits = 10; gv_local.lookup_slx_nse[ 480].bits = 0x42000000;
+  gv_local.lookup_slx_nse[ 481].nbits = 10; gv_local.lookup_slx_nse[ 481].bits = 0x42800000;
+  gv_local.lookup_slx_nse[ 482].nbits = 10; gv_local.lookup_slx_nse[ 482].bits = 0x27800000;
+  gv_local.lookup_slx_nse[ 483].nbits = 10; gv_local.lookup_slx_nse[ 483].bits = 0x46000000;
+  gv_local.lookup_slx_nse[ 484].nbits = 10; gv_local.lookup_slx_nse[ 484].bits = 0x44C00000;
+  gv_local.lookup_slx_nse[ 485].nbits = 10; gv_local.lookup_slx_nse[ 485].bits = 0x3C800000;
+  gv_local.lookup_slx_nse[ 486].nbits = 10; gv_local.lookup_slx_nse[ 486].bits = 0x4C400000;
+  gv_local.lookup_slx_nse[ 487].nbits = 10; gv_local.lookup_slx_nse[ 487].bits = 0x14800000;
+  gv_local.lookup_slx_nse[ 488].nbits = 10; gv_local.lookup_slx_nse[ 488].bits = 0x22C00000;
+  gv_local.lookup_slx_nse[ 489].nbits = 11; gv_local.lookup_slx_nse[ 489].bits = 0xFE000000;
+  gv_local.lookup_slx_nse[ 490].nbits = 10; gv_local.lookup_slx_nse[ 490].bits = 0x0A400000;
+  gv_local.lookup_slx_nse[ 491].nbits = 11; gv_local.lookup_slx_nse[ 491].bits = 0xFDC00000;
+  gv_local.lookup_slx_nse[ 492].nbits = 10; gv_local.lookup_slx_nse[ 492].bits = 0x14C00000;
+  gv_local.lookup_slx_nse[ 493].nbits = 10; gv_local.lookup_slx_nse[ 493].bits = 0x01C00000;
+  gv_local.lookup_slx_nse[ 494].nbits = 11; gv_local.lookup_slx_nse[ 494].bits = 0xFE200000;
+  gv_local.lookup_slx_nse[ 495].nbits = 11; gv_local.lookup_slx_nse[ 495].bits = 0xFDE00000;
+  gv_local.lookup_slx_nse[ 496].nbits = 10; gv_local.lookup_slx_nse[ 496].bits = 0x01800000;
+  gv_local.lookup_slx_nse[ 497].nbits = 11; gv_local.lookup_slx_nse[ 497].bits = 0xF6400000;
+  gv_local.lookup_slx_nse[ 498].nbits = 11; gv_local.lookup_slx_nse[ 498].bits = 0xF2E00000;
+  gv_local.lookup_slx_nse[ 499].nbits = 11; gv_local.lookup_slx_nse[ 499].bits = 0xEE600000;
+  gv_local.lookup_slx_nse[ 500].nbits = 11; gv_local.lookup_slx_nse[ 500].bits = 0xEBE00000;
+  gv_local.lookup_slx_nse[ 501].nbits = 11; gv_local.lookup_slx_nse[ 501].bits = 0xCE600000;
+  gv_local.lookup_slx_nse[ 502].nbits = 11; gv_local.lookup_slx_nse[ 502].bits = 0xE8200000;
+  gv_local.lookup_slx_nse[ 503].nbits = 11; gv_local.lookup_slx_nse[ 503].bits = 0xDA200000;
+  gv_local.lookup_slx_nse[ 504].nbits = 11; gv_local.lookup_slx_nse[ 504].bits = 0xD0200000;
+  gv_local.lookup_slx_nse[ 505].nbits = 11; gv_local.lookup_slx_nse[ 505].bits = 0xDFE00000;
+  gv_local.lookup_slx_nse[ 506].nbits = 11; gv_local.lookup_slx_nse[ 506].bits = 0xDB600000;
+  gv_local.lookup_slx_nse[ 507].nbits = 11; gv_local.lookup_slx_nse[ 507].bits = 0xD5200000;
+  gv_local.lookup_slx_nse[ 508].nbits = 11; gv_local.lookup_slx_nse[ 508].bits = 0xDB400000;
+  gv_local.lookup_slx_nse[ 509].nbits = 11; gv_local.lookup_slx_nse[ 509].bits = 0xDDC00000;
+  gv_local.lookup_slx_nse[ 510].nbits = 11; gv_local.lookup_slx_nse[ 510].bits = 0xC6800000;
+  gv_local.lookup_slx_nse[ 511].nbits =  2; gv_local.lookup_slx_nse[ 511].bits = 0x80000000;
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  /* reverse huffman lookup table
+   */
+  memset (gv_local.rlookup_slx_nse, 0, sizeof(uint16_t)*REV_HUFF_TREESIZE_16);
+
+  for (i=0; i<NSE_HUFF_TREESIZE; i++)
+  {
+    val = gv_local.lookup_slx_nse[i].bits >> 16;
+    gv_local.rlookup_slx_nse [val] = (uint16_t) i;
+    for (j=1; j<=(0xFFFF>>gv_local.lookup_slx_nse[i].nbits); j++)
+      gv_local.rlookup_slx_nse [val+j] = (uint16_t) i;
+  }
+#endif
+
+  _s_sort_lookup (gv_local.lookup_slx_nse, gv_local.idx_slx_nse, NSE_HUFF_TREESIZE);
+
+  gv_local.lookup_slx_nse_initialized = 1;
+}
+
+/*
+ */
+static void _s_init_seq_default (void)
+{
+  memmove (gv_local.conv2to4na[  0], "AAAA", 4);  memmove (gv_local.conv2to4na[  1], "AAAC", 4);
+  memmove (gv_local.conv2to4na[  2], "AAAG", 4);  memmove (gv_local.conv2to4na[  3], "AAAT", 4);
+  memmove (gv_local.conv2to4na[  4], "AACA", 4);  memmove (gv_local.conv2to4na[  5], "AACC", 4);
+  memmove (gv_local.conv2to4na[  6], "AACG", 4);  memmove (gv_local.conv2to4na[  7], "AACT", 4);
+  memmove (gv_local.conv2to4na[  8], "AAGA", 4);  memmove (gv_local.conv2to4na[  9], "AAGC", 4);
+  memmove (gv_local.conv2to4na[ 10], "AAGG", 4);  memmove (gv_local.conv2to4na[ 11], "AAGT", 4);
+  memmove (gv_local.conv2to4na[ 12], "AATA", 4);  memmove (gv_local.conv2to4na[ 13], "AATC", 4);
+  memmove (gv_local.conv2to4na[ 14], "AATG", 4);  memmove (gv_local.conv2to4na[ 15], "AATT", 4);
+  memmove (gv_local.conv2to4na[ 16], "ACAA", 4);  memmove (gv_local.conv2to4na[ 17], "ACAC", 4);
+  memmove (gv_local.conv2to4na[ 18], "ACAG", 4);  memmove (gv_local.conv2to4na[ 19], "ACAT", 4);
+  memmove (gv_local.conv2to4na[ 20], "ACCA", 4);  memmove (gv_local.conv2to4na[ 21], "ACCC", 4);
+  memmove (gv_local.conv2to4na[ 22], "ACCG", 4);  memmove (gv_local.conv2to4na[ 23], "ACCT", 4);
+  memmove (gv_local.conv2to4na[ 24], "ACGA", 4);  memmove (gv_local.conv2to4na[ 25], "ACGC", 4);
+  memmove (gv_local.conv2to4na[ 26], "ACGG", 4);  memmove (gv_local.conv2to4na[ 27], "ACGT", 4);
+  memmove (gv_local.conv2to4na[ 28], "ACTA", 4);  memmove (gv_local.conv2to4na[ 29], "ACTC", 4);
+  memmove (gv_local.conv2to4na[ 30], "ACTG", 4);  memmove (gv_local.conv2to4na[ 31], "ACTT", 4);
+  memmove (gv_local.conv2to4na[ 32], "AGAA", 4);  memmove (gv_local.conv2to4na[ 33], "AGAC", 4);
+  memmove (gv_local.conv2to4na[ 34], "AGAG", 4);  memmove (gv_local.conv2to4na[ 35], "AGAT", 4);
+  memmove (gv_local.conv2to4na[ 36], "AGCA", 4);  memmove (gv_local.conv2to4na[ 37], "AGCC", 4);
+  memmove (gv_local.conv2to4na[ 38], "AGCG", 4);  memmove (gv_local.conv2to4na[ 39], "AGCT", 4);
+  memmove (gv_local.conv2to4na[ 40], "AGGA", 4);  memmove (gv_local.conv2to4na[ 41], "AGGC", 4);
+  memmove (gv_local.conv2to4na[ 42], "AGGG", 4);  memmove (gv_local.conv2to4na[ 43], "AGGT", 4);
+  memmove (gv_local.conv2to4na[ 44], "AGTA", 4);  memmove (gv_local.conv2to4na[ 45], "AGTC", 4);
+  memmove (gv_local.conv2to4na[ 46], "AGTG", 4);  memmove (gv_local.conv2to4na[ 47], "AGTT", 4);
+  memmove (gv_local.conv2to4na[ 48], "ATAA", 4);  memmove (gv_local.conv2to4na[ 49], "ATAC", 4);
+  memmove (gv_local.conv2to4na[ 50], "ATAG", 4);  memmove (gv_local.conv2to4na[ 51], "ATAT", 4);
+  memmove (gv_local.conv2to4na[ 52], "ATCA", 4);  memmove (gv_local.conv2to4na[ 53], "ATCC", 4);
+  memmove (gv_local.conv2to4na[ 54], "ATCG", 4);  memmove (gv_local.conv2to4na[ 55], "ATCT", 4);
+  memmove (gv_local.conv2to4na[ 56], "ATGA", 4);  memmove (gv_local.conv2to4na[ 57], "ATGC", 4);
+  memmove (gv_local.conv2to4na[ 58], "ATGG", 4);  memmove (gv_local.conv2to4na[ 59], "ATGT", 4);
+  memmove (gv_local.conv2to4na[ 60], "ATTA", 4);  memmove (gv_local.conv2to4na[ 61], "ATTC", 4);
+  memmove (gv_local.conv2to4na[ 62], "ATTG", 4);  memmove (gv_local.conv2to4na[ 63], "ATTT", 4);
+  memmove (gv_local.conv2to4na[ 64], "CAAA", 4);  memmove (gv_local.conv2to4na[ 65], "CAAC", 4);
+  memmove (gv_local.conv2to4na[ 66], "CAAG", 4);  memmove (gv_local.conv2to4na[ 67], "CAAT", 4);
+  memmove (gv_local.conv2to4na[ 68], "CACA", 4);  memmove (gv_local.conv2to4na[ 69], "CACC", 4);
+  memmove (gv_local.conv2to4na[ 70], "CACG", 4);  memmove (gv_local.conv2to4na[ 71], "CACT", 4);
+  memmove (gv_local.conv2to4na[ 72], "CAGA", 4);  memmove (gv_local.conv2to4na[ 73], "CAGC", 4);
+  memmove (gv_local.conv2to4na[ 74], "CAGG", 4);  memmove (gv_local.conv2to4na[ 75], "CAGT", 4);
+  memmove (gv_local.conv2to4na[ 76], "CATA", 4);  memmove (gv_local.conv2to4na[ 77], "CATC", 4);
+  memmove (gv_local.conv2to4na[ 78], "CATG", 4);  memmove (gv_local.conv2to4na[ 79], "CATT", 4);
+  memmove (gv_local.conv2to4na[ 80], "CCAA", 4);  memmove (gv_local.conv2to4na[ 81], "CCAC", 4);
+  memmove (gv_local.conv2to4na[ 82], "CCAG", 4);  memmove (gv_local.conv2to4na[ 83], "CCAT", 4);
+  memmove (gv_local.conv2to4na[ 84], "CCCA", 4);  memmove (gv_local.conv2to4na[ 85], "CCCC", 4);
+  memmove (gv_local.conv2to4na[ 86], "CCCG", 4);  memmove (gv_local.conv2to4na[ 87], "CCCT", 4);
+  memmove (gv_local.conv2to4na[ 88], "CCGA", 4);  memmove (gv_local.conv2to4na[ 89], "CCGC", 4);
+  memmove (gv_local.conv2to4na[ 90], "CCGG", 4);  memmove (gv_local.conv2to4na[ 91], "CCGT", 4);
+  memmove (gv_local.conv2to4na[ 92], "CCTA", 4);  memmove (gv_local.conv2to4na[ 93], "CCTC", 4);
+  memmove (gv_local.conv2to4na[ 94], "CCTG", 4);  memmove (gv_local.conv2to4na[ 95], "CCTT", 4);
+  memmove (gv_local.conv2to4na[ 96], "CGAA", 4);  memmove (gv_local.conv2to4na[ 97], "CGAC", 4);
+  memmove (gv_local.conv2to4na[ 98], "CGAG", 4);  memmove (gv_local.conv2to4na[ 99], "CGAT", 4);
+  memmove (gv_local.conv2to4na[100], "CGCA", 4);  memmove (gv_local.conv2to4na[101], "CGCC", 4);
+  memmove (gv_local.conv2to4na[102], "CGCG", 4);  memmove (gv_local.conv2to4na[103], "CGCT", 4);
+  memmove (gv_local.conv2to4na[104], "CGGA", 4);  memmove (gv_local.conv2to4na[105], "CGGC", 4);
+  memmove (gv_local.conv2to4na[106], "CGGG", 4);  memmove (gv_local.conv2to4na[107], "CGGT", 4);
+  memmove (gv_local.conv2to4na[108], "CGTA", 4);  memmove (gv_local.conv2to4na[109], "CGTC", 4);
+  memmove (gv_local.conv2to4na[110], "CGTG", 4);  memmove (gv_local.conv2to4na[111], "CGTT", 4);
+  memmove (gv_local.conv2to4na[112], "CTAA", 4);  memmove (gv_local.conv2to4na[113], "CTAC", 4);
+  memmove (gv_local.conv2to4na[114], "CTAG", 4);  memmove (gv_local.conv2to4na[115], "CTAT", 4);
+  memmove (gv_local.conv2to4na[116], "CTCA", 4);  memmove (gv_local.conv2to4na[117], "CTCC", 4);
+  memmove (gv_local.conv2to4na[118], "CTCG", 4);  memmove (gv_local.conv2to4na[119], "CTCT", 4);
+  memmove (gv_local.conv2to4na[120], "CTGA", 4);  memmove (gv_local.conv2to4na[121], "CTGC", 4);
+  memmove (gv_local.conv2to4na[122], "CTGG", 4);  memmove (gv_local.conv2to4na[123], "CTGT", 4);
+  memmove (gv_local.conv2to4na[124], "CTTA", 4);  memmove (gv_local.conv2to4na[125], "CTTC", 4);
+  memmove (gv_local.conv2to4na[126], "CTTG", 4);  memmove (gv_local.conv2to4na[127], "CTTT", 4);
+  memmove (gv_local.conv2to4na[128], "GAAA", 4);  memmove (gv_local.conv2to4na[129], "GAAC", 4);
+  memmove (gv_local.conv2to4na[130], "GAAG", 4);  memmove (gv_local.conv2to4na[131], "GAAT", 4);
+  memmove (gv_local.conv2to4na[132], "GACA", 4);  memmove (gv_local.conv2to4na[133], "GACC", 4);
+  memmove (gv_local.conv2to4na[134], "GACG", 4);  memmove (gv_local.conv2to4na[135], "GACT", 4);
+  memmove (gv_local.conv2to4na[136], "GAGA", 4);  memmove (gv_local.conv2to4na[137], "GAGC", 4);
+  memmove (gv_local.conv2to4na[138], "GAGG", 4);  memmove (gv_local.conv2to4na[139], "GAGT", 4);
+  memmove (gv_local.conv2to4na[140], "GATA", 4);  memmove (gv_local.conv2to4na[141], "GATC", 4);
+  memmove (gv_local.conv2to4na[142], "GATG", 4);  memmove (gv_local.conv2to4na[143], "GATT", 4);
+  memmove (gv_local.conv2to4na[144], "GCAA", 4);  memmove (gv_local.conv2to4na[145], "GCAC", 4);
+  memmove (gv_local.conv2to4na[146], "GCAG", 4);  memmove (gv_local.conv2to4na[147], "GCAT", 4);
+  memmove (gv_local.conv2to4na[148], "GCCA", 4);  memmove (gv_local.conv2to4na[149], "GCCC", 4);
+  memmove (gv_local.conv2to4na[150], "GCCG", 4);  memmove (gv_local.conv2to4na[151], "GCCT", 4);
+  memmove (gv_local.conv2to4na[152], "GCGA", 4);  memmove (gv_local.conv2to4na[153], "GCGC", 4);
+  memmove (gv_local.conv2to4na[154], "GCGG", 4);  memmove (gv_local.conv2to4na[155], "GCGT", 4);
+  memmove (gv_local.conv2to4na[156], "GCTA", 4);  memmove (gv_local.conv2to4na[157], "GCTC", 4);
+  memmove (gv_local.conv2to4na[158], "GCTG", 4);  memmove (gv_local.conv2to4na[159], "GCTT", 4);
+  memmove (gv_local.conv2to4na[160], "GGAA", 4);  memmove (gv_local.conv2to4na[161], "GGAC", 4);
+  memmove (gv_local.conv2to4na[162], "GGAG", 4);  memmove (gv_local.conv2to4na[163], "GGAT", 4);
+  memmove (gv_local.conv2to4na[164], "GGCA", 4);  memmove (gv_local.conv2to4na[165], "GGCC", 4);
+  memmove (gv_local.conv2to4na[166], "GGCG", 4);  memmove (gv_local.conv2to4na[167], "GGCT", 4);
+  memmove (gv_local.conv2to4na[168], "GGGA", 4);  memmove (gv_local.conv2to4na[169], "GGGC", 4);
+  memmove (gv_local.conv2to4na[170], "GGGG", 4);  memmove (gv_local.conv2to4na[171], "GGGT", 4);
+  memmove (gv_local.conv2to4na[172], "GGTA", 4);  memmove (gv_local.conv2to4na[173], "GGTC", 4);
+  memmove (gv_local.conv2to4na[174], "GGTG", 4);  memmove (gv_local.conv2to4na[175], "GGTT", 4);
+  memmove (gv_local.conv2to4na[176], "GTAA", 4);  memmove (gv_local.conv2to4na[177], "GTAC", 4);
+  memmove (gv_local.conv2to4na[178], "GTAG", 4);  memmove (gv_local.conv2to4na[179], "GTAT", 4);
+  memmove (gv_local.conv2to4na[180], "GTCA", 4);  memmove (gv_local.conv2to4na[181], "GTCC", 4);
+  memmove (gv_local.conv2to4na[182], "GTCG", 4);  memmove (gv_local.conv2to4na[183], "GTCT", 4);
+  memmove (gv_local.conv2to4na[184], "GTGA", 4);  memmove (gv_local.conv2to4na[185], "GTGC", 4);
+  memmove (gv_local.conv2to4na[186], "GTGG", 4);  memmove (gv_local.conv2to4na[187], "GTGT", 4);
+  memmove (gv_local.conv2to4na[188], "GTTA", 4);  memmove (gv_local.conv2to4na[189], "GTTC", 4);
+  memmove (gv_local.conv2to4na[190], "GTTG", 4);  memmove (gv_local.conv2to4na[191], "GTTT", 4);
+  memmove (gv_local.conv2to4na[192], "TAAA", 4);  memmove (gv_local.conv2to4na[193], "TAAC", 4);
+  memmove (gv_local.conv2to4na[194], "TAAG", 4);  memmove (gv_local.conv2to4na[195], "TAAT", 4);
+  memmove (gv_local.conv2to4na[196], "TACA", 4);  memmove (gv_local.conv2to4na[197], "TACC", 4);
+  memmove (gv_local.conv2to4na[198], "TACG", 4);  memmove (gv_local.conv2to4na[199], "TACT", 4);
+  memmove (gv_local.conv2to4na[200], "TAGA", 4);  memmove (gv_local.conv2to4na[201], "TAGC", 4);
+  memmove (gv_local.conv2to4na[202], "TAGG", 4);  memmove (gv_local.conv2to4na[203], "TAGT", 4);
+  memmove (gv_local.conv2to4na[204], "TATA", 4);  memmove (gv_local.conv2to4na[205], "TATC", 4);
+  memmove (gv_local.conv2to4na[206], "TATG", 4);  memmove (gv_local.conv2to4na[207], "TATT", 4);
+  memmove (gv_local.conv2to4na[208], "TCAA", 4);  memmove (gv_local.conv2to4na[209], "TCAC", 4);
+  memmove (gv_local.conv2to4na[210], "TCAG", 4);  memmove (gv_local.conv2to4na[211], "TCAT", 4);
+  memmove (gv_local.conv2to4na[212], "TCCA", 4);  memmove (gv_local.conv2to4na[213], "TCCC", 4);
+  memmove (gv_local.conv2to4na[214], "TCCG", 4);  memmove (gv_local.conv2to4na[215], "TCCT", 4);
+  memmove (gv_local.conv2to4na[216], "TCGA", 4);  memmove (gv_local.conv2to4na[217], "TCGC", 4);
+  memmove (gv_local.conv2to4na[218], "TCGG", 4);  memmove (gv_local.conv2to4na[219], "TCGT", 4);
+  memmove (gv_local.conv2to4na[220], "TCTA", 4);  memmove (gv_local.conv2to4na[221], "TCTC", 4);
+  memmove (gv_local.conv2to4na[222], "TCTG", 4);  memmove (gv_local.conv2to4na[223], "TCTT", 4);
+  memmove (gv_local.conv2to4na[224], "TGAA", 4);  memmove (gv_local.conv2to4na[225], "TGAC", 4);
+  memmove (gv_local.conv2to4na[226], "TGAG", 4);  memmove (gv_local.conv2to4na[227], "TGAT", 4);
+  memmove (gv_local.conv2to4na[228], "TGCA", 4);  memmove (gv_local.conv2to4na[229], "TGCC", 4);
+  memmove (gv_local.conv2to4na[230], "TGCG", 4);  memmove (gv_local.conv2to4na[231], "TGCT", 4);
+  memmove (gv_local.conv2to4na[232], "TGGA", 4);  memmove (gv_local.conv2to4na[233], "TGGC", 4);
+  memmove (gv_local.conv2to4na[234], "TGGG", 4);  memmove (gv_local.conv2to4na[235], "TGGT", 4);
+  memmove (gv_local.conv2to4na[236], "TGTA", 4);  memmove (gv_local.conv2to4na[237], "TGTC", 4);
+  memmove (gv_local.conv2to4na[238], "TGTG", 4);  memmove (gv_local.conv2to4na[239], "TGTT", 4);
+  memmove (gv_local.conv2to4na[240], "TTAA", 4);  memmove (gv_local.conv2to4na[241], "TTAC", 4);
+  memmove (gv_local.conv2to4na[242], "TTAG", 4);  memmove (gv_local.conv2to4na[243], "TTAT", 4);
+  memmove (gv_local.conv2to4na[244], "TTCA", 4);  memmove (gv_local.conv2to4na[245], "TTCC", 4);
+  memmove (gv_local.conv2to4na[246], "TTCG", 4);  memmove (gv_local.conv2to4na[247], "TTCT", 4);
+  memmove (gv_local.conv2to4na[248], "TTGA", 4);  memmove (gv_local.conv2to4na[249], "TTGC", 4);
+  memmove (gv_local.conv2to4na[250], "TTGG", 4);  memmove (gv_local.conv2to4na[251], "TTGT", 4);
+  memmove (gv_local.conv2to4na[252], "TTTA", 4);  memmove (gv_local.conv2to4na[253], "TTTC", 4);
+  memmove (gv_local.conv2to4na[254], "TTTG", 4);  memmove (gv_local.conv2to4na[255], "TTTT", 4);
+
+  memmove (gv_local.conv2to4cs[  0], "0000", 4);  memmove (gv_local.conv2to4cs[  1], "0001", 4);
+  memmove (gv_local.conv2to4cs[  2], "0002", 4);  memmove (gv_local.conv2to4cs[  3], "0003", 4);
+  memmove (gv_local.conv2to4cs[  4], "0010", 4);  memmove (gv_local.conv2to4cs[  5], "0011", 4);
+  memmove (gv_local.conv2to4cs[  6], "0012", 4);  memmove (gv_local.conv2to4cs[  7], "0013", 4);
+  memmove (gv_local.conv2to4cs[  8], "0020", 4);  memmove (gv_local.conv2to4cs[  9], "0021", 4);
+  memmove (gv_local.conv2to4cs[ 10], "0022", 4);  memmove (gv_local.conv2to4cs[ 11], "0023", 4);
+  memmove (gv_local.conv2to4cs[ 12], "0030", 4);  memmove (gv_local.conv2to4cs[ 13], "0031", 4);
+  memmove (gv_local.conv2to4cs[ 14], "0032", 4);  memmove (gv_local.conv2to4cs[ 15], "0033", 4);
+  memmove (gv_local.conv2to4cs[ 16], "0100", 4);  memmove (gv_local.conv2to4cs[ 17], "0101", 4);
+  memmove (gv_local.conv2to4cs[ 18], "0102", 4);  memmove (gv_local.conv2to4cs[ 19], "0103", 4);
+  memmove (gv_local.conv2to4cs[ 20], "0110", 4);  memmove (gv_local.conv2to4cs[ 21], "0111", 4);
+  memmove (gv_local.conv2to4cs[ 22], "0112", 4);  memmove (gv_local.conv2to4cs[ 23], "0113", 4);
+  memmove (gv_local.conv2to4cs[ 24], "0120", 4);  memmove (gv_local.conv2to4cs[ 25], "0121", 4);
+  memmove (gv_local.conv2to4cs[ 26], "0122", 4);  memmove (gv_local.conv2to4cs[ 27], "0123", 4);
+  memmove (gv_local.conv2to4cs[ 28], "0130", 4);  memmove (gv_local.conv2to4cs[ 29], "0131", 4);
+  memmove (gv_local.conv2to4cs[ 30], "0132", 4);  memmove (gv_local.conv2to4cs[ 31], "0133", 4);
+  memmove (gv_local.conv2to4cs[ 32], "0200", 4);  memmove (gv_local.conv2to4cs[ 33], "0201", 4);
+  memmove (gv_local.conv2to4cs[ 34], "0202", 4);  memmove (gv_local.conv2to4cs[ 35], "0203", 4);
+  memmove (gv_local.conv2to4cs[ 36], "0210", 4);  memmove (gv_local.conv2to4cs[ 37], "0211", 4);
+  memmove (gv_local.conv2to4cs[ 38], "0212", 4);  memmove (gv_local.conv2to4cs[ 39], "0213", 4);
+  memmove (gv_local.conv2to4cs[ 40], "0220", 4);  memmove (gv_local.conv2to4cs[ 41], "0221", 4);
+  memmove (gv_local.conv2to4cs[ 42], "0222", 4);  memmove (gv_local.conv2to4cs[ 43], "0223", 4);
+  memmove (gv_local.conv2to4cs[ 44], "0230", 4);  memmove (gv_local.conv2to4cs[ 45], "0231", 4);
+  memmove (gv_local.conv2to4cs[ 46], "0232", 4);  memmove (gv_local.conv2to4cs[ 47], "0233", 4);
+  memmove (gv_local.conv2to4cs[ 48], "0300", 4);  memmove (gv_local.conv2to4cs[ 49], "0301", 4);
+  memmove (gv_local.conv2to4cs[ 50], "0302", 4);  memmove (gv_local.conv2to4cs[ 51], "0303", 4);
+  memmove (gv_local.conv2to4cs[ 52], "0310", 4);  memmove (gv_local.conv2to4cs[ 53], "0311", 4);
+  memmove (gv_local.conv2to4cs[ 54], "0312", 4);  memmove (gv_local.conv2to4cs[ 55], "0313", 4);
+  memmove (gv_local.conv2to4cs[ 56], "0320", 4);  memmove (gv_local.conv2to4cs[ 57], "0321", 4);
+  memmove (gv_local.conv2to4cs[ 58], "0322", 4);  memmove (gv_local.conv2to4cs[ 59], "0323", 4);
+  memmove (gv_local.conv2to4cs[ 60], "0330", 4);  memmove (gv_local.conv2to4cs[ 61], "0331", 4);
+  memmove (gv_local.conv2to4cs[ 62], "0332", 4);  memmove (gv_local.conv2to4cs[ 63], "0333", 4);
+  memmove (gv_local.conv2to4cs[ 64], "1000", 4);  memmove (gv_local.conv2to4cs[ 65], "1001", 4);
+  memmove (gv_local.conv2to4cs[ 66], "1002", 4);  memmove (gv_local.conv2to4cs[ 67], "1003", 4);
+  memmove (gv_local.conv2to4cs[ 68], "1010", 4);  memmove (gv_local.conv2to4cs[ 69], "1011", 4);
+  memmove (gv_local.conv2to4cs[ 70], "1012", 4);  memmove (gv_local.conv2to4cs[ 71], "1013", 4);
+  memmove (gv_local.conv2to4cs[ 72], "1020", 4);  memmove (gv_local.conv2to4cs[ 73], "1021", 4);
+  memmove (gv_local.conv2to4cs[ 74], "1022", 4);  memmove (gv_local.conv2to4cs[ 75], "1023", 4);
+  memmove (gv_local.conv2to4cs[ 76], "1030", 4);  memmove (gv_local.conv2to4cs[ 77], "1031", 4);
+  memmove (gv_local.conv2to4cs[ 78], "1032", 4);  memmove (gv_local.conv2to4cs[ 79], "1033", 4);
+  memmove (gv_local.conv2to4cs[ 80], "1100", 4);  memmove (gv_local.conv2to4cs[ 81], "1101", 4);
+  memmove (gv_local.conv2to4cs[ 82], "1102", 4);  memmove (gv_local.conv2to4cs[ 83], "1103", 4);
+  memmove (gv_local.conv2to4cs[ 84], "1110", 4);  memmove (gv_local.conv2to4cs[ 85], "1111", 4);
+  memmove (gv_local.conv2to4cs[ 86], "1112", 4);  memmove (gv_local.conv2to4cs[ 87], "1113", 4);
+  memmove (gv_local.conv2to4cs[ 88], "1120", 4);  memmove (gv_local.conv2to4cs[ 89], "1121", 4);
+  memmove (gv_local.conv2to4cs[ 90], "1122", 4);  memmove (gv_local.conv2to4cs[ 91], "1123", 4);
+  memmove (gv_local.conv2to4cs[ 92], "1130", 4);  memmove (gv_local.conv2to4cs[ 93], "1131", 4);
+  memmove (gv_local.conv2to4cs[ 94], "1132", 4);  memmove (gv_local.conv2to4cs[ 95], "1133", 4);
+  memmove (gv_local.conv2to4cs[ 96], "1200", 4);  memmove (gv_local.conv2to4cs[ 97], "1201", 4);
+  memmove (gv_local.conv2to4cs[ 98], "1202", 4);  memmove (gv_local.conv2to4cs[ 99], "1203", 4);
+  memmove (gv_local.conv2to4cs[100], "1210", 4);  memmove (gv_local.conv2to4cs[101], "1211", 4);
+  memmove (gv_local.conv2to4cs[102], "1212", 4);  memmove (gv_local.conv2to4cs[103], "1213", 4);
+  memmove (gv_local.conv2to4cs[104], "1220", 4);  memmove (gv_local.conv2to4cs[105], "1221", 4);
+  memmove (gv_local.conv2to4cs[106], "1222", 4);  memmove (gv_local.conv2to4cs[107], "1223", 4);
+  memmove (gv_local.conv2to4cs[108], "1230", 4);  memmove (gv_local.conv2to4cs[109], "1231", 4);
+  memmove (gv_local.conv2to4cs[110], "1232", 4);  memmove (gv_local.conv2to4cs[111], "1233", 4);
+  memmove (gv_local.conv2to4cs[112], "1300", 4);  memmove (gv_local.conv2to4cs[113], "1301", 4);
+  memmove (gv_local.conv2to4cs[114], "1302", 4);  memmove (gv_local.conv2to4cs[115], "1303", 4);
+  memmove (gv_local.conv2to4cs[116], "1310", 4);  memmove (gv_local.conv2to4cs[117], "1311", 4);
+  memmove (gv_local.conv2to4cs[118], "1312", 4);  memmove (gv_local.conv2to4cs[119], "1313", 4);
+  memmove (gv_local.conv2to4cs[120], "1320", 4);  memmove (gv_local.conv2to4cs[121], "1321", 4);
+  memmove (gv_local.conv2to4cs[122], "1322", 4);  memmove (gv_local.conv2to4cs[123], "1323", 4);
+  memmove (gv_local.conv2to4cs[124], "1330", 4);  memmove (gv_local.conv2to4cs[125], "1331", 4);
+  memmove (gv_local.conv2to4cs[126], "1332", 4);  memmove (gv_local.conv2to4cs[127], "1333", 4);
+  memmove (gv_local.conv2to4cs[128], "2000", 4);  memmove (gv_local.conv2to4cs[129], "2001", 4);
+  memmove (gv_local.conv2to4cs[130], "2002", 4);  memmove (gv_local.conv2to4cs[131], "2003", 4);
+  memmove (gv_local.conv2to4cs[132], "2010", 4);  memmove (gv_local.conv2to4cs[133], "2011", 4);
+  memmove (gv_local.conv2to4cs[134], "2012", 4);  memmove (gv_local.conv2to4cs[135], "2013", 4);
+  memmove (gv_local.conv2to4cs[136], "2020", 4);  memmove (gv_local.conv2to4cs[137], "2021", 4);
+  memmove (gv_local.conv2to4cs[138], "2022", 4);  memmove (gv_local.conv2to4cs[139], "2023", 4);
+  memmove (gv_local.conv2to4cs[140], "2030", 4);  memmove (gv_local.conv2to4cs[141], "2031", 4);
+  memmove (gv_local.conv2to4cs[142], "2032", 4);  memmove (gv_local.conv2to4cs[143], "2033", 4);
+  memmove (gv_local.conv2to4cs[144], "2100", 4);  memmove (gv_local.conv2to4cs[145], "2101", 4);
+  memmove (gv_local.conv2to4cs[146], "2102", 4);  memmove (gv_local.conv2to4cs[147], "2103", 4);
+  memmove (gv_local.conv2to4cs[148], "2110", 4);  memmove (gv_local.conv2to4cs[149], "2111", 4);
+  memmove (gv_local.conv2to4cs[150], "2112", 4);  memmove (gv_local.conv2to4cs[151], "2113", 4);
+  memmove (gv_local.conv2to4cs[152], "2120", 4);  memmove (gv_local.conv2to4cs[153], "2121", 4);
+  memmove (gv_local.conv2to4cs[154], "2122", 4);  memmove (gv_local.conv2to4cs[155], "2123", 4);
+  memmove (gv_local.conv2to4cs[156], "2130", 4);  memmove (gv_local.conv2to4cs[157], "2131", 4);
+  memmove (gv_local.conv2to4cs[158], "2132", 4);  memmove (gv_local.conv2to4cs[159], "2133", 4);
+  memmove (gv_local.conv2to4cs[160], "2200", 4);  memmove (gv_local.conv2to4cs[161], "2201", 4);
+  memmove (gv_local.conv2to4cs[162], "2202", 4);  memmove (gv_local.conv2to4cs[163], "2203", 4);
+  memmove (gv_local.conv2to4cs[164], "2210", 4);  memmove (gv_local.conv2to4cs[165], "2211", 4);
+  memmove (gv_local.conv2to4cs[166], "2212", 4);  memmove (gv_local.conv2to4cs[167], "2213", 4);
+  memmove (gv_local.conv2to4cs[168], "2220", 4);  memmove (gv_local.conv2to4cs[169], "2221", 4);
+  memmove (gv_local.conv2to4cs[170], "2222", 4);  memmove (gv_local.conv2to4cs[171], "2223", 4);
+  memmove (gv_local.conv2to4cs[172], "2230", 4);  memmove (gv_local.conv2to4cs[173], "2231", 4);
+  memmove (gv_local.conv2to4cs[174], "2232", 4);  memmove (gv_local.conv2to4cs[175], "2233", 4);
+  memmove (gv_local.conv2to4cs[176], "2300", 4);  memmove (gv_local.conv2to4cs[177], "2301", 4);
+  memmove (gv_local.conv2to4cs[178], "2302", 4);  memmove (gv_local.conv2to4cs[179], "2303", 4);
+  memmove (gv_local.conv2to4cs[180], "2310", 4);  memmove (gv_local.conv2to4cs[181], "2311", 4);
+  memmove (gv_local.conv2to4cs[182], "2312", 4);  memmove (gv_local.conv2to4cs[183], "2313", 4);
+  memmove (gv_local.conv2to4cs[184], "2320", 4);  memmove (gv_local.conv2to4cs[185], "2321", 4);
+  memmove (gv_local.conv2to4cs[186], "2322", 4);  memmove (gv_local.conv2to4cs[187], "2323", 4);
+  memmove (gv_local.conv2to4cs[188], "2330", 4);  memmove (gv_local.conv2to4cs[189], "2331", 4);
+  memmove (gv_local.conv2to4cs[190], "2332", 4);  memmove (gv_local.conv2to4cs[191], "2333", 4);
+  memmove (gv_local.conv2to4cs[192], "3000", 4);  memmove (gv_local.conv2to4cs[193], "3001", 4);
+  memmove (gv_local.conv2to4cs[194], "3002", 4);  memmove (gv_local.conv2to4cs[195], "3003", 4);
+  memmove (gv_local.conv2to4cs[196], "3010", 4);  memmove (gv_local.conv2to4cs[197], "3011", 4);
+  memmove (gv_local.conv2to4cs[198], "3012", 4);  memmove (gv_local.conv2to4cs[199], "3013", 4);
+  memmove (gv_local.conv2to4cs[200], "3020", 4);  memmove (gv_local.conv2to4cs[201], "3021", 4);
+  memmove (gv_local.conv2to4cs[202], "3022", 4);  memmove (gv_local.conv2to4cs[203], "3023", 4);
+  memmove (gv_local.conv2to4cs[204], "3030", 4);  memmove (gv_local.conv2to4cs[205], "3031", 4);
+  memmove (gv_local.conv2to4cs[206], "3032", 4);  memmove (gv_local.conv2to4cs[207], "3033", 4);
+  memmove (gv_local.conv2to4cs[208], "3100", 4);  memmove (gv_local.conv2to4cs[209], "3101", 4);
+  memmove (gv_local.conv2to4cs[210], "3102", 4);  memmove (gv_local.conv2to4cs[211], "3103", 4);
+  memmove (gv_local.conv2to4cs[212], "3110", 4);  memmove (gv_local.conv2to4cs[213], "3111", 4);
+  memmove (gv_local.conv2to4cs[214], "3112", 4);  memmove (gv_local.conv2to4cs[215], "3113", 4);
+  memmove (gv_local.conv2to4cs[216], "3120", 4);  memmove (gv_local.conv2to4cs[217], "3121", 4);
+  memmove (gv_local.conv2to4cs[218], "3122", 4);  memmove (gv_local.conv2to4cs[219], "3123", 4);
+  memmove (gv_local.conv2to4cs[220], "3130", 4);  memmove (gv_local.conv2to4cs[221], "3131", 4);
+  memmove (gv_local.conv2to4cs[222], "3132", 4);  memmove (gv_local.conv2to4cs[223], "3133", 4);
+  memmove (gv_local.conv2to4cs[224], "3200", 4);  memmove (gv_local.conv2to4cs[225], "3201", 4);
+  memmove (gv_local.conv2to4cs[226], "3202", 4);  memmove (gv_local.conv2to4cs[227], "3203", 4);
+  memmove (gv_local.conv2to4cs[228], "3210", 4);  memmove (gv_local.conv2to4cs[229], "3211", 4);
+  memmove (gv_local.conv2to4cs[230], "3212", 4);  memmove (gv_local.conv2to4cs[231], "3213", 4);
+  memmove (gv_local.conv2to4cs[232], "3220", 4);  memmove (gv_local.conv2to4cs[233], "3221", 4);
+  memmove (gv_local.conv2to4cs[234], "3222", 4);  memmove (gv_local.conv2to4cs[235], "3223", 4);
+  memmove (gv_local.conv2to4cs[236], "3230", 4);  memmove (gv_local.conv2to4cs[237], "3231", 4);
+  memmove (gv_local.conv2to4cs[238], "3232", 4);  memmove (gv_local.conv2to4cs[239], "3233", 4);
+  memmove (gv_local.conv2to4cs[240], "3300", 4);  memmove (gv_local.conv2to4cs[241], "3301", 4);
+  memmove (gv_local.conv2to4cs[242], "3302", 4);  memmove (gv_local.conv2to4cs[243], "3303", 4);
+  memmove (gv_local.conv2to4cs[244], "3310", 4);  memmove (gv_local.conv2to4cs[245], "3311", 4);
+  memmove (gv_local.conv2to4cs[246], "3312", 4);  memmove (gv_local.conv2to4cs[247], "3313", 4);
+  memmove (gv_local.conv2to4cs[248], "3320", 4);  memmove (gv_local.conv2to4cs[249], "3321", 4);
+  memmove (gv_local.conv2to4cs[250], "3322", 4);  memmove (gv_local.conv2to4cs[251], "3323", 4);
+  memmove (gv_local.conv2to4cs[252], "3330", 4);  memmove (gv_local.conv2to4cs[253], "3331", 4);
+  memmove (gv_local.conv2to4cs[254], "3332", 4);  memmove (gv_local.conv2to4cs[255], "3333", 4);
+  gv_local.lookup_454_seq_initialized = 1;
+}
+/*
+ */
+static void _s_init_pos_454_default (void)
+{
+  memset (gv_local.lookup_454_pos, 0, sizeof(SRALookup)*POS_454_HUFF_TREESIZE);
+
+  gv_local.lookup_454_pos[  0].nbits =  2; gv_local.lookup_454_pos[  0].bits = 0xC0000000;
+  gv_local.lookup_454_pos[  1].nbits =  3; gv_local.lookup_454_pos[  1].bits = 0x20000000;
+  gv_local.lookup_454_pos[  2].nbits =  2; gv_local.lookup_454_pos[  2].bits = 0x40000000;
+  gv_local.lookup_454_pos[  3].nbits =  2; gv_local.lookup_454_pos[  3].bits = 0x80000000;
+  gv_local.lookup_454_pos[  4].nbits =  4; gv_local.lookup_454_pos[  4].bits = 0x10000000;
+  gv_local.lookup_454_pos[  5].nbits =  6; gv_local.lookup_454_pos[  5].bits = 0x04000000;
+  gv_local.lookup_454_pos[  6].nbits = 11; gv_local.lookup_454_pos[  6].bits = 0x0E400000;
+  gv_local.lookup_454_pos[  7].nbits =  8; gv_local.lookup_454_pos[  7].bits = 0x0F000000;
+  gv_local.lookup_454_pos[  8].nbits =  7; gv_local.lookup_454_pos[  8].bits = 0x0C000000;
+  gv_local.lookup_454_pos[  9].nbits =  9; gv_local.lookup_454_pos[  9].bits = 0x08800000;
+  gv_local.lookup_454_pos[ 10].nbits = 12; gv_local.lookup_454_pos[ 10].bits = 0x0A000000;
+  gv_local.lookup_454_pos[ 11].nbits =  6; gv_local.lookup_454_pos[ 11].bits = 0x00000000;
+  gv_local.lookup_454_pos[ 12].nbits =  8; gv_local.lookup_454_pos[ 12].bits = 0x09000000;
+  gv_local.lookup_454_pos[ 13].nbits = 11; gv_local.lookup_454_pos[ 13].bits = 0x0AC00000;
+  gv_local.lookup_454_pos[ 14].nbits = 14; gv_local.lookup_454_pos[ 14].bits = 0x0E240000;
+  gv_local.lookup_454_pos[ 15].nbits =  9; gv_local.lookup_454_pos[ 15].bits = 0x0E800000;
+  gv_local.lookup_454_pos[ 16].nbits =  9; gv_local.lookup_454_pos[ 16].bits = 0x0B000000;
+  gv_local.lookup_454_pos[ 17].nbits = 12; gv_local.lookup_454_pos[ 17].bits = 0x0A300000;
+  gv_local.lookup_454_pos[ 18].nbits = 13; gv_local.lookup_454_pos[ 18].bits = 0x08580000;
+  gv_local.lookup_454_pos[ 19].nbits = 12; gv_local.lookup_454_pos[ 19].bits = 0x0E600000;
+  gv_local.lookup_454_pos[ 20].nbits = 10; gv_local.lookup_454_pos[ 20].bits = 0x0B800000;
+  gv_local.lookup_454_pos[ 21].nbits = 13; gv_local.lookup_454_pos[ 21].bits = 0x08400000;
+  gv_local.lookup_454_pos[ 22].nbits = 14; gv_local.lookup_454_pos[ 22].bits = 0x08540000;
+  gv_local.lookup_454_pos[ 23].nbits = 13; gv_local.lookup_454_pos[ 23].bits = 0x0E280000;
+  gv_local.lookup_454_pos[ 24].nbits = 10; gv_local.lookup_454_pos[ 24].bits = 0x0A400000;
+  gv_local.lookup_454_pos[ 25].nbits = 13; gv_local.lookup_454_pos[ 25].bits = 0x0E000000;
+  gv_local.lookup_454_pos[ 26].nbits = 14; gv_local.lookup_454_pos[ 26].bits = 0x0E180000;
+  gv_local.lookup_454_pos[ 27].nbits = 13; gv_local.lookup_454_pos[ 27].bits = 0x0E380000;
+  gv_local.lookup_454_pos[ 28].nbits = 10; gv_local.lookup_454_pos[ 28].bits = 0x08000000;
+  gv_local.lookup_454_pos[ 29].nbits = 14; gv_local.lookup_454_pos[ 29].bits = 0x0E0C0000;
+  gv_local.lookup_454_pos[ 30].nbits = 15; gv_local.lookup_454_pos[ 30].bits = 0x0AB40000;
+  gv_local.lookup_454_pos[ 31].nbits = 13; gv_local.lookup_454_pos[ 31].bits = 0x0AA00000;
+  gv_local.lookup_454_pos[ 32].nbits = 11; gv_local.lookup_454_pos[ 32].bits = 0x0A800000;
+  gv_local.lookup_454_pos[ 33].nbits = 14; gv_local.lookup_454_pos[ 33].bits = 0x084C0000;
+  gv_local.lookup_454_pos[ 34].nbits = 16; gv_local.lookup_454_pos[ 34].bits = 0x0AB60000;
+  gv_local.lookup_454_pos[ 35].nbits = 14; gv_local.lookup_454_pos[ 35].bits = 0x0E200000;
+  gv_local.lookup_454_pos[ 36].nbits = 12; gv_local.lookup_454_pos[ 36].bits = 0x0E700000;
+  gv_local.lookup_454_pos[ 37].nbits = 14; gv_local.lookup_454_pos[ 37].bits = 0x0ABC0000;
+  gv_local.lookup_454_pos[ 38].nbits = 15; gv_local.lookup_454_pos[ 38].bits = 0x0E080000;
+  gv_local.lookup_454_pos[ 39].nbits = 13; gv_local.lookup_454_pos[ 39].bits = 0x0AA80000;
+  gv_local.lookup_454_pos[ 40].nbits = 11; gv_local.lookup_454_pos[ 40].bits = 0x08600000;
+  gv_local.lookup_454_pos[ 41].nbits = 14; gv_local.lookup_454_pos[ 41].bits = 0x0AB00000;
+  gv_local.lookup_454_pos[ 42].nbits = 16; gv_local.lookup_454_pos[ 42].bits = 0x0E1E0000;
+  gv_local.lookup_454_pos[ 43].nbits = 14; gv_local.lookup_454_pos[ 43].bits = 0x08500000;
+  gv_local.lookup_454_pos[ 44].nbits = 12; gv_local.lookup_454_pos[ 44].bits = 0x0AF00000;
+  gv_local.lookup_454_pos[ 45].nbits = 14; gv_local.lookup_454_pos[ 45].bits = 0x0A1C0000;
+  gv_local.lookup_454_pos[ 46].nbits = 14; gv_local.lookup_454_pos[ 46].bits = 0x08480000;
+  gv_local.lookup_454_pos[ 47].nbits = 13; gv_local.lookup_454_pos[ 47].bits = 0x0E300000;
+  gv_local.lookup_454_pos[ 48].nbits = 12; gv_local.lookup_454_pos[ 48].bits = 0x0AE00000;
+  gv_local.lookup_454_pos[ 49].nbits = 14; gv_local.lookup_454_pos[ 49].bits = 0x0AB80000;
+  gv_local.lookup_454_pos[ 50].nbits = 16; gv_local.lookup_454_pos[ 50].bits = 0x0A1B0000;
+  gv_local.lookup_454_pos[ 51].nbits = 15; gv_local.lookup_454_pos[ 51].bits = 0x0A180000;
+  gv_local.lookup_454_pos[ 52].nbits = 12; gv_local.lookup_454_pos[ 52].bits = 0x0A200000;
+  gv_local.lookup_454_pos[ 53].nbits = 15; gv_local.lookup_454_pos[ 53].bits = 0x0E1C0000;
+  gv_local.lookup_454_pos[ 54].nbits = 16; gv_local.lookup_454_pos[ 54].bits = 0x0A1A0000;
+  gv_local.lookup_454_pos[ 55].nbits = 16; gv_local.lookup_454_pos[ 55].bits = 0x0E1F0000;
+  gv_local.lookup_454_pos[ 56].nbits = 13; gv_local.lookup_454_pos[ 56].bits = 0x0E100000;
+  gv_local.lookup_454_pos[ 57].nbits = 17; gv_local.lookup_454_pos[ 57].bits = 0x0AB78000;
+  gv_local.lookup_454_pos[ 58].nbits = 18; gv_local.lookup_454_pos[ 58].bits = 0x0AB70000;
+  gv_local.lookup_454_pos[ 59].nbits = 15; gv_local.lookup_454_pos[ 59].bits = 0x0E0A0000;
+  gv_local.lookup_454_pos[ 60].nbits = 13; gv_local.lookup_454_pos[ 60].bits = 0x0A100000;
+  gv_local.lookup_454_pos[ 61].nbits = 19; gv_local.lookup_454_pos[ 61].bits = 0x0AB76000;
+  gv_local.lookup_454_pos[ 62].nbits = 19; gv_local.lookup_454_pos[ 62].bits = 0x0AB74000;
+  gv_local.lookup_454_pos[ 63].nbits = 10; gv_local.lookup_454_pos[ 63].bits = 0x0BC00000;
+
+  _s_sort_lookup (gv_local.lookup_454_pos, gv_local.idx_454_pos, POS_454_HUFF_TREESIZE);
+
+  gv_local.lookup_454_pos_initialized = 1;
+}
+/*
+ */
+static void _s_init_prb_454_default (void)
+{
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  int      i, j;
+  uint16_t val;
+#endif
+
+  memset (gv_local.lookup_454_prb, 0, sizeof(SRALookup)*PRB_454_HUFF_TREESIZE);
+  
+  gv_local.lookup_454_prb[  0].nbits = 10; gv_local.lookup_454_prb[  0].bits = 0xA0400000;
+  gv_local.lookup_454_prb[  1].nbits =  9; gv_local.lookup_454_prb[  1].bits = 0xA0800000;
+  gv_local.lookup_454_prb[  2].nbits =  9; gv_local.lookup_454_prb[  2].bits = 0xA8800000;
+  gv_local.lookup_454_prb[  3].nbits =  9; gv_local.lookup_454_prb[  3].bits = 0xA8000000;
+  gv_local.lookup_454_prb[  4].nbits =  9; gv_local.lookup_454_prb[  4].bits = 0xDA000000;
+  gv_local.lookup_454_prb[  5].nbits =  9; gv_local.lookup_454_prb[  5].bits = 0xDA800000;
+  gv_local.lookup_454_prb[  6].nbits =  8; gv_local.lookup_454_prb[  6].bits = 0xA4000000;
+  gv_local.lookup_454_prb[  7].nbits =  8; gv_local.lookup_454_prb[  7].bits = 0xBA000000;
+  gv_local.lookup_454_prb[  8].nbits =  8; gv_local.lookup_454_prb[  8].bits = 0xA5000000;
+  gv_local.lookup_454_prb[  9].nbits =  8; gv_local.lookup_454_prb[  9].bits = 0xD4000000;
+  gv_local.lookup_454_prb[ 10].nbits =  8; gv_local.lookup_454_prb[ 10].bits = 0xA9000000;
+  gv_local.lookup_454_prb[ 11].nbits =  8; gv_local.lookup_454_prb[ 11].bits = 0xBB000000;
+  gv_local.lookup_454_prb[ 12].nbits =  8; gv_local.lookup_454_prb[ 12].bits = 0xDB000000;
+  gv_local.lookup_454_prb[ 13].nbits =  8; gv_local.lookup_454_prb[ 13].bits = 0xD5000000;
+  gv_local.lookup_454_prb[ 14].nbits =  7; gv_local.lookup_454_prb[ 14].bits = 0x2A000000;
+  gv_local.lookup_454_prb[ 15].nbits =  7; gv_local.lookup_454_prb[ 15].bits = 0xD0000000;
+  gv_local.lookup_454_prb[ 16].nbits =  7; gv_local.lookup_454_prb[ 16].bits = 0xD6000000;
+  gv_local.lookup_454_prb[ 17].nbits =  6; gv_local.lookup_454_prb[ 17].bits = 0xAC000000;
+  gv_local.lookup_454_prb[ 18].nbits =  7; gv_local.lookup_454_prb[ 18].bits = 0xAA000000;
+  gv_local.lookup_454_prb[ 19].nbits =  7; gv_local.lookup_454_prb[ 19].bits = 0xA2000000;
+  gv_local.lookup_454_prb[ 20].nbits =  6; gv_local.lookup_454_prb[ 20].bits = 0x80000000;
+  gv_local.lookup_454_prb[ 21].nbits =  6; gv_local.lookup_454_prb[ 21].bits = 0x84000000;
+  gv_local.lookup_454_prb[ 22].nbits =  6; gv_local.lookup_454_prb[ 22].bits = 0xBC000000;
+  gv_local.lookup_454_prb[ 23].nbits =  5; gv_local.lookup_454_prb[ 23].bits = 0x88000000;
+  gv_local.lookup_454_prb[ 24].nbits =  5; gv_local.lookup_454_prb[ 24].bits = 0xB0000000;
+  gv_local.lookup_454_prb[ 25].nbits =  4; gv_local.lookup_454_prb[ 25].bits = 0x90000000;
+  gv_local.lookup_454_prb[ 26].nbits =  3; gv_local.lookup_454_prb[ 26].bits = 0x00000000;
+  gv_local.lookup_454_prb[ 27].nbits =  2; gv_local.lookup_454_prb[ 27].bits = 0x40000000;
+  gv_local.lookup_454_prb[ 28].nbits =  3; gv_local.lookup_454_prb[ 28].bits = 0xE0000000;
+  gv_local.lookup_454_prb[ 29].nbits =  8; gv_local.lookup_454_prb[ 29].bits = 0xA1000000;
+  gv_local.lookup_454_prb[ 30].nbits =  7; gv_local.lookup_454_prb[ 30].bits = 0xD2000000;
+  gv_local.lookup_454_prb[ 31].nbits =  6; gv_local.lookup_454_prb[ 31].bits = 0x2C000000;
+  gv_local.lookup_454_prb[ 32].nbits =  5; gv_local.lookup_454_prb[ 32].bits = 0x20000000;
+  gv_local.lookup_454_prb[ 33].nbits =  4; gv_local.lookup_454_prb[ 33].bits = 0x30000000;
+  gv_local.lookup_454_prb[ 34].nbits =  4; gv_local.lookup_454_prb[ 34].bits = 0xC0000000;
+  gv_local.lookup_454_prb[ 35].nbits =  7; gv_local.lookup_454_prb[ 35].bits = 0xD8000000;
+  gv_local.lookup_454_prb[ 36].nbits =  7; gv_local.lookup_454_prb[ 36].bits = 0xB8000000;
+  gv_local.lookup_454_prb[ 37].nbits =  6; gv_local.lookup_454_prb[ 37].bits = 0xDC000000;
+  gv_local.lookup_454_prb[ 38].nbits =  7; gv_local.lookup_454_prb[ 38].bits = 0x28000000;
+  gv_local.lookup_454_prb[ 39].nbits =  7; gv_local.lookup_454_prb[ 39].bits = 0xA6000000;
+  gv_local.lookup_454_prb[ 40].nbits = 15; gv_local.lookup_454_prb[ 40].bits = 0xA0000000;
+  gv_local.lookup_454_prb[ 41].nbits = 14; gv_local.lookup_454_prb[ 41].bits = 0xA03C0000;
+  gv_local.lookup_454_prb[ 42].nbits = 16; gv_local.lookup_454_prb[ 42].bits = 0xA0030000;
+  gv_local.lookup_454_prb[ 43].nbits = 16; gv_local.lookup_454_prb[ 43].bits = 0xA0020000;
+  gv_local.lookup_454_prb[ 44].nbits = 16; gv_local.lookup_454_prb[ 44].bits = 0xA0390000;
+  gv_local.lookup_454_prb[ 45].nbits = 16; gv_local.lookup_454_prb[ 45].bits = 0xA0380000;
+  gv_local.lookup_454_prb[ 46].nbits = 16; gv_local.lookup_454_prb[ 46].bits = 0xA03B0000;
+  gv_local.lookup_454_prb[ 47].nbits = 16; gv_local.lookup_454_prb[ 47].bits = 0xA03A0000;
+  gv_local.lookup_454_prb[ 48].nbits = 16; gv_local.lookup_454_prb[ 48].bits = 0xA00D0000;
+  gv_local.lookup_454_prb[ 49].nbits = 16; gv_local.lookup_454_prb[ 49].bits = 0xA00C0000;
+  gv_local.lookup_454_prb[ 50].nbits = 16; gv_local.lookup_454_prb[ 50].bits = 0xA00F0000;
+  gv_local.lookup_454_prb[ 51].nbits = 16; gv_local.lookup_454_prb[ 51].bits = 0xA00E0000;
+  gv_local.lookup_454_prb[ 52].nbits = 16; gv_local.lookup_454_prb[ 52].bits = 0xA0090000;
+  gv_local.lookup_454_prb[ 53].nbits = 16; gv_local.lookup_454_prb[ 53].bits = 0xA0080000;
+  gv_local.lookup_454_prb[ 54].nbits = 16; gv_local.lookup_454_prb[ 54].bits = 0xA00B0000;
+  gv_local.lookup_454_prb[ 55].nbits = 16; gv_local.lookup_454_prb[ 55].bits = 0xA00A0000;
+  gv_local.lookup_454_prb[ 56].nbits = 16; gv_local.lookup_454_prb[ 56].bits = 0xA0250000;
+  gv_local.lookup_454_prb[ 57].nbits = 16; gv_local.lookup_454_prb[ 57].bits = 0xA0240000;
+  gv_local.lookup_454_prb[ 58].nbits = 16; gv_local.lookup_454_prb[ 58].bits = 0xA0270000;
+  gv_local.lookup_454_prb[ 59].nbits = 16; gv_local.lookup_454_prb[ 59].bits = 0xA0260000;
+  gv_local.lookup_454_prb[ 60].nbits = 16; gv_local.lookup_454_prb[ 60].bits = 0xA0210000;
+  gv_local.lookup_454_prb[ 61].nbits = 16; gv_local.lookup_454_prb[ 61].bits = 0xA0200000;
+  gv_local.lookup_454_prb[ 62].nbits = 16; gv_local.lookup_454_prb[ 62].bits = 0xA0230000;
+  gv_local.lookup_454_prb[ 63].nbits = 16; gv_local.lookup_454_prb[ 63].bits = 0xA0220000;
+  gv_local.lookup_454_prb[ 64].nbits = 16; gv_local.lookup_454_prb[ 64].bits = 0xA02D0000;
+  gv_local.lookup_454_prb[ 65].nbits = 16; gv_local.lookup_454_prb[ 65].bits = 0xA02C0000;
+  gv_local.lookup_454_prb[ 66].nbits = 16; gv_local.lookup_454_prb[ 66].bits = 0xA02F0000;
+  gv_local.lookup_454_prb[ 67].nbits = 16; gv_local.lookup_454_prb[ 67].bits = 0xA02E0000;
+  gv_local.lookup_454_prb[ 68].nbits = 16; gv_local.lookup_454_prb[ 68].bits = 0xA0290000;
+  gv_local.lookup_454_prb[ 69].nbits = 16; gv_local.lookup_454_prb[ 69].bits = 0xA0280000;
+  gv_local.lookup_454_prb[ 70].nbits = 16; gv_local.lookup_454_prb[ 70].bits = 0xA02B0000;
+  gv_local.lookup_454_prb[ 71].nbits = 16; gv_local.lookup_454_prb[ 71].bits = 0xA02A0000;
+  gv_local.lookup_454_prb[ 72].nbits = 16; gv_local.lookup_454_prb[ 72].bits = 0xA0150000;
+  gv_local.lookup_454_prb[ 73].nbits = 16; gv_local.lookup_454_prb[ 73].bits = 0xA0140000;
+  gv_local.lookup_454_prb[ 74].nbits = 16; gv_local.lookup_454_prb[ 74].bits = 0xA0170000;
+  gv_local.lookup_454_prb[ 75].nbits = 16; gv_local.lookup_454_prb[ 75].bits = 0xA0160000;
+  gv_local.lookup_454_prb[ 76].nbits = 16; gv_local.lookup_454_prb[ 76].bits = 0xA0110000;
+  gv_local.lookup_454_prb[ 77].nbits = 16; gv_local.lookup_454_prb[ 77].bits = 0xA0100000;
+  gv_local.lookup_454_prb[ 78].nbits = 16; gv_local.lookup_454_prb[ 78].bits = 0xA0130000;
+  gv_local.lookup_454_prb[ 79].nbits = 16; gv_local.lookup_454_prb[ 79].bits = 0xA0120000;
+  gv_local.lookup_454_prb[ 80].nbits = 16; gv_local.lookup_454_prb[ 80].bits = 0xA01D0000;
+  gv_local.lookup_454_prb[ 81].nbits = 16; gv_local.lookup_454_prb[ 81].bits = 0xA01C0000;
+  gv_local.lookup_454_prb[ 82].nbits = 16; gv_local.lookup_454_prb[ 82].bits = 0xA01F0000;
+  gv_local.lookup_454_prb[ 83].nbits = 16; gv_local.lookup_454_prb[ 83].bits = 0xA01E0000;
+  gv_local.lookup_454_prb[ 84].nbits = 16; gv_local.lookup_454_prb[ 84].bits = 0xA0190000;
+  gv_local.lookup_454_prb[ 85].nbits = 16; gv_local.lookup_454_prb[ 85].bits = 0xA0180000;
+  gv_local.lookup_454_prb[ 86].nbits = 16; gv_local.lookup_454_prb[ 86].bits = 0xA01B0000;
+  gv_local.lookup_454_prb[ 87].nbits = 16; gv_local.lookup_454_prb[ 87].bits = 0xA01A0000;
+  gv_local.lookup_454_prb[ 88].nbits = 16; gv_local.lookup_454_prb[ 88].bits = 0xA0350000;
+  gv_local.lookup_454_prb[ 89].nbits = 16; gv_local.lookup_454_prb[ 89].bits = 0xA0340000;
+  gv_local.lookup_454_prb[ 90].nbits = 16; gv_local.lookup_454_prb[ 90].bits = 0xA0370000;
+  gv_local.lookup_454_prb[ 91].nbits = 16; gv_local.lookup_454_prb[ 91].bits = 0xA0360000;
+  gv_local.lookup_454_prb[ 92].nbits = 16; gv_local.lookup_454_prb[ 92].bits = 0xA0310000;
+  gv_local.lookup_454_prb[ 93].nbits = 16; gv_local.lookup_454_prb[ 93].bits = 0xA0300000;
+  gv_local.lookup_454_prb[ 94].nbits = 16; gv_local.lookup_454_prb[ 94].bits = 0xA0330000;
+  gv_local.lookup_454_prb[ 95].nbits = 16; gv_local.lookup_454_prb[ 95].bits = 0xA0320000;
+  gv_local.lookup_454_prb[ 96].nbits = 16; gv_local.lookup_454_prb[ 96].bits = 0xA0050000;
+  gv_local.lookup_454_prb[ 97].nbits = 16; gv_local.lookup_454_prb[ 97].bits = 0xA0040000;
+  gv_local.lookup_454_prb[ 98].nbits = 16; gv_local.lookup_454_prb[ 98].bits = 0xA0070000;
+  gv_local.lookup_454_prb[ 99].nbits = 16; gv_local.lookup_454_prb[ 99].bits = 0xA0060000;
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  /* reverse huffman lookup table
+   */
+  memset (gv_local.rlookup_454_prb, 0, sizeof(uint16_t)*REV_HUFF_TREESIZE_16);
+
+  for (i=0; i<PRB_454_HUFF_TREESIZE; i++)
+  {
+    val = gv_local.lookup_454_prb[i].bits >> 16;
+    gv_local.rlookup_454_prb [val] = (uint16_t) i;
+    for (j=1; j<=(0xFFFF>>gv_local.lookup_454_prb[i].nbits); j++)
+      gv_local.rlookup_454_prb [val+j] = (uint16_t) i;
+  }
+#endif
+  _s_sort_lookup (gv_local.lookup_454_prb, gv_local.idx_454_prb, PRB_454_HUFF_TREESIZE);
+
+  gv_local.lookup_454_prb_initialized = 1;
+}
+/*
+ */
+static void _s_init_sig_454_default (void)
+{
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  int      i, j;
+  uint16_t val;
+#endif
+
+  memset (gv_local.lookup_454_sig, 0, sizeof(SRALookup)*SIG_HUFF_TREESIZE);
+
+  gv_local.lookup_454_sig[  0].nbits =  7; gv_local.lookup_454_sig[  0].bits = 0x8C000000;
+  gv_local.lookup_454_sig[  1].nbits =  8; gv_local.lookup_454_sig[  1].bits = 0x65000000;
+  gv_local.lookup_454_sig[  2].nbits =  8; gv_local.lookup_454_sig[  2].bits = 0xCA000000;
+  gv_local.lookup_454_sig[  3].nbits =  7; gv_local.lookup_454_sig[  3].bits = 0x5A000000;
+  gv_local.lookup_454_sig[  4].nbits =  7; gv_local.lookup_454_sig[  4].bits = 0xBC000000;
+  gv_local.lookup_454_sig[  5].nbits =  6; gv_local.lookup_454_sig[  5].bits = 0x48000000;
+  gv_local.lookup_454_sig[  6].nbits =  6; gv_local.lookup_454_sig[  6].bits = 0x98000000;
+  gv_local.lookup_454_sig[  7].nbits =  6; gv_local.lookup_454_sig[  7].bits = 0xFC000000;
+  gv_local.lookup_454_sig[  8].nbits =  5; gv_local.lookup_454_sig[  8].bits = 0x68000000;
+  gv_local.lookup_454_sig[  9].nbits =  5; gv_local.lookup_454_sig[  9].bits = 0xA8000000;
+  gv_local.lookup_454_sig[ 10].nbits =  5; gv_local.lookup_454_sig[ 10].bits = 0xE0000000;
+  gv_local.lookup_454_sig[ 11].nbits =  4; gv_local.lookup_454_sig[ 11].bits = 0x00000000;
+  gv_local.lookup_454_sig[ 12].nbits =  4; gv_local.lookup_454_sig[ 12].bits = 0x10000000;
+  gv_local.lookup_454_sig[ 13].nbits =  5; gv_local.lookup_454_sig[ 13].bits = 0xE8000000;
+  gv_local.lookup_454_sig[ 14].nbits =  5; gv_local.lookup_454_sig[ 14].bits = 0xC0000000;
+  gv_local.lookup_454_sig[ 15].nbits =  5; gv_local.lookup_454_sig[ 15].bits = 0x78000000;
+  gv_local.lookup_454_sig[ 16].nbits =  5; gv_local.lookup_454_sig[ 16].bits = 0x38000000;
+  gv_local.lookup_454_sig[ 17].nbits =  6; gv_local.lookup_454_sig[ 17].bits = 0xCC000000;
+  gv_local.lookup_454_sig[ 18].nbits =  6; gv_local.lookup_454_sig[ 18].bits = 0x80000000;
+  gv_local.lookup_454_sig[ 19].nbits =  6; gv_local.lookup_454_sig[ 19].bits = 0x4C000000;
+  gv_local.lookup_454_sig[ 20].nbits =  7; gv_local.lookup_454_sig[ 20].bits = 0xDE000000;
+  gv_local.lookup_454_sig[ 21].nbits =  7; gv_local.lookup_454_sig[ 21].bits = 0xB0000000;
+  gv_local.lookup_454_sig[ 22].nbits =  7; gv_local.lookup_454_sig[ 22].bits = 0x76000000;
+  gv_local.lookup_454_sig[ 23].nbits =  7; gv_local.lookup_454_sig[ 23].bits = 0x52000000;
+  gv_local.lookup_454_sig[ 24].nbits =  8; gv_local.lookup_454_sig[ 24].bits = 0xF4000000;
+  gv_local.lookup_454_sig[ 25].nbits =  8; gv_local.lookup_454_sig[ 25].bits = 0xBB000000;
+  gv_local.lookup_454_sig[ 26].nbits =  8; gv_local.lookup_454_sig[ 26].bits = 0x8F000000;
+  gv_local.lookup_454_sig[ 27].nbits =  8; gv_local.lookup_454_sig[ 27].bits = 0x64000000;
+  gv_local.lookup_454_sig[ 28].nbits =  8; gv_local.lookup_454_sig[ 28].bits = 0x31000000;
+  gv_local.lookup_454_sig[ 29].nbits =  9; gv_local.lookup_454_sig[ 29].bits = 0xDD000000;
+  gv_local.lookup_454_sig[ 30].nbits =  9; gv_local.lookup_454_sig[ 30].bits = 0xC8000000;
+  gv_local.lookup_454_sig[ 31].nbits =  9; gv_local.lookup_454_sig[ 31].bits = 0x95000000;
+  gv_local.lookup_454_sig[ 32].nbits =  9; gv_local.lookup_454_sig[ 32].bits = 0x74800000;
+  gv_local.lookup_454_sig[ 33].nbits =  9; gv_local.lookup_454_sig[ 33].bits = 0x57800000;
+  gv_local.lookup_454_sig[ 34].nbits =  9; gv_local.lookup_454_sig[ 34].bits = 0x30000000;
+  gv_local.lookup_454_sig[ 35].nbits = 10; gv_local.lookup_454_sig[ 35].bits = 0xF0C00000;
+  gv_local.lookup_454_sig[ 36].nbits = 10; gv_local.lookup_454_sig[ 36].bits = 0xCB000000;
+  gv_local.lookup_454_sig[ 37].nbits = 10; gv_local.lookup_454_sig[ 37].bits = 0xA5400000;
+  gv_local.lookup_454_sig[ 38].nbits = 10; gv_local.lookup_454_sig[ 38].bits = 0x8E000000;
+  gv_local.lookup_454_sig[ 39].nbits = 10; gv_local.lookup_454_sig[ 39].bits = 0x70C00000;
+  gv_local.lookup_454_sig[ 40].nbits = 10; gv_local.lookup_454_sig[ 40].bits = 0x56400000;
+  gv_local.lookup_454_sig[ 41].nbits = 10; gv_local.lookup_454_sig[ 41].bits = 0x30C00000;
+  gv_local.lookup_454_sig[ 42].nbits = 11; gv_local.lookup_454_sig[ 42].bits = 0xF5400000;
+  gv_local.lookup_454_sig[ 43].nbits = 11; gv_local.lookup_454_sig[ 43].bits = 0xD0600000;
+  gv_local.lookup_454_sig[ 44].nbits = 11; gv_local.lookup_454_sig[ 44].bits = 0xB3800000;
+  gv_local.lookup_454_sig[ 45].nbits = 11; gv_local.lookup_454_sig[ 45].bits = 0x97400000;
+  gv_local.lookup_454_sig[ 46].nbits = 11; gv_local.lookup_454_sig[ 46].bits = 0x86200000;
+  gv_local.lookup_454_sig[ 47].nbits = 11; gv_local.lookup_454_sig[ 47].bits = 0x70600000;
+  gv_local.lookup_454_sig[ 48].nbits = 11; gv_local.lookup_454_sig[ 48].bits = 0x66400000;
+  gv_local.lookup_454_sig[ 49].nbits = 11; gv_local.lookup_454_sig[ 49].bits = 0x5DE00000;
+  gv_local.lookup_454_sig[ 50].nbits = 12; gv_local.lookup_454_sig[ 50].bits = 0xF0000000;
+  gv_local.lookup_454_sig[ 51].nbits = 12; gv_local.lookup_454_sig[ 51].bits = 0x75000000;
+  gv_local.lookup_454_sig[ 52].nbits = 12; gv_local.lookup_454_sig[ 52].bits = 0x74500000;
+  gv_local.lookup_454_sig[ 53].nbits = 12; gv_local.lookup_454_sig[ 53].bits = 0x74200000;
+  gv_local.lookup_454_sig[ 54].nbits = 12; gv_local.lookup_454_sig[ 54].bits = 0x70A00000;
+  gv_local.lookup_454_sig[ 55].nbits = 12; gv_local.lookup_454_sig[ 55].bits = 0x70500000;
+  gv_local.lookup_454_sig[ 56].nbits = 12; gv_local.lookup_454_sig[ 56].bits = 0x66700000;
+  gv_local.lookup_454_sig[ 57].nbits = 12; gv_local.lookup_454_sig[ 57].bits = 0x66100000;
+  gv_local.lookup_454_sig[ 58].nbits = 12; gv_local.lookup_454_sig[ 58].bits = 0x5DB00000;
+  gv_local.lookup_454_sig[ 59].nbits = 12; gv_local.lookup_454_sig[ 59].bits = 0x5D400000;
+  gv_local.lookup_454_sig[ 60].nbits = 12; gv_local.lookup_454_sig[ 60].bits = 0x5D100000;
+  gv_local.lookup_454_sig[ 61].nbits = 12; gv_local.lookup_454_sig[ 61].bits = 0x58600000;
+  gv_local.lookup_454_sig[ 62].nbits = 12; gv_local.lookup_454_sig[ 62].bits = 0x58300000;
+  gv_local.lookup_454_sig[ 63].nbits = 12; gv_local.lookup_454_sig[ 63].bits = 0x58700000;
+  gv_local.lookup_454_sig[ 64].nbits = 12; gv_local.lookup_454_sig[ 64].bits = 0x59800000;
+  gv_local.lookup_454_sig[ 65].nbits = 12; gv_local.lookup_454_sig[ 65].bits = 0x5D900000;
+  gv_local.lookup_454_sig[ 66].nbits = 12; gv_local.lookup_454_sig[ 66].bits = 0x70400000;
+  gv_local.lookup_454_sig[ 67].nbits = 12; gv_local.lookup_454_sig[ 67].bits = 0x84100000;
+  gv_local.lookup_454_sig[ 68].nbits = 12; gv_local.lookup_454_sig[ 68].bits = 0x94C00000;
+  gv_local.lookup_454_sig[ 69].nbits = 12; gv_local.lookup_454_sig[ 69].bits = 0xB3F00000;
+  gv_local.lookup_454_sig[ 70].nbits = 12; gv_local.lookup_454_sig[ 70].bits = 0xDBD00000;
+  gv_local.lookup_454_sig[ 71].nbits = 11; gv_local.lookup_454_sig[ 71].bits = 0x2A400000;
+  gv_local.lookup_454_sig[ 72].nbits = 11; gv_local.lookup_454_sig[ 72].bits = 0x5D600000;
+  gv_local.lookup_454_sig[ 73].nbits = 11; gv_local.lookup_454_sig[ 73].bits = 0x87200000;
+  gv_local.lookup_454_sig[ 74].nbits = 11; gv_local.lookup_454_sig[ 74].bits = 0xB2E00000;
+  gv_local.lookup_454_sig[ 75].nbits = 11; gv_local.lookup_454_sig[ 75].bits = 0xDA400000;
+  gv_local.lookup_454_sig[ 76].nbits = 10; gv_local.lookup_454_sig[ 76].bits = 0x28C00000;
+  gv_local.lookup_454_sig[ 77].nbits = 10; gv_local.lookup_454_sig[ 77].bits = 0x59C00000;
+  gv_local.lookup_454_sig[ 78].nbits = 10; gv_local.lookup_454_sig[ 78].bits = 0x84400000;
+  gv_local.lookup_454_sig[ 79].nbits = 10; gv_local.lookup_454_sig[ 79].bits = 0xB2800000;
+  gv_local.lookup_454_sig[ 80].nbits = 10; gv_local.lookup_454_sig[ 80].bits = 0xDA000000;
+  gv_local.lookup_454_sig[ 81].nbits =  9; gv_local.lookup_454_sig[ 81].bits = 0x28000000;
+  gv_local.lookup_454_sig[ 82].nbits =  9; gv_local.lookup_454_sig[ 82].bits = 0x59000000;
+  gv_local.lookup_454_sig[ 83].nbits =  9; gv_local.lookup_454_sig[ 83].bits = 0x84800000;
+  gv_local.lookup_454_sig[ 84].nbits =  9; gv_local.lookup_454_sig[ 84].bits = 0xA7800000;
+  gv_local.lookup_454_sig[ 85].nbits =  9; gv_local.lookup_454_sig[ 85].bits = 0xDA800000;
+  gv_local.lookup_454_sig[ 86].nbits =  8; gv_local.lookup_454_sig[ 86].bits = 0x29000000;
+  gv_local.lookup_454_sig[ 87].nbits =  8; gv_local.lookup_454_sig[ 87].bits = 0x5C000000;
+  gv_local.lookup_454_sig[ 88].nbits =  8; gv_local.lookup_454_sig[ 88].bits = 0x85000000;
+  gv_local.lookup_454_sig[ 89].nbits =  8; gv_local.lookup_454_sig[ 89].bits = 0xA6000000;
+  gv_local.lookup_454_sig[ 90].nbits =  8; gv_local.lookup_454_sig[ 90].bits = 0xD3000000;
+  gv_local.lookup_454_sig[ 91].nbits =  7; gv_local.lookup_454_sig[ 91].bits = 0x22000000;
+  gv_local.lookup_454_sig[ 92].nbits =  7; gv_local.lookup_454_sig[ 92].bits = 0x54000000;
+  gv_local.lookup_454_sig[ 93].nbits =  7; gv_local.lookup_454_sig[ 93].bits = 0x72000000;
+  gv_local.lookup_454_sig[ 94].nbits =  7; gv_local.lookup_454_sig[ 94].bits = 0x92000000;
+  gv_local.lookup_454_sig[ 95].nbits =  7; gv_local.lookup_454_sig[ 95].bits = 0xB8000000;
+  gv_local.lookup_454_sig[ 96].nbits =  7; gv_local.lookup_454_sig[ 96].bits = 0xD8000000;
+  gv_local.lookup_454_sig[ 97].nbits =  7; gv_local.lookup_454_sig[ 97].bits = 0xF6000000;
+  gv_local.lookup_454_sig[ 98].nbits =  6; gv_local.lookup_454_sig[ 98].bits = 0x2C000000;
+  gv_local.lookup_454_sig[ 99].nbits =  6; gv_local.lookup_454_sig[ 99].bits = 0x44000000;
+  gv_local.lookup_454_sig[100].nbits =  6; gv_local.lookup_454_sig[100].bits = 0xA0000000;
+  gv_local.lookup_454_sig[101].nbits =  6; gv_local.lookup_454_sig[101].bits = 0xF8000000;
+  gv_local.lookup_454_sig[102].nbits =  6; gv_local.lookup_454_sig[102].bits = 0xD4000000;
+  gv_local.lookup_454_sig[103].nbits =  6; gv_local.lookup_454_sig[103].bits = 0xB4000000;
+  gv_local.lookup_454_sig[104].nbits =  6; gv_local.lookup_454_sig[104].bits = 0x9C000000;
+  gv_local.lookup_454_sig[105].nbits =  6; gv_local.lookup_454_sig[105].bits = 0x88000000;
+  gv_local.lookup_454_sig[106].nbits =  6; gv_local.lookup_454_sig[106].bits = 0x60000000;
+  gv_local.lookup_454_sig[107].nbits =  6; gv_local.lookup_454_sig[107].bits = 0x40000000;
+  gv_local.lookup_454_sig[108].nbits =  7; gv_local.lookup_454_sig[108].bits = 0xF2000000;
+  gv_local.lookup_454_sig[109].nbits =  7; gv_local.lookup_454_sig[109].bits = 0xBE000000;
+  gv_local.lookup_454_sig[110].nbits =  7; gv_local.lookup_454_sig[110].bits = 0x90000000;
+  gv_local.lookup_454_sig[111].nbits =  7; gv_local.lookup_454_sig[111].bits = 0x5E000000;
+  gv_local.lookup_454_sig[112].nbits =  7; gv_local.lookup_454_sig[112].bits = 0x26000000;
+  gv_local.lookup_454_sig[113].nbits =  8; gv_local.lookup_454_sig[113].bits = 0xD1000000;
+  gv_local.lookup_454_sig[114].nbits =  8; gv_local.lookup_454_sig[114].bits = 0x96000000;
+  gv_local.lookup_454_sig[115].nbits =  8; gv_local.lookup_454_sig[115].bits = 0x67000000;
+  gv_local.lookup_454_sig[116].nbits =  8; gv_local.lookup_454_sig[116].bits = 0x34000000;
+  gv_local.lookup_454_sig[117].nbits =  9; gv_local.lookup_454_sig[117].bits = 0xDC000000;
+  gv_local.lookup_454_sig[118].nbits =  9; gv_local.lookup_454_sig[118].bits = 0xA5800000;
+  gv_local.lookup_454_sig[119].nbits =  9; gv_local.lookup_454_sig[119].bits = 0x75800000;
+  gv_local.lookup_454_sig[120].nbits =  9; gv_local.lookup_454_sig[120].bits = 0x51000000;
+  gv_local.lookup_454_sig[121].nbits = 10; gv_local.lookup_454_sig[121].bits = 0xF5800000;
+  gv_local.lookup_454_sig[122].nbits = 10; gv_local.lookup_454_sig[122].bits = 0xBA000000;
+  gv_local.lookup_454_sig[123].nbits = 10; gv_local.lookup_454_sig[123].bits = 0x86400000;
+  gv_local.lookup_454_sig[124].nbits = 10; gv_local.lookup_454_sig[124].bits = 0x56000000;
+  gv_local.lookup_454_sig[125].nbits = 11; gv_local.lookup_454_sig[125].bits = 0xF5200000;
+  gv_local.lookup_454_sig[126].nbits = 11; gv_local.lookup_454_sig[126].bits = 0xB3400000;
+  gv_local.lookup_454_sig[127].nbits = 11; gv_local.lookup_454_sig[127].bits = 0x87000000;
+  gv_local.lookup_454_sig[128].nbits = 11; gv_local.lookup_454_sig[128].bits = 0x58400000;
+  gv_local.lookup_454_sig[129].nbits = 11; gv_local.lookup_454_sig[129].bits = 0x2AA00000;
+  gv_local.lookup_454_sig[130].nbits = 12; gv_local.lookup_454_sig[130].bits = 0xF1800000;
+  gv_local.lookup_454_sig[131].nbits = 12; gv_local.lookup_454_sig[131].bits = 0xDBB00000;
+  gv_local.lookup_454_sig[132].nbits = 12; gv_local.lookup_454_sig[132].bits = 0xCBA00000;
+  gv_local.lookup_454_sig[133].nbits = 12; gv_local.lookup_454_sig[133].bits = 0xC9900000;
+  gv_local.lookup_454_sig[134].nbits = 12; gv_local.lookup_454_sig[134].bits = 0xB3700000;
+  gv_local.lookup_454_sig[135].nbits = 12; gv_local.lookup_454_sig[135].bits = 0xA5000000;
+  gv_local.lookup_454_sig[136].nbits = 12; gv_local.lookup_454_sig[136].bits = 0x94500000;
+  gv_local.lookup_454_sig[137].nbits = 12; gv_local.lookup_454_sig[137].bits = 0x8E500000;
+  gv_local.lookup_454_sig[138].nbits = 12; gv_local.lookup_454_sig[138].bits = 0x75700000;
+  gv_local.lookup_454_sig[139].nbits = 12; gv_local.lookup_454_sig[139].bits = 0x70B00000;
+  gv_local.lookup_454_sig[140].nbits = 12; gv_local.lookup_454_sig[140].bits = 0x66D00000;
+  gv_local.lookup_454_sig[141].nbits = 12; gv_local.lookup_454_sig[141].bits = 0x5D300000;
+  gv_local.lookup_454_sig[142].nbits = 12; gv_local.lookup_454_sig[142].bits = 0x51F00000;
+  gv_local.lookup_454_sig[143].nbits = 12; gv_local.lookup_454_sig[143].bits = 0x36B00000;
+  gv_local.lookup_454_sig[144].nbits = 12; gv_local.lookup_454_sig[144].bits = 0x33A00000;
+  gv_local.lookup_454_sig[145].nbits = 12; gv_local.lookup_454_sig[145].bits = 0x2A700000;
+  gv_local.lookup_454_sig[146].nbits = 12; gv_local.lookup_454_sig[146].bits = 0x24D00000;
+  gv_local.lookup_454_sig[147].nbits = 13; gv_local.lookup_454_sig[147].bits = 0xF5D00000;
+  gv_local.lookup_454_sig[148].nbits = 13; gv_local.lookup_454_sig[148].bits = 0xF1980000;
+  gv_local.lookup_454_sig[149].nbits = 13; gv_local.lookup_454_sig[149].bits = 0xF0600000;
+  gv_local.lookup_454_sig[150].nbits = 13; gv_local.lookup_454_sig[150].bits = 0xCB480000;
+  gv_local.lookup_454_sig[151].nbits = 13; gv_local.lookup_454_sig[151].bits = 0xA5300000;
+  gv_local.lookup_454_sig[152].nbits = 13; gv_local.lookup_454_sig[152].bits = 0xA7600000;
+  gv_local.lookup_454_sig[153].nbits = 13; gv_local.lookup_454_sig[153].bits = 0xA7680000;
+  gv_local.lookup_454_sig[154].nbits = 13; gv_local.lookup_454_sig[154].bits = 0xB3600000;
+  gv_local.lookup_454_sig[155].nbits = 13; gv_local.lookup_454_sig[155].bits = 0xA7700000;
+  gv_local.lookup_454_sig[156].nbits = 13; gv_local.lookup_454_sig[156].bits = 0xB3E00000;
+  gv_local.lookup_454_sig[157].nbits = 13; gv_local.lookup_454_sig[157].bits = 0xC9800000;
+  gv_local.lookup_454_sig[158].nbits = 13; gv_local.lookup_454_sig[158].bits = 0xC9E80000;
+  gv_local.lookup_454_sig[159].nbits = 13; gv_local.lookup_454_sig[159].bits = 0xCBB00000;
+  gv_local.lookup_454_sig[160].nbits = 13; gv_local.lookup_454_sig[160].bits = 0xDA680000;
+  gv_local.lookup_454_sig[161].nbits = 13; gv_local.lookup_454_sig[161].bits = 0xF0680000;
+  gv_local.lookup_454_sig[162].nbits = 13; gv_local.lookup_454_sig[162].bits = 0xF5E80000;
+  gv_local.lookup_454_sig[163].nbits = 12; gv_local.lookup_454_sig[163].bits = 0x28B00000;
+  gv_local.lookup_454_sig[164].nbits = 12; gv_local.lookup_454_sig[164].bits = 0x33B00000;
+  gv_local.lookup_454_sig[165].nbits = 12; gv_local.lookup_454_sig[165].bits = 0x51C00000;
+  gv_local.lookup_454_sig[166].nbits = 12; gv_local.lookup_454_sig[166].bits = 0x5DA00000;
+  gv_local.lookup_454_sig[167].nbits = 12; gv_local.lookup_454_sig[167].bits = 0x74600000;
+  gv_local.lookup_454_sig[168].nbits = 12; gv_local.lookup_454_sig[168].bits = 0x94000000;
+  gv_local.lookup_454_sig[169].nbits = 12; gv_local.lookup_454_sig[169].bits = 0x97700000;
+  gv_local.lookup_454_sig[170].nbits = 12; gv_local.lookup_454_sig[170].bits = 0xB3C00000;
+  gv_local.lookup_454_sig[171].nbits = 12; gv_local.lookup_454_sig[171].bits = 0xD0400000;
+  gv_local.lookup_454_sig[172].nbits = 12; gv_local.lookup_454_sig[172].bits = 0xF0200000;
+  gv_local.lookup_454_sig[173].nbits = 11; gv_local.lookup_454_sig[173].bits = 0x24E00000;
+  gv_local.lookup_454_sig[174].nbits = 11; gv_local.lookup_454_sig[174].bits = 0x36C00000;
+  gv_local.lookup_454_sig[175].nbits = 11; gv_local.lookup_454_sig[175].bits = 0x5DC00000;
+  gv_local.lookup_454_sig[176].nbits = 11; gv_local.lookup_454_sig[176].bits = 0x75400000;
+  gv_local.lookup_454_sig[177].nbits = 11; gv_local.lookup_454_sig[177].bits = 0x94A00000;
+  gv_local.lookup_454_sig[178].nbits = 11; gv_local.lookup_454_sig[178].bits = 0xB3200000;
+  gv_local.lookup_454_sig[179].nbits = 11; gv_local.lookup_454_sig[179].bits = 0xD0200000;
+  gv_local.lookup_454_sig[180].nbits = 11; gv_local.lookup_454_sig[180].bits = 0xF5000000;
+  gv_local.lookup_454_sig[181].nbits = 10; gv_local.lookup_454_sig[181].bits = 0x2AC00000;
+  gv_local.lookup_454_sig[182].nbits = 10; gv_local.lookup_454_sig[182].bits = 0x56800000;
+  gv_local.lookup_454_sig[183].nbits = 10; gv_local.lookup_454_sig[183].bits = 0x70000000;
+  gv_local.lookup_454_sig[184].nbits = 10; gv_local.lookup_454_sig[184].bits = 0x87800000;
+  gv_local.lookup_454_sig[185].nbits = 10; gv_local.lookup_454_sig[185].bits = 0xA4400000;
+  gv_local.lookup_454_sig[186].nbits = 10; gv_local.lookup_454_sig[186].bits = 0xC8C00000;
+  gv_local.lookup_454_sig[187].nbits = 10; gv_local.lookup_454_sig[187].bits = 0xDB400000;
+  gv_local.lookup_454_sig[188].nbits =  9; gv_local.lookup_454_sig[188].bits = 0x24000000;
+  gv_local.lookup_454_sig[189].nbits =  9; gv_local.lookup_454_sig[189].bits = 0x36000000;
+  gv_local.lookup_454_sig[190].nbits =  9; gv_local.lookup_454_sig[190].bits = 0x58800000;
+  gv_local.lookup_454_sig[191].nbits =  9; gv_local.lookup_454_sig[191].bits = 0x71000000;
+  gv_local.lookup_454_sig[192].nbits =  9; gv_local.lookup_454_sig[192].bits = 0x86800000;
+  gv_local.lookup_454_sig[193].nbits =  9; gv_local.lookup_454_sig[193].bits = 0x95800000;
+  gv_local.lookup_454_sig[194].nbits =  9; gv_local.lookup_454_sig[194].bits = 0xB2000000;
+  gv_local.lookup_454_sig[195].nbits =  9; gv_local.lookup_454_sig[195].bits = 0xC9000000;
+  gv_local.lookup_454_sig[196].nbits =  9; gv_local.lookup_454_sig[196].bits = 0xD2000000;
+  gv_local.lookup_454_sig[197].nbits =  9; gv_local.lookup_454_sig[197].bits = 0xDC800000;
+  gv_local.lookup_454_sig[198].nbits =  9; gv_local.lookup_454_sig[198].bits = 0xF1000000;
+  gv_local.lookup_454_sig[199].nbits =  8; gv_local.lookup_454_sig[199].bits = 0x20000000;
+  gv_local.lookup_454_sig[200].nbits =  8; gv_local.lookup_454_sig[200].bits = 0x2B000000;
+  gv_local.lookup_454_sig[201].nbits =  8; gv_local.lookup_454_sig[201].bits = 0x37000000;
+  gv_local.lookup_454_sig[202].nbits =  8; gv_local.lookup_454_sig[202].bits = 0x50000000;
+  gv_local.lookup_454_sig[203].nbits =  8; gv_local.lookup_454_sig[203].bits = 0x35000000;
+  gv_local.lookup_454_sig[204].nbits =  8; gv_local.lookup_454_sig[204].bits = 0x32000000;
+  gv_local.lookup_454_sig[205].nbits =  8; gv_local.lookup_454_sig[205].bits = 0x25000000;
+  gv_local.lookup_454_sig[206].nbits =  8; gv_local.lookup_454_sig[206].bits = 0x21000000;
+  gv_local.lookup_454_sig[207].nbits =  9; gv_local.lookup_454_sig[207].bits = 0xDD800000;
+  gv_local.lookup_454_sig[208].nbits =  9; gv_local.lookup_454_sig[208].bits = 0xD0800000;
+  gv_local.lookup_454_sig[209].nbits =  9; gv_local.lookup_454_sig[209].bits = 0xBA800000;
+  gv_local.lookup_454_sig[210].nbits =  9; gv_local.lookup_454_sig[210].bits = 0xA4800000;
+  gv_local.lookup_454_sig[211].nbits =  9; gv_local.lookup_454_sig[211].bits = 0x8E800000;
+  gv_local.lookup_454_sig[212].nbits =  9; gv_local.lookup_454_sig[212].bits = 0x71800000;
+  gv_local.lookup_454_sig[213].nbits =  9; gv_local.lookup_454_sig[213].bits = 0x57000000;
+  gv_local.lookup_454_sig[214].nbits =  9; gv_local.lookup_454_sig[214].bits = 0x33000000;
+  gv_local.lookup_454_sig[215].nbits = 10; gv_local.lookup_454_sig[215].bits = 0xF1C00000;
+  gv_local.lookup_454_sig[216].nbits = 10; gv_local.lookup_454_sig[216].bits = 0xCBC00000;
+  gv_local.lookup_454_sig[217].nbits = 10; gv_local.lookup_454_sig[217].bits = 0xA7000000;
+  gv_local.lookup_454_sig[218].nbits = 10; gv_local.lookup_454_sig[218].bits = 0x87C00000;
+  gv_local.lookup_454_sig[219].nbits = 10; gv_local.lookup_454_sig[219].bits = 0x66800000;
+  gv_local.lookup_454_sig[220].nbits = 10; gv_local.lookup_454_sig[220].bits = 0x51800000;
+  gv_local.lookup_454_sig[221].nbits = 10; gv_local.lookup_454_sig[221].bits = 0x24800000;
+  gv_local.lookup_454_sig[222].nbits = 11; gv_local.lookup_454_sig[222].bits = 0xD2E00000;
+  gv_local.lookup_454_sig[223].nbits = 11; gv_local.lookup_454_sig[223].bits = 0xB3A00000;
+  gv_local.lookup_454_sig[224].nbits = 11; gv_local.lookup_454_sig[224].bits = 0x94600000;
+  gv_local.lookup_454_sig[225].nbits = 11; gv_local.lookup_454_sig[225].bits = 0x74000000;
+  gv_local.lookup_454_sig[226].nbits = 11; gv_local.lookup_454_sig[226].bits = 0x56E00000;
+  gv_local.lookup_454_sig[227].nbits = 11; gv_local.lookup_454_sig[227].bits = 0x2A800000;
+  gv_local.lookup_454_sig[228].nbits = 12; gv_local.lookup_454_sig[228].bits = 0xF0700000;
+  gv_local.lookup_454_sig[229].nbits = 12; gv_local.lookup_454_sig[229].bits = 0xCB800000;
+  gv_local.lookup_454_sig[230].nbits = 12; gv_local.lookup_454_sig[230].bits = 0xA5100000;
+  gv_local.lookup_454_sig[231].nbits = 12; gv_local.lookup_454_sig[231].bits = 0x8E600000;
+  gv_local.lookup_454_sig[232].nbits = 12; gv_local.lookup_454_sig[232].bits = 0x70900000;
+  gv_local.lookup_454_sig[233].nbits = 12; gv_local.lookup_454_sig[233].bits = 0x58200000;
+  gv_local.lookup_454_sig[234].nbits = 12; gv_local.lookup_454_sig[234].bits = 0x30A00000;
+  gv_local.lookup_454_sig[235].nbits = 13; gv_local.lookup_454_sig[235].bits = 0xF5D80000;
+  gv_local.lookup_454_sig[236].nbits = 13; gv_local.lookup_454_sig[236].bits = 0xDA600000;
+  gv_local.lookup_454_sig[237].nbits = 13; gv_local.lookup_454_sig[237].bits = 0xC8980000;
+  gv_local.lookup_454_sig[238].nbits = 13; gv_local.lookup_454_sig[238].bits = 0xA4200000;
+  gv_local.lookup_454_sig[239].nbits = 13; gv_local.lookup_454_sig[239].bits = 0x8E480000;
+  gv_local.lookup_454_sig[240].nbits = 13; gv_local.lookup_454_sig[240].bits = 0x75600000;
+  gv_local.lookup_454_sig[241].nbits = 13; gv_local.lookup_454_sig[241].bits = 0x5D200000;
+  gv_local.lookup_454_sig[242].nbits = 13; gv_local.lookup_454_sig[242].bits = 0x36F00000;
+  gv_local.lookup_454_sig[243].nbits = 13; gv_local.lookup_454_sig[243].bits = 0x30880000;
+  gv_local.lookup_454_sig[244].nbits = 13; gv_local.lookup_454_sig[244].bits = 0x28800000;
+  gv_local.lookup_454_sig[245].nbits = 14; gv_local.lookup_454_sig[245].bits = 0xF5780000;
+  gv_local.lookup_454_sig[246].nbits = 14; gv_local.lookup_454_sig[246].bits = 0xF1900000;
+  gv_local.lookup_454_sig[247].nbits = 14; gv_local.lookup_454_sig[247].bits = 0xDA700000;
+  gv_local.lookup_454_sig[248].nbits = 14; gv_local.lookup_454_sig[248].bits = 0xDA780000;
+  gv_local.lookup_454_sig[249].nbits = 14; gv_local.lookup_454_sig[249].bits = 0xD2C80000;
+  gv_local.lookup_454_sig[250].nbits = 14; gv_local.lookup_454_sig[250].bits = 0xCB9C0000;
+  gv_local.lookup_454_sig[251].nbits = 14; gv_local.lookup_454_sig[251].bits = 0xC8B80000;
+  gv_local.lookup_454_sig[252].nbits = 14; gv_local.lookup_454_sig[252].bits = 0xCB500000;
+  gv_local.lookup_454_sig[253].nbits = 14; gv_local.lookup_454_sig[253].bits = 0xC9E40000;
+  gv_local.lookup_454_sig[254].nbits = 14; gv_local.lookup_454_sig[254].bits = 0xC8BC0000;
+  gv_local.lookup_454_sig[255].nbits = 14; gv_local.lookup_454_sig[255].bits = 0xCB740000;
+  gv_local.lookup_454_sig[256].nbits = 14; gv_local.lookup_454_sig[256].bits = 0xD0540000;
+  gv_local.lookup_454_sig[257].nbits = 14; gv_local.lookup_454_sig[257].bits = 0xD2C40000;
+  gv_local.lookup_454_sig[258].nbits = 14; gv_local.lookup_454_sig[258].bits = 0xDA7C0000;
+  gv_local.lookup_454_sig[259].nbits = 14; gv_local.lookup_454_sig[259].bits = 0xF0380000;
+  gv_local.lookup_454_sig[260].nbits = 14; gv_local.lookup_454_sig[260].bits = 0xF5700000;
+  gv_local.lookup_454_sig[261].nbits = 14; gv_local.lookup_454_sig[261].bits = 0xF5F00000;
+  gv_local.lookup_454_sig[262].nbits = 13; gv_local.lookup_454_sig[262].bits = 0x2A680000;
+  gv_local.lookup_454_sig[263].nbits = 13; gv_local.lookup_454_sig[263].bits = 0x33C00000;
+  gv_local.lookup_454_sig[264].nbits = 13; gv_local.lookup_454_sig[264].bits = 0x36F80000;
+  gv_local.lookup_454_sig[265].nbits = 13; gv_local.lookup_454_sig[265].bits = 0x5D280000;
+  gv_local.lookup_454_sig[266].nbits = 13; gv_local.lookup_454_sig[266].bits = 0x66680000;
+  gv_local.lookup_454_sig[267].nbits = 13; gv_local.lookup_454_sig[267].bits = 0x75100000;
+  gv_local.lookup_454_sig[268].nbits = 13; gv_local.lookup_454_sig[268].bits = 0x86180000;
+  gv_local.lookup_454_sig[269].nbits = 13; gv_local.lookup_454_sig[269].bits = 0x97200000;
+  gv_local.lookup_454_sig[270].nbits = 13; gv_local.lookup_454_sig[270].bits = 0xA7780000;
+  gv_local.lookup_454_sig[271].nbits = 13; gv_local.lookup_454_sig[271].bits = 0xB3E80000;
+  gv_local.lookup_454_sig[272].nbits = 13; gv_local.lookup_454_sig[272].bits = 0xCBB80000;
+  gv_local.lookup_454_sig[273].nbits = 13; gv_local.lookup_454_sig[273].bits = 0xF0100000;
+  gv_local.lookup_454_sig[274].nbits = 13; gv_local.lookup_454_sig[274].bits = 0xF5F80000;
+  gv_local.lookup_454_sig[275].nbits = 12; gv_local.lookup_454_sig[275].bits = 0x30B00000;
+  gv_local.lookup_454_sig[276].nbits = 12; gv_local.lookup_454_sig[276].bits = 0x51E00000;
+  gv_local.lookup_454_sig[277].nbits = 12; gv_local.lookup_454_sig[277].bits = 0x5D800000;
+  gv_local.lookup_454_sig[278].nbits = 12; gv_local.lookup_454_sig[278].bits = 0x74400000;
+  gv_local.lookup_454_sig[279].nbits = 12; gv_local.lookup_454_sig[279].bits = 0x87700000;
+  gv_local.lookup_454_sig[280].nbits = 12; gv_local.lookup_454_sig[280].bits = 0x97600000;
+  gv_local.lookup_454_sig[281].nbits = 12; gv_local.lookup_454_sig[281].bits = 0xB3100000;
+  gv_local.lookup_454_sig[282].nbits = 12; gv_local.lookup_454_sig[282].bits = 0xC9F00000;
+  gv_local.lookup_454_sig[283].nbits = 12; gv_local.lookup_454_sig[283].bits = 0xDBA00000;
+  gv_local.lookup_454_sig[284].nbits = 12; gv_local.lookup_454_sig[284].bits = 0xF5600000;
+  gv_local.lookup_454_sig[285].nbits = 11; gv_local.lookup_454_sig[285].bits = 0x2A200000;
+  gv_local.lookup_454_sig[286].nbits = 11; gv_local.lookup_454_sig[286].bits = 0x33E00000;
+  gv_local.lookup_454_sig[287].nbits = 11; gv_local.lookup_454_sig[287].bits = 0x58000000;
+  gv_local.lookup_454_sig[288].nbits = 11; gv_local.lookup_454_sig[288].bits = 0x66200000;
+  gv_local.lookup_454_sig[289].nbits = 11; gv_local.lookup_454_sig[289].bits = 0x75200000;
+  gv_local.lookup_454_sig[290].nbits = 11; gv_local.lookup_454_sig[290].bits = 0x87400000;
+  gv_local.lookup_454_sig[291].nbits = 11; gv_local.lookup_454_sig[291].bits = 0x94800000;
+  gv_local.lookup_454_sig[292].nbits = 11; gv_local.lookup_454_sig[292].bits = 0xA4000000;
+  gv_local.lookup_454_sig[293].nbits = 11; gv_local.lookup_454_sig[293].bits = 0xA7400000;
+  gv_local.lookup_454_sig[294].nbits = 11; gv_local.lookup_454_sig[294].bits = 0xBA600000;
+  gv_local.lookup_454_sig[295].nbits = 11; gv_local.lookup_454_sig[295].bits = 0xC9A00000;
+  gv_local.lookup_454_sig[296].nbits = 11; gv_local.lookup_454_sig[296].bits = 0xD0000000;
+  gv_local.lookup_454_sig[297].nbits = 11; gv_local.lookup_454_sig[297].bits = 0xD2A00000;
+  gv_local.lookup_454_sig[298].nbits = 11; gv_local.lookup_454_sig[298].bits = 0xDB000000;
+  gv_local.lookup_454_sig[299].nbits = 11; gv_local.lookup_454_sig[299].bits = 0xDB800000;
+  gv_local.lookup_454_sig[300].nbits = 11; gv_local.lookup_454_sig[300].bits = 0xF0400000;
+  gv_local.lookup_454_sig[301].nbits = 11; gv_local.lookup_454_sig[301].bits = 0xF1A00000;
+  gv_local.lookup_454_sig[302].nbits = 11; gv_local.lookup_454_sig[302].bits = 0xF0A00000;
+  gv_local.lookup_454_sig[303].nbits = 11; gv_local.lookup_454_sig[303].bits = 0xF0800000;
+  gv_local.lookup_454_sig[304].nbits = 11; gv_local.lookup_454_sig[304].bits = 0xDBE00000;
+  gv_local.lookup_454_sig[305].nbits = 11; gv_local.lookup_454_sig[305].bits = 0xDB200000;
+  gv_local.lookup_454_sig[306].nbits = 11; gv_local.lookup_454_sig[306].bits = 0xD2800000;
+  gv_local.lookup_454_sig[307].nbits = 11; gv_local.lookup_454_sig[307].bits = 0xC9C00000;
+  gv_local.lookup_454_sig[308].nbits = 11; gv_local.lookup_454_sig[308].bits = 0xBA400000;
+  gv_local.lookup_454_sig[309].nbits = 11; gv_local.lookup_454_sig[309].bits = 0xB2C00000;
+  gv_local.lookup_454_sig[310].nbits = 11; gv_local.lookup_454_sig[310].bits = 0x97000000;
+  gv_local.lookup_454_sig[311].nbits = 11; gv_local.lookup_454_sig[311].bits = 0x94200000;
+  gv_local.lookup_454_sig[312].nbits = 11; gv_local.lookup_454_sig[312].bits = 0x84200000;
+  gv_local.lookup_454_sig[313].nbits = 11; gv_local.lookup_454_sig[313].bits = 0x66E00000;
+  gv_local.lookup_454_sig[314].nbits = 11; gv_local.lookup_454_sig[314].bits = 0x59A00000;
+  gv_local.lookup_454_sig[315].nbits = 11; gv_local.lookup_454_sig[315].bits = 0x36800000;
+  gv_local.lookup_454_sig[316].nbits = 11; gv_local.lookup_454_sig[316].bits = 0x2A000000;
+  gv_local.lookup_454_sig[317].nbits = 12; gv_local.lookup_454_sig[317].bits = 0xF5C00000;
+  gv_local.lookup_454_sig[318].nbits = 12; gv_local.lookup_454_sig[318].bits = 0xD2D00000;
+  gv_local.lookup_454_sig[319].nbits = 12; gv_local.lookup_454_sig[319].bits = 0xC8800000;
+  gv_local.lookup_454_sig[320].nbits = 12; gv_local.lookup_454_sig[320].bits = 0xA4300000;
+  gv_local.lookup_454_sig[321].nbits = 12; gv_local.lookup_454_sig[321].bits = 0x8E700000;
+  gv_local.lookup_454_sig[322].nbits = 12; gv_local.lookup_454_sig[322].bits = 0x74700000;
+  gv_local.lookup_454_sig[323].nbits = 12; gv_local.lookup_454_sig[323].bits = 0x5D000000;
+  gv_local.lookup_454_sig[324].nbits = 12; gv_local.lookup_454_sig[324].bits = 0x33D00000;
+  gv_local.lookup_454_sig[325].nbits = 12; gv_local.lookup_454_sig[325].bits = 0x24C00000;
+  gv_local.lookup_454_sig[326].nbits = 13; gv_local.lookup_454_sig[326].bits = 0xF0300000;
+  gv_local.lookup_454_sig[327].nbits = 13; gv_local.lookup_454_sig[327].bits = 0xCB400000;
+  gv_local.lookup_454_sig[328].nbits = 13; gv_local.lookup_454_sig[328].bits = 0xA5280000;
+  gv_local.lookup_454_sig[329].nbits = 13; gv_local.lookup_454_sig[329].bits = 0x94E80000;
+  gv_local.lookup_454_sig[330].nbits = 13; gv_local.lookup_454_sig[330].bits = 0x84080000;
+  gv_local.lookup_454_sig[331].nbits = 13; gv_local.lookup_454_sig[331].bits = 0x66600000;
+  gv_local.lookup_454_sig[332].nbits = 13; gv_local.lookup_454_sig[332].bits = 0x51D80000;
+  gv_local.lookup_454_sig[333].nbits = 13; gv_local.lookup_454_sig[333].bits = 0x33900000;
+  gv_local.lookup_454_sig[334].nbits = 14; gv_local.lookup_454_sig[334].bits = 0xF5E40000;
+  gv_local.lookup_454_sig[335].nbits = 14; gv_local.lookup_454_sig[335].bits = 0xD2CC0000;
+  gv_local.lookup_454_sig[336].nbits = 14; gv_local.lookup_454_sig[336].bits = 0xC98C0000;
+  gv_local.lookup_454_sig[337].nbits = 14; gv_local.lookup_454_sig[337].bits = 0xB3000000;
+  gv_local.lookup_454_sig[338].nbits = 14; gv_local.lookup_454_sig[338].bits = 0x94F00000;
+  gv_local.lookup_454_sig[339].nbits = 14; gv_local.lookup_454_sig[339].bits = 0x87600000;
+  gv_local.lookup_454_sig[340].nbits = 14; gv_local.lookup_454_sig[340].bits = 0x66080000;
+  gv_local.lookup_454_sig[341].nbits = 14; gv_local.lookup_454_sig[341].bits = 0x66040000;
+  gv_local.lookup_454_sig[342].nbits = 14; gv_local.lookup_454_sig[342].bits = 0x51D40000;
+  gv_local.lookup_454_sig[343].nbits = 14; gv_local.lookup_454_sig[343].bits = 0x33CC0000;
+  gv_local.lookup_454_sig[344].nbits = 14; gv_local.lookup_454_sig[344].bits = 0x28AC0000;
+  gv_local.lookup_454_sig[345].nbits = 14; gv_local.lookup_454_sig[345].bits = 0x28A00000;
+  gv_local.lookup_454_sig[346].nbits = 15; gv_local.lookup_454_sig[346].bits = 0xF03E0000;
+  gv_local.lookup_454_sig[347].nbits = 15; gv_local.lookup_454_sig[347].bits = 0xF1940000;
+  gv_local.lookup_454_sig[348].nbits = 15; gv_local.lookup_454_sig[348].bits = 0xDBCA0000;
+  gv_local.lookup_454_sig[349].nbits = 15; gv_local.lookup_454_sig[349].bits = 0xDBC00000;
+  gv_local.lookup_454_sig[350].nbits = 15; gv_local.lookup_454_sig[350].bits = 0xC9E20000;
+  gv_local.lookup_454_sig[351].nbits = 15; gv_local.lookup_454_sig[351].bits = 0xA42C0000;
+  gv_local.lookup_454_sig[352].nbits = 15; gv_local.lookup_454_sig[352].bits = 0xA42A0000;
+  gv_local.lookup_454_sig[353].nbits = 15; gv_local.lookup_454_sig[353].bits = 0xA53E0000;
+  gv_local.lookup_454_sig[354].nbits = 15; gv_local.lookup_454_sig[354].bits = 0xB3D80000;
+  gv_local.lookup_454_sig[355].nbits = 15; gv_local.lookup_454_sig[355].bits = 0xA53C0000;
+  gv_local.lookup_454_sig[356].nbits = 15; gv_local.lookup_454_sig[356].bits = 0xC8900000;
+  gv_local.lookup_454_sig[357].nbits = 15; gv_local.lookup_454_sig[357].bits = 0xC9880000;
+  gv_local.lookup_454_sig[358].nbits = 15; gv_local.lookup_454_sig[358].bits = 0xC8A80000;
+  gv_local.lookup_454_sig[359].nbits = 15; gv_local.lookup_454_sig[359].bits = 0xCB700000;
+  gv_local.lookup_454_sig[360].nbits = 15; gv_local.lookup_454_sig[360].bits = 0xD2C00000;
+  gv_local.lookup_454_sig[361].nbits = 15; gv_local.lookup_454_sig[361].bits = 0xD2C20000;
+  gv_local.lookup_454_sig[362].nbits = 15; gv_local.lookup_454_sig[362].bits = 0xF01E0000;
+  gv_local.lookup_454_sig[363].nbits = 15; gv_local.lookup_454_sig[363].bits = 0xF01A0000;
+  gv_local.lookup_454_sig[364].nbits = 15; gv_local.lookup_454_sig[364].bits = 0xF5E00000;
+  gv_local.lookup_454_sig[365].nbits = 14; gv_local.lookup_454_sig[365].bits = 0x28A40000;
+  gv_local.lookup_454_sig[366].nbits = 14; gv_local.lookup_454_sig[366].bits = 0x33800000;
+  gv_local.lookup_454_sig[367].nbits = 14; gv_local.lookup_454_sig[367].bits = 0x36EC0000;
+  gv_local.lookup_454_sig[368].nbits = 14; gv_local.lookup_454_sig[368].bits = 0x51D00000;
+  gv_local.lookup_454_sig[369].nbits = 14; gv_local.lookup_454_sig[369].bits = 0x56D40000;
+  gv_local.lookup_454_sig[370].nbits = 14; gv_local.lookup_454_sig[370].bits = 0x5D540000;
+  gv_local.lookup_454_sig[371].nbits = 14; gv_local.lookup_454_sig[371].bits = 0x70840000;
+  gv_local.lookup_454_sig[372].nbits = 14; gv_local.lookup_454_sig[372].bits = 0x86080000;
+  gv_local.lookup_454_sig[373].nbits = 14; gv_local.lookup_454_sig[373].bits = 0x87640000;
+  gv_local.lookup_454_sig[374].nbits = 14; gv_local.lookup_454_sig[374].bits = 0x94180000;
+  gv_local.lookup_454_sig[375].nbits = 14; gv_local.lookup_454_sig[375].bits = 0x972C0000;
+  gv_local.lookup_454_sig[376].nbits = 14; gv_local.lookup_454_sig[376].bits = 0xB3040000;
+  gv_local.lookup_454_sig[377].nbits = 14; gv_local.lookup_454_sig[377].bits = 0xC8940000;
+  gv_local.lookup_454_sig[378].nbits = 14; gv_local.lookup_454_sig[378].bits = 0xCB980000;
+  gv_local.lookup_454_sig[379].nbits = 14; gv_local.lookup_454_sig[379].bits = 0xDA740000;
+  gv_local.lookup_454_sig[380].nbits = 14; gv_local.lookup_454_sig[380].bits = 0xDBC40000;
+  gv_local.lookup_454_sig[381].nbits = 14; gv_local.lookup_454_sig[381].bits = 0xF57C0000;
+  gv_local.lookup_454_sig[382].nbits = 13; gv_local.lookup_454_sig[382].bits = 0x28900000;
+  gv_local.lookup_454_sig[383].nbits = 13; gv_local.lookup_454_sig[383].bits = 0x28880000;
+  gv_local.lookup_454_sig[384].nbits = 13; gv_local.lookup_454_sig[384].bits = 0x30900000;
+  gv_local.lookup_454_sig[385].nbits = 13; gv_local.lookup_454_sig[385].bits = 0x36E00000;
+  gv_local.lookup_454_sig[386].nbits = 13; gv_local.lookup_454_sig[386].bits = 0x56C00000;
+  gv_local.lookup_454_sig[387].nbits = 13; gv_local.lookup_454_sig[387].bits = 0x56D80000;
+  gv_local.lookup_454_sig[388].nbits = 13; gv_local.lookup_454_sig[388].bits = 0x5D580000;
+  gv_local.lookup_454_sig[389].nbits = 13; gv_local.lookup_454_sig[389].bits = 0x66C00000;
+  gv_local.lookup_454_sig[390].nbits = 13; gv_local.lookup_454_sig[390].bits = 0x70880000;
+  gv_local.lookup_454_sig[391].nbits = 13; gv_local.lookup_454_sig[391].bits = 0x75680000;
+  gv_local.lookup_454_sig[392].nbits = 13; gv_local.lookup_454_sig[392].bits = 0x84000000;
+  gv_local.lookup_454_sig[393].nbits = 13; gv_local.lookup_454_sig[393].bits = 0x86100000;
+  gv_local.lookup_454_sig[394].nbits = 13; gv_local.lookup_454_sig[394].bits = 0x8E400000;
+  gv_local.lookup_454_sig[395].nbits = 13; gv_local.lookup_454_sig[395].bits = 0x94400000;
+  gv_local.lookup_454_sig[396].nbits = 13; gv_local.lookup_454_sig[396].bits = 0x94E00000;
+  gv_local.lookup_454_sig[397].nbits = 13; gv_local.lookup_454_sig[397].bits = 0x94F80000;
+  gv_local.lookup_454_sig[398].nbits = 13; gv_local.lookup_454_sig[398].bits = 0x94480000;
+  gv_local.lookup_454_sig[399].nbits = 13; gv_local.lookup_454_sig[399].bits = 0x97300000;
+  gv_local.lookup_454_sig[400].nbits = 13; gv_local.lookup_454_sig[400].bits = 0xB3D00000;
+  gv_local.lookup_454_sig[401].nbits = 13; gv_local.lookup_454_sig[401].bits = 0xD0580000;
+  gv_local.lookup_454_sig[402].nbits = 13; gv_local.lookup_454_sig[402].bits = 0xCB900000;
+  gv_local.lookup_454_sig[403].nbits = 13; gv_local.lookup_454_sig[403].bits = 0xCB680000;
+  gv_local.lookup_454_sig[404].nbits = 13; gv_local.lookup_454_sig[404].bits = 0xCB780000;
+  gv_local.lookup_454_sig[405].nbits = 13; gv_local.lookup_454_sig[405].bits = 0xCB580000;
+  gv_local.lookup_454_sig[406].nbits = 13; gv_local.lookup_454_sig[406].bits = 0xCB600000;
+  gv_local.lookup_454_sig[407].nbits = 13; gv_local.lookup_454_sig[407].bits = 0xC8B00000;
+  gv_local.lookup_454_sig[408].nbits = 13; gv_local.lookup_454_sig[408].bits = 0xC8A00000;
+  gv_local.lookup_454_sig[409].nbits = 13; gv_local.lookup_454_sig[409].bits = 0xB3680000;
+  gv_local.lookup_454_sig[410].nbits = 13; gv_local.lookup_454_sig[410].bits = 0xB3080000;
+  gv_local.lookup_454_sig[411].nbits = 13; gv_local.lookup_454_sig[411].bits = 0xA5200000;
+  gv_local.lookup_454_sig[412].nbits = 13; gv_local.lookup_454_sig[412].bits = 0x97380000;
+  gv_local.lookup_454_sig[413].nbits = 13; gv_local.lookup_454_sig[413].bits = 0x94D80000;
+  gv_local.lookup_454_sig[414].nbits = 13; gv_local.lookup_454_sig[414].bits = 0x94100000;
+  gv_local.lookup_454_sig[415].nbits = 13; gv_local.lookup_454_sig[415].bits = 0x86000000;
+  gv_local.lookup_454_sig[416].nbits = 13; gv_local.lookup_454_sig[416].bits = 0x74380000;
+  gv_local.lookup_454_sig[417].nbits = 13; gv_local.lookup_454_sig[417].bits = 0x66C80000;
+  gv_local.lookup_454_sig[418].nbits = 13; gv_local.lookup_454_sig[418].bits = 0x59980000;
+  gv_local.lookup_454_sig[419].nbits = 13; gv_local.lookup_454_sig[419].bits = 0x56C80000;
+  gv_local.lookup_454_sig[420].nbits = 13; gv_local.lookup_454_sig[420].bits = 0x36A00000;
+  gv_local.lookup_454_sig[421].nbits = 13; gv_local.lookup_454_sig[421].bits = 0x30800000;
+  gv_local.lookup_454_sig[422].nbits = 13; gv_local.lookup_454_sig[422].bits = 0x28980000;
+  gv_local.lookup_454_sig[423].nbits = 14; gv_local.lookup_454_sig[423].bits = 0xF5740000;
+  gv_local.lookup_454_sig[424].nbits = 14; gv_local.lookup_454_sig[424].bits = 0xDBCC0000;
+  gv_local.lookup_454_sig[425].nbits = 14; gv_local.lookup_454_sig[425].bits = 0xCB540000;
+  gv_local.lookup_454_sig[426].nbits = 14; gv_local.lookup_454_sig[426].bits = 0xB3DC0000;
+  gv_local.lookup_454_sig[427].nbits = 14; gv_local.lookup_454_sig[427].bits = 0xA5380000;
+  gv_local.lookup_454_sig[428].nbits = 14; gv_local.lookup_454_sig[428].bits = 0x97280000;
+  gv_local.lookup_454_sig[429].nbits = 14; gv_local.lookup_454_sig[429].bits = 0x876C0000;
+  gv_local.lookup_454_sig[430].nbits = 14; gv_local.lookup_454_sig[430].bits = 0x74340000;
+  gv_local.lookup_454_sig[431].nbits = 14; gv_local.lookup_454_sig[431].bits = 0x74300000;
+  gv_local.lookup_454_sig[432].nbits = 14; gv_local.lookup_454_sig[432].bits = 0x59900000;
+  gv_local.lookup_454_sig[433].nbits = 14; gv_local.lookup_454_sig[433].bits = 0x36A80000;
+  gv_local.lookup_454_sig[434].nbits = 14; gv_local.lookup_454_sig[434].bits = 0x30980000;
+  gv_local.lookup_454_sig[435].nbits = 15; gv_local.lookup_454_sig[435].bits = 0xF5F40000;
+  gv_local.lookup_454_sig[436].nbits = 15; gv_local.lookup_454_sig[436].bits = 0xF03C0000;
+  gv_local.lookup_454_sig[437].nbits = 15; gv_local.lookup_454_sig[437].bits = 0xF0180000;
+  gv_local.lookup_454_sig[438].nbits = 15; gv_local.lookup_454_sig[438].bits = 0xD0500000;
+  gv_local.lookup_454_sig[439].nbits = 15; gv_local.lookup_454_sig[439].bits = 0xC8AA0000;
+  gv_local.lookup_454_sig[440].nbits = 15; gv_local.lookup_454_sig[440].bits = 0xA4280000;
+  gv_local.lookup_454_sig[441].nbits = 15; gv_local.lookup_454_sig[441].bits = 0x94D20000;
+  gv_local.lookup_454_sig[442].nbits = 15; gv_local.lookup_454_sig[442].bits = 0x94D00000;
+  gv_local.lookup_454_sig[443].nbits = 15; gv_local.lookup_454_sig[443].bits = 0x860E0000;
+  gv_local.lookup_454_sig[444].nbits = 15; gv_local.lookup_454_sig[444].bits = 0x751A0000;
+  gv_local.lookup_454_sig[445].nbits = 15; gv_local.lookup_454_sig[445].bits = 0x70820000;
+  gv_local.lookup_454_sig[446].nbits = 15; gv_local.lookup_454_sig[446].bits = 0x660C0000;
+  gv_local.lookup_454_sig[447].nbits = 15; gv_local.lookup_454_sig[447].bits = 0x59940000;
+  gv_local.lookup_454_sig[448].nbits = 15; gv_local.lookup_454_sig[448].bits = 0x56D20000;
+  gv_local.lookup_454_sig[449].nbits = 15; gv_local.lookup_454_sig[449].bits = 0x36E80000;
+  gv_local.lookup_454_sig[450].nbits = 16; gv_local.lookup_454_sig[450].bits = 0xF1970000;
+  gv_local.lookup_454_sig[451].nbits = 16; gv_local.lookup_454_sig[451].bits = 0xD0520000;
+  gv_local.lookup_454_sig[452].nbits = 16; gv_local.lookup_454_sig[452].bits = 0xC8AC0000;
+  gv_local.lookup_454_sig[453].nbits = 16; gv_local.lookup_454_sig[453].bits = 0xC8930000;
+  gv_local.lookup_454_sig[454].nbits = 16; gv_local.lookup_454_sig[454].bits = 0xC9E00000;
+  gv_local.lookup_454_sig[455].nbits = 16; gv_local.lookup_454_sig[455].bits = 0xC98A0000;
+  gv_local.lookup_454_sig[456].nbits = 16; gv_local.lookup_454_sig[456].bits = 0xC8AE0000;
+  gv_local.lookup_454_sig[457].nbits = 16; gv_local.lookup_454_sig[457].bits = 0xC8920000;
+  gv_local.lookup_454_sig[458].nbits = 16; gv_local.lookup_454_sig[458].bits = 0xC8AD0000;
+  gv_local.lookup_454_sig[459].nbits = 16; gv_local.lookup_454_sig[459].bits = 0xC8AF0000;
+  gv_local.lookup_454_sig[460].nbits = 16; gv_local.lookup_454_sig[460].bits = 0xC98B0000;
+  gv_local.lookup_454_sig[461].nbits = 16; gv_local.lookup_454_sig[461].bits = 0xB3DA0000;
+  gv_local.lookup_454_sig[462].nbits = 16; gv_local.lookup_454_sig[462].bits = 0xCB720000;
+  gv_local.lookup_454_sig[463].nbits = 16; gv_local.lookup_454_sig[463].bits = 0xC9E10000;
+  gv_local.lookup_454_sig[464].nbits = 16; gv_local.lookup_454_sig[464].bits = 0xD0530000;
+  gv_local.lookup_454_sig[465].nbits = 16; gv_local.lookup_454_sig[465].bits = 0xB3DB0000;
+  gv_local.lookup_454_sig[466].nbits = 16; gv_local.lookup_454_sig[466].bits = 0xDBC80000;
+  gv_local.lookup_454_sig[467].nbits = 16; gv_local.lookup_454_sig[467].bits = 0xCB730000;
+  gv_local.lookup_454_sig[468].nbits = 16; gv_local.lookup_454_sig[468].bits = 0xDBC90000;
+  gv_local.lookup_454_sig[469].nbits = 16; gv_local.lookup_454_sig[469].bits = 0xF01D0000;
+  gv_local.lookup_454_sig[470].nbits = 16; gv_local.lookup_454_sig[470].bits = 0xF01C0000;
+  gv_local.lookup_454_sig[471].nbits = 16; gv_local.lookup_454_sig[471].bits = 0xF5E20000;
+  gv_local.lookup_454_sig[472].nbits = 16; gv_local.lookup_454_sig[472].bits = 0xF1960000;
+  gv_local.lookup_454_sig[473].nbits = 16; gv_local.lookup_454_sig[473].bits = 0xF5E30000;
+  gv_local.lookup_454_sig[474].nbits = 15; gv_local.lookup_454_sig[474].bits = 0x2A600000;
+  gv_local.lookup_454_sig[475].nbits = 15; gv_local.lookup_454_sig[475].bits = 0x309C0000;
+  gv_local.lookup_454_sig[476].nbits = 15; gv_local.lookup_454_sig[476].bits = 0x309E0000;
+  gv_local.lookup_454_sig[477].nbits = 15; gv_local.lookup_454_sig[477].bits = 0x2A620000;
+  gv_local.lookup_454_sig[478].nbits = 15; gv_local.lookup_454_sig[478].bits = 0x36EA0000;
+  gv_local.lookup_454_sig[479].nbits = 15; gv_local.lookup_454_sig[479].bits = 0x56D00000;
+  gv_local.lookup_454_sig[480].nbits = 15; gv_local.lookup_454_sig[480].bits = 0x59960000;
+  gv_local.lookup_454_sig[481].nbits = 15; gv_local.lookup_454_sig[481].bits = 0x5D520000;
+  gv_local.lookup_454_sig[482].nbits = 15; gv_local.lookup_454_sig[482].bits = 0x5D500000;
+  gv_local.lookup_454_sig[483].nbits = 15; gv_local.lookup_454_sig[483].bits = 0x66000000;
+  gv_local.lookup_454_sig[484].nbits = 15; gv_local.lookup_454_sig[484].bits = 0x66020000;
+  gv_local.lookup_454_sig[485].nbits = 15; gv_local.lookup_454_sig[485].bits = 0x660E0000;
+  gv_local.lookup_454_sig[486].nbits = 15; gv_local.lookup_454_sig[486].bits = 0x75180000;
+  gv_local.lookup_454_sig[487].nbits = 15; gv_local.lookup_454_sig[487].bits = 0x70800000;
+  gv_local.lookup_454_sig[488].nbits = 15; gv_local.lookup_454_sig[488].bits = 0x751C0000;
+  gv_local.lookup_454_sig[489].nbits = 15; gv_local.lookup_454_sig[489].bits = 0x860C0000;
+  gv_local.lookup_454_sig[490].nbits = 15; gv_local.lookup_454_sig[490].bits = 0x751E0000;
+  gv_local.lookup_454_sig[491].nbits = 15; gv_local.lookup_454_sig[491].bits = 0x876A0000;
+  gv_local.lookup_454_sig[492].nbits = 15; gv_local.lookup_454_sig[492].bits = 0x87680000;
+  gv_local.lookup_454_sig[493].nbits = 15; gv_local.lookup_454_sig[493].bits = 0x941C0000;
+  gv_local.lookup_454_sig[494].nbits = 15; gv_local.lookup_454_sig[494].bits = 0x94D60000;
+  gv_local.lookup_454_sig[495].nbits = 15; gv_local.lookup_454_sig[495].bits = 0x941E0000;
+  gv_local.lookup_454_sig[496].nbits = 15; gv_local.lookup_454_sig[496].bits = 0x94F60000;
+  gv_local.lookup_454_sig[497].nbits = 15; gv_local.lookup_454_sig[497].bits = 0x94F40000;
+  gv_local.lookup_454_sig[498].nbits = 15; gv_local.lookup_454_sig[498].bits = 0x94D40000;
+  gv_local.lookup_454_sig[499].nbits = 15; gv_local.lookup_454_sig[499].bits = 0xA42E0000;
+  gv_local.lookup_454_sig[500].nbits = 15; gv_local.lookup_454_sig[500].bits = 0xDBC20000;
+  gv_local.lookup_454_sig[501].nbits = 14; gv_local.lookup_454_sig[501].bits = 0x36AC0000;
+  gv_local.lookup_454_sig[502].nbits = 14; gv_local.lookup_454_sig[502].bits = 0x339C0000;
+  gv_local.lookup_454_sig[503].nbits = 14; gv_local.lookup_454_sig[503].bits = 0x33980000;
+  gv_local.lookup_454_sig[504].nbits = 14; gv_local.lookup_454_sig[504].bits = 0x33C80000;
+  gv_local.lookup_454_sig[505].nbits = 14; gv_local.lookup_454_sig[505].bits = 0x33840000;
+  gv_local.lookup_454_sig[506].nbits = 14; gv_local.lookup_454_sig[506].bits = 0x33880000;
+  gv_local.lookup_454_sig[507].nbits = 14; gv_local.lookup_454_sig[507].bits = 0x2A640000;
+  gv_local.lookup_454_sig[508].nbits = 14; gv_local.lookup_454_sig[508].bits = 0x338C0000;
+  gv_local.lookup_454_sig[509].nbits = 14; gv_local.lookup_454_sig[509].bits = 0x28A80000;
+  gv_local.lookup_454_sig[510].nbits = 15; gv_local.lookup_454_sig[510].bits = 0xF5F60000;
+  gv_local.lookup_454_sig[511].nbits =  9; gv_local.lookup_454_sig[511].bits = 0x97800000;
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  /* reverse huffman lookup table
+   */
+  memset (gv_local.rlookup_454_sig, 0, sizeof(uint16_t)*REV_HUFF_TREESIZE_16);
+
+  for (i=0; i<SIG_HUFF_TREESIZE; i++)
+  {
+    val = gv_local.lookup_454_sig[i].bits >> 16;
+    gv_local.rlookup_454_sig [val] = (uint16_t) i;
+    for (j=1; j<=(0xFFFF>>gv_local.lookup_454_sig[i].nbits); j++)
+      gv_local.rlookup_454_sig [val+j] = (uint16_t) i;
+  }
+#endif
+  _s_sort_lookup (gv_local.lookup_454_sig, gv_local.idx_454_sig, SIG_HUFF_TREESIZE);
+
+  gv_local.lookup_454_sig_initialized = 1;
+}
diff --git a/libs/sraxf/v0-decompress-local.h b/libs/sraxf/v0-decompress-local.h
new file mode 100644
index 0000000..afffcdb
--- /dev/null
+++ b/libs/sraxf/v0-decompress-local.h
@@ -0,0 +1,368 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _SRA_DECOMPRESS_LOCAL_HEADER
+#define _SRA_DECOMPRESS_LOCAL_HEADER
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SRA_DECOMPRESS_USE_REVERSE_LOOKUP 1
+
+#include <assert.h>
+#include <byteswap.h>
+#include <limits.h>
+#include <math.h> 
+/*#include <netinet/in.h>*/
+#include <search.h> 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+/*#include <unistd.h>*/
+#include <zlib.h>
+#include <stdint.h>
+
+#define SIG_HUFF_TREESIZE         512
+#define INT_HUFF_TREESIZE         512
+#define NSE_HUFF_TREESIZE         512
+#define PRB_SLX_HUFF_TREESIZE       7
+#define PRB_SLX_SPAN               81
+#define PRB_SLX_MIN                40
+ 
+#define PRB_454_HUFF_TREESIZE     100
+#define POS_454_HUFF_TREESIZE      64
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+#define REV_HUFF_TREESIZE_16    65536
+#define REV_HUFF_TREESIZE_08      256
+#endif
+
+#define SIG_MID_POINT            (SIG_HUFF_TREESIZE/2-1)
+#define SIG_MAX_POINT            (SIG_HUFF_TREESIZE-1)
+#define INT_MID_POINT            (INT_HUFF_TREESIZE/2-1)
+#define INT_MAX_POINT            (INT_HUFF_TREESIZE-1)
+#define NSE_MID_POINT            (NSE_HUFF_TREESIZE/2-1)
+#define NSE_MAX_POINT            (NSE_HUFF_TREESIZE-1)
+#define PRB_SLX_MAX_POINT        (PRB_SLX_HUFF_TREESIZE-1)
+#define PRB_454_MAX_POINT        (PRB_454_HUFF_TREESIZE-1)
+#define POS_454_MAX_POINT        (POS_454_HUFF_TREESIZE-1) 
+
+#define LOG_MAIN_MULTIPLIER     2048
+#define LOG_SUB_MULTIPLIER       256
+
+#ifndef _UCHAR_DEFINED
+#define _UCHAR_DEFINED
+typedef unsigned char  uchar_t;
+#endif
+
+/* clearing malloc
+ *  NB - in all cases, clearing memory before use
+ *  is unnecessary, since the buffers are allocated
+ *  to exact sizes and completely overwritten.
+ */
+void* sra_zalloc (unsigned int);
+#define sra_zalloc( bytes ) \
+    malloc ( bytes )
+
+/*
+ */
+struct SRALookup;
+struct SRALocal;
+
+typedef struct SRALookup* SRALookup_t;
+typedef struct SRALocal*  SRALocal_t;
+
+/* huffman lookup table
+ */
+typedef struct SRALookup
+{
+  uchar_t   nbits; /* number of bits for an entry */
+  uint32_t  bits;  /* actual bits */
+} SRALookup;
+
+/* local data storage
+ */
+typedef struct SRALocal
+{
+  SRALookup    lookup_slx_sig [SIG_HUFF_TREESIZE];
+  SRALookup    lookup_slx_int [INT_HUFF_TREESIZE];
+  SRALookup    lookup_slx_nse [NSE_HUFF_TREESIZE];
+  SRALookup    lookup_slx_prb [PRB_SLX_HUFF_TREESIZE];
+
+  SRALookup    lookup_454_sig [SIG_HUFF_TREESIZE];
+  SRALookup    lookup_454_prb [PRB_454_HUFF_TREESIZE];
+  SRALookup    lookup_454_pos [POS_454_HUFF_TREESIZE];
+
+  uint16_t     idx_454_sig [SIG_HUFF_TREESIZE];
+  uint16_t     idx_454_prb [PRB_454_HUFF_TREESIZE];
+  uint16_t     idx_454_pos [POS_454_HUFF_TREESIZE];
+
+  uint16_t     idx_slx_sig [SIG_HUFF_TREESIZE];
+  uint16_t     idx_slx_int [INT_HUFF_TREESIZE];
+  uint16_t     idx_slx_nse [NSE_HUFF_TREESIZE];
+  uint16_t     idx_slx_prb [PRB_SLX_HUFF_TREESIZE];
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  uint16_t     rlookup_slx_sig [REV_HUFF_TREESIZE_16];
+  uint16_t     rlookup_slx_int [REV_HUFF_TREESIZE_16];
+  uint16_t     rlookup_slx_nse [REV_HUFF_TREESIZE_16];
+  uchar_t      rlookup_slx_prb [REV_HUFF_TREESIZE_08];
+
+  uint16_t     rlookup_454_sig [REV_HUFF_TREESIZE_16];
+  uint16_t     rlookup_454_prb [REV_HUFF_TREESIZE_16];
+#endif
+
+  /* sequence encoding/decoding tables
+   */
+  uchar_t      conv2to4na [256][4];  /* backward conversion to nucleotides */
+  uchar_t      conv2to4cs [256][4];  /* backward conversion to color space */
+  uchar_t      convqs4to1 [PRB_SLX_SPAN];
+
+  int          lookup_slx_sig_initialized;
+  int          lookup_slx_int_initialized;
+  int          lookup_slx_nse_initialized;
+  int          lookup_slx_prb_initialized;
+
+  int          lookup_454_sig_initialized;
+  int          lookup_454_prb_initialized;
+  int          lookup_454_pos_initialized;
+  int          lookup_454_seq_initialized;
+} SRALocal;
+
+
+/* some useful macros
+ *
+ */
+#define _put_short(data, dst, shift, bitpos) \
+  do { \
+    unsigned int   _shift =*(shift); \
+    unsigned int   _bitpos= (bitpos); \
+    unsigned char* _dst   = (unsigned char*)(dst); \
+    unsigned char  _byte; \
+    if(_bitpos) \
+    { \
+      _byte = (unsigned char)((data) >> 8); \
+      *(_dst+_shift)   |= (_byte >> _bitpos); \
+      *(_dst+_shift+1) |= (_byte << (8-_bitpos)); \
+      _byte = (unsigned char)((data) & 0xFF); \
+      *(_dst+_shift+1) |= (_byte >> _bitpos); \
+      *(_dst+_shift+2) |= (_byte << (8-_bitpos)); \
+    } \
+    else \
+    { \
+      _byte = (unsigned char)((data) >> 8); \
+      *(_dst+_shift)   = _byte; \
+      _byte = (unsigned char)((data) & 0xFF); \
+      *(_dst+_shift+1) = _byte; \
+    } \
+    *(shift)=_shift+2; \
+  } while(0)
+/*      
+ */   
+#define _get_byte(src, shift, bitpos, byte, update) \
+  do { \
+    unsigned int _shift=*(shift); \
+    *(byte) = 0; \
+    if(bitpos) \
+    { \
+      *(byte)  = *((src)+_shift)<<(bitpos); \
+      *(byte) |= *((src)+_shift+1)>>(8-(bitpos)); \
+    } \
+    else *(byte) = *((src)+_shift); \
+    if(update) *(shift)=_shift+1; \
+  } while(0)
+
+/*
+ */
+#define _get_short(src, shift, bitpos, data, update) \
+  do { \
+    unsigned int   _shift=*(shift); \
+    unsigned short _data =0; \
+    if(bitpos) \
+    { \
+      _data  = ((*((src)+_shift)<<(bitpos))<<8); \
+      _data |= ((*((src)+_shift+1)>>(8-(bitpos)))<<8); \
+      _data |= ((*((src)+_shift+1)<<(bitpos))); \
+      _data |= ((*((src)+_shift+2)>>(8-(bitpos)))); \
+    } \
+    else \
+    { \
+      _data  = (*((src)+_shift)<<8); \
+      _data |= (*((src)+_shift+1) & 0xFF); \
+    } \
+    *(data) = _data; \
+    if(update) *(shift)=_shift+2; \
+  } while(0)
+    
+/*
+ */
+#if _DEBUGGING
+#define _get_long(src, nbits, shift, bitpos, ldata, update, max_bits)	\
+    do {								\
+        unsigned int   _shift =*(shift);				\
+        unsigned int   _bitpos=*(bitpos);				\
+        unsigned char* _src=(unsigned char*)(src);                      \
+        uint32_t _l = 0;						\
+        int _bits_done = 0;						\
+        int _nbits = nbits;						\
+                                                                        \
+        if (_bitpos + _nbits + (_shift << 3) > max_bits) {              \
+            fprintf(stderr, "legacy code trying to read %u bits beyond end of data at %s, line %d.\n", _bitpos + _nbits + (_shift << 3) - max_bits, __FILE__, __LINE__); \
+            _nbits = max_bits - (_bitpos + (_shift << 3));              \
+        }                                                               \
+        while (_nbits > 0) {                                            \
+            unsigned _bits;						\
+            int _bitsl;                                                 \
+                                                                        \
+            _bits = _src[_shift];					\
+            _bitsl = 8;                                                 \
+                                                                        \
+            if (_bitpos) {                                              \
+                _bits &= 0xFFu >> _bitpos;                              \
+                _bitsl = 8 - _bitpos;                                   \
+            }                                                           \
+                                                                        \
+            if (_bitsl > _nbits) {                                      \
+                _bits >>= _bitsl - _nbits;                              \
+                _bitsl = _nbits;                                        \
+            }                                                           \
+                                                                        \
+            _bitpos += _bitsl;                                          \
+                                                                        \
+            if (_bitpos == 8) {                                         \
+                _bitpos = 0;                                            \
+                _shift++;                                               \
+            }                                                           \
+                                                                        \
+            _l |= _bits << (32 - (_bits_done + _bitsl));		\
+                                                                        \
+            _bits_done += _bitsl;					\
+                                                                        \
+            _nbits -= _bitsl;                                           \
+        }								\
+                                                                        \
+        *ldata = _l;                                                    \
+                                                                        \
+        if(update) {                                                    \
+            *(shift) =_shift;                                           \
+            *(bitpos)=_bitpos;                                          \
+        }								\
+    } while(0)
+#else
+#define _get_long(src, nbits, shift, bitpos, ldata, update, max_bits)	\
+    do {								\
+        unsigned int   _shift =*(shift);				\
+        unsigned int   _bitpos=*(bitpos);				\
+        unsigned char* _src=(unsigned char*)(src);                      \
+        uint32_t _l = 0;						\
+        int _bits_done = 0;						\
+        int _nbits = nbits;						\
+                                                                        \
+        if (_bitpos + _nbits + (_shift << 3) > max_bits) {              \
+            _nbits = max_bits - (_bitpos + (_shift << 3));              \
+        }                                                               \
+        while (_nbits > 0) {                                            \
+            unsigned _bits;						\
+            int _bitsl;                                                 \
+                                                                        \
+            _bits = _src[_shift];					\
+            _bitsl = 8;                                                 \
+                                                                        \
+            if (_bitpos) {                                              \
+                _bits &= 0xFFu >> _bitpos;                              \
+                _bitsl = 8 - _bitpos;                                   \
+            }                                                           \
+                                                                        \
+            if (_bitsl > _nbits) {                                      \
+                _bits >>= _bitsl - _nbits;                              \
+                _bitsl = _nbits;                                        \
+            }                                                           \
+                                                                        \
+            _bitpos += _bitsl;                                          \
+                                                                        \
+            if (_bitpos == 8) {                                         \
+                _bitpos = 0;                                            \
+                _shift++;                                               \
+            }                                                           \
+                                                                        \
+            _l |= _bits << (32 - (_bits_done + _bitsl));		\
+                                                                        \
+            _bits_done += _bitsl;					\
+                                                                        \
+            _nbits -= _bitsl;                                           \
+        }								\
+                                                                        \
+        *ldata = _l;                                                    \
+                                                                        \
+        if(update) {                                                    \
+            *(shift) =_shift;                                           \
+            *(bitpos)=_bitpos;                                          \
+        }								\
+    } while(0)
+#endif
+
+/* various rotation routines
+ */
+#define _rotate_1(type,array) \
+  do { \
+    type* _ptr = (type*)(array); \
+    type  _val = *(_ptr+0); \
+    *(_ptr+0) = *(_ptr+1); *(_ptr+1) = *(_ptr+2); \
+    *(_ptr+2) = *(_ptr+3); *(_ptr+3) = _val; \
+  } while(0)
+/*
+ */
+#define _rotate_2(type,array) \
+  do { \
+    type* _ptr = (type*)(array); \
+    type  _val = *(_ptr+0); \
+    *(_ptr+0) = *(_ptr+2); *(_ptr+2) = _val; \
+    _val = *(_ptr+1); \
+    *(_ptr+1) = *(_ptr+3); *(_ptr+3) = _val; \
+  } while(0)
+/*
+ */
+#define _rotate_3(type,array) \
+  do { \
+    type* _ptr = (type*)(array); \
+    type  _val = *(_ptr+3); \
+    *(_ptr+3) = *(_ptr+2); *(_ptr+2) = *(_ptr+1); \
+    *(_ptr+1) = *(_ptr+0); *(_ptr+0) = _val; \
+  } while(0)
+
+/*
+ */
+#define _cmpbits(src1, src2, size, result) \
+  do { \
+    unsigned int _mask=0xFFFFFFFFL<<(32-(size)); \
+    if (((unsigned int)(src1)&_mask)^((unsigned int)(src2)&_mask)) *(result)=0; else *(result)=1; \
+  } while(0)
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libs/sraxf/v0-decompress.c b/libs/sraxf/v0-decompress.c
new file mode 100644
index 0000000..ae83758
--- /dev/null
+++ b/libs/sraxf/v0-decompress.c
@@ -0,0 +1,1093 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include "v0-decompress.h"
+#include "v0-decompress-local.h"
+#include <klib/data-buffer.h>
+#include <klib/sort.h>
+#include <sysalloc.h>
+
+#include <math.h>
+
+/* local data
+ */
+SRALocal     gv_local;
+
+static
+void *sra_alloc ( KDataBuffer *dst, KDataBuffer *alt, size_t bytes )
+{
+    rc_t rc;
+
+    /* whatever was in dst, put it in alt */
+    KDataBufferWhack ( alt );
+#if 0
+    *alt = *dst;
+#else
+    KDataBufferSub ( dst, alt, 0, UINT64_MAX );
+    KDataBufferWhack(dst);
+#endif
+
+    /* allocate a new space */
+    rc = (uint32_t)KDataBufferMakeBytes ( dst, (uint32_t)bytes );
+    if ( rc != 0 )
+        return NULL;
+
+#if 1
+#define BZERO_SIZE 256
+    if (bytes > BZERO_SIZE)
+        memset(&((char *)dst->base)[bytes-BZERO_SIZE], 0, BZERO_SIZE);
+    else
+        memset(dst->base, 0, bytes);
+#undef BZERO_SIZE
+#endif
+    
+    /* return a pointer to it just like malloc */
+    return dst -> base;
+}
+
+/*
+ */
+static void _s_undelta_4_channel (int slen, int tlen, void* src, int ssize)
+{
+  int     i, j;
+  char*   cptr = (char*)src;
+  short*  sptr = (short*)src;
+  int*    iptr = (int*)src;
+
+  assert (tlen);
+  assert ((ssize&3) == 0); /* make sure we have all 4 channels in it */
+
+  for (i=0, j=0; i<ssize/tlen; i+=4, j++)
+  {
+    /* after each slen the actual data is stored as is,
+     * this shift happens at the begining as well
+     */
+    if (j%slen == 0) { i += 4; j++; }
+
+    switch (tlen)
+    {
+      case 4: *(iptr+i+0) += *(iptr+i-4);
+              *(iptr+i+1) += *(iptr+i-3);
+              *(iptr+i+2) += *(iptr+i-2);
+              *(iptr+i+3) += *(iptr+i-1);
+              break;
+
+      case 2: *(sptr+i+0) += *(sptr+i-4);
+              *(sptr+i+1) += *(sptr+i-3);
+              *(sptr+i+2) += *(sptr+i-2);
+              *(sptr+i+3) += *(sptr+i-1);
+              break;
+
+      default:
+      case 1: *(cptr+i+0) += *(cptr+i-4);
+              *(cptr+i+1) += *(cptr+i-3);
+              *(cptr+i+2) += *(cptr+i-2);
+              *(cptr+i+3) += *(cptr+i-1);
+              break;
+    }
+  }
+}
+
+/*
+ */
+static void _s_exponent_4_channel (int slen, void* dst, int dsize, const void* src, int ssize, float sim, float snm)
+{
+  int     i;
+  float*  fptr = (float*)dst;
+  short*  sptr = (short*)src;
+
+  assert ((ssize&3) == 0); /* make sure we have all 4 channels in it */
+  assert (ssize*2 == dsize);
+
+  for (i=0; i<ssize>>1; i+=4) /* the source buffer is full of short values, therefore ssize>>1 */
+  {
+    *(fptr+i+0) = expf ((float)*(sptr+i+0)/LOG_MAIN_MULTIPLIER)/10 + sim;
+    *(fptr+i+1) = expf ((float)*(sptr+i+1)/LOG_SUB_MULTIPLIER )/10 + snm;
+    *(fptr+i+2) = expf ((float)*(sptr+i+2)/LOG_SUB_MULTIPLIER )/10 + snm;
+    *(fptr+i+3) = expf ((float)*(sptr+i+3)/LOG_SUB_MULTIPLIER )/10 + snm;
+  }
+}
+
+/*
+ */
+static int _s_decompress_zlib ( void* dst, const void* src, int dsize, int ssize )
+{
+    z_stream c_stream; /* decompression stream */
+    
+    memset( &c_stream, 0, sizeof( c_stream ) );
+    c_stream.next_in   = ( Bytef* )src;
+    c_stream.next_out  = ( Bytef* )dst;
+    c_stream.avail_in  = ( uInt )ssize;
+    c_stream.avail_out = ( uInt )dsize;
+    
+    if ( Z_OK != inflateInit ( &c_stream ) )
+    {
+        inflateEnd ( &c_stream );
+        return 1; 
+    }
+    
+    if ( Z_STREAM_END != inflate ( &c_stream, Z_FINISH ) &&
+         Z_OK != inflateSync( &c_stream ) )
+    {
+        inflateEnd ( &c_stream );
+        return 1; 
+    }
+    
+    if ( Z_OK != inflateEnd ( &c_stream ) )
+    {
+        return 1;
+    }
+    
+    return 0;
+}
+
+/*
+ */
+static int64_t CC _s_cmp_key (const void* keyptr, const void* idxptr, void *data)
+{
+  SRALookup_t plook = data;
+  static uint32_t mask [33] = {0x00000000, 0x80000000, 0xC0000000, 0xE0000000,
+                               0xF0000000, 0xF8000000, 0xFC000000, 0xFE000000,
+                               0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000,
+                               0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000,
+                               0xFFFF0000, 0xFFFF8000, 0xFFFFC000, 0xFFFFE000,
+                               0xFFFFF000, 0xFFFFF800, 0xFFFFFC00, 0xFFFFFE00,
+                               0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0, 0xFFFFFFE0,
+                               0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE,
+                               0xFFFFFFFF};
+
+  uint16_t   index      = *(uint16_t*)idxptr;
+  uint32_t   keyBits    = *(uint32_t*)keyptr & mask[plook[index].nbits];
+  uint32_t   lookupBits = plook[index].bits;
+
+  return (int64_t)keyBits - (int64_t)lookupBits;
+}
+
+/*
+ * decompresses positions for 454 platform, and restores their actual values
+ *
+ */
+int sra_decompress_pos ( KDataBuffer *dst, KDataBuffer *alt, const void* src, int ssize )
+{
+  uchar_t        magic;              /* compression type magic */
+  const uchar_t* pepos;              /* ptr to encoded positions */
+  uchar_t*       popos;              /* ptr to output positions */
+  uint16_t*      pspos;              /* ptr to short values after restoration */
+  uchar_t*       iptr;               /* ptr to index in lookup table */
+  uchar_t        indx;               /* actual index */
+  uint16_t       offset, shift, osize, pos, rbpos, nbits, i;
+  uint32_t       lval;               /* _get_long reads into it */
+
+  assert (gv_local.lookup_454_pos_initialized);
+
+  rbpos  = 0;
+  offset = 0;
+  pepos  = src;
+
+  /* get magic and size of data
+   */
+  _get_byte  (pepos, &offset, rbpos, &magic, 1);
+  _get_short (pepos, &offset, rbpos, &osize, 1);
+
+  assert (magic == SRA_CT_ZLIB || magic == SRA_CT_HUFFMAN);
+
+  /* decompress zlib
+   */
+  if (magic == SRA_CT_ZLIB) /* it is always applied on top of huffman */
+  {
+    shift = 3; /* magic + length */
+    popos = sra_alloc ( dst, alt, osize + 100 ); /* generosity */
+
+    if (_s_decompress_zlib(popos, pepos+shift, (int)osize + 100, ssize-shift))
+      return 1;
+
+    rbpos  = 0; /* read bit position */
+    offset = 0;
+    ssize  = osize;
+    pepos  = popos;
+    _get_byte  (pepos, &offset, rbpos, &magic, 1);
+    _get_short (pepos, &offset, rbpos, &osize, 1);
+    assert (magic == SRA_CT_HUFFMAN);
+    magic = SRA_CT_ZLIB; /* to make sure an extra allocated buffer will be destroyed */
+  }
+
+  popos = sra_alloc (dst, alt, osize );
+
+
+  /* decompress huffman
+   */
+  pos = 0;
+  while (pos < osize)
+  {
+    if (ssize-offset > 4) nbits = 32;
+    else                  nbits = ((ssize-offset)==4?32:((ssize-offset)==3?24:((ssize-offset)==2?16:8)))-rbpos;
+
+    _get_long ( pepos, nbits, &offset, &rbpos, &lval, 0, (ssize << 3) );
+
+    iptr = (uchar_t*) kbsearch ( &lval, gv_local.idx_454_pos,
+                                 POS_454_HUFF_TREESIZE, sizeof(uint16_t), _s_cmp_key, gv_local.lookup_454_pos );
+    assert (iptr);
+    indx = *iptr;
+
+    offset += ((rbpos+(uint16_t)gv_local.lookup_454_pos[indx].nbits) >> 3);
+    rbpos   = ((rbpos+(uint16_t)gv_local.lookup_454_pos[indx].nbits) &  7);
+
+    if (indx < POS_454_MAX_POINT)
+      *(popos+pos) = indx;
+    else
+    {
+      uchar_t val;
+      _get_byte (pepos, &offset, rbpos, &val, 1);
+      *(popos+pos) = val;
+    }
+    pos++;
+  }
+
+  /* undelta
+   */
+  pspos = sra_alloc ( dst, alt, (osize*sizeof(uint16_t)+3)&~3); /** align to 4-byte **/
+  assert (pspos);
+
+  *(pspos+0) = *(popos+0);
+  for (i=1; i<osize; i++)
+    *(pspos+i) = *(pspos+i-1) + *(popos+i);
+
+  /* set element size to 16 bits */
+  KDataBufferCast ( dst, dst, 16, true );
+
+  /* crop size to osize */
+  assert ( osize <= dst -> elem_count );
+  KDataBufferResize ( dst, osize );
+
+  return 0;
+}
+
+
+int sra_decompress_prb_454 ( KDataBuffer *dst, KDataBuffer *alt, const void* src, int ssize )
+{
+  uchar_t        magic;
+  const uchar_t* peprb;
+  uchar_t*       poprb;
+#if !SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  uint16_t*      iptr;
+#endif
+  uint16_t       offset, shift, osize, pos, rbpos, nbits;
+  uchar_t        indx;
+  uint32_t       lval;
+
+  assert (gv_local.lookup_454_prb_initialized);
+
+  rbpos  = 0; /* read bit position */
+  offset = 0;
+  peprb  = src;
+
+  /* get magic and size of data
+   */
+  _get_byte  (peprb, &offset, rbpos, &magic, 1);
+  _get_short (peprb, &offset, rbpos, &osize, 1);
+
+  assert (magic == SRA_CT_ZLIB || magic == SRA_CT_HUFFMAN);
+
+  /* decompress zlib
+   */
+  if (magic == SRA_CT_ZLIB)
+  {
+    shift = 3; /* magic + length */
+/****  HACK: in some runs osize was truncated/corrupted????  Giving it some more space *****/
+    poprb = sra_alloc ( dst, alt, osize+200 );
+
+    if (_s_decompress_zlib(poprb, peprb+shift, (int)osize + 200, ssize-shift))
+      return 1;
+
+    rbpos  = 0; /* read bit position */
+    offset = 0;
+    ssize  = osize;
+    peprb  = poprb;
+    _get_byte  (peprb, &offset, rbpos, &magic, 1);
+    _get_short (peprb, &offset, rbpos, &osize, 1);
+    assert (magic == SRA_CT_HUFFMAN);
+  }
+
+  poprb = sra_alloc (dst, alt, (osize+3)&~3); /** align to 4-byte boundary **/
+
+
+  /* decompress huffman
+   */
+  pos = 0;
+  while (pos < osize)
+  {
+    if (ssize-offset > 4) nbits = 32;
+    else                  nbits = ((ssize-offset)==4?32:((ssize-offset)==3?24:((ssize-offset)==2?16:8)))-rbpos;
+
+    if ((offset > (uint32_t)ssize) || (nbits == 0))
+      return 1;
+
+    _get_long (peprb, nbits, &offset, &rbpos, &lval, 0, (ssize << 3));
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+    indx = gv_local.rlookup_454_prb [lval>>16];
+#else
+    iptr = (uint16_t*) kbsearch (&lval, gv_local.idx_454_prb,
+                                PRB_454_HUFF_TREESIZE, sizeof(uint16_t), _s_cmp_key, gv_local.lookup_454_prb);
+    assert (iptr);
+    indx = *iptr;
+#endif
+
+    offset += ((rbpos+(uint16_t)gv_local.lookup_454_prb[indx].nbits) >> 3);
+    rbpos   = ((rbpos+(uint16_t)gv_local.lookup_454_prb[indx].nbits) &  7);
+
+    if (indx < PRB_454_MAX_POINT)
+      *(poprb+pos) = indx;
+    else
+    {
+      uchar_t val;
+      _get_byte (peprb, &offset, rbpos, &val, 1);
+      *(poprb+pos) = val;
+    }
+    pos++;
+  }
+
+  /* crop size to osize */
+  assert ( osize <= dst -> elem_count );
+  KDataBufferResize ( dst, osize );
+
+  return 0;
+}
+
+int sra_decompress_clp  ( KDataBuffer *dst, KDataBuffer *alt, const void* src, int ssize )
+{
+  uchar_t        magic;
+  const uchar_t* peclp;
+  uchar_t*       poclp;
+  uint32_t       osize, offset;
+  uint16_t       rbpos, shift;
+
+  rbpos  = 0;
+  offset = 0;
+  peclp  = src;
+
+  /* get magic and size of data
+   */
+  _get_byte  (peclp,     &offset,  rbpos, &magic, 1);
+  _get_long  (peclp, 32, &offset, &rbpos, &osize, 1, (ssize << 3));
+
+  assert (magic == SRA_CT_ZLIB);
+
+  shift = 5; /* magic + length */
+  poclp = sra_alloc ( dst, alt, osize + 100 );
+
+  if (_s_decompress_zlib(poclp, peclp+shift, (int)osize + 100, ssize-shift))
+    return 1;
+
+  /* crop size to osize */
+  assert ( osize <= dst -> elem_count );
+  KDataBufferResize ( dst, osize );
+
+  return 0;
+}
+
+int sra_decompress_sig_454 ( KDataBuffer *dst, KDataBuffer *alt, const void* src, int ssize )
+{
+  uchar_t        magic;
+  const uchar_t* pesig;
+  uchar_t*       posig;
+#if !SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  uint16_t*      iptr;
+#endif
+  uint16_t       offset, shift, osize, pos, rbpos, wbpos, indx, nbits;
+  uint32_t       lval;
+
+  assert (gv_local.lookup_454_sig_initialized);
+
+  rbpos  = 0;
+  offset = 0;
+  pesig  = src;
+
+  /* get magic and size of data
+   */
+  _get_byte  (pesig, &offset, rbpos, &magic, 1);
+  _get_short (pesig, &offset, rbpos, &osize, 1);
+
+  assert (magic == SRA_CT_ZLIB || magic == SRA_CT_HUFFMAN);
+
+  /* decompress zlib
+   */
+  if (magic == SRA_CT_ZLIB)
+  {
+    shift = 3; /* magic + length */
+    posig = sra_alloc ( dst, alt, osize + 100 );
+
+    if (_s_decompress_zlib(posig, pesig+shift, (int)osize + 100, ssize-shift))
+      return 1;
+
+    rbpos  = 0; /* read bit position */
+    offset = 0;
+    ssize  = osize;
+    pesig  = posig;
+    _get_byte  (pesig, &offset, rbpos, &magic, 1);
+    _get_short (pesig, &offset, rbpos, &osize, 1);
+    assert (magic == SRA_CT_HUFFMAN);
+  }
+ 
+  posig = sra_alloc ( dst, alt, osize );
+
+  /* decompress huffman
+   */
+  pos   = 0;
+  wbpos = 0; /* write bit position */
+  while (pos < osize)
+  {
+    if (ssize-offset > 4) nbits = 32;
+    else                  nbits = ((ssize-offset)==4?32:((ssize-offset)==3?24:((ssize-offset)==2?16:8)))-rbpos;
+
+    _get_long (pesig, nbits, &offset, &rbpos, &lval, 0, (ssize << 3));
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+    indx = gv_local.rlookup_454_sig [lval>>16];
+#else
+    iptr = (uint16_t*) kbsearch (&lval, gv_local.idx_454_sig,
+                                SIG_HUFF_TREESIZE, sizeof(uint16_t), _s_cmp_key, gv_local.lookup_454_sig);
+    assert (iptr);
+    indx = *iptr;
+#endif
+
+    offset += ((rbpos+(uint16_t)gv_local.lookup_454_sig[indx].nbits) >> 3);
+    rbpos   = ((rbpos+(uint16_t)gv_local.lookup_454_sig[indx].nbits) &  7);
+
+    if (indx < SIG_MAX_POINT)
+    {
+      indx = bswap_16 (indx);
+      _put_short (indx, posig, &pos, wbpos);
+    }
+    else
+    {
+      uint16_t val;
+      if ((int)nbits - (int)gv_local.lookup_454_sig[indx].nbits >= 16)
+      {
+        val = (uint16_t)((lval >> (16-gv_local.lookup_454_sig[indx].nbits)) & 0xFFFF);
+        offset += 2;
+      }
+      else
+        _get_short (pesig, &offset, rbpos, &val, 1);
+
+      val = bswap_16 (val);
+      _put_short (val, posig, &pos, wbpos);
+    }
+  }
+
+  /* crop size to osize */
+  assert ( osize <= dst -> elem_count );
+  KDataBufferResize ( dst, osize );
+
+  return 0;
+}
+
+int sra_decompress_prb_slx ( KDataBuffer *dst, KDataBuffer *alt, const void* src, int ssize )
+{
+  uchar_t        magic;
+  char           byte;
+  char           qmin, qmax;
+  const uchar_t* peprb;
+  uchar_t*       poprb;
+  uint32_t       osize, offset, rbpos, pos;
+  uint16_t       fix_seq_len, shift;
+
+  assert (gv_local.lookup_slx_prb_initialized);
+
+  rbpos  = 0;
+  offset = 0;
+  peprb  = src;
+
+  /* get magic and size of data
+   */
+  _get_byte  (peprb,     &offset,  rbpos, &magic, 1);
+  _get_long  (peprb, 32, &offset, &rbpos, &osize, 1, (ssize << 3));
+    
+  assert (magic == SRA_CT_ZLIB || magic == SRA_CT_HUFFMAN || magic == SRA_CT_UNCOMPRESSED);
+
+  /* decompress zlib
+   */
+  if (magic == SRA_CT_ZLIB)
+  {
+    shift = 5; /* magic + length */
+    poprb = sra_alloc ( dst, alt, osize + 100);
+    if (_s_decompress_zlib(poprb, peprb+shift, (int)osize + 100, ssize-shift))
+      return 1;
+
+    rbpos  = 0;
+    offset = 0;
+    ssize  = osize;
+    peprb  = poprb;
+    _get_byte  (peprb,     &offset,  rbpos, &magic, 1);
+    _get_long  (peprb, 32, &offset, &rbpos, &osize, 1, (ssize << 3));
+
+    assert (magic == SRA_CT_HUFFMAN || magic == SRA_CT_UNCOMPRESSED);
+  }
+    
+  _get_byte  (peprb, &offset,  rbpos, &qmin,        1);
+  _get_byte  (peprb, &offset,  rbpos, &qmax,        1);
+  _get_short (peprb, &offset,  rbpos, &fix_seq_len, 1);
+
+  poprb = sra_alloc (dst, alt, osize+100); /** huffman decode can read too much ***/
+
+  /* decompress huffman
+   */
+  if (magic ==  SRA_CT_HUFFMAN)
+  {
+#if !SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+    uchar_t*   iptr;
+#endif
+    uchar_t    indx;
+    union      { char c[4]; uint32_t val; } uval;
+    uint32_t   lval;
+
+
+    pos = 0;
+    while (pos < osize)
+    {
+      if (offset > (uint32_t)ssize)
+        return 1;
+
+      _get_long (peprb, 4, &offset, &rbpos, &lval, 0, (ssize << 3));
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+      indx = gv_local.rlookup_slx_prb [lval>>24];
+#else
+      iptr = (uchar_t*) kbsearch (&lval, gv_local.idx_slx_prb,
+                                 PRB_SLX_HUFF_TREESIZE, sizeof(uint16_t), _s_cmp_key, gv_local.lookup_slx_prb);
+      assert (iptr);
+      indx = *iptr;
+#endif
+
+      offset += ((rbpos+(uint16_t)gv_local.lookup_slx_prb[indx].nbits) >> 3);
+      rbpos   = ((rbpos+(uint16_t)gv_local.lookup_slx_prb[indx].nbits) &  7);
+
+      switch (indx)
+      {
+        case 0: /* max min min min */
+          uval.c[3] = uval.c[2] = uval.c[1] = qmin; uval.c[0] = qmax;
+          break;
+
+        case 1: /* -5 -5 -5 -5 */
+          uval.c[3] = uval.c[2] = uval.c[1] = uval.c[0] = -5;
+          break;
+
+        case 2: /* val -val min min */
+          _get_long (peprb, 6, &offset, &rbpos, &lval, 1, (ssize << 3));
+          byte = (char)(lval >> 26); /* only 6 bits are needed */
+          uval.c[3] = uval.c[2] = qmin; uval.c[1] = -byte; uval.c[0] = byte;
+          break;
+
+        case 3: /* val min -val min */
+          _get_long (peprb, 6, &offset, &rbpos, &lval, 1, (ssize << 3));
+          byte = (char)(lval >> 26); /* only 6 bits are needed */
+          uval.c[3] = uval.c[1] = qmin; uval.c[2] = -byte; uval.c[0] = byte;
+          break;
+
+        case 4: /* val min min -val */
+          _get_long (peprb, 6, &offset, &rbpos, &lval, 1, (ssize << 3));
+          byte = (char)(lval >> 26); /* only 6 bits are needed */
+          uval.c[2] = uval.c[1] = qmin; uval.c[3] = -byte; uval.c[0] = byte;
+          break;
+
+        case 5:
+        default:
+          _get_long (peprb, 32, &offset, &rbpos, (uint32_t *)&uval.c[0], 1, (ssize << 3));
+          /*uval.val = lval*/;
+          break;
+      }
+      memmove (poprb+pos, &uval.c[0], sizeof(uint32_t));
+      pos += 4;
+    }
+  }
+  else
+  if (magic == SRA_CT_UNCOMPRESSED)
+  {
+      memmove (poprb, peprb+9, osize);
+  }
+
+  assert ( osize <= dst -> elem_count );
+  KDataBufferResize ( dst, osize );
+
+  return 0;
+}
+
+static void _s_decode_slx (uchar_t magic, const uchar_t* pesig, uchar_t* posig, uint32_t osize, uint32_t offset, uint32_t rbpos, int ssize)
+{
+  uint32_t pos = 0;
+  uint16_t fix_seq_len;
+
+  if (magic == SRA_CT_UNCOMPRESSED || magic == SRA_CT_BASELINED)
+  {
+    int32_t  baseline = 0;
+    float    fval;
+    uint16_t uval;
+
+    _get_short (pesig,     &offset,  rbpos, &fix_seq_len,  1);
+    _get_long  (pesig, 32, &offset, &rbpos, &baseline,     1, (ssize << 3));
+
+    rbpos = 0; /* read bit position */
+
+
+    while (pos < osize)
+    {
+      uval = 0;
+      _get_short (pesig, &offset, rbpos, &uval, 1);
+      fval =     (float) (uval-baseline);
+      memmove     (posig+pos, &fval, sizeof(float));
+      pos += sizeof(float);
+    }
+  }
+  else
+  if (magic == SRA_CT_NORMALIZED)
+  {
+    union  { float fval; uint32_t uval; } uf;
+    float  fval;
+    float  fmin;
+    short  sval;
+
+    _get_short (pesig,     &offset,  rbpos, &fix_seq_len,  1);
+    _get_short (pesig,     &offset,  rbpos, &sval,         1);
+    _get_long  (pesig, 32, &offset, &rbpos, &uf.uval,      1, (ssize << 3));
+
+    fmin = (float) sval;
+    rbpos = 0; /* read bit position */
+
+
+    while (pos < osize)
+    {
+      sval = 0;
+      fval = uf.fval;
+      _get_short (pesig, &offset, rbpos, &sval, 1);
+      fval *= sval; fval += fmin;
+      memmove     (posig+pos, &fval, sizeof(float));
+      pos += sizeof(float);
+    }
+  }
+}
+
+int sra_decompress_sig_slx ( KDataBuffer *dst, KDataBuffer *alt, const void* src, int ssize )
+{
+  uchar_t        magic;
+  const uchar_t* pesig;
+  uchar_t*       posig;
+#if !SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  uint16_t*      iptr;
+#endif
+  uint16_t       indx, fix_seq_len, shift;
+  uint32_t       pos, rbpos, wbpos, nbits;
+  uint32_t       offset, osize, lval;
+  union { float fval; uint32_t uval; } sim, snm; /* minimum level of signal and noise */
+
+  assert (gv_local.lookup_slx_sig_initialized);
+
+  rbpos  = 0;
+  offset = 0;
+  pesig  = src;
+
+  /* get magic and size of data
+   */
+  _get_byte  (pesig,     &offset,  rbpos, &magic, 1);
+  _get_long  (pesig, 32, &offset, &rbpos, &osize, 1, (ssize << 3));
+
+  assert (magic == SRA_CT_ZLIB         || magic == SRA_CT_HUFFMAN ||
+          magic == SRA_CT_UNCOMPRESSED || magic == SRA_CT_NORMALIZED ||
+          magic == SRA_CT_BASELINED);
+
+  /* decompress zlib
+   */
+  if (magic == SRA_CT_ZLIB)
+  {
+    shift = 5; /* magic + length */
+    posig = sra_alloc ( dst, alt, osize + 100 );
+
+    if (_s_decompress_zlib(posig, pesig+shift, (int)osize + 100, ssize-shift))
+      return 1;
+
+    rbpos  = 0; /* read bit position */
+    offset = 0;
+    ssize  = osize;
+    pesig  = posig;
+    _get_byte  (pesig,     &offset,  rbpos, &magic, 1);
+    _get_long  (pesig, 32, &offset, &rbpos, &osize, 1, (ssize << 3));
+
+    assert (magic == SRA_CT_HUFFMAN    || magic == SRA_CT_UNCOMPRESSED ||
+            magic == SRA_CT_NORMALIZED || magic == SRA_CT_BASELINED);
+  }
+
+  /* decompress huffman
+   */
+  if (magic == SRA_CT_HUFFMAN)
+  {
+    _get_short (pesig,     &offset,  rbpos, &fix_seq_len, 1);
+    _get_long  (pesig, 32, &offset, &rbpos, &sim.uval,    1, (ssize << 3));
+    _get_long  (pesig, 32, &offset, &rbpos, &snm.uval,    1, (ssize << 3));
+
+    assert ((osize&3) == 0); /* make shure it can be devided by 4 */
+
+    posig = sra_alloc (dst, alt, osize);
+
+    pos   = 0;
+    wbpos = 0; /* write bit position */
+
+    while (pos < osize)
+    {
+      if (ssize-offset > 4) nbits = 32;
+      else                  nbits = ((ssize-offset)==4?32:((ssize-offset)==3?24:((ssize-offset)==2?16:8)))-rbpos;
+
+      if (offset > (uint32_t)ssize)
+        return 1;
+
+      _get_long (pesig, nbits, &offset, &rbpos, &lval, 0, (ssize << 3));
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+      indx = gv_local.rlookup_slx_sig [lval>>16];
+#else
+      iptr = (uint16_t*) kbsearch (&lval, gv_local.idx_slx_sig,
+                                  SIG_HUFF_TREESIZE, sizeof(uint16_t), _s_cmp_key, gv_local.lookup_slx_sig);
+      assert (iptr);
+      indx = *iptr;
+#endif
+
+      offset += ((rbpos+(uint32_t)gv_local.lookup_slx_sig[indx].nbits) >> 3);
+      rbpos   = ((rbpos+(uint32_t)gv_local.lookup_slx_sig[indx].nbits)  & 7);
+
+      if (indx < SIG_MAX_POINT)
+      {
+        indx = bswap_16 ((uint16_t)(indx-SIG_MID_POINT));
+        _put_short (indx, posig, &pos, wbpos);
+      }
+      else
+      {
+        uint16_t val;
+        if ((int)nbits - (int)gv_local.lookup_slx_sig[indx].nbits >= 16)
+        {
+          val = (short)((lval >> (16-gv_local.lookup_slx_sig[indx].nbits)) & 0xFFFF);
+          offset += 2;
+        }
+        else
+          _get_short (pesig, &offset, rbpos, &val, 1);
+
+        val = bswap_16 (val);
+        _put_short (val, posig, &pos, wbpos);
+      }
+    }
+
+    _s_undelta_4_channel (fix_seq_len, sizeof(uint16_t), posig, osize);
+
+    pesig = posig;
+    ssize = osize;
+    osize = osize << 1;
+    posig = sra_alloc ( dst, alt, osize );
+
+    _s_exponent_4_channel (fix_seq_len, posig, osize, pesig, ssize, sim.fval, snm.fval);
+  }
+  else
+  if (magic == SRA_CT_UNCOMPRESSED || magic == SRA_CT_NORMALIZED || magic == SRA_CT_BASELINED)
+  {
+    assert ((osize&3) == 0); /* make shure it can be devided by 4 */
+    osize *= 2;              /* desination size is 4 bytes per channel, but the original is 2 */
+
+    posig = sra_alloc ( dst, alt, osize );
+
+    _s_decode_slx (magic, pesig, posig, osize, offset, rbpos, ssize);
+  }
+
+  assert ( osize <= dst -> elem_count );
+  KDataBufferResize ( dst, osize );
+
+  return 0;
+}
+
+int sra_decompress_int ( KDataBuffer *dst, KDataBuffer *alt, const void* src, int ssize )
+{
+  uchar_t        magic;
+  const uchar_t* pesig;
+  uchar_t*       posig;
+#if !SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  uint16_t*      iptr;
+#endif
+  uint16_t       indx, fix_seq_len, shift;
+  uint32_t       pos, rbpos, wbpos, nbits;
+  uint32_t       offset, osize, lval;
+  union { float fval; uint32_t uval; } sim, snm; /* minimum level of signal and noise */
+
+  assert (gv_local.lookup_slx_int_initialized);
+
+  rbpos  = 0;
+  offset = 0;
+  pesig  = src;
+
+  /* get magic and size of data
+   */
+  _get_byte  (pesig,     &offset,  rbpos, &magic, 1);
+  _get_long  (pesig, 32, &offset, &rbpos, &osize, 1, (ssize << 3));
+
+  assert (magic == SRA_CT_ZLIB         || magic == SRA_CT_HUFFMAN ||
+          magic == SRA_CT_UNCOMPRESSED || magic == SRA_CT_NORMALIZED ||
+          magic == SRA_CT_BASELINED);
+
+  /* decompress zlib
+   */
+  if (magic == SRA_CT_ZLIB)
+  {
+    shift = 5; /* magic + length */
+    posig = sra_alloc ( dst, alt, osize + 100 );
+
+    if (_s_decompress_zlib(posig, pesig+shift, (int)osize + 100, ssize-shift))
+      return 1;
+
+    rbpos  = 0; /* read bit position */
+    offset = 0;
+    ssize  = osize;
+    pesig  = posig;
+    _get_byte  (pesig,     &offset,  rbpos, &magic, 1);
+    _get_long  (pesig, 32, &offset, &rbpos, &osize, 1, (ssize << 3));
+
+    assert (magic == SRA_CT_HUFFMAN    || magic == SRA_CT_UNCOMPRESSED ||
+            magic == SRA_CT_NORMALIZED || magic == SRA_CT_BASELINED);
+  }
+
+  /* decompress huffman
+   */
+  if (magic == SRA_CT_HUFFMAN)
+  {
+    _get_short (pesig,     &offset,  rbpos, &fix_seq_len, 1);
+    _get_long  (pesig, 32, &offset, &rbpos, &sim.uval,    1, (ssize << 3));
+    _get_long  (pesig, 32, &offset, &rbpos, &snm.uval,    1, (ssize << 3));
+
+    assert ((osize&3) == 0); /* make shure it can be devided by 4 */
+
+    posig = sra_alloc (dst, alt, osize);
+
+    pos   = 0;
+    wbpos = 0; /* write bit position */
+
+    while (pos < osize)
+    {
+      if (ssize-offset > 4) nbits = 32;
+      else                  nbits = ((ssize-offset)==4?32:((ssize-offset)==3?24:((ssize-offset)==2?16:8)))-rbpos;
+
+      if (offset > (uint32_t)ssize)
+        return 1;
+
+      _get_long (pesig, nbits, &offset, &rbpos, &lval, 0, (ssize << 3));
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+      indx = gv_local.rlookup_slx_int [lval>>16];
+#else
+      iptr = (uint16_t*) kbsearch (&lval, gv_local.idx_slx_int,
+                                  INT_HUFF_TREESIZE, sizeof(uint16_t), _s_cmp_key, gv_local.lookup_slx_int);
+      assert (iptr);
+      indx = *iptr;
+#endif
+
+      offset += ((rbpos+(uint32_t)gv_local.lookup_slx_int[indx].nbits) >> 3);
+      rbpos   = ((rbpos+(uint32_t)gv_local.lookup_slx_int[indx].nbits)  & 7);
+
+      if (indx < INT_MAX_POINT)
+      {
+        indx = bswap_16 ((uint16_t)(indx-INT_MID_POINT));
+        _put_short (indx, posig, &pos, wbpos);
+      }
+      else
+      {
+        uint16_t val;
+        if ((int)nbits - (int)gv_local.lookup_slx_int[indx].nbits >= 16)
+        {
+          val = (short)((lval >> (16-gv_local.lookup_slx_int[indx].nbits)) & 0xFFFF);
+          offset += 2;
+        }
+        else
+          _get_short (pesig, &offset, rbpos, &val, 1);
+
+        val = bswap_16 (val);
+        _put_short (val, posig, &pos, wbpos);
+      }
+    }
+
+    _s_undelta_4_channel (fix_seq_len, sizeof(uint16_t), posig, osize);
+
+    pesig = posig;
+    ssize = osize;
+    osize = osize << 1;
+    posig = sra_alloc (dst, alt, osize);
+
+    _s_exponent_4_channel (fix_seq_len, posig, osize, pesig, ssize, sim.fval, snm.fval);
+  }
+  else
+  if (magic == SRA_CT_UNCOMPRESSED || magic == SRA_CT_NORMALIZED || magic == SRA_CT_BASELINED)
+  {
+    assert ((osize&3) == 0); /* make shure it can be devided by 4 */
+    osize *= 2;              /* desination size is 4 bytes per channel, but the original is 2 */
+
+    posig = sra_alloc (dst, alt, osize);
+
+    _s_decode_slx (magic, pesig, posig, osize, offset, rbpos, ssize);
+  }
+
+  assert ( osize <= dst -> elem_count );
+  KDataBufferResize ( dst, osize );
+
+  return 0;
+}
+
+int sra_decompress_nse ( KDataBuffer *dst, KDataBuffer *alt, const void* src, int ssize )
+{
+  uchar_t        magic;
+  const uchar_t* pesig;
+  uchar_t*       posig;
+#if !SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+  uint16_t*      iptr;
+#endif
+  uint16_t       indx, fix_seq_len, shift;
+  uint32_t       pos, rbpos, wbpos, nbits;
+  uint32_t       offset, osize, lval;
+  union { float fval; uint32_t uval; } sim, snm; /* minimum level of signal and noise */
+
+  assert (gv_local.lookup_slx_nse_initialized);
+
+  rbpos  = 0;
+  offset = 0;
+  pesig  = src;
+
+  /* get magic and size of data
+   */
+  _get_byte  (pesig,     &offset,  rbpos, &magic, 1);
+  _get_long  (pesig, 32, &offset, &rbpos, &osize, 1, (ssize << 3));
+
+  assert (magic == SRA_CT_ZLIB         || magic == SRA_CT_HUFFMAN ||
+          magic == SRA_CT_UNCOMPRESSED || magic == SRA_CT_NORMALIZED ||
+          magic == SRA_CT_BASELINED);
+
+  /* decompress zlib
+   */
+  if (magic == SRA_CT_ZLIB)
+  {
+    shift = 5; /* magic + length */
+    posig = sra_alloc ( dst, alt, osize + 100 );
+
+    if (_s_decompress_zlib(posig, pesig+shift, (int)osize + 100, ssize-shift))
+      return 1;
+
+    rbpos  = 0; /* read bit position */
+    offset = 0;
+    ssize  = osize;
+    pesig  = posig;
+    _get_byte  (pesig,     &offset,  rbpos, &magic, 1);
+    _get_long  (pesig, 32, &offset, &rbpos, &osize, 1, (ssize << 3));
+
+    assert (magic == SRA_CT_HUFFMAN    || magic == SRA_CT_UNCOMPRESSED ||
+            magic == SRA_CT_NORMALIZED || magic == SRA_CT_BASELINED);
+  }
+
+  /* decompress huffman
+   */
+  if (magic == SRA_CT_HUFFMAN)
+  {
+    _get_short (pesig,     &offset,  rbpos, &fix_seq_len, 1);
+    _get_long  (pesig, 32, &offset, &rbpos, &sim.uval,    1, (ssize << 3));
+    _get_long  (pesig, 32, &offset, &rbpos, &snm.uval,    1, (ssize << 3));
+
+    assert ((osize&3) == 0); /* make shure it can be devided by 4 */
+
+    posig = sra_alloc (dst, alt, osize);
+
+    /* decompress huffman
+     */
+    pos   = 0;
+    wbpos = 0; /* write bit position */
+
+    while (pos < osize)
+    {
+      if (ssize-offset > 4) nbits = 32;
+      else                  nbits = ((ssize-offset)==4?32:((ssize-offset)==3?24:((ssize-offset)==2?16:8)))-rbpos;
+
+      if (offset > (uint32_t)ssize)
+        return 1;
+
+      _get_long (pesig, nbits, &offset, &rbpos, &lval, 0, (ssize << 3));
+
+#if SRA_DECOMPRESS_USE_REVERSE_LOOKUP
+      indx = gv_local.rlookup_slx_nse [lval>>16];
+#else
+      iptr = (uint16_t*) kbsearch (&lval, gv_local.idx_slx_nse,
+                                  NSE_HUFF_TREESIZE, sizeof(uint16_t), _s_cmp_key, gv_local.lookup_slx_nse);
+      assert (iptr);
+      indx = *iptr;
+#endif
+
+      offset += ((rbpos+(uint32_t)gv_local.lookup_slx_nse[indx].nbits) >> 3);
+      rbpos   = ((rbpos+(uint32_t)gv_local.lookup_slx_nse[indx].nbits)  & 7);
+
+      if (indx < NSE_MAX_POINT)
+      {
+        indx = bswap_16 ((uint16_t)(indx-NSE_MID_POINT));
+        _put_short (indx, posig, &pos, wbpos);
+      }
+      else
+      {
+        uint16_t val;
+        if ((int)nbits - (int)gv_local.lookup_slx_int[indx].nbits >= 16)
+        {
+          val = (short)((lval >> (16-gv_local.lookup_slx_nse[indx].nbits)) & 0xFFFF);
+          offset += 2;
+        }
+        else
+          _get_short (pesig, &offset, rbpos, &val, 1);
+
+        val = bswap_16 (val);
+        _put_short (val, posig, &pos, wbpos);
+      }
+    }
+
+    _s_undelta_4_channel (fix_seq_len, sizeof(uint16_t), posig, osize);
+
+    pesig = posig;
+    ssize = osize;
+    osize = osize << 1;
+    posig = sra_alloc (dst, alt, osize);
+
+    _s_exponent_4_channel (fix_seq_len, posig, osize, pesig, ssize, sim.fval, snm.fval);
+  }
+  else
+  if (magic == SRA_CT_UNCOMPRESSED || magic == SRA_CT_NORMALIZED || magic == SRA_CT_BASELINED)
+  {
+    assert ((osize&3) == 0); /* make shure it can be devided by 4 */
+    osize *= 2;              /* desination size is 4 bytes per channel, but the original is 2 */
+
+    posig = sra_alloc (dst, alt, osize);
+
+    _s_decode_slx (magic, pesig, posig, osize, offset, rbpos, ssize);
+  }
+
+  assert ( osize <= dst -> elem_count );
+  KDataBufferResize ( dst, osize );
+
+  return 0;
+}
+
diff --git a/libs/sraxf/v0-decompress.h b/libs/sraxf/v0-decompress.h
new file mode 100644
index 0000000..c144ce4
--- /dev/null
+++ b/libs/sraxf/v0-decompress.h
@@ -0,0 +1,170 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _SRA_DECOMPRESS_HEADER
+#define _SRA_DECOMPRESS_HEADER
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* sra compression types
+ */
+#define SRA_CT_UNCOMPRESSED      0
+#define SRA_CT_HUFFMAN           1
+#define SRA_CT_ZLIB              2
+#define SRA_CT_NCBI2NA           3
+#define SRA_CT_NORMALIZED        4
+#define SRA_CT_BASELINED         5
+#define SRA_CT_PACKED            6
+#define SRA_CT_TRUNCATED         7
+#define SRA_CT_EXP10             8
+#define SRA_CT_TRANSLATE         9
+
+
+/* forward of KDataBuffer */
+struct KDataBuffer;
+
+
+/* blob header pseudo descriptions
+ *  NB - all structs are single-byte aligned
+ *
+struct HDR_454_POSITION
+{
+    uint8_t type;
+    uint16_t osize; -- double compressed, 2 headers total
+};
+
+struct HDR_454_READ
+{
+    uint8_t type;
+    uint16_t osize; -- 1 byte per base, i.e. row-length
+};
+
+struct HDR_454_QUALITY
+{
+    uint8_t type;
+    uint16_t osize; -- double compressed
+};
+
+struct HDR_454_CLIP
+{
+    uint8_t type;
+    uint32_t osize; -- zlib compressed
+};
+
+struct HDR_454_SIGNAL
+{
+    uint8_t type;
+    uint16_t osize; -- double compressed
+};
+
+struct HDR_SLX_ZLIB
+{
+    uint8_t type;
+    uint32_t osize; -- double compressed
+};
+
+struct HDR_SLX_QUALITY
+{
+    uint8_t type;
+    uint32_t osize;
+    uint8_t qmin;
+    uint8_t qmax;
+    uint16_t fixed_len;
+};
+
+struct HDR_SLX_READ
+{
+    uint8_t type;
+    uint32_t osize;
+    uint16_t fixed_len;
+};
+
+struct HDR_SLX_SIG_HUFFMAN
+{
+    uint8_t type;
+    uint32_t osize;
+    uint16_t fixed_len;
+    float sim;
+    float snm;
+};
+
+struct HDR_SLX_SIG_BASELINE -- or uncompressed
+{
+    uint8_t type;
+    uint32_t osize;
+    uint16_t fixed_len;
+    uint32_t baseline;
+};
+
+struct HDR_SLX_SIG_NORMALIZED
+{
+    uint8_t type;
+    uint32_t osize;
+    uint16_t fixed_len;
+    uint16_t min;
+    float scale;
+};
+
+*/
+
+/* decompression routines:
+ * return a pointer to an allocated memory buffer and the size of the buffer in bytes
+ * you would need to free(*dst) after its use
+ *
+ * parameters:
+ *   platform = 1 (454), 2 (solexa)
+ *   dst    - a pointer to a buffer into which an uncompressed data is written
+ *   dsize  - the size of the incompressed data
+ *   src    - compressed data source
+ *   ssize  - size of compressed data
+ *
+ * return values: 0 - OK, 1 - error
+ */
+void sra_decompress_init  (void);
+
+/* SIGNAL */
+int sra_decompress_sig_454(struct KDataBuffer *dst, struct KDataBuffer *alt, const void* src, int ssize);
+int sra_decompress_sig_slx(struct KDataBuffer *dst, struct KDataBuffer *alt, const void* src, int ssize);
+/* INTENSITY */
+int sra_decompress_int(struct KDataBuffer *dst, struct KDataBuffer *alt, const void* src, int ssize);
+/* NOISE */
+int sra_decompress_nse(struct KDataBuffer *dst, struct KDataBuffer *alt, const void* src, int ssize);
+/* QUALITY */
+int sra_decompress_prb_454(struct KDataBuffer *dst, struct KDataBuffer *alt, const void* src, int ssize);
+int sra_decompress_prb_slx(struct KDataBuffer *dst, struct KDataBuffer *alt, const void* src, int ssize);
+/* POSITION */
+int sra_decompress_pos(struct KDataBuffer *dst, struct KDataBuffer *alt, const void* src, int ssize);
+/* CLIP_QUALITY_ */
+int sra_decompress_clp(struct KDataBuffer *dst, struct KDataBuffer *alt, const void* src, int ssize);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libs/sraxf/v0-funcs.c b/libs/sraxf/v0-funcs.c
new file mode 100644
index 0000000..61b4a5b
--- /dev/null
+++ b/libs/sraxf/v0-funcs.c
@@ -0,0 +1,337 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/vdb-priv.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <limits.h>
+
+#include <endian.h>
+#include <byteswap.h>
+
+#ifdef HTONL
+#undef HTONL
+#endif
+
+#ifdef HTONS
+#undef HTONS
+#endif
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define HTONL( x ) bswap_32 ( x )
+#define HTONS( x ) bswap_16 ( x )
+#else
+#define HTONL( x ) ( x )
+#define HTONS( x ) ( x )
+#endif
+
+#include "v0-decompress.h"
+
+static
+rc_t CC sra_read_decompress_454 ( void *self, const VXformInfo *info,
+    VLegacyBlobResult *rslt, const KDataBuffer *src )
+{
+    rc_t rc;
+    KDataBuffer *dst = rslt -> dst;
+    const uint8_t *p = src -> base;
+
+    uint32_t num_bases = HTONS ( * ( const uint16_t* ) & p [ 1 ] );
+    uint32_t hdr_size = 3;
+
+    /* make sub-buffer from input */
+    KDataBuffer tmp;
+    rc = KDataBufferCast ( src, & tmp, 8, false );
+    if ( rc == 0 )
+    {
+        KDataBufferWhack ( dst );
+        rc = KDataBufferSub ( & tmp, dst, hdr_size, UINT64_MAX );
+        if ( rc == 0 )
+        {
+            /* cast to 2na */
+            rc = KDataBufferCast ( dst, dst, 2, true );
+            if ( rc == 0 )
+            {
+                /* resize to actual number of bases */
+                assert ( num_bases <= dst -> elem_count );
+                rc = KDataBufferResize ( dst, num_bases );
+            }
+        }
+
+        KDataBufferWhack ( & tmp );
+    }
+
+    return rc;
+}
+
+static
+rc_t CC sra_read_decompress_slx ( void *self, const VXformInfo *info,
+    VLegacyBlobResult *rslt, const KDataBuffer *src )
+{
+    rc_t rc;
+    KDataBuffer tmp;
+    uint32_t hdr_size;
+    KDataBuffer *dst = rslt -> dst;
+    const uint8_t *p = src -> base;
+
+    uint32_t num_bases = HTONL ( * ( const uint32_t* ) & p [ 1 ] );
+    uint32_t row_len = HTONS ( * ( const uint16_t* ) & p [ 5 ] );
+    assert ( row_len != 0 );
+    assert ( num_bases % row_len == 0 );
+    hdr_size = 7;
+
+    /* make sub-buffer from input */
+    rc = KDataBufferCast ( src, & tmp, 8, false );
+    if ( rc == 0 )
+    {
+        KDataBufferWhack ( dst );
+        rc = KDataBufferSub ( & tmp, dst, hdr_size, UINT64_MAX );
+        if ( rc == 0 )
+        {
+            /* cast to 2na */
+            rc = KDataBufferCast ( dst, dst, 2, true );
+            if ( rc == 0 )
+            {
+                /* resize to actual number of bases */
+                assert ( num_bases <= dst -> elem_count );
+                rc = KDataBufferResize ( dst, num_bases );
+            }
+        }
+
+        KDataBufferWhack ( & tmp );
+    }
+
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_decode_READ, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    VNoHdrBlobFunc f;
+    rslt -> variant = vftLegacyBlob;
+
+    /* the discriminator */
+    switch ( cp -> argv [ 0 ] . data . u8 [ 0 ] )
+    {
+    case SRA_PLATFORM_454:
+        f = sra_read_decompress_454;
+        break;
+    case SRA_PLATFORM_ILLUMINA:
+        f = sra_read_decompress_slx;
+        break;
+    default:
+        return RC ( rcSRA, rcFunction, rcConstructing, rcParam, rcInvalid );
+    }
+
+    /* DO NOT CHANGE ASSIGNMENT FROM "f"
+       we want the compiler to catch type mismatches */
+    rslt -> u . bf = ( VBlobFunc ) f;
+
+    return 0;
+}
+
+/* all of the functions have this prototype */
+typedef int ( * legacy_decompress_func ) ( KDataBuffer*, KDataBuffer*, const void*, int );
+
+/* function ids */
+enum
+{
+    sra_prb_454,
+    sra_prb_slx,
+    sra_sig_454,
+    sra_sig_slx,
+    sra_int,
+    sra_nse,
+    sra_clip,
+    sra_pos
+};
+
+static
+legacy_decompress_func funcs [] =
+{
+    sra_decompress_prb_454,
+    sra_decompress_prb_slx,
+    sra_decompress_sig_454,
+    sra_decompress_sig_slx,
+    sra_decompress_int,
+    sra_decompress_nse,
+    sra_decompress_clp,
+    sra_decompress_pos
+};
+
+static
+rc_t CC sra_legacy_decompress ( void *self, const VXformInfo *info,
+    VLegacyBlobResult *rslt, const KDataBuffer *src )
+{
+    int failed;
+    KDataBuffer *dst = rslt -> dst;
+
+    /* an initially empty buffer */
+    KDataBuffer alt;
+    KDataBufferMakeBytes ( & alt, 0 );
+
+    assert(KDataBufferBytes ( src ) < INT_MAX);
+    /* invoke the decompression function */
+    failed = funcs [ ( size_t ) self ] ( dst, & alt, src -> base, (int)KDataBufferBytes ( src ) );
+
+    /* whack any double buffer */
+    KDataBufferWhack ( & alt );
+
+    /* return non-descript status */
+    if ( failed )
+        return RC ( rcSRA, rcBlob, rcUnpacking, rcNoObj, rcUnknown );
+    return 0;
+}
+
+static
+rc_t sra_legacy_init ( void )
+{
+    static bool done;
+    if ( ! done )
+    {
+        sra_decompress_init ();
+        done = true;
+    }
+
+    return 0;
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_decode_QUALITY, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* DO NOT REMOVE THIS ASSIGNMENT
+       we want the compiler to catch type mismatches */
+    VNoHdrBlobFunc f = sra_legacy_decompress;
+    rslt -> u . bf = ( VBlobFunc ) f;
+    rslt -> variant = vftLegacyBlob;
+
+    /* the discriminator */
+    switch ( cp -> argv [ 0 ] . data . u8 [ 0 ] )
+    {
+    case SRA_PLATFORM_454:
+        rslt -> self = ( void* ) sra_prb_454;
+        break;
+    case SRA_PLATFORM_ILLUMINA:
+        rslt -> self = ( void* ) sra_prb_slx;
+        break;
+    default:
+        return RC ( rcSRA, rcFunction, rcConstructing, rcParam, rcInvalid );
+    }
+
+    return sra_legacy_init ();
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_decode_SIGNAL, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* DO NOT REMOVE THIS ASSIGNMENT
+       we want the compiler to catch type mismatches */
+    VNoHdrBlobFunc f = sra_legacy_decompress;
+    rslt -> u . bf = ( VBlobFunc ) f;
+    rslt -> variant = vftLegacyBlob;
+
+    /* the discriminator */
+    switch ( cp -> argv [ 0 ] . data . u8 [ 0 ] )
+    {
+    case SRA_PLATFORM_454:
+        rslt -> self = ( void* ) sra_sig_454;
+        break;
+    case SRA_PLATFORM_ILLUMINA:
+        rslt -> self = ( void* ) sra_sig_slx;
+        break;
+    default:
+        return RC ( rcSRA, rcFunction, rcConstructing, rcParam, rcInvalid );
+    }
+
+    return sra_legacy_init ();
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_decode_INTENSITY, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* DO NOT REMOVE THIS ASSIGNMENT
+       we want the compiler to catch type mismatches */
+    VNoHdrBlobFunc f = sra_legacy_decompress;
+    rslt -> u . bf = ( VBlobFunc ) f;
+    rslt -> variant = vftLegacyBlob;
+
+    /* the discriminator */
+    rslt -> self = ( void* ) sra_int;
+
+    return sra_legacy_init ();
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_decode_NOISE, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* DO NOT REMOVE THIS ASSIGNMENT
+       we want the compiler to catch type mismatches */
+    VNoHdrBlobFunc f = sra_legacy_decompress;
+    rslt -> u . bf = ( VBlobFunc ) f;
+    rslt -> variant = vftLegacyBlob;
+
+    /* the discriminator */
+    rslt -> self = ( void* ) sra_nse;
+
+    return sra_legacy_init ();
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_decode_CLIP, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* DO NOT REMOVE THIS ASSIGNMENT
+       we want the compiler to catch type mismatches */
+    VNoHdrBlobFunc f = sra_legacy_decompress;
+    rslt -> u . bf = ( VBlobFunc ) f;
+    rslt -> variant = vftLegacyBlob;
+
+    /* the discriminator */
+    rslt -> self = ( void* ) sra_clip;
+
+    return sra_legacy_init ();
+}
+
+VTRANSFACT_IMPL ( NCBI_SRA_decode_POSITION, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* DO NOT REMOVE THIS ASSIGNMENT
+       we want the compiler to catch type mismatches */
+    VNoHdrBlobFunc f = sra_legacy_decompress;
+    rslt -> u . bf = ( VBlobFunc ) f;
+    rslt -> variant = vftLegacyBlob;
+
+    /* the discriminator */
+    rslt -> self = ( void* ) sra_pos;
+
+    return sra_legacy_init ();
+}
diff --git a/libs/sraxf/varloc.c b/libs/sraxf/varloc.c
new file mode 100644
index 0000000..2698110
--- /dev/null
+++ b/libs/sraxf/varloc.c
@@ -0,0 +1,105 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <insdc/insdc.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+/****************************** tokenize_var_id *******************************/
+/* typedef uint16_t text_token [ 3 ]; */
+
+static
+rc_t CC tokenize_var_id ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc = 0;
+    int pos = 0;
+    unsigned const var_id_len = argv[0].u.data.elem_count;
+    struct
+    {
+        uint16_t token_type;
+        uint16_t position;
+        uint16_t length;
+    } *dst;
+    const char *var_id	= argv[0].u.data.base;
+    var_id += argv[0].u.data.first_elem;
+    
+    rslt->data->elem_bits = sizeof(dst[0]) * 8;
+    rc = KDataBufferResize( rslt -> data, 2 );
+    if ( rc != 0 ) return rc;
+    rslt -> elem_count = 2;
+    dst = rslt -> data -> base;
+    memset(dst, 0, 2 * sizeof *dst);
+ 
+    /* ([A-Za-z]*)(\d*) */
+    if (var_id_len > 0) {
+        for (pos = var_id_len - 1; pos >= 0; --pos) {
+            if (var_id[pos] < '0' || var_id[pos] > '9') {
+                ++pos;
+                break;
+            }
+            if (pos == 0) { /* all numbers */
+                break;
+            }
+        }
+    }
+    dst [ 1 ] . position = pos;
+    dst [ 1 ] . length = var_id_len - pos;
+    dst [ 0 ] . length = var_id_len - dst [ 1 ] . length;
+
+    return rc;
+}
+
+/* 
+ * tokenize_var_id
+ *   splits into 2 tokens
+ *   0 - prefix
+ *   1 - suffix
+ *
+ * extern function
+ * text:token NCBI:var:tokenize_var_id #1 ( ascii var_id );
+ */
+VTRANSFACT_IMPL ( NCBI_var_tokenize_var_id, 1, 0, 0 ) ( const void *Self,
+    const VXfactInfo *info, VFuncDesc *rslt,
+    const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->u.rf = tokenize_var_id;
+    rslt->variant = vftRow;
+    return 0;
+}
diff --git a/libs/svdb/.gitignore b/libs/svdb/.gitignore
new file mode 100644
index 0000000..29f1a27
--- /dev/null
+++ b/libs/svdb/.gitignore
@@ -0,0 +1 @@
+*.vers.h
diff --git a/libs/svdb/Makefile b/libs/svdb/Makefile
new file mode 100644
index 0000000..f09159c
--- /dev/null
+++ b/libs/svdb/Makefile
@@ -0,0 +1,95 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/svdb
+
+INT_LIBS = \
+
+EXT_LIBS = \
+	libsvdb
+
+ALL_LIBS = \
+	$(INT_LIBS) \
+	$(EXT_LIBS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+$(EXT_LIBS): makedirs
+	@ $(MAKE_CMD) $(LIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+	$(addprefix $(LIBDIR)/,$(EXT_LIBS))
+
+.PHONY: $(TARGDIR)/all $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# virtual db library
+#
+$(LIBDIR)/libsvdb: $(addprefix $(LIBDIR)/libsvdb.,$(LIBEXT))
+
+SVDB_SRC = \
+	svdb
+
+SVDB_OBJ = \
+	$(addsuffix .$(LOBX),$(SVDB_SRC))
+
+SVDB_LIB = \
+	-lncbi-vdb \
+	-lm
+
+#ifeq (win,$(OS))
+#	SVDB_LIB += -lShell32
+#endif
+
+$(LIBDIR)/libsvdb.$(SHLX): $(SVDB_OBJ)
+	$(LD) --dlib --vers $(SRCDIR)/../ncbi-vdb/libncbi-vdb.vers -o $@ $^ $(SVDB_LIB)
+
+$(LIBDIR)/libsvdb.$(LIBX): $(SVDB_OBJ)
+	$(LD) --slib --vers $(SRCDIR)/../ncbi-vdb/libncbi-vdb.vers -o $@ $^ $(SVDB_LIB)
diff --git a/libs/svdb/svdb.c b/libs/svdb/svdb.c
new file mode 100644
index 0000000..9c42841
--- /dev/null
+++ b/libs/svdb/svdb.c
@@ -0,0 +1,3215 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <svdb/extern.h>
+#include <svdb/svdb.h>
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/debug.h>
+#include <klib/text.h>
+#include <klib/vector.h>
+#include <klib/pack.h>
+#include <klib/printf.h>
+
+#include <kfs/directory.h>
+
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <sra/sraschema.h>
+#include <sra/sradb.h>
+#include <sra/pacbio.h>
+
+#include <vfs/manager.h>
+#include <vfs/resolver.h>
+#include <vfs/path.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <string.h>
+#include <bitstr.h>
+
+#define NTABS 8
+#define NCOLUMNS 8
+#define NMETACHILDS 4
+#define NTYPES 8
+#define DEF_ELEM_SEPARATOR ","
+#define DEF_DIM_SEPARATOR "[]"
+#define INVALID_COL 0xFFFFFFFF
+#define INVALID_ROW 0xFFFFFFFFFFFFFFFF
+
+
+bool print_err = false;
+char last_err[ 1024 ];
+
+/* forward decl's */
+struct svdb_conn;
+typedef struct svdb_conn* p_svdb_conn;
+
+struct svdb_tab;
+typedef struct svdb_tab* p_svdb_tab;
+
+struct svdb_col;
+typedef struct svdb_col* p_svdb_col;
+
+struct svdb_type;
+typedef struct svdb_type* p_svdb_type;
+
+struct svdb_meta;
+typedef struct svdb_meta* p_svdb_meta;
+
+
+typedef const char * (*value_trans_func_t)( const uint32_t id );
+typedef char * (*dim_trans_func_t)( const uint8_t *src );
+
+
+typedef struct print_ctx
+{
+    char * buf;
+    int buf_len;
+    int needed;
+    int printed;
+} print_ctx;
+typedef print_ctx* p_print_ctx;
+
+
+typedef struct data_src
+{
+    uint32_t elem_bits;
+    uint32_t boff;
+    uint32_t row_len;
+    uint32_t elem_idx;
+    const void * base;
+} data_src;
+typedef data_src* p_data_src;
+
+
+typedef struct svdb_type
+{
+    const char * name;
+    VTypedecl typedecl;
+    VTypedesc typedesc;
+    p_svdb_col col;
+} svdb_type;
+
+
+typedef struct svdb_col
+{
+    const char * name;
+    const char * cast;
+    const char * elem_separator;
+    const char * dim_separator;
+    const char * cur_typedecl;
+    p_svdb_tab tab;
+    uint32_t cur_idx;
+    int enabled;
+    int open;
+    int visible;
+    Vector types;
+    uint32_t dflt_type_idx;
+    VTypedecl cursor_typedecl;
+    VTypedesc cursor_typedesc;
+    value_trans_func_t value_trans;
+    dim_trans_func_t dim_trans;
+} svdb_col;
+
+
+typedef struct svdb_meta
+{
+    Vector childs;
+    int id;
+    const char * name;
+    const void * value;
+    int value_len;
+} svdb_meta;
+
+
+typedef struct svdb_tab
+{
+    const VTable * tab;
+    const VCursor * cursor;
+    const char * name;
+    p_svdb_meta meta;
+    uint64_t range;
+    int64_t first;
+    int meta_id;
+    p_svdb_conn conn;
+    Vector all_columns;
+    Vector static_columns;
+    Vector non_static_columns;
+    Vector visible_columns;
+    Vector non_visible_columns;
+} svdb_tab;
+
+
+typedef struct svdb_conn
+{
+    char * path;
+    KDirectory * dir;
+    const VDBManager * mgr;
+    VSchema * schema;
+    const VDatabase * db;
+    int is_db;
+    Vector tables;
+} svdb_conn;
+
+
+/* special translations of SRA-types into clear text */
+const char SRA_PB_HS_0[] = { "SRA_PACBIO_HOLE_SEQUENCING" };
+const char SRA_PB_HS_1[] = { "SRA_PACBIO_HOLE_ANTIHOLE" };
+const char SRA_PB_HS_2[] = { "SRA_PACBIO_HOLE_FIDUCIAL" };
+const char SRA_PB_HS_3[] = { "SRA_PACBIO_HOLE_SUSPECT" };
+const char SRA_PB_HS_4[] = { "SRA_PACBIO_HOLE_ANTIMIRROR" };
+const char SRA_PB_HS_5[] = { "SRA_PACBIO_HOLE_FDZMW" };
+const char SRA_PB_HS_6[] = { "SRA_PACBIO_HOLE_FBZMW" };
+const char SRA_PB_HS_7[] = { "SRA_PACBIO_HOLE_ANTIBEAMLET" };
+const char SRA_PB_HS_8[] = { "SRA_PACBIO_HOLE_OUTSIDEFOV" };
+const char SRA_PB_HS_9[] = { "unknown hole-status" };
+
+static const char *sra_trans_hole_status( const uint32_t id )
+{
+    switch( id )
+    {
+        case SRA_PACBIO_HOLE_SEQUENCING     : return( SRA_PB_HS_0 ); break;
+        case SRA_PACBIO_HOLE_ANTIHOLE       : return( SRA_PB_HS_1 ); break;
+        case SRA_PACBIO_HOLE_FIDUCIAL       : return( SRA_PB_HS_2 ); break;
+        case SRA_PACBIO_HOLE_SUSPECT        : return( SRA_PB_HS_3 ); break;
+        case SRA_PACBIO_HOLE_ANTIMIRROR     : return( SRA_PB_HS_4 ); break;
+        case SRA_PACBIO_HOLE_FDZMW          : return( SRA_PB_HS_5 ); break;
+        case SRA_PACBIO_HOLE_FBZMW          : return( SRA_PB_HS_6 ); break;
+        case SRA_PACBIO_HOLE_ANTIBEAMLET    : return( SRA_PB_HS_7 ); break;
+        case SRA_PACBIO_HOLE_OUTSIDEFOV     : return( SRA_PB_HS_8 ); break;
+    }
+    return( SRA_PB_HS_9 );
+}
+
+const char SRA_PF_0[] = { "SRA_PLATFORM_UNDEFINED" };
+const char SRA_PF_1[] = { "SRA_PLATFORM_454" };
+const char SRA_PF_2[] = { "SRA_PLATFORM_ILLUMINA" };
+const char SRA_PF_3[] = { "SRA_PLATFORM_ABSOLID" };
+const char SRA_PF_4[] = { "SRA_PLATFORM_COMPLETE_GENOMICS" };
+const char SRA_PF_5[] = { "SRA_PLATFORM_HELICOS" };
+const char SRA_PF_6[] = { "SRA_PLATFORM_PACBIO_SMRT" };
+const char SRA_PF_7[] = { "SRA_PLATFORM_ION_TORRENT" };
+const char SRA_PF_8[] = { "SRA_PLATFORM_CAPILLARY" };
+const char SRA_PF_9[] = { "SRA_PLATFORM_OXFORD_NANOPORE" };
+const char SRA_PF_N[] = { "unknown platform" };
+
+static const char *sra_trans_platform( const uint32_t id )
+{
+    switch( id )
+    {
+        case 0  : return( SRA_PF_0 ); break;
+        case 1  : return( SRA_PF_1 ); break;
+        case 2  : return( SRA_PF_2 ); break;
+        case 3  : return( SRA_PF_3 ); break;
+        case 4  : return( SRA_PF_4 ); break;
+        case 5  : return( SRA_PF_5 ); break;
+        case 6  : return( SRA_PF_6 ); break;
+        case 7  : return( SRA_PF_7 ); break;
+        case 8  : return( SRA_PF_8 ); break;
+        case 9  : return( SRA_PF_9 ); break;		
+    }
+    return( SRA_PF_N );
+}
+
+
+const char SRA_RT_0[] = { "SRA_READ_TYPE_TECHNICAL" };
+const char SRA_RT_1[] = { "SRA_READ_TYPE_BIOLOGICAL" };
+const char SRA_RT_2[] = { "SRA_READ_TYPE_TECHNICAL|SRA_READ_TYPE_FORWARD" };
+const char SRA_RT_3[] = { "SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD" };
+const char SRA_RT_4[] = { "SRA_READ_TYPE_TECHNICAL|SRA_READ_TYPE_REVERSE" };
+const char SRA_RT_5[] = { "SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_REVERSE" };
+const char SRA_RT_6[] = { "unknown read-type" };
+
+static const char *sra_trans_read_type( const uint32_t id )
+{
+    switch( id )
+    {
+        case 0 : return( SRA_RT_0 ); break;
+        case 1 : return( SRA_RT_1 ); break;
+        case 2 : return( SRA_RT_2 ); break;
+        case 3 : return( SRA_RT_3 ); break;
+        case 4 : return( SRA_RT_4 ); break;
+        case 5 : return( SRA_RT_5 ); break;
+    }
+    return( SRA_RT_6 );
+}
+
+
+const char SRA_FT_0[] = { "SRA_READ_FILTER_PASS" };
+const char SRA_FT_1[] = { "SRA_READ_FILTER_REJECT" };
+const char SRA_FT_2[] = { "SRA_READ_FILTER_CRITERIA" };
+const char SRA_FT_3[] = { "SRA_READ_FILTER_REDACTED" };
+const char SRA_FT_4[] = { "unknown read-filter" };
+
+static const char *sra_trans_read_filter( const uint32_t id )
+{
+    switch( id )
+    {
+        case 0 : return( SRA_FT_0 ); break;
+        case 1 : return( SRA_FT_1 ); break;
+        case 2 : return( SRA_FT_2 ); break;
+        case 3 : return( SRA_FT_3 ); break;
+    }
+    return( SRA_FT_4 );
+}
+
+
+/* hardcoded values taken from asm-trace/interface/sra/sradb.h */
+#define SRA_KEY_PLATFORM_ID "INSDC:SRA:platform_id"
+#define SRA_KEY_XREAD_TYPE "INSDC:SRA:xread_type"
+#define SRA_KEY_READ_TYPE "INSDC:SRA:read_type"
+#define SRA_KEY_READ_FILTER "INSDC:SRA:read_filter"
+#define SRA_PACBIO_HOLE_STATUS "PacBio:hole:status"
+
+static bool vdcd_type_cmp( const VSchema *my_schema, VTypedecl * typedecl, const char * to_check )
+{
+    VTypedecl type_to_check;
+    rc_t rc = VSchemaResolveTypedecl ( my_schema, &type_to_check, "%s", to_check );
+    if ( rc == 0 )
+    {
+        return VTypedeclToTypedecl ( typedecl, my_schema, &type_to_check, NULL, NULL );
+    }
+    return false;
+}
+
+static value_trans_func_t sra_get_value_trans_func( const VSchema *my_schema, VTypedecl * typedecl )
+{
+    value_trans_func_t res = NULL;
+
+    if ( my_schema == NULL ) return res;
+    if ( typedecl == NULL ) return res;
+
+    if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_PLATFORM_ID ) )
+    {
+        res = sra_trans_platform;
+    }
+    else if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_XREAD_TYPE ) )
+    {
+        res = sra_trans_read_type;
+    }
+    else if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_READ_TYPE ) )
+    {
+        res = sra_trans_read_type;
+    }
+    else if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_READ_FILTER ) )
+    {
+        res = sra_trans_read_filter;
+    }
+    else if ( vdcd_type_cmp( my_schema, typedecl, SRA_PACBIO_HOLE_STATUS ) )
+    {
+        res = sra_trans_hole_status;
+    }
+    return res;
+}
+
+
+/* implementation of the dimension-translation-functions */
+static char * sra_read_desc( const uint8_t * src )
+{
+    char *res = calloc( 1, 120 );
+    SRAReadDesc desc;
+    memmove( &desc, src, sizeof( desc ) );
+    string_printf ( res, 119, NULL,
+              "seg.start=%u, seg.len=%u, type=%u, cs_key=%u, label=%s",
+              desc.seg.start, desc.seg.len, desc.type,
+              desc.cs_key, desc.label );
+    return res;
+}
+
+
+static char * sra_spot_desc( const uint8_t *src )
+{
+    char *res = calloc( 1, 120 );
+    SRASpotDesc desc;
+    memmove( &desc, src, sizeof( desc ) );
+    string_printf ( res, 119, NULL,
+              "spot_len=%u, fixed_len=%u, signal_len=%u, clip_qual_right=%u, num_reads=%u",
+              desc.spot_len, desc.fixed_len, desc.signal_len,
+              desc.clip_qual_right, desc.num_reads );
+    return res;
+}
+
+/* hardcoded values taken from asm-trace/interface/sra/sradb.h */
+#define SRA_KEY_READ_DESC "NCBI:SRA:ReadDesc"
+#define SRA_KEY_SPOT_DESC "NCBI:SRA:SpotDesc"
+
+static dim_trans_func_t sra_get_dim_trans_func( const VSchema *my_schema, VTypedecl * typedecl )
+{
+    dim_trans_func_t res = NULL;
+
+    if ( my_schema == NULL ) return res;
+    if ( typedecl == NULL ) return res;
+
+    if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_READ_DESC ) )
+    {
+        res = sra_read_desc;
+    }
+    else if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_SPOT_DESC ) )
+    {
+        res = sra_spot_desc;
+    }
+    return res;
+}
+
+
+static void svdb_init_print_ctx( p_print_ctx ctx, char * buf, int buf_len )
+{
+    ctx->buf = buf;
+    ctx->buf_len = buf_len;
+    ctx->needed = 0;
+    ctx->printed = 0;
+}
+
+
+KLIB_EXTERN int CC string_cmp ( const char *a, size_t asize,
+    const char *b, size_t bsize, uint32_t max_chars );
+
+static int svdb_strcmp( const char *a, const char *b )
+{
+    size_t sa = string_size ( a );
+    size_t sb = string_size ( b );
+    uint32_t max_chars = ( sa > sb ) ? (uint32_t)sa : (uint32_t)sb;
+    return string_cmp ( a, sa, b, sb, max_chars );
+}
+
+
+static void svdb_set_last_err( const char * s )
+{
+    string_copy_measure ( last_err, sizeof last_err, s );
+}
+
+
+const char ACC_NOT_FOUND[] = { "accession not found" };
+char accession_2_path_buffer[ 1024 ];
+
+
+static void log_and_err( rc_t rc, const char * s )
+{
+    if ( print_err ) LOGERR( klogInt, rc, s );
+    svdb_set_last_err( s );
+}
+
+
+MOD_EXPORT const char * CC svdb_accession_2_path( const char * accession )
+{
+    const char * res = NULL;
+    if ( accession != NULL && accession[0] != 0 )
+    {
+        if ( strchr ( accession, '/' ) == NULL )
+        {
+            VFSManager * vfs_mgr;
+            rc_t rc = VFSManagerMake ( &vfs_mgr );
+            if ( rc != 0 )
+                log_and_err( rc, "VFSManagerMake() failed in svdb_accession_2_path()" );
+            else
+            {
+                VResolver * resolver;
+
+                rc = VFSManagerGetResolver ( vfs_mgr, &resolver );
+                if ( rc != 0 )
+                    log_and_err( rc, "VFSManagerGetResolver() failed in svdb_accession_2_path()" );
+                else
+                {
+                    VPath * vpath;
+                    rc = VFSManagerMakeSysPath ( vfs_mgr, &vpath, accession );
+                    if ( rc != 0 )
+                        log_and_err( rc, "VFSManagerMakeSysPath() failed in svdb_accession_2_path()" );
+                    else
+                    {
+                        const VPath * local;
+                        rc = VResolverQuery ( resolver, 0, vpath, &local, NULL, NULL );
+                        if ( rc != 0 )
+                            log_and_err( rc, "VResolverQuery() failed in svdb_accession_2_path()" );
+                        else
+                        {
+                            const String * str;
+                            rc = VPathMakeString ( local, &str );
+                            if ( rc != 0 )
+                                log_and_err( rc, "VPathMakeString() failed in svdb_accession_2_path()" );
+                            else
+                            {
+                                res = string_dup ( str->addr, str->size );
+                                StringWhack ( str );
+                            }
+
+                            VPathRelease ( local );
+                        }
+                        VPathRelease ( vpath );
+                    }
+                    VResolverRelease ( resolver );
+                }
+                VFSManagerRelease ( vfs_mgr );
+            }
+
+        }
+    }
+    return res;
+}
+
+
+static p_svdb_type svdb_make_type( p_svdb_col col, const char * name )
+{
+    rc_t rc;
+    p_svdb_type res = calloc( 1, sizeof( svdb_type ) );
+    if ( res == NULL )
+    {
+        rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+        LOGERR( klogInt, rc, "calloc() failed in svdb_make_type()" );
+    }
+    else
+    {
+        res->col = col;
+        res->name = string_dup_measure ( name, NULL );
+        rc = VSchemaResolveTypedecl ( col->tab->conn->schema, &res->typedecl, "%s", name );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VSchemaResolveTypedecl() failed in svdb_make_type()" );
+        }
+        else
+        {
+            rc = VSchemaDescribeTypedecl ( col->tab->conn->schema, &res->typedesc, &res->typedecl );
+            if ( rc != 0 )
+            {
+                LOGERR( klogInt, rc, "VSchemaDescribeTypedecl() failed in svdb_make_type()" );
+            }
+        }
+    }
+    return res;
+}
+
+
+static void CC svdb_free_type( void * item, void * data )
+{
+    p_svdb_type t = (p_svdb_type)item;
+    if ( t != NULL )
+    {
+        if ( t->name != NULL )
+        {
+            free( ( void * )t->name );
+        }
+        free( item );
+    }
+}
+
+
+static rc_t svdb_discover_types( p_svdb_col col )
+{
+    KNamelist *type_names;
+    uint32_t dflt_idx;
+    rc_t rc = VTableColumnDatatypes ( col->tab->tab, col->name, &dflt_idx, &type_names );
+    if ( rc == 0 )
+    {
+        uint32_t n;
+        col->dflt_type_idx = dflt_idx;
+        rc = KNamelistCount( type_names, &n );
+        if ( rc == 0 )
+        {
+            uint32_t i;
+            for ( i = 0; i < n && rc == 0; ++i )
+            {
+                const char *type_name;
+                rc = KNamelistGet( type_names, i, &type_name );
+                if ( rc == 0 )
+                {
+                    p_svdb_type type = svdb_make_type( col, type_name );
+                    if ( type == NULL )
+                    {
+                        rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+                    }
+                    else
+                    {
+                        rc = VectorAppend ( &col->types, NULL, type );
+                        if ( rc != 0 )
+                        {
+                            LOGERR( klogInt, rc, "VectorAppend() failed in svdb_discover_types()" );
+                            svdb_free_type( type, NULL );
+                        }
+                    }
+                }
+            }
+        }
+        KNamelistRelease( type_names );
+    }
+    return rc;
+}
+
+
+static p_svdb_col svdb_make_col( p_svdb_tab tab, const char * name )
+{
+    rc_t rc;
+    p_svdb_col res = calloc( 1, sizeof( svdb_col ) );
+    if ( res == NULL )
+    {
+        rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+        LOGERR( klogInt, rc, "calloc() failed in svdb_make_col()" );
+    }
+    else
+    {
+        
+        VectorInit ( &res->types, 0, NTYPES );
+        res->tab = tab;
+        res->name = string_dup_measure ( name, NULL );
+        res->elem_separator = string_dup_measure ( DEF_ELEM_SEPARATOR, NULL );
+        res->dim_separator = string_dup_measure ( DEF_DIM_SEPARATOR, NULL );
+        res->visible = 1;
+        rc = svdb_discover_types( res );
+        if ( rc != 0 )
+        {
+            VectorWhack ( &res->types, svdb_free_type, NULL );
+            free( ( void* )res->name );
+            res = NULL;
+        }
+    }
+    return res;
+}
+
+
+static void free_if_not_null( const char * s )
+{
+    if ( s != NULL )
+    {
+        free( ( void * ) s );
+    }
+}
+
+
+static void CC svdb_free_col( void * item, void * data )
+{
+    p_svdb_col c = (p_svdb_col)item;
+    if ( c != NULL )
+    {
+        VectorWhack ( &c->types, svdb_free_type, NULL );
+        free_if_not_null( c->elem_separator );
+        free_if_not_null( c->dim_separator );
+        free_if_not_null( c->cur_typedecl );
+        free_if_not_null( c->cast );
+        free_if_not_null( c->name );
+        free( item );
+    }
+}
+
+
+static rc_t svdb_discover_columns( p_svdb_tab table )
+{
+    KNamelist *col_names;
+    rc_t rc = VTableListReadableColumns ( table->tab, &col_names );
+    if ( rc == 0 )
+    {
+        uint32_t n;
+        rc = KNamelistCount( col_names, &n );
+        if ( rc == 0 )
+        {
+            uint32_t i;
+            for ( i = 0; i < n && rc == 0; ++i )
+            {
+                const char *col_name;
+                rc = KNamelistGet( col_names, i, &col_name );
+                if ( rc == 0 )
+                {
+                    p_svdb_col col = svdb_make_col( table, col_name );
+                    if ( col == NULL )
+                    {
+                        rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+                    }
+                    else
+                    {
+                        rc = VectorAppend ( &table->all_columns, NULL, col );
+                        if ( rc != 0 )
+                        {
+                            LOGERR( klogInt, rc, "VectorAppend() failed in svdb_discover_columns()" );
+                            svdb_free_col( col, NULL );
+                        }
+                        else
+                        {
+                            VectorAppend ( &table->visible_columns, NULL, col );
+                        }
+                    }
+                }
+            }
+        }
+        KNamelistRelease( col_names );
+    }
+    return rc;
+}
+
+
+static void svdb_whack_meta( p_svdb_meta meta )
+{
+    if ( meta != NULL )
+    {
+        int i, n = VectorLength( &meta->childs );
+        for ( i = 0; i < n; ++i )
+        {
+            p_svdb_meta child = VectorGet ( &meta->childs, i );
+            if ( child != NULL )
+            {
+                svdb_whack_meta( child ); /* recursion here !!! */
+            }
+        }
+        VectorWhack( &meta->childs, NULL, NULL );
+        free_if_not_null( meta->name );
+        free_if_not_null( meta->value );
+        free( meta );
+    }
+}
+
+
+static void svdb_read_meta_value( p_svdb_meta m, const KMDataNode *node )
+{
+    char buffer[ 8 ];
+    size_t num_read, remaining;
+
+    /* first try to detect how big the node-value is */
+    rc_t rc = KMDataNodeRead ( node, 0, buffer, sizeof buffer, &num_read, &remaining );
+    if ( rc == 0 )
+    {
+        size_t count = num_read + remaining;
+        if ( count > 0 )
+        {
+            m->value = malloc( count );
+            if ( m->value != NULL )
+            {
+                /* 2nd try to read it really now */
+                rc = KMDataNodeRead ( node, 0, (void *)m->value, count, &num_read, &remaining );
+                if ( rc == 0 )
+                {
+                    m->value_len = (uint32_t)count;
+                }
+                else
+                {
+                    free( (void *)m->value );
+                    m->value = NULL;
+                }
+            }
+        }
+    }
+}
+
+
+static p_svdb_meta svdb_init_meta( p_svdb_tab tab, const KMDataNode *node, const char * name )
+{
+    p_svdb_meta res = calloc( 1, sizeof( svdb_meta )  );
+    if ( res != NULL )
+    {
+        VectorInit ( &res->childs, 0, NMETACHILDS );
+        res->id = ( tab->meta_id )++;
+        res->name = string_dup_measure ( name, NULL );
+        svdb_read_meta_value( res, node );
+
+        if ( node != NULL )
+        {
+            KNamelist *names;
+            rc_t rc = KMDataNodeListChild ( node, &names );
+            if ( rc == 0 )
+            {
+                uint32_t i, count;
+                rc = KNamelistCount ( names, & count );
+                for ( i = 0; rc == 0 && i < count; ++ i )
+                {
+                    const char *node_path;
+                    rc = KNamelistGet ( names, i, & node_path );
+                    if ( rc == 0 )
+                    {
+                        const KMDataNode *child_node;
+                        rc = KMDataNodeOpenNodeRead ( node, &child_node, "%s", node_path );
+                        if ( rc == 0 )
+                        {
+                            p_svdb_meta child = svdb_init_meta( tab, child_node, node_path );
+                            if ( child != NULL )
+                            {
+                                rc = VectorAppend ( &res->childs, NULL, child );
+                                if ( rc != 0 )
+                                {
+                                    svdb_whack_meta( child );
+                                }
+                            }
+                            KMDataNodeRelease ( child_node );
+                        }
+                    }
+                }
+                KNamelistRelease( names );
+            }
+        }
+    }
+    return res;
+}
+
+
+static p_svdb_meta svdb_find_meta( p_svdb_meta meta, const int id )
+{
+    p_svdb_meta res = NULL;
+    if ( meta->id == id )
+    {
+        res = meta;
+    }
+    else
+    {
+        int i, n = VectorLength( &meta->childs );
+        for ( i = 0; i < n && res == NULL; ++i )
+        {
+            p_svdb_meta child = VectorGet ( &meta->childs, i );
+            if ( child != NULL )
+            {
+                res = svdb_find_meta( child, id );
+            }
+        }
+    }
+    return res;
+}
+
+
+static rc_t svdb_discover_meta( p_svdb_tab tab )
+{
+    const KMetadata *src_meta;
+    rc_t rc = VTableOpenMetadataRead ( tab->tab, &src_meta );
+    if ( rc == 0 )
+    {
+        const KMDataNode *root;
+        rc = KMetadataOpenNodeRead ( src_meta, &root, NULL );
+        if ( rc == 0 )
+        {
+            tab->meta = svdb_init_meta( tab, root, "/" );
+            KMDataNodeRelease ( root );
+        }
+        KMetadataRelease ( src_meta );
+    }
+    return rc;
+}
+
+
+static p_svdb_tab svdb_make_tab( p_svdb_conn pself, const VTable * tab,
+            const char * name )
+{
+    p_svdb_tab res = calloc( 1, sizeof( svdb_tab ) );
+    if ( res == NULL )
+    {
+        rc_t rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+        LOGERR( klogInt, rc, "calloc() failed in svdb_make_tab()" );
+    }
+    else
+    {
+        rc_t rc;
+
+        res->conn = pself;
+        res->tab = tab;
+        VectorInit ( &res->all_columns, 0, NCOLUMNS );
+        VectorInit ( &res->static_columns, 0, NCOLUMNS );
+        VectorInit ( &res->non_static_columns, 0, NCOLUMNS );
+        VectorInit ( &res->visible_columns, 0, NCOLUMNS );
+        VectorInit ( &res->non_visible_columns, 0, NCOLUMNS );
+
+        rc = svdb_discover_columns( res );
+        if ( rc == 0 )
+        {
+            rc = svdb_discover_meta( res );
+            if ( rc == 0 )
+            {
+                res->name = string_dup_measure ( name, NULL );
+            }
+        }
+
+        if ( rc != 0 )
+        {
+            VectorWhack ( &res->static_columns, NULL, NULL );
+            VectorWhack ( &res->non_static_columns, NULL, NULL );
+            VectorWhack ( &res->visible_columns, NULL, NULL );
+            VectorWhack ( &res->non_visible_columns, NULL, NULL );
+            VectorWhack ( &res->all_columns, svdb_free_col, NULL );
+            svdb_whack_meta( res->meta );
+            free( res );
+            res = NULL;
+        }
+    }
+    return res;
+}
+
+
+static void CC svdb_free_table( void * item, void * data )
+{
+    p_svdb_tab t = (p_svdb_tab)item;
+    if ( t != NULL )
+    {
+        rc_t rc;
+        if ( t->cursor != NULL )
+        {
+            rc = VCursorRelease ( t->cursor );
+            if ( rc != 0 )
+            {
+                LOGERR( klogInt, rc, "VCursorRelease() failed in svdb_close_table()" );
+            }
+        }
+        if ( t->tab != NULL ) 
+        {
+            rc = VTableRelease( t->tab );
+            if ( rc != 0 )
+            {
+                LOGERR( klogInt, rc, "VTableRelease() failed in svdb_close_table()" );
+            }
+        }
+        VectorWhack ( &t->static_columns, NULL, NULL );
+        VectorWhack ( &t->non_static_columns, NULL, NULL );
+        VectorWhack ( &t->visible_columns, NULL, NULL );
+        VectorWhack ( &t->non_visible_columns, NULL, NULL );
+        VectorWhack ( &t->all_columns, svdb_free_col, NULL );
+        svdb_whack_meta( t->meta );
+
+        free_if_not_null( t->name );
+        free( item );
+    }
+}
+
+
+static void svdb_clear_vector( Vector * v )
+{
+    while ( VectorLength( v ) > 0 )
+    {
+        void * removed;
+        VectorRemove ( v, 0, &removed );
+    }
+}
+
+
+static Vector * svdb_get_column_vector( p_svdb_tab table, const int selection )
+{
+    Vector * res = &table->all_columns;
+    switch( selection )
+    {
+        case STATIC_COLUMNS      : res = &table->static_columns; break;
+        case NON_STATIC_COLUMNS  : res = &table->non_static_columns; break;
+        case VISIBLE_COLUMNS     : res = &table->visible_columns; break;
+        case NON_VISIBLE_COLUMNS : res = &table->non_visible_columns; break;
+    }
+    return res;
+}
+
+
+MOD_EXPORT void CC svdb_close( void * self )
+{
+    p_svdb_conn pself = (p_svdb_conn)self;
+    if ( pself != NULL )
+    {
+        rc_t rc;
+        VectorWhack ( &pself->tables, svdb_free_table, NULL );
+        rc = VDatabaseRelease( pself->db );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VDatabaseRelease() failed in svdb_close()" );
+        }
+        rc = VSchemaRelease( pself->schema );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VSchemaRelease() failed in svdb_close()" );
+        }
+        rc = VDBManagerRelease( pself->mgr );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VDBManagerRelease() failed in svdb_close()" );
+        }
+        rc = KDirectoryRelease( pself->dir );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "KDirectoryRelease() failed in svdb_close()" );
+        }
+        free_if_not_null( pself->path );
+        free( self );
+    }
+}
+
+
+static rc_t svdb_append_tab( p_svdb_conn pself, const VTable * tab,
+            const char * name )
+{
+    rc_t rc = 0;
+    p_svdb_tab t = svdb_make_tab( pself, tab, name );
+    if ( t == NULL )
+    {
+        rc = VTableRelease( tab );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VTableRelease() failed in svdb_open()" );
+        }
+        rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        rc = VectorAppend ( &pself->tables, NULL, t );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VectorAppend() failed in svdb_open()" );
+            svdb_free_table( t, NULL );
+        }
+    }
+    return rc;
+}
+
+
+static const char * svdb_filename( const char * path )
+{
+    const char * res = NULL;
+    if ( path != NULL && path[0] != 0 )
+    {
+        res = strrchr( path, '/' );
+        if ( res == NULL )
+        {
+            res = strrchr( path, '\\' );
+        }
+        if ( res == NULL )
+        {
+            res = path;
+        }
+        else
+        {
+            res++;
+        }
+    }
+    return res;
+}
+
+
+static rc_t svdb_open_subtables( p_svdb_conn pself )
+{
+    KNamelist *tbl_names;
+    rc_t rc = VDatabaseListTbl( pself->db, &tbl_names );
+    if ( rc == 0 )
+    {
+        uint32_t n;
+        rc = KNamelistCount( tbl_names, &n );
+        if ( rc == 0 )
+        {
+            uint32_t i;
+            for ( i = 0; i < n && rc == 0; ++i )
+            {
+                const char *tbl_name;
+                rc = KNamelistGet( tbl_names, i, &tbl_name );
+                if ( rc == 0 )
+                {
+                    const VTable * tab;
+                    rc = VDatabaseOpenTableRead( pself->db, &tab, "%s", tbl_name );
+                    if ( rc == 0 )
+                    {
+                        rc = svdb_append_tab( pself, tab, tbl_name );
+                    }
+                }
+            }
+        }
+        KNamelistRelease( tbl_names );
+    }
+    return rc;
+}
+
+
+MOD_EXPORT void * CC svdb_open_path( const char * path  )
+{
+    p_svdb_conn pself = NULL;
+   if ( path != NULL && path[0] != 0 )
+    {
+        rc_t rc;
+        pself = calloc( 1, sizeof( svdb_conn ) );
+        if ( pself == NULL )
+        {
+            rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            LOGERR( klogInt, rc, "calloc() failed in svdb_open()" );
+            svdb_set_last_err( "calloc() failed in svdb_open()" );
+        }
+        else
+        {
+            VectorInit ( &pself->tables, 0, NTABS );
+            rc = KDirectoryNativeDir( &pself->dir );
+            if ( rc != 0 )
+            {
+                LOGERR( klogInt, rc, "KDirectoryNativeDir() failed in svdb_open()" );
+                svdb_set_last_err( "KDirectoryNativeDir() failed in svdb_open()" );
+            }
+            else
+            {
+                rc = VDBManagerMakeRead ( &pself->mgr, pself->dir );
+                if ( rc != 0 )
+                {
+                    LOGERR( klogInt, rc, "VDBManagerMakeRead() failed in svdb_open()" );
+                    svdb_set_last_err( "VDBManagerMakeRead() failed in svdb_open()" );
+                }
+            }
+            if ( rc == 0 )
+            {
+                rc = VDBManagerMakeSRASchema( pself->mgr, &pself->schema );
+                if ( rc != 0 )
+                {
+                    LOGERR( klogInt, rc, "VDBManagerMakeSRASchema() failed in svdb_open()" );
+                    svdb_set_last_err( "VDBManagerMakeSRASchema() failed in svdb_open()" );
+                }
+                else
+                {
+                    /* it is OK if these fail, we have no valid path then... */
+                    rc = VDBManagerOpenDBRead( pself->mgr, &pself->db, pself->schema, "%s", path );
+                    if ( rc == 0 )
+                    {
+                        pself->is_db = 1;
+                        rc = svdb_open_subtables( pself );
+                    }
+                    else
+                    {
+                        const VTable * tab;
+                        rc = VDBManagerOpenTableRead( pself->mgr, &tab, pself->schema, "%s", path );
+                        if ( rc == 0 )
+                        {
+                            rc = svdb_append_tab( pself, tab, svdb_filename( path ) );
+                            if ( rc != 0 )
+                            {
+                                svdb_set_last_err( "svdb_append_tab() failed in svdb_open()" );
+                            }
+                        }
+                        else
+                        {
+                            string_printf ( last_err, sizeof last_err, NULL,
+                                            "VDBManagerOpenTableRead('%s')->'%R' failed",
+                                            path, rc );
+/*                            svdb_set_last_err( "VDBManagerOpenTableRead() failed in svdb_open()" ); */
+                        }
+                    }
+                }
+            }
+
+            if ( rc == 0 )
+            {
+                pself->path = string_dup_measure ( path, NULL );
+                svdb_set_last_err( "OK" );
+            }
+            else
+            {
+                svdb_close( pself );
+                pself = NULL;
+            }
+        }
+    }
+    else
+    {
+        svdb_set_last_err( "path empty in svdb_open()" );
+    }
+    return pself;
+}
+
+
+MOD_EXPORT const char * CC svdb_last_err( void )
+{
+    return last_err;
+}
+
+
+MOD_EXPORT int CC svdb_is_db( void * self )
+{
+    int res = 0;
+    if ( self != NULL )
+    {
+        p_svdb_conn pself = self;
+        res = pself->is_db;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_count_tabs( void * self )
+{
+    int res = 0;
+    if ( self != NULL )
+    {
+        p_svdb_conn pself = self;
+        res = VectorLength( &pself->tables );
+    }
+    return res;
+}
+
+
+static p_svdb_tab svdb_get_tab( void * self, const int tab_id )
+{
+    p_svdb_tab res = NULL;
+    if ( self != NULL )
+    {
+        p_svdb_conn pself = self;
+        res = VectorGet ( &pself->tables, tab_id );
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_tab_meta_root( void * self, const int tab_id )
+{
+    int res = -1;
+    p_svdb_tab t = svdb_get_tab( self, tab_id );
+    if ( t != NULL )
+    {
+        if ( t->meta != NULL )
+        {
+            res = t->meta->id;
+        }
+    }
+    return res;
+}
+
+
+static p_svdb_meta svdb_get_meta_node( void * self, const int tab_id, const int meta_id )
+{
+    p_svdb_meta m = NULL;
+    p_svdb_tab t = svdb_get_tab( self, tab_id );
+    if ( t != NULL )
+    {
+        if ( t->meta != NULL )
+        {
+            m = svdb_find_meta( t->meta, meta_id );
+        }
+    }
+    return m;
+}
+
+
+static int svdb_check_printable( const void * ptr, const int len )
+{
+    int res = 0;
+    if ( ptr != NULL && len > 0 )
+    {
+        int i, j = 0;
+        const char * cp = ptr;
+        for ( i = 0; i < len; ++i )
+        {
+            if ( !isprint ( cp[ i ] ) )
+                j++;
+        }
+        if ( j == 0 )
+            res = 1;
+        else
+            res = 0;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_tab_meta_value_printable( void * self, const int tab_id, const int meta_id )
+{
+    int res = -1;
+    p_svdb_meta m = svdb_get_meta_node( self, tab_id, meta_id );
+    if ( m != NULL )
+    {
+        res = svdb_check_printable( m->value, m->value_len );
+    }
+    return res;
+
+}
+
+
+MOD_EXPORT int CC svdb_tab_meta_value_len( void * self, const int tab_id, const int meta_id )
+{
+    int res = -1;
+    p_svdb_meta m = svdb_get_meta_node( self, tab_id, meta_id );
+    if ( m != NULL && m->value != NULL && m->value_len )
+    {
+        res = m->value_len;
+    }
+    return res;
+}
+
+
+MOD_EXPORT const char * CC svdb_tab_meta_value_ptr( void * self, const int tab_id,
+                                              const int meta_id )
+{
+    const char * res = NULL;
+    p_svdb_meta m = svdb_get_meta_node( self, tab_id, meta_id );
+    if ( m != NULL && m->value != NULL && m->value_len )
+    {
+        res = ( char * )m->value;
+    }
+    return res;
+}
+
+
+static rc_t svdb_print_hex( char * dst, size_t dstlen, char * src, size_t srclen,
+                            size_t trim, size_t * num_writ )
+{
+    rc_t rc = 0;
+    bool periods = true;
+    size_t writ, i, n = ( dstlen / 3 );
+
+    *num_writ = 0;
+    if ( n >= srclen )
+    {
+        n = srclen;
+        periods = false;
+    }
+    if ( periods )
+        n--;
+    for ( i = 0; i < n && rc == 0; ++i )
+    {
+        unsigned char x = src[i];
+        if ( i > 0 )
+            rc = string_printf ( dst, dstlen, &writ, "-%02X", x );
+        else
+            rc = string_printf ( dst, dstlen, &writ, "%02X", x );
+        if ( rc == 0 )
+        {
+            dst += writ;
+            *num_writ += writ;
+            dstlen -= writ;
+        }
+    }
+    if ( rc == 0 && periods )
+    {
+        rc = string_printf ( dst, dstlen, &writ, "..." );
+        *num_writ += writ;
+    }
+    return rc;
+}
+
+
+MOD_EXPORT int CC svdb_tab_meta_value( void * self, const int tab_id, const int meta_id,
+                                       char * buf, int buflen, int trim )
+{
+    int res = -1;
+    p_svdb_meta m = svdb_get_meta_node( self, tab_id, meta_id );
+    if ( m != NULL && m->value != NULL && m->value_len )
+    {
+        rc_t rc;
+        size_t num_writ;
+        if ( svdb_check_printable( m->value, m->value_len ) )
+        {
+            if ( trim == 0 || trim >= m->value_len )
+                rc = string_printf ( buf, buflen, &num_writ, "%.*s", m->value_len, m->value );
+            else
+                rc = string_printf ( buf, buflen, &num_writ, "%.*s...", trim, m->value );
+        }
+        else
+        {
+            rc = svdb_print_hex( buf, buflen, (char *)m->value, m->value_len, trim, &num_writ );
+        }
+
+        if ( rc == 0 )
+            res = ( int )num_writ;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_tab_meta_name( void * self, const int tab_id, const int meta_id,
+                                      char * buf, int buflen )
+{
+    int res = -1;
+    p_svdb_meta m = svdb_get_meta_node( self, tab_id, meta_id );
+    if ( m != NULL )
+    {
+        size_t num_writ;
+        rc_t rc = string_printf ( buf, buflen, &num_writ, "%s", m->name );
+        if ( rc == 0 )
+        {
+            res = ( int )num_writ;
+        }
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_tab_meta_child_count( void * self, const int tab_id,
+        const int meta_id )
+{
+    int res = -1;
+    p_svdb_meta m = svdb_get_meta_node( self, tab_id, meta_id );
+    if ( m != NULL )
+    {
+        res = VectorLength( &m->childs );
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_tab_meta_child_id( void * self, const int tab_id,
+        const int meta_id, const int child_idx )
+{
+    int res = -1;
+    p_svdb_meta m = svdb_get_meta_node( self, tab_id, meta_id );
+    if ( m != NULL )
+    {
+        p_svdb_meta c = VectorGet( &m->childs, child_idx );
+        if ( c != NULL )
+        {
+            res = c->id;
+        }
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_tab_idx( void * self, const char * name )
+{
+    int res = -1;
+    if ( self != NULL )
+    {
+        p_svdb_conn pself = self;
+        int i, n = VectorLength( &pself->tables );
+        for ( i = 0; i < n && res < 0; ++i )
+        {
+            p_svdb_tab tab = VectorGet ( &pself->tables, i );
+            if ( tab != NULL )
+            {
+                if ( svdb_strcmp( tab->name, name ) == 0 )
+                {
+                    res = i;
+                }
+            }
+        }   
+    }
+    return res;
+}
+
+
+static p_svdb_col svdb_get_col( void * self, const int tab_id,
+            const int selection, const int col_id )
+{
+    p_svdb_col res = NULL;
+    p_svdb_tab tab = svdb_get_tab( self, tab_id );
+    if ( tab != NULL )
+    {
+        Vector * v = svdb_get_column_vector( tab, selection );
+        res = VectorGet ( v, col_id );
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_set_column_visibility( void * self, const int tab_id,
+            const int selection, const int col_id, const int visible )
+{
+    int res = 0;
+    p_svdb_col col = svdb_get_col ( self, tab_id, selection, col_id );
+    if ( col != NULL )
+    {
+        int vis = visible;
+        if ( vis != 0 )
+        {
+            vis = 1;
+        }
+        if ( col->visible != vis )
+        {
+            int i, n;
+            p_svdb_tab tab = svdb_get_tab( self, tab_id );
+            col->visible = vis;
+            /* clear the visible and invisible vector */
+            VectorWhack ( &tab->visible_columns, NULL, NULL );
+            VectorWhack ( &tab->non_visible_columns, NULL, NULL );
+
+            VectorInit ( &tab->visible_columns, 0, NCOLUMNS );
+            VectorInit ( &tab->non_visible_columns, 0, NCOLUMNS );
+
+            /* loop through all columns an redistibute them new
+               ( to preserve the original order ) */
+            n = VectorLength( &tab->all_columns );
+            for ( i = 0; i < n; ++i )
+            {
+                col = VectorGet ( &tab->all_columns, i );
+                if ( col != NULL )
+                {
+                    if ( col->visible != 0 )
+                    {
+                        VectorAppend( &tab->visible_columns, NULL, col );
+                    }
+                    else
+                    {
+                        VectorAppend( &tab->non_visible_columns, NULL, col );
+                    }
+                }
+            }   
+            res = 1;
+        }
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_col_idx( void * self, const int tab_id,
+            const int selection, const char * name )
+{
+    int res = -1;
+    p_svdb_tab tab = svdb_get_tab( self, tab_id );
+    if ( tab != NULL )
+    {
+        Vector * v = svdb_get_column_vector( tab, selection );
+        int i, n = VectorLength( v );
+        for ( i = 0; i < n && res < 0; ++i )
+        {
+            p_svdb_col col = VectorGet ( v, i );
+            if ( col != NULL )
+            {
+                if ( svdb_strcmp( col->name, name ) == 0 )
+                {
+                    res = i;
+                }
+            }
+        }   
+    }
+    return res;
+}
+
+
+MOD_EXPORT const char * CC svdb_tabname( void * self, const int tab_id )
+{
+    const char * res = NULL;
+    p_svdb_tab tab = svdb_get_tab( self, tab_id );
+    if ( tab != NULL )
+    {
+        res = tab->name;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_count_cols( void * self, const int tab_id, const int selection )
+{
+    int res = 0;
+    p_svdb_tab tab = svdb_get_tab( self, tab_id );
+    if ( tab != NULL )
+    {
+        Vector * v = svdb_get_column_vector( tab, selection );
+        res = VectorLength( v );
+    }
+    return res;
+}
+
+
+MOD_EXPORT const char * CC svdb_colname( void * self, const int tab_id,
+            const int selection, const int col_id )
+{
+    const char * res = NULL;
+    p_svdb_col col = svdb_get_col( self, tab_id, selection, col_id );
+    if ( col != NULL )
+    {
+        res = col->name;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_dflt_type_idx( void * self, const int tab_id,
+            const int selection, const int col_id )
+{
+    int res = -1;
+    p_svdb_col col = svdb_get_col( self, tab_id, selection, col_id );
+    if ( col != NULL )
+    {
+        res = col->dflt_type_idx;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_count_types( void * self, const int tab_id,
+            const int selection, const int col_id )
+{
+    int res = 0;
+    p_svdb_col col = svdb_get_col( self, tab_id, selection, col_id );
+    if ( col != NULL )
+    {
+        res = VectorLength( &col->types );
+    }
+    return res;
+}
+
+
+static p_svdb_type svdb_get_type( void * self, const int tab_id,
+            const int selection, const int col_id, const int type_id )
+{
+    p_svdb_type res = NULL;
+    p_svdb_col col = svdb_get_col( self, tab_id, selection, col_id );
+    if ( col != NULL )
+    {
+        res = VectorGet ( &col->types, type_id );
+    }
+    return res;
+}
+
+
+MOD_EXPORT const char * CC svdb_typename( void * self, const int tab_id,
+            const int selection, const int col_id, const int type_id )
+{
+    const char * res = NULL;
+    p_svdb_type type = svdb_get_type( self, tab_id, selection, col_id, type_id );
+    if ( type != NULL )
+    {
+        res = type->name;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_type_idx( void * self, const int tab_id,
+            const int selection, const int col_id, const char * name )
+{
+    int res = -1;
+    p_svdb_col col = svdb_get_col( self, tab_id, selection, col_id );
+    if ( col != NULL )
+    {
+        int i, n = VectorLength( &col->types );
+        for ( i = 0; i < n && res < 0; ++i )
+        {
+            p_svdb_type type = VectorGet ( &col->types, i );
+            if ( type != NULL )
+            {
+                if ( svdb_strcmp( type->name, name ) == 0 )
+                {
+                    res = i;
+                }
+            }
+        }   
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_typedomain( void * self, const int tab_id,
+            const int selection, const int col_id, const int type_id )
+{
+    int res = -1;
+    p_svdb_type type = svdb_get_type( self, tab_id, selection, col_id, type_id );
+    if ( type != NULL )
+    {
+        res = type->typedesc.domain;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_typebits( void * self, const int tab_id,
+            const int selection, const int col_id, const int type_id )
+{
+    int res = -1;
+    p_svdb_type type = svdb_get_type( self, tab_id, selection, col_id, type_id );
+    if ( type != NULL )
+    {
+        res = type->typedesc.intrinsic_bits;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_typedim( void * self, const int tab_id,
+            const int selection, const int col_id, const int type_id )
+{
+    int res = -1;
+    p_svdb_type type = svdb_get_type( self, tab_id, selection, col_id, type_id );
+    if ( type != NULL )
+    {
+        res = type->typedesc.intrinsic_dim;
+    }
+    return res;
+}
+
+
+static void svdb_replace_string( const char **dst, const char * s )
+{
+    free_if_not_null( *dst );
+    *dst = string_dup_measure ( s, NULL );
+}
+
+
+static void svdb_set_tab_elem_separator( p_svdb_tab tab,
+            const int selection, const int col_id, const char * s )
+{
+    Vector * v = svdb_get_column_vector( tab, selection );
+    if ( col_id >= 0 )
+    {
+        p_svdb_col col = VectorGet ( v, col_id );
+        if ( col != NULL )
+        {
+            svdb_replace_string( &col->elem_separator, s );
+        }
+    }
+    else
+    {
+        int i, n = VectorLength( v );
+        for ( i = 0; i < n; ++ i )
+        {
+            p_svdb_col col = VectorGet ( v, i );
+            if ( col != NULL )
+            {
+                svdb_replace_string( &col->elem_separator, s );
+            }
+        }
+    }
+}
+
+
+MOD_EXPORT void CC svdb_set_elem_separator( void * self,
+            const int tab_id, const int selection, const int col_id,
+            const char * s )
+{
+    if ( self != NULL && s != NULL && s[0] != 0 )
+    {
+        p_svdb_conn pself = self;
+        if ( tab_id >= 0 )
+        {
+            p_svdb_tab tab = VectorGet ( &pself->tables, tab_id );
+            if ( tab != NULL )
+            {
+                svdb_set_tab_elem_separator( tab, selection, col_id, s );
+            }
+        }
+        else
+        {
+            int i, n = VectorLength( &pself->tables );
+            for ( i = 0; i < n; ++ i )
+            {
+                p_svdb_tab tab = VectorGet ( &pself->tables, i );
+                if ( tab != NULL )
+                {
+                    svdb_set_tab_elem_separator( tab, selection, col_id, s );
+                }
+            }
+        }
+    }
+}
+
+
+static void svdb_set_tab_dim_separator( p_svdb_tab tab,
+            const int selection, const int col_id, const char * s )
+{
+    Vector * v = svdb_get_column_vector( tab, selection );
+    if ( col_id >= 0 )
+    {
+        p_svdb_col col = VectorGet ( v, col_id );
+        if ( col != NULL )
+        {
+            svdb_replace_string( &col->dim_separator, s );
+        }
+    }
+    else
+    {
+        int i, n = VectorLength( v );
+        for ( i = 0; i < n; ++ i )
+        {
+            p_svdb_col col = VectorGet ( v, i );
+            if ( col != NULL )
+            {
+                svdb_replace_string( &col->dim_separator, s );
+            }
+        }
+    }
+}
+
+
+MOD_EXPORT void CC svdb_set_dim_separator( void * self,
+            const int tab_id, const int selection, const int col_id,
+            const char * s )
+{
+    if ( self != NULL && s != NULL && s[0] != 0 )
+    {
+        p_svdb_conn pself = self;
+        if ( tab_id >= 0 )
+        {
+            p_svdb_tab tab = VectorGet ( &pself->tables, tab_id );
+            if ( tab != NULL )
+            {
+                svdb_set_tab_dim_separator( tab, selection, col_id, s );
+            }
+        }
+        else
+        {
+            int i, n = VectorLength( &pself->tables );
+            for ( i = 0; i < n; ++ i )
+            {
+                p_svdb_tab tab = VectorGet ( &pself->tables, i );
+                if ( tab != NULL )
+                {
+                    svdb_set_tab_dim_separator( tab, selection, col_id, s );
+                }
+            }
+        }
+    }
+}
+
+
+MOD_EXPORT int CC svdb_is_enabled( void * self, const int tab_id,
+            const int selection, const int col_id )
+{
+    int res = 0;
+    p_svdb_col col = svdb_get_col( self, tab_id, selection, col_id );
+    if ( col != NULL )
+    {
+        res = col->enabled;
+    }
+    return res;
+}
+
+
+static void svdb_set_columns_usage( p_svdb_tab tab, int enabled )
+{
+    Vector * v = svdb_get_column_vector( tab, 0 );
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n; ++i )
+    {
+        p_svdb_col col = VectorGet ( v, i );
+        if ( col != NULL )
+        {
+            col->enabled = enabled;
+            col->open = 0;
+            free_if_not_null( col->cast );
+            col->cast = NULL;
+        }
+    }
+}
+
+
+static p_svdb_col svdb_find_col( p_svdb_tab tab, const char *name )
+{
+    p_svdb_col res = NULL;
+    Vector * v = svdb_get_column_vector( tab, 0 );
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i )
+    {
+        p_svdb_col col = VectorGet ( v, i );
+        if ( col != NULL )
+        {
+            if ( svdb_strcmp( col->name, name ) == 0 )
+            {
+                res = col;
+            }
+        }
+    }
+    return res;
+}
+
+
+static void svdb_trim( char * s )
+{
+    int i, l = string_measure( s, NULL );
+    for ( i = 0; i < l; ++i )
+    {
+        if ( s[ i ] == ' ' )
+        {
+            s[ i ] = 0;
+        }
+    }
+    while( s[ 0 ] == 0 )
+    {
+        memmove( s, &s[1], l );
+    }
+}
+
+static void svdb_enable_col( p_svdb_tab tab, const char *defline,
+                             int start_cast, int end_cast, int start_name, int end_name )
+{
+    char * cast = NULL;
+    char * name = NULL;
+    int l = ( end_cast - start_cast );
+    if ( l > 1 )
+    {
+        cast = calloc( 1, l );
+        if ( cast != NULL )
+        {
+            memmove( cast, &defline[ start_cast + 1 ], l-1 );
+            svdb_trim( cast );
+        }
+    }
+
+    l = ( end_name - start_name );
+    if ( l > 0 )
+    {
+        name = calloc( 1, l + 1 );
+        if ( name != NULL )
+        {
+            memmove( name, &defline[ start_name ], l );
+            svdb_trim( name );
+        }
+    }
+
+    if ( name != NULL )
+    {
+        p_svdb_col col = svdb_find_col( tab, name );
+        if ( col != NULL )
+        {
+            col->enabled = true;
+            free_if_not_null( col->cast );
+            if ( cast != NULL )
+            {
+                col->cast = string_dup_measure ( cast, NULL );
+            }
+        }
+    }
+
+    free_if_not_null( cast );
+    free_if_not_null( name );
+}
+
+
+static void svdb_defline( p_svdb_tab tab, const char *defline )
+{
+    if ( defline == NULL || defline[0] == 0 )
+    {
+        /* if defline is empty, enable all columns without a cast */
+        svdb_set_columns_usage( tab, 1 );
+    }
+    else
+    {
+        int start_cast = -1;
+        int end_cast = -1;
+        int start_name = 0;
+        int i, l = string_measure ( defline, NULL );
+
+        /* disable all columns first, clear all casts */
+        svdb_set_columns_usage( tab, 0 );
+        /* enable only what is in the defline "(CAST1)NAME1,(CAST2)NAME2,NAME3"*/
+        for ( i = 0; i < l; ++i )
+        {
+            switch ( defline[ i ] )
+            {
+            case '(' : start_cast = i; break;
+            case ')' : end_cast = i; start_name = i+1; break;
+            case ',' : svdb_enable_col( tab, defline, start_cast, end_cast, start_name, i );
+                       start_cast = end_cast = -1;
+                       start_name = i+1;
+                       break;
+            }
+        }
+        svdb_enable_col( tab, defline, start_cast, end_cast, start_name, l );
+    }
+}
+
+
+static int svdb_add_to_cursor( p_svdb_tab tab )
+{
+    int res = 0;
+    rc_t rc = 0;
+    Vector * v = svdb_get_column_vector( tab, 0 );
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && rc == 0; ++i )
+    {
+        p_svdb_col col = VectorGet ( v, i );
+        if ( col != NULL && col->enabled )
+        {
+            if ( col->cast != NULL )
+            {
+                rc = VCursorAddColumn ( tab->cursor, &col->cur_idx, "(%s)%s", col->cast, col->name );
+            }
+            else
+            {
+                rc = VCursorAddColumn ( tab->cursor, &col->cur_idx, "%s", col->name );
+            }
+            if ( rc != 0 )
+            {
+                LOGERR( klogInt, rc, "VCursorAddColumn() failed in svdb_add_to_cursor()" );
+            }
+            else
+            {
+                col->open = 1;
+                ++res;
+            }
+        }
+    }
+    return res;
+}
+
+
+static void svdb_read_cursor_data_types( p_svdb_tab tab )
+{
+    Vector * v = svdb_get_column_vector( tab, 0 );
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n; ++i )
+    {
+        p_svdb_col col = VectorGet ( v, i );
+        if ( col != NULL && col->open )
+        {
+            rc_t rc = VCursorDatatype ( tab->cursor, col->cur_idx,
+                              &col->cursor_typedecl, &col->cursor_typedesc );
+            free_if_not_null( col->cur_typedecl );
+            if ( rc == 0 )
+            {
+                char buf[ 64 ];
+                rc = VTypedeclToText( &col->cursor_typedecl, tab->conn->schema,
+                                      buf, sizeof( buf ) );
+                if ( rc == 0 )
+                {
+                    col->cur_typedecl = string_dup_measure ( buf, NULL );
+                    col->value_trans = sra_get_value_trans_func( tab->conn->schema, &col->cursor_typedecl );
+                    col->dim_trans = sra_get_dim_trans_func( tab->conn->schema, &col->cursor_typedecl );
+                }
+            }
+        }
+    }
+}
+
+
+static void svdb_discover_static_columns( p_svdb_tab tab )
+{
+    Vector * v = svdb_get_column_vector( tab, ALL_COLUMNS );
+    uint32_t idx, i, n = VectorLength( v );
+    int64_t first;
+    uint64_t range;
+
+    tab->first = 0;
+    tab->range = 0;
+    for ( i = 0; i < n; ++i )
+    {
+        p_svdb_col col = VectorGet ( v, i );
+        if ( col != NULL && col->open )
+        {
+            rc_t rc = VCursorIdRange ( tab->cursor, col->cur_idx, &first, &range );
+            if ( rc == 0 )
+            {
+                if ( range == 0 )
+                {
+                    VectorAppend ( &tab->static_columns, &idx, col );
+                }
+                else
+                {
+                    VectorAppend ( &tab->non_static_columns, &idx, col );
+                    if ( tab->range == 0 )
+                    {
+                        tab->first = first;
+                        tab->range = range;
+                    }
+                }
+            }
+        }
+    }
+}
+
+
+MOD_EXPORT int CC svdb_open_table( void * self, const int tab_id,
+            const char *defline )
+{
+    int res = -1;
+    p_svdb_tab tab = svdb_get_tab( self, tab_id );
+    if ( tab != NULL )
+    {
+        rc_t rc;
+        svdb_clear_vector( &tab->static_columns );
+        svdb_clear_vector( &tab->non_static_columns );
+        svdb_defline( tab, defline );
+        if ( tab->cursor != NULL )
+        {
+            rc = VCursorRelease( tab->cursor );
+            if ( rc != 0 )
+            {
+                LOGERR( klogInt, rc, "VCursorRelease() failed in svdb_open_table()" );
+            }
+        }
+        rc = VTableCreateCursorRead ( tab->tab, &tab->cursor );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VTableCreateCursorRead() failed in svdb_open_table()" );
+        }
+        else
+        {
+            res = svdb_add_to_cursor( tab );
+            if ( res > 0 )
+            {
+                rc = VCursorOpen ( tab->cursor );
+                if ( rc == 0 )
+                {
+                    svdb_read_cursor_data_types( tab );
+                    svdb_discover_static_columns( tab );
+                }
+                else
+                {
+                    LOGERR( klogInt, rc, "VCursorOpen() failed in svdb_open_table()" );
+                    res = -1;
+                }
+            }
+        }
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_max_colname_length( void * self,
+            const int tab_id, const int selection )
+{
+    int res = 0;
+    p_svdb_tab tab = svdb_get_tab( self, tab_id );
+    if ( tab != NULL )
+    {
+        Vector * v = svdb_get_column_vector( tab, selection );
+        uint32_t i, n = VectorLength( v );
+        for ( i = 0; i < n; ++i )
+        {
+            p_svdb_col col = VectorGet ( v, i );
+            if ( col != NULL && col->enabled )
+            {
+                int l = string_measure ( col->name, NULL );
+                if ( l > res )
+                {
+                    res = l;
+                }
+            }
+        }
+    }
+    return res;
+}
+
+
+MOD_EXPORT unsigned long long int CC svdb_row_range( void * self,
+            const int tab_id )
+{
+    unsigned long long int res = 0;
+    p_svdb_tab tab = svdb_get_tab( self, tab_id );
+    if ( tab != NULL )
+    {
+        res = tab->range;
+    }
+    return res;
+}
+
+
+MOD_EXPORT signed long long int CC svdb_first_row( void * self,
+            const int tab_id )
+{
+    signed long long int res = 0;
+    p_svdb_tab tab = svdb_get_tab( self, tab_id );
+    if ( tab != NULL )
+    {
+        res = tab->first;
+    }
+    return res;
+}
+
+static void svdb_print_char( p_print_ctx dst, const char c )
+{
+    if ( dst->printed < dst->buf_len )
+    {
+        dst->buf[ ( dst->printed )++ ] = c;
+    }
+    ( dst->needed )++;
+}
+
+
+static void svdb_print_str( p_print_ctx dst, const char * s )
+{
+    while( *s > 0 )
+    {
+        svdb_print_char( dst, *(s++) );
+    }
+}
+
+
+#define BYTE_OFFSET(VALUE)  ( (VALUE) >> 3 )
+#define BIT_OFFSET(VALUE)   ( (VALUE) & 0x7 )
+
+uint8_t BitLength2Bytes[65] =
+{
+         /* 0  1  2  3  4  5  6  7  8  9*/
+   /* 0 */  0, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+   /* 1 */  2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
+   /* 2 */  3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
+   /* 3 */  4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
+   /* 4 */  5, 6, 6, 6, 6, 6, 6, 6, 6, 7,
+   /* 5 */  7, 7, 7, 7, 7, 7, 7, 8, 8, 8,
+   /* 6 */  8, 8, 8, 8, 8
+};
+
+/*************************************************************************************
+n_bits   [IN] ... number of bits
+
+calculates the number of bytes that have to be copied to contain the given
+number of bits
+*************************************************************************************/
+static uint16_t bitlength_2_bytes( const size_t n_bits )
+{
+    if ( n_bits > 64 )
+        return 8;
+    else
+        return BitLength2Bytes[ n_bits ];
+}
+
+uint64_t BitLength2Mask[33] =
+{
+   /* 0 */ 0x00,
+   /* 1 ..  4 */  0x1,                0x3,                0x7,                0xF,
+   /* 5 ..  8 */  0x1F,               0x3F,               0x7F,               0xFF,
+   /* 9 .. 12 */  0x1FF,              0x3FF,              0x7FF,              0xFFF,
+   /*13 .. 16 */  0x1FFF,             0x3FFF,             0x7FFF,             0xFFFF,
+   /*17 .. 20 */  0x1FFFF,            0x3FFFF,            0x7FFFF,            0xFFFFF,
+   /*21 .. 24 */  0x1FFFFF,           0x3FFFFF,           0x7FFFFF,           0xFFFFFF,
+   /*25 .. 28 */  0x1FFFFFF,          0x3FFFFFF,          0x7FFFFFF,          0xFFFFFFF,
+   /*29 .. 32 */  0x1FFFFFFF,         0x3FFFFFFF,         0x7FFFFFFF,         0xFFFFFFFF
+ };
+
+/*************************************************************************************
+n_bits   [IN] ... number of bits
+
+creates a bitmask to mask exactly the given number of bits from a longer value
+*************************************************************************************/
+static uint64_t bitlength_2_mask( const size_t n_bits )
+{
+    uint64_t res;
+    if ( n_bits < 33 )
+        res = BitLength2Mask[ n_bits ];
+    else
+    {
+        if ( n_bits < 65 )
+            res = BitLength2Mask[ n_bits-32 ];
+        else
+            res = 0xFFFFFFFF;
+        res <<= 32;
+        res |= 0xFFFFFFFF;
+    }
+    return res;
+}
+
+
+static void move_to_value( void * dst, p_data_src src )
+{
+    int ofs = ( src->boff + ( src->elem_bits * src->elem_idx ) );
+    char *src_ptr = ( char* )src->base + BYTE_OFFSET( ofs );
+    if ( BIT_OFFSET( ofs ) == 0 )
+    {
+        memmove( dst, src_ptr, bitlength_2_bytes( src->elem_bits ) );
+    }
+    else
+    {
+        bitcpy ( dst, 0, src_ptr, BIT_OFFSET( ofs ), src->elem_bits );
+    }
+}
+
+
+static uint64_t move_to_uint64( p_data_src src )
+{
+    uint64_t value = 0;
+    move_to_value( &value, src );
+    if ( src->elem_bits & 7 )
+    {
+        size_t unpacked = 0;
+        Unpack( src->elem_bits, sizeof( value ), &value, 0, src->elem_bits,
+                NULL, &value, sizeof(value), &unpacked );
+    }
+    value &= bitlength_2_mask( src->elem_bits );
+    return value;
+}
+
+
+static void print_boolean_element( p_svdb_col col, p_print_ctx dst, p_data_src src )
+{
+    uint64_t value = move_to_uint64( src );
+    if ( value == 0 )
+        svdb_print_char( dst, '0' );
+    else
+        svdb_print_char( dst, '1' );
+}
+
+
+static void print_uint_element( p_svdb_col col, p_print_ctx dst, p_data_src src )
+{
+    uint64_t value = move_to_uint64( src );
+    if ( src->elem_idx > 0 )
+    {
+        svdb_print_str( dst, col->elem_separator );
+    }
+    if ( col->value_trans != NULL )
+    {
+
+        const char * s = col->value_trans( (uint32_t)value );
+        if ( s != NULL )
+        {
+            svdb_print_str( dst, s );
+        }
+    }
+    else
+    {
+        char buf[ 32 ];
+        size_t num_writ;
+        if ( string_printf ( buf, sizeof( buf ), &num_writ, "%u", value ) == 0 )
+        {
+            svdb_print_str( dst, buf );
+        }
+    }
+}
+
+
+static void print_int_element( p_svdb_col col, p_print_ctx dst, p_data_src src )
+{
+    int64_t value = (int64_t)move_to_uint64( src );
+    if ( src->elem_idx > 0 )
+    {
+        svdb_print_str( dst, col->elem_separator );
+    }
+    if ( col->value_trans != NULL )
+    {
+        const char * s = col->value_trans( (uint32_t)value );
+        if ( s != NULL )
+        {
+            svdb_print_str( dst, s );
+        }
+    }
+    else
+    {
+        rc_t rc;
+        char buf[ 32 ];
+        size_t num_writ;
+        switch ( src->elem_bits )
+        {
+            case  8 : {
+                        int8_t temp = (int8_t)value;
+                        rc = string_printf ( buf, sizeof( buf ), &num_writ, "%d", temp );
+                      }
+                      break;
+            case 16 : {
+                        int16_t temp = (int16_t)value;
+                        rc = string_printf ( buf, sizeof( buf ), &num_writ, "%d", temp );
+                      }
+                      break;
+            case 32 : { 
+                        int32_t temp = (int32_t)value;
+                        rc = string_printf ( buf, sizeof( buf ), &num_writ, "%d", temp );
+                      }
+                      break;
+            case 64 : { 
+                        rc = string_printf ( buf, sizeof( buf ), &num_writ, "%ld", value );
+                      }
+                      break;
+            default : {
+                        rc = string_printf ( buf, sizeof( buf ), &num_writ, "?" );
+                      }
+        }
+        if ( rc == 0 )
+        {
+            svdb_print_str( dst, buf );
+        }
+    }
+}
+
+
+#define MAX_CHARS_FOR_DOUBLE 26
+#define BITSIZE_OF_FLOAT ( sizeof(float) * 8 )
+#define BITSIZE_OF_DOUBLE ( sizeof(double) * 8 )
+static void print_float_element( p_svdb_col col, p_print_ctx dst, p_data_src src )
+{
+    rc_t rc;
+    char buf[ 32 ];
+    size_t num_writ;
+    if ( src->elem_bits == BITSIZE_OF_FLOAT )
+    {
+        float value;
+        move_to_value( &value, src );
+        rc = string_printf ( buf, sizeof( buf ), &num_writ, "%e", value );
+    }
+    else if ( src->elem_bits == BITSIZE_OF_DOUBLE )
+    {
+        double value;
+        move_to_value( &value, src );
+        rc = string_printf ( buf, sizeof( buf ), &num_writ, "%e", value );
+    }
+    else
+    {
+        rc = string_printf ( buf, sizeof( buf ), &num_writ, "unknown float-type" );
+    }
+    if ( rc == 0 )
+    {
+        if ( src->elem_idx > 0 )
+        {
+            svdb_print_str( dst, col->elem_separator );
+        }
+        svdb_print_str( dst, buf );
+    }
+}
+
+
+static void print_ascii_element( p_svdb_col col, p_print_ctx dst, p_data_src src )
+{
+    int ofs = ( src->elem_bits * src->elem_idx );
+    char * src_ptr = (char*)src->base + BYTE_OFFSET( src->boff + ofs );
+    svdb_print_char( dst, *src_ptr );
+}
+
+
+static void print_unicode_element( p_svdb_col col, p_print_ctx dst, p_data_src src )
+{
+    print_ascii_element( col, dst, src );
+}
+
+
+static void svdb_print_domain( p_svdb_col col, p_print_ctx dst, p_data_src src )
+{
+    switch ( col->cursor_typedesc.domain )
+    {
+        case vtdBool    : print_boolean_element( col, dst, src ); break;
+        case vtdUint    : print_uint_element( col, dst, src ); break;
+        case vtdInt     : print_int_element( col, dst, src ); break;
+        case vtdFloat   : print_float_element( col, dst, src ); break;
+        case vtdAscii   : print_ascii_element( col, dst, src ); break;
+        case vtdUnicode : print_unicode_element( col, dst, src ); break;
+    }
+}
+
+
+static void svdb_print_elem( p_svdb_col col, p_print_ctx dst, p_data_src src )
+{
+    uint32_t dim = col->cursor_typedesc.intrinsic_dim;
+
+    if ( dim == 1 )
+    {
+        for ( src->elem_idx = 0; src->elem_idx < src->row_len; ++(src->elem_idx) )
+        {
+            svdb_print_domain( col, dst, src );
+        }
+    }
+    else
+    {
+        data_src sub_src;
+        sub_src.base = src->base;
+        sub_src.boff = src->boff;
+        sub_src.elem_bits = ( src->elem_bits / dim );
+        for ( src->elem_idx = 0; src->elem_idx < src->row_len; ++(src->elem_idx ) )
+        {
+            char sep = col->dim_separator[0];
+            svdb_print_char( dst, sep );
+
+            if ( col->dim_trans != NULL )
+            {
+                char * s;
+                const uint8_t *src_ptr = sub_src.base;
+                src_ptr += BYTE_OFFSET( sub_src.boff );
+                s = col->dim_trans( src_ptr );
+                if ( s != NULL )
+                {
+                    svdb_print_str( dst, s );
+                }
+            }
+            else
+            {
+                for ( sub_src.elem_idx = 0; sub_src.elem_idx < dim; ++sub_src.elem_idx )
+                {
+                    svdb_print_domain( col, dst, &sub_src );
+                }
+            }
+
+            sep = col->dim_separator[1];
+            if ( sep == 0 )
+            {
+                sep = col->dim_separator[0];
+            }
+            svdb_print_char( dst, sep );
+            sub_src.boff += src->elem_bits;
+        }
+    }
+}
+
+
+MOD_EXPORT int CC svdb_element_count( void * self,
+            const int tab_id, const int selection, const int col_id,
+            const unsigned long long int row )
+{
+    int res = 0;
+    p_svdb_col col = svdb_get_col( self, tab_id, selection, col_id );
+    if ( col != NULL && row < col->tab->range && col->open )
+    {
+        data_src data;
+        int64_t row_id = col->tab->first + row;
+        rc_t rc = VCursorCellDataDirect ( col->tab->cursor, row_id, col->cur_idx,
+                     &data.elem_bits, &data.base, &data.boff, &data.row_len );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VCursorCellDataDirect() failed in element_count()" );
+        }
+        else
+        {
+            if ( data.row_len > 0 )
+            {
+                res = data.row_len;
+            }
+        }
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_element( void * self, char * buf, int buflen,
+            const int tab_id, const int selection, const int col_id, const int elem_id,
+            const unsigned long long int row )
+{
+    int res = 0;
+    p_svdb_col col;
+    buf[ 0 ] = 0;
+    col = svdb_get_col( self, tab_id, selection, col_id );
+    if ( col != NULL && row < col->tab->range && col->open )
+    {
+        rc_t rc;
+        data_src data;
+        print_ctx dst;
+        int64_t row_id = col->tab->first + row;
+
+        svdb_init_print_ctx( &dst, buf, buflen - 1 );
+        rc = VCursorCellDataDirect ( col->tab->cursor, row_id, col->cur_idx,
+                &data.elem_bits, &data.base, &data.boff, &data.row_len );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VCursorCellDataDirect() failed in svdb_element()" );
+        }
+        else
+        {
+/*
+            if ( data.row_len > 0 && elem_id < data.row_len )
+            {
+
+            }
+*/
+        }
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_cell( void * self, char * buf, int buflen,
+           const int tab_id, const int selection, const int col_id,
+           const unsigned long long int row )
+{
+    int res = 0;
+    p_svdb_col col;
+    buf[ 0 ] = 0;
+    col = svdb_get_col( self, tab_id, selection, col_id );
+    if ( col != NULL && row < col->tab->range && col->open )
+    {
+        data_src data;
+        int64_t row_id = col->tab->first + row;
+        rc_t rc = VCursorCellDataDirect ( col->tab->cursor, row_id, col->cur_idx,
+                         &data.elem_bits, &data.base, &data.boff, &data.row_len );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VCursorCellDataDirect() failed in svdb_cell()" );
+        }
+        else
+        {
+            if ( data.row_len > 0 )
+            {
+                print_ctx dst;
+
+                svdb_init_print_ctx( &dst, buf, buflen - 1 );
+                svdb_print_elem( col, &dst, &data ); /* <--- */
+                dst.buf[ dst.printed ] = 0;
+                res = dst.needed;
+            }
+        }
+    }
+    return res;
+}
+
+
+static int svdb_find_bufsize( p_svdb_col col, data_src *data )
+{
+    char buf[ 8 ];
+    print_ctx dst;
+
+    svdb_init_print_ctx( &dst, buf, sizeof buf );
+    svdb_print_elem( col, &dst, data ); /* <--- */
+    return dst.needed + 1;
+}
+
+
+MOD_EXPORT unsigned long long int CC svdb_find_fwd( void * self, const int tab_id,
+            const int selection, const int col_id, const unsigned long long int row,
+            const int chunksize, const char * pattern )
+{
+    unsigned long long int res = INVALID_ROW;
+    p_svdb_col col = svdb_get_col( self, tab_id, selection, col_id );
+    if ( col != NULL && row < col->tab->range && col->open && pattern != NULL )
+    {
+        int64_t search_row = row;
+        rc_t rc = 0;
+        int buf_size = 0;
+        int chunk = 0;
+        char * buf = NULL;
+
+        while( ( rc == 0 ) && 
+                ( res == INVALID_ROW ) &&
+                ( (uint64_t)search_row < col->tab->range ) &&
+                ( chunk < chunksize ) )
+        {
+            data_src data;
+            int64_t row_id = col->tab->first + search_row;
+            rc = VCursorCellDataDirect ( col->tab->cursor, row_id, col->cur_idx,
+                         &data.elem_bits, &data.base, &data.boff, &data.row_len );
+            if ( rc == 0 )
+            {
+                int this_size = svdb_find_bufsize( col, &data );
+                ++chunk;
+                if ( this_size > buf_size )
+                {
+                    buf_size = this_size;
+                    if ( buf != NULL )
+                    {
+                        char * newbuf = realloc( buf, buf_size );
+                        if ( newbuf != NULL )
+                            buf = newbuf;
+                        else
+                        {
+                            free( buf );
+                            buf = NULL;
+                        }
+                    }
+                    else
+                        buf = malloc( buf_size );
+                }
+                if ( buf != NULL )
+                {
+                    print_ctx dst;
+                    svdb_init_print_ctx( &dst, buf, buf_size - 1 );
+                    svdb_print_elem( col, &dst, &data ); /* <--- */
+                    dst.buf[ dst.printed ] = 0;
+                    if ( strstr ( buf, pattern ) != NULL )
+                    {
+                        res = search_row;
+                    }
+                }
+                search_row++;
+            }
+        }
+        if ( ( chunk == chunksize )&&( res == INVALID_ROW ) )
+        {
+            res = 0xFFFFFFFFFFFFFFFE;
+        }
+        if ( buf != NULL )
+            free( buf );
+    }
+    return res;
+}
+
+
+MOD_EXPORT unsigned long long int CC svdb_find_bwd( void * self, const int tab_id,
+            const int selection, const int col_id, const unsigned long long int row,
+            const int chunksize, const char * pattern )
+{
+    unsigned long long int res = INVALID_ROW;
+    p_svdb_col col;
+    col = svdb_get_col( self, tab_id, selection, col_id );
+    if ( col != NULL && row < col->tab->range && col->open && pattern != NULL )
+    {
+        int64_t search_row = row;
+        rc_t rc = 0;
+        int buf_size = 0;
+        int chunk = 0;
+        char * buf = NULL;
+
+        while( ( rc == 0 ) && ( res == INVALID_ROW ) &&
+               ( search_row >= 0 ) && ( chunk < chunksize ) )
+        {
+            data_src data;
+            int64_t row_id = col->tab->first + search_row;
+            rc = VCursorCellDataDirect ( col->tab->cursor, row_id, col->cur_idx,
+                         &data.elem_bits, &data.base, &data.boff, &data.row_len );
+            if ( rc == 0 )
+            {
+                int this_size = svdb_find_bufsize( col, &data );
+                ++chunk;
+                if ( this_size > buf_size )
+                {
+                    buf_size = this_size;
+                    if ( buf != NULL )
+                    {
+                        char * newbuf = realloc( buf, buf_size );
+                        if ( newbuf != NULL )
+                            buf = newbuf;
+                        else
+                        {
+                            free( buf );
+                            buf = NULL;
+                        }
+                    }
+                    else
+                        buf = malloc( buf_size );
+                }
+                if ( buf != NULL )
+                {
+                    print_ctx dst;
+                    svdb_init_print_ctx( &dst, buf, buf_size - 1 );
+                    svdb_print_elem( col, &dst, &data ); /* <--- */
+                    dst.buf[ dst.printed ] = 0;
+                    if ( strstr ( buf, pattern ) != NULL )
+                    {
+                        res = search_row;
+                    }
+                }
+                search_row--;
+            }
+        }
+        if ( ( chunk == chunksize )&&( res == INVALID_ROW ) )
+        {
+            res = 0xFFFFFFFFFFFFFFFE;
+        }
+        if ( buf != NULL )
+            free( buf );
+    }
+    return res;
+}
+
+
+/* **************************************************************************************************************** */
+
+struct svdb_fastq;
+typedef struct svdb_fastq* p_svdb_fastq;
+
+typedef struct svdb_fastq
+{
+    char * path;
+    KDirectory * dir;
+    const VDBManager * mgr;
+    VSchema * schema;
+    const VDatabase * db;
+    const VTable * sequence;
+    const VCursor * cursor;
+    int is_db;
+
+    uint32_t read_idx;
+    uint32_t qual_idx;
+    uint32_t start_idx;
+    uint32_t len_idx;
+    uint32_t name_idx;
+    uint32_t rd_type_idx;
+    uint32_t rd_filter_idx;
+
+} svdb_fastq;
+
+
+MOD_EXPORT void CC svdb_close_fastq( void * self )
+{
+    p_svdb_fastq pself = ( p_svdb_fastq )self;
+    if ( pself != NULL )
+    {
+        rc_t rc = VCursorRelease( pself->cursor );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VCursorRelease() failed in svdb_close_fastq()" );
+        }
+        rc = VTableRelease( pself->sequence );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VTableRelease() failed in svdb_close_fastq()" );
+        }
+        rc = VDatabaseRelease( pself->db );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VDatabaseRelease() failed in svdb_close_fastq()" );
+        }
+        rc = VSchemaRelease( pself->schema );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VSchemaRelease() failed in svdb_close_fastq()" );
+        }
+        rc = VDBManagerRelease( pself->mgr );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "VDBManagerRelease() failed in svdb_close_fastq()" );
+        }
+        rc = KDirectoryRelease( pself->dir );
+        if ( rc != 0 )
+        {
+            LOGERR( klogInt, rc, "KDirectoryRelease() failed in svdb_close_fastq()" );
+        }
+        free_if_not_null( pself->path );
+        free( self );
+    }
+}
+
+
+static bool svdb_KNamelist_contains( const KNamelist * nl, const char * to_find )
+{
+    bool res = false;
+    uint32_t n;
+    rc_t rc = KNamelistCount( nl, &n );
+    if ( rc == 0 && n > 0 )
+    {
+        uint32_t i;
+        for ( i = 0; i < n && !res && rc == 0; ++i )
+        {
+            const char * name;
+            rc = KNamelistGet ( nl, i, &name );
+            if ( rc == 0 && name != NULL )
+                res = ( svdb_strcmp( name, to_find ) == 0 );
+        }
+    }
+    return res;
+}
+
+
+static rc_t svdb_discover_fastq_columns( p_svdb_fastq pself )
+{
+    KNamelist *col_names;
+    rc_t rc = VTableListReadableColumns ( pself->sequence, &col_names );
+    if ( rc == 0 )
+    {
+        pself->read_idx     = INVALID_COL;
+        pself->qual_idx     = INVALID_COL;
+        pself->start_idx    = INVALID_COL;
+        pself->len_idx      = INVALID_COL;
+        pself->name_idx     = INVALID_COL;
+        pself->rd_type_idx  = INVALID_COL;
+        pself->rd_filter_idx= INVALID_COL;
+
+        if ( svdb_KNamelist_contains( col_names, "READ" ) )
+        {
+            rc = VCursorAddColumn ( pself->cursor, &pself->read_idx, "(INSDC:dna:text)READ" );
+            if ( rc != 0 )
+                log_and_err( rc, "VCursorAddColumn( READ ) failed" );
+        }
+
+        if ( rc == 0 && svdb_KNamelist_contains( col_names, "QUALITY" ) )
+        {
+            rc = VCursorAddColumn ( pself->cursor, &pself->qual_idx, "(INSDC:quality:text:phred_33)QUALITY" );
+            if ( rc != 0 )
+                log_and_err( rc, "VCursorAddColumn( QUALITY ) failed" );
+        }
+
+        if ( rc == 0 && svdb_KNamelist_contains( col_names, "READ_START" ) )
+        {
+            rc = VCursorAddColumn ( pself->cursor, &pself->start_idx, "(INSDC:coord:zero)READ_START" );
+            if ( rc != 0 )
+                log_and_err( rc, "VCursorAddColumn( READ_START ) failed" );
+        }
+
+        if ( rc == 0 && svdb_KNamelist_contains( col_names, "READ_LEN" ) )
+        {
+            rc = VCursorAddColumn ( pself->cursor, &pself->len_idx, "(INSDC:coord:len)READ_LEN" );
+            if ( rc != 0 )
+                log_and_err( rc, "VCursorAddColumn( READ_LEN ) failed" );
+        }
+
+        if ( rc == 0 && svdb_KNamelist_contains( col_names, "NAME" ) )
+        {
+            rc = VCursorAddColumn ( pself->cursor, &pself->name_idx, "(ascii)NAME" );
+            if ( rc != 0 )
+                log_and_err( rc, "VCursorAddColumn( NAME ) failed" );
+        }
+
+        if ( rc == 0 && svdb_KNamelist_contains( col_names, "READ_TYPE" ) )
+        {
+            rc = VCursorAddColumn ( pself->cursor, &pself->rd_type_idx, "(INSDC:SRA:xread_type)READ_TYPE" );
+            if ( rc != 0 )
+                log_and_err( rc, "VCursorAddColumn( READ_TYPE ) failed" );
+        }
+
+        if ( rc == 0 && svdb_KNamelist_contains( col_names, "READ_FILTER" ) )
+        {
+            rc = VCursorAddColumn ( pself->cursor, &pself->rd_filter_idx, "(INSDC:SRA:read_filter)READ_FILTER" );
+            if ( rc != 0 )
+                log_and_err( rc, "VCursorAddColumn( READ_FILTER ) failed" );
+        }
+
+        KNamelistRelease( col_names );
+    }
+    return rc;
+}
+
+
+MOD_EXPORT void * CC svdb_open_fastq( const char * path )
+{
+    p_svdb_fastq pself = NULL;
+   if ( path != NULL && path[0] != 0 )
+    {
+        rc_t rc;
+        pself = calloc( 1, sizeof( svdb_fastq ) );
+        if ( pself == NULL )
+        {
+            rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            log_and_err( rc, "calloc() failed in svdb_open_fastq()" );
+        }
+        else
+        {
+            rc = KDirectoryNativeDir( &pself->dir );
+            if ( rc != 0 )
+                log_and_err( rc, "KDirectoryNativeDir() failed in svdb_open_fastq()" );
+
+            if ( rc == 0 )
+            {
+                rc = VDBManagerMakeRead ( &pself->mgr, pself->dir );
+                if ( rc != 0 )
+                    log_and_err( rc, "VDBManagerMakeRead() failed in svdb_open_fastq()" );
+            }
+
+            if ( rc == 0 )
+            {
+                rc = VDBManagerMakeSRASchema( pself->mgr, &pself->schema );
+                if ( rc != 0 )
+                    log_and_err( rc, "VDBManagerMakeSRASchema() failed in svdb_open_fastq()" );
+            }
+
+            if ( rc == 0 )
+            {
+                rc = VDBManagerOpenDBRead( pself->mgr, &pself->db, pself->schema, "%s", path );
+                if ( rc == 0 )
+                {
+                    pself->is_db = 1;
+                    rc = VDatabaseOpenTableRead( pself->db, &pself->sequence, "SEQUENCE" );
+                    if ( rc != 0 )
+                    {
+                        string_printf ( last_err, sizeof last_err, NULL,
+                                        "VDatabaseOpenTableRead('%s')->'%R' failed in svdb_open_fastq()",
+                                        path, rc );
+                        svdb_set_last_err( "VDatabaseOpenTableRead() failed in svdb_open_fastq()" );
+
+                    }
+                }
+                else
+                {
+                    rc = VDBManagerOpenTableRead( pself->mgr, &pself->sequence, pself->schema, "%s", path );
+                    if ( rc != 0 )
+                    {
+                        string_printf ( last_err, sizeof last_err, NULL,
+                                        "VDBManagerOpenTableRead('%s')->'%R' failed in svdb_open_fastq()",
+                                        path, rc );
+                        svdb_set_last_err( "VDBManagerOpenTableRead() failed in svdb_open_fastq()" );
+                    }
+                }
+            }
+
+            if ( rc == 0 )
+            {
+                rc = VTableCreateCursorRead ( pself->sequence, &pself->cursor );
+                if ( rc != 0 )
+                    log_and_err( rc, "VTableCreateCursorRead() failed in svdb_open_fastq()" );
+            }
+
+            if ( rc == 0 )
+                rc = svdb_discover_fastq_columns( pself );
+
+            if ( rc == 0 )
+            {
+                rc = VCursorOpen( pself->cursor );
+                if ( rc != 0 )
+                    log_and_err( rc, "VCursorOpen() failed in svdb_open_fastq()" );
+            }
+    
+            if ( rc == 0 )
+            {
+                pself->path = string_dup_measure ( path, NULL );
+                svdb_set_last_err( "OK" );
+            }
+            else
+            {
+                svdb_close_fastq( pself );
+                pself = NULL;
+            }
+        }
+    }
+    else
+    {
+        svdb_set_last_err( "path empty in svdb_open_fastq()" );
+    }
+    return pself;
+
+}
+
+
+/*
+    returns what the fastq-obj can produce
+    0 ... nothing, handle invalid
+    1 ... only READ ( that means fasta )
+    2 ... READ and QUALITY ( but not spot splitting )
+    3 ... READ, QUALITY and READ_START/READ_LEN ( splitted spots )
+*/
+MOD_EXPORT int CC svdb_fastq_scope( void * self )
+{
+    int res = 0;
+    if ( self != NULL )
+    {
+        p_svdb_fastq pself = self;
+        if ( pself->read_idx != INVALID_COL )
+        {
+            if ( pself->qual_idx != INVALID_COL )
+            {
+                if ( pself->start_idx != INVALID_COL &&
+                     pself->len_idx != INVALID_COL )
+                    res = 3;
+                else
+                    res = 2;
+            }
+            else res = 1;
+        }
+    }
+    return res;
+}
+
+
+static int svdb_fastq_without_name_col( p_svdb_fastq pself, char * buf, int buflen,
+                                        int seq, const unsigned long long int row )
+{
+    int res = 0;
+    uint32_t elem_bits, boff, data_len;
+    const char * data = NULL;
+
+    rc_t rc = VCursorCellDataDirect( pself->cursor, row, pself->read_idx, &elem_bits,
+                            (const void**)&data, &boff, &data_len );
+    if ( rc == 0 )
+    {
+        size_t num_writ;
+        if ( seq > 0 )
+            rc = string_printf ( buf, buflen, &num_writ, "%s.%li length=%u/%u",
+                                 pself->path, row, data_len, seq );
+        else
+            rc = string_printf ( buf, buflen, &num_writ, "%s.%li length=%u",
+                                 pself->path, row, data_len );
+        if ( rc == 0 )
+            res = (int)num_writ;
+    }
+
+    return res;
+}
+
+
+static int svdb_fastq_with_name_col( p_svdb_fastq pself, char * buf, int buflen,
+                                     int seq, const unsigned long long int row )
+{
+    int res = 0;
+    uint32_t elem_bits, boff, name_len;
+    const char * name = NULL;
+
+    rc_t rc = VCursorCellDataDirect( pself->cursor, row, pself->name_idx, &elem_bits,
+                                (const void**)&name, &boff, &name_len );
+    if ( rc == 0 )
+    {
+        uint32_t data_len;
+        size_t num_writ;
+        if ( seq > 0 )
+        {
+            uint32_t * data = NULL;
+            rc = VCursorCellDataDirect( pself->cursor, row, pself->len_idx, &elem_bits,
+                                    (const void**)&data, &boff, &data_len );
+            if ( rc == 0 )
+                rc = string_printf ( buf, buflen, &num_writ, "%s.%li %.*s length=%u/%u",
+                                     pself->path, row, name_len, name, data[ seq - 1 ], seq );
+        }
+        else
+        {
+            const char * data = NULL;
+            rc = VCursorCellDataDirect( pself->cursor, row, pself->read_idx, &elem_bits,
+                                    (const void**)&data, &boff, &data_len );
+            if ( rc == 0 )
+                rc = string_printf ( buf, buflen, &num_writ, "%s.%li %.*s length=%u",
+                                     pself->path, row, name_len, name, data_len );
+
+        }
+        if ( rc == 0 ) res = (int)num_writ;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_fastq_name( void * self, char * buf, int buflen,
+                                   int seq, const unsigned long long int row )
+{
+    int res = 0;
+    if ( self != NULL )
+    {
+        p_svdb_fastq pself = self;
+        if ( pself->name_idx != INVALID_COL )
+            res = svdb_fastq_with_name_col( pself, buf, buflen, seq, row );
+        else
+            res = svdb_fastq_without_name_col( pself, buf, buflen, seq, row );
+    }
+    return res;
+}
+
+
+static int svdb_fastq_data_ptr( p_svdb_fastq pself, const char ** buf, uint32_t src_idx,
+                                int seq, const unsigned long long int row )
+{ 
+    int res = 0;
+    uint32_t elem_bits, boff, data_len;
+    const char * data = NULL;
+    rc_t rc = VCursorCellDataDirect( pself->cursor, row, src_idx, &elem_bits,
+                            (const void**)&data, &boff, &data_len );
+    if ( rc == 0 )
+    {
+        if ( seq > 0 )
+        {
+            uint32_t read_start_len, read_len_len;
+            uint32_t * read_start = NULL;
+            uint32_t * read_len = NULL;
+            rc = VCursorCellDataDirect( pself->cursor, row, pself->start_idx, &elem_bits,
+                                        (const void**)&read_start, &boff, &read_start_len );
+            if ( rc == 0 )
+                rc = VCursorCellDataDirect( pself->cursor, row, pself->len_idx, &elem_bits,
+                                            (const void**)&read_len, &boff, &read_len_len );
+            if ( rc == 0 && seq <= (int)read_start_len && seq <= (int)read_len_len )
+            {
+                uint32_t start  = read_start[ seq - 1 ];
+                res = read_len[ seq - 1 ];
+                *buf = &data[ start ];
+            }
+        }
+        else
+        {
+            *buf = data;
+            res = data_len;
+        }
+    }
+    return res;
+}
+
+
+static int svdb_fastq_data( p_svdb_fastq pself, char * buf, int buflen, uint32_t src_idx,
+                            int seq, const unsigned long long int row )
+{ 
+    const char * src = NULL;
+    int res = svdb_fastq_data_ptr( pself, &src, src_idx, seq, row );
+    if ( res > 0 && src != NULL )
+    {
+        size_t num_writ;
+        rc_t rc = string_printf ( buf, buflen, &num_writ, "%.*s", res, src );
+        if ( rc == 0 ) res = (int)num_writ;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_fastq_readcount( void * self, const unsigned long long int row )
+{
+    int res = 0;
+    if ( self != NULL )
+    {
+        uint32_t elem_bits, boff, data_len;
+        const char * data = NULL;
+        p_svdb_fastq pself = self;
+        rc_t rc = VCursorCellDataDirect( pself->cursor, row, pself->start_idx, &elem_bits,
+                                         (const void**)&data, &boff, &data_len );
+        if ( rc == 0 )
+            res = data_len;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_fastq_sequence( void * self, char * buf, int buflen,
+                                       int seq, const unsigned long long int row )
+{
+    int res = 0;
+    if ( self != NULL )
+    {
+        p_svdb_fastq pself = self;
+        res = svdb_fastq_data( pself, buf, buflen, pself->read_idx, seq, row );
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_fastq_quality( void * self, char * buf, int buflen,
+                                      int seq, const unsigned long long int row )
+{
+    int res = 0;
+    if ( self != NULL )
+    {
+        p_svdb_fastq pself = self;
+        res = svdb_fastq_data( pself, buf, buflen, pself->qual_idx, seq, row );
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_fastq_rd_type_available( void * self )
+{
+    int res = 0;
+    if ( self != NULL )
+    {
+        p_svdb_fastq pself = self;
+        if ( pself->rd_type_idx != INVALID_COL ) res = 1;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_fastq_rd_filter_available( void * self )
+{
+    int res = 0;
+    if ( self != NULL )
+    {
+        p_svdb_fastq pself = self;
+        if ( pself->rd_filter_idx != INVALID_COL ) res = 1;
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_fastq_read_type_is_bio( void * self, int seq, const unsigned long long int row )
+{
+    int res = 0;
+    if ( self != NULL && seq > 0 )
+    {
+        p_svdb_fastq pself = self;
+        if ( pself->rd_type_idx != INVALID_COL )
+        {
+            uint32_t elem_bits, boff, data_len;
+            const uint8_t * data = NULL;
+            rc_t rc = VCursorCellDataDirect( pself->cursor, row, pself->rd_type_idx, &elem_bits,
+                                             (const void**)&data, &boff, &data_len );
+            if ( rc == 0 && seq <= (int)data_len )
+            {
+                if ( data[ seq - 1 ] & 0x01 ) res = 1;
+            }
+        }
+    }
+    return res;
+}
+
+
+MOD_EXPORT int CC svdb_fastq_read_filter_is_pass( void * self, int seq, const unsigned long long int row )
+{
+    int res = 0;
+    if ( self != NULL && seq > 0 )
+    {
+        p_svdb_fastq pself = self;
+        if ( pself->rd_filter_idx != INVALID_COL )
+        {
+            uint32_t elem_bits, boff, data_len;
+            const uint8_t * data = NULL;
+            rc_t rc = VCursorCellDataDirect( pself->cursor, row, pself->rd_filter_idx, &elem_bits,
+                                             (const void**)&data, &boff, &data_len );
+            if ( rc == 0 && seq <= (int)data_len )
+            {
+                if ( data[ seq - 1 ] == 0 ) res = 1;
+            }
+        }
+    }
+    return res;
+}
+
+
+MOD_EXPORT unsigned long long int CC svdb_fastq_row_count( void * self )
+{
+    unsigned long long int res = 0;
+    if ( self != NULL )
+    {
+        int64_t first;
+        uint64_t range;
+        p_svdb_fastq pself = self;
+        rc_t rc = VCursorIdRange ( pself->cursor, pself->read_idx, &first, &range );
+        if ( rc == 0 )
+            res = range;
+    }
+    return res;
+}
diff --git a/libs/tui/Makefile b/libs/tui/Makefile
new file mode 100644
index 0000000..5bb4d38
--- /dev/null
+++ b/libs/tui/Makefile
@@ -0,0 +1,137 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# tui = Text User Interface ( different from GUI ... )
+
+default: all
+
+TOP ?= $(abspath ../..)
+MODULE = libs/tui
+
+INT_LIBS = \
+	libtui \
+	libtui_cpp
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES =        \
+	$(TUI_OBJ)    \
+	$(TUI_CPP_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+
+#-------------------------------------------------------------------------------
+# tui
+#
+$(ILIBDIR)/libtui: $(addprefix $(ILIBDIR)/libtui.,$(ILIBEXT))
+
+TUI_SRC = \
+	systui \
+	screen \
+	string_cache \
+	eventring \
+	tui \
+	line_policy \
+	tui_palette \
+	tui_widget \
+	tui_widget_label \
+	tui_widget_button \
+	tui_widget_checkbox \
+	tui_widget_inputline \
+	tui_widget_radiobox \
+	tui_widget_string_list \
+	tui_widget_progress \
+	tui_widget_spin_edit \
+	tui_widget_grid \
+	tui_menu \
+	tui_dlg_helper \
+	tui_dlg \
+	dir_dlg \
+	file_dlg \
+	tui_std_dlg
+
+TUI_OBJ = \
+	$(addsuffix .$(LOBX),$(TUI_SRC))
+
+TUI_LIB = \
+	-lklib \
+	-lkfs \
+	-ldl
+
+$(ILIBDIR)/libtui.$(LIBX): $(TUI_OBJ)
+	$(LD) --slib -o $@ $^ $(TUI_LIB)
+
+
+#-------------------------------------------------------------------------------
+# tui_cpp
+#
+$(ILIBDIR)/libtui_cpp: $(addprefix $(ILIBDIR)/libtui_cpp.,$(ILIBEXT))
+
+TUI_CPP_SRC = \
+    tui_cpp
+
+TUI_CPP_OBJ = \
+	$(addsuffix .$(LOBX),$(TUI_CPP_SRC))
+
+TUI_CPP_LIB = \
+	-lklib \
+	-lkfs \
+	-ltui \
+	-ldl
+
+$(ILIBDIR)/libtui_cpp.$(LIBX): $(TUI_CPP_OBJ)
+	$(LD) --slib -o $@ $^ $(TUI_CPP_LIB)
+
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/tui/bsd/systui.c b/libs/tui/bsd/systui.c
new file mode 100644
index 0000000..238d2dc
--- /dev/null
+++ b/libs/tui/bsd/systui.c
@@ -0,0 +1,619 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*--------------------------------------------------------------------------
+ * KTUI = Text User Interface ( different from GUI ... )
+ *  platform specific code ... this one for BSD
+ */
+
+#include <tui/extern.h>
+#include <tui/tui.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+
+#include "../tui-priv.h"
+
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <termios.h>
+#include <signal.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <stdlib.h>
+#include <errno.h>
+#include <assert.h>
+
+typedef uint32_t es_states;
+enum
+{
+    es_normal,
+    es_ESC,
+
+    es_ESC_91,
+    es_ESC_91_49,
+    es_ESC_91_49_49,
+    es_ESC_91_49_50,
+    es_ESC_91_49_51,
+    es_ESC_91_49_52,
+    es_ESC_91_49_53,
+    es_ESC_91_49_55,
+    es_ESC_91_49_56,
+    es_ESC_91_49_57,
+
+    es_ESC_91_50,
+    es_ESC_91_50_48,
+    es_ESC_91_50_49,
+    es_ESC_91_50_51,
+    es_ESC_91_50_52,
+
+    es_ESC_91_51,
+    es_ESC_91_52,
+    es_ESC_91_53,
+    es_ESC_91_54,
+
+    es_ESC_91_77_B,
+    es_ESC_91_77_X,
+    es_ESC_91_77_Y,
+
+    es_ESC_79
+};
+
+
+/**********************************************************************************/
+
+static int color_2_ansi( KTUI_color c )
+{
+    int res = 0;
+    switch( c )
+    {
+        case KTUI_c_black           : res = 0;  break;
+        case KTUI_c_gray            : res = 8;  break;
+
+        case KTUI_c_dark_red        : res = 1;  break;    
+        case KTUI_c_red             : res = 9;  break;
+
+        case KTUI_c_green           : res = 10;  break;
+        case KTUI_c_dark_green      : res = 2; break;
+
+        case KTUI_c_brown           : res = 3;  break;
+        case KTUI_c_yellow          : res = 11; break;
+
+        case KTUI_c_dark_blue       : res = 4;  break;
+        case KTUI_c_blue            : res = 12; break;
+
+        case KTUI_c_dark_magenta    : res = 5;  break;
+        case KTUI_c_magenta         : res = 13; break;
+
+        case KTUI_c_dark_cyan       : res = 6;  break;
+        case KTUI_c_cyan            : res = 14; break;
+
+        case KTUI_c_light_gray      : res = 7;  break;
+        case KTUI_c_white           : res = 15; break;
+    }
+    return res;
+}
+
+
+/**********************************************************************************/
+
+
+static void set_tui_attrib( tui_ac * curr, KTUI_attrib attr )
+{
+    if ( curr->attr != attr )
+    {
+        printf( "\033[0m" ); /* reset attribute, that means also color is default now! */
+        curr->fg = -1;       /* because of that we have to force the re-emission of color */
+        curr->bg = -1;
+
+        if ( attr & KTUI_a_bold )
+            printf( "\033[1m" );
+        if ( attr & KTUI_a_underline )
+            printf( "\033[4m" );
+        if ( attr & KTUI_a_blink )
+            printf( "\033[5m" );
+        if ( attr & KTUI_a_inverse )
+            printf( "\033[7m" );
+
+        curr->attr = attr;
+    }
+}
+
+
+static void set_tui_fg_color( tui_ac * curr, KTUI_color color )
+{
+    if ( curr->fg != color )
+    {
+        printf( "\033[38;5;%dm", color_2_ansi( color ) );
+        curr->fg = color;
+    }
+}
+
+
+static void set_tui_bg_color( tui_ac * curr, KTUI_color color )
+{
+    if ( curr->bg != color )
+    {
+        printf( "\033[48;5;%dm", color_2_ansi( color ) );
+        curr->bg = color;
+    }
+}
+
+
+void CC tui_send_strip( int x, int y, int count, tui_ac * curr, tui_ac * v,
+                        const char * s )
+{
+    set_tui_attrib( curr, v->attr );
+    set_tui_fg_color( curr, v->fg );
+    set_tui_bg_color( curr, v->bg );
+    printf( "\033[%d;%dH%.*s",  y + 1, x + 1, count, s );
+    fflush( stdout );
+}
+
+
+/**********************************************************************************/
+
+typedef struct KTUI_pf
+{
+/*    struct termios stored_settings; */
+    struct termios stored_settings;
+    struct sigaction sa_saved;
+    es_states es;
+    unsigned int mouse_event, mouse_x;
+} KTUI_pf;
+
+
+static struct KTUI * sig_self = NULL;
+
+
+static void get_lines_cols( int * cols, int * lines )
+{
+    struct winsize ws;
+    ioctl( STDIN_FILENO, TIOCGWINSZ, &ws );
+    if ( lines != NULL )
+        *lines = ws.ws_row;
+    if ( cols != NULL )
+        *cols = ws.ws_col;
+}
+
+
+static void sigwinchHandler( int sig )
+{
+    if ( sig_self != NULL )
+    {
+        get_lines_cols( &sig_self->cols, &sig_self->lines );
+        put_window_event( sig_self, sig_self->cols, sig_self->lines );
+    }
+}
+
+
+static void set_kb_raw_mode( struct termios * stored_settings )
+{
+    struct termios new_settings;
+    ioctl( STDIN_FILENO, TIOCGETA, stored_settings );
+    memmove ( &new_settings, stored_settings, sizeof new_settings );
+    new_settings.c_lflag &= ( ~ICANON );    /* exit canonical mode, enter raw mode */
+    new_settings.c_lflag &= ( ~ECHO );      /* don't echo the character */
+    new_settings.c_lflag &= ( ~IEXTEN );    /* don't enable extended input character processing */
+    new_settings.c_lflag &= ( ~ISIG );      /* don't automatically handle control-C */
+    new_settings.c_cc[ VTIME ] = 1;         /* timeout (tenths of a second) */
+    new_settings.c_cc[ VMIN ] = 0;          /* minimum number of characters */
+    ioctl( STDIN_FILENO, TIOCSETA, &new_settings ); /* apply the new settings */
+}
+
+
+static void restore_kb_mode( const struct termios * stored_settings )
+{
+    /* applies the terminal settings supplied as the argument */
+    ioctl( STDIN_FILENO, TIOCSETA, stored_settings );
+}
+
+
+rc_t CC KTUI_Init_platform( KTUI * self )
+{
+    rc_t rc = 0;
+    struct KTUI_pf * pf = malloc( sizeof * pf );
+    if ( pf == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcMemory, rcExhausted );
+    else
+    {
+        struct sigaction sa_new;
+
+        set_kb_raw_mode( &pf->stored_settings );
+        sa_new.sa_flags = 0;
+        sa_new.sa_handler = sigwinchHandler;
+        sigaction( SIGWINCH, &sa_new, &pf->sa_saved );
+        get_lines_cols( &self->cols, &self->lines );
+        pf->es = es_normal;
+
+        printf( "\033[2J" );        /* clrscr */
+        printf( "\033[?25l" );      /* cursor off */
+
+        /* printf( "\033[?9h" );     mouse tracking on ( SET_X10_MOUSE ): mouse-down events, does not work with putty */
+		
+		printf( "\033[?1000h" );     /* mouse tracking on ( SET_VT200_MOUSE ): mouse-up/down events, does work with putty */
+		printf( "\033[?1002h" );     /* mouse tracking on ( SET_BTN_EVENT_MOUSE ): mouse-up/down/move events, does work with putty */
+		/*printf( "\033[?1003h" );      mouse tracking on ( SET_ANY_EVENT_MOUSE ): ??? */
+		
+        fflush( stdout );
+
+        sig_self = self;
+        self->pf = pf;
+    }
+    return rc;
+}
+
+
+rc_t CC KTUI_Destroy_platform ( struct KTUI_pf * pf )
+{
+    if ( pf != NULL )
+    {
+        restore_kb_mode( &pf->stored_settings );
+        sigaction( SIGWINCH, &pf->sa_saved, NULL );
+        free( ( void * ) pf );
+    }
+
+    sig_self = NULL;
+    printf( "\033[0;39;49m" );  /* reset colors */
+    printf( "\033[H" );         /* home */
+    printf( "\033[2J" );        /* clrscr */
+    printf( "\033[?25h" );      /* cursor off */
+
+    /*printf( "\033[?9l" );       mouse tracking X10-style off */
+	printf( "\033[?1000l" );       /* mouse tracking off */	
+	printf( "\033[?1002l" );       /* mouse tracking off */		
+	/*printf( "\033[?1003l" );    mouse tracking off */	
+    fflush( stdout );
+
+    return 0;
+}
+
+
+static void put_kb_event_u( struct KTUI * self, int key, KTUI_key code )
+{
+    if ( self->pf != NULL ) self->pf->es = es_normal;
+    put_kb_event( self, key, code );
+}
+
+
+static void put_kb_alpha( struct KTUI * self, int key )
+{
+    put_kb_event_u( self, key, ktui_alpha );
+}
+
+static void put_kb_alpha_3( struct KTUI * self, int key1, int key2, int key3 )
+{
+    put_kb_alpha( self, key1 );
+    put_kb_alpha( self, key2 );
+    put_kb_alpha( self, key3 );
+}
+
+static void put_kb_alpha_4( struct KTUI * self, int key1, int key2, int key3, int key4 )
+{
+    put_kb_alpha( self, key1 );
+    put_kb_alpha( self, key2 );
+    put_kb_alpha( self, key3 );
+    put_kb_alpha( self, key4 );
+}
+
+static void put_kb_alpha_5( struct KTUI * self, int key1, int key2, int key3, int key4, int key5 )
+{
+    put_kb_alpha( self, key1 );
+    put_kb_alpha( self, key2 );
+    put_kb_alpha( self, key3 );
+    put_kb_alpha( self, key4 );
+    put_kb_alpha( self, key5 );
+}
+
+
+/* -------------------------------------------------------------------------------------
+
+mouse_event	7 6 5 4 3 2 1 0
+						B B
+						0 0 ... left mouse button
+						0 1 ... middle mouse button
+						1 0 ... right mouse button
+						1 1 ... button up ( don't know which one )
+                      S ....... status of Shift key						0x04
+                    M ......... status of Meta key ( Alt )				0x08
+                  C ........... status of Ctrl key						0x10 (16)
+			  0 0 ............. unknown									0x00
+              0 1 ............. button event ( down, up )				0x20
+              1 0 ............. move event ( + button )					0x40
+              1 1 ............. scroll event ( + button )				0x60
+			  
+------------------------------------------------------------------------------------- */
+static void put_mouse_event_u( struct KTUI * self, unsigned int y )
+{
+    if ( self->pf != NULL )
+    {
+		unsigned int ev = self->pf->mouse_event;
+		KTUI_mouse_button b = ktui_mouse_button_none;
+		KTUI_mouse_action a = ktui_mouse_action_none;
+
+		switch( ev & 0x03 )
+		{
+			case 0x00 : b = ktui_mouse_button_left; break;
+			case 0x01 : b = ktui_mouse_button_middle; break;
+			case 0x02 : b = ktui_mouse_button_right; break;
+			case 0x03 : b = ktui_mouse_button_up; break;
+		}
+		
+		switch ( ev & 0x60 )
+		{
+			case 0x20 : a = ktui_mouse_action_button; break;
+			case 0x40 : a = ktui_mouse_action_move; break;
+			case 0x60 : a = ktui_mouse_action_scroll; break;
+		}
+
+		put_mouse_event( self, self->pf->mouse_x, y, b, a, ev );
+        self->pf->es = es_normal;
+    }
+}
+
+static void statemachine( struct KTUI * self, unsigned int x )
+{
+    if ( self->pf != NULL ) switch( self->pf->es )
+    {
+        case es_normal : switch( x )
+                        {
+                            case 10 : put_kb_event_u( self, x, ktui_enter ); break;
+                            case 8  : put_kb_event_u( self, x, ktui_bksp ); break;
+                            case 9  : put_kb_event_u( self, x, ktui_tab ); break;
+                            case 127 : put_kb_event_u( self, x, ktui_bksp ); break;
+                            case 27 : self->pf->es = es_ESC; break;
+                            default : put_kb_alpha( self, x ); break;
+                        } break;
+
+        case es_ESC : switch( x )
+                        {
+                            case 91 : self->pf->es = es_ESC_91; break;
+                            case 79 : self->pf->es = es_ESC_79; break;
+                            default : put_kb_alpha( self, x ); break;
+                        } break;
+
+        case es_ESC_91 : switch( x )
+                        {
+                            case 65 : put_kb_event_u( self, x, ktui_up ); break;
+                            case 66 : put_kb_event_u( self, x, ktui_down ); break;
+                            case 67 : put_kb_event_u( self, x, ktui_right ); break;
+                            case 68 : put_kb_event_u( self, x, ktui_left ); break;
+                            case 69 : put_kb_alpha( self, '5' ); break;
+                            case 70 : put_kb_event_u( self, x, ktui_end ); break;
+                            case 72 : put_kb_event_u( self, x, ktui_home ); break;
+
+                            case 49 : self->pf->es = es_ESC_91_49; break;
+                            case 50 : self->pf->es = es_ESC_91_50; break;
+                            case 51 : self->pf->es = es_ESC_91_51; break;
+                            case 52 : self->pf->es = es_ESC_91_52; break;
+                            case 53 : self->pf->es = es_ESC_91_53; break;
+                            case 54 : self->pf->es = es_ESC_91_54; break;
+
+                            case 77 : self->pf->es = es_ESC_91_77_B; break;   /* mouse reporting */
+
+                            case 90 : put_kb_event_u( self, x, ktui_shift_tab ); break; /* shift tab */
+
+                            default : put_kb_alpha_3( self, 27, 91, x ); break;
+                        } break;
+
+        case es_ESC_91_49 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_home ); break;
+                            case 49  : self->pf->es = es_ESC_91_49_49; break;
+                            case 50  : self->pf->es = es_ESC_91_49_50; break;
+                            case 51  : self->pf->es = es_ESC_91_49_51; break;
+                            case 52  : self->pf->es = es_ESC_91_49_52; break;
+                            case 53  : self->pf->es = es_ESC_91_49_53; break;
+                            case 55  : self->pf->es = es_ESC_91_49_55; break;
+                            case 56  : self->pf->es = es_ESC_91_49_56; break;
+                            case 57  : self->pf->es = es_ESC_91_49_57; break;
+                            default : put_kb_alpha_4( self, 27, 91, 49, x ); break;
+                        } break;
+
+        case es_ESC_91_49_49 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F1 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 49, x ); break;
+                        } break;
+
+        case es_ESC_91_49_50 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F2 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 50, x ); break;
+                        } break;
+
+        case es_ESC_91_49_51 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F3 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 51, x ); break;
+                        } break;
+
+        case es_ESC_91_49_52 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F4 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 52, x ); break;
+                        } break;
+
+        case es_ESC_91_49_53 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F5 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 53, x ); break;
+                        } break;
+
+        case es_ESC_91_49_55 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F6 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 55, x ); break;
+                        } break;
+
+        case es_ESC_91_49_56 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F7 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 56, x ); break;
+                        } break;
+
+        case es_ESC_91_49_57 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F8 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 57, x ); break;
+                        } break;
+
+        case es_ESC_91_50 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_ins ); break;
+                            case 48 : self->pf->es = es_ESC_91_50_48; break;
+                            case 49 : self->pf->es = es_ESC_91_50_49; break;
+                            case 51 : self->pf->es = es_ESC_91_50_51; break;
+                            case 52 : self->pf->es = es_ESC_91_50_52; break;
+                            default : put_kb_alpha_4( self, 27, 91, 50, x ); break;
+                        } break;
+
+        case es_ESC_91_50_48 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F9 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 50, 48, x ); break;
+                        } break;
+
+        case es_ESC_91_50_49 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F10 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 50, 49, x ); break;
+                        } break;
+
+        case es_ESC_91_50_51 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F11 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 50, 51, x ); break;
+                        } break;
+
+        case es_ESC_91_50_52 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F12 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 50, 52, x ); break;
+                        } break;
+
+        case es_ESC_91_51 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_del ); break;
+                            default : put_kb_alpha_4( self, 27, 91, 51, x ); break;
+                        } break;
+
+        case es_ESC_91_52 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_end ); break;
+                            default : put_kb_alpha_4( self, 27, 91, 52, x ); break;
+                        } break;
+
+        case es_ESC_91_53 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_pgup ); break;
+                            default : put_kb_alpha_4( self, 27, 91, 53, x ); break;
+                        } break;
+
+        case es_ESC_91_54 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_pgdn ); break;
+                            default : put_kb_alpha_4( self, 27, 91, 54, x ); break;
+                        } break;
+
+        case es_ESC_79 : switch( x )
+                        {
+                            case 80 : put_kb_event_u( self, x, ktui_F1 ); break;
+                            case 81 : put_kb_event_u( self, x, ktui_F2 ); break;
+                            case 82 : put_kb_event_u( self, x, ktui_F3 ); break;
+                            case 83 : put_kb_event_u( self, x, ktui_F4 ); break;
+                            case 77 : put_kb_event_u( self, x, ktui_enter ); break;
+                            case 65 : put_kb_event_u( self, x, ktui_up ); break;
+                            case 66 : put_kb_event_u( self, x, ktui_down ); break;
+                            case 67 : put_kb_event_u( self, x, ktui_right ); break;
+                            case 68 : put_kb_event_u( self, x, ktui_left ); break;
+
+                            case 70 : put_kb_event_u( self, x, ktui_end ); break;
+                            case 72 : put_kb_event_u( self, x, ktui_home ); break;
+
+                            case 119 : put_kb_alpha( self, '7' ); break;
+                            case 120 : put_kb_alpha( self, '8' ); break;
+                            case 121 : put_kb_alpha( self, '9' ); break;
+                            case 116 : put_kb_alpha( self, '4' ); break;
+                            case 117 : put_kb_alpha( self, '5' ); break;
+                            case 118 : put_kb_alpha( self, '6' ); break;
+                            case 113 : put_kb_alpha( self, '1' ); break;
+                            case 114 : put_kb_alpha( self, '2' ); break;
+                            case 115 : put_kb_alpha( self, '3' ); break;
+                            case 112 : put_kb_alpha( self, '0' ); break;
+                            case 110 : put_kb_alpha( self, '.' ); break;
+
+                            default : put_kb_alpha_3( self, 27, 79, x ); break;
+                        } break;
+
+        case es_ESC_91_77_B :   self->pf->mouse_event = x;
+                                self->pf->es = es_ESC_91_77_X;
+                                break;
+
+        case es_ESC_91_77_X :   self->pf->mouse_x = x - 33;
+                                self->pf->es = es_ESC_91_77_Y;
+                                break;
+
+        case es_ESC_91_77_Y :  put_mouse_event_u( self, x - 33 ); break;
+
+        default : self->pf->es = es_normal; break;
+    }
+
+}
+
+void CC read_from_stdin( struct KTUI * self, uint32_t timeout )
+{
+    fd_set rfds;
+    struct timeval tv;
+    int select_res;
+
+    FD_ZERO( &rfds );
+    FD_SET ( STDIN_FILENO, &rfds );
+    tv.tv_sec  = 0;
+    tv.tv_usec = timeout;
+
+    select_res = select( 1, &rfds, NULL, NULL, &tv );
+    if ( select_res < 0 )
+    {
+        /* error ... */
+    }
+    else if ( select_res == 0 )
+    {
+        /* no input during timeout... */
+    }
+    else
+    {
+        unsigned char in_buffer[ 32 ];
+        int i, n = read( STDIN_FILENO, in_buffer, sizeof in_buffer );
+        for ( i = 0; i < n; ++i )
+        {
+            unsigned int x = ( unsigned int ) in_buffer[ i ];
+            statemachine( self, x );
+        }
+    }
+}
diff --git a/libs/tui/dir_dlg.c b/libs/tui/dir_dlg.c
new file mode 100644
index 0000000..ab5bdbe
--- /dev/null
+++ b/libs/tui/dir_dlg.c
@@ -0,0 +1,470 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <tui/extern.h>
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kfs/directory.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <tui/tui_dlg.h>
+#include "tui-priv.h"
+
+#include <sysalloc.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+typedef struct dir_dlg_data
+{
+    uint32_t dlg_w, dlg_h;
+
+    /* for the inputline */
+    char current_dir_internal[ 4096 ];
+    char parent_dir_internal[ 4096 ];
+	
+    /* a VFS-Manager to do a path-conversion */
+    VFSManager * vfs_mgr;
+
+	/* a native KDirectory to fill the path-list */
+	KDirectory * dir;
+
+    KTUI_color bg1;
+    KTUI_color bg2;
+	
+    bool in_root;
+    bool ok_pressed;
+    bool done;
+    bool allow_dir_create;
+
+} dir_dlg_data;
+
+
+enum
+{
+    ID_CURR = 100,
+    ID_LABEL1,
+    ID_DIRS,
+    ID_B_OK,
+    ID_B_CANCEL,
+    ID_B_CREATE,
+    ID_B_GOTO
+};
+
+
+static void init_dlg_data( dir_dlg_data * data, uint32_t dlg_w, uint32_t dlg_h,
+                           char * path, KTUI_color bg1, KTUI_color bg2, bool allow_dir_create )
+{
+    size_t written;
+
+    data->dlg_w = dlg_w;
+    data->dlg_h = dlg_h;
+
+    VFSManagerMake ( &data->vfs_mgr );
+	KDirectoryNativeDir ( &data->dir );
+
+    native_to_internal( data->vfs_mgr, path, data->current_dir_internal, sizeof data->current_dir_internal, &written );
+
+	data->in_root = ( ( data->current_dir_internal[ 0 ] == '/' ) && ( data->current_dir_internal[ 1 ] == 0 ) );
+	data->parent_dir_internal[ 0 ] = 0;
+    data->done = false;
+    data->ok_pressed = false;
+    data->bg1 = bg1;
+    data->bg2 = bg2;
+    data->allow_dir_create = allow_dir_create;
+}
+
+
+static void destroy_dlg_data( dir_dlg_data * data )
+{
+    if ( data->vfs_mgr != NULL )
+    {
+        VFSManagerRelease ( data->vfs_mgr );
+        data->vfs_mgr = NULL;
+    }
+	if ( data->dir != NULL )
+	{
+		KDirectoryRelease ( data->dir );
+		data->dir = NULL;
+	}
+}
+
+
+static bool create_allowed( dir_dlg_data * data )
+{
+#ifdef WINDOWS
+    return !data->in_root;
+#else
+    return true;
+#endif
+}
+
+static rc_t PopulateDirDlg ( struct KTUIDlg * dlg, dir_dlg_data * data )
+{
+    uint32_t x;
+    rc_t rc = KTUIDlgAddLabel2( dlg, ID_CURR, 1, 2, data->dlg_w - 2, "" );
+
+    if ( rc == 0 )
+        rc = KTUIDlgAddLabel2( dlg, ID_LABEL1, 1, 4, data->dlg_w - 2, "directories:" );
+
+    if ( rc == 0 )
+    {
+        tui_rect r;
+        set_rect( &r, 1, 5, data->dlg_w - 2, data->dlg_h - 8 );
+        rc = KTUIDlgAddList ( dlg, ID_DIRS, &r );
+    }
+
+    x = 1;
+    if ( rc == 0 )
+        rc = KTUIDlgAddBtn2( dlg, ID_B_OK, x, data->dlg_h - 2, 12, "OK" );
+    x += ( 12 + 1 );
+
+    if ( rc == 0 )
+        rc = KTUIDlgAddBtn2( dlg, ID_B_CANCEL, x, data->dlg_h - 2, 22, "Cancel (ESC-ESC)" );
+    x += ( 22 + 1 );
+
+    if ( rc == 0 )
+        rc = KTUIDlgAddBtn2( dlg, ID_B_GOTO, x, data->dlg_h - 2, 12, "Goto" );
+    x += ( 12 + 1 );
+
+    if ( rc == 0 && data->allow_dir_create )
+    {
+        rc = KTUIDlgAddBtn2( dlg, ID_B_CREATE, x, data->dlg_h - 2, 18, "Create Dir" );
+        if ( rc == 0 )
+            rc = KTUIDlgSetWidgetVisible ( dlg, ID_B_CREATE, create_allowed( data ) );
+    }
+
+	if ( rc == 0 )
+		rc = set_native_caption( dlg, data->vfs_mgr, ID_CURR, data->current_dir_internal );
+		
+    if ( rc == 0 )
+        rc = fill_widget_with_dirs( dlg, data->dir, ID_DIRS, data->current_dir_internal, data->parent_dir_internal );
+
+    if ( rc == 0 )
+        rc = KTUIDlgSetFocus( dlg, ID_DIRS );
+    return rc;
+}
+
+
+static void DirDlg_Goto_Parent ( dir_dlg_data * data )
+{
+	char * right_slash = string_rchr ( data->current_dir_internal, string_size ( data->current_dir_internal ), '/' );
+	if ( right_slash != NULL )
+	{
+		size_t written;
+
+		data->in_root = ( right_slash == data->current_dir_internal );
+		if ( data->in_root )
+			data->current_dir_internal[ 1 ] = 0;
+		else
+			*right_slash = 0;
+			
+		string_printf( data->parent_dir_internal, sizeof data->parent_dir_internal, &written, "%s", right_slash + 1 );
+	}
+}
+
+
+static rc_t DirDlg_Goto_Child ( struct KTUIDlg * dlg, dir_dlg_data * data, uint32_t selection )
+{
+	rc_t rc = 0;
+	/* we are goint one directory forward in the tree: */
+	const char * s = KTUIDlgGetWidgetStringByIdx ( dlg, ID_DIRS, selection );
+	if ( s != NULL )
+	{
+		/* add path segment from selection */
+		char temp[ 4096 ];
+		size_t written;
+		
+		if ( data->in_root )
+#ifdef WINDOWS
+			rc = string_printf ( temp, sizeof temp, &written, "/%c", s[ 0 ] );
+#else
+			rc = string_printf ( temp, sizeof temp, &written, "/%s", s );
+#endif
+		else
+			rc = string_printf ( temp, sizeof temp, &written, "%s/%s", data->current_dir_internal, s );
+		
+		if ( rc == 0 )
+			string_copy_measure ( data->current_dir_internal, sizeof data->current_dir_internal, temp );
+
+		data->parent_dir_internal[ 0 ] = 0;
+		data->in_root = false;
+	}
+	return rc;
+}
+
+
+static rc_t DirDlgDirectoryChanged ( struct KTUIDlg * dlg, dir_dlg_data * data, uint32_t selection )
+{
+    rc_t rc = 0;
+
+    if ( selection == 0 && !data->in_root )
+		DirDlg_Goto_Parent ( data );
+    else
+		rc = DirDlg_Goto_Child ( dlg, data, selection );
+
+	if ( rc == 0 )
+		rc = set_native_caption( dlg, data->vfs_mgr, ID_CURR, data->current_dir_internal );	
+	
+    if ( rc == 0 )
+        rc = fill_widget_with_dirs( dlg, data->dir, ID_DIRS, data->current_dir_internal, data->parent_dir_internal );
+
+    if ( rc == 0 )
+        rc = KTUIDlgSetWidgetVisible ( dlg, ID_B_CREATE, create_allowed( data ) );
+
+    if ( rc == 0 )
+        rc = KTUIDlgDraw( dlg, false );
+
+	return rc;
+}
+
+
+static rc_t Present_Input ( struct KTUIDlg * dlg, dir_dlg_data * data, const char * caption,
+                            char * buffer, size_t buffer_size, bool * selected )
+{
+    tui_rect r;
+    rc_t rc = KTUIDlgGetRect ( dlg, &r );
+    *selected = false;
+    if ( rc == 0 )
+    {
+        uint32_t w = 40, h = 6;
+        uint32_t x = ( r.w - w ) / 2;
+        uint32_t y = ( r.h - h ) / 2;
+        struct KTUI * tui = KTUIDlgGetTui( dlg );
+
+        rc = TUI_EditBuffer( tui, dlg, caption, buffer, buffer_size, x, y, w, selected, data->bg1, data->bg2 );
+
+        /* redraw in any case, even creating a directory failed, because we have to erase the sub-dialog from the screen */
+        KTUIDlgDraw( dlg, false );
+    }
+    return rc;
+}
+
+static rc_t DirDlgCreate ( struct KTUIDlg * dlg, dir_dlg_data * data )
+{
+    rc_t rc = 0;
+    if ( create_allowed( data ) )
+    {
+        char leafname[ 1024 ];
+        bool selected;
+
+        leafname[ 0 ] = 0;
+        rc = Present_Input ( dlg, data, "new sub-directory", leafname, sizeof leafname, &selected );
+        if ( rc == 0 )
+        {
+            if ( rc == 0 && selected && leafname[ 0 ] != 0 )
+            {
+                rc = KDirectoryCreateDir ( data->dir, 0775, kcmCreate | kcmParents,
+                                           "%s/%s", data->current_dir_internal, leafname );
+                if ( rc == 0 )
+                    rc = fill_widget_with_dirs( dlg, data->dir, ID_DIRS, data->current_dir_internal, leafname );
+                if ( rc == 0 )
+                    rc = KTUIDlgDraw( dlg, false );
+            }
+            /* set the focus to the directory-list */
+            KTUIDlgSetFocus( dlg, ID_DIRS );
+        }
+    }
+    return rc;
+}
+
+
+static rc_t DirDlgGotoDir ( struct KTUIDlg * dlg, dir_dlg_data * data )
+{
+    char new_path[ 1024 ];
+    size_t written;
+    rc_t rc = internal_to_native( data->vfs_mgr, data->current_dir_internal, new_path, sizeof new_path, &written );
+    if ( rc == 0 )
+    {
+        bool selected;
+        rc = Present_Input ( dlg, data, "goto path", new_path, sizeof new_path, &selected );
+        if ( rc == 0 && selected )
+        {
+            rc = native_to_internal( data->vfs_mgr, new_path, data->current_dir_internal,
+                                     sizeof data->current_dir_internal, &written );
+            if ( rc == 0 )
+                rc = fill_widget_with_dirs( dlg, data->dir, ID_DIRS, data->current_dir_internal, NULL );
+            if ( rc == 0 )
+                rc = set_native_caption( dlg, data->vfs_mgr, ID_CURR, data->current_dir_internal );	
+
+            KTUIDlgSetFocus( dlg, ID_DIRS );
+        }
+    }
+    return rc;
+}
+
+
+static rc_t DirDlgEvent ( struct KTUIDlg * dlg, tuidlg_event * dev, dir_dlg_data * data )
+{
+    rc_t rc = 0;
+    if ( dev->event_type == ktuidlg_event_select )
+    {
+        switch ( dev->widget_id )
+        {
+            case ID_DIRS     : rc = DirDlgDirectoryChanged( dlg, data, ( uint32_t )dev->value_1 ); break;
+            case ID_B_OK     : data->ok_pressed = data->done = true; break;
+            case ID_B_CANCEL : data->done = true; break;
+            case ID_B_CREATE : rc = DirDlgCreate( dlg, data ); break;
+            case ID_B_GOTO   : rc = DirDlgGotoDir( dlg, data ); break;
+        }
+    }
+    return rc;
+}
+
+
+static rc_t DirDlgTuiEvent( struct KTUIDlg * dlg, dir_dlg_data * data, tui_event * ev, bool * handled )
+{
+    rc_t rc = 0;
+    *handled = false;
+    if ( ev->event_type == ktui_event_kb )
+    {
+        switch( ev->data.kb_data.code )
+        {
+            case ktui_F7 : rc = DirDlgCreate ( dlg, data ); *handled = true; break;
+            case ktui_F3 : rc = DirDlgGotoDir ( dlg, data ); *handled = true; break;
+            case ktui_F2 : data->ok_pressed = data->done = true; *handled = true; break;
+            case ktui_alpha : switch ( ev->data.kb_data.key )
+                               {
+                                    case 'c' :
+                                    case 'C' : rc = DirDlgCreate ( dlg, data ); *handled = true; break;
+                                    case 'g' :
+                                    case 'G' : rc = DirDlgGotoDir ( dlg, data ); *handled = true; break;
+                               }
+                               break;
+        }
+    }
+    return rc;
+}
+
+
+static rc_t DirDlgLoop ( struct KTUIDlg * dlg, dir_dlg_data * data )
+{
+    rc_t rc;
+    tui_event event;
+    struct KTUI * tui = KTUIDlgGetTui( dlg );
+
+    KTUIDlgDraw( dlg, false );  /* draw this dialog */
+    do
+    {
+        rc = KTUIGet ( tui, &event );
+        if ( rc == 0 )
+        {
+            bool handled = false;
+            rc = DirDlgTuiEvent( dlg, data, &event, &handled );
+            if ( rc == 0 && !handled )
+            {
+                rc = KTUIDlgHandleEvent( dlg, &event );
+                if ( rc == 0 )
+                {
+                    tuidlg_event dev;
+                    do
+                    {
+                        rc = KTUIDlgGet ( dlg, &dev );
+                        if ( rc == 0 && dev.event_type != ktuidlg_event_none )
+                            rc = DirDlgEvent( dlg, &dev, data );
+                    } while ( rc == 0 && dev.event_type != ktuidlg_event_none );
+                }
+            }
+        }
+    } while ( rc == 0 && !is_alpha_key( &event, 27 ) && !data->done );
+    return rc;
+}
+
+
+static rc_t make_dlg_with_bg( struct KTUIDlg ** dlg,
+                              struct KTUIPalette ** pal,
+                              struct KTUI * tui_,
+                              struct KTUIDlg * parent,
+                              tui_rect * r,
+                              KTUI_color bg1,
+                              KTUI_color bg2 )
+{
+    rc_t rc;
+    struct KTUI * tui = tui_;
+    if ( tui == NULL )
+        tui = KTUIDlgGetTui( parent );
+    if ( tui == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    else
+    {
+        rc = KTUIPaletteMake ( pal );
+        if ( rc == 0 )
+        {
+            KTUIPaletteSet_bg ( *pal, ktuipa_dlg, bg1 );
+            KTUIPaletteSet_bg ( *pal, ktuipa_dlg_caption, bg2 );
+            rc = KTUIDlgMake ( tui, dlg, parent, *pal, r );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC DirDlg ( struct KTUI * tui,
+                            struct KTUIDlg * parent,
+                            char * buffer,             /* if empty ... local path */
+                            uint32_t buffer_size,
+                            bool * done,               /* user has selected a directory */
+                            tui_rect * r,              /* rectangle for dialog */
+                            KTUI_color bg1,
+                            KTUI_color bg2,
+                            bool allow_dir_create )
+{
+    struct KTUIPalette * pal;
+    struct KTUIDlg * dlg;
+    rc_t rc = make_dlg_with_bg( &dlg, &pal, tui, parent, r, bg1, bg2 );
+    if ( rc == 0 )
+    {
+        rc = KTUIDlgSetCaption ( dlg, "select directory" );
+        if ( rc == 0 )
+        {
+            dir_dlg_data data;
+
+            init_dlg_data( &data, r->w, r->h, buffer, bg1, bg2, allow_dir_create );
+            rc = PopulateDirDlg ( dlg, &data );
+            if ( rc == 0 )
+                DirDlgLoop( dlg, &data );
+
+            if ( done != NULL )
+                *done = data.ok_pressed;
+
+            if ( data.ok_pressed )
+            {
+                size_t written;
+                internal_to_native( data.vfs_mgr, data.current_dir_internal, buffer, buffer_size, &written );
+            }
+
+            destroy_dlg_data( &data );
+        }
+        KTUIDlgRelease ( dlg );
+        KTUIPaletteRelease ( pal );
+    }
+    return rc;
+}
diff --git a/libs/tui/eventring.c b/libs/tui/eventring.c
new file mode 100644
index 0000000..d87123c
--- /dev/null
+++ b/libs/tui/eventring.c
@@ -0,0 +1,134 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "eventring.h"
+
+#include <sysalloc.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+void event_ring_init( Event_Ring * ring )
+{
+    SLListInit( &ring->events );
+    SLListInit( &ring->stock );
+}
+
+static void CC event_ring_whack( SLNode *n, void *data )
+{
+    void * event = ( void * )n;
+    if ( event != NULL ) free( event );
+}
+
+
+void event_ring_destroy( Event_Ring * ring )
+{
+    SLListWhack ( &ring->events, event_ring_whack, NULL );
+    SLListWhack ( &ring->stock, event_ring_whack, NULL );
+}
+
+
+/* ****************************************************************************************** */
+
+
+tui_event * event_ring_get_from_stock_or_make( Event_Ring * ring )
+{
+    tui_event * event = ( tui_event * ) SLListPopHead ( &ring->stock );
+    if ( event == NULL )
+        event = malloc( sizeof * event );
+    return event;
+}
+
+
+void event_ring_put( Event_Ring * ring, tui_event * event )
+{
+    SLListPushTail ( &ring->events, ( SLNode * )event );
+}
+
+
+tui_event * event_ring_get( Event_Ring * ring )
+{
+    return ( tui_event * ) SLListPopHead ( &ring->events );
+}
+
+
+void event_ring_put_to_stock( Event_Ring * ring, tui_event * event )
+{
+    SLListPushTail ( &ring->stock, ( SLNode * )event );
+}
+
+
+void copy_event( tui_event * src, tui_event * dst )
+{
+    dst->event_type = src->event_type;
+    switch( src->event_type )
+    {
+        case ktui_event_none	: break;
+        case ktui_event_kb		: dst->data.kb_data = src->data.kb_data; break;
+        case ktui_event_mouse	: dst->data.mouse_data = src->data.mouse_data; break;
+        case ktui_event_window	: dst->data.win_data = src->data.win_data; break;
+    }
+}
+
+
+/* ****************************************************************************************** */
+
+tuidlg_event * dlg_event_ring_get_from_stock_or_make( Event_Ring * ring )
+{
+    tuidlg_event * event = ( tuidlg_event * ) SLListPopHead ( &ring->stock );
+    if ( event == NULL )
+        event = malloc( sizeof * event );
+    return event;
+}
+
+
+void dlg_event_ring_put( Event_Ring * ring, tuidlg_event * event )
+{
+    SLListPushTail ( &ring->events, ( SLNode * )event );
+}
+
+
+tuidlg_event * dlg_event_ring_get( Event_Ring * ring )
+{
+    return ( tuidlg_event * ) SLListPopHead ( &ring->events );
+}
+
+
+void dlg_event_ring_put_to_stock( Event_Ring * ring, tuidlg_event * event )
+{
+    SLListPushTail ( &ring->stock, ( SLNode * )event );
+}
+
+
+void copy_dlg_event( tuidlg_event * src, tuidlg_event * dst )
+{
+    dst->event_type = src->event_type;
+    dst->widget_id = src->widget_id;
+    dst->value_1 = src->value_1;
+    dst->value_2 = src->value_2;
+    dst->ptr_0 = src->ptr_0;
+}
diff --git a/libs/tui/eventring.h b/libs/tui/eventring.h
new file mode 100644
index 0000000..71581f2
--- /dev/null
+++ b/libs/tui/eventring.h
@@ -0,0 +1,74 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_eventring_
+#define _h_eventring_
+
+#ifndef _h_tui_extern_
+#include <tui/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <tui/tui.h>
+#include <tui/tui_dlg.h>
+
+#define EVENT_RING_SIZE 128
+
+typedef struct Event_Ring
+{
+    SLList events;
+    SLList stock;
+} Event_Ring;
+
+void event_ring_init( Event_Ring * ring );
+void event_ring_destroy( Event_Ring * ring );
+
+tui_event * event_ring_get_from_stock_or_make( Event_Ring * ring );
+void event_ring_put( Event_Ring * ring, tui_event * event );
+tui_event * event_ring_get( Event_Ring * ring );
+void event_ring_put_to_stock( Event_Ring * ring, tui_event * event );
+void copy_event( tui_event * src, tui_event * dst );
+
+
+tuidlg_event * dlg_event_ring_get_from_stock_or_make( Event_Ring * ring );
+void dlg_event_ring_put( Event_Ring * ring, tuidlg_event * event );
+tuidlg_event * dlg_event_ring_get( Event_Ring * ring );
+void dlg_event_ring_put_to_stock( Event_Ring * ring, tuidlg_event * event );
+void copy_dlg_event( tuidlg_event * src, tuidlg_event * dst );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_eventring */
diff --git a/libs/tui/file_dlg.c b/libs/tui/file_dlg.c
new file mode 100644
index 0000000..7e190c6
--- /dev/null
+++ b/libs/tui/file_dlg.c
@@ -0,0 +1,380 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <tui/extern.h>
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kfs/directory.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <tui/tui_dlg.h>
+#include "tui-priv.h"
+
+#include <sysalloc.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+typedef struct file_dlg_data
+{
+    uint32_t dlg_w, dlg_h, dir_h;
+
+    /* for the inputline */
+    char current_dir_internal[ 4096 ];
+	char parent_dir_internal[ 4096 ];
+
+    /* which extension... */
+    char * extension;
+
+    /* a VFS-Manager to do a path-conversion */
+    VFSManager * vfs_mgr;
+	
+    /* a KDirectory to fill widgets with directories/files */
+	KDirectory * dir;
+
+	bool in_root;
+    bool selected;
+	bool done;
+} file_dlg_data;
+
+
+static void init_dlg_data( file_dlg_data * data, uint32_t dlg_w, uint32_t dlg_h, uint32_t dir_h,
+    char * path, const char * extension )
+{
+    size_t written;
+
+    data->dlg_w = dlg_w;
+    data->dlg_h = dlg_h;
+    data->dir_h = dir_h;
+
+    VFSManagerMake ( &data->vfs_mgr );
+	KDirectoryNativeDir ( &data->dir );
+	
+    native_to_internal( data->vfs_mgr, path, data->current_dir_internal, sizeof data->current_dir_internal, &written );
+	
+	data->in_root = ( ( data->current_dir_internal[ 0 ] == '/' ) && ( data->current_dir_internal[ 1 ] == 0 ) );
+	data->parent_dir_internal[ 0 ] = 0;
+    data->selected = false;
+	data->done = false;
+    if ( extension != NULL )
+        data->extension = string_dup_measure ( extension, NULL );
+    else
+        data->extension = NULL;
+}
+
+static void destroy_dlg_data( file_dlg_data * data )
+{
+    /* we only have to destroy the Namelist's... */
+    if ( data->extension != NULL )
+    {
+        free( ( void * ) data->extension );
+        data->extension = NULL;
+    }
+
+    if ( data->vfs_mgr != NULL )
+    {
+        VFSManagerRelease ( data->vfs_mgr );
+        data->vfs_mgr = NULL;
+    }
+
+    if ( data->dir != NULL )
+    {
+        KDirectoryRelease ( data->dir );
+        data->dir = NULL;
+    }
+}
+
+
+enum
+{
+    ID_CURR = 100,
+    ID_LABEL1,
+    ID_DIRS,
+    ID_LABEL2,
+    ID_FILES,
+    ID_B_OK,
+    ID_B_CANCEL
+};
+
+
+static rc_t PopulateFileDlg ( struct KTUIDlg * dlg, file_dlg_data * data )
+{
+	rc_t rc = KTUIDlgAddLabel2( dlg, ID_CURR, 1, 2, data->dlg_w - 2, "" );
+
+	if ( rc == 0 )
+		rc = KTUIDlgAddLabel2( dlg, ID_LABEL1, 1, 4, data->dlg_w - 2, "directories:" );
+
+	if ( rc == 0 )
+	{
+		tui_rect r;
+		set_rect( &r, 1, 5, data->dlg_w - 2, data->dir_h );
+		rc = KTUIDlgAddList ( dlg, ID_DIRS, &r );
+	}
+
+	if ( rc == 0 )
+		rc = KTUIDlgAddLabel2( dlg, ID_LABEL2, 1, data->dir_h + 6, data->dlg_w - 2, "files:" );
+
+	if ( rc == 0 )
+	{
+		tui_rect r;
+		set_rect( &r, 1, data->dir_h + 7, data->dlg_w - 2, data->dlg_h - ( data->dir_h + 10 )  );
+		rc = KTUIDlgAddList ( dlg, ID_FILES, &r );
+	}
+
+	if ( rc == 0 )
+		rc = KTUIDlgAddBtn2( dlg, ID_B_OK, 1, data->dlg_h - 2, 12, "OK" );
+
+	if ( rc == 0 )
+		rc = KTUIDlgAddBtn2( dlg, ID_B_CANCEL, 14, data->dlg_h - 2, 22, "Cancel (ESC-ESC)" );
+
+	if ( rc == 0 )
+		rc = set_native_caption( dlg, data->vfs_mgr, ID_CURR, data->current_dir_internal );
+	
+	if ( rc == 0 )
+		rc = fill_widget_with_dirs( dlg, data->dir, ID_DIRS, data->current_dir_internal, NULL );
+
+	if ( rc == 0 )
+		rc = fill_widget_with_files( dlg, data->dir, ID_FILES, data->current_dir_internal, data->extension );
+
+	if ( rc == 0 )
+		rc = KTUIDlgSetFocus( dlg, ID_DIRS );
+
+    return rc;
+}
+
+
+static void FileDlg_Goto_Parent ( file_dlg_data * data )
+{
+	char * right_slash = string_rchr ( data->current_dir_internal, string_size ( data->current_dir_internal ), '/' );
+	if ( right_slash != NULL )
+	{
+		size_t written;
+		
+		data->in_root = ( right_slash == data->current_dir_internal );
+		if ( data->in_root )
+			data->current_dir_internal[ 1 ] = 0;
+		else
+			*right_slash = 0;
+			
+		string_printf( data->parent_dir_internal, sizeof data->parent_dir_internal, &written, "%s", right_slash + 1 );
+	}
+}
+
+
+static rc_t FileDlg_Goto_Child ( struct KTUIDlg * dlg, file_dlg_data * data, uint32_t selection )
+{
+	rc_t rc = 0;
+	/* we are goint one directory forward in the tree: */
+	const char * s = KTUIDlgGetWidgetStringByIdx ( dlg, ID_DIRS, selection );
+	if ( s != NULL )
+	{
+		/* add path segment from selection */
+		char temp[ 4096 ];
+		size_t written;
+		if ( data->in_root )
+#ifdef WINDOWS
+			rc = string_printf ( temp, sizeof temp, &written, "/%c", s[ 0 ] );
+#else
+			rc = string_printf ( temp, sizeof temp, &written, "/%s", s );
+#endif
+		else
+			rc = string_printf ( temp, sizeof temp, &written, "%s/%s", data->current_dir_internal, s );
+		if ( rc == 0 )
+			string_copy_measure ( data->current_dir_internal, sizeof data->current_dir_internal, temp );
+			
+		data->parent_dir_internal[ 0 ] = 0;
+		data->in_root = false;
+	}
+	return rc;
+}
+
+
+static rc_t FileDlgDirectoryChanged ( struct KTUIDlg * dlg, file_dlg_data * data, uint32_t selection )
+{
+    rc_t rc = 0;
+
+    if ( selection == 0 && !data->in_root )
+		FileDlg_Goto_Parent ( data );
+    else
+		rc = FileDlg_Goto_Child ( dlg, data, selection );
+
+    if ( rc == 0 )
+		rc = set_native_caption( dlg, data->vfs_mgr, ID_CURR, data->current_dir_internal );
+
+	if ( rc == 0 )
+		rc = fill_widget_with_dirs( dlg, data->dir, ID_DIRS, data->current_dir_internal, data->parent_dir_internal );
+
+	if ( rc == 0 )
+		rc = fill_widget_with_files( dlg, data->dir, ID_FILES, data->current_dir_internal, data->extension );	
+
+    if ( rc == 0 )
+        rc = KTUIDlgDraw( dlg, false );
+
+    return rc;
+}
+
+
+static rc_t FileDlgFileSelected ( struct KTUIDlg * dlg, file_dlg_data * data, uint32_t selection )
+{
+    rc_t rc = 0;
+    const char * s = KTUIDlgGetWidgetStringByIdx ( dlg, ID_FILES, selection );
+    if ( s != NULL )
+    {
+        /* add path segment from selection */
+        char temp[ 4096 ];
+        size_t written;
+        rc = string_printf ( temp, sizeof temp, &written, "%s/%s", data->current_dir_internal, s );
+        if ( rc == 0 )
+            string_copy_measure ( data->current_dir_internal, sizeof data->current_dir_internal, temp );
+        data->selected = true;
+		data->done = true;
+    }
+    return rc;
+}
+
+
+static rc_t FileDlgEvent ( struct KTUIDlg * dlg, tuidlg_event * dev, file_dlg_data * data )
+{
+    rc_t rc = 0;
+    if ( dev->event_type == ktuidlg_event_select )
+    {
+        switch ( dev->widget_id )
+        {
+            case ID_DIRS     : rc = FileDlgDirectoryChanged( dlg, data, (uint32_t)dev->value_1 ); break;
+            case ID_FILES    : rc = FileDlgFileSelected( dlg, data, (uint32_t)dev->value_1 ); break;
+			
+			case ID_B_OK     : rc = FileDlgFileSelected( dlg, data, KTUIDlgGetWidgetSelectedString( dlg, ID_FILES ) ); break;
+            case ID_B_CANCEL : data->done = true; break;
+        }
+    }
+    return rc;
+}
+
+
+static rc_t FileDlgLoop ( struct KTUIDlg * dlg, file_dlg_data * data )
+{
+    rc_t rc;
+    tui_event event;
+    struct KTUI * tui = KTUIDlgGetTui( dlg );
+
+    KTUIDlgDraw( dlg, false );  /* draw this dialog */
+    do
+    {
+        rc = KTUIGet ( tui, &event );
+        if ( rc == 0 )
+        {
+            rc = KTUIDlgHandleEvent( dlg, &event );
+            if ( rc == 0 )
+            {
+                tuidlg_event dev;
+                do
+                {
+                    rc = KTUIDlgGet ( dlg, &dev );
+                    if ( rc == 0 && dev.event_type != ktuidlg_event_none )
+                        rc = FileDlgEvent( dlg, &dev, data );
+                } while ( rc == 0 && dev.event_type != ktuidlg_event_none );
+            }
+        }
+    } while ( rc == 0 && !is_alpha_key( &event, 27 ) && !data->done );
+    return rc;
+}
+
+
+static rc_t make_dlg_with_bg( struct KTUIDlg ** dlg,
+                              struct KTUIPalette ** pal,
+                              struct KTUI * tui_,
+                              struct KTUIDlg * parent,
+                              tui_rect * r,
+                              KTUI_color bg1,
+                              KTUI_color bg2 )
+{
+    rc_t rc;
+    struct KTUI * tui = tui_;
+    if ( tui == NULL )
+        tui = KTUIDlgGetTui( parent );
+    if ( tui == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    else
+    {
+        rc = KTUIPaletteMake ( pal );
+        if ( rc == 0 )
+        {
+            KTUIPaletteSet_bg ( *pal, ktuipa_dlg, bg1 );
+            KTUIPaletteSet_bg ( *pal, ktuipa_dlg_caption, bg2 );
+            rc = KTUIDlgMake ( tui, dlg, parent, *pal, r );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC FileDlg ( struct KTUI * tui,
+                             struct KTUIDlg * parent,
+                             char * buffer,             /* if empty ... local path */
+                             uint32_t buffer_size,
+                             const char * extension,    /* empty ... all files, "c" ... *.c */
+                             bool * done,               /* user has selected a file */
+                             tui_rect * r,              /* rectangle for dialog */
+                             uint32_t dir_h,            /* how many lines for the directory part */
+                             KTUI_color bg1,
+                             KTUI_color bg2 )
+{
+    struct KTUIPalette * pal;
+    struct KTUIDlg * dlg;
+    rc_t rc = make_dlg_with_bg( &dlg, &pal, tui, parent, r, bg1, bg2 );
+    if ( rc == 0 )
+    {
+        rc = KTUIDlgSetCaption ( dlg, "select file" );
+        if ( rc == 0 )
+        {
+            file_dlg_data data;
+
+            init_dlg_data( &data, r->w, r->h, dir_h, buffer, extension );
+            rc = PopulateFileDlg ( dlg, &data );
+            if ( rc == 0 )
+                FileDlgLoop( dlg, &data );
+
+            if ( done != NULL )
+                *done = data.selected;
+
+            if ( data.selected )
+            {
+                size_t written;
+                internal_to_native( data.vfs_mgr, data.current_dir_internal, buffer, buffer_size, &written );
+            }
+
+            destroy_dlg_data( &data );
+        }
+        KTUIDlgRelease ( dlg );
+        KTUIPaletteRelease ( pal );
+    }
+    return rc;
+}
diff --git a/libs/tui/line_policy.c b/libs/tui/line_policy.c
new file mode 100644
index 0000000..af3e082
--- /dev/null
+++ b/libs/tui/line_policy.c
@@ -0,0 +1,379 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+
+#include <tui/tui.h>
+#include "line_policy.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+
+
+static void lp_adjust( lp_context * lp )
+{
+    if ( *lp->cur_pos < *lp->offset )
+        *lp->offset = *lp->cur_pos;
+    else if ( *lp->cur_pos >= ( *lp->offset + lp->visible ) )
+        *lp->offset = ( *lp->cur_pos - lp->visible ) + 1;
+    else if ( lp->len == 0 && ( *lp->cur_pos > 0 ) )
+        *lp->cur_pos = 0;
+}
+
+
+static bool lp_alpha( lp_context * lp, char c )
+{
+    bool res = ( lp->len < ( lp->max_len - 1 ) && ( c != 27 ) );
+    if ( res )
+    {
+        if ( *lp->cur_pos < lp->len )
+        {
+            if ( *lp->mode == 0 )
+            {
+                uint64_t idx;
+                lp->line[ lp->len + 1 ] = 0;
+                for ( idx = lp->len; idx > *lp->cur_pos; --idx )
+                lp->line[ idx ] = lp->line[ idx - 1 ];
+            }
+            lp->line[ ( *lp->cur_pos )++ ] = c;
+        }
+        else
+        {
+            lp->line[ ( *lp->cur_pos )++ ] = c;
+            lp->line[ *lp->cur_pos ] = 0;
+            lp->len = string_measure ( lp->line, NULL );
+        }
+        lp_adjust( lp );
+        lp->content_changed = true;
+    }
+    return res;
+}
+
+
+static bool lp_home( lp_context * lp )
+{
+    bool res = ( *lp->cur_pos > 0 );
+    if ( res )
+    {
+        *lp->cur_pos = 0;
+        *lp->offset = 0;
+    }
+    return res;
+}
+
+
+static bool lp_end( lp_context * lp )
+{
+    bool res = ( *lp->cur_pos != lp->len );
+    if ( res )
+    {
+        *lp->cur_pos = lp->len;
+        lp_adjust( lp );
+    }
+    return res;
+}
+
+
+static bool lp_right( lp_context * lp )
+{
+    bool res = ( *lp->cur_pos < lp->len );
+    if ( res )
+    {
+        ( *lp->cur_pos )++;
+        lp_adjust( lp );
+    }
+    return res;
+}
+
+
+static bool lp_left( lp_context * lp )
+{
+    bool res = ( *lp->cur_pos > 0 );
+    if ( res )
+    {
+        ( *lp->cur_pos )--;
+        lp_adjust( lp );
+    }
+    return res;
+}
+
+
+static bool lp_bksp( lp_context * lp )
+{
+    bool res = ( *lp->cur_pos > 0 );
+    if ( res )
+    {
+        if ( *lp->cur_pos < lp->len  )
+        {
+            uint64_t idx;
+            for ( idx = *lp->cur_pos - 1; idx < lp->len; ++idx )
+                lp->line[ idx ] = lp->line[ idx + 1 ];
+            ( *lp->cur_pos )--;
+        }
+        else
+            lp->line[ --( *lp->cur_pos ) ] = 0;
+        lp_adjust( lp );
+        lp->content_changed = true;
+    }
+    return res;
+}
+
+
+static bool lp_del( lp_context * lp )
+{
+    bool res = ( *lp->cur_pos < lp->len  );
+    if ( res  )
+    {
+        uint64_t idx;
+        for ( idx = *lp->cur_pos; idx < lp->len; ++idx )
+            lp->line[ idx ] = lp->line[ idx + 1 ];
+        lp_adjust( lp );
+        lp->content_changed = true;
+    }
+    return res;
+}
+
+
+static bool lp_ins( lp_context * lp )
+{
+    if ( *lp->mode == 0 )
+        *lp->mode = 1;
+    else
+        *lp->mode = 0;
+    return true;
+}
+
+
+bool lp_handle_event( lp_context * lp, tui_event * event )
+{
+    bool res = false;
+    lp->len = string_measure ( lp->line, NULL );
+    if ( event->event_type == ktui_event_kb )
+    {
+        switch( event->data.kb_data.code )
+        {
+            case ktui_home  : res = lp_home( lp ); break;
+            case ktui_end   : res = lp_end( lp ); break;
+            case ktui_left  : res = lp_left( lp ); break;
+            case ktui_right : res = lp_right( lp ); break;
+            case ktui_bksp  : res = lp_bksp( lp ); break;
+            case ktui_del   : res = lp_del( lp ); break;
+            case ktui_ins   : res = lp_ins( lp ); break;
+            case ktui_alpha : res = lp_alpha( lp, event->data.kb_data.key ); break;
+        }
+    }
+    else if ( event->event_type == ktui_event_mouse )
+    {
+        *lp->cur_pos = *lp->offset + event->data.mouse_data.x - 1;
+        lp_adjust( lp );
+        res = true;
+    }
+    return res;
+}
+
+
+/* ****************************************************************************************** */
+
+static void gen_adjust( gen_context * ctx )
+{
+    if ( *ctx->curr >= ctx->count )
+        *ctx->curr = ctx->count - 1;
+
+    if ( *ctx->curr < *ctx->offset )
+        *ctx->offset = *ctx->curr;
+    else if ( *ctx->curr >= ( *ctx->offset + ctx->visible ) )
+        *ctx->offset = *ctx->curr - ctx->visible + 1;
+}
+
+
+static bool gen_home( gen_context * ctx )
+{
+    bool res = ( *ctx->curr > 0 );
+    if ( res )
+    {
+        *ctx->curr = 0;
+        *ctx->offset = 0;
+    }
+    return res;
+}
+
+
+static bool gen_end( gen_context * ctx )
+{
+    bool res = ( *ctx->curr < ctx->count );
+    if ( res )
+    {
+        *ctx->curr = ctx->count - 1;
+        gen_adjust( ctx );
+    }
+    return res;
+}
+
+
+static bool gen_move( gen_context * ctx, int32_t by )
+{
+    bool res = false;
+
+    if ( by < 0 )
+    {
+        res = ( *ctx->curr > 0 );
+        if ( res )
+        {
+            uint32_t dist = -by;
+            if ( *ctx->curr >= dist )
+                *ctx->curr -= dist;
+            else
+                *ctx->curr = 0;
+        }
+    }
+    else if ( by > 0 )
+    {
+        res = ( *ctx->curr < ( ctx->count - 1 ) );
+        if ( res )
+            *ctx->curr += by;
+    }
+
+    if ( res )
+        gen_adjust( ctx );
+    return res;
+}
+
+
+static bool gen_set( gen_context * ctx, uint64_t value )
+{
+    bool res = ( *ctx->curr != value );
+    if ( res )
+    {
+        *ctx->curr = value;
+        gen_adjust( ctx );
+    }
+    return res;
+}
+
+/* ****************************************************************************************** */
+
+
+bool list_handle_event( gen_context * ctx, tui_event * event, uint32_t x_max )
+{
+    bool res = false;
+    if ( event->event_type == ktui_event_kb )
+    {
+        switch( event->data.kb_data.code )
+        {
+            case ktui_home  : res = gen_home( ctx ); break;
+            case ktui_end   : res = gen_end( ctx ); break;
+            case ktui_up    : res = gen_move( ctx, -1 ); break;
+            case ktui_down  : res = gen_move( ctx, 1 ); break;
+            case ktui_pgup  : res = gen_move( ctx, -7 ); break;
+            case ktui_pgdn  : res = gen_move( ctx, 7 ); break;
+        }
+    }
+    else if ( event->event_type == ktui_event_mouse )
+    {
+        uint32_t x = event->data.mouse_data.x;
+        bool flag = ( x_max > 0 ) ? ( x > 0 && x < x_max ) : true;
+        if ( flag )
+        {
+            *ctx->curr = *ctx->offset + event->data.mouse_data.y;
+            res = true;
+        }
+    }
+    return res;
+}
+
+
+/* ****************************************************************************************** */
+
+static bool grid_handle_width( grid_context * gp, tui_event * event, int32_t by )
+{
+    bool res = false;
+    if ( gp->on_get_width != NULL && gp->on_set_width != NULL )
+    {
+        uint64_t col = *( gp->col.curr );
+        int32_t width = gp->on_get_width( col, gp->data );
+        if ( by > 0 )
+        {
+            gp->on_set_width( col, width + by, gp->data );
+            res = true;
+        }
+        else if ( by < 0 )
+        {
+            if ( ( width - 1 ) > ( -by ) )
+            {
+                gp->on_set_width( col, width + by, gp->data );
+                res = true;
+            }
+        }
+    }
+    return res;
+}
+
+static bool grid_handle_alpha( grid_context * gp, tui_event * event )
+{
+    bool res = false;
+    switch( event->data.kb_data.key )
+    {
+        case '+' : res = grid_handle_width( gp, event, +1 ); break;
+        case '-' : res = grid_handle_width( gp, event, -1 ); break;
+    }
+    return res;
+}
+
+bool grid_handle_event( grid_context * gp, tui_event * event )
+{
+    bool res = false;
+
+    if ( event->event_type == ktui_event_kb )
+    {
+        switch( event->data.kb_data.code )
+        {
+            case ktui_home  : res = gen_home( &gp->row ); break;
+            case ktui_end   : res = gen_end( &gp->row ); break;
+            case ktui_up    : res = gen_move( &gp->row, -1 ); break;
+            case ktui_down  : res = gen_move( &gp->row, 1 ); break;
+            case ktui_left  : res = gen_move( &gp->col, -1 ); break;
+            case ktui_right : res = gen_move( &gp->col, 1 ); break;
+            case ktui_pgup  : res = gen_move( &gp->row, -7 ); break;
+            case ktui_pgdn  : res = gen_move( &gp->row, 7 ); break;
+            case ktui_alpha : res = grid_handle_alpha( gp, event ); break;
+        }
+    }
+
+    return res;
+}
+
+
+bool grid_handle_set_col( grid_context * gp, uint64_t col )
+{
+    return gen_set( &gp->col, col );
+}
+
+bool grid_handle_set_row( grid_context * gp, uint64_t row )
+{
+    return gen_set( &gp->row, row );
+}
diff --git a/libs/tui/line_policy.h b/libs/tui/line_policy.h
new file mode 100644
index 0000000..e7efe28
--- /dev/null
+++ b/libs/tui/line_policy.h
@@ -0,0 +1,86 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_line_policy_
+#define _h_line_policy_
+
+#include <tui/tui.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef struct lp_context
+{
+    char * line;
+    uint64_t len, max_len, visible;
+    uint64_t * cur_pos;
+    uint64_t * offset;
+    uint64_t * mode;
+    bool content_changed;
+} lp_context;
+
+
+bool lp_handle_event( lp_context * lp, tui_event * event );
+
+
+typedef struct gen_context
+{
+    uint64_t count, visible;
+    uint64_t * curr;
+    uint64_t * offset;
+} gen_context;
+
+
+bool list_handle_event( gen_context * ctx, tui_event * event, uint32_t x_max );
+
+
+typedef uint32_t ( CC * grid_ctx_get_width ) ( uint64_t col, void * data );
+typedef void ( CC * grid_ctx_set_width ) ( uint64_t col, uint32_t value, void * data );
+
+typedef struct grid_context
+{
+    void * data;
+    grid_ctx_get_width on_get_width;
+    grid_ctx_set_width on_set_width;
+
+    gen_context row;
+    gen_context col;
+} grid_context;
+
+
+bool grid_handle_event( grid_context * gp, tui_event * event );
+
+bool grid_handle_set_col( grid_context * gp, uint64_t col );
+bool grid_handle_set_row( grid_context * gp, uint64_t row );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_line_policy_ */
diff --git a/libs/tui/linux/systui.c b/libs/tui/linux/systui.c
new file mode 100644
index 0000000..81b5b96
--- /dev/null
+++ b/libs/tui/linux/systui.c
@@ -0,0 +1,624 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*--------------------------------------------------------------------------
+ * KTUI = Text User Interface ( different from GUI ... )
+ *  platform specific code ... this one for linux
+ */
+
+#include <tui/extern.h>
+#include <tui/tui.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+
+
+#ifndef __USE_UNIX98
+#define __USE_UNIX98 1
+#endif
+
+#include "../tui-priv.h"
+
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <termios.h>
+#include <signal.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <stdlib.h>
+#include <errno.h>
+#include <assert.h>
+
+typedef uint32_t es_states;
+enum
+{
+    es_normal,
+    es_ESC,
+
+    es_ESC_91,
+    es_ESC_91_49,
+    es_ESC_91_49_49,
+    es_ESC_91_49_50,
+    es_ESC_91_49_51,
+    es_ESC_91_49_52,
+    es_ESC_91_49_53,
+    es_ESC_91_49_55,
+    es_ESC_91_49_56,
+    es_ESC_91_49_57,
+
+    es_ESC_91_50,
+    es_ESC_91_50_48,
+    es_ESC_91_50_49,
+    es_ESC_91_50_51,
+    es_ESC_91_50_52,
+
+    es_ESC_91_51,
+    es_ESC_91_52,
+    es_ESC_91_53,
+    es_ESC_91_54,
+
+    es_ESC_91_77_B,
+    es_ESC_91_77_X,
+    es_ESC_91_77_Y,
+
+    es_ESC_79
+};
+
+
+/**********************************************************************************/
+
+static int color_2_ansi( KTUI_color c )
+{
+    int res = 0;
+    switch( c )
+    {
+        case KTUI_c_black           : res = 0;  break;
+        case KTUI_c_gray            : res = 8;  break;
+
+        case KTUI_c_dark_red        : res = 1;  break;    
+        case KTUI_c_red             : res = 9;  break;
+
+        case KTUI_c_green           : res = 10;  break;
+        case KTUI_c_dark_green      : res = 2; break;
+
+        case KTUI_c_brown           : res = 3;  break;
+        case KTUI_c_yellow          : res = 11; break;
+
+        case KTUI_c_dark_blue       : res = 4;  break;
+        case KTUI_c_blue            : res = 12; break;
+
+        case KTUI_c_dark_magenta    : res = 5;  break;
+        case KTUI_c_magenta         : res = 13; break;
+
+        case KTUI_c_dark_cyan       : res = 6;  break;
+        case KTUI_c_cyan            : res = 14; break;
+
+        case KTUI_c_light_gray      : res = 7;  break;
+        case KTUI_c_white           : res = 15; break;
+    }
+    return res;
+}
+
+
+/**********************************************************************************/
+
+
+static void set_tui_attrib( tui_ac * curr, KTUI_attrib attr )
+{
+    if ( curr->attr != attr )
+    {
+        printf( "\033[0m" ); /* reset attribute, that means also color is default now! */
+        curr->fg = -1;       /* because of that we have to force the re-emission of color */
+        curr->bg = -1;
+
+        if ( attr & KTUI_a_bold )
+            printf( "\033[1m" );
+        if ( attr & KTUI_a_underline )
+            printf( "\033[4m" );
+        if ( attr & KTUI_a_blink )
+            printf( "\033[5m" );
+        if ( attr & KTUI_a_inverse )
+            printf( "\033[7m" );
+
+        curr->attr = attr;
+    }
+}
+
+
+static void set_tui_fg_color( tui_ac * curr, KTUI_color color )
+{
+    if ( curr->fg != color )
+    {
+        printf( "\033[38;5;%dm", color_2_ansi( color ) );
+        curr->fg = color;
+    }
+}
+
+
+static void set_tui_bg_color( tui_ac * curr, KTUI_color color )
+{
+    if ( curr->bg != color )
+    {
+        printf( "\033[48;5;%dm", color_2_ansi( color ) );
+        curr->bg = color;
+    }
+}
+
+
+void CC tui_send_strip( int x, int y, int count, tui_ac * curr, tui_ac * v,
+                        const char * s )
+{
+    set_tui_attrib( curr, v->attr );
+    set_tui_fg_color( curr, v->fg );
+    set_tui_bg_color( curr, v->bg );
+    printf( "\033[%d;%dH%.*s",  y + 1, x + 1, count, s );
+    fflush( stdout );
+}
+
+
+/**********************************************************************************/
+
+typedef struct KTUI_pf
+{
+/*    struct termios stored_settings; */
+    struct termio stored_settings;
+    struct sigaction sa_saved;
+    es_states es;
+    unsigned int mouse_event, mouse_x;
+} KTUI_pf;
+
+
+static struct KTUI * sig_self = NULL;
+
+
+static void get_lines_cols( int * cols, int * lines )
+{
+    struct winsize ws;
+    ioctl( STDIN_FILENO, TIOCGWINSZ, &ws );
+    if ( lines != NULL )
+        *lines = ws.ws_row;
+    if ( cols != NULL )
+        *cols = ws.ws_col;
+}
+
+
+static void sigwinchHandler( int sig )
+{
+    if ( sig_self != NULL )
+    {
+        get_lines_cols( &sig_self->cols, &sig_self->lines );
+        put_window_event( sig_self, sig_self->cols, sig_self->lines );
+    }
+}
+
+
+static void set_kb_raw_mode( struct termio * stored_settings )
+{
+    struct termio new_settings;
+    ioctl( STDIN_FILENO, TCGETA, stored_settings );
+    memmove ( &new_settings, stored_settings, sizeof new_settings );
+    new_settings.c_lflag &= ( ~ICANON );    /* exit canonical mode, enter raw mode */
+    new_settings.c_lflag &= ( ~ECHO );      /* don't echo the character */
+    new_settings.c_lflag &= ( ~IEXTEN );    /* don't enable extended input character processing */
+    new_settings.c_lflag &= ( ~ISIG );      /* don't automatically handle control-C */
+    new_settings.c_cc[ VTIME ] = 1;         /* timeout (tenths of a second) */
+    new_settings.c_cc[ VMIN ] = 0;          /* minimum number of characters */
+    ioctl( STDIN_FILENO, TCSETA, &new_settings ); /* apply the new settings */
+}
+
+
+static void restore_kb_mode( const struct termio * stored_settings )
+{
+    /* applies the terminal settings supplied as the argument */
+    ioctl( STDIN_FILENO, TCSETA, stored_settings );
+}
+
+
+rc_t CC KTUI_Init_platform( KTUI * self )
+{
+    rc_t rc = 0;
+    struct KTUI_pf * pf = malloc( sizeof * pf );
+    if ( pf == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcMemory, rcExhausted );
+    else
+    {
+        struct sigaction sa_new;
+
+        set_kb_raw_mode( &pf->stored_settings );
+        sa_new.sa_flags = 0;
+        sa_new.sa_handler = sigwinchHandler;
+        sigaction( SIGWINCH, &sa_new, &pf->sa_saved );
+        get_lines_cols( &self->cols, &self->lines );
+        pf->es = es_normal;
+
+        printf( "\033[2J" );        /* clrscr */
+        printf( "\033[?25l" );      /* cursor off */
+
+        /* printf( "\033[?9h" );     mouse tracking on ( SET_X10_MOUSE ): mouse-down events, does not work with putty */
+		
+		printf( "\033[?1000h" );     /* mouse tracking on ( SET_VT200_MOUSE ): mouse-up/down events, does work with putty */
+		printf( "\033[?1002h" );     /* mouse tracking on ( SET_BTN_EVENT_MOUSE ): mouse-up/down/move events, does work with putty */
+		/*printf( "\033[?1003h" );   mouse tracking on ( SET_ANY_EVENT_MOUSE ): ??? */
+		
+        fflush( stdout );
+
+        sig_self = self;
+        self->pf = pf;
+    }
+    return rc;
+}
+
+
+rc_t CC KTUI_Destroy_platform ( struct KTUI_pf * pf )
+{
+    if ( pf != NULL )
+    {
+        restore_kb_mode( &pf->stored_settings );
+        sigaction( SIGWINCH, &pf->sa_saved, NULL );
+        free( ( void * ) pf );
+    }
+
+    sig_self = NULL;
+    printf( "\033[0;39;49m" );  /* reset colors */
+    printf( "\033[H" );         /* home */
+    printf( "\033[2J" );        /* clrscr */
+    printf( "\033[?25h" );      /* cursor off */
+
+    /*printf( "\033[?9l" );       mouse tracking X10-style off */
+	printf( "\033[?1000l" );       /* mouse tracking off */	
+	printf( "\033[?1002l" );       /* mouse tracking off */		
+	/*printf( "\033[?1003l" );    mouse tracking off */	
+    fflush( stdout );
+
+    return 0;
+}
+
+
+static void put_kb_event_u( struct KTUI * self, int key, KTUI_key code )
+{
+    if ( self->pf != NULL ) self->pf->es = es_normal;
+    put_kb_event( self, key, code );
+}
+
+
+static void put_kb_alpha( struct KTUI * self, int key )
+{
+    put_kb_event_u( self, key, ktui_alpha );
+}
+
+static void put_kb_alpha_3( struct KTUI * self, int key1, int key2, int key3 )
+{
+    put_kb_alpha( self, key1 );
+    put_kb_alpha( self, key2 );
+    put_kb_alpha( self, key3 );
+}
+
+static void put_kb_alpha_4( struct KTUI * self, int key1, int key2, int key3, int key4 )
+{
+    put_kb_alpha( self, key1 );
+    put_kb_alpha( self, key2 );
+    put_kb_alpha( self, key3 );
+    put_kb_alpha( self, key4 );
+}
+
+static void put_kb_alpha_5( struct KTUI * self, int key1, int key2, int key3, int key4, int key5 )
+{
+    put_kb_alpha( self, key1 );
+    put_kb_alpha( self, key2 );
+    put_kb_alpha( self, key3 );
+    put_kb_alpha( self, key4 );
+    put_kb_alpha( self, key5 );
+}
+
+
+/* -------------------------------------------------------------------------------------
+
+mouse_event	7 6 5 4 3 2 1 0
+						B B
+						0 0 ... left mouse button
+						0 1 ... middle mouse button
+						1 0 ... right mouse button
+						1 1 ... button up ( don't know which one )
+                      S ....... status of Shift key						0x04
+                    M ......... status of Meta key ( Alt )				0x08
+                  C ........... status of Ctrl key						0x10 (16)
+			  0 0 ............. unknown									0x00
+              0 1 ............. button event ( down, up )				0x20
+              1 0 ............. move event ( + button )					0x40
+              1 1 ............. scroll event ( + button )				0x60
+			  
+------------------------------------------------------------------------------------- */
+static void put_mouse_event_u( struct KTUI * self, unsigned int y )
+{
+    if ( self->pf != NULL )
+    {
+		unsigned int ev = self->pf->mouse_event;
+		KTUI_mouse_button b = ktui_mouse_button_none;
+		KTUI_mouse_action a = ktui_mouse_action_none;
+
+		switch( ev & 0x03 )
+		{
+			case 0x00 : b = ktui_mouse_button_left; break;
+			case 0x01 : b = ktui_mouse_button_middle; break;
+			case 0x02 : b = ktui_mouse_button_right; break;
+			case 0x03 : b = ktui_mouse_button_up; break;
+		}
+		
+		switch ( ev & 0x60 )
+		{
+			case 0x20 : a = ktui_mouse_action_button; break;
+			case 0x40 : a = ktui_mouse_action_move; break;
+			case 0x60 : a = ktui_mouse_action_scroll; break;
+		}
+
+		put_mouse_event( self, self->pf->mouse_x, y, b, a, ev );
+        self->pf->es = es_normal;
+    }
+}
+
+static void statemachine( struct KTUI * self, unsigned int x )
+{
+    if ( self->pf != NULL ) switch( self->pf->es )
+    {
+        case es_normal : switch( x )
+                        {
+                            case 10 : put_kb_event_u( self, x, ktui_enter ); break;
+                            case 8  : put_kb_event_u( self, x, ktui_bksp ); break;
+                            case 9  : put_kb_event_u( self, x, ktui_tab ); break;
+                            case 127 : put_kb_event_u( self, x, ktui_bksp ); break;
+                            case 27 : self->pf->es = es_ESC; break;
+                            default : put_kb_alpha( self, x ); break;
+                        } break;
+
+        case es_ESC : switch( x )
+                        {
+                            case 91 : self->pf->es = es_ESC_91; break;
+                            case 79 : self->pf->es = es_ESC_79; break;
+                            default : put_kb_alpha( self, x ); break;
+                        } break;
+
+        case es_ESC_91 : switch( x )
+                        {
+                            case 65 : put_kb_event_u( self, x, ktui_up ); break;
+                            case 66 : put_kb_event_u( self, x, ktui_down ); break;
+                            case 67 : put_kb_event_u( self, x, ktui_right ); break;
+                            case 68 : put_kb_event_u( self, x, ktui_left ); break;
+                            case 69 : put_kb_alpha( self, '5' ); break;
+                            case 70 : put_kb_event_u( self, x, ktui_end ); break;
+                            case 72 : put_kb_event_u( self, x, ktui_home ); break;
+
+                            case 49 : self->pf->es = es_ESC_91_49; break;
+                            case 50 : self->pf->es = es_ESC_91_50; break;
+                            case 51 : self->pf->es = es_ESC_91_51; break;
+                            case 52 : self->pf->es = es_ESC_91_52; break;
+                            case 53 : self->pf->es = es_ESC_91_53; break;
+                            case 54 : self->pf->es = es_ESC_91_54; break;
+
+                            case 77 : self->pf->es = es_ESC_91_77_B; break;   /* mouse reporting */
+
+                            case 90 : put_kb_event_u( self, x, ktui_shift_tab ); break; /* shift tab */
+
+                            default : put_kb_alpha_3( self, 27, 91, x ); break;
+                        } break;
+
+        case es_ESC_91_49 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_home ); break;
+                            case 49  : self->pf->es = es_ESC_91_49_49; break;
+                            case 50  : self->pf->es = es_ESC_91_49_50; break;
+                            case 51  : self->pf->es = es_ESC_91_49_51; break;
+                            case 52  : self->pf->es = es_ESC_91_49_52; break;
+                            case 53  : self->pf->es = es_ESC_91_49_53; break;
+                            case 55  : self->pf->es = es_ESC_91_49_55; break;
+                            case 56  : self->pf->es = es_ESC_91_49_56; break;
+                            case 57  : self->pf->es = es_ESC_91_49_57; break;
+                            default : put_kb_alpha_4( self, 27, 91, 49, x ); break;
+                        } break;
+
+        case es_ESC_91_49_49 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F1 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 49, x ); break;
+                        } break;
+
+        case es_ESC_91_49_50 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F2 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 50, x ); break;
+                        } break;
+
+        case es_ESC_91_49_51 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F3 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 51, x ); break;
+                        } break;
+
+        case es_ESC_91_49_52 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F4 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 52, x ); break;
+                        } break;
+
+        case es_ESC_91_49_53 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F5 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 53, x ); break;
+                        } break;
+
+        case es_ESC_91_49_55 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F6 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 55, x ); break;
+                        } break;
+
+        case es_ESC_91_49_56 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F7 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 56, x ); break;
+                        } break;
+
+        case es_ESC_91_49_57 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F8 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 49, 57, x ); break;
+                        } break;
+
+        case es_ESC_91_50 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_ins ); break;
+                            case 48 : self->pf->es = es_ESC_91_50_48; break;
+                            case 49 : self->pf->es = es_ESC_91_50_49; break;
+                            case 51 : self->pf->es = es_ESC_91_50_51; break;
+                            case 52 : self->pf->es = es_ESC_91_50_52; break;
+                            default : put_kb_alpha_4( self, 27, 91, 50, x ); break;
+                        } break;
+
+        case es_ESC_91_50_48 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F9 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 50, 48, x ); break;
+                        } break;
+
+        case es_ESC_91_50_49 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F10 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 50, 49, x ); break;
+                        } break;
+
+        case es_ESC_91_50_51 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F11 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 50, 51, x ); break;
+                        } break;
+
+        case es_ESC_91_50_52 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_F12 ); break;
+                            default : put_kb_alpha_5( self, 27, 91, 50, 52, x ); break;
+                        } break;
+
+        case es_ESC_91_51 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_del ); break;
+                            default : put_kb_alpha_4( self, 27, 91, 51, x ); break;
+                        } break;
+
+        case es_ESC_91_52 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_end ); break;
+                            default : put_kb_alpha_4( self, 27, 91, 52, x ); break;
+                        } break;
+
+        case es_ESC_91_53 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_pgup ); break;
+                            default : put_kb_alpha_4( self, 27, 91, 53, x ); break;
+                        } break;
+
+        case es_ESC_91_54 : switch( x )
+                        {
+                            case 126 : put_kb_event_u( self, x, ktui_pgdn ); break;
+                            default : put_kb_alpha_4( self, 27, 91, 54, x ); break;
+                        } break;
+
+        case es_ESC_79 : switch( x )
+                        {
+                            case 80 : put_kb_event_u( self, x, ktui_F1 ); break;
+                            case 81 : put_kb_event_u( self, x, ktui_F2 ); break;
+                            case 82 : put_kb_event_u( self, x, ktui_F3 ); break;
+                            case 83 : put_kb_event_u( self, x, ktui_F4 ); break;
+                            case 77 : put_kb_event_u( self, x, ktui_enter ); break;
+                            case 65 : put_kb_event_u( self, x, ktui_up ); break;
+                            case 66 : put_kb_event_u( self, x, ktui_down ); break;
+                            case 67 : put_kb_event_u( self, x, ktui_right ); break;
+                            case 68 : put_kb_event_u( self, x, ktui_left ); break;
+
+                            case 70 : put_kb_event_u( self, x, ktui_end ); break;
+                            case 72 : put_kb_event_u( self, x, ktui_home ); break;
+
+                            case 119 : put_kb_alpha( self, '7' ); break;
+                            case 120 : put_kb_alpha( self, '8' ); break;
+                            case 121 : put_kb_alpha( self, '9' ); break;
+                            case 116 : put_kb_alpha( self, '4' ); break;
+                            case 117 : put_kb_alpha( self, '5' ); break;
+                            case 118 : put_kb_alpha( self, '6' ); break;
+                            case 113 : put_kb_alpha( self, '1' ); break;
+                            case 114 : put_kb_alpha( self, '2' ); break;
+                            case 115 : put_kb_alpha( self, '3' ); break;
+                            case 112 : put_kb_alpha( self, '0' ); break;
+                            case 110 : put_kb_alpha( self, '.' ); break;
+
+                            default : put_kb_alpha_3( self, 27, 79, x ); break;
+                        } break;
+
+        case es_ESC_91_77_B :   self->pf->mouse_event = x;
+                                self->pf->es = es_ESC_91_77_X;
+                                break;
+
+        case es_ESC_91_77_X :   self->pf->mouse_x = x - 33;
+                                self->pf->es = es_ESC_91_77_Y;
+                                break;
+
+        case es_ESC_91_77_Y :  put_mouse_event_u( self, x - 33 ); break;
+
+        default : self->pf->es = es_normal; break;
+    }
+
+}
+
+void CC read_from_stdin( struct KTUI * self, uint32_t timeout )
+{
+    fd_set rfds;
+    struct timeval tv;
+    int select_res;
+
+    FD_ZERO( &rfds );
+    FD_SET ( STDIN_FILENO, &rfds );
+    tv.tv_sec  = 0;
+    tv.tv_usec = timeout;
+
+    select_res = select( 1, &rfds, NULL, NULL, &tv );
+    if ( select_res < 0 )
+    {
+        /* error ... */
+    }
+    else if ( select_res == 0 )
+    {
+        /* no input during timeout... */
+    }
+    else
+    {
+        unsigned char in_buffer[ 32 ];
+        int i, n = read( STDIN_FILENO, in_buffer, sizeof in_buffer );
+        for ( i = 0; i < n; ++i )
+        {
+            unsigned int x = ( unsigned int ) in_buffer[ i ];
+            statemachine( self, x );
+        }
+    }
+}
diff --git a/libs/tui/screen.c b/libs/tui/screen.c
new file mode 100644
index 0000000..d7b38a4
--- /dev/null
+++ b/libs/tui/screen.c
@@ -0,0 +1,209 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "screen.h"
+#include "tui-priv.h"
+#include <tui/tui.h>
+#include <sysalloc.h>
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+void CC clr_tui_screen( tui_screen * screen, const tui_ac * v, bool dirty )
+{
+    int line_idx;
+    for ( line_idx = 0; line_idx < LINES_PER_SCREEN; ++line_idx )
+    {
+        int column;
+        tui_line * line = &screen->lines[ line_idx ];
+        memset( &line->chars[ 0 ], ' ', CHR_PER_LINE );
+        for ( column = 0; column < CHR_PER_LINE; ++column )
+        {
+            tui_ac * ac = &line->ac[ column ];
+            ac->fg = v->fg;
+            ac->bg = v->bg;
+            ac->attr = v->attr;
+            line->dirty[ column ] = dirty;
+        }
+        line->line_dirty = dirty;
+    }
+    screen->dirty = dirty;
+}
+
+
+void CC print_into_screen( tui_screen * screen, int x, int y, const tui_ac * v,
+                           const char * s, uint32_t l )
+{
+    if ( y < LINES_PER_SCREEN && x < CHR_PER_LINE )
+    {
+        tui_line * line = &screen->lines[ y ];
+        uint32_t column, idx, sl = string_measure ( s, NULL );
+        bool any_chars_dirty = false;
+        if ( l > CHR_PER_LINE ) l =CHR_PER_LINE;
+        if ( x + l > CHR_PER_LINE ) l = ( CHR_PER_LINE - x );
+        if ( sl > l ) sl = l;
+        if ( x + sl > CHR_PER_LINE ) sl = ( CHR_PER_LINE - x );
+
+        for ( column = x, idx = 0; idx < sl; ++column, ++idx )
+        {
+            tui_ac * ac = &line->ac[ column ];
+            if ( ac->attr != v->attr ||
+                 ac->fg != v->fg ||
+                 ac->bg != v->bg ||
+                 line->chars[ column ] != s[ idx ] )
+            {
+                ac->attr = v->attr;
+                ac->fg = v->fg;
+                ac->bg = v->bg;
+                line->chars[ column ] = s[ idx ];
+                line->dirty[ column ] = true;
+                any_chars_dirty = true;
+            }
+        }
+
+        if ( sl < l )
+        {
+            for ( column = x + sl, idx = sl; idx < l; ++column, ++idx )
+            {
+                tui_ac * ac = &line->ac[ column ];
+                if ( ac->attr != v->attr ||
+                     ac->fg != v->fg ||
+                     ac->bg != v->bg ||
+                     line->chars[ column ] != ' ' )
+                {
+                    ac->attr = v->attr;
+                    ac->fg = v->fg;
+                    ac->bg = v->bg;
+                    line->chars[ column ] = ' ';
+                    line->dirty[ column ] = true;
+                    any_chars_dirty = true;
+                }
+            }
+        }
+
+        if ( any_chars_dirty )
+        {
+            line->line_dirty = true;
+            screen->dirty = true;
+        }
+    }
+}
+
+
+void CC paint_into_screen( tui_screen * screen, const tui_rect * r,
+                           const tui_ac * v, const char c )
+{
+    int x = r->top_left.x;
+    int y = r->top_left.y;
+    if ( y < LINES_PER_SCREEN && x < CHR_PER_LINE )
+    {
+        int line_idx, h1 = r->h;
+        if ( ( y + r->h ) > LINES_PER_SCREEN ) h1 = ( LINES_PER_SCREEN - y );
+        for ( line_idx = 0; line_idx < h1; ++line_idx )
+        {
+            int column, w1 = r->w;
+            tui_line * line = &screen->lines[ y + line_idx ];
+            if ( ( x + r->w ) > CHR_PER_LINE ) w1 = ( CHR_PER_LINE - x );
+            for ( column = 0; column < w1; ++column )
+            {
+                int col_idx = x + column;
+                tui_ac * ac = &line->ac[ col_idx ];
+                if ( ac->attr != v->attr ||
+                     ac->fg != v->fg ||
+                     ac->bg != v->bg ||
+                     line->chars[ col_idx ] != c )
+                {
+                    ac->attr = v->attr;
+                    ac->fg = v->fg;
+                    ac->bg = v->bg;
+                    line->chars[ col_idx ] = c;
+                    line->dirty[ col_idx ] = true;
+                }
+            }
+            line->line_dirty = true;
+        }
+        screen->dirty = true;
+    }
+}
+
+
+void CC send_tui_screen( tui_screen * screen, int n_lines, int n_cols )
+{
+    if ( screen->dirty )
+    {
+        int line_idx;
+        for ( line_idx = 0; line_idx < n_lines; ++line_idx )
+        {
+            tui_line * line = &screen->lines[ line_idx ];
+            if ( line->line_dirty )
+            {
+                tui_ac curr = { -1, -1, -1 };
+                int column, start = -1;
+                for ( column = 0; column < n_cols; ++column )
+                {
+                    if ( start < 0 )
+                    {
+                        if ( line->dirty[ column ] )
+                            start = column;
+                    }
+                    else
+                    {
+                        tui_ac * ac = &line->ac[ start ];
+                        tui_ac * cc = &line->ac[ column ];
+                        if ( !line->dirty[ column ] ||
+                              ac->fg != cc->fg ||
+                              ac->bg != cc->bg || 
+                              ac->attr != cc->attr )
+                        {
+                            int count = ( column - start );
+                            /* in systui.c ==> platform specific */
+                            tui_send_strip( start, line_idx, count,
+                                            &curr, ac, &line->chars[ start ] );
+
+                            if ( line->dirty[ column ] )
+                                start = column;
+                            else
+                                start = -1;
+                        }
+                    }
+                    line->dirty[ column ] = false;
+                }
+
+                if ( start >= 0 )
+                {
+                    int count = ( n_cols - start );
+                    /* in systui.c ==> platform specific */
+                    tui_send_strip( start, line_idx, count,
+                                    &curr, &line->ac[ start ], &line->chars[ start ] );
+                }
+                line->line_dirty = false;
+            }
+        }
+        screen->dirty = false;
+    }
+}
diff --git a/libs/tui/screen.h b/libs/tui/screen.h
new file mode 100644
index 0000000..547d29e
--- /dev/null
+++ b/libs/tui/screen.h
@@ -0,0 +1,75 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_screen_
+#define _h_screen_
+
+#ifndef _h_tui_extern_
+#include <tui/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <tui/tui.h>
+
+#define CHR_PER_LINE 1000
+
+typedef struct tui_line
+{
+    char chars[ CHR_PER_LINE ];
+    tui_ac ac[ CHR_PER_LINE ];  /* attrib and color */
+    bool dirty[ CHR_PER_LINE ];
+    bool line_dirty;
+} tui_line;
+
+#define LINES_PER_SCREEN 200
+
+typedef struct tui_screen
+{
+    tui_line lines[ LINES_PER_SCREEN ];
+    bool dirty;
+} tui_screen;
+
+
+void CC clr_tui_screen( tui_screen * screen, const tui_ac * v, bool dirty );
+
+void CC print_into_screen( tui_screen * screen, int x, int y, const tui_ac * v, const char * s, uint32_t l );
+
+void CC paint_into_screen( tui_screen * screen, const tui_rect * r, const tui_ac * v, const char c );
+
+void CC send_tui_screen( tui_screen * screen, int n_lines, int n_cols );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_screen */
diff --git a/libs/tui/string_cache.c b/libs/tui/string_cache.c
new file mode 100644
index 0000000..c30f85c
--- /dev/null
+++ b/libs/tui/string_cache.c
@@ -0,0 +1,378 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "string_cache.h"
+#include <klib/text.h>
+
+#include <sysalloc.h>
+
+typedef struct cache_row
+{
+    char ** cells;
+    int * cell_idx;
+    int cell_count;
+    int nxt_free_ptr;
+} cache_row;
+
+
+static cache_row * make_cache_row( int count )
+{
+    cache_row * res = malloc( sizeof *res );
+    if ( res != NULL )
+    {
+        res->cells = calloc( sizeof( char * ), count );
+        if ( res->cells != NULL )
+        {
+            res->cell_idx = malloc( sizeof( int ) * count );
+            if ( res->cell_idx != NULL )
+            {
+                int i;
+                for ( i = 0; i < count; ++i ) res->cell_idx[ i ] = -1;
+                res->cell_count = count;
+                res->nxt_free_ptr = 0;
+            }
+            else
+            {
+                free( res->cells );
+                free( res );
+                res = NULL;
+            }
+        }
+        else
+        {
+            free( res );
+            res = NULL;
+        }
+    }
+    return res;
+}
+
+
+static void release_cache_row( cache_row * cr )
+{
+    if ( cr != NULL )
+    {
+        if ( cr->cells != NULL )
+        {
+            int i;
+            for ( i = 0; i < cr->cell_count; ++i )
+            {
+                char * s = cr->cells[ i ];
+                if ( s != NULL ) free( s );
+            }
+            free( cr->cells );
+        }
+        if ( cr->cell_idx != NULL ) free( cr->cell_idx );
+        free( cr );
+    }
+}
+
+
+static const char * get_cell_from_cache_row( cache_row * cr, int idx )
+{
+    const char * res = NULL;
+    if ( cr != NULL )
+    {
+        if ( idx < cr->cell_count )
+        {
+            int ptr_idx = cr->cell_idx[ idx ];
+            if ( ptr_idx >= 0 && ptr_idx < cr->cell_count )
+                res = cr->cells[ ptr_idx ];
+        }
+    }
+    return res;
+}
+
+
+static int put_cell_to_cache_row( cache_row * cr, int idx, const char * s )
+{
+    int res = 0;
+    if ( cr != NULL )
+    {
+        if ( idx < cr->cell_count )
+        {
+            int ptr_idx = cr->cell_idx[ idx ];
+            if ( ptr_idx >= 0 )
+            {
+                /* cell is already used... */
+                char * s_ = cr->cells[ ptr_idx ];
+                if ( s_ != NULL ) free( s_ );
+                cr->cells[ ptr_idx ] = ( s != NULL ) ? string_dup_measure ( s, NULL ) : NULL;
+                res++;
+            }
+            else if ( cr->nxt_free_ptr < cr->cell_count )
+            {
+                /* cell is not already used, get the next free space */
+                
+                ptr_idx = cr->nxt_free_ptr++;
+                cr->cells[ ptr_idx ] = ( s != NULL ) ? string_dup_measure ( s, NULL ) : NULL;
+                cr->cell_idx[ idx ] = ptr_idx;
+                res++;
+            }
+        }
+    }
+    return res;
+}
+
+
+static void clear_cache_row( cache_row * cr )
+{
+    if ( cr != NULL )
+    {
+        int i;
+        for ( i = 0; i < cr->cell_count; ++i )
+        {
+            if ( cr->cells[ i ] != NULL ) free( cr->cells[ i ] );
+            cr->cells[ i ] = NULL;
+            cr->cell_idx[ i ] = -1;
+        }
+        cr->nxt_free_ptr = 0;
+    }
+}
+
+
+/* ----------------------------------------------------------------------------------------------------- */
+
+
+typedef struct string_cache
+{
+    cache_row ** rows;
+    long long int row_offset;
+    int row_count;
+} string_cache;
+
+
+static void release_string_cache_rows( cache_row ** rows, int count )
+{
+    int i;
+    for ( i = 0; i < count; ++i )
+    {
+        if ( rows[ i ] != NULL )
+            release_cache_row( rows[ i ] ); 
+    }
+    free( rows );
+}
+
+
+string_cache * make_string_cache( int row_count, int col_count )
+{
+    string_cache * res = malloc( sizeof *res );
+    if ( res != NULL )
+    {
+        res->rows = calloc( sizeof( *res->rows ), row_count );
+        if ( res->rows != NULL )
+        {
+            int i, ok;
+            for ( i = 0, ok = 1; i < row_count && ok; ++i )
+            {
+                res->rows[ i ] = make_cache_row( col_count );
+                if ( res->rows[ i ] == NULL )
+                    ok = 0;
+            }
+            if ( ok )
+            {
+                res->row_count = row_count;
+                res->row_offset = 0;
+            }
+            else
+            {
+                release_string_cache_rows( res->rows, row_count );
+                free( res );
+                res = NULL;
+            }
+        }
+        else
+        {
+            free( res );
+            res = NULL;
+        }
+    }
+    return res;
+}
+
+
+void release_string_cache( string_cache * sc )
+{
+    if ( sc != NULL )
+    {
+        if ( sc->rows != NULL )
+            release_string_cache_rows( sc->rows, sc->row_count );
+        free( sc );
+    }
+}
+
+
+int get_string_cache_rowcount( const string_cache * sc )
+{
+    if ( sc != NULL )
+        return sc->row_count;
+    else
+        return 0;
+}
+
+
+long long int get_string_cache_start( const string_cache * sc )
+{
+    if ( sc != NULL )
+        return sc->row_offset;
+    else
+        return 0;
+}
+
+
+const char * get_cell_from_string_cache( const string_cache * sc, long long int row, int col )
+{
+    const char * res = NULL;
+    if ( sc != NULL )
+    {
+        long long int temp_idx = ( row - sc->row_offset );
+        if ( temp_idx >= 0 && temp_idx < sc->row_count )
+            res = get_cell_from_cache_row( sc->rows[ temp_idx ], col );
+    }
+    return res;
+}
+
+
+static void invalidate_string_cache_from_to( string_cache * sc, int from, int count )
+{
+    if ( sc != NULL )
+        if ( sc->rows != NULL )
+        {
+            int i;
+            for ( i = 0; i < count; ++i )
+                clear_cache_row( sc->rows[ i + from ] );
+        }
+}
+
+
+static void reverse_cache_rows( cache_row ** rows, int start, int count )
+{
+    int end = start + count - 1;
+    while ( start < end )
+    {
+        cache_row * temp = rows[ start ];
+        rows[ start ] = rows[ end ];
+        rows[ end ] = temp;
+        start++;
+        end--;
+    }
+}
+
+
+static void rotate_cache_rows_up( cache_row ** rows, int pivot, int count )
+{
+    reverse_cache_rows( rows, 0, count );
+    reverse_cache_rows( rows, 0, pivot );
+    reverse_cache_rows( rows, pivot, count - pivot );
+}
+
+
+static void rotate_cache_rows_down( cache_row ** rows, int pivot, int count )
+{
+    reverse_cache_rows( rows, 0, pivot );
+    reverse_cache_rows( rows, pivot, count - pivot );
+    reverse_cache_rows( rows, 0, count );
+}
+
+
+void invalidate_string_cache( string_cache * sc )
+{
+    invalidate_string_cache_from_to( sc, 0, sc->row_count );
+}
+
+
+int put_cell_to_string_cache( string_cache * sc, long long int row, int col, const char * s )
+{
+    int res = 0;
+    if ( sc != NULL )
+    {
+        if ( row < sc->row_offset && row >= 0 )
+        {
+            /* ====================================================================================== */
+            /* access is before the current window: decide if we can shift or need a full invalidation */
+
+            long long int distance = ( sc->row_offset - row );
+            /* printf( "-- before window ( distance = %lld ) --\n", distance ); */
+            if ( distance >= sc->row_count )
+            {
+                /* ===> */
+                /* jumping out of the cache content: full invalidation */
+                /* printf( "-- full invalidation of cache --\n" ); */
+
+                invalidate_string_cache_from_to( sc, 0, sc->row_count );
+                sc->row_offset = row;
+                res = put_cell_to_cache_row( sc->rows[ 0 ], col, s );
+            }
+            else
+            {
+                /* ===> */
+                /* some content can still be used: rotate and partial invalidation */
+                /* printf( "-- rotate by %lld rows up and partial invalidation of cache --\n", distance ); */
+
+                rotate_cache_rows_up( sc->rows, (int)distance, sc->row_count );
+                invalidate_string_cache_from_to( sc, 0, (int)distance );
+                sc->row_offset = row;
+                res = put_cell_to_cache_row( sc->rows[ 0 ], col, s );
+            }
+        }
+        else if ( row >= ( sc->row_offset + sc->row_count ) )
+        {
+            /* ====================================================================================== */
+            /* acess is after the current window: decide if we can shift or need a full invalidation */
+            long long int distance = ( row - ( sc->row_offset + sc->row_count ) ) + 1;
+            /* printf( "-- after window ( distance = %lld ) --\n", distance ); */
+            if ( distance >= sc->row_count )
+            {
+                /* ===> */
+                /* jumping out of the cache content: full invalidation */
+                /* printf( "-- full invalidation of cache --\n" ); */
+
+                invalidate_string_cache_from_to( sc, 0, sc->row_count );
+                sc->row_offset = row;
+                res = put_cell_to_cache_row( sc->rows[ 0 ], col, s );
+            }
+            else
+            {
+                /* ===> */
+                /* some content can still be used: rotate and partial invalidation */
+                /* printf( "-- rotate by %lld rows down and partial invalidation of cache --\n", distance ); */
+                rotate_cache_rows_down( sc->rows, (int)distance, sc->row_count );
+                invalidate_string_cache_from_to( sc, ( sc->row_count - (int)distance ), (int)distance );
+                sc->row_offset += distance;
+                res = put_cell_to_cache_row( sc->rows[ sc->row_count - 1 ], col, s );
+            }
+        }
+        else if ( row >= 0 )
+        {
+            /* ====================================================================================== */
+            /* access is in the current window: no need to shift or invalidate the rows */
+            long long int rel_row = ( row - sc->row_offset );
+            /* printf( "-- in window ( rel. row = %lld ) --\n", rel_row ); */
+            res = put_cell_to_cache_row( sc->rows[ rel_row ], col, s );
+        }
+    }
+    return res;
+}
diff --git a/libs/tui/string_cache.h b/libs/tui/string_cache.h
new file mode 100644
index 0000000..1aaac1d
--- /dev/null
+++ b/libs/tui/string_cache.h
@@ -0,0 +1,54 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_string_cache_
+#define _h_string_cache_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct string_cache;
+
+struct string_cache * make_string_cache( int row_count, int col_count );
+void release_string_cache( struct string_cache * sc );
+
+int get_string_cache_rowcount( const struct string_cache * sc );
+long long int get_string_cache_start( const struct string_cache * sc );
+
+const char * get_cell_from_string_cache( const struct string_cache * sc, long long int row, int col );
+void invalidate_string_cache( struct string_cache * sc );
+int put_cell_to_string_cache( struct string_cache * sc, long long int row, int col, const char * s );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_string_cache_ */
diff --git a/libs/tui/tui-priv.h b/libs/tui/tui-priv.h
new file mode 100644
index 0000000..39898b3
--- /dev/null
+++ b/libs/tui/tui-priv.h
@@ -0,0 +1,87 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_tui_priv_
+#define _h_tui_priv_
+
+#ifndef _h_tui_extern_
+#include <tui/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/refcount.h>
+#include <tui/tui.h>
+#include <kfs/directory.h>
+#include <vfs/manager.h>
+
+#include "eventring.h"
+#include "screen.h"
+
+struct KTUI_pf;
+
+typedef struct KTUI
+{
+    KRefcount refcount;
+    const KTUIMgr * mgr;
+    Event_Ring ev_ring;
+    tui_screen screen;
+    int lines, cols;
+    uint32_t timeout;
+
+    struct KTUI_pf * pf;
+} KTUI;
+
+
+void CC put_window_event( struct KTUI * self, int lines, int cols );
+void CC put_kb_event( struct KTUI * self, int key, KTUI_key code );
+void CC put_mouse_event( struct KTUI * self, unsigned int x, unsigned int y, 
+                         KTUI_mouse_button button, KTUI_mouse_action action, uint32_t raw_event );
+
+void CC read_from_stdin( struct KTUI * self, uint32_t timeout );
+void CC tui_send_strip( int x, int y, int count, tui_ac * curr, tui_ac * v,
+                        const char * s );
+
+rc_t CC KTUI_Init_platform( KTUI * self );
+rc_t CC KTUI_Destroy_platform ( struct KTUI_pf * pf );
+
+rc_t native_to_internal( VFSManager * vfs_mgr, const char * native, char * buffer, uint32_t buffer_size, size_t * written );
+rc_t internal_to_native( VFSManager * vfs_mgr, const char * internal, char * buffer, uint32_t buffer_size, size_t * written );
+rc_t set_native_caption( struct KTUIDlg * dlg, VFSManager * vfs_mgr, uint32_t id, const char * internal_path );
+rc_t fill_widget_with_dirs( struct KTUIDlg * dlg, KDirectory * dir, uint32_t id, const char * path, const char * to_focus );
+rc_t fill_widget_with_files( struct KTUIDlg * dlg, KDirectory * dir, uint32_t id, const char * path, const char * extension );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_tui_priv */
diff --git a/libs/tui/tui.c b/libs/tui/tui.c
new file mode 100644
index 0000000..854508f
--- /dev/null
+++ b/libs/tui/tui.c
@@ -0,0 +1,380 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <tui/extern.h>
+#include <tui/tui.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include "eventring.h"
+#include "screen.h"
+#include "tui-priv.h"
+
+#include <sysalloc.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* this is the generic - not platform specific code of KTUI */
+
+static const char tuimanager_classname [] = "TUIManager";
+static const char tui_classname [] = "TUI_Implementation";
+
+LIB_EXPORT rc_t CC KTUIMake ( const KTUIMgr * mgr, struct KTUI ** self, uint32_t timeout )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        KTUI * tui = malloc( sizeof * tui );
+        if ( tui == NULL )
+            rc = RC( rcApp, rcAttr, rcCreating, rcMemory, rcExhausted );
+        else
+        {
+            tui_ac v = { KTUI_a_none, KTUI_c_black, KTUI_c_green };
+            event_ring_init( &tui->ev_ring );
+
+            clr_tui_screen( &tui->screen, &v, false );
+
+            rc = KTUI_Init_platform( tui ); /* call the platform specific init */
+            if ( rc == 0 )
+            {
+                tui->mgr = mgr;
+                tui->timeout = timeout;
+                if ( rc == 0 )
+                    KRefcountInit( &tui->refcount, 1, "TUI", "make", tui_classname );
+            }
+            if ( rc != 0 )
+                free( ( void * ) tui );
+            else
+                ( * self ) = tui;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIAddRef ( const struct KTUI * self )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd( &self->refcount, tui_classname ) )
+        {
+        case krefOkay :
+            break;
+        case krefZero :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcIncorrect );
+        case krefLimit :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcExhausted );
+        case krefNegative :
+            rc =  RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid );
+        default :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcUnknown );
+        }
+    }
+    return rc;
+}
+
+
+static rc_t CC KTUIDestroy ( struct KTUI * self )
+{
+    KTUI_Destroy_platform( self->pf );
+
+    event_ring_destroy( &self->ev_ring );
+    KRefcountWhack( &self->refcount, tui_classname );
+    free( self );
+    return 0;
+}
+
+
+/* not platform specific */
+LIB_EXPORT rc_t CC KTUIRelease ( const struct KTUI * self )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop( &self->refcount, tui_classname ) )
+        {
+        case krefOkay :
+        case krefZero :
+            break;
+        case krefWhack :
+            rc = KTUIDestroy( ( struct KTUI * )self );
+            break;
+        case krefNegative:
+            return RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid );
+        default:
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcUnknown );
+            break;            
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUISetTimeout ( struct KTUI * self, uint32_t timeout )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+        self->timeout = timeout;
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIPrint( struct KTUI * self, const tui_point * p,
+                              const tui_ac * ac, const char * s, uint32_t l )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( ac == NULL || p == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    else
+        /* in screen.c */
+        print_into_screen( &self->screen, p->x, p->y, ac, s, l );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIRect ( struct KTUI * self, const tui_rect * r,
+                              const tui_ac * ac, const char c )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( ac == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( r != NULL )
+            paint_into_screen( &self->screen, r, ac, c );
+        else
+            clr_tui_screen( &self->screen, ac, true );
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIFlush ( struct KTUI * self, bool forced )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        if ( forced )
+        {
+            tui_ac ac;
+            set_ac( &ac, KTUI_a_none, KTUI_c_white, KTUI_c_white );
+            clr_tui_screen( &self->screen, &ac, true );
+        }
+		
+		/* this is platform specific! in systui.c */
+        send_tui_screen( &self->screen, self->lines, self->cols );
+    }
+
+    return rc;
+}
+
+
+/* not platform specific, except the call to platform specific read_from_stdin() */
+LIB_EXPORT rc_t CC KTUIGet ( struct KTUI * self, tui_event * event )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( event == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    else
+    {
+        tui_event * ev;
+        read_from_stdin( self, self->timeout ); /* that is the platform specific state-machine */
+        ev = event_ring_get( &self->ev_ring );
+        if ( ev == NULL )
+        {
+            event->event_type = ktui_event_none;
+        }
+        else
+        {
+            copy_event( ev, event );
+            event_ring_put_to_stock( &self->ev_ring, ev );
+        }
+    }
+    return rc;
+}
+
+
+/* not platform specific, just returns values from self-struct */
+LIB_EXPORT rc_t CC KTUIGetExtent ( struct KTUI * self, int * cols, int * lines )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( lines == NULL || cols == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    else
+    {
+        *lines = self->lines;
+        *cols = self->cols;
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIClrScr( struct KTUI * self, KTUI_color bg )
+{
+    tui_ac ac;
+    set_ac( &ac, KTUI_a_none, bg, bg );
+    clr_tui_screen( &self->screen, &ac, true );
+    return 0;
+}
+
+
+LIB_EXPORT void set_ac( tui_ac * dst, KTUI_attrib attr, KTUI_color fg, KTUI_color bg )
+{
+    if ( dst != NULL )
+    {
+        dst->attr = attr;
+        dst->fg = fg;
+        dst->bg = bg;
+    }
+}
+
+
+LIB_EXPORT void copy_ac( tui_ac * dst, const tui_ac * src )
+{
+    if ( dst != NULL && src != NULL )
+    {
+        dst->attr = src->attr;
+        dst->fg = src->fg;
+        dst->bg = src->bg;
+    }
+}
+
+
+LIB_EXPORT void inverse_ac( tui_ac * dst, const tui_ac * src )
+{
+    if ( dst != NULL && src != NULL )
+    {
+        dst->attr = src->attr;
+        dst->fg = src->bg;
+        dst->bg = src->fg;
+    }
+}
+
+
+LIB_EXPORT void set_rect( tui_rect * dst, int x, int y, int w, int h )
+{
+    if ( dst != NULL )
+    {
+        dst->top_left.x = x;
+        dst->top_left.y = y;
+        dst->w = w;
+        dst->h = h;
+    }
+}
+
+
+LIB_EXPORT void copy_rect( tui_rect * dst, const tui_rect * src )
+{
+    if ( dst != NULL && src != NULL )
+    {
+        dst->top_left.x = src->top_left.x;
+        dst->top_left.y = src->top_left.y;
+        dst->w = src->w;
+        dst->h = src->h;
+    }
+}
+
+void CC put_window_event( struct KTUI * self, int cols, int lines )
+{
+    tui_event * event = event_ring_get_from_stock_or_make( &self->ev_ring );
+    if ( event != NULL )
+    {
+        event->event_type = ktui_event_window;
+        event->data.win_data.w = cols;
+        event->data.win_data.h = lines;
+        event_ring_put( &self->ev_ring, event );
+    }
+}
+
+
+void CC put_kb_event( struct KTUI * self, int key, KTUI_key code )
+{
+    tui_event * event = event_ring_get_from_stock_or_make( &self->ev_ring );
+    if ( event != NULL )
+    {
+        event->event_type = ktui_event_kb;
+        event->data.kb_data.key = key;
+        event->data.kb_data.code = code;
+        event_ring_put( &self->ev_ring, event );
+    }
+}
+
+void CC put_mouse_event( struct KTUI * self, unsigned int x, unsigned int y, 
+                         KTUI_mouse_button button, KTUI_mouse_action action, uint32_t raw_event )
+{
+    tui_event * event = event_ring_get_from_stock_or_make( &self->ev_ring );
+    if ( event != NULL )
+    {
+        event->event_type = ktui_event_mouse;
+        event->data.mouse_data.button = button;
+        event->data.mouse_data.action = action;	
+        event->data.mouse_data.x = x;
+        event->data.mouse_data.y = y;
+		event->data.mouse_data.raw_event = raw_event;
+        event_ring_put( &self->ev_ring, event );
+    }
+}
+
+
+LIB_EXPORT bool CC is_alpha_key( tui_event * event, char c )
+{
+    return ( event != NULL &&
+              event->event_type == ktui_event_kb &&
+              event->data.kb_data.code == ktui_alpha &&
+              event->data.kb_data.key == c );
+}
+
+
+LIB_EXPORT bool CC is_key_code( tui_event * event, KTUI_key k )
+{
+    return ( event != NULL &&
+              event->event_type == ktui_event_kb &&
+              event->data.kb_data.code == k );
+}
diff --git a/libs/tui/tui_cpp.cpp b/libs/tui/tui_cpp.cpp
new file mode 100644
index 0000000..7138be9
--- /dev/null
+++ b/libs/tui/tui_cpp.cpp
@@ -0,0 +1,226 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <iostream>
+#include <string>
+
+#include <klib/printf.h>
+
+#include <tui/tui.hpp>
+
+namespace tui {
+
+    Tui * Tui::instance = NULL;
+
+    Tui * Tui::getInstance( void )
+    { 
+        if ( !instance ) instance = new Tui();
+        return instance;
+    };
+
+    void Tui::clean_up( void )
+    {
+        if ( instance ) delete instance;
+        instance = NULL;
+    }
+
+    
+    bool Tui_Event::get_from_tui( void )
+    {
+        Tui * t = Tui::getInstance();
+        rc_t rc = KTUIGet ( t->tui_, &ev_ );
+        return ( rc == 0 && !empty() );
+    }
+
+
+    Grid::Grid( void * data )
+    {
+        memset( &grid_data_, 0, sizeof grid_data_ );
+        grid_data_.instance = this;
+        grid_data_.cb_str = static_str_cb;
+        grid_data_.cb_int = static_int_cb;
+        grid_data_.data = data;
+    };
+
+
+    bool Dlg::Resize( Tui_Rect const &r )
+    {
+        bool res = Draw( true );
+        if ( res ) res = SetRect( r, false );
+        if ( res ) res = Draw( false );
+        return res;
+    }
+
+    bool Dlg::SetCaptionF( const char * fmt, ... )
+    {
+        va_list args;
+        va_start ( args, fmt );
+        char buffer[ 1042 ];
+        rc_t rc = string_vprintf ( buffer, sizeof buffer, NULL, fmt, args );
+        if ( rc == 0 )
+            return SetCaption( buffer );
+        else
+            return false;
+    }
+
+    bool Dlg::SetWidgetCaptionF( tui_id id, const char * fmt, ... )
+    {
+        va_list args;
+        va_start ( args, fmt );
+        char buffer[ 1042 ];
+        rc_t rc = string_vprintf ( buffer, sizeof buffer, NULL, fmt, args );
+        if ( rc == 0 )
+            return SetWidgetCaption( id, buffer );
+        else
+            return false;
+    }
+
+    bool Dlg::SetWidgetTextF( tui_id id, const char * fmt, ... )
+    {
+        va_list args;
+        va_start ( args, fmt );
+        char buffer[ 1042 ];
+        rc_t rc = string_vprintf ( buffer, sizeof buffer, NULL, fmt, args );
+        if ( rc == 0 )
+            return SetWidgetText( id, buffer );
+        else
+            return false;
+    }
+
+    bool Dlg::AddWidgetStringN( tui_id id, int n, ... )
+    {
+        bool res = true;
+        va_list args;
+        va_start ( args, n );
+        for ( int i = 0; i < n && res; i++ )
+            res = AddWidgetString( id, va_arg ( args, const char * ) );
+        va_end ( args );
+        return res;
+    }
+
+
+    bool Dlg::AddWidgetStringF( tui_id id, const char * fmt, ... )
+    {
+        va_list args;
+        va_start ( args, fmt );
+        char buffer[ 1042 ];
+        size_t num_writ;
+        rc_t rc = string_vprintf ( buffer, sizeof buffer, &num_writ, fmt, args );
+        if ( rc == 0 )
+            return AddWidgetString( id, buffer );
+        else
+            return false;
+    }
+
+
+    bool Dlg_Runner::handle_tui_event( Tui_Event &ev )
+    {
+        bool res = false;
+        switch( ev.get_type() )
+        {
+            case ktui_event_kb : {
+                                    KTUI_key key_type = ev.get_key_type();
+                                    if ( key_type == ktui_alpha )
+                                    {
+                                        int code = ev.get_key();
+                                        res = on_kb_alpha( dlg_, data_, code );
+                                        if ( !res )
+                                        {
+                                           /* safety-net: ESC always closes the dialog */
+                                           res = ( code == 27 );
+                                           if ( res ) dlg_.SetDone( true );
+                                        }
+                                    }
+                                    else
+                                        res = on_kb_special_key( dlg_, data_, key_type );
+                                  }
+                                    break;
+
+            case ktui_event_mouse : res = on_mouse( dlg_, data_,
+                                                     ev.get_mouse_x(),
+                                                     ev.get_mouse_y(),
+                                                     ev.get_mouse_button() );
+                                    break;
+
+            case ktui_event_window : res = on_win( dlg_, data_,
+                                                    ev.get_window_width(),
+                                                    ev.get_window_height() );
+                                      break;
+        }
+        return res;
+    };
+
+
+    bool Dlg_Runner::handle_dlg_event_loop( void )
+    {
+        bool done = false;
+        bool res = false;
+        while ( !done )
+        {
+            Tui_Dlg_Event dev;
+            if ( dlg_.GetDlgEvent( &dev.ev_ ) )
+            {
+                switch( dev.get_type() )
+                {
+                    case ktuidlg_event_none         : done = true; break;
+                    case ktuidlg_event_focus        : res = on_focus( dlg_, data_, dev ); break;
+                    case ktuidlg_event_focus_lost   : res = on_focus_lost( dlg_, data_, dev ); break;
+                    case ktuidlg_event_select       : res = on_select( dlg_, data_, dev ); break;
+                    case ktuidlg_event_changed      : res = on_changed( dlg_, data_, dev ); break;
+                    case ktuidlg_event_menu         : res = on_menu( dlg_, data_, dev ); break;
+                }
+            }
+        }
+        return res;
+    }
+
+
+    bool Dlg_Runner::handle_dlg_event( Tui_Event &ev )
+    {
+        bool res = false;
+        if ( dlg_.HandleEvent( ev ) )
+            res = handle_dlg_event_loop();
+        return res;
+    };
+
+
+    void Dlg_Runner::run( void )
+    {
+        dlg_.Draw();
+        while ( !dlg_.IsDone() )
+        {
+            Tui_Event ev;
+            if ( ev.get_from_tui() )
+            {
+                if ( !handle_dlg_event( ev ) )
+                    handle_tui_event( ev );
+            }
+            else
+                handle_dlg_event_loop();
+        }
+    };
+
+}
\ No newline at end of file
diff --git a/libs/tui/tui_dlg.c b/libs/tui/tui_dlg.c
new file mode 100644
index 0000000..dfaa50a
--- /dev/null
+++ b/libs/tui/tui_dlg.c
@@ -0,0 +1,1291 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <tui/extern.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/vector.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+
+#include <tui/tui_dlg.h>
+#include "tui_widget.h"
+#include "eventring.h"
+#include "line_policy.h"
+#include "tui_menu.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+
+
+/* ******************************************************************************************
+
+    prototypes of all the concrete widget types ( aka 2 callbacks each )
+
+   ****************************************************************************************** */
+
+/* from tui_widget_label.c */
+void draw_label( struct KTUIWidget * w );
+
+/* from tui_widget_button.c */
+void draw_button( struct KTUIWidget * w );
+bool event_button( struct KTUIWidget * w, tui_event * event );
+
+/* from tui_widget_checkbox.c */
+void draw_checkbox( struct KTUIWidget * w );
+bool event_checkbox( struct KTUIWidget * w, tui_event * event );
+
+/* from tui_widget_inputline.c */
+void init_inputline( struct KTUIWidget * w );
+void draw_inputline( struct KTUIWidget * w );
+bool event_inputline( struct KTUIWidget * w, tui_event * event );
+
+/* from tui_widget_radiobox.c */
+void draw_radiobox( struct KTUIWidget * w );
+bool event_radiobox( struct KTUIWidget * w, tui_event * event );
+
+/* from tui_widget_string_list.c */
+void draw_list( struct KTUIWidget * w );
+bool event_list( struct KTUIWidget * w, tui_event * event );
+
+/* from tui_widget_progress.c */
+void draw_progress( struct KTUIWidget * w );
+
+/* from tui_widget_spin_edit.c */
+void draw_spinedit( struct KTUIWidget * w );
+bool event_spinedit( struct KTUIWidget * w, tui_event * event );
+
+/* from tui_widget_grid.c */
+void draw_grid( struct KTUIWidget * w );
+bool event_grid( struct KTUIWidget * w, tui_event * event );
+uint64_t get_grid_col( struct KTUIWidget * w );
+bool set_grid_col( struct KTUIWidget * w, uint64_t col );
+uint64_t get_grid_row( struct KTUIWidget * w );
+bool set_grid_row( struct KTUIWidget * w, uint64_t row );
+
+
+/* ****************************************************************************************** */
+
+
+typedef struct KTUIDlg
+{
+    KRefcount refcount;
+
+    struct KTUI * tui;
+    struct KTUIDlg * parent;
+    struct KTUIPalette * palette;
+    struct KTUI_Menu * menu;
+    char * caption;
+    void * data;
+
+    Event_Ring events;
+    Vector widgets;
+    tui_rect r;
+    uint32_t focused;
+    bool menu_active, changed, done;
+
+} KTUIDlg;
+
+
+static const char tuidlg_classname [] = "TUIDlg_Implementation";
+
+
+static rc_t KTUIDlgDestroy ( struct KTUIDlg * self )
+{
+    uint32_t i, n;
+    KTUIRelease ( self->tui );
+
+    n = VectorLength( &self->widgets );
+    for ( i = 0; i < n; ++i )
+    {
+        KTUIWidget * w = VectorGet ( &self->widgets, i );
+        if ( w != NULL )
+            TUI_DestroyWidget( w );
+    }
+
+    if ( self->caption != NULL )
+        free( ( void * )self->caption );
+
+    if ( self->menu != NULL )
+        KTUI_Menu_Release ( self->menu );
+
+    KTUIPaletteRelease ( self->palette );
+    event_ring_destroy( &self->events );
+
+    free( ( void * )self );
+    return 0;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgMake ( struct KTUI * tui, struct KTUIDlg ** self, struct KTUIDlg * parent,
+                    struct KTUIPalette * palette, tui_rect * r )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        KTUIDlg * td = malloc( sizeof * td );
+        if ( td == NULL )
+            rc = RC( rcApp, rcAttr, rcCreating, rcMemory, rcExhausted );
+        else
+        {
+            rc = KTUIAddRef ( tui );
+            if ( rc == 0 )
+            {
+                td->tui = tui;
+                td->parent = parent;
+
+                if ( palette == NULL )
+                {
+                    if ( parent == NULL )
+                        rc = KTUIPaletteMake ( &td->palette );
+                    else
+                    {
+                        rc = KTUIPaletteAddRef ( parent->palette );
+                        if ( rc == 0 )
+                            td->palette = parent->palette;
+                    }
+                }
+                else
+                {
+                    rc = KTUIPaletteAddRef ( palette );
+                    if ( rc == 0 )
+                        td->palette = palette;
+                }
+
+                if ( rc == 0 )
+                {
+                    KRefcountInit( &td->refcount, 1, "TUIDlg", "make", tuidlg_classname );
+                    VectorInit ( &td->widgets, 0, 16 );
+                    event_ring_init( &td->events );
+                    td->caption = NULL;
+                    td->focused = 0;
+                    td->menu = NULL;
+                    td->menu_active = td->done = td->changed = false;
+                    td->data = NULL;
+
+                    if ( r != NULL )
+                    {
+                        copy_rect( &td->r, r );
+                        /*
+                        if ( parent == NULL )
+                            copy_rect( &td->r, r );
+                        else
+                        {
+                            tui_rect pr;
+                            rc = KTUIDlgGetRect ( parent, &pr );
+                            if ( rc == 0 )
+                            {
+                                td->r.top_left.x = pr.top_left.x + r->top_left.x;
+                                td->r.top_left.y = pr.top_left.y + r->top_left.y;
+                                td->r.w = r->w;
+                                td->r.h = r->h;
+                            }
+                        }
+                        */
+                    }
+                    else
+                    {
+                        int w, h;
+                        rc = KTUIGetExtent ( tui, &w, &h );
+                        if ( rc == 0 )
+                            set_rect( &td->r, 0, 0, w, h );
+                    }
+                }
+            }
+
+            if ( rc == 0 )
+                ( * self ) = td;
+            else
+                KTUIDlgDestroy ( td );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddRef ( const struct KTUIDlg * self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        switch ( KRefcountAdd( &self->refcount, tuidlg_classname ) )
+        {
+        case krefOkay :
+            break;
+        case krefZero :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcIncorrect );
+        case krefLimit :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcExhausted );
+        case krefNegative :
+            rc =  RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid );
+        default :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcUnknown );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgRelease ( const struct KTUIDlg * self )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop( &self->refcount, tuidlg_classname ) )
+        {
+        case krefOkay :
+        case krefZero :
+            break;
+        case krefWhack :
+            rc = KTUIDlgDestroy( ( struct KTUIDlg * )self );
+            break;
+        case krefNegative:
+            return RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid );
+        default:
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcUnknown );
+            break;            
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT void CC KTUIDlgSetData ( struct KTUIDlg * self, void * data )
+{
+    if ( self != NULL )
+        self->data = data;
+}
+
+
+LIB_EXPORT void * CC KTUIDlgGetData ( struct KTUIDlg * self )
+{
+    if ( self != NULL )
+        return self->data;
+    else
+        return NULL;
+}
+
+
+LIB_EXPORT void CC KTUIDlgSetDone ( struct KTUIDlg * self, bool done )
+{
+    if ( self != NULL )
+        self->done = done;
+}
+
+
+LIB_EXPORT bool CC KTUIDlgGetDone ( struct KTUIDlg * self )
+{
+    if ( self != NULL )
+        return self->done;
+    return false;
+}
+
+
+LIB_EXPORT void CC KTUIDlgSetChanged ( struct KTUIDlg * self )
+{
+    if ( self != NULL )
+        self->changed = true;
+}
+
+
+LIB_EXPORT void CC KTUIDlgClearChanged ( struct KTUIDlg * self )
+{
+    if ( self != NULL )
+    {
+        uint32_t i, n;
+        n = VectorLength( &self->widgets );
+        for ( i = 0; i < n; ++i )
+        {
+            KTUIWidget * w = VectorGet ( &self->widgets, i );
+            if ( w != NULL )
+                w->changed = false;
+        }
+        self->changed = false;
+    }
+}
+
+
+LIB_EXPORT bool CC KTUIDlgGetChanged ( struct KTUIDlg * self )
+{
+    if ( self != NULL )
+        return self->changed;
+    return false;
+}
+
+
+LIB_EXPORT struct KTUI * CC KTUIDlgGetTui ( struct KTUIDlg * self )
+{
+    if ( self != NULL )
+        return self->tui;
+    else
+        return NULL;
+}
+
+
+LIB_EXPORT struct KTUIPalette * CC KTUIDlgGetPalette ( struct KTUIDlg * self )
+{
+    if ( self != NULL )
+        return self->palette;
+    else
+        return NULL;
+}
+
+
+LIB_EXPORT struct KTUIDlg * CC KTUIDlgGetParent ( struct KTUIDlg * self )
+{
+    if ( self != NULL )
+        return self->parent;
+    else
+        return NULL;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgSetCaption ( struct KTUIDlg * self, const char * caption )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        if ( self->caption != NULL )
+            free( ( void * ) self->caption );
+        
+        if ( caption != NULL )
+            self->caption = string_dup_measure ( caption, NULL );
+        else
+            self->caption = NULL;
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgGetRect ( struct KTUIDlg * self, tui_rect * r )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcSelecting, rcSelf, rcNull );
+    else if ( r == NULL )
+        rc = RC( rcApp, rcAttr, rcSelecting, rcParam, rcNull );
+    else
+        copy_rect( r, &self->r );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgSetRect ( struct KTUIDlg * self, const tui_rect * r, bool redraw )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcSelecting, rcSelf, rcNull );
+    else if ( r == NULL )
+        rc = RC( rcApp, rcAttr, rcSelecting, rcParam, rcNull );
+    else
+    {
+        copy_rect( &self->r, r );
+        if ( redraw )
+            rc = KTUIDlgDraw( self, true );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT bool CC KTUIDlgGetMenuActive ( const struct KTUIDlg * self )
+{
+    bool res = false;
+    if ( self != NULL )
+        res = self->menu_active;
+    return res;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgSetMenuActive ( struct KTUIDlg * self, bool active )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcSelecting, rcSelf, rcNull );
+    else if ( self->menu == NULL )
+        rc = RC( rcApp, rcAttr, rcSelecting, rcItem, rcInvalid );
+    else
+    {
+        self->menu_active = active;
+        rc = KTUIDlgDraw( self, false );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgSetMenu ( struct KTUIDlg * self, struct KTUI_Menu * menu )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcSelecting, rcSelf, rcNull );
+    else if ( menu == NULL )
+        rc = RC( rcApp, rcAttr, rcSelecting, rcParam, rcNull );
+    else
+    {
+        if ( self->menu != NULL )
+            KTUI_Menu_Release ( self->menu );
+        self->menu = menu;
+    }
+    return rc;
+}
+
+
+/* ****************************************************************************************** */
+
+LIB_EXPORT void KTUIDlgPushEvent( struct KTUIDlg * self,
+                       KTUIDlg_event_type event_type, uint32_t widget_id,
+                       uint64_t value_1, uint64_t value_2, void * ptr_0 )
+{
+    tuidlg_event * ev = dlg_event_ring_get_from_stock_or_make( &self->events );
+    if ( ev != NULL )
+    {
+        ev->event_type = event_type;
+        ev->widget_id = widget_id;
+        ev->value_1 = value_1;
+        ev->value_2 = value_2;
+        ev->ptr_0 = ptr_0;
+        dlg_event_ring_put( &self->events, ev );
+    }
+}
+
+
+static void KTUIDlgAbsolutePoint( struct KTUIDlg * self, tui_point * p )
+{
+    p->x += self->r.top_left.x;
+    p->y += self->r.top_left.y;
+    if ( self->parent != NULL )
+        KTUIDlgAbsolutePoint( self->parent, p );    /* recursion ! */
+}
+
+
+static void KTUIDlgRelativePoint( struct KTUIDlg * self, tui_point * p )
+{
+    p->x -= self->r.top_left.x;
+    p->y -= self->r.top_left.y;
+    if ( self->parent != NULL )
+        KTUIDlgRelativePoint( self->parent, p );    /* recursion ! */
+}
+
+
+static void KTUIDlgAbsoluteDlgRect( struct KTUIDlg * self, tui_rect * dst, tui_rect * src )
+{
+    dst->top_left.x = 0;
+    dst->top_left.y = 0;
+    KTUIDlgAbsolutePoint( self, &dst->top_left );
+    dst->w = src->w;
+    dst->h = src->h;
+}
+
+LIB_EXPORT rc_t KTUIDlgAbsoluteRect ( struct KTUIDlg * self, tui_rect * dst, tui_rect * src )
+{
+    dst->top_left.x = src->top_left.x;
+    dst->top_left.y = src->top_left.y;
+    KTUIDlgAbsolutePoint( self, &dst->top_left );
+    dst->w = src->w;
+    dst->h = src->h;
+    return 0;
+}
+
+
+/* ****************************************************************************************** */
+
+
+static KTUIWidget * KTUIDlgGetWidgetById( struct KTUIDlg * self, uint32_t id )
+{
+    KTUIWidget * res = NULL;
+
+    uint32_t i, n = VectorLength( &self->widgets );
+    for ( i = 0; i < n && res == NULL; ++i )
+    {
+        KTUIWidget * w = VectorGet ( &self->widgets, i );
+        if ( w != NULL )
+        {
+            if ( w->id == id ) res = w;
+        }
+    }
+    return res;
+}
+
+
+/* ****************************************************************************************** */
+
+
+static rc_t KTUIDlgAddWidget( struct KTUIDlg * self, uint32_t id, KTUI_Widget_type wtype, const tui_rect * r,
+                              draw_cb on_draw, event_cb on_event, init_cb on_init )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        KTUIWidget * w;
+        rc = TUI_MakeWidget ( &w, self, id, wtype, r, on_draw, on_event );
+        if ( rc == 0 )
+        {
+            if ( on_init != NULL )
+                on_init( w );
+            VectorAppend ( &self->widgets, &w->vector_idx, w );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddLabel( struct KTUIDlg * self, uint32_t id, const tui_rect * r, const char * caption )
+{
+    rc_t rc = KTUIDlgAddWidget( self, id, KTUIW_label, r, draw_label, NULL, NULL );
+    if ( rc == 0 )
+        rc = KTUIDlgSetWidgetCanFocus( self, id, false );
+    if ( rc == 0 && caption != NULL )
+        rc = KTUIDlgSetWidgetCaption ( self, id, caption );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddLabel2( struct KTUIDlg * self, uint32_t id,
+                                     uint32_t x, uint32_t y, uint32_t w, const char * caption )
+{
+    tui_rect r;
+    set_rect( &r, x, y, w, 1 );
+    return KTUIDlgAddLabel( self, id, &r, caption );
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddBtn ( struct KTUIDlg * self, uint32_t id, const tui_rect * r, const char * caption )
+{
+    rc_t rc = KTUIDlgAddWidget( self, id, KTUIW_button, r, draw_button, event_button, NULL );
+    if ( rc == 0 && caption != NULL )
+        rc = KTUIDlgSetWidgetCaption ( self, id, caption );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddBtn2 ( struct KTUIDlg * self, uint32_t id,
+                                    uint32_t x, uint32_t y, uint32_t w, const char * caption )
+{
+    tui_rect r;
+    set_rect( &r, x, y, w, 1 );
+    return KTUIDlgAddBtn ( self, id, &r, caption );
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddCheckBox ( struct KTUIDlg * self, uint32_t id, const tui_rect * r, const char * caption )
+{
+    rc_t rc = KTUIDlgAddWidget( self, id, KTUIW_checkbox, r, draw_checkbox, event_checkbox, NULL );
+    if ( rc == 0 && caption != NULL )
+        rc = KTUIDlgSetWidgetCaption ( self, id, caption );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddInput ( struct KTUIDlg * self, uint32_t id, const tui_rect * r, const char * txt, size_t length )
+{
+    rc_t rc = KTUIDlgAddWidget( self, id, KTUIW_input, r, draw_inputline, event_inputline, init_inputline );
+    if ( rc == 0 )
+        rc = KTUIDlgSetWidgetTextLength ( self, id, length );
+    if ( rc == 0 )
+        rc = KTUIDlgSetWidgetText ( self, id, txt );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddRadioBox ( struct KTUIDlg * self, uint32_t id, const tui_rect * r )
+{
+    return KTUIDlgAddWidget( self, id, KTUIW_radiobox, r, draw_radiobox, event_radiobox, NULL );
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddList ( struct KTUIDlg * self, uint32_t id, const tui_rect * r )
+{
+    return KTUIDlgAddWidget( self, id, KTUIW_list, r, draw_list, event_list, NULL );
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgSetHScroll ( struct KTUIDlg * self, uint32_t id, bool enabled )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        KTUIWidget *w = KTUIDlgGetWidgetById( self, id );
+        if ( w != NULL )
+        {
+            if ( w->wtype == KTUIW_list )
+            {
+                w->ints[ 2 ] = enabled ? 1 : 0;
+                w->ints[ 1 ] = 0;
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddProgress ( struct KTUIDlg * self, uint32_t id,
+                                        const tui_rect * r, int32_t percent, int32_t precision )
+{
+    rc_t rc = KTUIDlgAddWidget( self, id, KTUIW_progress, r, draw_progress, NULL, NULL );
+    if ( rc == 0 )
+        rc = KTUIDlgSetWidgetCanFocus( self, id, false );
+    if ( rc == 0 )
+        rc = KTUIDlgSetWidgetPrecision ( self, id, precision );
+    if ( rc == 0 )
+        rc = KTUIDlgSetWidgetPercent ( self, id, percent );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddSpinEdit ( struct KTUIDlg * self, uint32_t id,
+                                        const tui_rect * r, int64_t value, int64_t min, int64_t max )
+{
+    rc_t rc = KTUIDlgAddWidget( self, id, KTUIW_spinedit, r, draw_spinedit, event_spinedit, NULL );
+    if ( rc == 0 )
+        rc = KTUIDlgSetWidgetInt64Min ( self, id, min );
+    if ( rc == 0 )
+        rc = KTUIDlgSetWidgetInt64Max ( self, id, max );
+    if ( rc == 0 )
+        rc = KTUIDlgSetWidgetInt64Value ( self, id, value );
+
+    return rc;
+}
+
+
+/* ****************************************************************************************** */
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddGrid ( struct KTUIDlg * self, uint32_t id,
+                                    const tui_rect * r, TUIWGrid_data * grid_data, bool cached )
+{
+    rc_t rc = KTUIDlgAddWidget( self, id, KTUIW_grid, r, draw_grid, event_grid, NULL );
+    if ( rc == 0 )
+        rc = KTUIDlgSetWidgetGridData( self, id, grid_data, cached );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgGetGridCol( struct KTUIDlg * self, uint32_t id, uint64_t *col )
+{
+    rc_t rc = 0;
+    if ( col == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    else
+    {
+        KTUIWidget * w = KTUIDlgGetWidgetById( self, id );
+        if ( w != NULL && w->wtype == KTUIW_grid )
+            *col = get_grid_col( w );
+        else
+            rc = RC( rcApp, rcAttr, rcSelecting, rcId, rcInvalid );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgSetGridCol( struct KTUIDlg * self, uint32_t id, uint64_t col )
+{
+    rc_t rc = 0;
+    KTUIWidget * w = KTUIDlgGetWidgetById( self, id );
+    if ( w != NULL && w->wtype == KTUIW_grid )
+        set_grid_col( w, col );
+    else
+        rc = RC( rcApp, rcAttr, rcSelecting, rcId, rcInvalid );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgGetGridRow( struct KTUIDlg * self, uint32_t id, uint64_t *row )
+{
+    rc_t rc = 0;
+    if ( row == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    else
+    {
+        KTUIWidget * w = KTUIDlgGetWidgetById( self, id );
+        if ( w != NULL && w->wtype == KTUIW_grid )
+            *row = get_grid_row( w );
+        else
+            rc = RC( rcApp, rcAttr, rcSelecting, rcId, rcInvalid );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgSetGridRow( struct KTUIDlg * self, uint32_t id, uint64_t row )
+{
+    rc_t rc = 0;
+    KTUIWidget * w = KTUIDlgGetWidgetById( self, id );
+    if ( w != NULL && w->wtype == KTUIW_grid )
+        set_grid_row( w, row );
+    else
+        rc = RC( rcApp, rcAttr, rcSelecting, rcId, rcInvalid );
+    return rc;
+}
+
+
+/* ****************************************************************************************** */
+
+
+static void KTUIDlgVectorReIndex ( struct KTUIDlg * self )
+{
+    uint32_t i, n = VectorLength( &self->widgets );
+    for ( i = 0; i < n; ++i )
+    {
+        KTUIWidget * w = VectorGet ( &self->widgets, i );
+        if ( w != NULL )
+            w->vector_idx = i;
+    }
+}
+
+LIB_EXPORT rc_t CC KTUIDlgRemove ( struct KTUIDlg * self, uint32_t id )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        KTUIWidget * w = KTUIDlgGetWidgetById( self, id );
+        if ( w != NULL )
+        {
+            void * removed = NULL;
+            rc = VectorRemove ( &self->widgets, w->vector_idx, &removed );
+            if ( rc == 0 )
+            {
+                if ( w != NULL ) TUI_DestroyWidget( w );
+                KTUIDlgVectorReIndex ( self );
+                rc = KTUIDlgDraw( self, false );
+            }
+        }
+        else
+            rc = RC( rcApp, rcAttr, rcSelecting, rcId, rcInvalid );
+    }
+    return rc;
+}
+
+
+
+/* ****************************************************************************************** */
+static rc_t draw_caption( struct KTUI * tui, const tui_ac * capt_ac, const tui_rect * r, const char * caption )
+{
+    rc_t rc = DlgPaint( tui, r->top_left.x, r->top_left.y, r->w, 1, capt_ac->bg );
+    if ( rc == 0 && caption != NULL )
+    {
+        rc = DlgWrite( tui, r->top_left.x + 5, r->top_left.y, capt_ac, caption, r->w - 10 );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC KTUIDlgDrawCaption( struct KTUIDlg * self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( self->caption != NULL )
+    {
+        tui_rect abs;
+        const tui_ac * capt_ac = KTUIPaletteGet ( self->palette, ktuipa_dlg_caption );
+        KTUIDlgAbsoluteDlgRect( self, &abs, &self->r );
+        rc = draw_caption( self->tui, capt_ac, &abs, self->caption );
+    }
+    if ( rc == 0 )
+        rc = KTUIFlush ( self->tui, false );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgDraw( struct KTUIDlg * self, bool forced )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        uint32_t i, n;
+
+        /* draw the background... */
+        tui_rect abs;
+        const tui_ac * dlg_ac = KTUIPaletteGet ( self->palette, ktuipa_dlg );
+        KTUIDlgAbsoluteDlgRect( self, &abs, &self->r );
+
+        rc = DlgPaint( self->tui, abs.top_left.x, abs.top_left.y, abs.w, abs.h, dlg_ac->bg );
+
+        /* draw the caption... */
+        if ( rc == 0 && self->caption != NULL )
+        {
+            const tui_ac * capt_ac = KTUIPaletteGet ( self->palette, ktuipa_dlg_caption );
+            rc = draw_caption( self->tui, capt_ac, &abs, self->caption );
+        }
+
+        /* draw the widgets */
+        n = VectorLength( &self->widgets );
+        for ( i = 0; i < n; ++i )
+        {
+            KTUIWidget * w = VectorGet ( &self->widgets, i );
+            if ( w != NULL )
+                if ( w->on_draw != NULL && w->visible )
+                    w->on_draw( w );
+        }
+
+        /* if the menu is activated... */
+        if ( self->menu_active && self->menu != NULL )
+            KTUI_Menu_Draw( self->menu, self );
+
+        /* flush it all out... */
+        rc = KTUIFlush ( self->tui, forced );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgDrawWidget( struct KTUIDlg * self, uint32_t id )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        KTUIWidget * w = KTUIDlgGetWidgetById( self, id );
+        if ( w != NULL && w->visible )
+            rc = RedrawWidget( w );
+    }
+    return rc;
+}
+
+
+/* ****************************************************************************************** */
+
+
+LIB_EXPORT const char * CC KTUIDlgGetWidgetCaption ( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetCaption ( KTUIDlgGetWidgetById( self, id ) );   }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetCaption ( struct KTUIDlg * self, uint32_t id, const char * caption )
+{   return SetWidgetCaption ( KTUIDlgGetWidgetById( self, id ), caption );  }
+
+
+LIB_EXPORT struct KTUIPalette * CC KTUIDlgNewWidgetPalette ( struct KTUIDlg * self, uint32_t id )
+{   return CopyWidgetPalette( KTUIDlgGetWidgetById( self, id ) );   }
+LIB_EXPORT rc_t CC KTUIDlgReleaseWidgetPalette ( struct KTUIDlg * self, uint32_t id )
+{   return ReleaseWidgetPalette( KTUIDlgGetWidgetById( self, id ) );    }
+
+
+LIB_EXPORT rc_t CC KTUIDlgGetWidgetRect ( struct KTUIDlg * self, uint32_t id, tui_rect * r )
+{   return GetWidgetRect( KTUIDlgGetWidgetById( self, id ), r );    }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetRect ( struct KTUIDlg * self, uint32_t id, const tui_rect * r, bool redraw )
+{   return SetWidgetRect( KTUIDlgGetWidgetById( self, id ), r, redraw );    }
+
+
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetCanFocus ( struct KTUIDlg * self, uint32_t id, bool can_focus )
+{   return SetWidgetCanFocus( KTUIDlgGetWidgetById( self, id ), can_focus );    }
+
+
+LIB_EXPORT bool KTUIDlgGetWidgetVisible ( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetVisible ( KTUIDlgGetWidgetById( self, id ) );   }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetVisible ( struct KTUIDlg * self, uint32_t id, bool visible )
+{
+    bool redraw = false;
+    rc_t rc = SetWidgetVisible ( KTUIDlgGetWidgetById( self, id ), visible, &redraw );
+    if ( redraw ) rc = KTUIDlgDraw( self, false );
+    return rc;
+}
+
+
+LIB_EXPORT bool CC KTUIDlgGetWidgetChanged ( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetChanged ( KTUIDlgGetWidgetById( self, id ) );   }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetChanged ( struct KTUIDlg * self, uint32_t id, bool changed )
+{   return SetWidgetChanged ( KTUIDlgGetWidgetById( self, id ), changed );  }
+
+
+LIB_EXPORT bool CC KTUIDlgGetWidgetBoolValue ( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetBoolValue ( KTUIDlgGetWidgetById( self, id ) ); }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetBoolValue ( struct KTUIDlg * self, uint32_t id, bool value )
+{   return SetWidgetBoolValue ( KTUIDlgGetWidgetById( self, id ), value );  }
+
+
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetBg ( struct KTUIDlg * self, uint32_t id, KTUI_color value )
+{   return SetWidgetBg ( KTUIDlgGetWidgetById( self, id ), value );  }
+LIB_EXPORT rc_t CC KTUIDlgReleaseWidgetBg ( struct KTUIDlg * self, uint32_t id )
+{   return ReleaseWidgetBg ( KTUIDlgGetWidgetById( self, id ) );  }
+
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetFg ( struct KTUIDlg * self, uint32_t id, KTUI_color value )
+{   return SetWidgetFg ( KTUIDlgGetWidgetById( self, id ), value );  }
+LIB_EXPORT rc_t CC KTUIDlgReleaseWidgetFg ( struct KTUIDlg * self, uint32_t id )
+{   return ReleaseWidgetFg ( KTUIDlgGetWidgetById( self, id ) );  }
+
+LIB_EXPORT int64_t CC KTUIDlgGetWidgetInt64Value ( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetInt64Value ( KTUIDlgGetWidgetById( self, id ) );    }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetInt64Value ( struct KTUIDlg * self, uint32_t id, int64_t value )
+{   return SetWidgetInt64Value ( KTUIDlgGetWidgetById( self, id ), value ); }
+
+
+LIB_EXPORT int64_t CC KTUIDlgGetWidgetInt64Min ( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetInt64Min ( KTUIDlgGetWidgetById( self, id ) );  }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetInt64Min ( struct KTUIDlg * self, uint32_t id, int64_t value )
+{   return SetWidgetInt64Min ( KTUIDlgGetWidgetById( self, id ), value ); }
+
+
+LIB_EXPORT int64_t CC KTUIDlgGetWidgetInt64Max ( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetInt64Max ( KTUIDlgGetWidgetById( self, id ) );  }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetInt64Max ( struct KTUIDlg * self, uint32_t id, int64_t value )
+{   return SetWidgetInt64Max ( KTUIDlgGetWidgetById( self, id ), value ); }
+
+
+LIB_EXPORT int32_t CC KTUIDlgGetWidgetPercent ( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetPercent ( KTUIDlgGetWidgetById( self, id ) );  }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetPercent ( struct KTUIDlg * self, uint32_t id, int32_t value )
+{   return SetWidgetPercent ( KTUIDlgGetWidgetById( self, id ), value ); }
+
+LIB_EXPORT int32_t CC KTUIDlgGetWidgetPrecision ( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetPrecision ( KTUIDlgGetWidgetById( self, id ) );  }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetPrecision( struct KTUIDlg * self, uint32_t id, int32_t value )
+{   return SetWidgetPrecision ( KTUIDlgGetWidgetById( self, id ), value ); }
+
+LIB_EXPORT int32_t CC KTUIDlgCalcPercent ( int64_t value, int64_t max, uint32_t precision )
+{   return CalcWidgetPercent( value, max, precision ); }
+
+
+LIB_EXPORT const char * CC KTUIDlgGetWidgetText( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetText ( KTUIDlgGetWidgetById( self, id ) );  }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetText ( struct KTUIDlg * self, uint32_t id, const char * value )
+{   return SetWidgetText ( KTUIDlgGetWidgetById( self, id ), value ); }
+LIB_EXPORT size_t CC KTUIDlgGetWidgetTextLenght( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetTextLength ( KTUIDlgGetWidgetById( self, id ) );  }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetTextLength ( struct KTUIDlg * self, uint32_t id, size_t value )
+{   return SetWidgetTextLength ( KTUIDlgGetWidgetById( self, id ), value ); }
+
+
+LIB_EXPORT rc_t CC KTUIDlgAddWidgetString ( struct KTUIDlg * self, uint32_t id, const char * txt )
+{   return AddWidgetString ( KTUIDlgGetWidgetById( self, id ), txt );  }
+LIB_EXPORT rc_t CC KTUIDlgAddWidgetStrings ( struct KTUIDlg * self, uint32_t id, VNamelist * src )
+{   return AddWidgetStrings ( KTUIDlgGetWidgetById( self, id ), src );  }
+LIB_EXPORT const char * CC KTUIDlgGetWidgetStringByIdx ( struct KTUIDlg * self, uint32_t id, uint32_t idx )
+{   return GetWidgetStringByIdx ( KTUIDlgGetWidgetById( self, id ), idx );  }
+LIB_EXPORT rc_t CC KTUIDlgRemoveWidgetStringByIdx ( struct KTUIDlg * self, uint32_t id, uint32_t idx )
+{   return RemoveWidgetStringByIdx ( KTUIDlgGetWidgetById( self, id ), idx );  }
+LIB_EXPORT rc_t CC KTUIDlgRemoveAllWidgetStrings ( struct KTUIDlg * self, uint32_t id )
+{   return RemoveAllWidgetStrings ( KTUIDlgGetWidgetById( self, id ) );  }
+LIB_EXPORT uint32_t CC KTUIDlgGetWidgetStringCount ( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetStringCount ( KTUIDlgGetWidgetById( self, id ) );  }
+LIB_EXPORT uint32_t CC KTUIDlgHasWidgetString( struct KTUIDlg * self, uint32_t id, const char * txt )
+{   return HasWidgetString ( KTUIDlgGetWidgetById( self, id ), txt );  }
+LIB_EXPORT uint32_t CC KTUIDlgGetWidgetSelectedString( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetSelectedString ( KTUIDlgGetWidgetById( self, id ) );  }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetSelectedString ( struct KTUIDlg * self, uint32_t id, uint32_t selection )
+{   return SetWidgetSelectedString ( KTUIDlgGetWidgetById( self, id ), selection );  }
+
+LIB_EXPORT bool CC KTUIDlgHasWidget ( struct KTUIDlg * self, uint32_t id )
+{   return ( KTUIDlgGetWidgetById( self, id ) != NULL );  }
+
+LIB_EXPORT TUIWGrid_data * CC KTUIDlgGetWidgetGridData( struct KTUIDlg * self, uint32_t id )
+{   return GetWidgetGridData ( KTUIDlgGetWidgetById( self, id ) );  }
+LIB_EXPORT rc_t CC KTUIDlgSetWidgetGridData( struct KTUIDlg * self, uint32_t id, TUIWGrid_data * grid_data, bool cached )
+{   return SetWidgetGridData ( KTUIDlgGetWidgetById( self, id ), grid_data, cached );  }
+
+
+
+/* ****************************************************************************************** */
+
+
+static int32_t KTUIDlgFirstFocus( struct KTUIDlg * self )
+{
+    int32_t res = -1;
+    uint32_t i, n = VectorLength( &self->widgets );
+    for ( i = 0; i < n && res < 0; ++i )
+    {
+        KTUIWidget * w = VectorGet ( &self->widgets, i );
+        if ( w != NULL )
+        {
+            if ( w->can_focus ) res = w->id;
+        }
+    }
+    return res;
+}
+
+
+static int32_t KTUIDlgLastFocus( struct KTUIDlg * self )
+{
+    int32_t res = -1;
+    uint32_t i, n = VectorLength( &self->widgets );
+    for ( i = n-1; i > 0 && res < 0; --i )
+    {
+        KTUIWidget * w = VectorGet ( &self->widgets, i );
+        if ( w != NULL )
+        {
+            if ( w->can_focus ) res = w->id;
+        }
+    }
+    return res;
+}
+
+
+static rc_t KTUIDlgSetFocusTo( struct KTUIDlg * self, KTUIWidget * w )
+{
+    rc_t rc = 0;
+    if ( w->can_focus && !w->focused )
+    {
+        KTUIWidget * has_focus  = KTUIDlgGetWidgetById( self, self->focused );
+        if ( has_focus != NULL )
+        {
+            has_focus->focused = false;
+            if ( has_focus->on_draw != NULL )
+                has_focus->on_draw( has_focus );
+            KTUIDlgPushEvent( self, ktuidlg_event_focus_lost, has_focus->id, 0, 0, NULL );
+        }
+
+        w->focused = true;
+        if ( w->on_draw != NULL )
+            w->on_draw( w );
+        self->focused = w->id;
+        KTUIDlgPushEvent( self, ktuidlg_event_focus, w->id, 0, 0, NULL );
+
+        /* flush it all out... */
+        rc = KTUIFlush ( self->tui, false );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgSetFocus( struct KTUIDlg * self, uint32_t id )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        if ( id == 0 )
+            id = KTUIDlgFirstFocus( self );
+        if ( id > 0 )
+        {
+            KTUIWidget * gets_focus = KTUIDlgGetWidgetById( self, id );
+            if ( gets_focus != NULL )
+                rc = KTUIDlgSetFocusTo( self, gets_focus );
+        }
+    }
+    return rc;
+}
+
+
+static uint32_t KTUIDlgGetNextWidget( struct KTUIDlg * self, uint32_t id, bool forward )
+{
+    uint32_t res = 0;
+    KTUIWidget * w = KTUIDlgGetWidgetById( self, id );
+    if ( w != NULL )
+    {
+        uint32_t n = VectorLength( &self->widgets );
+
+        int32_t vidx = w->vector_idx;
+        if ( forward )
+        {
+            while( ( uint32_t )vidx < n && res == 0 )
+            {
+                vidx++;
+                w = VectorGet ( &self->widgets, vidx );
+                if ( w != NULL && w->can_focus )
+                    res = w->id;
+            }
+            if ( res == 0 )
+                res = KTUIDlgFirstFocus( self );
+        }
+        else
+        {
+            while( vidx > 0 && res == 0 )
+            {
+                vidx--;
+                w = VectorGet ( &self->widgets, vidx );
+                if ( w != NULL && w->can_focus )
+                    res = w->id;
+            }
+            if ( res == 0 )
+                res = KTUIDlgLastFocus( self );
+        }
+    }
+    return res;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgMoveFocus( struct KTUIDlg * self, bool forward )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        uint32_t to_focus = KTUIDlgGetNextWidget( self, self->focused, forward );
+        rc = KTUIDlgSetFocus( self, to_focus );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT bool CC KTUIDlgFocusValid( struct KTUIDlg * self )
+{
+    if ( self == NULL )
+        return false;
+    else
+        return ( KTUIDlgGetWidgetById( self, self->focused ) != NULL );
+}
+
+
+LIB_EXPORT uint32_t CC KTUIDlgGetFocusId( struct KTUIDlg * self )
+{
+    if ( self == NULL )
+        return 0;
+    else
+        return self->focused;
+}
+
+static KTUIWidget * KTUIDlgWidgetAtPoint( struct KTUIDlg * self, tui_point * relative_point )
+{
+    KTUIWidget * res = NULL;
+    uint32_t i, n = VectorLength( &self->widgets );
+    for ( i = 0; i < n && res == NULL; ++i )
+    {
+        KTUIWidget * w = VectorGet ( &self->widgets, i );
+        if ( w != NULL )
+        {
+            uint32_t x_left  = w->r.top_left.x;
+            uint32_t x_right = w->r.top_left.x + w->r.w;
+            if ( relative_point->x >= x_left && relative_point->x < x_right )
+            {
+                uint32_t y_top    = w->r.top_left.y;
+                uint32_t y_bottom = w->r.top_left.y + w->r.h;
+                if ( relative_point->y >= y_top && relative_point->y < y_bottom )
+                    res = w;
+            }
+        }
+    }
+    return res;
+}
+
+
+/* ****************************************************************************************** */
+
+
+static rc_t DlgEventHandler( struct KTUIDlg * self, tui_event * event )
+{
+    rc_t rc = 0;
+    if ( event->event_type == ktui_event_kb )
+    {
+        switch( event->data.kb_data.code )
+        {
+            case ktui_tab   : ;
+            case ktui_down  : ;
+            case ktui_right : rc = KTUIDlgMoveFocus( self, true ); break;
+
+            case ktui_shift_tab : ;
+            case ktui_up    : ;
+            case ktui_left  : rc = KTUIDlgMoveFocus( self, false ); break;
+        }
+    }
+    else if ( event->event_type == ktui_event_mouse )
+    {
+        tui_point p;
+        KTUIWidget * w;
+
+        p.x = event->data.mouse_data.x;
+        p.y = event->data.mouse_data.y;
+        KTUIDlgRelativePoint( self, &p );
+        w = KTUIDlgWidgetAtPoint( self, &p );
+        if ( w != NULL )
+        {
+            rc = KTUIDlgSetFocusTo( self, w );
+            if ( rc == 0 && w->on_event != 0 )
+            {
+                /* now send the mouse-event with coordinates relative to the widget
+                   to this widget */
+
+                tui_event m_event;
+                m_event.event_type = ktui_event_mouse;
+                m_event.data.mouse_data.x = ( p.x - w->r.top_left.x );
+                m_event.data.mouse_data.y = ( p.y - w->r.top_left.y );
+                m_event.data.mouse_data.button = event->data.mouse_data.button;
+                w->on_event( w, &m_event );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgHandleEvent( struct KTUIDlg * self, tui_event * event )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( event == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    {
+        if ( self->menu_active )
+        {
+            bool redraw = KTUI_Menu_Event( self->menu, self, event );
+            if ( redraw )
+                rc = KTUIDlgDraw( self, false );
+        }
+        else
+        {
+            bool handled = false;
+
+            KTUIWidget * w = KTUIDlgGetWidgetById( self, self->focused );
+            if ( w != NULL &&
+                 w->on_event != NULL &&
+                 event->event_type == ktui_event_kb )
+            {
+                handled = w->on_event( w, event );
+                if ( handled )
+                    event->event_type = ktui_event_none;
+            }
+
+            if ( !handled )
+                rc = DlgEventHandler( self, event );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIDlgGet ( struct KTUIDlg * self, tuidlg_event * event )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( event == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    {
+        tuidlg_event * ev = dlg_event_ring_get( &self->events );
+        if ( ev == NULL )
+        {
+            event->event_type = ktuidlg_event_none;
+        }
+        else
+        {
+            copy_dlg_event( ev, event );
+            dlg_event_ring_put_to_stock( &self->events, ev );
+        }
+    }
+    return rc;
+}
diff --git a/libs/tui/tui_dlg_helper.c b/libs/tui/tui_dlg_helper.c
new file mode 100644
index 0000000..8553ae8
--- /dev/null
+++ b/libs/tui/tui_dlg_helper.c
@@ -0,0 +1,250 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <tui/extern.h>
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kfs/directory.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <tui/tui_dlg.h>
+
+#include <sysalloc.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+rc_t native_to_internal( VFSManager * vfs_mgr, const char * native, char * buffer, uint32_t buffer_size, size_t * written )
+{
+    VPath * temp_v_path;
+    rc_t rc = VFSManagerMakeSysPath ( vfs_mgr, &temp_v_path, native );
+    if ( rc == 0 )
+    {
+        rc = VPathReadPath ( temp_v_path, buffer, buffer_size, written );
+        VPathRelease ( temp_v_path );
+    }
+    return rc;
+}
+
+
+rc_t internal_to_native( VFSManager * vfs_mgr, const char * internal, char * buffer, uint32_t buffer_size, size_t * written )
+{
+	rc_t rc = 0;
+	if ( internal[ 0 ] == '/' && internal[ 1 ] == 0 )
+	{
+		buffer[ 0 ] = '/'; buffer[ 1 ] = 0; *written = 1;
+	}
+	else
+	{
+		VPath * temp_v_path;
+		rc = VFSManagerMakePath ( vfs_mgr, &temp_v_path, "%s", internal );
+		if ( rc == 0 )
+		{
+			rc = VPathReadSysPath ( temp_v_path, buffer, buffer_size, written );
+			VPathRelease ( temp_v_path );
+		}
+	}
+    return rc;
+}
+
+
+rc_t set_native_caption( struct KTUIDlg * dlg, VFSManager * vfs_mgr, uint32_t id, const char * internal_path )
+{
+	tui_rect r;
+	rc_t rc = KTUIDlgGetWidgetRect ( dlg, id, &r );
+	if ( rc == 0 )
+	{
+		size_t written = 0;
+		char native[ 4096 ] = "";
+		rc = internal_to_native( vfs_mgr, internal_path, native, sizeof native, &written );
+		if ( rc == 0 )
+		{
+			if ( written <= ( r.w - 2 ) )
+				rc = KTUIDlgSetWidgetCaption ( dlg, id, native );
+			else
+			{
+				size_t written_2;
+				char temp[ 4096 ];
+				uint32_t part = ( r.w - 3 ) / 2;
+				rc = string_printf ( temp, sizeof temp, &written_2,
+						"%.*s ... %s", part, native, &native[ ( written - part ) - 1 ] );
+				if ( rc == 0 )
+					rc = KTUIDlgSetWidgetCaption ( dlg, id, temp );
+			}
+		}
+	}
+	return rc;
+}
+
+
+typedef struct dir_callback_ctx
+{
+	struct KTUIDlg * dlg;
+	const char * str_to_focus;
+	uint32_t widget_id;
+	uint32_t string_id;
+	uint32_t to_focus;
+    bool in_root;
+} dir_callback_ctx;
+
+
+static rc_t add_str_to_listbox( dir_callback_ctx * dctx, const char * name )
+{
+    rc_t rc = 0;
+    if ( dctx->in_root )
+    {
+#ifdef WINDOWS
+        size_t written;
+        char buffer[ 16 ];
+        rc = string_printf( buffer, sizeof buffer, &written, "%s:\\", name );
+        if ( rc == 0 && written > 0 )
+            rc = KTUIDlgAddWidgetString ( dctx->dlg, dctx->widget_id, buffer );
+#else
+        rc = KTUIDlgAddWidgetString ( dctx->dlg, dctx->widget_id, name );
+#endif        
+    }
+    else
+        rc = KTUIDlgAddWidgetString ( dctx->dlg, dctx->widget_id, name );
+    return rc;
+}
+
+
+static rc_t CC on_dir_entry( const KDirectory *dir, uint32_t type, const char * name, void * data )
+{
+    rc_t rc = 0;
+    if ( name != NULL && data != NULL && name[ 0 ] != 0 && name[ 0 ] != '.' )
+    {
+        dir_callback_ctx * dctx = data;
+        if ( ( type & ~kptAlias ) == kptDir )
+		{
+			rc = add_str_to_listbox( dctx, name );
+			if ( rc == 0 )
+			{
+				if ( dctx->str_to_focus != NULL )
+				{
+					int cmp = string_cmp ( name, string_size( name ),
+										   dctx->str_to_focus, string_size( dctx->str_to_focus ), 4096 );
+					if ( cmp == 0 )
+						dctx->to_focus = dctx->string_id;
+				}
+				dctx->string_id++;
+			}
+		}
+    }
+    return rc;
+}
+
+
+rc_t fill_widget_with_dirs( struct KTUIDlg * dlg, KDirectory * dir, uint32_t id, const char * path, const char * to_focus )
+{
+	rc_t rc;
+	
+	dir_callback_ctx dctx;
+	dctx.string_id = 0;
+	dctx.to_focus = 0;
+	dctx.str_to_focus = to_focus;
+	dctx.in_root = ( ( path[ 0 ] == '/' )&&( path[ 1 ] == 0 ) );
+
+	rc = KTUIDlgRemoveAllWidgetStrings ( dlg, id );
+	if ( rc == 0 )
+	{
+		if ( !dctx.in_root )
+		{
+			rc = KTUIDlgAddWidgetString ( dlg, id, "[ .. ]" );
+			dctx.string_id++;
+		}
+	}
+
+	if ( rc == 0 )
+	{
+		dctx.dlg = dlg;
+		dctx.widget_id = id;
+
+		/* we allow it to fail... */
+		KDirectoryVisit ( dir, false, on_dir_entry, &dctx, "%s", path );
+	}
+
+	if ( rc == 0 && dctx.to_focus > 0 )
+		rc = KTUIDlgSetWidgetSelectedString ( dlg, id, dctx.to_focus );
+
+    return rc;
+}
+
+
+typedef struct file_callback_ctx
+{
+    struct KTUIDlg * dlg;
+    const char * extension;
+	uint32_t id;
+} file_callback_ctx;
+
+
+static rc_t CC on_file_entry( const KDirectory *dir, uint32_t type, const char * name, void * data )
+{
+    rc_t rc = 0;
+    if ( name != NULL && data != NULL && name[ 0 ] != 0 && name[ 0 ] != '.' )
+    {
+        file_callback_ctx * fctx = data;
+        if ( ( type & ~kptAlias ) == kptFile )
+        {
+            bool add = ( fctx->extension == NULL );
+            if ( !add )
+            {
+                size_t name_size = string_size ( name );
+                size_t ext_size = string_size ( fctx->extension );
+                if ( name_size > ext_size )
+                {
+                    int cmp = string_cmp ( &name[ name_size - ext_size ], ext_size,
+                                           fctx->extension, ext_size, (uint32_t)ext_size );
+                    add = ( cmp == 0 );
+                }
+            }
+            if ( add )
+				rc = KTUIDlgAddWidgetString ( fctx->dlg, fctx->id, name );
+        }
+    }
+    return rc;
+}
+
+
+rc_t fill_widget_with_files( struct KTUIDlg * dlg, KDirectory * dir, uint32_t id, const char * path, const char * extension )
+{
+	rc_t rc = KTUIDlgRemoveAllWidgetStrings ( dlg, id );
+	if ( rc == 0 )
+    {
+        file_callback_ctx fctx;
+        fctx.extension = extension;
+		fctx.dlg = dlg;
+		fctx.id = id;
+        rc = KDirectoryVisit ( dir, false, on_file_entry, &fctx, "%s", path );
+    }
+    return rc;
+}
diff --git a/libs/tui/tui_menu.c b/libs/tui/tui_menu.c
new file mode 100644
index 0000000..95d5ce1
--- /dev/null
+++ b/libs/tui/tui_menu.c
@@ -0,0 +1,913 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <tui/extern.h>
+
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/vector.h>
+#include <klib/namelist.h>
+#include <klib/out.h>
+
+#include <tui/tui.h>
+#include <tui/tui_dlg.h>
+#include "tui_menu.h"
+#include "tui_widget.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+
+/* a menu is a tree-structure of nodes,
+   each node has a text and a integer element and a vector of child-nodes
+*/
+
+static const char tuimenu_classname [] = "KTUIMenu";
+
+typedef struct KTUI_Menu_Node
+{
+    Vector children;
+    const char * name;
+    uint32_t id, selected, name_len, max_child_name_len;
+    bool expanded;
+    char shortcut;
+} KTUI_Menu_Node;
+
+
+typedef struct KTUI_Menu
+{
+    KRefcount refcount;
+    KTUI_Menu_Node * root;
+} KTUI_Menu;
+
+
+typedef struct menu_ac
+{
+    const tui_ac * dflt;
+    const tui_ac * select;
+    const tui_ac * high;
+} menu_ac;
+
+
+static void destroy_node( struct KTUI_Menu_Node * node );
+
+static void CC destroy_node_callback ( void *item, void *data )
+{
+    destroy_node( ( KTUI_Menu_Node * ) item );
+}
+
+static void destroy_node( struct KTUI_Menu_Node * node )
+{
+    VectorWhack ( &node->children, destroy_node_callback, NULL );
+    free( ( void * ) node->name );
+    free( node );
+}
+
+static void destroy_menu( struct KTUI_Menu * self )
+{
+    destroy_node( self->root );
+    free( self );
+}
+
+
+static KTUI_Menu_Node * make_node ( KTUI_Menu_Node * parent, const char * name, uint32_t id, char shortcut )
+{
+    KTUI_Menu_Node * res = malloc( sizeof * res );
+    if ( res != NULL )
+    {
+        size_t l;
+        res->name = string_dup_measure ( name, &l );
+        res->name_len = ( uint32_t )l;
+        res->id = id;
+        res->shortcut = shortcut;
+        res->selected = 0;
+        res->max_child_name_len = 0;
+        VectorInit ( &res->children, 0, 12 );
+        if ( parent != NULL )
+        {
+            VectorAppend ( &parent->children, NULL, res );
+            if ( res->name_len > parent->max_child_name_len )
+                parent->max_child_name_len = res->name_len;
+        }
+    }
+    return res;
+}
+
+
+static int nlt_strcmp( const char* s1, const char* s2 )
+{
+    size_t n1 = string_size ( s1 );
+    size_t n2 = string_size ( s2 );
+    uint32_t maxchar = ( n1 < n2 ) ? ( uint32_t )n2 : ( uint32_t )n1;
+    return string_cmp ( s1, n1, s2, n2, maxchar );
+}
+
+
+static KTUI_Menu_Node * find_node_by_name_flat ( KTUI_Menu_Node * root, const char * name )
+{
+    KTUI_Menu_Node * res = NULL;
+    if ( root != NULL && name != NULL && name[ 0 ] != 0 )
+    {
+        uint32_t count = VectorLength( &root->children );
+        if ( count > 0 )
+        {
+            uint32_t idx;
+            for ( idx = VectorStart( &root->children ); idx < count && res == NULL; ++idx )
+            {
+                KTUI_Menu_Node * node = VectorGet ( &root->children, idx );
+                if ( nlt_strcmp( node->name, name ) == 0 )
+                    res = node;
+            }
+        }
+    }
+    return res;
+}
+
+
+#if 0
+static KTUI_Menu_Node * find_node_by_name ( KTUI_Menu_Node * root, const char * name )
+{
+    KTUI_Menu_Node * res = NULL;
+    if ( root != NULL && name != NULL && name[ 0 ] != 0 )
+    {
+        if ( nlt_strcmp( root->name, name ) == 0 )
+            res = root;
+        else
+        {
+            uint32_t count = VectorLength( &root->children );
+            if ( count > 0 )
+            {
+                uint32_t idx;
+                for ( idx = VectorStart( &root->children ); idx < count && res == NULL; ++idx )
+                {
+                    KTUI_Menu_Node * node = VectorGet ( &root->children, idx );
+                    res = find_node_by_name ( node, name ); /* recursion */
+                }
+            }
+        }
+    }
+    return res;
+}
+#endif
+
+static bool find_node_by_id ( KTUI_Menu_Node * node, uint32_t id, KTUI_Menu_Node ** found, KTUI_Menu_Node ** parent )
+{
+    bool res = false;
+    *found = NULL;
+    *parent = NULL;
+    if ( node != NULL )
+    {
+        if ( node->id == id )
+            *found = node;
+        else
+        {
+            uint32_t count = VectorLength( &node->children );
+            if ( count > 0 )
+            {
+                uint32_t idx;
+                for ( idx = VectorStart( &node->children ); idx < count && !res; ++idx )
+                {
+                    KTUI_Menu_Node * sub = VectorGet ( &node->children, idx );
+                    res = ( sub->id == id );
+                    if ( res )
+                    {
+                        *found = sub;
+                        *parent = node;
+                    }
+                    else
+                        res = find_node_by_id ( sub, id, found, parent ); /* recursion */
+                }
+            }
+        }
+    }
+    return res;
+}
+
+
+LIB_EXPORT rc_t CC KTUI_Menu_Make ( struct KTUI_Menu ** self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        KTUI_Menu * m = malloc( sizeof * m );
+        if ( m == NULL )
+            rc = RC( rcApp, rcAttr, rcCreating, rcMemory, rcExhausted );
+        else
+        {
+            KRefcountInit( &m->refcount, 1, "KTUI_Menu", "make", tuimenu_classname );
+            m->root = make_node ( NULL, "root", 0, ' ' );
+            m->root->expanded = true;
+            ( * self ) = m;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUI_Menu_AddRef ( const struct KTUI_Menu * self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        switch ( KRefcountAdd( &self->refcount, tuimenu_classname ) )
+        {
+        case krefOkay :
+            break;
+        case krefZero :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcIncorrect );
+        case krefLimit :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcExhausted );
+        case krefNegative :
+            rc =  RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid );
+        default :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcUnknown );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUI_Menu_Release ( struct KTUI_Menu * self )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop( &self->refcount, tuimenu_classname ) )
+        {
+        case krefOkay :
+        case krefZero :
+            break;
+        case krefWhack : destroy_menu( ( struct KTUI_Menu * ) self ); break;
+            break;
+        case krefNegative:
+            return RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid );
+        default:
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcUnknown );
+            break;            
+        }
+    }
+    return rc;
+}
+
+
+static rc_t append_segment( const char * path, VNamelist * segments, uint32_t start, uint32_t end )
+{
+    String S;
+    uint32_t l = ( end-start ) + 1;
+    StringInit( &S, &path[ start ], l, l );
+    return VNamelistAppendString ( segments, &S );
+}
+
+
+static rc_t decompose_path( const char * path, VNamelist * segments )
+{
+    rc_t rc = 0;
+    uint32_t len = string_measure ( path, NULL );
+    if ( len > 1 && path[ 0 ] == '/' )
+    {
+        uint32_t i, start = 1, end = 1;
+        for ( i = 1; i < len && rc == 0; ++ i )
+        {
+            if ( path[ i ] == '/' )
+            {
+                if ( end > start )
+                {
+                    rc = append_segment( path, segments, start, end );
+                    start = end = i + 1;
+                }
+                else
+                    rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcInvalid );
+            }
+            else
+                end = i;
+        }
+        if ( rc == 0 && ( end > start ) )
+            rc = append_segment( path, segments, start, end );
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcInvalid );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUI_Menu_Add ( struct KTUI_Menu * self, const char * path, uint32_t id, char shortcut )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( path == NULL || path[ 0 ] == 0 )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    {
+        /* take the path apart into a VNamelist with '/' as separator */
+        VNamelist * segments;
+        rc = VNamelistMake ( &segments, 5 );
+        if ( rc == 0 )
+        {
+            rc = decompose_path( path, segments );
+            if ( rc == 0 )
+            {
+                uint32_t count;
+                rc = VNameListCount ( segments, &count );
+                if ( rc == 0 && count > 0 )
+                {
+                    uint32_t i;
+                    KTUI_Menu_Node * node = self->root;
+                    for ( i = 0; i < count && node != NULL && rc == 0; ++i )
+                    {
+                        const char * segment;
+                        rc = VNameListGet ( segments, i, &segment );
+                        if ( rc == 0 && segment != NULL )
+                        {
+                            KTUI_Menu_Node * sub = find_node_by_name_flat ( node, segment );
+                            if ( sub == NULL )
+                            {
+                                if ( i == ( count - 1 ) )
+                                    sub = make_node ( node, segment, id, shortcut );
+                                else
+                                    sub = make_node ( node, segment, 0, 0 );
+                            }
+                            node = sub;
+                        }
+                    }
+                }
+            }
+            VNamelistRelease ( segments );
+        }
+    }
+    return rc;
+}
+
+
+static bool find_index_of_child( KTUI_Menu_Node * node, uint32_t child_id, uint32_t * idx )
+{
+    bool res = false;
+    uint32_t count = VectorLength( &node->children );
+    if ( count > 0 )
+    {
+        uint32_t i;
+        for ( i = VectorStart( &node->children ); i < count && !res; ++i )
+        {
+            KTUI_Menu_Node * child = VectorGet ( &node->children, i );
+            res = ( child->id == child_id );
+        }
+    }
+    return res;
+}
+
+
+LIB_EXPORT rc_t CC KTUI_Menu_Remove_Id ( struct KTUI_Menu * self, uint32_t id )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcRemoving, rcSelf, rcNull );
+    else
+    {
+        KTUI_Menu_Node * node;
+        KTUI_Menu_Node * parent;
+        bool found = find_node_by_id ( self->root, id, &node, &parent );
+        if ( !found )
+            rc = RC( rcApp, rcAttr, rcRemoving, rcItem, rcNotFound );
+        else
+        {
+            /* find out which index the node has in it's parents list */
+            uint32_t idx;
+            found = find_index_of_child( parent, id, &idx );
+            if ( !found )
+                rc = RC( rcApp, rcAttr, rcRemoving, rcItem, rcInvalid ); /* something is wrong ! */
+            else
+            {
+                void * removed;
+                rc = VectorRemove ( &parent->children, idx, &removed );
+                if ( rc == 0 )
+                    destroy_node( ( KTUI_Menu_Node * ) removed );
+            }
+        }
+    }
+    return rc;
+}
+
+
+void KTUI_Menu_Report_Node ( KTUI_Menu_Node * node, uint32_t depth )
+{
+    uint32_t count = VectorLength( &node->children );
+    KOutMsg( "%*s [ %.03d ] %s ( %d children )\n", depth + 1, "-", node->id, node->name, count );
+    if ( count > 0 )
+    {
+        uint32_t i;
+        for ( i = VectorStart( &node->children ); i < count; ++i )
+        {
+            KTUI_Menu_Node * child = VectorGet ( &node->children, i );
+            if ( child != NULL )
+                KTUI_Menu_Report_Node ( child, depth + 1 ); /* recursion! */
+        }
+    }
+}
+
+
+void KTUI_Menu_Report ( struct KTUI_Menu * self )
+{
+    if ( self == NULL )
+        KOutMsg( "KTUI_Menu_Report: self == NULL" );
+    else if ( self->root == NULL )
+        KOutMsg( "KTUI_Menu_Report: self->root == NULL" );
+    else
+        KTUI_Menu_Report_Node ( self->root, 0 );
+}
+
+
+
+static void draw_node_txt( struct KTUI * tui, tui_point * p, menu_ac * m_ac,
+                           const char * txt, char shortcut, bool selected )
+{
+    size_t txt_size;
+    uint32_t txt_len = string_measure ( txt, &txt_size );
+    const tui_ac * ac = selected ? m_ac->select : m_ac->dflt;
+    DlgWrite( tui, p->x + 1, p->y, ac, txt, txt_len );
+    if ( shortcut != 0 )
+    {
+        char * sptr = string_chr ( txt, txt_size, shortcut );
+        if ( sptr != NULL )
+        {
+            tui_ac ach;
+            copy_ac( &ach, ac );
+            ach.fg = m_ac->high->fg;
+            DlgWrite( tui, p->x + 1 + ( uint32_t )( sptr - txt ), p->y, &ach, sptr, 1 );
+        }
+    }
+}
+
+
+static void draw_node_v( KTUI_Menu_Node * node, struct KTUI * tui, tui_point * p, menu_ac * m_ac )
+{
+    if ( node != NULL )
+    {
+        uint32_t count = VectorLength( &node->children );
+        if ( count > 0 )
+        {
+            uint32_t i, w = node->max_child_name_len + 2;
+            draw_background( tui, false, p, w, count, m_ac->dflt->bg );
+
+            for ( i = VectorStart( &node->children ); i < count; ++i )
+            {
+                KTUI_Menu_Node * child = VectorGet ( &node->children, i );
+                if ( child != NULL )
+                {
+                    bool selected = ( node->selected == i );
+                    draw_node_txt( tui, p, m_ac, child->name, child->shortcut, selected );
+                    if ( child->expanded && selected )
+                    {
+                        tui_point p_sub;
+                        p_sub.x = p->x + w;
+                        p_sub.y = p->y;
+                        draw_node_v( child, tui, &p_sub, m_ac ); /* recursion here ! */
+                    }
+                    p->y++;
+                }
+            }
+        }
+    }
+}
+
+
+static void draw_node_h( KTUI_Menu_Node * node, struct KTUI * tui,
+                         const tui_rect * r, menu_ac * m_ac )
+{
+    if ( node != NULL )
+    {
+        uint32_t count = VectorLength( &node->children );
+        if ( count > 0 )
+        {
+            uint32_t i, x;
+            for ( x = r->top_left.x, i = VectorStart( &node->children ); i < count; ++i )
+            {
+                KTUI_Menu_Node * child = VectorGet ( &node->children, i );
+                if ( child != NULL )
+                {
+                    tui_point p;
+                    bool selected = ( node->selected == i );
+                    p.x = x + 1;
+                    p.y = r->top_left.y;
+                    draw_node_txt( tui, &p, m_ac, child->name, child->shortcut, selected && !child->expanded );
+                    if ( selected && child->expanded )
+                    {
+                        p.x = x + 1;
+                        p.y = r->top_left.y + 1;
+                        draw_node_v( child, tui, &p, m_ac );
+                    }
+                    x += ( child->name_len + 2 );
+                }
+            }
+        }
+    }
+}
+
+
+static rc_t get_abs_dlg_rect( struct KTUIDlg * dlg, tui_rect * r )
+{
+    tui_rect rr;
+    rc_t rc = KTUIDlgGetRect ( dlg, &rr );
+    if ( rc == 0 )
+        rc = KTUIDlgAbsoluteRect ( dlg, r, &rr );
+    return rc;
+}
+
+
+void KTUI_Menu_Draw( struct KTUI_Menu * self, struct KTUIDlg * dlg )
+{
+    tui_rect r;
+    rc_t rc = get_abs_dlg_rect( dlg, &r );
+    if ( rc == 0 )
+    {
+        const struct KTUIPalette * pa = KTUIDlgGetPalette ( dlg );
+        if ( pa != NULL )
+        {
+            menu_ac m_ac;
+            m_ac.dflt   = KTUIPaletteGet ( pa, ktuipa_menu );
+            m_ac.select = KTUIPaletteGet ( pa, ktuipa_menu_sel );
+            m_ac.high   = KTUIPaletteGet ( pa, ktuipa_menu_hi );
+            if ( m_ac.dflt != NULL && m_ac.select != NULL && m_ac.high != NULL )
+            {
+                struct KTUI * tui = KTUIDlgGetTui ( dlg );
+                if ( tui != NULL )
+                {
+                    rc_t rc = draw_background( tui, false, ( tui_point * )&r.top_left, r.w, 1, m_ac.dflt->bg );
+                    if ( rc == 0 )
+                        draw_node_h( self->root, tui, &r, &m_ac );
+                }
+            }
+        }
+    }
+}
+
+
+static KTUI_Menu_Node * get_sub_node( KTUI_Menu_Node * node, uint32_t idx )
+{
+    if ( node != NULL )
+        return VectorGet ( &node->children, idx );
+    else
+        return NULL;
+}
+
+
+static bool shift_node_selection( KTUI_Menu_Node * node, int32_t by )
+{
+    bool res = false;
+    uint32_t count = VectorLength( &node->children );
+    if ( count > 0 )
+    {
+        int32_t selected = node->selected;
+        selected += by;
+        while ( selected < 0 )
+            selected += count;
+        while ( ( uint32_t )selected >= count )
+            selected -= count;
+        res = ( node->selected != selected );
+        if ( res ) node->selected = selected;
+    }
+    return res;
+}
+
+
+static bool menu_select_h( struct KTUI_Menu * self, int32_t by )
+{
+    bool res = false;
+    KTUI_Menu_Node * node = self->root;
+    if ( node != NULL )
+        res = shift_node_selection( node, by );
+    return res;
+}
+
+static KTUI_Menu_Node * menu_get_expanded_node( struct KTUI_Menu * self )
+{
+    KTUI_Menu_Node * node = self->root;
+    if ( node != NULL )
+        node = get_sub_node( node, node->selected );
+    while ( node != NULL && node->expanded )
+        node = get_sub_node( node, node->selected );
+    return node;
+}
+
+
+static bool selected_node_expanded( KTUI_Menu_Node * node )
+{
+    bool res = false;
+    KTUI_Menu_Node * sub_node = get_sub_node( node, node->selected );
+    if ( sub_node != NULL )
+        res = sub_node->expanded;
+    return res;
+}
+
+
+static bool menu_select_v( struct KTUI_Menu * self, int32_t by )
+{
+    bool res = false;
+
+    KTUI_Menu_Node * node = self->root;
+    if ( node != NULL )
+        node = get_sub_node( node, node->selected );
+    while ( node != NULL && selected_node_expanded( node ) )
+        node = get_sub_node( node, node->selected );
+
+    if ( node != NULL )
+    {
+        if ( !node->expanded && ( VectorLength( &node->children ) > 0 ) )
+        {
+            node->expanded = true;
+            res = true;
+        }
+        else
+        {
+            if ( node->selected == 0 && by < 0 )
+            {
+                node->expanded = false;
+                res = true;
+            }
+            else
+                res = shift_node_selection( node, by );
+        }
+    }
+    return res;
+}
+
+
+static bool menu_select( struct KTUI_Menu * self, struct KTUIDlg * dlg )
+{
+    bool res = false;
+    KTUI_Menu_Node * node = menu_get_expanded_node( self );
+    if ( node != NULL )
+    {
+        uint32_t count = VectorLength( &node->children );
+        if ( count == 0 )
+            KTUIDlgPushEvent( dlg, ktuidlg_event_menu, node->id, 0, 0, NULL );
+        else
+        {
+            node->expanded = !node->expanded;
+            res = true;
+        }
+    }
+    return res;
+}
+
+
+static KTUI_Menu_Node * x_coordinate_to_top_node( KTUI_Menu_Node * node, uint32_t x, uint32_t * idx )
+{
+    KTUI_Menu_Node * res = NULL;
+    if ( node != NULL )
+    {
+        uint32_t count = VectorLength( &node->children );
+        if ( count > 0 )
+        {
+            uint32_t i, x1;
+            for ( x1 = 0, i = VectorStart( &node->children ); i < count && res == NULL; ++i )
+            {
+                KTUI_Menu_Node * child = VectorGet ( &node->children, i );
+                if ( child != NULL )
+                {
+                    uint32_t w = child->name_len + 2;
+                    if ( x >= x1 && x <= x1 + w )
+                    {
+                        res = child;
+                        *idx = i;
+                    }
+                    else
+                        x1 += w;
+                }
+            }
+        }
+    }
+    return res;
+}
+
+
+static bool on_mouse( struct KTUI_Menu * self, struct KTUIDlg * dlg, tui_rect * r, uint32_t x, uint32_t y )
+{
+    bool res = false;
+    if ( y >= r->top_left.y )
+    {
+        /* the mouse was not left of the windows */
+        uint32_t idx;
+        KTUI_Menu_Node * top_node = x_coordinate_to_top_node( self->root, x - r->top_left.x, &idx );
+        if ( top_node != NULL )
+        {
+            int32_t h_idx = y;
+            h_idx -= r->top_left.y;
+            if ( h_idx == 0 )
+            {
+                /* the mouse is in the top menu-line */
+                res = ( self->root->selected != idx || !top_node->expanded );
+                if ( res )
+                {
+                    top_node->expanded = true;
+                    self->root->selected = idx;
+                }
+            }
+            else
+            {
+                /* the mouse is not in the top menu-line */
+                res = ( self->root->selected == idx && top_node->expanded && ( h_idx > 0 ) );
+                if ( res )
+                {
+                    /* the mouse is below the the top menu-line and the menu is expanded and selected */
+                    uint32_t count = VectorLength( &top_node->children );
+                    h_idx--;
+                    res = ( ( uint32_t )h_idx < count );
+                    if ( res )
+                    {
+                        KTUI_Menu_Node * sub_node = get_sub_node( top_node, h_idx );
+                        top_node->selected = h_idx;
+                        if ( sub_node != NULL )
+                        {
+                            count = VectorLength( &sub_node->children );
+                            if ( count == 0 )
+                                KTUIDlgPushEvent( dlg, ktuidlg_event_menu, sub_node->id, 0, 0, NULL );
+                            else
+                            {
+
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return res;
+}
+
+
+static bool menu_all_shortcut( KTUI_Menu_Node * node, KTUI_Menu_Node * parent, uint32_t node_id, struct KTUIDlg * dlg, char key )
+{
+    bool res = false;
+    if ( node != NULL )
+    {
+        uint32_t idx, count = VectorLength( &node->children );
+        res = ( node->shortcut == key );
+        if ( res )
+        {
+            /* we have found a node with the requested shortcut */
+            if ( count == 0 )
+            {
+                /* the node has no sub-nodes: we have found what we were looking for! */
+                KTUIDlgPushEvent( dlg, ktuidlg_event_menu, node->id, 0, 0, NULL );
+            }
+            else
+            {
+                /* the node has sub-nodes: we have to dig deeper */
+                if ( !node->expanded )
+                {
+                    /* the node is not expanded: let's expand it, do not examime it's sub-nodes */
+                    node->expanded = true;
+                }
+                else
+                {
+                    if ( parent != NULL && parent->selected == node_id )
+                    {
+                        bool sub_res = false;
+                        /* the node is expanded: lets dig deeper into it's subnodes */
+                        for ( idx = 0; idx < count && !sub_res; ++idx )
+                            sub_res = menu_all_shortcut( VectorGet ( &node->children, idx ), node, idx, dlg, key ); /* recursion */
+                    }
+                }
+                /* in any case we have an expanded subnode now, select it too now */
+                if ( parent != NULL )
+                    parent->selected = node_id;
+            }
+        }
+        else
+        {
+            /* the node does not match the requested shortcut, let's inspect it's subnodes */
+            for ( idx = 0; idx < count && !res; ++idx )
+                res = menu_all_shortcut( VectorGet ( &node->children, idx ), node, idx, dlg, key ); /* recursion */
+        }
+    }
+    return res;
+}
+
+
+/* try to find the key in the expanded path */
+static bool menu_path_shortcut( KTUI_Menu_Node * node, struct KTUIDlg * dlg, char key )
+{
+    bool res = false;
+    if ( node != NULL )
+    {
+        uint32_t count = VectorLength( &node->children );
+        res = ( node->shortcut == key && count == 0 );
+        if ( res )
+            KTUIDlgPushEvent( dlg, ktuidlg_event_menu, node->id, 0, 0, NULL );
+        else
+            res = menu_path_shortcut( VectorGet ( &node->children, node->selected ), dlg, key ); /* recursion here */
+    }
+    return res;
+}
+
+
+/* try to find the key in the child-vector of root ( does expand/un-expand top-level drop-down menus ) */
+static bool menu_root_shortcut( KTUI_Menu_Node * root, struct KTUIDlg * dlg, char key )
+{
+    bool res = false;
+    if ( root != NULL )
+    {
+        uint32_t idx, count = VectorLength( &root->children );
+        for ( idx = 0; idx < count && !res; ++idx )
+        {
+            KTUI_Menu_Node * node = VectorGet ( &root->children, idx );
+            res = ( node != NULL && node->shortcut == key );
+            if ( res )
+            {
+                uint32_t c_count = VectorLength( &node->children );
+                if ( c_count == 0 )
+                    KTUIDlgPushEvent( dlg, ktuidlg_event_menu, node->id, 0, 0, NULL );
+                else
+                {
+                    if ( root->selected == idx )
+                        node->expanded = !node->expanded;
+                    else
+                    {
+                        node->expanded = true;
+                        root->selected = idx;
+                    }
+                }
+            }
+        }
+    }
+    return res;
+}
+
+
+/*
+static bool is_the_selected_node_expanded( KTUI_Menu_Node * node )
+{
+    bool res = false;
+    if ( node != NULL && node->expanded )
+    {
+        KTUI_Menu_Node * sub = VectorGet ( &node->children, node->selected );
+        if ( sub != NULL )
+            res = sub->expanded;
+    }
+    return res;
+}
+*/
+
+static bool menu_shortcut( struct KTUI_Menu * self, struct KTUIDlg * dlg, tui_event * event )
+{
+    char key = event->data.kb_data.key;
+    bool res = menu_path_shortcut( self->root, dlg, key );
+    if ( !res )
+        res = menu_root_shortcut( self->root, dlg, key );
+    if ( !res )
+        res = menu_all_shortcut( self->root, NULL, 0, dlg, key );
+    return res;
+}
+
+
+bool KTUI_Menu_Event( struct KTUI_Menu * self, struct KTUIDlg * dlg, tui_event * event )
+{
+    bool res = false;
+    if ( event->event_type == ktui_event_kb )
+    {
+        switch( event->data.kb_data.code )
+        {
+            case ktui_left  : res = menu_select_h( self, -1 ); break;
+            case ktui_right : res = menu_select_h( self, +1 ); break;
+            case ktui_up    : res = menu_select_v( self, -1 ); break;
+            case ktui_down  : res = menu_select_v( self, +1 ); break;
+            case ktui_enter : res = menu_select( self, dlg ); break;
+            case ktui_alpha : res = menu_shortcut( self, dlg, event ); break;
+        }
+    }
+    else if ( event->event_type == ktui_event_mouse )
+    {
+        tui_rect r;
+        rc_t rc = get_abs_dlg_rect( dlg, &r );
+        if ( rc == 0 )
+            res = on_mouse( self, dlg, &r, event->data.mouse_data.x, event->data.mouse_data.y );
+    }
+    return res;
+}
diff --git a/libs/tui/tui_menu.h b/libs/tui/tui_menu.h
new file mode 100644
index 0000000..bdf0499
--- /dev/null
+++ b/libs/tui/tui_menu.h
@@ -0,0 +1,49 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_tui_menu_
+#define _h_tui_menu_
+
+#include <tui/tui.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+struct KTUI_Menu;
+
+void KTUI_Menu_Report ( struct KTUI_Menu * self );
+
+void KTUI_Menu_Draw( struct KTUI_Menu * self, struct KTUIDlg * dlg );
+
+bool KTUI_Menu_Event( struct KTUI_Menu * self, struct KTUIDlg * dlg, tui_event * event );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_tui_menu_ */
diff --git a/libs/tui/tui_palette.c b/libs/tui/tui_palette.c
new file mode 100644
index 0000000..0c75d18
--- /dev/null
+++ b/libs/tui/tui_palette.c
@@ -0,0 +1,304 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <tui/extern.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+
+#include <tui/tui.h>
+#include <tui/tui_dlg.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+
+typedef struct KTUIPalette
+{
+    KRefcount refcount;
+    tui_ac entry[ ktuipa_last ];
+} KTUIPalette;
+
+static const char tuipa_classname [] = "KTUIPalette";
+
+/* the hardcoded default values... */
+#define INVALID_ATTR KTUI_a_none
+#define INVALID_FG KTUI_c_white
+#define INVALID_BG KTUI_c_gray
+
+#define DFL_DLG_ATTR KTUI_a_none
+#define DFL_DLG_FG KTUI_c_white
+#define DFL_DLG_BG KTUI_c_light_gray
+
+#define DFL_DLG_CAPTION_ATTR KTUI_a_none
+#define DFL_DLG_CAPTION_FG KTUI_c_white
+#define DFL_DLG_CAPTION_BG KTUI_c_gray
+
+#define DFL_DLG_FOCUS_ATTR KTUI_a_none
+#define DFL_DLG_FOCUS_FG KTUI_c_white
+#define DFL_DLG_FOCUS_BG KTUI_c_red
+
+#define DFL_LABEL_ATTR KTUI_a_none
+#define DFL_LABEL_FG KTUI_c_white
+#define DFL_LABEL_BG KTUI_c_gray
+
+#define DFL_BUTTON_ATTR KTUI_a_none
+#define DFL_BUTTON_FG KTUI_c_white
+#define DFL_BUTTON_BG KTUI_c_gray
+
+#define DFL_CHECKBOX_ATTR KTUI_a_none
+#define DFL_CHECKBOX_FG KTUI_c_white
+#define DFL_CHECKBOX_BG KTUI_c_gray
+
+#define DFL_INPUT_ATTR KTUI_a_none
+#define DFL_INPUT_FG KTUI_c_black
+#define DFL_INPUT_BG KTUI_c_white
+
+#define DFL_INPUT_HINT_ATTR KTUI_a_none
+#define DFL_INPUT_HINT_FG KTUI_c_black
+#define DFL_INPUT_HINT_BG KTUI_c_red
+
+#define DFL_RADIOBOX_ATTR KTUI_a_none
+#define DFL_RADIOBOX_FG KTUI_c_white
+#define DFL_RADIOBOX_BG KTUI_c_gray
+
+#define DFL_LIST_ATTR KTUI_a_none
+#define DFL_LIST_FG KTUI_c_white
+#define DFL_LIST_BG KTUI_c_gray
+
+#define DFL_PROGRESS_ATTR KTUI_a_none
+#define DFL_PROGRESS_FG KTUI_c_white
+#define DFL_PROGRESS_BG KTUI_c_gray
+
+#define DFL_SPINEDIT_ATTR KTUI_a_none
+#define DFL_SPINEDIT_FG KTUI_c_white
+#define DFL_SPINEDIT_BG KTUI_c_gray
+
+#define DFL_GRID_ATTR KTUI_a_none
+#define DFL_GRID_FG KTUI_c_black
+#define DFL_GRID_BG KTUI_c_gray
+
+#define DFL_GRID_COL_HDR_ATTR KTUI_a_none
+#define DFL_GRID_COL_HDR_FG KTUI_c_black
+#define DFL_GRID_COL_HDR_BG KTUI_c_white
+
+#define DFL_GRID_ROW_HDR_ATTR KTUI_a_none
+#define DFL_GRID_ROW_HDR_FG KTUI_c_black
+#define DFL_GRID_ROW_HDR_BG KTUI_c_white
+
+#define DFL_GRID_CURSOR_ATTR KTUI_a_none
+#define DFL_GRID_CURSOR_FG KTUI_c_yellow
+#define DFL_GRID_CURSOR_BG KTUI_c_black
+
+#define DFL_MENU_ATTR KTUI_a_none
+#define DFL_MENU_FG KTUI_c_gray
+#define DFL_MENU_BG KTUI_c_dark_blue
+
+#define DFL_MENU_SEL_ATTR KTUI_a_bold
+#define DFL_MENU_SEL_FG KTUI_c_white
+#define DFL_MENU_SEL_BG KTUI_c_dark_blue
+
+#define DFL_MENU_HI_ATTR KTUI_a_none
+#define DFL_MENU_HI_FG KTUI_c_cyan
+#define DFL_MENU_HI_BG KTUI_c_dark_blue
+
+
+static void write_default_values ( struct KTUIPalette * self )
+{
+    set_ac( &self->entry[ ktuipa_dlg ], DFL_DLG_ATTR, DFL_DLG_FG, DFL_DLG_BG );
+    set_ac( &self->entry[ ktuipa_dlg_caption ], DFL_DLG_CAPTION_ATTR, DFL_DLG_CAPTION_FG, DFL_DLG_CAPTION_BG );
+    set_ac( &self->entry[ ktuipa_dlg_focus ], DFL_DLG_FOCUS_ATTR, DFL_DLG_FOCUS_FG, DFL_DLG_FOCUS_BG );
+
+    set_ac( &self->entry[ ktuipa_label ], DFL_LABEL_ATTR, DFL_LABEL_FG, DFL_LABEL_BG );
+    set_ac( &self->entry[ ktuipa_button ], DFL_BUTTON_ATTR, DFL_BUTTON_FG, DFL_BUTTON_BG );
+    set_ac( &self->entry[ ktuipa_checkbox ], DFL_CHECKBOX_ATTR, DFL_CHECKBOX_FG, DFL_CHECKBOX_BG );
+    set_ac( &self->entry[ ktuipa_input ], DFL_INPUT_ATTR, DFL_INPUT_FG, DFL_INPUT_BG );
+    set_ac( &self->entry[ ktuipa_input_hint ], DFL_INPUT_HINT_ATTR, DFL_INPUT_HINT_FG, DFL_INPUT_HINT_BG );
+    set_ac( &self->entry[ ktuipa_radiobox ], DFL_RADIOBOX_ATTR, DFL_RADIOBOX_FG, DFL_RADIOBOX_BG );
+    set_ac( &self->entry[ ktuipa_list ], DFL_LIST_ATTR, DFL_LIST_FG, DFL_LIST_BG );
+    set_ac( &self->entry[ ktuipa_progress ], DFL_PROGRESS_ATTR, DFL_PROGRESS_FG, DFL_PROGRESS_BG );
+    set_ac( &self->entry[ ktuipa_spinedit ], DFL_SPINEDIT_ATTR, DFL_SPINEDIT_FG, DFL_SPINEDIT_BG );
+    set_ac( &self->entry[ ktuipa_grid ], DFL_GRID_ATTR, DFL_GRID_FG, DFL_GRID_BG );
+
+    set_ac( &self->entry[ ktuipa_grid_col_hdr ], DFL_GRID_COL_HDR_ATTR, DFL_GRID_COL_HDR_FG, DFL_GRID_COL_HDR_BG );
+    set_ac( &self->entry[ ktuipa_grid_row_hdr ], DFL_GRID_ROW_HDR_ATTR, DFL_GRID_ROW_HDR_FG, DFL_GRID_ROW_HDR_BG );
+    set_ac( &self->entry[ ktuipa_grid_cursor ], DFL_GRID_CURSOR_ATTR, DFL_GRID_CURSOR_FG, DFL_GRID_CURSOR_BG );
+
+    set_ac( &self->entry[ ktuipa_menu ], DFL_MENU_ATTR, DFL_MENU_FG, DFL_MENU_BG );
+    set_ac( &self->entry[ ktuipa_menu_sel ], DFL_MENU_SEL_ATTR, DFL_MENU_SEL_FG, DFL_MENU_SEL_BG );
+    set_ac( &self->entry[ ktuipa_menu_hi ], DFL_MENU_HI_ATTR, DFL_MENU_HI_FG, DFL_MENU_HI_BG );
+}
+
+
+LIB_EXPORT rc_t CC KTUIPaletteMake ( struct KTUIPalette ** self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        KTUIPalette * pa = malloc( sizeof * pa );
+        if ( pa == NULL )
+            rc = RC( rcApp, rcAttr, rcCreating, rcMemory, rcExhausted );
+        else
+        {
+            KRefcountInit( &pa->refcount, 1, "KTUIPalette", "make", tuipa_classname );
+            write_default_values ( pa );
+            ( * self ) = pa;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIPaletteAddRef ( const struct KTUIPalette * self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        switch ( KRefcountAdd( &self->refcount, tuipa_classname ) )
+        {
+        case krefOkay :
+            break;
+        case krefZero :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcIncorrect );
+        case krefLimit :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcExhausted );
+        case krefNegative :
+            rc =  RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid );
+        default :
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcUnknown );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIPaletteRelease ( const struct KTUIPalette * self )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop( &self->refcount, tuipa_classname ) )
+        {
+        case krefOkay :
+        case krefZero :
+            break;
+        case krefWhack :
+            free( ( void * ) self );
+            break;
+        case krefNegative:
+            return RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcInvalid );
+        default:
+            rc = RC( rcNS, rcMgr, rcAttaching, rcRefcount, rcUnknown );
+            break;            
+        }
+    }
+    return rc;
+}
+
+
+static tui_ac invalid_entry = { INVALID_ATTR, INVALID_FG, INVALID_BG };
+
+
+LIB_EXPORT const tui_ac * CC KTUIPaletteGet ( const struct KTUIPalette * self, KTUIPa_entry what )
+{
+    if ( self != NULL && what >= ktuipa_dlg && what < ktuipa_last )
+        return &self->entry[ what ];
+    else 
+        return &invalid_entry;
+}
+
+
+LIB_EXPORT rc_t CC KTUIPaletteSet ( struct KTUIPalette * self, KTUIPa_entry what, const tui_ac * ac )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( ac == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    else if ( what < ktuipa_dlg || what >= ktuipa_last )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcInvalid );
+    else
+        copy_ac( &self->entry[ what ], ac );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIPaletteSet_fg ( struct KTUIPalette * self, KTUIPa_entry what, KTUI_color fg )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( what < ktuipa_dlg || what >= ktuipa_last )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcInvalid );
+    else
+        self->entry[ what ].fg = fg;
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIPaletteSet_bg ( struct KTUIPalette * self, KTUIPa_entry what, KTUI_color bg )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( what < ktuipa_dlg || what >= ktuipa_last )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcInvalid );
+    else
+        self->entry[ what ].bg = bg;
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIPaletteDefault ( struct KTUIPalette * self )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+        write_default_values ( self );
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC KTUIPaletteCopy ( struct KTUIPalette * dst, const struct KTUIPalette * src )
+{
+    rc_t rc = 0;
+    if ( dst == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else if ( src == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    else
+    {
+        uint32_t i;
+        for ( i = ktuipa_dlg; i < ktuipa_last; ++ i )
+            copy_ac( &dst->entry[ i ], &src->entry[ i ] );
+    }
+    return rc;
+}
diff --git a/libs/tui/tui_std_dlg.c b/libs/tui/tui_std_dlg.c
new file mode 100644
index 0000000..64045bc
--- /dev/null
+++ b/libs/tui/tui_std_dlg.c
@@ -0,0 +1,355 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <tui/extern.h>
+
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/filetools.h>
+
+#include <tui/tui_dlg.h>
+
+#include <sysalloc.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+static rc_t Std_Dlg_Loop ( struct KTUIDlg * dlg, uint32_t * selection, bool * selected )
+{
+    rc_t rc = KTUIDlgDraw( dlg, false );
+    if ( selected != NULL ) * selected = false;
+    if ( rc == 0 )
+    {
+        struct KTUI * tui = KTUIDlgGetTui( dlg );
+        KTUIDlgSetFocus( dlg, 0 );
+        do
+        {
+            tui_event event;
+            rc = KTUIGet ( tui, &event );
+            if ( rc == 0 )
+            {
+                rc = KTUIDlgHandleEvent( dlg, &event );
+                if ( rc == 0 )
+                {
+                    tuidlg_event dev;
+                    do
+                    {
+                        rc = KTUIDlgGet ( dlg, &dev );
+                        if ( rc == 0 && dev.event_type == ktuidlg_event_select )
+                        {
+                            if ( selection != NULL )
+                                *selection = dev.widget_id;
+                            KTUIDlgSetDone ( dlg, true );
+                            if ( selected != NULL ) *selected = true;
+                        }
+                    } while ( rc == 0 && dev.event_type != ktuidlg_event_none && !KTUIDlgGetDone( dlg ) );
+                }
+                if ( is_alpha_key( &event, 27 ) ) 
+                    KTUIDlgSetDone ( dlg, true );
+            }
+        } while ( rc == 0 && !KTUIDlgGetDone( dlg ) );
+    }
+    return rc;
+}
+
+
+/* ****************************************************************************************** */
+
+
+static rc_t make_dlg_with_bg( struct KTUIDlg ** dlg,
+                              struct KTUIPalette ** pal,
+                              struct KTUI * tui_,
+                              struct KTUIDlg * parent,
+                              tui_rect * r,
+                              KTUI_color bg1,
+                              KTUI_color bg2 )
+{
+    rc_t rc;
+    struct KTUI * tui = tui_;
+    if ( tui == NULL )
+        tui = KTUIDlgGetTui( parent );
+    if ( tui == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+    else
+    {
+        rc = KTUIPaletteMake ( pal );
+        if ( rc == 0 )
+        {
+            KTUIPaletteSet_bg ( *pal, ktuipa_dlg, bg1 );
+            KTUIPaletteSet_bg ( *pal, ktuipa_dlg_caption, bg2 );
+            rc = KTUIDlgMake ( tui, dlg, parent, *pal, r );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC TUI_ShowMessage ( struct KTUI * tui, struct KTUIDlg * parent, const char * caption,
+                       const char * txt, uint32_t x, uint32_t y, uint32_t w, KTUI_color bg1, KTUI_color bg2 )
+{
+    rc_t rc;
+    struct KTUIPalette * pal;
+    struct KTUIDlg * dlg;
+    tui_rect r;
+
+    set_rect( &r, x, y, w, 6 );
+    rc = make_dlg_with_bg( &dlg, &pal, tui, parent, &r, bg1, bg2 );
+    if ( rc == 0 )
+    {
+        uint32_t y1 = 1;
+        r.w -= 2;
+
+        if ( caption != NULL )
+        {
+            rc = KTUIDlgSetCaption ( dlg, caption );
+            y1++;
+        }
+
+        if ( rc == 0 )
+            rc = KTUIDlgAddLabel2( dlg, 100, 1, y1, r.w, txt );
+        y1 += 2;
+
+        if ( rc == 0 )
+            rc = KTUIDlgAddBtn2( dlg, 101, 1, y1, 6, "OK" );
+
+        if ( rc == 0 )
+            rc = Std_Dlg_Loop ( dlg, NULL, NULL );
+
+        KTUIDlgRelease ( dlg );
+        KTUIPaletteRelease ( pal );
+    }
+    return rc;
+}
+
+
+/* ****************************************************************************************** */
+
+
+LIB_EXPORT rc_t CC TUI_YesNoDlg ( struct KTUI * tui, struct KTUIDlg * parent, const char * caption,
+                    const char * question, uint32_t x, uint32_t y, uint32_t w, bool * yes, KTUI_color bg1, KTUI_color bg2 )
+{
+    rc_t rc;
+    struct KTUIPalette * pal;
+    struct KTUIDlg * dlg;
+    tui_rect r;
+
+    set_rect( &r, x, y, w, 6 );
+    rc = make_dlg_with_bg( &dlg, &pal, tui, parent, &r, bg1, bg2 );
+    if ( rc == 0 )
+    {
+        if ( caption != NULL )
+            rc = KTUIDlgSetCaption ( dlg, caption );
+
+        if ( rc == 0 )
+            rc = KTUIDlgAddLabel2( dlg, 100, 1, 2, r.w - 2, question );
+
+        if ( rc == 0 )
+            rc = KTUIDlgAddBtn2( dlg, 101, 1, 4, 10, "Yes" );
+
+        if ( rc == 0 )
+            rc = KTUIDlgAddBtn2( dlg, 102, 12, 4, 10, "No" );
+
+        if ( rc == 0 )
+        {
+            uint32_t selection;
+            rc = Std_Dlg_Loop ( dlg, &selection, NULL );
+            if ( yes != NULL )
+                *yes = ( selection == 101 );
+        }
+
+        KTUIDlgRelease ( dlg );
+        KTUIPaletteRelease ( pal );
+    }
+    return rc;
+}
+
+
+/* ****************************************************************************************** */
+
+
+LIB_EXPORT rc_t CC TUI_ShowFile( struct KTUI * tui, struct KTUIDlg * parent, const char * caption,
+                   const char * filename, tui_rect *r, KTUI_color bg1, KTUI_color bg2 )
+{
+    struct KTUIPalette * pal;
+    struct KTUIDlg * dlg;
+    rc_t rc = make_dlg_with_bg( &dlg, &pal, tui, parent, r, bg1, bg2 );
+    if ( rc == 0 )
+    {
+        VNamelist * list = NULL;
+
+        if ( caption != NULL )
+            rc = KTUIDlgSetCaption ( dlg, caption );
+
+        if ( rc == 0 )
+            rc = VNamelistMake ( &list, 100 );
+
+        if ( rc == 0 )
+            rc = LoadFileByNameToNameList( list, filename );
+
+        if ( rc == 0 )
+        {
+            tui_rect r1;
+
+            set_rect( &r1, 0, 1, r->w, r->h - 2 );
+            rc = KTUIDlgAddList ( dlg, 100, &r1 );
+            if ( rc == 0 )
+                rc = KTUIDlgAddWidgetStrings ( dlg, 100, list );
+        }
+
+        if ( rc == 0 )
+            rc = KTUIDlgAddBtn2( dlg, 101, 0, r->h - 1, r->w, "OK" );
+
+        if ( rc == 0 )
+            rc = Std_Dlg_Loop ( dlg, NULL, NULL );
+
+        VNamelistRelease( list );
+        KTUIDlgRelease ( dlg );
+        KTUIPaletteRelease ( pal );
+    }
+    return rc;
+}
+
+
+/* ****************************************************************************************** */
+
+
+LIB_EXPORT rc_t CC TUI_EditBuffer( struct KTUI * tui, struct KTUIDlg * parent, const char * caption,
+                     char * buffer, size_t buflen, uint32_t x, uint32_t y, uint32_t w, bool * selected, 
+                     KTUI_color bg1, KTUI_color bg2 )
+{
+    rc_t rc;
+    struct KTUIPalette * pal;
+    struct KTUIDlg * dlg;
+    tui_rect r;
+
+    if ( selected != NULL ) *selected = false;
+    set_rect( &r, x, y, w, 6 );
+    rc = make_dlg_with_bg( &dlg, &pal, tui, parent, &r, bg1, bg2 );
+    if ( rc == 0 )
+    {
+        uint32_t y1 = 1;
+        uint32_t selected_id = 0;
+
+        if ( caption != NULL )
+        {
+            rc = KTUIDlgSetCaption ( dlg, caption );
+            y1++;
+        }
+
+        if ( rc == 0 )
+        {
+            tui_rect r1;
+            set_rect( &r1, 1, y1, r.w - 2, 1 );
+            rc = KTUIDlgAddInput ( dlg, 100, &r1, buffer, buflen );
+        }
+
+        y1 += 2;
+
+        if ( rc == 0 )
+            rc = KTUIDlgAddBtn2( dlg, 101, 1, y1, 12, "OK" );
+
+        if ( rc == 0 )
+            rc = KTUIDlgAddBtn2( dlg, 102, 14, y1, 22, "Cancel (ESC-ESC)" );
+
+        if ( rc == 0 )
+            rc = Std_Dlg_Loop ( dlg, &selected_id, selected );
+
+        if ( rc == 0 && ( selected_id == 101 || selected_id == 100 ) )
+        {
+            const char * s = KTUIDlgGetWidgetText( dlg, 100 );
+            if ( s != NULL )
+                string_copy ( buffer, buflen, s, string_size ( s ) );
+        }
+        else
+        {
+            if ( selected != NULL )
+                *selected = false;
+        }
+
+        KTUIDlgRelease ( dlg );
+        KTUIPaletteRelease ( pal );
+    }
+    return rc;
+}
+
+
+/* ****************************************************************************************** */
+
+LIB_EXPORT rc_t CC TUI_PickFromList( struct KTUI * tui, struct KTUIDlg * parent, const char * caption,
+        const VNamelist * list, uint32_t * selection, tui_rect * r, bool * selected,
+        KTUI_color bg1, KTUI_color bg2 )
+{
+    struct KTUIPalette * pal;
+    struct KTUIDlg * dlg;
+    rc_t rc = make_dlg_with_bg( &dlg, &pal, tui, parent, r, bg1, bg2 );
+    if ( selected != NULL ) *selected = false;
+    if ( rc == 0 )
+    {
+        uint32_t y = 1;
+        uint32_t w = r->w - 2;
+
+        if ( caption != NULL )
+        {
+            rc = KTUIDlgSetCaption ( dlg, caption );
+            y++;
+        }
+
+        if ( rc == 0 )
+        {
+            tui_rect r1;
+            set_rect( &r1, 1, y, w, r->h - 3 );
+            rc = KTUIDlgAddRadioBox ( dlg, 100, &r1 );
+            if ( rc == 0 )
+            {
+                uint32_t count, idx;
+                rc = VNameListCount ( list, &count );
+                for ( idx = 0; rc == 0 && idx < count; ++idx )
+                {
+                    const char * s;
+                    rc = VNameListGet ( list, idx, &s );
+                    if ( rc == 0 && s != NULL )
+                        rc = KTUIDlgAddWidgetString ( dlg, 100, s );
+                }
+                if ( rc == 0 && selection != NULL )
+                    rc = KTUIDlgSetWidgetSelectedString ( dlg, 100, *selection );
+            }
+        }
+
+        if ( rc == 0 )
+            rc = Std_Dlg_Loop ( dlg, NULL, selected );
+
+        if ( rc == 0 && *selected && selection != NULL )
+            *selection = KTUIDlgGetWidgetSelectedString( dlg, 100 );
+
+        KTUIDlgRelease ( dlg );
+        KTUIPaletteRelease ( pal );
+    }
+    return rc;
+}
diff --git a/libs/tui/tui_widget.c b/libs/tui/tui_widget.c
new file mode 100644
index 0000000..c55d139
--- /dev/null
+++ b/libs/tui/tui_widget.c
@@ -0,0 +1,1079 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include "tui_widget.h"
+#include "string_cache.h"
+
+#include <sysalloc.h>
+#include <math.h>
+
+rc_t DlgPaint( struct KTUI * tui, int x, int y, int w, int h, KTUI_color c )
+{
+    tui_rect r;
+    tui_ac ac;
+
+    r.top_left.x = x;
+    r.top_left.y = y;
+    r.w = w;
+    r.h = h;
+    set_ac( &ac, KTUI_a_none, c, c );
+
+    return KTUIRect ( tui, &r, &ac, ' ' );
+}
+
+
+rc_t DlgWrite( struct KTUI * tui, int x, int y, const tui_ac * ac, const char * s, uint32_t l )
+{
+    tui_point p;
+
+    p.x = x;
+    p.y = y;
+
+    return KTUIPrint( tui, &p, ac, s, l );
+}
+
+
+static rc_t hl( struct KTUI * tui, uint32_t x, uint32_t y, const tui_ac * ac, const char * c )
+{
+    tui_ac inv;
+    inverse_ac( &inv, ac );
+    return DlgWrite( tui, x, y, &inv, c, 1 );
+}
+
+
+static rc_t draw_hl_label( struct KTUI * tui, uint32_t x, uint32_t y, uint32_t w, tui_ac * ac, size_t offset, const char * caption )
+{
+    rc_t rc = 0;
+    if ( offset == 0 )
+    {
+        rc = DlgWrite( tui, x, y, ac, caption + 1, w );
+        if ( rc == 0 )
+            rc = hl( tui, x, y, ac, caption + 1 );
+    }
+    else if ( offset < w )
+    {
+        rc = DlgWrite( tui, x, y, ac, caption, offset );
+        if ( rc == 0 )
+        {
+            rc = DlgWrite( tui, x + offset, y, ac, caption + offset + 1, w - offset );
+            if ( rc == 0 )
+                rc = hl( tui, x + offset, y, ac, caption + offset + 1 );
+        }
+    }
+    else
+        rc = DlgWrite( tui, x, y, ac, caption, w );
+    return rc;
+}
+
+
+rc_t draw_highlighted( struct KTUI * tui, uint32_t x, uint32_t y, uint32_t w, tui_ac * ac, const char * caption )
+{
+    rc_t rc = 0;
+    size_t s_cap;
+    uint32_t l_cap = string_measure( caption, &s_cap );
+    if ( l_cap > 0 )
+    {
+        char * ampersand = string_chr ( caption, s_cap, '&' );
+        if ( ampersand != NULL )
+            rc = draw_hl_label( tui, x, y, w, ac, ( ampersand - caption ), caption );
+        else
+            rc = DlgWrite( tui, x, y, ac, caption, w );
+    }
+    return rc;
+}
+
+
+rc_t DrawVScroll( struct KTUI * tui, tui_rect * r, uint64_t count, uint64_t value,
+                  KTUI_color c_bar, KTUI_color c_sel )
+{
+    uint32_t x = r->top_left.x + r->w - 1;
+    rc_t rc = DlgPaint( tui, x, r->top_left.y, 1, r->h, c_bar );
+    if ( rc == 0 && count > 0 )
+    {
+        uint64_t v = ( r->h * value ) / count;
+        uint32_t y = r->top_left.y + (uint32_t)v;
+        rc = DlgPaint( tui, x, y, 1, 1, c_sel );
+    }
+    return rc;
+}
+
+
+rc_t DrawHScroll( struct KTUI * tui, tui_rect * r, uint64_t count, uint64_t value,
+                  KTUI_color c_bar, KTUI_color c_sel )
+{
+    uint32_t x = r->top_left.x + 1;
+    uint32_t y = r->top_left.y + r->h - 1;
+    uint32_t w = r->w - 3;
+    rc_t rc = DlgPaint( tui, x, y, w, 1, c_bar );
+    if ( rc == 0 && count > 0 )
+    {
+        uint64_t v = ( w * value ) / count;
+        rc = DlgPaint( tui, x + (uint32_t)v, y, 1, 1, c_sel );
+    }
+    return rc;
+}
+
+
+rc_t draw_background( struct KTUI * tui, bool focused, tui_point * p,
+                      int w, int h, KTUI_color bg )
+{
+    rc_t rc;
+    if ( focused )
+    {
+        rc = DlgPaint( tui, p->x, p->y, 1, h, KTUI_c_red );
+        if ( rc == 0 )
+            rc = DlgPaint( tui, p->x + 1, p->y, w - 1, h, bg );
+    }
+    else
+        rc = DlgPaint( tui, p->x, p->y, w, h, bg );
+    return rc;
+}
+
+
+/* ****************************************************************************************** */
+
+
+static void init_widget( KTUIWidget * w, uint32_t id, KTUI_Widget_type wtype, const tui_rect * r )
+{
+    copy_rect( &w->r, r );
+
+    w->caption = NULL;
+    w->can_focus = true;
+    w->visible = true;
+    w->focused = false;
+    w->id = id;
+    w->wtype = wtype;
+    w->ints[ 0 ] = 0;   /* widget_string_list.DL_V_OFFSET */
+    w->ints[ 1 ] = 0;   /* widget_string_list.DL_H_OFFSET */
+    w->ints[ 2 ] = 0;
+    w->ints[ 3 ] = 0;
+    w->changed = false;
+    w->bool_value = false;
+    w->bg_override_flag = false;
+    w->fg_override_flag = false;
+
+    w->txt = NULL;
+    w->txt_length = 0;
+    w->strings = NULL;
+    w->selected_string = 0;
+}
+
+
+rc_t TUI_MakeWidget ( KTUIWidget ** self, struct KTUIDlg * dlg, uint32_t id, KTUI_Widget_type wtype,
+                      const tui_rect * r, draw_cb on_draw, event_cb on_event )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcCreating, rcSelf, rcNull );
+    else
+    {
+        *self = NULL;
+        if ( dlg == NULL )
+            rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcNull );
+        else
+        {
+            struct KTUIPalette * pal = KTUIDlgGetPalette ( dlg );
+            if ( pal == NULL )
+                rc = RC( rcApp, rcAttr, rcCreating, rcParam, rcInvalid );
+            else
+            {
+                rc = KTUIPaletteAddRef ( pal );
+                if ( rc == 0 )
+                {
+                    KTUIWidget * w = malloc( sizeof * w );
+                    if ( w == NULL )
+                        rc = RC( rcApp, rcAttr, rcCreating, rcMemory, rcExhausted );
+                    else
+                    {
+                        w->dlg = dlg;
+                        w->tui = KTUIDlgGetTui ( dlg );
+                        w->palette = pal;
+
+                        init_widget( w, id, wtype, r );
+                        w->on_draw = on_draw;
+                        w->on_event = on_event;
+
+                        ( * self ) = w;
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+void TUI_DestroyWidget( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+    {
+        if ( self->caption != NULL )
+            free( ( void * ) self->caption );
+        if ( self->txt != NULL )
+            free( ( void * ) self->txt );
+        if ( self->strings != NULL )
+            VNamelistRelease ( self->strings );
+
+        KTUIPaletteRelease ( self->palette );
+
+        free( ( void * ) self );
+    }
+}
+
+
+const tui_ac * GetWidgetPaletteEntry ( struct KTUIWidget * self, KTUIPa_entry what )
+{
+    return KTUIPaletteGet ( self->palette, what );
+}
+
+
+struct KTUIPalette * CopyWidgetPalette( struct KTUIWidget * self )
+{
+    struct KTUIPalette * res = NULL;
+    if ( self != NULL )
+    {
+        rc_t rc = KTUIPaletteMake ( &res );
+        if ( rc == 0 )
+        {
+            rc = KTUIPaletteCopy ( res, self->palette );
+            if ( rc == 0 )
+            {
+                KTUIPaletteRelease ( self->palette );
+                self->palette = res;
+            }
+        }
+    }
+    return res;
+}
+
+
+rc_t ReleaseWidgetPalette( struct KTUIWidget * self )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        KTUIPaletteRelease ( self->palette );
+        self->palette = KTUIDlgGetPalette ( self->dlg );
+        KTUIPaletteAddRef ( self->palette );
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcSelf, rcNull );
+    return rc;
+}
+
+
+rc_t GetWidgetAc( struct KTUIWidget * self, KTUIPa_entry pa_entry, tui_ac * ac )
+{
+    rc_t rc = 0;
+    if ( self != NULL && ac != NULL )
+    {
+        copy_ac( ac, GetWidgetPaletteEntry ( self, pa_entry ) );
+        if ( self->bg_override_flag )
+            ac->bg = self->bg_override;
+        if ( self->fg_override_flag )
+            ac->fg = self->fg_override;
+
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcSelf, rcNull );
+    return rc;
+   
+}
+
+
+rc_t RedrawWidget( KTUIWidget * w )
+{
+    rc_t rc = 0;
+    if ( w->on_draw != NULL )
+    {
+        w->on_draw( w );
+
+        /* flush it out... */
+        rc = KTUIFlush ( w->tui, false );
+    }
+    return rc;
+}
+
+
+rc_t RedrawWidgetAndPushEvent( KTUIWidget * w,
+           KTUIDlg_event_type ev_type, uint64_t value_1, uint64_t value_2, void * ptr_0 )
+{
+    rc_t rc = RedrawWidget( w );
+    if ( rc == 0 )
+        KTUIDlgPushEvent( w->dlg, ev_type, w->id, value_1, value_2, ptr_0 );
+    return rc;
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+rc_t GetWidgetRect ( struct KTUIWidget * self, tui_rect * r )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcSelecting, rcSelf, rcNull );
+    else if ( r == NULL )
+        rc = RC( rcApp, rcAttr, rcSelecting, rcParam, rcNull );
+    else
+        copy_rect( r, &self->r );
+    return rc;
+}
+
+
+rc_t SetWidgetRect ( struct KTUIWidget * self, const tui_rect * r, bool redraw )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC( rcApp, rcAttr, rcUpdating, rcSelf, rcNull );
+    else if ( r == NULL )
+        rc = RC( rcApp, rcAttr, rcUpdating, rcParam, rcNull );
+    else
+    {
+        if ( redraw )
+        {
+            struct KTUIPalette * dlg_palette = KTUIDlgGetPalette ( self->dlg );
+            const tui_ac * dlg_ac = KTUIPaletteGet ( dlg_palette, ktuipa_dlg );
+            rc = DlgPaint( self->tui, self->r.top_left.x, self->r.top_left.y,
+                            self->r.w, self->r.h, dlg_ac->bg );
+        }
+        if ( rc == 0 )
+        {
+            copy_rect( &self->r, r );
+            if ( redraw )
+                rc = RedrawWidget( self );
+        }
+    }
+    return rc;
+}
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+const char * GetWidgetCaption ( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+        return self->caption;
+    else
+        return NULL;
+}
+
+
+rc_t SetWidgetCaption ( struct KTUIWidget * self, const char * caption )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( self->caption != NULL )
+            free( ( void * ) self->caption );
+            
+        if ( caption != NULL )
+            self->caption = string_dup_measure ( caption, NULL );
+        else
+            self->caption = NULL;
+
+        rc = RedrawWidget( self );
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcSelf, rcNull );
+    return rc;
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+
+rc_t SetWidgetCanFocus( struct KTUIWidget * self, bool can_focus )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+        self->can_focus = can_focus;   
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcSelf, rcNull );
+    return rc;
+
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+bool GetWidgetVisible ( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+        return self->visible;
+    else
+        return false;
+}
+
+
+rc_t SetWidgetVisible ( struct KTUIWidget * self, bool visible, bool * redraw )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        *redraw = ( self->visible != visible );
+        self->visible = visible;
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcSelf, rcNull );
+    return rc;
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+bool GetWidgetChanged ( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+        return self->changed;
+    else
+        return false;
+}
+
+
+rc_t SetWidgetChanged ( struct KTUIWidget * self, bool changed )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        self->changed = changed;
+        if ( changed )
+            KTUIDlgSetChanged ( self->dlg );
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcSelf, rcNull );
+    return rc;
+}
+
+
+/* called if the value of a widged has changed */
+static rc_t Widget_Value_Changed( struct KTUIWidget * self )
+{
+    self->changed = true;
+    return RedrawWidget( self );
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+rc_t SetWidgetBg ( struct KTUIWidget * self, KTUI_color value )
+{
+    rc_t rc;
+    if ( self != NULL )
+    {
+        self->bg_override = value;
+        self->bg_override_flag = true;
+        rc = RedrawWidget( self );
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+rc_t ReleaseWidgetBg ( struct KTUIWidget * self )
+{
+    rc_t rc;
+    if ( self != NULL )
+    {
+        self->bg_override_flag = false;
+        rc = RedrawWidget( self );
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+rc_t SetWidgetFg ( struct KTUIWidget * self, KTUI_color value )
+{
+    rc_t rc;
+    if ( self != NULL )
+    {
+        self->fg_override = value;
+        self->fg_override_flag = true;
+        rc = RedrawWidget( self );
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+rc_t ReleaseWidgetFg ( struct KTUIWidget * self )
+{
+    rc_t rc;
+    if ( self != NULL )
+    {
+        self->fg_override_flag = false;
+        rc = RedrawWidget( self );
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+bool GetWidgetBoolValue ( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+        return self->bool_value;
+    else
+        return false;
+}
+
+
+rc_t SetWidgetBoolValue ( struct KTUIWidget * self, bool value )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( self->bool_value != value )
+        {
+            self->bool_value = value;
+            rc = Widget_Value_Changed( self );
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+int64_t GetWidgetInt64Value ( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+        return self->int64_value;
+    else
+        return 0;
+}
+
+
+rc_t SetWidgetInt64Value ( struct KTUIWidget * self, int64_t value )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( self->int64_value != value )
+        {
+            int64_t prev = self->int64_value;
+            if ( value < self->int64_min )
+                self->int64_value = self->int64_min;
+            else if ( value > self->int64_max )
+                self->int64_value = self->int64_max;
+            else
+                self->int64_value = value;
+
+            if ( prev != self->int64_value )
+                rc = Widget_Value_Changed( self );
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+int64_t GetWidgetInt64Min ( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+        return self->int64_min;
+    else
+        return 0;
+}
+
+
+rc_t SetWidgetInt64Min ( struct KTUIWidget * self, int64_t value )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( self->int64_min != value )
+        {
+            self->int64_min = value;
+            if ( self->int64_value < value )
+                rc = SetWidgetInt64Value ( self, value );
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+int64_t GetWidgetInt64Max ( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+        return self->int64_max;
+    else
+        return 0;
+}
+
+
+rc_t SetWidgetInt64Max ( struct KTUIWidget * self, int64_t value )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( self->int64_max != value )
+        {
+            self->int64_max = value;
+            if ( self->int64_value > value )
+                rc = SetWidgetInt64Value ( self, value );
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+int32_t GetWidgetPercent ( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+        return self->percent;
+    else
+        return 0;
+}
+
+
+int32_t CalcWidgetPercent( int64_t value, int64_t max, uint32_t precision );
+
+rc_t SetWidgetPercent ( struct KTUIWidget * self, int32_t value )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( self->percent != value )
+        {
+            if ( value >= 0 && value <= CalcWidgetPercent( 100, 100, self->precision ) )
+            {
+                self->percent = value;
+                rc = Widget_Value_Changed( self );
+            }
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+int32_t GetWidgetPrecision ( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+        return self->precision;
+    else
+        return 0;
+}
+
+
+rc_t SetWidgetPrecision ( struct KTUIWidget * self, int32_t value )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( self->precision != value )
+        {
+            if ( value >= 0 && value < 5 )
+            {
+                self->precision = value;
+                rc = RedrawWidget( self );
+            }
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+/*
+    
+    result      %           precision
+    50          50%         0
+    515         51.5%       1
+    5274        52.74%      2
+    53112       53.112%     3
+    540072      54.0072%    4   ( max. precision )
+*/
+
+int32_t CalcWidgetPercent( int64_t value, int64_t max, uint32_t precision )
+{
+    int32_t res = 0;
+    if ( precision > 4 ) precision = 4;
+    if ( max > 0 && value > 0 && value <= max )
+    {
+        double x = (uint32_t)value;
+        switch( precision )
+        {
+            case 0 : x *= 100.0; break;
+            case 1 : x *= 1000.0; break;
+            case 2 : x *= 10000.0; break;
+            case 3 : x *= 100000.0; break;
+            case 4 : x *= 1000000.0; break;
+            default: x *= 100.0; break;
+        }
+        x /= max;
+        res = ( int32_t )floor( x );
+    }
+    return res;
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+const char * GetWidgetText ( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+        return self->txt;
+    else
+        return 0;
+}
+
+
+rc_t SetWidgetText ( struct KTUIWidget * self, const char * txt )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( self->txt != NULL )
+        {
+            if ( txt != NULL )
+            {
+                size_t l = string_size ( txt );
+                if ( l >= self->txt_length )
+                    rc = SetWidgetTextLength ( self, l + 1 );
+                if ( rc == 0 )
+                    string_copy ( self->txt, self->txt_length, txt, l );
+            }
+            else
+                self->txt[ 0 ] = 0;
+            if ( rc == 0 )
+                rc = Widget_Value_Changed( self );
+        }
+        else
+        {
+            if ( txt != NULL )
+            {
+                size_t l = string_size ( txt );
+                rc = SetWidgetTextLength ( self, l + 1 );
+                if ( rc == 0 )
+                    rc = string_copy ( self->txt, self->txt_length, txt, l );
+                if ( rc == 0 )
+                    rc = Widget_Value_Changed( self );
+            }
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+size_t GetWidgetTextLength ( struct KTUIWidget * self )
+{
+    if ( self != NULL )
+        return self->txt_length;
+    else
+        return 0;
+}
+
+
+rc_t SetWidgetTextLength ( struct KTUIWidget * self, size_t new_length )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( self->txt != NULL )
+        {
+            if ( self->txt_length != new_length )
+            {
+                char * tmp = malloc( new_length );
+                if ( tmp != NULL )
+                {
+                    string_copy ( tmp, new_length, self->txt, string_size ( self->txt ) );
+                    free( ( void * )self->txt );
+                    self->txt = tmp;
+                    if ( new_length < self->txt_length )
+                    {
+                        self->txt_length = new_length;
+                        rc = Widget_Value_Changed( self );
+                    }
+                    else
+                        self->txt_length = new_length;
+                }
+                else
+                    rc = RC( rcApp, rcAttr, rcUpdating, rcMemory, rcExhausted );
+            }
+        }
+        else
+        {
+            self->txt = malloc( new_length );
+            if ( self->txt != NULL )
+            {
+                self->txt_length = new_length;
+                self->txt[ 0 ] = 0;
+            }
+            else
+            {
+                self->txt_length = 0;
+                rc = RC( rcApp, rcAttr, rcUpdating, rcMemory, rcExhausted );
+            }
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+rc_t AddWidgetString ( struct KTUIWidget * self, const char * txt )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( self->strings == NULL )
+            rc = VNamelistMake ( &self->strings, 32 );
+        if ( rc == 0 )
+        {
+            rc = VNamelistAppend ( self->strings, txt );
+            if ( rc == 0 )
+                rc = Widget_Value_Changed( self );
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+rc_t AddWidgetStrings ( struct KTUIWidget * self, VNamelist * src )
+{
+    rc_t rc = 0;
+    if ( self != NULL && src != NULL )
+    {
+        if ( self->strings == NULL )
+            rc = VNamelistMake ( &self->strings, 32 );
+        if ( rc == 0 )
+        {
+            uint32_t count, idx;
+            rc = VNameListCount ( src, &count );
+            for ( idx = 0; rc == 0 && idx < count; ++idx )
+            {
+                const char * s;
+                rc = VNameListGet ( src, idx, &s );
+                if ( rc == 0 && s != NULL )
+                    rc = VNamelistAppend ( self->strings, s );
+            }
+            if ( rc == 0 && count > 0 )
+                rc = Widget_Value_Changed( self );
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+const char * GetWidgetStringByIdx ( struct KTUIWidget * self, uint32_t idx )
+{
+    const char * res = NULL;
+    if ( self != NULL && self->strings != NULL )
+        VNameListGet ( self->strings, idx, &res );
+    return res;
+}
+
+
+rc_t RemoveWidgetStringByIdx ( struct KTUIWidget * self, uint32_t idx )
+{
+    rc_t rc;
+    if ( self != NULL )
+    {
+        if ( self->strings != NULL )
+        {
+            rc = VNamelistRemoveIdx( self->strings, idx );
+            if ( rc == 0 )
+            {
+                uint32_t count;
+                rc = VNameListCount ( self->strings, &count );
+                if ( rc == 0 )
+                {
+                    if ( count > 0 )
+                    {
+                        if ( self->selected_string >= count )
+                            self->selected_string = count - 1;
+                    }
+                    else
+                        self->selected_string = 0;
+                    rc = Widget_Value_Changed( self );
+                }
+            }
+        }
+        else
+            rc = RC( rcApp, rcAttr, rcUpdating, rcItem, rcInvalid );
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+rc_t RemoveAllWidgetStrings ( struct KTUIWidget * self )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( self->strings != NULL )
+        {
+            rc = VNamelistRemoveAll( self->strings );
+            if ( rc == 0 )
+            {
+                self->selected_string = 0;
+                self->ints[ 0 ] = 0;   /* widget_string_list.DL_V_OFFSET */
+                self->ints[ 1 ] = 0;   /* widget_string_list.DL_H_OFFSET */
+                rc = Widget_Value_Changed( self );
+            }
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+
+}
+
+
+uint32_t GetWidgetStringCount ( struct KTUIWidget * self )
+{
+    uint32_t res = 0;
+    if ( self != NULL && self->strings != NULL )
+        VNameListCount ( self->strings, &res );
+    return res;
+}
+
+
+uint32_t HasWidgetString( struct KTUIWidget * self, const char * txt )
+{
+    uint32_t res = 0xFFFFFFFF;
+    if ( self != NULL && self->strings != NULL )
+        VNamelistIndexOf( self->strings, txt, &res );
+    return res;
+}
+
+
+uint32_t GetWidgetSelectedString( struct KTUIWidget * self )
+{
+    uint32_t res = 0;
+    if ( self != NULL )
+        res = (uint32_t)self->selected_string;
+    return res;
+}
+
+
+rc_t SetWidgetSelectedString ( struct KTUIWidget * self, uint32_t selection )
+{
+    rc_t rc = 0;
+    if ( self != NULL && self->strings != NULL )
+    {
+        uint32_t count;
+        rc = VNameListCount ( self->strings, &count );
+        if ( rc == 0 )
+        {
+            uint32_t prev = (uint32_t)self->selected_string;
+            if ( count > 0 )
+            {
+                if ( selection >= count )
+                    self->selected_string = count - 1;
+                else
+                    self->selected_string = selection;
+                /* here we have to adjust self->ints[ 0 ] ... the vertical offset ! */
+            }
+            else
+                self->selected_string = 0; 
+            if ( prev != self->selected_string )
+                rc = Widget_Value_Changed( self );
+        }
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
+
+
+/* ---------------------------------------------------------------------------------------------- */
+
+
+TUIWGrid_data * GetWidgetGridData( struct KTUIWidget * self )
+{
+    TUIWGrid_data * res = NULL;
+    if ( self != NULL )
+        res = self->grid_data;
+    return res;
+}
+
+
+rc_t SetWidgetGridData( struct KTUIWidget * self, TUIWGrid_data * grid_data, bool cached )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        if ( grid_data != NULL )
+        {
+            grid_data->int_string_cache = make_string_cache( 200, 128 );
+            grid_data->row_offset_changed = true;
+        }
+        self->grid_data = grid_data;
+    }
+    else
+        rc = RC( rcApp, rcAttr, rcUpdating, rcId, rcInvalid );
+    return rc;
+}
diff --git a/libs/tui/tui_widget.h b/libs/tui/tui_widget.h
new file mode 100644
index 0000000..8aded74
--- /dev/null
+++ b/libs/tui/tui_widget.h
@@ -0,0 +1,210 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_tui_widget_
+#define _h_tui_widget_
+
+#include <tui/tui.h>
+#include <tui/tui_dlg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_GRID_COLS 256
+#define MAX_GRID_ROWS 128
+
+rc_t draw_highlighted( struct KTUI * tui, uint32_t x, uint32_t y, uint32_t w, tui_ac * ac, const char * caption );
+
+rc_t DlgPaint( struct KTUI * tui, int x, int y, int w, int h, KTUI_color c );
+rc_t DlgWrite( struct KTUI * tui, int x, int y, const tui_ac * ac, const char * s, uint32_t l );
+
+rc_t DrawVScroll( struct KTUI * tui, tui_rect * r, uint64_t count, uint64_t value,
+                  KTUI_color c_bar, KTUI_color c_sel );
+rc_t DrawHScroll( struct KTUI * tui, tui_rect * r, uint64_t count, uint64_t value,
+                  KTUI_color c_bar, KTUI_color c_sel );
+
+rc_t draw_background( struct KTUI * tui, bool focused, tui_point * p,
+                      int w, int h, KTUI_color bg );
+
+
+/* ****************************************************************************************** */
+
+typedef uint32_t KTUI_Widget_type;
+enum
+{
+    KTUIW_label = 0,
+    KTUIW_button,
+    KTUIW_checkbox,
+    KTUIW_input,
+    KTUIW_radiobox,
+    KTUIW_list,
+    KTUIW_progress,
+    KTUIW_spinedit,
+    KTUIW_grid
+};
+
+
+struct KTUIWidget;
+struct KTUIDlg;
+
+typedef void ( * draw_cb ) ( struct KTUIWidget * w );
+typedef void ( * init_cb ) ( struct KTUIWidget * w );
+typedef bool ( * event_cb ) ( struct KTUIWidget * w, tui_event * event );
+
+typedef struct KTUIWidget
+{
+    struct KTUIDlg * dlg;   /* pointer to dialog they belong to */
+    struct KTUI * tui;      /* pointer to the hw-specific layer */
+    struct KTUIPalette * palette;   /* where the colors come from */
+    uint32_t id;            /* a unique id... */
+    KTUI_Widget_type wtype; /* what type of widget it is... */
+    uint32_t vector_idx;    /* where in the vector it is inserted */
+    tui_rect r;             /*  - a rect where it appears */
+
+    KTUI_color bg_override; /* the color if the background is different from palette */
+    bool bg_override_flag;
+
+    KTUI_color fg_override; /* the color if the forground is different from palette */
+    bool fg_override_flag;
+
+    char * caption;         /*  - a caption */
+
+    draw_cb on_draw;        /* know how to draw itself */
+    event_cb on_event;      /* know how to handle events */
+    uint64_t ints[ 8 ];     /* 8 internal 'state' integers */
+
+    bool can_focus;         /* can it be focused */
+    bool focused;           /* does it have focus... */
+    bool visible;           /* is it visible */
+    bool changed;           /* has the widget changed */
+
+    /* different value types, according to the widget type one is used: */
+
+    /* in case of a checkbox */
+    bool bool_value;
+
+    /* in case of a spin-edit */
+    int64_t int64_value;
+    int64_t int64_min;
+    int64_t int64_max;
+
+    /* in case of a percent-bar */
+    int32_t percent;
+    int32_t precision;
+
+    /* for the input-string */
+    char * txt;
+    size_t txt_length;
+
+    /* for Radio-Box / ListBox */
+    VNamelist * strings;
+    uint64_t selected_string;
+
+    /* for Grid */
+    TUIWGrid_data * grid_data;
+
+} KTUIWidget;
+
+
+rc_t TUI_MakeWidget ( KTUIWidget ** self, struct KTUIDlg * dlg, uint32_t id, KTUI_Widget_type wtype,
+                      const tui_rect * r, draw_cb on_draw, event_cb on_event );
+
+void TUI_DestroyWidget( struct KTUIWidget * self );
+
+const tui_ac * GetWidgetPaletteEntry ( struct KTUIWidget * self, KTUIPa_entry what );
+struct KTUIPalette * CopyWidgetPalette( struct KTUIWidget * self );
+rc_t  ReleaseWidgetPalette( struct KTUIWidget * self );
+
+rc_t RedrawWidget( KTUIWidget * w );
+
+rc_t RedrawWidgetAndPushEvent( KTUIWidget * w,
+           KTUIDlg_event_type ev_type, uint64_t value_1, uint64_t value_2, void * ptr_0 );
+
+rc_t GetWidgetRect ( struct KTUIWidget * self, tui_rect * r );
+rc_t SetWidgetRect ( struct KTUIWidget * self, const tui_rect * r, bool redraw );
+
+rc_t SetWidgetCanFocus( struct KTUIWidget * self, bool can_focus );
+rc_t GetWidgetAc( struct KTUIWidget * self, KTUIPa_entry pa_entry, tui_ac * ac );
+
+const char * GetWidgetCaption ( struct KTUIWidget * self );
+rc_t SetWidgetCaption ( struct KTUIWidget * self, const char * caption );
+
+bool GetWidgetVisible ( struct KTUIWidget * self );
+rc_t SetWidgetVisible ( struct KTUIWidget * self, bool visible, bool * redraw );
+
+bool GetWidgetChanged ( struct KTUIWidget * self );
+rc_t SetWidgetChanged ( struct KTUIWidget * self, bool changed );
+
+bool GetWidgetBoolValue ( struct KTUIWidget * self );
+rc_t SetWidgetBoolValue ( struct KTUIWidget * self, bool value );
+
+rc_t SetWidgetBg ( struct KTUIWidget * self, KTUI_color value );
+rc_t ReleaseWidgetBg ( struct KTUIWidget * self );
+
+rc_t SetWidgetFg ( struct KTUIWidget * self, KTUI_color value );
+rc_t ReleaseWidgetFg ( struct KTUIWidget * self );
+
+int64_t GetWidgetInt64Value ( struct KTUIWidget * self );
+rc_t SetWidgetInt64Value ( struct KTUIWidget * self, int64_t value );
+
+int64_t GetWidgetInt64Min ( struct KTUIWidget * self );
+rc_t SetWidgetInt64Min ( struct KTUIWidget * self, int64_t value );
+
+int64_t GetWidgetInt64Max ( struct KTUIWidget * self );
+rc_t SetWidgetInt64Max ( struct KTUIWidget * self, int64_t value );
+
+int32_t GetWidgetPercent ( struct KTUIWidget * self );
+rc_t SetWidgetPercent ( struct KTUIWidget * self, int32_t value );
+
+int32_t GetWidgetPrecision ( struct KTUIWidget * self );
+rc_t SetWidgetPrecision ( struct KTUIWidget * self, int32_t value );
+
+int32_t CalcWidgetPercent( int64_t value, int64_t max, uint32_t precision );
+
+const char * GetWidgetText ( struct KTUIWidget * self );
+rc_t SetWidgetText ( struct KTUIWidget * self, const char * txt );
+
+size_t GetWidgetTextLength ( struct KTUIWidget * self );
+rc_t SetWidgetTextLength ( struct KTUIWidget * self, size_t new_length );
+
+rc_t AddWidgetString ( struct KTUIWidget * self, const char * txt );
+rc_t AddWidgetStrings ( struct KTUIWidget * self, VNamelist * src );
+const char * GetWidgetStringByIdx ( struct KTUIWidget * self, uint32_t idx );
+rc_t RemoveWidgetStringByIdx ( struct KTUIWidget * self, uint32_t idx );
+rc_t RemoveAllWidgetStrings ( struct KTUIWidget * self );
+uint32_t GetWidgetStringCount ( struct KTUIWidget * self );
+uint32_t HasWidgetString( struct KTUIWidget * self, const char * txt );
+uint32_t GetWidgetSelectedString( struct KTUIWidget * self );
+rc_t SetWidgetSelectedString ( struct KTUIWidget * self, uint32_t selection );
+
+TUIWGrid_data * GetWidgetGridData( struct KTUIWidget * self );
+rc_t SetWidgetGridData( struct KTUIWidget * self, TUIWGrid_data * grid_data, bool cached );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_tui_widget_ */
diff --git a/libs/tui/tui_widget_button.c b/libs/tui/tui_widget_button.c
new file mode 100644
index 0000000..2bb08fd
--- /dev/null
+++ b/libs/tui/tui_widget_button.c
@@ -0,0 +1,87 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <tui/tui_dlg.h>
+#include "tui_widget.h"
+
+void draw_button( struct KTUIWidget * w )
+{
+    tui_rect r;
+    rc_t rc = KTUIDlgAbsoluteRect ( w->dlg, &r, &w->r );
+    if ( rc == 0 )
+    {
+        tui_ac ac;
+        rc = GetWidgetAc( w, ktuipa_button, &ac );
+        if ( rc == 0 )
+        {
+            struct KTUI * tui = w->tui;
+            uint32_t ofs_y = r.h / 2;
+            uint32_t x = r.top_left.x;
+            uint32_t y = r.top_left.y + ofs_y;
+            uint32_t w1 = r.w;
+
+            rc = draw_background( tui, w->focused, &r.top_left, w1, r.h, ac.bg );
+
+            if ( rc == 0 && w->caption != NULL )
+            {
+                uint32_t x_txt = x + 2;
+                uint32_t w_txt = w1 - 4;
+                uint32_t l_cap = string_measure( w->caption, NULL );
+                if ( l_cap < w_txt )
+                {
+                    x_txt += ( ( w_txt - l_cap ) / 2 );
+                    w_txt = l_cap;
+                }
+                rc = draw_highlighted( tui, x_txt, y, w_txt, &ac, w->caption );
+            }
+
+            if ( rc == 0 )
+                rc = DlgWrite( tui, x + 1, y, &ac, "[", 1 );
+            if ( rc == 0 )
+                rc = DlgWrite( tui, x + w1 - 2, y, &ac, "]", 1 );
+        }
+    }
+}
+
+
+bool event_button( struct KTUIWidget * w, tui_event * event )
+{
+    bool res = false;
+    if ( event->event_type == ktui_event_kb )
+    {
+        switch( event->data.kb_data.code )
+        {
+            case ktui_enter : res = true; break;
+            case ktui_alpha : res = ( event->data.kb_data.key == ' ' ); break;
+        }
+    }
+
+    if ( res )
+        KTUIDlgPushEvent( w->dlg, ktuidlg_event_select, w->id, 0, 0, NULL );
+    return res;
+}
diff --git a/libs/tui/tui_widget_checkbox.c b/libs/tui/tui_widget_checkbox.c
new file mode 100644
index 0000000..779a7d4
--- /dev/null
+++ b/libs/tui/tui_widget_checkbox.c
@@ -0,0 +1,87 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <tui/tui_dlg.h>
+#include "tui_widget.h"
+
+void draw_checkbox( struct KTUIWidget * w )
+{
+    tui_rect r;
+    rc_t rc = KTUIDlgAbsoluteRect ( w->dlg, &r, &w->r );
+    if ( rc == 0 )
+    {
+        tui_ac ac;
+        rc = GetWidgetAc( w, ktuipa_checkbox, &ac );
+        if ( rc == 0 )
+        {
+            struct KTUI * tui = w->tui;
+            rc = draw_background( tui, w->focused, &r.top_left, r.w, r.h, ac.bg );
+            if ( rc == 0 && w->caption != NULL )
+            {
+                char txt[ 265 ];
+                size_t num_writ;
+
+                if ( w->bool_value )
+                    rc = string_printf ( txt, sizeof txt, &num_writ, "[X] %s", w->caption );
+                else
+                    rc = string_printf ( txt, sizeof txt, &num_writ, "[ ] %s", w->caption );
+
+                if ( rc == 0 )
+                {
+                    uint32_t x = r.top_left.x + 1;
+                    uint32_t y = r.top_left.y;
+                    uint32_t w = r.w - 2;
+                    draw_highlighted( tui, x, y, w, &ac, txt );
+                }
+            }
+        }
+    }
+}
+
+
+bool event_checkbox( struct KTUIWidget * w, tui_event * event )
+{
+    bool res = false;
+    if ( event->event_type == ktui_event_kb )
+    {
+        switch( event->data.kb_data.code )
+        {
+            case ktui_enter : res = true; break;
+            case ktui_alpha : res = ( event->data.kb_data.key == ' ' ); break;
+        }
+    }
+
+    if ( res )
+    {
+        w->bool_value = !w->bool_value;
+        SetWidgetChanged ( w, true );
+        RedrawWidgetAndPushEvent( w, ktuidlg_event_select, w->bool_value ? 1 : 0, 0, NULL );
+    }
+    return res;
+}
diff --git a/libs/tui/tui_widget_grid.c b/libs/tui/tui_widget_grid.c
new file mode 100644
index 0000000..369fa58
--- /dev/null
+++ b/libs/tui/tui_widget_grid.c
@@ -0,0 +1,488 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <tui/tui_dlg.h>
+#include "tui_widget.h"
+#include "line_policy.h"
+#include "string_cache.h"
+
+typedef struct draw_ctx
+{
+    tui_rect r;
+    uint32_t y, vis_col, colcount;
+    uint64_t rowcount;
+    uint32_t col_width[ MAX_GRID_COLS ];
+} draw_ctx;
+
+
+static const char * grid_get_str( TUIWGrid_data * gd, TUIWGridStr what, uint64_t col, uint64_t row, uint32_t col_width )
+{
+    const char * res = NULL;
+    if ( gd->cb_str != NULL )
+    {
+        struct string_cache * sc = gd->int_string_cache;
+        if ( ( sc != NULL ) && ( what == kGrid_Cell ) )
+        {
+            res = get_cell_from_string_cache( sc, row, (int)col );
+            if ( res == NULL )
+            {
+                gd->cb_str( what, col, row, col_width, &res, gd->data, gd->instance );
+                put_cell_to_string_cache( sc, row, (int)col, res );
+            }
+        }
+        else
+        {
+            gd->cb_str( what, col, row, col_width, &res, gd->data, gd->instance );
+        }
+    }
+    return res;
+}
+
+
+static uint32_t get_grid_colwidth( struct KTUIWidget * w, TUIWGrid_data * gd, uint64_t col )
+{
+    uint32_t res = gd->default_col_width;
+    if ( gd->cb_int != NULL )
+    {
+        uint64_t value;
+        gd->cb_int( kGrid_Get_Width, col, w->r.w, &value, gd->data, gd->instance );
+        res = ( uint32_t )( value & 0xFFFFFFFF );
+    }
+    return res;
+}
+
+
+static uint32_t get_grid_colcount( struct KTUIWidget * w, TUIWGrid_data * gd )
+{
+    uint32_t res = 0;
+    if ( gd->cb_int != NULL )
+    {
+        uint64_t value;
+        gd->cb_int( kGrid_Get_ColCount, 0, w->r.w, &value, gd->data, gd->instance );
+        res = ( uint32_t )( value & 0xFFFFFFFF );
+    }
+    return res;
+}
+
+
+static uint64_t get_grid_rowcount( struct KTUIWidget * w, TUIWGrid_data * gd )
+{
+    uint64_t res = 0;
+    if ( gd->cb_int != NULL )
+        gd->cb_int( kGrid_Get_RowCount, 0, w->r.w, &res, gd->data, gd->instance );
+    return res;
+}
+
+
+static void set_grid_colwidth( struct KTUIWidget * w, TUIWGrid_data * gd, uint64_t col, uint32_t value )
+{
+    if ( gd->cb_int != NULL )
+    {
+        uint64_t cb_value = value;
+        gd->cb_int( kGrid_Set_Width, col, w->r.w, &cb_value, gd->data, gd->instance );
+    }
+}
+
+
+static void prepare_page( TUIWGrid_data * gd, uint64_t abs_row, uint32_t rows_per_page )
+{
+    if ( gd->cb_int != NULL && gd->row_offset_changed )
+    {
+        uint64_t cb_value;
+        gd->cb_int( kGrid_Prepare_Page, abs_row, rows_per_page, &cb_value, gd->data, gd->instance );
+    }
+}
+
+
+static void next_row( TUIWGrid_data * gd, uint64_t abs_row )
+{
+    if ( gd->cb_int != NULL && gd->row_offset_changed )
+    {
+        uint64_t cb_value;
+        gd->cb_int( kGrid_Next_Row, abs_row, 0, &cb_value, gd->data, gd->instance );
+    }
+}
+
+
+static rc_t draw_header_cell( struct KTUIWidget * w, TUIWGrid_data * gd, draw_ctx * dctx,
+                              uint32_t * x, uint64_t abs_col,  uint32_t left, uint32_t ww,
+                              const tui_ac * ac )
+{
+    rc_t rc = 0;
+    uint32_t width = dctx->col_width[ abs_col ];
+    if ( width > 0 )
+    {
+        const char * s;
+        if ( *x + width > ww ) width = ww - *x;     /* clip if cell reaches beyond the widget-width */
+        s = grid_get_str( gd, kGrid_Col, abs_col, 0, width );
+        if ( s != NULL )
+            rc = DlgWrite( w->tui, left + *x, dctx->y, ac, s, width - 1 );
+    }
+    *x += width;
+    return rc;
+}
+
+
+static rc_t draw_header( struct KTUIWidget * w, TUIWGrid_data * gd, draw_ctx * dctx )
+{
+    rc_t rc = 0;
+    uint64_t abs_col, cidx;
+    uint32_t left = dctx->r.top_left.x + gd->row_hdr_width;
+    uint32_t ww = dctx->r.w - gd->row_hdr_width;
+    uint32_t x = 0;
+    const tui_ac * ac_col_hdr = GetWidgetPaletteEntry ( w, ktuipa_grid_col_hdr );
+    const tui_ac * ac_cursor  = GetWidgetPaletteEntry ( w, ktuipa_grid_cursor );
+
+    for ( abs_col = gd->col_offset, cidx = 0;
+          x < ww && cidx < dctx->vis_col && abs_col < dctx->colcount && rc == 0;
+          ++abs_col, ++cidx )
+    {
+        if ( abs_col == gd->col )
+            rc = draw_header_cell( w, gd, dctx, &x, abs_col, left, ww, ac_cursor );
+        else
+            rc = draw_header_cell( w, gd, dctx, &x, abs_col, left, ww, ac_col_hdr );
+    }
+    dctx->y++;
+    return rc;
+}
+
+
+static rc_t draw_row( struct KTUIWidget * w, TUIWGrid_data * gd, draw_ctx * dctx, const tui_ac * ac, uint64_t row )
+{
+    rc_t rc = 0;
+    uint32_t left = dctx->r.top_left.x;
+    uint32_t x = 0;
+    const tui_ac * ac2;
+
+    if ( gd->show_row_header )
+    {
+        const char * s = grid_get_str( gd, kGrid_Row, 0, row, gd->row_hdr_width );
+        if ( s != NULL )
+        {
+            if ( row == gd->row )
+                ac2 = GetWidgetPaletteEntry ( w, ktuipa_grid_cursor );
+            else
+                ac2 = GetWidgetPaletteEntry ( w, ktuipa_grid_row_hdr );
+            if ( gd->row_hdr_width > 0 )
+                rc = DlgWrite( w->tui, left, dctx->y, ac2, s, gd->row_hdr_width - 1 );
+        }
+        x += gd->row_hdr_width;
+    }
+
+    if ( rc == 0 )
+    {
+        uint64_t col, cidx;
+        for ( col = gd->col_offset, cidx = 0;
+              x < dctx->r.w && cidx < dctx->vis_col && col < dctx->colcount && rc == 0;
+              ++col, ++cidx )
+        {
+            uint32_t width = dctx->col_width[ col ];
+            const char * s = grid_get_str( gd, kGrid_Cell, col, row, width );
+            /* uint32_t width = get_grid_colwidth( w, gd, col ); */
+            if ( s != NULL && width > 0 )
+            {
+                if ( row == gd->row && col == gd->col )
+                    ac2 = GetWidgetPaletteEntry ( w, ktuipa_grid_cursor );
+                else
+                    ac2 = ac;
+                if ( x + width > dctx->r.w ) width = dctx->r.w - x;
+                rc = DlgWrite( w->tui, left + x, dctx->y, ac2, s, width - 1 );
+            }
+            x += width;
+        }
+    }
+    return rc;
+}
+
+
+static uint32_t visible_cols_1( uint32_t width, TUIWGrid_data * gd, draw_ctx * dctx )
+{
+    uint32_t n = 0, ww = width;
+    uint64_t col = gd->col_offset;
+
+    if ( gd->show_row_header )
+        ww -= gd->row_hdr_width;
+
+    while( ww > 0 )
+    {
+        uint32_t cw = dctx->col_width[ col++ ];
+        ww = ( ww >= cw ) ? ww - cw : 0;
+        n++;
+    }
+    return n;
+}
+
+
+static uint32_t visible_cols_2( uint32_t width, TUIWGrid_data * gd, struct KTUIWidget * w )
+{
+    uint32_t n = 0, ww = width;
+    uint64_t col = gd->col_offset;
+
+    if ( gd->show_row_header )
+        ww -= gd->row_hdr_width;
+
+    while( ww > 0 )
+    {
+        uint32_t cw = get_grid_colwidth( w, gd, col++ );
+        ww = ( ww >= cw ) ? ww - cw : 0;
+        n++;
+    }
+    return n;
+}
+
+
+void enter_col_widths( struct KTUIWidget * w, TUIWGrid_data * gd, draw_ctx * dctx )
+{
+    uint32_t i;
+
+    dctx->colcount = get_grid_colcount( w, gd );
+    dctx->rowcount = get_grid_rowcount( w, gd );
+
+    for( i = 0; i < dctx->colcount; ++ i )
+        dctx->col_width[ i ] = get_grid_colwidth( w, gd, i );
+
+    dctx->vis_col = visible_cols_1( dctx->r.w, gd, dctx );
+}
+
+
+void draw_grid( struct KTUIWidget * w )
+{
+    draw_ctx dctx;
+    rc_t rc = KTUIDlgAbsoluteRect ( w->dlg, &dctx.r, &w->r );
+    if ( rc == 0 )
+    {
+        tui_ac ac;
+        rc = GetWidgetAc( w, ktuipa_grid, &ac );
+        if ( rc == 0 )
+            rc = draw_background( w->tui, w->focused, &dctx.r.top_left, dctx.r.w, dctx.r.h, ac.bg );
+        if ( rc == 0 )
+        {
+            TUIWGrid_data * gd = w->grid_data;
+            dctx.y = dctx.r.top_left.y;
+
+
+            enter_col_widths( w, gd, &dctx );
+
+            /* render the fixed row-line */
+            if ( gd->show_header )
+                rc = draw_header( w, gd, &dctx );
+
+
+            /* render the fixed cells and row-header */
+            if ( rc == 0 )
+            {
+                uint64_t row, ridx = ( gd->show_header ) ? 1 : 0;
+                uint64_t nrow = w->r.h;
+                if ( gd->show_h_scroll && dctx.colcount > dctx.vis_col ) nrow--;
+                prepare_page( gd, gd->row_offset, (uint32_t)nrow );   /* give the client a hint what comes... */
+                for ( row = gd->row_offset;
+                       ridx < nrow && row < dctx.rowcount && rc == 0;
+                       ++row, ++ridx, dctx.y++ )
+                {
+                    rc = draw_row( w, gd, &dctx, &ac, row );
+                    next_row( gd, row );    /* give the client the opportunity to advance an iterator... */
+                }
+            }
+
+            /* render the scrollbars */
+            if ( rc == 0 && gd->show_v_scroll && dctx.rowcount > dctx.r.h )
+                rc = DrawVScroll( w->tui, &dctx.r, dctx.rowcount, gd->row, KTUI_c_gray, ac.fg );
+
+            if ( rc == 0 && gd->show_h_scroll && dctx.colcount > dctx.vis_col )
+                rc = DrawHScroll( w->tui, &dctx.r, dctx.colcount, gd->col, KTUI_c_gray, ac.fg );
+
+        }
+    }
+}
+
+
+static uint32_t convert_x_to_abs_col( struct KTUIWidget * w, TUIWGrid_data * gd, uint32_t x )
+{
+    uint32_t i = 0, res = 0, start = 0;
+    bool done = false;
+    draw_ctx dctx;
+
+    enter_col_widths( w, gd, &dctx );
+    if ( gd->show_header )
+        start += gd->row_hdr_width;
+
+    do
+    {
+        uint32_t ww = dctx.col_width[ i ];
+        if ( x >= start && x < ( start + ww ) )
+        {
+            res = i;
+            done = true;
+        }
+        else
+        {
+            if ( i > dctx.vis_col )
+                done = true;
+            else
+            {
+                start += ww;
+                i++;
+            }
+        }
+    } while ( !done );
+
+    res += ( uint32_t )gd->col_offset;
+    return res;
+}
+
+
+typedef struct grid_cb_ctx
+{
+    struct KTUIDlg * dlg;
+    struct KTUIWidget * w;
+    TUIWGrid_data * gd;
+} grid_cb_ctx;
+
+
+static uint32_t CC grid_get_width ( uint64_t col, void * data )
+{
+    grid_cb_ctx * cb_ctx = data;
+    return get_grid_colwidth( cb_ctx->w, cb_ctx->gd, col );
+}
+
+
+static void CC grid_set_width ( uint64_t col, uint32_t value, void * data )
+{
+    grid_cb_ctx * cb_ctx = data;
+    set_grid_colwidth( cb_ctx->w, cb_ctx->gd, col, value );
+}
+
+
+static bool prepare_grid_context( struct KTUIWidget * w, grid_cb_ctx * cb_ctx, grid_context * gc )
+{
+    bool res = false;
+    TUIWGrid_data * gd = w->grid_data;
+
+    if ( gd != NULL )
+    {
+        cb_ctx->dlg = w->dlg;
+        cb_ctx->w = w;
+        cb_ctx->gd = gd;
+
+        gc->data = cb_ctx;
+        gc->on_get_width = grid_get_width;
+        gc->on_set_width = grid_set_width;
+
+        gc->col.count = get_grid_colcount( w, gd );
+        gc->col.offset = &gd->col_offset;
+        gc->col.curr = &gd->col;
+        gc->col.visible = visible_cols_2( w->r.w, gd, w );
+        if ( gd->show_row_header ) gc->col.visible--;
+
+        gc->row.count = get_grid_rowcount( w, gd );
+        gc->row.offset = &gd->row_offset;
+        gc->row.curr = &gd->row;
+        gc->row.visible = gd->show_header ? w->r.h -1 : w->r.h;
+        if ( gd->show_h_scroll && gc->col.count > gc->col.visible ) gc->row.visible--;
+        res = true;
+    }
+    return res;
+}
+
+
+bool event_grid( struct KTUIWidget * w, tui_event * event )
+{
+    bool changed = false;
+    TUIWGrid_data * gd = w->grid_data;
+    if ( gd != NULL )
+    {
+        gd->row_offset_changed = false;
+        if ( event->event_type == ktui_event_mouse )
+        {
+            gd->row = ( gd->row_offset + event->data.mouse_data.y ) - 1;
+            gd->col = convert_x_to_abs_col( w, gd, event->data.mouse_data.x );
+            changed = true;
+        }
+        else
+        {
+            grid_cb_ctx cb_ctx;
+            grid_context gc;
+            changed = prepare_grid_context( w, &cb_ctx, &gc );
+            if ( changed )
+            {
+                uint64_t offset_before = gd->row_offset;
+                changed = grid_handle_event( &gc, event ); /* in line_policy.c */
+                if ( changed )
+                    gd->row_offset_changed = ( offset_before != gd->row_offset );
+            }
+        }
+
+        if ( changed )
+            RedrawWidgetAndPushEvent( w, ktuidlg_event_changed, gd->col, gd->row, NULL );
+    }
+    return changed;
+}
+
+
+uint64_t get_grid_col( struct KTUIWidget * w )
+{
+    if ( w->grid_data != NULL )
+        return w->grid_data->col;
+    else
+        return 0;
+}
+
+
+bool set_grid_col( struct KTUIWidget * w, uint64_t col )
+{
+    grid_cb_ctx cb_ctx;
+    grid_context gc;
+    bool res = prepare_grid_context( w, &cb_ctx, &gc );
+    if ( res )
+        res = grid_handle_set_col( &gc, col ); /* in line_policy.c */
+    if ( res )
+        RedrawWidgetAndPushEvent( w, ktuidlg_event_changed, cb_ctx.gd->col, cb_ctx.gd->row, NULL );
+    return res;
+}
+
+
+uint64_t get_grid_row( struct KTUIWidget * w )
+{
+    if ( w->grid_data != NULL )
+        return w->grid_data->row;
+    else
+        return 0;
+}
+
+bool set_grid_row( struct KTUIWidget * w, uint64_t row )
+{
+    grid_cb_ctx cb_ctx;
+    grid_context gc;
+    bool res = prepare_grid_context( w, &cb_ctx, &gc );
+    if ( res )
+        res = grid_handle_set_row( &gc, row ); /* in line_policy.c */
+    if ( res )
+        RedrawWidgetAndPushEvent( w, ktuidlg_event_changed, cb_ctx.gd->col, cb_ctx.gd->row, NULL );
+    return res;
+}
diff --git a/libs/tui/tui_widget_inputline.c b/libs/tui/tui_widget_inputline.c
new file mode 100644
index 0000000..43f0a42
--- /dev/null
+++ b/libs/tui/tui_widget_inputline.c
@@ -0,0 +1,181 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <tui/tui_dlg.h>
+
+#include "tui_widget.h"
+#include "line_policy.h"
+
+#define  IL_CUR_POS 0
+#define  IL_OFFSET 1
+#define  IL_MODE 2
+
+
+void init_inputline( struct KTUIWidget * w )
+{
+    if ( w->txt != NULL )
+    {
+        w->ints[ IL_CUR_POS ] = string_measure ( w->txt, NULL ); /* cursor at the end of it... */
+        if ( w->ints[ IL_CUR_POS ] > ( w->r.w - 2 ) )
+            w->ints[ IL_OFFSET ] = ( w->ints[ IL_CUR_POS ] - ( w->r.w - 2 ) + 1 );
+        else
+            w->ints[ IL_OFFSET ] = 0;
+    }
+    w->ints[ IL_MODE ] = 0;
+}
+
+
+static rc_t draw_inputline_focused( struct KTUI * tui, tui_rect * r, const tui_ac * ac, const tui_ac * hint_ac,
+                                    const char * s, uint32_t cursor_pos, uint32_t offset, uint32_t mode )
+{
+    const char * txt = &( s[ offset ] );
+    uint32_t l = string_measure ( s, NULL );
+    /* draw the visible part of the string */
+    rc_t rc = DlgWrite( tui, r->top_left.x + 1, r->top_left.y, ac, txt, r->w - 2 );
+    if ( rc == 0 )
+    {
+        /* draw the cursor */
+        uint32_t x = r->top_left.x + 1 + cursor_pos - offset;
+        if ( x < ( r->top_left.x + ( r->w - 1 ) ) && x >= r->top_left.x )
+        {
+            if ( cursor_pos >= l )
+                rc = DlgWrite( tui, x, r->top_left.y, ac, "_", 1 );
+            else
+            {
+                char tmp[ 2 ];
+                tui_ac ac2;
+
+                tmp[ 0 ] = s[ cursor_pos ];
+                tmp[ 1 ] = 0;
+                copy_ac( &ac2, ac );
+                ac2.attr |= KTUI_a_underline;
+                if ( mode != 0 )
+                    ac2.attr |= KTUI_a_inverse;
+                rc = DlgWrite( tui, x, r->top_left.y, &ac2, tmp, 1 );
+            }
+        }
+    }
+
+    /* draw the hints that the content is longer than the visible part */
+    if ( rc == 0 && ( l > ( r->w - 2 ) ) )
+    {
+        if ( offset > 0 )
+            rc = DlgWrite( tui, r->top_left.x, r->top_left.y, hint_ac, "<", 1 );
+        if ( rc == 0 && ( l - offset ) > ( r->w - 2 ) )
+            rc = DlgWrite( tui, r->top_left.x + r->w - 1, r->top_left.y, hint_ac, ">", 1 );
+    }
+    return rc;
+}
+
+
+static rc_t draw_inputline_normal( struct KTUI * tui, tui_rect * r, const tui_ac * ac,
+                                   const char * s, uint32_t offset )
+{
+    const char * txt = &( s[ offset ] );
+    return DlgWrite( tui, r->top_left.x + 1, r->top_left.y, ac, txt, r->w - 2 );
+}
+
+
+void draw_inputline( struct KTUIWidget * w )
+{
+    tui_rect r;
+    rc_t rc = KTUIDlgAbsoluteRect ( w->dlg, &r, &w->r );
+    if ( rc == 0 )
+    {
+        tui_ac ac;
+        rc = GetWidgetAc( w, ktuipa_input, &ac );
+        if ( rc == 0 )
+        {
+            rc = draw_background( w->tui, w->focused, &r.top_left, r.w, r.h, ac.bg );
+            if ( rc == 0 && w->txt != NULL )
+            {
+                if ( w->focused )
+                {
+                    const tui_ac * ac_hint = GetWidgetPaletteEntry ( w, ktuipa_input_hint );
+                    rc = draw_inputline_focused( w->tui, &r, &ac, ac_hint, w->txt,
+                                            (uint32_t) w->ints[ IL_CUR_POS ],
+                                            (uint32_t) w->ints[ IL_OFFSET ],
+                                            (uint32_t) w->ints[ IL_MODE ] );
+                }
+                else
+                    rc = draw_inputline_normal( w->tui, &r, &ac, w->txt, (uint32_t) w->ints[ IL_OFFSET ] );
+            }
+        }
+    }
+}
+
+
+static bool always_handle_these_keys( tui_event * event )
+{
+	bool res = false;
+	if ( event->event_type == ktui_event_kb )
+	{
+		switch( event->data.kb_data.code )
+		{
+			case ktui_left : ;
+			case ktui_right : ;
+			case ktui_up : ;
+			case ktui_down : res = true; break;
+		}
+	}
+	return res;
+}
+
+
+bool event_inputline( struct KTUIWidget * w, tui_event * event )
+{
+    bool res;
+
+    lp_context lp;
+    lp.line = w->txt;
+    lp.max_len = w->txt_length;
+    lp.visible = ( w->r.w - 2 );
+    lp.cur_pos = &w->ints[ IL_CUR_POS ];
+    lp.offset = &w->ints[ IL_OFFSET ];
+    lp.mode = &w->ints[ IL_MODE ];
+    lp.content_changed = false;
+    res = lp_handle_event( &lp, event );
+
+    if ( res )
+    {
+        if ( lp.content_changed )
+            SetWidgetChanged ( w, true );
+        RedrawWidgetAndPushEvent( w, ktuidlg_event_changed, w->ints[ IL_CUR_POS ], 0, NULL );
+    }
+    else if ( event->event_type == ktui_event_kb && event->data.kb_data.code == ktui_enter )
+    {
+        KTUIDlgPushEvent( w->dlg, ktuidlg_event_select, w->id, 0, 0, NULL );
+        res = true;
+    }
+
+	if ( !res )
+		res = always_handle_these_keys( event );
+
+    return res;
+}
diff --git a/libs/tui/tui_widget_label.c b/libs/tui/tui_widget_label.c
new file mode 100644
index 0000000..24e109a
--- /dev/null
+++ b/libs/tui/tui_widget_label.c
@@ -0,0 +1,53 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <tui/tui_dlg.h>
+#include "tui_widget.h"
+
+
+void draw_label( struct KTUIWidget * w )
+{
+    tui_rect r;
+    rc_t rc = KTUIDlgAbsoluteRect ( w->dlg, &r, &w->r );
+    if ( rc == 0 )
+    {
+        tui_ac ac;
+        rc = GetWidgetAc( w, ktuipa_label, &ac );
+        if ( rc == 0 )
+        {
+            struct KTUI * tui = w->tui;
+            if ( tui != NULL )
+            {
+                uint32_t x = r.top_left.x;
+                uint32_t y = r.top_left.y;
+                rc = DlgPaint( tui, x, y, r.w, r.h, ac.bg );
+                if ( rc == 0 && w->caption != NULL )
+                    draw_highlighted( tui, x + 1, y, r.w - 2, &ac, w->caption );
+            }
+        }
+    }
+}
diff --git a/libs/tui/tui_widget_progress.c b/libs/tui/tui_widget_progress.c
new file mode 100644
index 0000000..b0b1f47
--- /dev/null
+++ b/libs/tui/tui_widget_progress.c
@@ -0,0 +1,120 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <tui/tui_dlg.h>
+#include "tui_widget.h"
+
+#include <math.h>
+
+#if 0
+static void calc_percent( struct KTUIWidget * w )
+{
+    uint64_t curr = *( ( uint64_t * )w->data_0 );
+    uint64_t max  = *( ( uint64_t * )w->data_1 );
+    w->ints[ 0 ] = 0;   /* int-part of result */
+    w->ints[ 1 ] = 0;   /* fract-part of result ( in 1/1000 )*/
+    if ( max > 0 && curr > 0 && curr <= max )
+    {
+        double fractpart, intpart;
+        double x = (double)curr;
+        x *= 100.0;
+        x /= max;
+        fractpart = modf ( x, &intpart );
+        w->ints[ 0 ] = ( uint64_t )floor( intpart );
+        fractpart *= 1000;
+        w->ints[ 1 ] = ( uint64_t )floor( fractpart );
+    }
+}
+#endif
+
+void draw_progress( struct KTUIWidget * w )
+{
+    tui_rect r;
+    rc_t rc = KTUIDlgAbsoluteRect ( w->dlg, &r, &w->r );
+    if ( rc == 0 )
+    {
+        tui_ac ac;
+        rc = GetWidgetAc( w, ktuipa_progress, &ac );
+        if ( rc == 0 )
+            rc = draw_background( w->tui, false, &r.top_left, r.w, r.h, ac.bg );
+        if ( rc == 0 )
+        {
+            char txt[ 32 ];
+            size_t num_writ;
+            tui_ac ac2;
+            int64_t xf = 0, x = w->percent;
+            
+            switch( w->precision )
+            {
+                case 1 :    xf = x % 10;
+                            x /= 10;
+                            string_printf ( txt, sizeof txt, &num_writ, " %u.%.01u %%", x, xf );
+                            break;
+
+                case 2 :    xf = x % 100;
+                            x /= 100;
+                            string_printf ( txt, sizeof txt, &num_writ, " %u.%.02u %%", x, xf );
+                            break;
+
+                case 3 :    xf = x % 1000;
+                            x /= 1000;
+                            string_printf ( txt, sizeof txt, &num_writ, " %u.%.03u %%", x, xf );
+                            break;
+
+                case 4 :    xf = x % 10000;
+                            x /= 10000;
+                            string_printf ( txt, sizeof txt, &num_writ, " %u.%.04u %%", x, xf );
+                            break;
+
+                default : string_printf ( txt, sizeof txt, &num_writ, " %u %%", x ); break;
+            }
+
+            x *= w->r.w;
+            x /= 100;
+
+            copy_ac( &ac2, &ac );
+            ac2.attr = KTUI_a_inverse;
+
+            if ( x >= num_writ )
+            {
+                rc = DlgWrite( w->tui, r.top_left.x, r.top_left.y, &ac2, txt, ( uint32_t )num_writ );
+                if ( rc == 0 && x > num_writ )
+                    rc = DlgPaint( w->tui, r.top_left.x + ( uint32_t )num_writ, r.top_left.y,
+                                   ( uint32_t )( x - num_writ ), r.h, ac.fg );
+            }
+            else
+            {
+                rc = DlgWrite( w->tui, r.top_left.x, r.top_left.y, &ac2, txt, ( uint32_t )x );
+                if ( rc == 0 )
+                    rc = DlgWrite( w->tui, r.top_left.x + ( uint32_t )x, r.top_left.y,
+                                   &ac, &txt[ x ], ( uint32_t )( num_writ - x ) );
+            }
+        }
+    }
+}
diff --git a/libs/tui/tui_widget_radiobox.c b/libs/tui/tui_widget_radiobox.c
new file mode 100644
index 0000000..51f917e
--- /dev/null
+++ b/libs/tui/tui_widget_radiobox.c
@@ -0,0 +1,130 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/namelist.h>
+#include <tui/tui_dlg.h>
+#include "tui_widget.h"
+#include "line_policy.h"
+
+void draw_radiobox( struct KTUIWidget * w )
+{
+    tui_rect r;
+    rc_t rc = KTUIDlgAbsoluteRect ( w->dlg, &r, &w->r );
+    if ( rc == 0 )
+    {
+        tui_ac ac;
+        rc = GetWidgetAc( w, ktuipa_radiobox, &ac );
+        if ( rc == 0 )
+            rc = draw_background( w->tui, w->focused, &r.top_left, r.w, r.h, ac.bg );
+        if ( rc == 0 && w->strings != NULL )
+        {
+            uint32_t count;
+            rc = VNameListCount ( w->strings, &count );
+            if ( rc == 0 )
+            {
+                uint32_t idx, offset = (uint32_t)w->ints[ 0 ];
+                for ( idx = 0; idx < w->r.h; ++idx )
+                {
+                    uint32_t nl_idx = offset + idx;
+                    if ( nl_idx < count )
+                    {
+                        const char * s;
+                        rc = VNameListGet ( w->strings, nl_idx, &s );
+                        if ( rc == 0 && s != NULL )
+                        {
+                            size_t num_writ;
+                            char txt[ 265 ];
+                            if ( nl_idx == w->selected_string )
+                                rc = string_printf ( txt, sizeof txt, &num_writ, "(*) %s", s );
+                            else
+                                rc = string_printf ( txt, sizeof txt, &num_writ, "( ) %s", s );
+                            if ( rc == 0 )
+                                rc = DlgWrite( w->tui, r.top_left.x + 1, r.top_left.y + idx,
+                                               &ac, txt, r.w - 2 );
+                        }
+                    }
+                }
+
+                /* draw the scrollbar on the right of the list */
+                if ( rc == 0 && count > r.h )
+                {
+                    rc = DlgPaint( w->tui, r.top_left.x + r.w - 1,
+                                   r.top_left.y, 1, r.h, KTUI_c_gray );
+                    if ( rc == 0 && count > 0 )
+                    {
+                        uint32_t y = r.top_left.y + ( ( ( uint32_t )w->selected_string * r.h ) / count );
+                        rc = DlgPaint( w->tui, r.top_left.x + r.w - 1,
+                                       y, 1, 1, ac.fg );
+                    }
+                }
+            }
+        }
+    }
+}
+
+
+bool event_radiobox( struct KTUIWidget * w, tui_event * event )
+{
+    bool res = false;
+
+    if ( w->strings != NULL )
+    {
+        uint32_t count;
+        rc_t rc = VNameListCount ( w->strings, &count );
+        if ( rc == 0 )
+        {
+            gen_context ctx;
+            ctx.count = count;
+            ctx.visible = w->r.h;
+            ctx.curr = &w->selected_string;
+            ctx.offset = &( w->ints[ 0 ] );
+
+            res = list_handle_event( &ctx, event, 4 );
+            if ( res )
+            {
+                SetWidgetChanged ( w, true );
+                RedrawWidgetAndPushEvent( w, ktuidlg_event_changed, *ctx.curr, 0, ( void * )w->strings );
+            }
+            else if ( event->event_type == ktui_event_kb )
+            {
+                switch( event->data.kb_data.code )
+                {
+                    case ktui_enter : res = true; break;
+                    case ktui_alpha : res = ( event->data.kb_data.key == ' ' ); break;
+                }
+                if ( res )
+                {
+                    SetWidgetChanged ( w, true );
+                    RedrawWidgetAndPushEvent( w, ktuidlg_event_select, *ctx.curr, 0, ( void * )w->strings );
+                }
+            }
+        }
+    }
+    return res;
+}
diff --git a/libs/tui/tui_widget_spin_edit.c b/libs/tui/tui_widget_spin_edit.c
new file mode 100644
index 0000000..84e6d9a
--- /dev/null
+++ b/libs/tui/tui_widget_spin_edit.c
@@ -0,0 +1,118 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <tui/tui_dlg.h>
+#include "tui_widget.h"
+
+void draw_spinedit( struct KTUIWidget * w )
+{
+    tui_rect r;
+    rc_t rc = KTUIDlgAbsoluteRect ( w->dlg, &r, &w->r );
+    if ( rc == 0 )
+    {
+        tui_ac ac;
+        rc = GetWidgetAc( w, ktuipa_spinedit, &ac );
+        if ( rc == 0 )
+        {
+            tui_ac ac2;
+            set_ac( &ac2, ac.attr, ac.bg, ac.fg );   /* reverse the colors */
+
+            if ( w->focused )
+            {
+                rc = DlgPaint( w->tui, r.top_left.x, r.top_left.y, 1, r.h, KTUI_c_red );
+                r.top_left.x += 1;
+                r.w -= 1;
+            }
+
+            if ( rc == 0 )
+                rc = DlgWrite( w->tui, r.top_left.x, r.top_left.y, &ac2, " + ", 3 );
+            if ( rc == 0 )
+                rc = DlgWrite( w->tui, r.top_left.x + r.w - 3, r.top_left.y, &ac2, " - ", 3 );
+
+            if ( rc == 0 )
+            {
+                char txt[ 32 ];
+                size_t num_writ;
+                string_printf ( txt, sizeof txt, &num_writ, " %ld", w->int64_value );
+                rc = DlgWrite( w->tui, r.top_left.x + 3, r.top_left.y, &ac, txt, r.w - 6 );
+            }
+        }
+    }
+}
+
+
+static bool spinedit_inc_dec( struct KTUIWidget * w, int64_t by )
+{
+    SetWidgetInt64Value ( w, GetWidgetInt64Value ( w ) + by );
+    return true;
+}
+
+
+static bool spinedit_set( struct KTUIWidget * w, int64_t v )
+{
+    SetWidgetInt64Value ( w, v );
+    return true;
+}
+
+
+bool event_spinedit( struct KTUIWidget * w, tui_event * event )
+{
+    bool res = false;
+
+    if ( event->event_type == ktui_event_kb )
+    {
+        switch( event->data.kb_data.code )
+        {
+            case ktui_home  : res = spinedit_set( w, w->int64_min ); break;
+            case ktui_end   : res = spinedit_set( w, w->int64_max ); break;
+            case ktui_up    : res = spinedit_inc_dec( w, +1 ); break;
+            case ktui_down  : res = spinedit_inc_dec( w, -1 ); break;
+            case ktui_pgup  : res = spinedit_inc_dec( w, +10 ); break;
+            case ktui_pgdn  : res = spinedit_inc_dec( w, -10 ); break;
+            case ktui_alpha : switch( event->data.kb_data.key )
+                                {
+                                    case '+' : res = spinedit_inc_dec( w, +1 ); break;
+                                    case '-' : res = spinedit_inc_dec( w, -1 ); break;
+                                }
+        }
+    }
+    else if ( event->event_type == ktui_event_mouse )
+    {
+        uint32_t x = event->data.mouse_data.x;
+        if ( x < 4 )
+            res = spinedit_inc_dec( w, +1 );
+        else if ( x > ( w->r.w - 4 ) ) 
+            res = spinedit_inc_dec( w, -1 );
+    }
+
+    if ( res )
+        RedrawWidgetAndPushEvent( w, ktuidlg_event_changed, w->int64_value, 0, NULL );
+
+    return res;
+}
diff --git a/libs/tui/tui_widget_string_list.c b/libs/tui/tui_widget_string_list.c
new file mode 100644
index 0000000..4e9e0b0
--- /dev/null
+++ b/libs/tui/tui_widget_string_list.c
@@ -0,0 +1,183 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/namelist.h>
+#include <tui/tui_dlg.h>
+#include "tui_widget.h"
+#include "line_policy.h"
+
+#define DL_V_OFFSET 0
+#define DL_H_OFFSET 1
+
+void draw_list( struct KTUIWidget * w )
+{
+    tui_rect r;
+    rc_t rc = KTUIDlgAbsoluteRect ( w->dlg, &r, &w->r );
+    if ( rc == 0 )
+    {
+        tui_ac ac;
+        rc = GetWidgetAc( w, ktuipa_list, &ac );
+        if ( rc == 0 )
+            rc = draw_background( w->tui, w->focused, &r.top_left, r.w, r.h, ac.bg );
+        if ( rc == 0 && w->strings != NULL )
+        {
+            uint32_t count;
+            rc = VNameListCount ( w->strings, &count );
+            if ( rc == 0 )
+            {
+                uint32_t idx, offset = ( uint32_t )w->ints[ DL_V_OFFSET ];
+                for ( idx = 0; idx < w->r.h; ++idx )
+                {
+                    uint32_t nl_idx = offset + idx;
+                    if ( nl_idx < count )
+                    {
+                        const char * s;
+                        rc = VNameListGet ( w->strings, nl_idx, &s );
+                        if ( rc == 0 && s != NULL )
+                        {
+                            uint32_t length = string_measure ( s, NULL );
+                            if ( w->ints[ DL_H_OFFSET ] < length )
+                                s += w->ints[ DL_H_OFFSET ];
+                            else
+                                s = " ";
+                            if ( nl_idx == w->selected_string )
+                            {
+                                tui_ac ac2;
+                                copy_ac( &ac2, &ac );
+                                ac2.attr = KTUI_a_inverse;
+                                rc = DlgWrite( w->tui, r.top_left.x + 1, r.top_left.y + idx,
+                                               &ac2, s, r.w - 2 );
+                            }
+                            else
+                                rc = DlgWrite( w->tui, r.top_left.x + 1, r.top_left.y + idx,
+                                               &ac, s, r.w - 2 );
+                        }
+                    }
+                }
+
+                /* draw the scrollbar on the right of the list */
+                if ( rc == 0 && count > r.h )
+                    rc = DrawVScroll( w->tui, &r, count, w->selected_string, KTUI_c_gray, ac.fg );
+            }
+        }
+    }
+}
+
+
+static uint32_t longest_string( VNamelist * list, uint32_t count )
+{
+	rc_t rc = 0;
+	uint32_t idx, res = 0;
+	for ( idx = 0; idx < count && rc == 0; ++idx )
+	{
+		const char * s;
+		rc = VNameListGet ( list, idx, &s );
+		if ( rc == 0 && s != NULL )
+		{
+			uint32_t length = string_measure ( s, NULL );
+			if ( length > res ) res = length;
+		}
+	}
+	return res;
+}
+
+
+static bool always_handle_these_keys( tui_event * event )
+{
+	bool res = false;
+	if ( event->event_type == ktui_event_kb )
+	{
+		switch( event->data.kb_data.code )
+		{
+			case ktui_left : ;
+			case ktui_right : ;
+			case ktui_up : ;
+			case ktui_down : res = true; break;
+		}
+	}
+	return res;
+}
+
+
+bool event_list( struct KTUIWidget * w, tui_event * event )
+{
+    bool res = false;
+    if ( w->strings != NULL )
+    {
+        uint32_t count;
+        rc_t rc = VNameListCount ( w->strings, &count );
+        if ( rc == 0 )
+        {
+            gen_context ctx;
+            uint64_t prev_selection;
+            ctx.count = count;
+            ctx.visible = w->r.h;
+            ctx.curr = &w->selected_string;
+            ctx.offset = &( w->ints[ DL_V_OFFSET ] );
+
+            prev_selection = *ctx.curr;
+            res = list_handle_event( &ctx, event, 0 );
+            if ( res )
+			{
+                RedrawWidgetAndPushEvent( w, ktuidlg_event_changed, *ctx.curr, prev_selection, (void *)w->strings );
+			}
+            else if ( event->event_type == ktui_event_kb )
+            {
+                switch( event->data.kb_data.code )
+                {
+                    case ktui_enter :  RedrawWidgetAndPushEvent( w, ktuidlg_event_select, *ctx.curr, 0, (void *)w->strings );
+										res = true;
+                                        break;
+
+                    case ktui_left :   if ( w->ints[ DL_H_OFFSET ] > 0 )
+                                        {
+                                            w->ints[ DL_H_OFFSET ]--;
+                                            RedrawWidget( w );
+                                        }
+										res = true;
+                                        break;
+
+                    case ktui_right :  if ( longest_string( w->strings, count ) > w->r.w )
+										{
+											w->ints[ DL_H_OFFSET ]++;
+											RedrawWidget( w );
+										}
+										res = true;
+                                        break;
+
+                }
+            }
+        }
+    }
+
+	if ( !res )
+		res = always_handle_these_keys( event );
+
+    return res;
+}
diff --git a/libs/tui/unix/systui.c b/libs/tui/unix/systui.c
new file mode 100644
index 0000000..92d6a17
--- /dev/null
+++ b/libs/tui/unix/systui.c
@@ -0,0 +1,29 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*--------------------------------------------------------------------------
+ * empty, because the code is now in libs/tui/linux/systui.c
+ */
diff --git a/libs/vdb/.gitignore b/libs/vdb/.gitignore
new file mode 100644
index 0000000..c253038
--- /dev/null
+++ b/libs/vdb/.gitignore
@@ -0,0 +1 @@
+*.def
diff --git a/libs/vdb/Makefile b/libs/vdb/Makefile
new file mode 100644
index 0000000..4fe5ceb
--- /dev/null
+++ b/libs/vdb/Makefile
@@ -0,0 +1,188 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/vdb
+
+INT_LIBS = \
+	libvdb \
+	libwvdb
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES =     \
+	$(VDB_OBJ) \
+	$(WVDB_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/all $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# virtual db library
+#
+$(ILIBDIR)/libvdb: $(addprefix $(ILIBDIR)/libvdb.,$(ILIBEXT))
+
+VDBCMN_SRC = \
+	dbmgr-cmn \
+	schema-tok \
+	schema-parse \
+	schema-type \
+	schema-func \
+	schema-prod \
+	schema-expr \
+	schema-eval \
+	schema-tbl \
+	schema-db \
+	schema-dump \
+	schema-int \
+	schema \
+	linker-int \
+	linker-cmn \
+	database-cmn \
+	database-depend \
+	database-load \
+	table-cmn \
+	table-load \
+	cursor-cmn \
+	column-cmn \
+	prod-cmn \
+	prod-expr \
+	prod-func \
+	phys-cmn \
+	phys-load \
+	blob \
+	blob-headers \
+	page-map \
+	row-id \
+	row-len \
+	fixed-row-len \
+	merge \
+	split \
+	compare \
+	meta-read \
+	meta-value \
+	meta-attr-read \
+	cast \
+	range-validate \
+	parameter-read \
+	redimension \
+	index_project \
+	index_lookup \
+	transpose \
+	delta_average \
+	report-vdb
+
+VDB_SRC = \
+	$(VDBCMN_SRC) \
+	dbmgr \
+	linker \
+	database \
+	table \
+	cursor \
+	column \
+	prod \
+	phys
+
+VDB_OBJ = \
+	$(addsuffix .$(LOBX),$(VDB_SRC))
+
+VDB_LIB = \
+	-dkdb \
+	-dvfs \
+	-dkfg \
+	-dkfs \
+	-dkproc \
+	-dklib \
+	-dz
+
+$(ILIBDIR)/libvdb.$(LIBX): $(VDB_OBJ)
+	$(LD) --slib -o $@ $^ $(VDB_LIB)
+
+#-------------------------------------------------------------------------------
+# update version
+#
+$(ILIBDIR)/libwvdb: $(addprefix $(ILIBDIR)/libwvdb.,$(ILIBEXT))
+
+WVDB_SRC = \
+	$(VDBCMN_SRC) \
+	wdbmgr \
+	wlinker \
+	wdatabase \
+	wtable \
+	wcursor \
+	wcolumn \
+	wprod \
+	wphys \
+	meta-write \
+	meta-attr-write \
+	meta-append \
+	index_insert
+
+WVDB_OBJ = \
+	$(addsuffix .$(LOBX),$(WVDB_SRC))
+
+WVDB_LIB = \
+	-dwkdb \
+	-dvfs \
+	-dkfg \
+	-dkfs \
+	-dkproc \
+	-dklib \
+	-dz
+
+$(ILIBDIR)/libwvdb.$(LIBX): $(WVDB_OBJ)
+	$(LD) --slib -o $@ $^ $(WVDB_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/vdb/blob-headers.c b/libs/vdb/blob-headers.c
new file mode 100644
index 0000000..4c3e8c7
--- /dev/null
+++ b/libs/vdb/blob-headers.c
@@ -0,0 +1,726 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vdb/extern.h>
+#include <klib/rc.h>
+#include <klib/vlen-encode.h>
+#include <klib/data-buffer.h>
+#include "blob-headers.h"
+#include <vdb/xform.h>
+#include <atomic32.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stddef.h>
+#include <assert.h>
+
+struct VBlobHeaderData {
+    int64_t *args;
+    uint8_t *ops;
+    atomic32_t refcount;
+    uint32_t op_count;
+    uint32_t arg_count;
+    uint64_t osize;
+    uint8_t flags;
+    uint8_t version;
+    uint32_t fmt;
+    bool read_only;
+    bool args_alloc;
+    bool ops_alloc;
+};
+
+struct VBlobHeaderVT {
+    void ( * destroy )( struct VBlobHeader * );
+};
+
+struct VBlobHeader {
+    const struct VBlobHeaderVT *vt;
+    const struct BlobHeaders *parent;
+    const struct VBlobHeaderData *owned;
+    atomic32_t refcount;
+    int32_t op_head;
+    int32_t op_tail;
+    int32_t op_cap;
+    int32_t arg_head;
+    int32_t arg_tail;
+    int32_t arg_cap;
+};
+
+struct BlobHeaders {
+    struct VBlobHeaderData *data;
+    const BlobHeaders *link;
+    atomic32_t refcount;
+};
+
+struct BlobHeaderDummy {
+    struct VBlobHeader hdr;
+    struct BlobHeaders dummy;
+    struct VBlobHeaderData data;
+};
+
+static void VBlobHeaderDestroy( struct VBlobHeader * );
+static void VBlobHeaderDummyDestroy( struct VBlobHeader * );
+static const struct VBlobHeaderVT VBlobHeader_vt[] = { { VBlobHeaderDestroy }, { VBlobHeaderDummyDestroy } };
+
+static void VBlobHeaderDataWhack( struct VBlobHeaderData *that )
+{
+    if (that)
+    {
+        if (that->args_alloc)
+            free(that->args);
+        if (that->ops_alloc)
+            free(that->ops);
+        free(that);
+    }
+}
+
+static rc_t VBlobHeaderDataDestroy( struct VBlobHeaderData *that ) {
+    VBlobHeaderDataWhack(that);
+    return 0;
+}
+
+static rc_t VBlobHeaderDataRelease( const struct VBlobHeaderData *self ) {
+    if (self && atomic32_dec_and_test(&(((struct VBlobHeaderData *)self)->refcount)))
+        return VBlobHeaderDataDestroy((struct VBlobHeaderData *)self);
+    return 0;
+}
+
+#if 0
+static rc_t VBlobHeaderDataAddRef ( const struct VBlobHeaderData *self ) {
+    if (self)
+        atomic32_inc(&(((struct VBlobHeaderData *)self)->refcount));
+    return 0;
+}
+#endif
+
+static int VBlobHeaderDataGetExclusiveOwnership( struct VBlobHeaderData *self ) {
+    if (atomic32_read_and_add(&self->refcount, 1) == 1)
+        return 1;
+    return 0;    
+}
+
+static void BlobHeadersWhack( BlobHeaders *that ) {
+    free( that );
+}
+
+static rc_t BlobHeadersDestroy( BlobHeaders *that ) {
+    const BlobHeaders *link = that->link;
+    
+    VBlobHeaderDataRelease(that->data);
+    BlobHeadersWhack(that);
+    BlobHeadersRelease(link);
+    return 0;
+}
+
+rc_t BlobHeadersAddRef ( const BlobHeaders *self ) {
+    if (self)
+        atomic32_inc(&(((BlobHeaders *)self)->refcount));
+    return 0;
+}
+
+rc_t BlobHeadersRelease ( const BlobHeaders *self ) {
+    if (self && atomic32_dec_and_test(&(((BlobHeaders *)self)->refcount)))
+        return BlobHeadersDestroy((BlobHeaders *)self);
+    return 0;
+}
+
+#if 0
+static int BlobHeadersGetExclusiveOwnership( BlobHeaders *self ) {
+    if (atomic32_read_and_add(&self->refcount, 1) == 1)
+        return 1;
+    return 0;    
+}
+#endif
+
+static rc_t BlobHeadersCreateInternal ( BlobHeaders **lhs, unsigned ops, unsigned args ) {
+    BlobHeaders *y = calloc(1, sizeof *y);
+
+    *lhs = NULL;
+    if (y) {
+        atomic32_set(&y->refcount, 1);
+        y->data = calloc(1, sizeof(*y->data) + args * sizeof(y->data->args[0]) + ops);
+        if (y->data) {
+            atomic32_set(&y->data->refcount, 1);
+            if (args) {
+                y->data->args = (void *)(&y->data[1]);
+                if (ops) {
+                    y->data->ops = (void *)(&y->data->args[args]);
+                    y->data->op_count = ops;
+                }
+                y->data->arg_count = args;
+            }
+            else if (ops) {
+                y->data->ops = (void *)(&y->data[1]);
+                y->data->op_count = ops;
+            }
+            *lhs = y;
+            
+            return 0;
+        }
+        free(y);
+    }
+    return RC(rcVDB, rcHeader, rcConstructing, rcMemory, rcExhausted);
+}
+
+rc_t BlobHeadersCreate( BlobHeaders **lhs )
+{
+    return BlobHeadersCreateInternal( lhs, 0, 0 );
+}
+
+uint32_t BlobHeadersGetMaxBufferSize ( const BlobHeaders *self )
+{
+    uint32_t y = 1;
+    const BlobHeaders *x = self;
+    const uint32_t per_header = 25;
+    
+    while (x) {
+        y += per_header + ( x->data ? (x->data->op_count + x->data->arg_count * 10) : 0 );
+        x = x->link;
+    }
+    return y;
+}
+
+static rc_t deserialize_v0(BlobHeaders **dst, const uint8_t *src, uint64_t ssize);
+
+rc_t BlobHeadersCreateFromData ( BlobHeaders **lhs, const uint8_t *src, uint64_t ssize )
+{
+    rc_t rc;
+    BlobHeaders *y;
+    
+    if (src == NULL)
+        return RC(rcVDB, rcHeader, rcConstructing, rcParam, rcNull);
+    if (ssize < 1)
+        return RC(rcVDB, rcHeader, rcConstructing, rcData, rcInsufficient);
+    
+    switch (*src) {
+    case 0:
+        rc = deserialize_v0(&y, src + 1, ssize - 1);
+        if (rc == 0)
+            *lhs = y;
+        break;
+    default:
+        rc = RC(rcVDB, rcHeader, rcConstructing, rcData, rcBadVersion);
+        break;
+    }
+    return rc;
+}
+
+static rc_t serialize1( const BlobHeaders *self, KDataBuffer *buffer, uint64_t offset, uint64_t *size ) {
+    uint8_t flags = 0;
+    uint8_t version = 0;
+    uint32_t fmt = 0;
+    uint64_t osize = 0;
+    uint32_t op_count = 0;
+    uint32_t arg_count = 0;
+    rc_t rc;
+    uint64_t sz;
+    uint8_t *dst;
+    uint64_t dsize;
+
+    if (self->data) {
+        version = self->data->version;
+        flags = self->data->flags;
+        fmt = self->data->fmt;
+        osize = self->data->osize;
+        op_count = self->data->op_count;
+        arg_count = self->data->arg_count;
+    }
+    sz = 2 + 4 * 5 + op_count + arg_count * 10;
+    rc = KDataBufferResize(buffer, sz + offset);
+    if (rc)
+        return rc;
+
+    dst = buffer->base;
+    dst += offset;
+    dsize = buffer->elem_count - offset;
+    
+    *dst++ = flags; --dsize;
+    *dst++ = version; --dsize;
+    
+    rc = vlen_encode1(dst, dsize, &sz, fmt);
+    if (rc)
+        return rc;
+    dst += sz; dsize -= sz;
+    
+    rc = vlen_encode1(dst, dsize, &sz, osize);
+    if (rc)
+        return rc;
+    dst += sz; dsize -= sz;
+    
+    rc = vlen_encode1(dst, dsize, &sz, op_count);
+    if (rc)
+        return rc;
+    dst += sz; dsize -= sz;
+    
+    rc = vlen_encode1(dst, dsize, &sz, arg_count);
+    if (rc)
+        return rc;
+    dst += sz; dsize -= sz;
+    
+    if (op_count > 0) {
+        memmove(dst, self->data->ops, op_count);
+        dst += op_count;
+        dsize -= op_count;
+    }
+    if (arg_count > 0) {
+        rc = vlen_encode(dst, dsize, &sz, self->data->args, arg_count);
+        if (rc)
+            return rc;
+        dst += sz; /* dsize -= sz */;
+    }
+    *size = (uint64_t)( dst - (uint8_t *)buffer->base );
+    return 0;
+}
+
+static rc_t deserialize_v0( BlobHeaders **dst, const uint8_t *src, uint64_t ssize ) {
+    uint8_t flags;
+    uint8_t version;
+    uint32_t fmt;
+    uint64_t osize;
+    volatile uint32_t op_count;
+    volatile uint32_t arg_count;
+    int64_t x;
+    uint64_t sz;
+    rc_t rc;
+    BlobHeaders *y;
+
+    *dst = NULL;
+    
+    if (ssize < 2)
+        return RC(rcVDB, rcHeader, rcConstructing, rcData, rcInsufficient);
+
+    flags = *src++; --ssize;
+    version = *src++; --ssize;
+    
+    rc = vlen_decode1(&x, src, ssize, &sz);
+    if (rc)
+        return ResetRCContext(rc, rcVDB, rcHeader, rcConstructing);
+    src += sz; 
+	ssize -= sz;
+    fmt = (uint32_t)x;
+    
+    rc = vlen_decode1(&x, src, ssize, &sz);
+    if (rc)
+        return ResetRCContext(rc, rcVDB, rcHeader, rcConstructing);
+    src += sz; 
+	ssize -= sz;
+    osize = (uint32_t)x;
+    
+    rc = vlen_decode1(&x, src, ssize, &sz);
+    if (rc)
+        return ResetRCContext(rc, rcVDB, rcHeader, rcConstructing);
+    src += sz; 
+	ssize -= sz;
+    op_count = (uint32_t)x;
+    
+    rc = vlen_decode1(&x, src, ssize, &sz);
+    if (rc)
+        return ResetRCContext(rc, rcVDB, rcHeader, rcConstructing);
+    src += sz; 
+	ssize -= sz;
+    arg_count = (uint32_t)x;
+
+    rc = BlobHeadersCreateInternal(&y, op_count, arg_count);
+    if (rc)
+        return rc;
+    
+    y->data->flags = flags;
+    y->data->version = version;
+    y->data->fmt = fmt;
+    y->data->osize = osize;
+    y->data->read_only = true;
+
+    if (op_count > 0) {
+        if (ssize < op_count) {
+            BlobHeadersRelease(y);
+            return RC(rcVDB, rcHeader, rcConstructing, rcData, rcInsufficient);
+        }
+        memmove(y->data->ops, src, op_count);
+        src += op_count; ssize -= op_count;
+    }        
+    if (arg_count > 0) {
+        rc = vlen_decode(y->data->args, arg_count, src, ssize, &sz);
+        if (rc) {
+            BlobHeadersRelease(y);
+            return ResetRCContext(rc, rcVDB, rcHeader, rcConstructing);
+        }
+        src += sz; ssize -= sz;
+    }
+    if (ssize) {
+        BlobHeaders *link;
+        
+        rc = deserialize_v0(&link, src, ssize);
+        if (rc) {
+            BlobHeadersRelease(y);
+            return rc;
+        }
+        y->link = link;
+    }
+    *dst = y;
+    return 0;
+}
+
+static rc_t serialize( const BlobHeaders *self, KDataBuffer *buffer, uint64_t offset, uint64_t *sz ) {
+    rc_t rc;
+
+    rc = serialize1(self, buffer, offset, sz);
+    if (rc == 0 && self->link)
+        rc = serialize(self->link, buffer, *sz, sz);
+    return rc;
+}
+
+rc_t BlobHeadersSerialize ( BlobHeaders *self, KDataBuffer *buffer,
+        uint64_t offset, uint64_t *psz )
+{
+    rc_t rc;
+    uint64_t sz = 0;
+    
+    assert(buffer->elem_bits == 8);
+    assert(buffer->bit_offset == 0);
+    
+    rc = KDataBufferResize(buffer, 1);
+    if (rc)
+        return rc;
+    ((uint8_t *)(buffer->base))[offset] = 0;
+    rc = serialize(self, buffer, offset + 1, &sz);
+    *psz = sz - offset;
+    return rc;
+}
+
+rc_t BlobHeadersCreateChild ( BlobHeaders *self, BlobHeaders **new_hdr ) 
+{
+    BlobHeaders *y;
+    rc_t rc;
+
+    *new_hdr = NULL;
+    rc = BlobHeadersCreate(&y);
+    if (rc == 0) {
+        y->link = self;
+        BlobHeadersAddRef(y->link);
+        *new_hdr = y;
+        return 0;
+    }
+    return rc;
+}
+
+VBlobHeader *BlobHeadersCreateDummyHeader ( uint8_t version, uint32_t fmt, uint8_t flags, uint64_t size )
+{
+    struct BlobHeaderDummy *y;
+    
+    y = calloc(1, sizeof(*y));
+    if (y) {
+        y->data.fmt = fmt;
+        y->data.version = version;
+        y->data.osize = size;
+        y->data.flags = flags;
+        atomic32_set(&y->data.refcount, 1);
+
+        y->dummy.data = &y->data;
+        atomic32_set(&y->dummy.refcount, 1);
+        
+        y->hdr.vt = &VBlobHeader_vt[1];
+        y->hdr.parent = &y->dummy;
+        atomic32_set(&y->hdr.refcount, 1);
+        
+        return &y->hdr;
+    }
+    return 0;
+}
+
+const BlobHeaders *BlobHeadersGetNextFrame( const BlobHeaders *cself ) {
+    return cself ? cself->link : 0;
+}
+
+const BlobHeaders *BlobHeadersPop( const BlobHeaders *cself ) {
+    const BlobHeaders *y = BlobHeadersGetNextFrame(cself);
+    BlobHeadersAddRef(y);
+    BlobHeadersRelease(cself);
+    return y;
+}
+
+VBlobHeader *BlobHeadersGetHeader ( const BlobHeaders *self )
+{
+    VBlobHeader *y = calloc(1, sizeof(*y));
+    
+    if (y) {
+        y->vt = &VBlobHeader_vt[0];
+        atomic32_set(&y->refcount, 1);
+        y->parent = self;
+        BlobHeadersAddRef(y->parent);
+        if (self->data) {
+            y->op_tail = self->data->op_count;
+            y->arg_tail = self->data->arg_count;
+        }
+    }
+    return y;
+}
+
+VBlobHeader *BlobHeadersGetHdrWrite ( BlobHeaders *self ) {
+    VBlobHeader *y = BlobHeadersGetHeader(self);
+    
+    if (y) {
+        if (self->data && !self->data->read_only) {
+            if (VBlobHeaderDataGetExclusiveOwnership(self->data)) {
+                y->owned = self->data;
+                return y;
+            }
+        }
+        VBlobHeaderRelease(y);
+    }
+    return NULL;
+}
+
+static void VBlobHeaderDummyDestroy( VBlobHeader *that ) {
+    free(that);
+}
+
+static void VBlobHeaderDestroy( VBlobHeader *that ) {
+    VBlobHeaderDataRelease(that->owned);
+    BlobHeadersRelease(that->parent);
+    free(that);
+}
+
+LIB_EXPORT rc_t CC VBlobHeaderRelease ( const VBlobHeader *cself ) {
+    VBlobHeader *self = (VBlobHeader *)cself;
+    
+    if (self && atomic32_dec_and_test(&self->refcount))
+        self->vt->destroy(self);
+    return 0;
+}
+
+rc_t VBlobHeaderAddRef ( const VBlobHeader *self ) {
+    if (self)
+        atomic32_inc(&(((VBlobHeader *)self)->refcount));
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VBlobHeaderCreateFork ( const VBlobHeader *self, VBlobHeader **rslt ) {
+    if (self == NULL)
+        return RC(rcVDB, rcHeader, rcCopying, rcSelf, rcNull);
+    
+    if (self->parent == NULL)
+        return RC(rcVDB, rcHeader, rcCopying, rcSelf, rcInvalid);
+    
+    if (rslt == NULL)
+        return RC(rcVDB, rcHeader, rcCopying, rcParam, rcNull);
+    
+    *rslt = BlobHeadersCreateDummyHeader(self->parent->data->version, self->parent->data->fmt, 0, self->parent->data->osize);
+    if (*rslt)
+        return 0;
+    return RC(rcVDB, rcHeader, rcCopying, rcMemory, rcInsufficient);
+}
+
+rc_t VBlobHeaderReplace( VBlobHeader *targ, const VBlobHeader *src ) {
+    BlobHeaders *parent;
+    struct VBlobHeaderData *data;
+    atomic32_t temp;
+    
+    if (src == NULL || targ == NULL)
+        return RC(rcVDB, rcHeader, rcCopying, rcParam, rcNull);
+
+    if (src->vt != &VBlobHeader_vt[1] || targ->vt != &VBlobHeader_vt[0])
+        return RC(rcVDB, rcHeader, rcCopying, rcParam, rcInvalid);
+    
+    if (atomic32_read(&targ->refcount) != 1)
+        return RC(rcVDB, rcHeader, rcCopying, rcParam, rcInvalid);
+    
+    data = calloc(1, sizeof(*data));
+    if (data == NULL)
+        return RC(rcVDB, rcHeader, rcCopying, rcMemory, rcExhausted);
+
+    *data = *src->parent->data;
+    atomic32_set(&data->refcount, 1);
+    
+    parent = (BlobHeaders *)targ->parent;
+    VBlobHeaderDataRelease(parent->data);
+    parent->data = data;
+    
+    atomic32_set(&temp, atomic32_read(&src->refcount));
+    *targ = *src;
+    atomic32_set(&targ->refcount, atomic32_read(&temp));
+    targ->parent = parent;
+    targ->vt = &VBlobHeader_vt[0];
+    
+    return 0;
+}
+
+rc_t VBlobHeaderOpPushHead ( VBlobHeader *self, uint8_t op )
+{
+    return RC(rcVDB, rcHeader, rcWriting, rcInterface, rcUnsupported);
+}
+
+rc_t VBlobHeaderArgPushHead ( VBlobHeader *self, int64_t arg )
+{
+    return RC(rcVDB, rcHeader, rcWriting, rcInterface, rcUnsupported);
+}
+
+#define MIN_ALLOC 16
+
+LIB_EXPORT rc_t CC VBlobHeaderOpPushTail ( VBlobHeader *self, uint8_t op )
+{
+    struct VBlobHeaderData *data;
+    
+    assert(self);
+    assert(self->parent);
+    data = self->parent->data;
+    assert(data);
+    assert(!data->read_only);
+    
+    if (data->ops == NULL) {
+        data->ops = malloc(MIN_ALLOC);
+        if (data->ops == NULL)
+            return RC(rcVDB, rcHeader, rcWriting, rcMemory, rcExhausted);
+        self->op_cap = MIN_ALLOC;
+    }
+    
+    assert(self->op_tail <= self->op_cap);
+    
+    if (self->op_tail == self->op_cap) {
+        uint32_t size = self->op_cap;
+        void *temp = realloc(data->ops, size += size);
+        
+        if (temp == NULL)
+            return RC(rcVDB, rcHeader, rcWriting, rcMemory, rcExhausted);
+        data->ops = temp;
+        self->op_cap = size;
+    }
+    data->ops[self->op_tail++] = op;
+    ++data->op_count;
+    data->ops_alloc = true;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VBlobHeaderArgPushTail ( VBlobHeader *self, int64_t arg )
+{
+    struct VBlobHeaderData *data;
+    
+    assert(self);
+    assert(self->parent);
+    data = self->parent->data;
+    assert(data);
+    assert(!data->read_only);
+    
+    if (data->args == NULL) {
+        data->args = malloc(MIN_ALLOC * sizeof(data->args[0]));
+        if (data->args == NULL)
+            return RC(rcVDB, rcHeader, rcWriting, rcMemory, rcExhausted);
+        self->arg_cap = MIN_ALLOC;
+    }
+    
+    assert(self->arg_tail <= self->arg_cap);
+    
+    if (self->arg_tail == self->arg_cap) {
+        uint32_t size = self->arg_cap;
+        void *temp = realloc(data->args, (size += size) * sizeof(data->args[0]));
+        
+        if (temp == NULL)
+            return RC(rcVDB, rcHeader, rcWriting, rcMemory, rcExhausted);
+        data->args = temp;
+        self->arg_cap = size;
+    }
+    data->args[self->arg_tail++] = arg;
+    ++data->arg_count;
+    data->args_alloc = true;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VBlobHeaderOpPopHead ( const VBlobHeader *self, uint8_t *op )
+{
+    if (self->op_head >= self->op_tail || self->op_head >= (int32_t)self->parent->data->op_count)
+        return RC(rcVDB, rcHeader, rcReading, rcData, rcExhausted);
+    *op = self->parent->data->ops[self->op_head];
+    ++((VBlobHeader *)self)->op_head;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VBlobHeaderOpPopTail ( const VBlobHeader *self, uint8_t *op )
+{
+    if (self->op_tail < self->op_head || self->op_tail < 0)
+        return RC(rcVDB, rcHeader, rcReading, rcData, rcExhausted);
+    *op = self->parent->data->ops[self->op_tail];
+    --((VBlobHeader *)self)->op_tail;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VBlobHeaderArgPopHead ( const VBlobHeader *self, int64_t *arg )
+{
+    if (self->arg_head >= self->arg_tail || self->arg_head >= (int32_t)self->parent->data->arg_count || self->parent->data->args == NULL)
+        return RC(rcVDB, rcHeader, rcReading, rcData, rcExhausted);
+    *arg = self->parent->data->args[self->arg_head];
+    ++((VBlobHeader *)self)->arg_head;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VBlobHeaderArgPopTail ( const VBlobHeader *self, int64_t *arg )
+{
+    if (self->arg_tail < self->arg_head || self->arg_tail < 0 || self->parent->data->args == NULL)
+        return RC(rcVDB, rcHeader, rcReading, rcData, rcExhausted);
+    *(uint64_t *)arg = self->parent->data->args[self->arg_tail];
+    --((VBlobHeader *)self)->arg_tail;
+    return 0;
+}
+
+LIB_EXPORT uint8_t CC VBlobHeaderVersion ( const VBlobHeader *self )
+{
+    return self->parent->data->version;
+}
+
+LIB_EXPORT void CC VBlobHeaderSetVersion ( VBlobHeader *self, uint8_t version )
+{
+    self->parent->data->version = version;
+}
+
+uint8_t VBlobHeaderFlags ( const VBlobHeader *self )
+{
+    return self->parent->data->flags & 0x7F;
+}
+
+void VBlobHeaderSetFlags ( VBlobHeader *self, uint8_t flags )
+{
+    self->parent->data->flags = (self->parent->data->flags & 0x80) | (flags & 0x7F);
+}
+
+uint32_t VBlobHeaderFormat ( const VBlobHeader *self )
+{
+    return self->parent->data->fmt;
+}
+
+void VBlobHeaderSetFormat ( VBlobHeader *self, uint32_t fmt )
+{
+    self->parent->data->fmt = fmt;
+}
+
+uint64_t VBlobHeaderSourceSize ( const VBlobHeader *self )
+{
+    return self->parent->data->osize;
+}
+
+void VBlobHeaderSetSourceSize ( VBlobHeader *self, uint64_t ssize )
+{
+    self->parent->data->osize = ssize;
+}
diff --git a/libs/vdb/blob-headers.h b/libs/vdb/blob-headers.h
new file mode 100644
index 0000000..110bb4a
--- /dev/null
+++ b/libs/vdb/blob-headers.h
@@ -0,0 +1,114 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+struct KDataBuffer;
+typedef struct BlobHeaders BlobHeaders;
+
+/* add ref and release */
+rc_t BlobHeadersAddRef( const BlobHeaders *self );
+rc_t BlobHeadersRelease( const BlobHeaders *self );
+
+/* constructors */
+
+/* create a new header stack */
+rc_t BlobHeadersCreate( BlobHeaders **lhs );
+
+/* add a new header frame to the stack */
+rc_t BlobHeadersCreateChild( BlobHeaders *self, BlobHeaders **child );
+
+/* create header stack from serialization */
+rc_t BlobHeadersCreateFromData( BlobHeaders **lhs, const uint8_t *src, uint64_t ssize );
+
+/* move down the header stack
+ * you will need to AddRef the result pointer
+ * before releasing the argument pointer
+ */
+const BlobHeaders *BlobHeadersGetNextFrame( const BlobHeaders *cself );
+
+/* this is a convenience function to
+ * pop the current frame off the stack
+ * returns the new current frame
+ *  get next frame
+ *  addref next frame
+ *  release current frame
+ *  return next frame
+ *
+ * The idea is to do
+ *  headers = BlobHeadersPop(headers);
+ */
+const BlobHeaders *BlobHeadersPop( const BlobHeaders *cself );
+
+/* a worst-case estimate of how many bytes
+ * the serialization will take
+ */
+uint32_t BlobHeadersGetMaxBufferSize( const BlobHeaders *self );
+
+/* serialize the whole stack
+ *
+ * Params:
+ *  self: (in) top of the stack
+ *  buffer: (in/out) the data buffer to write into
+ *  offset: (in) number of bytes into buffer to start writing at
+ */
+rc_t BlobHeadersSerialize( BlobHeaders *self, struct KDataBuffer *buffer, uint64_t offset, uint64_t *sz );
+
+/* get the header in the current frame */
+/* for read */
+struct VBlobHeader *BlobHeadersGetHeader( const BlobHeaders *self );
+struct VBlobHeader *BlobHeadersGetHdrWrite( BlobHeaders *self );
+struct VBlobHeader *BlobHeadersCreateDummyHeader( uint8_t version, uint32_t fmt, uint8_t flags, uint64_t size );
+
+
+/* VBlobHeader stuff */
+rc_t VBlobHeaderAddRef ( struct VBlobHeader const *self );
+
+#if NOT_DEFINED_IN_VDB_XFORM_H
+uint8_t VBlobHeaderVersion( const struct VBlobHeader *self );
+void VBlobHeaderSetVersion( struct VBlobHeader *self, uint8_t version );
+#endif
+
+uint8_t VBlobHeaderFlags( const struct VBlobHeader *self );
+void VBlobHeaderSetFlags( struct VBlobHeader *self, uint8_t flags );
+
+uint32_t VBlobHeaderFormatId( const struct VBlobHeader *self );
+void VBlobHeaderSetFormat( struct VBlobHeader *self, uint32_t fmt );
+
+uint64_t VBlobHeaderSourceSize( const struct VBlobHeader *self );
+void VBlobHeaderSetSourceSize( struct VBlobHeader *self, uint64_t ssize );
+
+
+/* Replace
+ *  replace contents of "self" with the contents of "src"
+ *
+ *  after running multiple processes in parallel, one header must
+ *  be chosen to associate with the output blob. use this function
+ *  to set ...
+ */
+rc_t VBlobHeaderReplace ( struct VBlobHeader *self, struct VBlobHeader const *src );
diff --git a/libs/vdb/blob-priv.h b/libs/vdb/blob-priv.h
new file mode 100644
index 0000000..2593d19
--- /dev/null
+++ b/libs/vdb/blob-priv.h
@@ -0,0 +1,206 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_blob_priv_
+#define _h_blob_priv_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_vdb_blob_
+#include <vdb/blob.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef _h_klib_data_buffer_
+#include <klib/data-buffer.h>
+#endif
+
+#ifndef _h_vdb_xform_
+#include <vdb/xform.h>
+#endif
+
+#define TRACKING_BLOBS 0
+#if TRACKING_BLOBS
+#include <stdio.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    
+#if _DEBUGGING
+#define VBLOG_HAS_NAME 1
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct PageMap;
+struct BlobHeaders;
+struct VProduction;
+struct VBlobPageMapCache;
+
+typedef struct PageMapProcessRequest{
+    struct PageMap *pm;        /**** deserialized form **/
+    KDataBuffer data;   /**** serialized   form **/
+    uint32_t    row_count;
+    uint64_t    elem_count;
+    rc_t rc;            /**** results **/
+
+    volatile enum {
+        ePMPR_STATE_NONE=0,
+        ePMPR_STATE_SERIALIZE_REQUESTED,
+        ePMPR_STATE_DESERIALIZE_REQUESTED,
+        ePMPR_STATE_SERIALIZE_DONE,
+        ePMPR_STATE_DESERIALIZE_DONE,
+	ePMPR_STATE_EXIT
+    } state;            /**** request state      **/
+    struct KLock      *lock;
+    struct KCondition *cond;
+} PageMapProcessRequest;
+
+
+/*--------------------------------------------------------------------------
+ * VBlob
+ */
+struct VBlob
+{
+    int64_t start_id;
+    int64_t stop_id;
+    
+    struct PageMap *pm;
+    struct BlobHeaders *headers;
+    struct VBlobPageMapCache *spmc; /* cache for split */
+    KDataBuffer data;
+    KRefcount refcount;
+
+/*    uint32_t row_count; */ /* == stop_id + 1 - start_id */
+    bool no_cache;
+    VByteOrder byte_order;
+#if VBLOG_HAS_NAME
+    const char name[32];
+#endif
+};
+
+struct VBlobPageMapCache {
+    int n;
+    struct PageMap *pm[1];
+};
+
+#define BlobBufferBits(BLOB) ((uint64_t)KDataBufferBits(&(BLOB)->data))
+#define BlobBufferBytes(BLOB) ((size_t)(KDataBufferBytes(&(BLOB)->data)))
+#define BlobRowCount(BLOB) ((uint32_t)( (uint64_t)((BLOB)->stop_id - (BLOB)->start_id) == UINT64_MAX ? UINT32_MAX : (BLOB)->stop_id + 1 - (BLOB)->start_id ))
+
+#if TRACKING_BLOBS
+/* #define TRACK_BLOB(f,p) fprintf(stderr, "%s %p %d %s:%d:%s\n",#f,(void*)p,*(int*)(&p->refcount),__FILE__,__LINE__,__func__) */
+#define TRACK_BLOB(f,p) fprintf(stderr, "+++++ %s %p %d %s:%d\n",#f,(void*)(p),p?*(int*)(&(p)->refcount):0,__func__,__LINE__)
+#else
+#define TRACK_BLOB(f,p)
+#endif
+
+rc_t VBlobNew( VBlob **lhs, int64_t start_id, int64_t stop_id, const char *name );
+
+/* use inline-able addref and release on blobs
+   within the library for efficiency */
+#if 1
+#define VBlobAddRef( self ) \
+    ( ( ( self ) == NULL ) ? \
+      0 : ( atomic32_inc ( & ( self ) -> refcount ), 0 ) )
+#define VBlobRelease( self ) \
+    ( ( ( self ) == NULL || atomic32_read_and_add_gt ( & ( self ) -> refcount, -1, 1 ) > 1 ) ? \
+      0 : VBlobRelease ( self ) )
+#endif
+
+#if _DEBUGGING
+void VBlobCheckIntegrity ( const VBlob *self );
+#else
+#define VBlobCheckIntegrity( self ) \
+  ( void ) 0
+#endif
+
+rc_t VBlobCreateFromData(
+                         struct VBlob **lhs,
+                         int64_t start_id, int64_t stop_id,
+                         const KDataBuffer *src,
+                         uint32_t elem_bits,
+			 PageMapProcessRequest const *pmpr
+);
+
+rc_t VBlobCreateFromSingleRow(
+                              struct VBlob **lhs,
+                              int64_t start_id, int64_t stop_id,
+                              const KDataBuffer *src,
+                              VByteOrder byte_order
+);
+/*** VBlob as a new array; meaning fixed len,data_run(..)=1 **/
+rc_t VBlobNewAsArray(struct VBlob **lhs, int64_t start_id, int64_t stop_id, uint32_t rowlen, uint32_t elem_bits); 
+    
+rc_t VBlobSerialize( const VBlob *self, KDataBuffer *result );
+
+bool VBlobIsSingleRow( const VBlob *self );
+
+uint32_t VBlobFixedRowLength( const struct VBlob *self );
+
+rc_t VBlobAppend( struct VBlob *self, const struct VBlob *other );
+/**** finds start_id in a blob and builds sub-blob for the number or repetitions ***/
+rc_t VBlobSubblob( const struct VBlob *self,struct VBlob **sub, int64_t start_id );
+
+void VBlobPageMapOptimize( struct VBlob **self );
+
+#define LAST_BLOB_CACHE_SIZE 256
+
+
+typedef struct VBlobMRUCache VBlobMRUCache; /** forward declaration **/
+typedef  struct VBlobMRUCacheCursorContext {  /** to be used to pass cache context down to production level ***/
+	VBlobMRUCache * cache;
+	uint32_t	col_idx;
+} VBlobMRUCacheCursorContext;
+
+VBlobMRUCache * VBlobMRUCacheMake(uint64_t capacity );
+void VBlobMRUCacheDestroy( VBlobMRUCache *self );
+const VBlob* VBlobMRUCacheFind(const VBlobMRUCache *cself, uint32_t col_idx, int64_t row_id);
+rc_t VBlobMRUCacheSave(const VBlobMRUCache *cself, uint32_t col_idx, const VBlob *blob);
+
+uint64_t VBlobMRUCacheGetCapacity(const VBlobMRUCache *cself);
+uint64_t VBlobMRUCacheSetCapacity(VBlobMRUCache *self,uint64_t capacity );
+
+void VBlobMRUCacheSuspendFlush(VBlobMRUCache *self);
+void VBlobMRUCacheResumeFlush (VBlobMRUCache *self);
+
+
+rc_t PageMapProcessGetPagemap(const PageMapProcessRequest *self,struct PageMap **pm);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _h_blob_priv_ */
diff --git a/libs/vdb/blob.c b/libs/vdb/blob.c
new file mode 100644
index 0000000..3dcf862
--- /dev/null
+++ b/libs/vdb/blob.c
@@ -0,0 +1,1690 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vdb/extern.h>
+ 
+#define TRACK_REFERENCES 0
+
+#include "page-map.h"
+#include "blob-headers.h"
+#include "blob.h"
+#include "blob-priv.h"
+#include <klib/rc.h>
+#include <klib/defs.h>
+#include <byteswap.h>
+#include <klib/data-buffer.h>
+#include <klib/container.h>
+#include <klib/vlen-encode.h>
+#include <klib/vector.h>
+#include <kdb/btree.h>
+#include <vdb/schema.h>
+#include <vdb/xform.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+#include <bitstr.h>
+
+#include <kproc/timeout.h>
+#include <kproc/lock.h>
+#include <kproc/cond.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <os-native.h>
+
+#include <stdio.h> /* temp for debugging */
+#define PHYSPROD_INDEX_OFFSET 1000000000
+#if _DEBUGGING
+void VBlobCheckIntegrity ( const VBlob *self )
+{
+    if ( self != NULL )
+    {
+        rc_t rc = KDataBufferCheckIntegrity ( & self -> data );
+        if ( rc != 0 )
+        {
+            fprintf ( stderr, "AAAAAH!\n" );
+        }
+    }
+}
+#endif
+
+rc_t VBlobNew ( VBlob **lhs, int64_t start_id, int64_t stop_id, const char *name ) {
+    VBlob *y;
+    
+    if ( name == NULL )
+        name = "";
+#if VBLOG_HAS_NAME
+    *lhs = y = malloc(sizeof(*y) + strlen(name));
+#else
+    *lhs = y = calloc(1, sizeof(*y));
+#endif
+    if (y) {
+        KRefcountInit(&y->refcount, 1, "VBlob", "new", name);
+        y->start_id = start_id;
+        y->stop_id = stop_id;
+        y->data.elem_bits = 1;
+        y->byte_order = vboNative;
+#if VBLOG_HAS_NAME
+        y->pm = NULL;
+        y->headers = NULL;
+        y->spmc = NULL;
+        memset(&y->data, 0, sizeof(y->data));
+        y->no_cache = 0;
+        strcpy(&(((char *)y->name)[0]), name);
+#endif
+        
+        return 0;
+    }
+    return RC(rcVDB, rcBlob, rcConstructing, rcMemory, rcExhausted);
+}
+rc_t VBlobNewAsArray(struct VBlob **lhs, int64_t start_id, int64_t stop_id, uint32_t rowlen, uint32_t elem_bits)
+{
+	VBlob *y;
+	rc_t rc = VBlobNew(&y,start_id,stop_id,NULL);
+	if(rc == 0){
+		rc = KDataBufferMake(&y->data,elem_bits,rowlen*(stop_id-start_id+1));
+		if(rc == 0){
+			rc=PageMapNewFixedRowLength(&y->pm,stop_id-start_id+1,rowlen);
+			if(rc == 0){
+				*lhs = y;
+				return 0;
+			}
+			PageMapRelease(y->pm);
+		}
+		VBlobRelease(y);
+	}
+	return rc;
+}
+
+static rc_t VBlobDestroy( VBlob *that ) {
+    if (that->spmc) {
+        int i;
+        
+        for (i = 0; i != that->spmc->n; ++i)
+            PageMapRelease(that->spmc->pm[i]);
+        free(that->spmc);
+    }
+    KDataBufferWhack(&that->data);
+    BlobHeadersRelease(that->headers);
+    PageMapRelease(that->pm);
+    free(that);
+    return 0;
+}
+
+static rc_t decode_header_byte_v2(
+                                  uint8_t header_byte,
+                                  uint8_t *variant,
+                                  uint8_t *adjust,
+                                  VByteOrder *byte_order
+) {
+    *adjust = (8 - (header_byte & 7)) & 7; header_byte >>= 3;
+    *byte_order = (header_byte & 1) ? vboBigEndian : vboLittleEndian;
+    header_byte >>= 1;
+    *variant = header_byte & 3;
+    header_byte >>= 2;
+    return header_byte == 2 ? 0 : RC(rcVDB, rcBlob, rcReading, rcData, rcBadVersion);
+}
+
+static rc_t decode_header_v2_0(
+                               const uint8_t *src,
+                               uint64_t ssize,
+                               uint32_t *hdr_size,
+                               uint32_t *map_size,
+                               uint32_t *offset
+) {
+    *offset = 3;
+    if (ssize < *offset)
+        return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+    
+    *hdr_size = src[1];
+    *map_size = src[2];
+    return 0;
+}
+
+static rc_t decode_header_v2_1(
+                               const uint8_t *src,
+                               uint64_t ssize,
+                               uint32_t *hdr_size,
+                               uint32_t *map_size,
+                               uint32_t *offset
+) {
+    *offset = 4;
+    if (ssize < *offset)
+        return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+    
+    *hdr_size = src[1];
+    *map_size = (uint32_t)src[2] | ((uint32_t)src[3] << 8);
+    return 0;
+}
+
+static rc_t decode_header_v2_2(
+                               const uint8_t *src,
+                               uint64_t ssize,
+                               uint32_t *hdr_size,
+                               uint32_t *map_size,
+                               uint32_t *offset
+) {
+    *offset = 6;
+    if (ssize < *offset)
+        return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+    
+    *hdr_size = src[1];
+    *map_size = (uint32_t)src[2] | ((uint32_t)src[3] << 8) | ((uint32_t)src[4] << 16) | ((uint32_t)src[5] << 24);
+    return 0;
+}
+
+static rc_t decode_header_v2_3(
+                               const uint8_t *src,
+                               uint64_t ssize,
+                               uint32_t *hdr_size,
+                               uint32_t *map_size,
+                               uint32_t *offset
+) {
+    *offset = 9;
+    if (ssize < *offset)
+        return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+    
+    *hdr_size = (uint32_t)src[1] | ((uint32_t)src[2] << 8) | ((uint32_t)src[3] << 16) | ((uint32_t)src[4] << 24);
+    *map_size = (uint32_t)src[5] | ((uint32_t)src[6] << 8) | ((uint32_t)src[7] << 16) | ((uint32_t)src[8] << 24);
+    return 0;
+}
+
+static rc_t decode_header_v2(
+                             const uint8_t *src,
+                             uint64_t ssize,
+                             uint32_t *hdr_size,
+                             uint32_t *map_size,
+                             uint32_t *offset,
+                             uint8_t *adjust,
+                             VByteOrder *byte_order
+) {
+    rc_t rc;
+    uint8_t variant;
+    
+    if (ssize == 0)
+        return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+
+    rc = decode_header_byte_v2(src[0], &variant, adjust, byte_order);
+    if (rc)
+        return rc;
+
+    switch (variant) {
+    case 0:
+        return decode_header_v2_0(src, ssize, hdr_size, map_size, offset);
+    case 1:
+        return decode_header_v2_1(src, ssize, hdr_size, map_size, offset);
+    case 2:
+        return decode_header_v2_2(src, ssize, hdr_size, map_size, offset);
+    case 3:
+        return decode_header_v2_3(src, ssize, hdr_size, map_size, offset);
+    default:
+        return RC(rcVDB, rcBlob, rcConstructing, rcData, rcBadVersion);
+    }
+}
+
+static rc_t encode_header_v1(
+                             uint8_t *dst,
+                             uint64_t dsize,
+                             uint64_t *used,
+                             uint32_t row_length,
+                             bitsz_t data_size,
+                             VByteOrder byte_order
+) {
+    /* byte-order goes in bits 0..1 */
+    uint8_t header_byte = byte_order & 3;
+    if ( header_byte == vboNative )
+    {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+        header_byte = ( uint8_t) vboLittleEndian;
+#else
+        header_byte = ( uint8_t) vboBigEndian;
+#endif
+    }
+
+    /* blob size adjust goes in bits 2..4 */
+    header_byte |= ( ( 8 - ( data_size & 7 ) ) & 7 ) << 2;
+    
+    /* row-length code goes in bits 5..6 */
+    if ( row_length == 1 ) {
+        header_byte |= 3 << 5;
+        * used = 1;
+        if ( dsize < * used )
+            return RC(rcVDB, rcBlob, rcConstructing, rcBuffer, rcInsufficient);
+        dst[0] = header_byte;
+    }
+    else if (row_length < 0x100) {
+        *used = 2;
+        if (dsize < *used)
+            return RC(rcVDB, rcBlob, rcConstructing, rcBuffer, rcInsufficient);
+        dst[0] = header_byte;
+        dst[1] = ( uint8_t ) row_length;
+    }
+    else if (row_length < 0x10000) {
+        header_byte |= 1 << 5;
+        *used = 3;
+        if (dsize < *used)
+            return RC(rcVDB, rcBlob, rcConstructing, rcBuffer, rcInsufficient);
+        dst[0] = header_byte;
+        dst[1] = ( uint8_t ) row_length;
+        dst[2] = ( uint8_t ) ( row_length >> 8 );
+    }
+    else {
+        header_byte |= 2 << 5;
+        *used = 5;
+        if (dsize < *used)
+            return RC(rcVDB, rcBlob, rcConstructing, rcBuffer, rcInsufficient);
+        dst[0] = header_byte;
+        dst[1] = ( uint8_t ) row_length;
+        dst[2] = ( uint8_t ) ( row_length >> 8 );
+        dst[3] = ( uint8_t ) ( row_length >> 16 );
+        dst[4] = ( uint8_t ) ( row_length >> 24 );
+    }
+    return 0;
+}
+
+static rc_t encode_header_v2(
+                             uint8_t *dst,
+                             uint64_t dsize,
+                             uint64_t *used,
+                             uint64_t hdr_size,
+                             uint64_t map_size,
+                             bitsz_t data_size
+) {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    uint8_t header_byte = 0x80 | ( (uint8_t)data_size & 7 );
+#else
+    uint8_t header_byte = 0x88 | ( (uint8_t)data_size & 7 );
+#endif
+    
+    assert(hdr_size >> 32 == 0);
+    assert(map_size >> 32 == 0);
+    
+    if ((hdr_size >> 8) == 0) {
+        if ((map_size >> 8) == 0) {
+            *used = 3;
+            if (dsize < *used)
+                return RC(rcVDB, rcBlob, rcConstructing, rcBuffer, rcInsufficient);
+            
+            dst[0] = header_byte;
+            dst[1] = hdr_size;
+            dst[2] = map_size;
+        }
+        else if ((map_size >> 16) == 0) {
+            *used = 4;
+            if (dsize < *used)
+                return RC(rcVDB, rcBlob, rcConstructing, rcBuffer, rcInsufficient);
+            
+            dst[0] = header_byte | 0x10;
+            dst[1] = hdr_size;
+            dst[2] = map_size;
+            dst[3] = map_size >> 8;
+        }
+        else {
+            *used = 6;
+            if (dsize < *used)
+                return RC(rcVDB, rcBlob, rcConstructing, rcBuffer, rcInsufficient);
+
+            dst[0] = header_byte | 0x20;
+            dst[1] = hdr_size;
+            dst[2] = map_size;
+            dst[3] = map_size >> 8;
+            dst[4] = map_size >> 16;
+            dst[5] = map_size >> 24;
+        }
+    }
+    else {
+        *used = 9;
+        if (dsize < *used)
+            return RC(rcVDB, rcBlob, rcConstructing, rcBuffer, rcInsufficient);
+
+        dst[0] = header_byte | 0x30;
+
+        dst[1] = hdr_size;
+        dst[2] = hdr_size >> 8;
+        dst[3] = hdr_size >> 16;
+        dst[4] = hdr_size >> 24;
+
+        dst[5] = map_size;
+        dst[6] = map_size >> 8;
+        dst[7] = map_size >> 16;
+        dst[8] = map_size >> 24;
+    }
+    return 0;
+}
+
+static
+    rc_t PageMapProcessRequestLock(PageMapProcessRequest *self)
+{
+    rc_t rc = 0;
+    if(self)
+    {
+        /*** no plans to wait here the thread should be released by now ****/
+        rc = KLockAcquire(self->lock);
+        if(rc == 0){
+            if(self->state != ePMPR_STATE_NONE){ /*** thread is not released yet **/
+                assert(0); /** should not happen ***/
+                KLockUnlock(self->lock);
+                rc=RC(rcVDB, rcPagemap, rcConstructing, rcThread, rcBusy);
+            }
+        }
+    }
+    else
+        rc = RC(rcVDB,rcPagemap, rcConstructing, rcSelf, rcNull);
+
+    return rc;
+}
+
+static
+void PageMapProcessRequestLaunch(PageMapProcessRequest *self)
+{
+	KConditionSignal ( self -> cond );
+	KLockUnlock(self -> lock);
+}
+
+rc_t PageMapProcessGetPagemap(const PageMapProcessRequest *cself,struct PageMap **pm)
+{
+	rc_t rc=RC(rcVDB,rcPagemap, rcConstructing, rcSelf, rcNull);
+        if(cself){
+	    PageMapProcessRequest *self=(PageMapProcessRequest*)cself;
+	    if(self->lock == NULL){
+		/** NOT LOCKABLE **/
+		rc=0;
+	    } else if((rc = KLockAcquire ( self->lock ))==0){
+CHECK_AGAIN:
+		switch(self->state){
+		 case ePMPR_STATE_DESERIALIZE_REQUESTED:
+			/*fprintf(stderr,"Waiting for pagemap %p\n",cself->lock);*/
+			rc = KConditionWait ( self -> cond, self -> lock );
+                        goto CHECK_AGAIN;
+		 case ePMPR_STATE_DESERIALIZE_DONE:
+			assert(self->pm);
+			/*fprintf(stderr,"Pagemap %p Used R:%6d|DR:%d|LR:%d\n",self->lock, self->pm->row_count,self->pm->data_recs,self->pm->leng_recs);*/
+			*pm=self->pm;
+			self->pm = NULL;
+			KDataBufferWhack(&self->data);
+			self->row_count = 0;
+			self->state = ePMPR_STATE_NONE;
+			KConditionSignal(self->cond);
+			KLockUnlock(self -> lock);
+			break;
+		case ePMPR_STATE_NONE: /* not requested */
+			KLockUnlock(self -> lock);
+		    rc = 0;
+		    break;
+		 default: /** should never happen ***/
+			assert(0);
+			KLockUnlock(self -> lock);
+			return RC(rcVDB, rcPagemap, rcConverting, rcParam, rcInvalid );
+		}
+	    }
+        }
+        return rc;
+}
+
+
+static
+rc_t VBlobCreateFromData_v2(
+                            VBlob **lhs,
+                            const KDataBuffer *data,
+                            int64_t start_id, int64_t stop_id,
+                            uint32_t elem_bits, PageMapProcessRequest *pmpr
+) {
+    uint64_t ssize = data->elem_count;
+    uint32_t hsize;
+    uint32_t msize;
+    uint32_t offset;
+    VByteOrder byte_order;
+    uint8_t adjust;
+    VBlob *y;
+    uint32_t data_offset;
+    uint32_t pagemap_offset;
+    bitsz_t databits;
+    uint32_t elem_count;
+    uint8_t *src = data->base;
+    rc_t rc;
+    
+    rc = decode_header_v2(src, ssize, &hsize, &msize, &offset, &adjust, &byte_order);
+    if (rc)
+        return rc;
+
+    if (ssize < offset + hsize + msize)
+        return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+    
+    pagemap_offset = offset + hsize;
+    data_offset = pagemap_offset + msize;
+    assert(data_offset <= ssize);
+    ssize -= data_offset;
+    databits = (ssize << 3) - adjust;
+    assert(databits % elem_bits == 0);
+    elem_count = (uint32_t)( databits / elem_bits );
+
+    rc = VBlobNew(&y, start_id, stop_id, NULL);
+    TRACK_BLOB (VBlobNew, y);
+    if (rc == 0) {
+        if (hsize)
+            rc = BlobHeadersCreateFromData(&y->headers, src+offset , hsize);
+        if (rc == 0) {
+            if (msize > 0) {
+                if(pmpr != NULL && PageMapProcessRequestLock(pmpr)==0) {
+                    KDataBufferSub(data, &pmpr->data, pagemap_offset, msize);
+                    pmpr->row_count = BlobRowCount(y);
+                    pmpr->state = ePMPR_STATE_DESERIALIZE_REQUESTED;
+                    /*fprintf(stderr,"Pagemap %p Requested R:%6d|SZ:%d|%ld:%ld\n",pmpr->lock, pmpr->row_count,msize,start_id, stop_id);*/
+                    PageMapProcessRequestLaunch(pmpr);
+                }
+                else {
+                    KDataBuffer tdata;
+                    KDataBufferSub(data, &tdata, pagemap_offset, msize);
+                    rc = PageMapDeserialize(&y->pm, tdata.base,tdata.elem_count, BlobRowCount(y));
+                    KDataBufferWhack(&tdata);
+                }
+            }
+            if (rc == 0) {
+                KDataBufferSub(data, &y->data, data_offset, ssize);
+                y->data.elem_bits = elem_bits;
+                y->data.elem_count = elem_count;
+                y->byte_order = byte_order;
+                *lhs = y;
+                return 0;
+            }
+        }
+        (void)VBlobRelease(y);
+        TRACK_BLOB (VBlobRelease, y);
+    }
+    return rc;
+}
+
+static
+rc_t VBlobCreateFromData_v1(
+                            VBlob **lhs,
+                            const KDataBuffer *data,
+                            int64_t start_id, int64_t stop_id,
+                            uint32_t elem_bits
+) {
+    const uint8_t *src = data->base;
+    uint64_t ssize = data->elem_count;
+    uint8_t header;
+    rc_t rc;
+    VBlob *y;
+    VByteOrder byte_order;
+    uint32_t offset;
+    int adjust;
+    int rls; /* row length size */
+    uint64_t row_len;
+    bitsz_t databits;
+    
+    if (ssize == 0)
+        return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+    
+    header = *src;
+    byte_order = header & 3; header >>= 2;
+    adjust = header & 7;
+    header >>= 3;
+    rls = header & 3;
+    
+    /* convert rls from a code to an actual length */
+    rls = "\x01\x02\x04\x00" [ rls ];
+
+    /* adjust offset */
+    offset = rls + 1;
+
+    /* handle special code where row length is implicitly 1 */
+    if ( rls == 0 )
+        row_len = 1;
+
+    /* ensure sufficient header bytes */
+    else if ( ssize < offset )
+        return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+    else
+    {
+        /* produce little-endian 64-bit row-length */
+        row_len = 0;
+        memmove ( & row_len, & src [ 1 ], rls );
+
+#if __BYTE_ORDER != __LITTLE_ENDIAN
+        /* correct for big-endian */
+        row_len = bswap_64 ( row_len );
+#endif
+    }
+
+    ssize -= offset;
+    databits = (ssize << 3) - adjust;
+    assert(databits % elem_bits == 0);
+
+    rc = VBlobNew(&y, start_id, stop_id, NULL);
+    TRACK_BLOB (VBLobNew, y);
+    if (rc == 0) {
+
+        uint64_t row_count = BlobRowCount ( y );
+
+        /* test for badly formed row-length */
+        if ( rls == 4 )
+        {
+            assert ( row_len != 0 );
+            if ( row_len * row_count != databits / elem_bits )
+            {
+                /* we can fix a length if we know the count */
+                if ( row_count != 0 )
+                    row_len = ( databits / elem_bits ) / row_count;
+                else
+                {
+                    /* rely on code to handle legacy blobs in prod-cmn.c:VFunctionProdCallByteswap */
+                    row_len = 0;
+                }
+            }
+        }
+
+        if ( row_len != 0 )
+            rc = PageMapNewFixedRowLength( &y->pm, row_count, row_len );
+        if (rc == 0) {
+            KDataBufferSub(data, &y->data, offset, ssize);
+            y->data.elem_bits = elem_bits;
+            y->data.elem_count = (uint32_t)( databits / elem_bits );
+            y->byte_order = byte_order;
+			
+            *lhs = y;
+            return 0;
+        }
+        /* like a call to VBlobRelease (y); */
+        TRACK_BLOB (VBlobRelease-free, y);
+        free(y);
+    }
+    return rc;
+}
+
+static void VBlobOptimize_UnRLE_uint8_t(VBlob **vblobp)
+{
+	VBlob   *sblob  = *vblobp;
+	VBlob *vblob;
+	rc_t rc = VBlobNewAsArray(&vblob,sblob -> start_id, sblob -> stop_id,sblob->pm->length[0],sblob->data.elem_bits);
+	if( rc == 0){
+		uint32_t i,j;
+		uint8_t *src=sblob->data.base;
+		uint8_t *dst=vblob->data.base;
+		for(i=j=0;i<sblob->pm->data_recs;i++){
+			row_count_t data_len=sblob->pm->data_run[i];
+			while(data_len > 0){
+				assert(j < sblob->pm->row_count);
+				dst[j++] = src[i];
+				data_len--;
+			}
+		}
+		vblob->pm->optimized = eBlobPageMapOptimizedSucceeded;
+		VBlobRelease(sblob);
+		(*vblobp) = vblob;
+	}
+}
+static void VBlobOptimize_UnRLE_uint16_t(VBlob **vblobp)
+{
+	VBlob   *sblob  = *vblobp;
+	VBlob *vblob;
+	rc_t rc = VBlobNewAsArray(&vblob,sblob -> start_id, sblob -> stop_id,sblob->pm->length[0],sblob->data.elem_bits);
+	if( rc == 0) {
+		uint32_t i,j;
+		uint16_t *src=sblob->data.base;
+		uint16_t *dst=vblob->data.base;
+		for(i=j=0;i<sblob->pm->data_recs;i++){
+			row_count_t data_len=sblob->pm->data_run[i];
+			while(data_len > 0){
+				assert(j < sblob->pm->row_count);
+				dst[j++] = src[i];
+				data_len--;
+			}
+		}
+		vblob->pm->optimized = eBlobPageMapOptimizedSucceeded;
+		VBlobRelease(sblob);
+		(*vblobp) = vblob;
+	}
+}
+static void VBlobOptimize_UnRLE_uint32_t(VBlob **vblobp)
+{
+	VBlob   *sblob  = *vblobp;
+	VBlob *vblob;
+	rc_t rc = VBlobNewAsArray(&vblob,sblob -> start_id, sblob -> stop_id,sblob->pm->length[0],sblob->data.elem_bits);
+	if( rc == 0) {
+		uint32_t i,j;
+		uint32_t *src=sblob->data.base;
+		uint32_t *dst=vblob->data.base;
+		for(i=j=0;i<sblob->pm->data_recs;i++){
+			row_count_t data_len=sblob->pm->data_run[i];
+			while(data_len > 0){
+				assert(j < sblob->pm->row_count);
+				dst[j++] = src[i];
+				data_len--;
+			}
+		}
+		vblob->pm->optimized = eBlobPageMapOptimizedSucceeded;
+		VBlobRelease(sblob);
+		(*vblobp) = vblob;
+	}
+}
+static void VBlobOptimize_UnRLE_uint64_t(VBlob **vblobp)
+{
+	VBlob   *sblob  = *vblobp;
+	VBlob *vblob;
+	rc_t rc = VBlobNewAsArray(&vblob,sblob -> start_id, sblob -> stop_id,sblob->pm->length[0],sblob->data.elem_bits);
+	if( rc == 0) {
+		uint32_t i,j;
+		uint64_t *src=sblob->data.base;
+		uint64_t *dst=vblob->data.base;
+		for(i=j=0;i<sblob->pm->data_recs;i++){
+			row_count_t data_len=sblob->pm->data_run[i];
+			while(data_len > 0){
+				assert(j < sblob->pm->row_count);
+				dst[j++] = src[i];
+				data_len--;
+			}
+		}
+		vblob->pm->optimized = eBlobPageMapOptimizedSucceeded;
+		VBlobRelease(sblob);
+		(*vblobp) = vblob;
+	}
+}
+
+
+void VBlobPageMapOptimize ( VBlob **vblobp)
+{
+	VBlob   *sblob  = *vblobp;
+	PageMap *pm     = sblob->pm;
+	if(pm->optimized != eBlobPageMapOptimizedNone) return; /* do not optimize previously optimized blobs */
+	pm->optimized = eBlobPageMapOptimizedFailed; /*** prevent future optimization if none of the algorithms succeeds ***/
+
+	if(pm->leng_recs == 1)
+    {
+		if( pm->length[0] * sblob->data.elem_bits == 8 /** 1 byte data ***/
+		    &&  pm->data_recs < pm->row_count       /** rle was used ***/
+		    &&  pm->data_recs * 6 > pm->row_count){ /** but not super efficiently **/
+			/*printf("OPTIMIZATION: UnRLE(8)\n");*/
+			VBlobOptimize_UnRLE_uint8_t(vblobp); 
+			return;
+		}
+		if( pm->length[0] * sblob->data.elem_bits == 16 /** 2 byte data ***/
+		    &&  pm->data_recs < pm->row_count       /** rle was used ***/
+		    &&  pm->data_recs * 2 > pm->row_count){ /** but not super efficiently **/
+			/*printf("OPTIMIZATION: UnRLE(16)\n");*/
+			VBlobOptimize_UnRLE_uint16_t(vblobp);
+			return;
+		}
+		if( pm->length[0] * sblob->data.elem_bits == 32 /** 4 byte data ***/
+		    &&  pm->data_recs < pm->row_count       /** rle was used ***/
+		    &&  pm->data_recs * 15 > pm->row_count * 10 ){ /** but not super efficiently **/
+			/*printf("OPTIMIZATION: UnRLE(32)\n");*/
+			VBlobOptimize_UnRLE_uint32_t(vblobp);
+			return;
+		}
+		if( pm->length[0] * sblob->data.elem_bits == 64 /** 8 byte data ***/
+		    &&  pm->data_recs < pm->row_count       /** rle was used ***/
+		    &&  pm->data_recs * 11 > pm->row_count * 10 ){ /** but not super efficiently **/
+			/*printf("OPTIMIZATION: UnRLE(64)\n");*/
+			VBlobOptimize_UnRLE_uint64_t(vblobp);
+			return;
+		}
+
+	}
+
+	if(pm->row_count > 1024 && (sblob->data.elem_bits & 7) == 0)
+    {
+		elem_count_t	minlen,maxlen;
+		elem_count_t	elem_sz = sblob->data.elem_bits/8;
+		rc_t rc = PageMapRowLengthRange(pm, &minlen,&maxlen);
+		if( rc == 0  && maxlen*elem_sz > 2 && maxlen*elem_sz <= 2048 /* do not optimize super large entries */){ 
+		/******* TRY dictionary **/
+			int64_t		limit_vocab_size;
+			uint32_t	vocab_cnt=0;
+			KBTree		*vocab_key2id = NULL;
+			bool		valid_data_run = (pm->row_count != pm->data_recs);
+			uint32_t	*data_offset = NULL;
+			KDataBuffer     new_data;
+
+			rc=KDataBufferMake(&new_data,sblob->data.elem_bits,0); /** no allocation - shoulf not fail at all **/
+			assert(rc==0);
+/*******************
+* another formula
+* the savings should not be less than the waste on pointers into data vocabulary
+* it is assumed that the data offsets will cost us not more than 2 bytes on disk
+* the nasty left part is the average number of bytes in a row
+* limit_vocab_size = ((int64_t)sblob->data.elem_count*elem_sz - 2*pm->row_count) * sblob->data.elem_count / pm->data_recs / elem_sz;
+****************/
+			limit_vocab_size = ((int64_t)sblob->data.elem_count*elem_sz +(valid_data_run?pm->data_recs*2:0) -  2*pm->row_count)
+					   * pm->data_recs / (int64_t)sblob->data.elem_count / elem_sz;
+			
+
+			if(limit_vocab_size <=1 ){
+				rc = RC(rcVDB, rcBlob, rcConstructing, rcId, rcOutofrange);
+			}
+			if(limit_vocab_size > pm->data_recs/4){
+				limit_vocab_size = pm->data_recs/4;  /* to limit the amount of work **/
+			}
+#define MAX_VOCAB_SIZE 2048
+			if(limit_vocab_size > MAX_VOCAB_SIZE) limit_vocab_size=MAX_VOCAB_SIZE;
+			if(rc == 0)
+				rc=KBTreeMakeUpdate(&vocab_key2id, NULL, 256*1024*1024,
+				      false, kbtOpaqueKey,
+				      minlen?minlen*elem_sz:1,maxlen*elem_sz, sizeof ( uint32_t ), NULL);
+			if(rc == 0){
+				uint32_t i,j;
+				uint8_t  *src;
+				uint32_t dst_offset;
+				uint32_t vocab_arr[MAX_VOCAB_SIZE];
+				data_offset = malloc(pm->data_recs * sizeof(*data_offset));
+				if(data_offset == NULL){
+					rc = RC(rcVDB, rcBlob, rcConstructing, rcMemory, rcExhausted);
+				}
+				for(i=j=0,src = sblob->data.base,dst_offset=0;i<pm->leng_recs && rc == 0 ;i++){
+					row_count_t leng_run = pm->leng_run[i];
+					if(pm->length[i] == 0){/*** trivial case, can point anywhere - no vocabulary**/
+						for(;leng_run > 0;j++){
+							row_count_t data_run = valid_data_run?pm->data_run[j]:1;
+							assert(leng_run >= data_run);
+							data_offset[j] = 0; /**  point to offset=0 **/
+							leng_run -=data_run;
+						}
+					} else for(;leng_run > 0 && rc == 0;j++){
+						row_count_t data_run = valid_data_run?pm->data_run[j]:1;
+						bool wasInserted;
+						uint64_t tmp_id = vocab_cnt;
+						assert(leng_run >= data_run);
+						leng_run -=data_run;
+						rc = KBTreeEntry(vocab_key2id, &tmp_id, &wasInserted, src, pm->length[i]*elem_sz);
+						if(rc == 0){
+							if(wasInserted){
+								vocab_cnt++;
+								if(vocab_cnt == limit_vocab_size) {
+									rc = RC(rcVDB, rcBlob, rcConstructing, rcId, rcTooBig);
+								} else {
+									vocab_arr[tmp_id] = dst_offset; /** save offset */
+									data_offset[j]    = dst_offset;
+									rc = KDataBufferResize(&new_data,dst_offset+pm->length[i]);
+									if(rc == 0){
+										memmove((uint8_t*)new_data.base+dst_offset*elem_sz,src,pm->length[i]*elem_sz);
+										dst_offset += pm->length[i];
+									}
+								}
+							} else {
+								assert(vocab_arr[tmp_id] <= dst_offset);
+								data_offset[j] = vocab_arr[tmp_id]; /** retrieve offset **/
+							}
+						}
+						src +=pm->length[i]*elem_sz;
+						assert(src - (uint8_t*)sblob->data.base <= sblob->data.elem_count * elem_sz);
+					}
+				}
+				if(rc == 0 ){
+					PageMap *new_pm;
+					/*printf("OPTIMIZATION LEVEL REACHED: vocab:%d,rows:%d,data_recs:%d\n",vocab_cnt ,pm->row_count,pm->data_recs);*/
+					rc=PageMapToRandomAccess(&new_pm,pm,data_offset); 
+					if(rc == 0){
+						/** DONE ***/
+						VBlob *vblob;
+						rc=VBlobNew(&vblob, sblob->start_id, sblob->stop_id, NULL);
+						if(rc==0){
+							vblob->pm = new_pm;
+							vblob->pm->optimized = eBlobPageMapOptimizedSucceeded;
+							vblob->data = new_data;
+							VBlobRelease(sblob);
+							*vblobp=vblob;
+							free(data_offset);
+							KBTreeRelease(vocab_key2id);
+							return;
+						}
+						PageMapRelease(new_pm);
+						
+					}
+				} else {
+					/*printf("NO OPTIMIZATION: vocab:%d,rows:%d,data_recs:%d\n",vocab_cnt ,pm->row_count,pm->data_recs);*/
+				}
+				if(data_offset) free(data_offset);
+				if(vocab_key2id) KBTreeRelease  ( vocab_key2id );
+			}
+            KDataBufferWhack(&new_data);
+		}
+	}
+
+}
+
+
+rc_t VBlobSerialize ( const VBlob *self, KDataBuffer *result ) {
+    uint64_t sz;
+    rc_t rc;
+    bitsz_t data_bits = KDataBufferBits(&self->data);
+    uint64_t data_bytes = KDataBufferBytes(&self->data);
+    uint32_t row_length;
+    
+    if (self->headers == NULL && (row_length = PageMapHasSimpleStructure(self->pm)) != 0) {
+        rc = KDataBufferResize(result, 5 + data_bytes);
+        if (rc == 0) {
+
+#if _DEBUGGING && 1
+            /* temporary assert that we are setting byte_order properly
+               in the future, we may allow some functions to issue other
+               byte orders, although there is no conceivable reason to do so */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+            assert ( self -> byte_order == vboNative || self -> byte_order == vboLittleEndian );
+#else
+            assert ( self -> byte_order == vboNative || self -> byte_order == vboBigEndian );
+#endif
+#endif
+            rc = encode_header_v1(result->base, result->elem_count, &sz, row_length, data_bits, self->byte_order);
+            if (rc == 0) {
+                memmove(&((uint8_t *)result->base)[sz], self->data.base, data_bytes);
+                result->elem_count = sz + data_bytes;
+            }
+        }
+    }
+    else {
+        KDataBuffer headers;
+        KDataBuffer pagemap;
+        
+        rc = KDataBufferMakeBytes(&headers, 0);
+        if (rc == 0) {
+            if (self->headers)
+                rc = BlobHeadersSerialize(self->headers, &headers, 0, &sz);
+            else
+                sz = 0;
+            if (rc == 0) {
+                headers.elem_count = sz;
+                rc = KDataBufferMakeBytes(&pagemap, 0);
+                if (rc == 0) {
+                    if (self->pm)
+                        rc = PageMapSerialize(self->pm, &pagemap, 0, &sz);
+                    else
+                        sz = 0;
+                    if (rc == 0) {
+                        pagemap.elem_count = sz;
+                        rc = KDataBufferResize(result, 9 + data_bytes + headers.elem_count + pagemap.elem_count);
+                        if (rc == 0) {
+                            rc = encode_header_v2(result->base, result->elem_count, &sz, headers.elem_count, pagemap.elem_count, data_bits);
+                            if (rc == 0) {
+                                memmove(&((uint8_t *)result->base)[sz], headers.base, headers.elem_count);
+                                sz += headers.elem_count;
+                                memmove(&((uint8_t *)result->base)[sz], pagemap.base, pagemap.elem_count);
+                                sz += pagemap.elem_count;
+                                memmove(&((uint8_t *)result->base)[sz], self->data.base, data_bytes);
+                                result->elem_count = sz + data_bytes;
+                            }
+                        }
+                    }
+                    KDataBufferWhack(&pagemap);
+                }
+            }
+        }
+        KDataBufferWhack(&headers);
+    }
+    
+    return rc;
+}
+
+rc_t VBlobCreateFromData ( struct VBlob **lhs,
+                         int64_t start_id, int64_t stop_id,
+                         const KDataBuffer *src,
+                         uint32_t elem_bits , PageMapProcessRequest const *pmpr)
+{
+    VBlob *y = NULL;
+    rc_t rc;
+    
+    assert(lhs);
+    assert(src);
+    assert(src->elem_bits == 8);
+    assert(src->bit_offset == 0);
+
+    *lhs = 0;
+
+    if ((((const uint8_t *)src->base)[0] & 0x80) == 0)
+        rc = VBlobCreateFromData_v1(&y, src, start_id, stop_id, elem_bits);
+    else
+        rc = VBlobCreateFromData_v2(&y, src, start_id, stop_id, elem_bits, (PageMapProcessRequest*)pmpr);
+
+    if (rc == 0)
+        *lhs = y;
+
+    return rc;
+}
+
+rc_t VBlobCreateFromSingleRow (
+			      struct VBlob **lhs,
+			      int64_t start_id, int64_t stop_id,
+			      const KDataBuffer *src,
+			      VByteOrder byte_order )
+{
+    VBlob *y;
+    rc_t rc;
+    
+    rc = VBlobNew(&y, start_id, stop_id, NULL);
+    TRACK_BLOB (VBlobNew, y);
+    if (rc == 0) {
+        assert(src->elem_count >> 32 == 0);
+        rc = PageMapNewSingle(&y->pm, BlobRowCount(y), (uint32_t)src->elem_count);
+        if (rc == 0) {
+            rc = KDataBufferSub(src, &y->data, 0, UINT64_MAX);
+            if (rc == 0) {
+                y->byte_order = byte_order;
+                *lhs = y;
+                return 0;
+            }
+        }
+        /* should add a release/free? */
+    }
+    return rc;
+}
+
+bool VBlobIsSingleRow( const struct VBlob *self ) {
+    return (self->pm && self->pm->data_recs==1) ? true : false;
+}
+
+uint32_t VBlobFixedRowLength( const struct VBlob *self ) {
+    return self->pm ? PageMapFixedRowLength(self->pm) : 0;
+}
+
+#define COMPARE(FORCE, BITS, DBASE, DOFF, SBASE, SOFF, LENGTH) \
+    (((FORCE == 0) || (BITS & 7) != 0) ? ( \
+        bitcmp(DBASE, DOFF * BITS + FORCE, SBASE, SOFF * BITS, LENGTH * BITS)) : ( \
+        memcmp(((const char *)DBASE)+((DOFF * BITS) >> 3), \
+               ((const char *)SBASE)+((SOFF * BITS) >> 3), \
+               ((LENGTH * BITS) >> 3))))
+
+#define COPY(FORCE, BITS, DBASE, DOFF, SBASE, SOFF, LENGTH) \
+    (((FORCE == 0) || (BITS & 7) != 0) ? ( \
+        bitcpy(DBASE, DOFF * BITS + FORCE, SBASE, SOFF * BITS, LENGTH * BITS)) : ( \
+        (void)memmove(((      char *)DBASE)+((DOFF * BITS) >> 3), \
+               ((const char *)SBASE)+((SOFF * BITS) >> 3), \
+               ((LENGTH * BITS) >> 3))))
+
+rc_t VBlobAppendRow(VBlob *self,
+                    elem_count_t *last_offset,
+                    elem_count_t *last_length,
+                    const KDataBuffer *src,
+                    elem_count_t offset,
+                    elem_count_t length,
+                    row_count_t repeat_count
+                    )
+{
+    rc_t rc;
+    
+    if (!PageMapHasRows(self->pm) || length != *last_length ||
+        COMPARE(self->data.bit_offset, self->data.elem_bits,
+                self->data.base, *last_offset,
+                src->base, offset,
+                length) != 0
+        )
+    {
+        *last_offset = self->data.elem_count;
+        rc = KDataBufferResize(&self->data, *last_offset + length);
+        if (rc == 0) {
+            COPY(self->data.bit_offset, self->data.elem_bits,
+                 self->data.base, *last_offset,
+                 src->base, offset, length);
+            rc = PageMapAppendRows(self->pm, length, repeat_count, false);
+        }
+        *last_length = length;
+    }
+    else
+        rc = PageMapAppendRows(self->pm, length, repeat_count, true);
+    
+    return rc;
+}
+
+static rc_t VBlobGetLastRow(VBlob *self, elem_count_t *offset, elem_count_t *length) {
+    
+    *length = PageMapLastLength(self->pm);
+    *offset = self->data.elem_count - *length;
+
+    return 0;
+}
+
+rc_t VBlobAppend(VBlob *self, const VBlob *other) {
+    rc_t rc;
+    row_count_t offset;
+    row_count_t length;
+    
+    if (self->headers)
+        return RC(rcVDB, rcBlob, rcConcatenating, rcSelf, rcInconsistent);
+    if (other->headers)
+        return RC(rcVDB, rcBlob, rcConcatenating, rcParam, rcInvalid);
+
+    if (self->stop_id + 1 != other->start_id)
+        return RC(rcVDB, rcBlob, rcConcatenating, rcId, rcOutofrange);
+
+    if (other->data.elem_bits != self->data.elem_bits)
+        return RC(rcVDB, rcBlob, rcConcatenating, rcData, rcInvalid);
+
+#if 0
+    fprintf(stderr, "appending %u(%u) (length: %u) to %u(%u) (length: %u) %s\n",
+            (unsigned)other->start_id, (unsigned)BlobRowCount(other),
+            (unsigned)other->data.elem_count,
+            (unsigned)self->start_id, (unsigned)BlobRowCount(self),
+            (unsigned)self->data.elem_count,
+            self->name);
+#endif
+    
+    rc = VBlobGetLastRow(self, &offset, &length);
+    if (rc == 0) {
+        PageMapIterator iter;
+        
+        rc = PageMapNewIterator(other->pm, &iter, 0, -1);
+        if (rc == 0) {
+            KDataBuffer orig;
+            
+            rc = KDataBufferMakeWritable(&self->data , &orig);
+            if (rc == 0) {
+                row_count_t row_count;
+                KDataBufferWhack(&self->data);
+                self->data = orig;
+                do {
+                    row_count = PageMapIteratorRepeatCount(&iter);
+                    rc = VBlobAppendRow(self, &offset, &length, &other->data,
+                                        PageMapIteratorDataOffset(&iter),
+                                        PageMapIteratorDataLength(&iter),
+                                        row_count);
+                } while (rc == 0 && PageMapIteratorAdvance(&iter, row_count));
+                if (rc == 0) {
+                    self->stop_id = other->stop_id;
+                    self->no_cache |= other->no_cache;
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+rc_t VBlobSubblob( const struct VBlob *self,struct VBlob **sub, int64_t start_id )
+{
+    rc_t rc;
+    KDataBuffer  kd;
+    PageMapIterator pmi;
+    
+    if (start_id < self->start_id || start_id > self->stop_id)
+        return RC(rcVDB, rcBlob, rcConverting, rcId, rcOutofrange);
+    
+    rc=PageMapNewIterator(self->pm,&pmi, 0, -1);
+    if(rc == 0){
+        if(PageMapIteratorAdvance(&pmi,start_id-self->start_id)){
+            row_count_t numrep = PageMapIteratorRepeatCount(&pmi);
+            elem_count_t offset = PageMapIteratorDataOffset(&pmi);
+            elem_count_t length = PageMapIteratorDataLength(&pmi);
+            
+#if 0
+            fprintf(stderr, "splitting %u(%u) (offset: %u, length: %u) from %s\n",
+                    (unsigned)start_id, (unsigned)numrep,
+                    (unsigned)offset, (unsigned)length,
+                    self->name);
+#endif
+            if (numrep == 0){
+                return RC(rcVDB, rcBlob, rcConverting, rcRow, rcEmpty);
+            }
+            
+            rc = KDataBufferSub(&self->data, &kd, offset, length);
+            if(rc == 0){
+                int64_t	stop_id;
+
+                stop_id = start_id + numrep - 1;
+
+                rc = VBlobCreateFromSingleRow(sub, start_id, stop_id, &kd, self->byte_order);
+                KDataBufferWhack(&kd);
+            }
+        } else {
+            rc = RC(rcVDB, rcBlob, rcConverting, rcId, rcOutofrange);
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VBlobIdRange ( const VBlob *self,
+    int64_t *first, uint64_t *count )
+{
+    rc_t rc;
+
+    if ( first == NULL && count == NULL )
+        rc = RC ( rcVDB, rcBlob, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcBlob, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            if ( first != NULL )
+                * first = self -> start_id;
+            if ( count != NULL )
+                * count = self -> stop_id + 1 - self -> start_id;
+            return 0;
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VBlobCellData ( const VBlob *self, int64_t row_id,
+    uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len )
+{
+    rc_t rc;
+    uint32_t dummy [ 3 ];
+
+    if ( elem_bits == NULL )
+        elem_bits = & dummy [ 0 ];
+    if ( boff == NULL )
+        boff = & dummy [ 1 ];
+    if ( row_len == NULL )
+        row_len = & dummy [ 2 ];
+
+    if ( base == NULL )
+        rc = RC ( rcVDB, rcBlob, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcBlob, rcAccessing, rcSelf, rcNull );
+        else if ( row_id < self -> start_id || self -> stop_id < row_id )
+            rc = RC ( rcVDB, rcBlob, rcAccessing, rcRange, rcInvalid );
+        else
+        {
+            uint64_t start;
+
+            /* TBD - this may be wrong */
+            * elem_bits = self -> data . elem_bits;
+            * row_len = PageMapGetIdxRowInfo ( self -> pm, ( uint32_t ) ( row_id - self -> start_id ), boff, NULL );
+            start = ( uint64_t ) boff [ 0 ] * elem_bits [ 0 ];
+            * base = ( uint8_t* ) self -> data . base + ( start >> 3 );
+            * boff = ( uint32_t ) start & 7;
+
+            return 0;
+        }
+
+        * base = NULL;
+    }
+
+    * elem_bits = * boff = * row_len = 0;
+
+    return rc;
+}
+
+/* a copy of VCursorRead() */
+LIB_EXPORT rc_t CC VBlobRead ( const VBlob *self, int64_t row_id,
+    uint32_t elem_bits, void *buffer, uint32_t blen, uint32_t *row_len )
+{
+    rc_t rc = 0;
+    const void* base = NULL;
+    uint32_t boff = 0;
+    uint32_t elem_size = 0;
+    uint64_t to_read = 0;
+    uint64_t bsize = 0;
+
+    if ( self == NULL )
+    {   return RC ( rcVDB, rcBlob, rcReading, rcSelf, rcNull ); }
+
+    if ( buffer == NULL || row_len == NULL )
+    {   return RC ( rcVDB, rcBlob, rcReading, rcParam, rcNull ); }
+
+    if ( elem_bits == 0 || ( elem_bits & 7 ) != 0 )
+    {   return RC ( rcVDB, rcCursor, rcReading, rcParam, rcInvalid ); }
+
+    rc = VBlobCellData ( self, row_id, &elem_size, &base, &boff, row_len );
+    if ( rc != 0 )
+    {   return rc; }
+    if ( elem_size < elem_bits && elem_bits % elem_size != 0 )
+    {   return RC ( rcVDB, rcCursor, rcReading, rcType, rcInconsistent ); }
+    if ( elem_size > elem_bits && elem_size % elem_bits != 0 )
+    {   return RC ( rcVDB, rcCursor, rcReading, rcType, rcInconsistent ); }
+    if ( * row_len == 0 )
+    {   return 0; }
+    if ( blen == 0 )
+    {   return RC ( rcVDB, rcCursor, rcReading, rcBuffer, rcInsufficient ); }
+
+    to_read = * row_len * elem_size;
+    bsize = blen * elem_bits;
+
+    /* always return the required buffer size */
+    * row_len = ( uint32_t ) ( to_read / elem_bits );
+
+    /* detect buffer too small */
+    if ( to_read > bsize ) {
+        rc = RC ( rcVDB, rcCursor, rcReading, rcBuffer, rcInsufficient );
+        to_read = bsize;
+    }
+
+    /* copy out data up to limit */
+    assert ( boff == 0 );
+    memmove ( buffer, base, ( size_t ) ( to_read >> 3 ) );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VBlobReadBits ( const VBlob *self, int64_t row_id,
+    uint32_t elem_bits, uint32_t start, void *buffer, uint32_t off,
+    uint32_t blen, uint32_t *num_read, uint32_t *remaining )
+{
+    rc_t rc = 0;
+    const void* base = NULL;
+    uint32_t boff = 0;
+    uint32_t elem_size = 0;
+    uint64_t to_read = 0;
+    uint64_t bsize = 0;
+    uint32_t row_len = 0;
+    uint32_t dummy;
+    if ( remaining == NULL )
+    {   remaining = & dummy; }
+
+    if ( self == NULL )
+    {   return RC ( rcVDB, rcBlob, rcReading, rcSelf, rcNull ); }
+
+    if ( buffer == NULL || num_read == NULL )
+    {   return RC ( rcVDB, rcBlob, rcReading, rcParam, rcNull ); }
+
+    if ( elem_bits == 0 || ( elem_bits & 7 ) != 0  )
+    {   return RC ( rcVDB, rcBlob, rcReading, rcParam, rcInvalid ); }
+
+    rc = VBlobCellData ( self, row_id, &elem_size, &base, &boff, &row_len );
+    if ( rc != 0 )
+    {   return rc; }
+    if ( elem_size < elem_bits && elem_bits % elem_size != 0 )
+    {   return RC ( rcVDB, rcCursor, rcReading, rcType, rcInconsistent ); }
+    if ( elem_size > elem_bits && elem_size % elem_bits != 0 )
+    {   return RC ( rcVDB, rcCursor, rcReading, rcType, rcInconsistent ); }
+    if ( row_len == 0 ) {
+        * num_read = * remaining = 0;
+        return 0;
+    }
+    if ( * num_read == 0 )
+    {   return 0; }
+    to_read = row_len * elem_size;
+    bsize = blen * elem_bits;
+
+    if ( blen == 0 ) {
+        * num_read = 0;
+        * remaining = ( uint32_t ) ( to_read / elem_bits );
+        return 0;
+    }
+    bsize = blen * elem_size;
+    if ( to_read <= bsize )
+    {   * remaining = 0; }
+    else {
+        * remaining = (uint32_t)( ( to_read - bsize ) / elem_bits );
+        to_read = bsize;
+    }
+    bitcpy ( buffer, off, base, boff, ( bitsz_t ) to_read );
+    * num_read = ( uint32_t ) ( to_read / elem_bits );
+
+    return rc;
+}
+
+#undef VBlobAddRef
+#undef VBlobRelease
+
+LIB_EXPORT rc_t CC VBlobAddRef ( const VBlob *self )
+{
+    if ( self != NULL )
+        KRefcountAdd(&self->refcount, "VBlob");
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VBlobRelease ( const VBlob *self )
+{
+    rc_t rc = 0;
+
+    if ( self != 0 )
+    {
+        switch ( KRefcountDrop(&self->refcount, "VBlob") )
+        {
+        case krefWhack:
+            return VBlobDestroy ( (VBlob*) self );
+        case krefNegative:
+            rc = RC (rcVDB, rcBlob, rcDestroying, rcBlob, rcExcessive);
+            PLOGERR ( klogInt, (klogInt, rc, "Released a blob $(B) with no more references",
+                      PLOG_P(self)));
+            break;
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VBlobSize ( const VBlob * self, size_t * bytes )
+{
+    rc_t rc;
+
+    if ( bytes == NULL )
+        rc = RC ( rcVDB, rcBlob, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcBlob, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            const PageMap * pm = self -> pm;
+            size_t blob_size = sizeof * self + KDataBufferBytes ( & self -> data );
+            if ( self -> pm != NULL )
+            {
+                blob_size += KDataBufferBytes ( & pm -> cstorage )
+                          +  KDataBufferBytes ( & pm -> dstorage )
+                          +  KDataBufferBytes ( & pm -> istorage )
+                          ;
+            }
+
+            * bytes = blob_size;
+            return 0;
+        }
+
+        * bytes = 0;
+    }
+
+    return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * VBlobCache
+ */
+typedef struct VBlobCache VBlobCache;
+struct VBlobCache
+{
+    DLNode ln;
+    size_t size;
+    const VBlob *blob;
+    uint32_t col_idx;
+};
+
+static
+rc_t VBlobCacheWhack (uint64_t start_id, const void *n, void *ignore )
+{
+    VBlobCache *self = ( VBlobCache* ) n;
+    assert(start_id == self->blob->start_id); 
+    VBlobRelease ( ( VBlob* ) self -> blob );
+    free ( self );
+    return 0;
+}
+
+static
+rc_t VBlobCacheMake ( VBlobCache **bcp, const VBlob *blob, uint32_t col_idx, size_t blob_size )
+{
+    VBlobCache *bc = malloc ( sizeof * bc );
+    if ( bc == NULL )
+        return RC ( rcVDB, rcCursor, rcReading, rcMemory, rcExhausted );
+
+    bc -> size = blob_size;
+    bc -> blob = blob;
+    bc -> col_idx = col_idx;
+    VBlobAddRef(blob);
+    * bcp = bc;
+    return 0;
+}
+
+typedef struct VBlobLast {
+	const VBlob *b1;
+	const VBlob *b2;
+} VBlobLast;
+
+struct VBlobMRUCache { /* read-only blob cache */
+    Vector v_cache; /*** cache VDB columns ***/
+    Vector p_cache; /*** cache physical columns ***/
+    DLList lru;
+    size_t capacity;
+    size_t contents;
+    /* last blob cache */
+    VBlobLast v_last[LAST_BLOB_CACHE_SIZE]; /** last blob to be cached per given col_idx, limiting col_idx  **/
+    VBlobLast p_last[LAST_BLOB_CACHE_SIZE]; /** last physical blob to be cached per given col_idx, limiting col_idx  **/
+	bool suspend_flush;
+};
+
+
+VBlobMRUCache * VBlobMRUCacheMake(uint64_t capacity )
+{
+    VBlobMRUCache *self = NULL;
+    if(capacity > 0){
+	self = malloc(sizeof(*self));
+        if(self){
+		VectorInit ( & self -> v_cache, 1, 16);
+		VectorInit ( & self -> p_cache, 1, 16);
+		DLListInit ( & self -> lru );
+		memset(self -> v_last,0,LAST_BLOB_CACHE_SIZE*sizeof(*self -> v_last));
+		memset(self -> p_last,0,LAST_BLOB_CACHE_SIZE*sizeof(*self -> p_last));
+		self->capacity = capacity;
+		self->contents = 0;
+		self->suspend_flush = false;
+	}
+   }
+   return self;
+}
+
+void VBlobMRUCacheItemDestroy( void *item, void *data )
+{
+    if ( item != NULL ) {
+	KVectorVisitPtr (item, false, VBlobCacheWhack, data );
+	KVectorRelease(item);
+    }
+}
+
+
+void VBlobMRUCacheDestroy( VBlobMRUCache *self )
+{
+    if(self){
+	int i;
+	VectorWhack ( & self -> v_cache, VBlobMRUCacheItemDestroy, NULL );
+	VectorWhack ( & self -> p_cache, VBlobMRUCacheItemDestroy, NULL );
+	DLListInit ( & self -> lru );
+	for(i=0;i<LAST_BLOB_CACHE_SIZE;i++){
+	    VBlobRelease(self -> p_last[i].b1);
+	    VBlobRelease(self -> p_last[i].b2);
+	    VBlobRelease(self -> v_last[i].b1);
+	    VBlobRelease(self -> v_last[i].b2);
+	}
+	free(self);
+    }
+}
+
+static VBlobCache * find_in_kvector(const KVector *cself,int64_t id)
+{
+	VBlobCache *bc;
+	int64_t     id_prev;
+	rc_t rc=KVectorGetPrevPtr(cself,(uint64_t*)&id_prev,(uint64_t)id+1,(void**)&bc);
+	if(rc == 0 && bc){
+		assert(bc->blob->start_id == id_prev );
+		assert(bc->blob->start_id <= id);
+		if( id >= bc->blob->start_id && id <= bc->blob->stop_id){
+			return bc;
+		}
+	} 
+	return NULL;
+}
+
+const VBlob* VBlobMRUCacheFind(const VBlobMRUCache *cself, uint32_t col_idx, int64_t row_id)
+{
+    VBlobMRUCache *self = (VBlobMRUCache*)cself;
+    const VBlob* blob;
+    KVector  *cache;
+    bool    is_phys=false;
+    VBlobLast   *last_blobs;
+
+    if(col_idx > PHYSPROD_INDEX_OFFSET){
+	is_phys=true;
+	last_blobs = self->p_last;
+	col_idx -= PHYSPROD_INDEX_OFFSET;
+    } else {
+	is_phys=false;
+	last_blobs = self->v_last;
+    } 
+
+    if(col_idx <= LAST_BLOB_CACHE_SIZE){
+	blob = last_blobs[col_idx-1].b1;
+	if(blob && row_id >= blob->start_id && row_id <= blob->stop_id){
+		return blob;
+	}
+	blob = last_blobs[col_idx-1].b2;
+	if(blob && row_id >= blob->start_id && row_id <= blob->stop_id){
+		last_blobs[col_idx-1].b2 = last_blobs[col_idx-1].b1;
+		last_blobs[col_idx-1].b1 = blob;
+		return blob;
+	}
+    }
+    cache = is_phys?VectorGet(&cself->p_cache,col_idx):VectorGet(&cself->v_cache,col_idx);
+    if(cache) {
+	    /* check cache for entry */
+	    VBlobCache *bc = find_in_kvector ( cache, row_id );
+	    if ( bc != NULL )
+	    {
+		/* save in MRU */
+		if(col_idx <= LAST_BLOB_CACHE_SIZE) {
+			if(last_blobs[col_idx-1].b2) VBlobRelease(last_blobs[col_idx-1].b2);
+			last_blobs[col_idx-1].b2 = last_blobs[col_idx-1].b1;
+			last_blobs[col_idx-1].b1 = bc->blob;
+			if(VBlobAddRef ((VBlob*)bc->blob)!=0)
+				return NULL;
+		}
+		/* maintain LRU */
+		DLListUnlink  (&self->lru,&bc->ln);
+		DLListPushHead(&self->lru,&bc->ln);
+		/* ask column to read from blob */
+		return bc->blob;
+	    }
+    }
+    return NULL;
+}
+
+static rc_t  insert_unique_into_kvector(VBlobMRUCache *self,KVector *cache,int64_t id, const VBlobCache *bc, VBlobCache **existing)
+{
+	rc_t rc=KVectorGetPtr(cache,id,(void**)existing);
+	if(rc == 0 && *existing){ /*found*/
+
+		assert(existing[0]->blob->start_id == bc->blob->start_id);
+		if(existing[0]->blob->stop_id < bc->blob->stop_id){/** new blob is bigger - replace with ned blob **/
+			DLListUnlink  (&self->lru,&(existing[0]->ln));
+			VBlobCacheWhack (existing[0]->blob->start_id, existing[0], NULL );
+		} else {
+			return RC ( rcVDB, rcVector, rcInserting, rcBlob, rcExists );
+		}
+	}
+        return KVectorSetPtr(cache,id,bc);
+}
+
+
+rc_t VBlobMRUCacheSave(const VBlobMRUCache *cself, uint32_t col_idx, const VBlob *blob)
+{
+    rc_t   rc;
+    size_t blob_size =sizeof(VBlobCache) + sizeof(VBlob);
+    VBlobCache *bc=NULL;
+    VBlobMRUCache *self = (VBlobMRUCache*)cself;
+
+    if(blob->no_cache) return 0;
+
+    blob_size  += KDataBufferBytes(&blob->data);
+    if (blob->pm != NULL) {
+        blob_size += 
+                  KDataBufferBytes(&blob->pm->cstorage)
+                + KDataBufferBytes(&blob->pm->dstorage)
+                + KDataBufferBytes(&blob->pm->istorage);
+    }
+    /** auto-raise capacity for large blob **/
+    if(blob_size > self -> capacity) self -> capacity = blob_size;
+
+    
+
+    /* now cache the blob */
+    rc = VBlobCacheMake ( & bc, blob, col_idx, blob_size );
+    if ( rc == 0 ) {
+        /* attempt a unique insertion */
+        VBlobCache *existing;
+        KVector *cache;
+        VBlobLast   *last_blobs;
+
+	if(col_idx > PHYSPROD_INDEX_OFFSET){
+		last_blobs = self->p_last;
+		col_idx -= PHYSPROD_INDEX_OFFSET;
+		cache = VectorGet(&cself->p_cache,col_idx);
+		if(cache==NULL){
+			KVectorMake(&cache);
+			VectorSet(&self->p_cache,col_idx,cache);
+		}
+	} else {
+		last_blobs = self->v_last;
+		cache = VectorGet(&cself->v_cache,col_idx);
+		if(cache==NULL){
+			KVectorMake(&cache);
+			VectorSet(&self->v_cache,col_idx,cache);
+		}
+	}
+	
+        rc = insert_unique_into_kvector(self,cache,bc->blob->start_id,bc,&existing);
+        if ( rc != 0 ){
+            VBlobCacheWhack (bc->blob->start_id, bc, NULL );
+			rc = 0;
+		} else {
+				/* remember as last used  **/
+			if(col_idx <= LAST_BLOB_CACHE_SIZE) {
+				if(last_blobs[col_idx-1].b2) VBlobRelease(last_blobs[col_idx-1].b2);
+				last_blobs[col_idx-1].b2 = last_blobs[col_idx-1].b1;
+				last_blobs[col_idx-1].b1 = bc->blob;
+				rc = VBlobAddRef ((VBlob*)bc->blob);
+				if(rc != 0)
+				   return rc;
+			}
+			/* perform accounting */
+			self -> contents += blob_size;
+			if(!self->suspend_flush) while ( self -> contents > self -> capacity )
+			{
+				/* get least recently used */
+				DLNode *last = DLListPopTail ( & self -> lru );
+				if ( last == NULL )
+						break;
+				/* drop blob */
+				existing = ( VBlobCache* ) last;
+				if(existing->col_idx > PHYSPROD_INDEX_OFFSET){
+					cache = VectorGet(&cself->p_cache,existing->col_idx-PHYSPROD_INDEX_OFFSET);
+				} else {
+					cache = VectorGet(&cself->v_cache,existing->col_idx);
+				}
+				KVectorUnset(cache,existing->blob->start_id);
+				self -> contents -= existing -> size;
+				VBlobCacheWhack (existing->blob->start_id,existing,NULL);
+			}
+			/* insert at head of list */
+			DLListPushHead ( & self -> lru, & bc -> ln ); 
+		}
+    }
+    return 0;
+}
+
+uint64_t VBlobMRUCacheGetCapacity(const VBlobMRUCache *cself)
+{
+	if(cself){
+		return cself->capacity;
+	}
+	return 0;
+}
+uint64_t VBlobMRUCacheSetCapacity(VBlobMRUCache *self,uint64_t capacity )
+{
+	uint64_t old_capacity=0;
+	if(self){
+		old_capacity = self->capacity;
+		self->capacity=capacity;
+	}
+	return old_capacity;
+}
+void VBlobMRUCacheSuspendFlush(VBlobMRUCache *self)
+{
+	self->suspend_flush=true;
+}
+	
+void VBlobMRUCacheResumeFlush(VBlobMRUCache *self)
+{
+	self->suspend_flush=false;
+}
+
diff --git a/libs/vdb/blob.h b/libs/vdb/blob.h
new file mode 100644
index 0000000..860e7c8
--- /dev/null
+++ b/libs/vdb/blob.h
@@ -0,0 +1,84 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_blob_
+#define _h_blob_
+
+#ifndef _h_vdb_extern_
+ #include <vdb/extern.h>
+#endif
+
+#ifndef _h_blob_priv_
+ #include "blob-priv.h"
+#endif
+
+struct VBlobBuffer;
+struct VRowBuffer;
+
+enum VBlobVariant_t {
+    vbvBlobbed,
+    vbvRowBuffer,
+    vbvSingleRow
+};
+
+
+/* Write the row lengths for the rows from start_id thru stop_id, inclusive
+ */
+rc_t VBlobWritePageMap( VBlob *self, int64_t start_id, int64_t stop_id, const uint32_t row_length[] );
+
+/* Read (copy out) the row lengths for the rows from start_id thru stop_id, inclusive
+ */
+rc_t VBlobReadPageMap( const VBlob *self, int64_t start_id, int64_t stop_id, uint32_t row_length[] );
+
+/* Change the shape of the databuffer.
+ *
+ * This function does not resize the buffer; it changes how it is
+ * interpreted, i.e. it is a typecast.
+ * The quantity ((bits per element) * (# elements)) remains the same.
+ *
+ * new bits = bits * bits_mult / bits_div
+ * new #elements = #elements * bits_div / bits_mult
+ * 
+ */
+rc_t VBlobBufferReshape( struct VBlobBuffer *self, int bits_mult, int bits_div );
+
+/* Turn a raw blob into a page buffer
+ *
+ * This is essentially a type-cast.
+ */
+rc_t VBlobMakeRowBuffer( struct VRowBuffer **lhs,
+                         const VBlob *cself
+);
+
+/* Serialize
+ *
+ * Get a blob serialized into a new data buffer.
+ * Whack this when done with it.
+ */
+rc_t VBlobSerialize(const VBlob *cself, KDataBuffer *result);
+
+
+#endif /* _h_blob_ */
diff --git a/libs/vdb/cast.c b/libs/vdb/cast.c
new file mode 100644
index 0000000..0718ec9
--- /dev/null
+++ b/libs/vdb/cast.c
@@ -0,0 +1,583 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vdb/extern.h> 
+
+#include "xform-priv.h"
+#include "blob-priv.h"
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <arch-impl.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <float.h>
+#include <string.h>
+#include <assert.h>
+
+/* copy
+ *  just perform an addref on input blob
+ */
+static
+rc_t CC copy ( void *self, const VXformInfo *info, int64_t row_id,
+    VBlob **rslt, uint32_t argc, const VBlob *argv [] )
+{
+    * rslt = ( VBlob* ) argv [ 0 ];
+    (void)VBlobAddRef (*rslt );
+    return 0;
+}
+
+/* casting object
+ *  uses a three-step process for converting:
+ *  1. read source into canonical fmt
+ *  2. convert domains as required
+ *  3. write from canonical fmt to dest
+ */
+typedef struct Cast Cast;
+struct Cast
+{
+    /* read source to canonical fmt */
+    union
+    {
+        int ( * num ) ( const void *src, void *dst );
+        int ( * chr ) ( uint32_t *ch, const void *begin, const void *end );
+    } read;
+
+    /* transform from one domain to another */
+    union
+    {
+        rc_t ( * num ) ( const void *src, void *dst );
+    } convert;
+
+    /* write from canonical fmt to destination */
+    union
+    {
+        int ( * num ) ( const void *src,  void *dst );
+        int ( * chr ) ( void *begin, void *end, uint32_t ch );
+    } write;
+
+    /* intrinsic dim of source */
+    uint32_t intrinsic_dim;
+
+    /* intrinsic sizes of src and dst */
+    uint32_t src_bits, dst_bits;
+};
+
+static
+rc_t CC cast_num ( void *data, const VXformInfo *info,
+    void *dst, const void *src, uint64_t elem_count )
+{
+    const Cast *self = ( const void* ) data;
+
+    /* since we are performing intrinsic-level operations,
+       convert the array length into intrinsic count */
+    uint32_t i;
+    uint64_t count = elem_count * self -> intrinsic_dim;
+
+    /* treat source and destination as byte pointers */
+    int bytes;
+    uint8_t *dp = dst;
+    const uint8_t *sp = src;
+
+    /* read and conversion buffers */
+    union { int64_t i64; uint64_t u64; double f64; } buff [ 2 ];
+
+    /* loop without conversion */
+    if ( self -> convert . num == NULL )
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            /* read into canonical fmt */
+            bytes = ( * self -> read . num ) ( sp, & buff [ 0 ] );
+            sp += bytes;
+
+            /* write into destination fmt */
+            bytes = ( * self -> write . num ) ( & buff [ 0 ], dp );
+            if ( bytes < 0 )
+                return RC ( rcVDB, rcType, rcCasting, rcRange, rcExcessive );
+            dp += bytes;
+        }
+    }
+
+    /* loop with conversion */
+    else
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            rc_t rc;
+
+            /* read into canonical fmt */
+            bytes = ( * self -> read . num ) ( sp, & buff [ 0 ] );
+            sp += bytes;
+
+            /* convert domains */
+            rc = ( * self -> convert . num ) ( & buff [ 0 ], & buff [ 1 ] );
+            if ( rc != 0 )
+                return rc;
+
+            /* write into destination fmt */
+            bytes = ( * self -> write . num ) ( & buff [ 1 ], dp );
+            if ( bytes < 0 )
+                return RC ( rcVDB, rcType, rcCasting, rcRange, rcExcessive );
+            dp += bytes;
+        }
+    }
+
+    return 0;
+}
+
+static
+rc_t resize_dst ( KDataBuffer *dst, uint8_t **dpos, uint8_t **dend,
+    const uint8_t *sbase, const uint8_t *spos, const uint8_t *send )
+{
+    size_t offset = * dpos - ( uint8_t* ) dst -> base;
+    double expand = ( double ) ( send - sbase ) / ( spos - sbase );
+    rc_t rc = KDataBufferResize ( dst, ( uint32_t ) ( expand * offset ) + 32 );
+    if ( rc == 0 )
+    {
+        * dpos = & ( ( uint8_t* ) dst -> base ) [ offset ];
+        * dend = & ( ( uint8_t* ) dst -> base ) [ dst -> elem_count ];
+    }
+    return rc;
+}
+
+static
+rc_t CC cast_chr ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const Cast *self = ( const void* ) data;
+
+    int bytes;
+    uint32_t buff [ 2 ];
+    uint8_t *dpos, *dend;
+    const uint8_t *sbase, *spos, *send;
+
+    /* determine source boundaries */
+    sbase = argv [ 0 ] . u . data . base;
+    sbase += (size_t)argv [ 0 ] . u . data . first_elem *
+        argv [ 0 ] . u . data . elem_bits >> 3;
+    send = & sbase [ (size_t)argv [ 0 ] . u . data . elem_count *
+        argv [ 0 ] . u . data . elem_bits >> 3 ];
+    spos = sbase;
+
+    /* resize the destination blob */
+    rc = KDataBufferCast ( rslt -> data, rslt -> data, 8, true );
+    if ( rc == 0 )
+        rc = KDataBufferResize ( rslt -> data, (uint32_t)( send - sbase ) );
+    if ( rc != 0 )
+        return rc;
+
+    /* get the destination boundaries */
+    dpos = rslt -> data -> base;
+    dend = dpos + rslt -> data -> elem_count;
+    assert ( rslt -> data -> bit_offset == 0 );
+
+    while ( spos < send )
+    {
+        /* read into utf32 */
+        bytes = ( * self -> read . chr ) ( & buff [ 0 ], spos, send );
+        if ( bytes <= 0 )
+            return RC ( rcVDB, rcType, rcCasting, rcData, rcCorrupt );
+        spos += bytes;
+
+        /* write into destination */
+        bytes = ( * self -> write . chr ) ( dpos, dend, buff [ 0 ] );
+        if ( bytes <= 0 )
+        {
+            if ( bytes < 0 )
+                return RC ( rcVDB, rcType, rcCasting, rcData, rcCorrupt );
+            rc = resize_dst ( rslt -> data, & dpos, & dend, sbase, spos, send );
+            if ( rc != 0 )
+                return rc;
+        }
+        dpos += bytes;
+    }
+
+    /* return the number of elements and reset the data buffer */
+    rslt -> elem_count = ( uint32_t ) ( dpos - ( uint8_t* ) rslt -> data -> base );
+    if ( rslt -> elem_bits > 8 )
+        rslt -> elem_count /= rslt -> elem_bits >> 3;
+
+    return 0;
+}
+
+/* read_num
+ *  numeric readers convert size
+ */
+#define READ_NUM( S, D ) \
+static int read_ ## S ( const void *src, void *dst ) \
+{ * ( D* ) dst = * ( const S* ) src; return sizeof ( S ); }
+
+READ_NUM ( int8_t, int64_t )
+READ_NUM ( int16_t, int64_t )
+READ_NUM ( int32_t, int64_t )
+READ_NUM ( int64_t, int64_t )
+
+READ_NUM ( uint8_t, uint64_t )
+READ_NUM ( uint16_t, uint64_t )
+READ_NUM ( uint32_t, uint64_t )
+READ_NUM ( uint64_t, uint64_t )
+
+READ_NUM ( float, double )
+READ_NUM ( double, double )
+
+typedef int ( * read_num_func ) ( const void*, void* );
+static read_num_func read_num_tbl [] =
+{
+    read_uint8_t, read_uint16_t, read_uint32_t, read_uint64_t,
+    read_int8_t, read_int16_t, read_int32_t, read_int64_t,
+    NULL, NULL, read_float, read_double
+};
+
+/* write_num
+ *  numeric writers convert size and check limit
+ */
+#define WRITE_NUM( S, D ) \
+static int write_ ## D ( const void *src, void *dst ) \
+{ * ( D* ) dst = * ( const S* ) src; return sizeof ( D ); }
+
+#define WRITE_SNUM( S, D, PLIM, NLIM ) \
+static int write_ ## D ( const void *src, void *dst ) \
+{ \
+    S s = * ( const S* ) src; \
+    if ( s > PLIM || s < NLIM ) \
+        return -1; \
+    * ( D* ) dst = ( D )s; \
+    return sizeof ( D ); \
+}
+
+#define WRITE_UNUM( S, D, LIM ) \
+static int write_ ## D ( const void *src, void *dst ) \
+{ \
+    S s = * ( const S* ) src; \
+    if ( s > LIM ) \
+        return -1; \
+    * ( D* ) dst = ( D )s; \
+    return sizeof ( D ); \
+}
+
+WRITE_SNUM ( int64_t, int8_t, INT8_MAX, INT8_MIN )
+WRITE_SNUM ( int64_t, int16_t, INT16_MAX, INT16_MIN )
+WRITE_SNUM ( int64_t, int32_t, INT32_MAX, INT32_MIN )
+WRITE_NUM ( int64_t, int64_t )
+
+WRITE_UNUM ( uint64_t, uint8_t, UINT8_MAX )
+WRITE_UNUM ( uint64_t, uint16_t, UINT16_MAX )
+WRITE_UNUM ( uint64_t, uint32_t, UINT32_MAX )
+WRITE_NUM ( uint64_t, uint64_t )
+
+WRITE_SNUM ( double, float, FLT_MAX, FLT_MIN )
+WRITE_NUM ( double, double )
+
+typedef int ( * write_num_func ) ( const void*, void* );
+static write_num_func write_num_tbl [] =
+{
+    write_uint8_t, write_uint16_t, write_uint32_t, write_uint64_t,
+    write_int8_t, write_int16_t, write_int32_t, write_int64_t,
+    NULL, NULL, write_float, write_double
+};
+
+/* convert_num
+ */
+static
+rc_t convert_int ( const void *src, void *dst )
+{
+    if ( ( * ( int64_t* ) dst = * ( const int64_t* ) src ) < 0 )
+        return RC ( rcVDB, rcType, rcCasting, rcRange, rcExcessive );
+    return 0;
+}
+
+static
+rc_t convert_int_float ( const void *src, void *dst )
+{ * ( double* ) dst = * ( const int64_t* ) src; return 0; }
+
+static
+rc_t convert_uint_float ( const void *src, void *dst )
+{ * ( double* ) dst = * ( const uint64_t* ) src; return 0; }
+
+static
+rc_t convert_float_int ( const void *src, void *dst )
+{
+    double d = * ( const double* ) src;
+    if ( d > INT64_MAX || d < INT64_MIN )
+        return RC ( rcVDB, rcType, rcCasting, rcRange, rcExcessive );
+    * ( int64_t* ) dst = ( int64_t ) d;
+    return 0;
+}
+
+static
+rc_t convert_float_uint ( const void *src, void *dst )
+{
+    double d = * ( const double* ) src;
+    if ( d > UINT64_MAX )
+        return RC ( rcVDB, rcType, rcCasting, rcRange, rcExcessive );
+    * ( uint64_t* ) dst = ( uint64_t ) d;
+    return 0;
+}
+
+typedef rc_t ( * convert_num_func ) ( const void*, void* );
+static convert_num_func convert_num_tbl [] =
+{
+    /* unsigned integer conversion */
+    NULL, convert_int, convert_uint_float,
+    /* signed integer conversion */
+    convert_int, NULL, convert_int_float,
+    /* floating point conversion */
+    convert_float_int, convert_float_uint, NULL
+};
+
+
+/* read_chr
+ *  characters readers convert size and encoding
+ */
+static int read_ascii ( uint32_t *ch,  const void *begin, const void *end )
+{
+    char s;
+    if ( ( const char* ) begin >= ( const char* ) end )
+        return 0;
+    s = * ( const char* ) begin;
+    if ( s < 0 )
+        return -1;
+    * ch = s;
+    return 1;
+}
+
+#define read_utf8 \
+    ( int ( * ) ( uint32_t*, const void*, const void* ) ) utf8_utf32
+
+static int read_utf16 ( uint32_t *ch, const void *begin, const void *end )
+{
+    if ( ( const uint16_t* ) begin >= ( const uint16_t* ) end )
+        return 0;
+    /* yes, I know this is wrong - but don't blame me
+       that the UNICODE folks can't produce a uni-code
+       character with 16 bits... ( GO, KLINGON! ) */
+    * ch = * ( const uint16_t* ) begin;
+    return 2;
+}
+
+static int read_utf32 ( uint32_t *ch, const void *begin, const void *end )
+{
+    if ( ( const uint32_t* ) begin >= ( const uint32_t* ) end )
+        return 0;
+    * ch = * ( const uint32_t* ) begin;
+    return 4;
+}
+
+typedef int ( * read_chr_func ) ( uint32_t*, const void*, const void* );
+static read_chr_func read_chr_tbl [] =
+{
+    /* ascii reads */
+    read_ascii, NULL, NULL,
+    /* unicode reads */
+    read_utf8, read_utf16, read_utf32
+};
+
+/* write_chr
+ *  character writers convert size and encoding
+ */
+static int write_ascii ( void *begin, void *end, uint32_t ch )
+{
+    if ( ( char* ) begin >= ( char* ) end )
+        return 0;
+    * ( char* ) begin = ( ch >= 128 ) ? '.' : ( char ) ch;
+    return 1;
+}
+
+#define write_utf8 \
+    ( int ( * ) ( void*, void*, uint32_t ) ) utf32_utf8
+
+static int write_utf16 ( void *begin, void *end, uint32_t ch )
+{
+    if ( ( uint16_t* ) begin >= ( uint16_t* ) end )
+        return 0;
+    if ( ch >= 0x10000 )
+        return -1;
+    * ( uint16_t* ) begin = ( uint16_t ) ch;
+    return 2;
+}
+
+static int write_utf32 ( void *begin, void *end, uint32_t ch )
+{
+    if ( ( uint32_t* ) begin >= ( uint32_t* ) end )
+        return 0;
+    * ( uint32_t* ) begin = ch;
+    return 4;
+}
+
+typedef int ( * write_chr_func ) ( void*, void*, uint32_t );
+static write_chr_func write_chr_tbl [] =
+{
+    /* ascii writes */
+    write_ascii, NULL, NULL,
+    /* unicode writes */
+    write_utf8, write_utf16, write_utf32
+};
+
+
+/* cast
+ *  this operation is equivalent to a C forced cast, as it allows
+ *  reinterpretation of data both in size and type, although
+ *  it does not convert text to integer or vice-versa...
+ */
+static
+rc_t make_self ( VFuncDesc *rslt, Cast **fself )
+{
+    * fself = calloc ( 1, sizeof ** fself );
+    if ( * fself == NULL )
+        return RC ( rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted );
+
+    rslt -> self = * fself;
+    rslt -> whack = free;
+    return 0;
+}
+
+VTRANSFACT_BUILTIN_IMPL ( vdb_cast, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    Cast *fself;
+    int32_t src_size_idx, dst_size_idx;
+
+    /* cast cannot change intrinsic dimension. it is tempting to
+       consider the ability to cast B1[8] to U8[1], but then what
+       would it mean to cast B1[1] to U8[1] or B1[8] to U8[8] ? */
+    if ( info -> fdesc . desc . intrinsic_dim != dp -> argv [ 0 ] . desc . intrinsic_dim )
+        return RC ( rcVDB, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+    /* cast is often used to ensure a source has a given type
+       meaning that in many cases no cast is required */
+    if ( info -> fdesc . desc . domain == dp -> argv [ 0 ] . desc . domain )
+    {
+        if ( info -> fdesc . desc . intrinsic_bits == dp -> argv [ 0 ] . desc . intrinsic_bits )
+        {
+            /* input and output are already binary compatible */
+            rslt -> variant = vftBlobN;
+            VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = copy;
+            return 0;
+        }
+    }
+
+    src_size_idx = uint32_lsbit ( dp -> argv [ 0 ] . desc . intrinsic_bits );
+    dst_size_idx = uint32_lsbit ( info -> fdesc . desc . intrinsic_bits );
+
+    /* numeric <-> numeric casts are supported */
+    if ( info -> fdesc . desc . domain >= vtdUint &&
+         info -> fdesc . desc . domain <= vtdFloat &&
+         dp -> argv [ 0 ] . desc . domain >= vtdUint &&
+         dp -> argv [ 0 ] . desc . domain <= vtdFloat )
+    {
+
+        /* byte-aligned offsets will be values 3..6
+           values < 3 are not byte-aligned
+           values > 6 are >= 128 bits and not handled */
+        if ( src_size_idx >= 3 && src_size_idx <= 6 &&
+             dst_size_idx >= 3 && dst_size_idx <= 6 )
+        {
+            rc = make_self ( rslt, & fself );
+            if ( rc != 0 )
+                return rc;
+
+            /* get reader */
+            fself -> read . num = read_num_tbl
+                [ ( dp -> argv [ 0 ] . desc . domain - vtdUint ) * 4 + src_size_idx - 3 ];
+            if ( fself -> read . num != NULL )
+            {
+                /* get writer */
+                fself -> write . num = write_num_tbl
+                    [ ( info -> fdesc . desc . domain - vtdUint ) * 4 + dst_size_idx - 3 ];
+                if ( fself -> write . num != NULL )
+                {
+                    /* get optional converter */
+                    fself -> convert . num = convert_num_tbl
+                        [ ( dp -> argv [ 0 ] . desc . domain - vtdUint ) * ( vtdFloat - vtdUint + 1 ) +
+                          info -> fdesc . desc . domain - vtdUint ];
+
+                    /* set intrinsic dimension */
+                    fself -> intrinsic_dim = info -> fdesc . desc . intrinsic_dim;
+
+                    /* done */
+                    rslt -> u . af = cast_num;
+                    rslt -> variant = vftArray;
+                    return 0;
+                }
+            }
+
+            free ( fself );
+            rslt -> whack = NULL;
+        }
+    }
+
+    /* text <-> text casts are supported */
+    if ( info -> fdesc . desc . domain >= vtdAscii &&
+         info -> fdesc . desc . domain <= vtdUnicode &&
+         dp -> argv [ 0 ] . desc . domain >= vtdAscii &&
+         dp -> argv [ 0 ] . desc . domain <= vtdUnicode )
+    {
+        if ( src_size_idx >= 3 && src_size_idx <= 5 &&
+             dst_size_idx >= 3 && dst_size_idx <= 5 )
+        {
+            rc = make_self ( rslt, & fself );
+            if ( rc != 0 )
+                return rc;
+
+            /* get reader */
+            fself -> read . chr = read_chr_tbl
+                [ ( dp -> argv [ 0 ] . desc . domain - vtdAscii ) * 3 + src_size_idx - 3 ];
+            if ( fself -> read . chr != NULL )
+            {
+                /* get writer */
+                fself -> write . chr = write_chr_tbl
+                    [ ( info -> fdesc . desc . domain - vtdAscii ) * 4 + dst_size_idx - 3 ];
+                if ( fself -> write . chr != NULL )
+                {
+                    /* set source and dest sizes */
+                    fself -> src_bits = 1 << src_size_idx;
+                    fself -> dst_bits = 1 << dst_size_idx;
+
+                    /* done */
+                    rslt -> u . rf = cast_chr;
+                    rslt -> variant = vftRow;
+                    return 0;
+                }
+            }
+
+            free ( fself );
+            rslt -> whack = NULL;
+        }
+    }
+
+    /* everything else is unsupported */
+    return RC ( rcVDB, rcFunction, rcConstructing, rcFunction, rcUnsupported );
+}
diff --git a/libs/vdb/column-cmn.c b/libs/vdb/column-cmn.c
new file mode 100644
index 0000000..85677bc
--- /dev/null
+++ b/libs/vdb/column-cmn.c
@@ -0,0 +1,356 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#define USE_KURT 1
+
+
+#include <vdb/extern.h>
+
+#define KONST const
+#include "column-priv.h"
+#include "dbmgr-priv.h"
+#include "schema-priv.h"
+#include "prod-priv.h"
+#include "blob-priv.h"
+#include "page-map.h"
+#undef KONST
+
+#include <vdb/manager.h>
+#include <kdb/column.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * VColumn
+ */
+
+/* Whack
+ */
+void VColumnDestroy ( VColumn *self )
+{
+#if PROD_REFCOUNT && ! PROD_ALL_IN_CURSOR
+    PROD_TRACK_REFCOUNT (VProductionRelease,self->in);
+    VProductionRelease ( self -> in, NULL ); 
+#endif
+#if USE_KURT
+    VBlobRelease ( self -> cache );
+#endif
+    VSchemaSever ( self -> schema );
+}
+
+
+/* Cmp
+ * Sort
+ */
+int CC VColumnCmp ( const void *item, const void *n )
+{
+    const VColumn *b = n;
+    return SColumnSort ( item, b -> scol );
+}
+
+int CC VColumnSort ( const void *item, const void *n )
+{
+    const VColumn *a = item;
+    const VColumn *b = n;
+    return SColumnSort ( a -> scol, b -> scol );
+}
+
+
+/* IdRange
+ *  returns id range for column or page
+ */
+rc_t VColumnIdRangeRead ( const VColumn *self, int64_t *first, int64_t *last )
+{
+    rc_t rc;
+
+    assert ( self != NULL );
+    assert ( first != NULL && last != NULL );
+
+    if ( self -> in == NULL )
+        rc = RC ( rcVDB, rcColumn, rcAccessing, rcRange, rcNotOpen );
+    else
+    {
+        /* a little silly, but set max range in 64-bit
+           without complaints from 32-bit compilers */
+        * first = 1;
+        * first <<= 63;
+        * last = ~ * first;
+
+        /* now intersect this range with all physical sources */
+        rc = VProductionColumnIdRange ( self -> in, first, last );
+        if ( rc == 0 )
+            return 0;
+    }
+
+    * first = * last = 0;
+
+    return rc;
+}
+
+rc_t VColumnPageIdRange ( const VColumn *self, int64_t id, int64_t *first, int64_t *last )
+{
+    rc_t rc;
+
+    assert ( self != NULL );
+    assert ( first != NULL && last != NULL );
+
+    if ( self -> in == NULL )
+        rc = RC ( rcVDB, rcColumn, rcAccessing, rcRange, rcNotOpen );
+    else
+    {
+        /* try to find page and get its range */
+        rc = VProductionPageIdRange ( self -> in, id, first, last );
+        if ( rc == 0 )
+            return 0;
+    }
+
+    * first = * last = 0;
+
+    return rc;
+}
+
+
+/* Datatype
+ *  returns typedecl and/or typedef for column data
+ *
+ *  "type" [ OUT, NULL OKAY ] - returns the column type declaration
+ *
+ *  "def" [ OUT, NULL OKAY ] - returns the definition of the type
+ *  returned in "type_decl"
+ *
+ * NB - one of "type" and "def" must be non-NULL
+ */
+rc_t VColumnDatatype ( const VColumn *self, VTypedecl *type, VTypedesc *desc )
+{
+    assert ( self != NULL );
+    assert ( type != NULL || desc != NULL );
+
+    if ( type != NULL )
+        * type = self -> td;
+
+    if ( desc != NULL )
+        * desc = self -> desc;
+
+    return 0;
+}
+
+/* Init - PRIVATE
+ */
+rc_t VColumnInit ( VColumn *self, const VSchema *schema, const SColumn *scol )
+{
+    rc_t rc = VSchemaDescribeTypedecl ( schema, & self -> desc, & scol -> td );
+    if ( rc == 0 )
+    {
+        self -> schema = VSchemaAttach ( schema );
+        self -> scol = scol;
+        self -> td = scol -> td;
+        self -> read_only = scol -> read_only;
+    }
+    return rc;
+}
+
+
+/* Make - PRIVATE
+ *  make a read column
+ */
+rc_t VColumnMake ( VColumn **colp, const VSchema *schema, const SColumn *scol )
+{
+    rc_t rc;
+    VColumn *col;
+
+    assert ( colp != NULL );
+    assert ( schema != NULL );
+
+    col = calloc ( 1, sizeof * col );
+    if ( col == NULL )
+        rc = RC ( rcVDB, rcColumn, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = VColumnInit ( col, schema, scol );
+        if ( rc == 0 )
+        {
+            col -> read_only = true;
+            * colp = col;
+            return 0;
+        }
+
+        free ( col );
+    }
+
+    * colp = NULL;
+    return rc;
+}
+
+rc_t VColumnReadCachedBlob ( const VColumn *self, const VBlob *vblob, int64_t row_id,
+    uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len, uint32_t *repeat_count )
+{
+    uint64_t start;
+
+    * elem_bits = VTypedescSizeof ( & self -> desc );
+    * row_len = PageMapGetIdxRowInfo ( vblob -> pm, ( uint32_t ) ( row_id - vblob -> start_id ), boff, repeat_count );
+    start = ( uint64_t ) boff [ 0 ] * elem_bits [ 0 ];
+    * base = ( uint8_t* ) vblob -> data . base + ( start >> 3 );
+    * boff = ( uint32_t ) start & 7;
+
+    return 0;
+}
+
+rc_t VColumnReadBlob ( const VColumn *cself, const VBlob **vblobp, int64_t row_id,
+   uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len, uint32_t * repeat_count, VBlobMRUCacheCursorContext *cctx )
+{
+    rc_t rc;
+
+    if ( cself -> in == NULL )
+        rc = RC ( rcVDB, rcColumn, rcReading, rcColumn, rcNotOpen );
+    else
+    {
+        VBlob *vblob;
+        rc = VProductionReadBlob ( cself -> in, & vblob, row_id, 1, cctx );
+        if ( rc == 0 )
+        {
+            VColumn *self = ( VColumn* ) cself;
+            VColumnReadCachedBlob ( self, vblob, row_id, elem_bits, base, boff, row_len, repeat_count );
+
+#if USE_KURT
+            TRACK_BLOB ( VBlobRelease, self -> cache );
+            ( void ) VBlobRelease ( self -> cache );
+
+            if ( VBlobAddRef ( vblob ) != 0 )
+                self -> cache = NULL;
+            else
+                self -> cache = vblob;
+#endif
+
+            * vblobp = vblob;
+        }
+    }
+
+    return rc;
+}
+
+rc_t VColumnRead ( const VColumn *cself, int64_t row_id,
+    uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len,
+    VBlob ** vblob)
+{
+    rc_t rc;
+
+    VBlob * dummy;
+    if ( vblob == NULL )
+    {
+        dummy = NULL;
+        vblob = & dummy;
+    }
+
+    if ( cself -> in == NULL )
+        rc = RC ( rcVDB, rcColumn, rcReading, rcColumn, rcNotOpen );
+    else
+    {
+        rc = VProductionReadBlob ( cself -> in, vblob, row_id, 1, NULL );
+        if ( rc == 0 )
+        {
+            VColumn *self = ( VColumn* ) cself;
+            VColumnReadCachedBlob ( self, *vblob, row_id, elem_bits, base, boff, row_len, NULL );
+
+#if USE_KURT
+            TRACK_BLOB ( VBlobRelease, self -> cache );
+            ( void ) VBlobRelease ( self -> cache );
+            self -> cache = *vblob;
+#else
+            TRACK_BLOB ( VBlobRelease, *vblob );
+            ( void ) VBlobRelease ( *vblob );
+            *vblob = NULL;
+#endif
+        }
+    }
+
+    return rc;
+}
+
+/* IsStatic
+ *  answers question: "does this column have the same value for every cell?"
+ */
+rc_t VColumnIsStatic ( const VColumn *self, bool *is_static )
+{
+    rc_t rc;
+
+    if ( is_static == NULL )
+        rc = RC ( rcVDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        * is_static = false;
+
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else if ( self -> in == NULL )
+            rc = RC ( rcVDB, rcColumn, rcAccessing, rcColumn, rcNotOpen );
+        else
+        {
+            return VProductionIsStatic ( self -> in, is_static );
+        }
+    }
+
+    return rc;
+}
+
+/* GetKColumn
+ *  drills down to physical production to get a KColumn,
+ *  and if that fails, indicate whether the column is static
+ */
+rc_t VColumnGetKColumn ( const VColumn * self, struct KColumn ** kcol, bool * is_static )
+{
+    rc_t rc;
+
+    bool dummy = false;
+
+    if ( is_static == NULL )
+        is_static = & dummy;
+
+    if ( kcol == NULL )
+        rc = RC ( rcVDB, rcColumn, rcAccessing, rcParam, rcNull );
+    else
+    {
+        * kcol = NULL;
+        * is_static = false;
+
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcColumn, rcAccessing, rcSelf, rcNull );
+        else if ( self -> in == NULL )
+            rc = RC ( rcVDB, rcColumn, rcAccessing, rcColumn, rcNotOpen );
+        else
+        {
+            return VProductionGetKColumn ( self -> in, kcol, is_static );
+        }
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/column-priv.h b/libs/vdb/column-priv.h
new file mode 100644
index 0000000..3d002ef
--- /dev/null
+++ b/libs/vdb/column-priv.h
@@ -0,0 +1,304 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_column_priv_
+#define _h_column_priv_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_vdb_xform_
+#include <vdb/xform.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_data_buffer_
+#include <klib/data-buffer.h>
+#endif
+
+#include <os-native.h>
+
+#ifndef KONST
+#define KONST
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct Vector;
+struct KColumn;
+struct VDBManager;
+struct VSchema;
+struct SColumn;
+struct SExpression;
+struct VProduction;
+struct VBlob;
+struct VBlobMRUCacheCursorContext;
+
+
+/*--------------------------------------------------------------------------
+ * VColumn
+ *  externally visible column object
+ */
+typedef struct VColumn VColumn;
+struct VColumn
+{
+    /* for type queries */
+    struct VSchema const *schema;
+
+    /* typed column */
+    struct SColumn const *scol;
+
+    /* read production */
+    struct VProduction *in;
+
+    /* cached output */
+    struct VBlob *cache;
+
+    /* type information */
+    VTypedecl td;
+    VTypedesc desc;
+
+    /* vector ids */
+    uint32_t ord;
+
+    bool read_only;
+    uint8_t align [ 3 ];
+};
+
+void CC VColumnWhack ( void *item, void *curs );
+void VColumnDestroy ( VColumn *self );
+rc_t VColumnInit ( VColumn *self,
+    struct VSchema const *schema, struct SColumn const *scol );
+
+int CC VColumnCmp ( const void *item, const void *n );
+int CC VColumnSort ( const void *item, const void *n );
+
+rc_t VColumnMake ( VColumn **col,
+    struct VSchema const *schema, struct SColumn const *scol );
+
+rc_t VColumnIdRange ( const VColumn *self,
+    int64_t *first, int64_t *last );
+rc_t VColumnIdRangeRead ( const VColumn *self,
+    int64_t *first, int64_t *last );
+rc_t VColumnPageIdRange ( const VColumn *self,
+    int64_t id, int64_t *first, int64_t *last );
+
+rc_t VColumnDatatype ( const VColumn *self,
+    struct VTypedecl *type, struct VTypedesc *desc );
+
+rc_t VColumnRead ( const VColumn *self, int64_t row_id,
+   uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len,
+   struct VBlob **vblob );
+
+rc_t VColumnReadBlob ( const VColumn *self, struct VBlob const **blob, int64_t row_id,
+   uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len, uint32_t *repeat_count,
+   struct VBlobMRUCacheCursorContext *cctx);
+
+rc_t VColumnReadCachedBlob ( const VColumn *self, struct VBlob const *blob, int64_t row_id,
+   uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len, uint32_t *repeat_count );
+
+rc_t VColumnIsStatic ( const VColumn *self, bool *is_static );
+
+rc_t VColumnGetKColumn ( const VColumn * self, struct KColumn ** kcol, bool * is_static );
+
+/*--------------------------------------------------------------------------
+ * WColumn
+ *  column with input buffer
+ */
+typedef struct WColumn WColumn;
+struct WColumn
+{
+    VColumn dad;
+
+    /* half-closed range of buffered rows */
+    int64_t start_id, end_id;
+
+    /* half-closed id for page cutoff */
+    int64_t cutoff_id;
+
+    /* alternate read production */
+    struct VProduction *alt;
+
+    /* validate production */
+    struct VProduction *val;
+
+    /* write production */
+    struct VProduction *out;
+
+    /* output page */
+    struct VBlob *page;
+
+    /* default row data */
+    KDataBuffer dflt;
+
+    /* accumulators */
+    KDataBuffer data, rowmap;
+
+    /* peak byte size history of data accumulator */
+    size_t data_peak_hist [ 16 ];
+    size_t data_peak;
+
+    /* total committed bits in buffer */
+    bitsz_t bits_in_buffer;
+
+    /* number of uncommitted bits in buffer */
+    bitsz_t row_len;
+
+    /* size ( in bytes ) to trigger page commit */
+    size_t trigger;
+
+    /* number of committed rows in buffer */
+    size_t num_rows;
+
+    /* peak history index */
+    uint8_t peak_hist_idx;
+
+    /* true if there is a default value */
+    bool have_dflt;
+
+    /* set upon any successful write */
+    bool row_written;
+
+    /* set if the last row written was default */
+    bool dflt_last;
+
+    /* set upon row commit */
+    bool row_committed;
+};
+
+/* WColumnRowMap
+ */
+typedef struct WColumnRowMap WColumnRowMap;
+struct WColumnRowMap
+{
+    int64_t start_id;
+    uint64_t len, cnt;
+};
+
+rc_t WColumnMake ( VColumn **col, struct VSchema const *schema,
+    struct SColumn const *scol, struct SExpression const *dflt_limit,
+    struct VDBManager *mgr, struct Vector *cx_bind );
+
+rc_t WColumnSetDefault ( VColumn *self,
+    bitsz_t elem_bits, const void *buffer, bitsz_t boff, uint64_t len );
+rc_t WColumnWrite ( VColumn *self,
+    bitsz_t elem_bits, const void *buffer, bitsz_t boff, uint64_t len );
+
+/* OpenRow
+ *  update state
+ *
+ *  "const_row_id" [ IN, CONST ] - id of row being opened. useful
+ *  only on initial open when no other rows are buffered.
+ */
+void CC WColumnOpenRow ( void *self, void *const_row_id );
+
+/* RowDefaults
+ *  if a row has not been written but has a default value,
+ *  that value is written to the row. if no default exists,
+ *  an error is generated.
+ *
+ *  "rc" [ OUT, DEFAULT ZERO ] - preset to 0
+ *
+ *  returns true if any error occurs ( i.e. "*rc != 0" )
+ */
+bool CC WColumnRowDefaults ( void *self, void *rc );
+
+/* CommitRow
+ *  closes the row to further writes and accepts
+ *  all data written so far as complete. if the accumulated
+ *  page data trigger a flush, the flush parameter is set.
+ *
+ *  "end_id" [ IN/OUT ] - used to calculate the minimum
+ *  end_id for pages. if the column decides that it has too
+ *  much data in its buffer and wants a cutoff < current
+ *  value, it can lower the id.
+ *
+ *  returns true if there was a memory error.
+ */
+bool CC WColumnCommitRow ( void *self, void *end_id );
+
+/* RepeatRow
+ *  go into the last row entry
+ *  extend the count by count
+ *  data points to this structure
+ */
+typedef struct WColumnRepeatRowData WColumnRepeatRowData;
+struct WColumnRepeatRowData
+{
+    uint64_t count;
+    int64_t row_id;
+    int64_t end_id;
+};
+void CC WColumnRepeatRow ( void *self, void *data );
+
+/* CloseRow
+ *  discards uncommitted data
+ *  update state
+ */
+void CC WColumnCloseRow ( void *self, void *ignore );
+
+/* BufferPage
+ *  captures page range
+ *
+ *  "end_id" [ IN, CONST ] - half-closed id of buffered range end
+ *  column should capture this information for creating page
+ *  id range either on demand, or pre-prepared.
+ *
+ *  returns true if there was a memory error.
+ */
+bool CC WColumnBufferPage ( void *self, void *const_end_id );
+
+/* DropPage
+ *  drops all rows associated with committed page
+ */
+void CC WColumnDropPage ( void *self, void *ignore );
+
+/* ReadBlob
+ *  reads an input blob
+ *  returns a blob with all rows in commit range
+ *
+ *  "vblob" [ OUT ] - page to return
+ *
+ *  "id" [ IN ] - an id that must be within page range
+ *  returns rcNotFound and NULL blob if id is not within range
+ */
+rc_t WColumnReadBlob ( WColumn *self, struct VBlob **vblob, int64_t id );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_column_priv_ */
diff --git a/libs/vdb/column.c b/libs/vdb/column.c
new file mode 100644
index 0000000..4c4c741
--- /dev/null
+++ b/libs/vdb/column.c
@@ -0,0 +1,80 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define KONST const
+#include "column-priv.h"
+#include "dbmgr-priv.h"
+#include "schema-priv.h"
+#include "cursor-priv.h"
+#undef KONST
+
+#include <vdb/manager.h>
+#include <vdb/cursor.h>
+#include <kdb/column.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * VColumn
+ */
+
+
+/* Whack
+ *  perform read-only cleanup
+ */
+void CC VColumnWhack ( void *item, void *data )
+{
+    VColumn *self = item;
+    VCursor *curs = data;
+
+    /* remove from cursor */
+    if ( curs != NULL )
+    {
+        VectorSwap ( & curs -> row, self -> ord, NULL, & item );
+        VCursorCacheSwap ( & curs -> col, & self -> scol -> cid, NULL, & item );
+    }
+
+    VColumnDestroy ( self );
+    free ( self );
+}
+
+
+/* IdRange
+ *  returns id range for column or page
+ */
+rc_t VColumnIdRange ( const VColumn *self, int64_t *first, int64_t *last )
+{
+    return VColumnIdRangeRead ( self, first, last );
+}
diff --git a/libs/vdb/compare.c b/libs/vdb/compare.c
new file mode 100644
index 0000000..e72f374
--- /dev/null
+++ b/libs/vdb/compare.c
@@ -0,0 +1,242 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include "blob.h"
+#include "blob-headers.h"
+#include "page-map.h"
+#include "blob-priv.h"
+#include "xform-priv.h"
+#include "prod-priv.h"
+
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+#include <atomic32.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <assert.h>
+
+#define RC_NOT_SAME RC(rcVDB, rcBlob, rcValidating, rcData, rcCorrupt)
+
+typedef struct float_compare_t {
+    unsigned sig_bits;
+} float_compare_t;
+
+static
+rc_t CC blob_compare(
+                  void *self,
+                  const VRowData *orig,
+                  const VRowData *test
+) {
+    const bitsz_t o_ofs = (size_t)orig->u.data.first_elem * orig->u.data.elem_bits;
+    const bitsz_t t_ofs = (size_t)test->u.data.first_elem * orig->u.data.elem_bits;
+    const bitsz_t bits = (size_t)orig->u.data.elem_count * orig->u.data.elem_bits;
+    int cmp;
+
+    if (orig->u.data.elem_bits % 8 == 0) {
+        cmp = memcmp(
+                   &((const char *)orig->u.data.base)[o_ofs >> 3],
+                   &((const char *)test->u.data.base)[t_ofs >> 3],
+                   bits >> 3
+            );
+    }
+    else {
+        cmp = bitcmp(orig->u.data.base, o_ofs, test->u.data.base, t_ofs, bits);
+    }
+    if(cmp)
+	return RC_NOT_SAME;
+    return 0;
+
+}
+static bool equal_f32( const float A[], const float B[], uint64_t elem_count, unsigned sig_bits ) {
+    unsigned i;
+    const int shift = 24 - sig_bits;
+    
+    assert(shift > 0);
+    
+    for (i = 0; i != elem_count; ++i) {
+        int expa;
+        int expb;
+        uint32_t mana;
+        uint32_t manb;
+        float a = A[i];
+        float b = B[i];
+        int diff;
+        
+        if (a < 0) {
+            a = -a;
+            b = -b;
+            if (b < 0)
+                return false;
+        }
+
+        a = frexpf(a, &expa);
+        b = frexpf(b, &expb);
+        
+        if (expa < expb) {
+            ++expa;
+            a /= 2.0;
+        }
+        else if (expb < expa) {
+            ++expb;
+            b /= 2.0;
+        }
+        if (expa != expb)
+            return false;
+        
+        mana = (uint32_t)ldexpf( a, 24 );
+        manb = (uint32_t)ldexpf( b, 24 );
+        
+        diff = (mana >> shift) - (manb >> shift);
+
+        if (-1 > diff || diff > 1)
+            return false;
+    }
+    return true;
+}
+
+static
+rc_t CC blob_compare_f32(
+                      void *Self,
+                      const VRowData *orig,
+                      const VRowData *test
+) {
+    float_compare_t *self = Self;
+    
+    if (!equal_f32(
+                   &((const float *)orig->u.data.base)[orig->u.data.first_elem],
+                   &((const float *)test->u.data.base)[test->u.data.first_elem],
+                   orig->u.data.elem_count,
+                   self->sig_bits
+               ))
+    {
+        return RC_NOT_SAME;
+    }
+    
+    return 0;
+}
+
+static
+void CC vfunc_free ( void * self )
+{
+    free (self);
+}
+
+VTRANSFACT_BUILTIN_IMPL(vdb_compare, 1, 0, 0) (
+                                       const void *self,
+                                       const VXfactInfo *info,
+                                       VFuncDesc *rslt,
+                                       const VFactoryParams *cp,
+                                       const VFunctionParams *dp
+) 
+{
+    VTypedesc type;
+    assert ( dp->argc == 2 );
+
+    rslt->variant = prodFuncBuiltInCompare;
+    
+#if 0
+    if (dp->argv[0].desc.domain != dp->argv[1].desc.domain ||
+        dp->argv[0].desc.intrinsic_dim != dp->argv[1].desc.intrinsic_dim ||
+        dp->argv[0].desc.intrinsic_bits != dp->argv[1].desc.intrinsic_bits
+    ) {
+        return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+    }
+#endif
+    type = dp->argv[0].desc;
+    
+    if (type.domain == vtdFloat) {
+        if (cp->argc > 0) {
+            unsigned sig_bits = cp->argv[0].data.u32[0];
+
+            if (sig_bits == 0) {
+                return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            }
+            switch (type.intrinsic_bits) {
+            case 32:
+                if (sig_bits < 24)
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->cf = blob_compare_f32;
+                break;
+            case 64:
+#if 0
+                if (sig_bits < 52)
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->cf = blob_compare_f64;
+#endif
+                break;
+            default:
+                break;
+            }
+            if (VFUNCDESC_INTERNAL_FUNCS(rslt)->cf) {
+                float_compare_t *Self;
+            
+                Self = malloc(sizeof *Self);
+                if (Self == NULL)
+                    return RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+
+                Self->sig_bits = sig_bits;
+            
+                rslt->self = Self;
+                rslt->whack = vfunc_free;
+                return 0;
+            }
+        }
+        else {
+            VDB_DEBUG (("warning: using identity compare for floating point types won't work if using fzip\n"));
+        }
+    }
+    VFUNCDESC_INTERNAL_FUNCS(rslt)->cf = blob_compare;
+    return 0;
+}
+
+static
+rc_t CC true_func(
+                  void *self,
+                  const VRowData *orig,
+                  const VRowData *test
+) {
+    return 0;
+}
+
+VTRANSFACT_BUILTIN_IMPL(vdb_no_compare, 1, 0, 0) (
+                                       const void *self,
+                                       const VXfactInfo *info,
+                                       VFuncDesc *rslt,
+                                       const VFactoryParams *cp,
+                                       const VFunctionParams *dp
+) 
+{
+    rslt->variant = prodFuncBuiltInCompare;
+    VFUNCDESC_INTERNAL_FUNCS(rslt)->cf = true_func;
+    return 0;
+}
diff --git a/libs/vdb/cursor-cmn.c b/libs/vdb/cursor-cmn.c
new file mode 100644
index 0000000..d5c5188
--- /dev/null
+++ b/libs/vdb/cursor-cmn.c
@@ -0,0 +1,2910 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include <va_copy.h>
+
+#define TRACK_REFERENCES 0
+
+#define KONST const
+#define SKONST
+#include "cursor-priv.h"
+#include "dbmgr-priv.h"
+#include "linker-priv.h"
+#include "table-priv.h"
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "column-priv.h"
+#include "phys-priv.h"
+#include "prod-priv.h"
+#include "prod-expr.h"
+#undef KONST
+#undef SKONST
+#include "blob-priv.h"
+#include "page-map.h"
+
+#include <vdb/cursor.h>
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/table.h>
+#include <kdb/column.h>
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <kfs/dyload.h>
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/namelist.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <klib/sort.h>
+#include <bitstr.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <kproc/lock.h>
+#include <kproc/cond.h>
+#include <kproc/thread.h>
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+
+#define PERMIT_POST_OPEN_ADD 1
+#if _ARCH_BITS == 32
+#define DISABLE_READ_CACHE 1
+#else
+#define DISABLE_READ_CACHE 0
+#endif
+
+/* normally false
+   can be set for certain applications using VDBManagerDisablePagemapThread
+*/
+static bool s_disable_pagemap_thread;
+
+
+/*--------------------------------------------------------------------------
+ * VCursorCache
+ */
+
+/* Whack
+ */
+void VCursorCacheWhack ( VCursorCache *self,
+    void ( CC * whack ) ( void *item, void *data ), void *data )
+{
+    uint32_t i = VectorStart ( & self -> cache );
+    uint32_t end = VectorLength ( & self -> cache );
+    for ( end += i; i < end; ++ i )
+    {
+        Vector *ctx;
+        rc_t rc = VectorSwap ( & self -> cache, i, NULL, ( void** ) & ctx );
+        if ( rc == 0 && ctx != NULL )
+        {
+            VectorWhack ( ctx, whack, data );
+            free ( ctx );
+        }
+    }
+
+    VectorWhack ( & self -> cache, NULL, NULL );
+}
+
+
+/* Get
+ *  retrieve object by cid
+ */
+void *VCursorCacheGet ( const VCursorCache *self, const VCtxId *cid )
+{
+    const Vector *ctx = ( const void* ) VectorGet ( & self -> cache, cid -> ctx );
+    return VectorGet ( ctx, cid -> id );
+}
+
+/* Set
+ *  set object by cid
+ */
+rc_t VCursorCacheSet ( VCursorCache *self, const VCtxId *cid, const void *item )
+{
+    Vector *ctx = VectorGet ( & self -> cache, cid -> ctx );
+    if ( ctx == NULL )
+    {
+        rc_t rc;
+
+        ctx = malloc ( sizeof * ctx );
+        if ( ctx == NULL )
+            return RC ( rcVDB, rcVector, rcConstructing, rcMemory, rcExhausted );
+
+        rc = VectorSet ( & self -> cache, cid -> ctx, ctx );
+        if ( rc != 0 )
+        {
+            free ( ctx );
+            return rc;
+        }
+
+        VectorInit ( ctx, 0, 16 );
+    }
+
+    return VectorSet ( ctx, cid -> id, item );
+}
+
+/* Swap
+ *  swap object by cid
+ */
+rc_t VCursorCacheSwap ( VCursorCache *self, const VCtxId *cid, const void *item, void **prior )
+{
+    Vector *ctx = VectorGet ( & self -> cache, cid -> ctx );
+    if ( ctx == NULL )
+    {
+        * prior = NULL;
+        return VCursorCacheSet ( self, cid, item );
+    }
+    return VectorSwap ( ctx, cid -> id, item, prior );
+}
+
+
+/*--------------------------------------------------------------------------
+ * NamedParamNode
+ */
+
+typedef struct NamedParamNode NamedParamNode;
+struct NamedParamNode
+{
+    BSTNode n;
+    String name;
+    KDataBuffer value;
+};
+
+static
+void CC NamedParamNodeWhack ( BSTNode *n, void *ignore )
+{
+    NamedParamNode *self = ( NamedParamNode* ) n;
+    KDataBufferWhack ( & self -> value );
+    free ( self );
+}
+
+static
+int64_t CC NamedParamComp ( const void *item, const BSTNode *n )
+{
+    const String *name = item;
+    const NamedParamNode *node = ( const NamedParamNode* ) n;
+
+    return StringOrderNoNullCheck ( name, & node -> name );
+}
+
+static
+int64_t CC NamedParamNodeComp ( const BSTNode *A, const BSTNode *B )
+{
+    const NamedParamNode *a = (const NamedParamNode *) A;
+    const NamedParamNode *b = (const NamedParamNode *) B;
+
+    return StringOrderNoNullCheck ( & a -> name, & b -> name );
+}
+/*--------------------------------------------------------------------------
+ * LinkedCursorNode
+ */
+
+typedef struct LinkedCursorNode LinkedCursorNode;
+struct LinkedCursorNode
+{
+    BSTNode n;
+    char tbl[64];
+    VCursor *curs;
+};
+
+static
+void CC LinkedCursorNodeWhack ( BSTNode *n, void *ignore )
+{
+    LinkedCursorNode *self = ( LinkedCursorNode* ) n;
+    VCursorRelease (  self -> curs );
+    free ( self );
+}
+
+static
+int64_t CC LinkedCursorComp ( const void *item, const BSTNode *n )
+{
+    const char *tbl = item;
+    const LinkedCursorNode *node = ( const LinkedCursorNode* ) n;
+
+    return strncmp ( tbl, node -> tbl, sizeof(node -> tbl) );
+}
+
+static
+int64_t CC LinkedCursorNodeComp ( const BSTNode *A, const BSTNode *B )
+{
+    const LinkedCursorNode *a = (const LinkedCursorNode *) A;
+    const LinkedCursorNode *b = (const LinkedCursorNode *) B;
+
+    return strncmp ( a -> tbl, b -> tbl,sizeof(a->tbl) );
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * VCursor
+ *  a row cursor onto a VTable
+ */
+
+static void CC VCursorVColumnWhack_checked( void *item, void *data )
+{
+    if ( item != NULL )
+        VColumnWhack( item, data );
+}
+
+/* Whack
+ */
+rc_t VCursorDestroy ( VCursor *self )
+{
+    KRefcountWhack ( & self -> refcount, "VCursor" );
+    if(self->cache_curs) VCursorDestroy((VCursor*)self->cache_curs);
+    VBlobMRUCacheDestroy ( self->blob_mru_cache);
+
+    if ( self -> user_whack != NULL )
+        ( * self -> user_whack ) ( self -> user );
+    BSTreeWhack ( & self -> named_params, NamedParamNodeWhack, NULL );
+    BSTreeWhack ( & self -> linked_cursors, LinkedCursorNodeWhack, NULL );
+    VCursorCacheWhack ( & self -> col, NULL, NULL );
+    VCursorCacheWhack ( & self -> phys, VPhysicalWhack, NULL );
+    VCursorCacheWhack ( & self -> prod, NULL, NULL );
+    VectorWhack ( & self -> owned, VProductionWhack, NULL );
+    VectorWhack ( & self -> trig, NULL, NULL );
+    VectorWhack ( & self -> row, VCursorVColumnWhack_checked, NULL );
+    VectorWhack ( & self -> v_cache_curs, NULL, NULL );
+    VectorWhack ( & self -> v_cache_cidx, NULL, NULL );
+
+    VSchemaRelease ( self -> schema );
+
+    VTableSever ( self -> tbl );
+
+    free ( self );
+
+    return 0;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC VCursorAddRef ( const VCursor *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "VCursor" ) )
+        {
+        case krefLimit:
+            return RC ( rcVDB, rcCursor, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VCursorRelease ( const VCursor *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "VCursor" ) )
+        {
+        case krefWhack:
+            return VCursorWhack ( ( VCursor* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcCursor, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Make - PRIVATE
+ */
+rc_t VCursorMake ( VCursor **cursp, const VTable *tbl )
+{
+    rc_t rc;
+    VCursor *curs;
+
+    /* must have return param */
+    assert ( cursp != NULL );
+
+    /* must have parent tbl */
+    assert ( tbl != NULL );
+
+    /* create a structure */
+    curs = calloc ( 1, sizeof * curs );
+    if ( curs == NULL )
+        rc = RC ( rcVDB, rcCursor, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        /* create a separate schema object */
+        rc = VSchemaMake ( & curs -> schema, tbl -> schema );
+        if ( rc == 0 )
+        {
+            /* extend table schema to populate with implicits */
+            rc = STableCloneExtend ( tbl -> stbl, & curs -> stbl, curs -> schema );
+            if ( rc == 0 )
+            {
+                curs -> tbl = VTableAttach ( tbl );
+                VectorInit ( & curs -> row, 1, 16 );
+                VectorInit ( & curs -> v_cache_curs, 1, 16 );
+                VectorInit ( & curs -> v_cache_cidx, 1, 16 );
+                VCursorCacheInit ( & curs -> col, 0, 16 );
+                VCursorCacheInit ( & curs -> phys, 0, 16 );
+                VCursorCacheInit ( & curs -> prod, 0, 16 );
+                VectorInit ( & curs -> owned, 0, 64 );
+                VectorInit ( & curs -> trig, 0, 64 );
+                KRefcountInit ( & curs -> refcount, 1, "VCursor", "make", "vcurs" );
+                curs -> state = vcConstruct;
+                curs -> permit_add_column = true;
+                curs -> suspend_triggers  = false;
+                * cursp = curs;
+                return 0;
+            }
+
+            VSchemaRelease ( curs -> schema );
+        }
+
+        free ( curs );
+    }
+
+    * cursp = NULL;
+
+    return rc;
+}
+
+/* SupplementSchema
+ *  scan table for physical column names
+ *  create transparent yet incomplete (untyped) columns for unknown names
+ *  create incomplete (untyped) physical columns for forwarded names
+ *  repeat process on static columns, except create complete (fully typed) objects
+ */
+static
+rc_t VCursorSupplementName ( const KSymTable *tbl,
+    STable *stbl, const VTypedecl *td, const char *name )
+{
+    rc_t rc = 0;
+    char buffer [ 256 ];
+
+    /* create physical name string */
+    int len = snprintf ( buffer, sizeof buffer, ".%s", name );
+    if ( len < 0 || len >= sizeof buffer )
+        rc = RC ( rcVDB, rcCursor, rcConstructing, rcName, rcExcessive );
+    else
+    {
+        KSymbol *sym;
+
+        String pname, cname;
+        StringInit ( & pname, buffer, len, string_len ( buffer, len ) );
+
+        /* if physical name is known */
+        sym = KSymTableFind ( tbl, & pname );
+        if ( sym != NULL )
+        {
+            /* if it is being implemented here */
+            if ( sym -> type == eVirtual )
+                rc = STableImplicitPhysMember ( stbl, td, sym, & pname );
+            return rc;
+        }
+
+        /* if simple name is unknown, add implicit */
+        sym = KSymTableFind ( tbl, StringSubstr ( & pname, & cname, 1, 0 ) );
+        if ( sym == NULL )
+        {
+            /* create implicit physical */
+            rc = STableImplicitPhysMember ( stbl, td, sym, & pname );
+            if ( rc == 0 )
+                rc = STableImplicitColMember ( stbl, & cname, & pname );
+        }
+    }
+    return rc;
+}
+
+static
+rc_t VCursorSupplementPhysical ( const KSymTable *tbl, const VCursor *self )
+{
+    KNamelist *names;
+    rc_t rc = KTableListCol ( self -> tbl -> ktbl, & names );
+    if ( rc == 0 )
+    {
+        uint32_t i, count;
+        rc = KNamelistCount ( names, & count );
+        for ( i = 0; rc == 0 && i < count; ++ i )
+        {
+            const char *name;
+            rc = KNamelistGet ( names, i, & name );
+            if ( rc == 0 )
+                rc = VCursorSupplementName ( tbl, self -> stbl, NULL, name );
+        }
+        KNamelistRelease ( names );
+    }
+    return rc;
+}
+
+static
+rc_t VCursorSupplementStatic ( const KSymTable *tbl, const VCursor *self )
+{
+    rc_t rc;
+    KNamelist *names;
+
+    const KMDataNode *root = self -> tbl -> col_node;
+    if ( root == NULL )
+        return 0;
+
+    rc = KMDataNodeListChild ( root, & names );
+    if ( rc == 0 )
+    {
+        uint32_t i, count;
+        rc = KNamelistCount ( names, & count );
+        for ( i = 0; rc == 0 && i < count; ++ i )
+        {
+            const char *name;
+            rc = KNamelistGet ( names, i, & name );
+            if ( rc == 0 )
+            {
+                const KMDataNode *node;
+                rc = KMDataNodeOpenNodeRead ( root, & node, "%s", name );
+                if ( rc == 0 )
+                {
+                    size_t size;
+                    char typedecl [ 256 ];
+                    rc = KMDataNodeReadAttr ( node, "type", typedecl, sizeof typedecl, & size );
+                    if ( rc == 0 && size != 0 )
+                    {
+                        VTypedecl td;
+                        rc = VSchemaResolveTypedecl ( self -> schema, & td, "%s", typedecl );
+                        if ( rc == 0 )
+                            rc = VCursorSupplementName ( tbl, self -> stbl, & td, name );
+
+                        rc = 0; /*** don't care if name is not in the schema ***/
+		
+                    }
+
+                    KMDataNodeRelease ( node );
+                }
+            }
+        }
+
+        KNamelistRelease ( names );
+    }
+
+    return rc;
+}
+
+rc_t VCursorSupplementSchema ( const VCursor *self )
+{
+    KSymTable tbl;
+    rc_t rc = init_tbl_symtab ( & tbl, self -> schema, self -> stbl );
+    if ( rc == 0 )
+    {
+        rc = VCursorSupplementPhysical ( & tbl, self );
+        if ( rc == 0 )
+            rc = VCursorSupplementStatic ( & tbl, self );
+        KSymTableWhack ( & tbl );
+    }
+    return rc;
+}
+
+
+/* CreateCachedCursorRead
+ *  creates a read cursor object onto table with a cache limit in bytes
+ *
+ *  AVAILABILITY: version 2.1
+ *
+ *  "curs" [ OUT ] - return parameter for newly created cursor
+ *
+ *  "capacity" [ IN ] - the maximum bytes to cache on the cursor before
+ *  dropping least recently used blobs
+ */
+static rc_t VTableCreateCachedCursorReadImpl ( const VTable *self,
+    const VCursor **cursp, size_t capacity, bool create_pagemap_thread  )
+{
+    rc_t rc;
+#if DISABLE_READ_CACHE
+    capacity = 0;
+#endif
+    if ( cursp == NULL )
+        rc = RC ( rcVDB, rcTable, rcOpening, rcParam, rcNull );
+    else {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcOpening, rcSelf, rcNull );
+        else {
+            VCursor *curs;
+#if LAZY_OPEN_COL_NODE
+            if ( self -> col_node == NULL )
+                KMetadataOpenNodeRead ( self -> meta, & ( ( VTable* ) self ) -> col_node, "col" );
+#endif
+            rc = VCursorMake ( & curs, self );
+            if ( rc == 0 ) {
+                curs -> blob_mru_cache = VBlobMRUCacheMake(capacity);
+                curs -> read_only = true;
+                rc = VCursorSupplementSchema ( curs );
+               
+#if 0  
+                if ( create_pagemap_thread && capacity > 0 && rc == 0 )
+                {
+                    rc = VCursorLaunchPagemapThread ( curs );
+                    if ( rc != 0 )
+                    {
+                        if ( GetRCState( rc ) == rcNotAvailable )
+                            rc = 0;
+                    }
+                }   
+#endif
+                if ( rc == 0 )
+                {
+                    if(capacity > 0)
+                        curs->launch_cnt = 5;
+                    else
+                        curs->launch_cnt=200;
+                    * cursp = curs;
+                    if(rc==0 && self->cache_tbl){
+			rc_t rc2;
+			const VCursor * cache_curs;
+			rc2 = VTableCreateCachedCursorReadImpl(self->cache_tbl,&cache_curs,64*1024*1024,create_pagemap_thread);
+			DBGMSG(DBG_VDB, DBG_FLAG(DBG_VDB_VDB), ("VTableCreateCachedCursorReadImpl(vdbcache) = %d\n", rc2));
+			if(rc2 == 0){
+				((VCursor*) (*cursp)) -> cache_curs = cache_curs;
+			}
+		    }
+                    return 0;
+                }
+                VCursorRelease ( curs );
+            }
+        }
+        * cursp = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableCreateCachedCursorRead ( const VTable *self,
+    const VCursor **cursp, size_t capacity )
+{
+	return VTableCreateCachedCursorReadImpl(self,cursp,capacity,true);
+}
+
+/**
+*** VTableCreateCursorReadInternal is only visible in vdb and needed for schema resolutions
+****/
+rc_t  VTableCreateCursorReadInternal(const VTable *self, const VCursor **cursp)
+{
+	return VTableCreateCachedCursorReadImpl(self,cursp,0,false);
+}
+
+/* CreateCursor
+ *  creates a cursor object onto table
+ *  multiple read cursors are allowed
+ *  only a single write cursor is allowed
+ *
+ *  "curs" [ OUT ] - return parameter for newly created cursor
+ */
+LIB_EXPORT rc_t CC VTableCreateCursorRead ( const VTable *self, const VCursor **curs )
+{
+    /* will be deprecated in the future */
+    return VTableCreateCachedCursorRead ( self, curs, 0 );
+}
+
+/* PermitPostOpenAdd
+ *  allows columns to be added to open cursor
+ *  for write cursor, the effect lasts until the first row commit
+ */
+LIB_EXPORT rc_t CC VCursorPermitPostOpenAdd ( const VCursor *cself )
+{
+    rc_t rc;
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcUpdating, rcSelf, rcNull );
+    else if ( self -> state == vcFailed )
+        rc = RC ( rcVDB, rcCursor, rcUpdating, rcCursor, rcInvalid );
+    else if ( self -> state != vcConstruct )
+        rc = RC ( rcVDB, rcCursor, rcUpdating, rcCursor, rcOpen );
+    else
+    {
+        self -> permit_post_open_add = true;
+        rc = 0;
+    }
+    if(self->cache_curs){
+	VCursorPermitPostOpenAdd(self->cache_curs);
+    }
+
+    return rc;
+}
+/*  SuspendTriggers
+ *  blocks resolution of schema-based triggers
+ *  
+ */
+LIB_EXPORT rc_t CC VCursorSuspendTriggers ( const VCursor *cself )
+{
+    rc_t rc;
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcUpdating, rcSelf, rcNull );
+    else
+    {
+        self -> suspend_triggers = true;
+        rc = 0;
+    }
+
+    return rc;
+}
+
+
+/* AddSColumn
+ */
+static
+rc_t VCursorAddSColumn ( VCursor *self, uint32_t *idx,
+    const SColumn *scol, const VTypedecl *cast, Vector *cx_bind )
+{
+    rc_t rc;
+    VColumn *col;
+
+    if ( self -> read_only )
+    {
+        /* must be readable */
+        if ( scol -> read == NULL )
+            return RC ( rcVDB, rcCursor, rcUpdating, rcColumn, rcWriteonly );
+    }
+    else
+    {
+        /* must be writable */
+        if ( scol -> read_only || ( scol -> read == NULL && scol -> validate == NULL ) )
+            return RC ( rcVDB, rcCursor, rcUpdating, rcColumn, rcReadonly );
+    }
+
+    /* must not already be there - benign error */
+    col = VCursorCacheGet ( & self -> col, & scol -> cid );
+    if ( col != NULL )
+    {
+        * idx = col -> ord;
+        return RC ( rcVDB, rcCursor, rcUpdating, rcColumn, rcExists );
+    }
+
+    /* make object */
+    rc = VCursorMakeColumn ( self, & col, scol, cx_bind );
+    if ( rc == 0 )
+    {
+        /* insert it into vectors */
+        rc = VectorAppend ( & self -> row, & col -> ord, col );
+        if ( rc == 0 )
+        {
+            void *ignore;
+            rc = VCursorCacheSet ( & self -> col, & scol -> cid, col );
+            if ( rc == 0 )
+            {
+                /* open column if cursor open or type unknown */
+                if ( self -> state >= vcReady || scol -> td . type_id == 0 )
+                {
+                    rc = VCursorPostOpenAdd ( self, col );
+                    assert ( rc != 0 || scol -> td . type_id != 0 );
+                }
+                if ( rc == 0 )
+                {
+                    /* check cast of SColumn against requested type
+                       this is to handle the case where the column
+                       was created incomplete, i.e. with unknown type */
+                    if ( cast == NULL || VTypedeclToTypedecl ( & scol -> td,
+                             self -> schema, cast, & col -> td, NULL ) )
+                    {
+                        /* has been entered */
+                        * idx = col -> ord;
+                        return 0;
+                    }
+                }
+
+                /* bail out */
+                VCursorCacheSwap ( & self -> col, & scol -> cid, NULL, & ignore );
+            }
+
+            VectorSwap ( & self -> row, col -> ord, NULL, & ignore );
+        }
+
+        VColumnWhack ( col, NULL );
+    }
+
+    return rc;
+}
+
+
+/* AddColspec
+ *  a "colspec" is either a simple column name or a typed name expression
+ *  uses STable to evaluate colspec and find an SColumn
+ */
+static
+rc_t VCursorAddColspec ( VCursor *self, uint32_t *idx, const char *colspec )
+{
+    rc_t rc;
+
+    /* find an appropriate column in schema */
+    uint32_t type;
+    VTypedecl cast;
+    const SNameOverload *name;
+    const SColumn *scol = STableFind ( self -> tbl -> stbl, self -> schema,
+        & cast, & name, & type, colspec, "VCursorAddColspec", true );
+    if ( scol == NULL || type != eColumn )
+        rc = SILENT_RC ( rcVDB, rcCursor, rcUpdating, rcColumn, rcNotFound );
+    else
+    {
+        Vector cx_bind;
+        VectorInit ( & cx_bind, 1, self -> schema -> num_indirect );
+        rc = VCursorAddSColumn ( self, idx, scol, & cast, & cx_bind );
+        VectorWhack ( & cx_bind, NULL, NULL );
+	if(rc == 0){
+		char ccolspec[1024];
+		size_t n;
+		rc_t rc2=string_printf(ccolspec,sizeof(ccolspec),&n,"%s_CACHE",colspec);
+
+		VectorSet(&self->v_cache_curs,*idx,NULL);
+		VectorSet(&self->v_cache_cidx,*idx,(const void*)0);
+		if(rc2==0){
+			uint32_t cidx;
+			rc2=VCursorAddColumn(self,&cidx,ccolspec); /** see if column exists in the same table **/
+			DBGMSG(DBG_VDB, DBG_FLAG(DBG_VDB_VDB), ("VCursorAddColspec(%s,vdbcache,sametable) = %d\n", ccolspec,rc2));
+			if(rc2==0 || GetRCState ( rc2 ) == rcExists ){
+				VectorSet(&self->v_cache_curs,*idx,self);
+				VectorSet(&self->v_cache_cidx,*idx,(const void*)(uint64_t)cidx);
+			} else if(self->cache_curs){
+				rc2=VCursorAddColumn(self->cache_curs,&cidx,ccolspec); /** see if column exists in external table **/
+			        DBGMSG(DBG_VDB, DBG_FLAG(DBG_VDB_VDB), ("VCursorAddColspec(%s,vdbcache,remotetable) = %d\n", ccolspec,rc2));
+				if(rc2==0 || GetRCState ( rc2 ) == rcExists ){
+					VectorSet(&self->v_cache_curs,*idx,self->cache_curs);
+					VectorSet(&self->v_cache_cidx,*idx,(const void*)(uint64_t)cidx);
+				}
+			}
+		}
+	}
+    }
+
+    return rc;
+}
+
+
+/* AddColumn
+ *  add a column to an unopened cursor
+ *
+ *  "idx" [ OUT ] - return parameter for column index
+ *
+ *  "name" [ IN ] - NUL terminated column name spec.
+ *  to identify a column by name, provide the column name
+ *  by itself. if there are multiple types available under
+ *  that name, the default type for that column will be
+ *  selected. to select a specific type, the name may
+ *  be cast to that type using a cast expression, e.g.
+ *    "( type ) name"
+ *  the special name "*" may be added to a read cursor.
+ */
+LIB_EXPORT rc_t CC VCursorVAddColumn ( const VCursor *cself,
+    uint32_t *idx, const char *name, va_list args )
+{
+    rc_t rc;
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( idx == NULL )
+        rc = RC ( rcVDB, rcCursor, rcUpdating, rcParam, rcNull );
+    else
+    {
+        * idx = 0;
+
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcUpdating, rcSelf, rcNull );
+        else if ( name == NULL )
+            rc = RC ( rcVDB, rcCursor, rcUpdating, rcName, rcNull );
+        else if ( name [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcCursor, rcUpdating, rcName, rcEmpty );
+        else if ( self -> state == vcFailed )
+            rc = RC ( rcVDB, rcCursor, rcUpdating, rcCursor, rcInvalid );
+        else if ( self -> state != vcConstruct && ! self -> permit_add_column )
+            rc = RC ( rcVDB, rcCursor, rcUpdating, rcCursor, rcLocked );
+        else
+        {
+            char colspec [ 1024 ];
+            int len = vsnprintf ( colspec, sizeof colspec, name, args );
+            if ( len < 0 || len >= sizeof colspec )
+                rc = RC ( rcVDB, rcCursor, rcUpdating, rcName, rcExcessive );
+            else
+            {
+                rc = VCursorAddColspec ( self, idx, colspec );
+                if ( rc == 0 || GetRCState ( rc ) == rcExists )
+                    return rc;
+            }
+
+            if ( ! self -> permit_add_column )
+            {
+                PLOGERR ( klogErr, ( klogErr, rc, "failed to add column '$(spec)' to cursor",
+                                     "spec=%s", colspec ));
+            }
+
+            return rc;
+        }
+    }
+
+    LOGERR ( klogErr, rc, "failed to add column" );
+
+    return rc;
+}
+
+
+/* AddColumn
+ *  add a column to an unopened cursor
+ *
+ *  "idx" [ OUT ] - return parameter for column index
+ *
+ *  "name" [ IN ] - NUL terminated column name spec.
+ *  to identify a column by name, provide the column name
+ *  by itself. if there are multiple types available under
+ *  that name, the default type for that column will be
+ *  selected. to select a specific type, the name may
+ *  be cast to that type using a cast expression, e.g.
+ *    "( type ) name"
+ *  the special name "*" may be added to a read cursor.
+ */
+LIB_EXPORT rc_t CC VCursorAddColumn ( const VCursor *self,
+    uint32_t *idx, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VCursorVAddColumn ( self, idx, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* GetColspec
+ *  a "colspec" is either a simple column name or a typed name expression
+ *  uses STable to evaluate colspec and find an SColumn
+ */
+static
+rc_t VCursorGetColspec ( const VCursor *self, uint32_t *idx, const char *colspec )
+{
+    rc_t rc;
+
+    /* find an appropriate column in schema */
+    uint32_t type;
+    VTypedecl cast;
+    const SNameOverload *name;
+    const SColumn *scol = STableFind ( self -> tbl -> stbl, self -> schema,
+        & cast, & name, & type, colspec, "VCursorGetColspec", true );
+    if ( scol == NULL || type != eColumn )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcColumn, rcNotFound );
+    else
+    {
+        /* if the column-spec gave us the exact column, return it */
+        VColumn *col = VCursorCacheGet ( & self -> col, & scol -> cid );
+        if ( col != NULL )
+        {
+            * idx = col -> ord;
+            return 0;
+        }
+
+        /* prepare for failure */
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcColumn, rcNotFound );
+
+        /* there should be a name overload object */
+        if ( name != NULL )
+        {
+            uint32_t count, i = VectorStart ( & name -> items );
+            uint32_t end = VectorLength ( & name -> items );
+            for ( end += i, count = 0; i < end; ++ i )
+            {
+                scol = ( const void* ) VectorGet ( & name -> items, i );
+                if ( scol != NULL )
+                {
+                    col = VCursorCacheGet ( & self -> col, & scol -> cid );
+                    if ( col != NULL )
+                    {
+                        * idx = col -> ord;
+                        ++ count;
+                    }
+                }
+            }
+
+            if ( count == 1 )
+                return 0;
+            if ( count != 0 )
+                return RC ( rcVDB, rcCursor, rcAccessing, rcColumn, rcAmbiguous );
+        }
+    }
+
+    return rc;
+}
+
+
+/* GetColumnIdx
+ *  retrieve column index by name spec
+ *
+ *  "idx" [ OUT ] - return parameter for column index
+ *
+ *  "name" [ IN ] - NUL terminated column name spec.
+ */
+LIB_EXPORT rc_t CC VCursorVGetColumnIdx ( const VCursor *self,
+    uint32_t *idx, const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( idx == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        * idx = 0;
+
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else if ( name == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcName, rcNull );
+        else if ( name [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcName, rcEmpty );
+        else if ( self -> state == vcFailed )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcCursor, rcInvalid );
+        else
+        {
+            char colspec [ 1024 ];
+            int len = vsnprintf ( colspec, sizeof colspec, name, args );
+            if ( len < 0 || len >= sizeof colspec )
+                rc = RC ( rcVDB, rcCursor, rcAccessing, rcName, rcExcessive );
+            else
+            {
+                rc = VCursorGetColspec ( self, idx, colspec );
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorGetColumnIdx ( const VCursor *self, uint32_t *idx, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VCursorVGetColumnIdx ( self, idx, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* Datatype
+ *  returns typedecl and/or typedef for column data
+ *
+ *  "idx" [ IN ] - column index
+ *
+ *  "type" [ OUT, NULL OKAY ] - returns the column type declaration
+ *
+ *  "def" [ OUT, NULL OKAY ] - returns the definition of the type
+ *  returned in "type_decl"
+ *
+ * NB - one of "type" and "def" must be non-NULL
+ */
+LIB_EXPORT rc_t CC VCursorDatatype ( const VCursor *self, uint32_t idx,
+    struct VTypedecl *type, struct VTypedesc *desc )
+{
+    rc_t rc;
+
+    if ( type == NULL && desc == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            const VColumn *vcol = ( const VColumn* ) VectorGet ( & self -> row, idx );
+            if ( vcol == NULL )
+                rc = RC ( rcVDB, rcCursor, rcAccessing, rcColumn, rcNotFound );
+            else
+                return VColumnDatatype ( vcol, type, desc );
+        }
+
+        if ( type != NULL )
+            memset ( type, 0, sizeof * type );
+        if ( desc != NULL )
+            memset ( desc, 0, sizeof * desc );
+    }
+
+    return rc;
+}
+
+
+/* IdRange
+ *  returns id range for column
+ *
+ *  "idx" [ IN ] - column index
+ *
+ *  "id" [ IN ] - page containing this row id is target
+ *
+ *  "first" [ OUT, NULL OKAY ] and "last" [ OUT, NULL OKAY ] -
+ *  id range is returned in these output parameters, where
+ *  at least ONE must be NOT-NULL
+ */
+typedef struct VCursorIdRangeData VCursorIdRangeData;
+struct VCursorIdRangeData
+{
+    int64_t first, last;
+    rc_t rc;
+};
+
+static
+bool CC column_id_range ( void *item, void *data )
+{
+    if ( ( size_t ) item > 8 )
+    {
+        int64_t first, last;
+        VCursorIdRangeData *pb = data;
+
+        rc_t rc = VColumnIdRange ( ( const void* ) item, & first, & last );
+
+        if ( GetRCState ( rc ) == rcEmpty )
+            return false;
+
+        if ( ( pb -> rc = rc ) != 0 )
+            return true;
+
+        if ( first < pb -> first )
+            pb -> first = first;
+        if ( last > pb -> last )
+            pb -> last = last;
+    }
+
+    return false;
+}
+
+LIB_EXPORT rc_t CC VCursorIdRange ( const VCursor *self, uint32_t idx,
+    int64_t *first, uint64_t *count )
+{
+    rc_t rc;
+
+    if ( first == NULL && count == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        int64_t dummy;
+        uint64_t dummy_count;
+
+        if ( first == NULL )
+            first = & dummy;
+        else if ( count == NULL )
+            count = & dummy_count;
+
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else if ( self -> state < vcReady )
+        {
+            if ( self -> state == vcFailed )
+                rc = RC ( rcVDB, rcCursor, rcAccessing, rcCursor, rcInvalid );
+            else
+                rc = RC ( rcVDB, rcCursor, rcAccessing, rcCursor, rcNotOpen );
+        }
+        else if ( idx == 0 )
+        {
+            VCursorIdRangeData pb;
+
+            pb . first = INT64_MAX;
+            pb . last = INT64_MIN;
+            pb . rc = SILENT_RC ( rcVDB, rcCursor, rcAccessing, rcRange, rcEmpty );
+
+            if ( ! VectorDoUntil ( & self -> row, false, column_id_range, & pb ) )
+            {
+                * first = pb . first;
+                * count = pb . last >= pb . first ? pb . last + 1 - pb . first : 0;
+                return pb . rc;
+            }
+
+            rc = pb . rc;
+        }
+        else
+        {
+            const VColumn *vcol = ( const VColumn* ) VectorGet ( & self -> row, idx );
+            if ( vcol == NULL )
+                rc = RC ( rcVDB, rcCursor, rcAccessing, rcColumn, rcNotFound );
+            else {
+                int64_t last;
+
+                rc = VColumnIdRange ( vcol, first, &last );
+                if (rc == 0)
+                    *count = last + 1 - *first;
+                return rc;
+            }
+        }
+
+        * first = * count = 0;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorPageIdRange ( struct VCursor const *self,
+    uint32_t idx, int64_t id, int64_t *first, int64_t *last )
+{
+    rc_t rc;
+
+    if ( first == NULL && last == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        int64_t dummy;
+        if ( first == NULL )
+            first = & dummy;
+        else if ( last == NULL )
+            last = & dummy;
+
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            const VColumn *vcol = ( const VColumn* ) VectorGet ( & self -> row, idx );
+            if ( vcol == NULL )
+                rc = RC ( rcVDB, rcCursor, rcAccessing, rcColumn, rcNotFound );
+            else
+                return VColumnPageIdRange ( vcol, id, first, last );
+        }
+
+        * first = * last = 0;
+    }
+
+    return rc;
+}
+
+
+/* Open
+ *  open cursor, resolving schema
+ *  for the set of opened columns
+ *
+ *  NB - there is no corresponding "Close"
+ *  use "Release" instead.
+ */
+typedef struct VProdResolveData VProdResolveData;
+struct VProdResolveData
+{
+    VProdResolve pr;
+    rc_t rc;
+};
+
+
+static
+bool CC VCursorResolveColumn ( void *item, void *data )
+{
+    if ( item != NULL )
+    {
+        void *ignore;
+        VCursor *self;
+
+        VColumn *col = item;
+        VProdResolveData *pb = data;
+        SColumn *scol = ( SColumn* ) col -> scol;
+
+        VProduction *src = NULL;
+        pb -> rc = VProdResolveColumnRoot ( & pb -> pr, & src, scol );
+        if ( pb -> rc == 0 )
+        {
+            if ( src > FAILED_PRODUCTION )
+            {
+                /* repair for incomplete implicit column decl */
+                if ( scol -> td . type_id == 0 )
+                    scol -> td = src -> fd . td;
+
+                return false;
+            }
+
+            pb -> rc = RC ( rcVDB, rcCursor, rcOpening, rcColumn, rcUndefined );
+        }
+
+        /* check for tolerance */
+        self = pb -> pr . curs;
+        if ( ! pb -> pr . ignore_column_errors )
+        {
+            if ( ! self -> permit_post_open_add )
+            {
+                PLOGERR ( klogErr, ( klogErr, pb -> rc, "failed to resolve column '$(name)' idx '$(idx)'",
+                                     "name=%.*s,idx=%u"
+                                     , ( int ) scol -> name -> name . size
+                                     , scol -> name -> name . addr
+                                     , col -> ord ));
+            }
+
+            return true;
+        }
+
+        /* remove from row and cache */
+        VectorSwap ( & self -> row, col -> ord, NULL, & ignore );
+        VCursorCacheSwap ( & self -> col, & scol -> cid, NULL, & ignore );
+
+        /* dump the VColumn */
+        VColumnWhack ( col, NULL );
+
+        /* return no-error */
+        pb -> rc = 0;
+    }
+
+    return false;
+}
+
+static
+rc_t VCursorOpenColumn ( const VCursor *cself, VColumn *col )
+{
+    KDlset *libs;
+    VCursor *self = ( VCursor* ) cself;
+
+    Vector cx_bind;
+    VProdResolveData pb;
+    pb . pr . schema = self -> schema;
+    pb . pr . ld = self -> tbl -> linker;
+    pb . pr . stbl = self -> stbl;
+    pb . pr . curs = self;
+    pb . pr . cache = & self -> prod;
+    pb . pr . owned = & self -> owned;
+    pb . pr . cx_bind = & cx_bind;
+    pb . pr . chain = chainDecoding;
+    pb . pr . blobbing = false;
+    pb . pr . ignore_column_errors = false;
+    pb . pr . discover_writable_columns = false;
+
+    VectorInit ( & cx_bind, 1, self -> schema -> num_indirect );
+
+    pb . rc = VLinkerOpen ( pb . pr . ld, & libs );
+    if ( pb . rc == 0 )
+    {
+        pb . pr . libs = libs;
+        VCursorResolveColumn ( col, & pb );
+        KDlsetRelease ( libs );
+    }
+
+    VectorWhack ( & cx_bind, NULL, NULL );
+
+    return pb . rc;
+}
+
+/* PostOpenAdd
+ *  handle opening of a column after the cursor is opened
+ */
+rc_t VCursorPostOpenAddRead ( VCursor *self, VColumn *col )
+{
+    return VCursorOpenColumn ( self, col );
+}
+
+
+static
+rc_t VCursorResolveColumnProductions ( VCursor *self,
+    const KDlset *libs, bool ignore_failures )
+{
+    Vector cx_bind;
+    VProdResolveData pb;
+    pb . pr . schema = self -> schema;
+    pb . pr . ld = self -> tbl -> linker;
+    pb . pr . libs = libs;
+    pb . pr . stbl = self -> stbl;
+    pb . pr . curs = self;
+    pb . pr . cache = & self -> prod;
+    pb . pr . owned = & self -> owned;
+    pb . pr . cx_bind = & cx_bind;
+    pb . pr . chain = chainDecoding;
+    pb . pr . blobbing = false;
+    pb . pr . ignore_column_errors = ignore_failures;
+    pb . pr . discover_writable_columns = false;
+    pb . rc = 0;
+
+    VectorInit ( & cx_bind, 1, self -> schema -> num_indirect );
+
+    if ( ! VectorDoUntil ( & self -> row, false, VCursorResolveColumn, & pb ) )
+        pb . rc = 0;
+
+    VectorWhack ( & cx_bind, NULL, NULL );
+
+    return pb . rc;
+}
+
+rc_t VCursorOpenRead ( VCursor *self, const KDlset *libs )
+{
+    rc_t rc;
+
+    if ( self -> state >= vcReady )
+        rc = 0;
+    else if ( self -> state == vcFailed )
+        rc = RC ( rcVDB, rcCursor, rcOpening, rcCursor, rcInvalid );
+    else
+    {
+        rc = VCursorResolveColumnProductions ( self, libs, false );
+        if ( rc == 0 )
+        {
+            self -> row_id = self -> start_id = self -> end_id = 1;
+            self -> state = vcReady;
+            if( self -> cache_curs )
+            {
+                VCursorOpenRead( (VCursor*)self -> cache_curs, libs );
+            }
+            return rc;
+        }
+        else
+        {
+            /* in case the column is not defined ( rcColumn, rcUndefined )
+                we want to check if the table is empty, and report that instead
+            */
+            if ( GetRCState( rc ) == rcUndefined && 
+                 GetRCObject( rc ) == ( enum RCObject )rcColumn )
+            {
+                bool empty;
+                if ( ( VTableIsEmpty ( self -> tbl, &empty ) == 0 ) && empty )
+                {
+                    rc = RC ( rcVDB, rcCursor, rcOpening, rcTable, rcEmpty );        
+                }
+            }
+        }
+        self -> state = vcFailed;
+    }
+
+    return rc;
+}
+
+static
+rc_t VCursorOpenForListing ( const VCursor *cself )
+{
+    rc_t rc;
+    VCursor *self = ( VCursor* ) cself;
+
+    VLinker *ld = self -> tbl -> linker;
+
+    KDlset *libs;
+    rc = VLinkerOpen ( ld, & libs );
+    if ( rc == 0 )
+    {
+        rc = VCursorResolveColumnProductions ( self, libs, true );
+        KDlsetRelease ( libs );
+    }
+    return rc;
+}
+
+
+
+/* RowId
+ *  return id from row cursor within open blob
+ *
+ *  "id" [ OUT ] - current row id
+ */
+LIB_EXPORT rc_t CC VCursorRowId ( const VCursor *self, int64_t *id )
+{
+    rc_t rc;
+    if ( id == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * id = self -> row_id;
+            return 0;
+        }
+
+        * id = 0;
+    }
+
+    return rc;
+}
+
+
+/* SetRowIdRead - PRIVATE
+ *  seek to given row id
+ *
+ *  "row_id" [ IN ] - row id to select
+ */
+rc_t VCursorSetRowIdRead ( VCursor *self, int64_t row_id )
+{
+    assert ( self != NULL );
+
+    self -> row_id = row_id;
+    return 0;
+}
+
+
+/* OpenRowRead
+ * CloseRowRead
+ */
+rc_t VCursorOpenRowRead ( VCursor *self )
+{
+    assert ( self != NULL );
+
+    self -> state = vcRowOpen;
+    return 0;
+}
+
+rc_t VCursorCloseRowRead ( VCursor *self )
+{
+    assert ( self != NULL );
+
+    ++ self -> row_id;
+    self -> state = vcReady;
+    return 0;
+}
+
+
+/* Read
+ *  read entire single row of byte-aligned data into a buffer
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ *
+ *  "elem_bits" [ IN ] - expected element size in bits, required
+ *  to be compatible with the actual element size, and be a multiple
+ *  of 8 ( byte-aligned ). for non-byte-aligned data, see ReadBits
+ *
+ *  "buffer" [ OUT ] and "blen" [ IN ] - return buffer for row data
+ *  where "blen" gives buffer capacity in elements. the total buffer
+ *  size in bytes == ( "elem_bits" * "blen" + 7 ) / 8.
+ *
+ *  "row_len" [ OUT ] - return parameter for the number of elements
+ *  in the requested row.
+ *
+ *  when the return code is 0, "row_len" will contain the number of
+ *  elements read into buffer. if the return code indicates that the
+ *  buffer is too small, "row_len" will give the required buffer length.
+ */
+static
+rc_t VCursorReadColumnDirectInt ( const VCursor *cself, int64_t row_id, uint32_t col_idx,
+    uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len, uint32_t *repeat_count,
+    const VBlob **rslt )
+{
+    rc_t rc,rc_cache=0;
+    const VColumn *col;
+    const VBlob *blob;
+
+    col = ( const void* ) VectorGet ( & cself -> row, col_idx );
+    if ( col == NULL )
+        return RC ( rcVDB, rcCursor, rcReading, rcColumn, rcInvalid );
+
+    /* 2.0 behavior if not caching */
+    if ( cself -> blob_mru_cache == NULL )
+        return VColumnRead ( col, row_id, elem_bits, base, boff, row_len, (VBlob**) rslt );
+
+    /* check MRU blob */
+    blob = VBlobMRUCacheFind(cself->blob_mru_cache,col_idx,row_id);
+    if(blob){
+        assert(row_id >= blob->start_id && row_id <= blob->stop_id);
+        /* if the caller wants the blob back... */
+        if ( rslt != NULL )
+                * rslt = blob;
+        /* ask column to read from blob */
+        return VColumnReadCachedBlob ( col, blob, row_id, elem_bits, base, boff, row_len, repeat_count);
+    }
+    { /* ask column to produce a blob to be cached */
+	VBlobMRUCacheCursorContext cctx;
+	cctx.cache=cself -> blob_mru_cache;
+	cctx.col_idx = col_idx;
+	rc = VColumnReadBlob(col,&blob,row_id,elem_bits,base,boff,row_len,repeat_count,&cctx);
+    }
+    if ( rc != 0 || blob == NULL ){
+        if(rslt) *rslt = NULL;
+        return rc;
+    }
+    if(blob->stop_id > blob->start_id + 4)
+	    rc_cache=VBlobMRUCacheSave(cself->blob_mru_cache, col_idx, blob);
+    if(rslt==NULL){ /** user does not care about the blob ***/
+        if( rc_cache == 0){
+            VBlobRelease((VBlob*)blob);
+        } /** else the memory will leak **/
+    } else {
+        *rslt=blob;
+    }
+    return 0;
+}
+
+/* GetBlob
+ *  retrieve a blob of data containing the current row id
+ * GetBlobDirect
+ *  retrieve a blob of data containing the requested row id
+ *
+ *  "blob" [ OUT ] - return parameter for a new reference
+ *  to VBlob containing requested cell. NB - must be released
+ *  via VBlobRelease when no longer needed.
+ *
+ *  "row_id" [ IN ] - allows ReadDirect random access to any cell
+ *  in column
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ */
+LIB_EXPORT rc_t CC VCursorGetBlob ( const VCursor *self,
+    const VBlob **blob, uint32_t col_idx )
+{
+    rc_t rc;
+
+    if ( blob == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else if ( ! self -> read_only )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcCursor, rcWriteonly );
+        else
+        {
+            const void *base;
+            uint32_t elem_bits, boff, row_len;
+
+            switch ( self -> state )
+            {
+            case vcConstruct:
+                rc = RC ( rcVDB, rcCursor, rcReading, rcCursor, rcNotOpen );
+                break;
+            case vcReady:
+                rc = RC ( rcVDB, rcCursor, rcReading, rcRow, rcNotOpen );
+                break;
+            case vcRowOpen:
+                rc = VCursorReadColumnDirectInt( self, self -> row_id, col_idx, &elem_bits, &base, &boff, &row_len, NULL, blob );
+                if ( rc == 0 )
+                {
+                    rc = VBlobAddRef ( ( VBlob* ) *blob );
+                    if ( rc == 0 )
+                        return 0;
+                }
+                break;
+            default:
+                rc = RC ( rcVDB, rcCursor, rcReading, rcCursor, rcInvalid );
+            }
+        }
+
+        * blob = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorGetBlobDirect ( const VCursor *self,
+    const VBlob **blob, int64_t row_id, uint32_t col_idx )
+{
+    rc_t rc;
+
+    if ( blob == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else if ( ! self -> read_only )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcCursor, rcWriteonly );
+        else
+        {
+            const void *base;
+            uint32_t elem_bits, boff, row_len;
+
+            switch ( self -> state )
+            {
+            case vcConstruct:
+                rc = RC ( rcVDB, rcCursor, rcReading, rcCursor, rcNotOpen );
+                break;
+            case vcReady:
+            case vcRowOpen:
+                rc = VCursorReadColumnDirectInt ( self, row_id, col_idx, &elem_bits, &base, &boff, &row_len, NULL, blob );
+                if ( rc == 0 )
+                {
+                    rc = VBlobAddRef ( ( VBlob* ) *blob );
+                    if ( rc == 0 )
+                        return 0;
+                }
+                break;
+            default:
+                rc = RC ( rcVDB, rcCursor, rcReading, rcCursor, rcInvalid );
+            }
+        }
+
+        * blob = NULL;
+    }
+    return rc;
+}
+
+static
+rc_t VCursorReadColumnDirect ( const VCursor *self, int64_t row_id, uint32_t col_idx,
+    uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len )
+{
+    bool cache_col_active_save;
+    if ( ! self -> read_only )
+        return RC ( rcVDB, rcCursor, rcReading, rcCursor, rcWriteonly );
+
+    switch ( self -> state )
+    {
+		case vcConstruct : return RC ( rcVDB, rcCursor, rcReading, rcCursor, rcNotOpen );
+		case vcReady :
+		case vcRowOpen :  break;
+		default : return RC ( rcVDB, rcCursor, rcReading, rcCursor, rcInvalid );
+    }
+	
+    cache_col_active_save = self->cache_col_active;
+    ( ( VCursor* ) self )->cache_col_active = false;
+    if ( self->cache_curs != NULL )
+	{
+		const VCursor *curs = VectorGet( &self->v_cache_curs, col_idx );
+		if ( curs != NULL )
+		{
+			( ( VCursor* ) self )->cache_col_active = true;
+			if ( self->cache_empty_start == 0 ||
+			     row_id < self->cache_empty_start ||
+				 row_id > self->cache_empty_end )
+			{
+				uint32_t repeat_count;
+				uint32_t cidx = ( uint32_t )( uint64_t )VectorGet( &self->v_cache_cidx, col_idx );
+				rc_t rc2 = VCursorReadColumnDirectInt( curs, row_id, cidx, elem_bits, base, boff, row_len, &repeat_count, NULL );
+				if ( rc2 == 0 )
+				{
+					if ( *row_len > 0 )
+					{
+						( ( VCursor* )self )->cache_col_active = cache_col_active_save;
+						return 0;
+					}
+					else
+					{
+						/*** save window where cache is useless */
+						( ( VCursor* )self )->cache_empty_start = row_id;
+						( ( VCursor* )self )->cache_empty_end = row_id + repeat_count - 1;
+					}
+				}
+			}	
+		}
+	}
+	
+    {
+		rc_t rc = VCursorReadColumnDirectInt( self, row_id, col_idx, elem_bits, base, boff, row_len, NULL, NULL );
+		( ( VCursor* )self )->cache_col_active = cache_col_active_save;
+		return rc;
+    }
+}
+
+
+static
+rc_t VCursorReadColumn ( const VCursor *self, uint32_t col_idx,
+    uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len )
+{
+    rc_t rc = 0;
+    int64_t row_id = self->row_id;
+    bool cache_col_active_save;
+    if ( ! self -> read_only )
+        return RC ( rcVDB, rcCursor, rcReading, rcCursor, rcWriteonly );
+
+    switch ( self -> state )
+    {
+    case vcConstruct:
+        return RC ( rcVDB, rcCursor, rcReading, rcCursor, rcNotOpen );
+    case vcReady:
+        return RC ( rcVDB, rcCursor, rcReading, rcRow, rcNotOpen );
+    case vcRowOpen:
+        break;
+    default:
+        return RC ( rcVDB, rcCursor, rcReading, rcCursor, rcInvalid );
+    }
+    cache_col_active_save = self->cache_col_active;
+    ((VCursor*)self)->cache_col_active=false;
+    if(self->cache_curs)
+    {
+        const VCursor *curs=VectorGet(&self->v_cache_curs,col_idx);
+        if(curs)
+        {
+            ((VCursor*)self)->cache_col_active=true;
+            if(self->cache_empty_start == 0 ||  row_id < self->cache_empty_start || row_id > self->cache_empty_end)
+            {
+                uint32_t repeat_count;
+                uint32_t cidx =  (uint32_t)(uint64_t)VectorGet(&self->v_cache_cidx,col_idx);
+                rc_t rc2 = VCursorReadColumnDirectInt(curs,row_id, cidx, elem_bits, base, boff, row_len, &repeat_count,NULL );
+                if(rc2==0)
+                {
+                    if(*row_len > 0)
+                    {
+                        ((VCursor*)self)->cache_col_active=cache_col_active_save;
+                        return 0;
+                    }
+                    else
+                    {
+                        /*** save window where cache is useless */
+                        ((VCursor*)self)->cache_empty_start = row_id;
+                        ((VCursor*)self)->cache_empty_end = row_id + repeat_count -1;
+                    }
+                }
+            }
+        }
+    }
+
+    rc=VCursorReadColumnDirectInt ( self, row_id, col_idx, elem_bits, base, boff, row_len, NULL, NULL );
+    ((VCursor*)self)->cache_col_active=cache_col_active_save;
+    return rc;
+}
+
+static __inline__
+bool bad_elem_bits ( uint32_t elem_size, uint32_t elem_bits )
+{
+    if ( elem_size != elem_bits )
+    {
+        if ( elem_size < elem_bits && elem_bits % elem_size != 0 )
+            return true;
+        return ( elem_size % elem_bits != 0 );
+    }
+    return false;
+}
+
+LIB_EXPORT rc_t CC VCursorRead ( const VCursor *self, uint32_t col_idx,
+    uint32_t elem_bits, void *buffer, uint32_t blen, uint32_t *row_len )
+{
+    rc_t rc;
+
+    if ( row_len == NULL )
+        rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcSelf, rcNull );
+        else if ( elem_bits == 0 || ( elem_bits & 7 ) != 0 )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcInvalid );
+        else
+        {
+            uint32_t elem_size; const void *base; uint32_t boff;
+            rc = VCursorReadColumn ( self, col_idx, & elem_size,
+                & base, & boff, row_len );
+            if ( rc == 0 )
+            {
+                if ( bad_elem_bits ( elem_size, elem_bits ) )
+                    rc = RC ( rcVDB, rcCursor, rcReading, rcType, rcInconsistent );
+                else if ( * row_len != 0 )
+                {
+                    if ( blen == 0 )
+                        return RC ( rcVDB, rcCursor, rcReading, rcBuffer, rcInsufficient );
+                    if ( buffer == NULL )
+                        rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcNull );
+                    else
+                    {
+                        uint64_t to_read = * row_len * elem_size;
+                        uint64_t bsize = blen * elem_bits;
+
+                        /* always return the required buffer size */
+                        * row_len = ( uint32_t ) ( to_read / elem_bits );
+
+                        /* detect buffer too small */
+                        if ( to_read > bsize )
+                        {
+                            rc = RC ( rcVDB, rcCursor, rcReading, rcBuffer, rcInsufficient );
+                            to_read = bsize;
+                        }
+
+                        /* copy out data up to limit */
+                        assert ( boff == 0 );
+                        memmove ( buffer, base, ( size_t ) ( to_read >> 3 ) );
+
+                        return rc;
+                    }
+                }
+            }
+        }
+
+        * row_len = 0;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorReadDirect ( const VCursor *self, int64_t row_id, uint32_t col_idx,
+    uint32_t elem_bits, void *buffer, uint32_t blen, uint32_t *row_len )
+{
+    rc_t rc;
+
+    if ( row_len == NULL )
+        rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcSelf, rcNull );
+        else if ( elem_bits == 0 || ( elem_bits & 7 ) != 0 )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcInvalid );
+        else
+        {
+            uint32_t elem_size; const void *base; uint32_t boff;
+            rc = VCursorReadColumnDirect ( self, row_id, col_idx,
+                & elem_size, & base, & boff, row_len );
+            if ( rc == 0 )
+            {
+                if ( bad_elem_bits ( elem_size, elem_bits ) )
+                    rc = RC ( rcVDB, rcCursor, rcReading, rcType, rcInconsistent );
+                else if ( * row_len != 0 )
+                {
+                    if ( blen == 0 )
+                        return RC ( rcVDB, rcCursor, rcReading, rcBuffer, rcInsufficient );
+                    if ( buffer == NULL )
+                        rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcNull );
+                    else
+                    {
+                        uint64_t to_read = * row_len * elem_size;
+                        uint64_t bsize = blen * elem_bits;
+
+                        /* always return the required buffer size */
+                        * row_len = ( uint32_t ) ( to_read / elem_bits );
+
+                        /* detect buffer too small */
+                        if ( to_read > bsize )
+                        {
+                            rc = RC ( rcVDB, rcCursor, rcReading, rcBuffer, rcInsufficient );
+                            to_read = bsize;
+                        }
+
+                        /* copy out data up to limit */
+                        assert ( boff == 0 );
+                        memmove ( buffer, base, ( size_t ) ( to_read >> 3 ) );
+
+                        return rc;
+                    }
+                }
+            }
+        }
+
+        * row_len = 0;
+    }
+
+    return rc;
+}
+
+
+/* ReadBits
+ *  read single row of potentially bit-aligned column data into a buffer
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ *
+ *  "elem_bits" [ IN ] - expected element size in bits, required to be
+ *  compatible with the actual element size, and may ( or may not ) be
+ *  a multiple of 8 ( byte aligned ).
+ *
+ *  "start" [ IN ] - zero-based starting index to first element,
+ *  valid from 0 .. row_len - 1
+ *
+ *  "buffer" [ IN ], "boff" [ IN ] and "blen" [ IN ] -
+ *  return buffer for row data, where "boff" is in BITS
+ *  and "blen" is in ELEMENTS.
+ *
+ *  "num_read" [ OUT ] - return parameter for the number of elements
+ *  read, which is <= "blen"
+ *
+ *  "remaining" [ OUT, NULL OKAY ] - optional return parameter for
+ *  the number of elements remaining to be read. specifically,
+ *  "start" + "num_read" + "remaining" == row length, assuming that
+ *  "start" <= row length.
+ */
+LIB_EXPORT rc_t CC VCursorReadBits ( const VCursor *self, uint32_t col_idx,
+    uint32_t elem_bits, uint32_t start, void *buffer, uint32_t off,
+    uint32_t blen, uint32_t *num_read, uint32_t *remaining )
+{
+    rc_t rc;
+
+    uint32_t dummy;
+    if ( remaining == NULL )
+        remaining = & dummy;
+
+    if ( num_read == NULL )
+        rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcSelf, rcNull );
+        else if ( elem_bits == 0 )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcInvalid );
+        else
+        {
+            uint32_t elem_size; const void *base; uint32_t boff;
+            rc = VCursorReadColumn ( self, col_idx, & elem_size,
+                & base, & boff, num_read );
+            if ( rc == 0 )
+            {
+                if ( bad_elem_bits ( elem_size, elem_bits ) )
+                    rc = RC ( rcVDB, rcCursor, rcReading, rcType, rcInconsistent );
+                else if ( * num_read != 0 )
+                {
+                    uint64_t to_read = * num_read * elem_size;
+                    uint64_t doff = start * elem_bits;
+                    to_read = to_read > doff ? to_read - doff : 0;
+                    if ( blen == 0 )
+                    {
+                        * num_read = 0;
+                        * remaining = ( uint32_t ) ( to_read / elem_bits );
+                        return 0;
+                    }
+
+                    if ( buffer == NULL )
+                        rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcNull );
+                    else
+                    {
+                        uint64_t bsize = blen * elem_size;
+                        if ( to_read <= bsize )
+                            * remaining = 0;
+                        else
+                        {
+                            * remaining = (uint32_t)( ( to_read - bsize ) / elem_bits );
+                            to_read = bsize;
+                        }
+                        bitcpy ( buffer, off, base, boff + doff, ( bitsz_t ) to_read );
+                        * num_read = ( uint32_t ) ( to_read / elem_bits );
+                        return 0;
+                    }
+                }
+            }
+        }
+
+        * num_read = 0;
+    }
+
+    * remaining = 0;
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorReadBitsDirect ( const VCursor *self, int64_t row_id, uint32_t col_idx,
+    uint32_t elem_bits, uint32_t start, void *buffer, uint32_t off,
+    uint32_t blen, uint32_t *num_read, uint32_t *remaining )
+{
+    rc_t rc;
+
+    uint32_t dummy;
+    if ( remaining == NULL )
+        remaining = & dummy;
+
+    if ( num_read == NULL )
+        rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcSelf, rcNull );
+        else if ( elem_bits == 0 )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcInvalid );
+        else
+        {
+            uint32_t elem_size; const void *base; uint32_t boff;
+            rc = VCursorReadColumnDirect ( self, row_id, col_idx,
+                & elem_size, & base, & boff, num_read );
+            if ( rc == 0 )
+            {
+                if ( bad_elem_bits ( elem_size, elem_bits ) )
+                    rc = RC ( rcVDB, rcCursor, rcReading, rcType, rcInconsistent );
+                else if ( * num_read != 0 )
+                {
+                    uint64_t to_read = * num_read * elem_size;
+                    uint64_t doff = start * elem_bits;
+                    to_read = to_read > doff ? to_read - doff : 0;
+                    if ( blen == 0 )
+                    {
+                        * num_read = 0;
+                        * remaining = ( uint32_t ) ( to_read / elem_bits );
+                        return 0;
+                    }
+
+                    if ( buffer == NULL )
+                        rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcNull );
+                    else
+                    {
+                        uint64_t bsize = blen * elem_size;
+                        if ( to_read <= bsize )
+                            * remaining = 0;
+                        else
+                        {
+                            * remaining = (uint32_t)( ( to_read - bsize ) / elem_bits );
+                            to_read = bsize;
+                        }
+                        bitcpy ( buffer, off, base, boff + doff, ( bitsz_t ) to_read );
+                        * num_read = ( uint32_t ) ( to_read / elem_bits );
+                        return 0;
+                    }
+                }
+            }
+        }
+
+        * num_read = 0;
+    }
+
+    * remaining = 0;
+
+    return rc;
+}
+
+
+/* CellData
+ *  access pointer to single cell of potentially bit-aligned column data
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ *
+ *  "elem_bits" [ OUT, NULL OKAY ] - optional return parameter for
+ *  element size in bits
+ *
+ *  "base" [ OUT ] and "boff" [ OUT, NULL OKAY ] -
+ *  compound return parameter for pointer to row starting bit
+ *  where "boff" is in BITS
+ *
+ *  "row_len" [ OUT, NULL OKAY ] - the number of elements in row
+ */
+LIB_EXPORT rc_t CC VCursorCellData ( const VCursor *self, uint32_t col_idx,
+    uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len )
+{
+    rc_t rc;
+
+    uint32_t dummy [ 3 ];
+    if ( row_len == NULL )
+        row_len = & dummy [ 0 ];
+    if ( boff == NULL )
+        boff = & dummy [ 1 ];
+    if ( elem_bits == NULL )
+        elem_bits = & dummy [ 2 ];
+
+    if ( base == NULL )
+        rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcSelf, rcNull );
+        else
+        {
+            rc = VCursorReadColumn ( self, col_idx,
+                elem_bits, base, boff, row_len );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        * base = NULL;
+    }
+
+    * elem_bits = 0;
+    * boff = 0;
+    * row_len = 0;
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorCellDataDirect ( const VCursor *self, int64_t row_id, uint32_t col_idx,
+    uint32_t *elem_bits, const void **base, uint32_t *boff, uint32_t *row_len )
+{
+    rc_t rc;
+
+    uint32_t dummy [ 3 ];
+    if ( row_len == NULL )
+        row_len = & dummy[ 0 ];
+    if ( boff == NULL )
+        boff = & dummy [ 1 ];
+    if ( elem_bits == NULL )
+        elem_bits = & dummy [ 2 ];
+
+    if ( base == NULL )
+        rc = RC ( rcVDB, rcCursor, rcReading, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcReading, rcSelf, rcNull );
+        else
+        {
+            rc = VCursorReadColumnDirect ( self, row_id, col_idx,
+                elem_bits, base, boff, row_len );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        * base = NULL;
+    }
+
+    * elem_bits = 0;
+    * boff = 0;
+    * row_len = 0;
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorDataPrefetch( const VCursor *cself,
+										const int64_t *row_ids,
+										uint32_t col_idx,
+										uint32_t num_rows,
+										int64_t min_valid_row_id,
+										int64_t max_valid_row_id,
+										bool continue_on_error )
+{
+	rc_t rc=0;
+	const VColumn *col = ( const void* ) VectorGet ( & cself -> row, col_idx );
+	if ( col == NULL )
+	{
+		return RC ( rcVDB, rcCursor, rcReading, rcColumn, rcInvalid );
+	}
+	
+	if ( cself->blob_mru_cache && num_rows > 0 )
+	{
+		int64_t *row_ids_sorted = malloc( num_rows * sizeof( *row_ids_sorted ) );
+		if ( row_ids_sorted != NULL )
+		{
+			uint32_t i, num_rows_sorted;
+			for( i = 0, num_rows_sorted = 0; i < num_rows; i++ )
+			{
+				int64_t row_id = row_ids[ i ];
+				if ( row_id >= min_valid_row_id && row_id <= max_valid_row_id )
+				{
+					row_ids_sorted[ num_rows_sorted++ ] = row_id;
+				}
+			}
+			if ( num_rows_sorted > 0 )
+			{
+				int64_t last_cached_row_id = INT64_MIN;
+				bool first_time = true;
+				ksort_int64_t( row_ids_sorted, num_rows_sorted );
+				for	( i = 0; rc==0 && i < num_rows_sorted; i++ )
+				{
+					int64_t row_id = row_ids_sorted[ i ];
+					if ( last_cached_row_id < row_id )
+					{
+						VBlob * blob = ( VBlob* )VBlobMRUCacheFind( cself->blob_mru_cache, col_idx, row_id );
+						if ( blob != NULL )
+						{
+							last_cached_row_id = blob->stop_id;
+						}
+						else
+						{ 
+							/* prefetch it **/
+							/** ask production for the blob **/
+							VBlobMRUCacheCursorContext cctx;
+
+							cctx.cache = cself -> blob_mru_cache;
+							cctx.col_idx = col_idx;
+							rc = VProductionReadBlob ( col->in, & blob, row_id, 1, &cctx );
+							if ( rc == 0 )
+							{
+								rc_t rc_cache;
+								/** always cache prefetch requests **/
+								if ( first_time )
+								{ 
+									VBlobMRUCacheResumeFlush( cself->blob_mru_cache ); /** next call will clean cache if too big **/
+									rc_cache = VBlobMRUCacheSave( cself->blob_mru_cache, col_idx, blob );
+									VBlobMRUCacheSuspendFlush( cself->blob_mru_cache ); /** suspending for the rest **/
+									first_time = false;
+								}
+								else
+								{
+									rc_cache = VBlobMRUCacheSave( cself->blob_mru_cache, col_idx, blob );
+								}
+								
+								if ( rc_cache == 0 )
+								{
+									VBlobRelease( blob );
+									last_cached_row_id = blob->stop_id;
+								}
+							}
+							else if ( continue_on_error )
+							{
+								rc = 0; /** reset failed row ***/
+								last_cached_row_id = row_id; /*** and skip it **/
+							}
+						}
+					}
+				}
+			}
+			free( row_ids_sorted );
+		}
+		else
+		{
+			rc= RC( rcVDB, rcCursor, rcReading, rcMemory, rcExhausted );
+		}
+	}
+	return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent table
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VCursorOpenParentRead ( const VCursor *self, const VTable **tbl )
+{
+    rc_t rc;
+
+    if ( tbl == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = VTableAddRef ( self -> tbl );
+            if ( rc == 0 )
+            {
+                * tbl = self -> tbl;
+                return 0;
+            }
+        }
+
+        * tbl = NULL;
+    }
+
+    return rc;
+}
+
+struct insert_overloaded_pb
+{
+    VCursor *curs;
+    Vector *cx_bind;
+};
+
+static
+void CC insert_overloaded_scolumns ( void *item, void *data )
+{
+    struct insert_overloaded_pb *pb = data;
+    const SColumn *scol = ( const void* ) item;
+
+    uint32_t ignore;
+    VCursorAddSColumn ( pb -> curs, & ignore, scol, NULL, pb -> cx_bind );
+}
+
+static
+void VCursorListCol_walk_through_columns_and_add_to_cursor ( VCursor *self )
+{
+    uint32_t idx = VectorStart ( & self -> stbl -> cname );
+    uint32_t end = VectorLength ( & self -> stbl -> cname );
+
+    Vector cx_bind;
+    struct insert_overloaded_pb pb;
+    pb . curs = self;
+    pb . cx_bind = & cx_bind;
+    VectorInit ( & cx_bind, 1, self -> schema -> num_indirect );
+
+    for ( end += idx; idx < end; ++idx )
+    {
+        /* look at the table column name guy */
+        const SNameOverload* ol_entry = ( const SNameOverload* ) VectorGet ( & self -> stbl -> cname, idx );
+        if ( ol_entry != NULL )
+            VectorForEach ( & ol_entry -> items, false, insert_overloaded_scolumns, & pb );
+    }
+
+    VectorWhack ( & cx_bind, NULL, NULL );
+}
+
+static
+rc_t VCursorListCol_consolidate_and_insert( const VCursor *self, BSTree *columns )
+{
+    rc_t rc = VCursorOpenForListing ( self );
+    if ( rc == 0 )
+    {
+        uint32_t idx = VectorStart ( & self -> row );
+        uint32_t end = VectorLength ( & self -> row );
+
+        for ( end += idx; idx < end; ++idx )
+        {
+            const VColumn* vcol = ( const VColumn* ) VectorGet ( & self -> row, idx );
+            if ( vcol != NULL )
+            {
+                VColumnRef *cref;
+                rc = VColumnRefMake ( & cref, self -> schema, vcol -> scol );
+                if ( rc != 0 )
+                    break;
+
+                rc = BSTreeInsert ( columns, & cref -> n, VColumnRefSort );
+                assert ( rc == 0 );
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* ListReadableColumns
+ *  performs an insert of '*' to cursor
+ *  attempts to resolve all read rules
+ *  records all SColumns that successfully resolved
+ *  populates BTree with VColumnRef objects
+ */
+rc_t VCursorListReadableColumns ( VCursor *self, BSTree *columns )
+{
+    /* add '*' to cursor */
+    VCursorListCol_walk_through_columns_and_add_to_cursor ( self );
+
+    /* insert all columns into tree */
+    return VCursorListCol_consolidate_and_insert ( self, columns );
+}
+
+
+/* GetUserData
+ *  store/retrieve an opaque pointer to user data
+ *
+ *  "data" [ OUT ] - return parameter for getting data
+ */
+LIB_EXPORT rc_t CC VCursorGetUserData ( const VCursor *self, void **data )
+{
+    rc_t rc;
+
+    if ( data == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * data = self -> user;
+            return 0;
+        }
+
+        * data = NULL;
+    }
+
+    return rc;
+}
+
+/* SetUserData
+ *  store/retrieve an opaque pointer to user data
+ *
+ *  "data" [ IN ] - parameter for setting data
+ *
+ *  "destroy" [ IN, NULL OKAY ] - optional destructor param
+ *  invoked from destructor of "self"
+ */
+LIB_EXPORT rc_t CC VCursorSetUserData ( const VCursor *cself,
+    void *data, void ( CC * destroy ) ( void *data ) )
+{
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( self == NULL )
+        return RC ( rcVDB, rcCursor, rcUpdating, rcSelf, rcNull );
+
+    self -> user = data;
+    self -> user_whack = destroy;
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VCursorLinkedCursorGet(const VCursor *cself,const char *tbl,VCursor const **curs)
+{
+    rc_t rc;
+
+    if ( curs == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( cself == NULL )
+            rc = RC(rcVDB, rcCursor, rcAccessing, rcSelf, rcNull);
+        else if ( tbl == NULL )
+            rc = RC(rcVDB, rcCursor, rcAccessing, rcName, rcNull);
+        else if ( tbl [ 0 ] == 0 )
+            rc = RC(rcVDB, rcCursor, rcAccessing, rcName, rcEmpty);
+        else
+        {
+            LinkedCursorNode *node = (LinkedCursorNode *)
+                BSTreeFind(&cself->linked_cursors, tbl, LinkedCursorComp);
+
+            if (node == NULL)
+                rc = RC(rcVDB, rcCursor, rcAccessing, rcName, rcNotFound);
+            else
+            {
+                rc = VCursorAddRef ( node -> curs );
+                if ( rc == 0 )
+                {
+                    * curs = node -> curs;
+                    return 0;
+                }
+            }
+        }
+
+        * curs = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorLinkedCursorSet(const VCursor *cself,const char *tbl,VCursor const *curs)
+{
+    rc_t rc;
+    VCursor *self = (VCursor *)cself;
+
+    if(cself == NULL)
+        rc = RC(rcVDB, rcCursor, rcAccessing, rcSelf, rcNull);
+    else if(tbl == NULL)
+        rc = RC(rcVDB, rcCursor, rcAccessing, rcName, rcNull);
+    else if(tbl[0] == '\0')
+        rc = RC(rcVDB, rcCursor, rcAccessing, rcName, rcEmpty);
+    else
+    {
+        rc = VCursorAddRef ( curs );
+        if ( rc == 0 )
+        {
+            LinkedCursorNode *node = malloc ( sizeof * node );
+            if (node == NULL)
+                rc = RC(rcVDB, rcCursor, rcAccessing, rcMemory, rcExhausted);
+            else
+            {
+                strncpy ( node->tbl, tbl, sizeof node->tbl );
+                node->curs = (VCursor*) curs;
+                rc = BSTreeInsertUnique(&self->linked_cursors, (BSTNode *)node, NULL, LinkedCursorNodeComp);
+                if ( rc == 0 )
+                {
+                    ((VCursor*)curs)->is_sub_cursor = true;
+                    return 0;
+                }
+
+                free ( node );
+            }
+
+            VCursorRelease ( curs );
+        }
+    }
+
+    return rc;
+}
+
+
+/* private */
+LIB_EXPORT rc_t CC VCursorParamsGet( struct VCursorParams const *cself,
+    const char *Name, KDataBuffer **value )
+{
+    NamedParamNode *node;
+    String name;
+    VCursor *self = (VCursor *)cself;
+    
+    if (cself == NULL)
+        return RC(rcVDB, rcCursor, rcAccessing, rcSelf, rcNull);
+    
+    if (Name == NULL)
+        return RC(rcVDB, rcCursor, rcAccessing, rcName, rcNull);
+    
+    if (Name[0] == '\0')
+        return RC(rcVDB, rcCursor, rcAccessing, rcName, rcEmpty);
+    
+    StringInitCString(&name, Name);
+    node = (NamedParamNode *)BSTreeFind(&self->named_params, &name, NamedParamComp);
+    if (node == NULL)
+        return RC(rcVDB, rcCursor, rcAccessing, rcName, rcNotFound);
+        
+    *value = &node->value;
+    return 0;
+}
+
+/* private */
+static rc_t VCursorParamsLookupOrCreate(struct VCursorParams const *cself,
+                         const char *Name, KDataBuffer **value)
+{
+    NamedParamNode *node;
+    String name;
+    VCursor *self = (VCursor *)cself;
+    rc_t rc;
+    
+    StringInitCString(&name, Name);
+    node = (NamedParamNode *)BSTreeFind(&self->named_params, &name, NamedParamComp);
+    if (node == NULL) {
+        node = malloc(sizeof(*node) + StringSize(&name) + 1);
+        if (node == NULL)
+            return RC(rcVDB, rcCursor, rcAccessing, rcMemory, rcExhausted);
+        
+        strcpy((char *)(&node[1]), Name);
+        StringInit ( & node -> name, (const char *)(&node[1]), name . size, name . len );
+        
+        memset ( & node -> value, 0, sizeof node -> value );
+        node -> value . elem_bits = 8;
+        
+        rc = BSTreeInsertUnique(&self->named_params, (BSTNode *)node, NULL, NamedParamNodeComp);
+        assert(rc == 0);
+    }
+    *value = &node->value;
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VCursorParamsVSet(struct VCursorParams const *cself, 
+    const char *Name, const char *fmt, va_list args )
+{
+    KDataBuffer *value;
+    rc_t rc;
+
+    if (cself == NULL)
+        return RC(rcVDB, rcCursor, rcAccessing, rcSelf, rcNull);
+
+    if (Name == NULL)
+        return RC(rcVDB, rcCursor, rcAccessing, rcName, rcNull);
+
+    if (Name[0] == '\0')
+        return RC(rcVDB, rcCursor, rcAccessing, rcName, rcEmpty);
+
+    rc = VCursorParamsLookupOrCreate(cself, Name, &value);
+    if (rc == 0) {
+        int n;
+        char dummy[1], * buffer = dummy;
+        size_t bsize = sizeof dummy;
+
+        va_list copy;
+        va_copy(copy, args);
+
+        if ( value -> base != NULL )
+        {
+            buffer = value -> base;
+            bsize = KDataBufferBytes ( value );
+        }        
+
+        /* optimistic printf */
+        n = vsnprintf ( buffer, bsize, fmt, copy );
+        va_end(copy);
+
+        if ( n < 0 || ( size_t ) n >= bsize )
+        {
+            rc = KDataBufferResize ( value, ( n < 0 ) ? 4096 : n + 1 );
+            if (rc == 0)
+            {
+                bsize = KDataBufferBytes ( value );
+                n = vsnprintf(value->base, bsize, fmt, args);
+                if ( n < 0 || ( size_t ) n >= bsize )
+                {
+                    rc = RC ( rcVDB, rcCursor, rcUpdating, rcParam, rcInvalid );
+                    KDataBufferWhack ( value );
+                }
+            }
+        }
+
+        if ( rc == 0 )
+            value -> elem_count = n;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorParamsSet( struct VCursorParams const *cself, 
+    const char *name, const char *fmt, ... )
+{
+    va_list va;
+    rc_t rc;
+
+    va_start(va, fmt);
+    rc = VCursorParamsVSet(cself, name, fmt, va);
+    va_end(va);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorParamsUnset( struct VCursorParams const *cself, const char *Name ) {
+    KDataBuffer *value;
+    rc_t rc;
+
+    if (cself == NULL)
+        return RC(rcVDB, rcCursor, rcAccessing, rcSelf, rcNull);
+
+    if (Name == NULL)
+        return RC(rcVDB, rcCursor, rcAccessing, rcParam, rcNull);
+
+    if (Name[0] == '\0')
+        return RC(rcVDB, rcCursor, rcAccessing, rcParam, rcInvalid);
+
+    rc = VCursorParamsGet(cself, Name, &value);
+    if (rc == 0)
+        KDataBufferWhack(value);
+
+    return rc;
+}
+
+/*  VCursorGetSchema
+ *  returns current schema of the open cursor
+ */
+LIB_EXPORT struct VSchema const * CC VCursorGetSchema ( struct VCursor const *self )
+{
+    return self ? self->schema : NULL;
+}
+
+
+static rc_t run_pagemap_thread ( const KThread *t, void *data )
+{
+    rc_t rc;
+    VCursor *self = data;
+    /* acquire lock */
+    MTCURSOR_DBG (( "run_pagemap_thread: acquiring lock\n" ));
+    while((rc = KLockAcquire ( self -> pmpr.lock ))==0){
+CHECK_AGAIN:
+	switch(self->pmpr.state){
+	 case ePMPR_STATE_NONE: 		/* wait for new request */
+	 case ePMPR_STATE_SERIALIZE_DONE: 	/* wait for result pickup **/
+	 case ePMPR_STATE_DESERIALIZE_DONE:	/* wait for result pickup **/
+		MTCURSOR_DBG (( "run_pagemap_thread: waiting for new request\n" ));
+		rc = KConditionWait ( self -> pmpr.cond, self -> pmpr.lock );
+		goto CHECK_AGAIN;
+	 case ePMPR_STATE_EXIT: /** exit requested ***/
+		MTCURSOR_DBG (( "run_pagemap_thread: exit by request\n" ));
+		KLockUnlock(self -> pmpr.lock);
+		return 0;
+	 case ePMPR_STATE_DESERIALIZE_REQUESTED:
+		MTCURSOR_DBG (( "run_pagemap_thread: request to deserialize\n" ));
+		self->pmpr.rc = PageMapDeserialize(&self->pmpr.pm,self->pmpr.data.base,self->pmpr.data.elem_count,self->pmpr.row_count);
+		if(self->pmpr.rc == 0){
+			self->pmpr.rc=PageMapExpandFull(self->pmpr.pm);
+			/*self->pmpr.rc=PageMapExpand(self->pmpr.pm,self->pmpr.row_count<2048?self->pmpr.row_count-1:2048);*/
+			assert(self->pmpr.rc == 0);
+		}
+		self->pmpr.state = ePMPR_STATE_DESERIALIZE_DONE;
+		/*fprintf(stderr,"Pagemap %p Done R:%6d|DR:%d|LR:%d\n",self->pmpr.lock, self->pmpr.pm->row_count,self->pmpr.pm->data_recs,self->pmpr.pm->leng_recs);*/
+		KConditionSignal ( self -> pmpr.cond );
+		KLockUnlock(self -> pmpr.lock);
+		break;
+	 case ePMPR_STATE_SERIALIZE_REQUESTED:
+		MTCURSOR_DBG (( "run_pagemap_thread: request to serialize\n" ));
+		self->pmpr.rc = PageMapSerialize(self->pmpr.pm,&self->pmpr.data,0,&self->pmpr.elem_count);
+		self->pmpr.state = ePMPR_STATE_SERIALIZE_DONE;
+		KConditionSignal ( self -> pmpr.cond );
+		KLockUnlock(self -> pmpr.lock);
+		break;
+	 default:
+		assert(0);
+		KLockUnlock(self -> pmpr.lock);
+		return RC(rcVDB, rcPagemap, rcConverting, rcParam, rcInvalid );
+	 
+	}
+    }
+    MTCURSOR_DBG (( "run_pagemap_thread: exit\n" ));
+    return rc;
+}
+
+rc_t VCursorLaunchPagemapThread(VCursor *curs)
+{
+	rc_t rc;
+
+    assert ( curs != NULL );
+	curs -> pagemap_thread = NULL; /** if fails - will not use **/
+
+    if ( s_disable_pagemap_thread )
+        return RC ( rcVDB, rcCursor, rcExecuting, rcThread, rcNotAvailable );
+
+	rc = KLockMake ( & curs -> pmpr.lock );
+	if(rc == 0)
+    {
+		rc = KConditionMake ( & curs -> pmpr.cond );
+        if(rc == 0)
+        {
+            rc = KThreadMake ( & curs -> pagemap_thread, run_pagemap_thread, curs );
+            if ( rc == 0 )
+                return 0;
+
+            KConditionRelease ( curs -> pmpr . cond );
+            curs -> pmpr . cond = NULL;
+        }
+
+        KLockRelease ( curs -> pmpr . lock );
+        curs -> pmpr . lock = NULL;
+    }
+
+	return rc;
+}
+
+rc_t VCursorTerminatePagemapThread(VCursor *self)
+{
+	rc_t rc=0;
+
+    assert ( self != NULL );
+
+	if(self -> pagemap_thread != NULL)
+    {
+		rc = KLockAcquire ( self -> pmpr.lock );
+		if ( rc == 0 )
+        {
+			self -> pmpr.state = ePMPR_STATE_EXIT;
+			KConditionSignal ( self -> pmpr.cond );
+			KLockUnlock ( self -> pmpr.lock );
+		}
+		KThreadWait ( self -> pagemap_thread, NULL );
+	}
+
+	KThreadRelease ( self -> pagemap_thread );
+	KConditionRelease ( self -> pmpr.cond );
+	KLockRelease ( self -> pmpr.lock );
+
+    self -> pagemap_thread = NULL;
+    self -> pmpr . cond = NULL;
+    self -> pmpr . lock = NULL;
+
+	return rc;
+}
+
+/* DisablePagemapThread
+ *  this can cause difficulties for some clients
+ */
+LIB_EXPORT rc_t CC VDBManagerDisablePagemapThread ( struct VDBManager const *self )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcMgr, rcUpdating, rcSelf, rcNull );
+    s_disable_pagemap_thread = true;
+    return 0;
+}
+
+
+/* IsStaticColumn
+ *  answers question: "does this column have the same value for every cell?"
+ */
+LIB_EXPORT rc_t CC VCursorIsStaticColumn ( const VCursor *self, uint32_t col_idx, bool *is_static )
+{
+    rc_t rc;
+
+    if ( is_static == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            uint32_t start = VectorStart ( & self -> row );
+            uint32_t end = start + VectorLength ( & self -> row );
+            if ( col_idx < start || col_idx >= end )
+                rc = RC ( rcVDB, rcCursor, rcSelecting, rcId, rcInvalid );
+            else
+            {
+                VColumn *col = VectorGet ( & self -> row, col_idx );
+                return VColumnIsStatic ( col, is_static );
+            }
+        }
+
+        * is_static = false;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT uint64_t CC VCursorSetCacheCapacity(VCursor *self,uint64_t capacity)
+{
+	if(self) return VBlobMRUCacheSetCapacity(self->blob_mru_cache,capacity);
+        return 0;
+}
+LIB_EXPORT uint64_t CC VCursorGetCacheCapacity(const VCursor *self)
+{
+	if(self) return VBlobMRUCacheGetCapacity(self->blob_mru_cache);
+	return 0;
+}
+
+
+/* FindNextRowId
+ *  finds the id of the next row having valid ( non-null ) cell data
+ *  "*next" may contain any row id > "VCursorRowId()".
+ *  returns rcNotFound if none can be located.
+ *
+ *  "idx" [ IN, DEFAULT ZERO ] - single column index or
+ *  zero to indicate the range for all columns in cursor.
+ *  in the latter case ( idx == 0 ), we find the first row having
+ *  ANY valid cell data.
+ *
+ *  "next" [ OUT ] - return parameter for next valid row id
+ *
+ * FindNextRowIdDirect
+ *  "start_id" [ IN ] - starting id for search, such that "*next"
+ *  could contain any id >= start_id upon successful return
+ */
+static
+rc_t VCursorFindNextRowIdInt ( const VCursor * self, uint32_t idx, int64_t start_id, int64_t * next )
+{
+    uint32_t i;
+    int64_t best = INT64_MAX;
+    rc_t rc = SILENT_RC ( rcVDB, rcCursor, rcSelecting, rcCursor, rcEmpty );
+
+    uint32_t start, end;
+
+    /* for walking across the open columns */
+    assert ( self != NULL );
+    start = VectorStart ( & self -> row );
+    end = start + VectorLength ( & self -> row );
+
+    /* if using a specific column, ensure the index is proper */
+    if ( idx != 0 )
+    {
+        if ( idx < start || idx >= end )
+            return RC ( rcVDB, rcCursor, rcSelecting, rcId, rcInvalid );
+
+        /* set the range to be just this column */
+        start = idx;
+        end = idx + 1;
+    }
+
+    /* walk across all columns */
+    for ( i = start; i < end; ++ i )
+    {
+        /* retrieve the column */
+        const VColumn * vcol = ( const VColumn * ) VectorGet ( & self -> row, i );
+
+        /* could assert that vcol != NULL, because it should never be so.
+           but the purpose of this function is not so much to insist on
+           this property but to discover the next row id */
+        if ( vcol != NULL )
+        {
+            /* assume the column is physical */
+            bool is_static = false;
+            KColumn * kcol = NULL;
+            rc = VColumnGetKColumn ( vcol, & kcol, & is_static );
+            if ( rc == 0 )
+            {
+                /* we have a physical column - ask kdb what the next id is */
+                assert ( kcol != NULL );
+                rc = KColumnFindFirstRowId ( kcol, next, start_id );
+                KColumnRelease ( kcol );
+                if ( rc == 0 )
+                {
+                    /* there can be no better than the supplied id */
+                    if ( * next == start_id )
+                        break;
+
+                    /* record the best of all columns */
+                    if ( * next < best )
+                        best = * next;
+                }
+
+                /* if this column has no more ids, try next column */
+                else if ( GetRCState ( rc ) != rcNotFound )
+                    break;
+            }
+            else if ( is_static )
+            {
+                /* we have a static column, meaning a contiguous range of row ids */
+                int64_t sfirst, slast;
+                rc = VColumnIdRange ( vcol, & sfirst, & slast );
+                if ( rc != 0 )
+                    break;
+                if ( sfirst >= slast || start_id > slast )
+                {
+                    rc = RC ( rcVDB, rcCursor, rcSelecting, rcRow, rcNotFound );
+                    break;
+                }
+                if ( start_id >= sfirst )
+                {
+                    * next = start_id;
+                    rc = 0;
+                    break;
+                }
+                if ( sfirst < best )
+                    best = sfirst;
+
+            }
+
+            * next = best;
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorFindNextRowId ( const VCursor *self, uint32_t idx, int64_t *next )
+{
+    rc_t rc = 0;
+
+    if ( next == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            return VCursorFindNextRowIdInt ( self, idx, self -> row_id + 1, next );
+        }
+
+        * next = 0;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorFindNextRowIdDirect ( const VCursor *self, uint32_t idx, int64_t start_id, int64_t *next )
+{
+    rc_t rc = 0;
+
+    if ( next == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            return VCursorFindNextRowIdInt ( self, idx, start_id, next );
+        }
+
+        * next = 0;
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/cursor-priv.h b/libs/vdb/cursor-priv.h
new file mode 100644
index 0000000..62802b1
--- /dev/null
+++ b/libs/vdb/cursor-priv.h
@@ -0,0 +1,322 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_cursor_priv_
+#define _h_cursor_priv_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef KONST
+#define KONST
+#endif
+
+#ifndef SKONST
+#define SKONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "blob-priv.h"
+
+#define MTCURSOR_DBG( msg ) DBGMSG ( DBG_VDB, DBG_FLAG ( DBG_VDB_MTCURSOR ), msg )
+
+
+
+#define VCURSOR_WRITE_MODES_SUPPORTED 0
+
+/* temporary - until the full kproc for Windows is operational */
+#if defined(WINDOWS) || defined(_WIN32) || defined(NCBI_WITHOUT_MT)
+#define VCURSOR_FLUSH_THREAD 0
+#else
+#define VCURSOR_FLUSH_THREAD 1
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KLock;
+struct KCondition;
+struct KThread;
+struct KNamelist;
+struct KDlset;
+struct VTable;
+struct VCtxId;
+struct VSchema;
+struct SColumn;
+struct VColumn;
+struct VPhysical;
+
+
+/*--------------------------------------------------------------------------
+ * VCursorCache
+ *  a dual-level vector
+ */
+typedef struct VCursorCache VCursorCache;
+struct VCursorCache
+{
+    Vector cache;
+};
+
+
+/* Init
+ */
+#define VCursorCacheInit( self, start, block ) \
+    VectorInit ( & ( self ) -> cache, start, block )
+
+/* Whack
+ */
+void VCursorCacheWhack ( VCursorCache *self,
+    void ( CC * whack ) ( void *item, void *data ), void *data );
+
+/* Get
+ *  retrieve object by cid
+ */
+void *VCursorCacheGet ( const VCursorCache *self, struct VCtxId const *cid );
+
+/* Set
+ *  set object by cid
+ */
+rc_t VCursorCacheSet ( VCursorCache *self,
+    struct VCtxId const *cid, const void *item );
+
+/* Swap
+ *  swap object by cid
+ */
+rc_t VCursorCacheSwap ( VCursorCache *self,
+    struct VCtxId const *cid, const void *item, void **prior );
+
+
+/*--------------------------------------------------------------------------
+ * VCursor
+ */
+enum
+{
+    vcConstruct,
+    vcFailed,
+    vcReady,
+    vcRowOpen,
+    vcRowCommitted,
+    vcPageCommit
+};
+
+enum
+{
+    vfReady,
+    vfBusy,
+    vfFgErr,
+    vfBgErr,
+    vfExit
+};
+
+
+struct VCursor
+{
+    /* row id */
+    int64_t row_id;
+
+    /* half-closed page range */
+    int64_t start_id, end_id;
+
+    /* starting id for flush */
+    volatile int64_t flush_id;
+
+    /* attached reference to table */
+    struct VTable KONST *tbl;
+
+    /* cursor-specific schema and table */
+    struct VSchema SKONST *schema;
+    struct STable SKONST *stbl;
+
+    /* background flush thread objects */
+    int64_t launch_cnt;
+    struct KThread *flush_thread;
+    struct KLock *flush_lock;
+    struct KCondition *flush_cond;
+
+    /* background pagemap conversion objects */
+    struct KThread *pagemap_thread;
+    PageMapProcessRequest pmpr;
+
+    /* user data */
+    void *user;
+    void ( CC * user_whack ) ( void *data );
+
+    /* external named cursor parameters */    
+    BSTree named_params;
+
+    /* linked cursors */
+    BSTree linked_cursors;
+
+    /* read-only blob cache */
+    VBlobMRUCache *blob_mru_cache;
+
+    /* external row of VColumn* by ord ( owned ) */
+    Vector row;
+    
+    Vector v_cache_curs;
+    Vector v_cache_cidx;
+    /** trying to prevent forward prefetch on rows which are cached ***/
+    bool    cache_col_active;
+    int64_t cache_empty_start; /** first rowid where cache is detected to be empty **/
+    int64_t cache_empty_end;   /** last  rowid  **/ 
+
+    /* column objects by cid ( not-owned ) */
+    VCursorCache col;
+
+    /* physical columns by cid ( owned ) */
+    VCursorCache phys;
+    uint32_t phys_cnt;
+
+    /* productions by cid ( not-owned ) */
+    VCursorCache prod;
+
+    /* intermediate productions ( owned ) */
+    Vector owned;
+
+    /* trigger productions ( not-owned ) */
+    Vector trig;
+
+    KRefcount refcount;
+
+    volatile uint32_t flush_cnt;
+
+    /* foreground state */
+    uint8_t state;
+
+    /* flush_state */
+    volatile uint8_t flush_state;
+
+    bool read_only;
+
+    /* support for sradb-v1 API */
+    bool permit_add_column;
+    bool permit_post_open_add;
+    /* support suspension of schema-declared triggers **/
+    bool suspend_triggers;
+    /* cursor used in sub-selects */
+    bool is_sub_cursor; 
+    /* cursor for VDB columns located in separate db.tbl ***/
+    const struct VCursor* cache_curs;
+};
+
+
+/* Make
+ */
+rc_t VCursorMake ( struct VCursor **cursp, struct VTable const *tbl );
+
+rc_t VTableCreateCursorWriteInt ( struct VTable *self, struct VCursor **cursp, KCreateMode mode, bool create_thread );
+
+/* Whack
+ * Destroy
+ */
+rc_t VCursorWhack ( struct VCursor *self );
+rc_t VCursorDestroy ( struct VCursor *self );
+
+/* SupplementSchema
+ *  scan table for physical column names
+ *  create transparent yet incomplete (untyped) columns for unknown names
+ *  create incomplete (untyped) physical columns for forwarded names
+ *  repeat process on static columns, except create complete (fully typed) objects
+ */
+rc_t VCursorSupplementSchema ( struct VCursor const *self );
+
+/* MakeColumn
+ */
+rc_t VCursorMakeColumn ( struct VCursor *self,
+    struct VColumn **col, struct SColumn const *scol, Vector *cx_bind );
+
+/* SetRowIdRead - PRIVATE
+ *  seek to given row id
+ *
+ *  "row_id" [ IN ] - row id to select
+ */
+rc_t VCursorSetRowIdRead ( struct VCursor *self, int64_t row_id );
+
+/* Open
+ */
+rc_t VCursorOpenRead ( struct VCursor *self, struct KDlset const *libs );
+/**
+*** VTableCreateCursorReadInternal is only visible in vdb and needed for schema resolutions
+****/
+rc_t  VTableCreateCursorReadInternal(const struct VTable *self, const struct VCursor **cursp);
+
+
+/* ListReadableColumns
+ *  performs an insert of '*' to cursor
+ *  attempts to resolve all read rules
+ *  records all SColumns that successfully resolved
+ *  populates BTree with VColumnRef objects
+ */
+rc_t VCursorListReadableColumns ( struct VCursor *self, BSTree *columns );
+
+/* ListWritableColumns
+ *  walks list of SPhysicals and trigger SProductions
+ *  attempts to resolve all write rules
+ *  records any SColumn that can be reached
+ *  populates BTree with VColumnRef objects
+ */
+rc_t VCursorListWritableColumns ( struct VCursor *self, BSTree *columns );
+rc_t VCursorListSeededWritableColumns ( struct VCursor *self, BSTree *columns, struct KNamelist const *seed );
+
+/* PostOpenAdd
+ *  handle opening of a column after the cursor is opened
+ */
+rc_t VCursorPostOpenAdd ( struct VCursor *self, struct VColumn *col );
+rc_t VCursorPostOpenAddRead ( struct VCursor *self, struct VColumn *col );
+
+/* OpenRowRead
+ * CloseRowRead
+ */
+rc_t VCursorOpenRowRead ( struct VCursor *self );
+rc_t VCursorCloseRowRead ( struct VCursor *self );
+
+
+/** pagemap supporting thread **/
+rc_t VCursorLaunchPagemapThread(struct VCursor *self);
+rc_t VCursorTerminatePagemapThread(struct VCursor *self);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_cursor_priv_ */
diff --git a/libs/vdb/cursor.c b/libs/vdb/cursor.c
new file mode 100644
index 0000000..63adbc3
--- /dev/null
+++ b/libs/vdb/cursor.c
@@ -0,0 +1,200 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+
+#define KONST const
+#include "cursor-priv.h"
+#include "dbmgr-priv.h"
+#include "linker-priv.h"
+#include "schema-priv.h"
+#include "table-priv.h"
+#include "column-priv.h"
+#undef KONST
+
+#include <vdb/cursor.h>
+#include <vdb/table.h>
+#include <kfs/dyload.h>
+#include <klib/symbol.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * VCursor
+ *  a row cursor onto a VTable
+ */
+
+
+/* Whack
+ */
+rc_t VCursorWhack ( VCursor *self )
+{
+    VCursorTerminatePagemapThread(self);
+    return VCursorDestroy ( self );
+}
+
+
+/* MakeColumn
+ */
+rc_t VCursorMakeColumn ( VCursor *self, VColumn **col, const SColumn *scol, Vector *cx_bind )
+{
+    return VColumnMake ( col, self -> schema, scol );
+}
+
+/* PostOpenAdd
+ *  handle opening of a column after the cursor is opened
+ */
+rc_t VCursorPostOpenAdd ( VCursor *self, VColumn *col )
+{
+    return VCursorPostOpenAddRead ( self, col );
+}
+
+/* Open
+ *  open cursor, resolving schema
+ *  for the set of opened columns
+ *
+ *  NB - there is no corresponding "Close"
+ *  use "Release" instead.
+ */
+LIB_EXPORT rc_t CC VCursorOpen ( const VCursor *cself )
+{
+    rc_t rc;
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcOpening, rcSelf, rcNull );
+    else
+    {
+        VLinker *ld = self -> tbl -> linker;
+
+        KDlset *libs;
+        rc = VLinkerOpen ( ld, & libs );
+        if ( rc == 0 )
+        {
+            rc = VCursorOpenRead ( self, libs );
+            if ( rc == 0 )
+            {
+                int64_t first;
+                uint64_t count;
+                
+                rc = VCursorIdRange ( self, 0, & first, & count );
+                if ( rc != 0 )
+                {
+                    /* permit empty open when run from sradb */
+                    if ( GetRCState ( rc ) == rcEmpty && GetRCObject ( rc ) == rcRange &&
+                         self -> permit_add_column && VectorLength ( & self -> row ) == 0 )
+                    {
+                        rc = 0;
+                    }
+                }
+                else if ( count != 0 )
+                {
+                    /* set initial row id to starting row */
+                    self -> start_id = self -> end_id = self -> row_id = first;
+                }
+
+                if ( rc != 0 )
+                    self -> state = vcFailed;
+            }
+
+            KDlsetRelease ( libs );
+        }
+    }
+
+    return rc;
+}
+
+
+/* SetRowId
+ *  seek to given row id
+ *
+ *  "row_id" [ IN ] - row id to select
+ */
+LIB_EXPORT rc_t CC VCursorSetRowId ( const VCursor *cself, int64_t row_id )
+{
+    rc_t rc;
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcPositioning, rcSelf, rcNull );
+    else if ( self -> state > vcReady )
+        rc = RC ( rcVDB, rcCursor, rcPositioning, rcCursor, rcBusy );
+    else
+        rc = VCursorSetRowIdRead ( self, row_id );
+
+    return rc;
+}
+
+
+/* OpenRow
+ *  open currently closed row indicated by row id
+ */
+LIB_EXPORT rc_t CC VCursorOpenRow ( const VCursor *cself )
+{
+    rc_t rc;
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcOpening, rcSelf, rcNull );
+    else if ( self -> state < vcReady )
+        rc = RC ( rcVDB, rcCursor, rcOpening, rcRow, rcIncomplete );
+    else if ( self -> state > vcReady )
+        rc = 0;
+    else
+        rc = VCursorOpenRowRead ( self );
+
+    return rc;
+}
+
+/* CloseRow
+ *  balances OpenRow message
+ *  if there are uncommitted modifications,
+ *  discard all changes. otherwise,
+ *  advance to next row
+ */
+LIB_EXPORT rc_t CC VCursorCloseRow ( const VCursor *cself )
+{
+    rc_t rc;
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcClosing, rcSelf, rcNull );
+    else if ( self -> state < vcRowOpen )
+        rc = 0;
+    else
+        rc = VCursorCloseRowRead ( self );
+
+    return rc;
+}
diff --git a/libs/vdb/database-cmn.c b/libs/vdb/database-cmn.c
new file mode 100644
index 0000000..16b6a89
--- /dev/null
+++ b/libs/vdb/database-cmn.c
@@ -0,0 +1,928 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define KONST const
+#include "database-priv.h"
+#include "dbmgr-priv.h"
+#undef KONST
+
+#include "schema-priv.h"
+#include "linker-priv.h"
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <kdb/kdb-priv.h>
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <vfs/manager.h>
+#include <vfs/resolver.h>
+#include <vfs/path.h>
+#include <klib/debug.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * VDatabase
+ *  opaque connection to a database within file system
+ */
+
+
+/* Whack
+ */
+rc_t CC VDatabaseWhack ( VDatabase *self )
+{
+    rc_t rc = 0;
+
+    KRefcountWhack ( & self -> refcount, "VDatabase" );
+
+    /* release user data */
+    if ( self -> user != NULL && self -> user_whack != NULL )
+    {
+        ( * self -> user_whack ) ( self -> user );
+        self -> user = NULL;
+        self -> user_whack = NULL;
+    }
+
+    /* release dad */
+    if ( self -> dad != NULL )
+    {
+        rc = VDatabaseSever ( self -> dad );
+        if ( rc == 0 )
+            self -> dad = NULL;
+    }
+    /* release cache_db */
+    if ( self -> cache_db != NULL)
+    {
+	rc = VDatabaseRelease ( self -> cache_db );
+	if ( rc == 0 )
+		self -> cache_db = NULL;
+    }
+
+    /* remove from mgr */
+    if ( rc == 0 )
+        rc = VDBManagerSever ( self -> mgr );
+
+    if ( rc == 0 )
+    {
+        /* complete */
+        KMetadataRelease ( self -> meta );
+        KDatabaseRelease ( self -> kdb );
+        VSchemaRelease ( self -> schema );
+
+        free ( self );
+        return 0;
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "VDatabase", "whack", "vdb" );
+    return rc;
+}
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC VDatabaseAddRef ( const VDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "VDatabase" ) )
+        {
+        case krefLimit:
+            return RC ( rcVDB, rcDatabase, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VDatabaseRelease ( const VDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "VDatabase" ) )
+        {
+        case krefWhack:
+            return VDatabaseWhack ( ( VDatabase* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcDatabase, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Attach
+ * Sever
+ *  internal reference management
+ */
+VDatabase *VDatabaseAttach ( const VDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "VDatabase" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( VDatabase* ) self;
+}
+
+rc_t VDatabaseSever ( const VDatabase *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "VDatabase" ) )
+        {
+        case krefWhack:
+            return VDatabaseWhack ( ( VDatabase* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcDatabase, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make - PRIVATE
+ *  creates an initialized database object
+ *  expects a mgr and optionally a parent db,
+ *  enforces schema validity according to some rules,
+ */
+rc_t VDatabaseMake ( VDatabase **dbp,
+    const VDBManager *mgr, const VDatabase *dad, const VSchema *schema )
+{
+    rc_t rc;
+
+    /* create a structure */
+    VDatabase *db = calloc ( 1, sizeof * db );
+    if ( db == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        /* create a modifiable schema */
+        rc = VSchemaMake ( ( VSchema** ) & db -> schema, schema );
+        if ( rc == 0 )
+        {
+            db -> mgr = VDBManagerAttach ( mgr );
+            db -> dad = VDatabaseAttach ( dad );
+            KRefcountInit ( & db -> refcount, 1, "VDatabase", "make", "vdb" );
+
+            * dbp = db;
+            return 0;
+        }
+
+        VDatabaseWhack ( db );
+    }
+
+    * dbp = NULL;
+
+    return rc;
+}
+
+
+/* OpenRead
+ *  finish opening a db for read
+ */
+static
+rc_t CC VDatabaseOpenRead ( VDatabase *self )
+{
+    /* open metadata */
+    rc_t rc = KDatabaseOpenMetadataRead ( self -> kdb, & self -> meta );
+    if ( rc == 0 )
+    {
+        /* fetch stored schema */
+        rc = VDatabaseLoadSchema ( self );
+        if ( rc == 0 && self -> sdb == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcOpening, rcSchema, rcNotFound );
+    }
+
+    DBGMSG(DBG_VDB, DBG_FLAG(DBG_VDB_VDB), ("VDatabaseOpenRead = %d\n", rc));
+
+    return rc;
+}
+
+
+/* OpenDBRead
+ * VOpenDBRead
+ *  open a database for read
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "schema" [ IN, NULL OKAY ] - schema object containg database
+ *  declaration to be used in creating db.
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+static
+rc_t VDBManagerVPathOpenLocalDBRead ( const VDBManager *self,
+    const VDatabase **dbp, const VSchema *schema, const VPath * path )
+{
+    rc_t rc;
+    VDatabase * db;
+
+    if ( schema == NULL )
+        schema = self -> schema;
+
+    rc = VDatabaseMake ( & db, self, NULL, schema );
+    if ( rc == 0 )
+    {
+        db -> read_only = true;
+
+        rc = KDBManagerVPathOpenLocalDBRead ( self -> kmgr, & db -> kdb, path );
+        if ( rc == 0 )
+        {
+            rc = VDatabaseOpenRead ( db );
+            if ( rc == 0 )
+            {
+                * dbp = db;
+                return 0;
+            }
+        }
+        
+        VDatabaseWhack ( db );
+    }
+
+    return rc;
+}
+
+static
+rc_t VDBManagerVPathOpenRemoteDBRead ( const VDBManager *self,
+    const VDatabase **dbp, const VSchema *schema, const VPath * remote, const VPath * cache )
+{
+    rc_t rc;
+    VDatabase * db;
+
+    if ( schema == NULL )
+        schema = self -> schema;
+
+    rc = VDatabaseMake ( & db, self, NULL, schema );
+    if ( rc == 0 )
+    {
+        db -> read_only = true;
+
+        rc = KDBManagerVPathOpenRemoteDBRead ( self -> kmgr, & db -> kdb, remote, cache );
+        if ( rc == 0 )
+        {
+            rc = VDatabaseOpenRead ( db );
+            if ( rc == 0 )
+            {
+                * dbp = db;
+                return 0;
+            }
+        }
+        
+        VDatabaseWhack ( db );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDBManagerVOpenDBRead ( const VDBManager *self,
+    const VDatabase ** dbp, const VSchema *schema,
+    const char * path_fmt, va_list args )
+{
+    rc_t rc;
+
+    if ( dbp == NULL )
+        rc = RC ( rcVDB, rcMgr, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcSelf, rcNull );
+        else
+        {
+            /* need VFS manager to make a path */
+            VFSManager * vfs;
+            rc = KDBManagerGetVFSManager ( self -> kmgr, & vfs );
+            if ( rc == 0 )
+            {
+                /* get a reference to its pre-built resolver */
+                VResolver * resolver;
+                rc = VFSManagerGetResolver ( vfs, & resolver );
+                if ( rc == 0 )
+                {
+                    /* turn spec in "path_fmt" + "args" into VPath "orig" */
+                    VPath * orig;
+                    rc = VFSManagerVMakePath ( vfs, & orig, path_fmt, args );
+                    if ( rc == 0 )
+                    {
+                        /* the original VPath may get resolved into other paths */
+                        const VPath * plocal = NULL, * premote = NULL, * pcache = NULL;
+                        
+                        /* check whether we were given a path or accession */
+                        bool is_accession = VPathIsAccessionOrOID ( orig );
+
+                        /* if the original is not an accession */
+                        if ( ! is_accession )
+                        {
+                            /* just create a new reference to original */
+                            rc = VPathAddRef ( orig );
+                            if ( rc == 0 )
+                                plocal = orig;
+                        }
+                        else
+                        {
+                            /* otherwise, ask resolver to find a local path,
+                               or get a remote path and optional place to cache data */
+                            rc = VResolverQuery ( resolver, 0, orig, & plocal, & premote, & pcache );
+                            if ( rc != 0 && GetRCState ( rc ) == rcNotFound )
+                            {
+                                rc = VPathAddRef ( orig );
+                                if ( rc == 0 )
+                                {
+                                    plocal = orig;
+                                }
+
+                            }
+                        }
+                        if ( rc == 0 )
+                        {
+                            /* now open the principal database */
+                            if ( plocal != NULL )
+                                rc = VDBManagerVPathOpenLocalDBRead ( self, dbp, schema, plocal );
+                            else if ( premote != NULL )
+                                rc = VDBManagerVPathOpenRemoteDBRead ( self, dbp, schema, premote, pcache );
+                            else
+                            {
+                                /* resolver was unable to resolve this, so perhaps it was
+                                   not an accession or OID, but a simple file name */
+                                rc = VPathAddRef ( orig );
+                                if ( rc == 0 )
+                                {
+                                    plocal = orig;
+                                    rc = VDBManagerVPathOpenLocalDBRead ( self, dbp, schema, plocal );
+                                }
+                            }
+                            if ( rc == 0 )
+                            {
+                                rc_t rc2;
+                                const VDatabase * db = * dbp;
+                                if ( VDatabaseIsCSRA ( db ) )
+                                {
+                                    /* CSRA databases may have an associated "vdbcache" */
+                                    const VDatabase * vdbcache = NULL;
+                                    VPath * clocal = NULL, * cremote = NULL, * ccache = NULL;
+
+                                    /* if principal was local */
+                                    if ( plocal != NULL )
+                                    {
+                                        rc2 = VFSManagerMakePathWithExtension ( vfs, & clocal, plocal, ".vdbcache" );
+                                        if ( rc2 == 0 )
+                                        {
+                                            rc2 = VDBManagerVPathOpenLocalDBRead ( self, & vdbcache, schema, clocal );
+                                            if ( rc2 != 0 )
+                                            {
+                                                rc2 = 0;
+                                                if ( ! is_accession )
+                                                {
+                                                    VPath * acc;
+                                                    rc2 = VFSManagerExtractAccessionOrOID ( vfs, & acc, orig );
+                                                    if ( rc2 == 0 )
+                                                    {
+                                                        VPathRelease ( orig );
+                                                        orig = acc;
+                                                    }
+                                                }
+
+                                                /* was not found locally - try to get one remotely */
+                                                if ( rc2 == 0 )
+                                                {
+                                                        /* We need suppress error message in the 
+                                                         * case if here any error happened
+                                                         */
+                                                    KLogLevel lvl = KLogLevelGet ();
+                                                    KLogLevelSet ( klogFatal );
+                                                    assert ( premote == NULL );
+                                                    assert ( pcache == NULL );
+                                                    rc2 = VResolverQuery ( resolver, 0, orig, NULL, & premote, & pcache );
+                                                    assert ( ( rc2 == 0 ) ||
+                                                        ( rc2 != 0 && premote == NULL ) );
+
+                                                        /* Here we are restoring log level
+                                                         */
+                                                    KLogLevelSet ( lvl );
+                                                }
+                                            }
+                                        }
+                                    }
+
+                                    /* if principal was remote, or attempting remote vdbcache */
+                                    if ( premote != NULL )
+                                    {
+                                        rc2 = VFSManagerMakePathWithExtension ( vfs, & cremote, premote, ".vdbcache" );
+                                        if ( rc2 == 0 && pcache != NULL )
+                                            rc2 = VFSManagerMakePathWithExtension ( vfs, & ccache, pcache, ".vdbcache" );
+                                        if ( rc2 == 0 )
+                                            rc2 = VDBManagerVPathOpenRemoteDBRead ( self, & vdbcache, schema, cremote, ccache );
+                                    }
+
+                                    VPathRelease ( clocal );
+                                    VPathRelease ( cremote );
+                                    VPathRelease ( ccache );
+
+                                    /* if "vdbcache" is anything but NULL, we got the cache */
+                                    ( ( VDatabase* ) db ) -> cache_db = vdbcache;
+                                }
+                            }
+
+                            VPathRelease ( plocal );
+                            VPathRelease ( premote );
+                            VPathRelease ( pcache );
+                        }
+                        
+                        VPathRelease ( orig );
+                    }
+
+                    VResolverRelease ( resolver );
+                }
+
+                VFSManagerRelease ( vfs );
+            }
+        }
+
+        if ( rc != 0 )
+            * dbp = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDBManagerOpenDBRead ( const VDBManager *self,
+    const VDatabase **db, const VSchema *schema,
+    const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = VDBManagerVOpenDBRead ( self, db, schema, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseVOpenDBRead ( const VDatabase *self,
+    const VDatabase **dbp, const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( dbp == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcOpening, rcSelf, rcNull );
+        else
+        {
+            VDatabase *db;
+            rc = VDatabaseMake ( & db, self -> mgr, self, self -> schema );
+            if ( rc == 0 )
+            {
+                db -> read_only = true;
+
+                rc = KDatabaseVOpenDBRead ( self -> kdb, & db -> kdb, name, args );
+                if ( rc == 0 )
+                {
+                    rc = VDatabaseOpenRead ( db );
+                    if ( rc == 0 )
+                    {
+                        * dbp = db;
+                        return 0;
+                    }
+                }
+
+                VDatabaseWhack ( db );
+            }
+        }
+
+        * dbp = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseOpenDBRead ( const VDatabase *self,
+    const VDatabase **db, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VDatabaseVOpenDBRead ( self, db, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* Locked
+ *  returns true if locked
+ */
+LIB_EXPORT bool CC VDatabaseLocked ( const VDatabase *self )
+{
+    /* TBD - no concept of virtual database locking
+       other than physical database locking */
+    if ( self != NULL )
+        return KDatabaseLocked ( self -> kdb );
+    return false;
+}
+
+
+/* IsAlias
+ *  returns true if object name is an alias
+ *  returns path to fundamental name if it was aliased
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - optional output buffer
+ *  for fundamenta object name if "alias" is not a fundamental name, 
+ *
+ *  "name" [ IN ] - NUL terminated object name
+ */
+LIB_EXPORT bool CC VDatabaseIsAlias ( const VDatabase *self, uint32_t type,
+    char *resolved, size_t rsize, const char *name )
+{
+    if ( self != NULL )
+        return KDatabaseIsAlias ( self -> kdb, type, resolved, rsize, name );
+
+    if ( resolved != NULL && rsize != 0 )
+        * resolved = 0;
+
+    return false;
+}
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC VDatabaseVWritable ( const VDatabase *self, uint32_t type, 
+        const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+    else
+        rc = KDatabaseVWritable ( self -> kdb, type, name, args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseWritable ( const VDatabase *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, name );
+
+    rc = VDatabaseVWritable ( self, type, name, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+/* OpenMetadataRead
+ *  opens metadata for read
+ *
+ *  "meta" [ OUT ] - return parameter for metadata
+ */
+LIB_EXPORT rc_t CC VDatabaseOpenMetadataRead ( const VDatabase *self, const KMetadata **meta )
+{
+    rc_t rc;
+    if ( meta == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        * meta = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            /* we operate under the notion of
+               single-threaded operation, so hand out
+               read or update capable object */
+            rc = KMetadataAddRef ( self -> meta );
+            if ( rc == 0 )
+                * meta = self -> meta;
+        }
+    }
+
+    return rc;
+}
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VDatabaseOpenManagerRead ( const VDatabase *self, const VDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = VDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VDatabaseOpenParentRead ( const VDatabase *self, const VDatabase **par )
+{
+    rc_t rc;
+
+    if ( par == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = VDatabaseAddRef ( self -> dad );
+            if ( rc == 0 )
+            {
+                * par = self -> dad;
+                return 0;
+            }
+        }
+
+        * par = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenSchema
+ *  duplicate reference to table schema
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VDatabaseOpenSchema ( const VDatabase *self, const VSchema **schema )
+{
+    rc_t rc;
+
+    if ( schema == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = VSchemaAddRef ( self -> schema );
+            if ( rc == 0 )
+            {
+                * schema = self -> schema;
+                return 0;
+            }
+        }
+
+        * schema = NULL;
+    }
+
+    return rc;
+}
+
+
+/* lists the tables of the database
+ * 
+ * "names" [ OUT ] - return parameter for tables 
+ */
+LIB_EXPORT rc_t CC VDatabaseListTbl ( const VDatabase *self, KNamelist **names )
+{
+    rc_t rc;
+
+    if ( names == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcListing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcListing, rcSelf, rcNull );
+        else
+        {
+            if ( self->kdb == NULL )
+                rc = RC ( rcVDB, rcDatabase, rcListing, rcParam, rcNull );
+            else
+            {
+                return KDatabaseListTbl ( self->kdb, names );
+            }
+        }
+        *names = NULL;
+    }
+    return rc;
+}
+
+/* lists the sub-databases of the database
+ * 
+ * "names" [ OUT ] - return parameter for databases 
+ */
+LIB_EXPORT rc_t CC VDatabaseListDB ( const VDatabase *self, KNamelist **names )
+{
+    rc_t rc;
+
+    if ( names == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcListing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcListing, rcSelf, rcNull );
+        else
+        {
+            if ( self->kdb == NULL )
+                rc = RC ( rcVDB, rcDatabase, rcListing, rcParam, rcNull );
+            else
+            {
+                return KDatabaseListDB ( self->kdb, names );
+            }
+        }
+        *names = NULL;
+    }
+    return rc;
+}
+
+/* GetUserData
+ * SetUserData
+ *  store/retrieve an opaque pointer to user data
+ */
+LIB_EXPORT rc_t CC VDatabaseGetUserData ( const VDatabase *self, void **data )
+{
+    rc_t rc;
+
+    if ( data == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * data = self -> user;
+            return 0;
+        }
+
+        * data = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseSetUserData ( const VDatabase *cself,
+    void *data, void ( CC * destroy ) ( void *data ) )
+{
+    VDatabase *self = ( VDatabase* ) cself;
+    if ( cself == NULL )
+        return RC ( rcVDB, rcDatabase, rcUpdating, rcSelf, rcNull );
+
+    self -> user = data;
+    self -> user_whack = destroy;
+
+    return 0;
+}
+
+
+/* OpenKDatabase
+ *  returns a new reference to underlying KDatabase
+ */
+LIB_EXPORT rc_t CC VDatabaseOpenKDatabaseRead ( const VDatabase *self, const KDatabase **kdb )
+{
+    rc_t rc;
+
+    if ( kdb == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDatabaseAddRef ( self -> kdb );
+            if ( rc == 0 )
+            {
+                * kdb = self -> kdb;
+                return 0;
+            }
+        }
+
+        * kdb = NULL;
+    }
+
+    return rc;
+}
+
+
+
+/* Typespec
+ *  retrieve db typespec
+ *
+ *  AVAILABILITY: version 2.2
+ *
+ *  "ts_buff" [ IN ] and "ts_size" [ IN ] - buffer for return of NUL-terminated
+ *  db typespec, e.g. 'NCBI:db:abc#1.1'
+ */
+LIB_EXPORT rc_t CC VDatabaseTypespec ( const VDatabase *self, char *ts_buff, size_t ts_size )
+{
+    rc_t rc;
+
+    if ( ts_size == 0 )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcBuffer, rcInsufficient );
+    else if ( ts_buff == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcBuffer, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc_t rc2;
+            rc2 = string_printf ( ts_buff, ts_size, NULL, "%N#%V", self -> sdb -> name, self -> sdb -> version );
+            if ( rc2 == 0 )
+                return 0;
+            rc = rc2;
+        }
+
+        ts_buff [ 0 ] = 0;
+    }
+
+    return rc;
+}
+
+
+/* IsCSRA
+ *  ask an open database if it conforms to cSRA schema
+ */
+LIB_EXPORT bool CC VDatabaseIsCSRA ( const VDatabase *self )
+{
+    if ( self != NULL )
+    {
+        if ( KDatabaseExists ( self -> kdb, kptTable, "PRIMARY_ALIGNMENT" ) )
+        {
+            return KDatabaseExists ( self -> kdb, kptTable, "SEQUENCE" );
+        }
+    }
+
+    return false;
+}
diff --git a/libs/vdb/database-depend.c b/libs/vdb/database-depend.c
new file mode 100644
index 0000000..137b8c2
--- /dev/null
+++ b/libs/vdb/database-depend.c
@@ -0,0 +1,1807 @@
+/*==============================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include <vdb/vdb-priv.h> /* VDBManagerGetKDBManagerRead */
+#include <vdb/manager.h> /* VDBManagerRelease */
+#include <vdb/cursor.h>
+#include <vdb/table.h>
+#include <vdb/database.h>
+#include <vdb/dependencies.h>
+
+#include <kdb/kdb-priv.h> /* KDBManagerGetVFSManager */
+#include <kdb/manager.h>
+
+#include <vfs/manager.h> /* VFSManager */
+#include <vfs/resolver.h> /* VResolver */
+#include <vfs/path.h>
+
+#include <kfg/config.h>
+
+#include <klib/container.h>
+#include <klib/debug.h> /* DBG_VDB */
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/printf.h> /* string_printf */
+#include <klib/rc.h>
+#include <klib/text.h>
+
+#include <sysalloc.h>
+
+#include "cursor-priv.h"
+
+/* missing macros/function from klib/rc.h
+ */
+#define GetRCSTATE( rc ) \
+    ( ( rc ) & 0x00003FFF )
+#define RC_STATE( obj, state)                         \
+    ( rc_t ) ( ( ( rc_t ) ( obj ) << 6 ) |            \
+               ( ( rc_t ) ( state ) ) )
+
+#include <assert.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+static bool OLD = true;
+
+typedef struct {
+    /* deprecated way */
+    char ref[PATH_MAX + 1];
+
+    /* new way */
+    const String *local;
+    const String *remote;
+    const String *cache;
+
+    uint32_t count;
+    rc_t rc;
+} Resolved;
+typedef struct {
+    BSTNode n;
+
+    bool circular;
+    char* name;
+    uint32_t readLen;
+    char* seqId;
+    bool local;
+
+    Resolved resolved;
+} RefNode;
+static rc_t _ResolvedRelease(Resolved *self) {
+    rc_t rc = 0;
+
+    assert(self);
+
+    free((void*)self->local);
+    free((void*)self->cache);
+    free((void*)self->remote);
+
+    memset(self, 0, sizeof *self);
+
+    return rc;
+}
+
+
+static void CC bstWhack( BSTNode* n, void* ignore )
+{
+    RefNode* sn = (RefNode*) n;
+
+    assert( sn );
+
+    free( sn->name );
+
+    free( sn->seqId );
+
+    _ResolvedRelease( &sn->resolved );
+
+    memset( sn, 0, sizeof *sn );
+
+    free( sn );
+}
+
+static
+int64_t CC bstCmpBySeqId(const void* item, const BSTNode* n)
+{
+    const char* s1 = item;
+    const RefNode* sn = (const RefNode*) n;
+
+    assert(s1 && sn);
+
+    return strcmp(s1, sn->seqId);
+}
+
+static int64_t CC bstCmpByRemote(const void* item, const BSTNode* n)
+{
+    const String* s1 = item;
+    const RefNode* sn = (const RefNode*) n;
+
+    assert(sn);
+
+    if (s1 == NULL) {
+        return sn->resolved.remote != NULL;
+    }
+    else {
+        size_t min = s1->size < sn->resolved.remote->size
+            ? s1->size : sn->resolved.remote->size;
+        return strncmp(s1->addr, sn->resolved.remote->addr, min);
+    }
+}
+
+static
+int64_t CC bstSortBySeqId(const BSTNode* item, const BSTNode* n)
+{
+    const RefNode* sn = (const RefNode*) item;
+
+    return bstCmpBySeqId(sn->seqId, n);
+}
+
+static
+int64_t CC bstSortByRemote(const BSTNode* item, const BSTNode* n)
+{
+    const RefNode* sn = (const RefNode*) item;
+
+    return bstCmpByRemote(sn->resolved.remote, n);
+}
+
+typedef struct Column {
+    uint32_t idx;
+    const char* name;
+    uint32_t expected;
+    uint32_t elem_bits;
+} Column;
+
+static
+rc_t AddColumn(rc_t rc, const VCursor* curs, Column* col)
+{
+    if (rc == 0) {
+        assert(curs && col);
+
+        rc = VCursorAddColumn(curs, &col->idx, "%s", col->name);
+        if (rc != 0) {
+            DBGMSG(DBG_VDB, DBG_FLAG(DBG_VDB),
+                ("Cannot Add Column %s", col->name));
+        }
+    }
+
+    return rc;
+}
+
+/* Read a column data from a Cursor */
+static
+rc_t CursorRead(rc_t rc, const VCursor* curs, int64_t row_id,
+    const Column* col, void* buffer, uint32_t blen, uint32_t* row_len)
+{
+    assert(curs);
+
+    if (rc == 0) {
+        uint32_t elem_bits = col->elem_bits;
+        uint32_t expected = col->expected;
+        assert(col);
+
+        if (blen == 0) {
+            assert(buffer == NULL);
+            ++blen;
+        }
+
+        rc = VCursorReadDirect
+            (curs, row_id, col->idx, elem_bits, buffer, blen - 1, row_len);
+
+        if (rc != 0) {
+            if (buffer == NULL &&
+                rc == RC(rcVDB, rcCursor, rcReading, rcBuffer, rcInsufficient))
+            {
+                rc = 0;
+            }
+        }
+        else {
+            if (expected > 0 && *row_len != expected) {
+                rc = RC(rcVDB, rcCursor, rcReading, rcData, rcUnexpected);
+            }
+            if (buffer != NULL && expected == 0)
+            {   ((char*)buffer)[*row_len] = '\0'; }
+        }
+    }
+
+    return rc;
+}
+
+#if 0
+/* Read a String from Configuration into "value" buffer */
+static rc_t ReadCfgStr
+(const KConfig* kfg, const char* path, char* value, size_t value_sz)
+{
+    rc_t rc = 0;
+    const KConfigNode *node = NULL;
+
+    rc = KConfigOpenNodeRead(kfg, &node, "%s", path);
+    if (rc == 0) {
+        size_t num_read = 0;
+        size_t remaining = 0;
+        rc = KConfigNodeRead
+            (node, 0, value, value_sz - 1, &num_read, &remaining);
+        if (rc == 0) {
+            if (remaining != 0)
+            {   rc = RC(rcVDB, rcString, rcReading, rcSize, rcExcessive); }
+/* TODO: make sure check value[num_read] assignment is valid
+         when remaining == 0 */
+            else { value[num_read] = '\0'; }
+        }
+    }
+
+    RELEASE(KConfigNode, node);
+
+    return rc;
+}
+#endif
+
+#define SIZE 4096
+
+/* Ctx struct is used to find a file using KConfig "refseq" parameters */
+typedef struct {
+    KDirectory* dir;
+
+    char servers[SIZE];
+    char volumes[SIZE];
+    char paths[SIZE];
+
+    VResolver* resolver;
+
+    const Resolved* last;
+    bool hasDuplicates;
+} Ctx;
+static rc_t CtxInit(Ctx* self, const VDatabase *db) {
+    rc_t rc = 0;
+    KConfig* cfg = NULL;
+
+    assert(self && db);
+
+    memset(self, 0, sizeof *self);
+
+    if (rc == 0) {
+        rc = KConfigMake(&cfg, NULL);
+        if (rc == 0) {
+            const KConfigNode *node = NULL;
+            rc = KConfigOpenNodeRead(cfg, &node, "repository");
+            if (rc == 0) {
+                OLD = false;
+                LOGMSG(klogInfo, "KConfig(repository) found: using VResolver");
+            }
+            else {
+                OLD = true;
+                LOGMSG(klogInfo,
+                    "KConfig(repository) not found: not using VResolver");
+            }
+            RELEASE(KConfigNode, node);
+        }
+    }
+
+#if 0
+    if (OLD) {
+        if (self->dir != NULL) {
+            return rc;
+        }
+
+        rc = KDirectoryNativeDir(&self->dir);
+
+        if (rc == 0) {
+            const char path[] = "refseq/servers";
+            rc = ReadCfgStr(cfg, path, self->servers, sizeof self->servers);
+            if (rc != 0) {
+                if (GetRCState(rc) == rcNotFound)
+                {   rc = 0; }
+            }
+            else {
+                const char path[] = "refseq/volumes";
+                rc = ReadCfgStr(cfg, path, self->volumes, sizeof self->volumes);
+                if (rc != 0) {
+                    if (GetRCState(rc) == rcNotFound)
+                    {   rc = 0; }
+                }
+            }
+
+            if (rc == 0) {
+                const char path[] = "refseq/paths";
+                rc = ReadCfgStr(cfg, path, self->paths, sizeof self->paths);
+                if (rc != 0) {
+                    if (GetRCState(rc) == rcNotFound)
+                    {   rc = 0; }
+                }
+            }
+        }
+    }
+    else
+#endif
+    {
+        VFSManager* vfsmgr = NULL;
+        const KDBManager* kmgr = NULL;
+        const VDBManager *mgr = NULL;
+
+        if (rc == 0) {
+            rc = VDatabaseOpenManagerRead(db, &mgr);
+        }
+
+        if (rc == 0) {
+            rc = VDBManagerGetKDBManagerRead(mgr, &kmgr);
+        }
+
+        if (rc == 0) {
+            rc = KDBManagerGetVFSManager(kmgr, &vfsmgr);
+        }
+
+        if (rc == 0) {
+            rc = VFSManagerGetResolver(vfsmgr, &self->resolver);
+        }
+
+        RELEASE(VFSManager, vfsmgr);
+        RELEASE(KDBManager, kmgr);
+        RELEASE(VDBManager, mgr);
+    }
+
+    RELEASE(KConfig, cfg);
+
+    return rc;
+}
+
+static rc_t CtxDestroy(Ctx* self) {
+    rc_t rc = 0;
+
+    assert(self);
+
+    RELEASE(KDirectory, self->dir);
+    RELEASE(VResolver, self->resolver);
+
+    memset(self, 0, sizeof *self);
+
+    return rc;
+}
+
+typedef struct {
+    const char* file;
+    bool found;
+} FindRefseq;
+#if 0
+static rc_t CC is_file_in_dir(const KDirectory* dir,
+    uint32_t type, const char* name, void* data)
+{
+    rc_t rc = 0;
+
+    FindRefseq* t = data;
+
+    assert(dir && name && data && t->file);
+
+    if (strcmp(t->file, name) == 0) {
+        uint64_t size = 0;
+        rc = KDirectoryFileSize(dir, &size, "%s", name);
+        if (rc == 0 && size > 0) {
+            /* compensate configuration-assistant.perl behavior:
+               it used to create an empty refseq file
+               when failed to download it */
+            t->found = true;
+        }
+    }
+
+    return rc;
+}
+/* Find file within srv/vol. If found then copy complete path to buf.
+ * Return true if found
+ */
+static bool FindInDir(rc_t* aRc, const KDirectory* native, const char* srv,
+    const char* vol, const char* file, char* buf, size_t blen)
+{
+    rc_t rc = 0;
+
+    const KDirectory* dir = NULL;
+
+    FindRefseq t;
+
+    assert(aRc && native && srv && file && buf && blen);
+
+    rc = *aRc;
+
+    if (rc != 0)
+    {   return false; }
+
+    if (vol)
+    {   rc = KDirectoryOpenDirRead(native, &dir, false, "%s/%s", srv, vol); }
+    else
+    {   rc = KDirectoryOpenDirRead(native, &dir, false, "%s", srv); }
+
+    if (rc == 0) {
+        memset(&t, 0, sizeof t);
+        t.file = file;
+        rc = KDirectoryVVisit(dir, false, is_file_in_dir, &t, ".", NULL);
+        if (GetRCObject(rc) == rcDirectory && GetRCState(rc) == rcUnauthorized)
+        {   rc = 0; }
+
+        if (rc == 0 && t.found) {
+            if (vol) {
+                rc = KDirectoryResolvePath(native,
+                    true, buf, blen, "%s/%s/%s", srv, vol, file);
+            }
+            else {
+                rc = KDirectoryResolvePath(native,
+                    true, buf, blen, "%s/%s", srv, file);
+            }
+        }
+    }
+    else if (rc == SILENT_RC(rcFS,
+        rcDirectory, rcOpening, rcPath, rcIncorrect))
+    {
+        /* ignored nonexistent directory */
+        rc = 0;
+    }
+
+    RELEASE(KDirectory, dir);
+
+    *aRc = rc;
+
+    return t.found;
+}
+#endif
+#define rcResolver   rcTree
+static bool NotFoundByResolver(rc_t rc) {
+    if (GetRCModule(rc) == rcVFS) {
+        if (GetRCTarget(rc) == rcResolver) {
+            if (GetRCContext(rc) == rcResolving) {
+                if (GetRCState(rc) == rcNotFound) {
+                    return true;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+/* find remote reference using VResolver */
+static rc_t FindRef(Ctx* ctx, const char* seqId, Resolved* resolved,
+    int cacheState)
+{
+    rc_t rc = 0;
+
+    VPath* acc = NULL;
+    const VPath *remote = NULL;
+    size_t num_writ = 0;
+    char ncbiAcc[512] = "";
+
+    assert(ctx && resolved);
+
+    if (cacheState != -1) {
+        VResolverCacheEnable(ctx->resolver, cacheState);
+    }
+
+    if (rc == 0) {
+        rc = string_printf(ncbiAcc, sizeof ncbiAcc, &num_writ,
+            "ncbi-acc:%s?vdb-ctx=refseq", seqId);
+        if (rc == 0 && num_writ > sizeof ncbiAcc) {
+            return RC(rcExe, rcFile, rcCopying, rcBuffer, rcInsufficient);
+        }
+    }
+
+    if (rc == 0)
+    {
+        VFSManager *mgr;
+        rc = VFSManagerMake ( & mgr );
+        if ( rc == 0 )
+        {
+            rc = VFSManagerMakePath ( mgr, &acc, "%s", ncbiAcc);
+            VFSManagerRelease ( mgr );
+        }
+    }
+
+    if (rc == 0) {
+        bool remoteNotFound = false;
+        const VPath *local = NULL;
+        rc = VResolverLocal(ctx->resolver, acc, &local);
+        if (rc == 0) {
+            rc = VPathMakeString(local, &resolved->local);
+            RELEASE(VPath, local);
+        }
+        else if (NotFoundByResolver(rc)) {
+            rc = 0;
+        }
+
+        if (rc == 0) {
+            rc = VResolverRemote(ctx->resolver, 0, acc, &remote);
+            if (rc == 0) {
+                rc = VPathMakeString(remote, &resolved->remote);
+                if (rc == 0) {
+                    char *fragment = string_chr(resolved->remote->addr,
+                        resolved->remote->size, '#');
+                    if (fragment != NULL) {
+                        *fragment = '\0';
+                    }
+                }
+            }
+            else if (NotFoundByResolver(rc)) {
+                remoteNotFound = true;
+                rc = 0;
+            }
+        }
+
+        if (rc == 0 && !remoteNotFound) {
+            uint64_t file_size = 0;
+            const VPath *cache = NULL;
+            rc = VResolverCache(ctx->resolver, remote, &cache, file_size);
+            if (rc == 0) {
+                rc = VPathMakeString(cache, &resolved->cache);
+            }
+            else if (NotFoundByResolver(rc)) {
+                rc = 0;
+            }
+            RELEASE(VPath, cache);
+        }
+
+        if (rc == 0) {
+            if (ctx->last == NULL) {
+                ctx->last = resolved;
+            }
+            else {
+                const String *last = ctx->last->remote;
+                const String *crnt = resolved->remote;
+                if (last != NULL && crnt != NULL &&
+                    last->addr != NULL && crnt->addr != NULL)
+                {
+                    int min = crnt->size < last->size ? crnt->size : last->size;
+                    if (strncmp(last->addr, crnt->addr, min) == 0) {
+                        ctx->hasDuplicates = true;
+                    }
+                }
+            }
+        }
+    }
+
+    RELEASE(VPath, remote);
+    RELEASE(VPath, acc);
+
+    if (cacheState != -1) {
+        VResolverCacheEnable(ctx->resolver, vrAlwaysDisable);
+    }
+
+    return rc;
+}
+#if 0
+/* find remote reference using KConfig values */
+static
+rc_t DeprecatedFindRef(Ctx* ctx, const char* seqId, Resolved* resolved)
+{
+    rc_t rc = 0;
+    bool found = false;
+
+    int i = ~0;
+
+    char* buf = NULL;
+    size_t blen = 0;
+
+    assert(ctx && seqId && resolved);
+
+    memset(resolved, 0, sizeof *resolved);
+    buf = resolved->ref;
+    blen = sizeof resolved->ref;
+
+    for (i = 0; i < 2 && !found; ++i) {
+        char prefix[7] = "";
+        if (i > 0) {
+            if (strlen(seqId) > 6) {
+                strncpy(prefix, seqId, 6);
+                prefix[6] = '\0';
+                seqId = prefix;
+            }
+            else {
+                break;
+            }
+        }
+        if (rc == 0 && ctx->dir != NULL) {
+            if (FindInDir(&rc, ctx->dir, ".", NULL, seqId, buf, blen)) {
+                found = true;
+            }
+            else {
+                if (ctx->paths[0]) {
+                    char paths[SIZE];
+                    char* path_rem = paths;
+                    char* path_sep = NULL;
+                    strcpy(paths, ctx->paths);
+                    do {
+                        char const* path = path_rem;
+                        path_sep = strchr(path, ':');
+                        if (path_sep) {
+                            path_rem = path_sep + 1;
+                            *path_sep = 0;
+                        }
+                        if (FindInDir(&rc, ctx->dir, path, NULL,
+                            seqId, buf, blen))
+                        {
+                            found = true;
+                            break;
+                        }
+                    } while(path_sep && rc == 0);
+                }
+                if (!found && ctx->servers[0] && ctx->volumes[0]) {
+                    char server[SIZE];
+                    char vol[SIZE];
+                    char* srv_sep = NULL;
+                    char* srv_rem = server;
+                    strcpy(server, ctx->servers);
+    /* TODO check for multiple servers/volumes */
+                    do {
+                        char* vol_rem = vol;
+                        char* vol_sep = NULL;
+                        strcpy(vol, ctx->volumes);
+                        srv_sep = strchr(server, ':');
+                        if (srv_sep) {
+                            srv_rem = srv_sep + 1;
+                            *srv_sep = '\0';
+                        }
+                        do {
+                            char const* volume = vol_rem;
+                            vol_sep = strchr(volume, ':');
+                            if (vol_sep) {
+                                vol_rem = vol_sep + 1;
+                                *vol_sep = 0;
+                            }
+                            if (FindInDir(&rc, ctx->dir, server, volume,
+                                seqId, buf, blen))
+                            {
+                                found = true;
+                                break;
+                            }
+                        } while (vol_sep && rc == 0);
+                    } while (!found && srv_sep && rc == 0);
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+#endif
+typedef struct {
+/* row values */
+    uint32_t readLen;
+    char circular[8];
+    char name[256];
+    char seqId[256];
+
+/* we do not read CMP_READ value, just its row_len */
+    uint32_t row_lenCMP_READ;
+} Row;
+/* Add a REFERENCE table Row to BSTree */
+static
+rc_t AddRow(BSTree* tr, Row* data, Ctx* ctx, int cacheState)
+{
+    rc_t rc = 0;
+    bool newRemote = false;
+    RefNode* sn = NULL;
+
+    assert(tr && data && ctx);
+
+    sn = (RefNode*) BSTreeFind(tr, data->seqId, bstCmpBySeqId);
+    if (sn == NULL) {
+        sn = calloc(1, sizeof *sn);
+        if (sn == NULL) {
+            return RC
+                (rcVDB, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+        sn->seqId = string_dup_measure(data->seqId, NULL);
+        if (sn->seqId == NULL) {
+            bstWhack((BSTNode*) sn, NULL);
+            sn = NULL;
+            return RC
+                (rcVDB, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+
+        sn->name = string_dup_measure(data->name, NULL);
+        if (sn->name == NULL) {
+            bstWhack((BSTNode*) sn, NULL);
+            sn = NULL;
+            return RC
+                (rcVDB, rcStorage, rcAllocating, rcMemory, rcExhausted);
+        }
+
+        sn->circular = data->circular[0];
+        sn->readLen = data->readLen;
+        sn->local = (data->row_lenCMP_READ != 0);
+        newRemote = ! sn->local;
+
+        BSTreeInsert(tr, (BSTNode*)sn, bstSortBySeqId);
+    }
+    else {
+        if (data->row_lenCMP_READ != 0) {
+            sn->local = true;
+        }
+        if (strcmp(sn->name, data->name) || sn->circular != data->circular[0]) {
+            return RC(rcVDB, rcCursor, rcReading, rcData, rcInconsistent);
+        }
+        sn->readLen += data->readLen;
+    }
+
+    if (rc == 0 && newRemote) {
+/*      if (OLD) {
+            rc = DeprecatedFindRef(ctx, sn->seqId, &sn->resolved);
+        }
+        else { */
+            rc = FindRef(ctx, sn->seqId, &sn->resolved, cacheState);
+/*      } */
+    }
+
+    return rc;
+}
+
+struct VDBDependencies {
+    uint32_t count;
+    RefNode** dependencies;
+
+    BSTree* tr;
+
+    /* open references */
+    KRefcount refcount;
+};
+typedef struct Initializer {
+    bool all;            /* IN: when false: process just missed */
+    bool fill;           /* IN:
+                          false: count(fill count); true: fill dep(use count) */
+    uint32_t count;      /* IO: all/missed count */
+    VDBDependencies* dep;/* OUT: to be filled */
+    uint32_t i;          /* PRIVATE: index in dep */
+    rc_t rc;             /* OUT */
+} Initializer;
+/* Work function to process dependencies tree
+ * Input parameters are in Initializer:
+ *  all (true: all dependencies, false: just missing)
+ *  fill(false: count dependencies, true: fill dependencies array
+ */
+static void CC bstProcess(BSTNode* n, void* data) {
+    RefNode* elm = (RefNode*) n;
+    Initializer* obj = (Initializer*) data;
+    bool go = false;
+
+    assert(elm && obj);
+
+ /* remore reference && refseq table not found */
+    if (obj->all) {
+        go = true;
+    }
+    else if (!elm->local) {
+        if (OLD) {
+            if (elm->resolved.ref[0] == '\0') {
+                go = true;
+            }
+        }
+        else {
+            if (elm->resolved.local == NULL) {
+                go = true;
+            }
+        }
+    }
+
+    if (!go) {
+        return;
+    }
+
+    if (!obj->fill) {
+        ++obj->count;
+    }
+    else {
+        if (obj->dep == NULL || obj->dep->dependencies == NULL) {
+            return;
+        }
+        if (obj->i < obj->count) {
+            *(obj->dep->dependencies + ((obj->i)++)) = elm;
+        }
+        else {
+            obj->rc = RC(rcVDB, rcDatabase, rcAccessing, rcSelf, rcCorrupt);
+        }
+    }
+}
+
+/* Read REFERENCE table; fill in BSTree */
+static
+rc_t CC VDatabaseDependencies(const VDatabase *self, BSTree* tr,
+    bool* has_no_REFERENCE, bool* hasDuplicates, bool disableCaching)
+{
+    rc_t rc = 0;
+
+    int64_t i = 0;
+    int64_t firstId = 0;
+    int64_t lastId = 0;
+
+    Column CIRCULAR = { 0, "CIRCULAR", 1,  8 };
+    Column CMP_READ = { 0, "CMP_READ", 0,  8 };
+    Column NAME     = { 0, "NAME"    , 0,  8 };
+    Column READ_LEN = { 0, "READ_LEN", 1, 32 };
+    Column SEQ_ID   = { 0, "SEQ_ID",   0,  8 };
+
+    const VTable* tbl = NULL;
+    const VCursor* curs = NULL;
+
+    int cacheState = -1;
+
+    Ctx ctx;
+
+    assert(self && tr && has_no_REFERENCE);
+
+    *has_no_REFERENCE = false;
+
+    if (rc == 0) {
+        rc = CtxInit(&ctx, self);
+    }
+
+    if (rc == 0 && disableCaching) {
+        cacheState = VResolverCacheEnable(ctx.resolver, vrAlwaysDisable);
+    }
+
+
+    if (rc == 0) {
+        rc = VDatabaseOpenTableRead(self, &tbl, "REFERENCE");
+        if (GetRCState(rc) == rcNotFound) {
+            *has_no_REFERENCE = true;
+        }
+    }
+    if (rc == 0) {
+        rc = VTableCreateCursorReadInternal(tbl, &curs);
+    }
+
+    rc = AddColumn(rc, curs, &CIRCULAR);
+    rc = AddColumn(rc, curs, &CMP_READ);
+    rc = AddColumn(rc, curs, &NAME    );
+    rc = AddColumn(rc, curs, &READ_LEN);
+    rc = AddColumn(rc, curs, &SEQ_ID  );
+
+    if (rc == 0) {
+        rc = VCursorOpen(curs);
+    }
+    if (rc == 0) {
+        uint64_t count = 0;
+        rc = VCursorIdRange(curs, 0, &firstId, &count);
+        lastId = firstId + count - 1;
+    }
+
+    for (i = firstId; i <= lastId && rc == 0; ++i) {
+        uint32_t row_len = 0;
+        Row data;
+        if (rc == 0) {
+            rc = CursorRead(rc, curs, i, &CIRCULAR,
+                data.circular, sizeof data.circular, &row_len);
+            if (rc != 0) {
+                PLOGERR(klogErr, (klogErr, rc,
+                    "failed to read cursor(col='CIRCULAR', spot='$(id)')",
+                    "id=%ld", i));
+            }
+        }
+        if (rc == 0) {
+            rc = CursorRead(rc, curs, i, &CMP_READ,
+                NULL, 0, &data.row_lenCMP_READ);
+            if (rc != 0) {
+                PLOGERR(klogErr, (klogErr, rc,
+                    "failed to read cursor(col='CMP_READ', spot='$(id)')",
+                    "id=%ld", i));
+            }
+        }
+        if (rc == 0) {
+            rc = CursorRead(rc, curs, i, &NAME,
+                data.name, sizeof data.name, &row_len);
+            if (rc != 0) {
+                PLOGERR(klogErr, (klogErr, rc,
+                    "failed to read cursor(col='NAME', spot='$(id)')",
+                    "id=%ld", i));
+            }
+        }
+        if (rc == 0) {
+            rc = CursorRead(rc, curs, i, &READ_LEN,
+                &data.readLen, sizeof data.readLen, &row_len);
+            if (rc != 0) {
+                PLOGERR(klogErr, (klogErr, rc,
+                    "failed to read cursor(col='READ_LEN', spot='$(id)')",
+                    "id=%ld", i));
+            }
+        }
+        if (rc == 0) {
+            rc = CursorRead(rc, curs, i, &SEQ_ID,
+                data.seqId, sizeof data.seqId, &row_len);
+            if (rc != 0) {
+                PLOGERR(klogErr, (klogErr, rc,
+                    "failed to read cursor(col='SEQ_ID', spot='$(id)')",
+                    "id=%ld", i));
+            }
+        }
+        if (rc == 0) {
+            rc = AddRow(tr, &data, &ctx, cacheState);
+        }
+    }
+
+    if (rc == 0 && hasDuplicates != NULL) {
+        *hasDuplicates = ctx.hasDuplicates;
+    }
+
+    if (*has_no_REFERENCE) {
+        rc = 0;
+    }
+
+    if (cacheState != -1) {
+        VResolverCacheEnable(ctx.resolver, cacheState);
+    }
+
+    {
+        rc_t rc2 = CtxDestroy(&ctx);
+        if (rc == 0 && rc2 != 0) {
+            rc = rc2;
+        }
+    }
+
+    RELEASE(VCursor, curs);
+    RELEASE(VTable, tbl);
+
+    return rc;
+}
+
+/* Get dependency number "idx" */
+static
+rc_t VDBDependenciesGet(const VDBDependencies* self,
+    RefNode** dep, uint32_t idx)
+{
+    rc_t rc = 0;
+
+    assert(dep);
+
+    if (self == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull);
+    }
+
+    if (idx >= self->count) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcParam, rcExcessive);
+    }
+
+    *dep = *(self->dependencies + idx);
+    if (*dep == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcSelf, rcCorrupt);
+    }
+
+    return rc;
+}
+
+/* Count
+ *  retrieve the number of dependencies
+ *
+ *  "count" [ OUT ] - return parameter for dependencies count
+ */
+LIB_EXPORT rc_t CC VDBDependenciesCount(const VDBDependencies* self,
+    uint32_t* count)
+{
+    if (self == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull);
+    }
+
+    if (count == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcParam, rcNull);
+    }
+
+    *count = self->count;
+
+    return 0;
+}
+
+/* Circular */
+LIB_EXPORT rc_t CC VDBDependenciesCircular(const VDBDependencies* self,
+    bool* circular, uint32_t idx)
+{
+    rc_t rc = 0;
+    RefNode* dep = NULL;
+
+    if (circular == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcParam, rcNull);
+    }
+
+    rc = VDBDependenciesGet(self, &dep, idx);
+
+    if (rc == 0) {
+        *circular = dep->circular;
+    }
+
+    return rc;
+}
+
+/* Local
+ *  retrieve local property
+ *
+ *  "local" [ OUT ] - true if object is stored internally
+ *
+ *  "idx" [ IN ] - zero-based index of dependency
+ */
+LIB_EXPORT rc_t CC VDBDependenciesLocal(const VDBDependencies* self,
+    bool* local, uint32_t idx)
+{
+    rc_t rc = 0;
+    RefNode* dep = NULL;
+
+    if (local == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcParam, rcNull);
+    }
+
+    rc = VDBDependenciesGet(self, &dep, idx);
+
+    if (rc == 0) {
+        *local = dep->local;
+    }
+
+    return rc;
+}
+
+/* Name
+ *
+ * "name" [ OUT ] - returned pointed should not be released.
+ *                  it becomes invalid after VDBDependenciesRelease
+ */
+LIB_EXPORT rc_t CC VDBDependenciesName(const VDBDependencies* self,
+    const char** name, uint32_t idx)
+{
+    rc_t rc = 0;
+    RefNode* dep = NULL;
+
+    if (name == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcParam, rcNull);
+    }
+
+    rc = VDBDependenciesGet(self, &dep, idx);
+
+    if (rc == 0) {
+        *name = dep->name;
+    }
+
+    return rc;
+}
+
+static rc_t VDBDependencyGetPath(const String* from, const char** to) {
+    assert(to);
+
+    *to = NULL;
+
+    if (OLD) {
+        return 0;
+    }
+
+    if (from == NULL) {
+        return 0;
+    }
+
+    if (from->addr != NULL && from->size > 0 &&
+        from->addr[from->size - 1] != '\0' &&
+        from->addr[from->size] != '\0')
+    {
+        return RC(rcVDB, rcString, rcValidating, rcChar, rcInvalid);
+    }
+
+    *to = from->addr;
+    return 0;
+}
+
+/* Path
+ *  for remote dependencies: returns:
+ *                              path for resolved dependency,
+ *                              NULL for missing dependency.
+ *  returns NULL for local dependencies
+ *
+ * "path" [ OUT ] - returned pointed should not be released.
+ *                  it becomes invalid after VDBDependenciesRelease
+ */
+LIB_EXPORT rc_t CC VDBDependenciesPath(const VDBDependencies* self,
+    const char** path, uint32_t idx)
+{
+    rc_t rc = 0;
+    RefNode* dep = NULL;
+
+    if (path == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcParam, rcNull);
+    }
+
+    rc = VDBDependenciesGet(self, &dep, idx);
+
+    if (rc == 0) {
+        if (dep->local) {
+            *path = NULL;
+        }
+        else {
+            if (OLD) {
+                *path = dep->resolved.ref;
+            }
+            else {
+                rc = VDBDependencyGetPath(dep->resolved.local, path);
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDBDependenciesPathRemote(const VDBDependencies* self,
+    const char** path, uint32_t idx)
+{
+    rc_t rc = 0;
+    RefNode* dep = NULL;
+
+    if (path == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcParam, rcNull);
+    }
+
+    rc = VDBDependenciesGet(self, &dep, idx);
+
+    if (rc == 0) {
+        rc = VDBDependencyGetPath(dep->resolved.remote, path);
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDBDependenciesPathCache(const VDBDependencies* self,
+    const char** path, uint32_t idx)
+{
+    rc_t rc = 0;
+    RefNode* dep = NULL;
+
+    if (path == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcParam, rcNull);
+    }
+
+    rc = VDBDependenciesGet(self, &dep, idx);
+
+    if (rc == 0) {
+        rc = VDBDependencyGetPath(dep->resolved.cache, path);
+    }
+
+    return rc;
+}
+
+/* SeqId
+ *
+ * "seq_id" [ OUT ] - returned pointed should not be released.
+ *                    it becomes invalid after VDBDependenciesRelease
+ */
+LIB_EXPORT rc_t CC VDBDependenciesSeqId(const VDBDependencies* self,
+    const char** seq_id, uint32_t idx)
+{
+    rc_t rc = 0;
+    RefNode* dep = NULL;
+
+    if (seq_id == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcParam, rcNull);
+    }
+
+    rc = VDBDependenciesGet(self, &dep, idx);
+
+    if (rc == 0) {
+        *seq_id = dep->seqId;
+    }
+
+    return rc;
+}
+
+/* Type
+ *
+ * "type" [ OUT ] - a KDBPathType from kdb/manager.h
+ */
+LIB_EXPORT rc_t CC VDBDependenciesType(const VDBDependencies* self,
+    uint32_t* type, uint32_t idx)
+{
+    rc_t rc = 0;
+    RefNode* dep = NULL;
+
+    if (type == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcParam, rcNull);
+    }
+
+    rc = VDBDependenciesGet(self, &dep, idx);
+
+    if (rc == 0) {
+        *type = kptTable;
+    }
+
+    return rc;
+}
+
+#define CLSNAME "VDBDependencies"
+
+VDB_EXTERN rc_t CC VDBDependenciesAddRef(const VDBDependencies* self ) {
+    if (self != NULL) {
+        switch (KRefcountAdd(&self->refcount, CLSNAME)) {
+            case krefLimit:
+                return RC(rcVDB, rcDatabase, rcAttaching, rcRange, rcExcessive);
+        }
+    }
+
+    return 0;
+}
+
+static rc_t VDBDependenciesWhack(VDBDependencies* self) {
+    if (self == NULL) {
+        return 0;
+    }
+
+    KRefcountWhack(&self->refcount, CLSNAME);
+
+    BSTreeWhack(self->tr, bstWhack, NULL);
+    free(self->tr);
+
+    free(self->dependencies);
+
+    memset(self, 0, sizeof *self);
+
+    free(self);
+
+    return 0;
+}
+
+/* Release
+ *  (objects ARE NOT reference counted)
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC VDBDependenciesRelease(const VDBDependencies* self) {
+    if (self != NULL) {
+        switch (KRefcountDrop(&self->refcount, CLSNAME)) {
+        case krefWhack:
+            return VDBDependenciesWhack((VDBDependencies*)self);
+        case krefNegative:
+            return RC(rcVDB, rcDatabase, rcReleasing, rcRange, rcExcessive);
+        }
+    }
+
+    return 0;
+}
+
+typedef struct {
+    BSTree* tr;
+    int count;
+    bool all;
+} SBstCopy;
+static void CC bstCopy(BSTNode* n, void* data) {
+    RefNode* sn = NULL;
+    RefNode* elm = (RefNode*) n;
+    SBstCopy* x = (SBstCopy*)data;
+    BSTree* tr = x->tr;
+    bool go = false;
+    assert(elm && tr);
+
+    if (x->all) {
+        go = true;
+    } else if (!elm->local) {
+        assert(!OLD);
+        if (elm->resolved.local == NULL) {
+            go = true;
+        }
+    }
+
+    if (!go) {
+        return;
+    }
+
+    sn = (RefNode*) BSTreeFind(tr, elm->resolved.remote, bstCmpByRemote);
+    if (sn == NULL) {
+        sn = calloc(1, sizeof *sn);
+        if (sn == NULL) {
+/* TODO: generate error message */
+            return;
+        }
+
+        sn->seqId = string_dup_measure(elm->seqId, NULL);
+        if (sn->seqId == NULL) {
+            bstWhack((BSTNode*) sn, NULL);
+            return;
+        }
+
+        sn->name = string_dup_measure(elm->name, NULL);
+        if (sn->name == NULL) {
+            bstWhack((BSTNode*) sn, NULL);
+            return;
+        }
+
+        sn->circular = elm->circular;
+        sn->readLen = elm->readLen;
+        sn->local = elm->local;
+
+        sn->resolved.count = 1;
+
+        sn->resolved.local = elm->resolved.local;
+        elm->resolved.local = NULL;
+
+        sn->resolved.remote = elm->resolved.remote;
+        elm->resolved.remote = NULL;
+
+        sn->resolved.cache = elm->resolved.cache;
+        elm->resolved.cache = NULL;
+
+        BSTreeInsert(tr, (BSTNode*)sn, bstSortByRemote);
+        ++x->count;
+    }
+    else {
+        bool archived = false;
+        if (sn->resolved.rc != 0) {
+            return;
+        }
+        else if (sn->circular != elm->circular) {
+            sn->resolved.rc
+                = RC(rcVDB, rcNumeral, rcComparing, rcData, rcInvalid);
+        }
+        else if ((sn->name == NULL && elm->name != NULL)
+            || (sn->name != NULL && elm->name == NULL))
+        {
+            sn->resolved.rc
+                = RC(rcVDB, rcString, rcComparing, rcData, rcInvalid);
+        }
+        else if (strcmp(sn->name, elm->name) != 0) {
+            if (strncmp(sn->name, elm->name, 6) == 0) {
+                archived = true;
+            }
+            else {
+                sn->resolved.rc
+                    = RC(rcVDB, rcString, rcComparing, rcData, rcInvalid);
+            }
+        }
+
+        if (sn->resolved.rc != 0) {
+        }
+        else if (sn->readLen != elm->readLen && !archived) {
+            sn->resolved.rc
+                = RC(rcVDB, rcNumeral, rcComparing, rcData, rcInvalid);
+        }
+        else if (sn->seqId == NULL || elm->seqId == NULL) {
+            sn->resolved.rc
+                = RC(rcVDB, rcString, rcComparing, rcData, rcInvalid);
+        }
+        else if (sn->local != elm->local) {
+            sn->resolved.rc
+                = RC(rcVDB, rcNumeral, rcComparing, rcData, rcInvalid);
+        }
+        else if (sn->resolved.ref[0] != '\0' || elm->resolved.ref[0] != '\0') {
+            sn->resolved.rc
+                = RC(rcVDB, rcString, rcComparing, rcData, rcInvalid);
+        }
+        else if (sn->resolved.local != NULL || elm->resolved.local != NULL) {
+            sn->resolved.rc
+                = RC(rcVDB, rcString, rcComparing, rcData, rcInvalid);
+        }
+        else if (StringCompare(sn->resolved.remote, elm->resolved.remote) != 0)
+        {
+            int min = sn->resolved.remote->size < elm->resolved.remote->size
+                ? sn->resolved.remote->size : elm->resolved.remote->size;
+            if (!archived || strncmp(sn->resolved.remote->addr,
+                                elm->resolved.remote->addr, min) != 0)
+            {
+                sn->resolved.rc
+                    = RC(rcVDB, rcString, rcComparing, rcData, rcInvalid);
+            }
+        }
+
+        if (sn->resolved.rc != 0) {
+        }
+        else if (StringCompare(sn->resolved.cache, elm->resolved.cache) != 0)
+        {
+            sn->resolved.rc
+                = RC(rcVDB, rcString, rcComparing, rcData, rcInvalid);
+        }
+        else {
+            if (archived) {
+                int i = 0;
+                bool tail = false;
+                for (;;++i) {
+                    char* c1 = &sn->seqId[i];
+                    const char c2 = elm->seqId[i];
+                    if (*c1 == '\0') {
+                        break;
+                    }
+                    if (!tail && (c2 == '\0' || *c1 != c2)) {
+                        tail = true;
+                    }
+                    if (tail) {
+     /* incorrect:
+        we keep at least one seqid for archived refseqs to be able to resolve them
+                        *c1 = '.'; */
+                    }
+                }
+            }
+            ++sn->resolved.count;
+        }
+    }
+}
+
+/* ListDependencies
+ *  create a dependencies object: list all dependencies
+ *
+ *  "dep" [ OUT ] - return for VDBDependencies object
+ *
+ *  "missing" [ IN ] - if true, list only missing dependencies
+ *  otherwise, list all dependencies
+ *
+ * N.B. If missing == true then
+ *     just one refseq dependency will be returned for 'container' Refseq files.
+ */
+static rc_t VDatabaseListDependenciesImpl(const VDatabase* self,
+    const VDBDependencies** dep, bool missing, bool disableCaching)
+{
+    rc_t rc = 0;
+    VDBDependencies* obj = NULL;
+    bool all = ! missing;
+    bool has_no_REFERENCE = false;
+    bool hasDuplicates = false;
+
+    if (self == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull);
+    }
+    if (dep == NULL) {
+        return RC(rcVDB, rcDatabase, rcAccessing, rcParam, rcNull);
+    }
+
+    obj = calloc(1, sizeof *obj);
+    if (obj == NULL) {
+        return RC(rcVDB, rcStorage, rcAllocating, rcMemory, rcExhausted);
+    }
+
+    obj->tr = malloc(sizeof *obj->tr);
+    if (obj->tr == NULL) {
+        free(obj);
+        return RC(rcVDB, rcStorage, rcAllocating, rcMemory, rcExhausted);
+    }
+    BSTreeInit(obj->tr);
+
+    /* initialize dependencie tree */
+    rc = VDatabaseDependencies(self, obj->tr,
+        &has_no_REFERENCE, &hasDuplicates, disableCaching);
+    if (rc == 0 && has_no_REFERENCE) {
+        KRefcountInit(&obj->refcount, 1, CLSNAME, "make", "nodep");
+        *dep = obj;
+        return rc;
+    }
+
+    if (rc == 0) {
+        Initializer init;
+        memset(&init, 0, sizeof init);
+
+        /* count all/missing dependencies */
+        init.all = all;
+        init.fill = false;
+        BSTreeForEach(obj->tr, false, bstProcess, &init);
+     /* now init.count = number of (all == true ? 'all' : 'missed') references*/
+
+        rc = init.rc;
+        if (rc == 0) {
+            obj->count = init.count;
+        }
+
+        if (rc == 0 && missing && hasDuplicates) {
+            /* references have duplicates. e.g. AAAB01... */
+            SBstCopy x;
+            BSTree* tr = malloc(sizeof *tr);
+            if (tr == NULL) {
+                rc = RC(rcVDB, rcStorage, rcAllocating, rcMemory, rcExhausted);
+                return rc;
+            }
+            BSTreeInit(tr);
+            x.count = 0;
+            x.tr = tr;
+            x.all = all;
+
+         /* compact obj->tr into tr, skip duplicates
+            x.count is the number of all references from obj.tr */
+            BSTreeForEach(obj->tr, false, bstCopy, &x);
+            BSTreeWhack(obj->tr, bstWhack, NULL);
+            free(obj->tr);
+            obj->tr = tr;
+            obj->count = init.count = x.count;
+        }
+
+        if (rc == 0) {
+            /* initialize dependencies array with pointers to tree values */
+            if (obj->count > 0) {
+                obj->dependencies
+                    = calloc(obj->count, sizeof obj->dependencies);
+                if (obj->dependencies == NULL) {
+                    free(obj);
+                    return RC
+                        (rcVDB, rcStorage, rcAllocating, rcMemory, rcExhausted);
+                }
+                init.fill = true;
+                init.dep = obj;
+                BSTreeForEach(obj->tr, false, bstProcess, &init);
+                rc = init.rc;
+                if (rc == 0 && init.i != init.count) {
+                    rc = RC(rcVDB, rcDatabase, rcAccessing, rcSelf, rcCorrupt);
+                }
+            }
+        }
+    }
+
+    if (rc == 0) {
+        KRefcountInit(&obj->refcount, 1, CLSNAME, "make", "dep");
+        *dep = obj;
+    }
+    else {
+        VDBDependenciesRelease(obj);
+    }
+
+    return rc;
+}
+
+
+/* ListDependencies
+ *  create a dependencies object: list all dependencies
+ *
+ *  "dep" [ OUT ] - return for VDBDependencies object
+ *
+ *  "missing" [ IN ] - if true, list only missing dependencies
+ *  otherwise, list all dependencies
+ *
+ * N.B. If missing == true then
+ *     just one refseq dependency will be returned for 'container' Refseq files.
+ */
+LIB_EXPORT rc_t CC VDatabaseListDependencies(const VDatabase* self,
+    const VDBDependencies** dep, bool missing)
+{
+    return VDatabaseListDependenciesImpl(self, dep, missing, false);
+}
+
+
+/* ListDependenciesWithCaching
+ *  create dependencies object: list dependencies
+ *
+ *  Call VResolverCacheEnable(cacheState) before reading VDatabase.
+ *  It allows to control cache update inside the function.
+ *
+ *  "dep" [ OUT ] - return for VDBDependencies object
+ *
+ *  "missing" [ IN ] - if true, list only missing dependencies
+ *  otherwise, list all dependencies
+ *
+ *  "disableCaching" [ IN ] - if true, disable caching inside of the function
+ *  otherwise, do not change the caching state
+ */
+LIB_EXPORT rc_t CC VDatabaseListDependenciesWithCaching (
+    struct VDatabase const *self,
+    const VDBDependencies **dep, bool missing,
+    bool disableCaching )
+{
+    return VDatabaseListDependenciesImpl(self, dep, missing, disableCaching);
+}
+
+
+static bool DependenciesError(rc_t rc) {
+    return GetRCModule(rc) == rcAlign && GetRCObject(rc) == (enum RCObject)rcTable
+          && GetRCState(rc) == rcNotFound;
+}
+
+typedef enum ErrType {
+    eUnknown,
+    eNoEncInKfg,
+    ePwdFileNotFound,
+    eBadPwdFile,
+    eBadEncKey
+} ErrType;
+static ErrType DependenciesType(rc_t rc) {
+    if (GetRCTarget(rc) == rcEncryptionKey)
+    {
+        switch (GetRCSTATE(rc))
+        {
+            /* no configuration or environment */
+        case RC_STATE(rcFile, rcUnknown):
+            return eNoEncInKfg;
+
+            /* no file where told to look */
+        case RC_STATE(rcFile, rcNotFound):
+            return ePwdFileNotFound;
+
+            /* after decryption the file wasn't a database object */
+        case RC_STATE(rcEncryption, rcIncorrect):
+            return eBadEncKey;
+
+        default:
+            break;
+        }
+    }
+    else if (GetRCTarget(rc) == rcMgr)
+    {
+        switch (GetRCSTATE(rc))
+        {
+        case RC_STATE(rcEncryptionKey, rcTooShort): /* too short */
+        case RC_STATE(rcEncryptionKey, rcTooLong): /* too long */
+            return eBadPwdFile;
+
+        default:
+            break;
+        }
+    }
+    return eUnknown;
+}
+
+LIB_EXPORT bool CC UIError( rc_t rc,
+    const VDatabase* db, const VTable* table)
+{
+    bool retval = false;
+    if( db != NULL || table != NULL ) {
+      if( DependenciesError(rc) ) {
+        if( db != NULL ) {
+            VDatabaseAddRef(db);
+        } else if( VTableOpenParentRead(table, &db) != 0 ) {
+            db = NULL;
+        }
+        if( db != NULL ) {
+            const VTable* ref;
+            if( VDatabaseOpenTableRead(db, &ref, "REFERENCE") == 0 ) {
+                const VCursor* c;
+                if( VTableCreateCachedCursorRead(ref, &c, 0) == 0 ) {
+                    uint32_t i;
+                    retval = VCursorAddColumn(c, &i, "CIRCULAR") == 0
+                        && VCursorOpen(c) == 0;
+                    VCursorRelease(c);
+                }
+                VTableRelease(ref);
+            }
+            VDatabaseRelease(db);
+        }
+      }
+    }
+    else if (db == NULL && table == NULL) {
+        ErrType type = DependenciesType(rc);
+        if (type != eUnknown) {
+            retval = true;
+        }
+    }
+    return retval;
+}
+
+static
+void CC VDBDependenciesLOGMissing( rc_t rc,
+    const VDatabase* db, bool log_list )
+{
+    static bool once = false;
+    if( !once ) {
+      KWrtHandler handler;
+
+      once = true;
+
+      handler.writer = KOutWriterGet();
+      handler.data = KOutDataGet();
+      KOutHandlerSetStdErr();
+
+      if (DependenciesError(rc)) {
+        OUTMSG(("This operation requires access to external"
+            " reference sequence(s) that could not be located\n"));
+        if (db && log_list) {
+            const VDBDependencies* dep = NULL;
+            uint32_t i, count = 0;
+            if( VDatabaseListDependencies(db, &dep, true) == 0 &&
+                VDBDependenciesCount(dep, &count) == 0 ) {
+                for(i = 0; i < count; i++) {
+                    const char* name = NULL, *seqId = NULL;
+                    if (VDBDependenciesName(dep, &name, i) == 0
+                            && VDBDependenciesSeqId(dep, &seqId, i) == 0)
+                    {
+                        OUTMSG(("Reference sequence %s %s was not found\n",
+                                seqId, name));
+                    }
+                }
+                VDBDependenciesRelease(dep);
+            }
+        }
+        OUTMSG((
+              "Please run \"perl configuration-assistant.perl\" and try again\n"
+            ));
+      }
+      else {
+        switch (DependenciesType(rc)) {
+            case eNoEncInKfg:
+                OUTMSG((
+"The file you are trying to open is encrypted,\n"
+"but no decryption password could be located.\n"
+"To set up a password,\n"
+"run the 'configuration-assistant.perl' script provided with the toolkit.\n"));
+                break;
+            case ePwdFileNotFound:
+                OUTMSG((
+"The file you are trying to open is encrypted,\n"
+"but no decryption password could be obtained\n"
+"from the path given in configuration.\n"
+"To set up or change a password,\n"
+"run the 'configuration-assistant.perl' script provided with the toolkit.\n"));
+                break;
+            case eBadEncKey:
+                OUTMSG((
+"The file you are trying to open is encrypted, but could not be opened.\n"
+"Either your password is incorrect or the downloaded file is corrupt.\n"
+"To set up or change a password,\n"
+"run the 'configuration-assistant.perl' script provided with the toolkit.\n"
+"To test the file for corruption,\n"
+"run the 'nencvalid' tool provided with the toolkit.\n"));
+                break;
+        case eBadPwdFile:
+                OUTMSG((
+"The file you are trying to open is encrypted, but could not be opened.\n"
+"The password in the password file in unusable either from being 0 bytes\n"
+"or more than 4096 bytes long. The password starts at the beginning of\n"
+"the file and ends with the first CR (\\r) pr LF (\\n) or at the end of\n"
+"the file.\n"
+"To set up or change a password,\n"
+"run the 'configuration-assistant.perl' script provided with the toolkit.\n"));
+                break;
+            default:
+                assert(0);
+        }
+      }
+
+      OUTMSG(("\n"));
+      KOutHandlerSet(handler.writer, handler.data);
+    }
+}
+
+LIB_EXPORT const char* CC UIDatabaseGetErrorString(rc_t rc)
+{
+    if (DependenciesError(rc)) {
+        return "This operation requires access to external"
+            " reference sequence(s) that could not be located";
+    }
+    else {
+        switch (DependenciesType(rc)) {
+            case eNoEncInKfg:
+                return "The file is encrypted, "
+                    "but no decryption password could be located";
+            case ePwdFileNotFound:
+                return "The file is encrypted, "
+                    "but no decryption password could be obtained "
+                    "from the path given in configuration";
+            case eBadEncKey:
+                return "The file is encrypted, but could not be opened. "
+                    "Either the password is incorrect or the file is corrupt";
+            case eBadPwdFile:
+                return "The file is encrypted, but could not be opened. "
+                    "The password in the password file in unusable";
+            default:
+                assert(0);
+                return "Unexpected Dependency Type";
+        }
+    }
+}
+
+LIB_EXPORT void CC UIDatabaseLOGError( rc_t rc,
+    const VDatabase* db, bool log_list )
+{
+    VDBDependenciesLOGMissing(rc, db, log_list);
+}
+
+LIB_EXPORT void CC UITableLOGError( rc_t rc,
+    const VTable* table, bool log_list )
+{
+    const VDatabase* db;
+    if( table == NULL ) {
+        VDBDependenciesLOGMissing(rc, NULL, log_list);
+    }
+    else if( VTableOpenParentRead(table, &db) == 0 && db != NULL ) {
+        VDBDependenciesLOGMissing(rc, db, log_list);
+        VDatabaseRelease(db);
+    }
+}
diff --git a/libs/vdb/database-load.c b/libs/vdb/database-load.c
new file mode 100644
index 0000000..c36975e
--- /dev/null
+++ b/libs/vdb/database-load.c
@@ -0,0 +1,119 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define KONST const
+#define SKONST
+
+#include "database-priv.h"
+#include "dbmgr-priv.h"
+#include "schema-parse.h"
+
+#undef KONST
+#undef SKONST
+
+#include "schema-priv.h"
+#include "linker-priv.h"
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/meta.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * VDatabase
+ *  opaque connection to a database within file system
+ */
+
+
+/* LoadSchema
+ */
+
+rc_t VDatabaseLoadSchema ( VDatabase *self )
+{
+    /* try to get schema text */
+    const KMDataNode *node;
+    rc_t rc = KMetadataOpenNodeRead ( self -> meta, & node, "schema" );
+    if ( rc == 0 )
+    {
+        /* the node is probably within our 4K buffer,
+           but by using the callback mechanism we don't
+           have buffer or allocation issues. */
+        KMDataNodeSchemaFillData pb;
+        pb . node = node;
+        pb . pos = 0;
+        pb . add_v0 = false;
+
+        /* add in schema text. it is not mandatory, but it is
+           the design of the system to store object schema with
+           the object so that it is capable of standing alone */
+        rc = VSchemaParseTextCallback ( self -> schema,
+            "VDatabaseLoadSchema", KMDataNodeFillSchema, & pb );
+        if ( rc == 0 )
+        {
+            /* determine database type */
+            rc = KMDataNodeReadAttr ( node, "name",
+                pb . buff, sizeof pb . buff, & pb . pos );
+            if ( rc == 0 )
+            {
+                uint32_t type;
+                const SNameOverload *name;
+
+                /* find the sdb if possible */
+                self -> sdb = VSchemaFind ( self -> schema,
+                    & name, & type, pb . buff, "VDatabaseLoadSchema", false );
+
+                /* the schema must be found in this case */
+                if ( self -> sdb == NULL || type != eDatabase )
+                {
+                    self -> sdb = NULL;
+                    rc = RC ( rcVDB, rcDatabase, rcLoading, rcSchema, rcCorrupt );
+                    PLOGERR ( klogInt, ( klogInt, rc, "failed to establish database type from '$(expr)'",
+                                         "expr=%s", pb . buff ));
+                }
+            }
+        }
+
+        KMDataNodeRelease ( node );
+    }
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {
+        /* the database may be under creation */
+        if ( ! self -> read_only )
+            rc = 0;
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/database-priv.h b/libs/vdb/database-priv.h
new file mode 100644
index 0000000..ea40c06
--- /dev/null
+++ b/libs/vdb/database-priv.h
@@ -0,0 +1,150 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_database_priv_
+#define _h_database_priv_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_vdb_database_
+#include <vdb/database.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef KONST
+#define KONST
+#endif
+
+#ifndef SKONST
+#define SKONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VSchema;
+struct KDatabase;
+struct SDatabase;
+struct KMetadata;
+struct VDBManager;
+
+/*--------------------------------------------------------------------------
+ * VDatabase
+ *  interface to physical database
+ */
+struct VDatabase
+{
+    /* creating manager */
+    struct VDBManager KONST *mgr;
+
+    /* enclosing database - NULL OKAY */
+    KONST VDatabase *dad;
+
+    /* schema and db description */
+    struct VSchema SKONST *schema;
+    struct SDatabase const *sdb;
+
+    /* underlying physical layer database */
+    struct KDatabase KONST *kdb;
+
+    /* open database metadata */
+    struct KMetadata KONST *meta;
+
+    /* user data */
+    void *user;
+    void ( CC * user_whack ) ( void *data );
+#if 0
+    /* externally visible names */
+    BSTree scope;
+#endif
+    /* page size for creating columns */
+    size_t pgsize;
+
+    /* open references */
+    KRefcount refcount;
+
+    /* open mode */
+    bool read_only;
+
+    /* cache database id any */
+    KONST VDatabase *cache_db;
+};
+
+
+/* Whack
+ */
+rc_t CC VDatabaseWhack ( VDatabase *self );
+
+
+/* Attach
+ * Sever
+ *  internal reference management
+ */
+VDatabase *VDatabaseAttach ( const VDatabase *self );
+rc_t VDatabaseSever ( const VDatabase *self );
+
+
+/* Make
+ *  creates an initialized database object
+ *  expects either a mgr or a parent db,
+ *  enforces schema validity according to some rules,
+ */
+rc_t VDatabaseMake ( VDatabase **db,
+    struct VDBManager const *mgr,
+    const VDatabase *dad,
+    struct VSchema const *schema );
+
+
+/* LoadSchema
+ *  looks in metadata for stored schema
+ */
+rc_t VDatabaseLoadSchema ( VDatabase *self );
+
+/* StoreSchema
+ *  stores schema definition in metadata
+ */
+rc_t VDatabaseStoreSchema ( VDatabase *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_database_priv_ */
diff --git a/libs/vdb/database.c b/libs/vdb/database.c
new file mode 100644
index 0000000..1e52034
--- /dev/null
+++ b/libs/vdb/database.c
@@ -0,0 +1,29 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define KONST const
+#include "database-priv.h"
+#undef KONST
diff --git a/libs/vdb/dbmgr-cmn.c b/libs/vdb/dbmgr-cmn.c
new file mode 100644
index 0000000..d3f3c5f
--- /dev/null
+++ b/libs/vdb/dbmgr-cmn.c
@@ -0,0 +1,943 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+/* should match dbmgr.c and/or wdbmgr.c */
+
+#define KONST const
+#include "dbmgr-priv.h"
+#undef KONST
+
+#include "schema-priv.h"
+#include "linker-priv.h"
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+
+#include <vfs/manager.h> /* VFSManager */
+#include <vfs/manager-priv.h> /* VFSManagerSetResolver */
+
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/kdb-priv.h> /* KDBManagerGetVFSManager */
+#include <kdb/table.h>
+#include <kdb/meta.h>
+
+#include <kfg/config.h>
+#include <kfs/directory.h>
+#include <kfs/dyload.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#if 1
+#define DEBUG_PRINT( fmt, ... ) ( void ) 0
+#else
+#define DEBUG_PRINT(fmt, ...) fprintf(stderr, "%s - " fmt "\n", __func__, __VA_ARGS__)
+#endif
+
+/*--------------------------------------------------------------------------
+ * VDBManager
+ *  opaque handle to library
+ */
+
+/* Whack
+ */
+static
+rc_t VDBManagerWhack ( VDBManager *self )
+{
+    rc_t rc;
+
+    KRefcountWhack ( & self -> refcount, "VDBManager" );
+
+    rc = KDBManagerRelease ( self -> kmgr );
+    if ( rc == 0 )
+    {
+        /* release user data */
+        if ( self -> user != NULL && self -> user_whack != NULL )
+        {
+            ( * self -> user_whack ) ( self -> user );
+            self -> user = NULL;
+            self -> user_whack = NULL;
+        }
+
+        VSchemaRelease ( self -> schema );
+        VLinkerRelease ( self -> linker );
+        free ( self );
+        return 0;
+    }
+
+    KRefcountInit ( & self -> refcount, 1, "VDBManager", "whack", "vmgr" );
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC VDBManagerAddRef ( const VDBManager *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "VDBManager" ) )
+        {
+        case krefLimit:
+            return RC ( rcVDB, rcMgr, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VDBManagerRelease ( const VDBManager *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "VDBManager" ) )
+        {
+        case krefWhack:
+            return VDBManagerWhack ( ( VDBManager* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcMgr, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Attach
+ * Sever
+ *  internal reference management
+ */
+VDBManager *VDBManagerAttach ( const VDBManager *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "VDBManager" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( VDBManager* ) self;
+}
+
+rc_t VDBManagerSever ( const VDBManager *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "VDBManager" ) )
+        {
+        case krefWhack:
+            return VDBManagerWhack ( ( VDBManager* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcMgr, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC VDBManagerVWritable ( const VDBManager *self, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcMgr, rcAccessing, rcSelf, rcNull );
+    return KDBManagerVWritable ( self -> kmgr, path, args );
+}
+
+LIB_EXPORT rc_t CC VDBManagerWritable ( const VDBManager *self, const char *path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+
+    rc = VDBManagerVWritable ( self, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* AddSchemaIncludePath
+ *  add an include path to schema for locating input files
+ */
+LIB_EXPORT rc_t CC VDBManagerVAddSchemaIncludePath ( const VDBManager *self, const char *path, va_list args )
+{
+    if ( self != NULL )
+        return VSchemaVAddIncludePath ( self -> schema, path, args );
+
+    return RC ( rcVDB, rcMgr, rcUpdating, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC VDBManagerAddSchemaIncludePath ( const VDBManager *self, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = VDBManagerVAddSchemaIncludePath ( self, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* AddLoadLibraryPath
+ *  add a path[s] to loader for locating dynamic libraries
+ */
+LIB_EXPORT rc_t CC VDBManagerVAddLoadLibraryPath ( const VDBManager *self, const char *path, va_list args )
+{
+    if ( self != NULL )
+        return VLinkerVAddLoadLibraryPath ( self -> linker, path, args );
+
+    return RC ( rcVDB, rcMgr, rcUpdating, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC VDBManagerAddLoadLibraryPath ( const VDBManager *self, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = VDBManagerVAddLoadLibraryPath ( self, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* ConfigFromKfg
+ */
+static
+rc_t VDBManagerGetKfgPath ( const KConfig *kfg, const char *path, char *value, size_t value_size, size_t *num_read )
+{
+    /* open node */
+    const KConfigNode *node;
+    rc_t rc = KConfigOpenNodeRead ( kfg, & node, "%s", path );
+    if ( rc == 0 )
+    {
+        size_t remaining;
+        rc = KConfigNodeRead ( node, 0, value, value_size - 1, num_read, & remaining );
+        if ( rc == 0 )
+        {
+            if ( remaining != 0 )
+                rc = RC ( rcVDB, rcMgr, rcConstructing, rcPath, rcExcessive );
+            else if ( string_chr ( value, * num_read, '%' ) != NULL )
+                rc = RC ( rcVDB, rcMgr, rcConstructing, rcPath, rcInvalid );
+            else
+                value[*num_read] = '\0';
+        }
+
+        KConfigNodeRelease ( node );
+    }
+    return rc;
+}
+
+static
+rc_t VDBManagerConfigFromKfg ( VDBManager *self, bool update )
+{
+    size_t num_read;
+    char full [ 4096 ];
+
+    /* open configuration manager */
+    KConfig *kfg;
+    rc_t rc = KConfigMake ( & kfg, NULL );
+    if ( rc != 0 )
+        rc = 0;
+    else
+    {
+        /* look for load library paths */
+        rc = VDBManagerGetKfgPath ( kfg, update ?
+            "vdb/wmodule/paths": "vdb/module/paths",
+            full, sizeof full, & num_read );
+        if ( rc != 0 )
+            rc = 0;
+        else
+        {
+            /* split by ':' */
+            const char * path = full;
+            const char *colon = string_chr ( full, num_read, ':' );
+            while ( colon != NULL )
+            {
+                /* add path between "path" and "colon" */
+                rc = VDBManagerAddLoadLibraryPath ( self, "%.*s", ( int ) ( colon - path ), path );
+                if ( rc != 0 )
+                    break;
+                num_read -= ( colon - path ) - 1;
+                path = colon + 1;
+                colon = string_chr ( path, num_read, ':' );
+            }
+
+            /* add in last portion */
+            if ( rc == 0 && num_read != 0 )
+                rc = VDBManagerAddLoadLibraryPath ( self, "%.*s", ( int ) ( num_read ), path );
+        }
+
+        /* look for schema paths */
+        if ( rc == 0 )
+            rc = VDBManagerGetKfgPath ( kfg, "vdb/schema/paths", full, sizeof full, & num_read );
+        if ( rc != 0 )
+            rc = 0;
+        else
+        {
+            /* split by ':' */
+            const char * path = full;
+            const char *colon = string_chr ( full, num_read, ':' );
+            while ( colon != NULL )
+            {
+                /* add path between "path" and "colon" */
+                rc = VDBManagerAddSchemaIncludePath ( self, "%.*s", ( int ) ( colon - path ), path );
+                if ( rc != 0 )
+                {
+                    PLOGERR ( klogWarn, ( klogWarn, rc, "schema path '$(path)' was rejected",
+                                          "path=%.*s", ( int ) ( colon - path ), path ) );
+                    rc = 0;
+                }
+                num_read -= colon - path + 1;
+                path = colon + 1;
+                colon = string_chr ( path, num_read, ':' );
+            }
+
+            /* add in last portion */
+            if ( rc == 0 && num_read != 0 )
+            {
+                rc = VDBManagerAddSchemaIncludePath ( self, "%.*s", ( int ) ( num_read ), path );
+                if ( rc != 0 )
+                {
+                    PLOGERR ( klogWarn, ( klogWarn, rc, "schema path '$(path)' was rejected",
+                                          "path=%.*s", ( int ) num_read, path ) );
+                    rc = 0;
+                }
+            }
+        }
+
+        KConfigRelease ( kfg );
+    }
+
+    return rc;
+}
+
+/* ConfigFromLibPath
+ *  trace this library back to file system
+ *  attempt to locate relative paths
+ *  add them to library and schema path lists
+ */
+static
+rc_t VDBManagerConfigFromLibPath ( VDBManager *self, bool update )
+{
+    KDyld *dlmgr;
+    rc_t rc = KDyldMake ( & dlmgr );
+    if ( rc == 0 )
+    {
+        const KDirectory *home;
+        rc = KDyldHomeDirectory ( dlmgr, & home, ( fptr_t ) VDBManagerConfigPaths );
+        if ( rc == 0 )
+        {
+            char full [ 4096 ];
+
+            /* paths to modules */
+            const char *mod_paths [] =
+            {
+                "ncbi/mod",
+                "vdb/mod",
+                "../mod"
+            };
+            const char *wmod_paths [] =
+            {
+                "ncbi/wmod",
+                "vdb/wmod",
+                "../wmod"
+            };
+
+            /* paths to schema */
+            const char *schema_paths [] =
+            {
+                "ncbi/schema",
+                "vdb/schema",
+                "../schema"
+            };
+
+            /* test for a few possible module paths */
+            uint32_t i;
+            const char **paths = update ? wmod_paths : mod_paths;
+            for ( i = 0; rc == 0 && i < sizeof mod_paths / sizeof mod_paths [ 0 ]; ++ i )
+            {
+                uint32_t type = KDirectoryPathType ( home, "%s%u", paths [ i ], sizeof ( void* ) * 8 );
+                if ( ( type & ~ kptAlias ) == kptDir )
+                {
+                    /* add full path */
+                    rc = KDirectoryResolvePath ( home, true, full, sizeof full, "%s%u", paths [ i ], sizeof ( void* ) * 8 );
+                    if ( rc == 0 )
+                        rc = VDBManagerAddLoadLibraryPath ( self, "%s", full );
+                }
+            }
+
+            for ( i = 0; rc == 0 && i < sizeof mod_paths / sizeof mod_paths [ 0 ]; ++ i )
+            {
+                uint32_t type = KDirectoryPathType ( home, "%s", paths [ i ] );
+                if ( ( type & ~ kptAlias ) == kptDir )
+                {
+                    /* add full path */
+                    rc = KDirectoryResolvePath ( home, true, full, sizeof full, "%s", paths [ i ] );
+                    if ( rc == 0 )
+                        rc = VDBManagerAddLoadLibraryPath ( self, "%s", full );
+                }
+            }
+
+            for ( i = 0; rc == 0 && i < sizeof schema_paths / sizeof schema_paths [ 0 ]; ++ i )
+            {
+                uint32_t type = KDirectoryPathType ( home, "%s", schema_paths [ i ] );
+                if ( ( type & ~ kptAlias ) == kptDir )
+                {
+                    /* add full path */
+                    rc = KDirectoryResolvePath ( home, true, full, sizeof full, "%s", schema_paths [ i ] );
+                    if ( rc == 0 )
+                        rc = VDBManagerAddSchemaIncludePath ( self, "%s", full );
+                }
+            }
+
+            KDirectoryRelease ( home );
+        }
+
+        KDyldRelease ( dlmgr );
+    }
+    return rc;
+}
+
+/* ConfigPaths
+ *  looks for configuration information to set
+ *  include paths for schema parser and
+ *  load paths for linker
+ */
+rc_t VDBManagerConfigPaths ( VDBManager *self, bool update )
+{
+    rc_t rc = VDBManagerConfigFromKfg ( self, update );
+    if ( rc == 0 )
+        rc = VDBManagerConfigFromLibPath ( self, update );
+    return rc;
+}
+
+
+/* GetUserData
+ * SetUserData
+ *  store/retrieve an opaque pointer to user data
+ */
+LIB_EXPORT rc_t CC VDBManagerGetUserData ( const VDBManager *self, void **data )
+{
+    rc_t rc;
+
+    if ( data == NULL )
+        rc = RC ( rcVDB, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * data = self -> user;
+            return 0;
+        }
+
+        * data = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDBManagerSetUserData ( const VDBManager *cself,
+    void *data, void ( CC * destroy ) ( void *data ) )
+{
+    VDBManager *self = ( VDBManager* ) cself;
+    if ( cself == NULL )
+        return RC ( rcVDB, rcMgr, rcUpdating, rcSelf, rcNull );
+
+    self -> user = data;
+    self -> user_whack = destroy;
+
+    return 0;
+}
+
+/* OpenKDBManager
+ *  returns a new reference to KDBManager used by VDBManager
+ */
+LIB_EXPORT rc_t CC VDBManagerOpenKDBManagerRead ( const VDBManager *self, const KDBManager **kmgr )
+{
+    rc_t rc;
+
+    if ( kmgr == NULL )
+        rc = RC ( rcVDB, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> kmgr );
+            if ( rc == 0 )
+            {
+                * kmgr = self -> kmgr;
+                return 0;
+            }
+        }
+
+        * kmgr = NULL;
+    }
+
+    return rc;
+}
+
+
+static
+ver_t VDBManagerGetLoaderVersFromMeta ( const KMetadata * meta )
+{
+    const KMDataNode *node = NULL;
+    rc_t rc = KMetadataOpenNodeRead ( meta, & node, "SOFTWARE/loader" );
+    KMDataNodeRelease ( node );
+    if ( rc == 0 )
+    {
+        size_t num_read;
+        char vers_string [ 64 ];
+        rc = KMDataNodeReadAttr ( node, "vers", vers_string, sizeof vers_string, & num_read );
+        if ( rc == 0 )
+        {
+            char *end, *start = vers_string;
+            unsigned long maj = strtoul ( start, & end, 10 );
+
+            KMDataNodeRelease ( node );
+
+            if ( end > start && end [ 0 ] == '.' )
+            {
+                unsigned long min = strtoul ( start = end + 1, & end, 10 );
+                if ( end > start && end [ 0 ] == '.' )
+                {
+                    unsigned long rel = strtoul ( start = end + 1, & end, 10 );
+                    if ( end > start )
+                        return ( maj << 24 ) | ( min << 16 ) | rel;
+                }
+            }
+        }
+    }
+    return 0;
+}
+
+
+/* VDBManagerGetVersFromMeta
+ *  helper-function for VDBManagerGetObjVersion
+ */
+static
+ver_t VDBManagerGetVersFromMeta ( const KMetadata * meta, bool is_db )
+{
+    rc_t rc = 0;
+    uint32_t meta_vers;
+    const KMDataNode *node;
+
+    /* look for loader version as first clue */
+    ver_t version = VDBManagerGetLoaderVersFromMeta ( meta );
+    if ( VersionGetMajor ( version ) >= 2 ) {
+        return version;
+    }
+
+    /* was the run vdb-copied? */
+    rc = KMetadataOpenNodeRead ( meta, & node, "SOFTWARE/update" );
+    if ( rc == 0 ) {
+        KMDataNodeRelease ( node );
+        return 0x2000000;
+    }
+
+    /* If SOFTWARE/loader/@vers exists but SOFTWARE/update does not
+     * then return the former */
+    if ( version != 0 ) {
+        return version;
+    }
+
+    /* THE PRINCIPAL DESCRIPTION OF SOFTWARE VERSION
+       WAS NOT FOUND. USE HEURISTICS TO DETERMINE VERSION
+       FROM THIS POINT FORWARD. */
+
+    /* look at the version of the metadata file itself
+       metdata version 1 means pre-vdb, i.e. v0 */
+    rc = KMetadataVersion ( meta, & meta_vers );
+    if ( rc == 0 && meta_vers < 2 )
+        return 0;
+
+    /* assume all databases are v2 */
+    if ( is_db )
+        return 0x2000000;
+
+
+    /* AT THIS POINT, WE KNOW WE MUST HAVE A TABLE,
+       BUT WE DON'T HAVE PERFECT EVIDENCE OF VERSION,
+       SINCE THE SOFTWARE NODE IS NOT MANDATORY. */
+
+    /* if "schema" exists, it's v2 */
+    rc = KMetadataOpenNodeRead ( meta, & node, "schema" );
+    if ( rc == 0 )
+    {
+        KMDataNodeRelease ( node );
+        return 0x2000000;
+    }
+
+    /* if "col" exists, it's v1 */
+    rc = KMetadataOpenNodeRead ( meta, &node, "col" );
+    if ( rc == 0 )
+    {
+        KMDataNodeRelease ( node );
+        return 0x1000000;
+    }
+
+    /* appears to be v0 */
+    return 0;
+}
+
+
+/* VDBManagerGetObjVersion
+ *  returns the vdb-version of the given object
+ */
+LIB_EXPORT rc_t CC VDBManagerGetObjVersion ( const VDBManager *self, ver_t * version, const char *path )
+{
+    rc_t rc;
+
+    if ( version == NULL )
+        rc = RC ( rcVDB, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcAccessing, rcSelf, rcNull );
+        else if ( path == NULL )
+            rc = RC ( rcVDB, rcMgr, rcAccessing, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcMgr, rcAccessing, rcPath, rcEmpty );
+        else
+        {
+            const KTable *tbl;
+            const KDatabase *db;
+            const KMetadata *meta;
+
+            int path_type = KDBManagerPathType ( self -> kmgr, "%s", path ) & ~ kptAlias;
+            switch ( path_type )
+            {
+            case kptDatabase:
+                rc = KDBManagerOpenDBRead ( self -> kmgr, & db, "%s", path );
+                if ( rc == 0 )
+                {
+                    rc = KDatabaseOpenMetadataRead ( db, & meta );
+                    KDatabaseRelease ( db );
+                }
+                break;
+            case kptTable:
+                rc = KDBManagerOpenTableRead ( self -> kmgr, & tbl, "%s", path );
+                if ( rc == 0 )
+                {
+                    rc = KTableOpenMetadataRead ( tbl, & meta );
+                    KTableRelease ( tbl );
+                }
+                break;
+
+            case kptPrereleaseTbl:
+                * version = 0;
+                return 0;
+
+            default:
+                rc = RC ( rcVDB, rcMgr, rcAccessing, rcPath, rcIncorrect );
+            }
+
+            if ( rc == 0 )
+            {
+                * version = VDBManagerGetVersFromMeta ( meta, path_type == kptDatabase );
+                KMetadataRelease ( meta );
+                return 0;
+            }
+        }
+
+        * version = 0;
+    }
+
+    return rc;
+}
+
+/* VDBManagerGetObjModDate
+ *  returns the load/modification timestamp of the given object
+ */
+LIB_EXPORT rc_t CC VDBManagerGetObjModDate ( const VDBManager *self, KTime_t *timestamp, const char *path )
+{
+    rc_t rc;
+
+    if ( timestamp == NULL )
+        rc = RC ( rcVDB, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcAccessing, rcSelf, rcNull );
+        else if ( path == NULL )
+            rc = RC ( rcVDB, rcMgr, rcAccessing, rcPath, rcNull );
+        else if ( path [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcMgr, rcAccessing, rcPath, rcEmpty );
+        else
+        {
+            const KTable *tbl;
+            const KDatabase *db;
+            const KMetadata *meta;
+
+            int path_type = KDBManagerPathType ( self -> kmgr, "%s", path ) & ~ kptAlias;
+            switch ( path_type )
+            {
+            case kptDatabase:
+                rc = KDBManagerOpenDBRead ( self -> kmgr, & db, "%s", path );
+                if ( rc == 0 )
+                {
+                    rc = KDatabaseOpenMetadataRead ( db, & meta );
+                    KDatabaseRelease ( db );
+                }
+                break;
+            case kptTable:
+                rc = KDBManagerOpenTableRead ( self -> kmgr, & tbl, "%s", path );
+                if ( rc == 0 )
+                {
+                    rc = KTableOpenMetadataRead ( tbl, & meta );
+                    KTableRelease ( tbl );
+                }
+                break;
+
+            case kptPrereleaseTbl:
+                rc = 0;
+                * timestamp = 0;
+                meta = NULL;
+                break;
+
+            default:
+                rc = RC ( rcVDB, rcMgr, rcAccessing, rcPath, rcIncorrect );
+            }
+
+            if ( rc == 0 )
+            {
+                if ( meta != NULL )
+                {
+                    const KMDataNode *node;
+                    rc = KMetadataOpenNodeRead ( meta, & node, "LOAD/timestamp" );
+                    KMetadataRelease ( meta );
+                    if ( rc == 0 )
+                    {
+                        rc = KMDataNodeReadAsI64 ( node, timestamp );
+                        KMDataNodeRelease ( node );
+                        if ( rc == 0 )
+                            return 0;
+                    }
+                }
+
+                /* TBD - at this point our recourse is to check for
+                   the object's timestamp in the filesystem */
+            }
+        }
+
+        * timestamp = 0;
+    }
+
+    return rc;
+}
+
+/* ListExternalSchemaModules
+ */
+LIB_EXPORT rc_t CC VDBManagerListExternalSchemaModules ( const VDBManager *self, KNamelist **listp )
+{
+    rc_t rc;
+
+    if ( listp == NULL )
+        rc = RC ( rcVDB, rcMgr, rcListing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcListing, rcSelf, rcNull );
+        else
+        {
+            rc = VLinkerListExternalSchemaModules ( self -> linker, listp );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        * listp = NULL;
+    }
+
+    return rc;
+}
+
+
+/* PathType
+ *  check the path type of an object/directory path.
+ *
+ *  this is an extension of the KDirectoryPathType ( see <kdb/manager.h> )
+ *  and will return the KDirectory values if a path type is not specifically
+ *  a VDB or KDB object.
+ */
+LIB_EXPORT int CC VDBManagerPathType ( const VDBManager * self,
+    const char *path, ... )
+{
+    int type;
+
+    va_list args;
+    va_start ( args, path );
+
+    type = VDBManagerVPathType ( self, path, args );
+
+    va_end ( args );
+
+    return type;
+}
+
+LIB_EXPORT int CC VDBManagerVPathType ( const VDBManager * self,
+    const char *path, va_list args )
+{
+    if ( self != NULL )
+        return KDBManagerVPathType ( self -> kmgr, path, args );
+
+    return kptBadPath;
+}
+
+/** Reset VResolver to set protected repository context */
+LIB_EXPORT rc_t CC VDBManagerSetResolver
+    ( const VDBManager * self, struct VResolver * resolver )
+{
+    const KDBManager * kbd = NULL;
+    rc_t rc = VDBManagerGetKDBManagerRead ( self, & kbd );
+    if (rc == 0) {
+        VFSManager * vfs = NULL;
+        rc = KDBManagerGetVFSManager ( kbd, & vfs );
+        if (rc == 0) {
+            rc = VFSManagerSetResolver ( vfs, resolver );
+
+            VFSManagerRelease ( vfs );
+            vfs = NULL;
+        }
+
+        KDBManagerRelease ( kbd );
+        kbd = NULL;
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VDBManagerGetCacheRoot ( const struct VDBManager * self,
+    struct VPath const ** path )
+{
+    rc_t rc;
+    if ( path == NULL )
+        rc = RC ( rcVDB, rcMgr, rcListing, rcParam, rcNull );
+    else
+    {
+        * path = NULL;
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcListing, rcSelf, rcNull );
+        else
+        {
+            const KDBManager * kbd = NULL;
+            rc = VDBManagerGetKDBManagerRead ( self, & kbd );
+            if ( rc == 0 )
+            {
+                VFSManager * vfs = NULL;
+                rc = KDBManagerGetVFSManager ( kbd, & vfs );
+                if ( rc == 0 )
+                {
+                    rc = VFSManagerGetCacheRoot ( vfs, path );
+                    VFSManagerRelease ( vfs );
+                }
+                KDBManagerRelease ( kbd );
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VDBManagerSetCacheRoot ( const struct VDBManager * self,
+    struct VPath const * path )
+{
+    rc_t rc;
+    if ( path == NULL )
+        rc = RC ( rcVDB, rcMgr, rcSelecting, rcParam, rcNull );
+    else if ( self == NULL )
+        rc = RC ( rcVDB, rcMgr, rcSelecting, rcSelf, rcNull );
+    else
+    {
+        const KDBManager * kbd = NULL;
+        rc = VDBManagerGetKDBManagerRead ( self, & kbd );
+        if ( rc == 0 )
+        {
+            VFSManager * vfs = NULL;
+            rc = KDBManagerGetVFSManager ( kbd, & vfs );
+            if ( rc == 0 )
+            {
+                rc = VFSManagerSetCacheRoot ( vfs, path );
+                VFSManagerRelease ( vfs );
+            }
+            KDBManagerRelease ( kbd );
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VDBManagerDeleteCacheOlderThan ( const VDBManager * self,
+    uint32_t days )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcMgr, rcSelecting, rcSelf, rcNull );
+    else
+    {
+        const KDBManager * kbd = NULL;
+        rc = VDBManagerGetKDBManagerRead ( self, & kbd );
+        if ( rc == 0 )
+        {
+            VFSManager * vfs = NULL;
+            rc = KDBManagerGetVFSManager ( kbd, & vfs );
+            if ( rc == 0 )
+            {
+                rc = VFSManagerDeleteCacheOlderThan ( vfs, days );
+                VFSManagerRelease ( vfs );
+            }
+            KDBManagerRelease ( kbd );
+        }
+    }
+    return rc;
+}
diff --git a/libs/vdb/dbmgr-priv.h b/libs/vdb/dbmgr-priv.h
new file mode 100644
index 0000000..aa1b36b
--- /dev/null
+++ b/libs/vdb/dbmgr-priv.h
@@ -0,0 +1,115 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_dbmgr_priv_
+#define _h_dbmgr_priv_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_vdb_manager_
+#include <vdb/manager.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef KONST
+#define KONST
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDBManager;
+struct VSchema;
+struct VLinker;
+
+
+/*--------------------------------------------------------------------------
+ * VDBManager
+ *  handle to library
+ */
+struct VDBManager
+{
+    /* underlying physical layer manager */
+    struct KDBManager KONST *kmgr;
+
+    /* intrinsic schema elements */
+    struct VSchema *schema;
+
+    /* intrinsic functions */
+    struct VLinker *linker;
+
+    /* user data */
+    void *user;
+    void ( CC * user_whack ) ( void *data );
+
+    /* open references */
+    KRefcount refcount;
+};
+
+/* Attach
+ * Sever
+ *  internal reference management
+ */
+VDBManager *VDBManagerAttach ( const VDBManager *self );
+rc_t VDBManagerSever ( const VDBManager *self );
+
+
+/* ConfigPaths
+ *  looks for configuration information to set
+ *  include paths for schema parser and
+ *  load paths for linker
+ */
+rc_t VDBManagerConfigPaths ( VDBManager *self, bool update );
+
+
+/*--------------------------------------------------------------------------
+ * generic whackers
+ */
+void CC VectMbrWhack ( void *item, void *ignore );
+void CC BSTreeMbrWhack ( BSTNode *n, void *ignore );
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_dbmgr_priv_ */
diff --git a/libs/vdb/dbmgr.c b/libs/vdb/dbmgr.c
new file mode 100644
index 0000000..8ccb123
--- /dev/null
+++ b/libs/vdb/dbmgr.c
@@ -0,0 +1,157 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+/* should match dbmgr-cmn.c */
+
+#include "libvdb.vers.h"
+
+#define KONST const
+#include "dbmgr-priv.h"
+#undef KONST
+
+#include "schema-priv.h"
+#include "linker-priv.h"
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <kdb/kdb-priv.h> /* KDBManagerMakeReadWithVFSManager */
+#include <kdb/manager.h>
+#include <kfs/directory.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+/*--------------------------------------------------------------------------
+ * VDBManager
+ *  opaque handle to library
+ */
+
+
+/* MakeRead
+ * MakeReadWithVFSManager
+ *  create library handle for specific use
+ *  NB - only one of the functions will be implemented
+ *
+ *  "wd" [ IN, NULL OKAY ] - optional working directory for
+ *  accessing the file system. mgr will attach its own reference.
+ */
+LIB_EXPORT rc_t CC VDBManagerMakeRead ( const VDBManager **mgrp, const KDirectory *wd )
+{
+    return VDBManagerMakeReadWithVFSManager(mgrp, wd, NULL);
+}
+
+LIB_EXPORT rc_t CC VDBManagerMakeReadWithVFSManager ( const VDBManager ** mgrp,
+    const KDirectory *wd, struct VFSManager *vmgr )
+{
+    rc_t rc;
+
+    if ( mgrp == NULL )
+        rc = RC ( rcVDB, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        VDBManager *mgr = malloc ( sizeof * mgr );
+        if ( mgr == NULL )
+            rc = RC ( rcVDB, rcMgr, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KDBManagerMakeReadWithVFSManager ( & mgr -> kmgr, wd, vmgr );
+            if ( rc == 0 )
+            {
+                rc = VSchemaMakeIntrinsic ( & mgr -> schema );
+                if ( rc == 0 )
+                {
+                    rc = VLinkerMakeIntrinsic ( & mgr -> linker );
+                    if ( rc == 0 )
+                    {
+                        rc = VDBManagerConfigPaths ( mgr, false );
+                        if ( rc == 0 )
+                        {
+                            mgr -> user = NULL;
+                            mgr -> user_whack = NULL;
+                            KRefcountInit ( & mgr -> refcount, 1, "VDBManager", "make-read", "vmgr" );
+                            * mgrp = mgr;
+                            return 0;
+                        }
+
+                        VLinkerRelease ( mgr -> linker );
+                    }
+
+                    VSchemaRelease ( mgr -> schema );
+                }
+
+                KDBManagerRelease ( mgr -> kmgr );
+            }
+
+            free ( mgr );
+        }
+
+        * mgrp = NULL;
+    }
+    return rc;
+}
+
+
+/* MakeRsrc
+ *  common make, regardless of library
+ */
+LIB_EXPORT rc_t CC VDBManagerMakeRsrc ( VDBManager ** mgr, struct VFSManager * vfs )
+{
+    return VDBManagerMakeReadWithVFSManager ( ( const VDBManager** ) mgr, NULL, vfs );
+}
+
+
+/* Version
+ *  returns the library version
+ */
+LIB_EXPORT rc_t CC VDBManagerVersion ( const VDBManager *self, uint32_t *version )
+{
+    if ( version == NULL )
+        return RC ( rcVDB, rcMgr, rcAccessing, rcParam, rcNull );
+    if ( self == NULL )
+        return RC ( rcVDB, rcMgr, rcAccessing, rcSelf, rcNull );
+
+    * version = LIBVDB_VERS;
+    return 0;
+}
+
+
+/* RunPeriodicTasks
+ *  executes periodic tasks, such as cache flushing
+ */
+LIB_EXPORT rc_t CC VDBManagerRunPeriodicTasks ( const VDBManager *self )
+{
+    if ( self != NULL )
+        return KDBManagerRunPeriodicTasks ( self -> kmgr );
+
+    return RC ( rcVDB, rcMgr, rcExecuting, rcSelf, rcNull );
+}
diff --git a/libs/vdb/delta_average.c b/libs/vdb/delta_average.c
new file mode 100644
index 0000000..9905ba2
--- /dev/null
+++ b/libs/vdb/delta_average.c
@@ -0,0 +1,298 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <klib/rc.h>
+
+#include "xform-priv.h"
+#include "blob-priv.h"
+#include "blob-headers.h"
+#include "blob.h"
+#include "page-map.h"
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+
+
+/* Create
+ *
+ * Create a new blob.  A new data buffer is sized to
+ * 'element_count' * sizeof datatype; its contents are
+ * uninitialized.
+ */
+static
+rc_t VBlobCreateEncode ( VBlob **blobp, const VBlob *in, uint32_t max_rl_bytes,uint8_t *avg, uint32_t elem_bytes )
+{
+    rc_t rc = VBlobNew ( blobp, in -> start_id, in -> stop_id, "delta_average" );
+    if ( rc == 0 )
+    {
+        VBlob *blob = * blobp;
+        rc = PageMapAddRef ( in -> pm );
+	if(rc == 0) {
+		blob->pm = in -> pm ;
+		if(max_rl_bytes > 0){
+			rc = KDataBufferMake ( & blob -> data, in -> data . elem_bits, in -> data . elem_count );
+		} else {
+			rc = KDataBufferSub(&in->data, &blob->data, 0, UINT64_MAX);
+		}
+		if ( rc == 0 ){
+			rc = BlobHeadersCreateChild(in->headers, &blob->headers);
+			if ( rc == 0) {
+				VBlobHeader *hdr = BlobHeadersGetHdrWrite(blob->headers);
+				assert(hdr!=NULL);
+				if(hdr != 0){
+					int i;
+					VBlobHeaderSetVersion (hdr, 1);
+					rc = VBlobHeaderArgPushTail(hdr, max_rl_bytes);
+					assert(rc == 0);
+					rc = VBlobHeaderArgPushTail(hdr, elem_bytes);
+                                        assert(rc == 0);
+					for(i=0; i< max_rl_bytes; i++){
+						rc = VBlobHeaderOpPushTail(hdr,avg[i]);
+						assert(rc==0);
+					}
+					blob -> byte_order = in -> byte_order;
+					VBlobHeaderRelease(hdr);
+					return 0;
+				}
+			}
+		}
+		PageMapRelease( blob->pm);
+        }
+	VBlobRelease ( blob );
+        * blobp = NULL;
+    }
+    return rc;
+}
+
+static
+rc_t VBlobCreateDecode ( VBlob **blobp, const VBlob *in, uint32_t *max_rl_bytes,uint8_t **avg, uint32_t *elem_bytes)
+{
+    rc_t rc = VBlobNew ( blobp, in -> start_id, in -> stop_id, "undelta_average" );
+    if ( rc == 0 )
+    {
+        VBlob *blob = * blobp;
+        rc = PageMapAddRef ( in -> pm );
+	if(rc == 0) {
+		VBlobHeader *hdr;
+		blob->pm = in -> pm ;
+                blob->headers = (BlobHeaders *)BlobHeadersGetNextFrame(in->headers);
+		BlobHeadersAddRef(blob->headers);
+		hdr = BlobHeadersGetHeader(in->headers);
+		if(hdr || VBlobHeaderVersion(hdr)!=1) {
+			int64_t len;
+			int64_t eb;
+			rc = VBlobHeaderArgPopHead(hdr, &len);
+			if( rc == 0)
+				rc = VBlobHeaderArgPopHead(hdr, &eb);
+			if( rc == 0){
+				*max_rl_bytes=len;
+				*elem_bytes = eb;
+				if(len > 0){
+					rc = KDataBufferMake ( & blob -> data, in -> data . elem_bits, in -> data . elem_count );
+					if ( rc == 0){
+						*avg=malloc(len);
+						if(*avg){
+							int i;
+							for(i=0;i<len && rc == 0;i++){
+								rc = VBlobHeaderOpPopHead(hdr,(*avg)+i);
+							}
+							if(rc == 0){
+								VBlobHeaderRelease(hdr);
+								return 0;
+							} else {
+								rc =  RC(rcVDB, rcFunction, rcExecuting, rcHeader, rcCorrupt) ;
+							}
+						} else {
+							rc =  RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted) ;
+						}
+					}
+				} else {
+					rc = KDataBufferSub(&in->data, &blob->data, 0, UINT64_MAX);
+					if(rc == 0){
+						VBlobHeaderRelease(hdr);
+						return 0;
+					}
+				}
+				VBlobHeaderRelease(hdr);
+			} else {
+				rc =  RC(rcVDB, rcFunction, rcExecuting, rcHeader, rcCorrupt) ;
+			}
+		} else {
+			rc =  RC(rcVDB, rcFunction, rcExecuting, rcHeader, rcCorrupt) ;
+		}
+		PageMapRelease( blob->pm);
+        }
+	VBlobRelease ( blob );
+        * blobp = NULL;
+    }
+    return rc;
+}
+
+static
+rc_t CC undelta_average ( void *self, const VXformInfo *info, int64_t row_id,
+    VBlob **rslt, uint32_t argc, const VBlob *argv [] )
+{
+    uint32_t  max_rl_bytes = 0;
+    uint8_t   *avg = NULL;
+    uint32_t elem_bytes = 0;
+    /* input blob - schema assures us that it is ready to go */
+    const VBlob *in = argv [ 0 ];
+  /* allocate output blob of same size */
+    rc_t rc = VBlobCreateDecode ( rslt, in,&max_rl_bytes,&avg,&elem_bytes );
+    if(rc == 0 && max_rl_bytes > 0){
+	uint8_t *dst = (*rslt)->data.base; /** destination pointer **/
+	uint8_t *src = in -> data.base;
+	int	i,j,k;
+	PageMap *pm  = in->pm;
+
+	for(i=j=0,src = in -> data.base;i<pm->leng_recs;i++){
+                row_count_t leng_run=pm->leng_run[i];
+                elem_count_t len = pm->length[i];
+                assert(len<=max_rl_bytes);
+                while(leng_run > 0){
+                        for(k=0;k<len*elem_bytes;k++,src++,dst++){
+                                dst[0] = avg[k] - src[0]; /** symmetrical to encode **/
+                        }
+                        assert(leng_run >= (pm->data_run?pm->data_run[j]:1));
+                        leng_run -= pm->data_run?pm->data_run[j]:1;
+			j++;
+                }
+        }
+
+    }
+    if(avg) free(avg);
+    return rc;
+}
+
+VTRANSFACT_BUILTIN_IMPL ( vdb_undelta_average, 1, 0, 0 )
+    ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    VFUNCDESC_INTERNAL_FUNCS ( rslt ) -> bfN = undelta_average;
+    rslt -> variant = vftBlobN;
+    return 0;
+}
+
+static
+rc_t CC delta_average ( void *self, const VXformInfo *info, int64_t row_id,
+    VBlob **rslt, uint32_t argc, const VBlob *argv [] )
+{
+    rc_t rc;
+    /* input blob - schema assures us that it is ready to go */
+    const VBlob *in = argv [ 0 ];
+    const PageMap *pm = in->pm; 
+    uint8_t     *src;
+    elem_count_t   min_row_len,max_row_len;
+    uint64_t	/*min_rl_bytes,*/ max_rl_bytes;
+    uint32_t    *cnts;
+    uint32_t    elem_bytes;
+    int         i,j,k;
+    uint8_t	*avg=NULL;
+    uint64_t    sum_rle;
+    uint8_t	last;
+
+    if(pm->row_count < 256 || (in->data.elem_bits & 7)!=0){
+	return VBlobCreateEncode ( rslt, in, 0,NULL,0 );
+    }
+    elem_bytes = in->data.elem_bits >> 3;
+    PageMapRowLengthRange(pm,&min_row_len,&max_row_len);
+    if(max_row_len > 1024){
+	return VBlobCreateEncode ( rslt, in, 0,NULL,0 );
+    }
+
+    /*** rescale to bytes **/
+    /* min_rl_bytes = (min_row_len * in->data.elem_bits) >> 3; */
+    max_rl_bytes = (max_row_len * in->data.elem_bits) >> 3;
+
+    cnts=calloc(sizeof(*cnts),256*max_rl_bytes); /** computing counts of values **/
+    avg=malloc(max_rl_bytes);
+
+    /** collect sums and averages ***/
+    /** using tight loop instead of iterators **/
+    for(i=j=0,src = in -> data.base, sum_rle=0,last=0;i<pm->leng_recs;i++){
+	row_count_t leng_run=pm->leng_run[i];
+	elem_count_t len = pm->length[i];
+	assert(len<=max_rl_bytes);
+	while(leng_run > 0){
+		for(k=0;k<len*elem_bytes;k++,src++){
+			if(last==src[0]) sum_rle++;
+			cnts[256*k+src[0]]++;
+			last=src[0];
+		}
+		assert(leng_run >= (pm->data_run?pm->data_run[j]:1));
+		leng_run -= pm->data_run?pm->data_run[j]:1;
+		j++;
+	}
+    }
+    if(sum_rle * 10 > elem_bytes * in->data.elem_count * 3){/** total number of repetitions is high - leave it for zlib RLE ***/
+        free(cnts);
+        free(avg);
+        return VBlobCreateEncode(rslt,in,0,NULL,0);
+    }
+
+    for(i=0;i<max_rl_bytes;i++){
+	avg[i] = 0;
+	for(j=1;j<256;j++){
+		if(cnts[256*i+j] > cnts[256*i+avg[i]]){
+			avg[i]=j; 
+		}
+	}
+    }
+    rc = VBlobCreateEncode ( rslt, in, max_rl_bytes,avg,elem_bytes );
+    if (rc == 0 ){
+	uint8_t *dst = (*rslt)->data.base; /** destination pointer **/
+	for(i=j=0,src = in -> data.base;i<pm->leng_recs;i++){
+		row_count_t leng_run=pm->leng_run[i];
+		elem_count_t len = pm->length[i];
+		assert(len<=max_rl_bytes);
+		while(leng_run > 0){
+			for(k=0;k < len*elem_bytes;k++,src++,dst++){
+				dst[0] = avg[k] - src[0]; /** will do it in this direction **/
+			}
+			assert(leng_run >= (pm->data_run?pm->data_run[j]:1));
+			leng_run -= pm->data_run?pm->data_run[j]:1;
+			j++;
+		}
+	}
+     }
+    if(cnts) free(cnts);
+    if(avg)  free(avg);
+    return rc;
+}
+
+VTRANSFACT_BUILTIN_IMPL ( vdb_delta_average, 1, 0, 0 )
+    ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    VFUNCDESC_INTERNAL_FUNCS ( rslt ) -> bfN = delta_average;
+    rslt -> variant = vftBlobN;
+    return 0;
+}
diff --git a/libs/vdb/environment-read.c b/libs/vdb/environment-read.c
new file mode 100644
index 0000000..f1dddd0
--- /dev/null
+++ b/libs/vdb/environment-read.c
@@ -0,0 +1,108 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <vdb/vdb-priv.h>
+#include <sysalloc.h>
+
+#include "xform-priv.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+static
+rc_t CC environment_read_func(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+) {
+    const KDataBuffer *value = Self;
+    rc_t rc = 0;
+    
+    rslt->data->elem_bits = value->elem_bits;
+    rslt->data->elem_count = 0;
+    rc = KDataBufferResize(rslt->data, value->elem_count);
+    if (rc == 0) {
+        memmove(rslt->data->base, value->base, KDataBufferBytes(value));
+        rc = KDataBufferCast(rslt->data, rslt->data, rslt->elem_bits, true);
+        if (rc == 0)
+            rslt->elem_count = rslt->data->elem_count;
+    }
+    return rc;
+}
+
+static rc_t CC get_databuffer( KDataBuffer **rslt, const char *Name, size_t len ) {
+    char name[4096];
+    char *x;
+    rc_t rc;
+    
+    if (len >= sizeof(name))
+        return RC(rcVDB, rcFunction, rcConstructing, rcName, rcTooLong);
+    
+    memmove(name, Name, len);
+    name[len] = '\0';
+    
+    x = getenv(name);
+    rc = KDataBufferMake( *rslt, 8, (uint32_t)( len = strlen( x ) ) );
+    if (rc)
+        return rc;
+    memmove((**rslt).base, x, len);
+    return 0;
+}
+
+/* 
+ function utf8 environment:read #1.0 < ascii name > ();
+ */
+VTRANSFACT_BUILTIN_IMPL(environment_read, 1, 0, 0)
+    (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp
+) {
+    rc_t rc;
+    KDataBuffer *value;
+            
+    rc = get_databuffer(&value, cp->argv[0].data.ascii, cp->argv[0].count);
+    if (rc == 0) {
+        rslt->self = value;
+        rslt->whack = (void (*)(void *))KDataBufferWhack;
+        
+        rslt->variant = vftRow;
+        rslt->u.rf = environment_read_func;
+    }
+
+	return rc;
+}
diff --git a/libs/vdb/fixed-row-len.c b/libs/vdb/fixed-row-len.c
new file mode 100644
index 0000000..440a10c
--- /dev/null
+++ b/libs/vdb/fixed-row-len.c
@@ -0,0 +1,67 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include "prod-priv.h"
+#include "xform-priv.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+
+static
+rc_t CC fixed_row_len_func ( void *self, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData in[] )
+{
+    assert ( rslt -> data -> elem_bits == 32 );
+    if ( rslt -> data -> elem_count == 0 )
+    {
+        rc_t rc = KDataBufferResize ( rslt -> data, 1 );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    * ( uint32_t* ) rslt -> data -> base = VProductionFixedRowLength ( info -> prod, row_id, true );
+    rslt -> elem_count = 1;
+
+    return 0;
+}
+
+VTRANSFACT_BUILTIN_IMPL ( vdb_fixed_row_len, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> variant = vftRow;
+    rslt -> u . rf = fixed_row_len_func;
+    return 0;
+}
diff --git a/libs/vdb/gen-cast.pl b/libs/vdb/gen-cast.pl
new file mode 100644
index 0000000..07d2b97
--- /dev/null
+++ b/libs/vdb/gen-cast.pl
@@ -0,0 +1,480 @@
+#!perl -w
+#/*===========================================================================
+#*
+#*                            PUBLIC DOMAIN NOTICE
+#*               National Center for Biotechnology Information
+#*
+#*  This software/database is a "United States Government Work" under the
+#*  terms of the United States Copyright Act.  It was written as part of
+#*  the author's official duties as a United States Government employee and
+#*  thus cannot be copyrighted.  This software/database is freely available
+#*  to the public for use. The National Library of Medicine and the U.S.
+#*  Government have not placed any restriction on its use or reproduction.
+#*
+#*  Although all reasonable efforts have been taken to ensure the accuracy
+#*  and reliability of the software and data, the NLM and the U.S.
+#*  Government do not and cannot warrant the performance or results that
+#*  may be obtained by using this software or data. The NLM and the U.S.
+#*  Government disclaim all warranties, express or implied, including
+#*  warranties of performance, merchantability or fitness for any particular
+#*  purpose.
+#*
+#*  Please cite the author in any work or product based on this material.
+#*
+#* ===========================================================================
+#*
+#*/
+# gen-cast.pl
+
+my $type = [
+    { size =>  8, integer => 1, signed => 1, ctype => 'int8_t', minimum => 'INT8_MIN', maximum => 'INT8_MAX' },
+    { size => 16, integer => 1, signed => 1, ctype => 'int16_t', minimum => 'INT16_MIN', maximum => 'INT16_MAX' },
+    { size => 32, integer => 1, signed => 1, ctype => 'int32_t', minimum => 'INT32_MIN', maximum => 'INT32_MAX' },
+    { size => 64, integer => 1, signed => 1, ctype => 'int64_t', minimum => 'INT64_MIN', maximum => 'INT64_MAX' },
+    { size =>  8, integer => 1, signed => 0, ctype => 'uint8_t', minimum => '0', maximum => 'UINT8_MAX' },
+    { size => 16, integer => 1, signed => 0, ctype => 'uint16_t', minimum => '0', maximum => 'UINT16_MAX' },
+    { size => 32, integer => 1, signed => 0, ctype => 'uint32_t', minimum => '0', maximum => 'UINT32_MAX' },
+    { size => 64, integer => 1, signed => 0, ctype => 'uint64_t', minimum => '0', maximum => 'UINT64_MAX' },
+    { size => 32, integer => 0, signed => 1, ctype => 'float', minimum => '(-FLT_MAX)', maximum => 'FLT_MAX' },
+    { size => 64, integer => 0, signed => 1, ctype => 'double', minimum => '(-DBL_MAX)', maximum => 'DBL_MAX' },
+];
+
+sub type_name {
+    my $i = shift;
+    
+    return ($type->[$i]{'integer'} ? ($type->[$i]{'signed'} ? 'I' : 'U') : 'F') . $type->[$i]{'size'};
+}
+
+sub func_name {
+    my ($i, $j) = (shift, shift);
+    
+    return $i == $j ? 'copy' : 'cast_' . type_name($i) . '_to_' . type_name($j);
+}
+
+print <<EOD;
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <vdb/types.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <limits.h>
+#include <float.h>
+#include <string.h>
+
+#include <assert.h>
+
+typedef struct self_t {
+    VTypedesc src;
+    VTypedesc dst;
+} self_t;
+
+static rc_t copy(
+    void *Self,
+    const VXformInfo *info,
+    void *dst,
+    const void *src,
+    uint32_t num_elements
+) {
+    const self_t *self = Self;
+    memmove(dst, src, ((size_t)num_elements * self->src.intrinsic_bits * self->src.intrinsic_dim + 7) >> 3);
+    return 0;
+}
+
+EOD
+
+for (my $i = 0; $i != scalar(@$type); ++$i) {
+    for (my $j = 0; $j != scalar(@$type); ++$j) {
+        my $name;
+        my $stype = $type->[$i]{'ctype'}; # source c type
+        my $dtype = $type->[$j]{'ctype'}; # dest. c type
+        my $intrm = $stype;
+        my $lbc; # lower bounds check
+        my $ubc; # upper bounds check
+        
+        next if ($j == $i);
+        $name = func_name($i, $j);
+
+        if ($type->[$i]{'integer'} == $type->[$j]{'integer'}) {
+            if ($type->[$i]{'signed'} == $type->[$j]{'signed'}) {
+                if ($type->[$i]{'size'} > $type->[$j]{'size'}) {
+                    $lbc = "(($intrm)($type->[$j]{'minimum'}))" if ($type->[$i]{'signed'});
+                    $ubc = "(($intrm)($type->[$j]{'maximum'}))";
+                }
+                goto PRINT_FUNC;
+            }
+            if ($type->[$i]{'signed'}) {
+                # signed to unsigned
+                $lbc = ' 0';
+                $ubc = "(($intrm)($type->[$j]{'maximum'}))" if ($type->[$i]{'size'} > $type->[$j]{'size'});
+                goto PRINT_FUNC;
+            }
+            # unsigned to signed
+            $ubc = "(($intrm)($type->[$j]{'maximum'}))" if ($type->[$i]{'size'} >= $type->[$j]{'size'});
+            goto PRINT_FUNC;
+        }
+        if ($type->[$i]{'integer'}) {
+            #int -> float
+            goto PRINT_FUNC if ($type->[$i]{'size'} < 64);
+            if ($type->[$j]{'size'} < 64) {
+                $intrm = 'double';
+                $lbc = "(($intrm)($type->[$j]{'minimum'}))";
+                $ubc = "(($intrm)($type->[$j]{'maximum'}))";
+            }
+            goto PRINT_FUNC;
+        }
+        $lbc = $type->[$j]{'signed'} ? "(($intrm)($type->[$j]{'minimum'}))" : ' 0.0';
+        $ubc = "(($intrm)($type->[$j]{'maximum'}))";
+        goto PRINT_FUNC if ($type->[$j]{'size'} < 64);
+        $intrm = 'double';
+        $lbc = $type->[$j]{'signed'} ? "(($intrm)($type->[$j]{'minimum'}))" : ' 0.0';
+        $ubc = "(($intrm)($type->[$j]{'maximum'}))";
+        
+PRINT_FUNC:
+        if ($lbc || $ubc) {
+            if ($lbc && $ubc) {
+                print <<EOD;
+static rc_t $name(
+    void *Self,
+    const VXformInfo *info,
+    void *Dst,
+    const void *Src,
+    uint32_t num_elements
+) {
+    const self_t *self = Self;
+    const unsigned N = num_elements * self->src.intrinsic_dim;
+    const $stype *src = Src;
+    $dtype *dst = Dst;
+    unsigned i;
+    
+    for (i = 0; i != N; ++i) {
+        $intrm y = src[i];
+        
+        if ($lbc > y || y > $ubc)
+            return RC(rcVDB, rcFunction, rcExecuting, rcRange, rcExcessive);
+
+        dst[i] = y;
+    }
+    return 0;
+}
+
+EOD
+            }
+            else {
+                if ($lbc) {
+                    print <<EOD;
+static rc_t $name(
+    void *Self,
+    const VXformInfo *info,
+    void *Dst,
+    const void *Src,
+    uint32_t num_elements
+) {
+    const self_t *self = Self;
+    const unsigned N = num_elements * self->src.intrinsic_dim;
+    const $stype *src = Src;
+    $dtype *dst = Dst;
+    unsigned i;
+    
+    for (i = 0; i != N; ++i) {
+        $intrm y = src[i];
+        
+        if ($lbc > y)
+            return RC(rcVDB, rcFunction, rcExecuting, rcRange, rcExcessive);
+
+        dst[i] = y;
+    }
+    return 0;
+}
+
+EOD
+                }
+                else {
+                    print <<EOD;
+static rc_t $name(
+    void *Self,
+    const VXformInfo *info,
+    void *Dst,
+    const void *Src,
+    uint32_t num_elements
+) {
+    const self_t *self = Self;
+    const unsigned N = num_elements * self->src.intrinsic_dim;
+    const $stype *src = Src;
+    $dtype *dst = Dst;
+    unsigned i;
+    
+    for (i = 0; i != N; ++i) {
+        $intrm y = src[i];
+        
+        if (y > $ubc)
+            return RC(rcVDB, rcFunction, rcExecuting, rcRange, rcExcessive);
+
+        dst[i] = y;
+    }
+    return 0;
+}
+
+EOD
+                }
+            }
+        }
+        else {
+            print <<EOD;
+static rc_t $name(
+    void *Self,
+    const VXformInfo *info,
+    void *Dst,
+    const void *Src,
+    uint32_t num_elements
+) {
+    const self_t *self = Self;
+    const unsigned N = num_elements * self->src.intrinsic_dim;
+    const $stype *src = Src;
+    $dtype *dst = Dst;
+    unsigned i;
+    
+    for (i = 0; i != N; ++i)
+        dst[i] = src[i];
+
+    return 0;
+}
+
+EOD
+        }
+    }
+}
+
+print 'static const VArrayFunc funcs[' . scalar(@$type) . '][' . scalar(@$type) . '] = {' . "\n";
+for (my $i = 0; $i != scalar(@$type); ++$i) {
+    my @x;
+    
+    for (my $j = 0; $j != scalar(@$type); ++$j) {
+        push @x, func_name($i, $j);
+    }
+    print "\t{ " . join(', ', @x) . "},\n";
+}
+print <<EOD;
+};
+
+static int desc_to_number(const VTypedesc *desc) {
+    switch (desc->domain) {
+    case vtdInt:
+        switch (desc->intrinsic_bits) {
+        case 8:
+            return 0;
+        case 16:
+            return 1;
+        case 32:
+            return 2;
+        case 64:
+            return 3;
+        }
+        break;
+    case vtdUint:
+        switch (desc->intrinsic_bits) {
+        case 8:
+            return 4;
+        case 16:
+            return 5;
+        case 32:
+            return 6;
+        case 64:
+            return 7;
+        }
+        break;
+    case vtdFloat:
+        switch (desc->intrinsic_bits) {
+        case 32:
+            return 8;
+        case 64:
+            return 9;
+        }
+        break;
+    }
+    return -1;
+}
+
+static rc_t cast_to_ascii(
+    void *Self,
+    const VXformInfo *info,
+    int64_t row_id,
+    VRowResult *rslt,
+    uint32_t argc,
+    const VRowData argv[]
+) {
+    const self_t *self = Self;
+    rc_t rc;
+    uint32_t intrm;
+    unsigned i;
+    int j;
+    unsigned k;
+    
+    rc = KDataBufferResize(rslt->data, argv[0].u.data.element_count);
+    if (rc)
+        return rc;
+    
+    for (i = 0, k = 0; k != argv[0].u.data.element_count && i < argv[0].u.data.element_count; ++k) {
+        j = 1;
+        switch (self->src.intrinsic_bits) {
+        case 8:
+            j = utf8_utf32(&intrm, ((const char *)argv[0].u.data.base) + i, ((const char *)argv[0].u.data.base) + argv[0].u.data.element_count);
+            if (j == 0)
+                return RC(rcVDB, rcFunction, rcExecuting, rcData, rcInsufficient);
+            if (j < 0)
+                return RC(rcVDB, rcFunction, rcExecuting, rcData, rcInvalid);
+            break;
+        case 16:
+            intrm = ((const uint16_t *)argv[0].u.data.base)[i];
+            break;
+        case 32:
+            intrm = ((const uint32_t *)argv[0].u.data.base)[i];
+            break;
+        }
+        ((char *)rslt->data->base)[k] = intrm < 128 ? (char)intrm : '.';
+        i += j;
+    }
+    rslt->element_count = k;
+    return 0;
+}
+
+
+static rc_t cast_to_unicode(
+    void *Self,
+    const VXformInfo *info,
+    int64_t row_id,
+    VRowResult *rslt,
+    uint32_t argc,
+    const VRowData argv[]
+) {
+    const self_t *self = Self;
+    rc_t rc;
+    uint32_t intrm;
+    unsigned i;
+    int j;
+    unsigned k;
+    
+    rc = KDataBufferResize(rslt->data, argv[0].u.data.element_count + 8);
+    if (rc)
+        return rc;
+    
+    for (i = 0, k = 0; i != argv[0].u.data.element_count; ) {
+        if (k + 8 >= rslt->data->elem_count) {
+            rc = KDataBufferResize(rslt->data, rslt->data->elem_count << 1);
+            if (rc)
+                return rc;
+        }
+        j = 1;
+        switch (self->src.intrinsic_bits) {
+        case 8:
+            if (self->src.domain == vtdAscii)
+                intrm = ((const char *)argv[0].u.data.base)[i];
+            else {
+                j = utf8_utf32(&intrm, ((const char *)argv[0].u.data.base) + i, ((const char *)argv[0].u.data.base) + argv[0].u.data.element_count);
+                if (j == 0)
+                    return RC(rcVDB, rcFunction, rcExecuting, rcData, rcInsufficient);
+                if (j < 0)
+                    return RC(rcVDB, rcFunction, rcExecuting, rcData, rcInvalid);
+            }
+            break;
+        case 16:
+            intrm = ((const uint16_t *)argv[0].u.data.base)[i];
+            break;
+        case 32:
+            intrm = ((const uint32_t *)argv[0].u.data.base)[i];
+            break;
+        }
+        i += j;
+        j = 1;
+        switch (self->dst.intrinsic_bits) {
+        case 8:
+            j = utf32_utf8(((char *)rslt->data->base) + k, ((char *)rslt->data->base) + k + 8, intrm);
+            assert(j > 0);
+            break;
+        case 16:
+            ((uint16_t *)rslt->data->base)[k] = intrm < 0x10000 ? intrm : '.';
+            break;
+        case 32:
+            ((uint32_t *)rslt->data->base)[k] = intrm;
+            break;
+        }
+        k += j;
+    }
+    rslt->element_count = k;    
+    return 0;
+}
+
+/* 
+ */
+VTRANSFACT_IMPL(vdb_cast, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+    self_t *self;
+    
+    self = malloc(sizeof(self_t));
+    if (self) {
+        int i = 0;
+        int j = 0;
+        
+        rslt->self = self;
+        rslt->whack = free;
+        
+        self->src = dp->argv[0].desc;
+        self->dst = info->fdesc.desc;
+        
+        i = desc_to_number(&self->src);
+        j = desc_to_number(&self->dst);
+        
+        if (i >= 0 && j >= 0) {
+            rslt->variant = vftArray;
+            rslt->u.af = funcs[i][j];
+            
+            return 0;
+        }
+        if ((self->dst.domain == vtdAscii || self->dst.domain == vtdUnicode) && (self->src.domain == vtdAscii || self->src.domain == vtdUnicode)) {
+            rslt->variant = vftRow;
+            rslt->u.rf = self->dst.domain == vtdAscii ? cast_to_ascii : cast_to_unicode;
+            
+            return 0;
+        }
+        rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        free(self);
+    }
+    else
+        rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    return rc;
+}
+EOD
+
+__END__
diff --git a/libs/vdb/index_insert.c b/libs/vdb/index_insert.c
new file mode 100644
index 0000000..dfd248d
--- /dev/null
+++ b/libs/vdb/index_insert.c
@@ -0,0 +1,150 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#include <sra/sradb.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <vdb/vdb.h>
+#include <kdb/index.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+struct self_t {
+    KIndex *ndx;
+    char *key_buf;
+    size_t key_buf_size;
+    uint8_t case_sensitivity;
+};
+
+/*
+ function utf8 idx:text:insert #1.1 < ascii index_name, * U8 case_sensitivity > ( utf8 key );
+ */
+
+static
+rc_t CC index_insert( void *Self, const VXformInfo *info, int64_t row_id,
+                       VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    struct self_t *self = Self;
+    rc_t rc;
+    const char *x;
+    char skey[4096];
+    char *key = skey;
+    uint32_t key_len;
+    bool return_key = false;
+
+    rslt -> elem_count = 0;
+
+    x = argv [ 0 ] . u . data . base;
+    key_len = argv [ 0 ] . u . data . elem_count;
+    x += argv [ 0 ] . u . data . first_elem;
+    
+    if (key_len + 1 >= sizeof(skey)) {
+        if (key_len + 1 >= self->key_buf_size) {
+            void *temp = realloc(self->key_buf, key_len + 1);
+            if (temp == NULL)
+                return RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            self->key_buf = temp;
+            self->key_buf_size = key_len + 1;
+        }
+        key = self->key_buf;
+    }
+    switch (self->case_sensitivity) {
+        case CASE_SENSITIVE:
+            memmove(key, x, key_len);
+            break;
+        case CASE_INSENSITIVE_LOWER:
+            tolower_copy(key, sizeof skey, x, key_len);
+            return_key = string_cmp(key, key_len, x, key_len, key_len) != 0;
+            break;
+        case CASE_INSENSITIVE_UPPER:
+            toupper_copy(key, sizeof skey, x, key_len);
+            return_key = string_cmp(key, key_len, x, key_len, key_len) != 0;
+            break;
+        default:
+            assert(false);
+    }
+    key[key_len] = 0;
+
+    /* attempt to insert into index */
+    rc = KIndexInsertText ( self->ndx, false, key, row_id );
+    if ( rc != 0 || return_key )
+    {
+        /* insert failed for whatever reason - return key */
+        rc = KDataBufferResize ( rslt -> data, key_len );
+        if ( rc != 0 )
+            return rc;
+        memmove ( rslt -> data -> base, x, key_len );
+        
+        rslt -> elem_count = key_len;
+    }
+    
+    return 0;
+}    
+
+static void CC self_whack(void *Self) {
+    struct self_t *self = Self;
+    KIndexRelease(self->ndx);
+    if (self->key_buf)
+        free(self->key_buf);
+    free(Self);
+}
+
+VTRANSFACT_IMPL ( idx_text_insert, 1, 1, 0 ) ( const void *Self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    struct self_t *self;
+    
+    self = malloc(sizeof(*self));
+    if (self) {
+        rc_t rc;
+        
+        rc = VTableCreateIndex ( ( VTable* ) info -> tbl, &self->ndx, kitText | kitProj, kcmOpen,
+                                "%.*s", cp->argv[0].count, cp->argv[0].data.ascii );
+        if( rc == 0 ) {
+            rslt->self = self;
+            rslt->whack = self_whack;
+            rslt->variant = vftNonDetRow;
+            rslt->u.ndf = index_insert;
+            self->key_buf = NULL;
+            self->key_buf_size = 0;
+            self->case_sensitivity = cp->argc >= 2 ? *cp->argv[1].data.u8 : CASE_SENSITIVE;
+            return 0;
+        }
+        free(self);
+        return rc;
+    }
+    else
+        return RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
diff --git a/libs/vdb/index_lookup.c b/libs/vdb/index_lookup.c
new file mode 100644
index 0000000..56a894e
--- /dev/null
+++ b/libs/vdb/index_lookup.c
@@ -0,0 +1,191 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "blob.h"
+#include "blob-headers.h"
+#include "page-map.h"
+#include "blob-priv.h"
+#include "xform-priv.h"
+
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+#include <vdb/vdb.h>
+#include <kdb/index.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/pbstree.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <assert.h>
+
+typedef struct tag_self_t {
+    const       KIndex *ndx;
+    char        query_key[1024];
+    uint32_t    query_key_len;
+    const struct VCursorParams * parms;
+    uint32_t    elem_bits;
+    uint8_t     case_sensitivity;
+} self_t;
+
+static void CC self_whack( void *Self )
+{
+    self_t *self = Self;
+    
+    KIndexRelease( self->ndx );
+    free( self );
+}
+
+
+static
+rc_t CC index_lookup_impl(
+                          void *Self,
+                          const VXformInfo *info,
+                          int64_t row_id,
+                          VRowResult *rslt,
+                          uint32_t argc,
+                          const VRowData argv[]
+                          )
+{
+    rc_t rc;
+    const self_t *self = Self;
+    KDataBuffer *query_buf = NULL;
+    
+    rslt->elem_count = 0;
+    rslt->no_cache = 1;
+    
+    rc = VCursorParamsGet(self->parms, self->query_key, &query_buf);
+    if (GetRCState(rc) == rcNotFound && GetRCObject(rc) == rcName) {
+        rc = KDataBufferResize(rslt->data, 0);
+        return rc;
+    }
+    if (rc == 0) {
+        char  squery[4096];
+        char *hquery = NULL;
+        char *query = squery;
+        uint64_t id_count;
+        int64_t start_id;
+        
+        if (query_buf->elem_count >= sizeof(squery)) {
+            hquery = malloc(query_buf->elem_count + 1);
+            if (hquery == NULL)
+                return RC(rcVDB, rcIndex, rcReading, rcMemory, rcExhausted);
+            query = hquery;
+        }
+        switch (self->case_sensitivity) {
+            case CASE_SENSITIVE:
+                memmove(query, query_buf->base, query_buf->elem_count);
+                break;
+            case CASE_INSENSITIVE_LOWER:
+                tolower_copy(query, sizeof squery, query_buf->base, query_buf->elem_count);
+                break;
+            case CASE_INSENSITIVE_UPPER:
+                toupper_copy(query, sizeof squery, query_buf->base, query_buf->elem_count);
+                break;
+            default:
+                assert(false);
+        }
+        query[query_buf->elem_count] = '\0';
+        rc = KIndexFindText(self->ndx, query, &start_id, &id_count,NULL,NULL);
+        if (hquery)
+            free(hquery);
+        if (rc == 0) {
+            rc = KDataBufferResize ( rslt -> data, 1 );
+            if( rc == 0) {
+                int64_t *out = rslt -> data->base;
+                
+                out[0] = start_id;
+                out[1] = start_id + id_count - 1;
+
+                rslt -> elem_count = 1;
+                rslt -> no_cache = 1; /***** This row should never be cached **/
+            }
+        }
+    }
+    return rc;
+}
+
+/*
+ * function vdb:row_id_range  idx:text:lookup #1.1 < ascii index_name , ascii query_by_name, * U8 case_sensitivity > ();
+ */
+VTRANSFACT_BUILTIN_IMPL(idx_text_lookup, 1, 1, 0) (
+                                           const void *Self,
+                                           const VXfactInfo *info,
+                                           VFuncDesc *rslt,
+                                           const VFactoryParams *cp,
+                                           const VFunctionParams *dp
+) {
+    rc_t rc;
+    const KIndex *ndx;
+    KIdxType type;
+    
+    rc = VTableOpenIndexRead(info->tbl, &ndx, "%.*s", (int)cp->argv[0].count, cp->argv[0].data.ascii);
+    if ( rc != 0 )
+    {
+        if ( GetRCState ( rc ) != rcNotFound )
+            PLOGERR (klogErr, (klogErr, rc, "Failed to open index '$(index)'", "index=%.*s", (int)cp->argv[0].count, cp->argv[0].data.ascii));
+        return rc;
+    }
+    
+    rc = KIndexType(ndx, &type);
+    if (rc == 0) {
+        if (type == kitProj + kitText) {
+            self_t *self;
+            
+            self = malloc(sizeof(*self));
+            if (self) {
+                self->ndx = ndx;
+                self->elem_bits = VTypedescSizeof(&info->fdesc.desc);
+                memmove(self->query_key,cp->argv[1].data.ascii,cp->argv[1].count);
+                self->query_key_len = cp->argv[1].count;
+                self->query_key[self->query_key_len] = '\0';
+                self->parms = info->parms;
+                self->case_sensitivity = cp->argc >= 3 ? *cp->argv[2].data.u8 : CASE_SENSITIVE;
+                
+                rslt->self = self;
+                rslt->whack = self_whack;
+                rslt->variant = vftNonDetRow;
+                rslt->u.ndf = index_lookup_impl;
+                return 0;
+            }
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+        }
+        else
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcIndex, rcIncorrect);
+    }
+    KIndexRelease(ndx);
+    return rc;
+}
diff --git a/libs/vdb/index_project.c b/libs/vdb/index_project.c
new file mode 100644
index 0000000..422f386
--- /dev/null
+++ b/libs/vdb/index_project.c
@@ -0,0 +1,221 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "blob.h"
+#include "blob-headers.h"
+#include "page-map.h"
+#include "blob-priv.h"
+#include "xform-priv.h"
+
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <vdb/vdb.h>
+#include <kdb/index.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <assert.h>
+
+typedef struct tag_self_t {
+    const KIndex *ndx;
+    uint32_t elem_bits;
+    uint8_t case_sensitivity;
+} self_t;
+
+static void CC self_whack( void *Self )
+{
+    self_t *self = Self;
+    
+    KIndexRelease( self->ndx );
+    free( self );
+}
+
+#include <stdio.h>
+
+static
+rc_t CC index_project_impl(
+                            void *Self,
+                            const VXformInfo *info,
+                            int64_t row_id,
+                            VBlob **rslt,
+                            uint32_t argc, const VBlob *argv[]
+) {
+    rc_t rc;
+    const self_t *self = Self;
+    KDataBuffer temp_buff;
+    uint64_t id_count;
+    int64_t start_id;
+    int64_t empty_row_id_start = -1;
+    int64_t empty_row_id_count = -1;
+    size_t sz = 1023;
+    bool attached_to_col = argc > 0 && argv[0] != NULL;
+    
+    /* first try to load value from the column. if returned blob is empty or row is not found, go to index */
+    if ( attached_to_col ) {
+        /*** this types of blobs may have holes in them ***/
+        rc = VBlobSubblob(argv[0],rslt,row_id );
+        if (rc != 0) {
+            if (GetRCState(rc) == rcEmpty && GetRCObject(rc) == rcRow) {
+                empty_row_id_start = row_id;
+                empty_row_id_count = 1;
+            }
+            else {
+                return rc;
+            }
+        }
+        else if ((*rslt)->data.elem_count > 0) {
+            return rc;
+        }
+        else {
+            empty_row_id_start = (*rslt)->start_id;
+            empty_row_id_count = (*rslt)->stop_id - (*rslt)->start_id + 1;
+            
+            TRACK_BLOB( VBlobRelease, *rslt );
+            (void)VBlobRelease( *rslt );
+        }
+
+        assert(empty_row_id_count >= 1);
+    }
+
+    rc = KDataBufferMakeBytes( &temp_buff, sz + 1 );
+    if ( rc != 0 )
+        return rc;
+
+    for ( ; ; ) {
+        rc = KIndexProjectText(self->ndx, row_id, &start_id, &id_count, temp_buff.base, temp_buff.elem_count, &sz);
+        if ((GetRCState(rc) == rcNotFound && GetRCObject(rc) == rcId) || sz==0 ){
+            if ( !attached_to_col )
+                rc = RC(rcVDB, rcFunction, rcExecuting, rcRow, rcNotFound);
+            else
+            {
+                // return an empty row, but we don't know how many empty rows
+                // are there, since even row_id+1 may have a key stored in index
+                rc = 0;
+                sz = 0;
+                start_id = row_id;
+                id_count = 1;
+            }
+
+            break;
+        }
+        if ( GetRCState( rc ) == rcInsufficient && GetRCObject( rc ) == (enum RCObject)rcBuffer )
+        {
+            rc = KDataBufferResize ( &temp_buff, (uint32_t)( sz + 1 ) );
+            if (rc == 0) {
+                continue;
+            }
+        }
+        
+        // When in case_sensitivity mode is case insensitive, index does not accurately represent actual values,
+        // as we still store key in a column when it differs from what we inserted into index
+        if (self->case_sensitivity != CASE_SENSITIVE && attached_to_col)
+        {
+            if ( start_id < empty_row_id_start )
+            {
+                id_count -= empty_row_id_start - start_id;
+                start_id = empty_row_id_start;
+            }
+
+            if ( start_id + id_count > empty_row_id_start + empty_row_id_count )
+            {
+                id_count = empty_row_id_start + empty_row_id_count - start_id;
+            }
+        }
+        break;
+    }
+
+    if ( rc == 0 )
+    {
+        /* it seems old index returns length including \0 so we have to adjust */
+        while (sz > 0 && ((char *)temp_buff.base)[sz - 1] == '\0')
+            --sz;
+
+        // now we know real size of the data, lets set in data buffer too
+        assert ( temp_buff.elem_count >= sz );
+        if ( temp_buff.elem_count != sz )
+            rc = KDataBufferResize ( &temp_buff, (uint32_t)( sz ) );
+    }
+
+    if (rc == 0)
+    {
+        rc = VBlobCreateFromSingleRow ( rslt, start_id, start_id + id_count - 1, &temp_buff, vboNative );
+    }
+
+    KDataBufferWhack(&temp_buff);
+    return rc;
+}
+
+VTRANSFACT_BUILTIN_IMPL(idx_text_project, 1, 1, 1) (
+                                           const void *Self,
+                                           const VXfactInfo *info,
+                                           VFuncDesc *rslt,
+                                           const VFactoryParams *cp,
+                                           const VFunctionParams *dp
+) {
+    rc_t rc;
+    const KIndex *ndx;
+    KIdxType type;
+    
+    rc = VTableOpenIndexRead(info->tbl, &ndx, "%.*s", (int)cp->argv[0].count, cp->argv[0].data.ascii);
+    if ( rc != 0 )
+    {
+        if ( GetRCState ( rc ) != rcNotFound )
+            PLOGERR (klogErr, (klogErr, rc, "Failed to open index '$(index)'", "index=%.*s", (int)cp->argv[0].count, cp->argv[0].data.ascii));
+        return rc;
+    }
+    
+    rc = KIndexType(ndx, &type);
+    if (rc == 0) {
+        if (type == kitProj + kitText) {
+            self_t *self;
+            
+            self = malloc(sizeof(*self));
+            if (self) {
+                self->ndx = ndx;
+                self->elem_bits = VTypedescSizeof(&info->fdesc.desc);
+                self->case_sensitivity = cp->argc >= 2 ? *cp->argv[1].data.u8 : CASE_SENSITIVE;
+                rslt->self = self;
+                rslt->whack = self_whack;
+                rslt->variant = vftBlobN;
+                VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = index_project_impl;
+                return 0;
+            }
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+        }
+        else
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcIndex, rcIncorrect);
+    }
+    KIndexRelease(ndx);
+    return rc;
+}
diff --git a/libs/vdb/libvdb.vers.h b/libs/vdb/libvdb.vers.h
new file mode 100644
index 0000000..734f137
--- /dev/null
+++ b/libs/vdb/libvdb.vers.h
@@ -0,0 +1,27 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define LIBVDB_VERS 0x02070016
diff --git a/libs/vdb/linker-cmn.c b/libs/vdb/linker-cmn.c
new file mode 100644
index 0000000..728a51a
--- /dev/null
+++ b/libs/vdb/linker-cmn.c
@@ -0,0 +1,656 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+
+#include "linker-priv.h"
+#include "schema-priv.h"
+#include "dbmgr-priv.h"
+
+#include <kfs/directory.h>
+#include <kfs/dyload.h>
+#include <kfs/kfs-priv.h>
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * LFactory
+ *  describes an external C function factory
+ */
+
+/* Whack
+ */
+void CC LFactoryWhack ( void *item, void *ignore )
+{
+    LFactory *self = item;
+
+    /* whack the guy's factory object */
+    if ( self -> desc . whack != NULL )
+        ( * self -> desc . whack ) ( self -> desc . fself );
+
+    /* douse the dynamic library */
+    KSymAddrRelease ( self -> addr );
+
+    /* gone */
+    free ( self );
+}
+
+
+/*--------------------------------------------------------------------------
+ * LSpecial
+ *  describes an external C table recognition function
+ */
+
+/* Whack
+ */
+void CC LSpecialWhack ( void *item, void *ignore )
+{
+    LSpecial *self = item;
+    KSymAddrRelease ( self -> addr );
+    free ( self );
+}
+
+
+/*--------------------------------------------------------------------------
+ * VLinker
+ */
+
+/* Whack
+ */
+static
+rc_t CC VLinkerWhack ( VLinker *self )
+{
+    KRefcountWhack ( & self -> refcount, "VLinker" );
+
+    VectorWhack ( & self -> fact, LFactoryWhack, NULL );
+    VectorWhack ( & self -> special, LSpecialWhack, NULL );
+    BSTreeWhack ( & self -> scope, KSymbolWhack, NULL );
+
+    KDyldRelease ( self -> dl );
+    VLinkerSever ( self -> dad );
+
+    free ( self );
+
+    return 0;
+}
+
+
+/* StartIdx
+ *  returns starting index
+ */
+#define VLinkerStartIdx( dad, vect, starting ) \
+    ( ( ( dad ) == NULL ) ? ( starting ) : \
+      ( VectorStart ( & ( dad ) -> vect ) + \
+        VectorLength ( & ( dad ) -> vect ) ) )
+
+/* VectorInit
+ *  performs vector initialization
+ */
+#define VLinkerVectorInit( linker, dad, vect, starting, block ) \
+    VectorInit ( & ( linker ) -> vect, VLinkerStartIdx ( dad, vect, starting ), block )
+
+/* Make
+ *  creates an empty linker
+ */
+rc_t VLinkerMake ( VLinker **lp, const VLinker *dad, struct KDyld *dl )
+{
+    rc_t rc;
+
+    VLinker *linker = malloc ( sizeof * linker );
+    if ( linker == NULL )
+        return RC ( rcVDB, rcMgr, rcConstructing, rcMemory, rcExhausted );
+
+    rc = KDyldAddRef ( linker -> dl = dl );
+    if ( rc == 0 )
+    {
+        linker -> dad = VLinkerAttach ( dad );
+        BSTreeInit ( & linker -> scope );
+
+        VLinkerVectorInit ( linker, dad, fact, 1, 64 );
+        VLinkerVectorInit ( linker, dad, special, 1, 8 );
+
+        KRefcountInit ( & linker -> refcount, 1, "VLinker", "make", "vld" );
+    
+        * lp = linker;
+        return 0;
+    }
+
+    free ( linker );
+    return rc;
+}
+
+/* Release
+ */
+rc_t VLinkerRelease ( const VLinker *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "VLinker" ) )
+        {
+        case krefWhack:
+            return VLinkerWhack ( ( VLinker* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcMgr, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Attach
+ * Sever
+ */
+VLinker *VLinkerAttach ( const VLinker *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "VLinker" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( VLinker* ) self;
+}
+
+rc_t VLinkerSever ( const VLinker *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "VLinker" ) )
+        {
+        case krefWhack:
+            return VLinkerWhack ( ( VLinker* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcMgr, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* AddLoadLibraryPath
+ *  add a path[s] to loader for locating dynamic libraries
+ */
+rc_t VLinkerVAddLoadLibraryPath ( const VLinker *self, const char *path, va_list args )
+{
+    if ( self != NULL )
+        return KDyldVAddSearchPath ( self -> dl, path, args );
+
+    return RC ( rcVDB, rcMgr, rcUpdating, rcSelf, rcNull );
+}
+
+
+/* Open
+ *  opens libraries for search
+ */
+rc_t VLinkerOpen ( const VLinker *self, struct KDlset **libs )
+{
+    rc_t rc = KDyldMakeSet ( self -> dl, libs );
+    if ( rc == 0 )
+    {
+        KDlset *set = * libs;
+
+        rc = KDlsetAddAll ( set );
+        if ( rc == 0 )
+            return 0;
+
+        KDlsetRelease ( set );
+        * libs = NULL;
+    }
+    return rc;
+}
+
+
+/* EnterIntoScope
+ *  pushes linker symbol tables into scope
+ */
+static
+rc_t CC VLinkerEnterIntoScope ( const VLinker *self, KSymTable *tbl )
+{
+    rc_t rc;
+
+    if ( self -> dad == NULL )
+        rc = KSymTableInit ( tbl, NULL );
+    else
+        rc = VLinkerEnterIntoScope ( self -> dad, tbl );
+
+    if ( rc == 0 )
+        rc = KSymTablePushScope ( tbl, & ( ( VLinker* ) self ) -> scope );
+
+    return rc;
+}
+
+
+/* MakeFQN
+ */
+static
+size_t CC VLinkerMakeFQN ( char *buffer, size_t bsize, const KSymbol *name )
+{
+    size_t sz = 0;
+
+    if ( name -> dad != NULL )
+    {
+        sz = VLinkerMakeFQN ( buffer, bsize, name -> dad );
+        if ( sz < bsize )
+            buffer [ sz ++ ] = '_';
+    }
+
+    if ( sz < bsize )
+    {
+        sz += string_copy ( & buffer [ sz ], bsize - sz,
+            name -> name . addr, name -> name . size );
+    }
+
+    return sz;
+}
+
+/* ScanFactory
+ *  scans code modules for all named entrypoints
+ *  compares version numbers, retaining the highest
+ *  that satisfies stated functional interface
+ */
+typedef struct VLinkerFactoryMatchData VLinkerFactoryMatchData;
+struct VLinkerFactoryMatchData
+{
+    VTransDesc desc;
+    uint32_t version;
+};
+
+static
+bool CC VLinkerBestMatch ( const KSymAddr *sym, void *data )
+{
+    VLinkerFactoryMatchData *pb = data;
+
+    rc_t rc;
+    VTransDesc desc;
+
+    rc_t ( CC * f ) ( VTransDesc* );
+    KSymAddrAsFunc ( sym, ( fptr_t* ) & f );
+
+    memset ( & desc, 0, sizeof desc );
+    rc = ( * f ) ( & desc );
+    if ( rc == 0 )
+    {
+        /* we don't actually expect to see two versions
+           of a factory at all, much less with the same
+           major interface version */
+        uint32_t maj = desc . itf_version >> 24;
+        if ( maj != 0 && maj == ( pb -> desc . itf_version >> 24 ) )
+        {
+            /* TBD - issue warning */
+        }
+
+        /* prototype should have been declared with a version,
+           but if not, then any version will do */
+        if ( pb -> version == 0 ||
+             ( maj == ( pb -> version >> 24 ) &&
+               desc . itf_version >= pb -> version ) )
+        {
+            /* accept latest version */
+            if ( desc . itf_version > pb -> desc . itf_version )
+            {
+                pb -> desc = desc;
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+static
+rc_t VLinkerScanFactory ( VLinker *self, const KDlset *libs,
+    KSymTable *tbl, const KSymbol **symp, const KSymbol *name,
+    uint32_t version )
+{
+    rc_t rc;
+
+    /* convert schema fqn into legal C identifier */
+    char fqn [ 1024 ];
+    size_t sz = VLinkerMakeFQN ( fqn, sizeof fqn, name );
+    if ( sz >= sizeof fqn )
+        rc = RC ( rcVDB, rcMgr, rcResolving, rcName, rcExcessive );
+    else
+    {
+        KSymAddr *entrypoint;
+        VLinkerFactoryMatchData pb;
+        memset ( & pb, 0, sizeof pb );
+        pb . version = version;
+
+        /* ask loader to locate fqn in library search path */
+        rc = KDlsetLastSymbol ( libs, & entrypoint,
+            fqn, VLinkerBestMatch, & pb );
+        if ( rc == 0 )
+        {
+            /* allocate factory object */
+            LFactory *fact = malloc ( sizeof * fact );
+            if ( fact == NULL )
+                rc = RC ( rcVDB, rcMgr, rcResolving, rcMemory, rcExhausted );
+            else
+            {
+                /* give it the exact schema name */
+                rc = KSymTableDupSymbol ( tbl,
+                    ( KSymbol** ) & fact -> name, name, ltFactory, fact );
+                if ( rc == 0 )
+                {
+                    /* finally, insert the symbol into our vector */
+                    rc = VectorAppend ( & self -> fact, & fact -> id, fact );
+                    if ( rc == 0 )
+                    {
+                        /* done */
+                        fact -> addr = entrypoint;
+                        fact -> desc = pb . desc;
+                        fact -> external = true;
+                        * symp = fact -> name;
+                        return 0;
+                    }
+
+                    KSymTableRemoveSymbol ( tbl, fact -> name );
+                }
+
+                free ( fact );
+            }
+
+            KSymAddrRelease ( entrypoint );
+        }
+    }
+
+    return rc;
+}
+
+/* ScanSpecial
+ *  scans code modules for the first named entrypoint
+ */
+static
+rc_t CC VLinkerScanSpecial ( VLinker *self, const KDlset *libs,
+    KSymTable *tbl, const KSymbol **symp, const KSymbol *name, uint32_t type )
+{
+    rc_t rc;
+
+    /* convert schema fqn into legal C identifier */
+    char fqn [ 1024 ];
+    size_t sz = VLinkerMakeFQN ( fqn, sizeof fqn, name );
+    if ( sz >= sizeof fqn )
+        rc = RC ( rcVDB, rcMgr, rcResolving, rcName, rcExcessive );
+    else
+    {
+        /* ask loader to locate fqn in open library set */
+        KSymAddr *entrypoint;
+        rc = KDlsetSymbol ( libs, & entrypoint, fqn );
+        if ( rc == 0 )
+        {
+            /* allocate special function object */
+            LSpecial *special = malloc ( sizeof * special );
+            if ( special == NULL )
+                rc = RC ( rcVDB, rcMgr, rcResolving, rcMemory, rcExhausted );
+            else
+            {
+                special -> func = NULL;
+
+                /* give it the exact schema name */
+                rc = KSymTableDupSymbol ( tbl,
+                    ( KSymbol** ) & special -> name, name, type, special );
+                if ( rc == 0 )
+                {
+                    /* finally, insert the symbol into our vector */
+                    rc = VectorAppend ( & self -> special, & special -> id, special );
+                    if ( rc == 0 )
+                    {
+                        /* done */
+                        special -> addr = entrypoint;
+                        * symp = special -> name;
+                        return 0;
+                    }
+
+                    KSymTableRemoveSymbol ( tbl, special -> name );
+                }
+
+                free ( special );
+            }
+
+            KSymAddrRelease ( entrypoint );
+        }
+    }
+
+    return rc;
+}
+
+/* Find
+ *  find a named symbol
+ *
+ *  "func" [ OUT ] - return parameter for func pointer
+ *
+ *  "proto" [ IN ] - function prototype from schema
+ *  "min_version" [ IN ] - minimum version to accept
+ *
+ *  "external" [ OUT ] - tells whether factory is built-in or external
+ */
+rc_t VLinkerFindFactory ( VLinker *self, const KDlset *libs,
+    VTransDesc *desc, const SFunction *proto, uint32_t min_version, bool *external )
+{
+    KSymTable tbl;
+    rc_t rc = VLinkerEnterIntoScope ( self, & tbl );
+    if ( rc == 0 )
+    {
+        /* factory name if explicit */
+        const KSymbol *sym, *name = proto -> u . ext . fact;
+
+        /* use simple function name as implicit factory name */
+        if ( name == NULL )
+            name = proto -> name;
+
+        /* look for the symbol by name -
+           factory names do not support version overloading */
+        sym = KSymTableFindSymbol ( & tbl, name );
+
+        /* if not found, search for best match */
+        if ( sym == NULL )
+        {
+            rc = VLinkerScanFactory ( self, libs, & tbl, & sym, name, proto -> version );
+            if ( rc != 0 && min_version != proto -> version )
+                rc = VLinkerScanFactory ( self, libs, & tbl, & sym, name, min_version );
+        }
+
+        /* otherwise ensure the found name is in fact a factory */
+        else if ( sym -> type != ltFactory )
+            rc = RC ( rcVDB, rcMgr, rcResolving, rcName, rcIncorrect );
+
+        /* examine results */
+        if ( rc == 0 )
+        {
+            const LFactory *fact = sym -> u . obj;
+
+            /* test for incompatible version */
+            if ( ( fact -> desc . itf_version >> 24 ) != ( min_version >> 24 ) )
+                rc = RC ( rcVDB, rcMgr, rcResolving, rcInterface, rcIncorrect );
+            else if ( fact -> desc . itf_version < min_version )
+                rc = RC ( rcVDB, rcMgr, rcResolving, rcInterface, rcIncorrect );
+            else
+            {
+                * desc = fact -> desc;
+                * external = fact -> external;
+            }
+        }
+
+        KSymTableWhack ( & tbl );
+    }
+    return rc;
+}
+
+static
+void CC VLinkerNameWhackSymbol ( KSymbol *sym )
+{
+    if ( sym != NULL )
+    {
+        VLinkerNameWhackSymbol ( sym -> dad );
+        free ( sym );
+    }
+}
+
+static
+KSymbol *VLinkerNameToSymbol ( String *name )
+{
+    KSymbol *sym, *dad = NULL;
+    const char *end = string_rchr ( name -> addr, name -> size, ':' );
+    if ( end != 0 )
+    {
+        String sub;
+        StringSubstr ( name, & sub, 0, string_len ( name -> addr, end - name -> addr ) );
+        dad = VLinkerNameToSymbol ( & sub );
+        if ( dad == NULL )
+            return NULL;
+
+        BSTreeInit ( & dad -> u . scope );
+
+        name -> addr += sub . size + 1;
+        name -> size -= sub . size + 1;
+        name -> len -= sub . len + 1;
+    }
+
+    sym = malloc ( sizeof * sym );
+    if ( sym == NULL )
+    {
+        VLinkerNameWhackSymbol ( dad );
+        return NULL;
+    }
+
+    sym -> u . obj = NULL;
+    sym -> dad = dad;
+    sym -> name = * name;
+    sym -> type = 0;
+
+    if ( dad != NULL )
+        BSTreeInsert ( & dad -> u . scope, & sym -> n, KSymbolSort );
+
+    return sym;
+}
+
+rc_t VLinkerFindNamedFactory ( VLinker *self, const KDlset *libs,
+    VTransDesc *desc, const char *fact_name )
+{
+    KSymTable tbl;
+    rc_t rc = VLinkerEnterIntoScope ( self, & tbl );
+    if ( rc == 0 )
+    {
+        KSymbol *name;
+        const KSymbol *sym;
+
+        String str;
+        StringInitCString ( & str, fact_name );
+        name = VLinkerNameToSymbol ( & str );
+
+        /* look for the symbol by name -
+           factory names do not support version overloading */
+        sym = KSymTableFindSymbol ( & tbl, name );
+        
+        /* if not found, search for best match */
+        if ( sym == NULL )
+            rc = VLinkerScanFactory ( self, libs, & tbl, & sym, name, 0 );
+
+        /* otherwise ensure the found name is in fact a factory */
+        else if ( sym -> type != ltFactory )
+            rc = RC ( rcVDB, rcMgr, rcResolving, rcName, rcIncorrect );
+
+        VLinkerNameWhackSymbol ( name );
+
+        /* examine results */
+        if ( rc == 0 )
+        {
+            const LFactory *fact = sym -> u . obj;
+            * desc = fact -> desc;
+        }
+
+        KSymTableWhack ( & tbl );
+    }
+    return rc;
+}
+
+
+rc_t VLinkerFindUntyped ( VLinker *self, const KDlset *libs,
+    VUntypedTableTest *func, const SFunction *proto )
+{
+    KSymTable tbl;
+    rc_t rc = VLinkerEnterIntoScope ( self, & tbl );
+    if ( rc == 0 )
+    {
+        /* untyped functions do not have factories */
+        const KSymbol *sym = KSymTableFindSymbol ( & tbl, proto -> name );
+
+        /* if not found, search for it */
+        if ( sym == NULL )
+            rc = VLinkerScanSpecial ( self, libs, & tbl, & sym, proto -> name, ltUntyped );
+
+        /* otherwise ensure the found name is in fact untyped */
+        else if ( sym -> type != ltUntyped )
+            rc = RC ( rcVDB, rcMgr, rcResolving, rcName, rcIncorrect );
+
+        /* return results */
+        if ( rc == 0 )
+        {
+            const LSpecial *untyped = sym -> u . obj;
+            if ( untyped -> addr == NULL )
+                * func = untyped -> func;
+            else
+                KSymAddrAsFunc ( untyped -> addr, ( fptr_t* ) func );
+        }
+
+        KSymTableWhack ( & tbl );
+    }
+    return rc;
+}
+
+
+/* ListExternalSchemaModules
+ */
+rc_t VLinkerListExternalSchemaModules ( const VLinker *self, struct KNamelist **listp )
+{
+    rc_t rc;
+
+    assert ( listp != NULL );
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcDylib, rcListing, rcSelf, rcNull );
+    else
+    {
+        KDlset *libs;
+        rc = VLinkerOpen ( self, & libs );
+        if ( rc == 0 )
+        {
+            rc = KDlsetList ( libs, listp );
+            KDlsetRelease ( libs );
+        }
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/linker-int.c b/libs/vdb/linker-int.c
new file mode 100644
index 0000000..48672f2
--- /dev/null
+++ b/libs/vdb/linker-int.c
@@ -0,0 +1,679 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "linker-priv.h"
+#include "schema-parse.h"
+#include "xform-priv.h"
+
+#include <kfs/dyload.h>
+#include <klib/token.h>
+#include <klib/symtab.h>
+#include <klib/symbol.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <byteswap.h>
+#include <assert.h>
+
+extern VTRANSFACT_DECL ( vdb_cast );
+extern VTRANSFACT_DECL ( vdb_redimension );
+extern VTRANSFACT_DECL ( vdb_row_id );
+extern VTRANSFACT_DECL ( vdb_row_len );
+extern VTRANSFACT_DECL ( vdb_fixed_row_len );
+extern VTRANSFACT_DECL ( vdb_compare );
+extern VTRANSFACT_DECL ( vdb_no_compare );
+extern VTRANSFACT_DECL ( vdb_range_validate );
+extern VTRANSFACT_DECL ( vdb_merge );
+extern VTRANSFACT_DECL ( vdb_split );
+extern VTRANSFACT_DECL ( vdb_transpose );
+extern VTRANSFACT_DECL ( vdb_detranspose );
+extern VTRANSFACT_DECL ( vdb_delta_average );
+extern VTRANSFACT_DECL ( vdb_undelta_average );
+extern VTRANSFACT_DECL ( meta_read );
+extern VTRANSFACT_DECL ( meta_value );
+extern VTRANSFACT_DECL ( meta_attr_read );
+extern VTRANSFACT_DECL ( idx_text_project );
+extern VTRANSFACT_DECL ( idx_text_lookup );
+extern VTRANSFACT_DECL ( parameter_read );
+extern VTRANSFACT_DECL ( environment_read );
+
+/* newly imported things */
+extern VTRANSFACT_DECL ( ALIGN_align_restore_read );
+extern VTRANSFACT_DECL ( ALIGN_cigar );
+extern VTRANSFACT_DECL ( ALIGN_cigar_2 );
+extern VTRANSFACT_DECL ( ALIGN_generate_has_mismatch );
+extern VTRANSFACT_DECL ( ALIGN_generate_mismatch );
+extern VTRANSFACT_DECL ( ALIGN_generate_mismatch_qual );
+extern VTRANSFACT_DECL ( ALIGN_project_from_sequence );
+extern VTRANSFACT_DECL ( ALIGN_raw_restore_read );
+extern VTRANSFACT_DECL ( ALIGN_ref_restore_read );
+extern VTRANSFACT_DECL ( ALIGN_ref_sub_select );
+extern VTRANSFACT_DECL ( ALIGN_seq_restore_read );
+extern VTRANSFACT_DECL ( ALIGN_seq_restore_linkage_group );
+extern VTRANSFACT_DECL ( INSDC_SEQ_rand_4na_2na );
+extern VTRANSFACT_DECL ( INSDC_SRA_format_spot_name );
+extern VTRANSFACT_DECL ( INSDC_SRA_format_spot_name_no_coord );
+extern VTRANSFACT_DECL ( NCBI_SRA_ABI_tokenize_spot_name );
+extern VTRANSFACT_DECL ( NCBI_SRA_Helicos_tokenize_spot_name );
+extern VTRANSFACT_DECL ( NCBI_SRA_Illumina_tokenize_spot_name );
+extern VTRANSFACT_DECL ( NCBI_SRA_IonTorrent_tokenize_spot_name );
+extern VTRANSFACT_DECL ( NCBI_SRA_GenericFastq_tokenize_spot_name );
+extern VTRANSFACT_DECL ( NCBI_SRA__454__dynamic_read_desc );
+extern VTRANSFACT_DECL ( NCBI_SRA__454__process_position );
+extern VTRANSFACT_DECL ( NCBI_SRA__454__tokenize_spot_name );
+extern VTRANSFACT_DECL ( NCBI_SRA_bio_start );
+extern VTRANSFACT_DECL ( NCBI_SRA_bio_end );
+extern VTRANSFACT_DECL ( NCBI_SRA_decode_CLIP );
+extern VTRANSFACT_DECL ( NCBI_SRA_decode_INTENSITY );
+extern VTRANSFACT_DECL ( NCBI_SRA_decode_NOISE );
+extern VTRANSFACT_DECL ( NCBI_SRA_decode_POSITION );
+extern VTRANSFACT_DECL ( NCBI_SRA_decode_QUALITY );
+extern VTRANSFACT_DECL ( NCBI_SRA_decode_READ );
+extern VTRANSFACT_DECL ( NCBI_SRA_decode_SIGNAL );
+extern VTRANSFACT_DECL ( NCBI_SRA_denormalize );
+extern VTRANSFACT_DECL ( NCBI_SRA_extract_coordinates );
+extern VTRANSFACT_DECL ( NCBI_SRA_extract_name_coord );
+extern VTRANSFACT_DECL ( NCBI_SRA_fix_read_seg );
+extern VTRANSFACT_DECL ( NCBI_SRA_linker_from_readn );
+extern VTRANSFACT_DECL ( NCBI_SRA_lookup );
+extern VTRANSFACT_DECL ( NCBI_SRA_make_position );
+extern VTRANSFACT_DECL ( NCBI_SRA_make_read_desc );
+extern VTRANSFACT_DECL ( NCBI_SRA_make_spot_desc );
+extern VTRANSFACT_DECL ( NCBI_SRA_normalize );
+#if HAVE_PREFIX_TREE_TO_NAME
+extern VTRANSFACT_DECL ( NCBI_SRA_prefix_tree_to_name );
+#endif
+extern VTRANSFACT_DECL ( NCBI_SRA_qual4_decode );
+extern VTRANSFACT_DECL ( NCBI_SRA_qual4_decompress_v1 );
+#if HAVE_READ_LEN_FROM_NREADS
+extern VTRANSFACT_DECL ( NCBI_SRA_read_len_from_nreads );
+extern VTRANSFACT_DECL ( NCBI_SRA_read_start_from_nreads );
+#endif
+extern VTRANSFACT_DECL ( NCBI_SRA_read_seg_from_readn );
+extern VTRANSFACT_DECL ( NCBI_SRA_rewrite_spot_name );
+extern VTRANSFACT_DECL ( NCBI_SRA_rotate );
+extern VTRANSFACT_DECL ( NCBI_SRA_swap );
+extern VTRANSFACT_DECL ( NCBI_WGS_build_read_type );
+extern VTRANSFACT_DECL ( NCBI_WGS_build_scaffold_qual );
+extern VTRANSFACT_DECL ( NCBI_WGS_build_scaffold_read );
+extern VTRANSFACT_DECL ( NCBI_WGS_tokenize_nuc_accession );
+extern VTRANSFACT_DECL ( NCBI_WGS_tokenize_prot_accession );
+extern VTRANSFACT_DECL ( NCBI_align_clip );
+extern VTRANSFACT_DECL ( NCBI_align_clip_2 );
+extern VTRANSFACT_DECL ( NCBI_align_compress_quality );
+extern VTRANSFACT_DECL ( NCBI_align_decompress_quality );
+extern VTRANSFACT_DECL ( NCBI_align_edit_distance );
+extern VTRANSFACT_DECL ( NCBI_align_edit_distance_2 );
+extern VTRANSFACT_DECL ( NCBI_align_edit_distance_3 );
+extern VTRANSFACT_DECL ( NCBI_align_generate_mismatch_qual_2 );
+extern VTRANSFACT_DECL ( NCBI_align_generate_preserve_qual );
+extern VTRANSFACT_DECL ( NCBI_align_get_clipped_cigar );
+extern VTRANSFACT_DECL ( NCBI_align_get_clipped_cigar_2 );
+extern VTRANSFACT_DECL ( NCBI_align_get_clipped_ref_offset );
+extern VTRANSFACT_DECL ( NCBI_align_get_left_soft_clip );
+extern VTRANSFACT_DECL ( NCBI_align_get_left_soft_clip_2 );
+extern VTRANSFACT_DECL ( NCBI_align_get_mate_align_id );
+extern VTRANSFACT_DECL ( NCBI_align_get_mismatch_read );
+extern VTRANSFACT_DECL ( NCBI_align_get_ref_delete );
+extern VTRANSFACT_DECL ( NCBI_align_get_ref_insert );
+extern VTRANSFACT_DECL ( NCBI_align_get_ref_len );
+extern VTRANSFACT_DECL ( NCBI_align_get_ref_len_2 );
+extern VTRANSFACT_DECL ( NCBI_align_get_ref_mismatch );
+extern VTRANSFACT_DECL ( NCBI_align_get_ref_preserve_qual );
+extern VTRANSFACT_DECL ( NCBI_align_get_right_soft_clip );
+extern VTRANSFACT_DECL ( NCBI_align_get_right_soft_clip_2 );
+extern VTRANSFACT_DECL ( NCBI_align_get_right_soft_clip_3 );
+extern VTRANSFACT_DECL ( NCBI_align_get_right_soft_clip_4 );
+extern VTRANSFACT_DECL ( NCBI_align_get_right_soft_clip_5 );
+extern VTRANSFACT_DECL ( NCBI_align_get_sam_flags );
+extern VTRANSFACT_DECL ( NCBI_align_get_sam_flags_2 );
+extern VTRANSFACT_DECL ( NCBI_align_get_seq_preserve_qual );
+extern VTRANSFACT_DECL ( NCBI_align_local_ref_id );
+extern VTRANSFACT_DECL ( NCBI_align_local_ref_start );
+extern VTRANSFACT_DECL ( NCBI_align_make_cmp_read_desc );
+extern VTRANSFACT_DECL ( NCBI_align_make_read_start );
+extern VTRANSFACT_DECL ( NCBI_align_mismatch_restore_qual );
+extern VTRANSFACT_DECL ( NCBI_align_not_my_row );
+extern VTRANSFACT_DECL ( NCBI_align_raw_restore_qual );
+extern VTRANSFACT_DECL ( NCBI_align_ref_name );
+extern VTRANSFACT_DECL ( NCBI_align_ref_pos );
+extern VTRANSFACT_DECL ( NCBI_align_ref_seq_id );
+extern VTRANSFACT_DECL ( NCBI_align_ref_sub_select_preserve_qual );
+extern VTRANSFACT_DECL ( NCBI_align_rna_orientation );
+extern VTRANSFACT_DECL ( NCBI_align_seq_construct_read );
+extern VTRANSFACT_DECL ( NCBI_align_template_len );
+extern VTRANSFACT_DECL ( NCBI_color_from_dna );
+extern VTRANSFACT_DECL ( NCBI_dna_from_color );
+extern VTRANSFACT_DECL ( NCBI_fp_extend );
+extern VTRANSFACT_DECL ( NCBI_lower_case_tech_reads );
+extern VTRANSFACT_DECL ( NCBI_unpack );
+extern VTRANSFACT_DECL ( NCBI_unzip );
+extern VTRANSFACT_DECL ( NCBI_var_tokenize_var_id );
+extern VTRANSFACT_DECL ( vdb_add_row_id );
+extern VTRANSFACT_DECL ( vdb_bit_or );
+extern VTRANSFACT_DECL ( vdb_bunzip );
+extern VTRANSFACT_DECL ( vdb_ceil );
+extern VTRANSFACT_DECL ( vdb_clip );
+extern VTRANSFACT_DECL ( vdb_cut );
+extern VTRANSFACT_DECL ( vdb_delta );
+extern VTRANSFACT_DECL ( vdb_deriv );
+extern VTRANSFACT_DECL ( vdb_diff );
+extern VTRANSFACT_DECL ( vdb_echo );
+extern VTRANSFACT_DECL ( vdb_exists );
+extern VTRANSFACT_DECL ( vdb_extract_token );
+extern VTRANSFACT_DECL ( vdb_fixed_vec_sum );
+extern VTRANSFACT_DECL ( vdb_floor );
+extern VTRANSFACT_DECL ( vdb_funzip );
+extern VTRANSFACT_DECL ( vdb_integral );
+extern VTRANSFACT_DECL ( vdb_integral_0 );
+extern VTRANSFACT_DECL ( vdb_iunzip );
+extern VTRANSFACT_DECL ( vdb_izip );
+extern VTRANSFACT_DECL ( vdb_map );
+extern VTRANSFACT_DECL ( vdb_max );
+extern VTRANSFACT_DECL ( vdb_min );
+extern VTRANSFACT_DECL ( vdb_outlier_decode );
+extern VTRANSFACT_DECL ( vdb_outlier_encode );
+extern VTRANSFACT_DECL ( vdb_pack );
+extern VTRANSFACT_DECL ( vdb_paste );
+extern VTRANSFACT_DECL ( vdb_rldecode );
+extern VTRANSFACT_DECL ( vdb_round );
+extern VTRANSFACT_DECL ( vdb_simple_sub_select );
+extern VTRANSFACT_DECL ( vdb_simple_sub_select_1 );
+extern VTRANSFACT_DECL ( vdb_sprintf );
+extern VTRANSFACT_DECL ( vdb_strtonum );
+extern VTRANSFACT_DECL ( vdb_subtract_row_id );
+extern VTRANSFACT_DECL ( vdb_sum );
+extern VTRANSFACT_DECL ( vdb_trim );
+extern VTRANSFACT_DECL ( vdb_trunc );
+extern VTRANSFACT_DECL ( vdb_undelta );
+extern VTRANSFACT_DECL ( vdb_unpack );
+extern VTRANSFACT_DECL ( vdb_unzip );
+extern VTRANSFACT_DECL ( vdb_vec_sum );
+
+struct KTable;
+struct KMetadata;
+extern bool CC NCBI_SRA_accept_untyped ( struct KTable const *tbl, struct KMetadata const *meta );
+extern bool CC NCBI_SRA__454__untyped_0 ( struct KTable const *tbl, struct KMetadata const *meta );
+extern bool CC NCBI_SRA__454__untyped_1_2a ( struct KTable const *tbl, struct KMetadata const *meta );
+extern bool CC NCBI_SRA__454__untyped_1_2b ( struct KTable const *tbl, struct KMetadata const *meta );
+extern bool CC NCBI_SRA_Illumina_untyped_0a ( struct KTable const *tbl, struct KMetadata const *meta );
+extern bool CC NCBI_SRA_Illumina_untyped_0b ( struct KTable const *tbl, struct KMetadata const *meta );
+extern bool CC NCBI_SRA_Illumina_untyped_1a ( struct KTable const *tbl, struct KMetadata const *meta );
+extern bool CC NCBI_SRA_Illumina_untyped_1b ( struct KTable const *tbl, struct KMetadata const *meta );
+extern bool CC NCBI_SRA_ABI_untyped_1 ( struct KTable const *tbl, struct KMetadata const *meta );
+
+
+/* select is REALLY internal */
+static
+rc_t CC select_func ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    return 0;
+}
+
+VTRANSFACT_BUILTIN_IMPL ( vdb_select, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* set function pointer to non-NULL */
+    rslt -> u . rf = select_func;
+    rslt -> variant = vftSelect;
+    return 0;
+}
+
+/* temporary silly stuff
+ */
+
+static
+rc_t CC hello_func ( void *self, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    char *func_hello = self;
+    OUTMSG (( "%s - row id %ld\n", func_hello, row_id ));
+    return 0;
+}
+
+VTRANSFACT_BUILTIN_IMPL ( vdb_hello, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    const char *fact_hello = "vdb:hello factory";
+    const char *func_hello = "vdb:hello function";
+
+    if ( cp -> argc > 0 )
+    {
+        fact_hello = cp -> argv [ 0 ] . data . ascii;
+        if ( cp -> argc > 1 )
+            func_hello = cp -> argv [ 1 ] . data . ascii;
+    }
+
+    rslt -> self = malloc ( strlen ( func_hello ) + 1 );
+    if ( rslt -> self == NULL )
+        return RC ( rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    strcpy ( rslt -> self, func_hello );
+    rslt -> whack = free;
+    rslt -> u . rf = hello_func;
+    rslt -> variant = vftRow;
+
+    OUTMSG (( "%s - %u factory params, %u function params\n", fact_hello, cp -> argc, dp -> argc ));
+    return 0;
+}
+
+/* InitFactories
+ */
+static
+rc_t CC VLinkerEnterFactory ( KSymTable *tbl, const SchemaEnv *env,
+    LFactory *lfact, const char *name )
+{
+    rc_t rc;
+
+    KTokenSource src;
+    KTokenText tt;
+    KToken t;
+
+    KTokenTextInitCString ( & tt, name, "VLinkerEnterFactory" );
+    KTokenSourceInit ( & src, & tt );
+    next_token ( tbl, & src, & t );
+
+    rc = create_fqn ( tbl, & src, & t, env, ltFactory, lfact );
+    if ( rc == 0 )
+        lfact -> name = t . sym;
+
+    return rc;
+}
+
+
+rc_t VLinkerAddFactories ( VLinker *self,
+    const VLinkerIntFactory *fact, uint32_t count,
+    KSymTable *tbl, const SchemaEnv *env )
+{
+    uint32_t i;
+    for ( i = 0; i < count; ++ i )
+    {
+        rc_t rc;
+        LFactory *lfact = malloc ( sizeof * lfact );
+        if ( lfact == NULL )
+            return RC ( rcVDB, rcFunction, rcRegistering, rcMemory, rcExhausted );
+
+        /* invoke factory to get description */
+        rc = ( * fact [ i ] . f ) ( & lfact -> desc );
+        if ( rc != 0 )
+        {
+            free ( lfact );
+            return rc;
+        }
+
+        /* I am intrinsic and have no dl symbol */
+        lfact -> addr = NULL;
+        lfact -> name = NULL;
+        lfact -> external = false;
+
+        /* add to linker */
+        rc = VectorAppend ( & self -> fact, & lfact -> id, lfact );
+        if ( rc != 0 )
+        {
+            LFactoryWhack ( lfact, NULL );
+            return rc;
+        }
+
+        /* create name */
+        rc = VLinkerEnterFactory ( tbl, env, lfact, fact [ i ] . name );
+        if ( rc != 0 )
+        {
+            void *ignore;
+            VectorSwap ( & self -> fact, lfact -> id, NULL, & ignore );
+            LFactoryWhack ( lfact, NULL );
+            return rc;
+        }
+    }
+
+    return 0;
+}
+
+
+static
+rc_t CC VLinkerEnterSpecial ( KSymTable *tbl, const SchemaEnv *env,
+    LSpecial *lspec, const char *name )
+{
+    rc_t rc;
+
+    KTokenSource src;
+    KTokenText tt;
+    KToken t;
+
+    KTokenTextInitCString ( & tt, name, "VLinkerEnterSpecial" );
+    KTokenSourceInit ( & src, & tt );
+    next_token ( tbl, & src, & t );
+
+    rc = create_fqn ( tbl, & src, & t, env, ltUntyped, lspec );
+    if ( rc == 0 )
+        lspec -> name = t . sym;
+
+    return rc;
+}
+
+typedef struct VLinkerIntSpecial VLinkerIntSpecial;
+struct VLinkerIntSpecial
+{
+    bool ( CC * f ) ( struct KTable const *tbl, struct KMetadata const *meta );
+    const char *name;
+};
+
+static
+rc_t VLinkerAddUntyped ( VLinker *self,
+    const VLinkerIntSpecial *special, uint32_t count,
+    KSymTable *tbl, const SchemaEnv *env )
+{
+    uint32_t i;
+    for ( i = 0; i < count; ++ i )
+    {
+        rc_t rc;
+        LSpecial *lspec = malloc ( sizeof * lspec );
+        if ( lspec == NULL )
+            return RC ( rcVDB, rcFunction, rcRegistering, rcMemory, rcExhausted );
+
+        /* I am intrinsic and have no dl symbol */
+        lspec -> addr = NULL;
+        lspec -> name = NULL;
+        lspec -> func = special [ i ] . f;
+
+        /* add to linker */
+        rc = VectorAppend ( & self -> special, & lspec -> id, lspec );
+        if ( rc != 0 )
+        {
+            LSpecialWhack ( lspec, NULL );
+            return rc;
+        }
+
+        /* create name */
+        rc = VLinkerEnterSpecial ( tbl, env, lspec, special [ i ] . name );
+        if ( rc != 0 )
+        {
+            void *ignore;
+            VectorSwap ( & self -> special, lspec -> id, NULL, & ignore );
+            LSpecialWhack ( lspec, NULL );
+            return rc;
+        }
+    }
+
+    return 0;
+}
+
+/* InitFactories
+ */
+rc_t VLinkerInitFactoriesRead ( VLinker *self,  KSymTable *tbl, const SchemaEnv *env )
+{
+    static VLinkerIntFactory fact [] =
+    {
+        { vdb_cast, "vdb:cast" },
+        { vdb_redimension, "vdb:redimension" },
+        { vdb_row_id, "vdb:row_id" },
+        { vdb_row_len, "vdb:row_len" },
+        { vdb_fixed_row_len, "vdb:fixed_row_len" },
+        { vdb_select, "vdb:select" },
+        { vdb_compare, "vdb:compare" },
+        { vdb_no_compare, "vdb:no_compare" },
+        { vdb_range_validate, "vdb:range_validate" },
+        { vdb_merge, "vdb:merge" },
+        { vdb_split, "vdb:split" },
+        { vdb_transpose, "vdb:transpose" },
+        { vdb_detranspose, "vdb:detranspose" },
+        { vdb_delta_average, "vdb:delta_average" },
+        { vdb_undelta_average, "vdb:undelta_average" },
+        { meta_read, "meta:read" },
+        { meta_value, "meta:value" },
+        { meta_attr_read, "meta:attr:read" },
+        { idx_text_project, "idx:text:project" },
+        { idx_text_lookup, "idx:text:lookup" },
+        { parameter_read, "parameter:read" },
+/*        { environment_read, "environment:read" }, */
+
+        { ALIGN_align_restore_read, "ALIGN:align_restore_read" },
+        { ALIGN_cigar, "ALIGN:cigar" },
+        { ALIGN_cigar_2, "ALIGN:cigar_2" },
+        { ALIGN_generate_has_mismatch, "ALIGN:generate_has_mismatch" },
+        { ALIGN_generate_mismatch, "ALIGN:generate_mismatch" },
+        { ALIGN_generate_mismatch_qual, "ALIGN:generate_mismatch_qual" },
+        { ALIGN_project_from_sequence, "ALIGN:project_from_sequence" },
+        { ALIGN_raw_restore_read, "ALIGN:raw_restore_read" },
+        { ALIGN_ref_restore_read, "ALIGN:ref_restore_read" },
+        { ALIGN_ref_sub_select, "ALIGN:ref_sub_select" },
+        { ALIGN_seq_restore_read, "ALIGN:seq_restore_read" },
+        { ALIGN_seq_restore_linkage_group, "ALIGN:seq_restore_linkage_group" },
+        { INSDC_SEQ_rand_4na_2na, "INSDC:SEQ:rand_4na_2na" },
+        { INSDC_SRA_format_spot_name, "INSDC:SRA:format_spot_name" },
+        { INSDC_SRA_format_spot_name_no_coord, "INSDC:SRA:format_spot_name_no_coord" },
+        { NCBI_SRA_ABI_tokenize_spot_name, "NCBI:SRA:ABI:tokenize_spot_name" },
+        { NCBI_SRA_Helicos_tokenize_spot_name, "NCBI:SRA:Helicos:tokenize_spot_name" },
+        { NCBI_SRA_Illumina_tokenize_spot_name, "NCBI:SRA:Illumina:tokenize_spot_name" },
+        { NCBI_SRA_IonTorrent_tokenize_spot_name, "NCBI:SRA:IonTorrent:tokenize_spot_name" },
+        { NCBI_SRA_GenericFastq_tokenize_spot_name, "NCBI:SRA:GenericFastq:tokenize_spot_name" },
+        { NCBI_SRA__454__dynamic_read_desc, "NCBI:SRA:_454_:dynamic_read_desc" },
+        { NCBI_SRA__454__process_position, "NCBI:SRA:_454_:process_position" },
+        { NCBI_SRA__454__tokenize_spot_name, "NCBI:SRA:_454_:tokenize_spot_name" },
+        { NCBI_SRA_bio_start, "NCBI:SRA:bio_start" },
+        { NCBI_SRA_bio_end, "NCBI:SRA:bio_end" },
+        { NCBI_SRA_decode_CLIP, "NCBI:SRA:decode:CLIP" },
+        { NCBI_SRA_decode_INTENSITY, "NCBI:SRA:decode:INTENSITY" },
+        { NCBI_SRA_decode_NOISE, "NCBI:SRA:decode:NOISE" },
+        { NCBI_SRA_decode_POSITION, "NCBI:SRA:decode:POSITION" },
+        { NCBI_SRA_decode_QUALITY, "NCBI:SRA:decode:QUALITY" },
+        { NCBI_SRA_decode_READ, "NCBI:SRA:decode:READ" },
+        { NCBI_SRA_decode_SIGNAL, "NCBI:SRA:decode:SIGNAL" },
+        { NCBI_SRA_denormalize, "NCBI:SRA:denormalize" },
+        { NCBI_SRA_extract_coordinates, "NCBI:SRA:extract_coordinates" },
+        { NCBI_SRA_extract_name_coord, "NCBI:SRA:extract_name_coord" },
+        { NCBI_SRA_fix_read_seg, "NCBI:SRA:fix_read_seg" },
+#if HAVE_LINKER_FROM_READN
+        { NCBI_SRA_linker_from_readn, "NCBI:SRA:linker_from_readn" },
+#endif
+        { NCBI_SRA_lookup, "NCBI:SRA:lookup" },
+        { NCBI_SRA_make_position, "NCBI:SRA:make_position" },
+        { NCBI_SRA_make_read_desc, "NCBI:SRA:make_read_desc" },
+        { NCBI_SRA_make_spot_desc, "NCBI:SRA:make_spot_desc" },
+        { NCBI_SRA_normalize, "NCBI:SRA:normalize" },
+#if HAVE_PREFIX_TREE_TO_NAME
+        { NCBI_SRA_prefix_tree_to_name, "NCBI:SRA:prefix_tree_to_name" },
+#endif
+        { NCBI_SRA_qual4_decode, "NCBI:SRA:qual4_decode" },
+        { NCBI_SRA_qual4_decompress_v1, "NCBI:SRA:qual4_decompress_v1" },
+#if HAVE_READ_LEN_FROM_NREADS
+        { NCBI_SRA_read_len_from_nreads, "NCBI:SRA:read_len_from_nreads" },
+        { NCBI_SRA_read_start_from_nreads, "NCBI:SRA:read_start_from_nreads" },
+#endif
+        { NCBI_SRA_read_seg_from_readn, "NCBI:SRA:read_seg_from_readn" },
+        { NCBI_SRA_rewrite_spot_name, "NCBI:SRA:rewrite_spot_name" },
+        { NCBI_SRA_rotate, "NCBI:SRA:rotate" },
+        { NCBI_SRA_swap, "NCBI:SRA:swap" },
+        { NCBI_WGS_build_read_type, "NCBI:WGS:build_read_type" },
+        { NCBI_WGS_build_scaffold_qual, "NCBI:WGS:build_scaffold_qual" },
+        { NCBI_WGS_build_scaffold_read, "NCBI:WGS:build_scaffold_read" },
+        { NCBI_WGS_tokenize_nuc_accession, "NCBI:WGS:tokenize_nuc_accession" },
+        { NCBI_WGS_tokenize_prot_accession, "NCBI:WGS:tokenize_prot_accession" },
+        { NCBI_align_clip, "NCBI:align:clip" },
+        { NCBI_align_clip_2, "NCBI:align:clip_2" },
+        { NCBI_align_compress_quality, "NCBI:align:compress_quality" },
+        { NCBI_align_decompress_quality, "NCBI:align:decompress_quality" },
+        { NCBI_align_edit_distance, "NCBI:align:edit_distance" },
+        { NCBI_align_edit_distance_2, "NCBI:align:edit_distance_2" },
+        { NCBI_align_edit_distance_3, "NCBI:align:edit_distance_3" },
+        { NCBI_align_generate_mismatch_qual_2, "NCBI:align:generate_mismatch_qual_2" },
+        { NCBI_align_generate_preserve_qual, "NCBI:align:generate_preserve_qual" },
+        { NCBI_align_get_clipped_cigar, "NCBI:align:get_clipped_cigar" },
+        { NCBI_align_get_clipped_cigar_2, "NCBI:align:get_clipped_cigar_2" },
+        { NCBI_align_get_clipped_ref_offset, "NCBI:align:get_clipped_ref_offset" },
+        { NCBI_align_get_left_soft_clip, "NCBI:align:get_left_soft_clip" },
+        { NCBI_align_get_left_soft_clip_2, "NCBI:align:get_left_soft_clip_2" },
+        { NCBI_align_get_mate_align_id, "NCBI:align:get_mate_align_id" },
+        { NCBI_align_get_mismatch_read, "NCBI:align:get_mismatch_read" },
+        { NCBI_align_get_ref_delete, "NCBI:align:get_ref_delete" },
+        { NCBI_align_get_ref_insert, "NCBI:align:get_ref_insert" },
+        { NCBI_align_get_ref_len, "NCBI:align:get_ref_len" },
+        { NCBI_align_get_ref_len_2, "NCBI:align:get_ref_len_2" },
+        { NCBI_align_get_ref_mismatch, "NCBI:align:get_ref_mismatch" },
+        { NCBI_align_get_ref_preserve_qual, "NCBI:align:get_ref_preserve_qual" },
+        { NCBI_align_get_seq_preserve_qual, "NCBI:align:get_seq_preserve_qual" },
+        { NCBI_align_get_right_soft_clip, "NCBI:align:get_right_soft_clip" },
+        { NCBI_align_get_right_soft_clip_2, "NCBI:align:get_right_soft_clip_2" },
+        { NCBI_align_get_right_soft_clip_3, "NCBI:align:get_right_soft_clip_3" },
+        { NCBI_align_get_right_soft_clip_4, "NCBI:align:get_right_soft_clip_4" },
+        { NCBI_align_get_right_soft_clip_5, "NCBI:align:get_right_soft_clip_5" },
+        { NCBI_align_get_sam_flags, "NCBI:align:get_sam_flags" },
+        { NCBI_align_get_sam_flags_2, "NCBI:align:get_sam_flags_2" },
+        { NCBI_align_local_ref_id, "NCBI:align:local_ref_id" },
+        { NCBI_align_local_ref_start, "NCBI:align:local_ref_start" },
+        { NCBI_align_make_cmp_read_desc, "NCBI:align:make_cmp_read_desc" },
+        { NCBI_align_make_read_start, "NCBI:align:make_read_start" },
+        { NCBI_align_mismatch_restore_qual, "NCBI:align:mismatch_restore_qual" },
+        { NCBI_align_not_my_row, "NCBI:align:not_my_row" },
+        { NCBI_align_raw_restore_qual, "NCBI:align:raw_restore_qual" },
+        { NCBI_align_ref_name, "NCBI:align:ref_name" },
+        { NCBI_align_ref_pos, "NCBI:align:ref_pos" },
+        { NCBI_align_ref_seq_id, "NCBI:align:ref_seq_id" },
+        { NCBI_align_ref_sub_select_preserve_qual, "NCBI:align:ref_sub_select_preserve_qual" },
+        { NCBI_align_rna_orientation, "NCBI:align:rna_orientation" },
+        { NCBI_align_seq_construct_read, "NCBI:align:seq_construct_read" },
+        { NCBI_align_template_len, "NCBI:align:template_len" },
+        { NCBI_color_from_dna, "NCBI:color_from_dna" },
+        { NCBI_dna_from_color, "NCBI:dna_from_color" },
+        { NCBI_fp_extend, "NCBI:fp_extend" },
+        { NCBI_lower_case_tech_reads, "NCBI:lower_case_tech_reads" },
+        { NCBI_unpack, "NCBI:unpack" },
+        { NCBI_unzip, "NCBI:unzip" },
+        { NCBI_var_tokenize_var_id, "NCBI:var:tokenize_var_id" },
+        { vdb_add_row_id, "vdb:add_row_id" },
+        { vdb_bit_or, "vdb:bit_or" },
+        { vdb_bunzip, "vdb:bunzip" },
+        { vdb_ceil, "vdb:ceil" },
+        { vdb_clip, "vdb:clip" },
+        { vdb_cut, "vdb:cut" },
+        { vdb_delta, "vdb:delta" },
+        { vdb_deriv, "vdb:deriv" },
+        { vdb_diff, "vdb:diff" },
+        { vdb_echo, "vdb:echo" },
+        { vdb_exists, "vdb:exists" },
+        { vdb_extract_token, "vdb:extract_token" },
+        { vdb_fixed_vec_sum, "vdb:fixed_vec_sum" },
+        { vdb_floor, "vdb:floor" },
+        { vdb_funzip, "vdb:funzip" },
+        { vdb_integral, "vdb:integral" },
+        { vdb_integral_0, "vdb:integral_0" },
+        { vdb_iunzip, "vdb:iunzip" },
+        { vdb_izip, "vdb:izip" },
+        { vdb_map, "vdb:map" },
+        { vdb_max, "vdb:max" },
+        { vdb_min, "vdb:min" },
+        { vdb_outlier_decode, "vdb:outlier_decode" },
+        { vdb_outlier_encode, "vdb:outlier_encode" },
+        { vdb_pack, "vdb:pack" },
+        { vdb_paste, "vdb:paste" },
+        { vdb_rldecode, "vdb:rldecode" },
+        { vdb_round, "vdb:round" },
+        { vdb_simple_sub_select_1, "vdb:simple_sub_select_1" },
+        { vdb_sprintf, "vdb:sprintf" },
+        { vdb_strtonum, "vdb:strtonum" },
+        { vdb_subtract_row_id, "vdb:subtract_row_id" },
+        { vdb_sum, "vdb:sum" },
+        { vdb_trim, "vdb:trim" },
+        { vdb_trunc, "vdb:trunc" },
+        { vdb_undelta, "vdb:undelta" },
+        { vdb_unpack, "vdb:unpack" },
+        { vdb_unzip, "vdb:unzip" },
+        { vdb_vec_sum, "vdb:vec_sum" },
+
+        { vdb_hello, "vdb:hello" }
+    };
+
+    static VLinkerIntSpecial special [] =
+    {
+        { NCBI_SRA_accept_untyped, "NCBI:SRA:accept_untyped" },
+        { NCBI_SRA__454__untyped_0, "NCBI:SRA:_454_:untyped_0" },
+        { NCBI_SRA__454__untyped_1_2a, "NCBI:SRA:_454_:untyped_1_2a" },
+        { NCBI_SRA__454__untyped_1_2b, "NCBI:SRA:_454_:untyped_1_2b" },
+        { NCBI_SRA_Illumina_untyped_0a, "NCBI:SRA:Illumina:untyped_0a" },
+        { NCBI_SRA_Illumina_untyped_0b, "NCBI:SRA:Illumina:untyped_0b" },
+        { NCBI_SRA_Illumina_untyped_1a, "NCBI:SRA:Illumina:untyped_1a" },
+        { NCBI_SRA_Illumina_untyped_1b, "NCBI:SRA:Illumina:untyped_1b" },
+        { NCBI_SRA_ABI_untyped_1, "NCBI:SRA:ABI:untyped_1" }
+    };
+
+    rc_t rc = VLinkerAddFactories ( self, fact, sizeof fact / sizeof fact [ 0 ], tbl, env );
+    if ( rc == 0 )
+        rc = VLinkerAddUntyped ( self, special, sizeof special / sizeof special [ 0 ], tbl, env );
+    return rc;
+}
+
+
+/* MakeIntrinsic
+ *  creates an initial, intrinsic linker
+ *  pre-loaded with intrinsic factories
+ */
+rc_t VLinkerMakeIntrinsic ( VLinker **lp )
+{
+    KDyld *dl;
+    rc_t rc = KDyldMake ( & dl );
+    if ( rc == 0 )
+    {
+        rc = VLinkerMake ( lp, NULL, dl );
+        KDyldRelease ( dl );
+
+        if ( rc == 0 )
+        {
+            KSymTable tbl;
+            VLinker *self = * lp;
+
+            /* create symbol table with no intrinsic scope */
+            rc = KSymTableInit ( & tbl, NULL );
+            if ( rc == 0 )
+            {
+                SchemaEnv env;
+                SchemaEnvInit ( & env, EXT_SCHEMA_LANG_VERSION );
+
+                /* make intrinsic scope modifiable */
+                KSymTablePushScope ( & tbl, & self -> scope );
+
+                /* add intrinsic functions */
+                rc = VLinkerInitFactories ( self, & tbl, & env );
+                if ( rc == 0 )
+                {
+                    KSymTableWhack ( & tbl );
+                    return 0;
+                }
+
+                KSymTableWhack ( & tbl );
+            }
+
+            VLinkerRelease ( self );
+        }
+    }
+
+    * lp = NULL;
+
+    return rc;
+}
diff --git a/libs/vdb/linker-priv.h b/libs/vdb/linker-priv.h
new file mode 100644
index 0000000..71a86dc
--- /dev/null
+++ b/libs/vdb/linker-priv.h
@@ -0,0 +1,272 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_linker_priv_
+#define _h_linker_priv_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_token_
+#include <klib/token.h>
+#endif
+
+#ifndef _h_vdb_xform_
+#include <vdb/xform.h>
+#endif
+
+#ifndef _h_vdb_vdb_priv_
+#include <vdb/vdb-priv.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KSymbol;
+struct KSymTable;
+struct KNamelist;
+struct KDyld;
+struct KDlset;
+struct KSymAddr;
+struct SFunction;
+struct SchemaEnv;
+struct VTransDesc;
+
+
+/*--------------------------------------------------------------------------
+ * linker symbol types
+ */
+enum
+{
+    ltFactory = eNumSymtabIDs,
+    ltUntyped
+};
+
+
+/*--------------------------------------------------------------------------
+ * VLinker
+ *  responsible for performing runtime schema resolution
+ *  and C factory/function management
+ *
+ *  a schema will be declared with conditional productions and
+ *  references to C functions. at load time, all schema expressions
+ *  will be evaluated, unused conditional productions pruned,
+ *  function references resolved, function objects created,
+ *  and all paths rejected due to errors of any sort eliminated,
+ *  leaving the final runtime schema.
+ *
+ *  the current implementation
+ */
+typedef struct VLinker VLinker;
+struct VLinker
+{
+    /* dynamic loader */
+    struct KDyld *dl;
+
+    /* parent loader */
+    const VLinker *dad;
+
+    /* global scope for functions */
+    BSTree scope;
+
+    /* factory objects */
+    Vector fact;
+
+    /* special funcs */
+    Vector special;
+
+    KRefcount refcount;
+};
+
+
+/* Make
+ *  creates an empty linker
+ */
+rc_t VLinkerMake ( VLinker **lp, const VLinker *dad, struct KDyld *dl );
+
+/* MakeIntrinsic
+ *  creates an initial, intrinsic linker
+ *  pre-loaded with intrinsic factories
+ */
+rc_t VLinkerMakeIntrinsic ( VLinker **intrinsic );
+
+/* InitFactories
+ *  initialize intrinsic factories
+ *
+ *  "tbl" [ IN ] - linker-scope symbol table
+ *
+ *  "env" [ IN ] - default schema parser environment
+ */
+rc_t VLinkerInitFactories ( VLinker *self,
+    struct KSymTable *tbl, struct SchemaEnv const *env );
+rc_t VLinkerInitFactoriesRead ( VLinker *self,
+    struct KSymTable *tbl, struct SchemaEnv const *env );
+
+/* AddFactories
+ *  add a list of intrinsic factories
+ *
+ *  "fact" [ IN ] and "count" [ IN ] - list of intrinsic factories to register
+ *
+ *  "tbl" [ IN ] - linker-scope symbol table
+ *
+ *  "env" [ IN ] - default schema parser environment
+ */
+typedef struct VLinkerIntFactory VLinkerIntFactory;
+struct VLinkerIntFactory
+{
+    rc_t ( CC * f ) ( struct VTransDesc *desc );
+    const char *name;
+};
+
+rc_t VLinkerAddFactories ( VLinker *self,
+    const VLinkerIntFactory *fact, uint32_t count,
+    struct KSymTable *tbl, struct SchemaEnv const *env );
+
+
+/* Release
+ */
+rc_t VLinkerRelease ( const VLinker *self );
+
+/* Attach
+ * Sever
+ */
+VLinker *VLinkerAttach ( const VLinker *self );
+rc_t VLinkerSever ( const VLinker *self );
+
+
+/* AddLoadLibraryPath
+ *  add a path[s] to loader for locating dynamic libraries
+ */
+rc_t VLinkerVAddLoadLibraryPath ( const VLinker *self,
+    const char *path, va_list args );
+
+
+/* Open
+ *  opens libraries for search
+ */
+rc_t VLinkerOpen ( const VLinker *self, struct KDlset **libs );
+
+
+/* Find
+ *  find a named symbol
+ *
+ *  "libs" [ IN ] - set of open libraries to search
+ *
+ *  "desc" [ OUT ] - transform factory description
+ *  "func" [ OUT ] - return parameter for func pointer
+ *
+ *  "proto" [ IN ] - function prototype from schema
+ *  "min_version" [ IN ] - minimum version to accept
+ *
+ *  "external" [ OUT ] - true if function is not built-in
+ */
+rc_t VLinkerFindFactory ( VLinker *self, struct KDlset const *libs,
+    VTransDesc *desc, struct SFunction const *proto, uint32_t min_version, bool *external );
+rc_t VLinkerFindNamedFactory ( VLinker *self, struct KDlset const *libs,
+    VTransDesc *desc, const char *fact_name );
+rc_t VLinkerFindUntyped ( VLinker *self, struct KDlset const *libs,
+    VUntypedTableTest *func, struct SFunction const *proto );
+
+
+/* ListExternalSchemaModules
+ */
+rc_t VLinkerListExternalSchemaModules ( const VLinker *self,
+    struct KNamelist **list );
+
+
+/*--------------------------------------------------------------------------
+ * LFactory
+ *  describes an external C function factory
+ */
+typedef struct LFactory LFactory;
+struct LFactory
+{
+    /* factory function address */
+    struct KSymAddr const *addr;
+
+    /* factory name */
+    struct KSymbol const *name;
+
+    /* factory description */
+    VTransDesc desc;
+
+    /* factory id */
+    uint32_t id;
+
+    /* externally supplied factory */
+    bool external;
+};
+
+/* Whack
+ */
+void CC LFactoryWhack ( void *item, void *ignore );
+
+
+/*--------------------------------------------------------------------------
+ * LSpecial
+ *  describes an external C table recognition function
+ *  or a row-length function
+ */
+typedef struct LSpecial LSpecial;
+struct LSpecial
+{
+    /* function address */
+    struct KSymAddr const *addr;
+
+    /* func name */
+    struct KSymbol const *name;
+
+    /* for built-in address */
+    VUntypedFunc func;
+
+    /* func id */
+    uint32_t id;
+};
+
+/* Whack
+ */
+void CC LSpecialWhack ( void *item, void *ignore );
+
+
+#endif /* _h_linker_priv_ */
diff --git a/libs/vdb/linker.c b/libs/vdb/linker.c
new file mode 100644
index 0000000..1351a61
--- /dev/null
+++ b/libs/vdb/linker.c
@@ -0,0 +1,45 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+
+#include "linker-priv.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* InitFactories
+ */
+rc_t VLinkerInitFactories ( VLinker *self, struct KSymTable *tbl, struct SchemaEnv const *env )
+{
+    return VLinkerInitFactoriesRead ( self, tbl, env );
+}
diff --git a/libs/vdb/merge.c b/libs/vdb/merge.c
new file mode 100644
index 0000000..bab63a3
--- /dev/null
+++ b/libs/vdb/merge.c
@@ -0,0 +1,215 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "blob.h"
+
+#include "blob-headers.h"
+#include "page-map.h"
+#include "blob-priv.h"
+#include "xform-priv.h"
+
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <atomic32.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+static unsigned uniq_list( unsigned dst[], void **list, unsigned N ) {
+    unsigned i;
+    unsigned j;
+    unsigned n;
+    void *on_stack[16];
+    void **uniq = on_stack;
+    void **on_heap = 0;
+    
+    if (N > sizeof(on_stack) / sizeof(on_stack[0])) {
+        on_heap = malloc(N * sizeof(on_heap[0]));
+        uniq = on_heap;
+    }
+    for (i = 0, n = 0; i != N; ++i) {
+        for (j = 0; j != n; ++j) {
+            if (uniq[j] == list[i])
+                break;
+        }
+        dst[i] = j;
+        if (j == n) {
+            uniq[j] = list[i];
+            ++n;
+        }
+    }
+    memmove(list, uniq, n * sizeof(list[0]));
+    if (on_heap)
+        free(on_heap);
+    return n;
+}
+
+static
+rc_t CC VBlobCreateMerged( VBlob **lhs, uint32_t num_inputs, const VBlob *input[] ) {
+    unsigned i;
+    KDataBuffer buffer;
+    BlobHeaders *headers;
+    VBlobHeader *hdr;
+    rc_t rc;
+    uint64_t sz = 0;
+    uint32_t bsize;
+    
+/*
+     headers:
+         args:
+             num_inputs
+             num_row_maps
+             row_map_number[num_inputs]
+             length(row_map)[num_row_maps]
+             length(header)[num_inputs]
+             length(data_blob)[num_inputs]
+     data:
+         row_map[num_row_maps]
+         header[num_inputs]
+         data_blob[num_inputs]
+ */
+    
+    for (i = 1; i != num_inputs; ++i) {
+        if (input[0]->start_id != input[i]->start_id || input[0]->stop_id != input[i]->stop_id)
+            return RC(rcVDB, rcBlob, rcConstructing, rcParam, rcInvalid);
+    }
+    
+    rc = BlobHeadersCreate(&headers);
+    if (rc)
+        return rc;
+    
+    hdr = BlobHeadersGetHdrWrite(headers);
+    if (hdr == NULL) {
+        BlobHeadersRelease(headers);
+        return RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    }
+    rc = KDataBufferMakeBytes(&buffer, bsize = 0);
+    if (rc) {
+        VBlobHeaderRelease(hdr);
+        BlobHeadersRelease(headers);
+        return rc;
+    }
+    VBlobHeaderSetFormat(hdr, 0); /* TBD: set format id to correct value for merged or do it in caller */
+    VBlobHeaderSetVersion(hdr, 1);
+    
+    VBlobHeaderArgPushTail(hdr, num_inputs);
+    
+    {
+        unsigned *v;
+        PageMap **pm;
+        unsigned n;
+		
+        v = malloc(num_inputs * sizeof(*v));
+        pm = malloc(num_inputs * sizeof(*pm));
+        for (i = 0; i != num_inputs; ++i) {
+            pm[i] = input[i]->pm;
+        }
+        n = uniq_list(v, (void **)pm, num_inputs);
+        VBlobHeaderArgPushTail(hdr, n);
+        for (i = 0; i != num_inputs; ++i)
+            VBlobHeaderArgPushTail(hdr, v[i]);
+        free(v);
+        for (i = 0; rc == 0 && i != n; ++i) {
+            rc = PageMapSerialize(pm[i], &buffer, bsize, &sz);
+            VBlobHeaderArgPushTail(hdr, sz);
+            bsize += sz;
+        }
+        free(pm);
+    }
+    
+    for (i = 0; rc == 0 && i != num_inputs; ++i) {
+        if (input[i]->headers) {
+            rc = BlobHeadersSerialize(input[i]->headers, &buffer, bsize, &sz);
+            VBlobHeaderArgPushTail(hdr, sz);
+            bsize += sz;
+        }
+        else
+            VBlobHeaderArgPushTail(hdr, 0);
+    }
+    
+    for (i = 0; rc == 0 && i != num_inputs; ++i) {
+        const VBlob *o = input[i];
+        
+        sz = (uint32_t)BlobBufferBits( o );
+        rc = VBlobHeaderArgPushTail( hdr, sz );
+        sz = (sz + 7) >> 3;
+        if (rc == 0) {
+            rc = KDataBufferResize(&buffer, bsize + sz);
+            if (rc == 0) {
+                memmove((uint8_t *)buffer.base + bsize, o->data.base, sz);
+                bsize += sz;
+            }
+        }
+    }
+    VBlobHeaderRelease(hdr);
+    if (rc == 0) {
+        VBlob *y;
+        
+        rc = VBlobNew(&y, input[0]->start_id, input[0]->stop_id, "merge");
+        if (rc == 0) {
+            y->headers = headers;
+            KDataBufferSub(&buffer, &y->data, 0, UINT64_MAX);
+            
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+            y->byte_order = vboLittleEndian;
+#else
+            y->byte_order = vboBigEndian;
+#endif
+            *lhs = y;
+	    KDataBufferWhack(&buffer);
+            return 0;
+        }
+        rc = RC(rcVDB, rcBlob, rcConstructing, rcMemory, rcExhausted);
+    }
+    KDataBufferWhack(&buffer);
+    BlobHeadersRelease(headers);
+    
+    return rc;
+}
+
+static
+rc_t CC vdb_merge_impl(
+                    void *self,
+                    const VXformInfo *info,
+                    int64_t row_id,
+                    VBlob **rslt,
+                    uint32_t argc, const VBlob *argv[]
+) {
+	return VBlobCreateMerged(rslt, argc, argv);
+}
+
+VTRANSFACT_BUILTIN_IMPL(vdb_merge, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+	rslt->variant = vftBlobN;
+    VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = vdb_merge_impl;
+	return 0;
+}
diff --git a/libs/vdb/meta-append.c b/libs/vdb/meta-append.c
new file mode 100644
index 0000000..2ab5588
--- /dev/null
+++ b/libs/vdb/meta-append.c
@@ -0,0 +1,145 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include "schema-priv.h"
+#include "xform-priv.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+typedef struct self_t {
+    KMDataNode *node;
+    void ( * byte_swap ) ( void *dst, const void *src, uint64_t count );    
+} self_t;
+
+static void CC self_whack( void *vp ) {
+    self_t *self = vp;
+    
+    KMDataNodeRelease( self->node );
+    free( vp );
+}
+
+static
+rc_t CC meta_append_func(
+                     void *Self,
+                     const VXformInfo *info,
+                     int64_t row_id,
+                     VRowResult *rslt,
+                     uint32_t argc,
+                     const VRowData argv[]
+) {
+    self_t *self = Self;
+    char sbuf[1024];
+    void *buf = sbuf;
+    void *hbuf = 0;
+    bitsz_t offset = (argv[0].u.data.first_elem * argv[0].u.data.elem_bits);
+    bitsz_t blen = argv[0].u.data.elem_count * argv[0].u.data.elem_bits;
+    size_t length = (blen + 7) >> 3;
+    rc_t rc = 0;
+    
+    if (length > sizeof(sbuf)) {
+        hbuf = malloc(length);
+        if (hbuf == NULL)
+            return RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        buf = hbuf;
+    }
+    
+    if (self->byte_swap)
+        self->byte_swap(buf, ((const uint8_t *)argv[0].u.data.base) + offset, argv[0].u.data.elem_count);
+    else {
+        memset(buf, 0, length);
+        bitcpy(buf, 0, argv[0].u.data.base, offset, blen);
+    }
+    
+    rc = KMDataNodeAppend(self->node, buf, length);
+    if (hbuf)
+        free(hbuf);
+    
+    if (rc == 0) {
+        rslt->elem_count = argv[0].u.data.elem_count;
+        rslt->elem_bits = argv[0].u.data.elem_bits;
+        assert(rslt->data->elem_bits == rslt->elem_bits);
+        rc = KDataBufferResize(rslt->data, rslt->elem_count);
+        if (rc == 0)
+            bitcpy(rslt->data->base, 0, argv[0].u.data.base, offset, blen);
+    }
+    return rc;
+}
+
+/* 
+ */
+VTRANSFACT_BUILTIN_IMPL(meta_append, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+    self_t *self;
+    SDatatype *sdt;
+    bool need_byte_swap;
+    
+    sdt = VSchemaFindTypeid(info->schema, info->fdesc.fd.td.type_id);
+    assert(sdt != NULL);
+    
+	self = calloc(1, sizeof(self_t));
+	if (self) {
+        KMetadata *meta;
+        
+        rc = VTableOpenMetadataUpdate((VTable *)info->tbl, &meta);
+        if (rc == 0) {
+            rc = KMetadataOpenNodeUpdate(meta, &self->node, "%s", cp->argv[0].data.ascii);
+            KMetadataRelease(meta);
+            if (rc == 0) {
+                KMDataNodeByteOrder(self->node, &need_byte_swap);
+                if (need_byte_swap)
+                    self->byte_swap = sdt->byte_swap;
+                
+                rslt->self = self;
+                rslt->whack = self_whack;
+                
+                rslt->variant = vftNonDetRow;
+                rslt->u.ndf = meta_append_func;
+                
+                return 0;
+            }
+        }
+        self_whack(self);
+	}
+	else
+		rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+        return rc;
+}
diff --git a/libs/vdb/meta-attr-read.c b/libs/vdb/meta-attr-read.c
new file mode 100644
index 0000000..cb0324f
--- /dev/null
+++ b/libs/vdb/meta-attr-read.c
@@ -0,0 +1,448 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <sysalloc.h>
+#include "xform-priv.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+typedef struct self_t {
+    const KMDataNode *node;
+    char *name;
+    KDataBuffer value;
+} self_t;
+
+static void CC self_whack( void *vp ) {
+    self_t *self = vp;
+    
+    KDataBufferWhack( &self->value );
+    free( self->name );
+    KMDataNodeRelease( self->node );
+    free( vp );
+}
+
+static
+rc_t CC meta_attr_read_cstring(
+                            void *Self,
+                            const VXformInfo *info,
+                            int64_t row_id,
+                            VRowResult *rslt,
+                            uint32_t argc,
+                            const VRowData argv[]
+) {
+    self_t *self = Self;
+    size_t length;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttr(self->node, self->name, 0, 0, &length);
+    if (rc)
+        return rc;
+    rc = KDataBufferResize( &self->value, (uint32_t)( length + 1 ) );
+    if (rc)
+        return rc;
+    rc = KMDataNodeReadAttr( self->node, self->name, self->value.base, self->value.elem_count, &length );
+    if (rc)
+        return rc;
+    KDataBufferWhack( rslt->data );
+    KDataBufferSub( &self->value, rslt->data, 0, (uint32_t)length );
+    rslt->elem_count = (uint32_t)length;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_read_bool(
+                       void *Self,
+                       const VXformInfo *info,
+                       int64_t row_id,
+                       VRowResult *rslt,
+                       uint32_t argc,
+                       const VRowData argv[]
+) {
+    const self_t *self = Self;
+    int16_t value;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttrAsI16(self->node, self->name, &value);
+    if (rc)
+        return rc;
+    *(bool *)self->value.base = value == 0 ? false : true;
+    KDataBufferWhack(rslt->data);
+    KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    rslt->elem_count = 1;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_read_I8(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    const self_t *self = Self;
+    int16_t value;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttrAsI16(self->node, self->name, &value);
+    if (rc)
+        return rc;
+    *(int8_t *)self->value.base = (int8_t)value;
+    KDataBufferWhack(rslt->data);
+    KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    rslt->elem_count = 1;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_read_U8(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    const self_t *self = Self;
+    uint16_t value;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttrAsU16(self->node, self->name, &value);
+    if (rc)
+        return rc;
+    *(uint8_t *)self->value.base = (int8_t)value;
+    KDataBufferWhack(rslt->data);
+    KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    rslt->elem_count = 1;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_read_I16(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    const self_t *self = Self;
+    int16_t *value = self->value.base;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttrAsI16(self->node, self->name, value);
+    if (rc)
+        return rc;
+    KDataBufferWhack(rslt->data);
+    KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    rslt->elem_count = 1;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_read_U16(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    const self_t *self = Self;
+    uint16_t *value = self->value.base;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttrAsU16(self->node, self->name, value);
+    if (rc)
+        return rc;
+    KDataBufferWhack(rslt->data);
+    KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    rslt->elem_count = 1;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_read_I32(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    const self_t *self = Self;
+    int32_t *value = self->value.base;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttrAsI32(self->node, self->name, value);
+    if (rc)
+        return rc;
+    KDataBufferWhack(rslt->data);
+    KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    rslt->elem_count = 1;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_read_U32(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    const self_t *self = Self;
+    uint32_t *value = self->value.base;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttrAsU32(self->node, self->name, value);
+    if (rc)
+        return rc;
+    KDataBufferWhack(rslt->data);
+    KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    rslt->elem_count = 1;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_read_I64(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    const self_t *self = Self;
+    int64_t *value = self->value.base;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttrAsI64(self->node, self->name, value);
+    if (rc)
+        return rc;
+    KDataBufferWhack(rslt->data);
+    KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    rslt->elem_count = 1;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_read_U64(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    const self_t *self = Self;
+    uint64_t *value = self->value.base;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttrAsU64(self->node, self->name, value);
+    if (rc)
+        return rc;
+    KDataBufferWhack(rslt->data);
+    KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    rslt->elem_count = 1;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_read_F32(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    const self_t *self = Self;
+    double value;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttrAsF64(self->node, self->name, &value);
+    if (rc)
+        return rc;
+    *(float *)self->value.base = (float)value;
+    KDataBufferWhack(rslt->data);
+    KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    rslt->elem_count = 1;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_read_F64(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    const self_t *self = Self;
+    double *value = self->value.base;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAttrAsF64(self->node, self->name, value);
+    if (rc)
+        return rc;
+    KDataBufferWhack(rslt->data);
+    KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    rslt->elem_count = 1;
+	return 0;
+}
+
+/* 
+ function ascii meta:attr:read #1.0 < ascii node, ascii attr, * bool deterministic > ();
+ */
+VTRANSFACT_BUILTIN_IMPL(meta_attr_read, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+    self_t *self;
+    bool variable = false;
+    rc_t ( CC * var_row_func )(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+                         );
+    bool deterministic = true;
+    
+    if (cp->argc > 2)
+        deterministic = cp->argv[2].data.b[0];
+    
+    switch (info->fdesc.desc.domain) {
+    case vtdBool:
+        var_row_func = meta_attr_read_bool;
+        break;
+    case vtdInt:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+            var_row_func = meta_attr_read_I8;
+            break;
+        case 16:
+            var_row_func = meta_attr_read_I16;
+            break;
+        case 32:
+            var_row_func = meta_attr_read_I32;
+            break;
+        case 64:
+            var_row_func = meta_attr_read_I64;
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+        }
+        break;
+    case vtdUint:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+            var_row_func = meta_attr_read_U8;
+            break;
+        case 16:
+            var_row_func = meta_attr_read_U16;
+            break;
+        case 32:
+            var_row_func = meta_attr_read_U32;
+            break;
+        case 64:
+            var_row_func = meta_attr_read_U64;
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+        }
+        break;
+    case vtdFloat:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 32:
+            var_row_func = meta_attr_read_F32;
+            break;
+        case 64:
+            var_row_func = meta_attr_read_F64;
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+        }
+        break;
+    case vtdAscii:
+        variable = true;
+        var_row_func = meta_attr_read_cstring;
+        break;
+    default:
+        return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+    }
+    
+	self = calloc(1, sizeof(self_t));
+	if (self) {
+        self->name = malloc(cp->argv[1].count + 1);
+        if (self->name) {
+            string_copy(self->name, cp->argv[1].count + 1, cp->argv[1].data.ascii,cp->argv[1].count);
+            if (!variable)
+                rc = KDataBufferMake(&self->value, info->fdesc.desc.intrinsic_bits, 1);
+            else
+                self->value.elem_bits = 8;
+            if (rc == 0) {
+                const KMetadata *meta;
+                
+                rc = VTableOpenMetadataRead(info->tbl, &meta);
+                if (rc == 0) {
+                    rc = KMetadataOpenNodeRead(meta, &self->node, "*.*s", cp->argv[0].count, cp->argv[0].data.ascii);
+                    KMetadataRelease(meta);
+                    if (rc == 0) {
+                        rslt->self = self;
+                        rslt->whack = self_whack;
+                        
+                        rslt->variant = deterministic ? vftRow : vftNonDetRow;
+                        rslt->u.ndf = var_row_func;
+                        
+                        return 0;
+                    }
+                }
+            }
+        }
+        self_whack(self);
+	}
+	else
+		rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+	return rc;
+}
diff --git a/libs/vdb/meta-attr-write.c b/libs/vdb/meta-attr-write.c
new file mode 100644
index 0000000..331b6f9
--- /dev/null
+++ b/libs/vdb/meta-attr-write.c
@@ -0,0 +1,529 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <sysalloc.h>
+#include "xform-priv.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+typedef struct self_t {
+    KMDataNode *node;
+    char name[1];
+} self_t;
+
+static void CC self_whack( void *vp ) {
+    self_t *self = vp;
+    
+    KMDataNodeRelease( self->node );
+    free( vp );
+}
+
+static rc_t meta_attr_write_fmt( self_t *self, const char *fmt, ... )
+{
+    rc_t rc;
+    size_t n;
+    char sbuf[4096];
+
+    va_list va;
+    va_start(va, fmt);
+    rc = string_vprintf(sbuf, sizeof(sbuf), & n, fmt, va);
+    va_end(va);
+    
+    if ( rc == 0 )
+        rc = KMDataNodeWriteAttr(self->node, self->name, sbuf);
+
+    return rc;
+}
+
+static
+rc_t CC meta_attr_write_ascii(
+                             void *Self,
+                             const VXformInfo *info,
+                             int64_t row_id,
+                             VRowResult *rslt,
+                             uint32_t argc,
+                             const VRowData argv[]
+) {
+    self_t *self = Self;
+
+    char *value;
+    size_t length = argv[0].u.data.elem_count;
+
+    const char *src = argv[0].u.data.base;
+    
+    rc_t rc = KDataBufferResize( rslt->data, (uint32_t)( length + 1 ) );
+    if (rc)
+        return rc;
+    
+    value = rslt->data->base;
+    memmove(value, & src [ argv[0].u.data.first_elem ], length);
+    value[length] = '\0';
+
+    rc = KMDataNodeWriteAttr(self->node, self->name, value);
+    if (rc)
+        return rc;
+
+    rslt->elem_count = (uint32_t)length;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_write_bool(
+                          void *Self,
+                          const VXformInfo *info,
+                          int64_t row_id,
+                          VRowResult *rslt,
+                          uint32_t argc,
+                          const VRowData argv[]                          
+) {
+    rc_t rc;
+    self_t *self = Self;
+    uint8_t value = ((const uint8_t *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+
+    /* TBD -this is not dependent upon C code, but upon schema.
+       we probably want a warning here rather than an assert */
+    assert(argv[0].u.data.elem_count == 1);
+
+    rc = KDataBufferResize(rslt -> data, 1);
+    if (rc)
+        return rc;
+
+    *(uint8_t *)rslt->data->base = value ? true : false;
+    rc = meta_attr_write_fmt(self, "%s", value ? "true" : "false");
+    if (rc)
+        return rc;
+
+    rslt->elem_count = 1;
+	return 0;
+}
+
+static
+rc_t CC meta_attr_write_I8(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    self_t *self = Self;
+    int8_t value = ((const int8_t *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    rc_t rc = 0;
+    
+    assert(argv[0].u.data.elem_count == 1);
+    
+    rc = KDataBufferResize(rslt->data, 1);
+    if (rc)
+        return rc;
+    
+    *(int8_t *)rslt->data ->base = value;
+    rc = meta_attr_write_fmt(self, "%d", (int)value);
+    if (rc)
+        return rc;
+    
+    rslt->elem_count = 1;
+    
+	return 0;
+}
+
+static
+rc_t CC meta_attr_write_U8(
+                        void *Self,
+                        const VXformInfo *info,
+                        int64_t row_id,
+                        VRowResult *rslt,
+                        uint32_t argc,
+                        const VRowData argv[]
+) {
+    self_t *self = Self;
+    uint8_t value = ((const uint8_t *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    rc_t rc = 0;
+    
+    assert(argv[0].u.data.elem_count == 1);
+    
+    rc = KDataBufferResize(rslt->data, 1);
+    if (rc)
+        return rc;
+    
+    *(uint8_t *)rslt->data->base = value;
+    rc = meta_attr_write_fmt(self, "%u", (int)value);
+    if (rc)
+        return rc;
+    
+    rslt->elem_count = 1;
+    
+	return 0;
+}
+
+static
+rc_t CC meta_attr_write_I16(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+) {
+    self_t *self = Self;
+    int16_t value = ((const int16_t *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    rc_t rc = 0;
+    
+    assert(argv[0].u.data.elem_count == 1);
+    
+    rc = KDataBufferResize(rslt->data, 1);
+    if (rc)
+        return rc;
+    
+    *(int16_t *)rslt->data->base = value;
+    rc = meta_attr_write_fmt(self, "%d", (int)value);
+    if (rc)
+        return rc;
+    
+    rslt->elem_count = 1;
+    
+	return 0;
+}
+
+static
+rc_t CC meta_attr_write_U16(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+) {
+    self_t *self = Self;
+    uint16_t value = ((const uint16_t *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    rc_t rc = 0;
+    
+    assert(argv[0].u.data.elem_count == 1);
+    
+    rc = KDataBufferResize(rslt->data, 1);
+    if (rc)
+        return rc;
+    
+    *(uint16_t *)rslt->data->base = value;
+    rc = meta_attr_write_fmt(self, "%u", (int)value);
+    if (rc)
+        return rc;
+    
+    rslt->elem_count = 1;
+    
+	return 0;
+}
+
+static
+rc_t CC meta_attr_write_I32(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+) {
+    self_t *self = Self;
+    int32_t value = ((const int32_t *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    rc_t rc = 0;
+    
+    assert(argv[0].u.data.elem_count == 1);
+    
+    rc = KDataBufferResize(rslt->data, 1);
+    if (rc)
+        return rc;
+    
+    *(int32_t *)rslt->data->base = value;
+    rc = meta_attr_write_fmt(self, "%d", value);
+    if (rc)
+        return rc;
+    
+    rslt->elem_count = 1;
+    
+	return 0;
+}
+
+static
+rc_t CC meta_attr_write_U32(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+) {
+    self_t *self = Self;
+    uint32_t value = ((const uint32_t *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    rc_t rc = 0;
+    
+    assert(argv[0].u.data.elem_count == 1);
+    
+    rc = KDataBufferResize(rslt->data, 1);
+    if (rc)
+        return rc;
+    
+    *(uint32_t *)rslt->data->base = value;
+    rc = meta_attr_write_fmt(self, "%u", value);
+    if (rc)
+        return rc;
+    
+    rslt->elem_count = 1;
+    
+	return 0;
+}
+
+static
+rc_t CC meta_attr_write_I64(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+) {
+    self_t *self = Self;
+    int64_t value = ((const int64_t *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    rc_t rc = 0;
+    
+    assert(argv[0].u.data.elem_count == 1);
+    
+    rc = KDataBufferResize(rslt->data, 1);
+    if (rc)
+        return rc;
+    
+    *(int64_t *)rslt->data->base = value;
+    rc = meta_attr_write_fmt(self, "%ld", value);
+    if (rc)
+        return rc;
+    
+    rslt->elem_count = 1;
+    
+	return 0;
+}
+
+static
+rc_t CC meta_attr_write_U64(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+) {
+    self_t *self = Self;
+    uint64_t value = ((const uint64_t *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    rc_t rc = 0;
+    
+    assert(argv[0].u.data.elem_count == 1);
+    
+    rc = KDataBufferResize(rslt->data, 1);
+    if (rc)
+        return rc;
+    
+    *(uint64_t *)rslt->data->base = value;
+    rc = meta_attr_write_fmt(self, "%lu", value);
+    if (rc)
+        return rc;
+    
+    rslt->elem_count = 1;
+    
+	return 0;
+}
+
+static
+rc_t CC meta_attr_write_F32(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+) {
+    self_t *self = Self;
+    float value = ((const float *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    rc_t rc = 0;
+    
+    assert(argv[0].u.data.elem_count == 1);
+    
+    rc = KDataBufferResize(rslt->data, 1);
+    if (rc)
+        return rc;
+    
+    *(float *)rslt->data->base = value;
+    rc = meta_attr_write_fmt(self, "%.8e", value);
+    if (rc)
+        return rc;
+    
+    rslt->elem_count = 1;
+    
+	return 0;
+}
+
+static
+rc_t CC CC meta_attr_write_F64(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+) {
+    self_t *self = Self;
+    double value = ((const double *)argv[0].u.data.base)[argv[0].u.data.first_elem];
+    rc_t rc = 0;
+    
+    assert(argv[0].u.data.elem_count == 1);
+    
+    rc = KDataBufferResize(rslt->data, 1);
+    if (rc)
+        return rc;
+    
+    *(double *)rslt->data->base = value;
+    rc = meta_attr_write_fmt(self, "%.16e", value);
+    if (rc)
+        return rc;
+    
+    rslt->elem_count = 1;
+    
+	return 0;
+}
+
+/* 
+ */
+VTRANSFACT_BUILTIN_IMPL(meta_attr_write, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+    self_t *self;
+    /* bool variable = false; */
+    rc_t ( CC * var_row_func )(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+                         );
+    
+    switch (dp->argv[0].desc.domain) {
+    case vtdBool:
+        var_row_func = meta_attr_write_bool;
+        break;
+    case vtdInt:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+            var_row_func = meta_attr_write_I8;
+            break;
+        case 16:
+            var_row_func = meta_attr_write_I16;
+            break;
+        case 32:
+            var_row_func = meta_attr_write_I32;
+            break;
+        case 64:
+            var_row_func = meta_attr_write_I64;
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+        }
+        break;
+    case vtdUint:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+            var_row_func = meta_attr_write_U8;
+            break;
+        case 16:
+            var_row_func = meta_attr_write_U16;
+            break;
+        case 32:
+            var_row_func = meta_attr_write_U32;
+            break;
+        case 64:
+            var_row_func = meta_attr_write_U64;
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+        }
+        break;
+    case vtdFloat:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 32:
+            var_row_func = meta_attr_write_F32;
+            break;
+        case 64:
+            var_row_func = meta_attr_write_F64;
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+        }
+        break;
+    case vtdAscii:
+        /* variable = true; */
+        var_row_func = meta_attr_write_ascii;
+        break;
+    default:
+        return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+    }
+    
+	self = calloc(1, sizeof *self + cp->argv[1].count);
+	if (self == NULL)
+		rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    else
+    {
+        KMetadata *meta;
+        strcpy(self->name, cp->argv[1].data.ascii);
+        rc = VTableOpenMetadataUpdate((VTable *)info->tbl, &meta);
+        if (rc == 0) {
+            rc = KMetadataOpenNodeUpdate(meta, &self->node, "%s", cp->argv[0].data.ascii);
+            KMetadataRelease(meta);
+            if (rc == 0) {
+                rslt->self = self;
+                rslt->whack = self_whack;
+                        
+                rslt->variant = vftNonDetRow;
+                rslt->u.ndf = var_row_func;
+                        
+                return 0;
+            }
+        }
+        self_whack(self);
+	}
+
+	return rc;
+}
diff --git a/libs/vdb/meta-read.c b/libs/vdb/meta-read.c
new file mode 100644
index 0000000..6876d13
--- /dev/null
+++ b/libs/vdb/meta-read.c
@@ -0,0 +1,140 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include "schema-priv.h"
+#include "xform-priv.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+typedef struct self_t {
+    const KMDataNode *node;
+    void ( * byte_swap ) ( void *dst, const void *src, uint64_t count );
+} self_t;
+
+static void CC self_whack( void *vp ) {
+    self_t *self = vp;
+    
+    KMDataNodeRelease( self->node );
+    free( vp );
+}
+
+static
+rc_t CC meta_read_func(
+                     void *Self,
+                     const VXformInfo *info,
+                     int64_t row_id,
+                     VRowResult *rslt,
+                     uint32_t argc,
+                     const VRowData argv[]
+) {
+    self_t *self = Self;
+    size_t length;
+    size_t read;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeRead(self->node, 0, 0, 0, &read, &length);
+    if (rc == 0) {
+        rslt->data->elem_bits = 8;
+        rslt->data->elem_count = 0; /* no usable data */
+        rc = KDataBufferResize( rslt->data, length );
+        if (rc)
+            return rc;
+        
+        rc = KMDataNodeRead( self->node, 0, rslt->data->base, length, &length, 0 );
+        if (rc == 0) {
+            rc = KDataBufferCast(rslt->data, rslt->data, rslt->elem_bits, true);
+            if (rc == 0) {
+                if (self->byte_swap)
+                    self->byte_swap(rslt->data->base, rslt->data->base, rslt->data->elem_count);
+                rslt->elem_count = rslt->data->elem_count;
+            }
+        }
+    }
+    return rc;
+}
+
+/* 
+ function < type T > T meta:read #1.0 < ascii node, * bool deterministic > ();
+ */
+VTRANSFACT_BUILTIN_IMPL ( meta_read, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+    self_t *self;
+    SDatatype *sdt;
+    bool need_byte_swap;
+    bool deterministic = true;
+    
+    if (cp->argc > 1)
+        deterministic = cp->argv[1].data.b[0];
+        
+    sdt = VSchemaFindTypeid(info->schema, info->fdesc.fd.td.type_id);
+    assert(sdt != NULL);
+    
+	self = calloc(1, sizeof(self_t));
+	if (self == NULL)
+		rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    else
+    {
+        const KMetadata *meta;
+        
+        rc = VTableOpenMetadataRead(info->tbl, &meta);
+        if (rc == 0) {
+            rc = KMetadataOpenNodeRead(meta, &self->node, "%.*s", cp->argv[0].count, cp->argv[0].data.ascii);
+            KMetadataRelease(meta);
+            if (rc == 0) {
+                KMDataNodeByteOrder(self->node, &need_byte_swap);
+                if (need_byte_swap)
+                    self->byte_swap = sdt->byte_swap;
+                
+                rslt->self = self;
+                rslt->whack = self_whack;
+                
+                rslt->variant = deterministic ? vftRow : vftNonDetRow;
+                rslt->u.ndf = meta_read_func;
+                
+                return 0;
+            }
+        }
+        self_whack(self);
+	}
+    return rc;
+}
diff --git a/libs/vdb/meta-value.c b/libs/vdb/meta-value.c
new file mode 100644
index 0000000..c511b74
--- /dev/null
+++ b/libs/vdb/meta-value.c
@@ -0,0 +1,381 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+#include "xform-priv.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+typedef struct self_t {
+    const KMDataNode *node;
+    KDataBuffer value;
+} self_t;
+
+static void CC self_whack( void *vp ) {
+    self_t *self = vp;
+    
+    KMDataNodeRelease( self->node );
+    KDataBufferWhack( &self->value );
+    free( vp );
+}
+
+static
+rc_t CC meta_value_U8(
+                   void *Self,
+                   const VXformInfo *info,
+                   int64_t row_id,
+                   VRowResult *rslt,
+                   uint32_t argc,
+                   const VRowData argv[]
+) {
+    self_t *self = Self;
+    uint64_t value;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAsU64(self->node, &value);
+    if (rc == 0) {
+        ((uint8_t *)self->value.base)[0] = (uint8_t)value;
+        rslt->elem_bits = 8;
+        rslt->elem_count = 1;
+        KDataBufferWhack(rslt->data);
+        rc = KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    }
+    return rc;
+}
+
+static
+rc_t CC meta_value_U16(
+                   void *Self,
+                   const VXformInfo *info,
+                   int64_t row_id,
+                   VRowResult *rslt,
+                   uint32_t argc,
+                   const VRowData argv[]
+) {
+    self_t *self = Self;
+    uint64_t value;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAsU64(self->node, &value);
+    if (rc == 0) {
+        ((uint16_t *)self->value.base)[0] = (uint16_t)value;
+        rslt->elem_bits = 16;
+        rslt->elem_count = 1;
+        KDataBufferWhack(rslt->data);
+        rc = KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    }
+    return rc;
+}
+
+static
+rc_t CC meta_value_U32(
+                   void *Self,
+                   const VXformInfo *info,
+                   int64_t row_id,
+                   VRowResult *rslt,
+                   uint32_t argc,
+                   const VRowData argv[]
+) {
+    self_t *self = Self;
+    uint64_t value;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAsU64(self->node, &value);
+    if (rc == 0) {
+        ((uint32_t *)self->value.base)[0] = (uint32_t)value;
+        rslt->elem_bits = 32;
+        rslt->elem_count = 1;
+        KDataBufferWhack(rslt->data);
+        rc = KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    }
+    return rc;
+}
+
+static
+rc_t CC meta_value_U64(
+                   void *Self,
+                   const VXformInfo *info,
+                   int64_t row_id,
+                   VRowResult *rslt,
+                   uint32_t argc,
+                   const VRowData argv[]
+) {
+    self_t *self = Self;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAsU64(self->node, (uint64_t *)self->value.base);
+    if (rc == 0) {
+        rslt->elem_bits = 64;
+        rslt->elem_count = 1;
+        KDataBufferWhack(rslt->data);
+        rc = KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    }
+    return rc;
+}
+
+
+static
+rc_t CC meta_value_I8(
+                   void *Self,
+                   const VXformInfo *info,
+                   int64_t row_id,
+                   VRowResult *rslt,
+                   uint32_t argc,
+                   const VRowData argv[]
+) {
+    self_t *self = Self;
+    int64_t value;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAsI64(self->node, &value);
+    if (rc == 0) {
+        ((int8_t *)self->value.base)[0] = (int8_t)value;
+        rslt->elem_bits = 8;
+        rslt->elem_count = 1;
+        KDataBufferWhack(rslt->data);
+        rc = KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    }
+    return rc;
+}
+
+static
+rc_t CC meta_value_I16(
+                    void *Self,
+                    const VXformInfo *info,
+                    int64_t row_id,
+                    VRowResult *rslt,
+                    uint32_t argc,
+                    const VRowData argv[]
+) {
+    self_t *self = Self;
+    int64_t value;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAsI64(self->node, &value);
+    if (rc == 0) {
+        ((int16_t *)self->value.base)[0] = (int16_t)value;
+        rslt->elem_bits = 16;
+        rslt->elem_count = 1;
+        KDataBufferWhack(rslt->data);
+        rc = KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    }
+    return rc;
+}
+
+static
+rc_t CC meta_value_I32(
+                    void *Self,
+                    const VXformInfo *info,
+                    int64_t row_id,
+                    VRowResult *rslt,
+                    uint32_t argc,
+                    const VRowData argv[]
+) {
+    self_t *self = Self;
+    int64_t value;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAsI64(self->node, &value);
+    if (rc == 0) {
+        ((int32_t *)self->value.base)[0] = (int32_t)value;
+        rslt->elem_bits = 32;
+        rslt->elem_count = 1;
+        KDataBufferWhack(rslt->data);
+        rc = KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    }
+    return rc;
+}
+
+static
+rc_t CC meta_value_I64(
+                    void *Self,
+                    const VXformInfo *info,
+                    int64_t row_id,
+                    VRowResult *rslt,
+                    uint32_t argc,
+                    const VRowData argv[]
+) {
+    self_t *self = Self;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAsI64(self->node, (int64_t *)self->value.base);
+    if (rc == 0) {
+        rslt->elem_bits = 64;
+        rslt->elem_count = 1;
+        KDataBufferWhack(rslt->data);
+        rc = KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    }
+    return rc;
+}
+
+static
+rc_t CC meta_value_F32(
+                    void *Self,
+                    const VXformInfo *info,
+                    int64_t row_id,
+                    VRowResult *rslt,
+                    uint32_t argc,
+                    const VRowData argv[]
+) {
+    self_t *self = Self;
+    double value;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAsF64(self->node, &value);
+    if (rc == 0) {
+        ((float *)self->value.base)[0] = (float)value;
+        rslt->elem_bits = 32;
+        rslt->elem_count = 1;
+        KDataBufferWhack(rslt->data);
+        rc = KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    }
+    return rc;
+}
+
+static
+rc_t CC meta_value_F64(
+                    void *Self,
+                    const VXformInfo *info,
+                    int64_t row_id,
+                    VRowResult *rslt,
+                    uint32_t argc,
+                    const VRowData argv[]
+) {
+    self_t *self = Self;
+    rc_t rc = 0;
+    
+    rc = KMDataNodeReadAsF64(self->node, (double *)self->value.base);
+    if (rc == 0) {
+        rslt->elem_bits = 64;
+        rslt->elem_count = 1;
+        KDataBufferWhack(rslt->data);
+        rc = KDataBufferSub(&self->value, rslt->data, 0, UINT64_MAX);
+    }
+    return rc;
+}
+
+/* 
+ function < type T > T meta:value #1.0 < ascii node, * bool deterministic > ();
+ */
+VTRANSFACT_BUILTIN_IMPL(meta_value, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+    self_t *self;
+    bool deterministic = true;
+    
+    if (cp->argc > 1)
+        deterministic = cp->argv[1].data.b[0];
+
+    self = calloc(1, sizeof(self_t));
+	if (self) {
+        rc = KDataBufferMake(&self->value, info->fdesc.desc.intrinsic_bits, 1);
+        if (rc == 0) {
+            const KMetadata *meta;
+            
+            rc = VTableOpenMetadataRead(info->tbl, &meta);
+            if (rc == 0) {
+                rc = KMetadataOpenNodeRead(meta, &self->node, "%.*s", cp->argv[0].count, cp->argv[0].data.ascii);
+                KMetadataRelease(meta);
+                if (rc == 0) {
+                    rslt->self = self;
+                    rslt->whack = self_whack;
+                    
+                    rslt->variant = deterministic ? vftRow : vftNonDetRow;
+                    switch (info->fdesc.desc.domain) {
+                    case vtdFloat:
+                        switch (info->fdesc.desc.intrinsic_bits) {
+                        case 32:
+                            rslt->u.ndf = meta_value_F32;
+                            return 0;
+                        case 64:
+                            rslt->u.ndf = meta_value_F64;
+                            return 0;
+                        default:
+                            break;
+                        }
+                        break;
+                    case vtdInt:
+                        switch (info->fdesc.desc.intrinsic_bits) {
+                        case 8:
+                            rslt->u.ndf = meta_value_I8;
+                            return 0;
+                        case 16:
+                            rslt->u.ndf = meta_value_I16;
+                            return 0;
+                        case 32:
+                            rslt->u.ndf = meta_value_I32;
+                            return 0;
+                        case 64:
+                            rslt->u.ndf = meta_value_I64;
+                            return 0;
+                        default:
+                            break;
+                        }
+                        break;
+                    case vtdUint:
+                        switch (info->fdesc.desc.intrinsic_bits) {
+                        case 8:
+                            rslt->u.ndf = meta_value_U8;
+                            return 0;
+                        case 16:
+                            rslt->u.ndf = meta_value_U16;
+                            return 0;
+                        case 32:
+                            rslt->u.ndf = meta_value_U32;
+                            return 0;
+                        case 64:
+                            rslt->u.ndf = meta_value_U64;
+                            return 0;
+                        default:
+                            break;
+                        }
+                        break;
+                    default:
+                        break;
+                    }
+                    rc = RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+                }
+            }
+        }
+        self_whack(self);
+	}
+	else
+		rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    return rc;
+}
diff --git a/libs/vdb/meta-write.c b/libs/vdb/meta-write.c
new file mode 100644
index 0000000..49edf17
--- /dev/null
+++ b/libs/vdb/meta-write.c
@@ -0,0 +1,155 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+#include "schema-priv.h"
+#include "xform-priv.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+typedef struct self_t {
+    KMDataNode *node;
+    void ( * byte_swap ) ( void *dst, const void *src, uint64_t count );
+} self_t;
+
+static void CC self_whack( void *vp ) {
+    self_t *self = vp;
+    
+    KMDataNodeRelease( self->node );
+    free( vp );
+}
+
+static
+rc_t CC meta_write_func(
+                     void *Self,
+                     const VXformInfo *info,
+                     int64_t row_id,
+                     VRowResult *rslt,
+                     uint32_t argc,
+                     const VRowData argv[]
+) {
+    self_t *self = Self;
+
+    /* pointer to input page */
+    const uint8_t *sbuf = argv [ 0 ] . u . data . base;
+
+    /* bit offset to first element in row */
+    bitsz_t offset = (argv[0].u.data.first_elem * argv[0].u.data.elem_bits);
+
+    /* the number of bits in this row */
+    bitsz_t blen = argv[0].u.data.elem_count * argv[0].u.data.elem_bits;
+
+    /* row length in bytes */
+    size_t length = (blen + 7) >> 3;
+
+    /* set output buffer size */
+    rc_t rc = KDataBufferCast ( rslt -> data, rslt -> data, rslt -> elem_bits, true );
+    if ( rc == 0 )
+        rc = KDataBufferResize ( rslt -> data, (uint32_t)( blen / rslt -> elem_bits ) );
+    if ( rc != 0 )
+        return rc;
+
+    /* copy data: if byte-swapping, then data are at least 16-bit aligned */
+    if ( ( blen & 7 ) != 0 )
+    {
+        /* ensure trailing bits of buffer are zero */
+        ( ( uint8_t* ) rslt -> data -> base ) [ length - 1 ] = 0;
+        bitcpy ( rslt -> data -> base, 0, sbuf, offset, blen );
+    }
+    else if ( self -> byte_swap != NULL )
+    {
+        ( * self -> byte_swap ) ( rslt -> data -> base,
+            & sbuf [ offset >> 3 ], argv[0].u.data.elem_count );
+    }
+    else
+    {
+        memmove ( rslt -> data -> base, & sbuf [ offset >> 3 ], length );
+    }
+
+    /* write row to metadata-node */
+    rc = KMDataNodeWrite ( self -> node, rslt -> data -> base, length );
+    if ( rc == 0 )
+        rslt -> elem_count = rslt -> data -> elem_count;
+
+    return rc;
+}
+
+/* meta:write
+ */
+VTRANSFACT_BUILTIN_IMPL(meta_write, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    self_t *self;
+    bool need_byte_swap;
+    
+    SDatatype *sdt = VSchemaFindTypeid(info->schema, dp->argv[0].fd.td.type_id);
+    assert(sdt != NULL);
+    
+	self = calloc(1, sizeof(self_t));
+	if (self == NULL)
+		rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    else
+    {
+        KMetadata *meta;
+
+        /* even if we cast away const on the table,
+           kdb will still prevent us from doing so if
+           it's actually read-only */
+        rc = VTableOpenMetadataUpdate((VTable *)info->tbl, &meta);
+        if (rc == 0) {
+            rc = KMetadataOpenNodeUpdate(meta, &self->node, "%s", cp->argv[0].data.ascii);
+            KMetadataRelease(meta);
+            if (rc == 0) {
+                KMDataNodeByteOrder(self->node, &need_byte_swap);
+                if (need_byte_swap)
+                    self->byte_swap = sdt->byte_swap;
+                
+                rslt->self = self;
+                rslt->whack = self_whack;
+                
+                rslt->variant = vftNonDetRow;
+                rslt->u.ndf = meta_write_func;
+                
+                return 0;
+            }
+        }
+        self_whack(self);
+	}
+
+	return rc;
+}
diff --git a/libs/vdb/page-map.c b/libs/vdb/page-map.c
new file mode 100644
index 0000000..d6ff298
--- /dev/null
+++ b/libs/vdb/page-map.c
@@ -0,0 +1,1734 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#define TRACK_REFERENCES 0
+
+#include <vdb/extern.h>
+#include <klib/rc.h>
+#include <atomic.h>
+
+#include <bitstr.h>
+
+#include <klib/pack.h>
+#include <klib/vlen-encode.h>
+#include <sysalloc.h>
+#include "page-map.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <stdio.h>
+
+#include <zlib.h>
+
+/* Page maps describe the layout of rows within a blob.
+ * The data within a page map is run-length encoded.
+ * I.e. if two identical rows are stored sequentially 
+ */
+
+
+
+#define VALIDATE_PAGEMAPS 0
+#define PAGEMAP_STATISTICS 0
+#if PAGEMAP_STATISTICS
+static struct {
+    size_t currentFootprint;
+    size_t maxFootprint;
+    size_t currentWaste;
+    size_t maxWaste;
+    unsigned alive;
+    unsigned maxAlive;
+    unsigned create;
+    unsigned createStatic;
+    unsigned createFixedRow;
+    unsigned createSingle;
+    unsigned grows;
+    unsigned expands;
+    unsigned expandCalls;
+    unsigned appends;
+} pm_stats;
+#endif
+
+elem_count_t PageMapLastLength(const PageMap *cself) {
+    return cself->leng_recs > 0 ? cself->length[cself->leng_recs - 1] : 0;
+}
+
+
+
+static rc_t PageMapRegionExpand(PageMap *self,pm_expand_region_type_t TYPE,row_count_t numrows,elem_count_t length,elem_count_t data_offset)
+{
+	rc_t rc;
+	if(   self->exp_rgn_last == 0           /** not started **/
+	   || self->exp_rgn_last->type != TYPE 	/** another type **/
+           || (TYPE == PM_REGION_EXPAND_SAMEDATA && self->exp_rgn_last->data_offset != data_offset)  /** not the same data */
+           || (TYPE!=PM_REGION_EXPAND_FULL && self->exp_rgn_last->length != length) /** all non-full types are length-dependant**/
+		){ /** New region **/
+		self->exp_rgn_cnt++;
+		rc = KDataBufferResize(&self->istorage, self->exp_rgn_cnt);
+		if(rc) return rc;
+
+		self->exp_rgn_last = (PageMapRegion *)self->istorage.base + self->exp_rgn_cnt -1;
+		self->exp_rgn_last->type=TYPE;
+		self->exp_rgn_last->start_row=self->exp_row_last;
+		self->exp_rgn_last->data_offset = data_offset;
+		self->exp_rgn_last->length = length;
+		self->exp_rgn_last->numrows = numrows;
+		self->exp_rgn_last->expanded = false;
+ 	} else { /** continue with existing region **/
+		if(TYPE == PM_REGION_EXPAND_FULL){
+			row_count_t i;
+			elem_count_t *base;
+			uint64_t old_cnt = self->dstorage.elem_count;
+			uint64_t new_cnt = old_cnt + 2*numrows;
+			if(!self->exp_rgn_last->expanded){/*** need to start expansion ***/
+				new_cnt += 2*self->exp_rgn_last->numrows; /*** need to catch up **/
+				rc = KDataBufferResize(&self->dstorage, new_cnt);
+				if(rc) return rc;
+				base = (elem_count_t *)self->dstorage.base + old_cnt;
+				for(i=0;i<self->exp_rgn_last->numrows;i++){
+					base[2*i] = self->exp_rgn_last->length;
+					base[2*i+1] = self->exp_rgn_last->data_offset;
+				}
+				self->exp_rgn_last->data_offset = old_cnt;
+				self->exp_rgn_last->expanded=true;
+			} else {
+				rc = KDataBufferResize(&self->dstorage, new_cnt);
+				if(rc) return rc;
+				base = (elem_count_t *)self->dstorage.base + self->exp_rgn_last->data_offset;
+			}
+			base += 2*self->exp_rgn_last->numrows;
+			for(i=0;i<numrows;i++){
+				base[2*i]   = length;
+				base[2*i+1] = data_offset;
+			}
+		} else if(TYPE == PM_REGION_EXPAND_SAMELEN){
+			 row_count_t i;
+                        elem_count_t *base;
+                        uint64_t old_cnt = self->dstorage.elem_count;
+                        uint64_t new_cnt = old_cnt + numrows;
+                        if(!self->exp_rgn_last->expanded){/*** need to start expansion ***/
+                                new_cnt += self->exp_rgn_last->numrows; /*** need to catch up **/
+                                rc = KDataBufferResize(&self->dstorage, new_cnt);
+                                if(rc) return rc;
+                                base = (elem_count_t *)self->dstorage.base + old_cnt;
+                                for(i=0;i<self->exp_rgn_last->numrows;i++){
+                                        base[i] = self->exp_rgn_last->data_offset;
+                                }
+                                self->exp_rgn_last->data_offset = old_cnt;
+				self->exp_rgn_last->expanded=true;
+                        } else {
+				rc = KDataBufferResize(&self->dstorage, new_cnt);
+				if(rc) return rc;
+                                base = (elem_count_t *)self->dstorage.base + self->exp_rgn_last->data_offset;
+                        }
+			base += self->exp_rgn_last->numrows;
+                        for(i=0;i<numrows;i++){
+                                base[i]   = data_offset;
+                        }
+		}
+		self->exp_rgn_last->numrows += numrows;
+	}
+	return 0;
+}
+
+rc_t PageMapPreExpandFull(const PageMap *cself, row_count_t upto) /*** mostly for use as a temporary pagemap ***/
+{
+	rc_t    rc=0;
+	if(upto > 0){
+		PageMap *self = (PageMap *)cself;
+		assert(self->exp_rgn_last == 0);
+		rc = KDataBufferResize(&self->istorage, 1); /** one and only one pagemap **/
+		if(rc) return rc;
+		
+		self->exp_rgn_last = (PageMapRegion *)self->istorage.base + self->exp_rgn_cnt;
+		self->exp_rgn_cnt = ++self->exp_dr_last;
+
+		self->exp_rgn_last->data_offset = 0;
+		rc=KDataBufferResize(&self->dstorage, upto*2);
+		if(rc) return rc;
+		self->exp_rgn_last->start_row   = 0;
+		self->exp_rgn_last->numrows = 0;
+		self->exp_rgn_last->type = PM_REGION_EXPAND_FULL;
+		self->exp_rgn_last->expanded = true;
+		self->pre_exp_row_count = upto;
+	}
+	return rc;
+}
+
+rc_t PageMapExpandFull(const PageMap *cself)
+{
+	rc_t rc;
+	PageMap *self = (PageMap *)cself;
+	if(self->leng_recs == 1){ 
+		if(   self->data_recs == 1  /* static */
+                   || self->random_access ){ 
+			return 0;
+		} else if(self->data_recs == self->row_count && !self->random_access){ /** equidistant **/
+			rc=PageMapRegionExpand(self,PM_REGION_EXPAND_EQUIDISTANT,self->row_count,self->length[0],0);
+			if(rc) return rc;
+			self->exp_data_offset_last += self->row_count*self->length[0];
+			self->exp_row_last = self->row_count ;
+			self->exp_dr_last =  self->row_count;
+			self->exp_lr_last =  1;
+			self->exp_lr_used =  self->row_count;
+			return  0;
+		}
+        }
+	return 0;
+/*** OTHER VARIANTS  ***
+	return PageMapExpand(cself, cself->row_count);
+	return PageMapExpand(cself, cself->row_count < 1024?cself->row_count:1024);
+******************/
+}
+
+rc_t PageMapExpand(const PageMap *cself, row_count_t upto)
+{
+	rc_t	rc;
+        PageMap *self = (PageMap *)cself;
+#define LENG_RUN_TRIGGER 8
+#define DATA_RUN_TRIGGER 8
+#define EQUI_RUN_TRIGGER 8
+	if( self->leng_recs == 1 && self->row_count > self->data_recs*12/10 && !self->random_access){ /*** Shortcut to make tight loop ***/
+
+		if(self->exp_rgn_last == 0){
+			rc = KDataBufferResize(&self->istorage, self->data_recs);
+			if(rc) return rc;
+		}
+		self->exp_rgn_last = (PageMapRegion *)self->istorage.base + self->exp_rgn_cnt;
+		while(self->exp_dr_last < self->data_recs && self->exp_row_last <= upto + 128){
+			self->exp_rgn_last->start_row   = self->exp_row_last;
+			self->exp_rgn_last->data_offset = self->length[0]*self->exp_dr_last;
+			self->exp_rgn_last->numrows = self->data_run?self->data_run[self->exp_dr_last]:1;
+			self->exp_row_last += self->data_run?self->data_run[self->exp_dr_last]:1;
+			self->exp_rgn_last->type = PM_REGION_EXPAND_SAMEDATA;
+			self->exp_rgn_last->length      = self->length[0];
+			self->exp_rgn_last->expanded = false;
+			self->exp_dr_last  ++;
+			self->exp_rgn_last ++;
+		}
+		self->exp_rgn_cnt = self->exp_dr_last;
+	} else for(;self->exp_lr_last < self->leng_recs && self->exp_dr_last < self->data_recs && self->exp_row_last <= upto + 128;){
+		row_count_t leng_run=self->leng_run[self->exp_lr_last] - self->exp_lr_used;
+		elem_count_t length =self->length[self->exp_lr_last];
+		if(leng_run == 0) {
+			self->exp_lr_last++;
+			self->exp_lr_used=0;
+			continue;
+		}
+		if(leng_run >= LENG_RUN_TRIGGER && !self->random_access){
+			while(leng_run > 0 && self->exp_row_last <= upto + 128){
+				row_count_t data_run=self->data_run?self->data_run[self->exp_dr_last]:1;
+				assert(leng_run >= data_run);/** data runs should have the same lengths **/
+				assert(data_run > 0);
+				if(data_run >= DATA_RUN_TRIGGER){
+					rc=PageMapRegionExpand(self,PM_REGION_EXPAND_SAMEDATA,data_run, length,self->exp_data_offset_last);
+					if(rc) return rc;
+					assert(leng_run >= data_run);
+					leng_run -= data_run;
+					self->exp_lr_used += data_run;
+					self->exp_row_last+= data_run; 
+					self->exp_dr_last++;
+					self->exp_data_offset_last += length;
+				} else if( /**** quick check if all remaining rows are equidistant ****/
+					     self->exp_lr_last == self->leng_recs - 1 /*** last leng_run ***/
+					  && self->row_count - self->exp_row_last == self->data_recs - self->exp_dr_last /*** all remaining data_runs are 1 ***/
+					  && self->row_count - self->exp_row_last > EQUI_RUN_TRIGGER){ 
+						assert( leng_run == self->row_count - self->exp_row_last);
+						assert(data_run == 1);
+						rc=PageMapRegionExpand(self,PM_REGION_EXPAND_EQUIDISTANT,leng_run, length,self->exp_data_offset_last);
+						if(rc) return rc;
+						self->exp_data_offset_last += leng_run*length;
+						self->exp_row_last = self->row_count ;
+						self->exp_dr_last =  self->data_recs;
+						self->exp_lr_last = self->leng_recs;
+						self->exp_lr_used += leng_run;
+						leng_run = 0;
+						
+				} else {
+					if( data_run == 1){
+						row_count_t data_run_unique;
+						for( data_run_unique =0;
+						     data_run_unique < leng_run && ((self->data_run==NULL)||self->data_run[self->exp_dr_last+data_run_unique]==1);
+						     data_run_unique++){}
+						if(data_run_unique >= EQUI_RUN_TRIGGER){
+							rc=PageMapRegionExpand(self,PM_REGION_EXPAND_EQUIDISTANT,data_run_unique,length,self->exp_data_offset_last);
+							self->exp_dr_last += data_run_unique;
+							self->exp_data_offset_last += data_run_unique*length;
+							assert(leng_run >= data_run_unique);
+							leng_run -= data_run_unique;
+						        self->exp_lr_used  += data_run_unique;
+							self->exp_row_last += data_run_unique;
+						} else while(data_run_unique){
+							rc=PageMapRegionExpand(self,PM_REGION_EXPAND_SAMELEN,data_run,length,self->exp_data_offset_last);
+							if(rc) return rc;
+							assert(leng_run > 0);
+							leng_run --;
+							self->exp_lr_used ++;
+							self->exp_row_last++;
+							self->exp_dr_last++;
+							self->exp_data_offset_last += length;
+							data_run_unique--;
+						}
+					} else {
+						rc=PageMapRegionExpand(self,PM_REGION_EXPAND_SAMELEN,data_run,length,self->exp_data_offset_last);
+						if(rc) return rc;
+						assert(leng_run >= data_run);
+						leng_run -= data_run;
+						self->exp_lr_used += data_run;
+						self->exp_row_last+= data_run;
+						self->exp_dr_last++;
+						self->exp_data_offset_last += length;
+					}
+				}
+			}
+			assert(self->exp_row_last <= self->row_count);
+		} else {
+			while(leng_run > 0){
+				row_count_t data_run=cself->data_run?cself->data_run[self->exp_dr_last]:1;
+				assert(leng_run >= data_run);/** data runs should have the same lengths **/
+				if(self->random_access){
+					rc=PageMapRegionExpand(self,PM_REGION_EXPAND_FULL,data_run,length,self->data_offset[self->exp_row_last]);
+					self->exp_data_offset_last  = self->data_offset[self->exp_row_last] + length;
+				} else {
+					rc=PageMapRegionExpand(self,PM_REGION_EXPAND_FULL,data_run,length,self->exp_data_offset_last);
+					self->exp_data_offset_last += length;
+				}
+				if(rc) return rc;
+				self->exp_row_last += data_run;
+				assert(leng_run >= data_run);
+				leng_run -= data_run;
+				self->exp_lr_used += data_run;
+				self->exp_dr_last++;
+			}
+		}
+	}
+	return 0;
+}
+
+static rc_t PageMapFindRegion(const PageMap *cself,uint64_t row,PageMapRegion **pmr)
+{
+	/*** in PageMap rows are 0-based **/
+	rc_t	rc;
+	pm_size_t left,right,i_rgn;
+	if(row >= cself->row_count )
+		return  RC (rcVDB, rcPagemap, rcSearching, rcRow, rcNotFound );
+	if(cself -> exp_row_last <= row){
+		rc=PageMapExpand(cself,row);
+		if(rc) return rc;
+	}
+
+	if(cself->exp_rgn_cnt > 1){
+		i_rgn = cself->i_rgn_last;
+		left = 0;
+		right = cself->exp_rgn_cnt - 1;
+		while(right > left){
+			PageMapRegion*  rgn=  (PageMapRegion*)cself->istorage.base + i_rgn;
+			assert(i_rgn < cself->exp_rgn_cnt);
+			if(row < rgn->start_row){
+				right = i_rgn-1;
+				i_rgn  = (left + right) / 2;
+			} else if(row == rgn->start_row + rgn->numrows){ /*** special case for positive sequentual scans ***/
+				i_rgn++;
+			} else if(row > rgn->start_row + rgn->numrows){
+				left = i_rgn+1;
+				i_rgn =  (left + right + 1) / 2;
+			} else {
+				break;
+			}
+		}
+	} else {
+		i_rgn = 0;
+	}
+	{
+		PageMap *self = (PageMap *)cself;
+		self->i_rgn_last = i_rgn;
+		self->rgn_last = (PageMapRegion*)self->istorage.base+cself->i_rgn_last;
+	}
+	assert(cself->rgn_last->start_row <= row);
+	assert(cself->rgn_last->start_row + cself->rgn_last->numrows > row);
+	if(pmr) *pmr=(PageMapRegion*)cself->istorage.base + i_rgn;
+	return 0;
+}
+
+static rc_t PageMapRegionGetData(const PageMapRegion *cself,const elem_count_t *exp_base,uint64_t row,uint32_t * data_offset,uint32_t * data_length,uint32_t * repeat_count)
+{
+	if(row < cself->start_row || row >= cself->start_row + cself->numrows)
+		return  RC (rcVDB, rcPagemap, rcSearching, rcRow, rcNotFound );
+
+	if(data_offset != NULL || data_length != NULL || repeat_count != NULL){
+		if(!cself->expanded){
+			if(data_length) *data_length=cself->length;
+			if(data_offset){
+				*data_offset=cself->data_offset;
+				if(cself->type == PM_REGION_EXPAND_EQUIDISTANT){
+					*data_offset += cself->length * (row - cself->start_row);
+				}
+			}
+			if(repeat_count) {
+				if(cself->type == PM_REGION_EXPAND_EQUIDISTANT) *repeat_count=1;
+				else *repeat_count = cself->numrows + cself->start_row - row;
+			}
+		} else switch(cself->type){
+			case PM_REGION_EXPAND_FULL:
+				{
+					row_count_t  i = row - cself->start_row;
+					exp_base += cself->data_offset;
+					if(data_length)  *data_length = exp_base[2*i];
+					if(data_offset)  *data_offset = exp_base[2*i+1];
+					if(repeat_count){
+						int j;
+						for(j=i+1;   j<cself->numrows
+							  && exp_base[2*i]   == exp_base[2*j]
+							  && exp_base[2*i+1] == exp_base[2*j+1];j++){}
+						*repeat_count = j-i;
+					}
+				}
+				break;
+			case PM_REGION_EXPAND_SAMELEN:
+				if(data_length) *data_length=cself->length;
+				if(data_offset || repeat_count){
+					row_count_t  i = row - cself->start_row;
+					exp_base += cself->data_offset;
+					if(data_offset) *data_offset = exp_base[i];
+					if(repeat_count){
+						int j;
+						for(j=i+1;j<cself->numrows && exp_base[i] == exp_base[j];j++){}
+						*repeat_count = j-i;
+					}
+				}
+				break;
+			default: /*** should not happen to anything but 2 above **/
+				return RC (rcVDB, rcPagemap, rcSearching, rcData, rcInconsistent ); 
+		}
+	}
+	return 0;
+}
+
+/*** This is a heavy-weight function which gets data by integration all the time - useful for debugging ****/
+#if _HEAVY_PAGEMAP_DEBUGGING
+static rc_t PageMapGetData_HW(const PageMap *cself,uint64_t row,uint32_t * data_offset,uint32_t * data_length,uint32_t * repeat_count)
+{
+	if(row >= cself->row_count)
+		return  RC (rcVDB, rcPagemap, rcSearching, rcRow, rcNotFound );
+	if(data_offset != NULL || data_length != NULL || repeat_count != NULL){
+		uint64_t i,j,r;
+		uint32_t dto,dtl,dtr;
+		uint32_t leng_run,data_run;
+		r=dto=i=j=0;
+		leng_run=cself->leng_run[0];
+		while(1){
+			dtl  = cself->length[i];
+			data_run=cself->data_run?cself->data_run[j]:1;
+			j++;
+			r+= data_run;
+			if(r > row){
+				dtr = r - row;
+				 break;
+			}
+			dto += dtl;
+			leng_run -= data_run;
+			if(leng_run == 0){
+				i++;
+				leng_run=cself->leng_run[i];
+			}
+		}
+		if(data_length)   *data_length=dtl;
+		if(data_offset)   *data_offset=dto;
+		if(repeat_count)  *repeat_count=dtr;
+	}
+	return 0;
+}
+#endif
+
+/*** another function to help debugging ***/
+#if 0
+static int DEBUG_PageMapPrintSum(const PageMap *pm, uint32_t row)
+{
+	int i,r;
+	for(i=0,r=row; i < pm->data_recs && r > 0;r-=pm->data_run?pm->data_run[i]:1,i++){}
+	printf("Data recs= <%d>, rows_left = <%d>\n",i,r);
+	for(i=0,r=row; i < pm->leng_recs && r >0;r-=pm->leng_run[i++]){}
+	printf("Leng recs= <%d>, rows_left = <%d>\n",i,r);
+	return 0;
+}
+#endif
+
+rc_t PageMapFindRow(const PageMap *cself,uint64_t row,uint32_t * data_offset,uint32_t * data_length,uint32_t * repeat_count)
+{
+	rc_t	rc=0;
+	PageMapRegion *pmr;
+
+	if(cself->data_recs == 1){ /** static **/
+		if(repeat_count) *repeat_count = UINT32_MAX;
+		if(data_offset)  *data_offset = 0;
+		if(data_length)  *data_length = cself->length[0];
+		return 0;
+        }
+	if(cself->random_access && cself->leng_recs == 1){
+		if(row >= cself->data_recs)
+			return RC(rcVDB, rcPagemap, rcAccessing, rcRow, rcOutofrange);
+		if(data_length)  *data_length = cself->length[0];
+		if(data_offset)  *data_offset =  cself->data_offset[row];
+		if(repeat_count){
+			uint64_t i;
+			for( i=row+1, repeat_count[0]=1; i < cself->data_recs &&  cself->data_offset[i] == cself->data_offset[row]; i++, repeat_count[0]++ ){}
+		}
+		return 0;
+	}
+
+	rc = PageMapFindRegion(cself,row,&pmr);
+	if(rc) return rc;
+
+        rc = PageMapRegionGetData(pmr,cself->dstorage.base,row,data_offset,data_length,repeat_count);
+	if(rc) return rc;
+
+#if _HEAVY_PAGEMAP_DEBUGGING
+	{
+		uint32_t dto,dtl,dtr;
+		rc = PageMapGetData_HW(cself,row,&dto,&dtl,&dtr);
+		assert(rc == 0);
+		if(data_length) assert(dtl==*data_length);
+		if(data_offset) assert(dto==*data_offset);
+		if(repeat_count)  assert(dtr==*repeat_count);
+	}
+#endif
+	return 0;
+}
+
+LIB_EXPORT rc_t PageMapNewIterator(const PageMap *self, PageMapIterator *lhs, uint64_t first_row, uint64_t num_rows)
+{
+    rc_t rc;
+
+    if (first_row + num_rows > self->row_count)
+        num_rows = self->row_count - first_row;
+
+#if _DEBUGGING
+    if (self->data_recs > 1) {
+        assert(first_row == (row_count_t)first_row);
+        assert(num_rows == (row_count_t)num_rows);
+        assert(first_row + num_rows == (row_count_t)(first_row + num_rows));
+    }
+#endif
+    
+    memset(lhs, 0, sizeof(*lhs));
+
+#if _HEAVY_PAGEMAP_DEBUGGING
+    lhs->parent = self;
+#endif
+
+    lhs->last_row = first_row + num_rows;
+    lhs->cur_row = first_row;
+    if(self->data_recs == 1){
+	lhs->repeat_count  = (num_rows < UINT32_MAX)?num_rows:UINT32_MAX;
+	lhs->static_datalen = self->length[0];
+	return 0;
+    }
+    if(self->random_access && self->leng_recs == 1 && first_row < self->row_count){ /** simple random access - no explosion needed **/
+	lhs->static_datalen = self->length[0];
+	lhs->exp_base = ( elem_count_t ** )&self->data_offset;
+	if(lhs->last_row > self->row_count) lhs->last_row = self->row_count;
+	return 0;
+    }
+    if( self->exp_row_last < lhs->last_row){
+	    rc = PageMapExpand(self,lhs->last_row-1);
+	    if(rc) return rc;
+    }
+    rc = PageMapFindRow(self,first_row,NULL,NULL,NULL);
+    if(rc) return rc;
+    lhs->rgns    = (PageMapRegion**) &self->istorage.base;
+    lhs->exp_base = (elem_count_t**) &self->dstorage.base;
+    lhs->cur_rgn  = self->i_rgn_last;
+    lhs->cur_rgn_row = lhs->cur_row - (*lhs->rgns)[self->i_rgn_last].start_row;
+    assert(lhs->cur_rgn_row < (*lhs->rgns)[self->i_rgn_last].numrows);
+    return  0;
+}
+
+static PageMap *new_PageMap(void) {
+
+    PageMap *y;
+    y = malloc(sizeof(*y));
+    if (y) {
+	memset(y,0,sizeof(*y));
+        KRefcountInit(&y->refcount, 1, "PageMap", "new", "");
+	y->istorage.elem_bits = sizeof(PageMapRegion)*8;
+	y->dstorage.elem_bits = sizeof(elem_count_t)*8;
+    }
+    return y;
+}
+
+static PageMap *new_StaticPageMap(unsigned length, unsigned data) {
+    union {
+        PageMap pm;
+        row_count_t rcnt;
+        elem_count_t ecnt;
+    } *y;
+    size_t const sz = sizeof(*y)
+                    + sizeof(y->pm.length[0]) * length
+                    + sizeof(y->pm.leng_run[0]) * length
+                    + sizeof(y->pm.data_run[0]) * data;
+    
+    y = malloc(sz);
+    if (y) {
+#if PAGEMAP_STATISTICS
+        ++pm_stats.createStatic;
+        ++pm_stats.alive;
+        if (pm_stats.maxAlive < pm_stats.alive)
+            pm_stats.maxAlive = pm_stats.alive;
+        pm_stats.currentFootprint += sz;
+        if (pm_stats.maxFootprint < pm_stats.currentFootprint)
+            pm_stats.maxFootprint = pm_stats.currentFootprint;
+#endif
+        memset(&y->pm, 0, sizeof(y->pm));
+        KRefcountInit(&y->pm.refcount, 1, "PageMap", "new_Static", "");
+        y->pm.length = (elem_count_t *)&y[1];
+        y->pm.leng_run = (row_count_t *)&y->pm.length[length];
+        y->pm.data_run = &y->pm.leng_run[length];
+        y->pm.reserve_leng = length;
+        y->pm.reserve_data = data;
+	y->pm.istorage.elem_bits = sizeof(PageMapRegion)*8;
+	y->pm.dstorage.elem_bits = sizeof(elem_count_t)*8;
+    }
+    return &y->pm;
+}
+
+static
+rc_t PageMapGrow(PageMap *self, uint32_t new_reserve_leng, uint32_t new_reserve_data) {
+    uint32_t sz;
+    PageMap temp = *self;
+    uint32_t reserve_data = self->reserve_data;
+    uint32_t reserve_leng = self->reserve_leng;
+    rc_t rc;
+
+#if PAGEMAP_STATISTICS
+    ++pm_stats.grows;
+#endif
+    if (new_reserve_leng > (1UL << 31) || new_reserve_data > (1UL << 31))
+        return RC(rcVDB, rcPagemap, rcAllocating, rcParam, rcExcessive);
+    
+    if (reserve_leng == 0)
+        reserve_leng = 1;
+    if (reserve_data == 0)
+        reserve_data = 1;
+#define MIN_KBUF_RESERVE_SIZE 256  
+    while (reserve_leng < new_reserve_leng)
+        reserve_leng <<= 1;
+    if (reserve_leng < MIN_KBUF_RESERVE_SIZE) reserve_leng = MIN_KBUF_RESERVE_SIZE;
+    while (reserve_data < new_reserve_data)
+        reserve_data <<= 1;
+    if (reserve_data < MIN_KBUF_RESERVE_SIZE) reserve_data = MIN_KBUF_RESERVE_SIZE;
+
+    sz = reserve_leng * 2 + reserve_data;
+#if PAGEMAP_STATISTICS
+    pm_stats.currentFootprint -= KDataBufferMemorySize(&self->estorage);
+#endif
+    {
+        KDataBuffer new_buffer;
+        
+        rc = KDataBufferMake(&new_buffer, 8 * sizeof(uint32_t), sz);
+        if (rc)
+            return rc;
+#if PAGEMAP_STATISTICS
+        pm_stats.currentFootprint += KDataBufferMemorySize(&self->estorage);
+        if (pm_stats.maxFootprint < pm_stats.currentFootprint)
+            pm_stats.maxFootprint = pm_stats.currentFootprint;
+#endif
+        self->cstorage = new_buffer;
+    }
+    self->length = self->cstorage.base;
+    self->leng_run = self->length + reserve_leng;
+    self->data_run = self->leng_run + reserve_leng;
+    self->start_valid = 0;
+    
+    if (self->leng_recs > 0 && temp.length != NULL) {
+        memmove(self->length  , temp.length  , self->reserve_leng * sizeof(uint32_t));
+        memmove(self->leng_run, temp.leng_run, self->reserve_leng * sizeof(uint32_t));
+    }
+    if (self->data_recs > 0 && temp.data_run != NULL)
+        memmove(self->data_run, temp.data_run, self->reserve_data * sizeof(uint32_t));
+
+    self->reserve_leng = reserve_leng;
+    self->reserve_data = reserve_data;
+#if PAGEMAP_STATISTICS
+    pm_stats.currentWaste += (self->reserve_data - self->data_recs) * sizeof(self->data_run[0]) +
+                             (self->reserve_leng - self->leng_recs) * (sizeof(self->leng_run[0]) + sizeof(self->length[0]));
+    if (pm_stats.maxWaste < pm_stats.currentWaste)
+        pm_stats.maxWaste = pm_stats.currentWaste;
+#endif
+    KDataBufferWhack(&temp.cstorage);
+
+    return 0;
+}
+
+rc_t PageMapNew(PageMap **lhs, uint32_t reserve) {
+    PageMap *y = new_PageMap();
+
+    if (y == NULL)
+        return RC(rcVDB, rcPagemap, rcConstructing, rcMemory, rcExhausted);
+
+    if (reserve > 0) {
+        rc_t rc = PageMapGrow(y, reserve, reserve);
+        if (rc) {
+            free(y);
+            return rc;
+        }
+#if PAGEMAP_STATISTICS
+        --pm_stats.grows;
+#endif
+    }
+    *lhs = y;
+#if PAGEMAP_STATISTICS
+    ++pm_stats.create;
+    ++pm_stats.alive;
+    if (pm_stats.maxAlive < pm_stats.alive)
+        pm_stats.maxAlive = pm_stats.alive;
+    pm_stats.currentFootprint += sizeof(*y);
+    if (pm_stats.maxFootprint < pm_stats.currentFootprint)
+        pm_stats.maxFootprint = pm_stats.currentFootprint;
+#endif
+    return 0;
+}
+
+rc_t PageMapToRandomAccess(PageMap **rslt, PageMap * src,uint32_t *data_offset) /** data_offset should have dimension of data_run ***/
+{
+	rc_t rc;
+	bool simple = (src->row_count == src->data_recs);
+	PageMap *dst;
+	assert(src->row_count >= src->leng_recs);
+	rc = PageMapNew(&dst, 0);
+	if(rc == 0){
+		dst->leng_recs=src->leng_recs;
+		dst->row_count=src->row_count;
+		rc = KDataBufferMake(&dst->cstorage, 8 * sizeof(uint32_t), 2*dst->leng_recs+(data_offset?dst->row_count:0));
+		if(rc == 0){
+			dst->length = dst->cstorage.base;
+			dst->leng_run    = dst->length   + dst->leng_recs;
+			dst->data_recs = src->row_count;
+			memmove(dst->length,  src->length,  sizeof(uint32_t)*dst->leng_recs);
+			memmove(dst->leng_run,src->leng_run,sizeof(uint32_t)*dst->leng_recs);
+			if(data_offset){
+				dst->data_offset = dst->leng_run + dst->leng_recs;
+				if(simple){
+					memmove(dst->data_offset,data_offset,sizeof(uint32_t)*dst->row_count);
+				} else {
+					uint32_t i,j;
+					for(i=j=0;i<src->data_recs;i++){
+						elem_count_t data_len=src->data_run[i];
+						while(data_len > 0){
+							assert(j < src->row_count);
+							dst->data_offset[j++] = data_offset[i];
+							data_len--;
+						}
+					}
+				}
+				dst->random_access=true;
+			} 
+			dst->reserve_leng = dst->leng_recs;
+			dst->reserve_data = dst->row_count;
+			dst->start_valid = dst->row_count;
+			*rslt = dst;
+			return 0;
+		}
+		PageMapRelease(dst);
+	}
+	return rc;
+}
+
+
+rc_t PageMapNewFixedRowLength(PageMap **lhs, uint64_t row_count, uint64_t row_len) {
+    PageMap *y;
+    rc_t rc;
+
+    if (row_count >> 32 != 0 || row_len >> 32 != 0)
+        return RC(rcVDB, rcPagemap, rcConstructing, rcParam, rcTooBig);
+    
+    rc = PageMapNew(&y, 0);
+#if PAGEMAP_STATISTICS
+    ++pm_stats.createFixedRow;
+    --pm_stats.create;
+#endif
+    if (rc)
+        return rc;
+    rc = PageMapGrow(y, 1, (uint32_t)row_count);
+#if PAGEMAP_STATISTICS
+    --pm_stats.grows;
+#endif
+    if (rc == 0) {
+	int i;
+        *lhs = y;
+        y->length[0] = (uint32_t)row_len;
+        y->leng_run[0] = (uint32_t)row_count;
+        y->leng_recs = 1;
+        y->data_recs = (uint32_t)row_count;
+        y->row_count = (uint32_t)row_count;
+        for (i = 0; i != (uint32_t)row_count; ++i) {
+            y->data_run[i] = 1;
+        }
+
+    }
+    if (rc)
+        PageMapRelease(y);
+    return rc;
+}
+
+rc_t PageMapNewSingle(PageMap **lhs, uint64_t row_count, uint64_t row_len) {
+    PageMap *y;
+    rc_t rc;
+    
+    if (row_count >> 32 != 0)
+        return RC(rcVDB, rcPagemap, rcConstructing, rcParam, rcTooBig);
+    
+    rc = PageMapNewFixedRowLength(&y, 1, row_len);
+    if (rc == 0) {
+#if PAGEMAP_STATISTICS
+        ++pm_stats.createSingle;
+        --pm_stats.createFixedRow;
+#endif
+        y->row_count = y->data_run[0] = y->leng_run[0] = (uint32_t)row_count;
+        *lhs = y;
+    }
+    return rc;
+}
+
+bool PageMapHasRows(const PageMap *self) {
+    return self->data_recs > 0;
+}
+
+uint32_t PageMapFixedRowLength (const PageMap *self) {
+    uint32_t rslt = 0;
+    
+    if (self->leng_recs == 1)
+        rslt = self->length[0];
+    return rslt;
+}
+
+rc_t PageMapRowLengthRange (const PageMap *self,elem_count_t *min,elem_count_t *max)
+{
+    int i;
+    *min = *max = self->length[0];
+    for(i=1;i<self->leng_recs;i++){
+	if      (self->length[i] < *min) *min = self->length[i];
+	else if (self->length[i] > *max) *max = self->length[i];
+    }
+    return 0;
+}
+
+
+uint32_t PageMapHasSimpleStructure(const PageMap *self) {
+    uint32_t rslt = PageMapFixedRowLength(self);
+    
+    if (rslt == 0)
+        return rslt;
+
+    if(self->data_recs != self->row_count) return 0;
+
+    return rslt;
+}
+
+#if 0
+static bool PageMapValidate(const PageMap *cself) {
+    unsigned i;
+    uint32_t n;
+    uint32_t m;
+        
+    for (m = 0, i = 0; i != cself->leng_recs; ++i) m += cself->leng_run[i];
+    for (n = 0, i = 0; i != cself->data_recs; ++i) n += cself->data_run[i];
+
+    return m == n ? true : false;
+}
+
+static
+rc_t PageMapAppendRun(PageMap *self, uint32_t run_length, uint32_t row_length) {
+    return -1;
+}
+#endif
+
+rc_t PageMapAppendRows(PageMap *self, uint64_t row_length, uint64_t run_length, bool same_data) {
+    rc_t rc;
+    uint32_t leng_cur = self->leng_recs - 1;
+    uint32_t data_cur = self->data_recs - 1;
+    
+    if ((uint32_t)row_length != row_length)
+        return RC(rcVDB, rcPagemap, rcConstructing, rcParam, rcTooBig);
+    
+    if ((uint32_t)run_length != run_length)
+        return RC(rcVDB, rcPagemap, rcConstructing, rcParam, rcTooBig);
+    
+    if (self->leng_recs && row_length == self->length[leng_cur])
+        self->leng_run[leng_cur] += run_length;
+    else {
+        same_data = false;
+        leng_cur = self->leng_recs;
+        ++self->leng_recs;
+
+#if PAGEMAP_STATISTICS
+        pm_stats.currentWaste -= sizeof(self->leng_run[0]) + sizeof(self->length[0]);
+#endif
+        
+        if (self->leng_recs >= self->reserve_leng) {
+            rc = PageMapGrow(self, self->leng_recs, 0);
+            if (rc)
+                return rc;
+        }
+        self->leng_run[leng_cur] = run_length;
+        self->length[leng_cur] = (uint32_t)row_length;
+    }
+    if (self->data_recs && same_data)
+        self->data_run[data_cur] += run_length;
+    else {
+        data_cur = self->data_recs;
+        ++self->data_recs;
+        
+#if PAGEMAP_STATISTICS
+        pm_stats.currentWaste -= sizeof(self->data_run[0]);
+#endif
+        
+        if (self->data_recs >= self->reserve_data) {
+            rc = PageMapGrow(self, 0, self->data_recs);
+            if (rc)
+                return rc;
+        }
+        self->data_run[data_cur] = run_length;
+    }
+    if(self->row_count < self->pre_exp_row_count){
+	int i;
+	elem_count_t *exp_base = self->dstorage.base;
+	elem_count_t data_offset;
+	if(same_data){
+		if(self->row_count == 0){
+			data_offset = 0;
+		} else {
+			data_offset = exp_base[2*self->row_count-1];
+		}
+	} else {
+		data_offset = self->exp_data_offset_last;
+		self->exp_data_offset_last += row_length;
+	}
+	for(i=self->row_count;i<run_length+self->row_count;i++){
+		exp_base[2*i]  =  row_length;
+		exp_base[2*i+1]=  data_offset;
+	}
+	self->exp_row_last += run_length;
+	self->exp_rgn_last->numrows += run_length;
+	
+    }
+    self->row_count += run_length;
+    return 0;
+}
+
+static rc_t serialize_lengths(
+                              KDataBuffer *Dst,
+                              uint64_t offset, 
+                              const uint32_t run[],
+                              unsigned runs,
+                              uint64_t *consumed
+) {
+    rc_t rc;
+    unsigned i;
+    uint64_t j;
+    uint64_t n;
+    uint8_t *dst = Dst->base;
+    
+    dst += offset;
+    *consumed = 0;
+    for (i = 0, j = 0, n = 0, rc = 0; rc == 0 && i != runs; ++i, j += n)
+        rc = vlen_encodeU1(dst + j, 5, &n, run[i]);
+    
+    if (rc == 0)
+        *consumed = j;
+    
+    return rc;
+}
+
+#if 0
+
+static rc_t deserialize_lengths(
+                                uint32_t run[],
+                                unsigned runs,
+                                uint8_t const src[],
+                                unsigned ssize,
+                                uint64_t *consumed
+) {
+    unsigned i;
+    unsigned j;
+    uint64_t n;
+    
+    *consumed = 0;
+    for (i = 0, j = 0; i != runs; ++i, j += (unsigned)n) {
+        uint64_t val;
+        rc_t rc = vlen_decodeU1(&val, src + j, ssize - j, &n);
+        
+        if (rc) return rc;
+        run[i] = (uint32_t)val;
+    }
+    *consumed = j;
+    return 0;
+}
+#else
+
+#if _ARCH_BITS == 32
+#define FLAG_64 0x8080808080808080ULL
+#define VAL_64  0x7F7F7F7F7F7F7F7FULL
+#else
+#define FLAG_64 0x8080808080808080UL
+#define VAL_64  0x7F7F7F7F7F7F7F7FUL
+#endif
+
+static rc_t deserialize_lengths(
+                                uint32_t run[],
+                                unsigned runs,
+                                uint8_t const src[],
+                                unsigned ssize,
+                                uint64_t *consumed
+) {
+    uint8_t	to_align = 16 - (((long)src)&15);/** alignmentto 16 bytes will make optimizer and cpu happy. don't care about loss in cast - we need the lowest byte **/
+    int		si=0;/**source index **/
+    int		di=0;/** destination index **/
+    int		pcnt = (ssize - to_align )/8; 
+
+    memset(run,0,runs*sizeof(*run));
+    if(pcnt){ /** does it make sense at all ***/
+	uint64_t    *ptr=(uint64_t*) (src + to_align);
+	int         pi;
+	
+	for(;si<to_align && di < runs ;si++){ /** align the pointer first **/
+		if(((int8_t)src[si]) < 0) {
+			run[di] += src[si] & 0x7F;
+			run[di] <<= 7;
+		} else {
+			run[di++] += src[si];
+		}
+	}	
+	assert((((long)ptr)&15) == 0);
+	for(pi = 0; pi < pcnt && di < runs; pi++){ /** do bulk staff **/
+		uint64_t flag = ptr[pi] & FLAG_64;
+		uint64_t  val = ptr[pi] & VAL_64;
+		int  i;
+		int8_t     *cf = (int8_t*)&flag;
+		uint8_t	   *cv = (uint8_t*)&val;
+		for(i=0;i<8 && di < runs;i++){ /** no endian problem - casting of ptr matches casting of flag & val **/
+			si++;
+			run[di] += cv[i];
+			if(cf[i] < 0){
+				run[di] <<= 7;
+			} else {
+				di++;
+			}
+		}
+	}
+    }
+   
+    for(;si < ssize && di < runs;si++){/** deal with tails **/
+	if(((int8_t)src[si]) < 0) {
+		run[di] += src[si] & 0x7F;
+		run[di] <<= 7;
+	} else {
+		run[di++] += src[si];
+	}
+    }
+    *consumed = si;
+    return 0;
+}
+
+#endif
+
+static
+rc_t serialize(const PageMap *self, KDataBuffer *buffer, uint64_t *size) {
+/*
+ variant 0: fixed row length, data_run[..] == 1
+    vlencode(row_length)
+ version 2: same as 0 but random access
+    adds serialize(data_offset)
+
+ variant 1: fixed row length, variable data_run
+    vlencode(row_length)
+    vlencode(data_recs)
+    serialize(data_run)
+
+ variant 2: variable row length, data_run[..] == 1
+    vlencode(leng_recs)
+    serialize(length)
+    serialize(leng_run)
+ versuion 2: same as 2 but random access
+    adds serialize(data_offset)
+ 
+ variant 3: variable row length, variable data_run
+    vlencode(leng_recs)
+    vlencode(data_recs)
+    serialize(length)
+    serialize(leng_run)
+    serialize(data_run)
+
+  
+
+ */
+    uint8_t version = self->random_access?2:1;
+    uint8_t variant = 0;
+    uint8_t header;
+    rc_t rc = 0;
+    uint64_t sz;
+    KDataBuffer compress;
+
+
+
+    memset(&compress, 0, sizeof(compress));
+
+    variant = ( (self->data_recs == self->row_count)? 0 : 1) | ((self->leng_recs == 1 ? 0 : 1) << 1);
+    header = (version << 2) | variant;
+    switch (variant) {
+    case 0:
+        rc = KDataBufferResize(buffer, 6);
+        if (rc == 0) {
+            ((uint8_t *)buffer->base)[0] = header;
+            vlen_encodeU1(((uint8_t *)buffer->base) + 1, 5, &sz, self->length[0]);
+	    buffer->elem_count = sz + 1;
+	    if(self->random_access){
+		rc = KDataBufferMakeBytes(&compress, 5*self->row_count);
+		if(rc == 0){
+			rc = serialize_lengths(&compress, 0, self->data_offset, self->row_count, &sz);
+			compress.elem_count = sz;
+		}
+	    }
+        }
+        break;
+    case 1:
+        rc = KDataBufferResize(buffer, 11);
+        if (rc == 0) {
+            rc = KDataBufferMakeBytes(&compress, 5 * self->data_recs);
+            if (rc == 0) {
+                ((uint8_t *)buffer->base)[0] = header;
+                vlen_encodeU1(((uint8_t *)buffer->base) + 1, 5, &sz, self->length[0]);
+                buffer->elem_count = sz + 1;
+                vlen_encodeU1(((uint8_t *)buffer->base) + 1 + sz, 5, &sz, self->data_recs);
+                buffer->elem_count += sz;
+                
+                rc = serialize_lengths(&compress, 0, self->data_run, self->data_recs, &sz);
+                compress.elem_count = sz;
+            }
+        }
+        break;
+    case 2:
+        rc = KDataBufferResize(buffer, 6);
+        if (rc == 0) {
+            rc = KDataBufferMakeBytes(&compress, 10 * self->leng_recs + (self->random_access?5*self->row_count:0));
+            if (rc == 0) {
+                ((uint8_t *)buffer->base)[0] = header;
+                vlen_encodeU1(((uint8_t *)buffer->base) + 1, 5, &sz, self->leng_recs);
+                buffer->elem_count = sz + 1;
+
+                rc = serialize_lengths(&compress, 0, self->length, self->leng_recs, &sz);
+                compress.elem_count = sz;
+                if (rc == 0) {
+                    rc = serialize_lengths(&compress, compress.elem_count, self->leng_run, self->leng_recs, &sz);
+                    compress.elem_count += sz;
+		    if(self->random_access && rc == 0) {
+                        rc = serialize_lengths(&compress, compress.elem_count, self->data_offset, self->row_count, &sz);
+                        compress.elem_count += sz;
+		    }
+                }
+            }
+        }
+	break;
+    case 3:
+        rc = KDataBufferResize(buffer, 11);
+        if (rc == 0) {
+            rc = KDataBufferMakeBytes(&compress, 10 * self->leng_recs + 5 * self->data_recs);
+            if (rc == 0) {
+                ((uint8_t *)buffer->base)[0] = header;
+                vlen_encodeU1(((uint8_t *)buffer->base) + 1, 5, &sz, self->leng_recs);
+                buffer->elem_count = sz + 1;
+                vlen_encodeU1(((uint8_t *)buffer->base) + 1 + sz, 5, &sz, self->data_recs);
+                buffer->elem_count += sz;
+                
+                rc = serialize_lengths(&compress, 0, self->length, self->leng_recs, &sz);
+                compress.elem_count = sz;
+                if (rc == 0) {
+                    rc = serialize_lengths(&compress, compress.elem_count, self->leng_run, self->leng_recs, &sz);
+                    compress.elem_count += sz;
+                    if (rc == 0) {
+                        rc = serialize_lengths(&compress, compress.elem_count, self->data_run, self->data_recs, &sz);
+                        compress.elem_count += sz;
+                    }
+                }
+            }
+        }
+        break;
+    }
+    if (rc == 0 && compress.base) {
+        uint64_t hsize = buffer->elem_count;
+        
+        rc = KDataBufferResize(buffer, hsize + compress.elem_count);
+        if (rc == 0) {
+            if (version == 0)
+                memmove(((uint8_t *)buffer->base) + hsize, compress.base, compress.elem_count);
+            else {
+                z_stream zs;
+                int zr;
+                
+                memset(&zs, 0, sizeof(zs));
+                
+                assert(compress.elem_count >> 32 == 0);
+                
+                zs.next_out = ((Bytef *)buffer->base) + hsize;
+                zs.avail_out = (uInt)compress.elem_count;
+                
+                zs.next_in = compress.base;
+                zs.avail_in = (uInt)compress.elem_count;
+                
+                zr = deflateInit2(&zs, Z_BEST_SPEED, Z_DEFLATED, -15, 9, Z_DEFAULT_STRATEGY);
+                switch (zr) {
+                case Z_OK:
+                    for (; ;) {
+                        zr = deflate(&zs, Z_FINISH);
+                        if (zr == Z_OK) {
+                            unsigned const offset = (unsigned)(zs.next_out - (Bytef *)buffer->base);
+                            rc = KDataBufferResize(buffer, buffer->elem_count * 2);
+                            if (rc)
+                                break;
+                            zs.next_out = ((Bytef *)buffer->base) + offset;
+                            zs.avail_out = (uInt)(buffer->elem_count - offset);
+                        }
+                        else if (zr == Z_STREAM_END) {
+                            KDataBufferResize(buffer, zs.total_out + hsize);
+                            break;
+                        }
+                        else {
+                            rc = RC(rcVDB, rcPagemap, rcWriting, rcParam, rcInvalid);
+                            break;
+                        }
+                    }
+                    deflateEnd(&zs);
+                    break;
+                case Z_MEM_ERROR:
+                    rc = RC(rcVDB, rcPagemap, rcWriting, rcMemory, rcExhausted);
+                    break;
+                default:
+                    rc = RC(rcVDB, rcPagemap, rcWriting, rcParam, rcInvalid);
+                }
+            }
+        }
+    }
+    KDataBufferWhack(&compress);
+    if (rc == 0)
+        *size = buffer->elem_count;
+    
+    return rc;
+}
+
+rc_t PageMapSerialize (const PageMap *self, KDataBuffer *buffer, uint64_t offset, uint64_t *size) {
+    rc_t rc;
+    KDataBuffer temp;
+
+    assert(buffer->elem_bits == 8);
+    assert(buffer->bit_offset == 0);
+    
+    rc = KDataBufferMakeBytes(&temp, 0);
+    if (rc == 0) {
+        uint64_t sz;
+        
+        rc = serialize(self, &temp, &sz);
+        if (rc == 0) {
+            rc = KDataBufferResize(buffer, offset + sz);
+            if (rc == 0)
+                memmove(&((char *)buffer->base)[offset], temp.base, sz);
+            *size = sz;
+        }
+        KDataBufferWhack(&temp);
+    }
+    return rc;
+}
+
+static
+rc_t PageMapDeserialize_v0(PageMap **lhs, uint8_t const src[], unsigned ssize, row_count_t row_count) {
+    uint8_t variant = src[0] & 3;
+    uint8_t version =src[0] >> 2;
+    unsigned cur = 1;
+    uint64_t row_len;
+    uint64_t data_recs;
+    uint64_t leng_recs;
+    uint64_t sz;
+    bool     random_access=(version==2?true:false);
+    rc_t rc = 0;
+    
+    switch (variant) {
+    case 0:
+        /*
+         variant 0: fixed row length, data_run[..] == 1
+         vlencode(row_length)
+         */
+        rc = vlen_decodeU1(&row_len, &src[cur], ssize - cur, &sz); if (rc) return rc;
+	cur += sz;
+        
+        *lhs = new_StaticPageMap(1, random_access?row_count:1);
+        if (*lhs == NULL)
+            return RC(rcVDB, rcPagemap, rcConstructing, rcMemory, rcExhausted);
+        
+        (**lhs).data_recs = row_count;
+        (**lhs).leng_recs = 1;
+        
+        (**lhs).length[0] = (elem_count_t)row_len;
+        (**lhs).leng_run[0] = row_count;
+
+	if(random_access){
+		(**lhs).data_offset= (**lhs).data_run;
+		rc = deserialize_lengths((**lhs).data_offset, (unsigned)row_count, &src[cur], ssize - cur, &sz);
+	}
+	(**lhs).data_run = 0;
+        break;
+    case 1:
+        /*
+         variant 1: fixed row length, variable data_run
+         vlencode(row_length)
+         vlencode(data_recs)
+         serialize(data_run)
+         */
+        rc = vlen_decodeU1(&row_len, &src[cur], ssize - cur, &sz); if (rc) return rc;
+        cur += sz;
+        
+        rc = vlen_decodeU1(&data_recs, &src[cur], ssize - cur, &sz); if (rc) return rc;
+        cur += sz;
+        
+        *lhs = new_StaticPageMap(1, data_recs);
+        if (*lhs == NULL)
+            return RC(rcVDB, rcPagemap, rcConstructing, rcMemory, rcExhausted);
+        
+        (**lhs).data_recs = data_recs;
+        (**lhs).leng_recs = 1;
+        
+        (**lhs).length[0] = (elem_count_t)row_len;
+        (**lhs).leng_run[0] = row_count;
+        
+        rc = deserialize_lengths((**lhs).data_run, (unsigned)data_recs, &src[cur], ssize - cur, &sz);
+        break;
+    case 2:
+        /*
+         variant 2: variable row length, data_run[..] == 1
+         vlencode(leng_recs)
+         serialize(length)
+         serialize(leng_run)
+         */
+        rc = vlen_decodeU1(&leng_recs, &src[cur], ssize - cur, &sz); if (rc) return rc;
+        cur += sz;
+        
+        *lhs = new_StaticPageMap((unsigned)leng_recs, random_access?row_count:1);
+        if (*lhs == NULL)
+            return RC(rcVDB, rcPagemap, rcConstructing, rcMemory, rcExhausted);
+        
+        (**lhs).data_recs = row_count;
+        (**lhs).leng_recs = leng_recs;
+        
+#if 0  
+        rc = deserialize_lengths((**lhs).length, (unsigned)leng_recs, &src[cur], ssize - cur, &sz);
+        if (rc == 0) {
+            cur += sz;
+            rc = deserialize_lengths((**lhs).leng_run, (unsigned)leng_recs, &src[cur], ssize - cur, &sz);
+        }
+#else /** can use the fact that both length and leng_run a sequentually allocated ***/
+	rc = deserialize_lengths((**lhs).length, (unsigned)(2*leng_recs), &src[cur], ssize - cur, &sz);
+	if(rc == 0 && random_access){
+		cur+=sz;
+		(**lhs).data_offset= (**lhs).data_run;
+		rc = deserialize_lengths((**lhs).data_offset, (unsigned)row_count, &src[cur], ssize - cur, &sz);
+	}
+	(**lhs).data_run = 0;
+		
+#endif
+        break;
+    case 3:
+        /*
+         variant 3: variable row length, variable data_run
+         vlencode(leng_recs)
+         vlencode(data_recs)
+         serialize(length)
+         serialize(leng_run)
+         serialize(data_run)
+         */
+        rc = vlen_decodeU1(&leng_recs, &src[cur], ssize - cur, &sz);  if (rc) return rc;
+        cur += sz;
+        
+        rc = vlen_decodeU1(&data_recs, &src[cur], ssize - cur, &sz);  if (rc) return rc;
+        cur += sz;
+        
+        *lhs = new_StaticPageMap(leng_recs, data_recs);
+        if (*lhs == NULL)
+            return RC(rcVDB, rcPagemap, rcConstructing, rcMemory, rcExhausted);
+        
+        (**lhs).data_recs = data_recs;
+        (**lhs).leng_recs = leng_recs;
+#if 0   
+        rc = deserialize_lengths((**lhs).length, leng_recs, &src[cur], ssize - cur, &sz);
+        if (rc == 0) {
+            cur += sz;
+            rc = deserialize_lengths((**lhs).leng_run, leng_recs, &src[cur], ssize - cur, &sz);
+            if (rc == 0) {
+                cur += sz;
+                rc = deserialize_lengths((*lhs)->data_run, data_recs, &src[cur], ssize - cur, &sz);
+            }
+        }
+#else /** can use the fact that both length and leng_run a sequentually allocated ***/
+	rc = deserialize_lengths((**lhs).length, (unsigned)(2*leng_recs+data_recs), &src[cur], ssize - cur, &sz);
+#endif
+        break;
+     default:
+	rc = RC(rcVDB, rcPagemap, rcConstructing, rcFormat, rcUnrecognized);
+    }
+    (**lhs).random_access = random_access;
+    return rc;
+}
+
+static
+rc_t PageMapDeserialize_v1(PageMap **lhs, const uint8_t *Src, uint64_t ssize, uint32_t row_count) {
+    const uint8_t *src = Src;
+    const uint8_t * const endp = src + ssize;
+    uint8_t variant = *src & 3;
+    uint64_t bsize;
+    uint64_t hsize;
+    uint64_t val;
+    uint64_t sz;
+    rc_t rc = 0;
+    KDataBuffer decompress;
+    z_stream zs;
+    int zr;
+    bool random_access = ((src[0]>>2)==2);
+    
+    switch (variant) {
+    case 0:
+	if(!random_access)
+		return PageMapDeserialize_v0(lhs, src, ssize, row_count);
+	++src;
+	rc = vlen_decodeU1(&val, src, endp - src, &sz);
+	if( rc == 0){
+		src += sz;
+		hsize = src - Src;
+		bsize = 5 * row_count;
+	}
+	break;
+    case 1:
+        ++src;
+        rc = vlen_decodeU1(&val, src, endp - src, &sz);
+        if (rc == 0) {
+            src += sz;
+            rc = vlen_decodeU1(&val, src, endp - src, &sz);
+            if (rc == 0) {
+                src += sz;
+                hsize = src - Src;
+                bsize = 5 * val;
+            }
+        }
+        break;
+    case 2:
+        ++src;
+        rc = vlen_decodeU1(&val, src, endp - src, &sz);
+        if (rc == 0) {
+            src += sz;
+            hsize = src - Src;
+            bsize = 10 * val;
+	    if(random_access){
+		bsize +=  5 * row_count;
+	    }
+        }
+        break;
+    case 3:
+        ++src;
+        rc = vlen_decodeU1(&val, src, endp - src, &sz);
+        if (rc == 0) {
+            src += sz;
+            bsize = 10 * val;
+            rc = vlen_decodeU1(&val, src, endp - src, &sz);
+            if (rc == 0) {
+                src += sz;
+                hsize = src - Src;
+                bsize += 5 * val;
+            }
+        }
+        break;
+    default:
+        return RC(rcVDB, rcPagemap, rcConstructing, rcData, rcInvalid);
+    }
+    if (rc)
+        return rc;
+    
+    rc = KDataBufferMakeBytes(&decompress, hsize + bsize);
+    if (rc)
+        return rc;
+
+    memmove(decompress.base, Src, hsize);
+    memset(&zs, 0, sizeof(zs));
+    
+    zs.next_in = (Bytef *)src;
+    assert((endp - src) == (uInt)(endp - src));
+    zs.avail_in = (uInt)(endp - src);
+    
+    zs.next_out = ((Bytef *)decompress.base) + hsize;
+    assert(bsize == (uInt)(bsize));
+    zs.avail_out = (uInt)bsize;
+    
+    zr = inflateInit2(&zs, -15);
+    if (zr == Z_OK) {
+        zr = inflate(&zs, Z_FINISH);
+        if (zr != Z_STREAM_END)
+            rc = RC(rcVDB, rcPagemap, rcConstructing, rcData, rcInvalid);
+        inflateEnd(&zs);
+    }
+    else
+        rc = RC(rcVDB, rcPagemap, rcConstructing, rcMemory, rcExhausted);
+    
+    if (rc == 0)
+        rc = PageMapDeserialize_v0(lhs, decompress.base, hsize + zs.total_out, row_count);
+    KDataBufferWhack(&decompress);
+    return rc;
+}
+
+rc_t PageMapDeserialize (PageMap **lhs, const void *src, uint64_t ssize, uint64_t row_count) {
+    rc_t rc;
+
+    if ((uint32_t)row_count != row_count)
+        return RC(rcVDB, rcPagemap, rcConstructing, rcParam, rcTooBig);
+        
+    if (lhs == NULL)
+        return RC(rcVDB, rcPagemap, rcConstructing, rcParam, rcNull);
+    
+    *lhs = NULL;
+    if (src == NULL || ssize == 0)
+        return 0;
+
+    switch (*(const uint8_t *)src >> 2) {
+    case 0:
+        rc = PageMapDeserialize_v0(lhs, src, ssize, (uint32_t)row_count);
+        break;
+    case 1:
+    case 2:
+        rc = PageMapDeserialize_v1(lhs, src, ssize, (uint32_t)row_count);
+        break;
+    default:
+        return RC(rcVDB, rcPagemap, rcConstructing, rcData, rcBadVersion);
+    }
+    if (rc == 0)
+        (**lhs).row_count = (uint32_t)row_count;
+    else
+        PageMapRelease(*lhs);
+    return rc;
+}
+
+static
+rc_t PageMapDestroy(PageMap *that)
+{
+#if PAGEMAP_STATISTICS
+    pm_stats.currentWaste -= (that->reserve_data - that->data_recs) * sizeof(that->data_run[0]) +
+                             (that->reserve_leng - that->leng_recs) * (sizeof(that->leng_run[0]) + sizeof(that->length[0]));
+    pm_stats.currentFootprint -= sizeof(*that) + that->reserve_data * sizeof(that->data_run[0]) +
+                                 that->reserve_leng * (sizeof(that->leng_run[0]) + sizeof(that->length[0]));
+    --pm_stats.alive;
+    if (pm_stats.alive == 0) {
+        fprintf(stderr, 
+                "PM Stats:\n"
+                "Footprint (cur/max): %u/%u\n"
+                "Waste (cur/max): %u/%u\n"
+                "Alive (cur/max): %u/%u\n"
+                "Created (static/fixed/single/total): %u/%u/%u/%u\n"
+                "Grows: %u\n"
+                "Expands (act/calls): %u/%u\n"
+                "Appends: %u\n\n",
+                (unsigned)pm_stats.currentFootprint,
+                (unsigned)pm_stats.maxFootprint,
+                (unsigned)pm_stats.currentWaste,
+                (unsigned)pm_stats.maxWaste,
+                pm_stats.alive,
+                pm_stats.maxAlive,
+                pm_stats.createStatic,
+                pm_stats.createFixedRow,
+                pm_stats.createSingle,
+                pm_stats.create + pm_stats.createStatic + pm_stats.createFixedRow + pm_stats.createSingle,
+                pm_stats.grows,
+                pm_stats.expands,
+                pm_stats.expandCalls,
+                pm_stats.appends
+                );
+    }
+#endif
+    KDataBufferWhack(&that->istorage);
+    KDataBufferWhack(&that->dstorage);
+    KDataBufferWhack(&that->cstorage);
+    free(that);
+    return 0;
+}
+
+rc_t PageMapRelease (const PageMap *self) {
+    if (self) {
+        if (KRefcountDrop(&self->refcount, "PageMap") == krefWhack)
+          return PageMapDestroy((PageMap *)self);
+    }
+    return 0;
+}
+
+rc_t PageMapAddRef (const PageMap *self) {
+    if (self)
+        KRefcountAdd(&self->refcount, "PageMap");
+    return 0;
+}
+
+uint32_t PageMapGetIdxRowInfo (const PageMap *cself, uint32_t idx, uint32_t *starting_element,uint32_t *repeat_count)
+{
+	rc_t rc=0;
+	elem_count_t len;
+    row_count_t data_run = cself->data_run ? cself->data_run[0] : 1;
+    
+	if (idx  < data_run || cself->data_recs == 1) {
+		if (starting_element)
+            *starting_element = 0;
+		if (cself->leng_recs == 0)
+            len = 0;
+		else
+            len = cself->length[0];
+		if (repeat_count)
+            *repeat_count = data_run;
+		return len;
+	} else {
+		rc = PageMapFindRow(cself, idx, starting_element, &len, repeat_count);
+		if (rc)
+            len = 0;
+	}
+	return len;
+}
+
+int PageMapCompare(const PageMap *a, const PageMap *b) {
+    unsigned ai;
+    unsigned bi;
+    unsigned ar; /* runs in a */
+    unsigned br; /* runs in b */
+    
+    if (
+        a == b || (
+        a->leng_recs == b->leng_recs &&
+        a->data_recs == b->data_recs &&
+        memcmp(a->length, b->length, sizeof(a->length[0]) * a->leng_recs) == 0 &&
+        memcmp(a->leng_run, b->leng_run, sizeof(a->leng_run[0]) * a->leng_recs) == 0 &&
+        memcmp(a->data_run, b->data_run, sizeof(a->data_run[0]) * a->data_recs) == 0
+    ))
+        return 2;
+    
+    ai = bi = 0;
+    ar = a->leng_run[0];
+    br = b->leng_run[0];
+    
+    while (ai < a->leng_recs && bi < b->leng_recs) {
+        if (a->length[ai] != b->length[bi])
+            return 0;
+        if (ar < br) {
+            br -= ar;
+            ar = a->leng_run[++ai];
+        }
+        else if (ar == br) {
+            ar = a->leng_run[++ai];
+            br = b->leng_run[++bi];
+        }
+        else {
+            ar -= br;
+            br = b->leng_run[++bi];
+        }
+    }
+    if (ai != a->leng_recs || bi != b->leng_recs)
+        return -1;
+    else
+        return 1;
+}
+
+int PageMapCompareStatic (const PageMap *a, const PageMap *b) {
+    if (
+	  a->data_recs != 1 ||
+	  a->leng_recs != 1 ||
+	  a->leng_run[0] != a->data_run[0]
+    )
+        return -1; /* *a is not static */
+    
+    if (a == b)
+        return 2; /* static and identical */
+
+    if (
+	  b->data_recs != 1 ||
+	  b->leng_recs != 1 ||
+	  b->leng_run[0] != b->data_run[0]
+    )
+        return -1; /* *b is not static */
+    
+    if (a->length[0] == b->length[0] && a->leng_run[0] <= b->leng_run[0])
+        /* static and compatible, but we want to prevent deeper inspection
+         * so we're lying and saying that they are identical */
+        return 2;
+
+    return 0;  /* not same */
+}
+
+rc_t PageMapAppend(PageMap *self, const PageMap *other) {
+    KDataBuffer cstorage;
+    rc_t rc;
+    
+    rc = KDataBufferMake(&cstorage, sizeof(self->length[0]) * 8, (self->leng_recs + other->leng_recs) * 2 + self->data_recs + other->data_recs);
+    if (rc == 0) {
+        uint32_t *const length = cstorage.base;
+        uint32_t *const leng_run = length + self->leng_recs + other->leng_recs;
+        uint32_t *const data_run = leng_run + self->leng_recs + other->leng_recs;
+        
+#if PAGEMAP_STATISTICS
+        ++pm_stats.appends;
+        pm_stats.currentWaste -= (self->reserve_data - self->data_recs) * sizeof(self->data_run[0]) +
+                                 (self->reserve_leng - self->leng_recs) * (sizeof(self->leng_run[0]) + sizeof(self->length[0]));
+        pm_stats.currentFootprint -= self->reserve_data * sizeof(self->data_run[0]) +
+                                     self->reserve_leng * (sizeof(self->leng_run[0]) + sizeof(self->length[0]));
+#endif
+        memmove(length                  , self->length , self->leng_recs  * sizeof(length[0]));
+        memmove(length + self->leng_recs, other->length, other->leng_recs * sizeof(length[0]));
+
+        memmove(leng_run                  , self->leng_run , self->leng_recs  * sizeof(leng_run[0]));
+        memmove(leng_run + self->leng_recs, other->leng_run, other->leng_recs * sizeof(leng_run[0]));
+        
+        memmove(data_run                  , self->data_run , self->data_recs  * sizeof(data_run[0]));
+        memmove(data_run + self->data_recs, other->data_run, other->data_recs * sizeof(data_run[0]));
+        
+        KDataBufferWhack(&self->cstorage);
+        self->cstorage = cstorage;
+
+        self->length = length;
+        self->leng_run = leng_run;
+        self->data_run = data_run;
+        
+        self->leng_recs += other->leng_recs;
+        self->data_recs += other->data_recs;
+        self->row_count += other->row_count;
+        self->reserve_leng = self->leng_recs;
+        self->reserve_data = self->data_recs;
+        
+#if PAGEMAP_STATISTICS
+        pm_stats.currentWaste += (self->reserve_data - self->data_recs) * sizeof(self->data_run[0]) +
+                                 (self->reserve_leng - self->leng_recs) * (sizeof(self->leng_run[0]) + sizeof(self->length[0]));
+        pm_stats.currentFootprint += self->reserve_data * sizeof(self->data_run[0]) +
+                                     self->reserve_leng * (sizeof(self->leng_run[0]) + sizeof(self->length[0]));
+        if (pm_stats.maxFootprint < pm_stats.currentFootprint)
+            pm_stats.maxFootprint = pm_stats.currentFootprint;
+#endif
+        return 0;
+    }
+    return rc;
+}
diff --git a/libs/vdb/page-map.h b/libs/vdb/page-map.h
new file mode 100644
index 0000000..5b1a739
--- /dev/null
+++ b/libs/vdb/page-map.h
@@ -0,0 +1,386 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_page_map_
+#define _h_page_map_
+
+#include <assert.h>
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <klib/data-buffer.h>
+#include <klib/refcount.h>
+
+#if _DEBUGGING
+#define _HEAVY_PAGEMAP_DEBUGGING 0
+#endif
+
+struct KDataBuffer;
+
+typedef uint32_t pm_size_t;
+typedef uint32_t row_count_t;
+typedef uint32_t elem_count_t;
+
+typedef enum {  PM_REGION_EXPAND_UNKNOWN=0,     /** notset **/
+                PM_REGION_EXPAND_FULL,          /** full expansion     - 2 arrays: offset,length**/
+                PM_REGION_EXPAND_SAMELEN,       /** partial expansion  - 1 array: offset **/
+                PM_REGION_EXPAND_EQUIDISTANT,   /** data have same length and always unique - no expansion needed **/
+                PM_REGION_EXPAND_SAMEDATA       /** same data - no expansion needed ***/
+} pm_expand_region_type_t;
+
+typedef struct PageMapRegion {
+	row_count_t	start_row;
+	row_count_t	numrows;
+	elem_count_t	data_offset;/** for unexpanded regions first direct offset into data**/
+				    /** for expanded regions - offset into expanded storage **/
+	elem_count_t	length;	    /** first length of the region ***/
+	uint8_t		type;       /** one of the types from pm_expand_region_type_t*/
+	bool		expanded;   /** if expandable storage is being used ***/
+} PageMapRegion;
+
+
+
+
+typedef struct PageMap {
+    /* memory allocation object for length[], leng_run[], data_run[] */
+    KDataBuffer cstorage;
+
+    /* array of row lengths
+     * has leng_recs elements
+     * is sized to reserve_leng elements
+     * == storage.base
+     */
+    bool   random_access;
+    enum { eBlobPageMapOptimizedNone, eBlobPageMapOptimizedSucceeded, eBlobPageMapOptimizedFailed}  optimized;
+    elem_count_t *length;
+
+    /* array of run lengths of row lengths
+     * has leng_recs elements
+     * is sized to reserve_leng elements
+     * == length + reserve_leng
+     */
+    row_count_t *leng_run;
+
+    /* array of repeat counts of data
+     * has data_recs elements
+     * is sized to reserve_data elements
+     * == leng_run + reserve_leng
+     * OPTIONAL
+     */
+    row_count_t *data_run;
+    /** expanded offsets into data - needed for random access ***/
+    /** only valid when random_access is true **/
+    elem_count_t *data_offset;
+
+/******* DYNAMIC EXPANSION CONTROL *****************/
+    PageMapRegion		*exp_rgn_last;
+    row_count_t			exp_row_last;   /* last row analyzed for region expansion */
+    row_count_t			exp_lr_used;    /* how much leng_run was used from the */
+    pm_size_t			exp_lr_last;	/* index of last leng_run expanded */
+    pm_size_t			exp_dr_last;	/* index of last data_run expanded */
+    pm_size_t			exp_rgn_cnt;    /* current number of expanded regions */
+    elem_count_t		exp_data_offset_last;/* last offset into data */
+    
+
+    KDataBuffer			istorage;	/* binary searchable storage for expansion regions */
+    KDataBuffer			dstorage;	/* storage for expanded data */
+/** LAST SEARCH CONTROL *****/
+    pm_size_t			i_rgn_last; 	/* region index found in previous lookup **/
+    PageMapRegion*		rgn_last; 	/* redundant - region found in previous lookup **/
+
+/****************************/
+
+    pm_size_t leng_recs;     /* number of valid elements in length[] and leng_run[] */
+    pm_size_t data_recs;     /* number of valid elements in data_run[] */
+    pm_size_t reserve_leng;  /* number of allocated elements in length[] and leng_run[] */
+    pm_size_t reserve_data;  /* number of allocated elements in data_run[] */
+    pm_size_t start_valid;   /* the expanded array contains valid data upto start_valid */
+    row_count_t row_count;   /* total number of rows in page map */
+    row_count_t pre_exp_row_count; /* number of rows pre-expanded */
+    KRefcount refcount;
+} PageMap;
+
+
+/* a pessimistic estimate - actual size will *always* be less than or equal */
+size_t PageMapGetMaxBufferSize(const PageMap *self);
+
+rc_t PageMapSerialize(const PageMap *self, struct KDataBuffer *buffer, uint64_t byte_offset, uint64_t *actual_bytes);
+
+rc_t PageMapDeserialize(PageMap **lhs, const void *src, uint64_t src_bytes, uint64_t row_count);
+
+rc_t PageMapRelease(const PageMap *self);
+
+rc_t PageMapAddRef(const PageMap *self);
+
+/*  PageMapGetIdxRowInfo
+ *
+ *  Get row length and starting element number for a row.
+ *  This is a potentially expensive operation; the first time
+ *  it is called for any page map, the memory used by the page
+ *  map nearly doubles and an index is built on the row length
+ *  runs and the data runs.  Subsequent calls are O(N log N).
+ *  However, asking for the information about the first row
+ *  (i.e. idx = 0) never causes allocation or indexing and is
+ *  always O(1).
+ *
+ *  Params:
+ *      self: [IN] the page map
+ *      idx:  the row number starting from 0
+ *      starting_element: [OUT, OPTIONAL]
+ *
+ *  Returns:
+ *      the length of the row
+ *      or 0 if not found
+ *      repeat_count - how may times this row is repeated from idx
+ */
+uint32_t PageMapGetIdxRowInfo(const PageMap *self, uint32_t idx, uint32_t *starting_element, uint32_t * repeat_count);
+
+rc_t PageMapNew(PageMap **lhs, uint32_t reserve);
+
+rc_t PageMapNewSingle(PageMap **lhs, uint64_t row_count, uint64_t row_length);
+
+rc_t PageMapNewFixedRowLength(PageMap **lhs, uint64_t row_count, uint64_t row_len);
+
+rc_t PageMapToRandomAccess(PageMap **rslt, PageMap * src,uint32_t *data_offset);
+
+uint32_t PageMapFixedRowLength(const PageMap *self);
+
+rc_t	PageMapRowLengthRange(const PageMap *self, elem_count_t *min,elem_count_t *max);
+
+uint32_t PageMapHasSimpleStructure(const PageMap *self);
+
+rc_t PageMapAppendRows(PageMap *self, uint64_t row_length, uint64_t run_length, bool same_data);
+
+#define PageMapAppendRow(SELF, ROW_LENGTH, SAME_DATA) (PageMapAppendRows((SELF), (ROW_LENGTH), 1, SAME_DATA))
+
+/* append some rows of the same data */
+#define PageMapAppendSomeRows(SELF, ROW_LENGTH, RUN_LENGTH) (PageMapAppendRows((SELF), (ROW_LENGTH), (RUN_LENGTH), false))
+
+/* concatenate two page maps */
+rc_t PageMapAppend(PageMap *self, const PageMap *other);
+
+/** Find data using pagemap ***/
+rc_t PageMapFindRow(const PageMap *cself,uint64_t row,uint32_t * data_offset,uint32_t * data_length,uint32_t * repeat_count);
+
+
+/*
+ -1: error
+ 0: not same
+ 1: compatible (i.e. all rows same length)
+ else: identical
+ */
+int PageMapCompare(const PageMap *a, const PageMap *b);
+/* same but static columns */
+int PageMapCompareStatic(const PageMap *a, const PageMap *b);
+
+typedef struct PageMapIterator PageMapIterator;
+struct PageMapIterator {
+    row_count_t		last_row;
+    row_count_t		cur_row;
+    PageMapRegion**	rgns;	  /** all regions from the pagemap **/
+    pm_size_t		cur_rgn;  /** offset of the current region **/
+    row_count_t 	cur_rgn_row; /** row relative to offset of the region **/
+    elem_count_t	**exp_base; /*** exp buffer ***/
+    row_count_t		repeat_count; /** remaining repeat count **/
+    elem_count_t	static_datalen;
+#if _HEAVY_PAGEMAP_DEBUGGING
+    PageMap *parent;
+#endif
+};
+
+VDB_EXTERN rc_t PageMapNewIterator(const PageMap *self, PageMapIterator *lhs, uint64_t first_row, uint64_t num_rows);
+
+static __inline__ bool PageMapIteratorAdvance(PageMapIterator *self, row_count_t rows)
+{
+    if (self->cur_row + rows < self->last_row) {
+	self->cur_row += rows;
+	self->cur_rgn_row += rows;
+	if(self->repeat_count > rows) self->repeat_count-= rows;
+	else self->repeat_count = 0;
+	if(self->rgns){/** non-static, non simple random access**/
+		while((*self->rgns)[self->cur_rgn].numrows <= self->cur_rgn_row){
+			self->cur_rgn_row -= (*self->rgns)[self->cur_rgn].numrows;
+			self->cur_rgn++;
+		}
+        }
+        return true;
+    }
+    return false;
+}
+
+#define PageMapIteratorNext(SELF) PageMapIteratorAdvance(SELF, 1)
+
+static __inline__ elem_count_t PageMapIteratorDataLength(const PageMapIterator *self)
+{
+    elem_count_t datalen=0;
+    if(self->rgns == NULL) {/* static or simple random-access*/
+	return  self->static_datalen;
+    }
+    switch ((*self->rgns)[self->cur_rgn].type){
+	case PM_REGION_EXPAND_FULL:
+		if((*self->rgns)[self->cur_rgn].expanded){
+			datalen = (*self->exp_base)[(*self->rgns)[self->cur_rgn].data_offset + 2*self->cur_rgn_row];
+		} else {
+			datalen = (*self->rgns)[self->cur_rgn].length;
+		}
+                break;
+	case PM_REGION_EXPAND_SAMELEN:
+	case PM_REGION_EXPAND_EQUIDISTANT:
+	case PM_REGION_EXPAND_SAMEDATA:
+		datalen = (*self->rgns)[self->cur_rgn].length;
+		break;
+	default:
+		assert(0);
+		break;
+   }
+#if _HEAVY_PAGEMAP_DEBUGGING
+   {
+	elem_count_t dtl,dto,dtr;
+	PageMapFindRow(self->parent,self->cur_row,&dto,&dtl,&dtr);
+	assert(dtl==datalen);
+   }
+#endif
+   /*printf("DATA_LEN=%d\n",datalen);*/
+   return datalen;
+}
+
+static __inline__ elem_count_t PageMapIteratorDataOffset(const PageMapIterator *self)
+{
+    elem_count_t dataoff=0;
+    if(self->rgns == NULL){ /** static or simple random **/
+	if(self->exp_base != NULL)  /** simple random access */
+		dataoff= (*self->exp_base)[self->cur_row];
+	return dataoff;
+    }
+    switch ((*self->rgns)[self->cur_rgn].type){
+        case PM_REGION_EXPAND_FULL:
+                if((*self->rgns)[self->cur_rgn].expanded){
+                        dataoff = (*self->exp_base)[(*self->rgns)[self->cur_rgn].data_offset + 2*self->cur_rgn_row + 1];
+                } else {
+                        dataoff = (*self->rgns)[self->cur_rgn].data_offset;
+                }
+                break;
+        case PM_REGION_EXPAND_SAMELEN:
+		if((*self->rgns)[self->cur_rgn].expanded){
+                        dataoff = (*self->exp_base)[(*self->rgns)[self->cur_rgn].data_offset + self->cur_rgn_row];
+                } else {
+                        dataoff = (*self->rgns)[self->cur_rgn].data_offset;
+                }
+                break;
+        case PM_REGION_EXPAND_EQUIDISTANT:
+		dataoff = (*self->rgns)[self->cur_rgn].data_offset + (*self->rgns)[self->cur_rgn].length * self->cur_rgn_row;
+		break;
+        case PM_REGION_EXPAND_SAMEDATA:
+                dataoff = (*self->rgns)[self->cur_rgn].data_offset;
+                break;
+        default:
+                assert(0);
+                break;
+    }
+#if _HEAVY_PAGEMAP_DEBUGGING
+   {
+        elem_count_t dtl,dto,dtr;
+        PageMapFindRow(self->parent,self->cur_row,&dto,&dtl,&dtr);
+        assert(dto==dataoff);
+   }
+#endif
+    return dataoff;
+}
+
+static __inline__ row_count_t PageMapIteratorRepeatCount(const PageMapIterator *cself)
+{
+    assert( cself );
+    if(cself->repeat_count==0){
+	PageMapIterator *self = (PageMapIterator*) cself;
+	if(self->rgns==NULL){ /** must be simple random access **/
+		uint64_t i;
+        assert( ( ( self->exp_base == NULL ) || ( *self->exp_base == NULL ) ) ? self->cur_row+1 >= self->last_row : true );
+		for(i=self->cur_row+1,self->repeat_count=1;
+                    i< self->last_row && (*self->exp_base)[i]==(*self->exp_base)[self->cur_row];
+                    i++,self->repeat_count++){}
+	} else {
+		switch ((*self->rgns)[self->cur_rgn].type){
+		 case PM_REGION_EXPAND_FULL:
+			if((*self->rgns)[self->cur_rgn].expanded){
+				row_count_t i;
+				elem_count_t* base = (*self->exp_base) + (*self->rgns)[self->cur_rgn].data_offset;
+				self->repeat_count = 1;
+				for(i=self->cur_rgn_row+1;i<(*self->rgns)[self->cur_rgn].numrows;i++){
+					if(base[2*self->cur_rgn_row]== base[2*i] && base[2*self->cur_rgn_row+1]== base[2*i+1]) self->repeat_count++;
+					else break;
+				}
+			} else {
+				self->repeat_count =  (*self->rgns)[self->cur_rgn].numrows - self->cur_rgn_row;
+			}
+			break;
+		 case PM_REGION_EXPAND_SAMELEN:
+			if((*self->rgns)[self->cur_rgn].expanded){
+				row_count_t i;
+				elem_count_t* base = (*self->exp_base) + (*self->rgns)[self->cur_rgn].data_offset;
+				self->repeat_count = 1;
+				for(i=self->cur_rgn_row+1;i<(*self->rgns)[self->cur_rgn].numrows;i++){
+					if(base[self->cur_rgn_row] == base[i]) self->repeat_count++;
+					else break;
+				}
+			} else {
+				self->repeat_count = (*self->rgns)[self->cur_rgn].numrows - self->cur_rgn_row;
+			}
+			break;
+		 case PM_REGION_EXPAND_EQUIDISTANT:
+			self->repeat_count = 1;
+			break;
+		 case PM_REGION_EXPAND_SAMEDATA:
+			self->repeat_count =  (*self->rgns)[self->cur_rgn].numrows - self->cur_rgn_row;
+			break;
+		 default:
+			assert(0);
+			break;
+		}
+	}
+    }
+#if _HEAVY_PAGEMAP_DEBUGGING
+   {
+        elem_count_t dtl,dto,dtr;
+        PageMapFindRow(cself->parent,cself->cur_row,&dto,&dtl,&dtr);
+        assert(dtr==cself->repeat_count);
+   }
+#endif
+    return cself->repeat_count;
+}
+
+elem_count_t PageMapLastLength(const PageMap *cself);
+bool PageMapHasRows(const PageMap *self);
+rc_t PageMapExpand(const PageMap *cself, row_count_t upto);
+rc_t PageMapExpandFull(const PageMap *cself);
+rc_t PageMapPreExpandFull(const PageMap *cself, row_count_t upto);
+
+#endif /* _h_page_map_ */
diff --git a/libs/vdb/parameter-read.c b/libs/vdb/parameter-read.c
new file mode 100644
index 0000000..bbb01ef
--- /dev/null
+++ b/libs/vdb/parameter-read.c
@@ -0,0 +1,103 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#include "xform-priv.h"
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/table.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <vdb/vdb-priv.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+static
+rc_t CC parameter_read_func(
+                         void *Self,
+                         const VXformInfo *info,
+                         int64_t row_id,
+                         VRowResult *rslt,
+                         uint32_t argc,
+                         const VRowData argv[]
+) {
+    const KDataBuffer *value = Self;
+    rc_t rc = 0;
+    
+    rslt->data->elem_bits = value->elem_bits;
+    rslt->data->elem_count = 0;
+    rc = KDataBufferResize(rslt->data, value->elem_count);
+    if (rc == 0) {
+        memmove(rslt->data->base, value->base, KDataBufferBytes(value));
+        rc = KDataBufferCast(rslt->data, rslt->data, rslt->elem_bits, true);
+        if (rc == 0)
+            rslt->elem_count = rslt->data->elem_count;
+    }
+	return rc;
+}
+
+static rc_t get_databuffer( KDataBuffer **rslt, struct VCursorParams const *params, const char *Name, size_t len ) {
+    char name[4096];
+    
+    if (len >= sizeof(name))
+        return RC(rcVDB, rcFunction, rcConstructing, rcName, rcTooLong);
+    
+    memmove(name, Name, len);
+    name[len] = '\0';
+    
+    return VCursorParamsGet(params, name, rslt);
+}
+
+/* 
+ function utf8 parameter:read #1.0 < ascii name, * bool deterministic > ();
+ */
+VTRANSFACT_BUILTIN_IMPL(parameter_read, 1, 0, 0)
+    (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp
+) {
+    rc_t rc;
+    KDataBuffer *value;
+    bool deterministic = true;
+    
+    if (cp->argc > 1)
+        deterministic = cp->argv[1].data.b[0];
+
+    rc = get_databuffer(&value, info->parms, cp->argv[0].data.ascii, cp->argv[0].count);
+    if (rc == 0) {
+        rslt->self = value;
+        
+        rslt->variant = deterministic ? vftRow : vftNonDetRow;
+        rslt->u.ndf = parameter_read_func;
+    }
+
+	return rc;
+}
diff --git a/libs/vdb/phys-cmn.c b/libs/vdb/phys-cmn.c
new file mode 100644
index 0000000..a4e61e2
--- /dev/null
+++ b/libs/vdb/phys-cmn.c
@@ -0,0 +1,784 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define KONST const
+#include "phys-priv.h"
+#include "schema-parse.h"
+#include "schema-priv.h"
+#include "schema-expr.h"
+#include "table-priv.h"
+#include "cursor-priv.h"
+#include "prod-priv.h"
+#include "blob-priv.h"
+#undef KONST
+
+#include <vdb/cursor.h>
+#include <kdb/column.h>
+#include <kdb/meta.h>
+#include <klib/symbol.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <endian.h>
+
+
+#define BLOB_VALIDATION 1
+
+/*--------------------------------------------------------------------------
+ * KMDataNode
+ */
+
+
+/* Addr
+ *  reach into node and get address
+ *  returns raw pointer and node size
+ */
+rc_t CC KMDataNodeAddr ( const KMDataNode *self,
+    const void **addr, size_t *size );
+
+
+/*--------------------------------------------------------------------------
+ * VPhysical
+ */
+
+/* Destroy
+ */
+void VPhysicalDestroy ( VPhysical *self )
+{
+
+#if PROD_REFCOUNT && ! PROD_ALL_IN_CURSOR
+    PROD_TRACK_REFCOUNT(VProductionRelease, self->out);
+    VProductionRelease ( self -> out, NULL );
+    PROD_TRACK_REFCOUNT(VProductionRelease, self->b2p);
+    VProductionRelease ( self -> b2p, NULL );
+    PROD_TRACK_REFCOUNT(VProductionRelease, self->b2s);
+    VProductionRelease ( self -> b2s, NULL ); 
+    PROD_TRACK_REFCOUNT(VProductionRelease, self->in);
+    VProductionRelease ( self -> in, NULL );
+#endif
+
+    KDataBufferWhack ( & self -> srow );
+
+    SExpressionWhack ( self -> enc );
+
+    KMDataNodeRelease ( self -> knode );
+
+    KMetadataRelease ( self -> meta );
+    KColumnRelease ( self -> kcol );
+    
+    free ( self );
+}
+
+/* Make
+ */
+rc_t VPhysicalMake ( VPhysical **physp, const VCursor *curs, const SPhysMember *smbr )
+{
+    VPhysical *phys = calloc ( 1, sizeof * phys );
+
+    if ( phys == NULL )
+        return RC ( rcVDB, rcColumn, rcConstructing, rcMemory, rcExhausted );
+
+    phys -> curs = curs;
+    phys -> smbr = smbr;
+
+    * physp = phys;
+    return 0;
+}
+
+/* FinishKColumn
+ */
+
+#if 0
+#include <stdio.h>
+static
+rc_t pstdout ( void *ignore, const void *buffer, size_t bsize )
+{
+    fwrite ( buffer, 1, bsize, stdout );
+    return 0;
+}
+#endif
+
+static rc_t VPhysicalLazySetRange(VPhysical *self)
+{
+    if(self->kstart_id < 0 || self -> kstop_id < self -> kstart_id) {
+	uint64_t count;
+	rc_t rc = KColumnIdRange ( self -> kcol, & self -> kstart_id, & count );
+	self -> kstop_id = self -> kstart_id + count - 1;
+	return rc;
+    }
+    return 0;
+}
+
+rc_t VPhysicalFinishKColumn ( VPhysical *self, VSchema *schema, const SPhysMember *smbr )
+{
+    rc_t rc = 0;
+
+    /* lazy settings .. to be set when needed */
+    self -> kstart_id = 1;
+    self -> kstop_id  = 0;
+
+    if ( self -> meta == NULL )
+    {
+        /* bring over "no_hdr" from SPhysical */
+        self -> no_hdr = ( ( const SPhysEncExpr* ) smbr -> type ) -> phys -> no_hdr;
+    }
+    else
+    {
+        /* read in metadata */
+        VTypedecl td;
+        rc = VPhysicalLoadMetadata ( self, & td, schema );
+        /*VSchemaDump ( schema, sdmPrint, NULL, pstdout, NULL );*/
+        if ( rc == 0 )
+        {
+            /* if member type is unknown, reset to actual type */
+            if ( smbr -> td . type_id == 0 )
+            {
+                /* this member was introduced into cursor schema
+                   by the function VCursorSupplementPhysical with
+                   an unknown type - i.e. the schema compiler will
+                   not recognize "any" as a member type. essentially
+                   the member type setting was delayed until now */
+                ( ( SPhysMember* ) smbr ) -> td = td;
+            }
+
+            /* validate that the physical column matches
+               the schema member declaration type */
+            else if ( ! VTypedeclCommonAncestor ( & td, schema, & smbr -> td, NULL, NULL ) )
+            {
+                rc = RC ( rcVDB, rcColumn, rcLoading, rcType, rcInconsistent );
+                PLOGERR ( klogInt, ( klogInt, rc, "inconsistent schema and actual types for column '$(name)'"
+                                     , "name=%.*s"
+                                     , ( int ) smbr -> name -> name . size
+                                     , smbr -> name -> name . addr ));
+            }
+        }
+    }
+
+    return rc;
+ }
+
+/* FinishStatic
+ */
+rc_t VPhysicalFinishStatic ( VPhysical *self, const VSchema *schema, const SPhysMember *smbr )
+{
+    /* see if data node actually exists */
+    const KMDataNode *node;
+    rc_t rc = KMDataNodeOpenNodeRead ( self -> knode, & node, "row" );
+    if ( rc  != 0 )
+        return rc;
+
+    KMDataNodeRelease ( node );
+
+    /* determine id range */
+    rc = KMDataNodeOpenNodeRead ( self -> knode, & node, "start_id" );
+    if ( rc == 0 )
+    {
+        /* modern static column */
+        rc = KMDataNodeReadAsI64 ( node, & self -> sstart_id );
+        KMDataNodeRelease ( node );
+        if ( rc == 0 )
+        {
+            rc = KMDataNodeOpenNodeRead ( self -> knode, & node, "row_count" );
+            if ( rc == 0 )
+            {
+                uint64_t row_count;
+                
+                rc = KMDataNodeReadAsU64 ( node, & row_count );
+                KMDataNodeRelease ( node );
+                assert(row_count != 0);
+                self -> sstop_id = self -> sstart_id + row_count - 1;
+            }
+        }
+    }
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {
+        /* get the table metadata */
+        const KMetadata *tmeta = self -> curs -> tbl -> meta;
+
+        /* original static column with no range */
+        self -> sstart_id = 1;
+
+        /* work a little harder to correct this problem */
+        rc = KMetadataGetSequence ( tmeta, "spot", & self -> sstop_id );
+        if ( rc != 0 )
+            rc = KMetadataGetSequence ( tmeta, ".", & self -> sstop_id );
+        if ( rc != 0 )
+        {
+#if 0
+            /* set to infinite range */
+            self -> sstart_id <<= 63;
+            self -> sstop_id = ~ self -> sstart_id;
+#else
+            /* set to single row */
+            self -> sstart_id = 1;
+            self -> sstop_id = 1;
+#endif
+            rc = 0;
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        size_t size;
+        char type_expr [ 256 ];
+
+        /* read column type */
+        rc = KMDataNodeReadAttr ( self -> knode, "type",
+            type_expr, sizeof type_expr, & size );
+        if ( rc == 0 )
+        {
+            VTypedecl td;
+
+            /* resolve type */
+            rc = VSchemaResolveTypedecl ( schema, & td, "%s", type_expr );
+            if ( rc == 0 )
+            {
+                /* if member type is unknown, reset to actual type */
+                if ( smbr -> td . type_id == 0 )
+                {
+                    /* this member was introduced into cursor schema
+                       by the function VCursorSupplementPhysical with
+                       an unknown type - i.e. the schema compiler will
+                       not recognize "any" as a member type. essentially
+                       the member type setting was delayed until now */
+                    ( ( SPhysMember* ) smbr ) -> td = td;
+                }
+
+                /* validate that the physical column matches
+                   the schema member declaration type */
+                else if ( ! VTypedeclCommonAncestor ( & td, schema, & smbr -> td, NULL, NULL ) )
+                {
+                    rc = RC ( rcVDB, rcColumn, rcLoading, rcType, rcInconsistent );
+                    PLOGERR ( klogInt, ( klogInt, rc, "inconsistent schema and actual types for static column '$(name)'"
+                               , "name=%.*s"
+                               , ( int ) smbr -> name -> name . size
+                               , smbr -> name -> name . addr ));
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* Open
+ *  open existing columns
+ *  load schema definitions
+ */
+rc_t VPhysicalOpenRead ( VPhysical *self, VSchema *schema, const VTable *tbl )
+{
+    rc_t rc;
+
+    /* physical member name from schema */
+    const SPhysMember *smbr = self -> smbr;
+    const KSymbol *name = smbr -> name;
+
+    /* mark physical as read-only */
+    self -> read_only = true;
+
+    /* open column for update */
+    rc = KTableOpenColumnRead ( tbl -> ktbl, & self -> kcol,
+        "%.*s", ( int ) name -> name . size - 1, name -> name . addr + 1 );
+    if ( rc == 0 )
+    { 
+        /* open its metadata */
+        rc = KColumnOpenMetadataRead ( self -> kcol, & self -> meta );
+        if ( rc == 0 || GetRCState ( rc ) == rcNotFound )
+        {
+            /* finish off common initialization */
+            rc = VPhysicalFinishKColumn ( self, schema, smbr );
+        }
+    }
+
+    /* it's okay if a column doesn't exist - it may exist as a static */
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {
+        rc = 0;
+    }
+
+    if ( rc == 0 && self -> kcol == NULL )
+    {
+        /* must have static col parent node */
+        if ( tbl -> col_node == NULL )
+            rc = RC ( rcVDB, rcTable, rcOpening, rcColumn, rcNotFound );
+        else
+        {
+            /* look for static */
+            const KMDataNode *node;
+            rc = KMDataNodeOpenNodeRead ( tbl -> col_node, & node,
+                "%.*s", ( int ) name -> name . size - 1, name -> name . addr + 1 );
+            if ( rc == 0 )
+            {
+                self -> knode = node;
+
+                /* finish off common initialization */
+                rc = VPhysicalFinishStatic ( self, schema, smbr );
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* ReadKColumn
+ *  read a raw blob from kcolumn
+ */
+static
+rc_t VPhysicalReadKColumn ( VPhysical *self, VBlob **vblob, int64_t id, uint32_t elem_bits )
+{
+    rc_t rc;
+    VBlob *blob;
+    const KColumnBlob *kblob;
+
+    rc = VPhysicalLazySetRange(self);
+    if( rc) return rc;
+    /* check id against column contents */
+    if ( self -> kcol == NULL ||
+         id < self -> kstart_id || id > self -> kstop_id )
+    {
+        * vblob = NULL;
+        return RC ( rcVDB, rcColumn, rcReading, rcRow, rcNotFound );
+    }
+
+#if PROD_CACHE
+    /* check for recently written cache contents */
+    if ( self -> b2s != NULL && self -> b2s -> cache [ 0 ] != NULL )
+    {
+        VProduction *b2s = self -> b2s;
+
+        int i;
+        for ( i = 0; i < PROD_CACHE; ++ i )
+        {
+            blob = b2s -> cache [ i ];
+            if ( id >= blob -> start_id && id <= blob -> stop_id )
+            {
+                * vblob = blob;
+                rc = VBlobAddRef ( blob );
+                if ( rc != 0 )
+                    return rc;
+
+                TRACK_BLOB ( VBlobAddRef, blob );
+#if PROD_CACHE > 1
+                /* MRU cache */
+                if ( i > 0 )
+                {
+                    do
+                        b2s -> cache [ i ] = b2s -> cache [ i - 1 ];
+                    while ( -- i > 0 );
+                    b2s -> cache [ 0 ] = blob;
+                }
+#endif
+                return 0;
+            }
+        }
+    }
+#endif
+
+    /* find blob in KColumn
+       TBD - handle potential merge/update later */
+    rc = KColumnOpenBlobRead ( self -> kcol, & kblob, id );
+    if ( rc == 0 )
+    {
+        /* get blob id range */
+        uint32_t count;
+        int64_t start_id;
+
+        rc = KColumnBlobIdRange ( kblob, & start_id, & count );
+        if ( rc == 0 )
+        {
+            /* get blob size */
+            size_t num_read, remaining;
+
+#if BLOB_VALIDATION
+            KDataBuffer whole_blob;
+            KColumnBlobCSData cs_data;
+            bool validate_this_blob = self -> curs -> tbl -> blob_validation;
+
+            if ( rc == 0 && validate_this_blob )
+            {
+                rc = KColumnBlobReadAll ( kblob, & whole_blob, & cs_data, sizeof cs_data );
+                /* simulate the results of next read */
+                num_read = 0;
+                remaining = KDataBufferBytes ( & whole_blob );
+            }
+            else if ( rc == 0 && !validate_this_blob )
+#endif
+                rc = KColumnBlobRead ( kblob, 0, NULL, 0, & num_read, & remaining );
+
+            if ( rc == 0 )
+#if BLOB_VALIDATION
+                if ( validate_this_blob )
+                    rc = KColumnBlobValidateBuffer ( kblob, & whole_blob, & cs_data, sizeof cs_data );
+            if ( rc == 0 )
+#endif
+
+            {
+                KDataBuffer buffer;
+
+                /* fabricate "stop_id" */
+                int64_t stop_id = start_id + count - 1;
+
+                /* if the encoding was marked __no_header */
+                if ( self -> no_hdr )
+                    num_read = 2;
+
+#if BLOB_VALIDATION
+                /* if already have a header, just steal the buffer */
+                else if ( validate_this_blob )
+                {
+                    buffer = whole_blob;
+                    memset ( & whole_blob, 0, sizeof whole_blob );
+                }
+
+                /* test again to see if the buffer should be made */
+                if ( self -> no_hdr || !validate_this_blob )
+#endif
+                /* create data buffer */
+                rc = KDataBufferMakeBytes ( & buffer, num_read + remaining );
+                if ( rc == 0 )
+                {
+                    /* read entire blob */
+                    uint8_t *p = buffer . base;
+#if BLOB_VALIDATION
+                    if ( validate_this_blob )
+                    {
+                        if ( self -> no_hdr )
+                            memmove ( & p [ num_read ], whole_blob . base, remaining );
+                    }
+                    else
+#endif
+                    rc = KColumnBlobRead ( kblob, 0,
+                        & p [ num_read ], remaining, & num_read, & remaining );
+
+                    if ( rc == 0 )
+                    {
+                        if ( self -> no_hdr )
+                        {
+                            /* create fake v1 header byte with fixed row-length:
+                               000ooobb where "o" is offset ( 0 ), and
+                               "b" is byte order ( always little-endian ) */
+                            p [ 0 ] = ( uint8_t ) vboLittleEndian;
+                            p [ 1 ] = 0;
+                        }
+
+                        /* create a proper blob */
+                        rc = VBlobNew ( vblob, start_id, stop_id, "readkcolumn" );
+                        TRACK_BLOB (VBlobNew, *vblob);
+                        if ( rc == 0 )
+                        {
+                            rc = KDataBufferSub ( & buffer, & ( * vblob ) -> data, 0, UINT64_MAX );
+                            assert ( rc == 0 );
+                        }
+                    }
+
+                    KDataBufferWhack ( & buffer );
+                }
+            }
+
+#if BLOB_VALIDATION
+            if ( validate_this_blob )
+                KDataBufferWhack ( & whole_blob );
+#endif
+        }
+
+        KColumnBlobRelease ( kblob );
+    }
+
+    return rc;
+}
+
+/* Read
+ *  read a blob from static data or decoding chain
+ */
+static
+rc_t VPhysicalReadStatic ( VPhysical *self, VBlob **vblob, int64_t id, uint32_t elem_bits )
+{
+    bool reversed;
+    rc_t rc = KMDataNodeByteOrder ( self -> knode, & reversed );
+    if ( rc == 0 )
+    {
+        const KMDataNode *row;
+
+        /* detect non-native byte-order */
+        VByteOrder byte_order = vboNative;
+        if ( reversed )
+        {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+            byte_order = vboBigEndian;
+#else
+            byte_order = vboLittleEndian;
+#endif
+        }
+
+        /* open sub-node for row */
+        rc = KMDataNodeOpenNodeRead ( self -> knode, & row, "row" );
+        if ( rc == 0 )
+        {
+            /* get raw pointer and size in bytes */
+            size_t bytes;
+            const void *base;
+            rc = KMDataNodeAddr ( row, & base, & bytes );
+            if ( rc == 0 )
+            {
+                uint64_t row_bits;
+
+                /* if there's a "size" node, read size in bits */
+                const KMDataNode *size;
+                rc = KMDataNodeOpenNodeRead ( self -> knode, & size, "size" );
+                if ( rc == 0 )
+                {
+                    rc = KMDataNodeReadAsU64 ( size, & row_bits );
+                    KMDataNodeRelease ( size );
+                }
+                else if ( GetRCState ( rc ) == rcNotFound )
+                {
+                    row_bits = bytes << 3;
+                    rc = 0;
+                }
+
+                /* check that the row length is an integral number of elements */
+                assert ( elem_bits != 0 );
+                if ( rc == 0 && row_bits % elem_bits != 0 )
+                    rc = RC ( rcVDB, rcColumn, rcReading, rcRow, rcCorrupt );
+
+                /* go forth */
+                if ( rc == 0 )
+                {
+                    KDataBuffer buffer;
+                    rc = KDataBufferMake ( & buffer, elem_bits, ( uint32_t ) ( row_bits / elem_bits ) );
+                    if ( rc == 0 )
+                    {
+                        int64_t sstart_id = self -> sstart_id;
+                        int64_t sstop_id = self -> sstop_id;
+
+                        /* copy out single row */
+                        memmove ( buffer . base, base, bytes );
+                        self->fixed_len = buffer.elem_count;
+
+                        /* limit row range */
+                        if ( ( ( sstop_id - sstart_id ) >> 30 ) != 0 )
+                        {
+                            sstart_id  =   ((id-1) &  ~0x1fffffffUL ) + 1;  /** Truncate to the nearest 1/2 billion; making sure that id is in the middle of 1 billion max window**/
+                            if ( ( ( sstop_id - sstart_id ) >> 30 ) != 0 ) /** still not enough ***/
+                                sstop_id = sstart_id + 0x40000000UL ; /** leave only 1 billion */
+                        }
+
+                        rc = VBlobCreateFromSingleRow ( vblob,
+                            sstart_id, sstop_id, & buffer, byte_order );
+                        KDataBufferWhack( &buffer );
+                    }
+                }
+            }
+
+            KMDataNodeRelease ( row );
+        }
+    }
+
+    return rc;
+}
+
+rc_t VPhysicalReadBlob ( VPhysical *self, VBlob **vblob, int64_t id, uint32_t elem_bits )
+{
+    rc_t rc;
+
+    /* check for hit on static guy */
+    if ( self -> knode != NULL &&
+         id >= self -> sstart_id && id <= self -> sstop_id )
+    {
+        return VPhysicalReadStatic ( self, vblob, id, elem_bits );
+    }
+
+    /* need to read from kcolumn path */
+    rc = VProductionReadBlob ( self -> b2p, vblob, id , 1, NULL);
+	if ( rc == 0 )
+    {
+	    if((*vblob)->pm==NULL)
+        {
+            rc = PageMapProcessGetPagemap(&self->curs->pmpr,&(*vblob)->pm);
+	    }
+    }
+
+	return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * VPhysicalProd
+ */
+
+rc_t VPhysicalProdMake ( VProduction **prodp, Vector *owned,
+    struct VCursor *curs, VPhysical *phys, int sub, const char *name,
+    const VFormatdecl *fd, const VTypedesc *desc )
+{
+#define PHYSPROD_INDEX_OFFSET 1000000000
+    VPhysicalProd *prod;
+    rc_t rc = VProductionMake ( prodp, owned, sizeof * prod,
+        prodPhysical, sub, name, fd, desc, NULL, chainDecoding );
+    if ( rc == 0 )
+    {
+        prod = ( VPhysicalProd* ) * prodp;
+
+        /* this class only knows how to redirect messages to VPhysical */
+        prod -> phys = phys;
+	if(sub == prodPhysicalOut){
+		(*prodp) -> cctx.cache   = curs->blob_mru_cache;
+		(*prodp) -> cctx.col_idx = PHYSPROD_INDEX_OFFSET + (++curs -> phys_cnt);
+	}
+    }
+    return rc;
+}
+
+
+void VPhysicalProdDestroy ( VPhysicalProd *self )
+{
+}
+
+
+/* Read
+ */
+rc_t VPhysicalProdRead ( VPhysicalProd *self, VBlob **vblob, int64_t id, uint32_t cnt )
+{
+    uint32_t elem_bits;
+
+    if ( self == NULL )
+        return RC ( rcVDB, rcProduction, rcReading, rcSelf, rcNull );
+    if ( self -> phys == NULL )
+        return RC ( rcVDB, rcColumn, rcReading, rcSelf, rcNull );
+
+    elem_bits = VTypedescSizeof ( & self -> dad . desc );
+
+    switch ( self -> dad . sub )
+    {
+    case prodPhysicalOut:
+        return VPhysicalRead ( self -> phys, vblob, id, cnt, elem_bits );
+    case prodPhysicalKCol:
+        return VPhysicalReadKColumn ( self -> phys, vblob, id, elem_bits );
+    }
+
+    return RC ( rcVDB, rcProduction, rcReading, rcType, rcInvalid );
+}
+
+uint32_t VPhysicalProdFixedRowLength ( const VPhysicalProd *Self, int64_t row_id ) {
+    const VPhysical *self;
+    
+    if ( Self == NULL )
+        return 0;
+    self = Self->phys;
+    if ( self == NULL )
+        return 0;
+    return self->fixed_len;
+}
+
+rc_t VPhysicalProdColumnIdRange ( const VPhysicalProd *Self,
+                               int64_t *first, int64_t *last )
+{
+    const VPhysical *self;
+    
+    if ( Self == NULL )
+        return RC ( rcVDB, rcProduction, rcReading, rcSelf, rcNull );
+
+    self = Self->phys;
+    if ( self == NULL )
+        return RC ( rcVDB, rcColumn, rcReading, rcSelf, rcNull );
+    
+    if ( self -> knode != NULL )
+    {
+        *first = self->sstart_id;
+        *last  = self->sstop_id;
+        return 0;
+    }
+
+    if ( self -> kcol != NULL )
+    {
+        rc_t rc = VPhysicalLazySetRange ( ( VPhysical * ) self );
+        if ( rc == 0 )
+        {
+            *first = self->kstart_id;
+            *last  = self->kstop_id;
+        }
+        return rc;
+    }
+
+    return RC ( rcVDB, rcColumn, rcReading, rcRange, rcEmpty );
+}
+
+
+/* IsStatic
+ *  is this a static column
+ */
+rc_t VPhysicalIsStatic ( const VPhysical *self, bool *is_static )
+{
+    assert ( is_static != NULL );
+
+    if ( self == NULL )
+    {
+        * is_static = false;
+        return RC ( rcVDB, rcColumn, rcAccessing, rcSelf, rcNull );
+    }
+
+    * is_static = self -> knode != NULL;
+    return 0;
+}
+
+/* GetKColumn
+ *  try to get a KColumn,
+ *  and if that fails, indicate whether the column is static
+ */
+rc_t VPhysicalGetKColumn ( const VPhysical * self, struct KColumn ** kcol, bool * is_static )
+{
+    assert ( kcol != NULL );
+    assert ( is_static != NULL );
+
+    if ( self == NULL )
+    {
+        * kcol = NULL;
+        * is_static = false;
+        return RC ( rcVDB, rcColumn, rcAccessing, rcSelf, rcNull );
+    }
+
+    if ( self -> kcol != NULL )
+    {
+        rc_t rc = KColumnAddRef ( self -> kcol );
+        if ( rc == 0 )
+            * kcol = ( KColumn * ) self -> kcol;
+        return rc;
+    }
+
+    if ( self -> knode != NULL )
+    {
+        * is_static = true;
+        return SILENT_RC ( rcVDB, rcColumn, rcAccessing, rcType, rcIncorrect );
+    }
+
+    return RC ( rcVDB, rcColumn, rcAccessing, rcColumn, rcNotOpen );
+}
diff --git a/libs/vdb/phys-load.c b/libs/vdb/phys-load.c
new file mode 100644
index 0000000..2f22cb4
--- /dev/null
+++ b/libs/vdb/phys-load.c
@@ -0,0 +1,330 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+
+#define KONST const
+#include "phys-priv.h"
+#include "schema-parse.h"
+#include "schema-priv.h"
+#include "schema-expr.h"
+#include "cursor-priv.h"
+#include "prod-priv.h"
+#undef KONST
+
+#include <vdb/cursor.h>
+#include <kdb/column.h>
+#include <kdb/meta.h>
+#include <klib/symbol.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+#define ALLOW_V1_UPDATE 0
+
+/*--------------------------------------------------------------------------
+ * VPhysical
+ */
+
+/* LoadSchema
+ *  looks in metadata for stored schema
+ */
+static
+rc_t CC VPhysicalLoadV1Schema ( VPhysical *self,
+    VTypedecl *td, VSchema *schema, const KMDataNode *node )
+{
+    rc_t rc;
+
+    KMDataNodeSchemaFillData pb;
+    pb . node = node;
+    pb . pos = 0;
+    pb . add_v0 = true;
+
+    /* add stored declaration to cursor schema */
+    rc = VSchemaParseTextCallback ( schema,
+        "VPhysicalLoadV1Schema", KMDataNodeFillSchema, & pb );
+   if ( rc == 0 )
+    {
+        size_t size;
+        char type_expr [ 256 ];
+
+        /* retrieve and resolve "type" attribute */
+        rc = KMDataNodeReadAttr ( node, "type",
+            type_expr, sizeof type_expr, & size );
+        if ( rc == 0 )
+            rc = VSchemaResolveTypedecl ( schema, td, "%s", type_expr );
+
+        /* if a decoding schema exists */
+        if ( rc == 0 && pb . pos != 0 )
+        {
+            char sphysical_name [ 512 ];
+
+            /* preserve schema function expression */
+            size_t decoding_xsize;
+            char decoding_expr [ 256 ];
+            rc = KMDataNodeReadAttr ( node, "schema",
+                decoding_expr, sizeof decoding_expr, & decoding_xsize );
+            if ( rc == 0 )
+            {
+                /* look for "encoding" */
+                const KMDataNode *enc;
+                rc = KMetadataOpenNodeRead ( self -> meta, & enc, "encoding" );
+                if ( rc == 0 )
+                {
+#if ALLOW_V1_UPDATE
+                    if ( ! self -> read_only )
+                    {
+                        /* add stored declaration to cursor schema */
+                        pb . node = enc;
+                        pb . pos = 0;
+                        pb . add_v0 = true;
+                        rc = VSchemaParseTextCallback ( schema,
+                            "VPhysicalLoadV1Schema", KMDataNodeFillSchema, & pb );
+                    }
+                    if ( rc == 0 )
+#endif
+                    {
+                        /* preserve schema function expression */
+                        size_t encoding_xsize;
+                        char encoding_expr [ 256 ], enc_type [ 256 ];
+                        rc = KMDataNodeReadAttr ( enc, "schema",
+                            encoding_expr, sizeof encoding_expr, & encoding_xsize );
+                        if ( rc == 0 )
+                        {
+                            rc = KMDataNodeReadAttr ( enc, "type",
+                                enc_type, sizeof enc_type, & size );
+                        }
+                        if ( rc == 0 )
+                        {
+#if ALLOW_V1_UPDATE
+                            if ( self -> read_only )
+                            {
+#endif
+                                /* build sphysical name */
+                                sprintf ( sphysical_name, "%s_only", decoding_expr );
+
+                                /* build physical decl */
+                                pb . pos = sprintf ( pb . buff, "version 1;"
+                                                     "physical %s %s:phys#1"
+                                                     "{decode{%s k=@;return %s(k);}}"
+                                                     , type_expr
+                                                     , sphysical_name
+                                                     , enc_type
+                                                     , decoding_expr
+                                    );
+#if ALLOW_V1_UPDATE
+                            }
+                            else
+                            {
+                                /* strip off common namespace */
+                                size_t i, ns_size;
+                                string_match ( decoding_expr, decoding_xsize,
+                                    encoding_expr, encoding_xsize, -1, & ns_size );
+                                if ( ns_size != 0 )
+                                {
+                                    char *p = string_rchr ( decoding_expr, ns_size, ':' );
+                                    ns_size = ( p == NULL ) ? 0U : ( uint32_t ) ( p - decoding_expr ) + 1U;
+                                }
+
+                                /* build sphysical name */
+                                sprintf ( sphysical_name, "%s_%s", decoding_expr, & encoding_expr [ ns_size ] );
+                                for ( i = ns_size; sphysical_name [ i ] != 0; ++ i )
+                                {
+                                    if ( sphysical_name [ i ] == ':' )
+                                        sphysical_name [ i ] = '_';
+                                }
+
+                                /* build physical decl */
+                                pb . pos = sprintf ( pb . buff, "version 1;"
+                                                     "physical %s %s:phys#1"
+                                                     "{encode{return %s(@);}"
+                                                     "decode{%s k=@;return %s(k);}}"
+                                                     , type_expr
+                                                     , sphysical_name
+                                                     , encoding_expr
+                                                     , enc_type
+                                                     , decoding_expr
+                                    );
+                            }
+#endif
+                        }
+                    }
+
+                    KMDataNodeRelease ( enc );
+                }
+                else if ( GetRCState ( rc ) == rcNotFound )
+                {
+                    /* build sphysical name */
+                    sprintf ( sphysical_name, "%s_only", decoding_expr );
+
+                    /* build decode-only physical decl */
+                    pb . pos = sprintf ( pb . buff, "version 1;"
+                                         "physical %s %s:phys#1"
+                                         "{decode{opaque k=@;return %s(k);}}"
+                                         , type_expr
+                                         , sphysical_name
+                                         , decoding_expr
+                        );
+                    rc = 0;
+                }
+                if ( rc == 0 )
+                {
+                    /* parse synthesized schema into cursor VSchema */
+                    rc = VSchemaParseText ( schema,
+                        "VPhysicalLoadV1Schema", pb . buff, pb . pos );
+                    if ( rc == 0 )
+                    {
+                        VTypedecl etd;
+
+                        /* create a new expression object */
+                        sprintf ( pb . buff, "%s:phys#1", sphysical_name );
+                        rc = VSchemaImplicitPhysEncExpr ( schema, & etd,
+                            & self -> enc, pb . buff, "VPhysicalLoadV1Schema" );
+                        if ( rc != 0 )
+                        {
+                            PLOGERR ( klogInt, ( klogInt, rc, "failed to establish column type from '$(expr)'",
+                                       "expr=%s", pb . buff ));
+                        }
+                        else if ( self -> smbr != NULL && self -> smbr -> type == NULL )
+                        {
+                            /* back-patch schema */
+                            ( ( SPhysMember* ) self -> smbr ) -> type = self -> enc;
+                            atomic32_inc ( & ( ( SExpression* ) self -> enc ) -> refcount );
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    KMDataNodeRelease ( node );
+    return rc;
+}
+
+static
+rc_t CC VPhysicalLoadSchema ( VPhysical *self,
+    VTypedecl *td, VSchema *schema, const KMDataNode *node )
+{
+    rc_t rc;
+
+    KMDataNodeSchemaFillData pb;
+    pb . node = node;
+    pb . pos = 0;
+    pb . add_v0 = false;
+
+    /* add stored declaration to cursor schema */
+    rc = VSchemaParseTextCallback ( schema,
+        "VPhysicalLoadSchema", KMDataNodeFillSchema, & pb );
+    if ( rc == 0 )
+    {
+        /* retrieve fully-resolved type attribute */
+        rc = KMDataNodeReadAttr ( node, "type",
+            pb . buff, sizeof pb . buff, & pb . pos );
+        if ( rc == 0 )
+            rc = VSchemaResolveTypedecl ( schema, td, "%s", pb . buff );
+        if ( rc == 0 )
+        {
+            /* get encoding expression */
+            rc = KMDataNodeReadAttr ( node, "expr",
+                pb . buff, sizeof pb . buff, & pb . pos );
+            if ( rc == 0 )
+            {
+                VTypedecl etd;
+
+                /* create a new expression object */
+                rc = VSchemaImplicitPhysEncExpr ( schema, & etd,
+                    & self -> enc, pb . buff, "VPhysicalLoadSchema" );
+                if ( rc != 0 )
+                {
+                    PLOGERR ( klogInt, ( klogInt, rc, "failed to establish column type from '$(expr)'",
+                               "expr=%s", pb . buff ));
+                }
+
+                /* match SPhysical type against stated type */
+                else if ( ! VTypedeclToTypedecl ( & etd, schema, td, NULL, NULL ) )
+                {
+                    rc = RC ( rcVDB, rcColumn, rcLoading, rcType, rcInconsistent );
+                    PLOGERR ( klogInt, ( klogInt, rc, "inconsistent metadata for column '$(name)'"
+                               , "name=%.*s"
+                               , ( int ) self -> smbr -> name -> name . size
+                               , self -> smbr -> name -> name . addr ));
+                }
+            }
+            else if ( GetRCState ( rc ) == rcNotFound )
+            {
+                rc = 0;
+            }
+        }
+    }
+
+    KMDataNodeRelease ( node );
+    return rc;
+}
+
+rc_t VPhysicalLoadMetadata ( VPhysical *self, VTypedecl *td, VSchema *schema )
+{
+    /* capture fixed row length */
+    const KMDataNode *node;
+    rc_t rc = KMetadataOpenNodeRead ( self -> meta, & node, "row-len" );
+    if ( rc == 0 )
+    {
+        rc = KMDataNodeReadAsU32 ( node, & self -> fixed_len );
+        KMDataNodeRelease ( node );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* look for "schema" root node */
+    rc = KMetadataOpenNodeRead ( self -> meta, & node, "schema" );
+    if ( rc == 0 )
+        return VPhysicalLoadSchema ( self, td, schema, node );
+    if ( GetRCState ( rc ) != rcNotFound )
+        return rc;
+
+    /* appears to be an older column */
+    self -> v01 = true;
+
+    /* look for "decoding" root node */
+    rc = KMetadataOpenNodeRead ( self -> meta, & node, "decoding" );
+    if ( rc == 0 )
+        return VPhysicalLoadV1Schema ( self, td, schema, node );
+    if ( GetRCState ( rc ) != rcNotFound )
+        return rc;
+
+    /* benign error for very old columns */
+    rc = RC ( rcVDB, rcColumn, rcLoading, rcSchema, rcNotFound );
+
+    DBGMSG(DBG_VDB, DBG_FLAG(DBG_VDB_VDB),
+        ("VPhysicalLoadMetadata = %d\n", rc));
+
+    return rc;
+}
diff --git a/libs/vdb/phys-priv.h b/libs/vdb/phys-priv.h
new file mode 100644
index 0000000..6ec1ab6
--- /dev/null
+++ b/libs/vdb/phys-priv.h
@@ -0,0 +1,194 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_phys_priv_
+#define _h_phys_priv_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_data_buffer_
+#include <klib/data-buffer.h>
+#endif
+
+#ifndef KONST
+#define KONST
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KColumn;
+struct KMetadata;
+struct KMDataNode;
+struct VTypedecl;
+struct VSchema;
+struct VTable;
+struct VCursor;
+struct VBlob;
+struct SExpression;
+struct SPhysMember;
+struct VProduction;
+
+
+/*--------------------------------------------------------------------------
+ * VPhysical
+ *
+ *  "?start_id" is a starting id for column
+ *
+ *  "?stop_id" is an INCLUSIVE stop id for column, where the apparent
+ *  convention was to whine about using intervals at all due to legacy
+ *  issues while at the same time using "stop" as a lame attempt at
+ *  indicating fully-closed vs. "end" to indicate half-closed intervals.
+ */
+typedef struct VPhysical VPhysical;
+struct VPhysical
+{
+    /* physical column */
+    int64_t kstart_id, kstop_id;
+    struct KColumn KONST *kcol;
+    struct KMetadata KONST *meta;
+
+    /* static column */
+    int64_t sstart_id, sstop_id;
+    struct KMDataNode KONST *knode;
+
+    /* owning cursor */
+    struct VCursor KONST *curs;
+
+    /* definition from schema */
+    struct SPhysMember const *smbr;
+
+    /* encoding expression */
+    struct SExpression const *enc;
+
+    /* read production
+       provides decompressed data,
+       with correct byte-order */
+    struct VProduction *out;
+
+    /* output of decompression schema */
+    struct VProduction *b2p;
+
+    /* output of compression schema */
+    struct VProduction *b2s;
+
+    /* write production
+       provides decompressed data
+       in native byte-order */
+    struct VProduction *in;
+
+    /* cached static row data */
+    KDataBuffer srow;
+
+    /* id */
+    uint32_t id;
+
+    /* fixed row length */
+    uint32_t fixed_len;
+
+    /* synthesize v1 blob header */
+    bool no_hdr;
+
+    /* v0 or v1 blobs */
+    bool v01;
+
+    /* recorded at create time */
+    bool read_only;
+};
+
+/* symbol for failed production */
+#define FAILED_PHYSICAL ( ( VPhysical* ) 1U )
+
+/* Make
+ *  make an empty object
+ */
+rc_t VPhysicalMake ( VPhysical **phys,
+    struct VCursor KONST *curs, struct SPhysMember const *smbr );
+
+/* Whack
+ */
+void VPhysicalDestroy ( VPhysical *self );
+void CC VPhysicalWhack ( void *self, void *ignore );
+
+/* Open
+ *  open existing columns
+ *  load schema definitions
+ */
+rc_t VPhysicalOpenWrite ( VPhysical *self,
+    struct VSchema *schema, struct VTable const *tbl );
+rc_t VPhysicalOpenRead ( VPhysical *self,
+    struct VSchema *schema, struct VTable const *tbl );
+
+/* Finish
+ *  complete common open procedures
+ */
+rc_t VPhysicalFinishKColumn ( VPhysical *self,
+    struct VSchema *schema, struct SPhysMember const *smbr );
+rc_t VPhysicalFinishStatic ( VPhysical *self,
+    struct VSchema const *schema, struct SPhysMember const *smbr );
+
+/* LoadMetadata
+ *  looks in metadata for stored schema
+ *  loads fixed row length
+ */
+rc_t VPhysicalLoadMetadata ( VPhysical *self,
+    struct VTypedecl *td, struct VSchema *schema );
+
+/* Read
+ *  get the blob
+ */
+rc_t VPhysicalRead ( VPhysical *self,
+    struct VBlob **vblob, int64_t id, uint32_t cnt, uint32_t elem_bits );
+rc_t VPhysicalReadBlob ( VPhysical *self,
+    struct VBlob **vblob, int64_t id, uint32_t elem_bits );
+
+/* IsStatic
+ *  is this a static column
+ */
+rc_t VPhysicalIsStatic ( const VPhysical *self, bool *is_static );
+
+/* GetKColumn
+ *  try to get a KColumn,
+ *  and if that fails, indicate whether the column is static
+ */
+rc_t VPhysicalGetKColumn ( const VPhysical * self, struct KColumn ** kcol, bool * is_static );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_phys_priv_ */
diff --git a/libs/vdb/phys.c b/libs/vdb/phys.c
new file mode 100644
index 0000000..5e216f7
--- /dev/null
+++ b/libs/vdb/phys.c
@@ -0,0 +1,67 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define KONST const
+#define SKONST const
+#include "phys-priv.h"
+#include "prod-priv.h"
+#include "blob-priv.h"
+#undef KONST
+#undef SKONST
+
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * VPhysical
+ */
+
+
+/* Whack
+ */
+void CC VPhysicalWhack ( void *item, void *ignore )
+{
+    VPhysical *self = item;
+    if ( self > FAILED_PHYSICAL )
+        VPhysicalDestroy ( self );
+}
+
+/* Read
+ *  get the blob
+ */
+rc_t VPhysicalRead ( VPhysical *self, VBlob **vblob, int64_t id, uint32_t cnt, uint32_t elem_bits )
+{
+    return VPhysicalReadBlob ( self, vblob, id, elem_bits );
+}
diff --git a/libs/vdb/prod-cmn.c b/libs/vdb/prod-cmn.c
new file mode 100644
index 0000000..a77c8a8
--- /dev/null
+++ b/libs/vdb/prod-cmn.c
@@ -0,0 +1,2567 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define USE_EUGENE 1
+
+
+#define TRACK_REFERENCES 0
+
+#include <vdb/extern.h>
+
+#define KONST const
+#include "prod-priv.h"
+#include "prod-expr.h"
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "schema-expr.h"
+#include "table-priv.h"
+#include "cursor-priv.h"
+#include "linker-priv.h"
+#include "column-priv.h"
+#include "phys-priv.h"
+#include "blob-priv.h"
+#include "blob.h"
+#include "page-map.h"
+#include "blob-headers.h"
+#undef KONST
+
+#include <vdb/schema.h>
+#include <vdb/cursor.h>
+#include <vdb/xform.h>
+#include <klib/symbol.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <ctype.h>
+#include <os-native.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <bitstr.h>
+#include <stdio.h>
+#include <limits.h>
+
+#if !defined(WINDOWS)  &&  !defined(_WIN32)  &&  !defined(NCBI_WITHOUT_MT)
+#define LAUNCH_PAGEMAP_THREAD 1
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * VBlob
+ */
+
+
+static
+void CC vblob_release ( void *item, void *ignore )
+{
+    TRACK_BLOB ( VBlobRelease, ( VBlob* ) item );
+    VBlobRelease ( ( VBlob* ) item );
+}
+
+/*--------------------------------------------------------------------------
+ * VProduction
+ */
+
+
+/* Make
+ *  allocation and parent initialization
+ *  called from the "Make" functions below
+ *
+ *  "prod" [ OUT ] - returned production
+ *
+ *  "size" [ IN ] - sizeof sub-type
+ *
+ *  "owned" [ IN ] - vector to contain productions
+ *
+ *  "var" [ IN ] - variant code, e.g. prodSimple, prodFunc
+ *
+ *  "sub" [ IN ] - sub-variant code, e.g. prodSimplePage2Blob
+ *
+ *  "name" [ IN, NULL OKAY ] - optional object name, derived
+ *  from schema if possible
+ *
+ *  "fd" [ IN ] and "desc" [ IN ] - production type description
+ *
+ *  "cid" [ IN ] - contextual ( two-level ) id
+ *
+ *  "chain" [ IN ] - which chain(s) are supported
+ *    chainEncoding    - when going from input to physical
+ *    chainDecoding    - when pulling from physical to output
+ *    chainUncommitted - when resolving trigger and validation expressions
+ */
+rc_t VProductionMake ( VProduction **prodp, Vector *owned, size_t size,
+    int var, int sub, const char *name, const VFormatdecl *fd,
+    const VTypedesc *desc, const VCtxId *cid, uint8_t chain )
+{
+    rc_t rc;
+    VProduction *prod;
+
+#if PROD_NAME
+    size_t psize = size;
+#endif
+
+    assert ( size >= sizeof * prod );
+
+#if PROD_NAME
+    if ( name != NULL )
+        size += strlen ( name );
+    size += 1;
+#endif
+
+    prod = calloc ( 1, size );
+    if ( prod == NULL )
+        rc = RC ( rcVDB, rcProduction, rcResolving, rcMemory, rcExhausted );
+    else
+    {
+        rc = VectorAppend ( owned, & prod -> oid, prod );
+        if ( rc != 0 )
+        {
+            free ( prod );
+            prod = NULL;
+        }
+        else
+        {
+#if PROD_NAME
+            prod -> name = ( ( const char* ) prod ) + psize;
+            strcpy ( ( char* ) prod -> name, name ? name : "" );
+#endif
+
+            if ( fd != NULL )
+                prod -> fd = * fd;
+            if ( desc != NULL )
+                prod -> desc = * desc;
+            if ( cid != NULL )
+                prod -> cid = * cid;
+
+            prod -> var = ( uint8_t ) var;
+            prod -> sub = ( uint8_t ) sub;
+            prod -> chain = chain;
+        }
+    }
+
+    * prodp = prod;
+    return rc;
+}
+
+#if PROD_CACHE
+static
+void VProductionFlushCacheDeep ( VProduction *self, const char *context )
+{
+    int i;
+    for ( i = 0; i < self -> cache_cnt; ++ i )
+    {
+#if TRACKING_BLOBS
+        if ( self -> cache [ i ] != NULL )
+        {
+            fprintf( stderr, "%p->%p(%d) dropped from cache on %s *** %s\n"
+                     , self
+                     , self -> cache [ i ]
+                     , atomic32_read ( & self -> cache -> refcount )
+                     , context
+                     , self -> name
+                );
+        }
+#endif
+        vblob_release ( self -> cache [ i ], NULL );
+        self -> cache [ i ] = NULL;
+    }
+}
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * VSimpleProd
+ *  single input param
+ */
+
+/* Make
+ */
+rc_t VSimpleProdMake ( VProduction **prodp, Vector *owned, struct VCursor const *curs,
+   int sub, const char *name, const VFormatdecl *fd, const VTypedesc *desc,
+    const VCtxId *cid, VProduction *in, uint8_t chain )
+{
+    VSimpleProd *prod;
+    rc_t rc = VProductionMake ( prodp, owned, sizeof * prod,
+        prodSimple, sub, name, fd, desc, cid, chain );
+    if ( rc == 0 )
+    {
+        prod = ( VSimpleProd* ) * prodp;
+        prod -> in = in;
+        prod -> curs = curs;
+    }
+    return rc;
+}
+
+static
+rc_t VSimpleProdPage2Blob ( VSimpleProd *self, VBlob **rslt, int64_t id ,uint32_t cnt)
+{
+    return VProductionReadBlob(self->in, rslt, id, cnt, NULL);
+}
+
+static
+rc_t VSimpleProdSerial2Blob ( VSimpleProd *self, VBlob **rslt, int64_t id, uint32_t cnt )
+{
+    /* read serialized blob */
+    VBlob *sblob;
+    rc_t rc = VProductionReadBlob ( self -> in, &sblob, id, cnt, NULL );
+    if ( rc == 0 )
+    {
+        /* recast data to 8 bit */
+        KDataBuffer buffer;
+        rc = KDataBufferCast ( & sblob -> data, & buffer, 8, false );
+        if (rc == 0)
+        {
+            /* create a new, fluffy blob having rowmap and headers */
+            VBlob *y;
+#if LAUNCH_PAGEMAP_THREAD
+            if(self->curs->pagemap_thread == NULL){
+                VCursor *curs = (VCursor*) self->curs;
+                if(--curs->launch_cnt<=0){
+                    /* ignoring errors because we operate with or without thread */
+                    VCursorLaunchPagemapThread(curs);
+                }
+            }
+#endif
+		
+            rc = VBlobCreateFromData ( & y, sblob -> start_id, sblob -> stop_id,
+                & buffer, VTypedescSizeof ( & self -> dad . desc ), self->curs->pagemap_thread?&self->curs->pmpr:NULL );
+            KDataBufferWhack ( & buffer );
+
+            /* return on success */
+            if ( rc == 0 )
+                * rslt = y;
+        }
+
+	vblob_release(sblob, NULL);
+    }
+
+    return rc;
+}
+
+
+static
+rc_t VSimpleProdBlob2Serial( VSimpleProd *self, VBlob **rslt, int64_t id, uint32_t cnt )
+{
+    rc_t rc;
+    VBlob *sblob;
+    
+    rc = VProductionReadBlob(self->in, &sblob, id, cnt, NULL);
+    if (rc == 0) {
+        VBlob *y;
+        
+        rc = VBlobNew(&y, sblob->start_id, sblob->stop_id, "blob2serial");
+        TRACK_BLOB (VBlobNew, y);
+        if (rc == 0) {
+            rc = KDataBufferMakeBytes(&y->data, 0);
+            if (rc == 0) {
+                /* save a reference to the page map so that fixed row-length can be determined */
+                y->pm = sblob->pm;
+                PageMapAddRef(y->pm);
+                
+                rc = VBlobSerialize(sblob, &y->data);
+                if (rc == 0)
+                    * rslt = y;
+            }
+            if (rc)
+	      vblob_release(y, NULL);
+        }
+
+	vblob_release(sblob, NULL);
+    }
+    return rc;
+}
+
+/* Read
+ *  return a blob containing row id
+ */
+rc_t VSimpleProdRead ( VSimpleProd *self, VBlob **vblob, int64_t id, uint32_t cnt, VBlobMRUCacheCursorContext *cctx)
+{
+    rc_t rc;
+
+    switch ( self -> dad . sub )
+    {
+    case prodSimpleCast:
+        rc = VProductionReadBlob ( self -> in, vblob, id , cnt, cctx );
+        break;
+    case prodSimplePage2Blob:
+        return VSimpleProdPage2Blob(self, vblob, id, cnt);
+    case prodSimpleSerial2Blob:
+        return VSimpleProdSerial2Blob(self, vblob, id, cnt);
+    case prodSimpleBlob2Serial:
+        return VSimpleProdBlob2Serial(self, vblob, id, cnt);
+    default:
+        * vblob = NULL;
+        return RC ( rcVDB, rcProduction, rcReading, rcProduction, rcCorrupt );
+    }
+
+    if ( rc == 0 )
+    {
+        VBlob *blob = * vblob;
+
+        /* force data buffer to reflect element size */
+        if ( self -> dad . fd . fmt == 0 &&
+             self -> dad . fd . td . type_id > 2 )
+        {
+            uint32_t elem_bits = VTypedescSizeof ( & self -> dad . desc );
+            if ( elem_bits != 0 && blob -> data . elem_bits != elem_bits )
+            {
+                rc = KDataBufferCast ( & blob -> data, & blob -> data, elem_bits, true );
+                if ( rc != 0 )
+                {
+                    vblob_release ( blob, NULL );
+                    * vblob = NULL;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * VFunctionProd
+ *  function input params are VProduction*
+ *  extern C function pointer and self object
+ */
+
+rc_t VFunctionProdMake ( VFunctionProd **prodp, Vector *owned,
+    const VCursor *curs, int sub, const char *name,
+    const VFormatdecl *fd, const VTypedesc *desc, uint8_t chain )
+{
+    VFunctionProd *prod;
+    rc_t rc = VProductionMake ( ( VProduction** ) prodp, owned,
+        sizeof * prod, prodFunc, sub, name, fd, desc, NULL, chain );
+    if ( rc == 0 )
+    {
+        prod = * prodp;
+        prod -> curs = curs;
+
+        if ( sub != prodFuncByteswap )
+            VectorInit ( & prod -> parms, 0, 4 );
+        else
+        {
+            SDatatype *dt = VSchemaFindTypeid ( curs -> schema, fd -> td . type_id );
+            assert ( dt != NULL );
+            prod -> u . bswap = dt -> byte_swap;
+            VectorInit ( & prod -> parms, 0, 1 );
+        }
+    }
+    return rc;
+}
+
+void VFunctionProdDestroy ( VFunctionProd *self )
+{
+    /* release input parameters */
+    VectorWhack ( & self -> parms, NULL, NULL );
+    if ( self -> whack != NULL )
+        ( * self -> whack ) ( self -> fself );
+}
+
+
+
+/* Read
+ */
+
+#define VECTOR_ALLOC_ARRAY( ARGC, ARRAY, S_ARRAY, H_ARRAY )	\
+    do { \
+        size_t const needed = (ARGC) * sizeof((ARRAY)[0]); \
+        (H_ARRAY) = NULL; \
+        (ARRAY) = &((S_ARRAY)[0]); \
+        if (needed > sizeof((S_ARRAY))) { \
+            (H_ARRAY) = malloc(needed); \
+            if ((H_ARRAY) == NULL) \
+                return RC(rcVDB, rcProduction, rcReading, rcMemory, rcExhausted); \
+            (ARRAY) = &((H_ARRAY)[0]); \
+        } \
+        memset((ARRAY), 0, needed); \
+    } while (0)
+
+#define VECTOR_COPY_TO_ARRAY( VECTOR, ARRAY )	\
+    do { \
+        int i, n; \
+        for (n = (i = VectorStart((VECTOR))) + VectorLength((VECTOR)); i != n; ++i) \
+            (ARRAY)[i] = VectorGet((VECTOR), i); \
+    } while (0)
+
+#define VECTOR_TO_ARRAY( ARGC, ARRAY, S_ARRAY, H_ARRAY, VECTOR )	\
+    do { \
+        VECTOR_ALLOC_ARRAY((ARGC), (ARRAY), (S_ARRAY), (H_ARRAY)); \
+        VECTOR_COPY_TO_ARRAY((VECTOR), (ARRAY)); \
+    } while (0)
+
+static
+rc_t VFunctionProdCallNDRowFunc(
+                                VFunctionProd *self,
+                                VBlob **prslt,
+                                int64_t row_id,
+                                const VXformInfo *info,
+                                Vector *args
+                                )
+{
+    rc_t rc;
+    
+    /* create output blob
+       TBD - try to used cached blob if available */
+#if PROD_NAME
+    rc = VBlobNew ( prslt, row_id, row_id, self->dad.name );
+#else
+    rc = VBlobNew ( prslt, row_id, row_id, "VFunctionProdCallNDRowFunc" );
+#endif
+    TRACK_BLOB ( VBlobNew, *prslt );
+    if ( rc == 0 )
+    {
+        VRowResult rslt;
+        VRowData on_stack [ 16 ], *on_heap, *argv;
+
+        VBlob *blob = * prslt;
+        uint32_t i, argc = VectorLength ( args );
+
+        /* create and populate array of input parameters */
+        VECTOR_ALLOC_ARRAY(argc, argv, on_stack, on_heap);
+        for ( i = 0; i < argc; ++ i )
+        {
+            const VBlob *in = VectorGet(args, i);
+            uint32_t first_elem;
+
+            /* always point to page base address */
+            argv [ i ] . u . data . base = in -> data . base;
+
+            /* get row length and starting element in one pass */
+            argv [ i ] . u . data . elem_count = PageMapGetIdxRowInfo ( in -> pm, (uint32_t)( row_id - in -> start_id ), & first_elem, NULL ); 
+            argv [ i ] . u . data . first_elem = first_elem;
+            
+            /* finally set the element size */
+            argv [ i ] . u . data . elem_bits = in -> data . elem_bits;
+        }
+
+        /* fill out return param block
+           NB - the initially passed-in buffer
+           may be reallocated by external function */
+        rslt . data =  & blob -> data;
+        rslt . elem_count = 0;
+        rslt . elem_bits = blob -> data . elem_bits =
+            VTypedescSizeof ( & self -> dad . desc );
+        rslt.no_cache = 0;
+        
+        blob -> byte_order = vboNative;
+
+        /* invoke the row function */
+        rc = self -> u . ndf ( self -> fself, info, row_id, & rslt, argc, argv );
+        blob->no_cache = (rslt.no_cache ? true : false);
+
+        /* clean up input arguments */
+        if ( on_heap != NULL )
+            free ( on_heap );
+
+        /* take reallocated buffer */
+        if ( rslt . data != & blob -> data )
+        {
+            KDataBufferWhack ( & blob -> data );
+            KDataBufferSub ( rslt . data, & blob -> data, 0, UINT64_MAX );
+            KDataBufferWhack ( rslt . data );
+        }
+        blob->data.elem_count = rslt.elem_count;
+
+        /* if the function was successful incorporate row length */
+        if (rc == 0)
+        {
+            assert(rslt . elem_count >> 32 == 0);
+            rc = PageMapNewFixedRowLength ( & blob -> pm, 1, (uint32_t)rslt . elem_count );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        vblob_release ( blob, NULL );
+
+        *prslt = NULL;
+    }
+
+    return rc;
+}
+
+/* TODO: enable in next release */
+#define PAGEMAP_PRE_EXPANDING_SINGLE_ROW_FIX 0
+static
+rc_t VFunctionProdCallNullaryRowFunc(VFunctionProd *self,
+                                     VBlob **prslt,
+                                     int64_t row_id,
+                                     uint32_t row_count,
+                                     const VXformInfo *info)
+{
+    rc_t rc = 0;
+    KDataBuffer scratch;
+    VRowData args[1];
+    VRowResult rslt;
+
+    memset(&scratch, 0, sizeof(scratch));
+    memset(&args[0], 0, sizeof(args[0]));
+
+    rslt.data = &scratch;
+    rslt.elem_count = 0;
+    rslt.elem_bits = scratch.elem_bits = VTypedescSizeof(&self->dad.desc);
+
+    rc = self->u.rf(self->fself, info, row_id, &rslt, 0, args);
+    if (rc == 0) {
+        VBlob *blob = NULL;
+
+#if PROD_NAME
+        rc = VBlobNew ( &blob, -INT64_MAX - 1, INT64_MAX, self->dad.name );
+#else
+        rc = VBlobNew ( &blob, -INT64_MAX - 1, INT64_MAX, "VFunctionProdCallDetRowFunc" );
+#endif
+        if (rc == 0) {
+            blob->byte_order = vboNative;
+            assert(rslt.elem_count <= UINT32_MAX);
+            KDataBufferSub(rslt.data, &blob->data, 0, rslt.elem_count);
+            if ( rslt.data != & scratch )
+                KDataBufferWhack(rslt.data);
+            rc = PageMapNewSingle(&blob->pm, UINT32_MAX, (uint32_t)rslt.elem_count);
+            if (rc == 0)
+                *prslt = blob;
+            else
+                vblob_release(blob, NULL);
+        }
+    }
+    KDataBufferWhack(&scratch);
+    return rc;
+}
+
+static bool computeWindow(uint32_t *const pwindow, int64_t const start_id, int64_t const stop_id, int64_t const row_id, uint32_t const max_blob_regroup)
+{
+    int64_t window = stop_id - start_id + 1;
+    bool window_resized = false;
+
+    /*** from previous fetch **/
+
+    /** detect sequentual io ***/
+    if (row_id == stop_id + 1)
+    {
+        if (window > max_blob_regroup)
+        {
+            window = max_blob_regroup;
+            window_resized = true;
+        }
+        else if (row_id % (4 * window) == 1)
+        {
+            if (window < max_blob_regroup)
+            {
+                if (4 * window <= max_blob_regroup)
+                    window *= 4;
+                else
+                    window = max_blob_regroup;
+                window_resized = true;
+            }
+            /* we know that row_id lands on the first row of the new window */
+        }
+    }
+    else
+    {
+        /* random access - use tiny blob window */
+        window = 1;
+        window_resized = true;
+    }
+    assert(window <= UINT32_MAX);
+    *pwindow = window;
+    return window_resized;
+}
+
+#if UNIT_TEST_VDB_3058
+static void UnitTest_VDB_3058(void)
+{
+/* test for case of integer overflow to zero causing divide-by-zero error in computeWindow */
+    uint32_t max_blob_regroup = 1024;
+    uint32_t window = 0;
+    int64_t start_id = 1;
+    int64_t stop_id = UINT32_MAX / 4 + 1;
+    int64_t row_id = stop_id + 1;
+    bool window_resized = computeWindow(&window, start_id, stop_id, row_id, max_blob_regroup);
+
+    /* this output isn't important, it's just to make sure that
+     * the compiler doesn't optimize out the relevant computations */
+    printf("window: %u\nwindow_resized: %s\n", window, window_resized ? "true" : "false");
+}
+#endif
+
+static
+rc_t VFunctionProdCallRowFunc1( VFunctionProd *self, VBlob **prslt, int64_t row_id,
+    uint32_t row_count, const VXformInfo *info, Vector *args,int64_t param_start_id,int64_t param_stop_id)
+{
+    rc_t rc;
+    uint32_t i, argc = VectorLength ( args );
+    VRowResult rslt;
+    VRowData args_os[16], *args_oh, *argv;
+    KDataBuffer scratch;
+    VBlob *blob;
+    const VBlob *in;
+    PageMapIterator iter_os[16], *iter_oh, *iter;
+    uint64_t last = 0;
+    uint32_t last_len = 0;
+    uint32_t window;
+	uint32_t min_row_count=UINT32_MAX; /* will increase row_count due to larger common repeat count of parameters */
+    int64_t  row_id_max=0;
+    uint32_t max_blob_regroup; /** max rows in blob for regrouping ***/
+    bool function_failed = false;
+    bool window_resized = false;
+    
+    if(self->curs->cache_curs && self->curs->cache_col_active){
+        /*** since cache_cursor exist, trying to avoid prefetching data which is in cache cursor ***/
+		row_id_max = self->curs->cache_empty_end;
+		max_blob_regroup=256;
+    } else {
+		max_blob_regroup=1024;
+    }
+	if(self->dad.sub == vftRowFast)
+    {
+		window = max_blob_regroup;
+	}
+    else
+    {
+        window_resized = computeWindow(&window, self->start_id, self->stop_id, row_id, max_blob_regroup);
+	}
+
+    assert ( 0 < window && window <= max_blob_regroup );
+
+    if(window == 1)
+    {
+        /* random access or initial blob - create blob with initial row-count */
+		self->start_id=self->stop_id=row_id;
+		if(row_count > 0)
+            self->stop_id += row_count-1;
+    }
+    else
+    {
+        /* start out with supplied row range */
+        self->start_id=param_start_id;
+        self->stop_id =param_stop_id;
+        assert(row_id >= self->start_id && row_id  + row_count -1 <= self->stop_id);
+
+        /* special code to detect an old-style static column with infinite range */
+        if(self->start_id==-INT64_MAX - 1 || self->stop_id==INT64_MAX)
+        {
+            /* same logic as above */
+            self->start_id=self->stop_id=row_id;
+            if(row_count > 0)
+                self->stop_id += row_count-1;
+        }
+
+        /* this code only executes if requested row-count is 1 */
+        else if ( row_count == 1 )
+        {
+            /* the blob itself has to be at least twice the window size.
+              this may be a problem because once "window" becomes large enough,
+              it could cause us to switch from "reblobbing" back to whole blob. */
+            if ( self->stop_id - self->start_id > 2*window)
+            {
+                /* determine which "window" ( relative to start of TABLE ) contains row_id */
+                int64_t	n=(row_id-1)/window;
+
+                /* look at blob left edge, move up to window left edge if possible */
+                if(self->start_id <= n*window)
+                    self->start_id=n*window+1;
+
+                /* look at blob right edge, move down to window right edge if possible */
+                if(self->stop_id > (n+1) * window)
+                    self->stop_id = (n+1)*window;
+
+                /* eventual window from self->start_id..self->stop_id must be <= "window" size */
+                assert ( self -> start_id <= self -> start_id );
+                assert ( self -> stop_id - self -> start_id + 1 <= window );
+            }
+            else if ( window_resized )
+            {
+                self -> start_id = row_id;
+            }
+            else
+            {
+                /* handle case when the window has grown large enough
+                   to disable reblobbing after blobbing was once in place */
+            }
+        }
+    }
+
+    /* create and populate array of input parameters */
+    VECTOR_ALLOC_ARRAY(argc, argv, args_os, args_oh);
+    VECTOR_ALLOC_ARRAY(argc, iter, iter_os, iter_oh);
+    for (i = 0; i != argc; ++ i){
+		
+        in = VectorGet(args, i);
+       
+		if(in->start_id == -INT64_MAX - 1 ) {
+			rc = PageMapNewIterator(in->pm, &iter[i],0,-1);
+		} else if(param_stop_id>self->stop_id && param_stop_id < INT64_MAX){
+			rc = PageMapNewIterator(in->pm, &iter[i], self->start_id-in->start_id, param_stop_id - self->start_id + 1);
+			if(rc == 0){
+				uint32_t n = PageMapIteratorRepeatCount(&iter[i]);
+				if(n < min_row_count) min_row_count=n;
+			}
+		} else {
+			rc = PageMapNewIterator(in->pm, &iter[i], self->start_id-in->start_id, self->stop_id - self->start_id + 1);
+		}
+        if ( rc ) break;
+        argv[i].variant = vrdData;
+        argv[i].blob_stop_id = in->stop_id;
+        argv[i].u.data.elem_bits = in->data.elem_bits;
+        argv[i].u.data.base = in->data.base;
+        argv[i].u.data.base_elem_count = in->data.elem_count;
+    }
+	if(min_row_count < UINT32_MAX && self->start_id + min_row_count -1 > self->stop_id ){
+		self->stop_id = self->start_id + min_row_count - 1;
+	}
+	if(row_id_max >= row_id && self->stop_id > row_id_max)     self->stop_id = row_id_max;
+
+
+
+
+#if PROD_NAME
+    rc = VBlobNew ( &blob, self->start_id, self->stop_id, self->dad.name );
+#else
+    rc = VBlobNew ( &blob, self->start_id, self->stop_id, "VFunctionProdCallDetRowFunc" );
+#endif
+    TRACK_BLOB ( VBlobNew, blob );
+    if (rc)
+        return rc;
+    
+#if PAGEMAP_PRE_EXPANDING_SINGLE_ROW_FIX
+#else
+    rc = PageMapNew(&blob->pm, row_count /**BlobRowCount(blob)**/);
+#if 0
+    /* disabled for causing problems with accumulating static columns */
+    if (rc == 0)
+		rc = PageMapPreExpandFull(blob->pm, BlobRowCount(blob));
+#endif
+    if (rc) {
+      vblob_release(blob, NULL);
+        return rc;
+    }
+#endif
+    
+    memset(&scratch, 0, sizeof(scratch));
+    rslt.data = &scratch;
+    rslt.elem_bits = scratch.elem_bits = blob->data.elem_bits = VTypedescSizeof(&self->dad.desc);
+    blob->byte_order = vboNative;
+    
+    
+    
+    for (row_id = self->start_id; row_id <= self->stop_id && rc == 0; ) {
+        uint32_t row_count = 1;
+        if(self->dad.sub == vftRow || self->dad.sub ==vftRowFast ){
+            row_count = PageMapIteratorRepeatCount(&iter[0]);
+            
+            for (i = 1; i != argc; ++i) {
+                uint32_t j = PageMapIteratorRepeatCount(&iter[i]);
+                if (row_count > j)
+                row_count = j;
+            }
+            if (row_id + row_count > self->stop_id + 1)
+            row_count = (uint32_t)( self->stop_id + 1 - row_id );
+        }
+        
+        for (i = 0; i != argc; ++i) {
+            argv[i].u.data.elem_count = PageMapIteratorDataLength(&iter[i]);
+            argv[i].u.data.first_elem = PageMapIteratorDataOffset(&iter[i]);
+        }
+        
+        rslt.elem_count = 0;
+        rc = self->u.rf(self->fself, info, row_id, &rslt, argc, argv);
+        if (rc) {
+            function_failed = true;
+            break;
+        }
+        
+        assert(rslt.elem_count >> 32 == 0);
+        
+        if (row_id == self->start_id) {
+#if PAGEMAP_PRE_EXPANDING_SINGLE_ROW_FIX
+            if (blob->start_id + row_count > blob->stop_id) {
+                last = blob->data.elem_count;
+                rc = KDataBufferResize(&blob->data, blob->data.elem_count + rslt.elem_count);
+                if (rc == 0) {
+                    bitcpy(blob->data.base, last * rslt.elem_bits,
+                           rslt.data->base, 0, rslt.elem_count * rslt.elem_bits);
+                    rc = PageMapNewSingle(&blob->pm, row_count, rslt.elem_count);
+                }
+            }
+            else
+            goto ADD_ROW_TO_BLOB;
+#else
+            goto ADD_ROW_TO_BLOB;
+#endif
+        }
+        else if (last_len != rslt.elem_count ||
+                 bitcmp(blob->data.base, last * rslt.elem_bits,
+                        rslt.data->base, 0, rslt.elem_count * rslt.elem_bits) != 0)
+        {
+        ADD_ROW_TO_BLOB:
+            last = blob->data.elem_count;
+            rc = KDataBufferResize(&blob->data, blob->data.elem_count + rslt.elem_count);
+            if (rc == 0) {
+                bitcpy(blob->data.base, last * rslt.elem_bits,
+                       rslt.data->base, 0, rslt.elem_count * rslt.elem_bits);
+                rc = PageMapAppendRows(blob->pm, rslt.elem_count, row_count, false);
+            }
+        }
+        else
+            rc = PageMapAppendRows(blob->pm, rslt.elem_count, row_count, true);
+        
+        /* drop any new buffer that was returned to us */
+        if (rslt.data != &scratch) {
+            KDataBufferWhack(rslt.data);
+        }
+        
+        if (rc) break;
+        
+        last_len = (uint32_t)rslt.elem_count;
+        
+        for (i = 0; i != argc; ++i)
+            PageMapIteratorAdvance(&iter[i], row_count);
+        row_id += row_count;
+    }
+    KDataBufferWhack(&scratch);    
+    if (args_oh) free(args_oh);
+    if (iter_oh) free(iter_oh);
+
+    if (rc == 0 || (function_failed && row_id > self->start_id)) {
+        *prslt = blob;
+        return 0;
+    }
+    vblob_release(blob, NULL);
+    
+    return rc;
+}
+
+static
+rc_t VFunctionProdCallRowFunc( VFunctionProd *self, VBlob **prslt, int64_t row_id,
+    uint32_t row_count, const VXformInfo *info, Vector *args,int64_t param_start_id,int64_t param_stop_id)
+{
+    uint32_t const argc = VectorLength(args);
+
+    if (argc == 0)
+        return VFunctionProdCallNullaryRowFunc(self, prslt, row_id, row_count, info);
+    else
+        return VFunctionProdCallRowFunc1(self, prslt, row_id, row_count, info, args, param_start_id, param_stop_id);
+}
+
+static
+rc_t VFunctionProdCallArrayFunc( VFunctionProd *self, VBlob **prslt,
+    int64_t id, const VXformInfo *info, Vector *args ) {
+    VBlob *rslt = 0;
+    VBlob *sblob;
+    rc_t rc;
+    
+    sblob = VectorGet(args, 0);
+    assert(sblob);
+    
+#if PROD_NAME
+    rc = VBlobNew(&rslt, sblob->start_id, sblob->stop_id, self->dad.name);
+#else
+    rc = VBlobNew(&rslt, sblob->start_id, sblob->stop_id, "VFunctionProdCallArrayFunc");
+#endif
+    TRACK_BLOB( VBlobNew, rslt );
+    if (rc == 0) {
+        rslt->pm = sblob->pm;
+        PageMapAddRef(rslt->pm);
+        
+        if (sblob->headers) {
+            if ( self -> dad . chain == chainEncoding )
+                rc = BlobHeadersCreateChild(sblob->headers, &rslt->headers);
+            else {
+                rslt->headers = (BlobHeaders *)BlobHeadersGetNextFrame(sblob->headers);
+                BlobHeadersAddRef(rslt->headers);
+            }
+        }
+        if (rc == 0) {
+	    rc = KDataBufferMake(&rslt->data, VTypedescSizeof(&self->dad.desc), sblob->data.elem_count);
+            if (rc == 0) {
+                rc = self->u.af(
+                                self->fself,
+                                info,
+                                rslt->data.base,
+                                sblob->data.base,
+                                sblob->data.elem_count
+                                );
+                if (rc == 0) {
+                    *prslt = rslt;
+                    return 0;
+                }
+            }
+        }
+
+        vblob_release( rslt, NULL );
+    }
+    
+    return rc;
+}
+
+static
+rc_t VFunctionProdCallPageFunc( VFunctionProd *self, VBlob **rslt, int64_t id, 
+    const VXformInfo *info, Vector *args )
+{
+    struct input_t {
+        const VBlob *blob;
+        bool	sb_input;
+        PageMapIterator cur_row;
+        bool at_end;
+    };
+    struct input_t on_stack[8];
+    struct input_t *on_heap;
+    struct input_t *argv;
+    
+    VRowData pb_stack[8];
+    VRowData *pb_heap;
+    VRowData *param;
+    
+    rc_t rc=0;
+    uint32_t i, argc = VectorLength(args);
+    int64_t start_id;
+    int64_t stop_id;
+    uint32_t elem_count;
+    uint32_t row_count;
+    int first_non_control_input;
+    int allInputsAreSingleRow;
+    VBlob *blob = NULL;
+    
+    VECTOR_ALLOC_ARRAY(argc, argv, on_stack, on_heap);
+    VECTOR_ALLOC_ARRAY(argc, param, pb_stack, pb_heap);
+
+    for (start_id = stop_id = 0,
+         first_non_control_input=-1,
+         allInputsAreSingleRow = true,
+         i = 0; i != argc ; ++i) {
+        const VBlob *b = (const VBlob *)VectorGet(args, i);
+        const VProduction *prod = (const VProduction *)VectorGet(&self->parms, i);
+
+
+        if(b->pm == NULL){
+            rc=PageMapProcessGetPagemap(&self->curs->pmpr,(PageMap**)(&b->pm));
+            if(rc != 0) return rc;
+        }
+        
+        if (prod->control) {
+            param[i].variant = vrdControl;
+            assert(0); /*** TBD: Not implemented ???? ***/
+        } else {
+            param[i].variant = vrdData;
+            argv[i].blob = b;
+            argv[i].sb_input = VBlobIsSingleRow(argv[i].blob);
+            allInputsAreSingleRow &= argv[i].sb_input;
+            
+            if(first_non_control_input < 0){
+                first_non_control_input = i;
+                start_id = argv[i].blob->start_id;
+                stop_id = argv[i].blob->stop_id;
+            } else {
+                if(start_id < argv[i].blob->start_id)
+                    start_id = argv[i].blob->start_id;
+                if(stop_id > argv[i].blob->stop_id)
+                    stop_id  = argv[i].blob->stop_id;
+            }
+        }
+    }
+    if ( allInputsAreSingleRow ) {
+	row_count = stop_id - start_id + 1;
+	if(row_count == 0 ) /*** case of static column **/
+		row_count=1;
+    } else {
+	row_count = stop_id - start_id + 1;
+    }
+    if (first_non_control_input < 0) /* no non-control inputs */
+        rc = RC(rcVDB, rcFunction, rcExecuting, rcParam, rcInvalid);
+    else if (start_id > stop_id )
+        rc = RC(rcVDB, rcFunction, rcExecuting, rcRange, rcEmpty);
+    
+    for ( elem_count = 0, i = 0; i != argc && rc ==0; ++i) {
+        rc = PageMapNewIterator(argv[i].blob->pm, &argv[i].cur_row, start_id - argv[i].blob->start_id ,row_count);
+        if(rc == 0){
+            PageMapIterator temp = argv[i].cur_row;
+            uint32_t ec = 0;
+            
+            if ( argv[i].sb_input ){
+                ec = PageMapIteratorDataLength(&temp) * row_count;
+            } else do {
+                ec+=PageMapIteratorDataLength(&temp);
+            } while (PageMapIteratorNext(&temp));
+            if(ec == 0){
+                rc = RC(rcVDB, rcFunction, rcExecuting, rcPagemap, rcInvalid); /* bad page map */
+            } else if (elem_count == 0){
+                elem_count=ec;
+            } else if (ec != elem_count){
+                rc = RC(rcVDB, rcFunction, rcExecuting, rcParam, rcInvalid); /* Pages have to have the same number of elements*/
+            }
+    	}
+    }
+    
+    while (rc == 0) /* not really while */ {
+#if PROD_NAME
+        rc = VBlobNew(&blob, start_id, stop_id, self->dad.name);
+#else
+        rc = VBlobNew(&blob, start_id, stop_id, "VFunctionProdCallPageFunc");
+#endif
+        if (rc) break;
+        
+        TRACK_BLOB(VBlobNew,blob);
+        
+        if (allInputsAreSingleRow) {
+            VFixedRowResult rslt;
+            uint32_t	row_element_count = PageMapIteratorDataLength(&argv[first_non_control_input].cur_row);
+            
+            rc = PageMapNewSingle(&blob->pm, row_count, row_element_count);
+            if (rc) break;
+            
+            rc = KDataBufferMake(&blob->data, VTypedescSizeof(&self->dad.desc), row_element_count);
+            if (rc) break;
+            
+            for (i = 0; i != argc; ++i) {
+                if (param[i].variant == vrdControl)
+                    continue;
+                if (argv[i].at_end) {
+                    rc = RC(rcVDB, rcFunction, rcExecuting, rcRow, rcNotFound);
+                    break;
+                }
+                
+                param[i].u.data.base = argv[i].blob->data.base;
+                param[i].u.data.elem_count = row_element_count;
+                param[i].u.data.first_elem = PageMapIteratorDataOffset(&argv[i].cur_row);
+                param[i].u.data.elem_bits = argv[i].blob->data.elem_bits;
+                
+                argv[i].at_end = PageMapIteratorNext(&argv[i].cur_row) ? false : true;
+            }
+            if (rc) break;
+            
+            rslt.base = blob->data.base;
+            rslt.first_elem = 0;
+            rslt.elem_count = row_element_count;
+            rslt.elem_bits = blob->data.elem_bits;
+            
+            rc = self->u.pf(self->fself, info, start_id, &rslt, argc, param);
+        } else {
+            uint32_t first_write;
+            int64_t row_id;
+            uint32_t last = 0;
+            uint32_t last_rowlen = 0;
+            
+            rc = PageMapNew(&blob->pm, row_count); /*** max number of rows - it may collapse some **/
+            if (rc) break;
+            rc = KDataBufferMake(&blob->data, VTypedescSizeof(&self->dad.desc), elem_count);
+            if (rc) break;
+            
+            for (first_write = 0, row_id = start_id; row_id <= stop_id; ++row_id) {
+                VFixedRowResult rslt;
+                
+                for (i = 0; i != argc; ++i) {
+                    if (param[i].variant == vrdControl)
+                        continue;
+                    if (argv[i].at_end) {
+                        rc = RC(rcVDB, rcFunction, rcExecuting, rcRow, rcNotFound);
+                        break;
+                    }
+                    
+                    param[i].u.data.base = argv[i].blob->data.base;
+                    param[i].u.data.elem_count = PageMapIteratorDataLength(&argv[i].cur_row);
+                    param[i].u.data.first_elem = PageMapIteratorDataOffset(&argv[i].cur_row);
+                    param[i].u.data.elem_bits = argv[i].blob->data.elem_bits;
+                    
+                    argv[i].at_end = PageMapIteratorNext(&argv[i].cur_row) ? false : true;
+                }
+                if (rc)
+                    break;
+                
+                rslt.base = blob->data.base;
+                rslt.first_elem = first_write;
+                rslt.elem_count = param[first_non_control_input].u.data.elem_count;
+                rslt.elem_bits = blob->data.elem_bits;
+                
+                rc = self->u.pf(self->fself, info, row_id, &rslt, argc, param);
+                if (rc)
+                    break;
+                
+                assert(rslt.elem_count >> 32 == 0);
+                if ( row_id != start_id && last_rowlen == rslt.elem_count &&
+                    memcmp(((char*)blob->data.base) + (last*rslt.elem_bits)/8,
+                           ((char*)blob->data.base) + (first_write*rslt.elem_bits)/8,
+                           (rslt.elem_count*rslt.elem_bits)/8) == 0)
+                {
+                    rc = PageMapAppendRow(blob->pm, (uint32_t)rslt.elem_count, true);
+                }
+                else {
+                    last = first_write;
+                    first_write += rslt.elem_count;
+                    rc = PageMapAppendRow(blob->pm, (uint32_t)rslt.elem_count, false);
+                }
+                if (rc)
+                    break;
+                last_rowlen = (uint32_t)rslt.elem_count;
+            }
+            if (rc)
+                break;
+            KDataBufferSub(&blob->data, &blob->data, 0, first_write);
+        }
+        *rslt = blob;
+        break;
+    }
+    if (rc != 0 && blob != NULL) vblob_release(blob, NULL);
+    if (on_heap) free(on_heap);
+    if (pb_heap) free(pb_heap);
+    return rc;
+}
+
+static
+rc_t VFunctionProdCallBlobFuncEncoding( VFunctionProd *self, VBlob *rslt, int64_t id,
+    const VXformInfo *info, const VBlob *sblob ) {
+    VBlobData src;
+    VBlobResult dst;
+    VBlobHeader *hdr;
+    rc_t rc;
+    uint32_t elem_size = VTypedescSizeof(&self->dad.desc);
+    
+    rc = BlobHeadersCreateChild(sblob->headers, &rslt->headers);
+    if (rc == 0) {
+        hdr = BlobHeadersGetHdrWrite(rslt->headers);
+        if (hdr) {
+            bitsz_t sz = KDataBufferBits(&sblob->data);
+            
+            VBlobHeaderSetSourceSize(hdr, KDataBufferBytes(&sblob->data));
+            sz = (sz + elem_size - 1) / elem_size;
+            rc = KDataBufferMake( &rslt->data, elem_size, sz );
+        }
+        else
+            rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    }
+    if (rc)
+        return rc;
+
+    dst.header = NULL;
+    
+    if ( sblob -> data.elem_count == 0)
+        goto SKIP_COMPRESSION;
+
+    src.data = sblob -> data.base;
+    src.elem_count = sblob -> data.elem_count;
+    src.elem_bits = sblob -> data.elem_bits;
+    src.byte_order = sblob -> byte_order;
+    
+    dst.data = rslt -> data.base;
+    dst.elem_count = rslt -> data.elem_count;
+    dst.elem_bits = rslt -> data.elem_bits;
+    dst.byte_order = sblob -> byte_order;
+    
+    rc = self->u.bf(self->fself, info, &dst, &src, hdr);
+    
+    if (rc == 0) {
+        if ( dst.header != NULL && dst.header != hdr ) {
+            VBlobHeaderReplace ( hdr, dst.header );
+            VBlobHeaderRelease ( dst.header );
+        }
+        rslt->data.elem_bits = dst.elem_bits;
+        rslt->data.elem_count = dst.elem_count;
+        rslt->byte_order = dst.byte_order;
+    }
+    else if (GetRCObject(rc) == (enum RCObject)rcBuffer && GetRCState(rc) == rcInsufficient) {
+    SKIP_COMPRESSION:
+        VBlobHeaderSetFlags(hdr, 1);
+        
+        KDataBufferWhack(&rslt->data);
+        if ( dst.header != NULL && dst.header != hdr )
+            VBlobHeaderRelease ( dst.header );
+        
+        /* compressors usually produce bits (elem_size == 1) or bytes (elem_size == 8)
+         * the cast to bits can never fail, so we will force the cast to bytes to also be
+         * infallible; casts to other sizes are allowed to fail to prevent data loss */
+        if (elem_size == 8) {
+            KDataBufferSub(&sblob->data, &rslt->data, 0, UINT64_MAX);
+            /* We can't shrink the data and KDataBufferCast won't increase the number of bits
+             * but we know that KDataBuffer can't allocate anything other than whole bytes
+             * so we're forcing the conversion to bytes manually. */
+            rslt->data.elem_count = KDataBufferBytes(&rslt->data);
+            rslt->data.elem_bits = 8;
+            rc = 0;
+        }
+        else /* if elem_size == 1 this will always work */
+            rc = KDataBufferCast(&sblob->data, &rslt->data, elem_size, false);
+    }
+    VBlobHeaderRelease(hdr);
+    
+    return rc;
+}
+
+static
+rc_t VFunctionProdCallBlobFuncDecoding( VFunctionProd *self, VBlob *rslt,
+    int64_t id, const VXformInfo *info, const VBlob *sblob ) {
+    VBlobHeader *hdr;
+    rc_t rc;
+    uint32_t elem_size = VTypedescSizeof(&self->dad.desc);
+    
+    if (sblob->headers == NULL) {
+        /* v1 blobs don't have headers, but v1 blobs
+         * are fixed row-length so we know the data size
+         * we are relying on the blob deserialization code
+         * to set the page map up correctly */
+        if (sblob->pm == NULL) {
+            hdr = BlobHeadersCreateDummyHeader(0, 0, 0, (sblob->data.elem_bits * sblob->data.elem_count + 7) >> 3);
+        }
+        else
+            hdr = BlobHeadersCreateDummyHeader(0, 0, 0, BlobRowCount(sblob) * PageMapGetIdxRowInfo(sblob->pm, 0, 0, NULL));
+        /* leave rslt->headers null so that the next
+         * stage will also create a dummy header */
+    }
+    else {
+        /* rslt gets the headers for the next stage in decoding */
+        rslt->headers = (BlobHeaders *)BlobHeadersGetNextFrame(sblob->headers);
+        BlobHeadersAddRef(rslt->headers);
+        
+        /* get the headers for this stage in decoding */
+        hdr = BlobHeadersGetHeader(sblob->headers);
+    }
+    if ( hdr == NULL )
+        rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    else if ((VBlobHeaderFlags(hdr) & 1) != 0)
+    {
+        /* compression was skipped */
+        VBlobHeaderRelease(hdr);
+        return KDataBufferCast(&sblob->data, &rslt->data, elem_size, true);
+    }
+    else
+    {
+        rc = KDataBufferMakeBytes(&rslt->data, VBlobHeaderSourceSize(hdr));
+        if (rc == 0) {
+            VBlobData src;
+            VBlobResult dst;
+            
+            dst.header = NULL;
+            
+            src.data = sblob -> data.base;
+            src.elem_count = sblob -> data.elem_count;
+            src.elem_bits = sblob -> data.elem_bits;
+            src.byte_order = sblob -> byte_order;
+            
+            dst.data = rslt -> data.base;
+            dst.elem_count = (rslt -> data.elem_count << 3) / elem_size;
+            dst.elem_bits = elem_size;
+            dst.byte_order = sblob -> byte_order;
+            
+            rc = self->u.bf(self->fself, info, &dst, &src, hdr);
+            
+            if (rc == 0) {
+                if ( dst.header != NULL && dst.header != hdr ) {
+                    /* only allow replacement of headers when encoding */
+                    VBlobHeaderRelease ( dst.header );
+                }
+                
+                rslt->data.elem_bits = dst.elem_bits;
+                rslt->data.elem_count = dst.elem_count;
+                rslt->byte_order = dst.byte_order;
+                
+                rc = KDataBufferCast(&rslt->data, &rslt->data, elem_size, true);
+            }
+        }
+        VBlobHeaderRelease(hdr);
+    }
+
+    return rc;
+}
+
+static
+rc_t VFunctionProdCallBlobFunc( VFunctionProd *self, VBlob **prslt,
+    int64_t id, const VXformInfo *info, Vector *args ) {
+    VBlob *rslt = 0;
+    VBlob *sblob;
+    rc_t rc;
+    
+    sblob = VectorGet(args, 0);
+    assert(sblob);
+    if(self->dad.chain == chainEncoding){
+	VBlobAddRef(sblob);
+	if(sblob->headers==NULL)/**first in encryption chain***/
+		VBlobPageMapOptimize(&sblob); /** try to optimize the blob **/
+    }
+
+#if PROD_NAME
+    rc = VBlobNew(&rslt, sblob->start_id, sblob->stop_id, self->dad.name);
+#else
+    rc = VBlobNew(&rslt, sblob->start_id, sblob->stop_id, "VFunctionProdCallBlobFunc");
+#endif
+    if (rc)
+        return rc;
+    
+    TRACK_BLOB(VBlobNew,rslt);
+    
+    /* blob funcs are not allowed to change page maps */
+    rslt->pm = sblob->pm;
+    PageMapAddRef(rslt->pm);
+    
+    rslt->byte_order = sblob->byte_order;
+    
+    if (self->dad.chain == chainEncoding){
+        rc = VFunctionProdCallBlobFuncEncoding(self, rslt, id, info, sblob);
+	vblob_release( sblob, NULL );
+    } else {
+        rc = VFunctionProdCallBlobFuncDecoding(self, rslt, id, info, sblob);
+    }
+    
+    if (rc == 0) {
+        *prslt = rslt;
+        return 0;
+    }
+    vblob_release( rslt, NULL );
+    return rc;
+}
+
+static
+rc_t VFunctionProdCallBlobNFunc( VFunctionProd *self, VBlob **rslt,
+    int64_t id, const VXformInfo *info, Vector *args ) {
+    const VBlob *on_stack[16];
+    const VBlob **on_heap;
+    const VBlob **argv;
+    int argc = VectorLength(args);
+    rc_t rc;
+    
+    VECTOR_TO_ARRAY(argc, argv, on_stack, on_heap, args);
+    {
+	int i;
+	for(i=0;i<argc;i++){
+		VBlob const *vb=argv[i];
+		if(vb->pm == NULL){
+			rc=PageMapProcessGetPagemap(&self->curs->pmpr,(PageMap**)(&vb->pm));
+			if(rc != 0) return rc;
+		}
+	}
+    }
+    rc = self->u.bfN(self->fself, info, id, rslt, argc, argv);
+    if ( on_heap )
+        free( (void*) on_heap );
+    return rc;
+}
+
+static
+rc_t VFunctionProdCallLegacyBlobFunc( VFunctionProd *self, VBlob **prslt,
+    int64_t id, const VXformInfo *info, Vector *args ) {
+    VBlob *rslt = 0;
+    VBlob *sblob;
+    VNoHdrBlobFunc func = (VNoHdrBlobFunc)self->u.bf;
+    rc_t rc;
+    uint32_t elem_size = VTypedescSizeof(&self->dad.desc);
+    
+    sblob = VectorGet(args, 0);
+    assert(sblob);
+    
+#if PROD_NAME
+    rc = VBlobNew(&rslt, sblob->start_id, sblob->stop_id, self->dad.name);
+#else
+    rc = VBlobNew(&rslt, sblob->start_id, sblob->stop_id, "VFunctionProdCallLegacyBlobFunc");
+#endif
+    TRACK_BLOB(VBlobNew,rslt);
+    if (rc == 0) {
+        rc = KDataBufferMakeBytes(&rslt->data, 0);
+        if (rc == 0) {
+            VLegacyBlobResult dst;
+            dst.dst = & rslt -> data;
+            dst.byte_order = vboLittleEndian;
+            rc = func(self->fself,
+                      info,
+                      &dst,
+                      &sblob->data
+                      );
+            
+            if (rc == 0)
+            {
+                rslt->byte_order = dst.byte_order;
+
+                rc = KDataBufferCast(&rslt->data, &rslt->data, elem_size, true);
+                if (rc == 0) {
+                    rslt->pm = sblob->pm;
+                    PageMapAddRef(rslt->pm);
+
+                    *prslt = rslt;
+                    return 0;
+                }
+            }
+        }
+
+        vblob_release( rslt, NULL );
+    }
+    return rc;
+}
+
+static
+rc_t VFunctionProdCallByteswap ( VFunctionProd *self, VBlob **vblob,
+    int64_t id, const VXformInfo *info, Vector *args )
+{
+    /* get single input blob */
+    VBlob *blob = VectorFirst ( args );
+    rc_t rc;
+
+    assert ( blob != NULL );
+    
+#if PROD_CACHE
+    VProductionFlushCacheDeep ( & self -> dad, "byteswap" );
+#endif
+    
+    /* CAST */
+    rc = KDataBufferCast ( & blob->data, & blob->data, 
+                           self->dad.desc.intrinsic_bits * self->dad.desc.intrinsic_dim,
+                           false );
+    if ( rc == 0 )
+    {
+        /* legacy blob check
+         * repair missing pagemap
+         */
+        if (blob->pm == NULL) {
+            uint64_t row_count = BlobRowCount ( blob );
+            if ( row_count == 0 || blob->data.elem_count % row_count != 0)
+                rc = RC(rcVDB, rcBlob, rcReading, rcBlob, rcCorrupt);
+            else {
+                uint64_t row_len = blob->data.elem_count / row_count;
+                rc = PageMapNewFixedRowLength(&blob->pm, row_count, row_len);
+            }
+        }
+    }
+
+    if ( rc != 0)
+        return rc;
+
+    /* check for byteswapping function */
+    if ( self -> u.bswap != NULL )
+    {
+
+        if ( blob -> byte_order ==
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+             vboBigEndian
+#else
+             vboLittleEndian
+#endif
+            )
+        {
+            uint32_t int_size;
+            uint64_t blob_bits;
+
+            /* make writable */
+            KDataBuffer buffer;
+
+            rc = KDataBufferMakeWritable ( & blob -> data, & buffer );
+            if ( rc != 0 )
+                return rc;
+
+            /* invoke byte-swap function on input */
+            blob_bits = KDataBufferBits ( & buffer );
+            int_size = self -> dad.desc .intrinsic_bits;
+            ( * self -> u.bswap ) ( buffer.base, buffer.base,
+                ( uint32_t ) ( blob_bits / int_size ) );
+
+            /* poke bytes back into blob */
+            KDataBufferWhack ( & blob -> data );
+            blob -> data = buffer;
+        }
+    }
+
+    blob -> byte_order = vboNative;
+    *vblob = blob;
+
+    (void)VBlobAddRef ( blob );
+    TRACK_BLOB( VBlobAddRef, blob );
+
+    return 0;
+}
+
+#if _DEBUGGING
+
+static
+rc_t VFunctionProdCallCompare1(VFunctionProd *self, VBlob **vblob, int64_t id, uint32_t cnt) {
+    VBlob *orig;
+    rc_t rc;
+    
+    *vblob = NULL;
+    assert(VectorLength(&self->parms) == 2);
+    rc = VProductionReadBlob((const VProduction *)VectorGet(&self->parms, 0), &orig, id, cnt, NULL);
+    if (rc == 0) {
+        int64_t i;
+        PageMapIterator oi;
+        VRowData orig_data;
+        const VProduction *test_prod = VectorGet(&self->parms, 1);
+
+        memset(&orig_data, 0, sizeof(orig_data));
+        orig_data.u.data.base = orig->data.base;
+        orig_data.u.data.elem_bits = orig->data.elem_bits;
+        
+        PageMapNewIterator(orig->pm, &oi, 0, -1);
+        
+        for (i = orig->start_id; i <= orig->stop_id; ++i) {
+            VBlob *test;
+            uint32_t j;
+
+            j = PageMapIteratorDataLength(&oi);
+
+            rc = VProductionReadBlob(test_prod, &test, i, 1, NULL);
+            if (rc == 0) {
+                if (orig->data.elem_bits != test->data.elem_bits || orig->byte_order != test->byte_order)
+                    rc = RC(rcVDB, rcBlob, rcValidating, rcBlob, rcCorrupt);
+                else {
+                    PageMapIterator ti;
+                    VRowData test_data;
+
+                    memset(&test_data, 0, sizeof(test_data));
+                    test_data.u.data.base = test->data.base;
+                    test_data.u.data.elem_bits = test->data.elem_bits;
+                    
+                    PageMapNewIterator(test->pm, &ti, 0, -1);
+                    
+                    if (!PageMapIteratorAdvance(&ti, (uint32_t)(i - test->start_id))) {
+                        rc = RC(rcVDB, rcBlob, rcValidating, rcBlob, rcCorrupt);
+                    }
+                    else {
+                        uint32_t k = PageMapIteratorDataLength(&ti);
+                        orig_data.u.data.elem_count = test_data.u.data.elem_count = j;
+                        
+                        orig_data.u.data.first_elem = (orig->data.bit_offset / orig->data.elem_bits) + PageMapIteratorDataOffset(&oi);
+                        test_data.u.data.first_elem = (test->data.bit_offset / test->data.elem_bits) + PageMapIteratorDataOffset(&ti);
+
+                        if (j != k) {
+                            rc = RC(rcVDB, rcBlob, rcValidating, rcBlob, rcCorrupt);
+                        } else {
+                            rc = self->u.cf(self->fself, &orig_data, &test_data);
+                            if (rc) {
+                                rc = RC(rcVDB, rcBlob, rcValidating, rcBlob, rcCorrupt);
+                            }
+                        }
+                        if (rc) {
+                            const uint8_t *a = orig_data.u.data.base;
+                            const uint8_t *b = test_data.u.data.base;
+                            unsigned count;
+                            unsigned k;
+                            unsigned m;
+                            char f, ax[9 + 16 * 4 + 1], bx[9 + 16 * 4 + 1];
+                            char av[16], bv[16];
+
+                            a += (orig_data.u.data.first_elem * orig_data.u.data.elem_bits) >> 3;
+                            b += (test_data.u.data.first_elem * test_data.u.data.elem_bits) >> 3;
+                            /* show up to a row of data before */
+                            count = a - (const uint8_t*)orig_data.u.data.base;
+                            count = count < b - (const uint8_t*)orig_data.u.data.base ? count : b - (const uint8_t*)orig_data.u.data.base;
+                            count = count > 16 ? 16 : count;
+                            a -= count;
+                            b -= count;
+                            
+                            count += (j * orig->data.elem_bits + 7) >> 3;
+
+                            for (k = 0, m = 0; k != count; ++k) {
+                                if (m == 0) {
+                                    sprintf(ax, "%08X>", k);
+                                    sprintf(bx, "%08X<", k);
+                                }
+                                f = a[k] == b[k] ? ' ': '*';
+                                sprintf(ax + m * 4 + 9, " %02x%c", a[k], f);
+                                av[m] = isprint(a[k]) ? a[k] : '.';
+                                sprintf(bx + m * 4 + 9, " %02x%c", b[k], f);
+                                bv[m] = isprint(b[k]) ? b[k] : '.';
+                                m++;
+                                if(m == 16 || k == count - 1) {
+                                    DBGMSG(DBG_VDB, DBG_VDB_COMPARE, ("%-73s '%.*s'\n%-73s '%.*s'\n\n", ax, m, av, bx, m, bv));
+                                    m = 0;
+                                }
+                            }
+                        }
+                    }
+                }
+                vblob_release(test, NULL);
+                if (rc)
+                    break; }
+            else
+                break;
+            PageMapIteratorAdvance(&oi, 1);
+        }
+        vblob_release(orig, NULL);
+    }
+    return rc;
+}
+#endif
+
+static
+rc_t VFunctionProdCallCompare( VFunctionProd *self, VBlob **vblob, int64_t id, uint32_t cnt ) {
+    VBlob *orig;
+    rc_t rc;
+    VProduction const *orig_prod;
+    
+    *vblob = NULL;
+    assert(VectorLength(&self->parms) == 2);
+    orig_prod = (const VProduction *)VectorGet(&self->parms, 0);
+    rc = VProductionReadBlob(orig_prod, &orig, id, cnt, NULL);
+    if (rc == 0) {
+        VBlob *test;
+        const VProduction *test_prod = VectorGet(&self->parms, 1);
+        
+        rc = VProductionReadBlob(test_prod, &test, id, cnt, NULL);
+        if (rc == 0) {
+            if (orig->data.elem_bits != test->data.elem_bits || orig->byte_order != test->byte_order){
+                rc = RC(rcVDB, rcBlob, rcValidating, rcBlob, rcCorrupt);
+            } else if(   orig->pm->data_recs != 1				/*** catching static **/
+                      || test->pm->data_recs != 1				/*** trying quick comparison **/
+		      || orig->data.elem_count != test->data.elem_count
+                      || memcmp( orig->data.base, test->data.base, (orig->data.elem_bits*orig->data.elem_count+7)/8)){
+                uint64_t i;
+                PageMapIterator oi;
+                PageMapIterator ti;
+                VRowData orig_data;
+                VRowData test_data;
+                
+                memset(&orig_data, 0, sizeof(orig_data));
+                orig_data.u.data.base = orig->data.base;
+                orig_data.u.data.elem_bits = orig->data.elem_bits;
+                
+                memset(&test_data, 0, sizeof(test_data));
+                test_data.u.data.base = test->data.base;
+                test_data.u.data.elem_bits = test->data.elem_bits;
+                
+                PageMapNewIterator(orig->pm, &oi, 0, -1);
+                PageMapNewIterator(test->pm, &ti, 0, -1);
+                if (test->start_id < orig->start_id) {
+                    if ( !PageMapIteratorAdvance( &ti, (uint32_t)( orig->start_id - test->start_id ) ) ) {
+                        rc = RC(rcVDB, rcBlob, rcValidating, rcBlob, rcCorrupt);
+                        DBGMSG(DBG_VDB, DBG_VDB_COMPARE, ("%s: page map mismatch at row %li\n", self->dad.name, id));
+                    }
+                }
+                
+                for (i = orig->start_id; rc == 0; ) {
+                    uint32_t elem_count;
+                    uint64_t prev_i = i;
+                    
+                    orig_data.u.data.first_elem = (orig->data.bit_offset / orig->data.elem_bits) + PageMapIteratorDataOffset(&oi);
+                    test_data.u.data.first_elem = (test->data.bit_offset / test->data.elem_bits) + PageMapIteratorDataOffset(&ti);
+
+                    for (elem_count = 0; ; ) {
+                        bool done = false;
+                        uint32_t j;
+                        uint32_t k;
+                        
+                        j = PageMapIteratorDataLength(&oi);
+                        k = PageMapIteratorDataLength(&ti);
+                        if (j != k) {
+                            rc = RC(rcVDB, rcBlob, rcValidating, rcBlob, rcCorrupt);
+                            DBGMSG(DBG_VDB, DBG_VDB_COMPARE, ("%s: length mismatch at row %li ( original=%u, test=%u )\n", self->dad.name, i, j, k));
+                            break;
+                        }
+                        elem_count += j;
+                        
+                        j = PageMapIteratorRepeatCount(&oi);
+                        k = PageMapIteratorRepeatCount(&ti);
+                        if (j != k) {
+                            done = true;
+                            if (j > k)
+                                j = k;
+                        }
+                        if (PageMapIteratorAdvance(&ti, j) != PageMapIteratorAdvance(&oi, j)) {
+                            rc = RC(rcVDB, rcBlob, rcValidating, rcBlob, rcCorrupt);
+                            DBGMSG(DBG_VDB, DBG_VDB_COMPARE, ("%s: page map corrupt at row %li\n", self->dad.name, i));
+                            break;
+                        }
+                        i += j;
+			if ( done || (int64_t)i > orig->stop_id || test->pm->random_access || orig->pm->random_access || !PageMapIteratorAdvance( &ti, 0 ) )
+                            break;
+                    }
+                    if (rc)
+                        break;
+                    if ( (int64_t)i > ( orig->stop_id + 1 ) ) {
+                        rc = RC(rcVDB, rcBlob, rcValidating, rcBlob, rcCorrupt);
+                        (void)prev_i; /* shut up warning when not printing debug msg */
+                        DBGMSG(DBG_VDB, DBG_VDB_COMPARE, ("%s: page map has too many rows at row %li\n", self->dad.name, prev_i));
+                        break;
+                    }
+                    
+                    orig_data.u.data.elem_count = test_data.u.data.elem_count = elem_count;
+                    
+                    rc = self->u.cf(self->fself, &orig_data, &test_data);
+                    if (rc) {
+                        rc = RC(rcVDB, rcBlob, rcValidating, rcBlob, rcCorrupt);
+                        DBGMSG(DBG_VDB, DBG_VDB_COMPARE, ("%s: data mismatch at row %li\n", self->dad.name, prev_i));
+                        break;
+                    }
+                    if ((int64_t)i > orig->stop_id )
+                        break;
+                    
+                    /* check to see if the test iterator is at end
+                     * and if so, fetch next blob */
+                    if (!PageMapIteratorAdvance(&ti, 0)) {
+                        VBlob *temp;
+                        
+                        rc = VProductionReadBlob(test_prod, &temp, i, orig->stop_id - i, NULL);
+                        if (rc == 0) {
+                            vblob_release(test, NULL);
+                            test = temp;
+                            test_data.u.data.base = test->data.base;
+                            PageMapNewIterator(test->pm, &ti, 0, -1);
+                            if ( test->start_id < (int64_t)i ) {
+                                if ( !PageMapIteratorAdvance( &ti, (uint32_t)( i - test->start_id ) ) ) {
+                                    rc = RC(rcVDB, rcBlob, rcValidating, rcBlob, rcCorrupt);
+                                    DBGMSG(DBG_VDB, DBG_VDB_COMPARE, ("%s: page map mismatch at row %li\n", self->dad.name, i));
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            vblob_release(test, NULL);
+        }
+        vblob_release(orig, NULL);
+    }
+    return rc;
+}
+
+typedef struct fetch_param_blob_data fetch_param_blob_data;
+struct fetch_param_blob_data
+{
+    int64_t id;
+    uint32_t cnt;
+    int64_t range_start_id;
+    int64_t range_stop_id;
+    Vector *inputs;
+    VBlob *vblob;
+    rc_t rc;
+    bool no_cache;
+};
+
+static void fetch_param_blob_data_init(fetch_param_blob_data *pb,int64_t id,uint32_t cnt,Vector *inputs)
+{
+    pb->id = id;
+    pb->cnt = cnt;
+    pb->inputs = inputs;
+    pb->rc = 0;
+    pb->vblob = NULL;
+    pb->range_start_id=INT64_MIN;
+    pb->range_stop_id =INT64_MAX;
+    pb->no_cache = false;
+}
+static
+bool CC fetch_param_blob ( void *item, void *data )
+{
+    fetch_param_blob_data *pb = data;
+    VBlob *blob;
+    
+    pb -> rc = VProductionReadBlob ( item, & blob, pb -> id , pb -> cnt, NULL);
+    if ( pb -> rc == 0 )
+    {
+        pb -> rc = VectorAppend ( pb -> inputs, NULL, blob );
+        if ( pb -> rc == 0 ) {
+            pb->no_cache |= blob->no_cache;
+	    if(blob->start_id > pb->range_start_id) pb->range_start_id=blob->start_id;
+	    if(blob->stop_id  < pb->range_stop_id)  pb->range_stop_id =blob->stop_id;
+            return false;
+        }
+        vblob_release ( blob, NULL );
+    }
+
+    return true;
+}
+
+static
+bool CC fetch_first_param_blob ( void *item, void *data )
+{
+    fetch_param_blob_data *pb = data;
+    
+    pb -> rc = VProductionReadBlob ( item, &pb->vblob, pb -> id , pb -> cnt, NULL);
+    if (GetRCState(pb->rc) == rcNotFound)
+        return false;
+    if ( pb -> vblob -> data.elem_count == 0 )
+        return false;
+    pb->range_start_id=pb->vblob->start_id;
+    pb->range_stop_id =pb->vblob->stop_id;
+    return true;
+}
+
+static
+rc_t VFunctionProdSelect ( VFunctionProd *self, VBlob **vblob, int64_t id, uint32_t cnt ) {
+    fetch_param_blob_data pb;
+    fetch_param_blob_data_init(&pb,id,cnt,NULL);
+    VectorDoUntil ( & self -> parms, false, fetch_first_param_blob, & pb );
+    * vblob = pb.vblob;
+    return pb.rc;
+}
+
+static rc_t VFunctionProdReadNormal ( VFunctionProd *self, VBlob **vblob, int64_t id ,uint32_t cnt)
+{
+    rc_t rc;
+    Vector inputs;
+    fetch_param_blob_data pb;
+    VBlob *vb=NULL;
+    int64_t	id_run;
+    int64_t     cnt_run;
+
+    /* fill out information for function to use */
+    const VCursor *curs = self -> curs;
+    VXformInfo info;
+
+    if(cnt == 0) cnt = 1;
+
+#if VMGR_PASSED_TO_XFORM
+    info . mgr = curs -> tbl -> mgr;
+#endif
+#if VSCHEMA_PASSED_TO_XFORM
+    info . schema = curs -> schema;
+#endif
+#if VTABLE_PASSED_TO_XFORM
+    info . tbl = curs -> tbl;
+#endif
+#if VPRODUCTION_PASSED_TO_XFORM
+    info . prod = & self -> dad;
+#endif
+    info . fdesc . fd = self -> dad . fd;
+    info . fdesc . desc = self -> dad . desc;
+    *vblob = NULL;
+
+    if (self->dad.sub == prodFuncBuiltInCompare) {
+        rc = VFunctionProdCallCompare(self, vblob, id, cnt);
+#if _DEBUGGING
+        if (rc != 0)
+            rc = VFunctionProdCallCompare1(self, vblob, id, cnt);
+#endif
+        return rc;
+    }
+
+    /* all other functions take some form of blob input */
+    VectorInit ( & inputs, 0, VectorLength ( & self -> parms ) );
+    fetch_param_blob_data_init(&pb,id,cnt,&inputs);
+    if ( VectorDoUntil ( & self -> parms, false, fetch_param_blob, & pb ) )
+        rc = pb . rc;
+    else for( id_run=id, cnt_run=cnt, rc=0; cnt_run > 0 && rc==0;) 
+    {
+        switch ( self -> dad . sub )
+        {
+        case vftLegacyBlob:
+            rc = VFunctionProdCallLegacyBlobFunc ( self, &vb, id_run, & info, & inputs );
+            break;
+        case vftNonDetRow:
+            rc = VFunctionProdCallNDRowFunc ( self, &vb, id_run, & info, & inputs );
+            break;
+        case vftRow:
+	    case vftRowFast:
+        case vftIdDepRow:
+            rc = VFunctionProdCallRowFunc ( self, &vb, id_run, cnt_run, & info, & inputs, pb.range_start_id,pb.range_stop_id );
+            break;
+        case vftArray:
+            rc = VFunctionProdCallArrayFunc ( self, &vb, id_run, & info, & inputs );
+            break;
+        case vftFixedRow:
+            rc = VFunctionProdCallPageFunc ( self, &vb, id_run, & info, & inputs );
+            break;
+        case vftBlob:
+            rc = VFunctionProdCallBlobFunc ( self, &vb, id_run, & info, & inputs );
+            break;
+        case vftBlobN:
+            rc = VFunctionProdCallBlobNFunc ( self, &vb, id_run, & info, & inputs );
+            break;
+        case prodFuncByteswap:
+            rc = VFunctionProdCallByteswap ( self, &vb, id_run, & info, & inputs );
+            break;
+        default:
+            rc = RC ( rcVDB, rcFunction, rcReading, rcProduction, rcCorrupt );
+        }
+        if (rc == 0) {
+            if (vb == NULL) {
+                rc = RC ( rcVDB, rcFunction, rcReading, rcProduction, rcNull );
+            }
+            else {
+                if (vb -> start_id > id_run || vb -> stop_id < id_run) { /*** shoudn't happen ***/
+                    rc = RC ( rcVDB, rcBlob, rcReading, rcRange, rcInsufficient );
+                }
+                if (*vblob == NULL) {
+                    *vblob=vb;
+                }
+                else {
+                    if (vb -> start_id <= id) {/** new blob is not appendable, but can replace the current one **/
+                        vblob_release(*vblob, NULL);
+                        *vblob = vb;
+                    }
+                    else {
+                        /*** append here **/
+                        rc = VBlobAppend(*vblob, vb);
+                        vblob_release(vb, NULL);
+                    }
+                }
+                /* propagate dirty flag */
+                (*vblob)->no_cache |= pb.no_cache;
+                if( (*vblob) -> stop_id >= id + cnt - 1)
+                    break;
+
+                id_run  = (*vblob) -> stop_id + 1;
+                cnt_run = id + cnt - id_run;
+
+            }
+        }
+        else if (id < id_run) {
+            /* if there is reblobbing and our result blob already contains some
+             * data, then return that data and not error out */
+            rc = 0;
+            break;
+        }
+    }
+    /* drop input blobs */
+    VectorWhack ( & inputs, vblob_release, NULL );
+    return rc;
+}
+
+rc_t VFunctionProdRead ( VFunctionProd *self, VBlob **vblob, int64_t id , uint32_t cnt)
+{
+    if ( self -> dad . sub == vftSelect )
+        return VFunctionProdSelect ( self, vblob, id , cnt);
+    return VFunctionProdReadNormal(self, vblob, id, cnt);
+}    
+
+typedef struct fetch_param_IdRange_data fetch_param_IdRange_data;
+struct fetch_param_IdRange_data
+{
+    int64_t first;
+    int64_t last;
+    rc_t rc;
+    bool first_time;
+};
+
+static
+bool CC fetch_param_IdRange ( void *item, void *data )
+{
+    fetch_param_IdRange_data *pb = data;
+    int64_t first;
+    int64_t last;
+    rc_t rc;
+    
+    rc = VProductionColumnIdRange(item, &first, &last);
+    if (GetRCState(rc) == rcEmpty && GetRCObject(rc) == rcRange)
+        return false;
+
+    pb->rc = rc;
+    if (rc == 0 )
+    {
+        if (pb->first_time || first < pb->first)
+            pb->first = first;
+        if (pb->first_time || last > pb->last)
+            pb->last = last;
+        pb->first_time = false;
+        return false;
+    }
+    
+    return true;
+}
+
+LIB_EXPORT rc_t CC VFunctionProdColumnIdRange ( const VFunctionProd *self, int64_t *first, int64_t *last )
+{
+    fetch_param_IdRange_data pb;
+
+    pb.first_time = true;
+    pb . rc = 0;
+    pb.first = 1;
+    pb.last = 0;
+    
+    VectorDoUntil ( & self -> parms, false, fetch_param_IdRange, & pb );
+
+    if (pb.rc == 0) {
+#if 0 
+/* this causes problems in the loaders */   
+        if(pb.first_time){ /** no parameters - some function which generated data; f.e.  meta_value() ***/
+              pb.last = INT64_MAX;
+        } 
+#endif        
+        *first = pb.first;
+        *last = pb.last;
+    }
+    return pb . rc;
+}
+
+typedef struct fetch_param_FixedRowLength_data fetch_param_FixedRowLength_data;
+struct fetch_param_FixedRowLength_data
+{
+    uint32_t length;
+    int64_t row_id;
+    bool first_time;
+};
+
+static
+bool CC fetch_param_FixedRowLength ( void *item, void *data )
+{
+    fetch_param_FixedRowLength_data *pb = data;
+    uint32_t length;
+    
+    if (((const VProduction *)item)->control == false) {
+        length = VProductionFixedRowLength(item, pb->row_id, false);
+
+        if (pb->first_time)
+            pb->length = length;
+
+        pb->first_time = false;
+        
+        if (length == 0 || length != pb->length)
+            return true;
+    }
+    return false;
+}
+
+static
+uint32_t VFunctionProdFixedRowLength ( const VFunctionProd *self, int64_t row_id, bool ignore_self )
+{
+    fetch_param_FixedRowLength_data pb;
+
+    if ( ! ignore_self )
+    {
+        switch ( self -> dad . sub )
+        {
+        case vftRow:
+		case vftRowFast:
+        case vftNonDetRow:
+        case vftIdDepRow:
+            return 0;
+        }
+    }
+
+    pb.first_time = true;
+    pb.length = 0;
+
+    VectorDoUntil ( & self -> parms, false, fetch_param_FixedRowLength, & pb );
+
+    return pb.length;
+}
+
+
+/*--------------------------------------------------------------------------
+ * VScriptProd
+ */
+
+rc_t VScriptProdMake ( VScriptProd **prodp, Vector *owned, struct VCursor const *curs,
+    int sub, const char *name, const VFormatdecl *fd,
+    const VTypedesc *desc, uint8_t chain )
+{
+    VScriptProd *prod;
+    rc_t rc = VProductionMake ( ( VProduction** ) prodp, owned, sizeof * prod,
+        prodScript, sub, name, fd, desc, NULL, chain );
+    if ( rc == 0 )
+    {
+        prod = * prodp;
+        prod -> curs = curs;
+        VectorInit ( & prod -> owned, 0, 4 );
+    }
+    return rc;
+}
+
+void VScriptProdDestroy ( VScriptProd *self )
+{
+    VectorWhack ( & self -> owned, VProductionWhack, NULL );
+}
+
+
+/* Read
+ */
+rc_t VScriptProdRead ( VScriptProd *self, VBlob **vblob, int64_t id,uint32_t cnt )
+{
+    return VProductionReadBlob ( self -> rtn, vblob, id , cnt, NULL);
+}
+
+static rc_t VScriptProdColumnIdRange ( const VScriptProd *self, int64_t *first, int64_t *last )
+{
+    return VProductionColumnIdRange(self->rtn, first, last);
+}
+
+static uint32_t VScriptProdFixedRowLength ( const VScriptProd *self, int64_t row_id )
+{
+    return VProductionFixedRowLength(self->rtn, row_id, false);
+}
+
+
+/*--------------------------------------------------------------------------
+ * VProduction
+ */
+
+/* Init
+ *  parent initialization function
+ *  called from the "Make" functions below
+ */
+#if 0
+static
+void VProductionInit ( VProduction *self, int var, int sub, const char *name,
+                       const VFormatdecl *fd, const VTypedesc *desc,
+                       const VCtxId *cid, uint8_t chain )
+{
+    memset ( self, 0, sizeof * self );
+
+    if ( fd != NULL )
+        self -> fd = * fd;
+    if ( desc != NULL )
+        self -> desc = * desc;
+    if ( cid != NULL )
+        self -> cid = * cid;
+
+    self -> var = ( uint8_t ) var;
+    self -> sub = ( uint8_t ) sub;
+    self -> chain = chain;
+}
+#endif
+
+
+void CC VProductionWhack ( void *item, void *owned )
+{
+    VProduction * self = item;
+
+    if ( self != NULL )
+    {
+        if ( owned != NULL)
+        {
+            void *ignore;
+            VectorSwap ( owned, self -> oid, NULL, & ignore );
+            assert ( ( void* ) self == ignore );
+        }
+
+
+#if PROD_CACHE
+        VProductionFlushCacheDeep ( self, "whack" );
+#endif
+        switch ( self -> var )
+        {
+        case prodSimple:
+#if TRACKING_BLOBS
+            fprintf( stderr, "VSimpleProd %p being whacked *** %s\n", self, self->name );
+#endif
+            VSimpleProdDestroy ( ( VSimpleProd* ) self );
+            break;
+
+        case prodFunc:
+#if TRACKING_BLOBS
+            fprintf( stderr, "VFunctionProd %p being whacked *** %s\n", self, self->name );
+#endif
+            VFunctionProdDestroy ( ( VFunctionProd* ) self );
+            break;
+
+        case prodScript:
+#if TRACKING_BLOBS
+            fprintf( stderr, "VScriptProd %p being whacked *** %s\n", self, self->name );
+#endif
+            VScriptProdDestroy ( ( VScriptProd* ) self );
+            break;
+
+        case prodPhysical:
+#if TRACKING_BLOBS
+            fprintf( stderr, "VPhysicalProd %p being whacked *** %s\n", self, self->name );
+#endif
+            VPhysicalProdDestroy ( ( VPhysicalProd* ) self );
+            break;
+
+        case prodColumn:
+#if TRACKING_BLOBS
+            fprintf( stderr, "VColumnProd %p being whacked *** %s\n", self, self->name );
+#endif
+            VColumnProdDestroy ( ( VColumnProd* ) self );
+            break;
+        }
+
+        free ( self );
+    }
+}
+
+/* Cmp
+ * Sort
+ *  compare item is a VCtxId
+ *  sort item is a VProduction
+ *  n is always a VProduction
+ */
+LIB_EXPORT int64_t CC VProductionCmp ( const void *item, const void *n )
+{
+    const VCtxId *a = item;
+    const VProduction *b = n;
+    return VCtxIdCmp ( a, & b -> cid );
+}
+
+LIB_EXPORT int64_t CC VProductionSort ( const void *item, const void *n )
+{
+    const VProduction *a = item;
+    const VProduction *b = n;
+    return VCtxIdCmp ( & a -> cid, & b -> cid );
+}
+
+
+/* IdRange
+ *  obtains intersection of all physical sources
+ *
+ *  "first" [ IN/OUT ] and "last" [ IN/OUT ] - range to intersect
+ */
+rc_t VProductionColumnIdRange ( const VProduction *self,
+    int64_t *first, int64_t *last )
+{
+    if ( self <= FAILED_PRODUCTION )
+        return 0;
+
+    switch ( self -> var )
+    {
+    case prodSimple:
+        return VProductionColumnIdRange ( ( ( const VSimpleProd* ) self ) -> in, first, last );
+    case prodFunc:
+        return VFunctionProdColumnIdRange((const VFunctionProd *)self, first, last);
+    case prodScript:
+        return VScriptProdColumnIdRange((const VScriptProd *)self, first, last);
+    case prodPhysical:
+        return VPhysicalProdColumnIdRange((const VPhysicalProd *)self, first, last);
+    case prodColumn:
+        return RC ( rcVDB, rcColumn, rcAccessing, rcRange, rcEmpty );
+    }
+    
+    return RC ( rcVDB, rcColumn, rcAccessing, rcType, rcUnknown );
+}
+
+rc_t VProductionPageIdRange ( VProduction *self,
+    int64_t id, int64_t *first, int64_t *last )
+{
+    VBlob *blob;
+    rc_t rc = VProductionReadBlob ( self, & blob, id , 1, NULL);
+    if ( rc == 0 )
+    {
+        * first = blob -> start_id;
+        * last = blob -> stop_id;
+
+        vblob_release ( blob, NULL );
+    }
+    return rc;
+}
+
+/* RowLength
+ *  get row length for a particular row
+ */
+uint32_t VProductionRowLength ( const VProduction *self, int64_t row_id )
+{
+    uint32_t row_len;
+
+    VBlob *blob;
+    rc_t rc = VProductionReadBlob ( self, & blob, row_id, 1, NULL );
+    if ( rc != 0 )
+        return 0;
+    
+    row_len = PageMapGetIdxRowInfo ( blob -> pm, (uint32_t)( row_id - blob -> start_id) , NULL, NULL );
+
+    vblob_release ( blob, NULL );
+    
+    return row_len;
+}
+
+/* FixedRowLength
+ *  get fixed row length for entire column
+ *  returns 0 if not fixed
+ */
+uint32_t VProductionFixedRowLength ( const VProduction *self, int64_t row_id,bool ignore_self )
+{
+    switch ( self -> var )
+    {
+    case prodSimple:
+        return VProductionFixedRowLength ( ( ( const VSimpleProd* ) self ) -> in, row_id, ignore_self );
+    case prodFunc:
+        return VFunctionProdFixedRowLength((const VFunctionProd *)self, row_id, ignore_self);
+    case prodScript:
+        return VScriptProdFixedRowLength((const VScriptProd *)self, row_id);
+    case prodPhysical:
+        return VPhysicalProdFixedRowLength((const VPhysicalProd *)self, row_id);
+    }
+
+    return RC ( rcVDB, rcColumn, rcAccessing, rcType, rcUnknown );
+}
+
+
+/* ReadBlob
+ */
+rc_t VProductionReadBlob ( const VProduction *cself, VBlob **vblob, int64_t id, uint32_t cnt, VBlobMRUCacheCursorContext *cctx )
+{
+    rc_t rc;
+    VProduction *self = ( VProduction* ) cself;
+
+#if PROD_CACHE
+    int i;
+    VBlob *blob;
+#endif
+
+    * vblob = NULL;
+
+    /* should not be possible, but safety is cheap */
+    if ( self == NULL )
+        return RC ( rcVDB, rcProduction, rcReading, rcSelf, rcNull );
+
+    /*** Cursor-level column blobs may be 1-to-1 with production blobs ***/
+    if(cctx != NULL && self->cctx.cache == NULL ){ /*** we are connected to read cursor **/
+	self->cctx = *cctx; /*** remember it ***/
+	/** No need to do anything else here - we are on "direct line" to the column ***/
+    } else if(self->cctx.cache != NULL){
+	/** somewhere else this production is connected to a cursor **/
+	/** lets try to get answers from the cursor **/
+	blob=(VBlob*) VBlobMRUCacheFind(self->cctx.cache,self->cctx.col_idx,id);
+	if(blob){
+		rc = VBlobAddRef ( blob );
+                if ( rc != 0 ) return rc;
+		*vblob=blob;
+		return 0;
+	}
+    }
+
+#if PROD_CACHE
+    /* check cache */
+    for ( i = 0; i < self -> cache_cnt; ++ i )
+    {
+        blob = self -> cache [ i ];
+        if ( self -> cache [ i ] != NULL )
+        {
+            /* check id range */
+            if (
+#if USE_EUGENE
+                /* NB - this is an approach where we always cache
+                   a blob after a read in order to keep it alive,
+                   but never allow a cache hit on retrieval */
+                ! blob -> no_cache &&
+#endif
+                id >= blob -> start_id &&
+                id <= blob -> stop_id )
+            {
+                rc = VBlobAddRef ( blob );
+                if ( rc != 0 )
+                    return rc;
+#if TRACKING_BLOBS
+                fprintf( stderr, "%p->%p(%d) new reference to cached blob *** %s\n"
+                         , self
+                         , blob
+                         , atomic32_read ( & blob -> refcount )
+                         , self->name
+                    );
+#endif
+                /* return new reference */
+                * vblob = blob;
+#if PROD_CACHE > 1
+   #if PROD_CACHE > 2
+                /* MRU cache */
+                if ( i > 0 )
+                {
+		    memmove(self -> cache +1,self -> cache,i*sizeof(*self->cache));
+                    self -> cache [ 0 ] = blob;
+                }
+   #else 
+		if(i > 0 ){  /** trivial case ***/
+		    self -> cache [ 1 ] =  self -> cache [ 0 ];
+		    self -> cache [ 0 ] = blob;
+		}
+   #endif
+#endif
+                return 0;
+            }
+        }
+    }
+#endif /* PROD_CACHE */
+
+    /* dispatch */
+    switch ( self -> var )
+    {
+    case prodSimple:
+        rc = VSimpleProdRead ( ( VSimpleProd* ) self, vblob, id, cnt,cctx );
+        break;
+    case prodFunc:
+        rc = VFunctionProdRead ( ( VFunctionProd* ) self, vblob, id , cnt);
+#if _DEBUGGING && PROD_NAME
+        if ( rc != 0 )
+            DBGMSG ( DBG_VDB, DBG_VDB_FUNCTION, ( "%s: %R\n", self -> name, rc ) );
+#endif
+        break;
+    case prodScript:
+        rc = VScriptProdRead ( ( VScriptProd* ) self, vblob, id , cnt);
+        break;
+    case prodPhysical:
+        rc = VPhysicalProdRead ( ( VPhysicalProd* ) self, vblob, id, cnt );
+        break;
+    case prodColumn:
+        rc = VColumnProdRead ( ( VColumnProd* ) self, vblob, id );
+        break;
+    default:
+        return RC ( rcVDB, rcProduction, rcReading, rcType, rcUnknown );
+    }
+
+#if ! PROD_CACHE
+    return rc;
+#else
+    blob = * vblob;
+
+    if ( rc != 0 || * vblob == NULL )
+        return rc;
+
+#if ! USE_EUGENE
+         /* NB - there is another caching mechanism on VColumn
+            if a blob does not want to be cached, it is rejected here */
+    if ( ! blob -> no_cache )
+        return 0;
+#endif
+    if(cctx == NULL && self->cctx.cache != NULL && blob->stop_id > blob->start_id + 4){/** we will benefit from caching here **/
+		VBlobMRUCacheSave(self->cctx.cache,self->cctx.col_idx,blob);
+		return 0;
+    }
+
+    if(blob->pm == NULL) return 0;
+
+
+    /* cache output */
+    rc = VBlobAddRef ( blob );
+    if ( rc == 0 )
+    {
+        VBlobCheckIntegrity ( blob );
+	if(self -> cache_cnt < PROD_CACHE){
+#if PROD_CACHE > 1
+		if(self -> cache_cnt > 0 ){
+#if PROD_CACHE > 2
+			memmove(self -> cache + 1, self -> cache , self -> cache_cnt * sizeof(*self -> cache));
+#else
+			self -> cache[1]=self -> cache[0];
+#endif
+		}
+#endif
+		self -> cache_cnt ++;
+	} else {
+		/* release whatever was there previously */
+        	/* drop LRU */
+		vblob_release ( self -> cache [ self -> cache_cnt - 1 ], NULL );
+#if PROD_CACHE > 1
+#if PROD_CACHE > 2
+		memmove(self -> cache + 1, self -> cache , (self -> cache_cnt -1) * sizeof(*self -> cache));
+#else
+		self -> cache[1]=self -> cache[0];
+#endif
+#endif
+        }
+        /* insert a head of list */
+        self -> cache [ 0 ] = blob;
+                
+#if TRACKING_BLOBS
+        fprintf( stderr, "%p->%p(%d) cached *** %s\n"
+                 , self
+                 , blob
+                 , atomic32_read ( & blob -> refcount )
+                 , self -> name
+            );
+#endif
+    }
+
+#if USE_EUGENE
+    /* this code requires the blob to be cached on the production */
+    return rc;
+#else
+    /* we don't care if the blob was not cached */
+    return 0;
+#endif
+
+#endif /* PROD_CACHE */
+}
+
+/* IsStatic
+ *  trace all the way to a physical production
+ */
+rc_t VProductionIsStatic ( const VProduction *self, bool *is_static )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcColumn, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        for ( rc = 0; self != NULL; )
+        {
+            switch ( self -> var )
+            {
+            case prodSimple:
+                self = ( ( const VSimpleProd*) self ) -> in;
+                break;
+            case prodFunc:
+            case prodScript:
+            {
+                const VFunctionProd *fp = ( const VFunctionProd* ) self;
+                uint32_t start = VectorStart ( & fp -> parms );
+                uint32_t end = VectorLength ( & fp -> parms );
+                for ( end += start; start < end; ++ start )
+                {
+                    self = ( const VProduction* ) VectorGet ( & fp -> parms, start );
+                    if ( self != NULL )
+                    {
+                        rc = VProductionIsStatic ( self, is_static );
+                        if ( rc != 0 || * is_static )
+                            break;
+                    }
+                }
+                return rc;
+            }
+            case prodPhysical:
+                return VPhysicalIsStatic ( ( ( const VPhysicalProd* ) self ) -> phys, is_static );
+            case prodColumn:
+                self = NULL;
+                break;
+            default:
+                return RC ( rcVDB, rcProduction, rcReading, rcType, rcUnknown );
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* GetKColumn
+ *  drills down to physical production to get a KColumn,
+ *  and if that fails, indicate whether the column is static
+ */
+rc_t VProductionGetKColumn ( const VProduction * self, struct KColumn ** kcol, bool * is_static )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcColumn, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        for ( rc = 0; self != NULL; )
+        {
+            switch ( self -> var )
+            {
+            case prodSimple:
+                self = ( ( const VSimpleProd*) self ) -> in;
+                break;
+            case prodFunc:
+            case prodScript:
+            {
+                const VFunctionProd *fp = ( const VFunctionProd* ) self;
+                uint32_t start = VectorStart ( & fp -> parms );
+                uint32_t end = VectorLength ( & fp -> parms );
+                for ( end += start; start < end; ++ start )
+                {
+                    self = ( const VProduction* ) VectorGet ( & fp -> parms, start );
+                    if ( self != NULL )
+                    {
+                        rc = VProductionGetKColumn ( self, kcol, is_static );
+                        if ( rc != 0 || * kcol != NULL || * is_static )
+                            break;
+                    }
+                }
+                return rc;
+            }
+            case prodPhysical:
+                return VPhysicalGetKColumn ( ( ( const VPhysicalProd* ) self ) -> phys, kcol, is_static );
+            case prodColumn:
+                self = NULL;
+                break;
+            default:
+                return RC ( rcVDB, rcProduction, rcReading, rcType, rcUnknown );
+            }
+        }
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/prod-expr.c b/libs/vdb/prod-expr.c
new file mode 100644
index 0000000..929db1f
--- /dev/null
+++ b/libs/vdb/prod-expr.c
@@ -0,0 +1,885 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+
+#define KONST const
+#include "schema-priv.h"
+#include "schema-expr.h"
+#include "schema-parse.h"
+#include "cursor-priv.h"
+#include "column-priv.h"
+#include "prod-priv.h"
+#include "prod-expr.h"
+#include "phys-priv.h"
+#undef KONST
+
+#include <vdb/schema.h>
+#include <vdb/cursor.h>
+#include <vdb/xform.h>
+#include <klib/symbol.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * VProdResolve
+ */
+
+/* CastExpr
+ *  inserts an explicit cast operation
+ *
+ *  in "C" style languages ( okay, ALGOL style ), a cast expression is
+ *  used as a means of coercing the rh expression type to a fixed type,
+ *  which is then assigned to the lh side with normal typecasting rules.
+ *  specifically, performs an intermediate assignment allowing truncation
+ *  to reshape and potentially reformat the rh value ( e.g. float to char ).
+ *
+ *  in "C++" there were new cast operators introduced to indicate more nuance:
+ *    static_cast      - permits up and down-casts with compiler check
+ *    const_cast       - modifies cv qualifiers [ not applicable to VDB ]
+ *    dynamic_cast     - permits up and down-casts with runtime check
+ *    reinterpret_cast - permits casts between unrelated classes with
+ *                       compatible binary forms ( a la "C" style ).
+ *
+ *  in "VDB", the compiler preserves lh and rh type information until
+ *  productions are resolved. assignments always involve implicit casts
+ *  that permit casting from sub to super-type. our explicit cast expression
+ *  performs something analogous to the C++ "static_cast" in that it allows
+ *  direct up and down casts, as well as sibling and cousin casts.
+ *
+ *  specifically, LH = ( T ) RH when T is a sub-type of LH and:
+ *    a) RH is a sub-type of T [ implicit rule ]
+ *    b) T is a sub-type of RH [ downcast ]
+ *    c) T and RH share a common ancestor
+ *  in all cases, LH, T and RH must all have identical element sizes
+ *
+ *  implicit typecasting rules allow LH or RH to be a typeset. the types
+ *  are initially refined to the intersection between LH and RH
+ *    a) TYPE    x TYPE
+ *    b) TYPESET x TYPE
+ *    c) TYPE    x TYPESET
+ *    d) TYPESET x TYPESET
+ *  in the latter case, the intersection may produce more than one possible
+ *  result, which would incur an error when evaluating the expression. a
+ *  cast operator will remove the ambiguity.
+ *
+ *  the rh expression may involve a column name, with type overloading. this
+ *  creates the same effect as a TYPESET. a cast operator can clarify an ambigous
+ *  assignment, and in the case of downcasts, make it possible.
+ *
+ * NB
+ *  to perform a C++ style reinterpret_cast, use the "cast" function
+ */
+static
+rc_t VProdResolveCastExpr ( const VProdResolve *self, VProduction **out, const SBinExpr *expr )
+{
+    /* extract cast type */
+    VFormatdecl cast;
+    rc_t rc = STypeExprResolveAsFormatdecl
+        ( ( const STypeExpr* ) expr -> left, self -> schema, & cast, self -> cx_bind );
+    if ( rc == 0 )
+    {
+        /* resolve rh expression */
+        VTypedesc desc;
+        VFormatdecl fd = cast;
+        rc = VProdResolveExpr ( self, out, & desc,
+            & fd, expr -> right, true );
+        if ( rc != 0 || * out == NULL )
+            return rc;
+
+        /* casting mode allowed returned production to be:
+           a) identical type
+           b) sub-type
+           c) super-type
+           d) have common parent
+
+           in all cases, the sizeof rh production element
+           matches "cast" size */
+        rc = VSimpleProdMake ( out, self -> owned, self -> curs, prodSimpleCast,
+            "cast", & cast, & desc, NULL, * out, self -> chain );
+    }
+
+    return rc;
+}
+
+/* ParamExpr
+ *  resolve a simple parameter by name
+ */
+LIB_EXPORT rc_t CC VProdResolveParamExpr ( const VProdResolve *self, VProduction **out, const KSymbol *sym )
+{
+    const SProduction *sprod = sym -> u . obj;
+    VProduction *vprod = VCursorCacheGet ( self -> cache, & sprod -> cid );
+    if ( vprod != NULL )
+    {
+        * out = vprod;
+        return 0;
+    }
+
+    PLOGMSG ( klogWarn, ( klogWarn, "unknown parameter '$(param)' used in expression"
+                          , "param=%.*s"
+                          , ( int ) sprod -> name -> name . size
+                          , sprod -> name -> name . addr ));
+    return 0;
+}
+
+
+/* ProdExpr
+ *  resolve a simple production by name
+ *  create/return a VSimpleProd object
+ */
+rc_t VProdResolveSProduction ( const VProdResolve *self, VProduction **out, const SProduction *sprod )
+{
+    rc_t rc;
+    VFormatdecl fd;
+
+    /* check cache */
+    VProduction *vprod = VCursorCacheGet ( self -> cache, & sprod -> cid );
+    if ( vprod != NULL )
+    {
+        /* return valid or failed production */
+        * out = vprod;
+        return 0;
+    }
+
+    /* pre-fail */
+    rc = VCursorCacheSet ( self -> cache, & sprod -> cid, FAILED_PRODUCTION );
+    if ( rc == 0 )
+    {
+        /* resolve production type */
+        if ( sprod -> trigger )
+            memset ( & fd, 0, sizeof fd );
+        else
+        {
+            rc = STypeExprResolveAsFormatdecl
+                ( ( const STypeExpr* ) sprod -> fd, self -> schema, & fd, self -> cx_bind );
+        }
+    }
+    if ( rc == 0 )
+    {
+        /* resolve assignment expression */
+        VTypedesc desc;
+        rc = VProdResolveExpr ( self, out, & desc,
+            & fd, sprod -> expr, false );
+        if ( rc == 0 && * out != NULL )
+        {
+            const char *name = sprod -> name -> name . addr;
+            assert ( name [ sprod -> name -> name . size ] == 0 );
+            rc = VSimpleProdMake ( out, self -> owned, self -> curs, prodSimpleCast, 
+                name, & fd, & desc, & sprod -> cid, * out, self -> chain );
+            if ( rc == 0 )
+            {
+                void *ignore;
+                rc = VCursorCacheSwap ( self -> cache, & sprod -> cid, * out, & ignore );
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t VProdResolveProdExpr ( const VProdResolve *self, VProduction **out, const KSymbol *sym )
+{
+    const SProduction *sprod = sym -> u . obj;
+    if ( ! sprod -> trigger )
+        return VProdResolveSProduction ( self, out, sprod );
+
+    PLOGMSG ( klogWarn, ( klogWarn, "trigger production '$(trig)' used in expression"
+                          , "trig=%.*s"
+                          , ( int ) sym -> name . size
+                          , sym -> name . addr ));
+
+    return 0;
+}
+
+
+/* ColumnExpr
+ *  the trick about resolving a column reference is in its type
+ */
+typedef struct SColumnBestFit SColumnBestFit;
+struct SColumnBestFit
+{
+    BSTNode n;
+    const SColumn *scol;
+    VTypedecl td;
+    uint32_t distance;
+};
+
+static
+rc_t VProdResolveBestColumn ( const VProdResolve *self,
+    VProduction **out, const BSTree *ordered, bool alt )
+{
+    rc_t rc;
+
+    /* walk all candidtes */
+    const SColumnBestFit *n = ( const SColumnBestFit* ) BSTreeFirst ( ordered );
+    for ( rc = 0; n != NULL; n = ( const SColumnBestFit* ) BSTNodeNext ( & n -> n ) )
+    {
+        /* look for open column */
+        const SColumn *scol = n -> scol;
+
+        /* resolve the column as appropriate */
+        rc = VProdResolveColumn ( self, out, scol, alt );
+        if ( rc != 0 || * out != NULL )
+            break;
+    }
+
+    return rc;
+}
+
+static
+int64_t CC order_column ( const BSTNode *item, const BSTNode *n )
+{
+    const SColumnBestFit *a = ( const SColumnBestFit* ) item;
+    const SColumnBestFit *b = ( const SColumnBestFit* ) n;
+    if ( a -> distance != b -> distance )
+        return (int64_t) a -> distance - (int64_t) b -> distance;
+    return VCtxIdCmp ( & a -> scol -> cid, & b -> scol -> cid );
+}
+
+static
+rc_t VProdResolveColExpr ( const VProdResolve *self, VProduction **out,
+    VFormatdecl *fd, const SSymExpr *x, bool casting )
+{
+    rc_t rc;
+    const SNameOverload *sname;
+    const KSymbol *sym = x -> _sym;
+
+    BSTree ordered;
+    uint32_t i, count;
+    SColumnBestFit buff [ 16 ], * nodes = buff;
+
+    /* fail if "fd" has a format */
+    if ( fd -> fmt != 0 )
+    {
+        PLOGMSG ( klogWarn, ( klogWarn, "illegal cast of column '$(name)'"
+                   , "name=%.*s"
+                   , ( int ) sym -> name . size
+                   , sym -> name . addr ));
+        return 0;
+    }
+
+    /* allocate nodes for indexing columns */
+    sname = sym -> u . obj;
+    count = VectorLength ( & sname -> items );
+    if ( count > sizeof buff / sizeof buff [ 0 ] )
+    {
+        nodes = malloc ( sizeof * nodes * count );
+        if ( nodes == NULL )
+            return RC ( rcVDB, rcProduction, rcResolving, rcMemory, rcExhausted );
+    }
+
+    /* insert columns into ordered tree */
+    BSTreeInit ( & ordered );
+    for ( i = VectorStart ( & sname -> items ), count += i; i < count; ++ i )
+    {
+        /* get SColumn */
+        nodes [ i ] . scol = ( const void* ) VectorGet ( & sname -> items, i );
+
+        /* perform type cast and measure distance */
+        if ( casting ?
+             VTypedeclCommonAncestor ( & nodes [ i ] . scol -> td, self -> schema,
+                 & fd -> td, & nodes [ i ] . td, & nodes [ i ] . distance ) :
+             VTypedeclToTypedecl ( & nodes [ i ] . scol -> td, self -> schema,
+                 & fd -> td, & nodes [ i ] . td, & nodes [ i ] . distance ) )
+        {
+            BSTreeInsert ( & ordered, & nodes [ i ] . n, order_column );
+        }
+    }
+
+    /* try to resolve each in order */
+    rc = VProdResolveBestColumn ( self, out, & ordered, x -> alt );
+
+    if ( nodes != buff )
+        free ( nodes );
+
+    return rc;
+}
+
+
+/* PhysExpr
+ */
+rc_t VProdResolveSPhysMember ( const VProdResolve *self,
+    VProduction **out, const SPhysMember *smbr )
+{
+    rc_t rc;
+    VCursor *curs;
+    VPhysical *phys;
+
+    curs = self -> curs;
+    phys = VCursorCacheGet ( & curs -> phys, & smbr -> cid );
+    if ( phys != NULL )
+    {
+        /* this guy should be readable, but it is not guaranteed */
+        if ( phys != FAILED_PHYSICAL )
+            * out = phys -> out;
+        return 0;
+    }
+
+    /* pre-fail */
+    rc = VCursorCacheSet ( & curs -> phys, & smbr -> cid, FAILED_PHYSICAL );
+    if ( rc == 0 )
+    {
+        /* create physical object */
+        rc = VPhysicalMake ( & phys, curs, smbr );
+        if ( rc == 0 )
+        {
+            /* build physical */
+            rc = VProdResolvePhysical ( self, phys );
+            if ( rc == 0 && phys -> out > FAILED_PRODUCTION && phys -> b2p > FAILED_PRODUCTION )
+            {
+                /* set success */
+                void *ignore;
+                rc = VCursorCacheSwap ( & curs -> phys, & smbr -> cid, phys, & ignore );
+                if ( rc == 0 )
+                {
+                    * out = phys -> out;
+                    return 0;
+                }
+            }
+            if ( GetRCState ( rc ) == rcUndefined )
+                rc = 0;
+
+            VPhysicalWhack ( phys, NULL );
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t VProdResolvePhysExpr ( const VProdResolve *self,
+    VProduction **out, const KSymbol *sym )
+{
+    if ( self -> chain == chainEncoding )
+    {
+        assert ( self -> curs -> read_only == false );
+        PLOGMSG ( klogWarn, ( klogWarn, "illegal access of physical column '$(name)'"
+                   , "name=%.*s"
+                   , ( int ) sym -> name . size
+                   , sym -> name . addr ));
+        return 0;
+    }
+
+    return VProdResolveSPhysMember ( self, out, sym -> u . obj );
+}
+
+
+/* FwdExpr
+ *  handle a forwarded symbol in expression
+ *  if the symbol is "virtual", check for its override
+ *  map actual symbol type to expression handler
+ */
+static
+rc_t VProdResolveFwdExpr ( const VProdResolve *self, VProduction **out,
+    VFormatdecl *fd, const SSymExpr *x, bool casting )
+{
+    /* virtual names that appear in parent table
+       expressions may be overridden in children */
+    const KSymbol *sym = x -> _sym;
+    if ( sym -> type == eVirtual )
+    {
+        /* most derived table class */
+        const STable *stbl = self -> stbl;
+        const KSymbol *sym2 = sym;
+        
+        sym = STableFindOverride ( stbl, ( const VCtxId* ) & sym -> u . fwd );
+        if ( sym == NULL )
+        {
+            PLOGMSG ( klogWarn, ( klogWarn, "virtual reference '$(fwd)' not found in overrides table"
+                       , "fwd=%.*s"
+                       , ( int ) sym2 -> name . size
+                       , sym2 -> name . addr ));
+            return 0;
+        }
+    }
+
+    /* test symbol type */
+    switch ( sym -> type )
+    {
+    case eProduction:
+        return VProdResolveProdExpr ( self, out, sym );
+    case ePhysMember:
+        return VProdResolvePhysExpr ( self, out, sym );
+    case eColumn:
+        return VProdResolveColExpr ( self, out, fd, x, casting );
+    }
+
+    VDB_DEBUG (("%s: unresolved forward reference '%S'",
+                 __func__, &sym->name));
+
+    return 0;
+}
+
+/* ResolveExpr
+ *  resolves expression and returns resulting production object
+ *
+ *  "out" [ IN/OUT, INITIALLY NULL ] - return parameter for production.
+ *  assmed to be preset to NULL on input.
+ *  invalid on output with non-zero return code
+ *  non-NULL on successful resolution with zero return code
+ *
+ *  "fd" [ IN/OUT ] - resultant type of assignment expression
+ *  on input gives acceptance criteria, i.e. a fmtdecl, typeset or wildcard
+ *  invalid on output with non-zero return code or NULL "out"
+ *  otherwise, gives actual assigned type on output
+ *
+ *  "casting" [ IN ] - true if performing explicit type casting
+ *  see VProdResolveCastExpr for rules
+ *
+ *  "desc" [ OUT, NULL OKAY ] - resultant type description of "out"
+ *  invalid on non-zero return or NULL "out"
+ *  contains description of fd->td on success
+ *
+ *  "cache" [ IN ] - modifiable vector of VProductions by id within
+ *  a given scope: table or script function.
+ *
+ *  "param" [ IN, NULL OKAY ] - modifiable vector of VProduction params
+ *  by id - only valid within script function
+ *
+ *  "expr" [ IN ] - expression to be evaluated
+ *
+ *  returns non-zero if a non-recoverable error occurs, 0 otherwise.
+ *  resolution is only successful on zero return code and non-NULL out.
+ */
+#if _DEBUGGING
+#include "schema-dump.h"
+
+static size_t xsz;
+static char xbuffer [ 4096 ];
+
+static
+rc_t CC VProdResolveCapture ( void *data, const void *buffer, size_t size )
+{
+    if ( xsz + size >= sizeof xbuffer )
+    {
+        LOGERR (klogFatal, -1, "( xsz + size >= sizeof xbuffer )");
+        return -1;
+    }
+    memmove ( & xbuffer [ xsz ], buffer, size );
+    xsz += size;
+    return 0;
+}
+
+static
+const char *VProdResolvePrintExpr ( const VProdResolve *self, const SExpression *expr )
+{
+    SDumper dumper;
+    SDumperInit ( & dumper, self -> schema, sdmPrint, VProdResolveCapture, NULL );
+
+    xsz = 0;
+    SDumperPrint ( & dumper, "%E", expr );
+    SDumperWhack ( & dumper );
+
+    xbuffer [ xsz ] = 0;
+    return xbuffer;
+}
+
+static const char ispaces [] = "                                                                "
+                               "                                                                ";
+static int indent_level = 0;
+#endif
+
+rc_t VProdResolveExpr ( const VProdResolve *self,
+    VProduction **out, VTypedesc *desc, VFormatdecl *fd,
+    const SExpression *expr, bool casting )
+{
+    rc_t rc;
+    VProduction *prod;
+
+    if ( expr == NULL )
+    {
+        /* report NULL expression, but don't die */
+        PLOGMSG ( klogWarn, ( klogWarn, "NULL expression in '$(tbl)' table schema"
+                   , "tbl=%.*s"
+                   , ( int ) self -> stbl -> name -> name . size
+                   , self -> stbl -> name -> name . addr ));
+        return 0;
+    }
+
+    prod = NULL;
+    *out = NULL;
+
+#if _DEBUGGING
+    ++ indent_level;
+    VDB_DEBUG (( "%*cresolving expression '%s'\n", indent_level, ' ',
+                 VProdResolvePrintExpr ( self, expr ) ));
+#endif
+
+    switch ( expr -> var )
+    {
+    case eParamExpr:
+        /* a script function is making reference to a parameter */
+        rc = VProdResolveParamExpr ( self, & prod, ( ( const SSymExpr* ) expr ) -> _sym );
+    assert (rc != -1);
+        break;
+
+    case eProdExpr:
+        /* return a simple production */
+        rc = VProdResolveProdExpr ( self, & prod, ( ( const SSymExpr* ) expr ) -> _sym );
+    assert (rc != -1);
+        break;
+
+    case eFwdExpr:
+        /* handle an implicit or overridden reference */
+        rc = VProdResolveFwdExpr ( self, & prod, fd, ( const SSymExpr* ) expr, casting );
+    assert (rc != -1);
+        break;
+
+    case eColExpr:
+        /* return a column production */
+        rc = VProdResolveColExpr ( self, & prod, fd, ( const SSymExpr* ) expr, casting );
+    assert (rc != -1);
+        break;
+
+    case ePhysExpr:
+        /* return a physical production */
+        rc = VProdResolvePhysExpr ( self, & prod, ( ( const SSymExpr* ) expr ) -> _sym );
+    assert (rc != -1);
+        break;
+
+    case eScriptExpr:
+        /* create a script function */
+        rc = VProdResolveScriptExpr ( self, & prod, fd, ( const SFuncExpr* ) expr );
+    assert (rc != -1);
+        break;
+
+    case eFuncExpr:
+        /* create an external function */
+        rc = VProdResolveFuncExpr ( self, & prod, fd, ( const SFuncExpr* ) expr );
+    assert (rc != -1);
+        break;
+
+    case eCastExpr:
+        /* perform an explicit cast */
+        rc = VProdResolveCastExpr ( self, & prod, ( const SBinExpr* ) expr );
+    assert (rc != -1);
+        break;
+        
+    case eCondExpr:
+        /* run left and right expressions in order until exit condition */
+        rc = VProdResolveExpr ( self, out, desc, fd, ( ( const SBinExpr* ) expr ) -> left, casting );
+    assert (rc != -1);
+        if ( ( rc == 0 && * out == NULL ) || self -> discover_writable_columns )
+        {
+            rc = VProdResolveExpr ( self, out, desc, fd, ( ( const SBinExpr* ) expr ) -> right, casting );
+    assert (rc != -1);
+        }
+#if _DEBUGGING
+        -- indent_level;
+#endif
+        return rc;
+
+    default:
+        /* report bad expression, but don't die */
+        PLOGMSG ( klogWarn, ( klogWarn, "unrecognized expression in '$(tbl)' table schema"
+                   , "tbl=%.*s"
+                   , ( int ) self -> stbl -> name -> name . size
+                   , self -> stbl -> name -> name . addr ));
+#if _DEBUGGING
+        -- indent_level;
+#endif
+        return 0;
+    }
+
+    /* guard against returns of NULL or FAILED_PRODUCTION */
+    if ( rc == 0 && prod > FAILED_PRODUCTION )
+    {
+        VDB_DEBUG ( ("%*cresolved expression  '%s'\n", indent_level, ' ', VProdResolvePrintExpr ( self, expr ) ) );
+
+        /* returned production must be on requested chain */
+        if ( ( prod -> chain & self -> chain ) == 0 )
+        {
+            rc = RC ( rcVDB, rcProduction, rcResolving, rcSchema, rcInconsistent );
+            VDB_DEBUG ( ( "%*cPRODUCTION RESOLVED ON WRONG FORK: %R\n", indent_level, ' ', rc ) );
+        }
+        else
+        {
+            /* fix uncommitted production chain */
+            if ( prod -> chain == chainUncommitted )
+                prod -> chain = self -> chain;
+
+            /* test for type compatibility - modifies "fd" */
+            if ( casting ?
+                 VFormatdeclCommonAncestor ( & prod -> fd, self -> schema, fd, fd, NULL ) :
+                 VFormatdeclToFormatdecl ( & prod -> fd, self -> schema, fd, fd, NULL ) )
+            {
+                /* if no type description is requested, we're done */
+                if ( desc == NULL )
+                    * out = prod;
+                else
+                {
+                    /* otherwise, create a type description */
+                    rc = VSchemaDescribeTypedecl ( self -> schema, desc, & fd -> td );
+    assert (rc != -1);
+                    if ( rc != 0 )
+                        VDB_DEBUG ( ( "%*cREQUESTED TYPE CANNOT BE DESCRIBED: %R\n", indent_level, ' ', rc ) );
+                    else
+                        * out = prod;
+                }
+            }
+            else
+            {
+#if _DEBUGGING
+                char from [ 128 ] = "", to [ 128 ] = "";
+                VTypedeclToText ( & prod -> fd . td, self -> schema, from, sizeof from );
+                VTypedeclToText ( & fd -> td, self -> schema, to, sizeof to );
+                VDB_DEBUG ( ( "%*cexpression '%s' cannot be %s from '%s' to '%s'\n"
+                              , indent_level, ' '
+                              , VProdResolvePrintExpr ( self, expr )
+                              , casting ? "cast" : "typed"
+                              , from
+                              , to
+                             )
+                    );
+#endif
+            }
+        }
+    }
+    else if ( rc != 0 )
+    {
+        VDB_DEBUG ( ( "failed to resolve expression '%s' prod %p %R\n", VProdResolvePrintExpr ( self, expr ), prod, rc ) );
+    }
+    else if ( prod == NULL )
+    {
+        VDB_DEBUG ( ( "expression '%s' was not resolved\n", VProdResolvePrintExpr ( self, expr ) ) );
+    }
+    else
+    {
+        VDB_DEBUG ( ( "expression '%s' returned FAILED_PRODUCTION\n", VProdResolvePrintExpr ( self, expr ) ) );
+    }
+
+#if _DEBUGGING
+    -- indent_level;
+#endif
+
+    return rc;
+}
+
+
+/* ResolveColumn
+ *  resolves a column from read/validate expression
+ */
+rc_t VProdResolveColumnRead ( const VProdResolve *self,
+    VProduction **out, const SColumn *scol )
+{
+    rc_t rc;
+    VFormatdecl fd;
+    const char *name;
+    VCursor *curs;
+    VColumn *vcol;
+
+    VDB_DEBUG ( ( "resolving column '%N' read expression.\n", scol -> name ) );
+
+    /* potential error if self is NULL */
+    curs = self -> curs;
+    if ( out == NULL )
+    {
+        rc =  RC(rcVDB, rcProduction, rcResolving, rcParam, rcNull);
+        VDB_DEBUG ( ( "result NULL for column '%N'; no output can be produced by '%s' rc %R\n",
+                      scol -> name, __func__, rc ) );
+        return rc;
+    }
+    
+    /* fetch the column */
+    vcol = VCursorCacheGet ( & curs -> col, & scol -> cid );
+    if ( vcol == NULL )
+    {
+        VDB_DEBUG ( ( "failed to fetch NULL for column '%N'; no output was produced by '%s'\n",
+                      scol -> name, __func__ ) );
+        return 0;
+    }
+
+    /* if the read production is in place, return it */
+    if ( vcol -> in != NULL )
+    {
+        if ( vcol -> in != FAILED_PRODUCTION )
+            * out = vcol -> in;
+        return 0;
+    }
+
+    /* pre-fail */
+    vcol -> in = FAILED_PRODUCTION;
+
+    /* production resolution works with fmtdecl */
+    fd . td = scol -> td;
+    fd . fmt = 0;
+
+    /* resolve the expression */
+    rc = VProdResolveExpr ( self, out, & vcol -> desc, & fd, scol -> read, false );
+    assert (rc != -1);
+
+    if ( rc != 0 || *out == NULL )
+        return rc;
+
+    /* repair incomplete column declarations */
+    if ( scol -> td . type_id == 0 )
+    {
+        if ( fd . td . type_id == 0 )
+        {
+            rc = RC ( rcVDB, rcColumn, rcResolving, rcType, rcUndefined );
+            VDB_DEBUG (("failed to repair incomplete declaration for column '%N' rc %R\n",
+                        scol -> name, rc));
+            return rc;
+        }
+        ( ( SColumn* ) scol ) -> td = fd . td;
+    }
+
+    /* create a simple prod to manage fd and desc */
+    name = scol -> name -> name . addr;
+    assert ( name [ scol -> name -> name . size ] == 0 );
+    rc = VSimpleProdMake ( out, self -> owned, self -> curs, prodSimpleCast,
+        name, & fd, & vcol -> desc, NULL, * out, self -> chain );
+
+    assert (rc != -1);
+    if ( rc != 0 )
+    {
+        VDB_DEBUG (("failed to create a simple prod to manage fd and desc for column '%N', rc %R\n",
+                    scol -> name, rc));
+        return rc;
+    }
+
+    /* return column input - this is input to the column
+       that is intended to be read from the cursor */
+    vcol -> in = * out;
+    return rc;
+}
+
+/* ResolvePhysical
+ *  resolves a physical column
+ */
+rc_t VProdResolvePhysicalRead ( const VProdResolve *self, VPhysical *phys )
+{
+    rc_t rc;
+    VTypedesc desc;
+    VFormatdecl fd;
+    VProduction *prod;
+    VFunctionProd *bs;
+    VCursor *curs = self -> curs;
+
+    const char *name;
+    const SExpression *enc;
+    const SPhysMember *smbr;
+
+    /* a write cursor would have opened this already */
+    if ( curs -> read_only )
+    {
+        /* open the physical column for read */
+        rc = VPhysicalOpenRead ( phys,
+            ( VSchema* ) self -> schema, curs -> tbl );
+        if ( rc != 0 )
+        {
+            /* trying to open a column that doesn't exist
+               is not an error, but it didn't resolve */
+            if ( GetRCState ( rc ) == rcNotFound )
+                return 0;
+
+            return rc;
+        }
+    }
+
+    /* should be completely resolved */
+    smbr = phys -> smbr;
+    if ( smbr -> td . type_id == 0 )
+        return 0;
+
+    /* production name */
+    name = smbr -> name -> name . addr;
+
+    /* type information */
+    fd . td = smbr -> td;
+    fd . fmt = 0;
+    rc = VSchemaDescribeTypedecl ( self -> schema, & desc, & fd . td );
+    if ( rc != 0 )
+        return rc;
+
+    /* create output adapter */
+    rc = VPhysicalProdMake ( & prod, self -> owned,
+        curs, phys, prodPhysicalOut, name, & fd, & desc );
+    if ( rc != 0 )
+        return rc;
+
+    /* create byte-swap function with transparent type information */
+    rc = VFunctionProdMake ( & bs, self -> owned,
+        curs, prodFuncByteswap, name, & fd, & desc, chainDecoding );
+    if ( rc != 0 )
+        return rc;
+
+    /* set adapter as input to byte swap */
+    rc = VectorAppend ( & bs -> parms, NULL, prod );
+    if ( rc != 0 )
+        return rc;
+
+    /* take byte-swap function as output */
+    phys -> out = & bs -> dad;
+
+    /* NB - we now have byte-order native output via an adapter
+       it remains to create a decoding path for physical blobs */
+
+
+    /* create adapter */
+    rc = VPhysicalProdMake ( & prod, self -> owned,
+        curs, phys, prodPhysicalKCol, name, & fd, & desc );
+    if ( rc != 0 )
+        return rc;
+
+    /* create serial-to-blob stage */
+    rc = VSimpleProdMake ( & prod, self -> owned, self->curs,
+        prodSimpleSerial2Blob, name, & fd, & desc, NULL, prod, chainDecoding );
+    if ( rc != 0 )
+        return rc;
+
+    /* determine physical encoding */
+    enc = phys -> enc;
+    if ( enc == NULL )
+        enc = smbr -> type;
+
+    /* if unencoded */
+    if ( enc == NULL )
+        phys -> b2p = prod;
+    else
+    {
+        /* the adapter type should be undefined */
+        memset ( & prod -> fd, 0, sizeof prod -> fd );
+        prod -> desc . intrinsic_bits = prod -> desc . intrinsic_dim = 1;
+        prod -> desc . domain = 0;
+
+        /* create decoding production */
+        rc = VProdResolveEncodingExpr ( self, & phys -> b2p,
+            prod, ( const SPhysEncExpr* ) enc );
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/prod-expr.h b/libs/vdb/prod-expr.h
new file mode 100644
index 0000000..d35a839
--- /dev/null
+++ b/libs/vdb/prod-expr.h
@@ -0,0 +1,202 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_prod_expr_
+#define _h_prod_expr_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_cursor_priv_
+#include "cursor-priv.h"
+#endif
+
+#ifndef _h_prod_priv_
+#include "prod-priv.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct BSTree;
+struct KDlset;
+struct VSchema;
+struct SProduction;
+struct SPhysMember;
+struct SColumn;
+struct SExpression;
+struct SFuncExpr;
+struct SPhysEncExpr;
+struct VLinker;
+struct VPhysical;
+
+
+/*--------------------------------------------------------------------------
+ * VProduction
+ */
+
+/* symbol for failed production */
+#define FAILED_PRODUCTION ( ( VProduction* ) 1U )
+
+
+/*--------------------------------------------------------------------------
+ * VTypedecl
+ */
+
+/* Resolve
+ *  ensures typedecl is completely resolved
+ */
+rc_t VTypedeclResolve ( const VTypedecl *self,
+    struct VSchema const *schema, VTypedecl *resolved );
+
+
+/*--------------------------------------------------------------------------
+ * VProdResolve
+ */
+typedef struct VProdResolve VProdResolve;
+struct VProdResolve
+{
+    /* source of type-related information, functions and structures */
+    struct VSchema const *schema;
+
+    /* source of factory functions */
+    struct VLinker *ld;
+    struct KDlset const *libs;
+
+    /* schema of table being resolved */
+    struct STable const *stbl;
+
+    /* cursor containing columns, physicals, productions, triggers */
+    struct VCursor *curs;
+
+    /* vector of cached named productions */
+    VCursorCache *cache;
+
+    /* vector of owned productions */
+    Vector *owned;
+
+    /* vector of late-binding expressions */
+    Vector *cx_bind;
+
+    /* which chain is being resolved
+       chainEncoding    - when going from input to physical
+       chainDecoding    - when pulling from physical to output
+       chainUncommitted - when resolving trigger and validation expressions
+    */
+    uint8_t chain;
+
+    /* true if within blob realm */
+    bool blobbing;
+
+    /* true if column resolution errors should NOT halt cursor open */
+    bool ignore_column_errors;
+
+    /* true if discovering writable columns */
+    bool discover_writable_columns;
+};
+
+
+/* ResolveColumn
+ *  resolves a column using read/validate expression
+ */
+rc_t VProdResolveColumn ( const VProdResolve *self,
+    VProduction **out, struct SColumn const *scol, bool alt );
+rc_t VProdResolveColumnRoot ( const VProdResolve *self,
+    VProduction **out, struct SColumn const *scol );
+rc_t VProdResolveColumnRead ( const VProdResolve *self,
+    VProduction **out, struct SColumn const *scol );
+
+
+/* ResolvePhysical
+ *  resolves a physical column
+ */
+rc_t VProdResolvePhysical ( const VProdResolve *self,
+    struct VPhysical *phys );
+rc_t VProdResolvePhysicalRead ( const VProdResolve *self,
+    struct VPhysical *phys );
+
+
+/* ResolveExpr
+ *  resolves expression and returns resulting production object
+ *
+ *  "out" [ IN/OUT, INITIALLY NULL ] - return parameter for production.
+ *  assmed to be preset to NULL on input.
+ *  invalid on output with non-zero return code
+ *  non-NULL on successful resolution with zero return code
+ *
+ *  "fd" [ IN/OUT ] - resultant type of assignment expression
+ *  on input gives acceptance criteria, i.e. a fmtdecl, typeset or wildcard
+ *  invalid on output with non-zero return code or NULL "out"
+ *  otherwise, gives actual assigned type on output
+ *
+ *  "desc" [ OUT, NULL OKAY ] - resultant type description of "out"
+ *  invalid on non-zero return or NULL "out"
+ *  contains description of fd->td on success
+ *
+ *  "expr" [ IN ] - expression to be evaluated
+ *
+ *  "casting" [ IN ] - true if performing explicit type casting
+ *  see VProdResolveCastExpr for rules
+ *
+ *  returns non-zero if a non-recoverable error occurs, 0 otherwise.
+ *  resolution is only successful on zero return code and non-NULL out.
+ */
+rc_t VProdResolveExpr ( const VProdResolve *self,
+    VProduction **out, VTypedesc *desc, VFormatdecl *fd,
+    struct SExpression const *expr, bool casting );
+
+/* resolves any type of SProduction */
+rc_t VProdResolveSProduction ( const VProdResolve *self, VProduction **out,
+    struct SProduction const *sprod );
+
+/* resolves an SPhysMember symbol */
+rc_t VProdResolveSPhysMember ( const VProdResolve *self,
+    VProduction **out, struct SPhysMember const *smbr );
+
+/* resolves a script function */
+rc_t VProdResolveScriptExpr ( const VProdResolve *self, VProduction **out,
+    const VFormatdecl *lval_fd, struct SFuncExpr const *expr );
+
+/* resolves an external function */
+rc_t VProdResolveFuncExpr ( const VProdResolve *self, VProduction **out,
+    const VFormatdecl *lval_fd, struct SFuncExpr const *expr );
+
+/* resolves physical encoding/decoding expr */
+rc_t VProdResolveEncodingExpr ( const VProdResolve *self, VProduction **out,
+    VProduction *in, struct SPhysEncExpr const *expr );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_prod_expr_ */
diff --git a/libs/vdb/prod-func.c b/libs/vdb/prod-func.c
new file mode 100644
index 0000000..a964d4c
--- /dev/null
+++ b/libs/vdb/prod-func.c
@@ -0,0 +1,957 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define TRACK_REFERENCES 0
+
+#include <vdb/extern.h>
+
+#define KONST const
+#include "prod-priv.h"
+#include "prod-expr.h"
+#include "dbmgr-priv.h"
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "schema-expr.h"
+#include "linker-priv.h"
+#include "table-priv.h"
+#include "cursor-priv.h"
+#include "column-priv.h"
+#include "phys-priv.h"
+#undef KONST
+
+#include <vdb/manager.h>
+#include <vdb/cursor.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/symbol.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * VProdResolve
+ */
+typedef struct SFunctionPushParam SFunctionPushParam;
+struct SFunctionPushParam
+{
+    /* vectors to allow recursive evaluation of types and functions */
+    Vector schema_prior;
+    Vector fact_parms, fact_prior;
+
+    VFormatdecl fd;
+    VTypedesc desc;
+};
+
+static
+rc_t SFunctionPush ( const SFunction *self, const VProdResolve *pr,
+    const VFormatdecl *lval_fd, const SFuncExpr *expr, SFunctionPushParam *pb )
+{
+    rc_t rc;
+    const VSchema *schema = pr -> schema;
+
+    /* validate input parameter counts against formal list */
+    uint32_t count = VectorLength ( & expr -> pfunc );
+    if ( count < self -> func . mand )
+    {
+        rc = RC ( rcVDB, rcFunction, rcResolving, rcParam, rcInsufficient );
+        PLOGERR ( klogWarn, ( klogWarn, rc,
+                   "function '$(func)' requires $(mand) params but got $(count)",
+                   "func=%.*s,mand=%u,count=%u",
+                   self->name->name.len, self->name->name.addr,
+                   self->func.mand,
+                   count
+                 ));
+    }
+    else
+    {
+        uint32_t end = VectorLength ( & self -> func . parms );
+        if ( end < count && ! self -> func . vararg )
+        {
+            rc = RC ( rcVDB, rcFunction, rcResolving, rcParam, rcExcessive );
+            PLOGERR ( klogWarn, ( klogWarn, rc,
+                       "function '$(func)' requires $(mand) params but got $(count)",
+                       "func=%.*s,mand=%u,count=%u",
+                       self->name->name.len, self->name->name.addr,
+                       end,
+                       count
+                     ));
+        }
+        /* ensure this is not an untyped function */
+        else if ( ! self -> validate && self -> rt == NULL )
+            rc = RC ( rcVDB, rcFunction, rcResolving, rcFunction, rcIncorrect );
+        else
+        {
+            /* bind schema params */
+            rc = SFunctionBindSchemaParms ( self, & pb -> schema_prior, & expr -> schem, pr -> cx_bind );
+            if ( rc == 0 )
+            {
+                /* resolve return type */
+                if ( self -> validate )
+                {
+                    /* set type to "void" */
+                    pb -> fd . td . type_id = pb -> fd . td . dim = 1;
+                    pb -> fd . fmt = 0;
+                    memset ( & pb -> desc, 0, sizeof pb -> desc );
+                    pb -> desc . intrinsic_bits = 1;
+                    pb -> desc . intrinsic_dim = 1;
+                }
+                else
+                {
+                    rc = STypeExprResolveAsFormatdecl
+                        ( ( const STypeExpr* ) self -> rt, schema, & pb -> fd, pr -> cx_bind );
+                    if ( rc == 0 )
+                    {
+                        /* pick up cast from lval when return type is "any" or typeset */
+                        if ( pb -> fd . td . type_id == 0 ||
+                             pb -> fd . td . type_id >= 0x40000000 )
+                        {
+                            VFormatdecl cast;
+
+                            if ( VFormatdeclCommonAncestor ( & pb -> fd, schema, lval_fd, & cast, NULL ) )
+                                pb -> fd = cast;
+                            else
+                            {
+                                const KSymbol *fd_name = NULL;
+                                const KSymbol *lval_name = NULL;
+                            
+                                const SDatatype *dt = VSchemaFindTypeid ( schema, lval_fd -> td . type_id );
+                                if ( dt != NULL )
+                                    lval_name = dt -> name;
+                                
+                                dt = VSchemaFindTypeid ( schema, pb -> fd . td . type_id );
+                                if ( dt != NULL )
+                                    fd_name = dt -> name;
+                                else
+                                {
+                                    const STypeset *ts = VSchemaFindTypesetid ( schema, pb -> fd . td . type_id );
+                                    if ( ts != NULL )
+                                        fd_name = ts->name;
+                                }
+
+                                if ( lval_name != NULL && fd_name != NULL ) 
+                                {
+                                    PLOGMSG ( klogWarn, ( klogWarn,
+                                               "function '$(func)' could not resolve return type '$(rtype)' in '$(typeset)'",
+                                               "func=%.*s,rtype=%.*s,typeset=%.*s",
+                                               self->name->name.len, self->name->name.addr,
+                                               lval_name->name.len, lval_name->name.addr,
+                                               fd_name->name.len, fd_name->name.addr
+                                                  ));
+                                }
+                                else
+                                {
+                                    PLOGMSG ( klogInt, ( klogInt,
+                                               "function '$(func)' could not resolve return type or type names!",
+                                               "func=%.*s",
+                                               self->name->name.len, self->name->name.addr
+                                                 ));
+                                }
+                            }
+                        }
+
+                        /* pick up cast from lval when return dimension is "*" */
+                        else if ( pb -> fd . td . dim == 0 )
+                        {
+                            VTypedesc lh_desc, rh_desc;
+                            /* since rh type is T' and is cast to lh type T,
+                               missing dimension is sizeof ( T[dim] ) / sizeof ( T' ) */
+                            rc = VSchemaDescribeTypedecl ( schema, & lh_desc, & lval_fd -> td );
+                            if ( rc == 0 )
+                            {
+                                VTypedecl rh_td;
+                                rh_td . type_id = pb -> fd . td . type_id;
+                                rh_td . dim = 1;
+                                rc = VSchemaDescribeTypedecl ( schema, & rh_desc, & rh_td );
+                                if ( rc == 0 )
+                                {
+                                    pb -> fd . td . dim = VTypedescSizeof ( & lh_desc ) /
+                                        VTypedescSizeof ( & rh_desc );
+
+                                    /* force dimension "*" to be at least 1 */
+                                    if ( pb -> fd . td . dim == 0 )
+                                        pb -> fd . td . dim = 1;
+                                }
+                            }
+                        }
+
+                        /* evaluate type description */
+                        rc = VSchemaDescribeTypedecl ( schema, & pb -> desc, & pb -> fd . td );
+                    }
+                }
+                 
+                if ( rc == 0 )
+                {
+                    /* bind factory params */
+                    rc = SFunctionBindFactParms ( self, & pb -> fact_parms, & pb -> fact_prior, & expr -> pfact, pr -> cx_bind );
+                    if ( rc == 0 )
+                        return 0;
+                }
+
+                SFunctionRestSchemaParms ( self, & pb -> schema_prior, pr -> cx_bind );
+            }
+        }
+    }
+
+    LOGERR ( klogWarn, rc, "failed to resolve function expression" );
+    return rc;
+}
+
+static
+void SFunctionPop ( const SFunction *self,
+    const VProdResolve *pr, SFunctionPushParam *pb )
+{
+    SFunctionRestFactParms ( self, & pb -> fact_prior, pr -> cx_bind );
+    SFunctionRestSchemaParms ( self, & pb -> schema_prior, pr -> cx_bind );
+    VectorWhack ( & pb -> fact_parms, NULL, NULL );
+}
+
+static
+rc_t VProdResolveFuncParamExpr ( const VProdResolve *self, Vector *out,
+    VFormatdecl *fd, const SExpression *expr, const SProduction *sprod )
+{
+    /* Create a production to resolve the expression; also set its
+     * type description */
+    VTypedesc desc;
+    VProduction *prod = NULL;
+    rc_t rc = VProdResolveExpr ( self, & prod, & desc, fd, expr, false );
+    if ( rc == 0 )
+    {
+        if ( prod == NULL )
+            rc = RC ( rcVDB, rcFunction, rcResolving, rcProduction, rcIncomplete );
+        else
+        {
+            bool control;
+            const char *name;
+
+            if ( sprod == NULL )
+            {
+                control = false;
+                name = "vararg";
+            }
+            else
+            {
+                control = sprod -> control;
+                name = sprod -> name -> name . addr;
+                assert ( name [ sprod -> name -> name . size ] == 0 );
+            }
+
+            rc = VSimpleProdMake ( & prod, self -> owned, self-> curs,
+                prodSimpleCast, name,fd, & desc, NULL, prod, self -> chain);
+            if ( rc == 0 )
+            {
+                prod -> control = control;
+                rc = sprod ?
+                    VectorSet ( out, prod -> cid . id = sprod -> cid . id, prod ):
+                    VectorAppend ( out, & prod -> cid . id, prod );
+                if ( rc != 0 )
+                    VProductionWhack ( prod, self -> owned );
+            }
+        }
+    }
+    return rc;
+}
+
+static
+rc_t VProdResolveValidateFuncParams ( const VProdResolve *self, Vector *out,
+    const SFormParmlist *formal, const Vector *expr )
+{
+    rc_t rc;
+    VFormatdecl fd;
+    const SProduction *sprod;
+
+    uint32_t count = VectorLength ( expr );
+    uint32_t end = VectorLength ( & formal -> parms );
+    VectorInit ( out, 0, count );
+
+    /* formal param count must be 2 */
+    assert ( end == 2 );
+
+    /* input param count must equal formals */
+    if ( count != end )
+    {
+        if ( count > end )
+            return RC ( rcVDB, rcFunction, rcResolving, rcParam, rcExcessive );
+        return RC ( rcVDB, rcFunction, rcResolving, rcParam, rcInsufficient );
+    }
+
+    /* resolve production type */
+    sprod = ( const void* ) VectorGet ( & formal -> parms, 0 );
+    rc = STypeExprResolveAsFormatdecl
+        ( ( const STypeExpr* ) sprod -> fd, self -> schema, & fd, self -> cx_bind );
+    if ( rc == 0 )
+    {
+        /* bring in source parameter */
+        const SExpression *pexpr = VectorGet ( expr, 0 );
+
+        /* create copy of resolve block and set to write side */
+        VProdResolve pr = * self;
+        pr . chain = chainEncoding;
+
+        /* resolve source parameter */
+        rc = VProdResolveFuncParamExpr ( & pr, out, & fd, pexpr, sprod );
+        if ( rc == 0 )
+        {
+            /* comparison formal */
+            sprod = ( const void* ) VectorGet ( & formal -> parms, 1 );
+            rc = STypeExprResolveAsFormatdecl
+                ( ( const STypeExpr* ) sprod -> fd, self -> schema, & fd, self -> cx_bind );
+            if ( rc == 0 )
+            {
+                /* bring in comparison parameter */
+                pexpr = VectorGet ( expr, 1 );
+
+                /* evaluate on read side */
+                pr . chain = chainDecoding;
+
+                /* resolve comparison parameter */
+                rc = VProdResolveFuncParamExpr ( & pr, out, & fd, pexpr, sprod );
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t VProdResolveFuncParams ( const VProdResolve *self, Vector *out,
+     const SFormParmlist *formal, const Vector *expr )
+{
+    rc_t rc;
+    VFormatdecl fd, ffd;
+
+    uint32_t i, count = VectorLength ( expr );
+    uint32_t end = VectorLength ( & formal -> parms );
+    VectorInit ( out, 0, count );
+
+    /* assert that there is at least one formal param
+       or that we don't have varargs */
+    assert ( end != 0 || count == 0 );
+
+    /* resolve named parameters */
+    for ( rc = 0, i = 0; rc == 0 && i < count && i < end; ++ i )
+    {
+        /* resolve production type */
+        const SProduction *sprod = ( const void* ) VectorGet ( & formal -> parms, i );
+        rc = STypeExprResolveAsFormatdecl
+            ( ( const STypeExpr* ) sprod -> fd, self -> schema, & fd, self -> cx_bind );
+        if ( rc == 0 )
+        {
+            /* bring in parameter */
+            const SExpression *pexpr = VectorGet ( expr, i );
+            ffd = fd;
+            rc = VProdResolveFuncParamExpr ( self, out, & fd, pexpr, sprod );
+        }
+    }
+
+    /* resolve vararg parameters */
+    for ( ; rc == 0 && i < count; ++ i )
+    {
+        
+        const SExpression *pexpr = VectorGet ( expr, i );
+
+#if 0
+        /* use type "any" */
+        memset ( & fd, 0, sizeof fd );
+#else
+        /* use last formal type */
+        fd = ffd;
+#endif
+
+        rc = VProdResolveFuncParamExpr ( self, out, & fd, pexpr, NULL );
+    }
+
+    return rc;
+}
+
+rc_t VProdResolveScriptExpr ( const VProdResolve *self,
+    VProduction **out, const VFormatdecl *lval_fd, const SFuncExpr *expr )
+{
+    const SFunction *func = expr -> func;
+
+    SFunctionPushParam pb;
+    rc_t rc = SFunctionPush ( func, self, lval_fd, expr, & pb );
+    if ( rc == 0 )
+    {
+        Vector *inputs = malloc ( sizeof * inputs );
+        if ( inputs == NULL )
+            rc = RC ( rcVDB, rcVector, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = VProdResolveFuncParams ( self, inputs,
+                & func -> func, & expr -> pfunc );
+            if ( rc == 0 )
+            {
+                /* script name
+                   heuristic - known to have been created with NUL term */
+                const char *name = expr -> func -> name -> name . addr;
+
+                /* by this time, we have bound all parameters */
+                VScriptProd *script;
+                rc = VScriptProdMake ( & script, self -> owned, self -> curs,
+                    prodScriptFunction, name, & pb . fd, & pb . desc, self -> chain );
+                if ( rc == 0 )
+                {
+                    VCursorCache local;
+                    VCursorCacheInit ( & local, 0, 2 );
+
+                    rc = VectorAppend ( & local . cache, NULL, inputs );
+                    if ( rc == 0 )
+                    {
+                        /* create new structure */
+                        VProdResolve spr = * self;
+                        spr . cache = & local;
+                        spr . owned = & script -> owned;
+
+                        /* forget about the inputs */
+                        inputs = NULL;
+
+                        /* now evaluate the return expression */
+                        rc = VProdResolveExpr ( & spr, & script -> rtn, NULL, & pb . fd,
+                            func -> u . script . rtn, false );
+                        if ( rc != 0 || script -> rtn == NULL )
+                            VProductionWhack ( & script -> dad, self -> owned );
+                        else
+                        {
+                            * out = & script -> dad;
+                        }
+                    }
+
+                    VCursorCacheWhack ( & local, NULL, NULL );
+                }
+            }
+            else if ( GetRCState ( rc ) == rcIncomplete )
+            {
+                /* reset errors when input parameters could not be resolved */
+                rc = 0;
+            }
+
+            if ( inputs != NULL )
+            {
+                VectorWhack ( inputs, NULL, NULL );
+                free ( inputs );
+            }
+        }
+
+        SFunctionPop ( func, self, & pb );
+    }
+
+    return rc;
+}
+
+static
+rc_t VFunctionProdMakeFactParms ( VFunctionProd *self, const VProdResolve *pr,
+    const SFormParmlist *pfact, const Vector *pval, VFactoryParams *fp, const SConstExpr **cxp )
+{
+    rc_t rc;
+    VTypedecl td;
+    const VSchema *schema = pr -> schema;
+    uint32_t i, last = 0, count = fp -> argc;
+
+    for ( rc = 0, i = 0; rc == 0 && i < count; ++ i )
+    {
+        /* fetch the formal parameter, which can be NULL
+           when the factory parameters allow varargs */
+        const SIndirectConst *ic = ( const void* ) VectorGet ( & pfact -> parms, i );
+        if ( ic != NULL )
+            last = i;
+        else
+        {
+            assert ( i != 0 );
+
+            /* just use the last parameter's type */
+            ic = ( const void* ) VectorGet ( & pfact -> parms, last );
+            assert ( ic != NULL );
+        }
+
+        /* TBD - nobody is using function pointer parameters yet */
+        if ( ic -> td == NULL )
+        {
+            rc = RC ( rcVDB, rcFunction, rcConstructing, rcType, rcNull );
+            LOGERR ( klogFatal, rc, "function factory with function param" );
+            break;
+        }
+
+        /* evaluate constant typedecl */
+        rc = STypeExprResolveAsTypedecl ( ( const STypeExpr* ) ic -> td, schema, & td, pr -> cx_bind );
+        if ( rc == 0 )
+            rc = VSchemaDescribeTypedecl ( schema, & fp -> argv [ i ] . desc, & td );
+
+        if ( rc == 0 )
+        {
+            /* evaluate constant expression */
+            const SExpression *ic_expr = ( const void* ) VectorGet ( pval, i );
+            assert ( ic_expr != NULL );
+            rc = eval_const_expr ( schema, & td, ic_expr, ( SExpression** ) & cxp [ i ], pr -> cx_bind );
+            if ( rc == 0 )
+            {
+                /* catch undefined factory parameters from outer script */
+                if ( cxp [ i ] -> dad . var == eIndirectExpr )
+                {
+                    if ( fp -> argc > i )
+                        fp -> argc = i;
+                }
+                else if ( cxp [ i ] -> dad . var != eConstExpr )
+                {
+                    rc = -1;
+                    LOGERR (klogFatal, rc, "(cxp[i]->dad.var != eConstExpr)");
+                    break;
+                }
+                else if ( i >= fp -> argc )
+                {
+                    rc = -1;
+                    LOGERR (klogFatal, rc, "(i >= fp->argc)");
+                    break;
+                }
+                else
+                {
+                    fp -> argv [ i ] . data . u8 = cxp [ i ] -> u . u8;
+                    fp -> argv [ i ] . count = cxp [ i ] -> td . dim;
+                }
+            }
+        }
+    }
+
+    for ( ; i < count; ++ i )
+        cxp [ i ] = NULL;
+
+    return rc;
+}
+
+static
+rc_t VProdResolveInvokeFactory ( const VProdResolve *self, const VXfactInfo *info,
+    VFunctionProd *fprod, const VFactoryParams *cp, const VFunctionParams *dp,
+    VTransDesc *td, bool external )
+{
+    rc_t rc;
+
+    VFuncDesc desc;
+    memset ( & desc, 0, sizeof desc );
+
+    rc = ( * td -> factory ) ( td -> fself, info, & desc, cp, dp );
+    assert ( rc != -1 );
+
+    /* clobber returned context */
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcVDB, rcFunction, rcConstructing );
+
+    /* TBD - validate the returned value */
+    else if ( external &&
+        ( desc . variant == vftInvalid ||
+          desc . variant > vftBlob ||
+          desc . u . bf == NULL ) )
+    {
+        rc = RC ( rcVDB, rcFunction, rcConstructing, rcType, rcInvalid );
+    }
+    else
+    {
+        fprod -> fself = desc . self;
+        fprod -> whack = desc . whack;
+        fprod -> u . rf = desc . u . rf;
+        fprod -> dad . sub = ( uint8_t ) desc . variant;
+    }
+
+    return rc;
+}
+
+static
+rc_t VProdResolveBuildFuncParms ( const VProdResolve *self, const VXfactInfo *info,
+    VFunctionProd *fprod, const VFactoryParams *cp, VTransDesc *td, bool external )
+{
+    rc_t rc;
+    uint32_t i, count;
+
+    /* create a block of function parameters
+       start with data on the stack */
+    VFunctionParams fpbuff, * fp = & fpbuff;
+    count = VectorLength ( & fprod -> parms );
+    if ( count > sizeof fpbuff . argv / sizeof fpbuff . argv [ 0 ] )
+    {
+        fp = malloc ( sizeof fpbuff -
+                      sizeof fpbuff . argv +
+                      count * sizeof fpbuff . argv [ 0 ] );
+        if ( fp == NULL )
+            return RC ( rcVDB, rcFunction, rcResolving, rcMemory, rcExhausted );
+    }
+
+    fp -> argc = count;
+
+    /* copy types */
+    for ( i = 0; i < count; ++ i )
+    {
+        const VProduction *vprod = ( const void* ) VectorGet ( & fprod -> parms, i );
+        fp -> argv [ i ] . fd = vprod -> fd;
+        fp -> argv [ i ] . desc = vprod -> desc;
+    }
+
+    rc = VProdResolveInvokeFactory ( self, info, fprod, cp, fp, td, external );
+
+    if ( fp != & fpbuff )
+        free ( fp );
+
+    return rc;
+}
+
+static
+rc_t VProdResolveBuildFactParms ( const VProdResolve *self, const VXfactInfo *info,
+    VFunctionProd *fprod, const SFormParmlist *pfact, const Vector *pval,
+    VTransDesc *td, bool external )
+{
+    rc_t rc;
+    uint32_t i;
+
+    /* count the number of parameters */
+    uint32_t count = VectorLength ( pval );
+
+    /* create a block of factory parameters
+       start with data on the stack */
+    VFactoryParams fpbuff, * fp = & fpbuff;
+    const SConstExpr *cxbuff [ 16 ], **cxp = cxbuff;
+
+    /* 9/11/13
+       VFactoryParams has a declared array of 16 elements.
+       cxbuff is also declared to have 16 elements. the idea
+       is that they stay in sync. */
+    assert ( sizeof fpbuff . argv / sizeof fpbuff . argv [ 0 ] ==
+             sizeof cxbuff / sizeof cxbuff [ 0 ] );
+
+    /* 16 is generally more than enough parameters.
+       but in cases where it may not be ( e.g. maps ),
+       malloc the memory according to count. */
+    if ( count > sizeof fpbuff . argv / sizeof fpbuff . argv [ 0 ] )
+    {
+        /* allocate both structures in a single block */
+        fp = malloc ( sizeof fpbuff -
+                      sizeof fpbuff . argv +
+                      count * ( sizeof fpbuff . argv [ 0 ] + sizeof cxbuff [ 0 ] ) );
+
+        if ( fp == NULL )
+            return RC ( rcVDB, rcFunction, rcResolving, rcMemory, rcExhausted );
+
+        /* reset expression array to point within block */
+        cxp = ( const SConstExpr** ) & fp -> argv [ count ];
+    }
+
+    fp -> argc = count;
+    fp -> align = 0;
+
+    /* the purpose of this function is to bind type expressions to type ids
+       before the remainder of the function is evaluated. for this to work,
+       we need a mapping of parameterized type ids to expressions.
+
+       the purpose of the cx array is to enable recursion by saving previously
+       bound expressions upon entry ... */
+    rc = VFunctionProdMakeFactParms ( fprod, self, pfact, pval, fp, cxp );
+    assert ( rc != -1 );
+    if ( rc == 0 )
+        rc = VProdResolveBuildFuncParms ( self, info, fprod, fp, td, external );
+    assert ( rc != -1 );
+
+    for ( i = 0; i < count; ++ i )
+        SExpressionWhack ( & cxp [ i ] -> dad );
+
+    if ( fp != & fpbuff )
+        free ( fp );
+
+    return rc;
+}
+
+rc_t VProdResolveFuncExpr ( const VProdResolve *self,
+    VProduction **out, const VFormatdecl *lval_fd, const SFuncExpr *expr )
+{
+    const SFunction *sfunc = expr -> func;
+    const char *name = sfunc -> name -> name . addr;
+
+    SFunctionPushParam pb;
+    rc_t rc = SFunctionPush ( sfunc, self, lval_fd, expr, & pb );
+
+    assert ( rc != -1 );
+
+    if ( rc == 0 )
+    {
+        bool external;
+        VTransDesc td;
+        VXfactInfo info;
+
+        /* pass function type information */
+        info . fdesc . fd = pb . fd;
+        info . fdesc . desc = pb . desc;
+
+        /* locate factory function */
+        rc = VLinkerFindFactory ( self -> ld, self -> libs, & td, sfunc,
+            expr -> version_requested ? expr -> version : sfunc -> version,
+            & external );
+        if ( rc == 0 )
+        {
+            /* create a production representing function */
+            VFunctionProd *fprod;
+            rc = VFunctionProdMake ( & fprod, self -> owned,
+                self -> curs, vftInvalid, name, & info . fdesc . fd,
+                & info . fdesc . desc, self -> chain );
+            if ( rc == 0 )
+            {
+                /* check for a validation function
+                   these functions are generally compiler-generated */
+                if ( sfunc -> validate )
+                {
+                    rc = VProdResolveValidateFuncParams ( self, & fprod -> parms,
+                        & sfunc -> func, & expr -> pfunc );
+                }
+                else
+                {
+                    /* resolve normal function parameters */
+                    rc = VProdResolveFuncParams ( self, & fprod -> parms,
+                        & sfunc -> func, & expr -> pfunc );
+                }
+
+                if ( rc == 0 )
+                {
+                    /* prepare info block for function factory */
+                    info . schema = self -> schema;
+                    info . tbl = self -> curs -> tbl;
+                    info . mgr = info . tbl -> mgr;
+                    info . parms = ( struct VCursorParams * ) self -> curs;
+
+                    /* by this point the schema and factory parameters
+                       have been bound: named type and constant parameters
+                       are entered into the "self -> cx_bind" Vector,
+                       factory parameter constants are positionally recorded
+                       in "pb . fact_parms", and function parameter productions
+                       are recorded in "fprod" */
+
+                    /* the following function will evaluate the parameters
+                       and invoke the factory function to construct production */
+                    rc = VProdResolveBuildFactParms ( self, & info, fprod,
+                        & sfunc -> fact, & pb . fact_parms, & td, external );
+                    if ( rc == 0 )
+                    {
+                        /* successfully created */
+                        * out = & fprod -> dad;
+                    }
+                }
+
+                if ( rc != 0 )
+                {
+                    /* reset errors when input parameters could not be resolved
+                       or if function factory returned an error */
+                    if ( GetRCState ( rc ) == rcIncomplete ||
+                         ( GetRCTarget ( rc ) == rcFunction && GetRCContext ( rc ) == rcConstructing ) )
+                    {
+                        rc = 0;
+                    }
+
+                    VProductionWhack ( & fprod -> dad, self -> owned );
+                }
+            }
+        }
+        else
+        {
+            /* TBD - perhaps report what went wrong, but if function
+               could not be resolved, don't stop the whole process */
+            VDB_DEBUG (( "failed to find function '%S' rc %R",
+                        & sfunc -> name -> name, rc ));
+            rc = 0;
+        }
+        
+        SFunctionPop ( sfunc, self, & pb );
+    }
+
+    return rc;
+}
+
+
+/* resolves physical encoding/decoding expr */
+rc_t VProdResolveEncodingExpr ( const VProdResolve *self,
+    VProduction **out, VProduction *in, const SPhysEncExpr *expr )
+{
+    const SPhysical *sphys = expr -> phys;
+
+    /* bind schema and factory params */
+    Vector schema_prior;
+    rc_t rc = SPhysicalBindSchemaParms ( sphys, & schema_prior, & expr -> schem, self -> cx_bind );
+    if ( rc == 0 )
+    {
+        Vector fact_parms, fact_prior;
+        rc = SPhysicalBindFactParms ( sphys, & fact_parms, & fact_prior, & expr -> pfact, self -> cx_bind );
+        if ( rc == 0 )
+        {
+            /* create single input param vector */
+            Vector *inputs = malloc ( sizeof * inputs );
+            if ( inputs == NULL )
+                rc = RC ( rcVDB, rcVector, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                VectorInit ( inputs, 0, 1 );
+                rc = VectorAppend ( inputs, NULL, in );
+                if ( rc == 0 )
+                {
+                    VFormatdecl fd;
+
+                    if ( self -> chain == chainEncoding )
+                        memset ( & fd, 0, sizeof fd );
+                    else
+                    {
+                        rc = STypeExprResolveAsFormatdecl
+                            ( ( const STypeExpr* ) sphys -> td, self -> schema, & fd, self -> cx_bind );
+                    }
+
+                    if ( rc == 0 )
+                    {
+                        VScriptProd *script;
+                        const char *name = sphys -> name -> name . addr;
+                        rc = VScriptProdMake ( & script, self -> owned, self -> curs,
+                            prodScriptFunction, name, & fd, NULL, self -> chain );
+                        if ( rc == 0 )
+                        {
+                            /* create a production cache for the encoding */
+                            VCursorCache local;
+                            VCursorCacheInit ( & local, 0, 2 );
+
+                            rc = VectorAppend ( & local . cache, NULL, inputs );
+                            if ( rc == 0 )
+                            {
+                                const SFunction *func = ( self -> chain == chainEncoding ) ?
+                                    & sphys -> encode : & sphys -> decode;
+
+                                VProdResolve spr = * self;
+                                spr . cache = & local;
+                                spr . owned = & script -> owned;
+
+                                /* forget about input vector */
+                                inputs = NULL;
+
+                                /* now evaluate the return expression */
+                                rc = VProdResolveExpr ( & spr, & script -> rtn,
+                                    & script -> dad . desc, & script -> dad . fd,
+                                    func -> u . script . rtn, false );
+                                if ( rc != 0 || script -> rtn == NULL )
+                                    VProductionWhack ( & script -> dad, self -> owned );
+                                else
+                                {
+                                    * out = & script -> dad;
+                                }
+                            }
+
+                            VCursorCacheWhack ( & local, NULL, NULL );
+                        }
+                    }
+                
+                    if ( inputs != NULL )
+                    {
+                        VectorWhack ( inputs, NULL, NULL );
+                        free ( inputs );
+                    }
+                }
+            }
+            
+            SPhysicalRestFactParms ( sphys, & fact_prior, self -> cx_bind );
+            VectorWhack ( & fact_parms, NULL, NULL );
+        }
+
+        SPhysicalRestSchemaParms ( sphys, & schema_prior, self -> cx_bind );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * VFunctionProd
+ */
+
+/* BuiltInComparison
+ */
+rc_t VFunctionProdMakeBuiltInComp ( VProduction **prodp, Vector *owned,
+    const char *name,  const VProdResolve *resolve, VProduction *orig, VProduction *test )
+{
+    /* locate factory */
+    VTransDesc td;
+    rc_t rc = VLinkerFindNamedFactory ( resolve -> ld,
+        resolve -> libs, & td, "vdb:compare" );
+    if ( rc == 0 )
+    {
+        const VCursor *curs = resolve -> curs;
+
+        /* build factory params */
+        VFuncDesc fd;
+        VXfactInfo info;
+        VFactoryParams cp;
+        VFunctionParams dp;
+
+        info . schema = curs -> schema;
+        info . tbl  = curs -> tbl;
+        info . mgr = curs -> tbl -> mgr;
+	info . parms = (struct VCursorParams*)curs;
+        info . fdesc . fd = orig -> fd;
+        info . fdesc . desc = orig -> desc;
+
+        memset ( & fd, 0, sizeof fd );
+
+        /* TBD - fill out % or epsilon for fp compare */
+        cp . argc = 0;
+
+        dp . argc = 2;
+        dp . argv [ 0 ] . desc = orig -> desc;
+        dp . argv [ 0 ] . fd = orig -> fd;
+        dp . argv [ 1 ] . desc = test -> desc;
+        dp . argv [ 1 ] . fd = test -> fd;
+
+        /* invoke factory */
+        rc = ( * td . factory ) ( td . fself, & info, & fd, & cp, & dp );
+        if ( rc == 0 )
+        {
+            VFunctionProd *prod;
+            rc = VFunctionProdMake ( & prod, owned, curs,
+                fd . variant, name, & orig -> fd, & orig -> desc, chainDecoding );
+            if ( rc == 0 )
+            {
+                prod -> fself = fd . self;
+                prod -> whack = fd . whack;
+                prod -> u . rf = fd . u . rf;
+
+                /* use orig and test as inputs */
+                rc = VectorAppend ( & prod -> parms, NULL, orig );
+                if ( rc == 0 )
+                {
+                    rc = VectorAppend ( & prod -> parms, NULL, test );
+                    if ( rc == 0 )
+                    {
+                        * prodp = & prod -> dad;
+                        return 0;
+                    }
+                }
+            }
+        }
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/prod-priv.h b/libs/vdb/prod-priv.h
new file mode 100644
index 0000000..0a9a37f
--- /dev/null
+++ b/libs/vdb/prod-priv.h
@@ -0,0 +1,462 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_prod_priv_
+#define _h_prod_priv_
+
+#ifndef _h_vdb_extern_
+#include <vdb/extern.h>
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_xform_priv_
+#include "xform-priv.h"
+#endif
+
+#ifndef _h_schema_priv_
+#include "schema-priv.h"
+#endif
+
+#ifndef _h_blob_priv_
+#include "blob-priv.h"
+#endif
+
+#ifndef _h_klib_debug_
+#include <klib/debug.h> /* DBG_VDB */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define PROD_CACHE  	  2                   	/** default size of Production Cache ***/
+
+/* IT IS A BAD IDEA TO USE EXTERN COLUMNS IN EXPRESSIONS
+   but it used to be okay in version 0 of the schema, so
+   it still occurs sometimes. We have allowed opening
+   columns from within schema but were afraid to alter the
+   row vector because this disturbs the serial allocation
+   of ids that could fool programmers trying to be clever.
+   Unfortunately, this resulted in a stray reference after
+   we shifted reference ownership to the row vector.
+
+   Setting this symbol to 1 will cause schema-opened columns
+   to be inserted into the row vector, disturbing the index
+   series passed out to clients, but not losing the reference. */
+#define OPEN_COLUMN_ALTERS_ROW 1
+
+#if _DEBUGGING
+#define PROD_NAME 1
+#endif
+
+#define VDB_DEBUG(msg) DBGMSG(DBG_VDB,DBG_FLAG(DBG_VDB_RESOLVE), msg )
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VBlob;
+struct KColumn;
+struct VColumn;
+struct VPhysical;
+struct VProdResolve;
+struct VBlobMRUCacheCursorContext;
+
+
+/*--------------------------------------------------------------------------
+ * VProduction
+ */
+
+/* major production types */
+enum
+{
+    /* simple assignment from another production */
+    prodSimple,
+
+    /* function result and input parameters */
+    prodFunc,
+
+    /* a type of function with its own sub-productions */
+    prodScript,
+
+    /* an adapter production that references a VPhysical */
+    prodPhysical,
+
+    /* an adapter production referencing a VColumn */
+    prodColumn
+};
+
+/* read/write chain */
+enum
+{
+    chainInvalid,
+    chainEncoding,
+    chainDecoding,
+    chainUncommitted
+};
+
+#if ! VPRODUCTION_DECLARED_IN_XFORM_H
+typedef struct VProduction VProduction;
+#endif
+struct VProduction
+{
+#if PROD_NAME
+    const char *name;
+#endif
+#if PROD_CACHE
+    /* cached output */
+    struct VBlob *cache [ PROD_CACHE ];
+    uint32_t cache_cnt;
+    uint32_t cache_wash_access_cnt;
+#endif
+    /* format declaration and element type description */
+    VFormatdecl fd;
+    VTypedesc desc;
+
+    /* schema contextual id */
+    VCtxId cid;
+
+    /* owned vector id */
+    uint32_t oid;
+
+    /* production major variant ( enum see above ) */
+    uint8_t var;
+
+    /* production sub-variant ( specific to each major variant */
+    uint8_t sub;
+
+    /* indication of read/write chain */
+    uint8_t chain;
+
+    /* true if used as control parameter */
+    bool control;
+    /* is this production directly connected to a Column in a Cursor */
+    VBlobMRUCacheCursorContext cctx;
+};
+
+
+/* Make
+ *  allocation and parent initialization
+ *  called from the "Make" functions below
+ *
+ *  "prod" [ OUT ] - returned production
+ *
+ *  "size" [ IN ] - sizeof sub-type
+ *
+ *  "owned" [ IN ] - vector to contain productions
+ *
+ *  "var" [ IN ] - variant code, e.g. prodSimple, prodFunc
+ *
+ *  "sub" [ IN ] - sub-variant code, e.g. prodSimplePage2Blob
+ *
+ *  "name" [ IN, NULL OKAY ] - optional object name, derived
+ *  from schema if possible
+ *
+ *  "fd" [ IN ] and "desc" [ IN ] - production type description
+ *
+ *  "cid" [ IN ] - contextual ( two-level ) id
+ *
+ *  "chain" [ IN ] - which chain(s) are supported
+ *    chainEncoding    - when going from input to physical
+ *    chainDecoding    - when pulling from physical to output
+ *    chainUncommitted - when resolving trigger and validation expressions
+ */
+rc_t VProductionMake ( VProduction **prod, Vector *owned, size_t size,
+    int var, int sub, const char *name, const VFormatdecl *fd,
+    const VTypedesc *desc, const VCtxId *cid, uint8_t chain );
+
+
+/* Whack
+ *  virtual whacker
+ *  calls variant specific "Destroy" function
+ *  frees object
+ *
+ *  "owned" [ IN, NULL OKAY ] - a Vector owning production
+ *  if not NULL, production will be removed from vector
+ */
+void CC VProductionWhack ( void *item, void *owned );
+
+
+#if ! VPRODUCTION_DECLARED_IN_XFORM_H
+/* IdRange
+ *  obtains intersection of all physical sources
+ *
+ *  "first" [ IN/OUT ] and "last" [ IN/OUT ] - range to intersect
+ */
+rc_t VProductionColumnIdRange ( const VProduction *self,
+    int64_t *first, int64_t *last );
+rc_t VProductionPageIdRange ( VProduction *self,
+    int64_t id, int64_t *first, int64_t *last );
+
+/* RowLength
+ *  get row length for a particular row
+ */
+uint32_t VProductionRowLength ( const VProduction *self, int64_t row_id );
+
+/* FixedRowLength
+ *  get fixed row length for entire column
+ *  returns 0 if not fixed
+ */
+uint32_t VProductionFixedRowLength ( const VProduction *self, int64_t row_id, bool ignore_self );
+
+#endif /* ! VPRODUCTION_DECLARED_IN_XFORM_H */
+
+/* ReadBlob
+ *  fetch a blob containing at least the requested row
+ *  returns a new reference
+ */
+rc_t VProductionReadBlob ( const VProduction *self, struct VBlob **vblob, int64_t id , uint32_t cnt, struct VBlobMRUCacheCursorContext* cctx);
+
+/* IsStatic
+ *  trace all the way to a physical production
+ */
+rc_t VProductionIsStatic ( const VProduction *self, bool *is_static );
+
+/* GetKColumn
+ *  drills down to physical production to get a KColumn,
+ *  and if that fails, indicate whether the column is static
+ */
+rc_t VProductionGetKColumn ( const VProduction * self, struct KColumn ** kcol, bool * is_static );
+
+
+/*--------------------------------------------------------------------------
+ * VSimpleProd
+ *  single input param
+ */
+enum
+{
+    /* an implicit cast ( assignment ) or an explicit cast from schema */
+    prodSimpleCast,
+
+    /* perform blob class manipulation at page boundary */
+    prodSimplePage2Blob,
+
+    /* serialization interface at kcolumn boundary */
+    prodSimpleSerial2Blob,
+    prodSimpleBlob2Serial
+};
+
+typedef struct VSimpleProd VSimpleProd;
+struct VSimpleProd
+{
+    VProduction dad;
+    VProduction *in;
+    struct VCursor const *curs;
+};
+
+rc_t VSimpleProdMake ( VProduction **prod, Vector *owned,
+    struct VCursor const *curs,int sub, const char *name, const VFormatdecl *fd,
+    const VTypedesc *desc, const VCtxId *cid,
+    VProduction *in, uint8_t chain );
+
+#define VSimpleProdDestroy( self ) \
+    ( ( void ) 0 )
+
+/* Read
+ *  return a blob containing row id
+ */
+rc_t VSimpleProdRead ( VSimpleProd *self, struct VBlob **vblob, int64_t id, uint32_t cnt, struct VBlobMRUCacheCursorContext *cctx );
+
+
+/*--------------------------------------------------------------------------
+ * VFunctionProd
+ *  function input params are VProduction*
+ *  extern C function pointer and self object
+ */
+enum
+{
+    prodFuncExternal = vftLastFuncProto - 1,
+
+    /* internal types */
+    prodFuncBuiltInCompare,
+    prodFuncByteswap
+};
+
+typedef struct VFunctionProd VFunctionProd;
+struct VFunctionProd
+{
+    VProduction dad;
+
+    /* back-pointer to owning cursor
+       not a reference, not to be released */
+    struct VCursor const *curs;
+
+    /* object and optional destructor */
+    void *fself;
+    void ( CC * whack ) ( void *self );
+
+    /* runtime function */
+    union
+    {
+        /* public types */
+        VRowFunc rf;
+        VNonDetRowFunc ndf;
+        VArrayFunc af;
+        VFixedRowFunc pf;
+        VBlobFunc bf;
+
+        /* merge type */
+        VBlobFuncN bfN;
+        
+        /* compare type */
+        VBlobCompareFunc cf;
+
+        /* internal types */
+        void ( * bswap ) ( void*, const void*, uint64_t );
+
+    } u;
+
+    /* vector of VProduction input parameters */
+    Vector parms;
+
+    /* adaptive prefetch parameters */
+   int64_t start_id;
+   int64_t stop_id;
+};
+
+
+rc_t VFunctionProdMake ( VFunctionProd **prod, Vector *owned,
+    struct VCursor const *curs, int sub, const char *name,
+    const VFormatdecl *fd, const VTypedesc *desc, uint8_t chain );
+
+void VFunctionProdDestroy ( VFunctionProd *self );
+
+
+/* BuiltInComparison
+ */
+rc_t VFunctionProdMakeBuiltInComp ( VProduction **prod, Vector *owned,
+    const char *name, struct VProdResolve const *resolve,
+    VProduction *orig, VProduction *test );
+
+
+/* Read
+ */
+rc_t VFunctionProdRead ( VFunctionProd *self, struct VBlob **vblob, int64_t id , uint32_t cnt);
+
+
+/*--------------------------------------------------------------------------
+ * VScriptProd
+ *  function input params are VProduction*
+ *  intermediate productions are also VProduction*
+ */
+enum
+{
+    prodScriptFunction
+};
+
+typedef struct VScriptProd VScriptProd;
+struct VScriptProd
+{
+    VProduction dad;
+    VProduction *rtn;
+    Vector owned;
+    struct VCursor const *curs;
+};
+
+
+rc_t VScriptProdMake ( VScriptProd **prod, Vector *owned,
+    struct VCursor const *curs, int sub, const char *name, const VFormatdecl *fd,
+    const VTypedesc *desc, uint8_t chain );
+
+void VScriptProdDestroy ( VScriptProd *self );
+
+
+/* Read
+ */
+rc_t VScriptProdRead ( VScriptProd *self,
+    struct VBlob **vblob, int64_t id, uint32_t cnt);
+
+
+/*--------------------------------------------------------------------------
+ * VPhysicalProd
+ *  adapts a VPhysical to VProduction
+ */
+enum
+{
+    prodPhysicalOut,
+    prodPhysicalKCol
+};
+
+typedef struct VPhysicalProd VPhysicalProd;
+struct VPhysicalProd
+{
+    VProduction dad;
+    struct VPhysical *phys;
+};
+
+rc_t VPhysicalProdMake ( VProduction **prod, Vector *owned,
+    struct VCursor *curs, struct VPhysical *phys, int sub, const char *name,
+    const VFormatdecl *fd, const VTypedesc *desc );
+
+void VPhysicalProdDestroy ( VPhysicalProd *self );
+
+
+/* Read
+ */
+rc_t VPhysicalProdRead ( VPhysicalProd *self,
+    struct VBlob **vblob, int64_t id, uint32_t cnt );
+
+rc_t VPhysicalProdColumnIdRange (const VPhysicalProd *self, int64_t *first, int64_t *last );
+
+uint32_t VPhysicalProdFixedRowLength(const VPhysicalProd *self, int64_t row_id );
+
+/*--------------------------------------------------------------------------
+ * VColumnProd
+ *  adapts a VColumn to VProduction
+ */
+enum
+{
+    prodColumnOut
+};
+
+typedef struct VColumnProd VColumnProd;
+struct VColumnProd
+{
+    VProduction dad;
+    struct VColumn *col;
+};
+
+
+rc_t VColumnProdMake ( VProduction **prodp, Vector *owned,
+    struct VColumn *col, int sub, const char *name );
+
+void VColumnProdDestroy ( VColumnProd *self );
+
+
+/* Read
+ */
+rc_t VColumnProdRead ( VColumnProd *self,
+    struct VBlob **vblob, int64_t id );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_prod_priv_ */
diff --git a/libs/vdb/prod.c b/libs/vdb/prod.c
new file mode 100644
index 0000000..2dce059
--- /dev/null
+++ b/libs/vdb/prod.c
@@ -0,0 +1,136 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#define TRACK_REFERENCES 0
+
+#define KONST const
+#include "prod-priv.h"
+#include "prod-expr.h"
+#include "schema-priv.h"
+#include "schema-expr.h"
+#include "cursor-priv.h"
+#include "column-priv.h"
+#undef KONST
+
+#include <vdb/cursor.h>
+#include <klib/symbol.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * VProdResolve
+ */
+
+/* ResolveColumn
+ *  resolves a column using read expression
+ */
+rc_t VProdResolveColumnRoot ( const VProdResolve *self,
+    VProduction **out, const SColumn *scol )
+{
+    rc_t rc = VProdResolveColumnRead ( self, out, scol );
+    if ( rc == 0 && * out <= FAILED_PRODUCTION )
+        return RC ( rcVDB, rcCursor, rcOpening, rcColumn, rcUndefined );
+    return rc;
+}
+
+rc_t VProdResolveColumn ( const VProdResolve *self,
+    VProduction **out, const SColumn *scol, bool alt )
+{
+    rc_t rc;
+    VColumn *vcol;
+    VCursor *curs = self -> curs;
+
+    if (alt) {
+        /* TODO: Generate warning message */
+        return RC(rcVDB, rcCursor, rcOpening, rcSchema, rcInvalid);
+    }
+    /* read-only cursor may add columns from schema */
+    vcol = VCursorCacheGet ( & curs -> col, & scol -> cid );
+    if ( vcol == NULL )
+    {
+        rc = VCursorMakeColumn ( curs, & vcol, scol, self -> cx_bind );
+        if ( rc != 0 )
+            return rc;
+
+#if OPEN_COLUMN_ALTERS_ROW
+        rc = VectorAppend ( & curs -> row, & vcol -> ord, vcol );
+        if ( rc != 0 )
+        {
+            VColumnWhack ( vcol, NULL );
+            return rc;
+        }
+#endif
+        rc = VCursorCacheSet ( & curs -> col, & scol -> cid, vcol );
+        if ( rc != 0 )
+        {
+#if OPEN_COLUMN_ALTERS_ROW
+            void *ignore;
+            VectorSwap ( & curs -> row, vcol -> ord, NULL, & ignore );
+            vcol -> ord = 0;
+#endif
+            VColumnWhack ( vcol, NULL );
+            return rc;
+        }
+    }
+
+    /* resolve for read production */
+    return VProdResolveColumnRead ( self, out, scol );
+}
+
+rc_t VProdResolvePhysical ( const VProdResolve *self, struct VPhysical *phys )
+{
+    return VProdResolvePhysicalRead ( self, phys );
+}
+
+/*--------------------------------------------------------------------------
+ * VColumnProd
+ *  message redirect to VColumn
+ */
+
+rc_t VColumnProdMake ( VProduction **prodp, Vector *owned,
+    VColumn *col, int sub, const char *name )
+{
+    return RC ( rcVDB, rcColumn, rcReading, rcSchema, rcInvalid );
+}
+
+void VColumnProdDestroy ( VColumnProd *self )
+{
+}
+
+/* Read
+ */
+rc_t VColumnProdRead ( VColumnProd *self, struct VBlob **vblob, int64_t id )
+{
+    return RC ( rcVDB, rcColumn, rcReading, rcSchema, rcInvalid );
+}
diff --git a/libs/vdb/range-validate.c b/libs/vdb/range-validate.c
new file mode 100644
index 0000000..9585c64
--- /dev/null
+++ b/libs/vdb/range-validate.c
@@ -0,0 +1,195 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include "xform-priv.h"
+#include "blob.h"
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef union {
+    /* integer */
+    int8_t i8[2];
+    int16_t i16[2];
+    int32_t i32[2];
+    int64_t i64[2];
+    
+    /* unsigned integer */
+    uint8_t u8[2];
+    uint16_t u16[2];
+    uint32_t u32[2];
+    uint64_t u64[2];
+    
+    /* floating point */
+    float f32[2];
+    double f64[2];
+} self_t;
+
+#define VALID_FUNC(FUNC, TYPE, VAL) \
+static rc_t CC FUNC(void *Self, const VXformInfo *info, int64_t row_id, VBlob **rslt, uint32_t argc, const VBlob *argv[]) { \
+    const self_t *self = Self; \
+    TYPE lower = self->VAL[0]; \
+    TYPE upper = self->VAL[1]; \
+    const TYPE *src = argv[0]->data.base; \
+    unsigned i; \
+    uint64_t n = argv[0]->data.elem_count; \
+\
+    for (i = 0; i != n; ++i) { \
+        TYPE val = src[i]; \
+\
+        if (val < lower || val > upper) \
+	    return RC(rcVDB, rcFunction, rcExecuting, rcConstraint, rcViolated); \
+    } \
+    *rslt = (VBlob *)argv[0]; \
+    (void)VBlobAddRef(*rslt); \
+    return 0; \
+}
+
+VALID_FUNC(valid_U8, uint8_t, u8)
+VALID_FUNC(valid_I8, int8_t, i8)
+VALID_FUNC(valid_U16, uint16_t, u16)
+VALID_FUNC(valid_I16, int16_t, i16)
+VALID_FUNC(valid_U32, uint32_t, u32)
+VALID_FUNC(valid_I32, int32_t, i32)
+VALID_FUNC(valid_U64, uint64_t, u64)
+VALID_FUNC(valid_I64, int64_t, i64)
+VALID_FUNC(valid_F32, float, f32)
+VALID_FUNC(valid_F64, double, f64)
+
+/* range_validate
+ *  function < type T > T range_validate #1.0 < T lower, T upper > ( T in )
+ */
+static
+void CC vfunc_free ( void * self )
+{
+    free (self);
+}
+
+VTRANSFACT_BUILTIN_IMPL(vdb_range_validate, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+    self_t *self;
+
+    /* check types */
+    switch (info->fdesc.desc.domain) {
+        case vtdInt:
+        case vtdUint:
+        case vtdFloat:
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+    }
+    switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+        case 16:
+        case 32:
+        case 64:
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+    }
+    
+    self = malloc(sizeof(*self));
+    if (self == NULL)
+        return RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    
+    rslt->self = self;
+    rslt->whack = vfunc_free;
+    rslt->variant = vftBlobN;
+    
+    switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            switch (info->fdesc.desc.intrinsic_bits) {
+                case 8:
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = valid_I8;
+                    self->i8[0] = *cp->argv[0].data.i8;
+                    self->i8[1] = *cp->argv[1].data.i8;
+                    break;
+                case 16:
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = valid_I16;
+                    self->i16[0] = *cp->argv[0].data.i16;
+                    self->i16[1] = *cp->argv[1].data.i16;
+                    break;
+                case 32:
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = valid_I32;
+                    self->i32[0] = *cp->argv[0].data.i32;
+                    self->i32[1] = *cp->argv[1].data.i32;
+                    break;
+                case 64:
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = valid_I64;
+                    self->i64[0] = *cp->argv[0].data.i64;
+                    self->i64[1] = *cp->argv[1].data.i64;
+                    break;
+            }
+            break;
+        case vtdUint:
+            switch (info->fdesc.desc.intrinsic_bits) {
+                case 8:
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = valid_U8;
+                    self->u8[0] = *cp->argv[0].data.u8;
+                    self->u8[1] = *cp->argv[1].data.u8;
+                    break;
+                case 16:
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = valid_U16;
+                    self->u16[0] = *cp->argv[0].data.u16;
+                    self->u16[1] = *cp->argv[1].data.u16;
+                    break;
+                case 32:
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = valid_U32;
+                    self->u32[0] = *cp->argv[0].data.u32;
+                    self->u32[1] = *cp->argv[1].data.u32;
+                    break;
+                case 64:
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = valid_U64;
+                    self->u64[0] = *cp->argv[0].data.u64;
+                    self->u64[1] = *cp->argv[1].data.u64;
+                    break;
+            }
+            break;
+        case vtdFloat:
+            switch (info->fdesc.desc.intrinsic_bits) {
+                case 32:
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = valid_F32;
+                    self->f32[0] = *cp->argv[0].data.f32;
+                    self->f32[1] = *cp->argv[1].data.f32;
+                    break;
+                case 64:
+                    VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = valid_F64;
+                    self->f64[0] = *cp->argv[0].data.f64;
+                    self->f64[1] = *cp->argv[1].data.f64;
+                    break;
+            }
+            break;
+    }
+    return rc;
+}
diff --git a/libs/vdb/redimension.c b/libs/vdb/redimension.c
new file mode 100644
index 0000000..3e22dfe
--- /dev/null
+++ b/libs/vdb/redimension.c
@@ -0,0 +1,108 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#include "blob.h"
+
+#include "blob-headers.h"
+#include "page-map.h"
+#include "blob-priv.h"
+#include "xform-priv.h"
+
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <assert.h>
+
+typedef struct self_t {
+    uint32_t elem_bits;
+} self_t;
+
+static
+rc_t CC redimension_drvr(
+                      void *Self,
+                      const VXformInfo *info,
+                      int64_t row_id,
+                      VBlob **rslt,
+                      uint32_t argc, const VBlob *argv[]
+) {
+    rc_t rc;
+    const self_t *self = (const self_t *)Self;
+    const VBlob *src = argv[0];
+    VBlob *y;
+    
+    rc = VBlobNew(&y, src->start_id, src->stop_id, "redimension");
+    if (rc)
+        return rc;
+    
+    rc = KDataBufferCast(&src->data, &y->data, self->elem_bits, false);
+    if (rc == 0) {
+        y->byte_order = src->byte_order;
+        PageMapAddRef(y->pm = src->pm);
+	y->pm->optimized = eBlobPageMapOptimizedFailed; /** pagemap is no longer valid; prevent optimization ***/
+        BlobHeadersAddRef(y->headers = src->headers);
+        
+        *rslt = y;
+        return 0;
+    }
+	return rc;
+}
+static
+void CC vfunc_free ( void * self )
+{
+    free ( self );
+}
+
+#include <stdio.h>
+
+VTRANSFACT_BUILTIN_IMPL(vdb_redimension, 1, 0, 0) (
+                                           const void *Self,
+                                           const VXfactInfo *info,
+                                           VFuncDesc *rslt,
+                                           const VFactoryParams *cp,
+                                           const VFunctionParams *dp
+) {
+    self_t *self;
+    
+    self = malloc(sizeof(*self));
+    if (self) {
+        self->elem_bits = VTypedescSizeof(&info->fdesc.desc);
+        
+        rslt->self = self;
+        rslt->whack = vfunc_free;
+        rslt->variant = vftBlobN;
+        VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = redimension_drvr;
+        return 0;
+    }
+    return RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
diff --git a/libs/vdb/report-vdb.c b/libs/vdb/report-vdb.c
new file mode 100644
index 0000000..3eb9f7a
--- /dev/null
+++ b/libs/vdb/report-vdb.c
@@ -0,0 +1,853 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include <klib/report.h> /* ReportInit */
+#include <klib/time.h> /* KTime */
+#include <klib/namelist.h> /* KNamelistRelease */
+#include <klib/out.h> /* OUTMSG */
+#include <klib/klib-priv.h> /* ReportFuncs */
+
+#include <vdb/report.h> /* ... */
+#include <vdb/manager.h> /* VDBManagerVersion */
+#include <vdb/vdb-priv.h> /* VTableOpenKTableRead */
+#include <vdb/database.h> /* VDatabaseRelease */
+#include <vdb/table.h> /* VTableOpenParentRead */
+#include <vdb/dependencies.h> /* VDBDependenciesRelease */
+
+#include <kdb/kdb-priv.h> /* KDatabaseGetPath */
+#include <kdb/manager.h> /* kptDatabase */
+#include <kdb/database.h> /* KDatabaseRelease */
+#include <kdb/table.h> /* KTableRelease */
+
+#include <kfs/dyload.h> /* KDyld */
+#include <kfs/file.h> /* KFileRead */
+#include <kfs/nullfile.h> /* KFileMakeNullUpdate */
+#include <kfs/md5.h> /* KMD5SumFmt */
+
+#include <atomic.h>
+
+#include <stdarg.h> /* va_start */
+#include <stdio.h> /* sprintf */
+#include <stdlib.h> /* malloc */
+#include <string.h> /* memset */
+#include <limits.h> /* PATH_MAX */
+#include <assert.h>
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+/*
+ * An unrecoverable error happened.
+ * We can help to solve it
+ * by reporting information about known application execution environment.
+ */
+
+typedef struct Report {
+    const VDBManager* mgr;
+    const VDatabase* db;
+    const VTable* table;
+} Report;
+
+static atomic_ptr_t report_singleton;
+
+static rc_t CC ReportRelease ( void )
+{
+    rc_t rc = 0;
+    Report *prev_report, *cur_report;
+
+    cur_report = report_singleton . ptr;
+    do
+    {
+        prev_report = cur_report;
+        cur_report = atomic_test_and_set_ptr ( & report_singleton, NULL, prev_report );
+    }
+    while ( cur_report != prev_report );
+
+    if ( cur_report != NULL )
+    {
+        /* cleanup */
+        VTableRelease ( cur_report -> table );
+        VDatabaseRelease ( cur_report -> db );
+        VDBManagerRelease ( cur_report -> mgr );
+        memset ( cur_report, 0, sizeof * cur_report );
+    }
+
+    return rc;
+}
+
+static rc_t CC ReportObj(const ReportFuncs *f, uint32_t indent,
+    const char *path, bool *wasDbOrTableSet);
+static rc_t CC ReportSOFTWARE ( const ReportFuncs *f, uint32_t indent, const char *argv_0, const char *date, ver_t tool_ver );
+
+static rc_t ReportGet(Report** self)
+{
+    rc_t rc = 0;
+
+    static bool latch;
+    if ( ! latch )
+    {
+        static Report self;
+
+        rc = ReportInitVDB ( ReportObj, ReportSOFTWARE, ReportRelease );
+        if ( rc == 0 )
+        {
+            report_singleton . ptr = & self;
+            latch = true;
+        }
+    }
+
+    * self = ( Report* ) report_singleton . ptr;
+
+    return rc;
+}
+
+#define report ( * f -> report )
+#define reportData ( * f -> reportData )
+#define reportData1 ( * f -> reportData1 )
+#define reportOpen ( * f -> reportOpen )
+#define reportOpen1 ( * f -> reportOpen1 )
+#define reportClose ( * f -> reportClose )
+#define reportClose1 ( * f -> reportClose1 )
+#define reportError ( * f -> reportError )
+#define reportErrorStr ( * f -> reportErrorStr )
+#define reportErrorStrImpl ( * f -> reportErrorStrImpl )
+#define reportErrorStrInt ( * f -> reportErrorStrInt )
+#define reportError3Str ( * f -> reportError3Str )
+
+static
+rc_t ReportBuild(const ReportFuncs *f, uint32_t indent, const VDBManager* mgr)
+{
+    rc_t rc = 0;
+    KNamelist* list = NULL;
+    reportOpen(indent, "Build", 1, "static", 's', "true");
+    if (mgr) {
+        rc_t rc2 = VDBManagerListExternalSchemaModules(mgr, &list);
+        if (rc2 != 0) {
+            reportError
+                (indent + 1, rc2, "VDBManagerListExternalSchemaModules");
+            if (rc == 0 && rc2 != 0)
+            {   rc = rc2; }
+        }
+        else {
+            uint32_t count = 0;
+            rc2 = KNamelistCount(list, &count);
+            if (rc2 != 0) {
+                reportErrorStr(indent + 1, rc2, "KNamelistCount", "origin",
+                               "VDBManagerListExternalSchemaModules");
+                if (rc == 0 && rc2 != 0)
+                {   rc = rc2; }
+            }
+            else {
+                uint32_t i = 0;
+                for (i = 0; i < count && rc2 == 0; ++i) {
+                    const char* name = NULL;
+                    rc2 = KNamelistGet(list, i, &name);
+                    if (rc2 != 0) {
+                        reportErrorStr(
+                            indent + 1, rc2, "KNamelistGet", "origin",
+                            "VDBManagerListExternalSchemaModules");
+                        if (rc == 0 && rc2 != 0)
+                        {   rc = rc2; }
+                    }
+                    else {
+                        report(indent + 1, "Module", 1, "name", 's', name);
+                    }
+                }
+            }
+        }
+        RELEASE(KNamelist, list);
+        reportClose(indent, "Build");
+    }
+    return rc;
+}
+
+static rc_t VDBDependenciesReportDepend1(const VDBDependencies *self,
+    const ReportFuncs *f,
+    uint32_t count, uint32_t indent, bool toreport, uint32_t *missing)
+{
+    KDirectory *dir = NULL;
+    rc_t rc = 0;
+    uint32_t i = ~0;
+
+    assert(missing);
+
+    *missing = 0;
+
+    for (i = 0; i < count; ++i) {
+        bool isMissing = false;
+        bool local = false;
+        const char* seq_id = "";
+        const char* path = NULL;
+        rc = VDBDependenciesSeqId(self, &seq_id, i);
+        if (rc != 0 && toreport)
+            reportErrorStrInt(indent, rc, "VDBDependenciesSeqId",
+                "origin", "VDatabaseListDependencies", "idx", i);
+        if (rc == 0) {
+            rc = VDBDependenciesLocal(self, &local, i);
+            if (rc != 0 && toreport) {
+                reportErrorStrInt(indent, rc,
+                    "VDBDependenciesLocal",
+                    "origin", "VDatabaseListDependencies", "idx", i);
+            }
+        }
+        if (rc == 0) {
+            rc = VDBDependenciesPath(self, &path, i);
+            if (rc != 0 && toreport) {
+                reportErrorStrInt(indent, rc, "VDBDependenciesPath",
+                    "origin", "VDatabaseListDependencies", "idx", i);
+            }
+        }
+        if (rc == 0) {
+            if (!local && (path == NULL || path[0] == '\0')) {
+                isMissing = true;
+                ++*missing;
+            }
+            if (toreport) {
+                bool reported = false;
+                if (!isMissing && !local)  {
+                    rc_t rc = 0;
+                    bool readable = false;
+                    uint64_t size = ~0;
+                    KTime_t date = 0;
+                    bool ready = false;
+                    if (dir == NULL)
+                    {   rc = KDirectoryNativeDir(&dir); }
+                    assert(!local && path && path[0]);
+                    if (dir != NULL) {
+                        rc = KDirectoryFileSize(dir, &size, "%s", path);
+                        if (rc == 0)
+                        {   rc = KDirectoryDate(dir, &date, "%s", path); }
+                        if (rc == 0) {
+                            const KFile* f = NULL;
+                            rc = KDirectoryOpenFileRead(dir, &f, "%s", path);
+                            if (rc == 0) {
+                                char buffer[1024];
+                                size_t num_read = 0;
+                                size_t bsize =
+                                    size > sizeof buffer ? sizeof buffer : size;
+                                rc = KFileReadAll(f,
+                                    0, buffer, bsize, &num_read);
+                                if (rc == 0 && num_read != bsize) {
+                                    rc = RC(rcVDB, rcFile, rcReading,
+                                        rcBuffer, rcExcessive);
+                                }
+                                if (rc == 0)
+                                {   readable = true; }
+                            }
+                            KFileRelease(f);
+                        }
+                        if (rc == 0)
+                        {   ready = true; }
+                    }
+                    if (ready) {
+                        KTime kt;
+                        memset(&kt, 0, sizeof kt);
+                        KTimeLocal(&kt, date);
+                        report(indent, "Dependency", 7,
+                            "index", 'd', i,
+                            "seq_id", 's', seq_id,
+                            "local", 's', local ? "true" : "false",
+                            "path", 's', path,
+                            "size", 'u', size,
+                            "date", 'T', &kt,
+                            "readable", 's', readable ? "true" : "false");
+                        reported = true;
+                    }
+                    else {
+                        report(indent, "Dependency", 5,
+                            "index", 'd', i,
+                            "seq_id", 's', seq_id,
+                            "local", 's', local ? "true" : "false",
+                            "path", 's', path,
+                            "error", 'R', rc);
+                        reported = true;
+                    }
+                }
+                if (!reported) {
+                    report(indent, "Dependency", 4,
+                        "index", 'd', i,
+                        "seq_id", 's', seq_id,
+                        "local", 's', local ? "true" : "false",
+                        "path", 's', path == NULL ? "" : path);
+                }
+            }
+        }
+        if (rc != 0 && !toreport)
+        {   break; }
+    }
+
+    RELEASE(KDirectory, dir);
+
+    return rc;
+}
+
+static rc_t ReportDepend(const ReportFuncs *f,
+    uint32_t indent, const VDatabase* db)
+{
+    rc_t rc = 0;
+
+    const VDBDependencies* dep = NULL;
+
+    const char tag[] = "Dependencies";
+
+    assert(db);
+
+    reportOpen(indent, tag, 0);
+
+    rc = VDatabaseListDependencies(db, &dep, false);
+    if (rc != 0) {
+        reportError(indent + 1, rc, "VDatabaseListDependencies");
+    }
+    else {
+        uint32_t count = 0;
+        rc = VDBDependenciesCount(dep, &count);
+        if (rc != 0) { 
+            reportError(indent + 1, rc, "VDBDependenciesCount");
+        }
+        else {
+            uint32_t missing = 0;
+            const char tag[] = "List";
+            rc = VDBDependenciesReportDepend1(dep, f,
+                count, indent + 2, false, &missing);
+
+            if (rc == 0) {
+                reportOpen(indent + 1, tag, 2, "count", 'd', count,
+                    "missing", 'd', missing);
+            }
+            else {
+                reportOpen(indent + 1, tag, 1, "count", 'd', count);
+            }
+            
+            rc = VDBDependenciesReportDepend1(dep, f,
+                count, indent + 2, true, &missing);
+            reportClose(indent + 1, tag);
+        }
+    }
+
+    reportClose(indent, tag);
+
+    RELEASE(VDBDependencies, dep);
+
+    return rc;
+}
+
+typedef struct Total {
+    int64_t sz;
+    int64_t files;
+} Total;
+
+static rc_t CC visitor(const KDirectory* dir,
+    uint32_t type, const char* name, void* data)
+{
+    rc_t rc = 0;
+    Total* total = (Total*) data;
+    if (type & kptAlias)
+    {   return rc; }
+    assert(total);
+    switch (type) {
+        case kptFile: {
+            uint64_t size = 0;
+            rc = KDirectoryFileSize(dir, &size, "%s", name);
+            if (rc == 0) {
+                total->sz += size;
+            }
+            ++total->files;
+            break;
+        }
+        case kptDir: 
+            rc = KDirectoryVisit(dir, false, visitor, total, "%s", name);
+            break;
+        default:
+            rc = RC(rcVDB, rcDirectory, rcVisiting, rcType, rcUnexpected);
+            break;
+    }
+    return rc;
+}
+
+static rc_t ReportDir(const ReportFuncs *f, uint32_t indent, const KTable* tbl) {
+    rc_t rc = 0;
+    const KDirectory* dir = NULL;
+    if (tbl == NULL) {
+        report(indent, "Error", 1, "KTable" , 's', "NULL");
+        return rc;
+    }
+    rc = KTableOpenDirectoryRead(tbl, &dir);
+    if (rc != 0) {
+        reportError(indent, rc, "KTableOpenDirectoryRead");
+    }
+    else {
+        Total total;
+        memset(&total, 0, sizeof total);
+        rc = KDirectoryVisit(dir, false, visitor, &total, NULL);
+        report(indent, "Directory", 2,
+            "size", 'l', total.sz, "files", 'l', total.files);
+    }
+    RELEASE(KDirectory, dir);
+    return rc;
+}
+
+#define OBJ_OPEN(indent,count,path,type) reportOpen(indent, "Object", count, \
+    "path", 's', path, "type", 's', type
+#define OBJ_P_OPEN(indent,count,path,type,file_type) \
+    OBJ_OPEN(indent, count, path, type), "fs_type", 's', file_type
+
+#define OBJ(indent,path,type) \
+    OBJ_OPEN(indent, 2, path, type) )
+#define OBJ_P(indent,path,type,file_type) \
+    OBJ_P_OPEN(indent, 3, path, type, file_type) )
+#define OBJ_P_A(indent,path,type,file_type) \
+    OBJ_P_OPEN(indent, 4, path, type, file_type), "alias", 's', "true")
+#define OBJ_P_S(indent,path,type,file_type,size) \
+    OBJ_P_OPEN(indent, 4, path, type, file_type), "size", 'l', size)
+#define OBJ_P_S_A(indent,path,type,file_type,size) \
+    OBJ_P_OPEN(indent, 5, path, type, file_type), "size", 'l', size, \
+                                                  "alias", 's', "true")
+
+static rc_t CC ReportObj(const ReportFuncs *f, uint32_t indent,
+    const char *object, bool *wasDbOrTableSet)
+{
+    Report* self = NULL;
+    const char* fullpath = NULL;
+    const KDatabase* kdb = NULL;
+    const KTable* ktbl = NULL;
+    const VDatabase* db = NULL;
+    KPathType type = kptNotFound;
+    KPathType file_type = kptNotFound;
+    bool alias = false;
+    uint64_t size = 0;
+    bool size_unknown = true;
+
+    rc_t rc = ReportGet(&self);
+    assert(self);
+
+    if (wasDbOrTableSet != NULL) {
+        *wasDbOrTableSet = self->db != NULL || self->table != NULL;
+        return 0;
+    }
+
+    if (self->db != NULL) {
+        type = kptDatabase;
+        db = self->db;
+    }
+    else if (self->table != NULL) {
+        rc_t rc2 = VTableOpenParentRead(self->table, &db);
+        if (rc2)
+        {
+            if (rc == 0)
+            {
+                rc = rc2;
+            }
+        }
+        else if (!db)
+        {
+            type = kptTable;
+            rc2 = VTableGetKTableRead(self->table, &ktbl);
+            if (rc2)
+            {
+                if (rc == 0)
+                {
+                    rc = rc2;
+                }
+            }
+            else
+            {
+                rc2 = KTableGetPath(ktbl, &fullpath);
+            }
+        }
+    }
+
+    if (db) {
+        rc_t rc2 = VDatabaseOpenKDatabaseRead(db, &kdb);
+        type = kptDatabase;
+        if (rc2) {
+            if (rc == 0)
+            {   rc = rc2; }
+        }
+        else {
+            rc2 = KDatabaseGetPath(kdb, &fullpath);
+            if (rc2) {
+                if (rc == 0)
+                {   rc = rc2; }
+            }
+        }
+    }
+
+    if (fullpath) {
+        KDirectory* dir = NULL;
+        rc_t rc2 = KDirectoryNativeDir(&dir);
+        if (rc2) {
+            if (rc == 0)
+            {   rc = rc2; }
+        }
+        else {
+            file_type = KDirectoryPathType(dir, "%s", fullpath);
+            alias = file_type & kptAlias;
+            file_type &= ~kptAlias;
+            if (file_type == kptFile) {
+                rc2 = KDirectoryFileSize(dir, &size, "%s", fullpath);
+                if (rc2) {
+                    if (rc == 0)
+                    {   rc = rc2; }
+                }
+                else {  size_unknown = false; }
+            }
+        }
+        RELEASE(KDirectory, dir);
+    }
+
+    if (object || type != kptNotFound) {
+        const char* path
+            = fullpath ? fullpath : object ? object : "not set";
+        const char* stype = type == kptTable ? "table" : 
+            type == kptDatabase ? "database" : "unknown";
+        const char* sfile_type = file_type == kptFile ? "archive" : 
+            file_type == kptDir ? "dir" : "unexpected";
+
+        if (fullpath && !size_unknown) {
+            if (alias)
+            { OBJ_P_S_A(indent, path, stype, sfile_type, size); }
+            else
+            { OBJ_P_S  (indent, path, stype, sfile_type, size); }
+        }
+        else if (fullpath && size_unknown) {
+            if (alias)
+            { OBJ_P_A  (indent, path, stype, sfile_type); }
+            else
+            { OBJ_P    (indent, path, stype, sfile_type); }
+        }
+        else
+        {     OBJ      (indent, path, stype); }
+
+        if (!db)
+        {   db = self->db; }
+
+        if (db) {
+            rc_t rc2 = ReportDepend(f, indent + 1, db);
+            if (rc == 0)
+            {   rc = rc2; }
+        }
+        if (file_type == kptDir) {
+            rc_t rc2 = ReportDir(f, indent + 1, ktbl);
+            if (rc == 0)
+            {   rc = rc2; }
+        }
+
+        reportClose(indent, "Object");
+    }
+
+    if (db != self->db)
+    {   RELEASE(VDatabase, db); }
+    RELEASE(KTable, ktbl);
+    RELEASE(KDatabase, kdb);
+
+    return rc;
+}
+
+static
+rc_t md5(const char* path, uint8_t digest[16], const KDirectory* dir)
+{
+    const KFile* kf = NULL;
+    rc_t rc = KDirectoryOpenFileRead(dir, &kf, "%s", path);
+    if (rc == 0) {
+        KFile* fnull = NULL;
+        rc = KFileMakeNullUpdate(&fnull);
+        if (rc == 0) {
+            KMD5SumFmt* fmt = NULL;
+            rc = KMD5SumFmtMakeUpdate(&fmt, fnull);
+            if (rc == 0) {
+                const KFile* md5 = NULL;
+                rc = KFileMakeNewMD5Read(&md5, kf, fmt, path);
+                if (rc == 0) {
+                    uint64_t ps = 0;
+                    char buffer[512];
+                    size_t read = 0;
+                    do {
+                        rc = KFileRead(md5, ps, buffer, sizeof buffer, &read);
+                        if (rc == 0)
+                        {   ps += read; }
+                    } while (rc == 0 && read > 0);
+                    if (rc == 0) {
+                        bool bin;
+                        rc = KMD5SumFmtFind(fmt, path, digest, &bin);
+                    }
+                }
+                RELEASE(KFile, md5);
+            }
+            RELEASE(KMD5SumFmt, fmt);
+        }
+/*      RELEASE(KFile, fnull); fnull is released by KMD5SumFmt* fmt */
+    }
+/*  RELEASE(KFile, kf); kf is released by KFile* md5 */
+    return rc;
+}
+
+static
+rc_t ReportAlias(const ReportFuncs *f, uint32_t indent, const char* alias, const KDirectory* dir)
+{
+    char resolved[PATH_MAX + 1];
+    rc_t rc
+        = KDirectoryResolveAlias(dir, false, resolved, sizeof resolved, "%s", alias);
+    if (rc == 0) {
+        const char tag[] = "Alias";
+        uint32_t type = KDirectoryPathType(dir, "%s", resolved);
+        if (type & kptAlias) {
+            reportOpen(indent, tag, 1, "resolved", 's', resolved);
+            rc = ReportAlias(f, indent + 1, resolved, dir);
+            reportClose(indent, tag);
+        }
+        else
+        {   report(indent, tag, 1, "resolved", 's', resolved); }
+    }
+    return rc;
+}
+
+static rc_t ReportBinary(const ReportFuncs *f, uint32_t indent, const char* argv0) {
+    rc_t rc = 0;
+    KDyld *dyld = NULL;
+    assert(argv0);
+    rc = KDyldMake(&dyld);
+    if (rc != 0) {
+        reportError(indent + 1, rc, "KDyldMake");
+    }
+    else {
+        const KDirectory* dir = NULL;
+        rc = KDyldHomeDirectory(dyld, &dir, (fptr_t) ReportFinalize);
+        if (rc != 0) {
+            reportError(indent + 1, rc, "KDyldHomeDirectory");
+        }
+        else {
+            char binary[PATH_MAX + 1];
+            const char* name = strpbrk(argv0, "/\\");
+            const char* last_name = name;
+            if (last_name)
+            {   ++last_name; }
+            while (name) {
+                name = strpbrk(last_name, "/\\");
+                if (name) {
+                    last_name = name;
+                    if (last_name)
+                    {   ++last_name; }
+                }
+            }
+            name = last_name ? last_name : argv0;
+            rc = KDirectoryResolvePath(dir, true,
+                binary, sizeof binary, "%s", name);
+#if defined(WINDOWS)
+            if (rc == 0) {
+                if (KDirectoryPathType(dir, "%s", binary) == kptNotFound) {
+                    const char ext[] = ".exe";
+                    size_t s = string_size(name);
+                    if (s > sizeof ext - 1 &&
+                        strcmp(name + s - sizeof ext, ext) != 0)
+                    {
+                        rc = KDirectoryResolvePath(dir, true,
+                            binary, sizeof binary, "%s%s", name, ext);
+                    }
+                }
+            }
+#endif
+            if (rc != 0) {
+                reportErrorStr(indent + 1, rc, "KDirectoryResolvePath",
+                    "origin", "KDyldHomeDirectory");
+            }
+            else {
+                bool found = false;
+                const char tag[] = "Binary";
+                const char* sType = NULL;
+                uint8_t digest[16];
+                uint32_t type = KDirectoryPathType(dir, "%s", binary);
+                switch (type & ~kptAlias) {
+                    case kptFile:
+                        sType = type & kptAlias ? "alias" : "file";
+                        found = true;
+                        break;
+                    case kptNotFound:
+                        sType = "not found";
+                        break;
+                    default:
+                        sType = "unknown";
+                        break;
+                }
+                if (found) {
+                    rc = md5(binary, digest, dir);
+                }
+                if (type & kptAlias) {
+                    if (found && rc == 0)  {
+                        reportOpen(indent, tag, 3, "path", 's', binary,
+                            "type", 's', sType, "md5", 'M', digest);
+                    }
+                    else {
+                        reportOpen(indent, tag, 2, "path", 's', binary,
+                            "type", 's', sType);
+                    }
+                    if (rc == 0 && type & kptAlias) {
+                        rc = ReportAlias(f, indent + 1, name, dir);
+                    }
+                    reportClose(indent, tag);
+                }
+                else {
+                    if (found && rc == 0)  {
+                        report(indent, tag, 3, "path", 's', binary,
+                            "type", 's', sType, "md5", 'M', digest);
+                    }
+                    else {
+                        report(indent, tag, 2, "path", 's', binary,
+                            "type", 's', sType);
+                    }
+                }
+            }
+        }
+        RELEASE(KDirectory, dir);
+    }
+    RELEASE(KDyld, dyld);
+    return rc;
+}
+
+static rc_t CC ReportSOFTWARE(const ReportFuncs *f, uint32_t indent, const char *argv_0, const char *date, ver_t tool_ver ) {
+    rc_t rc = 0;
+
+    Report* self = NULL;
+    ReportGet(&self);
+    assert(self);
+
+    reportOpen(indent, "SOFTWARE", 0);
+
+    if (self->mgr) {
+        uint32_t version = 0;
+        rc = VDBManagerVersion(self->mgr, &version);
+        if (rc != 0) {
+            reportOpen(indent + 1, "Library", 0);
+            reportError(indent + 2, rc, "VDBManagerVersion");
+            reportClose(indent + 1, "Library");
+        }
+        else { report(indent + 1, "VDBLibrary", 1, "vers", 'V', version); }
+    }
+
+    {
+        rc_t rc2 = ReportBuild(f, indent + 1, self->mgr);
+        if (rc == 0 && rc2 != 0)
+        {   rc = rc2; }
+    }
+
+    if (argv_0) {
+        const char tag[] = "Tool";
+        reportOpen(indent + 1, tag, 3, "date", 's', date,
+                   "name", 's', argv_0, "vers", 'V', tool_ver);
+        {
+            rc_t rc2 = ReportBinary(f, indent + 2, argv_0);
+            if (rc == 0 && rc2 != 0)
+            {   rc = rc2; }
+        }
+        reportClose(indent + 1, tag);
+    }
+
+    reportClose(indent, "SOFTWARE");
+
+    return rc;
+}
+
+
+
+/* SetVDBManager
+ *  remember the manager in use
+ */
+LIB_EXPORT rc_t CC ReportSetVDBManager(const VDBManager *mgr) {
+    rc_t rc = 0;
+
+    Report* self = NULL;
+    ReportGet(&self);
+    if ( self != NULL )
+    {
+        rc = VDBManagerAddRef ( mgr );
+        if ( rc == 0 )
+        {
+            rc = VDBManagerRelease ( self -> mgr );
+            if ( rc != 0 )
+                VDBManagerRelease ( mgr );
+            else
+                self -> mgr = mgr;
+        }
+    }
+    return rc;
+}
+
+
+/* SetDatabase
+ *  call it if you work with Database
+ *
+ *  "path" [ IN ] - path to the database that is used to access it
+ */
+LIB_EXPORT rc_t CC ReportResetDatabase ( const char *path, const VDatabase *db )
+{
+    rc_t rc = 0;
+
+    Report* self = NULL;
+    ReportGet(&self);
+    if ( self != NULL )
+    {
+        rc = VDatabaseAddRef ( db );
+        if ( rc == 0 )
+        {
+            VTableRelease ( self -> table ), self -> table = NULL;
+            VDatabaseRelease ( self -> db );
+            self -> db = db;
+        }
+    }
+
+    return rc;
+}
+
+
+/* SetTable
+ *  call it if you work with Table
+ *
+ *  "path" [ IN ] - path to the table that is used to access it
+ */
+LIB_EXPORT rc_t CC ReportResetTable ( const char *path, const VTable *tbl )
+{
+    rc_t rc = 0;
+
+    Report* self = NULL;
+    ReportGet(&self);
+    if ( self != NULL )
+    {
+        rc = VTableAddRef ( tbl );
+        if ( rc == 0 )
+        {
+            VDatabaseRelease ( self -> db ), self -> db = NULL;
+            VTableRelease ( self -> table );
+            self -> table = tbl;
+        }
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/row-id.c b/libs/vdb/row-id.c
new file mode 100644
index 0000000..a5996f2
--- /dev/null
+++ b/libs/vdb/row-id.c
@@ -0,0 +1,64 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+#include "xform-priv.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+
+static
+rc_t CC row_id_func ( void *self, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData in [] )
+{
+    assert ( rslt -> data -> elem_bits == 64 );
+    if ( rslt -> data -> elem_count == 0 )
+    {
+        rc_t rc = KDataBufferResize ( rslt -> data, 1 );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    * ( int64_t* ) rslt -> data -> base = row_id;
+    rslt -> elem_count = 1;
+
+    return 0;
+}
+
+VTRANSFACT_BUILTIN_IMPL ( vdb_row_id, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> variant = vftNonDetRow;
+    rslt -> u . ndf = row_id_func;
+    return 0;
+}
diff --git a/libs/vdb/row-len.c b/libs/vdb/row-len.c
new file mode 100644
index 0000000..e2a6484
--- /dev/null
+++ b/libs/vdb/row-len.c
@@ -0,0 +1,65 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+#include "xform-priv.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+
+static
+rc_t CC row_len_func ( void *self, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData in[] )
+{
+    assert ( rslt -> data -> elem_bits == 32 );
+    if ( rslt -> data -> elem_count == 0 )
+    {
+        rc_t rc = KDataBufferResize ( rslt -> data, 1 );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* for the moment row length are 32-bit */
+    * ( uint32_t* ) rslt -> data -> base = (uint32_t)in [ 0 ] . u . data . elem_count;
+    rslt -> elem_count = 1;
+
+    return 0;
+}
+
+VTRANSFACT_BUILTIN_IMPL ( vdb_row_len, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> variant = vftRow;
+    rslt -> u . rf = row_len_func;
+    return 0;
+}
diff --git a/libs/vdb/schema-db.c b/libs/vdb/schema-db.c
new file mode 100644
index 0000000..2301841
--- /dev/null
+++ b/libs/vdb/schema-db.c
@@ -0,0 +1,752 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "schema-dump.h"
+#include "dbmgr-priv.h"
+
+#include <klib/symbol.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * STblMember
+ *  table member
+ */
+
+/* Mark
+ */
+static
+void CC STblMemberMark ( void * item, void * data )
+{
+    const STblMember * self = item;
+    if ( item != NULL )
+        STableMark ( ( void * )self -> tbl, data );
+}
+
+/* Dump
+ */
+bool CC STblMemberDefDump ( void *item, void *dumper )
+{
+    SDumper *b = dumper;
+    STblMember *self = item;
+
+    b -> rc = SDumperPrint ( b, "\ttable " );
+    if ( b -> rc == 0 )
+        b -> rc = STableDump ( self -> tbl, b );
+    if ( b -> rc == 0 )
+        b -> rc = SDumperPrint ( b, " %N;\n", self -> name );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+rc_t STblMemberDump ( const STblMember *self, SDumper *d )
+{
+    return FQNDump ( self != NULL ? self -> name : NULL, d );
+}
+
+
+/*--------------------------------------------------------------------------
+ * SDBMember
+ *  sub-db member
+ */
+
+/* Find
+ */
+SDBMember * CC SDatabaseFindDB ( const SDatabase *self, const char *name );
+
+/* Mark
+ */
+static
+void CC SDBMemberMark ( void * item, void * data )
+{
+    const SDBMember * self = item;
+    if ( self != NULL )
+        SDatabaseMark ( ( void * )self -> db, data );
+}
+
+/* Dump
+ */
+bool CC SDBMemberDefDump ( void *item, void *dumper )
+{
+    SDumper *b = dumper;
+    SDBMember *self = item;
+
+    b -> rc = SDumperPrint ( b, "\tdatabase " );
+    if ( b -> rc == 0 )
+        b -> rc = SDatabaseDump ( self -> db, b );
+    if ( b -> rc == 0 )
+        b -> rc = SDumperPrint ( b, " %N;\n", self -> name );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+rc_t SDBMemberDump ( const SDBMember *self, SDumper *d )
+{
+    return FQNDump ( self != NULL ? self -> name : NULL, d );
+}
+
+
+/*--------------------------------------------------------------------------
+ * SDatabase
+ *  database declaration
+ */
+
+#if SLVL >= 6
+
+/* Whack
+ */
+void CC SDatabaseWhack ( void *item, void *ignore )
+{
+    SDatabase *self = item;
+
+    BSTreeWhack ( & self -> scope, KSymbolWhack, NULL );
+    VectorWhack ( & self -> db, SDBMemberWhack, NULL );
+    VectorWhack ( & self -> tbl, STblMemberWhack, NULL );
+
+    free ( self );
+}
+
+/* Cmp
+ * Sort
+ */
+int64_t CC SDatabaseCmp ( const void *item, const void *n )
+{
+    const uint32_t *a = item;
+    const SDatabase *b = n;
+
+    if ( * a > b -> version )
+        return 1;
+    return ( int64_t ) ( * a >> 24 ) - ( int64_t ) ( b -> version >> 24 );
+}
+
+int64_t CC SDatabaseSort ( const void *item, const void *n )
+{
+    const SDatabase *a = item;
+    const SDatabase *b = n;
+
+    return ( int64_t ) ( a -> version >> 24 ) - ( int64_t ) ( b -> version >> 24 );
+}
+
+static
+rc_t SDatabaseCompare ( const SDatabase *a, const SDatabase *b, const SDatabase **newer, bool exhaustive )
+{
+    assert ( ( a -> version >> 24 ) == ( b -> version >> 24 ) );
+
+    * newer = a -> version >= b -> version ? a : b;
+
+    /* TBD - more exhaustive comparison */
+
+    return 0;
+}
+
+/* Find
+ *  generic object find within database scope
+ *
+ *  "name" [ OUT ] - returns list of overloaded objects if found
+ *
+ *  "type" [ OUT ] - returns object type id, e.g.:
+ *    eDatatype, eTypeset, eFormat, eFunction, ePhysical, eTable, ...
+ *
+ *  "expr" [ IN ] - NUL terminated name expression identifying object
+ *
+ *  "ctx" [ IN ] - NUL terminated context string for evaluation,
+ *  substitutes for filename in logging reports
+ *
+ *  returns principal object identified. if NULL but "name" is not
+ *  NULL, then the object was only partially identified.
+ */
+const void * SDatabaseFind ( const SDatabase *self,
+    const VSchema *schema, const SNameOverload **name,
+    uint32_t *type, const char *expr, const char *ctx )
+{
+    rc_t rc;
+    KSymTable tbl;
+
+    /* initialize to not-found */
+    const void *obj = NULL;
+    * name = NULL;
+    * type = 0;
+
+    /* build a symbol table for database */
+    rc = init_db_symtab ( & tbl, schema, self );
+    if ( rc == 0 )
+    {
+        obj = resolve_object ( & tbl, schema, NULL, name, type, expr, ctx, false );
+        KSymTableWhack ( & tbl );
+    }
+
+    return obj;
+}
+
+/* Extend
+ */
+static
+void CC VectorTranslate ( Vector *v, const Vector *dad )
+{
+    uint32_t block = VectorBlock ( v );
+    uint32_t start = VectorStart ( dad ) + VectorLength ( dad );
+    VectorInit ( v, start, block );
+}
+
+static
+rc_t CC SDatabaseExtend ( SDatabase *self, const SDatabase *dad )
+{
+    self -> dad = dad;
+    VectorTranslate ( & self -> db, & dad -> db );
+    VectorTranslate ( & self -> tbl, & dad -> tbl );
+    return 0;
+}
+
+/* Mark
+ */
+void CC SDatabaseClearMark ( void *item, void *ignore )
+{
+    SDatabase *self = item;
+    self -> marked = false;
+}
+
+
+void CC SDatabaseMark ( void * item, void * data )
+{
+    SDatabase * self = item;
+    if ( self != NULL && ! self -> marked )
+    {
+        self -> marked = true;
+        VectorForEach ( & self -> db, false, SDBMemberMark, data );
+        VectorForEach ( & self -> tbl, false, STblMemberMark, data );
+        SDatabaseMark ( ( void * )self -> dad, data );
+    }
+}
+
+void CC SDatabaseNameMark ( const SNameOverload *self, const VSchema *schema )
+{
+    if ( self != NULL )
+    {
+        VectorForEach ( & self -> items, false, SDatabaseMark, ( void* ) schema );
+    }
+}
+
+/* Dump
+ *  dump "database" { }
+ */
+rc_t SDatabaseDump ( const SDatabase *self, struct SDumper *d )
+{
+    d -> rc = FQNDump ( self != NULL ? self -> name : NULL, d );
+    if ( d -> rc == 0 && self != NULL )
+        d -> rc = SDumperVersion ( d, self -> version );
+    return d -> rc;
+}
+
+bool CC SDatabaseDefDump ( void *item, void *data )
+{
+    SDumper *b = data;
+    const SDatabase *self = ( const void* ) item;
+
+    if ( SDumperMarkedMode ( b ) && ! self -> marked )
+        return false;
+
+    b -> rc = SDumperPrint ( b, "\tdatabase %N", self -> name );
+
+    if ( b -> rc == 0 )
+        b -> rc = SDumperVersion ( b, self -> version );
+
+    /* TBD - need to overhaul inheritance of databases */
+    if ( b -> rc == 0 && self -> dad != NULL )
+        b -> rc = SDumperPrint ( b, "= %N", self -> dad -> name );
+
+    if ( b -> rc == 0 )
+        b -> rc = SDumperPrint ( b, "\n\t{\n" );
+
+    SDumperIncIndentLevel ( b );
+
+    if ( b -> rc == 0 )
+        VectorDoUntil ( & self -> tbl, false, STblMemberDefDump, b );
+
+    if ( b -> rc == 0 )
+        VectorDoUntil ( & self -> db, false, SDBMemberDefDump, b );
+
+    SDumperDecIndentLevel ( b );
+
+    if ( b -> rc == 0 )
+        b -> rc = SDumperPrint ( b, "\t}\n" );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+#endif
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ */
+
+#if SLVL >= 6
+
+static
+rc_t CC db_dbmbr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SDBMember *m )
+{
+    rc_t rc ;
+    const SNameOverload *name;
+
+    /* look for database typename */
+    rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return KTokenFailure ( t, klogErr, rc, "database typename" );
+    if ( t -> id != eDatabase )
+        return KTokenExpected ( t, klogErr, "database typename" );
+    name = t -> sym -> u . obj;
+    if ( name == NULL )
+    {
+        /* the database is declared but not defined: must be recursive */
+        return KTokenExpected ( t, klogErr, "database declared but not defined" );
+    }
+
+    /* look for version */
+    if ( next_token ( tbl, src, t ) -> id != eHash )
+        m -> db = VectorLast ( & name -> items );
+    else
+    {
+        uint32_t vers;
+        next_token ( tbl, src, t );
+        rc = maj_min_rel ( tbl, src, t, env, self, & vers, true );
+        if ( rc != 0 )
+            return rc;
+        m -> db = VectorFind ( & name -> items, & vers, NULL, SDatabaseCmp );
+    }
+    if ( m -> db == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcDatabase, rcNotFound );
+        return KTokenRCExplain ( t, klogErr, rc );
+    }
+
+    /* get member name */
+    if ( t -> sym != NULL )
+    {
+        KTokenSourceReturn ( src, t );
+        next_shallow_token ( tbl, src, t, true );
+    }
+
+    /* looking for undefined identifier */
+    if ( t -> id == eIdent )
+    {
+        rc = KSymTableCreateConstSymbol ( tbl, & m -> name, & t -> str, eDBMember, m );
+        if ( rc != 0 )
+            return KTokenRCExplain ( t, klogInt, rc );
+    }
+    else
+    {
+        if ( t -> id == eDBMember )
+            return KTokenExpected ( t, klogErr, "undefined database member name" );
+        if ( t -> id != eForward && t -> id != eVirtual )
+            return KTokenExpected ( t, klogErr, "database member name" );
+
+        m -> name = t -> sym;
+        ( ( KSymbol* ) t -> sym ) -> u . obj = m;
+        ( ( KSymbol* ) t -> sym ) -> type = eDBMember;
+    }
+
+    /* expect we're done */
+    return expect ( tbl, src, next_token ( tbl, src, t ), eSemiColon, ";", true );
+}
+
+static
+rc_t CC database_dbmbr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SDatabase *db, bool tmpl )
+{
+    rc_t rc;
+    SDBMember *m = malloc ( sizeof * m );
+    if ( m == NULL )
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+    else
+    {
+        memset ( m, 0, sizeof * m );
+        m -> tmpl = tmpl;
+
+        rc = db_dbmbr ( tbl, src, t, env, self, m );
+        if ( rc == 0 )
+        {
+            rc = VectorAppend ( & db -> db, & m -> cid . id, m );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        SDBMemberWhack ( m, NULL );
+    }
+    return rc;
+}
+
+static
+rc_t CC db_tblmbr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, STblMember *m )
+{
+    rc_t rc ;
+    const SNameOverload *name;
+
+    /* look for table typename */
+    rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return KTokenFailure ( t, klogErr, rc, "table typename" );
+    if ( t -> id != eTable )
+        return KTokenExpected ( t, klogErr, "table typename" );
+    name = t -> sym -> u . obj;
+
+    /* look for version */
+    if ( next_token ( tbl, src, t ) -> id != eHash )
+        m -> tbl = VectorLast ( & name -> items );
+    else
+    {
+        uint32_t vers;
+        next_token ( tbl, src, t );
+        rc = maj_min_rel ( tbl, src, t, env, self, & vers, true );
+        if ( rc != 0 )
+            return rc;
+        m -> tbl = VectorFind ( & name -> items, & vers, NULL, STableCmp );
+    }
+    if ( m -> tbl == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcTable, rcNotFound );
+        return KTokenRCExplain ( t, klogErr, rc );
+    }
+
+    /* get member name */
+    if ( t -> sym != NULL )
+    {
+        KTokenSourceReturn ( src, t );
+        next_shallow_token ( tbl, src, t, true );
+    }
+
+    /* looking for undefined identifier */
+    if ( t -> id == eIdent )
+    {
+        rc = KSymTableCreateConstSymbol ( tbl, & m -> name, & t -> str, eTblMember, m );
+        if ( rc != 0 )
+            return KTokenRCExplain ( t, klogInt, rc );
+    }
+    else
+    {
+        if ( t -> id == eTblMember )
+            return KTokenExpected ( t, klogErr, "undefined table member name" );
+        if ( t -> id != eForward && t -> id != eVirtual )
+            return KTokenExpected ( t, klogErr, "table member name" );
+
+        m -> name = t -> sym;
+        ( ( KSymbol* ) t -> sym ) -> u . obj = m;
+        ( ( KSymbol* ) t -> sym ) -> type = eTblMember;
+    }
+
+    /* expect we're done */
+    return expect ( tbl, src, next_token ( tbl, src, t ), eSemiColon, ";", true );
+}
+
+static
+rc_t CC database_tblmbr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SDatabase *db, bool tmpl )
+{
+    rc_t rc;
+    STblMember *m = malloc ( sizeof * m );
+    if ( m == NULL )
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+    else
+    {
+        memset ( m, 0, sizeof * m );
+        m -> tmpl = tmpl;
+
+        rc = db_tblmbr ( tbl, src, t, env, self, m );
+        if ( rc == 0 )
+        {
+            rc = VectorAppend ( & db -> tbl, & m -> cid . id, m );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        STblMemberWhack ( m, NULL );
+    }
+    return rc;
+}
+
+/*
+ * database-body      = '{' [ <database-mbrs> ] '}'
+ * database-mbrs      = [ 'template' ] <database-mbr> [ <database-mbrs> ]
+ * database-mbr       = 'database' <db-mbr>
+ *                    | 'table' <table-mbr>
+ *                    | ';'
+ */
+static
+rc_t CC database_mbr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SDatabase *db )
+{
+    bool tmpl = false;
+
+    switch ( t -> id )
+    {
+    case  kw_template:
+        tmpl = true;
+        next_token ( tbl, src, t );
+        break;
+    case eSemiColon:
+        next_token ( tbl, src, t );
+        return 0;
+    }
+
+    switch ( t -> id )
+    {
+    case kw_database:
+        return database_dbmbr ( tbl, src,
+            next_token ( tbl, src, t ), env, self, db, tmpl );
+    case kw_table:
+        return database_tblmbr ( tbl, src,
+            next_token ( tbl, src, t ), env, self, db, tmpl );
+    }
+
+    return KTokenExpected ( t, klogErr, "table or database" );
+}
+
+static
+rc_t CC database_body ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SDatabase *db )
+{
+    rc_t rc = expect ( tbl, src, t, eLeftCurly, "{", true );
+    if ( rc != 0 )
+        return rc;
+
+    while ( t -> id != eRightCurly )
+    {
+        rc = database_mbr ( tbl, src, t, env, self, db );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    return expect ( tbl, src, t, eRightCurly, "}", true );
+}
+
+
+/*
+ * push-db-scope
+ * pop-db-scope
+ */
+rc_t push_db_scope ( KSymTable *tbl, const SDatabase *db )
+{
+    if ( db -> dad != NULL )
+    {
+        rc_t rc = push_db_scope ( tbl, db -> dad );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    return KSymTablePushScope ( tbl, ( BSTree* ) & db -> scope );
+}
+
+void pop_db_scope ( KSymTable *tbl, const SDatabase *db )
+{
+    while ( db != NULL )
+    {
+        KSymTablePopScope ( tbl );
+        db = db -> dad;
+    }
+}
+
+/*
+ * init-db-symtab
+ *  initializes "tbl"
+ *  places db in scope
+ *  must be balanced by KSymTableWhack
+ */
+rc_t init_db_symtab ( KSymTable *tbl, const VSchema *schema, const SDatabase *db )
+{
+    rc_t rc = init_symtab ( tbl, schema );
+    if ( rc == 0 )
+    {
+        rc = push_db_scope ( tbl, db );
+        if ( rc == 0 )
+            return 0;
+
+        KSymTableWhack ( tbl );
+    }
+
+    return rc;
+}
+
+
+/*
+ * database-decl      = 'database' <fqn> '#' <maj-min-rel>
+ *                      [ '=' <database-name> ] <database-body>
+ * database-body      = '{' [ <database-mbrs> ] '}'
+ * database-mbrs      = <database-mbr> [ <database-mbrs> ]
+ */
+static
+rc_t database_decl ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SDatabase *db )
+{
+    /* db name */
+    rc_t rc = create_fqn ( tbl, src, t, env, eDatabase, NULL );
+    if ( rc != 0 && GetRCState ( rc ) != rcExists )
+        return KTokenFailure ( t, klogErr, rc, "database name" );
+    db -> name = t -> sym;
+
+    /* database version */
+    if ( next_token ( tbl, src, t ) -> id != eHash )
+        return KTokenExpected ( t, klogErr, "#" );
+    next_token ( tbl, src, t );
+    rc = maj_min_rel ( tbl, src, t, env, self, & db -> version, true );
+    if ( rc != 0 )
+        return rc;
+
+    /* prepare vectors */
+    VectorInit ( & db -> db, 0, 8 );
+    VectorInit ( & db -> tbl, 0, 8 );
+
+    /* look for inheritance */
+    if ( t -> id == eAssign )
+    {
+        const SDatabase *dad;
+        const SNameOverload *pname;
+
+        /* look for dad */
+        rc = next_fqn ( tbl, src, next_token ( tbl, src, t ), env );
+        if ( rc != 0 )
+            return KTokenFailure ( t, klogErr, rc, "database name" );
+
+        /* insist that dad be a database */
+        if ( t -> id != eDatabase )
+            return KTokenExpected ( t, klogErr, "database name" );
+        pname = t -> sym -> u . obj;
+
+        /* check for version */
+        if ( next_token ( tbl, src, t ) -> id != eHash )
+            dad = VectorLast ( & pname -> items );
+        else
+        {
+            uint32_t pvers;
+            next_token ( tbl, src, t );
+            rc = maj_min_rel ( tbl, src, t, env, self, & pvers, true );
+            if ( rc != 0 )
+                return rc;
+            dad = VectorFind ( & pname -> items, & pvers, NULL, SDatabaseCmp );
+        }
+
+        /* dad should be found */
+        if ( dad == NULL )
+        {
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcDatabase, rcNotFound );
+            return KTokenRCExplain ( t, klogErr, rc );
+        }
+
+        /* take the inheritance */
+        rc = SDatabaseExtend ( db, dad );
+        if ( rc != 0 )
+            return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    /* enter database into scope */
+    rc = push_db_scope ( tbl, db );
+    if ( rc == 0 )
+    {
+        /* parse the definition */
+        rc = database_body ( tbl, src, t, env, self, db );
+
+        /* pop out of scope */
+        pop_db_scope ( tbl, db );
+    }
+
+    return rc;
+}
+
+rc_t database_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    rc_t rc;
+    void *ignore;
+
+    SDatabase *db = malloc ( sizeof * db );
+    if ( db == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    memset ( db, 0, sizeof * db );
+    rc = database_decl ( tbl, src, t, env, self, db );
+    if ( rc == 0 )
+    {
+        SNameOverload *name = ( void* ) db -> name -> u . obj;
+        if ( name == NULL )
+        {
+            rc = SNameOverloadMake ( & name, db -> name, 0, 4 );
+            if ( rc == 0 )
+            {
+                rc = VectorAppend ( & self -> dname, & name -> cid . id, name );
+                if ( rc != 0 )
+                    SNameOverloadWhack ( name, NULL );
+            }
+        }
+
+        if ( rc == 0 )
+        {
+            rc = VectorAppend ( & self -> db, & db -> id, db );
+            if ( rc == 0 )
+            {
+                uint32_t idx;
+                rc = VectorInsertUnique ( & name -> items, db, & idx, SDatabaseSort );
+                if ( rc == 0 )
+                    return rc;
+
+                if ( GetRCState ( rc ) == rcExists )
+                {
+                    const SDatabase *newer;
+                    SDatabase *exist = VectorGet ( & name -> items, idx );
+                    rc = SDatabaseCompare ( exist, db, & newer, false );
+                    if ( rc == 0 && newer == db )
+                    {
+                        VectorSwap ( & name -> items, idx, db, & ignore );
+                        /* TBD - need to update parent/child relationships */
+                        return 0;
+                    }
+                }
+
+                VectorSwap ( & self -> db, db -> id, NULL, & ignore );
+            }
+        }
+    }
+    else if ( GetRCState ( rc ) == rcExists )
+    {
+        rc = 0;
+    }
+
+    SDatabaseWhack ( db, NULL );
+
+    return rc;
+}
+
+#endif
diff --git a/libs/vdb/schema-dump.c b/libs/vdb/schema-dump.c
new file mode 100644
index 0000000..217014b
--- /dev/null
+++ b/libs/vdb/schema-dump.c
@@ -0,0 +1,683 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "schema-dump.h"
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "schema-expr.h"
+
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * SDumper
+ */
+
+
+/* Init
+ *  sets up block
+ */
+void SDumperInit ( SDumper *self, const VSchema *schema, uint32_t mode,
+    rc_t ( CC * flush ) ( void *fd, const void *buffer, size_t size ), void *fd )
+{
+    self -> schema = schema;
+    self -> flush = flush;
+    self -> fd = fd;
+    self -> sep = "";
+    self -> rc = 0;
+    self -> indent = 0;
+    self -> mode = ( uint16_t ) mode;
+    self -> total = 0;
+}
+
+
+/* Flush
+ */
+static
+rc_t SDumperFlush ( SDumper *self )
+{
+    rc_t rc = ( * self -> flush ) ( self -> fd, self -> buffer, self -> total );
+    if ( rc == 0 )
+        self -> total = 0;
+    return rc;
+}
+
+static
+rc_t SDumperFlushLine ( SDumper *self )
+{
+#if ! _DEBUGGING
+    if ( self -> total < sizeof self -> buffer / 2 )
+        return 0;
+#endif
+    return SDumperFlush ( self );
+}
+
+
+/* Whack
+ *  flushes buffer if necessary
+ */
+rc_t SDumperWhack ( SDumper *self )
+{
+    if ( self -> rc == 0 && self -> total != 0 )
+        return SDumperFlush ( self );
+    return 0;
+}
+
+
+/* Write
+ *  writes data to buffer, flushes as necessary
+ */
+rc_t SDumperWrite ( SDumper *self, const char *buffer, size_t size )
+{
+    rc_t rc;
+    size_t total, num_writ;
+
+    for ( rc = 0, total = 0; total < size; total += num_writ )
+    {
+        if ( self -> total == sizeof self -> buffer )
+        {
+            rc = SDumperFlush ( self );
+            if ( rc != 0 )
+                break;
+        }
+
+        num_writ = size - total;
+        if ( num_writ > sizeof self -> buffer - self -> total )
+            num_writ = sizeof self -> buffer - self -> total;
+
+        memmove ( & self -> buffer [ self -> total ], & buffer [ total ], num_writ );
+        self -> total += num_writ;
+    }
+
+    return rc;
+}
+
+/* IndentLevel
+ *  increase or decrease indentation level
+ */
+void SDumperIncIndentLevel ( SDumper *self )
+{
+    ++ self -> indent;
+}
+
+void SDumperDecIndentLevel ( SDumper *self )
+{
+    if ( self -> indent > 0 )
+        -- self -> indent;
+}
+
+
+/* Indent
+ *  writes indentation spacing
+ */
+rc_t SDumperIndent ( SDumper *self )
+{
+    rc_t rc;
+    uint32_t total, num_writ;
+
+    /* use a tab */
+    const char *tabs = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
+
+    for ( rc = 0, total = 0; total < self -> indent; total += num_writ )
+    {
+        num_writ = ( ( self -> indent - total - 1 ) & 0xF ) + 1;
+        rc = SDumperWrite ( self, tabs, num_writ );
+        if ( rc != 0 )
+            break;
+    }
+
+    return rc;
+}
+
+/* SepString
+ *  sets separator string
+ */
+void SDumperSepString ( SDumper *self, const char *sep )
+{
+    self -> sep = sep;
+}
+
+/* Sep
+ *  write separator string
+ */
+rc_t SDumperSep ( SDumper *self )
+{
+    if ( self -> sep == NULL )
+        return 0;
+
+    return SDumperWrite ( self, self -> sep, strlen ( self -> sep ) );
+}
+
+/* Print
+ *  \t   - indent
+ *  \n   - end of line
+ *  \v   - separator
+ *  %d   - int
+ *  %u   - unsigned int
+ *  %x   - unsigned int ( lower-case )
+ *  %X   - unsigned int ( UPPER-case )
+ *  %f   - double
+ *  %ld  - int64_t
+ *  %lu  - uint64_t
+ *  %lx  - uint64_t ( lower-case )
+ *  %lX  - uint64_t ( UPPER-case )
+ *  %p   - pointer ( UPPER-case )
+ *  %z   - size_t ( decimal )
+ *  %s   - const char* ( NUL-terminated )
+ *  %.*s - int, const char*
+ *  %S   - const String*
+ *  %N   - const KSymbol*
+ *  %T   - const VTypedecl*
+ *  %F   - const VFormatdecl*
+ *  %V   - uint32_t version
+ *  %E   - const SExpression*
+ */
+rc_t SDumperVPrint ( SDumper *self, const char *fmt, va_list args )
+{
+    rc_t rc;
+    const char *start, *end;
+    for ( rc = 0, start = end = fmt; * end != 0; ++ end )
+    {
+        int len;
+        size_t size;
+        char buffer [ 256 ];
+
+        switch ( * end )
+        {
+        case '\t':
+            if ( end > start )
+                rc = SDumperWrite ( self, start, end - start );
+            if ( rc == 0 )
+                rc = SDumperIndent ( self );
+            start = end + 1;
+            break;
+        case '\n':
+            rc = SDumperWrite ( self, start, end - start + 1 );
+            if ( rc == 0 )
+                rc = SDumperFlushLine ( self );
+            start = end + 1;
+            break;
+        case '\v':
+            if ( end > start )
+                rc = SDumperWrite ( self, start, end - start );
+            if ( rc == 0 )
+                rc = SDumperSep ( self );
+            start = end + 1;
+            break;
+        case '%':
+            if ( end > start )
+            {
+                rc = SDumperWrite ( self, start, end - start );
+                if ( rc != 0 )
+                    break;
+            }
+            switch ( * ( ++ end ) )
+            {
+            case 'd':
+                len = sprintf ( buffer, "%d", va_arg ( args, int ) );
+                rc = SDumperWrite ( self, buffer, len );
+                break;
+            case 'u':
+                len = sprintf ( buffer, "%u", va_arg ( args, unsigned int ) );
+                rc = SDumperWrite ( self, buffer, len );
+                break;
+            case 'x':
+                len = sprintf ( buffer, "%x", va_arg ( args, unsigned int ) );
+                rc = SDumperWrite ( self, buffer, len );
+                break;
+            case 'X':
+                len = sprintf ( buffer, "%X", va_arg ( args, unsigned int ) );
+                rc = SDumperWrite ( self, buffer, len );
+                break;
+            case 'f':
+                len = sprintf ( buffer, "%f", va_arg ( args, double ) );
+                rc = SDumperWrite ( self, buffer, len );
+                break;
+            case 'l':
+                switch ( * ( ++ end ) )
+                {
+                case 'd':
+                    rc = string_printf ( buffer, sizeof buffer, & size, "%ld", va_arg ( args, int64_t ) );
+                    if ( rc == 0 )
+                        rc = SDumperWrite ( self, buffer, size );
+                    break;
+                case 'u':
+                    rc = string_printf ( buffer, sizeof buffer, & size, "%lu", va_arg ( args, uint64_t ) );
+                    if ( rc == 0 )
+                        rc = SDumperWrite ( self, buffer, size );
+                    break;
+                case 'x':
+                    rc = string_printf ( buffer, sizeof buffer, & size, "%lx", va_arg ( args, uint64_t ) );
+                    if ( rc == 0 )
+                        rc = SDumperWrite ( self, buffer, size );
+                    break;
+                case 'X':
+                    rc = string_printf ( buffer, sizeof buffer, & size, "%lX", va_arg ( args, uint64_t ) );
+                    if ( rc == 0 )
+                        rc = SDumperWrite ( self, buffer, size );
+                    break;
+                }
+                break;
+            case 'p':
+                rc = string_printf ( buffer, sizeof buffer, & size, "0x%p", va_arg ( args, size_t ) );
+                if ( rc == 0 )
+                    rc = SDumperWrite ( self, buffer, size );
+                break;
+            case 'z':
+                rc = string_printf ( buffer, sizeof buffer, & size, "%zu", va_arg ( args, size_t ) );
+                if ( rc == 0 )
+                    rc = SDumperWrite ( self, buffer, size );
+                break;
+            case 's':
+                len = snprintf ( buffer, sizeof buffer, "%s", va_arg ( args, const char* ) );
+                if ( len < 0 || len >= sizeof buffer )
+                    rc = RC ( rcVDB, rcSchema, rcWriting, rcString, rcExcessive );
+                else
+                    rc = SDumperWrite ( self, buffer, len );
+                break;
+            case '.':
+                if ( end [ 1 ] == '*' && end [ 2 ] == 's' )
+                {
+                    end += 2;
+                    len = va_arg ( args, int );
+                    if ( len >= sizeof buffer )
+                        rc = RC ( rcVDB, rcSchema, rcWriting, rcString, rcExcessive );
+                    else
+                    {
+                        len = sprintf ( buffer, "%.*s", len, va_arg ( args, const char* ) );
+                        rc = SDumperWrite ( self, buffer, len );
+                    }
+                    break;
+                }
+                /* not handling anything else */
+                rc = SDumperWrite ( self, "%.", 2 );
+                break;
+            case 'S':
+                rc = StringDump ( va_arg ( args, const String* ), self );
+                break;
+            case 'N':
+                rc = FQNDump ( va_arg ( args, const KSymbol* ), self );
+                break;
+#if SLVL >= 1
+            case 'T':
+                rc = VTypedeclDump ( va_arg ( args, struct VTypedecl const* ), self );
+                break;
+            case 'F':
+                rc = VFormatdeclDump ( va_arg ( args, struct VFormatdecl const* ), self );
+                break;
+#endif
+#if SLVL >= 2
+            case 'E':
+                rc = SExpressionDump ( va_arg ( args, const SExpression* ) , self );
+                break;
+#endif
+            case 'V':
+                rc = SDumperVersion ( self, va_arg ( args, uint32_t ) );
+                break;
+            case '%':
+                rc = SDumperWrite ( self, "%", 1 );
+                break;
+            }
+            start = end + 1;
+            break;
+        }
+
+        if ( rc != 0 )
+            break;
+    }
+
+    if ( rc == 0 && end > start )
+    {
+        rc = SDumperWrite ( self, start, end - start );
+        if ( rc == 0 )
+            rc = SDumperFlushLine ( self );
+    }
+
+    return rc;
+}
+
+rc_t SDumperPrint ( SDumper *self, const char *fmt, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, fmt );
+    rc = SDumperVPrint ( self, fmt, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * various types
+ */
+
+/* Version
+ */
+rc_t SDumperVersion ( SDumper *self, uint32_t version )
+{
+    const char *fmt;
+
+    if ( ( version & 0xFFFF ) != 0 )
+        fmt =" #%u.%u.%u";
+    else if ( ( version & 0xFF0000 ) != 0 )
+        fmt =" #%u.%u";
+    else
+        fmt =" #%u";
+
+    switch ( SDumperMode ( self ) )
+    {
+    case sdmCompact:
+        ++ fmt;
+        break;
+    }
+
+    return SDumperPrint ( self, fmt,
+                          ( version >> 24 ),
+                          ( version >> 16 ) & 0xFF,
+                          ( version & 0xFFFF ) );
+}
+
+/* String
+ */
+rc_t StringDump ( const String *self, SDumper *b )
+{
+    return SDumperWrite ( b, self -> addr, self -> size );
+}
+
+/* KSymbol
+ */
+rc_t KSymbolDump ( const KSymbol *self, SDumper *b )
+{
+    if ( self == NULL )
+        return SDumperWrite ( b, "NULL", 4 );
+
+    return StringDump ( & self -> name, b );
+}
+
+/* FQN
+ *  writes fully qualified name in schema format
+ */
+rc_t FQNDump ( const KSymbol *self, SDumper *b )
+{
+    rc_t rc = 0;
+
+    if ( self != NULL && self -> dad != NULL )
+    {
+        rc = FQNDump ( self -> dad, b );
+        if ( rc == 0 )
+            rc = SDumperWrite ( b, ":", 1 );
+    }
+
+    if ( rc == 0 )
+        rc = KSymbolDump ( self, b );
+
+    return rc;
+}
+
+/* Alias
+ */
+LIB_EXPORT bool CC KSymbolDumpAlias ( void *item, void *data )
+{
+    SDumper *b = data;
+    const KSymbol *self = ( const KSymbol* ) item;
+    if ( self -> u . obj == b -> alias -> u . obj )
+    {
+        if ( SDumperMode ( b ) == sdmCompact )
+            b -> rc = SDumperPrint ( b, "alias %N %N;", b -> alias, self );
+        else
+            b -> rc = SDumperPrint ( b, "alias %N %N;\n", b -> alias, self );
+    }
+
+    return false;
+}
+
+rc_t AliasDump ( const KSymbol *self, SDumper *b )
+{
+    const VSchema *schema = b -> schema;
+    for ( b -> rc = 0, b -> alias = self; schema != NULL; schema = schema -> dad )
+    {
+        if ( VectorDoUntil ( & schema -> alias, false, KSymbolDumpAlias, b ) )
+            return b -> rc;
+    }
+    return 0;
+}
+
+/* VSchema
+ */
+static
+bool VSchemaDumpInt ( const VSchema *self, SDumper *b, int dump_class )
+{
+    /* never dump intrinsic schema */
+    if ( self -> dad == NULL )
+    {
+#if SLVL >= 1
+        if ( SDumperMode ( b ) == sdmCompact )
+            SDumperPrint ( b, "version 1;" );
+        else
+            SDumperPrint ( b, "version 1;\n" );
+#endif
+        return false;
+    }
+
+    /* always dump parent */
+    if ( VSchemaDumpInt ( self -> dad, b, dump_class ) )
+        return true;
+
+    /* dump self */
+#if SLVL >= 1
+    if ( ( dump_class == 0 || dump_class == sdcTypes ) &&
+         VectorDoUntil ( & self -> dt, false, SDatatypeDefDump, b ) )
+        return true;
+
+    if ( ( dump_class == 0 || dump_class == sdcTypesets ) &&
+         VectorDoUntil ( & self -> ts, false, STypesetDefDump, b ) )
+        return true;
+#endif
+    if ( ( dump_class == 0 || dump_class == sdcFormats ) &&
+         VectorDoUntil ( & self -> fmt, false, SFormatDefDump, b ) )
+        return true;
+#if SLVL >= 2
+    if ( ( dump_class == 0 || dump_class == sdcConstants ) &&
+         VectorDoUntil ( & self -> cnst, false, SConstantDefDump, b ) )
+        return true;
+#endif
+#if SLVL >= 3
+    if ( ( dump_class == 0 || dump_class == sdcFunctions ) &&
+         VectorDoUntil ( & self -> func, false, SFunctionDeclDump, b ) )
+        return true;
+#endif
+#if SLVL >= 5
+    if ( ( dump_class == 0 || dump_class == sdcColumns ) &&
+         VectorDoUntil ( & self -> phys, false, SPhysicalDefDump, b ) )
+        return true;
+#endif
+#if SLVL >= 6
+    if ( ( dump_class == 0 || dump_class == sdcTables ) &&
+         VectorDoUntil ( & self -> tbl, false, STableDefDump, b ) )
+        return true;
+    if ( ( dump_class == 0 || dump_class == sdcDatabases ) &&
+         VectorDoUntil ( & self -> db, false, SDatabaseDefDump, b ) )
+        return true;
+#endif
+    return false;
+}
+
+LIB_EXPORT rc_t CC VSchemaDump ( const VSchema *self, uint32_t mode, const char *decl,
+    rc_t ( CC * flush ) ( void *fd, const void *buffer, size_t bsize ), void *fd )
+{
+    rc_t rc;
+    bool failed;
+    int dump_class = ( mode >> 8 ) & 0x7F;
+
+    SDumper b;
+    SDumperInit ( & b, self, mode & 0x80FF, flush, fd );
+
+    if ( decl != NULL && decl [ 0 ] != 0 )
+    {
+        uint32_t type;
+        const void *obj;
+        const SNameOverload *name;
+
+        b . mode |= MARKED_MODE;
+        VSchemaClearMark ( self );
+
+        obj = VSchemaFind ( self, & name, & type, decl, "VSchemaDump", false );
+
+        if ( obj != NULL ) switch ( type )
+        {
+        case eConstant:
+            SConstantMark ( obj );
+            break;
+        case eFormat:
+            SFormatMark ( obj );
+            break;
+        case eDatatype:
+            SDatatypeMark ( obj );
+            break;
+        case eTypeset:
+            STypesetMark ( obj, self );
+            break;
+        case eFunction:
+        case eUntypedFunc:
+        case eScriptFunc:
+            SFunctionMark ( ( void * )obj, ( void * )self );
+            break;
+        case ePhysical:
+            SPhysicalMark ( ( void * )obj, ( void * )self );
+            break;
+        case eTable:
+            STableMark ( ( void * )obj, ( void * )self );
+            break;
+        case eDatabase:
+            SDatabaseMark ( ( void * )obj, ( void * )self );
+            break;
+        }
+        else if ( name != NULL ) switch ( type )
+        {
+        case eFunction:
+        case eUntypedFunc:
+        case eScriptFunc:
+            SFuncNameMark ( name, self );
+            break;
+        case ePhysical:
+            SPhysNameMark ( name, self );
+            break;
+        case eTable:
+            STableNameMark ( name, self );
+            break;
+        case eDatabase:
+            SDatabaseNameMark ( name, self );
+            break;
+        }
+    }
+
+    failed = VSchemaDumpInt ( self, & b, dump_class );
+
+    rc = SDumperWhack ( & b );
+    return failed ? b . rc : rc;
+}
+
+static rc_t CC dump_to_stderr(void *dst, const void *buf, size_t sz)
+{
+    fwrite(buf, 1, sz, stderr);
+    return 0;
+}
+
+rc_t VSchemaDebugPrint ( const VSchema *self, const char *decl )
+{
+    return VSchemaDump ( self, sdmPrint, decl, dump_to_stderr, NULL );
+}
+
+/* ToText
+ *  converts some object to textual representation
+ */
+typedef struct VSchema2TextData VSchema2TextData;
+struct VSchema2TextData
+{
+    char *buff;
+    size_t bsize;
+    size_t total;
+};
+
+static
+rc_t CC flush_to_text ( void *data, const void *buffer, size_t size )
+{
+    VSchema2TextData *pb = data;
+    if ( size != 0 )
+    {
+        if ( pb -> total + size >= pb -> bsize )
+            return RC ( rcVDB, rcSchema, rcWriting, rcBuffer, rcInsufficient );
+
+        memmove ( & pb -> buff [ pb -> total ], buffer, size );
+        pb -> total += size;
+    }
+    return 0;
+}
+
+rc_t VSchemaToText ( const VSchema *self,
+    char *buff, size_t bsize, size_t *num_writ, const char *fmt, ... )
+{
+    SDumper b;
+    rc_t rc, wrc;
+    VSchema2TextData pb;
+
+    va_list args;
+    va_start ( args, fmt );
+
+    assert ( buff != NULL );
+    assert ( bsize != 0 );
+
+    SDumperInit ( & b, self, sdmCompact, flush_to_text, & pb );
+
+    pb . buff = buff;
+    pb . bsize = bsize;
+    pb . total = 0;
+
+    rc = SDumperVPrint ( & b, fmt, args );
+    wrc = SDumperWhack ( & b );
+
+    * num_writ = pb . total;
+
+    va_end ( args );
+    return rc != 0 ? rc : wrc;
+}
diff --git a/libs/vdb/schema-dump.h b/libs/vdb/schema-dump.h
new file mode 100644
index 0000000..9172fc9
--- /dev/null
+++ b/libs/vdb/schema-dump.h
@@ -0,0 +1,208 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_schema_dump_
+#define _h_schema_dump_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct String;
+struct KSymbol;
+struct VSchema;
+struct VTypedecl;
+struct VFormatdecl;
+
+
+/*--------------------------------------------------------------------------
+ * SDumper
+ */
+#define MARKED_MODE 0x8000
+
+enum VSchemaDumpClass
+{
+    sdcTypes = 1,
+    sdcTypesets,
+    sdcFormats,
+    sdcConstants,
+    sdcFunctions,
+    sdcColumns,
+    sdcTables,
+    sdcDatabases
+};
+
+typedef struct SDumper SDumper;
+struct SDumper
+{
+    struct VSchema const *schema;
+
+    struct KSymbol const *alias;
+
+    rc_t ( CC * flush ) ( void *fd, const void *buffer, size_t size );
+    void *fd;
+
+    const char *sep;
+
+    rc_t rc;
+    uint16_t indent;
+    uint16_t mode;
+
+    size_t total;
+    char buffer [ 4096 ];
+};
+
+/* Init
+ *  sets up block
+ */
+void SDumperInit ( SDumper *self, struct VSchema const *schema, uint32_t mode,
+    rc_t ( CC * flush ) ( void *fd, const void *buffer, size_t size ), void *fd );
+
+/* Whack
+ *  flushes buffer if necessary
+ */
+rc_t SDumperWhack ( SDumper *self );
+
+/* Write
+ *  write some text to the dumper
+ */
+rc_t SDumperWrite ( SDumper *self,
+    const char *buffer, size_t size );
+
+/* IndentLevel
+ *  increase or decrease indentation level
+ */
+void SDumperIncIndentLevel ( SDumper *self );
+void SDumperDecIndentLevel ( SDumper *self );
+
+/* Indent
+ *  writes indentation spacing
+ */
+rc_t SDumperIndent ( SDumper *self );
+
+/* SepString
+ *  sets separator string
+ */
+void SDumperSepString ( SDumper *self, const char *sep );
+
+/* Sep
+ *  write separator string
+ */
+rc_t SDumperSep ( SDumper *self );
+
+/* Print
+ *  \t   - indent
+ *  \n   - end of line
+ *  \v   - separator
+ *  %d   - int
+ *  %u   - unsigned int
+ *  %x   - unsigned int ( lower-case )
+ *  %X   - unsigned int ( UPPER-case )
+ *  %f   - double
+ *  %ld  - int64_t
+ *  %lu  - uint64_t
+ *  %lx  - uint64_t ( lower-case )
+ *  %lX  - uint64_t ( UPPER-case )
+ *  %p   - pointer ( UPPER-case )
+ *  %z   - size_t ( decimal )
+ *  %s   - const char* ( NUL-terminated )
+ *  %.*s - int, const char*
+ *  %S   - const String*
+ *  %N   - const KSymbol*
+ *  %T   - const VTypedecl*
+ *  %F   - const VFormatdecl*
+ *  %V   - uint32_t version
+ *  %E   - const SExpression*
+ */
+rc_t SDumperPrint ( SDumper *self, const char *fmt, ... );
+rc_t SDumperVPrint ( SDumper *self, const char *fmt, va_list args );
+
+
+/* Mode
+ *  get the dump mode
+ */
+#define SDumperMode( self ) \
+    ( ( self ) -> mode & 0xFF )
+
+/* Class
+ *  get the class of object to dump
+ */
+#define SDumperClass( self ) \
+    ( ( ( self ) -> mode >> 8 ) & 0x7F )
+
+/* MarkedMode
+ *  tells if only running in marked mode
+ */
+#define SDumperMarkedMode( self ) \
+    ( ( self ) -> mode & MARKED_MODE )
+
+
+/*--------------------------------------------------------------------------
+ * various types
+ */
+
+/* Version
+ */
+rc_t SDumperVersion ( SDumper *self, uint32_t version );
+
+/* String
+ */
+rc_t StringDump ( struct String const *self, SDumper *d );
+
+/* KSymbol
+ */
+rc_t KSymbolDump ( struct KSymbol const *self, SDumper *b );
+
+/* FQN
+ *  writes fully qualified name in schema format
+ */
+rc_t FQNDump ( struct KSymbol const *self, SDumper *b );
+
+/* Alias
+ */
+rc_t AliasDump ( struct KSymbol const *self, SDumper *b );
+
+/* VTypedecl
+ * VFormatdecl
+ */
+rc_t VTypedeclDump ( struct VTypedecl const *self, SDumper *b );
+rc_t VFormatdeclDump ( struct VFormatdecl const *self, SDumper *b );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_schema_dump_ */
diff --git a/libs/vdb/schema-eval.c b/libs/vdb/schema-eval.c
new file mode 100644
index 0000000..2a0ebc6
--- /dev/null
+++ b/libs/vdb/schema-eval.c
@@ -0,0 +1,1400 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "schema-expr.h"
+
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <bitstr.h>
+#include <atomic32.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ */
+
+
+/* CacheIntrinsicTypeId
+ *  for id-caching
+ *
+ *  reads id atomically from "cache" and returns if non-zero
+ *
+ *  otherwise retrieves type id by name lookup, and sets
+ *  value atomically in "cache" before returning.
+ */
+uint32_t VSchemaCacheIntrinsicTypeId ( const VSchema *self,
+    atomic32_t *cache, const char *type_name )
+{
+    uint32_t id;
+
+    assert ( self != NULL );
+    assert ( cache != NULL );
+    assert ( type_name != NULL && type_name [ 0 ] != 0 );
+
+    /* retrieve cached value */
+    id = atomic32_read ( cache );
+    if ( id == 0 )
+    {
+        String name;
+        uint32_t prev;
+        const KSymbol *sym;
+        const SDatatype *dt;
+
+        /* find intrinsic schema */
+        const VSchema *intrinsic = self;
+        while ( intrinsic -> dad != NULL )
+            intrinsic = intrinsic -> dad;
+
+        /* find datatype U32 */
+        StringInitCString ( & name, type_name );
+        sym = ( const KSymbol* )
+            BSTreeFind ( & intrinsic -> scope, & name, KSymbolCmp );
+        assert ( sym != NULL );
+        dt = sym -> u . obj;
+
+        /* this SHOULD be idempotent */
+        prev = atomic32_test_and_set ( cache, ( int ) dt -> id, id );
+        assert ( prev == id || prev == dt -> id );
+
+        id = dt -> id;
+    }
+
+    return id;
+}
+
+
+/*--------------------------------------------------------------------------
+ * constant numeric expressions
+ *
+ *  built-in typecasting allows for the chain
+ *    bool => uint => int => float
+ *
+ *  built-in size promotion is automatic from 8 => 16 => 32 => 64 bits
+ *
+ *  constant size-demotion is allowed due to knowledge of constant value
+ *
+ *  explicit casts may reverse type promotion rules
+ */
+
+
+/* 64 bit interchange union
+ */
+typedef union nx nx;
+union nx
+{
+    uint64_t u64;
+    int64_t i64;
+    double f64;
+};
+
+
+/* readers
+ *  access data in 8, 16, 32 or 64 bit form
+ *  return data in 64 bit form
+ *  advance data pointer
+ */
+static
+const void *read_bool ( nx *data, const void *p )
+{
+    const bool *src = p;
+    data -> u64 = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_U8 ( nx *data, const void *p )
+{
+    const uint8_t *src = p;
+    data -> u64 = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_U16 ( nx *data, const void *p )
+{
+    const uint16_t *src = p;
+    data -> u64 = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_U32 ( nx *data, const void *p )
+{
+    const uint32_t *src = p;
+    data -> u64 = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_U64 ( nx *data, const void *p )
+{
+    const uint64_t *src = p;
+    data -> u64 = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_I8 ( nx *data, const void *p )
+{
+    const int8_t *src = p;
+    data -> i64 = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_I16 ( nx *data, const void *p )
+{
+    const int16_t *src = p;
+    data -> i64 = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_I32 ( nx *data, const void *p )
+{
+    const int32_t *src = p;
+    data -> i64 = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_I64 ( nx *data, const void *p )
+{
+    const int64_t *src = p;
+    data -> i64 = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_F32 ( nx *data, const void *p )
+{
+    const float *src = p;
+    data -> f64 = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_F64 ( nx *data, const void *p )
+{
+    const double *src = p;
+    data -> f64 = src [ 0 ];
+    return src + 1;
+}
+
+/* writers
+ *  write data in 8, 16, 32, or 64 bit form
+ *  receive data in 64 bit form
+ *  advance pointers
+ */
+static
+void *write_bool ( void *p, const nx *data )
+{
+    bool *dst = p;
+    dst [ 0 ] = data -> u64 ? true : false;
+    return dst + 1;
+}
+
+static
+void *write_U8 ( void *p, const nx *data )
+{
+    uint8_t *dst = p;
+    dst [ 0 ] = ( uint8_t ) data -> u64;
+    if ( ( uint64_t ) dst [ 0 ] != data -> u64 )
+        return NULL;
+    return dst + 1;
+}
+
+static
+void *write_U16 ( void *p, const nx *data )
+{
+    uint16_t *dst = p;
+    dst [ 0 ] = ( uint16_t ) data -> u64;
+    if ( ( uint64_t ) dst [ 0 ] != data -> u64 )
+        return NULL;
+    return dst + 1;
+}
+
+static
+void *write_U32 ( void *p, const nx *data )
+{
+    uint32_t *dst = p;
+    dst [ 0 ] = ( uint32_t ) data -> u64;
+    if ( ( uint64_t ) dst [ 0 ] != data -> u64 )
+        return NULL;
+    return dst + 1;
+}
+
+static
+void *write_U64 ( void *p, const nx *data )
+{
+    uint64_t *dst = p;
+    dst [ 0 ] = data -> u64;
+    return dst + 1;
+}
+
+static
+void *write_I8 ( void *p, const nx *data )
+{
+    int8_t *dst = p;
+    dst [ 0 ] = ( int8_t ) data -> i64;
+    if ( ( int64_t ) dst [ 0 ] != data -> i64 )
+        return NULL;
+    return dst + 1;
+}
+
+static
+void *write_I16 ( void *p, const nx *data )
+{
+    int16_t *dst = p;
+    dst [ 0 ] = ( int16_t ) data -> i64;
+    if ( ( int64_t ) dst [ 0 ] != data -> i64 )
+        return NULL;
+    return dst + 1;
+}
+
+static
+void *write_I32 ( void *p, const nx *data )
+{
+    int32_t *dst = p;
+    dst [ 0 ] = ( int32_t ) data -> i64;
+    if ( ( int64_t ) dst [ 0 ] != data -> i64 )
+        return NULL;
+    return dst + 1;
+}
+
+static
+void *write_I64 ( void *p, const nx *data )
+{
+    int64_t *dst = p;
+    dst [ 0 ] = data -> i64;
+    return dst + 1;
+}
+
+static
+void *write_F32 ( void *p, const nx *data )
+{
+    double e;
+    float *dst = p;
+    dst [ 0 ] = ( float ) data -> f64;
+    e = ( double ) dst [ 0 ] - data -> f64;
+    if ( -1.0 < e || e > 1.0 )
+        return NULL;
+    return dst + 1;
+}
+
+static
+void *write_F64 ( void *p, const nx *data )
+{
+    double *dst = p;
+    dst [ 0 ] = data -> f64;
+    return dst + 1;
+}
+
+
+/* converters
+ *  convert from one data type to another
+ */
+static
+nx *null_cvt ( nx *data )
+{
+    return data;
+}
+
+static
+nx *uint_int ( nx *data )
+{
+    if ( data -> i64 < 0 )
+        return NULL;
+    return data;
+}
+
+static
+nx *uint_float ( nx *data )
+{
+    if ( data -> i64 < 0 )
+        return NULL;
+    data -> f64 = (double)data -> i64;
+    return data;
+}
+
+static
+nx *int_float ( nx *data )
+{
+    data -> f64 = (double)data -> i64;
+    return data;
+}
+
+static
+nx *float_int ( nx *data )
+{
+    data -> i64 = ( int64_t ) data -> f64;
+    return data;
+}
+
+static
+nx *float_uint ( nx *data )
+{
+    data -> i64 = ( int64_t ) data -> f64;
+    if ( data -> i64 < 0 )
+        return NULL;
+    return data;
+}
+
+static
+nx *int_uint ( nx *data )
+{
+    if ( data -> i64 < 0 )
+        return NULL;
+    return data;
+}
+
+/* eval-numeric-expr
+ *  tries to evaluate a constant numeric expression against type
+ *  returns non-zero error code if failed
+ */
+#if SLVL >= 1
+LIB_EXPORT rc_t CC eval_numeric_expr ( const VSchema *self, const VTypedecl *td,
+    const SConstExpr *expr, SConstExpr **xp, bool force )
+{
+    SConstExpr *x;
+    uint32_t sbits, sdim;
+    uint32_t i, dbits, ddim;
+
+    void *dst;
+    const void *src;
+
+    const void* ( * reader ) ( nx*, const void* );
+    void* ( * writer ) ( void*, const nx* );
+    nx* ( * cvt ) ( nx* );
+
+    /* source and destination types of constant vector */
+    const SDatatype *sdt = VSchemaFindTypeid ( self, expr -> td . type_id );
+    const SDatatype *ddt = VSchemaFindTypeid ( self, td -> type_id );
+    if ( sdt == NULL || ddt == NULL )
+        return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcNotFound );
+
+    /* size of source and destination types */
+    sbits = sdt -> size;
+    dbits = ddt -> size;
+
+    /* regardless of how derived the specified types may be,
+       get their dimensions in terms of intrinsic types */
+    sdim = SDatatypeIntrinsicDim ( sdt );
+    ddim = SDatatypeIntrinsicDim ( ddt );
+
+    /* convert stated sizes to intrinsic element size */
+    assert ( sdim != 0 && ( sbits % sdim ) == 0 );
+    sbits /= sdim;
+    assert ( ddim != 0 && ( dbits % ddim ) == 0 );
+    dbits /= ddim;
+
+    /* test for cast compatibility */
+    if ( ! force ) switch ( ddt -> domain )
+    {
+    case ddBool:
+        /* only bool casts to bool */
+        if ( sdt -> domain != ddBool )
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcIncorrect );
+        break;
+    case ddUint: case ddInt: case ddFloat:
+        if ( sdt -> domain > ddt -> domain )
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcIncorrect );
+        break;
+    default:
+        return SILENT_RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUnexpected );
+    }
+
+    /* reset dimensions to account for explicit values */
+    sdim *= expr -> td . dim;
+    i = ddim * td -> dim;
+
+    /* destination dim must divide source dim evenly */
+    if ( i == 0 || sdim < i || ( sdim % i ) != 0 )
+        return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcIncorrect );
+
+    /* determine reader */
+    switch ( sdt -> domain )
+    {
+    case ddBool:
+        reader = read_bool; break;
+    case ddUint:
+        switch ( sbits )
+        {
+        case 8:  reader = read_U8; break;
+        case 16: reader = read_U16; break;
+        case 32: reader = read_U32; break;
+        case 64: reader = read_U64; break;
+        default:
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUnexpected );
+        }
+        break;
+    case ddInt:
+        switch ( sbits )
+        {
+        case 8:  reader = read_I8; break;
+        case 16: reader = read_I16; break;
+        case 32: reader = read_I32; break;
+        case 64: reader = read_I64; break;
+        default:
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUnexpected );
+        }
+        break;
+    case ddFloat:
+        switch ( sbits )
+        {
+        case 32: reader = read_F32; break;
+        case 64: reader = read_F64; break;
+        default:
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUnexpected );
+        }
+        break;
+    default:
+        /* here to quiet compiler complaints */
+        reader = NULL;
+    }
+
+    /* determine writer */
+    switch ( ddt -> domain )
+    {
+    case ddBool:
+        writer = write_bool; break;
+    case ddUint:
+        switch ( dbits )
+        {
+        case 8:  writer = write_U8; break;
+        case 16: writer = write_U16; break;
+        case 32: writer = write_U32; break;
+        case 64: writer = write_U64; break;
+        default:
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUnexpected );
+        }
+        break;
+    case ddInt:
+        switch ( dbits )
+        {
+        case 8:  writer = write_I8; break;
+        case 16: writer = write_I16; break;
+        case 32: writer = write_I32; break;
+        case 64: writer = write_I64; break;
+        default:
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUnexpected );
+        }
+        break;
+    case ddFloat:
+        switch ( dbits )
+        {
+        case 32: writer = write_F32; break;
+        case 64: writer = write_F64; break;
+        default:
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUnexpected );
+        }
+        break;
+    default:
+        writer = NULL;
+    }
+
+    /* determine converter */
+    if ( sdt -> domain == ddt -> domain )
+        cvt = null_cvt;
+    else switch ( ddt -> domain )
+    {
+    case ddBool:
+    case ddUint:
+        switch ( sdt -> domain )
+        {
+        case ddInt:
+            cvt = int_uint; break;
+        case ddFloat:
+            cvt = float_uint; break;
+        default:
+            cvt = null_cvt;
+        }
+        break;
+    case ddInt:
+        switch ( sdt -> domain )
+        {
+        case ddFloat:
+            cvt = float_int; break;
+        default:
+            cvt = uint_int; break;
+        }
+        break;
+    case ddFloat:
+        switch ( sdt -> domain )
+        {
+        case ddInt:
+            cvt = int_float; break;
+        default:
+            cvt = uint_float; break;
+        }
+        break;
+    default:
+        cvt = null_cvt;
+    }
+
+    /* create output object */
+    {
+	unsigned int alloc_size;
+
+	alloc_size=(((size_t)dbits * sdim + 7) >> 3);
+	if(alloc_size < sizeof(x->u)){ /** don't go below size of union ***/
+		alloc_size=sizeof(*x);	
+	} else { /** overallocate here ***/
+		alloc_size+=sizeof(*x)-sizeof(x->u);
+	}
+	alloc_size = (alloc_size+3)&~3; /** align to 4 bytes **/
+    	x = malloc ( alloc_size );
+	if ( x == NULL )
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcMemory, rcExhausted );
+	memset(x,0,alloc_size);
+    }
+
+    /* copy, and perform type conversion */
+    src = & expr -> u;
+    dst = & x -> u;
+    for ( i = 0; i < sdim; ++ i )
+    {
+        nx data;
+        const nx *dp;
+
+        /* read element */
+        src = ( * reader ) ( & data, src );
+
+        /* type-promote */
+        dp = ( * cvt ) ( & data );
+        if ( dp == NULL )
+        {
+            free ( x );
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcConstraint, rcViolated );
+        }
+
+        /* write element */
+        dst = ( * writer ) ( dst, dp );
+        if ( dst == NULL )
+        {
+            free ( x );
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcConstraint, rcViolated );
+        }
+    }
+
+    /* it is done */
+    x -> dad . var = eConstExpr;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> td . type_id = td -> type_id;
+    x -> td . dim = sdim / ddim;
+    * xp = x;
+    return 0;
+}
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * constant textual expressions
+ *
+ *  built-in typecasting allows for the chain
+ *    ascii => unicode
+ *
+ *  built-in size promotion is automatic from 8 => 16 => 32 bits
+ *
+ *  constant size-demotion is allowed due to knowledge of constant value
+ *
+ *  explicit casts may reverse type promotion rules
+ */
+
+
+static
+const void *read_ascii ( uint32_t *ch, const void *p, const void *end )
+{
+    const char *src = p;
+    if ( src [ 0 ] < 0 )
+        return NULL;
+    * ch = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_utf8 ( uint32_t *ch, const void *p, const void *end )
+{
+    const char *src = p;
+    int len = utf8_utf32 ( ch, src, end );
+    if ( len <= 0 )
+        return NULL;
+    return src + len;
+}
+
+static
+const void *read_utf16 ( uint32_t *ch, const void *p, const void *end )
+{
+    const uint16_t *src = p;
+    * ch = src [ 0 ];
+    return src + 1;
+}
+
+static
+const void *read_utf32 ( uint32_t *ch, const void *p, const void *end )
+{
+    const uint32_t *src = p;
+    * ch = src [ 0 ];
+    return src + 1;
+}
+
+static
+void *write_ascii ( void *p, void *end, uint32_t ch )
+{
+    char *dst = p;
+    if ( ch >= 128 )
+        ch = '?';
+    dst [ 0 ] = ( char ) ch;
+    return dst + 1;
+}
+
+static
+void *write_utf8 ( void *p, void *end, uint32_t ch )
+{
+    char *dst = p;
+    int len = utf32_utf8 ( dst, end, ch );
+    if ( len <= 0 )
+        return NULL;
+    return dst + len;
+}
+
+static
+void *write_utf16 ( void *p, void *end, uint32_t ch )
+{
+    uint16_t *dst = p;
+    if ( ch > 0x10000 )
+        ch = '?';
+    dst [ 0 ] = ( uint16_t ) ch;
+    return dst + 1;
+}
+
+static
+void *write_utf32 ( void *p, void *end, uint32_t ch )
+{
+    uint32_t *dst = p;
+    dst [ 0 ] = ch;
+    return dst + 1;
+}
+
+#if SLVL >= 1
+LIB_EXPORT rc_t CC eval_text_expr ( const VSchema *self, const VTypedecl *td,
+    const SConstExpr *expr, SConstExpr **xp, bool force )
+{
+    size_t size;
+    uint32_t len;
+    SConstExpr *x;
+    uint32_t sbits, sdim;
+    uint32_t i, dbits, ddim;
+
+    void *dst, *dend;
+    const void *src, *send;
+    void* ( * writer ) ( void*, void*, uint32_t );
+    const void* ( * reader ) ( uint32_t*, const void*, const void* );
+
+    /* source and destination types of constant vector */
+    const SDatatype *sdt = VSchemaFindTypeid ( self, expr -> td . type_id );
+    const SDatatype *ddt = VSchemaFindTypeid ( self, td -> type_id );
+    if ( sdt == NULL || ddt == NULL )
+        return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcNotFound );
+
+    /* size of source and destination types */
+    sbits = sdt -> size;
+    dbits = ddt -> size;
+
+    /* regardless of how derived the specified types may be,
+       get their dimensions in terms of intrinsic types */
+    sdim = SDatatypeIntrinsicDim ( sdt );
+    ddim = SDatatypeIntrinsicDim ( ddt );
+
+    /* convert stated sizes to intrinsic element size */
+    assert ( sdim != 0 && ( sbits % sdim ) == 0 );
+    sbits /= sdim;
+    assert ( ddim != 0 && ( dbits % ddim ) == 0 );
+    dbits /= ddim;
+
+    /* test for cast compatibility */
+    if ( ! force ) switch ( ddt -> domain )
+    {
+    case ddAscii:
+        /* only ascii casts to ascii */
+        if ( sdt -> domain != ddAscii )
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcIncorrect ); 
+        break;
+    case ddUnicode:
+        if ( sdt -> domain < ddAscii || sdt -> domain > ddt -> domain )
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcIncorrect );
+        break;
+    default:
+        return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUnexpected );
+    }
+
+    /* restore source dimension */
+    sdim *= expr -> td . dim;
+
+    /* determine reader and length */
+    len = sdim;
+    switch ( sdt -> domain )
+    {
+    case ddAscii:
+        reader = read_ascii; break;
+    default:
+        switch ( sbits )
+        {
+        case 8:
+            reader = read_utf8;
+            len = string_len ( expr -> u . utf8, sdim );
+            break;
+        case 16:
+            reader = read_utf16;
+            break;
+        case 32:
+            reader = read_utf32;
+            break;
+        default:
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUnexpected );
+        }
+    }
+
+    /* determine writer and size */
+    ddim = len;
+    switch ( ddt -> domain )
+    {
+    case ddAscii:
+        writer = write_ascii;
+        size = len;
+        break;
+    default:
+        switch ( sbits )
+        {
+        case 8:
+            writer = write_utf8;
+            switch ( dbits )
+            {
+            case 16:
+                utf16_cvt_string_len ( expr -> u . utf16, len << 1, & size );
+                break;
+            case 32:
+                utf32_cvt_string_len ( expr -> u . utf32, len << 2, & size );
+                break;
+            default:
+                size = sdim;
+            }
+            ddim = ( uint32_t ) size;
+            break;
+        case 16:
+            writer = write_utf16;
+            size = len << 1;
+            break;
+        case 32:
+            writer = write_utf32;
+            size = len << 2;
+            break;
+        default:
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUnexpected );
+        }
+    }
+
+    /* create output object */
+    {
+	unsigned int alloc_size;
+
+	alloc_size=size;
+	if(alloc_size < sizeof(x->u)){ /** don't go below size of union ***/
+		alloc_size=sizeof(*x);	
+	} else { /** overallocate here ***/
+		alloc_size+=sizeof(*x)-sizeof(x->u);
+	}
+	alloc_size = (alloc_size+3)&~3; /** align to 4 bytes **/
+    	x = malloc ( alloc_size );
+	if ( x == NULL )
+		return RC ( rcVDB, rcExpression, rcEvaluating, rcMemory, rcExhausted );
+	memset(x,0,alloc_size);
+    }
+   
+
+    /* copy, and perform type conversion */
+    src = expr -> u . utf8;
+    send = & expr -> u . utf8 [ sdim ];
+    dst = x -> u . utf8;
+    dend = & x -> u . utf8 [ size ];
+    for ( i = 0; i < len; ++ i )
+    {
+        uint32_t ch;
+
+        /* read character */
+        src = ( * reader ) ( & ch, src, send );
+        if ( src == NULL )
+        {
+            free ( x );
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcData, rcCorrupt );
+        }
+
+        /* write character */
+        dst = ( * writer ) ( dst, dend, ch );
+        if ( dst == NULL )
+        {
+            free ( x );
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcData, rcCorrupt );
+        }
+    }
+
+    /* it is done */
+    x -> dad . var = eConstExpr;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> td . type_id = td -> type_id;
+    x -> td . dim = ddim;
+    * xp = x;
+    return 0;
+}
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SConstExpr
+ */
+
+
+/* Resolve
+ *  return constant expression as a vector of indicated type
+ */
+rc_t SConstExprResolveAsBool ( const SConstExpr *self,
+    const VSchema *schema, bool *b, uint32_t capacity );
+rc_t SConstExprResolveAsI8 ( const SConstExpr *self,
+    const VSchema *schema, int8_t *i8, uint32_t capacity );
+rc_t SConstExprResolveAsI16 ( const SConstExpr *self,
+    const VSchema *schema, int16_t *i16, uint32_t capacity );
+rc_t SConstExprResolveAsI32 ( const SConstExpr *self,
+    const VSchema *schema, int32_t *i32, uint32_t capacity );
+rc_t SConstExprResolveAsI64 ( const SConstExpr *self,
+    const VSchema *schema, int64_t *i64, uint32_t capacity );
+rc_t SConstExprResolveAsU8 ( const SConstExpr *self,
+    const VSchema *schema, uint8_t *u8, uint32_t capacity );
+rc_t SConstExprResolveAsU16 ( const SConstExpr *self,
+    const VSchema *schema, uint16_t *u16, uint32_t capacity );
+
+rc_t SConstExprResolveAsU32 ( const SConstExpr *self,
+    const VSchema *schema, uint32_t *u32, uint32_t capacity, Vector *cx_bind )
+{
+    if ( capacity != 1 )
+        return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUnsupported );
+    return eval_uint_expr ( schema, ( const SExpression* ) self, u32, cx_bind );
+}
+
+rc_t SConstExprResolveAsU64 ( const SConstExpr *self,
+    const VSchema *schema, uint32_t *u64, uint32_t capacity );
+rc_t SConstExprResolveAsF32 ( const SConstExpr *self,
+    const VSchema *schema, float *f32, uint32_t capacity );
+rc_t SConstExprResolveAsF64 ( const SConstExpr *self,
+    const VSchema *schema, double *f64, uint32_t capacity );
+rc_t SConstExprResolveAsAscii ( const SConstExpr *self,
+    const VSchema *schema, char *ascii, size_t capacity );
+rc_t SConstExprResolveAsUTF8 ( const SConstExpr *self,
+    const VSchema *schema, char *utf8, size_t bytes );
+rc_t SConstExprResolveAsUTF16 ( const SConstExpr *self,
+    const VSchema *schema, uint16_t *utf16, uint32_t capacity );
+rc_t SConstExprResolveAsUTF32 ( const SConstExpr *self,
+    const VSchema *schema, uint32_t *utf32, uint32_t capacity );
+
+
+/*--------------------------------------------------------------------------
+ * STypeExpr
+ */
+
+/* Resolve
+ *  resolve type expression to either a VTypedecl or VFormatdecl
+ */
+rc_t STypeExprResolveAsFormatdecl ( const STypeExpr *self,
+    const VSchema *schema, VFormatdecl *fd, Vector *cx_bind )
+{
+    rc_t rc;
+    uint32_t dim;
+
+    /* if self is resolved, then the format, type
+       and dimension are completely resolved */
+    if ( self -> resolved )
+    {
+        * fd = self -> fd;
+        return 0;
+    }
+
+#if SLVL < 3
+    return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcIncorrect );
+#else
+    /* the format is always completely resolved,
+       this leaves type and/or dimension */
+
+    if ( self -> id != NULL )
+    {
+        /* the type needs to be resolved */
+        const STypeExpr *type = ( const STypeExpr* ) VectorGet ( cx_bind, self -> id -> type_id );
+        if ( type == NULL )
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUndefined );
+        if ( type -> dad . var != eTypeExpr )
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcIncorrect );
+        rc = STypeExprResolveAsFormatdecl ( type, schema, fd, cx_bind );
+        if ( rc != 0 )
+            return rc;
+
+        /* at this point, "fd" has some format - which we'll clobber,
+           a type and dim from the indirect type just resolved */
+    }
+    else
+    {
+        /* take known type and default dimension */
+        fd -> td . type_id = self -> fd . td . type_id;
+        fd -> td . dim = 1;
+    }
+
+    /* always take our format */
+    fd -> fmt = self -> fd . fmt;
+
+    /* test for unresolved dimension */
+    dim = self -> fd . td . dim;
+    if ( dim == 0 && self -> dim != NULL )
+    {
+        const SExpression *dx = self -> dim;
+        while ( dx != NULL )
+        {
+            const SIndirectConst *ic;
+
+            if ( dx -> var == eConstExpr )
+            {
+                rc = SConstExprResolveAsU32 ( ( const SConstExpr* ) dx, schema, & dim, 1, cx_bind );
+                if ( rc != 0 )
+                    return rc;
+                break;
+            }
+
+            if ( dx -> var != eIndirectExpr )
+                return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcIncorrect );
+
+            ic = ( ( const SSymExpr* ) dx ) -> _sym -> u . obj;
+            assert ( ic != NULL );
+
+            dx = ( const SExpression* ) VectorGet ( cx_bind, ic -> expr_id );
+        }
+
+        /* must have non-zero dim */
+        if ( dim == 0 )
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcUndefined );
+    }
+
+    /* factor in our dimension */
+    fd -> td . dim *= dim;
+    return 0;
+#endif
+}
+
+rc_t STypeExprResolveAsTypedecl ( const STypeExpr *self,
+    const VSchema *schema, VTypedecl *td, Vector *cx_bind )
+{
+    VFormatdecl fd;
+    rc_t rc = STypeExprResolveAsFormatdecl ( self, schema, & fd, cx_bind );
+    if ( rc == 0 )
+    {
+        if ( fd . fmt != 0 )
+            return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcIncorrect );
+        * td = fd . td;
+    }
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * general constant expression evaluation
+ */
+#if SLVL >= 1
+
+/* eval-type-expr
+ *  should be able to boil things down to defined type vector
+ */
+static
+rc_t eval_type_expr ( const VSchema *self, const VTypedecl *td,
+    const STypeExpr *expr, SExpression **xp )
+{
+    PLOGMSG( klogWarn, ( klogWarn, "TDB: $(msg)", "msg=handle type expression" ));
+    return -1;
+}
+
+/* eval-indirect-expr
+ */
+static
+rc_t eval_indirect_expr ( const VSchema *self, const VTypedecl *td,
+    const SSymExpr *expr, SExpression **xp, Vector *cx_bind )
+{
+    const SIndirectConst *ic = expr -> _sym -> u . obj;
+
+    /* if the expression is there */
+    if ( ic -> expr_id != 0 )
+    {
+        const SExpression *ic_expr = ( const SExpression* ) VectorGet ( cx_bind, ic -> expr_id );
+        if ( ic_expr != NULL )
+            return eval_const_expr ( self, td, ic_expr, xp, cx_bind );
+    }
+
+    /* just return self */
+    * xp = & ( ( SSymExpr* ) expr ) -> dad;
+    atomic32_inc ( & ( ( SSymExpr* ) expr ) -> dad . refcount );
+    return 0;
+}
+
+
+/* eval-const-cast-expr
+ */
+static
+rc_t eval_const_cast_expr ( const VSchema *self, const VTypedecl *td,
+    const SExpression *expr, SExpression **xp )
+{
+    PLOGMSG( klogWarn, ( klogWarn, "TDB: $(msg)", "msg=handle const cast expression" ));
+    return -1;
+}
+
+
+/* eval-func-param-expr
+ */
+static
+rc_t eval_func_param_expr ( const VSchema *self, const VTypedecl *td,
+    const SExpression *expr, SExpression **xp )
+{
+    PLOGMSG( klogWarn, ( klogWarn, "TDB: $(msg)", "msg=handle function expression" ));
+    return -1;
+}
+
+struct eval_vector_param_expr_pb
+{
+    rc_t rc;
+    const VSchema *self;
+    const VTypedecl *td;
+    Vector *cx_bind;
+    Vector v;
+};
+
+static
+void CC vector_free ( void *item, void *data )
+{
+    free ( item );
+}
+
+static
+bool CC do_eval_vector_param_expr ( void *item, void *data )
+{
+    struct eval_vector_param_expr_pb *pb = data;
+    SExpression *rslt = NULL;
+    
+    pb -> rc = eval_const_expr ( pb -> self, pb -> td, item, & rslt, pb -> cx_bind );
+    if ( pb -> rc != 0 )
+        return true;
+
+    switch ( rslt -> var )
+    {
+    case eConstExpr:
+        VectorAppend ( & pb -> v, NULL, rslt );
+        break;
+    case eVectorExpr:
+        free ( rslt );
+        break;
+    default:
+        free ( rslt );
+        pb -> rc = RC ( rcVDB, rcExpression, rcEvaluating, rcExpression, rcUnexpected );
+        return true;
+    }
+
+    return false;
+}
+
+/* eval-vector-param-expr
+ */
+static
+rc_t eval_vector_param_expr ( const VSchema *self, const VTypedecl *td,
+    const SVectExpr *expr, SExpression **xp, Vector *cx_bind )
+{
+    struct eval_vector_param_expr_pb pb;
+
+    *xp = NULL;
+    
+    pb . rc = 0;
+    pb . self = self;
+    pb . td = td;
+    pb . cx_bind = cx_bind;
+    VectorInit ( & pb . v, 0, 32 );
+    
+    VectorDoUntil ( & expr -> expr, 0, do_eval_vector_param_expr, & pb );
+    if ( pb . rc == 0 )
+    {
+        SConstExpr *rslt;
+        uint32_t elem_count = VectorLength ( & pb . v );
+        uint32_t elem_bits;
+        size_t alloc_size;
+        
+        {
+            const SDatatype *dt = VSchemaFindTypeid ( self, td -> type_id );
+            elem_bits = dt -> size;
+        }
+
+        alloc_size = ( ( ( size_t ) elem_bits * elem_count + 7 ) >> 3 );
+
+        /** don't go below size of union ***/
+        if ( alloc_size < sizeof rslt -> u )
+            alloc_size = sizeof * rslt;	
+        /** overallocate here ***/
+        else
+            alloc_size += sizeof * rslt - sizeof rslt -> u ;
+
+        /** align to 4 bytes **/
+        alloc_size = ( alloc_size + 3 ) & ~ 3;
+        rslt = calloc ( alloc_size, 1 );
+        if ( rslt == NULL )
+            pb . rc = RC ( rcVDB, rcExpression, rcEvaluating, rcMemory, rcExhausted );
+        else
+        {
+            uint32_t i;
+
+            rslt -> dad . var = eConstExpr;
+            atomic32_set ( & rslt -> dad . refcount, 1 );
+            rslt -> td = *td;
+            rslt -> td . dim = elem_count;
+            
+            for ( i = 0; i != elem_count; ++i )
+            {
+                const SConstExpr *y = VectorGet ( & pb . v, i );
+                bitcpy ( & rslt -> u, i * elem_bits, & y -> u, 0, elem_bits );
+            }
+
+            *xp = & rslt -> dad;
+        }
+    }
+
+    VectorWhack( & pb . v, vector_free, 0 );
+
+    return pb . rc;
+}
+
+
+/* eval-const-expr
+ *  tries to evaluate a constant expression against type
+ *  returns non-zero error code if failed
+ */
+rc_t eval_const_expr ( const VSchema *self, const VTypedecl *td,
+    const SExpression *expr, SExpression **xp, Vector *cx_bind )
+{
+    rc_t rc;
+    const SConstExpr *s;
+
+    switch ( expr -> var )
+    {
+    case eTypeExpr:
+        return eval_type_expr ( self, td, ( const STypeExpr* ) expr, xp );
+    case eConstExpr:
+        s = ( const SConstExpr* ) expr;
+        break;
+#if SLVL >= 3
+    case eIndirectExpr:
+        return eval_indirect_expr ( self, td, ( const SSymExpr* ) expr, xp, cx_bind );
+#endif
+#if SLVL >= 4
+    case eFuncParamExpr:
+        return eval_func_param_expr ( self, td, expr, xp );
+#endif
+    case eCastExpr:
+        return eval_const_cast_expr ( self, td, expr, xp );
+    case eVectorExpr:
+        return eval_vector_param_expr(self, td, ( const SVectExpr* ) expr, xp, cx_bind );
+    default:
+        *xp = NULL;
+        return RC ( rcVDB, rcExpression, rcEvaluating, rcExpression, rcUnexpected );
+    }
+
+    /* try to evaluate as numeric */
+    rc = eval_numeric_expr ( self, td, s, ( SConstExpr** ) xp, false );
+
+    /* fall over to text */
+    if ( rc != 0 && GetRCState ( rc ) == rcUnexpected && GetRCObject ( rc ) == (enum RCObject)rcType )
+        rc = eval_text_expr ( self, td, s, ( SConstExpr** ) xp, false );
+
+    return rc;
+}
+
+/* eval-uint-expr
+ *  special const expression evaluator for uint32_t
+ */
+rc_t eval_uint_expr ( const VSchema *self,
+    const SExpression *expr, uint32_t *value, Vector *cx_bind )
+{
+    rc_t rc;
+    VTypedecl td;
+    SConstExpr *x;
+
+    /* capture runtime value for U32 */
+    static atomic32_t s_U32_id;
+    uint32_t U32_id = VSchemaCacheIntrinsicTypeId ( self, & s_U32_id, "U32" );
+
+    /* evaluate expression against type */
+    td . type_id = U32_id;
+    td . dim = 1;
+    rc = eval_const_expr ( self, & td, expr, ( SExpression** ) & x, cx_bind );
+    if ( rc != 0 )
+        return rc;
+
+    /* verify dimensionality */
+    assert ( x -> dad . var == eConstExpr );
+    if ( x -> td . dim != 1 )
+        return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcIncorrect );
+
+    /* got it */
+    * value = x -> u . u32 [ 0 ];
+    free ( x );
+    return 0;
+}
+
+
+/* eval-uint64-expr
+ *  special const expression evaluator for uint32_t
+ */
+rc_t eval_uint64_expr ( const VSchema *self,
+    const SExpression *expr, uint64_t *value, Vector *cx_bind )
+{
+    rc_t rc;
+    VTypedecl td;
+    SConstExpr *x;
+
+    /* capture runtime value for U64 */
+    static atomic32_t s_U64_id;
+    uint64_t U64_id = VSchemaCacheIntrinsicTypeId ( self, & s_U64_id, "U64" );
+
+    /* evaluate expression against type */
+    td . type_id = U64_id;
+    td . dim = 1;
+    rc = eval_const_expr ( self, & td, expr, ( SExpression** ) & x, cx_bind );
+    if ( rc != 0 )
+        return rc;
+
+    /* verify dimensionality */
+    assert ( x -> dad . var == eConstExpr );
+    if ( x -> td . dim != 1 )
+        return RC ( rcVDB, rcExpression, rcEvaluating, rcType, rcIncorrect );
+
+    /* got it */
+    * value = x -> u . u64 [ 0 ];
+    free ( x );
+    return 0;
+}
+
+
+/* eval-expr-syntax
+ *  examine expression syntax
+ *  fixes forward references
+ */
+static
+bool CC eval_vect_expr_syntax ( void *item, void *data )
+{
+    rc_t *rc = data;
+    SExpression *x = item;
+    * rc = eval_expr_syntax ( x );
+    return ( * rc != 0 ) ? true : false;
+}
+
+static
+rc_t eval_type_expr_syntax ( const STypeExpr *expr )
+{
+    if ( expr -> dad . var != eTypeExpr )
+        return RC ( rcVDB, rcExpression, rcValidating, rcExpression, rcIncorrect );
+    return 0;
+}
+
+static
+rc_t eval_fwd_expr_syntax ( SSymExpr *expr )
+{
+    const KSymbol *sym = expr -> _sym;
+    assert ( sym != NULL );
+    switch ( sym -> type )
+    {
+    case eFuncParam:
+        expr -> dad . var = eParamExpr;
+        break;
+    case eProduction:
+        expr -> dad . var = eProdExpr;
+        break;
+    case eColumn:
+        expr -> dad . var = eColExpr;
+        break;
+    case ePhysMember:
+        expr -> dad . var = ePhysExpr;
+        break;
+    case eForward:
+        return RC ( rcVDB, rcSchema, rcValidating, rcName, rcUndefined );
+    case eVirtual:
+        break;
+
+    default:
+        return RC ( rcVDB, rcSchema, rcValidating, rcExpression, rcInvalid );
+    }
+
+    return 0;
+}
+
+rc_t eval_expr_syntax ( const SExpression *expr )
+{
+    rc_t rc;
+
+    if ( expr == NULL )
+        rc = RC ( rcVDB, rcExpression, rcValidating, rcSelf, rcNull );
+    else switch ( expr -> var )
+    {
+    case eFwdExpr:
+        rc = eval_fwd_expr_syntax ( ( SSymExpr* ) expr );
+        break;
+    case eCastExpr:
+        rc = eval_type_expr_syntax ( ( const STypeExpr* ) ( ( const SBinExpr* ) expr ) -> left );
+        if ( rc == 0 )
+            rc = eval_expr_syntax ( ( ( const SBinExpr* ) expr ) -> right );
+        break;
+    case eVectorExpr:
+        rc = 0;
+        VectorDoUntil ( & ( ( const SVectExpr* ) expr ) -> expr, false, eval_vect_expr_syntax, & rc );
+        break;
+    case eCondExpr:
+        rc = eval_expr_syntax ( ( ( const SBinExpr* ) expr ) -> left );
+        if ( rc == 0 )
+            rc = eval_expr_syntax ( ( ( const SBinExpr* ) expr ) -> right );
+        break;
+    default:
+        rc = 0;
+    }
+
+    return rc;
+}
+
+#endif
diff --git a/libs/vdb/schema-expr.c b/libs/vdb/schema-expr.c
new file mode 100644
index 0000000..bdefcf2
--- /dev/null
+++ b/libs/vdb/schema-expr.c
@@ -0,0 +1,2170 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "schema-expr.h"
+#include "schema-dump.h"
+
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * SExpression
+ */
+#if SLVL >= 1
+void SExpressionWhack ( const SExpression *cself )
+{
+    SExpression *self = ( SExpression* ) cself;
+    if ( self != NULL && atomic32_dec_and_test ( & self -> refcount ) )
+    {
+        switch ( self -> var )
+        {
+        case eTypeExpr:
+        {
+            STypeExpr *x = ( STypeExpr* ) self;
+            SExpressionWhack ( x -> dim );
+            break;
+        }
+        case eFuncExpr:
+        case eScriptExpr:
+        {
+            SFuncExpr *x = ( SFuncExpr* ) self;
+            VectorWhack ( & x -> schem, SExpressionVWhack, NULL );
+            VectorWhack ( & x -> pfact, SExpressionVWhack, NULL );
+            VectorWhack ( & x -> pfunc, SExpressionVWhack, NULL );
+            break;
+        }
+        case ePhysEncExpr:
+        {
+            SPhysEncExpr *x = ( SPhysEncExpr* ) self;
+            VectorWhack ( & x -> schem, SExpressionVWhack, NULL );
+            VectorWhack ( & x -> pfact, SExpressionVWhack, NULL );
+            break;
+        }
+        case eNegateExpr:
+        {
+            SUnaryExpr *x = ( SUnaryExpr* ) self;
+            SExpressionWhack ( x -> expr );
+            break;
+        }
+        case eCastExpr:
+        case eCondExpr:
+        {
+            SBinExpr *x = ( SBinExpr* ) self;
+            SExpressionWhack ( x -> left );
+            SExpressionWhack ( x -> right );
+            break;
+        }
+        case eVectorExpr:
+        {
+            SVectExpr *x = ( SVectExpr* ) self;
+            VectorWhack ( & x -> expr, SExpressionVWhack, NULL );
+            break;
+        }}
+
+        free ( self );
+    }
+}
+
+void CC SExpressionVWhack ( void *item, void *ignore )
+{
+    SExpression *self = item;
+    SExpressionWhack ( self );
+}
+#endif
+
+/* Mark
+ */
+#if SLVL >= 1
+void CC SExpressionMark ( void * item, void * data )
+{
+    const SExpression * self = item;
+    const VSchema * schema = data;
+    if ( self != NULL ) switch ( self -> var )
+    {
+    case eTypeExpr:
+        STypeExprMark ( ( const STypeExpr* ) self, schema );
+        break;
+    case eConstExpr:
+        VSchemaTypeMark ( schema, ( ( const SConstExpr* ) self ) -> td . type_id );
+        break;
+    case eIndirectExpr:
+    case eParamExpr:
+    case eProdExpr:
+    case eFwdExpr:
+    case eFuncParamExpr:
+    case eColExpr:
+    case ePhysExpr:
+        SSymExprMark ( ( const SSymExpr* ) self, schema );
+        break;
+    case eFuncExpr:
+    case eScriptExpr:
+        SFuncExprMark ( ( const SFuncExpr* ) self, schema );
+        break;
+    case ePhysEncExpr:
+        SPhysEncExprMark ( ( const SPhysEncExpr* ) self, schema );
+        break;
+    case eNegateExpr:
+        SExpressionMark ( ( void * )( ( const SUnaryExpr* ) self ) -> expr, data );
+        break;
+    case eCastExpr:
+    case eCondExpr:
+        SExpressionMark ( ( void * )( ( const SBinExpr* ) self ) -> left, data );
+        SExpressionMark ( ( void * )( ( const SBinExpr* ) self ) -> right, data );
+        break;
+    case eVectorExpr:
+        VectorForEach ( & ( ( const SVectExpr* ) self ) -> expr, false,
+                        SExpressionMark, data );
+        break;
+    }
+}
+#endif
+
+/* Dump
+ */
+#if SLVL >= 1
+bool CC SExpressionListDump ( void *item, void *data )
+{
+    SDumper *b = data;
+    const SExpression *self = ( const void* ) item;
+
+    SDumperSep ( b );
+    b -> rc = SExpressionDump ( self, b );
+    SDumperSepString ( b, SDumperMode ( b ) == sdmCompact ? "," : ", " );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+rc_t SExpressionBracketListDump ( const Vector *expr, SDumper *b,
+    const char *begin, const char *end )
+{
+    SDumperSepString ( b, begin );
+    if ( VectorDoUntil ( expr, false, SExpressionListDump, b ) )
+        return b -> rc;
+    return SDumperPrint ( b, end );
+}
+
+static
+rc_t STypeExprDump ( const STypeExpr *self, SDumper *b )
+{
+    rc_t rc;
+    if ( self -> fmt != NULL )
+    {
+        rc = SFormatDump ( self -> fmt, b );
+        if ( rc != 0 )
+            return rc;
+
+        if ( self -> dt == NULL && self -> ts == NULL && self -> id == NULL )
+            return 0;
+
+        rc = SDumperWrite ( b, "/", 1 );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    if ( self -> dt != NULL )
+        rc = SDatatypeDump ( self -> dt, b );
+    else if ( self -> ts != NULL )
+        rc = STypesetDump ( self -> ts, b );
+#if SLVL >= 3
+    else if ( self -> id != NULL )
+        rc = SIndirectTypeDump ( self -> id, b );
+#endif
+    else
+        rc = SDumperWrite ( b, "NULL", 4 );
+
+    if ( rc == 0 )
+    {
+        if ( SDumperMode ( b ) == sdmCompact )
+        {
+            if ( self -> dim != NULL )
+                rc = SDumperPrint ( b, "[%E]", self -> dim );
+            else if ( self -> fd . td . dim == 0 )
+                rc = SDumperPrint ( b, "[*]" );
+        }
+        else
+        {
+            if ( self -> dim != NULL )
+                rc = SDumperPrint ( b, " [ %E ]", self -> dim );
+            else if ( self -> fd . td . dim == 0 )
+                rc = SDumperPrint ( b, " [ * ]" );
+        }
+    }
+    
+    return rc;
+}
+
+static
+rc_t SConstExprDump ( const SConstExpr *self, SDumper *b )
+{
+    rc_t rc = 0;
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+    const SDatatype *dt = VSchemaFindTypeid ( b -> schema, self -> td . type_id );
+    uint32_t bits = dt -> size;
+    uint32_t i, dim = SDatatypeIntrinsicDim ( dt );
+    assert ( dim != 0 && ( bits % dim ) == 0 );
+    bits /= dim;
+    dim *= self -> td . dim;
+
+    /* open a vector expression */
+    if ( dt -> domain < ddAscii && dim > 1 )
+    {
+        rc = SDumperPrint ( b, compact ? "[" : "[ " );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    SDumperSepString ( b, "" );
+
+    switch ( dt -> domain )
+    {
+    case ddBool:
+        for ( i = 0; i < dim; ++ i )
+        {
+            rc = SDumperPrint ( b, "\v%s", self -> u . b [ i ] ? "true" : "false" );
+            if ( rc != 0 )
+                return rc;
+            SDumperSepString ( b, compact ? "," : ", " );
+        }
+        break;
+    case ddUint:
+        switch ( bits )
+        {
+        case 8:
+            for ( i = 0; i < dim; ++ i )
+            {
+                rc = SDumperPrint ( b, "\v%u", self -> u . u8 [ i ] );
+                if ( rc != 0 )
+                    return rc;
+                SDumperSepString ( b, compact ? "," : ", " );
+            }
+            break;
+        case 16:
+            for ( i = 0; i < dim; ++ i )
+            {
+                rc = SDumperPrint ( b, "\v%u", self -> u . u16 [ i ] );
+                if ( rc != 0 )
+                    return rc;
+                SDumperSepString ( b, compact ? "," : ", " );
+            }
+            break;
+        case 32:
+            for ( i = 0; i < dim; ++ i )
+            {
+                rc = SDumperPrint ( b, "\v%u", self -> u . u32 [ i ] );
+                if ( rc != 0 )
+                    return rc;
+                SDumperSepString ( b, compact ? "," : ", " );
+            }
+            break;
+        case 64:
+            for ( i = 0; i < dim; ++ i )
+            {
+                rc = SDumperPrint ( b, "\v%lu", self -> u . u64 [ i ] );
+                if ( rc != 0 )
+                    return rc;
+                SDumperSepString ( b, compact ? "," : ", " );
+            }
+            break;
+        }
+        break;
+    case ddInt:
+        switch ( bits )
+        {
+        case 8:
+            for ( i = 0; i < dim; ++ i )
+            {
+                rc = SDumperPrint ( b, "\v%d", self -> u . i8 [ i ] );
+                if ( rc != 0 )
+                    return rc;
+                SDumperSepString ( b, compact ? "," : ", " );
+            }
+            break;
+        case 16:
+            for ( i = 0; i < dim; ++ i )
+            {
+                rc = SDumperPrint ( b, "\v%d", self -> u . i16 [ i ] );
+                if ( rc != 0 )
+                    return rc;
+                SDumperSepString ( b, compact ? "," : ", " );
+            }
+            break;
+        case 32:
+            for ( i = 0; i < dim; ++ i )
+            {
+                rc = SDumperPrint ( b, "\v%d", self -> u . i32 [ i ] );
+                if ( rc != 0 )
+                    return rc;
+                SDumperSepString ( b, compact ? "," : ", " );
+            }
+            break;
+        case 64:
+            for ( i = 0; i < dim; ++ i )
+            {
+                rc = SDumperPrint ( b, "\v%ld", self -> u . i64 [ i ] );
+                if ( rc != 0 )
+                    return rc;
+                SDumperSepString ( b, compact ? "," : ", " );
+            }
+            break;
+        }
+        break;
+    case ddFloat:
+        switch ( bits )
+        {
+        case 32:
+            for ( i = 0; i < dim; ++ i )
+            {
+                rc = SDumperPrint ( b, "\v%f", ( double ) self -> u . f32 [ i ] );
+                if ( rc != 0 )
+                    return rc;
+                SDumperSepString ( b, compact ? "," : ", " );
+            }
+            break;
+        case 64:
+            for ( i = 0; i < dim; ++ i )
+            {
+                rc = SDumperPrint ( b, "\v%f", self -> u . f64 [ i ] );
+                if ( rc != 0 )
+                    return rc;
+                SDumperSepString ( b, compact ? "," : ", " );
+            }
+            break;
+        }
+        break;
+    case ddAscii:
+    {
+        const char *end, *p;
+
+        rc = SDumperWrite ( b, "'", 1 );
+
+    do_ascii:
+        for ( p = self -> u . ascii, end = p + dim; rc == 0 && p < end; )
+        {
+            const char *start = p;
+            while ( p < end && isprint ( * p ) )
+                ++ p;
+            rc = SDumperWrite ( b, start, p - start );
+            if ( p == end )
+                break;
+
+            switch ( * p )
+            {
+            case '\n':
+                rc = SDumperWrite ( b, "\\n", 2 );
+                break;
+            case '\r':
+                rc = SDumperWrite ( b, "\\", 2 );
+                break;
+            case '\t':
+                rc = SDumperWrite ( b, "\\t", 2 );
+                break;
+            default:
+                rc = SDumperPrint ( b, "\\x%x%x", ( * ( uint8_t* ) p ) / 16, * p & 15 );
+            }
+            ++ p;
+        }
+        if ( rc == 0 )
+            rc = SDumperWrite ( b, "'", 1 );
+        return rc;
+    }
+    case ddUnicode:
+    {
+        rc = SDumperWrite ( b, "'", 1 );
+        if ( rc != 0 )
+            return rc;
+
+        if ( bits == 8 )
+            goto do_ascii;
+
+        for ( i = 0; i < dim; ++ i )
+        {
+            char buff [ 8 ];
+            uint32_t ch = ( bits == 16 ) ?
+                ( uint32_t )  self -> u . utf16 [ i ] :
+                self -> u . utf32 [ i ];
+
+            if ( ch >= 128 )
+                sprintf ( buff, "\\u%04x", ch );
+            else if ( isprint ( ( int ) ch ) )
+                buff [ 0 ] = ( char ) ch, buff [ 1 ] = 0;
+            else switch ( ch )
+            {
+            case '\n':
+                sprintf ( buff, "\\n" );
+                break;
+            case '\r':
+                sprintf ( buff, "\\r" );
+                break;
+            case '\t':
+                sprintf ( buff, "\\t" );
+                break;
+            default:
+                sprintf ( buff, "\\x%02x", ch );
+            }
+
+            rc = SDumperPrint ( b, buff );
+            if ( rc != 0 )
+                return rc;
+        }
+        if ( rc == 0 )
+            rc = SDumperWrite ( b, "'", 1 );
+        return rc;
+    }}
+
+    if ( rc == 0 && dim > 1 )
+        rc = SDumperPrint ( b, compact ? "]" : " ]" );
+
+    return rc;
+}
+
+#if SLVL >= 3
+static
+rc_t SFuncExprDump ( const SFuncExpr *self, SDumper *b )
+{
+    rc_t rc;
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+    if ( VectorLength ( & self -> schem ) != 0 )
+    {
+        if ( compact )
+            rc = SExpressionBracketListDump ( & self -> schem, b, "<", ">" );
+        else
+            rc = SExpressionBracketListDump ( & self -> schem, b, "< ", " > " );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    rc = SFunctionDump ( self -> func, b );
+    if ( rc != 0 )
+        return rc;
+
+    rc = SDumperVersion ( b, self -> version_requested ?
+        self -> version : self -> func -> version );
+    if ( rc != 0 )
+        return rc;
+
+    if ( VectorLength ( & self -> pfact ) != 0 )
+    {
+        if ( compact )
+            rc = SExpressionBracketListDump ( & self -> pfact, b, "<", ">" );
+        else
+            rc = SExpressionBracketListDump ( & self -> pfact, b, " < ", " >" );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    if ( VectorLength ( & self -> pfunc ) == 0 )
+        rc = SDumperPrint ( b, compact ? "()" : " ()" );
+    else if ( compact )
+        rc = SExpressionBracketListDump ( & self -> pfunc, b, "(", ")" );
+    else
+        rc = SExpressionBracketListDump ( & self -> pfunc, b, " ( ", " )" );
+
+    return rc;
+}
+#endif
+
+#if SLVL >= 7
+static
+rc_t SPhysEncExprDump ( const SPhysEncExpr *self, SDumper *b )
+{
+    rc_t rc;
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+    if ( VectorLength ( & self -> schem ) != 0 )
+    {
+        if ( compact )
+            rc = SExpressionBracketListDump ( & self -> schem, b, "<", ">" );
+        else
+            rc = SExpressionBracketListDump ( & self -> schem, b, "< ", " > " );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    rc = SPhysicalDump ( self -> phys, b );
+    if ( rc != 0 )
+        return rc;
+
+    if ( self -> version_requested )
+        rc = SDumperVersion ( b, self -> version );
+    else
+        rc = SDumperVersion ( b, self -> phys -> version );
+    if ( rc != 0 )
+        return rc;
+
+    if ( VectorLength ( & self -> pfact ) != 0 )
+    {
+        if ( compact )
+            rc = SExpressionBracketListDump ( & self -> pfact, b, "<", ">" );
+        else
+            rc = SExpressionBracketListDump ( & self -> pfact, b, " < ", " >" );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    return rc;
+}
+#endif
+
+rc_t SExpressionDump ( const SExpression *self, SDumper *b )
+{
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+    if ( self == NULL )
+        return SDumperWrite ( b, "NULL", 4 );
+
+    switch ( self -> var )
+    {
+    case eTypeExpr:
+        return STypeExprDump ( ( const STypeExpr* ) self, b );
+    case eConstExpr:
+        return SConstExprDump ( ( const SConstExpr* ) self, b );
+#if SLVL >= 3
+    case eIndirectExpr:
+    case eParamExpr:
+    case eProdExpr:
+    case eFwdExpr:
+    case eFuncParamExpr:
+    case eColExpr:
+    case ePhysExpr:
+    {
+        const SSymExpr *x = ( const SSymExpr* ) self;
+        if ( x -> alt )
+            return SDumperPrint ( b, "@%N", x -> _sym );
+        return KSymbolDump ( x -> _sym, b );
+    }
+    case eFuncExpr:
+#if SLVL >= 4
+    case eScriptExpr:
+#endif
+        return SFuncExprDump ( ( const SFuncExpr* ) self, b );
+#endif
+#if SLVL >= 7
+    case ePhysEncExpr:
+        return SPhysEncExprDump ( ( const SPhysEncExpr* ) self, b );
+#endif
+    case eNegateExpr:
+    {
+        const SUnaryExpr *x = ( const SUnaryExpr* ) self;
+        return SDumperPrint ( b, "-%E", x -> expr );
+    }
+    case eCastExpr:
+    {
+        const SBinExpr *x = ( const SBinExpr* ) self;
+        return SDumperPrint ( b, compact ? "(%E)%E" : "( %E ) %E", x -> left, x -> right );
+    }
+    case eCondExpr:
+    {
+        const SBinExpr *x = ( const SBinExpr* ) self;
+        return SDumperPrint ( b, compact ? "%E|%E" : "%E | %E", x -> left, x -> right );
+    }
+    case eVectorExpr:
+    {
+        const SVectExpr *x = ( const SVectExpr* ) self;
+        if ( compact )
+            return SExpressionBracketListDump ( & x -> expr, b, "[", "]" );
+        return SExpressionBracketListDump ( & x -> expr, b, "[ ", " ]" );
+    }}
+
+    return SDumperPrint ( b, "EXPR-UNKNOWN" );
+
+}
+
+bool SExpressionVDump ( void *item, void *data )
+{
+    SDumper *b = data;
+    const SExpression *self = ( const void* ) item;
+
+    b -> rc = SExpressionDump ( self, b );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+#endif /* SLVL >= 1 */
+
+
+/*--------------------------------------------------------------------------
+ * STypeExpr
+ */
+
+/* Mark
+ */
+void STypeExprMark ( const STypeExpr *self, const VSchema *schema )
+{
+    if ( self -> fmt != NULL )
+        SFormatMark ( self -> fmt );
+    if ( self -> dt != NULL )
+        SDatatypeMark ( self -> dt );
+    if ( self -> ts != NULL )
+        STypesetMark ( self -> ts, schema );
+    if ( self -> dim )
+        SExpressionMark ( ( void * ) self -> dim, ( void * ) schema );
+}
+
+
+/*--------------------------------------------------------------------------
+ * SSymExpr
+ */
+
+/* Make
+ *  used when creating implicit expressions
+ */
+rc_t SSymExprMake ( const SExpression **xp, const KSymbol *sym, uint32_t var )
+{
+    SSymExpr *x = malloc ( sizeof * x );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    x -> dad . var = var;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> _sym = sym;
+    x -> alt = false;
+
+    * xp = & x -> dad;
+    return 0;
+}
+
+/* Mark
+ */
+void SSymExprMark ( const SSymExpr *self, const VSchema *schema )
+{
+    switch ( self -> _sym -> type )
+    {
+    case eConstant:
+        SConstantMark ( self -> _sym -> u . obj );
+        break;
+    }
+}
+
+
+/*--------------------------------------------------------------------------
+ * SFuncExpr
+ */
+
+/* Mark
+ */
+void SFuncExprMark ( const SFuncExpr *self, const VSchema *schema )
+{
+    SFunctionMark ( ( void * )self -> func, ( void * )schema );
+}
+
+
+/*--------------------------------------------------------------------------
+ * SPhysEncExpr
+ */
+
+/* ImplicitPhysEncExpr
+ *  create expression object
+ */
+rc_t VSchemaImplicitPhysEncExpr ( VSchema *self,
+    VTypedecl *td, const SExpression **expr, const char *text, const char *ctx )
+{
+    KSymTable tbl;
+    rc_t rc = init_symtab ( & tbl, self );
+    if ( rc == 0 )
+    {
+        KToken t;
+        KTokenText tt;
+        KTokenSource src;
+
+        SchemaEnv env;
+        SchemaEnvInit ( & env, EXT_SCHEMA_LANG_VERSION );
+
+        KTokenTextInitCString ( & tt, text, ctx );
+        KTokenSourceInit ( & src, & tt );
+        next_token ( & tbl, & src, & t );
+
+        rc = phys_encoding_expr ( & tbl, & src, & t, & env, self, td, expr );
+
+        KSymTableWhack ( & tbl );
+    }
+    return rc;
+}
+
+/* Mark
+ */
+void SPhysEncExprMark ( const SPhysEncExpr *self, const VSchema *schema )
+{
+    SPhysicalMark ( ( void * )self -> phys, ( void * )schema );
+}
+
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ */
+
+#if SLVL >= 1
+static
+rc_t const_vect_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SVectExpr **xp )
+{
+    rc_t rc;
+    SVectExpr *x = malloc ( sizeof * x );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    x -> dad . var = eVectorExpr;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    VectorInit ( & x -> expr, 0, 16 );
+
+    do
+    {
+        SExpression *vx;
+        rc = const_expr ( tbl, src, next_token ( tbl, src, t ),
+            env, self, ( const SExpression** ) & vx );
+        if ( rc != 0 )
+            break;
+
+        if ( vx -> var == eVectorExpr )
+        {
+            SExpressionWhack ( vx );
+            rc = KTokenExpected ( t, klogErr, "scalar constant" );
+            break;
+        }
+
+        rc = VectorAppend ( & x -> expr, NULL, vx );
+        if ( rc != 0 )
+        {
+            SExpressionWhack ( vx );
+            break;
+        }
+    }
+    while ( t -> id == eComma );
+
+    if ( rc != 0 )
+        SExpressionWhack ( & x -> dad );
+    else
+    {
+        * xp = x;
+        rc = expect ( tbl, src, t, eRightSquare, "]", true );
+    }
+
+    return rc;
+}
+#endif
+
+/*
+ * const-expr         = <constname>
+ *                    | CONST-VALUE
+ */
+#if SLVL >= 1
+static
+rc_t negate_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SExpression **xp )
+{
+    rc_t rc = const_expr ( tbl, src, next_token ( tbl, src, t ), env, self, xp );
+    if ( rc == 0 )
+    {
+        SUnaryExpr *x;
+        SConstExpr *cx;
+        const SSymExpr *sx;
+        const SExpression *td;
+        const SDatatype *dt;
+
+        static atomic32_t s_I8_id;
+        static atomic32_t s_I16_id;
+        static atomic32_t s_I32_id;
+        static atomic32_t s_I64_id;
+
+        switch ( ( * xp ) -> var )
+        {
+        case eConstExpr:
+            cx = * ( SConstExpr** ) xp;
+            if ( cx -> td . dim < 2 )
+            {
+                dt = VSchemaFindTypeid ( self, cx -> td . type_id );
+                if ( dt != NULL ) switch ( dt -> domain )
+                {
+                case vtdUint:
+                    switch ( dt -> size )
+                    {
+                    case 8:
+                        cx -> td . type_id  = VSchemaCacheIntrinsicTypeId ( self, & s_I8_id, "I8" );
+                        break;
+                    case 16:
+                        cx -> td . type_id  = VSchemaCacheIntrinsicTypeId ( self, & s_I16_id, "I16" );
+                        break;
+                    case 32:
+                        cx -> td . type_id  = VSchemaCacheIntrinsicTypeId ( self, & s_I32_id, "I32" );
+                        break;
+                    case 64:
+                        cx -> td . type_id  = VSchemaCacheIntrinsicTypeId ( self, & s_I64_id, "I64" );
+                        break;
+                    }
+                    /* no break */
+                case vtdInt:
+                    switch ( dt -> size )
+                    {
+                    case 8:
+                        cx -> u . i8 [ 0 ] = - cx -> u . i8 [ 0 ];
+                        return 0;
+                    case 16:
+                        cx -> u . i16 [ 0 ] = - cx -> u . i16 [ 0 ];
+                        return 0;
+                    case 32:
+                        cx -> u . i32 [ 0 ] = - cx -> u . i32 [ 0 ];
+                        return 0;
+                    case 64:
+                        cx -> u . i64 [ 0 ] = - cx -> u . i64 [ 0 ];
+                        return 0;
+                    }
+                    break;
+                case vtdFloat:
+                    switch ( dt -> size )
+                    {
+                    case 32:
+                        cx -> u . f32 [ 0 ] = - cx -> u . f32 [ 0 ];
+                        return 0;
+                    case 64:
+                        cx -> u . f64 [ 0 ] = - cx -> u . f64 [ 0 ];
+                        return 0;
+                    }
+                    break;
+                }
+            }
+            break;
+
+        case eIndirectExpr:
+            /* if type is known, at least verify domain */
+            sx = * ( const SSymExpr** ) xp;
+            td = ( ( const SIndirectConst* ) sx -> _sym -> u . obj ) -> td;
+            if ( td != NULL )
+            {
+                const STypeExpr *tx = ( const STypeExpr* ) td;
+                if ( tx-> dad . var == eTypeExpr && tx -> resolved )
+                {
+                    /* cannot have formats, but this is verified elsewhere */
+                    if ( tx -> fd . fmt == 0 && tx -> fd . td . dim < 2 )
+                    {
+                        /* determine domain */
+                        dt = VSchemaFindTypeid ( self, tx -> fd . td . type_id );
+                        if ( dt != NULL ) switch ( dt -> domain )
+                        {
+                        case vtdUint:
+                            KTokenExpected ( t, klogWarn, "signed integer" );
+                        case vtdInt:
+                        case vtdFloat:
+                            goto introduce_negate_expr;
+                        }
+                    }
+                }
+
+                break;
+            }
+
+        introduce_negate_expr:
+            x = malloc ( sizeof * x );
+            if ( x == NULL )
+            {
+                SExpressionWhack ( & sx -> dad );
+                return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+            }
+
+            x -> dad . var = eNegateExpr;
+            atomic32_set ( & x -> dad . refcount, 1 );
+            x -> expr = & sx -> dad;
+            * xp = & x -> dad;
+            return 0;
+
+        case eNegateExpr:
+            /* double negate */
+            x = * ( SUnaryExpr** ) xp;
+            * xp = x -> expr;
+            free ( x );
+            return 0;
+
+        default:
+            SExpressionWhack ( * xp );
+            return KTokenExpected ( t, klogErr, "integer or floating point constant" );
+        }
+
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcType, rcIncorrect );
+        KTokenRCExplain ( t, klogErr, rc );
+    }
+
+    return rc;
+}
+
+static
+rc_t bool_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SConstExpr **xp )
+{
+    static atomic32_t s_bool_id;
+
+    SConstExpr *x = malloc ( sizeof * x - sizeof x -> u + sizeof x -> u . b [ 0 ] );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    assert ( t -> id == kw_true || t -> id == kw_false );
+    x -> u . b [ 0 ] = ( t -> id == kw_true );
+
+    x -> dad . var = eConstExpr;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> td . type_id = VSchemaCacheIntrinsicTypeId ( self, & s_bool_id, "bool" );
+    x -> td . dim = 1;
+
+    * xp = x;
+
+    next_token ( tbl, src, t );
+    return 0;
+}
+
+static
+rc_t uint_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SConstExpr **xp )
+{
+    rc_t rc;
+    static atomic32_t s_U64_id;
+
+    SConstExpr *x = malloc ( sizeof * x - sizeof x -> u + sizeof x -> u . u64 [ 0 ] );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    rc = KTokenToU64 ( t, & x -> u . u64 [ 0 ] );
+    if ( rc != 0 )
+    {
+        free ( x );
+        return rc;
+    }
+
+    x -> dad . var = eConstExpr;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> td . type_id = VSchemaCacheIntrinsicTypeId ( self, & s_U64_id, "U64" );
+    x -> td . dim = 1;
+
+    * xp = x;
+
+    next_token ( tbl, src, t );
+    return 0;
+}
+
+static
+rc_t float_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SConstExpr **xp )
+{
+    rc_t rc;
+    static atomic32_t s_F64_id;
+
+    SConstExpr *x = malloc ( sizeof * x - sizeof x -> u + sizeof x -> u . f64 [ 0 ] );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    rc = KTokenToF64 ( t, & x -> u . f64 [ 0 ] );
+    if ( rc != 0 )
+    {
+        free ( x );
+        return rc;
+    }
+
+    x -> dad . var = eConstExpr;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> td . type_id = VSchemaCacheIntrinsicTypeId ( self, & s_F64_id, "F64" );
+    x -> td . dim = 1;
+
+    * xp = x;
+
+    next_token ( tbl, src, t );
+    return 0;
+}
+
+static
+rc_t string_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SConstExpr **xp )
+{
+    rc_t rc;
+
+    size_t size = t -> str . size + 1;
+    SConstExpr *x = malloc ( sizeof * x - sizeof x -> u + size );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    rc = KTokenToString ( t, x -> u . utf8, size, & size );
+    if ( rc != 0 )
+    {
+        free ( x );
+        return rc;
+    }
+
+    x -> dad . var = eConstExpr;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> td . dim = ( uint32_t ) size;
+
+    if ( t -> id == eString || ( size_t ) string_len ( x -> u . utf8, size ) == size )
+    {
+        static atomic32_t s_ascii_id;
+        x -> td . type_id = VSchemaCacheIntrinsicTypeId ( self, & s_ascii_id, "ascii" );
+    }
+    else
+    {
+        static atomic32_t s_utf8_id;
+        x -> td . type_id = VSchemaCacheIntrinsicTypeId ( self, & s_utf8_id, "utf8" );
+    }
+
+    * xp = x;
+
+    next_token ( tbl, src, t );
+    return 0;
+}
+
+static
+rc_t sym_const_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SConstExpr **xp )
+{
+    const KSymbol *sym = t -> sym;
+    const SConstant *cnst = sym -> u . obj;
+
+    assert ( cnst -> expr != NULL );
+    atomic32_inc ( & ( ( SExpression* ) cnst -> expr ) -> refcount );
+    * xp = ( SConstExpr* ) cnst -> expr;
+
+    next_token ( tbl, src, t );
+    return 0;
+}
+#endif /* SLVL >= 1 */
+
+
+#if SLVL >= 3
+LIB_EXPORT rc_t CC indirect_const_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SExpression **xp )
+{
+    SSymExpr *x = malloc ( sizeof *x );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    x -> dad . var = eIndirectExpr;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> _sym = t -> sym;
+    x -> alt = false;
+    * xp = & x -> dad;
+
+    next_token ( tbl, src, t );
+    return 0;
+}
+#endif /* SLVL >= 1 */
+
+/*
+ * type-expr          = <typeset>
+ *                    | <fmtdecl>
+ *                    | <fmtname> '/' <typeset>
+ */
+#if SLVL >= 1
+static
+rc_t type_expr_impl ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SExpression **fd, bool vardim )
+{
+    STypeExpr *x;
+
+    rc_t rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return rc;
+
+    x = malloc ( sizeof *x );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    x -> dad . var = eTypeExpr;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> fmt = NULL;
+    x -> dt = NULL;
+    x -> ts = NULL;
+    x -> id = NULL;
+    x -> dim = NULL;
+    x -> fd . fmt = 0;
+    x -> fd . td . type_id = 0;
+    x -> fd . td . dim = 0;
+    x -> resolved = true;
+
+    if ( t -> id == eFormat )
+    {
+        x -> fmt = t -> sym -> u . obj;
+        x -> fd . fmt = x -> fmt -> id;
+        if ( next_token ( tbl, src, t ) -> id != eFwdSlash )
+        {
+            * fd = & x -> dad;
+            return 0;
+        }
+
+        rc = next_fqn ( tbl, src, next_token ( tbl, src, t ), env );
+        if ( rc != 0 )
+        {
+            free ( x );
+            return rc;
+        }
+    }
+
+    switch ( t -> id )
+    {
+    case eDatatype:
+        x -> dt = t -> sym -> u . obj;
+        x -> fd . td . type_id = x -> dt -> id;
+        break;
+    case eTypeset:
+        x -> ts = t -> sym -> u . obj;
+        x -> fd . td . type_id = x -> ts -> id;
+        break;
+#if SLVL >= 3
+    case eSchemaType:
+        x -> id = t -> sym -> u . obj;
+        x -> resolved = false;
+        break;
+#endif
+    default:
+        free ( x );
+        return KTokenExpected ( t, klogErr, "datatype or typeset" );
+    }
+
+    if ( next_token ( tbl, src, t ) -> id != eLeftSquare )
+        x -> fd . td . dim = 1;
+    else
+    {
+        if ( next_token ( tbl, src, t ) -> id == eAsterisk && vardim )
+            next_token ( tbl, src, t );
+        else
+        {
+            const SConstExpr *cx;
+
+            rc = const_expr ( tbl, src, t, env, self, & x -> dim );
+            if ( rc != 0 )
+            {
+                free ( x );
+                return rc;
+            }
+
+            switch ( x -> dim -> var )
+            {
+            case eConstExpr:
+                cx =  ( const SConstExpr* ) x -> dim;
+                if ( cx -> td . dim == 1 )
+                {
+                    const SDatatype *dt = VSchemaFindTypeid ( self, cx -> td . type_id );
+                    if ( dt != NULL && SDatatypeIntrinsicDim ( dt ) == 1 )
+                    {
+                        if ( dt -> domain == vtdUint )
+                        {
+                            switch ( dt -> size )
+                            {
+                            case 64:
+                                if ( cx -> u . u64 [ 0 ] <= 0xFFFFFFFF )
+                                    x -> fd . td . dim = ( uint32_t ) cx -> u . u64 [ 0 ];
+                                break;
+                            case 32:
+                                x -> fd . td . dim = cx -> u . u32 [ 0 ];
+                                break;
+                            case 16:
+                                x -> fd . td . dim = cx -> u . u16 [ 0 ];
+                                break;
+                            case 8:
+                                x -> fd . td . dim = cx -> u . u8 [ 0 ];
+                                break;
+                            }
+                        }
+                        else if ( dt -> domain ==  vtdInt )
+                        {
+                            switch ( dt -> size )
+                            {
+                            case 64:
+                                if ( cx -> u . i64 [ 0 ] > 0 && cx -> u . i64 [ 0 ] <= 0xFFFFFFFF )
+                                    x -> fd . td . dim = ( uint32_t ) cx -> u . i64 [ 0 ];
+                                break;
+                            case 32:
+                                if ( cx -> u . i32 [ 0 ] > 0 )
+                                    x -> fd . td . dim = cx -> u . i32 [ 0 ];
+                                break;
+                            case 16:
+                                if ( cx -> u . i16 [ 0 ] > 0 )
+                                    x -> fd . td . dim = cx -> u . i16 [ 0 ];
+                                break;
+                            case 8:
+                                if ( cx -> u . i8 [ 0 ] > 0 )
+                                    x -> fd . td . dim = cx -> u . i8 [ 0 ];
+                                break;
+                            }
+                        }
+
+                        if ( x -> fd . td . dim > 0 )
+                            break;
+                    }
+                }
+
+                SExpressionWhack ( & x -> dad );
+                return KTokenExpected ( t, klogErr, "constant integer expression" );
+
+            case eIndirectExpr:
+                x -> resolved = false;
+                break;
+            default:
+                SExpressionWhack ( & x -> dad );
+                return KTokenExpected ( t, klogErr, "constant integer expression" );
+            }
+        }
+
+        rc = expect ( tbl, src, t, eRightSquare, "]", true );
+        if ( rc != 0 )
+        {
+            SExpressionWhack ( & x -> dad );
+            return rc;
+        }
+    }
+    
+    * fd = & x -> dad;
+    return 0;
+}
+
+rc_t type_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SExpression **fd )
+{
+    return type_expr_impl ( tbl, src, t, env, self, fd, false );
+}
+
+rc_t vardim_type_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SExpression **fd )
+{
+    return type_expr_impl ( tbl, src, t, env, self, fd, true );
+}
+#endif /* SLVL >= 1 */
+
+
+/*
+ * cast_expr          = '(' <type-expr> ')' <expression>
+ */
+#if SLVL >= 1
+static
+rc_t cast_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SBinExpr **xp,
+    rc_t ( * expr ) ( KSymTable*, KTokenSource*, KToken*,
+        const SchemaEnv*, VSchema*, const SExpression** ) )
+{
+    rc_t rc;
+    SBinExpr *x = malloc ( sizeof * x );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    rc = type_expr ( tbl, src, next_token ( tbl, src, t ), env, self, & x -> left );
+    if ( rc == 0 )
+    {
+        rc = expect ( tbl, src, t, eRightParen, ")", true );
+        if ( rc == 0 )
+        {
+            rc = ( * expr ) ( tbl, src, t, env, self, & x -> right );
+            if ( rc == 0 )
+            {
+                x -> dad . var = eCastExpr;
+                atomic32_set ( & x -> dad . refcount, 1 );
+                * xp = x;
+                return 0;
+            }
+        }
+
+        SExpressionWhack ( x -> left );
+    }
+
+    free ( x );
+    return rc;
+}
+
+
+rc_t const_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, const SExpression **xp )
+{
+    switch ( t -> id )
+    {
+    case eDecimal:
+    case eHex:
+    case eOctal:
+        return uint_expr ( tbl, src, t, env, self, ( const SConstExpr** ) xp );
+    case eFloat:
+    case eExpFloat:
+        return float_expr ( tbl, src, t, env, self, ( const SConstExpr** ) xp );
+    case eString:
+    case eEscapedString:
+        return string_expr ( tbl, src, t, env, self, ( const SConstExpr** ) xp );
+    case eConstant:
+        return sym_const_expr ( tbl, src, t, env, self, ( const SConstExpr** ) xp );
+#if SLVL >= 4
+    case eFactParam:
+#endif
+#if SLVL >= 3
+    case eSchemaParam:
+        return indirect_const_expr ( tbl, src, t, env, self, xp );
+#endif
+    case eLeftSquare:
+        return const_vect_expr ( tbl, src, t, env, self, ( const SVectExpr** ) xp );
+    case kw_false:
+    case kw_true:
+        return bool_expr ( tbl, src, t, env, self, ( const SConstExpr** ) xp );
+    case eLeftParen:
+        return cast_expr ( ( KSymTable* ) tbl, src, t, env,
+            ( VSchema* ) self, ( const SBinExpr** ) xp,
+            ( rc_t ( * ) ( KSymTable*, KTokenSource*, KToken*,
+              const SchemaEnv*, VSchema*, const SExpression** ) ) const_expr );
+    case eMinus:
+        /* unary minus sign */
+        return negate_expr ( tbl, src, t, env, self, xp );
+    case ePlus:
+        /* unary plus sign */
+        return const_expr ( tbl, src, next_token ( tbl, src, t ), env, self, xp );
+    }
+
+    return KTokenExpected ( t, klogErr, "boolean, integer, float, string or symbolic constant" );
+}
+#endif /* SLVL >= 1 */
+
+
+/*
+ * func-param-expr    = <funcname>
+ */
+#if SLVL >= 4
+static
+rc_t sym_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SSymExpr **xp, uint32_t var, bool alt )
+{
+    SSymExpr *x = malloc ( sizeof * x );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    x -> dad . var = var;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> _sym = t -> sym;
+    x -> alt = alt;
+    * xp = x;
+
+    next_token ( tbl, src, t );
+    return 0;
+}
+
+#define func_param_expr( tbl, src, t, env, self, xp ) \
+    sym_expr ( tbl, src, t, env, self, xp, eFuncParamExpr, false )
+
+#endif
+
+
+/*
+ * param-expr         = <func-param>
+ * 
+ */
+#if SLVL >= 4
+
+#define param_expr( tbl, src, t, env, self, xp ) \
+    sym_expr ( tbl, src, t, env, self, xp, eParamExpr, false )
+
+#endif
+
+
+/*
+ * prod-expr          = <production>
+ * 
+ */
+#if SLVL >= 4
+
+#define prod_expr( tbl, src, t, env, self, xp ) \
+    sym_expr ( tbl, src, t, env, self, xp, eProdExpr, false )
+
+#endif
+
+
+/*
+ * fwd-expr           = ID
+ */
+#if SLVL >= 4
+static
+rc_t fwd_decl_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SSymExpr **xp, bool alt )
+{
+    rc_t rc;
+    SSymExpr *x = malloc ( sizeof * x );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    rc = KSymTableCreateConstSymbol ( tbl, & x -> _sym, & t -> str, eForward, NULL );
+    if ( rc != 0 )
+    {
+        free ( x );
+        return rc;
+    }
+
+    x -> dad . var = eFwdExpr;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> alt = alt;
+    * xp = x;
+
+    next_token ( tbl, src, t );
+    return 0;
+}
+
+#define fwd_ref_expr( tbl, src, t, env, self, xp, alt ) \
+    sym_expr ( tbl, src, t, env, self, xp, eFwdExpr, alt )
+
+#endif
+
+
+/*
+ * column-expr        = <column>
+ */
+#if SLVL >= 8
+
+#define column_expr( tbl, src, t, env, self, xp, alt ) \
+    sym_expr ( tbl, src, t, env, self, xp, eColExpr, alt )
+
+#endif
+
+
+/*
+ * physical-expr      = KCOL
+ */
+#if SLVL >= 7
+
+#define physical_expr( tbl, src, t, env, self, xp ) \
+    sym_expr ( tbl, src, t, env, self, xp, ePhysExpr, false )
+
+#endif
+
+
+/*
+ * schema-parms       = <schema-param> [ ',' <schema-parms> ]
+ * schema-param       = [ ID '=' ]  <schema-value>
+ * schema-value       = <fmtdecl>
+ *                    | <uint-expr>
+ */
+#if SLVL >= 4
+static
+rc_t schema_value ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SExpression **v )
+{
+    /* could be a typename */
+    if ( t -> id == eNamespace )
+    {
+        rc_t rc = next_fqn ( tbl, src, t, env );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* param value */
+    switch ( t -> id )
+    {
+    /* type parameter */
+    case eFormat:
+    case eDatatype:
+    case eTypeset:
+    case eSchemaType:
+        return type_expr ( tbl, src, t, env, self, v );
+
+    /* manifest uint constant */
+    case eDecimal:
+    case eHex:
+    case eOctal:
+        return uint_expr ( tbl, src, t, env, self, ( const SConstExpr** ) v );
+
+    /* symbolic constant must be uint */
+    case eConstant:
+        return sym_const_expr ( tbl, src, t, env, self, ( const SConstExpr** ) v );
+
+    /* schema or factory constant must be uint
+       but may not yet be completely resolved */
+    case eSchemaParam:
+    case eFactParam:
+        return indirect_const_expr ( tbl, src, t, env, self, v );
+    }
+
+    return KTokenExpected ( t, klogErr, "data type or unsigned int constant" );
+}
+#endif
+
+/*
+ * fact-parms         = <fact-param> [ ',' <fact-parms> ]
+ * fact-param         = [ ID '=' ] <fact-value>
+ * fact-value         = <func-name>
+ *                    | '[' <fact-const-list> ']'
+ */
+#if SLVL >= 4
+static
+rc_t fact_value ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SExpression **v )
+{
+    if ( t -> id == eNamespace )
+    {
+        rc_t rc = next_fqn ( tbl, src, t, env );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    switch ( t -> id )
+    {
+        /* const-expression */
+    case eDecimal:
+    case eHex:
+    case eOctal:
+        return uint_expr ( tbl, src, t, env, self, ( const SConstExpr** ) v );
+    case eFloat:
+    case eExpFloat:
+        return float_expr ( tbl, src, t, env, self, ( const SConstExpr** ) v );
+    case eString:
+    case eEscapedString:
+        return string_expr ( tbl, src, t, env, self, ( const SConstExpr** ) v );
+    case eConstant:
+        return sym_const_expr ( tbl, src, t, env, self, ( const SConstExpr** ) v );
+    case eSchemaParam:
+    case eFactParam:
+        return indirect_const_expr ( tbl, src, t, env, self, v );
+    case eLeftSquare:
+        return const_vect_expr ( tbl, src, t, env, self, ( const SVectExpr** ) v );
+    case kw_false:
+    case kw_true:
+        return bool_expr ( tbl, src, t, env, self, ( const SConstExpr** ) v );
+
+        /* cast expression */
+    case eLeftParen:
+        return cast_expr ( tbl, src, t, env, self, ( const SBinExpr** ) v, fact_value );
+
+        /* function name */
+    case eFunction:
+        return func_param_expr ( tbl, src, t, env, self, ( const SSymExpr** ) v );
+
+    case eMinus:
+        /* unary minus sign */
+        return negate_expr ( tbl, src, t, env, self, v );
+    case ePlus:
+        /* unary plus sign */
+        return const_expr ( tbl, src, next_token ( tbl, src, t ), env, self, v );
+    }
+
+    return KTokenExpected ( t, klogErr, "constant, function param or cast operator" );
+}
+
+static
+rc_t old_fact_value ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SExpression **v )
+{
+    switch ( t -> id )
+    {
+        /* const-expression */
+    case eDecimal:
+    case eHex:
+    case eOctal:
+        return uint_expr ( tbl, src, t, env, self, ( const SConstExpr** ) v );
+    case eFloat:
+    case eExpFloat:
+        return float_expr ( tbl, src, t, env, self, ( const SConstExpr** ) v );
+    case eString:
+    case eEscapedString:
+        return string_expr ( tbl, src, t, env, self, ( const SConstExpr** ) v );
+    case eMinus:
+        return negate_expr ( tbl, src, t, env, self, v );
+    case ePlus:
+        return old_fact_value ( tbl, src, next_token ( tbl, src, t ), env, self, v );
+    }
+
+    return RC ( rcVDB, rcSchema, rcParsing, rcNoObj, rcNoErr );
+}
+#endif
+
+/*
+ *    func-parms         = <func-param> [ ',' <func-parms> ]
+ *    func-param         = <colname>
+ *                       | <physname>
+ *                       | <production>
+ *                       | <parmname>
+ */
+#if SLVL >= 4
+static
+rc_t param_value ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SExpression **v )
+{
+    KToken t2;
+    bool alt = false;
+
+    /* look for special modifiers */
+    switch ( t -> id )
+    {
+#if SLVL >= 7
+    case ePeriod:
+        /* detect special syntax for physical column names */
+        physical_name ( tbl, src, t, env );
+        break;
+#endif
+    case eAtSign:
+
+        /* detect alternate column source */
+        switch ( next_token ( tbl, src, & t2 ) -> id )
+        {
+#if SLVL >= 8
+        case eColumn:
+#endif
+        case eIdent:
+        case eForward:
+        case eVirtual:
+            * t = t2;
+            alt = true;
+            break;
+
+        default:
+            KTokenSourceReturn ( src, & t2 );
+        }
+        break;
+    }
+
+    switch ( t -> id )
+    {
+    /* handle function or script params, named productions */
+#if SLVL >= 5
+    case eAtSign:
+        t -> sym = KSymTableFind ( tbl, & t -> str );
+        if ( t -> sym == NULL )
+            break;
+        t -> id = t -> sym -> type;
+        /* no break */
+#endif
+    case eFuncParam:
+        return param_expr ( tbl, src, t, env, self, ( const SSymExpr** ) v );
+    case eProduction:
+        return prod_expr ( tbl, src, t, env, self, ( const SSymExpr** ) v );
+
+    /* forward reference */
+    case eIdent:
+        return fwd_decl_expr ( tbl, src, t, env, self, ( const SSymExpr** ) v, alt );
+    case eForward:
+    case eVirtual:
+        return fwd_ref_expr ( tbl, src, t, env, self, ( const SSymExpr** ) v, alt );
+#if SLVL >= 8
+    /* column expression */
+    case eColumn:
+        return column_expr ( tbl, src, t, env, self, ( const SSymExpr** ) v, alt );
+#endif
+#if SLVL >= 7
+    /* physical column expression */
+    case ePhysMember:
+        return physical_expr ( tbl, src, t, env, self, ( const SSymExpr** ) v );
+#endif
+    /* cast expression */
+    case eLeftParen:
+        return cast_expr ( tbl, src, t, env, self, ( const SBinExpr** ) v, param_value );
+    }
+
+    return KTokenExpected ( t, klogErr, "column or production name or cast operator" );
+}
+
+static
+rc_t param_list ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, Vector *v,
+    rc_t ( * value ) ( KSymTable*, KTokenSource*, KToken*,
+        const SchemaEnv*, VSchema*, const SExpression** ) )
+{
+    rc_t rc;
+    const SExpression *x;
+
+    while ( 1 )
+    {
+        /* param value */
+        rc = ( * value ) ( tbl, src, t, env, self, & x );
+        if ( rc != 0 )
+            return rc;
+
+        /* record parameter */
+        rc = VectorAppend ( v, NULL, x );
+        if ( rc != 0 )
+        {
+            SExpressionWhack ( x );
+            return KTokenRCExplain ( t, klogInt, rc );
+        }
+
+        if ( t -> id != eComma )
+            break;
+
+        next_token ( tbl, src, t );
+    }
+
+    return 0;
+}
+
+static
+rc_t func_expression ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFuncExpr *fx, const KSymbol **sym )
+{
+    rc_t rc;
+
+    /* schema-parms */
+    if ( t -> id == eLeftAngle )
+    {
+        next_token ( tbl, src, t );
+        rc = param_list ( tbl, src, t, env, self, & fx -> schem, schema_value );
+        if ( rc == 0 )
+            rc = expect ( tbl, src, t, eRightAngle, ">", true );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* locate function or schema */
+    rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return rc;
+
+    if ( t -> id != eScriptFunc && t -> id != eFunction )
+        return KTokenExpected ( t, klogErr, "function" );
+    * sym = t -> sym;
+
+    /* look for requested version */
+    if ( next_token ( tbl, src, t ) -> id == eHash )
+    {
+        fx -> version_requested = true;
+        rc = maj_min_rel ( tbl, src, next_token ( tbl, src, t ),
+            env, self,  & fx -> version, false );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* look for factory params */
+    if ( t -> id == eLeftAngle && ! env -> mixed_fact_param_list )
+    {
+        next_token ( tbl, src, t );
+        rc = param_list ( tbl, src, t, env, self, & fx -> pfact, fact_value );
+        if ( rc == 0 )
+            rc = expect ( tbl, src, t, eRightAngle, ">", true );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* function params */
+    if ( t -> id != eLeftParen )
+        return KTokenExpected ( t, klogErr, "(" );
+    if ( next_token ( tbl, src, t ) -> id != eRightParen )
+    {
+        /* handle old-style fact params */
+        if ( env -> mixed_fact_param_list )
+        {
+            rc = param_list ( tbl, src, t, env, self, & fx -> pfact, old_fact_value );
+            if ( GetRCState ( rc ) == rcNoErr )
+                rc = 0;
+        }
+
+        /* handle normal function params */
+        if ( rc == 0 )
+            rc = param_list ( tbl, src, t, env, self, & fx -> pfunc, param_value );
+    }
+    if ( rc == 0 )
+        rc = expect ( tbl, src, t, eRightParen, ")", true );
+
+    return rc;
+}
+
+static
+rc_t func_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SFuncExpr **xp )
+{
+    rc_t rc;
+    const KSymbol *sym = NULL;
+
+    SFuncExpr *fx = malloc ( sizeof * fx );
+    if ( fx == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    /* initialize */
+    fx -> dad . var = eFuncExpr;
+    atomic32_set ( & fx -> dad . refcount, 1 );
+    fx -> func = NULL;
+    VectorInit ( & fx -> schem, 0, 4 );
+    VectorInit ( & fx -> pfact, 0, 8 );
+    VectorInit ( & fx -> pfunc, 0, 8 );
+    fx -> version = 0;
+    fx -> version_requested = false;
+    fx -> untyped = false;
+
+    /* parse expression */
+    rc = func_expression ( tbl, src, t, env, self, fx, & sym );
+    if ( rc == 0 )
+    {
+        const SNameOverload *vf = sym -> u . obj;
+
+        /* match expression */
+        if ( vf -> name -> type == eScriptFunc )
+            fx -> dad . var = eScriptExpr;
+
+        if ( fx -> version_requested )
+        {
+            fx -> func =
+                VectorFind ( & vf -> items, & fx -> version, NULL, SFunctionCmp );
+        }
+        else
+        {
+            fx -> func = VectorLast ( & vf -> items );
+        }
+
+        * xp = fx;
+        return 0;
+    }
+
+    SExpressionWhack ( & fx -> dad );
+    return rc;
+}
+#endif /* SLVL >= 4 */
+
+/*
+ * expression         = <param-value>
+ *                    | <func-expr>
+ *                    | '(' <type-expr> ')' <expression>
+ */
+#if SLVL >= 4
+rc_t expression ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SExpression **xp )
+{
+    rc_t rc;
+
+    if ( t -> id == eNamespace )
+    {
+        rc = next_fqn ( tbl, src, t, env );
+        if ( rc != 0 )
+            return rc;
+    }
+
+#if SLVL >= 7
+    /* detect special syntax for physical column names */
+    if ( t -> id == ePeriod )
+        physical_name ( tbl, src, t, env );
+#endif
+
+    switch ( t -> id )
+    {
+    /* handle function or script params, named productions */
+#if SLVL >= 5
+    case eAtSign:
+        t -> sym = KSymTableFind ( tbl, & t -> str );
+        if ( t -> sym == NULL )
+            break;
+        t -> id = t -> sym -> type;
+        /* no break */
+#endif
+    case eFuncParam:
+        return param_expr ( tbl, src, t, env, self, ( const SSymExpr** ) xp );
+    case eProduction:
+        return prod_expr ( tbl, src, t, env, self, ( const SSymExpr** ) xp );
+
+    /* forward reference */
+    case eIdent:
+        return fwd_decl_expr ( tbl, src, t, env, self, ( const SSymExpr** ) xp, false );
+    case eForward:
+    case eVirtual:
+        return fwd_ref_expr ( tbl, src, t, env, self, ( const SSymExpr** ) xp, false );
+#if SLVL >= 8
+    /* column expression */
+    case eColumn:
+        return column_expr ( tbl, src, t, env, self, ( const SSymExpr** ) xp, false );
+#endif
+#if SLVL >= 7
+    /* physical column expression */
+    case ePhysMember:
+        return physical_expr ( tbl, src, t, env, self, ( const SSymExpr** ) xp );
+#endif
+    /* function expression */
+    case eLeftAngle:
+    case eFunction:
+    case eScriptFunc:
+        return func_expr ( tbl, src, t, env, self, ( const SFuncExpr** ) xp );
+
+    /* cast expression */
+    case eLeftParen:
+        return cast_expr ( tbl, src, t, env, self,
+            ( const SBinExpr** ) xp, expression );
+
+    /* type expression */
+    case eFormat:
+    case eDatatype:
+    case eTypeset:
+    case eSchemaType:
+        return type_expr ( tbl, src, t, env, self, xp );
+
+    /* in case expression gets used for const-expression */
+    case eDecimal:
+    case eHex:
+    case eOctal:
+        return uint_expr ( tbl, src, t, env, self, ( const SConstExpr** ) xp );
+    case eFloat:
+    case eExpFloat:
+        return float_expr ( tbl, src, t, env, self, ( const SConstExpr** ) xp );
+    case eString:
+    case eEscapedString:
+        return string_expr ( tbl, src, t, env, self, ( const SConstExpr** ) xp );
+    case eConstant:
+        return sym_const_expr ( tbl, src, t, env, self, ( const SConstExpr** ) xp );
+    case eSchemaParam:
+    case eFactParam:
+        return indirect_const_expr ( tbl, src, t, env, self, xp );
+    case eLeftSquare:
+        return const_vect_expr ( tbl, src, t, env, self, ( const SVectExpr** ) xp );
+    case kw_false:
+    case kw_true:
+        return bool_expr ( tbl, src, t, env, self, ( const SConstExpr** ) xp );
+
+    case eMinus:
+        /* unary minus sign */
+        return negate_expr ( tbl, src, t, env, self, xp );
+    case ePlus:
+        /* unary plus sign */
+        return const_expr ( tbl, src, next_token ( tbl, src, t ), env, self, xp );
+    }
+
+    return KTokenExpected ( t, klogErr, "production name, column name, function or cast expression" );
+}
+#endif /* SLVL >= 4 */
+
+
+/*
+ * cond-expr          = <expression> [ '|' <cond-expr> ]
+ */
+#if SLVL >= 4
+rc_t cond_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SExpression **xp )
+{
+    rc_t rc = expression ( tbl, src, t, env, self, xp );
+    if ( rc != 0 )
+        return rc;
+
+    if ( t -> id == ePipe )
+    {
+        SBinExpr *x = malloc ( sizeof * x );
+        if ( x == NULL )
+        {
+            SExpressionWhack ( * xp ), * xp = NULL;
+            return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        }
+
+        x -> dad . var = eCondExpr;
+        atomic32_set ( & x -> dad . refcount, 1 );
+        x -> left = * xp;
+        x -> right = NULL;
+        * xp = & x -> dad;
+
+        rc = cond_expr ( tbl, src, next_token ( tbl, src, t ), env, self, & x -> right );
+        if ( rc != 0 )
+        {
+            SExpressionWhack ( & x -> dad );
+            * xp = NULL;
+        }
+    }
+
+    return rc;
+}
+#endif /* SLVL >= 4 */
+
+/*
+ * untyped-expr       = <fmtdecl> | <untyped-func-name> '(' ')'
+ */
+#if SLVL >= 6
+static
+rc_t untyped_func_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SFuncExpr **xp )
+{
+    rc_t rc;
+    const KSymbol *sym = t -> sym;
+
+    /* expect empty parameter list */
+    next_token ( tbl, src, t );
+    rc = expect ( tbl, src, t, eLeftParen, "(", true );
+    if ( rc == 0 )
+        rc = expect ( tbl, src, t, eRightParen, ")", true );
+    if ( rc == 0 )
+    {
+        const SNameOverload *vf = sym -> u . obj;
+
+        SFuncExpr *fx = malloc ( sizeof * fx );
+        if ( fx == NULL )
+            return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+        /* initialize */
+        fx -> dad . var = eFuncExpr;
+        atomic32_set ( & fx -> dad . refcount, 1 );
+        VectorInit ( & fx -> schem, 0, 4 );
+        VectorInit ( & fx -> pfact, 0, 8 );
+        VectorInit ( & fx -> pfunc, 0, 8 );
+        fx -> version = 0;
+        fx -> version_requested = false;
+        fx -> untyped = true;
+
+        fx -> func = VectorLast ( & vf -> items );
+
+        * xp = fx;
+        return 0;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC untyped_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, const SExpression **xp )
+{
+    rc_t rc;
+
+    if ( t -> id == eNamespace )
+    {
+        rc = next_fqn ( tbl, src, t, env );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    switch ( t -> id )
+    {
+    /* function expression */
+    case eUntypedFunc:
+        return untyped_func_expr ( tbl, src, t, env, self, ( const SFuncExpr** ) xp );
+
+    /* type expression */
+    case eFormat:
+        return type_expr ( tbl, src, t, env, self, xp );
+    }
+
+    return KTokenExpected ( t, klogErr, "type or function expression" );
+}
+#endif /* SLVL >= 6 */
+
+
+/*
+ * phys-encoding-expr = [ '<' <schema-parms> '>' ]
+ *                      <phys-encoding-name> [ '#' <maj-min-rel> ]
+ *                      [ '<' <fact-params> '>' ]
+ */
+#if SLVL >= 7
+static
+rc_t phys_enc_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SPhysEncExpr *x, const KSymbol **sym )
+{
+    rc_t rc;
+
+    /* schema parms */
+    if ( t -> id == eLeftAngle )
+    {
+        next_token ( tbl, src, t );
+        rc = param_list ( tbl, src, t, env, self, & x -> schem, schema_value );
+        if ( rc == 0 )
+            rc = expect ( tbl, src, t, eRightAngle, ">", true );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* phys-encoding-name */
+    rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return rc;
+
+    if ( t -> id != ePhysical )
+        return KTokenExpected ( t, klogErr, "physical encoding" );
+    * sym = t -> sym;
+
+
+    /* look for requested version */
+    if ( next_token ( tbl, src, t ) -> id == eHash )
+    {
+        x -> version_requested = true;
+        rc = maj_min_rel ( tbl, src, next_token ( tbl, src, t ),
+            env, self,  & x -> version, false );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* look for factory params */
+    if ( t -> id == eLeftAngle )
+    {
+        next_token ( tbl, src, t );
+        rc = param_list ( tbl, src, t, env, self, & x -> pfact, fact_value );
+        if ( rc == 0 )
+            rc = expect ( tbl, src, t, eRightAngle, ">", true );
+    }
+
+    return rc;
+}
+
+rc_t phys_encoding_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, VTypedecl *td, const SExpression **xp )
+{
+    rc_t rc;
+    const KSymbol *sym = NULL;
+
+    SPhysEncExpr *x = malloc ( sizeof * x );
+    if ( x == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    /* initialize */
+    x -> dad . var = ePhysEncExpr;
+    atomic32_set ( & x -> dad . refcount, 1 );
+    x -> phys = NULL;
+    VectorInit ( & x -> schem, 0, 4 );
+    VectorInit ( & x -> pfact, 0, 8 );
+    x -> version = 0;
+    x -> version_requested = false;
+
+    /* parse expression */
+    rc = phys_enc_expr ( tbl, src, t, env, self, x, & sym );
+    if ( rc == 0 )
+    {
+        const SNameOverload *name = sym -> u . obj;
+
+        if ( x -> version_requested )
+        {
+            x -> phys =
+                VectorFind ( & name -> items, & x -> version, NULL, SPhysicalCmp );
+        }
+        else
+        {
+            x -> phys = VectorLast ( & name -> items );
+        }
+
+        /* evaluate type expression */
+        if ( td != NULL )
+        {
+            /* bind schema parameters */
+            Vector prior, cx_bind;
+            VectorInit ( & cx_bind, 1, self -> num_indirect ? self -> num_indirect : 16 );
+            rc = SPhysicalBindSchemaParms ( x -> phys, & prior, & x -> schem, & cx_bind );
+            if ( rc == 0 )
+            {
+                const SExpression *tx = x -> phys -> td;
+                assert ( tx != NULL );
+                rc = STypeExprResolveAsTypedecl ( ( const STypeExpr* ) tx, self, td, & cx_bind );
+                SPhysicalRestSchemaParms ( x -> phys, & prior, & cx_bind );
+            }
+            VectorWhack ( & cx_bind, NULL, NULL );
+        }
+
+        if ( rc == 0 )
+        {
+            * xp = & x -> dad;
+            return 0;
+        }
+    }
+
+    SExpressionWhack ( & x -> dad );
+    return rc;
+}
+#endif
diff --git a/libs/vdb/schema-expr.h b/libs/vdb/schema-expr.h
new file mode 100644
index 0000000..b815890
--- /dev/null
+++ b/libs/vdb/schema-expr.h
@@ -0,0 +1,396 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_schema_expr_
+#define _h_schema_expr_
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_vdb_xform_
+#include <vdb/xform.h>
+#endif
+
+#ifndef _h_atomic32_
+#include <atomic32.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KSymbol;
+struct VSchema;
+struct SFormat;
+struct SDatatype;
+struct STypeset;
+struct SIndirectType;
+struct SPhysical;
+struct SDumper;
+
+
+/*--------------------------------------------------------------------------
+ * SExpression
+ *  supertype of all expressions
+ */
+enum
+{
+    /* a type expression */
+    eTypeExpr,
+
+    /* constant or indirect constant expr */
+    eConstExpr, eIndirectExpr,
+
+    /* functional param, schema or table production */
+    eParamExpr, eProdExpr, eFwdExpr,
+
+    /* a function passed as a parameter */
+    eFuncParamExpr,
+
+    /* extern or physical column expression */
+    eColExpr, ePhysExpr,
+
+    /* functional expression */
+    eFuncExpr, eScriptExpr,
+
+    /* physical encoding expression */
+    ePhysEncExpr,
+
+    /* cast operator expression */
+    eCastExpr,
+
+    /* unary negation */
+    eNegateExpr,
+
+    /* conditional expression */
+    eCondExpr,
+
+    /* vector expression */
+    eVectorExpr
+};
+
+typedef struct SExpression SExpression;
+struct SExpression
+{
+    uint32_t var;
+
+    /* this could be KRefcount */
+    atomic32_t refcount;
+};
+
+/* Whack
+ */
+void SExpressionWhack ( const SExpression *self );
+void CC SExpressionVWhack ( void *item, void *ignore );
+
+/* Mark
+ */
+void CC SExpressionMark ( void * item, void * data );
+
+/* Dump
+ */
+rc_t SExpressionDump ( const SExpression *self, struct SDumper *d );
+bool SExpressionVDump ( void *item, void *dumper );
+bool CC SExpressionListDump ( void *item, void *dumper );
+rc_t SExpressionBracketListDump ( const Vector *expr, struct SDumper *d,
+    const char *begin, const char *end );
+
+
+/*--------------------------------------------------------------------------
+ * STypeExpr
+ *  handles general form of what has been called a typedecl,
+ *  with an optional blob format, type, typeset, indirect type,
+ *  and a const dimension expression.
+ *
+ *  when properly resolved, "fd" contains runtime values
+ */
+typedef struct STypeExpr STypeExpr;
+struct STypeExpr
+{
+    SExpression dad;
+
+    struct SFormat const *fmt;
+    struct SDatatype const *dt;
+    struct STypeset const *ts;
+    struct SIndirectType const *id;
+    const SExpression *dim;
+
+    VFormatdecl fd;
+    bool resolved;
+};
+
+
+/* Resolve
+ *  resolve type expression to either a VTypedecl or VFormatdecl
+ */
+rc_t STypeExprResolveAsTypedecl ( const STypeExpr *self,
+    struct VSchema const *schema, VTypedecl *td, Vector *cx_bind );
+rc_t STypeExprResolveAsFormatdecl ( const STypeExpr *self,
+    struct VSchema const *schema, VFormatdecl *fd, Vector *cx_bind );
+
+/* Mark
+ */
+void STypeExprMark ( const STypeExpr *self, struct VSchema const *schema );
+
+
+/*--------------------------------------------------------------------------
+ * SConstExpr
+ *  handles a vector of constant values
+ *  evaluated from manifest or direct symbolic constants
+ *
+ *  "td" holds both an appropriate constant type
+ *  as well as vector dimension
+ *
+ *  when td.type_id is utf8, dim gives
+ *  the number of bytes rather than characters.
+ */
+typedef struct SConstExpr SConstExpr;
+struct SConstExpr
+{
+    SExpression dad;
+
+    VTypedecl td;
+    union
+    {
+        /* bool */
+        bool b [ 8 ];
+
+        /* integer */
+        int8_t i8 [ 8 ];
+        int16_t i16 [ 4 ];
+        int32_t i32 [ 2 ];
+        int64_t i64 [ 1 ];
+
+        /* unsigned integer */
+        uint8_t u8 [ 8 ];
+        uint16_t u16 [ 4 ];
+        uint32_t u32 [ 2 ];
+        uint64_t u64 [ 1 ];
+
+        /* float */
+        float f32 [ 2 ];
+        double f64 [ 1 ];
+
+        /* ascii */
+        char ascii [ 8 ];
+
+        /* unicode */
+        char utf8 [ 8 ];
+        uint16_t utf16 [ 4 ];
+        uint32_t utf32 [ 2 ];
+
+    } u;
+};
+
+
+/* Resolve
+ *  return constant expression as a vector of indicated type
+ */
+rc_t SConstExprResolveAsBool ( const SConstExpr *self,
+    struct VSchema const *schema, bool *b, uint32_t capacity );
+rc_t SConstExprResolveAsI8 ( const SConstExpr *self,
+    struct VSchema const *schema, int8_t *i8, uint32_t capacity );
+rc_t SConstExprResolveAsI16 ( const SConstExpr *self,
+    struct VSchema const *schema, int16_t *i16, uint32_t capacity );
+rc_t SConstExprResolveAsI32 ( const SConstExpr *self,
+    struct VSchema const *schema, int32_t *i32, uint32_t capacity );
+rc_t SConstExprResolveAsI64 ( const SConstExpr *self,
+    struct VSchema const *schema, int64_t *i64, uint32_t capacity );
+rc_t SConstExprResolveAsU8 ( const SConstExpr *self,
+    struct VSchema const *schema, uint8_t *u8, uint32_t capacity );
+rc_t SConstExprResolveAsU16 ( const SConstExpr *self,
+    struct VSchema const *schema, uint16_t *u16, uint32_t capacity );
+rc_t SConstExprResolveAsU32 ( const SConstExpr *self,
+    struct VSchema const *schema, uint32_t *u32, uint32_t capacity, Vector *cx_bind );
+rc_t SConstExprResolveAsU64 ( const SConstExpr *self,
+    struct VSchema const *schema, uint32_t *u64, uint32_t capacity );
+rc_t SConstExprResolveAsF32 ( const SConstExpr *self,
+    struct VSchema const *schema, float *f32, uint32_t capacity );
+rc_t SConstExprResolveAsF64 ( const SConstExpr *self,
+    struct VSchema const *schema, double *f64, uint32_t capacity );
+rc_t SConstExprResolveAsAscii ( const SConstExpr *self,
+    struct VSchema const *schema, char *ascii, size_t capacity );
+rc_t SConstExprResolveAsUTF8 ( const SConstExpr *self,
+    struct VSchema const *schema, char *utf8, size_t bytes );
+rc_t SConstExprResolveAsUTF16 ( const SConstExpr *self,
+    struct VSchema const *schema, uint16_t *utf16, uint32_t capacity );
+rc_t SConstExprResolveAsUTF32 ( const SConstExpr *self,
+    struct VSchema const *schema, uint32_t *utf32, uint32_t capacity );
+
+
+/*--------------------------------------------------------------------------
+ * SSymExpr
+ *  holds a symbolic object reference
+ *  used for productions and columns and indirect constants
+ *  the productions and columns may be forward declarations,
+ *  in which case the symbol will point to NULL when dereferenced.
+ */
+typedef struct SSymExpr SSymExpr;
+struct SSymExpr
+{
+    SExpression dad;
+    struct KSymbol const *_sym;
+    bool alt;
+};
+
+/* Make
+ *  used when creating implicit expressions
+ */
+rc_t SSymExprMake ( const SExpression **xp,
+    struct KSymbol const *sym, uint32_t var );
+
+/* Mark
+ */
+void SSymExprMark ( const SSymExpr *self, struct VSchema const *schema );
+
+
+/*--------------------------------------------------------------------------
+ * SFuncExpr
+ *  gathers schema, factory and functional parameter expressions
+ *  locates and dereferences function or script by name and version
+ */
+typedef struct SFuncExpr SFuncExpr;
+struct SFuncExpr
+{
+    SExpression dad;
+
+    /* some sort of expression */
+    struct SFunction const *func;
+
+    /* schema type and constant params */
+    Vector schem;
+
+    /* factory params */
+    Vector pfact;
+
+    /* function params */
+    Vector pfunc;
+
+    /* requested version */
+    uint32_t version;
+    bool version_requested;
+
+    /* for purposes of obtaining column info
+       in the absence of metadata */
+    bool untyped;
+};
+
+/* Mark
+ */
+void SFuncExprMark ( const SFuncExpr *self, struct VSchema const *schema );
+
+
+/*--------------------------------------------------------------------------
+ * SPhysEncExpr
+ *  
+ */
+typedef struct SPhysEncExpr SPhysEncExpr;
+struct SPhysEncExpr
+{
+    SExpression dad;
+
+    /* physical encoding */
+    struct SPhysical const *phys;
+
+    /* schema type and constant params */
+    Vector schem;
+
+    /* factory params */
+    Vector pfact;
+
+    /* requested version */
+    uint32_t version;
+    bool version_requested;
+};
+
+/* ImplicitPhysEncExpr
+ *  create expression object
+ */
+rc_t VSchemaImplicitPhysEncExpr ( VSchema *self, VTypedecl *td,
+    const SExpression **expr, const char *text, const char *ctx );
+
+/* Mark
+ */
+void SPhysEncExprMark ( const SPhysEncExpr *self,
+    struct VSchema const *schema );
+
+
+/*--------------------------------------------------------------------------
+ * SUnaryExpr
+ *  applies a unary expression to further
+ */
+typedef struct SUnaryExpr SUnaryExpr;
+struct SUnaryExpr
+{
+    SExpression dad;
+    const SExpression *expr;
+};
+
+
+/*--------------------------------------------------------------------------
+ * SBinExpr
+ *  connects two expression by means of an operator
+ *  the operator is implicit in expression variant
+ *
+ *  e.g. eCastExpr where left = STypeExpr, right = SExpression
+ */
+typedef struct SBinExpr SBinExpr;
+struct SBinExpr
+{
+    SExpression dad;
+    const SExpression *left;
+    const SExpression *right;
+};
+
+
+/*--------------------------------------------------------------------------
+ * SVectExpr
+ *  gathers multiple expressions connect by means of an operator
+ *  the operator is implicit in expression variant
+ *
+ *  e.g. eCondExpr where operator is '|', or
+ *  a constant vector where the operator is ','
+ */
+typedef struct SVectExpr SVectExpr;
+struct SVectExpr
+{
+    SExpression dad;
+    Vector expr;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_schema_expr_ */
diff --git a/libs/vdb/schema-func.c b/libs/vdb/schema-func.c
new file mode 100644
index 0000000..187c7a1
--- /dev/null
+++ b/libs/vdb/schema-func.c
@@ -0,0 +1,1658 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "schema-expr.h"
+#include "schema-dump.h"
+
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * SIndirectConst
+ *  a parameterized constant
+ */
+#if SLVL >= 3
+
+/* Whack
+ */
+void CC SIndirectConstWhack ( void *item, void *ignore )
+{
+    SIndirectConst * self = item;
+    SExpressionWhack ( self -> td );
+    free ( self );
+}
+
+/* Mark
+ */
+void CC SIndirectConstMark ( void * item, void * data )
+{
+    const SIndirectConst * self = item;
+    if ( self != NULL )
+        SExpressionMark ( ( void* ) self -> td, data );
+}
+
+/* Dump
+ *  dump "const", dump object
+ */
+rc_t SIndirectConstDump ( const SIndirectConst *self, struct SDumper *d )
+{
+    return KSymbolDump ( self != NULL ? self -> name : NULL, d );
+}
+
+bool CC SIndirectConstDefDump ( void *item, void *data )
+{
+    SDumper *b = data;
+    const SIndirectConst *self = ( const void* ) item;
+
+    /* check for this being a function */
+    if ( self -> td == NULL )
+        b -> rc = SDumperPrint ( b, "function %N", self -> name );
+    else
+        b -> rc = SDumperPrint ( b, "%E %N", self -> td, self -> name );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+#endif
+
+/*--------------------------------------------------------------------------
+ * SIndirectType
+ */
+#if SLVL >= 3
+
+/* Whack
+ */
+void CC SIndirectTypeWhack ( void *item, void *ignore )
+{
+    free ( item );
+}
+
+
+/* Find
+ */
+SIndirectType *VSchemaFindITypeid ( const VSchema *self, uint32_t id )
+{
+    SIndirectType *pt = VectorGet ( & self -> pt, id );
+    while ( pt == NULL )
+    {
+        self = self -> dad;
+        if ( self == NULL )
+            break;
+        pt = VectorGet ( & self -> pt, id );
+    }
+    return pt;
+}
+
+
+/* Dump
+ */
+rc_t SIndirectTypeDump ( const SIndirectType *self, struct SDumper *d )
+{
+    return KSymbolDump ( self != NULL ? self -> name : NULL, d );
+}
+
+#endif
+
+/*--------------------------------------------------------------------------
+ * SFormParamlist
+ */
+#if SLVL >= 3
+
+/* Whack
+ */
+void SFormParmlistWhack ( SFormParmlist *self, void ( CC * pwhack ) ( void*, void* ) )
+{
+    VectorWhack ( & self -> parms, pwhack, NULL );
+}
+
+
+/* Mark
+ */
+void SFormParmlistMark ( const SFormParmlist *self,
+    void ( CC * mark ) ( void*, void* ), const VSchema *schema )
+{
+    if ( self != NULL )
+        VectorForEach ( & self -> parms, false, mark, ( void* ) schema );
+}
+
+
+/* Dump
+ *  dump param list
+ */
+rc_t SFormParamlistDump ( const SFormParmlist *self, SDumper *b,
+    bool ( CC * dump ) ( void*, void* ),
+    const char *begin, const char *end, const char *empty )
+{
+    rc_t rc;
+    void *item;
+    uint32_t i, parm_cnt = VectorLength ( & self -> parms );
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+    /* if the guy has no specific parameters */
+    if ( parm_cnt == 0 )
+    {
+        if ( self -> vararg )
+            return SDumperPrint ( b, "%s...%s", begin, end );
+        return SDumperPrint ( b, empty );
+    }
+
+    /* print mandatory params */
+    SDumperSepString ( b, begin );
+    for ( rc = 0, i = 0; i < ( uint32_t ) self -> mand; ++ i )
+    {
+        item = VectorGet ( & self -> parms, i );
+        rc = SDumperSep ( b );
+        if ( rc == 0 && ( * dump ) ( item, b ) )
+            rc = b -> rc;
+        SDumperSepString ( b, compact ? "," : ", " );
+    }
+    if ( rc != 0 )
+        return rc;
+
+    if ( i != 0 )
+        SDumperSepString ( b, compact ? "*" : " * " );
+    else
+    {
+        /* issue "begin" */
+        rc = SDumperSep ( b );
+        if ( rc != 0 )
+            return rc;
+
+        SDumperSepString ( b, compact ? "*" :  "* " );
+    }
+
+    /* print optional params */
+    for ( ; i < parm_cnt; ++ i )
+    {
+        item = VectorGet ( & self -> parms, i );
+        rc = SDumperSep ( b );
+        if ( rc == 0 && ( * dump ) ( item, b ) )
+            rc = b -> rc;
+        SDumperSepString ( b, compact ? "," : ", " );
+    }
+    if ( rc != 0 )
+        return rc;
+
+    /* print optional vararg */
+    if ( self -> vararg )
+        return SDumperPrint ( b, compact ? ",...%s" : ", ...%s", end );
+
+    /* close */
+    return SDumperPrint ( b, end );
+}
+
+#endif
+
+/*--------------------------------------------------------------------------
+ * SFunction
+ */
+
+#if SLVL >= 3
+
+/* Whack
+ */
+void SFunctionDestroy ( SFunction *self )
+{
+    SExpressionWhack ( self -> rt );
+#if SLVL >= 4
+    if ( self -> script )
+    {
+        SExpressionWhack ( self -> u . script . rtn );
+        VectorWhack ( & self -> u . script . prod, SProductionWhack, NULL );
+    }
+#endif
+    BSTreeWhack ( & self -> sscope, KSymbolWhack, NULL );
+    BSTreeWhack ( & self -> fscope, KSymbolWhack, NULL );
+    SFormParmlistWhack ( & self -> fact, SIndirectConstWhack );
+    SFormParmlistWhack ( & self -> func, SProductionWhack );
+    VectorWhack ( & self -> type, NULL, NULL );
+    VectorWhack ( & self -> schem, SIndirectConstWhack, NULL );
+}
+
+void CC SFunctionWhack ( void *self, void *ignore )
+{
+    SFunctionDestroy ( self );
+    free ( self );
+}
+
+/* Cmp
+ * Sort
+ */
+int64_t CC SFunctionCmp ( const void *item, const void *n )
+{
+    const uint32_t *a = item;
+    const SFunction *b = n;
+
+    if ( * a > b -> version )
+        return 1;
+    return ( int64_t ) ( * a >> 24 ) - ( int64_t ) ( b -> version >> 24 );
+}
+
+int64_t CC SFunctionSort ( const void *item, const void *n )
+{
+    const SFunction *a = item;
+    const SFunction *b = n;
+
+    return ( int64_t ) ( a -> version >> 24 ) - ( int64_t ) ( b -> version >> 24 );
+}
+
+#if _DEBUGGING && 0
+static String no_name = { "<no-name>", sizeof "<no-name>" - 1, sizeof "<no-name>" - 1 };
+#define DBG_CXBIND1( op, name, id, val ) \
+    OUTMSG (( "%s:%d - cx_bind %s: name=%S, id=%u, val=%p\n", __func__, __LINE__, op, & name, id, val ))
+#define DBG_CXBIND2( op, name, id, old, new ) \
+    OUTMSG (( "%s:%d - cx_bind %s: name=%S, id=%u, old=%p, new=%p\n", __func__, __LINE__, op, & name, id, old, new ))
+#else
+#define DBG_CXBIND1( op, name, id, val ) \
+    ( ( void ) 0 )
+#define DBG_CXBIND2( op, name, id, old, new ) \
+    ( ( void ) 0 )
+#endif
+
+/* Bind
+ *  perform schema and factory param substitution
+ *  returns prior param values
+ *
+ *  9/11/13
+ *  "self" is a cursor-local cloned version of schema decl
+ */
+rc_t SFunctionBindSchemaParms ( const SFunction *self,
+    Vector *prior, const Vector *subst, Vector *cx_bind )
+{
+    rc_t rc = 0;
+
+    uint32_t i, count;
+    void *cx_old, *cx_new;
+
+    const SIndirectType *id;
+    const SIndirectConst *ic;
+
+    /* count input params
+       the first bunch are types
+       the remainder are constants */
+    count = VectorLength ( subst );
+
+    /* initialize return value
+       the prior values act as a stack for recursion */
+    VectorInit ( prior, 0, count );
+
+    /* determine total schema params */
+    i = VectorLength ( & self -> type ) + VectorLength ( & self -> schem );
+
+    /* param counts must match */
+    if ( count < i )
+        rc = RC ( rcVDB, rcFunction, rcEvaluating, rcParam, rcInsufficient );
+    else if ( count > i )
+        rc = RC ( rcVDB, rcFunction, rcEvaluating, rcParam, rcExcessive );
+    if ( rc != 0 )
+    {
+        PLOGERR ( klogWarn, ( klogWarn, rc,
+                 "schema parameter count mismatch - function: '$(f)'; expected $(i), received $(count)",
+                 "f=%.*s,count=%u,i=%u",
+                 self -> name -> name . size, self -> name -> name . addr,
+                 count, i ));
+        return rc;
+    }
+
+    /* bind types */
+    count = VectorLength ( & self -> type );
+    for ( i = 0; i < count; ++ i )
+    {
+        /* get the indirect type object */
+        id = VectorGet ( & self -> type, i );
+        assert ( id != NULL );
+
+        /* get the new type expression */
+        cx_new = VectorGet ( subst, id -> pos );
+        assert ( cx_new != NULL );
+
+        /* update the binding vector */
+        rc = VectorSwap ( cx_bind, id -> type_id, cx_new, & cx_old );
+        if ( rc != 0 )
+            break;
+        DBG_CXBIND2 ( "bind schema type", id -> name -> name, id -> type_id, cx_old, cx_new );
+
+        /* save old value on stack for recursion */
+        rc = VectorSet ( prior, id -> pos, cx_old );
+        if ( rc != 0 )
+        {
+            cx_new = cx_old;
+            VectorSwap ( cx_bind, id -> type_id, cx_new, & cx_old );
+            DBG_CXBIND2 ( "revert bind type", id -> name -> name, id -> type_id, cx_old, cx_new );
+            break;
+        }
+    }
+
+    /* bind constants */
+    if ( rc == 0 )
+    {
+        count = VectorLength ( & self -> schem );
+        for ( i = 0 ; i < count; ++ i )
+        {
+            ic = VectorGet ( & self -> schem, i );
+            assert ( ic != NULL );
+
+            /* get the new constant value expression */
+            cx_new = VectorGet ( subst, ic -> pos );
+            assert ( cx_new != NULL );
+
+            /* update the binding vector */
+            rc = VectorSwap ( cx_bind, ic -> expr_id, cx_new, & cx_old );
+            if ( rc != 0 )
+                break;
+            DBG_CXBIND2 ( "bind schema const", ic -> name -> name, ic -> expr_id, cx_old, cx_new );
+
+            /* save old value on stack for recursion */
+            rc = VectorSet ( prior, ic -> pos, cx_old );
+            if ( rc != 0 )
+            {
+                cx_new = cx_old;
+                VectorSwap ( cx_bind, ic -> expr_id, cx_new, & cx_old );
+                DBG_CXBIND2 ( "revert bind const", ic -> name -> name, ic -> expr_id, cx_old, cx_new );
+                break;
+            }
+        }
+
+        /* if there was no error, we're done */
+        if ( rc == 0 )
+            return 0;
+
+        /* reverse the damage done by binding constants */
+        while ( i -- > 0 )
+        {
+            ic = VectorGet ( & self -> schem, i );
+            assert ( ic != NULL );
+
+            /* get the old constant value expression */
+            cx_new = VectorGet ( prior, ic -> pos );
+            assert ( cx_new != NULL );
+
+            /* restore the binding vector */
+            VectorSwap ( cx_bind, ic -> expr_id, cx_new, & cx_old );
+            DBG_CXBIND2 ( "revert bind const", ic -> name -> name, ic -> expr_id, cx_old, cx_new );
+        }
+
+        /* reset i */
+        i = VectorLength ( & self -> type );
+    }
+
+    /* reverse the damage done by binding types */
+    while ( i -- > 0 )
+    {
+        /* get the indirect type object */
+        id = VectorGet ( & self -> type, i );
+        assert ( id != NULL );
+
+        /* get the old type expression */
+        cx_new = VectorGet ( prior, id -> pos );
+        assert ( cx_new != NULL );
+
+        /* restore the binding vector */
+        VectorSwap ( cx_bind, id -> type_id, cx_new, & cx_old );
+        DBG_CXBIND2 ( "revert bind type", id -> name -> name, id -> type_id, cx_old, cx_new );
+    }
+
+    /* a non-zero rc indicates the Vector is invalid */
+    VectorWhack ( prior, NULL, NULL );
+    return rc;
+}
+
+rc_t SFunctionBindFactParms ( const SFunction *self,
+    Vector *parms, Vector *prior, const Vector *subst, Vector *cx_bind )
+{
+    rc_t rc = 0;
+    SIndirectConst *ic;
+    void *cx_old, *cx_new;
+    uint32_t i, /*count,*/ act_count, form_count;
+
+    /* count input params */
+    /*count =*/ act_count = VectorLength ( subst );
+
+    /* must have minimum count */
+    if ( act_count < self -> fact . mand )
+    {
+        rc =  RC ( rcVDB, rcFunction, rcEvaluating, rcParam, rcInsufficient );
+        PLOGERR ( klogWarn, ( klogWarn, rc,
+                   "missing mandatory factory parameters - function: '$(func)'; expected $(mand), received $(count)",
+                   "func=%.*s,mand=%u,count=%u",
+                   self -> name -> name . size, self -> name -> name . addr,
+                   self -> fact . mand, act_count ));
+        return rc;
+    }
+
+    /* test against maximum count */
+    form_count = VectorLength ( & self -> fact . parms );
+    if ( act_count > form_count )
+    {
+        if ( ! self -> fact . vararg )
+        {
+            rc = RC ( rcVDB, rcFunction, rcEvaluating, rcParam, rcExcessive );
+            PLOGERR ( klogWarn, ( klogWarn, rc,
+                       "extra factory parameters - function: '$(func)'; expected $(mand), received $(count)",
+                       "func=%.*s,mand=%u,count=%u",
+                       self -> name -> name . size, self -> name -> name . addr,
+                       form_count, act_count ));
+            return rc;
+        }
+        /*count = form_count;*/
+    }
+
+    /* initialize return values
+       the "parms" vector is a positional vector of expressions,
+       and is the only way to get at varargs.
+       the prior values act as a stack for recursion */
+    VectorInit ( parms, 0, act_count );
+    VectorInit ( prior, 0, form_count );
+
+    /* bind actual formal parameter values */
+    for ( i = 0; i < form_count && i < act_count; ++ i )
+    {
+        /* get the indirect constant object */
+        ic = VectorGet ( & self -> fact . parms, i );
+        assert ( ic != NULL );
+
+        /* get the new value expression */
+        assert ( ic -> pos == i );
+        cx_new = VectorGet ( subst, i );
+        assert ( cx_new != NULL );
+
+        /* update the positional vector */
+        rc = VectorAppend ( parms, NULL, cx_new );
+        if ( rc != 0 )
+            break;
+
+        /* update the binding vector */
+        rc = VectorSwap ( cx_bind, ic -> expr_id, cx_new, & cx_old );
+        if ( rc != 0 )
+            break;
+        DBG_CXBIND2 ( "bind fact const", ic -> name -> name, ic -> expr_id, cx_old, cx_new );
+
+        /* save the old value on stack for recursion */
+        rc = VectorSet ( prior, i, cx_old );
+        if ( rc != 0 )
+        {
+            cx_new = cx_old;
+            VectorSwap ( cx_bind, ic -> expr_id, cx_new, & cx_old );
+            DBG_CXBIND2 ( "revert bind const", ic -> name -> name, ic -> expr_id, cx_old, cx_new );
+            break;
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        /* this loop should only actually execute
+           to record missing optional formals */
+        assert ( i == form_count || ( i == act_count && act_count < form_count ) );
+
+        /* record optional formal parameter values */
+        for ( ; i < form_count; ++ i )
+        {
+            /* get the indirect constant object */
+            ic = VectorGet ( & self -> fact . parms, i );
+            assert ( ic != NULL );
+
+            /* get the new value expression */
+            assert ( ic -> pos == i );
+            cx_new = VectorGet ( subst, i );
+
+            /* save the same value on stack for recursion */
+            rc = VectorSet ( prior, i, cx_new );
+            if ( rc != 0 )
+                break;
+
+            DBG_CXBIND1 ( "ignore optional fact const", ic -> name -> name, ic -> expr_id, cx_new );
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        /* this loop should only actually execute
+           to record vararg params beyond all formals */
+        assert ( i == form_count );
+
+        /* set vararg values */
+        for ( ; i < act_count; ++ i )
+        {
+            /* get the extra value expression */
+            cx_new = VectorGet ( subst, i );
+            assert ( cx_new != NULL );
+
+            /* update the positional vector */
+            rc = VectorAppend ( parms, NULL, cx_new );
+            if ( rc != 0 )
+                break;
+
+            DBG_CXBIND1 ( "vararg fact const", no_name, 0, cx_new );
+        }
+
+        if ( rc == 0 )
+            return 0;
+
+        i = form_count;
+    }
+
+    while ( i -- > 0 )
+    {
+        /* get the indirect type object */
+        ic = VectorGet ( & self -> fact . parms, i );
+        assert ( ic != NULL );
+
+        /* get the old type expression */
+        cx_new = VectorGet ( subst, ic -> pos );
+        assert ( cx_new != NULL );
+
+        /* restore the binding vector */
+        VectorSwap ( cx_bind, ic -> expr_id, cx_new, & cx_old );
+        DBG_CXBIND2 ( "revert bind const", ic -> name -> name, ic -> expr_id, cx_old, cx_new );
+    }
+    
+    VectorWhack ( parms, NULL, NULL ); 
+    VectorWhack ( prior, NULL, NULL );
+
+    return rc;
+}
+
+/* Rest-ore
+ *  restore schema and factory param substitution
+ *  destroys prior param vector
+ */
+void SFunctionRestSchemaParms ( const SFunction *self, Vector *prior, Vector *cx_bind )
+{
+    rc_t rc;
+    uint32_t i, count;
+    void * cx_old, * ignore;
+
+    /* must have whole thing in prior */
+    assert ( VectorLength ( prior ) == VectorLength ( & self -> type ) + VectorLength ( & self -> schem ) );
+
+    /* restore prior values */
+    count = VectorLength ( & self -> type );
+    for ( i = 0; i < count; ++ i )
+    {
+        /* get the indirect type object */
+        const SIndirectType *id = VectorGet ( & self -> type, i );
+        assert ( id != NULL );
+
+        /* get the old type expression */
+        cx_old = VectorGet ( prior, id -> pos );
+
+        /* update the binding vector */
+        rc = VectorSwap ( cx_bind, id -> type_id, cx_old, & ignore );
+        assert ( rc == 0 );
+
+        DBG_CXBIND2 ( "restore bind type", id -> name -> name, id -> type_id, ignore, cx_old );
+    }
+
+    count = VectorLength ( & self -> schem );
+    for ( i = 0; i < count; ++ i )
+    {
+        const SIndirectConst *ic = VectorGet ( & self -> schem, i );
+        assert ( ic != NULL );
+
+        /* get the old constant value expression */
+        cx_old = VectorGet ( prior, ic -> pos );
+
+        /* restore the binding vector */
+        rc = VectorSwap ( cx_bind, ic -> expr_id, cx_old, & ignore );
+        assert ( rc == 0 );
+
+        DBG_CXBIND2 ( "restore bind const", ic -> name -> name, ic -> expr_id, ignore, cx_old );
+    }
+
+    VectorWhack ( prior, NULL, NULL );
+}
+
+void SFunctionRestFactParms ( const SFunction *self, Vector *prior, Vector *cx_bind )
+{
+    rc_t rc;
+    uint32_t i, count;
+    void * cx_old, * ignore;
+
+    /* must have whole thing in prior */
+    assert ( VectorLength ( prior ) == VectorLength ( & self -> fact . parms ) );
+
+    /* restore prior values */
+    count = VectorLength ( & self -> fact . parms );
+    for ( i = 0; i < count; ++ i )
+    {
+        const SIndirectConst *ic = VectorGet ( & self -> fact . parms, i );
+        assert ( ic != NULL );
+
+        /* get the old constant value expression */
+        cx_old = VectorGet ( prior, ic -> pos );
+
+        /* restore the binding vector */
+        rc = VectorSwap ( cx_bind, ic -> expr_id, cx_old, & ignore );
+        assert ( rc == 0 );
+
+        DBG_CXBIND2 ( "restore bind const", ic -> name -> name, ic -> expr_id, ignore, cx_old );
+    }
+
+    VectorWhack ( prior, NULL, NULL );
+}
+
+
+/* Mark
+ */
+void CC SFunctionClearMark ( void *item, void *ignore )
+{
+    SFunction *self = item;
+    self -> marked = false;
+}
+
+void CC SFunctionMark ( void * item, void * data )
+{
+    SFunction * self = item;
+    const VSchema * schema = data;
+    if ( self != NULL && ! self -> marked )
+    {
+        self -> marked = true;
+        SExpressionMark ( ( void * )self -> rt, data );
+        SFormParmlistMark ( & self -> fact, SIndirectConstMark, schema );
+        SFormParmlistMark ( & self -> func, SProductionMark, schema );
+        VectorForEach ( & self -> schem, false, SIndirectConstMark, data );
+
+        if ( self -> script )
+        {
+            SExpressionMark ( ( void * )self -> u . script . rtn, ( void * )schema );
+            VectorForEach ( & self -> u . script . prod, false, SProductionMark, data );
+        }
+    }
+}
+
+void SFuncNameMark ( const SNameOverload *self, const VSchema *schema )
+{
+    if ( self != NULL )
+    {
+        VectorForEach ( & self -> items, false, SFunctionMark, ( void * ) schema );
+    }
+}
+
+
+/* Dump
+ */
+rc_t SFunctionDump ( const SFunction *self, struct SDumper *d )
+{
+    return FQNDump ( self != NULL ? self -> name : NULL, d );
+}
+
+rc_t SFunctionDeclDumpSchemaParms ( const SFunction *self, SDumper *b )
+{
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+    /* this first part is weird, because the types and
+       constants are kept separately, although they were
+       specified in a single list */
+    uint32_t i, j, sparm_cnt = VectorLength ( & self -> type ) +
+        VectorLength ( & self -> schem );
+    if ( sparm_cnt == 0 )
+        return 0;
+
+    SDumperSepString ( b, compact ? "<" : "< " );
+    for ( i = j = 0; i < sparm_cnt; ++ i )
+    {
+        const SIndirectType *id = VectorGet ( & self -> type, i - j );
+        rc_t rc = SDumperSep ( b );
+        if ( rc != 0 )
+            return rc;
+        if ( id != NULL && id -> pos == i )
+            rc = SDumperPrint ( b, "type %N", id -> name );
+        else
+        {
+            const SIndirectConst *ic = VectorGet ( & self -> schem, j );
+            assert ( id == NULL || id -> pos > i );
+            if ( ic == NULL )
+                rc = SDumperWrite ( b, "NULL", 4 );
+            else
+                SIndirectConstDefDump ( ( void* ) ic, b );
+        }
+        if ( rc != 0 )
+            return rc;
+        SDumperSepString ( b, compact ? "," : ", " );
+    }
+
+    return SDumperPrint ( b, compact ? ">" : " > " );
+}
+
+rc_t SFunctionDeclDumpFactParms ( const SFunction *self, SDumper *b )
+{
+    if ( SDumperMode ( b ) == sdmCompact )
+        return SFormParamlistDump ( & self -> fact, b, SIndirectConstDefDump, "<", ">", "" );
+    return SFormParamlistDump ( & self -> fact, b, SIndirectConstDefDump, " < ", " >", "" );
+}
+
+bool CC SFunctionDeclDump ( void *item, void *data )
+{
+    SDumper *b = data;
+    const SFunction *self = ( const void* ) item;
+    const char *func_class = "extern";
+
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+    if ( SDumperMarkedMode ( b ) && ! self -> marked )
+        return false;
+
+    if ( self -> script )
+        func_class = "schema";
+    else if ( self -> validate )
+        func_class = "validate";
+
+    /* a type of function */
+    b -> rc = SDumperPrint ( b, "%s function ", func_class );
+    if ( b -> rc == 0 )
+    {
+        if ( self -> untyped )
+            b -> rc = SDumperPrint ( b, compact ? "__untyped %N()" : "__untyped %N ()", self -> name );
+        else if ( self -> row_length )
+            b -> rc = SDumperPrint ( b, compact ? "__row_length %N()" : "__row_length %N ()", self -> name );
+        else
+        {
+            /* could have schema parameters */
+            b -> rc = SFunctionDeclDumpSchemaParms ( self, b );
+
+            /* a return type expression, followed by a function name */
+            if ( b -> rc == 0 )
+            {
+                if ( self -> validate )
+                    b -> rc = SDumperPrint ( b, "void %N", self -> name );
+                else
+                    b -> rc = SDumperPrint ( b, "%E %N", self -> rt, self -> name );
+            }
+
+            /* version should be given */
+            if ( b -> rc == 0 )
+                b -> rc = SDumperVersion ( b, self -> version );
+
+            /* factory parameters */
+            if ( b -> rc == 0 )
+                b -> rc = SFunctionDeclDumpFactParms ( self, b );
+
+            /* function parameters */
+            if ( b -> rc == 0 )
+            {
+                if ( compact )
+                    b -> rc = SFormParamlistDump ( & self -> func, b, SProductionDefDump, "(", ")", "()" );
+                else
+                    b -> rc = SFormParamlistDump ( & self -> func, b, SProductionDefDump, " ( ", " )", " ()" );
+            }
+        }
+    }
+
+    if ( b -> rc == 0 )
+    {
+#if SLVL >= 4
+        if ( self -> script )
+        {
+            if ( ! compact )
+                b -> rc = SDumperWrite ( b, "\n", 1 );
+            if ( b -> rc == 0 )
+                b -> rc = SFunctionBodyDump ( self, b );
+        }
+        else
+#endif
+        {
+            if ( self -> u . ext . fact != NULL )
+                b -> rc = SDumperPrint ( b, compact ? "=%N" : " = %N", self -> u . ext . fact );
+            if ( b -> rc == 0 )
+                b -> rc = SDumperPrint ( b, compact ? ";" : ";\n" );
+        }
+    }
+
+    if ( b -> rc == 0 )
+        b -> rc = AliasDump ( self -> name, b );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ */
+
+#if SLVL >= 3
+
+/*
+ * formal-symbol     = ID
+ */
+static
+rc_t formal_symbol ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env,  uint32_t id, const void *obj )
+{
+    rc_t rc;
+
+    /* allow symbol redefines in current scope only */
+    if ( t -> sym != NULL )
+    {
+        KTokenSourceReturn ( src, t );
+        next_shallow_token ( tbl, src, t, true );
+    }
+
+    /* must have a parameter name */
+    if ( t -> id != eIdent )
+        return KTokenExpected ( t, klogErr, "undefined identifier" );
+
+    /* create the symbol in current scope */
+    rc = KSymTableCreateSymbol ( tbl, & t -> sym, & t -> str, id, obj );
+    if ( rc != 0 )
+        KTokenRCExplain ( t, klogInt, rc );
+
+    return rc;
+}
+
+
+/*
+ * param-formal       = [ 'control' ] <typespec> ID
+ */
+static
+rc_t param_formal ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFormParmlist *sig )
+{
+    rc_t rc;
+
+    /* create the factory formal parameter,
+       which is just a production awaiting an expr */
+    SProduction *param = malloc ( sizeof * param );
+    if ( param == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    /* finish initialization */
+    memset ( param, 0, sizeof * param );
+
+    /* accept 'control' keyword */
+    if ( t -> id == kw_control )
+    {
+        param -> control = true;
+        next_token ( tbl, src, t );
+    }
+
+    /* if parsing v0 text, then this is a persisted
+       column schema. it will have only a formal param
+       name, but no type. substitute "any" */
+    if ( env -> schema_param_types_absent )
+    {
+        KTokenSourceReturn ( src, t );
+        CONST_STRING ( & t -> str, "any" );
+        t -> sym = KSymTableFindIntrinsic ( tbl, & t -> str );
+        assert ( t -> sym != NULL );
+        t -> id = t -> sym -> type;
+    }
+
+    /* should start off with a type */
+    rc = vardim_type_expr ( tbl, src, t, env, self, & param -> fd );
+    if ( rc != 0 )
+    {
+        free ( param );
+        return rc;
+    }
+
+    /* create a name */
+    rc = formal_symbol ( tbl, src, t, env, eFuncParam, param );
+    if ( rc != 0 )
+    {
+        SProductionWhack ( param, NULL );
+        return rc;
+    }
+    param -> name = t -> sym;
+
+    /* append to param list */
+    rc = VectorAppend ( & sig -> parms, & param -> cid . id, param );
+    if ( rc != 0 )
+    {
+        SProductionWhack ( param, NULL );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    next_token ( tbl, src, t );
+    return 0;
+}
+
+
+/*
+ * fact-formals       = <fact-formal> [ ',' <fact-formals> ]
+ * fact-formal        = <fact-typedecl> ID
+ * fact-parmname      = ID
+ */
+static
+rc_t fact_formal ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFormParmlist *sig )
+{
+    rc_t rc;
+    SIndirectConst *param = malloc ( sizeof * param );
+    if ( param == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    param -> td = NULL;
+    param -> expr_id = 0;
+
+#if ACCEPT_FUNCTION_AS_FACT_PARAM
+    /* type could be 'function' */
+    if ( t -> id == kw_function )
+        next_token ( tbl, src, t );
+
+    /* should be a typedecl */
+    else
+#endif
+    {
+        rc = type_expr ( tbl, src, t, env, self, & param -> td );
+        if ( rc != 0 )
+        {
+            free ( param );
+            return KTokenFailure ( t, klogErr, rc,
+#if ACCEPT_FUNCTION_AS_FACT_PARAM
+                                   "function or "
+#endif
+                                   "data type" );
+        }
+    }
+
+    /* get its name */
+    rc = formal_symbol ( tbl, src, t, env, eFactParam, param );
+    if ( rc != 0 )
+    {
+        SIndirectConstWhack ( param, NULL );
+        return rc;
+    }
+    param -> name = t -> sym;
+
+    /* store as a parameter */
+    rc = VectorAppend ( & sig -> parms, & param -> pos, param );
+    if ( rc != 0 )
+    {
+        SIndirectConstWhack ( param, NULL );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    /* set binding constant */
+    param -> expr_id = ++ self -> num_indirect;
+
+    next_token ( tbl, src, t );
+    return 0;
+}
+
+
+/*
+ * formal-params     = <formal-param> [ ',' <formal-params> ]
+ */
+static
+rc_t formal_params ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFormParmlist *sig,
+    rc_t ( * formal_param ) ( KSymTable*, KTokenSource*, KToken*,
+        const SchemaEnv*, VSchema*, SFormParmlist* ) )
+{
+    while ( t -> sym != NULL || t -> id == eIdent )
+    {
+        rc_t rc = ( * formal_param ) ( tbl, src, t, env, self, sig );
+        if ( rc != 0 )
+            return rc;
+
+        if ( t -> id != eComma )
+            break;
+
+        next_token ( tbl, src, t );
+    }
+
+    return 0;
+}
+
+
+/*
+ * formal-signature   = <formal-params> [ '*' <formal-params> ] [',' '...' ]
+ *                    | '*' <formal-params> [',' '...' ]
+ *                    | '...'
+ */
+static
+rc_t formal_signature ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFormParmlist *sig,
+    rc_t ( * formal_param ) ( KSymTable*, KTokenSource*, KToken*,
+        const SchemaEnv*, VSchema*, SFormParmlist* ) )
+{
+    /* read mandatory parameters */
+    rc_t rc = formal_params ( tbl, src, t, env, self, sig, formal_param );
+
+    /* remember the number of mandatory params seen */
+    sig -> mand = VectorLength ( & sig -> parms );
+
+    /* read optional parameters */
+    if ( rc == 0 && t -> id == eAsterisk )
+    {
+        next_token ( tbl, src, t );
+        rc = formal_params ( tbl, src, t, env, self, sig, formal_param );
+        if ( rc == 0 && VectorLength ( & sig -> parms ) == sig -> mand )
+            KTokenExpected ( t, klogWarn, "optional parameter" );
+    }
+
+    /* accept '...' */
+    if ( t -> id == eEllipsis )
+    {
+        /* but only if there was at least one real parameter */
+        if ( VectorLength ( & sig -> parms ) == 0 )
+        {
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcParam, rcInsufficient );
+            return KTokenFailure ( t, klogErr, rc, "vararg parameter requires at least one real parameter" );
+        }
+
+        sig -> vararg = true;
+        next_token ( tbl, src, t );
+    }
+
+    return 0;
+}
+
+/*
+ * parm-signature     = <parm-formals> [ '*' <parm-formals> ] [',' '...' ]
+ *                    | '*' <parm-formals> [',' '...' ]
+ *                    | '...'
+ */
+static
+rc_t parm_signature ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFormParmlist *sig )
+{
+    /* open list */
+    rc_t rc = expect ( tbl, src, t, eLeftParen, "(", true );
+    if ( rc != 0 )
+        return rc;
+
+    /* parse list */
+    rc = formal_signature ( tbl, src, t, env, self, sig, param_formal );
+    if ( rc != 0 )
+        return 0;
+
+    /* expect close */
+    return expect ( tbl, src, t, eRightParen, ")", true );
+}
+
+/*
+ * fact-signature     = <fact-formals> [ '*' <fact-formals> ] [ ',' '...' ]
+ *                    | '*' <fact-formals> [ ',' '...' ]
+ *                    | '...'
+ */
+rc_t fact_signature ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFormParmlist *sig )
+{
+    /* open list */
+    rc_t rc = expect ( tbl, src, t, eLeftAngle, "<", true );
+    if ( rc != 0 )
+        return rc;
+
+    /* parse list */
+    rc = formal_signature ( tbl, src, t, env, self, sig, fact_formal );
+    if ( rc != 0 )
+        return rc;
+
+    /* expect close */
+    return expect ( tbl, src, t, eRightAngle, ">", true );
+}
+
+
+/*
+ * schema-signature   = <schema-formals>
+ * schema-formals     = <schema-formal> [ ',' <schema-formals> ]
+ * schema-formal      = <schema-typedecl> ID
+ * schema-parmname    = ID
+ */
+rc_t schema_signature ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFunction *sig )
+{
+    rc_t rc;
+
+    /* open list */
+    if ( t -> id != eLeftAngle )
+        return KTokenExpected ( t, klogErr, "<" );
+
+    /* gather schema parameters */
+    do
+    {
+        const SExpression *td;
+        const SDatatype *dt;
+
+        /* check parameter type */
+        switch ( next_token ( tbl, src, t ) -> id )
+        {
+        case kw_type:
+            td = NULL;
+            next_token ( tbl, src, t );
+            break;
+
+        case eDatatype:
+            dt = t -> sym -> u . obj;
+            if ( dt -> domain == ddUint )
+            {
+                /* evaluate the type expression */
+                rc = type_expr ( tbl, src, t, env, self, & td );
+                if ( rc != 0 )
+                    return KTokenFailure ( t, klogErr, rc, "unsigned integer datatype" );
+
+                /* the type should be totally resolved */
+                assert ( td != NULL && td -> var == eTypeExpr );
+                assert ( ( ( const STypeExpr* ) td ) -> resolved );
+                if ( ( ( const STypeExpr* ) td ) -> fd . td . dim == 1 )
+                    break;
+
+                SExpressionWhack ( td );
+                return KTokenExpected ( t, klogErr, "single dimensional unsigned integer datatype" );
+            }
+
+        default:
+            return KTokenExpected ( t, klogErr, "type keyword or unsigned integer datatype" );
+        }
+
+        /* get parameter name */
+        if ( t -> id != eIdent )
+        {
+            if ( td != NULL )
+                SExpressionWhack ( td );
+            return KTokenExpected ( t, klogErr, "parameter name" );
+        }
+
+        if ( td == NULL )
+        {
+            SIndirectType *formal = malloc ( sizeof * formal );
+            if ( formal == NULL )
+            {
+                rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+                return KTokenRCExplain ( t, klogInt, rc );
+            }
+
+            /* initialize to raw format,
+               undefined type, and no dimension */
+            formal -> type_id = 0;
+
+            /* create symbol */
+            rc = KSymTableCreateConstSymbol ( tbl, & formal -> name,
+                & t -> str, eSchemaType, formal );
+            if ( rc == 0 )
+            {
+                /* record positional */
+                rc = VectorAppend ( & sig -> type, & formal -> pos, formal );
+                if ( rc == 0 )
+                {
+                    void *ignore;
+
+                    /* record formal */
+                    rc = VectorAppend ( & self -> pt, & formal -> id, formal );
+                    if ( rc != 0 )
+                        VectorSwap ( & sig -> type, formal -> pos, NULL, & ignore );
+                    else
+                        formal -> pos += VectorLength ( & sig -> schem );
+                }
+            }
+            if ( rc != 0 )
+            {
+                free ( formal );
+                return KTokenRCExplain ( t, klogInt, rc );
+            }
+
+            formal -> type_id = ++ self -> num_indirect;
+        }
+        else
+        {
+            SIndirectConst *formal = malloc ( sizeof * formal );
+            if ( formal == NULL )
+            {
+                SExpressionWhack ( td );
+                rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+                return KTokenRCExplain ( t, klogInt, rc );
+            }
+
+            /* initialize with no value */
+            formal -> expr_id = 0;
+            formal -> td = td;
+
+            /* create symbol */
+            rc = KSymTableCreateConstSymbol ( tbl, & formal -> name,
+                & t -> str, eSchemaParam, formal );
+            if ( rc == 0 )
+            {
+                /* record formal */
+                rc = VectorAppend ( & sig -> schem, & formal -> pos, formal );
+                if ( rc == 0 )
+                    formal -> pos += VectorLength ( & sig -> type );
+            }
+            if ( rc != 0 )
+            {
+                SIndirectConstWhack ( formal, NULL );
+                return KTokenRCExplain ( t, klogInt, rc );
+            }
+
+            formal -> expr_id = ++ self -> num_indirect;
+        }
+    }
+    while ( next_token ( tbl, src, t ) -> id == eComma );
+
+    /* expect close */
+    return expect ( tbl, src, t, eRightAngle, ">", true );
+}
+
+static
+rc_t return_type_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFunction *f )
+{
+    if ( f -> validate )
+        return expect ( tbl, src, t, kw_void, "void", true );
+    return vardim_type_expr ( tbl, src, t, env, self, & f -> rt );
+}
+
+
+static
+rc_t func_decl ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFunction *f, uint32_t type )
+{
+    rc_t rc;
+
+    /* check for __untyped or __row_length function */
+    if ( t -> id == kw___untyped || t -> id == kw___row_length )
+    {
+        uint32_t sym_type;
+
+        /* can't be a script function */
+        if ( type == eScriptFunc )
+            return KTokenExpected ( t, klogErr, "script function return type" );
+
+        /* can't be a validate function */
+        if ( f -> validate )
+            return KTokenExpected ( t, klogErr, "void return type" );
+
+        /* determine variant */
+        if ( t -> id == kw___untyped )
+        {
+            f -> untyped = true;
+            sym_type = eUntypedFunc;
+        }
+        else
+        {
+            f -> row_length = true;
+            sym_type = eRowLengthFunc;
+        }
+
+        /* treat keyword as a NULL return type */
+        next_token ( tbl, src, t );
+
+        /* create function name */
+        rc = create_fqn ( tbl, src, t, env, sym_type, NULL );
+        if ( rc != 0 )
+        {
+            if ( GetRCState ( rc ) == rcExists )
+                return rc;
+            return KTokenFailure ( t, klogErr, rc, "fully qualified name" );
+        }
+
+        /* record symbol */
+        f -> name = t -> sym;
+        next_token ( tbl, src, t );
+
+        /* consume empty param list */
+        rc = expect ( tbl, src, t, eLeftParen, "(", true );
+        if ( rc == 0 )
+            rc = expect ( tbl, src, t, eRightParen, ")", true );
+        return rc;
+    }
+
+
+    /* initialize vectors */
+    VectorInit ( & f -> fact . parms, 0, 8 );
+    VectorInit ( & f -> func . parms, 0, 8 );
+    VectorInit ( & f -> type, 0, 8 );
+    VectorInit ( & f -> schem, 0, 8 );
+
+    /* get schema signature */
+    if ( t -> id == eLeftAngle )
+    {
+        /* enter schema param scope */
+        rc = KSymTablePushScope ( tbl, & f -> sscope );
+        if ( rc != 0 )
+            return KTokenRCExplain ( t, klogInt, rc );
+
+        /* parse schema params */
+        rc = schema_signature ( tbl, src, t, env, self, f );
+
+        /* interpret return type within schema param scope */
+        if ( rc == 0 )
+        {
+            rc = return_type_expr ( tbl, src, t, env, self, f );
+            if ( rc != 0 )
+                KTokenFailure ( t, klogErr, rc, "return type" );
+        }
+
+        /* pop scope */
+        KSymTablePopScope ( tbl );
+
+        /* bail on problems */
+        if ( rc != 0 )
+            return rc;
+
+        /* "t" contains a lookahead token. while unlikely,
+           it could have matched something defined in schema
+           param scope. re-evaluate if possible */
+        if ( t -> sym != NULL ) switch ( t -> sym -> type )
+        {
+        case eSchemaType:
+        case eSchemaParam:
+            t -> id = eIdent;
+            t -> sym = KSymTableFind ( tbl, & t -> str );
+            if ( t -> sym != NULL )
+                t -> id = t -> sym -> type;
+            break;
+        }
+    }
+    else
+    {
+        /* get return type within global scope */
+        rc = return_type_expr ( tbl, src, t, env, self, f );
+        if ( rc != 0 )
+            return KTokenFailure ( t, klogErr, rc, "return type" );
+    }
+
+    /* get function name */
+    rc = create_fqn ( tbl, src, t, env, type, NULL );
+    if ( rc != 0 ) switch ( GetRCState ( rc ) )
+    {
+    case rcExists:
+        break;
+    case rcUnexpected:
+        if ( type == 0 && t -> sym != NULL )
+        {
+            if ( t -> sym -> type == eFunction || t -> sym -> type == eScriptFunc )
+                break;
+        }
+    default:
+        return KTokenFailure ( t, klogErr, rc, "fully qualified name" );
+    }
+
+    /* record symbol - new or redefined */
+    f -> name = t -> sym;
+
+    /* get version */
+    if ( next_token ( tbl, src, t ) -> id == eHash )
+    {
+        bool allow_release = ( f -> name -> type != eFunction ) ? true : false;
+        next_token ( tbl, src, t );
+        rc = maj_min_rel ( tbl, src, t, env, self, & f -> version, allow_release );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* parse formal parameters - enter schema scope */
+    rc = KSymTablePushScope ( tbl, & f -> sscope );
+    if ( rc != 0 )
+        KTokenRCExplain ( t, klogInt, rc );
+    else
+    {
+        /* enter function scope */
+        rc = KSymTablePushScope ( tbl, & f -> fscope );
+        if ( rc != 0 )
+            KTokenRCExplain ( t, klogInt, rc );
+        else
+        {
+            /* gather factory parameters */
+            if ( t -> id == eLeftAngle )
+                rc = fact_signature ( tbl, src, t, env, self, & f -> fact );
+
+            /* gather function parameters */
+            if ( rc == 0 )
+                rc = parm_signature ( tbl, src, t, env, self, & f -> func );
+
+            /* leave function scope */
+            KSymTablePopScope ( tbl );
+        }
+
+        /* leave schema scope */
+        KSymTablePopScope ( tbl );
+    }
+
+    /* go a bit further */
+    if ( rc == 0 )
+    {
+        /* detect script body */
+        if ( t -> id == eLeftCurly )
+        {
+#if SLVL >= 4
+            /* if user already specified extern function
+               or if user specified vararg factory params */
+            if ( type == eFunction || f -> fact . vararg )
+#endif
+                return KTokenExpected ( t, klogErr, "; or =" );
+#if SLVL >= 4
+            /* if no type was specified */
+            if ( type == 0 )
+            {
+                /* if name was previously defined as a function */
+                if ( f -> name -> type == eFunction )
+                    return KTokenExpected ( t, klogErr, "; or =" );
+
+                /* name is either undefined or script - clobber to script */
+                ( ( KSymbol* ) f -> name ) -> type = eScriptFunc;
+            }
+
+            /* parse remainder as script function */
+            return script_body ( tbl, src, t, env, self, f );
+#endif
+        }
+
+        /* detect case where should be script but isn't */
+        if ( f -> name -> type == eScriptFunc )
+            return KTokenExpected ( t, klogErr, "{" );
+
+        /* definitely an extern function */
+        if ( type == 0 )
+            ( ( KSymbol* ) f -> name ) -> type = eFunction;
+
+        /* process factory spec */
+        if ( t -> id == eAssign )
+        {
+            /* get factory name */
+            next_token ( tbl, src, t );
+            rc = create_fqn ( tbl, src, t, env, eFactory, NULL );
+            if ( rc != 0 ) switch ( GetRCState ( rc ) )
+            {
+            case rcExists:
+                break;
+            case rcUnexpected:
+                if ( t -> sym != NULL && t -> sym -> type == eFunction )
+                    break;
+            default:
+                return rc;
+            }
+
+            f -> u . ext . fact = t -> sym;
+            next_token ( tbl, src, t );
+        }
+
+        /* expect a semicolon */
+        rc = expect ( tbl, src, t, eSemiColon, ";", true );
+    }
+
+    return rc;
+}
+
+static
+rc_t function_decl ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, uint32_t type, bool validate )
+{
+    rc_t rc;
+    void *ignore;
+
+    /* create object */
+    SFunction *f = malloc ( sizeof * f );
+    if ( f == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    memset ( f, 0, sizeof * f );
+    f -> validate = validate;
+
+    /* parse function decl */
+    rc = func_decl ( tbl, src, t, env, self, f, type );
+
+    /* check validation functions for exactly two parameters */
+    if ( f -> validate && ( rc == 0 || GetRCState ( rc ) == rcExists ) )
+    {
+        if ( f -> func . mand != 2 ||
+             f -> func . vararg != 0 ||
+             VectorLength ( & f -> func . parms ) != 2 )
+        {
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcFunction, rcInvalid );
+            KTokenRCExplain ( t, klogInt, rc );
+        }
+    }
+
+    if ( rc == 0 )
+    {
+        /* need an overloaded name entry */
+        SNameOverload *name = ( void* ) f -> name -> u . obj;
+        if ( name == NULL )
+        {
+            /* create name */
+            rc = SNameOverloadMake ( & name, f -> name, 0, 4 );
+            if ( rc == 0 )
+            {
+                /* insert it - it's allowed to be empty */
+                rc = VectorAppend ( & self -> fname, & name -> cid . id, name );
+                if ( rc != 0 )
+                    SNameOverloadWhack ( name, NULL );
+            }
+        }
+
+        /* now need to record function */
+        if ( rc == 0 )
+        {
+            /* assume it's new in this schema */
+            rc = VectorAppend ( & self -> func, & f -> id, f );
+            if ( rc == 0 )
+            {
+                /* insert into name overload and exit on success */
+                uint32_t idx;
+                rc = VectorInsertUnique ( & name -> items, f, & idx, SFunctionSort );
+                if ( rc == 0 )
+                    return 0;
+
+                /* expected failure is that a function already exists */
+                if ( GetRCState ( rc ) != rcExists )
+                    VectorSwap ( & self -> func, f -> id, NULL, & ignore );
+                else
+                {
+                    /* see if new function trumps old */
+                    SFunction *exist = VectorGet ( & name -> items, idx );
+                    if ( f -> version > exist -> version )
+                    {
+                        /* insert our function in name overload */
+                        VectorSwap ( & name -> items, idx, f, & ignore );
+
+                        /* if existing is in another schema... */
+                        if ( ( const void* ) name != exist -> name -> u . obj )
+                            return 0;
+
+                        /* need to swap with old */
+                        assert ( exist -> id >= VectorStart ( & self -> func ) );
+                        assert ( exist -> id < f -> id );
+                        VectorSwap ( & self -> func, f -> id, NULL, & ignore );
+                        VectorSwap ( & self -> func, f -> id = exist -> id, f, & ignore );
+                        SFunctionWhack ( exist, NULL );
+                        return 0;
+                    }
+
+                    /* exists is not an error */
+                    rc = 0;
+                }
+
+                VectorSwap ( & self -> func, f -> id, NULL, & ignore );
+            }
+        }
+    }
+    else if ( GetRCState ( rc ) == rcExists )
+    {
+        rc = 0;
+    }
+    
+    SFunctionWhack ( f, NULL );
+    return rc;
+}
+
+/*
+ * function-decl      = 'function' <ext-func-decl> ';'
+ *                    | 'function' <script-func-decl>
+ */
+rc_t function_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    return function_decl ( tbl, src, t, env, self,
+        env -> script_function_called_schema ? eFunction : 0, false );
+}
+
+/*
+ * extern-func        = 'extern' 'function' <ext-function-decl> ';'
+ */
+rc_t extfunc_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    return function_decl ( tbl, src, t, env, self, eFunction, false );
+}
+
+/*
+ * validate-func      = 'validate' 'function' <validate-function-decl> ';'
+ */
+rc_t valfunc_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    return function_decl ( tbl, src, t, env, self, eFunction, true );
+}
+
+#endif /* SLVL >= 3 */
+
+
+#if SLVL >= 4
+
+/*
+ * script-decl        = 'schema' [ 'function' ] <script-func-decl>
+ */
+rc_t script_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    if ( t -> id == kw_function )
+        next_token ( tbl, src, t );
+
+    return function_decl ( tbl, src, t, env, self, eScriptFunc, false );
+}
+
+#endif /* SLVL >= 4 */
diff --git a/libs/vdb/schema-int.c b/libs/vdb/schema-int.c
new file mode 100644
index 0000000..d0204cf
--- /dev/null
+++ b/libs/vdb/schema-int.c
@@ -0,0 +1,376 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "schema-priv.h"
+#include "schema-parse.h"
+
+#include <vdb/vdb-priv.h>
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <byteswap.h>
+#include <assert.h>
+
+#define INTRINSIC_SUB_BYTE_MULTI_BIT_TYPES 0
+
+/* init_keywords
+ *  create simple symbols with special ids
+ */
+static
+rc_t init_keywords ( KSymTable *tbl )
+{
+    int i;
+    static struct
+    {
+        const char *keyword;
+        int id;
+    } kw [] =
+    {
+#define KEYWORD( word ) \
+        { # word, kw_ ## word }
+
+        KEYWORD ( alias ),
+        KEYWORD ( column ),
+        KEYWORD ( const ),
+        KEYWORD ( control ),
+        KEYWORD ( database ),
+        KEYWORD ( decode ),
+        KEYWORD ( default ),
+        KEYWORD ( encode ),
+        KEYWORD ( extern ),
+        KEYWORD ( false ),
+        KEYWORD ( fmtdef ),
+        KEYWORD ( function ),
+        KEYWORD ( include ),
+        KEYWORD ( index ),
+        KEYWORD ( limit ),
+        KEYWORD ( physical ),
+        KEYWORD ( read ),
+        KEYWORD ( readonly ),
+        KEYWORD ( return ),
+        KEYWORD ( schema ),
+        KEYWORD ( static ),
+        KEYWORD ( table ),
+        KEYWORD ( trigger ),
+        KEYWORD ( template ),
+        KEYWORD ( true ),
+        KEYWORD ( type ),
+        KEYWORD ( typedef ),
+        KEYWORD ( typeset ),
+        KEYWORD ( validate ),
+        KEYWORD ( version ),
+        KEYWORD ( view ),
+        KEYWORD ( virtual ),
+        KEYWORD ( void ),
+        KEYWORD ( writeonly ),
+        KEYWORD ( __untyped ),
+        KEYWORD ( __row_length ),
+        KEYWORD ( __no_header )
+
+#undef KEYWORD
+    };
+
+    /* define keywords */
+    for ( i = 0; i < sizeof kw / sizeof kw [ 0 ]; ++ i )
+    {
+        rc_t rc;
+
+        String name;
+        StringInitCString ( & name, kw [ i ] . keyword );
+        rc = KSymTableCreateSymbol ( tbl, NULL, & name, kw [ i ] . id, NULL );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    return 0;
+}
+
+
+/* byte swapping */
+static
+void byte_swap_16 ( void *dst, const void *src, uint64_t count )
+{
+    uint16_t *d = dst;
+    const uint16_t *s = src;
+
+    uint64_t i;
+    for ( i = 0; i < count; ++ i )
+        d [ i ] = bswap_16 ( s [ i ] );
+}
+
+static
+void byte_swap_32 ( void *dst, const void *src, uint64_t count )
+{
+    uint32_t *d = dst;
+    const uint32_t *s = src;
+
+    uint64_t i;
+    for ( i = 0; i < count; ++ i )
+        d [ i ] = bswap_32 ( s [ i ] );
+}
+
+static
+void byte_swap_64 ( void *dst, const void *src, uint64_t count )
+{
+    uint64_t *d = dst;
+    const uint64_t *s = src;
+
+    uint64_t i;
+    for ( i = 0; i < count; ++ i )
+        d [ i ] = bswap_64 ( s [ i ] );
+}
+
+#if SUPPORT_128_BIT
+static
+void byte_swap_128 ( void *dst, const void *src, uint64_t count )
+{
+    uint64_t i;
+    uint64_t *d = dst;
+    const uint64_t *s = src;
+
+    if ( ( const uint64_t* ) d != s )
+    {
+        for ( count += count, i = 0; i < count; i += 2 )
+        {
+            d [ i + 0 ] = bswap_64 ( s [ i + 1 ] );
+            d [ i + 1 ] = bswap_64 ( s [ i + 0 ] );
+        }
+    }
+    else
+    {
+        for ( count += count, i = 0; i < count; i += 2 )
+        {
+            uint64_t tmp = bswap_64 ( s [ i + 0 ] );
+            d [ i + 0 ] = bswap_64 ( s [ i + 1 ] );
+            d [ i + 1 ] = tmp;
+        }
+    }
+}
+#endif
+
+
+/* InitTypes
+ *  set up intrinsic types
+ */
+static
+rc_t VSchemaInitTypes ( VSchema *self, KSymTable *tbl )
+{
+    int i;
+    static struct
+    {
+        const char *newtype;
+        const char *supertype;
+        void ( * byte_swap ) ( void *dst, const void *src, uint64_t count );
+        uint8_t dim;
+        uint8_t domain;
+    } dt [] =
+    {
+        { "any", NULL, NULL, 1, 0 },
+        { "void", NULL, NULL, 1, 0 },
+        { "opaque", NULL, NULL, 1, 0 },
+
+        /* bundles of bits in machine native order */
+        { "B1", "opaque", NULL, 1, ddUint },
+        { "B8", "opaque", NULL, 8, ddUint },
+        { "B16", "opaque", byte_swap_16, 16, ddUint },
+        { "B32", "opaque", byte_swap_32, 32, ddUint },
+        { "B64", "opaque", byte_swap_64, 64, ddUint },
+
+        /* the basic unsigned integer types */
+        { "U1", "B1", NULL, 1, ddUint },
+        { "U8", "B8", NULL, 1, ddUint },
+        { "U16", "B16", byte_swap_16, 1, ddUint },
+        { "U32", "B32", byte_swap_32, 1, ddUint },
+        { "U64", "B64", byte_swap_64, 1, ddUint },
+
+        /* the basic signed integer types */
+        { "I8", "B8", NULL, 1, ddInt },
+        { "I16", "B16", byte_swap_16, 1, ddInt },
+        { "I32", "B32", byte_swap_32, 1, ddInt },
+        { "I64", "B64", byte_swap_64, 1, ddInt },
+
+#if INTRINSIC_SUB_BYTE_MULTI_BIT_TYPES
+        /* all the basic bit tuples are subtypes
+           of opaque, making them essentially atomic,
+           required due to native byte order issues */
+        { "B2", "opaque", NULL, 2, ddUint },
+        { "B4", "opaque", NULL, 4, ddUint },
+        { "U2", "B2", NULL, 1, ddUint },
+        { "U4", "B4", NULL, 1, ddUint },
+        { "I4", "B4", NULL, 1, ddInt },
+#endif
+
+#if SUPPORT_128_BIT
+        /* 128 bit types */
+        { "B128", "opaque", byte_swap_128, 128, ddUint },
+        { "U128", "B128", byte_swap_128, 1, ddUint },
+        { "I128", "B128", byte_swap_128, 1, ddInt },
+#endif
+
+        /* floating point */
+        { "F32", "B32", byte_swap_32, 1, ddFloat },
+        { "F64", "B64", byte_swap_64, 1, ddFloat },
+
+        /* bool is typed to reflect C/C++ */
+        { "bool", "U8", NULL, 1, ddBool },
+
+        /* default character set is UNICODE */
+        { "utf8", "B8", NULL, 1, ddUnicode },
+        { "utf16", "B16", byte_swap_16, 1, ddUnicode },
+        { "utf32", "B32", byte_swap_32, 1, ddUnicode },
+
+        /* contrary to sub-classing, which extends/expands
+           a class, sub-typing refines it, making ASCII
+           a sub-type of UTF-8 in our system */
+        { "ascii", "utf8", NULL, 1, ddAscii }
+    };
+
+    for ( i = 0; i < sizeof dt / sizeof dt [ 0 ]; ++ i )
+    {
+        rc_t rc;
+        String name;
+        SDatatype *newtype;
+        const SDatatype *super = NULL;
+
+        if ( dt [ i ] . supertype != NULL )
+        {
+            KSymbol *sym;
+
+            /* find supertype in symbol table */
+            StringInitCString ( & name, dt [ i ] . supertype );
+            sym = KSymTableFind ( tbl, & name );
+            assert ( sym != NULL );
+            assert ( sym -> type == eDatatype );
+            super = sym -> u . obj;
+        }
+
+        /* create datatype */
+        newtype = malloc ( sizeof * newtype );
+        if ( newtype == NULL )
+            return RC ( rcVDB, rcSchema, rcConstructing, rcMemory, rcExhausted );
+
+        /* initialize datatype */
+        newtype -> super = super;
+        newtype -> byte_swap = dt [ i ] . byte_swap;
+        newtype -> size = ( ( super != NULL ) ? super -> size : 1 ) * dt [ i ] . dim;
+        newtype -> dim = dt [ i ] . dim;
+        newtype -> domain = dt [ i ] . domain;
+
+        /* just to cover any lazy programming, take byte_swap
+           from super-type if not already specified */
+        if ( super != NULL && newtype -> byte_swap == NULL )
+            newtype -> byte_swap = super -> byte_swap;
+
+        /* create symbol for new type */
+        StringInitCString ( & name, dt [ i ] . newtype );
+        newtype -> name = KSymTableFind ( tbl, & name );
+        assert ( newtype -> name == NULL || i == 1 );
+        if ( newtype -> name == NULL )
+            rc = KSymTableCreateConstSymbol ( tbl, & newtype -> name, & name, eDatatype, newtype );
+        else
+            rc = 0;
+
+        /* add datatype */
+        if ( rc == 0 )
+            rc = VectorAppend ( & self -> dt, & newtype -> id, newtype );
+
+        if ( rc != 0 )
+        {
+            free ( newtype );
+            return rc;
+        }
+    }
+
+    return 0;
+}
+
+
+/* MakeIntrinsic
+ *  initialize intrinsics
+ */
+rc_t VSchemaMakeIntrinsic ( VSchema **sp )
+{
+    rc_t rc = VSchemaMake ( sp, NULL );
+    if ( rc == 0 )
+    {
+        KSymTable tbl;
+        VSchema *self = * sp;
+
+        /* create symbol table with no intrinsic scope */
+        rc = KSymTableInit ( & tbl, NULL );
+        if ( rc == 0 )
+        {
+            /* make intrinsic scope modifiable */
+            KSymTablePushScope ( & tbl, & self -> scope );
+
+            /* add keywords, which are only names */
+            rc = init_keywords ( & tbl );
+            if ( rc == 0 )
+            {
+                /* TBD - init intrinsic formats */
+                rc = VSchemaInitTypes ( self, & tbl );
+                if ( rc == 0 )
+                {
+                    KSymTableWhack ( & tbl );
+                    return 0;
+                }
+            }
+
+            KSymTableWhack ( & tbl );
+        }
+
+        VSchemaRelease ( self );
+    }
+
+    * sp = NULL;
+
+    return rc;
+}
+
+/* LastIntrinsicTypeId - PRIVATE
+ *  used to allow cast to intrinsics
+ */
+LIB_EXPORT uint32_t CC VSchemaLastIntrinsicTypeId ( const VSchema *self )
+{
+    uint32_t last;
+    for ( last = 0; self != NULL; self = self -> dad )
+    {
+        if ( self -> dad == NULL )
+        {
+            last = VectorStart ( & self -> dt ) + VectorLength ( & self -> dt );
+            if ( last != 0 )
+                -- last;
+            break;
+        }
+    }
+
+    return last;
+}
diff --git a/libs/vdb/schema-parse.c b/libs/vdb/schema-parse.c
new file mode 100644
index 0000000..4ea920a
--- /dev/null
+++ b/libs/vdb/schema-parse.c
@@ -0,0 +1,857 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "schema-priv.h"
+#include "schema-expr.h"
+#include "schema-parse.h"
+#include "schema-dump.h"
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * SchemaEnv
+ */
+
+/* Init - PRIVATE
+ *  initialize to current version
+ */
+static
+void SchemaEnvInitFeatures ( SchemaEnv *env )
+{
+    assert ( env != NULL );
+
+    switch ( env -> version >> 24 )
+    {
+    case 0:
+        env -> schema_param_types_absent = 1;
+        env -> mixed_fact_param_list = 1;
+        env -> script_function_called_schema = 1;
+        break;
+    case 1:
+        switch ( ( uint8_t ) ( env -> version >> 16 ) )
+        {
+        case 1:
+            env -> default_view_decl = 1;
+            env -> has_view_keyword = 1;
+            break;
+        }
+    }
+}
+
+void SchemaEnvInit ( SchemaEnv *env, uint32_t version )
+{
+    assert ( env != NULL );
+    memset ( env, 0, sizeof * env );
+
+    /* set version */
+    env -> version = version;
+    SchemaEnvInitFeatures ( env );
+}
+
+
+/*--------------------------------------------------------------------------
+ * SConstant
+ */
+#if SLVL >= 2
+
+/* Whack
+ */
+void CC SConstantWhack ( void *item, void *ignore )
+{
+    SConstant *self = item;
+    SExpressionWhack ( self -> expr );
+    free ( self );
+}
+
+/* Mark
+ */
+void CC SConstantClearMark ( void *item, void *ignore )
+{
+    SConstant *self = item;
+    self -> marked = false;
+}
+
+void SConstantMark ( const SConstant *cself )
+{
+    SConstant *self = ( SConstant* ) cself;
+    if ( self != NULL && ! self -> marked )
+        self -> marked = true;
+}
+
+/* Dump
+ *  dump "const", dump object
+ */
+rc_t SConstantDump ( const SConstant *self, struct SDumper *d )
+{
+    return FQNDump ( self != NULL ? self -> name : NULL, d );
+}
+
+bool CC SConstantDefDump ( void *item, void *data )
+{
+    SDumper *b = data;
+    const SConstant *self = ( const void* ) item;
+
+    if ( SDumperMarkedMode ( b ) && ! self -> marked )
+        return false;
+
+    if ( SDumperMode ( b ) == sdmCompact )
+    {
+        return SDumperPrint ( b, "const %T %N=%E;",
+            & self -> td, self -> name, self -> expr );
+    }
+
+    return SDumperPrint ( b, "const %T %N = %E;\n",
+        & self -> td, self -> name, self -> expr );
+}
+
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ */
+
+
+/* resolve_object
+ *  generic object find
+ *
+ *  "td" [ OUT, NULL OKAY ] - returns cast type expression
+ *  if given or "any" if not
+ *
+ *  "name" [ OUT ] - returns list of overloaded objects if found
+ *
+ *  "type" [ OUT ] - returns object type id, e.g.:
+ *    eDatatype, eTypeset, eFormat, eFunction, ePhysical, eTable, ...
+ *
+ *  "expr" [ IN ] - NUL terminated name expression identifying object
+ *
+ *  "ctx" [ IN ] - NUL terminated context string for evaluation,
+ *  substitutes for filename in logging reports
+ *
+ *  "dflt" [ IN ] - if true, resolve default value
+ *
+ *  returns principal object identified. if NULL but "name" is not
+ *  NULL, then the object was only partially identified.
+ */
+static
+int64_t CC SColumnSortByID ( const void **item, const void **n, void *ignore )
+{
+    const SColumn *a = * item;
+    const SColumn *b = * n;
+    return VCtxIdCmp ( & a -> cid, & b -> cid );
+}
+
+static
+void CC SColumnLastDefault ( void *item, void *data )
+{
+    const SColumn *self = ( const SColumn* ) item;
+    const SColumn **colp = ( const SColumn** ) data;
+
+    if ( self -> dflt || * colp == NULL )
+        * colp = self;
+}
+
+typedef struct column_best_fit_data column_best_fit_data;
+struct column_best_fit_data
+{
+    const SColumn *scol;
+    const VSchema *schema;
+    VTypedecl td;
+    uint32_t distance;
+};
+
+static
+void CC SColumnBestFit ( void *item, void *data )
+{
+    const SColumn *scol = ( const void * ) item;
+    if ( scol -> td . type_id != 0 )
+    {
+        uint32_t distance;
+        column_best_fit_data *pb = data;
+        if ( VTypedeclToTypedecl ( & scol -> td, pb -> schema, & pb -> td, NULL, & distance ) )
+        {
+            if ( pb -> scol == NULL || pb -> distance > distance )
+            {
+                pb -> scol = scol;
+                pb -> distance = distance;
+            }
+        }
+    }
+}
+
+const void *resolve_object ( const KSymTable *tbl,
+    const VSchema *self, VTypedecl *tdp, const SNameOverload **namep,
+     uint32_t *type, const char *expr, const char *ctx, bool dflt )
+{
+    rc_t rc;
+    const void *obj;
+    
+    VTypedecl td;
+    bool has_type = false;
+
+    KToken t;
+    KTokenText tt;
+    KTokenSource src;
+
+    SchemaEnv env;
+    SchemaEnvInit ( & env, EXT_SCHEMA_LANG_VERSION );
+
+    KTokenTextInitCString ( & tt, expr, ctx );
+    KTokenSourceInit ( & src, & tt );
+    next_token ( tbl, & src, & t );
+
+    /* initialize return values */
+    obj = NULL;
+
+    /* ready to go - can accept a typecast */
+    if ( t . id == eLeftParen )
+    {
+        has_type = true;
+        next_token ( tbl, & src, & t );
+        rc = typedecl ( tbl, & src, & t, & env, self, & td );
+        if ( rc == 0 )
+            rc = expect ( tbl, & src, & t, eRightParen, ")", true );
+        if ( tdp != NULL )
+            * tdp = td;
+    }
+
+    /* can also accept a physical name */
+    else 
+    {
+        if ( t . id == ePeriod )
+            physical_name ( tbl, & src, & t, & env );
+        if ( tdp != NULL )
+            memset ( tdp, 0, sizeof * tdp );
+        rc = 0;
+    }
+
+    /* we recognize a column name or
+       a fully-qualified name optionally followed by
+       a version to fully-qualify obj */
+    if ( rc == 0 && t.sym == NULL )
+        rc = SILENT_RC ( rcVDB, rcSchema, rcParsing, rcToken, rcUnexpected );
+    else if ( rc == 0 )
+        rc = next_fqn ( tbl, & src, & t, & env );
+    if ( rc == 0 )
+    {
+        uint32_t vers;
+        KToken st = t;
+        bool has_vers = false;
+        bool needs_name = true;
+        const SNameOverload *name = NULL;
+
+        next_token ( tbl, & src, & t );
+        switch ( st . id )
+        {
+        case eConstant:
+        case eFormat:
+        case eDatatype:
+        case eTypeset:
+        case ePhysMember:
+        case eTblMember:
+        case eDBMember:
+            needs_name = false;
+            obj = st . sym -> u . obj;
+            break;
+        case eFunction:
+        case eScriptFunc:
+        case ePhysical:
+        case eTable:
+        case eDatabase:
+            if ( t . id == eHash )
+            {
+                next_token ( tbl, & src, & t );
+                rc = maj_min_rel ( tbl, & src, & t, & env, self, & vers, true );
+                if ( rc != 0 )
+                    break;
+                has_vers = true;
+            }
+        case eUntypedFunc:
+        case eColumn:
+            name = st . sym -> u . obj;
+            break;
+        }
+
+        /* check if we found anything at all */
+        if ( obj != NULL || name != NULL )
+        {
+            /* accept but don't require semi-colon */
+            if ( t . id == eSemiColon )
+                next_token ( tbl, & src, & t );
+
+            /* expect end of input or else we didn't recognize */
+            if ( t . id != eEndOfInput )
+            {
+                obj = NULL;
+                name = NULL;
+            }
+        }
+
+        /* if we have something */
+        if ( obj != NULL || name != NULL )
+        {
+            * type = st . id;
+
+            /* resolve by version */
+            if ( has_vers )
+            {
+                assert ( name != NULL );
+                switch ( st . id )
+                {
+                case eFunction:
+                case eScriptFunc:
+                    obj = VectorFind ( & name -> items, & vers, NULL, SFunctionCmp );
+                    break;
+                case ePhysical:
+                    obj = VectorFind ( & name -> items, & vers, NULL, SPhysicalCmp );
+                    break;
+                case eTable:
+                    obj = VectorFind ( & name -> items, & vers, NULL, STableCmp );
+                    break;
+                case eDatabase:
+                    obj = VectorFind ( & name -> items, & vers, NULL, SDatabaseCmp );
+                    break;
+                }
+
+                /* since a version was requested,
+                   don't allow a partial find */
+                if ( obj == NULL )
+                    name = NULL;
+            }
+
+            /* resolve by type or default */
+            else if ( needs_name )
+            {
+                assert ( name != NULL );
+                switch ( st . id )
+                {
+                case eColumn:
+                    if ( ! has_type )
+                    {
+                        Vector items;
+                        rc = VectorCopy ( & name -> items, & items );
+                        if ( rc != 0 )
+                            break;
+                        VectorReorder ( & items, SColumnSortByID, NULL );
+                        VectorForEach ( & items, false, SColumnLastDefault, (void*)& obj );
+                        VectorWhack ( & items, NULL, NULL );
+                    }
+                    else
+                    {
+                        column_best_fit_data pb;
+                        pb . scol = NULL;
+                        pb . schema = self;
+                        pb . td = td;
+                        pb . distance = -1;
+
+                        VectorForEach ( & name -> items, false, SColumnBestFit, & pb );
+                        obj = pb . scol;
+                        if ( obj == NULL )
+                        {
+                            /* if named column is incomplete, allow match */
+                            memset ( & td, 0, sizeof td );
+                            obj = VectorFind ( & name -> items, & td, NULL, SColumnCmp );
+
+                            /* if column could not be matched by type, forget it */
+                            if ( obj == NULL )
+                                name = NULL;
+                        }
+                    }
+                    break;
+
+                default:
+                    if ( dflt )
+                        obj = VectorLast ( & name -> items );
+                }
+            }
+
+            * namep = name;
+        }
+    }
+
+    return obj;
+}
+
+/* Find
+ *  generic object find
+ *
+ *  "name" [ OUT ] - returns list of overloaded names if found
+ *
+ *  "type" [ OUT ] - returns object type id, e.g.:
+ *    eDatatype, eTypeset, eFormat, eFunction, ePhysical, eTable, ...
+ *
+ *  "expr" [ IN ] - name expression identifying object
+ *
+ *  returns principal object identified. if NULL but "name" is not
+ *  NULL, then the object was only partially identified.
+ */
+const void *VSchemaFind ( const VSchema *self,
+    const SNameOverload **name, uint32_t *type,
+    const char *expr, const char *ctx, bool dflt )
+{
+    rc_t rc;
+    KSymTable tbl;
+
+    /* initialize to not-found */
+    const void *obj = NULL;
+    * name = NULL;
+    * type = 0;
+
+    /* build a symbol table for schema */
+    rc = init_symtab ( & tbl, self );
+    if ( rc == 0 )
+    {
+        obj = resolve_object ( & tbl, self, NULL, name, type, expr, ctx, dflt );
+        KSymTableWhack ( & tbl );
+    }
+
+    return obj;
+}
+
+
+/* next_token
+ *  gets next token
+ *  looks up any identifier in symbol table
+ *  converts token id to found symbol type
+ */
+KToken *next_token ( const KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+    if ( KTokenizerNext ( kDefaultTokenizer, src, t ) -> id == eIdent )
+    {
+        KSymbol *sym = KSymTableFind ( tbl, & t -> str );
+        t -> sym = sym;
+        if ( sym != NULL )
+            t -> id = sym -> type;
+    }
+
+    return t;
+}
+
+KToken *next_shallow_token ( const KSymTable *tbl, KTokenSource *src, KToken *t, bool plus_intrinsic )
+{
+    if ( KTokenizerNext ( kDefaultTokenizer, src, t ) -> id == eIdent || t -> id == eName )
+    {
+        KSymbol *sym = KSymTableFindShallow ( tbl, & t -> str );
+        if ( sym == NULL && plus_intrinsic )
+            sym = KSymTableFindIntrinsic ( tbl, & t -> str );
+        t -> sym = sym;
+        if ( sym != NULL )
+            t -> id = sym -> type;
+    }
+
+    return t;
+}
+
+
+/* expect
+ *  performs a comparison of t->id against id, and takes one of 3 actions:
+ *  1) when ids match, advance to next token and return 0
+ *  2) when ids don't match but the expected token is not required,
+ *     issue a KTokenExpected warning using expected text and return 0
+ *  3) when ids don't match and the expected token is required,
+ *     issue a KTokenExpected error using expected text and return its rc_t
+ */
+rc_t expect ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    int id, const char *expected, bool required )
+{
+    if ( t -> id == id )
+        next_token ( tbl, src, t );
+    else if ( ! required )
+        KTokenExpected ( t, klogWarn, expected );
+    else
+        return KTokenExpected ( t, klogErr, expected );
+    return 0;
+}
+
+
+/*
+ * maj-min            = <uint-expr> [ '.' <uint-expr> ]
+ * maj-min-rel        = <uint-expr> [ '.' <uint-expr> [ '.' <uint-expr> ] ]
+ */
+
+#if SLVL >= 1
+rc_t maj_min_rel ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, uint32_t *version, bool accept_release )
+{
+    rc_t rc;
+
+    if ( ! accept_release && t -> id == eMajMinRel )
+        return KTokenExpected ( t, klogErr, "maj.min version" );
+
+    rc = KTokenToVersion ( t, version );
+    if ( rc != 0 )
+        KTokenExpected ( t, klogErr, "version spec" );
+
+    next_token ( tbl, src, t );
+    return rc;
+}
+#endif
+
+
+/*
+ * const-definition   = 'const' <typedecl> <fqn> '=' <const-expr>
+ */
+#if SLVL >= 2
+static
+rc_t const_definition ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    rc_t rc;
+    SConstant *cnst = malloc ( sizeof * cnst );
+    if ( cnst == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    rc = typedecl ( tbl, src, t, env, self, & cnst -> td );
+    if ( rc == 0 )
+        rc = create_fqn ( tbl, src, t, env, eConstant, cnst );
+    if ( rc == 0 )
+    {
+        cnst -> name = t -> sym;
+        rc = expect ( tbl, src, next_token ( tbl, src, t ), eAssign, "=", true );
+        if ( rc == 0 )
+            rc = const_expr ( tbl, src, t, env, self, & cnst -> expr );
+    }
+    else if ( GetRCState ( rc ) == rcExists )
+    {
+        cnst -> name = t -> sym;
+        rc = expect ( tbl, src, next_token ( tbl, src, t ), eAssign, "=", true );
+        if ( rc == 0 )
+            rc = const_expr ( tbl, src, t, env, self, & cnst -> expr );
+        if ( rc == 0 )
+        {
+            /* TBD - compare expressions for equivalence */
+            SConstantWhack ( cnst, NULL );
+            return expect ( tbl, src, t, eSemiColon, ";", true );
+        }
+    }
+
+    if ( rc != 0 )
+    {
+        free ( cnst );
+        return rc;
+    }
+
+    rc = VectorAppend ( & self -> cnst, & cnst -> id, cnst );
+    if ( rc != 0 )
+    {
+        SConstantWhack ( cnst, NULL );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    return expect ( tbl, src, t, eSemiColon, ";", true );
+}
+#endif
+
+
+/*
+ * alias-definition   = 'alias' SYMBOL <fqn>
+ */
+static
+rc_t alias_definition ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    const KSymbol *sym;
+
+    /* read symbol name */
+    rc_t rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return KTokenFailure ( t, klogErr, rc, "fully qualified name" );
+
+    /* remember symbol */
+    sym = t -> sym;
+
+    /* create new name */
+    rc = create_fqn ( tbl, src, next_token ( tbl, src, t ),
+        env, sym -> type, sym -> u . obj );
+    if ( rc != 0 )
+    {
+        if ( GetRCState ( rc ) != rcExists )
+            return KTokenFailure ( t, klogErr, rc, "fully qualified name" );
+
+        /* TBD - compare alias */
+        return expect ( tbl, src, next_token ( tbl, src, t ), eSemiColon, ";", true );
+    }
+
+    /* record alias */
+    rc = VectorAppend ( & self -> alias, NULL, t -> sym );
+    if ( rc != 0 )
+        return KTokenRCExplain ( t, klogErr, rc );
+
+    return expect ( tbl, src, next_token ( tbl, src, t ), eSemiColon, ";", true );
+}
+
+
+/*
+ * extern-decl        = 'extern' 'function' <ext-function-decl> ';'
+ */
+static
+rc_t extern_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    switch ( t -> id )
+    {
+#if SLVL >= 3
+    case kw_function:
+        return extfunc_declaration ( tbl, src, next_token ( tbl, src, t ), env, self );
+#endif
+    default:
+        break;
+    }
+
+    return KTokenExpected ( t, klogErr, "function" );
+}
+
+
+/*
+ * validate-decl      = 'validate' 'function' <validate-function-decl> ';'
+ */
+static
+rc_t validate_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    switch ( t -> id )
+    {
+#if SLVL >= 3
+    case kw_function:
+        return valfunc_declaration ( tbl, src, next_token ( tbl, src, t ), env, self );
+#endif
+    default:
+        break;
+    }
+
+    return KTokenExpected ( t, klogErr, "function" );
+}
+
+
+/*
+ * include-stmt       = 'include' STRING ';'
+ */
+static
+rc_t include_stmt ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    rc_t rc;
+
+    if ( t -> id != eString )
+        return KTokenExpected ( t, klogErr, "file path" );
+
+    rc = VSchemaParseFile ( self, "%.*s", ( int ) ( t -> str . size - 2 ), t -> str . addr + 1 );
+    if ( rc != 0 )
+        return KTokenRCExplain ( t, klogErr, rc );
+
+    return expect ( tbl, src, next_token ( tbl, src, t ), eSemiColon, ";", true );
+}
+
+
+/*
+ * schema-decl        = <type-definition>
+ *                    | <typeset-definition>
+ *                    | <format-definition>
+ *                    | <const-definition>
+ *                    | <alias-definition>
+ *                    | <extern-decl>
+ *                    | <script-decl>
+ *                    | <function-decl>
+ *                    | <physical-decl>
+ *                    | <table-decl>
+ *                    | <database-decl>
+ *                    | <include-stmt>
+ *                    | ';'
+ */
+static
+rc_t schema_decl ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    /* expect a keyword */
+    switch ( t -> id )
+    {
+#if SLVL >= 1
+    case kw_typedef:
+        return type_definition ( tbl, src, next_token ( tbl, src, t ), env, self );
+    case kw_typeset:
+        return typeset_definition ( tbl, src, next_token ( tbl, src, t ), env, self );
+#endif
+    case kw_fmtdef:
+        return format_definition ( tbl, src, next_token ( tbl, src, t ), env, self );
+#if SLVL >= 2
+    case kw_const:
+        return const_definition ( tbl, src, next_token ( tbl, src, t ), env, self );
+#endif
+    case kw_alias:
+        return alias_definition ( tbl, src, next_token ( tbl, src, t ), env, self );
+
+    case kw_extern:
+        return extern_declaration ( tbl, src, next_token ( tbl, src, t ), env, self );
+#if SLVL >= 3
+    case kw_function:
+        return function_declaration ( tbl, src, next_token ( tbl, src, t ), env, self );
+#endif
+#if SLVL >= 4
+    case kw_schema:
+        return script_declaration ( tbl, src, next_token ( tbl, src, t ), env, self );
+#endif
+#if SLVL >= 5
+    case kw_physical:
+        return physical_declaration ( tbl, src, next_token ( tbl, src, t ), env, self );
+#endif
+#if SLVL >= 6
+    case kw_table:
+        return table_declaration ( tbl, src, next_token ( tbl, src, t ), env, self );
+    case kw_database:
+        return database_declaration ( tbl, src, next_token ( tbl, src, t ), env, self );
+#endif
+    case kw_include:
+        return include_stmt ( tbl, src, next_token ( tbl, src, t ), env, self );
+
+    case kw_validate:
+        return validate_declaration ( tbl, src, next_token ( tbl, src, t ), env, self );
+
+    case eSemiColon:
+        /* TBD - issue warning if desired */
+        next_token ( tbl, src, t );
+        return 0;
+    }
+
+    /* it wasn't the right thing */
+    return KTokenExpected ( t, klogErr,
+        "include, typedef, typeset, fmtdef, function, schema, database or table" );
+}
+
+/*
+ * schema-version     = 'version' <maj-min>
+ */
+#if SLVL >= 1
+static
+rc_t schema_version ( const KSymTable *tbl, KTokenSource *src, KToken *t, SchemaEnv *env )
+{
+    rc_t rc = maj_min_rel ( tbl, src, t, env, NULL, & env -> version, false );
+    if ( rc == 0 )
+        SchemaEnvInitFeatures ( env );
+    return rc;
+}
+#endif
+
+
+/* examine_schema_contents
+ *  run a sanity check on schema contents
+ */
+#if EXAMINE_SCHEMA_CONTENTS >= 1
+static
+rc_t examine_schema_contents ( const VSchema *self )
+{
+    rc_t rc = 0;
+
+    if ( self -> dad != NULL )
+    {
+        rc = examine_schema_contents ( self -> dad );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    if ( BSTreeDoUntil ( & self -> scope, false, KSymbolExamineContents, & rc ) )
+        return rc;
+
+    return 0;
+}
+#endif
+
+/*
+ * schema             = [ <schema-version> ';' ] [ <schema-decl-list> ]
+ *
+ * schema-decl-list   = <schema-decl> [ <schema-decl-list> ]
+ */
+rc_t init_symtab ( KSymTable *tbl, const VSchema *self )
+{
+    rc_t rc;
+
+    if ( self -> dad == NULL )
+        return KSymTableInit ( tbl, ( BSTree* ) & self -> scope );
+
+    rc = init_symtab ( tbl, self -> dad );
+    if ( rc == 0 )
+        rc = KSymTablePushScope ( tbl, ( BSTree* ) & self -> scope );
+
+    return rc;
+}
+
+rc_t schema ( KTokenSource *src, VSchema *self )
+{
+    /* push schema scope onto symbol table */
+    KSymTable tbl;
+    rc_t rc = init_symtab ( & tbl, self );
+    if ( rc == 0 )
+    {
+        KToken t;
+        SchemaEnv env;
+
+        /* prime token and look for version */
+        next_token ( & tbl, src, & t );
+#if SLVL >= 1
+        /* initialize default to v1 */
+        if ( t . id != kw_version )
+            SchemaEnvInit ( & env, 0x01000000 );
+        else
+        {
+            /* initialize explicit version */
+            memset ( & env, 0, sizeof env );
+            rc = schema_version ( & tbl, src, next_token ( & tbl, src, & t ), & env );
+            if ( rc == 0 )
+                rc = expect ( & tbl, src, & t, eSemiColon, ";", true );
+        }
+#endif
+        if ( rc == 0 && t . id != eEndOfInput )
+        {
+            /* implement optional schema-decl-list */
+            while ( rc == 0 && t . id != eEndOfInput )
+            {
+#if EXAMINE_SCHEMA_CONTENTS >= 1
+                rc = examine_schema_contents ( self );
+                if ( rc == 0 )
+#endif
+                rc = schema_decl ( & tbl, src, & t, & env, self );
+            }
+        }
+
+        KSymTableWhack ( & tbl );
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/schema-parse.h b/libs/vdb/schema-parse.h
new file mode 100644
index 0000000..efd695f
--- /dev/null
+++ b/libs/vdb/schema-parse.h
@@ -0,0 +1,607 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_schema_parse_
+#define _h_schema_parse_
+
+#ifndef _h_schema_priv_
+#include "schema-priv.h"
+#endif
+
+#ifndef _h_schema_tok_
+#include "schema-tok.h"
+#endif
+
+#ifndef _h_klib_symtab_
+#include <klib/symtab.h>
+#endif
+
+#ifndef _h_klib_debug_
+#include <klib/debug.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * defines
+ */
+#define PARSE_DEBUG( msg ) \
+    DBGMSG ( DBG_VDB, DBG_FLAG ( DBG_VDB_PARSE ), msg )
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct SVector;
+struct STable;
+struct SDatabase;
+struct SFunction;
+struct SConstExpr;
+struct SFormParmlist;
+struct SExpression;
+struct STypeExpr;
+
+/*--------------------------------------------------------------------------
+ * extension of token ids
+ */
+enum
+{
+    /* a symbolic constant */
+    eConstant = eNumSymtabIDs,
+
+    /* format type */
+    eFormat,
+
+    /* dynamic data type */
+    eDatatype,
+
+    /* typeset */
+    eTypeset,
+
+    /* factory */
+    eFactory,
+
+    /* external C function */
+    eFunction,
+    eUntypedFunc,
+    eRowLengthFunc,
+
+    /* script function */
+    eScriptFunc,
+
+    /* schema type and param
+       a schema type is a templatized type, basically
+       a name without a completed definition
+
+       a schema param is a parameterized constant that
+       can be used in defining type vector dimensions */
+    eSchemaType,
+    eSchemaParam,
+
+    /* factory param and name
+       a factory param is a templatized constant, but
+       cannot be used to define type dimensions */
+    eFactParam,
+
+    /* function param */
+    eFuncParam,
+
+    /* intermediate production */
+    eProduction,
+
+    /* physical column */
+    ePhysical,
+
+    /* physical column member */
+    ePhysMember,
+
+    /* external column */
+    eColumn,
+
+    /* forward declaration */
+    eForward,
+
+    /* purely virtual production */
+    eVirtual,
+
+    /* table */
+    eTable,
+
+    /* table member */
+    eTblMember,
+
+    /* database */
+    eDatabase,
+
+    /* database member */
+    eDBMember,
+
+    /* keywords */
+    eFirstKeyword,
+
+    kw_alias = eFirstKeyword,
+    kw_column,
+    kw_const,
+    kw_control,
+    kw_database,
+    kw_decode,
+    kw_default,
+    kw_encode,
+    kw_extern,
+    kw_false,
+    kw_fmtdef,
+    kw_function,
+    kw_include,
+    kw_index,
+    kw_limit,
+    kw_physical,
+    kw_read,
+    kw_readonly,
+    kw_return,
+    kw_schema,
+    kw_static,
+    kw_table,
+    kw_template,
+    kw_trigger,
+    kw_true,
+    kw_type,
+    kw_typedef,
+    kw_typeset,
+    kw_validate,
+    kw_version,
+    kw_view,
+    kw_virtual,
+    kw_void,
+    kw_writeonly,
+
+    /* special keywords */
+    kw___untyped,
+    kw___row_length,
+    kw___no_header
+
+};
+
+/* SchemaEnv
+ *  states the schema language version
+ *  gives switches as to features, errors, warnings, etc.
+ */
+typedef struct SchemaEnv SchemaEnv;
+struct SchemaEnv
+{
+    /* maj.min.rel format,
+       only maj.min supported */
+    uint32_t version;
+
+    /* V0 COMPATIBILITY SWITCHES */
+    uint32_t schema_param_types_absent : 1;
+    uint32_t mixed_fact_param_list : 1;
+    uint32_t script_function_called_schema : 1;
+
+    /* V1 SWITCHES */
+    uint32_t default_view_decl : 1;
+    uint32_t has_view_keyword : 1;
+};
+
+/* SCHEMA_LANG_VERSION
+ *  version numbers of schema language
+ */
+#define CUR_SCHEMA_LANG_VERSION 0x01000000
+#define EXT_SCHEMA_LANG_VERSION 0x01000000
+
+/* Init
+ *  initialize to current version
+ */
+void SchemaEnvInit ( SchemaEnv *env, uint32_t version );
+
+/*--------------------------------------------------------------------------
+ * schema-parse.c
+ */
+
+/*
+ * schema             = [ <schema-version> ';' ] [ <schema-decl-list> ]
+ *
+ * schema-decl-list   = <schema-decl> [ <schema-decl-list> ]
+ *
+ * schema-decl        = <type-definition> ';'
+ *                    | <typeset-definition> ';'
+ *                    | <format-definition> ';'
+ *                    | <function-decl> ';'
+ *                    | <schema-decl>
+ *                    | <table-decl>
+ *
+ * schema-version     = 'version' <maj-min>
+ */
+rc_t schema ( KTokenSource *src, VSchema *self );
+
+/*
+ * init_symtab
+ *  initializes "tbl"
+ *  places schema and parents into scope
+ *  must be balanced by KSymTableWhack
+ */
+rc_t init_symtab ( KSymTable *tbl, const VSchema *self );
+
+/* next_token
+ *  gets next token
+ *  looks up any identifier in symbol table
+ *  converts token id to found symbol type
+ * next_shallow_token
+ *  only searches current scope, and optionally intrinsic scope
+ */
+#define next_token vdb_next_token
+#define next_shallow_token vdb_next_shallow_token
+KToken *next_token ( const KSymTable *tbl, KTokenSource *src, KToken *t );
+KToken *next_shallow_token ( const KSymTable *tbl,
+    KTokenSource *src, KToken *t, bool plus_intrinsic );
+
+/* expect
+ *  performs a comparison of t->id against id, and takes one of 3 actions:
+ *  1) when ids match, advance to next token and return 0
+ *  2) when ids don't match but the expected token is not required,
+ *     issue a KTokenExpected warning using expected text and return 0
+ *  3) when ids don't match and the expected token is required,
+ *     issue a KTokenExpected error using expected text and return its rc_t
+ */
+rc_t expect ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    int id, const char *expected, bool required );
+
+/*
+ * maj-min            = <uint-expr> [ '.' <uint-expr> ]
+ * maj-min-rel        = <uint-expr> [ '.' <uint-expr> [ '.' <uint-expr> ] ]
+ */
+rc_t maj_min_rel ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, uint32_t *version, bool accept_release );
+
+rc_t next_uint ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, uint32_t *val );
+
+/* resolve_object
+ *  generic object find
+ *
+ *  "td" [ OUT, NULL OKAY ] - returns cast type expression
+ *  if given or "any" if not
+ *
+ *  "name" [ OUT ] - returns list of overloaded objects if found
+ *
+ *  "type" [ OUT ] - returns object type id, e.g.:
+ *    eDatatype, eTypeset, eFormat, eFunction, ePhysical, eTable, ...
+ *
+ *  "expr" [ IN ] - NUL terminated name expression identifying object
+ *
+ *  "ctx" [ IN ] - NUL terminated context string for evaluation,
+ *  substitutes for filename in logging reports
+ *
+ *  "dflt" [ IN ] - if true, resolve default value
+ *
+ *  returns principal object identified. if NULL but "name" is not
+ *  NULL, then the object was only partially identified.
+ */
+const void *resolve_object ( const KSymTable *tbl,
+    const VSchema *self, VTypedecl *td, const SNameOverload **name,
+    uint32_t *type, const char *expr, const char *ctx, bool dflt );
+
+
+/*--------------------------------------------------------------------------
+ * schema-type.c
+ */
+
+
+/*
+ * fqn                = ID [ <nested-name> ]
+ * nested-name        = ':' NAME [ <nested-name> ]
+ */
+rc_t next_fqn ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env );
+rc_t create_fqn ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, uint32_t id, const void *obj );
+
+
+/*
+ * dim                = '[' <uint-expr> ']'
+ */
+rc_t dim ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, uint32_t *dim, bool required );
+
+/*
+ * typename           = <fqn>
+ * typedecl           = <typename> [ <dim> ]
+ */
+rc_t typename ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, uint32_t *id );
+rc_t typedecl ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, VTypedecl *td );
+
+/*
+ * typeset            = <fqn>
+ * typespec           = <typedecl>
+ *                    | <typeset> [ <dim> ]
+ */
+rc_t typeset ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, uint32_t *id );
+rc_t typespec ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, VTypedecl *td );
+
+/*
+ * fmtname            = <fqn>
+ * fmtdecl            = <fmtname> [ '/' <typedecl> ]
+ *                    | <typedecl>
+ * fmtspec            = <fmtname> [ '/' <typedecl> ]
+ *                    | <typespec>
+ */
+rc_t fmtname ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, uint32_t *id );
+rc_t fmtdecl ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, VFormatdecl *fd );
+rc_t fmtspec ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, VFormatdecl *fd );
+
+/*
+ * type-definition    = 'typedef' <typename> <typedef-list>
+ * typedef-list       = <typedef-decl> [ ',' <typedef-list> ]
+ * typedef-decl       = <fqn> [ <dim> ]
+ */
+rc_t type_definition ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self );
+
+/*
+ * typeset-definition = 'typeset' <typeset> '{' <typespec-list> '}'
+ * typespec-list      = <typespec> [ ',' <typespec-list> ]
+ */
+rc_t typeset_definition ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self );
+
+/*
+ * format-definition  = 'fmtdef' [ <fmtname> ] <fqn>
+ */
+rc_t format_definition ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self );
+
+
+/*--------------------------------------------------------------------------
+ * schema-func.c
+ */
+
+/*
+ * function-decl      = [ 'extern' ] 'function' <ext-function-decl> ';'
+ *                    | 'validate' 'function' <validate-function-decl> ';'
+ *                    | 'schema' [ 'function' ] <sch-func-decl>
+ *                    | 'function' <ext-func-decl> ';'
+ *                    | 'function' <sch-func-decl>
+ */
+rc_t function_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self );
+rc_t extfunc_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self );
+rc_t valfunc_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self );
+rc_t script_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self );
+
+/*
+ * schema-signature   = <schema-formals>
+ * schema-formals     = <schema-formal> [ ',' <schema-formals> ]
+ * schema-formal      = <schema-typedecl> ID
+ * schema-parmname    = ID
+ */
+rc_t schema_signature ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, struct SFunction *sig );
+
+/*
+ * fact-signature     = <fact-formals> [ '*' <fact-formals> ] [ ',' '...' ]
+ *                    | '*' <fact-formals> [ ',' '...' ]
+ *                    | '...'
+ */
+rc_t fact_signature ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, struct SFormParmlist *sig );
+
+
+/*--------------------------------------------------------------------------
+ * schema-prod.c
+ */
+
+/*
+ * production-stmt    = <func-fmtdecl> ID <assign-expr>
+ *                    | 'trigger' ID <assign-expr>
+ */
+rc_t production_stmt ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, struct Vector *v, uint32_t ptype );
+
+/*
+ * script-body        = '{' <script-stmts> '}'
+ */
+rc_t script_body ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, struct SFunction *f );
+
+/*
+ * physical-decl      = 'physical' [ 'column' ] <typedecl>
+ *                       <fqn> '#' <maj-min-rel> <phys-body>
+ */
+rc_t physical_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self );
+
+
+/*--------------------------------------------------------------------------
+ * schema-expr.c
+ */
+
+/*
+ * dim-expr           = '[' <uint-expr> ']'
+ */
+rc_t dim_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, struct SExpression const **dim, bool required );
+
+
+/*
+ * cond-expr          = <expression> [ '|' <cond-expr> ]
+ */
+rc_t cond_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, struct SExpression const **expr );
+
+/*
+ * expression         = <param-value>
+ *                    | <func-expr>
+ *                    | '(' <func-fmtdecl> ')' <expression>
+ */
+rc_t expression ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, struct SExpression const **expr );
+
+/*
+ * type-expr          = <typeset>
+ *                    | <fmtdecl>
+ *                    | <fmtname> '/' <typeset>
+ */
+rc_t type_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, struct SExpression const **fd );
+rc_t vardim_type_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, struct SExpression const **fd );
+
+/*
+ * const-expr         = <constname>
+ *                    | CONST-VALUE
+ */
+rc_t const_expr ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, struct SExpression const **expr );
+
+/*
+ * phys-encoding-expr = [ '<' <schema-parms> '>' ]
+ *                      <phys-encoding-name> [ '#' <maj-min-rel> ]
+ *                      [ '<' <fact-params> '>' ]
+ */
+rc_t phys_encoding_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, VTypedecl *td, struct SExpression const **expr );
+
+
+/*--------------------------------------------------------------------------
+ * schema-eval.c
+ */
+
+/* eval-const-expr
+ *  tries to evaluate a constant expression against type
+ *  returns non-zero error code if failed
+ */
+rc_t eval_const_expr ( const VSchema *self, const VTypedecl *td,
+    struct SExpression const *expr, struct SExpression **value, Vector *cx_bind );
+
+/* eval-uint-expr
+ *  special const expression evaluator for uint32_t
+ */
+rc_t eval_uint_expr ( const VSchema *self,
+    struct SExpression const *expr, uint32_t *value, Vector *cx_bind );
+
+/* eval-uint64-expr
+ *  special const expression evaluator for uint64_t
+ */
+rc_t eval_uint64_expr ( const VSchema *self,
+    struct SExpression const *expr, uint64_t *value, Vector *cx_bind );
+
+/* eval-expr-syntax
+ *  examine expression syntax
+ *  fixes forward references
+ */
+rc_t eval_expr_syntax ( struct SExpression const *expr );
+
+
+/*--------------------------------------------------------------------------
+ * schema-tbl.c
+ */
+
+/*
+ * physical-name      = '.' ID
+ */
+void physical_name ( const KSymTable *tbl,
+    KTokenSource *src, KToken *t, const SchemaEnv *env );
+
+/*
+ * push-tbl-scope
+ * pop-tbl-scope
+ */
+rc_t push_tbl_scope ( KSymTable *tbl, struct STable const *table );
+void pop_tbl_scope ( KSymTable *tbl, struct STable const *table );
+
+/*
+ * init-tbl-symtab
+ *  initializes "tbl"
+ *  places table in scope
+ *  must be balanced by KSymTableWhack
+ */
+rc_t init_tbl_symtab ( KSymTable *tbl, const VSchema *schema, struct STable const *table );
+
+/*
+ * table-decl         = 'table' <fqn> <table-def>
+ * table-def          = [ <table-dad> ] <table-body>
+ *                    | <table-dad> ';'
+ *
+ * table-dad          = '=' <table-name>
+ *
+ * table-body         = '{' [ <table-decl-list> ] '}'
+ * table-decl-list    = <tbl-local-decl> ';' [ <table-decl-list> ]
+ */
+rc_t table_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self );
+
+
+/*--------------------------------------------------------------------------
+ * schema-db.c
+ */
+
+/*
+ * push-db-scope
+ * pop-db-scope
+ */
+rc_t push_db_scope ( KSymTable *tbl, struct SDatabase const *db );
+void pop_db_scope ( KSymTable *tbl, struct SDatabase const *db );
+
+/*
+ * init-db-symtab
+ *  initializes "tbl"
+ *  places db in scope
+ *  must be balanced by KSymTableWhack
+ */
+rc_t init_db_symtab ( KSymTable *tbl, const VSchema *schema, struct SDatabase const *db );
+
+/*
+ * database-decl      = 'database' <fqn> <database-def>
+ * database-def       = [ <database-dad> ] <database-body>
+ *                    | <database-dad> ';'
+ *
+ * database-dad       = '=' <database-name>
+ *
+ * database-body      = '{' [ <db-decl-list> ] '}'
+ * db-decl-list       = <database-decl>
+ *                    | <table-decl>
+ */
+rc_t database_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_schema_int_ */
diff --git a/libs/vdb/schema-priv.h b/libs/vdb/schema-priv.h
new file mode 100644
index 0000000..565c469
--- /dev/null
+++ b/libs/vdb/schema-priv.h
@@ -0,0 +1,1308 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_schema_priv_
+#define _h_schema_priv_
+
+#ifndef _h_vdb_schema_
+#include <vdb/schema.h>
+#endif
+
+#ifndef _h_vdb_xform_
+#include <vdb/xform.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SLVL - schema development level
+ *  used to bring schema together in an orderly fashion
+ *
+ *  level 0: include, fmtdef, alias
+ *
+ *  level 1: version, typedef, dim, typeset
+ *           const-expr, type-expr
+ *           eval-uint-expr, eval-type-expr
+ *
+ *  level 2: const, eval-const-expr
+ *
+ *  level 3: function, schema-param-decl, fact-param-decl, func-param-decl
+ *           indirect-type-expr, indirect-const-expr, prod-expr
+ *
+ *  level 4: script, return-stmt, prod-stmt
+ *           cond-expr, cast-expr, func-expr, name-expr
+ *
+ *  level 5: physical
+ *
+ *  level 6: database, table
+ *
+ *  level 7: physical members
+ *
+ *  level 8: columns
+ */
+#ifndef SLVL
+#define SLVL 8
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * EXAMINE_SCHEMA_CONTENTS
+ *  debugging setting for examining contents and detecting inconsistencies
+ */
+#ifndef EXAMINE_SCHEMA_CONTENTS
+#if _DEBUGGING
+#define EXAMINE_SCHEMA_CONTENTS 0
+#else
+#define EXAMINE_SCHEMA_CONTENTS 0
+#endif
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct String;
+struct KSymbol;
+struct KTokenText;
+struct KMDataNode;
+struct SFunction;
+struct SDatabase;
+struct VDBManager;
+struct SExpression;
+struct SDumper;
+
+
+/*--------------------------------------------------------------------------
+ * VCtxId
+ *  id within a context
+ *  made to be compatible with KSymbol.u.fwd
+ */
+typedef struct VCtxId VCtxId;
+struct VCtxId
+{
+    uint32_t ctx;
+    uint32_t id;
+};
+
+/* Cmp
+ */
+#define VCtxIdCmp( a, b ) \
+    ( ( ( a ) -> ctx != ( b ) -> ctx ) ? \
+      ( int64_t ) ( a ) -> ctx - ( int64_t ) ( b ) -> ctx : \
+      ( int64_t ) ( a ) -> id - ( int64_t ) ( b ) -> id )
+
+
+/*--------------------------------------------------------------------------
+ * KSymbol
+ */
+
+/* Copy
+ *  deep copy a single symbol
+ */
+rc_t KSymbolCopy ( BSTree *scope,
+    struct KSymbol **cp, struct KSymbol const *orig );
+
+/* CopyScope
+ *  deep copy all symbols within a scope
+ */
+bool CC KSymbolCopyScope ( BSTNode *sym, void *scope );
+
+
+/* ExamineContents
+ *  not much to be done here
+ */
+#if EXAMINE_SCHEMA_CONTENTS >= 1
+bool KSymbolExamineContents ( BSTNode *sym, void *rc );
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KMDataNode
+ */
+
+/* FillSchema
+ *  a schema buffer fill function that reads from KMDataNode
+ *
+ * NB - preset "add_v0" to false for normal operation, "true"
+ *  if the buffer should be prefixed with "version 0;" on first read
+ */
+typedef struct KMDataNodeSchemaFillData KMDataNodeSchemaFillData;
+struct KMDataNodeSchemaFillData
+{
+    struct KMDataNode const *node;
+    size_t pos;
+    char buff [ 64 * 1024 - 1 ];
+    bool add_v0;
+};
+
+rc_t CC KMDataNodeFillSchema ( void *data, struct KTokenText *tt, size_t save );
+
+
+/*--------------------------------------------------------------------------
+ * VTypedecl
+ * VFormatdecl
+ */
+
+/* CommonAncestor
+ *  find a common ancestor between "self" and "peer"
+ *  returns distance as sum of distances from each to "ancestor"
+ */
+bool VFormatdeclCommonAncestor ( const VFormatdecl *self, const VSchema *schema,
+    const VFormatdecl *peer, VFormatdecl *ancestor, uint32_t distances [ 2 ] );
+
+
+/*--------------------------------------------------------------------------
+ * SNameOverload
+ *  describes an overloaded name
+ *  used to implement versioning 
+ */
+typedef struct SNameOverload SNameOverload;
+struct SNameOverload
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* overloaded items */
+    Vector items;
+
+    /* contextual id */
+    VCtxId cid;
+};
+
+/* Make
+ */
+rc_t SNameOverloadMake ( SNameOverload **name,
+    struct KSymbol const *sym, uint32_t start, uint32_t len );
+
+/* Copy
+ */
+rc_t SNameOverloadCopy ( BSTree *scope,
+    SNameOverload **cp, const SNameOverload *orig );
+rc_t SNameOverloadVectorCopy ( BSTree *scope,
+    const Vector *src, Vector *dest );
+
+/* Whack
+ */
+void CC SNameOverloadWhack ( void *self, void *ignore );
+
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ *  a symbol scope
+ *  data types, blob formats, function and sub-schema declarations
+ *  database and table declarations
+ */
+struct VSchema
+{
+    /* parent schema */
+    const VSchema *dad;
+
+    /* global scope for this schema */
+    BSTree scope;
+
+    /* paths of opened files */
+    BSTree paths;
+
+    /* include path - vector of KDirectory references
+       ordered by precedence */
+    Vector inc;
+
+    /* alias names - owned by scope, but recorded for dumping */
+    Vector alias;
+
+    /* formats - ids start at 1, where 0 is reserved for NULL */
+    Vector fmt;
+
+    /* datatypes - ids start at 0, which is reserved for 'any' */
+    Vector dt;
+
+    /* typesets - ids start at 0x40000000 */
+    Vector ts;
+
+    /* parameterized types, declared within function
+       signatures and defined within expressions
+       ids start at 0x80000001, where 0x80000000
+       is reserved for 'undefined' */
+    Vector pt;
+
+    /* symbolic constants */
+    Vector cnst;
+
+    /* extern and schema functions */
+    Vector func;
+    Vector fname;
+
+    /* physical columns */
+    Vector phys;
+    Vector pname;
+
+    /* tables */
+    Vector tbl;
+    Vector tname;
+
+    /* databases */
+    Vector db;
+    Vector dname;
+
+    KRefcount refcount;
+
+    uint32_t file_count;
+
+    /* number of indirect expressions
+       these are uniquely identified place-holders
+       for cursor-open binding of
+       type and constant expressions */
+    uint32_t num_indirect;
+};
+
+
+/* Make
+ *  creates an empty schema
+ */
+rc_t VSchemaMake ( VSchema **sp, const VSchema *dad );
+
+
+/* MakeIntrinsic
+ *  creates an initial, intrinsic schema
+ */
+rc_t VSchemaMakeIntrinsic ( VSchema **intrinsic );
+
+
+/* Attach
+ * Sever
+ */
+VSchema *VSchemaAttach ( const VSchema *self );
+rc_t VSchemaSever ( const VSchema *self );
+
+
+/* ParseTextCallback
+ *  parse schema text
+ *  add productions to existing schema
+ *
+ *  "name" [ IN, NULL OKAY ] - optional name
+ *  representing text, e.g. filename
+ *
+ *  "fill" [ IN ] and "data" [ IN, OPAQUE ] - for filling buffer
+ */
+rc_t VSchemaParseTextCallback ( VSchema *self, const char *name,
+    rc_t ( CC * fill ) ( void *self, struct KTokenText *tt, size_t save ),
+    void *data );
+
+/* Find
+ *  generic object find within schema global scope
+ *
+ *  "name" [ OUT ] - returns list of overloaded objects if found
+ *
+ *  "type" [ OUT ] - returns object type id, e.g.:
+ *    eDatatype, eTypeset, eFormat, eFunction, ePhysical, eTable, ...
+ *
+ *  "expr" [ IN ] - NUL terminated name expression identifying object
+ *
+ *  "ctx" [ IN ] - NUL terminated context string for evaluation,
+ *  substitutes for filename in logging reports
+ *
+ *  "dflt" [ IN ] - if true, resolve default value
+ *
+ *  returns principal object identified. if NULL but "name" is not
+ *  NULL, then the object was only partially identified.
+ */
+const void *VSchemaFind ( const VSchema *self,
+    const SNameOverload **name, uint32_t *type,
+    const char *expr, const char *ctx, bool dflt );
+
+
+/* CacheIntrinsicTypeId
+ *  for id-caching
+ *
+ *  reads id atomically from "cache" and returns if non-zero
+ *
+ *  otherwise retrieves type id by name lookup, and sets
+ *  value atomically in "cache" before returning.
+ */
+uint32_t VSchemaCacheIntrinsicTypeId ( const VSchema *self,
+    atomic32_t *cache, const char *type_name );
+
+
+/* Marking
+ */
+void VSchemaClearMark ( const VSchema *self );
+void VSchemaClearPhysMark ( const VSchema *self );
+void VSchemaTypeMark ( const VSchema *self, uint32_t type_id );
+
+
+/* ToText
+ *  converts some object to textual representation
+ */
+rc_t VSchemaToText ( struct VSchema const *self,
+    char *buff, size_t bsize, size_t *num_writ, const char *fmt, ... );
+
+#if _DEBUGGING
+/* ListSymtab
+ *  lists contents of symbol table
+ */
+void VSchemaListSymtab ( struct VSchema const *self );
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SFormat
+ *  describes a blob format
+ */
+typedef struct SFormat SFormat;
+struct SFormat
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* superfmt - i.e. current fmt extends superfmt
+       implying that super can be decoded by current */
+    const SFormat *super;
+
+    /* format id */
+    uint32_t id;
+
+    /* marking */
+    bool marked;
+};
+
+/* Whack
+ */
+#define SFormatWhack VectMbrWhack
+
+/* Find
+ */
+SFormat *VSchemaFindFmtid ( const VSchema *self, uint32_t id );
+
+/* Mark
+ */
+void CC SFormatClearMark ( void *item, void *ignore );
+void SFormatMark ( const SFormat *self );
+
+/* Dump
+ *  dump "fmtdef", dump object
+ */
+bool CC SFormatDefDump ( void *item, void *dumper );
+rc_t SFormatDump ( const SFormat *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * SDatatype
+ *  describes a registered datatype
+ */
+enum
+{
+    /* these have been exported to <vdb/schema.h> */
+    ddBool = vtdBool,
+    ddUint = vtdUint,
+    ddInt = vtdInt,
+    ddFloat = vtdFloat,
+    ddAscii = vtdAscii,
+    ddUnicode = vtdUnicode
+};
+
+typedef struct SDatatype SDatatype;
+struct SDatatype
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* supertype */
+    const SDatatype *super;
+
+    /* special byte-swap function */
+    void ( * byte_swap ) ( void *dst, const void *src, uint64_t count );
+
+    /* type id */
+    uint32_t id;
+
+    /* number of parent elements, from declaration:
+       typedef super [ dim ] name; */
+    uint32_t dim;
+
+    /* element size, calculated as
+       super -> size * dim */
+    uint32_t size;
+
+    /* data domain */
+    uint16_t domain;
+
+    /* marking */
+    bool marked;
+};
+
+/* Whack
+ */
+#define SDatatypeWhack VectMbrWhack
+
+/* IntrinsicDim
+ */
+uint32_t SDatatypeIntrinsicDim ( const SDatatype *self );
+
+/* Find
+ */
+SDatatype *VSchemaFindTypeid ( const VSchema *self, uint32_t id );
+
+/* Mark
+ */
+void CC SDatatypeClearMark ( void *item, void *ignore );
+void SDatatypeMark ( const SDatatype *self );
+
+/* Dump
+ */
+bool CC SDatatypeDefDump ( void *item, void *dumper );
+rc_t SDatatypeDump ( const SDatatype *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * STypeset
+ *  describes a set of typedecls
+ */
+typedef struct STypeset STypeset;
+struct STypeset
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* typeset id */
+    uint32_t id;
+
+    /* marking */
+    bool marked;
+
+    /* fmtdecls */
+    uint16_t count;
+    VTypedecl td [ 1 ];
+};
+
+/* Whack
+ */
+#define STypesetWhack VectMbrWhack
+
+/* Find
+ */
+STypeset *VSchemaFindTypesetid ( const VSchema *self, uint32_t id );
+
+/* Mark
+ */
+void CC STypesetClearMark ( void *item, void *ignore );
+void STypesetMark ( const STypeset *self, const VSchema *schema );
+
+/* Dump
+ */
+bool CC STypesetDefDump ( void *item, void *dumper );
+rc_t STypesetDump ( const STypeset *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * SIndirectType
+ *  a parameterized typespec
+ */
+typedef struct SIndirectType SIndirectType;
+struct SIndirectType
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* index into binding vector */
+    uint32_t type_id;
+
+    /* formal type id */
+    uint32_t id;
+
+    /* parameter position */
+    uint32_t pos;
+};
+
+/* Whack
+ */
+void CC SIndirectTypeWhack ( void *item, void *ignore );
+
+/* Find
+ */
+SIndirectType *VSchemaFindITypeid ( const VSchema *self, uint32_t id );
+
+/* Dump
+ */
+rc_t SIndirectTypeDump ( const SIndirectType *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * SConstant
+ *  describes a symbolic constant
+ */
+typedef struct SConstant SConstant;
+struct SConstant
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* value */
+    struct SExpression const *expr;
+
+    /* type */
+    VTypedecl td;
+
+    /* id */
+    uint32_t id;
+
+    /* marking */
+    bool marked;
+};
+
+/* Whack
+ */
+void CC SConstantWhack ( void *item, void *ignore );
+
+/* Mark
+ */
+void CC SConstantClearMark ( void *item, void *ignore );
+void SConstantMark ( const SConstant *self );
+
+/* Dump
+ *  dump "const", dump object
+ */
+bool CC SConstantDefDump ( void *item, void *dumper );
+rc_t SConstantDump ( const SConstant *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * SIndirectConst
+ *  a parameterized constant
+ */
+typedef struct SIndirectConst SIndirectConst;
+struct SIndirectConst
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* formal typedecl or NULL if function */
+    struct SExpression const *td;
+
+    /* index into binding vector */
+    uint32_t expr_id;
+
+    /* offset position from # of indirect types */
+    uint32_t pos;
+};
+
+/* Whack
+ */
+void CC SIndirectConstWhack ( void * item, void * ignore );
+
+/* Mark
+ */
+void CC SIndirectConstMark ( void * item, void * data );
+
+/* Dump
+ *  dump "const", dump object
+ */
+bool CC SIndirectConstDefDump ( void *item, void *dumper );
+rc_t SIndirectConstDump ( const SIndirectConst *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * SProduction
+ *  a named production
+ */
+typedef struct SProduction SProduction;
+struct SProduction
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* conditional expression */
+    struct SExpression const *expr;
+
+    /* formal fmtdecl */
+    struct SExpression const *fd;
+
+    /* contextual id */
+    VCtxId cid;
+
+    /* trigger production */
+    bool trigger;
+
+    /* control parameter */
+    bool control;
+};
+
+/* Whack
+ */
+void CC SProductionWhack ( void * item, void * ignore );
+
+/* Mark
+ */
+void CC SProductionMark ( void * itme, void * data );
+
+/* Dump
+ *  dump production
+ */
+bool CC SProductionDefDump ( void *item, void *dumper );
+rc_t SProductionDump ( const SProduction *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * SFormParmlist
+ *  zero or more formal parameters
+ */
+typedef struct SFormParmlist SFormParmlist;
+struct SFormParmlist
+{
+    Vector parms;
+    uint16_t mand;
+    uint16_t vararg;
+};
+
+/* Whack
+ */
+void SFormParmlistWhack ( SFormParmlist *self,
+    void ( CC * pwhack ) ( void*, void* ) );
+
+/* HasParams
+ */
+#define SFormParmlistHasParams( self ) \
+    ( VectorLength ( & ( self ) -> parms ) != 0 || \
+      ( self ) -> varag != 0 )
+
+/* Mark
+ */
+void SFormParmlistMark ( const SFormParmlist *self,
+    void ( CC * mark ) ( void*, void* ), const VSchema *schema );
+
+/* Dump
+ *  dump param list
+ */
+rc_t SFormParamlistDump ( const SFormParmlist *self, struct SDumper *d,
+    bool ( CC * dump ) ( void*, void* ),
+    const char *begin, const char *end, const char *empty );
+
+
+/*--------------------------------------------------------------------------
+ * SFunction
+ */
+typedef struct SFunction SFunction;
+struct SFunction
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* return type expression - NULL for untyped or row-length */
+    struct SExpression const *rt;
+
+    /* pointer to additional information */
+    union
+    {
+        struct
+        {
+            /* optional factory id */
+            struct KSymbol const *fact;
+
+        } ext;
+
+        struct
+        {
+            /* return statement conditional expression */
+            struct SExpression const *rtn;
+
+            /* schema productions */
+            Vector prod;
+
+            uint32_t align;
+
+        } script;
+
+    } u;
+
+    /* schema scope - i.e. indirect types and uint const */
+    BSTree sscope;
+
+    /* function scope - i.e. factory and func params, productions */
+    BSTree fscope;
+
+    /* factory parameters */
+    SFormParmlist fact;
+
+    /* function parameters */
+    SFormParmlist func;
+
+    /* schema types - indirect types, defined and owned by VSchema
+       held here for positional correlation */
+    Vector type;
+
+    /* declared version */
+    uint32_t version;
+
+    /* schema parameters - indirect uint constants */
+    Vector schem;
+
+    /* function id */
+    uint32_t id;
+
+    /* script or extern function */
+    bool script;
+
+    /* marking */
+    bool marked;
+
+    /* validate, untyped or row-length function */
+    bool validate;
+    bool untyped;
+    bool row_length;
+};
+
+/* Whack
+ */
+void SFunctionDestroy ( SFunction *self );
+void CC SFunctionWhack ( void *self, void *ignore );
+
+/* Cmp
+ * Sort
+ */
+int64_t CC SFunctionCmp ( const void *item, const void *n );
+int64_t CC SFunctionSort ( const void *item, const void *n );
+
+/* Bind
+ *  perform schema and factory param substitution
+ *  returns prior param values
+ */
+rc_t SFunctionBindSchemaParms ( const SFunction *self,
+    Vector *prior, const Vector *subst, Vector *cx_bind );
+rc_t SFunctionBindFactParms ( const SFunction *self,
+    Vector *parms, Vector *prior, const Vector *subst, Vector *cx_bind );
+
+/* Rest-ore
+ *  restore schema and factory param substitution
+ *  destroys prior param vector
+ */
+void SFunctionRestSchemaParms ( const SFunction *self, Vector *prior, Vector *cx_bind );
+void SFunctionRestFactParms ( const SFunction *self, Vector *prior, Vector *cx_bind );
+
+/* Mark
+ */
+void CC SFunctionClearMark ( void * self, void * ignore );
+void CC SFunctionMark ( void * item, void * data );
+void SFuncNameMark ( const SNameOverload *self, const VSchema *schema );
+
+/* Dump
+ */
+rc_t SFunctionDeclDumpSchemaParms ( const SFunction *self, struct SDumper *d );
+rc_t SFunctionDeclDumpFactParms ( const SFunction *self, struct SDumper *d );
+bool CC SFunctionDeclDump ( void *item, void *dumper );
+rc_t SFunctionBodyDump ( const SFunction *self, struct SDumper *d );
+rc_t SFunctionDump ( const SFunction *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * SPhysical
+ *  physical column declaration
+ */
+typedef struct SPhysical SPhysical;
+struct SPhysical
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* optional function for determining row length */
+    const SFunction *row_length;
+
+    /* encoding scripts */
+    SFunction encode, decode;
+
+    /* column type */
+    struct SExpression const *td;
+
+    /* required version */
+    uint32_t version;
+
+    /* physical decl id */
+    uint32_t id;
+
+    /* marking */
+    bool marked;
+
+    /* if only decode side exists */
+    bool read_only;
+
+    /* v0 blobs have no headers */
+    bool no_hdr;
+};
+
+/* Whack
+ */
+void CC SPhysicalWhack ( void *self, void *ignore );
+
+/* Cmp
+ * Sort
+ */
+int64_t CC SPhysicalCmp ( const void *item, const void *n );
+int64_t CC SPhysicalSort ( const void *item, const void *n );
+
+/* Bind
+ *  perform schema and factory param substitution
+ *  returns prior param values
+ */
+rc_t SPhysicalBindSchemaParms ( const SPhysical *self,
+    Vector *prior, const Vector *subst, Vector *cx_bind );
+rc_t SPhysicalBindFactParms ( const SPhysical *self,
+     Vector *parms, Vector *prior, const Vector *subst, Vector *cx_bind );
+
+/* Rest-ore
+ *  restore schema and factory param substitution
+ *  destroys prior param vector
+ */
+void SPhysicalRestSchemaParms ( const SPhysical *self, Vector *prior, Vector *cx_bind );
+void SPhysicalRestFactParms ( const SPhysical *self, Vector *prior, Vector *cx_bind );
+
+/* Mark
+ */
+void CC SPhysicalClearMark ( void * self, void * ignore );
+void CC SPhysicalMark ( void * item, void * data );
+void SPhysNameMark ( const SNameOverload *self, const VSchema *schema );
+
+/* Dump
+ */
+bool CC SPhysicalDefDump ( void *self, void *data );
+rc_t SPhysicalDump ( const SPhysical *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * STable
+ *  table declaration
+ */
+typedef struct STable STable;
+struct STable
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* optional function for determining table type */
+    const SFunction *untyped;
+
+    /* optional expression for limiting all columns' blob sizes */
+    struct SExpression const *limit;
+
+    /* optional default view declaration */
+    const String *dflt_view;
+
+    /* scope */
+    BSTree scope;
+
+    /* parents */
+    Vector parents;
+
+    /* overrides ( inherited virtual productions )
+       contents are grouped by introducing parent */
+    Vector overrides;
+
+    /* columns */
+    Vector col;
+    Vector cname;
+
+    /* explicitly declared physical column members */
+    Vector phys;
+
+    /* assignment statements */
+    Vector prod;
+
+    /* introduced virtual ( undefined ) productions
+       contents are unowned KSymbol pointers */
+    Vector vprods;
+
+    /* owned KSymbols that are not in scope */
+    Vector syms;
+
+    /* source file & line */
+    String src_file;
+    uint32_t src_line;
+
+    /* required version */
+    uint32_t version;
+
+    /* table id */
+    uint32_t id;
+
+    /* marking */
+    bool marked;
+};
+
+/* Whack
+ */
+void CC STableWhack ( void *self, void *ignore );
+
+/* CloneExtend
+ *  creates an initially transparent table extension
+ *  used by cursor to permit addition of implicit productions
+ */
+rc_t STableCloneExtend ( const STable *self, STable **clone, VSchema *schema );
+
+/* Cmp
+ * Sort
+ */
+int64_t CC STableCmp ( const void *item, const void *n );
+int64_t CC STableSort ( const void *item, const void *n );
+
+/* Find
+ *  generic object find within table scope
+ *
+ *  "td" [ OUT, NULL OKAY ] - returns cast type expression
+ *  if given or "any" if not
+ *
+ *  "name" [ OUT ] - returns list of overloaded objects if found
+ *
+ *  "type" [ OUT ] - returns object type id, e.g.:
+ *    eDatatype, eTypeset, eFormat, eFunction, ePhysical, eTable, ...
+ *
+ *  "expr" [ IN ] - NUL terminated name expression identifying object
+ *
+ *  "ctx" [ IN ] - NUL terminated context string for evaluation,
+ *  substitutes for filename in logging reports
+ *
+ *  "dflt" [ IN ] - if true, resolve default value
+ *
+ *  returns principal object identified. if NULL but "name" is not
+ *  NULL, then the object was only partially identified.
+ */
+const void *STableFind ( const STable *self,
+    const VSchema *schema, VTypedecl *td, const SNameOverload **name,
+    uint32_t *type, const char *expr, const char *ctx, bool dflt );
+
+
+/* FindOverride
+ *  finds an inherited or introduced overridden symbol
+ */
+struct KSymbol *STableFindOverride ( const STable *self, const VCtxId *cid );
+
+/* FindOrdAncestor
+ *  finds a parent or grandparent by order
+ */
+const STable *STableFindOrdAncestor ( const STable *self, uint32_t i );
+
+/* Mark
+ */
+void CC STableClearMark ( void *self, void *ignore );
+/*
+void CC STableMark ( const STable *self, const VSchema *schema );
+*/
+void STableNameMark ( const SNameOverload *self, const VSchema *schema );
+
+/* Dump
+ *  dump "table" { }
+ */
+bool CC STableDefDump ( void *self, void *dumper );
+rc_t STableDump ( const STable *self, struct SDumper *d );
+
+rc_t VSchemaDumpTableName ( const VSchema *self, uint32_t mode, const STable *stbl,
+    rc_t ( CC * flush ) ( void *dst, const void *buffer, size_t bsize ), void *dst );
+rc_t VSchemaDumpTableDecl ( const VSchema *self, uint32_t mode, const STable *stbl,
+    rc_t ( CC * flush ) ( void *dst, const void *buffer, size_t bsize ), void *dst );
+
+
+/*--------------------------------------------------------------------------
+ * SColumn
+ *  column declaration
+ */
+typedef struct SColumn SColumn;
+struct SColumn
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* read productions */
+    struct SExpression const *read;
+
+    /* validation productions */
+    struct SExpression const *validate;
+
+    /* page size limit */
+    struct SExpression const *limit;
+
+    /* physical type expression */
+    struct SExpression const *ptype;
+
+    /* typedecl */
+    VTypedecl td;
+
+    /* contextual id */
+    VCtxId cid;
+
+    /* if true, this column is default for name */
+    bool dflt;
+
+    /* if read-only, there must be a read expression */
+    bool read_only;
+
+    /* if no read or validate expression exists
+       and no corresponding physical member exists */
+    bool simple;
+};
+
+/* Whack
+ */
+void CC SColumnWhack ( void *item, void *ignore );
+
+/* Cmp
+ *  compare a const VTypedecl* against const SColumn*
+ * Sort
+ *  compare two const SColumn*
+ */
+int64_t CC SColumnCmp ( const void *item, const void *n );
+int64_t CC SColumnSort ( const void *item, const void *n );
+
+
+/* ImplicitColMember
+ *  adds an implicit column member of simple or incomplete type
+ *
+ *  "cname" [ IN ] - column name
+ *
+ *  "pname" [ IN ] - name of physical column
+ */
+rc_t STableImplicitColMember ( STable *self,
+    struct String const *cname, struct String const *pname );
+
+/* Dump
+ */
+bool CC SColumnDefDump ( void *item, void *dumper );
+rc_t SColumnDump ( const SColumn *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * SPhysMember
+ *  physical member
+ */
+typedef struct SPhysMember SPhysMember;
+struct SPhysMember
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* column type expression */
+    struct SExpression const *type;
+
+    /* assignment expression */
+    struct SExpression const *expr;
+
+    /* column datatype */
+    VTypedecl td;
+
+    /* contextual id */
+    VCtxId cid;
+
+    /* if static, it is implemented in table metadata */
+    bool stat;
+
+    /* it simple, the member was implicitly declared */
+    bool simple;
+};
+
+/* Whack
+ */
+void CC SPhysMemberWhack ( void *item, void *ignore );
+
+/* ImplicitPhysMember
+ *  adds an implicit physical member of simple or incomplete type
+ *
+ *  "td" [ IN, NULL OKAY ] - type of member, if known
+ *
+ *  "sym" [ IN, NULL OKAY ] - optional symbol to be overridden
+ *
+ *  "name" [ IN ] - name of new symbol to be created if "sym" is NULL
+ */
+rc_t STableImplicitPhysMember ( STable *self, const VTypedecl *td,
+    struct KSymbol *sym, struct String const *name );
+
+/* Mark
+ */
+/*
+void CC SPhysMemberMark ( const SPhysMember *self, const VSchema *schema );
+*/
+
+/* Dump
+ */
+bool CC SPhysMemberDefDump ( void *item, void *dumper );
+rc_t SPhysMemberDump ( const SPhysMember *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * SDatabase
+ *  database declaration
+ */
+typedef struct SDatabase SDatabase;
+struct SDatabase
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* scope */
+    BSTree scope;
+
+    /* parents */
+    const SDatabase *dad;
+
+    /* databases */
+    Vector db;
+
+    /* tables */
+    Vector tbl;
+
+    /* required version */
+    uint32_t version;
+
+    /* database id */
+    uint32_t id;
+
+    /* marking */
+    bool marked;
+};
+
+/* Whack
+ */
+void CC SDatabaseWhack ( void *self, void *ignore );
+
+/* Cmp
+ * Sort
+ */
+int64_t CC SDatabaseCmp ( const void *item, const void *n );
+int64_t CC SDatabaseSort ( const void *item, const void *n );
+
+/* Find
+ *  generic object find within database scope
+ *
+ *  "name" [ OUT ] - returns list of overloaded objects if found
+ *
+ *  "type" [ OUT ] - returns object type id, e.g.:
+ *    eDatatype, eTypeset, eFormat, eFunction, ePhysical, eTable, ...
+ *
+ *  "expr" [ IN ] - NUL terminated name expression identifying object
+ *
+ *  "ctx" [ IN ] - NUL terminated context string for evaluation,
+ *  substitutes for filename in logging reports
+ *
+ *  returns principal object identified. if NULL but "name" is not
+ *  NULL, then the object was only partially identified.
+ */
+const void *SDatabaseFind ( const SDatabase *self,
+    const VSchema *schema, const SNameOverload **name,
+    uint32_t *type, const char *expr, const char *ctx );
+
+/* Mark
+ */
+void CC SDatabaseClearMark ( void *self, void *ignore );
+void CC SDatabaseMark ( void * item, void * data );
+void CC SDatabaseNameMark ( const SNameOverload *self, const VSchema *schema );
+
+/* Dump
+ *  dump "database" { }
+ */
+bool CC SDatabaseDefDump ( void *self, void *dumper );
+rc_t SDatabaseDump ( const SDatabase *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * STblMember
+ *  table member
+ */
+typedef struct STblMember STblMember;
+struct STblMember
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* table declaration */
+    const STable *tbl;
+
+    /* contextual id */
+    VCtxId cid;
+
+    /* is a template */
+    bool tmpl;
+};
+
+/* Whack
+ */
+#define STblMemberWhack VectMbrWhack
+
+void CC STableMark ( void * item, void * data );
+
+/* Dump
+ */
+bool CC STblMemberDefDump ( void *item, void *dumper );
+rc_t STblMemberDump ( const STblMember *self, struct SDumper *d );
+
+
+/*--------------------------------------------------------------------------
+ * SDBMember
+ *  sub-db member
+ */
+typedef struct SDBMember SDBMember;
+struct SDBMember
+{
+    /* symbolic name */
+    struct KSymbol const *name;
+
+    /* database declaration */
+    const SDatabase *db;
+
+    /* contextual id */
+    VCtxId cid;
+
+    /* is a template */
+    bool tmpl;
+};
+
+/* Whack
+ */
+#define SDBMemberWhack VectMbrWhack
+
+/* Dump
+ */
+bool CC SDBMemberDefDump ( void *item, void *dumper );
+rc_t SDBMemberDump ( const SDBMember *self, struct SDumper *d );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_schema_priv_ */
diff --git a/libs/vdb/schema-prod.c b/libs/vdb/schema-prod.c
new file mode 100644
index 0000000..13a5a42
--- /dev/null
+++ b/libs/vdb/schema-prod.c
@@ -0,0 +1,1005 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "schema-expr.h"
+#include "schema-dump.h"
+
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * SProduction
+ *  describes a schema production/statement
+ */
+#if SLVL >= 3
+
+/* Whack
+ */
+void CC SProductionWhack ( void *item, void *ignore )
+{
+    SProduction *s = item;
+    SExpressionWhack ( s -> expr );
+    SExpressionWhack ( s -> fd );
+    free ( s );
+}
+
+/* Mark
+ */
+void CC SProductionMark ( void * item, void * data )
+{
+    const SProduction * self = item;
+    if ( self != NULL )
+    {
+        SExpressionMark ( ( void * )self -> fd, data );
+        SExpressionMark ( ( void * )self -> expr, data );
+    }
+}
+
+/* Dump
+ *  dump production
+ */
+rc_t SProductionDump ( const SProduction *self, struct SDumper *d )
+{
+    if ( self == NULL )
+        return KSymbolDump ( NULL, d );
+    if ( ! self -> control )
+        return KSymbolDump ( self -> name, d );
+    return SDumperPrint ( d, "control %N", self -> name );
+}
+
+bool CC SProductionDefDump ( void *item, void *data )
+{
+    SDumper *b = data;
+    const SProduction *self = ( const void* ) item;
+
+    /* function params are waiting for an expression */
+    if ( self -> expr == NULL )
+        b -> rc = SDumperPrint ( b, "%E %N", self -> fd, self -> name );
+    else
+    {
+        bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+        if ( self -> trigger )
+        {
+            b -> rc = SDumperPrint ( b, compact ? "trigger %N=%E;" : "\ttrigger %N = %E;\n"
+                                     , self -> name
+                                     , self -> expr );
+        }
+        else
+        {
+            b -> rc = SDumperPrint ( b, compact ? "%E %N=%E;" : "\t%E %N = %E;\n"
+                                     , self -> fd
+                                     , self -> name
+                                     , self -> expr );
+        }
+    }
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SFunction
+ *  describes a schema function
+ */
+#if SLVL >= 4
+
+/* Dump
+ */
+rc_t SFunctionBodyDump ( const SFunction *self, SDumper *b )
+{
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+    if ( VectorLength ( & self -> u . script . prod ) == 0 )
+    {
+        b -> rc = SDumperPrint ( b, compact ?
+            "{return %E;}" : "\t{ return %E; }\n",
+            self -> u . script . rtn );
+    }
+    else
+    {
+        b -> rc = SDumperPrint ( b, compact ? "{" : "\t{\n" );
+        if ( b -> rc == 0 )
+        {
+            if ( ! compact )
+                SDumperIncIndentLevel ( b );
+            if ( ! VectorDoUntil ( & self -> u . script . prod, false, SProductionDefDump, b ) )
+                b -> rc = SDumperPrint ( b, compact ? "return %E;" : "\treturn %E;\n", self -> u . script . rtn );
+            if ( ! compact )
+                SDumperDecIndentLevel ( b );
+        }
+        if ( b -> rc == 0 )
+            b -> rc = SDumperPrint ( b, compact ? "}" : "\t}\n" );
+    }
+
+    return b -> rc;
+}
+
+#endif
+
+/*--------------------------------------------------------------------------
+ * SPhysical
+ */
+
+#if SLVL >= 5
+
+/* Whack
+ */
+void CC SPhysicalWhack ( void *n, void *ignore )
+{
+    SPhysical *self = n;
+
+    /* if any schema or factory parameters were given, the objects
+       have been shared between encode and decode schema funcs, and
+       the schema names are also shared between funcs. wipe out the
+       encode copy and leave ownership with decode */
+    BSTreeInit ( & self -> encode . sscope );
+    VectorInit ( & self -> encode . fact . parms, 0, 1 );
+    VectorInit ( & self -> encode . type, 0, 1 );
+    VectorInit ( & self -> encode . schem, 0, 1 );
+
+    /* now allow normal destruction to proceed */
+    SFunctionDestroy ( & self -> encode );
+    SFunctionDestroy ( & self -> decode );
+    SExpressionWhack ( self -> td );
+
+    free ( self );
+}
+
+/* Cmp
+ * Sort
+ */
+int64_t CC SPhysicalCmp ( const void *item, const void *n )
+{
+    const uint32_t *a = item;
+    const SPhysical *b = n;
+
+    if ( * a > b -> version )
+        return 1;
+    return ( int64_t ) ( * a >> 24 ) - ( int64_t ) ( b -> version >> 24 );
+}
+
+int64_t CC SPhysicalSort ( const void *item, const void *n )
+{
+    const SPhysical *a = item;
+    const SPhysical *b = n;
+
+    return ( int64_t ) ( a -> version >> 24 ) - ( int64_t ) ( b -> version >> 24 );
+}
+
+/* Bind
+ *  perform schema and factory param substitution
+ *  returns prior param values
+ */
+rc_t SPhysicalBindSchemaParms ( const SPhysical *self,
+    Vector *prior, const Vector *subst, Vector *cx_bind )
+{
+    return SFunctionBindSchemaParms ( & self -> decode, prior, subst, cx_bind );
+}
+
+rc_t SPhysicalBindFactParms ( const SPhysical *self,
+    Vector *parms, Vector *prior, const Vector *subst, Vector *cx_bind )
+{
+    return SFunctionBindFactParms ( & self -> decode, parms, prior, subst, cx_bind );
+}
+
+/* Rest-ore
+ *  restore schema and factory param substitution
+ *  destroys prior param vector
+ */
+void SPhysicalRestSchemaParms ( const SPhysical *self, Vector *prior, Vector *cx_bind )
+{
+    SFunctionRestSchemaParms ( & self -> decode, prior, cx_bind );
+}
+
+void SPhysicalRestFactParms ( const SPhysical *self, Vector *prior, Vector *cx_bind )
+{
+    SFunctionRestFactParms ( & self -> decode, prior, cx_bind );
+}
+
+/* Mark
+ */
+void CC SPhysicalClearMark ( void *item, void *ignore )
+{
+    SPhysical *self = item;
+    self -> marked = false;
+    self -> encode . marked = false;
+    self -> decode . marked = false;
+}
+
+void VSchemaClearPhysMark ( const VSchema *self )
+{
+    if ( self -> dad != NULL )
+        VSchemaClearPhysMark ( self -> dad );
+    VectorForEach ( & self -> phys, false, SPhysicalClearMark, NULL );
+}
+
+void CC SPhysicalMark ( void * item, void * data )
+{
+    SPhysical *self = item;
+    if ( self != NULL && ! self -> marked )
+    {
+        self -> marked = true;
+        SExpressionMark ( ( void * )self -> td, data );
+        SFunctionMark ( ( void * )& self -> encode, data );
+        SFunctionMark ( ( void * )& self -> decode, data );
+    }
+}
+
+void SPhysNameMark ( const SNameOverload *self, const VSchema *schema )
+{
+    if ( self != NULL )
+    {
+        VectorForEach ( & self -> items, false, SPhysicalMark, ( void* ) schema );
+    }
+}
+
+/* Dump
+ */
+rc_t SPhysicalDump ( const SPhysical *self, SDumper *d )
+{
+    return FQNDump ( self != NULL ? self -> name : NULL, d );
+}
+
+bool CC SPhysicalDefDump ( void *n, void *data )
+{
+    SDumper *b = data;
+    const SPhysical *self = ( const void* ) n;
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+    if ( SDumperMarkedMode ( b ) && ! self -> marked )
+        return false;
+
+    /* a physical column */
+    b -> rc = SDumperPrint ( b, "physical " );
+
+    /* could have schema parameters */
+    if ( b -> rc == 0 )
+        b -> rc = SFunctionDeclDumpSchemaParms ( & self -> decode, b );
+
+    /* issue __no_header for v0 encodings */
+    if ( b -> rc == 0 && self -> no_hdr )
+        b -> rc = SDumperPrint ( b, "__no_header " );
+
+    /* a return type expression followed by column typename */
+    if ( b -> rc == 0 )
+        b -> rc = SDumperPrint ( b, "%E %N", self -> td, self -> name );
+
+    /* versions are mandatory */
+    if ( b -> rc == 0 )
+        b -> rc = SDumperVersion ( b, self -> version );
+
+    /* could have factory parameters */
+    if ( b -> rc == 0 )
+        b -> rc = SFunctionDeclDumpFactParms ( & self -> decode, b );
+
+    /* physical body */
+    if ( b -> rc == 0 )
+    {
+        b -> rc = SDumperPrint ( b, compact ? "{" : "\n\t{\n" );
+        if ( b -> rc == 0 )
+        {
+            if ( ! compact )
+                SDumperIncIndentLevel ( b );
+
+            if ( self -> encode . u . script . rtn != NULL )
+            {
+                b -> rc = SDumperPrint ( b, compact ? "encode" : "\tencode\n" );
+                if ( b -> rc == 0 )
+                    b -> rc = SFunctionBodyDump ( & self -> encode, b );
+            }
+            if ( b -> rc == 0 )
+                b -> rc = SDumperPrint ( b, compact ? "decode" : "\tdecode\n" );
+            if ( b -> rc == 0 )
+                b -> rc = SFunctionBodyDump ( & self -> decode, b );
+
+            if ( ! compact )
+                SDumperDecIndentLevel ( b );
+        }
+        if ( b -> rc == 0 )
+            b -> rc = SDumperPrint ( b, compact ? "}" : "\t}\n" );
+    }
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ */
+
+#if SLVL >= 4
+
+/*
+ * production-stmt    = <func-fmtdecl> ID <assign-expr>
+ *                    | 'trigger' ID <assign-expr>
+ */
+rc_t production_stmt ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, Vector *v, uint32_t ptype )
+{
+    rc_t rc;
+    String id;
+    KSymbol *sym;
+
+    SProduction *prod = malloc ( sizeof *prod );
+    if ( prod == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    memset ( prod, 0, sizeof * prod );
+
+    /* look for trigger production */
+    if ( ptype == eTable && t -> id == kw_trigger )
+    {
+        prod -> trigger = true;
+        next_token ( tbl, src, t );
+    }
+    else
+    {
+        KToken t2 = * t;
+
+        /* variable type */
+        rc = type_expr ( tbl, src, t, env, self, & prod -> fd );
+        if ( rc != 0 )
+        {
+            free ( prod );
+            return KTokenExpected ( t, klogErr, "type declaration" );
+        }
+
+        /* disallow formatted types within table */
+        if ( ptype == eTable && ( ( const STypeExpr* ) prod -> fd ) -> fmt != NULL )
+        {
+            SExpressionWhack ( prod -> fd );
+            free ( prod );
+            return KTokenExpected ( & t2, klogErr, "unformatted type declaration" );
+        }
+    }
+
+    /* catch defined identifiers */
+    if ( t -> sym != NULL && t -> id != eForward && t -> id != eVirtual )
+    {
+        /* if this is not a table or the symbol is not a production */
+        if ( ptype != eTable || t -> id != eProduction )
+        {
+            /* re-interpret this token in schema and intrinsic scopes */
+            KTokenSourceReturn ( src, t );
+            next_shallow_token ( tbl, src, t, true );
+        }
+    }
+
+    /* require an identifier or a forward reference */
+    sym = NULL;
+    if ( t -> id == eForward || t -> id == eVirtual )
+        sym = t -> sym;
+    else if ( t -> id != eIdent )
+    {
+        SProductionWhack ( prod, NULL );
+        return KTokenExpected ( t, klogErr, "production name" );
+    }
+
+    /* remember identifier */
+    id = t -> str;
+
+    /* within the production, only '=' is accepted for assignment
+       this could certainly change in the future... */
+    if ( next_token ( tbl, src, t ) -> id != eAssign )
+    {
+        SProductionWhack ( prod, NULL );
+        return KTokenExpected ( t, klogErr, "=" );
+    }
+
+    /* parse conditional expression */
+    rc = cond_expr ( tbl, src, next_token ( tbl, src, t ),
+        env, self, & prod -> expr );
+    if ( rc == 0 )
+    {
+        /* create symbolic name for production and insert */
+        if ( sym == NULL )
+            rc = KSymTableCreateConstSymbol ( tbl, & prod -> name, & id, eProduction, prod );
+        else
+        {
+            /* convert forward reference or virtual to production */
+            sym -> type = eProduction;
+            sym -> u . obj = prod;
+            prod -> name = sym;
+        }
+        if ( rc == 0 )
+        {
+            /* ctx = 0 for params, ctx == 1 for productions */
+            prod -> cid . ctx = 1;
+            rc = VectorAppend ( v, & prod -> cid . id, prod );
+        }
+        if ( rc != 0 )
+            KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    /* cleanup */
+    if ( rc != 0 )
+        SProductionWhack ( prod, NULL );
+
+    return rc;
+}
+
+/*
+ * schema-stmt        = 'return' <cond-expr>
+ *                    | <production-stmt>
+ */
+static
+rc_t script_stmt ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFunction *f )
+{
+    rc_t rc;
+
+    if ( t -> id == kw_return )
+    {
+        /* disallow multiple return statements */
+        if ( f -> u . script . rtn != NULL )
+        {
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcToken, rcExists );
+            return KTokenRCExplain ( t, klogErr, rc );
+        }
+
+        /* just get a conditional expression */
+        rc = cond_expr ( tbl, src, next_token ( tbl, src, t ),
+            env, self, & f -> u . script . rtn );
+    }
+    else
+    {
+        rc = production_stmt ( tbl, src, t, env, self,
+            & f -> u . script . prod, eScriptFunc );
+    }
+
+    if ( rc == 0 )
+        rc = expect ( tbl, src, t, eSemiColon, ";", true );
+
+    return rc;
+}
+
+
+/*
+ * schema-body        = '{' <script-stmts> '}'
+ *
+ * script-stmts       = <script-stmt> ';' [ <script-stmts> ]
+ */
+static
+rc_t schema_body ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFunction *f )
+{
+    /* always open braces */
+    rc_t rc = expect ( tbl, src, t, eLeftCurly, "{", true );
+    if ( rc != 0 )
+        return rc;
+
+    /* expect at least one statement */
+    rc = script_stmt ( tbl, src, t, env, self, f );
+    if ( rc != 0 )
+        return rc;
+
+    /* handle statement list */
+    while ( t -> id != eRightCurly )
+    {
+        rc = script_stmt ( tbl, src, t, env, self, f );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* must have a return statement */
+    if ( f -> u . script . rtn  == NULL )
+        return KTokenExpected ( t, klogErr, "return statement" );
+
+    /* looks like a script function */
+    f -> script = true;
+
+    /* close braces */
+    return expect ( tbl, src, t, eRightCurly, "}", true );
+}
+
+static
+bool CC script_prod_syntax ( void *item, void *data )
+{
+    rc_t *rc = data;
+    SProduction *prod = item;
+
+    assert ( prod -> name != NULL );
+    assert ( prod -> name -> type == eProduction );
+
+    * rc = eval_expr_syntax ( prod -> fd );
+    if ( * rc == 0 )
+        * rc = eval_expr_syntax ( prod -> expr );
+
+    return ( * rc != 0 ) ? true : false;
+}
+
+static
+bool CC script_sym_syntax ( BSTNode *n, void *data )
+{
+    rc_t *rc = data;
+    KSymbol *sym = ( KSymbol* ) n;
+
+    if ( sym -> type == eForward )
+    {
+        * rc = RC ( rcVDB, rcSchema, rcParsing, rcName, rcUndefined );
+        return true;
+    }
+
+    return false;
+}
+
+static
+rc_t script_syntax ( const VSchema *self, SFunction *f )
+{
+    rc_t rc = eval_expr_syntax ( f -> u . script . rtn );
+    if ( rc == 0 )
+    {
+        BSTreeDoUntil ( & f -> fscope,
+            false, script_sym_syntax, & rc );
+    }
+    if ( rc == 0 )
+        VectorDoUntil ( & f -> u . script . prod, false, script_prod_syntax, & rc );
+    return rc;
+}
+
+/*
+ * script-body        = '{' <script-stmts> '}'
+ */
+rc_t script_body ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SFunction *f )
+{
+    /* enter schema scope */
+    rc_t rc = KSymTablePushScope ( tbl, & f -> sscope );
+    if ( rc != 0 )
+        KTokenRCExplain ( t, klogInt, rc );
+    else
+    {
+        /* enter function scope */
+        rc = KSymTablePushScope ( tbl, & f -> fscope );
+        if ( rc != 0 )
+            KTokenRCExplain ( t, klogInt, rc );
+        else
+        {
+            /* parse '{' statements; '}' */
+            VectorInit ( & f -> u . script . prod, 0, 8 );
+            rc = schema_body ( tbl, src, t, env, self, f );
+
+            /* leave function scope */
+            KSymTablePopScope ( tbl );
+        }
+
+        /* leave schema scope */
+        KSymTablePopScope ( tbl );
+    }
+
+    if ( rc == 0 )
+        rc = script_syntax ( self, f );
+
+    return rc;
+}
+
+#endif /* SLVL >= 4 */
+
+#if SLVL >= 5
+
+static
+rc_t rowlen_func_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SPhysical *p )
+{
+    const SNameOverload *name;
+
+    /* expecting a function assignment */
+    rc_t rc = expect ( tbl, src,
+        next_token ( tbl, src, t ), eAssign, "=", true );
+    if ( rc == 0 )
+        rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return rc;
+    if ( t -> id != eRowLengthFunc )
+        return KTokenExpected ( t, klogErr, "row length function expression" );
+    name = t -> sym -> u . obj;
+
+    rc = expect ( tbl, src,
+        next_token ( tbl, src, t ), eLeftParen, "(", true );
+    if ( rc == 0 )
+        rc = expect ( tbl, src, t, eRightParen, ")", true );
+    if ( rc == 0 )
+        rc = expect ( tbl, src, t, eSemiColon, ";", true );
+
+    if ( rc == 0 )
+    {
+        p -> row_length = VectorLast ( & name -> items );
+        if ( p -> row_length == NULL )
+        {
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcFunction, rcNotFound );
+            KTokenRCExplain ( t, klogErr, rc );
+        }
+    }
+
+    return rc;
+}
+
+/*
+ * physical-stmt      = 'encode' <script-body>
+ *                    | 'decode' <script-body>
+ */
+static
+rc_t physical_stmt ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SPhysical *p, bool encoding )
+{
+    rc_t rc;
+    String symstr;
+    SFunction *f = encoding ? & p -> encode : & p -> decode;
+
+    /* simulate a schema function signature */
+    SProduction *parm = malloc ( sizeof * parm );
+    if ( parm == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+    memset ( parm, 0, sizeof * parm );
+    VectorInit ( & f -> func . parms, 0, 1 );
+    rc = VectorAppend ( & f -> func . parms, & parm -> cid . id, parm );
+    if ( rc != 0 )
+    {
+        free ( parm );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    /* enter schema scope */
+    rc = KSymTablePushScope ( tbl, & f -> sscope );
+    if ( rc != 0 )
+        KTokenRCExplain ( t, klogInt, rc );
+    else
+    {
+        /* enter param scope */
+        rc = KSymTablePushScope ( tbl, & f -> fscope );
+        if ( rc != 0 )
+            KTokenRCExplain ( t, klogInt, rc );
+        else
+        {
+            /* create special input symbol */
+            CONST_STRING ( & symstr, "@" );
+            rc = KSymTableCreateConstSymbol ( tbl, & parm -> name,
+                & symstr, eFuncParam, parm );
+            if ( rc != 0 )
+                KTokenRCExplain ( t, klogInt, rc );
+            else
+            {
+                VectorInit ( & f -> u . script . prod, 0, 8 );
+                rc = schema_body ( tbl, src, t, env, self, f );
+            }
+
+            /* exit param scope */
+            KSymTablePopScope ( tbl );
+        }
+
+        /* exit schema scope */
+        KSymTablePopScope ( tbl );
+    }
+
+    return rc;
+}
+
+/*
+ * physical-decl      = 'physical' [ 'column' ] <typedecl>
+ *                       <fqn> '#' <maj-min-rel> <phys-body>
+ * phys-body          =  '{' <physical-stmts> '}'
+ * physical-stmt      = 'encode' <script-body>
+ *                    | 'decode' <script-body>
+ *                    | '__row_length = <func-expr>
+ *                    | ';'
+ */
+static
+rc_t physical_decl ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SPhysical *p )
+{
+    rc_t rc;
+    const char *expected;
+
+    /* could have schema parameters */
+    if ( t -> id == eLeftAngle )
+    {
+        /* enter schema param scope */
+        rc = KSymTablePushScope ( tbl, & p -> decode . sscope );
+        if ( rc != 0 )
+            return KTokenRCExplain ( t, klogInt, rc );
+
+        /* parse schema params */
+        rc = schema_signature ( tbl, src, t, env, self, & p -> decode );
+
+        /* copy schema parameters to encode function
+           NB - must be cleared before destruction */
+        p -> encode . sscope = p -> decode . sscope;
+        p -> encode . type = p -> decode . type;
+        p -> encode . schem = p -> decode. schem;
+
+        /* interpret return type within schema param scope */
+        if ( rc == 0 )
+        {
+            rc = type_expr ( tbl, src, t, env, self, & p -> td );
+            if ( rc != 0 )
+                KTokenFailure ( t, klogErr, rc, "column typedecl" );
+        }
+
+        /* pop scope */
+        KSymTablePopScope ( tbl );
+
+        /* bail on problems */
+        if ( rc != 0 )
+            return rc;
+
+        /* "t" contains a lookahead token. while unlikely,
+           it could have matched something defined in schema
+           param scope. re-evaluate if possible */
+        if ( t -> sym != NULL ) switch ( t -> sym -> type )
+        {
+        case eSchemaType:
+        case eSchemaParam:
+            KTokenSourceReturn ( src, t );
+            next_token ( tbl, src, t );
+            break;
+        }
+    }
+    else
+    {
+        /* allow v0 columns to be declared with no blob header */
+        if ( t -> id == kw___no_header )
+        {
+            p -> no_hdr = true;
+            next_token ( tbl, src, t );
+        }
+
+        /* get column type expression */
+        rc = type_expr ( tbl, src, t, env, self, & p -> td );
+        if ( rc != 0 )
+            return KTokenExpected ( t, klogErr, "column typedecl" );
+    }
+
+    /* expect fully-qualified name */
+    rc = create_fqn ( tbl, src, t, env, ePhysical, NULL );
+    if ( rc != 0 && GetRCState ( rc ) != rcExists )
+        return KTokenFailure ( t, klogErr, rc, "column typename" );
+    p -> name = t -> sym;
+
+    /* must have a version */
+    if ( next_token ( tbl, src, t ) -> id != eHash )
+        return KTokenExpected ( t, klogErr, "#" );
+    next_token ( tbl, src, t );
+    rc = maj_min_rel ( tbl, src, t, env, self, & p -> version, false );
+    if ( rc != 0 )
+        return rc;
+
+    /* factory params */
+    if ( t -> id == eLeftAngle )
+    {
+        rc = KSymTablePushScope ( tbl, & p -> decode . sscope );
+        if ( rc != 0 )
+            return KTokenRCExplain ( t, klogInt, rc );
+        rc = KSymTablePushScope ( tbl, & p -> decode . fscope );
+        if ( rc != 0 )
+            KTokenRCExplain ( t, klogInt, rc );
+        else
+        {
+            rc = fact_signature ( tbl, src, t, env, self, & p -> decode . fact );
+            if ( rc == 0 )
+            {
+                /* copy factory parameters to encode function
+                   NB - must be cleared before destruction */
+                p -> encode . fact = p -> decode . fact;
+
+                /* clone factory parameter symbols */
+                if ( BSTreeDoUntil ( & p -> decode . fscope, false, KSymbolCopyScope, & p -> encode . fscope ) )
+                    rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+            }
+
+            KSymTablePopScope ( tbl );
+        }
+
+        KSymTablePopScope ( tbl );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* allow shorthand for decode-only */
+    if ( t -> id == eAssign )
+    {
+        next_token ( tbl, src, t );
+        rc = physical_stmt ( tbl, src, t, env, self, p, false );
+        if ( rc == 0 )
+            p -> read_only = true;
+        return rc;
+    }
+
+    /* open body */
+    rc = expect ( tbl, src, t, eLeftCurly, "{", true );
+    if ( rc != 0 )
+        return rc;
+
+    /* gather both parts */
+    expected = p -> no_hdr ? "decode" : "decode or encode";
+    while ( t -> id != eRightCurly )
+    {
+        if ( t -> id == eSemiColon )
+            next_token ( tbl, src, t );
+        else if ( t -> id == kw_decode && p -> decode . u . script . rtn == NULL )
+        {
+            next_token ( tbl, src, t );
+            rc = physical_stmt ( tbl, src, t, env, self, p, false );
+            if ( rc != 0 )
+                return rc;
+            expected = ( p -> encode . u . script . rtn == NULL ) ? "encode" : "}";
+        }
+        else if ( t -> id == kw_encode && p -> encode . u . script . rtn == NULL && ! p -> no_hdr )
+        {
+            next_token ( tbl, src, t );
+            rc = physical_stmt ( tbl, src, t, env, self, p, true );
+            if ( rc != 0 )
+                return rc;
+            expected = ( p -> decode . u . script . rtn == NULL ) ? "decode" : "}";
+        }
+        else if ( t -> id == kw___row_length && p -> row_length == NULL && p -> no_hdr )
+        {
+            rc = rowlen_func_expr ( tbl, src, t, env, self, p );
+            if ( rc != 0 )
+                return rc;
+        }
+        else
+        {
+            return KTokenExpected ( t, klogErr, expected );
+        }
+    }
+
+    /* must have at least a decoding */
+    if ( p -> decode . u . script . rtn == NULL )
+        return KTokenExpected ( t, klogErr, "decode" );
+
+    /* close */
+    rc = expect ( tbl, src, t, eRightCurly, "}", true );
+    if ( rc == 0 )
+    {
+        /* detect read-only decl */
+        if ( p -> encode . u . script . rtn == NULL )
+            p -> read_only = true;
+        else
+        {
+            /* patch up input parameter to encoding */
+            SProduction *parm = VectorGet ( & p -> encode . func . parms, 0 );
+            assert ( parm != NULL );
+            parm -> fd = p -> td;
+            atomic32_inc ( & ( ( SExpression* ) p -> td ) -> refcount );
+        }
+    }
+
+    return rc;
+}
+
+static
+void init_function ( SFunction *f )
+{
+    memset ( f, 0, sizeof * f );
+    f -> script = true;
+}
+
+rc_t physical_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    rc_t rc;
+    void *ignore;
+
+    SPhysical *p = malloc ( sizeof * p );
+    if ( p == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    p -> name = NULL;
+    p -> row_length = NULL;
+    init_function ( & p -> encode );
+    init_function ( & p -> decode );
+    p -> td = NULL;
+    p -> read_only = false;
+    p -> no_hdr = false;
+
+    if ( t -> id == kw_column )
+        next_token ( tbl, src, t );
+
+    rc = physical_decl ( tbl, src, t, env, self, p );
+    if ( rc == 0 )
+    {
+        SNameOverload *name = ( void* ) p -> name -> u . obj;
+        if ( name == NULL )
+        {
+            rc = SNameOverloadMake ( & name, p -> name, 0, 8 );
+            if ( rc == 0 )
+            {
+                rc = VectorAppend ( & self -> pname, & name -> cid . id, name );
+                if ( rc != 0 )
+                    SNameOverloadWhack ( name, NULL );
+            }
+        }
+
+        if ( rc == 0 )
+        {
+            rc = VectorAppend ( & self -> phys, & p -> id, p );
+            if ( rc == 0 )
+            {
+                uint32_t idx;
+                rc = VectorInsertUnique ( & name -> items, p, & idx, SPhysicalSort );
+                if ( rc == 0 )
+                    return 0;
+                if ( GetRCState ( rc ) != rcExists )
+                    VectorSwap ( & self -> phys, p -> id, NULL, & ignore );
+                else
+                {
+                    SPhysical *exist = VectorGet ( & name -> items, idx );
+                    if ( p -> version > exist -> version )
+                    {
+                        VectorSwap ( & name -> items, idx, p, & ignore );
+                        if ( ( const void* ) name != exist -> name -> u . obj )
+                            return 0;
+                        assert ( exist -> id >= VectorStart ( & self -> phys ) );
+                        assert ( exist -> id < p -> id );
+                        VectorSwap ( & self -> phys, p -> id, NULL, & ignore );
+                        VectorSwap ( & self -> phys, p -> id = exist -> id, p, & ignore );
+                        SPhysicalWhack ( exit, NULL );
+                        return 0;
+                    }
+
+                    /* exists is not an error */
+                    rc = 0;
+                }
+
+                VectorSwap ( & self -> phys, p -> id, NULL, & ignore );
+            }
+        }
+    }
+    else if ( GetRCState ( rc ) == rcExists )
+    {
+        rc = 0;
+    }
+    
+    SPhysicalWhack ( p, NULL );
+
+    return rc;
+}
+
+#endif /* SLVL >= 5 */
diff --git a/libs/vdb/schema-tbl.c b/libs/vdb/schema-tbl.c
new file mode 100644
index 0000000..ba3f2e1
--- /dev/null
+++ b/libs/vdb/schema-tbl.c
@@ -0,0 +1,2925 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "schema-expr.h"
+#include "schema-dump.h"
+#include "dbmgr-priv.h"
+
+#include <klib/symbol.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* if non-zero, accept a typeset or a typedecl
+   for column. otherwise, only allow a typedecl */
+#define ALLOW_COLUMN_TYPESET 1
+
+/* make implicit physical expressions explicit on output */
+#define DUMP_EXPLICIT_PHYS_MEMBERS 0
+
+/* temporary v1 schema modification */
+#define ALLOW_DEFAULT_VIEW_DECL 1
+
+
+/*--------------------------------------------------------------------------
+ * SColumn
+ *  column declaration
+ */
+
+#if SLVL >= 8
+
+/* Whack
+ */
+void CC SColumnWhack ( void *item, void *ignore )
+{
+    SColumn *self = item;
+    SExpressionWhack ( self -> read );
+    SExpressionWhack ( self -> validate );
+    SExpressionWhack ( self -> limit );
+    SExpressionWhack ( self -> ptype );
+    free ( self );
+}
+
+/* Cmp
+ * Sort
+ */
+int64_t CC SColumnCmp ( const void *item, const void *n )
+{
+    const VTypedecl *a = item;
+    const SColumn *b = n;
+
+    if ( a -> type_id != b -> td . type_id )
+        return ( int64_t ) a -> type_id - ( int64_t ) b -> td . type_id;
+    return ( int64_t ) a -> dim - ( int64_t ) b -> td . dim;
+}
+
+int64_t CC SColumnSort ( const void *item, const void *n )
+{
+    const SColumn *a = item;
+    const SColumn *b = n;
+
+    if ( a -> td . type_id != b -> td . type_id )
+        return ( int64_t ) a -> td . type_id - ( int64_t ) b -> td . type_id;
+    return ( int64_t ) a -> td . dim - ( int64_t ) b -> td . dim;
+}
+
+/* Mark
+ */
+static
+void CC SColumnMark ( void * item, void * data )
+{
+    const SColumn *self = item;
+    VSchema * schema = data;
+    if ( self != NULL )
+    {
+        SExpressionMark ( ( void * )self -> read, data );
+        SExpressionMark ( ( void * )self -> validate, data );
+        SExpressionMark ( ( void * )self -> limit, data );
+        VSchemaTypeMark ( schema, self -> td . type_id );
+    }
+}
+
+/* Dump
+ */
+rc_t SColumnDump ( const SColumn *self, SDumper *d )
+{
+    return KSymbolDump ( self != NULL ? self -> name : NULL, d );
+}
+
+static
+rc_t SColumnDumpExpr ( SDumper *d, const SExpression *e )
+{
+    rc_t rc;
+    const SBinExpr *c;
+    bool compact = SDumperMode ( d ) == sdmCompact ? true : false;
+
+    if ( e -> var != eCondExpr )
+        return SDumperPrint ( d, compact ? "=%E;" : " = %E;\n", e );
+
+    c = ( const SBinExpr* ) e;
+
+    if ( ! compact )
+        SDumperIncIndentLevel ( d );
+    rc = SDumperPrint ( d, compact ? "=%E" : "\n\t= %E\n", c -> left );
+    while ( rc == 0 )
+    {
+        if ( c -> right -> var != eCondExpr )
+            break;
+        c = ( const SBinExpr* ) c -> right;
+        rc = SDumperPrint ( d, compact ? "|%E" : "\n\t| %E\n", c -> left );
+    }
+
+    rc = SDumperPrint ( d, compact ? "|%E" : "\n\t| %E\n", c -> right );
+    if ( ! compact )
+        SDumperDecIndentLevel ( d );
+    return rc;
+}
+
+bool CC SColumnDefDump ( void *item, void *data )
+{
+    SDumper *b = data;
+    const SColumn *self = ( const void* ) item;
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+    /* handle simple cases first */
+    if ( self -> validate == NULL && self -> limit == NULL )
+    {
+        /* simple */
+#if ! DUMP_EXPLICIT_PHYS_MEMBERS
+        if ( self -> simple )
+        {
+            if ( self -> ptype != NULL )
+            {
+                b -> rc = SDumperPrint ( b, compact ? "column %E %N;" : "\tcolumn %E %N;\n"
+                                         , self -> ptype
+                                         , self -> name
+                    );
+            }
+            else
+            {
+                b -> rc = SDumperPrint ( b, compact ? "column %T %N;" : "\tcolumn %T %N;\n"
+                                         , & self -> td
+                                         , self -> name
+                    );
+            }
+        }
+        else
+#endif
+        {
+            assert ( self -> read != NULL );
+            b -> rc = SDumperPrint ( b, compact ? "%s%scolumn %T %N = %E;" : "\t%s%scolumn %T %N = %E;\n"
+                                     , self -> dflt ? "default " : ""
+                                     , self -> read_only ? "readonly " : ""
+                                     , & self -> td
+                                     , self -> name
+                                     , self -> read
+                );
+        }
+    }
+
+    /* canonical representation */
+    else
+    {
+#if ! DUMP_EXPLICIT_PHYS_MEMBERS
+        if ( self -> ptype != NULL )
+        {
+            b -> rc = SDumperPrint ( b, compact ? "%scolumn %E %N{" : "\t%scolumn %E %N\n\t{\n"
+                                     , self -> dflt ? "default " : ""
+                                     , self -> ptype
+                                     , self -> name
+                );
+        }
+        else
+#endif
+        {
+            b -> rc = SDumperPrint ( b, compact ? "%s%scolumn %T %N{" : "\t%s%scolumn %T %N\n\t{\n"
+                                     , self -> dflt ? "default " : ""
+                                     , self -> read_only ? "readonly " : ""
+                                     , & self -> td
+                                     , self -> name
+                );
+        }
+        if ( b -> rc == 0 )
+        {
+            if ( ! compact )
+                SDumperIncIndentLevel ( b );
+
+#if DUMP_EXPLICIT_PHYS_MEMBERS
+            if ( self -> read != NULL )
+#else
+            if ( ! self -> simple && self -> read != NULL )
+#endif
+            {
+                b -> rc = SDumperPrint ( b, compact ? "read" : "\tread" );
+                if ( b -> rc == 0 )
+                    b -> rc = SColumnDumpExpr ( b, self -> read );
+            }
+
+            if ( b -> rc == 0 && self -> validate != NULL )
+            {
+                b -> rc = SDumperPrint ( b, compact ? "validate" : "\tvalidate" );
+                if ( b -> rc == 0 )
+                    b -> rc = SColumnDumpExpr ( b, self -> validate );
+            }
+
+            if ( b -> rc == 0 && self -> limit != NULL )
+                b -> rc = SDumperPrint ( b, compact ? "limit = %E;" : "\tlimit = %E;\n", self -> limit );
+
+            if ( ! compact )
+                SDumperDecIndentLevel ( b );
+        }
+        if ( b -> rc == 0 )
+            b -> rc = SDumperPrint ( b, compact ? "}" : "\t}\n" );
+    }
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * SPhysMember
+ *  column declaration
+ */
+
+#if SLVL >= 7
+
+/* Whack
+ */
+void CC SPhysMemberWhack ( void *item, void *ignore )
+{
+    SPhysMember *self = item;
+
+    SExpressionWhack ( self -> type );
+    SExpressionWhack ( self -> expr );
+    free ( self );
+}
+
+/* Mark
+ */
+void CC SPhysMemberMark ( void * item, void * data )
+{
+    const SPhysMember * self = item;
+    const VSchema * schema = data;
+    if ( self != NULL )
+    {
+        SExpressionMark ( ( void * )self -> type, data );
+        SExpressionMark ( ( void * )self -> expr, data );
+        VSchemaTypeMark ( schema, self -> td . type_id );
+    }
+}
+
+/* Dump
+ */
+rc_t SPhysMemberDump ( const SPhysMember *self, struct SDumper *d )
+{
+    return FQNDump ( self != NULL ? self -> name : NULL, d );
+}
+
+bool CC SPhysMemberDefDump ( void *item, void *data )
+{
+    SDumper *b = data;
+    const SPhysMember *self = ( const void* ) item;
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+#if ! DUMP_EXPLICIT_PHYS_MEMBERS
+    if ( self -> simple )
+        return false;
+#endif
+
+    b -> rc = SDumperPrint ( b, compact ? "%s column " : "\t%s column "
+                             , self -> stat ? "static" : "physical"
+        );
+    if ( b -> rc == 0 )
+    {
+        if ( self -> type != NULL )
+            b -> rc = SExpressionDump ( self -> type, b );
+        else
+            b -> rc = SDumperPrint ( b, "%T", & self -> td );
+    }
+    if ( b -> rc == 0 )
+    {
+        if ( compact )
+        {
+            if ( self -> expr == NULL )
+                b -> rc = SDumperPrint ( b, " %N;", self -> name );
+            else
+                b -> rc = SDumperPrint ( b, " %N=%E;", self -> name, self -> expr );
+        }
+        else
+        {
+            if ( self -> expr == NULL )
+                b -> rc = SDumperPrint ( b, " %N;\n", self -> name );
+            else
+                b -> rc = SDumperPrint ( b, " %N = %E;\n", self -> name, self -> expr );
+        }
+    }
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+#endif
+
+/*--------------------------------------------------------------------------
+ * STableOverrides
+ *  describes extended parent
+ */
+
+#if SLVL >= 6
+typedef struct STableOverrides STableOverrides;
+struct STableOverrides
+{
+    const STable *dad;
+    Vector overrides;
+    uint32_t ctx;
+};
+
+/* Cmp
+ * Sort
+ */
+static
+int64_t CC STableOverridesCmp ( const void *item, const void *n )
+{
+    const uint32_t *a = item;
+    const STableOverrides *b = n;
+
+    return ( int64_t ) * a - ( int64_t ) b -> ctx;
+}
+
+static
+int64_t CC STableOverridesSort ( const void *item, const void *n )
+{
+    const STableOverrides *a = item;
+    const STableOverrides *b = n;
+
+    return ( int64_t ) a -> ctx - ( int64_t ) b -> ctx;
+}
+
+static
+int64_t CC STableOverridesKSort ( const void **item, const void **n, void *ignore )
+{
+    return STableOverridesSort ( * item, * n );
+}
+
+/* Whack
+ */
+static
+void CC STableOverridesWhack ( void *item, void *ignore )
+{
+    STableOverrides *self = item;
+    VectorWhack ( & self -> overrides, NULL, NULL );
+    free ( self );
+}
+
+/* Make
+ */
+static
+rc_t STableOverridesMake ( Vector *parents, const STable *dad, const Vector *overrides )
+{
+    rc_t rc;
+    STableOverrides *to;
+
+    /* first question is whether parent exists */
+    if ( VectorFind ( parents, & dad -> id, NULL, STableOverridesCmp ) != NULL )
+        return SILENT_RC ( rcVDB, rcSchema, rcParsing, rcTable, rcExists );
+
+    /* create a new override object */
+    to = malloc ( sizeof * to );
+    if ( to == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    /* shallow clone */
+    rc = VectorCopy ( overrides, & to -> overrides );
+    if ( rc != 0 )
+    {
+        free ( to );
+        return rc;
+    }
+    to -> dad = dad;
+    to -> ctx = dad -> id;
+
+    /* insert into parent override vector */
+    rc = VectorInsert ( parents, to, NULL, STableOverridesSort );
+    if ( rc != 0 )
+    {
+        STableOverridesWhack ( to, NULL );
+        return rc;
+    }
+
+    return 0;
+}
+
+static
+bool CC STableOverridesClone ( void *item, void *data )
+{
+    const STableOverrides *self = ( const void* ) item;
+    rc_t rc = STableOverridesMake ( data, self -> dad, & self -> overrides );
+    return ( rc != 0 && GetRCState ( rc ) != rcExists ) ? true : false;
+}
+
+#endif
+
+/*--------------------------------------------------------------------------
+ * STable
+ *  table declaration
+ */
+
+#if SLVL >= 6
+
+/* Whack
+ */
+void CC STableWhack ( void *item, void *ignore )
+{
+    STable *self = item;
+
+    if ( self -> dflt_view != NULL )
+        StringWhack ( self -> dflt_view );
+
+#if SLVL >= 8
+    VectorWhack ( & self -> col, SColumnWhack, NULL );
+    VectorWhack ( & self -> cname, SNameOverloadWhack, NULL );
+#endif
+#if SLVL >= 7
+    VectorWhack ( & self -> phys, SPhysMemberWhack, NULL );
+#endif
+    VectorWhack ( & self -> prod, SProductionWhack, NULL );
+    VectorWhack ( & self -> vprods, NULL, NULL );
+    VectorWhack ( & self -> syms, ( void ( CC * ) ( void*, void* ) ) KSymbolWhack, NULL );
+
+    VectorWhack ( & self -> parents, NULL, NULL );
+    VectorWhack ( & self -> overrides, STableOverridesWhack, NULL );
+
+    SExpressionWhack ( self -> limit );
+
+    BSTreeWhack ( & self -> scope, KSymbolWhack, NULL );
+
+    free ( self );
+}
+
+/* Cmp
+ * Sort
+ */
+int64_t CC STableCmp ( const void *item, const void *n )
+{
+    const uint32_t *a = item;
+    const STable *b = n;
+
+    if ( * a > b -> version )
+        return 1;
+    return ( int64_t ) ( * a >> 24 ) - ( int64_t ) ( b -> version >> 24 );
+}
+
+int64_t CC STableSort ( const void *item, const void *n )
+{
+    const STable *a = item;
+    const STable *b = n;
+
+    return ( int64_t ) ( a -> version >> 24 ) - ( int64_t ) ( b -> version >> 24 );
+}
+
+
+/* Find
+ *  generic object find within table scope
+ *
+ *  "td" [ OUT, NULL OKAY ] - returns cast type expression
+ *  if given or "any" if not
+ *
+ *  "name" [ OUT ] - returns list of overloaded objects if found
+ *
+ *  "type" [ OUT ] - returns object type id, e.g.:
+ *    eDatatype, eTypeset, eFormat, eFunction, ePhysical, eTable, ...
+ *
+ *  "expr" [ IN ] - NUL terminated name expression identifying object
+ *
+ *  "ctx" [ IN ] - NUL terminated context string for evaluation,
+ *  substitutes for filename in logging reports
+ *
+ *  "dflt" [ IN ] - if true, resolve default value
+ *
+ *  returns principal object identified. if NULL but "name" is not
+ *  NULL, then the object was only partially identified.
+ */
+const void *STableFind ( const STable *self,
+    const VSchema *schema, VTypedecl *td, const SNameOverload **name,
+    uint32_t *type, const char *expr, const char *ctx, bool dflt )
+{
+    rc_t rc;
+    KSymTable tbl;
+
+    /* initialize to not-found */
+    const void *obj = NULL;
+    * name = NULL;
+    * type = 0;
+
+    /* build a symbol table for table */
+    rc = init_tbl_symtab ( & tbl, schema, self );
+    if ( rc == 0 )
+    {
+        obj = resolve_object ( & tbl, schema, td, name, type, expr, ctx, dflt );
+        KSymTableWhack ( & tbl );
+    }
+
+    return obj;
+}
+
+
+/* FindOverride
+ *  finds an inherited or introduced overridden symbol
+ */
+KSymbol *STableFindOverride ( const STable *self, const VCtxId *cid )
+{
+    const STableOverrides *to;
+
+    /* it may be on the existing table */
+    if ( cid -> ctx == self -> id )
+        return VectorGet ( & self -> vprods, cid -> id );
+
+    to = ( const void* ) VectorFind ( & self -> overrides,
+        & cid -> ctx, NULL, STableOverridesCmp );
+    if ( to == NULL )
+        return NULL;
+
+    return VectorGet ( & to -> overrides, cid -> id );
+}
+
+/* FindOrdAncestor
+ *  finds a parent or grandparent by order
+ */
+const STable *STableFindOrdAncestor ( const STable *self, uint32_t i )
+{
+    const STableOverrides *to = ( const void* ) VectorGet ( & self -> overrides, i );
+    if ( to == NULL )
+        return NULL;
+    return to -> dad;
+}
+
+
+/* Extend
+ */
+static
+bool CC STableHasDad ( void *item, void *data )
+{
+    if ( item == data )
+        return true;
+    return false;
+}
+
+static
+bool STableTestForTypeCollision ( const SNameOverload *a, const SNameOverload *b )
+{
+    uint32_t ax, bx, ctx;
+
+    uint32_t aend = VectorLength ( & a -> items );
+    uint32_t bend = VectorLength ( & b -> items );
+
+    if ( aend == 0 || bend == 0 )
+        return false;
+
+    ctx = a -> cid . ctx;
+    ax = VectorStart ( & a -> items );
+    bx = VectorStart ( & b -> items );
+
+    for ( aend += ax, bend += bx; ax < aend && bx < bend; )
+    {
+        int64_t diff;
+        const SColumn *acol = ( const void* ) VectorGet ( & a -> items, ax );
+        const SColumn *bcol = ( const void* ) VectorGet ( & b -> items, bx );
+        assert ( acol != NULL && bcol != NULL );
+
+        /* if they are both from some other shared parent
+           maybe they are even the same column */
+        if ( acol == bcol || acol -> cid . ctx == bcol -> cid . ctx )
+        {
+            ++ ax;
+            ++ bx;
+            continue;
+        }
+
+        /* don't bother comparing if either is from
+           originating table, as they are required
+           to appear in both lists */
+        if ( acol -> cid . ctx == ctx )
+        {
+            ++ ax;
+            continue;
+        }
+
+        if ( bcol -> cid . ctx == ctx )
+        {
+            ++ bx;
+            continue;
+        }
+
+        /* test the column types */
+        diff = SColumnSort ( acol, bcol );
+
+        /* if they are the same type, this is a collision */
+        if ( diff == 0 )
+            return true;
+
+        /* let it slide */
+        if ( diff < 0 )
+            ++ ax;
+        else
+            ++ bx;
+    }
+
+    return false;
+}
+
+static
+bool STableTestForSymCollision ( const KSymbol *sym, void *data )
+{
+    const KSymTable *tbl = ( const void* ) data;
+    const KSymbol *found = KSymTableFindSymbol ( tbl, sym );
+    if ( found != NULL && found != sym ) switch ( found -> type )
+    {
+    case eColumn:
+        if ( sym -> type == eColumn )
+        {
+            /* when colliding columns originated in the same
+               table, consider them to be compatible extensions */
+            const SNameOverload *found_col, *sym_col;
+            sym_col = sym -> u . obj;
+            found_col = found -> u . obj;
+            assert ( sym_col != NULL && found_col != NULL );
+            if ( sym_col -> cid . ctx == found_col -> cid . ctx )
+                return STableTestForTypeCollision ( sym_col, found_col );
+        }
+    case eProduction:
+    case ePhysMember:
+        PLOGMSG ( klogErr, ( klogErr, "duplicate symbol '$(sym)' in parent table hierarchy"
+                             , "sym=%S"
+                             , & sym -> name
+                      ));
+        return true;
+    }
+    return false;
+}
+
+static
+bool CC STableTestColCollisions ( void *item, void *data )
+{
+    const SNameOverload *no = ( const void* ) item;
+    return STableTestForSymCollision ( no -> name, data );
+}
+
+static
+bool CC STableTestPhysCollisions ( void *item, void *data )
+{
+    const SPhysMember *phys = ( const void* ) item;
+    return STableTestForSymCollision ( phys -> name, data );
+}
+
+static
+bool CC STableTestProdCollisions ( void *item, void *data )
+{
+    const SProduction *prod = ( const void* ) item;
+    return STableTestForSymCollision ( prod -> name, data );
+}
+
+static
+bool STableTestForCollisions ( void *item, void *data )
+{
+    const STable *self = ( const void* ) item;
+
+    /* test column names */
+    if ( VectorDoUntil ( & self -> cname, false, STableTestColCollisions, data ) )
+        return true;
+
+    /* test physical names */
+    if ( VectorDoUntil ( & self -> phys, false, STableTestPhysCollisions, data ) )
+        return true;
+
+    /* test production names */
+    if ( VectorDoUntil ( & self -> prod, false, STableTestProdCollisions, data ) )
+        return true;
+
+    return false;
+}
+
+static
+bool CC STableOverridesTestForCollisions ( void *item, void *data )
+{
+    const STableOverrides *to = ( const void* ) item;
+    return STableTestForCollisions ( ( void* ) to -> dad, data );
+}
+
+static
+bool CC STableCopyColumnNames ( void *item, void *data )
+{
+    rc_t rc;
+    STable *self= data;
+    SNameOverload *copy;
+    const SNameOverload *orig = ( const void* ) item;
+    const KSymbol *sym = ( const KSymbol* )
+        BSTreeFind ( & self -> scope, & orig -> name -> name, KSymbolCmp );
+    if ( sym == NULL )
+    {
+        rc = SNameOverloadCopy ( & self -> scope, & copy, orig );
+        if ( rc == 0 )
+        {
+            rc = VectorAppend ( & self -> cname, & copy -> cid . id, copy );
+            if ( rc != 0 )
+                SNameOverloadWhack ( copy, NULL );
+        }
+    }
+    else
+    {
+        copy = ( void* ) sym -> u . obj;
+        assert ( copy -> cid . ctx == orig -> cid . ctx );
+        rc = VectorMerge ( & copy -> items, true, & orig -> items, SColumnSort );
+    }
+
+    return ( rc != 0 ) ? true : false;
+}
+
+static
+bool CC STableScanVirtuals ( void *item, void *data )
+{
+    KSymTable *tbl = data;
+    STableOverrides *to = item;
+    BSTree *scope = VectorLast ( & tbl -> stack );
+    uint32_t i = VectorStart ( & to -> overrides );
+    uint32_t end = VectorLength ( & to -> overrides );
+    for ( end += i; i < end; ++ i )
+    {
+        const KSymbol *orig = ( const void* ) VectorGet ( & to -> overrides, i );
+        assert ( orig != NULL );
+        if ( orig -> type == eVirtual )
+        {
+            void *ignore;
+
+            /* since the virtual productions in one parent could be
+               defined by another parent, test for the possibility */
+            const KSymbol *def = KSymTableFindSymbol ( tbl, orig );
+            if ( def != NULL )
+                VectorSwap ( & to -> overrides, i, def, & ignore );
+            else
+            {
+                /* copy the original */
+                KSymbol *copy;
+                rc_t rc = KSymbolCopy ( scope, & copy, orig );
+                if ( rc != 0 )
+                    return true;
+
+                /* replace the parent virtual with an updatable copy */
+                VectorSwap ( & to -> overrides, i, copy, & ignore );
+            }
+        }
+    }
+    return false;
+}
+
+static
+rc_t STableExtend ( KSymTable *tbl, STable *self, const STable *dad )
+{
+    rc_t rc;
+
+    /* reject if direct parent already there */
+    if ( VectorDoUntil ( & self -> parents, false, STableHasDad, ( void* ) dad ) )
+        return RC ( rcVDB, rcSchema, rcParsing, rcTable, rcExists );
+
+    /* if parent is already in ancestry, treat as redundant */
+    if ( VectorFind ( & self -> overrides, & dad -> id, NULL, STableOverridesCmp ) != NULL )
+        return VectorAppend ( & self -> parents, NULL, dad );
+
+    /* enter scope for this table */
+    rc = push_tbl_scope ( tbl, self );
+    if ( rc != 0 )
+        return rc;
+
+    /* test for any collisions */
+    if ( STableTestForCollisions ( ( void* ) dad, tbl ) ||
+         VectorDoUntil ( & dad -> overrides, false, STableOverridesTestForCollisions, tbl ) )
+    {
+        pop_tbl_scope ( tbl, self );
+        return RC ( rcVDB, rcSchema, rcParsing, rcName, rcExists );
+    }
+
+    /* pop table scope */
+    pop_tbl_scope ( tbl, self );
+
+    /* add "dad" to parent list */
+    rc = VectorAppend ( & self -> parents, NULL, dad );
+    if ( rc != 0 )
+        return rc;
+
+    /* copy column names from parent - should already contain all grandparents */
+    if ( VectorDoUntil ( & dad -> cname, false, STableCopyColumnNames, self ) )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    /* add "dad" to overrides */
+    rc = STableOverridesMake ( & self -> overrides, dad, & dad -> vprods );
+    if ( rc == 0 )
+    {
+        /* add all grandparents */
+        if ( VectorDoUntil ( & dad -> overrides, false, STableOverridesClone, & self -> overrides ) )
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+    }
+    else if ( GetRCState ( rc ) == rcExists )
+    {
+        rc = 0;
+    }
+    return rc;
+}
+
+/* CloneExtend
+ *  creates an initially transparent table extension
+ *  used by cursor to permit addition of implicit productions
+ */
+rc_t STableCloneExtend ( const STable *self, STable **clone, VSchema *schema )
+{
+    rc_t rc;
+    KSymTable tbl;
+
+    STable *table = malloc ( sizeof * table );
+    if ( table == NULL )
+        return RC ( rcVDB, rcSchema, rcUpdating, rcMemory, rcExhausted );
+
+    /* need to take a deep look at scope */
+    rc = init_symtab ( & tbl, schema );
+    if ( rc != 0 )
+        return rc;
+
+    /* this takes care of initializing "scope" */
+    memset ( table, 0, sizeof * table );
+
+    /* take name and version, since this is an anonymous extension */
+    table -> name = KSymTableFindSymbol ( & tbl, self -> name );
+    KSymTableWhack ( & tbl );
+    assert ( table -> name != NULL );
+    table -> src_file = self -> src_file;
+    table -> src_line = self -> src_line;
+    table -> version = self -> version;
+
+    /* take on table-wide blob limit */
+    if ( self -> limit != NULL )
+    {
+        table -> limit = self -> limit;
+        atomic32_inc ( & ( ( SExpression* ) table -> limit ) -> refcount );
+    }
+
+    /* initialize all vectors for single-inheritance */
+    VectorInit ( & table -> parents, 0, 1 );
+    VectorInit ( & table -> overrides, 0, VectorLength ( & self -> overrides ) + 1 );
+    VectorInit ( & table -> col, 0, 16 );
+    VectorInit ( & table -> cname, 0, 16 );
+    VectorInit ( & table -> phys, 0, 16 );
+    VectorInit ( & table -> prod, 0, 64 );
+    VectorInit ( & table -> vprods, 1, 16 );
+    VectorInit ( & table -> syms, 1, 32 );
+
+    rc = init_tbl_symtab ( & tbl, schema, table );
+    if ( rc == 0 )
+        rc = STableExtend ( & tbl, table, self );
+    if ( rc == 0 )
+    {
+        rc = push_tbl_scope ( & tbl, table );
+        if ( rc == 0 )
+        {
+            if ( VectorDoUntil ( & table -> overrides, false, STableScanVirtuals, & tbl ) )
+                rc = RC ( rcVDB, rcSchema, rcUpdating, rcMemory, rcExhausted );
+        }
+    }
+
+    KSymTableWhack ( & tbl );
+
+    if ( rc == 0 )
+    {
+        /* add table to schema */
+        rc = VectorAppend ( & schema -> tbl, & table -> id, table );
+        if ( rc == 0 )
+        {
+            void *dad;
+            uint32_t idx;
+            SNameOverload *name = ( void* ) table -> name -> u . obj;
+
+            /* find ourselves in table overloads */
+            dad = VectorFind ( & name -> items, & table -> version, & idx, STableCmp );
+            assert ( dad != NULL );
+            assert ( dad == ( void* ) self );
+
+            /* set clone in our place */
+            VectorSwap ( & name -> items, idx, table, & dad );
+
+            * clone = table;
+            return 0;
+        }
+    }
+
+    STableWhack ( table, NULL ), table = NULL;
+    return rc;
+}
+
+/* ImplicitPhysMember
+ *  adds an implicit physical member
+ */
+rc_t STableImplicitPhysMember ( STable *self,
+    const VTypedecl *td, KSymbol *sym, const String *name )
+{
+    rc_t rc;
+    SPhysMember *m = malloc ( sizeof * m );
+    if ( m == NULL )
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+    else
+    {
+        memset ( m, 0, sizeof * m );
+
+        /* if discovered as static column, give it a type */
+        if ( td != NULL )
+            m -> td = * td;
+
+        /* create name symbol as required */
+        if ( sym == NULL )
+        {
+            rc = KSymbolMake ( & sym, name, ePhysMember, m );
+            if ( rc == 0 )
+                BSTreeInsert ( & self -> scope, & sym -> n, KSymbolSort );
+        }
+        if ( sym != NULL )
+        {
+            /* complete handshake with symbol */
+            m -> name = sym;
+            sym -> u . obj = m;
+            sym -> type = ePhysMember;
+
+            /* add member to table */
+            m -> cid . ctx = self -> id;
+            rc = VectorAppend ( & self -> phys, & m -> cid . id, m );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        SPhysMemberWhack ( m, NULL );
+    }
+    return rc;
+}
+
+/* ImplicitColMember
+ *  adds an implicit column member of simple or incomplete type
+ *
+ *  "cname" [ IN ] - column name
+ *
+ *  "pname" [ IN ] - name of physical column
+ */
+rc_t STableImplicitColMember ( STable *self,
+    const String *cname, const String *pname )
+{
+    rc_t rc;
+
+    /* create SColumn */
+    SColumn *col = malloc ( sizeof * col );
+    if ( col == NULL )
+        rc = RC ( rcVDB, rcTable, rcUpdating, rcMemory, rcExhausted );
+    else
+    {
+        const KSymbol *psym;
+        memset ( col, 0, sizeof * col );
+
+        /* look up SPhysMember */
+        psym = ( const KSymbol* ) BSTreeFind ( & self -> scope, pname, KSymbolCmp );
+        if ( psym == NULL )
+            rc = RC ( rcVDB, rcTable, rcUpdating, rcColumn, rcNotFound );
+        else
+        {
+            KSymbol *csym;
+
+            /* create column symbol */
+            rc = KSymbolMake ( & csym, cname, eColumn, col );
+            if ( rc == 0 )
+            {
+                BSTNode *exist;
+
+                /* complete handshake with symbol */
+                col -> name = csym;
+
+                /* insert into table scope and reject on collision
+                   deep check should have been executed previously */
+                rc = BSTreeInsertUnique ( & self -> scope, & csym -> n, & exist, KSymbolSort );
+                if ( rc == 0 )
+                {
+                    /* take column typedecl ( if known ) from physical */
+                    SPhysMember *phys = ( void* ) psym -> u . obj;
+                    col -> td = phys -> td;
+
+                    /* cross-link the external and physical columns */
+                    rc = SSymExprMake ( & col -> read, psym, ePhysExpr );
+                    if ( rc == 0 )
+                        rc = SSymExprMake ( & phys -> expr, csym, eColExpr );
+                    if ( rc == 0 )
+                    {
+                        /* add column to table */
+                        col -> cid . ctx = self -> id;
+                        rc = VectorAppend ( & self -> col, & col -> cid . id, col );
+                        if ( rc == 0 )
+                        {
+                            void *ignore;
+                            SNameOverload *name;
+
+                            /* create a column name with a single typed column */
+                            rc = SNameOverloadMake ( & name, csym, 0, 1 );
+                            if ( rc == 0 )
+                            {
+                                /* being the only column, "col" may be simply
+                                   inserted rather than using a sorted insert */
+                                rc = VectorAppend ( & name -> items, NULL, col );
+                                if ( rc == 0 )
+                                {
+                                    /* finally, insert name into table */
+                                    rc = VectorAppend ( & self -> cname, & name -> cid . id, name );
+                                    if ( rc == 0 )
+                                    {
+                                        name -> cid . ctx = self -> id;
+                                        return 0;
+                                    }
+                                }
+
+                                SNameOverloadWhack ( name, NULL );
+                            }
+
+                            VectorSwap ( & self -> col, col -> cid . id, NULL, & ignore );
+                        }
+
+                        SExpressionWhack ( phys -> expr ), phys -> expr = NULL;
+                    }
+
+                    BSTreeUnlink ( & self -> scope, & csym -> n );
+                }
+
+                KSymbolWhack ( & csym -> n, NULL );
+            }
+        }
+
+        SColumnWhack ( col, NULL );
+    }
+    return rc;
+}
+
+
+/* Compare
+ */
+static
+int64_t KSymbolDeepCompare ( const KSymbol *a, const KSymbol *b )
+{
+    int64_t diff;
+
+    /* the same symbol */
+    if ( a == b )
+        return 0;
+
+    /* parents are first */
+    if ( a -> dad != NULL )
+    {
+        if ( b -> dad != NULL )
+        {
+            /* both symbols have parents */
+            diff = KSymbolDeepCompare ( a -> dad, b -> dad );
+            if ( diff != 0 )
+                return diff;
+        }
+        else
+        {
+            /* "b" is a root */
+            diff = KSymbolDeepCompare ( a -> dad, b );
+            if ( diff != 0 )
+                return diff;
+            return 1;
+        }
+    }
+    else if ( b -> dad != NULL )
+    {
+        /* "a" is a root */
+        diff = KSymbolDeepCompare ( a, b -> dad );
+        if ( diff != 0 )
+            return diff;
+        return -1;
+    }
+
+    /* perform textual comparison */
+    return KSymbolSort ( & a -> n, & b -> n );
+}
+
+static
+int64_t CC STableNameSort ( const void **a, const void **b, void *ignore )
+{
+    int diff;
+    const STable *tb = * b;
+    const STable *ta = * a;
+    if ( tb == NULL )
+        return ta != NULL;
+    if ( ta == NULL )
+        return -1;
+    diff = KSymbolDeepCompare ( ta -> name, tb -> name );
+    if ( diff != 0 )
+        return diff;
+
+    return (int64_t) ta -> version - (int64_t) tb -> version;
+}
+
+enum
+{
+    stbl_cmp_insertion = 1 << 0,
+    stbl_cmp_deletion  = 1 << 1,
+    stbl_cmp_mismatch  = 1 << 2,
+    stbl_cmp_newer     = 1 << 3,
+    stbl_cmp_older     = 1 << 4
+};
+
+static
+rc_t STableCompare ( const STable *a, const STable *b, const STable **newer, bool exhaustive )
+{
+    rc_t stage_rc, cmp_rc = 0;
+    uint32_t stage_bits, cmp_bits = 0;
+
+    int diff;
+    Vector va, vb;
+    uint32_t ia, ib, ca, cb;
+
+    assert ( ( a -> version >> 24 ) == ( b -> version >> 24 ) );
+
+    PARSE_DEBUG (( "STableCompare: testing %N #%.3V against #%.3V\n",
+                   a -> name, a -> version, b -> version ));
+
+    /* guess the newer of the two based upon version alone */
+    * newer = a -> version >= b -> version ? a : b;
+
+    /* test #1 - immediate parents */
+    ca = VectorLength ( & a -> parents );
+    cb = VectorLength ( & b -> parents );
+    if ( ca != cb || ca != 0 )
+    {
+        /* make a copy */
+        cmp_rc = VectorCopy ( & a -> parents, & va );
+        if ( cmp_rc != 0 )
+            return cmp_rc;
+        cmp_rc = VectorCopy ( & b -> parents, & vb );
+        if ( cmp_rc != 0 )
+        {
+            VectorWhack ( & va, NULL, NULL );
+            return cmp_rc;
+        }
+        if ( ca > 1 )
+            VectorReorder ( & va, STableNameSort, NULL );
+        if ( cb > 1 )
+            VectorReorder ( & vb, STableNameSort, NULL );
+
+        for ( stage_bits = ia = ib = 0; ia < ca && ib < cb; )
+        {
+            const STable *pa = ( const void* ) VectorGet ( & va, ia );
+            const STable *pb = ( const void* ) VectorGet ( & vb, ib );
+            if ( pa == pb )
+            {
+                ++ ia, ++ ib;
+                continue;
+            }
+            diff = KSymbolDeepCompare ( pa -> name, pb -> name );
+            if ( diff < 0 )
+            {
+                stage_bits |= stbl_cmp_insertion;
+                ++ ia;
+            }
+            else if ( diff > 0 )
+            {
+                stage_bits |= stbl_cmp_deletion;
+                ++ ib;
+            }
+            else
+            {
+                if ( pa -> version > pb -> version )
+                    stage_bits |= stbl_cmp_newer;
+                else if ( pa -> version < pb -> version )
+                    stage_bits |= stbl_cmp_older;
+
+                ++ ia, ++ ib;
+            }
+        }
+
+        VectorWhack ( & va, NULL, NULL );
+        VectorWhack ( & vb, NULL, NULL );
+
+        PARSE_DEBUG (( "STableCompare: %N #%.3V vs. #%.3V - PARENT COMPARISON:\n%s%s%s%s%s"
+                       , a -> name, a -> version, b -> version
+                       , ( stage_bits == 0 )                 ? "  no differences detected\n" : ""
+                       , ( stage_bits & stbl_cmp_insertion ) ? "  insertion(s) detected\n" : ""
+                       , ( stage_bits & stbl_cmp_deletion )  ? "  deletion(s) detected\n" : ""
+                       , ( stage_bits & stbl_cmp_newer )     ? "  newer ancestor(s) detected\n" : ""
+                       , ( stage_bits & stbl_cmp_older )     ? "  older ancestor(s) detected\n" : ""
+            ));
+
+        if ( stage_bits != 0 )
+        {
+            /* if the table versions are the same, the parents should not have insertions or deletions */
+            if ( a -> version == b -> version && ( stage_bits & ( stbl_cmp_insertion | stbl_cmp_deletion ) ) != 0 )
+            {
+                stage_rc = RC ( rcVDB, rcSchema, rcParsing, rcTable, rcInconsistent );
+                PLOGERR ( klogErr, ( klogErr, stage_rc, "STableCompare: illegal redeclaration of table '$(tbl)' - differing parents."
+                                     , "tbl=%N#%.3V"
+                                     , a -> name, b -> version ) );
+                if ( ! exhaustive )
+                    return stage_rc;
+                if ( cmp_rc == 0 )
+                    cmp_rc = stage_rc;
+            }
+
+            /* if the tables have same parent names but conflicting versions */
+            if ( ( stage_bits & ( stbl_cmp_newer | stbl_cmp_older ) ) == ( stbl_cmp_newer | stbl_cmp_older ) )
+            {
+                stage_rc = RC ( rcVDB, rcSchema, rcParsing, rcTable, rcInconsistent );
+                PLOGERR ( klogErr, ( klogErr, stage_rc, "STableCompare: illegal redeclaration of table '$(tbl)' - both older and newer parent versions."
+                                     , "tbl=%N#%.3V"
+                                     , a -> name, b -> version ) );
+                if ( ! exhaustive )
+                    return stage_rc;
+                if ( cmp_rc == 0 )
+                    cmp_rc = stage_rc;
+            }
+            else
+            {
+                /* if "a" claims to be newer than "b" */
+                if ( a -> version > b -> version )
+                {
+                    if ( ( stage_bits & stbl_cmp_older ) != 0 )
+                    {
+                        stage_rc = RC ( rcVDB, rcSchema, rcParsing, rcTable, rcInconsistent );
+                        PLOGERR ( klogErr, ( klogErr, stage_rc, "STableCompare: illegal redeclaration of table '$(tbl)' - version $(new_vers) has older parents than version $(old_vers)."
+                                             , "tbl=%N,new_vers=#%.3V,old_vers=#%.3V"
+                                             , a -> name, a -> version, b -> version ) );
+                        if ( ! exhaustive )
+                            return stage_rc;
+                        if ( cmp_rc == 0 )
+                            cmp_rc = stage_rc;
+                    }
+                }
+
+                /* if "b" claims to be newer than "a" */
+                else if ( a -> version < b -> version )
+                {
+                    if ( ( stage_bits & stbl_cmp_newer ) != 0 )
+                    {
+                        stage_rc = RC ( rcVDB, rcSchema, rcParsing, rcTable, rcInconsistent );
+                        PLOGERR ( klogErr, ( klogErr, stage_rc, "STableCompare: illegal redeclaration of table '$(tbl)' - version $(old_vers) has newer parents than version $(new_vers)."
+                                             , "tbl=%N,new_vers=#%.3V,old_vers=#%.3V"
+                                             , a -> name, b -> version, a -> version ) );
+                        if ( ! exhaustive )
+                            return stage_rc;
+                        if ( cmp_rc == 0 )
+                            cmp_rc = stage_rc;
+                    }
+                }
+
+                /* they are the same - check parent versions */
+                else if ( ( stage_bits & ( stbl_cmp_newer | stbl_cmp_older ) ) != 0 )
+                {
+                    PLOGMSG ( klogInfo, ( klogInfo, "STableCompare: table '$(tbl)' differs in parent hierarchy"
+                                          " - latest declaration chosen automatically.", "tbl=%N#%.3V"
+                                          , a -> name, b -> version ));
+
+                    * newer = ( stage_bits & stbl_cmp_newer ) ? a : b;
+                }
+            }
+
+            cmp_bits |= stage_bits;
+        }
+    }
+
+    /* test #2 - immediate extern columns */
+    /* test #3 - immediate physical columns */
+    /* test #4 - immediate productions */
+    /* test #5 - immediate virtual productions */
+    /* test #6 - deep parents */
+    /* test #7 - deep extern columns */
+    /* test #8 - deep physical columns */
+    /* test #9 - deep productions */
+    /* test #10 - deep virtual productions */
+
+    return cmp_rc;
+}
+
+
+/* Mark
+ */
+void CC STableClearMark ( void *item, void *ignore )
+{
+    STable *self = item;
+    self -> marked = false;
+}
+
+
+void CC STableMark ( void * item, void * data )
+{
+    STable * self = item;
+    if ( self != NULL && ! self -> marked )
+    {
+        self -> marked = true;
+        SFunctionMark ( ( void * )self -> untyped, data );
+        VectorForEach ( & self -> col, false, SColumnMark, data );
+        VectorForEach ( & self -> phys, false, SPhysMemberMark, data );
+        VectorForEach ( & self -> prod, false, SProductionMark, data );
+        VectorForEach ( & self -> parents, false, STableMark, data );
+    }
+}
+
+void STableNameMark ( const SNameOverload *self, const VSchema *schema )
+{
+    if ( self != NULL )
+    {
+        VectorForEach ( & self -> items, false, STableMark, ( void * )schema );
+    }
+}
+
+
+/* Dump
+ *  dump "table" { }
+ */
+rc_t STableDump ( const STable *self, struct SDumper *d )
+{
+    d -> rc = FQNDump ( self != NULL ? self -> name : NULL, d );
+    if ( d -> rc == 0 && self != NULL )
+        d -> rc = SDumperVersion ( d, self -> version );
+    return d -> rc;
+}
+
+#if _DEBUGGING
+static
+bool CC SProductionDumpVirtuals ( void *item, void *data )
+{
+    SDumper *b = data;
+    const KSymbol *sym = ( const void* ) item;
+
+    switch ( sym -> type )
+    {
+    case eVirtual:
+        b -> rc = SDumperPrint ( b, "\t *  virtual %N = 0;\n", sym );
+        break;
+    case eProduction:
+    {
+        const SProduction *prod = sym -> u . obj;
+        b -> rc = SDumperPrint ( b, "\t *  %E %N;\n", prod -> fd, sym );
+        break;
+    }
+    case eColumn:
+    {
+        b -> rc = SDumperPrint ( b, "\t *  column %N;\n", sym );
+        break;
+    }
+    case ePhysMember:
+    {
+        const SPhysMember *phys = sym -> u . obj;
+        if ( phys -> type != NULL )
+            b -> rc = SDumperPrint ( b, "\t *  physical %E %N;\n", phys -> type, sym );
+        else
+            b -> rc = SDumperPrint ( b, "\t *  physical %T %N;\n", & phys -> td, sym );
+        break;
+    }}
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+static
+bool CC SProductionDumpOverrides ( void *item, void *data )
+{
+    SDumper *b = data;
+    const STableOverrides *to = ( const void* ) item;
+    if ( VectorLength ( & to -> overrides ) == 0 )
+        return false;
+
+    b -> rc = SDumperPrint ( b, "\n\t/* %N inherited virtual productions\n", to -> dad -> name );
+    if ( b -> rc != 0 )
+        return true;
+    if ( VectorDoUntil ( & to -> overrides, false, SProductionDumpVirtuals, b ) )
+        return true;
+    b -> rc = SDumperPrint ( b, "\t */\n" );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+#endif
+
+static
+bool STableDumpBody ( const STable *self, SDumper *b )
+{
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+    if ( self -> untyped != NULL )
+    {
+        b -> rc = SDumperPrint ( b, compact ? "__untyped=%N();" : "\t__untyped = %N ();\n"
+                                 , self -> untyped -> name
+            );
+        if ( b -> rc != 0 )
+            return true;
+    }
+    if ( self -> limit != NULL )
+    {
+        b -> rc = SDumperPrint ( b, compact ? "column default limit=%E;" : "\tcolumn default limit = %E;\n"
+                                 , self -> limit
+            );
+        if ( b -> rc != 0 )
+            return true;
+    }
+#if SLVL >= 8
+    if ( VectorDoUntil ( & self -> col, false, SColumnDefDump, b ) )
+        return true;
+#endif
+    if ( VectorDoUntil ( & self -> prod, false, SProductionDefDump, b ) )
+        return true;
+#if SLVL >= 7
+    if ( VectorDoUntil ( & self -> phys, false, SPhysMemberDefDump, b ) )
+        return true;
+#endif
+#if _DEBUGGING
+    if ( SDumperMode ( b ) == sdmPrint )
+    {
+        if ( VectorDoUntil ( & self -> overrides, false, SProductionDumpOverrides, b ) )
+            return true;
+
+        if ( VectorLength ( & self -> vprods ) != 0 )
+        {
+            b -> rc = SDumperPrint ( b, "\n\t/* %N virtual productions\n", self -> name );
+            if ( b -> rc != 0 )
+                return true;
+            if ( VectorDoUntil ( & self -> vprods, false, SProductionDumpVirtuals, b ) )
+                return true;
+            b -> rc = SDumperPrint ( b, "\t */\n" );
+            if ( b -> rc != 0 )
+                return true;
+        }
+    }
+#endif
+
+    return false;
+}
+
+static
+bool CC STableDumpParents ( void *item, void *data )
+{
+    SDumper *b = data;
+    const STable *self = ( const void* ) item;
+
+    b -> rc = SDumperPrint ( b, "\v%N%V", self -> name, self -> version );
+
+    SDumperSepString ( b, SDumperMode ( b ) == sdmCompact ? "," : ", " );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+bool CC STableDefDump ( void *item, void *data )
+{
+    bool rtn;
+    SDumper *b = data;
+    const STable *self = ( const void* ) item;
+    bool compact = SDumperMode ( b ) == sdmCompact ? true : false;
+
+    if ( SDumperMarkedMode ( b ) && ! self -> marked )
+        return false;
+
+    b -> rc = SDumperPrint ( b, compact ? "table %N" : "\ttable %N", self -> name );
+
+    if ( b -> rc == 0 )
+        b -> rc = SDumperVersion ( b, self -> version );
+
+    if ( b -> rc == 0 )
+    {
+        SDumperSepString ( b, compact ? "=" : " = " );
+        VectorDoUntil ( & self -> parents, false, STableDumpParents, b );
+    }
+
+    if ( b -> rc == 0 )
+        b -> rc = SDumperPrint ( b, compact ? "{" : "\n\t{\n" );
+
+    if ( b -> rc != 0 )
+        return true;
+
+    if ( ! compact )
+        SDumperIncIndentLevel ( b );
+    rtn = STableDumpBody ( self, b );
+    if ( ! compact )
+        SDumperDecIndentLevel ( b );
+
+    if ( rtn )
+        return true;
+
+    b -> rc = SDumperPrint ( b, compact ? "}" : "\t}\n" );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ */
+
+#if SLVL >= 7
+
+/*
+ * physical-name      = '.' ID
+ */
+void physical_name ( const KSymTable *tbl, KTokenSource *src, KToken *t, const SchemaEnv *env )
+{
+    KToken t2;
+    if ( KTokenizerNext ( kDefaultTokenizer, src, & t2 ) -> id != eIdent ||
+         t -> str . addr + 1 != t2 . str . addr )
+    {
+        /* this is just a dot */
+        KTokenSourceReturn ( src, & t2 );
+    }
+    else
+    {
+        /* this is a physical name */
+        t -> str . size += t2 . str . size;
+        t -> str . len += t2 . str . len;
+        t -> id = eIdent;
+        t -> sym = KSymTableFind ( tbl, & t -> str );
+        if ( t -> sym != NULL )
+            t -> id = t -> sym -> type;
+    }
+}
+
+/*
+ *    physical-decl      = 'physical' [ 'column' ] KCOL '{' <physical-stmts> '}'
+ *    physical-stmts     = <physical-stmt> ';' [ <physical-stmts> ]
+ *    physical-stmt      = 'read' ( '=' | '+= ) <cond-expr>
+ *                       | 'write' ( '=' | '+=' ) <cond-expr>
+ *                       | '__untyped' '=' <untyped-expr>
+ */
+static
+rc_t physical_mbr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SPhysMember *m )
+{
+    rc_t rc;
+
+    /* determine static flag */
+    if ( t -> id == kw_static )
+    {
+        next_token ( tbl, src, t );
+        m -> stat = true;
+    }
+
+    /* skip keywords */
+    if ( t -> id == kw_physical )
+        next_token ( tbl, src, t );
+    if ( t -> id == kw_column )
+        next_token ( tbl, src, t );
+
+    /* if member type begins with schema parameters... */
+    if ( t -> id == eLeftAngle )
+        rc = phys_encoding_expr ( tbl, src, t, env, self, & m -> td, & m -> type );
+    else
+    {
+        /* get either a typename or a physical column name */
+        rc = next_fqn ( tbl, src, t, env );
+        if ( rc == 0 )
+        {
+            /* column is probably based upon a physical structure */
+            if ( t -> id == ePhysical )
+                rc = phys_encoding_expr ( tbl, src, t, env, self, & m -> td, & m -> type );            
+            else if ( t -> id != eDatatype )
+                return KTokenExpected ( t, klogErr, "typename or physical column type" );
+            else
+                rc = typedecl ( tbl, src, t, env, self, & m -> td );
+        }
+    }
+    if ( rc != 0 )
+        return KTokenFailure ( t, klogErr, rc, "typename or physical column type" );
+
+    /* get name */
+    if ( t -> id != ePeriod )
+        return KTokenExpected ( t, klogErr, "physical name starting with period" );
+    physical_name ( tbl, src, t, env );
+    if ( t -> id == eIdent )
+    {
+        /* enter name into scope */
+        rc = KSymTableCreateConstSymbol ( tbl, & m -> name, & t -> str, ePhysMember, m );
+        if ( rc != 0 )
+            return KTokenRCExplain ( t, klogInt, rc );
+    }
+    else if ( t -> id == ePhysMember )
+        return KTokenExpected ( t, klogErr, "undefined physical member name" );
+    else if ( t -> id != eForward && t -> id != eVirtual )
+        return KTokenExpected ( t, klogErr, "physical member name" );
+    else
+    {
+        m -> name = t -> sym;
+        ( ( KSymbol* ) t -> sym ) -> u . obj = m;
+        ( ( KSymbol* ) t -> sym ) -> type = ePhysMember;
+    }
+
+
+    /* get the assignment expression */
+    if ( next_token ( tbl, src, t ) -> id == eAssign )
+    {
+        rc = cond_expr ( tbl, src, next_token ( tbl, src, t ), env, self, & m -> expr );
+        if ( rc != 0 )
+            return KTokenFailure ( t, klogErr, rc, "assignment expression" );
+    }
+
+    /* expect we're done */
+    return expect ( tbl, src, t, eSemiColon, ";", true );
+}
+
+static
+rc_t physical_member ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, STable *table )
+{
+    rc_t rc;
+    SPhysMember *m = malloc ( sizeof * m );
+    if ( m == NULL )
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+    else
+    {
+        memset ( m, 0, sizeof * m );
+        rc = physical_mbr ( tbl, src, t, env, self, m );
+        if ( rc == 0 )
+        {
+            rc = VectorAppend ( & table -> phys, & m -> cid . id, m );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        SPhysMemberWhack ( m, NULL );
+    }
+    return rc;
+}
+
+static
+rc_t implicit_physical_member ( KSymTable *tbl, const SchemaEnv *env,
+    STable *table, SColumn *c, KSymbol *sym )
+{
+    rc_t rc;
+    SPhysMember *m = malloc ( sizeof * m );
+    if ( m == NULL )
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+    else
+    {
+        /* create initialized simple physical member */
+        memset ( m, 0, sizeof * m );
+        m -> simple = true;
+
+        /* capture type information */
+        m -> td = c -> td;
+        if ( c -> ptype != NULL )
+        {
+            m -> type = c -> ptype;
+            atomic32_inc ( & ( ( SExpression* ) c -> ptype ) -> refcount );
+        }
+
+        /* link up with name */
+        m -> name = sym;
+        sym -> u . obj = m;
+
+        /* now create simple input expression */
+        rc = SSymExprMake ( & m -> expr, c -> name, eColExpr );
+        if ( rc == 0 )
+            rc = SSymExprMake ( & c -> read, sym, ePhysExpr );
+        if ( rc == 0 )
+        {
+            rc = VectorAppend ( & table -> phys, & m -> cid . id, m );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        SPhysMemberWhack ( m, NULL );
+    }
+    return rc;
+}
+#endif
+
+#if SLVL >= 8
+/*
+ * column-stmt        = 'read' '=' <cond-expr>
+ *                    | 'validate' '=' <cond-expr>
+ *                    | 'limit' '=' UINT_EXPR
+ *                    | ';'
+ */
+static
+rc_t column_stmt ( KSymTable *tbl, KTokenSource *src, KToken *t,
+     const SchemaEnv *env, VSchema *self, SColumn *c, const char **expected )
+{
+    rc_t rc;
+
+    switch ( t -> id )
+    {
+    case eSemiColon:
+        return 0;
+
+    case kw_read:
+
+        if ( c -> simple )
+            break;
+
+        if ( c -> read != NULL )
+        {
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcProduction, rcExists );
+            return KTokenRCExplain ( t, klogErr, rc );
+        }
+
+        rc = expect ( tbl, src, next_token ( tbl, src, t ), eAssign, "=", true );
+        if ( rc == 0 )
+        {
+            rc = cond_expr ( tbl, src, t, env, self, & c -> read );
+            if ( rc != 0 )
+                KTokenFailure ( t, klogErr, rc, "read expression" );
+            else
+            {
+                if ( c -> read_only )
+                    * expected = "}";
+                else if ( c -> validate == NULL && c -> limit == NULL )
+                    * expected = "validate or limit or }";
+                else if ( c -> validate == NULL )
+                    * expected = "validate or }";
+                else if ( c -> limit == NULL )
+                    * expected = "limit or }";
+                else
+                    * expected = "}";
+                return 0;
+            }
+        }
+        break;
+
+    case kw_validate:
+
+        if ( c -> read_only || c -> simple )
+            break;
+
+        if ( c -> validate != NULL )
+        {
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcProduction, rcExists );
+            return KTokenRCExplain ( t, klogErr, rc );
+        }
+
+        rc = expect ( tbl, src, next_token ( tbl, src, t ), eAssign, "=", true );
+        if ( rc == 0 )
+        {
+            rc = cond_expr ( tbl, src, t, env, self, & c -> validate );
+            if ( rc != 0 )
+                KTokenFailure ( t, klogErr, rc, "validate expression" );
+            else
+            {
+                if ( c -> read == NULL && c -> limit == NULL )
+                    * expected = "read or limit or }";
+                else if ( c -> read == NULL )
+                    * expected = "read or }";
+                else if ( c -> limit == NULL )
+                    * expected = "limit or }";
+                else
+                    * expected = "}";
+                return 0;
+            }
+        }
+        break;
+
+    case kw_limit:
+
+        if ( c -> read_only )
+            break;
+
+        if ( c -> limit != NULL )
+        {
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcConstraint, rcExists );
+            return KTokenRCExplain ( t, klogErr, rc );
+        }
+
+        rc = expect ( tbl, src, next_token ( tbl, src, t ), eAssign, "=", true );
+        if ( rc == 0 )
+        {
+            rc = const_expr ( tbl, src, t, env, self, & c -> limit );
+            if ( rc != 0 )
+                KTokenFailure ( t, klogErr, rc, "limit constraint" );
+            else
+            {
+                if ( c -> read == NULL && c -> validate == NULL )
+                    * expected = "read or validate or }";
+                else if ( c -> read == NULL )
+                    * expected = "read or }";
+                else if ( c -> validate == NULL )
+                    * expected = "validate or }";
+                else
+                    * expected = "}";
+                return 0;
+            }
+        }
+        break;
+    }
+
+    return KTokenExpected ( t, klogErr, * expected );
+}
+
+/*
+ * column-body        = '{' <column-stmts> '}'
+ * column-stmts       = <column-stmt> ';' [ <column-stmts> ]
+ */
+static
+rc_t column_body ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, SColumn *c )
+{
+    const char *expected;
+
+    rc_t rc = expect ( tbl, src, t, eLeftCurly, "{", true );
+    if ( rc != 0 )
+        return rc;
+
+    expected = c -> read_only ? "read or }" :
+        ( c -> simple ? "limit or }" :  "read or validate or limit or }" );
+
+    while ( t -> id != eRightCurly )
+    {
+        rc = column_stmt ( tbl, src, t, env, self, c, & expected );
+        if ( rc == 0 )
+            rc = expect ( tbl, src, t, eSemiColon, ";", true );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    if ( c -> read == NULL && c -> validate == NULL )
+        c -> simple = true;
+
+    return expect ( tbl, src, t, eRightCurly, "}", true );
+}
+
+/*
+ * column-decl        = <typedecl> ID <column-body>
+ */
+static
+rc_t typed_column_decl ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, STable *table, SColumn *c )
+{
+    rc_t rc = 0;
+
+    /* if column was forwarded, give it a type */
+    if ( t -> id == eForward || t -> id == eVirtual )
+    {
+        c -> name = t -> sym;
+        t -> sym -> type = eColumn;
+    }
+
+    /* catch case where column exists */
+    else if ( t -> id == eColumn )
+    {
+        const SNameOverload *name = t -> sym -> u . obj;
+        if ( VectorFind ( & name -> items, & c -> td, NULL, SColumnCmp ) != NULL )
+            return KTokenExpected ( t, klogErr, "new column name" );
+        c -> name = t -> sym;
+    }
+    else
+    {
+        /* allow names defined in scopes other than table and intrinsic */
+        if ( t -> sym != NULL )
+        {
+            KTokenSourceReturn ( src, t );
+            next_shallow_token ( tbl, src, t, true );
+        }
+
+        if ( t -> id != eIdent )
+            return KTokenExpected ( t, klogErr, "column name" );
+
+        rc = KSymTableCreateConstSymbol ( tbl, & c -> name, & t -> str, eColumn, NULL );
+        if ( rc != 0 )
+            return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    /* we have "[ 'readonly' | ... ] 'column' TYPE ID" by now.
+       accept a simple assignment for read/validate,
+       or a semi-colon for implicit physical, or a compound
+       statement body for read/validate/limit statements */
+    switch ( next_token ( tbl, src, t ) -> id )
+    {
+    case eSemiColon:
+
+        /* acceptable unless readonly */
+        if ( c -> read_only )
+            rc = KTokenExpected ( t, klogErr, "= or {" );
+
+        /* this looks like a simple column */
+        c -> simple = true;
+        break;
+
+    case eAssign:
+
+        /* if a simple column ( implicit physical ),
+           then there cannot be a read expression */
+        if ( c -> simple )
+            rc = KTokenExpected ( t, klogErr, "; after simple column" );
+        else
+        {
+            /* simple read expression */
+            next_token ( tbl, src, t );
+            rc = cond_expr ( tbl, src, t, env, self, & c -> read );
+            if ( rc != 0 )
+                KTokenFailure ( t, klogErr, rc, "read expression" );
+            else
+                rc = expect ( tbl, src, t, eSemiColon, ";", true );
+        }
+        break;
+
+    case eLeftCurly:
+        /* this is a canonical-form column */
+        rc = column_body ( tbl, src, t, env, self, c );
+        break;
+
+    default:
+        rc = KTokenExpected ( t, klogErr, c -> read_only ? "= or {" : "; or = or {" );
+    }
+
+    /* check for a simple column */
+    if ( rc == 0 && c -> simple )
+    {
+        String physname;
+        char physnamebuff [ 256 ];
+
+        /* check for existence of corresponding physical member */
+        if ( c -> name -> name . size >= sizeof physnamebuff )
+        {
+            /* this is a very long column name... */
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcName, rcExcessive );
+            KTokenFailure ( t, klogErr, rc, "column name" );
+        }
+        else
+        {
+            KSymbol *sym;
+
+            /* tack a dot onto the beginning and look up the symbol */
+            physnamebuff [ 0 ] = '.';
+            memmove ( & physnamebuff [ 1 ], c -> name -> name . addr, c -> name -> name . size );
+            StringInit ( & physname, physnamebuff, c -> name -> name . size + 1, c -> name -> name . len + 1 );
+            sym = KSymTableFind ( tbl, & physname );
+
+            /* if the symbol exists, then this CANNOT be a simple column */
+            if ( sym != NULL && ! ( sym -> type == eForward || sym -> type == eVirtual ) )
+            {
+                /* check for explicit physical type */
+                if ( c -> ptype != NULL )
+                {
+                    rc = RC ( rcVDB, rcSchema, rcParsing, rcName, rcExists );
+                    KTokenFailure ( t, klogErr, rc, "implicit physical column previously declared" );
+                }
+                else
+                {
+                    rc = RC ( rcVDB, rcSchema, rcParsing, rcExpression, rcNotFound );
+                    KTokenFailure ( t, klogErr, rc, "missing column read or validate expression" );
+                }
+            }
+            else if ( ( c -> td . type_id & 0xC0000000 ) != 0 )
+            {
+                rc = RC ( rcVDB, rcSchema, rcParsing, rcType, rcIncorrect );
+                KTokenFailure ( t, klogErr, rc, "simple columns cannot have typeset as type" );
+            }
+            else
+            {
+                if ( sym != NULL )
+                    sym -> type = ePhysMember;
+                else
+                {
+                    rc = KSymTableCreateSymbol ( tbl, & sym, & physname, ePhysMember, NULL );
+                    if ( rc != 0 )
+                        KTokenFailure ( t, klogErr, rc, "failed to create symbol" );
+                }
+                if ( rc == 0 )
+                {
+                    rc = implicit_physical_member ( tbl, env, table, c, sym );
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t column_decl ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, STable *table, SColumn *c )
+{
+    rc_t rc;
+
+    /* intercept physical type unless marked read-only */
+    if ( ! c -> read_only )
+    {
+        switch ( t -> id )
+        {
+        case eNamespace:
+            rc = next_fqn ( tbl, src, t, env );
+            if ( rc != 0 )
+                return KTokenFailure ( t, klogErr, rc, "typename or physical column type" );
+            if ( t -> id != ePhysical )
+                break;
+        case ePhysical:
+        case eLeftAngle:
+            rc = phys_encoding_expr ( tbl, src, t, env, self, & c -> td, & c -> ptype );
+            if ( rc != 0 )
+                return KTokenFailure ( t, klogErr, rc, "typename or physical column type" );
+
+            /* this column MUST be simple */
+            c -> simple = true;
+            return typed_column_decl ( tbl, src, t, env, self, table, c );
+        }
+    }
+
+#if ALLOW_COLUMN_TYPESET
+    /* read typedecl or typeset */
+    rc = typespec ( tbl, src, t, env, self, & c -> td );
+#else
+    /* read hard typedecl */
+    rc = typedecl ( tbl, src, t, env, self, & c -> td );
+#endif
+    if ( rc != 0 )
+        return KTokenExpected ( t, klogErr, "column type" );
+
+    /* finish the parse with a normal type */
+    return typed_column_decl ( tbl, src, t, env, self, table, c );
+}
+
+static
+rc_t column_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, STable *table )
+{
+    rc_t rc;
+    SColumn *c;
+    bool dflt, read_only;
+
+    /* parse 'virtual' and 'default' keywords */
+    for ( dflt = read_only = false;
+          t -> id != kw_column; next_token ( tbl, src, t ) )
+    {
+        switch ( t -> id )
+        {
+        case kw_default:
+            if ( dflt )
+                break;
+            dflt = true;
+            continue;
+
+        case kw_extern:
+            continue;
+
+        case kw_readonly:
+            if ( read_only )
+                break;
+            read_only = true;
+            continue;
+        }
+
+        return KTokenExpected ( t, klogErr, "column" );
+    }
+
+    /* consume 'column' keyword and look for 'default' or 'limit' */
+    switch ( next_token ( tbl, src, t ) -> id )
+    {
+    case kw_default:
+    {
+        KToken t2 = * t;
+        KTokenSource src2 = * src;
+        if ( next_token ( tbl, src, t ) -> id != kw_limit )
+        {
+            * t = t2;
+            * src = src2;
+            break;
+        }
+    }
+    case kw_limit:
+
+        if ( dflt || read_only )
+            break;
+
+        if ( table -> limit != NULL )
+        {
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcConstraint, rcExists );
+            return KTokenRCExplain ( t, klogErr, rc );
+        }
+
+        rc = expect ( tbl, src, next_token ( tbl, src, t ), eAssign, "=", true );
+        if ( rc == 0 )
+        {
+            rc = const_expr ( tbl, src, t, env, self, & table -> limit );
+            if ( rc != 0 )
+                KTokenFailure ( t, klogErr, rc, "limit constraint" );
+            else
+                rc = expect ( tbl, src, t, eSemiColon, ";", true );
+        }
+        return rc;
+    }
+
+    /* create column object */
+    c = malloc ( sizeof * c );
+    if ( c == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    memset ( c, 0, sizeof * c );
+    c -> dflt = dflt;
+    c -> read_only = read_only;
+
+    /* parse decl */
+    rc = column_decl ( tbl, src, t, env, self, table, c );
+    if ( rc == 0 )
+    {
+        /* give column its own id within table */
+        rc = VectorAppend ( & table -> col, & c -> cid . id, c );
+        if ( rc != 0 )
+            KTokenRCExplain ( t, klogInt, rc );
+        else
+        {
+            void *ignore;
+            SNameOverload *name = ( void* ) c -> name -> u . obj;
+            if ( name == NULL )
+            {
+                rc = SNameOverloadMake ( & name, c -> name, 0, 4 );
+                if ( rc == 0 )
+                {
+                    name -> cid . ctx = -1;
+                    rc = VectorAppend ( & table -> cname, & name -> cid . id, name );
+                    if ( rc != 0 )
+                        SNameOverloadWhack ( name, NULL );
+                }
+            }
+
+            if ( rc == 0 )
+            {
+                rc = VectorInsertUnique ( & name -> items, c, NULL, SColumnSort );
+                if ( rc == 0 )
+                    return 0;
+            }
+
+            /* reverse column insertion */
+            VectorSwap ( & table -> col, c -> cid . id, NULL, & ignore );
+
+            /* what went wrong */
+            KTokenRCExplain ( t, klogInt, rc );
+        }
+    }
+
+    SColumnWhack ( c, NULL );
+    return rc;
+}
+#endif
+
+#if SLVL >= 6
+
+static
+rc_t untyped_tbl_expr ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, STable *table )
+{
+    const SNameOverload *name;
+
+    /* expecting a function assignment */
+    rc_t rc = expect ( tbl, src,
+        next_token ( tbl, src, t ), eAssign, "=", true );
+    if ( rc == 0 )
+        rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return rc;
+    if ( t -> id != eUntypedFunc )
+        return KTokenExpected ( t, klogErr, "untyped function expression" );
+    name = t -> sym -> u . obj;
+
+    rc = expect ( tbl, src,
+        next_token ( tbl, src, t ), eLeftParen, "(", true );
+    if ( rc == 0 )
+        rc = expect ( tbl, src, t, eRightParen, ")", true );
+    if ( rc == 0 )
+        rc = expect ( tbl, src, t, eSemiColon, ";", true );
+
+    if ( rc == 0 )
+    {
+        table -> untyped = VectorLast ( & name -> items );
+        if ( table -> untyped == NULL )
+        {
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcFunction, rcNotFound );
+            KTokenRCExplain ( t, klogErr, rc );
+        }
+    }
+
+    return rc;
+}
+
+#if SLVL >= 8
+static
+rc_t default_view_decl ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, STable *table )
+{
+    rc_t rc;
+    bool string_too_long;
+
+    if ( next_token ( tbl, src, t ) -> id != eString )
+        return KTokenExpected ( t, klogErr, "default view declaration" );
+
+    string_too_long = false;
+    if ( t -> str . size >= 236 + 2 )
+    {
+        KTokenExpected ( t, klogWarn, "default view declaration less than 236 characters" );
+        string_too_long = true;
+    }
+
+    rc = expect ( tbl, src, t, eSemiColon, ";", true );
+    if ( rc == 0 && ! string_too_long )
+    {
+        String decl = t -> str;
+        ++ decl . addr;
+        decl . size -= 2;
+        decl . len -= 2;
+
+        if ( table -> dflt_view != NULL )
+            StringWhack ( table -> dflt_view );
+
+        rc = StringCopy ( & table -> dflt_view, & decl );
+    }
+
+    return rc;
+}
+#endif
+
+/*
+ * table-local-decl   = [ 'virtual' ] 'column' <column-decl>
+ *                    | 'physical' [ 'column' ] <physical-decl>
+ *                    | <production_stmt>
+ */
+static
+rc_t table_local_decl ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, STable *table )
+{
+    rc_t rc;
+
+    switch ( t -> id )
+    {
+#if SLVL >= 8
+    case kw_default:
+        if ( env -> default_view_decl )
+        {
+            KToken t2;
+            if ( next_token ( tbl, src, & t2 ) -> id == kw_view )
+                return default_view_decl ( tbl, src, t, env, self, table );
+             KTokenSourceReturn ( src, & t2 );
+        }
+        /* no break */
+    case kw_extern:
+    case kw_column:
+    case kw_readonly:
+        return column_declaration ( tbl, src, t, env, self, table );
+#endif
+#if SLVL >= 7
+    case kw_static:
+    case kw_physical:
+        return physical_member ( tbl, src, t, env, self, table );
+#endif
+    case kw___untyped:
+        return untyped_tbl_expr ( tbl, src, t, env, self, table );
+#if 0
+    case kw_index:
+        break;
+#endif
+    case eSemiColon:
+        next_token ( tbl, src, t );
+        rc = 0;
+        break;
+
+    default:
+        rc = production_stmt ( tbl, src, t, env, self, & table -> prod, eTable );
+        if ( rc == 0 )
+            rc = expect ( tbl, src, t, eSemiColon, ";", true );
+    }
+
+    return rc;
+}
+
+/*
+ * table-body         = '{' [ <table-decl-list> ] '}'
+ *
+ * table-decl-list    = <tbl-local-decl> ';' [ <table-decl-list> ]
+ */
+typedef struct STableScanData STableScanData;
+struct STableScanData
+{
+    STable *self;
+    rc_t rc;
+};
+
+static
+bool CC table_fwd_scan ( BSTNode *n, void *data )
+{
+    STableScanData *pb = data;
+    KSymbol *sym = ( KSymbol* ) n;
+    STable *self = pb -> self;
+
+    /* process forwarded symbols */
+    if ( sym -> type == eForward )
+    {
+        /* this symbol was introduced in THIS table */
+        sym -> u . fwd . ctx = self -> id;
+
+        /* add it to the introduced virtual productions and make it virtual */
+        pb -> rc = VectorAppend ( & self -> vprods, & sym -> u . fwd . id, sym );
+        if ( pb -> rc != 0 )
+            return true;
+        sym -> type = eVirtual;
+    }
+    /* symbols other than fwd or virtual are ignored */
+    else if ( sym -> type != eVirtual )
+    {
+        return false;
+    }
+
+    /* add symbol to vector to track ownership */
+    pb -> rc = VectorAppend ( & self -> syms, NULL, sym );
+    if ( pb -> rc != 0 )
+        return true;
+
+    /* remove from symbol table */
+    BSTreeUnlink ( & self -> scope, & sym -> n );
+    return false;
+}
+
+static
+rc_t table_body ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, STable *table )
+{
+    rc_t rc = expect ( tbl, src, t, eLeftCurly, "{", true );
+    if ( rc != 0 )
+        return rc;
+
+    while ( t -> id != eRightCurly )
+    {
+        rc = table_local_decl ( tbl, src, t, env, self, table );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    rc = expect ( tbl, src, t, eRightCurly, "}", true );
+    if ( rc == 0 )
+    {
+        STableScanData pb;
+        pb . self = table;
+        pb . rc = 0;
+
+        /* scan table scope for unresolved forward references */
+        if ( BSTreeDoUntil ( & table -> scope, false, table_fwd_scan, & pb ) )
+            KTokenRCExplain ( t, klogInt, rc = pb . rc );
+    }
+
+    return rc;
+}
+
+/*
+ * table-syntax
+ */
+static
+bool CC table_prod_syntax ( void *item, void *data )
+{
+    rc_t *rc = data;
+    const SProduction *prod = ( const SProduction* ) item;
+
+    if ( ! prod -> trigger )
+        * rc = eval_expr_syntax ( prod -> fd );
+    if ( * rc == 0 )
+        * rc = eval_expr_syntax ( prod -> expr );
+
+    return ( * rc != 0 ) ? true : false;
+}
+
+static
+rc_t table_stmt_syntax ( const STable *table )
+{
+    rc_t rc = 0;
+    VectorDoUntil ( & table -> prod, false, table_prod_syntax, & rc );
+    return rc;
+}
+
+#if SLVL >= 8
+static
+bool CC table_typed_column_syntax ( void *item, void *data )
+{
+    rc_t *rc = data;
+    const SColumn *col = ( const SColumn* ) item;
+
+    if ( col -> read != NULL )
+        * rc = eval_expr_syntax ( col -> read );
+    if ( * rc == 0 && col -> validate != NULL )
+        * rc = eval_expr_syntax ( col -> validate );
+    if ( * rc == 0 && col -> limit != NULL )
+        * rc = eval_expr_syntax ( col -> limit );
+
+    return ( * rc != 0 ) ? true : false;
+}
+
+static
+rc_t table_column_syntax ( const STable *table )
+{
+    rc_t rc = 0;
+    VectorDoUntil ( & table -> col, false, table_typed_column_syntax, & rc );
+    return rc;
+}
+#endif
+
+#if SLVL >= 7
+static
+bool CC table_physcol_syntax ( void *item, void *data )
+{
+    rc_t *rc = data;
+    const SPhysMember *col = ( const SPhysMember* ) item;
+
+    if ( col -> expr == NULL )
+        return false;
+
+    * rc = eval_expr_syntax ( col -> expr );
+    return ( * rc != 0 ) ? true : false;
+}
+
+static
+rc_t table_physical_syntax ( const STable *table )
+{
+    rc_t rc = 0;
+    VectorDoUntil ( & table -> phys, false, table_physcol_syntax, & rc );
+    return rc;
+}
+#endif
+
+
+/*
+ * push-tbl-scope
+ * pop-tbl-scope
+ */
+void pop_tbl_scope ( KSymTable *tbl, const STable *table )
+{
+    uint32_t i, count = VectorLength ( & table -> overrides );
+    for ( ++ count, i = 0; i < count; ++ i )
+        KSymTablePopScope ( tbl );
+}
+
+rc_t push_tbl_scope ( KSymTable *tbl, const STable *table )
+{
+    rc_t rc;
+    uint32_t i = VectorStart ( & table -> overrides );
+    uint32_t count = VectorLength ( & table -> overrides );
+    for ( count += i; i < count; ++ i )
+    {
+        const STableOverrides *to = ( const void* ) VectorGet ( & table -> overrides, i );
+        rc = KSymTablePushScope ( tbl, ( BSTree* ) & to -> dad -> scope );
+        if ( rc != 0 )
+        {
+            for ( count = VectorStart ( & table -> overrides ); i > count; -- i )
+                KSymTablePopScope ( tbl );
+            return rc;
+        }
+    }
+
+    rc = KSymTablePushScope ( tbl, ( BSTree* ) & table -> scope );
+    if ( rc != 0 )
+    {
+        for ( i = VectorStart ( & table -> overrides ); i < count; ++ i )
+            KSymTablePopScope ( tbl );
+    }
+
+    return rc;
+}
+
+/*
+ * init-tbl-symtab
+ *  initializes "tbl"
+ *  places table in scope
+ *  must be balanced by KSymTableWhack
+ */
+rc_t init_tbl_symtab ( KSymTable *tbl, const VSchema *schema, const STable *table )
+{
+    rc_t rc = init_symtab ( tbl, schema );
+    if ( rc == 0 )
+    {
+        rc = push_tbl_scope ( tbl, table );
+        if ( rc == 0 )
+            return 0;
+
+        KSymTableWhack ( tbl );
+    }
+
+    return rc;
+}
+
+
+/*
+ * table-decl         = 'table' <fqn> '#' <maj-min-rel>
+ *                      [ '=' <table-name> ] <table-body>
+ * table-body         = '{' [ <table-stmts> ] '}'
+ * table-stmts        = <table-stmt> ';' [ <table-stmts> ]
+ */
+static
+rc_t table_decl ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self, STable *table )
+{
+    /* table name */
+    rc_t rc = create_fqn ( tbl, src, t, env, eTable, NULL );
+    if ( rc != 0 && GetRCState ( rc ) != rcExists )
+        return KTokenFailure ( t, klogErr, rc, "table name" );
+    table -> name = t -> sym;
+    table -> src_file = t -> txt -> path;
+    table -> src_line = t -> lineno;
+
+    /* table version */
+    if ( next_token ( tbl, src, t ) -> id != eHash )
+        return KTokenExpected ( t, klogErr, "#" );
+    next_token ( tbl, src, t );
+    rc = maj_min_rel ( tbl, src, t, env, self, & table -> version, true );
+    if ( rc != 0 )
+        return rc;
+
+    /* prepare vectors */
+    VectorInit ( & table -> parents, 0, 4 );
+    VectorInit ( & table -> overrides, 0, 4 );
+    VectorInit ( & table -> col, 0, 16 );
+    VectorInit ( & table -> cname, 0, 16 );
+    VectorInit ( & table -> phys, 0, 16 );
+    VectorInit ( & table -> prod, 0, 64 );
+    VectorInit ( & table -> vprods, 1, 16 );
+    VectorInit ( & table -> syms, 1, 32 );
+
+    /* look for inheritance */
+    if ( t -> id == eAssign ) do
+    {
+        const STable *dad;
+        const SNameOverload *name;
+
+        /* look for dad */
+        rc = next_fqn ( tbl, src, next_token ( tbl, src, t ), env );
+        if ( rc != 0 )
+            return KTokenFailure ( t, klogErr, rc, "table name" );
+
+        /* insist that dad be a table */
+        if ( t -> id != eTable )
+            return KTokenExpected ( t, klogErr, "table name" );
+        name = t -> sym -> u . obj;
+
+        /* check for version */
+        if ( next_token ( tbl, src, t ) -> id != eHash )
+            dad = VectorLast ( & name -> items );
+        else
+        {
+            uint32_t vers;
+            next_token ( tbl, src, t );
+            rc = maj_min_rel ( tbl, src, t, env, self, & vers, true );
+            if ( rc != 0 )
+                return rc;
+            dad = VectorFind ( & name -> items, & vers, NULL, STableCmp );
+#if _DEBUGGING && 1
+            if ( dad != NULL && dad -> version > vers )
+            {
+                PLOGMSG ( klogInfo, ( klogInfo
+                                      , "table_decl: table '$(tbl)' specifies parent table '$(parent)' - should be $(actual_version)"
+                                      , "tbl=%N#%.3V,parent=%N#%.3V,actual_version=#%.3V"
+                                      , table -> name, table -> version
+                                      , dad -> name, vers
+                                      , dad -> version
+                              ));
+            }
+#endif
+        }
+
+        /* dad should be found */
+        if ( dad == NULL )
+        {
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcTable, rcNotFound );
+            return KTokenRCExplain ( t, klogErr, rc );
+        }
+
+        /* take the inheritance */
+        rc = STableExtend ( tbl, table, dad );
+        if ( rc != 0 )
+            return KTokenRCExplain ( t, klogInt, rc );
+    }
+    while ( t -> id == eComma );
+
+    /* enter table into scope */
+    rc = push_tbl_scope ( tbl, table );
+    if ( rc == 0 )
+    {
+        /* scan override tables for virtual symbols */
+        if ( VectorDoUntil ( & table -> overrides, false, STableScanVirtuals, tbl ) )
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+        /* parse the definition */
+        else
+            rc = table_body ( tbl, src, t, env, self, table );
+
+        /* pop out of scope */
+        pop_tbl_scope ( tbl, table );
+    }
+
+    /* fix forward references */
+    if ( rc == 0 )
+    {
+        rc = table_stmt_syntax ( table );
+#if SLVL >= 8
+        if ( rc == 0 )
+            rc = table_column_syntax ( table );
+#endif
+#if SLVL >= 7
+        if ( rc == 0 )
+            rc = table_physical_syntax ( table );
+#endif
+    }
+
+    return rc;
+}
+
+static
+void CC column_set_context ( void *item, void *data )
+{
+    SColumn *self = item;
+    self -> cid . ctx = * ( const uint32_t* ) data;
+}
+
+static
+void CC name_set_context ( void *item, void *data )
+{
+    SNameOverload *self = item;
+    if ( ( int32_t ) self -> cid . ctx < 0 )
+        self -> cid . ctx = * ( const uint32_t* ) data;
+}
+
+static
+void CC physical_set_context ( void *item, void *data )
+{
+    SPhysMember *self = item;
+    self -> cid . ctx = * ( const uint32_t* ) data;
+}
+
+static
+void CC production_set_context ( void *item, void *data )
+{
+    SProduction *self = item;
+    self -> cid . ctx = * ( const uint32_t* ) data;
+}
+
+static
+void CC symbol_set_context ( void *item, void *data )
+{
+    KSymbol *self = item;
+    self -> u . fwd . ctx = * ( const uint32_t* ) data;
+}
+
+static
+void table_set_context ( STable *self )
+{
+    VectorForEach ( & self -> col, false, column_set_context, & self -> id );
+    VectorForEach ( & self -> cname, false, name_set_context, & self -> id );
+    VectorForEach ( & self -> phys, false, physical_set_context, & self -> id );
+    VectorForEach ( & self -> prod, false, production_set_context, & self -> id );
+    VectorForEach ( & self -> vprods, false, symbol_set_context, & self -> id );
+}
+
+#if NO_UPDATE_TBL_REF || 0
+#define schema_update_tbl_ref( self, exist, table ) \
+    0
+#else
+typedef struct update_tbl_ref_data update_tbl_ref_data;
+struct update_tbl_ref_data
+{
+    const STable *exist, *table;
+    rc_t rc;
+};
+
+static
+bool CC table_update_tbl_ref ( void *item, void *data )
+{
+    STable *self = item;
+    update_tbl_ref_data *pb = data;
+
+    bool is_ancestor;
+
+    /* check for having this guy as an immediate parent */
+    uint32_t i = VectorStart ( & self -> parents );
+    uint32_t count = VectorLength ( & self -> parents );
+    for ( count += i; i < count; ++ i )
+    {
+        STable *dad = VectorGet ( & self -> parents, i );
+        if ( ( const STable* ) dad == pb -> exist )
+        {
+            void *ignore;
+            VectorSwap ( & self -> parents, i, pb -> table, & ignore );
+            PARSE_DEBUG (( "table_update_tbl_ref: replaced parent '%N#%.3V' with version #%.3V in table '%N#%.3V'.\n"
+                           , dad -> name, dad -> version
+                           , pb -> table -> version
+                           , self -> name, self -> version
+                ));
+            break;
+        }
+    }
+
+    /* check for having him in the ancestry somewhere */
+    i = VectorStart ( & self -> overrides );
+    count = VectorLength ( & self -> overrides );
+    for ( is_ancestor = false, count += i; i < count; ++ i )
+    {
+        STableOverrides *to = VectorGet ( & self -> overrides, i );
+        if ( to -> dad == pb -> exist )
+        {
+            is_ancestor = true;
+
+            /* rewrite overrides to have updated parent */
+            VectorWhack ( & to -> overrides, NULL, NULL );
+            pb -> rc = VectorCopy ( & pb -> table -> vprods, & to -> overrides );
+            if ( pb -> rc != 0 )
+                return true;
+            to -> dad = pb -> table;
+            to -> ctx = pb -> table -> id;
+            VectorReorder ( & self -> overrides, STableOverridesKSort, NULL );
+            PARSE_DEBUG (( "table_update_tbl_ref: replaced ancestor '%N#%.3V' with version #%.3V in table '%N#%.3V'.\n"
+                           , pb -> exist -> name, pb -> exist -> version
+                           , pb -> table -> version
+                           , self -> name, self -> version
+                ));
+        }
+    }
+
+    /* if he's not an ancestor, we're done */
+    if ( ! is_ancestor )
+        return false;
+
+    /* remove columns from old parent */
+    i = VectorStart ( & self -> cname );
+    count = VectorLength ( & self -> cname );
+    for ( count += i; i < count; ++ i )
+    {
+        Vector cv;
+        uint32_t cx, cnt;
+        SNameOverload *name = VectorGet ( & self -> cname, i );
+
+        /* names originating in existing parent get mapped */
+        if ( name -> cid . ctx == pb -> exist -> id )
+        {
+            name -> cid . ctx = pb -> table -> id;
+            PARSE_DEBUG (( "table_update_tbl_ref: updated context of column name '%N' from %u to %u.\n"
+                           , name -> name
+                           , pb -> exist -> id
+                           , pb -> table -> id
+                ));
+        }
+
+        /* now copy over columns, but eliminate all from old parent */
+        cx = VectorStart ( & name -> items );
+        cnt = VectorLength ( & name -> items );
+        VectorInit ( & cv, cx, cnt );
+        for ( cnt += cx; cx < cnt; ++ cx )
+        {
+            SColumn *c = VectorGet ( & name -> items, cx );
+            if ( c -> cid . ctx == pb -> exist -> id )
+            {
+                PARSE_DEBUG (( "table_update_tbl_ref: dropping column index %u from name '%N'.\n"
+                               , cx
+                               , name -> name
+                    ));
+            }
+            else
+            {
+                pb -> rc = VectorAppend ( & cv, NULL, c );
+                if ( pb -> rc != 0 )
+                    return true;
+            }
+        }
+        VectorWhack ( & name -> items, NULL, NULL );
+        name -> items = cv;
+    }
+
+    /* add in all columns from new parent */
+    if ( VectorDoUntil ( & pb -> table -> cname, false, STableCopyColumnNames, self ) )
+    {
+        pb -> rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        return true;
+    }
+
+    return false;
+}
+
+static
+bool CC tblmbr_update_tbl_ref ( void *item, void *data )
+{
+    STblMember *self = item;
+    update_tbl_ref_data *pb = data;
+
+    if ( self -> tbl == pb -> exist )
+    {
+        PARSE_DEBUG (( "tblmbr_update_tbl_ref: updated table member '%N %N' from %V to %V.\n"
+                       , pb -> exist -> name
+                       , self -> name
+                       , pb -> exist -> version
+                       , pb -> table -> version
+                ));
+        self -> tbl = pb -> table;
+    }
+
+    return false;
+}
+
+static
+bool CC db_update_tbl_ref ( void *item, void *data )
+{
+    SDatabase *self = item;
+
+    /* update table members */
+    if ( VectorDoUntil ( & self -> tbl, false, tblmbr_update_tbl_ref, data ) )
+        return true;
+
+    return VectorDoUntil ( & self -> db, false, db_update_tbl_ref, data );
+}
+
+static
+rc_t schema_update_tbl_ref ( VSchema *self, const STable *exist, const STable *table )
+{
+    update_tbl_ref_data pb;
+    pb . exist = exist;
+    pb . table = table;
+    pb . rc = 0;
+
+    if ( ! VectorDoUntil ( & self -> tbl, false, table_update_tbl_ref, & pb ) )
+          VectorDoUntil ( & self -> db, false, db_update_tbl_ref, & pb );
+
+    return pb . rc;
+}
+#endif
+
+rc_t table_declaration ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    rc_t rc;
+    void *ignore;
+
+    STable *table = calloc ( 1, sizeof * table );
+    if ( table == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    rc = table_decl ( tbl, src, t, env, self, table );
+    if ( rc == 0 )
+    {
+        SNameOverload *name = ( void* ) table -> name -> u . obj;
+        if ( name == NULL )
+        {
+            rc = SNameOverloadMake ( & name, table -> name, 0, 4 );
+            if ( rc == 0 )
+            {
+                rc = VectorAppend ( & self -> tname, & name -> cid . id, name );
+                if ( rc != 0 )
+                    SNameOverloadWhack ( name, NULL );
+            }
+        }
+
+        if ( rc == 0 )
+        {
+            rc = VectorAppend ( & self -> tbl, & table -> id, table );
+            if ( rc == 0 )
+            {
+                uint32_t idx;
+
+                /* set the table id on all members */
+                table_set_context ( table );
+
+                /* add to named table overrides */
+                rc = VectorInsertUnique ( & name -> items, table, & idx, STableSort );
+                if ( rc == 0 )
+                    return 0;
+
+                if ( GetRCState ( rc ) == rcExists )
+                {
+                    const STable *newer;
+                    STable *exist = VectorGet ( & name -> items, idx );
+                    rc = STableCompare ( exist, table, & newer, false );
+                    if ( rc == 0 && newer == table )
+                    {
+                        /* put the new one in place of the existing */
+                        VectorSwap ( & name -> items, idx, table, & ignore );
+
+                        /* tell everyone to use new table */
+                        return schema_update_tbl_ref ( self, exist, table );
+                    }
+                }
+
+                VectorSwap ( & self -> tbl, table -> id, NULL, & ignore );
+            }
+        }
+    }
+    else if ( GetRCState ( rc ) == rcExists )
+    {
+        rc = 0;
+    }
+
+    STableWhack ( table, NULL );
+
+    return rc;
+}
+
+#endif
diff --git a/libs/vdb/schema-tok.c b/libs/vdb/schema-tok.c
new file mode 100644
index 0000000..94a456d
--- /dev/null
+++ b/libs/vdb/schema-tok.c
@@ -0,0 +1,74 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#include "schema-tok.h"
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KToken
+ */
+
+
+rc_t KTokenRCExplain ( const KToken *self, KLogLevel lvl, rc_t rc )
+{
+    if ( rc != 0 )
+    {
+        PLOGERR (lvl, ( lvl, rc, "$(file):$(lineno)", "file=%.*s,lineno=%u"
+                   , ( int ) self -> txt -> path . size, self -> txt -> path . addr
+                   , self -> lineno ));
+    }
+    return rc;
+}
+
+rc_t KTokenFailure ( const KToken *self, KLogLevel lvl, rc_t rc, const char *expected )
+{
+    if ( GetRCState ( rc ) != rcUnexpected )
+        return KTokenRCExplain ( self, lvl, rc );
+
+    PLOGMSG ( lvl, ( lvl, "$(file):$(lineno): "
+               "expected '$(expected)' but found '$(found)'",
+               "file=%.*s,lineno=%u,expected=%s,found=%.*s"
+               , ( int ) self -> txt -> path . size, self -> txt -> path . addr
+               , self -> lineno
+               , expected
+               , ( int ) self -> str . size, self -> str . addr ));
+
+    return rc;
+}
+
+rc_t KTokenExpected ( const KToken *self, KLogLevel lvl, const char *expected )
+{
+    return KTokenFailure ( self, lvl,
+        RC ( rcVDB, rcSchema, rcParsing, rcToken, rcUnexpected ), expected );
+}
diff --git a/libs/vdb/schema-tok.h b/libs/vdb/schema-tok.h
new file mode 100644
index 0000000..bdad9dd
--- /dev/null
+++ b/libs/vdb/schema-tok.h
@@ -0,0 +1,61 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_schema_tok_
+#define _h_schema_tok_
+
+#ifndef _h_klib_token_
+#include <klib/token.h>
+#endif
+
+#ifndef _h_klib_log_
+#include <klib/log.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+/*--------------------------------------------------------------------------
+ * KToken
+ *  a string with an id
+ */
+
+
+/* common error reporting
+ */
+rc_t KTokenExpected ( const KToken *self, KLogLevel lvl, const char *expected );
+rc_t KTokenFailure ( const KToken *self, KLogLevel lvl, rc_t rc, const char *expected );
+rc_t KTokenRCExplain ( const KToken *self, KLogLevel lvl, rc_t rc );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_schema_tok_ */
diff --git a/libs/vdb/schema-type.c b/libs/vdb/schema-type.c
new file mode 100644
index 0000000..9c01d89
--- /dev/null
+++ b/libs/vdb/schema-type.c
@@ -0,0 +1,2573 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "schema-expr.h"
+#include "schema-dump.h"
+#include "dbmgr-priv.h"
+
+#include <sra/types.h>
+#include <klib/symbol.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * SFormat
+ */
+
+/* Find
+ */
+SFormat *VSchemaFindFmtid ( const VSchema *self, uint32_t id )
+{
+    SFormat *fmt = VectorGet ( & self -> fmt, id );
+    while ( fmt == NULL )
+    {
+        self = self -> dad;
+        if ( self == NULL )
+            break;
+        fmt = VectorGet ( & self -> fmt, id );
+    }
+    return fmt;
+}
+
+/* Mark
+ */
+void CC SFormatClearMark ( void *item, void *ignore )
+{
+    SFormat *self = item;
+    self -> marked = false;
+}
+
+void SFormatMark ( const SFormat *cself )
+{
+    SFormat *self = ( SFormat* ) cself;
+    if ( cself != NULL && ! cself -> marked )
+    {
+        self -> marked = true;
+        SFormatMark ( self -> super );
+    }
+}
+
+
+/* Dump
+ *  dump "fmtdef", dump object
+ */
+rc_t SFormatDump ( const SFormat *self, SDumper *b )
+{
+    return FQNDump ( self != NULL ? self -> name : NULL, b );
+}
+
+bool CC SFormatDefDump ( void *item, void *data )
+{
+    SDumper *b = data;
+    const SFormat *self = ( const void* ) item;
+
+    if ( SDumperMarkedMode ( b ) && ! self -> marked )
+        return false;
+
+    if ( SDumperMode ( b ) == sdmCompact )
+    {
+        b -> rc = ( self -> super != NULL ) ?
+            SDumperPrint ( b, "fmtdef %N %N;", self -> super -> name, self -> name ):
+            SDumperPrint ( b, "fmtdef %N;", self -> name );
+    }
+    else
+    {
+        b -> rc = ( self -> super != NULL ) ?
+            SDumperPrint ( b, "fmtdef %N %N;\n", self -> super -> name, self -> name ):
+            SDumperPrint ( b, "fmtdef %N;\n", self -> name );
+    }
+
+    if ( b -> rc == 0 )
+        b -> rc = AliasDump ( self -> name, b );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+
+
+/*--------------------------------------------------------------------------
+ * SDatatype
+ */
+
+/* IntrinsicDim
+ */
+#if SLVL >= 1
+uint32_t SDatatypeIntrinsicDim ( const SDatatype *self )
+{
+    uint32_t dim = 1;
+    while ( 1 )
+    {
+        /* if type has no supertype or supertype is opaque
+           then this is the base intrinsic type */
+        const SDatatype *super = self -> super;
+        if ( super == NULL || super -> domain == 0 )
+            break;
+
+        /* accumulate the vector dimension of this type */
+        dim *= self -> dim;
+        self = super;
+    }
+
+    return dim;
+}
+
+/* Find
+ */
+SDatatype *VSchemaFindTypeid ( const VSchema *self, uint32_t id )
+{
+    SDatatype *dt = VectorGet ( & self -> dt, id );
+    while ( dt == NULL )
+    {
+        self = self -> dad;
+        if ( self == NULL )
+            break;
+        dt = VectorGet ( & self -> dt, id );
+    }
+    return dt;
+}
+
+
+/* DescribeTypedecl
+ *  produce a description of typedecl properties
+ */
+LIB_EXPORT rc_t CC VSchemaDescribeTypedecl ( const VSchema *self,
+    VTypedesc *desc, const VTypedecl *td )
+{
+    rc_t rc;
+    if ( desc == NULL )
+        rc = RC ( rcVDB, rcSchema, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcSchema, rcAccessing, rcSelf, rcNull );
+        else if ( td == NULL )
+            rc = RC ( rcVDB, rcSchema, rcAccessing, rcParam, rcNull );
+        else
+        {
+            const SDatatype *dt = VSchemaFindTypeid ( self, td -> type_id );
+            if ( dt == NULL )
+                rc = RC ( rcVDB, rcSchema, rcAccessing, rcType, rcNotFound );
+            else
+            {
+                /* initial dimension from typedecl itself */
+                desc -> intrinsic_dim = td -> dim ? td -> dim : 1;
+
+                /* domain comes from the original type */
+                desc -> domain = dt -> domain;
+
+                while ( 1 )
+                {
+                    const SDatatype *super = dt -> super;
+                    if ( super == NULL || super -> domain == 0 )
+                        break;
+
+                    /* become supertype */
+                    assert ( super != dt );
+                    desc -> intrinsic_dim *= dt -> dim;
+                    dt = super;
+                }
+
+                /* take size from intrinsic */
+                desc -> intrinsic_bits = dt -> size;
+                return 0;
+            }
+        }
+
+        memset ( desc, 0, sizeof * desc );
+    }
+    return rc;
+}
+
+
+/* DescribeTypedef - PRIVATE
+ *  a type is defined as either:
+ *
+ *     'typedef' <type> ';'
+ *  or
+ *     'typedef' <supertype> <type> '[' <dim> ']' ';'
+ */
+LIB_EXPORT rc_t CC VSchemaDescribeTypedef ( const VSchema *self,
+    VTypedef *def, uint32_t type_id )
+{
+    rc_t rc;
+    if ( def == NULL )
+        rc = RC ( rcVDB, rcSchema, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcSchema, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            const SDatatype *dt = VSchemaFindTypeid ( self, type_id );
+            if ( dt == NULL )
+                rc = RC ( rcVDB, rcSchema, rcAccessing, rcType, rcNotFound );
+            else
+            {
+                /* id of <type> */
+                def -> type_id = dt -> id;
+
+                /* check for supertype */
+                if ( dt -> super == NULL )
+                {
+                    /* null id */
+                    def -> super_id = 0;
+                    /* sizeof ( <type> ) in bits */
+                    def -> type_size = dt -> size;
+                    assert ( dt -> dim <= 1 );
+                }
+                else
+                {
+                    /* id of <supertype> */
+                    def -> super_id = dt -> super -> id;
+                    /* sizeof ( <super-type> ) in bits */
+                    def -> type_size = dt -> super -> size;
+                }
+
+                /* 'dim' from 'typedef <supertype> <type> [ dim ];' */
+                def -> dim = dt -> dim;
+
+                /* the only bit of domain information is whether the type is signed */
+                def -> sign = 0;
+                switch ( dt -> domain )
+                {
+                case vtdInt:
+                case vtdFloat:
+                    def -> sign = 1;
+                    break;
+                }
+
+                return 0;
+            }
+        }
+
+        memset ( def, 0, sizeof * def );
+    }
+
+    return rc;
+}
+
+/* Mark
+ */
+void CC SDatatypeClearMark ( void *item, void *ignore )
+{
+    SDatatype *self = item;
+    self -> marked = false;
+}
+
+void SDatatypeMark ( const SDatatype *cself )
+{
+    SDatatype *self = ( SDatatype* ) cself;
+    if ( cself != NULL && ! cself -> marked )
+    {
+        self -> marked = true;
+        SDatatypeMark ( self -> super );
+    }
+}
+
+/* Dump
+ */
+rc_t SDatatypeDump ( const SDatatype *self, SDumper *d )
+{
+    return FQNDump ( self != NULL ? self -> name : NULL, d );
+}
+
+bool CC SDatatypeDefDump ( void *item, void *data )
+{
+    SDumper *b = data;
+    const char *dimfmt;
+    const SDatatype *self = ( const void* ) item;
+
+    if ( SDumperMarkedMode ( b ) && ! self -> marked )
+        return false;
+
+    switch ( SDumperMode ( b ) )
+    {
+    case sdmCompact:
+        dimfmt = "[%u]"; break;
+    default:
+        dimfmt = " [ %u ]";
+    }
+
+    b -> rc = SDumperPrint ( b, "typedef %N %N",
+        self -> super -> name, self -> name );
+    if ( b -> rc == 0 && self -> dim > 1 )
+        b -> rc = SDumperPrint ( b, dimfmt, self -> dim );
+    if ( b -> rc == 0 )
+    {
+        if ( SDumperMode ( b ) == sdmCompact )
+            b -> rc = SDumperWrite ( b, ";", 1 );
+        else
+        {
+#if _DEBUGGING && 1
+            b -> rc = SDumperPrint ( b, "; /* size %u */\n", self -> size );
+#else
+            b -> rc = SDumperWrite ( b, ";\n", 2 );
+#endif
+        }
+    }
+
+    if ( b -> rc == 0 )
+        b -> rc = AliasDump ( self -> name, b );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+#endif
+
+/*--------------------------------------------------------------------------
+ * STypesetMbr
+ *  a typedecl that can be tested for uniqueness
+ */
+typedef struct STypesetMbr STypesetMbr;
+struct STypesetMbr
+{
+    BSTNode n;
+    VTypedecl td;
+};
+
+/* Whack
+ */
+#define STypesetMbrWhack BSTreeMbrWhack
+
+/* Cmp
+ * Sort
+ */
+static
+int64_t VTypedeclCmp ( const VTypedecl *a, const VTypedecl *b )
+{
+    if ( a -> type_id != b -> type_id )
+        return ( int64_t ) a -> type_id - ( int64_t ) b -> type_id;
+    return ( int64_t ) a -> dim - ( int64_t ) b -> dim;
+}
+
+static
+int64_t CC STypesetMbrSort ( const BSTNode *item, const BSTNode *n )
+{
+    const STypesetMbr *a = ( const STypesetMbr* ) item;
+    const STypesetMbr *b = ( const STypesetMbr* ) n;
+    return VTypedeclCmp ( & a -> td, & b -> td );
+}
+
+
+/*--------------------------------------------------------------------------
+ * VTypedecl
+ */
+
+#if SLVL >= 1
+
+/* ToText
+ *  convert a VTypedecl into canonical text
+ *
+ *  "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for
+ *  NUL terminated type declaration string
+ *
+ *  "fmtdecl" [ IN ] - binary representation of fmtdecl
+ */
+LIB_EXPORT rc_t CC VTypedeclToText ( const VTypedecl *self,
+    const VSchema *schema, char *buffer, size_t bsize )
+{
+    rc_t rc;
+
+    if ( bsize == 0 )
+        rc = RC ( rcVDB, rcType, rcConverting, rcBuffer, rcInsufficient );
+    else if ( buffer == NULL )
+        rc = RC ( rcVDB, rcType, rcConverting, rcBuffer, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcType, rcConverting, rcSelf, rcNull );
+        else if ( schema == NULL )
+            rc = RC ( rcVDB, rcType, rcConverting, rcSchema, rcNull );
+        else
+        {
+            size_t num_writ;
+            rc = VSchemaToText ( schema, buffer, bsize - 1, & num_writ, "%T", self );
+            if ( rc == 0 )
+            {
+                buffer [ num_writ ] = 0;
+                return 0;
+            }
+        }
+
+        buffer [ 0 ] = 0;
+    }
+
+    return rc;
+}
+
+
+/* ToSupertype
+ *  attempt to cast a typedecl to a size-equivalent supertype decl
+ *
+ *  "schema" [ IN ] - schema object that would know about this type
+ *
+ *  "cast" [ OUT ] - return parameter for supertype decl
+ *  valid only if function returns true.
+ *
+ *  returns true if cast succeeded
+ */
+LIB_EXPORT bool CC VTypedeclToSupertype ( const VTypedecl *self,
+    const VSchema *schema, VTypedecl *cast )
+{
+    if ( self != NULL && schema != NULL )
+    {
+        const SDatatype *dt = VSchemaFindTypeid ( schema, self -> type_id );
+        if ( dt != NULL )
+        {
+            uint32_t dim = dt -> dim;
+            dt = dt -> super;
+            if ( dt != NULL && dt -> domain != 0 )
+            {
+                if ( cast != NULL )
+                {
+                    cast -> type_id = dt -> id;
+                    cast -> dim = self -> dim * dim;
+                }
+
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+
+/* ToTypedecl
+ *  attempt to cast a typedecl to a size-equivalent ancestor decl
+ *
+ *  "schema" [ IN ] - schema object that would know about this type
+ *
+ *  "ancestor" [ IN ] - target typedecl or typeset for cast
+ *
+ *  "cast" [ OUT, NULL ] - return parameter for ancestor decl
+ *  valid only if function returns true. if "ancestor" was a typeset,
+ *  the value of "cast" will be the closest matching ancestral type.
+ *
+ *  "distance" [ OUT, NULL OKAY ] - optional linear measure of casting
+ *  generations. valid only if function returns true. a value of 0 means
+ *  that "self" is a direct match with "ancestor", a value of 1 means that
+ *  "self" is an immediate subtype of "ancestor", etc.
+ *
+ *  returns true if cast succeeded
+ */
+static
+bool VTypedecl2Typedecl ( const VTypedecl *self,
+    const VSchema *schema, const VTypedecl *ancestor,
+    VTypedecl *cast, uint32_t *distance )
+{
+    const SDatatype *src;
+    uint32_t i, type_id = self -> type_id;
+    uint32_t gramps = ancestor -> type_id;
+    uint32_t dim = self -> dim;
+
+    /* casting from "any" */
+    if ( type_id == 0 )
+    {
+        /* "any" to "any" isn't a cast... or is it? */
+        if ( gramps == 0 )
+            return false;
+
+        /* produce output */
+        if ( cast != NULL && ( const VTypedecl* ) cast != ancestor )
+            * cast = * ancestor;
+
+        /* record distance */
+        if ( distance != NULL )
+            * distance = 0;
+
+        return true;
+    }
+
+    /* casting to "any" */
+    if ( gramps == 0 )
+    {
+        /* produce output */
+        if ( cast != NULL && ( const VTypedecl* ) cast != self )
+            * cast = * self;
+
+        /* record distance */
+        if ( distance != NULL )
+            * distance = 0;
+
+        return true;
+    }
+
+    /* special case for identity */
+    if ( type_id == gramps )
+    {
+        /* detect variable dimension */
+        if ( dim == 0 )
+        {
+            dim = ancestor -> dim;
+            if ( ancestor -> dim == 0 )
+                return false;
+        }
+
+        /* if ancestor has variable dimension */
+        if ( ancestor -> dim == 0 )
+        {
+            if ( cast != NULL )
+            {
+                cast -> type_id = type_id;
+                cast -> dim = dim;
+            }
+        }
+        else
+        {
+            /* must have identical fixed dimension */
+            if ( dim != ancestor -> dim )
+                return false;
+
+            /* produce output */
+            if ( cast != NULL && ( const VTypedecl* ) cast != ancestor )
+                * cast = * ancestor;
+        }
+
+        /* record distance */
+        if ( distance != NULL )
+            * distance = 0;
+
+        return true;
+    }
+    /***** Temporary fix for duplicate types****/
+    {
+	char bufa[100];
+	char bufb[100];
+	if(   self->dim == ancestor->dim
+	   && VTypedeclToText(     self, schema, bufa, sizeof(bufa))== 0
+           && VTypedeclToText( ancestor, schema, bufb, sizeof(bufb))== 0
+           && strcmp(bufa,bufb) == 0){
+		if ( cast != NULL && ( const VTypedecl* ) cast != ancestor ) * cast = * ancestor;
+		if ( distance != NULL ) * distance = 0;
+		return true;
+        }
+    }
+	
+    /************************/
+
+    /* find type */
+    src = VSchemaFindTypeid ( schema, type_id );
+    if ( src == NULL )
+        return false;
+
+    /* cast toward gramps */
+    for ( i = 0; src -> id > gramps; ++ i )
+    {
+        dim *= src -> dim;
+        src = src -> super;
+        if ( src == NULL || src -> domain == 0 )
+            return false;
+    }
+
+    /* if not met */
+    if ( src -> id != gramps )
+        return false;
+
+    /* handle variable dimension */
+    if ( dim == 0 )
+    {
+        dim = ancestor -> dim;
+        if ( ancestor -> dim == 0 )
+            return false;
+    }
+    if ( ancestor -> dim == 0 )
+    {
+        if ( cast != NULL )
+        {
+            cast -> type_id = gramps;
+            cast -> dim = dim;
+        }
+    }
+    else
+    {
+        if ( dim != ancestor -> dim )
+            return false;
+        if ( cast != NULL && ( const VTypedecl* ) cast != ancestor )
+            * cast = * ancestor;
+    }
+
+    /* produce output */
+    if ( distance != NULL )
+        * distance = i;
+                            
+    return true;
+}
+
+static
+bool STypesetdecl2Typedecl ( const STypeset *self, uint32_t sdim,
+    const VSchema *schema,  const VTypedecl *ancestor,
+    VTypedecl *cast, uint32_t *distance )
+{
+    bool early;
+    VTypedecl btd;
+    uint32_t i, count, best;
+
+    /* ambiguous if casting to "any" */
+    if ( ancestor -> type_id == 0 )
+        return false;
+
+    /* can exit early if only testing castability */
+    early = ( cast == NULL && distance == NULL ) ? true : false;
+
+    /* walk set */
+    for ( best = ~ 0U, count = self -> count, i = 0; i < count; ++ i )
+    {
+        uint32_t dist;
+
+        /* convert set member to vector */
+        VTypedecl td = self -> td [ i ];
+        td . dim *= sdim;
+
+        /* cast to ancestor */
+        if ( VTypedecl2Typedecl ( & td, schema, ancestor, & td, & dist ) )
+        {
+            /* if only testing castability */
+            if ( early )
+                return true;
+
+            /* if match is better */
+            if ( dist < best )
+            {
+                if ( distance != NULL )
+                    * distance = dist;
+                if ( dist == 0 )
+                {
+                    if ( cast != NULL )
+                        * cast = td;
+                    return true;
+                }
+
+                btd = td;
+                best = dist;
+            }
+        }
+    }
+
+    if ( ( int32_t ) best > 0 )
+    {
+        if ( cast != NULL )
+            * cast = btd;
+        return true;
+    }
+
+    return false;
+}
+
+static
+bool VTypedecl2STypesetdecl ( const VTypedecl *self,
+    const VSchema *schema, const STypeset *dst, uint32_t ddim,
+    VTypedecl *cast, uint32_t *distance )
+{
+    const SDatatype *src;
+    uint32_t i, j, count, type_id, sdim;
+
+    /* ambiguous if casting from "any" */
+    if ( self -> type_id == 0 )
+        return false;
+
+    /* find source type */
+    src = VSchemaFindTypeid ( schema, self -> type_id );
+    if ( src == NULL )
+        return false;
+
+    /* current dimension */
+    sdim = self -> dim;
+
+    /* perform cast */
+    for ( count = dst -> count, type_id = src -> id, i = 0; ; type_id = src -> id, ++ i )
+    {
+        /* scan set for type match */
+        for ( j = 0; j < count; ++ j )
+        {
+            if ( type_id == dst -> td [ j ] . type_id )
+            {
+                /* this is a hit on type */
+                if ( sdim == dst -> td [ j ] . dim * ddim )
+                {
+                    /* best match is first match */
+                    if ( distance != NULL )
+                        * distance = i;
+                    if ( cast != NULL )
+                    {
+                        cast -> type_id = type_id;
+                        cast -> dim = sdim;
+                    }
+                    return true;
+                }
+                break;
+            }
+        }
+
+        /* did not match any of them */
+        sdim *= src -> dim;
+        src = src -> super;
+        if ( src == NULL || src -> domain == 0 )
+            break;
+    }
+
+    return false;
+}
+
+static
+bool VTypesetdeclToTypedecl ( const VTypedecl *self,
+    const VSchema *schema,  const VTypedecl *ancestor,
+    VTypedecl *cast, uint32_t *distance )
+{
+    /* find source typeset */
+    const STypeset *src = VSchemaFindTypesetid ( schema, self -> type_id );
+
+    /* not found or empty */
+    if ( src == NULL || src -> count == 0 )
+        return false;
+
+    /* if has single type */
+    if ( src -> count == 1 )
+    {
+        VTypedecl td = src -> td [ 0 ];
+        td . dim *= self -> dim;
+        return VTypedecl2Typedecl ( & td, schema, ancestor, cast, distance );
+    }
+
+    /* perform cast */
+    return STypesetdecl2Typedecl ( src, self -> dim, schema, ancestor, cast, distance );
+}
+
+static
+bool VTypedeclToTypesetdecl ( const VTypedecl *self,
+    const VSchema *schema,  const VTypedecl *ancestor,
+    VTypedecl *cast, uint32_t *distance )
+{
+    /* find ancestor typeset */
+    const STypeset *dst = VSchemaFindTypesetid ( schema, ancestor -> type_id );
+
+    /* if not found or empty */
+    if ( dst == NULL || dst -> count == 0 )
+        return false;
+
+    /* if has a single type */
+    if ( dst -> count == 1 )
+    {
+        VTypedecl td = dst -> td [ 0 ];
+        td . dim *= ancestor -> dim;
+        return VTypedecl2Typedecl ( self, schema, & td, cast, distance );
+    }
+
+    /* find best match */
+    return VTypedecl2STypesetdecl ( self, schema, dst, ancestor -> dim, cast, distance );
+}
+
+static
+bool VTypesetdeclToTypesetdecl ( const VTypedecl *self,
+    const VSchema *schema,  const VTypedecl *ancestor,
+    VTypedecl *cast, uint32_t *distance )
+{
+    bool early;
+    VTypedecl btd, td;
+    uint32_t i, count, best;
+    const STypeset * src, *dst;
+
+    /* find source typeset */
+    src = VSchemaFindTypesetid ( schema, self -> type_id );
+
+    /* not found or empty */
+    if ( src == NULL || src -> count == 0 )
+        return false;
+
+    /* find ancestor typeset */
+    dst = VSchemaFindTypesetid ( schema, ancestor -> type_id );
+
+    /* if not found or empty */
+    if ( dst == NULL || dst -> count == 0 )
+        return false;
+
+    /* if has a single type */
+    if ( src -> count == 1 )
+    {
+        td = src -> td [ 0 ];
+        td . dim *= self -> dim;
+        if ( dst -> count == 1 )
+        {
+            btd = dst -> td [ 0 ];
+            btd . dim *= ancestor -> dim;
+            return VTypedecl2Typedecl ( & td, schema, & btd, cast, distance );
+        }
+        return VTypedecl2STypesetdecl ( & td, schema, dst, ancestor -> dim, cast, distance );
+    }
+    if ( dst -> count == 1 )
+    {
+        td = dst -> td [ 0 ];
+        td . dim *= ancestor -> dim;
+        return STypesetdecl2Typedecl ( src, self -> dim, schema, & td, cast, distance );
+    }
+
+    /* can exit early if only testing castability */
+    early = ( cast == NULL && distance == NULL ) ? true : false;
+
+    /* full matrix scan */
+    for ( best = ~ 0U, count = src -> count, i = 0; i < count; ++ i )
+    {
+        uint32_t dist;
+
+        td = src -> td [ i ];
+        td . dim *= self -> dim;
+
+        if ( VTypedecl2STypesetdecl ( & td, schema, dst, ancestor -> dim, & td, & dist ) )
+        {
+            if ( early )
+                return true;
+
+            if ( dist < best )
+            {
+                if ( distance != NULL )
+                    * distance = dist;
+                if ( dist == 0 )
+                {
+                    if ( cast != NULL )
+                        * cast = td;
+                    return true;
+                }
+                btd = td;
+                best = dist;
+            }
+        }
+    }
+
+    if ( ( int32_t ) best > 0 )
+    {
+        if ( cast != NULL )
+            * cast = btd;
+        return true;
+    }
+
+    return false;
+}
+
+LIB_EXPORT bool CC VTypedeclToTypedecl ( const VTypedecl *self, const VSchema *schema,
+    const VTypedecl *ancestor, VTypedecl *cast, uint32_t *distance )
+{
+    if ( self == NULL || schema == NULL || ancestor == NULL )
+        return false;
+
+    /* source is typeset */
+    if ( self -> type_id >= 0x40000000 )
+    {
+        /* typeset => typeset */
+        if ( ancestor -> type_id >= 0x40000000 )
+            return VTypesetdeclToTypesetdecl ( self, schema, ancestor, cast, distance );
+
+        /* typeset => typedecl */
+        return VTypesetdeclToTypedecl ( self, schema, ancestor, cast, distance );
+    }
+
+    /* ancestor is typeset */
+    if ( ancestor -> type_id >= 0x40000000 )
+    {
+        /* typedecl => typeset */
+        return VTypedeclToTypesetdecl ( self, schema, ancestor, cast, distance );
+    }
+
+    /* typedecl => typedecl */
+    return VTypedecl2Typedecl ( self, schema, ancestor, cast, distance );
+}
+
+
+/* ToType
+ *  attempt to cast a typedecl to a size-equivalent ancestor decl
+ *
+ *  "schema" [ IN ] - schema object that would know about this type
+ *
+ *  "ancestor" [ IN ] - target type or typeset for cast
+ *
+ *  "cast" [ OUT ] - return parameter for ancestor decl
+ *  valid only if function returns true. if "ancestor" was a typeset,
+ *  the value of "cast" will be the closest matching ancestral type.
+ *
+ *  "distance" [ OUT, NULL OKAY ] - optional linear measure of casting
+ *  generations. valid only if function returns true. a value of 0 means
+ *  that "self" is a direct match with "ancestor", a value of 1 means that
+ *  "self" is an immediate subtype of "ancestor", etc.
+ *
+ *  returns true if cast succeeded
+ */
+static
+bool VTypedecl2Type ( const VTypedecl *self,
+    const VSchema *schema, uint32_t gramps,
+    VTypedecl *cast, uint32_t *distance )
+{
+    const SDatatype *src;
+    uint32_t i, dim, type_id = self -> type_id;
+
+    /* cannot produce a valid typedecl if self is "any" or dimension is variable */
+    if ( type_id == 0 || self -> dim == 0 )
+        return false;
+
+    /* casting to "any" or identity */
+    if ( gramps == 0 || type_id == gramps)
+    {
+        if ( cast != NULL && ( const VTypedecl* ) cast != self )
+            * cast = * self;
+        if ( distance != NULL )
+            * distance = 0;
+        return true;
+    }
+
+    /* find type */
+    src = VSchemaFindTypeid ( schema, type_id );
+    if ( src == NULL )
+        return false;
+
+    /* cast toward gramps */
+    for ( dim = self -> dim, i = 0; src -> id > gramps; ++ i )
+    {
+        dim *= src -> dim;
+        src = src -> super;
+        if ( src == NULL || src -> domain == 0 )
+            return false;
+    }
+
+    /* if not met */
+    if ( src -> id != gramps )
+        return false;
+
+    /* produce output */
+    if ( distance != NULL )
+        * distance = i;
+                            
+    if ( cast != NULL )
+    {
+        cast -> type_id = gramps;
+        cast -> dim = dim;
+    }
+
+    return true;
+}
+
+static
+bool STypesetdecl2Type ( const STypeset *self, uint32_t sdim,
+    const VSchema *schema, uint32_t gramps,
+    VTypedecl *cast, uint32_t *distance )
+{
+    bool early;
+    VTypedecl btd;
+    uint32_t i, count, best;
+
+    /* ambiguous if casting to "any" */
+    if ( gramps == 0 )
+        return false;
+
+    /* can exit early if only testing castability */
+    early = ( cast == NULL && distance == NULL ) ? true : false;
+
+    /* cast all to ancestor */
+    for ( best = ~ 0U, count = self -> count, i = 0; i < count; ++ i )
+    {
+        uint32_t dist;
+
+        VTypedecl td;
+        td = self -> td [ i ];
+        td . dim *= sdim;
+
+        if ( VTypedecl2Type ( & td, schema, gramps, & td, & dist ) )
+        {
+            /* if only testing castability */
+            if ( early )
+                return true;
+
+            /* if match is better */
+            if ( dist < best )
+            {
+                if ( distance != NULL )
+                    * distance = dist;
+                if ( dist == 0 )
+                {
+                    if ( cast != NULL )
+                        * cast = td;
+                    return true;
+                }
+                btd = td;
+                best = dist;
+            }
+        }
+    }
+
+    if ( ( int32_t ) best > 0 )
+    {
+        if ( cast != NULL )
+            * cast = btd;
+        return true;
+    }
+
+    return false;
+}
+
+static
+bool VTypesetdeclToType ( const VTypedecl *self, const VSchema *schema,
+    uint32_t gramps, VTypedecl *cast, uint32_t *distance )
+{
+    /* find source typeset */
+    const STypeset *src = VSchemaFindTypesetid ( schema, self -> type_id );
+
+    /* not found or empty */
+    if ( src == NULL || src -> count == 0 )
+        return false;
+
+    /* if has single type */
+    if ( src -> count == 1 )
+    {
+        VTypedecl td = src -> td [ 0 ];
+        td . dim *= self -> dim;
+        return VTypedecl2Type ( & td, schema, gramps, cast, distance );
+    }
+
+    /* perform cast */
+    return STypesetdecl2Type ( src, self -> dim, schema, gramps, cast, distance );
+}
+
+LIB_EXPORT bool CC VTypedeclToType ( const VTypedecl *self, const VSchema *schema,
+    uint32_t ancestor, VTypedecl *cast, uint32_t *distance )
+{
+    if ( self == NULL || schema == NULL )
+        return false;
+
+    /* if casting to typeset */
+    if ( ancestor >= 0x40000000 )
+    {
+        /* convert ancestor to VTypedecl,
+           since the operation will be identical
+           due to the fact that the typeset contents
+           will have dimension, i.e. dimensions must match */
+        VTypedecl td;
+        td . type_id = ancestor;
+        td . dim = 1;
+
+        /* typeset => typeset */
+        if ( self -> type_id >= 0x40000000 )
+            return VTypesetdeclToTypesetdecl ( self, schema, & td, cast, distance );
+
+        /* typedecl => typeset */
+        return VTypedeclToTypesetdecl ( self, schema, & td, cast, distance );
+    }
+
+    /* typeset => type */
+    if ( self -> type_id >= 0x40000000 )
+        return VTypesetdeclToType ( self, schema, ancestor, cast, distance );
+
+    /* typedecl => type */
+    return VTypedecl2Type ( self, schema, ancestor, cast, distance );
+}
+
+/* CommonAncestor
+ *  find a common ancestor between "self" and "peer"
+ *  returns distance as sum of distances from each to "ancestor"
+ */
+static
+bool VTypedeclTypedeclCmn ( const VTypedecl *self, const VSchema *schema,
+    const VTypedecl *peer, VTypedecl *ancestor, uint32_t *distance )
+{
+    const SDatatype *at, *bt;
+    uint32_t a, b, adim, bdim;
+
+    /* retrieve datatypes */
+    at = VSchemaFindTypeid ( schema, self -> type_id );
+    if ( at == NULL )
+        return false;
+
+    bt = VSchemaFindTypeid ( schema, peer -> type_id );
+    if ( bt == NULL )
+        return false;
+
+    /* walk each side toward parents */
+    for ( a = b = 0, adim = self -> dim, bdim = peer -> dim; at -> id != bt -> id; )
+    {
+        const SDatatype *dt;
+        if ( at -> id > bt -> id )
+        {
+            ++ a;
+            adim *= at -> dim;
+            dt = at = at -> super;
+        }
+        else
+        {
+            ++ b;
+            bdim *= bt -> dim;
+            dt = bt = bt -> super;
+        }
+        if ( dt == NULL || dt -> domain == 0 )
+            return false;
+    }
+
+    if ( adim == 0 )
+    {
+        if ( bdim == 0 )
+            return false;
+        adim = bdim;
+    }
+    else if ( bdim == 0 )
+    {
+        bdim = adim;
+    }
+
+    /* we have a common parent type, but dimensions must match */
+    if ( adim == bdim )
+    {
+        if ( distance != NULL )
+            * distance = a + b;
+        if ( ancestor != NULL )
+        {
+            ancestor -> type_id = at -> id;
+            ancestor -> dim = adim;
+        }
+        return true;
+    }
+
+    return false;
+}
+
+static
+bool VTypedeclSTypesetdeclCmn ( const VTypedecl *self, const VSchema *schema,
+    const STypeset *peer, uint32_t bdim, VTypedecl *ancestor, uint32_t *distance )
+{
+    bool early;
+    VTypedecl btd;
+    uint32_t i, count, best;
+
+    early = ( ancestor == NULL && distance == NULL ) ? true : false;
+
+    for ( best = ~ 0U, count = peer -> count, i = 0; i < count; ++ i )
+    {
+        uint32_t dist;
+
+        VTypedecl td = peer -> td [ i ];
+        td . dim *= bdim;
+
+        if ( VTypedeclTypedeclCmn ( self, schema, & td, & td, & dist ) )
+        {
+            if ( early )
+                return true;
+
+            if ( dist < best )
+            {
+                if ( distance != NULL )
+                    * distance = dist;
+                if ( dist == 0 )
+                {
+                    if ( ancestor != NULL )
+                        * ancestor = td;
+                    return true;
+                }
+                btd = td;
+                best = dist;
+            }
+        }
+    }
+
+    if ( ( int32_t ) best > 0 )
+    {
+        if ( ancestor != NULL )
+            * ancestor = btd;
+        return true;
+    }
+
+    return false;
+}
+
+static
+bool VTypedeclTypesetCmn ( const VTypedecl *self, const VSchema *schema,
+    const VTypedecl *peer, VTypedecl *ancestor, uint32_t *distance )
+{
+    /* find peer typeset */
+    const STypeset *ts = VSchemaFindTypesetid ( schema, peer -> type_id );
+
+    /* if not found or empty */
+    if ( ts == NULL || ts -> count == 0 )
+        return false;
+
+    /* if has a single type */
+    if ( ts -> count == 1 )
+    {
+        VTypedecl td = ts -> td [ 0 ];
+        td . dim *= peer -> dim;
+        return VTypedeclTypedeclCmn ( self, schema, & td, ancestor, distance );
+    }
+
+    /* find best match */
+    return VTypedeclSTypesetdeclCmn ( self, schema, ts, peer -> dim, ancestor, distance );
+}
+
+static
+bool VTypesetTypesetCmn ( const VTypedecl *self, const VSchema *schema,
+    const VTypedecl *peer, VTypedecl *ancestor, uint32_t *distance )
+{
+    bool early;
+    VTypedecl btd, td;
+    uint32_t i, count, best;
+    const STypeset *ats, *bts;
+
+    /* find self typeset */
+    ats = VSchemaFindTypesetid ( schema, self -> type_id );
+    if ( ats == NULL || ats -> count == 0 )
+        return false;
+
+    /* find peer typeset */
+    bts = VSchemaFindTypesetid ( schema, peer -> type_id );
+    if ( bts == NULL || bts -> count == 0 )
+        return false;
+
+    /* check for simple contents */
+    if ( ats -> count == 1 )
+    {
+        td = ats -> td [ 0 ];
+        td . dim *= self -> dim;
+        if ( bts -> count == 1 )
+        {
+            btd = bts -> td [ 0 ];
+            btd . dim *= peer -> dim;
+            return VTypedeclTypedeclCmn ( & td, schema, & btd, ancestor, distance );
+        }
+        return VTypedeclSTypesetdeclCmn ( & td, schema, bts, peer -> dim, ancestor, distance );
+    }
+    if ( bts -> count == 1 )
+    {
+        td = bts -> td [ 0 ];
+        td . dim *= peer -> dim;
+        return VTypedeclSTypesetdeclCmn ( & td, schema, ats, self -> dim, ancestor, distance );
+    }
+
+    early = ( ancestor == NULL && distance == NULL ) ? true : false;
+
+    for ( best = ~ 0U, count = ats -> count, i = 0; i < count; ++ i )
+    {
+        uint32_t dist = ~ 0;
+
+        td = ats -> td [ i ];
+        td . dim *= self -> dim;
+
+        if ( VTypedeclSTypesetdeclCmn ( & td, schema, bts, peer -> dim, & td, & dist ) )
+        {
+            if ( early )
+                return true;
+
+            if ( dist < best )
+            {
+                if ( distance != NULL )
+                    * distance = dist;
+                if ( dist == 0 )
+                {
+                    if ( ancestor != NULL )
+                        * ancestor = td;
+                    return true;
+                }
+                btd = td;
+                best = dist;
+            }
+        }
+    }
+
+    if ( ( int32_t ) best > 0 )
+    {
+        if ( ancestor != NULL )
+            * ancestor = btd;
+        return true;
+    }
+
+    return false;
+}
+
+LIB_EXPORT bool CC VTypedeclCommonAncestor ( const VTypedecl *self, const VSchema *schema,
+    const VTypedecl *peer, VTypedecl *ancestor, uint32_t *distance )
+{
+    if ( self == NULL || schema == NULL || peer == NULL )
+        return false;
+
+    /* wildcard make it hard to find common ancestor */
+    if ( self -> type_id == 0 || peer -> type_id == 0 )
+        return VTypedeclToTypedecl ( self, schema, peer, ancestor, distance );
+
+    /* rh type is typeset */
+    if ( self -> type_id >= 0x40000000 )
+    {
+        /* typeset, typeset => parent */
+        if ( peer -> type_id >= 0x40000000 )
+            return VTypesetTypesetCmn ( self, schema, peer, ancestor, distance );
+
+        /* typeset, typedecl => parent */
+        return VTypedeclTypesetCmn ( peer, schema, self, ancestor, distance );
+    }
+
+    /* typedecl, typeset => parent */
+    if ( peer -> type_id >= 0x40000000 )
+        return VTypedeclTypesetCmn ( self, schema, peer, ancestor, distance );
+
+    /* typedecl, typedecl => parent */
+    return VTypedeclTypedeclCmn ( self, schema, peer, ancestor, distance );
+}
+
+/* Dump
+ */
+rc_t VTypedeclDump ( const VTypedecl *self, SDumper *b )
+{
+    rc_t rc;
+    uint32_t type_id = self -> type_id;
+    if ( type_id < 0x40000000 )
+    {
+        const SDatatype *dt = VSchemaFindTypeid ( b -> schema, type_id );
+        rc = SDatatypeDump ( dt, b );
+        if ( rc == 0 && dt != NULL && dt -> id == 0 )
+            return 0;
+    }
+    else if ( type_id < 0x80000000 )
+    {
+        const STypeset *ts = VSchemaFindTypesetid ( b -> schema, type_id );
+        rc = STypesetDump ( ts, b );
+    }
+    else
+    {
+#if SLVL >= 3
+        const SIndirectType *id = VSchemaFindITypeid ( b -> schema, type_id );
+        rc = SIndirectTypeDump ( id, b );
+#else
+        rc = RC ( rcVDB, rcSchema, rcWriting, rcType, rcUnrecognized );
+#endif
+    }
+
+    if ( rc == 0 && self -> dim != 1 )
+    {
+        const char *fmt;
+        switch ( SDumperMode ( b ) )
+        {
+        case sdmCompact:
+            fmt = self -> dim ? "[%u]" : "[*]"; break;
+        default:
+            fmt = self -> dim ? " [ %u ]" : " [ * ]";
+        }
+        rc = SDumperPrint ( b, fmt, self -> dim );
+    }
+
+    return rc;
+}
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * VTypedesc
+ *  describes the fundamental properties of a VTypedecl
+ *  replaces the deprecated structure VTypedef
+ */
+
+/* Sizeof
+ */
+LIB_EXPORT uint32_t CC VTypedescSizeof ( const VTypedesc *self )
+{
+    if ( self == NULL )
+        return 0;
+    return self -> intrinsic_bits * self -> intrinsic_dim;
+}
+
+
+/*--------------------------------------------------------------------------
+ * VFormatdecl
+ */
+#if SLVL >= 1
+LIB_EXPORT rc_t CC VFormatdeclToText ( const VFormatdecl *self,
+    const VSchema *schema, char *buffer, size_t bsize )
+{
+    PLOGMSG ( klogWarn, ( klogWarn, "TDB: $(msg)", "msg=handle VFormatdeclToText " ));    
+    return -1;
+}
+
+/* ToFormatdecl
+ *  attempt to cast a fmtdecl to a size-equivalent ancestor decl
+ *
+ *  "schema" [ IN ] - schema object that would know about this type
+ *
+ *  "ancestor" [ IN ] - target fmtdecl or typespec for cast
+ *
+ *  "cast" [ OUT ] - return parameter for ancestor decl
+ *  valid only if function returns true. if "ancestor" contained a typeset,
+ *  the value of "cast" will be the closest matching ancestral type.
+ *
+ *  "distances" [ OUT, NULL OKAY ] - optional linear measure of independent
+ *  casting generations for format ( 0 ) and type ( 1 ). valid only if function
+ *  returns true. a value of 0 means that "self" is a direct match with "ancestor",
+ *  a value of 1 means that "self" is an immediate subtype of "ancestor", etc.
+ *
+ *  returns true if cast succeeded
+ */
+static
+bool VFormatdeclToFormatdeclInt ( const VFormatdecl *self, const VSchema *schema,
+    const VFormatdecl *ancestor, VFormatdecl *cast, uint32_t distances [ 2 ],
+    bool ( CC * td2td ) ( const VTypedecl*, const VSchema*, const VTypedecl*, VTypedecl*, uint32_t* ) )
+{
+    if ( self != NULL && schema != NULL && ancestor != NULL )
+    {
+        uint32_t i;
+        const SFormat *fmt;
+
+        /* just to handle common cases */
+        if ( distances != NULL )
+            distances [ 0 ] = distances [ 1 ] = 0;
+
+        /* no format on self */
+        if ( self -> fmt == 0 )
+        {
+            /* resulting format is ancestor's */
+            if ( cast != NULL )
+                cast -> fmt = ancestor -> fmt;
+
+            /* if no ancestor format, or if have type info, perform type cast */
+            if ( ancestor -> fmt == 0 || self -> td . type_id != 0 || ancestor -> td . type_id != 0 )
+            {
+                return ( * td2td ) ( & self -> td, schema,
+                    & ancestor -> td, & cast -> td, distances ? & distances [ 1 ] : NULL );
+            }
+
+            /* resultant type is undefined */
+            if ( cast != NULL )
+            {
+                cast -> td . type_id = 0;
+                cast -> td . dim = 1;
+            }
+
+            return true;
+        }
+
+        if ( ancestor -> fmt == 0 || ancestor -> fmt == self -> fmt )
+        {
+            /* resulting format is our own */
+            if ( cast != NULL )
+                cast -> fmt = self -> fmt;
+
+            /* if have type info, perform type cast */
+            if ( self -> td . type_id != 0 || ancestor -> td . type_id != 0 )
+            {
+                return ( * td2td ) ( & self -> td, schema,
+                    & ancestor -> td, & cast -> td, distances ? & distances [ 1 ] : NULL );
+            }
+
+            /* resultant type is undefined */
+            if ( cast != NULL )
+            {
+                cast -> td . type_id = 0;
+                cast -> td . dim = 1;
+            }
+
+            return true;
+        }
+
+        /* distinct formats involved */
+        fmt = VSchemaFindFmtid ( schema, self -> fmt );
+        for ( i = 0; fmt != NULL; ++ i, fmt = fmt -> super )
+        {
+            if ( fmt -> id == ancestor -> fmt )
+            {
+                /* successful cast to ancestor */
+                if ( cast != NULL )
+                    cast -> fmt = ancestor -> fmt;
+                if ( distances != NULL )
+                    distances [ 0 ] = i;
+
+                /* if have type info, perform type cast */
+                if ( self -> td . type_id != 0 || ancestor -> td . type_id != 0 )
+                {
+                    return ( * td2td ) ( & self -> td, schema,
+                        & ancestor -> td, & cast -> td, distances ? & distances [ 1 ] : NULL );
+                }
+
+                /* resultant type is undefined */
+                if ( cast != NULL )
+                {
+                    cast -> td . type_id = 0;
+                    cast -> td . dim = 1;
+                }
+
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+LIB_EXPORT bool CC VFormatdeclToFormatdecl ( const VFormatdecl *self,
+    const VSchema *schema, const VFormatdecl *ancestor,
+    VFormatdecl *cast, uint32_t distances [ 2 ] )
+{
+    return VFormatdeclToFormatdeclInt ( self, schema,
+        ancestor, cast, distances, VTypedeclToTypedecl );
+}
+
+
+/* CommonAncestor
+ *  find a common ancestor between "self" and "peer"
+ *  returns distance as sum of distances from each to "ancestor"
+ */
+bool VFormatdeclCommonAncestor ( const VFormatdecl *self, const VSchema *schema,
+    const VFormatdecl *peer, VFormatdecl *ancestor, uint32_t distances [ 2 ] )
+{
+    return VFormatdeclToFormatdeclInt ( self, schema,
+        peer, ancestor, distances, VTypedeclCommonAncestor );
+}
+
+
+rc_t VFormatdeclDump ( const VFormatdecl *self, SDumper *b )
+{
+    rc_t rc;
+    uint32_t fmt_id = self -> fmt;
+
+    if ( fmt_id != 0 )
+    {
+        const SFormat *fmt = VSchemaFindFmtid ( b -> schema, fmt_id );
+        rc = SFormatDump ( fmt, b );
+        if ( rc != 0 || self -> td . type_id == 0 )
+            return rc;
+
+        rc = SDumperWrite ( b, "/", 1 );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    return VTypedeclDump ( & self -> td, b );
+}
+#endif
+
+/*--------------------------------------------------------------------------
+ * STypeset
+ */
+
+static
+void CC STypesetPopulate ( BSTNode *n, void *data )
+{
+    const STypesetMbr *mbr = ( const STypesetMbr* ) n;
+    STypeset *ts = data;
+    ts -> td [ ts -> count ++ ] = mbr -> td;
+}
+
+/* Find
+ */
+STypeset *VSchemaFindTypesetid ( const VSchema *self, uint32_t id )
+{
+    STypeset *ts = VectorGet ( & self -> ts, id );
+    while ( ts == NULL )
+    {
+        self = self -> dad;
+        if ( self == NULL )
+            break;
+        ts = VectorGet ( & self -> ts, id );
+    }
+    return ts;
+}
+
+/* Mark
+ */
+void CC STypesetClearMark ( void *item, void *ignore )
+{
+    STypeset *self = item;
+    self -> marked = false;
+}
+
+void VSchemaTypeMark ( const VSchema *self, uint32_t type_id )
+{
+    const SDatatype *dt;
+    const STypeset *ts;
+
+    switch ( type_id & 0xC0000000 )
+    {
+    case 0:
+        while ( type_id < VectorStart ( & self -> dt ) )
+        {
+            self = self -> dad;
+            if ( self -> dad == NULL )
+                return;
+        }
+
+        dt = VectorGet ( & self -> dt, type_id );
+        if ( dt != NULL )
+            SDatatypeMark ( dt );
+        break;
+
+    case 0x40000000:
+        while ( type_id < VectorStart ( & self -> ts ) )
+        {
+            self = self -> dad;
+            if ( self -> dad == NULL )
+                return;
+        }
+
+        ts = VectorGet ( & self -> ts, type_id );
+        if ( ts != NULL )
+            STypesetMark ( ts, self );
+        break;
+    }
+}
+
+void STypesetMark ( const STypeset *cself, const VSchema *schema )
+{
+    STypeset *self = ( STypeset* ) cself;
+    if ( cself != NULL && ! cself -> marked )
+    {
+        uint32_t i, count = self -> count;
+        self -> marked = true;
+        for ( i = 0; i < count; ++ i )
+            VSchemaTypeMark ( schema, self -> td [ i ] . type_id );
+    }
+}
+
+/* Dump
+ */
+rc_t STypesetDump ( const STypeset *self, struct SDumper *d )
+{
+    return FQNDump ( self -> name, d );
+}
+
+#if SLVL >= 1
+bool CC STypesetDefDump ( void *item, void *data )
+{
+    int i;
+
+    SDumper *b = data;
+    const char *tsfmt, *sep, *cls;
+    const STypeset *self = ( const void* ) item;
+
+    if ( SDumperMarkedMode ( b ) && ! self -> marked )
+        return false;
+
+    switch ( SDumperMode ( b ) )
+    {
+    case sdmCompact:
+        tsfmt = "typeset %N{";
+        sep = ",";
+        cls = "};";
+        break;
+    default:
+        tsfmt = "typeset %N { ";
+        sep = ", ";
+        cls = " };\n";
+    }
+
+
+    SDumperSepString ( b, "" );
+
+    b -> rc = SDumperPrint ( b, tsfmt, self -> name );
+    for ( i = 0; b -> rc == 0 && i < ( int ) self -> count; ++ i )
+    {
+        b -> rc = SDumperSep ( b );
+        if ( b -> rc == 0 )
+            b -> rc = VTypedeclDump ( & self -> td [ i ], b );
+        SDumperSepString ( b, sep );
+    }
+    if ( b -> rc == 0 )
+        b -> rc = SDumperPrint ( b, cls );
+
+    if ( b -> rc == 0 )
+        b -> rc = AliasDump ( self -> name, b );
+
+    return ( b -> rc != 0 ) ? true : false;
+}
+#endif
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ */
+
+/*
+ * fqn                = ID [ <nested-name> ]
+ * nested-name        = ':' NAME [ <nested-name> ]
+ */
+static
+rc_t nested_name ( const KSymTable *tbl, KTokenSource *src, KToken *t, const SchemaEnv *env )
+{
+    rc_t rc;
+    KSymbol *ns = t -> sym;
+
+    /* look for colon separator */
+    if ( next_token ( tbl, src, t ) -> id != eColon )
+        return RC ( rcVDB, rcSchema, rcParsing, rcToken, rcIncomplete );
+
+    /* push namespace onto stack */
+    rc = KSymTablePushNamespace ( tbl, ns );
+    if ( rc == 0 )
+    {
+        /* look for another namespace */
+        if ( next_shallow_token ( tbl, src, t, false ) -> id == eNamespace )
+            rc = nested_name ( tbl, src, t, env );
+
+        /* pop namespace */
+        KSymTablePopNamespace ( tbl );
+    }
+
+    return rc;
+}
+
+rc_t next_fqn ( const KSymTable *tbl, KTokenSource *src, KToken *t, const SchemaEnv *env )
+{
+    rc_t rc;
+    KToken t2;
+    KTokenSource src2;
+
+    /* looking for a symbolic name */
+    if ( t -> sym == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcToken, rcUnexpected );
+
+    /* anything other than a namespace is what we want */
+    if ( t -> id != eNamespace )
+        return 0;
+
+    /* perform a lookahead */
+    t2 = * t;
+    src2 = * src;
+
+    /* requires ':' following namespace */
+    rc = nested_name ( tbl, & src2, & t2, env );
+    if ( rc == 0 )
+    {
+        KSymbol *ns;
+        uint32_t scope;
+
+        /* recognized patern (NS:)+TOKEN
+           check that TOKEN is a defined symbol within NS */
+        if ( t2 . sym != NULL )
+        {
+            * t = t2;
+            * src = src2;
+            return 0;
+        }
+
+        /* before returning an error, look harder.
+           extended VSchema can create symtab entries
+           for namespaces that opaque the parent schema */
+        for ( scope = 0, ns = t -> sym; ns != NULL; )
+        {
+            /* find a deeper symbol */
+            ns = KSymTableFindNext ( tbl, ns, & scope );
+            if ( ns != NULL && ns -> type == eNamespace )
+            {
+                t2 = * t;
+                src2 = * src;
+                t2 . sym = ns;
+                rc = nested_name ( tbl, & src2, & t2, env );
+                if ( rc != 0 )
+                    return rc;
+                if ( t2 . sym != NULL )
+                {
+                    * t = t2;
+                    * src = src2;
+                    return 0;
+                }
+            }
+        }
+
+        /* could not find anything */
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcToken, rcIncomplete );
+    }
+    return rc;
+}
+
+static
+rc_t create_fqn_sym ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, uint32_t id, const void *obj )
+{
+    KToken t2;
+    KTokenSource src2 = * src;
+
+    /* need to peek at next token */
+    if ( KTokenizerNext ( kDefaultTokenizer, & src2, & t2 ) -> id == eColon )
+    {
+        /* and again to find ident or name */
+        KTokenizerNext ( kDefaultTokenizer, & src2, & t2 );
+
+        /* allow reserved word "view" to be used in schemas <= 1.0 */
+        if ( t2 . id == kw_view && ! env -> has_view_keyword )
+            t2 . id = eIdent;
+
+        if ( t2 . id == eIdent || t2 . id == eName )
+        {
+            /* create a namespace and go in */
+            KSymbol *ns;
+            rc_t rc = KSymTableCreateNamespace ( tbl, & ns, & t -> str );
+            if ( rc == 0 )
+            {
+                rc = KSymTablePushNamespace ( tbl, ns );
+                if ( rc == 0 )
+                {
+                    /* accept ':' NS */
+                    * t = t2;
+                    * src = src2;
+
+                    /* recurse */
+                    rc = create_fqn_sym ( tbl, src, t, env, id, obj );
+
+                    /* exit namespace */
+                    KSymTablePopNamespace ( tbl );
+                }
+            }
+
+            /* always return */
+            return rc;
+        }
+    }
+
+    /* contents of "t" are a proper symbol */
+    assert ( t -> id == eIdent || t -> id == eName );
+    return KSymTableCreateSymbol ( tbl, & t -> sym, & t -> str, id, obj );
+}
+
+static
+rc_t enter_namespace ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, uint32_t id, const void *obj )
+{
+    KSymbol *ns = t -> sym;
+    rc_t rc = KSymTablePushNamespace ( tbl, ns );
+    if ( rc == 0 )
+    {
+        if ( next_token ( tbl, src, t ) -> id != eColon )
+            rc = KTokenExpected ( t, klogErr, ":" );
+        else switch ( next_shallow_token ( tbl, src, t, false ) -> id )
+        {
+        case eNamespace:
+            rc = enter_namespace ( tbl, src, t, env, id, obj );
+            break;
+        case eIdent:
+        case eName:
+            rc = create_fqn_sym ( tbl, src, t, env, id, obj );
+            break;
+        case kw_view:
+            if ( ! env -> has_view_keyword )
+            {
+                rc = create_fqn_sym ( tbl, src, t, env, id, obj );
+                break;
+            }
+            /* no break */
+        default:
+            if ( t -> id == id )
+                rc = SILENT_RC ( rcVDB, rcSchema, rcParsing, rcToken, rcExists );
+            else
+                rc = RC ( rcVDB, rcSchema, rcParsing, rcToken, rcUnexpected );
+        }
+
+        KSymTablePopNamespace ( tbl );
+    }
+    return rc;
+}
+
+rc_t create_fqn ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, uint32_t id, const void *obj )
+{
+    switch ( t -> id )
+    {
+    case eNamespace:
+        return enter_namespace ( tbl, src, t, env, id, obj );
+    case eIdent:
+        return create_fqn_sym ( tbl, src, t, env, id, obj );
+    default:
+        if ( t -> id == id )
+            return SILENT_RC ( rcVDB, rcSchema, rcParsing, rcToken, rcExists );
+    }
+
+    return RC ( rcVDB, rcSchema, rcParsing, rcToken, rcUnexpected );
+}
+
+
+/*
+ * dim                = '[' <uint-expr> ']'
+ */
+#if SLVL >= 1
+rc_t dim ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, uint32_t *dim, bool required )
+{
+    rc_t rc;
+
+    if ( ! required && t -> id != eLeftSquare )
+    {
+        * dim = 1;
+        return 0;
+    }
+
+    /* consume '[' */
+    rc = expect ( tbl, src, t, eLeftSquare, "[", true );
+    if ( rc == 0 )
+    {
+        /* assume manifest constant */
+        rc = KTokenToU32 ( t, dim );
+
+        /* otherwise, assume some sort of symbolic expression */
+        if ( rc != 0 )
+        {
+            const SExpression *x;
+            rc = const_expr ( tbl, src, t, env, self, & x );
+            if ( rc == 0 )
+            {
+                Vector dummy;
+                VectorInit ( & dummy, 1, 16 );
+
+                /* should have evaluated to a constant expression */
+                rc = eval_uint_expr ( self, x, dim, & dummy );
+                SExpressionWhack ( x );
+
+                VectorWhack ( & dummy, NULL, NULL );
+            }
+            if ( rc != 0 )
+                return rc;
+        }
+    }
+
+    /* close brackets */
+    return expect ( tbl, src, next_token ( tbl, src, t ), eRightSquare, "]", true );
+}
+
+
+/*
+ * typename           = <fqn>
+ */
+rc_t typename ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, uint32_t *id )
+{
+    const SDatatype *dt;
+    const SIndirectType *tp;
+
+    /* consume fully qualified name */
+    rc_t rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return rc;
+
+    /* the name must be defined as a data type */
+    switch ( t -> id )
+    {
+    case eDatatype:
+        dt = t -> sym -> u. obj;
+        * id = dt -> id;
+        break;
+    case eSchemaType:
+        tp = t -> sym -> u. obj;
+        * id = tp -> id;
+        break;
+    default:
+        return RC ( rcVDB, rcSchema, rcParsing, rcToken, rcUnexpected );
+    }
+
+    return 0;
+}
+
+
+/*
+ * typedecl           = <typename> [ <dim> ]
+ */
+rc_t typedecl ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, VTypedecl *td )
+{
+    rc_t rc = typename ( tbl, src, t, env, & td -> type_id );
+    if ( rc != 0 )
+        return rc;
+
+    next_token ( tbl, src, t );
+    return dim ( tbl, src, t, env, self, & td -> dim, false );
+}
+
+
+/*
+ * typeset            = <fqn>
+ */
+rc_t typeset ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+   const SchemaEnv *env, uint32_t *id )
+{
+    const STypeset *ts;
+
+    /* consume fully qualified name */
+    rc_t rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return rc;
+
+    /* the name must be defined as a typeset */
+    if ( t -> id != eTypeset )
+        return RC ( rcVDB, rcSchema, rcParsing, rcToken, rcUnexpected );
+
+    /* retrieve the runtime type id */
+    assert ( t -> sym != NULL );
+    ts = t -> sym -> u . obj;
+    * id = ts -> id;
+
+    return 0;
+}
+
+/*
+ * typespec           = <typedecl>
+ *                    | <typeset> [ <dim> ]
+ */
+rc_t typespec ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, VTypedecl *td )
+{
+    const STypeset *ts;
+    const SDatatype *dt;
+    const SIndirectType *tp;
+
+    /* get a typename or typeset */
+    rc_t rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return rc;
+
+    switch ( t -> id )
+    {
+    case eDatatype:
+        dt = t -> sym -> u. obj;
+        td -> type_id = dt -> id;
+        break;
+    case eSchemaType:
+        tp = t -> sym -> u. obj;
+        td -> type_id = tp -> id;
+        break;
+    case eTypeset:
+        ts = t -> sym -> u. obj;
+        td -> type_id = ts -> id;
+        break;
+    default:
+        return RC ( rcVDB, rcSchema, rcParsing, rcToken, rcUnexpected );
+    }
+
+    next_token ( tbl, src, t );
+    return dim ( tbl, src, t, env, self, & td -> dim, false );
+}
+#endif
+
+
+/*
+ * fmtname            = <fqn>
+ */
+rc_t fmtname ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, uint32_t *id )
+{
+    const SFormat *fmt;
+
+    /* consume fully qualified name */
+    rc_t rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return rc;
+
+    /* the name must be defined as a format */
+    if ( t -> id != eFormat )
+        return RC ( rcVDB, rcSchema, rcParsing, rcToken, rcUnexpected );
+
+    /* retrieve the runtime fmt id */
+    assert ( t -> sym != NULL );
+    fmt = t -> sym -> u . obj;
+    * id = fmt -> id;
+
+    return 0;
+}
+
+/*
+ * fmtdecl            = <fmtname> [ '/' <typedecl> ]
+ *                    | <typedecl>
+ */
+#if SLVL >= 1
+rc_t fmtdecl ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, VFormatdecl *fd )
+{
+    const SDatatype *dt;
+    const SIndirectType *tp;
+
+    /* get a fmtname or typename */
+    rc_t rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return rc;
+
+    /* look first for fmtname */
+    if ( t -> id == eFormat )
+    {
+        const SFormat *fmt = t -> sym -> u . obj;
+        fd -> fmt = fmt -> id;
+
+        /* unless followed by '/', this is a simple format declaration */
+        if ( next_token ( tbl, src, t ) -> id != eFwdSlash )
+        {
+            fd -> td . type_id = 0;
+            fd -> td . dim = 0;
+            return 0;
+        }
+
+        /* expect a typename */
+        rc = next_fqn ( tbl, src, next_token ( tbl, src, t ), env );
+        if ( rc != 0 )
+            return rc;
+    }
+    else
+    {
+        fd -> fmt = 0;
+    }
+
+    switch ( t -> id )
+    {
+    case eDatatype:
+        dt = t -> sym -> u. obj;
+        fd -> td . type_id = dt -> id;
+        break;
+    case eSchemaType:
+        tp = t -> sym -> u. obj;
+        fd -> td . type_id = tp -> id;
+        break;
+    default:
+        return RC ( rcVDB, rcSchema, rcParsing, rcToken, rcUnexpected );
+    }
+
+    next_token ( tbl, src, t );
+    return dim ( tbl, src, t, env, self, & fd -> td . dim, false );
+}
+
+/*
+ * fmtspec            = <typespec>
+ *                    | <fmtname> [ '/' <typedecl> ]
+ */
+rc_t fmtspec ( const KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, const VSchema *self, VFormatdecl *fd )
+{
+    const SFormat *fmt;
+    const STypeset *ts;
+    const SDatatype *dt;
+    const SIndirectType *tp;
+
+    /* get a fmtname, typename or typeset */
+    rc_t rc = next_fqn ( tbl, src, t, env );
+    if ( rc != 0 )
+        return rc;
+
+    fd -> fmt = 0;
+    switch ( t -> id )
+    {
+    case eDatatype:
+        dt = t -> sym -> u. obj;
+        fd -> td . type_id = dt -> id;
+        break;
+    case eSchemaType:
+        tp = t -> sym -> u. obj;
+        fd -> td . type_id = tp -> id;
+        break;
+    case eTypeset:
+        ts = t -> sym -> u. obj;
+        fd -> td . type_id = ts -> id;
+        break;
+    case eFormat:
+        fmt = t -> sym -> u . obj;
+        fd -> fmt = fmt -> id;
+
+        /* unless followed by '/', this is a simple format declaration */
+        if ( next_token ( tbl, src, t ) -> id != eFwdSlash )
+        {
+            fd -> td . type_id = 0;
+            fd -> td . dim = 0;
+            return 0;
+        }
+        return typedecl ( tbl, src, t, env, self, & fd -> td );
+
+    default:
+        return RC ( rcVDB, rcSchema, rcParsing, rcToken, rcUnexpected );
+    }
+
+    next_token ( tbl, src, t );
+    return dim ( tbl, src, t, env, self, & fd -> td . dim, false );
+}
+#endif
+
+
+/*
+ * type-definition    = 'typedef' <typename> <typedef-list>
+ * typedef-list       = <typedef-decl> [ ',' <typedef-list> ]
+ * typedef-decl       = <fqn> [ <dim> ]
+ */
+#if SLVL >= 1
+rc_t type_definition ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    VTypedecl td;
+    uint32_t super_size;
+    const SDatatype *super;
+
+    /* expect a typename */
+    rc_t rc = typename ( tbl, src, t, env, & td . type_id );
+    if ( rc != 0 )
+        return KTokenFailure ( t, klogErr, rc, "type name" );
+    if ( td . type_id == 0 )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcType, rcIncorrect );
+        return KTokenFailure ( t, klogErr, rc, "illegal base type" );
+    }
+
+    /* capture supertype */
+    assert ( t -> sym != NULL );
+    assert ( t -> sym -> type == eDatatype );
+    super = t -> sym -> u . obj;
+
+    /* get supertype size */
+    super_size = super -> size;
+
+    do
+    {
+        KSymbol *sym;
+        SDatatype *dt;
+
+        /* expect a fully qualified name */
+        rc = create_fqn ( tbl, src, next_token ( tbl, src, t ), env, eDatatype, NULL );
+        if ( rc == 0 )
+        {
+            /* remember symbol */
+            sym = t -> sym;
+
+            /* get dimension */
+            next_token ( tbl, src, t );
+            rc = dim ( tbl, src, t, env, self, & td . dim, false );
+            if ( rc != 0 )
+                return KTokenFailure ( t, klogErr, rc, "vector dimension" );
+
+            /* allocate a datatype */
+            dt = malloc ( sizeof * dt );
+            if ( dt == NULL )
+            {
+                rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+                return KTokenRCExplain ( t, klogInt, rc );
+            }
+
+            /* fill it out from super-type */
+            dt -> super = super;
+            dt -> byte_swap = super -> byte_swap;
+            dt -> name = sym;
+            dt -> size = super_size * td . dim;
+            dt -> dim = td . dim;
+            dt -> domain = super -> domain;
+
+            /* insert into type vector */
+            rc = VectorAppend ( & self -> dt, & dt -> id, dt );
+            if ( rc != 0 )
+            {
+                free ( dt );
+                return KTokenRCExplain ( t, klogInt, rc );
+            }
+
+            /* connect symbol */
+            sym -> u . obj = dt;
+        }
+
+        /* allow a benign redefine */
+        else if ( GetRCState ( rc ) != rcExists )
+            return KTokenFailure ( t, klogErr, rc, "fully qualified name" );
+        else
+        {
+            /* remember this already defined name */
+            sym = t -> sym;
+            assert ( sym != NULL && sym -> type == eDatatype );
+
+            /* look for a dimension */
+            next_token ( tbl, src, t );
+            rc = dim ( tbl, src, t, env, self, & td . dim, false );
+            if ( rc != 0 )
+                return KTokenFailure ( t, klogErr, rc, "vector dimension" );
+
+            /* peek at existing definition */
+            dt = ( SDatatype* ) sym -> u . obj;
+            if ( dt -> super != super || dt -> dim != td . dim )
+            {
+                rc = RC ( rcVDB, rcSchema, rcParsing, rcToken, rcExists );
+                return KTokenRCExplain ( t, klogErr, rc );
+            }
+        }
+    }
+    while ( t -> id == eComma );
+
+    return expect ( tbl, src, t, eSemiColon, ";", true );
+}
+#endif
+
+
+/*
+ * format-definition  = 'fmtdef' [ <fmtname> ] <fqn>
+ * fmtname            = <fqn>
+ */
+rc_t format_definition ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    KSymbol *sym;
+    SFormat *fmt;
+    const SFormat *super;
+
+    /* start with the assumption that the name needs to be created */
+    rc_t rc = create_fqn ( tbl, src, t, env, eFormat, NULL );
+    if ( rc == 0 )
+    {
+        super = NULL;
+        sym = t -> sym;
+        next_token ( tbl, src, t );
+    }
+    else if ( GetRCState ( rc ) != rcExists )
+        return KTokenFailure ( t, klogErr, rc, "fully qualified name" );
+    else
+    {
+        /* could be a superfmt or could be a redefine */
+        sym = t -> sym;
+        if ( next_token ( tbl, src, t ) -> id != eIdent && t -> sym == NULL )
+        {
+            /* we will assume it was a redefine of a simple format */
+            return expect ( tbl, src, t, eSemiColon, "fully qualified name or ;", true );
+        }
+
+        /* has a superfmt */
+        super = sym -> u . obj;
+
+        /* do it again */
+        rc = create_fqn ( tbl, src, t, env, eFormat, NULL );
+        if ( rc != 0 )
+        {
+            /* may have been a redefine of a path-based format */
+            if ( GetRCState ( rc ) != rcExists )
+                return KTokenFailure ( t, klogErr, rc, "fully qualified name" );
+
+            return expect ( tbl, src, next_token ( tbl, src, t ),
+                eSemiColon, "fully qualified name or ;", true );
+        }
+
+        sym = t -> sym;
+        next_token ( tbl, src, t );
+    }
+
+    /* create a format */
+    fmt = malloc ( sizeof * fmt );
+    if ( fmt == NULL )
+    {
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    /* superfmt */
+    fmt -> super = super;
+
+    /* link to name */
+    fmt -> name = sym;
+
+    /* insert into vector */
+    rc = VectorAppend ( & self -> fmt, & fmt -> id, fmt );
+    if ( rc != 0 )
+    {
+        free ( fmt );
+        return KTokenRCExplain ( t, klogInt, rc );
+    }
+
+    /* link symbol to fmt */
+    sym -> u . obj = fmt;
+
+    return expect ( tbl, src, t, eSemiColon, ";", true );
+}
+
+
+/*
+ * typeset-definition = 'typeset' <typeset> '{' <typespec-list> '}'
+ * typespec-list      = <typespec> [ ',' <typespec-list> ]
+ */
+#if SLVL >= 1
+rc_t typeset_definition ( KSymTable *tbl, KTokenSource *src, KToken *t,
+    const SchemaEnv *env, VSchema *self )
+{
+    BSTree tree;
+    KSymbol *sym;
+    bool existing;
+    uint32_t i, count;
+
+    rc_t rc = create_fqn ( tbl, src, t, env, eTypeset, NULL );
+    if ( rc == 0 )
+    {
+        sym = t -> sym;
+        existing = false;
+    }
+    else if ( GetRCState ( rc ) != rcExists )
+        return KTokenFailure ( t, klogErr, rc, "fully qualified name" );
+    else
+    {
+        sym = t -> sym;
+        existing = true;
+    }
+
+    if ( next_token ( tbl, src, t ) -> id != eLeftCurly )
+        return KTokenExpected ( t, klogErr, "{" );
+
+    BSTreeInit ( & tree );
+    count = 0;
+
+    do
+    {
+        STypesetMbr *mbr, *exist;
+
+        /* read typepec */
+        VTypedecl td;
+        next_token ( tbl, src, t );
+        rc = typespec ( tbl, src, t, env, self, & td );
+        if ( rc != 0 )
+        {
+            KTokenFailure ( t, klogErr, rc, "type name, format name or typeset name" );
+            break;
+        }
+
+        /* if we got a typedecl, add it */
+        if ( td . type_id < 0x40000000 )
+        {
+            mbr = malloc ( sizeof * mbr );
+            if ( mbr == NULL )
+            {
+                rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+                KTokenRCExplain ( t, klogInt, rc );
+                break;
+            }
+
+            mbr -> td = td;
+
+            /* ignore/allow duplicates */
+            if ( BSTreeInsertUnique ( & tree, & mbr -> n,
+                 ( BSTNode** ) & exist, STypesetMbrSort ) != 0 )
+            {
+                free ( mbr );
+            }
+            else
+            {
+                ++ count;
+            }
+        }
+
+        /* got a typeset - add each of its members */
+        else
+        {
+            const STypeset *ts;
+            const VSchema *s = self;
+
+            do
+            {
+                ts = VectorGet ( & s -> ts, td . type_id );
+                if ( ts != NULL )
+                    break;
+                s = s -> dad;
+            }
+            while ( s != NULL );
+            assert ( ts != NULL );
+
+            for ( i = 0; i < ts -> count; ++ i )
+            {
+                mbr = malloc ( sizeof * mbr );
+                if ( mbr == NULL )
+                {
+                    rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+                    KTokenRCExplain ( t, klogInt, rc );
+                    break;
+                }
+
+                mbr -> td = ts -> td [ i ];
+
+                /* ignore/allow duplicates */
+                if ( BSTreeInsertUnique ( & tree, & mbr -> n,
+                     ( BSTNode** ) & exist, STypesetMbrSort ) != 0 )
+                {
+                    free ( mbr );
+                }
+                else
+                {
+                    ++ count;
+                }
+            }
+
+            if ( rc != 0 )
+                break;
+        }
+    }
+    while ( t -> id == eComma );
+
+    if ( rc != 0 )
+    {
+        BSTreeWhack ( & tree, BSTreeMbrWhack, NULL );
+        return rc;
+    }
+
+    if ( t -> id != eRightCurly )
+        rc = KTokenExpected ( t, klogErr, "}" );
+    else
+    {
+        /* we have a typeset */
+        STypeset *ts = malloc ( sizeof * ts - sizeof ts -> td + count * sizeof ts -> td [ 0 ] );
+        if ( ts == NULL )
+            rc = RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+        else
+        {
+            /* initialize */
+            ts -> name = sym;
+            ts -> count = 0;
+
+            /* copy fmtdecls */
+            BSTreeForEach ( & tree, false, STypesetPopulate, ts );
+            assert ( ts -> count == count );
+
+            /* have a new one */
+            if ( ! existing )
+            {
+                /* enter it into list */
+                sym -> u . obj = ts;
+                rc = VectorAppend ( & self -> ts, & ts -> id, ts );
+                if ( rc != 0 )
+                {
+                    free ( ts );
+                    KTokenRCExplain ( t, klogInt, rc );
+                }
+            }
+
+            /* allow benign redefine */
+            else
+            {
+                const STypeset *orig = sym -> u . obj;
+                if ( orig -> count != count )
+                {
+                    rc = RC ( rcVDB, rcSchema, rcParsing, rcToken, rcExists );
+                    KTokenRCExplain ( t, klogErr, rc );
+                }
+                else for ( i = 0; i < count; ++ i )
+                {
+                    if ( VTypedeclCmp ( & orig -> td [ i ], & ts -> td [ i ] ) != 0 )
+                    {
+                        rc = RC ( rcVDB, rcSchema, rcParsing, rcToken, rcExists );
+                        KTokenRCExplain ( t, klogErr, rc );
+                        break;
+                    }
+                }
+
+                free ( ts );
+            }
+        }
+    }
+
+    BSTreeWhack ( & tree, BSTreeMbrWhack, NULL );
+
+    if ( rc == 0 )
+        rc = expect ( tbl, src, next_token ( tbl, src, t ), eSemiColon, ";", false );
+
+    return rc;
+}
+#endif
diff --git a/libs/vdb/schema.c b/libs/vdb/schema.c
new file mode 100644
index 0000000..0a18484
--- /dev/null
+++ b/libs/vdb/schema.c
@@ -0,0 +1,1768 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+
+#include "va_copy.h"
+
+#define KONST const
+#include "dbmgr-priv.h"
+#undef KONST
+
+#include "schema-priv.h"
+#include "schema-tok.h"
+#include "schema-parse.h"
+
+#include <kdb/meta.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/namelist.h>
+#include <klib/data-buffer.h>
+#include <klib/printf.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KDirectory
+ */
+static
+void CC KDirRefRelease ( void *item, void *ignore )
+{
+    KDirectoryRelease ( ( const void* ) item );
+}
+
+/*--------------------------------------------------------------------------
+ * generic
+ */
+
+void CC VectMbrWhack ( void *item, void *ignore )
+{
+    free ( item );
+}
+
+void CC BSTreeMbrWhack ( BSTNode *n, void *ignore )
+{
+    free ( n );
+}
+
+/*--------------------------------------------------------------------------
+ * KSymbol
+ */
+rc_t KSymbolCopy ( BSTree *scope, KSymbol **cp, const KSymbol *orig )
+{
+    rc_t rc;
+    KSymbol *copy, *dad = NULL;
+
+    /* recursively copy namespaces */
+    if ( orig -> dad != NULL )
+    {
+        rc = KSymbolCopy ( scope, cp, orig -> dad );
+        if ( rc != 0 )
+            return rc;
+
+        /* copied dad becomes scope */
+        dad = * cp;
+        scope = & dad -> u . scope;
+    }
+
+#if COPY_SHARE_TEXT
+    /* create simple copy with no new space for text */
+    copy = malloc ( sizeof * copy );
+#else
+    copy = malloc ( sizeof (*copy) + orig->name.size + 1 );
+#endif
+    if ( copy == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    /* copy original, including pointer to string */
+    * copy = * orig;
+
+#if ! COPY_SHARE_TEXT
+
+    /* copy original including string */
+    string_copy ( ( char* ) ( copy + 1 ), orig -> name . size + 1,
+        orig -> name . addr, orig -> name . size );
+
+    /* fix up pointer to string */
+    copy -> name . addr = ( const char* ) ( copy + 1 );
+#endif
+    copy -> dad = dad;
+
+    /* if we just created a namespace, forget its children */
+    if ( copy -> type == eNamespace )
+    {
+        BSTreeInit ( & copy -> u . scope );
+        rc = BSTreeInsertUnique ( scope, & copy -> n, ( BSTNode** ) cp, KSymbolSort );
+        if ( rc != 0 )
+        {
+            free ( copy );
+            copy = * cp;
+            if ( copy -> type == eNamespace )
+                rc = 0;
+            else
+                copy = NULL;
+        }
+    }
+    else
+    {
+        rc = BSTreeInsertUnique ( scope, & copy -> n, ( BSTNode** ) cp, KSymbolSort );
+        if ( rc != 0 )
+        {
+            free ( copy );
+            copy = NULL;
+        }
+    }
+
+/*     if (*cp != copy) */
+/*      fprintf(stderr,"%p\t%30s %30.*s\tmalloc\t%d\n", (void*)copy,  */
+/*              __func__,(int)copy->name.size,copy->name.addr, copy->type); */
+
+    * cp = copy;
+    return rc;
+}
+
+bool CC KSymbolCopyScope ( BSTNode *n, void *scope )
+{
+    const KSymbol *sym = ( const KSymbol* ) n;
+
+    /* perform a deep copy of leaf symbols */
+    if ( sym -> type != eNamespace )
+    {
+        KSymbol *ignore;
+        rc_t rc = KSymbolCopy ( scope, & ignore, sym );
+        return ( rc != 0 ) ? true : false;
+    }
+
+    /* traverse namespaces to find leaves */
+    return BSTreeDoUntil ( & sym -> u . scope, false, KSymbolCopyScope, scope );
+}
+
+#if _DEBUGGING
+static
+void CC KSymbolList ( BSTNode *item, void *data )
+{
+    const KSymbol *self = ( const KSymbol* ) item;
+    const char *indent = ( const char* ) data;
+
+    OUTMSG (( "%s%.*s = %#p"
+             , indent
+             , ( int ) self -> name . size, self -> name . addr
+             , self
+        ));
+
+    if ( self -> type != eNamespace )
+        putchar ( '\n' );
+    else
+    {
+        printf ( " ( namespace ):\n" );
+        if ( indent [ -1 ] != '.' )
+            -- indent;
+
+        BSTreeForEach ( & self -> u . scope, false, KSymbolList, ( void* ) indent );
+    }
+}
+
+static
+void CC BSTreeListSymbols ( const BSTree *self, const char *indent )
+{
+    OUTMSG (( "%sscope = %#p\n"
+             , indent
+             , self
+        ));
+
+    if ( indent [ -1 ] != '.' )
+        -- indent;
+
+    BSTreeForEach ( self, false, KSymbolList, ( void* ) indent );
+}
+#endif
+
+
+
+/* ExamineContents
+ *  not much to be done here
+ */
+#if EXAMINE_SCHEMA_CONTENTS >= 1
+bool CC KSymbolExamineContents ( BSTNode *n, void *data )
+{
+    rc_t *rc = data;
+    const KSymbol *sym = ( const KSymbol* ) n;
+
+    /* can test heuristic that name is NULL-terminated,
+       that name size and length are identical */
+
+    /* can test that symbol type is a valid id type */
+    return false;
+}
+#endif
+
+
+
+
+/*--------------------------------------------------------------------------
+ * KMDataNode
+ */
+
+/* FillSchema
+ *  a schema buffer fill function that reads from KMDataNode
+ */
+rc_t CC KMDataNodeFillSchema ( void *data, KTokenText *tt, size_t save )
+{
+    rc_t rc;
+    size_t num_read;
+    KMDataNodeSchemaFillData *pb = data;
+
+     /* on very first fill, check for specifying v0 */
+    if ( pb -> add_v0 )
+    {
+        assert ( save == 0 );
+        CONST_STRING ( & tt -> str, "version 0;" );
+        pb -> add_v0 = false;
+        return 0;
+    }
+
+   /* save any characters not yet consumed */
+    if ( save != 0 )
+    {
+        assert ( save < sizeof pb -> buff );
+        memmove ( pb -> buff,
+            & tt -> str . addr [ tt -> str . size - save ], save );
+    }
+
+    /* read as many characters as are available */
+    rc = KMDataNodeRead ( pb -> node, pb -> pos,
+        & pb -> buff [ save ], sizeof pb -> buff - save, & num_read, NULL );
+    if ( rc == 0 )
+    {
+	/******** PROTECT FROM BUGS IN TOKENIZER ****/
+	if(num_read == sizeof (pb -> buff) - save){ /** not the last chunk ***/
+		int i;
+		for(i=num_read+save-1;i > save && (isalnum(pb -> buff[i]) || pb -> buff[i]=='_');i--){}
+		if(i > save && pb -> buff[i]=='.'){ /*** leave this physical column for the next buffer **/
+			num_read=i-save;
+		}
+	}
+	/********************************************/
+        /* reset the buffer in "tt" */
+        tt -> str . addr = pb -> buff;
+        tt -> str . size = save + num_read;
+        tt -> str . len = string_len ( pb -> buff, save + num_read );
+        pb -> pos += num_read;
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * SNameOverload
+ */
+
+/* Whack
+ */
+void CC SNameOverloadWhack ( void *item, void *ignore )
+{
+    SNameOverload *self = item;
+    VectorWhack ( & self -> items, NULL, NULL );
+    free ( self );
+}
+
+/* Make
+ */
+rc_t SNameOverloadMake ( SNameOverload **np,
+    const KSymbol *sym, uint32_t start, uint32_t len )
+{
+    SNameOverload *name = malloc ( sizeof * name );
+    if ( name == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+
+    name -> name = sym;
+    ( ( KSymbol* ) sym ) -> u . obj = name;
+    VectorInit ( & name -> items, start, len );
+    name -> cid . ctx = 0;
+
+    * np = name;
+    return 0;
+}
+
+/* Copy
+ */
+rc_t SNameOverloadCopy ( BSTree *scope,
+    SNameOverload **cp, const SNameOverload *orig )
+{
+    KSymbol *sym;
+    rc_t rc = KSymbolCopy ( scope, & sym, orig -> name );
+    if ( rc == 0 )
+    {
+        SNameOverload *copy;
+        rc = SNameOverloadMake ( & copy, sym, 0, 0 );
+        if ( rc == 0 )
+        {
+            /* copy contents */
+            rc = VectorCopy ( & orig -> items, & copy -> items );
+            if ( rc == 0 )
+            {
+                copy -> cid = orig -> cid;
+                * cp = copy;
+                return 0;
+            }
+
+            SNameOverloadWhack ( copy, NULL );
+        }
+
+        BSTreeUnlink ( scope, & sym -> n );
+        KSymbolWhack ( & sym -> n, NULL );
+    }
+
+    * cp = NULL;
+    return rc;
+}
+
+typedef struct SNameOverloadCopyData SNameOverloadCopyData;
+struct SNameOverloadCopyData
+{
+    BSTree *scope;
+    Vector *dest;
+    rc_t rc;
+};
+
+static
+bool CC SNameOverloadVectorCopyItem ( void *item, void *data )
+{
+    SNameOverloadCopyData *pb = data;
+
+    SNameOverload *copy;
+    pb -> rc = SNameOverloadCopy ( pb -> scope, & copy, ( const void* ) item );
+    if ( pb -> rc == 0 )
+        pb -> rc = VectorAppend ( pb -> dest, & copy -> cid . id, copy );
+
+    return ( pb -> rc != 0 ) ? true : false;
+}
+
+rc_t SNameOverloadVectorCopy ( BSTree *scope, const Vector *src, Vector *dest )
+{
+    SNameOverloadCopyData pb;
+    pb . scope = scope;
+    pb . dest = dest;
+    pb . rc = 0;
+
+    if ( VectorDoUntil ( src, false, SNameOverloadVectorCopyItem, & pb ) )
+        return pb . rc;
+
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * VIncludedPath
+ */
+typedef struct VIncludedPath VIncludedPath;
+struct VIncludedPath
+{
+    BSTNode n;
+    uint32_t ord;
+    char path [ 1 ];
+};
+
+/* Cmp
+ * Sort
+ */
+static
+int64_t CC VIncludedPathCmp ( const void *item, const BSTNode *n )
+{
+    const char *a = item;
+    const VIncludedPath *b = ( const VIncludedPath* ) n;
+    return strcmp ( a, b -> path );
+}
+
+static
+int64_t CC VIncludedPathSort ( const BSTNode *item, const BSTNode *n )
+{
+    const VIncludedPath *a = ( const VIncludedPath* ) item;
+    const VIncludedPath *b = ( const VIncludedPath* ) n;
+    return strcmp ( a -> path, b -> path );
+}
+
+static
+int64_t CC VIncludedPathSortByOrder ( const BSTNode *item, const BSTNode *n )
+{
+    const VIncludedPath *a = ( const VIncludedPath* ) item;
+    const VIncludedPath *b = ( const VIncludedPath* ) n;
+    return ( int64_t ) a -> ord - ( int64_t ) b -> ord;
+}
+
+/* Make
+ */
+static
+rc_t CC VIncludedPathMake ( BSTree *paths, uint32_t *count, const char *path )
+{
+    VIncludedPath *p = malloc ( sizeof * p + strlen ( path ) );
+    if ( p == NULL )
+        return RC ( rcVDB, rcSchema, rcParsing, rcMemory, rcExhausted );
+    p -> ord = ( * count ) ++;
+    strcpy ( p -> path, path );
+    BSTreeInsert ( paths, & p -> n, VIncludedPathSort );
+    return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ *  a symbol scope
+ *  data types, blob formats, function and sub-schema declarations
+ *  database and table declarations
+ */
+
+
+#if _DEBUGGING
+/* Listing
+ *  list symbol tables
+ */
+void VSchemaListSymtab ( const VSchema *self )
+{
+    if ( self != NULL )
+    {
+        const char *indent = ".                ";
+        VSchemaListSymtab ( self -> dad );
+        BSTreeListSymbols ( & self -> scope, & indent [ 17 ] );
+        putchar ( '\n' );
+    }
+}
+#endif
+
+
+/* Marking
+ */
+void VSchemaClearMark ( const VSchema *self )
+{
+    if ( self == NULL )
+        return;
+
+    VectorForEach ( & self -> fmt, false, SFormatClearMark, NULL );
+    VectorForEach ( & self -> dt, false, SDatatypeClearMark, NULL );
+    VectorForEach ( & self -> ts, false, STypesetClearMark, NULL );
+    VectorForEach ( & self -> cnst, false, SConstantClearMark, NULL );
+    VectorForEach ( & self -> func, false, SFunctionClearMark, NULL );
+    VectorForEach ( & self -> phys, false, SPhysicalClearMark, NULL );
+    VectorForEach ( & self -> tbl, false, STableClearMark, NULL );
+    VectorForEach ( & self -> db, false, SDatabaseClearMark, NULL );
+
+    if ( self -> dad != NULL )
+        VSchemaClearMark ( self -> dad );
+}
+
+
+/* Destroy
+ */
+static
+void CC VSchemaDestroy ( VSchema *self )
+{
+    REFMSG ( "VSchema", "destroy", & self -> refcount );
+    
+    BSTreeWhack ( & self -> scope, KSymbolWhack, NULL );
+    BSTreeWhack ( & self -> paths, BSTreeMbrWhack, NULL );
+    VectorWhack ( & self -> inc, KDirRefRelease, NULL );
+    VectorWhack ( & self -> alias, NULL, NULL );
+    VectorWhack ( & self -> fmt, SFormatWhack, NULL );
+#if SLVL >= 1
+    VectorWhack ( & self -> dt, SDatatypeWhack, NULL );
+    VectorWhack ( & self -> ts, STypesetWhack, NULL );
+#endif
+#if SLVL >= 3
+    VectorWhack ( & self -> pt, SIndirectTypeWhack, NULL );
+#endif
+#if SLVL >= 2
+    VectorWhack ( & self -> cnst, SConstantWhack, NULL );
+#endif
+#if SLVL >= 3
+    VectorWhack ( & self -> func, SFunctionWhack, NULL );
+    VectorWhack ( & self -> fname, SNameOverloadWhack, NULL );
+#endif
+#if SLVL >= 5
+    VectorWhack ( & self -> phys, SPhysicalWhack, NULL );
+    VectorWhack ( & self -> pname, SNameOverloadWhack, NULL );
+#endif
+#if SLVL >= 6
+    VectorWhack ( & self -> tbl, STableWhack, NULL );
+    VectorWhack ( & self -> tname, SNameOverloadWhack, NULL );
+
+    VectorWhack ( & self -> db, SDatabaseWhack, NULL );
+    VectorWhack ( & self -> dname, SNameOverloadWhack, NULL );
+#endif
+
+    free ( self );
+}
+
+/* Whack
+ */
+static
+rc_t CC VSchemaWhack ( VSchema *self )
+{
+    KRefcountWhack ( & self -> refcount, "VSchema" );
+
+    VSchemaSever ( self -> dad );
+    VSchemaDestroy ( self );
+
+    return 0;
+}
+
+
+/* AddRef
+ * Release
+ *  all objects are reference counted
+ *  NULL references are ignored
+ */
+LIB_EXPORT rc_t CC VSchemaAddRef ( const VSchema *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "VSchema" ) )
+        {
+        case krefLimit:
+            return RC ( rcVDB, rcMgr, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VSchemaRelease ( const VSchema *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "VSchema" ) )
+        {
+        case krefWhack:
+            return VSchemaWhack ( ( VSchema* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcMgr, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Attach
+ * Sever
+ */
+VSchema *VSchemaAttach ( const VSchema *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "VSchema" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( VSchema* ) self;
+}
+
+rc_t VSchemaSever ( const VSchema *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "VSchema" ) )
+        {
+        case krefWhack:
+            return VSchemaWhack ( ( VSchema* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcMgr, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* StartIdx
+ *  returns starting index
+ */
+#define VSchemaStartIdx( dad, vect, starting ) \
+    ( ( ( dad ) == NULL ) ? ( starting ) : \
+      ( VectorStart ( & ( dad ) -> vect ) + \
+        VectorLength ( & ( dad ) -> vect ) ) )
+
+/* VectorInit
+ *  performs vector initialization
+ */
+#define VSchemaVectorInit( schema, dad, vect, starting, block ) \
+    VectorInit ( & ( schema ) -> vect, VSchemaStartIdx ( dad, vect, starting ), block )
+
+
+/* MakeSchema
+ *  make an empty schema
+ */
+rc_t VSchemaMake ( VSchema **sp,  const VSchema *dad )
+{
+    VSchema *schema = malloc ( sizeof * schema );
+    if ( schema == NULL )
+        return RC ( rcVDB, rcMgr, rcConstructing, rcMemory, rcExhausted );
+
+    schema -> dad = VSchemaAttach ( dad );
+    BSTreeInit ( & schema -> scope );
+    BSTreeInit ( & schema -> paths );
+
+    /* datatypes, typesets and parameterized types all shared
+       the same type_id space from 0..0xFFFFFFFF. each is
+       assigned a range to avoid overlap:
+
+       datatypes = 0..0x3FFFFFFF
+       typesets = 0x40000000..0x7FFFFFFF
+       undefined parameterized type = 0x80000000
+       parameterized types = 0x80000001..0xFFFFFFFF
+    */
+    VSchemaVectorInit ( schema, dad, inc, 0, 4 );
+    VSchemaVectorInit ( schema, dad, alias, 0, 16 );
+    VSchemaVectorInit ( schema, dad, fmt, 1, 16 );
+    VSchemaVectorInit ( schema, dad, dt, 0, 128 );
+    VSchemaVectorInit ( schema, dad, ts, 0x40000000, 16 );
+    VSchemaVectorInit ( schema, dad, pt, 0x80000001, 32 );
+
+    VSchemaVectorInit ( schema, dad, cnst, 0, 32 );
+    VSchemaVectorInit ( schema, dad, func, 0, 64 );
+    VSchemaVectorInit ( schema, dad, phys, 0, 32 );
+    VSchemaVectorInit ( schema, dad, tbl, 0, 16 );
+    VSchemaVectorInit ( schema, dad, db, 0, 4 );
+
+    VectorInit ( & schema -> fname, 0, 64 );
+    VectorInit ( & schema -> pname, 0, 32 );
+    VectorInit ( & schema -> tname, 0, 16 );
+    VectorInit ( & schema -> dname, 0, 4 );
+
+    KRefcountInit ( & schema -> refcount, 1, "VSchema", "make", "vschema" );
+    schema -> file_count = 0;
+    schema -> num_indirect = ( dad == NULL ) ? 0 : dad -> num_indirect;
+
+    /* copy the versioned name vectors and names */
+    if ( dad != NULL )
+    {
+        rc_t rc = SNameOverloadVectorCopy ( & schema -> scope, & dad -> fname, & schema -> fname );
+        if ( rc == 0 )
+            rc = SNameOverloadVectorCopy ( & schema -> scope, & dad -> pname, & schema -> pname );
+        if ( rc == 0 )
+            rc = SNameOverloadVectorCopy ( & schema -> scope, & dad -> tname, & schema -> tname );
+        if ( rc == 0 )
+            rc = SNameOverloadVectorCopy ( & schema -> scope, & dad -> dname, & schema -> dname );
+        if ( rc != 0 )
+        {
+            VSchemaWhack ( schema );
+            * sp = NULL;
+            return rc;
+        }
+    }
+    
+    * sp = schema;
+    return 0;
+}
+
+
+/* AddIncludePath
+ *  add an include path to schema for locating input files
+ */
+LIB_EXPORT rc_t CC VSchemaVAddIncludePath ( VSchema *self, const char *path, va_list args )
+{
+    KDirectory *wd;
+    rc_t rc = KDirectoryNativeDir ( & wd );
+    if ( rc == 0 )
+    {
+        const KDirectory *dir;
+        rc = KDirectoryVOpenDirRead ( wd, & dir, false, path, args );
+        if ( rc == 0 )
+        {
+            rc = VectorAppend ( & self -> inc, NULL, dir );
+            if ( rc != 0 )
+                KDirectoryRelease ( dir );
+        }
+
+        KDirectoryRelease ( wd );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaAddIncludePath ( VSchema *self, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = VSchemaVAddIncludePath ( self, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* ParseText
+ *  parse schema text
+ *  add productions to existing schema
+ *
+ *  "name" [ IN, NULL OKAY ] - optional name
+ *  representing text, e.g. filename
+ *
+ *  "text" [ IN ] and "bytes" [ IN ] - input buffer of text
+ */
+static
+rc_t CC VSchemaParseTextInt ( VSchema *self,
+    const char *name, const char *text, size_t bytes )
+{
+    KTokenText tt;
+    KTokenSource src;
+    String str, path;
+    rc_t rc;
+    
+    if ( name == NULL || name [ 0 ] == 0 )
+        CONST_STRING ( & path, "<unnamed>" );
+    else
+        StringInitCString ( & path, name );
+
+    StringInit ( & str, text, bytes, string_len ( text, bytes ) );
+    KTokenTextInit ( & tt, & str, & path );
+    KTokenSourceInit ( & src, & tt );
+
+    rc = schema ( & src, self );
+    
+    if (rc == 0)
+        PARSE_DEBUG( ("Parsed schema from %s\n", name) );
+    else
+        PARSE_DEBUG( ("Failed to parse schema from %s\n", name) );
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaParseText ( VSchema *self, const char *name,
+    const char *text, size_t bytes )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcSelf, rcNull );
+    else if ( bytes == 0 )
+        rc = 0;
+    else if ( text == NULL )
+        rc = RC ( rcVDB, rcSchema, rcParsing, rcParam, rcNull );
+    else
+        rc = VSchemaParseTextInt ( self, name, text, bytes );
+
+    return rc;
+}
+
+
+/* ParseTextCallback
+ *  parse schema text
+ *  add productions to existing schema
+ *
+ *  "name" [ IN, NULL OKAY ] - optional name
+ *  representing text, e.g. filename
+ *
+ *  "fill" [ IN ] and "data" [ IN, OPAQUE ] - for filling buffer
+ */
+rc_t VSchemaParseTextCallback ( VSchema *self, const char *name,
+    rc_t ( CC * fill ) ( void *self, KTokenText *tt, size_t save ), void *data )
+{
+    KTokenText tt;
+    KTokenSource src;
+
+    KTokenTextInitCString ( & tt, "", name );
+    tt . read = fill;
+    tt . data = data;
+
+    KTokenSourceInit ( & src, & tt );
+
+    return schema ( & src, self );
+}
+
+
+/* OpenFile
+ *  opens a file, using include paths
+ */
+static
+rc_t CC VSchemaTryOpenFile ( const VSchema *self, const KDirectory *dir, const KFile **fp,
+    char *path, size_t path_max, const char *name, va_list args )
+{
+    rc_t rc;
+    va_list cpy_args;
+
+    va_copy ( cpy_args, args );
+    rc = KDirectoryVResolvePath ( dir, true, path, path_max, name, cpy_args );
+    va_end ( cpy_args );
+
+    if ( rc == 0 )
+    {
+        /* try to find file in already opened list */
+        if ( BSTreeFind ( & self -> paths, path, VIncludedPathCmp ) != NULL )
+        {
+            * fp = NULL;
+            return 0;
+        }
+    }
+
+    if ( rc == 0 )
+        rc = KDirectoryOpenFileRead ( dir, fp, "%s", path );
+
+    return rc;
+}
+
+static
+rc_t CC VSchemaOpenFile ( const VSchema *self, const KFile **fp,
+    char *path, size_t path_max, const char *name, va_list args )
+{
+    const VSchema *schema;
+    for ( schema = self; schema != NULL; schema = schema -> dad )
+    {
+        uint32_t i, end;
+
+        for ( i = VectorStart ( & schema -> inc ), end = i + VectorLength ( & schema -> inc );
+              i < end; ++ i )
+        {
+            const KDirectory *dir = ( const KDirectory* ) VectorGet ( & schema -> inc, i );
+            if ( dir != NULL )
+            {
+                rc_t rc = VSchemaTryOpenFile ( self, dir, fp, path, path_max, name, args );
+                if ( rc == 0 || GetRCState ( rc ) != rcNotFound )
+                    return rc;
+            }
+        }
+    }
+
+    return RC ( rcVDB, rcSchema, rcOpening, rcPath, rcNotFound );
+}
+
+/* ParseFile
+ *  parse schema file
+ *  add productions to existing schema
+ *
+ *  "name" [ IN ] - filename, absolute or valid relative to
+ *  working directory or within an include path
+ */
+LIB_EXPORT rc_t CC VSchemaVParseFile ( VSchema *self, const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcSchema, rcOpening, rcSelf, rcNull );
+    else if ( name == NULL )
+        rc = RC ( rcVDB, rcSchema, rcOpening, rcPath, rcNull );
+    else if ( name [ 0 ] == 0 )
+        rc = RC ( rcVDB, rcSchema, rcOpening, rcPath, rcEmpty );
+    else
+    {
+        const KFile *f;
+        char path [ 4096 ];
+
+        /* open file using include paths */
+        rc = VSchemaOpenFile ( self, & f, path, sizeof path, name, args );
+
+        /* try to open the file according to current directory */
+        if ( rc != 0 )
+        {
+            KDirectory *wd;
+            rc = KDirectoryNativeDir ( & wd );
+            if ( rc == 0 )
+            {
+                rc = VSchemaTryOpenFile ( self, wd, & f, path, sizeof path, name, args );
+                KDirectoryRelease ( wd );
+            }
+        }
+
+        /* if the file was opened... */
+        if ( rc == 0 && f != NULL )
+        {
+            const KMMap *mm;
+            rc = KMMapMakeRead ( & mm, f );
+            if ( rc == 0 )
+            {
+                size_t size;
+                const void *addr;
+                rc = KMMapAddrRead ( mm, & addr );
+                if ( rc == 0 )
+                    rc = KMMapSize ( mm, & size );
+                if ( rc == 0 )
+                {
+                    rc = VIncludedPathMake ( & self -> paths, & self -> file_count, path );
+                    if ( rc == 0 )
+                        rc = VSchemaParseTextInt ( self, path, addr, size );
+                }
+            
+                KMMapRelease ( mm );
+            }
+        
+            KFileRelease ( f );
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaParseFile ( VSchema *self, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VSchemaVParseFile ( self, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* ResolveFmtdecl
+ *  converts a fmtdecl string to fmt id, type id and vector dimension
+ *
+ *  "resolved" [ OUT ] - resolved fmtdecl
+ *
+ *  "fmtdecl" [ IN ] - type declaration
+ */
+rc_t CC VSchemaVResolveFmtdecl ( const VSchema *self,
+    VFormatdecl *resolved, const char *decl, va_list args )
+{
+    rc_t rc;
+
+    if ( resolved == NULL )
+        rc = RC ( rcVDB, rcSchema, rcResolving, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcSchema, rcResolving, rcSelf, rcNull );
+        else if ( decl == NULL )
+            rc = RC ( rcVDB, rcSchema, rcResolving, rcType, rcNull );
+        else if ( decl [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcSchema, rcResolving, rcType, rcEmpty );
+        else
+        {
+            char buffer [ 256 ];
+            int len = vsnprintf ( buffer, sizeof buffer, decl, args );
+            if ( len < 0 || len >= sizeof buffer )
+                rc = RC ( rcVDB, rcSchema, rcResolving, rcType, rcExcessive );
+            else
+            {
+                KSymTable tbl;
+                rc = init_symtab ( & tbl, self );
+                if ( rc == 0 )
+                {
+                    KToken t;
+                    KTokenText tt;
+                    KTokenSource src;
+                    String text, path;
+
+                    SchemaEnv env;
+                    SchemaEnvInit ( & env, EXT_SCHEMA_LANG_VERSION );
+
+                    StringInit ( & text, buffer, len, string_len ( buffer, len ) );
+                    CONST_STRING ( & path, "VSchemaResolve" );
+                    KTokenTextInit ( & tt, & text, & path );
+                    KTokenSourceInit ( & src, & tt );
+
+                    rc = fmtspec ( & tbl, & src, next_token ( & tbl, & src, & t ),
+                        & env, self, resolved );
+
+                    KSymTableWhack ( & tbl );
+
+                    if ( rc == 0 )
+                        return 0;
+                }
+            }
+        }
+
+        resolved -> td . type_id = 0;
+        resolved -> td . dim = 0;
+        resolved -> fmt = 0;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaResolveFmtdecl ( const VSchema *self,
+    VFormatdecl *resolved, const char *fmtdecl, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, fmtdecl );
+    rc = VSchemaVResolveFmtdecl ( self, resolved, fmtdecl, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* ResolveTypespec
+ *  converts a typespec string to fmt id, type id and vector dimension
+ *
+ *  "resolved" [ OUT ] - resolved fmtdecl
+ *
+ *  "typespec" [ IN ] - type specification
+ */
+LIB_EXPORT rc_t CC VSchemaVResolveTypespec ( const VSchema *self,
+    VTypedecl *resolved, const char *decl, va_list args )
+{
+    rc_t rc;
+
+    if ( resolved == NULL )
+        rc = RC ( rcVDB, rcSchema, rcResolving, rcParam, rcNull );
+    else
+    {
+        VFormatdecl fd;
+        rc = VSchemaVResolveFmtdecl ( self, & fd, decl, args );
+        if ( rc == 0 )
+        {
+            if ( fd . fmt != 0 )
+                rc = RC ( rcVDB, rcSchema, rcResolving, rcType, rcIncorrect );
+            else
+            {
+                * resolved = fd . td;
+                return 0;
+            }
+        }
+
+        resolved -> type_id = 0;
+        resolved -> dim = 0;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaResolveTypespec ( const VSchema *self,
+    VTypedecl *resolved, const char *typespec, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, typespec );
+    rc = VSchemaVResolveTypespec ( self, resolved, typespec, args );
+    va_end ( args );
+
+    return rc;
+}
+
+/* ResolveTypedecl
+ *  converts a typedecl string to type id and vector dimension
+ *
+ *  "resolved" [ OUT ] - resolved type declaration
+ *
+ *  "typedecl" [ IN ] - type declaration
+ */
+LIB_EXPORT rc_t CC VSchemaVResolveTypedecl ( const VSchema *self,
+    VTypedecl *resolved, const char *decl, va_list args )
+{
+    rc_t rc = VSchemaVResolveTypespec ( self, resolved, decl, args );
+    if ( rc == 0 )
+    {
+        if ( ( resolved -> type_id & 0xC0000000 ) == 0 )
+            return 0;
+
+        rc = RC ( rcVDB, rcSchema, rcResolving, rcType, rcIncorrect );
+        
+        resolved -> type_id = 0;
+        resolved -> dim = 0;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaResolveTypedecl ( const VSchema *self,
+    VTypedecl *resolved, const char *typedecl, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, typedecl );
+    rc = VSchemaVResolveTypedecl ( self, resolved, typedecl, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* IncludeFiles
+ *  generates a list of paths to include file
+ */
+static
+bool CC VIncludedPathList ( BSTNode *n, void *list )
+{
+    const VIncludedPath *p = ( const VIncludedPath* ) n;
+    rc_t rc = VNamelistAppend ( list, p -> path );
+    return ( rc != 0 ) ? true : false;
+}
+
+LIB_EXPORT rc_t CC VSchemaIncludeFiles ( const VSchema *self, const KNamelist **listp )
+{
+    rc_t rc;
+    if ( listp == NULL )
+        rc = RC ( rcVDB, rcSchema, rcListing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcSchema, rcListing, rcSelf, rcNull );
+        else
+        {
+            /* create namelist */
+            VNamelist *list;
+            rc = VNamelistMake ( & list, self -> file_count );
+            if ( rc == 0 )
+            {
+                /* create a shallow copy */
+                BSTree paths = self -> paths;
+
+                /* sort by order rather than by path */
+                BSTreeResort ( & paths, VIncludedPathSortByOrder );
+
+                /* add paths to list */
+                if ( BSTreeDoUntil ( & paths, false, VIncludedPathList, list ) )
+                    rc = RC ( rcVDB, rcSchema, rcListing, rcMemory, rcExhausted );
+
+                /* restore path order */
+                BSTreeResort ( & paths, VIncludedPathSort );
+                assert ( paths . root == self -> paths . root );
+
+                /* cast list, creating a new reference */
+                if ( rc == 0 )
+                    rc = VNamelistToNamelist ( list, (KNamelist **)listp );
+
+                /* discard original reference */
+                VNamelistRelease ( list );
+
+                /* return list */
+                if ( rc == 0 )
+                    return 0;
+            }
+        }
+
+        * listp = NULL;
+    }
+    return rc;
+}
+
+
+/* ListLegacyTables - PRIVATE
+ *  scan all tables defined in schema
+ *  return the fully-qualified and versioned name of each legacy SRA table
+ */
+typedef struct STableFindData STableFindData;
+struct STableFindData
+{
+    VNamelist *list;
+    rc_t rc;
+};
+
+static
+bool CC STableTestUntyped ( void *item, void *data )
+{
+    const STable *stbl = ( const void* ) item;
+    STableFindData *pb = data;
+
+    if ( stbl -> untyped != NULL )
+    {
+        char buffer [ 1024 ];
+
+        /* found a legacy table */
+        pb -> rc = string_printf ( buffer, sizeof buffer, NULL, "%N#%V", stbl -> name, stbl -> version );
+        if ( pb -> rc != 0 )
+        {
+            pb -> rc = RC ( rcVDB, rcSchema, rcListing, rcName, rcExcessive );
+            return true;
+        }
+
+        /* add it to the vector */
+        pb -> rc = VNamelistAppend ( pb -> list, buffer );
+        if ( pb -> rc != 0 )
+            return true;
+    }
+
+    return false;
+}
+
+static
+bool VSchemaFindUntyped ( const VSchema *self, STableFindData *pb )
+{
+    if ( self -> dad )
+    {
+        if ( VSchemaFindUntyped ( self -> dad, pb ) )
+            return true;
+    }
+
+    return VectorDoUntil ( & self -> tbl, false, STableTestUntyped, pb );
+}
+
+LIB_EXPORT rc_t CC VSchemaListLegacyTables ( const VSchema *self, KNamelist **listp )
+{
+    rc_t rc;
+
+    if ( listp == NULL )
+        rc = RC ( rcVDB, rcSchema, rcListing, rcParam, rcNull );
+    else
+    {
+        * listp = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcSchema, rcListing, rcSelf, rcNull );
+        else
+        {
+            STableFindData pb;
+            rc = VNamelistMake ( & pb . list, 16 );
+            if ( rc == 0 )
+            {
+                pb . rc = 0;
+                if ( VSchemaFindUntyped ( self, & pb ) )
+                    rc = pb . rc;
+                else
+                    rc = VNamelistToNamelist ( pb . list, listp );
+                    
+                VNamelistRelease ( pb . list );
+            }
+        }
+    }
+
+    return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * VDBManager
+ */
+
+LIB_EXPORT rc_t CC VDBManagerMakeSchema ( const VDBManager *self, VSchema **schema )
+{
+    rc_t rc;
+    if ( schema == NULL )
+        rc = RC ( rcVDB, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcConstructing, rcSelf, rcNull );
+        else
+        {
+            rc = VSchemaMake ( schema, self -> schema );
+            if ( rc == 0 )
+                return rc;
+        }
+
+        * schema = NULL;
+    }
+
+    return rc;
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * VSchemaRuntimeTable
+ *  an object that represents a table ( or sub-table ) created at runtime
+ *  that can be used to create a VTable object
+ */
+struct VSchemaRuntimeTable
+{
+    VSchema *schema;
+    KDataBuffer text;
+    size_t bytes;
+};
+
+
+/* Print
+ *  print schema text into buffer
+ */
+static
+rc_t VSchemaRuntimeTablePrint ( VSchemaRuntimeTable *self, const char *fmt, ... )
+{
+    int status;
+    va_list args;
+
+    char *buffer;
+    size_t bsize;
+
+    /* make sure there's a bunch of room */
+    if ( self -> text . elem_count - self -> bytes < 4096 )
+    {
+        rc_t rc = KDataBufferResize ( & self -> text, self -> text . elem_count + 4096 );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* the output buffer for this print */
+    buffer = self -> text . base;
+    bsize = self -> text . elem_count - self -> bytes;
+
+    va_start ( args, fmt );
+    status = vsnprintf ( & buffer [ self -> bytes ], bsize, fmt, args );
+    va_end ( args );
+
+    if ( status < 0 || status >= bsize )
+        return RC ( rcVDB, rcSchema, rcConstructing, rcParam, rcExcessive );
+
+    self -> bytes += status;
+    return 0;
+}
+
+
+/* Make
+ *  make a table in the schema provided
+ *
+ *  "tbl" [ OUT ] - return parameter for new schema table object
+ *
+ *  "typename" [ IN ] - NUL terminated string giving desired typename of table
+ *   may include version spec
+ *
+ *  "supertype_spec" [ IN, NULL OKAY ] - optional supertype spec, giving
+ *   either a single super-table type string or multiple comma-separated tables
+ */
+LIB_EXPORT rc_t CC VSchemaMakeRuntimeTable ( VSchema *self,
+    VSchemaRuntimeTable **tblp, const char *typename, const char *supertype_spec )
+{
+    rc_t rc;
+
+    if ( tblp == NULL )
+        rc = RC ( rcVDB, rcSchema, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcSchema, rcConstructing, rcSelf, rcNull );
+        else if ( typename == NULL )
+            rc = RC ( rcVDB, rcSchema, rcConstructing, rcType, rcNull );
+        else if ( typename [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcSchema, rcConstructing, rcType, rcEmpty );
+        else
+        {
+            VSchemaRuntimeTable *tbl = malloc ( sizeof * tbl );
+            if ( tbl == NULL )
+                rc = RC ( rcVDB, rcSchema, rcConstructing, rcMemory, rcExhausted );
+            else
+            {
+                rc = KDataBufferMakeBytes ( & tbl -> text, 4096 * 2 );
+                if ( rc == 0 )
+                {
+                    rc = VSchemaAddRef ( self );
+                    if ( rc == 0 )
+                    {
+                        const char *dflt_vers = "";
+                        if ( strchr ( typename, '#' ) == NULL )
+                            dflt_vers = "#1.0";
+
+                        tbl -> schema = self;
+                        tbl -> bytes = 0;
+
+                        /* open the table */
+                        rc = VSchemaRuntimeTablePrint ( tbl, "table %s%s", typename, dflt_vers );
+                        if ( rc == 0 )
+                        {
+                            if ( supertype_spec != NULL && supertype_spec [ 0 ] != 0 )
+                                rc = VSchemaRuntimeTablePrint ( tbl, " = %s", supertype_spec );
+                            if ( rc == 0 )
+                            {
+                                rc = VSchemaRuntimeTablePrint ( tbl, "\n{\n" );
+                                if ( rc == 0 )
+                                {
+                                    * tblp = tbl;
+                                    return 0;
+                                }
+                            }
+                        }
+
+                        VSchemaRelease ( tbl -> schema );
+                    }
+
+                    KDataBufferWhack ( & tbl -> text );
+                }
+
+                free ( tbl );
+            }
+        }
+
+        * tblp = NULL;
+    }
+
+    return rc;
+}
+
+/* Close
+ *  close the schema table handle
+ *  discards any uncomitted data
+ */
+LIB_EXPORT rc_t CC VSchemaRuntimeTableClose ( VSchemaRuntimeTable *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcSchema, rcClosing, rcSelf, rcNull );
+    else
+    {
+        rc = VSchemaRelease ( self -> schema );
+        if ( rc == 0 )
+        {
+            KDataBufferWhack ( & self -> text );
+            free ( self );
+        }
+    }
+
+    return rc;
+}
+
+
+/* Commit
+ *  commits table data
+ *  closes object to further modification
+ */
+LIB_EXPORT rc_t CC VSchemaRuntimeTableCommit ( VSchemaRuntimeTable *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcSchema, rcCommitting, rcSelf, rcNull );
+    else
+    {
+        const char *data = self -> text . base;
+        if ( self -> bytes == 0 )
+            rc = RC ( rcVDB, rcSchema, rcCommitting, rcSelf, rcEmpty );
+        else
+        {
+            rc = VSchemaRuntimeTablePrint ( self, "}\n" );
+            if ( rc == 0 )
+                rc = VSchemaParseText ( self -> schema, "runtime-table", data, self -> bytes );
+            KDataBufferWhack ( & self -> text );
+        }
+    }
+
+    return rc;
+}
+
+
+/* AddColumn
+ *  add a simple column to the table
+ *
+ *  "td" [ IN ] - data type of column, obtained from schema object
+ *
+ *  "encoding" [ IN, NULL OKAY ] - optional compression/encoding type
+ *  specified as a NUL-terminated string
+ *
+ *  "name" [ IN ] - NUL-terminated simple ASCII name
+ *   conforming to column name requirements
+ */
+LIB_EXPORT rc_t CC VSchemaRuntimeTableVAddColumn ( VSchemaRuntimeTable *self, 
+    const VTypedecl *td, const char *encoding, const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcSelf, rcNull );
+    else if ( td == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcType, rcNull );
+    else if ( name == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcNull );
+    else if ( name [ 0 ] == 0 )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcEmpty );
+    else
+    {
+        char typedecl [ 256 ];
+        rc = VTypedeclToText ( td, self -> schema, typedecl, sizeof typedecl );
+        if ( rc == 0 )
+        {
+            rc = VSchemaRuntimeTablePrint ( self, "    extern column " );
+            if ( rc == 0 )
+            {
+                if ( encoding != NULL && encoding [ 0 ] != 0 )
+                    rc = VSchemaRuntimeTablePrint ( self, "%s ", encoding );
+                else
+                    rc = VSchemaRuntimeTablePrint ( self, "%s ", typedecl );
+            }
+            if ( rc == 0 )
+                rc = VSchemaRuntimeTablePrint ( self, name, args );
+            if ( rc == 0 )
+                rc = VSchemaRuntimeTablePrint ( self, ";\n" );
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaRuntimeTableAddColumn ( VSchemaRuntimeTable *self, 
+    const VTypedecl *td, const char *encoding, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VSchemaRuntimeTableVAddColumn ( self, td, encoding, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* AddTypedColumn
+ *  Gerber versions of AddColumn
+ *
+ *  AddBooleanColumn - simple boolean column with default compression
+ *                     provides both packed ( single bit ) and byte versions
+ *  AddIntegerColumn - sized integer column with appropriate sign, size and compression
+ *  AddFloatColumn   - sized floating point column with lossy compression
+ *  AddAsciiColumn   - 8-bit ASCII text column with standard compression
+ *  AddUnicodeColumn - UTF8, UTF16, or UTF32 text column with standard compression
+ */
+LIB_EXPORT rc_t CC VSchemaRuntimeTableVAddBooleanColumn ( VSchemaRuntimeTable *self, const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcSelf, rcNull );
+    else if ( name == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcNull );
+    else if ( name [ 0 ] == 0 )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcEmpty );
+    else
+    {
+        VTypedecl td;
+        rc = VSchemaResolveTypedecl ( self -> schema, & td, "bool" );
+        if ( rc == 0 )
+            rc = VSchemaRuntimeTableVAddColumn ( self, & td, "bool_encoding", name, args );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaRuntimeTableAddBooleanColumn ( VSchemaRuntimeTable *self, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VSchemaRuntimeTableVAddBooleanColumn ( self, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaRuntimeTableVAddIntegerColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, bool has_sign,  const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcSelf, rcNull );
+    else if ( name == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcNull );
+    else if ( name [ 0 ] == 0 )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcEmpty );
+    else
+    {
+        VTypedecl td;
+
+        char typedecl [ 256 ];
+        int status = snprintf ( typedecl, sizeof typedecl, "%c%u", has_sign ? 'I' : 'U', bits );
+        if ( status < 0 || status >= sizeof typedecl )
+            rc = RC ( rcVDB, rcSchema, rcUpdating, rcBuffer, rcInsufficient );
+        else
+        {
+            rc = VSchemaResolveTypedecl ( self -> schema, & td, "%s", typedecl );
+            if ( rc != 0 && ( ( ( ( bits - 1 ) & bits ) != 0 ) || bits < 8 || bits > 64 ) )
+            {
+                status = snprintf ( typedecl, sizeof typedecl, "%c1 [ %u ]", ( bits < 4 ) ? 'B' : ( has_sign ? 'I' : 'U' ), bits );
+                if ( status < 0 || status >= sizeof typedecl )
+                    rc = RC ( rcVDB, rcSchema, rcUpdating, rcBuffer, rcInsufficient );
+                else
+                    rc = VSchemaResolveTypedecl ( self -> schema, & td, "%s", typedecl );
+            }
+            if ( rc == 0 )
+            {
+                char encoding [ 256 ];
+
+                status = snprintf ( encoding, sizeof encoding, "< %s > izip_encoding", typedecl );
+                if ( status < 0 || status >= sizeof encoding )
+                    rc = RC ( rcVDB, rcSchema, rcUpdating, rcBuffer, rcInsufficient );
+                else
+                    rc = VSchemaRuntimeTableVAddColumn ( self, & td, encoding, name, args );
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaRuntimeTableAddIntegerColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, bool has_sign,  const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VSchemaRuntimeTableVAddIntegerColumn ( self, bits, has_sign, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaRuntimeTableVAddFloatColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, uint32_t significant_mantissa_bits,  const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcSelf, rcNull );
+    else if ( name == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcNull );
+    else if ( name [ 0 ] == 0 )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcEmpty );
+    else
+    {
+        VTypedecl td;
+
+        char typedecl [ 256 ];
+        int status = snprintf ( typedecl, sizeof typedecl, "F%u", bits );
+        if ( status < 0 || status >= sizeof typedecl )
+            rc = RC ( rcVDB, rcSchema, rcUpdating, rcBuffer, rcInsufficient );
+        else
+        {
+            rc = VSchemaResolveTypedecl ( self -> schema, & td, "%s", typedecl );
+            if ( rc == 0 )
+            {
+                char encoding [ 256 ];
+
+                if ( bits != 32 || significant_mantissa_bits >= bits )
+                {
+                    status = snprintf ( encoding, sizeof encoding,
+                        "< %s > zip_encoding", typedecl );
+                }
+                else
+                {
+                    status = snprintf ( encoding, sizeof encoding,
+                        "< %s > fzip_encoding < %u >", typedecl, significant_mantissa_bits );
+                }
+                if ( status < 0 || status >= sizeof encoding )
+                    rc = RC ( rcVDB, rcSchema, rcUpdating, rcBuffer, rcInsufficient );
+                else
+                    rc = VSchemaRuntimeTableVAddColumn ( self, & td, encoding, name, args );
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaRuntimeTableAddFloatColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, uint32_t significant_mantissa_bits,  const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VSchemaRuntimeTableVAddFloatColumn ( self, bits, significant_mantissa_bits, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaRuntimeTableVAddAsciiColumn ( VSchemaRuntimeTable *self, const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcSelf, rcNull );
+    else if ( name == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcNull );
+    else if ( name [ 0 ] == 0 )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcEmpty );
+    else
+    {
+        VTypedecl td;
+        rc = VSchemaResolveTypedecl ( self -> schema, & td, "ascii" );
+        if ( rc == 0 )
+            rc = VSchemaRuntimeTableVAddColumn ( self, & td, "< ascii > zip_encoding", name, args );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaRuntimeTableAddAsciiColumn ( VSchemaRuntimeTable *self, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VSchemaRuntimeTableVAddAsciiColumn ( self, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VSchemaRuntimeTableVAddUnicodeColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcSelf, rcNull );
+    else if ( name == NULL )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcNull );
+    else if ( name [ 0 ] == 0 )
+        rc = RC ( rcVDB, rcSchema, rcUpdating, rcName, rcEmpty );
+    else
+    {
+        VTypedecl td;
+
+        char typedecl [ 256 ];
+        int status = snprintf ( typedecl, sizeof typedecl, "utf%u", bits );
+        if ( status < 0 || status >= sizeof typedecl )
+            rc = RC ( rcVDB, rcSchema, rcUpdating, rcBuffer, rcInsufficient );
+        else
+        {
+            rc = VSchemaResolveTypedecl ( self -> schema, & td, "%s", typedecl );
+            if ( rc == 0 )
+            {
+                char encoding [ 256 ];
+                status = snprintf ( encoding, sizeof encoding,
+                    "< %s > zip_encoding", typedecl );
+                if ( status < 0 || status >= sizeof encoding )
+                    rc = RC ( rcVDB, rcSchema, rcUpdating, rcBuffer, rcInsufficient );
+                else
+                    rc = VSchemaRuntimeTableVAddColumn ( self, & td, encoding, name, args );
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VSchemaRuntimeTableAddUnicodeColumn ( VSchemaRuntimeTable *self,
+    uint32_t bits, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VSchemaRuntimeTableVAddUnicodeColumn ( self, bits, name, args );
+    va_end ( args );
+
+    return rc;
+}
diff --git a/libs/vdb/split.c b/libs/vdb/split.c
new file mode 100644
index 0000000..14ebc12
--- /dev/null
+++ b/libs/vdb/split.c
@@ -0,0 +1,398 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vdb/extern.h>
+#include "blob.h"
+
+#include "blob-headers.h"
+#include "page-map.h"
+#include "blob-priv.h"
+#include "prod-priv.h"
+#include "xform-priv.h"
+
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+static
+int64_t read_64(const uint8_t **Src, const uint8_t *end, int scale, rc_t *rc) {
+	int64_t x = 0;
+	uint8_t c;
+	const uint8_t *src = *Src;
+	int n = 0;
+	
+	switch (scale) {
+	case 1:
+		scale = 2;
+		break;
+	case 2:
+		scale = 3;
+		break;
+	case 4:
+		scale = 5;
+		break;
+	case 8:
+		scale = 10;
+		break;
+	default:
+		return 0;
+	}
+	*rc = 0;
+	do {
+		if (src >= end) {
+			*rc = RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+			return 0;
+		}
+		if (++n > scale) {
+			*rc = RC(rcVDB, rcBlob, rcConstructing, rcData, rcInvalid);
+			return 0;
+		}
+		
+		c = *src++;
+		if ((c & 0x80) != 0)
+			break;
+		x <<= 7;
+		x |= c;
+	} while (1);
+    
+	c &= 0x7F;
+	if ((c & 0x40) != 0) {
+		c &= 0x3F;
+		x <<= 6;
+		x |= c;
+		x = -x;
+	}
+	else {
+		x <<= 6;
+		x |= c;
+	}
+	*Src = src;
+	return x;
+}
+
+static rc_t VBlobSplit_v1_validate_header(const uint8_t *inp, const uint8_t *in_end, unsigned n, const uint8_t **data) {
+    rc_t rc;
+    unsigned i;
+    
+    for (i = 0; i != n; ++i) {
+        read_64(&inp, in_end, 4, &rc);
+        if (rc != 0)
+            return rc;
+    }
+    *data = inp;
+    return 0;
+}
+
+static rc_t VBlobSplit_v1(VBlob **lhs, const VBlob *self, uint32_t index, uint32_t elem_bits) {
+    const uint8_t *inp;
+    const uint8_t *in_end;
+    const uint8_t *data;
+    size_t insize;
+    rc_t rc;
+    unsigned block_count;
+    unsigned i;
+    
+    inp = self->data.base;
+    assert(self->data.bit_offset == 0);
+    insize = KDataBufferBytes(&self->data);
+    assert(insize > 0);
+    in_end = inp + insize;
+    
+    block_count = (unsigned int)read_64(&inp, in_end, 1, &rc);
+    if (rc != 0)
+        return rc;
+    
+    rc = VBlobSplit_v1_validate_header(inp, in_end, block_count, &data);
+    if (rc != 0)
+        return rc;
+    
+    for (i = 0; i != block_count; ++i) {
+        unsigned block_size = (unsigned int)read_64(&inp, in_end, 4, &rc);
+        uint8_t bits;
+        uint8_t byte_order;
+        uint16_t row_len;
+        int64_t start_id;
+        uint32_t id_span;
+        const char *datatype;
+        
+        if (data >= in_end || data + 1 >= in_end)
+            return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+        bits = data[0];
+        byte_order = data[1];
+        data += 2;
+        
+        row_len = (uint16_t)read_64(&data, in_end, 2, &rc);
+        if (rc != 0)
+            return rc;
+        
+        start_id = read_64(&data, in_end, 8, &rc);
+        if (rc != 0)
+            return rc;
+        
+        id_span = (uint32_t)read_64(&data, in_end, 4, &rc);
+        if (rc != 0)
+            return rc;
+        
+        if (data + block_size >= in_end)
+            return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+        
+        datatype = (const char *)data;
+        data = memchr(datatype, 0, block_size);
+        if (data == NULL)
+            return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInvalid);
+        
+        ++data;
+        if (data >= in_end)
+            return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInsufficient);
+        
+        if (i == index) {
+            if (((block_size * 8) - bits) % elem_bits != 0)
+                rc = RC(rcVDB, rcBlob, rcConstructing, rcData, rcInvalid);
+            else {
+                VBlob *y;
+                
+                rc = VBlobNew(&y, start_id, start_id + id_span, "split");
+                if (rc == 0) {
+                    KDataBuffer temp;
+                    
+                    y->byte_order = byte_order;
+                    rc = KDataBufferCast(&self->data, &temp, 8, false);
+                    if (rc == 0) {
+                        KDataBufferSub(&temp, &temp, (uint32_t)( data - (const uint8_t *)self->data.base ), block_size);
+                        KDataBufferCast(&temp, &temp, 1, true);
+                        temp.elem_count -= bits;
+                        rc = KDataBufferCast(&temp, &y->data, elem_bits, false);
+                        KDataBufferWhack(&temp);
+                        if (rc == 0) {
+                            rc = PageMapNewFixedRowLength(&y->pm, BlobRowCount(y), row_len);
+                            if (rc == 0) {
+                                *lhs = y;
+                                return 0;
+                            }
+                        }
+                    }
+                    TRACK_BLOB( VBlobRelease, ((VBlob*)y) );
+                    (void)VBlobRelease(y);
+                }
+            }
+            return rc;
+        }
+        data += block_size;
+    }
+    return RC(rcVDB, rcBlob, rcConstructing, rcParam, rcInvalid);
+}
+
+static rc_t VBlobSplit_v2(VBlob **lhs, const VBlob *self, uint32_t index, uint32_t elem_bits, const VBlobHeader *hdr) {
+    unsigned doffset;
+    unsigned dlength;
+    unsigned num_inputs;
+    unsigned num_maps;
+    unsigned map;
+    unsigned i;
+    int64_t val;
+    rc_t rc;
+    VBlob *y;
+    PageMap *pm;
+    BlobHeaders *headers;
+    
+    rc = VBlobHeaderArgPopHead(hdr, &val);
+    if (rc)
+        return rc;
+    num_inputs = (unsigned)val;
+    
+    if ( (unsigned)index > num_inputs )
+        return RC(rcVDB, rcBlob, rcConstructing, rcParam, rcInvalid);
+    
+    rc = VBlobHeaderArgPopHead(hdr, &val);
+    if (rc)
+        return rc;
+    num_maps = (unsigned)val;
+    
+    for (map = 0, i = 0; i != num_inputs; ++i) {
+        rc = VBlobHeaderArgPopHead(hdr, &val);
+        if (rc)
+            break;
+        if (i == index)
+            map = (unsigned)val;
+    }
+    if (rc)
+        return rc;
+    if (map > num_maps || map < 0)
+        return RC(rcVDB, rcBlob, rcConstructing, rcData, rcInvalid);
+    
+    if (self->spmc == 0) {
+        ((VBlob *)self)->spmc = malloc(sizeof(*self->spmc) - sizeof(self->spmc->pm) + num_maps * sizeof(self->spmc->pm[0]));
+        if (self->spmc) {
+            self->spmc->n = num_maps;
+            for (doffset = i = 0; i != num_maps; ++i) {
+                rc = VBlobHeaderArgPopHead(hdr, &val);
+                if (rc)
+                    break;
+                rc = PageMapDeserialize(&self->spmc->pm[i], &((uint8_t *)self->data.base)[doffset], (uint32_t)val, BlobRowCount(self));
+                if (rc)
+                    break;
+                doffset += (unsigned)val;
+            }
+        }
+        else
+            return RC(rcVDB, rcBlob, rcConstructing, rcMemory, rcExhausted);
+    }
+    else {
+        for (doffset = i = 0; i != num_maps; ++i) {
+            rc = VBlobHeaderArgPopHead(hdr, &val);
+            if (rc)
+                break;
+            doffset += (unsigned)val;
+        }
+    }
+    if (rc)
+        return rc;
+    pm = self->spmc->pm[map];
+    
+    for (i = 0; rc == 0 && i != num_inputs; ++i) {
+        rc = VBlobHeaderArgPopHead(hdr, &val);
+        if ( rc )
+            break;
+        if ( i == index ) {
+            if (val)
+                rc = BlobHeadersCreateFromData(&headers, &((uint8_t *)self->data.base)[doffset], (uint32_t)val);
+            else
+                headers = NULL;
+        }
+        doffset += (unsigned)val;
+    }
+    
+    for (dlength = 0, i = 0; rc == 0 && i != num_inputs; ++i) {
+        rc = VBlobHeaderArgPopHead(hdr, &val);
+        if (rc)
+            break;
+        if (i == index) {
+            dlength = (unsigned)val;
+            break;
+        }
+        doffset += ( ( (unsigned)val + 7 ) >> 3 );
+    }
+    if (rc)
+        return rc;
+    assert(dlength != 0);
+    
+    rc = VBlobNew(&y, self->start_id, self->stop_id, "split");
+    if (rc == 0) {
+        KDataBuffer buffer;
+        
+        rc = KDataBufferCast(&self->data, &buffer, 8, false);
+        if (rc == 0) {
+            KDataBufferSub( &buffer, &buffer, (uint32_t)doffset, (uint32_t)( (dlength + 7) >> 3 ) );
+            KDataBufferCast(&buffer, &buffer, 1, true);
+            buffer.elem_count = (uint32_t)dlength;
+            rc = KDataBufferCast(&buffer, &y->data, elem_bits, false);
+            KDataBufferWhack(&buffer);
+            if (rc == 0) {
+                y->pm = pm;
+                PageMapAddRef(y->pm);
+                y->headers = (BlobHeaders *)headers;
+                
+                *lhs = y;
+                return 0;
+            }
+        }
+        TRACK_BLOB( VBlobRelease, ((VBlob*)y) );
+        (void)VBlobRelease(y);
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VBlobBufferSplit(VBlob **lhs, const VBlob *self, uint32_t index, uint32_t elem_bits) {
+    rc_t rc;
+    
+    if (self->headers) {
+        const VBlobHeader *hdr = BlobHeadersGetHeader(self->headers);
+		
+        if (hdr) {
+            switch (VBlobHeaderVersion(hdr)) {
+            case 1:
+                rc = VBlobSplit_v2(lhs, self, index, elem_bits, hdr);
+                break;
+            default:
+                rc = RC(rcVDB, rcBlob, rcConstructing, rcData, rcBadVersion);
+                break;
+            }
+            VBlobHeaderRelease(hdr);
+            return rc;
+        }
+        return RC(rcVDB, rcBlob, rcConstructing, rcMemory, rcExhausted);
+    }
+    else {
+        return VBlobSplit_v1(lhs, self, index, elem_bits);
+    }
+}
+
+typedef struct self_t {
+    uint32_t index;
+} self_t;
+
+/* split
+ *  any split #1.0 < U32 idx > ( merged_fmt in );
+ *  any NCBI:split #1.0 < U32 idx > ( merged_t in );
+ */
+static
+rc_t CC split_impl( void *self,
+                const VXformInfo *info,
+                int64_t row_id,
+                VBlob **rslt,
+                uint32_t argc,
+                const VBlob *argv[] )
+{
+    return VBlobBufferSplit(rslt, argv[0], ((const self_t *)self)->index, VTypedescSizeof(&info->prod->desc));
+}
+
+static
+void CC vfunc_free ( void * self )
+{
+    free ( self );
+}
+
+VTRANSFACT_BUILTIN_IMPL(vdb_split, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->self = malloc(sizeof(self_t));
+    if (rslt->self) {
+        ((self_t *)rslt->self)->index = cp->argv[0].data.u32[0];
+        rslt->whack = vfunc_free;
+        rslt->variant = vftBlobN;
+        VFUNCDESC_INTERNAL_FUNCS(rslt)->bfN = split_impl;
+        return 0;
+    }
+    return RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
diff --git a/libs/vdb/table-cmn.c b/libs/vdb/table-cmn.c
new file mode 100644
index 0000000..40962ba
--- /dev/null
+++ b/libs/vdb/table-cmn.c
@@ -0,0 +1,1401 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+
+#define KONST const
+#include "table-priv.h"
+#include "cursor-priv.h"
+#include "database-priv.h"
+#include "dbmgr-priv.h"
+#undef KONST
+
+#include "schema-priv.h"
+#include "schema-dump.h"
+#include "linker-priv.h"
+
+#include <vdb/vdb-priv.h>
+#include <vdb/cursor.h>
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/table.h>
+#include <kdb/index.h>
+#include <kdb/column.h>
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <kdb/kdb-priv.h>
+#include <klib/symbol.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * VTable
+ *  a collection of columns indexed by row id, metadata, indices
+ */
+
+/* Whack
+ */
+rc_t VTableWhack ( VTable *self )
+{
+    KRefcountWhack ( & self -> refcount, "VTable" );
+
+    BSTreeWhack ( & self -> read_col_cache, VColumnRefWhack, NULL );
+    BSTreeWhack ( & self -> write_col_cache, VColumnRefWhack, NULL );
+    VTableRelease(self -> cache_tbl);
+
+    KMDataNodeRelease ( self -> col_node );
+    KMetadataRelease ( self -> meta );
+    KTableRelease ( self -> ktbl );
+    VSchemaRelease ( self -> schema );
+    VLinkerRelease ( self -> linker );
+    VDatabaseSever ( self -> db );
+    VDBManagerSever ( self -> mgr );
+
+    free ( self );
+    return 0;
+}
+
+
+/* AddRef
+ */
+LIB_EXPORT rc_t CC VTableAddRef ( const VTable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "VTable" ) )
+        {
+        case krefLimit:
+            return RC ( rcVDB, rcTable, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VTableRelease ( const VTable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "VTable" ) )
+        {
+        case krefWhack:
+            return VTableWhack ( ( VTable* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcTable, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+/* Attach
+ * Sever
+ *  internal
+ */
+VTable *VTableAttach ( const VTable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAddDep ( & self -> refcount, "VTable" ) )
+        {
+        case krefLimit:
+            return NULL;
+        }
+    }
+    return ( VTable* ) self;
+}
+
+rc_t VTableSever ( const VTable *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDropDep ( & self -> refcount, "VTable" ) )
+        {
+        case krefWhack:
+            return VTableWhack ( ( VTable* ) self );
+        case krefNegative:
+            return RC ( rcVDB, rcTable, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+
+/* Make - PRIVATE
+ */
+rc_t VTableMake ( VTable **tblp,
+    const VDBManager *mgr, const VDatabase *db, const VSchema *schema )
+{
+    rc_t rc;
+
+    /* create a structure */
+    VTable *tbl = calloc ( sizeof * tbl, 1 );
+    if ( tbl == NULL )
+        rc = RC ( rcVDB, rcTable, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        /* since the object has been zeroed, Whack will work properly */
+        rc = VSchemaMake ( ( VSchema** ) & tbl -> schema, schema );
+        if ( rc == 0 )
+        {
+            tbl -> mgr = VDBManagerAttach ( mgr );
+            tbl -> db = VDatabaseAttach ( db );
+
+            BSTreeInit ( & tbl -> read_col_cache );
+            BSTreeInit ( & tbl -> write_col_cache );
+
+            KRefcountInit ( & tbl -> refcount, 1, "VTable", "make", "vtbl" );
+
+            tbl -> cmode = ( uint8_t ) kcmOpen;
+            tbl -> checksum = ( uint8_t ) kcsNone;
+
+            rc = VLinkerMake ( & tbl -> linker, mgr -> linker, mgr -> linker -> dl );
+            if ( rc == 0 )
+            {
+                * tblp = tbl;
+                return 0;
+            }
+        }
+
+        VTableWhack ( tbl );
+    }
+
+    * tblp = NULL;
+
+    return rc;
+}
+
+
+/* OpenRead
+ *  finish initialization on open for read
+ */
+static
+rc_t VTableOpenRead ( VTable *self )
+{
+    /* open metadata */
+    rc_t rc = KTableOpenMetadataRead ( self -> ktbl, & self -> meta );
+    if ( rc == 0 )
+    {
+        /* open "col" node, if present */
+        rc = KMetadataOpenNodeRead ( self -> meta, & self -> col_node, "col" );
+        if ( rc == 0 || GetRCState ( rc ) == rcNotFound )
+        {
+            /* fetch stored schema */
+            rc = VTableLoadSchema ( self );
+            if ( rc == 0 && self -> stbl == NULL )
+                rc = RC ( rcVDB, rcTable, rcOpening, rcSchema, rcNotFound );
+        }
+    }
+
+    DBGMSG(DBG_VDB, DBG_FLAG(DBG_VDB_VDB), ("VTableOpenRead = %d\n", rc));
+
+    return rc;
+}
+
+
+/* OpenTableRead
+ * VOpenTableRead
+ *  open a table for read
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to table
+ */
+LIB_EXPORT rc_t CC VDBManagerVOpenTableRead ( const VDBManager *self,
+    const VTable **tblp, const VSchema *schema,
+    const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( tblp == NULL )
+        rc = RC ( rcVDB, rcMgr, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcSelf, rcNull );
+        else
+        {
+            VTable *tbl;
+
+            /* if no schema is given, always pass intrinsic */
+            if ( schema == NULL )
+                schema = self -> schema;
+
+            rc = VTableMake ( & tbl, self, NULL, schema );
+            if ( rc == 0 )
+            {
+                tbl -> read_only = true;
+                rc = KDBManagerVOpenTableRead ( self -> kmgr, & tbl -> ktbl, path, args );
+                if ( rc == 0 )
+                {
+                    tbl -> blob_validation = KTableHasRemoteData ( tbl -> ktbl );
+                    rc = VTableOpenRead ( tbl );
+                    if ( rc == 0 )
+                    {
+#if LAZY_OPEN_COL_NODE
+                        KMDataNodeRelease ( tbl -> col_node );
+                        tbl -> col_node = NULL;
+#endif
+                        * tblp = tbl;
+                        return 0;
+                    }
+                }
+                VTableWhack ( tbl );
+            }
+        }
+
+        * tblp = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDBManagerOpenTableRead ( const VDBManager *self, const VTable **tbl,
+    const VSchema *schema, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = VDBManagerVOpenTableRead ( self, tbl, schema, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseVOpenTableRead ( const VDatabase *self,
+    const VTable **tblp, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( tblp == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcOpening, rcSelf, rcNull );
+        else
+        {
+            VTable *tbl;
+            rc = VTableMake ( & tbl, self -> mgr, self, self -> schema );
+            if ( rc == 0 )
+            {
+                tbl -> read_only = true;
+
+                rc = KDatabaseVOpenTableRead ( self -> kdb, & tbl -> ktbl, path, args );
+                if ( rc == 0 )
+                {
+                    tbl -> blob_validation = KTableHasRemoteData ( tbl -> ktbl );
+                    rc = VTableOpenRead ( tbl );
+                    if ( rc == 0 )
+                    {
+                        * tblp = tbl;
+                        return 0;
+                    }
+                }
+
+                VTableWhack ( tbl );
+            }
+        }
+
+        * tblp = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseOpenTableRead ( const VDatabase *self,
+    const VTable **tbl, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = VDatabaseVOpenTableRead ( self, tbl, path, args );
+    va_end ( args );
+    
+    if ( rc == 0 && self->cache_db != NULL )
+    {
+        rc_t rc2;
+        const VTable *ctbl;
+
+        va_start ( args, path );
+        rc2 = VDatabaseVOpenTableRead ( self->cache_db, &ctbl, path, args );
+        va_end ( args );
+        
+        DBGMSG( DBG_VDB, DBG_FLAG( DBG_VDB_VDB ), ( "VDatabaseOpenTableRead(vdbcache) = %d\n", rc2 ) );
+        if ( rc2 == 0 )
+        {
+            ( ( VTable* ) ( *tbl ) ) -> cache_tbl = ctbl;
+        }
+    }
+    return rc;
+}
+
+
+/* Locked
+ *  returns true if locked
+ */
+LIB_EXPORT bool CC VTableLocked ( const VTable *self )
+{
+    if ( self != NULL )
+        return KTableLocked ( self -> ktbl );
+    return false;
+}
+
+
+/* Writable
+ *  returns 0 if object is writable
+ *  or a reason why if not
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC VTableVWritable ( const VTable *self, uint32_t type, const char * name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+    else
+        rc = KTableVWritable ( self -> ktbl, type, name, args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableWritable ( const VTable *self, uint32_t type, const char * name, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, name );
+
+    rc = VTableVWritable ( self, type, name, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* OpenMetadataRead
+ *  opens metadata file
+ *
+ *  "meta" [ OUT ] - return parameter for metadata
+ */
+LIB_EXPORT rc_t CC VTableOpenMetadataRead ( const VTable *self, struct KMetadata const **meta )
+{
+    rc_t rc;
+
+    if ( meta == NULL )
+        rc = RC ( rcVDB, rcTable, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcOpening, rcSelf, rcNull );
+        else
+        {
+            * meta = self -> meta;
+            return KMetadataAddRef ( self -> meta );
+        }
+
+        * meta = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenIndexRead
+ * VOpenIndexRead
+ *  open an index for read
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+LIB_EXPORT rc_t CC VTableVOpenIndexRead ( const VTable *self,
+    struct KIndex const **idx, const char *name, va_list args )
+{
+    rc_t rc;
+    KIdxType type;
+    uint32_t version;
+    const KMDataNode *node;
+
+    if ( self == NULL )
+    {
+        if ( idx == NULL )
+            return RC ( rcVDB, rcTable, rcOpening, rcParam, rcNull );
+        * idx = NULL;
+        return RC ( rcVDB, rcTable, rcOpening, rcSelf, rcNull );
+    }
+
+    /* open the requested index */
+    rc = KTableVOpenIndexRead ( self -> ktbl, idx, name, args );
+    if ( rc != 0 )
+        return rc;
+
+    /* get version and type */
+    rc = KIndexVersion ( * idx, & version );
+    if ( rc == 0 )
+        rc = KIndexType ( * idx, & type );
+    if ( rc != 0 )
+        return 0;
+
+    /* look for versions 2 or 3, type kitText or kitText with projection */
+    switch ( version )
+    {
+    case 2:
+    case 3:
+        switch ( type )
+        {
+        case kitText:
+        case kitText | kitProj:
+            break;
+        default:
+            return 0;
+        }
+        break;
+    default:
+        return 0;
+    }
+
+    /* look for a node in metadata for repairing maximum id */
+    rc = KMetadataOpenNodeRead ( self -> meta, & node, "/.seq/spot" );
+    if ( rc == 0 )
+    {
+        int64_t maxid;
+        rc = KMDataNodeReadAsI64 ( node, & maxid );
+        if ( rc == 0 )
+            KIndexSetMaxRowId ( * idx, maxid );
+        KMDataNodeRelease ( node );
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VTableOpenIndexRead ( const VTable *self,
+    struct KIndex const **idx, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VTableVOpenIndexRead ( self, idx, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* ListColumns
+ *  list readable column names
+ *
+ *  "names" [ OUT ] - return parameter for namelist
+ *
+ *  availability: v2.1
+ */
+static
+rc_t list_readable_columns ( const VTable *cself )
+{
+    VTable *self = ( VTable* ) cself;
+
+    VCursor *curs;
+    rc_t rc = VTableCreateCursorReadInternal ( self, ( const VCursor** ) & curs );
+    if (  rc == 0 )
+    {
+        /* let this private VCursor-function list the columns */
+        rc = VCursorListReadableColumns ( curs, & self -> read_col_cache );
+        VCursorRelease ( curs );
+        if ( rc == 0 )
+            self -> read_col_cache_valid = true;
+    }
+
+    return rc;
+}
+
+rc_t make_column_namelist ( const BSTree *columns, KNamelist **names )
+{
+    VNamelist *list;
+    rc_t rc = VNamelistMake ( & list, 8 );
+    if ( rc == 0 )
+    {
+        const String *last = NULL;
+        const VColumnRef *cref = ( const VColumnRef* )
+            BSTreeFirst ( columns );
+        while ( cref != NULL )
+        {
+            if ( last == NULL || ! StringEqual ( last, & cref -> name ) )
+            {
+                rc = VNamelistAppend ( list, cref -> name . addr );
+                if ( rc != 0 )
+                    break;
+
+                last = & cref -> name;
+            }
+
+            cref = ( const VColumnRef* )
+                BSTNodeNext ( & cref -> n );
+        }
+
+        if ( rc == 0 )
+            rc = VNamelistToNamelist ( list, names );
+
+        VNamelistRelease ( list );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableListReadableColumns ( const VTable *self, KNamelist **names )
+{
+    rc_t rc;
+
+    if ( names == NULL )
+        rc = RC ( rcVDB, rcTable, rcListing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcSelf, rcNull );
+        else
+        {
+            if ( ! self -> read_col_cache_valid )
+                rc = list_readable_columns ( self );
+
+            if ( self -> read_col_cache_valid )
+                return make_column_namelist ( & self -> read_col_cache, names );
+        }
+
+        * names = NULL;
+    }
+    return rc;
+}
+
+/* v2.0 interface
+ */
+LIB_EXPORT rc_t CC VTableListCol ( const VTable *cself, KNamelist **names )
+{
+    return VTableListReadableColumns ( cself, names );
+}
+
+
+
+/* ListPhysColumns
+ *  avail: 2.4
+ */
+LIB_EXPORT rc_t CC VTableListPhysColumns ( const VTable *self, KNamelist **names )
+{
+    rc_t rc;
+
+    if ( names == NULL )
+        rc = RC ( rcVDB, rcTable, rcListing, rcParam, rcNull );
+    else
+    {
+        * names = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcSelf, rcNull );
+        else
+        {
+            KNamelist *kcol_names;
+            rc = KTableListCol ( self -> ktbl, & kcol_names );
+            if ( rc == 0 )
+            {
+                uint32_t kcol_count;
+                rc = KNamelistCount ( kcol_names, & kcol_count );
+                if ( rc == 0 )
+                {
+                    uint32_t scol_count = 0;
+                    KNamelist *scol_names = NULL;
+                    const KMDataNode *col_node = self -> col_node;
+
+#if LAZY_OPEN_COL_NODE
+                    if ( col_node == NULL )
+                    {
+                        rc = KMetadataOpenNodeRead ( self -> meta, & ( ( VTable* ) self ) -> col_node, "col" );
+                        if ( rc == 0 || GetRCState ( rc ) != rcNotFound )
+                            col_node = self -> col_node;
+                    }
+#endif
+                    if ( col_node != NULL )
+                    {
+                        rc = KMDataNodeListChildren ( col_node, & scol_names );
+                        if ( rc == 0 )
+                            rc = KNamelistCount ( scol_names, & scol_count );
+                    }
+
+                    if ( rc == 0 )
+                    {
+                        VNamelist *vnames;
+                        rc = VNamelistMake ( & vnames, kcol_count + scol_count );
+                        if ( rc == 0 )
+                        {
+                            uint32_t i;
+                            const char *name;
+
+                            for ( i = 0; i < kcol_count && rc == 0; ++ i )
+                            {
+                                rc = KNamelistGet ( kcol_names, i, & name );
+                                if ( rc == 0 )
+                                    rc = VNamelistAppend ( vnames, name );
+                            }
+
+                            for ( i = 0; i < scol_count && rc == 0; ++ i )
+                            {
+                                rc = KNamelistGet ( scol_names, i, & name );
+                                if ( rc == 0 )
+                                    rc = VNamelistAppend ( vnames, name );
+                            }
+
+                            if ( rc == 0 )
+                            {
+                                rc = VNamelistToNamelist ( vnames, names );
+                                if ( rc == 0 )
+                                    VNamelistReorder ( vnames, false );
+                            }
+                        }
+
+                        VNamelistRelease ( vnames );
+                    }
+
+                    KNamelistRelease ( scol_names );
+                }
+
+                KNamelistRelease ( kcol_names );
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+/* ListDatatypes
+ *  returns list of typedecls for named column
+ *
+ *  "col" [ IN ] - column name
+ *
+ *  "dflt_idx" [ OUT, NULL OKAY ] - returns the zero-based index
+ *  into "typedecls" of the default datatype for the named column
+ *
+ *  "typedecls" [ OUT ] - list of datatypes available for named column
+ *
+ *  availability: v2.1
+ */
+
+rc_t make_column_typelist ( const BSTree *columns,
+    const char *col, uint32_t *dflt_idx, KNamelist **typedecls )
+{
+    VNamelist *list;
+    rc_t rc = VNamelistMake ( & list, 8 );
+    if ( rc == 0 )
+    {
+        uint32_t idx;
+        const VColumnRef *first;
+
+        String col_name;
+        StringInitCString ( & col_name, col );
+
+        first = ( const VColumnRef* )
+            BSTreeFind ( columns, & col_name, VColumnRefCmpString );
+        if ( first != NULL )
+        {
+            const VColumnRef *cref = ( const VColumnRef* ) BSTNodePrev ( & first -> n );
+            while ( cref != NULL && StringEqual ( & first -> name, & cref -> name ) )
+            {
+                first = cref;
+                cref = ( const VColumnRef* ) BSTNodePrev ( & cref -> n );
+            }
+
+            for ( cref = first, idx = 0; ; ++ idx )
+            {
+                rc = VNamelistAppend ( list, cref -> typedecl );
+                if ( rc != 0 )
+                    break;
+
+                if ( cref -> dflt )
+                    * dflt_idx = idx;
+
+                cref = ( const VColumnRef* ) BSTNodeNext ( & cref -> n );
+                if ( cref == NULL || ! StringEqual ( & first -> name, & cref -> name ) )
+                    break;
+            }
+        }
+
+        if ( rc == 0 )
+            rc = VNamelistToNamelist ( list, typedecls );
+
+        VNamelistRelease ( list );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableListReadableDatatypes ( const VTable *self,
+    const char *col, uint32_t *dflt_idx, KNamelist **typedecls )
+{
+    rc_t rc;
+
+    uint32_t dummy;
+    if ( dflt_idx == NULL )
+        dflt_idx = & dummy;
+
+    * dflt_idx = 0;
+
+    if ( typedecls == NULL )
+        rc = RC ( rcVDB, rcTable, rcListing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcSelf, rcNull );
+        else if ( col == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcName, rcNull );
+        else if ( col [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcTable, rcListing, rcName, rcEmpty );
+        else
+        {
+            if ( ! self -> read_col_cache_valid )
+                rc = list_readable_columns ( self );
+
+            if ( self -> read_col_cache_valid )
+                return make_column_typelist ( & self -> read_col_cache, col, dflt_idx, typedecls );
+        }
+
+        * typedecls = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableColumnDatatypes( const VTable *cself, const char *col,
+    uint32_t *dflt_idx, KNamelist **typedecls )
+{
+    return VTableListReadableDatatypes ( cself, col, dflt_idx, typedecls );
+}
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VTableOpenManagerRead ( const VTable *self, const VDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = VDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VTableOpenParentRead ( const VTable *self, const VDatabase **db )
+{
+    rc_t rc;
+
+    if ( db == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = VDatabaseAddRef ( self -> db );
+            if ( rc == 0 )
+            {
+                * db = self -> db;
+                return 0;
+            }
+        }
+
+        * db = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenSchema
+ *  duplicate reference to table schema
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VTableOpenSchema ( const VTable *self, const VSchema **schema )
+{
+    rc_t rc;
+
+    if ( schema == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = VSchemaAddRef ( self -> schema );
+            if ( rc == 0 )
+            {
+                * schema = self -> schema;
+                return 0;
+            }
+        }
+
+        * schema = NULL;
+    }
+
+    return rc;
+}
+
+
+/* GetUserData
+ * SetUserData
+ *  store/retrieve an opaque pointer to user data
+ */
+LIB_EXPORT rc_t CC VTableGetUserData ( const VTable *self, void **data )
+{
+    rc_t rc;
+
+    if ( data == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * data = self -> user;
+            return 0;
+        }
+
+        * data = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableSetUserData ( const VTable *cself,
+    void *data, void ( CC * destroy ) ( void *data ) )
+{
+    VTable *self = ( VTable* ) cself;
+    if ( cself == NULL )
+        return RC ( rcVDB, rcTable, rcUpdating, rcSelf, rcNull );
+
+    self -> user = data;
+    self -> user_whack = destroy;
+
+    return 0;
+}
+
+
+/* GetKTable
+ *  returns a new reference to underlying KTable
+ */
+LIB_EXPORT rc_t CC VTableGetKTableRead ( const VTable *self, const KTable **ktbl )
+{
+    rc_t rc;
+
+    if ( ktbl == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * ktbl = self -> ktbl;
+            return KTableAddRef ( * ktbl );
+        }
+
+        * ktbl = NULL;
+    }
+
+    return rc;
+}
+
+
+
+/* Typespec
+ *  retrieve table typespec
+ *
+ *  AVAILABILITY: version 2.1
+ *
+ *  "ts_buff" [ IN ] and "ts_size" [ IN ] - buffer for return of NUL-terminated
+ *  table typespec, e.g. 'NCBI:tbl:abc#1.1'
+ */
+#define USE_SDUMPER 0
+
+#if USE_SDUMPER
+typedef struct flush_tblspec_pb flush_tblspec_pb;
+struct flush_tblspec_pb
+{
+    char *buff;
+    size_t size;
+    size_t bytes;
+};
+
+static
+rc_t CC flush_tbl_typespec ( void *data, const void *buffer, size_t size )
+{
+    flush_tblspec_pb *pb = data;
+    if ( pb -> bytes + size >= pb -> size )
+        return RC ( rcVDB, rcTable, rcAccessing, rcBuffer, rcInsufficient );
+    memmove ( & pb -> buff [ pb -> bytes ], buffer, size );
+    pb -> bytes += size;
+    pb -> buff [ pb -> bytes ] = 0;
+    return 0;
+}
+#endif
+
+LIB_EXPORT rc_t CC VTableTypespec ( const VTable *self, char *ts_buff, size_t ts_size )
+{
+    rc_t rc = 0;
+
+    if ( ts_size == 0 )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcBuffer, rcInsufficient );
+    else if ( ts_buff == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcBuffer, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc_t rc2;
+#if USE_SDUMPER
+            SDumper dumper;
+            flush_tblspec_pb pb;
+
+            /* initialize pb */
+            pb . buff = ts_buff;
+            pb . size = ts_size;
+            pb . bytes = 0;
+
+            /* initialize dumper for extracting name */
+            SDumperInit ( & dumper, self -> schema, sdmCompact, flush_tbl_typespec, & pb );
+
+            /* dump only the table name */
+            assert ( self -> stbl != NULL );
+            rc = SDumperPrint ( & dumper, "%N%V", self -> stbl -> name, self -> stbl -> version );
+
+            /* done */
+            rc2 = SDumperWhack ( & dumper );
+            if ( rc == 0 )
+            {
+                if ( rc2 == 0 )
+                    return 0;
+
+                rc = rc2;
+            }
+#else
+            rc2 = string_printf ( ts_buff, ts_size, NULL, "%N#%V", self -> stbl -> name, self -> stbl -> version );
+            if ( rc2 == 0 )
+                return 0;
+#endif
+        }
+
+        ts_buff [ 0 ] = 0;
+    }
+
+    return rc;
+}
+
+
+/* HasStaticColumn - PRIVATE
+ *  given a physical column name, report whether it exists
+ *  and is ( currently ) static
+ *  avail: 2.5
+ */
+LIB_EXPORT bool CC VTableHasStaticColumn ( const VTable *self, const char *name )
+{
+    if ( self != NULL && name != NULL && name [ 0 ] != 0 )
+    {
+        /* a full check of this might include testing that the column
+           can be opened for read or write, but the API is purposely
+           vague on what this means.
+
+           currently the meaning of this ( PRIVATE ) API is whether
+           there is a metadata column entry with this name - period. */
+        const KMDataNode *node;
+        rc_t rc = KMetadataOpenNodeRead ( self -> meta, & node, "/col/%s", name );
+        if ( rc == 0 )
+        {
+            KMDataNodeRelease ( node );
+            return true;
+        }
+    }
+
+    return false;
+}
+LIB_EXPORT bool CC VTableVHasStaticColumn ( const VTable *self, const char *name, va_list args )
+{
+    char full[4096];
+    if ( name == NULL )
+        full [ 0 ] = 0;
+    else
+    {
+        int len;
+
+        /* generate full name */
+        if ( args == NULL )
+            len = snprintf ( full, sizeof full, "%s", name );
+        else
+            len = vsnprintf ( full, sizeof full, name, args );
+        if ( len < 0 || len >= sizeof full )
+        {
+            rc_t rc = RC ( rcVDB, rcColumn, rcOpening, rcName, rcExcessive );
+            LOGERR ( klogInt, rc, "failed to format column name" );
+            return false;
+        }
+    }
+    return VTableHasStaticColumn( self, full );
+}
+
+
+/*--------------------------------------------------------------------------
+ * VColumnRef
+ *  cache entry
+ */
+
+/* Whack
+ */
+void CC VColumnRefWhack ( BSTNode *n, void *ignore )
+{
+    free ( n );
+}
+
+
+/* Make
+ *  make a column ref from an SColumn*
+ */
+rc_t VColumnRefMake ( VColumnRef **rp, const VSchema *schema, const SColumn *scol )
+{
+    char text [ 256 ];
+    rc_t rc = VTypedeclToText ( & scol -> td, schema, text, sizeof text );
+    if ( rc == 0 )
+    {
+        size_t tdsize = strlen ( text );
+        const String *name = & scol -> name -> name;
+        VColumnRef *cref = malloc ( sizeof * cref + name -> size + tdsize );
+        if ( cref == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcMemory, rcExhausted );
+        else
+        {
+            strcpy ( cref -> typedecl, text );
+            string_copy ( & cref -> typedecl [ tdsize + 1 ], name -> size + 1, name -> addr, name -> size );
+            StringInit ( & cref -> name, & cref -> typedecl [ tdsize + 1 ], name -> size, name -> len );
+            cref -> td = scol -> td;
+            cref -> cid = scol -> cid;
+            cref -> dflt = scol -> dflt;
+
+            * rp = cref;
+        }
+    }
+
+    return rc;
+}
+
+
+/* CmpString
+ *  compares by name only
+ *  "item" is a const String*
+ */
+int64_t CC VColumnRefCmpString ( const void *item, const BSTNode *n )
+{
+    const VColumnRef *cref = ( const VColumnRef* ) n;
+    return StringCompare ( item, & cref -> name );
+}
+
+/* Sort
+ *  compares by ( name, type ) pair
+ */
+int64_t CC VColumnRefSort ( const BSTNode *item, const BSTNode *n )
+{
+    const VColumnRef *a = ( const VColumnRef* ) item;
+    const VColumnRef *b = ( const VColumnRef* ) n;
+
+    /* sorted first by name - case sensitive ASCII alphabetically */
+    int64_t diff = StringCompare ( & a -> name, & b -> name );
+    if ( diff != 0 )
+        return diff;
+
+    /* sort by cid */
+    return VCtxIdCmp ( & a -> cid, & b -> cid );
+}
+
+#if 0 /* more for later */
+static
+rc_t create_cursor_all_readable_columns(const VTable *self,
+                                        unsigned *ncol, uint32_t **idx,
+                                        const VCursor **curs)
+{
+    KNamelist *list;
+    rc_t rc = VTableListReadableColumns(self, &list);
+    
+    if (rc == 0) {
+        rc = VTableCreateCursorReadInternal(self, curs);
+        if (rc == 0) {
+            uint32_t n;
+            
+            rc = KNamelistCount(list, ncol);
+            if (rc == 0) {
+                n = *ncol;
+                *idx = malloc(n * sizeof(**idx));
+                if (idx) {
+                    unsigned i;
+                    
+                    for (i = 0; i != (unsigned)n; ++i) {
+                        const char *name;
+                        
+                        rc = KNamelistGet(list, i, &name);
+                        if (rc)
+                            break;
+                        rc = VCursorAddColumn(*curs, &(*idx)[i], "%s", name);
+                        if (rc)
+                            break;
+                    }
+                    if (rc)
+                        free(*idx);
+                }
+                else
+                    rc = RC(rcVDB, rcTable, rcValidating, rcMemory, rcExhausted);
+            }
+            if (rc)
+                VCursorRelease(*curs);
+        }
+        KNamelistRelease(list);
+    }
+    if (rc) {
+        *idx = NULL;
+        *curs = NULL;
+        *ncol = 0;
+    }
+    return rc;
+}
+
+static
+rc_t fetch_all_rows(const VCursor *curs, unsigned ncol, const uint32_t cid[/* ncol */])
+{
+    int64_t start;
+    int64_t stop;
+    int64_t row;
+    unsigned i;
+    rc_t rc;
+    
+    for (i = 0; i != ncol; ++i) {
+        int64_t cstart;
+        uint64_t ccount;
+        
+        rc = VCursorIdRange(curs, cid[i], &cstart, &ccount);
+        if (rc)
+            return rc;
+        if (i == 0) {
+            start = cstart;
+            stop = cstart + ccount;
+        }
+        else {
+            if (start > cstart)
+                start = cstart;
+            if (stop < cstart + ccount)
+                stop = cstart + ccount;
+        }
+    }
+    for (row = start; row != stop; ++row) {
+        for (i = 0; i != ncol; ++i) {
+            uint32_t elem_bits;
+            const void *base;
+            uint32_t offset;
+            uint32_t length;
+            
+            rc = VCursorCellDataDirect(curs, row, cid[i], &elem_bits,
+                                       &base, &offset, &length);
+            if (rc)
+                return rc;
+        }
+    }
+    return 0;
+}
+
+VDB_EXTERN
+rc_t CC VTableConsistencyCheck(const VTable *self, int level)
+{
+    uint32_t *cid;
+    unsigned ncol;
+    const VCursor *curs;
+    rc_t rc = create_cursor_all_readable_columns(self, &ncol, &cid, &curs);
+    
+    if (rc)
+        return rc;
+    rc = fetch_all_rows(curs, ncol, cid);
+    free(cid);
+    VCursorRelease(curs);
+    return rc;
+}
+#endif
+
+
+static bool VTableStaticEmpty( const struct VTable *self )
+{
+    bool res = true;
+    KNamelist * col_names;
+    rc_t rc = KMDataNodeListChildren ( self->col_node, &col_names );
+    if ( rc == 0 )
+    {
+        uint32_t count;
+        rc = KNamelistCount ( col_names, &count );
+        if ( rc == 0 && count > 0 )
+        {
+            uint32_t idx;
+            for ( idx = 0; rc == 0 && res && idx < count; ++idx )
+            {
+                const char * col_name;
+                rc = KNamelistGet ( col_names, idx, &col_name );
+                if ( rc == 0 )
+                {
+                    const KMDataNode * this_col;
+                    rc = KMDataNodeOpenNodeRead ( self->col_node, &this_col, "%s/row_count", col_name );
+                    if ( rc == 0 )
+                    {
+                        uint64_t this_row_count;
+                        rc = KMDataNodeReadAsU64( this_col, &this_row_count );
+                        if ( rc == 0 )
+                        {
+                            if ( this_row_count > 0 )
+                                res = false; /* this will terminate the for-loop and leads to return( false ) */
+                        }
+						else
+						{
+							rc = 0;
+						}
+                        KMDataNodeRelease ( this_col );                    
+                    }
+                }
+            }
+        }
+        KNamelistRelease( col_names );
+    }
+    return res;
+}
+
+
+static bool VTablePhysicalEmpty( const struct VTable *self )
+{
+    bool res = true;
+    KNamelist * col_names;
+    rc_t rc = KTableListCol ( self -> ktbl, &col_names );
+    if ( rc == 0 )
+    {
+        uint32_t count;
+        rc = KNamelistCount ( col_names, &count );
+        if ( rc == 0 && count > 0 )
+        {
+            uint32_t idx;
+            for ( idx = 0; rc == 0 && res && idx < count; ++idx )
+            {
+                const char * col_name;
+                rc = KNamelistGet ( col_names, idx, &col_name );
+                if ( rc == 0 )
+                {
+                    const KColumn * col;
+                    rc = KTableOpenColumnRead ( self -> ktbl, &col, "%s", col_name );
+                    if ( rc == 0 )
+                    {
+                        int64_t id_first;
+                        uint64_t id_count;
+                        rc = KColumnIdRange ( col, &id_first, &id_count );
+                        if ( rc == 0 )
+                        {
+                            if ( id_count > 0 )
+                                res = false; /* this will terminate the for-loop and leads to return( false ) */
+                        }
+                        KColumnRelease ( col );
+                    }
+                }
+            }
+        }
+        KNamelistRelease( col_names );
+    }
+    return res;
+}
+
+
+/* IsEmpty
+ * first tries to find out if there are static columns, that are not empty
+ * send it checks if the KTable is empty
+ */
+LIB_EXPORT rc_t CC VTableIsEmpty ( const struct VTable *self, bool * empty )
+{
+    rc_t rc;
+    
+    if ( empty == NULL )
+        rc = RC ( rcVDB, rcTable, rcListing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcSelf, rcNull );
+        else
+        {
+			bool static_empty = VTableStaticEmpty( self );
+			bool phys_empty = VTablePhysicalEmpty( self );
+            *empty = ( static_empty && phys_empty );
+            return 0;
+        }
+        * empty = false;
+    }
+    return rc;
+}
diff --git a/libs/vdb/table-load.c b/libs/vdb/table-load.c
new file mode 100644
index 0000000..4a9b63d
--- /dev/null
+++ b/libs/vdb/table-load.c
@@ -0,0 +1,323 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define KONST const
+#define SKONST
+
+#include "dbmgr-priv.h"
+#include "table-priv.h"
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "linker-priv.h"
+
+#undef KONST
+#undef SKONST
+
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <kfs/dyload.h>
+#include <klib/namelist.h>
+#include <klib/token.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* LoadSchema
+ *  looks in metadata for stored schema
+ *  or searches available definitions for match
+ */
+typedef struct VTableFindData VTableFindData;
+struct VTableFindData
+{
+    VLinker *linker;
+    struct KDlset *libs;
+    const VTable *vtbl;
+    const STable *stbl;
+};
+
+static
+bool CC VTableTestUntyped ( void *item, void *data )
+{
+    VTableFindData *pb = data;
+    const STable *stbl = ( const void* ) item;
+
+    if ( stbl -> untyped != NULL )
+    {
+        /* get the function pointer */
+        VUntypedTableTest test = NULL;
+        rc_t rc = VLinkerFindUntyped ( pb -> linker, pb -> libs,
+            & test, stbl -> untyped );
+        if ( rc == 0 )
+        {
+            /* ask if it recognizes the table */
+            if ( ( * test ) ( pb -> vtbl -> ktbl, pb -> vtbl -> meta ) )
+            {
+                pb -> stbl = stbl;
+                return true;
+            }
+        }
+    }
+     
+    return false;
+}
+
+static
+bool VSchemaFindUntyped ( const VSchema *self, VTableFindData *pb )
+{
+    if ( self -> dad )
+    {
+        if ( VSchemaFindUntyped ( self -> dad, pb ) )
+            return true;
+    }
+    
+    return VectorDoUntil ( & self -> tbl, false, VTableTestUntyped, pb );
+}
+
+static
+rc_t VTableFindType ( VTable *self )
+{
+    rc_t rc;
+    VTableFindData pb;
+    
+    pb . linker = self -> linker;
+    
+    rc = VLinkerOpen ( pb . linker, & pb . libs );
+    if ( rc == 0 )
+    {
+        pb . vtbl = self;
+        pb . stbl = NULL;
+        
+        /* search schema */
+        VSchemaFindUntyped ( self -> schema, & pb );
+        
+        /* record stbl */
+        self -> stbl = pb . stbl;
+        KDlsetRelease ( pb . libs );
+    }
+    return rc;
+}
+
+static
+rc_t VTableLoadSchemaNode ( VTable *self, const KMDataNode *node )
+{
+    rc_t rc;
+    
+    /* the node is probably within our 4K buffer,
+     but by using the callback mechanism we don't
+     have buffer or allocation issues. */
+    KMDataNodeSchemaFillData pb;
+    pb . node = node;
+    pb . pos = 0;
+    pb . add_v0 = false;
+    
+    /* add in schema text. it is not mandatory, but it is
+     the design of the system to store object schema with
+     the object so that it is capable of standing alone */
+    rc = VSchemaParseTextCallback ( self -> schema,
+        "VTableLoadSchema", KMDataNodeFillSchema, & pb );
+    if ( rc == 0 )
+    {
+        /* determine table type */
+        rc = KMDataNodeReadAttr ( node, "name",
+            pb . buff, sizeof pb . buff, & pb . pos );
+        if ( rc == 0 )
+        {
+            uint32_t type;
+            const SNameOverload *name;
+            
+            /* find the stbl if possible */
+            self -> stbl = VSchemaFind ( self -> schema,
+                & name, & type, pb . buff, "VTableLoadSchema", false );
+            
+            /* the schema must be found in this case */
+            if ( self -> stbl == NULL || type != eTable )
+            {
+                self -> stbl = NULL;
+                rc = RC ( rcVDB, rcTable, rcLoading, rcSchema, rcCorrupt );
+                PLOGERR ( klogInt, ( klogInt, rc, "failed to establish table type from '$(expr)'",
+                                     "expr=%s", pb . buff ));
+            }
+        }
+    }
+    return rc;
+}
+
+rc_t VTableLoadSchema ( VTable *self )
+{
+    /* try to get schema text */
+    const KMDataNode *node;
+    rc_t rc = KMetadataOpenNodeRead ( self -> meta, & node, "schema" );
+    if ( rc == 0 )
+    {
+        rc = VTableLoadSchemaNode ( self, node );
+        KMDataNodeRelease ( node );
+    }
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {
+        /* this is an older version. search schema
+         for a table having an untyped function */
+        rc = VTableFindType ( self );
+    }
+
+    return rc;
+}
+
+/* ExtendSchema
+ *  discover all existing physical and static columns
+ *  that are not represented in the table schema
+ *  and add them in ( if possible )
+ */
+static
+rc_t VTablePopulateStrayKColumn ( const VTable *self, const char *name )
+{
+    /* TBD - not returning error because the result of doing
+       nothing is simply to leave these columns inaccessible  */
+
+    /* open KColumn */
+    /* open KMetadata */
+    /* process v1 */
+    /* process v2 */
+    /* need to discover a datatype and schema information */
+    return 0;
+}
+
+static
+rc_t VTablePopulateStrayStatic ( const VTable *self,
+    const char *name, const KMDataNode *node )
+{
+    /* TBD - not returning error because the result of doing
+       nothing is simply to leave these columns inaccessible  */
+
+    /* need to discover a datatype */
+    return 0;
+}
+
+static
+bool VTableNameAvail ( const KSymTable *tbl, const char *name )
+{
+    String str;
+
+    /* build a physical name from simple name */
+    char pname [ 256 ];
+    int len = snprintf ( pname, sizeof pname, ".%s", name );
+    if ( len < 0 || len >= sizeof pname )
+        return false;
+
+    /* test for defined physical name */
+    StringInit ( & str, pname, len, len );
+    if ( KSymTableFind ( tbl, & str ) != NULL )
+        return false;
+
+    /* test for defined simple name */
+    StringSubstr ( & str, & str, 1, 0 );
+    if ( KSymTableFind ( tbl, & str ) != NULL )
+        return false;
+
+    /* name is available */
+    return true;
+}
+
+LIB_EXPORT rc_t CC VTableExtendSchema ( const VTable *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcTable, rcUpdating, rcSelf, rcNull );
+    else
+    {
+        /* create symbol table for STable */
+        KSymTable tbl;
+        rc = init_tbl_symtab ( & tbl, self -> schema, self -> stbl );
+        if ( rc == 0 )
+        {
+            KNamelist *names;
+            const char *name;
+            uint32_t i, count;
+
+            /* list all physical tables from KTable */
+            rc = KTableListCol ( self -> ktbl, & names );
+            if ( rc != 0 )
+                rc = 0;
+            else
+            {
+                rc = KNamelistCount ( names, & count );
+                for ( i = 0; rc == 0 && i < count; ++ i )
+                {
+                    /* if there are any stray columns, add them in */
+                    rc = KNamelistGet ( names, i, & name );
+                    if ( rc == 0 && VTableNameAvail ( & tbl, name ) )
+                        rc = VTablePopulateStrayKColumn ( self, name );
+                }
+
+                KNamelistRelease ( names );
+            }
+
+            if ( rc == 0 )
+            {
+                /* access table's static columns */
+                const KMDataNode *cols = self -> col_node;
+                if ( cols != NULL )
+                {
+                    /* list all columns */
+                    rc = KMDataNodeListChild ( cols, & names );
+                    if (rc == 0) {
+                        rc = KNamelistCount ( names, & count );
+                        for ( i = 0; rc == 0 && i < count; ++ i )
+                        {
+                            rc = KNamelistGet ( names, i, & name );
+                            if ( rc == 0 && VTableNameAvail ( & tbl, name ) )
+                            {
+                                const KMDataNode *node;
+                                rc = KMDataNodeOpenNodeRead ( cols, & node, "%s", name );
+                                if ( rc == 0 )
+                                {
+                                    /* add in static column */
+                                    rc = VTablePopulateStrayStatic ( self, name, node );
+                                    KMDataNodeRelease ( node );
+                                }
+                            }
+                        }
+                        KNamelistRelease ( names );
+                    }
+                }
+            }
+        }
+
+        KSymTableWhack ( & tbl );
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/table-priv.h b/libs/vdb/table-priv.h
new file mode 100644
index 0000000..fae609c
--- /dev/null
+++ b/libs/vdb/table-priv.h
@@ -0,0 +1,238 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_table_priv_
+#define _h_table_priv_
+
+#ifndef _h_vdb_table_
+#include <vdb/table.h>
+#endif
+
+#ifndef _h_schema_priv_
+#include "schema-priv.h"
+#endif
+
+#ifndef _h_vdb_schema_
+#include <vdb/schema.h>
+#endif
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef KONST
+#define KONST
+#endif
+
+#ifndef SKONST
+#define SKONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define LAZY_OPEN_COL_NODE 0
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KTable;
+struct STable;
+struct SColumn;
+struct VLinker;
+struct VDatabase;
+struct KMetadata;
+struct VDBManager;
+
+
+/*--------------------------------------------------------------------------
+ * VTable
+ *  represents a table
+ *  normally implemented as a directory
+ *  but may be a single archive file
+ *  in either executable or streamable format
+ */
+struct VTable
+{
+    /* creating manager */
+    struct VDBManager KONST *mgr;
+
+    /* enclosing database - NULL OKAY */
+    struct VDatabase KONST *db;
+
+    /* schema and table description
+       a new schema is created to house schema
+       obtained from existing table/column metadata */
+    VSchema SKONST *schema;
+    struct STable const *stbl;
+
+    /* intrinsic functions */
+    struct VLinker *linker;
+
+    /* underlying physical layer table */
+    struct KTable KONST *ktbl;
+
+    /* open table metadata */
+    struct KMetadata KONST *meta;
+
+    /* "col" subnode of metadata */
+    struct KMDataNode KONST *col_node;
+
+    /* caches of readable and writable columns */
+    BSTree read_col_cache;
+    BSTree write_col_cache;
+
+    /* user data */
+    void *user;
+    void ( CC * user_whack ) ( void *data );
+
+    /* page size for creating columns */
+    size_t pgsize;
+
+    /* open references */
+    KRefcount refcount;
+
+    /* create and checksum modes for columns */
+    uint8_t cmode;
+    uint8_t checksum;
+
+    /* open mode */
+    bool read_only;
+
+    /* cache validity */
+    bool read_col_cache_valid;
+    bool write_col_cache_valid;
+
+    /* should we perform blob validation on a file */
+    bool blob_validation;
+
+   /* cache table for cached virtual columns if any */
+    const VTable *cache_tbl;
+};
+
+
+/* Whack
+ */
+rc_t VTableWhack ( VTable *self );
+
+
+/* Attach
+ * Sever
+ *  internal reference management
+ */
+VTable *VTableAttach ( const VTable *self );
+rc_t VTableSever ( const VTable *self );
+
+
+/* Make
+ *  creates an initialized table object
+ *  expects either a mgr or a parent db,
+ *  creates a modifiable schema
+ */
+rc_t VTableMake ( VTable **tblp,
+    struct VDBManager const *mgr,
+    struct VDatabase const *db,
+    const VSchema *schema );
+
+
+/* LoadSchema
+ *  looks in metadata for stored schema
+ *  or searches available definitions for match
+ */
+rc_t VTableLoadSchema ( VTable *self );
+
+/* StoreSchema
+ *  stores schema definition in metadata
+ */
+VDB_EXTERN rc_t VTableStoreSchema ( VTable *self );
+
+/* support for listing
+ */
+rc_t make_column_namelist ( const BSTree *columns, struct KNamelist **names );
+rc_t make_column_typelist ( const BSTree *columns, const char *col,
+    uint32_t *dflt_idx, struct KNamelist **typedecls );
+
+
+/*--------------------------------------------------------------------------
+ * VColumnRef
+ *  cache entry
+ */
+typedef struct VColumnRef VColumnRef;
+struct VColumnRef
+{
+    BSTNode n;
+    String name;
+    VTypedecl td;
+    VCtxId cid;
+    bool dflt;
+    char typedecl [ 2 ];
+};
+
+
+/* Whack
+ *  for dropping a BSTree
+ */
+void CC VColumnRefWhack ( BSTNode *n, void *ignore );
+
+
+/* Make
+ *  make a column ref from an SColumn*
+ */
+rc_t VColumnRefMake ( VColumnRef **cref,
+    const VSchema *schema, struct SColumn const *scol );
+
+
+/* CmpString
+ *  compares by name only
+ *  "item" is a const String*
+ */
+int64_t CC VColumnRefCmpString ( const void *item, const BSTNode *n );
+
+/* Sort
+ *  compares by (name,type) pair
+ */
+int64_t CC VColumnRefSort ( const BSTNode *item, const BSTNode *n );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_table_priv_ */
diff --git a/libs/vdb/table.c b/libs/vdb/table.c
new file mode 100644
index 0000000..ed2d71d
--- /dev/null
+++ b/libs/vdb/table.c
@@ -0,0 +1,109 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define KONST const
+#include "table-priv.h"
+#undef KONST
+
+#include <klib/namelist.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+/* List
+ *  (moved from table-cmn.c to here, because needs access to VCursor...)
+ *  create a namelist of all usable columns :
+ *  columns, that can be added to a cursor - and the following cursor-open will not fail
+ */
+LIB_EXPORT rc_t CC VTableListWritableColumns ( struct VTable *self, KNamelist **names )
+{
+    rc_t rc;
+
+    if ( names == NULL )
+        rc = RC ( rcVDB, rcTable, rcListing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcSelf, rcNull );
+        else
+        {
+            VNamelist *list;
+            rc = VNamelistMake ( & list, 0 );
+            if ( rc == 0 )
+            {
+                rc = VNamelistToNamelist ( list, names );
+                VNamelistRelease ( list );
+                return rc;
+            }
+        }
+
+        * names = NULL;
+    }
+    return rc;
+}
+
+
+/* ListDatatypes
+ *  returns list of typedecls for named column
+ *
+ *  "col" [ IN ] - column name
+ *
+ *  "typedecls" [ OUT ] - list of datatypes available for named column
+ *
+ *  availability: v2.1
+ */
+LIB_EXPORT rc_t CC VTableListWritableDatatypes ( struct VTable *self,
+    const char *col, KNamelist **typedecls )
+{
+    rc_t rc;
+    
+    if ( typedecls == NULL )
+        rc = RC ( rcVDB, rcTable, rcListing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcSelf, rcNull );
+        else if ( col == NULL )
+            rc = RC ( rcVDB, rcSchema, rcListing, rcName, rcNull );
+        else if ( col [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcSchema, rcListing, rcName, rcEmpty );
+        else
+        {
+            /* make eventually returned */
+            VNamelist *vlist;
+            rc = VNamelistMake ( &vlist, 0 );
+            if ( rc == 0 )
+            {
+                rc = VNamelistToNamelist ( vlist, typedecls );
+                VNamelistRelease ( vlist );
+                return rc;
+            }
+        }
+
+        * typedecls = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/test/Makefile b/libs/vdb/test/Makefile
new file mode 100644
index 0000000..dbd648c
--- /dev/null
+++ b/libs/vdb/test/Makefile
@@ -0,0 +1,51 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: runtests
+
+TOP ?= $(abspath ../../..)
+MODULE = libs/vdb/test
+
+TEST_TOOLS=\
+	test-prod-cmn
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+clean: stdclean
+
+LIB=\
+	-skapp \
+	-sncbi-vdb
+
+VDB_DIR=../
+
+OBJ=$(addsuffix .$(OBJX),test-prod-cmn)
+
+$(TEST_BINDIR)/test-prod-cmn: $(OBJ) $(addprefix $(VDB_DIR),prod-cmn.c)
+	$(LD) --exe -o $@ $(OBJ) $(LIB)
+
diff --git a/libs/vdb/test/test-prod-cmn.c b/libs/vdb/test/test-prod-cmn.c
new file mode 100644
index 0000000..7d46374
--- /dev/null
+++ b/libs/vdb/test/test-prod-cmn.c
@@ -0,0 +1,10 @@
+#include <stdio.h>
+
+#define UNIT_TEST_VDB_3058 (1)
+#include "../prod-cmn.c"
+
+int main(int argc, char *argv[])
+{
+    UnitTest_VDB_3058();
+    return 0;
+}
diff --git a/libs/vdb/transpose.c b/libs/vdb/transpose.c
new file mode 100644
index 0000000..3b585ab
--- /dev/null
+++ b/libs/vdb/transpose.c
@@ -0,0 +1,720 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <klib/rc.h>
+
+#include "xform-priv.h"
+#include "blob-priv.h"
+#include "blob.h"
+#include "page-map.h"
+
+#include <assert.h>
+
+
+/* Create
+ *
+ * Create a new blob.  A new data buffer is sized to
+ * 'element_count' * sizeof datatype; its contents are
+ * uninitialized.
+ */
+static
+rc_t VBlobCreate ( VBlob **blobp, const VBlob *in )
+{
+    rc_t rc = VBlobNew ( blobp, in -> start_id, in -> stop_id, "transpose" );
+    if ( rc == 0 )
+    {
+        VBlob *blob = * blobp;
+        rc = KDataBufferMake ( & blob -> data,
+            in -> data . elem_bits, in -> data . elem_count );
+        if ( rc != 0 )
+        {
+            VBlobRelease ( blob );
+            * blobp = NULL;
+        }
+        else
+        {
+            blob -> byte_order = in -> byte_order;
+        }
+    }
+    return rc;
+}
+
+
+/* detranspose
+ *  pardoning the awful name, apply a transposition on the result
+ *  of "transpose" to produce the original blob. "transpose"
+ *  itself cannot be reused because of its signature.
+ *
+ *  see "transpose" below for an explanation
+ */
+static
+rc_t CC transpose_formatted8 ( void *self, const VXformInfo *info, int64_t row_id,
+    VBlob **rslt, uint32_t argc, const VBlob *argv [] )
+{
+    /* input blob - schema assures us that it is ready to go */
+    const VBlob *in = argv [ 0 ];
+
+    /* allocate output blob of same size */
+    rc_t rc = VBlobCreate ( rslt, in );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+    else
+    {
+        VBlob *out = * rslt;
+
+        /* page-map iterator */
+        PageMapIterator it;
+        rc = PageMapNewIterator ( in -> pm, & it, 0, -1 );
+
+        /* create a new reference to the page map */
+        if ( rc == 0 )
+            rc = PageMapAddRef ( in -> pm );
+
+        /* last chance for failure */
+        if ( rc != 0 )
+        {
+            rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+            VBlobRelease ( out );
+            * rslt = NULL;
+        }
+        else
+        {
+            uint32_t j, k;
+            elem_count_t i, max_row_len, row_len, rpt_cnt;
+
+            /* get source and destination pointers */
+            uint8_t *dst = out -> data . base;
+            const uint8_t *src = in -> data . base;
+
+            /* set page-map on out */
+            out -> pm = in -> pm;
+
+            /* perform the transformation
+               the first pass will determine maximum row length */
+            for ( max_row_len = 0, j = k = 0; ;  k += row_len )
+            {
+                row_len = PageMapIteratorDataLength ( & it );
+                if ( row_len > max_row_len )
+                    max_row_len = row_len;
+
+                if ( row_len != 0 )
+                {
+                    dst [ k ] = src [ j ];
+                    ++ j;
+                }
+
+                rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                    break;
+            }
+
+            /* perform transformation on the remainder */
+            for ( i = 1; i < max_row_len; ++ i )
+            {
+                it . cur_row = 0;
+                for ( k = i; ; k += row_len )
+                {
+                    row_len = PageMapIteratorDataLength ( & it );
+                    if ( row_len > i )
+                    {
+                        dst [ k ] = src [ j ];
+                        ++ j;
+                    }
+
+                    rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                    if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                        break;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t CC transpose_formatted16 ( void *self, const VXformInfo *info, int64_t row_id,
+    VBlob **rslt, uint32_t argc, const VBlob *argv [] )
+{
+    const VBlob *in = argv [ 0 ];
+    rc_t rc = VBlobCreate ( rslt, in );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+    else
+    {
+        VBlob *out = * rslt;
+        PageMapIterator it;
+        rc = PageMapNewIterator ( in -> pm, & it, 0, -1 );
+        if ( rc == 0 )
+            rc = PageMapAddRef ( in -> pm );
+        if ( rc != 0 )
+        {
+            rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+            VBlobRelease ( out );
+            * rslt = NULL;
+        }
+        else
+        {
+            uint32_t j, k;
+            elem_count_t i, max_row_len, row_len, rpt_cnt;
+            uint16_t *dst = out -> data . base;
+            const uint16_t *src = in -> data . base;
+            out -> pm = in -> pm;
+            for ( max_row_len = 0, j = k = 0; ;  k += row_len )
+            {
+                row_len = PageMapIteratorDataLength ( & it );
+                if ( row_len > max_row_len )
+                    max_row_len = row_len;
+                if ( row_len != 0 )
+                {
+                    dst [ k ] = src [ j ];
+                    ++ j;
+                }
+                rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                    break;
+            }
+            for ( i = 1; i < max_row_len; ++ i )
+            {
+                it . cur_row = 0;
+                for ( k = i; ; k += row_len )
+                {
+                    row_len = PageMapIteratorDataLength ( & it );
+                    if ( row_len > i )
+                    {
+                        dst [ k ] = src [ j ];
+                        ++ j;
+                    }
+                    rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                    if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                        break;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t CC transpose_formatted32 ( void *self, const VXformInfo *info, int64_t row_id,
+    VBlob **rslt, uint32_t argc, const VBlob *argv [] )
+{
+    const VBlob *in = argv [ 0 ];
+    rc_t rc = VBlobCreate ( rslt, in );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+    else
+    {
+        VBlob *out = * rslt;
+        PageMapIterator it;
+        rc = PageMapNewIterator ( in -> pm, & it, 0, -1 );
+        if ( rc == 0 )
+            rc = PageMapAddRef ( in -> pm );
+        if ( rc != 0 )
+        {
+            rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+            VBlobRelease ( out );
+            * rslt = NULL;
+        }
+        else
+        {
+            uint32_t j, k;
+            elem_count_t i, max_row_len, row_len, rpt_cnt;
+            uint32_t *dst = out -> data . base;
+            const uint32_t *src = in -> data . base;
+            out -> pm = in -> pm;
+            for ( max_row_len = 0, j = k = 0; ;  k += row_len )
+            {
+                row_len = PageMapIteratorDataLength ( & it );
+                if ( row_len > max_row_len )
+                    max_row_len = row_len;
+                if ( row_len != 0 )
+                {
+                    dst [ k ] = src [ j ];
+                    ++ j;
+                }
+                rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                    break;
+            }
+            for ( i = 1; i < max_row_len; ++ i )
+            {
+                it . cur_row = 0;
+                for ( k = i; ; k += row_len )
+                {
+                    row_len = PageMapIteratorDataLength ( & it );
+                    if ( row_len > i )
+                    {
+                        dst [ k ] = src [ j ];
+                        ++ j;
+                    }
+                    rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                    if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                        break;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t CC transpose_formatted64 ( void *self, const VXformInfo *info, int64_t row_id,
+    VBlob **rslt, uint32_t argc, const VBlob *argv [] )
+{
+    const VBlob *in = argv [ 0 ];
+    rc_t rc = VBlobCreate ( rslt, in );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+    else
+    {
+        VBlob *out = * rslt;
+        PageMapIterator it;
+        rc = PageMapNewIterator ( in -> pm, & it, 0, -1 );
+        if ( rc == 0 )
+            rc = PageMapAddRef ( in -> pm );
+        if ( rc != 0 )
+        {
+            rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+            VBlobRelease ( out );
+            * rslt = NULL;
+        }
+        else
+        {
+            uint32_t j, k;
+            elem_count_t i, max_row_len, row_len, rpt_cnt;
+            uint64_t *dst = out -> data . base;
+            const uint64_t *src = in -> data . base;
+            out -> pm = in -> pm;
+            for ( max_row_len = 0, j = k = 0; ;  k += row_len )
+            {
+                row_len = PageMapIteratorDataLength ( & it );
+                if ( row_len > max_row_len )
+                    max_row_len = row_len;
+                if ( row_len != 0 )
+                {
+                    dst [ k ] = src [ j ];
+                    ++ j;
+                }
+                rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                    break;
+            }
+            for ( i = 1; i < max_row_len; ++ i )
+            {
+                it . cur_row = 0;
+                for ( k = i; ; k += row_len )
+                {
+                    row_len = PageMapIteratorDataLength ( & it );
+                    if ( row_len > i )
+                    {
+                        dst [ k ] = src [ j ];
+                        ++ j;
+                    }
+                    rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                    if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                        break;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+VTRANSFACT_BUILTIN_IMPL ( vdb_detranspose, 1, 0, 0 )
+    ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    switch ( VTypedescSizeof ( & info -> fdesc . desc ) )
+    {
+    case 8:
+        VFUNCDESC_INTERNAL_FUNCS ( rslt ) -> bfN = transpose_formatted8;
+        break;
+    case 16:
+        VFUNCDESC_INTERNAL_FUNCS ( rslt ) -> bfN = transpose_formatted16;
+        break;
+    case 32:
+        VFUNCDESC_INTERNAL_FUNCS ( rslt ) -> bfN = transpose_formatted32;
+        break;
+    case 64:
+        VFUNCDESC_INTERNAL_FUNCS ( rslt ) -> bfN = transpose_formatted64;
+        break;
+    }
+
+    rslt -> variant = vftBlobN;
+    return 0;
+}
+
+/* transpose
+ *  transpose a page of unformatted data
+ *
+ *  for example - convert a simple page of values,
+ *  where vertical scale is row id and horizontal element index:
+ *
+ *        1   2   3
+ *      +---+---+---+
+ *    1 | a | b | c |
+ *      +---+---+---+
+ *    2 | d | e |
+ *      +---+---+
+ *    3 | f |
+ *      +---+---+---+
+ *    4 | g | h | i |
+ *      +---+---+---+
+ *
+ *  into:
+ *
+ *        1   2   3   4
+ *      +---+---+---+---+
+ *    1 | a | d | f | g |
+ *      +---+---+---+---+
+ *    2 | b | e |   | h |
+ *      +---+---+   +---+
+ *    3 | c |       | i |
+ *      +---+       +---+
+ *
+ *  or:
+ *
+ *      +---+---+---+---+---+---+---+---+---+
+ *      | a | d | f | g | b | e | h | c | i |
+ *      +---+---+---+---+---+---+---+---+---+
+ *
+ *  variable row-lengths are supported. The output blob is
+ *  formatted, meaning that the result can no longer be addressed
+ *  as a matrix, but the transposition has be applied to data.
+ *
+ *  "in" [ DATA ] - unformatted data to be transposed
+ */
+static
+rc_t CC transpose_unformatted8 ( void *self, const VXformInfo *info, int64_t row_id,
+    VBlob **rslt, uint32_t argc, const VBlob *argv [] )
+{
+    /* input blob - schema assures us that it is ready to go */
+    const VBlob *in = argv [ 0 ];
+
+    /* allocate output blob of same size */
+    rc_t rc = VBlobCreate ( rslt, in );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+    else
+    {
+        VBlob *out = * rslt;
+
+        /* page-map iterator */
+        PageMapIterator it;
+        rc = PageMapNewIterator ( in -> pm, & it, 0, -1 );
+
+        /* create a new reference to the page map */
+        if ( rc == 0 )
+            rc = PageMapAddRef ( in -> pm );
+
+        /* last chance for failure */
+        if ( rc != 0 )
+        {
+            rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+            VBlobRelease ( out );
+            * rslt = NULL;
+        }
+        else
+        {
+            uint32_t j, k;
+            elem_count_t i, max_row_len, row_len, rpt_cnt;
+
+            /* get source and destination pointers */
+            uint8_t *dst = out -> data . base;
+            const uint8_t *src = in -> data . base;
+
+            /* set page-map on out */
+            out -> pm = in -> pm;
+
+            /* perform the transformation
+               the first pass will determine maximum row length */
+            for ( max_row_len = 0, j = k = 0; ;  k += row_len )
+            {
+                row_len = PageMapIteratorDataLength ( & it );
+                if ( row_len > max_row_len )
+                    max_row_len = row_len;
+
+                if ( row_len != 0 )
+                {
+                    dst [ j ] = src [ k ];
+                    ++ j;
+                }
+
+                rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                    break;
+            }
+
+            /* perform transformation on the remainder */
+            for ( i = 1; i < max_row_len; ++ i )
+            {
+                it . cur_row = 0;
+                for ( k = i; ; k += row_len )
+                {
+                    row_len = PageMapIteratorDataLength ( & it );
+                    if ( row_len > i )
+                    {
+                        dst [ j ] = src [ k ];
+                        ++ j;
+                    }
+
+                    rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                    if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                        break;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t CC transpose_unformatted16 ( void *self, const VXformInfo *info, int64_t row_id,
+    VBlob **rslt, uint32_t argc, const VBlob *argv [] )
+{
+    const VBlob *in = argv [ 0 ];
+    rc_t rc = VBlobCreate ( rslt, in );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+    else
+    {
+        VBlob *out = * rslt;
+        PageMapIterator it;
+        rc = PageMapNewIterator ( in -> pm, & it, 0, -1 );
+        if ( rc == 0 )
+            rc = PageMapAddRef ( in -> pm );
+        if ( rc != 0 )
+        {
+            rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+            VBlobRelease ( out );
+            * rslt = NULL;
+        }
+        else
+        {
+            uint32_t j, k;
+            elem_count_t i, max_row_len, row_len, rpt_cnt;
+            uint16_t *dst = out -> data . base;
+            const uint16_t *src = in -> data . base;
+            out -> pm = in -> pm;
+            for ( max_row_len = 0, j = k = 0; ;  k += row_len )
+            {
+                row_len = PageMapIteratorDataLength ( & it );
+                if ( row_len > max_row_len )
+                    max_row_len = row_len;
+                if ( row_len != 0 )
+                {
+                    dst [ j ] = src [ k ];
+                    ++ j;
+                }
+                rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                    break;
+            }
+            for ( i = 1; i < max_row_len; ++ i )
+            {
+                it . cur_row = 0;
+                for ( k = i; ; k += row_len )
+                {
+                    row_len = PageMapIteratorDataLength ( & it );
+                    if ( row_len > i )
+                    {
+                        dst [ j ] = src [ k ];
+                        ++ j;
+                    }
+                    rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                    if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                        break;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t CC transpose_unformatted32 ( void *self, const VXformInfo *info, int64_t row_id,
+    VBlob **rslt, uint32_t argc, const VBlob *argv [] )
+{
+    const VBlob *in = argv [ 0 ];
+    rc_t rc = VBlobCreate ( rslt, in );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+    else
+    {
+        VBlob *out = * rslt;
+        PageMapIterator it;
+        rc = PageMapNewIterator ( in -> pm, & it, 0, -1 );
+        if ( rc == 0 )
+            rc = PageMapAddRef ( in -> pm );
+        if ( rc != 0 )
+        {
+            rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+            VBlobRelease ( out );
+            * rslt = NULL;
+        }
+        else
+        {
+            uint32_t j, k;
+            elem_count_t i, max_row_len, row_len, rpt_cnt;
+            uint32_t *dst = out -> data . base;
+            const uint32_t *src = in -> data . base;
+            out -> pm = in -> pm;
+            for ( max_row_len = 0, j = k = 0; ;  k += row_len )
+            {
+                row_len = PageMapIteratorDataLength ( & it );
+                if ( row_len > max_row_len )
+                    max_row_len = row_len;
+                if ( row_len != 0 )
+                {
+                    dst [ j ] = src [ k ];
+                    ++ j;
+                }
+                rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                    break;
+            }
+            for ( i = 1; i < max_row_len; ++ i )
+            {
+                it . cur_row = 0;
+                for ( k = i; ; k += row_len )
+                {
+                    row_len = PageMapIteratorDataLength ( & it );
+                    if ( row_len > i )
+                    {
+                        dst [ j ] = src [ k ];
+                        ++ j;
+                    }
+                    rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                    if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                        break;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t CC transpose_unformatted64 ( void *self, const VXformInfo *info, int64_t row_id,
+    VBlob **rslt, uint32_t argc, const VBlob *argv [] )
+{
+    const VBlob *in = argv [ 0 ];
+    rc_t rc = VBlobCreate ( rslt, in );
+    if ( rc != 0 )
+        rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+    else
+    {
+        VBlob *out = * rslt;
+        PageMapIterator it;
+        rc = PageMapNewIterator ( in -> pm, & it, 0, -1 );
+        if ( rc == 0 )
+            rc = PageMapAddRef ( in -> pm );
+        if ( rc != 0 )
+        {
+            rc = ResetRCContext ( rc, rcVDB, rcFunction, rcExecuting );
+            VBlobRelease ( out );
+            * rslt = NULL;
+        }
+        else
+        {
+            uint32_t j, k;
+            elem_count_t i, max_row_len, row_len, rpt_cnt;
+            uint64_t *dst = out -> data . base;
+            const uint64_t *src = in -> data . base;
+            out -> pm = in -> pm;
+            for ( max_row_len = 0, j = k = 0; ;  k += row_len )
+            {
+                row_len = PageMapIteratorDataLength ( & it );
+                if ( row_len > max_row_len )
+                    max_row_len = row_len;
+                if ( row_len != 0 )
+                {
+                    dst [ j ] = src [ k ];
+                    ++ j;
+                }
+                rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                    break;
+            }
+            for ( i = 1; i < max_row_len; ++ i )
+            {
+                it . cur_row = 0;
+                for ( k = i; ; k += row_len )
+                {
+                    row_len = PageMapIteratorDataLength ( & it );
+                    if ( row_len > i )
+                    {
+                        dst [ j ] = src [ k ];
+                        ++ j;
+                    }
+                    rpt_cnt = PageMapIteratorRepeatCount ( & it );
+                    if ( ! PageMapIteratorAdvance ( & it, rpt_cnt ) )
+                        break;
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+VTRANSFACT_BUILTIN_IMPL ( vdb_transpose, 1, 0, 0 )
+    ( const void *self, const VXfactInfo *info, VFuncDesc *rslt,
+      const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* the TYPE of input has been validated by schema, but not the dimension */
+    switch ( VTypedescSizeof ( & dp -> argv [ 0 ] . desc ) )
+    {
+    case 8:
+        VFUNCDESC_INTERNAL_FUNCS ( rslt ) -> bfN = transpose_unformatted8;
+        break;
+    case 16:
+        VFUNCDESC_INTERNAL_FUNCS ( rslt ) -> bfN = transpose_unformatted16;
+        break;
+    case 32:
+        VFUNCDESC_INTERNAL_FUNCS ( rslt ) -> bfN = transpose_unformatted32;
+        break;
+    case 64:
+        VFUNCDESC_INTERNAL_FUNCS ( rslt ) -> bfN = transpose_unformatted64;
+        break;
+    default:
+        return RC ( rcVDB, rcFunction, rcConstructing, rcType, rcUnsupported );
+    }
+
+    rslt -> variant = vftBlobN;
+    return 0;
+}
diff --git a/libs/vdb/wcolumn.c b/libs/vdb/wcolumn.c
new file mode 100644
index 0000000..1c2f8cc
--- /dev/null
+++ b/libs/vdb/wcolumn.c
@@ -0,0 +1,1074 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "klib/symbol.h"
+#include "column-priv.h"
+#include "dbmgr-priv.h"
+#include "schema-priv.h"
+#include "schema-expr.h"
+#include "schema-parse.h"
+#include "cursor-priv.h"
+#include "prod-priv.h"
+#include "blob-priv.h"
+#include "page-map.h"
+
+#include <vdb/manager.h>
+#include <vdb/cursor.h>
+#include <kdb/column.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+/* these constants MUST each be a power of two */
+#define INITIAL_DATA_PEAK ( 32 * 1024 )
+#define SINGLE_PAGE_SIZE ( 4 * 1024 )
+
+/* this is a fairly high value, useful for writing single tables
+   of data that are generally accessed serially. it's bad for random. */
+#define DFLT_TRIGGER ( 2 * 1024 * 1024 )
+
+/* debugging aid - Row-wise RunLengthEncoding ( repeated column
+   elimination ) can be disabled to check for errors it may introduce. */
+#define USE_RLE 1
+
+/* when defined, use as an additional condition for detecting
+   auto-commit cutoff points, with a limit in kilo-rows given below */
+#define ROW_COUNT_CUTOFFS 128
+
+#if ROW_COUNT_CUTOFFS
+#define MAX_ROW_COUNT ( ROW_COUNT_CUTOFFS * 1024 )
+#else
+#define MAX_ROW_COUNT 0x40000000
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * VColumn
+ */
+
+static 
+void WColumnDestroy ( WColumn * self )
+{
+#if PROD_REFCOUNT && ! PROD_ALL_IN_CURSOR
+    PROD_TRACK_REFCOUNT ( VProductionRelease, self -> out );
+    VProductionRelease ( self -> out, NULL );
+    PROD_TRACK_REFCOUNT ( VProductionRelease, self -> val );
+    VProductionRelease ( self -> val, NULL );
+#endif
+}
+
+
+/* Whack
+ *  perform read-only cleanup
+ */
+void CC VColumnWhack ( void *item, void *data )
+{
+    VColumn *self = item;
+    VCursor *curs = data;
+
+    /* remove from cursor */
+    if ( curs != NULL )
+    {
+        VectorSwap ( & curs -> row, self -> ord, NULL, & item );
+        VCursorCacheSwap ( & curs -> col, & self -> scol -> cid, NULL, & item );
+    }
+
+    if ( ! self -> read_only )
+    {
+        WColumn *wself = ( WColumn* ) self;
+
+        if ( wself -> page != NULL )
+        {
+            TRACK_BLOB (VBlobRelease, wself->page);
+            VBlobRelease ( wself -> page );
+        }
+
+        KDataBufferWhack ( & wself -> dflt );
+        KDataBufferWhack ( & wself -> data );
+        KDataBufferWhack ( & wself -> rowmap );
+        WColumnDestroy ( wself );
+
+    }
+
+    VColumnDestroy ( self );
+    free ( self );
+}
+
+
+/* Make - PRIVATE
+ *  make a write column
+ */
+rc_t WColumnMake ( VColumn **colp, const VSchema *schema, const SColumn *scol,
+    const SExpression *blob_limit, VDBManager *mgr, Vector *cx_bind )
+{
+    rc_t rc;
+    WColumn *col;
+
+    assert ( colp != NULL );
+    assert ( schema != NULL );
+    assert ( scol != NULL );
+    assert ( mgr != NULL );
+
+    col = calloc ( 1, sizeof * col );
+    if ( col == NULL )
+        rc = RC ( rcVDB, rcColumn, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = VColumnInit ( & col -> dad, schema, scol );
+        if ( rc == 0 )
+        {
+            uint32_t i;
+
+            /* initialize peak histories */
+            for ( i = 0; i < sizeof col -> data_peak_hist / sizeof col -> data_peak_hist [ 0 ]; ++ i )
+                col -> data_peak_hist [ i ] = INITIAL_DATA_PEAK;
+
+            /* initial current peak */
+            col -> data_peak = INITIAL_DATA_PEAK;
+
+            /* use column-specific expression if provided */
+            if ( scol -> limit != NULL )
+                blob_limit = scol -> limit;
+
+            /* evaluate blob cutoff limit expression */
+            if ( blob_limit == NULL )
+            {
+#ifdef DFLT_TRIGGER
+                /* use define */
+                col -> trigger = DFLT_TRIGGER;
+#else
+                /* produce max unsigned integer */
+                -- col -> trigger;
+#endif
+            }
+            else
+            {
+                /* evaluate column blob limit */
+                uint64_t trigger;
+                rc = eval_uint64_expr ( schema, blob_limit, & trigger, cx_bind );
+                col -> trigger = ( size_t ) trigger;
+            }
+
+            if ( rc == 0 )
+            {
+                * colp = & col -> dad;
+                return 0;
+            }
+        }
+
+        free ( col );
+    }
+
+    * colp = NULL;
+    return rc;
+}
+
+
+/* IdRange
+ *  returns id range for column or page
+ */
+rc_t VColumnIdRange ( const VColumn *vcol, int64_t *first, int64_t *last )
+{
+    rc_t rc;
+    const WColumn *self = ( const WColumn* ) vcol;
+
+    assert ( self != NULL );
+    assert ( first != NULL && last != NULL );
+
+    if ( self -> dad . in != NULL )
+        return VColumnIdRangeRead ( & self -> dad, first, last );
+
+    if ( self -> val == NULL )
+        rc = RC ( rcVDB, rcColumn, rcAccessing, rcRange, rcNotOpen );
+    else
+    {
+        /* a little silly, but set max range in 64-bit
+           without complaints from 32-bit compilers */
+        * first = 1;
+        * first <<= 63;
+        * last = ~ * first;
+
+        /* now intersect this range with all physical sources */
+        rc = VProductionColumnIdRange ( self -> val, first, last );
+        if ( rc == 0 )
+            return 0;
+    }
+
+    * first = * last = 0;
+
+    return rc;
+}
+
+/* SetDefault
+ *  capture default row data
+ */
+rc_t WColumnSetDefault ( VColumn *vcol,
+    bitsz_t elem_bits, const void *buffer, bitsz_t boff, uint64_t len )
+{
+    rc_t rc;
+    bitsz_t elem_size, to_copy;
+    WColumn *self = ( WColumn* ) vcol;
+
+    assert ( elem_bits != 0 );
+    assert ( buffer != NULL || ( boff == 0 && len == 0 ) );
+
+    /* test "compatibility" of elem_bits
+       this is used to interpret "len" */
+    elem_size = VTypedescSizeof ( & self -> dad . desc );
+    if ( elem_bits < elem_size && elem_size % elem_bits != 0 )
+        return RC ( rcVDB, rcColumn, rcUpdating, rcType, rcInconsistent );
+    if ( elem_bits > elem_size && elem_bits % elem_size != 0 )
+        return RC ( rcVDB, rcColumn, rcUpdating, rcType, rcInconsistent );
+
+    /* forget about prior value */
+    KDataBufferWhack ( & self -> dflt );
+    memset ( & self -> dflt, 0, sizeof self -> dflt );
+    self -> have_dflt = false;
+    self -> dflt_last = false;
+
+    /* set the element size */
+    rc = KDataBufferCast ( & self -> dflt, & self -> dflt, elem_bits, false );
+    if ( rc != 0 )
+        return rc;
+        
+    /* allow NULL setting */
+    if ( buffer == NULL )
+    {
+        self -> have_dflt = true;
+        return 0;
+    }
+
+    /* set the length */
+    rc = KDataBufferResize ( & self -> dflt, len );
+    if ( rc != 0 )
+    {
+        assert ( KDataBufferWritable ( & self -> dflt ) );
+        return rc;
+    }
+
+    /* copy in the row */
+    to_copy = len * elem_bits;
+    if ( ( ( boff | to_copy ) & 7 ) != 0 )
+        bitcpy ( self -> dflt . base, 0, buffer, boff, to_copy );
+    else
+        memmove ( self -> dflt . base, & ( ( const uint8_t* ) buffer ) [ boff >> 3 ], to_copy >> 3 );
+
+    self -> have_dflt = true;
+    return 0;
+}
+
+
+/* OpenRow
+ *  update state
+ *
+ *  "const_row_id" [ IN, CONST ] - id of row being opened. useful
+ *  only on initial open when no other rows are buffered.
+ */
+void CC WColumnOpenRow ( void *item, void *const_row_id )
+{
+    WColumn *self = item;
+    if ( self != NULL )
+    {
+        int64_t row_id = * ( const int64_t* ) const_row_id;
+
+        assert ( ! self -> row_written );
+        if ( self -> start_id != self -> end_id )
+        {
+            assert ( row_id == self -> end_id );
+        }
+        else
+        {
+            /* capture row id */
+            self -> start_id = self -> end_id = self -> cutoff_id = row_id;
+            assert ( self -> bits_in_buffer == 0 );
+            assert ( self -> row_len == 0 );
+            assert ( self -> num_rows == 0 );
+            assert ( self -> dflt_last == false );
+        }
+    }
+}
+
+
+/* Write
+ */
+rc_t WColumnWrite ( VColumn *cself,
+    bitsz_t elem_bits, const void *buffer, bitsz_t boff, uint64_t len )
+{
+    WColumn *self = ( WColumn* ) cself;
+
+    bitsz_t elem_size, num_bits, data_bits, doff;
+
+    assert ( elem_bits != 0 );
+    assert ( buffer != NULL || ( boff == 0 && len == 0 ) );
+
+    /* the number of bits to write */
+    num_bits = ( bitsz_t ) elem_bits * len;
+
+    /* test "compatibility" of elem_bits
+       this is used to interpret "len" */
+    elem_size = VTypedescSizeof ( & self -> dad . desc );
+    if ( elem_bits != elem_size )
+    {
+        if ( elem_bits < elem_size && elem_size % elem_bits != 0 )
+            return RC ( rcVDB, rcColumn, rcUpdating, rcType, rcInconsistent );
+        if ( elem_bits > elem_size && elem_bits % elem_size != 0 )
+            return RC ( rcVDB, rcColumn, rcUpdating, rcType, rcInconsistent );
+        if ( num_bits % elem_size != 0 )
+            return RC ( rcVDB, rcColumn, rcUpdating, rcType, rcInconsistent );
+    }
+
+    /* allow empty row */
+    if ( len == 0 )
+    {
+        self -> row_written = true;
+        self -> dflt_last = false;
+        return 0;
+    }
+
+    /* disallow any further modifications */
+    if ( self -> row_committed )
+        return RC ( rcVDB, rcColumn, rcUpdating, rcColumn, rcBusy );
+
+    /* total number of bits to be put into buffer */
+    doff = self -> bits_in_buffer + self -> row_len;
+    data_bits = doff + num_bits;
+
+    /* see if it fits into buffer */
+    if ( data_bits > KDataBufferBits ( & self -> data ) )
+    {
+        rc_t rc;
+
+        /* calculate needed bytes */
+        size_t new_size = ( ( size_t ) ( ( data_bits + 7 ) >> 3 ) + INITIAL_DATA_PEAK - 1 )
+            & ~ ( size_t ) ( INITIAL_DATA_PEAK - 1 );
+
+        /* need buffer memory */
+        if ( self -> data . elem_count == 0 )
+        {
+            /* always go with the peak size if larger */
+            if ( new_size < self -> data_peak )
+                new_size = self -> data_peak;
+
+            /* make initial buffer at most recent peak */
+            rc = KDataBufferMakeBytes ( & self -> data, new_size );
+            if ( rc != 0 )
+                return rc;
+        }
+        else
+        {
+            /* we have a new peak */
+            rc = KDataBufferResize ( & self -> data, new_size );
+            if ( rc != 0 )
+                return rc;
+        }
+    }
+
+    /* copy in data */
+    if ( ( ( boff | doff | num_bits ) & 7 ) != 0 )
+        bitcpy ( self -> data . base, doff, buffer, boff, num_bits );
+    else
+    {
+        memmove ( & ( ( uint8_t* ) self -> data . base ) [ doff >> 3 ],
+                 & ( ( const uint8_t* ) buffer ) [ boff >> 3 ], num_bits >> 3 );
+    }
+
+    /* accept changes */
+    self -> row_len += num_bits;
+    self -> row_written = true;
+    self -> dflt_last = false;
+
+    return 0;
+}
+
+/* RowDefaults
+ *  if a row has not been written but has a default value,
+ *  that value is written to the row. if no default exists,
+ *  an error is generated.
+ *
+ *  "rc" [ OUT, DEFAULT ZERO ] - preset to 0
+ *
+ *  returns true if any error occurs ( i.e. "*rc != 0" )
+ */
+bool CC WColumnRowDefaults ( void *item, void *data )
+{
+    WColumn *self = item;
+    rc_t *rc = data;
+
+    /* nothing to do if row written */
+    if ( self == NULL || self -> row_written )
+        return false;
+
+    /* error if no default value */
+    if ( ! self -> have_dflt )
+    {
+        * rc = RC ( rcVDB, rcColumn, rcClosing, rcRow, rcIncomplete );
+        PLOGERR ( klogErr,
+                  ( klogErr, * rc, "Column: $(col)", "col=%.*s"
+                    , self -> dad . scol -> name -> name . size
+                    , self -> dad . scol -> name -> name . addr )
+            );
+        return true;
+    }
+        
+    /* detect NULL row as default */
+    if ( self -> dflt . elem_bits == 0 )
+    {
+        * rc = RC ( rcVDB, rcColumn, rcClosing, rcRow, rcNull );
+        PLOGERR ( klogWarn,
+                  ( klogWarn, * rc, "Column: $(col)", "col=%.*s"
+                    , self -> dad . scol -> name -> name . size
+                    , self -> dad . scol -> name -> name . addr )
+            );
+        return false;
+    }
+
+    /* if the last column written was default,
+       there is an opportunity for simply incrementing the repeat count */
+    if ( USE_RLE && self -> dflt_last )
+    {
+        WColumnRowMap *rm = self -> rowmap . base;
+        assert ( self -> num_rows != 0 );
+        ++ rm [ self -> num_rows - 1 ] . cnt;
+        return false;
+    }
+
+    /* write default data */
+    * rc = WColumnWrite ( & self -> dad, self -> dflt . elem_bits,
+        self -> dflt . base, 0, self -> dflt . elem_count );
+    if ( * rc != 0 )
+        return true;
+    
+    /* record the fact that this was default */
+    self -> dflt_last = true;
+    return false;
+}
+
+/* CommitRow
+ *  closes the row to further writes and accepts
+ *  all data written so far as complete. if the accumulated
+ *  page data trigger a flush, the flush parameter is set.
+ *
+ *  "end_id" [ IN/OUT ] - used to calculate the minimum
+ *  end_id for pages. if the column decides that it has too
+ *  much data in its buffer and wants a cutoff < current
+ *  value, it can lower the id.
+ *
+ *  returns true if there was a memory error.
+ */
+static
+bool WColumnCommitRepeatedRow ( WColumn *self, WColumnRowMap *rm, int64_t end_id )
+{
+    /* if we've previously declared a cutoff id,
+       incorporate the repeated row into the range */
+    if ( ( self -> cutoff_id != self -> start_id ) && ( self -> cutoff_id + 1 == end_id ) )
+        self -> cutoff_id = end_id;
+
+    /* just account for the repeated row */
+    ++ rm -> cnt;
+
+    /* drop data */
+    self -> row_len = 0;
+
+    /* the row has been successfully committed */
+    self -> row_committed = true;
+
+    /* no error */
+    return false;
+}
+
+static
+bool WColumnCommitRowData ( WColumn *self, int64_t *end_id )
+{
+    size_t cur_size;
+    uint64_t row_len;
+    bitsz_t elem_bits;
+    WColumnRowMap *rm;
+
+    /* if no data were written and that's okay, ignore */
+    if ( ! self -> row_written )
+    {
+        assert ( self -> row_len == 0 );
+        self -> row_committed = true;
+        return false;
+    }
+
+    /* column's element size */
+    elem_bits = VTypedescSizeof ( & self -> dad . desc );
+    assert ( self -> row_len % elem_bits == 0 );
+    row_len = self -> row_len / elem_bits;
+
+    /* detect repeated row */
+    if ( USE_RLE && self -> num_rows != 0 )
+    {
+        rm = self -> rowmap . base;
+        rm += self -> num_rows - 1;
+
+        if ( rm -> len == row_len && rm->cnt <= INT32_MAX)
+        {
+            bitsz_t poff, coff;
+            const uint8_t *base;
+
+            if ( row_len == 0 )
+                return WColumnCommitRepeatedRow ( self, rm, * end_id );
+
+            base = ( const void* ) self -> data . base;
+            assert ( self -> bits_in_buffer >= self -> row_len );
+            coff = self -> bits_in_buffer;
+            poff = self -> bits_in_buffer - self -> row_len;
+
+            if ( ( ( poff | coff | self -> row_len ) & 7 ) != 0 )
+            {
+                if ( bitcmp ( base, poff, base, coff, self -> row_len ) == 0 )
+                    return WColumnCommitRepeatedRow ( self, rm, * end_id );
+            }
+            else
+            {
+                if ( memcmp ( & base [ poff >> 3 ], & base [ coff >> 3 ], self -> row_len >> 3 ) == 0 )
+                    return WColumnCommitRepeatedRow ( self, rm, * end_id );
+            }
+        }
+    }
+
+    /* need to add a new row */
+    if ( ( uint64_t ) self -> num_rows == self -> rowmap . elem_count )
+    {
+        /* need more memory */
+        rc_t rc;
+        self -> rowmap . elem_bits = sizeof * rm * 8;
+        rc = KDataBufferResize ( & self -> rowmap, self -> rowmap . elem_count + 16 * 1024 );
+        if ( rc != 0 )
+        {
+            PLOGERR ( klogErr,
+                      ( klogErr, rc, "Column: $(col) failed to resize row map", "col=%.*s"
+                        , self -> dad . scol -> name -> name . size
+                        , self -> dad . scol -> name -> name . addr )
+                );
+            return true;
+        }
+    }
+
+    rm = self -> rowmap . base;
+    rm += self -> num_rows;
+
+    rm -> start_id = self -> end_id;
+    rm -> len = row_len;
+    rm -> cnt = 1;
+
+    self -> bits_in_buffer += self -> row_len;
+    self -> row_len = 0;
+
+    ++ self -> num_rows;
+    self -> row_committed = true;
+
+    /* detect 1x blob cutoff */
+    cur_size = ( size_t ) ( self -> bits_in_buffer + 7 ) >> 3;
+    if ( cur_size >= self -> trigger )
+    {
+        /* if size just crossed the trigger boundary and 
+         * cutoff_id has not been advanced yet */
+        if ( self -> cutoff_id == self -> start_id )
+        {
+            self -> cutoff_id = * end_id;
+        }
+
+        /* or perhaps the buffer is too large */
+        else if ( ( cur_size + cur_size ) >= self -> trigger * 3 )
+        {
+            /* set to min of current end or our cutoff */
+            if ( self -> cutoff_id < * end_id )
+            {
+#if ROW_COUNT_CUTOFFS
+                /* the number of rows until our cutoff */
+                uint64_t row_count = self -> cutoff_id - self -> start_id;
+                if ( row_count != 0 )
+                {
+/*                  int64_t end; */
+                    uint64_t msb = row_count;
+
+                    /* adjust id to nearest power of two size
+                       that does not exceed current id */
+                    while ( ( msb & ( msb - 1 ) ) != 0 )
+                        msb &= msb - 1;
+
+                    /* add in rounding factor to row_count */
+                    row_count += ( msb >> 1 );
+
+                    /* truncate */
+                    row_count &= ~ ( msb - 1 );
+
+                    if ( row_count >= 1024 )
+                    {
+                        /* limit to current row */
+                        while ( row_count > 1024 && self -> start_id + row_count > * end_id )
+                            row_count >>= 1;
+
+                        if ( self -> start_id + row_count <= * end_id )
+                            self -> cutoff_id = self -> start_id + row_count;
+                    }
+                }
+#endif
+                * end_id = self -> cutoff_id;
+            }
+        }
+    }
+
+    return false;
+}
+
+bool CC WColumnCommitRow ( void *item, void *data )
+{
+    WColumn *self = item;
+    if ( self != NULL )
+    {
+        int64_t *end_id = data;
+
+        if ( WColumnCommitRowData ( self, end_id ) )
+            return true;
+
+        /* if the row range is too great */
+        if ( ( self -> end_id - self -> start_id ) >= MAX_ROW_COUNT )
+        {
+            /* if row range has just crossed the boundary and 
+             * cutoff_id has not been advanced yet */
+            if ( self -> cutoff_id == self -> start_id )
+            {
+                self -> cutoff_id = * end_id;
+            }
+
+            /* set to min of current end or our cutoff */
+            else if ( self -> cutoff_id < * end_id )
+            {
+                * end_id = self -> cutoff_id;
+            }
+        }
+    }
+
+    return false;
+}
+
+/* RepeatRow
+ *  go into the last row entry
+ *  extend the count by uint64_t
+ */
+void CC WColumnRepeatRow ( void *item, void *data )
+{
+    WColumn *self = item;
+    const WColumnRepeatRowData *pb = data;
+
+    if ( self != NULL && self -> num_rows != 0 )
+    {
+        WColumnRowMap *rm = self -> rowmap . base;
+        rm += self -> num_rows - 1;
+
+        /* if we've previously declared a cutoff id,
+           incorporate the repeated row into the range */
+        if ( ( self -> cutoff_id != self -> start_id ) && ( self -> cutoff_id + 1 == pb -> end_id ) )
+            self -> cutoff_id = pb -> end_id + pb -> count;
+
+        /* just account for the repeated row */
+        rm -> cnt += pb -> count;
+        self -> end_id += pb -> count;
+    }
+}
+
+/* CloseRow
+ *  discards uncommitted data
+ *  update state
+ */
+void CC WColumnCloseRow ( void *item, void *ignore )
+{
+    WColumn *self = item;
+    if ( self != NULL )
+    {
+        if ( self -> row_committed )
+            ++ self -> end_id;
+
+        self -> row_len = 0;
+        self -> row_written = false;
+        self -> row_committed = false;
+    }
+}
+
+/* BufferPage
+ *  captures page range
+ *
+ *  "end_id" [ IN, CONST ] - half-closed id of buffered range end
+ *  column should capture this information for creating page
+ *  id range either on demand, or pre-prepared.
+ *
+ *  returns true if there was a memory error.
+ */
+static
+bool WColumnSplitBuffer ( WColumn *self, int64_t end_id, size_t rm_idx )
+{
+    rc_t rc;
+    int64_t id;
+    VBlob *vblob;
+    bool splitting;
+    size_t i, data_cur;
+    uint64_t sum_elems;
+
+    const WColumnRowMap *rm = self -> rowmap . base;
+
+    uint64_t num_rows = rm [ rm_idx ] . start_id + rm [ rm_idx ] . cnt - self -> start_id;
+    assert ( rm [ 0 ] . start_id == self -> start_id );
+
+    /* adjust end_id [ TAKES CARE OF THEORETICAL ERROR CONDITION
+       NOT KNOWN TO EXIST ] and num_rows ( when splitting repeat ) */
+    id = end_id;
+    splitting = false;
+    if ( self -> start_id + num_rows <= id )
+        id = self -> start_id + num_rows;
+    else
+    {
+        num_rows = id - self -> start_id;
+        splitting = true;
+    }
+
+    /* release previous ( but unexpected ) cache if there */
+    if ( self -> page != NULL )
+    {
+        TRACK_BLOB ( VBlobRelease, self -> page );
+        VBlobRelease ( self -> page );
+        self -> page = NULL;
+    }
+
+    /* create new blob */
+    rc = VBlobNew ( & vblob,
+                    self -> start_id, id - 1,
+                    self -> dad . scol -> name -> name . addr );
+    TRACK_BLOB ( VBlobNew, vblob );
+    if ( rc != 0 )
+    {
+        PLOGERR ( klogErr,
+                  ( klogErr, rc, "Column: $(col) failed to allocate page", "col=%.*s"
+                    , self -> dad . scol -> name -> name . size
+                    , self -> dad . scol -> name -> name . addr )
+            );
+        return true;
+    }
+
+    /* create blob page map */
+    rc = PageMapNew ( & vblob -> pm, rm_idx + 1 ); /*** rm_idx tells many WColumnRowMap need to be added to PageMap ***/
+    if ( rc != 0 )
+    {
+        TRACK_BLOB ( VBlobRelease, vblob );
+        VBlobRelease ( vblob );
+
+        PLOGERR ( klogErr,
+                  ( klogErr, rc, "Column: $(col) failed to create page map", "col=%.*s"
+                    , self -> dad . scol -> name -> name . size
+                    , self -> dad . scol -> name -> name . addr )
+            );
+        return true;
+    }
+
+    /* write page map up to ( but not including ) last entry */
+    for ( sum_elems = 0, i = 0; i < rm_idx; ++ i )
+    {
+        sum_elems += rm [ i ] . len;
+        rc = PageMapAppendSomeRows ( vblob -> pm, rm [ i ] . len, rm [ i ] . cnt );
+        if ( rc != 0 )
+        {
+            TRACK_BLOB ( VBlobRelease, vblob );
+            VBlobRelease ( vblob );
+
+            PLOGERR ( klogErr,
+                      ( klogErr, rc, "Column: $(col) failed to write page map", "col=%.*s"
+                        , self -> dad . scol -> name -> name . size
+                        , self -> dad . scol -> name -> name . addr )
+                );
+            return true;
+        }
+    }
+
+    sum_elems += rm [ i ] . len;
+    rc = PageMapAppendSomeRows ( vblob -> pm, rm [ i ] . len, id - rm [ i ] . start_id );
+    if ( rc != 0 )
+    {
+        TRACK_BLOB ( VBlobRelease, vblob );
+        VBlobRelease ( vblob );
+
+        PLOGERR ( klogErr,
+                  ( klogErr, rc, "Column: $(col) failed to write page map", "col=%.*s"
+                    , self -> dad . scol -> name -> name . size
+                    , self -> dad . scol -> name -> name . addr )
+            );
+        return true;
+    }
+
+    /* determine current data buffer usage */
+    data_cur = ( size_t ) ( ( ( self -> bits_in_buffer + 7 ) >> 3 )
+        + SINGLE_PAGE_SIZE - 1 ) & ~ ( size_t ) ( SINGLE_PAGE_SIZE - 1 );
+
+    /* update peak history */
+    if ( self -> data_peak_hist [ self -> peak_hist_idx ] == self -> data_peak )
+    {
+        int j;
+        size_t data_peak = data_cur;
+
+        for ( j = ( self -> peak_hist_idx + 1 ) & 0xF;
+              j != self -> peak_hist_idx;
+              j = ( j + 1 ) & 0xF )
+        {
+            if ( self -> data_peak_hist [ j ] > data_peak )
+                data_peak = self -> data_peak_hist [ j ];
+        }
+
+        self -> data_peak = data_peak;
+    }
+    self -> data_peak_hist [ self -> peak_hist_idx ] = data_cur;
+    self -> peak_hist_idx = ( self -> peak_hist_idx + 1 ) & 0xF;
+    if ( data_cur > self -> data_peak )
+        self -> data_peak = data_cur;
+
+    /* hand data over to blob */
+    vblob -> data = self -> data;
+    vblob -> data . elem_bits = VTypedescSizeof ( & self -> dad . desc );
+    vblob -> data . elem_count = sum_elems;
+
+    /* handle residual data */
+    if ( splitting )
+        sum_elems -= rm [ rm_idx ] . len;
+    else
+        ++ rm_idx;
+
+    if ( rm_idx == self -> num_rows )
+    {
+        /* no residual data/rows */
+        memset ( & self -> data, 0, sizeof self -> data );
+        self -> bits_in_buffer = 0;
+        self -> num_rows = 0;
+        self -> start_id = self -> cutoff_id = end_id;
+    }
+    else
+    {
+        KDataBuffer data;
+        bitsz_t boff, to_copy;
+
+        /* allocate a new data buffer */
+        rc = KDataBufferMakeBytes ( & data, self -> data_peak );
+        if ( rc != 0 )
+        {
+            /* forget transfer of blob */
+            memset ( & vblob -> data, 0, sizeof vblob -> data );
+
+            TRACK_BLOB ( VBlobRelease, vblob );
+            VBlobRelease ( vblob );
+
+            PLOGERR ( klogErr,
+                      ( klogErr, rc, "Column: $(col) failed to split page", "col=%.*s"
+                        , self -> dad . scol -> name -> name . size
+                        , self -> dad . scol -> name -> name . addr )
+                );
+            return true;
+        }
+
+        /* copy data */
+        boff = ( rm_idx > 0 ) ?
+            sum_elems * vblob -> data . elem_bits : 0;
+        to_copy = self -> bits_in_buffer - boff;
+        if ( ( ( boff | to_copy ) & 7 ) != 0 )
+            bitcpy ( data . base, 0, self -> data . base, boff, to_copy );
+        else
+            memmove ( data . base, & ( ( const uint8_t* ) self -> data . base ) [ boff >> 3 ], to_copy >> 3 );
+
+        self -> data = data;
+        self -> bits_in_buffer = to_copy;
+
+        /* copy row map */
+        memmove ( self -> rowmap . base, & rm [ rm_idx ], ( self -> num_rows -= rm_idx ) * sizeof * rm );
+
+        /* adjust starting id and repeat count if splitting single row */
+        if ( splitting )
+        {
+            WColumnRowMap *split = self -> rowmap . base;
+            split -> cnt = split -> start_id + split -> cnt - id;
+            split -> start_id = id;
+        }
+
+        self -> start_id = self -> cutoff_id = id;
+    }
+
+    self -> page = vblob;
+    self -> dflt_last = false;
+
+    return false;
+}
+
+static
+int WColumnRowMapCompare ( const WColumnRowMap *self, int64_t id )
+{
+    /* id is right-edge exclusive */
+    if ( self -> start_id >= id )
+        return -1;
+    return id > self -> start_id + self -> cnt;
+}
+
+bool CC WColumnBufferPage ( void *item, void *const_end_id )
+{
+    WColumn *self = item;
+    if ( self != NULL )
+    {
+        int64_t end_id = * ( const int64_t* ) const_end_id;
+
+        int diff;
+        const WColumnRowMap *rm = self -> rowmap . base;
+        size_t i, left, right = self -> num_rows;
+
+        /* find the entry mentioned */
+        if ( self -> num_rows == 0 )
+        {
+            PLOGMSG ( klogWarn,
+                      ( klogWarn, "Column: $(col) has no rows to buffer", "col=%.*s"
+                        , self -> dad . scol -> name -> name . size
+                        , self -> dad . scol -> name -> name . addr )
+                );
+            return true;
+        }
+
+        /* check last entry */
+        i = right - 1;
+        diff = WColumnRowMapCompare ( & rm [ i ], end_id );
+        if ( diff >= 0 )
+            return WColumnSplitBuffer ( self, end_id, i );
+
+        /* check that the id is within our range at all */
+        assert ( self -> start_id == rm [ 0 ] . start_id );
+        if ( end_id < self -> start_id )
+        {
+            PLOGMSG ( klogWarn,
+                      ( klogWarn, "Column: $(col) cutoff id $(id) is not within range"
+                        , "col=%.*s,id=%ld"
+                        , self -> dad . scol -> name -> name . size
+                        , self -> dad . scol -> name -> name . addr
+                        , end_id )
+                );
+            return true;
+        }
+
+        /* search rails are left ( inclusive ) at 0, right ( exclusive ) at num_rows */
+        left = 0;
+
+        /* perform arithmetic search for initial portion */
+        if ( right > 1000 )
+        {
+            double p = ( double ) ( end_id - rm [ left ] . start_id ) /
+                ( rm [ right - 1 ] . start_id + rm [ right - 1 ] . cnt - rm [ left ] . start_id );
+            assert ( p >= 0.0 && p <= 1.0 );
+
+            i = left + p * ( right - left );
+
+            diff = WColumnRowMapCompare ( & rm [ i ], end_id );
+            if ( diff == 0 )
+                return WColumnSplitBuffer ( self, end_id, i );
+            if ( diff < 0 )
+                right = i;
+            else
+                left = i + 1;
+
+            if ( left < right )
+            {
+                p = ( double ) ( end_id - rm [ left ] . start_id ) /
+                    ( rm [ right - 1 ] . start_id + rm [ right - 1 ] . cnt - rm [ left ] . start_id );
+                assert ( p >= 0.0 && p <= 1.0 );
+
+                i = left + p * ( right - left );
+
+                diff = WColumnRowMapCompare ( & rm [ i ], end_id );
+                if ( diff == 0 )
+                    return WColumnSplitBuffer ( self, end_id, i );
+                if ( diff < 0 )
+                    right = i;
+                else
+                    left = i + 1;
+            }
+        }
+
+        /* normal binary search */
+        while ( left < right )
+        {
+            i = ( left + right ) >> 1;
+
+            diff = WColumnRowMapCompare ( & rm [ i ], end_id );
+            if ( diff == 0 )
+                return WColumnSplitBuffer ( self, end_id, i );
+            if ( diff < 0 )
+                right = i;
+            else
+                left = i + 1;
+        }
+
+        PLOGMSG ( klogErr,
+                  ( klogErr, "Column: $(col) cutoff id $(id) is not within range"
+                    , "col=%.*s,id=%ld"
+                    , self -> dad . scol -> name -> name . size
+                    , self -> dad . scol -> name -> name . addr
+                    , end_id )
+            );
+    }
+
+    return true;
+}
+
+/* ReadBlob
+ *  reads an input blob
+ *  called as a result of commit page which reads the validation production
+ */
+rc_t WColumnReadBlob ( WColumn *self, VBlob **vblob, int64_t id )
+{
+    if ( self -> page == NULL )
+        return RC ( rcVDB, rcColumn, rcReading, rcBuffer, rcNotFound );
+    if ( id < self -> page -> start_id || id > self -> page -> stop_id )
+        return RC ( rcVDB, rcColumn, rcReading, rcRow, rcNotFound );
+
+    * vblob = self -> page;
+    VBlobAddRef ( self -> page );
+    TRACK_BLOB ( VBlobAddRef, self -> page );
+
+    return 0;
+}
+
+/* DropPage
+ *  drops any page buffers created
+ */
+void CC WColumnDropPage ( void *item, void *ignore )
+{
+    WColumn *self = item;
+    if ( self != NULL && self -> page != NULL )
+    {
+        TRACK_BLOB ( VBlobRelease, self -> page );
+        VBlobRelease ( self -> page );
+        self -> page = NULL;
+    }
+}
diff --git a/libs/vdb/wcursor.c b/libs/vdb/wcursor.c
new file mode 100644
index 0000000..f931bd1
--- /dev/null
+++ b/libs/vdb/wcursor.c
@@ -0,0 +1,1238 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+
+#include "cursor-priv.h"
+#include "dbmgr-priv.h"
+#include "linker-priv.h"
+#include "schema-priv.h"
+#include "table-priv.h"
+#include "column-priv.h"
+#include "phys-priv.h"
+#include "prod-priv.h"
+#include "prod-expr.h"
+#include "blob-priv.h"
+
+#include <vdb/cursor.h>
+#include <vdb/table.h>
+#include <kdb/meta.h>
+#include <kfs/dyload.h>
+#include <klib/symbol.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#if VCURSOR_FLUSH_THREAD
+
+#include <kproc/lock.h>
+#include <kproc/cond.h>
+#include <kproc/thread.h>
+
+#if _DEBUGGING
+/* set to 1 to trigger behavior to simulate
+   an error within flush thread */
+#define FORCE_FLUSH_ERROR_EXIT 0
+#endif
+
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+static bool s_disable_flush_thread = false;
+
+/*--------------------------------------------------------------------------
+ * VCursor
+ *  a row cursor onto a VTable
+ */
+
+LIB_EXPORT rc_t CC VDBManagerDisableFlushThread(VDBManager *self)
+{
+    s_disable_flush_thread = true;
+    return 0;
+}
+
+/* forward
+ *  to avoid reordering whole page
+ */
+static
+rc_t VCursorFlushPageInt ( VCursor *self, bool sync );
+
+
+/* Whack
+ */
+rc_t VCursorWhack ( VCursor *self )
+{
+#if VCURSOR_FLUSH_THREAD
+    if ( self -> flush_thread != NULL )
+    {
+        rc_t rc = KLockAcquire ( self -> flush_lock );
+        if ( rc == 0 )
+        {
+            while ( self -> flush_state == vfBusy )
+            {
+                MTCURSOR_DBG (( "VCursorWhack: waiting for thread to process\n" ));
+                KConditionWait ( self -> flush_cond, self -> flush_lock );
+            }
+            self -> flush_state = vfExit;
+            KConditionSignal ( self -> flush_cond );
+            KLockUnlock ( self -> flush_lock );
+        }
+
+        MTCURSOR_DBG (( "VCursorWhack: waiting on thread to exit\n" ));
+        KThreadWait ( self -> flush_thread, NULL );
+    }
+
+    MTCURSOR_DBG (( "VCursorWhack: finishing\n" ));
+    KThreadRelease ( self -> flush_thread );
+    KConditionRelease ( self -> flush_cond );
+    KLockRelease ( self -> flush_lock );
+#endif
+    VCursorTerminatePagemapThread(self);
+    return VCursorDestroy ( self );
+}
+
+
+/* CreateCursor
+ *  creates a cursor object onto table
+ *  multiple read cursors are allowed
+ *  only a single write cursor is allowed
+ *
+ *  "curs" [ OUT ] - return parameter for newly created cursor
+ *
+ *  "mode" [ IN ] - describes udate behavior
+ *    kcmUpdate   : allow inserts or updates
+ *    kcmReplace  : replace all existing rows with newly written rows
+ *    kcmInsert   : allow only inserts, i.e. new rows
+ */
+#if VCURSOR_FLUSH_THREAD
+static rc_t CC run_flush_thread ( const KThread *t, void *data );
+#endif
+
+rc_t VTableCreateCursorWriteInt ( VTable *self, VCursor **cursp, KCreateMode mode, bool create_thread )
+{
+    rc_t rc;
+
+    if ( cursp == NULL )
+        rc = RC ( rcVDB, rcCursor, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else if ( self -> read_only )
+            rc = RC ( rcVDB, rcCursor, rcCreating, rcTable, rcReadonly );
+#if VCURSOR_WRITE_MODES_SUPPORTED
+#error "expecting kcmInsert mode only"
+#else
+        else if ( mode != kcmInsert )
+            rc = RC ( rcVDB, rcCursor, rcCreating, rcMode, rcUnsupported );
+#endif
+        else
+        {
+            VCursor *curs;
+
+#if LAZY_OPEN_COL_NODE
+            if ( self -> col_node == NULL )
+                KMetadataOpenNodeUpdate ( self -> meta, & self -> col_node, "col" );
+#endif
+            rc = VCursorMake ( & curs, self );
+            if ( rc == 0 )
+            {
+                rc = VCursorSupplementSchema ( curs );
+#if VCURSOR_FLUSH_THREAD
+                if ( rc == 0 && create_thread )
+                {
+                    rc = KLockMake ( & curs -> flush_lock );
+                    if ( rc == 0 )
+                        rc = KConditionMake ( & curs -> flush_cond );
+                    if ( rc == 0 )
+                        rc = KThreadMake ( & curs -> flush_thread, run_flush_thread, curs );
+                }
+#endif
+                if ( rc == 0 )
+                {
+                    * cursp = curs;
+                    return 0;
+                }
+
+                VCursorRelease ( curs );
+            }
+        }
+
+        * cursp = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableCreateCursorWrite ( VTable *self, VCursor **cursp, KCreateMode mode )
+{
+    return VTableCreateCursorWriteInt ( self, cursp, mode, !s_disable_flush_thread );
+}
+
+
+/* MakeColumn
+ */
+rc_t VCursorMakeColumn ( VCursor *self, VColumn **col, const SColumn *scol, Vector *cx_bind )
+{
+    VTable *vtbl;
+
+    if ( self -> read_only )
+        return VColumnMake ( col, self -> schema, scol );
+
+    vtbl = self -> tbl;
+    return WColumnMake ( col, self -> schema, scol, vtbl -> stbl -> limit, vtbl -> mgr, cx_bind );
+}
+
+
+/* PostOpenAdd
+ *  handle opening of a column after the cursor is opened
+ */
+rc_t VCursorPostOpenAdd ( VCursor *self, VColumn *col )
+{
+    rc_t rc = VCursorPostOpenAddRead ( self, col );
+
+    if ( ! self -> read_only && rc == 0 && self -> state == vcRowOpen )
+    {
+        int64_t row_id = self -> row_id;
+        WColumnOpenRow ( col, & row_id );
+    }
+
+    return rc;
+}
+
+/* Open
+ *  open cursor, resolving schema
+ *  for the set of opened columns
+ *
+ *  NB - there is no corresponding "Close"
+ *  use "Release" instead.
+ */
+static
+rc_t VProdResolveAddShallowTriggers ( const VProdResolve *self, const STable *stbl )
+{
+    rc_t rc;
+    VCursor *curs;
+    uint32_t i = VectorStart ( & stbl -> prod );
+    uint32_t end = i + VectorLength ( & stbl -> prod );
+
+    for ( rc = 0, curs = self -> curs; ( rc == 0 || self -> ignore_column_errors ) && i < end; ++ i )
+    {
+        SProduction *sprod = VectorGet ( & stbl -> prod, i );
+        if ( sprod != NULL && sprod -> trigger )
+        {
+            VProduction *prod = NULL;
+            rc = VProdResolveSProduction ( self, & prod, sprod );
+            if ( rc == 0 && prod != NULL )
+                rc = VectorAppend ( & curs -> trig, NULL, prod );
+        }
+    }
+
+    if ( self -> ignore_column_errors )
+        return 0;
+
+    return rc;
+}
+
+static
+rc_t VProdResolveAddTriggers ( const VProdResolve *self, const STable *stbl )
+{
+    uint32_t i = VectorStart ( & stbl -> overrides );
+    uint32_t end = VectorLength ( & stbl -> overrides );
+    for ( end += i; i < end; ++ i )
+    {
+        const STable *dad = STableFindOrdAncestor ( stbl, i );
+        rc_t rc = VProdResolveAddShallowTriggers ( self, dad );
+        if ( rc != 0 )
+            return rc;
+    }
+    return VProdResolveAddShallowTriggers ( self, stbl );
+}
+
+LIB_EXPORT rc_t CC VCursorOpen ( const VCursor *cself )
+{
+    rc_t rc;
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcOpening, rcSelf, rcNull );
+    else
+    {
+        VLinker *ld = self -> tbl -> linker;
+
+        KDlset *libs;
+        rc = VLinkerOpen ( ld, & libs );
+        if ( rc == 0 )
+        {
+            rc = VCursorOpenRead ( self, libs );
+            if ( rc == 0 )
+            {
+                if ( ! self -> read_only )
+                {
+                    Vector cx_bind;
+                    VProdResolve pr;
+                    pr . schema = self -> schema;
+                    pr . ld = ld;
+                    pr . libs = libs;
+                    pr . stbl = self -> stbl;
+                    pr . curs = self;
+                    pr . cache = & self -> prod;
+                    pr . owned = & self -> owned;
+                    pr . cx_bind = & cx_bind;
+                    pr . chain = chainEncoding;
+                    pr . blobbing = false;
+                    pr . ignore_column_errors = false;
+                    pr . discover_writable_columns = false;
+
+                    VectorInit ( & cx_bind, 1, self -> schema -> num_indirect );
+
+                    if ( ! self -> suspend_triggers )
+                        rc = VProdResolveAddTriggers ( & pr, self -> stbl );
+
+                    VectorWhack ( & cx_bind, NULL, NULL );
+                }
+
+                if ( rc == 0 )
+                {
+                    /* TBD - warn if any input columns are unreferenced by schema */
+
+                    int64_t first;
+                    uint64_t count;
+                    
+                    rc = VCursorIdRange ( self, 0, & first, & count );
+                    if ( rc != 0 )
+                    {
+                        if ( GetRCState ( rc ) == rcEmpty )
+                        {
+                            /* writable cursors are expected to be empty */
+                            if ( ! self -> read_only ||
+                                 /* permit empty open when run from sradb */
+                                 ( GetRCObject ( rc ) == rcRange &&
+                                   self -> permit_add_column &&
+                                   VectorLength ( & self -> row ) == 0 ) )
+                            {
+                                rc = 0;
+                            }
+                        }
+                    }
+                    else if ( count != 0 )
+                    {
+                        if ( self -> read_only )
+                        {
+                            /* set initial row id to starting row */
+                            self -> start_id = self -> end_id = self -> row_id = first;
+                        }
+                        else
+                        {
+                            /* set initial row id to append */
+                            self -> start_id = self -> end_id = self -> row_id = first + count;
+                        }
+                    }
+                }
+
+                if ( rc != 0 )
+                    self -> state = vcFailed;
+            }
+
+            KDlsetRelease ( libs );
+        }
+    }
+
+    return rc;
+}
+
+
+/* ListWritableColumns
+ *  walks list of SPhysicals and trigger SProductions
+ *  attempts to resolve all write rules
+ *  records any SColumn that can be reached
+ *  populates BTree with VColumnRef objects
+ */
+struct resolve_phys_data
+{
+    VProdResolve pr;
+    const KNamelist *seed;
+    uint32_t count;
+};
+
+static
+void CC resolve_writable_sphys ( void *item, void *data )
+{
+    struct resolve_phys_data *pb = data;
+    const SPhysMember *smbr = ( const void* ) item;
+    VProduction *out = NULL;
+
+    if ( pb -> seed == NULL )
+        VProdResolveSPhysMember ( & pb -> pr, & out, smbr );
+    else
+    {
+        uint32_t i;
+        const KSymbol *sym = smbr -> name;
+        const char *sname = sym -> name . addr;
+        size_t ssize = sym -> name . size;
+        if ( sname [ 0 ] == '.' )
+        {
+            ++ sname;
+            -- ssize;
+        }
+
+        /* TBD - this is not too speedy, but it is
+           very low frequency in all known cases */
+        for ( i = 0; i < pb -> count; ++ i )
+        {
+            const char *name;
+            rc_t rc = KNamelistGet ( pb -> seed, i, & name );
+            if ( rc == 0 )
+            {
+                if ( strlen ( name ) == ssize && memcmp ( sname, name, ssize ) == 0 )
+                {
+                    VProdResolveSPhysMember ( & pb -> pr, & out, smbr );
+                    break;
+                }
+            }
+        }
+    }
+}
+
+static
+void VProdResolveWritableColumns ( struct resolve_phys_data *pb, bool suspend_triggers )
+{
+    const STable *dad, *stbl = pb -> pr . stbl;
+
+    /* walk table schema looking for parents */
+    uint32_t i = VectorStart ( & stbl -> overrides );
+    uint32_t end = VectorLength ( & stbl -> overrides );
+    for ( end += i; i < end; ++ i )
+    {
+        dad = STableFindOrdAncestor ( stbl, i );
+        VectorForEach ( & dad -> phys, false, resolve_writable_sphys, pb );
+    }
+
+    /* walk current table */
+    VectorForEach ( & stbl -> phys, false, resolve_writable_sphys, pb );
+
+    /* add triggers */
+    if ( !suspend_triggers && pb -> seed == NULL )
+    {
+        pb -> pr . chain = chainUncommitted;
+        VProdResolveAddTriggers ( & pb -> pr, stbl );
+    }
+}
+
+rc_t VCursorListSeededWritableColumns ( VCursor *self, BSTree *columns, const KNamelist *seed )
+{
+    rc_t rc;
+    KDlset *libs;
+
+    Vector cx_bind;
+    struct resolve_phys_data pb;
+    pb . pr . schema = self -> schema;
+    pb . pr . ld = self -> tbl -> linker;
+    pb . pr . stbl = self -> stbl;
+    pb . pr . curs = self;
+    pb . pr . cache = & self -> prod;
+    pb . pr . owned = & self -> owned;
+    pb . pr . cx_bind = & cx_bind;
+    pb . pr . chain = chainEncoding;
+    pb . pr . blobbing = false;
+    pb . pr . ignore_column_errors = true;
+    pb . pr . discover_writable_columns = true;
+    pb . seed = seed;
+
+    if ( seed != NULL )
+    {
+        rc = KNamelistCount ( seed, & pb . count );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    VectorInit ( & cx_bind, 1, self -> schema -> num_indirect );
+
+    /* open the dynamic linker libraries */
+    rc = VLinkerOpen ( pb . pr . ld, & libs );
+    if ( rc == 0 )
+    {
+        pb . pr . libs = libs;
+        VProdResolveWritableColumns ( & pb , self -> suspend_triggers );
+
+        VectorWhack ( & cx_bind, NULL, NULL );
+        KDlsetRelease ( libs );
+
+        if ( rc == 0 )
+        {
+            /* add columns to list */
+            uint32_t idx = VectorStart ( & self -> row );
+            uint32_t end = VectorLength ( & self -> row );
+
+            for ( end += idx; idx < end; ++idx )
+            {
+                const VColumn* vcol = ( const VColumn* ) VectorGet ( & self -> row, idx );
+                if ( vcol != NULL )
+                {
+                    VColumnRef *cref;
+                    rc = VColumnRefMake ( & cref, self -> schema, vcol -> scol );
+                    if ( rc != 0 )
+                        break;
+
+                    rc = BSTreeInsert ( columns, & cref -> n, VColumnRefSort );
+                    assert ( rc == 0 );
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+rc_t VCursorListWritableColumns ( VCursor *self, BSTree *columns )
+{
+    return VCursorListSeededWritableColumns ( self, columns, NULL );
+}
+
+/* SetRowId
+ *  seek to given row id
+ *
+ *  "row_id" [ IN ] - row id to select
+ */
+LIB_EXPORT rc_t CC VCursorSetRowId ( const VCursor *cself, int64_t row_id )
+{
+    rc_t rc;
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcPositioning, rcSelf, rcNull );
+    else if ( self -> state == vcFailed )
+        rc = RC ( rcVDB, rcCursor, rcPositioning, rcCursor, rcInvalid );
+    else if ( self -> state > vcReady || self -> start_id < self -> end_id )
+        rc = RC ( rcVDB, rcCursor, rcPositioning, rcCursor, rcBusy );
+    else if ( self -> read_only )
+        rc = VCursorSetRowIdRead ( self, row_id );
+    else
+    {
+        /* the test of start/end range above tells us that
+           no rows are buffered, so the row id can be simply set */
+        self -> start_id = self -> end_id = self -> row_id = row_id;
+        rc = 0;
+    }
+
+    return rc;
+}
+
+
+/* OpenRow
+ *  open currently closed row indicated by row id
+ */
+LIB_EXPORT rc_t CC VCursorOpenRow ( const VCursor *cself )
+{
+    rc_t rc;
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcOpening, rcSelf, rcNull );
+    else if ( self -> state != vcReady )
+    {
+        switch ( self -> state )
+        {
+        case vcConstruct:
+            rc = RC ( rcVDB, rcCursor, rcOpening, rcRow, rcIncomplete );
+            break;
+        case vcFailed:
+            rc = RC ( rcVDB, rcCursor, rcOpening, rcCursor, rcInvalid );
+            break;
+        case vcRowOpen:
+            rc = 0;
+            break;
+        default:
+            rc = RC ( rcVDB, rcCursor, rcOpening, rcRow, rcBusy );
+        }
+    }
+    else if ( self -> read_only )
+        rc = VCursorOpenRowRead ( self );
+    else
+    {
+        /* validate that all columns have the same starting row_id */
+        int64_t row_id = self -> row_id;
+        VectorForEach ( & self -> row, false, WColumnOpenRow, & row_id );
+        assert ( row_id == self -> row_id );
+        self -> state = vcRowOpen;
+        rc = 0;
+    }
+
+    return rc;
+}
+
+/* CommitRow
+ *  commit row after writing
+ *  prevents further writes
+ */
+LIB_EXPORT rc_t CC VCursorCommitRow ( VCursor *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcCommitting, rcSelf, rcNull );
+    else if ( self -> read_only )
+        rc = RC ( rcVDB, rcCursor, rcCommitting, rcCursor, rcReadonly );
+    else if ( self -> state == vcFailed )
+        rc = RC ( rcVDB, rcCursor, rcCommitting, rcCursor, rcInvalid );
+    else if ( self -> state < vcRowOpen )
+        rc = RC ( rcVDB, rcCursor, rcCommitting, rcRow, rcNotOpen );
+    else if ( self -> state >= vcRowCommitted )
+        rc = 0;
+    else
+    {
+        self -> permit_add_column = self -> permit_post_open_add;
+
+        /* tell columns to slam in any default values */
+        rc = 0;
+        if ( VectorDoUntil ( & self -> row, false, WColumnRowDefaults, & rc ) )
+            return rc;
+
+        /* account for row just written */
+        self -> end_id = self -> row_id + 1;
+
+        /* tell columns to commit the row, and allow
+           each to return an earlier cutoff id ( half-closed ) */
+        if ( VectorDoUntil ( & self -> row, false, WColumnCommitRow, & self -> end_id ) )
+        {
+            self -> state = vcFailed;
+            return RC ( rcVDB, rcCursor, rcCommitting, rcMemory, rcExhausted );
+        }
+
+        /* returned result should never be <= start id */
+        assert ( self -> end_id > self -> start_id );
+
+        /* if returned result dips down into the range of buffered rows
+           then one or more columns has requested an automatic page commit */
+        self -> state = ( self -> end_id <= self -> row_id ) ? vcPageCommit : vcRowCommitted;
+    }
+
+    return rc;
+}
+
+/* RepeatRow
+ *  repeats the current row by the count provided
+ *  row must have been committed
+ *
+ *  AVAILABILITY: version 2.6
+ *
+ *  "count" [ IN ] - the number of times to repeat
+ *  the current row.
+ */
+LIB_EXPORT rc_t CC VCursorRepeatRow ( VCursor *self, uint64_t count )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcUpdating, rcSelf, rcNull );
+    else if ( self -> read_only )
+        rc = RC ( rcVDB, rcCursor, rcUpdating, rcCursor, rcReadonly );
+    else if ( self -> state == vcFailed )
+        rc = RC ( rcVDB, rcCursor, rcUpdating, rcCursor, rcInvalid );
+    else if ( self -> state < vcRowOpen )
+        rc = RC ( rcVDB, rcCursor, rcUpdating, rcRow, rcNotOpen );
+    else if ( self -> state < vcRowCommitted )
+        rc = RC ( rcVDB, rcCursor, rcUpdating, rcRow, rcInvalid );
+    else if ( count > 0xFFFFFFFFU )
+        rc = RC ( rcVDB, rcCursor, rcUpdating, rcParam, rcExcessive );
+    else if ( count != 0 )
+    {
+        /* check the number of rows that would result */
+        uint64_t total = ( self -> row_id - self -> start_id ) + count;
+        if ( total > 0xFFFFFFFFU )
+            rc = RC ( rcVDB, rcCursor, rcUpdating, rcParam, rcExcessive );
+        else
+        {
+            WColumnRepeatRowData pb;
+            pb . count = count;
+            pb . row_id = self -> row_id;
+            pb . end_id = self -> end_id;
+
+            /* tell columns to commit the row, and allow
+               each to return an earlier cutoff id ( half-closed ) */
+            VectorForEach ( & self -> row, false, WColumnRepeatRow, & pb );
+
+            /* extend the current row-id, dragging end_id along with it */
+            if ( self -> end_id >= self -> row_id )
+                self -> end_id += count;
+
+            /* move the current row id ahead */
+            self -> row_id += count;
+        }
+    }
+
+    return rc;
+}
+
+/* CloseRow
+ *  balances OpenRow message
+ *  if there are uncommitted modifications,
+ *  discard all changes. otherwise,
+ *  advance to next row
+ */
+LIB_EXPORT rc_t CC VCursorCloseRow ( const VCursor *cself )
+{
+    rc_t rc = 0;        /* needed in case FlushPage isn't called */
+    VCursor *self = ( VCursor* ) cself;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcClosing, rcSelf, rcNull );
+    else if ( self -> state == vcFailed )
+        rc = RC ( rcVDB, rcCursor, rcClosing, rcCursor, rcInvalid );
+    else if ( self -> state < vcRowOpen )
+        rc = 0;
+    else if ( self -> read_only )
+        rc = VCursorCloseRowRead ( self );
+    else
+    {
+        /* tell each of the columns that no further data may be written
+           and to abandon any uncommitted writes */
+        VectorForEach ( & self -> row, false, WColumnCloseRow, NULL );
+
+        /* if the row was committed... */
+        if ( self -> state >= vcRowCommitted )
+        {
+            /* close off the page if so requested */
+            if ( self -> state == vcPageCommit )
+            {
+                rc = VCursorFlushPageInt(self, false);
+                if ( rc )
+                {
+                    self -> state = vcFailed;
+                    return rc;
+                }
+            }
+
+            /* advance to next id */
+            ++ self -> row_id;
+        }
+
+        self -> state = vcReady;
+        rc = 0;
+    }
+
+    return rc;
+}
+
+
+/* Default
+ *  give a default row value for column
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ *
+ *  "elem_bits" [ IN ] - stated element size in bits, required
+ *  to be compatible with the actual element size
+ *
+ *  "buffer" [ IN ] and "boff" [ IN ] - compound pointer and offset
+ *  to start of default row data where "boff" is in BITS
+ *
+ *  "row_len" [ IN ] - the number of elements in default row
+ */
+LIB_EXPORT rc_t CC VCursorDefault ( VCursor *self, uint32_t col_idx,
+    bitsz_t elem_bits, const void *buffer, bitsz_t boff, uint64_t row_len )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcWriting, rcSelf, rcNull );
+    else if ( buffer == NULL && ( boff != 0 || row_len != 0 ) )
+        rc = RC ( rcVDB, rcCursor, rcWriting, rcParam, rcNull );
+    else if ( self -> read_only )
+        rc = RC ( rcVDB, rcCursor, rcWriting, rcCursor, rcReadonly );
+    else if ( elem_bits == 0 )
+        rc = RC ( rcVDB, rcCursor, rcWriting, rcParam, rcInvalid );
+    else
+    {
+        VColumn *col = VectorGet ( & self -> row, col_idx );
+        if ( col == NULL )
+            rc = RC ( rcVDB, rcCursor, rcWriting, rcColumn, rcInvalid );
+        else
+            rc = WColumnSetDefault ( col, elem_bits, buffer, boff, row_len );
+    }
+
+    return rc;
+}
+
+
+/* Write
+ *  append bit-aligned column data to row
+ *
+ *  "col_idx" [ IN ] - index of column to be read, returned by "AddColumn"
+ *
+ *  "elem_bits" [ IN ] - stated element size in bits, required
+ *  to be compatible with the actual element size
+ *
+ *  "buffer" [ IN ] and "boff" [ IN ] - compound pointer and offset
+ *  to start of default row data where "boff" is in BITS
+ *
+ *  "count" [ IN ] - the number of elements to append
+ */
+LIB_EXPORT rc_t CC VCursorWrite ( VCursor *self, uint32_t col_idx,
+    bitsz_t elem_bits, const void *buffer, bitsz_t boff, uint64_t count )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcWriting, rcSelf, rcNull );
+    else if ( buffer == NULL && count != 0 )
+        rc = RC ( rcVDB, rcCursor, rcWriting, rcParam, rcNull );
+    else if ( self -> read_only )
+        rc = RC ( rcVDB, rcCursor, rcWriting, rcCursor, rcReadonly );
+    else if ( self -> state != vcRowOpen )
+    {
+        switch ( self -> state )
+        {
+        case vcConstruct:
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcCursor, rcNotOpen );
+            break;
+        case vcFailed:
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcCursor, rcInvalid );
+            break;
+        case vcReady:
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcRow, rcNotOpen );
+            break;
+        default:
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcRow, rcLocked );
+        }
+    }
+    else
+    {
+        VColumn *col = VectorGet ( & self -> row, col_idx );
+        if ( col == NULL )
+            rc = RC ( rcVDB, rcCursor, rcWriting, rcColumn, rcInvalid );
+        else
+            rc = WColumnWrite ( col, elem_bits, buffer, boff, count );
+    }
+
+    return rc;
+}
+
+
+/* FlushPage
+ *  forces flush of all buffered page data
+ *  fails if row is open
+ *
+ *  pages are normally auto-committed based upon
+ *  size and column affinity
+ */
+typedef struct run_trigger_prod_data run_trigger_prod_data;
+struct run_trigger_prod_data
+{
+    int64_t  id;
+    uint32_t cnt;
+    rc_t rc;
+};
+
+static
+bool CC run_trigger_prods ( void *item, void *data )
+{
+    run_trigger_prod_data *pb = data;
+    VProduction *prod = item;
+
+    VBlob *blob;
+    pb -> rc = VProductionReadBlob ( prod, & blob, pb -> id , pb -> cnt, NULL);
+    if ( pb -> rc != 0 )
+        return true;
+    if ( blob != NULL )
+        TRACK_BLOB ( VBlobRelease, blob );
+    ( void ) VBlobRelease ( blob );
+    return false;
+}
+
+#if VCURSOR_FLUSH_THREAD
+static
+rc_t CC run_flush_thread ( const KThread *t, void *data )
+{
+    rc_t rc;
+    VCursor *self = data;
+
+    /* acquire lock */
+    MTCURSOR_DBG (( "run_flush_thread: acquiring lock\n" ));
+    rc = KLockAcquire ( self -> flush_lock );
+    if ( rc == 0 )
+    {
+        do
+        {
+            bool failed;
+            run_trigger_prod_data pb;
+
+            /* wait for data */
+            if ( self -> flush_state == vfReady )
+            {
+                MTCURSOR_DBG (( "run_flush_thread: waiting for input\n" ));
+                rc = KConditionWait ( self -> flush_cond, self -> flush_lock );
+                if ( rc != 0 )
+                    break;
+            }
+
+            /* bail unless state is busy */
+            if ( self -> flush_state != vfBusy )
+            {
+                MTCURSOR_DBG (( "run_flush_thread: exiting\n" ));
+                break;
+            }
+
+            /* prepare param block */
+            pb . id = self -> flush_id;
+            pb . cnt = self -> flush_cnt;
+            pb . rc = 0;
+
+            MTCURSOR_DBG (( "run_flush_thread: unlocking and running\n" ));
+            KLockUnlock ( self -> flush_lock );
+
+            /* run productions from trigger roots */
+            failed = VectorDoUntil ( & self -> trig, false, run_trigger_prods, & pb );
+
+            /* drop page buffers */
+            MTCURSOR_DBG (( "run_flush_thread: dropping page buffers\n" ));
+            VectorForEach ( & self -> row, false, WColumnDropPage, NULL );
+
+            /* reacquire lock */
+            MTCURSOR_DBG (( "run_flush_thread: re-acquiring lock" ));
+            rc = KLockAcquire ( self -> flush_lock );
+            if ( rc != 0 )
+            {
+                self -> flush_state = vfBgErr;
+                LOGERR ( klogSys, rc, "run_flush_thread: re-acquiring lock failed - exit" );
+                return rc;
+            }
+
+#if FORCE_FLUSH_ERROR_EXIT
+            if ( ! failed )
+            {
+                pb . rc = RC ( rcVDB, rcCursor, rcFlushing, rcThread, rcCanceled );
+                failed = true;
+            }
+#endif
+            /* get out on failure */
+            if ( failed )
+            {
+                self -> flush_state = vfBgErr;
+                LOGERR ( klogInt, pb . rc, "run_flush_thread: run_trigger_prods failed - exit" );
+                KConditionSignal ( self -> flush_cond );
+                rc = pb . rc;
+            }
+
+            /* no longer busy */
+            else if ( self -> flush_state == vfBusy )
+            {
+                /* signal waiter */
+                self -> flush_state = vfReady;
+                MTCURSOR_DBG (( "run_flush_thread: signaling ready\n" ));
+                rc = KConditionSignal ( self -> flush_cond );
+                if ( rc != 0 )
+                    LOGERR ( klogSys, rc, "run_flush_thread: failed to signal foreground thread - exit" );
+            }
+        }
+        while ( rc == 0 );
+
+        MTCURSOR_DBG (( "run_flush_thread: unlocking\n" ));
+        KLockUnlock ( self -> flush_lock );
+    }
+
+    MTCURSOR_DBG (( "run_flush_thread: exit\n" ));
+    return rc;
+}
+#endif
+
+static
+rc_t VCursorFlushPageNoThread ( VCursor *self )
+{
+    int64_t end_id = self->end_id;
+
+    /* first, tell all columns to bundle up their pages into buffers */
+    if ( VectorDoUntil ( & self -> row, false, WColumnBufferPage, & end_id ) )
+    {
+        VectorForEach ( & self -> row, false, WColumnDropPage, NULL );
+        return RC ( rcVDB, rcCursor, rcFlushing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        run_trigger_prod_data pb;
+
+        /* supposed to be constant */
+        assert ( end_id == self -> end_id );
+        /* run all validation and trigger productions */
+        pb . id = self -> start_id;
+        pb . cnt = self -> end_id - self -> start_id;
+        pb . rc = 0;
+        if ( ! VectorDoUntil ( & self -> trig, false, run_trigger_prods, & pb ) )
+        {
+            self -> start_id = self -> end_id;
+            self -> end_id = self -> row_id + 1;
+            self -> state = vcReady;
+        }
+
+        /* drop page buffers */
+        VectorForEach ( & self -> row, false, WColumnDropPage, NULL );
+
+        return pb . rc;
+    }
+}
+
+static
+rc_t VCursorFlushPageThread ( VCursor *self, bool sync )
+{
+    rc_t rc = 0;
+    int64_t end_id = self->end_id;
+
+#if VCURSOR_FLUSH_THREAD
+    MTCURSOR_DBG (( "VCursorFlushPageInt: going to acquire lock\n" ));
+    /* get lock */
+    rc = KLockAcquire ( self -> flush_lock );
+    if ( rc != 0 )
+        return rc;
+
+    MTCURSOR_DBG (( "VCursorFlushPageInt: have lock\n" ));
+
+    /* make sure that background thread is ready */
+    while ( self -> flush_state == vfBusy )
+    {
+        MTCURSOR_DBG (( "VCursorFlushPageInt: waiting for background thread\n" ));
+        rc = KConditionWait ( self -> flush_cond, self -> flush_lock );
+        if ( rc != 0 )
+        {
+            LOGERR ( klogSys, rc, "VCursorFlushPageInt: wait failed - exiting" );
+            KLockUnlock ( self -> flush_lock );
+            return rc;
+        }
+    }
+
+    if ( self -> flush_state != vfReady )
+    {
+        if ( self -> flush_state != vfBgErr )
+            rc = RC ( rcVDB, rcCursor, rcFlushing, rcCursor, rcInconsistent );
+        else
+        {
+            rc_t rc2;
+            MTCURSOR_DBG (( "VCursorFlushPageInt: waiting on thread to exit\n" ));
+            rc = KThreadWait ( self -> flush_thread, & rc2 );
+            if ( rc == 0 )
+            {
+                rc = rc2;
+                MTCURSOR_DBG (( "VCursorFlushPageInt: releasing thread\n" ));
+                KThreadRelease ( self -> flush_thread );
+                self -> flush_thread = NULL;
+            }
+        }
+
+        PLOGERR ( klogInt, (klogInt, rc, "VCursorFlushPageInt: not in ready state[$(state)] - exiting","state=%hu",self -> flush_state ));
+        KLockUnlock ( self -> flush_lock );
+        return rc;
+    }
+
+    MTCURSOR_DBG (( "VCursorFlushPageInt: running buffer page\n" ));
+
+    /* first, tell all columns to bundle up their pages into buffers */
+    if ( VectorDoUntil ( & self -> row, false, WColumnBufferPage, & end_id ) )
+    {
+        VectorForEach ( & self -> row, false, WColumnDropPage, NULL );
+        self -> flush_state = vfFgErr;
+        rc = RC ( rcVDB, rcCursor, rcFlushing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        /* supposed to be constant */
+        assert ( end_id == self -> end_id );
+
+        MTCURSOR_DBG (( "VCursorFlushPageInt: pages buffered - capturing id and count\n" ));
+        self -> flush_id = self -> start_id;
+        self -> flush_cnt = self -> end_id - self -> start_id;
+
+        self -> start_id = self -> end_id;
+        self -> end_id = self -> row_id + 1;
+        self -> state = vcReady;
+
+        MTCURSOR_DBG (( "VCursorFlushPageInt: state set to busy - signaling bg thread\n" ));
+        self -> flush_state = vfBusy;
+        rc = KConditionSignal ( self -> flush_cond );
+        if ( rc != 0 )
+            LOGERR ( klogSys, rc, "VCursorFlushPageInt: condition returned error on signal" );
+    }
+
+    MTCURSOR_DBG (( "VCursorFlushPageInt: unlocking\n" ));
+    KLockUnlock ( self -> flush_lock );
+
+    if (sync && rc == 0) {
+        /* wait for flush to finish before returning */
+        MTCURSOR_DBG (( "VCursorFlushPage: going to acquire lock\n" ));
+        /* get lock */
+        rc = KLockAcquire ( self -> flush_lock );
+        if ( rc != 0 )
+            return rc;
+
+        MTCURSOR_DBG (( "VCursorFlushPage: have lock\n" ));
+
+        /* wait until background thread has finished */
+        while ( self -> flush_state == vfBusy )
+        {
+            MTCURSOR_DBG (( "VCursorFlushPage: waiting for background thread\n" ));
+            rc = KConditionWait ( self -> flush_cond, self -> flush_lock );
+            if ( rc != 0 )
+            {
+                LOGERR ( klogSys, rc, "VCursorFlushPage: wait failed - exiting" );
+                KLockUnlock ( self -> flush_lock );
+                return rc;
+            }
+        }
+
+        /* what was the proper rc */
+        if ( self -> flush_state != vfReady )
+        {
+            if ( self -> flush_state != vfBgErr )
+                rc = RC ( rcVDB, rcCursor, rcFlushing, rcCursor, rcInconsistent );
+            else
+            {
+                rc_t rc2;
+                MTCURSOR_DBG (( "VCursorFlushPage: waiting on thread to exit\n" ));
+                rc = KThreadWait ( self -> flush_thread, & rc2 );
+                if ( rc == 0 )
+                {
+                    rc = rc2;
+                    MTCURSOR_DBG (( "VCursorFlushPage: releasing thread\n" ));
+                    KThreadRelease ( self -> flush_thread );
+                    self -> flush_thread = NULL;
+                }
+            }
+
+            PLOGERR ( klogInt, (klogInt, rc, "VCursorFlushPage: not in ready state[$(state)] - exiting",
+                                "state=%hu", self -> flush_state ));
+
+            KLockUnlock ( self -> flush_lock );
+            return rc;
+        }
+        KLockUnlock ( self -> flush_lock );
+    }
+#endif
+    return rc;
+}
+
+static
+rc_t VCursorFlushPageInt ( VCursor *self, bool sync )
+{
+    switch ( self -> state )
+    {
+        case vcConstruct:
+            return RC ( rcVDB, rcCursor, rcFlushing, rcCursor, rcNotOpen );
+        case vcFailed:
+            return RC ( rcVDB, rcCursor, rcFlushing, rcCursor, rcInvalid );
+        case vcRowOpen:
+            return RC ( rcVDB, rcCursor, rcFlushing, rcCursor, rcBusy );
+        default:
+            break;
+    }
+    if ( self -> start_id == self -> end_id )
+    {
+        /* the cursor should be in unwritten state,
+           where the row_id can be reset but drags
+           along the other markers. */
+        assert ( self -> end_id == self -> row_id );
+        return 0;
+    }
+    if (self->flush_thread)
+        return VCursorFlushPageThread(self, sync);
+    else
+        return VCursorFlushPageNoThread(self);
+}
+
+LIB_EXPORT rc_t CC VCursorFlushPage ( VCursor *self )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcCursor, rcFlushing, rcSelf, rcNull );
+    else if ( self -> read_only )
+        rc = RC ( rcVDB, rcCursor, rcFlushing, rcCursor, rcReadonly );
+    else
+        rc = VCursorFlushPageInt ( self, true );
+
+    if ( rc == 0 )
+    {
+        assert ( self -> row_id == self -> start_id );
+        self -> end_id = self -> row_id;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VCursorCommit ( VCursor *self )
+{
+    rc_t rc = VCursorFlushPage ( self );
+    if ( rc == 0 )
+    {
+        VTable *tbl = self -> tbl;
+        if ( tbl -> read_col_cache_valid )
+        {
+            tbl -> read_col_cache_valid = false;
+            BSTreeWhack ( & tbl -> read_col_cache, VColumnRefWhack, NULL );
+        }
+        if ( tbl -> write_col_cache_valid )
+        {
+            tbl -> write_col_cache_valid = false;
+            BSTreeWhack ( & tbl -> write_col_cache, VColumnRefWhack, NULL );
+        }
+    }
+    return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent table
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VCursorOpenParentUpdate ( VCursor *self, VTable **tbl )
+{
+    rc_t rc;
+
+    if ( tbl == NULL )
+        rc = RC ( rcVDB, rcCursor, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcSelf, rcNull );
+        else if ( self -> tbl -> read_only )
+            rc = RC ( rcVDB, rcCursor, rcAccessing, rcTable, rcReadonly );
+        else
+        {
+            rc = VTableAddRef ( self -> tbl );
+            if ( rc == 0 )
+            {
+                * tbl = self -> tbl;
+                return 0;
+            }
+        }
+
+        * tbl = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/wdatabase.c b/libs/vdb/wdatabase.c
new file mode 100644
index 0000000..f330c74
--- /dev/null
+++ b/libs/vdb/wdatabase.c
@@ -0,0 +1,680 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include "database-priv.h"
+#include "dbmgr-priv.h"
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "linker-priv.h"
+
+#include <kdb/kdb-priv.h>
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/meta.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * VDatabase
+ *  opaque connection to a database within file system
+ */
+
+
+/* StoreSchema
+ */
+rc_t VDatabaseStoreSchema ( VDatabase *self )
+{
+    /* open schema node */
+    KMDataNode *node;
+    rc_t rc = KMetadataOpenNodeUpdate ( self -> meta, & node, "schema" );
+    if ( rc == 0 )
+    {
+        size_t num_writ;
+        char expr [ 256 ];
+        rc = VSchemaToText ( self -> schema, expr, sizeof expr - 1, & num_writ,
+            "%N%V", self -> sdb -> name, self -> sdb -> version );
+        if ( rc != 0 )
+            LOGERR ( klogInt, rc, "failed to determine database schema" );
+        else
+        {
+            expr [ num_writ ] = 0;
+            rc = KMDataNodeWriteAttr ( node, "name", expr );
+            if ( rc != 0 )
+                PLOGERR (klogInt, ( klogInt, rc, "failed to write database type '$(expr)'", "expr=%s", expr ));
+            else
+            {
+                /* truncate existing schema */
+                rc = KMDataNodeWrite ( node, "", 0 );
+                if ( rc == 0 )
+                {
+                    rc = VSchemaDump ( self -> schema, sdmCompact, expr,
+                        ( rc_t ( CC * ) ( void*, const void*, size_t ) ) KMDataNodeAppend, node );
+                }
+                if ( rc != 0 )
+                    PLOGERR (klogInt, ( klogInt, rc, "failed to write database schema '$(expr)'", "expr=%s", expr ));
+            }
+        }
+
+        KMDataNodeRelease ( node );
+    }
+    return rc;
+}
+
+
+/* OpenUpdate
+ *  finish create operation
+ */
+static
+rc_t VDatabaseOpenUpdate ( VDatabase *self, const char *decl )
+{
+    /* open metadata */
+    rc_t rc = KDatabaseOpenMetadataUpdate ( self -> kdb, & self -> meta );
+    if ( rc == 0 )
+    {
+        /* fetch stored schema */
+        rc = VDatabaseLoadSchema ( self );
+        if ( rc == 0 )
+        {
+            /* fetch requested schema */
+            const SDatabase *sdb = self -> sdb;
+            if ( decl != NULL && decl [ 0 ] != 0 )
+            {
+                uint32_t type;
+                const SNameOverload *name;
+
+                if ( self -> dad != NULL )
+                {
+                    const SDBMember *mbr = SDatabaseFind ( self -> dad -> sdb,
+                        self -> schema, & name, & type, decl, "VDatabaseOpenUpdate" );
+                    if ( mbr == NULL || type != eDBMember )
+                    {
+                        PLOGMSG ( klogWarn, ( klogWarn, "expression '$(expr)' is not a database member",
+                                   "expr=%s", decl ));
+                        sdb = NULL;
+                    }
+                    else
+                    {
+                        sdb = mbr -> db;
+                        assert ( sdb != NULL );
+                    }
+                }
+                else
+                {
+                    sdb = VSchemaFind ( self -> schema,
+                        & name, & type, decl, "VDatabaseOpenUpdate", true );
+                    if ( sdb != NULL && type != eDatabase )
+                    {
+                        PLOGMSG ( klogWarn, ( klogWarn, "expression '$(expr)' is not a database",
+                                   "expr=%s", decl ));
+                        sdb = NULL;
+                    }
+                }
+            }
+
+            /* error if the two definitions differ */
+            if ( sdb != NULL && self -> sdb != NULL && sdb != self -> sdb )
+                rc = RC ( rcVDB, rcDatabase, rcOpening, rcSchema, rcIncorrect );
+            else if ( sdb == NULL && self -> sdb == NULL )
+                rc = RC ( rcVDB, rcDatabase, rcOpening, rcSchema, rcNotFound );
+            else if ( self -> sdb == NULL )
+            {
+                /* write schema to metadata */
+                self -> sdb = sdb;
+                rc = VDatabaseStoreSchema ( self );
+            }
+            else if ( sdb != NULL )
+            {
+                /* use latest schema but don't overwrite in metadata */
+                self -> sdb = sdb;
+            }
+        }
+    }
+
+    DBGMSG(DBG_VDB, DBG_FLAG(DBG_VDB_VDB), ("VDatabaseOpenUpdate = %d\n", rc));
+
+    return rc;
+}
+
+
+/* CreateDB
+ * VCreateDB
+ *  create a new or open an existing database
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "schema" [ IN ] - schema object containg database
+ *  declaration to be used in creating db [ needed by manager ].
+ *
+ *  "decl" [ IN ] - type and optionally version of db schema
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+LIB_EXPORT rc_t CC VDBManagerVCreateDB ( VDBManager *self, VDatabase **dbp,
+    const VSchema *schema, const char *decl,
+    KCreateMode cmode, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( dbp == NULL )
+        rc = RC ( rcVDB, rcMgr, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcCreating, rcSelf, rcNull );
+        else if ( schema == NULL )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcSchema, rcNull );
+        else if ( decl == NULL )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcNull );
+        else if ( decl [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcEmpty );
+        else
+        {
+            rc = VDatabaseMake ( dbp, self, NULL, schema );
+            if ( rc == 0 )
+            {
+                VDatabase *db = * dbp;
+
+                rc = KDBManagerVCreateDB ( self -> kmgr, & db -> kdb, cmode, path, args );
+                if ( rc == 0 )
+                {
+                    rc = VDatabaseOpenUpdate ( db, decl );
+                    if ( rc == 0 )
+                        return 0;
+
+                    rc = ResetRCContext ( rc, rcVDB, rcMgr, rcCreating );
+                }
+
+                VDatabaseWhack ( db );
+            }
+        }
+
+        * dbp = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDBManagerCreateDB ( VDBManager *self, VDatabase **db,
+    const VSchema *schema, const char *decl,
+    KCreateMode cmode, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = VDBManagerVCreateDB ( self, db, schema, decl, cmode, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseVCreateDB ( VDatabase *self, VDatabase **dbp,
+    const char *decl, KCreateMode cmode, const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( dbp == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcCreating, rcSelf, rcNull );
+        else if ( decl == NULL )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcNull );
+        else if ( decl [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcEmpty );
+        else if ( self -> read_only )
+            rc = RC ( rcVDB, rcDatabase, rcCreating, rcDatabase, rcReadonly );
+        else
+        {
+            rc = VDatabaseMake ( dbp, self -> mgr, self, self -> schema );
+            if ( rc == 0 )
+            {
+                VDatabase *db = * dbp;
+
+                rc = KDatabaseVCreateDB ( self -> kdb, & db -> kdb, cmode, name, args );
+                if ( rc == 0 )
+                {
+                    rc = VDatabaseOpenUpdate ( db, decl );
+                    if ( rc == 0 )
+                        return 0;
+
+                    rc = ResetRCContext ( rc, rcVDB, rcDatabase, rcCreating );
+                }
+
+                VDatabaseWhack ( db );
+            }
+        }
+
+        * dbp = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseCreateDB ( VDatabase *self, VDatabase **db,
+    const char *decl, KCreateMode cmode, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VDatabaseVCreateDB ( self, db, decl, cmode, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseVDropDB ( VDatabase *self,
+                                     const char *name, va_list args)
+{
+    return KDatabaseVDropDB(self->kdb, name, args);
+}
+
+LIB_EXPORT rc_t CC VDatabaseDropDB ( VDatabase *self,
+                                    const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+    
+    va_start ( args, name );
+    rc = VDatabaseVDropDB(self, name, args);
+    va_end ( args );
+    
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseVDropTable ( VDatabase *self,
+                                    const char *name, va_list args)
+{
+    return KDatabaseVDropTable(self->kdb, name, args);
+}
+
+LIB_EXPORT rc_t CC VDatabaseDropTable ( VDatabase *self,
+                                      const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+    
+    va_start ( args, name );
+    rc = VDatabaseVDropTable(self, name, args);
+    va_end ( args );
+    
+    return rc;
+}
+
+
+/* OpenDBUpdate
+ * VOpenDBUpdate
+ *  open a database for read/write
+ *
+ *  "db" [ OUT ] - return parameter for newly opened database
+ *
+ *  "schema" [ IN, NULL OKAY ] - schema object containg database
+ *  declaration to be used in creating db [ needed by manager ].
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to database
+ */
+LIB_EXPORT rc_t CC VDBManagerVOpenDBUpdate ( VDBManager *self, VDatabase **dbp,
+    const VSchema *schema, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( dbp == NULL )
+        rc = RC ( rcVDB, rcMgr, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcSelf, rcNull );
+        else
+        {
+            if ( schema == NULL )
+                schema = self -> schema;
+
+            rc = VDatabaseMake ( dbp, self, NULL, schema );
+            if ( rc == 0 )
+            {
+                VDatabase *db = * dbp;
+
+                rc = KDBManagerVOpenDBUpdate ( self -> kmgr, & db -> kdb, path, args );
+                if ( rc == 0 )
+                {
+                    rc = VDatabaseOpenUpdate ( db, NULL );
+                    if ( rc == 0 )
+                        return 0;
+                }
+                        
+                VDatabaseWhack ( db );
+            }
+        }
+
+        * dbp = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDBManagerOpenDBUpdate ( VDBManager *self, VDatabase **db,
+    const VSchema *schema, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = VDBManagerVOpenDBUpdate ( self, db, schema, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseVOpenDBUpdate ( VDatabase *self, VDatabase **dbp,
+    const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( dbp == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcOpening, rcSelf, rcNull );
+        else if ( self -> read_only )
+            rc = RC ( rcVDB, rcDatabase, rcOpening, rcDatabase, rcReadonly );
+        else
+        {
+            rc = VDatabaseMake ( dbp, self -> mgr, self, self -> schema );
+            if ( rc == 0 )
+            {
+                VDatabase *db = * dbp;
+
+                rc = KDatabaseVOpenDBUpdate ( self -> kdb, & db -> kdb, name, args );
+                if ( rc == 0 )
+                {
+                    rc = VDatabaseOpenUpdate ( db, NULL );
+                    if ( rc == 0 )
+                        return 0;
+                }
+
+                VDatabaseWhack ( db );
+            }
+        }
+
+        * dbp = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseOpenDBUpdate ( VDatabase *self, VDatabase **db, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VDatabaseVOpenDBUpdate ( self, db, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC VDatabaseVLock ( VDatabase *self, uint32_t type, const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcLocking, rcSelf, rcNull );
+    else
+        rc = KDatabaseVLock ( self -> kdb, type, name, args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseLock ( VDatabase *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, name );
+
+    rc = VDatabaseVLock ( self, type, name, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptDatabase, kptTable and kptIndex
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC VDatabaseVUnlock ( VDatabase *self, uint32_t type, const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcUnlocking, rcSelf, rcNull );
+    else
+        rc = KDatabaseVUnlock ( self -> kdb, type, name, args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseUnlock ( VDatabase *self, uint32_t type, const char *name, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, name );
+
+    rc = VDatabaseVUnlock ( self, type, name, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* OpenMetadataUpdate
+ *  opens metadata for update
+ *
+ *  "meta" [ OUT ] - return parameter for metadata
+ */
+LIB_EXPORT rc_t CC VDatabaseOpenMetadataUpdate ( VDatabase *self, KMetadata **meta )
+{
+    rc_t rc;
+    if ( meta == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        * meta = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            /* we operate under the notion of
+               single-threaded operation, so hand out
+               read or update capable object */
+            rc = KMetadataAddRef ( self -> meta );
+            if ( rc == 0 )
+                * meta = self -> meta;
+        }
+    }
+
+    return rc;
+}
+
+
+/* ColumnCreateParams
+ *  sets the creation parameters for physical columns
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "checksum" [ IN ] - the type of checksum information to
+ *  apply when writing blobs
+ *
+ *  "pgsize" [ IN, DEFAULT ZERO ] - size of internal column "pages"
+ *  the default value is indicated by 0 ( zero ).
+ *  NB - CURRENTLY THE ONLY SUPPORTED PAGE SIZE IS 1 ( ONE ) BYTE.
+ */
+LIB_EXPORT rc_t CC VDatabaseColumnCreateParams ( VDatabase *self,
+    KCreateMode cmode, KChecksum checksum, size_t pgsize )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcTable, rcUpdating, rcSelf, rcNull );
+
+    KDatabaseSetCmode ( self->kdb, cmode );
+    KDatabaseSetChecksum ( self->kdb, checksum );
+
+    self -> pgsize = pgsize;
+
+    return 0;
+}
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VDatabaseOpenManagerUpdate ( VDatabase *self, VDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = VDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VDatabaseOpenParentUpdate ( VDatabase *self, VDatabase **par )
+{
+    rc_t rc;
+
+    if ( par == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else if ( self -> dad != NULL && self -> dad -> read_only )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcDatabase, rcReadonly );
+        else
+        {
+            rc = VDatabaseAddRef ( self -> dad );
+            if ( rc == 0 )
+            {
+                * par = self -> dad;
+                return 0;
+            }
+        }
+
+        * par = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenKDatabase
+ *  returns a new reference to underlying KDatabase
+ */
+LIB_EXPORT rc_t CC VDatabaseOpenKDatabaseUpdate ( VDatabase *self, KDatabase **kdb )
+{
+    rc_t rc;
+
+    if ( kdb == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcSelf, rcNull );
+        else if ( self -> read_only )
+            rc = RC ( rcVDB, rcDatabase, rcAccessing, rcDatabase, rcReadonly );
+        else
+        {
+            rc = KDatabaseAddRef ( self -> kdb );
+            if ( rc == 0 )
+            {
+                * kdb = self -> kdb;
+                return 0;
+            }
+        }
+
+        * kdb = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/wdbmgr.c b/libs/vdb/wdbmgr.c
new file mode 100644
index 0000000..911a7fe
--- /dev/null
+++ b/libs/vdb/wdbmgr.c
@@ -0,0 +1,267 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+/* should match dbmgr-cmn.c */
+
+#include "libvdb.vers.h"
+
+#include "dbmgr-priv.h"
+#include "schema-priv.h"
+#include "linker-priv.h"
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/manager.h>
+#include <kdb/kdb-priv.h>
+#include <kfs/directory.h>
+#include <kproc/lock.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * VDBManager
+ *  opaque handle to library
+ */
+
+
+/* MakeUpdate
+ *  create library handle for specific use
+ *  NB - only one of the functions will be implemented
+ *
+ */
+LIB_EXPORT rc_t CC VDBManagerMakeUpdate ( VDBManager ** mgrp,  KDirectory * wd )
+{
+    return VDBManagerMakeUpdateWithVFSManager ( mgrp, wd, NULL );
+}
+
+LIB_EXPORT rc_t CC VDBManagerMakeUpdateWithVFSManager ( VDBManager ** mgrp,
+    KDirectory * wd, struct VFSManager * vfs )
+{
+    rc_t rc;
+
+    if ( mgrp == NULL )
+        rc = RC ( rcVDB, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        VDBManager *mgr = malloc ( sizeof * mgr );
+        if ( mgr == NULL )
+            rc = RC ( rcVDB, rcMgr, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            rc = KDBManagerMakeUpdateWithVFSManager ( & mgr -> kmgr, wd, vfs );
+            if ( rc == 0 )
+            {
+                rc = VSchemaMakeIntrinsic ( & mgr -> schema );
+                if ( rc == 0 )
+                {
+                    rc = VLinkerMakeIntrinsic ( & mgr -> linker );
+                    if ( rc == 0 )
+                    {
+                        rc = VDBManagerConfigPaths ( mgr, true );
+                        if ( rc == 0 )
+                        {
+                            mgr -> user = NULL;
+                            mgr -> user_whack = NULL;
+                            KRefcountInit ( & mgr -> refcount, 1, "VDBManager", "make-update", "vmgr" );
+                            * mgrp = mgr;
+                            return 0;
+                        }
+
+                        VLinkerRelease ( mgr -> linker );
+                    }
+
+                    VSchemaRelease ( mgr -> schema );
+                }
+
+                KDBManagerRelease ( mgr -> kmgr );
+            }
+
+            free ( mgr );
+        }
+
+        * mgrp = NULL;
+    }
+    return rc;
+}
+
+
+/* MakeRsrc
+ *  common make, regardless of library
+ */
+LIB_EXPORT rc_t CC VDBManagerMakeRsrc ( VDBManager ** mgr, struct VFSManager * vfs )
+{
+    return VDBManagerMakeUpdateWithVFSManager ( mgr, NULL, vfs );
+}
+
+
+/* Version
+ *  returns the library version
+ */
+LIB_EXPORT rc_t CC VDBManagerVersion ( const VDBManager *self, uint32_t *version )
+{
+    if ( version == NULL )
+        return RC ( rcVDB, rcMgr, rcAccessing, rcParam, rcNull );
+    if ( self == NULL )
+        return RC ( rcVDB, rcMgr, rcAccessing, rcSelf, rcNull );
+
+    * version = LIBVDB_VERS;
+    return 0;
+}
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC VDBManagerVLock ( VDBManager *self, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcMgr, rcLocking, rcSelf, rcNull );
+    return KDBManagerVLock ( self -> kmgr, path, args );
+}
+
+LIB_EXPORT rc_t CC VDBManagerLock ( VDBManager *self, const char *path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+
+    rc = VDBManagerVLock ( self, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC VDBManagerVUnlock ( VDBManager *self, const char *path, va_list args )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcMgr, rcUnlocking, rcSelf, rcNull );
+    return KDBManagerVUnlock ( self -> kmgr, path, args );
+}
+
+LIB_EXPORT rc_t CC VDBManagerUnlock ( VDBManager *self, const char *path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+
+    rc = VDBManagerVUnlock ( self, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* Drop
+ *  drop an object based on its path
+ *
+ *  "path" [ IN ] - NUL terminated string in UTF-8 giving path to the vdb object
+ */
+LIB_EXPORT rc_t CC VDBManagerVDrop ( VDBManager *self, uint32_t obj_type, const char *path, va_list args )
+{
+    if ( self != NULL )
+        return KDBManagerVDrop ( self -> kmgr, obj_type, path, args );
+
+    return RC ( rcVDB, rcMgr, rcRemoving, rcSelf, rcNull );
+}
+
+LIB_EXPORT rc_t CC VDBManagerDrop ( VDBManager *self, uint32_t obj_type, const char *path, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path );
+
+    rc = VDBManagerVDrop ( self, obj_type, path, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* VDBManagerRunPeriodicTasks
+ *  executes periodic tasks, such as cache flushing
+ */
+LIB_EXPORT rc_t CC VDBManagerRunPeriodicTasks ( const VDBManager *self )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcMgr, rcExecuting, rcSelf, rcNull );
+
+    return KDBManagerRunPeriodicTasks ( self -> kmgr );
+}
+
+/* OpenKDBManager
+ *  returns a new reference to KDBManager used by VDBManager
+ */
+LIB_EXPORT rc_t CC VDBManagerOpenKDBManagerUpdate ( VDBManager *self, KDBManager **kmgr )
+{
+    rc_t rc;
+
+    if ( kmgr == NULL )
+        rc = RC ( rcVDB, rcMgr, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = KDBManagerAddRef ( self -> kmgr );
+            if ( rc == 0 )
+            {
+                * kmgr = self -> kmgr;
+                return 0;
+            }
+        }
+
+        * kmgr = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/vdb/wlinker.c b/libs/vdb/wlinker.c
new file mode 100644
index 0000000..f8ddbe1
--- /dev/null
+++ b/libs/vdb/wlinker.c
@@ -0,0 +1,98 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+
+#include "linker-priv.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+extern VTRANSFACT_DECL ( meta_write );
+extern VTRANSFACT_DECL ( meta_attr_write );
+
+/* newly imported things */
+extern VTRANSFACT_DECL ( NCBI_csra2_stats_trigger );
+extern VTRANSFACT_DECL ( NCBI_SRA_cmp_stats_trigger );
+extern VTRANSFACT_DECL ( NCBI_SRA_cmpf_stats_trigger );
+extern VTRANSFACT_DECL ( NCBI_SRA_extract_name_fmt );
+extern VTRANSFACT_DECL ( NCBI_SRA_extract_spot_name );
+extern VTRANSFACT_DECL ( NCBI_SRA_phred_stats_trigger );
+extern VTRANSFACT_DECL ( NCBI_SRA_qual4_encode );
+extern VTRANSFACT_DECL ( NCBI_SRA_stats_trigger );
+#if HAVE_ALIGN_STATS_TRIGGER
+extern VTRANSFACT_DECL ( NCBI_align_stats_trigger );
+extern VTRANSFACT_DECL ( NCBI_seq_stats_trigger );
+#endif
+extern VTRANSFACT_DECL ( NCBI_refSeq_stats );
+extern VTRANSFACT_DECL ( idx_text_insert );
+extern VTRANSFACT_DECL ( vdb_bzip );
+extern VTRANSFACT_DECL ( vdb_checksum );
+extern VTRANSFACT_DECL ( vdb_fzip );
+extern VTRANSFACT_DECL ( vdb_rlencode );
+extern VTRANSFACT_DECL ( vdb_zip );
+
+/* InitFactories
+ */
+rc_t VLinkerInitFactories ( VLinker *self, struct KSymTable *tbl, struct SchemaEnv const *env )
+{
+    static VLinkerIntFactory fact [] =
+    {
+        { meta_write, "meta:write" },
+        { meta_attr_write, "meta:attr:write" },
+
+        { NCBI_csra2_stats_trigger, "NCBI:csra2:stats_trigger" },
+        { NCBI_SRA_cmp_stats_trigger, "NCBI:SRA:cmp_stats_trigger" },
+        { NCBI_SRA_cmpf_stats_trigger, "NCBI:SRA:cmpf_stats_trigger" },
+        { NCBI_SRA_extract_name_fmt, "NCBI:SRA:extract_name_fmt" },
+        { NCBI_SRA_extract_spot_name, "NCBI:SRA:extract_spot_name" },
+        { NCBI_SRA_phred_stats_trigger, "NCBI:SRA:phred_stats_trigger" },
+        { NCBI_SRA_qual4_encode, "NCBI:SRA:qual4_encode" },
+        { NCBI_SRA_stats_trigger, "NCBI:SRA:stats_trigger" },
+#if HAVE_ALIGN_STATS_TRIGGER
+        { NCBI_align_stats_trigger, "NCBI:align:stats_trigger" },
+        { NCBI_seq_stats_trigger, "NCBI:seq:stats_trigger" },
+#endif
+        { NCBI_refSeq_stats, "NCBI:refSeq:stats" },
+        { idx_text_insert, "idx:text:insert" },
+        { vdb_bzip, "vdb:bzip" },
+        { vdb_checksum, "vdb:checksum" },
+        { vdb_fzip, "vdb:fzip" },
+        { vdb_rlencode, "vdb:rlencode" },
+        { vdb_zip, "vdb:zip" }
+    };
+
+    rc_t rc = VLinkerInitFactoriesRead ( self, tbl, env );
+    if ( rc == 0 )
+        rc = VLinkerAddFactories ( self, fact, sizeof fact / sizeof fact [ 0 ], tbl, env );
+    return rc;
+}
diff --git a/libs/vdb/wphys.c b/libs/vdb/wphys.c
new file mode 100644
index 0000000..af33aaf
--- /dev/null
+++ b/libs/vdb/wphys.c
@@ -0,0 +1,912 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#include <os-native.h>
+
+#define KONST
+#define SKONST
+#include "phys-priv.h"
+#include "schema-parse.h"
+#include "schema-priv.h"
+#include "schema-expr.h"
+#include "table-priv.h"
+#include "cursor-priv.h"
+#include "prod-priv.h"
+#include "prod-expr.h"
+#include "blob-priv.h"
+#include "page-map.h"
+#undef KONST
+#undef SKONST
+
+#include <vdb/vdb-priv.h>
+#include <vdb/cursor.h>
+#include <kdb/manager.h>
+#include <kdb/table.h>
+#include <kdb/column.h>
+#include <kdb/meta.h>
+#include <klib/symbol.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+#if VCURSOR_WRITE_MODES_SUPPORTED
+#error "only kcmInsert and kcmReplace modes supported"
+#else
+#define WHOLE_REPLACE_UPDATE 1
+#endif
+
+/*--------------------------------------------------------------------------
+ * VPhysical
+ */
+
+static
+rc_t VPhysicalConvertStatic ( VPhysical *self );
+
+
+/* Whack
+ */
+void CC VPhysicalWhack ( void *item, void *ignore )
+{
+    VPhysical *self = item;
+    if ( self > FAILED_PHYSICAL )
+    {
+#if PROD_CACHE
+        /* detect close of static column */
+        if ( ! self -> read_only && self -> knode != NULL )
+        {
+            /* if the column is fairly large for metadata */
+            if ( KDataBufferBytes ( & self -> srow ) > 64 * 1024 )
+                /* convert it to a single blob */
+                VPhysicalConvertStatic ( self );
+        }
+#endif
+        if ( ! self -> read_only )
+        {
+            rc_t rc;
+            VCursor *curs = self -> curs;
+            VTable *tbl = curs -> tbl;
+
+            const String *name = & self -> smbr -> name -> name;
+
+            KMDataNode *col_node = tbl -> col_node;
+
+            /* create rename strings */
+            char buff [ 300 ];
+            char *oldname, *colname, *tmpname = buff;
+            int sz = snprintf ( buff, sizeof buff / 3, "%.*s.tmp",
+                ( int ) name -> size - 1, name -> addr + 1 );
+            if ( sz < 0 || sz > sizeof buff / 3 )
+            {
+                tmpname = malloc ( 3 * 4 * 1024 );
+                if ( tmpname == NULL )
+                {
+                    rc = RC ( rcVDB, rcColumn, rcClosing, rcMemory, rcInsufficient );
+                    PLOGERR ( klogSys, ( klogInt, rc, "failed to close column '$(colname)'",
+                        "colname=%.*s", ( int ) name -> size - 1, name -> addr + 1 ));
+                    return;
+                }
+
+                sz = snprintf ( tmpname, 4 * 1024, "%.*s.tmp",
+                    ( int ) name -> size - 1, name -> addr + 1 );
+                assert ( sz > 0 && sz < 4 * 1024 );
+            }
+            oldname = & tmpname [ ++ sz ];
+            colname = & oldname [ sz ];
+            sprintf ( oldname, "%.*s.old", ( int ) name -> size - 1, name -> addr + 1 );
+            sprintf ( colname, "%.*s", ( int ) name -> size - 1, name -> addr + 1 );
+
+            /* close and rename static column */
+            if ( self -> knode != NULL )
+            {
+                rc = KMDataNodeRelease ( self -> knode );
+                if ( rc != 0 )
+                {
+                    PLOGERR ( klogInt, ( klogInt, rc, "failed to release static node when closing column '$(colname)'",
+                                         "colname=%s", colname ));
+                }
+                else
+                {
+                    self -> knode = NULL;
+
+                    assert ( col_node != NULL );
+                    rc = KMDataNodeDropChild ( col_node, "%s", colname );
+                    if ( rc != 0 && GetRCState ( rc ) != rcNotFound )
+                    {
+                        PLOGERR ( klogInt, ( klogInt, rc, "failed to drop previous static node when closing column '$(colname)'",
+                                             "colname=%s", colname ));
+                    }
+                    else
+                    {
+                        rc = KMDataNodeRenameChild ( col_node, tmpname, colname );
+                        if ( rc != 0 )
+                        {
+                            PLOGERR ( klogInt, ( klogInt, rc, "failed to rename static node when closing column '$(colname)'",
+                                                 "colname=%s", colname ));
+                        }
+                        else
+                        {
+                            KTable *ktbl;
+                            rc = VTableOpenKTableUpdate ( tbl, & ktbl );
+                            if ( rc == 0 )
+                            {
+                                rc = KTableUnlock ( ktbl, kptColumn, "%s", colname );
+                                if ( rc == 0 || GetRCState ( rc ) == rcUnlocked )
+                                    rc = KTableDropColumn ( ktbl, "%s", colname );
+                                KTableRelease ( ktbl );
+                                rc = 0;
+                            }
+                        }
+                    }
+                }
+            }
+            else if ( self -> kcol != NULL )
+            {
+                KMDataNode *node;
+
+                /* write fixed length to column metadata */
+                if ( self -> fixed_len != 0 )
+                {
+                    rc = KMetadataOpenNodeUpdate ( self -> meta, & node, "row-len" );
+                    if ( rc != 0 )
+                    {
+                        PLOGERR ( klogInt, ( klogInt, rc, "failed to open '$(node)' node when closing column '$(colname)'",
+                            "node=row-len,colname=%s", colname ));
+                    }
+                    else
+                    {
+                        if ( self -> fixed_len < 0x100 )
+                        {
+                            uint8_t u8 = ( uint8_t ) self -> fixed_len;
+                            rc = KMDataNodeWriteB8 ( node, & u8 );
+                        }
+                        else if ( self -> fixed_len < 0x10000 )
+                        {
+                            uint16_t u16 = ( uint16_t ) self -> fixed_len;
+                            rc = KMDataNodeWriteB16 ( node, & u16 );
+                        }
+                        else
+                        {
+                            rc = KMDataNodeWriteB32 ( node, & self -> fixed_len );
+                        }
+                        if ( rc != 0 )
+                        {
+                            PLOGERR ( klogInt, ( klogInt, rc, "failed to update '$(node)' node when closing column '$(colname)'",
+                                "node=row-len,colname=%s", colname ));
+                        }
+
+                        KMDataNodeRelease ( node );
+                    }
+                }
+                else
+                {
+                    rc = KMetadataOpenNodeUpdate ( self -> meta, & node, NULL );
+                    if ( rc != 0 )
+                    {
+                        PLOGERR ( klogInt, ( klogInt, rc, "failed to open '$(node)' node when closing column '$(colname)'",
+                            "node=/,colname=%s", colname ));
+                    }
+                    else
+                    {
+                        rc = KMDataNodeDropChild ( node, "row-len" );
+                        if ( rc == 0 && GetRCState ( rc ) != rcNotFound )
+                        {
+                            PLOGERR ( klogInt, ( klogInt, rc, "failed to update '$(node)' node when closing column '$(colname)'",
+                                "node=row-len,colname=%s", colname ));
+                        }
+
+                        KMDataNodeRelease ( node );
+                    }
+                }
+
+                /* close column */
+                rc = KMetadataRelease ( self -> meta );
+                if ( rc != 0 )
+                    PLOGERR ( klogInt, ( klogInt, rc, "failed to release column '$(colname)'", "colname=%s", colname ));
+                else
+                {
+                    self -> meta = NULL;
+                    rc = KColumnRelease ( self -> kcol );
+                    if ( rc != 0 )
+                        PLOGERR ( klogInt, ( klogInt, rc, "failed to release column '$(colname)'", "colname=%s", colname ));
+                    else
+                    {
+                        KTable *ktbl;
+
+                        self -> kcol = NULL;
+
+                        /* access KTable */
+                        rc = VTableOpenKTableUpdate ( tbl, & ktbl );
+                        if ( rc != 0 )
+                        {
+                            PLOGERR ( klogInt, ( klogInt, rc, "failed to access physical table when closing column '$(colname)'",
+                                                 "colname=%s", colname ));
+                        }
+                        else
+                        {
+                            bool has_old;
+
+                            /* unlock existing */
+                            rc = KTableUnlock ( ktbl, kptColumn, "%s", colname );
+                            if ( rc == 0 || GetRCState ( rc ) == rcUnlocked )
+                            {
+                                has_old = true;
+
+                                /* rename existing */
+                                rc = KTableRenameColumn ( ktbl, true, colname, oldname );
+                                if ( rc != 0 )
+                                {
+                                    PLOGERR ( klogSys, ( klogInt, rc, "failed to rename previous column when closing '$(colname)'",
+                                                         "colname=%s", colname ));
+                                }
+                            }
+                            else if ( GetRCState ( rc ) == rcNotFound )
+                            {
+                                has_old = false;
+                                rc = 0;
+                            }
+                            if ( rc == 0 )
+                            {
+                                /* rename new column */
+                                rc = KTableRenameColumn ( ktbl, true, tmpname, colname );
+                                if ( rc != 0 )
+                                {
+                                    PLOGERR ( klogSys, ( klogInt, rc, "failed to rename previous column when closing '$(colname)'",
+                                                         "colname=%s", colname ));
+                                    if ( has_old )
+                                    {
+                                        rc = KTableRenameColumn ( ktbl, true, oldname, colname );
+                                        if ( rc != 0 )
+                                        {
+                                            PLOGERR ( klogSys, ( klogInt, rc, "failed to restore previous column when closing '$(colname)'",
+                                                                 "colname=%s", colname ));
+                                        }
+                                    }
+                                }
+                                else
+                                {
+                                    if ( has_old )
+                                    {
+                                        /* drop old column */
+                                        rc = KTableDropColumn ( ktbl, "%s", oldname );
+                                        if ( rc != 0 )
+                                        {
+                                            PLOGERR ( klogWarn, ( klogInt, rc, "preexisting column was not dropped when closing '$(colname)'",
+                                                                  "colname=%s", colname ));
+                                        }
+                                    }
+
+                                    KMDataNodeDropChild ( col_node, "%s", colname );
+                                }
+                            }
+
+                            KTableRelease ( ktbl );
+                        }
+                    }
+                }
+            }
+
+            if ( tmpname != buff )
+                free ( tmpname );
+        }
+
+        VPhysicalDestroy ( self );
+    }
+}
+
+/* Open
+ *  open existing columns
+ *  load schema definitions
+ */
+rc_t VPhysicalOpenWrite ( VPhysical *self, VSchema *schema, const VTable *tbl )
+{
+#if WHOLE_REPLACE_UPDATE
+    return 0;
+#else
+    /* physical member name from schema */
+    const SPhysMember *smbr = self -> smbr;
+    const KSymbol *name = smbr -> name;
+
+    /* open column for update */
+    rc_t rc = KTableOpenColumnUpdate ( tbl -> ktbl, & self -> kcol,
+        "%.*s", ( int ) name -> name . size - 1, name -> name . addr + 1 );
+    if ( rc == 0 )
+    { 
+        /* open its metadata */
+        rc = KColumnOpenMetadataUpdate ( self -> kcol, & self -> meta );
+        if ( rc == 0 )
+        {
+            /* finish off common initialization */
+            rc = VPhysicalFinishKColumn ( self, schema, smbr );
+            if(rc==0) rc = VPhysicalLazySetRange(self);
+        }
+    }
+
+    /* it's okay if a column doesn't exist -
+       it'll either be created or will exist as a static */
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {
+        rc = 0;
+    }
+
+    if ( rc == 0 && self -> kcol == NULL )
+    {
+        /* look for static */
+        const KMDataNode *node;
+        assert ( tbl -> col_node != NULL );
+        rc = KMDataNodeOpenNodeRead ( tbl -> col_node, & node,
+            "%.*s", ( int ) name -> name . size - 1, name -> name . addr + 1 );
+        if ( rc == 0 )
+        {
+            /* reopen for update */
+            KMDataNodeRelease ( node );
+            rc = KMDataNodeOpenNodeUpdate ( tbl -> col_node, & self -> knode,
+                "%.*s", ( int ) name -> name . size - 1, name -> name . addr + 1 );
+            if ( rc == 0 )
+            {
+                /* finish off common initialization */
+                rc = VPhysicalFinishStatic ( self, schema, smbr );
+            }
+        }
+        else if ( GetRCState ( rc ) == rcNotFound )
+        {
+            rc = 0;
+        }
+    }
+
+    return rc;
+#endif
+}
+
+static
+rc_t VPhysicalCreateStatic ( VPhysical *self, const VBlob *vblob )
+{
+    rc_t rc;
+    const String *name;
+
+    VCursor *curs = self -> curs;
+    VTable *tbl = curs -> tbl;
+
+    KMDataNode *col_node = tbl -> col_node;
+    assert ( col_node != NULL );
+
+    /* create node */
+    name = & self -> smbr -> name -> name;
+    rc = KMDataNodeOpenNodeUpdate ( col_node, & self -> knode,
+        "%.*s.tmp", ( int ) name -> size - 1, name -> addr + 1 );
+    if ( rc == 0 )
+    {
+        /* type */
+        char typedecl [ 256 ];
+        rc = VTypedeclToText ( & self -> smbr -> td,
+            curs -> schema, typedecl, sizeof typedecl );
+        if ( rc == 0 )
+            rc = KMDataNodeWriteAttr ( self -> knode, "type", typedecl );
+        if ( rc == 0 )
+        {
+            /* open row */
+            KMDataNode *row;
+            rc = KMDataNodeOpenNodeUpdate ( self -> knode, & row, "row" );
+            if ( rc == 0 )
+            {
+                /* keep a copy of the original */
+                rc = KDataBufferSub ( & vblob -> data, & self -> srow, 0, UINT64_MAX );
+                if ( rc == 0 )
+                {
+                    /* total bits in static row */
+                    uint64_t row_bits = KDataBufferBits ( & vblob -> data );
+
+                    /* check for need to reverse byte order */
+                    bool reverse;
+                    rc = KMDataNodeByteOrder ( row, & reverse );
+                    if ( rc == 0 )
+                    {
+                        KDataBuffer data;
+
+                        /* if the output metadata file is in native byte order */
+                        if ( ! reverse )
+                            rc = KDataBufferSub ( & vblob -> data, & data, 0, UINT64_MAX );
+                        else
+                        {
+                            /* find the datatype for static column */
+                            const SDatatype *dt = VSchemaFindTypeid ( curs -> schema,
+                                self -> smbr -> td . type_id );
+                            assert ( dt != NULL );
+
+                            /* if the type does not need swapping */
+                            if ( dt -> byte_swap == NULL )
+                                rc = KDataBufferSub ( & vblob -> data, & data, 0, UINT64_MAX );
+                            else
+                            {
+                                /* swap into a writable buffer */
+                                rc = KDataBufferMake ( & data, vblob -> data . elem_bits, vblob -> data . elem_count );
+                                if ( rc == 0 )
+                                {
+                                    ( * dt -> byte_swap ) ( data . base,
+                                        vblob -> data . base, ( uint32_t ) ( row_bits / dt -> size ) );
+                                }
+                            }
+                        }
+                        if ( rc == 0 )
+                        {
+                            /* write row */
+                            rc = KMDataNodeWrite ( row, data . base, ( size_t ) ( ( row_bits + 7 ) >> 3 ) );
+                            if ( rc == 0 )
+                            {
+                                /* if row-bits are not integral bytes */
+                                if ( ( row_bits & 7 ) != 0 )
+                                {
+                                    /* record them in a size node */
+                                    KMDataNode *size;
+                                    rc = KMDataNodeOpenNodeUpdate ( self -> knode, & size, "size" );
+                                    if ( rc == 0 )
+                                    {
+                                        rc = KMDataNodeWriteB64 ( size, & row_bits );
+                                        KMDataNodeRelease ( size );
+                                    }
+                                }
+                            }
+
+                            KDataBufferWhack ( & data );
+                        }
+                    }
+                }
+
+                KMDataNodeRelease ( row );
+            }
+        }
+
+        if ( rc != 0 )
+        {
+            KMDataNodeRelease ( self -> knode ), self -> knode = NULL;
+            KMDataNodeDropChild ( col_node, "%.*s", ( int ) name -> size - 1, name -> addr + 1 );
+            KDataBufferWhack ( & self -> srow );
+        }
+        else
+        {
+            self -> sstart_id = vblob -> start_id;
+            self -> sstop_id = vblob -> stop_id;
+            self -> fixed_len = PageMapGetIdxRowInfo ( vblob -> pm, 0, NULL, NULL );
+        }
+    }
+    
+    return rc;
+}
+
+static
+rc_t VPhysicalCreateKColumn ( VPhysical *self )
+{
+    rc_t rc;
+    VCursor *curs = self -> curs;
+    const SPhysMember *smbr = self -> smbr;
+    VTable *tbl = curs -> tbl;
+    const String *name = & smbr -> name -> name;
+
+    /* check for static designation */
+    if ( smbr -> stat )
+    {
+        rc = RC ( rcVDB, rcColumn, rcCreating, rcConstraint, rcViolated );
+        return rc;
+    }
+
+    /* create physical column */
+    rc = KTableCreateColumn ( tbl -> ktbl, & self -> kcol,
+        ( KCreateMode ) tbl -> cmode, ( KChecksum ) tbl -> checksum, tbl -> pgsize, 
+        "%.*s.tmp", ( int ) name -> size - 1, name -> addr + 1 );
+    if ( rc == 0 )
+    {
+        /* create its metadata */
+        rc = KColumnOpenMetadataUpdate ( self -> kcol, & self -> meta );
+        if ( rc == 0 )
+        {
+            /* print typedecl */
+            char buffer [ 256 ];
+            rc = VTypedeclToText ( & smbr -> td,
+                curs -> schema, buffer, sizeof buffer );
+            if ( rc == 0 )
+            {
+                /* create schema node */
+                KMDataNode *schema_node;
+                rc = KMetadataOpenNodeUpdate ( self -> meta, & schema_node, "schema" );
+                if ( rc == 0 )
+                {
+                    /* write column type */
+                    rc = KMDataNodeWriteAttr ( schema_node, "type", buffer );
+                    if ( rc == 0 )
+                    {
+                        /* going to write some schema */
+                        if ( smbr -> type == NULL )
+                        {
+                            /* buffer already contains datatype */
+                            if ( smbr -> td . dim != 1 )
+                            {
+                                /* get just the typename */
+                                /* these statements do nothing! gcc points it out in a warning.
+                                VTypedecl td = smbr -> td;
+                                td . dim = 1;
+                                */
+                                rc = VTypedeclToText ( & smbr -> td,
+                                    curs -> schema, buffer, sizeof buffer );
+                            }
+                        }
+                        else
+                        {
+                            size_t num_writ;
+
+                            /* get physical type expression */
+                            rc = VSchemaToText ( curs -> schema,
+                                buffer, sizeof buffer, & num_writ, "%E", smbr -> type );
+                            if ( rc == 0 )
+                            {
+                                buffer [ num_writ ] = 0;
+                                rc = KMDataNodeWriteAttr ( schema_node, "expr", buffer );
+                                if ( rc == 0 )
+                                {
+                                    const SPhysical *sphys = ( ( const SPhysEncExpr* ) smbr -> type ) -> phys;
+                                    rc = VSchemaToText ( curs -> schema,
+                                        buffer, sizeof buffer, & num_writ, "%N%V",
+                                        sphys -> name, sphys -> version );
+                                    if ( rc == 0 )
+                                        buffer [ num_writ ] = 0;
+                                }
+                            }
+                        }
+                    }
+                    if ( rc == 0 )
+                    {
+                        rc = VSchemaDump ( curs -> schema, sdmCompact, buffer,
+                           ( rc_t ( CC * ) ( void*, const void*, size_t ) ) KMDataNodeAppend, schema_node );
+                        if ( rc == 0 )
+                        {
+                            /* mark it empty */
+                            self -> kstart_id = 1;
+                            self -> kstop_id = 0;
+                        }
+                    }
+                }
+
+                KMDataNodeRelease ( schema_node );
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t VPhysicalWriteKColumn ( VPhysical *self, const VBlob *vblob )
+{
+    KColumnBlob *kblob;
+    rc_t rc = KColumnCreateBlob ( self -> kcol, & kblob );
+    if ( rc == 0 )
+    {
+        /* for now, row counts are 32-bit */
+        uint32_t count = (uint32_t)(vblob -> stop_id - vblob -> start_id + 1);
+        rc = KColumnBlobAssignRange ( kblob, vblob -> start_id, count );
+        if ( rc == 0 )
+        {
+            rc = KColumnBlobAppend ( kblob, vblob -> data . base, KDataBufferBytes ( & vblob -> data ) );
+            if ( rc == 0 )
+            {
+                rc = KColumnBlobCommit ( kblob );
+                if ( rc == 0 )
+                {
+                    /* get the fixed row-length of this blob */
+                    uint32_t blob_fixed = VBlobFixedRowLength ( vblob );
+
+                    /* detect if the column is truly fixed row length */
+                    if ( self -> kstart_id > self -> kstop_id )
+                        self -> fixed_len = blob_fixed;
+                    else if ( blob_fixed != self -> fixed_len )
+                        self -> fixed_len = 0;
+
+                    /* incorporate id range into our view of the world */
+                    if ( vblob -> start_id < self -> kstart_id )
+                        self -> kstart_id = vblob -> start_id;
+                    if ( vblob -> stop_id > self -> kstop_id )
+                        self -> kstop_id = vblob -> stop_id;
+                }
+            }
+        }
+
+        KColumnBlobRelease ( kblob );
+    }
+    return rc;
+}
+
+static
+rc_t VPhysicalConvertStatic ( VPhysical *self )
+{
+#if ! PROD_CACHE
+    return RC ( rcVDB, rcColumn, rcConverting, rcFunction, rcUnsupported );
+#else
+    rc_t rc = VPhysicalCreateKColumn ( self );
+    if ( rc == 0 )
+    {
+        int64_t sstart_id, sstop_id;
+
+        /* save incoming blob cache on stack */
+        VBlob *cache [ PROD_CACHE ];
+        assert ( sizeof cache == sizeof self -> in -> cache );
+        memmove ( cache, self -> in -> cache, sizeof cache );
+
+        /* set incoming blob cache to empty */
+        memset ( self -> in -> cache, 0, sizeof self -> in -> cache );
+
+        for ( sstart_id = self -> sstart_id;
+              rc == 0 && sstart_id <= self -> sstop_id;
+              sstart_id = sstop_id + 1 )
+        {
+            /* 3G rows */
+            sstop_id = sstart_id + 0xC0000000;
+            assert ( sstop_id > sstart_id );
+
+            /* limit to actual end */
+            if ( sstop_id > self -> sstop_id )
+                sstop_id = self -> sstop_id;
+
+            /* don't create tiny additional blobs */
+            else if ( ( self -> sstop_id - sstop_id ) < 1000 )
+                sstop_id = self -> sstop_id;
+
+            /* recreate a VBlob from static that can be sent through encoding */
+            rc = VBlobCreateFromSingleRow ( & self -> in -> cache [ 0 ],
+                sstart_id, sstop_id, & self -> srow, vboNative );
+            if ( rc == 0 )
+            {
+                /* get an encoded version of static blob */
+                VBlob *vblob;
+                rc = VProductionReadBlob ( self -> b2s, & vblob, sstart_id, 1,NULL );
+                if ( rc == 0 )
+                {
+                    /* write encoded blob to physical */
+                    rc = VPhysicalWriteKColumn ( self, vblob );
+
+                    /* in all events, release blob */
+                    TRACK_BLOB ( VBlobRelease, vblob );
+                    ( void ) VBlobRelease ( vblob );
+                }
+            
+                /* release the blob from static */
+                TRACK_BLOB ( VBlobRelease, self -> in -> cache [ 0 ] );
+                ( void ) VBlobRelease ( self -> in -> cache [ 0 ] );
+            }
+        }
+
+        /* restore cache from stack */
+        memmove ( self -> in -> cache, cache, sizeof self -> in -> cache );
+
+        if ( rc == 0 )
+        {
+            const String *name;
+            VCursor *curs = self -> curs;
+            VTable *tbl = curs -> tbl;
+
+            /* tear down static */
+            KMDataNodeRelease ( self -> knode );
+            self -> knode = NULL;
+
+            /* delete column from table */
+            name = & self -> smbr -> name -> name;
+            assert ( tbl -> col_node != NULL );
+            rc = KMDataNodeDropChild ( tbl -> col_node,
+                "%.*s.tmp", ( int ) name -> size - 1, name -> addr + 1 );
+        }
+    }
+
+    return rc;
+#endif
+}
+
+static
+rc_t KMDataNodeWriteId ( KMDataNode *self, int64_t id )
+{
+    int32_t i32;
+    
+    if ( id >= -128 && id < 128 )
+    {
+        int8_t i8 = ( int8_t ) id;
+        return KMDataNodeWriteB8 ( self, & i8 );
+    }
+    if ( id >= -32768 && id < 32768 )
+    {
+        int16_t i16 = ( int16_t ) id;
+        return KMDataNodeWriteB16 ( self, & i16 );
+    }
+    
+    i32 = ( int32_t ) id;
+    if ( ( int64_t ) i32 == id )
+        return KMDataNodeWriteB32 ( self, & i32 );
+    
+    return KMDataNodeWriteB64 ( self, & id );
+}
+
+static
+rc_t KMDataNodeWriteCount ( KMDataNode *self, uint64_t count )
+{
+    if ( count < 0x100 )
+    {
+        uint8_t i8 = ( uint8_t ) count;
+        return KMDataNodeWriteB8 ( self, & i8 );
+    }
+    if ( count < 0x10000 )
+    {
+        uint16_t i16 = ( uint16_t ) count;
+        return KMDataNodeWriteB16 ( self, & i16 );
+    }
+    if ( ( count >> 32 ) == 0 )
+    {
+        uint32_t i32 = ( uint32_t ) count;
+        return KMDataNodeWriteB32 ( self, & i32 );
+    }
+    return KMDataNodeWriteB64 ( self, & count );
+}
+
+static
+rc_t VPhysicalSetStaticId ( VPhysical *self )
+{
+    KMDataNode *node;
+    rc_t rc = KMDataNodeOpenNodeUpdate ( self -> knode, & node, "start_id" );
+    if ( rc == 0 )
+    {
+        rc = KMDataNodeWriteId ( node, self -> sstart_id );
+        KMDataNodeRelease ( node );
+
+        if ( rc == 0 )
+        {
+            rc = KMDataNodeOpenNodeUpdate ( self -> knode, & node, "row_count" );
+            if ( rc == 0 )
+            {
+                rc = KMDataNodeWriteCount ( node, self -> sstop_id - self -> sstart_id + 1 );
+                KMDataNodeRelease ( node );
+            }
+        }
+    }
+    return rc;
+}
+
+static
+rc_t VPhysicalWrite ( VPhysical *self, int64_t id, uint32_t cnt )
+{
+    /* read from page space */
+    VBlob *vblob;
+    rc_t rc = VProductionReadBlob ( self -> in, & vblob, id , cnt,NULL);
+    if ( rc == 0 )
+    {
+        /* test for single row in blob */
+        assert ( vblob != NULL );
+        if ( VBlobIsSingleRow ( vblob ) )
+        {
+            /* new column */
+            if ( self -> knode == NULL && self -> kcol == NULL )
+            {
+                rc = VPhysicalCreateStatic ( self, vblob );
+                TRACK_BLOB ( VBlobRelease, vblob );
+                ( void ) VBlobRelease ( vblob );
+                if ( rc == 0 )
+                    rc = VPhysicalSetStaticId ( self );
+                return rc;
+            }
+
+            /* existing static column */
+            if ( self -> knode != NULL )
+            {
+                /* not allowing both to be active at the same time */
+                assert ( self -> kcol == NULL );
+
+                /* overlapping or adjacent id ranges */
+                assert ( vblob -> start_id <= vblob -> stop_id );
+                if ( vblob -> stop_id + 1 >= self -> sstart_id &&
+                     vblob -> start_id <= self -> sstop_id + 1 )
+                {
+                    /* compare lengths */
+                    if ( self -> fixed_len == PageMapGetIdxRowInfo ( vblob -> pm, 0, NULL, NULL ) )
+                    {
+                        /* compare bits */
+                        assert ( KDataBufferBits ( & self -> srow ) == KDataBufferBits ( & vblob -> data ) );
+                        if ( bitcmp ( self -> srow . base, self -> srow . bit_offset,
+                                      vblob -> data . base, vblob -> data . bit_offset,
+                                      KDataBufferBits ( & self -> srow ) ) == 0 )
+                        {
+                            /* it's fine */
+                            if ( vblob -> start_id < self -> sstart_id )
+                                self -> sstart_id = vblob -> start_id;
+                            if ( vblob -> stop_id > self -> sstop_id )
+                                self -> sstop_id = vblob -> stop_id;
+
+                            TRACK_BLOB ( VBlobRelease, vblob );
+                            ( void ) VBlobRelease ( vblob );
+
+                            return VPhysicalSetStaticId ( self );
+                        }
+                    }
+                }
+            }
+        }
+
+        /* At this point we can no longer be a static row:
+         * the current blob might have been more than a single row, or
+         * it might have been unable to extend range of static as a single row */
+        if ( self -> knode != NULL )
+            rc = VPhysicalConvertStatic ( self );
+
+        /* need to write to KColumn */
+        if ( rc == 0 )
+        {
+            /* not allowing both knode and kcol to be active at the same time */
+            assert ( self -> knode == NULL );
+
+            /* create KColumn if necessary */
+            if ( self -> kcol == NULL )
+                rc = VPhysicalCreateKColumn ( self );
+
+            /* pull through encoding */
+            if ( rc == 0 )
+            {
+                TRACK_BLOB ( VBlobRelease, vblob );
+                ( void ) VBlobRelease ( vblob );
+                rc = VProductionReadBlob ( self -> b2s, & vblob, id, cnt,NULL );
+                if ( rc == 0 )
+                {
+                    /* write encoded blob to physical */
+                    rc = VPhysicalWriteKColumn ( self, vblob );
+                }
+            }
+        }
+
+        TRACK_BLOB ( VBlobRelease, vblob );
+        ( void ) VBlobRelease ( vblob );
+    }
+
+    return rc;
+}
+
+/* Read
+ *  get the blob
+ */
+rc_t VPhysicalRead ( VPhysical *self, VBlob **vblob, int64_t id, uint32_t cnt, uint32_t elem_bits )
+{
+    /* use this as the chance to read from input */
+    if ( self -> in != NULL )
+    {
+        rc_t rc = VPhysicalWrite ( self, id, cnt );
+        if ( rc != 0 )
+        {
+            * vblob = NULL;
+            return rc;
+        }
+    }
+
+    /* now let read-side do its work */
+    return VPhysicalReadBlob ( self, vblob, id, elem_bits );
+}
diff --git a/libs/vdb/wprod.c b/libs/vdb/wprod.c
new file mode 100644
index 0000000..dafb8bb
--- /dev/null
+++ b/libs/vdb/wprod.c
@@ -0,0 +1,439 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#define TRACK_REFERENCES 0
+
+#define KONST const
+#include "prod-priv.h"
+#include "prod-expr.h"
+#include "schema-priv.h"
+#include "schema-expr.h"
+#include "cursor-priv.h"
+#include "column-priv.h"
+#include "phys-priv.h"
+#undef KONST
+
+#include <vdb/cursor.h>
+#include <klib/symbol.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * VProdResolve
+ */
+
+/* ResolveColumn
+ *  resolves a column using read/write expression
+ */
+rc_t VProdResolveColumnRoot ( const VProdResolve *self,
+    VProduction **out, const SColumn *scol )
+{
+    rc_t rc;
+    WColumn *wcol;
+    VTypedesc desc;
+    const char *name;
+    VCursor *curs = self -> curs;
+    VProduction * in;
+
+    * out = NULL;
+
+    /* decide upon behavior */
+    if ( curs -> read_only )
+    {
+        rc = VProdResolveColumnRead ( self, out, scol );
+        if ( rc == 0 && * out <= FAILED_PRODUCTION )
+            return RC ( rcVDB, rcCursor, rcOpening, rcColumn, rcUndefined );
+        return rc;
+    }
+
+    /* write-only cursor must have existing column */
+    wcol = VCursorCacheGet ( & curs -> col, & scol -> cid );
+    if ( wcol == NULL )
+        return 0;
+
+    /* not intended to be reentrant */
+    assert ( wcol -> val == NULL );
+
+    /* evaluate input expression */
+    if ( scol -> validate == NULL )
+    {
+        /* use normal read expression */
+        rc = VProdResolveColumnRead ( self, &in, scol );
+    }
+    else
+    {
+        VFormatdecl fd;
+        
+        /* create fmtdecl from typedecl */
+        memset ( & fd, 0, sizeof fd );
+
+        VDB_DEBUG ( ( "resolving column '%N' validate expression.\n", scol -> name ) );
+
+        /* use validation expression */
+        rc = VProdResolveExpr ( self, &in, & desc, & fd, scol -> validate, false );
+    }
+
+    /* check failures */
+    if ( rc != 0 )
+    {
+        VDB_DEBUG ( ( "failed to resolve column '%N' - %R.\n", scol -> name, rc ) );
+        return rc;
+    }
+    if ( in <= FAILED_PRODUCTION )
+    {
+        VDB_DEBUG ( ( "failed to resolve column '%N' - NULL or failed production.\n", scol -> name ) );
+        return RC ( rcVDB, rcCursor, rcOpening, rcColumn, rcUndefined );
+    }
+
+    /* column name */
+    name = scol -> name -> name . addr;
+
+    /* pick up production */
+    if ( scol -> validate != NULL )
+    {
+        rc = VSimpleProdMake ( & wcol -> val, self -> owned, self -> curs,
+            prodSimpleCast, name, NULL, NULL, NULL, in, chainDecoding );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* create implicit comparison function */
+    else
+    {
+        /* need an output production */
+        if ( wcol -> out == NULL )
+        {
+            rc = VColumnProdMake ( & wcol -> out, self -> owned,
+                & wcol -> dad, prodColumnOut, name );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        /* create comparison func */
+        rc = VFunctionProdMakeBuiltInComp ( & wcol -> val, self -> owned,
+            name, self, wcol -> out, in );
+        if ( rc != 0 )
+            return rc;
+    }
+
+    /* install trigger */
+    rc = VectorAppend ( & curs -> trig, NULL, wcol -> val );
+    if ( rc == 0 )
+        * out = wcol -> val;
+
+    return rc;
+}
+
+rc_t VProdResolveColumn ( const VProdResolve *self,
+    VProduction **out, const SColumn *scol, bool alt )
+{
+    rc_t rc;
+    VColumn *vcol;
+    WColumn *wcol;
+    VCursor *curs = self -> curs;
+
+    /* decide upon behavior */
+    if ( curs -> read_only )
+    {
+        if ( alt )
+        {
+            /* TODO: Generate warning message */
+            return RC ( rcVDB, rcCursor, rcOpening, rcSchema, rcInvalid );
+        }
+        vcol = VCursorCacheGet ( & curs -> col, & scol -> cid );
+        if ( vcol == NULL )
+        {
+            rc = VCursorMakeColumn ( curs, & vcol, scol, self -> cx_bind );
+            if ( rc != 0 )
+                return rc;
+
+#if OPEN_COLUMN_ALTERS_ROW
+            rc = VectorAppend ( & curs -> row, & vcol -> ord, vcol );
+            if ( rc != 0 )
+            {
+                VColumnWhack ( vcol, NULL );
+                return rc;
+            }
+#endif
+            rc = VCursorCacheSet ( & curs -> col, & scol -> cid, vcol );
+            if ( rc != 0 )
+            {
+#if OPEN_COLUMN_ALTERS_ROW
+                void *ignore;
+                VectorSwap ( & curs -> row, vcol -> ord, NULL, & ignore );
+                vcol -> ord = 0;
+#endif
+                VColumnWhack ( vcol, NULL );
+                return rc;
+            }
+        }
+
+        return VProdResolveColumnRead ( self, out, scol );
+    }
+
+    /* write cursor but read side */
+    if ( self -> chain == chainDecoding )
+    {
+        if ( alt )
+        {
+            /* TODO: Generate warning message */
+            return RC ( rcVDB, rcCursor, rcOpening, rcSchema, rcInvalid );
+        }
+
+        return VProdResolveColumnRead ( self, out, scol );
+    }
+
+    /* get existing column */
+    wcol = VCursorCacheGet ( & curs -> col, & scol -> cid );
+    if ( wcol == NULL )
+    {
+        /* normally write-only cursor must have existing column */
+        if ( ! self -> discover_writable_columns )
+            return 0;
+
+        /* auto-create writable column for purposes of discovery */
+        if ( scol -> read_only )
+            return 0;
+        rc = VCursorMakeColumn ( curs, & vcol, scol, self -> cx_bind );
+        if ( rc != 0 )
+            return rc;
+
+        /* add it to the row as if user had done it */
+        rc = VectorAppend ( & curs -> row, & vcol -> ord, vcol );
+        if ( rc == 0 )
+        {
+            /* add it to the indexed vector */
+            rc = VCursorCacheSet ( & curs -> col, & scol -> cid, vcol );
+            if ( rc != 0 )
+            {
+                void *ignore;
+                VectorSwap ( & curs -> row, vcol -> ord, NULL, & ignore );
+                vcol -> ord = 0;
+            }
+        }
+
+        if ( rc != 0 )
+        {
+            VColumnWhack ( vcol, NULL );
+            return rc;
+        }
+
+        wcol = ( WColumn* ) vcol;
+    }
+
+    /* create output production as required */
+    if ( wcol -> out == NULL )
+    {
+        const char *name = scol -> name -> name . addr;
+        rc = VColumnProdMake ( & wcol -> out, self -> owned,
+            & wcol -> dad, prodColumnOut, name );
+        if ( rc != 0 )
+            return rc;
+    }
+    if ( alt )
+    {
+        * out = wcol -> dad . in;
+        assert ( * out != NULL );
+    }
+    else
+    {
+        * out = wcol -> out;
+    }
+    return 0;
+}
+
+/* ResolvePhysical
+ *  resolves a physical column
+ */
+static
+rc_t VProdResolvePhysicalWrite ( const VProdResolve *self, VPhysical *phys )
+{
+    VTypedesc desc;
+    VFormatdecl fd;
+    VProdResolve pr;
+    VProduction *prod;
+    VCursor *curs = self -> curs;
+
+    const char *name;
+    const SExpression *enc;
+    const SPhysMember *smbr;
+
+    /* open the physical column for write
+       load column metadata/schema, complete
+       physical member description. */
+    rc_t rc = VPhysicalOpenWrite ( phys,
+        ( VSchema* ) self -> schema, curs -> tbl );
+    if ( rc != 0 )
+        return rc;
+
+    /* there are two conditions under which a physical member
+       definition would be incommplete prior to opening the
+       column: 1) if the physical column were only forwarded
+       within table schema, or 2) if the column were added as
+       the result of a file system scan.
+
+       for the column to be writable, it must have had a complete
+       member definition from table schema, with a type and an
+       assignment expression, or it must have been added as the
+       result of an fs scan with a simple reciprocal expression.
+       the test for these two cases is for a resolved typedecl
+       and an assignment expression. */
+
+    /* nothing more to do if column does not exist
+       and member was undeclared, or is declared read-only */
+    smbr = phys -> smbr;
+    if ( smbr -> td . type_id == 0 || smbr -> expr == NULL )
+        return 0;
+
+    /* build fmtdecl */
+    fd . td = smbr -> td;
+    fd . fmt = 0;
+
+    /* shift to encode chain */
+    pr = * self;
+    pr . chain = chainEncoding;
+
+    /* resolve the input expression */
+    rc = VProdResolveExpr ( & pr, & phys -> in, & desc, & fd, smbr -> expr, false );
+    if ( rc == 0 && phys -> in == NULL )
+        return RC ( rcVDB, rcCursor, rcOpening, rcColumn, rcUndefined );
+
+    /* NB - at this point, fd and desc
+       represent the column's well-defined type */
+
+    /* member name */
+    name = smbr -> name -> name . addr;
+
+    /* physical encoding */
+    enc = phys -> enc;
+    if ( enc == NULL )
+        enc = smbr -> type;
+
+    /* build encoding schema in steps:
+         in <- page-to-blob
+    */
+    rc = VSimpleProdMake ( & prod, pr . owned,  pr . curs,
+        prodSimplePage2Blob, name, & fd, & desc, NULL, phys -> in, chainEncoding );
+    if ( rc == 0 && enc != NULL )
+    {
+        /* in <- p2b <- encoding-func */
+        pr . blobbing = true;
+        rc = VProdResolveEncodingExpr ( & pr, & prod,
+            prod, ( const SPhysEncExpr* ) enc );
+        if ( rc == 0 )
+        {
+            fd = prod -> fd;
+            desc = prod -> desc;
+        }
+    }
+    if ( rc == 0 )
+    {
+        rc = VSimpleProdMake ( & phys -> b2s, pr . owned, pr . curs,
+            prodSimpleBlob2Serial, name, & fd, & desc, NULL, prod, chainEncoding );
+    }
+
+    return rc;
+}
+
+rc_t VProdResolvePhysical ( const VProdResolve *self, VPhysical *phys )
+{
+    /* build encoding chain if writable cursor */
+    if ( ! self -> curs -> read_only )
+    {
+        rc_t rc = VProdResolvePhysicalWrite ( self, phys );
+        if ( rc != 0 || self -> discover_writable_columns )
+            return rc;
+    }
+
+    /* build decoding chain */
+    return VProdResolvePhysicalRead ( self, phys );
+}
+
+/*--------------------------------------------------------------------------
+ * VColumnProd
+ *  message redirect to VColumn
+ */
+
+rc_t VColumnProdMake ( VProduction **prodp, Vector *owned,
+    VColumn *col, int sub, const char *name )
+{
+    const SColumn *scol = col -> scol;
+
+    /* why was this changed to get the column td from SColumn? */
+    VTypedesc desc;
+    rc_t rc = VSchemaDescribeTypedecl ( col -> schema,
+        & desc, & col -> scol -> td );
+    if ( rc != 0 )
+        * prodp = NULL;
+    else
+    {
+        VColumnProd *prod;
+
+        /* construct an fd because column does not have one */
+        VFormatdecl fd;
+        fd . td = scol -> td;
+        fd . fmt = 0;
+
+        rc = VProductionMake ( prodp, owned, sizeof * prod,
+            prodColumn, sub, name, & fd, & desc, NULL, chainEncoding );
+        if ( rc == 0 )
+        {
+            prod = ( VColumnProd* ) * prodp;
+            prod -> col = col;
+        }
+    }
+    return rc;
+}
+
+void VColumnProdDestroy ( VColumnProd *self )
+{
+}
+
+
+/* Read
+ */
+rc_t VColumnProdRead ( VColumnProd *self, struct VBlob **vblob, int64_t id )
+{
+    WColumn *wcol = ( WColumn* ) self -> col;
+
+    switch ( self -> dad . sub )
+    {
+    case prodColumnOut:
+        return WColumnReadBlob ( wcol, vblob, id );
+    }
+
+    return RC ( rcVDB, rcColumn, rcReading, rcProduction, rcCorrupt );
+}
diff --git a/libs/vdb/wtable.c b/libs/vdb/wtable.c
new file mode 100644
index 0000000..aad1cac
--- /dev/null
+++ b/libs/vdb/wtable.c
@@ -0,0 +1,1055 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#include "table-priv.h"
+#include "cursor-priv.h"
+#include "dbmgr-priv.h"
+#include "schema-priv.h"
+#include "schema-parse.h"
+#include "schema-dump.h"
+#include "database-priv.h"
+#include "linker-priv.h"
+
+#include <vdb/schema.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/table.h>
+#include <kdb/index.h>
+#include <kdb/column.h>
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <klib/symbol.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <va_copy.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * VTable
+ *  a collection of columns indexed by row id, metadata, indices
+ */
+
+
+/* StoreSchema
+ *  stores schema definition in metadata
+ *
+ *  <schema name="">...</schema>
+ */
+LIB_EXPORT rc_t VTableStoreSchema ( VTable *self )
+{
+    /* open schema node */
+    KMDataNode *node;
+    rc_t rc = KMetadataOpenNodeUpdate ( self -> meta, & node, "schema" );
+    if ( rc == 0 )
+    {
+        size_t num_writ;
+        char expr [ 256 ];
+        rc = VSchemaToText ( self -> schema, expr, sizeof expr - 1, & num_writ,
+            "%N%V", self -> stbl -> name, self -> stbl -> version );
+        if ( rc != 0 )
+            LOGERR ( klogInt, rc, "failed to determine table schema" );
+        else
+        {
+            expr [ num_writ ] = 0;
+
+            /* if table has a default view declaration,
+               store the table information under a new attribute */
+            if ( self -> stbl -> dflt_view != NULL )
+            {
+                uint32_t type;
+                const SNameOverload *name;
+                const STable *view = VSchemaFind ( self -> schema, & name, & type,
+                    self -> stbl -> dflt_view-> addr, __func__, false );
+                if ( view == NULL )
+                {
+                    rc = RC ( rcVDB, rcTable, rcUpdating, rcSchema, rcNotFound );
+                    PLOGERR ( klogInt, ( klogInt, rc, "failed to locate default view schema '$(expr)'",
+                                         "expr=%S", self -> stbl -> dflt_view ));
+                }
+                else
+                {
+                    rc = KMDataNodeWriteAttr ( node, "table", expr );
+                    if ( rc != 0 )
+                        PLOGERR ( klogInt, ( klogInt, rc, "failed to write table type '$(expr)'", "expr=%s", expr ));
+                    else
+                    {
+                        rc = VSchemaToText ( self -> schema, expr, sizeof expr - 1, & num_writ,
+                            "%N%V", view -> name, view -> version );
+                        if ( rc != 0 )
+                            LOGERR ( klogInt, rc, "failed to determine table default view schema" );
+                        else
+                            expr [ num_writ ] = 0;
+                    }
+                }
+            }
+
+            if ( rc == 0 )
+            {
+                rc = KMDataNodeWriteAttr ( node, "name", expr );
+                if ( rc != 0 )
+                    PLOGERR ( klogInt, ( klogInt, rc, "failed to write table name '$(expr)'", "expr=%s", expr ));
+            }
+            if ( rc == 0 )
+            {
+                /* truncate existing schema */
+                rc = KMDataNodeWrite ( node, "", 0 );
+                if ( rc == 0 )
+                {
+                    rc = VSchemaDump ( self -> schema, sdmCompact, expr,
+                        ( rc_t ( CC * ) ( void*, const void*, size_t ) ) KMDataNodeAppend, node );
+                }
+                if ( rc != 0 )
+                    PLOGERR ( klogInt, ( klogInt, rc, "failed to write table schema '$(expr)'", "expr=%s", expr ));
+            }
+        }
+
+        KMDataNodeRelease ( node );
+    }
+    return rc;
+}
+
+
+/* OpenUpdate
+ *  finish create operation
+ */
+static
+rc_t VTableOpenUpdate ( VTable *self, const char *decl )
+{
+    /* open metadata */
+    rc_t rc = KTableOpenMetadataUpdate ( self -> ktbl, & self -> meta );
+    if ( rc == 0 )
+    {
+        /* open "col" node */
+        rc = KMetadataOpenNodeUpdate ( self -> meta, & self -> col_node, "col" );
+        if ( rc == 0 )
+        {
+            /* fetch stored schema */
+            rc = VTableLoadSchema ( self );
+            if ( rc == 0 )
+            {
+                /* fetch requested schema */
+                const STable *stbl = self -> stbl;
+                if ( decl != NULL && decl [ 0 ] != 0 )
+                {
+                    uint32_t type;
+                    const SNameOverload *name;
+
+                    if ( self -> db != NULL )
+                    {
+                        const STblMember *mbr = SDatabaseFind ( self -> db -> sdb,
+                            self -> schema, & name, & type, decl, "VTableOpenUpdate" );
+                        if ( mbr == NULL || type != eTblMember )
+                        {
+                            PLOGMSG ( klogWarn, ( klogWarn, "expression '$(expr)' is not a table member",
+                                       "expr=%s", decl ));
+                            stbl = NULL;
+                        }
+                        else
+                        {
+                            stbl = mbr -> tbl;
+                            assert ( stbl != NULL );
+                        }
+                    }
+                    else
+                    {
+                        stbl = VSchemaFind ( self -> schema,
+                            & name, & type, decl, "VTableOpenUpdate", true );
+                        if ( stbl != NULL && type != eTable )
+                        {
+                            PLOGMSG ( klogWarn, ( klogWarn, "expression '$(expr)' is not a table",
+                                       "expr=%s", decl ));
+                            stbl = NULL;
+                        }
+                    }
+                }
+
+                /* error if the two definitions differ */
+                if ( stbl != NULL && self -> stbl != NULL && stbl != self -> stbl )
+                    rc = RC ( rcVDB, rcTable, rcOpening, rcSchema, rcIncorrect );
+                else if ( stbl == NULL && self -> stbl == NULL )
+                    rc = RC ( rcVDB, rcTable, rcOpening, rcSchema, rcNotFound );
+                else if ( self -> stbl == NULL )
+                {
+
+                    /* write schema to metadata */
+                    self -> stbl = stbl;
+                    rc = VTableStoreSchema ( self );
+                }
+                else if ( stbl != NULL )
+                {
+                    /* use latest schema but don't overwrite in metadata */
+                    self -> stbl = stbl;
+                }
+            }
+        }
+    }
+
+    DBGMSG(DBG_VDB, DBG_FLAG(DBG_VDB_VDB), ("VTableOpenUpdate = %d\n", rc));
+
+    return rc;
+}
+
+
+/* CreateTable
+ *  create a new or open an existing table using manager
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "schema" [ IN ] - schema object containg table
+ *  declaration to be used in creating tbl.
+ *
+ *  "typespec" [ IN ] - type and optionally version of table schema,
+ *  e.g. 'MY_NAMESPACE:MyTable' or 'MY_NAMESPACE:MyTable#1.1'
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "path" [ IN ] - NUL terminated string in
+ *  wd-native character set giving path to table
+ */
+LIB_EXPORT rc_t CC VDBManagerVCreateTable ( VDBManager *self, VTable **tblp,
+    const VSchema *schema, const char *typespec,
+    KCreateMode cmode, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( tblp == NULL )
+        rc = RC ( rcVDB, rcMgr, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcCreating, rcSelf, rcNull );
+        else if ( schema == NULL )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcSchema, rcNull );
+        else if ( typespec == NULL )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcNull );
+        else if ( typespec [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcEmpty );
+        else
+        {
+            /* create object with new schema */
+            rc = VTableMake ( tblp, self, NULL, schema );
+            if ( rc == 0 )
+            {
+                VTable *tbl = * tblp;
+
+                /* create physical object */
+                rc = KDBManagerVCreateTable ( self -> kmgr, & tbl -> ktbl, cmode, path, args );
+                if ( rc == 0 )
+                {
+                    rc = VTableOpenUpdate ( tbl, typespec );
+                    if ( rc == 0 )
+                    {
+#if LAZY_OPEN_COL_NODE
+                        KMDataNodeRelease ( tbl -> col_node );
+                        tbl -> col_node = NULL;
+#endif
+                        return 0;
+                    }
+
+                    rc = ResetRCContext ( rc, rcVDB, rcMgr, rcCreating );
+                }
+                VTableWhack ( tbl );
+            }
+        }
+
+        * tblp = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDBManagerCreateTable ( VDBManager *self, VTable **tbl,
+    const VSchema *schema, const char *typespec,
+    KCreateMode cmode, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = VDBManagerVCreateTable ( self, tbl, schema, typespec, cmode, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+/* CreateTable
+ *  create a new or open an existing table under database
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "member" [ IN ] - name of table member template under database
+ *  the named member is a table template rather than a named table.
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "cmode_mask" [ IN ] - if a bit of "cmode_mask" is set (1) then
+ *  the corresponding bit of "cmode" is used for the table,
+ *  otherwise (0) the corresponding bit is taken from db and "cmode"'s
+ *  bit is ignored
+ *  the mask for setting mode (kcmOpen, kcmInit, kcmCreate) is at least
+ *  one bit set in the mask kcmValueMask.
+ *
+ *  "name" [ IN ] - NUL terminated string in
+ *  db-native character set giving actual table name
+ */
+LIB_EXPORT rc_t CC VDatabaseVCreateTableByMask ( VDatabase *self, VTable **tblp,
+    const char *member, KCreateMode cmode, KCreateMode cmode_mask, const char *name, va_list args )
+{
+    rc_t rc;
+
+    if ( tblp == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcCreating, rcSelf, rcNull );
+        else if ( member == NULL )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcNull );
+        else if ( member [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcEmpty );
+        else if ( self -> read_only )
+            rc = RC ( rcVDB, rcDatabase, rcCreating, rcDatabase, rcReadonly );
+        else
+        {
+            rc = VTableMake ( tblp, self -> mgr, self, self -> schema );
+            if ( rc == 0 )
+            {
+                VTable *tbl = * tblp;
+
+                rc = KDatabaseVCreateTableByMask ( self -> kdb, & tbl -> ktbl, cmode, cmode_mask, name, args );
+                if ( rc == 0 )
+                {
+                    rc = VTableOpenUpdate ( tbl, member );
+                    if ( rc == 0 )
+                    {
+                        tbl -> pgsize = self -> pgsize;
+                        tbl -> cmode = KDatabaseGetCmode ( self->kdb ); /* TODO: do we really want to inherit open mode from db? */
+                        tbl -> checksum = KDatabaseGetChecksum ( self->kdb );
+#if LAZY_OPEN_COL_NODE
+                        KMDataNodeRelease ( tbl -> col_node );
+                        tbl -> col_node = NULL;
+#endif
+                        return 0;
+                    }
+
+                    rc = ResetRCContext ( rc, rcVDB, rcDatabase, rcCreating );
+                }
+
+                VTableWhack ( tbl );
+            }
+        }
+
+        * tblp = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseCreateTable ( struct VDatabase *self, VTable **tbl,
+    const char *member, KCreateMode cmode, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VDatabaseVCreateTable ( self, tbl, member, cmode, name, args );
+    va_end ( args );
+
+    return rc;
+}
+LIB_EXPORT rc_t CC VDatabaseVCreateTable ( struct VDatabase *self, VTable **tbl,
+    const char *member, KCreateMode cmode, const char *name, va_list args )
+{
+    return VDatabaseVCreateTableByMask ( self, tbl, member, cmode, -1, name, args );
+}
+
+
+LIB_EXPORT rc_t CC VDatabaseCreateTableDefault ( VDatabase *self, VTable **tbl,
+    const char *member, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VDatabaseVCreateTableByMask ( self, tbl, member, 0, 0, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VDatabaseVCreateTableDefault ( VDatabase *self, VTable **tbl,
+    const char *member, const char *name, va_list args )
+{
+    return VDatabaseVCreateTableByMask ( self, tbl, member, 0, 0, name, args );
+}
+
+LIB_EXPORT rc_t CC VDatabaseCreateTableByMask ( VDatabase *self, VTable **tbl,
+    const char *member, KCreateMode cmode, KCreateMode cmode_mask,
+    const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VDatabaseVCreateTableByMask ( self, tbl, member, cmode, cmode_mask, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* OpenTableUpdate
+ * VOpenTableUpdate
+ *  open a table for read/write
+ *
+ *  "tbl" [ OUT ] - return parameter for newly opened table
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving name of table
+ */
+LIB_EXPORT rc_t CC VDBManagerVOpenTableUpdate ( VDBManager *self, VTable **tblp,
+    const VSchema *schema, const char *path, va_list args )
+{
+    rc_t rc;
+
+    if ( tblp == NULL )
+        rc = RC ( rcVDB, rcMgr, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcMgr, rcOpening, rcSelf, rcNull );
+        else
+        {
+            /* if no schema is given, always pass intrinsic */
+            if ( schema == NULL )
+                schema = self -> schema;
+
+            rc = VTableMake ( tblp, self, NULL, schema );
+            if ( rc == 0 )
+            {
+                VTable *tbl = * tblp;
+                rc = KDBManagerVOpenTableUpdate ( self -> kmgr, & tbl -> ktbl, path, args );
+                if ( rc == 0 )
+                {
+                    tbl -> blob_validation = KTableHasRemoteData ( tbl -> ktbl );
+                    rc = VTableOpenUpdate ( tbl, NULL );
+                    if ( rc == 0 )
+                    {
+#if LAZY_OPEN_COL_NODE
+                        KMDataNodeRelease ( tbl -> col_node );
+                        tbl -> col_node = NULL;
+#endif
+                        return 0;
+                    }
+                }
+                VTableWhack ( tbl );
+            }
+        }
+        * tblp = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDBManagerOpenTableUpdate ( VDBManager *self,
+    VTable **tbl, const VSchema *schema, const char *path, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, path );
+    rc = VDBManagerVOpenTableUpdate ( self, tbl, schema, path, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseVOpenTableUpdate ( VDatabase *self,
+    VTable **tblp, const char *name, va_list args )
+{ 
+    rc_t rc;
+
+    if ( tblp == NULL )
+        rc = RC ( rcVDB, rcDatabase, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcDatabase, rcOpening, rcSelf, rcNull );
+        else
+        {
+            rc = VTableMake ( tblp, self -> mgr, self, self -> schema );
+            if ( rc == 0 )
+            {
+                VTable *tbl = * tblp;
+
+                rc = KDatabaseVOpenTableUpdate ( self -> kdb, & tbl -> ktbl, name, args );
+                if ( rc == 0 )
+                {
+                    tbl -> blob_validation = KTableHasRemoteData ( tbl -> ktbl );
+                    rc = VTableOpenUpdate ( tbl, NULL );
+                    if ( rc == 0 )
+                    {
+#if LAZY_OPEN_COL_NODE
+                        KMDataNodeRelease ( tbl -> col_node );
+                        tbl -> col_node = NULL;
+#endif
+                        return 0;
+                    }
+                }
+
+                VTableWhack ( tbl );
+            }
+        }
+
+        * tblp = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VDatabaseOpenTableUpdate ( VDatabase *self, VTable **tbl, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VDatabaseVOpenTableUpdate ( self, tbl, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* Lock
+ *  apply lock
+ *
+ *  if object is already locked, the operation is idempotent
+ *  and returns an rc state of rcLocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC VTableVLock ( VTable *self, uint32_t type, const char * name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcTable, rcLocking, rcSelf, rcNull );
+    else
+        rc = KTableVLock ( self -> ktbl, type, name, args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableLock ( VTable *self, uint32_t type, const char * name, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, name );
+
+    rc = VTableVLock ( self, type, name, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* Unlock
+ *  remove lock
+ *
+ *  if object is already unlocked, the operation is idempotent
+ *  and returns an rc state of rcUnlocked
+ *
+ *  "type" [ IN ] - a KDBPathType
+ *  valid values are kptIndex and kptColumn
+ *
+ *  "path" [ IN ] - NUL terminated path
+ */
+LIB_EXPORT rc_t CC VTableVUnlock ( VTable *self, uint32_t type,
+    const char * name, va_list args )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcTable, rcUnlocking, rcSelf, rcNull );
+    else
+        rc = KTableVUnlock ( self -> ktbl, type, name, args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableUnlock ( VTable *self, uint32_t type,
+    const char * name, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, name );
+
+    rc = VTableVUnlock ( self, type, name, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* OpenMetadataUpdate
+ *  opens metadata file
+ *
+ *  "meta" [ OUT ] - return parameter for metadata
+ */
+LIB_EXPORT rc_t CC VTableOpenMetadataUpdate ( VTable *self, struct KMetadata **meta )
+{
+    rc_t rc;
+    if ( meta == NULL )
+        rc = RC ( rcVDB, rcTable, rcOpening, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcOpening, rcSelf, rcNull );
+        else
+        {
+            * meta = self -> meta;
+            return KMetadataAddRef ( self -> meta );
+        }
+
+        * meta = NULL;
+    }
+
+    return rc;
+}
+
+
+/* CreateIndex
+ * VCreateIndex
+ *  create a new or open an existing index
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "type" [ IN ] - type of index to create
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+LIB_EXPORT rc_t CC VTableCreateIndex ( VTable *self, struct KIndex **idx,
+    KIdxType type, KCreateMode cmode, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VTableVCreateIndex ( self, idx, type, cmode, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableVCreateIndex ( VTable *self, struct KIndex **idx,
+    KIdxType type, KCreateMode cmode, const char *name, va_list args )
+{
+    if ( self != NULL )
+        return KTableVCreateIndex ( self -> ktbl, idx, type, cmode, name, args );
+
+    if ( idx == NULL )
+        return RC ( rcVDB, rcTable, rcCreating, rcParam, rcNull );
+
+    return RC ( rcVDB, rcTable, rcCreating, rcSelf, rcNull );
+}
+
+
+/* OpenIndexUpdate
+ * VOpenIndexUpdate
+ *  open an index for read/write
+ *
+ *  "idx" [ OUT ] - return parameter for newly opened index
+ *
+ *  "name" [ IN ] - NUL terminated string in UTF-8 giving simple name of idx
+ */
+
+LIB_EXPORT rc_t CC VTableOpenIndexUpdate ( VTable *self,
+    struct KIndex **idx, const char *name, ... )
+{
+    rc_t rc;
+    va_list args;
+
+    va_start ( args, name );
+    rc = VTableVOpenIndexUpdate ( self, idx, name, args );
+    va_end ( args );
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableVOpenIndexUpdate ( VTable *self,
+    struct KIndex **idx, const char *name, va_list args )
+{
+    if ( self != NULL )
+        return KTableVOpenIndexUpdate ( self -> ktbl, idx, name, args );
+
+    if ( idx == NULL )
+        return RC ( rcVDB, rcTable, rcOpening, rcParam, rcNull );
+
+    return RC ( rcVDB, rcTable, rcOpening, rcSelf, rcNull );
+}
+
+
+/* ListColumns
+ *  list writable column names
+ *
+ *  "names" [ OUT ] - return parameter for namelist
+ *
+ *  availability: v2.1
+ */
+static
+rc_t list_writable_columns ( VTable *self )
+{
+    rc_t rc;
+    VCursor *curs;
+
+    if ( self -> read_only )
+    {
+        self -> write_col_cache_valid = true;
+        return 0;
+    }
+
+    rc = VTableCreateCursorWriteInt ( self, & curs, kcmInsert, false );
+    if (  rc == 0 )
+    {
+	/* no need for schema-based triggers to fire **/
+	VCursorSuspendTriggers ( curs );
+        /* let this private VCursor-function list the columns */
+        rc = VCursorListWritableColumns ( curs, & self -> write_col_cache );
+        VCursorRelease ( curs );
+        if ( rc == 0 )
+            self -> write_col_cache_valid = true;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableListWritableColumns ( VTable *self, KNamelist **names )
+{
+    rc_t rc;
+
+    if ( names == NULL )
+        rc = RC ( rcVDB, rcTable, rcListing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcSelf, rcNull );
+        else
+        {
+            if ( ! self -> write_col_cache_valid )
+                rc = list_writable_columns ( self );
+
+            if ( self -> write_col_cache_valid )
+                return make_column_namelist ( & self -> write_col_cache, names );
+        }
+
+        * names = NULL;
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableListSeededWritableColumns ( VTable *self,
+    KNamelist **names, const KNamelist *seed )
+{
+    rc_t rc;
+
+    if ( names == NULL )
+        rc = RC ( rcVDB, rcTable, rcListing, rcParam, rcNull );
+    else
+    {
+        * names = NULL;
+
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcSelf, rcNull );
+        else if ( seed == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcParam, rcNull );
+        else
+        {
+            BSTree cache;
+            BSTreeInit ( & cache );
+
+            rc = 0;
+
+            if ( ! self -> read_only )
+            {
+                VCursor *curs;
+                rc = VTableCreateCursorWriteInt ( self, & curs, kcmInsert, false );
+                if (  rc == 0 )
+                {
+                    /* let this private VCursor-function list the columns */
+                    rc = VCursorListSeededWritableColumns ( curs, & cache, seed );
+                    VCursorRelease ( curs );
+                }
+            }
+
+            if ( rc == 0 )
+                rc = make_column_namelist ( & cache, names );
+
+            BSTreeWhack ( & cache, VColumnRefWhack, NULL );
+        }
+    }
+
+    return rc;
+}
+
+
+/* ListDatatypes
+ *  returns list of typedecls for named column
+ *
+ *  "col" [ IN ] - column name
+ *
+ *  "dflt_idx" [ OUT, NULL OKAY ] - returns the zero-based index
+ *  into "typedecls" of the default datatype for the named column
+ *
+ *  "typedecls" [ OUT ] - list of datatypes available for named column
+ *
+ *  availability: v2.1
+ */
+LIB_EXPORT rc_t CC VTableListWritableDatatypes ( VTable *self,
+    const char *col, KNamelist **typedecls )
+{
+    rc_t rc;
+    
+    if ( typedecls == NULL )
+        rc = RC ( rcVDB, rcTable, rcListing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcListing, rcSelf, rcNull );
+        else if ( col == NULL )
+            rc = RC ( rcVDB, rcSchema, rcListing, rcName, rcNull );
+        else if ( col [ 0 ] == 0 )
+            rc = RC ( rcVDB, rcSchema, rcListing, rcName, rcEmpty );
+        else
+        {
+            if ( ! self -> write_col_cache_valid )
+                rc = list_writable_columns ( self );
+
+            if ( self -> write_col_cache_valid )
+            {
+                uint32_t dummy;
+                return make_column_typelist ( & self -> write_col_cache, col, & dummy, typedecls );
+            }
+        }
+
+        * typedecls = NULL;
+    }
+
+    return rc;
+}
+
+
+/* Reindex
+ *  optimize column indices
+ */
+LIB_EXPORT rc_t CC VTableReindex ( VTable *self )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcTable, rcReindexing, rcSelf, rcNull );
+
+    /* now allow the KTable to do its job */
+    return KTableReindex ( self -> ktbl );
+}
+
+
+/* ColumnCreateParams
+ *  sets the creation parameters for physical columns
+ *
+ *  "cmode" [ IN ] - creation mode
+ *
+ *  "checksum" [ IN ] - the type of checksum information to
+ *  apply when writing blobs
+ *
+ *  "pgsize" [ IN, DEFAULT ZERO ] - size of internal column "pages"
+ *  the default value is indicated by 0 ( zero ).
+ *  NB - CURRENTLY THE ONLY SUPPORTED PAGE SIZE IS 1 ( ONE ) BYTE.
+ */
+LIB_EXPORT rc_t CC VTableColumnCreateParams ( struct VTable *self,
+    KCreateMode cmode, KChecksum checksum, size_t pgsize )
+{
+    if ( self == NULL )
+        return RC ( rcVDB, rcTable, rcUpdating, rcSelf, rcNull );
+
+    self -> cmode = cmode;
+    self -> checksum = checksum;
+    self -> pgsize = pgsize;
+
+    return 0;
+}
+
+
+/* OpenManager
+ *  duplicate reference to manager
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VTableOpenManagerUpdate ( VTable *self, struct VDBManager **mgr )
+{
+    rc_t rc;
+
+    if ( mgr == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            rc = VDBManagerAddRef ( self -> mgr );
+            if ( rc == 0 )
+            {
+                * mgr = self -> mgr;
+                return 0;
+            }
+        }
+
+        * mgr = NULL;
+    }
+
+    return rc;
+}
+
+
+/* OpenParent
+ *  duplicate reference to parent database
+ *  NB - returned reference must be released
+ */
+LIB_EXPORT rc_t CC VTableOpenParentUpdate ( VTable *self, struct VDatabase **db )
+{
+    rc_t rc;
+
+    if ( db == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else if ( self -> db != NULL && self -> db -> read_only )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcDatabase, rcReadonly );
+        else
+        {
+            rc = VDatabaseAddRef ( self -> db );
+            if ( rc == 0 )
+            {
+                * db = self -> db;
+                return 0;
+            }
+        }
+
+        * db = NULL;
+    }
+
+    return rc;
+}
+
+/* OpenKTable
+ *  returns a new reference to underlying KTable
+ */
+LIB_EXPORT rc_t CC VTableOpenKTableUpdate ( VTable *self, KTable **ktbl )
+{
+    rc_t rc;
+
+    if ( ktbl == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            * ktbl = self -> ktbl;
+            return KTableAddRef ( * ktbl );
+        }
+
+        * ktbl = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableDropColumn(VTable *self, const char fmt[], ...)
+{
+    va_list va;
+    rc_t rc;
+
+    va_start(va, fmt);
+    rc = VTableVDropColumn(self, fmt, va);
+    va_end(va);
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableVDropColumn(VTable *self, const char fmt[], va_list args)
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        va_list args_copy;
+        bool is_static;
+        va_copy(args_copy, args);
+        is_static = VTableVHasStaticColumn ( self, fmt, args_copy );
+        va_end(args_copy);
+
+        if ( is_static )
+            rc = KMDataNodeVDropChild ( self->col_node, fmt, args );
+        else
+            rc = KTableVDropColumn(self->ktbl, fmt, args);
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VTableRenameColumn ( struct VTable *self, bool force,
+    const char *from, const char *to )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVDB, rcTable, rcAccessing, rcSelf, rcNull );
+    else
+    {
+        rc = KTableRenameColumn ( self->ktbl, force, from, to );
+        if ( GetRCState(rc) == rcNotFound )
+           rc = KMDataNodeRenameChild( self->col_node, from, to );
+    }
+
+    return rc;
+}
+
diff --git a/libs/vdb/xform-priv.h b/libs/vdb/xform-priv.h
new file mode 100644
index 0000000..aaa539b
--- /dev/null
+++ b/libs/vdb/xform-priv.h
@@ -0,0 +1,83 @@
+/*=======================================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_xform_priv_
+#define _h_xform_priv_
+
+#ifndef _h_vdb_xform_
+#include <vdb/xform.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* VBlobFuncN
+ *  works on VBlob objects
+ */
+struct VBlob;
+
+enum
+{
+    vftBlobN = vftBlob + 1,
+    vftSelect,
+
+    vftLastFuncProto
+};
+
+/* merge and other internal functions
+ *
+ * If you return one of your input blobs, ***** ADDREF ***** it.
+ */
+typedef rc_t ( CC * VBlobFuncN ) ( void *self, const VXformInfo *info, int64_t row_id,
+    struct VBlob **rslt, uint32_t argc, struct VBlob const *argv [] );
+
+typedef rc_t ( CC * VBlobCompareFunc ) (void *self, const VRowData *input, const VRowData *read);
+
+typedef union VFuncDescInternalFuncs VFuncDescInternalFuncs;
+union VFuncDescInternalFuncs
+{
+    VRowFunc         rf;
+    VNonDetRowFunc   ndf;
+    VFixedRowFunc    pf;
+    VArrayFunc       af;
+    VBlobFunc        bf;
+    VBlobFuncN       bfN;
+    VBlobCompareFunc cf;
+};
+
+#define VFUNCDESC_INTERNAL_FUNCS( DESC ) \
+    ( ( union VFuncDescInternalFuncs * ) ( & ( DESC ) -> u ) )
+
+/* factory declaration with no self parameter */
+#define VTRANSFACT_BUILTIN_IMPL( fact, maj, min, rel ) \
+    VTRANSFACT_IMPL ( fact, maj, min, rel )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_xform_priv_ */
diff --git a/libs/vfs/Makefile b/libs/vfs/Makefile
new file mode 100644
index 0000000..81c251c
--- /dev/null
+++ b/libs/vfs/Makefile
@@ -0,0 +1,102 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: all
+
+TOP ?= $(abspath ../..)
+
+MODULE = libs/vfs
+
+INT_LIBS = \
+	libvfs
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES = \
+	$(VFS_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+RWORKDIR=$(TOP)/$(MODULE)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# vfs
+#
+$(ILIBDIR)/libvfs: $(addprefix $(ILIBDIR)/libvfs.,$(ILIBEXT))
+
+VFS_SRC_CMN = \
+	syspath \
+	manager  \
+	resolver \
+	resolver-3.0 \
+
+VFS_SRC = \
+	path \
+	$(VFS_SRC_CMN)
+
+VFS_OBJ = \
+	$(addsuffix .$(LOBX),$(VFS_SRC))
+
+VFS_LIB = \
+	-lkns \
+	-lkns \
+	-lkrypto \
+	-lkfg \
+	-lkfs \
+	-lklib
+
+$(ILIBDIR)/libvfs.$(LIBX): $(VFS_OBJ)
+	$(LD) --slib -o $@ $^ $(VFS_LIB)
+
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/vfs/keyring.c b/libs/vfs/keyring.c
new file mode 100644
index 0000000..f73740a
--- /dev/null
+++ b/libs/vfs/keyring.c
@@ -0,0 +1,292 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "keyring.h"
+
+#include <klib/rc.h>
+#include <klib/refcount.h>
+#include <klib/text.h>
+#include <klib/data-buffer.h>
+#include <klib/log.h>
+
+#include <kns/stream.h>
+#include <kns/endpoint.h>
+#include <kns/socket.h>
+#include <kns/manager.h>
+
+#include <vfs/keyring-priv.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+/*TODO: define protocol messages in a central location */
+/*requests*/
+static const char* shutdownMsg = "\x01X";
+static const char* initMsg     = "\x01I";
+/*responses*/
+static const char* initMsgSuccess = "IY";
+static const char* initMsgFailure = "IN";
+
+#define rcTarget rcNoTarg
+
+#define KEYRING_MAX_PATH 4096
+
+struct KKeyRing
+{
+    KRefcount refcount;
+    
+    char serverDataDir[KEYRING_MAX_PATH];
+
+    bool read_only;
+    bool shutting_down;
+    
+    KStream* ipc;
+};
+
+static
+rc_t CC ShakeHands(KStream* ipc)
+{   /* Send Init message, wait for a response (give new server a chance to ask for password */
+    rc_t rc;
+    LogMsg ( klogInfo, "KeyringClient: sending Init");
+    rc = KStreamWrite(ipc, initMsg, string_size(initMsg), NULL);
+    if (rc == 0)
+    {
+        unsigned char msg_size;
+        size_t numRead = 0;
+        rc = KStreamReadAll(ipc, &msg_size, 1, &numRead);
+        if (rc == 0 && numRead == 1)
+        {
+            char resp[2];
+            if (msg_size == sizeof(resp))
+            {
+                rc = KStreamReadAll(ipc, resp, msg_size, &numRead);
+                if (rc == 0 && numRead == msg_size)
+                {
+                    pLogMsg ( klogInfo, "KeyringClient: received '$(b1)$(b2)'", "b1=%c,b2=%c", resp[0], resp[1] );
+                    if (string_cmp(resp, sizeof(resp), initMsgSuccess, sizeof(initMsgSuccess), msg_size) == 0)
+                        rc = 0;
+                    else if (string_cmp(resp, sizeof(resp), initMsgFailure, sizeof(initMsgFailure), msg_size) == 0)
+                        rc = RC ( rcVFS, rcTarget, rcAttaching, rcParam, rcIncorrect);
+                    else
+                        rc = RC ( rcVFS, rcTarget, rcAttaching, rcMessage, rcUnexpected);
+                }
+                else
+                    LogErr(klogErr, rc, "KeyringClient: KStreamReadAll(2) failed");
+            }
+            else
+            {
+                pLogMsg ( klogInfo, "KeyringClient: received '$(bytes)' bytes, expected 2", "bytes=%d", (int32_t)msg_size );
+                rc = RC ( rcVFS, rcTarget, rcAttaching, rcMessage, rcUnexpected);
+            }
+        }
+        else
+        {
+            pLogMsg ( klogInfo, "KeyringClient: received '$(bytes)' bytes, expected 1", "bytes=%d", (int32_t)numRead );
+            LogErr(klogErr, rc, "KeyringClient: KStreamReadAll(1) failed");
+        }
+    }
+        
+    return rc;
+}
+
+static
+rc_t CC KKeyRingInit(KKeyRing* self, const char* path)
+{
+    rc_t rc = 0;
+    memset(self, 0, sizeof(KKeyRing));
+
+    KRefcountInit ( & self -> refcount, 1, "KKeyRing", "init", "" );
+
+    LogMsg ( klogInfo, "KeyringClient: starting keyring");
+    rc = StartKeyRing(path);
+    LogMsg ( klogInfo, "KeyringClient: keyring started");
+    
+    if (rc == 0)
+    {
+        KNSManager* kns;
+        rc = KNSManagerMake ( &kns );
+        if (rc == 0)
+        {
+            rc_t rc2;
+            KEndPoint ep;
+            String name; 
+            CONST_STRING(&name, KEYRING_IPC_NAME);
+            rc = KNSManagerInitIPCEndpoint(kns, &ep, &name);    
+            if (rc == 0)
+            {
+                LogMsg ( klogInfo, "KeyringClient: caling KNSMakeIPCConnection");
+                rc = KNSManagerMakeIPCConnection ( kns, &self->ipc, &ep, 5 );
+                if (rc == 0)
+                {
+                    LogMsg ( klogInfo, "KeyringClient: KNSMakeIPCConnection successful");
+                    rc = ShakeHands(self->ipc);
+                }
+            }
+            rc2 = KNSManagerRelease(kns);
+            if (rc == 0)
+                rc2 = rc;
+        }
+    }
+    
+    return rc;    
+}
+
+static
+rc_t CC KKeyRingWhack(KKeyRing* self)
+{
+    rc_t rc = 0;
+    rc_t rc2;
+    if (self->ipc != NULL && self->shutting_down)  
+    {    /* send a shutdown message to the server */
+        LogMsg ( klogInfo, "KeyringClient: sending Shutdown");
+        rc = KStreamWrite(self->ipc, shutdownMsg, string_size(shutdownMsg), NULL);
+    }
+        
+    rc2 = KStreamRelease(self->ipc);
+    if (rc == 0)
+        rc = rc2;
+        
+    free(self);
+    
+    return rc;
+}
+
+LIB_EXPORT
+rc_t CC KKeyRingAddRef ( const KKeyRing *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "KKeyRing" ) )
+        {
+        case krefLimit:
+            return RC ( rcVFS, rcTarget, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT 
+rc_t CC KKeyRingRelease ( KKeyRing *self, bool shutdown_server )
+{
+    if ( self != NULL )
+    {
+        if (shutdown_server)
+            self->shutting_down = true; /* request shutdown when refcount reaches 0 */
+            
+        switch ( KRefcountDrop ( & self -> refcount, "KKeyRing" ) )
+        {
+        case krefWhack:
+            return KKeyRingWhack ( ( KKeyRing* ) self );
+        break;
+        case krefLimit:
+            return RC ( rcVFS, rcTarget, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC KKeyRingMakeRead( const KKeyRing** cself, const char* path )
+{
+    KKeyRing** self = (KKeyRing**)cself;
+    rc_t rc = KKeyRingMakeUpdate(self, path);
+    if (rc == 0)
+        (*self)->read_only = true;
+    return rc;
+}
+
+LIB_EXPORT 
+rc_t CC KKeyRingMakeUpdate(KKeyRing** self, const char* path)
+{
+    KKeyRing* obj;
+    rc_t rc;
+    
+    if ( self == NULL )
+        rc = RC ( rcVFS, rcTarget, rcCreating, rcParam, rcNull );
+    else
+    {
+        obj = malloc(sizeof(KKeyRing));
+        if (obj == NULL)
+            rc = RC ( rcVFS, rcTarget, rcCreating, rcMemory, rcExhausted );
+        {
+            rc = KKeyRingInit(obj, path);
+            if (rc == 0)
+               *self = obj;
+            else
+                free(obj);
+        }
+    }
+    
+    return rc;
+}
+
+rc_t CC KKeyRingAddProject(KKeyRing* self, const char* project_key, const char* dl_key, const char* enc_key)
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcVFS, rcTarget, rcSending, rcSelf, rcNull );
+    else if (project_key == NULL || dl_key == NULL || enc_key == NULL)
+        rc = RC ( rcVFS, rcTarget, rcSending, rcParam, rcNull );
+    else
+    {   /* Project Add: "<uint8 msg_length>PA<uint8 length>name<uint8 length>dl_ticket<uint8 length>enc_key" */
+        size_t pkSize = string_size(project_key);
+        size_t dkSize = string_size(dl_key);
+        size_t ekSize = string_size(enc_key);
+
+        char buf[256];
+        uint8_t msg_size = 2 + sizeof(uint8_t) + pkSize + sizeof(uint8_t) + dkSize + sizeof(uint8_t) + ekSize;
+        if ( 1 + msg_size > sizeof(buf) )
+            rc = RC ( rcVFS, rcTarget, rcSending, rcSize, rcExcessive );
+        else
+        {
+            size_t idx = 0;
+        
+            buf[0] = msg_size; ++idx;
+
+            buf[idx]='P'; ++idx;
+            buf[idx]='A'; ++idx;
+            
+            buf[idx] = (char)pkSize; ++idx;
+            string_copy(buf + idx, sizeof(buf)-idx, project_key, pkSize);
+            idx += pkSize;
+            
+            buf[idx] = (char)dkSize; ++idx;
+            string_copy(buf + idx, sizeof(buf)-idx, dl_key, dkSize);
+            idx += dkSize;
+            
+            buf[idx] = (char)ekSize; ++idx;
+            string_copy(buf + idx, sizeof(buf)-idx, enc_key, ekSize);
+            idx += ekSize;
+            
+            assert(idx == msg_size + 1);
+            rc = KStreamWrite(self->ipc, buf, idx, NULL);
+        }
+    }
+    return rc;
+        
+}
+
diff --git a/libs/vfs/keyring.h b/libs/vfs/keyring.h
new file mode 100644
index 0000000..b1140ee
--- /dev/null
+++ b/libs/vfs/keyring.h
@@ -0,0 +1,111 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vfs_keyring_
+#define _h_vfs_keyring_
+
+#ifndef _h_vfs_extern_
+#include <vfs/extern.h>
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 
+ * API for clients of a client/server KeyRing implementation.
+ * Client code can use this interface and fall back to using KKeyStore in some cases, e.g. to work with a project that has not been
+ * added to the keyring. This can be done behind KKeyRing interface (would have to define an object naming scheme that is compatible 
+ * with project-id/type/object-id), or explicitly in the client code.
+ */
+typedef struct KKeyRing KKeyRing;
+ 
+ /* Make
+ * Open an IPC connection to a keyring server. Will start the server if none is running.
+ * KKeyRingMakeRead will reject Add/Delete operations 
+ * dataDir [ IN, NULL OK ] = path to the directory with keyring database. NULL - use default location (~/.ncbi)
+ */
+VFS_EXTERN rc_t CC KKeyRingMakeRead( const KKeyRing** self, const char* dataDir );
+VFS_EXTERN rc_t CC KKeyRingMakeUpdate( KKeyRing** self, const char* dataDir );
+
+ /* AddRef
+ * Release
+ *
+ * shutdown_server [ IN ] - if this is the last reference, send a Shutdown message to server before closing the IPC connection.
+ * This will not necessarily shut down the server immediately; if there are other active connections, the server will wait for them to close first.
+ * Use KKeyRingIsServerRunning() to check it the server is down.
+ */
+VFS_EXTERN rc_t CC KKeyRingAddRef ( const KKeyRing *self );
+VFS_EXTERN rc_t CC KKeyRingRelease ( KKeyRing *self, bool shutdown_server );
+ 
+/* 
+ * retrieving download/encyprtion keys
+ */
+VFS_EXTERN rc_t CC KKeyRingGetDownloadTicket(const KKeyRing* self, const char* project_key, const char** dl_key);
+VFS_EXTERN rc_t CC KKeyRingGetProjectEncryptionKey(const KKeyRing* self, const char* project_key, const char** enc_key);
+
+/*
+ * managing projects 
+*/                                                   
+VFS_EXTERN rc_t CC KKeyRingAddProject(KKeyRing* self, const char* project_key, const char* dl_key, const char* enc_key);
+VFS_EXTERN rc_t CC KKeyRingDeleteProject(KKeyRing* self, const char* project_key); /* will delete all associated objects */
+
+/*
+ * managing objects
+ */
+VFS_EXTERN rc_t CC KKeyRingAddObject(KKeyRing* self, 
+                                      const char* project_key, uint8_t object_type, const char* object_key,
+                                      const char* display_name, uint64_t size, const char* checksum);
+VFS_EXTERN rc_t CC KKeyRingDeleteObject(KKeyRing* self, 
+                                         const char* project_key, uint8_t object_type, const char* object_key);
+
+/* KKeyRingReencrypt
+ * Server can refuse to reencrypt if it detects other active servers.
+ */
+VFS_EXTERN rc_t CC KKeyRingReencrypt(KKeyRing** self, const char* new_passwd); 
+
+ /* IsServerRunning
+ * dataDir [ IN, NULL OK ] = path to the directory with keyring database. NULL - use default location (~/.ncbi)
+ */
+VFS_EXTERN bool CC KKeyRingIsServerRunning(const char* dataDir);
+
+/* 
+ * private API for libkrypto 
+ */
+
+VFS_EXTERN rc_t CC KKeyRingGetObjectEncryptionKey(const KKeyRing* self, const char* project_key, 
+                                                   uint8_t object_type, const char* object_key, const char** enc_key);
+
+                                                   
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vfs_keyring_ */
diff --git a/libs/vfs/kurl-stub.c b/libs/vfs/kurl-stub.c
new file mode 100644
index 0000000..20e885c
--- /dev/null
+++ b/libs/vfs/kurl-stub.c
@@ -0,0 +1,18 @@
+void KNSManagerMakeCurlRequest ( void )
+{
+}
+void VFSManagerMakeCurlFile ( void )
+{
+}
+void KCurlFileMake ( void )
+{
+}
+void KCurlRequestAddSField ( void )
+{
+}
+void KCurlRequestPerform ( void )
+{
+}
+void KCurlRequestRelease ( void )
+{
+}
diff --git a/libs/vfs/manager.c b/libs/vfs/manager.c
new file mode 100644
index 0000000..d85f195
--- /dev/null
+++ b/libs/vfs/manager.c
@@ -0,0 +1,3519 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vfs/extern.h>
+
+#include "path-priv.h"
+#include "resolver-priv.h"
+
+#include <sra/srapath.h>
+
+#include <vfs/manager.h>
+#include <vfs/manager-priv.h>
+#include <vfs/path.h>
+#include <vfs/path-priv.h>
+#include <vfs/resolver.h>
+
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+#include <krypto/wgaencrypt.h>
+#include <krypto/ciphermgr.h>
+
+#include <kfg/config.h>
+#include <kfg/repository.h>
+#include <kfg/keystore.h>
+#include <kfg/keystore-priv.h>
+#include <kfg/kfg-priv.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/sra.h>
+#include <kfs/tar.h>
+#include <kfs/dyload.h>
+#include <kfs/kfs-priv.h>
+#include <kfs/nullfile.h>
+#include <kfs/buffile.h>
+#include <kfs/quickmount.h>
+#include <kfs/cacheteefile.h>
+#include <kfs/lockfile.h>
+#include <kfs/defs.h>
+
+#include <kns/http.h>
+#include <kns/kns-mgr-priv.h>
+#include <kns/manager.h>
+
+#include <kxml/xml.h>
+
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/refcount.h>
+#include <klib/namelist.h>
+#include <klib/vector.h>
+#include <klib/time.h> 
+
+#include <strtol.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+
+#if _DEBUGGING
+#define MGR_DEBUG(msg) DBGMSG(DBG_VFS,DBG_FLAG(DBG_VFS_MGR), msg)
+#else
+#define MGR_DEBUG(msg)
+#endif
+
+
+#define DEFAULT_CACHE_BLOCKSIZE ( 32768 * 4 )
+
+#define VFS_KRYPTO_PASSWORD_MAX_SIZE 4096
+
+/*--------------------------------------------------------------------------
+ * VFSManager
+ */
+
+/* currently expected to be a singleton and not use a vtable but
+ * be fully fleshed out here */
+struct VFSManager
+{
+    /* the current directory in the eyes of the O/S when created */
+    KDirectory * cwd;
+
+    /* configuration manager */
+    KConfig * cfg;
+
+    /* krypto's cipher manager */
+    KCipherManager * cipher;
+
+    /* SRAPath will be replaced with a VResolver */
+    struct VResolver * resolver;
+
+    /* network manager */
+    KNSManager * kns;
+
+    /* path to a global password file */
+    char *pw_env;
+    
+    /* encryption key storage */ 
+    struct KKeyStore* keystore;
+
+    KRefcount refcount;
+
+    VRemoteProtocols protocols;
+};
+
+static const char kfsmanager_classname [] = "VFSManager";
+
+static 
+VFSManager * singleton = NULL;
+
+
+/* Destroy
+ *  destroy file
+ */
+static rc_t VFSManagerDestroy ( VFSManager *self )
+{
+    if ( self == NULL )
+        return RC ( rcVFS, rcFile, rcDestroying, rcSelf, rcNull );
+    
+    KKeyStoreRelease( self -> keystore );
+    free ( self -> pw_env );
+    VResolverRelease ( self -> resolver );
+    KNSManagerRelease ( self -> kns );
+    KCipherManagerRelease ( self -> cipher );
+    KConfigRelease ( self -> cfg );
+    KDirectoryRelease ( self -> cwd );
+    KRefcountWhack (&self->refcount, kfsmanager_classname);
+
+    free (self);
+    singleton = NULL;
+
+    return 0;
+}
+
+/* AddRef
+ *  creates a new reference
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC VFSManagerAddRef ( const VFSManager *self )
+{
+    if (self != NULL)
+    {
+        switch (KRefcountAdd (&self->refcount, kfsmanager_classname))
+        {
+        case krefOkay:
+            break;
+        case krefZero:
+            return RC (rcVFS, rcMgr, rcAttaching, rcRefcount, rcIncorrect);
+        case krefLimit:
+            return RC (rcVFS, rcMgr, rcAttaching, rcRefcount, rcExhausted);
+        case krefNegative:
+            return RC (rcVFS, rcMgr, rcAttaching, rcRefcount, rcInvalid);
+        default:
+            return RC (rcVFS, rcMgr, rcAttaching, rcRefcount, rcUnknown);
+        }
+    }
+    return 0;
+}
+
+/* Release
+ *  discard reference to file
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC VFSManagerRelease ( const VFSManager *self )
+{
+    rc_t rc = 0;
+    if (self != NULL)
+    {
+        switch (KRefcountDrop (&self->refcount, kfsmanager_classname))
+        {
+        case krefOkay:
+        case krefZero:
+            break;
+        case krefWhack:
+            rc = VFSManagerDestroy ((VFSManager*)self);
+            break;
+        case krefNegative:
+            return RC (rcVFS, rcMgr, rcAttaching, rcRefcount, rcInvalid);
+        default:
+            rc = RC (rcVFS, rcMgr, rcAttaching, rcRefcount, rcUnknown);
+            break;            
+        }
+    }
+    return rc;
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * VFSManagerMakeHTTPFile
+ */
+static
+rc_t VFSManagerMakeHTTPFile( const VFSManager * self, const KFile **cfp,
+                             const char * url, const char * cache_location,
+                             bool high_reliability )
+{
+    rc_t rc;
+
+    if ( high_reliability )
+        rc = KNSManagerMakeReliableHttpFile ( self -> kns, cfp, NULL, 0x01010000, url );
+    else
+        rc = KNSManagerMakeHttpFile ( self -> kns, cfp, NULL, 0x01010000, url );
+
+    if ( rc == 0 && cache_location != NULL )
+    {
+		const KFile *temp_file;
+		/* we do have a cache_location! wrap the remote file in a cacheteefile */
+		rc_t rc2 = KDirectoryMakeCacheTee ( self->cwd, &temp_file, *cfp,
+											DEFAULT_CACHE_BLOCKSIZE, "%s", cache_location );
+												
+        if ( rc2 == 0 )
+        {
+            KFileRelease ( * cfp );
+            * cfp = temp_file;
+        }
+    }
+    return rc;
+}
+
+static rc_t CC VFSManagerGetConfigPWFile (const VFSManager * self, char * b, size_t bz, size_t * pz)
+{
+    const char * env;
+    const KConfigNode * node;
+    size_t oopsy;
+    size_t z = 0;
+    rc_t rc;
+
+    if (pz)
+        *pz = 0;
+
+    env = getenv (ENV_KRYPTO_PWFILE);
+    if (!env)
+        env = self->pw_env;
+    if (env)
+    {
+        z = string_copy (b, bz, env, string_size (env));
+    
+        /* force a NUL that string_copy might have omitted 
+         * even if this truncates the path */
+        b[bz-1] = '\0';
+
+        if (pz)
+            *pz = z;
+       
+        return 0;
+    }
+    
+    { /* If we are in a protected area, there may be an area-specific key file */
+        const KRepositoryMgr *repoMgr;
+        rc = KConfigMakeRepositoryMgrRead ( self->cfg, &repoMgr );
+        if (rc == 0)
+        {
+            const KRepository* prot;
+            rc = KRepositoryMgrCurrentProtectedRepository ( repoMgr, &prot );
+            if (rc == 0)
+            {
+                rc = KRepositoryEncryptionKeyFile ( prot, b, bz, pz);            
+                KRepositoryRelease(prot);
+            }
+            KRepositoryMgrRelease(repoMgr);
+        }
+        if (GetRCState(rc) == rcNotFound)
+            rc = RC (rcVFS, rcMgr, rcOpening, rcEncryptionKey, rcNotFound);
+    }
+
+    if (rc != 0)
+    {   /* fall back on an old-style global password file*/
+        rc = KConfigOpenNodeRead (self->cfg, &node, "%s", KFG_KRYPTO_PWFILE);
+        if (rc)
+        {
+            /* if not found, change object from path to encryption key */
+            if (GetRCState(rc) == rcNotFound)
+                rc = RC (rcVFS, rcMgr, rcOpening, rcEncryptionKey, rcNotFound);
+        }
+        else
+        {
+            rc = KConfigNodeRead (node, 0, b, bz-1, &z, &oopsy);
+            if (rc == 0)
+            {
+                if (oopsy != 0)
+                    rc = RC (rcKrypto, rcMgr, rcReading, rcBuffer, rcInsufficient);
+                else
+                {
+                    b[z] = '\0';
+                    *pz = z;
+                }
+            }
+            KConfigNodeRelease (node);
+        }
+    }
+    
+    return rc;
+}
+
+static
+rc_t GetEncryptionKey(const VFSManager * self, const VPath * vpath, char* obuff, size_t buf_size, size_t *pwd_size)
+{
+    /* -----
+     * #if 0
+     * first check the insecure password on the command line hack 
+     * #endif 
+     *
+     * then check the option for pwfile in the VPath
+     * then check the option for pwfd
+     * then check the keystore. if necessary, keystore will 
+     *          check the environment      
+     *          check the configuration
+     */
+
+#if 0
+    /* obviously not used yet */
+    if (VPathOption (vpath, vpopt_temporary_pw_hack, obuff, buf_size, &z) == 0)
+    {
+        if (z < 1)
+            rc = RC (rcVFS, rcPath, rcConstructing, rcParam, rcInvalid);
+        else
+        {
+            size_t x = 0;
+            size_t y = 0;
+            int ch, h, l;
+
+            while (x < z)
+            {
+                h = tolower(obuff[x++]);
+                l = tolower(obuff[x++]);
+
+                if (!isxdigit(h) || !isxdigit(l))
+                    rc = RC (rcVFS, rcPath, rcConstructing, rcParam, rcInvalid);
+
+                if (isdigit(h))
+                    ch = (h - '0') << 4;
+                else
+                    ch = (h + 10 - 'a') << 4;
+                if (isdigit(l))
+                    ch |= (l - '0');
+                else
+                    ch |= (l + 10 - 'a');
+
+                /* added for compatibility with other passwords */
+                if ((ch == '\r') || (ch == '\n'))
+                    break;
+                obuff[y++] = (char)ch;
+            }
+            obuff[y] = '\0';
+            assert (z == x);
+            assert (z/2 == y);
+            z = y;
+            * pwd_size = z;
+        }
+    }
+#endif    
+
+    rc_t rc = 0;
+    rc_t rc2;
+    size_t z;
+
+    if (VPathOption (vpath, vpopt_pwpath, obuff, buf_size - 1, &z)
+        == 0)
+    {
+        const KFile * pwfile;
+        obuff [z] = '\0';
+        rc = KDirectoryOpenFileRead(self->cwd, &pwfile, "%s", obuff);
+        if (rc == 0)
+        {
+            rc = KKeyStoreSetTemporaryKeyFromFile(self->keystore, pwfile);
+            rc2 = KFileRelease(pwfile);
+            if (rc == 0)
+                rc = rc2;
+        }
+    }
+    else if (VPathOption (vpath, vpopt_pwfd, obuff, buf_size - 1, &z)
+        == 0)
+    {
+        /* -----
+         * pwfd is not fully a VPath at this point: we 
+         * should obsolete it
+         */
+        const KFile * pwfile;
+        obuff [z] = '\0';
+        rc = KFileMakeFDFileRead (&pwfile, atoi (obuff));
+        if (rc == 0)
+        {
+            rc = KKeyStoreSetTemporaryKeyFromFile(self->keystore, pwfile);
+            rc2 = KFileRelease(pwfile);
+            if (rc == 0)
+                rc = rc2;
+        }
+    }
+    
+    if (rc == 0)
+    {
+        KEncryptionKey* enc_key = NULL;
+
+        /* here, we are only interested in global keys - at least for now */
+
+        /* Get Key for current protected repository ( or global ) */
+        rc = KKeyStoreGetKey(self->keystore, NULL, &enc_key);
+        if (rc != 0 && self->resolver != NULL) {
+            bool has_project_id = false;
+            uint32_t projectId = 0;
+            rc_t r2 = VResolverGetProjectId(self->resolver, &projectId);
+            has_project_id = projectId != 0;
+  
+  /* Get Key for protected repository that was used to create self's resolver */
+            if (r2 == 0 && has_project_id) {
+                rc = KKeyStoreGetKeyByProjectId(
+                    self->keystore, NULL, &enc_key,projectId);
+            }
+        }
+
+        if (rc == 0)
+        {
+            *pwd_size = string_copy(obuff, buf_size, enc_key->value.addr, enc_key->value.size);
+            if (*pwd_size != enc_key->value.size)
+                rc = RC(rcVFS, rcPath, rcReading, rcBuffer, rcInsufficient);
+            rc2 = KEncryptionKeyRelease(enc_key);
+            if (rc == 0)
+                rc = rc2;
+        }
+    }
+    
+    rc2 = KKeyStoreSetTemporaryKeyFromFile(self->keystore, NULL); /* forget the temp key if set */
+    if (rc == 0)
+        rc = rc2;
+    return rc;
+}
+
+/*
+ * This is still hack - must match VFSManagerResolvePathRelativeDir()
+ */
+LIB_EXPORT rc_t CC VFSManagerWGAValidateHack (const VFSManager * self, 
+                                              const KFile * file,
+                                              const char * path) /* we'll move this to a vpath */
+{
+    VPath * vpath;
+    rc_t rc = 0;
+
+    rc = VPathMake (&vpath, path);
+    if (rc == 0)
+    {
+        size_t z;
+        char obuff [VFS_KRYPTO_PASSWORD_MAX_SIZE + 2]; /* 1 for over-read and 1 for NUL */
+        rc = GetEncryptionKey(self, vpath, obuff, sizeof(obuff), &z);
+
+        if (rc == 0)
+        {
+            rc = WGAEncValidate (file, obuff, z);
+        }
+    }
+    return rc;
+}
+
+
+
+/* ResolvePath
+ *
+ * take a VPath and resolve to a final form apropriate for KDB
+ *
+ * that is take a relative path and resolve it against the CWD
+ * or take an accession and resolve into the local or remote 
+ * VResolver file based on config. It is just a single resolution percall
+ */
+static rc_t VFSManagerResolvePathResolver (const VFSManager * self,
+                                           uint32_t flags,
+                                           const VPath * in_path,
+                                           VPath ** out_path)
+{
+    rc_t rc = 0;
+
+    *out_path = NULL;
+
+    /*
+     * this RC perculates up for ncbi-acc: schemes but not for
+     * no scheme uris
+     */
+    if ((flags & vfsmgr_rflag_no_acc) == vfsmgr_rflag_no_acc)
+    {
+        /* hack */
+        if ( VPathGetUri_t ( in_path ) == vpuri_none )
+            rc = SILENT_RC (rcVFS, rcMgr, rcResolving, rcSRA, rcNotAvailable);
+        else
+            rc = RC (rcVFS, rcMgr, rcResolving, rcSRA, rcNotAvailable);
+    }
+    else
+    {
+        bool not_done = true;
+
+        /*
+         * cast because we seem to have the restriction on the output from
+         * VResolver that seems too restrictive
+         */
+        if ((flags & vfsmgr_rflag_no_acc_local) == 0)
+        {
+            rc = VResolverLocal (self->resolver, in_path, (const VPath **)out_path);
+            if (rc == 0)
+                not_done = false;
+        }
+            
+        if (not_done && ((flags & vfsmgr_rflag_no_acc_remote) == 0))
+        {
+            rc = VResolverRemote (self->resolver, self -> protocols,
+                in_path, (const VPath **)out_path);
+        }
+    }
+    return rc;
+}
+
+
+static rc_t VFSManagerResolvePathInt (const VFSManager * self,
+                                      uint32_t flags,
+                                      const KDirectory * base_dir,
+                                      const VPath * in_path,
+                                      VPath ** out_path)
+{
+    rc_t rc;
+    char * pc;
+    VPUri_t uri_type;
+
+    assert (self);
+    assert (in_path);
+    assert (out_path);
+
+    uri_type = VPathGetUri_t ( in_path );
+    switch ( uri_type )
+    {
+    default:
+        rc = RC (rcVFS, rcMgr, rcResolving, rcPath, rcInvalid);
+        break;
+
+    case vpuri_not_supported:
+    case vpuri_ncbi_legrefseq:
+        rc = RC (rcVFS, rcMgr, rcResolving, rcPath, rcUnsupported);
+        break;
+
+    case vpuri_ncbi_acc:
+        rc = VFSManagerResolvePathResolver (self, flags, in_path, out_path);
+        break;
+
+    case vpuri_none:
+        /* for KDB purposes, no scheme might be an accession */
+        if (flags & vfsmgr_rflag_kdb_acc)
+        {
+             /* no '/' is permitted in an accession */
+            pc = string_chr (in_path->path.addr, in_path->path.size, '/');
+            if (pc == NULL)
+            {
+                rc = VFSManagerResolvePathResolver (self, flags, in_path, out_path);
+                if (rc == 0)
+                    break;
+            }
+        }
+        /* Fall through */
+    case vpuri_ncbi_vfs:
+    case vpuri_file:
+        /* check for relative versus full path : assumes no 'auth' not starting with '/' */
+        if (in_path->path.addr[0] == '/')
+        {
+            rc = VPathAddRef (in_path);
+            if (rc == 0)
+                *out_path = (VPath *)in_path; /* oh these const ptr are annoying */
+        }
+        else
+        {
+            /* not 'properly' handling query, fragment etc. for relative path
+             * assumes path within VPath is ASCIZ
+             */
+            size_t s;
+            VPath * v;
+            char u [32 * 1024];
+
+            switch ( uri_type )
+            {
+            default:
+                rc = RC (rcVFS, rcMgr, rcResolving, rcFunction, rcInvalid);
+                break;
+
+            case vpuri_ncbi_vfs:
+                string_printf ( u, sizeof u, & s, "%S:", & in_path -> scheme );
+                rc = KDirectoryResolvePath ( base_dir, true, & u [ s ], sizeof u - s,
+                    "%.*s", ( int ) in_path -> path . size, in_path -> path . addr );
+                if ( rc == 0 )
+                {
+                    s = string_size ( u );
+                    rc = string_printf ( & u [ s ], sizeof u - s, NULL,
+                        "%S%S", & in_path -> query, & in_path -> fragment );
+                }
+                if (rc == 0)
+                    rc = VPathMake (&v, u);
+                break;
+
+            case vpuri_none:
+            case vpuri_file:
+                rc = KDirectoryResolvePath ( base_dir, true, u, sizeof u,
+                    "%.*s", ( int ) in_path -> path . size, in_path -> path . addr );
+                rc = VPathMake (&v, u);
+                break;
+            }
+            if (rc == 0)
+                *out_path = v;
+        }
+        break;
+
+        /* these are considered fully resolved already */
+    case vpuri_http:
+    case vpuri_https:
+    case vpuri_ftp:
+        rc = VPathAddRef (in_path);
+        if (rc == 0)
+            *out_path = (VPath*)in_path;
+        break;
+
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerResolvePath (const VFSManager * self,
+                                          uint32_t flags,
+                                          const VPath * in_path,
+                                          VPath ** out_path)
+{
+    if (out_path == NULL)
+        return RC (rcVFS, rcMgr, rcResolving, rcParam, rcNull);
+
+    *out_path = NULL;
+
+    if (self == NULL)
+        return RC (rcVFS, rcMgr, rcResolving, rcSelf, rcNull);
+
+    if (in_path == NULL)
+        return RC (rcVFS, rcMgr, rcResolving, rcParam, rcNull);
+
+    return VFSManagerResolvePathInt (self, flags, self->cwd, in_path, out_path);
+}
+
+LIB_EXPORT rc_t CC VFSManagerResolvePathRelative (const VFSManager * self,
+                                                  uint32_t flags,
+                                                  const struct  VPath * base_path,
+                                                  const struct  VPath * in_path,
+                                                  struct VPath ** out_path)
+{
+    const KDirectory * dir;
+    rc_t rc;
+
+    if (out_path == NULL)
+        rc = RC (rcVFS, rcMgr, rcResolving, rcParam, rcNull);
+
+    *out_path = NULL;
+
+    if (self == NULL)
+        return RC (rcVFS, rcMgr, rcResolving, rcSelf, rcNull);
+
+    if (in_path == NULL)
+        return RC (rcVFS, rcMgr, rcResolving, rcParam, rcNull);
+
+    rc = VFSManagerOpenDirectoryRead (self, &dir, base_path);
+    if (rc == 0)
+        rc = VFSManagerResolvePathInt (self, flags, dir, in_path, out_path);
+
+    return rc;
+}
+
+/*
+ * This is still hack - must match VFSManagerGetEncryptionKey()
+ */
+
+LIB_EXPORT rc_t CC VFSManagerResolvePathRelativeDir (const VFSManager * self,
+                                                     uint32_t flags,
+                                                     const KDirectory * base_dir,
+                                                     const VPath * in_path,
+                                                     VPath ** out_path)
+{
+    if (out_path == NULL)
+        return RC (rcVFS, rcMgr, rcResolving, rcParam, rcNull);
+
+    *out_path = NULL;
+
+    if (self == NULL)
+        return RC (rcVFS, rcMgr, rcResolving, rcSelf, rcNull);
+
+    if (in_path == NULL)
+        return RC (rcVFS, rcMgr, rcResolving, rcParam, rcNull);
+
+    return VFSManagerResolvePathInt (self, flags, base_dir, in_path, out_path);
+}
+
+
+/* OpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+static
+rc_t VFSManagerOpenFileReadDecryption (const VFSManager *self,
+                                       const KDirectory * dir,
+                                       const KFile ** f,
+                                       const KFile * file,
+                                       const VPath * path,
+                                       bool force_decrypt,
+                                       bool * was_encrypted)
+{
+    rc_t rc = 0;
+    size_t z;
+    char obuff [VFS_KRYPTO_PASSWORD_MAX_SIZE + 2]; /* 1 for over-read and 1 for NUL */
+    bool has_enc_opt;
+
+    if (was_encrypted)
+        *was_encrypted = false;
+
+    /* -----
+     * at this point we have no fatal errors and we have the
+     * file opened but we have not seen if we have to decrypt
+     * or use other query options
+     */
+    has_enc_opt = (VPathOption (path, vpopt_encrypted, obuff,
+                                sizeof obuff, &z) == 0);
+
+    if ((has_enc_opt == false) &&
+        (force_decrypt == false))
+    {
+        /* if we are not told to decrypt, don't and we are done */
+        KFileAddRef (file);
+        *f = file;
+    }
+
+    else /* we are told to decrypt if possible */
+    {
+        /* -----
+         * pre-read 4kb from the 'encrypted file'
+         */
+        rc = KFileRandomAccess (file);
+        if (rc == 0)
+            ;
+        /* most common and easiest option is it has random
+         * access - a no-op here
+         */
+        else if (GetRCState(rc) == rcUnsupported)
+        {
+            const KFile * buffile;
+
+            rc = KBufFileMakeRead (&buffile, file, 32 * 2 * 1024);
+            if (rc)
+                ;
+            else
+            {
+                /* there is an extra reference to file now, but
+                 * it gets removed after this function returns
+                 */
+                file = buffile;
+            }
+        }
+        
+        if (rc == 0)
+        {
+            size_t tz;
+            char tbuff [4096];
+
+            /* we now have a file from which we can pre-read the
+             * possible encrypted format header */
+            rc = KFileReadAll (file, 0, tbuff, sizeof tbuff, &tz);
+            if (rc == 0)
+            {
+                /* 
+                 * we've successfully read 4KB from the file,
+                 * now decide if is actually an encrypted file
+                 * format we support
+                 */
+                const KFile * encfile;
+
+                /* is this the header of an ecnrypted file? */
+                if (KFileIsEnc (tbuff, tz) == 0)
+                {
+                    if (was_encrypted)
+                        *was_encrypted = true;
+                    rc = GetEncryptionKey(self, path, obuff, sizeof(obuff), &z);
+                    if (rc == 0)
+                    {
+                        KKey key;
+
+                        /* create the AES Key */
+                        rc = KKeyInitRead (&key, kkeyAES128, obuff, z);
+                        if (rc)
+                            ;
+                        else
+                        {
+                            rc = KEncFileMakeRead (&encfile, file, &key);
+                            if (rc)
+                                ;
+                            else
+                            {
+                                const KFile * buffile;
+
+                                /*
+                                 * TODO: make the bsize a config item not a hard constant
+                                 */
+                                rc = KBufFileMakeRead (&buffile, encfile,
+                                                       256 * 1024 * 1024);
+                                if (rc == 0)
+                                {
+                                    *f = buffile;
+                                    /* *f keeps a reference to encfile, can release it here */
+                                    KFileRelease (encfile);
+                                    return 0;
+                                }
+                                KFileRelease (encfile);
+                            }
+                        }
+                    }
+                }
+                else if (KFileIsWGAEnc (tbuff, tz) == 0)
+                {
+                    if (was_encrypted)
+                        *was_encrypted = true;
+                    rc = GetEncryptionKey(self, path, obuff, sizeof(obuff), &z);
+                    if (rc == 0)
+                    {
+                        rc = KFileMakeWGAEncRead (&encfile, file, obuff, z);
+                        if (rc)
+                            ;
+                        else
+                        {
+                            /* we'll release anextra reference to file
+                             * after this function returns
+                             */
+                            *f = encfile;
+                            return 0;
+                        }
+                    }
+                }
+                else
+                {
+                    /* -----
+                     * not encrypted in a manner we can decrypt so 
+                     * give back the raw file (possibly buffered
+                     *
+                     * since file is released in the caller
+                     * we need another reference
+                     */
+                    KFileAddRef (file);
+                    *f = file;
+                    return 0;
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+/*
+ * try to open the file as a regular file
+ */
+static
+rc_t VFSManagerOpenFileReadRegularFile (char * pbuff, size_t z,
+                                        KFile const ** file,
+                                        const KDirectory * dir)
+{
+    rc_t rc;
+    char rbuff [8192];
+
+    assert ((pbuff) && (pbuff[0]));
+    assert (*file == NULL);
+
+    rc = KDirectoryResolvePath (dir, true, rbuff, sizeof rbuff,
+                                "%s", pbuff);
+    if (rc)
+        ; /* log? */
+    else
+    {
+        /* validate that the file system agrees the path refers
+         * to a regular file (even if through a link */
+        uint32_t type;
+
+        type = KDirectoryPathType (dir, "%s", rbuff);
+        switch (type & ~kptAlias)
+        {
+        case kptNotFound:
+            rc = RC (rcVFS, rcMgr, rcOpening, rcFile,
+                     rcNotFound);
+            break;
+
+        case kptBadPath:
+            rc = RC (rcVFS, rcMgr, rcOpening, rcFile,
+                     rcInvalid);
+            break;
+
+        case kptDir:
+        case kptCharDev:
+        case kptBlockDev:
+        case kptFIFO:
+        case kptZombieFile:
+            rc = RC (rcVFS, rcMgr, rcOpening, rcFile,
+                     rcIncorrect);
+            break;
+
+        default:
+            rc = RC (rcVFS, rcMgr, rcOpening, rcFile, rcUnknown);
+            break;
+
+        case kptFile:
+            /*
+             * this is the good/successful path: open the file 
+             * as a const KFile
+             */
+            rc = KDirectoryOpenFileRead (dir, file, "%s", rbuff);
+            break;
+        }
+    }
+
+    return rc;
+}
+
+/*
+ * if successful set *file to a usable KFile * and return 0
+ * if unsuccessful but without error, set *file to NULL and return 0
+ * if an error encountered set *file to NULL and return non-zero.
+ */
+static
+rc_t VFSManagerOpenFileReadSpecial (char * pbuff, size_t z, KFile const ** file)
+{
+    rc_t rc = 0;
+    static const char dev [] = "/dev/";
+    static const char dev_stdin [] = "/dev/stdin";
+    static const char dev_null [] = "/dev/null";
+
+    assert (pbuff);
+    assert (z);
+    assert (file);
+
+    *file = NULL;
+
+    /*
+     * Handle a few special case path names that are pre-opened
+     * 'file descriptors'
+     *
+     * This probably needs to be system specific eventually
+     *
+     * First check for the path being in the 'dev' directory in
+     * posix/unix terms
+     */
+    if (string_cmp (dev, sizeof dev - 1, pbuff, z, sizeof dev - 1) != 0)
+        rc = 0; /* we're done */
+
+    else
+    {
+        if (strcmp (dev_stdin, pbuff) == 0)
+            rc = KFileMakeStdIn (file);
+
+        else if (strcmp (dev_null, pbuff) == 0)
+            rc = KFileMakeNullRead (file);
+
+        else if (strncmp ("/dev/fd/", pbuff, sizeof "/dev/fd/" - 1) == 0)
+        {
+            char * pc;
+            size_t ix;
+
+            pc = pbuff + sizeof "/dev/fd/" - 1;
+
+            for (ix = 0; isdigit (pc[ix]); ++ix)
+                assert (ix <= z);
+
+            if ((ix > 0)&&(pc[ix] == '\0'))
+            {
+                int fd;
+
+                fd = atoi (pc);
+                rc = KFileMakeFDFileRead (file, fd);
+            }
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t VFSManagerOpenFileReadInt (const VFSManager *self,
+                                const KDirectory * dir,
+                                KFile const **f,
+                                const VPath * path,
+                                bool force_decrypt,
+                                bool * was_encrypted)
+{
+    /* -----
+     * this is a first pass that only opens files directory referenced from 
+     * the ced or have a sysdir root; that is it uses KSysDir and KSysFile
+     * only.
+     */
+    const KFile * file = NULL;
+    size_t num_read;
+    char pbuff [4096];
+    rc_t rc;
+
+    rc = VPathReadPath (path, pbuff, sizeof pbuff, &num_read);
+    if (rc)
+        ; /* log? */
+    else
+    {
+        /* -----
+         * try to open path as a special file if requested
+         *
+         * *file will be set or a usable file or to NULL and rc will reflect
+         * any error
+         */
+        rc = VFSManagerOpenFileReadSpecial (pbuff, num_read, &file);
+
+        if (rc == 0)
+        {
+            /* -----
+             * If we didn't open the file using the special
+             * logic above for special paths open the file and have no error,
+             * continue
+             */
+            if (file == NULL)
+                rc = VFSManagerOpenFileReadRegularFile (pbuff, num_read,
+                                                        &file, dir);
+            /*
+             * we either have an rc to return with or we have an open KFile:
+             * check for possible encryption that we are told to decrypt
+             */
+            if (rc == 0)
+            {
+                rc = VFSManagerOpenFileReadDecryption (self, dir, f, file, path,
+                                                       force_decrypt, was_encrypted);
+            }
+            /* release file if we are here and it is open */
+            KFileRelease (file);
+        }
+    }
+    return rc;
+}
+
+
+static
+rc_t VFSManagerOpenFileReadDirectoryRelativeInt (const VFSManager *self,
+                                                 const KDirectory * dir,
+                                                 KFile const **f,
+                                                 const VPath * path,
+                                                 bool force_decrypt,
+                                                 bool * was_encrypted)
+{
+    rc_t rc;
+
+    if (f == NULL)
+        rc = RC (rcVFS, rcMgr, rcOpening, rcParam, rcNull);
+
+    else
+    {
+        *f = NULL;
+
+        if ((f == NULL) || (path == NULL))
+            rc = RC (rcVFS, rcMgr, rcOpening, rcParam, rcNull);
+
+        else if (self == NULL)
+            rc = RC (rcVFS, rcMgr, rcOpening, rcSelf, rcNull);
+
+        else
+        {
+
+            rc = VFSManagerOpenFileReadInt (self, dir, f, path, force_decrypt, was_encrypted);
+        }
+    }
+    return rc;
+}
+
+
+/* we will create a KFile from a http or ftp url... */
+static rc_t VFSManagerOpenCurlFile ( const VFSManager *self,
+                                     KFile const **f,
+                                     const VPath * path )
+{
+    rc_t rc;
+/*    const char * url; */
+    const String * uri = NULL;
+
+    if ( f == NULL )
+        return RC( rcVFS, rcMgr, rcOpening, rcParam, rcNull );
+    *f = NULL;
+    if ( self == NULL )
+        return RC( rcVFS, rcMgr, rcOpening, rcSelf, rcNull );
+    if ( path == NULL )
+        return RC( rcVFS, rcMgr, rcOpening, rcParam, rcNull );
+
+/*    url = path->path.addr; */
+    rc = VPathMakeString ( path, &uri );
+    if ( rc == 0 )
+    {
+        bool high_reliability = VPathIsHighlyReliable ( path );
+        if ( self->resolver != NULL )
+        {
+            const VPath * local_cache;
+
+            /* find cache - vresolver call */
+            rc = VResolverCache ( self->resolver, path, &local_cache, 0 );
+            if ( rc == 0 )
+            {
+                /* we did find a place for local cache --> use it! */
+                rc = VFSManagerMakeHTTPFile( self, f, uri->addr, local_cache->path.addr, high_reliability );
+                {
+                    rc_t rc2 = VPathRelease ( local_cache );
+                    if ( rc == 0 )
+                    {
+                        rc = rc2;
+                    }
+                }
+            }
+            else
+                /* we did NOT find a place for local cache --> we are not caching! */
+                rc = VFSManagerMakeHTTPFile( self, f, uri->addr, NULL, high_reliability );
+        }
+        else
+        {
+            rc = VFSManagerMakeHTTPFile( self, f, uri->addr, NULL, high_reliability );
+        }
+        free( ( void * )uri );
+    }
+    return rc;
+}
+
+LIB_EXPORT
+rc_t CC VFSManagerOpenFileReadDirectoryRelative (const VFSManager *self,
+                                                 const KDirectory * dir,
+                                                 KFile const **f,
+                                                 const VPath * path)
+{
+    return VFSManagerOpenFileReadDirectoryRelativeInt (self, dir, f, path, false, NULL);
+}
+
+LIB_EXPORT
+rc_t CC VFSManagerOpenFileReadDirectoryRelativeDecrypt (const VFSManager *self,
+                                                        const KDirectory * dir,
+                                                        KFile const **f,
+                                                        const VPath * path) /*,
+                                                        bool force_decrypt) */
+{
+    return VFSManagerOpenFileReadDirectoryRelativeInt (self, dir, f, path, true, NULL);
+}
+
+
+static rc_t ResolveVPathByVResolver( struct VResolver * resolver, const VPath ** path )
+{
+    rc_t rc;
+
+    if ( resolver == NULL )
+        rc = RC ( rcVFS, rcFile, rcOpening, rcSRA, rcUnsupported );
+    else
+    {
+        const VPath * tpath;
+        rc = VResolverLocal ( resolver, *path, &tpath );
+        if ( rc == 0 )
+        {
+            VPathRelease ( *path );
+            *path = tpath;
+        }
+    }
+    return rc;
+}
+
+static rc_t ResolveVPathBySRAPath( const VPath ** path )
+{
+    * path = NULL;
+    return RC ( rcVFS, rcFile, rcOpening, rcSRA, rcUnsupported );
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerOpenFileRead ( const VFSManager *self,
+                                            KFile const **f,
+                                            const VPath * path_ )
+{
+    rc_t rc;
+
+    if ( f == NULL )
+        rc = RC (rcVFS, rcMgr, rcOpen, rcParam, rcNull);
+    else
+    {
+        *f = NULL;
+
+        if  (self == NULL )
+            rc = RC ( rcVFS, rcMgr, rcOpen, rcSelf, rcNull );
+        else if ( f == NULL )
+            rc = RC ( rcVFS, rcMgr, rcOpen, rcParam, rcNull );
+        else
+        {
+            rc = VPathAddRef ( path_ );
+            if ( rc == 0 )
+            {
+                const VPath * path = path_;
+                VPUri_t uri_type = VPathGetUri_t ( path );
+
+                switch ( uri_type )
+                {
+                default:
+                case vpuri_invalid:
+                    rc = RC (rcVFS, rcFile, rcOpening, rcPath, rcInvalid);
+                    break;
+
+                case vpuri_not_supported:
+                    rc = RC (rcVFS, rcFile, rcOpening, rcPath, rcUnsupported);
+                    break;
+
+                case vpuri_ncbi_acc:
+                    if ( self->resolver != NULL )
+                        rc = ResolveVPathByVResolver( self->resolver, &path );
+                    else
+                        rc = ResolveVPathBySRAPath( &path );
+
+                    if ( rc != 0 )
+                        break;
+
+                /* !!! fall through !!! */
+
+                case vpuri_none:
+                case vpuri_ncbi_vfs:
+                case vpuri_file:
+                    rc = VFSManagerOpenFileReadDirectoryRelativeInt ( self, self->cwd, f, path, false, NULL );
+                    break;
+
+                case vpuri_ncbi_legrefseq:
+                    rc = RC ( rcVFS, rcFile, rcOpening, rcPath, rcIncorrect );
+                    break;
+
+                case vpuri_http:
+                case vpuri_https:
+                case vpuri_ftp:
+                    rc = VFSManagerOpenCurlFile ( self, f, path );
+                    break;
+                }
+                VPathRelease (path);
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerOpenFileReadDecrypt (const VFSManager *self,
+                                                  KFile const **f,
+                                                  const VPath * path)
+{
+    return VFSManagerOpenFileReadDirectoryRelativeInt ( self, self->cwd, f, path, true, NULL );
+}
+
+LIB_EXPORT
+rc_t CC VFSManagerOpenDirectoryUpdateDirectoryRelative (const VFSManager *self,
+                                                        const KDirectory * dir,
+                                                        KDirectory **d,
+                                                        const VPath * path)
+{
+    rc_t rc;
+    VPUri_t uri_type;
+
+    if ((d == NULL) || (path == NULL))
+        return RC (rcVFS, rcMgr, rcOpening, rcParam, rcNull);
+
+    *d = NULL;
+
+    if (self == NULL)
+        return RC (rcVFS, rcMgr, rcOpening, rcSelf, rcNull);
+
+    uri_type = VPathGetUri_t ( path );
+    switch ( uri_type )
+    {
+    case vpuri_http :
+    case vpuri_https:
+    case vpuri_ftp :
+        return RC( rcVFS, rcMgr, rcOpening, rcParam, rcWrongType );
+
+    default :
+        {
+            uint32_t type;
+
+            /* WHY NOT JUST TRY TO OPEN THE DIRECTORY,
+               AND LET KFS TELL US WHAT'S WRONG? */
+
+            type = KDirectoryPathType (dir, "%.*s", ( int ) path -> path . size, path -> path . addr );
+            switch (type & ~kptAlias)
+            {
+            case kptNotFound:
+                rc = RC (rcVFS, rcMgr, rcOpening, rcDirectory, rcNotFound);
+                break;
+
+            case kptFile:
+                rc = RC (rcVFS, rcMgr, rcOpening, rcDirectory, rcReadonly);
+                break;
+
+            case kptBadPath:
+                rc = RC (rcVFS, rcMgr, rcOpening, rcDirectory, rcInvalid);
+                break;
+
+            case kptDir:
+                rc = KDirectoryOpenDirUpdate ((KDirectory*)dir, d, false, "%.*s", ( int ) path -> path . size, path -> path . addr);
+                return rc;
+
+            case kptCharDev:
+            case kptBlockDev:
+            case kptFIFO:
+            case kptZombieFile:
+                rc = RC (rcVFS, rcMgr, rcOpening, rcDirectory, rcIncorrect);
+                break;
+
+            default:
+                rc = RC (rcVFS, rcMgr, rcOpening, rcDirectory, rcUnknown);
+                break;
+            }
+        }
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerOpenDirectoryUpdate (const VFSManager *self,
+                                                  KDirectory **d,
+                                                  const VPath * path)
+{
+    return VFSManagerOpenDirectoryUpdateDirectoryRelative (self, self->cwd, d, path);
+}
+
+
+static
+rc_t TransformFileToDirectory(const KDirectory * dir,
+                              const KFile * file,
+                              KDirectory const **d,
+                              const char *path_str,
+                              bool was_encrypted)
+{
+    rc_t rc;
+
+    rc = KFileRandomAccess( file );
+    if (rc)
+        PLOGERR(klogErr,(klogErr, rc, "Can not use files without random access"
+                         " as database archives '$(P)'", "P=%s", path_str));
+    else
+    {
+        size_t tz;
+        char tbuff [4096];
+
+        rc = KFileReadAll (file, 0, tbuff, sizeof tbuff, &tz);
+        if ( rc )
+            LOGERR (klogErr, rc, "Error reading the head of an archive to use as a database object");
+        else
+        {
+            /* we only use KAR/SRA or tar files as archives so try to identify
+             * as our KAR/SRA file.
+             IT IS NOT TRUE ANYMORE ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
+            if ( KFileIsSRA( tbuff, tz ) == 0 )
+                /* if it was open it as a directory */
+                rc = KDirectoryOpenSraArchiveReadUnbounded_silent_preopened( dir, d, false, file, "%s", path_str );
+
+            else
+            {
+                rc = KDirectoryOpenTarArchiveRead_silent_preopened( dir, d, false, file, "%s", path_str );
+
+                /*
+                 * if RC here we did not have an SRA and did not have
+                 * a tar file we could use; assume the problem was:
+                 * - decryption if the file was encrypted
+                 * - or it is not an archive
+                 */
+                if (rc != 0) {
+                    if ( was_encrypted ) {
+                     /* the following RC update is not correct anymore but:
+                        TODO: check tools/libraries
+                            that expect this returned code and fix them
+                        rc = RC(rcVFS, rcEncryptionKey, rcOpening, rcEncryption,
+                             rcIncorrect );
+                        PLOGERR (klogErr, (klogErr, rc,
+                            "could not use '$(P)' as an "
+                            "archive it was encrypted so the password"
+                            " was possibly wrong or it is not SRA or"
+                            " TAR file", "P=%s", path_str)); */
+                        MGR_DEBUG(("TransformFileToDirectory: could not use "
+                            "'%s' as an archive - it was encrypted and "
+                            "the password was possibly wrong "
+                            "or it is not SRA or TAR file\n", path_str));
+                    }
+                    else {
+                        PLOGERR (klogInfo, (klogInfo, rc,
+                            "could not use '$(P)' as an "
+                            "archive not identified as SRA or"
+                            " TAR file", "P=%s", path_str));
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+/* also handles ftp - if it cant we'll need another function */
+static
+rc_t VFSManagerOpenDirectoryReadHttp (const VFSManager *self,
+                                      const KDirectory * dir,
+                                      KDirectory const **d,
+                                      const VPath * path,
+                                      bool force_decrypt)
+{
+    rc_t rc;
+    const KFile * file = NULL;
+
+    rc = VFSManagerOpenCurlFile ( self, &file, path );
+    if ( rc != 0 )
+    {
+        const char extension[] = ".vdbcache";
+        const String * s = & path -> path;
+        assert ( s );
+        /* do not log error for .vdbcache http files : find a better solution */
+        if ( s -> addr == NULL
+            || s -> size < sizeof extension || s -> len < sizeof extension
+            || string_cmp ( s -> addr + s -> size - sizeof extension + 1,
+                sizeof extension - 1,
+                extension, sizeof extension - 1, sizeof extension - 1 ) != 0 )
+        {
+          const String * p = NULL;
+          rc_t rc = VPathMakeString ( path, & p );
+          if ( rc == 0 ) {
+                PLOGERR ( klogErr, ( klogErr, rc, "error with http open '$(path)'",
+                                       "path=%S", p ) );
+                free (  ( void * ) p );
+          } else {
+            PLOGERR ( klogErr, ( klogErr, rc, "error with http open '$(scheme):$(path)'",
+                             "scheme=%S,path=%S", & path -> scheme, s ) );
+          }
+        }
+    }
+    else
+    {
+        const char mountpointpath[] = "/";
+        const KDirectory * mountpoint;
+
+        rc = KQuickMountDirMake (self->cwd, &mountpoint, file,
+                                 mountpointpath, sizeof mountpointpath - 1, 
+                                 path->path.addr, path->path.size);
+        if (rc)
+        {
+            PLOGERR (klogInt, (klogErr, rc, "error creating mount "
+                               "'$(M)' for '$(F)", "M=%s,F=%S",
+                               mountpointpath, &path->path));
+        }
+        else
+        {
+            const KFile * f;
+            bool was_encrypted = false;
+
+            rc = VFSManagerOpenFileReadDecryption (self, mountpoint, &f,
+                                                   file, path,
+                                                   force_decrypt,
+                                                   &was_encrypted);
+            if (rc == 0)
+            {
+                    
+                rc = TransformFileToDirectory (mountpoint, f, d, 
+                                               path->path.addr,
+                                               was_encrypted);
+                /* hacking in the fragment bit */
+                if ((rc == 0) && (path->fragment . size > 1 ) )
+                {
+                    const KDirectory * tempd = * d;
+                    const char * fragment = path -> fragment . addr + 1;
+                    int frag_size = ( int ) path -> fragment . size - 1;
+
+                    assert ( fragment [ -1 ] == '#' );
+                        
+                    rc = KDirectoryOpenDirRead (tempd, d, false, "%.*s", frag_size, fragment );
+                    
+                    KDirectoryRelease (tempd);
+                }
+                KFileRelease (f);
+            }
+            KDirectoryRelease (mountpoint);
+        }
+        KFileRelease (file);
+    }
+    return rc;
+}
+
+/* similar to VFSManagerOpenDirectoryReadHttp but already resolved */
+static
+rc_t VFSManagerOpenDirectoryReadHttpResolved (const VFSManager *self,
+                                              KDirectory const **d,
+                                              const VPath * path,
+                                              const VPath * cache,
+                                              bool force_decrypt)
+{
+    const String * uri = NULL;
+    rc_t rc = VPathMakeString ( path, &uri );
+    if ( rc == 0 )
+    {
+        /* check how the path has been marked */
+        bool high_reliability = VPathIsHighlyReliable ( path );
+
+        const KFile * file = NULL;
+        rc = VFSManagerMakeHTTPFile( self, &file, uri->addr, cache == NULL ? NULL : cache->path.addr, high_reliability );
+        if ( rc != 0 )
+        {
+            if ( high_reliability )
+            {
+                PLOGERR ( klogErr, ( klogErr, rc, "error with http open '$(U)'",
+                                     "U=%S", uri ) );
+            }
+        }
+        else
+        {
+            const char mountpointpath[] = "/";
+            const KDirectory * mountpoint;
+
+            rc = KQuickMountDirMake (self->cwd, &mountpoint, file,
+                                     mountpointpath, sizeof mountpointpath - 1, 
+                                     path->path.addr, path->path.size);
+            if (rc)
+            {
+                PLOGERR (klogInt, (klogErr, rc, "error creating mount "
+                                   "'$(M)' for '$(F)", "M=%s,F=%S",
+                                   mountpointpath, &path->path));
+            }
+            else
+            {
+                const KFile * f;
+                bool was_encrypted = false;
+
+                rc = VFSManagerOpenFileReadDecryption (self, mountpoint, &f,
+                                                       file, path,
+                                                       force_decrypt,
+                                                       &was_encrypted);
+                if (rc == 0)
+                {
+                        
+                    rc = TransformFileToDirectory (mountpoint, f, d, 
+                                                   path->path.addr,
+                                                   was_encrypted);
+                    /* hacking in the fragment bit */
+                    if ((rc == 0) && (path->fragment . size > 1 ) )
+                    {
+                        const KDirectory * tempd = * d;
+                        const char * fragment = path -> fragment . addr + 1;
+                        int frag_size = ( int ) path -> fragment . size - 1;
+
+                        assert ( fragment [ -1 ] == '#' );
+                            
+                        rc = KDirectoryOpenDirRead (tempd, d, false, "%.*s", frag_size, fragment );
+                        
+                        KDirectoryRelease (tempd);
+                    }
+                    KFileRelease (f);
+                }
+                KDirectoryRelease (mountpoint);
+            }
+            KFileRelease (file);
+        }
+        free( ( void * )uri );
+    }
+    return rc;
+}
+
+
+static
+rc_t VFSManagerOpenDirectoryReadKfs (const VFSManager *self,
+                                     const KDirectory * dir,
+                                     KDirectory const **d,
+                                     const VPath * path,
+                                     bool force_decrypt)
+{
+    const KFile * file = NULL;
+    char rbuff[ 4096 ]; /* resolved path buffer */
+    rc_t rc;
+
+    assert (self);
+    assert (dir);
+    assert (d);
+    assert (path);
+    assert ((force_decrypt == false) || (force_decrypt == true));
+    assert (*d == NULL);
+
+    file = NULL;
+
+    rc = KDirectoryResolvePath( dir, true, rbuff, sizeof rbuff, "%.*s", ( int ) path -> path . size, path -> path . addr );
+    if ( rc == 0 )
+    {
+        uint32_t type;
+        bool was_encrypted;
+
+        type = KDirectoryPathType( dir, "%s", rbuff );
+        switch (type & ~kptAlias)
+        {
+        case kptNotFound:
+            rc = RC( rcVFS, rcMgr, rcOpening, rcDirectory, rcNotFound );
+            break;
+
+        case kptFile:
+            rc = VFSManagerOpenFileReadDirectoryRelativeInt (self, dir, 
+                                                             &file, path, 
+                                                             force_decrypt,
+                                                             &was_encrypted);
+            if (rc == 0)
+                rc = TransformFileToDirectory (dir, file, d, rbuff,
+                                               was_encrypted);
+            break;
+
+        case kptBadPath:
+            rc = RC( rcVFS, rcMgr, rcOpening, rcDirectory, rcInvalid );
+            break;
+
+        case kptDir:
+            rc = KDirectoryOpenDirRead( dir, d, false, "%s", rbuff );
+            return rc;
+
+        case kptCharDev:
+        case kptBlockDev:
+        case kptFIFO:
+        case kptZombieFile:
+            rc = RC( rcVFS, rcMgr, rcOpening, rcDirectory, rcIncorrect );
+            break;
+
+        default:
+            rc = RC( rcVFS, rcMgr, rcOpening, rcDirectory, rcUnknown );
+            break;
+        }
+
+        /* hacking in the fragment bit */
+        /* the C grammar specifies order of precedence... */
+        if ((rc == 0) && (path->fragment.size > 1 ))
+        {
+            const KDirectory * tempd = * d;
+            const char * fragment = path -> fragment . addr + 1;
+            int frag_size = ( int ) path -> fragment . size - 1;
+
+            assert ( fragment [ -1 ] == '#' );
+            
+            rc = KDirectoryOpenDirRead (tempd, d, false, "%.*s", frag_size, fragment );
+            
+            KDirectoryRelease (tempd);
+        }
+    }
+
+    KFileRelease(file);
+
+    return rc;
+}
+
+
+static
+rc_t VFSManagerOpenDirectoryReadLegrefseq (const VFSManager *self,
+                                           const KDirectory * dir,
+                                           KDirectory const **d,
+                                           const VPath * path,
+                                           bool force_decrypt)
+{
+    const KFile * file;
+    const KDirectory * dd;
+    size_t num_read;
+    char pbuff [4096]; /* path buffer */
+    rc_t rc;
+
+    assert (self);
+    assert (dir);
+    assert (d);
+    assert (path);
+    assert ((force_decrypt == false) || (force_decrypt == true));
+    assert (*d == NULL);
+
+    file = NULL;
+    dd = NULL;
+
+    /* hier part only */
+    rc = VPathReadPath (path, pbuff, sizeof pbuff, &num_read);
+    if ( rc == 0 )
+    {
+        char rbuff[ 4096 ]; /* resolved path buffer */
+        rc = KDirectoryResolvePath( dir, true, rbuff, sizeof rbuff, "%s", pbuff );
+        if ( rc == 0 )
+        {
+            uint32_t type;
+            bool was_encrypted;
+
+            type = KDirectoryPathType( dir, "%s", rbuff );
+            switch (type & ~kptAlias)
+            {
+            case kptNotFound:
+                rc = RC( rcVFS, rcMgr, rcOpening, rcDirectory, rcNotFound );
+                break;
+
+            case kptFile:
+                rc = VFSManagerOpenFileReadDirectoryRelativeInt (self, dir, 
+                                                                 &file, path, 
+                                                                 force_decrypt,
+                                                                 &was_encrypted);
+                if (rc == 0)
+                    rc = TransformFileToDirectory (dir, file, &dd, rbuff,
+                                                   was_encrypted);
+                break;
+
+            case kptBadPath:
+                rc = RC( rcVFS, rcMgr, rcOpening, rcDirectory, rcInvalid );
+                break;
+
+            case kptDir:
+                rc = KDirectoryOpenDirRead( dir, &dd, false, "%s", rbuff );
+                break;
+
+            case kptCharDev:
+            case kptBlockDev:
+            case kptFIFO:
+            case kptZombieFile:
+                rc = RC( rcVFS, rcMgr, rcOpening, rcDirectory, rcIncorrect );
+                break;
+
+            default:
+                rc = RC( rcVFS, rcMgr, rcOpening, rcDirectory, rcUnknown );
+                break;
+            }
+
+            if (rc == 0)
+            {
+                if ( path -> fragment . size < 2 )
+                    rc = RC( rcVFS, rcMgr, rcOpening, rcPath, rcIncorrect );
+                else
+                {
+                    const char *fragment = path -> fragment . addr + 1;
+                    int frag_size = ( int ) path -> fragment . size - 1;
+                    assert ( fragment [ -1 ] == '#' );
+
+                    rc = KDirectoryOpenDirRead (dd, d, false, "%.*s", frag_size, fragment );
+
+                    KDirectoryRelease (dd);
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+static
+rc_t VFSManagerOpenDirectoryReadDirectoryRelativeInt (const VFSManager *self,
+                                                      const KDirectory * dir,
+                                                      KDirectory const **d,
+                                                      const VPath * path_,
+                                                      bool force_decrypt)
+{
+    rc_t rc;
+    do 
+    {
+        if (d == NULL)
+        {
+            rc =  RC (rcVFS, rcDirectory, rcOpening, rcParam, rcNull);
+            break;
+        }
+
+        *d = NULL;
+
+        if (self == NULL)
+        {
+            rc = RC (rcVFS, rcDirectory, rcOpening, rcSelf, rcNull);
+            break;
+        }
+
+        if ((dir == NULL) || (path_ == NULL))
+        {
+            rc = RC (rcVFS, rcDirectory, rcOpening, rcParam, rcNull);
+            break;
+        }
+
+#if 0
+        if ((force_decrypt != false) && (force_decrypt != true))
+        {
+            rc = RC (rcVFS, rcDirectory, rcOpening, rcParam, rcInvalid);
+            break;
+        }
+#endif
+
+        rc = VPathAddRef (path_);
+        if ( rc )
+            break;
+        else
+        {
+            const VPath *path = path_;
+            VPUri_t uri_type = VPathGetUri_t ( path );
+
+            switch ( uri_type )
+            {
+            default:
+            case vpuri_invalid:
+                rc = RC (rcVFS, rcDirectory, rcOpening, rcPath, rcInvalid);
+                break;
+
+
+            case vpuri_not_supported:
+                rc = RC (rcVFS, rcDirectory, rcOpening, rcPath, rcUnsupported);
+                break;
+
+            case vpuri_ncbi_acc:
+                if ( self->resolver != NULL )
+                    rc = ResolveVPathByVResolver( self->resolver, &path );
+                else
+                    rc = ResolveVPathBySRAPath( &path );
+                if ( rc != 0 )
+                    break;
+
+            /* !!! fall through !!! */
+
+            case vpuri_none:
+            case vpuri_ncbi_vfs:
+            case vpuri_file:
+                rc = VFSManagerOpenDirectoryReadKfs ( self, dir, d, path, force_decrypt );
+                break;
+
+            case vpuri_ncbi_legrefseq:
+                rc = VFSManagerOpenDirectoryReadLegrefseq ( self, dir, d, path, force_decrypt );
+                break;
+
+            case vpuri_http:
+            case vpuri_https:
+            case vpuri_ftp:
+                rc = VFSManagerOpenDirectoryReadHttp ( self, dir, d, path, force_decrypt );
+                break;
+            }
+            VPathRelease ( path ); /* same as path_ if not uri */
+        }
+    } while (0);
+    return rc;
+}
+
+
+LIB_EXPORT 
+rc_t CC VFSManagerOpenDirectoryReadDirectoryRelative (const VFSManager *self,
+                                                      const KDirectory * dir,
+                                                      KDirectory const **d,
+                                                      const VPath * path)
+{
+    return VFSManagerOpenDirectoryReadDirectoryRelativeInt (self, dir, d, path, false);
+}
+
+
+LIB_EXPORT 
+rc_t CC VFSManagerOpenDirectoryReadDirectoryRelativeDecrypt (const VFSManager *self,
+                                                             const KDirectory * dir,
+                                                             KDirectory const **d,
+                                                             const VPath * path)
+{
+    return VFSManagerOpenDirectoryReadDirectoryRelativeInt (self, dir, d, path, true);
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerOpenDirectoryReadDecrypt (const VFSManager *self,
+                                                       KDirectory const **d,
+                                                       const VPath * path)
+{
+    return VFSManagerOpenDirectoryReadDirectoryRelativeInt (self, self->cwd, d, path, true);
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerOpenDirectoryRead (const VFSManager *self,
+                                                KDirectory const **d,
+                                                const VPath * path)
+{
+    return VFSManagerOpenDirectoryReadDirectoryRelativeInt (self, self->cwd, d, path, false);
+}
+
+LIB_EXPORT 
+rc_t CC VFSManagerOpenDirectoryReadDecryptRemote (const VFSManager *self,
+                                                  KDirectory const **d,
+                                                  const VPath * path,
+                                                  const VPath * cache)
+{
+    rc_t rc;
+    if ( self == NULL )
+        return RC (rcVFS, rcDirectory, rcOpening, rcSelf, rcNull);
+    if ( path == NULL )
+        return RC (rcVFS, rcDirectory, rcOpening, rcParam, rcNull);
+    /* cache == NULL is ok */
+    if ( d == NULL )
+        return RC (rcVFS, rcDirectory, rcOpening, rcParam, rcNull);
+    *d = NULL;
+
+    switch ( VPathGetUri_t ( path ) )
+    {
+    case vpuri_http:
+    case vpuri_https:
+    case vpuri_ftp:
+        rc = VFSManagerOpenDirectoryReadHttpResolved ( self, d, path, cache, true );
+        break;
+        
+    default:
+        rc = RC (rcVFS, rcDirectory, rcOpening, rcPath, rcInvalid);
+        break;
+    }
+    
+    return rc;
+}
+
+
+/* OpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ */
+LIB_EXPORT rc_t CC VFSManagerOpenFileWrite (const VFSManager *self,
+                                            KFile **f, bool update,
+                                            const VPath * path )
+{
+    /* -----
+     * this is a first pass that only opens files directory referenced from 
+     * the ced or have a sysdir root; that is it uses KSysDir and KSysFile
+     * only.
+     */
+    KFile * file = NULL;
+    size_t num_read;
+    char pbuff [4096];
+    rc_t rc;
+
+    if ((f == NULL) || (path == NULL))
+        return RC (rcVFS, rcMgr, rcOpening, rcParam, rcNull);
+
+    *f = NULL;
+
+    if (self == NULL)
+        return RC (rcVFS, rcMgr, rcOpening, rcSelf, rcNull);
+
+    rc = VPathReadPath (path, pbuff, sizeof pbuff, &num_read);
+    if (rc == 0)
+    {
+        /* handle a few special case path names
+         * This probably needs to be system specifica eventually
+         */
+        if (strncmp ("/dev/", pbuff, sizeof "/dev/" - 1) == 0)
+        {
+
+            if (strcmp ("/dev/stdout", pbuff) == 0)
+                rc = KFileMakeStdOut (&file);
+            else if (strcmp ("/dev/stderr", pbuff) == 0)
+                rc = KFileMakeStdErr (&file);
+            else if (strcmp ("/dev/null", pbuff) == 0)
+                rc = KFileMakeNullUpdate (&file);
+            else if (strncmp ("/dev/fd/", pbuff, sizeof "/dev/fd/" - 1) == 0)
+            {
+                char * pc;
+                size_t ix;
+
+                pc = pbuff + sizeof "/dev/fd/" - 1;
+
+                for (ix = 0; isdigit (pc[ix]); ++ix)
+                    ;
+
+                if ((ix > 0)&&(pc[ix] == '\0'))
+                {
+                    int fd = atoi (pc);
+
+                    rc = KFileMakeFDFileWrite (&file, update, fd);
+                }
+            }
+        }
+        if ((rc == 0)&&(file == NULL))
+        {
+            char rbuff [4096];
+
+            rc = KDirectoryResolvePath (self->cwd, true, rbuff, sizeof rbuff, "%s", pbuff);
+            if (rc == 0)
+            {
+                uint32_t type;
+
+                type = KDirectoryPathType (self->cwd, "%s", rbuff);
+                switch (type & ~kptAlias)
+                {
+                case kptNotFound:
+                    rc = RC (rcVFS, rcMgr, rcOpening, rcFile, rcNotFound);
+                    break;
+
+                case kptFile:
+                    rc = KDirectoryOpenFileWrite (self->cwd, &file, update, "%s", rbuff);
+                    break;
+
+                case kptBadPath:
+                    rc = RC (rcVFS, rcMgr, rcOpening, rcFile, rcInvalid);
+                    break;
+                case kptDir:
+                case kptCharDev:
+                case kptBlockDev:
+                case kptFIFO:
+                case kptZombieFile:
+                    rc = RC (rcVFS, rcMgr, rcOpening, rcFile, rcIncorrect);
+                    break;
+
+                default:
+                    rc = RC (rcVFS, rcMgr, rcOpening, rcFile, rcUnknown);
+                    break;
+                }
+            }
+        }
+    }
+    if (rc == 0)
+    {
+        size_t z;
+        char obuff [VFS_KRYPTO_PASSWORD_MAX_SIZE+2];
+
+        if (VPathOption (path, vpopt_encrypted, obuff, sizeof obuff, &z) == 0)
+        {
+            rc = GetEncryptionKey(self, path, obuff, sizeof(obuff), &z);
+            if (rc == 0)
+            {
+                KKey key;
+                KFile * encfile;
+            
+                rc = KKeyInitUpdate (&key, kkeyAES128, obuff, z);
+                if (rc == 0)
+                {
+                    rc = KEncFileMakeWrite (&encfile, file, &key);
+                    if (rc == 0)
+                    {
+                        KFileRelease (file); /* owned by encfile now */
+                        *f = encfile;
+                        return 0;
+                    }
+                }
+            }
+            if (rc)
+                KFileRelease (file);
+        }
+        else
+        {
+            *f = file;
+            return 0;
+        }
+    }
+    return rc;
+}
+
+
+/* CreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "update" [ IN ] - if true, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "mode" [ IN ] - a creation mode ( see explanation above ).
+ *
+ *  "path" [ IN ] VPath representing the path, URL or URN of the desired file
+ */
+LIB_EXPORT rc_t CC VFSManagerCreateFile ( const VFSManager *self, KFile **f,
+                                          bool update, uint32_t access, KCreateMode mode, const VPath * path )
+{
+    /* -----
+     * this is a first pass that only opens files directory referenced from 
+     * the ced or have a sysdir root; that is it uses KSysDir and KSysFile
+     * only.
+     */
+    KFile * file = NULL;
+    size_t num_read;
+    rc_t rc;
+    bool file_created = false;
+    char pbuff [4096];
+    char rbuff [4096];
+
+    if ((f == NULL) || (path == NULL))
+        return RC (rcVFS, rcMgr, rcOpening, rcParam, rcNull);
+
+    *f = NULL;
+
+    if (self == NULL)
+        return RC (rcVFS, rcMgr, rcOpening, rcSelf, rcNull);
+
+    rc = VPathReadPath (path, pbuff, sizeof pbuff, &num_read);
+    if (rc == 0)
+    {
+
+        /* handle a few special case path names
+         * This probably needs to be system specifica eventually
+         */
+        if (strncmp ("/dev/", pbuff, sizeof "/dev/" - 1) == 0)
+        {
+
+            if (strcmp ("/dev/stdout", pbuff) == 0)
+                rc = KFileMakeStdOut (&file);
+            else if (strcmp ("/dev/stderr", pbuff) == 0)
+                rc = KFileMakeStdErr (&file);
+            else if (strcmp ("/dev/null", pbuff) == 0)
+                rc = KFileMakeNullUpdate (&file);
+            else if (strncmp ("/dev/fd/", pbuff, sizeof "/dev/fd/" - 1) == 0)
+            {
+                char * pc;
+                size_t ix;
+
+                pc = pbuff + sizeof "/dev/fd/" - 1;
+
+                for (ix = 0; isdigit (pc[ix]); ++ix)
+                    ;
+
+                if ((ix > 0)&&(pc[ix] == '\0'))
+                {
+                    int fd = atoi (pc);
+
+                    rc = KFileMakeFDFileWrite (&file, update, fd);
+                }
+            }
+        }
+        if ((rc == 0)&&(file == NULL))
+        {
+            rc = KDirectoryResolvePath (self->cwd, true, rbuff, sizeof rbuff, "%s", pbuff);
+            if (rc == 0)
+            {
+                uint32_t type;
+
+                type = KDirectoryPathType (self->cwd, "%s", rbuff);
+                switch (type & ~kptAlias)
+                {
+                case kptNotFound:
+                case kptFile:
+                    rc = KDirectoryCreateFile (self->cwd, &file, update, access, mode,
+                                               "%s", rbuff);
+                    if (rc == 0)
+                        file_created = true;
+                    break;
+
+                case kptBadPath:
+                    rc = RC (rcVFS, rcMgr, rcOpening, rcFile, rcInvalid);
+                    break;
+                case kptDir:
+                case kptCharDev:
+                case kptBlockDev:
+                case kptFIFO:
+                case kptZombieFile:
+                    rc = RC (rcVFS, rcMgr, rcOpening, rcFile, rcIncorrect);
+                    break;
+
+                default:
+                    rc = RC (rcVFS, rcMgr, rcOpening, rcFile, rcUnknown);
+                    break;
+                }
+            }
+        }
+    }
+    if (rc == 0)
+    {
+        size_t z;
+        char obuff [VFS_KRYPTO_PASSWORD_MAX_SIZE+2];
+
+        if (VPathOption (path, vpopt_encrypted, obuff, sizeof obuff, &z) == 0)
+        {
+            rc = GetEncryptionKey(self, path, obuff, sizeof(obuff), &z);
+            if (rc == 0)
+            {
+                KKey key;
+                KFile * encfile;
+                rc = KKeyInitUpdate (&key, kkeyAES128, obuff, z);
+
+                obuff[z] = '\0';
+
+                rc = KEncFileMakeWrite (&encfile, file, &key);
+                if (rc == 0)
+                {
+                    KFileRelease (file); /* now owned by encfile */
+                    *f = encfile;
+                    return 0;   
+                }
+            }
+            if (rc)
+                KFileRelease (file);
+        }
+        else
+        {
+            *f = file;
+            return 0;
+        }
+    }
+    if (rc && file_created)
+        KDirectoryRemove (self->cwd, true, "%s", rbuff);
+    return rc;
+}
+
+
+/* Remove
+ *  remove an accessible object from its directory
+ *
+ *  "force" [ IN ] - if true and target is a directory,
+ *  remove recursively
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ */
+LIB_EXPORT rc_t CC VFSManagerRemove ( const VFSManager *self, bool force,
+                                      const VPath * path )
+{
+    /* -----
+     * this is a first pass that only opens files directory referenced from 
+     * the ced or have a sysdir root; that is it uses KSysDir and KSysFile
+     * only.
+     */
+    size_t num_read;
+    char pbuff [4096];
+    rc_t rc;
+
+    if (path == NULL)
+        return RC (rcVFS, rcMgr, rcOpening, rcParam, rcNull);
+
+    if (self == NULL)
+        return RC (rcVFS, rcMgr, rcOpening, rcSelf, rcNull);
+
+    rc = VPathReadPath (path, pbuff, sizeof pbuff, &num_read);
+    if (rc == 0)
+    {
+        char rbuff [4096];
+    
+        rc = KDirectoryResolvePath (self->cwd, true, rbuff, sizeof rbuff, "%s", pbuff);
+        if (rc == 0)
+        {
+            uint32_t type;
+
+            type = KDirectoryPathType (self->cwd, "%s", rbuff);
+            switch (type & ~kptAlias)
+            {
+            case kptNotFound:
+                break;
+
+            case kptFile:
+            case kptDir:
+            case kptCharDev:
+            case kptBlockDev:
+            case kptFIFO:
+            case kptZombieFile:
+                rc = KDirectoryRemove (self->cwd, force, "%s", rbuff);
+                break;
+
+            case kptBadPath:
+                rc = RC (rcVFS, rcMgr, rcOpening, rcFile, rcInvalid);
+                break;
+/*                 rc = RC (rcVFS, rcMgr, rcOpening, rcFile, rcIncorrect); */
+/*                 break; */
+
+            default:
+                rc = RC (rcVFS, rcMgr, rcOpening, rcFile, rcUnknown);
+                break;
+            }
+        }
+    }
+    return rc;
+}
+
+/* RemoteProtocols
+ */
+LIB_EXPORT VRemoteProtocols CC  VRemoteProtocolsParse ( const String * protos )
+{
+    VRemoteProtocols parsed_protos = 0;
+
+    bool have_proto [ eProtocolMask + 1 ];
+
+    size_t i, end;
+    const char * start;
+    String http, https, fasp;
+
+    CONST_STRING ( & http,  "http"  );
+    CONST_STRING ( & https, "https" );
+    CONST_STRING ( & fasp,  "fasp"  );
+
+    end = protos -> size;
+    start = protos -> addr;
+
+    memset ( have_proto, 0, sizeof have_proto );
+
+    for ( i = end; i > 0; )
+    {
+        -- i;
+        if ( i == 0 || start [ i ] == ',' )
+        {
+            VRemoteProtocols parsed_proto = 0;
+
+            /* beginning of protocol string is either 0 or 1 past the comma */
+            size_t begin = ( i == 0 ) ? 0 : i + 1;
+
+            /* capture single protocol string */
+            String proto;
+            StringInit ( & proto, & start [ begin ], end - begin, string_len ( & start [ begin ], end - begin ) );
+
+            /* trim white space */
+            StringTrim ( & proto, & proto );
+
+            /* compare against known protocols */
+            if ( StringCaseEqual ( & http, & proto ) )
+                parsed_proto = eProtocolHttp;
+            else if ( StringCaseEqual ( & https, & proto ) )
+                parsed_proto = eProtocolHttps;
+            else if ( StringCaseEqual ( & fasp, & proto ) )
+                parsed_proto = eProtocolFasp;
+
+            if ( parsed_proto != eProtocolNone && ! have_proto [ parsed_proto ] )
+            {
+                parsed_protos <<= 3;
+                parsed_protos |= parsed_proto;
+                have_proto [ parsed_proto ] = true;
+            }
+
+            end = i;
+        }
+    }
+
+    return parsed_protos;
+}
+
+void KConfigReadRemoteProtocols ( const KConfig * self, VRemoteProtocols * remote_protos )
+{
+    String * protos;
+    rc_t rc = KConfigReadString ( self, "/name-resolver/remote-protocols", & protos );
+    if ( rc == 0 )
+    {
+        VRemoteProtocols parsed_protos = VRemoteProtocolsParse ( protos );
+        if ( parsed_protos != 0 )
+            * remote_protos = parsed_protos;
+
+        StringWhack ( protos );
+    }
+}
+
+/* Make
+ */
+LIB_EXPORT rc_t CC VFSManagerMake ( VFSManager ** pmanager )
+{
+    return VFSManagerMakeFromKfg(pmanager, NULL);
+}
+
+/* Make
+ */
+LIB_EXPORT rc_t CC VFSManagerMakeFromKfg ( struct VFSManager ** pmanager,
+    struct KConfig * cfg)
+{
+    rc_t rc;
+
+    if (pmanager == NULL)
+        return RC (rcVFS, rcMgr, rcConstructing, rcParam, rcNull);
+
+    *pmanager = singleton;
+    if ( singleton != NULL )
+    {
+        rc = VFSManagerAddRef ( singleton );
+        if ( rc != 0 )
+            *pmanager = NULL;
+    }
+    else
+    {
+        VFSManager * obj;
+
+        obj = calloc (1, sizeof (*obj));
+        if (obj == NULL)
+            rc = RC (rcVFS, rcMgr, rcConstructing, rcMemory, rcExhausted);
+        else
+        {
+            KRefcountInit (& obj -> refcount, 1,
+                kfsmanager_classname, "init", "singleton" );
+
+            /* hard-coded default */
+            obj -> protocols = eProtocolHttpHttps;
+
+            rc = KDirectoryNativeDir ( & obj -> cwd );
+            if ( rc == 0 )
+            {
+                if (cfg == NULL)
+                    rc = KConfigMake ( & obj -> cfg, NULL );
+                else
+                {
+                    rc = KConfigAddRef ( cfg );
+                    if (rc == 0)
+                        obj -> cfg = cfg;
+                }
+                if ( rc == 0 )
+                {
+                    /* look for remote protocols in configuration */
+                    KConfigReadRemoteProtocols ( obj -> cfg, & obj -> protocols );
+
+                    rc = KCipherManagerMake ( & obj -> cipher );
+                    if ( rc == 0 )
+                    {
+                        rc = KKeyStoreMake ( & obj -> keystore, obj -> cfg );
+                        if ( rc == 0 )
+                        {
+                            rc = VFSManagerMakeResolver ( obj, & obj -> resolver, obj -> cfg );
+                            if ( rc != 0 )
+                            {
+                                LOGERR ( klogWarn, rc, "could not build vfs-resolver" );
+                                rc = 0;
+                            }
+
+                            rc = KNSManagerMake ( & obj -> kns );
+                            if ( rc != 0 )
+                            {
+                                LOGERR ( klogWarn, rc, "could not build network manager" );
+                                rc = 0;
+                            }
+
+                            *pmanager = singleton = obj;
+                            DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_MGR),  ("%s(%p)\n", __FUNCTION__, cfg));
+                            return 0;
+                        }
+                    }
+                }
+            }
+        }
+
+        VFSManagerDestroy (obj);
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerGetCWD (const VFSManager * self, KDirectory ** cwd)
+{
+    rc_t rc;
+
+    if ( cwd == NULL )
+        rc = RC (rcVFS, rcMgr, rcAccessing, rcParam, rcNull);
+    else
+    {
+        if ( self == NULL )
+            rc = RC (rcVFS, rcMgr, rcAccessing, rcSelf, rcNull);
+        else
+        {
+            rc = KDirectoryAddRef ( self -> cwd );
+            if ( rc == 0 )
+            {
+                * cwd = self -> cwd;
+                return 0;
+            }
+        }
+
+        * cwd = NULL;
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerGetResolver ( const VFSManager * self, struct VResolver ** resolver )
+{
+    rc_t rc;
+
+    if ( resolver == NULL )
+        rc = RC (rcVFS, rcMgr, rcAccessing, rcParam, rcNull);
+    else
+    {
+        if ( self == NULL )
+            rc = RC (rcVFS, rcMgr, rcAccessing, rcSelf, rcNull);
+        else if ( self -> resolver == NULL )
+            rc = RC ( rcVFS, rcMgr, rcAccessing, rcResolver, rcNull );
+        else
+        {
+            rc = VResolverAddRef ( self -> resolver );
+            if ( rc == 0 )
+            {
+                * resolver = self -> resolver;
+                return 0;
+            }
+        }
+
+        * resolver = NULL;
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerSetResolver
+    ( VFSManager * self, VResolver * resolver )
+{
+    rc_t rc = 0;
+
+    if ( self == NULL )
+        rc = RC (rcVFS, rcMgr, rcUpdating, rcSelf, rcNull);
+    else if ( resolver == NULL )
+        rc = RC (rcVFS, rcMgr, rcUpdating, rcParam, rcNull);
+    else if (self -> resolver != resolver ) {
+        rc = VResolverAddRef ( resolver );
+        if (rc == 0) {
+            rc = VResolverRelease ( self -> resolver );
+            if (rc == 0) {
+                self -> resolver = resolver;
+                return 0;
+            }
+        }
+
+        VResolverRelease ( resolver );
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerGetKNSMgr ( const VFSManager * self, struct KNSManager ** kns )
+{
+    rc_t rc;
+
+    if ( kns == NULL )
+        rc = RC (rcVFS, rcMgr, rcAccessing, rcParam, rcNull);
+    else
+    {
+        if ( self == NULL )
+            rc = RC (rcVFS, rcMgr, rcAccessing, rcSelf, rcNull);
+        else
+        {
+            rc = KNSManagerAddRef ( self -> kns );
+            if ( rc == 0 )
+            {
+                * kns = self -> kns;
+                return 0;
+            }
+        }
+
+        * kns = NULL;
+    }
+
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerGetKryptoPassword (const VFSManager * self,
+                                                char * password,
+                                                size_t max_size,
+                                                size_t * size)
+{
+    rc_t rc;
+
+    if (self == NULL)
+        rc = RC (rcVFS, rcMgr, rcAccessing, rcSelf, rcNull);
+
+    else if ((password == NULL) || (max_size == 0) || (size == NULL))
+        rc = RC (rcVFS, rcMgr, rcAccessing, rcParam, rcNull);
+
+    else
+    {
+        size_t z;
+        char obuff [4096 + 16];
+
+        rc = VFSManagerGetConfigPWFile(self, obuff, sizeof obuff, &z);
+        if (rc == 0)
+        {
+            VPath * vpath;
+            rc_t rc2;
+            rc = VPathMake (&vpath, obuff);
+            if (rc == 0)
+                rc = GetEncryptionKey(self, vpath, password, max_size, size);
+            rc2 = VPathRelease (vpath);
+            if (rc == 0)
+                rc = rc2;
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VFSManagerUpdateKryptoPassword (const VFSManager * self, 
+                                                   const char * password,
+                                                   size_t size,
+                                                   char * pwd_dir,
+                                                   size_t pwd_dir_size)
+{
+    static const char temp_extension [] = ".tmp";
+    rc_t rc;
+
+    if (self == NULL)
+        rc = RC (rcVFS, rcEncryptionKey, rcUpdating, rcSelf, rcNull);
+
+    else if ((password == NULL) || (size == 0))
+        rc = RC (rcVFS, rcEncryptionKey, rcUpdating, rcParam, rcNull);
+
+    else if (size > VFS_KRYPTO_PASSWORD_MAX_SIZE)
+        rc = RC (rcVFS, rcEncryptionKey, rcUpdating, rcSize, rcExcessive);
+
+    else if ((string_chr (password, size, '\n') != NULL) ||
+             (string_chr (password, size, '\r') != NULL))
+        rc = RC (rcVFS, rcEncryptionKey, rcUpdating, rcEncryptionKey, rcInvalid);
+
+    else
+    {
+        size_t old_password_file_size;
+        char old_password_file [8193];
+        
+        rc = VFSManagerGetConfigPWFile (self, old_password_file,
+                                        sizeof old_password_file - 1,
+                                        &old_password_file_size);
+        if (rc) {
+            if (rc ==
+                SILENT_RC(rcKrypto, rcMgr, rcReading, rcBuffer, rcInsufficient))
+            {
+                rc =
+                    RC(rcVFS, rcEncryptionKey, rcUpdating, rcPath, rcExcessive);
+            }
+            LOGERR (klogErr, rc, "failed to obtain configured path for password file");
+        }
+
+        else if (old_password_file_size >= (sizeof old_password_file - 1))
+        {
+            rc = RC (rcVFS, rcEncryptionKey, rcUpdating, rcPath, rcExcessive);
+            PLOGERR (klogErr,
+                     (klogErr, rc, "configured path too long for function "
+                      "'$(P)' '${F}'", "P=%s,F=%s",
+                      old_password_file, __func__));
+        }
+        else
+        {
+            KPathType ftype;
+            bool old_exists;
+
+            old_password_file[old_password_file_size] = '\0';
+            ftype = KDirectoryPathType (self->cwd, "%s", old_password_file);
+
+            switch (ftype)
+            {
+            case kptNotFound:
+                old_exists = false;
+                break;
+
+            case kptBadPath:
+                rc = RC (rcVFS, rcEncryptionKey, rcUpdating, rcPath, rcInvalid);
+                break;
+
+            case kptFile:
+                old_exists = true;
+                break;
+
+            case kptDir:
+            case kptCharDev:
+            case kptBlockDev:
+            case kptFIFO:
+            case kptZombieFile:
+            case kptDataset:
+            case kptDatatype:
+                rc = RC (rcVFS, rcEncryptionKey, rcUpdating, rcPath, rcIncorrect);
+                break;
+
+            default:
+                rc = RC (rcVFS, rcEncryptionKey, rcUpdating, rcPath, rcCorrupt);
+                break;
+            }
+
+            if (rc)
+                PLOGERR (klogErr,
+                         (klogErr, rc, "cannot use configured path for "
+                          "password file '$(P)'", "P=%s", old_password_file));
+
+            else
+            {
+                VPath * vold;
+                /* size_t new_password_file_size; */
+                char new_password_file [sizeof old_password_file + sizeof temp_extension];
+                size_t password_dir_size;
+                char password_dir [sizeof old_password_file];
+/*                 bool save_old_password; */
+                char * pc;
+
+                memmove (password_dir, old_password_file, old_password_file_size);
+                memmove (new_password_file, old_password_file, old_password_file_size);
+                memmove (new_password_file + old_password_file_size, temp_extension, sizeof temp_extension);
+                /* new_password_file_size = old_password_file_size + sizeof temp_extension - 1; */
+
+                pc = string_rchr (password_dir, old_password_file_size, '/');
+                if (pc == NULL)
+                {
+                    password_dir[0] = '.';
+                    pc = password_dir+1;
+                }
+                *pc = '\0';
+                password_dir_size = pc - password_dir;
+
+                if (pwd_dir && pwd_dir_size) {
+                    size_t n = string_copy(pwd_dir, pwd_dir_size,
+                                           password_dir, password_dir_size + 1);
+                    if (n >= pwd_dir_size) {
+                        int i = 0;
+                        size_t p = pwd_dir_size - 1;
+                        pwd_dir[p] = '\0';
+                        for (i = 0; i < 3; ++i) {
+                            if (p == 0)
+                            {   break; }
+                            pwd_dir[--p] = '.';
+                        }
+                        if (p != 0)
+                        {   pwd_dir[--p] = ' '; }
+                    }
+                }
+
+                rc = VPathMake (&vold, old_password_file);
+                if (rc)
+                    PLOGERR (klogErr,
+                             (klogErr, rc, "could not create vpath for "
+                              "password file '$(P)'", "P=%s",
+                              old_password_file));
+
+                else
+                {
+                    VPath * vnew;
+
+                    rc = VPathMake (&vnew, new_password_file);
+                    if (rc)
+                        PLOGERR (klogErr,
+                                 (klogErr, rc, "could not create vpath for "
+                                  "password file '$(P)'", "P=%s",
+                                  new_password_file));
+
+                    else
+                    {
+                        const KFile * fold = NULL;
+                        KFile * fnew = NULL;
+
+                        if (old_exists)
+                        {
+                            rc = VFSManagerOpenFileRead (self, &fold, vold);
+
+                            if (rc)
+                                PLOGERR (klogErr,
+                                         (klogErr, rc, "unable to open existing "
+                                          "password file '$(P)'", "P=%s",
+                                          old_password_file));
+                        }
+                        
+
+                        if (rc == 0)
+                        {
+                            rc = VFSManagerCreateFile (self, &fnew, false, 0600,
+                                                       kcmInit|kcmParents,
+                                                       vnew);
+                            if (rc)
+                                PLOGERR (klogErr,
+                                         (klogErr, rc, "unable to open temporary "
+                                          "password file '$(P)'", "P=%s",
+                                          new_password_file));
+
+                            else
+                            {
+                                uint64_t writ;
+                                size_t this_writ;
+
+                                rc = KFileWriteAll (fnew, 0, password, size, &this_writ);
+                                if (rc)
+                                    PLOGERR (klogErr,
+                                             (klogErr, rc, "unable to write "
+                                              "password to temporary password "
+                                              "file '$(P)'", "P=%s",
+                                              new_password_file));
+
+                                else if (this_writ != size)
+                                {
+                                    rc = RC (rcVFS, rcEncryptionKey, rcWriting,
+                                             rcFile, rcInsufficient);
+                                    PLOGERR (klogErr,
+                                             (klogErr, rc, "unable to write complete "
+                                              "password to temporary password "
+                                              "file '$(P)'", "P=%s",
+                                              new_password_file));
+                                }
+
+                                else
+                                {
+                                    writ = this_writ;
+
+                                    rc = KFileWriteAll (fnew, this_writ, "\n", 1, &this_writ);
+                                    if (rc)
+                                        PLOGERR (klogErr,
+                                                 (klogErr, rc, "unable to write "
+                                                  "password to temporary password "
+                                                  "file '$(P)'", "P=%s",
+                                                  new_password_file));
+
+                                    else if (this_writ != 1)
+                                    {
+                                        rc = RC (rcVFS, rcEncryptionKey, rcWriting,
+                                                 rcFile, rcInsufficient);
+                                        PLOGERR (klogErr,
+                                                 (klogErr, rc, "unable to write complete "
+                                                  "password to temporary password "
+                                                  "file '$(P)'", "P=%s",
+                                                  new_password_file));
+                                    }
+
+                                    else
+                                    {
+                                        bool do_rename;
+
+                                        do_rename = true;
+                                        ++writ;
+
+                                        if (old_exists)
+                                        {
+                                            uint64_t read;
+                                            size_t this_read;
+                                            char buffer [VFS_KRYPTO_PASSWORD_MAX_SIZE+4];
+
+                                            rc = KFileReadAll (fold, 0, buffer,
+                                                               sizeof buffer, &this_read);
+                                            if (rc)
+                                                ;
+
+                                            else
+                                            {
+                                                read = this_read;
+                                                /* look for duplicated password */
+                                                if (read > size)
+                                                {
+                                                    char cc;
+
+                                                    cc = buffer[size];
+                                                    if (((cc == '\n') || (cc == '\r')) &&
+                                                        (memcmp (buffer, password, size) == 0))
+                                                    {
+                                                        do_rename = false;
+                                                    }
+                                                }
+                                                if (read)
+                                                    rc = KFileWriteAll (fnew, writ, buffer, read, &this_writ);
+
+                                                if (rc)
+                                                    ;
+                                                else if (do_rename)
+                                                {
+                                                    writ += this_writ;
+
+                                                    do
+                                                    {
+                                                        rc = KFileReadAll (fold, read, buffer,
+                                                                           sizeof buffer, &this_read);
+                                                        if (rc)
+                                                            ;
+
+                                                        else if (this_read == 0)
+                                                            break;
+
+                                                        else
+                                                        {
+                                                            rc = KFileWriteAll (fnew, writ, buffer,
+                                                                                this_read, &this_writ);
+                                                            if (rc)
+                                                                ;
+
+                                                            else if (this_read != this_writ)
+                                                            {
+                                                                rc = RC (rcVFS, rcEncryptionKey, rcWriting,
+                                                                         rcFile, rcInsufficient);
+                                                                PLOGERR (klogErr,
+                                                                         (klogErr, rc,
+                                                                          "unable to write complete "
+                                                                          "password to temporary password "
+                                                                          "file '$(P)'", "P=%s",
+                                                                          new_password_file));
+                                                            }
+
+                                                            else
+                                                            {
+                                                                read += this_read;
+                                                                writ += this_writ;
+                                                            }
+                                                        }
+                                                    } while (rc == 0);
+                                                }
+                                            }
+                                            KFileRelease (fold);
+                                            fold = NULL;
+                                        }
+
+                                        KFileRelease (fnew);
+                                        fnew = NULL;
+
+                                        if (rc == 0)
+                                        {
+                                            if (do_rename)
+                                            {
+                                                rc = KDirectoryRename (self->cwd, true, 
+                                                                       new_password_file,
+                                                                       old_password_file);
+                                            }
+                                            else
+                                            {
+                                                KDirectoryRemove (self->cwd, true, "%s", new_password_file);
+                                            }
+
+#if !WINDOWS
+                                            if (rc == 0)
+                                            {
+                                                uint32_t access;
+
+                                                rc = KDirectoryAccess (self->cwd,
+                                                                       &access, "%s", password_dir);
+                                                if (rc)
+                                                    ;
+
+                                                else
+                                                {
+                                                    if (access & 0027)
+                                                        rc = RC (rcVFS, rcEncryptionKey, rcUpdating, rcDirectory, rcExcessive);
+                                                }
+                                            }
+#endif
+                                        }
+                                    }
+                                }
+                                KFileRelease (fnew);
+                            }
+                            KFileRelease (fold);
+                        }
+                        VPathRelease (vold);
+                    }
+                    VPathRelease (vnew);
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * KConfig
+ *  placing some KConfig code that relies upon VFS here
+ */
+
+
+/* ReadVPath
+ *  read a VPath node value
+ *
+ * self [ IN ] - KConfig object
+ * path [ IN ] - path to the node
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+LIB_EXPORT rc_t CC KConfigReadVPath ( struct KConfig const* self, const char* path, struct VPath** result )
+{
+    rc_t rc;
+
+    if ( result == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        struct KConfigNode const *n;
+        rc = KConfigOpenNodeRead ( self, & n, "%s", path );
+        if ( rc == 0 )
+        {
+            rc = KConfigNodeReadVPath ( n, result );
+            KConfigNodeRelease ( n );
+            return rc;
+        }
+
+        * result = NULL;
+    }
+
+    return rc;
+}
+
+/* ReadVPath
+ *  read a VPath node value
+ *
+ * self [ IN ] - KConfigNode object
+ * result [ OUT ] - return value (rc != 0 if cannot be converted)
+ *
+ */
+LIB_EXPORT rc_t CC KConfigNodeReadVPath ( struct KConfigNode const *self, struct VPath** result )
+{
+    rc_t rc;
+
+    if ( result == NULL )
+        rc = RC ( rcKFG, rcNode, rcReading, rcParam, rcNull );
+    else
+    {
+        char buffer [ 4096 ];
+        size_t num_read, to_read;
+        rc = KConfigNodeRead ( self, 0, buffer, sizeof buffer, & num_read, & to_read );
+        if ( rc == 0 )
+        {
+            char *p;
+
+            if ( to_read == 0 && num_read < sizeof buffer )
+            {
+                buffer [ num_read ] = 0;
+                return VPathMake ( result, buffer );
+            }
+
+            p = malloc ( num_read + to_read + 1 );
+            if ( p == NULL )
+                rc = RC ( rcKFG, rcNode, rcReading, rcMemory, rcExhausted );
+            else
+            {
+                rc = KConfigNodeRead ( self, 0, p, num_read + to_read + 1, & num_read, & to_read );
+                if ( rc == 0 )
+                {
+                    p [ num_read ] = 0;
+                    rc = VPathMake ( result, p );
+                }
+
+                free ( p );
+                return rc;
+            }
+        }
+
+        * result = NULL;
+    }
+
+    return rc;
+}
+
+
+static rc_t VFSManagerResolveAcc( const VFSManager * self,
+                                  const struct VPath * source,
+                                  struct VPath ** path_to_build,
+                                  const struct KFile ** remote_file,
+                                  const struct VPath ** local_cache )
+{
+    rc_t rc;
+    const VPath * local, * remote;
+    
+    assert (self);
+    assert (source);
+    assert (path_to_build);
+    assert (remote_file);
+    assert (local_cache);
+
+#if 1
+    rc = VResolverQuery ( self -> resolver, self -> protocols, source, & local, & remote, local_cache );
+    if ( rc == 0 )
+    {
+        assert ( local != NULL || remote != NULL );
+        assert ( local == NULL || remote == NULL );
+        * path_to_build = ( VPath* ) ( ( local != NULL ) ? local : remote );
+    }
+#else
+
+    /* first try to find it localy */
+    rc = VResolverLocal ( self->resolver, source, (const VPath **)path_to_build );
+    if ( GetRCState( rc ) == rcNotFound )
+    {
+        /* if not found localy, try to find it remotely */
+        rc = VResolverRemote ( self->resolver, self -> protocols,
+            source, (const VPath **)path_to_build, remote_file );
+        if ( rc == 0 && remote_file != NULL && local_cache != NULL )
+        {
+            /* if found and the caller wants to know the location of a local cache file... */
+            uint64_t size_of_remote_file = 0;
+            if ( *remote_file != NULL )
+                rc = KFileSize ( *remote_file, &size_of_remote_file );
+            if ( rc ==  0 )
+                rc = VResolverCache ( self->resolver, *path_to_build, local_cache, size_of_remote_file );
+        }
+    }
+
+#endif
+    return rc;
+}
+
+
+static rc_t VFSManagerResolveLocal( const VFSManager * self,
+                                    const char * local_path,
+                                    struct VPath ** path_to_build )
+{
+    assert ( self != NULL );
+    assert ( local_path != NULL && local_path [ 0 ] != 0 );
+    assert ( path_to_build != NULL );
+
+    return VFSManagerMakePath ( self, path_to_build, "ncbi-file:%s", local_path );
+}
+
+static rc_t VFSManagerResolvePathOrAcc( const VFSManager * self,
+                                        const struct VPath * source,
+                                        struct VPath ** path_to_build,
+                                        const struct KFile ** remote_file,
+                                        const struct VPath ** local_cache,
+                                        bool resolve_acc )
+{
+    char buffer[ 4096 ];
+    size_t num_read;
+    rc_t rc = VPathReadPath ( source, buffer, sizeof buffer, &num_read );
+    if ( rc == 0 && num_read > 0 )
+    {
+        char * pos_of_slash = string_chr ( buffer, string_size( buffer ), '/' );
+        if ( pos_of_slash != NULL )
+        {
+            /* we can now assume that the source is a filesystem-path :
+               we build a new VPath and prepend with 'ncbi-file:' */
+            rc = VFSManagerResolveLocal( self, buffer, path_to_build );
+        }
+        else if ( resolve_acc )
+        {
+            /* we assume the source is an accession! */
+            rc = VFSManagerResolveAcc( self, source, path_to_build, remote_file, local_cache );
+            if ( GetRCState( rc ) == rcNotFound )
+            {
+                /* if we were not able to find the source as accession, we assume it is a local path */
+                rc = VFSManagerResolveLocal( self, buffer, path_to_build );
+            }
+        }
+        else
+        {
+            rc = RC ( rcVFS, rcMgr, rcAccessing, rcParam, rcInvalid );
+        }
+    }
+    return rc;
+}
+
+
+static rc_t VFSManagerResolveRemote( const VFSManager * self,
+                                     struct VPath ** source,
+                                     struct VPath ** path_to_build,
+                                     const struct KFile ** remote_file,
+                                     const struct VPath ** local_cache )
+{
+    rc_t rc = 0;
+    *path_to_build = *source;
+    if ( local_cache != NULL && remote_file != NULL && self->resolver != NULL )
+    {
+
+/*        VFS_EXTERN rc_t CC VPathMakeString ( const VPath * self, const String ** uri ); */
+        char full_url[ 4096 ];
+        size_t num_read;
+        rc = VPathReadPath ( *source, full_url, sizeof full_url, &num_read );
+        if ( rc == 0 && num_read > 0 )
+        {
+            rc = KNSManagerMakeHttpFile ( self -> kns, remote_file, NULL, 0x01010000, full_url );
+            if ( rc == 0 )
+            {
+                uint64_t size_of_remote_file = 0;
+                rc = KFileSize ( *remote_file, &size_of_remote_file );
+                if ( rc == 0 )
+                    rc = VResolverCache ( self->resolver, *source, local_cache, size_of_remote_file );
+            }
+        }
+    }
+    *source = NULL;
+    return rc;
+}
+
+/* DEPRECATED */
+LIB_EXPORT rc_t CC VFSManagerResolveSpec ( const VFSManager * self,
+                                           const char * spec,
+                                           struct VPath ** path_to_build,
+                                           const struct KFile ** remote_file,
+                                           const struct VPath ** local_cache,
+                                           bool resolve_acc )
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcVFS, rcMgr, rcAccessing, rcSelf, rcNull );
+    else if ( spec == NULL || path_to_build == NULL )
+        rc = RC ( rcVFS, rcMgr, rcAccessing, rcParam, rcNull );
+    else if ( spec[ 0 ] == 0 )
+        rc = RC ( rcVFS, rcMgr, rcAccessing, rcParam, rcEmpty );
+    else
+    {
+        VPath * temp;
+        *path_to_build = NULL;
+        if ( local_cache != NULL )
+            *local_cache = NULL;
+        if ( remote_file != NULL ) 
+            *remote_file = NULL;
+        rc = VPathMake ( &temp, spec );
+        if ( rc == 0 )
+        {
+            VPUri_t uri_type;
+            rc = VPathGetScheme_t( temp, &uri_type );
+            if ( rc == 0 )
+            {
+                switch ( uri_type )
+                {
+                default                  : /* !! fall through !! */
+                case vpuri_invalid       : rc = RC ( rcVFS, rcMgr, rcAccessing, rcParam, rcInvalid );
+                                           break;
+
+                case vpuri_none          : /* !! fall through !! */
+                case vpuri_not_supported : rc = VFSManagerResolvePathOrAcc( self, temp, path_to_build, remote_file, local_cache, resolve_acc );
+                                           break;
+
+                case vpuri_ncbi_vfs      : /* !! fall through !! */
+                case vpuri_file          : *path_to_build = temp;
+                                           temp = NULL;
+                                           break;
+
+                case vpuri_ncbi_acc      : if ( resolve_acc )
+                                                rc = VFSManagerResolveAcc( self, temp, path_to_build, remote_file, local_cache );
+                                           else
+                                                rc = RC ( rcVFS, rcMgr, rcAccessing, rcParam, rcInvalid );
+                                           break;
+
+                case vpuri_http          : /* !! fall through !! */
+                case vpuri_https:
+                case vpuri_ftp           : rc = VFSManagerResolveRemote( self, &temp, path_to_build, remote_file, local_cache );
+                                           break;
+
+                case vpuri_ncbi_legrefseq: /* ??? */
+                                           break;
+                }
+            }
+            if ( temp != NULL )
+                VPathRelease ( temp );
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT const struct KConfig* CC VFSManagerGetConfig(const struct VFSManager * self)
+{
+    if ( self == NULL )
+        return NULL;
+    return self->cfg;
+}
+
+/*
+ * Object Id / Object name bindings for accessions and dbGaP files
+ */
+
+#define MAX_OBJID_SIZE 20
+#define MAX_NAME_SIZE 4096
+
+LIB_EXPORT void VFSManagerSetBindingsFile(struct VFSManager * self, const char* path)
+{
+    if (self != NULL)
+        KKeyStoreSetBindingsFile( self->keystore, path);
+}
+
+LIB_EXPORT const char* VFSManagerGetBindingsFile(struct VFSManager * self)
+{
+    if (self == NULL)
+        return NULL;
+    return KKeyStoreGetBindingsFile(self->keystore);
+}
+
+LIB_EXPORT rc_t CC VFSManagerRegisterObject(struct VFSManager* self, uint32_t oid, const struct VPath* obj)
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcVFS, rcMgr, rcRegistering, rcSelf, rcNull );
+    else if ( obj == NULL )
+        rc = RC ( rcVFS, rcMgr, rcRegistering, rcParam, rcNull );
+    else
+    {
+        const String* newName;
+        rc = VPathMakeString (obj, &newName);
+        if (rc == 0)
+        {
+            rc = KKeyStoreRegisterObject(self->keystore, oid, newName);
+            StringWhack(newName);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VFSManagerGetObject(const struct VFSManager* self, uint32_t oid, struct VPath** obj)
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcVFS, rcMgr, rcRetrieving, rcSelf, rcNull );
+    else if ( obj == NULL )
+        rc = RC ( rcVFS, rcMgr, rcRetrieving, rcParam, rcNull );
+    else
+    {
+        const String* objName;
+        rc = KKeyStoreGetObjectName(self->keystore, oid, &objName);
+        if (rc == 0)
+        {
+            rc = VFSManagerMakePath (self, obj, "%S", objName);
+            StringWhack(objName);
+        }
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VFSManagerGetObjectId(const struct VFSManager* self, const struct VPath* obj, uint32_t* oid)
+{
+    rc_t rc = 0;
+    if ( self == NULL )
+        rc = RC ( rcVFS, rcMgr, rcRetrieving, rcSelf, rcNull );
+    else if ( obj == NULL || oid == NULL)
+        rc = RC ( rcVFS, rcMgr, rcRetrieving, rcParam, rcNull );
+    else
+    {
+        const String* pathString;
+        rc = VPathMakeString(obj, &pathString);
+        if (rc == 0)
+        {
+            rc = VKKeyStoreGetObjectId(self->keystore, pathString, oid);
+            StringWhack(pathString);
+        }
+    }
+    return rc;
+}
+
+
+static const char * default_path_key = "/repository/user/default-path";
+
+LIB_EXPORT rc_t CC VFSManagerGetCacheRoot ( const VFSManager * self,
+    struct VPath const ** path )
+{
+    rc_t rc;
+    if ( path == NULL )
+        rc = RC ( rcVFS, rcMgr, rcListing, rcParam, rcNull );
+    else
+    {
+        * path = NULL;
+        if ( self == NULL )
+            rc = RC ( rcVFS, rcMgr, rcListing, rcSelf, rcNull );
+        else if ( self -> cfg == NULL )
+            rc = RC ( rcVFS, rcMgr, rcListing, rcItem, rcNull );
+        else
+        {
+            struct String * spath;
+            rc = KConfigReadString ( self -> cfg, default_path_key, &spath );
+            if ( rc == 0 )
+            {
+                struct VPath * vp;
+                rc = VFSManagerMakePath ( self, &vp, "%S", spath );
+                if ( rc == 0 )
+                    *path = vp;
+                StringWhack( spath );
+            }
+        }
+    }
+    return rc;
+}
+
+
+/*
+    repo-path for instance '/repository/user/main/public'
+    read $(repo-path)/root, put it into frozen-list ( if is not already there )
+    write $(repository/user/default-path)/public as value into it ( just in case )
+*/
+static const char * indirect_root = "$(repository/user/default-path)/%s";
+
+LIB_EXPORT rc_t CC VFSManagerSetCacheRoot ( const VFSManager * self,
+    struct VPath const * path )
+{
+    rc_t rc;
+    if ( path == NULL )
+        rc = RC ( rcVFS, rcMgr, rcSelecting, rcParam, rcNull );
+    else if ( self == NULL )
+        rc = RC ( rcVFS, rcMgr, rcSelecting, rcSelf, rcNull );
+    else if ( self -> cfg == NULL )
+        rc = RC ( rcVFS, rcMgr, rcSelecting, rcItem, rcNull );
+    else
+    {
+        /* loop through the user-repositories to set the root property to the indirect path */
+        KRepositoryMgr * repo_mgr;
+        rc = KConfigMakeRepositoryMgrUpdate ( self -> cfg, &repo_mgr );
+        if ( rc == 0 )
+        {
+            KRepositoryVector user_repos;
+            rc = KRepositoryMgrUserRepositories ( repo_mgr, &user_repos );
+            if ( rc == 0 )
+            {
+                uint32_t start = VectorStart( &user_repos );
+                uint32_t count = VectorLength( &user_repos );
+                uint32_t idx;
+                for ( idx = 0; rc == 0 && idx < count; ++idx )
+                {
+                    KRepository * repo = VectorGet ( &user_repos, idx + start );
+                    if ( repo != NULL )
+                    {
+                        /* ask the repository to add it's current root to the root-history */
+                        rc = KRepositoryAppendToRootHistory( repo, NULL );
+                        if ( rc == 0 )
+                        {
+                            char repo_name[ 512 ];
+                            size_t repo_name_len;
+                            rc = KRepositoryName( repo, repo_name, sizeof repo_name, &repo_name_len );
+                            if ( rc == 0 )
+                            {
+                                char new_root[ 4096 ];
+                                size_t num_writ;
+                                repo_name[ repo_name_len ] = 0;
+                                rc = string_printf( new_root, sizeof new_root, &num_writ, indirect_root, repo_name );
+                                if ( rc == 0 )
+                                    rc = KRepositorySetRoot( repo, new_root, string_size( new_root ) );
+                            }
+                        }
+                    }
+                }
+                KRepositoryVectorWhack ( &user_repos );
+            }
+            KRepositoryMgrRelease ( repo_mgr );
+        }
+
+        /* write the new indirect path */
+        if ( rc == 0 )
+        {
+            String const * spath = NULL;
+            rc = VPathMakeString ( path, &spath );
+            if ( rc == 0 )
+            {
+                rc = KConfigWriteSString( self -> cfg, default_path_key, spath );
+                StringWhack( spath );
+                /*
+                    we do not commit, because ticket VDB-3060: 
+                    GBench wants to change the cache-root, but to automatically revert to previous value
+                    when GBench exits, this is achieved by not commiting here.
+                if ( rc == 0 )
+                    rc = KConfigCommit ( self -> cfg );
+                */
+            }
+        }
+    }
+    return rc;
+}
+
+
+static rc_t inspect_file( KDirectory * dir, KTime_t date, const char * path )
+{
+    KTime_t file_date;
+    rc_t rc = KDirectoryDate ( dir, &file_date, "%s", path );
+    if ( rc == 0 )
+    {
+        if ( file_date < date )
+            KDirectoryRemove ( dir, false, "%s", path );
+    }
+    return rc;
+} 
+
+
+static rc_t inspect_dir( KDirectory * dir, KTime_t date, const char * path )
+{
+    KNamelist * itemlist;
+    rc_t rc = KDirectoryList( dir, &itemlist, NULL, NULL, "%s", path );
+    if ( rc == 0 )
+    {
+        uint32_t count, idx;
+        rc = KNamelistCount ( itemlist, &count );
+        for ( idx = 0; rc == 0 && idx < count; idx++ )
+        {
+            const char * item;
+            rc = KNamelistGet ( itemlist, idx, &item );
+            {
+                char item_path[ 4096 ];
+                size_t num_writ;
+                rc = string_printf ( item_path, sizeof item_path, &num_writ, "%s/%s", path, item );
+                if ( rc == 0 )
+                {
+                    uint32_t pathtype = KDirectoryPathType( dir, "%s", item_path );
+                    switch( pathtype )
+                    {
+                        case kptFile : rc = inspect_file( dir, date, item_path ); break;
+                        case kptDir  : rc = inspect_dir( dir, date, item_path ); break; /* recursion! */
+                        default : break;
+                    }
+                }
+            }
+        }
+        KNamelistRelease( itemlist );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t CC VFSManagerDeleteCacheOlderThan ( const VFSManager * self,
+    uint32_t days )
+{
+    rc_t rc;
+    if ( self == NULL )
+        rc = RC ( rcVFS, rcMgr, rcSelecting, rcSelf, rcNull );
+    else if ( self -> cfg == NULL )
+        rc = RC ( rcVFS, rcMgr, rcSelecting, rcItem, rcNull );
+    else
+    {
+        /* loop through the user-repositories to get the root property */
+        const KRepositoryMgr * repo_mgr;
+        rc = KConfigMakeRepositoryMgrRead ( self -> cfg, &repo_mgr );
+        if ( rc == 0 )
+        {
+            KRepositoryVector user_repos;
+            rc = KRepositoryMgrUserRepositories ( repo_mgr, &user_repos );
+            if ( rc == 0 )
+            {
+                uint32_t start = VectorStart( &user_repos );
+                uint32_t count = VectorLength( &user_repos );
+                uint32_t idx;
+                for ( idx = 0; rc == 0 && idx < count; ++idx )
+                {
+                    KRepository * repo = VectorGet ( &user_repos, idx + start );
+                    if ( repo != NULL )
+                    {
+                        char path[ 4096 ];
+                        size_t root_size;
+                        rc = KRepositoryRoot ( repo, path, sizeof path, &root_size );
+                        if ( rc == 0 )
+                        {
+                            KTime_t date = KTimeStamp() - ( days * 60 * 60 * 24 );
+                            rc = inspect_dir( self->cwd, date, path );
+                        }
+                    }
+                }
+                KRepositoryVectorWhack ( &user_repos );
+            }
+            KRepositoryMgrRelease ( repo_mgr );
+        }
+    }
+    return rc;
+}
diff --git a/libs/vfs/path-priv.h b/libs/vfs/path-priv.h
new file mode 100644
index 0000000..902842b
--- /dev/null
+++ b/libs/vfs/path-priv.h
@@ -0,0 +1,148 @@
+/*===========================================================================
+*
+*                            Public Domain Notice
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_path_priv_
+#define _h_path_priv_
+
+#ifndef _h_vfs_extern_
+#include <vfs/extern.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+#ifndef _h_klib_data_buffer_
+#include <klib/data-buffer.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_vfs_path_
+#include <vfs/path.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * VPath
+ */
+struct VPath
+{
+    KDataBuffer data;
+
+    String scheme;
+    String auth;
+    String host;
+    String portname;
+    String path;
+    String query;
+    String fragment;
+
+    KRefcount refcount;
+
+    uint32_t obj_id;
+    uint32_t acc_code;
+
+    uint32_t ipv4;
+    uint16_t ipv6 [ 8 ];
+    uint16_t portnum;
+
+    uint8_t scheme_type;
+    uint8_t host_type;
+    uint8_t path_type;
+
+    bool from_uri;
+    bool missing_port;
+    bool highly_reliable;
+};
+
+enum VPathVariant
+{
+    vpInvalid,
+    vpOID,
+    vpAccession,
+    vpNameOrOID,
+    vpNameOrAccession,
+    vpName,
+    vpRelPath,
+    vpUNCPath,
+    vpFullPath,
+    vpAuth,
+    vpHostName,
+    vpEndpoint
+};
+
+enum VHostVariant
+{
+    vhDNSName,
+    vhIPv4,
+    vhIPv6
+};
+
+/* legacy support */
+#define VPathMake LegacyVPathMake
+VFS_EXTERN rc_t VPathMake ( VPath ** new_path, const char * posix_path );
+#define VPathMakeFmt LegacyVPathMakeFmt
+rc_t VPathMakeFmt ( VPath ** new_path, const char * fmt, ... );
+#define VPathMakeVFmt LegacyVPathMakeVFmt
+rc_t VPathMakeVFmt ( VPath ** new_path, const char * fmt, va_list args );
+VFS_EXTERN rc_t LegacyVPathMakeSysPath ( VPath ** new_path, const char * sys_path );
+
+typedef enum eVPUri_t
+{
+    vpuri_invalid = -1,
+    vpuri_none, 
+    vpuri_not_supported,
+    vpuri_ncbi_file,
+    vpuri_ncbi_vfs = vpuri_ncbi_file,
+    vpuri_file,
+    vpuri_ncbi_acc,
+    vpuri_http,
+    vpuri_https,
+    vpuri_ftp,
+    vpuri_ncbi_legrefseq,
+    vpuri_ncbi_obj,     /* for dbGaP objects */
+    vpuri_fasp,         /* for Aspera downloads */
+    vpuri_count
+} VPUri_t;
+
+#define VPathGetScheme_t LegacyVPathGetScheme_t
+VFS_EXTERN rc_t CC VPathGetScheme_t ( const VPath * self, VPUri_t * uri_type );
+
+#define VPathGetUri_t LegacyVPathGetUri_t
+VPUri_t VPathGetUri_t (const VPath * self);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_path_priv_ */
diff --git a/libs/vfs/path.c b/libs/vfs/path.c
new file mode 100644
index 0000000..240a289
--- /dev/null
+++ b/libs/vfs/path.c
@@ -0,0 +1,3801 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vfs/extern.h>
+
+#include "path-priv.h"
+
+#include <vfs/manager.h>
+#include <vfs/resolver.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+#define MAX_ACCESSION_LEN 20
+#define TREAT_URI_RESERVED_AS_FILENAME 0
+
+
+/*--------------------------------------------------------------------------
+ * VPath
+ */
+
+
+/* Whack
+ */
+static
+void VPathWhack ( VPath * self )
+{
+    KDataBufferWhack ( & self -> data );
+    KRefcountWhack ( & self -> refcount, "VPath" );
+    free ( self );
+}
+
+/* ParseURI
+ *  parse a flexible URI
+ *  allowed to be a formal URI with scheme,
+ *  a simple POSIX path, or a simple accession
+ *
+ * NB - the purpose is to parse, not to enforce correctness
+ *  emphasis is placed on speed and leniency
+ *
+ *  url
+ *      = accession
+ *      | posix-path
+ *      | scheme-spec '//' host-spec full-name-spec opt-query opt-fragment
+ *      ;
+ *
+ *  accession
+ *      = alpha-part digits-part opt-extensions
+ *      | prefix alpha-part digits-part opt-extensions
+ *      | prefix digits-part extensions opt-suffix
+ *      ;
+ *
+ *  prefix
+ *      = [A-Za-z]+ '_'
+ *
+ *  alpha-part
+ *      = [A-Za-z]+
+ *      ;
+ *
+ *  digits-part
+ *      = [0-9]+
+ *      ;
+ *
+ *  opt-extensions
+ *      =
+ *      | extensions
+ *      ;
+ *
+ *  extensions
+ *      = extension
+ *      | extensions extension
+ *      ;
+ *
+ *  extension
+ *      = '.' [0-9]+
+ *      ;
+ *
+ *  opt-suffix
+ *      =
+ *      | '_' [A-Za-z]+
+ *      ;
+ *
+ *  obj-id
+ *      = [0-9]+
+ *      ;
+ *
+ *  posix-path
+ *      = full-path
+ *      | rel-path
+ *      ;
+ *
+ *  full-path
+ *      = '/' rel-path
+ *      ;
+ *
+ *  rel-path
+ *      = name
+ *      | rel-path '/' name
+ *      ;
+ *
+ *  name
+ *      = [^?#/]+
+ *      ;
+ *
+ *  scheme-spec
+ *      = scheme ':'
+ *      ;
+ *
+ *  scheme
+ *      = [A-Za-z][-+A-Za-z0-9.]*
+ *      ;
+ *
+ *  host-spec
+ *      = dns-name
+ *      | ipv4-spec
+ *      | '[' ipv6-spec ']'
+ *      ;
+ *
+ *  full-name-spec
+ *      = '/' accession
+ *      | full-path
+ *      | '/' obj-id
+ *      ;
+ *
+ *  opt-query
+ *      =
+ *      | '?' [^#]+
+ *      ;
+ *
+ *  opt-fragment
+ *      =
+ *      | '#' any
+ *      ;
+ */
+typedef enum VPathParseState
+{
+    vppStart,
+    vppAccPrefixAlphaNamePathOrScheme,
+    vppAccAlphaNamePath,
+    vppAccDigitNamePathOrScheme,
+    vppAccDigitNamePath,
+    vppAccExtNamePathOrScheme,
+    vppAccExtNamePath,
+    vppAccSuffixNamePath,
+    vppAccDotNamePathOrScheme,
+    vppAccDotNamePath,
+    vppAccUnderNamePath,
+    vppNamePathOrScheme,
+    vppAccOidRelOrSlash,
+    vppAccPrefixAlphaRel,
+    vppAccAlphaRel,
+    vppAccDigitRel,
+    vppAccExtRel,
+    vppAccSuffixRel,
+    vppOidRel,
+    vppAccDotRel,
+    vppAccUnderRel,
+    vppSlash,
+    vppAuthHostSpec,
+    vppAuthHostNamePort,
+    vppHostSpec,
+    vppHostNamePort,
+    vppIPv4Port,
+    vppIPv4Dot,
+    vppIPv6Port,
+    vppIPv6Colon,
+    vppPortSpecOrFullPath,
+    vppPortSpec,
+    vppPortName,
+    vppPortNum,
+    vppNamePath,
+    vppUNCOrMalformedPOSIXPath,
+    vppFullOrUNCPath,
+    vppRelPath,
+    vppFullPath,
+    vppUNCPath,
+    vppParamName,
+    vppParamValue,
+    vppFragment
+}
+VPathParseState;
+
+static
+void VPathCaptureScheme ( VPath * self, const char * uri, size_t start, size_t end )
+{
+    size_t size = end - start;
+    StringInit ( & self -> scheme, & uri [ start ], size, ( uint32_t ) ( size ) );
+    self -> from_uri = true;
+
+    if ( size != 0 )
+    {
+        const char * scheme = & uri [ start ];
+        self -> scheme_type = vpuri_not_supported;
+
+        /* use size as a quick hash */
+        switch ( size )
+        {
+        case 3:
+            /* ftp */
+            if ( strcase_cmp (  scheme, 3, "ftp", 3, 3 ) == 0 )
+                self -> scheme_type = vpuri_ftp;
+            break;
+        case 4:
+            /* 4 character schemes */
+            switch (  uri [ 0 ] )
+            {
+            case 'f':
+            case 'F':
+                /* file */
+                if ( strcase_cmp (  scheme + 1, 3, "file" + 1, 3, 3 ) == 0 )
+                    self -> scheme_type = vpuri_file;
+                /* fasp */
+                else if ( strcase_cmp (  scheme + 1, 3, "fasp" + 1, 3, 3 ) == 0 )
+                    self -> scheme_type = vpuri_fasp;
+                break;
+            case 'h':
+            case 'H':
+                /* http */
+                if ( strcase_cmp (  scheme + 1, 3, "http" + 1, 3, 3 ) == 0 )
+                    self -> scheme_type = vpuri_http;
+                break;
+            }
+            break;
+        case 5:
+            /* 5 character schemes */
+            switch (  uri [ 0 ] )
+            {
+            case 'h':
+            case 'H':
+                /* https */
+                if ( strcase_cmp (  scheme + 1, 4, "https" + 1, 4, 4 ) == 0 )
+                    self -> scheme_type = vpuri_https;
+                break;
+            }
+            break;
+            
+        case 8:
+            /* 8 character schemes starting with "ncbi-" */
+            if ( strcase_cmp (  scheme, 5, "ncbi-", 5, 5 ) != 0 )
+                break;
+            switch (  uri [ 5 ] )
+            {
+            case 'a':
+            case 'A':
+                /* ncbi-acc */
+                if ( strcase_cmp (  scheme + 5 + 1, 2, "acc" + 1, 2, 2 ) == 0 )
+                    self -> scheme_type = vpuri_ncbi_acc;
+                break;
+            case 'o':
+            case 'O':
+                /* ncbi-obj */
+                if ( strcase_cmp (  scheme + 5 + 1, 2, "obj" + 1, 2, 2 ) == 0 )
+                    self -> scheme_type = vpuri_ncbi_obj;
+                break;
+            }
+            break;
+            
+        case 9:
+            /* 9 character schemes starting with "ncbi-" */
+            if ( strcase_cmp (  scheme, 5, "ncbi-", 5, 5 ) != 0 )
+                break;
+            switch (  uri [ 5 ] )
+            {
+            case 'f':
+            case 'F':
+                /* ncbi-file */
+                if ( strcase_cmp (  scheme + 5 + 1, 3, "file" + 1, 3, 3 ) == 0 )
+                    self -> scheme_type = vpuri_ncbi_file;
+                break;
+            }
+            break;
+            
+        case 16:
+            /* 16 character schemes starting with "x-ncbi-" */
+            if ( strcase_cmp (  scheme, 7, "x-ncbi-", 7, 7 ) != 0 )
+                break;
+            switch (  uri [ 7 ] )
+            {
+            case 'l':
+            case 'L':
+                /* x-ncbi-legrefseq */
+                if ( strcase_cmp (  scheme + 7 + 1, 8, "legrefseq" + 1, 8, 8 ) == 0 )
+                    self -> scheme_type = vpuri_ncbi_legrefseq;
+                break;
+            }
+            break;
+        }
+    }
+}
+
+static
+void VPathCaptureAccession ( VPath * self, const char * uri, size_t start, size_t end )
+{
+    size_t size = end - start;
+    StringInit ( & self -> path, & uri [ start ], size, ( uint32_t ) size );
+
+    switch ( self -> scheme_type )
+    {
+    case vpuri_none:
+         self -> path_type = vpNameOrAccession;
+         break;
+    case vpuri_ncbi_acc:
+        if ( size < MAX_ACCESSION_LEN )
+        {
+            self -> path_type = vpAccession;
+            break;
+        }
+        /* no break */
+    default:
+         self -> path_type = vpName;
+    }
+}
+
+static
+void VPathCaptureAccCode ( VPath * self, uint32_t acc_prefix,
+    uint32_t acc_alpha, uint32_t acc_digit, uint32_t acc_ext, uint32_t acc_suffix )
+{
+    self -> acc_code
+        = ( acc_prefix << 16 )
+        | ( acc_alpha << 12 )
+        | ( acc_digit << 8 )
+        | ( acc_ext << 4 )
+        | ( acc_suffix << 0 )
+        ;
+
+    if ( self -> path_type == vpNameOrAccession )
+    {
+        switch ( self -> acc_code >> 8 )
+        {
+        case 0x015:
+        case 0x026:
+        case 0x106:
+        case 0x126:
+            /* refseq */
+            self -> path_type = vpAccession;
+            break;
+
+        case 0x109:
+            /* refseq or named annotation */
+            self -> path_type = vpAccession;
+            break;
+
+        case 0x036:
+        case 0x037:
+        case 0x038:
+        case 0x039:
+            /* sra */
+            break;
+
+        case 0x042:
+        case 0x048:
+        case 0x049:
+        case 0x142:
+        case 0x148:
+        case 0x149:
+            /* wgs */
+            self -> path_type = vpAccession;
+            break;
+
+        case 0x029:
+            if ( self -> acc_code == 0x02910 )
+            {
+                if ( self -> path . addr [ 0 ] == 'N' &&
+                     self -> path . addr [ 1 ] == 'A' )
+                {
+                    /* na */
+                    self -> path_type = vpAccession;
+                }
+            }
+            break;
+        }
+    }
+}
+
+static
+void VPathCaptureOid ( VPath * self, uint64_t oid, const char * uri, size_t start, size_t oid_start, size_t end )
+{
+    size_t oid_size = end - oid_start;
+
+    if ( oid == 0 || oid_size > 10 || oid > 0xFFFFFFFF )
+        self -> path_type = vpName;
+    else
+    {
+        self -> obj_id = ( uint32_t ) oid;
+
+        if ( self -> scheme_type == vpuri_ncbi_obj )
+        {
+            StringInit ( & self -> path, & uri [ oid_start ], oid_size, ( uint32_t ) oid_size );
+            self -> path_type = vpOID;
+            return;
+        }
+
+        self -> path_type = vpNameOrOID;
+    }
+
+    StringInit ( & self -> path, & uri [ start ], ( end - start ), ( uint32_t ) ( end - start ) );
+}
+
+static
+void VPathCaptureAuth ( VPath * self, const char * uri, size_t start, size_t end )
+{
+    StringInit ( & self -> auth, & uri [ start ], end - start, ( uint32_t ) ( end - start ) );
+    self -> path_type = vpAuth;
+}
+
+static
+void VPathCaptureHostName ( VPath * self, const char * uri, size_t start, size_t end )
+{
+    StringInit ( & self -> host, & uri [ start ], end - start, ( uint32_t ) ( end - start ) );
+    self -> path_type = vpHostName;
+}
+
+static
+rc_t VPathCaptureIPv4 ( VPath * self, const uint32_t ipv4 [ 4 ] )
+{
+    uint32_t i;
+
+    for ( i = 0; i < 4; ++ i )
+    {
+        if ( ipv4 [ i ] >= 256 )
+            return RC ( rcVFS, rcPath, rcParsing, rcData, rcExcessive );
+    }
+
+    self -> ipv4
+        = ( ipv4 [ 0 ] << 24 )
+        | ( ipv4 [ 1 ] << 16 )
+        | ( ipv4 [ 2 ] << 8 )
+        | ( ipv4 [ 3 ] << 0 )
+        ;
+
+    self -> path_type = vpEndpoint;
+    self -> host_type = vhIPv4;
+
+    return 0;
+}
+
+static
+rc_t VPathCaptureIPv6 ( VPath * self, const uint32_t ipv6 [ 8 ] )
+{
+    uint32_t i;
+
+    for ( i = 0; i < 8; ++ i )
+    {
+        if ( ipv6 [ i ] >= 0x10000 )
+            return RC ( rcVFS, rcPath, rcParsing, rcData, rcExcessive );
+
+        self -> ipv6 [ i ] = ( uint16_t ) ipv6 [ i ];
+    }
+
+    self -> path_type = vpEndpoint;
+    self -> host_type = vhIPv6;
+
+    return 0;
+}
+
+static
+void VPathCapturePortName ( VPath * self, const char * uri, size_t start, size_t end )
+{
+    StringInit ( & self -> portname, & uri [ start ], end - start, ( uint32_t ) ( end - start ) );
+    self -> path_type = vpEndpoint;
+}
+
+static
+rc_t VPathCapturePortNum ( VPath * self, uint32_t port )
+{
+    if ( port >= 0x10000 )
+        return RC ( rcVFS, rcPath, rcParsing, rcData, rcExcessive );
+
+    self -> portnum = ( uint16_t ) port;
+    self -> path_type = vpEndpoint;
+
+    return 0;
+}
+
+static
+void VPathCapturePath ( VPath * self, const char * uri, size_t start, size_t end, uint32_t count, uint32_t var )
+{
+    StringInit ( & self -> path, & uri [ start ], end - start, count );
+    self -> path_type = ( uint8_t ) var;
+}
+
+static
+void VPathCaptureQuery ( VPath * self, const char * uri, size_t start, size_t end, uint32_t count )
+{
+    StringInit ( & self -> query, & uri [ start ], end - start, count );
+}
+
+static
+void VPathCaptureFragment ( VPath * self, const char * uri, size_t start, size_t end, uint32_t count )
+{
+    StringInit ( & self -> fragment, & uri [ start ], end - start, count );
+}
+
+#define VPathParseResetAnchor( i ) \
+    do { anchor = ( i ); count = 0; } while ( 0 )
+
+static
+rc_t VPathParseInt ( VPath * self, char * uri, size_t uri_size,
+                    bool uri_is_utf )
+{
+    rc_t rc;
+    int bytes;
+    uint32_t port;
+    size_t i, anchor;
+    uint32_t count, total;
+    VPathParseState state = vppStart;
+
+    /* for handling current accession schemes */
+    uint32_t acc_prefix = 0;
+    uint32_t acc_alpha = 0;
+    uint32_t acc_digit = 0;
+    uint32_t acc_ext = 0;
+    uint32_t acc_suffix = 0;
+
+    /* for accummulating ip addresses */
+    uint32_t ip;
+    uint32_t ipv4 [ 4 ];
+    uint32_t ipv6 [ 8 ];
+
+    /* for accumulating oid */
+    uint64_t oid;
+    uint32_t oid_anchor;
+    
+    bool pileup_ext_present = false;
+    const char pileup_ext[] = ".pileup";
+    size_t pileup_ext_size = sizeof( pileup_ext ) / sizeof( pileup_ext[0] ) - 1;
+    
+    /* remove pileup extension before parsing, so that it won't change parsing results */
+    if ( uri_size > pileup_ext_size && memcmp(&uri[uri_size - pileup_ext_size], pileup_ext, pileup_ext_size) == 0)
+    {
+        uri_size -= pileup_ext_size;
+        uri[uri_size] = '\0';
+        pileup_ext_present = true;
+    }
+
+    for ( i = anchor = 0, total = count = 0; i < uri_size; ++ total, ++ count, i += bytes )
+    {
+        /* read character */
+        uint32_t ch = uri [ i ];
+
+        /* assume ascii */
+        bytes = 1;
+        if ( ( char ) ch  < 0 )
+        {
+          if ( uri_is_utf ) {
+/* expect uri in utf8  */
+            uint32_t utf32;
+
+            /* read into UTF-32 */
+            bytes = utf8_utf32 ( & utf32, & uri [ i ], & uri [ uri_size ] );
+            if ( bytes <= 0 )
+            {
+                if ( bytes < 0 )
+                    return RC ( rcVFS, rcPath, rcParsing, rcChar, rcInvalid );
+                return RC ( rcVFS, rcPath, rcParsing, rcData, rcInsufficient );
+            }
+
+            ch = utf32;
+          }
+          else {
+/* uri is in extended ASCII  */
+              ch &= 0xff;
+          }
+        }
+
+        /* enter state */
+        switch ( state )
+        {
+        case vppStart:
+
+            if ( ch >= 128 )
+                state = vppNamePath;
+            else if ( isalpha ( ch ) )
+            {
+                acc_alpha = 1;
+                state = vppAccPrefixAlphaNamePathOrScheme;
+            }
+            else if ( isdigit ( ch ) )
+                state = vppNamePath;
+            else switch ( ch )
+            {
+            case '/':
+                state = vppFullOrUNCPath;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case ':':
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            default:
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccPrefixAlphaNamePathOrScheme:
+
+            if ( ch >= 128 )
+            {
+                acc_alpha = 0;
+                state = vppNamePath;
+            }
+            else if ( isalpha ( ch ) )
+                ++ acc_alpha;
+            else if ( isdigit ( ch ) )
+            {
+                ++ acc_digit;
+                state = vppAccDigitNamePathOrScheme;
+            }
+            else switch ( ch )
+            {
+            case '/':
+                acc_alpha = 0;
+                state = vppRelPath;
+                break;
+
+            case '_':
+                acc_prefix = 1;
+                state = vppAccAlphaNamePath;
+                acc_alpha = 0;
+                break;
+
+            case '.':
+            case '+':
+            case '-':
+                acc_alpha = 0;
+                state = vppNamePathOrScheme;
+                break;
+
+            case ':':
+                acc_alpha = 0;
+                VPathCaptureScheme ( self, uri, anchor, i );
+                state = vppAccOidRelOrSlash;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            default:
+                acc_alpha = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccAlphaNamePath:
+
+            if ( ch >= 128 )
+            {
+                acc_prefix = acc_alpha = 0;
+                state = vppNamePath;
+            }
+            else if ( isalpha ( ch ) )
+                ++ acc_alpha;
+            else if ( isdigit ( ch ) )
+            {
+                ++ acc_digit;
+                state = vppAccDigitNamePath;
+            }
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = 0;
+                state = vppRelPath;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case ':':
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            default:
+                acc_prefix = acc_alpha = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccDigitNamePathOrScheme:
+
+            if ( ch >= 128 )
+            {
+                acc_prefix = acc_alpha = acc_digit = 0;
+                state = vppNamePath;
+            }
+            else if ( isalpha ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = 0;
+                state = vppNamePathOrScheme;
+            }
+            else if ( isdigit ( ch ) )
+                ++ acc_digit;
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = 0;
+                state = vppRelPath;
+                break;
+
+            case '.':
+                state = vppAccDotNamePathOrScheme;
+                break;
+
+            case '+':
+            case '-':
+                acc_prefix = acc_alpha = acc_digit = 0;
+                state = vppNamePathOrScheme;
+                break;
+
+            case ':':
+                acc_prefix = acc_alpha = acc_digit = 0;
+                VPathCaptureScheme ( self, uri, anchor, i );
+                state = vppAccOidRelOrSlash;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccDigitNamePath:
+
+            if ( ch >= 128 || isalpha ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = 0;
+                state = vppNamePath;
+            }
+            else if ( isdigit ( ch ) )
+                ++ acc_digit;
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = 0;
+                state = vppRelPath;
+                break;
+
+            case '.':
+                state = vppAccDotNamePath;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case ':':
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccExtNamePathOrScheme:
+
+            if ( ch >= 128 )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            else if ( isalpha ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePathOrScheme;
+            }
+            else if ( isdigit ( ch ) )
+                break;
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppRelPath;
+                break;
+
+            case '.':
+                state = vppAccDotNamePathOrScheme;
+                break;
+
+            case '+':
+            case '-':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePathOrScheme;
+                break;
+
+            case ':':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                VPathCaptureScheme ( self, uri, anchor, i );
+                state = vppAccOidRelOrSlash;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            case '_':
+                if ( acc_prefix != 0 && acc_alpha == 0 && acc_digit == 9 )
+                {
+                    state = vppAccUnderNamePath;
+                    break;
+                }
+
+                /* no break */
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccExtNamePath:
+
+            if ( ch >= 128 || isalpha ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            else if ( isdigit ( ch ) )
+                break;
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppRelPath;
+                break;
+
+            case '.':
+                state = vppAccDotNamePath;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case ':':
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            case '_':
+                if ( acc_prefix != 0 && acc_alpha == 0 && acc_digit == 9 && acc_ext == 1 )
+                {
+                    state = vppAccUnderNamePath;
+                    break;
+                }
+
+                /* no break */
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccSuffixNamePath:
+
+            if ( ch >= 128 || isdigit ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = acc_suffix = 0;
+                state = vppNamePath;
+            }
+            else if ( isalpha ( ch ) )
+                break;
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = acc_suffix = 0;
+                state = vppRelPath;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case ':':
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = acc_ext = acc_suffix = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccDotNamePathOrScheme:
+
+            if ( ch >= 128 )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            else if ( isalpha ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePathOrScheme;
+            }
+            else if ( isdigit ( ch ) )
+            {
+                ++ acc_ext;
+                state = vppAccExtNamePathOrScheme;
+            }
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppRelPath;
+                break;
+
+            case '.':
+            case '+':
+            case '-':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePathOrScheme;
+                break;
+
+            case ':':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                VPathCaptureScheme ( self, uri, anchor, i );
+                state = vppAccOidRelOrSlash;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccDotNamePath:
+
+            if ( ch >= 128 || isalpha ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            else if ( isdigit ( ch ) )
+            {
+                ++ acc_ext;
+                state = vppAccExtNamePath;
+            }
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppRelPath;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case ':':
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccUnderNamePath:
+
+            if ( ch >= 128 || isdigit ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            else if ( isalpha ( ch ) )
+            {
+                ++ acc_suffix;
+                state = vppAccSuffixNamePath;
+            }
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppRelPath;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case ':':
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppNamePathOrScheme:
+
+            if ( ch >= 128 )
+                state = vppNamePath;
+            else if ( isalnum ( ch ) )
+                break;
+            else switch ( ch )
+            {
+            case '/':
+                state = vppRelPath;
+                break;
+
+            case '.':
+            case '+':
+            case '-':
+                break;
+
+            case ':':
+                VPathCaptureScheme ( self, uri, anchor, i );
+                state = vppAccOidRelOrSlash;
+                break;
+
+#if ! TREAT_URI_RESERVED_AS_FILENAME
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+#endif
+
+            default:
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccOidRelOrSlash:
+
+            VPathParseResetAnchor ( i );
+            acc_prefix = acc_digit = acc_ext = 0;
+
+            if ( ch >= 128 )
+                state = vppNamePath;
+
+            else if ( isalpha ( ch ) )
+            {
+                acc_alpha = 1;
+                state = vppAccPrefixAlphaRel;
+            }
+
+            else if ( isdigit ( ch ) )
+            {
+                state = vppOidRel;
+                oid = ch - '0';
+                oid_anchor = (uint32_t)i;
+            }
+
+            else if ( ch != '/' )
+                state = vppNamePath;
+
+            else
+                state = vppSlash;
+
+            break;
+
+        case vppAccPrefixAlphaRel:
+
+            if ( ch >= 128 )
+            {
+                acc_alpha = 0;
+                state = vppNamePath;
+            }
+            else if ( isalpha ( ch ) )
+                ++ acc_alpha;
+            else if ( isdigit ( ch ) )
+            {
+                ++ acc_digit;
+                state = vppAccDigitRel;
+            }
+            else switch ( ch )
+            {
+            case '_':
+                acc_prefix = 1;
+                acc_alpha = 0;
+                state = vppAccAlphaRel;
+                break;
+
+            case '/':
+                acc_alpha = 0;
+                state = vppRelPath;
+                break;
+
+            case '?':
+                VPathCaptureAccession ( self, uri, anchor, i );
+                VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+                state = vppParamName;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case '#':
+                VPathCaptureAccession ( self, uri, anchor, i );
+                VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            default:
+                acc_alpha = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccAlphaRel:
+
+            if ( ch >= 128 )
+            {
+                acc_prefix = acc_alpha = 0;
+                state = vppNamePath;
+            }
+            else if ( isalpha ( ch ) )
+                ++ acc_alpha;
+            else if ( isdigit ( ch ) )
+            {
+                ++ acc_digit;
+                state = vppAccDigitRel;
+            }
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = 0;
+                state = vppRelPath;
+                break;
+
+            case '?':
+                VPathCaptureAccession ( self, uri, anchor, i );
+                VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+                state = vppParamName;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case '#':
+                VPathCaptureAccession ( self, uri, anchor, i );
+                VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            default:
+                acc_prefix = acc_alpha = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccDigitRel:
+
+            if ( ch >= 128 || isalpha ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = 0;
+                state = vppNamePath;
+            }
+            else if ( isdigit ( ch ) )
+                ++ acc_digit;
+            else switch ( ch )
+            {
+            case '.':
+                state = vppAccDotRel;
+                break;
+
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = 0;
+                state = vppRelPath;
+                break;
+
+            case '?':
+                VPathCaptureAccession ( self, uri, anchor, i );
+                VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+                state = vppParamName;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case '#':
+                VPathCaptureAccession ( self, uri, anchor, i );
+                VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccExtRel:
+
+            if ( ch >= 128 || isalpha ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            else if ( isdigit ( ch ) )
+                break;
+            else switch ( ch )
+            {
+            case '.':
+                state = vppAccDotRel;
+                break;
+
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppRelPath;
+                break;
+
+            case '?':
+                VPathCaptureAccession ( self, uri, anchor, i );
+                VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+                state = vppParamName;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case '#':
+                VPathCaptureAccession ( self, uri, anchor, i );
+                VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            case '_':
+                if ( acc_prefix != 0 && acc_alpha == 0 && acc_digit == 9 && acc_ext == 1 )
+                {
+                    state = vppAccUnderRel;
+                    break;
+                }
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccSuffixRel:
+
+            if ( ch >= 128 || isdigit ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = acc_suffix = 0;
+                state = vppNamePath;
+            }
+            else if ( isalpha ( ch ) )
+                break;
+            else switch ( ch )
+            {
+            case '.':
+                state = vppAccDotRel;
+                break;
+
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppRelPath;
+                break;
+
+            case '?':
+                VPathCaptureAccession ( self, uri, anchor, i );
+                VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+                state = vppParamName;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case '#':
+                VPathCaptureAccession ( self, uri, anchor, i );
+                VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppOidRel:
+
+            if ( ch >= 128 )
+            {
+                oid = 0;
+                state = vppNamePath;
+            }
+            else if ( isdigit ( ch ) )
+            {
+                if ( oid == 0 )
+                    oid_anchor = (uint32_t)i;
+
+                oid *= 10;
+                oid += ch - '0';
+            }
+            else switch ( ch )
+            {
+            case '/':
+                oid = 0;
+                state = vppRelPath;
+                break;
+
+            case '?':
+                VPathCaptureOid ( self, oid, uri, anchor, oid_anchor, i );
+                state = vppParamName;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case '#':
+                VPathCaptureOid ( self, oid, uri, anchor, oid_anchor, i );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            default:
+                oid = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccDotRel:
+
+            if ( ch >= 128 || isalpha ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            else if ( isdigit ( ch ) )
+            {
+                ++ acc_ext;
+                state = vppAccExtRel;
+            }
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppRelPath;
+                break;
+
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppAccUnderRel:
+
+            if ( ch >= 128 || isdigit ( ch ) )
+            {
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            else if ( isalpha ( ch ) )
+            {
+                ++ acc_suffix;
+                state = vppAccSuffixRel;
+            }
+            else switch ( ch )
+            {
+            case '/':
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppRelPath;
+                break;
+
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            default:
+                acc_prefix = acc_alpha = acc_digit = acc_ext = 0;
+                state = vppNamePath;
+            }
+            break;
+
+        case vppSlash:
+
+            switch ( ch )
+            {
+            case '/':
+                if ( self -> scheme_type == vpuri_ncbi_file )
+                    state = vppUNCOrMalformedPOSIXPath;
+                else
+                    state = vppAuthHostSpec;
+                break;
+
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            case '?':
+                VPathCapturePath ( self, uri, anchor, i, count, vpFullPath );
+                state = vppParamName;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case '#':
+                VPathCapturePath ( self, uri, anchor, i, count, vpFullPath );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+
+            default:
+                state = vppFullPath;
+            }
+            break;
+
+        case vppAuthHostSpec:
+
+            if ( ch >= 128 )
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            VPathParseResetAnchor ( i );
+
+            if ( isalpha ( ch ) )
+                state = vppAuthHostNamePort;
+            else if ( isdigit ( ch ) )
+            {
+                ipv4 [ ip = 0 ] = ch - '0';
+                state = vppIPv4Port;
+            }
+            else switch ( ch )
+            {
+            case '/':
+                state = vppFullPath;
+                break;
+            case '[':
+                ip = 0;
+                memset ( ipv6, 0, sizeof ipv6 );
+                state = vppIPv6Colon;
+                break;
+            default:
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            }
+
+            break;
+
+        case vppHostSpec:
+
+            if ( ch >= 128 )
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            VPathParseResetAnchor ( i );
+
+            if ( isalpha ( ch ) )
+                state = vppHostNamePort;
+            else if ( isdigit ( ch ) )
+            {
+                ipv4 [ ip = 0 ] = ch - '0';
+                state = vppIPv4Port;
+            }
+            else switch ( ch )
+            {
+            case '/':
+                state = vppFullPath;
+                break;
+            case '[':
+                ip = 0;
+                memset ( ipv6, 0, sizeof ipv6 );
+                state = vppIPv6Colon;
+                break;
+            default:
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            }
+
+            break;
+
+        case vppAuthHostNamePort:
+
+            if ( ch >= 128 )
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            if ( isalnum ( ch ) )
+                break;
+            else switch ( ch )
+            {
+            case '@':
+                VPathCaptureAuth ( self, uri, anchor, i );
+                state = vppHostSpec;
+                break;
+
+            case '.':
+            case '+':
+            case '-':
+            case '_':
+                break;
+
+            case ':':
+                VPathCaptureHostName ( self, uri, anchor, i );
+                state = vppPortSpec;
+                break;
+
+            case '/':
+                VPathCaptureHostName ( self, uri, anchor, i );
+                state = vppFullPath;
+                VPathParseResetAnchor ( i );
+                break;
+
+            default:
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            }
+            break;
+
+        case vppHostNamePort:
+
+            if ( ch >= 128 )
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            if ( isalnum ( ch ) )
+                break;
+            else switch ( ch )
+            {
+            case '.':
+            case '+':
+            case '-':
+            case '_':
+                break;
+
+            case ':':
+                VPathCaptureHostName ( self, uri, anchor, i );
+                state = vppPortSpec;
+                break;
+
+            case '/':
+                VPathCaptureHostName ( self, uri, anchor, i );
+                state = vppFullPath;
+                VPathParseResetAnchor ( i );
+                break;
+
+            default:
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            }
+            break;
+
+        case vppIPv4Port:
+
+            if ( ch >= 128 )
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            if ( ipv4 [ ip ] >= 256 )
+                return RC ( rcVFS, rcPath, rcParsing, rcData, rcExcessive );
+            if ( isdigit ( ch ) )
+                ipv4 [ ip ] = ipv4 [ ip ] * 10 + ch - '0';
+            else if ( ++ ip == 4 )
+            {
+                switch ( ch )
+                {
+                case ':':
+                    rc = VPathCaptureIPv4 ( self, ipv4 );
+                    state = vppPortSpec;
+                    break;
+
+                case '/':
+                    rc = VPathCaptureIPv4 ( self, ipv4 );
+                    state = vppFullPath;
+                    VPathParseResetAnchor ( i );
+                    break;
+
+                default:
+                    return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+                }
+
+                if ( rc != 0 )
+                    return rc;
+            }
+            else if ( ch == '.' )
+                state = vppIPv4Dot;
+            else
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            break;
+
+        case vppIPv4Dot:
+
+            if ( ch >= 128 || ! isdigit ( ch ) )
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            ipv4 [ ip ] = ch - '0';
+            state = vppIPv4Port;
+
+            break;
+
+        case vppIPv6Port:
+
+            if ( ch >= 128 )
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            if ( ipv6 [ ip ] >= 0x10000 )
+                return RC ( rcVFS, rcPath, rcParsing, rcData, rcExcessive );
+            if ( isdigit ( ch ) )
+                ipv6 [ ip ] = ( ipv6 [ ip ] << 4 ) + ch - '0';
+            else if ( isxdigit ( ch ) )
+                ipv6 [ ip ] = ( ipv6 [ ip ] << 4 ) + toupper ( ch ) - 'A' + 10;
+            else
+            {
+                switch ( ch )
+                {
+                case ']':
+                    rc = VPathCaptureIPv6 ( self, ipv6 );
+                    state = vppPortSpecOrFullPath;
+                    break;
+
+                case ':':
+                    if ( ++ ip != 8 )
+                    {
+                        state = vppIPv6Colon;
+                        break;
+                    }
+
+                    /* no break */
+                default:
+                    return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+                }
+
+                if ( rc != 0 )
+                    return rc;
+            }
+            break;
+
+        case vppIPv6Colon:
+
+            if ( ch != ':' )
+            {
+                if ( ch >= 128 || ! isxdigit ( ch ) )
+                    return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+                if ( isdigit ( ch ) )
+                    ipv6 [ ip ] = ch - '0';
+                else
+                    ipv6 [ ip ] = toupper ( ch ) - 'A' + 10;
+            }
+
+            state = vppIPv6Port;
+
+            break;
+
+        case vppPortSpecOrFullPath:
+
+            switch ( ch )
+            {
+            case ':':
+                state = vppPortSpec;
+                break;
+
+            case '/':
+                state = vppFullPath;
+                VPathParseResetAnchor ( i );
+                break;
+
+            default:
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            }
+
+            break;
+
+        case vppPortSpec:
+
+            if ( ch >= 128 )
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            VPathParseResetAnchor ( i );
+
+            if ( isalpha ( ch ) )
+                state = vppPortName;
+            else if ( isdigit ( ch ) )
+            {
+                port = ch - '0';
+                state = vppPortNum;
+            }
+            else switch ( ch )
+            {
+            case '/':
+                self -> missing_port = true;
+                state = vppFullPath;
+                break;
+
+            default:
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            }
+
+            break;
+
+        case vppPortName:
+
+            if ( ch >= 128 )
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            if ( isalnum ( ch ) )
+                break;
+            else switch ( ch )
+            {
+            case '/':
+                VPathCapturePortName ( self, uri, anchor, i );
+                state = vppFullPath;
+                VPathParseResetAnchor ( i );
+                break;
+
+            default:
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            }
+            break;
+
+        case vppPortNum:
+
+            if ( ch >= 128 )
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            if ( port >= 0x10000 )
+                return RC ( rcVFS, rcPath, rcParsing, rcData, rcExcessive );
+
+            if ( isdigit ( ch ) )
+                port = port * 10 + ch - '0';
+            else switch ( ch )
+            {
+            case '/':
+                rc = VPathCapturePortNum ( self, port );
+                if ( rc != 0 )
+                    return rc;
+                state = vppFullPath;
+                VPathParseResetAnchor ( i );
+                break;
+
+            default:
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            }
+            break;
+
+        case vppNamePath:
+
+            switch ( ch )
+            {
+            case '/':
+                state = vppRelPath;
+                break;
+
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            case '?':
+                VPathCapturePath ( self, uri, anchor, i, count, vpName );
+                state = vppParamName;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case '#':
+                VPathCapturePath ( self, uri, anchor, i, count, vpName );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+            }
+
+            break;
+
+        case vppUNCOrMalformedPOSIXPath:
+
+            switch ( ch )
+            {
+            case '/':
+                state = vppFullPath;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            case '?':
+                VPathCapturePath ( self, uri, anchor, i, count, vpFullPath );
+                state = vppParamName;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case '#':
+                VPathCapturePath ( self, uri, anchor, i, count, vpFullPath );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+
+            default:
+                state = vppUNCPath;
+            }
+
+            break;
+
+        case vppFullOrUNCPath:
+
+            if ( ch == '/' )
+            {
+                state = vppUNCOrMalformedPOSIXPath;
+                break;
+            }
+
+            state = vppFullPath;
+            /* no break */
+
+        case vppRelPath:
+        case vppFullPath:
+
+            if(self->scheme_type != vpuri_none) switch ( ch )
+            {
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            case '?':
+                VPathCapturePath ( self, uri, anchor, i, count,
+                    ( state == vppRelPath ) ? vpRelPath : vpFullPath );
+                state = vppParamName;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case '#':
+                VPathCapturePath ( self, uri, anchor, i, count,
+                    ( state == vppRelPath ) ? vpRelPath : vpFullPath );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+            }
+
+            break;
+
+        case vppUNCPath:
+
+            switch ( ch )
+            {
+            case ':':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            case '?':
+                VPathCapturePath ( self, uri, anchor, i, count, vpUNCPath );
+                state = vppParamName;
+                VPathParseResetAnchor ( i );
+                break;
+
+            case '#':
+                VPathCapturePath ( self, uri, anchor, i, count, vpUNCPath );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+            }
+
+            break;
+
+        case vppParamName:
+
+            switch ( ch )
+            {
+            case ':':
+            case '?':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            case '=':
+                state = vppParamValue;
+                break;
+
+            case '#':
+                VPathCaptureQuery ( self, uri, anchor, i, count );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+            }
+
+            break;
+
+        case vppParamValue:
+
+            switch ( ch )
+            {
+            case ':':
+            case '?':
+            case '=':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+
+            case '&':
+                state = vppParamName;
+                break;
+
+            case '#':
+                VPathCaptureQuery ( self, uri, anchor, i, count );
+                state = vppFragment;
+                VPathParseResetAnchor ( i );
+                break;
+            }
+
+            break;
+
+        case vppFragment:
+
+            switch ( ch )
+            {
+            case ':':
+            case '?':
+            case '#':
+                return RC ( rcVFS, rcPath, rcParsing, rcChar, rcUnexpected );
+            }
+
+            break;
+        }
+    }
+
+    /* return pileup extension back */
+    if ( pileup_ext_present )
+    {
+        uri[uri_size] = '.';
+        if ( i == uri_size )
+            i += pileup_ext_size;
+        uri_size += pileup_ext_size;
+        
+        if ( acc_alpha && acc_digit )
+            ++acc_ext;
+    }
+    
+    switch ( state )
+    {
+    case vppStart:
+        return RC ( rcVFS, rcPath, rcParsing, rcString, rcEmpty );
+    case vppAccPrefixAlphaNamePathOrScheme:
+    case vppAccAlphaNamePath:
+    case vppAccDigitNamePathOrScheme:
+    case vppAccDigitNamePath:
+    case vppAccExtNamePathOrScheme:
+    case vppAccExtNamePath:
+    case vppAccSuffixNamePath:
+        VPathCaptureAccession ( self, uri, anchor, i );
+        VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+        break;
+    case vppAccDotNamePathOrScheme:
+    case vppAccDotNamePath:
+    case vppAccUnderNamePath:
+    case vppNamePathOrScheme:
+        VPathCapturePath ( self, uri, anchor, i, count, vpName );
+        break;
+    case vppAccOidRelOrSlash:
+        return RC ( rcVFS, rcPath, rcParsing, rcData, rcInsufficient );
+    case vppAccPrefixAlphaRel:
+    case vppAccAlphaRel:
+    case vppAccDigitRel:
+    case vppAccExtRel:
+    case vppAccSuffixRel:
+        VPathCaptureAccession ( self, uri, anchor, i );
+        VPathCaptureAccCode ( self, acc_prefix, acc_alpha, acc_digit, acc_ext, acc_suffix );
+        break;
+    case vppOidRel:
+        VPathCaptureOid ( self, oid, uri, anchor, oid_anchor, i );
+        break;
+    case vppAccDotRel:
+    case vppAccUnderRel:
+    case vppSlash:
+    case vppAuthHostSpec:
+    case vppHostSpec:
+        return RC ( rcVFS, rcPath, rcParsing, rcData, rcInsufficient );
+    case vppAuthHostNamePort:
+    case vppHostNamePort:
+        VPathCaptureHostName ( self, uri, anchor, i );
+        break;
+    case vppIPv4Port:
+        if ( ++ ip == 4 )
+            return VPathCaptureIPv4 ( self, ipv4 );
+    case vppIPv4Dot:
+    case vppIPv6Port:
+    case vppIPv6Colon:
+    case vppPortSpecOrFullPath:
+    case vppPortSpec:
+        return RC ( rcVFS, rcPath, rcParsing, rcData, rcInsufficient );
+    case vppPortName:
+        VPathCapturePortName ( self, uri, anchor, i );
+        break;
+    case vppPortNum:
+        return VPathCapturePortNum ( self, port );
+    case vppNamePath:
+        VPathCapturePath ( self, uri, anchor, i, count, vpName );
+        break;
+    case vppRelPath:
+        VPathCapturePath ( self, uri, anchor, i, count, vpRelPath );
+        break;
+    case vppUNCOrMalformedPOSIXPath:
+    case vppFullOrUNCPath:
+    case vppFullPath:
+        VPathCapturePath ( self, uri, anchor, i, count, vpFullPath );
+        break;
+    case vppUNCPath:
+        VPathCapturePath ( self, uri, anchor, i, count, vpUNCPath );
+        break;
+    case vppParamName:
+    case vppParamValue:
+        VPathCaptureQuery ( self, uri, anchor, i, count );
+        break;
+    case vppFragment:
+        VPathCaptureFragment ( self, uri, anchor, i, count );
+        break;
+    }
+
+    return 0;
+}
+
+static
+rc_t VPathParse ( VPath * self, char * uri, size_t uri_size )
+{
+    /* Parse uri as UTF-8 */
+    rc_t rc = VPathParseInt ( self, uri, uri_size, true );
+
+    if ( rc == SILENT_RC ( rcVFS, rcPath, rcParsing, rcChar, rcInvalid ) /* ||
+        rc == SILENT_RC ( rcVFS, rcPath, rcParsing, rcData, rcInsufficient ) */
+       )
+    {
+        /* Parse uri as extended ASCII */
+        rc = VPathParseInt ( self, uri, uri_size, false );
+    }
+
+    return rc;
+}
+
+/* MakeFromText
+ *  could be anything...
+ */
+static
+rc_t VPathMakeFromVText ( VPath ** ppath, const char * path_fmt, va_list args )
+{
+    rc_t rc;
+    KDataBuffer buffer;
+
+    /* initialize buffer */
+    memset ( & buffer, 0, sizeof buffer );
+    buffer . elem_bits = 8;
+
+    /* print into buffer */
+    rc = KDataBufferVPrintf ( & buffer, path_fmt, args );
+    if ( rc == 0 )
+    {
+        VPath * path = calloc ( 1, sizeof * path );
+        if ( path == NULL )
+            rc = RC ( rcVFS, rcPath, rcAllocating, rcMemory, rcExhausted );
+        else
+        {
+            /* straight copy to steal contents */
+            path -> data = buffer;
+
+            /* parse into portions */
+            rc = VPathParse ( path, buffer . base, ( size_t ) buffer . elem_count - 1 );
+            if ( rc == 0 )
+            {
+                KRefcountInit ( & path -> refcount, 1, "VPath", "make-from-text", buffer . base );
+                * ppath = path;
+                return 0;
+            }
+
+            free ( path );
+        }
+
+        KDataBufferWhack ( & buffer );
+    }
+
+    * ppath = NULL;
+
+    return rc;
+}
+
+static
+rc_t VPathMakeFromText ( VPath ** ppath, const char * text, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, text );
+
+    rc = VPathMakeFromVText ( ppath, text, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+/* MakePathWithExtension
+ *  makes a copy of original path
+ *  appends an extension to path portion of orig
+ */
+LIB_EXPORT rc_t CC VFSManagerMakePathWithExtension ( struct VFSManager const * self,
+    VPath ** new_path, const VPath * orig, const char * extension )
+{
+    rc_t rc;
+
+    if ( new_path == NULL )
+        rc = RC ( rcVFS, rcPath, rcCopying, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVFS, rcPath, rcCopying, rcSelf, rcNull );
+        else if ( orig == NULL )
+            rc = RC ( rcVFS, rcPath, rcCopying, rcParam, rcNull );
+        else if ( orig -> path_type == vpInvalid || orig -> path_type > vpEndpoint )
+            rc = RC ( rcVFS, rcPath, rcCopying, rcParam, rcInvalid );
+        else if ( orig -> path_type > vpFullPath )
+            rc = RC ( rcVFS, rcPath, rcCopying, rcParam, rcIncorrect );
+#if ALLOW_ADDREF_WITHIN_MAKEPATH
+        else if ( extension == NULL || extension [ 0 ] == 0 )
+        {
+            rc = VPathAddRef ( orig );
+            if ( rc == 0 )
+            {
+                * new_path = ( VPath * ) orig;
+                return 0;
+            }
+        }
+#endif
+        else
+        {
+            char path_prefix [ 4096 ];
+            size_t num_writ, total = 0;
+
+            rc = 0;
+
+#if ! ALLOW_ADDREF_WITHIN_MAKEPATH
+            if ( extension == NULL )
+                extension = "";
+#endif
+
+            /* add in original scheme */
+            if ( orig -> from_uri && orig -> scheme . size != 0 )
+            {
+                rc = string_printf ( & path_prefix [ total ], sizeof path_prefix - total,
+                    & num_writ, "%S://", & orig -> scheme );
+                if ( rc == 0 )
+                    total += num_writ;
+
+                /* if there's a host spec of some sort */
+                if ( rc == 0 && orig -> host . size != 0 )
+                {
+                    /* add in original auth */
+                    if ( orig -> auth . size != 0 )
+                    {
+                        rc = string_printf ( & path_prefix [ total ], sizeof path_prefix - total,
+                            & num_writ, "%S@", & orig -> auth );
+                        if ( rc == 0 )
+                            total += num_writ;
+                    }
+
+                    /* add in host */
+                    if ( rc == 0 )
+                    {
+                        rc = string_printf ( & path_prefix [ total ], sizeof path_prefix - total,
+                            & num_writ, "%S", & orig -> host );
+                        if ( rc == 0 )
+                            total += num_writ;
+                    }
+
+                    /* add in port */
+                    if ( rc == 0 )
+                    {
+                        num_writ = 0;
+                        if ( orig -> portname . size != 0 )
+                        {
+                            rc = string_printf ( & path_prefix [ total ], sizeof path_prefix - total,
+                                & num_writ, ":%S", & orig -> portname );
+                        }
+                        else if ( orig -> portnum != 0 )
+                        {
+                            rc = string_printf ( & path_prefix [ total ], sizeof path_prefix - total,
+                                & num_writ, ":%u", orig -> portnum );
+                        }
+                        else if ( orig -> missing_port )
+                        {
+                            rc = string_printf ( & path_prefix [ total ], sizeof path_prefix - total,
+                                & num_writ, ":" );
+                        }
+                        if ( rc == 0 )
+                            total += num_writ;
+                    }
+                }
+            }
+
+            if ( rc == 0 )
+            {
+                /* copy orig */
+                switch ( orig -> path_type )
+                {
+                case vpOID:
+
+                    if ( total != 0 )
+                    {
+                        rc = VPathMakeFromText ( new_path
+                                                 , "%.*s/%u%s%S%S"
+                                                 , ( uint32_t ) total, path_prefix
+                                                 , orig -> obj_id
+                                                 , extension
+                                                 , & orig -> query
+                                                 , & orig -> fragment
+                            );
+                    }
+                    else
+                    {
+                        rc = VPathMakeFromText ( new_path
+                                                 , "%u%s%S%S"
+                                                 , orig -> obj_id
+                                                 , extension
+                                                 , & orig -> query
+                                                 , & orig -> fragment
+                            );
+                    }
+                    break;
+
+                case vpAccession:
+                case vpNameOrOID:
+                case vpNameOrAccession:
+                case vpName:
+                case vpRelPath:
+                case vpUNCPath:
+
+                    /* no break */
+
+                case vpFullPath:
+
+                    assert ( orig -> path . size != 0 );
+                    if ( total != 0 )
+                    {
+                        rc = VPathMakeFromText ( new_path
+                                                 , "%.*s%S%s%S%S"
+                                                 , ( uint32_t ) total, path_prefix
+                                                 , & orig -> path
+                                                 , extension
+                                                 , & orig -> query
+                                                 , & orig -> fragment
+                            );
+                    }
+                    else
+                    {
+                        rc = VPathMakeFromText ( new_path
+                                                 , "%S%s%S%S"
+                                                 , & orig -> path
+                                                 , extension
+                                                 , & orig -> query
+                                                 , & orig -> fragment
+                            );
+                    }
+                    break;
+                }
+
+                if ( rc == 0 )
+                    return 0;
+            }
+        }
+
+        * new_path = NULL;
+    }
+
+    return rc;
+}
+
+
+/* ExtractAccessionOrOID
+ *  given an arbitrary path, possibly with extensions,
+ *  extract the portion of the leaf qualifying as an
+ *  accession or OID
+ */
+LIB_EXPORT rc_t CC VFSManagerExtractAccessionOrOID ( const VFSManager * self,
+    VPath ** acc_or_oid, const VPath * orig )
+{
+    rc_t rc;
+
+    if ( acc_or_oid == NULL )
+        rc = RC ( rcVFS, rcPath, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVFS, rcPath, rcConstructing, rcSelf, rcNull );
+        else if ( orig == NULL )
+            rc = RC ( rcVFS, rcPath, rcConstructing, rcParam, rcNull );
+        else if ( VPathIsAccessionOrOID ( orig ) )
+        {
+            rc = VPathAddRef ( orig );
+            if ( rc == 0 )
+            {
+                * acc_or_oid = ( VPath* ) orig;
+                return 0;
+            }
+        }
+        else
+        {
+            String path = orig -> path;
+            const char * sep, * start = path . addr;
+            const char * end = path . addr + path . size;
+
+            switch ( orig -> path_type )
+            {
+            case vpInvalid:
+                rc = RC ( rcVFS, rcPath, rcConstructing, rcParam, rcInvalid );
+                break;
+
+            case vpName:
+                break;
+
+            case vpRelPath:
+            case vpUNCPath:
+            case vpFullPath:
+                sep = string_rchr ( start, path . size, '/' );
+                if ( sep != NULL )
+                    start = sep + 1;
+                break;
+
+            default:
+                rc = RC ( rcVFS, rcPath, rcConstructing, rcParam, rcIncorrect );
+            }
+
+            /* strip off known extensions */
+            while ( 1 )
+            {
+                sep = string_rchr ( start, end - start, '.' );
+                if ( sep == NULL )
+                    break;
+
+                switch ( end - sep )
+                {
+                case 4:
+                    if ( strcase_cmp ( ".sra", 4, sep, 4, 4 ) == 0 ||
+                         strcase_cmp ( ".wgs", 4, sep, 4, 4 ) == 0 )
+                        end = sep;
+                    {
+                        end = sep;
+                        continue;
+                    }
+                case 9:
+                    if ( strcase_cmp ( ".vdbcache", 9, sep, 9, 9 ) == 0 ||
+                         strcase_cmp ( ".ncbi_enc", 9, sep, 9, 9 ) == 0 )
+                    {
+                        end = sep;
+                        continue;
+                    }
+                    break;
+                }
+                break;
+            }
+
+            /* create a new VPath */
+            rc = VPathMakeFromText ( acc_or_oid, "%.*s", ( uint32_t ) ( end - start ), start );
+            if ( rc == 0 )
+            {
+                const VPath * vpath = * acc_or_oid;
+                if ( VPathIsAccessionOrOID ( vpath ) )
+                    return 0;
+
+                VPathRelease ( vpath );
+
+                rc = RC ( rcVFS, rcPath, rcConstructing, rcParam, rcIncorrect );
+            }
+        }
+
+        * acc_or_oid = NULL;
+    }
+
+    return rc;
+}
+
+
+
+/* AddRef
+ * Release
+ *  ignores NULL references
+ */
+LIB_EXPORT rc_t CC VPathAddRef ( const VPath *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "VPath" ) )
+        {
+        case krefLimit:
+            return RC ( rcVFS, rcPath, rcAttaching, rcRange, rcExcessive );
+        }
+    }
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VPathRelease ( const VPath *self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "VPath" ) )
+        {
+        case krefWhack:
+            VPathWhack ( ( VPath* ) self );
+            break;
+        case krefNegative:
+            return RC ( rcVFS, rcPath, rcReleasing, rcRange, rcExcessive );
+        }
+    }
+
+    return 0;
+}
+
+
+/* IsAcessionOrOID
+ *  asks if the path pattern could possibly be an accession or oid
+ */
+LIB_EXPORT bool CC VPathIsAccessionOrOID ( const VPath * self )
+{
+    if ( self != NULL )
+    {
+        switch ( self -> path_type )
+        {
+        case vpOID:
+        case vpAccession:
+        case vpNameOrOID:
+        case vpNameOrAccession:
+            return true;
+        }
+    }
+    return false;
+}
+
+
+/* IsFSCompatible
+ *  asks if the path can be used with the OS' filesystems
+ */
+LIB_EXPORT bool CC VPathIsFSCompatible ( const VPath * self )
+{
+    if ( self != NULL )
+    {
+        switch ( self -> path_type )
+        {
+        case vpNameOrAccession:
+        case vpName:
+        case vpRelPath:
+        case vpUNCPath:
+        case vpFullPath:
+            return true;
+        }
+    }
+    return false;
+}
+
+
+/* FromUri
+ *  asks if the path was created from a formal URI
+ */
+LIB_EXPORT bool CC VPathFromUri ( const VPath * self )
+{
+    if ( self != NULL )
+        return self -> from_uri;
+    return false;
+}
+
+
+/* Read*
+ *  read the various parts
+ *  copies out data into user-supplied buffer
+ */
+static
+rc_t VPathSetInvalidReturn ( rc_t rc,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    if ( num_read != NULL )
+        * num_read = 0;
+    if ( buffer != NULL && buffer_size != 0 )
+        buffer [ 0 ] = 0;
+    return rc;
+}
+
+static
+rc_t VPathReadTestSelf ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVFS, rcPath, rcReading, rcSelf, rcNull );
+    else if ( self -> path_type == vpInvalid )
+        rc = RC ( rcVFS, rcPath, rcReading, rcSelf, rcInvalid );
+    else
+        return 0;
+
+    return VPathSetInvalidReturn ( rc, buffer, buffer_size, num_read );
+}
+
+static
+rc_t VPathReadMember ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read,
+    const String * mbr, uint32_t idx )
+{
+    rc_t rc = VPathReadTestSelf ( self, buffer, buffer_size, num_read );
+    if ( rc == 0 )
+        rc = string_printf ( buffer, buffer_size, num_read, "%:*-$S", idx, mbr );
+    return rc;
+}
+
+static
+rc_t VPathGetSchemeInt ( const VPath * self, String * scheme )
+{
+    if ( self -> scheme . size != 0 )
+        * scheme = self -> scheme;
+
+    else switch ( self -> path_type )
+    {
+    case vpOID:
+        CONST_STRING ( scheme, "ncbi-obj" );
+        break;
+    case vpAccession:
+        CONST_STRING ( scheme, "ncbi-acc" );
+        break;
+    case vpNameOrOID:
+    case vpNameOrAccession:
+    case vpName:
+    case vpRelPath:
+    case vpFullPath:
+        if ( self -> query . size != 0 || self -> fragment . size != 0 )
+            CONST_STRING ( scheme, "ncbi-file" );
+        else
+            CONST_STRING ( scheme, "file" );
+        break;
+    case vpUNCPath:
+        CONST_STRING ( scheme, "ncbi-file" );
+        break;
+    default:
+        return RC ( rcVFS, rcPath, rcReading, rcType, rcIncorrect );
+    }
+
+    return 0;
+}
+
+static
+rc_t VPathReadSchemeInt ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read,
+    const char * suffix, bool * fail )
+{
+    String scheme;
+    rc_t rc = VPathGetSchemeInt ( self, & scheme );
+    if ( rc != 0 )
+    {
+        * fail = true;
+        return rc;
+    }
+    return string_printf ( buffer, buffer_size, num_read, "%S%s", & scheme, suffix );
+}
+
+static
+rc_t VPathReadAuthInt ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read,
+    const char * prefix )
+{
+    rc_t rc = 0;
+
+    if ( self -> auth . size == 0 )
+        * num_read = 0;
+    else
+    {
+        rc = string_printf ( buffer, buffer_size, num_read,
+                             "%s%S", prefix, & self -> auth );
+    }
+
+    return rc;
+}
+
+static
+rc_t VPathReadHostInt ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read,
+    const char * prefix )
+{
+    rc_t rc = 0;
+    const char * lbrack, * rbrack;
+
+    switch ( self -> host_type )
+    {
+    case vhDNSName:
+
+        rc = string_printf ( buffer, buffer_size, num_read,
+                             "%s%S", prefix, & self -> host );
+        break;
+
+    case vhIPv4:
+
+        rc = string_printf ( buffer, buffer_size, num_read
+                             , "%s%u.%u.%u.%u"
+                             , prefix
+                             , ( self -> ipv4 >> 24 ) & 0xFF
+                             , ( self -> ipv4 >> 16 ) & 0xFF
+                             , ( self -> ipv4 >>  8 ) & 0xFF
+                             , ( self -> ipv4 >>  0 ) & 0xFF
+            );
+        break;
+
+    case vhIPv6:
+
+        lbrack = rbrack = "";
+        if ( prefix [ 0 ] != 0 )
+        {
+            lbrack = "[";
+            rbrack = "]";
+        }
+
+        rc = string_printf ( buffer, buffer_size, num_read
+                             , "%s%s%u:%u:%u:%u:%u:%u:%u:%u%s"
+                             , prefix
+                             , lbrack
+                             , self -> ipv6 [ 0 ]
+                             , self -> ipv6 [ 1 ]
+                             , self -> ipv6 [ 2 ]
+                             , self -> ipv6 [ 3 ]
+                             , self -> ipv6 [ 4 ]
+                             , self -> ipv6 [ 5 ]
+                             , self -> ipv6 [ 6 ]
+                             , self -> ipv6 [ 7 ]
+                             , rbrack
+            );
+        break;
+    }
+
+    return rc;
+}
+
+static
+rc_t VPathReadPathInt ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    rc_t rc;
+
+    /* print remainder */
+    switch ( self -> path_type )
+    {
+    case vpOID:
+            
+        rc = string_printf ( buffer, buffer_size, num_read
+                             , "%u"
+                             , self -> obj_id
+            );
+        break;
+
+    case vpAccession:
+    case vpNameOrOID:
+    case vpNameOrAccession:
+    case vpName:
+    case vpRelPath:
+    case vpUNCPath:
+    case vpFullPath:
+
+        assert ( self -> path . size != 0 );
+        rc = string_printf ( buffer, buffer_size, num_read
+                             , "%S"
+                             , & self -> path
+            );
+        break;
+
+    default:
+
+        if ( num_read != NULL )
+            * num_read = 0;
+
+        rc = 0;
+    }
+
+    return rc;
+}
+
+static
+rc_t VPathReadUriInt ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * total_read )
+{
+    rc_t rc;
+    const char * host_prefix;
+    size_t total, num_read, avail;
+    bool has_auth, has_host, fail = false;
+
+    /* print scheme plus preparation for host */
+    rc = VPathReadSchemeInt ( self, buffer, buffer_size, & num_read, ":", & fail );
+    if ( fail )
+        return VPathSetInvalidReturn ( rc, buffer, buffer_size, total_read );
+    total = num_read;
+    avail = ( rc == 0 ) ? buffer_size - total : 0;
+
+    /* print auth */
+    host_prefix = "//";
+    rc = VPathReadAuthInt ( self, & buffer [ total ], avail, & num_read, host_prefix );
+    total += num_read;
+    avail -= ( rc == 0 ) ? num_read : 0;
+    has_auth = num_read > 2;
+    if ( has_auth )
+        host_prefix = "@";
+
+    /* print host */
+    rc = VPathReadHostInt ( self, & buffer [ total ], avail, & num_read, host_prefix );
+    total += num_read;
+    avail -= ( rc == 0 ) ? num_read : 0;
+    has_host = num_read > ( 2U - has_auth );
+
+    /* print port */
+    if ( has_host )
+    {
+        if ( self -> portname . size != 0 )
+            rc = string_printf ( & buffer [ total ], avail, & num_read, ":%S", & self -> portname );
+        else if ( self -> portnum != 0 )
+            rc = string_printf ( & buffer [ total ], avail, & num_read, ":%u", self -> portnum );
+        else if ( self -> missing_port )
+            rc = string_printf ( & buffer [ total ], avail, & num_read, ":" );
+        else
+            num_read = 0;
+
+        total += num_read;
+        avail -= ( rc == 0 ) ? num_read : 0;
+    }
+
+    /* sanity check */
+    assert ( ! has_auth || has_host );
+    assert ( self -> path . size == 0 || self -> path . addr [ 0 ] == '/' || ! has_host );
+    assert ( self -> query . size == 0 || self -> query . addr [ 0 ] == '?' );
+    assert ( self -> fragment . size == 0 || self -> fragment . addr [ 0 ] == '#' );
+
+    /* print remainder */
+    switch ( self -> path_type )
+    {
+    case vpOID:
+
+        if ( ! has_host )
+        {
+            /* correct for empty host spec */
+            total -= 2;
+            avail += 2;
+        }
+
+        rc = string_printf ( & buffer [ total ], avail, & num_read
+                             , "%s%u%S%S"
+                             , has_host ? "/" : ""
+                             , self -> obj_id
+                             , & self -> query
+                             , & self -> fragment
+            );
+        break;
+
+    case vpAccession:
+    case vpNameOrOID:
+    case vpNameOrAccession:
+    case vpName:
+    case vpRelPath:
+    case vpUNCPath:
+
+        assert ( ! has_host );
+
+        /* correct for empty host spec */
+        total -= 2;
+        avail += 2;
+
+        /* no break */
+
+    case vpFullPath:
+
+        assert ( self -> path . size != 0 );
+        rc = string_printf ( & buffer [ total ], avail, & num_read
+                             , "%S%S%S"
+                             , & self -> path
+                             , & self -> query
+                             , & self -> fragment
+            );
+        break;
+    }
+
+    if ( total_read != NULL )
+        * total_read = total + num_read;
+
+    if ( rc != 0 && buffer != NULL && buffer_size != 0 )
+        buffer [ 0 ] = 0;
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathReadUri ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    rc_t rc = VPathReadTestSelf ( self, buffer, buffer_size, num_read );
+    if ( rc == 0 )
+        rc = VPathReadUriInt ( self, buffer, buffer_size, num_read );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathReadScheme ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    rc_t rc = VPathReadTestSelf ( self, buffer, buffer_size, num_read );
+    if ( rc == 0 )
+    {
+        bool fail = false;
+        rc = VPathReadSchemeInt ( self, buffer, buffer_size, num_read, "", & fail );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathReadAuth ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    rc_t rc = VPathReadTestSelf ( self, buffer, buffer_size, num_read );
+    if ( rc == 0 )
+        rc = VPathReadAuthInt ( self, buffer, buffer_size, num_read, "" );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathReadHost ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    rc_t rc = VPathReadTestSelf ( self, buffer, buffer_size, num_read );
+    if ( rc == 0 )
+        rc = VPathReadHostInt ( self, buffer, buffer_size, num_read, "" );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathReadPortName ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    return VPathReadMember ( self,
+        buffer, buffer_size, num_read,
+        & self -> portname, 0 );
+}
+
+LIB_EXPORT rc_t CC VPathReadPath ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    rc_t rc = VPathReadTestSelf ( self, buffer, buffer_size, num_read );
+    if ( rc == 0 )
+        rc = VPathReadPathInt ( self, buffer, buffer_size, num_read );
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathReadQuery ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    return VPathReadMember ( self,
+        buffer, buffer_size, num_read,
+        & self -> query, 1 );
+}
+
+static
+rc_t VPathFindParam ( const VPath * self, const char * param, String * val_str )
+{
+    rc_t rc;
+
+    if ( param == NULL )
+        rc = RC ( rcVFS, rcPath, rcReading, rcParam, rcNull );
+    else if ( param [ 0 ] == 0 )
+        rc = RC ( rcVFS, rcPath, rcReading, rcParam, rcEmpty );
+    else
+    {
+        size_t qsize = string_size ( param );
+        const char * start = self -> query . addr;
+        const char * end = start + self -> query . size;
+        if ( ++ start < end ) while ( 1 )
+        {
+            /* match as many characters as possible of param name */
+            uint32_t matching = strcase_match ( start, end - start, param, qsize, -1, NULL );
+            start += matching;
+
+            if ( ( size_t ) matching == qsize )
+            {
+                /* may have found the parameter */
+                if ( start == end || start [ 0 ] == '&' )
+                {
+                    /* no value */
+                    StringInit ( val_str, "", 0, 0 );
+                    return 0;
+                }
+
+                if ( start [ 0 ] == '=' )
+                {
+                    /* have value */
+                    const char * val = start + 1;
+                    const char * pend = string_chr ( val, end - val, '&' );
+                    if ( pend == NULL )
+                        pend = end;
+                    StringInit ( val_str, val, pend - val, string_len ( val, pend - val ) );
+                    return 0;
+                }
+            }
+
+            /* find next parameter */
+            start = string_chr ( start, end - start, '&' );
+            if ( start == NULL )
+                break;
+
+            /* skip separator */
+            ++ start;
+        }
+
+        rc = SILENT_RC ( rcVFS, rcPath, rcReading, rcParam, rcNotFound );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathReadParam ( const VPath * self, const char * param,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    rc_t rc = VPathReadTestSelf ( self, buffer, buffer_size, num_read );
+    if ( rc == 0 )
+    {
+        String val_str;
+        rc = VPathFindParam ( self, param, & val_str );
+        if ( rc == 0 )
+        {
+            /* copy out value */
+            return string_printf ( buffer, buffer_size, num_read
+                                   , "%S"
+                                   , & val_str
+                );
+        }
+
+        VPathSetInvalidReturn ( rc, buffer, buffer_size, num_read );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathReadFragment ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    return VPathReadMember ( self,
+        buffer, buffer_size, num_read,
+        & self -> fragment, 1 );
+}
+
+
+/* MakeUri
+ *  convert a VPath into a Uri
+ */
+LIB_EXPORT rc_t CC VPathMakeUri ( const VPath * self, const String ** uri )
+{
+    rc_t rc;
+
+    if ( uri == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        /* TBD - if we build the path from a URI, we should just
+           grab the text from buffer */
+        size_t bytes;
+        char buffer [ 8192 ];
+        rc = VPathReadUri ( self, buffer, sizeof buffer, & bytes );
+        if ( rc == 0 )
+        {
+            String uri_str;
+            StringInit ( & uri_str, buffer, bytes, string_len ( buffer, bytes ) );
+            return StringCopy ( uri, & uri_str );
+        }
+
+        /* TBD - if we ever have huge URIs, 8K can be insufficient */
+        * uri = NULL;
+    }
+    return rc;
+}
+
+
+/* MakeSysPath
+ *  convert a VPath into an OS-specific path string
+ */
+LIB_EXPORT rc_t CC VPathMakeSysPath ( const VPath * self, const String ** sys_path )
+{
+    rc_t rc;
+
+    if ( sys_path == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        size_t bytes;
+        char buffer [ 8192 ];
+        rc = VPathReadSysPath ( self, buffer, sizeof buffer, & bytes );
+        if ( rc == 0 )
+        {
+            String sys_str;
+            StringInit ( & sys_str, buffer, bytes, string_len ( buffer, bytes ) );
+            return StringCopy ( sys_path, & sys_str );
+        }
+
+        * sys_path = NULL;
+    }
+    return rc;
+}
+
+
+/* MakeString
+ *  convert a VPath into a String
+ *  respects original source of path,
+ *  i.e. does not add scheme unnecessarily
+ */
+LIB_EXPORT rc_t CC VPathMakeString ( const VPath * self, const String ** str )
+{
+    rc_t rc;
+
+    if ( str == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVFS, rcPath, rcAccessing, rcSelf, rcNull );
+        else
+        {
+            size_t bytes, host;
+            char buffer [ 8192 ];
+
+            if ( self -> from_uri || self -> query . size != 0 || self -> fragment . size != 0 )
+                rc = VPathReadUriInt ( self, buffer, sizeof buffer, & bytes );
+            else switch ( self -> path_type )
+            {
+            case vpHostName:
+                rc = VPathReadHostInt ( self, buffer, sizeof buffer, & bytes, "" );
+                break;
+
+            case vpEndpoint:
+                rc = VPathReadHostInt ( self, buffer, sizeof buffer, & host, "" );
+                if ( rc == 0 )
+                {
+                    if ( self -> portname . size != 0 )
+                    {
+                        rc = string_printf ( & buffer [ host ], sizeof buffer - host,
+                            & bytes, ":%S", & self -> portname );
+                    }
+                    else
+                    {
+                        rc = string_printf ( & buffer [ host ], sizeof buffer - host,
+                            & bytes, ":%u", & self -> portnum );
+                    }
+
+                    bytes += host;
+                }
+                break;
+
+            default:
+                rc = VPathReadPathInt ( self, buffer, sizeof buffer, & bytes );
+            }
+
+            if ( rc == 0 )
+            {
+                String local_str;
+                StringInit ( & local_str, buffer, bytes, string_len ( buffer, bytes ) );
+                return StringCopy ( str, & local_str );
+            }
+        }
+
+        * str = NULL;
+    }
+    return rc;
+}
+
+
+/* Get*
+ *  retrieves internal parts
+ *  returns pointers to internal String data
+ *  Strings remain valid while "self" is valid
+ */
+static
+rc_t VPathGetTestSelf ( const VPath * self )
+{
+    if ( self == NULL )
+        return RC ( rcVFS, rcPath, rcAccessing, rcSelf, rcNull );
+    if ( self -> path_type == vpInvalid )
+        return RC ( rcVFS, rcPath, rcAccessing, rcSelf, rcInvalid );
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VPathGetScheme ( const VPath * self, String * str )
+{
+    rc_t rc;
+
+    if ( str == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        rc = VPathGetTestSelf ( self );
+        if ( rc == 0 )
+        {
+            /* work harder to fill out a scheme if not there */
+            rc = VPathGetSchemeInt ( self, str );
+            if ( rc == 0 )
+                return 0;
+
+            /* if the path can't have a scheme, it's okay */
+            rc = 0;
+        }
+
+        StringInit ( str, "", 0, 0 );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathGetAuth ( const VPath * self, String * str )
+{
+    rc_t rc;
+
+    if ( str == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        rc = VPathGetTestSelf ( self );
+        if ( rc == 0 )
+        {
+            * str = self -> auth;
+            return 0;
+        }
+
+        StringInit ( str, "", 0, 0 );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathGetHost ( const VPath * self, String * str )
+{
+    rc_t rc;
+
+    if ( str == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        rc = VPathGetTestSelf ( self );
+        if ( rc == 0 )
+        {
+            * str = self -> host;
+            return 0;
+        }
+
+        StringInit ( str, "", 0, 0 );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathGetPortName ( const VPath * self, String * str )
+{
+    rc_t rc;
+
+    if ( str == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        rc = VPathGetTestSelf ( self );
+        if ( rc == 0 )
+        {
+            * str = self -> portname;
+            return 0;
+        }
+
+        StringInit ( str, "", 0, 0 );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT uint16_t CC VPathGetPortNum ( const VPath * self )
+{
+    rc_t rc = VPathGetTestSelf ( self );
+    if ( rc == 0 )
+        return self -> portnum;
+
+    return 0;
+}
+
+LIB_EXPORT rc_t CC VPathGetPath ( const VPath * self, String * str )
+{
+    rc_t rc;
+
+    if ( str == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        rc = VPathGetTestSelf ( self );
+        if ( rc == 0 )
+        {
+            * str = self -> path;
+            return 0;
+        }
+
+        StringInit ( str, "", 0, 0 );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathGetQuery ( const VPath * self, String * str )
+{
+    rc_t rc;
+
+    if ( str == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        rc = VPathGetTestSelf ( self );
+        if ( rc == 0 )
+        {
+            StringSubstr ( & self -> query, str, 1, 0 );
+            return 0;
+        }
+
+        StringInit ( str, "", 0, 0 );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathGetParam ( const VPath * self, const char * param, String * str )
+{
+    rc_t rc;
+
+    if ( str == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        rc = VPathGetTestSelf ( self );
+        if ( rc == 0 )
+        {
+            rc = VPathFindParam ( self, param, str );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        StringInit ( str, "", 0, 0 );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathGetFragment ( const VPath * self, String * str )
+{
+    rc_t rc;
+
+    if ( str == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        rc = VPathGetTestSelf ( self );
+        if ( rc == 0 )
+        {
+            /* returning a NULL String when there is no fragment */
+            StringInit ( str, NULL, 0, 0 );
+
+            StringSubstr ( & self -> fragment, str, 1, 0 );
+            return 0;
+        }
+
+        StringInit ( str, "", 0, 0 );
+    }
+
+    return rc;
+}
+
+/* TEMPORARY */
+LIB_EXPORT uint32_t CC VPathGetOid ( const VPath * self )
+{
+    if ( self != NULL )
+        return self -> obj_id;
+    return 0;
+}
+
+
+/* MarkHighReliability
+ *  mark a path as representing either a reliable URL
+ *  or one where the reliability is unknown.
+ *
+ *  a highly-reliable URL is one that should be expected
+ *  to work. this property makes errors more suspicious,
+ *  and more likely to be temporary, leading to harder work
+ *  within the networking module.
+ *
+ *  "high_reliability" [ IN ] - set to true for high reliability
+ */
+LIB_EXPORT rc_t CC VPathMarkHighReliability ( VPath * self, bool high_reliability )
+{
+    rc_t rc;
+
+    if ( self == NULL )
+        rc = RC ( rcVFS, rcPath, rcUpdating, rcSelf, rcNull );
+    else
+    {
+        self -> highly_reliable = high_reliability;
+        rc = 0;
+    }
+    return rc;
+}
+
+/* IsHighlyReliable
+ *  returns "true" if the path represents a high-reliability URL
+ */
+LIB_EXPORT bool CC VPathIsHighlyReliable ( const VPath * self )
+{
+    return self != NULL && self -> highly_reliable;
+}
+
+
+/*--------------------------------------------------------------------------
+ * VFSManager
+ */
+
+
+/* MakePath
+ *  make a path object from a string conforming to
+ *  either a standard POSIX path or a URI
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "path_str" [ IN ] - a UTF-8 NUL-terminated string
+ *  representing a POSIX path or URI, or
+ *  a string_printf compatible format string
+ *
+ *  "path_fmt" [ IN ] and "args" [ IN ] - a UTF-8 NUL-terminated fmt string
+ *  compatible with string_vprintf, plus argument list
+ */
+LIB_EXPORT rc_t CC VFSManagerVMakePath ( const VFSManager * self,
+    VPath ** new_path, const char * path_fmt, va_list args )
+{
+    rc_t rc;
+
+    if ( new_path == NULL )
+        rc = RC ( rcVFS, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVFS, rcMgr, rcConstructing, rcSelf, rcNull );
+        else if ( path_fmt == NULL )
+            rc = RC ( rcVFS, rcMgr, rcConstructing, rcPath, rcNull );
+        else if ( path_fmt [ 0 ] == 0 )
+            rc = RC ( rcVFS, rcMgr, rcConstructing, rcPath, rcEmpty );
+        else
+        {
+            rc = VPathMakeFromVText ( new_path, path_fmt, args );
+            if ( rc == 0 )
+            {
+                VPath * path = * new_path;
+
+                if ( ! path -> from_uri )
+                {
+                    String scheme;
+                    rc = VPathGetSchemeInt ( path, & scheme );
+                    if ( rc == 0 )
+                        path -> scheme = scheme;
+                }
+
+                return 0;
+            }
+        }
+
+        * new_path = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VFSManagerMakePath ( const VFSManager * self,
+    VPath ** new_path, const char * path_str, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, path_str );
+
+    rc = VFSManagerVMakePath ( self, new_path, path_str, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+/* MakeAccPath - TEMPORARY
+ *  takes a textual accession representation
+ *  creates a VPath representing an accession
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "acc" [ IN ] - a NUL-terminated ASCII fmt string
+ */
+LIB_EXPORT rc_t CC VFSManagerVMakeAccPath ( const VFSManager * self,
+    VPath ** new_path, const char * fmt, va_list args )
+{
+    rc_t rc = VFSManagerVMakePath ( self, new_path, fmt, args );
+    if ( rc == 0 )
+    {
+        VPath * path = * new_path;
+        switch ( path -> path_type )
+        {
+        case vpAccession:
+            break;
+        case vpNameOrAccession:
+            path -> path_type = vpAccession;
+            break;
+        default:
+            VPathRelease ( path );
+            * new_path = NULL;
+            return RC ( rcVFS, rcMgr, rcConstructing, rcToken, rcIncorrect );
+        }
+
+        if ( path -> scheme . size == 0 )
+            VPathCaptureScheme ( path, "ncbi-acc", 0, 8 );
+    }
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VFSManagerMakeAccPath ( const VFSManager * self,
+    VPath ** new_path, const char * acc, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, acc );
+
+    rc = VFSManagerVMakeAccPath ( self, new_path, acc, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+
+/* MakeOidPath - TEMPORARY
+ *  takes an integer oid
+ *  creates a VPath representing an obj-id
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "oid" [ IN ] - a non-zero object id
+ */
+LIB_EXPORT rc_t CC VFSManagerMakeOidPath ( const VFSManager * self,
+    VPath ** new_path, uint32_t oid )
+{
+    char oid_str [ 32 ];
+    rc_t rc = string_printf ( oid_str, sizeof oid_str, NULL, "%u", oid );
+    assert ( rc == 0 );
+
+    rc = VFSManagerMakePath ( self, new_path, "%s", oid_str );
+    if ( rc == 0 )
+    {
+        VPath * path = * new_path;
+        switch ( path -> path_type )
+        {
+        case vpInvalid:
+        case vpNameOrAccession:
+        case vpName:
+            break;
+        default:
+            VPathRelease ( path );
+            * new_path = NULL;
+            return RC ( rcVFS, rcMgr, rcConstructing, rcToken, rcIncorrect );
+        }
+
+        VPathCaptureScheme ( path, "ncbi-obj", 0, 8 );
+        path -> obj_id = oid;
+        path -> path_type = vpOID;
+    }
+    return rc;
+}
+
+
+/* ==========================================
+             HACK O' MATIC
+ */
+
+#include <vfs/path-priv.h>
+#include <vfs/manager-priv.h>
+#include <kfs/directory.h>
+
+/* MakeDirectoryRelative
+ *  apparently the idea was to interpret "posix_path" against
+ *  "dir" to come up with a stand-alone path that could be used
+ *  without "dir" in the future. this is a total misunderstanding
+ *  of the filesystem.
+ *
+ *  the old code would call create system path from the posix_path,
+ *  which seems to make little sense on Windows... then it would
+ *  decide whether "posix_path" was standalone or directory relative.
+ */
+static
+rc_t LegacyVPathResolveAccession ( VPath ** new_path, const VPath * path )
+{
+    rc_t rc;
+    VFSManager * mgr;
+
+    * new_path = NULL;
+
+    rc = VFSManagerMake ( & mgr );
+    if ( rc == 0 )
+    {
+        VResolver * resolver;
+        rc = VFSManagerGetResolver ( mgr, & resolver );
+        if ( rc == 0 )
+        {
+            rc = VResolverLocal ( resolver, path, ( const VPath** ) new_path );
+            if ( GetRCState ( rc ) == rcNotFound )
+                rc = VResolverRemote ( resolver, 0, path, ( const VPath** ) new_path );
+
+            VResolverRelease ( resolver );
+        }
+
+        VFSManagerRelease ( mgr );
+    }
+
+    return rc;
+}
+
+static
+rc_t LegacyVPathMakeKDirRelative ( VPath ** new_path, const KDirectory * dir, const VPath * path )
+{
+    /* resolve the provided path against directory */
+    char resolved [ 4096 ];
+    rc_t rc = KDirectoryResolvePath ( dir, true, resolved, sizeof resolved,
+        "%.*s", ( uint32_t ) path -> path . size, path -> path . addr );
+    if ( rc == 0 )
+    {
+        /* re-evaluate, adding in any query and fragment */
+        rc = VPathMakeFromText ( new_path, "%s%S%S", resolved, & path -> query, & path -> fragment );
+        if ( rc == 0 )
+        {
+            VPath * relpath = * new_path;
+
+            /* reassess the scheme */
+            String scheme;
+            rc = VPathGetSchemeInt ( relpath, & scheme );
+            if ( rc == 0 )
+                relpath -> scheme = scheme;
+
+            return 0;
+        }
+    }
+
+    * new_path = NULL;
+    return rc;
+}
+
+LIB_EXPORT rc_t CC LegacyVPathMakeDirectoryRelative ( VPath ** new_path,
+    const KDirectory * dir, const char * posix_path )
+{
+    rc_t rc;
+
+    if ( new_path == NULL )
+        rc = RC ( rcVFS, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( dir == NULL )
+            rc = RC ( rcVFS, rcMgr, rcResolving, rcDirectory, rcNull );
+        else
+        {
+            /* first, try to get a VPath from "posix_path" */
+            rc = LegacyVPathMakeFmt ( new_path, posix_path );
+            if ( rc == 0 )
+            {
+                VPath * path = * new_path;
+
+                /* now try to interpret the thing */
+                if ( path -> from_uri )
+                {
+                    /* look at scheme */
+                    switch ( LegacyVPathGetUri_t ( path ) )
+                    {
+                    case vpuri_ncbi_acc:
+                    case vpuri_ncbi_obj:
+                    case vpuri_ncbi_legrefseq:
+                        /* try to resolve using VResolver */
+                        rc = LegacyVPathResolveAccession ( new_path, path );
+                        break;
+
+                    case vpuri_ncbi_vfs:
+                    case vpuri_file:
+                        /* test for full path */
+                        if ( path -> path_type == vpFullPath || path -> path_type == vpUNCPath )
+                            return 0;
+
+                        /* interpret relative to given directory */
+                        rc = LegacyVPathMakeKDirRelative ( new_path, dir, path );
+                        break;
+
+                    case vpuri_http:
+                    case vpuri_https:
+                    case vpuri_ftp:
+                    case vpuri_fasp:
+                        /* calling code would know how to handle these */
+                        return 0;
+
+                    default:
+                        /* while apparently valid URIs, callers would not know */
+                        * new_path = NULL;
+                    }
+                }
+
+                else
+                {
+                    /* look at deduced path type */
+                    switch ( path -> path_type )
+                    {
+                    case vpOID:
+                    case vpAccession: /* this is not expected not be set... */
+                    case vpNameOrOID:
+                    case vpNameOrAccession:
+                        /* try to resolve using VResolver */
+                        rc = LegacyVPathResolveAccession ( new_path, path );
+                        if ( rc == 0 )
+                            break;
+
+                        /* no break */
+
+                    case vpName:
+                    case vpRelPath:
+                        rc = LegacyVPathMakeKDirRelative ( new_path, dir, path );
+                        break;
+
+                    case vpUNCPath:
+                    case vpFullPath:
+                        return 0;
+
+                    default:
+                        * new_path = NULL;
+                    }
+                }
+
+                /* clean up path */
+                assert ( * new_path != path );
+                VPathRelease ( path );
+                return rc;
+            }
+        }
+
+        * new_path = NULL;
+    }
+
+    return rc;
+}
+
+
+/* Option
+ *  rc == 0 if the option has been specified
+ *  for options with a parameter, the value of the parameter is copied to buffer
+ */
+LIB_EXPORT rc_t CC VPathOption ( const VPath * self, VPOption_t option,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    rc_t rc = VPathReadTestSelf ( self, buffer, buffer_size, num_read );
+    if ( rc == 0 )
+    {
+        const char * param1, * param2 = NULL;
+
+        switch ( option )
+        {
+        case vpopt_encrypted:
+            param1 = "enc";
+            param2 = "encrypt";
+            break;
+        case vpopt_pwpath:
+            param1 = "pwfile";
+            break;
+        case vpopt_pwfd:
+            param1 = "pwfile";
+            break;
+        case vpopt_readgroup:
+            param1 = "readgroup";
+            break;
+#if 0            
+        case vpopt_temporary_pw_hack:
+            param1 = "temporary_pw_hack";
+            break;
+#endif            
+        case vpopt_vdb_ctx:
+            param1 = "vdb-ctx";
+            break;
+        case vpopt_gap_ticket: 
+            param1 = "tic";
+            break;
+        default:
+            return RC ( rcVFS, rcPath, rcReading, rcToken, rcUnrecognized );
+        }
+
+        rc = VPathReadParam ( self, param1, buffer, buffer_size, num_read );
+        if ( param2 != NULL && GetRCState ( rc ) == rcNotFound )
+            rc = VPathReadParam ( self, param2, buffer, buffer_size, num_read );
+    }
+    return rc;
+}
+
+
+LIB_EXPORT rc_t LegacyVPathMake ( VPath ** new_path, const char * posix_path )
+{
+    return LegacyVPathMakeFmt ( new_path, posix_path );
+}
+
+rc_t LegacyVPathMakeFmt ( VPath ** new_path, const char * fmt, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, fmt );
+
+    rc = LegacyVPathMakeVFmt ( new_path, fmt, args );
+
+    va_end ( args );
+
+    return rc;
+}
+
+rc_t LegacyVPathMakeVFmt ( VPath ** new_path, const char * fmt, va_list args )
+{
+    rc_t rc;
+
+    if ( new_path == NULL )
+        rc = RC ( rcVFS, rcPath, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( fmt == NULL )
+            rc = RC ( rcVFS, rcPath, rcConstructing, rcParam, rcNull );
+        else if ( fmt [ 0 ] == 0 )
+            rc = RC ( rcVFS, rcPath, rcConstructing, rcParam, rcEmpty );
+        else
+        {
+            rc = VPathMakeFromVText ( new_path, fmt, args );
+            if ( rc == 0 )
+            {
+                VPath * path = * new_path;
+
+                if ( ! path -> from_uri )
+                {
+                    String scheme;
+                    rc = VPathGetSchemeInt ( path, & scheme );
+                    if ( rc == 0 )
+                        path -> scheme = scheme;
+                }
+
+                return 0;
+            }
+        }
+
+        * new_path = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC LegacyVPathGetScheme_t ( const VPath * self, VPUri_t * uri_type )
+{
+    rc_t rc = 0;
+
+    if ( uri_type == NULL )
+        rc = RC ( rcVFS, rcPath, rcAccessing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVFS, rcPath, rcAccessing, rcSelf, rcNull );
+        else if ( self -> path_type != vpInvalid )
+        {
+            if ( ! self -> from_uri )
+            {
+                * uri_type = vpuri_none;
+                return 0;
+            }
+
+            * uri_type = self -> scheme_type;
+            return 0;
+        }
+
+        /* object was invalid */
+        * uri_type = vpuri_invalid;
+    }
+
+    return rc;
+}
+
+VPUri_t LegacyVPathGetUri_t ( const VPath * self )
+{
+    VPUri_t uri_type;
+    LegacyVPathGetScheme_t ( self, & uri_type );
+    return uri_type;
+}
diff --git a/libs/vfs/resolver-3.0.c b/libs/vfs/resolver-3.0.c
new file mode 100644
index 0000000..3ac3ff7
--- /dev/null
+++ b/libs/vfs/resolver-3.0.c
@@ -0,0 +1,326 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * =============================================================================
+ */
+
+#include "path-priv.h" /* VPathMakeFmt */
+#include "resolver-priv.h" /* rcResolver */
+
+#include <klib/log.h> /* klogInt */
+#include <klib/rc.h> /* RC */
+#include <klib/text.h> /* string_chr */
+
+#include <vfs/path.h> /* VPathMakeFmt */
+
+static rc_t _GetAny(const rc_t *rc, const char **start,
+    const char *end, String *s, bool last)
+{
+    assert(rc && start);
+
+    if (*rc != 0) {
+        return *rc;
+    }
+
+    if (!last) {
+        const char *sep = string_chr ( *start, end - *start, '|' );
+        if ( sep == NULL ) {
+            return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+        }
+
+        StringInit(s, *start, sep - *start, ( uint32_t ) ( sep - *start ));
+
+        *start = sep + 1;
+    }
+    else {
+        const char *sep = NULL;
+        for ( sep = end; sep > *start; -- sep ) {
+            switch ( sep [ -1 ] ) {
+                case '\n':
+                case '\r':
+                    continue;
+                default:
+                    break;
+            }
+            break;
+        }
+
+        StringInit ( s, *start, sep - *start, ( uint32_t ) ( sep - *start ) );
+    }
+
+    return 0;
+}
+
+static rc_t _Get(const rc_t *rc, const char **start,
+    const char *end, String *s)
+{
+    return _GetAny(rc, start, end, s, false);
+}
+
+static rc_t _GetLast(const rc_t *rc, const char **start,
+    const char *end, String *s)
+{
+    return _GetAny(rc, start, end, s, true);
+}
+
+typedef enum {
+    eBadObjectType,
+    eDbgap,
+    eProvisional,
+    eSrapub, /* eSra_run, */
+    eSrapub_files,
+    eSragap, /* eSra_run, */
+    eSra_source,
+    eSra_addon,
+    eRefseq,
+    eWgs,
+    eNa,
+} EObjectType;
+EObjectType _StringToObjectType(const String *self) {
+    if (self->size == 0) {
+        return eBadObjectType;
+    }
+    else {
+        String dbgap;
+        String provisional;
+        String srapub;
+        String srapub_files;
+        String sragap;
+        String sra_source;
+        String sra_addon;
+        String refseq;
+        String wgs;
+        String na;
+        CONST_STRING(&dbgap, "dbgap");
+        CONST_STRING(&provisional, "provisional");
+        CONST_STRING(&srapub, "srapub");
+        CONST_STRING(&srapub_files, "srapub_files");
+        CONST_STRING(&sragap, "sragap");
+        CONST_STRING(&sra_source, "sra-source");
+        CONST_STRING(&sra_addon, "sra-addon");
+        CONST_STRING(&refseq, "refseq");
+        CONST_STRING(&wgs, "wgs");
+        CONST_STRING(&na, "na");
+        if (StringEqual(self, &dbgap)) {
+            return eDbgap;
+        }
+        else if (StringEqual(self, &provisional)) {
+            return eProvisional;
+        }
+        else if (StringEqual(self, &srapub)) {
+            return eSrapub;
+        }
+        else if (StringEqual(self, &srapub_files)) {
+            return eSrapub_files;
+        }
+        else if (StringEqual(self, &sragap)) {
+            return eSragap;
+        }
+        else if (StringEqual(self, &sra_source)) {
+            return eSra_source;
+        }
+        else if (StringEqual(self, &sra_addon)) {
+            return eSra_addon;
+        }
+        else if (StringEqual(self, &refseq)) {
+            return eRefseq;
+        }
+        else if (StringEqual(self, &wgs)) {
+            return eWgs;
+        }
+        else if (StringEqual(self, &na)) {
+            return eNa;
+        }
+        else {
+            return eBadObjectType;
+        }
+    }
+}
+
+static rc_t _ProcessCode(EObjectType objectType, const String *object_id,
+    const String *code, const String *download_ticket,
+    const String *url, const String *message, const VPath **path,
+    const VPath **mapping, const String *acc, const String *ticket)
+{
+    rc_t rc = 0;
+    KLogLevel lvl = 0;
+    uint32_t result_code = 0;
+    char *rslt_end = NULL;
+    assert(objectType && object_id && code && download_ticket && url);
+    if (code->size == 0)
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    result_code = strtoul ( code -> addr, & rslt_end, 10 );
+    if ( ( const char* ) rslt_end - code -> addr != code -> size )
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    switch ( result_code / 100 ) {
+        case 2: /* successful response but can only handle 200 */
+            if ( result_code == 200 ) { /* normal public response */
+                if (download_ticket->size == 0) {
+                    rc = VPathMakeFmt ( ( VPath** ) path, "%S", url );
+                }
+                else { /* protected response */
+                    rc = VPathMakeFmt
+                        ((VPath**) path, "%S?tic=%S", url, download_ticket);
+                }
+                if ( rc == 0 ) {
+                    rc = VPathCheckFromNamesCGI ( * path, ticket, mapping );
+                    if ( rc == 0 ) {
+                        if ( mapping == NULL )
+                            return 0;
+                        if (download_ticket->size != 0) {
+                            if (object_id->size != 0 && objectType == eSragap) {
+                                rc = VPathMakeFmt ( ( VPath** ) mapping,
+                                    "ncbi-acc:%S?tic=%S",
+                                    object_id, download_ticket);
+                            }
+                            else {
+                                if (object_id->size == 0)
+                                    return 0;
+                                else
+                                    rc = VPathMakeFmt ( ( VPath** ) mapping,
+                                        "ncbi-file:%S?tic=%S",
+                                        object_id, download_ticket);
+                            }
+                        }
+                        else if (object_id->size != 0 && objectType == eSrapub)
+                        {
+                            rc = VPathMakeFmt ( ( VPath** ) mapping,
+                                "ncbi-acc:%S", object_id );
+                        }
+                        else {
+                            if (object_id->size == 0)
+                                return 0;
+                            else
+                                rc = VPathMakeFmt ( ( VPath** ) mapping,
+                                    "ncbi-file:%S", object_id );
+                        }
+                        if ( rc == 0 )
+                            return 0;
+                    }
+                    VPathRelease ( * path );
+                    * path = NULL;
+                }
+                return rc;
+            }
+            lvl = klogInt;
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+            break;
+        case 4: /* client error */
+            lvl = klogErr;
+            switch (result_code) {
+                case 400:
+                    rc = RC(rcVFS, rcResolver, rcResolving,
+                        rcMessage, rcInvalid);
+                    break;
+                case 401:
+                case 403:
+                    rc = RC( rcVFS, rcResolver, rcResolving,
+                        rcQuery, rcUnauthorized);
+                    break;
+                case 404: /* 404|no data :
+           If it is a real response then this assession is not found.
+           What if it is a DB failure? Will be retried if configured to do so?*/
+                case 410:
+                    rc = RC( rcVFS, rcResolver, rcResolving,
+                        rcName, rcNotFound );
+                    break;
+                default:
+                    rc = RC(rcVFS, rcResolver, rcResolving,
+                        rcError, rcUnexpected);
+            }
+            break;
+        case 5: /* server error */
+            lvl = klogSys;
+            switch (result_code) {
+                case 503:
+                    rc = RC(rcVFS, rcResolver, rcResolving,
+                        rcDatabase, rcNotAvailable);
+                    break;
+                case 504:
+                    rc = RC(rcVFS, rcResolver, rcResolving,
+                        rcTimeout, rcExhausted);
+                    break;
+                default:
+                    rc = RC(rcVFS, rcResolver, rcResolving,
+                        rcError, rcUnexpected);
+            }
+            break;
+        case 1: /* informational response not much we can do here */
+        case 3: /* redirection:
+                        currently this is being handled by our request object */
+        default:
+            lvl = klogInt;
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+            break;
+    }
+    /* log message to user */
+    PLOGERR(lvl, (lvl, rc,
+        "failed to resolve accession '$(acc)' - $(msg) ( $(code) )",
+        "acc=%S,msg=%S,code=%u", acc, message, result_code));
+    return rc;
+}
+
+rc_t VResolverAlgParseResolverCGIResponse_3_0(const char *astart,
+    size_t asize, const VPath **path, const VPath **mapping,
+    const String *acc, const String *ticket)
+{
+    const char *start = astart;
+    const char *end = start + asize;
+    String object_type, object_id, size, date,
+        md5, download_ticket, url, code, message;
+    EObjectType objectType = eBadObjectType;
+    
+    rc_t rc = 0;
+    rc = _Get    (&rc, &start, end, &object_type);
+    rc = _Get    (&rc, &start, end, &object_id);
+    rc = _Get    (&rc, &start, end, &size);
+    rc = _Get    (&rc, &start, end, &date);
+    rc = _Get    (&rc, &start, end, &md5);
+    rc = _Get    (&rc, &start, end, &download_ticket);
+    rc = _Get    (&rc, &start, end, &url);
+    rc = _Get    (&rc, &start, end, &code);
+    rc = _GetLast(&rc, &start, end, &message);
+    if (rc != 0) {
+        return rc;
+    }
+
+    objectType = _StringToObjectType(&object_type);
+    if (objectType == eBadObjectType) {
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    }
+
+    /* compare acc to accession or obj_id */
+    assert(acc);
+    if ( ! StringEqual ( & object_id, acc ) && objectType != eDbgap )
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+
+    /* compare ticket
+       currently this makes sense with 1 request from a known workspace */
+    if (download_ticket.size != 0) {
+        if ( ticket == NULL || ! StringEqual ( & download_ticket, ticket ) )
+            return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    }
+
+    /* get the result code */
+    return _ProcessCode(objectType, &object_id, &code,
+        &download_ticket, &url, &message, path, mapping, acc, ticket);
+}
diff --git a/libs/vfs/resolver-priv.h b/libs/vfs/resolver-priv.h
new file mode 100644
index 0000000..c82a135
--- /dev/null
+++ b/libs/vfs/resolver-priv.h
@@ -0,0 +1,244 @@
+/*===========================================================================
+*
+*                            Public Domain Notice
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_resolver_priv_
+#define _h_resolver_priv_
+
+#ifndef _h_vfs_resolver_
+#include <vfs/resolver.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * KConfig Repository Structure
+ *  expressed in pseudo BNF:
+ *
+ *  base-config
+ *      = "repository" <category>*
+ *      ;
+ *
+ *  category
+ *      = "remote" <remote-sub-category>*
+ *      | "site" <site-sub-category>*
+ *      | "user" <user-sub-category>*
+ *      ;
+ *
+ *  remote-sub-category
+ *      = "main" <public-remote-named-repository>*
+ *      | "aux" <public-remote-named-repository>*
+ *      | "protected" <protected-remote-named-repository>*
+ *      ;
+ *
+ *  site-sub-category
+ *      = "main" <site-named-repository>*
+ *      | "aux" <site-named-repository>*
+ *      ;
+ *
+ *  user-sub-category
+ *      = "public" <public-user-named-repository>*
+ *      | "protected" ID <protected-user-named-repository>*
+ *      ;
+ *
+ *  public-remote-named-repository
+ *      = ID <public-remote-repository>
+ *      ;
+ *
+ *  protected-remote-named-repository
+ *      = ID <protected-remote-repository>
+ *      ;
+ *
+ *  site-named-repository
+ *      = ID <site-repository>
+ *      ;
+ *
+ *  public-user-named-repository
+ *      = ID <public-user-repository>
+ *      ;
+ *
+ *  protected-user-named-repository
+ *      = ID <protected-user-repository>
+ *      ;
+ *
+ *  public-remote-repository
+ *      = <public-remote-root> [ <disabled> ] <apps>*
+ *      ;
+ *
+ *  protected-remote-repository
+ *      = <protected-remote-root> [ <disabled> ] <apps>*
+ *      ;
+ *
+ *  site-repository
+ *      = <local-root> [ <disabled> ] <apps>*
+ *      ;
+ *
+ *  public-user-repository
+ *      = <local-root> [ <disabled> ] [ <cache-enabled> ] <apps>*
+ *      ;
+ *
+ *  protected-user-repository
+ *      = <local-root> <passwd> <download-ticket> [ <disabled> ] [ <cache-enabled> ] <apps>*
+ *      ;
+ *
+ *  apps
+ *      = "refseq" <app>
+ *      | "sra" <app>
+ *      | "wgs" <app>
+ *      ;
+ *
+ *  app
+ *      = [ <disabled> ] "volumes" <volume>*
+ *      ;
+ *
+ *  volume
+ *      = <expansion-alg> "=" <path-list>
+ *      ;
+ *
+ *  expansion-alg
+ *      = "flat" | "sra1000" | "sra1024" | "fuse1000" | "refseq" | ...
+ *      ;
+ *
+ *  disabled
+ *      = "disabled" "=" ( "true" | * )  # any value other than "true" is false
+ *      ;
+ *
+ *  cache-enabled
+ *      = "cache-enabled" "=" ( "true" | * )  # any value other than "true" is false
+ *      ;
+ */
+
+#define rcResolver   rcTree
+
+struct KDataBuffer;
+struct KNSManager;
+struct String;
+struct VResolverAlg;
+
+void VFSManagerSetNameResolverVersion3_0(void);
+
+rc_t VPathCheckFromNamesCGI(const struct VPath *path,
+    const struct String *ticket, const struct VPath **mapping);
+
+
+/*--------------------------------------------------------------------------
+ * VResolverAlg
+ *  represents a set of zero or more volumes
+ *  each of which is addressed using a particular expansion algorithm
+ */
+typedef enum
+{
+    appUnknown,
+    appAny,
+    appFILE,
+    appREFSEQ,
+    appSRA,
+    appWGS,
+    appNANNOT,
+    appNAKMER,
+    appSRAPileup,
+    appCount
+} VResolverAppID;
+
+typedef enum
+{
+    algCGI,
+    algFlat,
+    algSRAFlat,
+    algSRA1024,
+    algSRA1000,
+    algFUSE1000,
+    algREFSEQ,
+    algWGS2,                /* ordered to be of higher precedence than algWGS */
+    algWGS,
+    algWGSFlat,
+    algFuseWGS,
+    algSRA_NCBI,
+    algSRA_EBI,
+
+    algNANNOTFlat,
+    algNANNOT,
+    algFuseNANNOT,
+    algNAKMERFlat,
+    algNAKMER,
+    algFuseNAKMER,
+
+    algPileup_NCBI,
+    algPileup_EBI,
+    algPileup_DDBJ,
+
+    /* leave as last value */
+    algUnknown
+} VResolverAlgID;
+
+rc_t VResolverAlgMake(struct VResolverAlg **alg, const struct String *root,
+     VResolverAppID app_id, VResolverAlgID alg_id, bool protctd, bool disabled);
+
+void CC VResolverAlgWhack ( void *item, void *ignore );
+
+rc_t VResolverAlgParseResolverCGIResponse ( const struct KDataBuffer *result,
+    const struct VPath ** path, const struct VPath ** mapping,
+    const struct String *acc, const struct String *ticket );
+
+rc_t VResolverAlgParseResolverCGIResponse_3_0(const char *start,
+    size_t size, const struct VPath **path, const struct VPath **mapping,
+    const struct String *acc, const struct String *ticket);
+
+/* RemoteProtectedResolve
+ *  use NCBI CGI to resolve accession into URL
+ */
+rc_t VResolverAlgRemoteProtectedResolve( const struct VResolverAlg *self,
+    const struct KNSManager *kns, VRemoteProtocols protocols,
+    const struct String *acc, const struct VPath **path,
+    const struct VPath **mapping, bool legacy_wgs_refseq);
+
+/** get projectId ( valid for protected user repository ) */
+rc_t VResolverGetProjectId ( const VResolver * self, uint32_t * projectId );
+
+/* RemoteResolve
+ *  resolve an accession into a remote VPath or not found
+ *  may optionally open a KFile to the object in the process
+ *  of finding it
+ *
+ *  2. determine the type of accession we have, i.e. its "app"
+ *  3. search all local algorithms of app type for accession
+ *  4. return not found or new VPath
+ */
+rc_t VResolverRemoteResolve ( const VResolver *self,
+    VRemoteProtocols protocols, const struct String * accession,
+    const struct VPath ** path, const struct VPath **mapping,
+    const struct KFile ** opt_file_rtn, bool refseq_ctx, bool is_oid );
+
+
+void KConfigReadRemoteProtocols ( struct KConfig const * self, VRemoteProtocols * remote_protos );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_resolver_priv_ */
diff --git a/libs/vfs/resolver.c b/libs/vfs/resolver.c
new file mode 100644
index 0000000..a157ea3
--- /dev/null
+++ b/libs/vfs/resolver.c
@@ -0,0 +1,4876 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * =============================================================================
+ *
+ */
+
+
+#include <vfs/extern.h>
+#include "resolver-priv.h"
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <kns/http.h>
+#include <kns/kns-mgr-priv.h> /* KNSManagerMakeReliableHttpFile */
+#include <kns/manager.h>
+#include <kns/stream.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfg/repository.h>
+#include <kfg/config.h>
+
+#ifdef ERR
+#undef ERR
+#endif
+
+#include <klib/text.h>
+#include <klib/vector.h>
+#include <klib/refcount.h>
+#include <klib/namelist.h>
+#include <klib/printf.h>
+#include <klib/data-buffer.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <vfs/path-priv.h>
+#include "path-priv.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+/* to turn off CGI name resolution for
+   any refseq accessions */
+#define NO_REFSEQ_CGI 0
+
+/* to turn off CGI name resolution for
+   legacy WGS packages used by refseq */
+#define NO_LEGACY_WGS_REFSEQ_CGI NO_REFSEQ_CGI
+
+/* do not allow fragments to be returned
+   unless we are expecting them for refseq */
+#define DISALLOW_FRAGMENT NO_LEGACY_WGS_REFSEQ_CGI
+
+/* the fail-over mechanism of allowing "aux" repositories */
+#define ALLOW_AUX_REPOSITORIES 0
+
+#define NAME_SERVICE_MAJ_VERS_ 1
+#define NAME_SERVICE_MIN_VERS_ 2
+#define ONE_DOT_ONE 0x01010000
+static uint32_t NAME_SERVICE_MAJ_VERS = NAME_SERVICE_MAJ_VERS_;
+static uint32_t NAME_SERVICE_MIN_VERS = NAME_SERVICE_MIN_VERS_;
+static uint32_t NAME_SERVICE_VERS
+    = NAME_SERVICE_MAJ_VERS_ << 24 | NAME_SERVICE_MIN_VERS_ << 16;
+
+static void VFSManagerSetNameResolverVersion(uint32_t maj, uint32_t min) {
+    NAME_SERVICE_MAJ_VERS = maj;
+    NAME_SERVICE_MIN_VERS = min;
+    NAME_SERVICE_VERS
+        = NAME_SERVICE_MAJ_VERS_ << 24 | NAME_SERVICE_MIN_VERS_ << 16;
+}
+void VFSManagerSetNameResolverVersion3_0(void)
+{   VFSManagerSetNameResolverVersion(3, 0); }
+
+/*--------------------------------------------------------------------------
+ * String
+ */
+static
+void CC string_whack ( void *obj, void *ignore )
+{
+    StringWhack ( ( String* ) obj );
+}
+
+/*--------------------------------------------------------------------------
+ * VResolverAccToken
+ *  breaks up an accession into parts
+ *
+ *  "acc" is entire accession as given
+ *
+ *  the remainder is divided like so:
+ *
+ *    [<prefix>_]<alpha><digits>[.<ext1>[.<ext2>]]
+ *
+ *  prefix is optional
+ *  alpha can be zero length iff prefix is not zero length
+ *  digits must be non-zero length
+ *  ext1 and ext2 are optional
+ */
+typedef struct VResolverAccToken VResolverAccToken;
+struct VResolverAccToken
+{
+    String acc;
+    String prefix;
+    String alpha;
+    String digits;
+    String ext1;
+    String ext2;
+    String suffix;
+};
+
+static
+void VResolverAccTokenInitFromOID ( VResolverAccToken *t, const String *acc )
+{
+    CONST_STRING ( & t -> prefix, "" );
+    t -> alpha = t -> prefix;
+    t -> acc = t -> digits = * acc;
+    t -> ext1 = t -> ext2 = t -> prefix;
+    t -> suffix = t -> prefix;
+}
+
+/*--------------------------------------------------------------------------
+ * VResolverAlg
+ *  represents a set of zero or more volumes
+ *  each of which is addressed using a particular expansion algorithm
+ */
+typedef struct VResolverAlg VResolverAlg;
+struct VResolverAlg
+{
+    /* volume paths - stored as String* */
+    Vector vols;
+
+    /* root path - borrowed reference */
+    const String *root;
+
+    /* download ticket - borrowed reference
+       non-NULL means that the root is a
+       resolver CGI. also, don't rely on
+       presence of any volumes... */
+    const String *ticket;
+
+    /* app_id helps to filter out volumes by app */
+    VResolverAppID app_id;
+
+    /* how to expand an accession */
+    VResolverAlgID alg_id;
+
+    /* a property of the repository */
+    bool protected;
+
+    /* whether the volumes are cache-capable
+       in particular, enabled if cache forced */
+    bool cache_capable;
+
+    /* whether the volumes are cache-enabled */
+    bool cache_enabled;
+
+    /* whether the volume is disabled in config */
+    bool disabled;
+#if 0
+    VRemoteProtocols protocols;
+#endif
+};
+
+
+/* Whack
+ */
+void CC VResolverAlgWhack ( void *item, void *ignore )
+{
+    VResolverAlg *self = item;
+
+    /* drop any volumes */
+    VectorWhack ( & self -> vols, string_whack, NULL );
+
+    /* everything else is a borrowed reference */
+
+    free ( self );
+}
+
+/* Make
+ */
+rc_t VResolverAlgMake ( VResolverAlg **algp, const String *root,
+     VResolverAppID app_id, VResolverAlgID alg_id, bool protected, bool disabled )
+{
+    rc_t rc;
+    VResolverAlg *alg = calloc ( 1, sizeof * alg );
+    if ( alg == NULL )
+        rc = RC ( rcVFS, rcMgr, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        VectorInit ( & alg -> vols, 0, 8 );
+        alg -> root = root;
+        alg -> app_id = app_id;
+        alg -> alg_id = alg_id;
+        alg -> protected = protected;
+        alg -> disabled = disabled;
+        rc = 0;
+    }
+
+    assert ( algp != NULL );
+    * algp = alg;
+    return rc;
+}
+
+static
+int64_t CC VResolverAlgSort ( const void ** a, const void ** b, void * ignore )
+{
+    const VResolverAlg * aa = * a;
+    const VResolverAlg * ab = * b;
+
+    /* second key is algorithm id */
+    return ( int64_t ) aa -> alg_id - ( int64_t ) ab -> alg_id;
+}
+
+/* MakeLocalWGSRefseqURI
+ *  create a special URI that tells KDB how to open this
+ *  obscured table, hidden away within a KAR file
+ */
+static
+rc_t VResolverAlgMakeLocalWGSRefseqURI ( const VResolverAlg *self,
+    const String *vol, const String *exp, const String *acc, const VPath ** path )
+{
+    if ( self -> root == NULL )
+        return VPathMakeFmt ( ( VPath** ) path, NCBI_FILE_SCHEME ":%S/%S#tbl/%S", vol, exp, acc );
+    return VPathMakeFmt ( ( VPath** ) path, NCBI_FILE_SCHEME ":%S/%S/%S#tbl/%S", self -> root, vol, exp, acc );
+}
+
+/* MakeRemoteWGSRefseqURI
+ *  create a special URI that tells KDB how to open this
+ *  obscured table, hidden away within a KAR file
+ */
+static
+rc_t VResolverAlgMakeRemoteWGSRefseqURI ( const VResolverAlg *self,
+    const char *url, const String *acc, const VPath ** path )
+{
+    return VPathMakeFmt ( ( VPath** ) path, "%s#tbl/%S", url, acc );
+}
+
+/* MakeRemotePath
+ *  the path is known to exist in the remote file system
+ *  turn it into a VPath
+ */
+static
+rc_t VResolverAlgMakeRemotePath ( const VResolverAlg *self,
+    const char *url, const VPath ** path )
+{
+    return VPathMakeFmt ( ( VPath** ) path, "%s", url );
+}
+
+/* MakeLocalPath
+ *  the path is known to exist in the local file system
+ *  turn it into a VPath
+ */
+static
+rc_t VResolverAlgMakeLocalPath ( const VResolverAlg *self,
+    const String *vol, const String *exp, const VPath ** path )
+{
+    if ( self -> root == NULL )
+        return VPathMakeFmt ( ( VPath** ) path, "%S/%S", vol, exp );
+    return VPathMakeFmt ( ( VPath** ) path, "%S/%S/%S", self -> root, vol, exp );
+}
+
+/* MakeLocalFilePath
+ *  the path is known to exist in the local file system
+ *  turn it into a VPath
+ */
+static
+rc_t VResolverAlgMakeLocalFilePath ( const VResolverAlg *self,
+    const String *vol, const String *exp, const char *krypto_ext, const VPath ** path )
+{
+    if ( self -> root == NULL )
+        return VPathMakeFmt ( ( VPath** ) path, "%S/%S%s", vol, exp, krypto_ext );
+    return VPathMakeFmt ( ( VPath** ) path, "%S/%S/%S%s", self -> root, vol, exp, krypto_ext );
+}
+
+/* expand_accession
+ *  expand accession according to algorithm
+ */
+static
+rc_t expand_algorithm ( const VResolverAlg *self, const VResolverAccToken *tok,
+    char *expanded, size_t bsize, size_t *size, bool legacy_wgs_refseq )
+{
+    rc_t rc;
+    uint32_t num;
+
+   switch ( self -> alg_id )
+    {
+    case algCGI:
+        return RC ( rcVFS, rcResolver, rcResolving, rcType, rcIncorrect );
+    case algFlat:
+        rc = string_printf ( expanded, bsize, size, "%S", & tok -> acc );
+        break;
+    case algSRAFlat:
+        rc = string_printf ( expanded, bsize, size,
+            "%S%S.sra", & tok -> alpha, & tok -> digits );
+        break;
+    case algSRA1024:
+        num = ( uint32_t ) strtoul ( tok -> digits . addr, NULL, 10 );
+        rc = string_printf ( expanded, bsize, size,
+            "%S/%06u/%S%S.sra", & tok -> alpha, num >> 10, & tok -> alpha, & tok -> digits );
+        break;
+    case algSRA1000:
+        num = ( uint32_t ) ( tok -> alpha . size + tok -> digits . size - 3 );
+        rc = string_printf ( expanded, bsize, size,
+            "%S/%.*S/%S%S.sra", & tok -> alpha, num, & tok -> acc, & tok -> alpha, & tok -> digits );
+        break;
+    case algFUSE1000:
+        num = ( uint32_t ) ( tok -> alpha . size + tok -> digits . size - 3 );
+        rc = string_printf ( expanded, bsize, size,
+            "%S/%.*S/%S%S/%S%S.sra", & tok -> alpha, num, & tok -> acc, 
+            & tok -> alpha, & tok -> digits, & tok -> alpha, & tok -> digits );
+        break;
+    case algREFSEQ:
+        if ( ! legacy_wgs_refseq )
+            rc = string_printf ( expanded, bsize, size, "%S", & tok -> acc );
+        else
+            rc = string_printf ( expanded, bsize, size, "%S%.2S", & tok -> alpha, & tok -> digits );
+        break;
+    case algWGSFlat:
+        num = ( uint32_t ) ( tok -> alpha . size + 2 );
+        if ( tok -> prefix . size != 0 )
+            num += (uint32_t) ( tok -> prefix . size + 1 );
+        rc = string_printf ( expanded, bsize, size,
+            "%.*S", num, & tok -> acc );
+        break;
+    case algWGS2:
+    case algWGS:
+        num = ( uint32_t ) ( tok -> alpha . size + 2 );
+        if ( tok -> prefix . size != 0 )
+            num += (uint32_t) ( tok -> prefix . size + 1 );
+        if ( tok -> ext1 . size == 0 )
+        {
+            rc = string_printf ( expanded, bsize, size,
+                "WGS/%.2s/%.2s/%.*S", tok -> alpha . addr, tok -> alpha . addr + 2, num, & tok -> acc );
+        }
+        else
+        {
+            rc = string_printf ( expanded, bsize, size,
+                "WGS/%.2s/%.2s/%.*S.%S", tok -> alpha . addr, tok -> alpha . addr + 2, num, & tok -> acc, & tok -> ext1 );
+        }
+        break;
+    case algFuseWGS:
+        num = ( uint32_t ) ( tok -> alpha . size + 2 );
+        if ( tok -> prefix . size != 0 )
+            num += (uint32_t) ( tok -> prefix . size + 1 );
+        rc = string_printf ( expanded, bsize, size,
+            "%.2s/%.2s/%.*S", tok -> alpha . addr, tok -> alpha . addr + 2, num, & tok -> acc );
+        break;
+    case algSRA_NCBI:
+        num = ( uint32_t ) strtoul ( tok -> digits . addr, NULL, 10 );
+        rc = string_printf ( expanded, bsize, size,
+            "%S/%06u/%S%S", & tok -> alpha, num >> 10, & tok -> alpha, & tok -> digits );
+        break;
+    case algSRA_EBI:
+        num = ( uint32_t ) ( tok -> alpha . size + tok -> digits . size - 3 );
+        rc = string_printf ( expanded, bsize, size,
+            "%S/%.*S/%S%S", & tok -> alpha, num, & tok -> acc, & tok -> alpha, & tok -> digits );
+        break;
+
+    case algNANNOTFlat:
+        rc = string_printf ( expanded, bsize, size, "%S", & tok -> acc );
+        break;
+    case algNANNOT:
+        num = ( uint32_t ) strtoul ( tok -> digits . addr, NULL, 10 );
+        rc = string_printf ( expanded, bsize, size,
+            "%03u/%03u/%S", num / 1000000, ( num / 1000 ) % 1000, & tok -> acc );
+        break;
+    case algFuseNANNOT:
+        num = ( uint32_t ) strtoul ( tok -> digits . addr, NULL, 10 );
+        rc = string_printf ( expanded, bsize, size,
+            "%03u/%03u/%S", num / 1000000, ( num / 1000 ) % 1000, & tok -> acc );
+        break;
+
+    case algNAKMERFlat:
+        rc = string_printf ( expanded, bsize, size, "%S", & tok -> acc );
+        break;
+    case algNAKMER:
+        num = ( uint32_t ) strtoul ( tok -> digits . addr, NULL, 10 );
+        rc = string_printf ( expanded, bsize, size,
+            "kmer/%03u/%03u/%S", num / 1000000, ( num / 1000 ) % 1000, & tok -> acc );
+        break;
+    case algFuseNAKMER:
+        num = ( uint32_t ) strtoul ( tok -> digits . addr, NULL, 10 );
+        rc = string_printf ( expanded, bsize, size,
+            "kmer/%03u/%03u/%S", num / 1000000, ( num / 1000 ) % 1000, & tok -> acc );
+        break;
+
+    case algPileup_NCBI:
+        num = ( uint32_t ) strtoul ( tok -> digits . addr, NULL, 10 );
+        rc = string_printf ( expanded, bsize, size,
+             "SRZ/%06u/%S%S/%S", num / 1000, & tok -> alpha, & tok -> digits, & tok -> acc );
+        break;
+            
+    case algPileup_EBI:
+        num = ( uint32_t ) strtoul ( tok -> digits . addr, NULL, 10 );
+        rc = string_printf ( expanded, bsize, size,
+             "ERZ/%06u/%S%S/%S", num / 1000, & tok -> alpha, & tok -> digits, & tok -> acc );
+        break;
+    case algPileup_DDBJ:
+        num = ( uint32_t ) strtoul ( tok -> digits . addr, NULL, 10 );
+        rc = string_printf ( expanded, bsize, size,
+             "DRZ/%06u/%S%S/%S", num / 1000, & tok -> alpha, & tok -> digits, & tok -> acc );
+        break;
+        
+    default:
+        return RC ( rcVFS, rcResolver, rcResolving, rcType, rcUnrecognized );
+    }
+
+   return rc;
+}
+
+/* LocalResolve
+ *  resolve an accession into a VPath or not found
+ *
+ *  1. expand accession according to algorithm
+ *  2. search all volumes for accession
+ *  3. return not found or new VPath
+ */
+static
+rc_t VResolverAlgLocalResolve ( const VResolverAlg *self,
+    const KDirectory *wd, const VResolverAccToken *tok,
+    const VPath ** path, bool legacy_wgs_refseq, bool for_cache )
+{
+    KPathType kpt;
+    uint32_t i, count;
+
+    /* expanded accession */
+    String exp;
+    size_t size;
+    char expanded [ 256 ];
+
+    /* in some cases, "root" is NULL */
+    const String *vol, *root = self -> root;
+
+    /* expand the accession */
+    rc_t rc = expand_algorithm ( self, tok, expanded, sizeof expanded, & size, legacy_wgs_refseq );
+
+    /* should never have a problem here... */
+    if ( rc != 0 )
+        return rc;
+
+    /* if this is to detect a cache file, append extension */
+    if ( for_cache )
+    {
+        size += string_copy ( & expanded [ size ], sizeof expanded - size, ".cache", sizeof ".cache" - 1 );
+        if ( size == sizeof expanded )
+            return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    }
+
+    /* turn the expanded portion into a String
+       we know that size is also length due to
+       accession content rules */
+    StringInit ( & exp, expanded, size, ( uint32_t ) size );
+
+    /* remove the cache extension */
+    if ( for_cache )
+    {
+        exp . len -= sizeof ".cache" - 1;
+        exp . size -= sizeof ".cache" - 1;
+    }
+
+    /* now search all volumes */
+    count = VectorLength ( & self -> vols );
+    if ( root == NULL )
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            vol = VectorGet ( & self -> vols, i );
+            kpt = KDirectoryPathType ( wd, "%.*s/%.*s"
+                , ( int ) vol -> size, vol -> addr
+                , ( int ) size, expanded );
+            switch ( kpt & ~ kptAlias )
+            {
+            case kptFile:
+            case kptDir:
+                if ( legacy_wgs_refseq )
+                    return VResolverAlgMakeLocalWGSRefseqURI ( self, vol, & exp, & tok -> acc, path );
+                return VResolverAlgMakeLocalPath ( self, vol, & exp, path );
+            default:
+                break;
+            }
+        }
+    }
+    else
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            vol = VectorGet ( & self -> vols, i );
+            kpt = KDirectoryPathType ( wd, "%.*s/%.*s/%.*s"
+                , ( int ) root -> size, root -> addr
+                , ( int ) vol -> size, vol -> addr
+                , ( int ) size, expanded );
+            switch ( kpt & ~ kptAlias )
+            {
+            case kptFile:
+            case kptDir:
+                if ( legacy_wgs_refseq )
+                    return VResolverAlgMakeLocalWGSRefseqURI ( self, vol, & exp, & tok -> acc, path );
+                return VResolverAlgMakeLocalPath ( self, vol, & exp, path );
+            default:
+                break;
+            }
+        }
+    }
+    
+    return SILENT_RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+}
+
+/* LocalFile
+ *  resolve an file name into a VPath or not found
+ */
+static
+rc_t VResolverAlgLocalFile ( const VResolverAlg *self,
+    const KDirectory *wd, const VPath *query,
+    const VPath ** path, bool for_cache )
+{
+    KPathType kpt;
+    uint32_t i, count;
+
+    /* in some cases, "root" is NULL */
+    const String *vol, *root = self -> root;
+
+    /* the file name */
+    String fname = query -> path;
+
+    /* cache extension */
+    const char *cache_ext = for_cache ? ".cache" : "";
+
+    /* encryption extension */
+    const char *krypto_ext = self -> protected ? ".ncbi_enc" : "";
+
+    /* now search all volumes */
+    count = VectorLength ( & self -> vols );
+    if ( root == NULL )
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            vol = VectorGet ( & self -> vols, i );
+            kpt = KDirectoryPathType ( wd
+                , "%.*s/%.*s%s%s"
+                , ( int ) vol -> size, vol -> addr
+                , ( int ) fname . size, fname . addr
+                , krypto_ext
+                , cache_ext
+            );
+
+            switch ( kpt & ~ kptAlias )
+            {
+            case kptFile:
+            case kptDir:
+                return VResolverAlgMakeLocalFilePath ( self, vol, & fname, krypto_ext, path );
+            default:
+                break;
+            }
+
+            if ( krypto_ext [ 0 ] != 0 )
+            {
+                kpt = KDirectoryPathType ( wd
+                    , "%.*s/%.*s%s"
+                    , ( int ) vol -> size, vol -> addr
+                    , ( int ) fname . size, fname . addr
+                    , cache_ext
+                );
+
+                switch ( kpt & ~ kptAlias )
+                {
+                case kptFile:
+                case kptDir:
+                    return VResolverAlgMakeLocalFilePath ( self, vol, & fname, "", path );
+                default:
+                    break;
+                }
+            }
+        }
+    }
+    else
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            vol = VectorGet ( & self -> vols, i );
+            kpt = KDirectoryPathType ( wd
+                , "%.*s/%.*s/%.*s%s%s"
+                , ( int ) root -> size, root -> addr
+                , ( int ) vol -> size, vol -> addr
+                , ( int ) fname . size, fname . addr
+                , krypto_ext
+                , cache_ext
+            );
+
+            switch ( kpt & ~ kptAlias )
+            {
+            case kptFile:
+            case kptDir:
+                return VResolverAlgMakeLocalFilePath ( self, vol, & fname, krypto_ext, path );
+            default:
+                break;
+            }
+
+            if ( krypto_ext [ 0 ] != 0 )
+            {
+                kpt = KDirectoryPathType ( wd
+                    , "%.*s/%.*s/%.*s%s"
+                    , ( int ) root -> size, root -> addr
+                    , ( int ) vol -> size, vol -> addr
+                    , ( int ) fname . size, fname . addr
+                    , cache_ext
+                );
+
+                switch ( kpt & ~ kptAlias )
+                {
+                case kptFile:
+                case kptDir:
+                    return VResolverAlgMakeLocalFilePath ( self, vol, & fname, "", path );
+                default:
+                    break;
+                }
+            }
+        }
+    }
+    
+    return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+}
+
+rc_t VPathCheckFromNamesCGI ( const VPath * path, const String *ticket, const VPath ** mapping )
+{
+    size_t i, size;
+    const char * start;
+
+    /* must have an explicit scheme */
+    if ( ! path -> from_uri )
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+
+    /* can only be http, https or fasp */
+    switch ( path -> scheme_type )
+    {
+    case vpuri_http:
+    case vpuri_https:
+    case vpuri_fasp:
+        break;
+    default:
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    }
+
+
+    /* must have a host-spec with all ascii-characters */
+    switch ( path -> host_type )
+    {
+    case vhDNSName:
+        if ( path -> host . size == 0 || path -> host . size != ( size_t ) path -> host . len )
+            return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+        start = path -> host . addr;
+        size = path -> host . size;
+        for ( i = 0; i < size; ++ i )
+        {
+            if ( isalnum ( start [ i ] ) )
+                continue;
+            switch ( start [ i ] )
+            {
+            case '.':
+            case '-':
+            case '_':
+                continue;
+            }
+            return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+        }
+        break;
+    case vhIPv4:
+    case vhIPv6:
+        break;
+    }
+
+    /* must have a full-path */
+    if ( path -> path_type != vpFullPath )
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    /* only ascii characters */
+    assert ( path -> path . size != 0 );
+    if ( path -> path . size != ( size_t ) path -> path . len )
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    start = path -> path . addr;
+    size = path -> path . size;
+    for ( i = 0; i < size; ++ i )
+    {
+        if ( isalnum ( start [ i ] ) )
+            continue;
+        switch ( start [ i ] )
+        {
+        case '/':
+        case '.':
+        case '-':
+        case '_':
+            continue;
+        }
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    }
+
+#if DO_NOT_USE_TIC_HACK
+    /* if the ticket was placed into the mapped path */
+    if ( mapping != NULL )
+        ticket = NULL;
+#endif
+
+    if ( path -> query . size != 0 )
+    {
+        String name, val, req;
+
+        /* query must match ticket */
+        if ( ticket == NULL )
+            return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+
+        StringSubstr ( & path -> query, & name, 0, 5 );
+        StringSubstr ( & path -> query, & val, 5, 0 );
+        if ( ! StringEqual ( & val, ticket ) )
+            return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+        CONST_STRING ( & req, "?tic=" );
+        if ( ! StringEqual ( & name, & req ) )
+            return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    }
+
+#if DISALLOW_FRAGMENT
+    /* cannot have a fragment */
+    if ( path -> fragment . size != 0 )
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+#endif
+
+    return 0;
+}
+
+
+/* ParseResolverCGIResponse_1_0
+ *  expect single row table, with this structure:
+ *
+ *  <accession>|<download-ticket>|<url>|<result-code>|<message>
+ */
+static
+rc_t VResolverAlgParseResolverCGIResponse_1_0 ( const char *start, size_t size,
+    const VPath ** path, const VPath ** ignore, const String *acc,
+    const String *ticket )
+{
+    rc_t rc;
+    KLogLevel lvl;
+    char *rslt_end;
+    uint32_t result_code;
+
+    String accession, download_ticket, url, rslt_code, msg;
+
+    /* get accession */
+    const char *end = start + size;
+    const char *sep = string_chr ( start, size, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & accession, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get download-ticket */
+    start = sep + 1;
+    sep = string_chr ( start, end - start, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & download_ticket, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get url */
+    start = sep + 1;
+    sep = string_chr ( start, end - start, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & url, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get result-code */
+    start = sep + 1;
+    sep = string_chr ( start, end - start, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & rslt_code, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get msg */
+    start = sep + 1;
+    for ( sep = end; sep > start; -- sep )
+    {
+        switch ( sep [ -1 ] )
+        {
+        case '\n':
+        case '\r':
+            continue;
+        default:
+            break;
+        }
+
+        break;
+    }
+    StringInit ( & msg, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* compare acc to accession */
+    assert(acc);
+    if ( ! StringEqual ( & accession, acc ) )
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+
+    /* compare ticket
+       currently this makes sense with 1 request from a known workspace */
+    if ( download_ticket . size != 0 )
+    {
+        if ( ticket == NULL || ! StringEqual ( & download_ticket, ticket ) )
+            return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    }
+
+    /* get the result code */
+    if ( rslt_code . size == 0 )
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    result_code = strtoul ( rslt_code . addr, & rslt_end, 10 );
+    if ( ( const char* ) rslt_end - rslt_code . addr != rslt_code . size )
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+
+    /* still have to test the URL */    
+
+    switch ( result_code / 100 )
+    {
+    case 1:
+        /* informational response
+           not much we can do here */
+        lvl = klogInt;
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+        break;
+
+    case 2:
+        /* successful response
+           but can only handle 200 */
+        if ( result_code == 200 )
+        {
+            /* normal public response */
+            if ( download_ticket . size == 0 )
+                rc = VPathMakeFmt ( ( VPath** ) path, "%S", & url );
+            else
+            {
+                /* protected response */
+                rc = VPathMakeFmt ( ( VPath** ) path, "%S?tic=%S", & url, & download_ticket );
+            }
+
+            if ( rc == 0 )
+            {
+                rc = VPathCheckFromNamesCGI ( * path, ticket, NULL );
+                if ( rc == 0 )
+                    return 0;
+
+                VPathRelease ( * path );
+                * path = NULL;
+            }
+
+            return rc;
+        }
+
+        lvl = klogInt;
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+        break;
+
+    case 3:
+        /* redirection
+           currently this is being handled by our request object */
+        lvl = klogInt;
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+        break;
+
+    case 4:
+        /* client error */
+        lvl = klogErr;
+        switch ( result_code )
+        {
+        case 400:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcInvalid );
+            break;
+        case 401:
+        case 403:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcQuery, rcUnauthorized );
+            break;
+        case 404:
+            return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+        case 410:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+            break;
+        default:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+        }
+        break;
+
+    case 5:
+        /* server error */
+        lvl = klogSys;
+        switch ( result_code )
+        {
+        case 503:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcDatabase, rcNotAvailable );
+            break;
+        case 504:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcTimeout, rcExhausted );
+            break;
+        default:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+        }
+        break;
+
+    default:
+        lvl = klogInt;
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+    }
+
+    /* log message to user */
+    PLOGERR ( lvl, ( lvl, rc, "failed to resolve accession '$(acc)' - $(msg) ( $(code) )",
+        "acc=%S,msg=%S,code=%u", acc, & msg, result_code ) );
+    return rc;
+}
+
+
+/* ParseResolverCGIResponse_1_1
+ *  expect single row table, with this structure (SRA-1690) :
+ *
+ *  <accession>|obj-id|name|size|mod-date|md5|<download-ticket>|<url>|<result-code>|<message>
+ */
+static
+rc_t VResolverAlgParseResolverCGIResponse_1_1 ( const char *astart, size_t size,
+    const VPath ** path, const VPath ** mapping, const String *acc,
+    const String *ticket )
+{
+    const char *start = astart;
+    rc_t rc;
+    KLogLevel lvl;
+    char *rslt_end;
+    uint32_t result_code;
+
+    String accession, obj_id, name, size_str, mod_date, md5, download_ticket, url, rslt_code, msg;
+
+    /* get accession */
+    const char *end = start + size;
+    const char *sep = string_chr ( start, size, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & accession, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get obj-id */
+    start = sep + 1;
+    sep = string_chr ( start, end - start, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & obj_id, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get name */
+    start = sep + 1;
+    sep = string_chr ( start, end - start, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & name, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get size */
+    start = sep + 1;
+    sep = string_chr ( start, end - start, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & size_str, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get mod-date */
+    start = sep + 1;
+    sep = string_chr ( start, end - start, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & mod_date, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get md5 */
+    start = sep + 1;
+    sep = string_chr ( start, end - start, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & md5, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get download-ticket */
+    start = sep + 1;
+    sep = string_chr ( start, end - start, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & download_ticket, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get url */
+    start = sep + 1;
+    sep = string_chr ( start, end - start, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & url, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get result-code */
+    start = sep + 1;
+    sep = string_chr ( start, end - start, '|' );
+    if ( sep == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    StringInit ( & rslt_code, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* get msg */
+    start = sep + 1;
+    for ( sep = end; sep > start; -- sep )
+    {
+        switch ( sep [ -1 ] )
+        {
+        case '\n':
+        case '\r':
+            continue;
+        default:
+            break;
+        }
+
+        break;
+    }
+    StringInit ( & msg, start, sep - start, ( uint32_t ) ( sep - start ) );
+
+    /* compare acc to accession or obj_id */
+    assert(acc);
+    if ( ! StringEqual ( & accession, acc ) && ! StringEqual ( & obj_id, acc ) ) {
+        DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_ERR), (
+            "@@@@@@@@2 %%s:%s:%d: %s"
+                "\n", __FILE__, __FUNCTION__, __LINE__, astart));
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    }
+
+    /* compare ticket
+       currently this makes sense with 1 request from a known workspace */
+    if ( download_ticket . size != 0 )
+    {
+        if ( ticket == NULL || ! StringEqual ( & download_ticket, ticket ) )
+            return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    }
+
+    /* get the result code */
+    if ( rslt_code . size == 0 )
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+    result_code = strtoul ( rslt_code . addr, & rslt_end, 10 );
+    if ( ( const char* ) rslt_end - rslt_code . addr != rslt_code . size )
+        return RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcCorrupt );
+
+    /* still have to test the URL */    
+
+    switch ( result_code / 100 )
+    {
+    case 1:
+        /* informational response
+           not much we can do here */
+        lvl = klogInt;
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+        break;
+
+    case 2:
+        /* successful response
+           but can only handle 200 */
+        if ( result_code == 200 )
+        {
+            /* normal public response */
+            if ( download_ticket . size == 0
+#if DO_NOT_USE_TIC_HACK
+                 || mapping != NULL
+#endif
+                )
+            {
+                rc = VPathMakeFmt ( ( VPath** ) path, "%S", & url );
+            }
+            else
+            {
+                /* protected response */
+                rc = VPathMakeFmt ( ( VPath** ) path, "%S?tic=%S", & url, & download_ticket );
+            }
+
+            if ( rc == 0 )
+            {
+                rc = VPathCheckFromNamesCGI ( * path, ticket, mapping );
+                if ( rc == 0 )
+                {
+                    if ( mapping == NULL )
+                        return 0;
+
+                    if ( download_ticket . size != 0 )
+                    {
+                        if ( accession . size != 0 )
+                            rc = VPathMakeFmt ( ( VPath** ) mapping, "ncbi-acc:%S?tic=%S", & accession, & download_ticket );
+                        else if ( name . size == 0 )
+                            return 0;
+                        else
+                            rc = VPathMakeFmt ( ( VPath** ) mapping, "ncbi-file:%S?tic=%S", & name, & download_ticket );
+                    }
+                    else if ( accession . size != 0 )
+                        rc = VPathMakeFmt ( ( VPath** ) mapping, "ncbi-acc:%S", & accession );
+                    else if ( name . size == 0 )
+                        return 0;
+                    else
+                        rc = VPathMakeFmt ( ( VPath** ) mapping, "ncbi-file:%S", & name );
+
+                    if ( rc == 0 )
+                        return 0;
+                }
+
+                VPathRelease ( * path );
+                * path = NULL;
+            }
+
+            return rc;
+        }
+
+        lvl = klogInt;
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+        break;
+
+    case 3:
+        /* redirection
+           currently this is being handled by our request object */
+        lvl = klogInt;
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+        break;
+
+    case 4:
+        /* client error */
+        lvl = klogErr;
+        switch ( result_code )
+        {
+        case 400:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcMessage, rcInvalid );
+            break;
+        case 401:
+        case 403:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcQuery, rcUnauthorized );
+            break;
+        case 404: /* 404|no data :
+                    If it is a real response then this assession is not found.
+                    What if it is a DB failure? Will be retried if configured to do so? */
+            return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+        case 410:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+            break;
+        default:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+        }
+        break;
+
+    case 5:
+        /* server error */
+        lvl = klogSys;
+        switch ( result_code )
+        {
+        case 503:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcDatabase, rcNotAvailable );
+            break;
+        case 504:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcTimeout, rcExhausted );
+            break;
+        default:
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+        }
+        break;
+
+    default:
+        lvl = klogInt;
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcError, rcUnexpected );
+    }
+
+    /* log message to user */
+    PLOGERR ( lvl, ( lvl, rc, "failed to resolve accession '$(acc)' - $(msg) ( $(code) )",
+        "acc=%S,msg=%S,code=%u", acc, & msg, result_code ) );
+    return rc;
+}
+
+
+/* ParseResolverCGIResponse_2_0
+ *  expect a table type line followed by the table
+ */
+static
+rc_t VResolverAlgParseResolverCGIResponse_2_0 ( const char *start, size_t size,
+    const VPath ** path, const VPath ** mapping, const String *acc,
+    const String *ticket )
+{
+    size_t i;
+
+    if ( string_cmp ( start, size, "name-resolver", sizeof "name-resolver" - 1, sizeof "name-resolver" - 1 ) == 0 )
+    {
+        do
+        {
+            /* accept table type line */
+            i = sizeof "name-resolver" - 1;
+
+            /* must be followed by eoln */
+            if ( start [ i ] == '\r' && start [ i + 1 ] == '\n' )
+                i += 2;
+            else if ( start [ i ] == '\n' )
+                i += 1;
+            else
+                break;
+
+            /* parse as 1.1 response table */
+            return VResolverAlgParseResolverCGIResponse_1_1 ( & start [ i ],
+                size - i, path, mapping, acc, ticket );
+        }
+        while ( false );
+    }
+
+    return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+}
+
+typedef enum {
+    vBad,
+    v1_0,
+    v1_1,
+    v1_2,
+    v2,
+    v3,
+} TVersion;
+
+/* ParseResolverCGIResponse
+ *  the response should be NUL terminated
+ *  but should also be close to the size of result
+ */
+rc_t VResolverAlgParseResolverCGIResponse ( const KDataBuffer *result,
+    const VPath ** path, const VPath ** mapping, const String *acc,
+    const String *ticket )
+{
+    const char V1_0[] = "#1.0";
+    const char V1_1[] = "#1.1";
+    const char V1_2[] = "#1.2";
+    const char V2  [] = "#2.0";
+    const char V3  [] = "#3.0";
+    struct {
+        const char *c;
+        size_t s;
+        TVersion v;
+        rc_t (*f)( const char *start, size_t size, const VPath **path,
+            const VPath **mapping, const String *acc, const String *ticket);
+    } version[] = {
+        {V1_1, sizeof V1_1 - 1, v1_1, VResolverAlgParseResolverCGIResponse_1_1},
+        {V1_2, sizeof V1_2 - 1, v1_2, VResolverAlgParseResolverCGIResponse_1_1},
+        {V3  , sizeof V3   - 1, v3  , VResolverAlgParseResolverCGIResponse_3_0},
+        {V1_0, sizeof V1_0 - 1, v1_0, VResolverAlgParseResolverCGIResponse_1_0},
+        {V2  , sizeof V2   - 1, v2  , VResolverAlgParseResolverCGIResponse_2_0},
+    };
+
+    size_t size = 0;
+    int iVersion = sizeof version / sizeof version[0];
+
+    /* the textual response */
+    size_t i = 0;
+    const char *start = NULL;
+
+    assert(result);
+
+    start = ( const void* ) result -> base;
+    size = KDataBufferBytes ( result );
+
+    DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS), (" Response = %.*s\n", size, start));
+
+    /* peel back buffer to significant bytes */
+    while ( size > 0 && start [ size - 1 ] == 0 ) -- size;
+
+    /* skip over blanks */
+    for ( i = 0; i < size; ++ i ) { if ( ! isspace ( start [ i ] ) ) break; }
+
+    for (iVersion = 0;
+        iVersion < sizeof version / sizeof *version; ++iVersion)
+    {
+        if (string_cmp(&start[i], size - i,
+            version[iVersion].c, version[iVersion].s, version[iVersion].s) == 0)
+        {
+            break;
+        }
+    }
+    switch (iVersion) {
+        default:
+            if (string_cmp(&start[i], size - i, version[iVersion].c,
+                version[iVersion].s, version[iVersion].s) == 0)
+            {
+                /* accept version line */
+                i += version[iVersion].s;
+
+                /* must be followed by eoln */
+                if ( start [ i ] == '\r' && start [ i + 1 ] == '\n' )
+                    i += 2;
+                else if ( start [ i ] == '\n' )
+                    i += 1;
+                else
+                    return
+                        RC(rcVFS, rcResolver, rcResolving, rcName, rcNotFound);
+
+                /* parse response table */
+                return version[iVersion].f
+                    (&start[i], size - i, path, mapping, acc, ticket);
+            }
+            /* no break */
+        case sizeof version / sizeof version[0]:
+            return RC(rcVFS, rcResolver, rcResolving, rcName, rcNotFound);
+    }
+}
+
+
+#ifdef VDB_3162
+#error 1
+/*  test-only code to emulate 403 response while calling names.cgi */
+static bool TEST_VDB_3162 = false;
+void TESTING_VDB_3162 ( void ) {
+    TEST_VDB_3162 = true;
+}
+static uint32_t TESTING_VDB_3162_CODE ( rc_t rc, uint32_t code ) {
+    if ( rc == 0 && TEST_VDB_3162 ) {
+        TEST_VDB_3162 = false;
+        return 403;
+    } else {
+        return code;
+    }
+}
+#endif
+
+
+/* RemoteProtectedResolve
+ *  use NCBI CGI to resolve accession into URL
+ */
+rc_t VResolverAlgRemoteProtectedResolve( const VResolverAlg *self,
+    const KNSManager *kns, VRemoteProtocols protocols, const String *acc,
+    const VPath ** path, const VPath ** mapping, bool legacy_wgs_refseq )
+{
+    rc_t rc;
+    KHttpRequest *req;
+
+    assert(path);
+
+    DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS), ("names.cgi = %S\n", self -> root));
+    rc = KNSManagerMakeReliableClientRequest ( kns, & req, 0x01010000, NULL, self -> root -> addr ); 
+    if ( rc == 0 )
+    {
+        /* build up POST information: */
+        DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS), ("  version = %u.%u\n",
+            NAME_SERVICE_MAJ_VERS, NAME_SERVICE_MIN_VERS));
+        rc = KHttpRequestAddPostParam ( req, "version=%u.%u",
+            NAME_SERVICE_MAJ_VERS, NAME_SERVICE_MIN_VERS );
+        if ( rc == 0 )
+        {
+            DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS), ("  acc = %S\n", acc));
+            rc = KHttpRequestAddPostParam ( req, "acc=%S", acc ); 
+        }
+        if ( rc == 0 && legacy_wgs_refseq )
+        {
+            DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS), ("  ctx = refseq\n"));
+            rc = KHttpRequestAddPostParam ( req, "ctx=refseq" );
+        }
+        if ( rc == 0 && self -> ticket != NULL )
+        {
+            DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS), ("  tic = %S\n", self -> ticket));
+            rc = KHttpRequestAddPostParam ( req, "tic=%S", self -> ticket );
+        }
+
+        if ( rc == 0 && NAME_SERVICE_VERS >= ONE_DOT_ONE )
+        {
+            uint32_t i;
+            const char * prefs [ eProtocolMaxPref ];
+            const char * seps [ eProtocolMaxPref ];
+            VRemoteProtocols protos = protocols;
+
+            prefs [ 0 ] = seps [ 0 ] = NULL;
+            prefs [ 1 ] = prefs [ 2 ] = seps [ 1 ] = seps [ 2 ] = "";
+
+            for ( i = 0; protos != 0 && i < sizeof prefs / sizeof prefs [ 0 ]; protos >>= 3 )
+            {
+                /* 1.1 protocols */
+                switch ( protos & eProtocolMask )
+                {
+                case eProtocolHttp:
+                    prefs [ i ] = "http";
+                    seps [ i ++ ] = ",";
+                    break;
+                case eProtocolFasp:
+                    prefs [ i ] = "fasp";
+                    seps [ i ++ ] = ",";
+                    break;
+                default:
+                    if ( NAME_SERVICE_VERS > ONE_DOT_ONE )
+                    {
+                        /* 1.2 protocols */
+                        switch ( protos & eProtocolMask )
+                        {
+                        case eProtocolHttps:
+                            prefs [ i ] = "https";
+                            seps [ i ++ ] = ",";
+                            break;
+                        }
+                    }
+                }
+            }
+
+            if ( prefs [ 0 ] == NULL )
+                rc = RC ( rcVFS, rcResolver, rcResolving, rcParam, rcInvalid );
+
+            else
+            {
+                DBGMSG ( DBG_VFS, DBG_FLAG ( DBG_VFS ),
+                         ("  accept-proto = %s%s%s%s%s\n", prefs [ 0 ], seps [ 1 ], prefs [ 1 ], seps [ 2 ], prefs [ 2 ] ) );
+                rc = KHttpRequestAddPostParam ( req, "accept-proto=%s%s%s%s%s", prefs [ 0 ], seps [ 1 ], prefs [ 1 ], seps [ 2 ], prefs [ 2 ] );
+            }
+        }
+
+        if ( rc == 0 )
+        {
+            KHttpResult *rslt;
+            
+            rc = KHttpRequestPOST ( req, &rslt ); /* will retry if needed `*/
+            if ( rc == 0 )
+            {
+                uint32_t code;
+
+                rc = KHttpResultStatus ( rslt, &code, NULL, 0, NULL );
+
+#ifdef VDB_3162
+                if ( TEST_VDB_3162 ) {
+                    code = TESTING_VDB_3162_CODE ( rc, code );
+                }
+#endif
+
+                DBGMSG
+                    ( DBG_VFS, DBG_FLAG ( DBG_VFS ), ( " Code = %d\n", code ) );
+                if ( code == 200 )
+                {
+                    KStream *response;
+                    
+                    rc = KHttpResultGetInputStream ( rslt, &response );
+                    if ( rc == 0 )
+                    {
+                        size_t num_read;
+                        size_t total = 0;
+                        
+                        KDataBuffer result;
+                        memset ( & result, 0, sizeof result );
+                        KDataBufferMakeBytes ( & result, 4096 );
+
+                        while ( 1 )
+                        {
+                            uint8_t *base;
+                            uint64_t avail = result . elem_count - total;
+                            if ( avail < 256 )
+                            {
+                                rc = KDataBufferResize ( & result, result . elem_count + 4096 );
+                                if ( rc != 0 )
+                                    break;
+                            }
+                            
+                            base = result . base;
+                            rc = KStreamRead ( response, & base [ total ], ( size_t ) result . elem_count - total, & num_read );
+                            if ( rc != 0 )
+                            {
+                                /* TBD - look more closely at rc */
+                                if ( num_read > 0 )
+                                    rc = 0;
+                                else
+                                    break;
+                            }
+
+                            if ( num_read == 0 )
+                                break;
+
+                            total += num_read;
+                        }
+
+                        if ( rc == 0 )
+                        {
+                            result.elem_count = total;
+
+                            rc = VResolverAlgParseResolverCGIResponse(&result, path, mapping, acc, self->ticket);
+                            KDataBufferWhack ( &result );
+                        }
+
+                        KStreamRelease ( response );
+                    }
+                }
+                else if ( code == 403 ) {
+                    /* HTTP/1.1 403 Forbidden
+                     - resolver CGI was called over http insted of https */
+                    rc = RC ( rcVFS, rcResolver, rcResolving,
+                        rcConnection, rcUnauthorized );
+                }
+                else if ( code == 404 )
+                {
+                    /* HTTP/1.1 404 Bad Request - resolver CGI was not found */
+                    rc = RC ( rcVFS, rcResolver, rcResolving, rcConnection, rcNotFound );
+                }
+                else
+                {
+                    /* Something completely unexpected */
+                    rc = RC ( rcVFS, rcResolver, rcResolving, rcConnection, rcUnexpected );
+                }
+                KHttpResultRelease ( rslt );
+            }
+        }
+        KHttpRequestRelease ( req );
+    }
+
+    assert(*path != NULL || rc != 0);
+
+    if (rc == 0 && *path == NULL) 
+    {
+        rc = RC(rcVFS, rcResolver, rcResolving, rcName, rcNull);
+    }
+
+    return rc;
+}
+
+/* If resolver-cgi is on government site and is called over http:
+   fix it to https */
+static
+rc_t VResolverAlgFixHTTPSOnlyStandard ( VResolverAlg * self, bool * fixed )
+{
+    rc_t rc = 0;
+
+    const String * root = NULL;
+
+    assert ( self && fixed );
+
+    * fixed = false;
+
+    root = self -> root;
+
+    if ( root != NULL ) {
+        size_t size = 0;
+        String http;
+        CONST_STRING ( & http, "http://" );
+        size = http . size;
+
+        /* resolver-cgi is called over http */
+        if ( root -> size > size &&
+             strcase_cmp ( root -> addr, size, http . addr, size, size ) == 0 )
+        {
+            VPath * path = NULL;
+            rc = VPathMakeFmt ( & path, "%S", root );
+            if ( rc == 0 ) {
+                String host;
+                rc = VPathGetHost ( path, & host );
+                if ( rc == 0 ) {
+                    String gov;
+                    CONST_STRING ( & gov, ".gov" );
+                    size = gov . size;
+
+                    /* If resolver-cgi is on government site */
+                    if ( host . size > size &&
+                        strcase_cmp ( host . addr + host . size - size,
+                            size, gov . addr, size, size ) == 0 )
+                    {
+                        size_t newLen = root -> len + 2;
+                        String * tmp = malloc ( sizeof * tmp + newLen );
+                        if ( tmp == NULL ) {
+                            rc = RC ( rcVFS, rcResolver,
+                                rcResolving, rcMemory, rcExhausted );
+                        }
+                        else
+                        {
+                            /* capture all of root past "http" */
+                            String remainder;
+                            StringSubstr ( root, & remainder, 4, 0 );
+
+                            /* prepare "tmp" to point to buffer space */
+                            tmp -> addr = ( char * ) ( tmp + 1 );
+
+                            /* print into buffer */
+                            rc = string_printf ( ( char * ) tmp -> addr,
+                                newLen, & tmp -> size, "https%S", & remainder );
+                            if ( rc != 0 )
+                                free ( tmp );
+                            else
+                            {
+                                tmp -> len = root -> len + 1;
+                                rc = VectorAppend ( & self -> vols, NULL, tmp );
+                                if ( rc == 0 )
+                                {
+                                    self -> root = tmp;
+                                    * fixed = true;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            VPathRelease ( path );
+        }
+    }
+
+    return rc;
+}
+
+/* RemoteResolve
+ *  resolve an accession into a VPath or not found
+ *
+ *  1. expand accession according to algorithm
+ *  2. search all volumes for accession
+ *  3. return not found or new VPath
+ */
+static
+rc_t VResolverAlgRemoteResolve ( const VResolverAlg *self,
+    const KNSManager *kns, VRemoteProtocols protocols, const VResolverAccToken *tok,
+    const VPath ** path, const VPath ** mapping, const KFile ** opt_file_rtn, bool legacy_wgs_refseq )
+{
+    rc_t rc;
+    uint32_t i, count;
+
+    /* expanded accession */
+    String exp;
+    size_t size;
+    char expanded [ 256 ];
+
+    const String *root;
+
+    assert(self);
+
+    /* check for download ticket */
+    if ( self -> alg_id == algCGI
+#if NO_LEGACY_WGS_REFSEQ_CGI
+         && ! legacy_wgs_refseq
+#endif
+        )
+    {
+        bool done = false;
+        int i = 0;
+        for ( i = 0; i < 2 && ! done; ++i ) {
+            rc = VResolverAlgRemoteProtectedResolve ( self, kns,
+                protocols, & tok -> acc, path, mapping, legacy_wgs_refseq );
+            if ( rc == SILENT_RC (
+                rcVFS, rcResolver, rcResolving, rcConnection, rcUnauthorized ) )
+            { /* resolver-cgi is called over http instead of https:
+                 fix it */
+                bool fixed = false;
+                rc_t r2 = VResolverAlgFixHTTPSOnlyStandard
+                    ( ( VResolverAlg * ) self, & fixed );
+                if ( ! fixed || r2 != 0 ) {
+                    if ( r2 != 0 ) {
+                        rc = r2;
+                    }
+                    done = true;
+                }
+            }
+            else {
+                done = true;
+            }
+        }
+
+        if (rc == 0 && path != NULL && *path != NULL &&
+            opt_file_rtn != NULL && *opt_file_rtn == NULL &&
+            VPathGetUri_t ( * path ) != vpuri_fasp )
+        {
+            const String *s = NULL;
+            rc_t rc = VPathMakeString(*path, &s);
+            if (rc != 0)
+            {
+                LOGERR(klogInt, rc,
+                    "failed to make string from remote protected path");
+            }
+            else
+            {
+                rc = KNSManagerMakeReliableHttpFile ( kns, opt_file_rtn, NULL, 0x01010000, "%S", s );
+                if (rc != 0)
+                {
+                    PLOGERR(klogInt, (klogInt, rc,
+                        "failed to open file for $(path)", "path=%s", s->addr));
+                }
+                StringWhack ( s );
+            }
+        }
+        return rc;
+    }
+
+    /* now we know just how to resolve HTTP locations */
+    if ( protocols == eProtocolFasp ) {
+        return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+    }
+
+    /* for remote, root can never be NULL */
+    root = self -> root;
+
+    /* expand the accession */
+    rc = expand_algorithm ( self, tok, expanded, sizeof expanded, & size, legacy_wgs_refseq );
+
+    /* should never have a problem here... */
+    if ( rc != 0 )
+        return rc;
+
+    /* turn the expanded portion into a String
+       we know that size is also length due to
+       accession content rules */
+    StringInit ( & exp, expanded, size, ( uint32_t ) size );
+
+    /* now search all remote volumes */
+    count = VectorLength ( & self -> vols );
+    for ( i = 0; i < count; ++ i )
+    {
+        char url [ 8192 ];
+        const String *vol = VectorGet ( & self -> vols, i );
+        rc = string_printf ( url, sizeof url, NULL, "%S/%S/%S", root, vol, & exp );
+        if ( rc == 0 )
+        {
+            const KFile *f;
+            rc = KNSManagerMakeHttpFile ( kns, & f, NULL, 0x01010000, url );
+            if ( rc == 0 )
+            {
+                if ( opt_file_rtn != NULL )
+                    * opt_file_rtn = f;
+                else
+                    KFileRelease ( f );
+
+                if ( legacy_wgs_refseq )
+                    return VResolverAlgMakeRemoteWGSRefseqURI ( self, url, & tok -> acc, path );
+                return VResolverAlgMakeRemotePath ( self, url, path );
+            }
+        }
+    }
+    
+    return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+}
+
+
+/* CacheResolve
+ *  try to resolve accession for currently cached file
+ */
+static
+rc_t VResolverAlgCacheResolve ( const VResolverAlg *self,
+    const KDirectory *wd, const VResolverAccToken *tok,
+    const VPath ** path, bool legacy_wgs_refseq )
+{
+    /* see if the cache file already exists */
+    const bool for_cache = true;
+    rc_t rc = VResolverAlgLocalResolve ( self, wd, tok, path, legacy_wgs_refseq, for_cache );
+    if ( rc == 0 )
+        return 0;
+
+    /* TBD - see if any of these volumes is a good candidate for creating a file */
+
+    return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+}
+
+
+/* CacheFile
+ *  try to resolve name for currently cached file
+ */
+static
+rc_t VResolverAlgCacheFile ( const VResolverAlg *self,
+    const KDirectory *wd, const VPath *query, const VPath ** path )
+{
+    /* see if the cache file already exists */
+    const bool for_cache = true;
+    rc_t rc = VResolverAlgLocalFile ( self, wd, query, path, for_cache );
+    if ( rc == 0 )
+        return 0;
+
+    /* TBD - see if any of these volumes is a good candidate for creating a file */
+
+    return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+}
+
+
+
+/* MakeCachePath
+ *  we have an accession that matches this volume
+ *  create a path for it
+ */
+static
+rc_t VResolverAlgMakeCachePath ( const VResolverAlg *self,
+    const VResolverAccToken *tok, const VPath ** path, bool legacy_wgs_refseq )
+{
+    uint32_t i, count;
+
+    /* expanded accession */
+    String exp;
+    size_t size;
+    char expanded [ 256 ];
+
+    const String *vol;
+
+    /* expand the accession */
+    rc_t rc = expand_algorithm ( self, tok, expanded, sizeof expanded, & size, legacy_wgs_refseq );
+
+    /* should never have a problem here... */
+    if ( rc != 0 )
+        return rc;
+
+    /* turn the expanded portion into a String
+       we know that size is also length due to
+       accession content rules */
+    StringInit ( & exp, expanded, size, ( uint32_t ) size );
+
+    /* now search all volumes */
+    count = VectorLength ( & self -> vols );
+    for ( i = 0; i < count; ++ i )
+    {
+        vol = VectorGet ( & self -> vols, i );
+        return VResolverAlgMakeLocalPath ( self, vol, & exp, path );
+    }
+    
+    return RC ( rcVFS, rcResolver, rcResolving, rcPath, rcNotFound );
+}
+
+
+/* MakeCacheFilePath
+ *  we have a filename that matches this volume
+ *  create a path for it
+ */
+static
+rc_t VResolverAlgMakeCacheFilePath ( const VResolverAlg *self,
+    const VPath *query, const VPath ** path )
+{
+    String fname = query -> path;
+
+    /* needs proper extension for krypto */
+    const char * krypto_ext = self -> protected ? ".ncbi_enc" : "";
+
+    /* now search all volumes */
+    uint32_t i, count = VectorLength ( & self -> vols );
+    for ( i = 0; i < count; ++ i )
+    {
+        const String *vol = VectorGet ( & self -> vols, i );
+        return VResolverAlgMakeLocalFilePath ( self, vol, & fname, krypto_ext, path );
+    }
+    
+    return RC ( rcVFS, rcResolver, rcResolving, rcPath, rcNotFound );
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * VResolver
+ */
+struct VResolver
+{
+    /* root paths - stored as String* */
+    Vector roots;
+
+    /* volume algorithms - stored as VResolverAlg* */
+    Vector local;
+    Vector remote;
+
+    /* working directory for testing local paths */
+    const KDirectory *wd;
+
+    /* if there is a protected remote resolver,
+       we will need a KNS manager */
+    const KNSManager *kns;
+
+    /* if there is a working protected repository,
+       store the download ticket here */
+    const String *ticket;
+
+    KRefcount refcount;
+
+    /* counters for various app volumes */
+    uint32_t num_app_vols [ appCount ];
+
+    /* preferred protocols preferences. Default: HTTP */
+    VRemoteProtocols protocols, dflt_protocols;
+
+    /** projectId of protected user repository;
+        0 when repository is not user protected */
+    uint32_t projectId;
+};
+
+
+/* "process" global settings
+ *  actually, they are library-closure global
+ */
+static atomic32_t enable_local, enable_remote, enable_cache;
+
+
+/* Whack
+ */
+static
+rc_t VResolverWhack ( VResolver *self )
+{
+    KRefcountWhack ( & self -> refcount, "VResolver" );
+
+    /* drop all remote volume sets */
+    VectorWhack ( & self -> remote, VResolverAlgWhack, NULL );
+
+    /* drop local volume sets */
+    VectorWhack ( & self -> local, VResolverAlgWhack, NULL );
+
+    /* drop download ticket */
+    if ( self -> ticket != NULL )
+        StringWhack ( ( String* ) self -> ticket );
+
+    /* drop root paths */
+    VectorWhack ( & self -> roots, string_whack, NULL );
+
+    /* release kns */
+    if ( self -> kns != NULL )
+        KNSManagerRelease ( self -> kns );
+
+    /* release directory onto local file system */
+    KDirectoryRelease ( self -> wd );
+
+    free ( self );
+    return 0;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT
+rc_t CC VResolverAddRef ( const VResolver * self )
+{
+    if ( self != NULL )
+    {
+        switch ( KRefcountAdd ( & self -> refcount, "VResolver" ) )
+        {
+        case krefOkay:
+            break;
+        case krefZero:
+            return RC ( rcVFS, rcResolver, rcAttaching, rcRefcount, rcIncorrect );
+        case krefLimit:
+            return RC ( rcVFS, rcResolver, rcAttaching, rcRefcount, rcExhausted );
+        case krefNegative:
+            return RC ( rcVFS, rcResolver, rcAttaching, rcRefcount, rcInvalid );
+        default:
+            return RC ( rcVFS, rcResolver, rcAttaching, rcRefcount, rcUnknown );
+        }
+    }
+    return 0;
+}
+
+LIB_EXPORT
+rc_t CC VResolverRelease ( const VResolver * self )
+{
+    rc_t rc = 0;
+    if ( self != NULL )
+    {
+        switch ( KRefcountDrop ( & self -> refcount, "VResolver" ) )
+        {
+        case krefOkay:
+        case krefZero:
+            break;
+        case krefWhack:
+            VResolverWhack ( ( VResolver* ) self );
+            break;
+        case krefNegative:
+            return RC ( rcVFS, rcResolver, rcAttaching, rcRefcount, rcInvalid );
+        default:
+            rc = RC ( rcVFS, rcResolver, rcAttaching, rcRefcount, rcUnknown );
+            break;            
+        }
+    }
+    return rc;
+}
+
+
+/* get_accession_code
+ */
+static
+uint32_t get_accession_code ( const String * accession, VResolverAccToken *tok )
+{
+#if USE_VPATH_OPTIONS_STRINGS
+#error this thing is wrong
+#else
+
+#define MAX_ACCESSION_LEN 20
+
+    uint32_t code;
+
+    const char *acc = NULL;
+    size_t i, size = 0;
+
+    assert(accession);
+
+    acc = accession -> addr;
+    size = accession -> size;
+
+    /* capture the whole accession */
+    tok -> acc = * accession;
+
+    /* scan prefix or alpha */
+    for ( i = 0; i < size; ++ i )
+    {
+        if ( ! isalpha ( acc [ i ] ) )
+            break;
+    }
+
+    /* terrible situation - unrecognizable */
+    if ( i == size || i == 0 || i >= MAX_ACCESSION_LEN )
+    {
+        StringInit ( & tok -> prefix, acc, 0, 0 );
+        StringInit ( & tok -> alpha, acc, i, (uint32_t)i );
+        StringInit ( & tok -> digits, & acc [ i ], 0, 0 );
+        tok -> ext1 = tok -> ext2 = tok -> suffix = tok -> digits;
+        return 0;
+    }
+
+    /* if stopped on '_', we have a prefix */
+    if ( acc [ i ] == '_' )
+    {
+        /* prefix
+           store only its presence, not length */
+        code = 1 << 4 * 4;
+        StringInit ( & tok -> prefix, acc, i, (uint32_t)i );
+
+        /* remove prefix */
+        acc += ++ i;
+        size -= i;
+
+        /* scan for alpha */
+        for ( i = 0; i < size; ++ i )
+        {
+            if ( ! isalpha ( acc [ i ] ) )
+                break;
+        }
+
+        if ( i == size || i >= MAX_ACCESSION_LEN )
+        {
+            StringInit ( & tok -> alpha, acc, i, (uint32_t)i );
+            StringInit ( & tok -> digits, & acc [ i ], 0, 0 );
+            tok -> ext1 = tok -> ext2 = tok -> suffix = tok -> digits;
+            return 0;
+        }
+
+        code |= i << 4 * 3;
+        StringInit ( & tok -> alpha, acc, i, (uint32_t)i );
+    }
+    else if ( ! isdigit ( acc [ i ] ) )
+    {
+        StringInit ( & tok -> prefix, acc, 0, 0 );
+        StringInit ( & tok -> alpha, acc, i, (uint32_t)i );
+        StringInit ( & tok -> digits, & acc [ i ], 0, 0 );
+        tok -> ext1 = tok -> ext2 = tok -> suffix = tok -> digits;
+        return 0;
+    }
+    else
+    {
+        /* alpha */
+        code = (uint32_t) ( i << 4 * 3 );
+        StringInit ( & tok -> prefix, acc, 0, 0 );
+        StringInit ( & tok -> alpha, acc, i, (uint32_t)i );
+    }
+
+    /* remove alpha */
+    acc += i;
+    size -= i;
+
+    /* scan digits */
+    for ( i = 0; i < size; ++ i )
+    {
+        if ( ! isdigit ( acc [ i ] ) )
+            break;
+    }
+
+    /* record digits */
+    StringInit ( & tok -> digits, acc, i, (uint32_t)i );
+    StringInit ( & tok -> ext1, & acc [ i ], 0, 0 );
+    tok -> ext2 = tok -> suffix = tok -> ext1;
+
+    if ( i == 0 || i >= MAX_ACCESSION_LEN )
+        return 0;
+
+    code |= i << 4 * 2;
+
+    /* normal return point for SRA */
+    if ( i == size )
+        return code;
+
+    /* check for extension */
+    if ( acc [ i ] != '.' )
+        return 0;
+
+    /* remove digit */
+    acc += ++ i;
+    size -= i;
+    
+    /* check pileup extension */
+    if ( string_cmp( acc, size, "pileup", 6, size + 6 ) == 0 )
+    {
+        i = 6;
+    }
+    else
+    {
+        /* scan numeric extension */
+        for ( i = 0; i < size; ++ i )
+        {
+            if ( ! isdigit ( acc [ i ] ) )
+                break;
+        }
+    }
+
+    if ( i == 0 || i >= MAX_ACCESSION_LEN )
+        return 0;
+
+    /* record the actual extension */
+    StringInit ( & tok -> ext1, acc, i, (uint32_t)i );
+    /* codify the extension simply as present, not by its length */
+    code |= 1 << 4 * 1;
+
+    if ( i == size )
+        return code;
+
+    /* scan for suffix */
+    if ( acc [ i ] == '_' )
+    {
+        acc += ++ i;
+        size -= i;
+        for ( i = 0; i < size; ++ i )
+        {
+            if ( ! isalpha ( acc [ i ] ) )
+                break;
+        }
+
+        /* this has to end the whole thing */
+        if ( i == 0 || i != size )
+            return 0;
+
+        StringInit ( & tok -> suffix, acc, i, (uint32_t)i );
+        /* NB - not incorporating suffix into code right now */
+        return code;
+    }
+
+    if ( acc [ i ] != '.' )
+        return 0;
+
+
+    /* remove first extension */
+    acc += ++ i;
+    size -= i;
+
+    /* scan 2nd numeric extension */
+    for ( i = 0; i < size; ++ i )
+    {
+        if ( ! isdigit ( acc [ i ] ) )
+            break;
+    }
+
+    if ( i == 0 || i >= MAX_ACCESSION_LEN )
+        return 0;
+
+    StringInit ( & tok -> ext2, acc, i, (uint32_t)i );
+    code |= 1 << 4 * 0;
+
+    if ( i == size )
+        return code;
+
+    /* no other patterns are accepted */
+    return 0;
+#endif
+}
+
+
+/* get_accession_app
+ */
+static
+VResolverAppID get_accession_app ( const String * accession, bool refseq_ctx,
+    VResolverAccToken *tok, bool *legacy_wgs_refseq )
+{
+    VResolverAppID app;
+    uint32_t code = get_accession_code ( accession, tok );
+
+    if (accession != NULL &&
+        accession->addr != NULL && isdigit(accession->addr[0]))
+    {
+        /* TODO: KART */
+        return appAny;
+    }
+
+    /* disregard extensions at this point */
+    switch ( code >> 4 * 2 )
+    {
+    case 0x015: /* e.g. "J01415" or "J01415.2"     */
+    case 0x026: /* e.g. "CM000071" or "CM000039.2" */
+    case 0x126: /* e.g. "NZ_DS995509.1"            */
+        app = appREFSEQ;
+        break;
+
+    case 0x036: /* e.g. "SRR012345"    */
+    case 0x037: /* e.g. "SRR0123456"   */
+    case 0x038: /* e.g. "SRR01234567"  */
+    case 0x039: /* e.g. "SRR012345678" */
+
+        /* detect accession with extension */
+        if ( ( code & 0xFF ) != 0 )
+        {
+            /* check pileup suffix, e.g. "SRR012345.pileup" */
+            String suffix = tok -> ext1;
+            if ( suffix . size == 6 &&
+                 suffix . addr [ 0 ] == 'p' &&
+                 suffix . addr [ 1 ] == 'i' &&
+                 suffix . addr [ 2 ] == 'l' &&
+                 suffix . addr [ 3 ] == 'e' &&
+                 suffix . addr [ 4 ] == 'u' &&
+                 suffix . addr [ 5 ] == 'p' )
+            {
+                app = appSRAPileup;
+            }
+            else
+            {
+                app = appAny;
+            }
+        }
+        else
+        {
+            app = appSRA;
+        }
+        break;
+
+    case 0x106: /* e.g. "NC_000012.10"                      */
+    case 0x109: /* e.g. "NW_003315935.1", "GPC_000000393.1" */
+        if ( tok -> prefix . size == 3 &&
+             tok -> prefix . addr [ 0 ] == 'G' &&
+             tok -> prefix . addr [ 1 ] == 'C' &&
+             ( tok -> prefix . addr [ 2 ] == 'A' || tok -> prefix . addr [ 2 ] == 'F' ) )
+        {
+            /* e.g. "GCA_000392025.1_L" */
+            app = appNAKMER;
+            break;
+        }
+
+        app = appREFSEQ;
+        break;
+
+    case 0x042: /* e.g. "AAAB01" is WGS package name */
+    case 0x048: /* e.g. "AAAA01000001"               */
+    case 0x049: /* contig can be 6 or 7 digits       */
+    case 0x142: /* e.g. "NZ_AAEW01"                  */
+    case 0x148: /* e.g. "NZ_AAEW01000001"            */
+    case 0x149:
+        app = appWGS;
+        break;
+
+    case 0x029: /* e.g. NA000008777.1 */
+        if ( code == 0x02910 )
+        {
+            if ( tok -> alpha . addr [ 0 ] == 'N' && tok -> alpha . addr [ 1 ] == 'A' )
+            {
+                app = appNANNOT;
+                break;
+            }
+        }
+
+        /* no break */
+
+    default:
+        /* TBD - people appear to be able to throw anything into refseq,
+           so anything unrecognized we may as well test out there...
+           but this should not stay the case */
+        app = appREFSEQ;
+    }
+
+    if ( app == appWGS )
+    {
+        /* if we know this is for refseq, clobber it here */
+        if ( refseq_ctx )
+        {
+            app = appREFSEQ;
+            * legacy_wgs_refseq = true;
+        }
+    }
+
+    return app;
+}
+
+/* Temporary patch for FUSE mounted accessions
+ *  1. determined if accession is mounter locally
+ *  2. return not found or new VPath
+ */
+static
+rc_t VResolverFuseMountedResolve ( const VResolver * self,
+    const String * accession, const VPath ** path )
+{
+    rc_t rc;
+    struct KDirectory * NativeDir;
+    uint32_t PathType;
+
+    rc = 0;
+    NativeDir = NULL;
+    PathType = kptNotFound;
+
+    rc = KDirectoryNativeDir ( & NativeDir );
+    if ( rc == 0 ) {
+        PathType = KDirectoryPathType ( NativeDir, ".#dbgap-mount-tool#" );
+        if ( PathType == kptFile ) {
+            PathType = KDirectoryPathType (
+                                        NativeDir,
+                                        "%.*s",
+                                        accession -> size,
+                                        accession -> addr
+                                        );
+            if ( PathType == kptFile ) {
+                rc = VPathMakeFmt (
+                                ( VPath ** ) path,
+                                "%.*s",
+                                accession -> size,
+                                accession -> addr
+                                );
+            }
+            else {
+                rc = RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+            }
+        }
+        else {
+            rc = SILENT_RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+        }
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return rc;
+}
+
+/* LocalResolve
+ *  resolve an accession into a VPath or not found
+ *
+ *  1. determine the type of accession we have, i.e. its "app"
+ *  2. search all local algorithms of app type for accession
+ *  3. return not found or new VPath
+ */
+static
+rc_t VResolverLocalResolve ( const VResolver *self,
+    const String * accession, const VPath ** path, bool refseq_ctx )
+{
+    uint32_t i, count;
+
+    VResolverAccToken tok;
+    bool legacy_wgs_refseq = false;
+    VResolverAppID app;
+
+
+    if ( VResolverFuseMountedResolve ( self, accession, path ) == 0 ) {
+        return 0;
+    }
+
+    app = get_accession_app ( accession, refseq_ctx, & tok, & legacy_wgs_refseq );
+
+    /* search all local volumes by app and accession algorithm expansion */
+
+
+    count = VectorLength ( & self -> local );
+    for ( i = 0; i < count; ++ i )
+    {
+        const VResolverAlg *alg = VectorGet ( & self -> local, i );
+        if ( alg -> app_id == app )
+        {
+            const bool for_cache = false;
+            rc_t rc = VResolverAlgLocalResolve ( alg, self -> wd, & tok, path, legacy_wgs_refseq, for_cache );
+            if ( rc == 0 )
+                return 0;
+        }
+    }
+
+    return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+}
+
+/* LocalFile
+ *  locate a locally stored file
+ */
+static
+rc_t VResolverLocalFile ( const VResolver *self, const VPath * query, const VPath ** path )
+{
+    uint32_t i, count;
+
+    count = VectorLength ( & self -> local );
+    for ( i = 0; i < count; ++ i )
+    {
+        const VResolverAlg *alg = VectorGet ( & self -> local, i );
+        if ( alg -> app_id == appFILE )
+        {
+            const bool for_cache = false;
+            rc_t rc = VResolverAlgLocalFile ( alg, self -> wd, query, path, for_cache );
+            if ( rc == 0 )
+                return 0;
+        }
+    }
+
+    return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+}
+
+static
+bool VPathHasRefseqContext ( const VPath * accession )
+{
+    size_t num_read;
+    char option [ 64 ];
+    rc_t rc = VPathOption ( accession, vpopt_vdb_ctx, option, sizeof option, & num_read );
+    if ( rc != 0 )
+        return false;
+
+    return ( num_read == sizeof "refseq" - 1 &&
+             strcase_cmp ( "refseq", sizeof "refseq" - 1,
+                           option, num_read, (uint32_t)num_read ) == 0 );
+}
+
+
+/* Local - DEPRECATED
+ *  Find an existing local file/directory that is named by the accession.
+ *  rcState of rcNotFound means it does not exist.
+ *
+ *  other rc code for failure are possible.
+ *
+ *  Accession must be an ncbi-acc scheme or a simple name with no 
+ *  directory paths.
+ */
+LIB_EXPORT
+rc_t CC VResolverLocal ( const VResolver * self,
+    const VPath * accession, const VPath ** path )
+{
+    rc_t rc =  VResolverQuery ( self, self -> protocols, accession, path, NULL, NULL );
+    if ( rc == 0 )
+    {
+        switch ( accession -> path_type )
+        {
+        case vpOID:
+        case vpAccession:
+        case vpNameOrOID:
+        case vpNameOrAccession:
+            if ( * path != accession )
+                return 0;
+            break;
+
+        case vpName:
+            if ( accession -> query . size != 0 && VPathHasRefseqContext ( accession ) )
+                return 0;
+            break;
+        }
+
+        VPathRelease ( * path );
+        * path = NULL;
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcPath, rcNotFound );
+    }
+    return rc;
+}
+
+
+/* LocalEnable
+ *  modify settings for using local repositories,
+ *  meaning site, user-public and user-protected.
+ *
+ *  "enable" [ IN ] - enable or disable local access,
+ *  or follow settings in KConfig
+ *
+ *  returns the previous state of "local-enabled" property
+ *
+ * NB - in VDB-2, the state is associated with library code
+ *  shared libraries in separate closures will have separate
+ *  state. this can only occur if dynamic ( manual ) loading of
+ *  shared libraries is used, and will not occur with normal
+ *  usage. in VDB-3 the state will be stored with the process,
+ *  not the library.
+ */
+LIB_EXPORT
+VResolverEnableState CC VResolverLocalEnable ( const VResolver * self, VResolverEnableState enable )
+{
+    int32_t val, cur, prior;
+
+    if ( self == NULL )
+        return vrUseConfig;
+
+    /* convert "VResolverEnableState" to 32-bit signed integer for atomic operation */
+    val = ( int32_t ) enable;
+
+    /* before performing atomic swap, get the current setting,
+       and return right away if it is already set correctly */
+    prior = atomic32_read ( & enable_local );
+    if ( prior != val ) do
+    {
+        cur = prior;
+        prior = atomic32_test_and_set ( & enable_local, val, prior );
+    }
+    while ( prior != cur );
+
+    return prior;
+}
+
+
+/* RemoteEnable
+ *  apply or remove a process-wide enabling of remote access
+ *  regardless of configuration settings
+ *
+ *  "enable" [ IN ] - if "true", enable all remote access
+ *  if false, use settings from configuration.
+ *
+ *  returns the previous state of "remote-enabled" property
+ *
+ * NB - in VDB-2, the state is associated with library code
+ *  shared libraries in separate closures will have separate
+ *  state. this can only occur if dynamic ( manual ) loading of
+ *  shared libraries is used, and will not occur with normal
+ *  usage. in VDB-3 the state will be stored with the process,
+ *  not the library.
+ */
+LIB_EXPORT
+VResolverEnableState CC VResolverRemoteEnable ( const VResolver * self, VResolverEnableState enable )
+{
+    int32_t val, cur, prior;
+
+    if ( self == NULL )
+        return vrUseConfig;
+
+    /* convert "VResolverEnableState" to 32-bit signed integer for atomic operation */
+    val = ( int32_t ) enable;
+
+    /* before performing atomic swap, get the current setting,
+       and return right away if it is already set correctly */
+    prior = atomic32_read ( & enable_remote );
+    if ( prior != val ) do
+    {
+        cur = prior;
+        prior = atomic32_test_and_set ( & enable_remote, val, prior );
+    }
+    while ( prior != cur );
+
+    return prior;
+}
+
+
+/* CacheEnable
+ *  modify settings for caching files in user repositories
+ *
+ *  "enable" [ IN ] - enable or disable user repository cache,
+ *  or follow settings in KConfig
+ *
+ *  returns the previous state of "cache-enabled" property
+ *
+ * NB - in VDB-2, the state is associated with library code
+ *  shared libraries in separate closures will have separate
+ *  state. this can only occur if dynamic ( manual ) loading of
+ *  shared libraries is used, and will not occur with normal
+ *  usage. in VDB-3 the state will be stored with the process,
+ *  not the library.
+ */
+LIB_EXPORT
+VResolverEnableState CC VResolverCacheEnable ( const VResolver * self, VResolverEnableState enable )
+{
+    int32_t val, cur, prior;
+
+    if ( self == NULL )
+        return vrUseConfig;
+
+    /* convert "VResolverEnableState" to 32-bit signed integer for atomic operation */
+    val = ( int32_t ) enable;
+
+    /* before performing atomic swap, get the current setting,
+       and return right away if it is already set correctly */
+    prior = atomic32_read ( & enable_cache );
+    if ( prior != val ) do
+    {
+        cur = prior;
+        prior = atomic32_test_and_set ( & enable_cache, val, prior );
+    }
+    while ( prior != cur );
+
+    return prior;
+}
+
+
+/* RemoteResolve
+ *  resolve an accession into a remote VPath or not found
+ *  may optionally open a KFile to the object in the process
+ *  of finding it
+ *
+ *  2. determine the type of accession we have, i.e. its "app"
+ *  3. search all local algorithms of app type for accession
+ *  4. return not found or new VPath
+ */
+rc_t VResolverRemoteResolve ( const VResolver *self,
+    VRemoteProtocols protocols, const String * accession,
+    const VPath ** path, const VPath **mapping,
+    const KFile ** opt_file_rtn, bool refseq_ctx, bool is_oid )
+{
+    rc_t rc, try_rc;
+    uint32_t i, count;
+
+    VResolverAccToken tok;
+    VResolverAppID app, wildCard;
+    bool legacy_wgs_refseq = false;
+
+    VResolverEnableState remote_state = atomic32_read ( & enable_remote );
+
+    /* subject the accession to pattern recognition */
+    if ( ! is_oid )
+        app = get_accession_app ( accession, refseq_ctx, & tok, & legacy_wgs_refseq );
+    else
+    {
+        app = appAny;
+        VResolverAccTokenInitFromOID ( & tok, accession );
+    }
+
+    assert(self);
+
+    /* search all remote volumes by app and accession algorithm expansion */
+    count = VectorLength ( & self -> remote );
+
+    /* allow matching wildcard app */
+    wildCard = appAny;
+#if NO_REFSEQ_CGI
+    if ( app == appREFSEQ )
+        wildCard = -1;
+#endif
+
+    /* no error recorded yet */
+    rc = 0;
+
+    /* TBD - determine whether these settings interfere with
+       case of resolving oid to cache location */
+
+    /* test for forced enable, which applies only to main guys
+       TBD - limit to main sub-category */
+    if ( remote_state == vrAlwaysEnable )
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            const VResolverAlg *alg = VectorGet ( & self -> remote, i );
+            if ( alg -> app_id == app || alg -> app_id == wildCard )
+            {
+                try_rc = VResolverAlgRemoteResolve ( alg, self -> kns, protocols, & tok, path, mapping, opt_file_rtn, legacy_wgs_refseq );
+                if ( try_rc == 0 )
+                    return 0;
+                if ( rc == 0 )
+                    rc = try_rc;
+            }
+        }
+    }
+    else
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            const VResolverAlg *alg = VectorGet ( & self -> remote, i );
+            if ( ( alg -> app_id == app || alg -> app_id == wildCard ) && ! alg -> disabled )
+            {
+                try_rc = VResolverAlgRemoteResolve ( alg, self -> kns, protocols, & tok, path, mapping, opt_file_rtn, legacy_wgs_refseq );
+                if ( try_rc == 0 )
+                    return 0;
+                if ( rc == 0 )
+                    rc = try_rc;
+            }
+        }
+    }
+
+    if ( rc != 0 )
+        return rc;
+
+    return RC ( rcVFS, rcResolver, rcResolving, rcName, rcNotFound );
+}
+
+
+/* Remote
+ *  Find an existing remote file that is named by the accession.
+ *
+ *  rcState of rcNotFound means it did not exist and can not be 
+ *  downloaded. Probably a bad accession name.
+ *
+ *  Need a specific rc for no network configured.
+ *  Need a specific rc for network access permitted.
+ *
+ *  Other rc code for failure are possible.
+ *
+ *  Accession must be an ncbi-acc scheme or a simple name with no 
+ *  directory paths.
+ */
+LIB_EXPORT
+rc_t CC VResolverRemote ( const VResolver * self,
+    VRemoteProtocols protocols, const VPath * accession,
+    const VPath ** path )
+{
+    return VResolverQuery ( self, protocols, accession, NULL, path, NULL );
+}
+
+/* ExtractAccessionApp
+ *  examine a path for accession portion,
+ *  and try to recognize what app it belongs to
+ */
+static
+VResolverAppID VResolverExtractAccessionApp ( const VResolver *self,
+    const VPath * query, bool has_fragment,
+    String * accession, VResolverAccToken * tok,
+    bool *legacy_wgs_refseq )
+{
+    bool refseq_ctx = has_fragment;
+
+    * accession = query -> path;
+
+    if ( query -> fragment . size > 1 )
+        refseq_ctx = true;
+
+    /* should have something looking like an accession.
+       determine its app to see if we were successful */
+    return get_accession_app ( accession, refseq_ctx, tok, legacy_wgs_refseq );
+}
+
+static
+bool VPathHasDownloadTicket ( const VPath * url )
+{
+    size_t num_read;
+    char option [ 64 ];
+    rc_t rc = VPathOption ( url, vpopt_gap_ticket, option, sizeof option, & num_read );
+    return rc == 0;
+}
+
+static
+rc_t VPathExtractAcc ( const VPath * url, VPath ** acc )
+{
+    rc_t rc;
+    String accession;
+
+    /* locate last path or accession guy */
+    const char * start = string_rchr ( url -> path . addr, url -> path . size, '/' );
+    const char * sep, * end = url -> path . addr + url -> path . size;
+    if ( start ++ == NULL )
+        start = url -> path . addr;
+
+    /* strip off known extensions */
+    sep = string_rchr ( start, end - start, '.' );
+    while ( sep != NULL )
+    {
+        switch ( end - sep )
+        {
+        case 4:
+            if ( strcase_cmp ( ".sra", 4, sep, 4, 4 ) == 0 )
+                end = sep;
+            else if ( strcase_cmp ( ".wgs", 4, sep, 4, 4 ) == 0 )
+                end = sep;
+            break;
+        case 9:
+            if ( strcase_cmp ( ".vdbcache", 9, sep, 9, 9 ) == 0 ||
+                 strcase_cmp ( ".ncbi_enc", 9, sep, 9, 9 ) == 0 )
+            {
+                end = sep;
+                sep = string_rchr ( start, end - start, '.' );
+                continue;
+            }
+            break;
+        }
+        break;
+    }
+
+    /* this is the string */
+    StringInit ( & accession, start, end - start, string_len ( start, end - start ) );
+
+    /* now extract the mapping */
+    rc = LegacyVPathMakeFmt ( acc, "ncbi-acc:%S%S%S",
+        & accession, & url -> query, & url -> fragment );
+    if ( rc == 0 )
+    {
+        VPath * ap = * acc;
+
+        /* fix up case where we said accession but it was really a name */
+        if ( ap -> acc_code == 0 || ap -> path_type != vpAccession )
+            CONST_STRING ( & ap -> scheme, "ncbi-file" );
+    }
+
+    return rc;
+}
+
+static
+rc_t VResolverCacheResolve ( const VResolver *self,
+    const VPath * query, bool has_fragment,
+    const VPath ** cache, bool refseq_ctx )
+{
+    rc_t rc = 0;
+
+    String accession;
+    VResolverAccToken tok;
+    bool legacy_wgs_refseq = false;
+    VResolverAppID app = VResolverExtractAccessionApp ( self,
+        query, has_fragment, & accession, & tok, & legacy_wgs_refseq );
+
+    /* going to walk the local volumes, and remember
+       which one was best. actually, we have no algorithm
+       for determining it, so it's just the comment for TBD */
+    const VResolverAlg *alg, *better = NULL, *best = NULL;
+
+    /* search the volumes for a cache-enabled place */
+    uint32_t i, count = VectorLength ( & self -> local );
+
+    /* check for protected status by presence of a download ticket */
+    bool protected = VPathHasDownloadTicket ( query );
+
+    VResolverEnableState cache_state = atomic32_read ( & enable_cache );
+
+    /* check for cache-enable override */
+    if ( cache_state == vrAlwaysEnable )
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            alg = VectorGet ( & self -> local, i );
+            if ( alg -> cache_capable && alg -> protected == protected &&
+                 ( alg -> app_id == app || alg -> app_id == appAny ) )
+            {
+                /* try to find an existing cache file
+                   NB - race condition exists unless
+                   we do something with lock files */
+                rc = VResolverAlgCacheResolve ( alg, self -> wd, & tok, cache, legacy_wgs_refseq );
+                if ( rc == 0 )
+                    return 0;
+
+                /* just remember the first as best for now */
+                if ( alg -> app_id == app ) {
+                    if ( best == NULL )
+                        best = alg;
+                } else {
+                    assert ( alg -> app_id == appAny );
+                    if ( better == NULL )
+                        better = alg;
+                }
+            }
+        }
+    }
+    else
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            alg = VectorGet ( & self -> local, i );
+            if ( alg -> cache_enabled && alg -> protected == protected &&
+                 ( alg -> app_id == app || alg -> app_id == appAny ) )
+            {
+                /* try to find an existing cache file
+                   NB - race condition exists unless
+                   we do something with lock files */
+                rc = VResolverAlgCacheResolve ( alg, self -> wd, & tok, cache, legacy_wgs_refseq );
+                if ( rc == 0 )
+                    return 0;
+
+                /* just remember the first as best for now */
+                if ( best == NULL )
+                    best = alg;
+            }
+        }
+    }
+    
+    /* no existing cache file was found,
+       so create a new one using the best
+       TBD - this should remember a volume path */
+    if ( best == NULL && better == NULL )
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcPath, rcNotFound );
+    else {
+        alg = best == NULL ? better : best;
+        assert ( alg );
+        rc = VResolverAlgMakeCachePath ( alg, & tok, cache, legacy_wgs_refseq );
+    }
+
+    return rc;
+}
+
+static
+rc_t VResolverCacheFile ( const VResolver *self, const VPath * query, const VPath ** cache )
+{
+    rc_t rc = 0;
+
+    /* going to walk the local volumes, and remember
+       which one was best. actually, we have no algorithm
+       for determining it, so it's just the comment for TBD */
+    const VResolverAlg *alg, *best = NULL;
+
+    /* search the volumes for a cache-enabled place */
+    uint32_t i, count = VectorLength ( & self -> local );
+
+    /* check for protected status by presence of a download ticket */
+    bool protected = VPathHasDownloadTicket ( query );
+
+    VResolverEnableState cache_state = atomic32_read ( & enable_cache );
+
+    /* check for cache-enable override */
+    if ( cache_state == vrAlwaysEnable )
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            alg = VectorGet ( & self -> local, i );
+            if ( alg -> cache_capable && alg -> protected == protected && alg -> app_id == appFILE )
+            {
+                /* try to find an existing cache file
+                   NB - race condition exists unless
+                   we do something with lock files */
+                rc = VResolverAlgCacheFile ( alg, self -> wd, query, cache );
+                if ( rc == 0 )
+                    return 0;
+
+                /* just remember the first as best for now */
+                if ( best == NULL )
+                    best = alg;
+            }
+        }
+    }
+    else
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            alg = VectorGet ( & self -> local, i );
+            if ( alg -> cache_enabled && alg -> protected == protected && alg -> app_id == appFILE )
+            {
+                /* try to find an existing cache file
+                   NB - race condition exists unless
+                   we do something with lock files */
+                rc = VResolverAlgCacheFile ( alg, self -> wd, query, cache );
+                if ( rc == 0 )
+                    return 0;
+
+                /* just remember the first as best for now */
+                if ( best == NULL )
+                    best = alg;
+            }
+        }
+    }
+    
+    /* no existing cache file was found,
+       so create a new one using the best
+       TBD - this should remember a volume path */
+    if ( best == NULL )
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcPath, rcNotFound );
+    else
+        rc = VResolverAlgMakeCacheFilePath ( best, query, cache );
+
+    return rc;
+}
+
+
+/* Cache
+ *  Find a cache directory that might or might not contain a partially
+ *  downloaded file.
+ *
+ *  Accession must be an ncbi-acc scheme, an http url or a simple name with no 
+ *  directory paths. All three should return the same directory URL as a VPath. (?)
+ *  Or should it be a directory or a file url depending upon finding a partial
+ *  download? This would require co-ordination with all download mechanisms that
+ *  we permit.
+ *
+ *  With refseq holding wgs objects we have a case were the downloaded file is not
+ *  named the same as the original accession as the file archive you want is a
+ *  container for other files.
+ *
+ *  Find local will give a path that has a special scheme in these cases. 
+ *  Find remote will give the url for the container that contains the accession
+ *  so using the returned VPath from resolve remote is better than the original
+ *  accession in this one case.  I think...
+ */
+LIB_EXPORT
+rc_t CC VResolverCache ( const VResolver * self,
+    const VPath * url, const VPath ** path, uint64_t file_size )
+{
+    return VResolverQuery ( self, self -> protocols, url, NULL, NULL, path );
+}
+
+/* QueryOID
+ */
+
+static
+rc_t get_query_accession ( const VPath * query, String * accession, char * oid_str, size_t bsize )
+{
+    rc_t rc;
+
+    /* going to treat oid as accession */
+    * accession = query -> path;
+
+    /* if the VPath already gives us a numeral, great */
+    if ( query -> path . size != 0 && query -> path . addr [ 0 ] != '0' )
+        return 0;
+
+    /* otherwise, generate one on stack */
+    rc = string_printf ( oid_str, bsize, & accession -> size, "%u", query -> obj_id );
+    if ( rc == 0 )
+    {
+        accession -> addr = oid_str;
+        accession -> len = ( uint32_t ) accession -> size;
+    }
+
+    return rc;
+}
+
+static
+rc_t VResolverQueryOID ( const VResolver * self, VRemoteProtocols protocols,
+    const VPath * query, const VPath ** local, const VPath ** remote, const VPath ** cache )
+{
+    rc_t rc;
+
+    /* require non-zero oid */
+    if ( query -> obj_id == 0 )
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcPath, rcCorrupt );
+    else
+    {
+        /* temporary - no access to vfs
+           NB - this manager will either use a singleton
+           or create a new one with its existing config */
+        VFSManager * vfs;
+        rc = VFSManagerMake ( & vfs );
+        if ( rc == 0 )
+        {
+            char oid_str [ 32 ];
+            String accession;
+            VPath * mapped_query = NULL;
+
+            /* not expected to ever be true */
+            bool refseq_ctx = VPathHasRefseqContext ( query );
+
+            /* PREFACE - having an oid, we will need to map it to either
+               an accession or simple filename before resolving to a
+               local or cache path. there are two ways of getting this
+               mapping: either through the VFS manager, or by asking the
+               remote resolver CGI.
+
+               ASSUMPTION - if the file exists locally or is cached,
+               there should be a mapping available to VFS manager. this
+               assumption can fail if the mapping database has been lost
+               or damaged.
+            */
+
+            /* MAP OID TO ACCESSION */
+            if ( local != NULL || cache != NULL )
+            {
+                /* we want a mapping. ask VFS manager for one */
+                rc = VFSManagerGetObject ( vfs, query -> obj_id, & mapped_query );
+                if ( GetRCState ( rc ) == rcNotFound )
+                {
+                    /* no mapping could be found. another possibility is to resolve remotely */
+                    if ( remote != NULL || atomic32_read ( & enable_remote ) != vrAlwaysDisable )
+                    {
+                        rc = get_query_accession ( query, & accession, oid_str, sizeof oid_str );
+                        if ( rc == 0 )
+                        {
+                            const VPath * remote2, * remote_mapping = NULL;
+                            rc = VResolverRemoteResolve ( self, protocols, & accession,
+                                & remote2, & remote_mapping, NULL, refseq_ctx, true );
+                            if ( rc == 0 )
+                            {
+                                /* got it. now enter into VFS manager's table */
+                                rc = VFSManagerRegisterObject ( vfs, query -> obj_id, remote_mapping );
+                                if ( rc == 0 )
+                                {
+                                    mapped_query = ( VPath* ) remote_mapping;
+                                    remote_mapping = NULL;
+                                    if ( remote != NULL )
+                                    {
+                                        * remote = remote2;
+                                        remote2 = NULL;
+                                    }
+                                }
+
+                                VPathRelease ( remote2 );
+                                VPathRelease ( remote_mapping );
+                            }
+                        }
+                    }
+                }
+
+                if ( rc == 0 )
+                {
+                    assert ( mapped_query != NULL );
+
+                    /* the returned VPath should be of a usable type */
+                    assert ( mapped_query -> path_type == vpAccession       ||
+                             mapped_query -> path_type == vpNameOrAccession ||
+                             mapped_query -> path_type == vpName );
+                    assert ( mapped_query -> path . size != 0 );
+                }
+            }
+
+            /* RESOLVE FOR LOCAL PATH */
+            if ( local != NULL && mapped_query != NULL )
+            {
+                if ( mapped_query -> path_type == vpName )
+                {
+                    /* see if this is a file stored locally */
+                    rc = VResolverLocalFile ( self, mapped_query, local );
+                }
+                else
+                {
+                    /* grab the path as accession */
+                    accession = mapped_query -> path;
+
+                    /* resolve from accession to local path
+                       will NOT find partial cache files */
+                    rc = VResolverLocalResolve ( self, & accession, local, refseq_ctx );
+                }
+
+                if ( rc == 0 && remote != NULL && * remote != NULL )
+                {
+                    /* dump remote path used to map oid */
+                    VPathRelease ( * remote );
+                    * remote = NULL;
+                }
+            }
+
+            if ( local == NULL || * local == NULL )
+            {
+                bool has_fragment = false;
+
+                /* RESOLVE FOR REMOTE */
+                if ( remote != NULL && * remote == NULL )
+                {
+                    rc = get_query_accession ( query, & accession, oid_str, sizeof oid_str );
+                    if ( rc == 0 )
+                    {
+                        const VPath * remote_mapping = NULL;
+                        rc = VResolverRemoteResolve ( self, protocols, & accession, remote,
+                            ( mapped_query == NULL && cache != NULL ) ? & remote_mapping : NULL,
+                            NULL, refseq_ctx, true );
+
+                        if ( rc == 0 && mapped_query == NULL && cache != NULL && remote_mapping == NULL )
+                        {
+                            /* THIS IS LIKELY AN INTERNAL ERROR
+                               EITHER THE CGI DID NOT RETURN A MAPPING
+                               OR WE DID NOT PROPERLY PARSE IT */
+                            VPathRelease ( * remote );
+                            rc = RC ( rcVFS, rcResolver, rcResolving, rcPath, rcNull );
+                        }
+
+                        /* register new mapping */
+                        if ( rc == 0 )
+                        {
+                            assert ( * remote != NULL );
+                            if ( ( * remote ) -> fragment . size != 0 )
+                                has_fragment = true;
+                            if ( remote_mapping != NULL )
+                            {
+                                rc = VFSManagerRegisterObject ( vfs, query -> obj_id, remote_mapping );
+                                if ( rc == 0 )
+                                {
+                                    mapped_query = ( VPath* ) remote_mapping;
+                                    remote_mapping = NULL;
+                                }
+                                VPathRelease ( remote_mapping );
+                            }
+                        }
+                    }
+                }
+
+                /* RESOLVE FOR CACHE */
+                if ( ( remote == NULL || * remote != NULL ) && cache != NULL && mapped_query != NULL )
+                {
+                    /* test for file or accession */
+                    if ( mapped_query -> path_type == vpName )
+                    {
+                        /* see if this is a file stored locally */
+                        rc = VResolverCacheFile ( self, mapped_query, cache );
+                    }
+                    else
+                    {
+                        /* resolve from accession to cache path */
+                        rc = VResolverCacheResolve ( self, mapped_query, has_fragment, cache, refseq_ctx );
+                    }
+                    if ( rc != 0 && remote != NULL )
+                    {
+                        assert ( * cache == NULL );
+                        VPathRelease ( * remote );
+                        * remote = NULL;
+                    }
+                }
+            }
+
+            VPathRelease ( mapped_query );
+
+            VFSManagerRelease ( vfs );
+        }
+    }
+
+    return rc;
+}
+
+/* QueryAcc
+ */
+static
+rc_t VResolverQueryAcc ( const VResolver * self, VRemoteProtocols protocols,
+    const VPath * query, const VPath ** local, const VPath ** remote, const VPath ** cache )
+{
+    rc_t rc = 0;
+
+    /* the accession should be directly usable */
+    const String * accession = & query -> path;
+
+    /* check if it is intended to locate a legacy refseq object */
+    bool refseq_ctx = VPathHasRefseqContext ( query );
+
+    /* will be needed to consult CGI */
+    const VPath * remote2 = NULL, * mapped_query = NULL;
+
+    /* LOCAL RESOLUTION */
+    if ( local != NULL )
+        rc = VResolverLocalResolve ( self, accession, local, refseq_ctx );
+
+    if ( local == NULL || * local == NULL )
+    {
+        bool has_fragment = false;
+
+        /* REMOTE RESOLUTION */
+        if ( remote != NULL || ( self -> ticket != NULL && cache != NULL ) )
+        {
+            /* will need to map if protected */
+            const VPath ** mapped_ptr = ( self -> ticket != NULL && cache != NULL ) ?
+                & mapped_query : NULL;
+
+            /* request remote resolution
+               this does not need to map the query to an accession */
+            rc = VResolverRemoteResolve ( self, protocols, accession,
+                & remote2, mapped_ptr, NULL, refseq_ctx, false );
+
+            if ( rc == 0 )
+            {
+                if ( remote2 -> fragment . size != 0 )
+                    has_fragment = true;
+
+                if ( remote != NULL )
+                    * remote = remote2;
+                else
+                    VPathRelease ( remote2 );
+
+                remote2 = NULL;
+            }
+        }
+
+        if ( ( remote == NULL || * remote != NULL ) && cache != NULL )
+        {
+            if ( mapped_query != NULL )
+                rc = VResolverCacheResolve ( self, mapped_query, has_fragment, cache, refseq_ctx );
+#if 0
+            /* the bad assumption that every remotely retrieved accession MUST be mapped */
+            else if ( self -> ticket != NULL )
+                rc = RC ( rcVFS, rcResolver, rcResolving, rcPath, rcNotFound );
+#endif
+            else
+                rc = VResolverCacheResolve ( self, query, has_fragment, cache, refseq_ctx );
+
+            if ( rc != 0 && remote != NULL )
+            {
+                assert ( * cache == NULL );
+                if ( GetRCState ( rc ) == rcNotFound )
+                    rc = 0;
+                else
+                {
+                    VPathRelease ( * remote );
+                    * remote = NULL;
+                }
+            }
+        }
+
+        if ( mapped_query != NULL )
+            VPathRelease ( mapped_query );
+    }
+
+    return rc;
+}
+
+/* QueryPath
+ *  this behavior may not be correct
+ *  perhaps we should reject paths upon input,
+ *  and only resolve things that need resolving
+ *  but there is a thought that we can also transform paths
+ */
+static
+rc_t VResolverQueryPath ( const VResolver * self, const VPath * query, const VPath ** local )
+{
+    rc_t rc;
+
+    if ( local == NULL )
+        return RC ( rcVFS, rcResolver, rcResolving, rcPath, rcNotFound );
+
+    switch ( KDirectoryPathType ( self -> wd, "%.*s", ( int ) query -> path . size, query -> path . addr ) )
+    {
+    case kptFile:
+    case kptDir:
+    case kptCharDev:
+    case kptBlockDev:
+    case kptFIFO:
+    case kptFile | kptAlias:
+    case kptDir | kptAlias:
+    case kptCharDev | kptAlias:
+    case kptBlockDev | kptAlias:
+    case kptFIFO | kptAlias:
+        break;
+    default:
+        return RC ( rcVFS, rcResolver, rcResolving, rcPath, rcNotFound );
+    }
+
+    rc = VPathAddRef ( query );
+    if ( rc == 0 )
+        * local = query;
+
+    return rc;
+}
+
+
+/* QueryName
+ *  may eventually look for the name in local cache,
+ *  but for now just return it as a path
+ */
+static
+rc_t VResolverQueryName ( const VResolver * self, VRemoteProtocols protocols,
+    const VPath * query, const VPath ** local, const VPath ** remote, const VPath ** cache )
+{
+    return VResolverQueryPath ( self, query, local );
+}
+
+
+/* QueryURL
+ *  URL resolves to itself for remote and potentially to a path for cache
+ */
+static
+rc_t VResolverQueryURL ( const VResolver * self, VRemoteProtocols protocols,
+    const VPath * query, const VPath ** remote, const VPath ** cache )
+{
+    rc_t rc = 0;
+
+    /* if neither remote nor cache, then must have requested local,
+       and a URL cannot be resolved to local in our world... */
+    if ( ( ( size_t ) remote | ( size_t ) cache ) == 0 )
+        return RC ( rcVFS, rcResolver, rcResolving, rcPath, rcIncorrect );
+
+    /* the URL always resolves to itself for remote */
+    if ( remote != NULL )
+    {
+        rc = VPathAddRef ( query );
+        if ( rc != 0 )
+            return rc;
+        * remote = query;
+    }
+
+    /* if we want a cache location, then try to resolve it */
+    if ( cache != NULL )
+    {
+        VPath *mapping;
+
+        /* check for refseq context */
+        bool refseq_ctx = VPathHasRefseqContext ( query );
+
+        /* first, extract accession or name from URL */
+        rc = VPathExtractAcc ( query, & mapping );
+        if ( rc == 0 )
+        {
+            /* now map to cache location */
+            rc = VResolverCacheResolve ( self, mapping, false, cache, refseq_ctx );
+            VPathRelease ( mapping );
+            if ( GetRCState ( rc ) == rcNotFound && remote != NULL )
+                rc = 0;
+        }
+
+        /* any error must invalidate "remote" */
+        if ( rc != 0 && remote != NULL )
+        {
+            VPathRelease ( * remote );
+            * remote = NULL;
+        }
+    }
+
+    return rc;
+}
+
+
+/* Query
+ *  resolve object location to either an existing local path,
+ *  or a pair of remote URL + local cache location.
+ *
+ *  "protocols" [ IN ] - the desired protocols for remote resolution
+ *
+ *  "query" [ IN ] - a path that can represent:
+ *     accession : a recognizable accession from NCBI or known organization
+ *     obj-id    : a dbGaP object id
+ *     path      : a filesystem path
+ *     url       : a remote location
+ *
+ *  "local" [ OUT, NULL OKAY ] - optional return parameter for local path:
+ *     accession : resolve to local user or site path
+ *     obj-id    : resolve to local user protected path
+ *     path      : return duplicate of input
+ *     url       : set to NULL
+ *
+ *  "remote" [ OUT, NULL OKAY ] - optional return parameter for remote path:
+ *     accession : resolve to URL
+ *     obj-id    : resolve to URL
+ *     path      : set to NULL
+ *     url       : set to duplicate
+ *
+ *  "cache" [ OUT, NULL OKAY ] - optional return parameter for cache path:
+ *     accession : resolve to user cache path
+ *     obj-id    : resolve to user cache path
+ *     path      : set to NULL
+ *     url       : resolve to user cache path
+ *
+ *  any of the output parameters may be NULL, but not all, i.e. there
+ *  must be at least one non-NULL return parameter.
+ *
+ *  if you DON'T want local resolution, pass NULL for "local" and
+ *  the query will be resolved remotely. if you don't want remote
+ *  resolution, pass NULL for "remote".
+ *
+ *  a query that is resolved locally will always return NULL for
+ *  "remote" and "cache", if the parameters are provided.
+ */
+static
+rc_t VResolverQueryInt ( const VResolver * self, VRemoteProtocols protocols,
+    const VPath * query, const VPath ** local, const VPath ** remote, const VPath ** cache )
+{
+    rc_t rc;
+
+    if ( ( ( size_t ) local | ( size_t ) remote | ( size_t ) cache ) == 0 )
+        rc = RC ( rcVFS, rcResolver, rcResolving, rcParam, rcNull );
+    else
+    {
+        if ( protocols == 0 )
+            protocols = self -> protocols;
+
+        if ( local != NULL )
+        {
+            * local = NULL;
+            if ( atomic32_read ( & enable_local ) == vrAlwaysDisable )
+                local = NULL;
+        }
+
+        if ( remote != NULL )
+        {
+            VRemoteProtocols remote_protos;
+
+            * remote = NULL;
+
+            if ( protocols > VRemoteProtocolsMake3 ( eProtocolMax, eProtocolMax, eProtocolMax ) )
+                return RC ( rcVFS, rcResolver, rcUpdating, rcParam, rcInvalid );
+
+            for ( remote_protos = protocols; remote_protos != 0; remote_protos >>= 3 )
+            {
+                VRemoteProtocols proto = remote_protos & eProtocolMask;
+                if ( proto == eProtocolNone || proto > eProtocolMax )
+                    return RC ( rcVFS, rcResolver, rcUpdating, rcParam, rcInvalid );
+            }
+
+            if ( atomic32_read ( & enable_remote ) == vrAlwaysDisable )
+                remote = NULL;
+        }
+
+        if ( cache != NULL )
+        {
+            * cache = NULL;
+            if ( atomic32_read ( & enable_cache ) == vrAlwaysDisable )
+                cache = NULL;
+        }
+
+        if ( self == NULL )
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcSelf, rcNull );
+        else if ( query == NULL )
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcPath, rcNull );
+        else if ( ( ( size_t ) local | ( size_t ) remote | ( size_t ) cache ) == 0 )
+            rc = RC ( rcVFS, rcResolver, rcResolving, rcPath, rcNotFound );
+        else
+        {
+            uint32_t i;
+
+            /* record requested protocols */
+            bool has_proto [ eProtocolMask + 1 ];
+            memset ( has_proto, 0, sizeof has_proto );
+
+            for ( i = 0; i < eProtocolMaxPref; ++ i )
+                has_proto [ ( ( protocols >> ( i * 3 ) ) & eProtocolMask ) ] = true;
+
+            switch ( query -> scheme_type )
+            {
+            case vpuri_none:
+            case vpuri_ncbi_file:
+            case vpuri_file:
+            case vpuri_ncbi_acc:
+            case vpuri_ncbi_obj:
+                break;
+
+            case vpuri_http:
+                /* check for all that allow http */
+                if ( has_proto [ eProtocolHttp ] )
+                    return VResolverQueryURL ( self, protocols, query, remote, cache );
+                return RC ( rcVFS, rcResolver, rcResolving, rcPath, rcIncorrect );
+
+            case vpuri_https:
+                /* check for all that allow https */
+                if ( has_proto [ eProtocolHttps ] )
+                    return VResolverQueryURL ( self, protocols, query, remote, cache );
+                return RC ( rcVFS, rcResolver, rcResolving, rcPath, rcIncorrect );
+
+            case vpuri_fasp:
+                /* check for all that allow fasp */
+                if ( has_proto [ eProtocolFasp ] )
+                    return VResolverQueryURL ( self, protocols, query, remote, cache );
+                return RC ( rcVFS, rcResolver, rcResolving, rcPath, rcIncorrect );
+
+            default:
+                return RC ( rcVFS, rcResolver, rcResolving, rcPath, rcIncorrect );
+            }
+
+            switch ( query -> path_type )
+            {
+            case vpInvalid:
+                rc = RC ( rcVFS, rcResolver, rcResolving, rcPath, rcInvalid );
+                break;
+
+            case vpOID:
+                rc = VResolverQueryOID ( self, protocols, query, local, remote, cache );
+                break;
+
+            case vpAccession:
+                rc = VResolverQueryAcc ( self, protocols, query, local, remote, cache );
+                break;
+
+            case vpNameOrOID:
+                rc = VResolverQueryOID ( self, protocols, query, local, remote, cache );
+                if ( rc != 0 )
+                    goto try_name;
+                break;
+
+            case vpNameOrAccession:
+                rc = VResolverQueryAcc ( self, protocols, query, local, remote, cache );
+                if ( rc != 0 )
+                    goto try_name;
+                break;
+
+            case vpName:
+                /* try to handle a weird case with non-accessioned names in refseq area */
+                if ( query -> query . size != 0 )
+                {
+                    if ( VPathHasRefseqContext ( query ) )
+                    {
+                        rc = VResolverQueryAcc ( self, protocols, query, local, remote, cache );
+                        if ( rc == 0 )
+                            break;
+                    }
+                }
+            try_name:
+                rc = VResolverQueryName ( self, protocols, query, local, remote, cache );
+                break;
+
+            case vpRelPath:
+            case vpFullPath:
+            case vpUNCPath:
+                rc = VResolverQueryPath ( self, query, local );
+                break;
+
+            default:
+                rc = RC ( rcVFS, rcResolver, rcResolving, rcPath, rcIncorrect );
+            }
+        }
+    }
+
+    return rc;
+}
+
+LIB_EXPORT
+rc_t CC VResolverQuery ( const VResolver * self, VRemoteProtocols protocols,
+    const VPath * query, const VPath ** local, const VPath ** remote, const VPath ** cache )
+{
+    rc_t rc = VResolverQueryInt ( self, protocols, query, local, remote, cache );
+    if ( rc == 0 )
+    {
+        /* the paths returned from resolver are highly reliable */
+        if ( local != NULL && * local != NULL )
+            VPathMarkHighReliability ( * ( VPath ** ) local, true );
+        if ( remote != NULL && * remote != NULL )
+            VPathMarkHighReliability ( * ( VPath ** ) remote, true );
+        if ( cache != NULL && * cache != NULL )
+            VPathMarkHighReliability ( * ( VPath ** ) cache, true );
+    }
+    return rc;
+}
+
+/* LoadVolume
+ *  capture volume path and other information
+ */
+static
+rc_t VResolverAlgLoadVolume ( VResolverAlg *self, uint32_t *num_vols, const char *start, size_t size )
+{
+    rc_t rc = 0;
+
+#if 0
+    /* trim volume whitespace */
+    while ( size != 0 && isspace ( start [ 0 ] ) )
+    {
+        ++ start;
+        -- size;
+    }
+    while ( size != 0 && isspace ( start [ size - 1 ] ) )
+        -- size;
+#endif
+
+    /* trim trailing slashes */
+    while ( size != 0 && start [ size - 1 ] == '/' )
+        -- size;
+
+    /* now see if the string survives */
+    if ( size != 0 )
+    {
+        String loc_vol_str;
+        const String *vol_str;
+        StringInit ( & loc_vol_str, start, size, string_len ( start, size ) );
+        rc = StringCopy ( & vol_str, & loc_vol_str );
+        if ( rc == 0 )
+        {
+            rc = VectorAppend ( & self -> vols, NULL, vol_str );
+            if ( rc == 0 )
+            {
+                * num_vols += 1;
+                return 0;
+            }
+
+            StringWhack ( vol_str );
+        }
+    }
+
+    return rc;
+}
+
+/* LoadVolumes
+ *
+ *    path-list
+ *        = PATH
+ *        | <path-list> ':' PATH ;
+ */
+static
+rc_t VResolverAlgLoadVolumes ( VResolverAlg *self, uint32_t *num_vols, const String *vol_list )
+{
+    const char *start = vol_list -> addr;
+    const char *end = & vol_list -> addr [ vol_list -> size ];
+    const char *sep = string_chr ( start, end - start, ':' );
+    while ( sep != NULL )
+    {
+        rc_t rc = VResolverAlgLoadVolume ( self, num_vols, start, sep - start );
+        if ( rc != 0 )
+            return rc;
+        start = sep + 1;
+        sep = string_chr ( start, end - start, ':' );
+    }
+    return VResolverAlgLoadVolume ( self, num_vols, start, end - start );
+}
+
+/* LoadAlgVolumes
+ *
+ *    volumes
+ *        = <path-list> ;
+ */
+static
+rc_t VResolverLoadAlgVolumes ( Vector *algs, const String *root,
+    const String *ticket, bool cache_capable, VResolverAppID app_id,
+    VResolverAlgID alg_id, uint32_t *num_vols, const String *vol_list,
+    bool protected, bool disabled, bool cacheEnabled )
+{
+    VResolverAlg *alg;
+    rc_t rc = VResolverAlgMake ( & alg, root, app_id, alg_id, protected, disabled );
+    if ( rc == 0 )
+    {
+        alg -> ticket = ticket;
+        alg -> cache_capable = cache_capable;
+        alg -> cache_enabled = cacheEnabled;
+
+        if ( ticket != NULL )
+            alg -> alg_id = algCGI;
+
+        rc = VResolverAlgLoadVolumes ( alg, num_vols, vol_list );
+        if ( rc == 0 && VectorLength ( & alg -> vols ) != 0 )
+        {
+            rc = VectorAppend ( algs, NULL, alg );
+            if ( rc == 0 )
+                return 0;
+        }
+
+        VResolverAlgWhack ( alg, NULL );
+    }
+
+    return rc;
+}
+
+/* LoadApp
+ *
+ *    alg-block
+ *        = <alg-type> <volumes> ;
+ *
+ *    alg-type
+ *        = "flat" | "sraFlat" | "sra1024" | "sra1000" | "fuse1000"
+ *        | "refseq" | "wgs" | "wgsFlag" | "fuseWGS"
+ *        | "ncbi" | "ddbj" | "ebi"
+ *        | "nannot" | "nannotFlat" | "fuseNANNOT" | "pileupNCBI" | "pileupEBI" | "pileupDDBJ" ;
+ */
+static
+rc_t VResolverLoadVolumes ( Vector *algs, const String *root,
+    const String *ticket, bool cache_capable, VResolverAppID app_id,
+    uint32_t *num_vols, const KConfigNode *vols, bool resolver_cgi,
+     bool protected, bool disabled, bool cacheEnabled )
+{
+    KNamelist *algnames;
+    rc_t rc = KConfigNodeListChildren ( vols, & algnames );
+    if ( rc == 0 )
+    {
+        uint32_t i, count;
+        rc = KNamelistCount ( algnames, & count );
+        for ( i = 0; i < count && rc == 0; ++ i )
+        {
+            const char *algname;
+            rc = KNamelistGet ( algnames, i, & algname );
+            if ( rc == 0 )
+            {
+                const KConfigNode *alg;
+                rc = KConfigNodeOpenNodeRead ( vols, & alg, "%s", algname );
+                if ( rc == 0 )
+                {
+                    VResolverAlgID alg_id = algUnknown;
+
+                    /* if using CGI for resolution */
+                    if ( resolver_cgi || strcmp ( algname, "cgi" ) == 0 )
+                        alg_id = algCGI;
+                    /* stored in a flat directory as-is */
+                    else if ( strcmp ( algname, "flat" ) == 0 )
+                        alg_id = algFlat;
+                    /* stored in a flat directory with ".sra" extension */
+                    else if ( strcmp ( algname, "sraFlat" ) == 0 )
+                        alg_id = algSRAFlat;
+                    /* stored in a three-level directory with 1K banks and ".sra" extension */
+                    else if ( strcmp ( algname, "sra1024" ) == 0 )
+                        alg_id = algSRA1024;
+                    /* stored in a three-level directory with 1000 banks and ".sra" extension */
+                    else if ( strcmp ( algname, "sra1000" ) == 0 )
+                        alg_id = algSRA1000;
+                    /* stored in a four-level directory with 1000 banks and ".sra" extension */
+                    else if ( strcmp ( algname, "fuse1000" ) == 0 )
+                        alg_id = algFUSE1000;
+                    /* stored in a flat directory with no extension */
+                    else if ( strcmp ( algname, "refseq" ) == 0 )
+                        alg_id = algREFSEQ;
+                    /* stored in a flat directory with no extension */
+                    else if ( strcmp ( algname, "wgsFlat" ) == 0 )
+                        alg_id = algWGSFlat;
+                    /* stored in a multi-level directory with no extension */
+                    else if ( strcmp ( algname, "wgs" ) == 0 )
+                        alg_id = algWGS;
+                    else if ( strcmp ( algname, "wgs2" ) == 0 )
+                        alg_id = algWGS2;
+                    else if ( strcmp ( algname, "fuseWGS" ) == 0 )
+                        alg_id = algFuseWGS;
+                    /* stored in a three-level directory with 1K banks and no extension */
+                    else if ( strcmp ( algname, "ncbi" ) == 0 ||
+                              strcmp ( algname, "ddbj" ) == 0 )
+                        alg_id = algSRA_NCBI;
+                    /* stored in a three-level directory with 1000 banks and no extension */
+                    else if ( strcmp ( algname, "ebi" ) == 0 )
+                        alg_id = algSRA_EBI;
+
+                    /* new named annotation */
+                    else if ( strcmp ( algname, "nannotFlat" ) == 0 )
+                        alg_id = algNANNOTFlat;
+                    else if ( strcmp ( algname, "nannot" ) == 0 )
+                        alg_id = algNANNOT;
+                    else if ( strcmp ( algname, "fuseNANNOT" ) == 0 )
+                        alg_id = algFuseNANNOT;
+
+                    /* new named annotation */
+                    else if ( strcmp ( algname, "nakmerFlat" ) == 0 )
+                        alg_id = algNAKMERFlat;
+                    else if ( strcmp ( algname, "nakmer" ) == 0 )
+                        alg_id = algNAKMER;
+                    else if ( strcmp ( algname, "fuseNAKMER" ) == 0 )
+                        alg_id = algFuseNAKMER;
+                    
+                    /* pileup files */
+                    else if ( strcmp ( algname, "pileupNCBI" ) == 0 )
+                        alg_id = algPileup_NCBI;
+                    else if ( strcmp ( algname, "pileupEBI" ) == 0 )
+                        alg_id = algPileup_EBI;
+                    else if ( strcmp ( algname, "pileupDDBJ" ) == 0 )
+                        alg_id = algPileup_DDBJ;
+
+                    if ( alg_id != algUnknown )
+                    {
+                        String *vol_list;
+                        rc = KConfigNodeReadString ( alg, & vol_list );
+                        if ( rc == 0 )
+                        {
+                            if ( StringLength ( vol_list ) != 0 )
+                            {
+                                rc = VResolverLoadAlgVolumes ( algs,
+                                    root, ticket, cache_capable,
+                                    app_id, alg_id, num_vols, vol_list,
+                                    protected, disabled, cacheEnabled );
+                            }
+                            StringWhack ( vol_list );
+                        }
+                    }
+
+                    KConfigNodeRelease ( alg );
+                }
+            }
+        }
+
+        KNamelistRelease ( algnames );
+    }
+    return rc;
+}
+
+/* LoadApp
+ *
+ *    app
+ *        = [ <disabled> ] [ <cache-enabled> ] <vol-group> ;
+ *
+ *    disabled
+ *        = "disabled" '=' ( "true" | "false" ) ;
+ *
+ *    cache-enabled
+ *        = "cache-enabled" '=' ( "true" | "false" ) ;
+ *
+ *    vol-group
+ *        = "volumes" <alg-block>* ;
+ */
+static
+rc_t VResolverLoadApp ( VResolver *self, Vector *algs, const String *root,
+    const String *ticket, bool cache_capable, VResolverAppID app_id,
+    uint32_t *num_vols, const KConfigNode *app, bool resolver_cgi,
+    bool protected, bool disabled, bool cacheEnabled )
+{
+    const KConfigNode *node;
+
+    /* test for disabled app - it is entirely possible */
+    rc_t rc = KConfigNodeOpenNodeRead ( app, & node, "disabled" );
+    if ( rc == 0 )
+    {
+        bool app_disabled = false;
+        rc = KConfigNodeReadBool ( node, & app_disabled );
+        KConfigNodeRelease ( node );
+        if ( rc == 0 && app_disabled && algs == & self -> local )
+            return 0;
+        disabled |= app_disabled;
+    }
+
+    /* test again for cache enabled */
+    if ( cache_capable && cacheEnabled )
+    {
+        rc = KConfigNodeOpenNodeRead ( app, & node, "cache-enabled" );
+        if ( rc == 0 )
+        {
+            /* allow this node to override current value */
+            bool cache;
+            rc = KConfigNodeReadBool ( node, & cache );
+            KConfigNodeRelease ( node );
+            if ( rc == 0 )
+                cacheEnabled = cache;
+        }
+    }
+
+    /* get volumes */
+    rc = KConfigNodeOpenNodeRead ( app, & node, "volumes" );
+    if ( GetRCState ( rc ) == rcNotFound )
+        rc = 0;
+    else if ( rc == 0 )
+    {
+        rc = VResolverLoadVolumes ( algs, root, ticket, cache_capable, app_id,
+            num_vols, node, resolver_cgi, protected, disabled, cacheEnabled );
+        KConfigNodeRelease ( node );
+    }
+
+    return rc;
+}
+
+/* LoadApps
+ *
+ *    app-block
+ *        = <app-name> <app> ;
+ *
+ *    app-name
+ *        = "refseq" | "sra" | "wgs" | "nannot" | "nakmer" | "sraPileup" ;
+ */
+static
+rc_t VResolverLoadApps ( VResolver *self, Vector *algs, const String *root,
+    const String *ticket, bool cache_capable, const KConfigNode *apps,
+    bool resolver_cgi, bool protected, bool disabled, bool cacheEnabled )
+{
+    KNamelist *appnames;
+    rc_t rc = KConfigNodeListChildren ( apps, & appnames );
+    if ( rc == 0 )
+    {
+        uint32_t i, count;
+        rc = KNamelistCount ( appnames, & count );
+        if ( resolver_cgi && rc == 0 && count == 0 )
+        {
+            VResolverAlg *cgi;
+            rc = VResolverAlgMake ( & cgi, root, appAny, algCGI, protected, disabled );
+            if ( rc == 0 )
+            {
+                rc = VectorAppend ( algs, NULL, cgi );
+                if ( rc == 0 )
+                {
+                    ++ self -> num_app_vols [ appAny ];
+                    return 0;
+                }
+            }
+        }
+        else for ( i = 0; i < count && rc == 0; ++ i )
+        {
+            const char *appname;
+            rc = KNamelistGet ( appnames, i, & appname );
+            if ( rc == 0 )
+            {
+                const KConfigNode *app;
+                rc = KConfigNodeOpenNodeRead ( apps, & app, "%s", appname );
+                if ( rc == 0 )
+                {
+                    VResolverAppID app_id = appUnknown;
+                    if ( strcmp ( appname, "file" ) == 0 )
+                        app_id = appFILE;
+                    else if ( strcmp ( appname, "nakmer" ) == 0 )
+                        app_id = appNAKMER;
+                    else if ( strcmp ( appname, "nannot" ) == 0 )
+                        app_id = appNANNOT;
+                    else if ( strcmp ( appname, "refseq" ) == 0 )
+                        app_id = appREFSEQ;
+                    else if ( strcmp ( appname, "sra" ) == 0 )
+                        app_id = appSRA;
+                    else if ( strcmp ( appname, "wgs" ) == 0 )
+                        app_id = appWGS;
+                    else if ( strcmp ( appname, "sraPileup" ) == 0 )
+                        app_id = appSRAPileup;
+
+                    rc = VResolverLoadApp ( self, algs, root, ticket,
+                        cache_capable, app_id,
+                        & self -> num_app_vols [ app_id ], app, resolver_cgi,
+                        protected, disabled, cacheEnabled );
+
+                    KConfigNodeRelease ( app );
+                }
+            }
+        }
+        KNamelistRelease ( appnames );
+    }
+    return rc;
+}
+
+typedef uint32_t EDisabled;
+enum {
+    eDisabledSet,
+    eEnabledSet,
+    eDisabledNotSet,
+};
+
+/* LoadRepo
+ *
+ *    repository
+ *        = [ <disabled> ] [ <cache-enabled> ] <root> <app-group> ;
+ *
+ *    disabled
+ *        = "disabled" '=' ( "true" | "false" ) ;
+ *
+ *    cache-enabled
+ *        = "cache-enabled" '=' ( "true" | "false" ) ;
+ *
+ *    root
+ *        = "root" '=' PATH ;
+ *
+ *    app-group
+ *        = "apps" <app-block>* ;
+ */
+static
+rc_t VResolverLoadRepo ( VResolver *self, Vector *algs, const KConfigNode *repo,
+    const String *ticket, bool cache_capable, bool protected,
+    EDisabled isDisabled, bool cacheEnabled )
+{
+    rc_t rc = 0;
+    const KConfigNode *node;
+    bool resolver_cgi;
+
+    /* test for disabled repository */
+    bool disabled = false;
+    switch (isDisabled) {
+        case eDisabledSet:
+            disabled = true;
+            break;
+        case eEnabledSet:
+            disabled = false;
+            break;
+        case eDisabledNotSet:
+            rc = KConfigNodeOpenNodeRead ( repo, & node, "disabled" );
+            if ( rc == 0 )
+            {
+                rc = KConfigNodeReadBool ( node, & disabled );
+                KConfigNodeRelease ( node );
+            }
+            break;
+    }
+
+    /* don't bother recording local, disabled repositories */
+    if ( rc == 0 && disabled && algs == & self -> local )
+        return 0;
+
+    /* Check for cache-enabled.
+       Cache-capable repositories cannot be remote.
+       we do not check "cache-enabled" for not cache_capable repositories */
+    if ( cacheEnabled ) {
+        cacheEnabled = cache_capable;
+    }
+    if ( cacheEnabled )
+    {
+        rc = KConfigNodeOpenNodeRead ( repo, & node, "cache-enabled" );
+        if ( rc == 0 )
+        {
+            rc = KConfigNodeReadBool ( node, & cacheEnabled );
+            KConfigNodeRelease ( node );
+            if ( rc != 0 )
+                cacheEnabled = false;
+        }
+    }
+
+    resolver_cgi = false;
+    if ( cache_capable )
+        rc = KConfigNodeOpenNodeRead ( repo, & node, "root" );
+    else
+    {
+        /* check for specific resolver CGI */
+        rc = KConfigNodeOpenNodeRead ( repo, & node, "resolver-cgi" );
+        if ( rc == 0 )
+            resolver_cgi = true;
+        /* or get the repository root */
+        else if ( GetRCState ( rc ) == rcNotFound )
+        {
+            rc = KConfigNodeOpenNodeRead ( repo, & node, "root" );
+        }
+    }
+    if ( GetRCState ( rc ) == rcNotFound )
+        rc = 0;
+    else if ( rc == 0 )
+    {
+        /* read root as String */
+        String *root;
+        rc = KConfigNodeReadString ( node, & root );
+        KConfigNodeRelease ( node );
+        if ( GetRCState ( rc ) == rcNotFound )
+            rc = 0;
+        else if ( rc == 0 )
+        {
+            /* perform a bit of cleanup on root */
+            while ( root -> size != 0 && root -> addr [ root -> size - 1 ] == '/' )
+            {
+                /* this is terribly nasty, but known to be safe */
+                -- root -> len;
+                -- root -> size;
+            }
+
+            /* store string on VResolver for management purposes,
+               pass the loaned reference to sub-structures */
+            rc = VectorAppend ( & self -> roots, NULL, root );
+            if ( rc != 0 )
+                StringWhack ( root );
+            else
+            {
+                /* open the "apps" sub-node */
+                rc = KConfigNodeOpenNodeRead ( repo, & node, "apps" );
+                if ( rc == 0 )
+                {
+                    rc = VResolverLoadApps ( self, algs, root, ticket,
+                        cache_capable, node, resolver_cgi,
+                        protected, disabled, cacheEnabled );
+                    KConfigNodeRelease ( node );
+                }
+                else if ( GetRCState ( rc ) == rcNotFound )
+                {
+                    rc = 0;
+                    if ( resolver_cgi )
+                    {
+                        VResolverAlg *cgi;
+                        rc = VResolverAlgMake ( & cgi, root, appAny, algCGI, protected, disabled );
+                        if ( rc == 0 )
+                        {
+                            cgi -> ticket = ticket;
+
+                            rc = VectorAppend ( algs, NULL, cgi );
+                            if ( rc == 0 )
+                            {
+                                ++ self -> num_app_vols [ appAny ];
+                                return 0;
+                            }
+                        }
+
+                        VResolverAlgWhack ( cgi, NULL );
+                    }
+                }
+            }
+        }
+    }
+
+    return rc;
+}
+
+/* LoadNamedRepo
+ *
+ *    repository-block
+ *        = ID <repository> ;
+ */
+static
+rc_t VResolverLoadNamedRepo ( VResolver *self, Vector *algs,
+    const KConfigNode *sub, const String *ticket, const char *name,
+    bool cache_capable, bool protected, EDisabled disabled, bool cacheEnabled )
+{
+    const KConfigNode *repo;
+    rc_t rc = KConfigNodeOpenNodeRead ( sub, & repo, "%s", name );
+    if ( GetRCState ( rc ) == rcNotFound )
+        rc = 0;
+    else if ( rc == 0 )
+    {
+        rc = VResolverLoadRepo ( self, algs, repo,
+            ticket, cache_capable, protected, disabled, cacheEnabled );
+        KConfigNodeRelease ( repo );
+    }
+    return rc;
+}
+
+/* LoadSubCategory
+ *
+ *    sub-category-block
+ *        = <sub-category> <repository-block>* ;
+ *
+ *    sub-category
+ *        = "main" | "aux" | "protected"
+ *
+ *    repository-block
+ *        = ID <repository> ;
+ */
+static
+rc_t VResolverLoadSubCategory ( VResolver *self, Vector *algs,
+    const KConfigNode *kfg, const String *ticket, const char *sub_path,
+    bool cache_capable, bool protected, EDisabled disabled, bool cacheEnabled )
+{
+    const KConfigNode *sub;
+    rc_t rc = KConfigNodeOpenNodeRead ( kfg, & sub, "%s", sub_path );
+    if ( GetRCState ( rc ) == rcNotFound )
+        rc = 0;
+    else if ( rc == 0 )
+    {
+        KNamelist *children;
+        rc = KConfigNodeListChildren ( sub, & children );
+        if ( rc == 0 )
+        {
+            uint32_t i, count;
+            rc = KNamelistCount ( children, & count );
+            for ( i = 0; i < count && rc == 0; ++ i )
+            {
+                const char *name;
+                rc = KNamelistGet ( children, i, & name );
+                if ( rc == 0 )
+                    rc = VResolverLoadNamedRepo ( self, algs, sub, ticket, name,
+                        cache_capable, protected, disabled, cacheEnabled );
+            }
+
+            KNamelistRelease ( children );
+        }
+        KConfigNodeRelease ( sub );
+    }
+    return rc;
+}
+
+/* LoadProtected
+ *  special function to handle single, active protected workspace
+ */
+static
+rc_t VResolverLoadProtected ( VResolver *self, const KConfigNode *kfg,
+    const char *rep_name,
+    bool cache_capable, EDisabled disabled, bool cacheEnabled )
+{
+    const KConfigNode *repo;
+    rc_t rc = KConfigNodeOpenNodeRead ( kfg, & repo, "user/protected/%s", rep_name );
+    if ( GetRCState ( rc ) == rcNotFound )
+        rc = 0;
+    else if ( rc == 0 )
+    {
+        rc = VResolverLoadRepo ( self, & self -> local,
+            repo, NULL, cache_capable, true, disabled, cacheEnabled );
+        KConfigNodeRelease ( repo );
+    }
+    return rc;
+}
+
+/* LoadLegacyRefseq
+ *  load refseq information from KConfig
+ *
+ *  there are two legacy versions being supported
+ *
+ *    legacy-refseq
+ *        = "refseq" <legacy-vol-or-repo> ;
+ *
+ *    legacy-vol-or-repo
+ *        = "volumes" '=' <path-list>
+ *        | <legacy-refseq-repo> <legacy-refseq-vols>
+ *        ;
+ */
+static
+rc_t VResolverLoadLegacyRefseq
+    ( VResolver *self, const KConfig *cfg, bool cache_capable )
+{
+    const KConfigNode *vols;
+    rc_t rc = KConfigOpenNodeRead ( cfg, & vols, "/refseq/paths" );
+    if ( GetRCState ( rc ) == rcNotFound )
+        rc = 0;
+    else if ( rc == 0 )
+    {
+        String *vol_list;
+        rc = KConfigNodeReadString ( vols, & vol_list );
+        if ( rc == 0 )
+        {
+            const bool protected = false;
+            const bool disabled = false;
+            const bool caching = true;
+            rc = VResolverLoadAlgVolumes ( & self -> local, NULL, NULL,
+                cache_capable,
+                appREFSEQ, algREFSEQ,  & self -> num_app_vols [ appREFSEQ ],
+                vol_list, protected, disabled, caching );
+            StringWhack ( vol_list );
+        }
+        KConfigNodeRelease ( vols );
+    }
+
+    return rc;
+}
+
+
+/* ForceRemoteRefseq
+ *  makes sure there is a remote source of refseq
+ *  or else adds a hard-coded URL to NCBI
+ */
+static
+rc_t VResolverForceRemoteRefseq ( VResolver *self )
+{
+    rc_t rc;
+    bool found;
+    String local_root;
+    const String *root;
+
+    uint32_t i, count = VectorLength ( & self -> remote );
+    for ( found = false, i = 0; i < count; ++ i )
+    {
+        VResolverAlg *alg = ( VResolverAlg* ) VectorGet ( & self -> remote, i );
+        if ( alg -> app_id == appREFSEQ )
+        {
+            found = true;
+            if ( alg -> disabled )
+                alg -> disabled = false;
+        }
+    }
+
+    if ( found )
+        return 0;
+
+    if ( self -> num_app_vols [ appAny ] != 0 )
+    {
+        for ( i = 0; i < count; ++ i )
+        {
+            VResolverAlg *alg = ( VResolverAlg* ) VectorGet ( & self -> remote, i );
+            if ( alg -> app_id == appAny )
+            {
+                found = true;
+                if ( alg -> disabled )
+                    alg -> disabled = false;
+            }
+        }
+    }
+
+    if ( found )
+        return 0;
+
+    /* create one from hard-coded constants */
+    StringInitCString ( & local_root, "https://ftp-trace.ncbi.nlm.nih.gov/sra" );
+    rc = StringCopy ( & root, & local_root );    
+    if ( rc == 0 )
+    {
+        rc = VectorAppend ( & self -> roots, NULL, root );
+        if ( rc != 0 )
+            StringWhack ( root );
+        else
+        {
+            String vol_list;
+            const bool protected = false;
+            const bool disabled = false;
+            const bool caching = false;
+            StringInitCString ( & vol_list, "refseq" );
+            rc = VResolverLoadAlgVolumes ( & self -> remote, root, NULL, false,
+                appREFSEQ, algREFSEQ, & self -> num_app_vols [ appREFSEQ ],
+                & vol_list, protected, disabled, caching );
+        }
+    }
+
+    return rc;
+}
+
+
+/* GetDownloadTicket
+ *  if we are within a working environment that has a download ticket,
+ *  capture it here and add that local repository into the mix
+ */
+static
+const String *VResolverGetDownloadTicket ( const VResolver *self,
+    const KRepository *protected, char *buffer, size_t bsize )
+{
+    const String *ticket = NULL;
+    if ( protected != NULL )
+    {
+        rc_t rc = KRepositoryName ( protected, buffer, bsize, NULL );
+        if ( rc == 0 )
+        {
+            size_t ticsz;
+            char ticbuf [ 256 ];
+            rc = KRepositoryDownloadTicket ( protected, ticbuf, sizeof ticbuf, & ticsz );
+            if ( rc == 0 )
+            {
+                String tic;
+                StringInit ( & tic, ticbuf, ticsz, ( uint32_t ) ticsz );
+                rc = StringCopy ( & ticket, & tic );
+            }
+        }
+    }
+    return ticket;
+}
+
+
+/* ForceRemoteProtected
+ *  makes sure there is a remote CGI
+ */
+static
+rc_t VResolverForceRemoteProtected ( VResolver *self )
+{
+    rc_t rc;
+    const String *root;
+
+    /* create one from hard-coded constants */
+    String cgi_root;
+    StringInitCString ( & cgi_root, "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi" );
+    rc = StringCopy ( & root, & cgi_root );    
+    if ( rc == 0 )
+    {
+        rc = VectorAppend ( & self -> roots, NULL, root );
+        if ( rc != 0 )
+            StringWhack ( root );
+        else
+        {
+            const bool protected = true;
+            const bool disabled = false;
+
+            VResolverAlg *cgi;
+            rc = VResolverAlgMake ( & cgi, root, appAny, algCGI, protected, disabled );
+            if ( rc == 0 )
+            {
+                cgi -> ticket = self -> ticket;
+
+                /* Remote Protected algorythm should come first: see VDB-2679 */
+                if ( VectorLength ( & self -> remote ) > 0 ) {
+                    void *prior = NULL;
+                    rc = VectorSwap ( &self -> remote, 0, cgi, & prior );
+                    if ( rc == 0 ) {
+                        rc = VectorAppend ( &self -> remote, NULL, prior );
+                    }
+                }
+                else {
+                    rc = VectorAppend ( & self -> remote, NULL, cgi );
+                }
+
+                if ( rc == 0 )
+                {
+                    ++ self -> num_app_vols [ appAny ];
+                    return 0;
+                }
+            }
+
+            VResolverAlgWhack ( cgi, NULL );
+        }
+    }
+
+    return rc;
+}
+
+
+/* Load
+ *  load the respository from ( current ) KConfig
+ *
+ *  using pseudo BNF, it looks like this:
+ *
+ *    repositories
+ *        = "repository" <category-block>* ;
+ *
+ *    category-block
+ *        = <category> <sub-category-block>* ;
+ *
+ *    category
+ *        = "remote" | "site" | "user" ;
+ *
+ *    sub-category-block
+ *        = <sub-category> <repository-block>* ;
+ *
+ *    sub-category
+ *        = "main" | "aux" | "protected"
+ */
+static
+rc_t VResolverDetectSRALeafPath ( VResolver *self )
+{
+    /* capture working directory as "root" path */
+    const KDirectory *wd = self -> wd;
+    char cwd [ 4096 ];
+    rc_t rc = KDirectoryResolvePath ( wd, true, cwd, sizeof cwd, "." );
+    if ( rc == 0 )
+    {
+        const String *root;
+
+        /* convert C-string to real string */
+        String cwd_str;
+        StringInitCString ( & cwd_str, cwd );
+
+        /* create a copy on heap */
+        rc = StringCopy ( & root, & cwd_str );
+        if ( rc == 0 )
+        {
+            /* insert into "roots" */
+            rc = VectorAppend ( & self -> roots, NULL, root );
+            if ( rc == 0 )
+            {
+                /* create an algorithm for any application where the
+                   spec is to be treated as a leaf path */
+                VResolverAlg *alg;
+                rc = VResolverAlgMake ( & alg, root, appAny, algFlat, self -> ticket != NULL, false );
+                if ( rc == 0 )
+                {
+                    const String *vol;
+
+                    /* create a single volume - "." */
+                    CONST_STRING ( & cwd_str, "." );
+                    rc = StringCopy ( & vol, & cwd_str );
+                    if ( rc == 0 )
+                    {
+                        rc = VectorAppend ( & alg -> vols, NULL, vol );
+                        if ( rc != 0 )
+                            free ( ( void* ) vol );
+                        else
+                        {
+                            /* insert into local resolution path */
+                            rc = VectorAppend ( & self -> local, NULL, alg );
+                            if ( rc == 0 )
+                                return 0;
+                        }
+                    }
+                
+                    VResolverAlgWhack ( alg, NULL );
+                }
+            }
+
+            free ( ( void* ) root );
+        }
+    }
+    return rc;
+}
+
+static
+rc_t VResolverForceUserFilesVol ( VResolver *self, const VResolverAlg *sraAlg )
+{
+   /* create an algorithm for "file" application where the
+       spec is to be treated as a leaf path */
+    VResolverAlg *alg;
+    rc_t rc = VResolverAlgMake ( & alg, sraAlg -> root, appFILE, algFlat, sraAlg -> protected, sraAlg -> disabled );
+    if ( rc == 0 )
+    {
+        String vol_str;
+        const String *vol;
+
+        /* create a single volume - "files" */
+        CONST_STRING ( & vol_str, "files" );
+        rc = StringCopy ( & vol, & vol_str );
+        if ( rc == 0 )
+        {
+            rc = VectorAppend ( & alg -> vols, NULL, vol );
+            if ( rc != 0 )
+                free ( ( void* ) vol );
+            else
+            {
+                /* copy sra settings */
+                alg -> ticket = sraAlg -> ticket;
+                alg -> cache_capable = sraAlg -> cache_capable;
+                alg -> cache_enabled = sraAlg -> cache_enabled;
+
+                /* insert into local resolution path */
+                rc = VectorAppend ( & self -> local, NULL, alg );
+                if ( rc == 0 )
+                {
+                    ++ self -> num_app_vols [ appFILE ];
+                    return 0;
+                }
+            }
+        }
+                
+        VResolverAlgWhack ( alg, NULL );
+    }
+
+    return rc;
+}
+
+static
+rc_t VResolverForceUserFiles ( VResolver *self )
+{
+    rc_t rc;
+    uint32_t i, count = VectorLength ( & self -> local );
+
+    for ( rc = 0, i = 0; i < count; ++ i )
+    {
+        const VResolverAlg *alg = VectorGet ( & self -> local, i );
+        if ( alg -> app_id == appSRA && alg -> cache_capable )
+        {
+            rc = VResolverForceUserFilesVol ( self, alg );
+            if ( rc != 0 )
+                break;
+        }
+    }
+
+    return rc;
+}
+
+static EDisabled _KConfigNodeRepoDisabled(
+    const KConfigNode *self, const char *name)
+{
+    EDisabled isDisabled = eDisabledNotSet;
+    const KConfigNode *node = NULL;
+    rc_t rc = KConfigNodeOpenNodeRead(self, &node, "%s/disabled", name);
+    bool disabled = false;
+    if (rc == 0) {
+        rc = KConfigNodeReadBool(node, &disabled);
+    }
+    if (rc == 0) {
+        isDisabled = disabled ? eDisabledSet : eEnabledSet;
+    }
+    KConfigNodeRelease(node);
+    return isDisabled;
+}
+
+static rc_t VResolverLoad(VResolver *self, const KRepository *protected,
+    const KConfig *cfg, const KNSManager *kns)
+{
+    bool have_remote_protected = false;
+
+    const KConfigNode *kfg;
+    rc_t rc = KConfigOpenNodeRead ( cfg, & kfg, "repository" );
+    if ( GetRCState ( rc ) == rcNotFound )
+        rc = 0;
+    else if ( rc == 0 )
+    {
+        bool userCacheEnabled = true;
+
+        EDisabled remoteDisabled = _KConfigNodeRepoDisabled(kfg, "remote");
+        EDisabled siteDisabled = _KConfigNodeRepoDisabled(kfg, "site");
+        EDisabled userDisabled = _KConfigNodeRepoDisabled(kfg, "user");
+
+        /* check to see what the current directory is */
+        char buffer [ 256 ];
+        self -> ticket = VResolverGetDownloadTicket ( self, protected, buffer, sizeof buffer );
+
+        {
+            const KConfigNode * node = NULL;
+            rc_t rc =
+                KConfigNodeOpenNodeRead ( kfg, & node, "user/cache-disabled" );
+            if ( rc == 0 ) {
+                bool disabled = false;
+                rc = KConfigNodeReadBool ( node, & disabled );
+                KConfigNodeRelease ( node );
+ 
+                if ( rc == 0 && disabled ) {
+                    userCacheEnabled = false;
+                }
+            }
+        }
+
+        /* allow user to specify leaf paths in current directory */
+        rc = VResolverDetectSRALeafPath ( self );
+
+        /* if the user is inside of a protected workspace, load it now */
+        if ( rc == 0 && self -> ticket != NULL )
+        {
+            rc = VResolverLoadProtected
+                ( self, kfg, buffer, true, userDisabled, userCacheEnabled );
+            if ( rc == 0 && self -> num_app_vols [ appFILE ] == 0 )
+                rc = VResolverForceUserFiles ( self );
+        }
+
+        /* now load user public repositories */
+        if ( rc == 0 )
+            rc = VResolverLoadSubCategory ( self, & self -> local, kfg, NULL,
+                "user/main", true, false, userDisabled, userCacheEnabled );
+#if ALLOW_AUX_REPOSITORIES
+        if ( rc == 0 )
+            rc = VResolverLoadSubCategory ( self, & self -> local, kfg, NULL,
+                "user/aux", true, false, userDisabled, userCacheEnabled );
+#endif
+
+        /* load any site repositories */
+        if ( rc == 0 )
+            rc = VResolverLoadSubCategory ( self, & self -> local, kfg, NULL,
+                "site/main", false, false, siteDisabled, false );
+#if ALLOW_AUX_REPOSITORIES
+        if ( rc == 0 )
+            rc = VResolverLoadSubCategory ( self, & self -> local, kfg, NULL,
+                "site/aux", false, false, siteDisabled, false );
+#endif
+
+        /* if within a protected workspace, load protected remote repositories */
+        if ( rc == 0 && self -> ticket != NULL )
+        {
+            if (kns == NULL) {
+                rc = KNSManagerMake ( ( KNSManager** ) & self -> kns );
+            }
+            else {
+                rc = KNSManagerAddRef(kns);
+                if (rc == 0) {
+                    self -> kns = kns;
+                }
+            }
+            if ( rc == 0 )
+            {
+                uint32_t entry_vols = VectorLength ( & self -> remote );
+                rc = VResolverLoadSubCategory ( self, & self -> remote, kfg,
+                    self -> ticket, "remote/protected", false, true,
+                    remoteDisabled, false );
+                have_remote_protected = VectorLength ( & self -> remote ) > entry_vols;
+            }
+        }
+
+        /* load any remote repositories */
+        if ( rc == 0 )
+            rc = VResolverLoadSubCategory ( self, & self -> remote, kfg, NULL,
+                "remote/main", false, false, remoteDisabled, false );
+#if ALLOW_AUX_REPOSITORIES
+        if ( rc == 0 )
+            rc = VResolverLoadSubCategory ( self, & self -> remote, kfg, NULL,
+                "remote/aux", false, false, remoteDisabled, false );
+#endif
+
+        KConfigNodeRelease ( kfg );
+
+        /* recover from public remote repositories using resolver CGI */
+        if ( self -> kns == NULL )
+        {
+            if (kns == NULL) {
+                rc = KNSManagerMake ( ( KNSManager** ) & self -> kns );
+            }
+            else {
+                rc = KNSManagerAddRef(kns);
+                if (rc == 0) {
+                    self -> kns = kns;
+                }
+            }
+        }
+    }
+
+    if ( rc == 0 && self -> num_app_vols [ appAny ] == 0 )
+    {
+        bool has_current_refseq = true;
+
+        /* AT THIS POINT, a current configuration will have something.
+           But, older out-of-date configurations may exist and need special handling. */
+        if ( self -> num_app_vols [ appREFSEQ ] == 0 )
+        {
+            has_current_refseq = false;
+            rc = VResolverLoadLegacyRefseq ( self, cfg, true );
+        }
+
+        /* now, one more special case - for external users
+           who had legacy refseq configuration but nothing for SRA,
+           force existence of a remote refseq access */
+        if ( rc == 0
+             && ! has_current_refseq
+             && self -> num_app_vols [ appREFSEQ ] != 0
+             && self -> num_app_vols [ appSRA ] == 0 )
+        {
+            rc = VResolverForceRemoteRefseq ( self );
+        }
+    }
+
+    if ( rc == 0 && self -> num_app_vols [ appFILE ] == 0 )
+        rc = VResolverForceUserFiles ( self );
+
+    if ( rc == 0 && self -> ticket != NULL && ! have_remote_protected )
+        rc = VResolverForceRemoteProtected ( self );
+
+    if ( rc == 0 )
+    {
+        VectorReorder ( & self -> local, VResolverAlgSort, NULL );
+        VectorReorder ( & self -> remote, VResolverAlgSort, NULL );
+    }
+
+    return rc;
+}
+
+LIB_EXPORT
+rc_t CC VResolverProtocols ( VResolver * self, VRemoteProtocols protocols )
+{
+    VRemoteProtocols remote_protos;
+
+    if ( self == NULL )
+        return RC ( rcVFS, rcResolver, rcUpdating, rcSelf, rcNull );
+
+    if ( protocols == 0)
+        self -> protocols = self -> dflt_protocols;
+    else
+    {
+        if ( protocols > VRemoteProtocolsMake3 ( eProtocolMax, eProtocolMax, eProtocolMax ) )
+            return RC ( rcVFS, rcResolver, rcUpdating, rcParam, rcInvalid );
+
+        for ( remote_protos = protocols; remote_protos != 0; remote_protos >>= 3 )
+        {
+            VRemoteProtocols proto = remote_protos & eProtocolMask;
+            if ( proto == eProtocolNone || proto > eProtocolMax )
+                return RC ( rcVFS, rcResolver, rcUpdating, rcParam, rcInvalid );
+        }
+
+        self -> protocols = protocols;
+    }
+
+    return 0;
+}
+
+
+rc_t VResolverGetProjectId ( const VResolver * self, uint32_t * projectId )
+{
+    if ( self == NULL )
+        return RC ( rcVFS, rcResolver, rcAccessing, rcSelf, rcNull );
+    else if ( projectId == NULL )
+        return RC ( rcVFS, rcResolver, rcUpdating, rcParam, rcNull );
+    else {
+        bool has_project_id = self -> projectId != 0;
+
+        * projectId = 0;
+
+        if ( has_project_id ) {
+            * projectId = self -> projectId;
+        }
+
+        return 0;
+    }
+}
+
+
+/* Make
+ *  internal factory function
+ */
+static
+rc_t VResolverMake ( VResolver ** objp, const KDirectory *wd,
+    const KRepository *protected, const KConfig *kfg, const VFSManager *mgr )
+{
+    rc_t rc;
+
+    VResolver *obj = calloc ( 1, sizeof * obj );
+    if ( obj == NULL )
+        rc = RC ( rcVFS, rcMgr, rcCreating, rcMemory, rcExhausted );
+    else
+    {
+        KNSManager *kns = NULL;
+        VectorInit ( & obj -> roots, 0, 8 );
+        VectorInit ( & obj -> local, 0, 8 );
+        VectorInit ( & obj -> remote, 0, 8 );
+        obj -> wd = wd;
+
+        KRefcountInit ( & obj -> refcount, 1, "VResolver", "make", "resolver" );
+
+        if ( mgr != NULL )
+        {
+            rc_t rc = VFSManagerGetKNSMgr ( mgr, & kns );
+            if ( rc != 0 )
+            {
+                rc = 0;
+                kns = NULL;
+            }
+        }
+
+
+        /* set up protocols */
+        obj -> dflt_protocols = eProtocolHttpHttps;
+        if ( kfg != NULL )
+            KConfigReadRemoteProtocols ( kfg, & obj -> dflt_protocols );
+
+        obj -> protocols = obj -> dflt_protocols;
+
+        rc = VResolverLoad ( obj, protected, kfg, kns );
+
+        KNSManagerRelease ( kns );
+        kns = NULL;
+
+        KRepositoryProjectId ( protected, & obj -> projectId );
+
+        if ( rc == 0 )
+        {
+            * objp = obj;
+            return 0;
+        }
+
+        VResolverWhack ( obj );
+    }
+
+    return rc;
+}
+
+/* Make
+ *  ask the VFS manager or repository to make a resolver
+ */
+LIB_EXPORT
+rc_t CC VFSManagerMakeResolver ( const VFSManager * self,
+    VResolver ** new_resolver, const KConfig * cfg )
+{
+    rc_t rc;
+
+    if ( new_resolver == NULL )
+        rc = RC ( rcVFS, rcMgr, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVFS, rcMgr, rcCreating, rcSelf, rcNull );
+        else if ( cfg == NULL )
+            rc = RC ( rcVFS, rcMgr, rcCreating, rcParam, rcNull );
+        else
+        {
+            KDirectory *wd;
+            rc = VFSManagerGetCWD ( self, & wd );
+            if ( rc == 0 )
+            {
+                const KRepositoryMgr *rmgr;
+                rc = KConfigMakeRepositoryMgrRead ( cfg, & rmgr );
+                if ( rc == 0 )
+                {
+                    const KRepository *protected = NULL;
+                    rc = KRepositoryMgrCurrentProtectedRepository ( rmgr, & protected );
+                    if ( rc == 0 || GetRCState ( rc ) == rcNotFound )
+                    {
+                        rc = VResolverMake(new_resolver,
+                            wd, protected, cfg, self);
+                        KRepositoryRelease ( protected );
+
+                        if ( rc == 0 )
+                        {
+                            KRepositoryMgrRelease ( rmgr );
+                            return 0;
+                        }
+                    }
+
+                    KRepositoryMgrRelease ( rmgr );
+                }
+
+                KDirectoryRelease ( wd );
+            }
+        }
+
+        *new_resolver = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT
+rc_t CC KRepositoryMakeResolver ( const KRepository *self,
+    VResolver ** new_resolver, const KConfig * cfg )
+{
+    rc_t rc;
+
+    if ( new_resolver == NULL )
+        rc = RC ( rcVFS, rcMgr, rcCreating, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVFS, rcMgr, rcCreating, rcSelf, rcNull );
+        else if ( cfg == NULL )
+            rc = RC ( rcVFS, rcMgr, rcCreating, rcParam, rcNull );
+        else
+        {
+            KDirectory *wd;
+            rc = KDirectoryNativeDir ( & wd );
+            if ( rc == 0 )
+            {
+                rc = VResolverMake ( new_resolver, wd, self, cfg, NULL );
+                if ( rc == 0 )
+                    return 0;
+
+                KDirectoryRelease ( wd );
+            }
+        }
+
+        *new_resolver = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/vfs/srapath-stub.c b/libs/vfs/srapath-stub.c
new file mode 100644
index 0000000..da0985d
--- /dev/null
+++ b/libs/vfs/srapath-stub.c
@@ -0,0 +1,372 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sra/extern.h>
+#include <klib/rc.h>
+#include <klib/defs.h>
+#include <klib/refcount.h>
+#include <sra/srapath.h>
+#include <sra/sradb-priv.h>
+#include <sysalloc.h>
+#include <os-native.h>
+
+#include <sra/impl.h>
+
+#include <string.h>
+#include <assert.h>
+#include <stdio.h>
+
+
+/*--------------------------------------------------------------------------
+ * SRAPath
+ *  manages accession -> path conversion
+ */
+
+/* Make
+ *  create path manager
+ *
+ *  the path manager should already be configured with
+ *  standard search paths, but can be augmented by using
+ *  the Add*Path messages.
+ *
+ *  "dir" [ IN, NULL OKAY ] - optional root directory to use
+ *  attaches a new reference
+ */
+LIB_EXPORT rc_t CC SRAPathMake ( SRAPath **pm, struct KDirectory const *dir )
+{
+    rc_t rc;
+
+    if ( pm == NULL )
+        rc = RC ( rcSRA, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        rc = SRAPathMakeImpl( pm, dir );
+        if ( rc == 0 )
+            return 0;
+
+        * pm = NULL;
+    }
+
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+LIB_EXPORT rc_t CC SRAPathAddRef ( const SRAPath *self )
+{
+    if ( self != NULL )
+    {
+        switch ( self -> vt -> v1 . maj )
+        {
+        case 1:
+        case 2:
+            return self -> vt -> v1 . addref ( self );
+        }
+
+        return RC ( rcSRA, rcMgr, rcReleasing, rcInterface, rcBadVersion );
+    }
+    return 0;
+}
+
+LIB_EXPORT rc_t CC SRAPathRelease ( const SRAPath *self )
+{
+    if ( self != NULL )
+    {
+        switch ( self -> vt -> v1 . maj )
+        {
+        case 1:
+        case 2:
+            return self -> vt -> v1 . release ( self );
+        }
+
+        return RC ( rcSRA, rcMgr, rcReleasing, rcInterface, rcBadVersion );
+    }
+    return 0;
+}
+
+
+/* Version
+ *  returns the library version
+ */
+LIB_EXPORT rc_t CC SRAPathVersion ( const SRAPath *self, uint32_t *version )
+{
+    if ( version == NULL )
+        return RC ( rcSRA, rcMgr, rcAccessing, rcParam, rcNull );
+
+    * version = 0;
+
+    if ( self == NULL )
+        return RC ( rcSRA, rcMgr, rcAccessing, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+    case 2:
+        return self -> vt -> v1 . version ( self, version );
+    }
+
+    return RC ( rcSRA, rcMgr, rcAccessing, rcInterface, rcBadVersion );
+}
+
+
+/* Clear
+ *  forget all existing server and volume paths
+ */
+LIB_EXPORT rc_t CC SRAPathClear ( SRAPath *self )
+{
+    if ( self == NULL )
+        return RC ( rcSRA, rcMgr, rcResetting, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+    case 2:
+        return self -> vt -> v1 . clear ( self );
+    }
+
+    return RC ( rcSRA, rcMgr, rcResetting, rcInterface, rcBadVersion );
+}
+
+
+/* AddRepPath
+ *  add a replication path
+ *
+ *  "rep" [ IN ] - NUL-terminated server search path
+ *  may be a compound path with ':' separator characters, e.g.
+ *  "/panfs/traces01:/panfs/traces31"
+ *
+ *  NB - servers are searched in the order provided,
+ *  first to last, until one of them satisfies a request,
+ *  at which time the successful server is placed at the
+ *  head of the search path.
+ */
+LIB_EXPORT rc_t CC SRAPathAddRepPath ( SRAPath *self, const char *path )
+{
+    if ( self == NULL )
+        return RC ( rcSRA, rcMgr, rcUpdating, rcSelf, rcNull );
+    if ( path == NULL )
+        return RC ( rcSRA, rcMgr, rcUpdating, rcString, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcSRA, rcMgr, rcUpdating, rcString, rcEmpty );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+    case 2:
+        return self -> vt -> v1 . addRepPath ( self, path );
+    }
+
+    return RC ( rcSRA, rcMgr, rcUpdating, rcInterface, rcBadVersion );
+}
+
+
+/* AddVolPath
+ *  add a volume path
+ *
+ *  "vol" [ IN ] - NUL-terminated volume search path
+ *  may be a compound path with ':' separator characters, e.g.
+ *  "sra2:sra1:sra0"
+ *
+ *  NB - volumes are searched in the order provided,
+ *  first to last. they are never re-ordered.
+ */
+LIB_EXPORT rc_t CC SRAPathAddVolPath ( SRAPath *self, const char *path )
+{
+    if ( self == NULL )
+        return RC ( rcSRA, rcMgr, rcUpdating, rcSelf, rcNull );
+    if ( path == NULL )
+        return RC ( rcSRA, rcMgr, rcUpdating, rcString, rcNull );
+    if ( path [ 0 ] == 0 )
+        return RC ( rcSRA, rcMgr, rcUpdating, rcString, rcEmpty );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+    case 2:
+        return self -> vt -> v1 . addVolPath ( self, path );
+    }
+
+    return RC ( rcSRA, rcMgr, rcUpdating, rcInterface, rcBadVersion );
+}
+
+
+/* Full
+ *  creates full path from server, volume & accession
+ *
+ *  "rep" [ IN ] - NUL terminated full path of replication
+ *  server, e.g. "/panfs/traces01"
+ *
+ *  "vol" [ IN ] - NUL terminated relative path of volume,
+ *  e.g. "sra2"
+ *
+ *  "accession" [ IN ] - NUL terminated run accession,
+ *  e.g. "SRR000001"
+ *
+ *  "path" [ OUT ] and "path_max" [ IN ] - return buffer for
+ *  NUL-terminated full path to accession.
+ */
+LIB_EXPORT rc_t CC SRAPathFull ( const SRAPath *self, const char *rep,
+    const char *vol, const char *accession, char *path, size_t path_max )
+{
+    if ( path_max == 0 )
+        return RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+    if ( path == NULL )
+        return RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcNull );
+
+    /* prepare return for failure */
+    path [ 0 ] = 0;
+
+    /* test remainder */
+    if ( self == NULL )
+        return RC ( rcSRA, rcMgr, rcAccessing, rcSelf, rcNull );
+    if ( accession == NULL )
+        return RC ( rcSRA, rcMgr, rcAccessing, rcPath, rcNull );
+    if ( accession [ 0 ] == 0 )
+        return RC ( rcSRA, rcMgr, rcAccessing, rcPath, rcEmpty );
+
+    /* turn NULL prefix parts into empty string */
+    if ( rep == NULL )
+        rep = "";
+    if ( vol == NULL )
+        vol = "";
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+    case 2:
+        return self -> vt -> v1 . fullPath ( self, rep, vol, accession, path, path_max );
+    }
+
+    return RC ( rcSRA, rcMgr, rcAccessing, rcInterface, rcBadVersion );
+}
+
+
+/* Test
+ *  returns true if path appears to be accession
+ *  the test is a heuristic, and may return false positives
+ *
+ *  "path" [ IN ] - NUL terminated path to run
+ */
+LIB_EXPORT bool CC SRAPathTest ( const SRAPath *self, const char *path )
+{
+    if ( self == NULL )
+        return false;
+    if ( path == NULL || path [ 0 ] == 0 )
+        return false;
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+    case 2:
+        return self -> vt -> v1 . testPath ( self, path );
+    }
+
+    return false;
+}
+
+
+/* Find
+ *  finds location of run within rep-server/volume matrix
+ *
+ *  "accession" [ IN ] - NUL terminated run accession,
+ *   e.g. "SRR000001"
+ *
+ *  "path" [ OUT ] and "path_max" [ IN ] - return buffer for
+ *  NUL-terminated full path to accession.
+ *
+ *  returns 0 if path exists, rc state rcNotFound if
+ *  path cannot be found, and rcInsufficient if buffer is
+ *  too small.
+ */
+LIB_EXPORT rc_t CC SRAPathFindWithRepLen ( const SRAPath *self,
+    const char *accession, char *path, size_t path_max, size_t *rep_len )
+{
+    if ( path == NULL )
+        return RC ( rcSRA, rcMgr, rcSelecting, rcBuffer, rcNull );
+    if ( path_max == 0 )
+        return RC ( rcSRA, rcMgr, rcSelecting, rcBuffer, rcInsufficient );
+
+    /* looking for illegal character in the accession 'name'
+     * this will be the RC from something like "ncbi-acc:./SRR000001"
+     * or if this is called as a default resolution in the old manner
+     */
+    if ( strchr ( accession, '/' ) != NULL )
+        return RC ( rcSRA, rcUri, rcResolving, rcPath, rcIncorrect );
+
+    path [ 0 ] = 0;
+
+    if ( self == NULL )
+        return RC ( rcSRA, rcMgr, rcSelecting, rcSelf, rcNull );
+    if ( accession == NULL )
+        return RC ( rcSRA, rcMgr, rcSelecting, rcPath, rcNull );
+    if ( accession [ 0 ] == 0 )
+        return RC ( rcSRA, rcMgr, rcSelecting, rcPath, rcEmpty );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+    case 2:
+        return self -> vt -> v1 . findPath ( self, accession, path, path_max, rep_len );
+    }
+
+    return RC ( rcSRA, rcMgr, rcSelecting, rcInterface, rcBadVersion );
+}
+
+LIB_EXPORT rc_t CC SRAPathFind ( const SRAPath *self,
+    const char *accession, char *path, size_t path_max )
+{
+    return SRAPathFindWithRepLen ( self, accession, path, path_max, NULL );
+}
+
+
+/* List (Deprecated)
+ *  list all runs known to SRAPath
+ *  this can be VERY SLOW due to the large number of runs
+ *
+ *  "runs" [ OUT ] - return parameter for ordered list of accessions
+ *
+ *  "deep" [ IN ] - when false, list only first responding server
+ */
+LIB_EXPORT rc_t CC SRAPathList ( const SRAPath *self, struct KNamelist **runs, bool deep )
+{
+    if ( runs == NULL )
+        return RC ( rcSRA, rcMgr, rcListing, rcParam, rcNull );
+
+    * runs = NULL;
+
+    if ( self == NULL )
+        return RC ( rcSRA, rcMgr, rcListing, rcSelf, rcNull );
+
+    switch ( self -> vt -> v1 . maj )
+    {
+    case 1:
+        return RC ( rcSRA, rcMgr, rcListing, rcInterface, rcUnsupported ); /* removed from v1 */
+    }
+
+    return RC ( rcSRA, rcMgr, rcListing, rcInterface, rcBadVersion );
+}
diff --git a/libs/vfs/srapath.c b/libs/vfs/srapath.c
new file mode 100644
index 0000000..fce03d2
--- /dev/null
+++ b/libs/vfs/srapath.c
@@ -0,0 +1,1424 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sra/path-extern.h>
+
+struct SRARunlist;
+#define KNAMELIST_IMPL struct SRARunlist
+#include <klib/impl.h>
+
+struct NCBISRAPath;
+#define SRAPATH_IMPL struct NCBISRAPath
+#include <sra/impl.h>
+
+#include "libsrapath.vers.h"
+
+#include <vfs/manager.h>
+#include <sra/srapath.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <kfs/dyload.h>
+#include <klib/container.h>
+#include <klib/vector.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <kfg/config.h>
+#include <kfg/kfg-priv.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+#include "path-priv.h"
+
+/*--------------------------------------------------------------------------
+ * SRAPathString
+ */
+enum
+{
+    alg_none,
+    alg_ncbi,
+    alg_ddbj,
+    alg_ebi,
+    alg_refseq,
+    alg_wgs
+};
+
+typedef struct SRAPathString SRAPathString;
+struct SRAPathString
+{
+    DLNode n;
+    uint8_t alg;
+    char path [ 1 ];
+};
+
+/* Whack
+ */
+static
+void CC SRAPathStringWhack ( DLNode *n, void *ignore )
+{
+    free ( n );
+}
+
+/* Make
+ */
+static
+rc_t SRAPathStringMake ( DLList *list, const char *path, size_t sz, uint8_t alg )
+{
+    SRAPathString *s = (SRAPathString*) malloc ( sizeof * s + sz );
+    if ( s == NULL )
+        return RC ( rcSRA, rcMgr, rcUpdating, rcMemory, rcExhausted );
+
+    s -> alg = alg;
+    string_copy ( s -> path, sz + 1, path, sz );
+    DLListPushTail ( list, & s -> n );
+
+    return 0;
+}
+
+
+/* Find
+ */
+typedef struct SRAPathFindInfo SRAPathFindInfo;
+struct SRAPathFindInfo
+{
+    const char *path;
+    size_t size;
+    uint8_t alg;
+    bool found;
+};
+
+static
+bool CC SRAPathStringFind ( DLNode *n, void *data )
+{
+    const SRAPathString *p = ( const SRAPathString* ) n;
+    SRAPathFindInfo *pb = ( SRAPathFindInfo* ) data;
+    if ( memcmp ( p -> path, pb -> path, pb -> size ) == 0 )
+    {
+        if ( p -> path [ pb -> size ] == 0 )
+        {
+            pb -> alg = p -> alg;
+            return pb -> found = true;
+        }
+    }
+    return false;
+}
+
+/*--------------------------------------------------------------------------
+ * NCBIRepository
+ *  represents a repository: replication server(s) / volume(s)
+ */
+typedef struct NCBIRepository NCBIRepository;
+struct NCBIRepository
+{
+    DLNode n;
+
+    uint8_t type; /* repository type: alg_ncbi (sra: ncbi/ebi/ddbj), alg_wgs, alg_refseq*/
+
+    /* replication servers */
+    DLList repsrv;
+
+    /* volumes upon each repserver */
+    DLList vols;
+};
+/* Init
+ */
+static
+rc_t CC SRARepoMake(NCBIRepository** repo)
+{
+    *repo = (NCBIRepository*)malloc(sizeof(NCBIRepository));
+    if (* repo == 0)
+    {
+        return RC ( rcSRA, rcMgr, rcInitializing, rcMemory, rcExhausted );
+    }
+    (*repo)->type = alg_ncbi;
+    (*repo)->n.next = NULL;
+    (*repo)->n.prev = NULL;
+    DLListInit(&(*repo)->repsrv);
+    DLListInit(&(*repo)->vols);
+    return 0;
+}
+/* Whack
+ */
+static
+void CC SRARepoWhack ( DLNode *n, void *ignore )
+{
+    if (n != NULL)
+    {
+        DLListWhack ( & ((NCBIRepository*) n) -> repsrv, SRAPathStringWhack, NULL );
+        DLListWhack ( & ((NCBIRepository*) n) -> vols, SRAPathStringWhack, NULL );
+        free ( (NCBIRepository*) n );
+    }
+}
+
+static 
+const char* AlgToStr(uint8_t alg)
+{
+    switch (alg)
+    {
+    case alg_ncbi: 
+    case alg_ddbj:
+    case alg_ebi: return "SRA";
+    case alg_wgs: return "WGS";
+    case alg_refseq: return "REFSEQ";
+    default: return "<unknown>";
+    }
+}
+
+
+static 
+void CC LogVolume( DLNode *n, void *data )
+{
+    const SRAPathString* self = (const SRAPathString*)n;
+    PATH_DEBUG (("        \"%s\", type=%s\n", 
+                  self->path,
+                  AlgToStr(self->alg)));
+}
+
+static 
+void CC LogServer( DLNode *n, void *data )
+{
+    const SRAPathString* self = (const SRAPathString*)n;
+    PATH_DEBUG (("        \"%s\"\n", self->path));
+}
+
+static 
+void CC LogRepository ( DLNode *n, void *data )
+{
+    if (n != NULL)
+    {
+        const NCBIRepository* self = (const NCBIRepository*)n;
+        PATH_DEBUG (("    type=%s\n", AlgToStr(self->type)));
+        PATH_DEBUG (("    servers:\n"));
+        DLListForEach ( & self->repsrv, false, LogServer, NULL );
+        PATH_DEBUG (("    volumes:\n"));
+        DLListForEach ( & self->vols, false, LogVolume, NULL );
+    }
+}
+
+/*--------------------------------------------------------------------------
+ * NCBISRAPath
+ *  manages accession -> path conversion
+ */
+typedef struct NCBISRAPath NCBISRAPath;
+struct NCBISRAPath
+{
+    struct SRAPath dad;
+
+    /* working directory */
+    const KDirectory *dir;
+
+    /* repositories */
+    DLList repos;
+    NCBIRepository* dflt_repo; /* default repository (likely to be removed in the future versions) */ 
+
+    atomic32_t refcount;
+};
+
+static void LogPathInfo(const NCBISRAPath* self)
+{
+    PATH_DEBUG (("NCBISRAPath configuration:\n"));
+    DLListForEach ( & self->repos, false, LogRepository, NULL );
+    PATH_DEBUG (("default repository:\n"));
+    LogRepository( (DLNode*) self->dflt_repo, NULL );
+}
+
+/* Whack
+ */
+static
+rc_t SRAPathWhack ( NCBISRAPath *self )
+{
+    rc_t rc = KDirectoryRelease ( self -> dir );
+    if ( rc == 0 )
+    {
+        DLListWhack ( & self -> repos, SRARepoWhack, NULL );
+        SRARepoWhack ( (DLNode*) self -> dflt_repo, NULL );
+        free ( self );
+    }
+    return rc;
+}
+
+
+/* AddRef
+ * Release
+ */
+static
+rc_t CC NCBISRAPathAddRef ( const NCBISRAPath *cself )
+{
+    atomic32_inc ( & ( ( NCBISRAPath* ) cself ) -> refcount );
+    return 0;
+}
+
+static
+rc_t CC NCBISRAPathRelease ( const NCBISRAPath *cself )
+{
+    NCBISRAPath *self = ( NCBISRAPath* ) cself;
+    if ( atomic32_dec_and_test ( & self -> refcount ) )
+        return SRAPathWhack ( self );
+    return 0;
+}
+
+
+/* Version
+ *  returns the library version
+ */
+static
+rc_t CC NCBISRAPathVersion ( const NCBISRAPath *self, uint32_t *version )
+{
+    * version = LIBSRAPATH_VERS;
+    return 0;
+}
+
+
+/* Clear
+ *  forget existing server and volume paths for the default repository
+ */
+static
+rc_t CC NCBISRAPathClear ( NCBISRAPath *self )
+{
+    DLListWhack ( & self -> dflt_repo -> repsrv, SRAPathStringWhack, NULL );
+    DLListWhack ( & self -> dflt_repo -> vols, SRAPathStringWhack, NULL );
+    DLListInit ( & self -> dflt_repo -> repsrv );
+    DLListInit ( & self -> dflt_repo -> vols );
+
+    return 0;
+}
+
+
+/* AddPath
+ *  add an alternate replication or volume path
+ *
+ *  "path" [ IN ] and "size" [ IN ] - sets a search path
+ *
+ *  "alt" [ IN ] - use std or alternate volume path algorithm
+ */
+static
+rc_t SRAPathAddSubPath ( DLList *list, const char *path, size_t size, uint8_t alg )
+{
+    /* see if it's already there */
+    SRAPathFindInfo pb;
+    pb . path = path;
+    pb . size = size;
+    pb . found = 0;
+    DLListDoUntil ( list, 0, SRAPathStringFind, & pb );
+    if ( pb . found )
+        return 0;
+
+    /* create a new one */
+    return SRAPathStringMake ( list, path, size, alg );
+}
+
+static
+rc_t SRAPathAddPath ( DLList *list, const char *path, uint8_t alg )
+{
+    rc_t rc;
+    if ( path == NULL )
+        rc = RC ( rcSRA, rcMgr, rcUpdating, rcString, rcNull );
+    else if ( path [ 0 ] == 0 )
+        rc = RC ( rcSRA, rcMgr, rcUpdating, rcString, rcEmpty );
+    else
+    {
+        /* treat path as a Unix-style multi-path */
+        size_t size = string_size ( path );
+        while ( 1 )
+        {
+            /* find separator */
+            const char *sep = string_chr ( path, size, ':' );
+            if ( sep == NULL )
+                break;
+
+            /* add sub-path */
+            rc = SRAPathAddSubPath ( list, path, sep - path, alg );
+            if ( rc != 0 )
+                return rc;
+
+            /* consume ':' */
+            ++ sep;
+
+            /* pop from string */
+            size -= sep - path;
+            path = sep;
+        }
+
+        return SRAPathAddSubPath ( list, path, size, alg );
+    }
+    return rc;
+}
+
+/* AddRepPath
+ *  add a replication path to a repository
+ *
+ *  "rep" [ IN ] - NUL-terminated server search path
+ *  may be a compound path with ':' separator characters, e.g.
+ *  "/panfs/traces01:/panfs/traces31"
+ *
+ *  NB - servers are searched in the order provided,
+ *  first to last, until one of them satisfies a request,
+ *  at which time the successful server is placed at the
+ *  head of the search path.
+ */
+static
+rc_t CC NCBISRAPathAddRepPath ( NCBIRepository* repo, const char *rep )
+{
+    return SRAPathAddPath ( & repo -> repsrv, rep, alg_none );
+}
+static
+rc_t CC NCBISRAPathAddRepPathDefault ( NCBISRAPath *self, const char *rep )
+{
+    return NCBISRAPathAddRepPath ( self -> dflt_repo, rep );
+}
+
+/* AddVolPath
+ *  add a volume path to the default repository
+ *
+ *  "vol" [ IN ] - NUL-terminated volume search path
+ *  may be a compound path with ':' separator characters, e.g.
+ *  "sra2:sra1:sra0"
+ *
+ *  NB - volumes are searched in the order provided,
+ *  first to last. they are never re-ordered.
+ */
+static
+rc_t SRAPathAddAlgVolPath ( NCBIRepository* repo, const char *vol, uint8_t alg )
+{
+    return SRAPathAddPath ( & repo -> vols, vol, alg );
+}
+static
+rc_t CC NCBISRAPathAddVolPathDefault ( NCBISRAPath *self, const char *vol )
+{
+    return SRAPathAddAlgVolPath ( self -> dflt_repo, vol, alg_ncbi);
+}
+
+/* Config
+ *  configure an existing path manager
+ */
+static
+rc_t SRAPathConfigValue ( const KConfig *kfg, const char *node_path,
+    char *value, size_t value_size, const char *dflt )
+{
+    const KConfigNode *node;
+    rc_t rc = KConfigOpenNodeRead ( kfg, & node, "%s", node_path );
+    if ( rc == 0 )
+    {
+        size_t num_read, remaining;
+        rc = KConfigNodeRead ( node, 0, value, value_size - 1, & num_read,  & remaining );
+        if ( rc == 0 )
+        {
+            if ( remaining != 0 )
+                rc = RC ( rcSRA, rcMgr, rcConstructing, rcString, rcExcessive );
+            else
+                value [ num_read ] = 0;
+        }
+
+        KConfigNodeRelease ( node );
+    }
+
+    if ( rc != 0 )
+    {
+        if ( dflt != NULL && dflt [ 0 ] != 0 )
+        {
+            size_t num_read = string_copy_measure ( value, value_size, dflt );
+            rc = 0;
+            if ( num_read == value_size )
+                rc = RC ( rcSRA, rcMgr, rcConstructing, rcString, rcExcessive );
+        }
+        else
+	    	value[0] = 0;     
+    }
+    return rc;
+}
+
+static 
+rc_t ConfigVolume(NCBIRepository* repo, KConfig * kfg, const char* keyPref, const char* keySuff, uint8_t alg )
+{
+    char value [ 4096 ];
+    char key [ 4096 ];
+    size_t pSize = string_size(keyPref);
+    size_t sSize = string_size(keySuff);
+    if ( pSize + sSize >= sizeof(key))
+    {
+        return RC ( rcSRA, rcMgr, rcConstructing, rcString, rcExcessive );
+    }
+    string_copy(key, sizeof(key), keyPref, pSize);
+    string_copy(key + pSize, sizeof(key) - pSize, keySuff, sSize);
+    key[pSize+sSize] = 0;
+    value[0] = '\0';
+    if ( SRAPathConfigValue ( kfg, key, value, sizeof value, NULL ) == 0 )        
+        SRAPathAddAlgVolPath ( repo, value, alg );
+    return 0;
+}
+
+static
+rc_t ConfigRepo(KConfig * kfg, const char *dflt, const char* reps, const char* volPref, uint8_t type, NCBIRepository** repo)
+{
+    char value [ 4096 ] = "";
+    rc_t rc;
+
+    /* set up a new repo */ 
+    rc = SRARepoMake(repo);
+    if ( rc == 0 )
+    {
+        (*repo)->type = type;
+
+        /* set up servers */
+        if ( SRAPathConfigValue ( kfg, reps, value, sizeof value, dflt ) == 0 )
+            NCBISRAPathAddRepPath ( *repo, value );
+
+        if ( type == alg_ncbi )
+        {
+            /* set up NCBI volumes */
+            rc = ConfigVolume( *repo, kfg, volPref, "/ncbi/volumes", alg_ncbi );
+
+            /* set up EBI volumes */
+            if (rc == 0)
+                rc = ConfigVolume( *repo, kfg, volPref, "/ebi/volumes", alg_ebi );
+
+            /* set up DDBJ volumes */
+            if (rc == 0)
+                rc = ConfigVolume( *repo, kfg, volPref, "/ddbj/volumes", alg_ddbj );
+        }
+        else if (rc == 0)
+        {
+                rc = ConfigVolume( *repo, kfg, volPref, "/volumes", type);
+        }
+    }
+    return rc;
+}
+
+static
+rc_t ConfigRepoSet(DLList* repos, KConfig * kfg, const char* kfgPath, const char *dflt, uint8_t type)
+{
+    const KConfigNode *node;
+
+    rc_t rc = KConfigOpenNodeRead ( kfg, & node, "%s", kfgPath );
+    if ( rc == 0 )
+    {
+        KNamelist* children;
+        rc = KConfigNodeListChild ( node, &children );
+        if ( rc == 0 )
+        {
+            uint32_t count;
+            rc = KNamelistCount ( children, &count );
+            if ( rc == 0 )
+            {
+                uint32_t i;
+                for (i = 0; i < count; ++i)
+                {
+                    const char* name;
+                    rc = KNamelistGet ( children, i, &name );
+                    if ( rc == 0 )
+                    {
+                        #define BufSize 4096
+                        char buf[ BufSize ];
+                        size_t bSize = string_size(kfgPath);
+                        string_copy(buf, BufSize, kfgPath, bSize);
+                        if (bSize + string_size(name) < sizeof(buf))
+                        {
+                            NCBIRepository* repo;
+                            string_copy(buf + bSize, sizeof(buf) - bSize, name, string_size(name) + 1);
+                            rc = ConfigRepo( kfg, dflt, buf, buf, type, &repo );
+                            DLListPushTail( repos, (DLNode*) repo );
+                        }
+                        #undef BufSize
+                    }
+                    else
+                    {
+                        rc = RC ( rcSRA, rcMgr, rcConstructing, rcString, rcExcessive );
+                    }
+                    if ( rc != 0 )
+                    {
+                        break;
+                    }
+                }
+            }
+            KNamelistRelease ( children );
+        }
+
+        KConfigNodeRelease ( node );
+    }
+    if (GetRCState(rc) == rcNotFound)
+    {
+        return 0;
+    }
+    return rc;
+}
+
+static
+rc_t SRAPathConfig ( NCBISRAPath *self )
+{
+    const char *dflt;
+    KConfig * kfg;
+    rc_t rc = KConfigMakeLocal ( & kfg, NULL );
+    assert ( ( rc == 0 && kfg != NULL ) || ( rc != 0 && kfg == NULL ) );
+
+    /* look for defaults */
+    dflt = getenv ( "SRAPATH" );
+
+    /* locate and configure all repositories */
+    if ( rc == 0 )
+        rc = ConfigRepoSet( & self->repos, kfg, "/sra/repository/", dflt, alg_ncbi );
+    if ( rc == 0 )
+        rc = ConfigRepoSet( & self->repos, kfg, "/wgs/repository/", dflt, alg_wgs );
+    if ( rc == 0 )
+        rc = ConfigRepoSet( & self->repos, kfg, "/refseq/repository/", dflt, alg_refseq );
+
+    if ( rc == 0 )
+    {   /* default repository for backwards compatibility */
+        rc = ConfigRepo( kfg, dflt, "sra/servers", "sra", alg_ncbi, &self->dflt_repo );
+
+        /* set up REFSEQ volumes */
+        if (rc == 0)
+            rc = ConfigVolume( self->dflt_repo, kfg, "", "/refseq/volumes", alg_refseq );
+
+        /* set up WGS volumes */
+        if (rc == 0)
+            rc = ConfigVolume( self->dflt_repo, kfg, "sra", "/wgs/volumes", alg_wgs );
+    }
+
+    LogPathInfo(self);
+
+    /* kfg may be NULL */        
+    KConfigRelease ( kfg );
+
+    return rc;
+}
+
+
+/* ParseRunAccession
+ *  accession is a string matching <prefix><number>
+ *  extract prefix length and accession number
+ */
+static
+rc_t SRAPathParseRunAccession ( const char *accession, uint32_t *prefix, uint32_t *number )
+{
+    char *end;
+    uint32_t i;
+
+    for ( i = 0; accession [ i ] != 0; ++ i )
+    {
+        if ( isdigit ( accession [ i ] ) )
+            break;
+    }
+
+    if ( i == 0 )
+        return RC ( rcSRA, rcMgr, rcResolving, rcPath, rcInvalid );
+
+    * prefix = i;
+    * number = ( uint32_t ) strtoul ( & accession [ i ], & end, 10 );
+
+    if (( end [ 0 ] == 0 ) || ( end [ 0 ] == '.' ))
+    {
+        return 0;
+    }
+    return RC ( rcSRA, rcMgr, rcResolving, rcPath, rcInvalid );
+}
+
+
+/* Full
+ *  creates full path from server, volume & accession
+ *
+ *  "rep" [ IN ] - NUL terminated full path of replication
+ *  server, e.g. "/panfs/traces01"
+ *
+ *  "vol" [ IN ] - NUL terminated relative path of volume,
+ *  e.g. "sra2"
+ *
+ *  "accession" [ IN ] - NUL terminated run accession,
+ *  e.g. "SRR000001"
+ *
+ *  "path" [ OUT ] and "path_max" [ IN ] - return buffer for
+ *  NUL-terminated full path to accession.
+ */
+static
+rc_t SRAPathFullInt ( const NCBISRAPath *self, const char *rep, const char *vol,
+    const char *accession, char *path, size_t path_max, size_t bank_size )
+{
+    /* pick apart accession */
+    uint32_t prefix, number;
+    rc_t rc = SRAPathParseRunAccession ( accession, & prefix, & number );
+    if ( rc == 0 )
+    {
+        size_t len;
+        size_t total = 0;
+        uint32_t bank = number / bank_size;
+
+        if ( rep [ 0 ] != 0 && vol [ 0 ] != 0 )
+        {
+            /* normally write all parts at once */
+            if ( rep [ strlen (rep) - 1 ] == '/') /* check for need or not a '/' between rep and vol */
+                rc= string_printf ( path, path_max, &len, "%s%s/%.*s/%06u/%s"
+                                 , rep
+                                 , vol
+                                 , ( int ) prefix, accession
+                                 , bank
+                                 , accession );
+            else
+                rc= string_printf  ( path, path_max, &len, "%s/%s/%.*s/%06u/%s"
+                                 , rep
+                                 , vol
+                                 , ( int ) prefix, accession
+                                 , bank
+                                 , accession );
+        }
+        else
+        {
+            /* allow for individual rep-server and volume parts */
+            if ( rep [ 0 ] != 0 )
+            {
+                rc = string_printf ( path, path_max, &len, "%s/", rep );
+                if ( rc != 0 || ( total = len ) >= path_max )
+                    return RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+            }
+            else if ( vol [ 0 ] != 0 )
+            {
+                rc = string_printf ( & path [ total ], path_max - total, &len, "%s/", vol );
+                if ( rc != 0 || ( total = len ) >= path_max )
+                    return RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+            }
+
+            /* append the accession */
+            rc = string_printf ( & path [ total ], path_max - total, &len, "%.*s/%06u/%s"
+                             , ( int ) prefix, accession
+                             , bank
+                             , accession );
+        }
+
+        /* common detection of buffer overflow */
+        if ( rc != 0 || ( total += len ) >= path_max )
+            rc = RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+    }
+
+    return rc;
+}
+
+static
+rc_t SRAPathFullEBI ( const NCBISRAPath *self, const char *rep, const char *vol,
+    const char *accession, char *path, size_t path_max )
+{
+    /* pick apart accession */
+    uint32_t prefix, number;
+    rc_t rc = SRAPathParseRunAccession ( accession, & prefix, & number );
+    if ( rc == 0 )
+    {
+        size_t len;
+        size_t total = 0;
+        uint32_t bank = number / 1000;
+
+        if ( rep [ 0 ] != 0 && vol [ 0 ] != 0 )
+        {
+            /* normally write all parts at once */
+            if ( rep [ strlen (rep) - 1 ] == '/') /* check for need or not a '/' between rep and vol */
+                rc= string_printf ( path, path_max, &len, "%s%s/%.*s/%.*s%03u/%s"
+                                 , rep
+                                 , vol
+                                 , ( int ) prefix, accession
+                                 , ( int ) prefix, accession
+                                 , bank
+                                 , accession );
+            else
+                rc= string_printf  ( path, path_max, &len, "%s/%s/%.*s/%.*s%03u/%s"
+                                 , rep
+                                 , vol
+                                 , ( int ) prefix, accession
+                                 , ( int ) prefix, accession
+                                 , bank
+                                 , accession );
+        }
+        else
+        {
+            /* allow for individual rep-server and volume parts */
+            if ( rep [ 0 ] != 0 )
+            {
+                rc = string_printf ( path, path_max, &len, "%s/", rep );
+                if ( rc < 0 || ( total = len ) >= path_max )
+                    return RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+            }
+            else if ( vol [ 0 ] != 0 )
+            {
+                rc = string_printf ( & path [ total ], path_max - total, &len, "%s/", vol );
+                if ( rc != 0 || ( total = len ) >= path_max )
+                    return RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+            }
+
+            /* append the accession */
+            rc = string_printf ( & path [ total ], path_max - total, &len, "%.*s/%.*s%03u/%s"
+                             , ( int ) prefix, accession
+                             , ( int ) prefix, accession
+                             , bank
+                             , accession );
+        }
+
+        /* common detection of buffer overflow */
+        if ( len < 0 || ( total += len ) >= path_max )
+            rc = RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+    }
+
+    return rc;
+}
+
+/*
+* Refseq-style accessions come in 2 naming flavors, flat or SRA-like.
+* If an accession with a flat name does not exist, use SRAPathFullInt to create an SRA-like path
+*/
+static
+rc_t SRAPathFullREFSEQ ( const NCBISRAPath *self, const char *rep, const char *vol,
+    const char *accession, char *path, size_t path_max )
+{
+    /* pick apart accession */
+    uint32_t prefix, number;
+    rc_t rc = SRAPathParseRunAccession ( accession, & prefix, & number );
+    if ( rc == 0 )
+    {
+        size_t len;
+        size_t total = 0;
+
+        if ( rep [ 0 ] != 0 && vol [ 0 ] != 0 )
+        {
+            /* normally write all parts at once */
+            if ( rep [ strlen (rep) - 1 ] == '/') /* check for need or not a '/' between rep and vol */
+                rc= string_printf ( path, path_max, &len, "%s%s/%s"
+                                 , rep
+                                 , vol
+                                 , accession );
+            else
+                rc= string_printf  ( path, path_max, &len, "%s/%s/%s"
+                                 , rep
+                                 , vol
+                                 , accession );
+        }
+        else
+        {
+            /* allow for individual rep-server and volume parts */
+            if ( rep [ 0 ] != 0 )
+            {
+                rc = string_printf ( path, path_max, &len, "%s/", rep );
+                if ( rc != 0 || ( total = len ) >= path_max )
+                    return RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+            }
+            else if ( vol [ 0 ] != 0 )
+            {
+                rc = string_printf ( & path [ total ], path_max - total, &len, "%s/", vol );
+                if ( rc != 0 || ( total = len ) >= path_max )
+                    return RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+            }
+
+            /* append the accession */
+            rc = string_printf ( & path [ total ], path_max - total, &len, "%s"
+                             , accession );
+        }
+
+        /* common detection of buffer overflow */
+        if ( rc != 0 || ( total += len ) >= path_max )
+            rc = RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+    }
+
+    return rc;
+}
+
+/*
+ * Try to locate in RefSeq Archives:
+ * check for pattern '(\w{4}\d{2})[\.\d]+'; the archive is $1
+ * use the scheme "x-ncbi-legrefseq" for vfs to recognize special case
+ */
+static
+rc_t SRAPathFullREFSEQArchive(NCBISRAPath const *self,
+                              char const rep[],
+                              char const vol[],
+                              char const accession[],
+                              char path[],
+                              size_t path_max
+                             )
+{
+    size_t const rep_sz = strlen(rep);
+    size_t const vol_sz = strlen(vol);
+    char const *const rep_sep = (rep_sz > 0 && rep[rep_sz - 1] != '/') ? "/" : "";
+    char const *const vol_sep = (vol_sz > 0 && vol[vol_sz - 1] != '/') ? "/" : "";
+    size_t sz;
+    unsigned i;
+    VFSManager *vfs;
+    rc_t rc = VFSManagerMake(&vfs);
+    VPath *vpath;
+    KDirectory const *dir;
+    KPathType type;
+    
+    if (rc)
+        return rc;
+    
+    for (i = 0; i < 4; ++i) {
+        int const ch = accession[i];
+        
+        if (ch == 0 || !isalpha(ch))
+            return RC(rcSRA, rcMgr, rcAccessing, rcPath, rcIncorrect);
+    }
+    for ( ; ; ++i) {
+        int const ch = accession[i];
+        
+        if (ch == 0)
+            break;
+        if (ch != '.' && !isdigit(ch))
+            return RC(rcSRA, rcMgr, rcAccessing, rcPath, rcIncorrect);
+    }
+    if (i < 8)
+        return RC(rcSRA, rcMgr, rcAccessing, rcPath, rcIncorrect);
+    
+    rc = string_printf(path, path_max, &sz, "x-ncbi-legrefseq:%s%s%s%s%.6s", rep, rep_sep, vol, vol_sep, accession);
+    if (rc) return rc;
+    i = sz;
+    
+    rc = VPathMake(&vpath, path + 17);
+    if (rc) return rc;
+
+    rc = VFSManagerOpenDirectoryRead(vfs, &dir, vpath);
+    VPathRelease(vpath);
+    VFSManagerRelease(vfs);
+    if (rc) return rc;
+    
+    type = KDirectoryPathType(dir, "tbl/%s", accession);
+    KDirectoryRelease(dir);
+    
+    if (type != kptDir)
+        return RC(rcSRA, rcMgr, rcAccessing, rcPath, rcIncorrect);
+
+    rc = string_printf(path + i, path_max - i, &sz, "#tbl/%s", accession);
+    
+    return rc;
+}
+
+/*
+* WGS style naming: accession name ABCD01 resolves into WGS/AB/CD/ABCD01
+*/
+static
+rc_t SRAPathFullWGS( const NCBISRAPath *self, const char *rep, const char *vol,
+    const char *accession, char *path, size_t path_max )
+{
+    /* pick apart accession */
+    uint32_t prefix, number;
+    rc_t rc = SRAPathParseRunAccession ( accession, & prefix, & number );
+    if ( rc == 0 )
+    {
+        size_t len;
+        size_t total = 0;
+
+        if ( prefix < 4 )
+        {
+            return RC ( rcSRA, rcMgr, rcResolving, rcName, rcTooShort );
+        }
+
+        if ( rep [ 0 ] != 0 && vol [ 0 ] != 0 )
+        {
+            /* normally write all parts at once */
+            if ( rep [ strlen (rep) - 1 ] == '/') /* check for need or not a '/' between rep and vol */
+                rc= string_printf ( path, path_max, &len, "%s%s/WGS/%.2s/%.2s/%s"
+                                 , rep
+                                 , vol
+                                 , accession
+                                 , accession+2
+                                 , accession );
+            else
+                rc= string_printf ( path, path_max, &len, "%s/%s/WGS/%.2s/%.2s/%s"
+                                 , rep
+                                 , vol
+                                 , accession
+                                 , accession+2
+                                 , accession );
+        }
+        else
+        {
+            /* allow for individual rep-server and volume parts */
+            if ( rep [ 0 ] != 0 )
+            {
+                rc = string_printf ( path, path_max, &len, "%s/", rep );
+                if ( rc != 0 || ( total = len ) >= path_max )
+                    return RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+            }
+            else if ( vol [ 0 ] != 0 )
+            {
+                rc = string_printf ( & path [ total ], path_max - total, &len, "%s/", vol );
+                if ( rc != 0 || ( total = len ) >= path_max )
+                    return RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+            }
+
+            /* append the accession */
+                rc= string_printf ( & path [ total ], path_max - total, &len, "WGS/%.2s/%.2s/%s"
+                                 , accession
+                                 , accession+2
+                                 , accession );
+        }
+
+        /* common detection of buffer overflow */
+        if ( rc != 0 || ( total += len ) >= path_max )
+            rc = RC ( rcSRA, rcMgr, rcAccessing, rcBuffer, rcInsufficient );
+    }
+
+    return rc;
+}
+
+static
+rc_t ApplyAlg( const NCBISRAPath *self, const char *rep, const char *vol, 
+    const char *accession, char *path, size_t path_max, NCBIRepository *repo, bool* found)
+{
+    SRAPathFindInfo pb;
+    /* see if we recognize volume */
+    pb . path = vol;
+    pb . size = strlen ( vol );
+    pb . found = 0;
+
+    DLListDoUntil ( & repo -> vols, 0, SRAPathStringFind, & pb );
+    if ( pb . found )
+    {
+        *found = true;
+        switch (pb . alg)
+        {
+        case alg_ebi:
+            return SRAPathFullEBI ( self, rep, vol, accession, path, path_max );
+        case alg_refseq:
+        {
+            rc_t rc = SRAPathFullREFSEQ ( self, rep, vol, accession, path, path_max );
+            if ( rc == 0) /* check for existence of accession at the root of the volume, and if not found try to apply the default path-building scheme */
+            {
+                switch ( KDirectoryPathType ( self -> dir, "%s", path ) )
+                {
+                case kptNotFound:
+                case kptBadPath:
+                    return SRAPathFullREFSEQArchive( self, rep, vol, accession, path, path_max );
+                default:
+                	return 0;
+                }
+            }
+		}            
+        case alg_wgs:
+            return SRAPathFullWGS ( self, rep, vol, accession, path, path_max );
+        default:
+            break;
+        }
+    }
+    *found = false;
+    return 0;
+}
+
+static
+rc_t CC NCBISRAPathFull ( const NCBISRAPath *self, const char *rep, const char *vol,
+    const char *accession, char *path, size_t path_max )
+{
+    NCBIRepository *repo;
+    bool found;
+    rc_t rc;
+
+    /* loop through repositories */ 
+    for ( repo = ( NCBIRepository* ) DLListHead ( & self -> repos );
+          repo != NULL; repo = ( NCBIRepository* ) DLNodeNext ( & repo -> n ) )
+    {
+        rc = ApplyAlg( self, rep, vol, accession, path, path_max, repo, &found);
+        if (found)
+        {
+            return rc;
+        }
+    }
+    /* try the default repository */
+    rc = ApplyAlg( self, rep, vol, accession, path, path_max, self -> dflt_repo, &found);
+    if (found)
+    {
+        return rc;
+    }
+    /* internal version */
+    return SRAPathFullInt ( self, rep, vol, accession, path, path_max, 1024 );
+}
+
+
+/* Test
+ *  returns true if path appears to be accession
+ *  the test is a heuristic, and may return false positives
+ *
+ *  "path" [ IN ] - NUL terminated path to run
+ */
+static
+bool SRAPathTestTable ( const KDirectory *dir, uint32_t type, const char *path )
+{
+    /* differentiate between legacy and current structure */
+    switch ( KDirectoryPathType ( dir, "%s/idx", path ) )
+    {
+    case kptNotFound:
+        switch ( KDirectoryPathType ( dir, "%s/meta", path ) )
+        {
+        case kptFile:
+        case kptFile | kptAlias:
+            switch ( KDirectoryPathType ( dir, "%s/skey", path ) )
+            {
+            case kptFile:
+            case kptFile | kptAlias:
+                return true;
+            }
+            break;
+        }
+        break;
+
+    case kptDir:
+    case kptDir | kptAlias:
+        switch ( KDirectoryPathType ( dir, "%s/md/cur", path ) )
+        {
+        case kptFile:
+        case kptFile | kptAlias:
+            return true;
+        }
+        break;
+    }
+
+    /* not a table */
+    return false;
+}
+
+static
+bool SRAPathTestDatabase ( const KDirectory *dir, uint32_t type, const char *path )
+{
+    /* don't have a more stringent requirement for database at this time */
+    return true;
+}
+
+static
+bool SRAPathTestFile ( const KDirectory *dir, uint32_t type, const char *path )
+{
+    /* TBD - need to look at magic information */
+    return false;
+}
+
+static
+bool SRAPathTestInt ( const KDirectory *dir, uint32_t type, const char *path )
+{
+    switch ( type )
+    {
+    case kptDir:
+    case kptDir | kptAlias:
+        break;
+
+    case kptFile:
+    case kptFile | kptAlias:
+        return SRAPathTestFile ( dir, type, path );
+
+    default:
+        return false;
+    }
+
+    /* detect apparent tables */
+    switch ( KDirectoryPathType ( dir, "%s/col", path ) )
+    {
+    case kptDir:
+    case kptDir | kptAlias:
+        return SRAPathTestTable ( dir, type, path );
+    }
+
+    /* detect apparent databases */
+    switch ( KDirectoryPathType ( dir, "%s/tbl", path ) )
+    {
+    case kptDir:
+    case kptDir | kptAlias:
+        return SRAPathTestDatabase ( dir, type, path );
+    }
+
+    /* not a recognized accession */
+    return false;
+}
+
+static
+bool CC NCBISRAPathTest ( const NCBISRAPath *self, const char *path )
+{
+    return SRAPathTestInt ( self -> dir,
+                            KDirectoryPathType ( self -> dir, "%s", path ), path );
+}
+
+
+/* FindOnServer
+ *  find accession on rep-server 
+ */
+static
+rc_t SRAPathFindOnServer ( const NCBISRAPath *self, const NCBIRepository *repo, const SRAPathString *srv,
+    const char *accession, char *path, size_t path_max, int vol_type )
+{
+    const SRAPathString *vol;
+
+    PATH_DEBUG (("SRAPathFindOnServer(%s)\n", srv->path));
+
+    for ( vol = ( const SRAPathString* ) DLListHead ( & repo -> vols );
+          vol != NULL; vol = ( const SRAPathString* ) DLNodeNext ( & vol -> n ) )
+    {
+        if ( vol_type == alg_none || vol_type == vol->alg )
+        {
+            rc_t rc;
+
+            PATH_DEBUG (("SRAPathFindOnServer trying volume %s\n", vol->path));
+
+            switch ( vol -> alg )
+            {
+            case alg_ebi:
+                rc = SRAPathFullEBI ( self, srv -> path, vol -> path, accession, path, path_max );
+                break;
+            case alg_refseq:
+                rc = SRAPathFullREFSEQ ( self, srv -> path, vol -> path, accession, path, path_max );
+                if ( rc == 0) /* check for existence of accession at the root of the volume, and if not found try to apply the default path-building scheme */
+                {
+                    switch ( KDirectoryPathType ( self -> dir, "%s", path ) )
+                    {
+                    case kptNotFound:
+                    case kptBadPath:
+                        rc = SRAPathFullREFSEQArchive( self, srv -> path, vol -> path, accession, path, path_max );
+                        if (rc == 0) {
+                            PATH_DEBUG (("SRAPathFindOnServer: found(%s)\n", path));
+                            return 0;
+                        }
+                        break;
+                    default:
+                    	return 0;
+                    }
+                }
+                break;
+            case alg_wgs:
+                rc = SRAPathFullWGS ( self, srv -> path, vol -> path, accession, path, path_max );
+                break;
+            default:
+                rc = SRAPathFullInt ( self, srv -> path, vol -> path, accession, path, path_max, 1024 );
+                break;
+            }
+            if ( rc == 0 )
+            {
+                switch ( KDirectoryPathType ( self -> dir, "%s", path ) )
+                {
+                case kptNotFound:
+                case kptBadPath:
+                    break;
+                default:
+                    PATH_DEBUG (("SRAPathFindOnServer: found(%s)\n", path));
+                    return 0;
+                }
+            }
+            else
+            {
+                if ( GetRCState( rc ) == rcInsufficient )
+                    return rc;
+            }
+        }
+    }
+
+    return RC ( rcSRA, rcMgr, rcSelecting, rcPath, rcNotFound );
+}
+
+/* FindInRepo
+ *  find accession in a repository
+ */
+static
+rc_t SRAPathFindInRepo ( const NCBISRAPath *self, NCBIRepository *repo, const char *accession, 
+                         char *path, size_t path_max, size_t *rep_len, int vol_type )
+{
+    SRAPathString *srv;
+
+    PATH_DEBUG (("SRAPathFindInRepo(%s)\n", AlgToStr(repo->type)));
+
+    /* look for accession on a rep-server */
+    for ( srv = ( SRAPathString* ) DLListHead ( & repo -> repsrv ); srv != NULL; srv = ( SRAPathString* ) DLNodeNext ( & srv -> n ) )
+    {
+        /* try with this server */
+        rc_t rc = SRAPathFindOnServer ( self, repo, srv, accession, path, path_max, vol_type );
+        if ( rc == 0 )
+        {
+            /* make sure server is at head of list */
+            if ( DLNodePrev ( & srv -> n ) != NULL )
+            {
+                DLListUnlink ( & repo -> repsrv, & srv -> n );
+                DLListPushHead ( & repo -> repsrv, & srv -> n );
+            }
+
+            if ( rep_len != NULL )
+                * rep_len = strlen ( srv -> path );
+            
+            return 0;
+        }
+
+        if ( GetRCState ( rc ) != rcNotFound )
+            return rc;
+    }
+
+    return RC ( rcSRA, rcMgr, rcSelecting, rcPath, rcNotFound );
+}
+
+/* FindInRepoByType
+ *  find accession in a repository of a given type
+ */
+static
+rc_t SRAPathFindInRepoByType ( const NCBISRAPath *self, const char *accession, char *path, size_t path_max, size_t *rep_len, int repo_type, int vol_type )
+{
+    /* loop through all repositories */
+    NCBIRepository *repo; 
+    for ( repo = ( NCBIRepository* ) DLListHead ( & self -> repos ); repo != NULL; repo = ( NCBIRepository* ) DLNodeNext ( & repo -> n ) )
+    {
+        if ( repo->type == repo_type && SRAPathFindInRepo(self, repo, accession, path, path_max, rep_len, vol_type) == 0 )
+            return 0;
+    }
+    return RC ( rcSRA, rcMgr, rcSelecting, rcPath, rcNotFound );
+}
+
+/* FastFind
+ * Uses heuristics to select the repository most likely to contain the accession, then tries to locate the acecssion in the repository.
+*/
+static
+rc_t FindFast( const NCBISRAPath *cself, const char *accession, char *path, size_t path_max, size_t *rep_len )
+{
+    /*TODO: look up cache first */
+    
+    /* recognize known naming schemes */
+    size_t size = string_size(accession);
+    if ( string_cmp(accession, size, "SRR", 3, 3) == 0 )
+        return SRAPathFindInRepoByType(cself, accession, path, path_max, rep_len, alg_ncbi, alg_ncbi);
+
+    if ( string_cmp(accession, size, "ERR", 3, 3) == 0 )
+        return SRAPathFindInRepoByType(cself, accession, path, path_max, rep_len, alg_ncbi, alg_ebi);
+
+    if ( string_cmp(accession, size, "DRR", 3, 3) == 0 )
+        return SRAPathFindInRepoByType(cself, accession, path, path_max, rep_len, alg_ncbi, alg_ddbj);
+        
+    if ( string_chr(accession, size, '.') != NULL )
+        return SRAPathFindInRepoByType(cself, accession, path, path_max, rep_len, alg_refseq, alg_none);    
+        
+    if ( size > 2 && isdigit(accession[size-1]) && isdigit(accession[size-2]) && ! isdigit(accession[size-3]) ) 
+        return SRAPathFindInRepoByType(cself, accession, path, path_max, rep_len, alg_wgs, alg_none);    
+        
+    return RC ( rcSRA, rcMgr, rcSelecting, rcPath, rcNotFound );
+}
+
+/* Find
+ *  finds location of run within rep-server/volume matrix
+ *
+ *  "accession" [ IN ] - NUL terminated run accession,
+ *   e.g. "SRR000001"
+ *
+ *  "path" [ OUT ] and "path_max" [ IN ] - return buffer for
+ *  NUL-terminated full path to accession.
+ *
+ *  returns 0 if path exists, rc state rcNotFound if
+ *  path cannot be found, and rcInsufficient if buffer is
+ *  too small.
+ */
+static
+rc_t CC NCBISRAPathFindWithRepLen ( const NCBISRAPath *cself, const char *accession, char *path, size_t path_max, size_t *rep_len )
+{
+    rc_t rc;
+    NCBIRepository *repo;
+
+    PATH_DEBUG(("NCBISRAPathFindWithRepLen(%s)\n", accession));
+
+    rc = FindFast( cself, accession, path, path_max, rep_len );
+    if ( rc == 0 )
+        return 0;
+        
+    /* loop through all repositories */ 
+    for ( repo = ( NCBIRepository* ) DLListHead ( & cself -> repos ); repo != NULL; repo = ( NCBIRepository* ) DLNodeNext ( & repo -> n ) )
+    {
+        rc = SRAPathFindInRepo(cself, repo, accession, path, path_max, rep_len, alg_none);
+        if ( rc == 0 )
+            return 0;
+    }
+    /* default repository */
+    return SRAPathFindInRepo(cself, cself -> dflt_repo, accession, path, path_max, rep_len, alg_none);
+}
+
+struct SRAPath_vt_v2 vtSRAPath =
+{
+    2, 1,
+    NCBISRAPathAddRef,
+    NCBISRAPathRelease,
+    NCBISRAPathVersion,
+    NCBISRAPathClear,
+    NCBISRAPathAddRepPathDefault,
+    NCBISRAPathAddVolPathDefault,
+    NCBISRAPathFull,
+    NCBISRAPathTest,
+    NCBISRAPathFindWithRepLen
+};
+
+/* Make
+ *  create path manager
+ *
+ *  the path manager should already be configured with
+ *  standard search paths, but can be augmented by using
+ *  the Add*Path messages.
+ *
+ *  "dir" [ IN, NULL OKAY ] - optional root directory to use
+ *  attaches a new reference
+ */
+MOD_EXPORT
+rc_t CC SRAPathMakeImpl ( SRAPath **pm, const KDirectory *dir )
+{
+    rc_t rc;
+
+    if ( pm == NULL )
+        rc = RC ( rcSRA, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        NCBISRAPath *p = (NCBISRAPath *) malloc ( sizeof * p );
+        if ( p == NULL )
+            rc = RC ( rcSRA, rcMgr, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            p -> dad . vt = ( SRAPath_vt* ) & vtSRAPath;
+            p -> dir = dir;
+            if ( dir != NULL )
+                rc = KDirectoryAddRef ( dir );
+            else
+            {
+                KDirectory *wd;
+                rc = KDirectoryNativeDir ( & wd );
+                p -> dir = wd;
+            }
+
+            if ( rc != 0 )
+                free ( p );
+            else
+            {
+                DLListInit ( & p -> repos );
+                p -> dflt_repo = NULL;
+                atomic32_set ( & p -> refcount, 1 );
+
+                /* the object is now complete */
+                rc = SRAPathConfig ( p );
+                if ( rc == 0 )
+                {
+                    * pm = & p -> dad;
+                    return 0;
+                }
+
+                SRAPathWhack ( p );
+            }
+        }
+
+        * pm = NULL;
+    }
+
+    return rc;
+}
diff --git a/libs/vfs/unix/syskeyring.c b/libs/vfs/unix/syskeyring.c
new file mode 100644
index 0000000..19f79a7
--- /dev/null
+++ b/libs/vfs/unix/syskeyring.c
@@ -0,0 +1,161 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vfs/keyring-priv.h>
+
+#include <kfg/config.h>
+
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/printf.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/lockfile.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/wait.h>
+
+#include <stdio.h>
+
+#ifndef MAX_PATH
+#define MAX_PATH 4096
+#endif
+
+const char* KeyRingDefaultDataDir = "~/.ncbi";
+
+/*TODO: move to ../keyring.c */
+LIB_EXPORT bool CC KKeyRingIsServerRunning(const char* dataDir)
+{   
+    KDirectory* wd;
+    rc_t rc = KDirectoryNativeDir (&wd);
+    if (rc == 0)
+    {
+        char lockFileName[MAX_PATH];
+        if (dataDir == NULL)
+            dataDir = KeyRingDefaultDataDir;
+        rc = string_printf(lockFileName, sizeof(lockFileName)-1, NULL, "%s/keyring_lock", dataDir);
+        
+        if (rc == 0)
+        {
+            KFile* lockedFile;
+            rc = KDirectoryCreateExclusiveAccessFile(wd, &lockedFile, true, 0600, kcmOpen, "%s", lockFileName);
+            if (rc == 0)
+                KFileRelease(lockedFile);
+        }
+        KDirectoryRelease(wd);
+    }
+    return rc != 0;
+}
+
+rc_t StartKeyRing(const char* dataDir)
+{
+    rc_t rc = 0;
+    
+    pid_t child = fork();
+    switch (child)
+    {
+        case 0: /* child */
+        {   /* become the server */
+        
+/*TODO: calculate based on $(APPPATH) in kfg */
+const char* KeyRingServerExeName = "/home/boshkina/internal/asm-trace/centos/gcc/stat/x86_64/dbg/bin/keyring-srv";
+
+            if (dataDir == NULL)
+                dataDir = "~/.ncbi";
+            LogMsg(klogInfo, "Keyring: execl...");
+
+            if (execl(KeyRingServerExeName, KeyRingServerExeName, dataDir, NULL) == -1)
+            {   /* TODO: look around:
+                    - same dir as the current executable (kfg/APPPATH)
+                    - current dir
+                    - etc.
+                */
+            }
+            pLogMsg(klogErr, 
+                    "Keyring: execl($(exe)) failed ($(errno)=$(perrno))", 
+                    "exe=%s,errno=%d,perrno=%!", 
+                    KeyRingServerExeName, errno, errno);
+            exit(1);
+            break;
+        }
+        case -1: /* error */
+        {
+            switch (errno)
+            {
+            case EAGAIN:
+            case ENOMEM:
+                rc = RC (rcVFS, rcProcess, rcProcess, rcMemory, rcInsufficient);
+                break;
+            case ENOSYS:
+                rc = RC (rcVFS, rcProcess, rcProcess, rcInterface, rcUnsupported);
+                break;
+            default:
+                rc = RC (rcVFS, rcProcess, rcProcess, rcError, rcUnknown);
+                break;
+            }
+            break;
+        }
+        default: /* parent */
+            break;
+    }
+        
+    return rc;
+}
+
+#if 0
+static
+rc_t GetAppPath(const char* buf, size_t bufsize)
+{
+    KConfig* kfg;
+    rc_t rc = KConfigMake(&kfg, NULL);
+    if (rc == 0)
+    {
+        const KConfigNode *node;
+        char path[] = "APPPATH";
+        char buf[4096];
+        size_t num_read;
+        rc_t rc2;
+    
+        rc_t rc=KConfigOpenNodeRead(kfg, &node, path, string_measure(path, NULL), "%s", buf);
+        if (rc == 0) 
+        {
+            rc = KConfigNodeRead(node, 0, buf, bufsize, &num_read, NULL);
+            rc2 = KConfigNodeRelease(node);
+            if (rc == 0)
+                rc = r2;
+        }
+        rc2 = KConfigRelease(kfg);
+        if (rc == 0)
+            rc = r2;
+    }
+    return rc;
+}
+#endif
diff --git a/libs/vfs/unix/syspath.c b/libs/vfs/unix/syspath.c
new file mode 100644
index 0000000..b257267
--- /dev/null
+++ b/libs/vfs/unix/syspath.c
@@ -0,0 +1,155 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vfs/extern.h>
+
+#include "path-priv.h"
+
+#include <vfs/manager.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <sysalloc.h>
+
+
+/*--------------------------------------------------------------------------
+ * VFSManager
+ */
+
+
+/* MakeSysPath
+ *  make a path object from an OS native filesystem path string
+ *
+ *  "new_path" [ OUT ] - return parameter for new path object
+ *
+ *  "sys_path" [ IN ] - a UTF-8 NUL-terminated string
+ *  representing a native filesystem path
+ *
+ *  "wide_sys_path" [ IN ] - a wide NUL-terminated string
+ *  representing a native filesystem path, where
+ *  wchar_t is either USC-2 or UTF-32 depending upon libraries
+ */
+LIB_EXPORT rc_t CC VFSManagerMakeSysPath ( const VFSManager * self,
+    VPath ** new_path, const char * sys_path )
+{
+    rc_t rc;
+
+    if ( sys_path != NULL )
+    {
+        /* POSIX paths are our normal path type */
+        return VFSManagerMakePath ( self, new_path, "%s", sys_path );
+    }
+
+    if ( new_path == NULL )
+        rc = RC ( rcVFS, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVFS, rcMgr, rcConstructing, rcSelf, rcNull );
+        else
+            rc = RC ( rcVFS, rcMgr, rcConstructing, rcPath, rcNull );
+
+        * new_path = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VFSManagerWMakeSysPath ( const VFSManager * self,
+    VPath ** new_path, const wchar_t * wide_sys_path )
+{
+    rc_t rc;
+
+    if ( new_path == NULL )
+        rc = RC ( rcVFS, rcMgr, rcConstructing, rcParam, rcNull );
+    else
+    {
+        if ( self == NULL )
+            rc = RC ( rcVFS, rcMgr, rcConstructing, rcSelf, rcNull );
+        else if ( wide_sys_path == NULL )
+            rc = RC ( rcVFS, rcMgr, rcConstructing, rcPath, rcNull );
+        else
+        {
+            size_t src_size, dst_size;
+            uint32_t len = wchar_cvt_string_measure ( wide_sys_path, & src_size, & dst_size );
+            if ( len == 0 )
+                rc = RC ( rcVFS, rcMgr, rcConstructing, rcPath, rcEmpty );
+            else
+            {
+                /* transform to UTF-8 */
+                size_t copy_size;
+                char utf8_path [ 4096 ], *dst = utf8_path;
+                if ( dst_size < sizeof utf8_path )
+                    dst_size = sizeof utf8_path;
+                else
+                {
+                    dst = malloc ( ++ dst_size );
+                    if ( dst == NULL )
+                        rc = RC ( rcVFS, rcMgr, rcConstructing, rcMemory, rcExhausted );
+                }
+
+                copy_size = wchar_cvt_string_copy ( dst, dst_size, wide_sys_path, src_size );
+                if ( copy_size >= dst_size )
+                    rc = RC ( rcVFS, rcMgr, rcConstructing, rcBuffer, rcInsufficient );
+                else
+                {
+                    dst [ copy_size ] = 0;
+                    rc = VFSManagerMakePath ( self, new_path, "%s", dst );
+                }
+
+                if ( dst != utf8_path )
+                    free ( dst );
+
+                if ( rc == 0 )
+                    return 0;
+            }
+        }
+
+        * new_path = NULL;
+    }
+
+    return rc;
+}
+
+LIB_EXPORT rc_t CC VPathReadSysPath ( const VPath * self,
+    char * buffer, size_t buffer_size, size_t * num_read )
+{
+    return VPathReadPath ( self, buffer, buffer_size, num_read );
+}
+
+/* ==========================================
+             HACK O' MATIC
+ */
+
+LIB_EXPORT rc_t LegacyVPathMakeSysPath ( VPath ** new_path, const char * sys_path )
+{
+    return LegacyVPathMake ( new_path, sys_path );
+}
diff --git a/libs/vxf/.gitignore b/libs/vxf/.gitignore
new file mode 100644
index 0000000..c253038
--- /dev/null
+++ b/libs/vxf/.gitignore
@@ -0,0 +1 @@
+*.def
diff --git a/libs/vxf/Makefile b/libs/vxf/Makefile
new file mode 100644
index 0000000..c939964
--- /dev/null
+++ b/libs/vxf/Makefile
@@ -0,0 +1,196 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/vxf
+
+INT_LIBS = \
+	libvxf \
+	libwvxf
+
+OBJFILES = \
+	$(VXF_OBJ) \
+	$(WVXF_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+RWORKDIR = $(BINDIR)
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(TARGDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# vdb transform library
+#
+$(TARGDIR)/libvxf: $(addprefix $(ILIBDIR)/libvxf.,$(ILIBEXT))
+
+VXF_SRC = \
+	ceil \
+	clip \
+	cut \
+	echo \
+	exists \
+	floor \
+	paste \
+	round \
+	trunc \
+	unzip \
+	map \
+	funzip \
+	vec-sum \
+	min \
+	max \
+	rldecode \
+	pack \
+	unpack \
+	izip \
+	iunzip \
+	diff \
+	sum \
+	bit_or \
+	trim \
+	deriv \
+	integral \
+	integral_0 \
+	delta \
+	undelta \
+	add-row-id \
+	subtract-row-id \
+	irzip \
+	rand_4na_2na \
+	outlier-encoder \
+	outlier-decoder \
+	bunzip \
+	simple-sub-select \
+	extract_token \
+	strtonum \
+	sprintf \
+	wgs-tokenize-accession \
+	lower-case-tech-reads
+
+VXF_OBJ = \
+	$(addsuffix .$(LOBX),$(VXF_SRC))
+
+VXF_LIB = \
+	-dvdb \
+	-dklib \
+	-dm \
+	-dz \
+	-dbz2
+
+$(ILIBDIR)/libvxf.$(LIBX): $(VXF_OBJ)
+	$(LD) --slib -o $@ $^ $(VXF_LIB)
+
+#-------------------------------------------------------------------------------
+# wvdb transform library
+#
+
+$(TARGDIR)/libwvxf: $(addprefix $(ILIBDIR)/libwvxf.,$(ILIBEXT))
+
+WVXF_SRC = \
+	$(VXF_SRC) \
+	zip \
+	bzip \
+	fzip \
+	rlencode \
+	checksum
+
+WVXF_OBJ = \
+	$(addsuffix .$(LOBX),$(WVXF_SRC))
+
+# temporary
+WVXF_LIB = \
+	-dwvdb \
+	-dwkdb \
+	-dklib \
+	-dm \
+	-dz \
+	-dbz2
+
+$(ILIBDIR)/libwvxf.$(LIBX): $(WVXF_OBJ)
+	$(LD) --slib -o $@ $^ $(WVXF_LIB)
+
+libwvxf.vers.h:
+	@ true
+
+.PHONY: $(TARGDIR)/libwvxf
+
+#-------------------------------------------------------------------------------
+# vdb entrez library
+#
+ifeq (win,$(OS))
+$(TARGDIR)/libvxfentrez:
+	@ true
+else
+$(TARGDIR)/libvxfentrez: $(addprefix $(ILIBDIR)/libvxfentrez.,$(ILIBEXT))
+endif
+
+VXF_ENTREZ_SRC = \
+	entrez
+
+VXF_ENTREZ_OBJ = \
+	$(addsuffix .$(LOBX),$(VXF_ENTREZ_SRC))
+
+VXF_ENTREZ_LIB = \
+	-dvdb \
+	-dkns \
+	-dklib \
+	-dm \
+	-dz
+
+$(ILIBDIR)/libvxfentrez.$(LIBX): $(VXF_ENTREZ_OBJ)
+	$(LD) --slib -o $@ $^ $(VXF_ENTREZ_LIB)
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/vxf/add-row-id.c b/libs/vxf/add-row-id.c
new file mode 100644
index 0000000..b07e9c2
--- /dev/null
+++ b/libs/vxf/add-row-id.c
@@ -0,0 +1,80 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <arch-impl.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+static
+rc_t CC add_int64_t ( void *self, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt,
+    uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint32_t i;
+    int64_t *dst;
+    const int64_t *src = argv [ 0 ] . u . data . base;
+    uint64_t elem_count = argv [ 0 ] . u . data . elem_count;
+
+    assert ( rslt -> data -> elem_bits == 64 );
+    rc = KDataBufferResize ( rslt -> data, elem_count );
+    if ( rc != 0 )
+        return rc;
+
+    dst = rslt -> data -> base;
+    rslt -> elem_count = elem_count;
+
+    /* while this function is typically used on single-element rows,
+       we advertise taking rows of any length... */
+    for ( i = 0, src += argv [ 0 ] . u . data . first_elem; i < elem_count; ++ i )
+        dst [ i ] = src [ i ] + row_id;
+
+    return 0;
+}
+
+
+/* add_row_id
+ *  return the sum of input and current row id
+ *
+ *  "in" [ DATA ]
+ *
+ * SYNOPSIS:
+ *  corrects for series that have been offset by row-id
+ */
+VTRANSFACT_IMPL ( vdb_add_row_id, 1, 0, 0 ) ( const void *fself, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* version 1.0 operates on I64 input */
+    rslt -> u . ndf = add_int64_t;
+    rslt -> variant = vftNonDetRow;
+    return 0;
+}
diff --git a/libs/vxf/bit_or.c b/libs/vxf/bit_or.c
new file mode 100644
index 0000000..bc67aed
--- /dev/null
+++ b/libs/vxf/bit_or.c
@@ -0,0 +1,135 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <assert.h>
+
+typedef struct tag_self_t {
+    uint8_t     align;
+} self_t;
+
+static void CC self_whack( void *Self )
+{
+    free( Self );
+}
+static
+rc_t CC bit_or_impl(
+                 void *Self,
+                 const VXformInfo *info,
+                 int64_t row_id,
+                 VRowResult *rslt,
+                 uint32_t argc,
+                 const VRowData argv[]
+                          )
+{                                                                        
+    rc_t rc;
+    uint32_t a_size,b_size;
+    const self_t *self = Self;
+    const uint8_t *a = argv[0].u.data.base;
+    const uint8_t *b = argv[1].u.data.base;
+    uint8_t *dst;
+
+    a += argv[0].u.data.first_elem;
+    b += argv[1].u.data.first_elem;
+
+    assert((argv[0].u.data.elem_bits&7)== 0);
+    assert(argv[1].u.data.elem_bits==argv[0].u.data.elem_bits);
+
+    rslt->elem_bits = argv[0].u.data.elem_bits;
+    
+    a_size = argv[0].u.data.elem_count * (argv[0].u.data.elem_bits>>3);
+    b_size = argv[1].u.data.elem_count * (argv[1].u.data.elem_bits>>3);
+    if(a_size >= b_size){ /**** leaving a > b *****/
+	rslt->elem_count = argv[0].u.data.elem_count;
+    } else { /*** switching so  a > b ***/
+	const uint8_t *t;
+	uint32_t       t_size;
+	rslt->elem_count = argv[1].u.data.elem_count;
+	t=a;a=b;b=t;
+	t_size=a_size;a_size=b_size;b_size=t_size;
+    } 
+    /*** everything a is now the largest ***/
+    rc = KDataBufferResize ( rslt->data, a_size );
+    if(rc==0){
+	dst = rslt -> data -> base;
+
+	if(b_size == 0){/*** trivial shortcut ***/
+		memmove(dst,a,a_size);
+		return 0;
+	}
+	if(self -> align == 1){ /*** left side align ***/
+		while(a_size > b_size){
+			*dst++ = *a++;
+			a_size--;
+		}
+	}
+	while(b_size > 0){
+		*dst++ = *a++ | *b++;
+		a_size--;
+		b_size--;
+		
+	}
+	while(a_size > 0){
+		*dst++ = *a++;
+                a_size--;
+	}
+    }
+    return 0;
+}
+
+VTRANSFACT_IMPL ( vdb_bit_or, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    self_t *self;
+            
+    self = malloc(sizeof(*self));
+    if (self) {
+	self->align = cp->argv[0].data.u8[0];
+	rslt->self = self;
+	rslt->whack = self_whack;
+	rslt->variant = vftRow;
+	rslt->u.rf = bit_or_impl;
+	return 0;
+    }
+    rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    return rc;
+}
diff --git a/libs/vxf/bunzip.c b/libs/vxf/bunzip.c
new file mode 100644
index 0000000..3ea4309
--- /dev/null
+++ b/libs/vxf/bunzip.c
@@ -0,0 +1,130 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <klib/data-buffer.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <endian.h>
+#include <byteswap.h>
+#include <string.h>
+#include <bzlib.h>
+
+static rc_t invoke_bzip2 ( void *dst, size_t dsize, const void *src, size_t ssize )
+{
+    int bzerr;
+
+    bz_stream s;
+    memset ( & s, 0, sizeof s );
+    bzerr = BZ2_bzDecompressInit ( & s, 0, 0 );
+    if ( bzerr != BZ_OK )
+        return RC ( rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted );
+
+    s.next_in = (void *)src;
+    s.avail_in = ssize;
+    s.next_out = dst;
+    s.avail_out = dsize;
+    
+    bzerr = BZ2_bzDecompress(&s);
+    BZ2_bzDecompressEnd ( & s );
+
+    switch ( bzerr )
+    {
+    case BZ_OK:
+    case BZ_STREAM_END:
+        break;
+    default:
+        return RC(rcXF, rcFunction, rcExecuting, rcNoObj, rcUnexpected);
+    }
+
+    return 0;
+}
+
+static
+rc_t bunzip_func_v1 ( const VXformInfo *info, VBlobResult *dst, const VBlobData *src )
+{
+    dst->byte_order = src->byte_order;
+    return invoke_bzip2 ( dst->data, (((size_t)dst->elem_count * dst->elem_bits + 7) >> 3),
+                          src->data, (((size_t)src->elem_count * src->elem_bits + 7) >> 3));
+}
+
+static
+rc_t bunzip_func_v2 ( const VXformInfo *info,
+    VBlobResult *dst, const VBlobData *src, VBlobHeader *hdr )
+{
+    int64_t trailing;
+    rc_t rc = VBlobHeaderArgPopHead ( hdr, & trailing );
+    if ( rc == 0 )
+    {
+        dst -> elem_count *= dst -> elem_bits;
+        dst -> byte_order = src -> byte_order;
+        dst -> elem_bits = 1;
+
+        rc = invoke_bzip2 ( dst->data, (((size_t)dst->elem_count + 7) >> 3),
+                            src->data, (((size_t)src->elem_count * src->elem_bits + 7) >> 3));
+        if ( rc == 0 )
+        {
+            dst -> elem_count &= ( uint64_t ) ~ 7;
+            dst -> elem_count |= trailing;
+        }
+    }
+
+    return rc;
+}
+
+
+static
+rc_t CC bunzip_func ( void *Self, const VXformInfo *info,
+    VBlobResult *dst, const VBlobData *src, VBlobHeader *hdr )
+{
+    switch ( VBlobHeaderVersion ( hdr ) )
+    {
+    case 1:
+        return bunzip_func_v1(info, dst, src);
+    case 2:
+        return bunzip_func_v2(info, dst, src, hdr);
+    }
+
+    return RC(rcXF, rcFunction, rcExecuting, rcParam, rcBadVersion);
+}
+
+/* bunzip
+ *  function any bunzip #1.0 ( bzip2_fmt in );
+ */
+VTRANSFACT_IMPL ( vdb_bunzip, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftBlob;
+    rslt->u.bf = bunzip_func;
+
+    return 0;
+}
diff --git a/libs/vxf/bzip.c b/libs/vxf/bzip.c
new file mode 100644
index 0000000..f6bd457
--- /dev/null
+++ b/libs/vxf/bzip.c
@@ -0,0 +1,184 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <sysalloc.h>
+
+#include <string.h>
+#include <bzlib.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <stdio.h>
+#include <assert.h>
+
+#define BUFFER_GROWTH_RATE (128 * 1024)
+
+typedef struct bzip_t bzip_t;
+struct bzip_t
+{
+    int32_t blockSize100k;
+    int32_t workFactor;
+};
+
+#if _DEBUGGING
+/*
+static
+void debug_print_bz_stream(const bz_stream *s)
+{
+    printf("avail_in: %u, avail_out: %u, total_in_lo32: %u, total_in_hi32: %u, total_out_lo32: %u, total_out_hi32: %u\n",
+           s->avail_in,
+           s->avail_out,
+           s->total_in_lo32, s->total_in_hi32,
+           s->total_out_lo32, s->total_out_hi32);
+}
+*/
+#endif
+
+static
+rc_t invoke_bzip2 ( bzip_t *self, void *dst, uint32_t *dsize, const void *src, uint32_t ssize)
+{
+    int bzerr;
+
+    bz_stream s;
+    memset ( & s, 0, sizeof s );
+    bzerr = BZ2_bzCompressInit ( & s, self -> blockSize100k, 0, self -> workFactor );
+    if ( bzerr != BZ_OK )
+        return RC ( rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted );
+    
+    s.next_in = (void *)src;
+    s.avail_in = ssize;
+    s.next_out = dst;
+    s.avail_out = *dsize;
+    
+    *dsize = 0;
+    bzerr = BZ2_bzCompress(&s, BZ_FINISH);
+    switch (bzerr)
+    {
+    case BZ_OK:
+    case BZ_RUN_OK:
+    case BZ_FINISH_OK:
+    case BZ_STREAM_END:
+        break;
+    default:
+#if _DEBUGGING
+        fprintf(stderr, "BZ2_bzCompress: unexpected bzip2 error %i\n", bzerr);
+#endif
+        BZ2_bzCompressEnd ( & s );
+        return RC(rcXF, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+    }
+
+    assert ( s.total_out_hi32 == 0 );
+    *dsize = s.total_out_lo32;
+
+
+    BZ2_bzCompressEnd ( & s );
+
+    return 0;
+}
+
+static
+rc_t CC bzip_func ( void *Self, const VXformInfo *info,
+    VBlobResult *dst, const VBlobData *src, VBlobHeader *hdr )
+{
+    rc_t rc;
+    bzip_t *self = Self;
+
+    /* input bits */
+    uint64_t sbits = ( uint64_t) src -> elem_count * src -> elem_bits;
+
+    /* input bytes */
+    uint32_t ssize = ( uint32_t ) ( ( sbits + 7 ) >> 3 );
+
+    /* required output size */
+    uint32_t dsize = ( uint32_t ) ( ( ( size_t ) dst -> elem_count * dst->elem_bits + 7 ) >> 3 );
+
+    if ( ( sbits & 7 ) == 0 )
+        /* version 1 is byte-aligned */
+        VBlobHeaderSetVersion ( hdr, 1 );
+    else
+    {
+        VBlobHeaderSetVersion ( hdr, 2 );
+        VBlobHeaderArgPushTail ( hdr, ( int64_t ) ( sbits & 7 ) );
+    }
+
+    rc = invoke_bzip2 ( self, dst -> data, & dsize, src -> data, ssize);
+    if (rc == 0)
+    {
+        dst->elem_bits = 1;
+        dst->byte_order = src->byte_order;
+        if (dsize != 0)
+            dst->elem_count = dsize << 3;
+        else
+            rc = RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+    }
+
+    return rc;
+}
+
+/* bzip
+ * function bzip2_fmt bzip #1.0 < * U32 blockSize100k, U32 workFactor > ( any in );
+ */
+VTRANSFACT_IMPL ( vdb_bzip, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    bzip_t *fself;
+
+    int blockSize100k = 5;
+    int workFactor = 0;
+
+    if ( cp -> argc > 0 )
+    {
+        blockSize100k = cp -> argv [ 0 ] . data . i32 [ 0 ];
+        if ( blockSize100k < 1 || blockSize100k > 9 )
+            return RC(rcXF, rcFunction, rcConstructing, rcParam, rcInvalid);
+        if ( cp -> argc > 1 )
+        {
+            workFactor = cp -> argv [ 1 ] . data . i32 [ 0 ];
+            if ( workFactor > 250 )
+                return RC(rcXF, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+    }
+
+    fself = malloc ( sizeof *fself );
+    if ( fself == NULL )
+        return RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    fself -> blockSize100k = blockSize100k;
+    fself -> workFactor = workFactor;
+
+    rslt->self = fself;
+    rslt->whack = free;
+    rslt->variant = vftBlob;
+    rslt->u.bf = bzip_func;
+        
+    return 0;
+}
diff --git a/libs/vxf/ceil.c b/libs/vxf/ceil.c
new file mode 100644
index 0000000..141d868
--- /dev/null
+++ b/libs/vxf/ceil.c
@@ -0,0 +1,48 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <math.h>
+#include <assert.h>
+
+#define FLOAT_FUNC ceilf
+#define DOUBLE_FUNC ceil
+#include "math-funcs-impl.h"
+
+/*
+ function < type T >
+ T vdb:ceil #1.0 ( T in );
+ */
+VTRANSFACT_IMPL(vdb_ceil, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp ) {
+    return factory(self, info, rslt, cp, dp);
+}
diff --git a/libs/vxf/checksum.c b/libs/vxf/checksum.c
new file mode 100644
index 0000000..46bc9f3
--- /dev/null
+++ b/libs/vxf/checksum.c
@@ -0,0 +1,566 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <vdb/schema.h>
+#include <kdb/meta.h>
+#include <klib/checksum.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <bitstr.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+typedef struct CRC32State CRC32State;
+struct CRC32State
+{
+    uint64_t len;
+    uint32_t crc;
+};
+
+typedef struct checksum checksum;
+struct checksum
+{
+    KMetadata *meta;
+
+    void ( * swap ) ( checksum *self );
+    void ( * sum ) ( checksum *self, const void *data, size_t bytes );
+    size_t ( * digest ) ( checksum *self, uint8_t *buff, size_t bsize );
+
+    size_t valid;
+    union
+    {
+        CRC32State crc32;
+        MD5State md5;
+        SHA1State sha1;
+        SHA256State sha256;
+        SHA384State sha384;
+        SHA512State sha512;
+        uint8_t buff [ 1 ];
+    } u;
+
+    bool byte_swap;
+    char node [ 1 ];
+};
+
+/*--------------------------------------------------------------------------
+ * CRC32
+ */
+static
+void vdb_crc32swap ( checksum *self )
+{
+    self -> u . crc32 . len = bswap_64 ( self -> u . crc32 . len );
+    self -> u . crc32 . crc = bswap_32 ( self -> u . crc32 . crc );
+}
+
+static
+void vdb_crc32sum ( checksum *self, const void *data, size_t bytes )
+{
+    self -> u . crc32 . crc = CRC32 ( self -> u . crc32 . crc, data, bytes );
+    self -> u . crc32 . len += bytes;
+}
+
+static
+size_t vdb_crc32digest ( checksum *self, uint8_t *buff, size_t bsize )
+{
+    uint64_t len = self -> u . crc32 . len;
+    uint8_t ch[sizeof(len)];
+    unsigned i;
+
+    assert ( bsize >= 4 );
+
+    for (i = 0; len; len >>= 8, ++i)
+        ch[i] = (uint8_t)len;
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    * ( uint32_t* ) buff = bswap_32 ( ~ CRC32 ( self -> u . crc32 . crc, ch, i ) );
+#else
+    * ( uint32_t* ) buff =  ~ CRC32 ( self -> u . crc32 . crc, ch, i );
+#endif
+    return 4;
+}
+
+/*--------------------------------------------------------------------------
+ * md5
+ */
+static
+void vdb_md5swap ( checksum *self )
+{
+    self -> u . md5 . count [ 0 ] = bswap_32 ( self -> u . md5 . count [ 0 ] );
+    self -> u . md5 . count [ 1 ] = bswap_32 ( self -> u . md5 . count [ 1 ] );
+    self -> u . md5 . abcd [ 0 ] = bswap_32 ( self -> u . md5 . abcd [ 0 ] );
+    self -> u . md5 . abcd [ 1 ] = bswap_32 ( self -> u . md5 . abcd [ 1 ] );
+    self -> u . md5 . abcd [ 2 ] = bswap_32 ( self -> u . md5 . abcd [ 2 ] );
+    self -> u . md5 . abcd [ 3 ] = bswap_32 ( self -> u . md5 . abcd [ 3 ] );
+}
+
+static
+void vdb_md5sum ( checksum *self, const void *data, size_t bytes )
+{
+    MD5StateAppend ( & self -> u . md5, data, bytes );
+}
+
+static
+size_t vdb_md5digest ( checksum *self, uint8_t *buff, size_t bsize )
+{
+    assert ( bsize >= 16 );
+    MD5StateFinish ( & self -> u . md5, buff );
+    return 16;
+}
+
+/*--------------------------------------------------------------------------
+ * sha1
+ */
+static
+void vdb_sha32swap ( checksum *self )
+{
+    unsigned int i;
+    self -> u . sha1 . len = bswap_64 ( self -> u . sha1 . len );
+    for ( i = 0; i < 8; ++ i )
+        self -> u . sha1 . H [ i ] = bswap_32 ( self -> u . sha1 . H [ i ] );
+    self -> u . sha1 . cur = bswap_32 ( self -> u . sha1 . cur );
+}
+
+static
+void vdb_sha1sum ( checksum *self, const void *data, size_t bytes )
+{
+    SHA1StateAppend ( & self -> u . sha1, data, bytes );
+}
+
+static
+size_t vdb_sha1digest ( checksum *self, uint8_t *buff, size_t bsize )
+{
+    assert ( bsize >= 20 );
+    SHA1StateFinish ( & self -> u . sha1, buff );
+    return 20;
+}
+
+/*--------------------------------------------------------------------------
+ * sha256
+ */
+static
+void vdb_sha256sum ( checksum *self, const void *data, size_t bytes )
+{
+    SHA256StateAppend ( & self -> u . sha256, data, bytes );
+}
+
+static
+size_t vdb_sha256digest ( checksum *self, uint8_t *buff, size_t bsize )
+{
+    assert ( bsize >= 32 );
+    SHA256StateFinish ( & self -> u . sha256, buff );
+    return 32;
+}
+
+/*--------------------------------------------------------------------------
+ * sha384
+ */
+static
+void vdb_sha64swap ( checksum *self )
+{
+    unsigned int i;
+    self -> u . sha384 . len = bswap_64 ( self -> u . sha384 . len );
+    for ( i = 0; i < 8; ++ i )
+        self -> u . sha384 . H [ i ] = bswap_64 ( self -> u . sha384 . H [ i ] );
+    self -> u . sha384 . cur = bswap_32 ( self -> u . sha384 . cur );
+}
+
+static
+void vdb_sha384sum ( checksum *self, const void *data, size_t bytes )
+{
+    SHA384StateAppend ( & self -> u . sha384, data, bytes );
+}
+
+static
+size_t vdb_sha384digest ( checksum *self, uint8_t *buff, size_t bsize )
+{
+    assert ( bsize >= 48 );
+    SHA384StateFinish ( & self -> u . sha384, buff );
+    return 48;
+}
+
+/*--------------------------------------------------------------------------
+ * sha512
+ */
+static
+void vdb_sha512sum ( checksum *self, const void *data, size_t bytes )
+{
+    SHA512StateAppend ( & self -> u . sha512, data, bytes );
+}
+
+static
+size_t vdb_sha512digest ( checksum *self, uint8_t *buff, size_t bsize )
+{
+    assert ( bsize >= 64 );
+    SHA512StateFinish ( & self -> u . sha512, buff );
+    return 64;
+}
+
+
+/*--------------------------------------------------------------------------
+ * general checksum function
+ */
+static
+rc_t CC checksum_driver ( void *obj, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    checksum *self = obj;
+
+    /* we ensured the input was an octet-stream within the factory */
+    uint32_t elem_bytes = argv [ 0 ] . u . data . elem_bits >> 3;
+    const uint8_t *src = argv [ 0 ] . u . data . base;
+    uint64_t count = argv [ 0 ] . u . data . elem_count;
+
+    src += argv [ 0 ] . u . data . first_elem * elem_bytes;
+    count *= elem_bytes;
+
+    ( * self -> sum ) ( self, src, count );
+
+    return 0;
+}
+
+static
+void CC checksum_whack ( void *obj )
+{
+    checksum *self = obj;
+
+    /* store metadata */
+    KMDataNode *digest;
+    rc_t rc = KMetadataOpenNodeUpdate ( self -> meta, & digest, "%s", self -> node );
+    if ( rc == 0 )
+    {
+        size_t bytes;
+        uint8_t buff [ 256 ];
+
+        /* open state node */
+        KMDataNode *state;
+        rc = KMDataNodeOpenNodeUpdate ( digest, & state, "state" );
+        if ( rc == 0 )
+        {
+            if ( self -> byte_swap )
+                ( * self -> swap ) ( self );
+
+            KMDataNodeWrite ( state, & self -> u, self -> valid );
+            KMDataNodeRelease ( state );
+
+            if ( self -> byte_swap )
+                ( * self -> swap ) ( self );
+       }
+
+        /* capture digest */
+        bytes = ( * self -> digest ) ( self, buff, sizeof buff );
+
+        /* write digest */
+        KMDataNodeWrite ( digest, buff, bytes );
+        KMDataNodeRelease ( digest );
+    }
+
+    KMetadataRelease ( self -> meta );
+    free ( self );
+}
+
+static
+rc_t checksum_prior_state ( checksum *self, size_t state_size )
+{
+    const KMDataNode *state;
+    rc_t rc = KMetadataOpenNodeRead ( self -> meta, & state, "%s/state", self -> node );
+    if ( rc == 0 )
+    {
+        size_t remaining;
+        rc = KMDataNodeRead ( state, 0, self -> u . buff, sizeof self -> u, & self -> valid, & remaining );
+        KMDataNodeRelease ( state );
+        if ( rc == 0 )
+        {
+            if ( remaining != 0 || self -> valid > state_size )
+                rc = RC ( rcXF, rcFunction, rcConstructing, rcData, rcExcessive );
+            else if ( self -> valid != 0 && self -> valid < state_size )
+                rc = RC ( rcXF, rcFunction, rcConstructing, rcData, rcInsufficient );
+        }
+    }
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {
+        rc = 0;
+    }
+
+    return rc;
+}
+
+static
+rc_t checksum_make ( const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, size_t state_size )
+{
+    rc_t rc;
+    checksum *self = malloc ( sizeof * self + cp -> argv [ 0 ] . count );
+    if ( self == NULL )
+        rc = RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = VTableOpenMetadataUpdate ( ( VTable* ) info -> tbl, & self -> meta );
+        if ( rc == 0 )
+        {
+            rc = KMetadataByteOrder ( self -> meta, & self -> byte_swap );
+            if ( rc == 0 )
+            {
+                string_copy ( self -> node, cp -> argv [ 0 ] . count + 1,
+                    cp -> argv [ 0 ] . data . ascii, cp -> argv [ 0 ] . count );
+
+                memset ( & self -> u, 0, sizeof self -> u );
+                rc = checksum_prior_state ( self, state_size );
+                if ( rc == 0 )
+                {
+                    rslt -> self = self;
+                    rslt -> whack = checksum_whack;
+                    rslt -> variant = vftNonDetRow;
+                    rslt -> u . rf = checksum_driver;
+
+                    return 0;
+                }
+            }
+
+            KMetadataRelease ( self -> meta );
+        }
+
+        free ( self );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * crc32 factory
+ */
+static
+rc_t vdb_crc32_fact ( const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    checksum *self;
+    rc_t rc = checksum_make ( info, rslt, cp, sizeof self -> u . crc32 );
+    if ( rc == 0 )
+    {
+        self = rslt -> self;
+        self -> swap = vdb_crc32swap;
+        self -> sum = vdb_crc32sum;
+        self -> digest = vdb_crc32digest;
+        if ( self -> valid == 0 ) {
+            self -> u . crc32 . crc = 0;
+            self -> u . crc32 . len = 0;
+            self -> valid = sizeof ( self -> u . crc32 );
+        }
+        else if ( self -> byte_swap )
+            vdb_crc32swap ( self );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * md5 factory
+ */
+static
+rc_t vdb_md5sum_fact ( const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    checksum *self;
+    rc_t rc = checksum_make ( info, rslt, cp, sizeof self -> u . md5 );
+    if ( rc == 0 )
+    {
+        self = rslt -> self;
+        self -> swap = vdb_md5swap;
+        self -> sum = vdb_md5sum;
+        self -> digest = vdb_md5digest;
+        if ( self -> valid == 0 ) {
+            MD5StateInit ( & self -> u . md5 );
+            self -> valid = sizeof ( self -> u . md5 );
+        }
+        else if ( self -> byte_swap )
+            vdb_md5swap ( self );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * sha factories
+ */
+static
+rc_t vdb_sha1_fact ( const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    checksum *self;
+    rc_t rc = checksum_make ( info, rslt, cp, sizeof self -> u . sha1 );
+    if ( rc == 0 )
+    {
+        self = rslt -> self;
+        self -> swap = vdb_sha32swap;
+        self -> sum = vdb_sha1sum;
+        self -> digest = vdb_sha1digest;
+        if ( self -> valid == 0 ) {
+            SHA1StateInit ( & self -> u . sha1 );
+            self -> valid = sizeof ( self -> u . sha1 );
+        }
+        else if ( self -> byte_swap )
+            vdb_sha32swap ( self );
+    }
+
+    return rc;
+}
+
+static
+rc_t vdb_sha256_fact ( const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    checksum *self;
+    rc_t rc = checksum_make ( info, rslt, cp, sizeof self -> u . sha256 );
+    if ( rc == 0 )
+    {
+        self = rslt -> self;
+        self -> swap = vdb_sha32swap;
+        self -> sum = vdb_sha256sum;
+        self -> digest = vdb_sha256digest;
+        if ( self -> valid == 0 ) {
+            SHA256StateInit ( & self -> u . sha256 );
+            self -> valid = sizeof ( self -> u . sha256 );
+        }
+        else if ( self -> byte_swap )
+            vdb_sha32swap ( self );
+    }
+
+    return rc;
+}
+
+static
+rc_t vdb_sha384_fact ( const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    checksum *self;
+    rc_t rc = checksum_make ( info, rslt, cp, sizeof self -> u . sha384 );
+    if ( rc == 0 )
+    {
+        self = rslt -> self;
+        self -> swap = vdb_sha64swap;
+        self -> sum = vdb_sha384sum;
+        self -> digest = vdb_sha384digest;
+        if ( self -> valid == 0 ) {
+            SHA384StateInit ( & self -> u . sha384 );
+            self -> valid = sizeof ( self -> u . sha384 );
+        }
+        else if ( self -> byte_swap )
+            vdb_sha64swap ( self );
+    }
+
+    return rc;
+}
+
+static
+rc_t vdb_sha512_fact ( const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    checksum *self;
+    rc_t rc = checksum_make ( info, rslt, cp, sizeof self -> u . sha512 );
+    if ( rc == 0 )
+    {
+        self = rslt -> self;
+        self -> swap = vdb_sha64swap;
+        self -> sum = vdb_sha512sum;
+        self -> digest = vdb_sha512digest;
+        if ( self -> valid == 0 ) {
+            SHA512StateInit ( & self -> u . sha512 );
+            self -> valid = sizeof ( self -> u . sha512 );
+        }
+        else if ( self -> byte_swap )
+            vdb_sha64swap ( self );
+    }
+
+    return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * checksum factory
+ */
+VTRANSFACT_IMPL ( vdb_checksum, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* version 1.0 has 2 factory params... */
+    assert ( cp -> argc == 2 );
+    /* ...and 1 function param */
+    assert ( dp -> argc == 1 );
+
+    /* both factory params are of type ascii */
+    assert ( cp -> argv [ 0 ] . desc . domain == vtdAscii );
+    assert ( cp -> argv [ 1 ] . desc . domain == vtdAscii );
+    assert ( cp -> argv [ 0 ] . desc . intrinsic_bits == 8 );
+    assert ( cp -> argv [ 1 ] . desc . intrinsic_bits == 8 );
+    assert ( cp -> argv [ 0 ] . desc . intrinsic_dim == 1 );
+    assert ( cp -> argv [ 1 ] . desc . intrinsic_dim == 1 );
+
+    /* the input must be limited to bytes */
+    assert ( dp -> argc == 1 );
+    assert ( dp -> argv [ 0 ] . desc . intrinsic_bits == 8 );
+
+    /* look up algorithm */
+    switch ( cp -> argv [ 1 ] . count )
+    {
+    case 3:
+        if ( strcase_cmp ( cp -> argv [ 1 ] . data . ascii, 3, "md5", 3, 3 ) == 0 )
+            return vdb_md5sum_fact ( info, rslt, cp );
+        break;
+    case 4:
+        if ( strcase_cmp ( cp -> argv [ 1 ] . data . ascii, 4, "sha1", 4, 4 ) == 0 )
+            return vdb_sha1_fact ( info, rslt, cp );
+        break;
+    case 5:
+        if ( strcase_cmp ( cp -> argv [ 1 ] . data . ascii, 5, "crc32", 5, 5 ) == 0 )
+            return vdb_crc32_fact ( info, rslt, cp );
+        else if ( strcase_cmp ( cp -> argv [ 1 ] . data . ascii, 5, "sha-1", 5, 5 ) == 0 )
+            return vdb_sha1_fact ( info, rslt, cp );
+        break;
+    case 6:
+        if ( strcase_cmp ( cp -> argv [ 1 ] . data . ascii, 6, "crc-32", 6, 6 ) == 0 )
+            return vdb_crc32_fact ( info, rslt, cp );
+        else if ( strcase_cmp ( cp -> argv [ 1 ] . data . ascii, 6, "sha256", 6, 6 ) == 0 )
+            return vdb_sha256_fact ( info, rslt, cp );
+        else if ( strcase_cmp ( cp -> argv [ 1 ] . data . ascii, 6, "sha384", 6, 6 ) == 0 )
+            return vdb_sha384_fact ( info, rslt, cp );
+        else if ( strcase_cmp ( cp -> argv [ 1 ] . data . ascii, 6, "sha512", 6, 6 ) == 0 )
+            return vdb_sha512_fact ( info, rslt, cp );
+        break;
+    case 7:
+        if ( strcase_cmp ( cp -> argv [ 1 ] . data . ascii, 7, "sha-256", 7, 7 ) == 0 )
+            return vdb_sha256_fact ( info, rslt, cp );
+        else if ( strcase_cmp ( cp -> argv [ 1 ] . data . ascii, 7, "sha-384", 7, 7 ) == 0 )
+            return vdb_sha384_fact ( info, rslt, cp );
+        else if ( strcase_cmp ( cp -> argv [ 1 ] . data . ascii, 7, "sha-512", 7, 7 ) == 0 )
+            return vdb_sha512_fact ( info, rslt, cp );
+        break;
+    }
+
+    /* failed to resolve algorithm */
+    return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcIncorrect );
+}
diff --git a/libs/vxf/clip.c b/libs/vxf/clip.c
new file mode 100644
index 0000000..e8047c2
--- /dev/null
+++ b/libs/vxf/clip.c
@@ -0,0 +1,200 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct {
+    union {
+        /* integer */
+        int8_t i8[2];
+        int16_t i16[2];
+        int32_t i32[2];
+        int64_t i64[2];
+    
+        /* unsigned integer */
+        uint8_t u8[2];
+        uint16_t u16[2];
+        uint32_t u32[2];
+        uint64_t u64[2];
+    
+        /* floating point */
+        float f32[2];
+        double f64[2];
+    } u;
+    uint32_t dim;
+} self_t;
+
+#define CLIP_FUNC(FUNC, TYPE, VAL) \
+static rc_t CC FUNC(void *Self, const VXformInfo *info, void *Dst, const void *Src, uint64_t n) { \
+    const self_t *self = Self; \
+    TYPE lower = self->u.VAL[0]; \
+    TYPE upper = self->u.VAL[1]; \
+    TYPE *dst = Dst; \
+    const TYPE *src = Src; \
+    size_t i; \
+\
+    for (i = 0, n *= self->dim; i != n; ++i) { \
+        TYPE val = src[i]; \
+\
+        if (val < lower) \
+            val = lower; \
+        else if (val > upper) \
+            val = upper; \
+\
+        dst[i] = val; \
+    } \
+    return 0; \
+}
+
+CLIP_FUNC(clip_U8, uint8_t, u8)
+CLIP_FUNC(clip_I8, int8_t, i8)
+CLIP_FUNC(clip_U16, uint16_t, u16)
+CLIP_FUNC(clip_I16, int16_t, i16)
+CLIP_FUNC(clip_U32, uint32_t, u32)
+CLIP_FUNC(clip_I32, int32_t, i32)
+CLIP_FUNC(clip_U64, uint64_t, u64)
+CLIP_FUNC(clip_I64, int64_t, i64)
+CLIP_FUNC(clip_F32, float, f32)
+CLIP_FUNC(clip_F64, double, f64)
+
+static
+void CC vxf_free_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* clip
+ function < type T > T clip #1.0 < T lower, T upper > ( T in ) = vdb:clip;
+ function < type T, U32 dim > T [ dim ] vclip #1.0 < T lower, T upper > ( T [ dim ] in ) = vdb:clip;
+ */
+VTRANSFACT_IMPL(vdb_clip, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+    self_t *self;
+
+    /* check types */
+    switch (info->fdesc.desc.domain) {
+        case vtdInt:
+        case vtdUint:
+        case vtdFloat:
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+    }
+    switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+        case 16:
+        case 32:
+        case 64:
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcType, rcInvalid);
+    }
+    
+    self = malloc(sizeof(*self));
+    if (self == NULL)
+        return RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    
+    rslt->self = self;
+    rslt->whack = vxf_free_wrapper;
+    rslt->variant = vftArray;
+
+    self->dim = info->fdesc.fd.td.dim;
+    
+    switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            switch (info->fdesc.desc.intrinsic_bits) {
+                case 8:
+                    rslt->u.af = clip_I8;
+                    self->u.i8[0] = *cp->argv[0].data.i8;
+                    self->u.i8[1] = *cp->argv[1].data.i8;
+                    break;
+                case 16:
+                    rslt->u.af = clip_I16;
+                    self->u.i16[0] = *cp->argv[0].data.i16;
+                    self->u.i16[1] = *cp->argv[1].data.i16;
+                    break;
+                case 32:
+                    rslt->u.af = clip_I32;
+                    self->u.i32[0] = *cp->argv[0].data.i32;
+                    self->u.i32[1] = *cp->argv[1].data.i32;
+                    break;
+                case 64:
+                    rslt->u.af = clip_I64;
+                    self->u.i64[0] = *cp->argv[0].data.i64;
+                    self->u.i64[1] = *cp->argv[1].data.i64;
+                    break;
+            }
+            break;
+        case vtdUint:
+            switch (info->fdesc.desc.intrinsic_bits) {
+                case 8:
+                    rslt->u.af = clip_U8;
+                    self->u.u8[0] = *cp->argv[0].data.u8;
+                    self->u.u8[1] = *cp->argv[1].data.u8;
+                    break;
+                case 16:
+                    rslt->u.af = clip_U16;
+                    self->u.u16[0] = *cp->argv[0].data.u16;
+                    self->u.u16[1] = *cp->argv[1].data.u16;
+                    break;
+                case 32:
+                    rslt->u.af = clip_U32;
+                    self->u.u32[0] = *cp->argv[0].data.u32;
+                    self->u.u32[1] = *cp->argv[1].data.u32;
+                    break;
+                case 64:
+                    rslt->u.af = clip_U64;
+                    self->u.u64[0] = *cp->argv[0].data.u64;
+                    self->u.u64[1] = *cp->argv[1].data.u64;
+                    break;
+            }
+            break;
+        case vtdFloat:
+            switch (info->fdesc.desc.intrinsic_bits) {
+                case 32:
+                    rslt->u.af = clip_F32;
+                    self->u.f32[0] = *cp->argv[0].data.f32;
+                    self->u.f32[1] = *cp->argv[1].data.f32;
+                    break;
+                case 64:
+                    rslt->u.af = clip_F64;
+                    self->u.f64[0] = *cp->argv[0].data.f64;
+                    self->u.f64[1] = *cp->argv[1].data.f64;
+                    break;
+            }
+            break;
+    }
+	return rc;
+}
diff --git a/libs/vxf/cut.c b/libs/vxf/cut.c
new file mode 100644
index 0000000..c27c585
--- /dev/null
+++ b/libs/vxf/cut.c
@@ -0,0 +1,227 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <assert.h>
+
+typedef struct self_t {
+    void (*f)(const struct self_t *, void *, const void *, size_t);
+    uint32_t type_size;
+    uint32_t dim;
+    uint32_t n;
+    uint32_t idx[7];
+} self_t;
+
+static
+void cut8(const struct self_t *self, void *Dst, const void *Src, size_t elem_count) {
+    uint8_t *dst = Dst;
+    const uint8_t *src = Src;
+    int i;
+    int j;
+    int doff;
+    int soff;
+    
+    for (doff = soff = i = 0; i != elem_count; ++i, doff += self->n, soff += self->dim) {
+        for (j = 0; j != self->n; ++j) {
+            dst[doff + j] = src[soff + self->idx[j]];
+        }
+    }
+}
+
+static
+void cut16(const struct self_t *self, void *Dst, const void *Src, size_t elem_count) {
+    uint16_t *dst = Dst;
+    const uint16_t *src = Src;
+    int i;
+    int j;
+    int doff;
+    int soff;
+    
+    for (doff = soff = i = 0; i != elem_count; ++i, doff += self->n, soff += self->dim) {
+        for (j = 0; j != self->n; ++j) {
+            dst[doff + j] = src[soff + self->idx[j]];
+        }
+    }
+}
+
+static
+void cut32(const struct self_t *self, void *Dst, const void *Src, size_t elem_count) {
+    uint32_t *dst = Dst;
+    const uint32_t *src = Src;
+    int i;
+    int j;
+    int doff;
+    int soff;
+    
+    for (doff = soff = i = 0; i != elem_count; ++i, doff += self->n, soff += self->dim) {
+        for (j = 0; j != self->n; ++j) {
+            dst[doff + j] = src[soff + self->idx[j]];
+        }
+    }
+}
+
+static
+void cut64(const struct self_t *self, void *Dst, const void *Src, size_t elem_count) {
+    uint64_t *dst = Dst;
+    const uint64_t *src = Src;
+    int i;
+    int j;
+    int doff;
+    int soff;
+    
+    for (doff = soff = i = 0; i != elem_count; ++i, doff += self->n, soff += self->dim) {
+        for (j = 0; j != self->n; ++j) {
+            dst[doff + j] = src[soff + self->idx[j]];
+        }
+    }
+}
+
+static
+void cut_bytes(const struct self_t *self, void *Dst, const void *Src, size_t elem_count) {
+    uint8_t *dst = Dst;
+    const uint8_t *src = Src;
+    int i;
+    int j;
+    int doff;
+    int soff;
+    const int sz = self->type_size >> 3;
+    const int di = sz * self->n;
+    const int si = sz * self->dim;
+    
+    for (doff = soff = i = 0; i != elem_count; ++i, doff += di, soff += si) {
+        for (j = 0; j != self->n; ++j) {
+            memmove(dst + doff + j * sz, src + soff + self->idx[j] * sz, sz);
+        }
+    }
+}
+
+static
+void cut_bits(const struct self_t *self, void *dst, const void *src, size_t elem_count) {
+    int i;
+    int j;
+    int doff;
+    int soff;
+    const int sz = self->type_size;
+    const int di = sz * self->n;
+    const int si = sz * self->dim;
+    
+    for (doff = soff = i = 0; i != elem_count; ++i, doff += di, soff += si) {
+        for (j = 0; j != self->n; ++j) {
+            bitcpy(dst, doff + j * sz, src, soff + self->idx[j] * sz, sz);
+        }
+    }
+}
+
+static
+rc_t CC cut_driver (
+                    void *Self,
+                    const VXformInfo *info,
+                    void *dst,
+                    const void *src,
+                    uint64_t elem_count
+                    )
+{
+    const self_t *self = Self;
+    
+    self->f( self, dst, src, elem_count );
+    return 0;
+}
+
+static
+void CC vxf_cut_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* cut
+ * function < type T >
+ * T [ * ] cut #1.0 < U32 idx, ... > ( T [ * ] in );
+ */
+VTRANSFACT_IMPL(vdb_cut, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    uint32_t dim = cp->argc;
+    int i;
+    self_t *ctx;
+    
+    assert(dim != 0);
+    for (i = 0; i != dim; ++i) {
+        if (*(cp->argv[i].data.u32) >= dp->argv[0].fd.td.dim)
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+    }
+    
+    ctx = malloc ( sizeof * ctx - sizeof ctx -> idx + dim * sizeof ctx -> idx [ 0 ] );
+    if (ctx == NULL)
+        return RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+
+    ctx->type_size = VTypedescSizeof ( & info -> fdesc . desc ) / dim;
+    ctx->dim = VTypedescSizeof ( & dp->argv[0].desc ) / ctx->type_size;
+    ctx->n = dim;
+
+    for (i = 0; i != dim; ++i)
+    {
+        ctx->idx[i] = cp->argv[i].data.u32[0];
+        if ( ctx->idx[i] >= ctx->dim )
+        {
+            free ( ctx );
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+    }
+    
+    rslt->self = ctx;
+    rslt->whack = vxf_cut_wrapper;
+    rslt->variant = vftArray;
+    rslt->u.af = cut_driver;
+    
+    switch (ctx->type_size) {
+        case 8:
+            ctx->f = cut8;
+            break;
+        case 16:
+            ctx->f = cut16;
+            break;
+        case 32:
+            ctx->f = cut32;
+            break;
+        case 64:
+            ctx->f = cut64;
+            break;
+        default:
+            ctx->f = (ctx->type_size & 7) == 0 ? cut_bytes : cut_bits;
+            break;
+    }
+    
+	return 0;
+}
diff --git a/libs/vxf/delta.c b/libs/vxf/delta.c
new file mode 100644
index 0000000..fc3136b
--- /dev/null
+++ b/libs/vxf/delta.c
@@ -0,0 +1,108 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <arch-impl.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+
+#define DELTA_NAME( T )  delta_ ## T
+#define DELTA( T )                                                       \
+static                                                                   \
+rc_t CC DELTA_NAME ( T ) ( void *data,                                   \
+    const VXformInfo *info,  void *rslt, const void *input,              \
+    uint64_t elem_count)                                                 \
+{                                                                        \
+    uint32_t i;                                                          \
+    T *dst       = (T*) rslt;                                            \
+    const T *src = (const T*) input;                                     \
+    if(elem_count >0) {							 \
+        dst [ 0 ] = src [ 0 ];						 \
+	for ( i = 1; i < elem_count; ++ i ) {                            \
+	    dst [ i ] = src [ i ] - src [ i - 1 ];                       \
+	}                                                                \
+    }									 \
+    return 0;                                                            \
+}
+
+DELTA ( int8_t )
+DELTA ( int16_t )
+DELTA ( int32_t )
+DELTA ( int64_t )
+
+static VArrayFunc delta_func [] =
+{
+    DELTA_NAME ( int8_t  ),
+    DELTA_NAME ( int16_t ),
+    DELTA_NAME ( int32_t ),
+    DELTA_NAME ( int64_t )
+};
+/* delta
+ *  return the 1 derivative of inputs
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be member of  signed integers
+ *
+ *  "a" [ DATA ] - operand
+ *
+ *
+ * SYNOPSIS:
+ *  return 1st derivative for the whole blob with 1st element unmodified
+ *
+ * USAGE:
+ *    I32 A = < I32 > delta ( B );
+ */
+VTRANSFACT_IMPL ( vdb_delta, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    int size_idx;
+    if ( info -> fdesc . desc . domain != vtdInt)
+    {
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+    }
+
+    /* TBD - eventually support vector derivatives
+       for today, check that dim of T is 1 */
+    if ( dp -> argv [ 0 ] . desc . intrinsic_dim != 1 )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+    /* the only numeric types we support are between 8 and 64 bits */
+    size_idx = uint32_lsbit ( dp -> argv [ 0 ] . desc . intrinsic_bits ) - 3;
+    if ( size_idx < 0 || size_idx > 3 || ( ( dp -> argv [ 0 ] . desc . intrinsic_bits &
+                                             ( dp -> argv [ 0 ] . desc . intrinsic_bits - 1 ) ) != 0 ) )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+
+    rslt -> u . af = delta_func [ size_idx ];
+    rslt -> variant = vftArray;
+
+    return 0;
+}
diff --git a/libs/vxf/deriv.c b/libs/vxf/deriv.c
new file mode 100644
index 0000000..31be0d5
--- /dev/null
+++ b/libs/vxf/deriv.c
@@ -0,0 +1,109 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <arch-impl.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+
+#define DERIV_NAME( T )  deriv_ ## T
+#define DERIV( T )                                                       \
+static                                                                   \
+rc_t CC DERIV_NAME ( T ) ( void *data,                                   \
+    const VXformInfo *info, int64_t row_id, const VFixedRowResult *rslt, \
+    uint32_t argc, const VRowData argv [] )                              \
+{                                                                        \
+    uint32_t i;                                                          \
+    T prior, * dst = rslt -> base;                                       \
+    const T * src = argv [ 0 ] . u . data . base;                        \
+    dst += rslt -> first_elem;						                     \
+    src += argv [ 0 ] . u . data . first_elem;				             \
+    for ( prior = 0, i = 0; i < rslt -> elem_count; ++ i )               \
+    {                                                                    \
+        dst [ i ] = src [ i ] - prior;                                   \
+        prior = src [ i ];                                               \
+    }                                                                    \
+    return 0;                                                            \
+}
+
+DERIV ( int8_t )
+DERIV ( int16_t )
+DERIV ( int32_t )
+DERIV ( int64_t )
+
+static VFixedRowFunc deriv_func [] =
+{
+    DERIV_NAME ( int8_t  ),
+    DERIV_NAME ( int16_t ),
+    DERIV_NAME ( int32_t ),
+    DERIV_NAME ( int64_t )
+};
+/* deriv
+ *  return the 1 derivative of inputs
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be member of  signed integers
+ *
+ *  "a" [ DATA ] - operand
+ *
+ *
+ * SYNOPSIS:
+ *  return 1st derivative for every row with initial element unmodified
+ *
+ * USAGE:
+ *    I32 pos_1st_d = < I32 > deriv ( position );
+ */
+VTRANSFACT_IMPL ( vdb_deriv, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    int size_idx;
+    if ( info -> fdesc . desc . domain != vtdInt)
+    {
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+    }
+
+    /* TBD - eventually support vector derivatives
+       for today, check that dim of T is 1 */
+    if ( dp -> argv [ 0 ] . desc . intrinsic_dim != 1 )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+    /* the only numeric types we support are between 8 and 64 bits */
+    size_idx = uint32_lsbit ( dp -> argv [ 0 ] . desc . intrinsic_bits ) - 3;
+    if ( size_idx < 0 || size_idx > 3 || ( ( dp -> argv [ 0 ] . desc . intrinsic_bits &
+                                             ( dp -> argv [ 0 ] . desc . intrinsic_bits - 1 ) ) != 0 ) )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+
+    rslt -> u . pf = deriv_func [ size_idx ];
+    rslt -> variant = vftFixedRow;
+
+    return 0;
+}
diff --git a/libs/vxf/diff.c b/libs/vxf/diff.c
new file mode 100644
index 0000000..62c66b4
--- /dev/null
+++ b/libs/vxf/diff.c
@@ -0,0 +1,356 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <arch-impl.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+/* optional constant */
+typedef union diff_data diff_data;
+union diff_data
+{
+    int8_t i8;
+    int16_t i16;
+    int32_t i32;
+    int64_t i64;
+
+    uint8_t u8;
+    uint16_t u16;
+    uint32_t u32;
+    uint64_t u64;
+
+    float f32;
+    double f64;
+};
+
+#define FULL_DIFF_NAME( T )                                              \
+    full_diff_ ## T
+#define FULL_DIFF( T, k )                                                \
+static                                                                   \
+rc_t CC FULL_DIFF_NAME ( T ) ( void *data,                                  \
+    const VXformInfo *info, int64_t row_id, const VFixedRowResult *rslt, \
+    uint32_t argc, const VRowData argv [] )                              \
+{                                                                        \
+    uint32_t i;                                                          \
+    const diff_data *self = ( const void* ) data;                        \
+                                                                         \
+    T *dst = rslt -> base;                                               \
+    const T *a = argv [ 0 ] . u . data . base;                           \
+    const T *b = argv [ 1 ] . u . data . base;                           \
+                                                                         \
+    for ( i = 0, dst += rslt -> first_elem,                              \
+              a += argv [ 0 ] . u . data . first_elem,                   \
+              b += argv [ 1 ] . u . data . first_elem;                   \
+          i < rslt -> elem_count; ++ i )                                 \
+    {                                                                    \
+        dst [ i ] = a [ i ] - b [ i ] - self -> k;                       \
+    }                                                                    \
+                                                                         \
+    return 0;                                                            \
+}
+
+FULL_DIFF ( int8_t, i8 )
+FULL_DIFF ( int16_t, i16 )
+FULL_DIFF ( int32_t, i32 )
+FULL_DIFF ( int64_t, i64 )
+FULL_DIFF ( uint8_t, u8 )
+FULL_DIFF ( uint16_t, u16 )
+FULL_DIFF ( uint32_t, u32 )
+FULL_DIFF ( uint64_t, u64 )
+FULL_DIFF ( float, f32 )
+FULL_DIFF ( double, f64 )
+
+static VFixedRowFunc full_diff_func [] =
+{
+    FULL_DIFF_NAME ( uint8_t ),
+    FULL_DIFF_NAME ( uint16_t ),
+    FULL_DIFF_NAME ( uint32_t ),
+    FULL_DIFF_NAME ( uint64_t ),
+    FULL_DIFF_NAME ( int8_t ),
+    FULL_DIFF_NAME ( int16_t ),
+    FULL_DIFF_NAME ( int32_t ),
+    FULL_DIFF_NAME ( int64_t ),
+    NULL,
+    NULL,
+    FULL_DIFF_NAME ( float ),
+    FULL_DIFF_NAME ( double )
+};
+
+#define CONST_DIFF_NAME( T )                                             \
+    const_diff_ ## T
+#define CONST_DIFF( T, k )                                               \
+static                                                                   \
+rc_t CC CONST_DIFF_NAME ( T ) ( void *data, const VXformInfo *info,         \
+    void *rslt, const void *src, uint64_t elem_count )                   \
+{                                                                        \
+    uint32_t i;                                                          \
+    const diff_data *self = ( const void* ) data;                        \
+                                                                         \
+    T *dst = rslt;                                                       \
+    const T *a = src;                                                    \
+                                                                         \
+    for ( i = 0; i < elem_count; ++ i )                                 \
+    {                                                                    \
+        dst [ i ] = a [ i ] - self -> k;                                 \
+    }                                                                    \
+                                                                         \
+    return 0;                                                            \
+}
+
+CONST_DIFF ( int8_t, i8 )
+CONST_DIFF ( int16_t, i16 )
+CONST_DIFF ( int32_t, i32 )
+CONST_DIFF ( int64_t, i64 )
+CONST_DIFF ( uint8_t, u8 )
+CONST_DIFF ( uint16_t, u16 )
+CONST_DIFF ( uint32_t, u32 )
+CONST_DIFF ( uint64_t, u64 )
+CONST_DIFF ( float, f32 )
+CONST_DIFF ( double, f64 )
+
+static VArrayFunc const_diff_func [] =
+{
+    CONST_DIFF_NAME ( uint8_t ),
+    CONST_DIFF_NAME ( uint16_t ),
+    CONST_DIFF_NAME ( uint32_t ),
+    CONST_DIFF_NAME ( uint64_t ),
+    CONST_DIFF_NAME ( int8_t ),
+    CONST_DIFF_NAME ( int16_t ),
+    CONST_DIFF_NAME ( int32_t ),
+    CONST_DIFF_NAME ( int64_t ),
+    NULL,
+    NULL,
+    CONST_DIFF_NAME ( float ),
+    CONST_DIFF_NAME ( double )
+};
+
+#define NO_CONST_NAME( T )                                               \
+    no_const_ ## T
+#define NO_CONST( T )                                                    \
+static                                                                   \
+rc_t CC NO_CONST_NAME ( T ) ( void *data,                                   \
+    const VXformInfo *info, int64_t row_id, const VFixedRowResult *rslt, \
+    uint32_t argc, const VRowData argv [] )                              \
+{                                                                        \
+    uint32_t i;                                                          \
+                                                                         \
+    T *dst = rslt -> base;                                               \
+    const T *a = argv [ 0 ] . u . data . base;                           \
+    const T *b = argv [ 1 ] . u . data . base;                           \
+                                                                         \
+    for ( i = 0, dst += rslt -> first_elem,                              \
+              a += argv [ 0 ] . u . data . first_elem,                   \
+              b += argv [ 1 ] . u . data . first_elem;                   \
+          i < rslt -> elem_count; ++ i )                                 \
+    {                                                                    \
+        dst [ i ] = a [ i ] - b [ i ];                                   \
+    }                                                                    \
+                                                                         \
+    return 0;                                                            \
+}
+
+NO_CONST ( int8_t )
+NO_CONST ( int16_t )
+NO_CONST ( int32_t )
+NO_CONST ( int64_t )
+NO_CONST ( uint8_t )
+NO_CONST ( uint16_t )
+NO_CONST ( uint32_t )
+NO_CONST ( uint64_t )
+NO_CONST ( float )
+NO_CONST ( double )
+
+static VFixedRowFunc no_const_func [] =
+{
+    NO_CONST_NAME ( uint8_t ),
+    NO_CONST_NAME ( uint16_t ),
+    NO_CONST_NAME ( uint32_t ),
+    NO_CONST_NAME ( uint64_t ),
+    NO_CONST_NAME ( int8_t ),
+    NO_CONST_NAME ( int16_t ),
+    NO_CONST_NAME ( int32_t ),
+    NO_CONST_NAME ( int64_t ),
+    NULL,
+    NULL,
+    NO_CONST_NAME ( float ),
+    NO_CONST_NAME ( double )
+};
+
+static
+rc_t CC no_diff ( void *data, const VXformInfo *info,
+    void *dst, const void *src, uint64_t elem_count )
+{
+    memmove ( dst, src, (size_t)elem_count * VTypedescSizeof ( & info -> fdesc . desc ) >> 3 );
+    return 0;
+}
+
+static
+void CC vxf_diff_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* diff
+ *  return the difference of inputs
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be member of numeric_set
+ *
+ *  "k" [ CONST, DEFAULT 0 ] - optional constant
+ *  to be added or subtracted
+ *
+ *  "a" [ DATA ] - left-most operand
+ *
+ *  "b" [ DATA ] - optional subtractand
+ *
+ * SYNOPSIS:
+ *  incorporates "k" into expression for every row
+ *  returns sum or difference of inputs for all rows
+ *
+ * USAGE:
+ *  length of half-closed interval
+ *    U32 len = < U32 > diff ( stop, start );
+ *  length of fully-closed interval
+ *    U32 len = < U32 > diff < -1 > ( stop, start );
+ */
+VTRANSFACT_IMPL ( vdb_diff, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    bool has_const;
+    int32_t size_idx;
+    diff_data k;
+
+    /* "T" must be member of numeric_set */
+    switch ( info -> fdesc . desc . domain )
+    {
+    case vtdUint:
+    case vtdInt:
+    case vtdFloat:
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+    }
+
+    /* TBD - eventually support vector differences
+       for today, check that dim of T is 1 */
+    if ( dp -> argv [ 0 ] . desc . intrinsic_dim != 1 )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+    /* the only numeric types we support are between 8 and 64 bits */
+    size_idx = uint32_lsbit ( dp -> argv [ 0 ] . desc . intrinsic_bits ) - 3;
+    if ( size_idx < 0 || size_idx > 3 || ( ( dp -> argv [ 0 ] . desc . intrinsic_bits &
+                                             ( dp -> argv [ 0 ] . desc . intrinsic_bits - 1 ) ) != 0 ) )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+
+    /* there are 4 variants:
+       1. no constant ( or is 0 ) and single input
+       2. non-zero constant and single input
+       3. no constant ( or is 0 ) and dual input
+       4. non-zero constant and dual input */
+    has_const = false;
+    if ( cp -> argc == 1 ) switch ( cp -> argv [ 0 ] . desc . domain )
+    {
+    case vtdUint:
+    case vtdInt:
+        switch ( cp -> argv [ 0 ] . desc . intrinsic_bits )
+        {
+        case 8:
+            if ( ( k . u8 = cp -> argv [ 0 ] . data . u8 [ 0 ] ) != 0 )
+                has_const = true;
+            break;
+        case 16:
+            if ( ( k . u16 = cp -> argv [ 0 ] . data . u16 [ 0 ] ) != 0 )
+                has_const = true;
+            break;
+        case 32:
+            if ( ( k . u32 = cp -> argv [ 0 ] . data . u32 [ 0 ] ) != 0 )
+                has_const = true;
+            break;
+        case 64:
+            if ( ( k . u64 = cp -> argv [ 0 ] . data . u64 [ 0 ] ) != 0 )
+                has_const = true;
+            break;
+        }
+        break;
+
+    case vtdFloat:
+        switch ( cp -> argv [ 0 ] . desc . intrinsic_bits )
+        {
+        case 32:
+            if ( ( k . f32 = cp -> argv [ 0 ] . data . f32 [ 0 ] ) != 0.0 )
+                has_const = true;
+            break;
+        case 64:
+            if ( ( k . f64 = cp -> argv [ 0 ] . data . f64 [ 0 ] ) != 0.0 )
+                has_const = true;
+            break;
+        }
+        break;
+    }
+
+    if ( has_const )
+    {
+        diff_data *pb = malloc ( sizeof * pb );
+        if ( pb == NULL )
+            return RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+        * pb = k;
+
+        rslt -> self = pb;
+        rslt -> whack = vxf_diff_wrapper;
+
+        if ( dp -> argc > 1 )
+        {
+            rslt -> u . pf = full_diff_func [ ( dp -> argv [ 0 ] . desc . domain - vtdUint ) * 4 + size_idx ];
+            rslt -> variant = vftFixedRow;
+        }
+        else
+        {
+            rslt -> u . af = const_diff_func [ ( dp -> argv [ 0 ] . desc . domain - vtdUint ) * 4 + size_idx ];
+            rslt -> variant = vftArray;
+        }
+    }
+    else
+    {
+        if ( dp -> argc > 1 )
+        {
+            rslt -> u . pf = no_const_func [ ( dp -> argv [ 0 ] . desc . domain - vtdUint ) * 4 + size_idx ];
+            rslt -> variant = vftFixedRow;
+        }
+        else
+        {
+            rslt -> u . af = no_diff;
+            rslt -> variant = vftArray;
+        }
+    }
+
+    return 0;
+}
diff --git a/libs/vxf/echo.c b/libs/vxf/echo.c
new file mode 100644
index 0000000..c8a8938
--- /dev/null
+++ b/libs/vxf/echo.c
@@ -0,0 +1,187 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <bitstr.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+
+struct self_t {
+    KDataBuffer val;
+    bitsz_t csize;
+    bitsz_t dsize;
+    int count;
+};
+
+static void CC self_free( void *Self ) {
+    struct self_t *self = Self;
+    
+    KDataBufferWhack(&self->val);
+    free(self);
+}
+
+static void fill(struct self_t *self, int start) {
+    int i;
+    
+    for (i = start; i != self->count; ++i)
+        bitcpy(self->val.base, i * self->csize, self->val.base, 0, self->csize);
+}
+
+static rc_t grow_and_fill(struct self_t *self, uint32_t rlen) {
+    bitsz_t rsize = rlen * self->dsize;
+    rc_t rc;
+    
+    if (self->count * self->csize <= rsize) {
+        int old_count = self->count;
+        int new_count = old_count;
+        
+        while (new_count * self->csize <= rsize)
+            new_count <<= 1;
+        
+        rc = KDataBufferResize(&self->val, new_count);
+        if (rc)
+            return rc;
+        
+        self->count = new_count;
+        fill(self, old_count);
+    }
+    return 0;
+}
+
+/* echo
+ function < type T > T echo #1.0 < T val > ( any row_len );
+ */
+static
+rc_t CC echo_func_1(
+                 void *Self,
+                 const VXformInfo *info,
+                 int64_t row_id,
+                 VRowResult *rslt,
+                 uint32_t argc,
+                 const VRowData argv[]
+) {
+    struct self_t *self = Self;
+    rc_t rc;
+
+    assert(argv[0].u.data.elem_count >> 32 == 0);
+    rc = grow_and_fill(self, (uint32_t)argv[0].u.data.elem_count);
+    if (rc == 0) {
+        KDataBufferWhack(rslt->data);
+        rslt->elem_count = argv[0].u.data.elem_count;
+        rc = KDataBufferSub(&self->val, rslt->data, 0, rslt->elem_count);
+    }
+    return rc;
+}
+
+/* echo
+ function < type T > T echo #1.0 < T val > ();
+ */
+static
+rc_t CC echo_func_0(
+                 void *Self,
+                 const VXformInfo *info,
+                 int64_t row_id,
+                 VRowResult *rslt,
+                 uint32_t argc,
+                 const VRowData argv[]
+) {
+    struct self_t *self = Self;
+
+    KDataBufferWhack(rslt->data);
+    rslt->elem_count = (uint32_t)( self->csize / self->dsize );
+    return KDataBufferSub(&self->val, rslt->data, 0, rslt->elem_count);
+}
+
+rc_t echo_row_0 ( const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    rc_t rc;
+    struct self_t *self = malloc ( sizeof *self );
+    if ( self == NULL )
+        return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+
+    self->dsize = VTypedescSizeof ( & cp->argv[0].desc );
+    self->csize = self->dsize * cp->argv[0].count;
+    self->count = 1;
+
+    rc = KDataBufferMake(&self->val, self->dsize, cp->argv[0].count);
+    if (rc == 0) {
+        bitcpy(self->val.base, 0, cp->argv[0].data.u8, 0, self->csize);
+    
+        rslt->self = self;
+        rslt->whack = self_free;
+        rslt->variant = vftRow;
+        rslt->u.rf = echo_func_0;
+        return 0;
+    }
+    free(self);
+    return rc;
+}
+
+static
+rc_t echo_row_1 ( const VXfactInfo *info, VFuncDesc *rslt,
+    const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    struct self_t *self = malloc ( sizeof *self );
+    if ( self == NULL )
+        return RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+
+    self->dsize = VTypedescSizeof ( & cp->argv[0].desc );
+    self->csize = self->dsize * cp->argv[0].count;
+    self->count = 256;
+
+    rc = KDataBufferMake(&self->val, self->dsize, cp->argv[0].count*self->count);
+    if (rc == 0)
+    {
+        bitcpy(self->val.base, 0, cp->argv[0].data.u8, 0, self->csize);
+        fill(self, 1);
+
+        rslt->self = self;
+        rslt->whack = self_free;
+        rslt->variant = vftRow;
+        rslt->u.rf = echo_func_1;
+        return 0;
+    }
+    free(self);
+    return rc;
+}
+
+VTRANSFACT_IMPL ( vdb_echo, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    if ( dp -> argc == 0 )
+        return echo_row_0 ( info, rslt, cp );
+    return echo_row_1 ( info, rslt, cp, dp );
+}
diff --git a/libs/vxf/entrez.c b/libs/vxf/entrez.c
new file mode 100644
index 0000000..57811c2
--- /dev/null
+++ b/libs/vxf/entrez.c
@@ -0,0 +1,170 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <klib/log.h>
+#include <arch-impl.h>
+#include <kns/url-fetcher.h>
+#include <kns/entrez-fetcher.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+typedef struct entrez_context {
+    KUrlFetcher *url_fetcher;
+    KEntrezFetcher *entrez_fetcher;
+} entrez_context_t;
+
+
+static rc_t init_entrez_context( entrez_context_t * ctx )
+{
+    /* first make the url-fetcher, because 
+       it is neccessary to create the sra-fetcher... */
+    rc_t rc = KUrlFetcherCurlMake( &(ctx->url_fetcher), false );
+    if ( rc == 0 )
+    {
+        /* then make the sra-fetcher, with the url-fetcher as parameter... */
+        rc = KEntrezFetcherMake( &(ctx->entrez_fetcher), ctx->url_fetcher );
+    }
+    return rc;
+}
+
+
+static void CC entrez_context_whack( void *ptr )
+{
+    entrez_context_t * ctx = ( entrez_context_t * )ptr;
+    if ( ctx )
+    {
+        KEntrezFetcherRelease( ctx->entrez_fetcher );
+        KUrlFetcherRelease( ctx->url_fetcher );
+        free( ctx );
+    }
+}
+
+static rc_t vrowdata_get64( const VRowData * src, uint64_t * dst )
+{
+    if ( src->u.data.elem_bits == 64 )
+    {
+        uint64_t * src_ptr = (uint64_t *)src->u.data.base;
+        src_ptr += src->u.data.first_elem;
+        *dst = *src_ptr;
+        return 0;
+    }
+    return RC ( rcXF, rcFunction, rcReading, rcType, rcIncorrect );
+}
+
+static uint32_t vrowdata_get32( const VRowData * src, uint32_t * dst )
+{
+    if ( src->u.data.elem_bits == 32 )
+    {
+        uint32_t * src_ptr = (uint32_t *)src->u.data.base;
+        src_ptr += src->u.data.first_elem;
+        *dst = *src_ptr;
+        return 0;
+    }
+    return RC ( rcXF, rcFunction, rcReading, rcType, rcIncorrect );
+}
+
+const char * entrez_server = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi";
+
+static rc_t CC perform_entrez_fetch ( void *self,
+    const VXformInfo *info, int64_t row_id, VRowResult *rslt,
+    uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc = 0;
+    entrez_context_t * ctx = ( entrez_context_t * )self;
+    if ( ctx == NULL )
+        rc = RC ( rcXF, rcFunction, rcReading, rcSelf, rcNull );
+    else
+    {
+        char * entrez_seq_id = "NC_000001";
+        uint32_t entrez_seq_len = 1024;
+        uint64_t entrez_row_id = 1;
+        uint32_t entrez_row_count = 1;
+        size_t buffsize;
+
+        if ( argc > 0 )
+            rc = vrowdata_get64( &( argv[0] ), &entrez_row_id );
+        if ( rc == 0 )
+        {
+            if ( argc > 1 )
+                rc = vrowdata_get32( &( argv[1] ), &entrez_seq_len );
+            if ( rc == 0 )
+            {
+                /* prepare the Fetcher with all the information it needs,
+                   returns in buffsize the size of the buffer we have to provide */
+                rc = KEntrezFetcherSetup ( ctx->entrez_fetcher,
+                            entrez_server, entrez_seq_id, entrez_seq_len,
+                            entrez_row_id, entrez_row_count, &buffsize );
+                if ( rc == 0 )
+                {
+                    rc = KDataBufferResize( rslt->data, buffsize );
+                    if ( rc == 0 )
+                    {
+                        size_t num_read;
+                        /* perform the fetch-operation directly into the KDatabuffer */
+                        rc = KEntrezFetcherRead ( ctx->entrez_fetcher,
+                                          rslt->data->base,
+                                          buffsize, &num_read );
+                        if ( rc == 0 )
+                        {
+                            rslt->elem_count = num_read;
+                            rslt->elem_bits = 8;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+VTRANSFACT_IMPL ( vdb_entrez, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    entrez_context_t *ctx = malloc ( sizeof( *ctx ) );
+    if ( ctx == NULL )
+        rc = RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+        rc = init_entrez_context( ctx );
+        if ( rc == 0 )
+        {
+            rslt -> self = ctx;
+            rslt -> whack = entrez_context_whack;
+            rslt -> u . rf = perform_entrez_fetch;
+            rslt -> variant = vftRow;
+        }
+    }
+    return rc;
+}
diff --git a/libs/vxf/exists.c b/libs/vxf/exists.c
new file mode 100644
index 0000000..b0b6b6c
--- /dev/null
+++ b/libs/vxf/exists.c
@@ -0,0 +1,212 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+#include <bitstr.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+
+struct self_t {
+    KDataBuffer val;
+    bitsz_t csize;
+    bitsz_t dsize;
+    int count;
+};
+
+static void CC self_free( void *Self ) {
+    struct self_t *self = Self;
+    
+    KDataBufferWhack(&self->val);
+    free(self);
+}
+
+static void fill(struct self_t *self, int start) {
+    int i;
+    
+    for (i = start; i != self->count; ++i)
+        bitcpy(self->val.base, 0, self->val.base, i * self->csize, self->csize);
+}
+
+static rc_t grow_and_fill(struct self_t *self, int rlen) {
+    bitsz_t rsize = rlen * self->dsize;
+    rc_t rc;
+    
+    if (self->count * self->csize <= rsize) {
+        int old_count = self->count;
+        int new_count = old_count;
+        
+        while (new_count * self->csize <= rsize)
+            new_count <<= 1;
+        
+        rc = KDataBufferResize(&self->val, new_count);
+        if (rc)
+            return rc;
+        
+        self->count = new_count;
+        fill(self, old_count);
+    }
+    return 0;
+}
+
+/* exists
+ function < type T > T exits #1.0 < T val > ( any predicate, any row_len );
+ */
+static
+rc_t CC exists_func_1(
+                 void *Self,
+                 const VXformInfo *info,
+                 int64_t row_id,
+                 VRowResult *rslt,
+                 uint32_t argc,
+                 const VRowData argv[]
+) {
+    struct self_t *self = Self;
+    rc_t rc = grow_and_fill(self, argv[1].u.data.elem_count);
+    
+    if (rc == 0) {
+        KDataBufferWhack(rslt->data);
+        rslt->elem_count = argv[1].u.data.elem_count;
+        rc = KDataBufferSub(&self->val, rslt->data, 0, rslt->elem_count);
+    }
+    return rc;
+}
+
+/* exists
+ function < type T > T exists #1.0 < T val > ( any predicate );
+ */
+static
+rc_t CC exists_func_0(
+                 void *Self,
+                 const VXformInfo *info,
+                 int64_t row_id,
+                 VRowResult *rslt,
+                 uint32_t argc,
+                 const VRowData argv[]
+) {
+    struct self_t *self = Self;
+
+    KDataBufferWhack(rslt->data);
+    rslt->elem_count = (uint32_t)( self->csize / self->dsize );
+    return KDataBufferSub(&self->val, rslt->data, 0, rslt->elem_count);
+}
+
+rc_t exists_row_0 ( const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    rc_t rc;
+    struct self_t *self = malloc ( sizeof *self );
+    if ( self == NULL )
+        return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+
+    self->dsize = VTypedescSizeof ( & cp->argv[0].desc );
+    self->csize = self->dsize * cp->argv[0].count;
+    self->count = 1;
+
+    rc = KDataBufferMake(&self->val, self->dsize, cp->argv[0].count);
+    if (rc == 0) {
+        bitcpy(self->val.base, 0, cp->argv[0].data.u8, 0, self->csize);
+    
+        rslt->self = self;
+        rslt->whack = self_free;
+        rslt->variant = vftRow;
+        rslt->u.rf = exists_func_0;
+        return 0;
+    }
+    free(self);
+    return rc;
+}
+
+static
+rc_t exists_row_1 ( const VXfactInfo *info, VFuncDesc *rslt,
+    const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    struct self_t *self = malloc ( sizeof *self );
+    if ( self == NULL )
+        return RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+
+    self->dsize = VTypedescSizeof ( & cp->argv[0].desc );
+    self->csize = self->dsize * cp->argv[0].count;
+    self->count = 256;
+
+    rc = KDataBufferMake(&self->val, self->dsize, cp->argv[0].count*self->count);
+    if (rc == 0)
+    {
+        bitcpy(self->val.base, 0, cp->argv[0].data.u8, 0, self->csize);
+        fill(self, 1);
+
+        rslt->self = self;
+        rslt->whack = self_free;
+        rslt->variant = vftRow;
+        rslt->u.rf = exists_func_1;
+        return 0;
+    }
+    free(self);
+    return rc;
+}
+
+/* exists
+ *  returns constant or dynamic value if predicate input exists
+ *
+ *  "T" [ TYPE ] - type of data to return
+ *
+ *  "cval" [ CONST, OPTIONAL ] - a data constant. when present,
+ *  the function will behave like "echo" ( see below )
+ *
+ *  "predicate" [ DATA ] - an input whose existence determines
+ *  whether the function will operate or not.
+ *
+ *  "dval" [ DATA, OPTIONAL ] - data value, either passed through
+ *  or used to determine a repeat count of "cval" ( see below )
+ *
+ * USAGE:
+ *  when "cval" is omitted, "dval" must be present and will be
+ *  passed through depending upon the existence of "predicate"
+ *    U8 count = < U8 > exists ( col, count2 );
+ *
+ *  when "cval" is present, "dval" may be omitted, and "cval" will
+ *  be passed through just like echo depending upon "predicate"
+ *   U8 count = < U8 > exists < 2 > ( col2 ) | < U8 > echo < 1 > ();
+ *
+ *  when "cval" and "dval" are both present, the behavior is
+ *  like echo, but gated with "predicate"
+ *    ascii poly = < ascii > exists < 'a' > ( col, repeat );
+ *
+function < type T > T exists #1.0 < * T cval > ( any predicate, * T dval ) = vdb:exists;
+*/
+VTRANSFACT_IMPL ( vdb_exists, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    if ( dp -> argc == 1 )
+        return exists_row_0 ( info, rslt, cp );
+    return exists_row_1 ( info, rslt, cp, dp );
+}
diff --git a/libs/vxf/extract_token.c b/libs/vxf/extract_token.c
new file mode 100644
index 0000000..a499bf0
--- /dev/null
+++ b/libs/vxf/extract_token.c
@@ -0,0 +1,105 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <string.h>
+#include <assert.h>
+
+
+typedef uint16_t text_token;
+enum { tt_id, tt_start, tt_len };
+
+
+/* extract_token
+ *  extract a textual token from an input string
+ *
+ *  "idx" [ CONST ] - a zero-based index of the token
+ *  if value < row_len ( tok ), then the substring of
+ *  indexed token is returned. otherwise, returns empty.
+ *
+ *  "str" [ DATA ] - input text. type must be compatible with
+ *  output production, meaning types must be same, or ascii input
+ *  with utf8 output.
+ *
+ *  "tok" [ DATA ] - results of tokenizing "str"
+ */
+static
+rc_t CC extract_token ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    KDataBuffer *dst = rslt -> data;
+    uint32_t idx = ( uint32_t ) ( size_t ) data;
+
+    rslt -> elem_count = 0;
+    if ( ( uint64_t ) idx >= argv [ 1 ] . u . data . elem_count )
+    {
+        /* issue empty string */
+        rc = KDataBufferResize ( dst, 0 );
+    }
+    else
+    {
+        size_t sub_bytes, elem_bytes = ( size_t ) ( argv [ 0 ] . u . data . elem_bits >> 3 );
+        const char *str = argv [ 0 ] . u . data . base;
+        const text_token *tok = argv [ 1 ] . u . data . base;
+
+        str += argv [ 0 ] . u . data . first_elem * elem_bytes;
+        tok += ( argv [ 1 ] . u . data . first_elem + idx ) * 3;
+        sub_bytes = elem_bytes * tok [ tt_len ];
+
+        /* set output buffer size */
+        KDataBufferCast ( dst, dst, rslt -> elem_bits, true );
+        rc = KDataBufferResize ( dst, tok [ tt_len ] );
+        if ( rc == 0 )
+        {
+            /* copy substring */
+            rslt -> elem_count = tok [ tt_len ];
+            memmove ( dst -> base, & str [ elem_bytes * tok [ tt_start ] ], sub_bytes );
+        }
+    }
+
+    return rc;
+}
+
+VTRANSFACT_IMPL ( vdb_extract_token, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* ensure that the type of input is either identical to
+       or compatible with the output */
+    if ( ! VTypedeclToTypedecl ( & dp -> argv [ 0 ] . fd . td, info -> schema, & info -> fdesc . fd . td, NULL, NULL ) )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcInconsistent );
+
+    rslt -> self = ( void* ) ( size_t ) cp -> argv [ 0 ] . data . u32 [ 0 ];
+    rslt -> variant = vftRow;
+    rslt -> u . rf = extract_token;
+    return 0;
+}
diff --git a/libs/vxf/floor.c b/libs/vxf/floor.c
new file mode 100644
index 0000000..2fe5aff
--- /dev/null
+++ b/libs/vxf/floor.c
@@ -0,0 +1,49 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <math.h>
+#include <assert.h>
+
+#define FLOAT_FUNC floorf
+#define DOUBLE_FUNC floor
+#include "math-funcs-impl.h"
+
+/*
+ function < type T >
+ T vdb:floor #1.0 ( T in );
+ */
+VTRANSFACT_IMPL(vdb_floor, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp ) {
+    return factory(self, info, rslt, cp, dp);
+}
diff --git a/libs/vxf/fsplit-join.impl.h b/libs/vxf/fsplit-join.impl.h
new file mode 100644
index 0000000..1688723
--- /dev/null
+++ b/libs/vxf/fsplit-join.impl.h
@@ -0,0 +1,136 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <stdint.h>
+#include <float.h>
+#include <math.h>
+
+#if ENCODING
+static unsigned split_and_pack_f32(const float src[], uint32_t n, unsigned m, uint8_t *pexp) {
+    const uint32_t mask = ~(0x007FFFFF >> (m - 1));
+    uint32_t i; /* src & exponent index */
+    uint32_t j; /* mantissa byte offset */
+    uint32_t breg = 0;
+    int inreg = 0;
+    uint8_t *pman = pexp + n;
+    
+    for (i = 0, j = 0; i != n; ++i) {
+        float f = src[i];
+        uint32_t man;
+        int exp;
+        int sgn = 0;
+        
+        if (f == 0.0) {
+            exp = 0;
+            man = 0;
+        }
+        else {
+            if (f < 0.0) {
+                sgn = 1;
+                f = -f;
+            }
+            man = (uint32_t)ldexpf(frexpf(f, &exp), 24);
+            man &= mask;
+#if ROUND_TO_NEAREST
+            {
+                float fl = ldexpf(man, exp - 24);
+                float fh = ldexpf(man + (mask & ~(mask << 1)), exp - 24);
+                
+                if (fh - f < f - fl) {
+                    man = (uint32_t)ldexpf(frexpf(fh, &exp), 24);
+                    man &= mask;
+                }
+            }
+#endif
+            exp += 127;
+            man &= 0x7FFFFF;
+            if (sgn)
+                man |= 0x800000;
+            man >>= (24 - m);
+        }
+        pexp[i] = exp;
+        if (inreg + m < 32) {
+            breg = (breg << m) | man;
+            inreg += m;
+        }
+        else {
+            const int n = 32 - inreg;
+            inreg = m - n;
+            breg = (breg << n) | (man >> inreg);
+            
+            pman[j + 0] = breg >> 24;
+            pman[j + 1] = breg >> 16;
+            pman[j + 2] = breg >>  8;
+            pman[j + 3] = breg >>  0;
+            j += 4;
+            
+            breg = man;
+        }
+    }
+    breg <<= 32 - inreg;
+    while (inreg > 0) {
+        pman[j] = breg >> 24;
+        breg <<= 8;
+        ++j;
+        inreg -= 8;
+    }
+    return j;
+}
+#endif /* ENCODING */
+
+#if DECODING
+static void unpack_and_join_f32(const uint8_t src[], uint32_t n, unsigned m, float dst[]) {
+    uint32_t i;
+    uint32_t j;
+    uint32_t breg;
+    uint32_t inreg;
+    
+    for (i = 0, j = n, breg = 0, inreg = 0; i != n; ) {
+        if (inreg >= m) {
+            const uint32_t man = (((breg >> (inreg - m)) << (24 - m)) & 0x00FFFFFF);
+            const int exp = src[i];
+            
+            if (exp != 0 || man != 0) {
+                const float f = ldexpf(man | 0x800000, (exp - 127) - 24);
+                
+                if ((man & 0x800000) != 0)
+                    dst[i] = -f;
+                else
+                    dst[i] = f;
+            }
+            else
+                dst[i] = 0.0;
+            inreg -= m;
+            ++i;
+        }
+        else {
+            breg = (breg << 8) | src[j];
+            inreg += 8;
+            ++j;
+        }
+    }
+}
+#endif /* DECODING */
diff --git a/libs/vxf/funzip.c b/libs/vxf/funzip.c
new file mode 100644
index 0000000..3559eab
--- /dev/null
+++ b/libs/vxf/funzip.c
@@ -0,0 +1,172 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <zlib.h>
+#include <assert.h>
+
+#define DECODING 1
+#include "fsplit-join.impl.h"
+
+static rc_t invoke_zlib(void *dst, uint32_t dsize, uint32_t *psize, const void *src, uint32_t ssize) {
+    z_stream s;
+    int zr;
+    rc_t rc;
+    
+    memset(&s, 0, sizeof(s));
+    s.next_in = (void *)src;
+    s.avail_in = ssize;
+    s.next_out = dst;
+    s.avail_out = dsize;
+    
+    *psize = 0;
+    zr = inflateInit2(&s, -15);
+    switch (zr) {
+    case 0:
+        break;
+    case Z_MEM_ERROR:
+        return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    default:
+        return RC(rcXF, rcFunction, rcExecuting, rcNoObj, rcUnexpected);
+    }
+    zr = inflate(&s, Z_FINISH);
+    switch (zr) {
+    case Z_STREAM_END:
+        assert(s.total_out <= UINT32_MAX);
+        *psize = (uint32_t)s.total_out;
+        rc = 0;
+        break;
+    case Z_OK:
+        rc = RC(rcXF, rcFunction, rcExecuting, rcMemory, rcInsufficient);
+        break;
+    case Z_BUF_ERROR:
+    case Z_NEED_DICT:
+    case Z_DATA_ERROR:
+        rc = RC(rcXF, rcFunction, rcExecuting, rcData, rcCorrupt);
+        break;
+    case Z_MEM_ERROR:
+        rc = RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        break;
+    default:
+        rc = RC(rcXF, rcFunction, rcExecuting, rcNoObj, rcUnexpected);
+        break;
+    }
+    zr = inflateEnd(&s);
+    switch (zr) {
+    case Z_OK:
+        return rc;
+    default:
+        if (rc == 0)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcCorrupt);
+        return rc;
+    }
+}
+
+static
+rc_t f32unzip_func_v0(
+                   const VXformInfo *info,
+                   VBlobResult *Dst,
+                   const VBlobData *src,
+                   const VBlobHeader *hdr
+) {
+    rc_t rc;
+    uint8_t mantissa;
+    int64_t val;
+    float *dst = Dst->data;
+    uint32_t elem_count;
+    const bitsz_t dbits = Dst->elem_count * Dst->elem_bits;
+    KDataBuffer scratch;
+    
+    rc = KDataBufferMakeBytes(&scratch, (dbits + 7) >> 3);
+    if (rc == 0) {
+        assert(scratch.elem_count >> 32 == 0);
+        rc = invoke_zlib(scratch.base, (uint32_t)scratch.elem_count, &elem_count,
+                         src->data, ((size_t)src->elem_count * src->elem_bits + 7) >> 3);
+        if (rc == 0) {
+            scratch.elem_count = elem_count;
+            
+            VBlobHeaderArgPopHead(hdr, &val);
+            mantissa = (uint8_t)val;
+            
+            elem_count = (uint32_t)((8 * (size_t)scratch.elem_count) / (8 + mantissa));
+            if ((size_t)elem_count * 32 > dbits)
+                rc = RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+            else {
+                Dst->elem_bits = 32;
+                Dst->elem_count = elem_count;
+                Dst->byte_order = vboNative;
+                
+                unpack_and_join_f32(scratch.base, elem_count, mantissa, dst);
+            }
+        }
+    }
+    KDataBufferWhack(&scratch);
+    return rc;
+}
+
+static
+rc_t CC f32unzip_func(
+                void *Self,
+                const VXformInfo *info,
+                VBlobResult *dst,
+                const VBlobData *src,
+                VBlobHeader *hdr
+) {
+    uint8_t bits;
+    
+    switch (VBlobHeaderVersion(hdr)) {
+    case 0:
+        VBlobHeaderOpPopHead(hdr, &bits);
+        switch (bits) {
+        case 0:
+            return f32unzip_func_v0(info, dst, src, hdr);
+        }
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcUnexpected);
+    default:
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcBadVersion);
+    }
+}
+
+/* unzip
+ function
+ fzip_set funzip #1.0 ( fzip_fmt in );
+ */
+VTRANSFACT_IMPL(vdb_funzip, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftBlob;
+    rslt->u.bf = f32unzip_func;
+
+    return 0;
+}
diff --git a/libs/vxf/fzip.c b/libs/vxf/fzip.c
new file mode 100644
index 0000000..8cb36a3
--- /dev/null
+++ b/libs/vxf/fzip.c
@@ -0,0 +1,168 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <zlib.h>
+
+#include <assert.h>
+
+#define ROUND_TO_NEAREST 1
+#define ENCODING 1
+#include "fsplit-join.impl.h"
+
+struct self_t {
+    int32_t mantissa;
+};
+
+static rc_t invoke_zlib(void *dst, uint64_t *dsize, const void *src, uint32_t ssize, int32_t strategy, int32_t level) {
+    z_stream s;
+    int zr;
+    rc_t rc = 0;
+    
+    memset(&s, 0, sizeof(s));
+    s.next_in = (void *)src;
+    s.avail_in = ssize;
+    s.next_out = dst;
+    s.avail_out = (uInt)*dsize;
+    
+    *dsize = 0;
+    zr = deflateInit2(&s, level, Z_DEFLATED, -15, 9, strategy);
+    switch (zr) {
+        case 0:
+            break;
+        case Z_MEM_ERROR:
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        case Z_STREAM_ERROR:
+            return RC(rcXF, rcFunction, rcExecuting, rcParam, rcInvalid);
+        default:
+            return RC(rcXF, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+    }
+    zr = deflate(&s, Z_FINISH);
+    switch (zr) {
+        case Z_STREAM_END:
+            break;
+        case Z_OK:
+            s.total_out = 0;
+            break;
+        default:
+            rc = RC(rcXF, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+            break;
+    }
+    zr = deflateEnd(&s);
+    if ( zr != Z_OK && s.total_out != 0 )
+        rc = RC(rcXF, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+    if (rc == 0) {
+        assert(s.total_out <= UINT32_MAX);
+        *dsize = (uint32_t)s.total_out;
+    }
+    return rc;
+}
+
+static
+rc_t CC f32zip_func(
+              void *Self,
+              const VXformInfo *info,
+              VBlobResult *dst,
+              const VBlobData *Src,
+              VBlobHeader *hdr
+) {
+    rc_t rc;
+    const struct self_t *self = Self;
+    uint64_t dsize = (dst->elem_count * dst->elem_bits + 7) >> 3;
+    uint64_t element_count = (Src->elem_count * Src->elem_bits) >> 5;
+    uint64_t man_bytes;
+    KDataBuffer scratch;
+    
+    assert(element_count >> 32 == 0);
+    assert(dsize >> 32 == 0);
+    rc = KDataBufferMakeBytes(&scratch, element_count << 2);
+    if (rc)
+        return rc;
+    
+    VBlobHeaderSetVersion(hdr, 0);
+    VBlobHeaderOpPushTail(hdr, 0);
+    VBlobHeaderArgPushTail(hdr, self->mantissa);
+    
+    man_bytes = split_and_pack_f32(
+                                   Src->data, (uint32_t)element_count,
+                                   self->mantissa,
+                                   scratch.base);
+    assert((element_count + man_bytes) >> 32 == 0);
+    rc = invoke_zlib(dst->data, &dsize, scratch.base, (uint32_t)(element_count + man_bytes), Z_RLE, Z_BEST_SPEED);
+    KDataBufferWhack(&scratch);
+    if (rc == 0) {
+        dst->elem_bits = 1;
+        dst->byte_order = vboNone;
+        if (dsize)
+            dst->elem_count = dsize << 3;
+        else
+            rc = RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+    }
+    return rc;
+}
+
+static
+void CC vxf_fzip_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* vdb:fzip
+ * function fzip_fmt vdb:fzip #1.0 < U32 mantissa > ( fzip_set in );
+ */
+VTRANSFACT_IMPL(vdb_fzip, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    struct self_t *ctx;
+    uint32_t mantissa = 0;
+
+    assert(cp->argc == 1);
+    
+    mantissa = cp->argv[0].data.u32[0];
+    if (1 > mantissa || mantissa > 24)
+        return RC(rcXF, rcFunction, rcConstructing, rcParam, rcInvalid);
+    
+    ctx = malloc(sizeof(*ctx));
+    if (ctx) {
+        ctx->mantissa = mantissa;
+       
+        rslt->self = ctx;
+        rslt->whack = vxf_fzip_wrapper;
+        rslt->variant = vftBlob;
+        rslt->u.bf = f32zip_func;
+        
+        return 0;
+    }
+    return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
diff --git a/libs/vxf/integral.c b/libs/vxf/integral.c
new file mode 100644
index 0000000..e1ec6ec
--- /dev/null
+++ b/libs/vxf/integral.c
@@ -0,0 +1,113 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <arch-impl.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+
+#define INTEGRAL_NAME( T )  integral_ ## T
+#define INTEGRAL( T )                                                    \
+static                                                                   \
+rc_t CC INTEGRAL_NAME ( T ) ( void *data,                                \
+    const VXformInfo *info, int64_t row_id, const VFixedRowResult *rslt, \
+    uint32_t argc, const VRowData argv [] )                              \
+{                                                                        \
+    uint32_t i;                                                          \
+    T prior, * dst = rslt -> base;                                       \
+    const T * src = argv [ 0 ] . u . data . base;                        \
+    dst += rslt -> first_elem;						                     \
+    src += argv [ 0 ] . u . data . first_elem;				             \
+    for ( prior = 0, i = 0; i < rslt -> elem_count; ++ i )               \
+    {                                                                    \
+        prior += src [ i ];                                              \
+        dst [ i ] = prior;                                               \
+    }                                                                    \
+    return 0;                                                            \
+}
+
+INTEGRAL ( int8_t )
+INTEGRAL ( int16_t )
+INTEGRAL ( int32_t )
+INTEGRAL ( int64_t )
+
+static VFixedRowFunc integral_func [] =
+{
+    INTEGRAL_NAME ( int8_t  ),
+    INTEGRAL_NAME ( int16_t ),
+    INTEGRAL_NAME ( int32_t ),
+    INTEGRAL_NAME ( int64_t )
+};
+/* integral
+ *  return the 1 integral of input
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be member of  signed integers
+ *
+ *  "a" [ DATA ] - operand
+ *
+ *
+ * SYNOPSIS:
+ *  return 1st integral for every row
+ *
+ * USAGE:
+ *    I32 position = < I32 > integral ( pos_1st_d );
+ */
+VTRANSFACT_IMPL ( vdb_integral, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    int size_idx;
+    switch ( info -> fdesc . desc . domain )
+    {
+    case vtdUint:
+    case vtdInt:
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+    }
+
+    /* TBD - eventually support vector integrals
+       for today, check that dim of T is 1 */
+    if ( dp -> argv [ 0 ] . desc . intrinsic_dim != 1 )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+    /* the only numeric types we support are between 8 and 64 bits */
+    size_idx = uint32_lsbit ( dp -> argv [ 0 ] . desc . intrinsic_bits ) - 3;
+    if ( size_idx < 0 || size_idx > 3 || ( ( dp -> argv [ 0 ] . desc . intrinsic_bits &
+                                             ( dp -> argv [ 0 ] . desc . intrinsic_bits - 1 ) ) != 0 ) )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+
+    rslt -> u . pf = integral_func [ size_idx ];
+    rslt -> variant = vftFixedRow;
+
+    return 0;
+}
diff --git a/libs/vxf/integral_0.c b/libs/vxf/integral_0.c
new file mode 100644
index 0000000..c09a5a1
--- /dev/null
+++ b/libs/vxf/integral_0.c
@@ -0,0 +1,114 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <arch-impl.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+
+#define INTEGRAL_NAME( T )  integral_ ## T
+#define INTEGRAL( T )                                                    \
+static                                                                   \
+rc_t CC INTEGRAL_NAME ( T ) ( void *data,                                \
+    const VXformInfo *info, int64_t row_id, const VFixedRowResult *rslt, \
+    uint32_t argc, const VRowData argv [] )                              \
+{                                                                        \
+    uint32_t i;                                                          \
+    T prior, * dst = rslt -> base;                                       \
+    const T * src = argv [ 0 ] . u . data . base;                        \
+    dst += rslt -> first_elem;                                           \
+    src += argv [ 0 ] . u . data . first_elem;                           \
+    for ( prior = 0, i = 0; i < rslt -> elem_count; ++ i )               \
+    {                                                                    \
+        dst [ i ] = prior;                                               \
+        prior += src [ i ];                                              \
+    }                                                                    \
+    return 0;                                                            \
+}
+
+INTEGRAL ( int8_t )
+INTEGRAL ( int16_t )
+INTEGRAL ( int32_t )
+INTEGRAL ( int64_t )
+
+static VFixedRowFunc integral0_func [] =
+{
+    INTEGRAL_NAME ( int8_t  ),
+    INTEGRAL_NAME ( int16_t ),
+    INTEGRAL_NAME ( int32_t ),
+    INTEGRAL_NAME ( int64_t )
+};
+
+/* integral
+ *  return the 1 integral of input
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be member of  signed integers
+ *
+ *  "a" [ DATA ] - operand
+ *
+ *
+ * SYNOPSIS:
+ *  return 1st integral for every row
+ *
+ * USAGE:
+ *    I32 position = < I32 > integral_0 ( pos_1st_d );
+ */
+VTRANSFACT_IMPL ( vdb_integral_0, 1, 1, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    int size_idx;
+    switch ( info -> fdesc . desc . domain )
+    {
+    case vtdUint:
+    case vtdInt:
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+    }
+
+    /* TBD - eventually support vector integrals
+       for today, check that dim of T is 1 */
+    if ( dp -> argv [ 0 ] . desc . intrinsic_dim != 1 )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+    /* the only numeric types we support are between 8 and 64 bits */
+    size_idx = uint32_lsbit ( dp -> argv [ 0 ] . desc . intrinsic_bits ) - 3;
+    if ( size_idx < 0 || size_idx > 3 || ( ( dp -> argv [ 0 ] . desc . intrinsic_bits &
+                                             ( dp -> argv [ 0 ] . desc . intrinsic_bits - 1 ) ) != 0 ) )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+
+    rslt -> u . pf = integral0_func [ size_idx ];
+    rslt -> variant = vftFixedRow;
+
+    return 0;
+}
diff --git a/libs/vxf/irzip.c b/libs/vxf/irzip.c
new file mode 100644
index 0000000..d9b99ee
--- /dev/null
+++ b/libs/vxf/irzip.c
@@ -0,0 +1,564 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <compiler.h>
+#include <klib/sort.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <byteswap.h>
+#include <os-native.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+
+#include <zlib.h>
+
+#include <stdio.h>
+#include <assert.h>
+
+typedef struct {
+    size_t size;
+    size_t used;
+    void *buf;
+} szbuf;
+
+static rc_t zlib_compress(szbuf *dst, const void *src, size_t ssize, int32_t strategy, int32_t level) {
+    z_stream s;
+    int zr;
+    rc_t rc = 0;
+    
+    memset(&s, 0, sizeof(s));
+    s.next_in = (void *)src;
+    s.avail_in = (uInt)ssize;
+    s.next_out = dst->buf;
+    s.avail_out = (uInt)dst->size;
+    
+    dst->used = 0;
+    
+    zr = deflateInit2(&s, level, Z_DEFLATED, -15, 9, strategy);
+    switch (zr) {
+    case 0:
+        break;
+    case Z_MEM_ERROR:
+        return RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    case Z_STREAM_ERROR:
+        return RC(rcVDB, rcFunction, rcExecuting, rcParam, rcInvalid);
+    default:
+        return RC(rcVDB, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+    }
+    zr = deflate(&s, Z_FINISH);
+    switch (zr) {
+    case Z_STREAM_END:
+        break;
+    case Z_OK:
+        s.total_out = 0;
+        break;
+    default:
+        rc = RC(rcVDB, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+        break;
+    }
+    zr = deflateEnd(&s);
+    if ( zr != Z_OK && s.total_out != 0 )
+        rc = RC(rcVDB, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+    if ( rc == 0 ) {
+        dst->used = (uint32_t)s.total_out;
+    }
+    return rc;
+}
+
+static rc_t zlib_decompress(void *dst, size_t dsize, size_t *psize, const void *src, size_t ssize) {
+    z_stream s;
+    int zr;
+    rc_t rc;
+    
+    memset(&s, 0, sizeof(s));
+    s.next_in = (void *)src;
+    s.avail_in = (uInt)ssize;
+    s.next_out = dst;
+    s.avail_out = (uInt)dsize;
+    
+    zr = inflateInit2(&s, -15);
+    switch (zr) {
+    case 0:
+        break;
+    case Z_MEM_ERROR:
+        return RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    default:
+        return RC(rcVDB, rcFunction, rcExecuting, rcNoObj, rcUnexpected);
+    }
+    zr = inflate(&s, Z_FINISH);
+    switch (zr) {
+    case Z_STREAM_END:
+    case Z_OK:
+        *psize = s.total_in;
+        rc = 0;
+        break;
+    case Z_BUF_ERROR:
+    case Z_NEED_DICT:
+    case Z_DATA_ERROR:
+        rc = RC(rcVDB, rcFunction, rcExecuting, rcData, rcCorrupt);
+        break;
+    case Z_MEM_ERROR:
+        rc = RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        break;
+    default:
+        rc = RC(rcVDB, rcFunction, rcExecuting, rcNoObj, rcUnexpected);
+        break;
+    }
+    if (inflateEnd(&s) == Z_OK) return rc;
+    
+    return rc == 0 ? RC(rcVDB, rcFunction, rcExecuting, rcData, rcCorrupt) : rc;
+}
+
+
+#define STYPE int8_t
+#define USTYPE uint8_t
+#define ENCODE encode_i8
+#define DECODE decode_i8
+#include "irzip.impl.h"
+#undef ENCODE
+#undef DECODE
+#undef STYPE
+#undef USTYPE
+
+#define STYPE int16_t
+#define USTYPE uint16_t
+#define ENCODE encode_i16
+#define DECODE decode_i16
+#include "irzip.impl.h"
+#undef ENCODE
+#undef DECODE
+#undef STYPE
+#undef USTYPE
+
+#define STYPE int32_t
+#define USTYPE uint32_t
+#define ENCODE encode_i32
+#define DECODE decode_i32
+#define TRY2SERIES 1
+#include "irzip.impl.h"
+#undef TRY2SERIES
+#undef ENCODE
+#undef DECODE
+#undef STYPE
+#undef USTYPE
+
+#define STYPE int64_t
+#define USTYPE uint64_t
+#define ENCODE encode_i64
+#define DECODE decode_i64
+#define TRY2SERIES 1
+#include "irzip.impl.h"
+#undef TRY2SERIES
+#undef ENCODE
+#undef DECODE
+#undef STYPE
+#undef USTYPE
+
+#define STYPE uint8_t
+#define USTYPE uint8_t
+#define ENCODE encode_u8
+#define DECODE decode_u8
+#include "irzip.impl.h"
+#undef ENCODE
+#undef DECODE
+#undef STYPE
+#undef USTYPE
+
+#define STYPE uint16_t
+#define USTYPE uint16_t
+#define ENCODE encode_u16
+#define DECODE decode_u16
+#include "irzip.impl.h"
+#undef ENCODE
+#undef DECODE
+#undef STYPE
+#undef USTYPE
+
+#define STYPE uint32_t
+#define USTYPE uint32_t
+#define ENCODE encode_u32
+#define DECODE decode_u32
+#define TRY2SERIES 1
+#include "irzip.impl.h"
+#undef TRY2SERIES
+#undef ENCODE
+#undef DECODE
+#undef STYPE
+#undef USTYPE
+
+#define STYPE uint64_t
+#define USTYPE uint64_t
+#define ENCODE encode_u64
+#define DECODE decode_u64
+#define TRY2SERIES 1
+#include "irzip.impl.h"
+#undef TRY2SERIES
+#undef ENCODE
+#undef DECODE
+#undef STYPE
+#undef USTYPE
+
+
+typedef rc_t (*encode_f)(uint8_t dst[], size_t dsize, size_t *used,
+                         int64_t *Min, int64_t *Slope, uint8_t *series_count,uint8_t *planes, const void *Y, unsigned N);
+
+struct self_t {
+    encode_f f;
+};
+
+static
+struct self_t selfs[8] = {
+    { (encode_f)encode_u8 },
+    { (encode_f)encode_i8 },
+    { (encode_f)encode_u16 },
+    { (encode_f)encode_i16 },
+    { (encode_f)encode_u32 },
+    { (encode_f)encode_i32 },
+    { (encode_f)encode_u64 },
+    { (encode_f)encode_i64 },
+};
+
+
+
+static
+rc_t CC irzip(
+               void *Self,
+               const VXformInfo *info,
+               VBlobResult *dst,
+               const VBlobData *src,
+               VBlobHeader *hdr
+) {
+    rc_t rc = 0;
+    const struct self_t *self = Self;
+    size_t dsize;
+    int64_t min[2],slope[2];
+    uint8_t planes;
+    uint8_t series_count = 1;
+
+    assert(src->elem_count >> 32 == 0);
+    assert(((dst->elem_count * dst->elem_bits + 7) >> 3) >> 32 == 0);
+    dsize = (uint32_t)((dst->elem_count * dst->elem_bits + 7) >> 3);
+    
+   
+    rc = self->f(dst->data, dsize, &dsize, min, slope, &series_count, &planes, src->data, (unsigned)src->elem_count);
+#if 0
+    if(/*src->elem_bits ==64 &&*/ dsize > 0){
+	printf("%2d:irzip_elem_bits=%.8f\telem=%d\tstart=%ld\tslope=%lx\tplanes=%d\n",(int)src->elem_bits,dsize*8./src->elem_count,(int)src->elem_count,min,slope,planes);
+    }
+#endif
+    
+    VBlobHeaderSetVersion(hdr, (series_count > 1)?3:2);
+    if ( rc == 0 ) {
+	rc = VBlobHeaderOpPushTail(hdr, planes);
+	if ( rc == 0) {
+		rc = VBlobHeaderArgPushTail(hdr, min[0]);
+		if ( rc == 0 ) {
+			rc = VBlobHeaderArgPushTail(hdr, slope[0]);
+			if ( rc == 0 ){
+				if(series_count > 1){
+					rc = VBlobHeaderArgPushTail(hdr, min[1]);
+					if(rc == 0) rc = VBlobHeaderArgPushTail(hdr, slope[1]);
+				}
+				dst->byte_order = vboNative;
+				dst->elem_bits = 1;
+				dst->elem_count = dsize << 3;
+			}
+		}
+	}
+   }
+    return rc;
+}
+
+/* 
+ function izip_fmt izip #2.1 ( izip_set in )
+ */
+VTRANSFACT_IMPL(vdb_izip, 2, 1, 1) (const void *Self, const VXfactInfo *info,
+                                     VFuncDesc *rslt, const VFactoryParams *cp,
+                                     const VFunctionParams *dp )
+{
+/*
+* 2.1.1: bug fix for #VDB-539, bad conversions in encode_u64
+*/
+
+    if (dp->argc != 1) {
+#if _DEBUGGING
+        fprintf(stderr, "dp->argc = %u != 1\n", dp->argc);
+#endif
+        return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+    }
+
+    rslt->variant = vftBlob;
+    rslt->u.bf = irzip;
+
+    switch (dp->argv[0].desc.domain) {
+    case vtdInt:
+        switch (dp->argv[0].desc.intrinsic_bits) {
+        case 8:
+            rslt->self = &selfs[1];
+            break;
+        case 16:
+            rslt->self = &selfs[3];
+            break;
+        case 32:
+            rslt->self = &selfs[5];
+            break;
+        case 64:
+            rslt->self = &selfs[7];
+            break;
+        default:
+#if _DEBUGGING
+            fprintf(stderr, "intrinsic_bits = %u != (8|16|32|64)\n", dp->argv[0].desc.intrinsic_bits);
+#endif
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            break;
+        }
+        break;
+    case vtdUint:
+        switch (dp->argv[0].desc.intrinsic_bits) {
+        case 8:
+            rslt->self = &selfs[0];
+            break;
+        case 16:
+            rslt->self = &selfs[2];
+            break;
+        case 32:
+            rslt->self = &selfs[4];
+            break;
+        case 64:
+            rslt->self = &selfs[6];
+            break;
+        default:
+#if _DEBUGGING
+            fprintf(stderr, "intrinsic_bits = %u != (8|16|32|64)\n", dp->argv[0].desc.intrinsic_bits);
+#endif
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            break;
+        }
+        break;
+    default:
+#if _DEBUGGING
+        fprintf(stderr, "domain != vtdInt or vtdUint\n");
+#endif
+        return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+    }
+
+    return 0;
+}
+
+typedef rc_t (*decode_f)(void *dst, unsigned N, int64_t* min, int64_t* slope, uint8_t series_count,uint8_t planes, const uint8_t src[], size_t ssize);
+
+static
+decode_f uselfs[8] = {
+    (decode_f)decode_u8,
+    (decode_f)decode_i8,
+    (decode_f)decode_u16,
+    (decode_f)decode_i16,
+    (decode_f)decode_u32,
+    (decode_f)decode_i32,
+    (decode_f)decode_u64,
+    (decode_f)decode_i64,
+};
+
+static
+rc_t iunzip_func_v1(
+                    void *Self,
+                    const VXformInfo *info,
+                    VBlobResult *dst,
+                    const VBlobData *src,
+                    int64_t* min,int64_t* slope,uint8_t series_count,
+                    uint8_t planes
+                    )
+{
+    uint32_t ssize;
+    rc_t rc;
+    
+    assert(dst->elem_count >> 32 == 0);
+    assert(((src->elem_count * src->elem_bits + 7) >> 3) >> 32 == 0);
+    ssize = (uint32_t)((src->elem_count * src->elem_bits + 7) >> 3);
+    
+    dst->byte_order = vboNative;
+    
+    rc = uselfs[(uintptr_t)(Self)](dst->data, (unsigned)dst->elem_count, min, slope, series_count, planes,src->data, ssize);
+    return rc;
+}
+
+extern rc_t CC iunzip_func_v0(
+                              void *Self,
+                              const VXformInfo *info,
+                              VBlobResult *dst,
+                              const VBlobData *src
+                              );
+    
+static
+rc_t CC iunzip(
+            void *Self,
+            const VXformInfo *info,
+            VBlobResult *dst,
+            const VBlobData *src,
+            VBlobHeader *hdr
+            )
+{
+    switch (VBlobHeaderVersion(hdr)) {
+    case 0:
+        return iunzip_func_v0(Self, info, dst, src);
+    case 1: 
+    case 2: 
+    case 3:
+	{
+        int64_t min[2],slope[2];
+        uint8_t planes;
+	uint8_t series_count=1;
+        rc_t rc;
+        
+        rc = VBlobHeaderOpPopHead(hdr, &planes);
+        if (rc == 0) {
+            rc = VBlobHeaderArgPopHead(hdr, min);
+            if (rc == 0) {
+		rc = VBlobHeaderArgPopHead(hdr, slope);
+		if (rc != 0) slope[0] = 0;
+		else {
+			rc = VBlobHeaderArgPopHead(hdr, min + 1);
+			if(rc==0) rc= VBlobHeaderArgPopHead(hdr, slope+1);
+			if(rc==0) series_count=2;
+		}
+                return iunzip_func_v1(Self, info, dst, src, min,slope, series_count, planes);
+            }
+	}
+        return rc;
+    }
+    default:
+        return RC(rcVDB, rcFunction, rcExecuting, rcParam, rcBadVersion);
+    }
+}
+
+/* 
+ function izip_set iunzip #2.1 ( izip_fmt in )
+ */
+VTRANSFACT_IMPL(vdb_iunzip, 2, 1, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftBlob;
+    rslt->u.bf = iunzip;
+    
+    switch (info->fdesc.desc.domain) {
+    case vtdInt:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+            rslt->self = (void *)1;
+            break;
+        case 16:
+            rslt->self = (void *)3;
+            break;
+        case 32:
+            rslt->self = (void *)5;
+            break;
+        case 64:
+            rslt->self = (void *)7;
+            break;
+        default:
+#if _DEBUGGING
+            fprintf(stderr, "intrinsic_bits = %u != (8|16|32|64)\n", info->fdesc.desc.intrinsic_bits);
+#endif
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            break;
+        }
+        break;
+    case vtdUint:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+            rslt->self = (void *)0;
+            break;
+        case 16:
+            rslt->self = (void *)2;
+            break;
+        case 32:
+            rslt->self = (void *)4;
+            break;
+        case 64:
+            rslt->self = (void *)6;
+            break;
+        default:
+#if _DEBUGGING
+            fprintf(stderr, "intrinsic_bits = %u != (8|16|32|64)\n", info->fdesc.desc.intrinsic_bits);
+#endif
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            break;
+        }
+        break;
+    default:
+#if _DEBUGGING
+        fprintf(stderr, "domain != vtdInt or vtdUint\n");
+#endif
+        return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+    }
+    return 0;
+}
+
+#if TESTING
+int test_encode(const int32_t Y[], unsigned N) {
+    uint8_t *dst;
+    size_t dsize;
+    size_t temp;
+    rc_t rc = 0;
+    int64_t min,slope;
+    uint8_t planes;
+    
+    temp = N * sizeof(Y[0]);
+    assert(temp >> 32 == 0);
+    dst = malloc(dsize = (unsigned)temp);
+    if (dst == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+
+    rc = encode_i32(dst, dsize, &dsize, &min, &slope, &planes, Y, N);
+    
+    {
+        int32_t *X;
+        
+        X = malloc(N * sizeof(Y[0]));
+        if (X) {
+            rc = decode_i32( X, N, min, slope, planes, dst, dsize);
+            if (rc == 0) {
+                rc = memcmp(Y, X, N * sizeof(Y[0])) == 0 ? 0 : RC(rcXF, rcFunction, rcExecuting, rcFunction, rcInvalid);
+            }
+            free(X);
+        }
+    }
+
+    free(dst);
+    if (rc)
+        fprintf(stdout, "test failed!\n");
+    return rc;
+}
+#endif
+
diff --git a/libs/vxf/irzip.impl.h b/libs/vxf/irzip.impl.h
new file mode 100644
index 0000000..ff12a7b
--- /dev/null
+++ b/libs/vxf/irzip.impl.h
@@ -0,0 +1,482 @@
+/*
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#define DELTA_UND  0
+#if _ARCH_BITS == 32
+#define DELTA_POS  0x7ffffffffffffff0LL
+#define DELTA_NEG  0x7ffffffffffffff1LL
+#define DELTA_BOTH 0x7ffffffffffffff2LL
+#else
+#define DELTA_POS  0x7ffffffffffffff0
+#define DELTA_NEG  0x7ffffffffffffff1
+#define DELTA_BOTH 0x7ffffffffffffff2
+#endif
+
+#define TRIGGER_2ND_SERIES 10*1024
+
+static rc_t ENCODE(uint8_t dst[], size_t dsize, size_t *used, int64_t *Min, int64_t *Slope, uint8_t *series_count,uint8_t *planes, const STYPE Y[], unsigned N)
+{
+    unsigned i;
+    unsigned k;
+    rc_t rc=0;
+    STYPE min,a0;
+    int64_t 	slope, delta_type = DELTA_UND,y_cur;
+    uint64_t    sum_a0,sum_min,sum_y,sum_delta;
+    uint64_t	max_diff;
+    uint8_t	*scratch=NULL;
+#ifdef TRY2SERIES
+    uint8_t	*series=NULL;/*** for 2nd series flag ***/
+    uint64_t    sum_delta2[2] = {0,0};
+    uint64_t    max_diff2[2] = {0,0};
+    uint32_t	last[2]; /** to run 2 series ***/
+    int64_t	delta2_type[2] = {DELTA_UND,DELTA_UND};
+#endif
+
+    if( N < 10 ) /*** no reason to encode **/
+		return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+
+    scratch=malloc(N*sizeof(STYPE));
+    if(scratch==NULL) return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+#ifdef TRY2SERIES
+    series=malloc(N*sizeof(*series));
+    if(series==NULL) return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+#endif
+   
+    /*** the code tries to best-fit one of 3 cases ****/
+    /*** 1. delta - for monotonous data **/
+    /*** 2. horizontal line through the minimum ****/
+    /*** 3. sloped line from the first element y[i] = y[0] + i * slope ***/
+    /*** all algorithms keep delta positive ****/
+    /*** 1. is preferred ***/
+    /*** the best between 2 and 3 is chosen by the sum of all deltas ****/
+    /*** floating point calculations are avoided ***/
+	a0 =  Y[0];
+	y_cur = Y[1];
+	sum_y =  Y[0] +  Y[1];
+	slope = (int64_t)Y[1] - (int64_t)Y[0];
+	if(slope < 0) {
+		min = Y[1]; 
+		sum_delta = -slope;
+		delta_type = DELTA_NEG;
+	} else {
+		min = Y[0];
+		sum_delta = slope;
+		if( slope != 0 ) delta_type = DELTA_POS;
+	}
+	max_diff = sum_delta;
+#ifdef TRY2SERIES
+	if(sum_delta >= TRIGGER_2ND_SERIES){
+		last[0]=0; last[1]=1;
+		series[0]=0; series[1]=1;
+	} else {
+		last[0]=1; last[1]=0;
+		series[0]=0; series[1]=0;
+		delta2_type[0] = delta_type;
+		sum_delta2[0]=sum_delta;
+		max_diff2[0]= sum_delta;
+	}
+#endif
+	for (i = 2; i < N; ++i) {
+		int64_t  md = (int64_t)Y[i] - (int64_t)min;
+		int64_t diff =  (int64_t)Y[i] - (int64_t)Y[i-1];
+		uint64_t abs_diff = (diff >= 0) ? diff : -diff;
+#ifdef TRY2SERIES
+		int64_t	last_delta_type = delta_type ;
+#endif
+		sum_y += Y[i];
+		sum_delta += abs_diff;
+		if(abs_diff > max_diff) max_diff = abs_diff;
+#define MACRO_SET_DELTA_TYPE(Diff,DeltaType) \
+		if( DeltaType != DELTA_BOTH){ \
+			if ( Diff > 0){ \
+				if(DeltaType == DELTA_NEG ) DeltaType =DELTA_BOTH; \
+				else if (DeltaType == DELTA_UND) DeltaType = DELTA_POS; \
+			} else if ( Diff < 0 ){ \
+				if(DeltaType == DELTA_POS ) DeltaType =DELTA_BOTH; \
+				else if (DeltaType == DELTA_UND) DeltaType = DELTA_NEG; \
+			} \
+		}
+		MACRO_SET_DELTA_TYPE(diff,delta_type);
+#ifdef TRY2SERIES
+		if(last[1] == 0){/** don't have a second series yet ***/
+			if(abs_diff >= TRIGGER_2ND_SERIES){
+				last[1]=i;
+				series[i]=1;
+				sum_delta2[0] = sum_delta - abs_diff;
+				delta2_type[0] = last_delta_type;
+				max_diff2[0] = max_diff;
+			} else {
+				last[0]=i;
+				series[i]=0;
+			}
+		} else { /*** second series is in being built ***/
+			int64_t diff1 =  (int64_t)Y[i] - (int64_t)Y[last[0]];
+			int64_t diff2 =  (int64_t)Y[i] - (int64_t)Y[last[1]];
+			uint64_t abs_diff1 = (diff1 >= 0) ? diff1 : -diff1;
+			uint64_t abs_diff2 = (diff2 >= 0) ? diff2 : -diff2;
+			if(abs_diff1 <= abs_diff2){
+				last[0]=i;
+				series[i]=0;
+				sum_delta2[0] += abs_diff1;
+				if(abs_diff1 > max_diff2[0]) max_diff2[0] = abs_diff1;
+				MACRO_SET_DELTA_TYPE(diff1,delta2_type[0]);
+			} else {
+				last[1]=i;
+				series[i]=1;
+				sum_delta2[1] += abs_diff2;
+				if(abs_diff2 > max_diff2[1]) max_diff2[1] = abs_diff2;
+				MACRO_SET_DELTA_TYPE(diff2,delta2_type[1]);
+			}
+		}
+#endif
+		if ( md < 0 ) {
+			min = Y[i];
+		}
+		y_cur += slope;
+		if(y_cur > (int64_t)Y[i]){/*** reduce the slope ***/
+			slope =  ((int64_t)Y[i] - (int64_t)Y[0] - i+1/**round down**/) /i;
+			y_cur =  (int64_t)Y[0] + (int64_t)(i* slope);
+			assert( y_cur <= (int64_t)Y[i]);
+		}
+	}
+
+    /*** define which delta is the smallest **/
+    *series_count=1;
+    if(delta_type == DELTA_BOTH) sum_delta <<= 1; /*** in DELTA_BOTH case we will use extra bit ***/
+    
+    sum_min = sum_y - N*min;
+    sum_a0  = sum_y - N*a0 - slope*N*(N-1)/2;
+    
+			
+    if( (delta_type == DELTA_POS || delta_type == DELTA_NEG ||
+        (delta_type == DELTA_BOTH &&  max_diff <  (((uint64_t)1)<<(sizeof(STYPE)*8-1))) /*** to prevent loosing a bit **/
+        ) && sum_delta <= sum_min && sum_delta <= sum_a0){
+	a0=Y[0];
+	slope = delta_type;
+    } else if(sum_a0 > sum_min){
+	a0 = min;
+	slope = 0;
+    }
+	
+
+    *planes = 0;
+    *used = 0;
+    *Min= a0;
+    *Slope = slope;
+
+#ifdef TRY2SERIES
+    if(last[1] > 0){
+	bool delta2_is_ok=true;
+	uint64_t    sum_delta2_total=0;
+	if(delta2_type[0] == DELTA_UND) delta2_type[0] = DELTA_POS;
+	if(delta2_type[1] == DELTA_UND) delta2_type[1] = DELTA_POS;
+
+	if(delta2_type[0] == DELTA_BOTH){
+		 delta2_is_ok = delta2_is_ok && (max_diff2[0] <  (((uint64_t)1)<<(sizeof(STYPE)*8-2)));
+		 sum_delta2_total += sum_delta2[0] * 4;
+	} else {
+		 delta2_is_ok = delta2_is_ok && (max_diff2[0] <  (((uint64_t)1)<<(sizeof(STYPE)*8-1)));
+		 sum_delta2_total += sum_delta2[0] * 2;
+	}
+	if(delta2_type[1] == DELTA_BOTH){
+		delta2_is_ok = delta2_is_ok && (max_diff2[1] <  (((uint64_t)1)<<(sizeof(STYPE)*8-2)));
+		sum_delta2_total += sum_delta2[1] * 4;
+	} else {
+		delta2_is_ok = delta2_is_ok && (max_diff2[1] <  (((uint64_t)1)<<(sizeof(STYPE)*8-1)));
+		sum_delta2_total += sum_delta2[1] * 2;
+	}
+	
+	if(delta2_is_ok && sum_delta2_total < sum_delta && sum_delta2_total < sum_min && sum_delta2_total< sum_a0){
+		*series_count=2;
+		Slope[0] = delta2_type[0];
+		Slope[1] = delta2_type[1];
+		Min[0]   = Y[0];
+	}
+    }
+#endif
+
+#define MACRO_FLUSH_VALUE \
+	for(k=0;k<sizeof(STYPE);k++){ \
+		if ((scratch[i+k*N] = (uint8_t)(val & 0xff)) != 0){ \
+			*planes |= (1<<k); \
+		} \
+		val >>= 8; \
+	}
+
+    /*** rotate the array ***/
+    if( *series_count > 1 ){
+#ifdef TRY2SERIES
+	for( i = 0,last[0]=0,last[1]=0; i != N; ++i){
+		uint64_t val;
+		if(series[i] == 0){
+			if(delta2_type[0] == DELTA_POS)       { assert(Y[i] >= Y[last[0]]); val = Y[i] - Y[last[0]];}
+			else if (delta2_type[0] == DELTA_NEG) { assert(Y[i] <= Y[last[0]]); val = Y[last[0]] - Y[i];}
+			else if( Y[i] >= Y[last[0]] )         val = (Y[i] - Y[last[0]])*2;
+			else				      val = (Y[last[0]] - Y[i])*2+1;
+			last[0]=i;
+			val<<=1;
+		} else {
+			if(last[1]==0){
+				Min[1] = Y[i];
+				val = 1;/*** flag second series with a bit ***/
+			} else {
+				if(delta2_type[1] == DELTA_POS)       { assert(Y[i] >= Y[last[1]]); val = Y[i] - Y[last[1]];}
+				else if (delta2_type[1] == DELTA_NEG) { assert(Y[i] <= Y[last[1]]); val = Y[last[1]] - Y[i];}
+				else if( Y[i] >= Y[last[1]] )         val = (Y[i] - Y[last[1]])*2;
+				else				      val = (Y[last[1]] - Y[i])*2+1;
+				val = val*2+1; /*** flag second series with a bit ***/
+			}
+			last[1]=i;
+		}
+                MACRO_FLUSH_VALUE;
+        }
+#else
+	assert(0);
+	rc=RC(rcXF, rcFunction, rcExecuting, rcParam, rcInconsistent);
+#endif
+    } else if(slope == DELTA_POS){
+	for( i = 0; i != N; ++i){
+		uint64_t val=Y[i] - a0;
+		assert(Y[i] >= a0);
+		a0 =  Y[i];
+		MACRO_FLUSH_VALUE;
+	}
+    } else if( slope == DELTA_NEG){
+	for( i = 0; i != N; ++i){
+		uint64_t  val = a0 - Y[i];
+		assert(Y[i] <= a0);
+                a0 =  Y[i];
+		MACRO_FLUSH_VALUE;
+	}
+    } else if( slope == DELTA_BOTH){
+	for( i = 0; i != N; ++i){
+		uint64_t val;
+		if( Y[i] >= a0 ){ /** move sign bit into the lowest bit ***/
+                        val = ( Y[i] - a0 ) << 1;
+                } else {
+                        val = ( a0 - Y[i]) * 2 + 1;
+                }
+                a0 =  Y[i];
+		MACRO_FLUSH_VALUE;
+	}
+    } else {
+	for( i = 0; i != N; ++i){
+		uint64_t val =  Y[i] - a0 - slope*i;
+		assert((int64_t)Y[i] >=  (int64_t)a0 + slope*i);
+		MACRO_FLUSH_VALUE;
+	}
+    }
+
+    /*** record the arrays ***/
+    for(k=0;k<sizeof(STYPE) && rc == 0; k++){
+	if (*planes & (1<<k)) {
+		szbuf s2;
+		s2.used = 0;
+		s2.size = dsize - *used;
+		s2.buf  = dst + *used;
+		rc = zlib_compress(&s2, scratch+k*N, N,Z_RLE, Z_BEST_SPEED);
+		if ( rc == 0 ) {
+			*used += s2.used;
+			if (s2.used == 0) /*** skip zipping **/
+				 rc=RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+		}
+	}
+    }
+    if(scratch) free(scratch);
+#ifdef TRY2SERIES
+    if(series) free(series);
+#endif
+    return rc;
+}
+
+static rc_t DECODE(STYPE Y[], unsigned N, int64_t* min, int64_t* slope, uint8_t series_count, uint8_t planes, const uint8_t src[], size_t ssize)
+{
+    unsigned k;
+    size_t j;
+    unsigned m;
+    unsigned i;
+    uint8_t *scratch=NULL;
+    rc_t rc=0;
+    bool    first;
+
+    memset(Y, 0, sizeof(Y[0]) * N);
+    for (j = k = 0, m = 1,first=true; m < 0x100; m <<= 1, k += 8) {
+        size_t n;
+        
+        if ((planes & m) == 0)
+            continue;
+        
+        n = 0;
+	if( !scratch ) scratch = malloc(N);
+	
+        rc = zlib_decompress(scratch, N, &n, src + j, ssize - j);
+        if (rc) goto DONE;
+        j += n;
+	if(first){
+		for (i = 0; i != N; ++i) Y[i] = ((STYPE)scratch[i]) << k;
+		first = false;
+	} else {
+		for (i = 0; i != N; ++i) Y[i] |= ((STYPE)scratch[i]) << k;
+	}
+    }
+    if(series_count == 2){
+#if 0 /** trying to unroll ***/
+	STYPE Ylast;
+	if(slope[0]==DELTA_BOTH){
+		if(slope[1]==DELTA_BOTH){ 
+			for(i = 0; i != N; ++i){
+				scratch[i] = Y[i]&3;
+				Y[i] = ((USTYPE)Y[i]) >> 2;
+			}
+		} else {
+			for(i = 0; i != N; ++i){
+				uint8_t tmp = Y[i]&1;
+				if(tmp){
+					scratch[i] = tmp;
+					Y[i] = ((USTYPE)Y[i]) >> 1;
+				} else {
+					scratch[i] = Y[i]&3;
+					Y[i] = ((USTYPE)Y[i]) >> 2;
+				}
+                        }
+
+		}
+	} else {
+		if(slope[1]==DELTA_BOTH){
+			for(i = 0; i != N; ++i){
+                                uint8_t tmp = Y[i]&1;
+                                if(!tmp){
+                                        scratch[i] = tmp;
+					Y[i] = ((USTYPE)Y[i]) >> 1;
+                                } else {
+                                        scratch[i] = Y[i]&3;
+					Y[i] = ((USTYPE)Y[i]) >> 2;
+
+                                }
+                        }
+		} else {
+			for(i = 0; i != N; ++i){
+				scratch[i] = Y[i]&1;
+				Y[i] = ((USTYPE)Y[i]) >> 1;
+			}
+		}
+	}
+	/** k=0 - main series, k=1 -secondary **/
+	for(k=0;k<2;k++){
+		Ylast = min[k];
+		if(slope[k]==DELTA_POS) {
+			for (i = 0; i != N; ++i){
+				if((scratch[i]&1)==k){
+					Y[i]  = Ylast + Y[i];
+					Ylast = Y[i];
+				}
+			}
+		} else if (slope[k]==DELTA_NEG){
+			for (i = 0; i != N; ++i){
+				if((scratch[i]&1)==k){
+					Y[i]  = Ylast - Y[i];
+					Ylast = Y[i];
+				}
+			}
+		} else for (i = 0; i != N; ++i){
+			if((scratch[i]&1)==k){
+				if(scratch[i]&2){
+					Y[i]  = Ylast - Y[i];
+				} else {
+					Y[i]  = Ylast + Y[i];
+				}
+				Ylast = Y[i];
+			}
+		}
+	}
+
+#else
+	uint32_t last[2]={0,0};
+	for (i = 0; i != N; ++i){
+		if( (Y[i]&1) == 0 ){/**main series **/
+			USTYPE val = (USTYPE)Y[i];
+			val >>= 1;
+			if(i==0){
+                                Y[i] = (STYPE)min[0];
+                                last[0]=i;
+                        }
+			if(slope[0]==DELTA_POS)      Y[i] = Y[last[0]] + val;
+			else if(slope[0]==DELTA_NEG) Y[i] = Y[last[0]] - val;
+			else if ((val&1)==0)         Y[i] = Y[last[0]] + (val >>1);
+			else 	                     Y[i] = Y[last[0]] - (val >>1);
+			last[0]=i;
+		} else { /**secondary series ***/
+			USTYPE val = (USTYPE)Y[i];
+			val >>= 1;
+			if(last[1]==0){
+				Y[i] = (STYPE)min[1];
+				last[1]=i;
+			}
+                        if(slope[1]==DELTA_POS)      Y[i] = Y[last[1]] + val;
+                        else if(slope[1]==DELTA_NEG) Y[i] = Y[last[1]] - val;
+                        else if ((val&1)==0)         Y[i] = Y[last[1]] + (val >>1);
+                        else                         Y[i] = Y[last[1]] - (val >>1);
+                        last[1]=i;
+		}
+        }
+#endif
+    } else if(min[0]==0 && slope[0]==0){ /*** no slope no offset - nothing to do ***/
+    } else if(slope[0] == DELTA_POS){
+	assert(Y[0] == 0);
+	Y[0] = (STYPE)min[0];
+	for (i = 1; i != N; ++i){
+		Y[i] = Y[i-1] + Y[i];
+	}
+    } else if (slope[0] == DELTA_NEG ) {
+	assert(Y[0] == 0);
+	Y[0] = (STYPE)min[0];
+	for (i = 1; i != N; ++i){
+		Y[i] =  Y[i-1] - Y[i];
+	}
+    } else if (slope[0] == DELTA_BOTH){
+	assert(Y[0] == 0);
+	Y[0] = (STYPE)min[0];
+	for (i = 1; i != N; ++i){
+		USTYPE val = (USTYPE)Y[i];
+		val >>= 1;
+		if(Y[i] & 1) Y[i] = Y[i-1] - val;
+		else         Y[i] = Y[i-1] + val;
+	}
+    } else if(slope[0] == 0) {
+	for (i = 0; i != N; ++i){
+		Y[i]  += (STYPE)min[0];
+	}
+    } else {
+	for (i = 0; i != N; ++i){
+                Y[i]  += (STYPE)min[0];
+                min[0] += slope[0];
+        }
+    }
+
+DONE:
+    if(scratch) free(scratch);
+    return rc;
+}
diff --git a/libs/vxf/iunzip.c b/libs/vxf/iunzip.c
new file mode 100644
index 0000000..651c62c
--- /dev/null
+++ b/libs/vxf/iunzip.c
@@ -0,0 +1,748 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+#include <byteswap.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+
+#include <zlib.h>
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "izip-common.h"
+
+static void unpack_nbuf16_swap(nbuf *x) {
+    unsigned i;
+    
+    for (i = x->used; i; --i) {
+        x->data.raw[i - 1] = bswap_16(x->data.u16[i - 1]) + x->min;
+    }
+}
+
+static void unpack_nbuf32_swap(nbuf *x) {
+    unsigned i;
+    
+    for (i = x->used; i; --i) {
+        x->data.raw[i - 1] = bswap_32(x->data.u32[i - 1]) + x->min;
+    }
+}
+
+static void unpack_nbuf8(nbuf *x) {
+    unsigned i;
+    
+    for (i = x->used; i; --i) {
+        x->data.raw[i - 1] = x->data.u8[i - 1] + x->min;
+    }
+}
+
+static void unpack_nbuf16(nbuf *x) {
+    unsigned i;
+    
+    for (i = x->used; i; --i) {
+        x->data.raw[i - 1] = x->data.u16[i - 1] + x->min;
+    }
+}
+
+static void unpack_nbuf32(nbuf *x) {
+    unsigned i;
+    
+    for (i = x->used; i; --i) {
+        x->data.raw[i - 1] = x->data.u32[i - 1] + x->min;
+    }
+}
+
+static void unpack_nbuf(nbuf *x) {
+    unsigned i;
+    
+    switch (x->var) {
+    case 4:
+        unpack_nbuf8(x);
+        break;
+    case 3:
+        unpack_nbuf16(x);
+        break;
+    case 2:
+        unpack_nbuf32(x);
+        break;
+    default:
+        for (i = x->used; i; --i) {
+            x->data.raw[i - 1] = x->data.u64[i - 1] + x->min;
+        }
+        break;
+    }
+    x->var = 0;
+}
+
+static void unpack_nbuf_swap(nbuf *x) {
+    unsigned i;
+    
+    switch (x->var) {
+    case 4:
+        unpack_nbuf8(x);
+        break;
+    case 3:
+        unpack_nbuf16_swap(x);
+        break;
+    case 2:
+        unpack_nbuf32_swap(x);
+        break;
+    default:
+        for (i = x->used; ; --i) {
+            x->data.raw[i - 1] = bswap_64(x->data.u64[i - 1]) + x->min;
+            if (i == 0)
+                break;
+        }
+        break;
+    }
+    x->var = 0;
+}
+
+static rc_t zlib_decompress(void *dst, unsigned dsize, unsigned *psize, const void *src, uint32_t ssize) {
+    z_stream s;
+    int zr;
+    rc_t rc = 0;
+    
+    memset(&s, 0, sizeof(s));
+    s.next_in = (void *)src;
+    s.avail_in = ssize;
+    s.next_out = dst;
+    s.avail_out = dsize;
+    
+    zr = inflateInit2(&s, -15);
+    switch (zr) {
+    case 0:
+        break;
+    case Z_MEM_ERROR:
+        return RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    default:
+        return RC(rcVDB, rcFunction, rcExecuting, rcNoObj, rcUnexpected);
+    }
+    zr = inflate(&s, Z_FINISH);
+    switch (zr) {
+    case Z_STREAM_END:
+        assert(s.total_out <= UINT32_MAX);
+        *psize = (uint32_t)s.total_out;
+        rc = 0;
+        break;
+    case Z_OK:
+        rc = RC(rcXF, rcFunction, rcExecuting, rcMemory, rcInsufficient);
+        break;
+    case Z_BUF_ERROR:
+    case Z_NEED_DICT:
+    case Z_DATA_ERROR:
+        rc = RC(rcVDB, rcFunction, rcExecuting, rcData, rcCorrupt);
+        break;
+    case Z_MEM_ERROR:
+        rc = RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        break;
+    default:
+        rc = RC(rcVDB, rcFunction, rcExecuting, rcNoObj, rcUnexpected);
+        break;
+    }
+    zr = inflateEnd(&s);
+    switch (zr) {
+    case Z_OK:
+        return rc;
+    default:
+        if (rc == 0)
+            {
+            return RC(rcVDB, rcFunction, rcExecuting, rcData, rcCorrupt);
+            }
+        return rc;
+    }
+    return 0;
+}
+
+static
+void decode_types(uint8_t dst[], unsigned n, const uint8_t src[])
+{
+    unsigned i, j, k = 0;
+    
+    for (i = 0, j = 1; i != n; ++i)
+    {
+        if (j == 1)
+            k = src[i / 8];
+
+        dst[i] = (k & j) == 0 ? 0 : 1;
+
+        j <<= 1;
+        if (j == 0x100)
+            j = 1;
+    }
+}
+
+#define DESERIAL16(X) do { if (i + 2 > n) return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient); memmove(&y->u.izipped.X, &src[i], 2); i += 2; if (swap) y->u.izipped.X = bswap_16(y->u.izipped.X); } while (0)
+#define DESERIAL32(X) do { if (i + 4 > n) return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient); memmove(&y->u.izipped.X, &src[i], 4); i += 4; if (swap) y->u.izipped.X = bswap_32(y->u.izipped.X); } while (0)
+#define DESERIAL64(X) do { if (i + 8 > n) return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient); memmove(&y->u.izipped.X, &src[i], 8); i += 8; if (swap) y->u.izipped.X = bswap_64(y->u.izipped.X); } while (0)
+
+static rc_t deserialize_encoded(struct encoded *y, const uint8_t src[], unsigned n, int swap) {
+    unsigned i = 0;
+    
+    memset(y, 0, sizeof(*y));
+    
+    if (i + 1 > n)
+        return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+    y->flags = src[i]; ++i;
+    
+    if (i + 4 > n)
+        return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+    memmove(&y->data_count, &src[i], 4); i += 4;
+    if (swap)
+        y->data_count = bswap_32(y->data_count);
+    
+    switch (y->flags & 0x03) {
+    case 2:
+    case 3:
+        if (i + 8 > n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+        memmove(&y->u.packed.min, &src[i], 8); i += 8;
+        if (swap)
+            y->u.packed.min = bswap_64(y->u.packed.min);
+    case 1:
+        y->u.zipped.data_size = n - i;
+        y->u.zipped.data = &src[i];
+        return 0;
+    default:
+        break;
+    }
+    
+    DESERIAL32(data_flags);
+    DESERIAL32(segments);
+    DESERIAL32(outliers);
+    
+    DESERIAL32(type_size);
+    DESERIAL32(diff_size);
+    DESERIAL32(length_size);
+    DESERIAL32(dy_size);
+    DESERIAL32(dx_size);
+    DESERIAL32(a_size);
+    DESERIAL32(outlier_size);
+    
+    DESERIAL64(min_diff);
+    DESERIAL64(min_length);
+    DESERIAL64(min_dy);
+    DESERIAL64(min_dx);
+    DESERIAL64(min_a);
+    DESERIAL64(min_outlier);
+    
+    if (FLAG_TYPE(y->u.izipped) != DATA_ABSENT && FLAG_TYPE(y->u.izipped) != DATA_CONSTANT) {
+        if (i + y->u.izipped.type_size > n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+        y->u.izipped.type = &src[i]; i += y->u.izipped.type_size;
+    }
+    
+    if (FLAG_DIFF(y->u.izipped) != DATA_ABSENT && FLAG_DIFF(y->u.izipped) != DATA_CONSTANT) {
+        if (i + y->u.izipped.diff_size > n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+        y->u.izipped.diff = &src[i]; i += y->u.izipped.diff_size;
+    }
+    
+    if (FLAG_LENGTH(y->u.izipped) != DATA_ABSENT && FLAG_LENGTH(y->u.izipped) != DATA_CONSTANT) {
+        if (i + y->u.izipped.length_size > n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+        y->u.izipped.length = &src[i]; i += y->u.izipped.length_size;
+    }
+    
+    if (FLAG_DY(y->u.izipped) != DATA_ABSENT && FLAG_DY(y->u.izipped) != DATA_CONSTANT) {
+        if (i + y->u.izipped.dy_size > n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+        y->u.izipped.dy = &src[i]; i += y->u.izipped.dy_size;
+    }
+    
+    if (FLAG_DX(y->u.izipped) != DATA_ABSENT && FLAG_DX(y->u.izipped) != DATA_CONSTANT) {
+        if (i + y->u.izipped.dx_size > n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+        y->u.izipped.dx = &src[i]; i += y->u.izipped.dx_size;
+    }
+    
+    if (FLAG_A(y->u.izipped) != DATA_ABSENT && FLAG_A(y->u.izipped) != DATA_CONSTANT) {
+        if (i + y->u.izipped.a_size > n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+        y->u.izipped.a = &src[i]; i += y->u.izipped.a_size;
+    }
+    
+    if (FLAG_OUTLIER(y->u.izipped) != DATA_ABSENT && FLAG_OUTLIER(y->u.izipped) != DATA_CONSTANT) {
+        if (i + y->u.izipped.outlier_size > n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+        y->u.izipped.outlier = &src[i];
+        /* i += y->u.izipped.outlier_size; */
+    }
+    
+    return 0;
+}
+
+#define BITS_TO_VARIANT(X, BITS) do { switch(BITS) { case 8: (X)->var = 4; break; case 16: (X)->var = 3; break; case 32: (X)->var = 2; break; case 64: (X)->var = 1; break; default: return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid); } } while (0);
+
+static rc_t decode_encoded(struct decoded *y, const struct encoded *x) {
+    unsigned i;
+    unsigned type = x->flags & 0x3;
+    rc_t rc;
+    const uint8_t *src;
+    uint8_t *hsrc;
+    unsigned elem_bits;
+    unsigned n = 0;
+    
+    memset(y, 0, sizeof(*y));
+    y->data_count = x->data_count;
+    y->size_type = (x->flags >> 2) & 3;
+    
+    y->diff = alloc_raw_nbuf(y->data_count);
+    if (y->diff == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    
+    if (type) {
+        if ((type & 1) != 0)  {
+            rc = zlib_decompress(y->diff->data.u8, 8 * y->data_count, &n, x->u.zipped.data, x->u.zipped.data_size );
+            if (rc)
+                return rc;
+            if ((type & 2) != 0)
+                y->diff->min = x->u.packed.min;
+        }
+        else {
+            y->diff->min = x->u.packed.min;
+            memmove(y->diff->data.u8, x->u.packed.data, n = x->u.packed.data_size);
+        }
+        elem_bits = n * 8 / x->data_count;
+        if (elem_bits * x->data_count / 8 != n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+        BITS_TO_VARIANT(y->diff, elem_bits);
+        if (type == 1 && 4 - y->diff->var != y->size_type) {
+#if _DEBUGGING
+            fprintf(stderr, "decode_encoded: var = %i, size_type = %u\n", (int)y->diff->var, (unsigned)y->size_type);
+#endif
+            return RC(rcXF, rcFunction, rcExecuting, rcRange, rcExcessive);
+        }
+        y->diff->used = x->data_count;
+        return 0;
+    }
+    
+    y->type = malloc(x->u.izipped.segments);
+    if (y->type == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    
+    if (x->u.izipped.outliers) {
+        hsrc = NULL;
+        
+        if (FLAG_TYPE(x->u.izipped) == DATA_ZIPPED) {
+            hsrc = malloc(x->u.izipped.segments);
+            if (hsrc == NULL)
+                return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            rc = zlib_decompress(hsrc, x->u.izipped.segments, &i, x->u.izipped.type, x->u.izipped.type_size);
+            if (rc) {
+                free(hsrc);
+                return rc;
+            }
+            src = hsrc;
+        }
+        else
+            src = x->u.izipped.type;
+        decode_types(y->type, x->u.izipped.segments, src);
+        if (hsrc) free(hsrc);
+        for (n = i = 0; i != x->u.izipped.segments; ++i) {
+            if (y->type[i])
+                ++n;
+        }
+        y->lines = x->u.izipped.segments - n;
+        y->outliers = n;
+    }
+    else {
+        memset(y->type, 0, x->u.izipped.segments);
+        y->lines = x->u.izipped.segments;
+        y->outliers = 0;
+    }
+    
+    y->diff->min = x->u.izipped.min_diff;
+    if (FLAG_DIFF(x->u.izipped) == DATA_CONSTANT) {
+        y->diff->used = x->u.izipped.diff_size;
+        memset(y->diff->data.raw, 0, nbuf_size(y->diff));
+    }
+    else {
+        if (FLAG_DIFF(x->u.izipped) == DATA_ZIPPED) {
+            rc = zlib_decompress(y->diff->data.u8, y->diff->size * 8, &n, x->u.izipped.diff, x->u.izipped.diff_size);
+            if (rc)
+                return rc;
+        }
+        else {
+            n = x->u.izipped.diff_size;
+            memmove(y->diff->data.u8, x->u.izipped.diff, n);
+        }
+
+        if ( y->diff->size != 0 )
+            elem_bits = (n * 8) / y->diff->size;
+        else
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+
+        if (elem_bits * y->diff->size / 8 != n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+        BITS_TO_VARIANT(y->diff, elem_bits);
+        y->diff->used = n >> (4 - y->diff->var);
+    }
+    
+    y->length = alloc_nbuf(y->lines + y->outliers, 2);
+    if (y->length == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    
+    y->length->min = x->u.izipped.min_length;
+    if (FLAG_LENGTH(x->u.izipped) == DATA_CONSTANT) {
+        y->length->used = y->lines + y->outliers;
+        memset(y->length->data.raw, 0, nbuf_size(y->length));
+    }
+    else {
+        if (FLAG_LENGTH(x->u.izipped) == DATA_ZIPPED) {
+            rc = zlib_decompress(y->length->data.u8, y->length->size * 4, &n, x->u.izipped.length, x->u.izipped.length_size);
+            if (rc)
+                return rc;
+        }
+        else {
+            n = x->u.izipped.length_size;
+            memmove(y->length->data.u8, x->u.izipped.length, n);
+        }
+        elem_bits = (n * 8) / (y->lines + y->outliers);
+        if (elem_bits * (y->lines + y->outliers) / 8 != n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+        BITS_TO_VARIANT(y->length, elem_bits);
+        y->length->used = n >> (4 - y->length->var);
+    }
+    
+    y->dy = alloc_nbuf(y->lines, 1);
+    if (y->dy == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    
+    y->dy->min = x->u.izipped.min_dy;
+    if (FLAG_DY(x->u.izipped) == DATA_CONSTANT) {
+        y->dy->used = y->lines;
+        memset(y->dy->data.raw, 0, nbuf_size(y->dy));
+    }
+    else {
+        if (FLAG_DY(x->u.izipped) == DATA_ZIPPED) {
+            rc = zlib_decompress(y->dy->data.u8, y->dy->size * 8, &n, x->u.izipped.dy, x->u.izipped.dy_size);
+            if (rc)
+                return rc;
+        }
+        else {
+            n = x->u.izipped.dy_size;
+            memmove(y->dy->data.u8, x->u.izipped.dy, n);
+        }
+        elem_bits = (n * 8) / y->lines;
+        if (elem_bits * y->lines / 8 != n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+        BITS_TO_VARIANT(y->dy, elem_bits);
+        y->dy->used = n >> (4 - y->dy->var);
+    }
+    
+    y->dx = alloc_nbuf(y->lines, 1);
+    if (y->dx == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    
+    y->dx->min = x->u.izipped.min_dx;
+    if (FLAG_DX(x->u.izipped) == DATA_CONSTANT) {
+        y->dx->used = y->lines;
+        memset(y->dx->data.raw, 0, nbuf_size(y->dx));
+    }
+    else {
+        if (FLAG_DX(x->u.izipped) == DATA_ZIPPED) {
+            rc = zlib_decompress(y->dx->data.u8, y->dx->size * 8, &n, x->u.izipped.dx, x->u.izipped.dx_size);
+            if (rc)
+                return rc;
+        }
+        else {
+            n = x->u.izipped.dx_size;
+            memmove(y->dx->data.u8, x->u.izipped.dx, n);
+        }
+        elem_bits = (n * 8) / y->lines;
+        if (elem_bits * y->lines / 8 != n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+        BITS_TO_VARIANT(y->dx, elem_bits);
+        y->dx->used = n >> (4 - y->dx->var);
+    }
+    
+    y->a = alloc_nbuf(y->lines, 1);
+    if (y->a == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    
+    y->a->min = x->u.izipped.min_a;
+    if (FLAG_A(x->u.izipped) == DATA_CONSTANT) {
+        y->a->used = y->lines;
+        memset(y->a->data.raw, 0, nbuf_size(y->a));
+    }
+    else {
+        if (FLAG_A(x->u.izipped) == DATA_ZIPPED) {
+            rc = zlib_decompress(y->a->data.u8, y->a->size * 8, &n, x->u.izipped.a, x->u.izipped.a_size);
+            if (rc)
+                return rc;
+        }
+        else {
+            n = x->u.izipped.a_size;
+            memmove(y->a->data.u8, x->u.izipped.a, n);
+        }
+        elem_bits = (n * 8) / y->lines;
+        if (elem_bits * y->lines / 8 != n)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+        BITS_TO_VARIANT(y->a, elem_bits);
+        y->a->used = n >> (4 - y->a->var);
+    }
+    
+    if (y->outliers) {
+        y->outlier = alloc_nbuf(x->u.izipped.outliers, 1);
+        if (y->outlier == NULL)
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        
+        y->outlier->min = x->u.izipped.min_outlier;
+        if (FLAG_OUTLIER(x->u.izipped) == DATA_CONSTANT) {
+            y->outlier->used = y->outliers;
+            memset(y->outlier->data.raw, 0, nbuf_size(y->outlier));
+        }
+        else {
+            if (FLAG_OUTLIER(x->u.izipped) == DATA_ZIPPED) {
+                rc = zlib_decompress(y->outlier->data.u8, y->outlier->size * 8, &n, x->u.izipped.outlier, x->u.izipped.outlier_size);
+                if (rc)
+                    return rc;
+            }
+            else {
+                n = x->u.izipped.outlier_size;
+                memmove(y->outlier->data.u8, x->u.izipped.outlier, n);
+            }
+            elem_bits = (n * 8) / x->u.izipped.outliers;
+            if (elem_bits * x->u.izipped.outliers / 8 != n)
+                return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+            BITS_TO_VARIANT(y->outlier, elem_bits);
+            y->outlier->used = n >> (4 - y->outlier->var);
+        }
+    }
+    
+    return 0;
+}
+
+#define STYPE uint8_t
+#define DECODE decode_u8
+#include "izip-decode.impl.h"
+#undef STYPE
+#undef DECODE
+
+#define STYPE int8_t
+#define DECODE decode_i8
+#include "izip-decode.impl.h"
+#undef STYPE
+#undef DECODE
+
+#define STYPE uint16_t
+#define DECODE decode_u16
+#include "izip-decode.impl.h"
+#undef STYPE
+#undef DECODE
+
+#define STYPE int16_t
+#define DECODE decode_i16
+#include "izip-decode.impl.h"
+#undef STYPE
+#undef DECODE
+
+#define STYPE uint32_t
+#define DECODE decode_u32
+#include "izip-decode.impl.h"
+#undef STYPE
+#undef DECODE
+
+#define STYPE int32_t
+#define DECODE decode_i32
+#include "izip-decode.impl.h"
+#undef STYPE
+#undef DECODE
+
+#define STYPE uint64_t
+#define DECODE decode_u64
+#include "izip-decode.impl.h"
+#undef STYPE
+#undef DECODE
+
+#define STYPE int64_t
+#define DECODE decode_i64
+#include "izip-decode.impl.h"
+#undef STYPE
+#undef DECODE
+
+typedef rc_t (*decode_f)(void *dst, unsigned dsize, const uint8_t src[], unsigned N, int swap);
+
+static
+decode_f selfs[8] = {
+    (decode_f)decode_u8,
+    (decode_f)decode_i8,
+    (decode_f)decode_u16,
+    (decode_f)decode_i16,
+    (decode_f)decode_u32,
+    (decode_f)decode_i32,
+    (decode_f)decode_u64,
+    (decode_f)decode_i64,
+};
+
+#if 0
+rc_t ex_decode8( void *dst, unsigned dsize, uint8_t *src, unsigned ssize )
+{
+    return selfs[0].f( dst, dsize, src, ssize, 0 );
+}
+
+rc_t ex_decode16( void *dst, unsigned dsize, uint8_t *src, unsigned ssize )
+{
+    return selfs[2].f( dst, dsize, src, ssize, 0 );
+}
+
+rc_t ex_decode32( void *dst, unsigned dsize, uint8_t *src, unsigned ssize )
+{
+    return selfs[4].f( dst, dsize, src, ssize, 0 );
+}
+
+rc_t ex_decode64( void *dst, unsigned dsize, uint8_t *src, unsigned ssize )
+{
+    return selfs[6].f( dst, dsize, src, ssize, 0 );
+}
+#endif
+
+rc_t CC iunzip_func_v0(
+                    void *Self,
+                    const VXformInfo *info,
+                    VBlobResult *dst,
+                    const VBlobData *src
+) {
+    uint32_t ssize;
+    
+    assert(dst->elem_count >> 32 == 0);
+    assert(((src->elem_count * src->elem_bits + 7) >> 3) >> 32 == 0);
+    ssize = (uint32_t)((src->elem_count * src->elem_bits + 7) >> 3);
+    
+    dst->byte_order = vboNative;
+    switch (src->byte_order) {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    case vboBigEndian:
+#else
+    case vboBigEndian:
+#endif
+        return selfs[(uintptr_t)Self](dst->data, (uint32_t)dst->elem_count,
+                       src->data, ssize,
+                       1);
+    default:
+        return selfs[(uintptr_t)Self](dst->data, (uint32_t)dst->elem_count,
+                       src->data, ssize,
+                       0);
+    }
+}
+
+#if 0
+
+static
+rc_t CC iunzip(
+            void *Self,
+            const VXformInfo *info,
+            VBlobResult *dst,
+            const VBlobData *src,
+            VBlobHeader *hdr
+) {
+    switch (VBlobHeaderVersion(hdr)) {
+    case 0:
+        return iunzip_func_v0(Self, info, dst, src);
+    default:
+        return RC(rcVDB, rcFunction, rcExecuting, rcParam, rcBadVersion);
+    }
+}
+
+/* 
+ function izip_set iunzip #1.0 ( izip_fmt in )
+ */
+VTRANSFACT_IMPL(vdb_iunzip, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftBlob;
+    rslt->u.bf = iunzip;
+    
+    switch (info->fdesc.desc.domain) {
+    case vtdInt:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+            rslt->self = (void *)1;
+            break;
+        case 16:
+            rslt->self = (void *)3;
+            break;
+        case 32:
+            rslt->self = (void *)5;
+            break;
+        case 64:
+            rslt->self = (void *)7;
+            break;
+        default:
+#if _DEBUGGING
+            fprintf(stderr, "intrinsic_bits = %u != (8|16|32|64)\n", info->fdesc.desc.intrinsic_bits);
+#endif
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            break;
+        }
+        break;
+    case vtdUint:
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+            rslt->self = (void *)0;
+            break;
+        case 16:
+            rslt->self = (void *)2;
+            break;
+        case 32:
+            rslt->self = (void *)4;
+            break;
+        case 64:
+            rslt->self = (void *)6;
+            break;
+        default:
+#if _DEBUGGING
+            fprintf(stderr, "intrinsic_bits = %u != (8|16|32|64)\n", info->fdesc.desc.intrinsic_bits);
+#endif
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            break;
+        }
+        break;
+    default:
+#if _DEBUGGING
+        fprintf(stderr, "domain != vtdInt or vtdUint\n");
+#endif
+        return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+    }
+    return 0;
+}
+#endif
+
+#if TESTING
+int test_decode(int32_t *dst, unsigned dsize, const uint8_t *src, unsigned ssize, int swap) {
+    return decode_i32(dst, dsize, src, ssize, 0);
+}
+#endif
diff --git a/libs/vxf/izip-common.h b/libs/vxf/izip-common.h
new file mode 100644
index 0000000..c6dc84c
--- /dev/null
+++ b/libs/vxf/izip-common.h
@@ -0,0 +1,195 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct {
+    unsigned size;
+    unsigned used;
+    int64_t min;
+    int64_t max;
+    unsigned var;
+    union {
+        int64_t  raw[1];
+        uint64_t u64[1];
+        uint32_t u32[2];
+        uint16_t u16[4];
+        uint8_t  u8[8];
+    } data;
+} nbuf;
+
+#define nbuf_get(X, I) (((const nbuf *)X)->var == 4 ? ((const nbuf *)X)->data.u8[(I)] : (((const nbuf *)X)->var == 3 ? ((const nbuf *)X)->data.u16[(I)] : (((const nbuf *)X)->var == 2 ? ((const nbuf *)X)->data.u32[(I)] : ((const nbuf *)X)->data.u64[(I)])))
+
+static unsigned nbuf_size(const nbuf *x) {
+    size_t y;
+    
+    switch (x->var) {
+    default:
+        y = sizeof(x->data.raw[0]) * x->used;
+        break;
+    case 1:
+        y = sizeof(x->data.u64[0]) * x->used;
+        break;
+    case 2:
+        y = sizeof(x->data.u32[0]) * x->used;
+        break;
+    case 3:
+        y = sizeof(x->data.u16[0]) * x->used;
+        break;
+    case 4:
+        y = sizeof(x->data.u8[0]) * x->used;
+        break;
+    }
+    assert(y <= UINT32_MAX);
+    return (unsigned)y;
+}
+
+static nbuf *alloc_nbuf(unsigned cnt, unsigned var) {
+    nbuf *rslt;
+    
+    rslt = malloc(sizeof(*rslt) - sizeof(rslt->data) + cnt * sizeof(rslt->data.raw[0]));
+    if ( rslt != NULL ) {
+        memset(rslt, 0, sizeof(*rslt) - sizeof(rslt->data));
+        rslt->size = cnt;
+        rslt->used = 0;
+        rslt->var = var;
+    }
+    return rslt;
+}
+
+static nbuf *alloc_raw_nbuf(unsigned cnt) {
+    return alloc_nbuf(cnt, 0);
+}
+
+struct decoded {
+    unsigned data_count;
+    unsigned lines;
+    unsigned outliers;
+    unsigned size_type;
+    
+    nbuf *diff;      /* diff[data_count] */
+    uint8_t *type;   /* type[lines + outliers] */
+    nbuf *length;    /* length[lines + outliers]  */
+    nbuf *dy;        /* dy[lines] */
+    nbuf *dx;        /* dx[lines] */
+    nbuf *a;         /* a[lines] */
+    nbuf *outlier;   /* outlier[outliers] */
+};
+
+#define DATA_CONSTANT (1)
+#define DATA_ZIPPED (2)
+#define DATA_ABSENT (3)
+
+#define FLAG_BITS (4)
+#define FLAG_MASK ((1 << FLAG_BITS) - 1)
+
+#define FLAG_BITS_TYPE      (0)
+#define FLAG_BITS_DIFF      (FLAG_BITS + FLAG_BITS_TYPE)
+#define FLAG_BITS_LENGTH    (FLAG_BITS + FLAG_BITS_DIFF)
+#define FLAG_BITS_DY        (FLAG_BITS + FLAG_BITS_LENGTH)
+#define FLAG_BITS_DX        (FLAG_BITS + FLAG_BITS_DY)
+#define FLAG_BITS_A         (FLAG_BITS + FLAG_BITS_DX)
+#define FLAG_BITS_OUTLIER   (FLAG_BITS + FLAG_BITS_A)
+
+#define SET_TYPE_ABSENT(FLAGS)      ((FLAGS).data_flags) |= (DATA_ABSENT << FLAG_BITS_TYPE)
+#define SET_DIFF_ABSENT(FLAGS)      ((FLAGS).data_flags) |= (DATA_ABSENT << FLAG_BITS_DIFF)
+#define SET_LENGTH_ABSENT(FLAGS)    ((FLAGS).data_flags) |= (DATA_ABSENT << FLAG_BITS_LENGTH)
+#define SET_DY_ABSENT(FLAGS)        ((FLAGS).data_flags) |= (DATA_ABSENT << FLAG_BITS_DY)
+#define SET_DX_ABSENT(FLAGS)        ((FLAGS).data_flags) |= (DATA_ABSENT << FLAG_BITS_DX)
+#define SET_A_ABSENT(FLAGS)         ((FLAGS).data_flags) |= (DATA_ABSENT << FLAG_BITS_A)
+#define SET_OUTLIER_ABSENT(FLAGS)   ((FLAGS).data_flags) |= (DATA_ABSENT << FLAG_BITS_OUTLIER)
+
+#define SET_TYPE_CONSTANT(FLAGS)    ((FLAGS).data_flags) |= (DATA_CONSTANT << FLAG_BITS_TYPE)
+#define SET_DIFF_CONSTANT(FLAGS)    ((FLAGS).data_flags) |= (DATA_CONSTANT << FLAG_BITS_DIFF)
+#define SET_LENGTH_CONSTANT(FLAGS)  ((FLAGS).data_flags) |= (DATA_CONSTANT << FLAG_BITS_LENGTH)
+#define SET_DY_CONSTANT(FLAGS)      ((FLAGS).data_flags) |= (DATA_CONSTANT << FLAG_BITS_DY)
+#define SET_DX_CONSTANT(FLAGS)      ((FLAGS).data_flags) |= (DATA_CONSTANT << FLAG_BITS_DX)
+#define SET_A_CONSTANT(FLAGS)       ((FLAGS).data_flags) |= (DATA_CONSTANT << FLAG_BITS_A)
+#define SET_OUTLIER_CONSTANT(FLAGS) ((FLAGS).data_flags) |= (DATA_CONSTANT << FLAG_BITS_OUTLIER)
+
+#define SET_TYPE_ZIPPED(FLAGS)      ((FLAGS).data_flags) |= (DATA_ZIPPED << FLAG_BITS_TYPE)
+#define SET_DIFF_ZIPPED(FLAGS)      ((FLAGS).data_flags) |= (DATA_ZIPPED << FLAG_BITS_DIFF)
+#define SET_LENGTH_ZIPPED(FLAGS)    ((FLAGS).data_flags) |= (DATA_ZIPPED << FLAG_BITS_LENGTH)
+#define SET_DY_ZIPPED(FLAGS)        ((FLAGS).data_flags) |= (DATA_ZIPPED << FLAG_BITS_DY)
+#define SET_DX_ZIPPED(FLAGS)        ((FLAGS).data_flags) |= (DATA_ZIPPED << FLAG_BITS_DX)
+#define SET_A_ZIPPED(FLAGS)         ((FLAGS).data_flags) |= (DATA_ZIPPED << FLAG_BITS_A)
+#define SET_OUTLIER_ZIPPED(FLAGS)   ((FLAGS).data_flags) |= (DATA_ZIPPED << FLAG_BITS_OUTLIER)
+
+#define FLAG_TYPE(O)                ((((O).data_flags) >> FLAG_BITS_TYPE   ) & FLAG_MASK)
+#define FLAG_DIFF(O)                ((((O).data_flags) >> FLAG_BITS_DIFF   ) & FLAG_MASK)
+#define FLAG_LENGTH(O)              ((((O).data_flags) >> FLAG_BITS_LENGTH ) & FLAG_MASK)
+#define FLAG_DY(O)                  ((((O).data_flags) >> FLAG_BITS_DY     ) & FLAG_MASK)
+#define FLAG_DX(O)                  ((((O).data_flags) >> FLAG_BITS_DX     ) & FLAG_MASK)
+#define FLAG_A(O)                   ((((O).data_flags) >> FLAG_BITS_A      ) & FLAG_MASK)
+#define FLAG_OUTLIER(O)             ((((O).data_flags) >> FLAG_BITS_OUTLIER) & FLAG_MASK)
+
+struct encoded {
+    uint8_t flags;   /* 0x1: zipped, 0x2: packed, 0x3: packed+zipped, 0x0: izipped */
+    uint32_t data_count;
+    union {
+        struct {
+            uint32_t data_size;
+            const uint8_t *data;
+        } zipped;
+        struct {
+            uint32_t data_size;
+            const uint8_t *data;
+            int64_t min;
+        } packed;
+        struct {
+            uint32_t data_flags;
+            uint32_t segments;
+            uint32_t outliers;
+            uint32_t type_size;
+            uint32_t diff_size;
+            uint32_t length_size;
+            uint32_t dy_size;
+            uint32_t dx_size;
+            uint32_t a_size;
+            uint32_t outlier_size;
+            
+            int64_t min_diff;
+            int64_t min_length;
+            int64_t min_dy;
+            int64_t min_dx;
+            int64_t min_a;
+            int64_t min_outlier;
+            
+            const uint8_t *type;
+            const uint8_t *diff;
+            const uint8_t *length;
+            const uint8_t *dy;
+            const uint8_t *dx;
+            const uint8_t *a;
+            const uint8_t *outlier;
+        } izipped;
+    } u;
+};
+
+#if 1
+#define DEBUG_PRINT(fmt, ...) { do { } while(0); }
+#else
+#define DEBUG_PRINT(fmt, ...) fprintf(stderr, "%s - " fmt "\n", __func__, __VA_ARGS__)
+#endif
+
diff --git a/libs/vxf/izip-decode.impl.h b/libs/vxf/izip-decode.impl.h
new file mode 100644
index 0000000..d6f88f8
--- /dev/null
+++ b/libs/vxf/izip-decode.impl.h
@@ -0,0 +1,162 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+static
+rc_t DECODE(STYPE Y[], unsigned N, const uint8_t src[], unsigned ssize, int swap) {
+    rc_t rc;
+    struct encoded encoded;
+    struct decoded decoded;
+    unsigned i;
+    unsigned j;
+    unsigned k;
+    unsigned u;
+    unsigned v;
+    
+    rc = deserialize_encoded(&encoded, src, ssize, swap);
+    if (rc)
+        return rc;
+    rc = decode_encoded(&decoded, &encoded);
+    if (rc == 0) {
+        if (decoded.diff->used != N)
+            return RC(rcXF, rcFunction, rcExecuting, rcData, rcInvalid);
+        
+        if ((encoded.flags & 3) == 0) {
+            if (N == 121)
+                DEBUG_PRINT("decompressing izip", 0);
+            if (swap) {
+                unpack_nbuf_swap(decoded.diff);
+                unpack_nbuf_swap(decoded.length);
+                unpack_nbuf_swap(decoded.dy);
+                unpack_nbuf_swap(decoded.dx);
+                unpack_nbuf_swap(decoded.a);
+                if (decoded.outlier)
+                    unpack_nbuf_swap(decoded.outlier);
+            }
+            else {
+                unpack_nbuf(decoded.diff);
+                unpack_nbuf(decoded.length);
+                unpack_nbuf(decoded.dy);
+                unpack_nbuf(decoded.dx);
+                unpack_nbuf(decoded.a);
+                if (decoded.outlier)
+                    unpack_nbuf(decoded.outlier);
+            }
+
+            if (N == 121) {
+                for (i = 0; i != decoded.diff->used; ++i) {
+                    DEBUG_PRINT("  %i - diff: %lli", i, decoded.diff->data.raw[i]);
+                }
+            }
+            
+            for (u = v = k = i = 0; i != decoded.lines + decoded.outliers; ++i) {
+                unsigned n = (unsigned)decoded.length->data.raw[i];
+                
+                if (decoded.type[i]) {
+                    if (N == 121)
+                        DEBUG_PRINT("extracting stored segment %u; length: %u", i, n);
+                    for (j = 0; j != n; ++j, ++k, ++v)
+                        Y[k] = (STYPE)( decoded.outlier->data.raw[v] );
+                }
+                else {
+                    const double m = decoded.dy->data.raw[u] / (double)decoded.dx->data.raw[u];
+                    
+                    if (N == 121)
+                        DEBUG_PRINT("extracting line segment %u; length: %u; dy: %lli; dx: %lli; a: %lli", i, n, decoded.dy->data.raw[u], decoded.dx->data.raw[u], decoded.a->data.raw[u]);
+                    for (j = 0; j != n; ++j, ++k) {
+                        Y[k] = (STYPE)( decoded.diff->data.raw[k] + (STYPE)(decoded.a->data.raw[u] + j * m) );
+                        if (N == 121)
+                            DEBUG_PRINT("    %u: %i", k, (int)Y[k]);
+                    }
+                    ++u;
+                }
+            }
+        }
+        else if ((encoded.flags & 2) != 0) {
+            if ((((size_t)1) << decoded.size_type) > sizeof(Y[0])) {
+#if _DEBUGGING
+                fprintf(stderr, "iunzip: refusing to decode from original element size of %u to %u\n", (unsigned)(((size_t)1) << decoded.size_type), (unsigned)sizeof(Y[0]));
+#endif
+                return RC(rcXF, rcFunction, rcExecuting, rcRange, rcExcessive);
+            }
+            switch (decoded.diff->var) {
+            case 4:
+                for (i = 0; i != decoded.diff->used; ++i)
+                    Y[i] = (int32_t)( decoded.diff->data.u8[i] + decoded.diff->min );
+                break;
+            case 3:
+                for (i = 0; i != decoded.diff->used; ++i)
+                    Y[i] = (int32_t)( decoded.diff->data.u16[i] + decoded.diff->min );
+                break;
+            case 2:
+                for (i = 0; i != decoded.diff->used; ++i)
+                    Y[i] = (int32_t)( decoded.diff->data.u32[i] + decoded.diff->min );
+                break;
+            case 1:
+            default:
+                for (i = 0; i != decoded.diff->used; ++i)
+                    Y[i] = (int32_t)( decoded.diff->data.u64[i] + decoded.diff->min );
+                break;
+            }
+        }
+        else {
+            if ((((size_t)1) << decoded.size_type) > sizeof(Y[0])) {
+#if _DEBUGGING
+                fprintf(stderr, "iunzip: refusing to decode from original element size of %u to %u\n", (unsigned)(((size_t)1) << decoded.size_type), (unsigned)sizeof(Y[0]));
+#endif
+                return RC(rcXF, rcFunction, rcExecuting, rcRange, rcExcessive);
+            }
+            
+            switch (decoded.diff->var) {
+            case 4:
+                for (i = 0; i != decoded.diff->used; ++i)
+                    Y[i] = (int32_t)decoded.diff->data.u8[i];
+                break;
+            case 3:
+                for (i = 0; i != decoded.diff->used; ++i)
+                    Y[i] = (int32_t)decoded.diff->data.u16[i];
+                break;
+            case 2:
+                for (i = 0; i != decoded.diff->used; ++i)
+                    Y[i] = (int32_t)decoded.diff->data.u32[i];
+                break;
+            case 1:
+            default:
+                for (i = 0; i != decoded.diff->used; ++i)
+                    Y[i] = (int32_t)decoded.diff->data.u64[i];
+                break;
+            }
+        }
+    }
+    if (decoded.diff)   free(decoded.diff);
+    if (decoded.type)   free(decoded.type);
+    if (decoded.length) free(decoded.length);
+    if (decoded.dy)     free(decoded.dy);
+    if (decoded.dx)     free(decoded.dx);
+    if (decoded.a)      free(decoded.a);
+    if (decoded.outlier) free(decoded.outlier);
+    
+    return rc;
+}
diff --git a/libs/vxf/izip-encode.impl.h b/libs/vxf/izip-encode.impl.h
new file mode 100644
index 0000000..ef23619
--- /dev/null
+++ b/libs/vxf/izip-encode.impl.h
@@ -0,0 +1,523 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+static int ANALYZE(stats_t stats[], const unsigned scnt, unsigned *fcnt, const STYPE Y[], const unsigned dcnt, STYPE *MIN, STYPE *MAX) {
+    stats_t **base;
+    unsigned i;
+    unsigned k;
+    unsigned n = (dcnt + scnt - 1) / scnt;
+    int loops;
+    unsigned split;
+    unsigned merged = 0;
+    STYPE min = Y[0];
+    STYPE max = Y[0];
+    
+    memset(stats, 0, sizeof(stats[0]));
+    
+    for (i = 0, k = 0; i != dcnt; ++i) {
+        if (min > Y[i])
+            min = Y[i];
+        if (max < Y[i])
+            max = Y[i];
+        
+        stats[k].sy  += (double_t)Y[i];
+        stats[k].syy += (double_t)Y[i] * Y[i];
+        stats[k].sxy += (double_t)Y[i] * i;
+        
+        stats[k].sx  += (double_t)i;
+        stats[k].sxx += (double_t)i * i;
+        
+        ++stats[k].n;
+        if (stats[k].n != n)
+            continue;
+        
+        stats[k].fit = fitness( stats + k );
+        ++k;
+        if (k == scnt)
+            break;
+        memset(stats + k, 0, sizeof(stats[0]));
+        stats[k].x = i + 1;
+    }
+    n = k;
+    if (k != scnt && stats[k].n) {
+        stats[k].fit = fitness( stats + k );
+        ++n;
+    }
+    
+    *MIN = min;
+    *MAX = max;
+    
+    if (n == 1) {
+        *fcnt = 1;
+        return 0;
+    }
+    for (k = 0, i = 1; i != n; ++i) {
+        stats_t temp;
+        
+        merge(&temp, &stats[k], &stats[i]);
+        if (temp.fit >= stats[k].fit) {
+            stats[k] = temp;
+        }
+        else {
+            stats[++k] = stats[i];
+        }
+    }
+    n = k + 1;
+    
+    if (n == 1) {
+        *fcnt = 1;
+        return 0;
+    }
+    
+    base = malloc(scnt * sizeof(base[0]));
+    if (base == NULL)
+        return 1;
+    
+    for (loops = dcnt; loops > 0; loops >>= 1) {
+        for (i = 0, k = 0; i != n; ++i) {
+            assert(stats[i].x == k);
+            k += stats[i].n;
+            base[i] = &stats[i];
+            stats[i].i = i;
+        }
+        assert( k == dcnt );
+        ksort( base, n, sizeof(base[0]), comp_fitness, NULL );
+        if (n < scnt) {
+            for (i = 0, split = 0; i != n && n + split != scnt; ++i) {
+                stats_t R;
+                stats_t L = *base[i];
+                unsigned u = L.n / 2;
+                unsigned j;
+                
+                if (u == 0)
+                    continue;
+                
+                memset(&R, 0, sizeof(R));
+                                
+                R.x = L.x + L.n - u;
+                R.n = u;
+                u = L.x + L.n;
+                for (j = R.x; j != u; ++j) {
+                    R.sx  += j;
+                    R.sxx += (double_t)j * j;
+                    R.sy  += Y[j];
+                    R.syy += (double_t)Y[j] * Y[j];
+                    R.sxy += (double_t)Y[j] * j;
+                }
+                L.sx  -= R.sx;
+                L.sxx -= R.sxx;
+                L.sy  -= R.sy;
+                L.syy -= R.syy;
+                L.sxy -= R.sxy;
+                assert(L.n > R.n);
+                L.n   -= R.n;
+                
+                L.fit = fitness( &L );
+                R.fit = fitness( &R );
+                
+                if (L.n == 1 || R.n == 1 || L.fit > base[i]->fit || R.fit > base[i]->fit) {
+                    assert(L.x + L.n == R.x);
+                    assert(L.n + R.n == stats[L.i].n);
+                    L.i = R.i = dcnt; /* invalid value */
+                    *base[i] = L;
+                    stats[n + split] = R;
+                    ++split;
+                }
+            }
+            if (split) {
+                n += split;
+                ksort( stats, n, sizeof(stats[0]), comp_position, NULL );
+                continue;
+            }
+        }
+        
+        merged = 0;
+        for (i = n; i; ) {
+            stats_t temp;
+            unsigned j;
+            
+            --i;
+            j = base[i]->i;
+            
+            if (j == n - 1 || stats[j].n == 0 || stats[j + 1].n == 0)
+                continue;
+            
+            merge(&temp, stats + j, stats + j + 1);
+            if (temp.n > 2 && temp.fit >= stats[j].fit) {
+                stats[j] = temp;
+                stats[j + 1].n = 0;
+                stats[j + 1].x = dcnt;
+                ++merged;
+            }
+        }
+        if (merged == 0)
+            break;
+        
+        for (k = 0, i = 1; i < n; ++i) {
+            if (stats[i].n)
+                stats[++k] = stats[i];
+        }
+        assert(k + 1 == n - merged);
+        n -= merged;
+    }
+    
+    *fcnt = n;
+    free(base);
+    return 0;
+}
+
+#ifndef ABS
+#define ABS(X) ((uint64_t)(X >= 0 ? (X) : (-(X))))
+#endif
+
+static
+rc_t ENCODE(uint8_t *dst, unsigned dsize, unsigned *psize, const STYPE Y[], unsigned N, int DUMP) {
+    stats_t *stats = 0;
+    unsigned m = (N + CHUNK_SIZE - 1) / CHUNK_SIZE;
+    unsigned n;
+    rc_t rc = 0;
+    unsigned i;
+    unsigned j;
+    unsigned k;
+    unsigned u;
+    unsigned v;
+    STYPE min = 0;
+    STYPE max = 0;
+    unsigned pack_size = 0;
+    szbuf zipped;
+    struct decoded decoded;
+    struct encoded encoded;
+    /*int debugging = 0;*/
+
+    if (psize)
+        *psize = 0;
+    memset(&decoded, 0, sizeof(decoded));
+
+    do {
+        stats = malloc(m * sizeof(stats[0]));
+        if (stats == NULL) {
+            rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            break;
+        }
+        rc = ANALYZE(stats, m, &n, Y, N, &min, &max);
+        if (rc) {
+            rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            break;
+        }
+        
+        if ((ABS(min) >> 8) == 0 && (ABS(max) >> 8) == 0) {
+            decoded.size_type = 0;
+            pack_size = N;
+        }
+        else if ((ABS(min) >> 16) == 0 && (ABS(max) >> 16) == 0) {
+            decoded.size_type = 1;
+            pack_size = N * 2;
+        }
+        else if ((ABS(min) >> 32) == 0 && (ABS(max) >> 32) == 0) {
+            decoded.size_type = 2;
+            pack_size = N * 4;
+        }
+        else {
+            decoded.size_type = 3;
+            pack_size = N * 8;
+        }
+        
+        decoded.diff = alloc_raw_nbuf(N);
+        if (decoded.diff == NULL) {
+            rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            break;
+        }
+        decoded.outlier = alloc_raw_nbuf(N);
+        if (decoded.outlier == NULL) {
+            rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            break;
+        }
+        decoded.type = malloc(n);
+        if (decoded.type == NULL) {
+            rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            break;
+        }
+        decoded.length = alloc_raw_nbuf(n);
+        if (decoded.length == NULL) {
+            rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            break;
+        }
+
+        for (v = u = k = i = 0; i != n; ++i) {
+            decoded.length->data.raw[i] = stats[i].n;
+            if (stats[i].n >= OUTLIER_LIMIT) {
+                double_t M;
+                int64_t dy;
+                int64_t dx;
+                int64_t a;
+                
+                ++v;
+                regress_params(stats + i, &dy, &dx, &a);
+                M = dy / (double_t)dx;
+                for (j = 0; j != stats[i].n; ++j, ++k) {
+                    decoded.diff->data.raw[k] = Y[k] - (STYPE)(M * j + a);
+                    if (decoded.diff->min > decoded.diff->data.raw[k] || k == 0)
+                        decoded.diff->min = decoded.diff->data.raw[k];
+                    if (decoded.diff->max < decoded.diff->data.raw[k] || k == 0)
+                        decoded.diff->max = decoded.diff->data.raw[k];
+                }
+                decoded.type[i] = 0;
+            }
+            else {
+                for (j = 0; j != stats[i].n; ++j, ++k, ++u) {
+                    decoded.diff->data.raw[k] = 0;
+                    if (decoded.diff->min > 0 || k == 0)
+                        decoded.diff->min = 0;
+                    if (decoded.diff->max < 0 || k == 0)
+                        decoded.diff->max = 0;
+                    decoded.outlier->data.raw[u] = Y[k];
+                    if (decoded.outlier->min > decoded.outlier->data.raw[u] || u == 0)
+                        decoded.outlier->min = decoded.outlier->data.raw[u];
+                    if (decoded.outlier->max < decoded.outlier->data.raw[u] || u == 0)
+                        decoded.outlier->max = decoded.outlier->data.raw[u];
+                }
+                ++decoded.outliers;
+                decoded.type[i] = 1;
+            }
+        }
+        decoded.length->used = n;
+        decoded.outlier->used = u;
+        decoded.diff->used = k;
+
+        decoded.dy = alloc_raw_nbuf(v);
+        if (decoded.dy == NULL) {
+            rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            break;
+        }
+        decoded.dx = alloc_raw_nbuf(v);
+        if (decoded.dx == NULL) {
+            rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            break;
+        }
+        decoded.a = alloc_raw_nbuf(v);
+        if (decoded.a == NULL) {
+            rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            break;
+        }
+        for (u = i = 0; i < n; ++i) {
+            if (decoded.type[i] == 0) {
+                regress_params(stats + i, decoded.dy->data.raw + u, decoded.dx->data.raw + u, decoded.a->data.raw + u);
+                if (u == 0) {
+                    decoded.dy->min = decoded.dy->data.raw[u];
+                    decoded.dy->max = decoded.dy->data.raw[u];
+                    decoded.dx->min = decoded.dx->data.raw[u];
+                    decoded.dx->max = decoded.dx->data.raw[u];
+                    decoded.a->min = decoded.a->data.raw[u];
+                    decoded.a->max = decoded.a->data.raw[u];
+                }
+                else {
+                    if (decoded.dy->min > decoded.dy->data.raw[u])
+                        decoded.dy->min = decoded.dy->data.raw[u];
+                    if (decoded.dy->max < decoded.dy->data.raw[u])
+                        decoded.dy->max = decoded.dy->data.raw[u];
+                    if (decoded.dx->min > decoded.dx->data.raw[u])
+                        decoded.dx->min = decoded.dx->data.raw[u];
+                    if (decoded.dx->max < decoded.dx->data.raw[u])
+                        decoded.dx->max = decoded.dx->data.raw[u];
+                    if (decoded.a->min > decoded.a->data.raw[u])
+                        decoded.a->min = decoded.a->data.raw[u];
+                    if (decoded.a->max < decoded.a->data.raw[u])
+                        decoded.a->max = decoded.a->data.raw[u];
+                }
+                ++u;            
+            }
+        }
+        decoded.data_count = N;
+        decoded.lines = decoded.dy->used = decoded.dx->used = decoded.a->used = u;
+        
+        free(stats); stats = NULL;
+        
+        for (u = k = 0, i = 1; i < n; ++i) {
+            if (decoded.type[i] == 1 && decoded.type[k] == 1) {
+                --decoded.length->used;
+                --decoded.outliers;
+                decoded.length->data.raw[k] += decoded.length->data.raw[i];
+            }
+            else {
+                ++k;
+                if (k != i) {
+                    decoded.type[k] = decoded.type[i];
+                    decoded.length->data.raw[k] = decoded.length->data.raw[i];
+                }
+            }
+        }
+        for (i = 0; i != decoded.length->used; ++i) {
+            if (decoded.length->min > decoded.length->data.raw[i] || i == 0)
+                decoded.length->min = decoded.length->data.raw[i];
+            if (decoded.length->max < decoded.length->data.raw[i] || i == 0)
+                decoded.length->max = decoded.length->data.raw[i];
+        }
+        if (DUMP) {
+            if (N == 121) {
+                DEBUG_PRINT("Y:", 0);
+                for (i = 0; i != N; ++i)
+                    DEBUG_PRINT("    %u: %i, diff: %lli", i, (int)Y[i], decoded.diff->data.raw[i]);
+
+                DEBUG_PRINT("%u elements, %u stored, %u lines", N, decoded.outliers, decoded.lines);
+                for (i = 0; i != decoded.lines; ++i) {
+                    DEBUG_PRINT("line %u: dy: %lli; dx: %lli; a: %lli", i, decoded.dy->data.raw[i], decoded.dx->data.raw[i], decoded.a->data.raw[i]);
+                }
+            }
+            if (decoded.diff)   free(decoded.diff);
+            if (decoded.type)   free(decoded.type);
+            if (decoded.length) free(decoded.length);
+            if (decoded.dy)     free(decoded.dy);
+            if (decoded.dx)     free(decoded.dx);
+            if (decoded.a)      free(decoded.a);
+            if (decoded.outlier) free(decoded.outlier);
+                            
+            if (stats)  free(stats);
+            return 0;
+        }
+        pack_nbuf(decoded.diff);
+        pack_nbuf(decoded.length);
+        pack_nbuf(decoded.dy);
+        pack_nbuf(decoded.dx);
+        pack_nbuf(decoded.a);
+        pack_nbuf(decoded.outlier);
+        
+        rc = encode_decoded(&encoded, &decoded);
+        if (rc == 0) {
+            unsigned act_size;
+            
+            rc = serialize_encoded(dst, dsize, &act_size, &encoded);
+            /* DEBUG_PRINT("izip compress to %u bytes", act_size); */
+            if (psize)
+                *psize = act_size;
+            free_encoded(&encoded);
+        }
+    } while (0);
+    
+    if (decoded.diff)   free(decoded.diff);
+    if (decoded.type)   free(decoded.type);
+    if (decoded.length) free(decoded.length);
+    if (decoded.dy)     free(decoded.dy);
+    if (decoded.dx)     free(decoded.dx);
+    if (decoded.a)      free(decoded.a);
+    if (decoded.outlier) free(decoded.outlier);
+                            
+    if (stats)  free(stats);
+    
+    if (*psize && pack_size && (pack_size + 13) < *psize) {
+        decoded.diff = alloc_raw_nbuf(N);
+        if (decoded.diff) {
+            decoded.diff->max = max;
+            decoded.diff->min = min;
+            decoded.diff->used = N;
+            
+            switch (decoded.size_type) {
+            case 0:
+                decoded.diff->var = 4;
+                for (i = 0; i != N; ++i)
+                    decoded.diff->data.u8[i] = (uint8_t)( Y[i] - min );
+                break;
+            case 1:
+                decoded.diff->var = 3;
+                for (i = 0; i != N; ++i)
+                    decoded.diff->data.u16[i] = (uint16_t)( Y[i] - min );
+                break;
+            case 2:
+                decoded.diff->var = 2;
+                for (i = 0; i != N; ++i)
+                    decoded.diff->data.u32[i] = (uint32_t)( Y[i] - min );
+                break;
+            default:
+                decoded.diff->var = 1;
+                for (i = 0; i != N; ++i)
+                    decoded.diff->data.u64[i] = Y[i] - min;
+                break;
+            }
+            zipped.buf = malloc(zipped.size = nbuf_size(decoded.diff));
+
+            if (zipped.buf) {
+                rc_t rc2 = zlib_compress(&zipped, decoded.diff->data.u8, zipped.size, Z_DEFAULT_STRATEGY, Z_BEST_SPEED);
+                if (rc2 == 0 && zipped.used > 0) {
+                    encoded.flags = (decoded.size_type << 2) | 3;
+                    encoded.data_count = N;
+                    encoded.u.zipped.data_size = zipped.used;
+                    encoded.u.zipped.data = zipped.buf;
+                    encoded.u.packed.min = min;
+                    rc = serialize_encoded(dst, dsize, psize, &encoded);
+/*                    DEBUG_PRINT("packed+zipped to %u bytes", *psize); */
+                    /* debugging = 3; */
+                }
+                else {
+                    encoded.flags = (decoded.size_type << 2) | 2;
+                    encoded.data_count = N;
+                    encoded.u.packed.data_size = nbuf_size(decoded.diff);
+                    encoded.u.packed.data = decoded.diff->data.u8;
+                    encoded.u.packed.min = min;
+                    rc = serialize_encoded(dst, dsize, psize, &encoded);
+/*                    DEBUG_PRINT("packed to %u bytes", *psize); */
+                    /* debugging = 2; */
+                }
+                free(zipped.buf);
+            }
+            else {
+                rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            }
+            free(decoded.diff);
+        }
+        else {
+            rc = RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        }
+    }
+    else {
+        /* DEBUG_PRINT("packed would have been %u", pack_size + 13); */
+    }
+
+    if (*psize) {
+        size_t bsize = N * sizeof(Y[0]);
+        assert(bsize <= UINT32_MAX);
+        zipped.buf = malloc(zipped.size = (unsigned)bsize);
+        if (zipped.buf) {
+            rc_t rc2 = zlib_compress(&zipped, Y, zipped.size, Z_DEFAULT_STRATEGY, Z_BEST_SPEED);
+            if (rc2 == 0 && zipped.used + 5 <= *psize) {
+                encoded.flags = ((sizeof(Y[0]) == 1 ? 0 : sizeof(Y[0]) == 2 ? 1 : sizeof(Y[0]) == 4 ? 2 : 3) << 2) | 1;
+                encoded.data_count = N;
+                encoded.u.zipped.data_size = zipped.used;
+                encoded.u.zipped.data = zipped.buf;
+                rc = serialize_encoded(dst, dsize, psize, &encoded);
+                /* DEBUG_PRINT("zipped to %u bytes", *psize); */
+                /* debugging = 1; */
+            }
+            else {
+                /* DEBUG_PRINT("zipped would have been %u", zipped.used + 5); */
+            }
+
+            free(zipped.buf);
+        }
+    }
+    /* if (debugging == 0) { */
+    /*     ENCODE(NULL, 0, NULL, Y, N, 1); */
+    /* } */
+    return rc;
+}
diff --git a/libs/vxf/izip.c b/libs/vxf/izip.c
new file mode 100644
index 0000000..e0ab508
--- /dev/null
+++ b/libs/vxf/izip.c
@@ -0,0 +1,866 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <compiler.h>
+#include <klib/sort.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+#include <byteswap.h>
+#include <os-native.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+
+#include <zlib.h>
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "izip-common.h"
+
+#define FTYPE double_t
+typedef struct stats_t {
+    FTYPE sy, syy, sxy;
+    FTYPE sx, sxx;
+    FTYPE fit;
+    unsigned n;
+    unsigned i;
+    unsigned x;
+} stats_t;
+
+#if 0
+static void debug_print_stats(const stats_t *st) {
+    fprintf(stderr, "sy: %lf, syy: %lf, sxy: %lf, sx: %lf, sxx: %lf, n: %u\n",
+        st->sy, st->syy, st->sxy, st->sx, st->sxx, st->n);
+}
+
+static void debug_print_data_u32(const uint32_t Y[], unsigned n) {
+    unsigned i;
+
+    for (i = 0; i != n; ++i) {
+        fprintf(stderr, "%u\n", Y[i]);
+    }
+}
+
+static void debug_print_data_u64(const uint64_t Y[], unsigned n) {
+    unsigned i;
+
+    for (i = 0; i != n; ++i) {
+        fprintf(stderr, "%ju\n", Y[i]);
+    }
+}
+#endif
+
+static FTYPE fitness( const stats_t *st)
+{
+    double_t var_xy = st->sxy - st->sx * st->sy / (double_t)st->n;
+    double_t var_x  = st->sxx - st->sx * st->sx / (double_t)st->n;
+    double_t var_y  = st->syy - st->sy * st->sy / (double_t)st->n;
+    
+    if (st->n <= 2)
+        return 1.0;
+    if (var_y == 0.0)
+        return 1.0;
+    if (var_xy != 0.0) {
+        if (var_x != 0.0) {
+            double_t fit = (var_xy / var_x) * (var_xy / var_y);
+            assert(-1.0 <= fit && fit <= 1.0);
+            return fit;
+        }
+    }
+    return 0.0;
+}
+
+static void regress_params(const stats_t *st, int64_t *dy, int64_t *dx, int64_t *a) {
+    double_t beta = (st->sxy - st->sx * st->sy / st->n) / ((double_t)st->n * (st->n - 1) * (st->n + 1) / 12.0);
+    double_t beta2;
+    int sgn = 1;
+    
+    if (beta < 0) {
+        beta = -beta;
+        sgn = -1;
+    }
+    if (beta > 0 && beta < 1) {
+        *dy = sgn * UINT16_MAX;
+        *dx = (int64_t)( UINT16_MAX / beta );
+    }
+    else if (beta < (UINT64_MAX / UINT16_MAX)) {
+        *dy = (int64_t)( sgn * beta * UINT16_MAX );
+        *dx = UINT16_MAX;
+    }
+    else {
+        *dy = (int64_t)( sgn * beta );
+        *dx = 1;
+    }
+    beta2 = (double_t)*dy / *dx;
+    *a = (int64_t)( (st->sy / st->n) - beta2 * (st->n - 1) / 2 );
+    
+    return;
+}
+
+typedef struct {
+    unsigned size;
+    unsigned used;
+    void *buf;
+} szbuf;
+
+static void pack_nbuf8(nbuf *x) {
+    unsigned i;
+    const unsigned n = x->used;
+    
+    for (i = 0; i != n; ++i)
+        x->data.u8[i] = (uint8_t)( x->data.raw[i] - x->min );
+    x->var = 4;
+}
+
+static void pack_nbuf16(nbuf *x) {
+    unsigned i;
+    const unsigned n = x->used;
+    
+    for (i = 0; i != n; ++i)
+        x->data.u16[i] = (uint16_t)( x->data.raw[i] - x->min );
+    x->var = 3;
+}
+
+static void pack_nbuf32(nbuf *x) {
+    unsigned i;
+    const unsigned n = x->used;
+    
+    for (i = 0; i != n; ++i)
+        x->data.u32[i] = (uint32_t)( x->data.raw[i] - x->min );
+    x->var = 2;
+}
+
+static void pack_nbuf(nbuf *x) {
+    if ((x->max - x->min) >> 8 == 0) {
+        pack_nbuf8(x);
+    }
+    else if ((x->max - x->min) >> 16 == 0) {
+        pack_nbuf16(x);
+    }
+    else if ((x->max - x->min) >> 32 == 0) {
+        pack_nbuf32(x);
+    }
+    else {
+        unsigned i;
+        const unsigned n = x->used;
+        
+        for (i = 0; i != n; ++i)
+            x->data.u64[i] = x->data.raw[i] - x->min;
+        x->var = 1;
+    }
+}
+
+static rc_t zlib_compress(szbuf *dst, const void *src, uint32_t ssize, int32_t strategy, int32_t level) {
+    z_stream s;
+    int zr;
+    rc_t rc = 0;
+    
+    memset(&s, 0, sizeof(s));
+    s.next_in = (void *)src;
+    s.avail_in = ssize;
+    s.next_out = dst->buf;
+    s.avail_out = (uInt)dst->size;
+    
+    dst->used = 0;
+    
+    zr = deflateInit2(&s, level, Z_DEFLATED, -15, 9, strategy);
+    switch (zr) {
+    case 0:
+        break;
+    case Z_MEM_ERROR:
+        return RC(rcVDB, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    case Z_STREAM_ERROR:
+        return RC(rcVDB, rcFunction, rcExecuting, rcParam, rcInvalid);
+    default:
+        return RC(rcVDB, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+    }
+    zr = deflate(&s, Z_FINISH);
+    switch (zr) {
+    case Z_STREAM_END:
+        break;
+    case Z_OK:
+        s.total_out = 0;
+        break;
+    default:
+        rc = RC(rcVDB, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+        break;
+    }
+    zr = deflateEnd(&s);
+    if ( zr != Z_OK && s.total_out != 0 )
+        rc = RC(rcVDB, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+    if (rc == 0) {
+        assert(s.total_out <= UINT32_MAX);
+        dst->used = (uint32_t)s.total_out;
+    }
+    return rc;
+}
+
+static
+void encode_types(uint8_t *packed, const uint8_t type[], unsigned n) {
+    unsigned i;
+    unsigned j;
+    unsigned k;
+    
+    for (i = k = 0, j = 1; i != n; ++i) {
+        if (type[i])
+            k |= j;
+        j <<= 1;
+        if (j == 0x100) {
+            j = 1;
+            packed[i / 8] = k;
+            k = 0;
+        }
+    }
+    packed[i / 8] = k;
+}
+
+static rc_t encode_decoded(struct encoded *y, const struct decoded *x) {
+    rc_t rc = 0;
+    uint8_t *temp;
+    unsigned temp_size;
+    szbuf zbuf;
+    
+    memset(y, 0, sizeof(*y));
+    y->flags = x->size_type << 2;
+    y->data_count = x->data_count;
+    y->u.izipped.segments = x->lines + x->outliers;
+    y->u.izipped.outliers = x->outliers ? x->outlier->used : 0;
+    
+    y->u.izipped.min_diff = x->diff->min;
+    y->u.izipped.min_length = x->length->min;
+    y->u.izipped.min_dy = x->dy->min;
+    y->u.izipped.min_dx = x->dx->min;
+    y->u.izipped.min_a = x->a->min;
+    y->u.izipped.min_outlier = x->outlier->min;
+    
+    if (x->outliers) {
+        temp = malloc((temp_size = (x->lines + x->outliers + 7) / 8) + 1);
+        if (temp == NULL)
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+
+        encode_types(temp, x->type, x->lines + x->outliers);
+        
+        zbuf.buf = malloc(zbuf.size = temp_size);
+        if (zbuf.buf == NULL)
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+
+        zbuf.used = 0;
+        rc = zlib_compress(&zbuf, temp, temp_size, Z_DEFAULT_STRATEGY, Z_BEST_SPEED);
+        if (rc) {
+            free(zbuf.buf);
+            free(temp);
+            return rc;
+        }
+        if (zbuf.used > 0 && zbuf.used < zbuf.size) {
+            free(temp);
+            SET_TYPE_ZIPPED(y->u.izipped);
+            y->u.izipped.type = zbuf.buf;
+            y->u.izipped.type_size = zbuf.used;
+        }
+        else {
+            free(zbuf.buf);
+            y->u.izipped.type = temp;
+            y->u.izipped.type_size = temp_size;
+        }
+    }
+    else {
+        SET_TYPE_ABSENT(y->u.izipped);
+        SET_OUTLIER_ABSENT(y->u.izipped);
+        y->u.izipped.type_size = 0;
+    }
+
+    if (x->diff->min == x->diff->max) {
+        SET_DIFF_CONSTANT(y->u.izipped);
+        y->u.izipped.diff_size = x->diff->used;
+    }
+    else {
+        zbuf.buf = malloc(zbuf.size = nbuf_size(x->diff));
+        if (zbuf.buf == NULL)
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        zbuf.used = 0;
+        
+        rc = zlib_compress(&zbuf, &x->diff->data, zbuf.size, Z_FILTERED, Z_BEST_SPEED);
+        if (rc) {
+            free(zbuf.buf);
+            return rc;
+        }
+        if (zbuf.used > 0 && zbuf.used < zbuf.size) {
+            SET_DIFF_ZIPPED(y->u.izipped);
+            y->u.izipped.diff = zbuf.buf;
+            y->u.izipped.diff_size = zbuf.used;
+        }
+        else {
+            y->u.izipped.diff = x->diff->data.u8;
+            y->u.izipped.diff_size = zbuf.size;
+            free(zbuf.buf);
+        }
+    }
+    
+    if (x->length->min == x->length->max) {
+        SET_LENGTH_CONSTANT(y->u.izipped);
+        y->u.izipped.length_size = x->length->used;
+    }
+    else {
+        zbuf.buf = malloc(zbuf.size = nbuf_size(x->length));
+        if (zbuf.buf == NULL)
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        zbuf.used = 0;
+        
+        rc = zlib_compress(&zbuf, &x->length->data, zbuf.size, Z_DEFAULT_STRATEGY, Z_BEST_SPEED);
+        if (rc) {
+            free(zbuf.buf);
+            return rc;
+        }
+        if (zbuf.used > 0 && zbuf.used < zbuf.size) {
+            SET_LENGTH_ZIPPED(y->u.izipped);
+            y->u.izipped.length = zbuf.buf;
+            y->u.izipped.length_size = zbuf.used;
+        }
+        else {
+            y->u.izipped.length = x->length->data.u8;
+            y->u.izipped.length_size = zbuf.size;
+            free(zbuf.buf);
+        }
+    }
+    
+    if (x->dy->min == x->dy->max) {
+        SET_DY_CONSTANT(y->u.izipped);
+        y->u.izipped.dy_size = x->dy->used;
+    }
+    else {
+        zbuf.buf = malloc(zbuf.size = nbuf_size(x->dy));
+        if (zbuf.buf == NULL)
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        zbuf.used = 0;
+        
+        rc = zlib_compress(&zbuf, &x->dy->data, zbuf.size, Z_DEFAULT_STRATEGY, Z_BEST_SPEED);
+        if (rc) {
+            free(zbuf.buf);
+            return rc;
+        }
+        if (zbuf.used > 0 && zbuf.used < zbuf.size) {
+            SET_DY_ZIPPED(y->u.izipped);
+            y->u.izipped.dy = zbuf.buf;
+            y->u.izipped.dy_size = zbuf.used;
+        }
+        else {
+            y->u.izipped.dy = x->dy->data.u8;
+            y->u.izipped.dy_size = zbuf.size;
+            free(zbuf.buf);
+        }
+    }
+    
+    if (x->dx->min == x->dx->max) {
+        SET_DX_CONSTANT(y->u.izipped);
+        y->u.izipped.dx_size = x->dx->used;
+    }
+    else {
+        zbuf.buf = malloc(zbuf.size = nbuf_size(x->dx));
+        if (zbuf.buf == NULL)
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        zbuf.used = 0;
+        
+        rc = zlib_compress(&zbuf, &x->dx->data, zbuf.size, Z_DEFAULT_STRATEGY, Z_BEST_SPEED);
+        if (rc) {
+            free(zbuf.buf);
+            return rc;
+        }
+        if (zbuf.used > 0 && zbuf.used < zbuf.size) {
+            SET_DX_ZIPPED(y->u.izipped);
+            y->u.izipped.dx = zbuf.buf;
+            y->u.izipped.dx_size = zbuf.used;
+        }
+        else {
+            y->u.izipped.dx = x->dx->data.u8;
+            y->u.izipped.dx_size = zbuf.size;
+            free(zbuf.buf);
+        }
+    }
+    
+    if (x->a->min == x->a->max) {
+        SET_A_CONSTANT(y->u.izipped);
+        y->u.izipped.a_size = x->a->used;
+    }
+    else {
+        zbuf.buf = malloc(zbuf.size = nbuf_size(x->a));
+        if (zbuf.buf == NULL)
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        zbuf.used = 0;
+        
+        rc = zlib_compress(&zbuf, &x->a->data, zbuf.size, Z_DEFAULT_STRATEGY, Z_BEST_SPEED);
+        if (rc) {
+            free(zbuf.buf);
+            return rc;
+        }
+        if (zbuf.used > 0 && zbuf.used < zbuf.size) {
+            SET_A_ZIPPED(y->u.izipped);
+            y->u.izipped.a = zbuf.buf;
+            y->u.izipped.a_size = zbuf.used;
+        }
+        else {
+            y->u.izipped.a = x->a->data.u8;
+            y->u.izipped.a_size = zbuf.size;
+            free(zbuf.buf);
+        }
+    }
+    
+    if (x->outliers != 0) {
+        zbuf.buf = malloc(zbuf.size = nbuf_size(x->outlier));
+        if (zbuf.buf == NULL)
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        zbuf.used = 0;
+        
+        rc = zlib_compress(&zbuf, &x->outlier->data, zbuf.size, Z_DEFAULT_STRATEGY, Z_BEST_SPEED);
+        if (rc) {
+            free(zbuf.buf);
+            return rc;
+        }
+        if (zbuf.used > 0 && zbuf.used < zbuf.size) {
+            SET_OUTLIER_ZIPPED(y->u.izipped);
+            y->u.izipped.outlier = zbuf.buf;
+            y->u.izipped.outlier_size = zbuf.used;
+        }
+        else {
+            y->u.izipped.outlier = x->outlier->data.u8;
+            y->u.izipped.outlier_size = zbuf.size;
+            free(zbuf.buf);
+        }
+    }
+    
+    return 0;
+}
+
+static void free_encoded(const struct encoded *self) {
+    switch (self->flags & 3) {
+    case 0:
+        if (FLAG_OUTLIER(self->u.izipped) == DATA_ZIPPED)
+            free((void *)self->u.izipped.outlier);
+        if (FLAG_A(self->u.izipped) == DATA_ZIPPED)
+            free((void *)self->u.izipped.a);
+        if (FLAG_DX(self->u.izipped) == DATA_ZIPPED)
+            free((void *)self->u.izipped.dx);
+        if (FLAG_DY(self->u.izipped) == DATA_ZIPPED)
+            free((void *)self->u.izipped.dy);
+        if (FLAG_LENGTH(self->u.izipped) == DATA_ZIPPED)
+            free((void *)self->u.izipped.length);
+        if (FLAG_DIFF(self->u.izipped) == DATA_ZIPPED)
+            free((void *)self->u.izipped.diff);
+        if (FLAG_TYPE(self->u.izipped) != DATA_ABSENT)
+            free((void *)self->u.izipped.type);
+        break;
+    default:
+        break;
+    }
+}
+
+#define SERIALZE16(X) do { if (i + 2 > dsize) return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient); memmove(dst + i, &x->u.izipped.X, 2); i += 2; } while(0)
+#define SERIALZE32(X) do { if (i + 4 > dsize) return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient); memmove(dst + i, &x->u.izipped.X, 4); i += 4; } while(0)
+#define SERIALZE64(X) do { if (i + 8 > dsize) return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient); memmove(dst + i, &x->u.izipped.X, 8); i += 8; } while(0)
+
+static
+rc_t serialize_encoded(uint8_t *dst, unsigned dsize, unsigned *psize, const struct encoded *x) {
+    unsigned i = 0;
+   
+    *psize = 0;
+
+    if (i + 1 > dsize)
+        return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);    
+    dst[i] = x->flags; i += 1;
+    
+    if (i + 4 > dsize)
+        return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);    
+    memmove(dst + i, &x->data_count, 4); i += 4;
+
+    switch (x->flags & 0x03) {
+    case 3:
+    case 2:
+        if (i + 8 > dsize)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);    
+        memmove(dst + i, &x->u.packed.min, 8); i += 8;
+        /* fall thru */
+    case 1:
+        if (i + x->u.zipped.data_size > dsize)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);    
+        memmove(dst + i, x->u.zipped.data, x->u.zipped.data_size); i += x->u.zipped.data_size;
+        *psize = i;
+        return 0;
+    default:
+        break;
+    }
+    
+    SERIALZE32(data_flags);
+    SERIALZE32(segments);
+    SERIALZE32(outliers);
+    SERIALZE32(type_size);
+    SERIALZE32(diff_size);
+    SERIALZE32(length_size);
+    SERIALZE32(dy_size);
+    SERIALZE32(dx_size);
+    SERIALZE32(a_size);
+    SERIALZE32(outlier_size);
+
+    SERIALZE64(min_diff);
+    SERIALZE64(min_length);
+    SERIALZE64(min_dy);
+    SERIALZE64(min_dx);
+    SERIALZE64(min_a);
+    SERIALZE64(min_outlier);
+    
+    if (FLAG_TYPE(x->u.izipped) != DATA_ABSENT && FLAG_TYPE(x->u.izipped) != DATA_CONSTANT) {
+        if (i + x->u.izipped.type_size > dsize)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        memmove(dst + i, x->u.izipped.type, x->u.izipped.type_size); i += x->u.izipped.type_size;
+    }
+    
+    if (FLAG_DIFF(x->u.izipped) != DATA_ABSENT && FLAG_DIFF(x->u.izipped) != DATA_CONSTANT) {
+        if (i + x->u.izipped.diff_size > dsize)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        memmove(dst + i, x->u.izipped.diff, x->u.izipped.diff_size); i += x->u.izipped.diff_size;
+    }
+    
+    if (FLAG_LENGTH(x->u.izipped) != DATA_ABSENT && FLAG_LENGTH(x->u.izipped) != DATA_CONSTANT) {
+        if (i + x->u.izipped.length_size > dsize)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        memmove(dst + i, x->u.izipped.length, x->u.izipped.length_size); i += x->u.izipped.length_size;
+    }
+    
+    if (FLAG_DY(x->u.izipped) != DATA_ABSENT && FLAG_DY(x->u.izipped) != DATA_CONSTANT) {
+        if (i + x->u.izipped.dy_size > dsize)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        memmove(dst + i, x->u.izipped.dy, x->u.izipped.dy_size); i += x->u.izipped.dy_size;
+    }
+    
+    if (FLAG_DX(x->u.izipped) != DATA_ABSENT && FLAG_DX(x->u.izipped) != DATA_CONSTANT) {
+        if (i + x->u.izipped.dx_size > dsize)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        memmove(dst + i, x->u.izipped.dx, x->u.izipped.dx_size); i += x->u.izipped.dx_size;
+    }
+    
+    if (FLAG_A(x->u.izipped) != DATA_ABSENT && FLAG_A(x->u.izipped) != DATA_CONSTANT) {
+        if (i + x->u.izipped.a_size > dsize)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        memmove(dst + i, x->u.izipped.a, x->u.izipped.a_size); i += x->u.izipped.a_size;
+    }
+    
+    if (FLAG_OUTLIER(x->u.izipped) != DATA_ABSENT && FLAG_OUTLIER(x->u.izipped) != DATA_CONSTANT) {
+        if (i + x->u.izipped.outlier_size > dsize)
+            return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        memmove(dst + i, x->u.izipped.outlier, x->u.izipped.outlier_size); i += x->u.izipped.outlier_size;
+    }
+    
+    *psize = i;
+    return 0;
+}
+
+static int64_t CC comp_position(const void *A, const void *B, void * ignored) {
+    const stats_t *a = A;
+    const stats_t *b = B;
+    
+    return (int64_t)a->x - (int64_t)b->x;
+}
+
+static int64_t CC comp_fitness(const void *A, const void *B, void * ignored) {
+    const stats_t **a = (const stats_t **)A;
+    const stats_t **b = (const stats_t **)B;
+    
+    return (**a).fit < (**b).fit ?
+        -1 : (**b).fit < (**a).fit ? 1 : (int64_t)(**a).i - (int64_t)(**b).i;
+}
+
+static void merge(stats_t *dst, const stats_t *L, const stats_t *R) {
+    stats_t temp = *L;
+    
+    temp.sx  += R->sx;
+    temp.sxx += R->sxx;
+    temp.sy  += R->sy;
+    temp.syy += R->syy;
+    temp.sxy += R->sxy;
+    temp.n   += R->n;
+    temp.fit  = fitness( &temp );
+    
+    *dst = temp;
+}
+
+#define OUTLIER_LIMIT (12)
+#define CHUNK_SIZE (16)
+#define SANITY_CHECK 1
+
+/* for signed operations */
+#define ABS(X) ((uint64_t)(X >= 0 ? (X) : (-(X))))
+
+#define STYPE int8_t
+#define ANALYZE analyze_i8
+#define ENCODE encode_i8
+#include "izip-encode.impl.h"
+#undef STYPE
+#undef ANALYZE
+#undef ENCODE
+
+#define STYPE int16_t
+#define ANALYZE analyze_i16
+#define ENCODE encode_i16
+#include "izip-encode.impl.h"
+#undef STYPE
+#undef ANALYZE
+#undef ENCODE
+
+#define STYPE int32_t
+#define ANALYZE analyze_i32
+#define ENCODE encode_i32
+#include "izip-encode.impl.h"
+#undef STYPE
+#undef ANALYZE
+#undef ENCODE
+
+#define STYPE int64_t
+#define ANALYZE analyze_i64
+#define ENCODE encode_i64
+#include "izip-encode.impl.h"
+#undef STYPE
+#undef ANALYZE
+#undef ENCODE
+
+
+/* for unsigned operations */
+#undef ABS
+#define ABS(X) ((uint64_t)(X))
+
+#define STYPE uint8_t
+#define ANALYZE analyze_u8
+#define ENCODE encode_u8
+#include "izip-encode.impl.h"
+#undef STYPE
+#undef ANALYZE
+#undef ENCODE
+
+#define STYPE uint16_t
+#define ANALYZE analyze_u16
+#define ENCODE encode_u16
+#include "izip-encode.impl.h"
+#undef STYPE
+#undef ANALYZE
+#undef ENCODE
+
+#define STYPE uint32_t
+#define ANALYZE analyze_u32
+#define ENCODE encode_u32
+#include "izip-encode.impl.h"
+#undef STYPE
+#undef ANALYZE
+#undef ENCODE
+
+#define STYPE uint64_t
+#define ANALYZE analyze_u64
+#define ENCODE encode_u64
+#include "izip-encode.impl.h"
+#undef STYPE
+#undef ANALYZE
+#undef ENCODE
+
+typedef rc_t (*encode_f)(uint8_t *dst, unsigned dsize, unsigned *psize, const void *Y, unsigned N, int DUMP);
+
+struct self_t {
+    encode_f f;
+};
+
+static
+struct self_t selfs[8] = {
+    { (encode_f)encode_u8 },
+    { (encode_f)encode_i8 },
+    { (encode_f)encode_u16 },
+    { (encode_f)encode_i16 },
+    { (encode_f)encode_u32 },
+    { (encode_f)encode_i32 },
+    { (encode_f)encode_u64 },
+    { (encode_f)encode_i64 },
+};
+
+rc_t ex_encode8( void *dst, unsigned dsize, uint8_t *src,
+                 unsigned ssize_in_u8, unsigned *written )
+{
+    return selfs[0].f( dst, dsize, written, src, ssize_in_u8, 0 );
+}
+
+rc_t ex_encode16( void *dst, unsigned dsize, uint16_t *src,
+                  unsigned ssize_in_u16, unsigned *written )
+{
+    return selfs[2].f( dst, dsize, written, src, ssize_in_u16, 0 );
+}
+
+rc_t ex_encode32( void *dst, unsigned dsize, uint32_t *src,
+                  unsigned ssize_in_u32, unsigned *written )
+{
+    return selfs[4].f( dst, dsize, written, src, ssize_in_u32, 0 );
+}
+
+rc_t ex_encode64( void *dst, unsigned dsize, uint64_t *src,
+                  unsigned ssize_in_u64, unsigned *written )
+{
+    return selfs[6].f( dst, dsize, written, src, ssize_in_u64, 0 );
+}
+
+#if 0
+static
+rc_t CC izip(
+               void *Self,
+               const VXformInfo *info,
+               VBlobResult *dst,
+               const VBlobData *src,
+               VBlobHeader *hdr
+) {
+    rc_t rc = 0;
+    const struct self_t *self = Self;
+    uint32_t dsize;
+    
+    VBlobHeaderSetVersion(hdr, 0);
+
+    assert(src->elem_count >> 32 == 0);
+    assert(((dst->elem_count * dst->elem_bits + 7) >> 3) >> 32 == 0);
+    dsize = (uint32_t)((dst->elem_count * dst->elem_bits + 7) >> 3);
+    rc = self->f(dst->data, (uint32_t)dsize, &dsize, src->data, (uint32_t)src->elem_count, 0);
+    if (dsize && rc == 0) {
+        dst->byte_order = vboNative;
+        dst->elem_bits = 1;
+        dst->elem_count = dsize << 3;
+        return 0;
+    }
+    return RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+}
+
+/* 
+ function izip_fmt izip #1.0 ( izip_set in )
+ */
+VTRANSFACT_IMPL(vdb_izip, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    if (dp->argc != 1) {
+#if _DEBUGGING
+        fprintf(stderr, "dp->argc = %u != 1\n", dp->argc);
+#endif
+        return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+    }
+
+    rslt->variant = vftBlob;
+    rslt->u.bf = izip;
+
+    switch (dp->argv[0].desc.domain) {
+    case vtdInt:
+        switch (dp->argv[0].desc.intrinsic_bits) {
+        case 8:
+            rslt->self = &selfs[1];
+            break;
+        case 16:
+            rslt->self = &selfs[3];
+            break;
+        case 32:
+            rslt->self = &selfs[5];
+            break;
+        case 64:
+            rslt->self = &selfs[7];
+            break;
+        default:
+#if _DEBUGGING
+            fprintf(stderr, "intrinsic_bits = %u != (8|16|32|64)\n", dp->argv[0].desc.intrinsic_bits);
+#endif
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            break;
+        }
+        break;
+    case vtdUint:
+        switch (dp->argv[0].desc.intrinsic_bits) {
+        case 8:
+            rslt->self = &selfs[0];
+            break;
+        case 16:
+            rslt->self = &selfs[2];
+            break;
+        case 32:
+            rslt->self = &selfs[4];
+            break;
+        case 64:
+            rslt->self = &selfs[6];
+            break;
+        default:
+#if _DEBUGGING
+            fprintf(stderr, "intrinsic_bits = %u != (8|16|32|64)\n", dp->argv[0].desc.intrinsic_bits);
+#endif
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            break;
+        }
+        break;
+    default:
+#if _DEBUGGING
+        fprintf(stderr, "domain != vtdInt or vtdUint\n");
+#endif
+        return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+    }
+
+    return 0;
+}
+#endif
+
+#if TESTING
+extern int test_decode(int32_t *, unsigned, const uint8_t *, unsigned, int);
+
+int test_encode(const int32_t Y[], unsigned N) {
+    uint8_t *dst;
+    unsigned dsize;
+    size_t temp;
+    rc_t rc = 0;
+    
+    temp = N * sizeof(Y[0]);
+    assert(temp >> 32 == 0);
+    dst = malloc(dsize = (unsigned)temp);
+    if (dst == NULL)
+        return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    rc = encode_i32(dst, dsize, &dsize, Y, N, 0);
+
+    {
+        int32_t *X;
+        
+        X = malloc(N * sizeof(Y[0]));
+        if (X) {
+            rc = test_decode(X, N, dst, dsize, 0);
+            if (rc == 0) {
+                rc = memcmp(Y, X, N * sizeof(Y[0])) == 0 ? 0 : RC(rcXF, rcFunction, rcExecuting, rcFunction, rcInvalid);
+            }
+            free(X);
+        }
+    }
+
+    free(dst);
+    if (rc)
+        fprintf(stdout, "test failed!\n");
+    return rc;
+}
+#endif
diff --git a/libs/vxf/lower-case-tech-reads.c b/libs/vxf/lower-case-tech-reads.c
new file mode 100644
index 0000000..9f9e911
--- /dev/null
+++ b/libs/vxf/lower-case-tech-reads.c
@@ -0,0 +1,111 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <insdc/insdc.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+
+static
+rc_t CC lower_case_tech_reads ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    uint32_t i, j, k;
+
+    char *mixed;
+    const char *read_text = argv [ 0 ] . u . data . base;
+    const INSDC_coord_len *read_len = argv [ 1 ] . u . data . base;
+    const INSDC_read_type *read_type = argv [ 2 ] . u . data . base;
+
+    rc_t rc = KDataBufferResize ( rslt -> data, argv [ 0 ] . u . data . elem_count );
+    if ( rc != 0 )
+        return rc;
+
+    rslt -> elem_count = argv [ 0 ] . u . data . elem_count;
+
+    mixed = rslt -> data -> base;
+    read_text += argv [ 0 ] . u . data . first_elem;
+    read_len += argv [ 1 ] . u . data . first_elem;
+    read_type += argv [ 2 ] . u . data . first_elem;
+
+    for ( i = j = 0; i < argv [ 0 ] . u . data . elem_count; ++ j )
+    {
+        /* should still have reads described */
+        if ( j == argv [ 1 ] . u . data . elem_count || j == argv [ 2 ] . u . data . elem_count )
+            break;
+
+        /* get read length */
+        k = read_len [ j ];
+        if ( i + k > argv [ 0 ] . u . data . elem_count )
+            k = argv [ 0 ] . u . data . elem_count - i;
+
+        /* decide upon upper or lower case */
+        if ( ( read_type [ j ] & 1 ) != READ_TYPE_BIOLOGICAL )
+        {
+            for ( ; k > 0; ++ i, -- k )
+                mixed [ i ] = tolower ( read_text [ i ] );
+        }
+        else
+        {
+            for ( ; k > 0; ++ i, -- k )
+                mixed [ i ] = toupper ( read_text [ i ] );
+        }
+    }
+
+    for ( ; i < argv [ 0 ] . u . data . elem_count; ++ i )
+        mixed [ i ] = toupper ( read_text [ i ] );
+
+    return 0;
+}
+
+
+/* lower_case_tech_reads
+ *  locates technical reads within an IUPAC sequence
+ *  converts them to lower-case
+ *
+ *  "read_text" [ DATA ] - IUPAC source text
+ *
+ *  "read_len" [ DATA ] - ordered array of read lengths
+ *
+ *  "read_type" [ DATA ] - describes which reads are technical
+ *  and which are biological. determines the case of each read segment
+ *
+ * extern function
+ * INSDC:dna:mixed_case:text NCBI:lower_case_tech_reads #1 ( INSDC:dna:text read_text,
+ *     INSDC:coord:len read_len, INSDC:read:type read_type );
+ */
+VTRANSFACT_IMPL ( NCBI_lower_case_tech_reads, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> u . rf = lower_case_tech_reads;
+    rslt -> variant = vftRow;
+    return 0;
+}
diff --git a/libs/vxf/map.c b/libs/vxf/map.c
new file mode 100644
index 0000000..de0423c
--- /dev/null
+++ b/libs/vxf/map.c
@@ -0,0 +1,1017 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/sort.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* LOOP TYPES
+ *  this function can be characterized by its loops
+ *
+ *  1) single-input that is type-compatible with the output
+ *     functions like the unix command "tr" by allowing all
+ *     input to pass through, except those matching the "from"
+ *     array, which are changed to the corresponding entry in
+ *     the "to" array.
+ *
+ *  2) single-input that is NOT type-compatible with output
+ *     functions like a type transformation where ALL input
+ *     must be transformed, i.e. there can be no pass through.
+ *     this loop requires detection of any unspecified input
+ *     and results in an error.
+ *
+ *  3) dual-input that combines the other two loops, in a sense.
+ *     it is like the first loop type in that there are no
+ *     points of failure, and like the second in that it has
+ *     to test for matches against the "from" array. its exact
+ *     behavior is to pass values from the second input to the
+ *     output unchanged, unless the corresponding value from the
+ *     first input matches anything in the "from" table, in which
+ *     case the corresponding "to" value is substituted to dest.
+ */
+
+
+/* type 1: 8-bit to 8-bit map
+ *  this is our principal workhorse
+ *  there are no points of failure
+ *  the map is built initially for identity
+ *  and overridden to perform substitutions indicated
+ */
+static
+rc_t CC type1_uint8_t ( void *self, const VXformInfo *info,
+    void *vdst, const void *vsrc, uint64_t elem_count )
+{
+    const uint8_t *map = ( const void* ) self;
+    const uint8_t *src = vsrc;
+    uint8_t *dst = vdst;
+
+    uint64_t i;
+    for ( i = 0; i < elem_count; ++ i )
+        dst [ i ] = map [ src [ i ] ];
+
+    return 0;
+}
+
+static
+rc_t make_type1_uint8_t ( void **selfp, const uint8_t *from, const uint8_t *to, uint32_t map_len )
+{
+    uint32_t i;
+
+    uint8_t *map = malloc ( 256 );
+    if ( map == NULL )
+        return RC ( rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted );
+
+    for ( i = 0; i < 256; ++ i )
+        map [ i ] = ( uint8_t ) i;
+
+    for ( i = 0; i < map_len; ++ i )
+        map [ from [ i ] ] = to [ i ];
+
+    * selfp = map;
+    return 0;
+}
+
+
+/* map_t
+ *  a structure that holds "from" and "to" arrays
+ */
+typedef struct map_t map_t;
+struct map_t
+{
+#if _DEBUGGING
+    /* array function for type 1 and 2 loops */
+    VArrayFunc array;
+#endif
+
+    /* row function for type 3 loops */
+    void ( * row ) ( const map_t *self, void *dst,
+        const void *src, const void *tst, uint64_t elem_count );
+
+    /* map length */
+    uint32_t map_len;
+    uint32_t align;
+
+    /* ordered "from" array and corresponding "to" array */
+    const void *from, * to;
+};
+
+
+/* type 1: linear map
+ *  when the arrays are so short as to not benefit from binary search
+ */
+#define TYPE1_LINEAR_MAP( TYPE )                                \
+static                                                          \
+rc_t CC type1_linear_ ## TYPE ( void *vself,                    \
+    const VXformInfo *info, void *vdst, const void *vsrc,       \
+    uint64_t elem_count )                                       \
+{                                                               \
+    const map_t *self = ( const void* ) vself;                  \
+                                                                \
+    const TYPE *src = vsrc;                                     \
+    TYPE *dst = vdst;                                           \
+                                                                \
+    const TYPE *from = self -> from;                            \
+    const TYPE *to = self -> to;                                \
+                                                                \
+    uint64_t i;                                                 \
+    uint32_t j, map_len = self -> map_len;                      \
+    for ( i = 0; i < elem_count; ++ i )                         \
+    {                                                           \
+        TYPE elem = dst [ i ] = src [ i ];                      \
+        for ( j = 0; j < map_len; ++ j )                        \
+        {                                                       \
+            if ( from [ j ] == elem )                           \
+            {                                                   \
+                dst [ i ] = to [ j ];                           \
+                break;                                          \
+            }                                                   \
+        }                                                       \
+    }                                                           \
+                                                                \
+    return 0;                                                   \
+}
+
+TYPE1_LINEAR_MAP ( uint16_t )
+TYPE1_LINEAR_MAP ( uint32_t )
+TYPE1_LINEAR_MAP ( uint64_t )
+TYPE1_LINEAR_MAP ( float )
+TYPE1_LINEAR_MAP ( double )
+
+static VArrayFunc type1_linear_funcs [ 5 ] =
+{
+    type1_linear_uint16_t,
+    type1_linear_uint32_t,
+    type1_linear_uint64_t,
+    type1_linear_float,
+    type1_linear_double
+};
+
+
+/* type 1: binary map
+ *  when the arrays are long enough to warrant binary search
+ */
+#define TYPE1_BINARY_MAP( TYPE )                                \
+static                                                          \
+rc_t CC type1_binary_ ## TYPE ( void *vself,                    \
+    const VXformInfo *info, void *vdst, const void *vsrc,       \
+    uint64_t elem_count )                                       \
+{                                                               \
+    const map_t *self = ( const void* ) vself;                  \
+                                                                \
+    const TYPE *src = vsrc;                                     \
+    TYPE *dst = vdst;                                           \
+                                                                \
+    const TYPE *from = self -> from;                            \
+    const TYPE *to = self -> to;                                \
+                                                                \
+    uint64_t i;                                                 \
+    for ( i = 0; i < elem_count; ++ i )                         \
+    {                                                           \
+        TYPE elem = dst [ i ] = src [ i ];                      \
+                                                                \
+        uint32_t lower = 0, upper = self -> map_len;            \
+        while ( lower < upper )                                 \
+        {                                                       \
+            uint32_t j = ( lower + upper ) >> 1;                \
+            TYPE cur = from [ j ];                              \
+            if ( elem == cur )                                  \
+            {                                                   \
+                dst [ i ] = to [ j ];                           \
+                break;                                          \
+            }                                                   \
+            if ( elem < cur )                                   \
+                upper = j;                                      \
+            else                                                \
+                lower = j + 1;                                  \
+        }                                                       \
+    }                                                           \
+                                                                \
+    return 0;                                                   \
+}
+
+TYPE1_BINARY_MAP ( uint16_t )
+TYPE1_BINARY_MAP ( uint32_t )
+TYPE1_BINARY_MAP ( uint64_t )
+TYPE1_BINARY_MAP ( float )
+TYPE1_BINARY_MAP ( double )
+
+static VArrayFunc type1_binary_funcs [ 5 ] =
+{
+    type1_binary_uint16_t,
+    type1_binary_uint32_t,
+    type1_binary_uint64_t,
+    type1_binary_float,
+    type1_binary_double
+};
+
+/* type 2: 8-bit to N-bit
+ *  allowed to perform a lookup test
+ */
+#define TYPE2_8BIT_MAP( DTYPE )                                 \
+static                                                          \
+rc_t CC type2_uint8_t_to_ ## DTYPE ( void *vself,               \
+    const VXformInfo *info, void *vdst, const void *vsrc,       \
+    uint64_t elem_count )                                       \
+{                                                               \
+    const map_t *self = ( const void* ) vself;                  \
+                                                                \
+    const uint8_t *src = vsrc;                                  \
+    DTYPE *dst = vdst;                                          \
+                                                                \
+    const uint8_t *from = self -> from;                         \
+    const DTYPE *to = self -> to;                               \
+                                                                \
+    uint64_t i;                                                 \
+    for ( i = 0; i < elem_count; ++ i )                         \
+    {                                                           \
+        int j = src [ i ];                                      \
+        if ( ! from [ j ] )                                     \
+        {                                                       \
+            return RC ( rcVDB, rcFunction, rcExecuting, rcConstraint, rcViolated );              \
+        }                                                       \
+        dst [ i ] = to [ j ];                                   \
+    }                                                           \
+                                                                \
+    return 0;                                                   \
+}
+
+TYPE2_8BIT_MAP ( uint8_t )
+TYPE2_8BIT_MAP ( uint16_t )
+TYPE2_8BIT_MAP ( uint32_t )
+TYPE2_8BIT_MAP ( uint64_t )
+
+/* type2: binary map
+ *  due to the combinatorial explosion,
+ *  just implement the binary version
+ */
+#define TYPE2_BINARY_MAP( STYPE, DTYPE )                        \
+static                                                          \
+rc_t CC type2_ ## STYPE ## _to_ ## DTYPE ( void *vself,         \
+    const VXformInfo *info, void *vdst, const void *vsrc,       \
+    uint64_t elem_count )                                       \
+{                                                               \
+    const map_t *self = ( const void* ) vself;                  \
+                                                                \
+    const STYPE *src = vsrc;                                    \
+    DTYPE *dst = vdst;                                          \
+                                                                \
+    const STYPE *from = self -> from;                           \
+    const DTYPE *to = self -> to;                               \
+                                                                \
+    uint64_t i;                                                 \
+    for ( i = 0; i < elem_count; ++ i )                         \
+    {                                                           \
+        STYPE cur, elem = src [ i ];                            \
+                                                                \
+        uint32_t j, lower = 0, upper = self -> map_len;         \
+        while ( lower < upper )                                 \
+        {                                                       \
+            j = ( lower + upper ) >> 1;                         \
+            cur = from [ j ];                                   \
+            if ( elem == cur )                                  \
+                goto FOUND;                                     \
+            if ( elem < cur )                                   \
+                upper = j;                                      \
+            else                                                \
+                lower = j + 1;                                  \
+        }                                                       \
+        return RC( rcVDB, rcFunction, rcExecuting, rcConstraint, rcViolated );                  \
+FOUND:                                                          \
+        dst [ i ] = to [ j ];                                   \
+    }                                                           \
+                                                                \
+    return 0;                                                   \
+}
+
+TYPE2_BINARY_MAP ( uint16_t, uint8_t )
+TYPE2_BINARY_MAP ( uint16_t, uint16_t )
+TYPE2_BINARY_MAP ( uint16_t, uint32_t )
+TYPE2_BINARY_MAP ( uint16_t, uint64_t )
+
+TYPE2_BINARY_MAP ( uint32_t, uint8_t )
+TYPE2_BINARY_MAP ( uint32_t, uint16_t )
+TYPE2_BINARY_MAP ( uint32_t, uint32_t )
+TYPE2_BINARY_MAP ( uint32_t, uint64_t )
+
+TYPE2_BINARY_MAP ( uint64_t, uint8_t )
+TYPE2_BINARY_MAP ( uint64_t, uint16_t )
+TYPE2_BINARY_MAP ( uint64_t, uint32_t )
+TYPE2_BINARY_MAP ( uint64_t, uint64_t )
+
+TYPE2_BINARY_MAP ( float, uint8_t )
+TYPE2_BINARY_MAP ( float, uint16_t )
+TYPE2_BINARY_MAP ( float, uint32_t )
+TYPE2_BINARY_MAP ( float, uint64_t )
+
+TYPE2_BINARY_MAP ( double, uint8_t )
+TYPE2_BINARY_MAP ( double, uint16_t )
+TYPE2_BINARY_MAP ( double, uint32_t )
+TYPE2_BINARY_MAP ( double, uint64_t )
+
+static VArrayFunc type2_funcs [ 6 ] [ 4 ] =
+{
+    /* uint8_t */
+    {
+        type2_uint8_t_to_uint8_t,
+        type2_uint8_t_to_uint16_t,
+        type2_uint8_t_to_uint32_t,
+        type2_uint8_t_to_uint64_t
+    },
+
+    /* uint16_t */
+    {
+        type2_uint16_t_to_uint8_t,
+        type2_uint16_t_to_uint16_t,
+        type2_uint16_t_to_uint32_t,
+        type2_uint16_t_to_uint64_t
+    },
+
+    /* uint32_t */
+    {
+        type2_uint32_t_to_uint8_t,
+        type2_uint32_t_to_uint16_t,
+        type2_uint32_t_to_uint32_t,
+        type2_uint32_t_to_uint64_t
+    },
+
+    /* uint64_t */
+    {
+        type2_uint64_t_to_uint8_t,
+        type2_uint64_t_to_uint16_t,
+        type2_uint64_t_to_uint32_t,
+        type2_uint64_t_to_uint64_t
+    },
+
+    /* float */
+    {
+        type2_float_to_uint8_t,
+        type2_float_to_uint16_t,
+        type2_float_to_uint32_t,
+        type2_float_to_uint64_t
+    },
+
+    /* double */
+    {
+        type2_double_to_uint8_t,
+        type2_double_to_uint16_t,
+        type2_double_to_uint32_t,
+        type2_double_to_uint64_t
+    }
+};
+
+
+/* type 3: 8-bit to N-bit
+ *  allowed to perform a lookup test
+ */
+#define TYPE3_8BIT_MAP( DTYPE )                                 \
+static                                                          \
+void type3_uint8_t_to_ ## DTYPE ( const map_t *self,            \
+    void *vdst, const void *vsrc, const void *vtst,             \
+    uint64_t elem_count )                                       \
+{                                                               \
+    const uint8_t *tst = vtst;                                  \
+    const DTYPE *src = vsrc;                                    \
+    DTYPE *dst = vdst;                                          \
+                                                                \
+    const uint8_t *from = self -> from;                         \
+    const DTYPE *to = self -> to;                               \
+                                                                \
+    uint64_t i;                                                 \
+    for ( i = 0; i < elem_count; ++ i )                         \
+    {                                                           \
+        int j = tst [ i ];                                      \
+        dst [ i ] = src [ i ];                                  \
+        if ( from [ j ] )                                       \
+            dst [ i ] = to [ j ];                               \
+    }                                                           \
+}
+
+TYPE3_8BIT_MAP ( uint8_t )
+TYPE3_8BIT_MAP ( uint16_t )
+TYPE3_8BIT_MAP ( uint32_t )
+TYPE3_8BIT_MAP ( uint64_t )
+
+/* type3: binary map
+ *  due to the combinatorial explosion,
+ *  just implement the binary version
+ */
+#define TYPE3_BINARY_MAP( STYPE, DTYPE )                        \
+static                                                          \
+void type3_ ## STYPE ## _to_ ## DTYPE ( const map_t *self,      \
+    void *vdst, const void *vsrc, const void *vtst,             \
+    uint64_t elem_count )                                       \
+{                                                               \
+    const STYPE *tst = vtst;                                    \
+    const DTYPE *src = vsrc;                                    \
+    DTYPE *dst = vdst;                                          \
+                                                                \
+    const STYPE *from = self -> from;                           \
+    const DTYPE *to = self -> to;                               \
+                                                                \
+    uint64_t i;                                                 \
+    for ( i = 0; i < elem_count; ++ i )                         \
+    {                                                           \
+        STYPE elem = tst [ i ];                                 \
+        uint32_t lower = 0, upper = self -> map_len;            \
+                                                                \
+        dst [ i ] = src [ i ];                                  \
+                                                                \
+        while ( lower < upper )                                 \
+        {                                                       \
+            uint32_t j = ( lower + upper ) >> 1;                \
+            STYPE cur = from [ j ];                             \
+            if ( elem == cur )                                  \
+            {                                                   \
+                dst [ i ] = to [ j ];                           \
+                break;                                          \
+            }                                                   \
+            if ( elem < cur )                                   \
+                upper = j;                                      \
+            else                                                \
+                lower = j + 1;                                  \
+        }                                                       \
+    }                                                           \
+}
+
+TYPE3_BINARY_MAP ( uint16_t, uint8_t )
+TYPE3_BINARY_MAP ( uint16_t, uint16_t )
+TYPE3_BINARY_MAP ( uint16_t, uint32_t )
+TYPE3_BINARY_MAP ( uint16_t, uint64_t )
+
+TYPE3_BINARY_MAP ( uint32_t, uint8_t )
+TYPE3_BINARY_MAP ( uint32_t, uint16_t )
+TYPE3_BINARY_MAP ( uint32_t, uint32_t )
+TYPE3_BINARY_MAP ( uint32_t, uint64_t )
+
+TYPE3_BINARY_MAP ( uint64_t, uint8_t )
+TYPE3_BINARY_MAP ( uint64_t, uint16_t )
+TYPE3_BINARY_MAP ( uint64_t, uint32_t )
+TYPE3_BINARY_MAP ( uint64_t, uint64_t )
+
+TYPE3_BINARY_MAP ( float, uint8_t )
+TYPE3_BINARY_MAP ( float, uint16_t )
+TYPE3_BINARY_MAP ( float, uint32_t )
+TYPE3_BINARY_MAP ( float, uint64_t )
+
+TYPE3_BINARY_MAP ( double, uint8_t )
+TYPE3_BINARY_MAP ( double, uint16_t )
+TYPE3_BINARY_MAP ( double, uint32_t )
+TYPE3_BINARY_MAP ( double, uint64_t )
+
+typedef void ( * type3_func ) ( const map_t*, void*, const void*, const void*, uint64_t );
+static type3_func type3_funcs [ 6 ] [ 4 ] =
+{
+    /* uint8_t */
+    {
+        type3_uint8_t_to_uint8_t,
+        type3_uint8_t_to_uint16_t,
+        type3_uint8_t_to_uint32_t,
+        type3_uint8_t_to_uint64_t
+    },
+
+    /* uint16_t */
+    {
+        type3_uint16_t_to_uint8_t,
+        type3_uint16_t_to_uint16_t,
+        type3_uint16_t_to_uint32_t,
+        type3_uint16_t_to_uint64_t
+    },
+
+    /* uint32_t */
+    {
+        type3_uint32_t_to_uint8_t,
+        type3_uint32_t_to_uint16_t,
+        type3_uint32_t_to_uint32_t,
+        type3_uint32_t_to_uint64_t
+    },
+
+    /* uint64_t */
+    {
+        type3_uint64_t_to_uint8_t,
+        type3_uint64_t_to_uint16_t,
+        type3_uint64_t_to_uint32_t,
+        type3_uint64_t_to_uint64_t
+    },
+
+    /* float */
+    {
+        type3_float_to_uint8_t,
+        type3_float_to_uint16_t,
+        type3_float_to_uint32_t,
+        type3_float_to_uint64_t
+    },
+
+    /* double */
+    {
+        type3_double_to_uint8_t,
+        type3_double_to_uint16_t,
+        type3_double_to_uint32_t,
+        type3_double_to_uint64_t
+    }
+};
+
+
+#if _DEBUGGING
+static
+rc_t CC type12_driver ( void *xself, const VXformInfo *info,
+    void *dst, const void *src, uint64_t elem_count )
+{
+    map_t *self = xself;
+    return ( * self -> array ) ( self, info, dst, src, elem_count );
+}
+#endif
+
+static
+rc_t CC type3_driver ( void *xself,
+    const VXformInfo *info, int64_t row_id,
+    const VFixedRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    const map_t *self = ( const void* ) xself;
+
+    /* base pointers to pages */
+    uint8_t *dst = rslt -> base;
+    const uint8_t *tst = argv [ 0 ] . u . data . base;
+    const uint8_t *src = argv [ 1 ] . u . data . base;
+
+    /* offset by bytes to first element of row */
+    dst += ( rslt -> elem_bits * rslt -> first_elem ) >> 3;
+    tst += ( argv [ 0 ] . u . data . elem_bits * argv [ 0 ] . u . data . first_elem ) >> 3;
+    src += ( argv [ 1 ] . u . data . elem_bits * argv [ 1 ] . u . data . first_elem ) >> 3;
+
+    /* invoke function */
+    ( * self -> row ) ( self, dst, src, tst, rslt -> elem_count );
+    return 0;
+}
+
+
+/* make
+ *  make a map_t structure
+ */
+#define MAKE_8BIT_MAP_T( DTYPE )                                        \
+static                                                                  \
+rc_t make_map_t_uint8_t_to_ ## DTYPE ( map_t **mapp,                    \
+    const void *vfrom, const void *vto, uint32_t map_len )              \
+{                                                                       \
+    uint32_t i;                                                         \
+    uint8_t *tst;                                                       \
+    DTYPE *dto;                                                         \
+    const uint8_t *from = vfrom;                                        \
+    const DTYPE *sto = vto;                                             \
+    map_t *map = calloc ( 1, sizeof * map +                             \
+        ( sizeof * tst + sizeof * dto ) * 256 );                        \
+    if ( map == NULL )                                                  \
+    {                                                                   \
+        return RC ( rcVDB, rcFunction, rcConstructing,                  \
+            rcMemory, rcExhausted );                                    \
+    }                                                                   \
+                                                                        \
+    tst = ( uint8_t* ) ( map + 1 );                                     \
+    dto = ( DTYPE* ) & tst [ 256 ];                                     \
+                                                                        \
+    map -> row = NULL;                                                  \
+    map -> map_len = map_len;                                           \
+    map -> align = 0;                                                   \
+    map -> from = ( void* ) tst;                                        \
+    map -> to = ( void* ) dto;                                          \
+    * mapp = map;                                                       \
+                                                                        \
+    for ( i = 0; i < map_len; ++ i )                                    \
+    {                                                                   \
+        int j = from [ i ];                                             \
+        tst [ j ] = 1;                                                  \
+        dto [ j ] = sto [ i ];                                          \
+    }                                                                   \
+                                                                        \
+    return 0;                                                           \
+}
+
+MAKE_8BIT_MAP_T ( uint8_t )
+MAKE_8BIT_MAP_T ( uint16_t )
+MAKE_8BIT_MAP_T ( uint32_t )
+MAKE_8BIT_MAP_T ( uint64_t )
+
+#define MAP_T_CMP( TYPE )                                               \
+static                                                                  \
+int64_t CC map_t_cmp_ ## TYPE ( const void *a, const void *b, void *data )     \
+{                                                                       \
+    const TYPE *from = ( const TYPE* ) data;                            \
+    int left = * ( const uint16_t* ) a;                                 \
+    int right = * ( const uint16_t* ) b;                                \
+    if ( from [ left ] < from [ right ] )                               \
+        return -1;                                                      \
+    return from [ left ] > from [ right ];                              \
+}
+
+MAP_T_CMP ( uint16_t )
+MAP_T_CMP ( uint32_t )
+MAP_T_CMP ( uint64_t )
+MAP_T_CMP ( float )
+MAP_T_CMP ( double )
+
+#define MAKE_MAP_T( STYPE, DTYPE )                                      \
+static                                                                  \
+rc_t make_map_t_ ## STYPE ## _to_ ## DTYPE ( map_t **mapp,              \
+    const void *vfrom, const void *vto, uint32_t map_len )              \
+{                                                                       \
+    uint32_t i;                                                         \
+    uint16_t buff [ 64 ], *ord = buff;                                  \
+                                                                        \
+    DTYPE *dto;                                                         \
+    STYPE *dfrom;                                                       \
+                                                                        \
+    const STYPE *sfrom = vfrom;                                         \
+    const DTYPE *sto = vto;                                             \
+    map_t *map = malloc ( sizeof * map +                                \
+        ( sizeof * dfrom + sizeof * dto ) * map_len );                  \
+    if ( map == NULL )                                                  \
+    {                                                                   \
+        return RC ( rcVDB, rcFunction, rcConstructing,                  \
+            rcMemory, rcExhausted );                                    \
+    }                                                                   \
+                                                                        \
+    dfrom = ( STYPE* ) ( map + 1 );                                     \
+    dto = ( DTYPE* ) & dfrom [ map_len ];                               \
+                                                                        \
+    map -> row = NULL;                                                  \
+    map -> map_len = map_len;                                           \
+    map -> align = 0;                                                   \
+    map -> from = ( void* ) dfrom;                                      \
+    map -> to = ( void* ) dto;                                          \
+    * mapp = map;                                                       \
+                                                                        \
+    if ( map_len > sizeof buff / sizeof buff [ 0 ] )                    \
+    {                                                                   \
+        assert ( map_len < 0x10000 );                                   \
+        ord = malloc ( sizeof * ord * map_len );                        \
+        if ( ord == NULL )                                              \
+        {                                                               \
+            free ( map );                                               \
+            return RC ( rcVDB, rcFunction, rcConstructing,              \
+                rcMemory, rcExhausted );                                \
+        }                                                               \
+    }                                                                   \
+                                                                        \
+    for ( i = 0; i < map_len; ++ i )                                    \
+        ord [ i ] = ( uint16_t ) i;                                     \
+    ksort ( ord, map_len, sizeof ord [ 0 ],                             \
+        map_t_cmp_ ## STYPE, ( void* ) sfrom );                          \
+                                                                        \
+    for ( i = 0; i < map_len; ++ i )                                    \
+    {                                                                   \
+        int j = ord [ i ];                                              \
+        dfrom [ i ] = sfrom [ j ];                                      \
+        dto [ i ] = sto [ j ];                                          \
+    }                                                                   \
+                                                                        \
+    if ( ord != buff )                                                  \
+        free ( ord );                                                   \
+                                                                        \
+    return 0;                                                           \
+}
+
+MAKE_MAP_T ( uint16_t, uint8_t )
+MAKE_MAP_T ( uint16_t, uint16_t )
+MAKE_MAP_T ( uint16_t, uint32_t )
+MAKE_MAP_T ( uint16_t, uint64_t )
+
+MAKE_MAP_T ( uint32_t, uint8_t )
+MAKE_MAP_T ( uint32_t, uint16_t )
+MAKE_MAP_T ( uint32_t, uint32_t )
+MAKE_MAP_T ( uint32_t, uint64_t )
+
+MAKE_MAP_T ( uint64_t, uint8_t )
+MAKE_MAP_T ( uint64_t, uint16_t )
+MAKE_MAP_T ( uint64_t, uint32_t )
+MAKE_MAP_T ( uint64_t, uint64_t )
+
+MAKE_MAP_T ( float, uint8_t )
+MAKE_MAP_T ( float, uint16_t )
+MAKE_MAP_T ( float, uint32_t )
+MAKE_MAP_T ( float, uint64_t )
+
+MAKE_MAP_T ( double, uint8_t )
+MAKE_MAP_T ( double, uint16_t )
+MAKE_MAP_T ( double, uint32_t )
+MAKE_MAP_T ( double, uint64_t )
+
+
+typedef rc_t ( * make_func ) ( map_t**, const void*, const void*, uint32_t );
+static make_func make_funcs [ 6 ] [ 4 ] =
+{
+    /* uint8_t */
+    {
+        make_map_t_uint8_t_to_uint8_t,
+        make_map_t_uint8_t_to_uint16_t,
+        make_map_t_uint8_t_to_uint32_t,
+        make_map_t_uint8_t_to_uint64_t
+    },
+
+    /* uint16_t */
+    {
+        make_map_t_uint16_t_to_uint8_t,
+        make_map_t_uint16_t_to_uint16_t,
+        make_map_t_uint16_t_to_uint32_t,
+        make_map_t_uint16_t_to_uint64_t
+    },
+
+    /* uint32_t */
+    {
+        make_map_t_uint32_t_to_uint8_t,
+        make_map_t_uint32_t_to_uint16_t,
+        make_map_t_uint32_t_to_uint32_t,
+        make_map_t_uint32_t_to_uint64_t
+    },
+
+    /* uint64_t */
+    {
+        make_map_t_uint64_t_to_uint8_t,
+        make_map_t_uint64_t_to_uint16_t,
+        make_map_t_uint64_t_to_uint32_t,
+        make_map_t_uint64_t_to_uint64_t
+    },
+
+    /* float */
+    {
+        make_map_t_float_to_uint8_t,
+        make_map_t_float_to_uint16_t,
+        make_map_t_float_to_uint32_t,
+        make_map_t_float_to_uint64_t
+    },
+
+    /* double */
+    {
+        make_map_t_double_to_uint8_t,
+        make_map_t_double_to_uint16_t,
+        make_map_t_double_to_uint32_t,
+        make_map_t_double_to_uint64_t
+    }
+};
+
+/* domain_and_size_code
+ *  converts sizes 8..64 into 0..3
+ *  converts domains into integer or float
+ *  combines the two into a single integer
+ *  returns -1 if something is simply unsupported
+ */
+static
+int domain_and_size_code ( const VTypedesc *desc )
+{
+    int size, type;
+    switch ( desc -> intrinsic_bits )
+    {
+    case 8:
+        size = 0;
+        break;
+    case 16:
+        size = 1;
+        break;
+    case 32:
+        size = 2;
+        break;
+    case 64:
+        size = 3;
+        break;
+    default:
+        return -1;
+    }
+
+    switch ( desc -> domain )
+    {
+    case vtdBool:
+    case vtdUint:
+    case vtdInt:
+        type = 0;
+        break;
+    case vtdFloat:
+        type = 4;
+        break;
+    case vtdAscii:
+    case vtdUnicode:
+        type = 0;
+        break;
+    default:
+        return -1;
+    }
+
+    return type + size;
+}
+
+
+/* map
+ *  translate input elements
+ *  behaves much like the Unix "tr" command
+ *  except that charsets are not [currently] supported
+ *
+ *  "A" [ TYPE ] - input data type, e.g. "ascii"
+ *
+ *  "B" [ TYPE ] - output data type, e.g. "ascii" or "U8"
+ *
+ *  "from" [ CONST ] - set of key values.
+ *
+ *  "to" [ CONST ] - set of mapped values,
+ *  where length ( from ) === length ( to )
+ *
+ *  "in" [ DATA ] - input data to be matched against keys
+ *  in "from". also serves as source data when "src" is omitted
+ *
+ *  "src" [ DATA, OPTIONAL ] - source data to be edited by
+ *  substituting "to" values when corresponding "in" value
+ *  matches key in "from". if omitted, "in" is used.
+ *
+ * USAGE:
+ *  to upper case letters from a given alphabet
+ *    ascii upper = < ascii, ascii > map < 'acgtn', 'ACGTN' > ( in );
+ *
+ *  to translate from ascii to binary
+ *    U8 bin = < ascii, U8 > map < 'ACGTN', [ 0, 1, 2, 3, 0 ] > ( in );
+ *
+ *  to alter certain values of a column based upon values in another
+ *    U8 n_encoded = < ascii, U8 > map < 'N', 0 > ( read, quality );
+ *
+ * CAVEATS:
+ *  the full canonical mode of operation uses separate inputs
+ *  for key matching and output source.
+ *
+ *  when a single input is specified:
+ *   - sizeof ( A ) must equal sizeof ( B )
+ *   - A must be a proper subset of B -OR-
+ *   - "from" keys must match every possible "in" value ( total substitution )
+ */
+static
+rc_t vdb_map_type1_8bit_fact ( VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    rc_t rc = make_type1_uint8_t ( & rslt -> self,
+        cp -> argv [ 0 ] . data . u8,
+        cp -> argv [ 1 ] . data . u8,
+        cp -> argv [ 0 ] . count );
+    if ( rc != 0 )
+        return rc;
+
+    rslt -> whack = free;
+    rslt -> u. af = type1_uint8_t;
+    rslt -> variant = vftArray;
+
+    return 0;
+}
+
+static
+rc_t vdb_map_type1_fact ( VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    rc_t rc;
+    int code;
+    map_t *self;
+
+    /* look for special case of 8-bit to 8-bit mapping */
+    if ( cp -> argv [ 0 ] . desc . intrinsic_bits == 8 )
+        return vdb_map_type1_8bit_fact ( rslt, cp );
+
+    /* determine the domain and size code */
+    code = domain_and_size_code ( & cp -> argv [ 0 ] . desc );
+    if ( code < 0 )
+        return RC ( rcVDB, rcFunction, rcConstructing, rcType, rcUnsupported );
+
+    /* create the object */
+    rc = ( * make_funcs [ code ] [ code & 3 ] )
+        ( & self,
+          cp -> argv [ 0 ] . data . u8,
+          cp -> argv [ 1 ] . data . u8,
+          cp -> argv [ 0 ] . count );
+    if ( rc != 0 )
+        return rc;
+
+    /* 8=>8 can be discounted */
+    -- code;
+
+    /* determine whether it makes sense to perform a binary search */
+    rslt -> u. af = ( cp -> argv [ 0 ] . count < 8 ) ?
+        type1_linear_funcs [ code ] : type1_binary_funcs [ code ];
+    
+    rslt -> self = self;
+    rslt -> whack = free;
+    rslt -> variant = vftArray;
+
+#if _DEBUGGING
+    self -> array = rslt -> u . af;
+    rslt -> u . af = type12_driver;
+#endif
+
+    return 0;
+}
+
+static
+rc_t vdb_map_type2_fact ( VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    rc_t rc;
+    map_t *self;
+    int code1, code2;
+
+    /* determine the domain and size codes */
+    code1 = domain_and_size_code ( & cp -> argv [ 0 ] . desc );
+    code2 = domain_and_size_code ( & cp -> argv [ 1 ] . desc );
+    if ( code1 < 0 ||  code2 < 0 )
+        return RC ( rcVDB, rcFunction, rcConstructing, rcType, rcUnsupported );
+
+    /* create the object */
+    rc = ( * make_funcs [ code1 ] [ code2 & 3 ] )
+        ( & self,
+          cp -> argv [ 0 ] . data . u8,
+          cp -> argv [ 1 ] . data . u8,
+          cp -> argv [ 0 ] . count );
+    if ( rc != 0 )
+        return rc;
+    
+    rslt -> self = self;
+    rslt -> whack = free;
+    rslt -> u. af = type2_funcs [ code1 ] [ code2 & 3 ];
+    rslt -> variant = vftArray;
+
+#if _DEBUGGING
+    self -> array = rslt -> u . af;
+    rslt -> u . af = type12_driver;
+#endif
+
+    return 0;
+}
+
+static
+rc_t vdb_map_type3_fact ( VFuncDesc *rslt, const VFactoryParams *cp )
+{
+    rc_t rc;
+    map_t *self;
+    int code1, code2;
+
+    /* determine the domain and size codes */
+    code1 = domain_and_size_code ( & cp -> argv [ 0 ] . desc );
+    code2 = domain_and_size_code ( & cp -> argv [ 1 ] . desc );
+    if ( code1 < 0 ||  code2 < 0 )
+        return RC ( rcVDB, rcFunction, rcConstructing, rcType, rcUnsupported );
+
+    /* create the object */
+    rc = ( * make_funcs [ code1 ] [ code2 & 3 ] )
+        ( & self,
+          cp -> argv [ 0 ] . data . u8,
+          cp -> argv [ 1 ] . data . u8,
+          cp -> argv [ 0 ] . count );
+    if ( rc != 0 )
+        return rc;
+
+    self -> row = type3_funcs [ code1 ] [ code2 & 3 ];
+    
+    rslt -> self = self;
+    rslt -> whack = free;
+    rslt -> u. pf = type3_driver;
+    rslt -> variant = vftFixedRow;
+
+    return 0;
+}
+
+VTRANSFACT_IMPL ( vdb_map, 1, 0, 0 ) ( const void *ignore, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* the compiler has no way of knowing that the map dimensions must match */
+    if ( cp -> argv [ 0 ] . count != cp -> argv [ 1 ] . count )
+        return RC ( rcVDB, rcFunction, rcConstructing, rcConstraint, rcViolated );
+
+    /* the loop type is determined by the number of inputs and input type */
+    if ( dp -> argc == 2 )
+        return vdb_map_type3_fact ( rslt, cp );
+
+    /* since two schema types A and B are given, the compiler has no way
+       of knowing that it should check for a relationship between them */
+    if ( VTypedeclToTypedecl ( & dp -> argv [ 0 ] . fd . td, info -> schema, & info -> fdesc . fd . td, NULL, NULL ) )
+        return vdb_map_type1_fact ( rslt, cp );
+
+    return vdb_map_type2_fact ( rslt, cp );
+}
diff --git a/libs/vxf/math-funcs-impl.h b/libs/vxf/math-funcs-impl.h
new file mode 100644
index 0000000..8f95e12
--- /dev/null
+++ b/libs/vxf/math-funcs-impl.h
@@ -0,0 +1,361 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <compiler.h>
+#include <math.h>
+
+typedef void (*math_f)(void *dst, const void *src, size_t elem_count);
+typedef union self_t {
+    void *vp;
+    math_f f;
+} self_t;
+
+static void F32_to_I8(void *Dst, const void *Src, size_t elem_count) {
+    int8_t *dst = Dst;
+    const float *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (int8_t)FLOAT_FUNC(src[i]);
+}
+
+static void F32_to_U8(void *Dst, const void *Src, size_t elem_count) {
+    uint8_t *dst = Dst;
+    const float *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (uint8_t)FLOAT_FUNC(src[i]);
+}
+
+static void F32_to_I16(void *Dst, const void *Src, size_t elem_count) {
+    int16_t *dst = Dst;
+    const float *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (int16_t)FLOAT_FUNC(src[i]);
+}
+
+static void F32_to_U16(void *Dst, const void *Src, size_t elem_count) {
+    uint16_t *dst = Dst;
+    const float *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (uint16_t)FLOAT_FUNC(src[i]);
+}
+
+static void F32_to_I32(void *Dst, const void *Src, size_t elem_count) {
+    int32_t *dst = Dst;
+    const float *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (int32_t)FLOAT_FUNC(src[i]);
+}
+
+static void F32_to_U32(void *Dst, const void *Src, size_t elem_count) {
+    uint32_t *dst = Dst;
+    const float *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (uint32_t)FLOAT_FUNC(src[i]);
+}
+
+static void F32_to_I64(void *Dst, const void *Src, size_t elem_count) {
+    int64_t *dst = Dst;
+    const float *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (int64_t)FLOAT_FUNC(src[i]);
+}
+
+static void F32_to_U64(void *Dst, const void *Src, size_t elem_count) {
+    uint64_t *dst = Dst;
+    const float *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (uint64_t)FLOAT_FUNC(src[i]);
+}
+
+static void F32_to_F32(void *Dst, const void *Src, size_t elem_count) {
+    float *dst = Dst;
+    const float *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = FLOAT_FUNC(src[i]);
+}
+
+static void F32_to_F64(void *Dst, const void *Src, size_t elem_count) {
+    double *dst = Dst;
+    const float *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = FLOAT_FUNC(src[i]);
+}
+
+static void F64_to_I8(void *Dst, const void *Src, size_t elem_count) {
+    int8_t *dst = Dst;
+    const double *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (int8_t)DOUBLE_FUNC(src[i]);
+}
+
+static void F64_to_U8(void *Dst, const void *Src, size_t elem_count) {
+    uint8_t *dst = Dst;
+    const double *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (uint8_t)DOUBLE_FUNC(src[i]);
+}
+
+static void F64_to_I16(void *Dst, const void *Src, size_t elem_count) {
+    int16_t *dst = Dst;
+    const double *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (int16_t)DOUBLE_FUNC(src[i]);
+}
+
+static void F64_to_U16(void *Dst, const void *Src, size_t elem_count) {
+    uint16_t *dst = Dst;
+    const double *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (uint16_t)DOUBLE_FUNC(src[i]);
+}
+
+static void F64_to_I32(void *Dst, const void *Src, size_t elem_count) {
+    int32_t *dst = Dst;
+    const double *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (int32_t)DOUBLE_FUNC(src[i]);
+}
+
+static void F64_to_U32(void *Dst, const void *Src, size_t elem_count) {
+    uint32_t *dst = Dst;
+    const double *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (uint32_t)DOUBLE_FUNC(src[i]);
+}
+
+static void F64_to_I64(void *Dst, const void *Src, size_t elem_count) {
+    int64_t *dst = Dst;
+    const double *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (int64_t)DOUBLE_FUNC(src[i]);
+}
+
+static void F64_to_U64(void *Dst, const void *Src, size_t elem_count) {
+    uint64_t *dst = Dst;
+    const double *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (uint64_t)DOUBLE_FUNC(src[i]);
+}
+
+static void F64_to_F32(void *Dst, const void *Src, size_t elem_count) {
+    float *dst = Dst;
+    const double *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = (float)DOUBLE_FUNC(src[i]);
+}
+
+static void F64_to_F64(void *Dst, const void *Src, size_t elem_count) {
+    double *dst = Dst;
+    const double *src = Src;
+    int i;
+    
+    for (i = 0; i != elem_count; ++i)
+        dst[i] = DOUBLE_FUNC(src[i]);
+}
+
+static
+rc_t CC array_func(
+                void *Self,
+                const VXformInfo *info,
+                void *dst,
+                const void *src,
+                uint64_t num_elements
+                )
+{
+    self_t hack;
+
+    hack.vp = Self;
+    hack.f(dst, src, ( size_t ) num_elements);
+    return 0;
+}
+
+static rc_t factory( const void *self, const VXfactInfo *info, 
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    VTypedesc src_desc;
+    rc_t rc;
+    self_t hack;
+
+    rc = VSchemaDescribeTypedecl(info->schema, &src_desc, &dp->argv[0].fd.td);
+    if (rc)
+        return rc;
+    
+    rslt->variant = vftArray;
+    rslt->u.af = array_func;
+    
+    switch (src_desc.intrinsic_bits) {
+    case 32:
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                hack.f = F32_to_I8;
+                break;
+            case 16:
+                hack.f = F32_to_I16;
+                break;
+            case 32:
+                hack.f = F32_to_I32;
+                break;
+            case 64:
+                hack.f = F32_to_I64;
+                break;
+            default:
+                return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            }
+            break;
+        case vtdUint:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                hack.f = F32_to_U8;
+                break;
+            case 16:
+                hack.f = F32_to_U16;
+                break;
+            case 32:
+                hack.f = F32_to_U32;
+                break;
+            case 64:
+                hack.f = F32_to_U64;
+                break;
+            default:
+                return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            }
+            break;
+        case vtdFloat:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 32:
+                hack.f = F32_to_F32;
+                break;
+            case 64:
+                hack.f = F32_to_F64;
+                break;
+            default:
+                return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            }
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+        break;
+    case 64:
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                hack.f = F64_to_I8;
+                break;
+            case 16:
+                hack.f = F64_to_I16;
+                break;
+            case 32:
+                hack.f = F64_to_I32;
+                break;
+            case 64:
+                hack.f = F64_to_I64;
+                break;
+            default:
+                return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            }
+            break;
+        case vtdUint:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 8:
+                hack.f = F64_to_U8;
+                break;
+            case 16:
+                hack.f = F64_to_U16;
+                break;
+            case 32:
+                hack.f = F64_to_U32;
+                break;
+            case 64:
+                hack.f = F64_to_U64;
+                break;
+            default:
+                return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            }
+            break;
+        case vtdFloat:
+            switch (info->fdesc.desc.intrinsic_bits) {
+            case 32:
+                hack.f = F64_to_F32;
+                break;
+            case 64:
+                hack.f = F64_to_F64;
+                break;
+            default:
+                return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            }
+            break;
+        default:
+            return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+        break;
+    default:
+        return RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+    }
+    rslt->self = hack.vp;
+    return 0;
+}
+
diff --git a/libs/vxf/max.c b/libs/vxf/max.c
new file mode 100644
index 0000000..c941468
--- /dev/null
+++ b/libs/vxf/max.c
@@ -0,0 +1,175 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+
+typedef void (*func_t)(void *, const void *, const void *, uint64_t);
+
+typedef struct self_t {
+    func_t f;
+} self_t;
+
+#define FUNC(VALTYPE) F_ ## VALTYPE
+
+#define FUNC_DEF(VALTYPE) \
+static void FUNC(VALTYPE)(void *Dst, const void *A, const void *B, uint64_t n) { \
+    VALTYPE *dst = (VALTYPE *)Dst; \
+    const VALTYPE *a = (const VALTYPE *)A; \
+    const VALTYPE *b = (const VALTYPE *)B; \
+    uint64_t i; \
+    \
+    for (i = 0; i != n; ++i) \
+        dst[i] = b[i] < a[i] ? a[i] : b[i]; \
+}
+
+FUNC_DEF(float)
+FUNC_DEF(double)
+FUNC_DEF(uint8_t)
+FUNC_DEF(uint16_t)
+FUNC_DEF(uint32_t)
+FUNC_DEF(uint64_t)
+FUNC_DEF(int8_t)
+FUNC_DEF(int16_t)
+FUNC_DEF(int32_t)
+FUNC_DEF(int64_t)
+
+static
+rc_t CC fixed_row_func(
+                      void *Self,
+                      const VXformInfo *info,
+                      int64_t row_id,
+                      const VFixedRowResult *rslt,
+                      uint32_t argc,
+                      const VRowData argv[]
+) {
+    const self_t *self = Self;
+
+    /* base pointers to pages */
+    uint8_t *dst = rslt -> base;
+    const uint8_t *a = argv [ 0 ] . u . data . base;
+    const uint8_t *b = argv [ 1 ] . u . data . base;
+
+    /* offset by bytes to first element of row */
+    dst += ( rslt -> elem_bits * rslt -> first_elem ) >> 3;
+    a += ( argv [ 0 ] . u . data . elem_bits * argv [ 0 ] . u . data . first_elem ) >> 3;
+    b += ( argv [ 1 ] . u . data . elem_bits * argv [ 1 ] . u . data . first_elem ) >> 3;
+
+    self -> f ( dst, a, b, rslt -> elem_count );
+    return 0;
+}
+
+static
+void CC vxf_max_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* 
+ */
+VTRANSFACT_IMPL(vdb_max, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+    self_t *self;
+
+	self = malloc(sizeof(self_t));
+    if (self == NULL)
+        return RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+        
+    rslt->self = self;
+    rslt->whack = vxf_max_wrapper;
+    rslt->variant = vftFixedRow;
+    rslt->u.pf = fixed_row_func;
+
+    switch (info->fdesc.desc.intrinsic_bits) {
+    case 8:
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            self->f = FUNC(int8_t);
+            break;
+        case vtdUint:
+            self->f = FUNC(uint8_t);
+            break;
+        default:
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+        break;
+    case 16:
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            self->f = FUNC(int16_t);
+            break;
+        case vtdUint:
+            self->f = FUNC(uint16_t);
+            break;
+        default:
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+        break;
+    case 32:
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            self->f = FUNC(int32_t);
+            break;
+        case vtdUint:
+            self->f = FUNC(uint32_t);
+            break;
+        case vtdFloat:
+            self->f = FUNC(float);
+            break;
+        default:
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+        break;
+    case 64:
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            self->f = FUNC(int64_t);
+            break;
+        case vtdUint:
+            self->f = FUNC(uint64_t);
+            break;
+        case vtdFloat:
+            self->f = FUNC(double);
+            break;
+        default:
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+        break;
+    default:
+        rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+    }
+
+    if (rc)
+        free(self);
+    return rc;
+}
diff --git a/libs/vxf/min.c b/libs/vxf/min.c
new file mode 100644
index 0000000..b7e209c
--- /dev/null
+++ b/libs/vxf/min.c
@@ -0,0 +1,175 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+
+typedef void (*func_t)(void *, const void *, const void *, uint64_t);
+
+typedef struct self_t {
+    func_t f;
+} self_t;
+
+#define FUNC(VALTYPE) F_ ## VALTYPE
+
+#define FUNC_DEF(VALTYPE) \
+static void FUNC(VALTYPE)(void *Dst, const void *A, const void *B, uint64_t n) { \
+    VALTYPE *dst = (VALTYPE *)Dst; \
+    const VALTYPE *a = (const VALTYPE *)A; \
+    const VALTYPE *b = (const VALTYPE *)B; \
+    uint64_t i; \
+    \
+    for (i = 0; i != n; ++i) \
+        dst[i] = a[i] < b[i] ? a[i] : b[i]; \
+}
+
+FUNC_DEF(float)
+FUNC_DEF(double)
+FUNC_DEF(uint8_t)
+FUNC_DEF(uint16_t)
+FUNC_DEF(uint32_t)
+FUNC_DEF(uint64_t)
+FUNC_DEF(int8_t)
+FUNC_DEF(int16_t)
+FUNC_DEF(int32_t)
+FUNC_DEF(int64_t)
+
+static
+rc_t CC fixed_row_func(
+                      void *Self,
+                      const VXformInfo *info,
+                      int64_t row_id,
+                      const VFixedRowResult *rslt,
+                      uint32_t argc,
+                      const VRowData argv[]
+) {
+    const self_t *self = Self;
+
+    /* base pointers to pages */
+    uint8_t *dst = rslt -> base;
+    const uint8_t *a = argv [ 0 ] . u . data . base;
+    const uint8_t *b = argv [ 1 ] . u . data . base;
+
+    /* offset by bytes to first element of row */
+    dst += ( rslt -> elem_bits * rslt -> first_elem ) >> 3;
+    a += ( argv [ 0 ] . u . data . elem_bits * argv [ 0 ] . u . data . first_elem ) >> 3;
+    b += ( argv [ 1 ] . u . data . elem_bits * argv [ 1 ] . u . data . first_elem ) >> 3;
+    
+    self -> f ( dst, a, b, rslt -> elem_count );
+    return 0;
+}
+
+static
+void CC vxf_min_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* 
+ */
+VTRANSFACT_IMPL(vdb_min, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+    self_t *self;
+
+	self = malloc(sizeof(self_t));
+    if (self == NULL)
+        return RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+        
+    rslt->self = self;
+    rslt->whack = vxf_min_wrapper;
+    rslt->variant = vftFixedRow;
+    rslt->u.pf = fixed_row_func;
+
+    switch (info->fdesc.desc.intrinsic_bits) {
+    case 8:
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            self->f = FUNC(int8_t);
+            break;
+        case vtdUint:
+            self->f = FUNC(uint8_t);
+            break;
+        default:
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+        break;
+    case 16:
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            self->f = FUNC(int16_t);
+            break;
+        case vtdUint:
+            self->f = FUNC(uint16_t);
+            break;
+        default:
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+        break;
+    case 32:
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            self->f = FUNC(int32_t);
+            break;
+        case vtdUint:
+            self->f = FUNC(uint32_t);
+            break;
+        case vtdFloat:
+            self->f = FUNC(float);
+            break;
+        default:
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+        break;
+    case 64:
+        switch (info->fdesc.desc.domain) {
+        case vtdInt:
+            self->f = FUNC(int64_t);
+            break;
+        case vtdUint:
+            self->f = FUNC(uint64_t);
+            break;
+        case vtdFloat:
+            self->f = FUNC(double);
+            break;
+        default:
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+        break;
+    default:
+        rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+    }
+
+    if (rc)
+        free(self);
+    return rc;
+}
diff --git a/libs/vxf/outlier-decoder.c b/libs/vxf/outlier-decoder.c
new file mode 100644
index 0000000..a31a55b
--- /dev/null
+++ b/libs/vxf/outlier-decoder.c
@@ -0,0 +1,113 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <bitstr.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#define DECODER_NAME(T) outlier_encode_ ## T
+#define DECODER(T) static rc_t CC DECODER_NAME(T) (void *self, const VXformInfo *info, void *Dst, const void *Src, uint64_t elem_count) \
+{ \
+    T *dst = (T *)Dst; \
+    T const *src = (T const *)Src; \
+    T const outlier = *(T const *)self; \
+    uint64_t i; \
+    for (i = 0; i != elem_count; ++i) { \
+        T const y = src[i]; \
+        if (y & 1) \
+            dst[i] = outlier; \
+        else \
+            dst[i] = y >> 1; \
+    } \
+    return 0; \
+}
+
+DECODER(uint8_t)
+DECODER(uint16_t)
+DECODER(uint32_t)
+DECODER(uint64_t)
+
+/*
+ function < type T > T outlier_decode #1.0 < T outlier > ( T y );
+ */
+
+VTRANSFACT_IMPL ( vdb_outlier_decode, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+                                                 VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    void *self;
+    
+    if (info->fdesc.desc.domain != vtdInt || cp->argv[0].count != 1)
+        return RC(rcXF, rcFunction, rcConstructing, rcType, rcIncorrect);
+        
+        switch (VTypedescSizeof(&cp->argv[0].desc)) {
+        case 8:
+        case 16:
+        case 32:
+        case 64:
+            break;
+        default:
+            return RC(rcXF, rcFunction, rcConstructing, rcType, rcIncorrect);
+            break;
+        }
+    
+    self = malloc(sizeof(uint64_t));
+    if (self == NULL)
+        return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+        
+        switch (VTypedescSizeof(&cp->argv[0].desc)) {
+        case 8:
+            *(uint8_t *)self = cp->argv[0].data.u8[0];
+            rslt->u.af = DECODER_NAME(uint8_t);
+            break;
+        case 16:
+            *(uint16_t *)self = cp->argv[0].data.u16[0];
+            rslt->u.af = DECODER_NAME(uint16_t);
+            break;
+        case 32:
+            *(uint32_t *)self = cp->argv[0].data.u32[0];
+            rslt->u.af = DECODER_NAME(uint32_t);
+            break;
+        case 64:
+            *(uint64_t *)self = cp->argv[0].data.u64[0];
+            rslt->u.af = DECODER_NAME(uint64_t);
+            break;
+        default:
+            break;
+        }
+    rslt->self = self;
+    rslt->whack = free;
+    rslt->variant = vftArray;
+    return 0;
+}
diff --git a/libs/vxf/outlier-encoder.c b/libs/vxf/outlier-encoder.c
new file mode 100644
index 0000000..12dd827
--- /dev/null
+++ b/libs/vxf/outlier-encoder.c
@@ -0,0 +1,141 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <bitstr.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#define ENCODER_NAME(T) outlier_encode_ ## T
+#define ENCODER(T) static rc_t CC ENCODER_NAME(T) (void *self, const VXformInfo *info, void *Dst, const void *Src, uint64_t elem_count) \
+{ \
+    T *dst = (T *)Dst; \
+    T const *src = (T const *)Src; \
+    T last = 1; \
+    T const outlier = *(T const *)self; \
+    uint64_t i; \
+    for (i = 0; i != elem_count; ++i) { \
+        T const y = src[i]; \
+        if ((((T)(y << 1)) >> 1) != y) \
+            return RC(rcXF, rcFunction, rcExecuting, rcConstraint, rcViolated); \
+        if (y == outlier) \
+            dst[i] = last; \
+        else \
+            last = (dst[i] = y << 1) | 1; \
+    } \
+    return 0; \
+}
+
+extern void Debugger(void);
+
+ENCODER(uint8_t)
+ENCODER(uint16_t)
+ENCODER(uint32_t)
+#if 1
+ENCODER(uint64_t)
+#else
+static rc_t CC outlier_encode_uint64_t (void *self, const VXformInfo *info, void *Dst, const void *Src, uint64_t elem_count)
+{
+    typedef uint64_t T;
+    T *dst = (T *)Dst;
+    T const *src = (T const *)Src;
+    T last = 1;
+    T const outlier = *(T const *)self;
+    uint64_t i;
+
+    for (i = 0; i != elem_count; ++i) {
+        T const y = src[i];
+        if ((((T)(y << 1)) >> 1) != y)
+            return RC(rcXF, rcFunction, rcExecuting, rcConstraint, rcViolated);
+        if (y == outlier)
+            dst[i] = last;
+        else
+            last = (dst[i] = y << 1) | 1;
+    }
+    return 0;
+}
+#endif
+
+/*
+ function < type T > T outlier_encode #1.0 < T outlier > ( T y );
+ */
+
+VTRANSFACT_IMPL ( vdb_outlier_encode, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    void *self;
+
+    if (info->fdesc.desc.domain != vtdInt || cp->argv[0].count != 1)
+        return RC(rcXF, rcFunction, rcConstructing, rcType, rcIncorrect);
+
+    switch (VTypedescSizeof(&cp->argv[0].desc)) {
+    case 8:
+    case 16:
+    case 32:
+    case 64:
+        break;
+    default:
+        return RC(rcXF, rcFunction, rcConstructing, rcType, rcIncorrect);
+        break;
+    }
+    
+    self = malloc(sizeof(uint64_t));
+    if (self == NULL)
+        return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    
+    switch (VTypedescSizeof(&cp->argv[0].desc)) {
+    case 8:
+        *(uint8_t *)self = cp->argv[0].data.u8[0];
+        rslt->u.af = ENCODER_NAME(uint8_t);
+        break;
+    case 16:
+        *(uint16_t *)self = cp->argv[0].data.u16[0];
+        rslt->u.af = ENCODER_NAME(uint16_t);
+        break;
+    case 32:
+        *(uint32_t *)self = cp->argv[0].data.u32[0];
+        rslt->u.af = ENCODER_NAME(uint32_t);
+        break;
+    case 64:
+        *(uint64_t *)self = cp->argv[0].data.u64[0];
+        rslt->u.af = ENCODER_NAME(uint64_t);
+        break;
+    default:
+        break;
+    }
+    rslt->self = self;
+    rslt->whack = free;
+    rslt->variant = vftArray;
+    return 0;
+}
diff --git a/libs/vxf/pack.c b/libs/vxf/pack.c
new file mode 100644
index 0000000..27b9bae
--- /dev/null
+++ b/libs/vxf/pack.c
@@ -0,0 +1,92 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <klib/pack.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+
+
+typedef struct self_t {
+    VTypedesc sdesc;
+    uint32_t dbits;
+} self_t;
+
+static
+rc_t CC pack_func(
+               void *Self,
+               const VXformInfo *info,
+               void *dst,
+               const void *src,
+               uint64_t elem_count
+) {
+    const self_t *self = Self;
+    bitsz_t psize;
+    
+    return Pack(
+                self->sdesc.intrinsic_bits, self->dbits,
+                src, (elem_count * self->sdesc.intrinsic_dim * self->sdesc.intrinsic_bits) >> 3, 0,
+                dst, 0, elem_count * self->sdesc.intrinsic_dim * self->dbits, &psize
+               );
+}
+
+static
+void CC vxf_pack_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* 
+ */
+VTRANSFACT_IMPL(vdb_pack, 1, 0, 0) (const void *Self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc = 0;
+    self_t *self;
+
+    self = malloc(sizeof(self_t));
+    if (self) {
+        self->dbits = info->fdesc.desc.intrinsic_dim;
+
+        assert (dp->argc == 1);
+        self->sdesc = dp->argv[0].desc;
+        
+        rslt->self = self;
+        rslt->whack = vxf_pack_wrapper;
+
+        rslt->variant = vftArray;
+        rslt->u.af = pack_func;
+    }
+    else
+        rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    return rc;
+}
diff --git a/libs/vxf/paste.c b/libs/vxf/paste.c
new file mode 100644
index 0000000..6dd4b1a
--- /dev/null
+++ b/libs/vxf/paste.c
@@ -0,0 +1,357 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+typedef struct pastie pastie;
+struct pastie
+{
+    struct
+    {
+        union
+        {
+            void *u1;
+            uint8_t *u8;
+            uint16_t *u16;
+            uint32_t *u32;
+            uint64_t *u64;
+        } u;
+        bitsz_t off;
+
+    } dst;
+    struct
+    {
+        union
+        {
+            const void *u1;
+            const uint8_t *u8;
+            const uint16_t *u16;
+            const uint32_t *u32;
+            const uint64_t *u64;
+        } u;
+        bitsz_t off, len;
+
+    } src [ 16 ];
+};
+
+static
+rc_t CC paste_func1 ( void *data, const VXformInfo *info, int64_t row_id,
+    const VFixedRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc = 0;
+    pastie *self = data;
+    uint32_t i, j, row_len = (uint32_t)rslt -> elem_count;
+
+    assert(rslt -> elem_count >> 32 == 0);
+    /* populate "self" */
+    self -> dst . u . u1 = rslt -> base;
+    self -> dst . off = ((uint64_t)rslt -> first_elem) * rslt -> elem_bits;
+    for ( j = 0; j < argc; ++ j )
+    {
+        self -> src [ j ] . u . u1 = argv [ j ] . u . data .base;
+        self -> src [ j ] . off = ((uint64_t)argv [ j ] . u . data .first_elem) * argv [ j ] . u . data .elem_bits;
+        self -> src [ j ] . len = argv [ j ] . u . data .elem_bits;
+    }
+
+    /* create output row */
+    for ( i = 0; i < row_len; ++ i )
+    {
+        for ( j = 0; j < argc; ++ j )
+        {
+            uint32_t k = (uint32_t)self -> src [ j ] . len;
+            assert(self -> src [ j ] . len >> 32 == 0);
+            bitcpy ( self -> dst . u . u1, self -> dst . off,
+                     self -> src [ j ] . u . u1, self -> src [ j ] . off, k );
+            self -> dst . off += k;
+            self -> src [ j ] . off += k;
+        }
+    }
+    return rc;
+}
+
+static
+rc_t CC paste_func8 ( void *data, const VXformInfo *info, int64_t row_id,
+    const VFixedRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc = 0;
+    pastie *self = data;
+    uint32_t i, j, row_len = (uint32_t)rslt -> elem_count;
+    
+    assert(rslt -> elem_count >> 32 == 0);
+    /* populate "self" */
+    self -> dst . u . u8 = rslt -> base;
+    self -> dst . off = ((uint64_t)rslt -> first_elem) * (rslt -> elem_bits>>3);
+    for ( j = 0; j < argc; ++ j )
+    {
+        self -> src [ j ] . u . u8 = argv [ j ] . u . data .base;
+        self -> src [ j ] . off = ((uint64_t)argv [ j ] . u . data .first_elem) * (argv [ j ] . u . data .elem_bits >> 3);
+        self -> src [ j ] . len = argv [ j ] . u . data .elem_bits >> 3;
+    }
+
+    /* create output row */
+    for ( i = 0; i < row_len; ++ i )
+    {
+        for ( j = 0; j < argc; ++ j )
+        {
+            uint32_t k;
+            for ( k = 0; k < self -> src [ j ] . len; ++ k )
+            {
+                self -> dst . u . u8 [ self -> dst . off + k ] =
+                    self -> src [ j ] . u . u8 [ self -> src [ j ] . off + k ];
+            }
+
+            self -> dst . off += k;
+            self -> src [ j ] . off += k;
+        }
+    }
+    return rc;
+}
+
+static
+rc_t CC paste_func16 ( void *data, const VXformInfo *info, int64_t row_id,
+    const VFixedRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc = 0;
+    pastie *self = data;
+    uint32_t i, j, row_len = (uint32_t)rslt -> elem_count;
+    
+    assert(rslt -> elem_count >> 32 == 0);
+    /* populate "self" */
+    self -> dst . u . u16 = rslt -> base;
+    self -> dst . off = ((uint64_t)rslt -> first_elem) * (rslt -> elem_bits>>4);
+    for ( j = 0; j < argc; ++ j )
+    {
+        self -> src [ j ] . u . u16 = argv [ j ] . u . data .base;
+        self -> src [ j ] . off = ((uint64_t)argv [ j ] . u . data .first_elem) * (argv [ j ] . u . data .elem_bits >> 4);
+        self -> src [ j ] . len = argv [ j ] . u . data .elem_bits >> 4;
+    }
+
+    /* create output row */
+    for ( i = 0; i < row_len; ++ i )
+    {
+        for ( j = 0; j < argc; ++ j )
+        {
+            uint32_t k;
+            for ( k = 0; k < self -> src [ j ] . len; ++ k )
+            {
+                self -> dst . u . u16 [ self -> dst . off + k ] =
+                    self -> src [ j ] . u . u16 [ self -> src [ j ] . off + k ];
+            }
+
+            self -> dst . off += k;
+            self -> src [ j ] . off += k;
+        }
+    }
+    return rc;
+}
+
+static
+rc_t CC paste_func32 ( void *data, const VXformInfo *info, int64_t row_id,
+    const VFixedRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc = 0;
+    pastie *self = data;
+    uint32_t i, j, row_len = (uint32_t)rslt -> elem_count;
+    
+    assert(rslt -> elem_count >> 32 == 0);
+    /* populate "self" */
+    self -> dst . u . u32 = rslt -> base;
+    self -> dst . off = ((uint64_t)rslt -> first_elem) * (rslt -> elem_bits>>5);
+    for ( j = 0; j < argc; ++ j )
+    {
+        self -> src [ j ] . u . u32 = argv [ j ] . u . data .base;
+        self -> src [ j ] . off = ((uint64_t)argv [ j ] . u . data .first_elem) * (argv [ j ] . u . data .elem_bits >> 5);
+        self -> src [ j ] . len = argv [ j ] . u . data .elem_bits >> 5;
+    }
+
+    /* create output row */
+    for ( i = 0; i < row_len; ++ i )
+    {
+        for ( j = 0; j < argc; ++ j )
+        {
+            uint32_t k;
+            for ( k = 0; k < self -> src [ j ] . len; ++ k )
+            {
+                self -> dst . u . u32 [ self -> dst . off + k ] =
+                    self -> src [ j ] . u . u32 [ self -> src [ j ] . off + k ];
+            }
+
+            self -> dst . off += k;
+            self -> src [ j ] . off += k;
+        }
+    }
+    return rc;
+}
+
+static
+rc_t CC paste_func64 ( void *data, const VXformInfo *info, int64_t row_id,
+    const VFixedRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc = 0;
+    pastie *self = data;
+    uint32_t i, j, row_len = (uint32_t)rslt -> elem_count;
+    
+    assert(rslt -> elem_count >> 32 == 0);
+    /* populate "self" */
+    self -> dst . u . u64 = rslt -> base;
+    self -> dst . off = ((uint64_t)rslt -> first_elem) * (rslt -> elem_bits>>6);
+    for ( j = 0; j < argc; ++ j )
+    {
+        self -> src [ j ] . u . u64 = argv [ j ] . u . data .base;
+        self -> src [ j ] . off = ((uint64_t)argv [ j ] . u . data .first_elem) * (argv [ j ] . u . data .elem_bits >> 6);
+        self -> src [ j ] . len = argv [ j ] . u . data .elem_bits >> 6;
+    }
+
+    /* create output row */
+    for ( i = 0; i < row_len; ++ i )
+    {
+        for ( j = 0; j < argc; ++ j )
+        {
+            uint32_t k;
+            for ( k = 0; k < self -> src [ j ] . len; ++ k )
+            {
+                self -> dst . u . u64 [ self -> dst . off + k ] =
+                    self -> src [ j ] . u . u64 [ self -> src [ j ] . off + k ];
+            }
+
+            self -> dst . off += k;
+            self -> src [ j ] . off += k;
+        }
+    }
+    return rc;
+}
+
+static
+void CC vxf_paste_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+#include <stdio.h>
+
+/* paste
+ * function < type T > T [ * ] paste #1.0 ( T [ * ] in, ... );
+ * function any NCBI:paste #1.0 ( any in, ... );
+ */
+VTRANSFACT_IMPL ( vdb_paste, 1, 0, 0 ) ( const void *self,
+    const VXfactInfo *info, VFuncDesc *rslt,
+    const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    pastie *fself;
+    uint32_t rtn_bits, min_gcd;
+
+    /* in the case of the modern "paste", the compiler is able to
+       enforce only the function signature, but not the essential
+       requirement that the output dimension equal the sum of all
+       input dimensions. in the case of "NCBI:paste", the compiler
+       cannot enforce anything, so we check for inputs that have
+       the same domain and intrinsic type-size, already guaranteed
+       by the type-checked version. */
+    uint32_t i, sum;
+    for ( i = sum = 0; i < dp -> argc; ++ i )
+    {
+        assert ( dp -> argv [ i ] . fd . td . dim != 0 );
+
+        /* handle type-checking for NCBI:paste */
+        if ( dp -> argv [ i ] . desc . domain != info -> fdesc . desc . domain ||
+             dp -> argv [ i ] . desc . intrinsic_bits != info -> fdesc . desc . intrinsic_bits )
+        {
+            return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+        }
+
+        sum += dp -> argv [ i ] . desc . intrinsic_dim;
+    }
+
+    assert ( info -> fdesc . fd . td . dim != 0 );
+    if ( sum > info -> fdesc . desc . intrinsic_dim )
+        return RC ( rcXF, rcFunction, rcConstructing, rcArgv, rcExcessive );
+
+    if ( sum < info -> fdesc . desc . intrinsic_dim )
+        return RC ( rcXF, rcFunction, rcConstructing, rcArgv, rcInsufficient );
+
+    /* allocate self */
+    fself = malloc ( sizeof * fself - sizeof fself -> src + sizeof fself -> src [ 0 ] * dp -> argc );
+    if ( fself == NULL )
+        return RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+
+    /* we can create the function */
+    rslt -> self = fself;
+    rslt -> whack = vxf_paste_wrapper;
+    rslt -> variant = vftFixedRow;
+
+    /* the output dimension == sum ( dimension ) for all inputs
+       each input dimension will have a GCD of sizeof ( element ) * N
+       for N = 1 .. output dimension. the minimum of these will determine
+       the common copy word size */
+    rtn_bits = VTypedescSizeof ( & info -> fdesc . desc );
+    for ( min_gcd = rtn_bits, i = 0; i < dp -> argc; ++ i )
+    {
+        uint32_t gcd, a, b = VTypedescSizeof ( & dp -> argv [ i ] . desc );
+        for ( a = rtn_bits; ; )
+        {
+            if ( b == 0 )
+            {
+                gcd = a;
+                break;
+            }
+
+            a %= b;
+            if ( a == 0 )
+            {
+                gcd = b;
+                break;
+            }
+
+            b %= a;
+        }
+
+        if ( gcd < min_gcd )
+            min_gcd = gcd;
+    }
+
+    /* select the copy word size */
+    if ( ( min_gcd & 63 ) == 0 )
+        rslt -> u . pf = paste_func64;
+    else if ( ( min_gcd & 31 ) == 0 )
+        rslt -> u . pf = paste_func32;
+    else if ( ( min_gcd & 15 ) == 0 )
+        rslt -> u . pf = paste_func16;
+    else if ( ( min_gcd & 7 ) == 0 )
+        rslt -> u . pf = paste_func8;
+    else
+        rslt -> u . pf = paste_func1;
+
+    return 0;
+}
diff --git a/libs/vxf/rand_4na_2na.c b/libs/vxf/rand_4na_2na.c
new file mode 100644
index 0000000..e8feaac
--- /dev/null
+++ b/libs/vxf/rand_4na_2na.c
@@ -0,0 +1,200 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <arch-impl.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <sysalloc.h>
+#include <time.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+#if 1
+static struct {
+	uint8_t num_bits;
+	uint8_t val[4];
+} map[16] = {
+
+#if WE_SECRETLY_MEANT_4NA_BY_2NA
+#define A 1
+#define C 2
+#define G 4
+#define T 8
+#else
+#define A 0
+#define C 1
+#define G 2
+#define T 3
+#endif
+/*0000*/{4,{A,C,G,T}}, 
+/*0001*/{1,{A}},
+/*0010*/{1,{C}},
+/*0011*/{2,{A,C}},
+/*0100*/{1,{G}},
+/*0101*/{2,{A,G}},
+/*0110*/{2,{C,G}},
+/*0111*/{3,{A,C,G}},
+/*1000*/{1,{T}},
+/*1001*/{2,{A,T}},
+/*1010*/{2,{C,T}},
+/*1011*/{3,{A,C,T}},
+/*1100*/{2,{G,T}},
+/*1101*/{3,{A,G,T}},
+/*1110*/{3,{C,G,T}},
+/*1111*/{4,{A,C,G,T}}
+#undef A
+#undef C
+#undef G
+#undef T
+};
+
+static uint8_t randomize_ambiguity(uint8_t base, unsigned *seed, bool *reseed) {
+    assert(base < 16);
+    
+    if (map[base].num_bits == 1) {
+        base = map[base].val[0];
+        *seed = (*seed << 2) | base;
+        *reseed = true;
+        return base;
+    }
+    else {        
+        unsigned int rval;
+        unsigned int num_bits = map [ base ] . num_bits;
+        
+        if (*reseed)
+        {
+            *reseed = false;
+            srand(*seed);
+        }
+        rval = ( unsigned int ) ( ( ( uint64_t ) rand () * num_bits ) / RAND_MAX );
+
+        if ( rval >= num_bits)
+            return map[base].val[rval % num_bits];
+
+        return map[base].val[rval];
+    }
+}
+#else
+typedef uint8_t dna4na_t;
+
+static const bool isExact[16]
+  = { 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+static const struct { dna4na_t val[12]; } possibleBase[16] = {
+    {{ 1, 2, 4, 8, 1, 2, 4, 8, 1, 2, 4, 8 }}, /* 0000 1 2 4 8 */
+    {{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }}, /* 0001 1 */
+    {{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }}, /* 0010 2 */
+    {{ 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 }}, /* 0011 1 2 */
+    {{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }}, /* 0100 4 */
+    {{ 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4 }}, /* 0101 1 4 */
+    {{ 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4 }}, /* 0110 2 4 */
+    {{ 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4 }}, /* 0111 1 2 4 */
+    {{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }}, /* 1000 8 */
+    {{ 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8 }}, /* 1001 1 8 */
+    {{ 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8 }}, /* 1010 2 8 */
+    {{ 1, 2, 8, 1, 2, 8, 1, 2, 8, 1, 2, 8 }}, /* 1011 1 2 8 */
+    {{ 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8 }}, /* 1100 4 8 */
+    {{ 1, 4, 8, 1, 4, 8, 1, 4, 8, 1, 4, 8 }}, /* 1101 1 4 8 */
+    {{ 2, 4, 8, 2, 4, 8, 2, 4, 8, 2, 4, 8 }}, /* 1110 2 4 8 */
+    {{ 1, 2, 4, 8, 1, 2, 4, 8, 1, 2, 4, 8 }}  /* 1111 1 2 4 8 */
+};
+
+static uint8_t randomize_ambiguity(uint8_t base, unsigned *seed, bool *reseed) {
+    assert(base < 16);
+    
+    if (isExact[base]) {
+        typedef uint8_t dna2na_t;
+        
+        static const dna2na_t map4na2na[16]
+        = { 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 };
+        
+        *seed = (*seed << 2) | map4na2na[base];
+        *reseed = true;
+        return base;
+    }
+    else {
+        unsigned rval;
+        
+        if (*reseed) {
+            *reseed = false;
+            srand(*seed);
+        }
+        rval = ((uint8_t)(rand() / (RAND_MAX >> 8))) % 12;
+        assert(rval < 12);
+        return possibleBase[base].val[rval];
+    }
+}
+#endif
+
+
+static
+rc_t CC rand_4na_2na_impl  ( void *data,
+    const VXformInfo *info, int64_t row_id, VRowResult *rslt,
+    uint32_t argc, const VRowData argv [] )
+{
+    unsigned seed = time( NULL ) + row_id;
+    bool reseed = true;
+    uint8_t *dst;
+    const uint8_t *src = argv [ 0 ] . u . data . base;
+    rc_t	rc;
+    KDataBuffer *dst_buf = rslt -> data;
+    
+    src += argv[0].u.data.first_elem;
+    rslt->elem_count = argv[0].u.data.elem_count;
+    assert(dst_buf -> elem_bits == 8 );
+#if 0
+    rslt->no_cache = true; /** do not cache randomized data **/
+#endif
+    rc = KDataBufferResize ( dst_buf, rslt->elem_count );
+    if( rc == 0 ){
+	    int i,last;
+	    dst = dst_buf -> base;
+
+	    for ( last = rslt -> elem_count; last >  0 && src[last-1] == 15; last --){} /** find run of Ns from the right **/
+	    if  ( rslt -> elem_count - last < 5) last = rslt -> elem_count; /*** discard not so large run of Ns ***/
+	    
+	    for ( i = 0; i < last ; ++ i )
+		dst[i] = randomize_ambiguity(src[i], &seed, &reseed);
+	    for ( ; i < rslt -> elem_count; ++ i ) /** large run of Ns from the right is set to As, not randomized  **/
+		dst[i] = 0;
+    }
+    return rc;
+}
+
+
+VTRANSFACT_IMPL ( INSDC_SEQ_rand_4na_2na, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> self = NULL;
+    rslt -> whack = NULL;
+    rslt -> u . ndf = rand_4na_2na_impl;
+    rslt -> variant = vftNonDetRow;
+
+    return 0;
+}
diff --git a/libs/vxf/rldecode.c b/libs/vxf/rldecode.c
new file mode 100644
index 0000000..5cffbc6
--- /dev/null
+++ b/libs/vxf/rldecode.c
@@ -0,0 +1,155 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <assert.h>
+
+enum header_flags {
+	zero_run = 0,
+	one_run = 1,
+	byte_run = 2,
+	uncompressed = 3
+};
+
+static int decode(uint8_t *dst, unsigned dsize, const uint8_t src[], unsigned ssize) {
+    int st, type;
+    unsigned size, i, j;
+    
+    for (st = type = 0, i = j = size = 0; i != ssize; ++i) {
+        int x = src[i];
+        
+        switch (st) {
+        case 0:
+            type = x >> 6;
+            size = x & 0x1F;
+            if ((x & 0x20) == 0)
+                goto DECODED;
+            st = 1;
+            break;
+        case 1:
+            size = (size << 7) | (x & 0x7F);
+            if ((x & 0x80) == 0)
+                goto DECODED;
+            st = 2;
+            break;
+        case 2:
+            size = (size << 7) | (x & 0x7F);
+            if ((x & 0x80) == 0)
+                goto DECODED;
+            st = 3;
+            break;
+        case 3:
+            size = (size << 7) | (x & 0x7F);
+            if ((x & 0x80) == 0)
+                goto DECODED;
+            return 1;
+        case 4:
+            dst[j++] = x;
+            if (--size == 0)
+                st = 0;
+            break;
+        case 5:
+            memset(dst + j, x, size);
+            j += size;
+            st = 0;
+            break;
+        }
+        continue;
+    DECODED:
+        if (j + size > dsize)
+            return 1;
+        switch (type) {
+        case uncompressed:
+            if (size == 0) {
+                size = ssize - i - 1;
+                if (j + size > dsize)
+                    return 1;
+                memmove(dst + j, src + i + 1, size);
+                return 0;
+            }
+            st = 4;
+            break;
+        case zero_run:
+            memset(dst + j, 0, size);
+            j += size;
+            st = 0;
+            break;
+        case one_run:
+            memset(dst + j, 0xFF, size);
+            j += size;
+            st = 0;
+            break;
+        default:
+            st = 5;
+            break;
+        }
+    }
+    return 0;
+}
+
+static
+rc_t CC rldecode_func(
+                   void *Self,
+                   const VXformInfo *info,
+                   VBlobResult *dst,
+                   const VBlobData *src,
+                   VBlobHeader *hdr
+) {
+    int rslt;
+    
+    rslt = decode(dst->data, (unsigned)(((size_t)dst->elem_count * dst->elem_bits + 7) >> 3),
+                  src->data, (unsigned)(((size_t)src->elem_count * src->elem_bits + 7) >> 3));
+    if (rslt)
+        return RC(rcVDB, rcFunction, rcExecuting, rcData, rcCorrupt);
+    return 0;
+}
+
+/* vdb:rldecode
+ * function any rldecode #1.0 ( rle_fmt in )
+ */
+VTRANSFACT_IMPL(vdb_rldecode, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftBlob;
+    rslt->u.bf = rldecode_func;
+    
+    return 0;
+}
+
+#if TESTING
+int rld_test(void *dst, unsigned dsize, const void *src, unsigned ssize) {
+    return decode(dst, dsize, src, ssize);
+}
+#endif
diff --git a/libs/vxf/rlencode.c b/libs/vxf/rlencode.c
new file mode 100644
index 0000000..c81b0a5
--- /dev/null
+++ b/libs/vxf/rlencode.c
@@ -0,0 +1,262 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <assert.h>
+
+enum header_flags {
+	zero_run = 0,
+	one_run = 1,
+	byte_run = 2,
+	uncompressed = 3
+};
+
+#define SPECIAL ((uncompressed) << 6)
+
+#define MAX_RUN_LEN ((size_t)(((size_t)1) << (5 + 3 * 7)))
+#define HEAD_SIZE (4)
+
+static __inline__
+unsigned LENGTH_SIZE(size_t len) {
+    return len < 1 ? 0 : len < 1UL << 6 ? 1 : len < 1UL << 13 ? 2 : len < 1UL << 20 ? 3 : len < 1UL << 27 ? 4 : 0;
+}
+
+static __inline__
+int OUTPUT_SIZE(int type, int len) {
+    switch (type) {
+    case zero_run:
+    case one_run:
+        return LENGTH_SIZE(len);
+    case byte_run:
+        return LENGTH_SIZE(len) + 1;
+    case uncompressed:
+        return LENGTH_SIZE(len) + len;
+    default:
+        return len + 1;
+    }
+}
+
+static __inline__
+int f_HEADER(uint8_t HEAD[], uint8_t FLAG, int rlen) {
+    if (rlen < 1UL << 5) {
+        HEAD[0] = (FLAG << 6) | rlen;
+        return 1;
+    }
+    if (rlen < 1UL << 12) {
+        HEAD[0] = (FLAG << 6) | (1 << 5) | (rlen >> 7);
+        HEAD[1] =                           rlen         & 0x7F;
+        return 2;
+    }
+    if (rlen < 1UL << 19) {
+        HEAD[0] = (FLAG << 6) | (1 << 5) | ( rlen >> 14);
+        HEAD[1] =               (1 << 7) | ((rlen >>  7) & 0x7F);
+        HEAD[2] =                            rlen        & 0x7F;
+        return 3;
+    }
+        HEAD[0] = (FLAG << 6) | (1 << 5) | ( rlen >> 21);
+        HEAD[1] =               (1 << 7) | ((rlen >> 14) & 0x7F);
+        HEAD[2] =               (1 << 7) | ((rlen >>  7) & 0x7F);
+        HEAD[3] =                            rlen        & 0x7F;
+        return 4;
+}
+
+#define HEADER(Y, HEAD, FLAG, LEN) Y = f_HEADER(HEAD, FLAG, LEN)
+
+static __inline__ int rle_write(uint8_t *dst, const uint8_t *dend, const uint8_t *src, int type, size_t len) {
+	uint8_t head[HEAD_SIZE + 1];
+	int i = 0;
+	
+	if (type == SPECIAL) {
+		if (dst + len + 1 > dend)
+			return 0;
+
+		*dst++ = SPECIAL;
+		memmove(dst, src, len);
+		return (int)len + 1;
+	}
+    if (len >= MAX_RUN_LEN) {
+        i = rle_write(dst, dend, src, type, len >> 1);
+        if (i == 0)
+            return 0;
+        if (type == uncompressed)
+            src += len >> 1;
+        return i + rle_write(dst + i, dend, src, type, len - (len >> 1));
+    }
+	
+	HEADER(i, head, type, (int)len);
+
+	if (type == byte_run)
+		++i;
+	if (dst + i > dend)
+		return 0;
+	switch (type) {
+    case byte_run:
+        head[i - 1] = *src;
+    case zero_run:
+    case one_run:
+        memmove(dst, head, i);
+        return i;
+    default:
+        break;
+	}
+	if (dst + i + len > dend)
+		return 0;
+	memmove(dst, head, i);
+	memmove(dst + i, src, len);
+	return i + (int)len;
+}
+
+#define WRITE(SRC, TYPE, END) do { \
+    int i; \
+    i = rle_write(dst, dend, (SRC), (TYPE), (END) - (SRC)); \
+    if (i == 0) { \
+        i = rle_write(dst, dend, (SRC), SPECIAL, send - (SRC)); \
+        if (i == 0) { \
+            return -1; \
+        } \
+    } \
+    dst += i; \
+} while(0)
+
+static int encode(uint8_t *Dst, unsigned dsize, unsigned *psize, const uint8_t *src, unsigned ssize) {
+    uint8_t *dst = Dst;
+	const uint8_t *const dend = dst + dsize;
+	const uint8_t *const send = src + ssize;
+	const uint8_t *cp = src, *mark = NULL;
+	uint8_t last;
+	int type;
+    unsigned size1, size2, size3;
+	
+	while (last = *cp, ++cp != send) {
+		if (*cp == last) {
+			if (mark == NULL)
+				mark = cp - 1;
+			else
+				continue;
+		}
+		else {
+			if (mark == NULL)
+				continue;
+			if (mark != src) {
+				if (mark - src == 1) {
+					if (*src == 0)
+						type = zero_run;
+					else if (*src == 0xFF)
+						type = one_run;
+					else
+						type = uncompressed;
+				}
+				else
+					type = uncompressed;
+				size1 = OUTPUT_SIZE(type, (int)( mark - src ) );
+				size2 = OUTPUT_SIZE(*mark == 0 ? zero_run : *mark == 0xFF ? one_run : byte_run, (int)(cp - mark) );
+				size3 = OUTPUT_SIZE(uncompressed, (int)(cp - src) );
+				if (size1 + size2 >= size3) {
+					mark = NULL;
+					continue;
+				}
+				WRITE(src, type, mark);
+			}
+			WRITE(mark, *mark == 0 ? zero_run : *mark == 0xFF ? one_run : byte_run, cp);
+			mark = NULL;
+			src = cp;
+		}
+	}
+	if (src != cp) {
+		if (mark == NULL)
+			WRITE(src, SPECIAL, cp);
+		else {
+			if (mark != src) {
+				if (mark - src == 1) {
+					if (*src == 0)
+						type = zero_run;
+					else if (*src == 0xFF)
+						type = one_run;
+					else
+						type = uncompressed;
+				}
+				else
+					type = uncompressed;
+				WRITE(src, type, mark);
+			}
+			WRITE(mark, *mark == 0 ? zero_run : *mark == 0xFF ? one_run : byte_run, cp);
+		}
+	}
+    *psize = (unsigned)(dst - Dst);
+	return 0;
+}
+
+static
+rc_t CC rlencode_func(
+              void *Self,
+              const VXformInfo *info,
+              VBlobResult *dst,
+              const VBlobData *src,
+              VBlobHeader *hdr
+) {
+    unsigned sz;
+    int rc;
+    
+    VBlobHeaderSetVersion(hdr, 0);
+    rc = encode(dst->data, (unsigned)(((size_t)dst->elem_count * dst->elem_bits + 7) >> 3), &sz,
+                src->data, (unsigned)(((size_t)src->elem_count * src->elem_bits + 7) >> 3));
+    if (rc)
+        return RC(rcVDB, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+    dst->elem_bits = 1;
+    dst->byte_order = vboNone;
+    dst->elem_count = sz << 3;
+
+    return 0;
+}
+
+/* vdb:rlencode
+ * function rle_fmt rlencode #1.0 ( any in )
+ */
+VTRANSFACT_IMPL(vdb_rlencode, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftBlob;
+    rslt->u.bf = rlencode_func;
+    
+    return 0;
+}
+
+#if TESTING
+int rle_test(void *dst, unsigned dsize, const void *src, unsigned ssize) {
+    unsigned dummy;
+    return encode(dst, dsize, &dummy, src, ssize);
+}
+#endif
+
diff --git a/libs/vxf/round.c b/libs/vxf/round.c
new file mode 100644
index 0000000..8d74830
--- /dev/null
+++ b/libs/vxf/round.c
@@ -0,0 +1,49 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <compiler.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <math.h>
+
+#define FLOAT_FUNC roundf
+#define DOUBLE_FUNC round
+#include "math-funcs-impl.h"
+
+/*
+ function < type T >
+ T vdb:round #1.0 ( T in );
+ */
+VTRANSFACT_IMPL(vdb_round, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp ) {
+    return factory(self, info, rslt, cp, dp);
+}
diff --git a/libs/vxf/simple-sub-select.c b/libs/vxf/simple-sub-select.c
new file mode 100644
index 0000000..049aa76
--- /dev/null
+++ b/libs/vxf/simple-sub-select.c
@@ -0,0 +1,293 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+
+
+#include <klib/rc.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <insdc/sra.h>
+#include <insdc/insdc.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+typedef struct SubSelect SubSelect;
+struct SubSelect
+{
+    const VCursor *curs;
+    uint32_t idx;
+    const VCursor *native_curs; /** Native cursors are either master cursor or sub_cursors - no need to AddRef **/
+    bool  first_time;
+    char  *col_name;
+    uint32_t col_name_len;
+};
+
+static
+rc_t CC simple_sub_select ( void *data, const VXformInfo *info,
+    int64_t local_row_id, VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    const SubSelect *self = ( const void* ) data;
+
+    rc_t rc;
+    const void *base;
+    uint32_t elem_bits, boff, row_len;
+    int32_t  idx=0; /*** 0 - means no index ***/
+
+    const int64_t *remote_row_id = argv [ 0 ] . u . data . base;
+    remote_row_id += argv [ 0 ] . u . data . first_elem;
+
+    assert ( argv [ 0 ] . u . data . elem_bits == 64 );
+    if(argv [ 0 ] . u . data . elem_count == 0){/** alow empty returns ***/
+        rc = KDataBufferResize ( rslt -> data, 0 );
+        rslt -> elem_count = 0;
+        return 0;
+    }
+    assert ( argv [ 0 ] . u . data . elem_count == 1 );
+    if(argc > 1 ){
+    	const int32_t *remote_idx = argv[1].u.data.base;
+        idx=remote_idx[argv[1].u.data.first_elem];
+    }
+    if(self->native_curs && self->first_time){ /*** can we use native cursor for the data? ***/
+        SubSelect *mself = (SubSelect *)self;
+        uint32_t idx;
+        rc = VCursorAddColumn ( mself->native_curs, & idx, "%.*s", mself->col_name_len, mself->col_name );
+        if(rc == 0 || GetRCState(rc) == rcExists){
+            VCursorRelease( mself->curs);
+            mself->curs = mself->native_curs;
+            mself->idx  = idx;
+        }
+        mself->first_time = false;
+        rc = 0; /** reset rc? **/
+    }
+	
+    /* sub-select */
+    rc = VCursorCellDataDirect ( self -> curs, * remote_row_id, self -> idx,
+                                 & elem_bits, & base, & boff, & row_len );
+    if ( rc == 0 )
+    {
+        uint8_t *cbase=(uint8_t*)base + (boff>>3);
+        rslt -> data -> elem_bits = elem_bits;
+        if(idx < 0 || idx > row_len){ /** out of bounds **/
+            rc = KDataBufferResize ( rslt -> data, 0 );
+            rslt -> elem_count = 0;
+            return rc;
+        } else if (idx > 0){ /*** do subset ***/
+            row_len=1;
+            cbase += (elem_bits>>3)*(idx-1);
+            boff  += elem_bits * (idx-1);
+        }
+	
+        rc = KDataBufferResize ( rslt -> data, row_len );
+        if ( rc == 0 )
+        {
+            bitsz_t bits = ( bitsz_t ) elem_bits * row_len;
+
+            if ( ( elem_bits & 7 ) != 0 )
+                bitcpy ( rslt -> data -> base, 0, base, boff, bits );
+            else{
+                assert((boff&7)==0);
+                memmove ( rslt -> data -> base, cbase, bits>>3 );
+            }	
+
+            rslt -> elem_count = row_len;
+        }
+    }
+    else if ( GetRCState ( rc ) == rcNotFound )
+    {
+        rc = KDataBufferResize ( rslt -> data, 0 );
+        rslt -> elem_count = 0;
+    }
+
+    return rc;
+}
+
+
+/* open_sub_cursor
+ */
+static
+rc_t open_sub_cursor ( SubSelect **fself, const VXfactInfo *info, const VFactoryParams *cp, const VCursor *native_curs )
+{
+    rc_t rc=0;
+    const VTable *tbl, *ftbl = NULL;
+    char name[256]="";
+    const VCursor *curs;
+
+    if ( cp -> argv [ 0 ] . count > 0 )
+    {
+        sprintf(name,"%.*s",(int)cp->argv[0].count,cp->argv[0].data.ascii);
+        rc = VCursorLinkedCursorGet(native_curs,name,&curs);
+        if(rc == 0)
+        {
+            /* curs is an owned reference */
+            rc = VCursorOpenParentRead(curs,&ftbl);
+            if(rc != 0)
+            {
+                VCursorRelease ( curs );
+                return rc;
+            }
+            tbl = ftbl;
+        }
+        else
+        {
+            const VDatabase *db;
+            uint64_t cache_size = 32*1024*1024;
+            uint64_t native_cursor_cache_size = VCursorGetCacheCapacity(native_curs);
+
+            rc = VTableOpenParentRead ( info -> tbl, & db );
+            if(rc != 0) return rc;
+            rc = VDatabaseOpenTableRead ( db, & ftbl, "%s", name);
+            if(rc != 0) return rc;
+            VDatabaseRelease ( db );
+            tbl = ftbl;
+            if(native_cursor_cache_size/4 > cache_size){
+                /* share cursor size with native cursor **/
+                cache_size = native_cursor_cache_size/4;
+                native_cursor_cache_size -= cache_size;
+                VCursorSetCacheCapacity((VCursor*)native_curs,native_cursor_cache_size);
+            }
+            rc = VTableCreateCachedCursorRead ( tbl, (const VCursor**)& curs, cache_size ); /*** some random io is expected ***/
+            if(rc != 0) return rc;
+            rc = VCursorPermitPostOpenAdd( curs );
+            if(rc != 0) return rc;
+            rc = VCursorOpen( curs );
+            if(rc != 0) return rc;
+            rc = VCursorLinkedCursorSet(native_curs,name,curs);
+            if(rc != 0) return rc;
+        }
+        native_curs = NULL;
+    }
+    else /** we don't know if native_curs permits adding columns **/
+    {
+        tbl = info -> tbl;
+        rc = VTableCreateCachedCursorRead ( tbl, & curs, 0 ); /*** some random io is expected ***/
+    }
+    if ( rc == 0 )
+    {
+        uint32_t idx;
+        rc = VCursorAddColumn ( curs, & idx, "%.*s",
+                                ( int ) cp -> argv [ 1 ] . count, cp -> argv [ 1 ] . data . ascii );
+        if ( rc == 0 || GetRCState(rc) == rcExists)
+        {
+            rc = VCursorOpen ( curs );
+            if ( rc == 0 )
+            {
+                VTypedesc src;
+                rc = VCursorDatatype ( curs, idx, NULL, & src );
+                if ( rc == 0 )
+                {
+                    /* selected column should have same characteristics */
+                    if ( src . domain != info -> fdesc . desc . domain                 ||
+                         src . intrinsic_bits != info -> fdesc . desc . intrinsic_bits ||
+                         src . intrinsic_dim != info -> fdesc . desc. intrinsic_dim )
+                    {
+                        rc = RC ( rcXF, rcFunction, rcConstructing, rcType, rcInconsistent );
+                    }
+                    else
+                    {
+                        SubSelect *self = malloc ( sizeof * self );
+                        if ( self == NULL )
+                            rc = RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+                        else
+                        {
+                            self -> curs = curs;
+                            self -> idx = idx;
+                            self->native_curs = native_curs;
+                            self->first_time  = true;
+                            self->col_name_len  = cp->argv[1].count;
+                            self->col_name = malloc(self->col_name_len);
+                            memmove(self->col_name,cp->argv[1].data.ascii,self->col_name_len);
+                            * fself = self;
+                            if ( ftbl != NULL )
+                                VTableRelease ( ftbl );
+                            return 0;
+                        }
+                    }
+                }
+            }
+        }
+        VCursorRelease ( curs );
+    }
+    if ( ftbl != NULL )
+        VTableRelease ( ftbl );
+
+    return rc;
+}
+
+
+/* close_sub_cursor
+ */
+static
+void CC close_sub_cursor ( void *data )
+{
+    SubSelect *self = data;
+    if(self->curs != self->native_curs) VCursorRelease ( self -> curs );
+    free ( self->col_name);
+    free ( self );
+}
+
+
+/* 
+ * function < type T >
+ * T simple_sub_select < ascii tbl, ascii col > ( I64 row * I32 elem_idx(1-based) )
+ *     = vdb:simple_sub_select;
+ */
+VTRANSFACT_IMPL ( vdb_simple_sub_select_1, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    SubSelect *fself;
+
+    assert ( cp -> argc == 2 );
+    assert ( dp -> argc == 1 || dp -> argc == 2);
+
+    rc = open_sub_cursor ( & fself, info, cp, (const VCursor*)info->parms );
+    if ( rc == 0 )
+    {
+        rslt -> self = fself;
+        rslt -> u . rf = simple_sub_select;
+        rslt -> variant = vftRow;
+        rslt -> whack = close_sub_cursor;
+    }
+
+    return rc;
+}
+
+VTRANSFACT_IMPL ( vdb_simple_sub_select, 0, 9, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    return VTRANSFACT_NAME ( vdb_simple_sub_select_1 ) ( self, info, rslt, cp, dp );
+}
diff --git a/libs/vxf/sprintf.c b/libs/vxf/sprintf.c
new file mode 100644
index 0000000..bcd9de7
--- /dev/null
+++ b/libs/vxf/sprintf.c
@@ -0,0 +1,1280 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+
+/* the number of PrintFmt, PrintArg and String
+   elements to allocate in function-local storage */
+#define LOCAL_FMT_COUNT 64
+
+
+typedef struct Sprintf Sprintf;
+struct Sprintf
+{
+    const PrintFmt *fmt;
+    PrintArg *args;
+    String *str;
+};
+
+static uint8_t const radix2_size [ 4 ] = { 8, 16, 32, 64 };
+static uint8_t const radix8_size [ 4 ] = { 3, 6, 11, 22 };
+static uint8_t const radix10_size [ 4 ] = { 3, 5, 10, 20 };
+static uint8_t const radix16_size [ 4 ] = { 2, 4, 8, 16 };
+
+#if _DEBUGGING
+static
+rc_t validate_obj ( const Sprintf *obj, bool fmt_only )
+{
+    uint32_t i;
+
+    /* validate the format blocks */
+    for ( i = 0; obj -> fmt [ i ] . type != sptTerm; ++ i )
+    {
+        /* at this point, only looking for bad formats */
+        if ( obj -> fmt [ i ] . type == sptLiteral )
+        {
+            if ( obj -> fmt [ i ] . u . l . text == NULL )
+                return RC ( rcXF, rcFunction, rcConstructing, rcString, rcNull );
+            if ( obj -> fmt [ i ] . u . l . size == 0 )
+                return RC ( rcXF, rcFunction, rcConstructing, rcString, rcEmpty );
+            if ( string_chr ( obj -> fmt [ i ] . u . l . text, obj -> fmt [ i ] . u . l . size, 0 ) != NULL )
+                return RC ( rcXF, rcFunction, rcConstructing, rcString, rcInvalid );
+        }
+    }
+
+    return 0;
+}
+#endif
+
+static
+size_t get_radix_size ( const PrintFmt *fmt, uint32_t selector )
+{
+    const uint8_t *radix_size;
+    switch ( fmt -> radix )
+    {
+    case 0:
+        return 0;
+    case 10:
+        radix_size = radix10_size;
+        break;
+    case 16:
+        radix_size = radix16_size;
+        break;
+    case 8:
+        radix_size = radix8_size;
+        break;
+    default:
+        radix_size = radix2_size;
+    }
+    return radix_size [ selector ];
+}
+
+typedef struct FuncArgs FuncArgs;
+struct FuncArgs
+{
+    const VRowData *argv;
+    uint32_t argc;
+    uint32_t idx;
+};
+
+static
+const void *access_cell_data ( FuncArgs *args, uint64_t *row_len, size_t *size )
+{
+    size_t elem_bytes;
+    const uint8_t *data;
+
+    if ( args -> idx == args -> argc )
+        return NULL;
+
+    elem_bytes = args -> argv [ args -> idx ] . u . data . elem_bits / 8;
+    assert ( elem_bytes * 8 == args -> argv [ args -> idx ] . u . data . elem_bits );
+
+    data = args -> argv [ args -> idx ] . u . data . base;
+    * row_len = args -> argv [ args -> idx ] . u . data . elem_count;
+
+    data += args -> argv [ args -> idx ] . u . data . first_elem * elem_bytes;
+
+    if ( size != NULL )
+        * size = ( size_t ) ( * row_len * elem_bytes );
+
+    ++ args -> idx;
+    return data;
+}
+
+static
+rc_t capture_uint_scalar ( FuncArgs *args, uint64_t *val )
+{
+    uint64_t row_len;
+    const void *data = access_cell_data ( args, & row_len, NULL );
+
+    if ( data == NULL )
+        return RC ( rcXF, rcFunction, rcExecuting, rcData, rcNull );
+
+    if ( row_len != 1 )
+        return RC ( rcXF, rcFunction, rcExecuting, rcRange, rcExcessive );
+
+    switch ( args -> argv [ args -> idx - 1 ] . u . data . elem_bits )
+    {
+    case 8:
+        * val = * ( const uint8_t* ) data;
+        break;
+    case 16:
+        * val = * ( const uint16_t* ) data;
+        break;
+    case 32:
+        * val = * ( const uint32_t* ) data;
+        break;
+    case 64:
+        * val = * ( const uint64_t* ) data;
+        break;
+    }
+
+    return 0;
+}
+
+static
+rc_t CC sprintf_func ( void *obj,
+     const VXformInfo *info, int64_t row_id, VRowResult *rslt,
+     uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    size_t cell_size;
+    uint32_t str_idx, fmt_idx, arg_idx;
+
+    Sprintf *self = obj;
+
+    const PrintFmt *fmt = self -> fmt;
+    PrintArg *args = self -> args;
+    String *str = self -> str;
+
+    FuncArgs vargs;
+    vargs . argv = argv;
+    vargs . argc = argc;
+    vargs . idx = 0;
+
+    str_idx = fmt_idx = arg_idx = 0;
+
+#if _DEBUGGING
+    rc = validate_obj ( self, false );
+    if ( rc != 0 )
+        KDbgMsg ( "%s - self is bad on entry: %R\n", __func__, rc );
+#endif
+
+    /* initial pass - prepare argument list & estimate cell size */
+    for ( rc = 0, cell_size = 0; fmt [ fmt_idx ] . type != sptTerm; ++ fmt_idx )
+    {
+        size_t arg_size;
+        bool check_index;
+        uint64_t row_len, start_idx, select_len;
+        uint32_t ext_start_index, ext_stop_index;
+
+        row_len = 0;
+
+        /* test for external field width, precision, index */
+        if ( fmt [ fmt_idx ] . ext_field_width )
+        {
+            rc = capture_uint_scalar ( & vargs, & args [ arg_idx ++ ] . u );
+            if ( rc != 0 )
+                return rc;
+        }
+        if ( fmt [ fmt_idx ] . ext_precision )
+        {
+            rc = capture_uint_scalar ( & vargs, & args [ arg_idx ++ ] . u );
+            if ( rc != 0 )
+                return rc;
+        }
+
+        if ( ! fmt [ fmt_idx ] . ext_start_index )
+            start_idx = fmt [ fmt_idx ] . u . f . start_idx;
+        else
+        {
+            /* if the start index is the last in vector,
+               this needs to be suspended until later */
+            if ( ! fmt [ fmt_idx ] . inf_start_index )
+            {
+                rc = capture_uint_scalar ( & vargs, & start_idx );
+                if ( rc != 0 )
+                    return rc;
+                args [ arg_idx ] . u = start_idx;
+            }
+
+            ext_start_index = arg_idx ++;
+        }
+
+        if ( ! fmt [ fmt_idx ] . ext_stop_index && ! fmt [ fmt_idx ] . ext_select_len )
+            select_len = fmt [ fmt_idx ] . u . f . select_len;
+        else
+        {
+            /* if the stop index is the last in vector,
+               this needs to be suspended until later */
+            if ( ! fmt [ fmt_idx ] . inf_stop_index )
+            {
+                rc = capture_uint_scalar ( & vargs, & select_len );
+                if ( rc != 0 )
+                    return rc;
+                args [ arg_idx ] . u = select_len;
+            }
+            ext_stop_index = arg_idx ++;
+        }
+
+        /* make an estimate of the bytes needed by sprintf engine for argument
+           get row_len at the same time */
+        check_index = false;
+        switch ( fmt [ fmt_idx ] . type )
+        {
+        case sptLiteral:                     /* char literal        - arg in fmt   */
+            assert ( fmt [ fmt_idx ] . u . l . text != NULL );
+            arg_size = fmt [ fmt_idx ] . u . l . size;
+            row_len = arg_size;
+            -- arg_idx;
+            break;
+        case sptSignedInt8Vect:              /* signed vector int   - arg is d8    */
+            args [ arg_idx ] . d8 = access_cell_data ( & vargs, & row_len, NULL );
+            arg_size = get_radix_size ( & fmt [ fmt_idx ], 0 ) + 1;
+            break;
+        case sptSignedInt16Vect:             /* signed vector int   - arg is d16   */
+            args [ arg_idx ] . d16 = access_cell_data ( & vargs, & row_len, NULL );
+            arg_size = get_radix_size ( & fmt [ fmt_idx ], 1 ) + 1;
+            break;
+        case sptSignedInt32Vect:             /* signed vector int   - arg is d32   */
+            args [ arg_idx ] . d32 = access_cell_data ( & vargs, & row_len, NULL );
+            arg_size = get_radix_size ( & fmt [ fmt_idx ], 2 ) + 1;
+            break;
+        case sptSignedInt64Vect:             /* signed vector int   - arg is d64   */
+            args [ arg_idx ] . d64 = access_cell_data ( & vargs, & row_len, NULL );
+            arg_size = get_radix_size ( & fmt [ fmt_idx ], 3 ) + 1;
+            break;
+        case sptUnsignedInt8Vect:            /* unsigned vector int - arg is u8    */
+            args [ arg_idx ] . u8 = access_cell_data ( & vargs, & row_len, NULL );
+            arg_size = get_radix_size ( & fmt [ fmt_idx ], 0 ) + 2;
+            break;
+        case sptUnsignedInt16Vect:           /* unsigned vector int - arg is u16   */
+            args [ arg_idx ] . u16 = access_cell_data ( & vargs, & row_len, NULL );
+            arg_size = get_radix_size ( & fmt [ fmt_idx ], 1 ) + 2;
+            break;
+        case sptUnsignedInt32Vect:           /* unsigned vector int - arg is u32   */
+            args [ arg_idx ] . u32 = access_cell_data ( & vargs, & row_len, NULL );
+            arg_size = get_radix_size ( & fmt [ fmt_idx ], 2 ) + 2;
+            break;
+        case sptUnsignedInt64Vect:           /* unsigned vector int - arg is u64   */
+            args [ arg_idx ] . u64 = access_cell_data ( & vargs, & row_len, NULL );
+            arg_size = get_radix_size ( & fmt [ fmt_idx ], 3 ) + 2;
+            break;
+        case sptFloat32Vect:                 /* vector float        - arg is f32   */
+            args [ arg_idx ] . f32 = access_cell_data ( & vargs, & row_len, NULL );
+            arg_size = 32;
+            break;
+        case sptFloat64Vect:                 /* vector float        - arg is f64   */
+            args [ arg_idx ] . f64 = access_cell_data ( & vargs, & row_len, NULL );
+            arg_size = 32;
+            break;
+        case sptFloatLongVect:               /* vector float        - arg is flong */
+            args [ arg_idx ] . flong = access_cell_data ( & vargs, & row_len, NULL );
+            arg_size = 32;
+            break;
+        case sptString:                      /* vector character    - arg is S     */
+            str [ str_idx ] . addr = access_cell_data ( & vargs, & row_len, & str [ str_idx ] . size );
+            str [ str_idx ] . len = ( uint32_t ) str [ str_idx ] . size;
+            arg_size = str [ str_idx ] . size;
+            args [ arg_idx ] . S = & str [ str_idx ++ ];
+            check_index = true;
+            break;
+        case sptUCS2String:                  /* vector character    - arg is S     */
+        case sptUTF32String:                 /* vector character    - arg is S     */
+            return RC ( rcXF, rcFunction, rcExecuting, rcType, rcUnsupported );
+        case sptRowId:                       /* current row id      - arg is d     */
+            args [ arg_idx ] . d = row_id;
+            arg_size = get_radix_size ( & fmt [ fmt_idx ], 3 ) + 1;
+            ++ arg_idx;
+            continue;
+        case sptRowLen:                      /* current row length  - arg is u     */
+            access_cell_data ( & vargs, & args [ arg_idx ] . u, NULL );
+            arg_size = get_radix_size ( & fmt [ fmt_idx ], 3 ) + 2;
+            ++ arg_idx;
+            continue;
+        }
+
+        /* back-fill based upon row-length in case of non-empty rows */
+        if ( row_len != 0 )
+        {
+            /* start index is last in row */
+            if ( fmt [ fmt_idx ] . inf_start_index )
+                start_idx = args [ ext_start_index ] . u = row_len - 1;
+
+            /* end index is last in row */
+            if ( fmt [ fmt_idx ] . inf_stop_index )
+                select_len = args [ ext_stop_index ] . u = row_len - 1;
+        }
+
+        /* detect runtime error condition */
+        if ( start_idx >= row_len )
+            args [ arg_idx ] . p = NULL;
+        else
+        {
+            /* adjust size by index */
+            if ( check_index )
+            {
+                /* the select_len should be correct,
+                   unless the end is a stop coordinate */
+                if ( fmt [ fmt_idx ] . ext_stop_index )
+                {
+                    if ( select_len <= start_idx )
+                        select_len = 1;
+                    else
+                        select_len -= start_idx - 1;
+                }
+
+                /* select_len of 0 means infinite */
+                if ( select_len == 0 )
+                    select_len = row_len - start_idx;
+
+                /* real size after sub-str */
+                arg_size = argv [ vargs . idx - 1 ] . u . data . elem_bits * select_len / 8;
+            }
+
+            /* incorporate size into calcuation */
+            cell_size += arg_size;
+        }
+
+        /* done with argument */
+        ++ arg_idx;
+    }
+
+    /* round cell-size up to nearest 4K */
+    cell_size = ( cell_size + 4095 ) & ~ ( size_t ) 4095;
+
+    /* set output buffer size */
+    rc = KDataBufferResize( rslt -> data, cell_size );
+    if ( rc == 0 )
+    {
+#if _DEBUGGING
+        rc = validate_obj ( self, false );
+        if ( rc != 0 )
+            KDbgMsg ( "%s - self is bad before invoking structured_sprintf: %R\n", __func__, rc );
+#endif
+        /* invoke sprintf engine */
+        rc = structured_sprintf ( rslt -> data -> base,
+            rslt -> data -> elem_count, & cell_size, fmt, args );
+
+        /* recover from buffer insufficient */
+        if ( GetRCState ( rc ) == rcInsufficient && GetRCObject ( rc ) == (enum RCObject)rcBuffer )
+        {
+            rc = KDataBufferResize ( rslt -> data, cell_size + 1 );
+            if ( rc == 0 )
+            {
+                rc = structured_sprintf ( rslt -> data -> base,
+                    rslt -> data -> elem_count, & cell_size, fmt, args );
+            }
+        }
+
+        if ( rc == 0 )
+        {
+            /* set the return parameters */
+            rc = KDataBufferResize ( rslt -> data, cell_size );
+            if ( rc == 0 )
+            {
+                rslt -> elem_count = cell_size;
+                rslt -> elem_bits = 8;
+            }
+        }
+    }
+
+    return rc;
+}
+
+typedef struct ParseData ParseData;
+struct ParseData
+{
+    KDataBuffer overflow;
+    size_t fmt_size;
+    size_t lit_size;
+    PrintFmt *fmt;
+    uint32_t str_idx;
+    uint32_t fmt_idx;
+    uint32_t arg_idx;
+};
+
+/* create_overflow
+ *  create a buffer so large that it cannot overflow again
+ *  copy in existing structures
+ */
+static
+rc_t create_overflow ( ParseData *pd, uint32_t fmt_idx )
+{
+    /* infer that we can never have more format items than characters in the string... */
+
+    /* our size will create a format for every byte.
+       this should be a total overkill. */
+    size_t buff_size = sizeof pd -> fmt [ 0 ] * pd -> fmt_size;
+
+    /* make the buffer */
+    rc_t rc = KDataBufferMakeBytes ( & pd -> overflow, buff_size );
+    if ( rc == 0 )
+    {
+        /* capture pointers to stack structures */
+        const PrintFmt *fmt = pd -> fmt;
+
+        /* destination pointer */
+        pd -> fmt = pd -> overflow . base;
+
+        /* copy existing data */
+        memmove ( pd -> fmt, fmt, fmt_idx * sizeof pd -> fmt [ 0 ] );
+   }
+
+    pd -> fmt_idx = fmt_idx;
+
+    return rc;
+}
+
+typedef struct VAList VAList;
+struct VAList
+{
+    const VFunctionParams *dp;
+    uint32_t idx;
+};
+
+static
+rc_t check_integer_arg ( VAList *vargs )
+{
+    if ( vargs -> idx == vargs -> dp -> argc )
+        return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcInsufficient );
+
+    switch ( vargs -> dp -> argv [ vargs -> idx ] . desc . domain )
+    {
+    case vtdBool:
+    case vtdInt:
+    case vtdUint:
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcIncorrect );
+    }
+
+    switch ( VTypedescSizeof ( & vargs -> dp -> argv [ vargs -> idx ] . desc ) )
+    {
+    case 8:
+    case 16:
+    case 32:
+    case 64:
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcIncorrect );
+    }
+
+    ++ vargs -> idx;
+    return 0;
+}
+
+static
+rc_t extract_size_modifier ( VAList *vargs, char *size_modifier )
+{
+    switch ( vargs -> dp -> argv [ vargs -> idx ] . desc . domain )
+    {
+    case vtdBool:
+        * size_modifier = 0;
+        break;
+    case vtdUint:
+    case vtdInt:
+        switch ( VTypedescSizeof ( & vargs -> dp -> argv [ vargs -> idx ] . desc ) )
+        {
+        case 8:
+            * size_modifier = 't';
+            break;
+        case 16:
+            * size_modifier = 'h';
+            break;
+        case 32:
+            * size_modifier = 0;
+            break;
+        case 64:
+            * size_modifier = 'l';
+            break;
+        default:
+            return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcIncorrect );
+        }
+        break;
+    case vtdFloat:
+        switch ( VTypedescSizeof ( & vargs -> dp -> argv [ vargs -> idx ] . desc ) )
+        {
+        case 32:
+            * size_modifier = 'h';
+            break;
+        case 64:
+            * size_modifier = 0;
+            break;
+        default:
+            return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcIncorrect );
+        }
+        break;
+    case vtdAscii:
+        * size_modifier = 0;
+        break;
+    case vtdUnicode:
+        switch ( vargs -> dp -> argv [ vargs -> idx ] . desc . intrinsic_bits )
+        {
+        case 8:
+            * size_modifier = 0;
+            break;
+        case 16:
+            * size_modifier = 'h';
+            break;
+        case 32:
+            * size_modifier = 'l';
+            break;
+        default:
+            return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcIncorrect );
+        }
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcIncorrect );
+    }
+    return 0;
+}
+
+
+/* parse_format_string
+ *  parse format string and args into structured format
+ */
+static
+rc_t parse_format_string ( const char *fmt_str, ParseData *pd, VAList *vargs )
+{
+    rc_t rc;
+    uint32_t i, fmt_idx;
+
+    PrintFmt *fmt = pd -> fmt;
+
+    /* initialize returned counters */
+    pd -> lit_size = 0;
+    pd -> str_idx = pd -> fmt_idx = pd -> arg_idx = 0;
+
+    /* loop over format string */
+    for ( rc = 0, i = fmt_idx = 0; fmt_str [ i ] != 0; ++ i )
+    {
+        uint32_t domain;
+        bool alternate, numeric;
+        char size_modifier, time_modifier;
+        bool has_precision/*, has_width, has_index*/;
+
+        /* loop to gather literal portions */
+        uint32_t start;
+        for ( start = i; ; ++ i )
+        {
+            /* run until we hit start of substitution token
+               or until we hit end of format string */
+            if ( fmt_str [ i ] != 0 && fmt_str [ i ] != '%' )
+                continue;
+
+            /* detect a literal string */
+            if ( i != start )
+            {
+                /* expand into overflow */
+                if ( fmt_idx == LOCAL_FMT_COUNT )
+                {
+                    rc = create_overflow ( pd, fmt_idx );
+                    if ( rc != 0 )
+                        return rc;
+
+                    fmt = pd -> fmt;
+                }
+
+                /* create a text-literal format */
+                memset ( & fmt [ fmt_idx ], 0, sizeof fmt [ 0 ] );
+                fmt [ fmt_idx ] . u . l . text = & fmt_str [ start ];
+                fmt [ fmt_idx ] . u . l . size = i - start;
+                pd -> lit_size += i - start;
+                fmt [ fmt_idx ] . fmt = spfText;
+                fmt [ fmt_idx ] . type = sptLiteral;
+
+                /* increment counter */
+                ++ fmt_idx;
+            }
+
+            /* detect escape sequence */
+            if ( fmt_str [ i ] == 0 || fmt_str [ i + 1 ] != '%' )
+                break;
+
+            /* skip over escape */
+            start = ++ i;
+        }
+
+        /* done when NUL byte is seen */
+        if ( fmt_str [ i ] == 0 )
+            break;
+
+        /* detect overflow */
+        if ( fmt_idx == LOCAL_FMT_COUNT )
+        {
+            rc = create_overflow ( pd, fmt_idx );
+            if ( rc != 0 )
+                return rc;
+
+            fmt = pd -> fmt;
+        }
+
+        /* initial format
+         *  thousands_separate    = false
+         *  add_prefix            = false
+         *  force_decimal_point   = false
+         *  leave_trailing_zeros  = false
+         *  print_time            = false
+         *  print_date            = false
+         *  print_weekday         = false
+         *  print_timezone        = false
+         *  hour_24               = false
+         *  sign                  = 0
+         *  left_fill             = space
+         */
+        memset ( & fmt [ fmt_idx ], 0, sizeof fmt [ 0 ] );
+        fmt [ fmt_idx ] . left_fill = ' ';
+
+        /* scan flags */
+        alternate = false;
+        while ( 1 )
+        {
+            switch ( fmt_str [ ++ i ] )
+            {
+                /* plus and space modify application of sign
+                   to signed integer and floating point conversions.
+                   plus overrides space. */
+            case ' ':
+                if ( fmt [ fmt_idx ] . sign == 0 )
+            case '+':
+                    fmt [ fmt_idx ] . sign = fmt_str [ i ];
+                continue;
+
+                /* dash indicates left-alignment. indicate this
+                   by setting "left_fill" to NUL. */
+            case '-':
+                fmt [ fmt_idx ] . left_fill = 0;
+                continue;
+
+                /* zero indicates an alternate left-fill for
+                   numeric conversions. the zero is inserted before
+                   any sign character in { '+', '-' or ' ' }.
+                   since "left_fill" is also used to indicate
+                   alignment, only store when right aligning. */
+            case '0':
+                if ( fmt [ fmt_idx ] . left_fill != 0 )
+                    fmt [ fmt_idx ] . left_fill = '0';
+                continue;
+
+                /* hash indicates that the formatter should use an
+                   "alternate" approach. that approach is specific
+                   to the format. */
+            case '#':
+                alternate = true;
+                continue;
+
+                /* comma ( or apostrophe outside of US ) indicates
+                   that the integer portion of a numeral should use
+                   a comma as a thousands separator for legibility. */
+            case ',':
+            case '\'':
+                fmt [ fmt_idx ] . thousands_separate = 1;
+                continue;
+            }
+
+            /* we've hit a non-flag character */
+            break;
+        }
+
+        /* minimum field width */
+        /* has_width = false; */
+        if ( isdigit ( fmt_str [ i ] ) )
+        {
+            /* literal */
+            /*has_width = true;*/
+            fmt [ fmt_idx ] . u . f . min_field_width = fmt_str [ i ] - '0';
+            while ( isdigit ( fmt_str [ ++ i ] ) )
+            {
+                fmt [ fmt_idx ] . u . f . min_field_width *= 10;
+                fmt [ fmt_idx ] . u . f . min_field_width += fmt_str [ i ] - '0';
+            }
+        }
+        else if ( fmt_str [ i ] == '*' )
+        {
+            /* external */
+            rc = check_integer_arg ( vargs );
+            if ( rc != 0 )
+                return rc;
+
+            /*has_width = true;*/
+            fmt [ fmt_idx ] . ext_field_width = 1;
+            ++ pd -> arg_idx;
+            ++ i;
+        }
+
+        /* precision */
+        has_precision = false;
+        if ( fmt_str [ i ] == '.' )
+        {
+            /* a single dot implies a precision value of 0 */
+            has_precision = true;
+
+            if ( isdigit ( fmt_str [ ++ i ] ) )
+            {
+                /* a literal precision */
+                fmt [ fmt_idx ] . u . f . precision = fmt_str [ i ] - '0';
+                while ( isdigit ( fmt_str [ ++ i ] ) )
+                {
+                    fmt [ fmt_idx ] . u . f . precision *= 10;
+                    fmt [ fmt_idx ] . u . f . precision += fmt_str [ i ] - '0';
+                }
+            }
+            else if ( fmt_str [ i ] == '*' )
+            {
+                /* external */
+                rc = check_integer_arg ( vargs );
+                if ( rc != 0 )
+                    return rc;
+
+                fmt [ fmt_idx ] . ext_precision = 1;
+                ++ pd -> arg_idx;
+                ++ i;
+            }
+            else if ( fmt_str [ i ] == '-' )
+            {
+                /* eat a negative precision - treat as 0 */
+                while ( isdigit ( fmt_str [ ++ i ] ) )
+                    ( void ) 0;
+            }
+        }
+
+        /* index - given when parameter is a vector */
+        /*has_index = false;*/
+        if ( fmt_str [ i ] == ':' )
+        {
+            bool has_start, has_len, has_end, end_is_stop;
+            has_start = has_len = has_end = end_is_stop = false;
+
+            /* parameter is taken as a vector,
+               with a default index starting at 0 */
+            /*has_index = true;*/
+
+            if ( isdigit ( fmt_str [ ++ i ] ) )
+            {
+                /* literal index */
+                fmt [ fmt_idx ] . u . f . start_idx = fmt_str [ i ] - '0';
+                while ( isdigit ( fmt_str [ ++ i ] ) )
+                {
+                    fmt [ fmt_idx ] . u . f . start_idx *= 10;
+                    fmt [ fmt_idx ] . u . f . start_idx += fmt_str [ i ] - '0';
+                }
+                has_start = true;
+            }
+            else switch ( fmt_str [ i ] )
+            {
+            case '*':
+                /* external */
+                rc = check_integer_arg ( vargs );
+                if ( rc != 0 )
+                    return rc;
+
+                fmt [ fmt_idx ] . ext_start_index = 1;
+                ++ pd -> arg_idx;
+                ++ i;
+                has_start = true;
+                break;
+            case '$':
+                fmt [ fmt_idx ] . inf_start_index = 1;
+                fmt [ fmt_idx ] . ext_start_index = 1;
+                ++ pd -> arg_idx;
+                ++ i;
+                has_start = true;
+                break;
+            }
+
+            /* detect range */
+            switch ( fmt_str [ i ] )
+            {
+                /* given as start-stop */
+            case '-':
+                end_is_stop = true;
+
+                /* given as start/len */
+            case '/':
+
+                has_len = true;
+
+                if ( isdigit ( fmt_str [ ++ i ] ) )
+                {
+                    /* literal selection length or end */
+                    fmt [ fmt_idx ] . u . f . select_len = fmt_str [ i ] - '0';
+                    while ( isdigit ( fmt_str [ ++ i ] ) )
+                    {
+                        fmt [ fmt_idx ] . u . f . select_len *= 10;
+                        fmt [ fmt_idx ] . u . f . select_len += fmt_str [ i ] - '0';
+                    }
+                    has_end = true;
+                }
+                else switch ( fmt_str [ i ] )
+                {
+                case '*':
+                    /* external */
+                    rc = check_integer_arg ( vargs );
+                    if ( rc != 0 )
+                        return rc;
+
+                    /* external selection length or end */
+                    fmt [ fmt_idx ] . ext_stop_index = end_is_stop;
+                    fmt [ fmt_idx ] . ext_select_len = ! end_is_stop;
+                    ++ pd -> arg_idx;
+                    ++ i;
+                    has_end = true;
+                    break;
+                case '$':
+                    /* ignore index end if start is infinite */
+                    if ( ! fmt [ fmt_idx ] . inf_start_index )
+                    {
+                        fmt [ fmt_idx ] . inf_stop_index = 1;
+                        fmt [ fmt_idx ] . ext_stop_index = 1;
+                        ++ pd -> arg_idx;
+                        end_is_stop = has_end = true;
+                    }
+                    ++ i;
+                    break;
+                case '-':
+                    /* negatives are garbage */
+                    while ( isdigit ( fmt_str [ ++ i ] ) )
+                        ( void ) 0;
+                    break;
+                default:
+                    end_is_stop = false;
+                }
+                break;
+            }
+
+            if ( ! has_len && has_start )
+                fmt [ fmt_idx ] . u . f . select_len = 1;
+        }
+
+        /* size - accept for brownie-points and for KTime */
+        size_modifier = time_modifier = 0;
+        switch ( fmt_str [ i ] )
+        {
+            /* "Tiny" modifier - like "hh" in C format */
+        case 't':
+            /* "Half" modifier - same as C format */
+        case 'h':
+            /* "Long" modifier - means 64-bit for integers, otherwise like C */
+        case 'l':
+            size_modifier = time_modifier = fmt_str [ i ++ ];
+            break;
+            /* "siZe" modifier - whatever the size of size_t is */
+        case 'z':
+            ++ i;
+            time_modifier = 'z';
+            if ( sizeof ( size_t ) == sizeof ( uint64_t ) )
+                size_modifier = 'l';
+            break;
+        }
+
+        /* output format
+           describes the formatting to apply on output
+           if precision has not been set, give it a default value */
+        domain = 0;
+        numeric = false;
+        switch ( fmt_str [ i ] )
+        {
+            /* decimal signed integer */
+        case 'd':
+        case 'i':
+            fmt [ fmt_idx ] . radix = 10;
+            fmt [ fmt_idx ] . fmt = spfSignedInt;
+            numeric = true;
+            if ( ! has_precision )
+                fmt [ fmt_idx ] . u . f . precision = 1;
+            else if ( fmt [ fmt_idx ] . left_fill == '0' )
+                fmt [ fmt_idx ] . left_fill = ' ';
+            domain = vtdInt;
+            break;
+
+            /* decimal unsigned integer */
+        case 'u':
+            fmt [ fmt_idx ] . radix = 10;
+        unsigned_int:
+            fmt [ fmt_idx ] . fmt = spfUnsigned;
+            fmt [ fmt_idx ] . sign = 0;
+            numeric = true;
+            if ( ! has_precision )
+                fmt [ fmt_idx ] . u . f . precision = 1;
+            else if ( fmt [ fmt_idx ] . left_fill == '0' )
+                fmt [ fmt_idx ] . left_fill = ' ';
+            domain = vtdUint;
+            break;
+
+            /* hex unsigned integer */
+        case 'x':
+            fmt [ fmt_idx ] . add_prefix = alternate;
+            fmt [ fmt_idx ] . radix = 16;
+            goto unsigned_int;
+
+            /* upper-case hex unsigned integer */
+        case 'X':
+            fmt [ fmt_idx ] . upper_case_num = 1;
+            fmt [ fmt_idx ] . add_prefix = alternate;
+            fmt [ fmt_idx ] . radix = 16;
+            goto unsigned_int;
+
+            /* octal unsigned integer */
+        case 'o':
+            fmt [ fmt_idx ] . add_prefix = alternate;
+            fmt [ fmt_idx ] . radix = 8;
+            goto unsigned_int;
+
+            /* binary unsigned integer */
+        case 'b':
+            fmt [ fmt_idx ] . add_prefix = alternate;
+            fmt [ fmt_idx ] . radix = 2;
+            goto unsigned_int;
+
+            /* decimal signed floating point */
+        case 'f':
+            fmt [ fmt_idx ] . fmt = spfStdFloat;
+        fmt_float:
+            fmt [ fmt_idx ] . radix = 10;
+            fmt [ fmt_idx ] . force_decimal_point = alternate;
+            numeric = true;
+            if ( ! has_precision )
+                fmt [ fmt_idx ] . u . f . precision = 6;
+            domain = vtdFloat;
+            break;
+
+            /* scientific notation floating point */
+        case 'e':
+            fmt [ fmt_idx ] . fmt = spfSciFloat;
+            goto fmt_float;
+
+            /* "general" floating point */
+        case 'g':
+            fmt [ fmt_idx ] . leave_trailing_zeros = alternate;
+            fmt [ fmt_idx ] . fmt = spfGenFloat;
+            goto fmt_float;
+
+            /* character data */
+        case 's':
+            if ( ! has_precision )
+            /* no break */
+        case 'c':
+                fmt [ fmt_idx ] . u . f . precision = -1;
+            fmt [ fmt_idx ] . fmt = spfText;
+            domain = vtdUnicode;
+            break;
+
+        default:
+            return RC ( rcXF, rcString, rcFormatting, rcFormat, rcUnrecognized );
+        }
+
+        /* handle zero padding for non-numeric cases */
+        if ( ! numeric && fmt [ fmt_idx ] . left_fill == '0' )
+            fmt [ fmt_idx ] . left_fill = ' ';
+
+        /* take size from actual parameter */
+        rc = extract_size_modifier ( vargs, & size_modifier );
+        if ( rc != 0 )
+            return rc;
+
+        /* determine type from argument */
+        switch ( vargs -> dp -> argv [ vargs -> idx ] . desc . domain )
+        {
+        case vtdBool:
+        case vtdUint:
+            switch ( domain )
+            {
+            case vtdBool:
+            case vtdUint:
+            case vtdInt:
+                break;
+            case vtdFloat:
+                fmt [ fmt_idx ] . type_cast = 1;
+                break;
+            default:
+                return RC ( rcXF, rcString, rcFormatting, rcParam, rcIncorrect );
+            }
+
+            switch ( size_modifier )
+            {
+            case 't':
+                fmt [ fmt_idx ] . type = sptUnsignedInt8Vect;
+                break;
+            case 'h':
+                fmt [ fmt_idx ] . type = sptUnsignedInt16Vect;
+                break;
+            case 0:
+                fmt [ fmt_idx ] . type = sptUnsignedInt32Vect;
+                break;
+            case 'l':
+                fmt [ fmt_idx ] . type = sptUnsignedInt64Vect;
+                break;
+            }
+            break;
+
+        case vtdInt:
+            switch ( domain )
+            {
+            case vtdBool:
+            case vtdUint:
+            case vtdInt:
+                break;
+            case vtdFloat:
+                fmt [ fmt_idx ] . type_cast = 1;
+                break;
+            default:
+                return RC ( rcXF, rcString, rcFormatting, rcParam, rcIncorrect );
+            }
+
+            switch ( size_modifier )
+            {
+            case 't':
+                fmt [ fmt_idx ] . type = sptSignedInt8Vect;
+                break;
+            case 'h':
+                fmt [ fmt_idx ] . type = sptSignedInt16Vect;
+                break;
+            case 0:
+                fmt [ fmt_idx ] . type = sptSignedInt32Vect;
+                break;
+            case 'l':
+                fmt [ fmt_idx ] . type = sptSignedInt64Vect;
+                break;
+            }
+            break;
+
+        case vtdFloat:
+            switch ( domain )
+            {
+            case vtdBool:
+            case vtdUint:
+            case vtdInt:
+                fmt [ fmt_idx ] . type_cast = 1;
+                break;
+            case vtdFloat:
+                break;
+            default:
+                return RC ( rcXF, rcString, rcFormatting, rcParam, rcIncorrect );
+            }
+
+            switch ( size_modifier )
+            {
+            case 'h':
+                fmt [ fmt_idx ] . type = sptFloat32Vect;
+                break;
+            case 0:
+                fmt [ fmt_idx ] . type = sptFloat64Vect;
+                break;
+            }
+            break;
+
+        case vtdAscii:
+            switch ( domain )
+            {
+            case vtdAscii:
+            case vtdUnicode:
+                if ( size_modifier != 0 )
+                    fmt [ fmt_idx ] . type_cast = 1;
+                break;
+            default:
+                return RC ( rcXF, rcString, rcFormatting, rcParam, rcIncorrect );
+            }
+
+            fmt [ fmt_idx ] . type = sptString;
+
+            ++ pd -> str_idx;
+            break;
+
+        case vtdUnicode:
+            switch ( domain )
+            {
+            case vtdAscii:
+            case vtdUnicode:
+                switch ( size_modifier )
+                {
+                case 0:
+                    fmt [ fmt_idx ] . type = sptString;
+                    break;
+                case 'h':
+                    fmt [ fmt_idx ] . type_cast = 1;
+                    fmt [ fmt_idx ] . type = sptUCS2String;
+                    break;
+                case 'l':
+                    fmt [ fmt_idx ] . type_cast = 1;
+                    fmt [ fmt_idx ] . type = sptUTF32String;
+                    break;
+                }
+                break;
+            default:
+                return RC ( rcXF, rcString, rcFormatting, rcParam, rcIncorrect );
+            }
+
+            ++ pd -> str_idx;
+            break;
+        }
+
+        /* account for format argument */
+        ++ fmt_idx;
+        ++ pd -> arg_idx;
+        ++ vargs -> idx;
+    }
+
+    /* record final fmt */
+    if ( rc == 0 )
+    {
+        if ( fmt_idx == LOCAL_FMT_COUNT )
+        {
+            rc = create_overflow ( pd, fmt_idx );
+            if ( rc != 0 )
+                return rc;
+
+            fmt = pd -> fmt;
+        }
+
+        memset ( & fmt [ fmt_idx ++ ], 0, sizeof fmt [ 0 ] );
+
+        /* if not all arguments were consumed, should this be an error? */
+        if ( vargs -> idx != vargs -> dp -> argc )
+        {
+            /* produce warning */
+        }
+    }
+
+    pd -> fmt_idx = fmt_idx;
+
+    return rc;
+}
+
+VTRANSFACT_IMPL ( vdb_sprintf, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rc_t rc;
+    Sprintf *obj;
+
+    /* const format string */
+    VAList vargs;
+    const char *fmt_str = cp -> argv [ 0 ] . data . ascii;
+
+    /* local formatting storage */
+    PrintFmt fmt [ LOCAL_FMT_COUNT ];
+
+    /* data block for parse */
+    ParseData pd;
+    pd . fmt_size = cp -> argv [ 0 ] . count;
+    pd . fmt = fmt;
+
+    /* packaged va_list */
+    vargs . dp = dp;
+    vargs . idx = 0;
+
+    /* parse the format string */
+    rc = parse_format_string ( fmt_str, & pd, & vargs );
+    if ( rc == 0 )
+    {
+        /* the object size:
+           literal data bytes +
+           space for PrintFmt +
+           space for PrintArg */
+        size_t obj_extra = pd . lit_size +
+            pd . fmt_idx * sizeof ( PrintFmt ) +
+            pd . arg_idx * sizeof ( PrintArg ) +
+            pd . str_idx * sizeof ( String );
+        obj = malloc ( sizeof * obj + 1 + obj_extra );
+        if ( obj == NULL )
+            rc = RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+        else
+        {
+            uint32_t i;
+
+            char *lit;
+            PrintFmt *dfmt;
+            size_t lit_size;
+
+            obj -> args = ( void* ) ( obj + 1 );
+            dfmt = ( void* ) & obj -> args [ pd . arg_idx ];
+            obj -> str = ( void* ) & dfmt [ pd . fmt_idx ];
+            lit = ( void* ) & obj -> str [ pd . str_idx ];
+            obj -> fmt = dfmt;
+
+            /* not necessary or even helpful, but doesn't cost much */
+            memset ( obj -> args, 0, pd . arg_idx * sizeof obj -> args [ 0 ] );
+            memset ( obj -> str, 0, pd . str_idx * sizeof obj -> str [ 0 ] );
+
+            /* copy format and literals */
+            for ( lit_size = 0, i = 0; i < pd . fmt_idx; ++ i )
+            {
+                /* simple copy */
+                dfmt [ i ] = pd . fmt [ i ];
+                if ( pd . fmt [ i ] . type == sptLiteral )
+                {
+                    /* copy over literal data */
+                    dfmt [ i ] . u . l . text = & lit [ lit_size ];
+                    memmove ( & lit [ lit_size ],
+                        pd . fmt [ i ] . u . l . text,
+                        pd . fmt [ i ] . u . l . size );
+                    lit_size += pd . fmt [ i ] . u . l . size;
+                }
+            }
+
+            /* NUL-terminate the literal text - again, doesn't help but doesn't hurt */
+            lit [ lit_size ] = 0;
+        }
+    }
+
+    /* douse any overflow memory used */
+    if ( pd . fmt != fmt )
+        KDataBufferWhack ( & pd . overflow );
+
+#if _DEBUGGING
+    if ( rc == 0 )
+    {
+        rc = validate_obj ( obj, true );
+        if ( rc != 0 )
+            KDbgMsg ( "%s - self is bad on factory exit: %R\n", __func__, rc );
+    }
+#endif
+
+    if ( rc == 0 )
+    {
+        rslt -> self = obj;
+        rslt -> whack = free;
+        rslt -> u . rf = sprintf_func;
+        rslt -> variant = vftRow;
+    }
+
+    return rc;
+}
diff --git a/libs/vxf/strtonum.c b/libs/vxf/strtonum.c
new file mode 100644
index 0000000..26634f7
--- /dev/null
+++ b/libs/vxf/strtonum.c
@@ -0,0 +1,354 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+
+/* strtonum
+ *  convert string to number
+ *
+ *  "radix" [ CONST, DEFAULT 10 ]
+ *   if not specified, or if given as 0, the default will be 10
+ *   unless the string begins with "0x" or "0X", in which case radix will be 16
+ *   octal is NOT inferred ( i.e. leading "0" does not imply octal )
+ *
+ *  "str" [ DATA ] - text to be converted
+ */
+
+static
+rc_t CC strtoint ( void *data, const VXformInfo *info,
+    VRowResult *rslt, const char *str, size_t str_size )
+{
+    bool negate;
+    size_t i = 0;
+    uint64_t u, max_magnitude;
+    uint32_t radix;
+    rc_t rc;
+    KDataBuffer *dst;
+
+    if (str_size == 0) {
+        rslt -> elem_count = 0;
+        return 0;
+    }
+
+    /* determine radix */
+    radix = ( uint32_t ) ( ( size_t ) data );
+    if ( radix == 0 )
+    {
+        radix = 10;
+        if ( str_size > 2 && str [ 0 ] == '0' ) switch ( tolower ( str [ 1 ] ) )
+        {
+        case 'x':
+            radix = 16;
+            i = 2;
+            break;
+        case 'b':
+            radix = 2;
+            i = 2;
+            break;
+        }
+    }
+
+    /* check for negative */
+    negate = false;
+    if ( radix == 10 && i < str_size && str [ i ] == '-' )
+    {
+        negate = true;
+        ++ i;
+    }
+
+    /* convert numeral */
+    for ( u = 0; i < str_size; ++ i )
+    {
+        int32_t d = toupper ( str [ i ] ) - '0';
+        if ( d < 0 )
+            return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcInvalid );
+        if ( d >= 10 )
+        {
+            d -= 'A' - '0' - 10;
+            if ( d < 10 )
+                return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcInvalid );
+        }
+        if ( d > radix )
+            return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcInvalid );
+        u = u * radix + d;
+    }
+
+    /* determine maximum magnitude */
+    if ( info -> fdesc . desc . intrinsic_bits == 64 )
+        max_magnitude = ( int64_t ) -1;
+    else
+        max_magnitude = ( ( ( uint64_t ) 1 ) << ( info -> fdesc . desc . intrinsic_bits ) ) - 1;
+    if ( info -> fdesc . desc . domain == vtdInt || negate )
+    {
+        max_magnitude >>= 1;
+        max_magnitude += negate;
+    }
+
+    if ( u > max_magnitude )
+        return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcExcessive );
+
+    /* set output buffer size */
+    dst = rslt -> data;
+    rc = KDataBufferCast ( dst, dst, info -> fdesc . desc . intrinsic_bits, true );
+    if ( rc == 0 )
+        rc = KDataBufferResize ( dst, 1 );
+    if ( rc == 0 )
+    {
+        if ( negate )
+            u = - ( int64_t ) u;
+
+        rslt -> elem_count = 1;
+
+        switch ( info -> fdesc . desc . intrinsic_bits )
+        {
+        case 8:
+            * ( uint8_t* ) dst -> base = ( uint8_t ) u;
+            break;
+        case 16:
+            * ( uint16_t* ) dst -> base = ( uint16_t ) u;
+            break;
+        case 32:
+            * ( uint32_t* ) dst -> base = ( uint32_t ) u;
+            break;
+        case 64:
+            * ( uint64_t* ) dst -> base = u;
+            break;
+        default:
+            rc = RC ( rcXF, rcFunction, rcExecuting, rcParam, rcInvalid );
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t CC strtoflt ( void *data, const VXformInfo *info,
+    VRowResult *rslt, char *str, size_t str_size )
+{
+    /* set output buffer size */
+    rc_t rc;
+    KDataBuffer *dst = rslt -> data;
+
+    double d;
+    char *end;
+
+    str [ str_size ] = 0;
+    d = strtod ( str, & end );
+    if ( end != & str [ str_size ] )
+        return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcInvalid );
+
+    rc = KDataBufferCast ( dst, dst, info -> fdesc . desc . intrinsic_bits, true );
+    if ( rc == 0 )
+        rc = KDataBufferResize ( dst, 1 );
+    if ( rc == 0 )
+    {
+        rslt -> elem_count = 1;
+
+        switch ( info -> fdesc . desc . intrinsic_bits )
+        {
+        case 32:
+            * ( float* ) dst -> base = ( float ) d;
+            break;
+        case 64:
+            * ( double* ) dst -> base = d;
+            break;
+        default:
+            rc = RC ( rcXF, rcFunction, rcExecuting, rcParam, rcInvalid );
+        }
+    }
+
+    return rc;
+}
+
+static
+rc_t CC strtoint_8 ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    const char *str = argv [ 0 ] . u . data . base;
+    str += argv [ 0 ] . u . data . first_elem;
+    return strtoint ( data, info, rslt, str, argv [ 0 ] . u . data . elem_count );
+}
+
+static
+rc_t CC strtoflt_8 ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    char buffer [ 128 ];
+    uint32_t count = argv [ 0 ] . u . data . elem_count;
+    const char *str = argv [ 0 ] . u . data . base;
+    str += argv [ 0 ] . u . data . first_elem;
+
+    if ( count >= sizeof buffer )
+        return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcExcessive );
+
+    memmove ( buffer, str, count );
+
+    return strtoflt ( data, info, rslt, buffer, count );
+}
+
+static
+rc_t CC strtoint_16 ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    char buffer [ 64 ];
+    uint32_t i, count = argv [ 0 ] . u . data . elem_count;
+    const uint16_t *str = argv [ 0 ] . u . data . base;
+    str += argv [ 0 ] . u . data . first_elem;
+
+    if ( count > sizeof buffer )
+        return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcExcessive );
+
+    for ( i = 0; i < count; ++ i )
+    {
+        if ( str [ i ] > 128 )
+            return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcInvalid );
+        buffer [ i ] = ( char ) str [ i ];
+    }
+
+    return strtoint ( data, info, rslt, buffer, count );
+}
+
+static
+rc_t CC strtoflt_16 ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    char buffer [ 128 ];
+    uint32_t i, count = argv [ 0 ] . u . data . elem_count;
+    const uint16_t *str = argv [ 0 ] . u . data . base;
+    str += argv [ 0 ] . u . data . first_elem;
+
+    if ( count >= sizeof buffer )
+        return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcExcessive );
+
+    for ( i = 0; i < count; ++ i )
+    {
+        if ( str [ i ] > 128 )
+            return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcInvalid );
+        buffer [ i ] = ( char ) str [ i ];
+    }
+
+    return strtoflt ( data, info, rslt, buffer, count );
+}
+
+static
+rc_t CC strtoint_32 ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    char buffer [ 64 ];
+    uint32_t i, count = argv [ 0 ] . u . data . elem_count;
+    const uint32_t *str = argv [ 0 ] . u . data . base;
+    str += argv [ 0 ] . u . data . first_elem;
+
+    if ( count > sizeof buffer )
+        return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcExcessive );
+
+    for ( i = 0; i < count; ++ i )
+    {
+        if ( str [ i ] > 128 )
+            return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcInvalid );
+        buffer [ i ] = ( char ) str [ i ];
+    }
+
+    return strtoint ( data, info, rslt, buffer, count );
+}
+
+static
+rc_t CC strtoflt_32 ( void *data, const VXformInfo *info, int64_t row_id,
+    VRowResult *rslt, uint32_t argc, const VRowData argv [] )
+{
+    char buffer [ 128 ];
+    uint32_t i, count = argv [ 0 ] . u . data . elem_count;
+    const uint32_t *str = argv [ 0 ] . u . data . base;
+    str += argv [ 0 ] . u . data . first_elem;
+
+    if ( count >= sizeof buffer )
+        return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcExcessive );
+
+    for ( i = 0; i < count; ++ i )
+    {
+        if ( str [ i ] > 128 )
+            return RC ( rcXF, rcFunction, rcExecuting, rcParam, rcInvalid );
+        buffer [ i ] = ( char ) str [ i ];
+    }
+
+    return strtoflt ( data, info, rslt, buffer, count );
+}
+
+VTRANSFACT_IMPL ( vdb_strtonum, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    uint32_t radix = 0;
+
+    if ( cp -> argc == 1 )
+    {
+        radix = cp -> argv [ 0 ] . data . u32 [ 0 ];
+        if ( radix > 36 )
+            return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcInvalid );
+    }
+
+    if ( info -> fdesc . desc . domain == vtdFloat ) switch ( radix )
+    {
+    case 0:
+    case 10:
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcInvalid );
+    }
+
+    if ( dp -> argv [ 0 ] . desc . intrinsic_dim != 1 )
+        return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcInvalid );
+
+    switch ( dp -> argv [ 0 ] . desc . intrinsic_bits )
+    {
+    case 8:
+        rslt -> u . rf = ( info -> fdesc . desc . domain == vtdFloat ) ? strtoflt_8 : strtoint_8;
+        break;
+    case 16:
+        rslt -> u . rf = ( info -> fdesc . desc . domain == vtdFloat ) ? strtoflt_16 : strtoint_16;
+        break;
+    case 32:
+        rslt -> u . rf = ( info -> fdesc . desc . domain == vtdFloat ) ? strtoflt_32 : strtoint_32;
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcConstructing, rcParam, rcInvalid );
+    }
+
+    rslt -> self = ( void* ) ( size_t ) radix;
+    rslt -> variant = vftRow;
+
+    return 0;
+}
diff --git a/libs/vxf/subtract-row-id.c b/libs/vxf/subtract-row-id.c
new file mode 100644
index 0000000..16cfcd9
--- /dev/null
+++ b/libs/vxf/subtract-row-id.c
@@ -0,0 +1,83 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <arch-impl.h>
+#include <klib/data-buffer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+static
+rc_t CC subtract_int64_t ( void *self, const VXformInfo *info,
+    int64_t row_id, VRowResult *rslt,
+    uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    uint32_t i;
+    int64_t *dst;
+    const int64_t *src = argv [ 0 ] . u . data . base;
+    uint64_t elem_count = argv [ 0 ] . u . data . elem_count;
+
+    assert ( rslt -> data -> elem_bits == 64 );
+    rc = KDataBufferResize ( rslt -> data, elem_count );
+    if ( rc != 0 )
+        return rc;
+
+    dst = rslt -> data -> base;
+    rslt -> elem_count = elem_count;
+
+    /* while this function is typically used on single-element rows,
+       we advertise taking rows of any length... */
+    for ( i = 0, src += argv [ 0 ] . u . data . first_elem; i < elem_count; ++ i )
+        dst [ i ] = src [ i ] - row_id;
+
+    return 0;
+}
+
+
+/* subtract_row_id
+ *  return the difference between input and current row id
+ *
+ *  "in" [ DATA ]
+ *
+ * SYNOPSIS:
+ *  predicts that the integer data in "in" will be related to
+ *  the corresponding row-id, and subtracts off the latter.
+ *  for serially generated ids, this will produce a constant
+ *  difference that can be stored as a static column.
+ */
+VTRANSFACT_IMPL ( vdb_subtract_row_id, 1, 0, 0 ) ( const void *fself, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    /* version 1.0 operates on I64 input */
+    rslt -> u . ndf = subtract_int64_t;
+    rslt -> variant = vftNonDetRow;
+    return 0;
+}
diff --git a/libs/vxf/sum.c b/libs/vxf/sum.c
new file mode 100644
index 0000000..5a40372
--- /dev/null
+++ b/libs/vxf/sum.c
@@ -0,0 +1,356 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <arch-impl.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+/* optional constant */
+typedef union sum_data sum_data;
+union sum_data
+{
+    int8_t i8;
+    int16_t i16;
+    int32_t i32;
+    int64_t i64;
+
+    uint8_t u8;
+    uint16_t u16;
+    uint32_t u32;
+    uint64_t u64;
+
+    float f32;
+    double f64;
+};
+
+#define FULL_SUM_NAME( T )                                               \
+    full_sum_ ## T
+#define FULL_SUM( T, k )                                                 \
+static                                                                   \
+rc_t CC FULL_SUM_NAME ( T ) ( void *data,                                   \
+    const VXformInfo *info, int64_t row_id, const VFixedRowResult *rslt, \
+    uint32_t argc, const VRowData argv [] )                              \
+{                                                                        \
+    uint32_t i, j;                                                       \
+    const sum_data *self = ( const void* ) data;                         \
+                                                                         \
+    T *dst = rslt -> base;                                               \
+    const T *a = argv [ 0 ] . u . data . base;                           \
+    const T *b = argv [ 1 ] . u . data . base;                           \
+                                                                         \
+    for ( i = 0, dst += rslt -> first_elem,                              \
+              a += argv [ 0 ] . u . data . first_elem,                   \
+              b += argv [ 1 ] . u . data . first_elem;                   \
+          i < rslt -> elem_count; ++ i )                                 \
+    {                                                                    \
+        dst [ i ] = a [ i ] + b [ i ] + self -> k;                       \
+        for ( j = 2; j < argc; ++ j )                                    \
+        {                                                                \
+            const T *c = argv [ j ] . u . data . base;                   \
+            dst [ i ] += c [ argv [ j ] . u . data . first_elem + i ];   \
+        }                                                                \
+    }                                                                    \
+                                                                         \
+    return 0;                                                            \
+}
+
+FULL_SUM ( int8_t, i8 )
+FULL_SUM ( int16_t, i16 )
+FULL_SUM ( int32_t, i32 )
+FULL_SUM ( int64_t, i64 )
+FULL_SUM ( uint8_t, u8 )
+FULL_SUM ( uint16_t, u16 )
+FULL_SUM ( uint32_t, u32 )
+FULL_SUM ( uint64_t, u64 )
+FULL_SUM ( float, f32 )
+FULL_SUM ( double, f64 )
+
+static VFixedRowFunc full_sum_func [] =
+{
+    FULL_SUM_NAME ( uint8_t ),
+    FULL_SUM_NAME ( uint16_t ),
+    FULL_SUM_NAME ( uint32_t ),
+    FULL_SUM_NAME ( uint64_t ),
+    FULL_SUM_NAME ( int8_t ),
+    FULL_SUM_NAME ( int16_t ),
+    FULL_SUM_NAME ( int32_t ),
+    FULL_SUM_NAME ( int64_t ),
+    NULL,
+    NULL,
+    FULL_SUM_NAME ( float ),
+    FULL_SUM_NAME ( double )
+};
+
+#define CONST_SUM_NAME( T )                                              \
+    const_sum_ ## T
+#define CONST_SUM( T, k )                                                \
+static                                                                   \
+rc_t CC CONST_SUM_NAME ( T ) ( void *data, const VXformInfo *info,          \
+    void *rslt, const void *src, uint64_t elem_count )                   \
+{                                                                        \
+    uint32_t i;                                                          \
+    const sum_data *self = ( const void* ) data;                         \
+                                                                         \
+    T *dst = rslt;                                                       \
+    const T *a = src;                                                    \
+                                                                         \
+    for ( i = 0; i < elem_count; ++ i )                                  \
+    {                                                                    \
+        dst [ i ] = a [ i ] + self -> k;                                 \
+    }                                                                    \
+                                                                         \
+    return 0;                                                            \
+}
+
+CONST_SUM ( int8_t, i8 )
+CONST_SUM ( int16_t, i16 )
+CONST_SUM ( int32_t, i32 )
+CONST_SUM ( int64_t, i64 )
+CONST_SUM ( uint8_t, u8 )
+CONST_SUM ( uint16_t, u16 )
+CONST_SUM ( uint32_t, u32 )
+CONST_SUM ( uint64_t, u64 )
+CONST_SUM ( float, f32 )
+CONST_SUM ( double, f64 )
+
+static VArrayFunc const_sum_func [] =
+{
+    CONST_SUM_NAME ( uint8_t ),
+    CONST_SUM_NAME ( uint16_t ),
+    CONST_SUM_NAME ( uint32_t ),
+    CONST_SUM_NAME ( uint64_t ),
+    CONST_SUM_NAME ( int8_t ),
+    CONST_SUM_NAME ( int16_t ),
+    CONST_SUM_NAME ( int32_t ),
+    CONST_SUM_NAME ( int64_t ),
+    NULL,
+    NULL,
+    CONST_SUM_NAME ( float ),
+    CONST_SUM_NAME ( double )
+};
+
+#define NO_CONST_NAME( T )                                               \
+    no_const_ ## T
+#define NO_CONST( T )                                                    \
+static                                                                   \
+rc_t CC NO_CONST_NAME ( T ) ( void *data,                                   \
+    const VXformInfo *info, int64_t row_id, const VFixedRowResult *rslt, \
+    uint32_t argc, const VRowData argv [] )                              \
+{                                                                        \
+    uint32_t i;                                                          \
+                                                                         \
+    T *dst = rslt -> base;                                               \
+    const T *a = argv [ 0 ] . u . data . base;                           \
+    const T *b = argv [ 1 ] . u . data . base;                           \
+                                                                         \
+    for ( i = 0, dst += rslt -> first_elem,                              \
+              a += argv [ 0 ] . u . data . first_elem,                   \
+              b += argv [ 1 ] . u . data . first_elem;                   \
+          i < rslt -> elem_count; ++ i )                                 \
+    {                                                                    \
+        dst [ i ] = a [ i ] + b [ i ];                                   \
+    }                                                                    \
+                                                                         \
+    return 0;                                                            \
+}
+
+NO_CONST ( int8_t )
+NO_CONST ( int16_t )
+NO_CONST ( int32_t )
+NO_CONST ( int64_t )
+NO_CONST ( uint8_t )
+NO_CONST ( uint16_t )
+NO_CONST ( uint32_t )
+NO_CONST ( uint64_t )
+NO_CONST ( float )
+NO_CONST ( double )
+
+static VFixedRowFunc no_const_func [] =
+{
+    NO_CONST_NAME ( uint8_t ),
+    NO_CONST_NAME ( uint16_t ),
+    NO_CONST_NAME ( uint32_t ),
+    NO_CONST_NAME ( uint64_t ),
+    NO_CONST_NAME ( int8_t ),
+    NO_CONST_NAME ( int16_t ),
+    NO_CONST_NAME ( int32_t ),
+    NO_CONST_NAME ( int64_t ),
+    NULL,
+    NULL,
+    NO_CONST_NAME ( float ),
+    NO_CONST_NAME ( double )
+};
+
+static
+rc_t CC no_sum ( void *data, const VXformInfo *info,
+    void *dst, const void *src, uint64_t elem_count )
+{
+    memmove ( dst, src, (size_t)( elem_count * VTypedescSizeof ( & info -> fdesc . desc ) >> 3 ) );
+    return 0;
+}
+
+static
+void CC vxf_sum_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* sum
+ *  return the sum of inputs
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be member of numeric_set
+ *
+ *  "k" [ CONST, DEFAULT 0 ] - optional constant
+ *  to be added
+ *
+ *  "a" [ DATA ] - left-most operand
+ *
+ * SYNOPSIS:
+ *  incorporates "k" into expression for every row
+ *  returns sum or sumerence of inputs for all rows
+ */
+VTRANSFACT_IMPL ( vdb_sum, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    bool has_const;
+    int32_t size_idx;
+    sum_data k;
+
+    /* "T" must be member of numeric_set */
+    switch ( info -> fdesc . desc . domain )
+    {
+    case vtdUint:
+    case vtdInt:
+    case vtdFloat:
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+    }
+
+    /* TBD - eventually support vector sums
+       for today, check that dim of T is 1 */
+    if ( dp -> argv [ 0 ] . desc . intrinsic_dim != 1 )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+    /* the only numeric types we support are between 8 and 64 bits */
+    size_idx = uint32_lsbit ( dp -> argv [ 0 ] . desc . intrinsic_bits ) - 3;
+    if ( size_idx < 0 || size_idx > 3 || ( ( dp -> argv [ 0 ] . desc . intrinsic_bits &
+                                             ( dp -> argv [ 0 ] . desc . intrinsic_bits - 1 ) ) != 0 ) )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+
+    /* there are 5 variants:
+       1. no constant ( or is 0 ) and single input
+       2. non-zero constant and single input
+       3. no constant ( or is 0 ) and dual input
+       4. non-zero constant and dual input
+       5. more than 2 inputs */
+    has_const = false;
+    if ( cp -> argc == 0 )
+        memset ( & k, 0, sizeof k );
+    else switch ( cp -> argv [ 0 ] . desc . domain )
+    {
+    case vtdUint:
+    case vtdInt:
+        switch ( cp -> argv [ 0 ] . desc . intrinsic_bits )
+        {
+        case 8:
+            if ( ( k . u8 = cp -> argv [ 0 ] . data . u8 [ 0 ] ) != 0 )
+                has_const = true;
+            break;
+        case 16:
+            if ( ( k . u16 = cp -> argv [ 0 ] . data . u16 [ 0 ] ) != 0 )
+                has_const = true;
+            break;
+        case 32:
+            if ( ( k . u32 = cp -> argv [ 0 ] . data . u32 [ 0 ] ) != 0 )
+                has_const = true;
+            break;
+        case 64:
+            if ( ( k . u64 = cp -> argv [ 0 ] . data . u64 [ 0 ] ) != 0 )
+                has_const = true;
+            break;
+        }
+        break;
+
+    case vtdFloat:
+        switch ( cp -> argv [ 0 ] . desc . intrinsic_bits )
+        {
+        case 32:
+            if ( ( k . f32 = cp -> argv [ 0 ] . data . f32 [ 0 ] ) != 0.0 )
+                has_const = true;
+            break;
+        case 64:
+            if ( ( k . f64 = cp -> argv [ 0 ] . data . f64 [ 0 ] ) != 0.0 )
+                has_const = true;
+            break;
+        }
+        break;
+    }
+
+    if ( has_const || dp -> argc > 2 )
+    {
+        sum_data *pb = malloc ( sizeof * pb );
+        if ( pb == NULL )
+            return RC ( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted );
+        * pb = k;
+        
+        rslt -> self = pb;
+        rslt -> whack = vxf_sum_wrapper;
+
+        if ( dp -> argc > 1 )
+        {
+            rslt -> u . pf = full_sum_func [ ( dp -> argv [ 0 ] . desc . domain - vtdUint ) * 4 + size_idx ];
+            rslt -> variant = vftFixedRow;
+        }
+        else
+        {
+            rslt -> u . af = const_sum_func [ ( dp -> argv [ 0 ] . desc . domain - vtdUint ) * 4 + size_idx ];
+            rslt -> variant = vftArray;
+        }
+    }
+    else
+    {
+        if ( dp -> argc > 1 )
+        {
+            rslt -> u . pf = no_const_func [ ( dp -> argv [ 0 ] . desc . domain - vtdUint ) * 4 + size_idx ];
+            rslt -> variant = vftFixedRow;
+        }
+        else
+        {
+            rslt -> u . af = no_sum;
+            rslt -> variant = vftArray;
+        }
+    }
+
+    return 0;
+}
diff --git a/libs/vxf/trim.c b/libs/vxf/trim.c
new file mode 100644
index 0000000..b5da5b8
--- /dev/null
+++ b/libs/vxf/trim.c
@@ -0,0 +1,229 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <klib/log.h>
+#include <arch-impl.h>
+
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+typedef struct trim_self_struct {
+	union {
+	    int8_t i8;
+	    int16_t i16;
+	    int32_t i32;
+	    int64_t i64;
+
+	    uint8_t u8;
+	    uint16_t u16;
+	    uint32_t u32;
+	    uint64_t u64;
+
+	    float f32;
+	    double f64;
+	} el;
+	uint8_t side;
+} self_t;
+
+
+#define TRIM_NAME( T ) trim_ ## T
+
+#define FUNC_TRIM( T, K )                                               \
+static rc_t CC TRIM_NAME ( T ) ( void *data,                            \
+    const VXformInfo *info, int64_t row_id, VRowResult *rslt,           \
+    uint32_t argc, const VRowData argv [] )                             \
+{                                                                       \
+    rc_t rc = 0;                                                        \
+    const self_t *self = data;                                          \
+    uint32_t start = 0;                                                 \
+    uint32_t stop = argv[0].u.data.elem_count;                          \
+    const T *a = argv[0].u.data.base;                                   \
+    a += argv[0].u.data.first_elem;                                     \
+    if (self->side == 0) {                                              \
+        while (start != stop && a[start] == self->el.K)                 \
+            ++start;                                                    \
+    }                                                                   \
+    else {                                                              \
+        while (start != stop && a[stop - 1]  == self->el.K)             \
+            --stop;                                                     \
+    }                                                                   \
+    rslt->elem_count = stop - start;                                    \
+    if (rslt->elem_count > 0) {                                         \
+        rc = KDataBufferResize(rslt->data, rslt->elem_count);           \
+        if (rc == 0)                                                    \
+            memmove(rslt->data->base, a + start, rslt->elem_count);      \
+    }                                                                   \
+    return rc;                                                          \
+}
+#if 1
+FUNC_TRIM ( uint8_t, u8 )
+#else
+static									 
+rc_t CC trim_uint8_t ( void *data,                                	 
+    const VXformInfo *info, int64_t row_id, VRowResult *rslt,		 
+    uint32_t argc, const VRowData argv [] )                              
+{                                                                        
+    rc_t rc = 0;
+    const self_t *self = data;						 
+    uint32_t start = 0;						
+    uint32_t stop = argv[0].u.data.elem_count;			
+    const uint8_t *a = argv[0].u.data.base;
+    
+    a += argv[0].u.data.first_elem;
+    
+    if (self->side == 0) { /*** left side trim ****/			 
+        while (start != stop && a[start] == self->el.u8)
+            ++start;
+    }
+    else {
+        while (start != stop && a[stop - 1]  == self->el.u8)
+            --stop;
+    }
+    rslt->elem_count = stop - start;
+    if (rslt->elem_count > 0) {
+        rc = KDataBufferResize(rslt->data, rslt->elem_count);
+        if (rc == 0)
+            memmove(rslt->data->base, a + start, rslt->elem_count);
+    }
+    return rc;
+}
+#endif
+FUNC_TRIM ( int8_t, i8 )
+FUNC_TRIM ( int16_t, i16 )
+FUNC_TRIM ( int32_t, i32 )
+FUNC_TRIM ( int64_t, i64 )
+FUNC_TRIM ( uint16_t, u16 )
+FUNC_TRIM ( uint32_t, u32 )
+FUNC_TRIM ( uint64_t, u64 )
+FUNC_TRIM ( float, f32 )
+FUNC_TRIM ( double, f64 )
+
+static VRowFunc trim_func_set [] =
+{
+    TRIM_NAME ( uint8_t ),
+    TRIM_NAME ( uint16_t ),
+    TRIM_NAME ( uint32_t ),
+    TRIM_NAME ( uint64_t ),
+    TRIM_NAME ( int8_t ),
+    TRIM_NAME ( int16_t ),
+    TRIM_NAME ( int32_t ),
+    TRIM_NAME ( int64_t ),
+    NULL,
+    NULL,
+    TRIM_NAME ( float ),
+    TRIM_NAME ( double )
+};
+
+static
+void CC self_whack( void *ptr )
+{
+	free( ptr );
+}
+
+VTRANSFACT_IMPL ( vdb_trim, 1, 0, 0 ) ( const void *Self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    int32_t size_idx;
+    self_t self;
+
+    self.el.u64 = 0;
+
+    self.side=cp -> argv [ 0 ] . data . u8 [ 0 ];
+
+    /* "T" must be member of numeric_set */
+    switch ( info -> fdesc . desc . domain )
+    {
+    case vtdUint:
+    case vtdInt:
+    case vtdFloat:
+        break;
+    default:
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+    }
+
+    if ( dp -> argv [ 0 ] . desc . intrinsic_dim != 1 )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+    /* the only numeric types we support are between 8 and 64 bits */
+    size_idx = uint32_lsbit ( dp -> argv [ 0] . desc . intrinsic_bits ) - 3;
+    if ( size_idx < 0 || size_idx > 3 || ( ( dp -> argv [ 0 ] . desc . intrinsic_bits &
+                                             ( dp -> argv [ 0 ] . desc . intrinsic_bits - 1 ) ) != 0 ) )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+
+    switch ( cp -> argv [ 1 ] . desc . domain )
+    {
+    case vtdUint:
+    case vtdInt:
+        switch ( cp -> argv [ 1 ] . desc . intrinsic_bits )
+        {
+        case 8:
+	    self . el . u8 = cp -> argv [ 1 ] . data . u8 [ 0 ];
+            break;
+        case 16:
+	    self . el . u16 = cp -> argv [ 1 ] . data . u16 [ 0 ];
+            break;
+        case 32:
+	    self . el . u32 = cp -> argv [ 1 ] . data . u32 [ 0 ];
+            break;
+        case 64:
+            self . el . u64 = cp -> argv [ 1 ] . data . u64 [ 0 ];
+            break;
+	default: return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+        }
+        break;
+
+    case vtdFloat:
+        switch ( cp -> argv [ 1 ] . desc . intrinsic_bits )
+        {
+        case 32:
+            self . el . f32 = cp -> argv [ 1 ] . data . f32 [ 0 ];
+            break;
+        case 64:
+            self . el . f64 = cp -> argv [ 1 ] . data . f64 [ 0 ];
+            break;
+	default: return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+        }
+        break;
+    default: return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+    }
+    rslt -> self = malloc ( sizeof self );
+    memmove(rslt -> self,&self,sizeof(self));
+    rslt -> whack = self_whack;
+    rslt -> u . rf = trim_func_set [ ( dp -> argv [ 0 ] . desc . domain - vtdUint ) * 4 + size_idx ];
+    rslt -> variant = vftRow;
+
+    return 0;
+}
diff --git a/libs/vxf/trunc.c b/libs/vxf/trunc.c
new file mode 100644
index 0000000..b9a1285
--- /dev/null
+++ b/libs/vxf/trunc.c
@@ -0,0 +1,49 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <math.h>
+
+#define FLOAT_FUNC truncf
+#define DOUBLE_FUNC trunc
+#include "math-funcs-impl.h"
+
+/*
+ function < type T >
+ T vdb:trunc #1.0 ( T in );
+ */
+VTRANSFACT_IMPL(vdb_trunc, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp ) {
+    return factory(self, info, rslt, cp, dp);
+}
diff --git a/libs/vxf/undelta.c b/libs/vxf/undelta.c
new file mode 100644
index 0000000..5c3187c
--- /dev/null
+++ b/libs/vxf/undelta.c
@@ -0,0 +1,108 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <arch-impl.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+
+#define UNDELTA_NAME( T )  undelta_ ## T
+#define UNDELTA( T )                                                       \
+static                                                                   \
+rc_t CC UNDELTA_NAME ( T ) ( void *data,                                   \
+    const VXformInfo *info,  void *rslt, const void *input,              \
+    uint64_t elem_count)                                                 \
+{                                                                        \
+    uint32_t i;                                                          \
+    T *dst       = (T*) rslt;                                            \
+    const T *src = (const T*) input;                                     \
+    if(elem_count >0) {							 \
+        dst [ 0 ] = src [ 0 ];						 \
+	for ( i = 1; i < elem_count; ++ i ) {                            \
+	    dst [ i ] = src [ i ] + dst [ i - 1 ];                       \
+	}                                                                \
+    }									 \
+    return 0;                                                            \
+}
+
+UNDELTA ( int8_t )
+UNDELTA ( int16_t )
+UNDELTA ( int32_t )
+UNDELTA ( int64_t )
+
+static VArrayFunc undelta_func [] =
+{
+    UNDELTA_NAME ( int8_t  ),
+    UNDELTA_NAME ( int16_t ),
+    UNDELTA_NAME ( int32_t ),
+    UNDELTA_NAME ( int64_t )
+};
+/* undelta
+ *  return restoration from 1st derivative of inputs
+ *
+ *  "T" [ TYPE ] - input and output data type
+ *  must be member of  signed integers
+ *
+ *  "a" [ DATA ] - operand
+ *
+ *
+ * SYNOPSIS:
+ *  return restoration of 1st derivative for the whole blob
+ *
+ * USAGE:
+ *    I32 A = < I32 > undelta ( B );
+ */
+VTRANSFACT_IMPL ( vdb_undelta, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    int size_idx;
+    if ( info -> fdesc . desc . domain != vtdInt)
+    {
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+    }
+
+    /* TBD - eventually support vector derivatives
+       for today, check that dim of T is 1 */
+    if ( dp -> argv [ 0 ] . desc . intrinsic_dim != 1 )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+    /* the only numeric types we support are between 8 and 64 bits */
+    size_idx = uint32_lsbit ( dp -> argv [ 0 ] . desc . intrinsic_bits ) - 3;
+    if ( size_idx < 0 || size_idx > 3 || ( ( dp -> argv [ 0 ] . desc . intrinsic_bits &
+                                             ( dp -> argv [ 0 ] . desc . intrinsic_bits - 1 ) ) != 0 ) )
+        return RC ( rcXF, rcFunction, rcConstructing, rcType, rcIncorrect );
+
+
+    rslt -> u . af = undelta_func [ size_idx ];
+    rslt -> variant = vftArray;
+
+    return 0;
+}
diff --git a/libs/vxf/unpack.c b/libs/vxf/unpack.c
new file mode 100644
index 0000000..d15ae31
--- /dev/null
+++ b/libs/vxf/unpack.c
@@ -0,0 +1,115 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <sysalloc.h>
+#include <klib/pack.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+
+typedef struct self_t self_t;
+struct self_t
+{
+    VTypedesc sdesc;
+    VTypedesc ddesc;
+    uint32_t sbits;
+};
+
+static
+rc_t CC unpack_func( void *Self, const VXformInfo *info,
+    void *dst, const void *src, uint64_t elem_count )
+{
+    size_t usize;
+    const self_t *self = ( const void* ) Self;
+    bitsz_t ssize = elem_count * VTypedescSizeof ( & self -> sdesc );
+    size_t dsize = (elem_count * VTypedescSizeof ( & self -> ddesc ) + 7) >> 3;
+
+    return Unpack( self -> sbits, self -> ddesc.intrinsic_bits,
+        src, 0, ssize, NULL,
+        dst, dsize, &usize );
+}
+
+static
+void CC vxf_unpack_wrapper( void *ptr )
+{
+    free( ptr );
+}
+
+/* 
+ */
+VTRANSFACT_IMPL ( vdb_unpack, 1, 0, 0 ) ( const void *ignore, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    self_t *self = malloc ( sizeof * self );
+    if ( self == NULL )
+        return RC ( rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted );
+
+    assert (dp->argc == 1);
+    self->sdesc = dp->argv[0].desc;
+    self->ddesc = info->fdesc.desc;
+    self->sbits = VTypedescSizeof ( & dp->argv[0].desc );
+        
+    rslt->self = self;
+    rslt->whack = vxf_unpack_wrapper;
+        
+    rslt->variant = vftArray;
+    rslt->u.af = unpack_func;
+        
+    return 0;
+}
+
+VTRANSFACT_IMPL ( NCBI_unpack, 1, 0, 0 ) ( const void *ignore, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    self_t *self = malloc ( sizeof * self );
+    if ( self == NULL )
+        return RC ( rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted );
+
+    assert ( dp -> argc == 1 );
+
+    assert ( cp -> argc == 2 );
+    assert ( cp -> argv [ 0 ] . desc . intrinsic_bits == 32 );
+    assert ( cp -> argv [ 0 ] . desc . domain == vtdUint );
+
+    self->sdesc = dp->argv[0].desc;
+    self -> ddesc . intrinsic_bits = cp -> argv [ 1 ] . data . u32 [ 0 ];
+    self -> ddesc . intrinsic_dim = 1;
+    self -> ddesc . domain = 0;
+    self -> sbits = cp -> argv [ 0 ] . data . u32 [ 0 ];
+
+    rslt->self = self;
+    rslt->whack = vxf_unpack_wrapper;
+        
+    rslt->variant = vftArray;
+    rslt->u.af = unpack_func;
+        
+    return 0;
+}
diff --git a/libs/vxf/unzip.c b/libs/vxf/unzip.c
new file mode 100644
index 0000000..ba10ce1
--- /dev/null
+++ b/libs/vxf/unzip.c
@@ -0,0 +1,234 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+#include <klib/data-buffer.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <endian.h>
+#include <byteswap.h>
+#include <string.h>
+#include <zlib.h>
+#include <assert.h>
+
+static rc_t invoke_zlib(void *dst, size_t dsize, const void *src, size_t ssize, int windowBits)
+{
+    int zr;
+    rc_t rc = 0;
+
+    z_stream s;
+    memset ( & s, 0, sizeof s );
+
+    s.next_in = (void *)src;
+    s.avail_in = ssize;
+    s.next_out = dst;
+    s.avail_out = dsize;
+    
+    zr = inflateInit2(&s, windowBits);
+    switch (zr)
+    {
+        case Z_OK:
+            break;
+        case Z_MEM_ERROR:
+            return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        default:
+            return RC(rcXF, rcFunction, rcExecuting, rcNoObj, rcUnexpected);
+    }
+    zr = inflate(&s, Z_FINISH);
+    switch (zr)
+    {
+    case Z_STREAM_END:
+        break;
+    case Z_OK:         /* progress but not complete */
+    case Z_BUF_ERROR:  /* no progress - need more output buffer */
+        rc = RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+        break;
+    case Z_NEED_DICT:
+    case Z_DATA_ERROR:
+        rc = RC(rcXF, rcFunction, rcExecuting, rcData, rcCorrupt);
+        break;
+    case Z_MEM_ERROR:
+        rc = RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+        break;
+    default:
+        rc = RC(rcXF, rcFunction, rcExecuting, rcNoObj, rcUnexpected);
+        break;
+    }
+    zr = inflateEnd(&s);
+    switch (zr)
+    {
+        case Z_OK:
+            break;
+        default:
+            if (rc == 0)
+                rc = RC(rcXF, rcFunction, rcExecuting, rcData, rcCorrupt);
+    }
+
+    return rc;
+}
+
+static
+rc_t unzip_func_v1(
+                   const VXformInfo *info,
+                   VBlobResult *dst,
+                   const VBlobData *src
+) {
+    dst->byte_order = src->byte_order;
+    return invoke_zlib(dst->data, (((size_t)dst->elem_count * dst->elem_bits + 7) >> 3),
+                       src->data, (((size_t)src->elem_count * src->elem_bits + 7) >> 3),
+                       -15);
+}
+
+static
+rc_t unzip_func_v2(
+                   const VXformInfo *info,
+                   VBlobResult *dst,
+                   const VBlobData *src,
+                   VBlobHeader *hdr
+) {
+    int64_t trailing;
+    rc_t rc = VBlobHeaderArgPopHead ( hdr, & trailing );
+    if ( rc == 0 )
+    {
+        dst -> elem_count *= dst -> elem_bits;
+        dst -> byte_order = src -> byte_order;
+        dst -> elem_bits = 1;
+
+        /* the feed to zlib MUST be byte aligned
+           so the output must be as well */
+        assert ( ( dst -> elem_count & 7 ) == 0 );
+        rc = invoke_zlib(dst->data, (((size_t)dst->elem_count) >> 3),
+                         src->data, (((size_t)src->elem_count * src->elem_bits + 7) >> 3),
+                         -15);
+
+        /* if the original, uncompressed source was NOT byte aligned,
+           back off the rounded up byte and add in the original bit count */
+        if ( rc == 0 && trailing != 0 )
+            dst -> elem_count -= 8 - trailing;
+    }
+
+    return rc;
+}
+
+static
+rc_t CC legacy_unzip_func ( void *self, const VXformInfo *info,
+    VLegacyBlobResult *rslt, const KDataBuffer *src )
+{
+    rc_t rc;
+    KDataBuffer *dst = rslt -> dst;
+    const uint32_t *in = src -> base;
+#if __BYTE_ORDER == __BIG_ENDIAN
+    uint64_t bits = bswap_32 ( in [ 0 ] );
+#else
+    uint64_t bits = in [ 0 ];
+#endif
+
+    do
+    {
+        size_t const bytes = ( size_t ) ( ( bits + 7 ) >> 3 ) + 64;
+        
+        if ( ( ( uint64_t ) bytes << 3 ) < bits )
+        {
+            rc = RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+            break;
+        }
+
+        dst -> elem_bits = 8;
+        rc = KDataBufferResize ( dst, bytes );
+        if ( rc != 0 )
+            break;
+
+        rc = invoke_zlib ( dst -> base, bytes, & in [ 1 ], (size_t)KDataBufferBytes ( src ) - 4, 15 );
+        if ( rc == 0 )
+        {
+            dst -> elem_bits = 1;
+            dst -> elem_count = bits;
+            break;
+        }
+
+        /* in hopes that this is a 32-bit overflow, try increasing bits */
+        bits += ( uint64_t ) 1U << 32;
+        if ( ( bits >> 32 ) == 16 )
+            break;
+    }
+    while ( GetRCState ( rc ) == rcInsufficient && GetRCObject ( rc ) == (enum RCObject)rcBuffer );
+
+    return rc;
+}
+
+
+static
+rc_t CC unzip_func(
+                void *Self,
+                const VXformInfo *info,
+                VBlobResult *dst,
+                const VBlobData *src,
+                VBlobHeader *hdr
+) {
+    int const version = VBlobHeaderVersion(hdr);
+    
+    switch (version) {
+    case 1:
+        return unzip_func_v1(info, dst, src);
+        break;
+    case 2:
+        return unzip_func_v2(info, dst, src, hdr);
+        break;
+    default:
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcBadVersion);
+    }
+}
+
+/* unzip
+ *  function any unzip #1.0 ( zlib_fmt in );
+ */
+VTRANSFACT_IMPL ( vdb_unzip, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt->variant = vftBlob;
+    rslt->u.bf = unzip_func;
+
+    return 0;
+}
+
+/* NCBI:unzip
+ *  function any NCBI:unzip #1.0 ( NCBI:zlib_encoded_t in );
+ */
+VTRANSFACT_IMPL ( NCBI_unzip, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    VNoHdrBlobFunc f = legacy_unzip_func;
+    rslt->variant = vftLegacyBlob;
+    rslt->u.bf = ( VBlobFunc ) f;
+
+    return 0;
+}
diff --git a/libs/vxf/vec-sum.c b/libs/vxf/vec-sum.c
new file mode 100644
index 0000000..9903124
--- /dev/null
+++ b/libs/vxf/vec-sum.c
@@ -0,0 +1,239 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/extern.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <sysalloc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <math.h>
+#include <assert.h>
+
+typedef void (*math_f)(void *const dst,
+                       void const *const src, uint32_t const offset,
+                       uint32_t const vec_length, uint32_t const vec_count);
+typedef struct self_t {
+    uint32_t vec_length;
+    math_f f;
+} self_t;
+
+#define FUNC(VALTYPE) F_ ## VALTYPE
+
+#define FUNC_DEF(VALTYPE) \
+static void FUNC(VALTYPE)(void *Dst, void const *Src, uint32_t const offset, uint32_t const vec_length, uint32_t const vec_count) { \
+    VALTYPE sum; \
+    VALTYPE *const dst = (VALTYPE *)Dst; \
+    VALTYPE const *const src = &((VALTYPE const *)Src)[offset]; \
+    uint32_t i; \
+    uint32_t j; \
+    uint32_t k; \
+    \
+    for (i = k = 0; i != vec_count; ++i) { \
+        for (sum = 0, j = 0; j != vec_length; ++j, ++k) \
+            sum += src[k]; \
+        dst[i] = sum; \
+    } \
+}
+
+FUNC_DEF(float)
+FUNC_DEF(double)
+FUNC_DEF(uint8_t)
+FUNC_DEF(uint16_t)
+FUNC_DEF(uint32_t)
+FUNC_DEF(uint64_t)
+FUNC_DEF(int8_t)
+FUNC_DEF(int16_t)
+FUNC_DEF(int32_t)
+FUNC_DEF(int64_t)
+
+static
+rc_t CC vec_sum_row_func(void *const Self,
+                         VXformInfo const *info,
+                         int64_t const row_id,
+                         VRowResult *const rslt,
+                         uint32_t const argc,
+                         VRowData const argv[])
+{
+    self_t const *self = Self;
+    rc_t rc;
+    
+    assert(argc == 1);
+    
+    rslt->data->elem_bits = rslt->elem_bits;
+    rc = KDataBufferResize(rslt->data, rslt->elem_count = 1);
+    if (rc == 0) {
+        self->f(rslt->data->base,
+                argv[0].u.data.base, argv[0].u.data.first_elem,
+                argv[0].u.data.elem_count, 1);
+    }
+    return rc;
+}
+
+static
+rc_t CC vec_sum_array_func(
+                void *Self,
+                const VXformInfo *info,
+                void *dst,
+                const void *src,
+                uint64_t elem_count
+) {
+    const self_t *self = Self;
+    
+    assert(elem_count % self->vec_length == 0);
+    assert((elem_count / self->vec_length) >> 32 == 0);
+    self->f(dst, src, 0, self->vec_length, (uint32_t)(elem_count / self->vec_length));
+    return 0;
+}
+
+static
+void CC vxf_vec_sum_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+rc_t vec_sum_make(self_t **const rslt,
+                  VXfactInfo const *const info,
+                  VFunctionParams const *const dp)
+{
+    self_t *self;
+    rc_t rc = 0;
+    
+    self = malloc(sizeof(*self));
+    if (self == NULL)
+        rc = RC(rcVDB, rcFunction, rcConstructing, rcMemory, rcExhausted);
+    else {
+        self->vec_length = dp->argv[0].fd.td.dim;
+        
+        switch (info->fdesc.desc.intrinsic_bits) {
+        case 8:
+            switch (info->fdesc.desc.domain) {
+            case vtdInt:
+                self->f = FUNC(int8_t);
+                break;
+            case vtdUint:
+                self->f = FUNC(uint8_t);
+                break;
+            default:
+                rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            }
+            break;
+        case 16:
+            switch (info->fdesc.desc.domain) {
+            case vtdInt:
+                self->f = FUNC(int16_t);
+                break;
+            case vtdUint:
+                self->f = FUNC(uint16_t);
+                break;
+            default:
+                rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            }
+            break;
+        case 32:
+            switch (info->fdesc.desc.domain) {
+            case vtdInt:
+                self->f = FUNC(int32_t);
+                break;
+            case vtdUint:
+                self->f = FUNC(uint32_t);
+                break;
+            case vtdFloat:
+                self->f = FUNC(float);
+                break;
+            default:
+                rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            }
+            break;
+        case 64:
+            switch (info->fdesc.desc.domain) {
+            case vtdInt:
+                self->f = FUNC(int64_t);
+                break;
+            case vtdUint:
+                self->f = FUNC(uint64_t);
+                break;
+            case vtdFloat:
+                self->f = FUNC(double);
+                break;
+            default:
+                rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+            }
+            break;
+        default:
+            rc = RC(rcVDB, rcFunction, rcConstructing, rcParam, rcInvalid);
+        }
+        if (rc) {
+            free(self);
+            self = NULL;
+        }
+    }
+    *rslt = self;
+    return rc;
+}
+
+VTRANSFACT_IMPL(vdb_vec_sum, 1, 0, 0)(const void *Self,
+                                      const VXfactInfo *info,
+                                      VFuncDesc *rslt,
+                                      const VFactoryParams *cp,
+                                      const VFunctionParams *dp)
+{
+    self_t *self;
+    rc_t rc = vec_sum_make(&self, info, dp);
+    
+    if (rc == 0) {
+        rslt->self = self;
+        rslt->whack = vxf_vec_sum_wrapper;
+        rslt->variant = vftRow;
+        rslt->u.rf = vec_sum_row_func;
+    }
+    return rc;
+}
+
+/*
+ function < type T, U32 dim >
+ T vec_sum #1.0 ( T [ dim ] in )
+ */
+VTRANSFACT_IMPL(vdb_fixed_vec_sum, 1, 0, 0)(const void *Self,
+                                            const VXfactInfo *info,
+                                            VFuncDesc *rslt,
+                                            const VFactoryParams *cp,
+                                            const VFunctionParams *dp)
+{
+    self_t *self;
+    rc_t rc = vec_sum_make(&self, info, dp);
+    
+    if (rc == 0) {
+        rslt->self = self;
+        rslt->whack = vxf_vec_sum_wrapper;
+        rslt->variant = vftArray;
+        rslt->u.af = vec_sum_array_func;
+    }
+    return rc;
+}
diff --git a/libs/vxf/wgs-tokenize-accession.c b/libs/vxf/wgs-tokenize-accession.c
new file mode 100644
index 0000000..ac3a389
--- /dev/null
+++ b/libs/vxf/wgs-tokenize-accession.c
@@ -0,0 +1,213 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <os-native.h>
+#include <assert.h>
+
+enum
+{
+    NCBI_WGS_acc_token_unrecognized = 1,
+    NCBI_WGS_acc_token_prefix,
+    NCBI_WGS_acc_token_contig
+};
+
+enum
+{
+    TTextToken_id,
+    TTextToken_start,
+    TTextToken_len
+};
+
+
+static
+uint32_t ParseWgsAccession ( uint16_t *tok, const char *acc, size_t acc_len )
+{
+    /* WGS accessions have form:
+     * [NZ_]<4-letter prefix><2-digit version><6-7 digit contig>
+     */
+    size_t i;
+
+    /* scan non-digits */
+    for ( i = 0; i < acc_len; ++ i )
+    {
+        if ( isdigit ( acc [ i ] ) )
+            break;
+    }
+
+    /* require at least 4 characters... */
+    if ( i >= 4 )
+    {
+        /* require at least 8 digits */
+        if ( acc_len - i >= 8 )
+        {
+            /* 2-digit version */
+            if ( isdigit ( acc [ ++ i ] ) )
+            {
+                /* record first token as prefix */
+                tok [ 0 + TTextToken_id ] = NCBI_WGS_acc_token_prefix;
+                tok [ 0 + TTextToken_start ] = 0;
+                tok [ 0 + TTextToken_len ] = ( uint16_t ) ++ i;
+
+                /* the remainder should be contig */
+                tok [ 3 + TTextToken_id ] = NCBI_WGS_acc_token_contig;
+                tok [ 3 + TTextToken_start ] = ( uint16_t ) i;
+                tok [ 3 + TTextToken_len ] = ( uint16_t ) ( acc_len - i );
+
+                /* verify that it is numeric */
+                for ( ; i < acc_len; ++ i )
+                {
+                    if ( ! isdigit ( acc [ i ] ) )
+                        break;
+                }
+
+                /* great success */
+                if ( i == acc_len )
+                    return 2;
+            }
+        }
+    }
+
+    tok [ 0 + TTextToken_id ] = NCBI_WGS_acc_token_unrecognized;
+    tok [ 0 + TTextToken_start ] = 0;
+    tok [ 0 + TTextToken_len ] = ( uint16_t ) acc_len;
+
+    return 1;
+}
+
+static
+rc_t CC tokenize_nuc_accession ( void *obj,
+     const VXformInfo *info, int64_t row_id, VRowResult *rslt,
+     uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const char *acc;
+    
+    assert ( rslt -> elem_bits == 16 * 3 );
+
+    rslt -> data -> elem_bits = rslt -> elem_bits;
+    rc = KDataBufferResize ( rslt -> data, 2 );
+    if ( rc != 0 )
+        return rc;
+
+    acc = argv [ 0 ] . u . data . base;
+    acc += argv [ 0 ] . u . data . first_elem;
+
+    rslt -> elem_count = ParseWgsAccession ( rslt -> data -> base, acc, argv [ 0 ] . u . data . elem_count );
+    if ( rslt -> elem_count != 2 )
+        rc = KDataBufferResize ( rslt -> data, rslt -> elem_count );
+
+    return rc;
+}
+
+static
+uint32_t ParseProtAccession ( uint16_t *tok, const char *acc, size_t acc_len )
+{
+    /* Protein accessions generally have pattern 
+     * <Cap-letter prefix><digital suffix>
+     * If this doesn't hold, use full accession as prefix, and make suffix empty.
+     */
+    size_t i;
+
+    for ( i = 0; i < acc_len; ++ i )
+    {
+        if ( isdigit ( acc [ i ] ) )
+            break;
+    }
+
+    tok [ 0 + TTextToken_id ] = NCBI_WGS_acc_token_prefix;
+    tok [ 0 + TTextToken_start ] = 0;
+    tok [ 0 + TTextToken_len ] = ( uint16_t ) i;
+
+    for ( ; i < acc_len; ++ i )
+    {
+        if ( ! isdigit ( acc [ i ] ) )
+            break;
+    }
+
+    if ( i == acc_len )
+    {
+        tok [ 3 + TTextToken_id ] = NCBI_WGS_acc_token_contig;
+        tok [ 3 + TTextToken_start ] = tok [ 0 + TTextToken_len ];
+        tok [ 3 + TTextToken_len ] = ( uint16_t ) ( i - tok [ 0 + TTextToken_len ] );
+        return 2;
+    }
+
+    tok [ 0 + TTextToken_len ] = ( uint16_t ) acc_len;
+    return 1;
+}
+
+static
+rc_t CC tokenize_prot_accession ( void *obj,
+     const VXformInfo *info, int64_t row_id, VRowResult *rslt,
+     uint32_t argc, const VRowData argv [] )
+{
+    rc_t rc;
+    const char *acc;
+    
+    assert ( rslt -> elem_bits == 16 * 3 );
+
+    rslt -> data -> elem_bits = rslt -> elem_bits;
+    rc = KDataBufferResize ( rslt -> data, 2 );
+    if ( rc != 0 )
+        return rc;
+
+    acc = argv [ 0 ] . u . data . base;
+    acc += argv [ 0 ] . u . data . first_elem;
+
+    rslt -> elem_count = ParseProtAccession ( rslt -> data -> base, acc, argv [ 0 ] . u . data . elem_count );
+    if ( rslt -> elem_count != 2 )
+        rc = KDataBufferResize ( rslt -> data, rslt -> elem_count );
+
+    return rc;
+}
+
+VTRANSFACT_IMPL ( NCBI_WGS_tokenize_nuc_accession, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> u . rf = tokenize_nuc_accession;
+    rslt -> variant = vftRow;
+    return 0;
+}
+
+VTRANSFACT_IMPL ( NCBI_WGS_tokenize_prot_accession, 1, 0, 0 ) ( const void *self, const VXfactInfo *info,
+    VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    rslt -> u . rf = tokenize_prot_accession;
+    rslt -> variant = vftRow;
+    return 0;
+}
diff --git a/libs/vxf/zip.c b/libs/vxf/zip.c
new file mode 100644
index 0000000..d79c81d
--- /dev/null
+++ b/libs/vxf/zip.c
@@ -0,0 +1,216 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/extern.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <vdb/xform.h>
+#include <vdb/schema.h>
+#include <klib/data-buffer.h>
+#include <sysalloc.h>
+
+#include <string.h>
+#include <zlib.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#ifndef Z_MIN_LEVEL
+#define Z_MIN_LEVEL Z_DEFAULT_COMPRESSION
+#endif
+
+#ifndef Z_MAX_LEVEL
+#define Z_MAX_LEVEL Z_BEST_COMPRESSION
+#endif
+
+#ifndef Z_MIN_STRATEGY
+#define Z_MIN_STRATEGY Z_DEFAULT_STRATEGY
+#endif
+
+#ifndef Z_MAX_STRATEGY
+#define Z_MAX_STRATEGY Z_RLE
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+
+#define BUFFER_GROWTH_RATE (64 * 1024)
+
+struct self_t {
+    int32_t strategy;
+    int32_t level;
+};
+
+#if _DEBUGGING
+/*
+static void debug_print_z_stream(const z_stream *s) {
+    printf("avail_in: %lu, avail_out: %lu, total_in: %lu, total_out: %lu\n",
+           (unsigned long)s->avail_in,
+           (unsigned long)s->avail_out,
+           (unsigned long)s->total_in,
+           (unsigned long)s->total_out);
+}
+*/
+#endif
+
+static rc_t invoke_zlib(void *dst, uint32_t *dsize, const void *src, uint32_t ssize, int32_t strategy, int32_t level) {
+    z_stream s;
+    int zr;
+    rc_t rc = 0;
+    
+    memset(&s, 0, sizeof(s));
+    s.next_in = (void *)src;
+    s.avail_in = ssize;
+    s.next_out = dst;
+    s.avail_out = *dsize;
+    
+    *dsize = 0;
+    zr = deflateInit2(&s, level, Z_DEFLATED, -15, 9, strategy);
+    switch (zr) {
+    case 0:
+        break;
+    case Z_MEM_ERROR:
+        return RC(rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted);
+    case Z_STREAM_ERROR:
+        return RC(rcXF, rcFunction, rcExecuting, rcParam, rcInvalid);
+    default:
+#if _DEBUGGING
+        fprintf(stderr, "deflateInit2: unexpected zlib error %i: %s (strategy: %i, level: %i)\n", zr, s.msg, strategy, level);
+#endif
+        return RC(rcXF, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+    }
+    zr = deflate(&s, Z_FINISH);
+    switch (zr) {
+    case Z_STREAM_END:
+        break;
+    case Z_OK:
+        s.total_out = 0;
+        break;
+    default:
+#if _DEBUGGING
+        fprintf(stderr, "deflate: unexpected zlib error %i: %s\n", zr, s.msg);
+#endif
+        rc = RC(rcXF, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+        break;
+    }
+    zr = deflateEnd(&s);
+    if (zr != Z_OK && s.total_out != 0) {
+#if _DEBUGGING
+        fprintf(stderr, "deflateEnd: unexpected zlib error %i: %s\n", zr, s.msg);
+#endif
+        rc = RC(rcXF, rcFunction, rcExecuting, rcSelf, rcUnexpected);
+    }
+    if (rc == 0) {
+        assert(s.total_out <= UINT32_MAX);
+        *dsize = (uint32_t)s.total_out;
+    }
+    return rc;
+}
+
+static
+rc_t CC zip_func(
+              void *Self,
+              const VXformInfo *info,
+              VBlobResult *dst,
+              const VBlobData *src,
+              VBlobHeader *hdr
+) {
+    rc_t rc;
+    struct self_t *self = Self;
+
+    /* input bits */
+    uint64_t sbits = ( uint64_t) src -> elem_count * src -> elem_bits;
+
+    /* input bytes */
+    uint32_t ssize = ( uint32_t ) ( ( sbits + 7 ) >> 3 );
+
+    /* required output size */
+    uint32_t dsize = ( uint32_t ) ( ( ( size_t ) dst -> elem_count * dst->elem_bits + 7 ) >> 3 );
+
+    if ( ( sbits & 7 ) == 0 )
+        /* version 1 is byte-aligned */
+        VBlobHeaderSetVersion ( hdr, 1 );
+    else
+    {
+        VBlobHeaderSetVersion ( hdr, 2 );
+        VBlobHeaderArgPushTail ( hdr, ( int64_t ) ( sbits & 7 ) );
+    }
+
+    rc = invoke_zlib ( dst -> data, & dsize, src -> data, ssize, self->strategy, self->level);
+    if (rc == 0) {
+        dst->elem_bits = 1;
+        dst->byte_order = src->byte_order;
+        if (dsize)
+            dst->elem_count = dsize << 3;
+        else
+            rc = RC(rcXF, rcFunction, rcExecuting, rcBuffer, rcInsufficient);
+    }
+    return rc;
+}
+
+static
+void CC vxf_zip_wrapper( void *ptr )
+{
+	free( ptr );
+}
+
+/* zip
+ * function zlib_fmt zip #1.0 < * I32 strategy, I32 level > ( any in );
+ */
+VTRANSFACT_IMPL(vdb_zip, 1, 0, 0) (const void *self, const VXfactInfo *info, VFuncDesc *rslt, const VFactoryParams *cp, const VFunctionParams *dp )
+{
+    struct self_t *ctx;
+
+    int strategy = Z_RLE;
+    int level = Z_BEST_SPEED;
+
+    if ( cp -> argc > 0 )
+    {
+        strategy = cp -> argv [ 0 ] . data . i32 [ 0 ];
+        if ( strategy < Z_MIN_STRATEGY || strategy > Z_MAX_STRATEGY )
+            return RC(rcXF, rcFunction, rcConstructing, rcParam, rcInvalid);
+        if ( cp -> argc > 1 )
+        {
+            level = cp -> argv [ 1 ] . data . i32 [ 0 ];
+            if ( level < Z_MIN_LEVEL || level > Z_MAX_LEVEL )
+                return RC(rcXF, rcFunction, rcConstructing, rcRange, rcInvalid);
+        }
+    }
+
+    ctx = malloc(sizeof(*ctx));
+    if (ctx) {
+        ctx->strategy = strategy;
+        ctx->level = level;
+       
+        rslt->self = ctx;
+        rslt->whack = vxf_zip_wrapper;
+        rslt->variant = vftBlob;
+        rslt->u.bf = zip_func;
+        
+        return 0;
+    }
+    return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
diff --git a/libs/wgsxf/Makefile b/libs/wgsxf/Makefile
new file mode 100644
index 0000000..26ae176
--- /dev/null
+++ b/libs/wgsxf/Makefile
@@ -0,0 +1,127 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = libs/wgsxf
+
+INT_LIBS = \
+	libwgsxf \
+	libwwgsxf
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+OBJFILES =       \
+	$(WGSXF_OBJ) \
+	$(WWGSXF_OBJ)
+
+include $(TOP)/build/Makefile.env
+
+RWORKDIR = $(BINDIR)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs compile
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(TARGDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# wgs-vdb transform library
+#
+$(TARGDIR)/libwgsxf: $(addprefix $(ILIBDIR)/libwgsxf.,$(ILIBEXT))
+
+WGSXF_SRC = \
+	build_scaffold \
+	build_read_type
+
+WGSXF_OBJ = \
+	$(addsuffix .$(LOBX),$(WGSXF_SRC))
+
+WGSXF_LIB = \
+	-dvdb \
+	-dklib \
+	-dm \
+	-dz \
+	-dbz2
+
+$(ILIBDIR)/libwgsxf.$(LIBX): $(WGSXF_OBJ)
+	$(LD) --slib -o $@ $^ $(WGSXF_LIB)
+
+.PHONY: $(TARGDIR)/libwgsxf
+
+#-------------------------------------------------------------------------------
+# update-side wgs transform library
+#
+
+$(TARGDIR)/libwwgsxf: $(addprefix $(ILIBDIR)/libwwgsxf.,$(ILIBEXT))
+
+WWGSXF_SRC = \
+	$(WGSXF_SRC)
+
+WWGSXF_OBJ = \
+	$(addsuffix .$(LOBX),$(WWGSXF_SRC))
+
+# temporary
+WWGSXF_LIB = \
+	-dwvdb \
+	-dwkdb \
+	-dklib \
+	-dm \
+	-dz \
+	-dbz2
+
+$(ILIBDIR)/libwwgsxf.$(LIBX): $(WWGSXF_OBJ)
+	$(LD) --slib -o $@ $^ $(WWGSXF_LIB)
+
+libwwgsxf.vers.h:
+	@ true
+
+.PHONY: $(TARGDIR)/libwwgsxf
+
+compile: stdcompile
+
+$(TARGDIR)/compile: $(OBJFILES)
diff --git a/libs/wgsxf/build_read_type.c b/libs/wgsxf/build_read_type.c
new file mode 100644
index 0000000..02ebed5
--- /dev/null
+++ b/libs/wgsxf/build_read_type.c
@@ -0,0 +1,113 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <insdc/insdc.h>
+#include <insdc/sra.h>
+#include <ncbi/wgs-contig.h>
+
+static
+rc_t build_read_type(INSDC_SRA_xread_type dst[],
+                     unsigned const components,
+                     NCBI_WGS_component_props const Props[/* components */])
+{
+    unsigned i;
+    
+    for (i = 0; i != components; ++i) {
+        int const props = Props[i];
+        
+        if (props < 0) {
+            dst[i] = SRA_READ_TYPE_TECHNICAL;
+        }
+        else {
+            int const type = props & 0x0F;
+            
+            if (type == 0) {
+                int const strand = props & ~(NCBI_WGS_strand_plus | NCBI_WGS_strand_minus);
+                
+                switch (strand) {
+                case 0:
+                    dst[i] = SRA_READ_TYPE_BIOLOGICAL;
+                    break;
+                case NCBI_WGS_strand_plus:
+                    dst[i] = SRA_READ_TYPE_BIOLOGICAL | SRA_READ_TYPE_FORWARD;
+                    break;
+                case NCBI_WGS_strand_minus:
+                    dst[i] = SRA_READ_TYPE_BIOLOGICAL | SRA_READ_TYPE_REVERSE;
+                    break;
+                default:
+                    return RC(rcXF, rcFunction, rcExecuting, rcType, rcInvalid);
+                }
+            }
+            else
+                return RC(rcXF, rcFunction, rcExecuting, rcType, rcInvalid);
+        }
+    }
+    return 0;
+}
+
+/*
+ * function INSDC:SRA:xread_type NCBI:WGS:build_read_type #1
+ *     ( NCBI:WGS:component_props component_props )
+ */
+
+static
+rc_t CC build_read_type_impl(void *self, VXformInfo const *info, int64_t row_id,
+                             VFixedRowResult const *rslt,
+                             uint32_t argc, VRowData const argv[])
+{
+    NCBI_WGS_component_props const *const props = argv[0].u.data.base;
+    unsigned const components = argv[0].u.data.elem_count;
+    INSDC_SRA_xread_type *const dst = rslt->base;
+
+    return build_read_type(&dst[rslt->first_elem], components,
+                           &props[argv[0].u.data.first_elem]);
+}
+
+VTRANSFACT_IMPL(NCBI_WGS_build_read_type, 1, 0, 0)(void const *const Self,
+                                                   VXfactInfo const *const info,
+                                                   VFuncDesc *const rslt,
+                                                   VFactoryParams const *const cp,
+                                                   VFunctionParams const *const dp)
+{
+    rslt->variant = vftFixedRow;
+    rslt->u.pf = build_read_type_impl;
+    return 0;
+}
diff --git a/libs/wgsxf/build_scaffold.c b/libs/wgsxf/build_scaffold.c
new file mode 100644
index 0000000..0940545
--- /dev/null
+++ b/libs/wgsxf/build_scaffold.c
@@ -0,0 +1,435 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vdb/extern.h>
+#include <vdb/xform.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <kdb/meta.h>
+#include <klib/data-buffer.h>
+#include <insdc/insdc.h>
+#include <align/refseq-mgr.h>
+#include <bitstr.h>
+#include <sysalloc.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <insdc/sra.h>
+#include <ncbi/wgs-contig.h>
+
+#define READ_GAP_VALUE (0)
+#define QUAL_GAP_VALUE (2)
+
+#define CURSOR_CACHE_SIZE (4 * 1024 * 1024)
+
+typedef struct self_t self_t;
+typedef rc_t (*impl_f)(self_t const *const self, void *const Dst,
+                       unsigned const components,
+                       INSDC_coord_one const start[/* components */],
+                       INSDC_coord_len const length[/* components */],
+                       NCBI_WGS_component_props const props[/* components */],
+                       int64_t const join[/* components */]);
+
+struct self_t
+{
+    VCursor const *curs;
+    uint32_t col_idx;
+    impl_f impl;
+};
+
+static void free_self(self_t *const self)
+{
+    VCursorRelease(self->curs);
+}
+
+static
+void CC whack(void *vp)
+{
+    if (vp) {
+        free_self(vp);
+        free(vp);
+    }
+}
+
+
+static bool does_table_have_column( VTable const * tbl, char const column[] )
+{
+    KNamelist * column_names;
+    bool res = false;
+    rc_t rc = VTableListReadableColumns ( tbl, &column_names );
+    if ( rc == 0 )
+    {
+        uint32_t count;
+        rc = KNamelistCount ( column_names, &count );
+        if ( rc == 0 && count > 0 )
+        {
+            uint32_t idx;
+            size_t col_name_size;
+            const char * col_name = string_chr ( column, string_size( column ), ')' );
+            if ( col_name == NULL )
+                col_name = column;
+            else
+                col_name++;
+            col_name_size = string_size( col_name );
+            for ( idx = 0; idx < count && rc == 0 && !res; ++idx )
+            {
+                const char * name;
+                rc = KNamelistGet ( column_names, idx, &name );
+                if ( rc == 0 && name != NULL )
+                {
+                    int cmp = string_cmp( col_name, col_name_size,
+                                          name, string_size( name ), 0xFFFF );
+                    if ( cmp == 0 )
+                        res = true;
+                }
+            }
+        }
+        KNamelistRelease ( column_names );
+    }
+    return res;
+}
+
+
+static
+rc_t init_self( self_t *self, VTable const * const srctbl, char const column[] )
+{
+    VDatabase const * db;
+    rc_t rc = VTableOpenParentRead( srctbl, &db );
+    if ( rc == 0 )
+    {
+        VTable const * tbl;
+        rc = VDatabaseOpenTableRead( db, &tbl, "SEQUENCE" );
+        VDatabaseRelease( db );
+        if ( rc == 0 )
+        {
+            bool has_column = does_table_have_column( tbl, column );
+            if ( !has_column )
+                VTableRelease( tbl );
+            else
+            {
+                VCursor const * curs;
+#if CURSOR_CACHE_SIZE
+                rc = VTableCreateCachedCursorRead( tbl, &curs, CURSOR_CACHE_SIZE );
+#else
+                rc = VTableCreateCursorRead( tbl, &curs );
+#endif
+                VTableRelease( tbl );
+                if ( rc == 0 )
+                {
+                    uint32_t col_idx;
+                    rc = VCursorAddColumn( curs, &col_idx, "%s", column );
+                    if ( rc == 0 )
+                    {
+                        rc = VCursorOpen( curs );
+                        if ( rc == 0 )
+                        {
+                            self->curs = curs;
+                            self->col_idx = col_idx;
+                            return 0;
+                        }
+                        if ( GetRCObject( rc ) == (enum RCObject)rcColumn && GetRCState( rc ) == rcUndefined )
+                            rc = 0;
+                    }
+                    VCursorRelease( curs );
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+static
+rc_t build_scaffold_read_impl(self_t const *const self, void *const Dst,
+                              unsigned const components,
+                              INSDC_coord_one const Start[/* components */],
+                              INSDC_coord_len const Length[/* components */],
+                              NCBI_WGS_component_props const Props[/* components */],
+                              int64_t const join[/* components */])
+{
+    INSDC_4na_bin *const dst = Dst;
+    unsigned i;
+    unsigned j;
+    unsigned id;
+    rc_t rc;
+    
+    for (rc = 0, id = j = i = 0; rc == 0 && i != components; ++i) {
+        INSDC_coord_len const length = Length[i];
+        int const props = Props[i];
+
+        if (props < 0) {
+            /* gap */
+            memset(dst + j, READ_GAP_VALUE, length);
+        }
+        else if (self->curs == NULL) {
+            memset(dst + j, 15, length);
+        }
+        else {
+            int const type = props & 0x0F;
+            int const strand = (props & ~(NCBI_WGS_strand_plus | NCBI_WGS_strand_minus)) >> 4;
+            
+            if (type != 0 || strand == 3)
+                rc = RC(rcXF, rcFunction, rcExecuting, rcType, rcInvalid);
+            else {
+                int64_t const row = join[id++];
+                uint32_t elem_bits;
+                uint32_t bit_offset;
+                uint32_t elem_count;
+                void const *base;
+                
+                rc = VCursorCellDataDirect(self->curs, row, self->col_idx,
+                                           &elem_bits, &base, &bit_offset,
+                                           &elem_count);
+                assert(bit_offset == 0);
+                if (rc == 0) {
+                    INSDC_coord_one const start = Start[i] - 1;
+                    
+                    if (elem_count < start + length)
+                        rc = RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+                    else {
+                        INSDC_4na_bin const *const src = base;
+                        
+                        if (strand == 2) {
+                            static INSDC_4na_bin const complement[] = {
+                                /* 0  0000 - 0000*/  0,
+                                /* 1  0001 - 1000*/  8,
+                                /* 2  0010 - 0100*/  4,
+                                /* 3  0011 - 1100*/ 12,
+                                /* 4  0100 - 0010*/  2,
+                                /* 5  0101 - 1010*/ 10,
+                                /* 6  0110 - 0110*/  6,
+                                /* 7  0111 - 1110*/ 14,
+                                /* 8  1000 - 0001*/  1,
+                                /* 9  1001 - 1001*/  9,
+                                /*10  1010 - 0101*/  5,
+                                /*11  1011 - 1101*/ 13,
+                                /*12  1100 - 0011*/  3,
+                                /*13  1101 - 1011*/ 11,
+                                /*14  1110 - 0111*/  7,
+                                /*15  1111 - 1111*/ 15
+                            };
+                            unsigned k;
+                            unsigned jj;
+                            
+                            for (jj = j + length, k = 0; k != length; ++k) {
+                                INSDC_4na_bin const elem = src[start + k];
+                                
+                                assert(/* 0 <= elem && */ elem <= 15);
+                                --jj;
+                                dst[jj] = complement[elem];
+                            }
+                        }
+                        else
+                            memmove(&dst[j], &src[start], length);
+                    }
+                }
+            }
+        }
+
+        j += length;
+    }
+    return rc;
+}
+
+static
+rc_t build_scaffold_qual_impl(self_t const *const self, void *const Dst,
+                              unsigned const components,
+                              INSDC_coord_one const Start[/* components */],
+                              INSDC_coord_len const Length[/* components */],
+                              NCBI_WGS_component_props const Props[/* components */],
+                              int64_t const join[/* components */])
+{
+    INSDC_quality_phred *const dst = Dst;
+    unsigned i;
+    unsigned j;
+    unsigned id;
+    rc_t rc;
+    
+    for (rc = 0, id = j = i = 0; rc == 0 && i != components; ++i) {
+        INSDC_coord_len const length = Length[i];
+        int const props = Props[i];
+        
+        if (props < 0) {
+            /* gap */
+            memset(dst + j, QUAL_GAP_VALUE, length);
+        }
+        else if (self->curs == NULL) {
+            memset(dst + j, 30, length);
+        }
+        else {
+            int const type = props & 0x0F;
+            int const strand = (props & ~(NCBI_WGS_strand_plus | NCBI_WGS_strand_minus)) >> 4;
+            
+            if (type != 0 || strand == 3)
+                rc = RC(rcXF, rcFunction, rcExecuting, rcType, rcInvalid);
+            else {
+                int64_t const row = join[id++];
+                uint32_t elem_bits;
+                uint32_t bit_offset;
+                uint32_t elem_count;
+                void const *base;
+                
+                rc = VCursorCellDataDirect(self->curs, row, self->col_idx,
+                                           &elem_bits, &base, &bit_offset,
+                                           &elem_count);
+                assert(bit_offset == 0);
+                if (rc == 0) {
+                    INSDC_quality_phred const start = Start[i] - 1;
+                    
+                    if (elem_count < start + length)
+                        rc = RC(rcXF, rcFunction, rcExecuting, rcData, rcInsufficient);
+                    else {
+                        INSDC_quality_phred const *const src = base;
+                        
+                        if (strand == 2) {
+                            unsigned k;
+                            unsigned jj;
+                            
+                            for (jj = j + length, k = 0; k != length; ++k) {
+                                INSDC_quality_phred const elem = src[start + k];
+                                
+                                --jj;
+                                dst[jj] = elem;
+                            }
+                        }
+                        else
+                            memmove(&dst[j], &src[start], length);
+                    }
+                }
+            }
+        }
+        
+        j += length;
+    }
+    return rc;
+}
+
+static
+unsigned total_length(unsigned const components, INSDC_coord_len const length[/* components */])
+{
+    unsigned i;
+    unsigned len;
+    
+    for (i = len = 0; i != components; ++i)
+        len += length[i];
+    return len;
+}
+
+
+/*
+ * function INSDC:4na:bin NCBI:WGS:build_scaffold_read #1
+ *     ( INSDC:coord:one component_start, INSDC:coord:len component_len,
+ *       NCBI:WGS:component_props component_props, I64 component_id )
+ *
+ * function INSDC:quality:phred NCBI:WGS:build_scaffold_qual #1
+ *     ( INSDC:coord:one component_start, INSDC:coord:len component_len,
+ *       NCBI:WGS:component_props component_props, I64 component_id )
+ */
+
+static
+rc_t CC build_scaffold_impl(void *const data, VXformInfo const *const info,
+                            int64_t const row_id, VRowResult *const rslt,
+                            uint32_t const argc, VRowData const argv[])
+{
+    self_t const *const self = data;
+    INSDC_coord_one const *const start = argv[0].u.data.base;
+    INSDC_coord_len const *const length = argv[1].u.data.base;
+    NCBI_WGS_component_props const *const props = argv[2].u.data.base;
+    int64_t const *const join = argv[3].u.data.base;
+    unsigned const components = argv[0].u.data.elem_count;
+    rc_t rc;
+    
+    assert(argv[1].u.data.elem_count == components);
+    assert(argv[2].u.data.elem_count == components);
+    
+    assert(start != NULL);
+    assert(length != NULL);
+    assert(props != NULL);
+    assert(join != NULL);
+    
+    assert(rslt->elem_bits == 8);
+    rslt->elem_count = total_length(components, &length[argv[1].u.data.first_elem]);
+    rc = KDataBufferResize(rslt->data, rslt->elem_count);
+    if (rc == 0)
+        rc = self->impl(self, rslt->data->base, components,
+                        &start[argv[0].u.data.first_elem],
+                        &length[argv[1].u.data.first_elem],
+                        &props[argv[2].u.data.first_elem],
+                        &join[argv[3].u.data.first_elem]);
+    return rc;
+}
+
+VTRANSFACT_IMPL(NCBI_WGS_build_scaffold_read, 1, 0, 0)(void const * Self,
+                                                       VXfactInfo const * info,
+                                                       VFuncDesc * rslt,
+                                                       VFactoryParams const * cp,
+                                                       VFunctionParams const * dp)
+{
+    self_t *self = calloc(1, sizeof(*self));
+    if (self) {
+        rc_t const rc = init_self(self, info->tbl, "(INSDC:4na:bin)READ");
+        
+        if (rc == 0) {
+            self->impl = build_scaffold_read_impl;
+            
+            rslt->self = self;
+            rslt->whack = whack;
+            rslt->variant = vftRow;
+            rslt->u.rf = build_scaffold_impl;
+        }
+        return rc;
+    }
+    return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
+
+VTRANSFACT_IMPL(NCBI_WGS_build_scaffold_qual, 1, 0, 0)(void const * Self,
+                                                       VXfactInfo const * info,
+                                                       VFuncDesc * rslt,
+                                                       VFactoryParams const * cp,
+                                                       VFunctionParams const * dp)
+{
+    self_t *self = calloc(1, sizeof(*self));
+    if (self) {
+        rc_t const rc = init_self(self, info->tbl, "(INSDC:quality:phred)QUALITY");
+    
+        if (rc == 0) {
+            self->impl = build_scaffold_qual_impl;
+            
+            rslt->self = self;
+            rslt->whack = whack;
+            rslt->variant = vftRow;
+            rslt->u.rf = build_scaffold_impl;
+        }
+        return rc;
+    }
+    return RC(rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted);
+}
diff --git a/libs/xfs/Makefile b/libs/xfs/Makefile
new file mode 100644
index 0000000..d9afc08
--- /dev/null
+++ b/libs/xfs/Makefile
@@ -0,0 +1,140 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: all
+
+TOP ?= $(abspath ../..)
+
+MODULE = libs/xfs
+
+include $(TOP)/build/Makefile.env
+RWORKDIR=$(TOP)/$(MODULE)
+
+ifeq (mac,$(OS))
+TOP = $(shell cd ../.. && pwd )
+endif
+
+
+INT_LIBS = \
+	libxfs
+
+ALL_LIBS = \
+	$(INT_LIBS)
+
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: vers-includes
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): vers-includes
+	@ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# vers-includes
+#
+$(TARGDIR)/vers-includes: $(addsuffix .vers.h,$(EXT_LIBS))
+
+.PHONY: $(TARGDIR)/vers-includes
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+ifeq (mac,$(OS))
+INCDIRS += -I/usr/local/include/osxfuse/fuse
+endif
+
+#-------------------------------------------------------------------------------
+# xfs
+#
+$(ILIBDIR)/libxfs: $(addprefix $(ILIBDIR)/libxfs.,$(ILIBEXT))
+
+XFS_SRC = \
+    xfs \
+    xlog    \
+    platform \
+    operations  \
+    security    \
+    model    \
+    tree    \
+    node    \
+    path    \
+    perm    \
+    editors \
+    handle  \
+    teleport    \
+    foo \
+    ncon  \
+    contnode    \
+    docnode \
+    simcon  \
+    kfs   \
+    readme  \
+    bogus     \
+    owp \
+    doc \
+    xhttp    \
+    http    \
+    xtar     \
+    tar     \
+    xencro     \
+    encro     \
+    xencws     \
+    encws     \
+    spen    \
+    xgap    \
+    xgapf    \
+    xgapk   \
+    gapk    \
+    gapks   \
+    gapka   \
+    gapc   \
+    gap     \
+    gapf    \
+    lockdpt \
+    lreader \
+    schwarzschraube \
+    zehr    \
+    mehr
+
+XFS_OBJ = \
+	$(addsuffix .$(LOBX),$(XFS_SRC))
+
+$(ILIBDIR)/libxfs.$(LIBX): $(XFS_OBJ)
+	$(LD) --slib -o $@ $^ $(XFS_LIB)
diff --git a/libs/xfs/bogus.c b/libs/xfs/bogus.c
new file mode 100644
index 0000000..e2d7c0f
--- /dev/null
+++ b/libs/xfs/bogus.c
@@ -0,0 +1,373 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/editors.h>
+
+#include "mehr.h"
+#include "zehr.h"
+#include "ncon.h"
+#include "teleport.h"
+#include "common.h"
+
+#include <sysalloc.h>
+
+/*)))
+ |||
+ +++    BogusNode: apparently there are two types of node : NotFound
+ +++    and BadPath node. Needed to comply for all other methods
+ +++    It is purely not Teleport node :P
+ |||
+(((*/
+
+struct XFSBogusNode {
+    struct XFSNode Node;
+
+    bool NotFoundType;
+};
+
+/*)))
+ |||
+ +++    BogusNode virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _BogusNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _BogusNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _BogusNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _BogusNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _BogusNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sBogusNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _BogusNodeFlavor_v1,
+                                        _BogusNodeDispose_v1,
+                                        _BogusNodeFindNode_v1,
+                                        NULL,
+                                        NULL,
+                                        _BogusNodeAttr_v1,
+                                        _BogusNodeDescribe_v1
+                                        };
+
+static rc_t CC _BogusNodeDispose ( const struct XFSBogusNode * self );
+
+uint32_t CC
+_BogusNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    return _sFlavorOfBogus;
+}   /* _BogusNodeFlavor_v1 () */
+
+rc_t CC
+_BogusNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return _BogusNodeDispose ( ( const struct XFSBogusNode * ) self );
+}   /* _BogusNodeDispose_v1 () */
+
+rc_t CC
+_BogusNodeFindNode_v1 (
+            const struct XFSNode * self,
+            const struct XFSPath * Path,
+            uint32_t PathIndex,
+            const struct XFSNode ** Node
+)
+{
+    return XFS_RC ( rcInvalid );
+}   /* _BogusNodeFindNode () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))   Attrs
+ (((*/
+static
+rc_t CC
+_BogusNodeAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+    struct XFSAttrEditor * Editor;
+
+    Editor = ( struct XFSAttrEditor * ) self;
+
+/*
+pLogMsg ( klogDebug, " _BogusNodeAttr_dispose_ ( $(editor) )", "editor=0x%p", ( void * ) Editor );
+*/
+
+    if ( Editor == 0 ) {
+        return 0;
+    }
+
+    if ( ( Editor -> Papahen ) . Node != NULL ) {
+        XFSNodeRelease ( ( Editor -> Papahen ) . Node );
+
+        ( Editor -> Papahen ) . Node = NULL;
+    }
+
+    free ( Editor );
+
+    return 0;
+}   /* _BogusNodeAttr_dispose_v1 () */
+
+static
+rc_t CC
+_BogusNodeAttr_type_v1 (
+            const struct XFSAttrEditor * self,
+            XFSNType * Type
+)
+{
+    struct XFSBogusNode * Bogus = NULL;
+
+    if ( self == NULL || Type == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Type = kxfsNotFound;
+
+    if ( ( self -> Papahen ) . Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Bogus = ( struct XFSBogusNode * ) ( self -> Papahen ) . Node;
+    * Type = ( Bogus -> NotFoundType == true )
+                                            ? kxfsNotFound
+                                            : kxfsBadPath
+                                            ;
+
+    return 0;
+}   /* _BogusNodeAttr_type_v1 () */
+
+static
+rc_t CC
+_BogusNodeAttr_v1 (
+            const struct XFSNode * self,
+            const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    if ( self == NULL || Attr == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Attr = NULL;
+
+    Editor = calloc ( 1, sizeof ( struct XFSAttrEditor ) );
+    if ( Editor == NULL ) {
+        XFSNodeRelease ( self );
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                        & ( Editor -> Papahen ),
+                        self,
+                        _BogusNodeAttr_dispose_v1
+                        );
+
+    if ( RCt == 0 ) {
+        Editor -> type = _BogusNodeAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+/*
+pLogMsg ( klogDebug, " _BogusNodeAttr_ ( $(editor) )", "editor=0x%p", ( void * ) Editor );
+*/
+
+    return RCt;
+}   /* _BogusNodeAttr_v1 () */
+
+rc_t CC
+_BogusNodeDescribe_v1 (
+                const struct XFSNode * self,
+                char * Buffer,
+                size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+
+    RCt = 0;
+    NumWrit = 0;
+
+    if ( Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self == NULL ) {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (BOGUS)[NULL][NULL]"
+                    );
+    }
+    else {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[%s][0x%p]",
+                    ( ( struct XFSBogusNode * ) self ) -> NotFoundType
+                            ? "NotFound"
+                            : "BadPath"
+                            ,
+                    self -> Name,
+                    self
+                    );
+    }
+
+    return RCt;
+}   /* _BogusNodeDescribe_v1 () */
+
+/*)))
+ |||
+ +++    BogusNode lives here
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+static
+rc_t CC
+_BogusNodeDispose ( const struct XFSBogusNode * self )
+{
+    struct XFSBogusNode * Node = ( struct XFSBogusNode * ) self;
+
+/*
+pLogMsg ( klogDebug, " _BogusNodeDispose ( $(node) )", "node=0x%p", ( void * ) Node );
+*/
+    if ( Node == NULL ) {
+        return 0;
+    }
+
+    free ( Node );
+
+    return 0;
+}   /* _BogusNodeDispose () */
+
+static
+rc_t CC
+_BogusNodeMake ( 
+            const char * NodeName,
+            bool NotFoundType,
+            const struct XFSBogusNode ** Node )
+{
+    rc_t RCt;
+    struct XFSBogusNode * TheNode;
+
+    RCt = 0;
+    TheNode = NULL;
+
+    if ( NodeName == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Node = NULL;
+
+    TheNode = calloc ( 1, sizeof ( struct XFSBogusNode ) );
+    if ( TheNode == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        TheNode -> NotFoundType = NotFoundType;
+
+        RCt = XFSNodeInitVT (
+                        & ( TheNode -> Node ),
+                        NodeName,
+                        ( const union XFSNode_vt * ) & _sBogusNodeVT_v1
+                        );
+
+        if ( RCt == 0 ) {
+            * Node = TheNode;
+        }
+        else {
+            XFSNodeDispose ( ( const struct XFSNode * ) TheNode );
+        }
+    }
+/*
+pLogMsg ( klogDebug, " _BogusNodeDispose ( $(name), $(node) )", "name=%s,node=0x%p", NodeName, ( void * ) TheNode );
+*/
+
+    return RCt;
+}   /* _BogusNodeMake () */
+
+/*))))
+ ////   Make methods
+((((*/
+
+LIB_EXPORT
+rc_t CC
+XFSNodeNotFoundMake (
+                const char * NodeName,
+                const struct XFSNode ** Node
+)
+{
+    return _BogusNodeMake (
+                        NodeName,
+                        true,
+                        ( const struct XFSBogusNode ** ) Node
+                        );
+}   /* XFSNodeNotFoundMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeBadPathMake (
+                const char * NodeName,
+                const struct XFSNode ** Node
+)
+{
+    return _BogusNodeMake (
+                        NodeName,
+                        false,
+                        ( const struct XFSBogusNode ** ) Node
+                        );
+}   /* XFSNodeBadPathMake () */
diff --git a/libs/xfs/common.h b/libs/xfs/common.h
new file mode 100644
index 0000000..f417301
--- /dev/null
+++ b/libs/xfs/common.h
@@ -0,0 +1,217 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_common_
+#define _h_common_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   This file contains all unsorted common things
+  ))))
+ ((((*/
+
+/*))    Flavors ... all kind
+ ((*/
+static const uint32_t _sFlavorLess                = 0;
+static const uint32_t _sFlavorOfFoo               = 1;
+static const uint32_t _sFlavorOfBogus             = 2;
+static const uint32_t _sFlavorOfContNode          = 3;
+static const uint32_t _sFlavorOfSimpleContainer   = 4;
+static const uint32_t _sFlavorOfKfs               = 5;
+static const uint32_t _sFlavorOfReadMe            = 6;
+static const uint32_t _sFlavorOfHttp              = 7;
+static const uint32_t _sFlavorOfTar               = 8;
+static const uint32_t _sFlavorOfEncode            = 9;
+static const uint32_t _sFlavorOfWorkspace         = 10;
+static const uint32_t _sFlavorOfGapProject        = 11;
+static const uint32_t _sFlavorOfGapProjectCache   = 12;
+static const uint32_t _sFlavorOfGapPublicCache    = 13;
+static const uint32_t _sFlavorOfGapKarts          = 14;
+static const uint32_t _sFlavorOfGapKart           = 15;
+static const uint32_t _sFlavorOfGapFile           = 16;
+static const uint32_t _sFlavorOfGapKartFiles      = 17;
+
+/*))    Methods related to all commonly used nodes
+ ((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* FileNode and DirNode - implemented in kfs.c                       */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+struct XFSHandle;
+struct KFile;
+
+XFS_EXTERN rc_t CC XFSFileNodeMakeHandle (
+                            const struct XFSHandle ** Handle,
+                            struct XFSNode * FileNode,
+                            struct KFile * File
+                            );
+
+XFS_EXTERN rc_t CC XFSFileNodeMake (
+                            struct XFSNode ** Node,
+                            const char * Path,
+                            const char * Name,
+                            const char * Perm   /* Could be NULL */
+                            );
+
+XFS_EXTERN rc_t CC XFSDirNodeMake (
+                            struct XFSNode ** Node,
+                            const char * Path,
+                            const char * Name,
+                            const char * Perm   /* Could be NULL */
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* DocNode - implemented in docnode.c                                */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+struct XFSDoc;
+
+XFS_EXTERN rc_t CC XFSDocNodeMake (
+                            struct XFSNode ** Node,
+                            const struct XFSDoc * Doc,
+                            const char * Name,
+                            const char * Perm       /* Could be NULL */
+                            );
+
+XFS_EXTERN rc_t CC XFSDocNodeMakeWithFlavor (
+                            struct XFSNode ** Node,
+                            const struct XFSDoc * Doc,
+                            const char * Name,
+                            const char * Perm,      /* Could be NULL */
+                            uint32_t Flavor 
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* TarArchiveNode - implemented in tar.c                             */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+XFS_EXTERN rc_t CC XFSTarArchiveNodeMake (
+                            struct XFSNode ** Node,
+                            const char * Name,
+                            const char * Path,
+                            const char * Perm       /* Could be NULL */
+                                                    /* Not used nos */
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* EncryptedFileNode - implemented in encro.c                        */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+XFS_EXTERN rc_t CC XFSEncryptedFileNodeMake (
+                            struct XFSNode ** Node,
+                            const char * Name,
+                            const char * Path,
+                            const char * Passwd,
+                            const char * EncType    /* could be NULL */
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* WorkspaceNode - implemented in encws.c                            */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+XFS_EXTERN rc_t CC XFSWorkspaceNodeMake (
+                            struct XFSNode ** Node,
+                            const char * Name,
+                            const char * Path,
+                            const char * Passwd,
+                            const char * EncType,   /* could be NULL */
+                            bool ReadOnly
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* GapProjectNode - implemented in gap.c                             */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+XFS_EXTERN rc_t CC XFSGapProjectNodeMake (
+                            struct XFSNode ** Node,
+                            const char * Name,
+                            uint32_t ProjectId,
+                            bool ReadOnly,          /* RW if not */
+                            const char * Perm       /* Could be NULL */
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* KartsNode - implemented in gapks.c                                */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+XFS_EXTERN rc_t CC XFSGapKartsNodeMake (
+                            struct XFSNode ** Node,
+                            uint32_t ProjectId,
+                            const char * Perm       /* Could be NULL */
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* KartNode - implemented in gapk.c                                  */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+XFS_EXTERN rc_t CC XFSGapKartNodeMake (
+                            struct XFSNode ** Node,
+                            const char * Name,
+                            uint32_t ProjectId,
+                            const char * Perm       /* Could be NULL */
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* GapFileNode - implemented in gapf.c                               */
+/*   NOTE : Accession != NULL || ObjectId != 0                       */
+/*   NOTE : Name could be NULL if Accession != NULL                  */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+XFS_EXTERN rc_t CC XFSGapFileNodeMake (
+                            struct XFSNode ** Node,
+                            const char * Name,
+                            uint32_t ProjectId,
+                            const char * Accession,
+                            uint32_t ObjectId
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* KartFilesNode - implemented in gapks.c                            */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+XFS_EXTERN rc_t CC XFSGapKartFilesNodeMake (
+                            struct XFSNode ** Node,
+                            const char * Perm       /* Could be NULL */
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* GapCacheNode - implemented in gap_cache.c                         */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+XFS_EXTERN rc_t CC XFSGapCacheNodeMake (
+                            struct XFSNode ** Node,
+                            uint32_t ProjectId,     /* public if NULL */
+                            const char * Perm       /* could be NULL */
+                            );
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _h_common_ */
diff --git a/libs/xfs/contnode.c b/libs/xfs/contnode.c
new file mode 100644
index 0000000..c32722b
--- /dev/null
+++ b/libs/xfs/contnode.c
@@ -0,0 +1,685 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/perm.h>
+
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "ncon.h"
+#include "teleport.h"
+#include "common.h"
+#include "contnode.h"
+
+#include <sysalloc.h>
+
+/*)))
+  |||
+  +++    ContNode, and other simple containers
+  |||
+  (((*/
+
+/*)))
+ |||
+ +++    Simple Container virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _ContNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _ContNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _ContNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _ContNodeDir_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSDirEditor ** Dir
+                                );
+static rc_t CC _ContNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _ContNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sContNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _ContNodeFlavor_v1,
+                                        _ContNodeDispose_v1,
+                                        _ContNodeFindNode_v1,
+                                        _ContNodeDir_v1,
+                                        NULL,
+                                        _ContNodeAttr_v1,
+                                        _ContNodeDescribe_v1
+                                        };
+
+static
+rc_t CC
+_ContNodeDispose ( const struct XFSContNode * self )
+{
+    struct XFSContNode * Container =
+                                ( struct XFSContNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "_ContNodeDispose ( $(container) )", "container=0x%p", ( void * ) Container );
+*/
+    if ( Container == 0 ) {
+        return 0;
+    }
+
+    if ( Container -> container != NULL ) {
+        XFSNodeContainerRelease ( Container -> container );
+        Container -> container = NULL;
+    }
+
+    if ( Container -> security != NULL ) {
+        free ( ( char * ) Container -> security );
+        Container -> security = NULL;
+    }
+
+    if ( Container -> disposer != NULL ) {
+        Container -> disposer ( Container );
+    }
+    else {
+        free ( Container );
+    }
+
+    return 0;
+}   /* _ContNodeDispose () */
+
+/*)))
+ |||
+ +++    Here we are creating and disposing that node
+ |||
+(((*/
+
+uint32_t CC
+_ContNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    return ( ( const struct XFSContNode * ) self ) -> flavor;
+}   /* _ContNodeFlavor_v1 () */
+
+rc_t CC
+_ContNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return _ContNodeDispose ( ( const struct XFSContNode * ) self );
+}   /* _ContNodeDispose_v1 () */
+
+/*)))
+ (((    First check itself and all others after.
+  )))
+ (((*/
+rc_t CC
+_ContNodeFindNode_v1 (
+                    const struct XFSNode * self,
+                    const struct XFSPath * Path,
+                    uint32_t PathIndex,
+                    const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    bool IsLast;
+    const struct XFSNode * NextNode;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    IsLast = false;
+    NextNode = NULL;
+
+        /* Standard check-initialization */
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                            self,
+                                            Path,
+                                            PathIndex,
+                                            Node,
+                                            & NodeName,
+                                            & PathCount,
+                                            & IsLast
+                                            );
+    if ( RCt == 0 ) {
+
+            /* If node is last - that is */
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+
+            return RCt;
+        }
+
+            /*  Here we aren't last and looking forward; */
+        NodeName = XFSPathPartGet ( Path, PathIndex + 1 );
+
+            /*))  Should not happen thou
+             ((*/
+        if ( NodeName == NULL ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+
+            RCt = XFSNodeContainerGet (
+                    ( ( const struct XFSContNode * ) self )
+                                                        -> container,
+                    NodeName,
+                    & NextNode
+                    );
+            if ( RCt == 0 ) {
+
+                RCt = XFSNodeFindNode (
+                                    NextNode,
+                                    Path,
+                                    PathIndex + 1,
+                                    Node
+                                    );
+            }
+        }
+    }
+
+    return RCt;
+}   /* _ContNodeFindNode_v1 () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))  So, Directory
+ (((*/
+
+static
+rc_t CC
+_ContNodeDir_dispose_v1 ( const struct XFSEditor * self )
+{
+    struct XFSDirEditor * Editor;
+
+    Editor = ( struct XFSDirEditor * ) self;
+/*
+pLogMsg ( klogDebug, "_ContNodeDir_dispose_ ( $(editor) )", "editor=0x%p", ( void * ) Editor );
+*/
+
+    if ( Editor == 0 ) {
+        return 0;
+    }
+
+    free ( Editor );
+
+    return 0;
+}   /* _ContNodeDir_dispose_v1 () */
+
+static
+rc_t CC
+_ContNodeDir_find_v1 (
+                        const struct XFSDirEditor * self,
+                        const char * Name,
+                        const struct XFSNode ** Node
+)
+{
+    struct XFSContNode * Cont = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( self == NULL || Name == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Cont = ( struct XFSContNode * ) ( self -> Papahen ) . Node;
+    if ( Cont == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+    return XFSNodeContainerGet ( Cont -> container, Name, Node );
+}   /* _ContNodeDir_find_v1 () */
+
+static
+rc_t CC
+_ContNodeDir_list_v1 (
+                        const struct XFSDirEditor * self,
+                        const struct KNamelist ** List
+)
+{
+    struct XFSContNode * Cont = NULL;
+
+    if ( List != NULL ) {
+        * List = NULL;
+    }
+
+    if ( self == NULL || List == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Cont = ( struct XFSContNode * ) ( self -> Papahen ) . Node;
+    if ( Cont == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    return XFSNodeContainerList ( Cont -> container, List );
+}   /* _ContNodeDir_list_v1 () */
+
+rc_t CC
+_ContNodeDir_v1 (
+                    const struct XFSNode * self,
+                    const struct XFSDirEditor ** Dir
+)
+{
+    rc_t RCt;
+    struct XFSDirEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    if ( Dir != NULL ) {
+        * Dir = NULL;
+    }
+
+    if ( self == NULL || Dir == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Editor = calloc ( 1, sizeof ( struct XFSDirEditor ) );
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                        & ( Editor -> Papahen ),
+                        self,
+                        _ContNodeDir_dispose_v1
+                        );
+    if ( RCt == 0 ) {
+        Editor -> list = _ContNodeDir_list_v1;
+        Editor -> find = _ContNodeDir_find_v1;
+
+        * Dir = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _ContNodeDir_v1 () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))  So, Attributes
+ (((*/
+
+static
+rc_t CC
+_ContNodeAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+    struct XFSAttrEditor * Editor;
+
+    Editor = ( struct XFSAttrEditor * ) self;
+/*
+pLogMsg ( klogDebug, "_ContNodeAttr_dispose_ ( $(editor) )", "editor=0x%p", ( void * ) Editor );
+*/
+
+    if ( Editor == 0 ) {
+        return 0;
+    }
+
+    free ( Editor );
+
+    return 0;
+}   /* _ContNodeAttr_dispose_v1 () */
+
+static
+rc_t CC
+_ContNodeAttr_permissions_v1 (
+                            const struct XFSAttrEditor * self,
+                            const char ** Permissions
+                            )
+{
+    const struct XFSNode * Node = NULL;
+
+    if ( Permissions != NULL ) {
+        * Permissions = NULL;
+    }
+
+    if ( self == NULL || Permissions == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Node = XFSEditorNode ( & ( self -> Papahen ) );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Permissions = ( ( struct XFSContNode * ) Node ) -> security;
+
+	if ( * Permissions == NULL ) {
+		* Permissions = XFSPermRODefContChar ();
+	}
+
+    return 0;
+}   /* _ContNodeAttr_permisiions_v1 () */
+
+static
+rc_t CC
+_ContNodeAttr_date_v1 (
+                            const struct XFSAttrEditor * self,
+                            KTime_t * Time
+)
+{
+    if ( Time != NULL ) {
+        * Time = 0;
+    }
+
+    if ( self == NULL || Time == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( XFSEditorNode ( & ( self -> Papahen ) ) == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    return 0;
+}   /* _ContNodeAttr_date_v1 () */
+
+static
+rc_t CC
+_ContNodeAttr_type_v1 (
+                            const struct XFSAttrEditor * self,
+                            XFSNType * Type
+)
+{
+    if ( Type != NULL ) {
+        * Type = kxfsNotFound;
+    }
+
+    if ( self == NULL || Type == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( XFSEditorNode ( & ( self -> Papahen ) ) == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Type = kxfsDir;
+
+    return 0;
+}   /* _ContNodeAttr_type_v1 () */
+
+rc_t CC
+_ContNodeAttr_v1 (
+                    const struct XFSNode * self,
+                    const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+
+    if ( Attr != NULL ) {
+        * Attr = NULL;
+    }
+
+    if ( self == NULL || Attr == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Editor = calloc ( 1, sizeof ( struct XFSAttrEditor ) );
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                        & ( Editor -> Papahen ),
+                        self,
+                        _ContNodeAttr_dispose_v1
+                        );
+    if ( RCt == 0 ) {
+        Editor -> permissions = _ContNodeAttr_permissions_v1;
+        Editor -> date = _ContNodeAttr_date_v1;
+        Editor -> type = _ContNodeAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return 0;
+}   /* _ContNodeAttr_v1 () */
+
+rc_t CC
+_ContNodeDescribe_v1 (
+                        const struct XFSNode * self,
+                        char * Buffer,
+                        size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+
+    RCt = 0;
+    NumWrit = 0;
+
+    if ( Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+    * Buffer = 0;
+
+    if ( self == NULL ) {
+        RCt = string_printf (
+                        Buffer,
+                        BufferSize,
+                        & NumWrit,
+                        "NODE (BASIC CONT)[NULL][NULL]"
+                        );
+    }
+    else {
+        RCt = string_printf (
+                        Buffer,
+                        BufferSize,
+                        & NumWrit,
+                        "NODE (BASIC CONT)[%s][0x%p]",
+                        self -> Name,
+                        self
+                        );
+    }
+
+    return RCt;
+}   /* _ContNodeDescribe_v1 () */
+
+/*)))
+ |||
+ +++    Simple Container lives here
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+LIB_EXPORT
+rc_t CC
+XFSContNodeInit (
+                struct XFSNode * self,
+                const char * Name,
+                const char * Perm,
+                uint32_t Flavor,
+                _tContNodeDisposer Disposer
+)
+{
+    rc_t RCt;
+    struct XFSContNode * Cont;
+
+    RCt = 0;
+    Cont = ( struct XFSContNode * ) self;
+
+    if ( Cont == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSNodeInitVT (
+                    & ( Cont -> node ),
+                    Name,
+                    ( const union XFSNode_vt * ) & _sContNodeVT_v1
+                    );
+    if ( RCt == 0 ) {
+        RCt = XFSNodeContainerMake ( ( const struct XFSNodeContainer ** ) & Cont -> container );
+        if ( RCt == 0 ) {
+
+            if ( Perm != NULL ) {
+                RCt = XFS_StrDup ( Perm, & ( Cont -> security ) );
+            }
+
+            if ( RCt == 0 ) {
+                Cont -> flavor = Flavor;
+                Cont -> disposer = Disposer;
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFSContNodeInit () */
+
+LIB_EXPORT
+rc_t CC
+XFSContNodeMake (
+                const char * Name,
+                const char * Perm,
+                struct XFSNode ** Node
+)
+{
+    return XFSContNodeMakeWithFlavor (
+                                    Name,
+                                    Perm,
+                                    _sFlavorOfContNode,
+                                    Node
+                                    );
+}   /* XFSContNodeMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSContNodeMakeWithFlavor (
+                const char * Name,
+                const char * Perm,
+                uint32_t Flavor,
+                struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSContNode * Cont;
+
+    RCt = 0;
+    Cont = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Node == NULL || Name == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Cont = calloc ( 1, sizeof ( struct XFSContNode ) );
+    if ( Cont == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSContNodeInit ( & ( Cont -> node ), Name, Perm, Flavor, NULL );
+    if ( RCt == 0 ) {
+        * Node = & ( Cont -> node );
+    }
+    else {
+        if ( Cont != NULL ) {
+            XFSNodeDispose ( & ( Cont -> node ) );
+        }
+
+        * Node = NULL;
+    }
+/*
+pLogMsg ( klogDebug, "_ContNodeMake ND[$(container)] NM[$(name)]", "container=0x%p,name=%s", ( void * ) Cont, Name );
+*/
+
+    return RCt;
+}   /* XFSContNodeMakeWithFlavor () */
+
+LIB_EXPORT
+rc_t CC
+XFSContNodeAddChild (
+                struct XFSNode * self,
+                const struct XFSNode * Child
+)
+{
+    struct XFSContNode * Cont = ( struct XFSContNode * ) self;
+
+    if ( Cont == NULL || Child == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    return XFSNodeContainerAdd ( Cont -> container, Child );
+}   /* XFSContNodeAddChild () */
+
+LIB_EXPORT
+rc_t CC
+XFSContNodeDelChild ( struct XFSNode * self, const char * ChildName )
+{
+    struct XFSContNode * Cont = ( struct XFSContNode * ) self;
+
+    if ( Cont == NULL || ChildName == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    return XFSNodeContainerDel ( Cont -> container, ChildName );
+}   /* XFSContNodeDelChild () */
+
+LIB_EXPORT
+rc_t CC
+XFSContNodeClear ( struct XFSNode * self )
+{
+    struct XFSContNode * Cont = ( struct XFSContNode * ) self;
+
+    if ( Cont == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    return XFSNodeContainerClear ( Cont -> container );
+}   /* XFSContNodeClear () */
diff --git a/libs/xfs/contnode.h b/libs/xfs/contnode.h
new file mode 100644
index 0000000..ccd5cdb
--- /dev/null
+++ b/libs/xfs/contnode.h
@@ -0,0 +1,98 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_contnode_
+#define _h_contnode_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   This file contains general container node
+  ))))
+ ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* ContNode - implemented in contnode.c                              */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSNodeContainer;
+struct XFSContNode;
+
+typedef rc_t ( CC * _tContNodeDisposer ) ( struct XFSContNode * self );
+
+struct XFSContNode {
+    struct XFSNode node;
+
+    _tContNodeDisposer disposer;
+
+    struct XFSNodeContainer * container;
+
+    const char * security;
+    uint32_t flavor;
+};
+
+XFS_EXTERN rc_t CC XFSContNodeInit (
+                            struct XFSNode * self,
+                            const char * Name,      /* Could be NULL */
+                            const char * Perm,
+                            uint32_t Flavor,
+                            _tContNodeDisposer disposer /* NULL is OK */
+                            );
+
+XFS_EXTERN rc_t CC XFSContNodeMake (
+                            const char * Name,
+                            const char * Perm,      /* Could be NULL */
+                            struct XFSNode ** Node
+                            );
+
+XFS_EXTERN rc_t CC XFSContNodeMakeWithFlavor (
+                            const char * Name,
+                            const char * Perm,      /* Could be NULL */
+                            uint32_t Flavor,
+                            struct XFSNode ** Node
+                            );
+
+XFS_EXTERN rc_t CC XFSContNodeAddChild (
+                            struct XFSNode * self,
+                            const struct XFSNode * Child
+                            );
+
+XFS_EXTERN rc_t CC XFSContNodeDelChild (
+                            struct XFSNode * self,
+                            const char * ChildName
+                            );
+
+XFS_EXTERN rc_t CC XFSContNodeClear ( struct XFSNode * self );
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _h_contnode_ */
diff --git a/libs/xfs/doc.c b/libs/xfs/doc.c
new file mode 100644
index 0000000..ba5258e
--- /dev/null
+++ b/libs/xfs/doc.c
@@ -0,0 +1,730 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/refcount.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+
+#include <kfs/file.h>
+#include <kfs/file-impl.h>
+
+#include <xfs/doc.h>
+
+#include <va_copy.h>
+
+#include <string.h>    /* memmove() */
+
+#include <sysalloc.h>
+
+static const char * _sDoc_classname = "XFSDoc";
+
+/*))
+ //     Here is a struct buffer
+((*/
+struct XFSDoc {
+    const union XFSDoc_vt * vt;
+
+    KRefcount refcount;
+};
+
+LIB_EXPORT
+rc_t CC
+XFSDocInit ( const struct XFSDoc * self, const union XFSDoc_vt * VT )
+{
+    struct XFSDoc * Doc = ( struct XFSDoc * ) self;
+
+    if ( Doc == NULL || VT == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    KRefcountInit ( 
+                    & ( Doc -> refcount ),
+                    1,
+                    _sDoc_classname,
+                    "XFSDocInit",
+                    "Doc"
+                    );
+
+    Doc -> vt = VT;
+
+    return 0;
+}   /* XFSDocInit () */
+
+LIB_EXPORT
+rc_t CC
+XFSDocDispose ( const struct XFSDoc * self )
+{
+    rc_t RCt;
+    struct XFSDoc * Doc = ( struct XFSDoc * ) self;
+
+    RCt = 0;
+
+    if ( Doc == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    KRefcountWhack ( & ( Doc -> refcount ), _sDoc_classname );
+
+    if ( Doc -> vt != NULL ) {
+        switch ( Doc -> vt -> v1.maj ) {
+            case 1 :
+                    if ( Doc -> vt -> v1.dispose != NULL ) {
+                        RCt = Doc -> vt -> v1.dispose ( Doc );
+                    }
+                    break;
+            default :
+                    RCt = XFS_RC ( rcBadVersion );
+                    break;
+        }
+    }
+
+    return RCt;
+}   /* XFSDocDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSDocAddRef ( const struct XFSDoc * self )
+{
+    rc_t RCt;
+    int32_t RetCode;
+    struct XFSDoc * Doc;
+
+    RCt = 0;
+    RetCode = 0;
+    Doc = ( struct XFSDoc * ) self;
+
+    if ( Doc != NULL ) {
+        RetCode = KRefcountAdd (
+                            & ( Doc -> refcount ),
+                            _sDoc_classname
+                            );
+        switch ( RetCode ) {
+            case krefOkay :
+                    RCt = 0;
+                    break;
+            case krefZero :
+            case krefLimit :
+            case krefNegative :
+                    RCt = RC ( rcFS, rcNoTarg, rcAttaching, rcRefcount, rcInvalid );
+                    break;
+            default :
+                    RCt = RC ( rcFS, rcNoTarg, rcAttaching, rcRefcount, rcUnknown );
+                    break;
+        }
+    }
+
+    return RCt;
+}   /* XFSDocAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSDocRelease ( const struct XFSDoc * self )
+{
+    rc_t RCt;
+    int32_t RetCode;
+    struct XFSDoc * Doc;
+
+    RCt = 0;
+    RetCode = 0;
+    Doc = ( struct XFSDoc * ) self;
+
+    if ( Doc != NULL ) {
+        RetCode = KRefcountDrop (
+                            & ( Doc -> refcount ),
+                            _sDoc_classname
+                            );
+        switch ( RetCode ) {
+            case krefOkay :
+            case krefZero :
+                    RCt = 0;
+                    break;
+            case krefWhack :
+                    XFSDocDispose ( Doc );
+                    break;
+            case krefNegative :
+                    RCt = RC ( rcFS, rcNoTarg, rcAttaching, rcRefcount, rcInvalid );
+                    break;
+            default :
+                    RCt = RC ( rcFS, rcNoTarg, rcAttaching, rcRefcount, rcUnknown );
+                    break;
+        }
+    }
+
+    return RCt;
+}   /* XFSDocRelease () */
+
+LIB_EXPORT
+rc_t CC
+XFSDocGet ( const struct XFSDoc * self, const char ** Ret )
+{
+    rc_t RCt;
+    const char * Var1;
+
+    RCt = 0;
+    Var1 = NULL;
+
+    if ( Ret != NULL ) {
+        * Ret = NULL;
+    }
+
+    if ( self == NULL || Ret == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> vt == NULL ) { 
+        return XFS_RC ( rcInvalid );
+    }
+
+    switch ( self -> vt -> v1.maj ) {
+        case 1 :
+            if ( self -> vt -> v1.get != NULL ) {
+                RCt = self -> vt -> v1.get ( self, & Var1 );
+                if ( RCt == 0 ) {
+                    if ( Var1 == NULL ) {
+                        RCt = XFS_RC ( rcInvalid );
+                    }
+                    else {
+                        * Ret = Var1;
+                    }
+                }
+            }
+            else {
+                RCt = XFS_RC ( rcUnsupported );
+            }
+            break;
+        default :
+            RCt = XFS_RC ( rcBadVersion );
+            break;
+    }
+
+    return RCt;
+}   /* XFSDocGet () */
+
+LIB_EXPORT
+rc_t CC
+XFSDocSize ( const struct XFSDoc * self, uint64_t * Ret )
+{
+    rc_t RCt;
+    uint64_t Var1;
+
+    RCt = 0;
+    Var1 = 0;
+
+    if ( Ret != NULL ) {
+        * Ret = 0;
+    }
+
+    if ( self == NULL || Ret == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> vt == NULL ) { 
+        return XFS_RC ( rcInvalid );
+    }
+
+    switch ( self -> vt -> v1.maj ) {
+        case 1 :
+            if ( self -> vt -> v1.size != NULL ) {
+                RCt = self -> vt -> v1.size ( self, & Var1 );
+                if ( RCt == 0 ) {
+                    * Ret = Var1;
+                }
+            }
+            else {
+                RCt = XFS_RC ( rcUnsupported );
+            }
+            break;
+        default :
+            RCt = XFS_RC ( rcBadVersion );
+            break;
+    }
+
+    return RCt;
+}   /* XFSDocSize () */
+
+/*))
+ //     Here is a file to implement
+((*/
+struct XFSDocFile {
+    struct KFile Papahen;
+    const struct XFSDoc * Doc;
+};
+
+/*\
+|*| First we should make appropriate virtual table
+\*/
+static
+rc_t CC
+XFSDocFile_destroy_v1 ( struct KFile * self )
+{
+    struct XFSDocFile * DocFile = ( struct XFSDocFile * ) self;
+
+    if ( DocFile != NULL ) {
+        if ( DocFile -> Doc != NULL ) {
+            XFSDocRelease ( DocFile -> Doc );
+        }
+        DocFile -> Doc = NULL;
+
+        free ( DocFile );
+    }
+
+    return 0;
+}   /* XFSDocFile_destroy_v1 () */
+
+static
+struct KSysFile * 
+XFSDocFile_get_sysfile_v1 ( const struct KFile * self, uint64_t * offset )
+{
+    if ( offset != NULL ) {
+        * offset = 0;
+    }
+
+    return NULL;
+}   /* XFSDocFile_get_sysfile_v1 () */
+
+static
+rc_t CC
+XFSDocFile_random_access_v1 ( const struct KFile * self )
+{
+    return 0;
+}   /* XFSDocFile_random_access_v1 () */
+
+static
+rc_t CC
+XFSDocFile_get_size_v1 ( const struct KFile * self, uint64_t * size )
+{
+    const struct XFSDocFile * DocFile = ( const struct XFSDocFile * ) self;
+
+    if ( size != NULL ) {
+        * size = 0;
+    }
+
+    if ( DocFile == NULL || size == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( DocFile -> Doc == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    return XFSDocSize ( DocFile -> Doc, size );
+}   /* XFSDocFile_get_size_v1 () */
+
+static
+rc_t CC
+XFSDocFile_set_size_v1 ( struct KFile * self, uint64_t size )
+{
+    return XFS_RC ( rcUnsupported );
+}   /* XFSDocFile_set_size_v1 () */
+
+static
+rc_t CC
+XFSDocFile_read_v1 (
+            const struct KFile * self,
+            uint64_t pos,
+            void * buffer,
+            size_t bsize,
+            size_t * num_read
+)
+{
+    rc_t RCt;
+    const struct XFSDocFile * DocFile;
+    uint64_t DocS;
+    const char * DocB;
+    size_t Siz2R;
+
+    RCt = 0;
+    DocFile = ( const struct XFSDocFile * ) self;
+    DocS = 0;
+    DocB = NULL;
+    Siz2R = 0;
+
+    if ( num_read != NULL ) {
+        * num_read = 0;
+    }
+
+    if ( DocFile == NULL || buffer == NULL || num_read == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( bsize == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( DocFile -> Doc == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSDocSize ( DocFile -> Doc, & DocS );
+    if ( RCt == 0 ) {
+        if ( DocS < pos ) {
+            return XFS_RC ( rcInvalid );
+        }
+
+        Siz2R = ( size_t ) ( DocS - pos );
+        if ( bsize < Siz2R ) {
+            Siz2R = bsize;
+        }
+
+        RCt = XFSDocGet ( DocFile -> Doc, & DocB );
+        if ( RCt == 0 ) {
+            memmove ( buffer, DocB + pos, Siz2R );
+            * num_read = Siz2R;
+        }
+    }
+
+    return RCt;
+}   /* XFSDocFile_read_v1 () */
+
+static
+rc_t CC
+XFSDocFile_write_v1 (
+            struct KFile * self,
+            uint64_t pos,
+            const void * buffer,
+            size_t bsize,
+            size_t * num_writ
+)
+{
+    if ( num_writ != NULL ) {
+        * num_writ = 0;
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSDocFile_write_v1 () */
+
+static
+uint32_t CC
+XFSDocFile_get_type_v1 ( const struct KFile * self )
+{
+    return kfdFile;
+}   /* XFSDocFile_get_type_v1 () */
+
+static struct KFile_vt_v1 _sXFSDocFile_vt_v1 = {
+                            1, 1,
+                            XFSDocFile_destroy_v1,
+                            XFSDocFile_get_sysfile_v1,
+                            XFSDocFile_random_access_v1,
+                            XFSDocFile_get_size_v1,
+                            XFSDocFile_set_size_v1,
+                            XFSDocFile_read_v1,
+                            XFSDocFile_write_v1,
+                            XFSDocFile_get_type_v1
+                            };
+
+
+/*\
+|*| Here we are ugly
+\*/
+LIB_EXPORT
+rc_t CC
+XFSDocFileMake (
+            const char * Name,
+            const struct XFSDoc * Doc,
+            struct KFile ** File
+)
+{
+    rc_t RCt;
+    struct XFSDocFile * DocFile;
+    const char * xName;
+
+    RCt = 0;
+    DocFile = NULL;
+    xName = Name == NULL ? "DocFile" : Name;
+
+    if ( File != NULL ) {
+        * File = NULL;
+    }
+
+    if ( Doc == NULL || File == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSDocAddRef ( Doc );
+    if ( RCt == 0 ) {
+        DocFile = calloc ( 1, sizeof ( struct XFSDocFile ) );
+        if ( DocFile == NULL ) {
+            return XFS_RC ( rcExhausted );
+        }
+
+        RCt = KFileInit ( 
+                        & ( DocFile -> Papahen ),
+                        ( const KFile_vt * ) & _sXFSDocFile_vt_v1,
+                        "XFSDocFile",
+                        xName,
+                        true,
+                        false
+                        );
+        if ( RCt == 0 ) {
+            RCt = XFSDocAddRef ( Doc ); 
+            if ( RCt == 0 ) {
+                DocFile -> Doc = Doc;
+                * File = & ( DocFile -> Papahen );
+            }
+        }
+
+        if ( RCt != 0 ) {
+            * File = NULL;
+
+            KFileRelease ( & ( DocFile -> Papahen ) );
+        }
+    }
+
+    return RCt;
+}   /* XFSDocFileMake () */
+
+/*))
+ //     Here is README Doc
+((*/
+struct XFSTextDoc {
+    struct XFSDoc Papahen;
+
+    char * buffer;
+    size_t size;
+    size_t capacity;
+};
+
+static
+rc_t CC
+XFSTextDoc_dispose_v1 ( struct XFSDoc * self )
+{
+    struct XFSTextDoc * Doc = ( struct XFSTextDoc * ) self;
+
+    if ( Doc == NULL ) {
+        return 0;
+    }
+
+    if ( Doc -> buffer != NULL ) {
+        free ( Doc -> buffer );
+    }
+
+    Doc -> buffer = NULL;
+    Doc -> size = 0;
+    Doc -> capacity = 0;
+
+    free ( Doc );
+
+    return 0;
+}   /* XFSTextDoc_dispose_v1 () */
+
+static
+rc_t CC
+XFSTextDoc_get_v1 ( const struct XFSDoc * self, const char ** B )
+{
+    const struct XFSTextDoc * Doc = ( const struct XFSTextDoc * ) self;
+    if ( B != NULL ) {
+        * B = NULL;
+    }
+
+    if ( Doc == NULL || B == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * B = Doc -> buffer;
+
+    return 0;
+}   /* XFSTextDoc_get_v1 () */
+
+static
+rc_t CC
+XFSTextDoc_size_v1 ( const struct XFSDoc * self, uint64_t * S )
+{
+    const struct XFSTextDoc * Doc = ( const struct XFSTextDoc * ) self;
+    if ( S != NULL ) {
+        * S = 0;
+    }
+
+    if ( Doc == NULL || S == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * S = Doc -> size;
+
+    return 0;
+}   /* XFSTextDoc_size_v1 () */
+
+static struct XFSDoc_vt_v1 _sTextDoc_vt_v1 = {
+                                            1, 1,
+                                            XFSTextDoc_dispose_v1,
+                                            XFSTextDoc_get_v1,
+                                            XFSTextDoc_size_v1
+                                            };
+
+LIB_EXPORT
+rc_t CC
+XFSTextDocMake ( struct XFSDoc ** TextDoc )
+{
+    rc_t RCt;
+    struct XFSTextDoc * Doc;
+
+    RCt = 0;
+    Doc = NULL;
+
+    if ( TextDoc == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * TextDoc = NULL;
+
+    Doc = calloc ( 1, sizeof ( struct XFSTextDoc ) );
+    if ( Doc == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSDocInit (
+                    & ( Doc -> Papahen ),
+                    ( const union XFSDoc_vt * ) & _sTextDoc_vt_v1
+                    );
+    if ( RCt == 0 ) {
+        * TextDoc = & ( Doc -> Papahen );
+    }
+    else {
+        XFSDocRelease ( & ( Doc -> Papahen ) );
+    }
+
+    return RCt;
+}   /* XFSTextDocMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSTextDocAppend ( struct XFSDoc * self, const char * Fmt, ... )
+{
+    rc_t RCt;
+    va_list args;
+
+    va_start ( args, Fmt );
+
+    RCt = XFSTextDocVAppend ( self, Fmt, args );
+
+    va_end ( args );
+
+    return RCt;
+}   /* XFSTextDocAppend () */
+
+static
+rc_t CC
+__TextDocRealloc ( struct XFSDoc * self, size_t Len )
+{
+    size_t NewCap;
+    struct XFSTextDoc * Doc;
+    char * NewBuf;
+
+    Doc = ( struct XFSTextDoc * ) self;
+    NewCap = 0;
+    NewBuf = NULL;
+
+    if ( Doc == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    NewCap = Doc -> size + Len;
+
+    if ( Doc -> capacity < NewCap ) {
+        NewCap = ( ( NewCap / 1024 ) + 1 ) * 1024;
+
+        NewBuf = calloc ( NewCap, sizeof ( char ) );
+        if ( NewBuf == NULL ) {
+            return XFS_RC ( rcExhausted );
+        }
+
+        if ( Doc -> buffer != NULL ) {
+            if ( Doc -> size != 0 ) {
+                memmove (
+                        NewBuf,
+                        Doc -> buffer,
+                        Doc -> size * sizeof ( char )
+                        );
+                free ( Doc -> buffer );
+                Doc -> buffer = NULL;
+            }
+        }
+
+        Doc -> buffer = NewBuf;
+        Doc -> capacity = NewCap;
+    }
+
+    return 0;
+}   /* __TextDocRealloc () */
+
+static
+rc_t CC
+__TextDocAppend ( struct XFSDoc * self, const char * Line, size_t Len )
+{
+    rc_t RCt;
+    struct XFSTextDoc * Doc;
+
+    RCt = 0;
+    Doc = ( struct XFSTextDoc * ) self;
+
+    if ( Doc == NULL || Line == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Len == 0 ) {
+        return 0;
+    }
+
+    RCt = __TextDocRealloc ( self, Len );
+    if ( RCt ==  0 ) {
+        memmove ( Doc -> buffer + Doc -> size, Line, Len );
+
+        Doc -> size += Len;
+    }
+
+    return RCt;
+}   /* __TextDocAppend () */
+
+LIB_EXPORT
+rc_t CC
+XFSTextDocVAppend ( struct XFSDoc * self, const char * Fmt, va_list args )
+{
+    rc_t RCt;
+    char TBF [ XFS_SIZE_1024 ];
+    size_t nwr;
+    va_list xArgs;
+
+    RCt = 0;
+    * TBF = 0;
+    nwr = 0;
+
+    if ( self == NULL || Fmt == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    va_copy ( xArgs, args );
+    RCt = string_vprintf ( TBF, sizeof ( TBF ), & nwr, Fmt, xArgs );
+    va_end ( xArgs );
+    if ( RCt == 0 ) {
+        if ( nwr == 0 ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+            RCt = __TextDocAppend ( self, TBF, nwr );
+        }
+    }
+
+    return RCt;
+}   /* XFSTextDocVAppend () */
diff --git a/libs/xfs/docnode.c b/libs/xfs/docnode.c
new file mode 100644
index 0000000..d9838b9
--- /dev/null
+++ b/libs/xfs/docnode.c
@@ -0,0 +1,745 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+
+#include <xfs/node.h>
+#include <xfs/editors.h>
+#include <xfs/perm.h>
+#include <xfs/doc.h>
+
+#include "schwarzschraube.h"
+#include "common.h"
+
+#include <sysalloc.h>
+
+/*)))
+ |||    That file contains DocFile based node as XFSDocNode
+(((*/
+
+/*)))
+ |||
+ +++    FileNode, and other simple containers
+ |||
+(((*/
+struct XFSDocNode {
+    struct XFSNode node;
+
+    const struct XFSDoc * doc;
+    const char * perm;
+    uint32_t flavor;
+};
+
+struct XFSDocFileEditor {
+    struct XFSFileEditor Papahen;
+
+    struct KFile * file;
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*                                                               *_*/
+/*_* DocNode is living here                                        *_*/
+/*_*                                                               *_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ |||
+ +++    DocNode virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _DocNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _DocNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _DocNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _DocNodeFile_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSFileEditor ** File
+                                );
+static rc_t CC _DocNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _DocNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sDocNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _DocNodeFlavor_v1,
+                                        _DocNodeDispose_v1,
+                                        _DocNodeFindNode_v1,
+                                        NULL,   /* NO DIR */
+                                        _DocNodeFile_v1,
+                                        _DocNodeAttr_v1,
+                                        _DocNodeDescribe_v1
+                                        };
+
+LIB_EXPORT
+rc_t CC
+XFSDocNodeMake (
+            struct XFSNode ** Node,
+            const struct XFSDoc * Doc,
+            const char * Name,
+            const char * Perm          /* Could be NULL */
+)
+{
+    return XFSDocNodeMakeWithFlavor (
+                                    Node,
+                                    Doc,
+                                    Name,
+                                    Perm,
+                                    _sFlavorLess
+                                    );
+}   /* XFSDocNodeMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSDocNodeMakeWithFlavor (
+            struct XFSNode ** Node,
+            const struct XFSDoc * Doc,
+            const char * Name,
+            const char * Perm,          /* Could be NULL */
+            uint32_t Flavor
+)
+{
+    rc_t RCt;
+    struct XFSDocNode * TheNode;
+
+    RCt = 0;
+    TheNode = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Node == NULL || Name == NULL || Doc == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    TheNode = calloc ( 1, sizeof ( struct XFSDocNode ) );
+    if ( TheNode == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = XFSNodeInitVT (
+                        & ( TheNode -> node),
+                        Name,
+                        ( const union XFSNode_vt * ) & _sDocNodeVT_v1
+                        );
+        if ( RCt == 0 ) {
+            if ( Perm != NULL ) {
+                RCt = XFS_StrDup ( Perm, & ( TheNode -> perm ) );
+            }
+
+            if ( RCt == 0 ) {
+                RCt = XFSDocAddRef ( Doc );
+                if ( RCt == 0 ) {
+                    TheNode -> doc = Doc;
+
+                    TheNode -> flavor = Flavor;
+
+                    * Node = & ( TheNode -> node );
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( & ( TheNode -> node ) );
+            TheNode = NULL;
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "XFSDocNodeMake ND[$(node)] NM[$(name)] Doc[$(doc)]", "node=%p,name=%s,doc=%s", ( void * ) TheNode, Name, Doc );
+*/
+
+    return RCt;
+}   /* XFSDocNodeMakeWithFlavor () */
+
+uint32_t CC
+_DocNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    const struct XFSDocNode * Node = ( const struct XFSDocNode * ) self;
+
+    if ( Node != NULL ) {
+        return Node -> flavor;
+    }
+
+    return _sFlavorLess;
+}   /* _DocNodeFlavor_v1 () */
+
+static
+rc_t CC
+XFSDocNodeDispose ( const struct XFSDocNode * self )
+{
+    struct XFSDocNode * Node = ( struct XFSDocNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "XFSDocNodeDispose ( $(node) ) [$(doc)]", "node=%p,doc=%p", ( void * ) Node, ( void * ) Node -> doc );
+*/
+
+    if ( Node == 0 ) {
+        return 0;
+    }
+
+    if ( Node -> perm != NULL ) {
+        free ( ( char * ) Node -> perm );
+        Node -> perm = NULL;
+    }
+
+    if ( Node -> doc != NULL ) {
+        XFSDocRelease ( Node -> doc );
+        Node -> doc = NULL;
+    }
+
+    free ( Node );
+
+    return 0;
+}   /* XFSDocNodeDispose () */
+
+rc_t CC
+_DocNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return XFSDocNodeDispose ( ( struct XFSDocNode * ) self );
+}   /* _DocNodeDispose_v1 () */
+
+/*)))
+ |||
+ +++  Node lookup ... never do it seriously
+ |||
+(((*/
+
+rc_t CC
+_DocNodeFindNode_v1 (
+            const struct XFSNode * self,
+            const struct XFSPath * Path,
+            uint32_t PathIndex,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    bool IsLast;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    IsLast = false;
+
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                            self,
+                                            Path,
+                                            PathIndex,
+                                            Node,
+                                            & NodeName,
+                                            & PathCount,
+                                            & IsLast
+                                            );
+    if ( RCt == 0 ) {
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+        }
+    }
+
+    return RCt;
+}   /* _DocNodeFindNode () */
+
+/*)))
+ |||
+ +++  Unified FileEditor
+ |||
+(((*/
+
+static
+rc_t CC
+_DocFile_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_DocNodeFile_dispose_v1 ( $(node) )", "node=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSDocFileEditor * ) self );
+    }
+
+    return 0;
+}   /* _DocFile_dispose_v1 () */
+
+static
+rc_t CC
+_DocFile_open_v1 (
+                    const struct XFSFileEditor * self,
+                    XFSNMode Mode
+)
+{
+    const struct XFSDocNode * Node;
+    struct KFile * File;
+    rc_t RCt;
+
+    Node = NULL;
+    File = NULL;
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Node = ( const struct XFSDocNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Mode != kxfsRead ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSDocFileMake (
+                        XFSNodeName ( & ( Node -> node ) ),
+                        Node -> doc,
+                        & File
+                        );
+    if ( RCt == 0 ) {
+        ( ( struct XFSDocFileEditor * ) self ) -> file = File;
+    }
+
+    return RCt;
+}   /* _DocFile_open_v1 () */
+
+static
+rc_t CC
+_DocFile_close_v1 ( const struct XFSFileEditor * self )
+{
+    struct XFSDocFileEditor * Editor;
+    rc_t RCt;
+
+    Editor = NULL;
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+
+    Editor = ( struct XFSDocFileEditor * ) self;
+
+    if ( Editor -> file != NULL ) {
+        RCt = KFileRelease ( Editor -> file );
+
+        Editor -> file = NULL;
+    }
+
+    return RCt;
+}   /* _DocFile_close_v1 () */
+
+static
+rc_t CC
+_DocFile_read_v1 (
+                    const struct XFSFileEditor * self,
+                    uint64_t Offset,
+                    void * Buffer,
+                    size_t SizeToRead,
+                    size_t * NumReaded
+)
+{
+    struct XFSDocFileEditor * Editor;
+    rc_t RCt;
+
+    Editor = NULL;
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Editor = ( struct XFSDocFileEditor * ) self;
+
+    if ( Editor -> file == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KFileRead (
+                    Editor -> file,
+                    Offset,
+                    Buffer,
+                    SizeToRead,
+                    NumReaded
+                    );
+
+/* here may be debutt */
+
+    return RCt;
+}   /* _DocFile_read_v1 () */
+
+static
+rc_t CC
+_DocFile_size_v1 (
+                        const struct XFSFileEditor * self,
+                        uint64_t * Size
+)
+{
+    const struct XFSDocNode * Node;
+    uint64_t TempSize;
+    rc_t RCt;
+
+    Node = NULL;
+    TempSize = 0;
+    RCt = 0;
+
+    if ( Size == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Size = 0;
+
+    Node = ( const struct XFSDocNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> doc == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSDocSize ( Node -> doc, & TempSize );
+    if ( RCt == 0 ) {
+        * Size = TempSize;
+    }
+
+    return RCt;
+}   /* _DocFile_size_v1 () */
+
+rc_t CC
+_DocNodeFile_v1 (
+            const struct XFSNode * self,
+            const struct XFSFileEditor ** File
+)
+{
+    rc_t RCt;
+    struct XFSDocFileEditor * FileEditor;
+    struct XFSFileEditor * Editor;
+
+    RCt = 0;
+    FileEditor = NULL;
+    Editor = NULL;
+
+    if ( self == NULL || File == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * File = NULL;
+
+    FileEditor = calloc ( 1, sizeof ( struct XFSDocFileEditor ) );
+    if ( FileEditor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    Editor = & ( FileEditor -> Papahen );
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _DocFile_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> open = _DocFile_open_v1;
+        Editor -> close = _DocFile_close_v1;
+        Editor -> read = _DocFile_read_v1;
+        Editor -> write = NULL;
+        Editor -> size = _DocFile_size_v1;
+        Editor -> set_size = NULL;
+
+        * File = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _DocNodeFile_v1 () */
+
+/*)))
+ |||
+ +++  Unified Attr
+ |||
+(((*/
+
+static
+rc_t CC
+_DocAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_DocAttr_dispose_v1 ( node )", "node=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSAttrEditor * ) self );
+    }
+
+    return 0;
+}   /* _DocAttr_dispose_v1 () */
+
+/*))    Something unusual. Will check-initialize NativeDir and Node
+ //     NativeDir and Node could be NULL
+((*/
+static
+rc_t CC
+_DocAttr_init_check_v1 (
+                    const struct XFSAttrEditor * self,
+                    const struct XFSDocNode ** Node
+
+)
+{
+    rc_t RCt;
+    const struct XFSDocNode * RetNode;
+
+    RCt = 0;
+    RetNode = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RetNode = ( const struct XFSDocNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    if ( RetNode == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( RetNode -> doc == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( RCt == 0 ) {
+        if ( Node != NULL ) {
+            * Node = RetNode;
+        }
+    }
+
+    return RCt;
+}   /* _DocAttr_init_check_v1 () */
+
+static
+rc_t CC
+_DocAttr_permissions_v1 (
+                        const struct XFSAttrEditor * self,
+                        const char ** Permissions
+)
+{
+    const struct XFSDocNode * Node;
+    rc_t RCt;
+
+    Node = NULL;
+    RCt = 0;
+
+    if ( Permissions == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Permissions = NULL;
+
+    RCt = _DocAttr_init_check_v1 ( self, & Node );
+    if ( RCt == 0 ) {
+        if ( Node -> perm != NULL ) {
+            * Permissions = Node -> perm;
+        }
+        else {
+            * Permissions = XFSPermRODefNodeChar ();
+        }
+    }
+
+    return RCt;
+}   /* _DocAttr_permissions_v1 () */
+
+static
+rc_t CC
+_DocAttr_date_v1 (
+                        const struct XFSAttrEditor * self,
+                        KTime_t * Time
+)
+{
+    const struct XFSDocNode * Node;
+    rc_t RCt;
+
+    Node = NULL;
+    RCt = 0;
+
+    if ( Time == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Time = 0;
+
+    RCt = _DocAttr_init_check_v1 ( self, & Node );
+    if ( RCt == 0 ) {
+            /* TODO IMPORTANT - make time !!! */
+        * Time = 0;
+    }
+
+    return RCt;
+}   /* _DocAttr_date_v1 () */
+
+static
+rc_t CC
+_DocAttr_type_v1 (
+                        const struct XFSAttrEditor * self,
+                        XFSNType * Type
+)
+{
+    if ( Type == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Type = kxfsFile;
+
+    return 0;
+}   /* _DocAttr_type_v1 () */
+
+static
+rc_t CC
+_DocNodeAttr_v1 (
+            const struct XFSNode * self,
+            const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    if ( Attr != NULL ) {
+        * Attr = NULL;
+    }
+
+    if ( self == NULL || Attr == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Editor = calloc ( 1, sizeof ( struct XFSAttrEditor ) );
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _DocAttr_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> permissions = _DocAttr_permissions_v1;
+        Editor -> set_permissions = NULL;
+        Editor -> date = _DocAttr_date_v1;
+        Editor -> set_date = NULL;
+        Editor -> type = _DocAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _DocNodeAttr_v1 () */
+
+/*)))
+ |||
+ +++  Unified Discribe
+ |||
+(((*/
+
+rc_t CC
+_DocNodeDescribe_v1 (
+            const struct XFSNode * self,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+    const char * Abbr;
+
+    RCt = 0;
+    NumWrit = 0;
+    Abbr = "DOC FILE";
+
+    if ( Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self == NULL ) {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "DOCNODE (%s)[NULL][NULL]",
+                    Abbr
+                    );
+    }
+    else {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "DOCNODE (%s)[%s][0x%p]",
+                    Abbr,
+                    self -> Name,
+                    self
+                    );
+    }
+
+    return RCt;
+}   /* _DocNodeDescribe_v1 () */
+
diff --git a/libs/xfs/editors.c b/libs/xfs/editors.c
new file mode 100644
index 0000000..50db6a9
--- /dev/null
+++ b/libs/xfs/editors.c
@@ -0,0 +1,491 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/namelist.h>
+
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/editors.h>
+
+#include "mehr.h"
+#include "zehr.h"
+
+#include <sysalloc.h>
+
+#include <string.h> /* memset () */
+
+/*)))
+ |||
+ +++    All about Editors, and other simple Editors
+ |||
+(((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*)))   Editor ...
+ (((*/
+LIB_EXPORT
+rc_t CC
+XFSEditorInit (
+            const struct XFSEditor * self,
+            const struct XFSNode * Node,
+            rc_t ( CC * dispose ) ( const struct XFSEditor * self )
+)
+{
+    rc_t RCt;
+    struct XFSEditor * Editor;
+
+    RCt = 0;
+    Editor = ( struct XFSEditor * ) self;
+
+    if ( Editor == NULL || Node == NULL || dispose == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSNodeAddRef ( Node );
+    if ( RCt == 0 ) {
+
+        memset ( Editor, 0, sizeof ( struct XFSEditor ) );
+
+        Editor -> Node = Node;
+        Editor -> dispose = dispose;
+        Editor -> Data = NULL;
+    }
+
+    return RCt;
+}   /* XFSEditorInit () */
+
+LIB_EXPORT
+rc_t CC
+XFSEditorDispose ( const struct XFSEditor * self )
+{
+    struct XFSEditor * Editor;
+
+    Editor = ( struct XFSEditor * ) self;
+
+    if ( Editor == NULL ) {
+        return 0;
+    }
+
+    if ( Editor -> dispose == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Editor -> Node != NULL ) {
+        XFSNodeRelease ( Editor -> Node );
+
+        Editor -> Node = NULL;
+    }
+
+    return Editor -> dispose ( self );
+}   /* XFSEditorDispose () */
+
+LIB_EXPORT
+const struct XFSNode * CC
+XFSEditorNode ( const struct XFSEditor * self )
+{
+    return self == NULL ? NULL : ( self -> Node );
+}   /* XFSEditorNode () */
+
+LIB_EXPORT
+void * CC
+XFSEditorData ( const struct XFSEditor * self )
+{
+    return self == NULL ? self -> Data : NULL;
+}   /* XFSEditorData () */
+
+LIB_EXPORT
+rc_t CC
+XFSEditorSetData ( const struct XFSEditor * self, void * Data )
+{
+    XFS_CAN ( self )
+
+    ( ( struct XFSEditor * ) self ) -> Data = Data;
+
+    return 0;
+}   /* XFSEditorSetData () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*)))   EditorF ...
+ (((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*)))   DirEditor ...
+ (((*/
+
+LIB_EXPORT
+rc_t CC
+XFSDirEditorList (
+                const struct XFSDirEditor * self,
+                const struct KNamelist ** List
+)
+{
+    if ( self == NULL || List == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * List = NULL;
+
+    if ( self -> list != NULL ) {
+        return self -> list ( self, List );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSDirEditorList () */
+
+LIB_EXPORT
+rc_t CC
+XFSDirEditorFind (
+                const struct XFSDirEditor * self,
+                const char * Name,
+                const struct XFSNode ** Node
+)
+{
+    if ( self == NULL || Name == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Node = NULL;
+
+    if ( self -> find != NULL ) {
+        return self -> find ( self, Name, Node );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSDirEditorFind () */
+
+LIB_EXPORT
+rc_t CC
+XFSDirEditorCreate (
+                const struct XFSDirEditor * self,
+                const char * Name,
+                XFSNMode Mode,
+                const struct XFSHandle ** Handle
+)
+{
+    if ( self == NULL || Name == NULL || Handle == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Handle = NULL;
+
+    if ( self -> create_file != NULL ) {
+        return self -> create_file ( self, Name, Mode, Handle );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSDirEditorCreate () */
+
+LIB_EXPORT
+rc_t CC
+XFSDirEditorCreateDir (
+                const struct XFSDirEditor * self,
+                const char * Name
+)
+{
+    if ( self == NULL || Name == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> create_dir != NULL ) {
+        return self -> create_dir ( self, Name );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSDirEditorCreateDir () */
+
+LIB_EXPORT
+rc_t CC
+XFSDirEditorDelete (
+                const struct XFSDirEditor * self,
+                const char * Name
+)
+{
+    if ( self == NULL || Name == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> delete != NULL ) {
+        return self -> delete ( self, Name );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSDirEditorDelete () */
+
+LIB_EXPORT
+rc_t CC
+XFSDirEditorMove (
+                const struct XFSDirEditor * self,
+                const char * OldName,
+                const struct XFSNode * NewDir,
+                const char * NewName
+)
+{
+    if ( self == NULL || OldName == NULL
+        || NewDir == NULL || NewName == NULL
+    ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> move != NULL ) {
+        return self -> move ( self, OldName, NewDir, NewName );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSDirEditorMove () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*)))   FileEditor ...
+ (((*/
+
+LIB_EXPORT
+rc_t CC
+XFSFileEditorOpen ( const struct XFSFileEditor * self, XFSNMode Mode )
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> open != NULL ) {
+        return self -> open ( self, Mode );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSFileModeEditorOpen () */
+
+LIB_EXPORT
+rc_t CC
+XFSFileEditorClose ( const struct XFSFileEditor * self )
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> close != NULL ) {
+        return self -> close ( self );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSFileEditorClose () */
+
+LIB_EXPORT
+rc_t CC
+XFSFileEditorRead (
+                const struct XFSFileEditor * self,
+                uint64_t Offset,
+                void * Buffer,
+                size_t SizeToRead,
+                size_t * NumReaded
+)
+{
+    if ( self == NULL || Buffer == NULL || NumReaded == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * NumReaded = 0;
+
+    if ( self -> read != NULL ) {
+        return self -> read (
+                            self,
+                            Offset,
+                            Buffer,
+                            SizeToRead,
+                            NumReaded
+                            );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSFileEditorRead () */
+
+LIB_EXPORT
+rc_t CC
+XFSFileEditorWrite (
+                const struct XFSFileEditor * self,
+                uint64_t Offset,
+                const void * Buffer,
+                size_t SizeToWrite,
+                size_t * NumWritten
+)
+{
+    if ( self == NULL || Buffer == NULL || NumWritten == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * NumWritten = 0;
+
+    if ( self -> write != NULL ) {
+        return self -> write (
+                            self,
+                            Offset,
+                            Buffer,
+                            SizeToWrite,
+                            NumWritten
+                            );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSFileEditorWrite () */
+
+LIB_EXPORT
+rc_t CC
+XFSFileEditorSize ( const struct XFSFileEditor * self, uint64_t * Size )
+{
+    if ( self == NULL || Size == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Size = 0;
+
+    if ( self -> size != NULL ) {
+        return self -> size ( self, Size );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSFileEditorSize () */
+
+LIB_EXPORT
+rc_t CC
+XFSFileEditorSetSize ( const struct XFSFileEditor * self, uint64_t Size )
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> set_size != NULL ) {
+        return self -> set_size ( self, Size );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSFileEditorSetSize () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*)))   AttrEditor ...
+ (((*/
+
+LIB_EXPORT
+rc_t CC
+XFSAttrEditorPermissions (
+                const struct XFSAttrEditor * self,
+                const char ** Permissions
+)
+{
+    if ( self == NULL || Permissions == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Permissions = NULL;
+
+    if ( self -> permissions != NULL ) {
+        return self -> permissions ( self, Permissions );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSAttrEditorPermissions () */
+
+LIB_EXPORT
+rc_t CC
+XFSAttrEditorSetPermissions (
+                const struct XFSAttrEditor * self,
+                const char * Permissions
+)
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> set_permissions != NULL ) {
+        return self -> set_permissions ( self, Permissions );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSAttrEditorSetPermissions () */
+
+LIB_EXPORT
+rc_t CC
+XFSAttrEditorDate ( const struct XFSAttrEditor * self, KTime_t * Time )
+{
+    if ( self == NULL || Time == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Time = 0;
+
+    if ( self -> date != NULL ) {
+        return self -> date ( self, Time );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSAttrEditorDate () */
+
+LIB_EXPORT
+rc_t CC
+XFSAttrEditorSetDate ( const struct XFSAttrEditor * self, KTime_t Time )
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> set_date != NULL ) {
+        return self -> set_date ( self, Time );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSAttrEditorSetDate () */
+
+LIB_EXPORT
+rc_t CC
+XFSAttrEditorType ( const struct XFSAttrEditor * self, XFSNType * Type )
+{
+    if ( self == NULL || Type == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Type = kxfsNotFound;
+
+    if ( self -> type != NULL ) {
+        return self -> type ( self, Type );
+    }
+
+    return XFS_RC ( rcUnsupported );
+}   /* XFSAttrEditorType () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
diff --git a/libs/xfs/encro.c b/libs/xfs/encro.c
new file mode 100644
index 0000000..d1563a0
--- /dev/null
+++ b/libs/xfs/encro.c
@@ -0,0 +1,875 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/handle.h>
+#include <xfs/perm.h>
+
+#include "xencro.h"
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "teleport.h"
+#include "common.h"
+
+#include <sysalloc.h>
+
+#include <string.h>     /* memset */
+
+/*)))
+ |||    That file contains XFSEncEntry based READ ONLY node
+(((*/
+
+/*)))
+ |||
+ +++    EncNode, and others
+ |||
+(((*/
+struct XFSEncNode {
+    struct XFSNode node;
+
+    const struct XFSEncEntry * entry;
+};
+
+struct XFSEncFileEditor {
+    struct XFSFileEditor Papahen;
+
+    const struct XFSEncEntry * entry;
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*                                                               *_*/
+/*_* EncNode is living here                                       *_*/
+/*_*                                                               *_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ |||
+ +++    EncNode virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _EncNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _EncNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _EncNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _EncNodeFile_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSFileEditor ** File
+                                );
+static rc_t CC _EncNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _EncNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sEncNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _EncNodeFlavor_v1,
+                                        _EncNodeDispose_v1,
+                                        _EncNodeFindNode_v1,
+                                        NULL,   /* No DIR */
+                                        _EncNodeFile_v1,
+                                        _EncNodeAttr_v1,
+                                        _EncNodeDescribe_v1
+                                        };
+
+
+static
+rc_t CC
+XFSEncNodeMake (
+    struct XFSNode ** Node,
+    const char * Name,
+    const struct XFSEncEntry * Entry
+)
+{
+    rc_t RCt;
+    struct XFSEncNode * xNode;
+
+    RCt = 0;
+    xNode = NULL;
+
+    XFS_CSAN ( Node )
+
+    XFS_CAN ( Node )
+    XFS_CAN ( Name )
+    XFS_CAN ( Entry )
+
+    xNode = calloc ( 1, sizeof ( struct XFSEncNode ) );
+    if ( xNode == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSNodeInitVT (
+                    & ( xNode -> node ),
+                    Name,
+                    ( const union XFSNode_vt * ) & _sEncNodeVT_v1
+                    );
+
+    if ( RCt == 0 ) {
+        RCt = XFSEncEntryAddRef ( Entry );
+        if ( RCt == 0 ) {
+            xNode -> entry = Entry;
+
+            * Node = & ( xNode -> node );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( xNode != NULL ) {
+            RCt = XFSNodeDispose ( & ( xNode -> node ) );
+        }
+    }
+
+    return RCt;
+}   /* XFSEncNodeMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSEncryptedFileNodeMake (
+                    struct XFSNode ** Node,
+                    const char * Name,
+                    const char * Path,
+                    const char * Passwd,
+                    const char * EncType
+)
+{
+    rc_t RCt;
+    const struct XFSEncEntry * Entry;
+    struct XFSNode * TheNode;
+
+    RCt = 0;
+    Entry = NULL;
+    TheNode = NULL;
+
+    XFS_CSAN ( Node )
+
+    XFS_CAN ( Name )
+    XFS_CAN ( Path )
+    XFS_CAN ( Passwd )
+    XFS_CAN ( Node )
+
+    RCt = XFSEncEntryFindOrCreate ( Path, Passwd, EncType, & Entry );
+    if ( RCt == 0 ) {
+        RCt = XFSEncNodeMake ( & TheNode, Name, Entry );
+        if ( RCt == 0 ) {
+            * Node = TheNode;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( TheNode );
+        }
+        else {
+            if ( Entry != NULL ) {
+                XFSEncEntryDispose ( Entry );
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFSEncryptedFileNodeMake () */
+
+uint32_t CC
+_EncNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    return _sFlavorOfEncode;
+}   /* _EncNodeFlavor_v1 () */
+
+static
+rc_t CC
+XFSEncNodeDispose ( const struct XFSEncNode * self )
+{
+    struct XFSEncNode * Node = ( struct XFSEncNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "XFSEncNodeDispose ( $(node) ) EN[$(entry)]", "node=%p,entry=%d", ( void * ) Node, ( Node == NULL ? 0 : Node -> entry ) );
+*/
+
+    if ( Node == 0 ) {
+        return 0;
+    }
+
+    if ( Node -> entry != NULL ) {
+        XFSEncEntryRelease ( Node -> entry );
+
+        Node -> entry = NULL;
+    }
+
+    free ( Node );
+
+    return 0;
+}   /* XFSEncNodeDispose () */
+
+rc_t CC
+_EncNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return XFSEncNodeDispose ( ( const struct XFSEncNode * ) self );
+}   /* _EncNodeDispose_v1 () */
+
+/*)))
+ |||
+ +++  There are no find methods for encrypted files, cuz FILE
+ |||
+(((*/
+rc_t CC
+_EncNodeFindNode_v1 (
+                    const struct XFSNode * self,
+                    const struct XFSPath * Path,
+                    uint32_t PathIndex,
+                    const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    bool IsLast;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    IsLast = false;
+
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                        self,
+                                        Path,
+                                        PathIndex,
+                                        Node,
+                                        & NodeName,
+                                        & PathCount,
+                                        & IsLast
+                                        );
+    if ( RCt == 0 ) {
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+        }
+    }
+
+    return RCt;
+}   /* _EncNodeFindNode () */
+
+/*)))
+ |||
+ +++  No Dir editor 
+ |||
+(((*/
+
+/*)))
+ |||
+ +++  Unified FileEditor
+ |||
+(((*/
+
+static
+rc_t CC
+_EncFile_dispose_v1 ( const struct XFSEditor * self )
+{
+    struct XFSEncFileEditor * Editor = ( struct XFSEncFileEditor * ) self;
+/*
+    pLogMsg ( klogDebug, "_EncNodeFile_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( Editor != NULL ) {
+        if ( Editor -> entry != NULL ) {
+            XFSEncEntryRelease ( Editor -> entry );
+
+            Editor -> entry = NULL;
+        }
+
+        free ( Editor );
+    }
+
+    return 0;
+}   /* _EncFile_dispose_v1 () */
+
+static
+rc_t CC
+_EncFile_open_v1 (
+                    const struct XFSFileEditor * self,
+                    XFSNMode Mode
+)
+{
+    rc_t RCt;
+    const struct XFSEncNode * Node;
+    struct XFSEncFileEditor * Editor;
+
+    RCt = 0;
+    Node = NULL;
+    Editor = ( struct XFSEncFileEditor * ) self;
+
+    if ( Mode != kxfsRead ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    XFS_CAN ( self )
+
+    Node = ( const struct XFSEncNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CA ( Node, NULL )
+    XFS_CA ( Node -> entry, NULL )
+
+    Editor = ( struct XFSEncFileEditor * ) self;
+    if ( Editor -> entry == NULL ) {
+        if ( ! XFSEncEntryIsOpen ( Node -> entry ) ) {
+            RCt = XFSEncEntryOpen ( Node -> entry );
+        }
+        if ( RCt == 0 ) {
+            Editor -> entry = Node -> entry;
+        }
+    }
+
+    return RCt;
+}   /* _EncFile_open_v1 () */
+
+static
+rc_t CC
+_EncFile_close_v1 ( const struct XFSFileEditor * self )
+{
+    rc_t RCt;
+    struct XFSEncFileEditor * Editor;
+
+    RCt = 0;
+    Editor = ( struct XFSEncFileEditor * ) self;
+
+    XFS_CAN ( Editor )
+
+    if ( Editor -> entry != NULL ) {
+        RCt = XFSEncEntryClose ( Editor -> entry );
+        if ( RCt == 0 ) {
+            RCt = XFSEncEntryRelease ( Editor -> entry );
+
+            Editor -> entry = NULL;
+        }
+    }
+
+    return RCt;
+}   /* _EncFile_close_v1 () */
+
+static
+rc_t CC
+_EncFile_read_v1 (
+                    const struct XFSFileEditor * self,
+                    uint64_t Offset,
+                    void * Buffer,
+                    size_t SizeToRead,
+                    size_t * NumReaded
+)
+{
+    rc_t RCt;
+    struct XFSEncFileEditor * Editor;
+
+    RCt = 0;
+    Editor = ( struct XFSEncFileEditor * ) self;
+
+    XFS_CAN ( Editor )
+    XFS_CA ( Editor -> entry, NULL )
+
+
+    RCt = XFSEncEntryRead (
+                        Editor -> entry,
+                        Offset,
+                        Buffer,
+                        SizeToRead,
+                        NumReaded
+                        );
+
+    return RCt;
+}   /* _EncFile_read_v1 () */
+
+static
+rc_t CC
+_EncFile_size_v1 (
+                        const struct XFSFileEditor * self,
+                        uint64_t * Size
+)
+{
+    rc_t RCt;
+    struct XFSEncNode * Node;
+
+    RCt = 0;
+    Node = NULL;
+
+    XFS_CSA ( Size, 0 )
+    XFS_CAN ( Size )
+    XFS_CAN ( self )
+
+    Node = ( struct XFSEncNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    XFS_CAN ( Node )
+    XFS_CAN ( Node -> entry )
+
+    RCt = XFSEncEntrySize ( Node -> entry, Size );
+    if ( RCt != 0 ) {
+        * Size = 0;
+    }
+
+    return RCt;
+}   /* _EncFile_size_v1 () */
+
+rc_t CC
+_EncNodeFile_v1 (
+            const struct XFSNode * self,
+            const struct XFSFileEditor ** File
+)
+{
+    rc_t RCt;
+    struct XFSEncFileEditor * FileEditor;
+    struct XFSFileEditor * Editor;
+
+    RCt = 0;
+    FileEditor = NULL;
+    Editor = NULL;
+
+    XFS_CSAN ( File )
+
+    XFS_CAN ( self )
+    XFS_CAN ( File )
+
+    FileEditor = calloc ( 1, sizeof ( struct XFSEncFileEditor ) );
+    if ( FileEditor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    memset ( FileEditor, 0, sizeof ( struct XFSEncFileEditor ) );
+
+    Editor = & ( FileEditor -> Papahen );
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _EncFile_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> open = _EncFile_open_v1;
+        Editor -> close = _EncFile_close_v1;
+        Editor -> read = _EncFile_read_v1;
+        Editor -> size = _EncFile_size_v1;
+
+        * File = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _EncNodeFile_v1 () */
+
+/*)))
+ |||
+ +++  Unified Attr
+ |||
+(((*/
+
+static
+rc_t CC
+_EncAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_EncAttr_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSAttrEditor * ) self );
+    }
+
+    return 0;
+}   /* _EncAttr_dispose_v1 () */
+
+static
+rc_t CC
+_EncAttr_init_check_v1 (
+                const struct XFSAttrEditor * self,
+                const struct XFSEncEntry ** Entry
+)
+{
+    struct XFSEncNode * Node = NULL;
+
+    XFS_CSAN ( Entry )
+
+    XFS_CAN ( self )
+    XFS_CAN ( Entry )
+
+
+    Node = ( struct XFSEncNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    XFS_CA ( Node, NULL )
+    XFS_CA ( Node -> entry, NULL )
+
+    * Entry = Node -> entry;
+
+    return 0;
+}   /* _EncAttr_init_check_v1 () */
+
+static
+rc_t CC
+_EncAttr_permissions_v1 (
+                        const struct XFSAttrEditor * self,
+                        const char ** Permissions
+)
+{
+    rc_t RCt;
+    const struct XFSEncEntry * Entry;
+
+    RCt = 0;
+    Entry = NULL;
+
+    XFS_CSAN ( Permissions )
+    XFS_CAN ( Permissions )
+
+    RCt = _EncAttr_init_check_v1 ( self, & Entry );
+    if ( RCt == 0 ) {
+        * Permissions = XFSPermRODefNodeChar ();
+    }
+
+    return RCt;
+}   /* _EncAttr_permissions_v1 () */
+
+
+static
+rc_t CC
+_EncAttr_date_v1 (
+                        const struct XFSAttrEditor * self,
+                        KTime_t * Time
+)
+{
+    rc_t RCt;
+    const struct XFSEncEntry * Entry;
+
+    RCt = 0;
+    Entry = NULL;
+
+    XFS_CSA ( Time, 0 )
+    XFS_CAN ( Time )
+
+    RCt = _EncAttr_init_check_v1 ( self, & Entry );
+    if ( RCt == 0 ) {
+        RCt = XFSEncEntryTime ( Entry, Time );
+        if ( RCt != 0 ) {
+            * Time = 0;
+        }
+    }
+
+    return RCt;
+}   /* _EncAttr_date_v1 () */
+
+static
+rc_t CC
+_EncAttr_type_v1 (
+                        const struct XFSAttrEditor * self,
+                        XFSNType * Type
+)
+{
+    rc_t RCt;
+    const struct XFSEncEntry * Entry;
+
+    RCt = 0;
+    Entry = NULL;
+
+    XFS_CSA ( Type, kxfsNotFound )
+    XFS_CAN ( Type )
+
+    RCt = _EncAttr_init_check_v1 ( self, & Entry );
+    if ( RCt == 0 ) {
+        * Type = kxfsFile ;
+    }
+
+    return RCt;
+}   /* _EncAttr_type_v1 () */
+
+static
+rc_t CC
+_EncNodeAttr_v1 (
+            const struct XFSNode * self,
+            const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    XFS_CSAN ( Attr )
+
+    XFS_CAN ( self )
+    XFS_CAN ( Attr )
+
+    Editor = calloc ( 1, sizeof ( struct XFSAttrEditor ) );
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _EncAttr_dispose_v1
+                    );
+    if ( RCt == 0 ) {
+        Editor -> permissions = _EncAttr_permissions_v1;
+        Editor -> date = _EncAttr_date_v1;
+        Editor -> type = _EncAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _EncNodeAttr_v1 () */
+
+/*)))
+ |||
+ +++  Unified Discribe
+ |||
+(((*/
+
+rc_t CC
+_EncNodeDescribe_v1 (
+            const struct XFSNode * self,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+    const char * Abbr;
+
+    RCt = 0;
+    NumWrit = 0;
+    Abbr = NULL;
+
+    XFS_CAN ( Buffer )
+    XFS_CA ( BufferSize, 0 )
+
+    Abbr = "ENC NODE";
+
+    if ( self == NULL ) {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[NULL][NULL]",
+                    Abbr
+                    );
+    }
+    else {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[%s][0x%p]",
+                    Abbr,
+                    self -> Name,
+                    self
+                    );
+    }
+
+    return RCt;
+}   /* _EncNodeDescribe_v1 () */
+
+/*)))
+ |||
+ +++    FileNode lives here
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+/*)))
+ |||
+ +++    Non-Teleport methods to create nodes
+ |||
+(((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* ALL BELOW TODO!!!                                               */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*)))
+ |||
+ +++    EncNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_EncryptedFileNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    const char * NodeName;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Model == NULL || Template == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    RCt = XFSEncryptedFileNodeMake (
+                & TheNode,
+                NodeName,
+                XFSModelNodeProperty ( Template, XFS_MODEL_SOURCE ),
+                XFSModelNodeProperty ( Template, XFS_MODEL_PASSWD ),
+                XFSModelNodeProperty ( Template, XFS_MODEL_ENCTYPE )
+                );
+    if ( RCt == 0 ) {
+        * Node = ( struct XFSNode * ) TheNode;
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSEncNodeDispose ( ( const struct XFSEncNode * ) TheNode );
+        }
+    }
+
+    return RCt;
+}   /* _EncryptedFileNodeConstructor () */
+
+/*)))
+ |||
+ +++    EncNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_EncryptedFileConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = _EncryptedFileNodeConstructor (
+                                        Model,
+                                        Template,
+                                        Alias,
+                                        Node
+                                        );
+
+/*
+pLogMsg ( klogDebug, "_EncryptedFileConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _EncryptedFileConstructor () */
+
+static
+rc_t CC
+_EncryptedFileValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_EncryptedFileValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _EncryptedFileValidator () */
+
+static const struct XFSTeleport _sEncryptedFileTeleport = {
+                                        _EncryptedFileConstructor,
+                                        _EncryptedFileValidator,
+                                        false
+                                        };
+
+
+LIB_EXPORT
+rc_t CC
+XFSEncryptedFileProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sEncryptedFileTeleport;
+
+    return 0;
+}   /* XFSEncryptedFileProvider () */
+
diff --git a/libs/xfs/encws.c b/libs/xfs/encws.c
new file mode 100644
index 0000000..071f063
--- /dev/null
+++ b/libs/xfs/encws.c
@@ -0,0 +1,1793 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/handle.h>
+#include <xfs/perm.h>
+
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "ncon.h"
+#include "teleport.h"
+#include "common.h"
+#include "xencws.h"
+
+#include <sysalloc.h>
+
+/*)))
+ |||    That file contains 'native' KFile and KDirectory based nodes
+ |||    Both nodes are implemented as _EncWsNode
+ |||    That kind of node represent real path which exists in system
+(((*/
+
+/*)))
+ |||
+ +++    FileNode, and other simple containers
+ |||
+(((*/
+struct _EncWsNode {
+    struct XFSNode node;
+
+    const struct KDirectory * workspace;
+    const char * path;      /* Path for object */
+    XFSNType type;          /* For optimizing goals only */
+};
+
+struct _EncWsFileEditor {
+    struct XFSFileEditor Papahen;
+
+    struct KFile * File;
+};
+
+struct _EncWsAttrEditor {
+    struct XFSAttrEditor Papahen;
+
+    char perm [ 16 ];     /* there we are storing 'const' object */
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*                                                               *_*/
+/*_* EncWsNode is living here                                      *_*/
+/*_*                                                               *_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ |||
+ +++    EncWsNode virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _EncWsNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _EncWsNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _EncWsFileNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _EncWsDirNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _EncWsNodeDir_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSDirEditor ** Dir
+                                );
+static rc_t CC _EncWsNodeFile_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSFileEditor ** File
+                                );
+static rc_t CC _EncWsNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _EncWsNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sEncWsFileNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _EncWsNodeFlavor_v1,
+                                        _EncWsNodeDispose_v1,
+                                        _EncWsFileNodeFindNode_v1,
+                                        NULL,   /* NO DIR */
+                                        _EncWsNodeFile_v1,
+                                        _EncWsNodeAttr_v1,
+                                        _EncWsNodeDescribe_v1
+                                        };
+
+static const struct XFSNode_vt_v1 _sEncWsDirNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _EncWsNodeFlavor_v1,
+                                        _EncWsNodeDispose_v1,
+                                        _EncWsDirNodeFindNode_v1,
+                                        _EncWsNodeDir_v1,
+                                        NULL,   /* NO FILE */
+                                        _EncWsNodeAttr_v1,
+                                        _EncWsNodeDescribe_v1
+                                        };
+
+static
+rc_t CC
+_EncWsNodeMake (
+            struct _EncWsNode ** Node,
+            const struct KDirectory * Workspace,
+            const char * Name,
+            const char * Path
+)
+{
+    rc_t RCt;
+    struct _EncWsNode * TheNode;
+    uint32_t Type;
+
+    RCt = 0;
+    TheNode = NULL;
+    Type = kptNotFound;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+    XFS_CAN ( Workspace )
+    XFS_CAN ( Name )
+
+        /* First we should check that object exist and has valid type
+         */
+    Type = KDirectoryPathType ( Workspace, Path );
+    switch ( Type ) {
+        case kptFile :
+        case kptDir :
+            break;
+        case kptNotFound :
+            return XFS_RC ( rcNotFound );
+        default :
+            return XFS_RC ( rcInvalid );
+    }
+
+    TheNode = calloc ( 1, sizeof ( struct _EncWsNode ) );
+    if ( TheNode == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = XFSNodeInitVT (
+                & ( TheNode -> node),
+                Name,
+                ( const union XFSNode_vt * ) ( Type == kptDir
+                                        ? ( & _sEncWsDirNodeVT_v1 )
+                                        : ( & _sEncWsFileNodeVT_v1 )
+                )
+                );
+        if ( RCt == 0 ) {
+            RCt = KDirectoryAddRef ( Workspace );
+            if ( RCt == 0 ) {
+                TheNode -> workspace = Workspace;
+
+                TheNode -> type = Type == kptDir ? kxfsDir : kxfsFile;
+
+                    /* This is duplicate, but necessary one
+                     */
+                TheNode -> node . vt = Type == kxfsDir
+                        ? ( ( const union XFSNode_vt * ) & _sEncWsDirNodeVT_v1 )
+                        : ( ( const union XFSNode_vt * ) & _sEncWsFileNodeVT_v1 )
+                        ;
+
+                RCt = XFS_StrDup ( Path, & ( TheNode -> path ) );
+                if ( RCt == 0 ) {
+                    * Node = TheNode;
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( & ( TheNode -> node ) );
+            TheNode = NULL;
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "_EncWsNodeMake ND[$(node)] NM[$(name)] TP[$(type)]", "node=%p,name=%s,type=%d", ( void * ) TheNode, Name, Type );
+*/
+
+    return RCt;
+}   /* _EncWsNodeMake () */
+
+uint32_t CC
+_EncWsNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    return _sFlavorOfWorkspace;
+}   /* _EncWsNodeFlavor_v1 () */
+
+static
+rc_t CC
+_EncWsNodeDispose ( const struct _EncWsNode * self )
+{
+    struct _EncWsNode * Node = ( struct _EncWsNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "_EncWsNodeDispose ND[$(node)] TP[$(type)]", "node=%p,type=%d", ( void * ) Node, ( Node == NULL ? 0 : Node -> type ) );
+*/
+
+    if ( Node == 0 ) {
+        return 0;
+    }
+
+    if ( Node -> workspace != NULL ) {
+        KDirectoryRelease ( Node -> workspace );
+        Node -> workspace = NULL;
+    }
+
+    if ( Node -> path != NULL ) {
+        free ( ( char * ) Node -> path );
+        Node -> path = NULL;
+    }
+
+    Node -> type = 0;
+
+    free ( Node );
+
+    return 0;
+}   /* _EncWsNodeDispose () */
+
+rc_t CC
+_EncWsNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return _EncWsNodeDispose ( ( struct _EncWsNode * ) self );
+}   /* _EncWsNodeDispose_v1 () */
+
+/*)))
+ |||
+ +++  There will be two methods to find node: for KDir and for KFile
+ |||
+(((*/
+
+/*)) KFile version
+ ((*/
+rc_t CC
+_EncWsFileNodeFindNode_v1 (
+            const struct XFSNode * self,
+            const struct XFSPath * Path,
+            uint32_t PathIndex,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    bool IsLast;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    IsLast = false;
+
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                            self,
+                                            Path,
+                                            PathIndex,
+                                            Node,
+                                            & NodeName,
+                                            & PathCount,
+                                            & IsLast
+                                            );
+    if ( RCt == 0 ) {
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+        }
+    }
+
+
+    return RCt;
+}   /* _EncWsFileNodeFindNode () */
+
+/*)) KDir version
+ ((*/
+rc_t CC
+_EncWsDirNodeFindNode_v1 (
+            const struct XFSNode * self,
+            const struct XFSPath * Path,
+            uint32_t PathIndex,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    char PathBuf [ XFS_SIZE_4096 ];
+    size_t PathBufLen;
+    struct _EncWsNode * EncWsNode;
+    const struct XFSPath * xPath;
+    bool IsLast;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    * PathBuf = 0;
+    PathBufLen = 0;
+    EncWsNode = NULL;
+    xPath = NULL;
+    IsLast = false;
+
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                            self,
+                                            Path,
+                                            PathIndex,
+                                            Node,
+                                            & NodeName,
+                                            & PathCount,
+                                            & IsLast
+                                            );
+    if ( RCt == 0 ) {
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+
+            return RCt;
+        }
+
+        EncWsNode = ( struct _EncWsNode * ) self;
+        if ( EncWsNode -> path == NULL ) {
+            return XFS_RC ( rcInvalid );
+        }
+
+        if ( EncWsNode -> workspace == NULL ) {
+            return XFS_RC ( rcInvalid );
+        }
+
+        PathBufLen = string_copy_measure (
+                                        PathBuf,
+                                        sizeof ( PathBuf ),
+                                        EncWsNode -> path
+                                        );
+        * ( PathBuf + PathBufLen ) = '/';
+            /*) Here we are trying to create new node
+             (*/
+        RCt = XFSPathFrom ( Path, PathIndex + 1, & xPath );
+        if ( RCt == 0 ) {
+            if ( string_copy (
+                        PathBuf + PathBufLen + 1,
+                        sizeof ( PathBuf ) - PathBufLen,
+                        XFSPathGet ( xPath ),
+                        string_size ( XFSPathGet ( xPath ) )
+                        ) != string_size ( XFSPathGet ( xPath ) ) ) {
+
+                RCt = XFS_RC ( rcInvalid );
+            }
+            XFSPathRelease ( xPath );
+        }
+        if ( RCt == 0 ) {
+            RCt = _EncWsNodeMake (
+                                & EncWsNode,
+                                EncWsNode -> workspace,
+                                XFSPathName ( Path ),
+                                PathBuf
+                                );
+            if ( RCt == 0 ) {
+                * Node = & ( EncWsNode -> node );
+            }
+        }
+    }
+
+
+    return RCt;
+}   /* _EncWsDirNodeFindNode () */
+
+/*)))
+ |||
+ +++  Unified DirEditor
+ |||
+(((*/
+static
+rc_t CC
+_EncWsDir_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_EncWsDir_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSDirEditor * ) self );
+    }
+
+    return 0;
+}   /* _EncWsDir_dispose_v1 () */
+
+static
+rc_t CC
+_EncWsDir_list_v1 (
+                const struct XFSDirEditor * self,
+                const struct KNamelist ** List
+)
+{
+    const struct _EncWsNode * Node;
+    struct KNamelist * TempList;
+    rc_t RCt;
+
+    RCt = 0;
+    Node = NULL;
+    TempList = NULL;
+
+    if ( self == NULL || List == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * List = NULL;
+
+    Node = ( const struct _EncWsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> workspace == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> type != kxfsDir ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KDirectoryList (
+                        Node -> workspace,
+                        & TempList,
+                        NULL, /* Filter Func */
+                        NULL, /* Filter Data */
+                        Node -> path
+                        );
+    if ( RCt == 0 ) {
+        * List = TempList;
+    }
+    else {
+        if ( TempList != NULL ) {
+            KNamelistRelease ( TempList );
+        }
+    }
+
+    return RCt;
+}   /* _EncWsDir_list_v1 () */
+
+static
+rc_t CC
+_EncWsDir_find_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name,
+                const struct XFSNode ** Node
+)
+{
+    const struct _EncWsNode * EncWsNode;
+    struct _EncWsNode * TempNode;
+    char FullPath [ XFS_SIZE_4096 ];
+    size_t NumWrit;
+    rc_t RCt;
+
+    RCt = 0;
+    EncWsNode = NULL;
+    TempNode = NULL;
+    NumWrit = 0;
+    * FullPath = 0;
+
+    if ( self == NULL || Name == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Node = NULL;
+
+    EncWsNode = ( const struct _EncWsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( EncWsNode == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( EncWsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( EncWsNode -> workspace == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = string_printf (
+                        FullPath,
+                        sizeof ( FullPath ),
+                        & NumWrit,
+                        "%s/%s",
+                        EncWsNode -> path,
+                        Name
+                        );
+    if ( RCt == 0 ) {
+        RCt = _EncWsNodeMake (
+                            & TempNode,
+                            EncWsNode -> workspace,
+                            Name,
+                            FullPath
+                            );
+        if ( RCt == 0 ) {
+            * Node = ( const struct XFSNode * ) TempNode;
+        }
+    }
+
+    return RCt;
+}   /* _EncWsDir_find_v1 () */
+
+static
+rc_t CC
+_EncWsDir_create_file_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name,
+                XFSNMode Mode,
+                const struct XFSHandle ** Handle
+)
+{
+    struct KFile * File;
+    bool Update;
+    KCreateMode CreateMode;
+    char Path [ XFS_SIZE_4096 ];
+    struct _EncWsNode * EncWsNode, * TempNode;
+    struct _EncWsFileEditor * FileEditor;
+    const struct XFSHandle * TempHandle;
+    size_t NumWritten;
+    uint32_t NodeMode;
+    rc_t RCt;
+
+    File = NULL;
+    Update = false;
+    CreateMode = kcmCreate;
+    * Path = 0;
+    EncWsNode = TempNode = NULL;
+    FileEditor = NULL;
+    TempHandle = NULL;
+    NumWritten = 0;
+    NodeMode = 0;
+    RCt = 0;
+
+    if ( self == NULL || Name == NULL || Handle == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Handle = NULL;
+
+    EncWsNode = ( struct _EncWsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( EncWsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( EncWsNode -> workspace == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = string_printf (
+                        Path,
+                        sizeof ( Path ),
+                        & NumWritten,
+                        "%s/%s",
+                        EncWsNode -> path,
+                        Name
+                        );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    Update = Mode == kxfsReadWrite;
+    CreateMode = kcmCreate;
+
+    NodeMode = ( Mode == kxfsReadWrite || Mode == kxfsWrite )
+                                                ? XFSPermRWDefNodeNum ()
+                                                : XFSPermRODefNodeNum ()
+                                                ;
+
+        /* Here we are */
+    RCt = KDirectoryCreateFile (
+                            ( struct KDirectory * ) EncWsNode -> workspace,
+                            & File, 
+                            Update,
+                            NodeMode,
+                            CreateMode,
+                            Path
+                            );
+    if ( RCt == 0 ) {
+        RCt = _EncWsNodeMake (
+                            & TempNode,
+                            EncWsNode -> workspace,
+                            Name,
+                            Path
+                            );
+        if ( RCt == 0 ) {
+            RCt = XFSNodeFileEditor (
+                                & ( TempNode -> node ),
+                                ( const struct XFSFileEditor ** ) & FileEditor
+                                );
+            if ( RCt == 0 ) {
+                FileEditor -> File = File;
+                RCt = XFSHandleMake (
+                                & ( TempNode -> node ),
+                                & TempHandle
+                                );
+                if ( RCt == 0 ) {
+                    XFSHandleSet ( TempHandle, FileEditor );
+
+                    * Handle = TempHandle;
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Handle = NULL;
+
+        if ( TempHandle != NULL ) {
+            XFSHandleRelease ( TempHandle );
+        }
+        else {
+            if ( FileEditor != NULL ) {
+                XFSEditorDispose ( ( const struct XFSEditor * ) FileEditor );
+            }
+        }
+
+        if ( File != NULL ) {
+            KFileRelease ( File );
+        }
+    }
+
+    return RCt;
+}   /* _EncWsDir_create_file_v1 () */
+
+static
+rc_t CC
+_EncWsDir_create_dir_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name
+)
+{
+    rc_t RCt;
+    struct _EncWsNode * EncWsNode;
+    char Path [ XFS_SIZE_4096 ];
+    size_t NumWritten;
+
+    RCt = 0;
+    EncWsNode = NULL;
+    * Path = 0;
+    NumWritten = 0;
+
+    if ( self == NULL || Name == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    EncWsNode = ( struct _EncWsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( EncWsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( EncWsNode -> workspace == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = string_printf (
+                        Path,
+                        sizeof ( Path ),
+                        & NumWritten,
+                        "%s/%s",
+                        EncWsNode -> path,
+                        Name
+                        );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    return KDirectoryCreateDir (
+                        ( struct KDirectory * ) EncWsNode -> workspace,
+                        XFSPermRWDefContNum (),
+                        kcmCreate,
+                        Path
+                        );
+}   /* _EncWsDir_create_dir_v1 () */
+
+static
+rc_t CC
+_EncWsDir_delete_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name
+)
+{
+    rc_t RCt;
+    struct _EncWsNode * EncWsNode;
+    char Path [ XFS_SIZE_4096 ];
+    size_t NumWritten;
+
+    RCt = 0;
+    EncWsNode = NULL;
+    * Path = 0;
+    NumWritten = 0;
+
+    if ( self == NULL || Name == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    EncWsNode = ( struct _EncWsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( EncWsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( EncWsNode -> workspace == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = string_printf (
+                        Path,
+                        sizeof ( Path ),
+                        & NumWritten,
+                        "%s/%s",
+                        EncWsNode -> path,
+                        Name
+                        );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    return KDirectoryRemove (
+                        ( struct KDirectory * ) EncWsNode -> workspace,
+                        true,
+                        Path
+                        );
+}   /* _EncWsDir_delete_v1 () */
+
+rc_t CC
+_EncWsDir_move_v1 (
+            const struct XFSDirEditor * self,
+            const char * OldName,
+            const struct XFSNode * NewDir,
+            const char * NewName
+)
+{
+    rc_t RCt;
+    struct _EncWsNode * EncWsNode;
+    struct _EncWsNode * NewEncWsNode;
+    char OldPath [ XFS_SIZE_4096 ];
+    char NewPath [ XFS_SIZE_4096 ];
+    size_t NumWritten;
+
+    RCt = 0;
+    EncWsNode = NULL;
+    NewEncWsNode = NULL;
+    * OldPath = * NewPath = 0;
+    NumWritten = 0;
+
+    if ( self == NULL || OldName == NULL || NewDir == NULL
+        || NewName == NULL
+    ) {
+        return XFS_RC ( rcNull );
+    }
+
+        /*) TODO it is temporary, until we will do
+         (*/
+    if ( XFSNodeFlavor ( NewDir ) !=
+            XFSNodeFlavor ( ( self -> Papahen ) . Node ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    EncWsNode = ( struct _EncWsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( EncWsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( EncWsNode -> workspace == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    NewEncWsNode = ( struct _EncWsNode * ) NewDir;
+
+    if ( NewEncWsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( NewEncWsNode -> workspace == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = string_printf (
+                        OldPath,
+                        sizeof ( OldPath ),
+                        & NumWritten,
+                        "%s/%s",
+                        EncWsNode -> path,
+                        OldName
+                        );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    RCt = string_printf (
+                        NewPath,
+                        sizeof ( NewPath ),
+                        & NumWritten,
+                        "%s/%s",
+                        NewEncWsNode -> path,
+                        NewName
+                        );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    return KDirectoryRename (
+                        ( struct KDirectory * ) EncWsNode -> workspace,
+                        true,
+                        OldPath,
+                        NewPath
+                        );
+}   /* _EncWsDir_move_v1 () */
+
+rc_t CC
+_EncWsNodeDir_v1 (
+            const struct XFSNode * self,
+            const struct XFSDirEditor ** Dir
+)
+{
+    rc_t RCt;
+    struct XFSDirEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    if ( self == NULL || Dir == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Dir = NULL;
+
+    if ( ( ( struct _EncWsNode * ) self ) -> type != kxfsDir ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Editor = calloc ( 1, sizeof ( struct XFSDirEditor ) );
+    if ( Editor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _EncWsDir_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> list = _EncWsDir_list_v1;
+        Editor -> find = _EncWsDir_find_v1;
+        Editor -> create_file = _EncWsDir_create_file_v1;
+        Editor -> create_dir = _EncWsDir_create_dir_v1;
+        Editor -> delete = _EncWsDir_delete_v1;
+        Editor -> move = _EncWsDir_move_v1;
+
+        * Dir = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _EncWsNodeDir_v1 () */
+
+/*)))
+ |||
+ +++  Unified FileEditor
+ |||
+(((*/
+
+static
+rc_t CC
+_EncWsFile_dispose_v1 ( const struct XFSEditor * self )
+{
+    struct _EncWsFileEditor * Editor = ( struct _EncWsFileEditor * ) self;
+
+/*
+    pLogMsg ( klogDebug, "_EncWsFile_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( Editor != NULL ) {
+        if ( Editor -> File != NULL ) {
+            KFileRelease ( Editor -> File );
+
+            Editor -> File = NULL;
+        }
+
+        free ( Editor );
+    }
+
+    return 0;
+}   /* _EncWsFile_dispose_v1 () */
+
+static
+rc_t CC
+_EncWsFile_open_v1 (
+                    const struct XFSFileEditor * self,
+                    XFSNMode Mode
+)
+{
+    KFile * File;
+    const struct _EncWsNode * Node;
+    rc_t RCt;
+
+    File = NULL;
+    Node = NULL;
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Node = ( const struct _EncWsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> type != kxfsFile ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> workspace == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Mode == kxfsRead ) {
+        RCt = KDirectoryOpenFileRead (
+                            ( struct KDirectory * ) Node -> workspace,
+                            ( const KFile ** ) & File,
+                            Node -> path
+                            );
+    }
+    else {
+        RCt = KDirectoryOpenFileWrite (
+                            ( struct KDirectory * ) Node -> workspace,
+                            & File,
+                            ( Mode & kxfsRead ) == kxfsRead,
+                            Node -> path
+                            );
+    }
+    if ( RCt == 0 ) {
+        ( ( struct _EncWsFileEditor * ) self ) -> File = File;
+    }
+
+    return RCt;
+}   /* _EncWsFile_open_v1 () */
+
+static
+rc_t CC
+_EncWsFile_close_v1 ( const struct XFSFileEditor * self )
+{
+    struct _EncWsFileEditor * Editor;
+    rc_t RCt;
+
+    Editor = NULL;
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+
+    Editor = ( struct _EncWsFileEditor * ) self;
+
+    if ( Editor -> File != NULL ) {
+        RCt = KFileRelease ( Editor -> File );
+
+        Editor -> File = NULL;
+    }
+
+    return RCt;
+}   /* _EncWsFile_close_v1 () */
+
+static
+rc_t CC
+_EncWsFile_read_v1 (
+                    const struct XFSFileEditor * self,
+                    uint64_t Offset,
+                    void * Buffer,
+                    size_t SizeToRead,
+                    size_t * NumReaded
+)
+{
+    struct _EncWsFileEditor * Editor;
+    rc_t RCt;
+
+    Editor = NULL;
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Editor = ( struct _EncWsFileEditor * ) self;
+
+    if ( Editor -> File == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KFileReadAll (
+                    Editor -> File,
+                    Offset,
+                    Buffer,
+                    SizeToRead,
+                    NumReaded
+                    );
+
+/* here may be debutt */
+
+    return RCt;
+}   /* _EncWsFile_read_v1 () */
+
+static
+rc_t CC
+_EncWsFile_write_v1 (
+                    const struct XFSFileEditor * self,
+                    uint64_t Offset,
+                    const void * Buffer,
+                    size_t SizeToWrite,
+                    size_t * NumWritten
+)
+{
+    struct _EncWsFileEditor * Editor;
+    rc_t RCt;
+
+    Editor = NULL;
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Editor = ( struct _EncWsFileEditor * ) self;
+
+    if ( Editor -> File == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KFileWriteAll (
+                    Editor -> File,
+                    Offset,
+                    Buffer,
+                    SizeToWrite,
+                    NumWritten
+                    );
+
+    return RCt;
+}   /* _EncWsFile_write_v1 () */
+
+static
+rc_t CC
+_EncWsFile_size_v1 (
+                        const struct XFSFileEditor * self,
+                        uint64_t * Size
+)
+{
+    const struct _EncWsNode * Node;
+    const struct KFile * File;
+    uint64_t TempSize;
+    rc_t RCt;
+
+    Node = NULL;
+    File = NULL;
+    TempSize = 0;
+    RCt = 0;
+
+    XFS_CSA ( Size, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Size )
+
+    Node = ( const struct _EncWsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    XFS_CAN ( Node )
+    XFS_CAN ( Node -> path )
+    XFS_CAN ( Node -> workspace )
+
+    if ( Node -> type == kxfsDir ) {
+            /*) Traditionally directory have size ZERO :lol:
+             (*/
+        * Size = 0;
+    }
+    else {
+        File = ( const struct KFile * )
+                        ( ( struct _EncWsFileEditor * ) self ) -> File;
+        if ( File == NULL ) {
+            RCt = KDirectoryFileSize (
+                                Node -> workspace,
+                                & TempSize,
+                                Node -> path
+                                );
+
+        }
+        else {
+            RCt = KFileSize ( File, & TempSize );
+        }
+
+        if ( RCt == 0 ) {
+            * Size = TempSize;
+        }
+    }
+
+    return RCt;
+}   /* _EncWsFile_size_v1 () */
+
+static
+rc_t CC
+_EncWsFile_set_size_v1 (
+                const struct XFSFileEditor * self,
+                uint64_t Size
+)
+{
+    rc_t RCt;
+    const struct _EncWsNode * Node;
+    struct KFile * File;
+
+    RCt = 0;
+    Node = NULL;
+
+    XFS_CAN ( self );
+
+    Node = ( const struct _EncWsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    XFS_CAN ( Node )
+    XFS_CAN ( Node -> path )
+    XFS_CAN ( Node -> workspace )
+
+    if ( Node -> type != kxfsDir ) {
+        File = ( struct KFile * )
+                        ( ( struct _EncWsFileEditor * ) self ) -> File;
+        if ( File == NULL ) {
+            RCt = KDirectorySetFileSize (
+                            ( struct KDirectory * ) Node -> workspace,
+                            Size,
+                            Node -> path
+                            );
+        }
+        else {
+            RCt = KFileSetSize ( File, Size );
+        }
+    }
+
+    return RCt;
+}   /*  _EncWsFile_set_size_v1 () */
+
+rc_t CC
+_EncWsNodeFile_v1 (
+            const struct XFSNode * self,
+            const struct XFSFileEditor ** File
+)
+{
+    rc_t RCt;
+    struct _EncWsFileEditor * FileEditor;
+    struct XFSFileEditor * Editor;
+
+    RCt = 0;
+    FileEditor = NULL;
+    Editor = NULL;
+
+    if ( self == NULL || File == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * File = NULL;
+
+    if ( ( ( struct _EncWsNode * ) self ) -> type != kxfsFile ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    FileEditor = calloc ( 1, sizeof ( struct _EncWsFileEditor ) );
+    if ( FileEditor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    Editor = & ( FileEditor -> Papahen );
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _EncWsFile_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> open = _EncWsFile_open_v1;
+        Editor -> close = _EncWsFile_close_v1;
+        Editor -> read = _EncWsFile_read_v1;
+        Editor -> write = _EncWsFile_write_v1;
+        Editor -> size = _EncWsFile_size_v1;
+        Editor -> set_size = _EncWsFile_set_size_v1;
+
+        * File = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _EncWsNodeFile_v1 () */
+
+/*)))
+ |||
+ +++  Unified Attr
+ |||
+(((*/
+
+static
+rc_t CC
+_EncWsAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_EncWsAttr_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct _EncWsAttrEditor * ) self );
+    }
+
+    return 0;
+}   /* _EncWsAttr_dispose_v1 () */
+
+/*))    Something unusual. Will check-initialize NativeDir and Node
+ //     NativeDir and Node could be NULL
+((*/
+static
+rc_t CC
+_EncWsAttr_init_check_v1 (
+                    const struct XFSAttrEditor * self,
+                    const struct _EncWsNode ** Node,
+                    struct KDirectory ** Workspace
+
+)
+{
+    const struct _EncWsNode * RetNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CSAN ( Workspace )
+    XFS_CAN ( self )
+
+    RetNode = ( const struct _EncWsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    if ( RetNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( RetNode -> workspace == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node != NULL ) {
+        * Node = RetNode;
+    }
+
+    if ( Workspace != NULL ) {
+        * Workspace = ( struct KDirectory * ) RetNode -> workspace;
+    }
+
+    return 0;
+}   /* _EncWsAttr_init_check_v1 () */
+
+static
+rc_t CC
+_EncWsAttr_permissions_v1 (
+                        const struct XFSAttrEditor * self,
+                        const char ** Permissions
+)
+{
+    const struct _EncWsNode * Node;
+    KDirectory * Workspace;
+    uint32_t Access;
+    char * BF;
+    rc_t RCt;
+
+    Node = NULL;
+    Workspace = NULL;
+    BF = NULL;
+    RCt = 0;
+
+    if ( Permissions == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Permissions = NULL;
+
+    RCt = _EncWsAttr_init_check_v1 ( self, & Node, & Workspace );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryAccess ( Workspace, & Access, Node -> path );
+        if ( RCt == 0 ) {
+            BF = ( ( struct _EncWsAttrEditor * ) self ) -> perm;
+            RCt = XFSPermToChar (
+                                Access,
+                                BF,
+                                sizeof ( ( ( struct _EncWsAttrEditor * ) self ) -> perm )
+                                );
+            if ( RCt == 0 ) {
+                if ( Node -> type == kxfsDir ) {
+                    BF [ 0 ] = 'r';
+                    BF [ 2 ] = 'x';
+                }
+
+                * Permissions = ( const char * ) BF;
+            }
+        }
+    }
+
+    return RCt;
+}   /* _EncWsAttr_permissions_v1 () */
+
+static
+rc_t CC
+_EncWsAttr_set_permissions_v1 (
+                        const struct XFSAttrEditor * self,
+                        const char * Permissions
+)
+{
+    rc_t RCt;
+    const struct _EncWsNode * Node;
+    struct KDirectory * Workspace;
+    uint32_t Access;
+
+    RCt = 0;
+    Workspace = NULL;
+    Node = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Permissions )
+
+    if ( Permissions == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = _EncWsAttr_init_check_v1 ( self, & Node, & Workspace );
+    if ( RCt == 0 ) {
+        RCt = XFSPermToNum ( Permissions, & Access );
+        if ( RCt == 0 ) {
+            RCt = KDirectorySetAccess (
+                                    Workspace,
+                                    false,
+                                    Access,
+                                    Access,
+                                    Node -> path
+                                    );
+
+        }
+    }
+
+    return RCt;
+}   /*  _EncWsAttr_set_permissions_v1 () */
+
+static
+rc_t CC
+_EncWsAttr_date_v1 (
+                        const struct XFSAttrEditor * self,
+                        KTime_t * Time
+)
+{
+    const struct _EncWsNode * Node;
+    struct KDirectory * Workspace;
+    KTime_t TempTime;
+    rc_t RCt;
+
+    Node = NULL;
+    Workspace = NULL;
+    TempTime = 0;
+    RCt = 0;
+
+    XFS_CSA ( Time, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Time )
+
+    RCt = _EncWsAttr_init_check_v1 ( self, & Node, & Workspace );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryDate ( Workspace, & TempTime, Node -> path );
+        if ( RCt == 0 ) {
+            * Time = TempTime;
+        }
+    }
+
+    return RCt;
+}   /* _EncWsAttr_date_v1 () */
+
+static
+rc_t CC
+_EncWsAttr_set_date_v1 (
+                const struct XFSAttrEditor * self,
+                KTime_t Time
+)
+{
+    rc_t RCt;
+    const struct _EncWsNode * Node;
+    struct KDirectory * Workspace;
+
+    RCt = 0;
+    Workspace = NULL;
+    Node = NULL;
+
+    XFS_CAN ( self )
+
+    RCt = _EncWsAttr_init_check_v1 ( self, & Node, & Workspace );
+    if ( RCt == 0 ) {
+        RCt = KDirectorySetDate ( Workspace, true, Time, Node -> path );
+    }
+
+    return RCt;
+}   /*  _EncWsAttr_set_date_v1 () */
+
+static
+rc_t CC
+_EncWsAttr_type_v1 (
+                        const struct XFSAttrEditor * self,
+                        XFSNType * Type
+)
+{
+    const struct _EncWsNode * Node;
+    rc_t RCt;
+
+    Node = NULL;
+    RCt = 0;
+
+    XFS_CSA ( Type, kxfsFile )
+    XFS_CAN ( Type )
+
+    RCt = _EncWsAttr_init_check_v1 ( self, & Node, NULL );
+    if ( RCt == 0 ) {
+        * Type = Node -> type;
+    }
+
+    return RCt;
+}   /* _EncWsAttr_type_v1 () */
+
+static
+rc_t CC
+_EncWsNodeAttr_v1 (
+            const struct XFSNode * self,
+            const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct _EncWsAttrEditor * EncWsEditor;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    EncWsEditor = NULL;
+    Editor = NULL;
+
+    XFS_CSAN ( Attr )
+    XFS_CAN ( self )
+    XFS_CAN ( Attr )
+
+    EncWsEditor = calloc ( 1, sizeof ( struct _EncWsAttrEditor ) );
+    if ( EncWsEditor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    Editor = & ( EncWsEditor -> Papahen );
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _EncWsAttr_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> permissions = _EncWsAttr_permissions_v1;
+        Editor -> set_permissions = _EncWsAttr_set_permissions_v1;
+        Editor -> date = _EncWsAttr_date_v1;
+        Editor -> set_date = _EncWsAttr_set_date_v1;
+        Editor -> type = _EncWsAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( EncWsEditor );
+    }
+
+    return RCt;
+}   /* _EncWsNodeAttr_v1 () */
+
+/*)))
+ |||
+ +++  Unified Discribe
+ |||
+(((*/
+
+rc_t CC
+_EncWsNodeDescribe_v1 (
+            const struct XFSNode * self,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+    const char * Abbr;
+
+    RCt = 0;
+    NumWrit = 0;
+    Abbr = NULL;
+
+    if ( Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Abbr = ( ( const struct _EncWsNode * ) self ) -> type == kxfsDir
+            ? "ENC DIR"
+            : "ENC FILE"
+            ;
+
+    if ( self == NULL ) {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[NULL][NULL]",
+                    Abbr
+                    );
+    }
+    else {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[%s][0x%p]",
+                    Abbr,
+                    self -> Name,
+                    self
+                    );
+    }
+
+    return RCt;
+}   /* _EncWsNodeDescribe_v1 () */
+
+/*)))
+ |||
+ +++    WorkspaceNode lives here
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+static
+rc_t CC
+_EncWsNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct _EncWsNode * TheNode;
+    const struct KDirectory * Workspace;
+    const char * NodeName;
+
+    RCt = 0;
+    TheNode = NULL;
+    Workspace = NULL;
+    NodeName = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Model )
+    XFS_CAN ( Template )
+    XFS_CAN ( Node )
+
+    * Node = NULL;
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+        /* First we should find valid Workspace Directory 
+         */
+    RCt = XFSEncDirectoryOpen (
+                & Workspace,
+                ! XFSModelNodeReadOnly ( Template ),
+                XFSModelNodeProperty ( Template, XFS_MODEL_PASSWD ),
+                XFSModelNodeProperty ( Template, XFS_MODEL_ENCTYPE ),
+                XFSModelNodeProperty ( Template, XFS_MODEL_SOURCE )
+                );
+
+    if ( RCt == 0 ) {
+        RCt = _EncWsNodeMake (
+                    & TheNode,
+                    Workspace,
+                    NodeName,
+                    XFSModelNodeProperty ( Template, XFS_MODEL_SOURCE )
+                    );
+        if ( RCt == 0 ) {
+            * Node = ( struct XFSNode * ) TheNode;
+        }
+
+        KDirectoryRelease ( Workspace );
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            _EncWsNodeDispose ( TheNode );
+        }
+    }
+
+    return RCt;
+}   /* _EncWsNodeConstructor () */
+
+/*)))
+ |||
+ +++    Non-Teleport methods to create nodes
+ |||
+(((*/
+LIB_EXPORT
+rc_t CC
+XFSWorkspaceNodeMake (
+            struct XFSNode ** Node,
+            const char * Name,
+            const char * Path,
+            const char * Password,
+            const char * EncType,
+            bool ReadOnly
+)
+{
+    rc_t RCt;
+    struct _EncWsNode * TheNode;
+    const struct KDirectory * Workspace;
+
+    RCt = 0;
+    TheNode = NULL;
+    Workspace = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Name )
+    XFS_CAN ( Path )
+    XFS_CAN ( Password )
+    XFS_CAN ( Node )
+
+    RCt = XFSEncDirectoryOpen (
+                            & Workspace,
+                            ! ReadOnly,
+                            Password,
+                            EncType,
+                            Path
+                            );
+    if ( RCt == 0 ) {
+        RCt = _EncWsNodeMake ( & TheNode, Workspace, Name, Path );
+        if ( RCt == 0 ) {
+            * Node = & ( TheNode -> node );
+        }
+
+        KDirectoryRelease ( Workspace );
+    }
+
+    return RCt;
+}   /* XFSWorkspaceNodeMake () */
+
+/*)))
+ |||
+ +++    FileNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_WorkspaceNodeConstructor (
+                        const struct XFSModel * Model,
+                        const struct XFSModelNode * Template,
+                        const char * Alias,
+                        const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = _EncWsNodeConstructor ( Model, Template, Alias, Node );
+
+/*
+pLogMsg ( klogDebug, "_WorkspaceNodeConstructor ( $(model), $(template) (\"name\"), \"alias\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _WorkspaceNodeConstructor () */
+
+static
+rc_t CC
+_WorkspaceNodeValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_WorkspaceNodeValidator ( $(model), $(template) (\"name\"), \"alias\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _WorkspaceNodeValidator () */
+
+static const struct XFSTeleport _sWorkspaceNodeTeleport = {
+                                            _WorkspaceNodeConstructor,
+                                            _WorkspaceNodeValidator,
+                                            false
+                                            };
+
+
+LIB_EXPORT
+rc_t CC
+XFSWorkspaceProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sWorkspaceNodeTeleport;
+
+    return 0;
+}   /* XFSWorkspaceProvider () */
+
diff --git a/libs/xfs/foo.c b/libs/xfs/foo.c
new file mode 100644
index 0000000..613b482
--- /dev/null
+++ b/libs/xfs/foo.c
@@ -0,0 +1,250 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/editors.h>
+#include <xfs/perm.h>
+#include <xfs/doc.h>
+
+#include "mehr.h"
+#include "zehr.h"
+#include "ncon.h"
+#include "teleport.h"
+#include "common.h"
+
+#include <sysalloc.h>
+
+/*)))
+ |||
+ +++    FooNode, and other vicitims
+ |||
+(((*/
+
+/*)))
+ |||
+ +++    FooNode lives here
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+static
+rc_t CC
+_FooNodeMake ( struct XFSNode ** Foo, const char * NodeName )
+{
+    rc_t RCt;
+    struct XFSDoc * Doc;
+    struct XFSNode * TheFoo;
+
+    RCt = 0;
+    TheFoo = NULL;
+
+    if ( Foo != NULL ) {
+        * Foo = NULL;
+    }
+
+    if ( Foo == NULL || NodeName == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSTextDocMake ( & Doc );
+    if ( RCt == 0 ) {
+        RCt = XFSTextDocAppend ( Doc, "FOO FILE: placeholder for not implemented node type\n\n" );
+        if ( RCt  == 0 ) {
+            RCt = XFSDocNodeMakeWithFlavor (
+                                        & TheFoo,
+                                        Doc,
+                                        NodeName,
+                                        XFSPermRODefNodeChar (),
+                                        _sFlavorOfFoo
+                                        );
+            if ( RCt == 0 ) {
+                * Foo = TheFoo;
+            }
+            else {
+                if ( TheFoo != NULL ) {
+                    XFSNodeDispose ( TheFoo );
+                }
+            }
+        }
+
+        XFSDocRelease ( Doc );
+    }
+
+/*
+pLogMsg ( klogDebug, "_FooNodeMake ND[$(node)] NM[$(name)]", "node=%p,name=%s", ( void * ) TheFoo, NodeName );
+*/
+
+    return RCt;
+}   /* _FooNodeMake () */
+
+static
+rc_t CC
+_FooNodeDispose ( const struct XFSNode * self )
+{
+    struct XFSNode * Foo = ( struct XFSNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "_FooNodeDispose ( $(node) )", "node=%p", ( void * ) Foo );
+*/
+
+    if ( Foo == NULL ) {
+        return 0;
+    }
+
+    XFSNodeDispose ( Foo );
+
+    return 0;
+}   /* _FooNodeDispose () */
+
+/*)))
+ |||
+ +++    FooNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_FooNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    const char * NodeName;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+
+    if ( Model == NULL || Template == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Node = NULL;
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    RCt = _FooNodeMake ( & TheNode, NodeName );
+    if ( RCt == 0 ) {
+        /* TODO Copy Security */
+
+        * Node = ( struct XFSNode * ) TheNode;
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        _FooNodeDispose ( TheNode );
+    }
+
+/*
+pLogMsg ( klogDebug, "_FooNodeConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )\n", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _FooNodeConstructor () */
+
+static
+rc_t CC
+_FooNodeValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_FooNodeValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )\n", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _FooNodeValidator () */
+
+static const struct XFSTeleport _sFooNodeTeleport = {
+                                        _FooNodeConstructor,
+                                        _FooNodeValidator,
+                                        false
+                                        };
+
+
+LIB_EXPORT
+rc_t CC
+XFSFooNodeProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sFooNodeTeleport;
+
+    return 0;
+}   /* XFSFooNodeProvider () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ ///    And there are dummies for TeleportProviders
+(((*/
+LIB_EXPORT
+rc_t CC
+XFSCacheProvider ( const struct XFSTeleport ** Teleport )
+{
+    return XFSFooNodeProvider ( Teleport );
+}   /* XFSCacheProvider () */
+
+LIB_EXPORT
+rc_t CC
+XFSLinkProvider ( const struct XFSTeleport ** Teleport )
+{
+    return XFSFooNodeProvider ( Teleport );
+}
+
+LIB_EXPORT
+rc_t CC
+XFSLocalRepositoryProvider ( const struct XFSTeleport ** Teleport )
+{
+    return XFSFooNodeProvider ( Teleport );
+}
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
diff --git a/libs/xfs/gap.c b/libs/xfs/gap.c
new file mode 100644
index 0000000..cf36d54
--- /dev/null
+++ b/libs/xfs/gap.c
@@ -0,0 +1,585 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfg/kart.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/perm.h>
+#include <xfs/doc.h>
+
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "ncon.h"
+#include "teleport.h"
+#include "common.h"
+#include "contnode.h"
+#include "xgap.h"
+
+#include <sysalloc.h>
+
+#include <string.h>     /* memset */
+
+/*)))
+ |||    That is second approach for dbGaP project node
+ |||    That node contains 3 statically linked nodes :
+ |||        Cached ( SRA and FILES )
+ |||        Karts
+ |||        WorkSpace
+ |||
+(((*/
+
+/*)))
+ |||
+ +++    _GapProjectNode
+ |||
+(((*/
+
+struct _GapProjectNode {
+    struct XFSContNode node;
+
+    uint32_t project_id;
+    bool read_only;
+
+    const char * kart_files;
+};
+
+static
+rc_t CC
+_GapProjectNodeDispose ( struct XFSContNode * self )
+{
+    struct _GapProjectNode * Node =
+                                ( struct _GapProjectNode * ) self;
+
+    if ( Node != NULL ) {
+        if ( Node -> kart_files != NULL ) {
+            free ( ( char * ) Node -> kart_files );
+            Node -> kart_files = NULL;
+        }
+
+        Node -> project_id = 0;
+        Node -> read_only = true;
+
+        free ( Node );
+    }
+
+    return 0;
+}   /* _GapProjectNodeDispose () */
+
+static
+rc_t CC
+_GapProjectNodeMake (
+            struct _GapProjectNode ** Node,
+            const char * Name,
+            uint32_t ProjectId,
+            bool ReadOnly,
+            const char * Perm
+)
+{
+    rc_t RCt;
+    struct _GapProjectNode * GapNode;
+
+    RCt = 0;
+    GapNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+    XFS_CAN ( Name )
+
+    GapNode = calloc ( 1, sizeof ( struct _GapProjectNode ) );
+    if ( GapNode == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = XFSContNodeInit (
+                            & ( GapNode -> node . node ),
+                            Name,
+                            Perm,
+                            _sFlavorOfGapProject,
+                            _GapProjectNodeDispose
+                            );
+        if ( RCt == 0 ) {
+            if ( RCt == 0 ) {
+                GapNode -> project_id = ProjectId;
+                GapNode -> read_only = ReadOnly;
+
+                * Node = GapNode;
+            }
+        }
+    }
+
+    return RCt;
+}   /* _GapProjectNodeMake () */
+
+static
+rc_t CC
+_PrepareWorkspace (
+                uint32_t ProjectId,
+                char ** Workspace,
+                const char ** Password
+)
+{
+    rc_t RCt;
+    const struct XFSGapProject * Project;
+    char * WorkspaceDir;
+    const char * ThePass;
+    size_t ThePassSize;
+    struct KDirectory * NatDir;
+    uint32_t PathType;
+
+    RCt = 0;
+    Project = NULL;
+    WorkspaceDir = NULL;
+    ThePass = NULL;
+    ThePassSize = 0;
+    NatDir = NULL;
+    PathType = kptNotFound;
+
+    RCt = XFSGapFindOrCreate ( ProjectId, & Project );
+    if ( RCt == 0 ) {
+
+        RCt = XFSGapProjectWorkspace ( Project, & WorkspaceDir );
+        if ( RCt == 0 ) {
+            RCt = XFSGapProjectPassword (
+                                        Project,
+                                        & ThePass,
+                                        & ThePassSize
+                                        );
+
+            if ( RCt == 0 ) {
+                RCt = KDirectoryNativeDir ( & NatDir );
+                if ( RCt == 0 ) {
+                    PathType = KDirectoryPathType ( NatDir, WorkspaceDir );
+
+                    switch ( PathType ) {
+                        case kptNotFound :
+                            RCt = KDirectoryCreateDir (
+                                                    NatDir,
+                                                    0777,
+                                                    kcmCreate,
+                                                    WorkspaceDir
+                                                    );
+                            if ( RCt == 0 ) {
+                                * Workspace = WorkspaceDir;
+                                * Password = ThePass;
+                            }
+                            break;
+                        case kptDir :
+                            * Workspace = WorkspaceDir;
+                            * Password = ThePass;
+                            break;
+                        default :
+                            RCt = XFS_RC ( rcInvalid );
+                            break;
+                    }
+
+                    KDirectoryRelease ( NatDir );
+                }
+            }
+        }
+
+        XFSGapProjectRelease ( Project );
+    }
+
+    if ( RCt != 0 ) {
+        * Workspace = NULL;
+        * Password = NULL;
+
+        if ( WorkspaceDir != NULL ) {
+            free ( WorkspaceDir );
+        }
+    }
+
+    return RCt;
+}   /* _PrepareWorkspace () */
+
+static
+rc_t CC
+_GapProjectNodeAddChildren ( struct _GapProjectNode * self )
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    char * Workspace;
+    const char * Password;
+
+    RCt = 0;
+    TheNode = NULL;
+    Workspace = NULL;
+    Password = NULL;
+
+    XFS_CAN ( self );
+
+        /* There are three children: Cache, Karts and WS ...
+           and may be Bublic cache too.
+         */
+
+        /* Workspace is here
+         * TODO: password, location, etc ...
+         */
+    RCt = _PrepareWorkspace (
+                            self -> project_id,
+                            & Workspace,
+                            & Password
+                            );
+    if ( RCt == 0 ) {
+
+        RCt = XFSWorkspaceNodeMake (
+                                & TheNode,
+                                "workspace",
+                                Workspace,
+                                Password,
+                                NULL,
+                                self -> read_only
+                                );
+        if ( RCt == 0 ) {
+            RCt = XFSContNodeAddChild (
+                                    & ( self -> node ) . node,
+                                    TheNode
+                                    );
+        }
+
+        free ( Workspace );
+    }
+    else {
+/* TODO - use approved output method
+*/
+pLogErr ( klogErr, RCt, "ERROR: Can not find definition of Project $(project_id) in config file", "project_id=%d", self -> project_id );
+    }
+
+    if ( RCt != 0 ) {
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( TheNode );
+        }
+        return RCt;
+    }
+
+        /* Here is cache related to project
+         */
+    RCt = XFSGapCacheNodeMake (
+                        & TheNode,
+                        self -> project_id,     /* projectId */
+                        NULL                    /* perm is automatic */
+                        );
+    if ( RCt == 0 ) {
+        RCt = XFSContNodeAddChild ( & ( self -> node ) . node, TheNode );
+    }
+    else {
+/* TODO - use approved output method
+*/
+pLogErr ( klogErr, RCt, "ERROR: Can not find definition of Project $(project_id) in config file", "project_id=%d", self -> project_id );
+    }
+    if ( RCt != 0 ) {
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( TheNode );
+        }
+        return RCt;
+    }
+
+        /* Here is public cache 
+         */
+    RCt = XFSGapCacheNodeMake (
+                        & TheNode,
+                        XFS_PUBLIC_PROJECT_ID,  /* projectId */
+                        NULL                    /* perm is automatic */
+                        );
+    if ( RCt == 0 ) {
+        RCt = XFSContNodeAddChild ( & ( self -> node ) . node, TheNode );
+    }
+    else {
+        RCt = 0;
+/* TODO - use approved output method
+*/
+LogMsg ( klogWarn, "Can not find definition for 'public' area in config file" );
+    }
+
+    if ( RCt != 0 ) {
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( TheNode );
+        }
+        return RCt;
+    }
+
+    RCt = XFSGapKartFilesNodeMake ( & TheNode, NULL );
+    if ( RCt == 0 ) {
+        RCt = XFSContNodeAddChild ( & ( self -> node ) . node, TheNode );
+    }
+    if ( RCt != 0 ) {
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( TheNode );
+        }
+        return RCt;
+    }
+
+    RCt = XFSGapKartsNodeMake (
+                            & TheNode,
+                            self -> project_id,
+                            NULL
+                            );
+    if ( RCt == 0 ) {
+        RCt = XFSContNodeAddChild ( & ( self -> node ) . node, TheNode );
+    }
+    if ( RCt != 0 ) {
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( TheNode );
+        }
+        return RCt;
+    }
+
+    return RCt;
+}   /* _GapProjectNodeAddChildren () */
+
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectNodeMake (
+            struct XFSNode ** Node,
+            const char * Name,
+            uint32_t ProjectId,
+            bool ReadOnly,
+            const char * Perm
+)
+{
+    rc_t RCt;
+    struct _GapProjectNode * GapNode;
+
+    RCt = 0;
+    GapNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+    XFS_CAN ( Name )
+
+    RCt = _GapProjectNodeMake (
+                                & GapNode,
+                                Name,
+                                ProjectId,
+                                ReadOnly,
+                                Perm
+                                );
+    if ( RCt == 0 ) {
+        RCt = _GapProjectNodeAddChildren ( GapNode );
+        if ( RCt == 0 ) {
+            * Node = & ( GapNode -> node . node );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( GapNode != NULL ) {
+            XFSNodeDispose ( & ( GapNode -> node . node ) );
+            GapNode = NULL;
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "_GapNodeMake ND[$(node)] NM[$(name)] PJ[$(project_id)]", "node=%p,name=%s,project_id=%d", ( void * ) Node, Name, ( GapNode == NULL ? 0 : GapNode -> project_id ) );
+*/
+    return RCt;
+}   /* XFSGapProjectNodeMake () */
+
+/*)))
+ |||
+ +++  There GapNode Find
+ |||
+(((*/
+
+/*)))
+ |||
+ +++  There KartItemNode Find
+ |||
+(((*/
+
+/*)))
+ |||
+ +++  Unified DirEditor
+ |||
+(((*/
+
+/*)))
+ |||
+ +++  Unified Discribe
+ |||
+(((*/
+
+/*)))
+ |||
+ +++    FileNode lives here
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+static
+rc_t CC
+_GapProjectNodeConstructorEx (
+                        const struct XFSModel * Model,
+                        const struct XFSModelNode * Template,
+                        const char * Alias,
+                        XFSNType Type,
+                        const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct _GapProjectNode * TheNode;
+    const char * NodeName;
+    const char * TempStr;
+    uint32_t ProjectId;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+    TempStr = NULL;
+    ProjectId = 0;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Model )
+    XFS_CAN ( Template )
+    XFS_CAN ( Node )
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    TempStr = XFSModelNodeProperty ( Template, XFS_MODEL_PROJECTID );
+    if ( TempStr == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    ProjectId = atol ( TempStr );
+    if ( ProjectId == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = _GapProjectNodeMake (
+                                & TheNode,
+                                NodeName,
+                                ProjectId,
+                                XFSModelNodeReadOnly ( Template ),
+                                XFSModelNodeSecurity ( Template )
+                                );
+    if ( RCt == 0 ) {
+        RCt = _GapProjectNodeAddChildren ( TheNode );
+        if ( RCt == 0 ) {
+            * Node = & ( TheNode -> node . node );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( & ( TheNode -> node . node ) );
+
+            TheNode = NULL;
+        }
+    }
+
+    return RCt;
+}   /* _GapProjectNodeConstructorEx () */
+
+/*)))
+ |||
+ +++    FileNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_GapProjectNodeConstructor (
+                        const struct XFSModel * Model,
+                        const struct XFSModelNode * Template,
+                        const char * Alias,
+                        const struct XFSNode ** Node
+)
+{
+    rc_t RCt = 0;
+
+    RCt = _GapProjectNodeConstructorEx (
+                                        Model,
+                                        Template,
+                                        Alias,
+                                        kxfsFile,
+                                        Node
+                                        );
+/*
+pLogMsg ( klogDebug, "_GapProjectNodeConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+
+    return RCt;
+}   /* _GapProjectNodeConstructor () */
+
+static
+rc_t CC
+_GapProjectNodeValidator (
+                        const struct XFSModel * Model,
+                        const struct XFSModelNode * Template,
+                        const char * Alias,
+                        uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_GapProjectNodeValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _GapProjectNodeValidator () */
+
+static const struct XFSTeleport _sGapProjectNodeTeleport = {
+                                        _GapProjectNodeConstructor,
+                                        _GapProjectNodeValidator,
+                                        false
+                                        };
+
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sGapProjectNodeTeleport;
+
+    return 0;
+}   /* XFSGapProjectProvider () */
diff --git a/libs/xfs/gapc.c b/libs/xfs/gapc.c
new file mode 100644
index 0000000..80c7da3
--- /dev/null
+++ b/libs/xfs/gapc.c
@@ -0,0 +1,993 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/handle.h>
+#include <xfs/perm.h>
+
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "teleport.h"
+#include "common.h"
+#include "xgap.h"
+
+#include <sysalloc.h>
+
+/*)))
+ |||    That file contains third approach to project GAP cached
+ |||    private and public files
+(((*/
+
+/*)))
+ |||
+ +++    XFSCacheDirNode, and other simple containers
+ |||
+(((*/
+#define XFS_GAP_PUBLIC_CACHE_NAME "public"
+#define XFS_GAP_CACHE_NAME "cache"
+
+struct _CacheDirNode {
+    struct XFSNode node;
+
+    uint32_t project_id; /* GaP project Id */
+    const char * path;   /* Path for object */
+    const char * perm;   /* Permissions in format "rwxrwxrwx u:g:o" */
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*                                                               *_*/
+/*_* CacheDirNode is living here                                   *_*/
+/*_*                                                               *_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ |||
+ +++    CacheDirNode virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _CacheDirNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _CacheDirNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _CacheDirNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _CacheDirNodeDir_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSDirEditor ** Dir
+                                );
+static rc_t CC _CacheDirNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _CacheDirNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sCacheDirNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _CacheDirNodeFlavor_v1,
+                                        _CacheDirNodeDispose_v1,
+                                        _CacheDirNodeFindNode_v1,
+                                        _CacheDirNodeDir_v1,
+                                        NULL,   /* NO FILE */
+                                        _CacheDirNodeAttr_v1,
+                                        _CacheDirNodeDescribe_v1
+                                        };
+
+static
+rc_t CC
+_GapCacheGetPath ( const char ** CachePath, uint32_t ProjectId )
+{
+    rc_t RCt;
+    const struct XFSGapProject * Project;
+    char * RepositoryRoot;
+
+    RCt = 0;
+    Project = NULL;
+    RepositoryRoot = NULL;
+
+    XFS_CSAN ( CachePath )
+    XFS_CAN ( CachePath )
+
+    RCt = XFSGapFindOrCreate ( ProjectId, & Project );
+    if ( RCt == 0 ) {
+        RCt = XFSGapProjectRepositoryRoot ( Project, & RepositoryRoot );
+        if ( RCt == 0 ) {
+            * CachePath = RepositoryRoot;
+        }
+        XFSGapProjectRelease ( Project );
+    }
+
+    return RCt;
+}   /* _GapCacheGetPath () */
+
+static
+rc_t CC
+_CacheDirNodeMake (
+            struct _CacheDirNode ** Node,
+            const char * Path,
+            const char * Name,
+            const char * Perm
+)
+{
+    rc_t RCt;
+    struct _CacheDirNode * TheNode;
+
+    RCt = 0;
+    TheNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+    XFS_CAN ( Name )
+    XFS_CAN ( Path )
+
+    TheNode = calloc ( 1, sizeof ( struct _CacheDirNode ) );
+    if ( TheNode == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = XFSNodeInitVT (
+                & ( TheNode -> node),
+                Name,
+                ( const union XFSNode_vt * ) ( & _sCacheDirNodeVT_v1 )
+                );
+        if ( RCt == 0 ) {
+
+            RCt = XFS_StrDup ( Path, & ( TheNode -> path ) );
+            if ( RCt == 0 ) {
+                if ( Perm != NULL ) {
+                    RCt = XFS_StrDup ( Perm, & ( TheNode -> perm ) );
+                }
+                if ( RCt == 0 ) {
+                    * Node = TheNode;
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Node = TheNode;
+
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( & ( TheNode -> node ) );
+            TheNode = NULL;
+        }
+    }
+
+    return RCt;
+}   /* _CacheDirNodeMake () */
+
+uint32_t CC
+_CacheDirNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    if ( self != NULL ) {
+        return ( ( struct _CacheDirNode * ) self ) -> project_id == 0
+                                            ? _sFlavorOfGapPublicCache
+                                            : _sFlavorOfGapProjectCache
+                                            ;
+    }
+    return _sFlavorLess;
+}   /* _CacheDirNodeFlavor_v1 () */
+
+static
+rc_t CC
+_CacheDirNodeDispose ( const struct _CacheDirNode * self )
+{
+    struct _CacheDirNode * Node = ( struct _CacheDirNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "_CacheDirNodeDispose ( $(node) ) [T=$(project_id)]", "node=%p,project_id=%d", ( void * ) Node, ( Node == NULL ? 0 : Node -> project_id ) );
+*/
+
+    if ( Node != 0 ) {
+        if ( Node -> perm != NULL ) {
+            free ( ( char * ) Node -> perm );
+            Node -> perm = NULL;
+        }
+
+        if ( Node -> path != NULL ) {
+            free ( ( char * ) Node -> path );
+            Node -> path = NULL;
+        }
+
+        Node -> project_id = 0;
+
+        free ( Node );
+    }
+
+    return 0;
+}   /* _CacheDirNodeDispose () */
+
+rc_t CC
+_CacheDirNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return _CacheDirNodeDispose ( ( struct _CacheDirNode * ) self );
+}   /* _KfsNodeDispose_v1 () */
+
+/*)))
+ |||
+ +++  Find operation
+ |||
+(((*/
+
+static
+rc_t CC
+_CacheDirNodeForPath (
+                    const struct XFSNode ** Node,
+                    const char * Path,
+                    const char * Name,
+                    uint32_t ProjectId
+)
+{
+    rc_t RCt;
+    const struct XFSPath * xPath;
+    struct KDirectory * NativeDir;
+    uint32_t Type;
+    struct XFSNode * TheNode;
+
+    RCt = 0;
+    xPath = NULL;
+    NativeDir = NULL;
+    Type = kptNotFound;
+    TheNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Path )
+    XFS_CAN ( Name )
+    XFS_CAN ( Node )
+
+    RCt = XFSPathMake ( & xPath, true, "%s/%s", Path, Name );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryNativeDir ( & NativeDir );
+        if ( RCt == 0 ) {
+            Type = KDirectoryPathType (
+                                    NativeDir,
+                                    XFSPathGet ( xPath )
+                                    );
+            switch ( Type ) {
+                case kptFile :
+                        RCt = XFSFileNodeMake (
+                                            & TheNode,
+                                            XFSPathGet ( xPath ),
+                                            XFSPathName ( xPath ),
+                                            NULL
+                                            );
+                        break;
+                case kptDir :
+                        _CacheDirNodeMake (
+                                ( struct _CacheDirNode **  ) & TheNode,
+                                XFSPathGet ( xPath ),
+                                XFSPathName ( xPath ),
+                                NULL
+                                );
+                        ( ( struct _CacheDirNode * ) TheNode ) -> project_id = ProjectId;
+                        break;
+                default :
+                        RCt = XFS_RC ( rcInvalid );
+                        break;
+            }
+            if ( RCt == 0 ) {
+                * Node = TheNode;
+            }
+
+            KDirectoryRelease ( NativeDir );
+        }
+
+        XFSPathRelease ( xPath );
+    }
+
+    return RCt;
+}   /* _CacheDirNodeForPath () */
+
+rc_t CC
+_CacheDirNodeFindNode_v1 (
+            const struct XFSNode * self,
+            const struct XFSPath * Path,
+            uint32_t PathIndex,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    struct _CacheDirNode * CacheNode;
+    bool IsLast;
+    const struct XFSPath * xPath;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    CacheNode = NULL;
+    IsLast = false;
+    xPath = NULL;
+
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                            self,
+                                            Path,
+                                            PathIndex,
+                                            Node,
+                                            & NodeName,
+                                            & PathCount,
+                                            & IsLast
+                                            );
+    if ( RCt == 0 ) {
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+
+            return RCt;
+        }
+
+        CacheNode = ( struct _CacheDirNode * ) self;
+        if ( CacheNode -> path == NULL ) {
+            return XFS_RC ( rcInvalid );
+        }
+
+            /*) Here we are trying to create new node
+             (*/
+        RCt = XFSPathFrom ( Path, PathIndex + 1, & xPath );
+        if ( RCt == 0 ) {
+            RCt = _CacheDirNodeForPath (
+                                        Node,
+                                        CacheNode -> path,
+                                        XFSPathGet ( xPath ),
+                                        CacheNode -> project_id
+                                        );
+            XFSPathRelease ( xPath );
+        }
+    }
+
+    return RCt;
+}   /* _CacheDirNodeFindNode () */
+
+/*)))
+ |||
+ +++  Unified DirEditor
+ |||
+(((*/
+static
+rc_t CC
+_CacheDir_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_CacheDir_dispose_v1 ( $(editor) )\n", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSDirEditor * ) self );
+    }
+
+    return 0;
+}   /* _KfsDir_dispose_v1 () */
+
+static
+bool CC
+_CacheDirListCallback (
+                    const struct KDirectory * self,
+                    const char * Name,
+                    void * Unused
+)
+{
+    if ( XFS_StrEndsWith ( Name, ".cache" ) ) {
+        return false;
+    }
+
+    if ( XFS_StrEndsWith ( Name, ".lock" ) ) {
+        return false;
+    }
+
+    if ( strcmp ( Name, "workspace" ) == 0 ) {
+        return false;
+    }
+
+    return true;
+}   /* _CacheDirListCallback () */
+
+static
+rc_t CC
+_CacheDir_list_v1 (
+                const struct XFSDirEditor * self,
+                const struct KNamelist ** List
+)
+{
+    KDirectory * NativeDir;
+    const struct _CacheDirNode * Node;
+    struct KNamelist * TempList;
+    rc_t RCt;
+
+    RCt = 0;
+    NativeDir = NULL;
+    Node = NULL;
+    TempList = NULL;
+
+    XFS_CSAN ( List )
+    XFS_CAN ( self )
+    XFS_CAN ( List )
+
+    Node = ( const struct _CacheDirNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CAN ( Node )
+    XFS_CAN ( Node -> path )
+
+    RCt = KDirectoryNativeDir ( & NativeDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryList (
+                            NativeDir,
+                            & TempList,
+                            _CacheDirListCallback,
+                            NULL, /* Filter Data */
+                            Node -> path
+                            );
+        if ( RCt == 0 ) {
+            * List = TempList;
+        }
+        else {
+            if ( TempList != NULL ) {
+                KNamelistRelease ( TempList );
+            }
+        }
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _CacheDir_list_v1 () */
+
+static
+rc_t CC
+_CacheDir_find_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name,
+                const struct XFSNode ** Node
+)
+{
+    const struct _CacheDirNode * CacheNode;
+    rc_t RCt;
+
+    RCt = 0;
+    CacheNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( self )
+    XFS_CAN ( Name )
+    XFS_CAN ( Node )
+
+    * Node = NULL;
+
+    CacheNode = ( const struct _CacheDirNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    XFS_CAN ( CacheNode )
+    XFS_CAN ( CacheNode -> path )
+
+    RCt = _CacheDirNodeForPath (
+                                Node,
+                                CacheNode -> path,
+                                Name,
+                                CacheNode -> project_id
+                                );
+
+    return RCt;
+}   /* _CacheDir_find_v1 () */
+
+static
+rc_t CC
+_CacheDir_delete_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name
+)
+{
+    rc_t RCt;
+    KDirectory * NativeDir;
+    struct _CacheDirNode * CacheNode;
+
+    RCt = 0;
+    NativeDir = NULL;
+    CacheNode = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Name )
+
+    CacheNode = ( struct _CacheDirNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CAN ( CacheNode )
+    XFS_CAN ( CacheNode -> path )
+
+    RCt = KDirectoryNativeDir ( & NativeDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryRemove (
+                                NativeDir,
+                                true,
+                                "%s/%s",
+                                CacheNode -> path,
+                                Name
+                                );
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _CacheDir_delete_v1 () */
+
+rc_t CC
+_CacheDirNodeDir_v1 (
+            const struct XFSNode * self,
+            const struct XFSDirEditor ** Dir
+)
+{
+    rc_t RCt;
+    struct XFSDirEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    XFS_CSAN ( Dir )
+    XFS_CAN ( self )
+    XFS_CAN ( Dir )
+
+    Editor = calloc ( 1, sizeof ( struct XFSDirEditor ) );
+    if ( Editor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _CacheDir_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> list = _CacheDir_list_v1;
+        Editor -> find = _CacheDir_find_v1;
+        Editor -> delete = _CacheDir_delete_v1;
+
+        * Dir = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _CacheDirNodeDir_v1 () */
+
+/*)))
+ |||
+ +++  Unified Attr
+ |||
+(((*/
+
+static
+rc_t CC
+_CacheAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_CacheAttr_dispose_v1 ( $(editor) )\n", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSAttrEditor * ) self );
+    }
+
+    return 0;
+}   /* _CacheAttr_dispose_v1 () */
+
+static
+rc_t CC
+_CacheAttr_permissions_v1 (
+                        const struct XFSAttrEditor * self,
+                        const char ** Permissions
+)
+{
+    const struct _CacheDirNode * Node;
+    rc_t RCt;
+
+    Node = NULL;
+    RCt = 0;
+
+    XFS_CSAN ( Permissions )
+    XFS_CAN ( self )
+    XFS_CAN ( Permissions )
+
+    Node = ( const struct _CacheDirNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CAN ( Node )
+    XFS_CAN ( Node -> path )
+
+    * Permissions = Node -> perm == NULL
+                                    ? XFSPermRWDefContChar ()
+                                    : Node -> perm
+                                    ;
+
+    return RCt;
+}   /* _CacheAttr_permissions_v1 () */
+
+static
+rc_t CC
+_CacheAttr_date_v1 (
+                        const struct XFSAttrEditor * self,
+                        KTime_t * Time
+)
+{
+    const struct _CacheDirNode * Node;
+    KDirectory * NativeDir;
+    KTime_t TempTime;
+    rc_t RCt;
+
+    Node = NULL;
+    NativeDir = NULL;
+    TempTime = 0;
+    RCt = 0;
+
+    XFS_CSA ( Time, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Time )
+
+    Node = ( const struct _CacheDirNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CAN ( Node )
+    XFS_CAN ( Node -> path )
+
+    RCt = KDirectoryNativeDir ( & NativeDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryDate ( NativeDir, & TempTime, Node -> path );
+        if ( RCt == 0 ) {
+            * Time = TempTime;
+        }
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _CacheAttr_date_v1 () */
+
+static
+rc_t CC
+_CacheAttr_type_v1 (
+                        const struct XFSAttrEditor * self,
+                        XFSNType * Type
+)
+{
+    const struct _CacheDirNode * Node;
+    rc_t RCt;
+
+    Node = NULL;
+    RCt = 0;
+
+    XFS_CSA ( Type, kxfsNotFound )
+    XFS_CAN ( self )
+    XFS_CAN ( Type )
+
+    Node = ( const struct _CacheDirNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CAN ( Node )
+    XFS_CAN ( Node -> path )
+
+    * Type = kxfsDir;
+
+    return RCt;
+}   /* _CacheAttr_type_v1 () */
+
+static
+rc_t CC
+_CacheDirNodeAttr_v1 (
+            const struct XFSNode * self,
+            const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    XFS_CSAN ( Attr )
+    XFS_CAN ( self )
+    XFS_CAN ( Attr )
+
+    Editor = calloc ( 1, sizeof ( struct XFSAttrEditor ) );
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                        & ( Editor -> Papahen ),
+                        self,
+                        _CacheAttr_dispose_v1
+                        );
+    if ( RCt == 0 ) {
+        Editor -> permissions = _CacheAttr_permissions_v1;
+        Editor -> date = _CacheAttr_date_v1;
+        Editor -> type = _CacheAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _CacheDirNodeAttr_v1 () */
+
+/*)))
+ |||
+ +++  Unified Discribe
+ |||
+(((*/
+
+rc_t CC
+_CacheDirNodeDescribe_v1 (
+            const struct XFSNode * self,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+    const char * Abbr;
+
+    RCt = 0;
+    NumWrit = 0;
+    Abbr = NULL;
+
+    XFS_CAN ( Buffer )
+    XFS_CA ( BufferSize, 0 )
+
+    Abbr = ( ( const struct _CacheDirNode * ) self ) -> project_id == 0
+                ? "CACHE PUB"
+                : "CACHE PRJ"
+                ;
+
+    if ( self == NULL ) {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[NULL][NULL]",
+                    Abbr
+                    );
+    }
+    else {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[%s][0x%p]",
+                    Abbr,
+                    self -> Name,
+                    self
+                    );
+    }
+
+    return RCt;
+}   /* _CacheDirNodeDescribe_v1 () */
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+static
+rc_t CC
+_CacheDirNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    const char * TempStr;
+    uint32_t ProjectId;
+
+    RCt = 0;
+    TheNode = NULL;
+    TempStr = NULL;
+    ProjectId = 0;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Model )
+    XFS_CAN ( Template )
+    XFS_CAN ( Node )
+
+
+    TempStr = XFSModelNodeProperty ( Template, XFS_MODEL_PROJECTID );
+    if ( TempStr == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+    ProjectId = atol ( TempStr );
+
+    RCt = XFSGapCacheNodeMake (
+                     & TheNode,
+                     ProjectId,
+                     XFSModelNodeSecurity ( Template )
+                     );
+    if ( RCt == 0 ) {
+        * Node = TheNode;
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( TheNode );
+        }
+    }
+
+    return RCt;
+}   /* _CacheDirNodeConstructor () */
+
+/*)))
+ |||
+ +++    Non-Teleport methods to create nodes
+ |||
+(((*/
+
+LIB_EXPORT
+rc_t CC
+XFSGapCacheNodeMake (
+            struct XFSNode ** Node,
+            uint32_t ProjectId,
+            const char * Perm
+)
+{
+    rc_t RCt;
+    struct _CacheDirNode * TheNode;
+    const char * Path;
+    const char * Name;
+
+    RCt = 0;
+    TheNode = NULL;
+    Path = NULL;
+    Name = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+
+    RCt = _GapCacheGetPath ( & Path, ProjectId );
+    if ( RCt == 0 ) {
+        Name = ProjectId == 0
+                    ? XFS_GAP_PUBLIC_CACHE_NAME
+                    : XFS_GAP_CACHE_NAME
+                    ;
+        RCt = _CacheDirNodeMake ( & TheNode, Path, Name, Perm );
+        if ( RCt == 0 ) {
+            TheNode -> project_id = ProjectId;
+
+            * Node = & ( TheNode -> node );
+        }
+
+        free ( ( char * ) Path );
+    }
+
+    if ( RCt != 0 ) {
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( & ( TheNode -> node ) );
+            TheNode = NULL;
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "XFSKfsNodeMake ND[$(node)] NM[$(name)] TP[$(project_id)]", "nnode=%p,name=%s,project_id=%d", ( void * ) TheNode, Name, ProjectId );
+*/
+
+    return RCt;
+}   /* XFSGapCacheNodeMake () */
+
+/*)))
+ |||
+ +++    DirNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_GapCacheNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = _CacheDirNodeConstructor ( Model, Template, Alias, Node );
+
+/*
+pLogMsg ( klogDebug, "_GapCacheNodeConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )\n", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _GapCacheNodeConstructor () */
+
+static
+rc_t CC
+_GapCacheNodeValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_GapCacheNodeValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )\n", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _GapCacheNodeValidator () */
+
+static const struct XFSTeleport _sGapCacheNodeTeleport = {
+                                            _GapCacheNodeConstructor,
+                                            _GapCacheNodeValidator,
+                                            false
+                                            };
+
+
+LIB_EXPORT
+rc_t CC
+XFSGapCacheProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sGapCacheNodeTeleport;
+
+    return 0;
+}   /* XFSGapCacheProvider () */
diff --git a/libs/xfs/gapf.c b/libs/xfs/gapf.c
new file mode 100644
index 0000000..8ec4d72
--- /dev/null
+++ b/libs/xfs/gapf.c
@@ -0,0 +1,879 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/handle.h>
+#include <xfs/perm.h>
+
+#include "xgapf.h"
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "teleport.h"
+#include "common.h"
+
+#include <sysalloc.h>
+
+#include <string.h>     /* memset */
+
+/*)))
+ |||
+ +++    _GapNode, and others
+ |||
+(((*/
+struct _GapNode {
+    struct XFSNode node;
+
+    uint32_t project_id;
+
+    const char * accession;
+    uint32_t object_id;
+};
+
+struct _GapFileEditor {
+    struct XFSFileEditor Papahen;
+
+    const struct KFile * file;
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*                                                               *_*/
+/*_* _GapNode is living here                                       *_*/
+/*_*                                                               *_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ |||
+ +++    _GapNode virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _GapNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _GapNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _GapNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _GapNodeFile_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSFileEditor ** File
+                                );
+static rc_t CC _GapNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _GapNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sGapNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _GapNodeFlavor_v1,
+                                        _GapNodeDispose_v1,
+                                        _GapNodeFindNode_v1,
+                                        NULL,   /* No DIR */
+                                        _GapNodeFile_v1,
+                                        _GapNodeAttr_v1,
+                                        _GapNodeDescribe_v1
+                                        };
+
+
+LIB_EXPORT
+rc_t CC
+XFSGapFileNodeMake (
+    struct XFSNode ** Node,
+    const char * Name,
+    uint32_t ProjectId,
+    const char * Accession,
+    uint32_t ObjectId
+)
+{
+    rc_t RCt;
+    struct _GapNode * xNode;
+
+    RCt = 0;
+    xNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+
+    if ( Name == NULL ) {
+        if ( Accession != NULL ) {
+            Name = Accession;
+        }
+    }
+
+    if ( Accession == NULL && ObjectId == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    xNode = calloc ( 1, sizeof ( struct _GapNode ) );
+    if ( xNode == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSNodeInitVT (
+                    & ( xNode -> node ),
+                    Name,
+                    ( const union XFSNode_vt * ) & _sGapNodeVT_v1
+                    );
+    if ( RCt == 0 ) {
+        xNode -> project_id = ProjectId;
+
+        if ( Accession != NULL ) {
+            RCt = XFS_StrDup ( Accession, & ( xNode -> accession ) );
+            xNode -> object_id = 0;
+        }
+        else {
+            xNode -> accession = NULL;
+            xNode -> object_id = ObjectId;
+        }
+
+        if ( RCt == 0 ) {
+            * Node = & ( xNode -> node );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( xNode != NULL ) {
+            RCt = XFSNodeDispose ( & ( xNode -> node ) );
+        }
+    }
+
+    return RCt;
+}   /* XFSGapFileNodeMake () */
+
+uint32_t CC
+_GapNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    return _sFlavorOfGapFile;
+}   /* _GapNodeFlavor_v1 () */
+
+static
+rc_t CC
+XFSGapNodeDispose ( const struct _GapNode * self )
+{
+    struct _GapNode * Node = ( struct _GapNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "XFSGapNodeDispose ( $(node) ) TP[$(project_id)]", "node=%p,project_id=%d", ( void * ) Node, ( Node == NULL ? 0 : Node -> project_id ) );
+*/
+
+    if ( Node == 0 ) {
+        return 0;
+    }
+
+    if ( Node -> accession != NULL ) {
+        free ( ( char * ) Node -> accession );
+
+        Node -> accession = NULL;
+    }
+
+    Node -> project_id = 0;
+    Node -> object_id = 0;
+
+    free ( Node );
+
+    return 0;
+}   /* XFSGapNodeDispose () */
+
+rc_t CC
+_GapNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return XFSGapNodeDispose ( ( const struct _GapNode * ) self );
+}   /* _GapNodeDispose_v1 () */
+
+/*)))
+ |||
+ +++  There are no find methods for encrypted files, cuz FILE
+ |||
+(((*/
+rc_t CC
+_GapNodeFindNode_v1 (
+                    const struct XFSNode * self,
+                    const struct XFSPath * Path,
+                    uint32_t PathIndex,
+                    const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    bool IsLast;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    IsLast = false;
+
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                        self,
+                                        Path,
+                                        PathIndex,
+                                        Node,
+                                        & NodeName,
+                                        & PathCount,
+                                        & IsLast
+                                        );
+    if ( RCt == 0 ) {
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+        }
+    }
+
+    return RCt;
+}   /* _GapNodeFindNode () */
+
+/*)))
+ |||
+ +++  No Dir editor 
+ |||
+(((*/
+
+/*)))
+ |||
+ +++  Unified FileEditor
+ |||
+(((*/
+
+static
+rc_t CC
+_GapFile_dispose_v1 ( const struct XFSEditor * self )
+{
+    struct _GapFileEditor * Editor = ( struct _GapFileEditor * ) self;
+/*
+pLogMsg ( klogDebug, "_GapFile_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( Editor != NULL ) {
+        if ( Editor -> file != NULL ) {
+            KFileRelease ( Editor -> file );
+
+            Editor -> file = NULL;
+        }
+
+        free ( Editor );
+    }
+
+    return 0;
+}   /* _GapFile_dispose_v1 () */
+
+static
+rc_t CC
+_GapFile_open_v1 (
+                    const struct XFSFileEditor * self,
+                    XFSNMode Mode
+)
+{
+    rc_t RCt;
+    const struct _GapNode * Node;
+    struct _GapFileEditor * Editor;
+    const struct KFile * File;
+
+    RCt = 0;
+    Node = NULL;
+    Editor = NULL;
+    File = NULL;
+
+    if ( Mode != kxfsRead ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    XFS_CAN ( self )
+
+    Node = ( const struct _GapNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CA ( Node, NULL )
+    if ( Node -> accession == NULL && Node -> object_id == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Editor = ( struct _GapFileEditor * ) self;
+    if ( Editor -> file == NULL ) {
+        if ( Node -> accession != NULL ) {
+            RCt = XFSGapFilesOpenAccession (
+                                        & File,
+                                        Node -> project_id,
+                                        Node -> accession
+                                        );
+        }
+        else {
+            RCt = XFSGapFilesOpenObjectId (
+                                        & File,
+                                        Node -> project_id,
+                                        Node -> object_id
+                                        );
+        }
+
+        if ( RCt == 0 ) {
+            Editor -> file = File;
+        }
+    }
+
+    return RCt;
+}   /* _GapFile_open_v1 () */
+
+static
+rc_t CC
+_GapFile_close_v1 ( const struct XFSFileEditor * self )
+{
+    rc_t RCt;
+    struct _GapFileEditor * Editor;
+
+    RCt = 0;
+    Editor = ( struct _GapFileEditor * ) self;
+
+    XFS_CAN ( Editor )
+
+    if ( Editor -> file != NULL ) {
+        RCt = KFileRelease ( Editor -> file );
+        Editor -> file = NULL;
+    }
+
+    return RCt;
+}   /* _GapFile_close_v1 () */
+
+static
+rc_t CC
+_GapFile_read_v1 (
+                    const struct XFSFileEditor * self,
+                    uint64_t Offset,
+                    void * Buffer,
+                    size_t SizeToRead,
+                    size_t * NumReaded
+)
+{
+    rc_t RCt;
+    struct _GapFileEditor * Editor;
+
+    RCt = 0;
+    Editor = ( struct _GapFileEditor * ) self;
+
+    XFS_CAN ( Editor )
+    XFS_CA ( Editor -> file, NULL )
+
+
+    RCt = KFileRead (
+                    Editor -> file,
+                    Offset,
+                    Buffer,
+                    SizeToRead,
+                    NumReaded
+                    );
+
+    return RCt;
+}   /* _GapFile_read_v1 () */
+
+static
+rc_t CC
+_GapFile_size_v1 (
+                const struct XFSFileEditor * self,
+                uint64_t * Size
+)
+{
+    rc_t RCt;
+    struct _GapNode * Node;
+
+    RCt = 0;
+    Node = NULL;
+
+    XFS_CSA ( Size, 0 )
+    XFS_CAN ( Size )
+    XFS_CAN ( self )
+
+    Node = ( struct _GapNode * ) XFSEditorNode ( & ( self -> Papahen ) );
+
+    XFS_CAN ( Node )
+
+    if ( Node -> accession == NULL && Node -> object_id == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> accession != NULL ) {
+        RCt = XFSGapFilesAccessionSize (
+                                        Size,
+                                        Node -> project_id,
+                                        Node -> accession
+                                        );
+    }
+    else {
+        RCt = XFSGapFilesObjectIdSize (
+                                        Size,
+                                        Node -> project_id,
+                                        Node -> object_id
+                                        );
+    }
+
+    if ( RCt != 0 ) {
+        * Size = 0;
+    }
+
+    return RCt;
+}   /* _GapFile_size_v1 () */
+
+rc_t CC
+_GapNodeFile_v1 (
+            const struct XFSNode * self,
+            const struct XFSFileEditor ** File
+)
+{
+    rc_t RCt;
+    struct _GapFileEditor * FileEditor;
+    struct XFSFileEditor * Editor;
+
+    RCt = 0;
+    FileEditor = NULL;
+    Editor = NULL;
+
+    XFS_CSAN ( File )
+
+    XFS_CAN ( self )
+    XFS_CAN ( File )
+
+    FileEditor = calloc ( 1, sizeof ( struct _GapFileEditor ) );
+    if ( FileEditor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    Editor = & ( FileEditor -> Papahen );
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _GapFile_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> open = _GapFile_open_v1;
+        Editor -> close = _GapFile_close_v1;
+        Editor -> read = _GapFile_read_v1;
+        Editor -> size = _GapFile_size_v1;
+
+        * File = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _GapNodeFile_v1 () */
+
+/*)))
+ |||
+ +++  Unified Attr
+ |||
+(((*/
+
+static
+rc_t CC
+_GapAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+pLogMsg ( klogDebug, "_GapAttr_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSEditor * ) self );
+    }
+
+    return 0;
+}   /* _GapAttr_dispose_v1 () */
+
+static
+rc_t CC
+_GapAttr_permissions_v1 (
+                        const struct XFSAttrEditor * self,
+                        const char ** Permissions
+)
+{
+    const struct _GapNode * Node;
+
+    Node = ( struct _GapNode * ) XFSEditorNode ( & ( self -> Papahen ) );
+
+    XFS_CSAN ( Permissions )
+    XFS_CAN ( Permissions )
+    XFS_CAN ( Node )
+
+    if ( Node -> accession == NULL && Node -> object_id == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Permissions = XFSPermRODefNodeChar ();
+
+    return 0;
+}   /* _GapAttr_permissions_v1 () */
+
+
+static
+rc_t CC
+_GapAttr_date_v1 ( const struct XFSAttrEditor * self, KTime_t * Time )
+{
+    rc_t RCt;
+    const struct _GapNode * Node;
+
+    RCt = 0;
+    Node = ( struct _GapNode * ) XFSEditorNode ( & ( self -> Papahen ) );
+
+    XFS_CSA ( Time, 0 )
+    XFS_CAN ( Time )
+    XFS_CAN ( Node )
+
+    if ( Node -> accession == NULL && Node -> object_id == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> accession != NULL ) {
+        RCt = XFSGapFilesAccessionDate (
+                                        Time, 
+                                        Node -> project_id,
+                                        Node -> accession
+                                        );
+    }
+    else {
+        RCt = XFSGapFilesObjectIdDate (
+                                        Time, 
+                                        Node -> project_id,
+                                        Node -> object_id
+                                        );
+    }
+
+    if ( RCt != 0 ) {
+        * Time = 0;
+    }
+
+    return RCt;
+}   /* _GapAttr_date_v1 () */
+
+static
+rc_t CC
+_GapAttr_type_v1 (
+                        const struct XFSAttrEditor * self,
+                        XFSNType * Type
+)
+{
+    const struct _GapNode * Node;
+
+    Node = ( struct _GapNode * ) XFSEditorNode ( & ( self -> Papahen ) );
+
+    XFS_CSA ( Type, kxfsNotFound )
+    XFS_CAN ( Type )
+    XFS_CAN ( Node )
+
+    if ( Node -> accession == NULL && Node -> object_id == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Type = kxfsFile ;
+
+    return 0;
+}   /* _GapAttr_type_v1 () */
+
+static
+rc_t CC
+_GapNodeAttr_v1 (
+            const struct XFSNode * self,
+            const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    XFS_CSAN ( Attr )
+
+    XFS_CAN ( self )
+    XFS_CAN ( Attr )
+
+    Editor = calloc ( 1, sizeof ( struct XFSAttrEditor ) );
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _GapAttr_dispose_v1
+                    );
+    if ( RCt == 0 ) {
+        Editor -> permissions = _GapAttr_permissions_v1;
+        Editor -> date = _GapAttr_date_v1;
+        Editor -> type = _GapAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _GapNodeAttr_v1 () */
+
+/*)))
+ |||
+ +++  Unified Discribe
+ |||
+(((*/
+
+rc_t CC
+_GapNodeDescribe_v1 (
+            const struct XFSNode * self,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+    const char * Abbr;
+
+    RCt = 0;
+    NumWrit = 0;
+    Abbr = NULL;
+
+    XFS_CAN ( Buffer )
+    XFS_CA ( BufferSize, 0 )
+
+    Abbr = "GAP FILE";
+
+    if ( self == NULL ) {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[NULL][NULL]",
+                    Abbr
+                    );
+    }
+    else {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[%s][0x%p]",
+                    Abbr,
+                    self -> Name,
+                    self
+                    );
+    }
+
+    return RCt;
+}   /* _GapNodeDescribe_v1 () */
+
+/*)))
+ |||
+ +++    FileNode lives here
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+/*)))
+ |||
+ +++    Non-Teleport methods to create nodes
+ |||
+(((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* ALL BELOW TODO!!!                                               */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*)))
+ |||
+ +++    EncNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_GapFileNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    const char * NodeName;
+    uint32_t ProjectId;
+    uint32_t ObjectId;
+    const char * Accession;
+    const char * Var;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+    ProjectId = 0;
+    ObjectId = 0;
+    Accession = NULL;
+    Var = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Model == NULL || Template == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    Var = XFSModelNodeProperty ( Template, XFS_MODEL_PROJECTID );
+    if ( Var == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    ProjectId = atol ( Var );
+
+    Accession = XFSModelNodeProperty ( Template, XFS_MODEL_ACCESSION );
+
+    Var = XFSModelNodeProperty ( Template, XFS_MODEL_OBJECTID );
+    if ( Var != NULL ) {
+        ObjectId = atol ( Var );
+    }
+
+    if ( Accession == NULL && ObjectId == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSGapFileNodeMake (
+                            & TheNode,
+                            NodeName,
+                            ProjectId,
+                            Accession,
+                            ObjectId
+                            );
+    if ( RCt == 0 ) {
+        * Node = ( struct XFSNode * ) TheNode;
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSGapNodeDispose ( ( const struct _GapNode * ) TheNode );
+        }
+    }
+
+    return RCt;
+}   /* _GapFileNodeConstructor () */
+
+/*)))
+ |||
+ +++    EncNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_GapFileConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = _GapFileNodeConstructor (
+                                        Model,
+                                        Template,
+                                        Alias,
+                                        Node
+                                        );
+
+/*
+pLogMsg ( klogDebug, "_GapFileConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _GapFileConstructor () */
+
+static
+rc_t CC
+_GapFileValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_GapFileValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _GapFileValidator () */
+
+static const struct XFSTeleport _sGapFileTeleport = {
+                                        _GapFileConstructor,
+                                        _GapFileValidator,
+                                        false
+                                        };
+
+
+LIB_EXPORT
+rc_t CC
+XFSGapFileProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sGapFileTeleport;
+
+    return 0;
+}   /* XFSGapFileProvider () */
diff --git a/libs/xfs/gapk.c b/libs/xfs/gapk.c
new file mode 100644
index 0000000..526196e
--- /dev/null
+++ b/libs/xfs/gapk.c
@@ -0,0 +1,440 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfg/kart.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/perm.h>
+#include <xfs/doc.h>
+
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "ncon.h"
+#include "teleport.h"
+#include "common.h"
+#include "contnode.h"
+#include "xgap.h"
+#include "xgapk.h"
+
+#include <sysalloc.h>
+
+#include <string.h>     /* memset */
+
+/*)))
+ |||    That is first draft approach for reading Kart files.
+ |||    Represents KartNode container with KartItemNodes.
+(((*/
+
+/*)))
+ |||
+ +++    KartNode and KartItemNode
+ |||
+(((*/
+
+struct XFSKartNode {
+    struct XFSContNode node;
+
+    uint32_t project_id;
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*                                                               *_*/
+/*_* KartNode lives here                                           *_*/
+/*_*                                                               *_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static
+rc_t CC
+_AddKartItem (
+            struct XFSKartNode * Node,
+            const struct XFSGapKart * Kart,
+            const char * ItemName
+)
+{
+    rc_t RCt;
+    struct XFSNode * ItemNode;
+    const struct XFSGapKartItem * KartItem;
+
+    RCt = 0;
+    ItemNode = NULL;
+    KartItem = NULL;
+
+    XFS_CAN ( Node )
+    XFS_CAN ( Kart )
+    XFS_CAN ( ItemName )
+
+    KartItem = XFSGapKartGet ( Kart, ItemName );
+    if ( KartItem == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSGapFileNodeMake ( 
+                            & ItemNode,
+                            ItemName,
+                            XFSGapKartItemProjectId ( KartItem ),
+                            XFSGapKartItemAccession ( KartItem ),
+                            XFSGapKartItemObjectId ( KartItem )
+                            );
+
+    if ( RCt == 0 ) {
+        RCt = XFSContNodeAddChild (
+                                & ( Node -> node . node ),
+                                ItemNode
+                                );
+        if ( GetRCState ( RCt ) == rcExists ) {
+            RCt = 0;
+        }
+        /* We do not dispose node here, but on the caller level */
+    }
+
+    if ( RCt != 0 ) {
+        if ( ItemNode != NULL ) { 
+            XFSNodeDispose ( ItemNode );
+            ItemNode = NULL;
+        }
+    }
+
+    return RCt;
+}   /* _AddKartItem () */
+
+static
+rc_t CC
+_AddSignatureFile ( struct XFSKartNode * Node )
+{
+    rc_t RCt;
+    struct XFSDoc * Doc;
+    struct XFSNode * Sign;
+
+    RCt = 0;
+    Doc = NULL;
+    Sign = NULL;
+
+    XFS_CAN ( Node )
+
+    RCt = XFSTextDocMake ( & Doc );
+    if ( RCt == 0 ) {
+        RCt = XFSTextDocAppend ( Doc,
+                                "%d\n",
+                                Node -> project_id
+                                );
+        if ( RCt == 0 ) {
+            RCt = XFSDocNodeMakeWithFlavor (
+                                        & Sign,
+                                        Doc,
+                                        ".#dbgap-mount-tool#",
+                                        XFSPermRODefNodeChar (),
+                                        _sFlavorOfFoo
+                                        );
+            if ( RCt == 0 ) {
+                RCt = XFSContNodeAddChild (
+                                        & ( Node -> node . node ),
+                                        Sign
+                                        );
+            }
+        }
+
+        XFSDocRelease ( Doc );
+    }
+
+    if ( RCt != 0 ) {
+        if ( Sign != NULL ) { 
+            XFSNodeDispose ( Sign );
+            Sign = NULL;
+        }
+    }
+
+    return RCt;
+}   /* _AddSignatureFile () */
+
+static 
+rc_t CC
+_LoadKart ( struct XFSKartNode * Node )
+{
+    rc_t RCt;
+    const struct XFSGapKart * Kart;
+    struct KNamelist * List;
+    uint32_t ListQ, ListI;
+    const char * ListN;
+
+    RCt = 0;
+    Kart = NULL;
+    List = NULL;
+    ListQ = ListI = 0;
+    ListN = NULL;
+
+    XFS_CAN ( Node )
+
+    RCt = _AddSignatureFile ( Node );
+    if ( RCt == 0 ) {
+        RCt = XFSGapKartDepotGet (
+                            & Kart,
+                            XFSNodeName ( & ( Node -> node . node ) )
+                            );
+        if ( RCt == 0 ) {
+
+            RCt = XFSGapKartList ( Kart, & List, Node -> project_id );
+            if ( RCt == 0 ) {
+                RCt = KNamelistCount ( List, & ListQ );
+                if ( RCt == 0 ) {
+                    for ( ListI = 0; ListI < ListQ; ListI ++ ) {
+                        RCt = KNamelistGet ( List, ListI, & ListN );
+                        if ( RCt != 0 ) {
+                            break;
+                        }
+                        RCt = _AddKartItem ( Node, Kart, ListN );
+                        if ( RCt != 0 ) {
+                            break;
+                        }
+                    }
+                }
+
+                KNamelistRelease ( List );
+            }
+
+            XFSGapKartRelease ( Kart );
+        }
+    }
+
+    return RCt;
+}   /* _LoadKart () */
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+static
+rc_t CC
+_KartNodeDispose ( struct XFSContNode * self )
+{
+    struct XFSKartNode * Node = ( struct XFSKartNode * ) self;
+
+    if ( Node != NULL ) {
+        Node -> project_id = 0;
+
+        free ( Node );
+    }
+
+    return 0;
+}   /* _KartNodeDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartNodeMake (
+            struct XFSNode ** Node,
+            const char * Name,
+            uint32_t ProjectId,
+            const char * Perm
+)
+{
+    rc_t RCt;
+    struct XFSKartNode * KartNode;
+
+    RCt = 0;
+    KartNode = NULL;
+
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+    XFS_CAN ( Name )
+
+    KartNode = calloc ( 1, sizeof ( struct XFSKartNode ) );
+    if ( KartNode == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = XFSContNodeInit (
+                            & ( KartNode -> node . node ),
+                            Name,
+                            Perm,
+                            _sFlavorOfGapKart,
+                            _KartNodeDispose
+                            );
+        if ( RCt == 0 ) {
+            KartNode -> project_id = ProjectId;
+
+            RCt = _LoadKart ( KartNode );
+            if ( RCt == 0 ) {
+                * Node = ( struct XFSNode * ) KartNode;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( KartNode != NULL ) {
+            XFSNodeDispose ( & ( KartNode -> node . node ) );
+            KartNode = NULL;
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "XFSGapKartNodeMake ND[$(node)] NM[$(name)] TP[$(project_id)]", "node=%p,name=%s,project_id=%d", ( void * ) Node, Name, ProjectId );
+*/
+
+    return RCt;
+}   /* XFSGapKartNodeMake () */
+
+static
+rc_t CC
+_KartNodeConstructorEx (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            XFSNType Type,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    const char * NodeName;
+    uint32_t ProjectId;
+    const char * Var;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+    ProjectId = 0;
+    Var = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Model )
+    XFS_CAN ( Template )
+    XFS_CAN ( Node )
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    Var = XFSModelNodeProperty ( Template, XFS_MODEL_PROJECTID );
+    if ( Var == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+    ProjectId = atol ( Var );
+
+    RCt = XFSGapKartNodeMake (
+                    & TheNode,
+                    NodeName,
+                    ProjectId,
+                    XFSModelNodeSecurity ( Template )
+                    );
+    if ( RCt == 0 ) {
+        * Node = TheNode;
+    }
+    else {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( TheNode );
+        }
+    }
+
+    return RCt;
+}   /* _KartNodeConstructorEx () */
+
+/*)))
+ |||
+ +++    FileNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_KartNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = _KartNodeConstructorEx (
+                            Model,
+                            Template,
+                            Alias,
+                            kxfsFile,
+                            Node
+                            );
+
+/*
+pLogMsg ( klogDebug, "_KartNodeConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _KartNodeConstructor () */
+
+static
+rc_t CC
+_KartNodeValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_KartNodeValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _KartNodeValidator () */
+
+static const struct XFSTeleport _sKartNodeTeleport = {
+                                        _KartNodeConstructor,
+                                        _KartNodeValidator,
+                                        false
+                                        };
+
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sKartNodeTeleport;
+
+    return 0;
+}   /* XFSGapKartProvider () */
diff --git a/libs/xfs/gapka.c b/libs/xfs/gapka.c
new file mode 100644
index 0000000..aec78eb
--- /dev/null
+++ b/libs/xfs/gapka.c
@@ -0,0 +1,1005 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/handle.h>
+#include <xfs/perm.h>
+
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "teleport.h"
+#include "common.h"
+#include "xgapk.h"
+
+#include <sysalloc.h>
+
+/*)))
+ |||    That file contains _GapKartFilesNode, which is really Kfs
+ |||    type node without ability to create subdirectories and with
+ |||    callback to changeing version ( datestamp )
+(((*/
+
+#define XFS_GAP_KART_FILES_NAME "kart-files"
+
+/*)))
+ |||
+ +++    FileNode, and other simple containers
+ |||
+(((*/
+
+struct _KartFilesNode {
+    struct XFSNode node;
+
+    const char * path;   /* Path for object */
+    uint64_t version;
+
+    const char * perm;   /* Permissions in format "rwxrwxrwx u:g:o" */
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*                                                               *_*/
+/*_* _GapKartFilesNode is living here                              *_*/
+/*_*                                                               *_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ |||
+ +++    _GapKartFilesNode virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _KartFilesNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _KartFilesNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _KartFilesNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _KartFilesNodeDir_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSDirEditor ** Dir
+                                );
+static rc_t CC _KartFilesNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _KartFilesNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sKartFilesNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _KartFilesNodeFlavor_v1,
+                                        _KartFilesNodeDispose_v1,
+                                        _KartFilesNodeFindNode_v1,
+                                        _KartFilesNodeDir_v1,
+                                        NULL,   /* NO FILE */
+                                        _KartFilesNodeAttr_v1,
+                                        _KartFilesNodeDescribe_v1
+                                        };
+
+static
+rc_t CC
+_KartFilesNodeMake (
+            struct _KartFilesNode ** Node,
+            const char * Name
+)
+{
+    rc_t RCt;
+    struct _KartFilesNode * TheNode;
+
+    RCt = 0;
+    TheNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+    XFS_CAN ( Name )
+
+    TheNode = calloc ( 1, sizeof ( struct _KartFilesNode ) );
+    if ( TheNode == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = XFSNodeInitVT (
+                & ( TheNode -> node),
+                Name,
+                ( const union XFSNode_vt * ) & _sKartFilesNodeVT_v1
+                );
+        if ( RCt == 0 ) {
+
+                /* This is duplicate, but necessary one
+                 */
+            TheNode -> node . vt = 
+                    ( const union XFSNode_vt * ) & _sKartFilesNodeVT_v1
+                    ;
+            * Node = TheNode;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( & ( TheNode -> node ) );
+            TheNode = NULL;
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "_KartFilesNodeMake ND[$(node)] NM[$(name)]", "node=%p,name=%s", ( void * ) TheNode, Name );
+*/
+
+    return RCt;
+}   /* _KartFilesNodeMake () */
+
+static
+rc_t CC
+_KartFilesNodeMakeEx (
+            struct _KartFilesNode ** Node,
+            const char * Path,
+            const char * Perm
+)
+{
+    struct _KartFilesNode * TempNode;
+    rc_t RCt;
+
+    RCt = 0;
+    TempNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+    XFS_CAN ( Path )
+
+    RCt = _KartFilesNodeMake ( & TempNode, XFS_GAP_KART_FILES_NAME );
+    if ( RCt == 0 ) {
+        RCt = XFS_StrDup ( Path, & ( TempNode -> path ) );
+        if ( RCt == 0 ) {
+            if ( Perm != NULL ) {
+                RCt = XFS_StrDup ( Perm, & ( TempNode -> perm ) );
+            }
+            if ( RCt == 0 ) {
+                TempNode -> version = 0;
+                * Node = TempNode;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( TempNode != NULL ) {
+            XFSNodeDispose ( & ( TempNode -> node ) );
+            TempNode = NULL;
+        }
+    }
+
+    return RCt;
+}   /* _KartFilesNodeMakeEx () */
+
+uint32_t CC
+_KartFilesNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    return _sFlavorOfGapKartFiles;
+}   /* _KartFilesNodeFlavor_v1 () */
+
+static
+rc_t CC
+_KartFilesNodeDispose ( const struct _KartFilesNode * self )
+{
+    struct _KartFilesNode * Node = ( struct _KartFilesNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "_KartFilesNodeDispose ND[$(node)] NM[$(path)]", "node=%p,path=%s", ( void * ) Node, ( Node == NULL ? "" : Node -> path ) );
+*/
+
+    if ( Node != 0 ) {
+
+        if ( Node -> perm != NULL ) {
+            free ( ( char * ) Node -> perm );
+            Node -> perm = NULL;
+        }
+
+        if ( Node -> path != NULL ) {
+            free ( ( char * ) Node -> path );
+            Node -> path = NULL;
+        }
+
+        Node -> version = 0;
+
+        free ( Node );
+    }
+
+    return 0;
+}   /* _KartFilesNodeDispose () */
+
+rc_t CC
+_KartFilesNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return _KartFilesNodeDispose (
+                                ( const struct _KartFilesNode * ) self
+                                );
+}   /* _KartFilesNodeDispose_v1 () */
+
+/*)))
+ |||
+ +++  Finding node child
+ |||
+(((*/
+
+rc_t CC
+_KartFilesNodeFindNode_v1 (
+            const struct XFSNode * self,
+            const struct XFSPath * Path,
+            uint32_t PathIndex,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    struct _KartFilesNode * KartsNode;
+    struct XFSNode * XfsNode;
+    bool IsLast;
+    KDirectory * NativeDir;
+    const struct XFSPath * xPath, * yPath;
+    uint32_t PathType;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    KartsNode = NULL;
+    XfsNode = NULL;
+    IsLast = false;
+    NativeDir = NULL;
+    xPath = yPath = NULL;
+    PathType = kptNotFound;
+
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                            self,
+                                            Path,
+                                            PathIndex,
+                                            Node,
+                                            & NodeName,
+                                            & PathCount,
+                                            & IsLast
+                                            );
+    if ( RCt == 0 ) {
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+
+            return RCt;
+        }
+
+        KartsNode = ( struct _KartFilesNode * ) self;
+        if ( KartsNode -> path == NULL ) {
+            return XFS_RC ( rcInvalid );
+        }
+
+            /*) Here we are trying to create new node
+             (*/
+        RCt = XFSPathFrom (
+                        Path,
+                        PathIndex + 1,
+                        & xPath
+                        );
+        if ( RCt == 0 ) {
+            RCt = XFSPathMake (
+                            & yPath,
+                            true,
+                            "%s/%s",
+                            KartsNode -> path,
+                            XFSPathGet ( xPath )
+                            );
+
+            if ( RCt == 0 ) {
+                RCt = KDirectoryNativeDir ( & NativeDir );
+                if ( RCt == 0 ) {
+                    PathType = KDirectoryPathType (
+                                                NativeDir,
+                                                XFSPathGet ( yPath )
+                                                );
+                    RCt = PathType == kptFile ? 0 : XFS_RC ( rcInvalid );
+                    if ( RCt == 0 ) {
+                        RCt = XFSFileNodeMake (
+                                            & XfsNode,
+                                            XFSPathGet ( yPath ),
+                                            XFSPathName ( yPath ),
+                                            XFSPermRWDefNodeChar ()
+                                            );
+                        if ( RCt == 0 ) {
+                            * Node = XfsNode;
+                        }
+                    }
+
+                    KDirectoryRelease ( NativeDir );
+                }
+
+                XFSPathRelease ( yPath );
+            }
+
+            XFSPathRelease ( xPath );
+        }
+    }
+
+    return RCt;
+}   /* _KartFilesNodeFindNode_v1 () */
+
+/*)))
+ |||
+ +++  Unified DirEditor
+ |||
+(((*/
+static
+rc_t CC
+_KartFilesDir_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_KartFilesDir_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSDirEditor * ) self );
+    }
+
+    return 0;
+}   /* _KartFilesDir_dispose_v1 () */
+
+static
+rc_t CC
+_KartFilesDir_list_v1 (
+                        const struct XFSDirEditor * self,
+                        const struct KNamelist ** List
+)
+{
+    const struct _KartFilesNode * Node;
+    struct KNamelist * TempList;
+    rc_t RCt;
+
+    RCt = 0;
+    Node = NULL;
+    TempList = NULL;
+
+    XFS_CSAN ( List )
+    XFS_CAN ( self )
+    XFS_CAN ( List )
+
+    Node = ( const struct _KartFilesNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CAN ( Node )
+    XFS_CAN ( Node -> path )
+
+    RCt = XFSGapKartDepotRefresh ();
+    if ( RCt == 0 ) {
+        RCt = XFSGapKartDepotList ( & TempList, 0 );
+        if ( RCt == 0 ) {
+            * List = TempList;
+        }
+        else {
+                /* impossible situation, but ...
+                 */
+            if ( TempList != NULL ) {
+                KNamelistRelease ( TempList );
+            }
+        }
+    }
+
+    return RCt;
+}   /* _KartFilesDir_list_v1 () */
+
+rc_t CC
+_KartFilesDir_find_v1 (
+                        const struct XFSDirEditor * self,
+                        const char * Name,
+                        const struct XFSNode ** Node
+)
+{
+    const struct _KartFilesNode * KartNode;
+    struct XFSNode * TempNode;
+    const struct XFSGapKart * Kart;
+    rc_t RCt;
+
+    RCt = 0;
+    KartNode = NULL;
+    TempNode = NULL;
+    Kart = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( self )
+    XFS_CAN ( Name )
+    XFS_CAN ( Node )
+
+    KartNode = ( const struct _KartFilesNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CAN ( KartNode )
+    XFS_CAN ( KartNode -> path )
+
+    RCt = XFSGapKartDepotRefresh ();
+    if ( RCt == 0 ) {
+        RCt = XFSGapKartDepotGet ( & Kart, Name );
+        if ( RCt == 0 ) {
+            RCt = XFSFileNodeMake (
+                                & TempNode,
+                                XFSGapKartPath ( Kart ),
+                                Name,
+                                XFSPermRWDefNodeChar ()
+                                );
+            if ( RCt == 0 ) {
+                * Node = ( const struct XFSNode * ) TempNode;
+            }
+
+            XFSGapKartRelease ( Kart );
+        }
+    }
+
+    return RCt;
+}   /* _KartFilesDir_find_v1 () */
+
+static
+rc_t CC
+_KartFilesDir_create_file_v1 (
+                                const struct XFSDirEditor * self,
+                                const char * Name,
+                                XFSNMode Mode,
+                                const struct XFSHandle ** Handle
+)
+{
+    struct KDirectory * NativeDir;
+    struct KFile * File;
+    bool Update;
+    KCreateMode CreateMode;
+    struct _KartFilesNode * KartFilesNode;
+    struct XFSNode * TempNode;
+    const struct XFSHandle * TempHandle;
+    const struct XFSPath * Path;
+    rc_t RCt;
+
+    NativeDir = NULL;
+    File = NULL;
+    Update = false;
+    CreateMode = kcmCreate;
+    KartFilesNode = NULL;
+    TempNode = NULL;
+    TempHandle = NULL;
+    Path = NULL;
+    RCt = 0;
+
+    XFS_CSAN ( Handle )
+    XFS_CAN ( self )
+    XFS_CAN ( Name )
+    XFS_CAN ( Handle )
+
+    KartFilesNode = ( struct _KartFilesNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CAN ( KartFilesNode )
+    XFS_CAN ( KartFilesNode -> path )
+
+    Update = Mode == kxfsReadWrite;
+    CreateMode = kcmCreate;
+
+    RCt = XFSPathMake (
+                    & Path,
+                    false,
+                    "%s/%s",
+                    KartFilesNode -> path,
+                    Name
+                    );
+    if ( RCt == 0 ) {
+        /* Here we are */
+        RCt = KDirectoryNativeDir ( & NativeDir );
+        if ( RCt == 0 ) {
+            RCt = KDirectoryCreateFile (
+                                    NativeDir,
+                                    & File, 
+                                    Update,
+                                    XFSPermRWDefNodeNum (),
+                                    CreateMode,
+                                    XFSPathGet ( Path )
+                                    );
+            if ( RCt == 0 ) {
+                RCt = XFSFileNodeMake (
+                                    & TempNode,
+                                    XFSPathGet ( Path ),
+                                    Name,
+                                    XFSPermRWDefNodeChar ()
+                                    );
+                if ( RCt == 0 ) {
+                    RCt = XFSFileNodeMakeHandle (
+                                                & TempHandle,
+                                                TempNode,
+                                                File
+                                                );
+                    if ( RCt == 0 ) {
+                        * Handle = TempHandle;
+                    }
+                }
+            }
+
+            KDirectoryRelease ( NativeDir );
+        }
+
+        XFSPathRelease ( Path );
+    }
+
+    if ( RCt != 0 ) {
+        * Handle = NULL;
+
+        if ( TempHandle != NULL ) {
+            XFSHandleRelease ( TempHandle );
+        }
+
+        if ( File != NULL ) {
+            KFileRelease ( File );
+        }
+    }
+
+    return RCt;
+}   /* _KartFilesDir_create_file_v1 () */
+
+static
+rc_t CC
+_KartFilesDir_delete_v1 (
+                        const struct XFSDirEditor * self,
+                        const char * Name
+)
+{
+    rc_t RCt;
+    KDirectory * NativeDir;
+    struct _KartFilesNode * KartsNode;
+    const struct XFSPath * Path;
+
+    RCt = 0;
+    NativeDir = NULL;
+    KartsNode = NULL;
+    Path = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Name )
+
+    KartsNode = ( struct _KartFilesNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CAN ( KartsNode )
+    XFS_CAN ( KartsNode -> path )
+
+    RCt = XFSPathMake (
+                        & Path,
+                        false,
+                        "%s/%s",
+                        KartsNode -> path,
+                        Name
+                        );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryNativeDir ( & NativeDir );
+        if ( RCt == 0 ) {
+            RCt = KDirectoryRemove (
+                                    NativeDir,
+                                    true,
+                                    XFSPathGet ( Path )
+                                    );
+            KDirectoryRelease ( NativeDir );
+        }
+        XFSPathRelease ( Path );
+    }
+
+    return RCt;
+}   /* _KartFilesDir_delete_v1 () */
+
+rc_t CC
+_KartFilesNodeDir_v1 (
+                    const struct XFSNode * self,
+                    const struct XFSDirEditor ** Dir
+)
+{
+    rc_t RCt;
+    struct XFSDirEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    XFS_CSAN ( Dir )
+    XFS_CAN ( self )
+    XFS_CAN ( Dir )
+
+    Editor = calloc ( 1, sizeof ( struct XFSDirEditor ) );
+    if ( Editor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                        & ( Editor -> Papahen ),
+                        self,
+                        _KartFilesDir_dispose_v1
+                        );
+
+    if ( RCt == 0 ) {
+        Editor -> list = _KartFilesDir_list_v1;
+        Editor -> find = _KartFilesDir_find_v1;
+        Editor -> create_file = _KartFilesDir_create_file_v1;
+        Editor -> delete = _KartFilesDir_delete_v1;
+
+        * Dir = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _KartFilesNodeDir_v1 () */
+
+/*)))
+ |||
+ +++  Unified Attr
+ |||
+(((*/
+
+static
+rc_t CC
+_KartFilesAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_KartFilesAttr_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSAttrEditor * ) self );
+    }
+
+    return 0;
+}   /* _KartFilesAttr_dispose_v1 () */
+
+static
+rc_t CC
+_KartFilesAttr_permissions_v1 (
+                        const struct XFSAttrEditor * self,
+                        const char ** Permissions
+)
+{
+    const struct _KartFilesNode * Node = NULL;
+
+    XFS_CSAN ( Permissions )
+    XFS_CAN ( self )
+    XFS_CAN ( Permissions )
+
+    Node = ( const struct _KartFilesNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CAN ( Node )
+
+    * Permissions = Node -> perm;
+    if ( * Permissions == NULL ) {
+        * Permissions = XFSPermRWDefContChar ();
+    }
+
+    return 0;
+}   /* _KartFilesAttr_permissions_v1 () */
+
+static
+rc_t CC
+_KartFilesAttr_date_v1 ( const struct XFSAttrEditor * self, KTime_t * Time )
+{
+    const struct _KartFilesNode * Node;
+    KDirectory * NativeDir;
+    KTime_t TempTime;
+    rc_t RCt;
+
+    Node = NULL;
+    NativeDir = NULL;
+    TempTime = 0;
+    RCt = 0;
+
+    XFS_CSA ( Time, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Time )
+
+    Node = ( const struct _KartFilesNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    XFS_CAN ( Node )
+
+    RCt = KDirectoryNativeDir ( & NativeDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryDate ( NativeDir, & TempTime, Node -> path );
+        if ( RCt == 0 ) {
+            * Time = TempTime;
+        }
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _KartFilesAttr_date_v1 () */
+
+static
+rc_t CC
+_KartFilesAttr_type_v1 (
+                    const struct XFSAttrEditor * self,
+                    XFSNType * Type
+)
+{
+    XFS_CSA ( Type, kxfsNotFound )
+    XFS_CAN ( self )
+    XFS_CAN ( Type )
+
+    if ( XFSEditorNode ( & ( self -> Papahen ) ) == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Type = kxfsDir;
+
+    return 0;
+}   /* _KartFilesAttr_type_v1 () */
+
+static
+rc_t CC
+_KartFilesNodeAttr_v1 (
+                        const struct XFSNode * self,
+                        const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    XFS_CSAN ( Attr )
+    XFS_CAN ( self )
+    XFS_CAN ( Attr )
+
+    Editor = calloc ( 1, sizeof ( struct XFSAttrEditor ) );
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _KartFilesAttr_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> permissions = _KartFilesAttr_permissions_v1;
+        Editor -> date = _KartFilesAttr_date_v1;
+        Editor -> type = _KartFilesAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _KartFilesNodeAttr_v1 () */
+
+/*)))
+ |||
+ +++  Unified Discribe
+ |||
+(((*/
+
+rc_t CC
+_KartFilesNodeDescribe_v1 (
+            const struct XFSNode * self,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+    const char * Abbr;
+
+    RCt = 0;
+    NumWrit = 0;
+    Abbr = NULL;
+
+    XFS_CAN ( Buffer )
+    XFS_CA ( BufferSize, 0 )
+
+    * Buffer = 0;
+
+    Abbr = "KART-FILES";
+
+    if ( self == NULL ) {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[NULL][NULL]",
+                    Abbr
+                    );
+    }
+    else {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[%s][0x%p]",
+                    Abbr,
+                    self -> Name,
+                    self
+                    );
+    }
+
+    return RCt;
+}   /* _KartFilesNodeDescribe_v1 () */
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+/*)))
+ |||
+ +++    Non-Teleport methods to create nodes
+ |||
+(((*/
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartFilesNodeMake (
+            struct XFSNode ** Node,
+            const char * Perm
+)
+{
+    rc_t RCt;
+    struct _KartFilesNode * TheNode;
+
+    RCt = 0;
+    TheNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+
+    RCt = _KartFilesNodeMakeEx (
+                                & TheNode,
+                                XFSGapKartDepotPath (),
+                                Perm
+                                );
+    if ( RCt == 0 ) {
+        * Node = & ( TheNode -> node );
+    }
+
+    return RCt;
+}   /* XFSDirNodeMake () */
+
+/*)))
+ |||
+ +++    KartFilesNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_KartFilesNodeConstructor (
+                        const struct XFSModel * Model,
+                        const struct XFSModelNode * Template,
+                        const char * Alias,
+                        const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct _KartFilesNode * TheNode;
+    const char * NodePath;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodePath = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Model )
+    XFS_CAN ( Template )
+    XFS_CAN ( Node )
+
+    NodePath = XFSModelNodeProperty ( Template, XFS_MODEL_SOURCE );
+    if ( NodePath == NULL ) {
+        NodePath = XFSGapKartDepotPath ();
+    }
+
+    RCt = _KartFilesNodeMakeEx (
+                                & TheNode,
+                                NodePath,
+                                XFSModelNodeSecurity ( Template )
+                                );
+    if ( RCt == 0 ) {
+        * Node = ( struct XFSNode * ) TheNode;
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            _KartFilesNodeDispose ( TheNode );
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "_KartFilesNodeConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _KartFilesNodeConstructor () */
+
+static
+rc_t CC
+_KartFilesNodeValidator (
+                        const struct XFSModel * Model,
+                        const struct XFSModelNode * Template,
+                        const char * Alias,
+                        uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_KartFilesNodeValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _KartFilesNodeValidator () */
+
+
+static const struct XFSTeleport _sKartFilesNodeTeleport = {
+                                            _KartFilesNodeConstructor,
+                                            _KartFilesNodeValidator,
+                                            false
+                                            };
+
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartFilesProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sKartFilesNodeTeleport;
+
+    return 0;
+}   /* XFSGapKartFilesProvider () */
diff --git a/libs/xfs/gapks.c b/libs/xfs/gapks.c
new file mode 100644
index 0000000..2df0ec5
--- /dev/null
+++ b/libs/xfs/gapks.c
@@ -0,0 +1,882 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/perm.h>
+
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "ncon.h"
+#include "teleport.h"
+#include "common.h"
+#include "xgapk.h"
+
+#include <sysalloc.h>
+
+/*)))
+  |||
+  +++    That is second approach for reading Kart files.
+  +++    Represents KartNode container
+  |||
+  (((*/
+
+#define XFS_GAP_KART_NAME "karts"
+
+struct XFSGapKartsNode {
+    struct XFSNode node;
+
+    const struct XFSNodeContainer * container;
+
+    uint32_t project_id;
+
+    uint64_t version;
+};
+
+/*)))
+ |||
+ +++    Simple Container virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _GapKartsNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _GapKartsNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _GapKartsNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _GapKartsNodeDir_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSDirEditor ** Dir
+                                );
+static rc_t CC _GapKartsNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _GapKartsNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sGapKartsNodeVT_v1 = {
+                                            1, 1,   /* nin naj */
+                                            _GapKartsNodeFlavor_v1,
+                                            _GapKartsNodeDispose_v1,
+                                            _GapKartsNodeFindNode_v1,
+                                            _GapKartsNodeDir_v1,
+                                            NULL,
+                                            _GapKartsNodeAttr_v1,
+                                            _GapKartsNodeDescribe_v1
+                                            };
+
+static
+rc_t CC
+_GapKartsNodeDispose ( const struct XFSGapKartsNode * self )
+{
+    struct XFSGapKartsNode * Node = ( struct XFSGapKartsNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "_GapKartsNodeDispose ( $(node) )", "node=%p", ( void * ) Node );
+*/
+
+    if ( Node != 0 ) {
+        if ( Node -> container != NULL ) {
+            XFSNodeContainerRelease ( Node -> container );
+            Node -> container = NULL;
+        }
+
+        Node -> project_id = 0;
+        Node -> version = 0;
+
+        free ( Node );
+    }
+
+    return 0;
+}   /* _GapKartsNodeDispose () */
+
+/*)))
+ |||
+ +++    Here we are creating and disposing that node
+ |||
+(((*/
+
+uint32_t CC
+_GapKartsNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    return _sFlavorOfGapKarts;
+}   /* _GapKartsNodeFlavor_v1 () */
+
+rc_t CC
+_GapKartsNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return _GapKartsNodeDispose (
+                                ( const struct XFSGapKartsNode * ) self
+                                );
+}   /* _GapKartsNodeDispose_v1 () */
+
+/*)))
+ (((    First check itself and all others after.
+  )))
+ (((*/
+rc_t CC
+_GapKartsNodeFindNode_v1 (
+                    const struct XFSNode * self,
+                    const struct XFSPath * Path,
+                    uint32_t PathIndex,
+                    const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    bool IsLast;
+    const struct XFSNode * NextNode;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    IsLast = false;
+    NextNode = NULL;
+
+        /* Standard check-initialization */
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                            self,
+                                            Path,
+                                            PathIndex,
+                                            Node,
+                                            & NodeName,
+                                            & PathCount,
+                                            & IsLast
+                                            );
+    if ( RCt == 0 ) {
+
+            /* If node is last - that is */
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+
+            return RCt;
+        }
+
+            /*  Here we aren't last and looking forward; */
+        NodeName = XFSPathPartGet ( Path, PathIndex + 1 );
+
+            /*))  Should not happen thou
+             ((*/
+        if ( NodeName == NULL ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+
+            RCt = XFSNodeContainerGet (
+                    ( ( const struct XFSGapKartsNode * ) self )
+                                                        -> container,
+                    NodeName,
+                    & NextNode
+                    );
+            if ( RCt == 0 ) {
+
+                RCt = XFSNodeFindNode (
+                                    NextNode,
+                                    Path,
+                                    PathIndex + 1,
+                                    Node
+                                    );
+            }
+        }
+    }
+
+    return RCt;
+}   /* _GapKartsNodeFindNode_v1 () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))  So, Directory
+ (((*/
+
+static
+rc_t CC
+_GapKartsNodeDir_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+pLogMsg ( klogDebug, "_GapKartsNodeDir_dispose_ ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != 0 ) {
+        free ( ( struct XFSDirEditor * ) self );
+    }
+
+    return 0;
+}   /* _GapKartsNodeDir_dispose_v1 () */
+
+static
+rc_t CC
+_GapKartsNodeDir_find_v1 (
+                        const struct XFSDirEditor * self,
+                        const char * Name,
+                        const struct XFSNode ** Node
+)
+{
+    struct XFSGapKartsNode * Cont = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+    XFS_CAN ( Name )
+    XFS_CAN ( Node )
+
+    Cont = ( struct XFSGapKartsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Cont == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+    return XFSNodeContainerGet ( Cont -> container, Name, Node );
+}   /* _GapKartsNodeDir_find_v1 () */
+
+static rc_t CC _UpdateKarts ( struct XFSGapKartsNode * Node );
+
+static
+rc_t CC
+_GapKartsNodeDir_list_v1 (
+                        const struct XFSDirEditor * self,
+                        const struct KNamelist ** List
+)
+{
+    rc_t RCt;
+    struct XFSGapKartsNode * Cont;
+
+    RCt = 0;
+    Cont = NULL;
+
+    XFS_CSAN ( List )
+    XFS_CAN ( self )
+    XFS_CAN ( List )
+
+    Cont = ( struct XFSGapKartsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Cont == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = _UpdateKarts ( Cont );
+    if ( RCt == 0 ) {
+        RCt = XFSNodeContainerList ( Cont -> container, List );
+    }
+
+    return RCt;
+}   /* _GapKartsNodeDir_list_v1 () */
+
+rc_t CC
+_GapKartsNodeDir_v1 (
+                    const struct XFSNode * self,
+                    const struct XFSDirEditor ** Dir
+)
+{
+    rc_t RCt;
+    struct XFSDirEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    XFS_CSAN ( Dir )
+    XFS_CAN ( self )
+    XFS_CAN ( Dir )
+
+    Editor = calloc ( 1, sizeof ( struct XFSDirEditor ) );
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                        & ( Editor -> Papahen ),
+                        self,
+                        _GapKartsNodeDir_dispose_v1
+                        );
+    if ( RCt == 0 ) {
+        Editor -> list = _GapKartsNodeDir_list_v1;
+        Editor -> find = _GapKartsNodeDir_find_v1;
+
+        * Dir = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _GapKartsNodeDir_v1 () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))  So, Attributes
+ (((*/
+
+static
+rc_t CC
+_GapKartsNodeAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+pLogMsg ( klogDebug, "_GapKartsNodeAttr_dispose_ ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != 0 ) {
+        free ( ( struct XFSAttrEditor * ) self );
+    }
+
+    return 0;
+}   /* _GapKartsNodeAttr_dispose_v1 () */
+
+static
+rc_t CC
+_GapKartsNodeAttr_permissions_v1 (
+                            const struct XFSAttrEditor * self,
+                            const char ** Permissions
+                            )
+{
+    XFS_CSAN ( Permissions )
+    XFS_CAN ( self )
+    XFS_CAN ( Permissions )
+
+    XFS_CAN ( XFSEditorNode ( & ( self -> Papahen ) ) )
+
+    * Permissions = XFSPermRODefContChar ();
+
+    return 0;
+}   /* _GapKartsNodeAttr_permisiions_v1 () */
+
+static
+rc_t CC
+_GapKartsNodeAttr_date_v1 (
+                            const struct XFSAttrEditor * self,
+                            KTime_t * Time
+)
+{
+    XFS_CSA ( Time, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Time )
+    XFS_CAN ( XFSEditorNode ( & ( self -> Papahen ) ) );
+
+    XFSGapKartDepotRefresh ();
+
+    return 0;
+}   /* _GapKartsNodeAttr_date_v1 () */
+
+static
+rc_t CC
+_GapKartsNodeAttr_type_v1 (
+                            const struct XFSAttrEditor * self,
+                            XFSNType * Type
+)
+{
+    XFS_CSA ( Type, kxfsNotFound )
+    XFS_CAN ( self )
+    XFS_CAN ( Type )
+    XFS_CAN ( XFSEditorNode ( & ( self -> Papahen ) ) )
+
+    XFSGapKartDepotRefresh ();
+
+    * Type = kxfsDir;
+
+    return 0;
+}   /* _GapKartsNodeAttr_type_v1 () */
+
+rc_t CC
+_GapKartsNodeAttr_v1 (
+                    const struct XFSNode * self,
+                    const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    XFS_CSAN ( Attr )
+    XFS_CAN ( self )
+    XFS_CAN ( Attr )
+
+    Editor = calloc ( 1, sizeof ( struct XFSAttrEditor ) );
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                        & ( Editor -> Papahen ),
+                        self,
+                        _GapKartsNodeAttr_dispose_v1
+                        );
+    if ( RCt == 0 ) {
+        Editor -> permissions = _GapKartsNodeAttr_permissions_v1;
+        Editor -> date = _GapKartsNodeAttr_date_v1;
+        Editor -> type = _GapKartsNodeAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return 0;
+}   /* _GapKartsNodeAttr_v1 () */
+
+rc_t CC
+_GapKartsNodeDescribe_v1 (
+                        const struct XFSNode * self,
+                        char * Buffer,
+                        size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+
+    RCt = 0;
+    NumWrit = 0;
+
+    if ( Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+    * Buffer = 0;
+
+    if ( self == NULL ) {
+        RCt = string_printf (
+                        Buffer,
+                        BufferSize,
+                        & NumWrit,
+                        "NODE (KARTS)[NULL][NULL]"
+                        );
+    }
+    else {
+        RCt = string_printf (
+                        Buffer,
+                        BufferSize,
+                        & NumWrit,
+                        "NODE (KARTS)[%s][0x%p]",
+                        self -> Name,
+                        self
+                        );
+    }
+
+    return RCt;
+}   /* _GapKartsNodeDescribe_v1 () */
+
+/*)))
+ |||
+ +++    KartNode
+ |||
+(((*/
+
+static
+rc_t CC
+_LoadKart ( struct XFSGapKartsNode * Node, const char * KartName )
+{
+    rc_t RCt;
+    struct XFSNode * KartNode;
+
+    RCt = 0;
+    KartNode = NULL;
+
+    XFS_CAN ( Node )
+    XFS_CAN ( KartName )
+
+    RCt = XFSGapKartNodeMake (
+                            & KartNode,
+                            KartName,
+                            Node -> project_id,
+                            NULL
+                            );
+    if ( RCt == 0 ) {
+        RCt = XFSNodeContainerAdd ( Node -> container, KartNode );
+    }
+    else {
+            /*  Some Karts could be damaged 
+             |  we should think about it later
+             */
+        pLogMsg ( klogWarn, "Invalid Kart file [$(name)]", "name=%s", KartName );
+        RCt = 0;
+    }
+
+    return RCt;
+}   /* _LoadKart () */
+
+static 
+rc_t CC
+_LoadKarts ( struct XFSGapKartsNode * Node )
+{
+    rc_t RCt;
+    struct KNamelist * KartNames;
+    uint32_t qty, llp;
+    const char * Name;
+
+    RCt = 0;
+    KartNames = NULL;
+    qty = llp = 0;
+    Name = NULL;
+
+    XFS_CAN ( Node )
+
+    RCt = XFSGapKartDepotList ( & KartNames, Node -> project_id );
+    if ( RCt == 0 ) {
+        RCt = KNamelistCount ( KartNames, & qty );
+        if ( RCt == 0 ) {
+            for ( llp = 0; llp < qty; llp ++ ) {
+                RCt = KNamelistGet ( KartNames, llp, & Name );
+                if ( RCt == 0 ) {
+                    RCt = _LoadKart ( Node, Name );
+                }
+
+                RCt = 0;
+            }
+        }
+
+        KNamelistRelease ( KartNames );
+    }
+
+    if ( RCt != 0 ) {
+            /*  Sorry, we just were unable to load any Kart
+             */
+        RCt = 0;
+    }
+
+    return RCt;
+}   /* _LoadKarts () */
+
+rc_t CC
+_UpdateKarts ( struct XFSGapKartsNode * Node )
+{
+    rc_t RCt;
+    uint64_t Version;
+
+    RCt = 0;
+    Version = 0;
+
+    XFS_CAN ( Node );
+
+
+    RCt = XFSGapKartDepotRefresh ();
+    if ( RCt == 0 ) {
+        RCt = XFSGapKartDepotVersion ( & Version );
+        if ( RCt == 0 ) {
+            if ( Version != Node -> version ) {
+                RCt = XFSNodeContainerClear ( Node -> container );
+                if ( RCt == 0 ) {
+                    RCt = _LoadKarts ( Node );
+                    if ( RCt == 0 ) {
+                        Node -> version = Version;
+                    }
+                }
+            }
+        }
+    }
+
+    return RCt;
+}   /* _UpdateKarts () */
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+static
+rc_t CC
+_GapKartsNodeMake (
+                const char * Name,
+                uint32_t ProjectId,
+                const char * Perm,
+                struct XFSGapKartsNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSGapKartsNode * KartNode;
+
+    RCt = 0;
+    KartNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Name )
+    XFS_CAN ( Node )
+
+    KartNode = calloc ( 1, sizeof ( struct XFSGapKartsNode ) );
+    if ( KartNode == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = XFSNodeInitVT (
+                    & ( KartNode -> node ),
+                    Name,
+                    ( const union XFSNode_vt * ) & _sGapKartsNodeVT_v1
+                    );
+        if ( RCt == 0 ) {
+
+            RCt = XFSNodeContainerMake ( & ( KartNode -> container ) );
+            if ( RCt == 0 ) {
+                KartNode -> project_id = ProjectId;
+                KartNode -> version = 0;
+                if ( _UpdateKarts ( KartNode )  == 0 ) {
+
+                    * Node = KartNode;
+                }
+            }
+        }
+    }
+
+    return RCt;
+}   /* _GapKartsNodeMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartsNodeMake (
+            struct XFSNode ** Node,
+            uint32_t ProjectId,
+            const char * Perm
+)
+{
+    rc_t RCt;
+    struct XFSGapKartsNode * KartNode;
+
+    RCt = 0;
+    KartNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Node )
+
+    RCt = _GapKartsNodeMake (
+                            XFS_GAP_KART_NAME,
+                            ProjectId,
+                            Perm,
+                            & KartNode
+                            );
+    if ( RCt == 0 ) {
+        * Node = & ( KartNode -> node );
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( KartNode != NULL ) {
+            XFSNodeDispose ( & ( KartNode -> node ) );
+            KartNode = NULL;
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "XFSKartNodeMake ND[$(node)] NM[$(name)] PJ[$(project_id)]", "node=%p,name=%s,project_id=%d", ( void * ) Node, XFS_GAP_KART_NAME, ProjectId );
+*/
+
+    return RCt;
+}   /* XFSGapKartsNodeMake () */
+
+static
+rc_t CC
+_GapKartsNodeMakeFromModel (
+                    const char * Name,
+                    const struct XFSModel * Model,
+                    const struct XFSModelNode * Template,
+                    struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSGapKartsNode * KartNode;
+    const char * TempStr;
+    uint32_t ProjectId;
+
+    RCt = 0;
+    KartNode = NULL;
+    TempStr = NULL;
+    ProjectId = 0;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Name )
+    XFS_CAN ( Model )
+    XFS_CAN ( Template )
+    XFS_CAN ( Node )
+
+    TempStr = XFSModelNodeProperty ( Template, XFS_MODEL_PROJECTID );
+    if ( TempStr == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    ProjectId = atol ( TempStr );
+    if ( ProjectId == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = _GapKartsNodeMake (
+                            XFS_GAP_KART_NAME,
+                            ProjectId,
+                            XFSModelNodeSecurity ( Template ),
+                            & KartNode
+                            );
+    if ( RCt == 0 ) {
+        RCt = _LoadKarts ( KartNode );
+        if ( RCt == 0 ) {
+            * Node = & ( KartNode -> node );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( KartNode != NULL ) {
+            XFSNodeDispose ( & ( KartNode -> node ) );
+            KartNode = NULL;
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "KartNodeMakeFromModel ND[$(node)] NM[$(name)] TP[$(project_id)]", "node=%p,name=%s,project_id=%d", ( void * ) Node, Name, ProjectId );
+*/
+
+    return RCt;
+}   /* _GapKartsNodeMakeFromModel () */
+
+static
+rc_t CC
+_GapKartsNodeConstructorEx (
+                        const struct XFSModel * Model,
+                        const struct XFSModelNode * Template,
+                        const char * Alias,
+                        const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    const char * NodeName;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Model )
+    XFS_CAN ( Template )
+    XFS_CAN ( Node )
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    RCt = _GapKartsNodeMakeFromModel (
+                                    NodeName,
+                                    Model,
+                                    Template,
+                                    & TheNode
+                                    );
+
+    if ( RCt == 0 ) {
+        * Node = TheNode;
+    }
+    else {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( TheNode );
+        }
+    }
+
+    return RCt;
+}   /* _GapKartsNodeConstructorEx () */
+
+/*)))
+ |||
+ +++    FileNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_GapKartsNodeConstructor (
+                        const struct XFSModel * Model,
+                        const struct XFSModelNode * Template,
+                        const char * Alias,
+                        const struct XFSNode ** Node
+)
+{
+    rc_t RCt = _GapKartsNodeConstructorEx (
+                                            Model,
+                                            Template,
+                                            Alias,
+                                            Node
+                                            );
+
+/*
+pLogMsg ( klogDebug, "_GapKartsNodeConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+
+    return RCt;
+}   /* _GapKartsNodeConstructor () */
+
+static
+rc_t CC
+_GapKartsNodeValidator (
+                        const struct XFSModel * Model,
+                        const struct XFSModelNode * Template,
+                        const char * Alias,
+                        uint32_t Flags
+)
+{
+    rc_t RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_GapKartsNodeValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _GapKartsNodeValidator () */
+
+static const struct XFSTeleport _sGapKartsNodeTeleport = {
+                                            _GapKartsNodeConstructor,
+                                            _GapKartsNodeValidator,
+                                            false
+                                            };
+
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartsProvider ( const struct XFSTeleport ** Teleport )
+{
+    XFS_CSAN ( Teleport )
+    XFS_CAN ( Teleport )
+
+    * Teleport = & _sGapKartsNodeTeleport;
+
+    return 0;
+}   /* XFSGapKartsProvider () */
diff --git a/libs/xfs/handle.c b/libs/xfs/handle.c
new file mode 100644
index 0000000..fde9411
--- /dev/null
+++ b/libs/xfs/handle.c
@@ -0,0 +1,227 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/refcount.h>
+#include <klib/text.h>
+
+#include <kfs/file.h>
+#include <vfs/path.h>
+
+#include <xfs/handle.h>
+#include <xfs/node.h>
+
+#include <sysalloc.h>
+
+static const char * XFSHandle_classname = "XFSHandle";
+
+struct XFSHandle {
+    KRefcount refcount;
+
+    const struct XFSNode * Node;
+
+    void * Handle;
+};
+
+/*))
+ // Creating Handle from scratch, OMG!
+((*/
+LIB_EXPORT
+rc_t CC
+XFSHandleMake (
+                const struct XFSNode * Node,
+                const struct XFSHandle ** Handle
+)
+{
+    rc_t RCt;
+    struct XFSHandle * RetVal;
+
+    RCt = 0;
+    RetVal = NULL;
+
+    if ( Node == NULL || Handle == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Handle = NULL;
+
+    RetVal = ( struct XFSHandle * ) calloc (
+                                        1,
+                                        sizeof ( struct XFSHandle )
+                                        );
+    if ( RetVal == NULL ) { 
+        return XFS_RC ( rcNull );
+    }
+    
+    RCt = XFSNodeAddRef ( Node );
+    if ( RCt == 0 ) {
+        KRefcountInit ( 
+                    & ( RetVal -> refcount ),
+                    1,
+                    XFSHandle_classname,
+                    "XFSHandleMake",
+                    "Node Handle"
+                    );
+
+        RetVal -> Node = Node;
+    }
+
+    if ( RCt != 0 ) {
+        free ( RetVal );
+    }
+    else {
+        * Handle = RetVal;
+    }
+
+    return RCt;
+}   /* XFSHandleMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSHandleDestroy ( const struct XFSHandle * self )
+{
+    struct XFSHandle * Handle = ( struct XFSHandle * ) self;
+    if ( Handle != NULL ) { 
+        KRefcountWhack ( & ( Handle -> refcount ), XFSHandle_classname );
+
+        if ( Handle -> Node != NULL ) {
+            XFSNodeRelease ( Handle -> Node );
+
+            Handle -> Node = NULL;
+        }
+
+        if ( Handle -> Handle != NULL ) {
+            /* TODO !!! Warning about active handle */
+
+            Handle -> Handle = NULL;
+        }
+
+        free ( Handle );
+    }
+
+    return 0;
+}   /* XFSHandleDestroy () */
+
+LIB_EXPORT
+rc_t CC
+XFSHandleAddRef ( const struct XFSHandle * self )
+{
+    rc_t RCt;
+    int32_t RetCode;
+    struct XFSHandle * Handle;
+
+    RCt = 0;
+    RetCode = 0;
+    Handle = ( struct XFSHandle * ) self;
+    if ( Handle != NULL ) {
+        RetCode = KRefcountAdd (
+                        & ( Handle -> refcount ),
+                        XFSHandle_classname
+                        );
+        switch ( RetCode ) {
+            case krefOkay :
+                    RCt = 0;
+                    break;
+            case krefZero :
+            case krefLimit :
+            case krefNegative :
+                    RCt = RC ( rcFS, rcNoTarg, rcAttaching, rcRefcount, rcInvalid );
+                    break;
+            default :
+                    RCt = RC ( rcFS, rcNoTarg, rcAttaching, rcRefcount, rcUnknown );
+                    break;
+        }
+    }
+
+    return RCt;
+}   /* XFSHandleAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSHandleRelease ( const struct XFSHandle * self )
+{
+    rc_t RCt;
+    int32_t RetCode;
+    struct XFSHandle * Handle;
+
+    RCt = 0;
+    RetCode = 0;
+    Handle = ( struct XFSHandle * ) self;
+    if ( Handle != NULL ) {
+        RetCode = KRefcountDrop (
+                        & ( Handle -> refcount ),
+                        XFSHandle_classname
+                        );
+        switch ( RetCode ) {
+            case krefOkay :
+            case krefZero :
+                    RCt = 0;
+                    break;
+            case krefWhack :
+                    XFSHandleDestroy ( Handle );
+                    break;
+            case krefNegative :
+                    RCt = RC ( rcFS, rcNoTarg, rcAttaching, rcRefcount, rcInvalid );
+                    break;
+            default :
+                    RCt = RC ( rcFS, rcNoTarg, rcAttaching, rcRefcount, rcUnknown );
+                    break;
+        }
+    }
+
+    return RCt;
+}   /* XFSHandleRelease () */
+
+LIB_EXPORT
+void * CC
+XFSHandleGet ( const struct XFSHandle * self )
+{
+    return self == NULL ? NULL : ( self -> Handle );
+}   /* XFSHandleGetType () */
+
+LIB_EXPORT
+rc_t CC
+XFSHandleSet ( const struct XFSHandle * self, void * Handle )
+{
+    struct XFSHandle * Self;
+
+    Self = ( struct XFSHandle * ) self;
+
+    if ( Self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Self -> Handle = Handle;
+
+    return 0;
+}   /* XFSHandleSet () */
+
+LIB_EXPORT
+const struct XFSNode * CC
+XFSHandleNode ( const struct XFSHandle * self )
+{
+    return self == NULL ? NULL : ( self -> Node );
+}   /* XFSHandleNode () */
+
diff --git a/libs/xfs/http.c b/libs/xfs/http.c
new file mode 100644
index 0000000..e894342
--- /dev/null
+++ b/libs/xfs/http.c
@@ -0,0 +1,1300 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/handle.h>
+#include <xfs/perm.h>
+
+#include "xhttp.h"
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "teleport.h"
+#include "common.h"
+
+#include <sysalloc.h>
+
+#include <string.h>     /* memset */
+
+/*)))
+ |||    That file contains 'remote' XFSHttp based nodes
+(((*/
+
+/*)))
+ |||
+ +++    RemoteRepositoryNode, HttpNode, and others
+ |||
+(((*/
+struct XFSHttpNode {
+    struct XFSNode node;
+
+    const struct XFSHttpEntry * entry;
+};
+
+struct XFSHttpRootNode {
+    struct XFSHttpNode node;
+
+    const struct XFSHttp * http;
+};
+
+struct XFSHttpFileEditor {
+    struct XFSFileEditor Papahen;
+
+    const struct XFSHttpReader * reader;
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*                                                               *_*/
+/*_* HttpNode is living here                                       *_*/
+/*_*                                                               *_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ |||
+ +++    HttpNode virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _HttpNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _HttpNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _HttpRootNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _HttpNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _HttpNodeDir_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSDirEditor ** Dir
+                                );
+static rc_t CC _HttpNodeFile_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSFileEditor ** File
+                                );
+static rc_t CC _HttpNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _HttpNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sHttpRootNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _HttpNodeFlavor_v1,
+                                        _HttpRootNodeDispose_v1,
+                                        _HttpNodeFindNode_v1,
+                                        _HttpNodeDir_v1,
+                                        _HttpNodeFile_v1,
+                                        _HttpNodeAttr_v1,
+                                        _HttpNodeDescribe_v1
+                                        };
+
+static const struct XFSNode_vt_v1 _sHttpNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _HttpNodeFlavor_v1,
+                                        _HttpNodeDispose_v1,
+                                        NULL,
+                                        _HttpNodeDir_v1,
+                                        _HttpNodeFile_v1,
+                                        _HttpNodeAttr_v1,
+                                        _HttpNodeDescribe_v1
+                                        };
+
+
+static
+rc_t CC
+XFSHttpNodeMake (
+    struct XFSNode ** Node,
+    const char * Name,
+    const struct XFSHttpEntry * Entry
+)
+{
+    rc_t RCt;
+    struct XFSHttpNode * xNode;
+
+    RCt = 0;
+    xNode = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Node == NULL || Name == NULL || Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    xNode = calloc ( 1, sizeof ( struct XFSHttpNode ) );
+    if ( xNode == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSNodeInitVT (
+                    & ( xNode -> node ),
+                    Name,
+                    ( const union XFSNode_vt * ) & _sHttpNodeVT_v1
+                    );
+
+    if ( RCt == 0 ) {
+        RCt = XFSHttpEntryAddRef ( Entry );
+        if ( RCt == 0 ) {
+            xNode -> entry = Entry;
+
+            * Node = & ( xNode -> node );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( xNode != NULL ) {
+            RCt = XFSNodeDispose ( & ( xNode -> node ) );
+        }
+    }
+
+    return RCt;
+}   /* XFSHttpNodeMake () */
+
+static
+rc_t CC
+XFSHttpRootNodeMake (
+    struct XFSNode ** Node,
+    const char * Name,
+    const char * BaseUrl
+)
+{
+    rc_t RCt;
+    struct XFSHttpRootNode * xNode;
+    const struct XFSHttp * Http;
+    const struct XFSHttpEntry * Entry;
+
+    RCt = 0;
+    xNode = NULL;
+    Http = NULL;
+    Entry = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Node == NULL || Name == NULL || BaseUrl == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    xNode = calloc ( 1, sizeof ( struct XFSHttpRootNode ) );
+    if ( xNode == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSNodeInitVT (
+                    & ( xNode -> node . node),
+                    Name,
+                    ( const union XFSNode_vt * ) & _sHttpRootNodeVT_v1
+                    );
+    if ( RCt == 0 ) {
+        RCt = XFSHttpMake ( BaseUrl, & Http );
+        if ( RCt == 0 ) {
+            Entry = XFSHttpGetEntry ( Http, "/" );
+            if ( Entry == NULL ) {
+                RCt = XFS_RC ( rcInvalid );
+            }
+            else {
+                xNode -> node . entry = Entry;
+                xNode -> http = Http;
+
+                * Node = & ( xNode -> node . node );
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( xNode != NULL ) {
+            XFSNodeDispose ( ( const struct XFSNode * ) & ( xNode -> node ) );
+        }
+    }
+
+    return RCt;
+}   /* XFSHttpRootNodeMake () */
+
+uint32_t CC
+_HttpNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    return _sFlavorOfHttp;
+}   /* _HttpNodeFlavor_v1 () */
+
+static
+rc_t CC
+XFSHttpNodeDispose ( const struct XFSHttpNode * self )
+{
+    struct XFSHttpNode * Node = ( struct XFSHttpNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "XFSHttpNodeDispose ( $(node) )]", "node=%p", ( void * ) Node );
+*/
+
+    if ( Node == 0 ) {
+        return 0;
+    }
+
+    if ( Node -> entry != NULL ) {
+        XFSHttpEntryRelease ( Node -> entry );
+        Node -> entry = NULL;
+    }
+
+    free ( Node );
+
+    return 0;
+}   /* XFSHttpNodeDispose () */
+
+static
+rc_t CC
+XFSHttpRootNodeDispose ( const struct XFSHttpRootNode * self )
+{
+    struct XFSHttpRootNode * Node = ( struct XFSHttpRootNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "XFSHttpRootNodeDispose ( $(node) )]", "node=%p", ( void * ) Node );
+*/
+
+    if ( Node == 0 ) {
+        return 0;
+    }
+
+    if ( Node -> http != NULL ) {
+        XFSHttpRelease ( ( struct XFSHttp * ) Node -> http );
+        Node -> http = NULL;
+    }
+
+    XFSHttpNodeDispose ( & ( Node -> node ) );
+
+    return 0;
+}   /* XFSHttpRootNodeDispose () */
+
+rc_t CC
+_HttpRootNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return XFSHttpRootNodeDispose ( ( const struct XFSHttpRootNode * ) self );
+}   /* _HttpRootNodeDispose_v1 () */
+
+rc_t CC
+_HttpNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return XFSHttpNodeDispose ( ( const struct XFSHttpNode * ) self );
+}   /* _HttpNodeDispose_v1 () */
+
+/*)))
+ |||
+ +++  There are two methods to find node: for Root and non Root nodes
+ |||
+(((*/
+
+/*)) KDir version
+ ((*/
+rc_t CC
+_HttpNodeFindNode_v1 (
+            const struct XFSNode * self,
+            const struct XFSPath * Path,
+            uint32_t PathIndex,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    struct XFSHttpRootNode * RootNode;
+    struct XFSNode * RetNode;
+    const struct XFSHttpEntry * Entry;
+    const struct XFSPath * xPath;
+    bool IsLast;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    RootNode = NULL;
+    RetNode = NULL;
+    Entry = NULL;
+    xPath = NULL;
+    IsLast = false;
+
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                            self,
+                                            Path,
+                                            PathIndex,
+                                            Node,
+                                            & NodeName,
+                                            & PathCount,
+                                            & IsLast
+                                            );
+    if ( RCt == 0 ) {
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+
+            return RCt;
+        }
+
+        RootNode = ( struct XFSHttpRootNode * ) self;
+        if ( RootNode -> http == NULL ) {
+            return XFS_RC ( rcInvalid );
+        }
+
+        RCt = XFSPathFrom ( Path, PathIndex + 1, & xPath );
+        if ( RCt == 0 ) {
+            RCt = XFSHttpGetOrCreateEntry (
+                                        RootNode -> http,
+                                        XFSPathGet ( xPath ),
+                                        & Entry
+                                        );
+            if ( RCt == 0 ) {
+                RCt = XFSHttpNodeMake (
+                                    & RetNode,
+                                    XFSPathName ( Path ),/* NodeName, */
+                                    Entry
+                                    );
+                if ( RCt == 0 ) {
+                    * Node = RetNode;
+                }
+            }
+
+            XFSPathRelease ( xPath );
+        }
+    }
+
+    return RCt;
+}   /* _HttpNodeFindNode () */
+
+/*)))
+ |||
+ +++  Unified DirEditor
+ |||
+(((*/
+static
+rc_t CC
+_HttpDir_dispose_v1 ( const struct XFSEditor * self )
+{
+    struct XFSDirEditor * Editor = ( struct XFSDirEditor * ) self;
+/*
+    pLogMsg ( klogDebug, "_HttpDir_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( Editor != NULL ) {
+        free ( Editor );
+    }
+
+    return 0;
+}   /* _HttpDir_dispose_v1 () */
+
+static
+rc_t CC
+_HttpDir_list_v1 (
+                const struct XFSDirEditor * self,
+                const struct KNamelist ** List
+)
+{
+    rc_t RCt;
+    const struct XFSHttpNode * Node;
+    struct KNamelist * TempList;
+
+    RCt = 0;
+    Node = NULL;
+    TempList = NULL;
+
+    if ( List != NULL ) {
+        * List = NULL;
+    }
+
+    if ( self == NULL || List == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Node = ( const struct XFSHttpNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSHttpEntryList ( Node -> entry, & TempList );
+    if ( RCt == 0 ) {
+        * List = TempList;
+    }
+
+    return RCt;
+}   /* _HttpDir_list_v1 () */
+
+static
+rc_t CC
+_HttpDir_find_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name,
+                const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    const struct XFSHttpNode * HttpNode;
+    struct XFSNode * TempNode;
+    const struct XFSHttpEntry * TempEntry;
+
+    RCt = 0;
+    HttpNode = NULL;
+    TempNode = NULL;
+    TempEntry = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( self == NULL || Name == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    HttpNode = ( const struct XFSHttpNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( HttpNode == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( HttpNode -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSHttpEntryGet ( HttpNode -> entry, Name, & TempEntry );
+    if ( RCt == 0 ) {
+        RCt = XFSHttpNodeMake ( & TempNode, Name, TempEntry );
+        if ( RCt == 0 ) {
+            * Node = TempNode;
+        }
+    }
+
+    return RCt;
+}   /* _HttpDir_find_v1 () */
+
+rc_t CC
+_HttpNodeDir_v1 (
+            const struct XFSNode * self,
+            const struct XFSDirEditor ** Dir
+)
+{
+    rc_t RCt;
+    struct XFSDirEditor * Editor;
+    const struct XFSHttpNode * Node;
+
+    RCt = 0;
+    Editor = NULL;
+    Node = ( const struct XFSHttpNode * ) self;
+
+    if ( Dir != NULL ) {
+        * Dir = NULL;
+    }
+
+    if ( self == NULL || Dir == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Node -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( ! XFSHttpEntryIsFolder ( Node -> entry ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Editor = calloc ( 1, sizeof ( struct XFSDirEditor ) );
+    if ( Editor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    memset ( Editor, 0, sizeof ( struct XFSDirEditor ) );
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _HttpDir_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> list = _HttpDir_list_v1;
+        Editor -> find = _HttpDir_find_v1;
+
+        * Dir = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _HttpNodeDir_v1 () */
+
+/*)))
+ |||
+ +++  Unified FileEditor
+ |||
+(((*/
+
+static
+rc_t CC
+_HttpFile_dispose_v1 ( const struct XFSEditor * self )
+{
+    struct XFSHttpFileEditor * Editor = ( struct XFSHttpFileEditor * ) self;
+/*
+    pLogMsg ( klogDebug, "_HttpFile_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( Editor != NULL ) {
+        if ( Editor -> reader != NULL ) {
+            XFSHttpReaderRelease ( Editor -> reader );
+
+            Editor -> reader = NULL;
+        }
+
+        free ( Editor );
+    }
+
+    return 0;
+}   /* _HttpFile_dispose_v1 () */
+
+static
+rc_t CC
+_HttpFile_open_v1 (
+                    const struct XFSFileEditor * self,
+                    XFSNMode Mode
+)
+{
+    rc_t RCt;
+    const struct XFSHttpNode * Node;
+    struct XFSHttpFileEditor * Editor;
+    const struct XFSHttpReader * Reader;
+
+    RCt = 0;
+    Node = NULL;
+    Editor = ( struct XFSHttpFileEditor * ) self;
+    Reader = NULL;
+
+    if ( Mode != kxfsRead ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Node = ( const struct XFSHttpNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Editor = ( struct XFSHttpFileEditor * ) self;
+    if ( Editor -> reader == NULL ) {
+        RCt = XFSHttpReaderMake ( Node -> entry, & Reader );
+        if ( RCt == 0 ) {
+            Editor -> reader = Reader;
+        }
+    }
+
+    return RCt;
+}   /* _HttpFile_open_v1 () */
+
+static
+rc_t CC
+_HttpFile_close_v1 ( const struct XFSFileEditor * self )
+{
+    rc_t RCt;
+    struct XFSHttpFileEditor * Editor;
+
+    RCt = 0;
+    Editor = ( struct XFSHttpFileEditor * ) self;
+
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+
+    if ( Editor -> reader != NULL ) {
+        RCt = XFSHttpReaderRelease ( Editor -> reader );
+
+        Editor -> reader = NULL;
+    }
+
+    return RCt;
+}   /* _HttpFile_close_v1 () */
+
+static
+rc_t CC
+_HttpFile_read_v1 (
+                    const struct XFSFileEditor * self,
+                    uint64_t Offset,
+                    void * Buffer,
+                    size_t SizeToRead,
+                    size_t * NumReaded
+)
+{
+    rc_t RCt;
+    struct XFSHttpFileEditor * Editor;
+
+    RCt = 0;
+    Editor = ( struct XFSHttpFileEditor * ) self;
+
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+
+    if ( Editor -> reader == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSHttpReaderRead (
+                        Editor -> reader,
+                        Offset,
+                        Buffer,
+                        SizeToRead,
+                        NumReaded
+                        );
+
+    return RCt;
+}   /* _HttpFile_read_v1 () */
+
+static
+rc_t CC
+_HttpFile_size_v1 (
+                        const struct XFSFileEditor * self,
+                        uint64_t * Size
+)
+{
+    rc_t RCt;
+    struct XFSHttpNode * Node;
+
+    RCt = 0;
+    Node = NULL;
+
+    XFS_CSA ( Size, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Size )
+
+    Node = ( struct XFSHttpNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( XFSHttpEntryIsFolder ( Node -> entry ) ) {
+        * Size = 0;
+    }
+    else {
+        RCt = XFSHttpEntrySize ( Node -> entry, Size );
+        if ( RCt != 0 ) {
+            * Size = 0;
+        }
+    }
+
+    return RCt;
+}   /* _HttpFile_size_v1 () */
+
+rc_t CC
+_HttpNodeFile_v1 (
+            const struct XFSNode * self,
+            const struct XFSFileEditor ** File
+)
+{
+    rc_t RCt;
+    struct XFSHttpFileEditor * FileEditor;
+    struct XFSFileEditor * Editor;
+
+    RCt = 0;
+    FileEditor = NULL;
+    Editor = NULL;
+
+    if ( File != NULL ) {
+        * File = NULL;
+    }
+
+    if ( self == NULL || File == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    FileEditor = calloc ( 1, sizeof ( struct XFSHttpFileEditor ) );
+    if ( FileEditor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    memset ( FileEditor, 0, sizeof ( struct XFSHttpFileEditor ) );
+
+    Editor = & ( FileEditor -> Papahen );
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _HttpFile_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> open = _HttpFile_open_v1;
+        Editor -> close = _HttpFile_close_v1;
+        Editor -> read = _HttpFile_read_v1;
+        Editor -> size = _HttpFile_size_v1;
+        Editor -> set_size = NULL;
+
+        * File = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _HttpNodeFile_v1 () */
+
+/*)))
+ |||
+ +++  Unified Attr
+ |||
+(((*/
+
+static
+rc_t CC
+_HttpAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_HttpAttr_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSAttrEditor * ) self );
+    }
+
+    return 0;
+}   /* _HttpAttr_dispose_v1 () */
+
+static
+rc_t CC
+_HttpAttr_init_check_v1 (
+                const struct XFSAttrEditor * self,
+                const struct XFSHttpEntry ** Entry
+)
+{
+    struct XFSHttpNode * Node = NULL;
+
+    if ( Entry != NULL ) {
+        * Entry = NULL;
+    }
+
+    if ( self == NULL || Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Node = ( struct XFSHttpNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Entry = Node -> entry;
+
+    return 0;
+}   /* _HttpAttr_init_check_v1 () */
+
+static
+rc_t CC
+_HttpAttr_permissions_v1 (
+                        const struct XFSAttrEditor * self,
+                        const char ** Permissions
+)
+{
+    rc_t RCt;
+    const struct XFSHttpEntry * Entry;
+
+    RCt = 0;
+    Entry = NULL;
+
+    if ( Permissions == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Permissions = NULL;
+
+    RCt = _HttpAttr_init_check_v1 ( self, & Entry );
+    if ( RCt == 0 ) {
+        * Permissions = XFSHttpEntryIsFolder ( Entry )
+                                        ? XFSPermRODefContChar ()
+                                        : XFSPermRODefNodeChar ()
+                                        ;
+    }
+
+    return RCt;
+}   /* _HttpAttr_permissions_v1 () */
+
+static
+rc_t CC
+_HttpAttr_date_v1 (
+                        const struct XFSAttrEditor * self,
+                        KTime_t * Time
+)
+{
+    rc_t RCt;
+    const struct XFSHttpEntry * Entry;
+
+    RCt = 0;
+    Entry = NULL;
+
+    if ( Time == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Time = 0;
+
+    RCt = _HttpAttr_init_check_v1 ( self, & Entry );
+    if ( RCt == 0 ) {
+        RCt = XFSHttpEntryTime ( Entry, Time );
+        if ( RCt != 0 ) {
+            * Time = 0;
+        }
+    }
+
+    return RCt;
+}   /* _HttpAttr_date_v1 () */
+
+static
+rc_t CC
+_HttpAttr_type_v1 (
+                        const struct XFSAttrEditor * self,
+                        XFSNType * Type
+)
+{
+    rc_t RCt;
+    const struct XFSHttpEntry * Entry;
+
+    RCt = 0;
+    Entry = NULL;
+
+    if ( Type == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Type = kxfsNotFound;
+
+    RCt = _HttpAttr_init_check_v1 ( self, & Entry );
+    if ( RCt == 0 ) {
+        * Type = XFSHttpEntryIsFolder ( Entry ) ? kxfsDir : kxfsFile ;
+    }
+
+    return RCt;
+}   /* _HttpAttr_type_v1 () */
+
+static
+rc_t CC
+_HttpNodeAttr_v1 (
+            const struct XFSNode * self,
+            const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    if ( self == NULL || Attr == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Attr = NULL;
+
+    Editor = calloc ( 1, sizeof ( struct XFSAttrEditor ) );
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _HttpAttr_dispose_v1
+                    );
+    if ( RCt == 0 ) {
+        Editor -> permissions = _HttpAttr_permissions_v1;
+        Editor -> date = _HttpAttr_date_v1;
+        Editor -> type = _HttpAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _HttpNodeAttr_v1 () */
+
+/*)))
+ |||
+ +++  Unified Discribe
+ |||
+(((*/
+
+rc_t CC
+_HttpNodeDescribe_v1 (
+            const struct XFSNode * self,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+    const char * Abbr;
+
+    RCt = 0;
+    NumWrit = 0;
+    Abbr = NULL;
+
+    if ( Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Abbr = XFSHttpEntryIsFolder ( ( ( const struct XFSHttpNode * ) self ) -> entry )
+            ? "HTTP FOLDER"
+            : "HTTP NODE"
+            ;
+
+    if ( self == NULL ) {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[NULL][NULL]",
+                    Abbr
+                    );
+    }
+    else {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[%s][0x%p]",
+                    Abbr,
+                    self -> Name,
+                    self
+                    );
+    }
+
+    return RCt;
+}   /* _HttpNodeDescribe_v1 () */
+
+/*)))
+ |||
+ +++    FileNode lives here
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+static
+rc_t CC
+_RemoteRepositoryNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    const char * NodeName;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Model == NULL || Template == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    RCt = XFSHttpRootNodeMake (
+                    & TheNode,
+                    NodeName,
+                    XFSModelNodeProperty ( Template, XFS_MODEL_SOURCE )
+                    );
+    if ( RCt == 0 ) {
+        * Node = ( struct XFSNode * ) TheNode;
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSHttpRootNodeDispose ( ( const struct XFSHttpRootNode * ) TheNode );
+        }
+    }
+
+    return RCt;
+}   /* _RemoteRepositoryNodeConstructor () */
+
+/*)))
+ |||
+ +++    Non-Teleport methods to create nodes
+ |||
+(((*/
+
+/*)))
+ |||
+ +++    HttpRootNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_RemoteRepositoryConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = _RemoteRepositoryNodeConstructor (
+                                        Model,
+                                        Template,
+                                        Alias,
+                                        Node
+                                        );
+
+/*
+pLogMsg ( klogDebug, "_RemoteRepositoryConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _RemoteRepositoryConstructor () */
+
+static
+rc_t CC
+_RemoteRepositoryValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_RemoteRepositoryValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _RemoteRepositoryValidator () */
+
+static const struct XFSTeleport _sRemoteRepositoryTeleport = {
+                                        _RemoteRepositoryConstructor,
+                                        _RemoteRepositoryValidator,
+                                        false
+                                        };
+
+
+LIB_EXPORT
+rc_t CC
+XFSRemoteRepositoryProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sRemoteRepositoryTeleport;
+
+    return 0;
+}   /* XFSRemoteRepositoryProvider () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* ALL BELOW TODO!!!                                               */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*)))
+ |||
+ +++    HttpRootNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_RemoteFileNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    const char * NodeName;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Model == NULL || Template == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    RCt = XFSHttpRootNodeMake (
+                    & TheNode,
+                    NodeName,
+                    XFSModelNodeProperty ( Template, XFS_MODEL_SOURCE )
+                    );
+    if ( RCt == 0 ) {
+        * Node = ( struct XFSNode * ) TheNode;
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSHttpRootNodeDispose ( ( const struct XFSHttpRootNode * ) TheNode );
+        }
+    }
+
+    return RCt;
+}   /* _RemoteFileNodeConstructor () */
+
+/*)))
+ |||
+ +++    HttpRootNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_RemoteFileConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = _RemoteFileNodeConstructor (
+                                        Model,
+                                        Template,
+                                        Alias,
+                                        Node
+                                        );
+
+/*
+pLogMsg ( klogDebug, "_RemoteFileConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _RemoteFileConstructor () */
+
+static
+rc_t CC
+_RemoteFileValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_RemoteFileValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _RemoteFileValidator () */
+
+static const struct XFSTeleport _sRemoteFileTeleport = {
+                                        _RemoteFileConstructor,
+                                        _RemoteFileValidator,
+                                        false
+                                        };
+
+
+LIB_EXPORT
+rc_t CC
+XFSRemoteFileProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sRemoteFileTeleport;
+
+    return 0;
+}   /* XFSRemoteFileProvider () */
diff --git a/libs/xfs/kfs.c b/libs/xfs/kfs.c
new file mode 100644
index 0000000..eb411b7
--- /dev/null
+++ b/libs/xfs/kfs.c
@@ -0,0 +1,2038 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/handle.h>
+#include <xfs/perm.h>
+
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "teleport.h"
+#include "common.h"
+
+#include <sysalloc.h>
+
+/*)))
+ |||    That file contains 'native' KFile and KDirectory based nodes
+ |||    Both nodes are implemented as XFSKfsNode
+ |||    That kind of node represent real path which exists in system
+(((*/
+
+/*)))
+ |||
+ +++    FileNode, and other simple containers
+ |||
+(((*/
+struct XFSKfsNode {
+    struct XFSNode node;
+
+    XFSNType type;       /* possible Dir and File */
+    const char * path;   /* Path for object */
+    const char * perm;   /* Permissions in format "rwxrwxrwx u:g:o" */
+};
+
+struct XFSKfsFileEditor {
+    struct XFSFileEditor Papahen;
+
+    struct KFile * File;
+};
+
+struct XFSKfsAttrEditor {
+    struct XFSAttrEditor Papahen;
+
+    char perm [ 16 ];     /* there we are storing 'const' object */
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*                                                               *_*/
+/*_* KfsNode is living here                                        *_*/
+/*_*                                                               *_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ |||
+ +++    KfsNode virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _KfsNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _KfsNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _KfsFileNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _KfsDirNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _KfsNodeDir_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSDirEditor ** Dir
+                                );
+static rc_t CC _KfsNodeFile_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSFileEditor ** File
+                                );
+static rc_t CC _KfsNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _KfsNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sKfsFileNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _KfsNodeFlavor_v1,
+                                        _KfsNodeDispose_v1,
+                                        _KfsFileNodeFindNode_v1,
+                                        NULL,   /* NO DIR */
+                                        _KfsNodeFile_v1,
+                                        _KfsNodeAttr_v1,
+                                        _KfsNodeDescribe_v1
+                                        };
+
+static const struct XFSNode_vt_v1 _sKfsDirNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _KfsNodeFlavor_v1,
+                                        _KfsNodeDispose_v1,
+                                        _KfsDirNodeFindNode_v1,
+                                        _KfsNodeDir_v1,
+                                        NULL,   /* NO FILE */
+                                        _KfsNodeAttr_v1,
+                                        _KfsNodeDescribe_v1
+                                        };
+
+static
+rc_t CC
+XFSKfsNodeMake (
+            struct XFSKfsNode ** Node,
+            XFSNType Type,
+            const char * Name
+)
+{
+    rc_t RCt;
+    struct XFSKfsNode * TheNode;
+
+    RCt = 0;
+    TheNode = NULL;
+
+    if ( Node == NULL || Name == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Node = NULL;
+
+    if ( Type != kxfsFile && Type != kxfsDir ) {
+        return XFS_RC ( rcUnsupported );
+    }
+
+    TheNode = calloc ( 1, sizeof ( struct XFSKfsNode ) );
+    if ( TheNode == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = XFSNodeInitVT (
+                & ( TheNode -> node),
+                Name,
+                ( const union XFSNode_vt * ) ( Type == kxfsDir
+                                        ? ( & _sKfsDirNodeVT_v1 )
+                                        : ( & _sKfsFileNodeVT_v1 )
+                )
+                );
+        if ( RCt == 0 ) {
+
+            TheNode -> type = Type;
+
+                /* This is duplicate, but necessary one
+                 */
+            TheNode -> node . vt = Type == kxfsDir
+                    ? ( ( const union XFSNode_vt * ) & _sKfsDirNodeVT_v1 )
+                    : ( ( const union XFSNode_vt * ) & _sKfsFileNodeVT_v1 )
+                    ;
+
+            * Node = TheNode;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( TheNode != NULL ) {
+            XFSNodeDispose ( & ( TheNode -> node ) );
+            TheNode = NULL;
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "XFSKfsNodeMake ND[$(node)] NM[$(name)] TP[$(type)]", "node=%p,name=%s,type=%d", ( void * ) TheNode, Name, Type );
+*/
+
+    return RCt;
+}   /* XFSKfsNodeMake () */
+
+static
+rc_t CC
+XFSKfsNodeMakeEx (
+            struct XFSKfsNode ** Node,
+            XFSNType Type,
+            const char * Name,
+            const char * Path,
+            const char * Perm
+)
+{
+    struct XFSKfsNode * TempNode;
+    rc_t RCt;
+
+    RCt = 0;
+    TempNode = NULL;
+
+    if ( Node == NULL || Name == NULL || Path == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Node = NULL;
+
+    RCt = XFSKfsNodeMake ( & TempNode, Type, Name );
+    if ( RCt == 0 ) {
+        RCt = XFS_StrDup ( Path, & ( TempNode -> path ) );
+        if ( RCt == 0 ) {
+            if ( Perm != NULL ) {
+                RCt = XFS_StrDup ( Perm, & ( TempNode -> perm ) );
+            }
+            if ( RCt == 0 ) {
+                * Node = TempNode;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( TempNode != NULL ) {
+            XFSNodeDispose ( & ( TempNode -> node ) );
+            TempNode = NULL;
+        }
+    }
+
+    return RCt;
+}   /* XFSKfsNodeMakeEx () */
+
+uint32_t CC
+_KfsNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    return _sFlavorOfKfs;
+}   /* _KfsNodeFlavor_v1 () */
+
+static
+rc_t CC
+XFSKfsNodeDispose ( const struct XFSKfsNode * self )
+{
+    struct XFSKfsNode * Node = ( struct XFSKfsNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "XFSKfsNodeDispose ( $(node) ) TP[$(type)]", "node=%p,type=%d", ( void * ) Node, ( Node == NULL ? 0 : Node -> type ) );
+*/
+
+    if ( Node == 0 ) {
+        return 0;
+    }
+
+    if ( Node -> perm != NULL ) {
+        free ( ( char * ) Node -> perm );
+        Node -> perm = NULL;
+    }
+
+    if ( Node -> path != NULL ) {
+        free ( ( char * ) Node -> path );
+        Node -> path = NULL;
+    }
+
+    Node -> type = 0;
+
+    free ( Node );
+
+    return 0;
+}   /* XFSKfsNodeDispose () */
+
+rc_t CC
+_KfsNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return XFSKfsNodeDispose ( ( struct XFSKfsNode * ) self );
+}   /* _KfsNodeDispose_v1 () */
+
+/*)))
+ |||
+ +++  There will be two methods to find node: for KDir and for KFile
+ |||
+(((*/
+
+/*)) KFile version
+ ((*/
+rc_t CC
+_KfsFileNodeFindNode_v1 (
+            const struct XFSNode * self,
+            const struct XFSPath * Path,
+            uint32_t PathIndex,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    bool IsLast;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    IsLast = false;
+
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                            self,
+                                            Path,
+                                            PathIndex,
+                                            Node,
+                                            & NodeName,
+                                            & PathCount,
+                                            & IsLast
+                                            );
+    if ( RCt == 0 ) {
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+        }
+    }
+
+    return RCt;
+}   /* _KfsFileNodeFindNode () */
+
+/*)) KDir version
+ ((*/
+rc_t CC
+_KfsDirNodeFindNode_v1 (
+            const struct XFSNode * self,
+            const struct XFSPath * Path,
+            uint32_t PathIndex,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    struct XFSKfsNode * KfsNode;
+    bool IsLast;
+    KDirectory * NativeDir;
+    XFSNType Type;
+    const struct XFSPath * xPath, * yPath;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    KfsNode = NULL;
+    IsLast = false;
+    NativeDir = NULL;
+    Type = kxfsNotFound;
+    xPath = yPath = NULL;
+
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                            self,
+                                            Path,
+                                            PathIndex,
+                                            Node,
+                                            & NodeName,
+                                            & PathCount,
+                                            & IsLast
+                                            );
+    if ( RCt == 0 ) {
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+
+            return RCt;
+        }
+
+        KfsNode = ( struct XFSKfsNode * ) self;
+        if ( KfsNode -> path == NULL ) {
+            return XFS_RC ( rcInvalid );
+        }
+
+            /*) Here we are trying to create new node
+             (*/
+        RCt = XFSPathFrom ( Path, PathIndex + 1, & xPath );
+        if ( RCt == 0 ) {
+            RCt = XFSPathMake (
+                            & yPath,
+                            true,
+                            "%s/%s",
+                            KfsNode -> path,
+                            XFSPathGet ( xPath )
+                            );
+            if ( RCt == 0 ) {
+                RCt = KDirectoryNativeDir ( & NativeDir );
+                if ( RCt == 0 ) {
+                    switch ( KDirectoryPathType ( NativeDir, XFSPathGet ( yPath ) ) ) {
+                        case kptFile :
+                                Type = kxfsFile;
+                                break;
+                        case kptDir :
+                                Type = kxfsDir;
+                                break;
+                        default :
+                                RCt = XFS_RC ( rcInvalid );
+                                break;
+                    }
+                    if ( RCt == 0 ) {
+                        RCt = XFSKfsNodeMakeEx (
+                                            & KfsNode,
+                                            Type,
+                                            XFSPathName ( yPath ),
+                                            XFSPathGet ( yPath ),
+                                            NULL
+                                            );
+                        if ( RCt == 0 ) {
+                            * Node = & ( KfsNode -> node );
+                        }
+                    }
+
+                    KDirectoryRelease ( NativeDir );
+                }
+
+                XFSPathRelease ( yPath );
+            }
+
+            XFSPathRelease ( xPath );
+        }
+    }
+
+    return RCt;
+}   /* _KfsDirNodeFindNode () */
+
+/*)))
+ |||
+ +++  Unified DirEditor
+ |||
+(((*/
+static
+rc_t CC
+_KfsDir_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_KfsDir_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSDirEditor * ) self );
+    }
+
+    return 0;
+}   /* _KfsDir_dispose_v1 () */
+
+static
+rc_t CC
+_KfsDir_list_v1 (
+                const struct XFSDirEditor * self,
+                const struct KNamelist ** List
+)
+{
+    KDirectory * NativeDir;
+    const struct XFSKfsNode * Node;
+    struct KNamelist * TempList;
+    rc_t RCt;
+
+    RCt = 0;
+    NativeDir = NULL;
+    Node = NULL;
+    TempList = NULL;
+
+    if ( self == NULL || List == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * List = NULL;
+
+    Node = ( const struct XFSKfsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> type != kxfsDir ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KDirectoryNativeDir ( & NativeDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryList (
+                            NativeDir,
+                            & TempList,
+                            NULL, /* Filter Func */
+                            NULL, /* Filter Data */
+                            Node -> path
+                            );
+        if ( RCt == 0 ) {
+            * List = TempList;
+        }
+        else {
+            if ( TempList != NULL ) {
+                KNamelistRelease ( TempList );
+            }
+        }
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _KfsDir_list_v1 () */
+
+static
+rc_t CC
+_KfsDir_find_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name,
+                const struct XFSNode ** Node
+)
+{
+    KDirectory * NativeDir;
+    const struct XFSKfsNode * KfsNode;
+    struct XFSKfsNode * TempNode;
+    uint32_t FileType;
+    XFSNType Type;
+    char FullPath [ XFS_SIZE_4096 ];
+    size_t NumWrit;
+    rc_t RCt;
+
+    RCt = 0;
+    NativeDir = NULL;
+    KfsNode = NULL;
+    TempNode = NULL;
+    FileType = kptNotFound;
+    Type = kxfsNotFound;
+    NumWrit = 0;
+    * FullPath = 0;
+
+    if ( self == NULL || Name == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Node = NULL;
+
+    KfsNode = ( const struct XFSKfsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( KfsNode == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( KfsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = string_printf (
+                        FullPath,
+                        sizeof ( FullPath ),
+                        & NumWrit,
+                        "%s/%s",
+                        KfsNode -> path,
+                        Name
+                        );
+    if ( RCt == 0 ) {
+
+        RCt = KDirectoryNativeDir ( & NativeDir );
+        if ( RCt == 0 ) {
+            FileType = KDirectoryPathType ( NativeDir, FullPath );
+            switch ( FileType ) {
+                case kptFile :
+                    Type = kxfsFile;
+                    break;
+                case kptDir :
+                    Type = kxfsDir;
+                    break;
+                default :
+                    RCt = XFS_RC ( rcUnsupported );
+                    break;
+            }
+            if ( RCt == 0 ) {
+                RCt = XFSKfsNodeMakeEx (
+                                    & TempNode,
+                                    Type,
+                                    Name,
+                                    FullPath,
+                                    KfsNode -> perm
+                                    );
+                if ( RCt == 0 ) {
+                    * Node = ( const struct XFSNode * ) TempNode;
+                }
+            }
+
+            KDirectoryRelease ( NativeDir );
+        }
+    }
+
+    return RCt;
+}   /* _KfsDir_find_v1 () */
+
+static
+rc_t CC
+_KfsDir_create_file_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name,
+                XFSNMode Mode,
+                const struct XFSHandle ** Handle
+)
+{
+    struct KDirectory * NativeDir;
+    struct KFile * File;
+    bool Update;
+    KCreateMode CreateMode;
+    char Path [ XFS_SIZE_4096 ];
+    struct XFSKfsNode * KfsNode, * TempNode;
+    struct XFSKfsFileEditor * FileEditor;
+    const struct XFSHandle * TempHandle;
+    size_t NumWritten;
+    rc_t RCt;
+
+    NativeDir = NULL;
+    File = NULL;
+    Update = false;
+    CreateMode = kcmCreate;
+    * Path = 0;
+    KfsNode = TempNode = NULL;
+    FileEditor = NULL;
+    TempHandle = NULL;
+    NumWritten = 0;
+    RCt = 0;
+
+    if ( self == NULL || Name == NULL || Handle == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Handle = NULL;
+
+    KfsNode = ( struct XFSKfsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( KfsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = string_printf (
+                        Path,
+                        sizeof ( Path ),
+                        & NumWritten,
+                        "%s/%s",
+                        KfsNode -> path,
+                        Name
+                        );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    Update = Mode == kxfsReadWrite;
+    CreateMode = kcmCreate;
+
+        /* Here we are */
+    RCt = KDirectoryNativeDir ( & NativeDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryCreateFile (
+                                NativeDir,
+                                & File, 
+                                Update,
+                                XFSPermRODefNodeNum (),
+                                CreateMode,
+                                Path
+                                );
+        if ( RCt == 0 ) {
+            RCt = XFSKfsNodeMakeEx (
+                                & TempNode,
+                                kxfsFile,
+                                Name,
+                                Path,
+                                KfsNode -> perm
+                                );
+            if ( RCt == 0 ) {
+                RCt = XFSNodeFileEditor (
+                                    & ( TempNode -> node ),
+                                    ( const struct XFSFileEditor ** ) & FileEditor
+                                    );
+                if ( RCt == 0 ) {
+                    FileEditor -> File = File;
+                    RCt = XFSHandleMake (
+                                    & ( TempNode -> node ),
+                                    & TempHandle
+                                    );
+                    if ( RCt == 0 ) {
+                        XFSHandleSet ( TempHandle, FileEditor );
+
+                        * Handle = TempHandle;
+                    }
+                }
+            }
+        }
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    if ( RCt != 0 ) {
+        * Handle = NULL;
+
+        if ( TempHandle != NULL ) {
+            XFSHandleRelease ( TempHandle );
+        }
+        else {
+            if ( FileEditor != NULL ) {
+                XFSEditorDispose ( ( const struct XFSEditor * ) FileEditor );
+            }
+        }
+
+        if ( File != NULL ) {
+            KFileRelease ( File );
+        }
+    }
+
+    return RCt;
+}   /* _KfsDir_create_file_v1 () */
+
+static
+rc_t CC
+_KfsDir_create_dir_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name
+)
+{
+    rc_t RCt;
+    KDirectory * NativeDir;
+    struct XFSKfsNode * KfsNode;
+    char Path [ XFS_SIZE_4096 ];
+    size_t NumWritten;
+
+    RCt = 0;
+    NativeDir = NULL;
+    KfsNode = NULL;
+    * Path = 0;
+    NumWritten = 0;
+
+    if ( self == NULL || Name == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    KfsNode = ( struct XFSKfsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( KfsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = string_printf (
+                        Path,
+                        sizeof ( Path ),
+                        & NumWritten,
+                        "%s/%s",
+                        KfsNode -> path,
+                        Name
+                        );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    RCt = KDirectoryNativeDir ( & NativeDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryCreateDir (
+                                NativeDir,
+                                XFSPermRODefContNum (),
+                                kcmCreate,
+                                Path
+                                );
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _KfsDir_create_dir_v1 () */
+
+static
+rc_t CC
+_KfsDir_delete_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name
+)
+{
+    rc_t RCt;
+    KDirectory * NativeDir;
+    struct XFSKfsNode * KfsNode;
+    char Path [ XFS_SIZE_4096 ];
+    size_t NumWritten;
+
+    RCt = 0;
+    NativeDir = NULL;
+    KfsNode = NULL;
+    * Path = 0;
+    NumWritten = 0;
+
+    if ( self == NULL || Name == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    KfsNode = ( struct XFSKfsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( KfsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = string_printf (
+                        Path,
+                        sizeof ( Path ),
+                        & NumWritten,
+                        "%s/%s",
+                        KfsNode -> path,
+                        Name
+                        );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    RCt = KDirectoryNativeDir ( & NativeDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryRemove ( NativeDir, true, Path );
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _KfsDir_delete_v1 () */
+
+rc_t CC
+_KfsDir_move_v1 (
+            const struct XFSDirEditor * self,
+            const char * OldName,
+            const struct XFSNode * NewDir,
+            const char * NewName
+)
+{
+    rc_t RCt;
+    struct XFSKfsNode * KfsNode;
+    struct XFSKfsNode * NewKfsNode;
+    KDirectory * NativeDir;
+    char OldPath [ XFS_SIZE_4096 ];
+    char NewPath [ XFS_SIZE_4096 ];
+    size_t NumWritten;
+
+    RCt = 0;
+    KfsNode = NULL;
+    NewKfsNode = NULL;
+    NativeDir = NULL;
+    * OldPath = * NewPath = 0;
+    NumWritten = 0;
+
+    if ( self == NULL || OldName == NULL || NewDir == NULL
+        || NewName == NULL
+    ) {
+        return XFS_RC ( rcNull );
+    }
+
+        /*) TODO it is temporary, until we will do
+         (*/
+    if ( XFSNodeFlavor ( NewDir ) !=
+            XFSNodeFlavor ( ( self -> Papahen ) . Node ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    KfsNode = ( struct XFSKfsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( KfsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    NewKfsNode = ( struct XFSKfsNode * ) NewDir;
+    if ( NewKfsNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = string_printf (
+                        OldPath,
+                        sizeof ( OldPath ),
+                        & NumWritten,
+                        "%s/%s",
+                        KfsNode -> path,
+                        OldName
+                        );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    RCt = string_printf (
+                        NewPath,
+                        sizeof ( NewPath ),
+                        & NumWritten,
+                        "%s/%s",
+                        NewKfsNode -> path,
+                        NewName
+                        );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    RCt = KDirectoryNativeDir ( & NativeDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryRename ( NativeDir, true, OldPath, NewPath );
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _KfsDir_move_v1 () */
+
+rc_t CC
+_KfsNodeDir_v1 (
+            const struct XFSNode * self,
+            const struct XFSDirEditor ** Dir
+)
+{
+    rc_t RCt;
+    struct XFSDirEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    if ( self == NULL || Dir == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Dir = NULL;
+
+    if ( ( ( struct XFSKfsNode * ) self ) -> type != kxfsDir ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Editor = calloc ( 1, sizeof ( struct XFSDirEditor ) );
+    if ( Editor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _KfsDir_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> list = _KfsDir_list_v1;
+        Editor -> find = _KfsDir_find_v1;
+        Editor -> create_file = _KfsDir_create_file_v1;
+        Editor -> create_dir = _KfsDir_create_dir_v1;
+        Editor -> delete = _KfsDir_delete_v1;
+        Editor -> move = _KfsDir_move_v1;
+
+        * Dir = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _KfsNodeDir_v1 () */
+
+/*)))
+ |||
+ +++  Unified FileEditor
+ |||
+(((*/
+
+static
+rc_t CC
+_KfsFile_dispose_v1 ( const struct XFSEditor * self )
+{
+    struct XFSKfsFileEditor * Editor = ( struct XFSKfsFileEditor * ) self;
+
+/*
+    pLogMsg ( klogDebug, "_KfsFile_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( Editor != NULL ) {
+        if ( Editor -> File != NULL ) {
+            KFileRelease ( Editor -> File );
+
+            Editor -> File = NULL;
+        }
+
+        free ( Editor );
+    }
+
+    return 0;
+}   /* _KfsFile_dispose_v1 () */
+
+static
+rc_t CC
+_KfsFile_open_v1 (
+                    const struct XFSFileEditor * self,
+                    XFSNMode Mode
+)
+{
+    KFile * File;
+    const struct XFSKfsNode * Node;
+    KDirectory * NativeDir;
+    rc_t RCt;
+
+    File = NULL;
+    Node = NULL;
+    NativeDir = NULL;
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Node = ( const struct XFSKfsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> type != kxfsFile ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KDirectoryNativeDir ( & NativeDir );
+    if ( RCt == 0 ) {
+        if ( Mode == kxfsRead ) {
+            RCt = KDirectoryOpenFileRead (
+                                        NativeDir,
+                                        ( const KFile ** ) & File,
+                                        Node -> path
+                                        );
+        }
+        else {
+            RCt = KDirectoryOpenFileWrite (
+                                        NativeDir,
+                                        & File,
+                                        ( Mode & kxfsRead ) == kxfsRead,
+                                        Node -> path
+                                        );
+        }
+        if ( RCt == 0 ) {
+            ( ( struct XFSKfsFileEditor * ) self ) -> File = File;
+        }
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _KfsFile_open_v1 () */
+
+static
+rc_t CC
+_KfsFile_close_v1 ( const struct XFSFileEditor * self )
+{
+    struct XFSKfsFileEditor * Editor;
+    rc_t RCt;
+
+    Editor = NULL;
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+
+    Editor = ( struct XFSKfsFileEditor * ) self;
+
+    if ( Editor -> File != NULL ) {
+        RCt = KFileRelease ( Editor -> File );
+
+        Editor -> File = NULL;
+    }
+
+    return RCt;
+}   /* _KfsFile_close_v1 () */
+
+static
+rc_t CC
+_KfsFile_read_v1 (
+                    const struct XFSFileEditor * self,
+                    uint64_t Offset,
+                    void * Buffer,
+                    size_t SizeToRead,
+                    size_t * NumReaded
+)
+{
+    struct XFSKfsFileEditor * Editor;
+    rc_t RCt;
+
+    Editor = NULL;
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Editor = ( struct XFSKfsFileEditor * ) self;
+
+    if ( Editor -> File == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KFileReadAll (
+                    Editor -> File,
+                    Offset,
+                    Buffer,
+                    SizeToRead,
+                    NumReaded
+                    );
+
+/* here may be debutt */
+
+    return RCt;
+}   /* _KfsFile_read_v1 () */
+
+static
+rc_t CC
+_KfsFile_write_v1 (
+                    const struct XFSFileEditor * self,
+                    uint64_t Offset,
+                    const void * Buffer,
+                    size_t SizeToWrite,
+                    size_t * NumWritten
+)
+{
+    struct XFSKfsFileEditor * Editor;
+    rc_t RCt;
+
+    Editor = NULL;
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Editor = ( struct XFSKfsFileEditor * ) self;
+
+    if ( Editor -> File == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KFileWriteAll (
+                    Editor -> File,
+                    Offset,
+                    Buffer,
+                    SizeToWrite,
+                    NumWritten
+                    );
+
+
+/* here may be debutt */
+
+    return RCt;
+}   /* _KfsFile_write_v1 () */
+
+static
+rc_t CC
+_KfsFile_size_v1 (
+                        const struct XFSFileEditor * self,
+                        uint64_t * Size
+)
+{
+    const struct XFSKfsNode * Node;
+    KDirectory * NativeDir;
+    const struct KFile * File;
+    uint64_t TempSize;
+    rc_t RCt;
+
+    Node = NULL;
+    NativeDir = NULL;
+    File = NULL;
+    TempSize = 0;
+    RCt = 0;
+
+    XFS_CSA ( Size, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Size )
+
+    Node = ( const struct XFSKfsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> type != kxfsFile ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    File = ( ( struct XFSKfsFileEditor * ) self ) -> File;
+    if ( File == NULL ) {
+        RCt = KDirectoryNativeDir ( & NativeDir );
+        if ( RCt == 0 ) {
+            RCt = KDirectoryFileSize (
+                                NativeDir,
+                                & TempSize,
+                                Node -> path
+                                );
+
+            KDirectoryRelease ( NativeDir );
+        }
+    }
+    else {
+        RCt = KFileSize ( File, & TempSize );
+    }
+    if ( RCt == 0 ) {
+        * Size = TempSize;
+    }
+
+    return RCt;
+}   /* _KfsFile_size_v1 () */
+
+static
+rc_t CC
+_KfsFile_set_size_v1 (
+                const struct XFSFileEditor * self,
+                uint64_t Size
+)
+{
+    rc_t RCt;
+    const struct XFSKfsNode * Node;
+    KDirectory * NativeDir;
+    struct KFile * File;
+
+    RCt = 0;
+    Node = NULL;
+    NativeDir = NULL;
+    File = NULL;
+
+    XFS_CAN ( self )
+
+    Node = ( const struct XFSKfsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> type != kxfsFile ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    File = ( ( struct XFSKfsFileEditor * ) self ) -> File;
+    if ( File == NULL ) {
+
+        RCt = KDirectoryNativeDir ( & NativeDir );
+        if ( RCt == 0 ) {
+            RCt = KDirectorySetFileSize ( NativeDir, Size, Node -> path);
+
+            KDirectoryRelease ( NativeDir );
+        }
+    }
+    else {
+        RCt = KFileSetSize ( File, Size );
+    }
+
+    return RCt;
+}   /*  _KfsFile_set_size_v1 () */
+
+rc_t CC
+_KfsNodeFile_v1 (
+            const struct XFSNode * self,
+            const struct XFSFileEditor ** File
+)
+{
+    rc_t RCt;
+    struct XFSKfsFileEditor * FileEditor;
+    struct XFSFileEditor * Editor;
+
+    RCt = 0;
+    FileEditor = NULL;
+    Editor = NULL;
+
+    if ( self == NULL || File == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * File = NULL;
+
+    if ( ( ( struct XFSKfsNode * ) self ) -> type != kxfsFile ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    FileEditor = calloc ( 1, sizeof ( struct XFSKfsFileEditor ) );
+    if ( FileEditor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    Editor = & ( FileEditor -> Papahen );
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _KfsFile_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> open = _KfsFile_open_v1;
+        Editor -> close = _KfsFile_close_v1;
+        Editor -> read = _KfsFile_read_v1;
+        Editor -> write = _KfsFile_write_v1;
+        Editor -> size = _KfsFile_size_v1;
+        Editor -> set_size = _KfsFile_set_size_v1;
+
+        * File = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _KfsNodeFile_v1 () */
+
+/*)))
+ |||
+ +++  Unified Attr
+ |||
+(((*/
+
+static
+rc_t CC
+_KfsAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_KfsAttr_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSKfsAttrEditor * ) self );
+    }
+
+    return 0;
+}   /* _KfsAttr_dispose_v1 () */
+
+/*))    Something unusual. Will check-initialize NativeDir and Node
+ //     NativeDir and Node could be NULL
+((*/
+static
+rc_t CC
+_KfsAttr_init_check_v1 (
+                    const struct XFSAttrEditor * self,
+                    const struct XFSKfsNode ** Node,
+                    KDirectory ** NativeDir
+
+)
+{
+    rc_t RCt;
+    const struct XFSKfsNode * RetNode;
+    KDirectory * Dir;
+
+    RCt = 0;
+    RetNode = NULL;
+    Dir = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( NativeDir != NULL ) {
+        * NativeDir = NULL;
+    }
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RetNode = ( const struct XFSKfsNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    if ( RetNode == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( RetNode -> path == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( NativeDir != NULL ) {
+        RCt = KDirectoryNativeDir ( & Dir );
+        if ( RCt == 0 ) {
+            * NativeDir = Dir;
+        }
+    }
+
+    if ( RCt == 0 ) {
+        if ( Node != NULL ) {
+            * Node = RetNode;
+        }
+    }
+
+    return RCt;
+}   /* _KfsAttr_init_check_v1 () */
+
+static
+rc_t CC
+_KfsAttr_permissions_v1 (
+                        const struct XFSAttrEditor * self,
+                        const char ** Permissions
+)
+{
+    const struct XFSKfsNode * Node;
+    KDirectory * NativeDir;
+    uint32_t Access;
+    char * BF;
+    rc_t RCt;
+
+    Node = NULL;
+    NativeDir = NULL;
+    BF = NULL;
+    RCt = 0;
+
+    if ( Permissions == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Permissions = NULL;
+
+    RCt = _KfsAttr_init_check_v1 ( self, & Node, & NativeDir );
+    if ( RCt == 0 ) {
+        if ( Node -> perm != NULL ) {
+            * Permissions = Node -> perm;
+        }
+        else {
+            RCt = KDirectoryAccess ( NativeDir, & Access, Node -> path );
+            if ( RCt == 0 ) {
+                BF = ( ( struct XFSKfsAttrEditor * ) self ) -> perm;
+                RCt = XFSPermToChar (
+                                    Access,
+                                    BF,
+                                    sizeof ( ( ( struct XFSKfsAttrEditor * ) self ) -> perm )
+                                    );
+                if ( RCt == 0 ) {
+                    if ( Node -> type == kxfsDir ) {
+                        BF [ 0 ] = 'r';
+                        BF [ 2 ] = 'x';
+                    }
+
+                    * Permissions = ( const char * ) BF;
+                }
+            }
+        }
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _KfsAttr_permissions_v1 () */
+
+static
+rc_t CC
+_KfsAttr_set_permissions_v1 (
+                        const struct XFSAttrEditor * self,
+                        const char * Permissions
+)
+{
+    rc_t RCt;
+    const struct XFSKfsNode * Node;
+    KDirectory * NativeDir;
+    uint32_t Access;
+
+    RCt = 0;
+    NativeDir = NULL;
+    Node = NULL;
+
+    if ( Permissions == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = _KfsAttr_init_check_v1 ( self, & Node, & NativeDir );
+    if ( RCt == 0 ) {
+        if ( Node -> perm != NULL ) {
+            RCt = XFSPermToNum ( Node -> perm, & Access );
+        }
+        else {
+            RCt = XFSPermToNum ( Permissions, & Access );
+        }
+        if ( RCt == 0 ) {
+            RCt = KDirectorySetAccess (
+                                    NativeDir,
+                                    false,
+                                    Access,
+                                    Access,
+                                    Node -> path
+                                    );
+        }
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /*  _KfsAttr_set_permissions_v1 () */
+
+static
+rc_t CC
+_KfsAttr_date_v1 (
+                        const struct XFSAttrEditor * self,
+                        KTime_t * Time
+)
+{
+    const struct XFSKfsNode * Node;
+    KDirectory * NativeDir;
+    KTime_t TempTime;
+    rc_t RCt;
+
+    Node = NULL;
+    NativeDir = NULL;
+    TempTime = 0;
+    RCt = 0;
+
+    if ( Time == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Time = 0;
+
+    RCt = _KfsAttr_init_check_v1 ( self, & Node, & NativeDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryDate ( NativeDir, & TempTime, Node -> path );
+        if ( RCt == 0 ) {
+            * Time = TempTime;
+        }
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _KfsAttr_date_v1 () */
+
+static
+rc_t CC
+_KfsAttr_set_date_v1 (
+                const struct XFSAttrEditor * self,
+                KTime_t Time
+)
+{
+    rc_t RCt;
+    const struct XFSKfsNode * Node;
+    KDirectory * NativeDir;
+
+    RCt = 0;
+    NativeDir = NULL;
+    Node = NULL;
+
+    RCt = _KfsAttr_init_check_v1 ( self, & Node, & NativeDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectorySetDate ( NativeDir, true, Time, Node -> path );
+        
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /*  _KfsAttr_set_date_v1 () */
+
+static
+rc_t CC
+_KfsAttr_type_v1 (
+                        const struct XFSAttrEditor * self,
+                        XFSNType * Type
+)
+{
+    const struct XFSKfsNode * Node;
+    rc_t RCt;
+
+    Node = NULL;
+    RCt = 0;
+
+    if ( Type == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Type = kxfsFile;
+
+    RCt = _KfsAttr_init_check_v1 ( self, & Node, NULL );
+    if ( RCt == 0 ) {
+        * Type = Node -> type;
+    }
+
+    return RCt;
+}   /* _KfsAttr_type_v1 () */
+
+static
+rc_t CC
+_KfsNodeAttr_v1 (
+            const struct XFSNode * self,
+            const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct XFSKfsAttrEditor * KfsEditor;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    KfsEditor = NULL;
+    Editor = NULL;
+
+    if ( self == NULL || Attr == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Attr = NULL;
+
+    KfsEditor = calloc ( 1, sizeof ( struct XFSKfsAttrEditor ) );
+    if ( KfsEditor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    Editor = & ( KfsEditor -> Papahen );
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _KfsAttr_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> permissions = _KfsAttr_permissions_v1;
+        Editor -> set_permissions = _KfsAttr_set_permissions_v1;
+        Editor -> date = _KfsAttr_date_v1;
+        Editor -> set_date = _KfsAttr_set_date_v1;
+        Editor -> type = _KfsAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( KfsEditor );
+    }
+
+    return RCt;
+}   /* _KfsNodeAttr_v1 () */
+
+/*)))
+ |||
+ +++  Unified Discribe
+ |||
+(((*/
+
+rc_t CC
+_KfsNodeDescribe_v1 (
+            const struct XFSNode * self,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+    const char * Abbr;
+
+    RCt = 0;
+    NumWrit = 0;
+    Abbr = NULL;
+
+    if ( Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Abbr = ( ( const struct XFSKfsNode * ) self ) -> type == kxfsDir
+            ? "DIR"
+            : "FILE"
+            ;
+
+    if ( self == NULL ) {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[NULL][NULL]",
+                    Abbr
+                    );
+    }
+    else {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[%s][0x%p]",
+                    Abbr,
+                    self -> Name,
+                    self
+                    );
+    }
+
+    return RCt;
+}   /* _KfsNodeDescribe_v1 () */
+
+/*)))
+ |||
+ +++    FileNode lives here
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+static
+rc_t CC
+_KfsNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            XFSNType Type,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSKfsNode * TheNode;
+    const char * NodeName;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+
+    if ( Model == NULL || Template == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Node = NULL;
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    RCt = XFSKfsNodeMakeEx (
+                    & TheNode,
+                    Type,
+                    NodeName,
+                    XFSModelNodeProperty ( Template, XFS_MODEL_SOURCE ),
+                    XFSModelNodeSecurity ( Template )
+                    );
+    if ( RCt == 0 ) {
+        * Node = ( struct XFSNode * ) TheNode;
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSKfsNodeDispose ( TheNode );
+        }
+    }
+
+    return RCt;
+}   /* _KfsNodeConstructor () */
+
+/*)))
+ |||
+ +++    Non-Teleport methods to create nodes
+ |||
+(((*/
+LIB_EXPORT
+rc_t CC
+XFSFileNodeMakeHandle (
+                    const struct XFSHandle ** Handle,
+                    struct XFSNode * FileNode,
+                    struct KFile * File
+)
+{
+    rc_t RCt;
+    const struct XFSHandle * TheHandle;
+    struct XFSKfsFileEditor * Editor;
+
+    RCt = 0;
+    TheHandle = NULL;
+    Editor = NULL;
+
+    XFS_CSAN ( Handle )
+    XFS_CAN ( Handle )
+    XFS_CAN ( FileNode )
+    XFS_CAN ( File )
+
+    RCt = XFSNodeFileEditor (
+                        FileNode,
+                        ( const struct XFSFileEditor ** ) & Editor
+                        );
+    if ( RCt == 0 ) {
+        Editor -> File = File;
+
+        RCt = XFSHandleMake ( FileNode,  & TheHandle );
+        if ( RCt == 0 ) {
+            XFSHandleSet ( TheHandle, Editor );
+
+            * Handle = TheHandle;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Handle = NULL;
+
+        if ( TheHandle != NULL ) {
+            XFSHandleRelease ( TheHandle );
+        }
+        else {
+            if ( Editor != NULL ) {
+                XFSEditorDispose ( ( const struct XFSEditor * ) Editor );
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFSFileNodeMakeHandle () */
+
+LIB_EXPORT
+rc_t CC
+XFSFileNodeMake (
+            struct XFSNode ** Node,
+            const char * Path,
+            const char * Name,
+            const char * Perm
+)
+{
+    rc_t RCt;
+    struct XFSKfsNode * TheNode;
+
+    RCt = 0;
+    TheNode = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Path == NULL || Name == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSKfsNodeMakeEx ( & TheNode, kxfsFile, Name, Path, Perm );
+    if ( RCt == 0 ) {
+        * Node = & ( TheNode -> node );
+    }
+
+    return RCt;
+}   /* XFSFileNodeMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSDirNodeMake (
+            struct XFSNode ** Node,
+            const char * Path,
+            const char * Name,
+            const char * Perm
+)
+{
+    rc_t RCt;
+    struct XFSKfsNode * TheNode;
+
+    RCt = 0;
+    TheNode = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Path == NULL || Name == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSKfsNodeMakeEx ( & TheNode, kxfsDir, Name, Path, Perm );
+    if ( RCt == 0 ) {
+        * Node = & ( TheNode -> node );
+    }
+
+    return RCt;
+}   /* XFSDirNodeMake () */
+
+/*)))
+ |||
+ +++    FileNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_FileNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = _KfsNodeConstructor (
+                            Model,
+                            Template,
+                            Alias,
+                            kxfsFile,
+                            Node
+                            );
+
+/*
+pLogMsg ( klogDebug, "_FileNodeConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,templat=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _FileNodeConstructor () */
+
+static
+rc_t CC
+_FileNodeValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_FileNodeValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,templat=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _FileNodeValidator () */
+
+static const struct XFSTeleport _sFileNodeTeleport = {
+                                        _FileNodeConstructor,
+                                        _FileNodeValidator,
+                                        false
+                                        };
+
+
+LIB_EXPORT
+rc_t CC
+XFSFileProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sFileNodeTeleport;
+
+    return 0;
+}   /* XFSFileProvider () */
+
+/*)))
+ |||
+ +++    DirNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_DirNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = _KfsNodeConstructor (
+                            Model,
+                            Template,
+                            Alias,
+                            kxfsDir,
+                            Node
+                            );
+
+/*
+pLogMsg ( klogDebug, "_DirNodeConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,templat=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _DirNodeConstructor () */
+
+static
+rc_t CC
+_DirNodeValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_DirNodeValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,templat=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _DirNodeValidator () */
+
+static const struct XFSTeleport _sDirNodeTeleport = {
+                                            _DirNodeConstructor,
+                                            _DirNodeValidator,
+                                            false
+                                            };
+
+
+LIB_EXPORT
+rc_t CC
+XFSDirectoryProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sDirNodeTeleport;
+
+    return 0;
+}   /* XFSDirectoryProvider () */
+
diff --git a/libs/xfs/lockdpt.c b/libs/xfs/lockdpt.c
new file mode 100644
index 0000000..27a3d33
--- /dev/null
+++ b/libs/xfs/lockdpt.c
@@ -0,0 +1,192 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <kproc/lock.h>
+
+#include "schwarzschraube.h"
+#include "lockdpt.h"
+#include "zehr.h"
+
+#include <sysalloc.h>
+
+
+/*||*\
+  || Lyrics:
+  || The will be array of KLock instances and lock will be acquired
+  || by hash value
+\*||*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)) XFSLockDepot structure is living here
+ ((*/
+
+struct XFSLockDepot {
+    struct KLock ** mutabors;
+    uint32_t qty;
+};
+
+LIB_EXPORT
+rc_t CC
+XFSLockDepotMake ( uint32_t DepotSize, struct XFSLockDepot ** Depot )
+{
+    rc_t RCt;
+    struct XFSLockDepot * RetDepot;
+    struct KLock * Lock;
+    uint32_t llp;
+
+    RCt = 0;
+    RetDepot = NULL;
+    Lock = NULL;
+    llp = 0;
+
+    if ( Depot != NULL ) {
+        * Depot = NULL;
+    }
+
+    if ( Depot == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( DepotSize == 0 ) {
+        DepotSize = XFS_DEFAULT_DEPOT_SIZE;
+    }
+
+    RetDepot = calloc ( 1, sizeof ( struct XFSLockDepot ) );
+    if ( RetDepot == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RetDepot -> qty = DepotSize;
+
+    RetDepot -> mutabors = calloc (
+                            RetDepot -> qty,
+                            sizeof ( struct KLock * )
+                            );
+    if ( RetDepot -> mutabors == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+
+    if ( RCt == 0 ) {
+        for ( llp = 0; llp < RetDepot -> qty; llp ++ ) {
+            RCt = KLockMake ( & Lock );
+            if ( RCt != 0 ) {
+                break;
+            }
+
+            RetDepot -> mutabors [ llp ] = Lock;
+        }
+
+        if ( RCt == 0 ) {
+            * Depot = RetDepot;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        XFSLockDepotDispose ( RetDepot );
+
+        RetDepot = NULL;
+        * Depot = NULL;
+    }
+
+    return RCt;
+}   /*  XFSLockDepotMake () */
+
+    /*\ I am going to drop all bad LOCKS, so return 0 on any
+    |*| ocassion and will think later
+    \*/
+LIB_EXPORT
+rc_t CC
+XFSLockDepotDispose ( struct XFSLockDepot * self )
+{
+    uint32_t llp;
+    struct KLock * Lock;
+
+    llp = 0;
+    Lock = NULL;
+
+    if ( self == NULL ) {
+        return 0;
+    }
+
+        /*\ variable qty is initialize at first place, so it is
+        |*| safe to check it first
+        \*/
+    if ( self -> qty != 0 ) {
+        if ( self -> mutabors != NULL ) {
+            for ( llp = 0; llp < self -> qty; llp ++ ) {
+                Lock = self -> mutabors [ llp ];
+                if ( Lock != NULL ) {
+                    KLockRelease ( Lock );
+                }
+
+                self -> mutabors [ llp ] = NULL;
+            }
+
+            free ( self -> mutabors );
+
+            self -> mutabors = NULL;
+        }
+
+        self -> qty = 0;
+    }
+
+    free ( self );
+
+    return 0;
+}   /* XFSLockDepotDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSLockDepotAcquire ( struct XFSLockDepot * self, uint32_t HashValue )
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> qty == 0 || self -> mutabors == NULL ) {
+        return XFS_RC ( rcInvalid );
+    } 
+
+    return KLockAcquire ( self -> mutabors [ HashValue % self -> qty ] );
+}   /* XFSLockDepotAcquire () */
+
+LIB_EXPORT
+rc_t CC
+XFSLockDepotUnlock ( struct XFSLockDepot * self, uint32_t HashValue )
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> qty == 0 || self -> mutabors == NULL ) {
+        return XFS_RC ( rcInvalid );
+    } 
+
+    return KLockUnlock ( self -> mutabors [ HashValue % self -> qty ] );
+}   /* XFSLockDepotUnlock () */
diff --git a/libs/xfs/lockdpt.h b/libs/xfs/lockdpt.h
new file mode 100644
index 0000000..6a0d321
--- /dev/null
+++ b/libs/xfs/lockdpt.h
@@ -0,0 +1,76 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _lockdpt_h_
+#define _lockdpt_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   I suppose here could be many different items to lock, and I
+  ))))  want to reduce amount of mutexes
+ ((((
+  ))))  In general, there will be array of mutexes, and user will be
+ ((((   able to lock/unlock processing by providing the mutex number
+  ))))
+ ((((*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSLockDepot;
+
+#define XFS_DEFAULT_DEPOT_SIZE  256
+
+    /*)) If DepotSize == 0, it will produce array of
+     //  XFS_DEFAULT_DEPOT_SIZE locks
+    ((*/
+XFS_EXTERN rc_t CC XFSLockDepotMake (
+                                uint32_t DepotSize,
+                                struct XFSLockDepot ** Depot
+                                );
+XFS_EXTERN rc_t CC XFSLockDepotDispose (
+                                struct XFSLockDepot * self
+                                );
+
+XFS_EXTERN rc_t CC XFSLockDepotAcquire (
+                                struct XFSLockDepot * self,
+                                uint32_t HashValue
+                                );
+XFS_EXTERN rc_t CC XFSLockDepotUnlock (
+                                struct XFSLockDepot * self,
+                                uint32_t HashValue
+                                );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _lockdpt_h_ */
diff --git a/libs/xfs/lreader.c b/libs/xfs/lreader.c
new file mode 100644
index 0000000..c8e812c
--- /dev/null
+++ b/libs/xfs/lreader.c
@@ -0,0 +1,459 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+
+#include <va_copy.h>
+
+#include "lreader.h"
+#include "schwarzschraube.h"
+
+#include <sysalloc.h>
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))    Struct itself
+ ((*/
+struct XFSLineReader {
+    KRefcount refcount;
+
+    const struct KMMap * map;
+
+    size_t size;
+    const char * start;
+    const char * curr_line;
+    size_t curr_len;
+    size_t curr_no;
+};
+
+static const char * _sXFSLineReader_classname = "XFSLineReader";
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)) Kinda basic method
+ ((*/
+static
+rc_t CC
+_LineLen ( const char * Begin, const char * End, size_t * Len )
+{
+    const char * Pos = Begin;
+
+    if ( Len != NULL ) {
+        * Len = 0;
+    }
+
+    if ( Pos == NULL || End == NULL || Len == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( End <= Pos ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    while ( Pos < End ) {
+        if ( * Pos == '\n' ) {
+            break;
+        }
+
+        Pos ++;
+    }
+
+    * Len = Pos - Begin;
+
+    return 0;
+}   /* _LineLen () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static
+rc_t CC
+_LineReaderDispose ( const struct XFSLineReader * self )
+{
+    struct XFSLineReader * Reader = ( struct XFSLineReader * ) self;
+
+    if ( Reader != NULL ) {
+        KRefcountWhack (
+                    & ( Reader -> refcount ),
+                    _sXFSLineReader_classname
+                    );
+
+        if ( Reader -> map != NULL ) {
+            KMMapRelease ( Reader -> map );
+            Reader -> map = NULL;
+        }
+
+        Reader -> size = 0;
+        Reader -> start = Reader -> curr_line = 0;
+        Reader -> curr_len = Reader -> curr_no = 0;
+
+        free ( Reader );
+    }
+
+    return 0;
+}   /* XFSLineReaderDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSLineReaderOpen (
+                const struct XFSLineReader ** Reader,
+                const char * Path,
+                ...
+)
+{
+    rc_t RCt;
+    va_list Args;
+
+    RCt = 0;
+
+    va_start ( Args, Path );
+
+    RCt = XFSLineReaderVOpen ( Reader, Path, Args );
+
+    va_end ( Args );
+
+    return RCt;
+}   /* XFSLineReaderOpen () */
+
+LIB_EXPORT
+rc_t CC
+XFSLineReaderVOpen (
+                const struct XFSLineReader ** Reader,
+                const char * Path,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct KDirectory * NatDir;
+    const struct KFile * File;
+    va_list xArgs;
+
+    RCt = 0;
+    NatDir = NULL;
+    File = NULL;
+
+    XFS_CSAN ( Reader )
+    XFS_CAN ( Path )
+    XFS_CAN ( Reader )
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+
+        va_copy ( xArgs, Args );
+        RCt = KDirectoryVOpenFileRead ( NatDir, & File, Path, xArgs );
+        va_end ( xArgs );
+        if ( RCt == 0 ) {
+
+            RCt = XFSLineReaderMake ( File, Reader );
+
+            KFileRelease ( File );  /* Will release file here */
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* XFSLineReaderVOpen () */
+
+LIB_EXPORT
+rc_t CC
+XFSLineReaderMake (
+                const struct KFile * File,
+                const struct XFSLineReader ** Reader
+)
+{
+    rc_t RCt;
+    struct XFSLineReader * RetVal;
+    const struct KMMap * Map;
+    size_t MapSize, LineLen;
+    const void * Addr;
+
+    RCt = 0;
+    RetVal = NULL;
+    Map = NULL;
+    MapSize = LineLen = 0;
+    Addr = NULL;
+
+    XFS_CSAN ( Reader )
+    XFS_CAN ( File )
+    XFS_CAN ( Reader )
+
+    RetVal = calloc ( 1, sizeof ( struct XFSLineReader ) );
+    if ( RetVal == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = KMMapMakeRead ( & Map, File );
+    if ( RCt == 0 ) {
+        RCt = KMMapSize ( Map, & MapSize );
+        if ( RCt == 0 ) {
+            if ( 0 < MapSize ) {
+                RCt = KMMapAddrRead ( Map, & Addr );
+            }
+            else {
+                Addr = NULL;
+            }
+
+            if ( RCt == 0 ) {
+                KRefcountInit (
+                            & ( RetVal -> refcount ),
+                            1,
+                            _sXFSLineReader_classname,
+                            "LineReaderMake",
+                            "LineReader"
+                            );
+
+
+                RetVal -> map = Map;
+                RetVal -> size = MapSize;
+                RetVal -> start = ( const char * ) Addr;
+
+                XFSLineReaderRewind ( RetVal );
+
+                * Reader = RetVal;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Reader = NULL;
+
+        if ( RetVal != NULL ) {
+            _LineReaderDispose ( RetVal );
+        }
+    }
+
+    return RCt;
+}   /* XFSLineReaderMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSLineReaderAddRef ( const struct XFSLineReader * self )
+{
+    rc_t RCt;
+    struct XFSLineReader * Reader;
+    int Refc;
+
+    RCt = 0;
+    Reader = ( struct XFSLineReader * ) self;
+    Refc = 0;
+
+    if ( Reader == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Refc = KRefcountAdd (
+                        & ( Reader -> refcount ),
+                        _sXFSLineReader_classname
+                        );
+    switch ( Refc ) {
+        case krefOkay :
+                    RCt = 0;
+                    break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSLineReaderAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSLineReaderRelease ( const struct XFSLineReader * self )
+{
+    rc_t RCt;
+    int Refc;
+    struct XFSLineReader * Reader;
+
+    RCt = 0;
+    Refc = 0;
+    Reader = ( struct XFSLineReader * ) self;
+
+    if ( Reader == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Refc = KRefcountDrop (
+                        & ( Reader -> refcount ),
+                        _sXFSLineReader_classname
+                        );
+    switch ( Refc ) {
+        case krefOkay :
+        case krefZero :
+                    RCt = 0;
+                    break;
+        case krefWhack :
+                    RCt = _LineReaderDispose ( self );
+                    break;
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSLineReaderRelease () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+LIB_EXPORT
+bool CC
+XFSLineReaderGood ( const struct XFSLineReader * self )
+{
+    if ( self != NULL ) {
+        if ( self -> start != NULL ) {
+            return true;
+        }
+    }
+    return false;
+}   /* XFSLineReaderGood () */
+
+LIB_EXPORT
+bool CC
+XFSLineReaderNext ( const struct XFSLineReader * self )
+{
+    const char * NewLineStart, * LineEnd;
+    size_t NewLineLen;
+    struct XFSLineReader * Reader;
+
+    NewLineStart = LineEnd = NULL;
+    NewLineLen = 0;
+    Reader = ( struct XFSLineReader * ) self;
+
+    if ( ! XFSLineReaderGood ( self ) ) {
+        return false;
+    }
+
+    LineEnd = self -> start + self -> size;
+    NewLineStart = self -> curr_line + Reader -> curr_len + 1;
+
+    if ( NewLineStart < LineEnd ) {
+        if ( _LineLen ( NewLineStart, LineEnd, & NewLineLen ) == 0 ) {
+            Reader -> curr_line = NewLineStart;
+            Reader -> curr_len = NewLineLen;
+            Reader -> curr_no ++;
+
+            return true;
+        }
+    }
+
+    return false;
+}   /* XFSLineReaderNext () */
+
+LIB_EXPORT
+rc_t CC
+XFSLineReaderGet (
+            const struct XFSLineReader * self,
+            const struct String * OutLine
+)
+{
+    struct String * TheOutLine = ( struct String * ) OutLine;
+
+    XFS_CAN ( self )
+    XFS_CAN ( OutLine )
+
+    if ( ! XFSLineReaderGood ( self ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    StringInit (
+                TheOutLine,
+                self -> curr_line,
+                self -> curr_len,
+                self -> curr_len
+                );
+
+    return 0;
+}   /* XFSLineReaderGet () */
+
+LIB_EXPORT
+rc_t CC
+XFSLineReaderLineNo (
+            const struct XFSLineReader * self,
+            size_t * LineNo
+)
+{
+    XFS_CSA ( LineNo, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( LineNo )
+
+    if ( ! XFSLineReaderGood ( self ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * LineNo = self -> curr_no;
+
+    return 0;
+}   /* XFSLineReaderLineNo () */
+
+LIB_EXPORT
+rc_t CC
+XFSLineReaderRewind ( const struct XFSLineReader * self )
+{
+    rc_t RCt;
+    size_t Len;
+    struct XFSLineReader * Reader;
+
+    RCt = 0;
+    Len = 0;
+    Reader = ( struct XFSLineReader * ) self;
+
+    XFS_CAN ( self );
+
+    if ( ! XFSLineReaderGood ( self ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = _LineLen (
+                    self -> start,
+                    self -> start + self -> size,
+                    & Len
+                    );
+    if ( RCt == 0 ) {
+        Reader -> curr_line = self -> start;
+        Reader -> curr_len = Len;
+        Reader -> curr_no = 0;
+    }
+
+    return RCt;
+}   /* XFSLineReaderRewind () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
diff --git a/libs/xfs/lreader.h b/libs/xfs/lreader.h
new file mode 100644
index 0000000..77f625d
--- /dev/null
+++ b/libs/xfs/lreader.h
@@ -0,0 +1,117 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _lreader_h_
+#define _lreader_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   Simple line reader
+  ))))
+ ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* Lyrics:                                                           */
+/* Liner reader creates KMMap over KFile and traverces trhough map   */
+/* NOTE: it translates file position, eg. it cuts '\n' at the end    */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))    Forwards
+ ((*/
+struct XFSLineReader;
+struct KFile;
+
+/*))    Opening/creating/disposing
+ ((*/
+XFS_EXTERN rc_t CC XFSLineReaderOpen (
+                                const struct XFSLineReader ** Reader,
+                                const char * Path,
+                                ...
+                                );
+XFS_EXTERN rc_t CC XFSLineReaderVOpen (
+                                const struct XFSLineReader ** Reader,
+                                const char * Path,
+                                va_list Args
+                                );
+XFS_EXTERN rc_t CC XFSLineReaderMake (
+                                const struct KFile * File,
+                                const struct XFSLineReader ** Reader
+                                );
+
+XFS_EXTERN rc_t CC XFSLineReaderAddRef (
+                                const struct XFSLineReader * self
+                                );
+XFS_EXTERN rc_t CC XFSLineReaderRelease (
+                                const struct XFSLineReader * self
+                                );
+
+/*))    Using and data accessing
+ ((*/
+XFS_EXTERN bool CC XFSLineReaderGood (
+                                const struct XFSLineReader * self
+                                );
+
+    /*  If it is possible to fetch a line it moves cursor to next
+     *  line and returns true. Overvise it will return false.
+     */
+XFS_EXTERN bool CC XFSLineReaderNext (
+                                const struct XFSLineReader * self
+                                );
+
+    /*  Fetches line at current cursor and fills OutLine structure
+     */
+XFS_EXTERN rc_t CC XFSLineReaderGet (
+                                const struct XFSLineReader * self,
+                                const struct String * OutLine
+                                );
+
+    /*  Return number of line where cursor is set
+     */
+XFS_EXTERN rc_t CC XFSLineReaderLineNo (
+                                const struct XFSLineReader * self,
+                                size_t * LineNo
+                                );
+
+    /*  Set current cursor to begin of map
+     */
+XFS_EXTERN rc_t CC XFSLineReaderRewind (
+                                const struct XFSLineReader * self
+                                );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _lreader_h_ */
diff --git a/libs/xfs/mehr.c b/libs/xfs/mehr.c
new file mode 100644
index 0000000..0c04bfa
--- /dev/null
+++ b/libs/xfs/mehr.c
@@ -0,0 +1,258 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <kfg/config.h>
+
+#include <kns/manager.h>
+#include <kns/http.h>
+
+
+#include "teleport.h"
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "zehr.h"
+
+#include <sysalloc.h>
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)) Forwards
+ ((*/
+XFS_EXTERN rc_t CC XFSTarDepotInit ();
+XFS_EXTERN rc_t CC XFSTarDepotDispose ();
+XFS_EXTERN rc_t CC XFSEncDepotInit ();
+XFS_EXTERN rc_t CC XFSEncDepotDispose ();
+XFS_EXTERN rc_t CC XFSEncDirectoryDepotInit ();
+XFS_EXTERN rc_t CC XFSEncDirectoryDepotDispose ();
+XFS_EXTERN rc_t CC XFSGapFilesInit ();
+XFS_EXTERN rc_t CC XFSGapFilesDispose ();
+XFS_EXTERN rc_t CC XFS_VfsManagerInit ();
+XFS_EXTERN rc_t CC XFS_VfsManagerDispose ();
+XFS_EXTERN rc_t CC XFS_KnsManagerInit ();
+XFS_EXTERN rc_t CC XFS_KnsManagerDispose ();
+XFS_EXTERN rc_t CC XFSGapKartDepotInit ();
+XFS_EXTERN rc_t CC XFSGapKartDepotDispose ();
+
+/*)) Config and all config related
+ ((*/
+
+static const struct KConfig * _sConfig_MHR = NULL;
+static const char * _sConfigPath_MHR = NULL;
+
+LIB_EXPORT
+rc_t CC
+XFS_InitAll_MHR ( const char * ConfigFile )
+{
+    rc_t RCt;
+    const struct KConfig * Config;
+
+    RCt = 0;
+    Config = NULL;
+
+pLogMsg ( klogInfo, "InitAll [$(path)]", "path=%s", ( ConfigFile == NULL ? "NULL" : ConfigFile ) );
+
+        /* First we do inti config :lol: */
+    RCt = XFS_LoadConfig_ZHR ( ConfigFile, & Config );
+    if ( RCt == 0 ) {
+        _sConfig_MHR = Config;
+        if ( ConfigFile != NULL ) {
+            _sConfigPath_MHR = string_dup_measure ( ConfigFile, NULL );
+        }
+
+        RCt = XFS_VfsManagerInit ();
+
+        if ( RCt == 0 ) {
+            XFS_KnsManagerInit ();
+        }
+
+        if ( RCt == 0 ) {
+            RCt = XFSTeleportInit ();
+        }
+
+        if ( RCt == 0 ) {
+            RCt = XFSTarDepotInit ();
+        }
+
+        if ( RCt == 0 ) {
+            RCt = XFSEncDepotInit ();
+        }
+
+        if ( RCt == 0 ) {
+            RCt = XFSEncDirectoryDepotInit ();
+        }
+
+        if ( RCt == 0 ) {
+            XFSGapFilesInit ();
+        }
+
+        if ( RCt == 0 ) {
+            XFSGapKartDepotInit ();
+        }
+    }
+
+    return RCt;
+}   /* XFS_InitAll_MHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_DisposeAll_MHR ()
+{
+pLogMsg ( klogInfo, "DisposeAll [$(path)]", "path=%s", _sConfigPath_MHR );
+
+    XFSGapKartDepotDispose ();
+
+    XFSGapFilesDispose ();
+
+    XFSEncDirectoryDepotDispose ();
+
+    XFSEncDepotDispose ();
+
+    XFSTarDepotDispose ();
+
+    XFSTeleportDispose ();
+
+    XFS_VfsManagerDispose ();
+
+    XFS_KnsManagerDispose ();
+
+    if ( _sConfig_MHR != NULL ) {
+        KConfigRelease ( _sConfig_MHR );
+
+        _sConfig_MHR = NULL;
+    }
+
+    if ( _sConfigPath_MHR != NULL ) {
+        free ( ( char * ) _sConfigPath_MHR );
+
+        _sConfigPath_MHR = NULL;
+    }
+
+    return 0;
+}   /* XFS_DisposeAll_MHR () */
+
+LIB_EXPORT
+const struct KConfig * CC
+XFS_Config_MHR ()
+{
+    return _sConfig_MHR;
+}   /* XFS_Config_MHR () */
+
+LIB_EXPORT
+const char * CC
+XFS_ConfigPath_MHR ()
+{
+    return _sConfigPath_MHR;
+}   /* XFS_ConfigPath_MHR () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //  That method will try open resource for reading local or remote
+((*/
+LIB_EXPORT
+rc_t CC
+XFS_OpenResourceRead_MHR (
+                        const char * Resource,
+                        const struct KFile ** RetFile
+)
+{
+    rc_t RCt;
+    const struct KNSManager * knsManager;
+    const struct KFile * File;
+    struct KDirectory * Directory;
+
+    RCt = 0;
+    knsManager = NULL;
+    File = NULL;
+
+        /* Standard check */
+    if ( Resource == NULL || RetFile == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * RetFile = NULL;
+
+    if ( strstr ( Resource, "http" ) == Resource ) {
+            /* That is stupid, but ... prolly this is URL */
+        knsManager = XFS_KnsManager ();
+        if ( knsManager == NULL ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        if ( RCt == 0 ) {
+            RCt = KNSManagerMakeHttpFile (
+                                knsManager,
+                                & File,
+                                NULL, /* doing that in absence conn */
+                                0x01010000,
+                                Resource
+                                );
+            if ( RCt != 0 ) {
+                /* We failed to load it remotely, may be it is local */
+                File = NULL;
+                RCt = 0;
+            }
+
+            KNSManagerRelease ( knsManager );
+        }
+    }
+
+        /* And here we are */
+    if ( File == NULL ) {
+        RCt = KDirectoryNativeDir ( & Directory );
+        if ( RCt == 0 ) {
+            RCt = KDirectoryOpenFileRead (
+                                    Directory,
+                                    & File,
+                                    Resource
+                                    );
+
+            KDirectoryRelease ( Directory );
+        }
+    }
+
+    if ( RCt == 0 ) {
+        * RetFile = File;
+    }
+
+    return RCt;
+}   /* XFS_OpenResourceRead_MHR () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
diff --git a/libs/xfs/mehr.h b/libs/xfs/mehr.h
new file mode 100644
index 0000000..f3a416b
--- /dev/null
+++ b/libs/xfs/mehr.h
@@ -0,0 +1,77 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _mehr_h_
+#define _mehr_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   Thif fail contains temporary methods and definitions, which
+  ))))  should be replaced/removed in future.
+ ((((     All names in that file ends with _MHR
+  ))))
+ ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))  Config, and config related. Will use mainstream later.
+ ((*/
+
+struct KConfig;
+
+XFS_EXTERN rc_t CC XFS_InitAll_MHR ( const char * ConfigFile );
+
+XFS_EXTERN rc_t CC XFS_DisposeAll_MHR ();
+
+XFS_EXTERN const struct KConfig * XFS_Config_MHR ();
+
+XFS_EXTERN const char * XFS_ConfigPath_MHR ();
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))  Fancy I/O
+ ((*/
+struct KFile;
+
+XFS_EXTERN rc_t CC XFS_OpenResourceRead_MHR (
+                            const char * Resource,
+                            const struct KFile ** File
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _mehr_h_ */
diff --git a/libs/xfs/model.c b/libs/xfs/model.c
new file mode 100644
index 0000000..524acfd
--- /dev/null
+++ b/libs/xfs/model.c
@@ -0,0 +1,1157 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/namelist.h>
+#include <klib/log.h>
+
+#include <kfg/config.h>
+
+#include <xfs/model.h>
+
+#include "owp.h"
+#include "mehr.h"
+#include "zehr.h"
+#include "schwarzschraube.h"
+
+#include <sysalloc.h>
+
+/*)))
+ |||
+ +++    Model and other
+ |||
+(((*/
+
+/*)
+ /      Useful farriables
+(*/
+static const char * _sXFSNodePath = "xfs";
+static const char * _sXFSNodeModel = "model";
+static const char * _sXFSModel_classname = "XFSModel";
+
+/*)))
+ |||
+ +++    We suppose that there could exists several models, so ... Refs
+ |||
+(((*/
+struct XFSModel {
+    BSTree tree;
+    KRefcount refcount;
+
+    const char * Resource;
+    const char * Version;
+};
+
+struct XFSModelNode {
+    BSTNode node;
+
+        /*)   the only property, which could not be overriden
+         (*/
+    const char * Name;
+
+        /*)   all model node properties except 'children'
+         (*/
+    struct XFSOwp * Properties;
+
+        /*)   there will be chidlren with labels
+         (*/
+    struct XFSOwp * Children;
+
+    bool IsRoot;
+};
+
+/*)))
+ ///    ModelNode Make and Destroy
+(((*/
+
+LIB_EXPORT
+const char * CC
+XFSModelNodeName ( const struct XFSModelNode * self )
+{
+    return self == NULL ? NULL : ( self -> Name );
+}   /* XFSModelNodeName () */
+
+LIB_EXPORT
+const char * CC
+XFSModelNodeType ( const struct XFSModelNode * self )
+{
+    return XFSModelNodeProperty ( self, XFS_MODEL_TYPE );
+}   /* XFSModelNodeType () */
+
+LIB_EXPORT
+bool CC
+XFSModelNodeReadOnly ( const struct XFSModelNode * self )
+{
+    const char * Mode = XFSModelNodeProperty ( self, XFS_MODEL_MODE );
+    if ( Mode == NULL ) {
+        return false;
+    }
+    return strcmp ( Mode, XFS_MODEL_MODE_RO ) == 0;
+}   /* XFSModelNodeReadOnly () */
+
+LIB_EXPORT
+const char * CC
+XFSModelNodeAs ( const struct XFSModelNode * self )
+{
+    return XFSModelNodeProperty ( self, XFS_MODEL_AS );
+}   /* XFSModelNodeAs () */
+
+LIB_EXPORT
+const char * CC
+XFSModelNodeLabel ( const struct XFSModelNode * self )
+{
+    return XFSModelNodeProperty ( self, XFS_MODEL_LABEL );
+}   /* XFSModelNodeLabel () */
+
+LIB_EXPORT
+const char * CC
+XFSModelNodeSecurity ( const struct XFSModelNode * self )
+{
+    return XFSModelNodeProperty ( self, XFS_MODEL_SECURITY );
+}   /* XFSModelNodeSecurity () */
+
+LIB_EXPORT
+bool CC
+XFSModelNodeIsRoot ( const struct XFSModelNode * self )
+{
+    const char * Name;
+
+    Name = XFSModelNodeName ( self );
+
+    if ( Name != NULL ) {
+        if ( strcmp ( Name, XFS_MODEL_ROOT ) == 0 ) {
+            return true;
+        }
+    }
+
+    return Name == NULL
+                    ? false
+                    : ( strcmp ( Name, XFS_MODEL_ROOT ) == 0 )
+                    ;
+}   /* XFSModelNodeIsRoot () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelNodePropertyNames (
+                    const struct XFSModelNode * self,
+                    const struct KNamelist ** Properties
+)
+{
+    if ( self == NULL || Properties == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Properties = NULL;
+
+    if ( self -> Properties == NULL ) {
+        return 0;
+    }
+
+    return XFSOwpListKeys ( self -> Properties, Properties );
+}   /* XFSModelNodeListProperties () */
+
+LIB_EXPORT
+const char * CC
+XFSModelNodeProperty (
+                    const struct XFSModelNode * self,
+                    const char * PropertyName
+)
+{
+    return self == NULL
+                ? NULL
+                : XFSOwpGet ( self -> Properties, PropertyName )
+                ;
+}   /* XFSModelNodeProperty () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelNodeChildrenNames (
+                    const struct XFSModelNode * self,
+                    const struct KNamelist ** Children
+)
+{
+    if ( self == NULL || Children == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Children = NULL;
+
+    if ( self -> Children == NULL ) {
+        return 0;
+    }
+
+    return XFSOwpListKeys ( self -> Children, Children );
+}   /* XFSModelNodeChildrenNames () */
+
+LIB_EXPORT
+const char * CC
+XFSModelNodeChildAlias (
+                    const struct XFSModelNode * self,
+                    const char * ChildName
+)
+{
+    return self == NULL
+                ? NULL
+                : XFSOwpGet ( self -> Children, ChildName )
+                ;
+}   /* XFSModelNodeChildAlias () */
+
+static
+rc_t CC
+_XFSModelNodeDispose ( struct XFSModelNode * Node )
+{
+
+/*
+pLogMsg ( klogDebug, "_XFSModelNodeDispose ( $(node), \"$(name)\" )", "node=%p,name=%s", ( void * ) Node, ( Node -> Name == NULL ? "NULL" : ( Node -> Name ) ) );
+*/
+    if ( Node == NULL ) {
+            /* It is already disposed */
+        return 0;
+    }
+
+    if ( Node -> Name != NULL ) {
+        free ( ( char * ) Node -> Name );
+        Node -> Name = NULL;
+    }
+
+    if ( Node -> Properties != NULL ) {
+        XFSOwpDispose ( Node -> Properties );
+        Node -> Properties = NULL;
+    }
+
+    if ( Node -> Children != NULL ) {
+        XFSOwpDispose ( Node -> Children );
+        Node -> Children = NULL;
+    }
+
+    free ( Node );
+
+    return 0;
+}   /* _XFSModelNodeDispose () */
+
+static
+rc_t CC
+_XFSModelNodeMake ( const char * Name, struct XFSModelNode ** Node )
+{
+    rc_t RCt;
+    struct XFSModelNode * Knoten;
+
+    RCt = 0;
+
+    if ( Name == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Node = NULL;
+
+    Knoten = calloc ( 1, sizeof ( struct XFSModelNode ) );
+    if ( Knoten == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    Knoten -> IsRoot = strcmp ( Name, XFS_MODEL_ROOT ) == 0;
+
+    RCt = XFS_StrDup ( Name, & ( Knoten -> Name ) );
+    if ( RCt == 0 ) {
+        RCt = XFSOwpMake ( & ( Knoten -> Properties ) );
+
+        if ( RCt == 0 ) {
+            RCt = XFSOwpMake ( & ( Knoten -> Children ) );
+
+            if ( RCt == 0 ) {
+                * Node = Knoten;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        _XFSModelNodeDispose ( Knoten );
+
+        Knoten = NULL;
+    }
+
+/*
+pLogMsg ( klogDebug, "_XFSModelNodeMake ( $(node), \"$(name)\" )", "node=%p,name=%s", ( void * ) Node, Name );
+*/
+
+    return RCt;
+}   /* _XFSModeNodeMake () */
+
+
+
+/*)))
+ ///    Model Make and Destroy
+(((*/
+
+/*))
+ //   That method will return source for model ... need to rethink
+((*/
+static
+rc_t CC
+_GetDefaultModelSource ( const char ** Source )
+{
+    rc_t RCt;
+    const struct KConfig * Konfig;
+    const struct KConfigNode * KonfigNode;
+    char Buf [ XFS_SIZE_4096 ];
+    size_t Readed;
+
+    RCt = 0;
+    Konfig = NULL;
+    KonfigNode = NULL;
+    Readed = 0;
+
+    if ( Source == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Source = NULL;
+
+    Konfig = XFS_Config_MHR ();
+    if ( Konfig != NULL ) {
+        RCt = KConfigOpenNodeRead (
+                                Konfig,
+                                & KonfigNode,
+                                "%s/%s",
+                                _sXFSNodePath,
+                                _sXFSNodeModel
+                                );
+        if ( RCt == 0 ) {
+            RCt = KConfigNodeRead (
+                                    KonfigNode,
+                                    0,
+                                    Buf,
+                                    sizeof ( Buf ),
+                                    & Readed,
+                                    NULL
+                                    );
+            if ( RCt == 0 && 0 < Readed ) {
+                * Source = ( const char * ) string_dup ( Buf, Readed );
+            }
+
+            KConfigNodeRelease ( KonfigNode );
+        }
+    }
+    else {
+        RCt = XFS_RC ( rcInvalid );
+    }
+
+    return RCt;
+}   /* _GetDefaultModelSource () */
+
+/*))
+ //   That method will create and initialize model from scratch
+((*/
+static
+rc_t CC
+_ErstellenUndInitialisierenModel (
+                    const char * Resource,
+                    const char * Version,
+                    const struct XFSModel  ** Model
+)
+{
+    struct XFSModel * Modell;
+
+    Modell = NULL;
+
+    if ( Resource == NULL || Model == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Model = NULL;
+
+    Modell = calloc ( 1, sizeof ( struct XFSModel ) );
+    if ( Modell == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    BSTreeInit ( & ( Modell -> tree ) );
+    KRefcountInit (
+                    & ( Modell -> refcount ),
+                    1,
+                    _sXFSModel_classname,
+                    "XFSModelMake",
+                    "Model"
+                    );
+    if ( Version != NULL ) {
+        XFS_StrDup ( Version, & ( Modell -> Version ) );
+    }
+
+    if ( XFS_StrDup ( Resource, & ( Modell -> Resource ) ) != 0 ) {
+            /* We should do it ... */
+        XFSModelDispose ( Modell );
+
+        * Model = NULL;     /* just for case */
+
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Model = Modell;
+
+    return 0;
+}   /* _ErstellenUndInitialisierenModel () */
+
+/*))
+ //   Some usual
+((*/
+
+    /*))
+     ((   There is very simple format for children field value:
+      ))      name[:label][,name[:label]....]
+     ((*/
+static
+rc_t CC
+_ParseAddNodeChildren (
+                const struct XFSModelNode * Node,
+                const char * ChildrenProperty
+)
+{
+    rc_t RCt;
+    struct KNamelist * Children;
+    struct KNamelist * Break;
+    uint32_t ChildCount, llp;
+    const char * Child;
+    uint32_t BreakCount, ppl;
+    const char * BChild, * BAlias;
+
+    RCt = 0;
+    ChildCount = llp = 0;
+    Children = NULL;
+    Child = NULL;
+    BreakCount = ppl = 0;
+    Break = NULL;
+    BChild = BAlias = NULL;
+
+    RCt = XFS_SimpleTokenize_ZHR ( ChildrenProperty, ',', & Children );
+    if ( RCt == 0 ) {
+        RCt = KNamelistCount ( Children, & ChildCount );
+        if ( RCt == 0 ) {
+            for ( llp = 0; llp < ChildCount; llp ++ ) { 
+                RCt = KNamelistGet ( Children, llp, & Child );
+                if ( RCt == 0 ) {
+                    RCt = XFS_SimpleTokenize_ZHR ( Child, ':', &Break );
+                    if ( RCt == 0 ) {
+                        RCt = KNamelistCount ( Break, & BreakCount );
+                        if ( RCt == 0 ) {
+                            BChild = BAlias = NULL;
+
+                            RCt = KNamelistGet ( Break, 0, & BChild );
+                            if ( RCt == 0 ) {
+                                if ( 1 < BreakCount ) {
+                                    RCt = KNamelistGet (
+                                                    Break,
+                                                    1,
+                                                    & BAlias
+                                                    );
+                                }
+                            }
+                            if ( RCt == 0 ) {
+                                RCt = XFSOwpSet (
+                                                    Node -> Children,
+                                                    BChild,
+                                                    BAlias
+                                                    );
+                            }
+                        }
+
+                        KNamelistRelease ( Break );
+                    }
+                }
+
+                if ( RCt != 0 ) {
+                    break;
+                }
+            }
+        }
+
+        KNamelistRelease ( Children );
+    }
+
+    return RCt;
+}   /* _ParseAddNodeChildren () */
+
+static
+rc_t CC
+_SetModelNodeProperty (
+            const struct XFSModelNode * ModelNode,
+            const struct KConfigNode * KonfigNode,
+            const char * PropertyName
+)
+{
+    rc_t RCt;
+    struct KConfigNode * Node;
+    char Buv [ XFS_SIZE_1024 ];
+    size_t NumRead, Remain;
+
+    RCt = 0;
+    Node = NULL;
+    NumRead = Remain = 0;
+
+        /* First we opening node for read */
+    RCt = KConfigNodeOpenNodeRead (
+                            KonfigNode,
+                            ( const struct KConfigNode ** ) & Node,
+                            PropertyName
+                            );
+    if ( RCt == 0 ) {
+        RCt = KConfigNodeRead (
+                            Node,
+                            0,
+                            Buv,
+                            sizeof ( Buv ),
+                            & NumRead,
+                            & Remain
+                            );
+        if ( RCt == 0 ) {
+            Buv [ NumRead ] = 0;
+
+            if ( strcmp ( PropertyName, XFS_MODEL_CHILDREN ) == 0 ) {
+                _ParseAddNodeChildren ( ModelNode, Buv );
+            }
+            else {
+                RCt = XFSOwpSet (
+                                    ModelNode -> Properties,
+                                    PropertyName,
+                                    Buv
+                                    );
+            }
+        }
+
+        KConfigNodeRelease ( Node );
+    }
+
+    return RCt;
+}   /* _SetModelNodeProperty () */
+
+static
+int64_t CC
+_LoadNodeCallback ( const BSTNode * N1, const BSTNode * N2 )
+{
+    return XFS_StringCompare4BST_ZHR (
+                            ( ( struct XFSModelNode * ) N1 ) -> Name,
+                            ( ( struct XFSModelNode * ) N2 ) -> Name
+                            );
+}   /* _LoadNodeCallback () */
+
+/*))
+ //   That method will load node for moded by name
+((*/
+static 
+rc_t CC
+_LoadModelNode (
+            const struct KConfig * Konfig,
+            struct XFSModel * Model,
+            const char * Name
+)
+{
+    rc_t RCt;
+    struct KConfigNode * Node;
+    struct XFSModelNode * Mode;
+    struct KNamelist * List;
+    uint32_t ListSize, llp;
+    const char * ListEntry;
+
+    RCt = 0;
+    Node = NULL;
+    ListEntry = NULL;
+    ListSize = llp = 0;
+
+        /* Here we do not do checks for NULL .... it is too deep */
+
+        /*) First, all nodes are unique, so we are leaving if here
+         /  already exists definition for node with that name
+        (*/
+    if ( XFSModelLookupNode ( Model, Name ) ) {
+        return 0;
+    }
+
+    RCt = KConfigOpenNodeRead (
+                            Konfig,
+                            ( const struct KConfigNode ** ) & Node,
+                            Name
+                            );
+    if ( RCt == 0 ) {
+        RCt = _XFSModelNodeMake ( Name, & Mode );
+        if ( RCt == 0 ) {
+            RCt = KConfigNodeListChildren ( Node, & List );
+            if ( RCt == 0 ) {
+                RCt = KNamelistCount ( List, & ListSize );
+                if ( RCt == 0 ) {
+                    for ( llp = 0; llp < ListSize; llp ++ ) {
+                        RCt = KNamelistGet ( List, llp, & ListEntry );
+                        if ( RCt == 0 ) {
+                            RCt = _SetModelNodeProperty (
+                                                        Mode,
+                                                        Node,
+                                                        ListEntry
+                                                        );
+                        }
+                        if ( RCt != 0 ) {
+                            break;
+                        }
+                    }
+                }
+
+                KNamelistRelease ( List );
+            }
+        }
+
+
+        KConfigNodeRelease ( Node );
+    }
+
+    if ( RCt == 0 ) {
+        RCt = BSTreeInsert (
+                        & ( Model -> tree ),
+                        ( BSTNode * ) Mode,
+                        _LoadNodeCallback
+                        );
+        if ( RCt == 0 ) {
+            RCt = XFSModelNodeChildrenNames (
+                                    Mode,
+                                    ( const struct KNamelist ** ) & List
+                                    );
+            if ( RCt == 0 && List != NULL ) {
+                RCt = KNamelistCount ( List, & ListSize );
+                if ( RCt == 0 ) {
+                    for ( llp = 0; llp < ListSize; llp ++ ) {
+                        RCt = KNamelistGet ( List, llp, & ListEntry );
+                        if ( RCt == 0 ) {
+                            RCt = _LoadModelNode (
+                                                Konfig,
+                                                Model,
+                                                ListEntry
+                                                );
+
+                            if ( RCt != 0 ) {
+                                break;
+                            }
+                        }
+                    }
+                }
+
+                KNamelistRelease ( List );
+            }
+        }
+    }
+
+    return RCt;
+}   /* _LoadModelNode () */
+
+/*))
+ //   That method will load model from resource by name
+((*/
+static
+rc_t CC
+_LoadModel ( struct XFSModel  * Model )
+{
+    rc_t RCt;
+    const struct KConfig * Config;
+
+    RCt = 0;
+    Config = NULL;
+
+    if ( Model == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Model -> Resource == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFS_LoadConfig_ZHR ( Model -> Resource, & Config );
+    if ( RCt == 0 ) {
+            /* First we should check if here is node with name 'root'
+             */
+        RCt = _LoadModelNode ( Config, Model, XFS_MODEL_ROOT );
+
+        KConfigRelease ( Config );
+    }
+
+    return RCt;
+}   /* _LoadModel () */
+
+/*
+ *   Creates model, and load it from Source. 
+ *   Source could be NULL, in that case it will load it from config
+ */
+LIB_EXPORT
+rc_t CC
+XFSModelMake (
+            struct XFSModel ** Model,
+            const char * Resource,
+            const char * Version
+)
+{
+    rc_t RCt;
+    const char * ModelResource;
+    bool DefaultModelResource;
+
+    RCt = 0;
+    DefaultModelResource = false;
+
+    if ( Model == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Resource == NULL ) {
+        RCt = _GetDefaultModelSource ( & ModelResource );
+        DefaultModelResource = true;
+    }
+    else {
+        ModelResource = Resource;
+    }
+
+    if ( RCt == 0 ) {
+        RCt = _ErstellenUndInitialisierenModel (
+                                    ModelResource,
+                                    Version,
+                                    ( const struct XFSModel ** ) Model
+                                    );
+        if ( RCt == 0 ) {
+            RCt = _LoadModel ( * Model );
+            if ( RCt != 0 ) {
+                XFSModelDispose ( ( struct XFSModel * ) * Model );
+                * Model = NULL;
+            }
+        }
+    }
+
+    if ( DefaultModelResource ) {
+        free ( ( char * ) ModelResource );
+        ModelResource = NULL;
+    }
+
+/*
+pLogMsg ( klogDebug, "XFSModelMake ( $(model) )", "model=%p", ( void * ) * Model );
+*/
+
+    return RCt;
+}   /* XFSModelMake () */
+
+static
+void CC
+_ModelWhackCallback ( BSTNode * Node, void * Unused )
+{
+    if ( Node != NULL ) {
+        _XFSModelNodeDispose ( ( struct XFSModelNode * ) Node );
+    }
+}   /* _ModelWhackCallback () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelDispose ( struct XFSModel * self )
+{
+/* 
+pLogMsg ( klogDebug, "_XFSModelDispose ( $(model) )", "model=%p", ( void * ) self );
+*/
+
+    if ( self == NULL ) {
+            /* Nothing to dispose */
+        return 0;
+    }
+
+    if ( self -> Version != NULL ) {
+        free ( ( char * ) self -> Version );
+        self -> Version = NULL;
+    }
+
+    if ( self -> Resource != NULL ) {
+        free ( ( char * ) self -> Resource );
+        self -> Resource = NULL;
+    }
+
+        /*) by BSTree code: it is safe not to check tree->root == NULL
+         (*/
+    BSTreeWhack ( ( BSTree * ) self, _ModelWhackCallback, NULL );
+
+    KRefcountWhack ( & ( self -> refcount ), _sXFSModel_classname );
+
+    free ( self );
+
+    return 0;
+}   /* XFSModelDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelAddRef ( const struct XFSModel * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self != NULL ) {
+        switch ( KRefcountAdd (
+                            & ( self -> refcount ),
+                            _sXFSModel_classname
+                            )
+        ) {
+            case krefOkay :
+                        RCt = 0;
+                        break;
+            case krefZero :
+            case krefLimit :
+            case krefNegative :
+                        RCt = XFS_RC ( rcInvalid );
+                        break;
+            default :
+                        RCt = XFS_RC ( rcUnknown );
+                        break;
+        }
+    }
+    else {
+        RCt = XFS_RC ( rcNull );
+    }
+
+    return RCt;
+}   /* XFSModelAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelRelease ( const struct XFSModel * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self != NULL ) {
+        switch ( KRefcountDrop (
+                            & ( self -> refcount ),
+                            _sXFSModel_classname
+                            )
+        ) {
+            case krefOkay :
+            case krefZero :
+                        RCt = 0;
+                        break;
+            case krefWhack :
+                        RCt = XFSModelDispose ( ( struct XFSModel * ) self );
+                        break;
+            case krefNegative :
+                        RCt = XFS_RC ( rcInvalid );
+                        break;
+            default :
+                        RCt = XFS_RC ( rcUnknown );
+                        break;
+        }
+    }
+
+    return RCt;
+}   /* XFSModelRelease () */
+
+LIB_EXPORT
+const struct XFSModelNode * CC
+XFSModelRootNode ( const struct XFSModel * self )
+{
+    return XFSModelLookupNode ( self, XFS_MODEL_ROOT );
+}   /* XFSModelRootNode () */
+
+static
+int64_t CC
+_LookupNodeCallback ( const void * Item, const BSTNode * Node )
+{
+    return XFS_StringCompare4BST_ZHR (
+                        ( const char * ) Item,
+                        ( ( struct XFSModelNode * ) Node ) -> Name
+                        );
+}   /* _LookupNodeCallback () */
+
+LIB_EXPORT
+const struct XFSModelNode * CC
+XFSModelLookupNode ( const struct XFSModel * self, const char * Name )
+{
+    if ( self == NULL || Name == NULL ) {
+        return NULL;
+    }
+
+    return ( const struct XFSModelNode * ) BSTreeFind (
+                                                & ( self -> tree ),
+                                                Name,
+                                                _LookupNodeCallback
+                                                );
+}   /* XFSModelLookupNode () */
+
+LIB_EXPORT
+const char * CC
+XFSModelResource ( const struct XFSModel * self )
+{
+    return self == NULL ? NULL : ( self -> Resource );
+}   /* XFSModelResource () */
+
+LIB_EXPORT
+const char * CC
+XFSModelVersion ( const struct XFSModel * self )
+{
+    return self == NULL ? NULL : ( self -> Version );
+}   /* XFSModelVersion () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* Editing                                                           */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+LIB_EXPORT
+rc_t CC
+XFSModelFromScratch ( struct XFSModel ** Model, const char * Version )
+{
+    XFS_CSAN ( Model )
+    XFS_CAN ( Model )
+
+    return _ErstellenUndInitialisierenModel (
+                                    "scratch",
+                                    Version,
+                                    ( const struct XFSModel ** ) Model
+                                    );
+}   /* XFSModelFromScratch () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelAddNode (
+                struct XFSModel * self,
+                const char * NodeName,  /* not null */
+                const char * Type       /* not null */
+)
+{
+    rc_t RCt;
+    struct XFSModelNode * Mode;
+
+    RCt = 0;
+    Mode = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( NodeName )
+    XFS_CAN ( Type )
+
+    RCt = _XFSModelNodeMake ( NodeName, & Mode );
+    if ( RCt == 0 ) {
+        RCt = XFSModelNodeSetProperty ( Mode, XFS_MODEL_TYPE, Type );
+        if ( RCt == 0 ) {
+            RCt = BSTreeInsert (
+                            & ( self -> tree ),
+                            ( BSTNode * ) Mode,
+                            _LoadNodeCallback
+                            );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( Mode != NULL ) {
+            _XFSModelNodeDispose ( Mode );
+        }
+    }
+
+    return RCt;
+}   /* XFSModelAddNode () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelAddRootNode (
+                struct XFSModel * self,
+                const char * Type       /* not null */
+)
+{
+    return XFSModelAddNode ( self, XFS_MODEL_ROOT, Type );
+}   /* XFSModelNodeAddRootNode () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelNodeSetProperty (
+                        struct XFSModelNode * self,
+                        const char * Key,       /* not null */
+                        const char * Value      /* could be null */
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( self -> Properties )
+    XFS_CAN ( Key )
+
+    if ( strcmp ( Key, XFS_MODEL_CHILDREN ) == 0 ) {
+        if ( Value == NULL ) {
+            XFSOwpClear ( self -> Children );
+        }
+        else {
+            RCt = _ParseAddNodeChildren ( self, Value );
+        }
+    }
+    else {
+        RCt = XFSOwpSet ( self -> Properties, Key, Value );
+    }
+
+    return RCt;
+}   /* XFSModelNodeSetPoperty () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelNodeSetLabel ( struct XFSModelNode * self, const char * Label )
+{
+    return XFSModelNodeSetProperty ( self, XFS_MODEL_LABEL, Label );
+}   /* XFSModelNodeSetLabel () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelNodeSetSecurity ( struct XFSModelNode * self, const char * Sec )
+{
+    return XFSModelNodeSetProperty ( self, XFS_MODEL_SECURITY, Sec );
+}   /* XFSModelNodeSetSecurity () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelNodeSetSource ( struct XFSModelNode * self, const char * Src )
+{
+    return XFSModelNodeSetProperty ( self, XFS_MODEL_SOURCE, Src );
+}   /* XFSModelNodeSetSource () */
+
+LIB_EXPORT
+rc_t CC
+XFSModelNodeSetChildren (
+                        struct XFSModelNode * self,
+                        const char * CommaSeparChildrenNames 
+)
+{
+    return XFSModelNodeSetProperty (
+                                    self,
+                                    XFS_MODEL_CHILDREN,
+                                    CommaSeparChildrenNames
+                                    );
+}   /* XFSModelNodeSetChildren () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+LIB_EXPORT
+void CC
+XFSModelNodeDDump ( const struct XFSModelNode * self )
+{
+    const struct KNamelist * List;
+    uint32_t Count, llp;
+    const char * Key, * Prop;
+
+    List = NULL;
+    Count = llp = 0;
+    Key = Prop = NULL;
+
+    if ( self == NULL ) {
+        LogMsg ( klogDebug, "   NODE [null]" );
+        return;
+    }
+
+    pLogMsg ( klogDebug, "  NODE [$(name)]", "name=%s", self -> Name );
+
+    if ( XFSModelNodePropertyNames ( self, & List ) == 0 ) {
+        if ( List != NULL ) {
+            if ( KNamelistCount ( List, & Count ) == 0 ) {
+                if ( Count == 0 ) {
+                    LogMsg ( klogDebug, "    PROPERTIES [NONE]" );
+                }
+                else {
+                    pLogMsg ( klogDebug, "    PROPERTIES [#$(count)", "count=%d", Count );
+                    for ( llp = 0; llp < Count; llp ++ ) {
+                        if ( KNamelistGet ( List, llp, & Key ) == 0 ) {
+                            Prop = XFSModelNodeProperty ( self, Key );
+                            pLogMsg ( klogDebug, "      [$(key)][$(prop)]"
+                                            , "key=%s,prop=%s"
+                                            , Key
+                                            , ( Prop == NULL ? "null" : Prop )
+                                            ); 
+                        }
+                    }
+                }
+            }
+            else {
+                LogMsg ( klogDebug, "    PROPERTIES [NONE]" );
+            }
+
+            KNamelistRelease ( List );
+            List = NULL;
+        }
+    }
+
+        /* Children */
+    if ( XFSModelNodeChildrenNames ( self, & List ) == 0 ) {
+        if ( List != NULL ) {
+            if ( KNamelistCount ( List, & Count ) == 0 ) {
+                if ( Count == 0 ) {
+                    LogMsg ( klogDebug, "    CHILDREN [NONE]" );
+                }
+                else {
+                    pLogMsg ( klogDebug, "    CHILDREN [#$(count)]", "count=%d", Count );
+                    for ( llp = 0; llp < Count; llp ++ ) {
+                        if ( KNamelistGet ( List, llp, & Key ) == 0 ) {
+                            Prop = XFSModelNodeChildAlias ( self, Key );
+                            if ( Prop == NULL ) {
+                                pLogMsg ( klogDebug, "      [$(key)]" , "key=%s", Key ); 
+                            }
+                            else {
+                                pLogMsg ( klogDebug, "      [$(key)][$(prop)]" , "key=%s,prop=%s", Key , Prop ); 
+                            }
+                        }
+                    }
+                }
+            }
+            else {
+                LogMsg ( klogDebug, "    CHILDREN [NONE]" );
+            }
+
+            KNamelistRelease ( List );
+            List = NULL;
+        }
+    }
+
+}   /* XFSModelNodeDDump () */
+
+static
+void CC
+_ModelDDumpCallback ( BSTNode * Node, void * Data )
+{
+    XFSModelNodeDDump ( ( const struct XFSModelNode * ) Node );
+}   /* _ModelDDumpCallback () */
+
+LIB_EXPORT
+void CC
+XFSModelDDump ( const struct XFSModel * self )
+{
+    if ( self == NULL ) {
+        LogMsg ( klogDebug, "MODEL [null]" );
+        return;
+    }
+    pLogMsg ( klogDebug, "MODEL Resource[$(resource)] Version[$(version)]",
+                     "resource=%s,version=%s",
+                     self -> Resource,
+                     self -> Version == NULL ? "null": self -> Version
+                     );
+
+    BSTreeForEach (
+                & ( self -> tree ),
+                false,
+                _ModelDDumpCallback,
+                NULL
+                );
+}   /* XFSModelDDump () */
diff --git a/libs/xfs/ncon.c b/libs/xfs/ncon.c
new file mode 100644
index 0000000..dbc29c2
--- /dev/null
+++ b/libs/xfs/ncon.c
@@ -0,0 +1,525 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/namelist.h>
+#include <klib/log.h>
+#include <kproc/lock.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+
+#include "mehr.h"
+#include "zehr.h"
+#include "ncon.h"
+
+#include <sysalloc.h>
+
+/*)))
+ |||
+ +++    Collection of node containers
+ |||
+(((*/
+
+/*))
+ ((     Simple Node Container
+  ))
+ ((*/
+
+static const char * _sXFSNodeContainer_classname = "XFSNodeContainer";
+
+struct XFSNodeContainer {
+    BSTree tree;
+
+    KRefcount refcount;
+
+    struct KLock * mutabor;
+};
+
+struct XFSNodeContainerNode {
+    BSTNode node;
+
+    const struct XFSNode * xfs_node;
+};
+
+
+/*))))   Here we are
+ ((((*/
+static
+rc_t CC
+_NodeContainerNodeDispose ( const struct XFSNodeContainerNode * self )
+{
+    struct XFSNodeContainerNode * Node =
+                                ( struct XFSNodeContainerNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "_NodeContainerNodeDispose ( $(node) )\n", "node=%p", ( void * ) self );
+*/
+
+    if ( Node != NULL ) {
+        if ( Node -> xfs_node != NULL ) {
+            XFSNodeRelease ( Node -> xfs_node );
+            Node -> xfs_node = NULL;
+        }
+
+        free ( Node );
+    }
+
+    return 0;
+}   /* _NodeContainerNodeDispose () */
+
+static
+rc_t CC
+_NodeContainerNodeMake (
+                    const struct XFSNode * Node, 
+                    const struct XFSNodeContainerNode ** RetNode
+)
+{
+    rc_t RCt;
+    struct XFSNodeContainerNode * TheNode;
+
+    RCt = 0;
+
+    XFS_CSAN ( RetNode )
+    XFS_CAN ( Node )
+    XFS_CAN ( RetNode )
+
+    TheNode = calloc ( 1, sizeof ( struct XFSNodeContainerNode ) );
+    if ( TheNode == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        TheNode -> xfs_node = Node;
+
+        * RetNode = TheNode;
+    }
+
+    if ( RCt != 0 ) {
+        _NodeContainerNodeDispose ( TheNode );
+        * RetNode = NULL;   /* for any case :lol: */
+    }
+/*
+pLogMsg ( klogDebug, "_NodeContainerNodeMake ( $(node) )\n", "node=%p", ( void * ) RetNode );
+*/
+
+    return RCt;
+}   /* _NodeContainerNodeMake () */
+
+/*))))   Here we are. Part II
+ ((((*/
+
+LIB_EXPORT
+rc_t CC
+XFSNodeContainerMake (
+            const struct XFSNodeContainer ** Container
+)
+{
+    rc_t RCt;
+    struct XFSNodeContainer * NewCont;
+
+    RCt = 0;
+    NewCont = NULL;
+
+    XFS_CSAN ( Container )
+    XFS_CAN ( Container )
+
+    NewCont = calloc ( 1 , sizeof ( struct XFSNodeContainer ) );
+    if ( NewCont == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        BSTreeInit ( & ( NewCont -> tree ) );
+
+        KRefcountInit (
+                    & ( NewCont -> refcount ),
+                    1,
+                    _sXFSNodeContainer_classname,
+                    "XFSNodeContainerMake",
+                    "XFSNodeContainer"
+                    );
+
+        RCt = KLockMake ( & ( NewCont -> mutabor ) );
+        if ( RCt == 0 ) {
+            * Container = NewCont;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Container = NULL;
+
+        if ( NewCont != NULL ) {
+            XFSNodeContainerDispose ( NewCont );
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "XFSNodeContainerMake ( $(node) )\n", "node=%p", ( void * ) * Container );
+*/
+
+    return RCt;
+}   /* XFSNodeContainerMake () */
+
+static
+void CC
+_TreeWhackCallback ( BSTNode * Node, void * Data )
+{
+    if ( Node != NULL ) {
+        _NodeContainerNodeDispose (
+                                ( struct XFSNodeContainerNode * ) Node
+                                );
+    }
+}   /* _TreeWhackCallback () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeContainerDispose ( const struct XFSNodeContainer * self )
+{
+/*
+pLogMsg ( klogDebug, "XFSNodeContainerDispose ( $(node) )\n", "node=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        BSTreeWhack (
+                    ( BSTree * ) & ( self -> tree ),
+                    _TreeWhackCallback,
+                    NULL
+                    );
+
+        KRefcountWhack (
+                    ( KRefcount * ) & ( self -> refcount ),
+                    _sXFSNodeContainer_classname
+                    );
+
+        if ( self -> mutabor != NULL ) {
+            KLockRelease ( ( struct KLock * ) self -> mutabor );
+            ( ( struct XFSNodeContainer * ) self ) -> mutabor = NULL;
+        }
+
+        free ( ( struct XFSNodeContainer * ) self );
+
+    }
+
+    return 0;
+}   /* XFSNodeContainerDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeContainerClear ( const struct XFSNodeContainer * self )
+{
+    rc_t RCt = 0;
+
+    if ( self != NULL ) {
+        RCt = KLockAcquire ( self -> mutabor );
+        if ( RCt == 0 ) {
+            BSTreeWhack (
+                        ( BSTree * ) & ( self -> tree ),
+                        _TreeWhackCallback,
+                        NULL
+                        );
+
+            BSTreeInit ( ( BSTree * ) & ( self -> tree ) );
+
+            KLockUnlock ( self -> mutabor );
+        }
+    }
+
+    return RCt;
+}   /* XFSNodeContainerClear () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeContainerAddRef ( const struct XFSNodeContainer * self )
+{
+    rc_t RCt = 0;
+
+    XFS_CAN ( self )
+
+    switch ( KRefcountAdd (
+                        & ( self -> refcount ),
+                        _sXFSNodeContainer_classname
+                        )
+    ) {
+        case krefOkay :     RCt = 0;                    break;
+
+        case krefZero :
+        case krefLimit :
+        case krefNegative : RCt = XFS_RC ( rcInvalid ); break;
+
+        default :           RCt = XFS_RC ( rcUnknown ); break;
+    }
+
+    return RCt;
+}   /* XFSNodeContainerAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeContainerRelease ( const struct XFSNodeContainer * self )
+{
+    rc_t RCt = 0;
+
+    XFS_CAN ( self )
+
+    switch ( KRefcountDrop (
+                        & ( self -> refcount ),
+                        _sXFSNodeContainer_classname
+                        )
+    ) {
+        case krefOkay :
+        case krefZero : RCt= 0;                         break;
+
+        case krefWhack :
+                RCt = XFSNodeContainerDispose ( self ); break;
+
+        case krefNegative : RCt = XFS_RC ( rcInvalid ); break;
+
+        default : RCt = XFS_RC ( rcUnknown );           break;
+    }
+
+    return RCt;
+}   /* XFSNodeContainerRelease () */
+
+LIB_EXPORT
+bool CC
+XFSNodeContainerHas (
+                    const struct XFSNodeContainer * self,
+                    const char * Name
+)
+{
+    const struct XFSNode * Node = NULL;
+
+    if ( XFSNodeContainerGet ( self, Name, & Node ) == 0 ) {
+        return ( Node != NULL );
+    }
+
+    return false;
+}   /* XFSNodeContainerHas () */
+
+static
+int64_t CC
+_NodeContainerCompare ( const void * Item, const BSTNode * Node )
+{
+    return XFS_StringCompare4BST_ZHR (
+        ( const char * ) Item,
+        ( ( const struct XFSNodeContainerNode * ) Node ) -> xfs_node -> Name
+        );
+}   /* _NodeContainerCompare () */
+
+static
+rc_t CC
+_NodeContainerNodeGet_NoLock (
+                    const struct XFSNodeContainer * self,
+                    const char * Name,
+                    const struct XFSNodeContainerNode ** Node
+)
+{
+    XFS_CSAN ( Node )
+    XFS_CAN ( self )
+    XFS_CAN ( Name )
+    XFS_CAN ( Node )
+
+    * Node = ( struct XFSNodeContainerNode * ) BSTreeFind (
+                                            & ( self -> tree ),
+                                            Name,
+                                            _NodeContainerCompare
+                                            );
+
+    return * Node == NULL ? XFS_RC ( rcNotFound ) : 0;
+}   /* _NodeContainerNodeGet () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeContainerGet (
+                const struct XFSNodeContainer * self,
+                const char * Name,
+                const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    const struct XFSNodeContainerNode * TheNode;
+
+    RCt = 0;
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+
+        RCt = _NodeContainerNodeGet_NoLock ( self, Name, & TheNode );
+        if ( RCt == 0 ) {
+            * Node = TheNode -> xfs_node;
+
+            if ( * Node == NULL ) {
+                RCt = XFS_RC ( rcInvalid );
+            }
+        }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSNodeContainerGet () */
+
+static
+int64_t CC
+_NodeContainerInsert ( const BSTNode * N1, const BSTNode * N2 )
+{
+    return XFS_StringCompare4BST_ZHR (
+           ( ( struct XFSNodeContainerNode * ) N1 ) -> xfs_node -> Name,
+           ( ( struct XFSNodeContainerNode * ) N2 ) -> xfs_node -> Name
+           );
+}   /* _NodeContainerInsert () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeContainerAdd (
+            const struct XFSNodeContainer * self,
+            const struct XFSNode * Node
+)
+{
+    rc_t RCt;
+    struct XFSNodeContainer * Container;
+    struct XFSNodeContainerNode * TheNode;
+
+    RCt = 0;
+    TheNode = NULL;
+    Container = ( struct XFSNodeContainer * ) self;
+
+    XFS_CAN ( Container )
+    XFS_CAN ( Node )
+
+    if ( XFSNodeContainerHas ( Container, Node -> Name ) ) {
+        return XFS_RC ( rcExists );
+    }
+
+    RCt = KLockAcquire ( Container -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _NodeContainerNodeMake (
+                    Node,
+                    ( const struct XFSNodeContainerNode ** ) & TheNode
+                    );
+        if ( RCt == 0 ) {
+            RCt = BSTreeInsert (
+                            & ( Container -> tree ),
+                            & ( TheNode -> node ),
+                            _NodeContainerInsert
+                            );
+        }
+        KLockUnlock ( Container -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSNodeContainerAdd () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeContainerDel (
+                const struct XFSNodeContainer * self,
+                const char * NodeName
+)
+{
+    rc_t RCt;
+    struct XFSNodeContainer * Container;
+    struct XFSNodeContainerNode * Node;
+
+    RCt = 0;
+    Container = ( struct XFSNodeContainer * ) self;
+
+    RCt = KLockAcquire ( Container -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _NodeContainerNodeGet_NoLock (
+                        Container,
+                        NodeName,
+                        ( const struct XFSNodeContainerNode ** ) & Node
+                        );
+        if ( RCt == 0 ) {
+            RCt = BSTreeUnlink (
+                            & ( Container -> tree ),
+                            & ( Node -> node )
+                            );
+            if ( RCt == 0 ) {
+                RCt = _NodeContainerNodeDispose ( Node );
+            }
+        }
+        KLockUnlock ( Container -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSNodeContainerDef () */
+
+static
+void CC
+_NodeContainerList ( BSTNode * Node, void * Data )
+{
+    struct XFSNodeContainerNode * TheNode;
+    struct VNamelist * TheList;
+
+    if ( Node != NULL && Data != NULL ) {
+        TheNode = ( struct XFSNodeContainerNode * ) Node;
+        TheList = ( struct VNamelist * ) Data;
+
+        VNamelistAppend ( TheList, TheNode -> xfs_node -> Name );
+    }
+}   /* _NodeContainerList () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeContainerList (
+                const struct XFSNodeContainer * self,
+                const struct KNamelist ** List
+)
+{
+    rc_t RCt;
+    struct VNamelist * TheList;
+
+    RCt = 0;
+    TheList = NULL;
+
+    XFS_CSAN ( List )
+    XFS_CAN ( self )
+    XFS_CAN ( List )
+
+    RCt = VNamelistMake ( & TheList, 32 );
+    if ( RCt == 0 ) {
+        RCt = KLockAcquire ( self -> mutabor );
+        if ( RCt == 0 ) {
+            BSTreeForEach ( 
+                        & ( self -> tree ),
+                        false,
+                        _NodeContainerList,
+                        TheList
+                        );
+
+            RCt = VNamelistToConstNamelist ( TheList, List );
+            KLockUnlock ( self -> mutabor );
+        }
+
+        VNamelistRelease ( TheList );
+    }
+
+    return RCt;
+}   /* XFSNodeContainerList () */
diff --git a/libs/xfs/ncon.h b/libs/xfs/ncon.h
new file mode 100644
index 0000000..7246717
--- /dev/null
+++ b/libs/xfs/ncon.h
@@ -0,0 +1,98 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _ncon_h_
+#define _ncon_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   This file contains unterface to different node containers
+  ))))  not sure how many we will have
+ ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSNodeContainer;
+struct KNamelist;
+
+XFS_EXTERN rc_t CC XFSNodeContainerMake (
+                            const struct XFSNodeContainer ** Container
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeContainerDispose (
+                            const struct XFSNodeContainer * self
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeContainerAddRef (
+                            const struct XFSNodeContainer * self
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeContainerRelease (
+                            const struct XFSNodeContainer * self
+                            );
+
+XFS_EXTERN bool CC XFSNodeContainerHas (
+                            const struct XFSNodeContainer * self,
+                            const char * NodeName
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeContainerGet (
+                            const struct XFSNodeContainer * self,
+                            const char * NodeName,
+                            const struct XFSNode ** Node
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeContainerAdd (
+                            const struct XFSNodeContainer * self,
+                            const struct XFSNode * Node
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeContainerDel (
+                            const struct XFSNodeContainer * self,
+                            const char * NodeName
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeContainerList (
+                            const struct XFSNodeContainer * self,
+                            const struct KNamelist ** List
+                            );
+
+XFS_EXTERN rc_t CC XFSNodeContainerClear (
+                            const struct XFSNodeContainer * self
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _ncon_h_ */
diff --git a/libs/xfs/node.c b/libs/xfs/node.c
new file mode 100644
index 0000000..ea762ba
--- /dev/null
+++ b/libs/xfs/node.c
@@ -0,0 +1,616 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/namelist.h>
+#include <klib/log.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "teleport.h"
+#include "common.h"
+
+#include <sysalloc.h>
+
+#include <string.h> /* strcmp () */
+
+/*)))
+ |||
+ +++    Tree and all the worst
+ |||
+(((*/
+static const char * _sXFSNode_classname = "XFSNode";
+
+/*)))
+ |||
+ +++    Currentrly node presents three interfaces
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose. Note, we do initialize/destroy node name
+  ))    here, but Constructor could redefine it.
+ ((*/
+LIB_EXPORT
+rc_t CC
+XFSNodeInit (
+            const struct XFSNode * self,
+            const char * NodeName
+)
+{
+    return XFSNodeInitVT ( self, NodeName, NULL );
+}   /* XFSNodeInit () */
+
+static
+rc_t CC
+_NodeSetName ( const struct XFSNode * self, const char * Name )
+{
+    struct XFSNode * Node = ( struct XFSNode * ) self;
+
+    if ( Node == NULL || Name == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Node -> Name != NULL ) {
+        free ( Node -> Name );
+        Node -> Name = NULL;
+    }
+
+    return XFS_StrDup ( Name, ( const char ** ) & ( Node -> Name ) );
+}   /* _NodeSetName () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeInitVT (
+            const struct XFSNode * self,
+            const char * NodeName,
+            const union XFSNode_vt * VT
+)
+{
+    rc_t RCt;
+    struct XFSNode * Node;
+
+    RCt = 0;
+    Node = ( struct XFSNode * ) self;
+
+    if ( Node == NULL || NodeName == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( VT != NULL ) {
+        Node -> vt = VT;
+    }
+
+    RCt = _NodeSetName ( self, NodeName );
+/*
+pLogMsg ( klogDebug, " [XFSNodeInit] [$(node)] [$(name)]", "node=%p,name=%s", ( void * ) Node, Node -> Name );
+*/
+    if ( RCt == 0 ) {
+        KRefcountInit (
+                    & ( Node -> refcount ),
+                    1,
+                    _sXFSNode_classname,
+                    "XFSNodeInit",
+                    "XFSNode"
+                    );
+    }
+
+    return RCt;
+}   /* XFSNodeInitVT () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeMake (
+            const struct XFSModel * Model,
+            const char * NodeName,
+            const char * NameAlias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    const struct XFSModelNode * ModelNode;
+    const struct XFSTeleport * Teleport;
+    struct XFSNode * NewNode;
+    const char * NewNodeName;
+
+    RCt = 0;
+    ModelNode = NULL;
+    Teleport = NULL;
+    NewNode = NULL;
+    NewNodeName = NULL;
+
+    if ( Model == NULL || Node == NULL || NodeName == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Node = NULL;
+
+    ModelNode = XFSModelLookupNode ( Model, NodeName );
+    if ( ModelNode == NULL ) {
+        return XFS_RC ( rcNotFound );
+    }
+
+    if ( XFSModelNodeIsRoot ( ModelNode ) ) {
+        NewNodeName = "/";
+    }
+    else {
+            /*  I could use here '?:' operator, but i think that
+             *  is more useful, cuz shows names priority:
+             *     alias -> label -> name_given
+             */
+        NewNodeName = NameAlias;
+        if ( NewNodeName == NULL ) {
+
+            NewNodeName = XFSModelNodeLabel ( ModelNode );
+            if ( NewNodeName == NULL ) {
+
+                NewNodeName = NodeName;
+            }
+        }
+    }
+
+    RCt = XFSTeleportLookup ( 
+                    XFSModelNodeType ( ModelNode ),
+                    & Teleport
+                    );
+    if ( RCt == 0 ) {
+        if ( Teleport == NULL ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+            if ( Teleport -> Constructor == NULL ) {
+                RCt = XFS_RC ( rcInvalid );
+            }
+            else {
+                RCt = Teleport -> Constructor (
+                                    Model,
+                                    ModelNode,
+                                    NameAlias,
+                                    ( const struct XFSNode ** )& NewNode
+                                    );
+                if ( RCt == 0 ) {
+                    RCt = _NodeSetName ( NewNode, NewNodeName );
+                    if ( RCt != 0 ) {
+                        XFSNodeDispose ( NewNode );
+                    }
+                    else {
+                        * Node = NewNode;
+                    }
+                }
+            }
+        }
+    }
+
+/*
+pLogMsg ( klogDebug, "XFSNodeMake ( \"$(name)\" ) As [$(alias)] ( $(node) ) [$(rc)]", "name=%s,alias=%s,node=%p,rc=%d", NodeName, ( NameAlias == NULL ? "NULL" : NameAlias ), ( void * ) NewNode, RCt );
+*/
+
+    return RCt;
+}   /* XFSNodeMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeDispose ( const struct XFSNode * self )
+{
+    rc_t RCt;
+    struct XFSNode * Node;
+
+    RCt = 0;
+    Node = ( struct XFSNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "XFSNodeDispose ( $(node) )", "node=%p", ( void * ) self );
+*/
+
+    if ( Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    KRefcountWhack ( & ( Node -> refcount ), _sXFSNode_classname );
+
+    if ( Node -> Name != NULL ) {
+/*
+pLogMsg ( klogDebug, " [XFSNodeDispose] [$(node)] [$(name)]", "node=%p,name=%s", ( void * ) Node, Node -> Name );
+*/
+        free ( Node -> Name );
+        Node -> Name = NULL;
+    }
+
+    switch ( self -> vt -> v1.maj ) {
+        case 1 :
+            if ( Node -> vt -> v1.dispose != NULL ) {
+                RCt = Node -> vt -> v1.dispose ( Node );
+            }
+            break;
+        default :
+            RCt = XFS_RC ( rcBadVersion );
+            break;
+    }
+
+    return RCt;
+}   /* XFSNodeDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeAddRef ( const struct XFSNode * self )
+{
+    rc_t RCt;
+    int RefC;
+
+    RCt = 0;
+    RefC = 0;
+
+    if ( self != NULL ) {
+/*
+pLogMsg ( klogDebug, "XFSNodeAddRef ( $(node) )[$(name)]", "node=%p,name=%s", ( void * ) self, self -> Name );
+*/
+
+        RefC = KRefcountAdd (
+                        & ( self -> refcount ),
+                        _sXFSNode_classname
+                        );
+        switch ( RefC ) {
+            case krefOkay :     RCt = 0; break;
+            
+            case krefZero :
+            case krefLimit :
+            case krefNegative : RCt = XFS_RC ( rcInvalid ); break;
+
+            default :           RCt = XFS_RC ( rcUnknown ); break;
+        }
+    }
+    else {
+        RCt = XFS_RC ( rcNull );
+    }
+
+    return RCt;
+}   /* XFSNodeAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeRelease ( const struct XFSNode * self )
+{
+    rc_t RCt;
+    int RefC;
+
+    RCt = 0;
+    RefC = 0;
+
+    if ( self != NULL ) {
+/*
+pLogMsg ( klogDebug, "XFSNodeRelease ( $(node) )[$(name)]", "node=%p,name=%s", ( void * ) self, self -> Name );
+*/
+        RefC = KRefcountDrop (
+                            & ( self -> refcount ),
+                            _sXFSNode_classname
+                            );
+        switch ( RefC ) {
+            case krefOkay :
+            case krefZero :     RCt = 0; break;
+
+            case krefWhack :    RCt = XFSNodeDispose ( self ); break;
+
+            case krefNegative : RCt = XFS_RC ( rcInvalid ); break;
+            default :           RCt = XFS_RC ( rcUnknown ); break;
+        }
+    }
+
+    return RCt;
+}   /* XFSNodeRelease () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeFindNode (
+                const struct XFSNode * self,
+                const struct XFSPath * Path,
+                uint32_t PathIndex,
+                const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL || Path == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Node = NULL;
+
+    switch ( self -> vt -> v1.maj ) {
+        case 1 :
+            if ( self -> vt -> v1.findnode != NULL ) {
+                RCt = self -> vt -> v1.findnode (
+                                                self,
+                                                Path,
+                                                PathIndex,
+                                                Node
+                                                );
+            }
+            else {
+/*
+pLogMsg ( klogDebug, "XFSNodeAttrEditor ( $(node) ): unimplemented method 'findnode'", "node=%p", ( void * ) self );
+*/
+                RCt = XFS_RC ( rcUnsupported );
+            }
+            break;
+        default :
+            RCt = XFS_RC ( rcBadVersion );
+            break;
+    }
+
+    return RCt;
+}   /* XFSNodeFindNode () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeFindNodeCheckInitStandard (
+                        const struct XFSNode * self,
+                        const struct XFSPath * Path,
+                        uint32_t PathIndex,
+                        const struct XFSNode ** Node,
+                        const char ** NodeName,
+                        uint32_t * PathCount,
+                        bool * IsLast
+)
+{
+    const char * XNodeName;
+    uint32_t XPathCount;
+    bool XIsLast;
+
+    XNodeName = NULL;
+    XPathCount = 0;
+    XIsLast = false;
+
+
+    if ( self == NULL || Path == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Node = NULL;
+
+    if ( NodeName == NULL || PathCount == NULL || IsLast == NULL ) {
+        return XFS_RC ( rcUnexpected );
+    }
+
+    * NodeName = NULL;
+    * PathCount = 0;
+    * IsLast = false;
+
+    XPathCount = XFSPathPartCount ( Path );
+
+    if ( XPathCount <= PathIndex ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    XIsLast = PathIndex == ( XPathCount - 1 );
+
+    XNodeName = XFSPathPartGet ( Path, PathIndex );
+
+    /*))  Should not happen thou
+     ((*/
+    if ( XNodeName == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    /*))  Should not happen thou
+     ((*/
+    if ( strcmp ( XNodeName, XFSNodeName ( self ) ) != 0 ) {
+        return XFS_RC ( rcUnexpected );
+    }
+
+    * NodeName = XNodeName;
+    * PathCount = XPathCount;
+    * IsLast = XIsLast;
+
+    return 0;
+}   /* XFSNodeFindNodeCheckInitStandard () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeDirEditor (
+                const struct XFSNode * self,
+                const struct XFSDirEditor ** Dir
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL || Dir == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Dir = NULL;
+
+    switch ( self -> vt -> v1.maj ) {
+        case 1 :
+            if ( self -> vt -> v1.dir != NULL ) {
+                RCt = self -> vt -> v1.dir ( self, Dir );
+            }
+            break;
+        default :
+            RCt = XFS_RC ( rcBadVersion );
+    }
+
+    if ( * Dir == NULL ) {
+        RCt = XFS_RC ( rcUnsupported );
+    }
+
+    return RCt;
+}   /* XFSNodeDirEditor () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeFileEditor (
+                const struct XFSNode * self,
+                const struct XFSFileEditor ** File
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL || File == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * File = NULL;
+
+    switch ( self -> vt -> v1.maj ) {
+        case 1 :
+            if ( self -> vt -> v1.file != NULL ) {
+                RCt = self -> vt -> v1.file ( self, File );
+            }
+            break;
+        default :
+            RCt = XFS_RC ( rcBadVersion );
+    }
+
+    if ( * File == NULL ) {
+        RCt = XFS_RC ( rcUnsupported );
+    }
+
+    return RCt;
+}   /* XFSNodeFileEditor () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeAttrEditor (
+                const struct XFSNode * self,
+                const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL || Attr == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Attr = NULL;
+
+    switch ( self -> vt -> v1.maj ) {
+        case 1 :
+            if ( self -> vt -> v1.attr != NULL ) {
+                RCt = self -> vt -> v1.attr ( self, Attr );
+            }
+            break;
+        default :
+            RCt = XFS_RC ( rcBadVersion );
+    }
+
+    if ( * Attr == NULL ) {
+        RCt = XFS_RC ( rcUnsupported );
+    }
+
+    return RCt;
+}   /* XFSNodeAttrEditor () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeDescribe (
+                const struct XFSNode * self,
+                char * Buffer,
+                size_t BufferSize
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL || Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Buffer = 0;
+
+    switch ( self -> vt -> v1.maj ) {
+        case 1 :
+            if ( self -> vt -> v1.describe != NULL ) {
+                RCt = self -> vt -> v1.describe (
+                                                self,
+                                                Buffer,
+                                                BufferSize
+                                                );
+            }
+            break;
+        default :
+            RCt = XFS_RC ( rcBadVersion );
+    }
+
+    return RCt;
+}   /* XFSNodeDescribe () */
+
+LIB_EXPORT
+rc_t CC
+XFSNodeDump ( const struct XFSNode * self )
+{
+    rc_t RCt;
+    char Buffer [ XFS_SIZE_1024 ];
+
+    RCt = XFSNodeDescribe ( self, Buffer, sizeof ( Buffer ) );
+
+    if ( RCt == 0 ) {
+        pLogMsg ( klogDebug, "|||>>> $(buf)\n", "buf=%s", Buffer );
+    }
+
+    return RCt;
+}   /* XFSNodeDump () */
+
+LIB_EXPORT
+const char * CC
+XFSNodeName ( const struct XFSNode * self )
+{
+    return self == NULL ? NULL : ( self -> Name );
+}   /* XFSNodeName () */
+
+LIB_EXPORT
+uint32_t CC
+XFSNodeFlavor ( const struct XFSNode * self )
+{
+    if ( self != NULL ) {
+        switch ( self -> vt -> v1.maj ) {
+            case 1 :
+                if ( self -> vt -> v1.flavor != NULL ) {
+                    return self -> vt -> v1.flavor ( self );
+                }
+                break;
+        }
+    }
+
+    return _sFlavorLess;
+}   /* XFSNodeFlavor () */
+
diff --git a/libs/xfs/owp.c b/libs/xfs/owp.c
new file mode 100644
index 0000000..9f752ce
--- /dev/null
+++ b/libs/xfs/owp.c
@@ -0,0 +1,375 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/container.h>
+
+#include <kfg/config.h>
+
+#include "owp.h"
+#include "schwarzschraube.h"
+
+#include <sysalloc.h>
+
+#include <ctype.h>
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //   it is a struct, don't know why ... prolly will add refcount later
+((*/
+struct XFSOwp {
+    BSTree tree;
+};
+
+struct XFSOwpEntry {
+    struct BSTNode node;
+    char * Key;
+    char * Property;
+};
+
+LIB_EXPORT
+rc_t CC
+XFSOwpMake ( struct XFSOwp ** Owp )
+{
+    rc_t RCt;
+    struct XFSOwp * tmpOwp;
+
+    RCt = 0;
+    tmpOwp = NULL;
+
+    if ( Owp == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Owp = NULL;
+
+    tmpOwp = calloc ( 1, sizeof ( struct XFSOwp ) );
+    if ( tmpOwp == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSOwpInit ( tmpOwp );
+    if ( RCt == 0 ) {
+        * Owp = tmpOwp;
+    }
+    else {
+        * Owp = NULL; /* I know it was initialized in that way, but */
+        free ( tmpOwp );
+    }
+
+    return RCt;
+}   /* XFSOwpMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSOwpInit ( struct XFSOwp * self )
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    BSTreeInit ( ( BSTree * ) self );
+
+    return 0;
+}   /* XFSOwpInit () */
+
+static
+void CC
+_OWPEntryWhack ( BSTNode * Node, void * UsuallyNullParam )
+{
+    struct XFSOwpEntry * Entry;
+
+    Entry = ( struct XFSOwpEntry * ) Node;
+
+    if ( Entry != NULL ) {
+        if ( Entry -> Key != NULL ) {
+            free ( Entry -> Key );
+            Entry -> Key = NULL;
+        }
+
+        if ( Entry -> Property != NULL ) {
+            free ( Entry -> Property );
+            Entry -> Property = NULL;
+        }
+
+        free ( Entry );
+        Entry = NULL; /* :lol: */
+    }
+}   /* _OWPEntryWhack () */
+
+LIB_EXPORT
+rc_t CC
+XFSOwpWhack ( struct XFSOwp * self )
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    BSTreeWhack ( ( BSTree * ) self, _OWPEntryWhack, NULL );
+
+    return 0;
+}   /* XFSOwpWhack () */
+
+LIB_EXPORT
+rc_t CC
+XFSOwpDispose ( struct XFSOwp * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSOwpWhack ( self );
+    if ( RCt == 0 ) {
+        free ( self );
+    }
+
+    return RCt;
+}   /* XFSOwpDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSOwpClear ( struct XFSOwp * self )
+{
+    XFSOwpWhack ( self );
+    XFSOwpInit ( self );
+
+    return 0;
+}   /* XFSOwpClear () */
+
+static
+int CC
+_OWPStringCmp ( const char * Str1, const char * Str2 )
+{
+    if ( Str1 == NULL || Str2 == NULL ) {
+        if ( Str1 != NULL ) {
+            return 4096;
+        }
+
+        if ( Str2 != NULL ) {
+            return - 4096;
+        }
+
+        return 0;
+    }
+
+    return strcmp ( Str1, Str2 );
+}   /* _OWPStringCmp () */
+
+static
+int64_t CC
+_OWPEntryCmp ( const void * Item, const BSTNode * Node )
+{
+    return _OWPStringCmp (
+                ( const char * ) Item,
+                ( ( Node == NULL )
+                    ? NULL
+                    : ( ( struct XFSOwpEntry * ) Node ) -> Key
+                )
+                );
+}   /* _OWPEntryCmp () */
+
+static
+const struct XFSOwpEntry * CC
+_OWPEntryFind ( const struct XFSOwp * self, const char * Key )
+{
+    struct XFSOwpEntry * Entry;
+
+    Entry = NULL;
+
+    if ( self != NULL && Key != NULL ) {
+        Entry = ( struct XFSOwpEntry * ) BSTreeFind (
+                                                    ( BSTree * )self,
+                                                    Key,
+                                                    _OWPEntryCmp
+                                                    );
+    }
+
+    return Entry;
+}   /* _OWPEntryFind () */
+
+LIB_EXPORT
+bool CC
+XFSOwpHas ( const struct XFSOwp * self, const char * Key )
+{
+    return _OWPEntryFind ( self, Key ) != NULL ;
+}   /* XFSOwpHas () */
+
+LIB_EXPORT
+const char * CC
+XFSOwpGet ( const struct XFSOwp * self, const char * Key )
+{
+    const struct XFSOwpEntry * Entry;
+
+    Entry = _OWPEntryFind ( self, Key );
+
+    return Entry == NULL ? NULL : Entry -> Property;
+}   /* XFSOwpGet () */
+
+static
+struct XFSOwpEntry * CC
+_OWPEntryMake ( const char * Key, const char * Property )
+{
+    struct XFSOwpEntry * Entry;
+
+    Entry = calloc ( 1, sizeof ( struct XFSOwpEntry ) );
+    if ( Entry != NULL ) {
+        if ( XFS_StrDup ( Key, ( const char ** ) & ( Entry -> Key ) ) == 0 ) {
+
+            if ( Property == NULL ) {
+                return Entry;
+            }
+            else {
+                if ( XFS_StrDup ( Property, ( const char ** ) & ( Entry -> Property ) ) == 0 ) {
+                    return Entry;
+                }
+            }
+
+            free ( Entry -> Key );
+        }
+
+        free ( Entry );
+    }
+
+    return NULL;
+}   /* _OWPEntryMake () */
+
+static
+int64_t CC
+_OWPNodeCmp ( const BSTNode * Node1, const BSTNode * Node2 )
+{
+    return _OWPStringCmp (
+                        ( ( struct XFSOwpEntry * ) Node1 ) -> Key,
+                        ( ( struct XFSOwpEntry * ) Node2 ) -> Key
+                        );
+
+}   /* _OWPNodeCmp () */
+
+LIB_EXPORT
+rc_t CC
+XFSOwpSet (
+            const struct XFSOwp * self,
+            const char * Key,
+            const char * Property
+)
+{
+    rc_t RCt;
+    struct XFSOwpEntry * Entry;
+
+    RCt = 0;
+    Entry = NULL;
+
+        /* I suppose, that Property could be NULL value */
+    if ( self == NULL || Key == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+        /* All property values are unique */
+    if ( XFSOwpHas ( self, Key ) == true ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Entry = _OWPEntryMake ( Key, Property );
+    if ( Entry == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = BSTreeInsert (
+                        ( BSTree * ) self,
+                        ( BSTNode * ) Entry,
+                        _OWPNodeCmp
+                        );
+    }
+
+    return RCt;
+}   /* XFSOwpSet () */
+
+static
+void
+_ListKeysCallback ( BSTNode * Node, void * Data )
+{
+    struct VNamelist * List;
+    struct XFSOwpEntry * TheNode;
+
+    List = NULL;
+    TheNode = NULL;
+
+    if ( Node != NULL && Data != NULL ) {
+        List = ( struct VNamelist * ) Data;
+        TheNode = ( struct XFSOwpEntry * ) Node;
+
+        VNamelistAppend ( List, TheNode -> Key );
+
+    }
+}   /* _ListKeysCallback () */
+
+LIB_EXPORT
+rc_t CC
+XFSOwpListKeys (
+            const struct XFSOwp * self,
+            const struct KNamelist ** Keys
+)
+{
+    rc_t RCt;
+    struct VNamelist * List;
+
+    RCt = 0;
+
+    if ( self == NULL || Keys == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Keys = NULL;
+
+    RCt = VNamelistMake ( & List, 16 /* ?? */ );
+    if ( RCt == 0 ) {
+        BSTreeForEach (
+                    ( BSTree * ) self,
+                    false,
+                    _ListKeysCallback,
+                    List
+                    );
+
+        RCt = VNamelistToConstNamelist ( List, Keys );
+
+        VNamelistRelease ( List );
+    }
+
+    return RCt;
+}   /* XFSOwpListKeys () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
diff --git a/libs/xfs/owp.h b/libs/xfs/owp.h
new file mode 100644
index 0000000..0b62c8b
--- /dev/null
+++ b/libs/xfs/owp.h
@@ -0,0 +1,86 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _owp_h_
+#define _owp_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))   Object With Properties (OWP), draft version
+ ((
+  ))   That is an Object which contais set of pairs of chars : key and
+ ((    property.
+  ))
+ ((    Temporarily, I do not have methods like delete/replace/list, but
+  ))   could add them later
+ ((*/
+struct XFSOwp;
+struct KNamelist;
+
+XFS_EXTERN rc_t CC XFSOwpMake ( struct XFSOwp ** Owp );
+XFS_EXTERN rc_t CC XFSOwpInit ( struct XFSOwp * self );
+XFS_EXTERN rc_t CC XFSOwpWhack ( struct XFSOwp * self );
+XFS_EXTERN rc_t CC XFSOwpDispose ( struct XFSOwp * self );
+XFS_EXTERN rc_t CC XFSOwpClear ( struct XFSOwp * self );
+
+XFS_EXTERN bool CC XFSOwpHas (
+                                const struct XFSOwp * self,
+                                const char * Key
+                                );
+XFS_EXTERN const char * CC XFSOwpGet (
+                                const struct XFSOwp * self,
+                                const char * Key
+                                );
+    /*)) Property value could be NULL
+     ((*/
+XFS_EXTERN rc_t CC XFSOwpSet (
+                                const struct XFSOwp * self,
+                                const char * Key,
+                                const char * Propety
+                                );
+
+XFS_EXTERN rc_t CC XFSOwpListKeys (
+                                const struct XFSOwp * self,
+                                const struct KNamelist ** Keys
+                                );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _owp_h_ */
diff --git a/libs/xfs/path.c b/libs/xfs/path.c
new file mode 100644
index 0000000..a9a11a5
--- /dev/null
+++ b/libs/xfs/path.c
@@ -0,0 +1,1505 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/log.h>
+
+#include <kfs/directory.h>
+
+#include <va_copy.h>
+
+#include <xfs/path.h>
+#include "schwarzschraube.h"
+
+#include <sysalloc.h>
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static char * _sPathEmptyName = "";
+
+#define _STRC_INC_VAL_ 16
+
+struct _StrC {
+    char ** e;
+
+    size_t q;
+    size_t c;
+};
+
+static const char * CC _StrCGet (
+                    struct _StrC * self,
+                    size_t Idx
+                    );
+static size_t CC _StrCCount (
+                    struct _StrC * self
+                    );
+
+static
+void CC
+_StrCClear ( struct _StrC * self )
+{
+    size_t Idx = 0;
+
+    if ( self == NULL ) {
+        return;
+    }
+
+    if ( self -> e != NULL ) {
+        if ( self -> q != 0 ) {
+            for ( Idx = 0; Idx < self -> q; Idx ++ ) {
+                if ( self -> e [ Idx ] != NULL ) {
+                    free ( self -> e [ Idx ] );
+                    self -> e [ Idx ] = NULL;
+                }
+            }
+        }
+    }
+
+    self -> q = 0;
+
+}   /* _StrCClear () */
+
+static
+rc_t CC
+_StrCDispose ( struct _StrC * self )
+{
+    if ( self != NULL ) {
+        _StrCClear ( self );
+
+        free ( self -> e );
+
+        self -> e = NULL;
+
+        self -> c = 0;
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _StrCDispose () */
+
+/*))    Capacity - 0 - means default value _STRC_INC_VAL_.
+ ((*/
+static
+rc_t CC
+_StrCMake ( struct _StrC ** Cont, size_t Capacity )
+{
+    rc_t RCt;
+    struct _StrC * Ret;
+
+    RCt = 0;
+    Ret = NULL;
+
+    XFS_CAN ( Cont )
+    * Cont = NULL;
+
+    if ( Capacity == 0 ) {
+        Capacity = _STRC_INC_VAL_;
+    }
+
+    Ret = calloc ( 1, sizeof ( struct _StrC ) );
+    if ( Ret == NULL ) {
+        RCt = XFS_RC ( rcNull );
+    }
+    else {
+        Ret -> q = 0;
+        Ret -> c = Capacity;
+        Ret -> e = calloc ( Capacity, sizeof ( char * ) );
+
+        * Cont = Ret;
+    }
+
+    if ( RCt != 0 ) {
+        * Cont = NULL;
+
+        _StrCDispose ( Ret );
+    }
+
+    return RCt;
+}   /* _StrCMake () */
+
+static
+rc_t CC
+_StrCMakeFrom ( struct _StrC * From, struct _StrC ** To )
+{
+    rc_t RCt;
+    struct _StrC * Ret;
+    size_t Idx;
+    const char * Str, * Dup;
+
+    RCt = 0;
+    Ret = NULL;
+    Idx = 0;
+    Str = Dup = NULL;
+
+    XFS_CSAN ( To )
+    XFS_CAN ( From )
+    XFS_CAN ( To )
+
+    RCt = _StrCMake ( & Ret, From -> c );
+    if ( RCt == 0 ) {
+
+            /* Qty is set first for a case */
+        Ret -> q = From -> q;
+
+        for ( Idx = 0; Idx < From -> q; Idx ++ ) {
+            Str = * ( From -> e + Idx );
+            if ( Str != NULL ) {
+                RCt = XFS_StrDup ( Str, & Dup );
+                if ( RCt != 0 ) {
+                    break;
+                }
+
+                * ( Ret -> e + Idx ) = ( char * ) Dup;
+            }
+        }
+        if ( RCt == 0 ) {
+            * To = Ret;
+        }
+    }
+
+    return RCt;
+}   /* _StrCMakeFrom () */
+
+static
+rc_t CC
+_StrCReserve ( struct _StrC * self, size_t Amount )
+{
+    rc_t RCt;
+    size_t NewCapas;
+    char ** NewArr;
+
+    RCt = 0;
+    NewCapas = 0;
+
+    XFS_CAN ( self );
+
+    if ( Amount == 0 ) {
+        return 0;
+    }
+
+        /* Not enough space */
+    NewCapas = ( ( ( self -> q + Amount ) / _STRC_INC_VAL_ ) + 1 )
+                                                    * _STRC_INC_VAL_;
+
+    if ( self -> c < NewCapas ) {
+        NewArr = calloc ( NewCapas, sizeof ( char * ) );
+        if ( NewArr == NULL ) {
+            return XFS_RC ( rcExhausted );
+        }
+
+        if ( self -> e != NULL ) {
+            if ( self -> q != 0 ) {
+                memmove (
+                        NewArr,
+                        self -> e,
+                        sizeof ( char * ) * self -> q
+                        );
+            }
+
+            free ( self -> e );
+            self -> e = NULL;
+        }
+
+        self -> c = NewCapas;
+        self -> e = NewArr;
+    }
+
+    return RCt;
+}   /* _StrCReserve () */
+
+static
+rc_t CC
+_StrCInsertMany (
+            struct _StrC * self,
+            char ** From,
+            size_t Qty,
+            size_t Pos
+)
+{
+    rc_t RCt;
+    size_t Idx;
+    char * Str;
+
+    RCt = 0;
+    Idx = 0;
+    Str = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( From )
+    XFS_CA ( Qty, 0 )
+
+        /* First we should check if item come to 0-q interval
+         */
+    if ( self -> q < Pos ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+        /* Second we should reserve enough space
+         */
+    RCt = _StrCReserve ( self, Qty );
+    if ( RCt == 0 ) {
+                /* Third, shifting content if it is necessary
+                 */
+            if ( Pos < self -> q ) {
+                memmove (
+                        self -> e + Pos + Qty,
+                        self -> e + Pos,
+                        ( self -> q - Pos ) * sizeof ( char * )
+                        );
+                memset ( self -> e + Pos, 0, Qty * sizeof ( char * ) );
+            }
+
+            for ( Idx = 0; Idx < Qty; Idx ++ ) {
+                RCt = XFS_StrDup (
+                                From [ Idx ],
+                                ( const char ** ) & Str
+                                );
+                if ( RCt != 0 ) {
+                    break;
+                }
+
+                * ( self -> e + Pos + Idx ) = Str;
+            }
+
+            self -> q += Qty;
+    }
+
+    return RCt;
+}   /* _StrCInsertMany () */
+
+static
+rc_t CC
+_StrCInsert (
+            struct _StrC * self,
+            const char * Str,
+            size_t Pos
+)
+{
+    return _StrCInsertMany ( self, ( char ** ) & Str, 1, Pos );
+}   /* _StrCInsert () */
+
+static
+rc_t CC
+_StrCAdd (
+            struct _StrC * self,
+            const char * Str,
+            size_t StrLen
+)
+{
+    rc_t RCt;
+    char * TheStr;
+
+    RCt = 0;
+    TheStr = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Str )
+    XFS_CA ( StrLen, 0 )
+
+    TheStr = calloc ( StrLen + 1, sizeof ( char ) );
+    if ( TheStr == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    memmove ( TheStr, Str, sizeof ( char ) * StrLen );
+    * ( TheStr + StrLen ) = 0;
+
+    RCt = _StrCInsert ( self, TheStr, _StrCCount ( self ) );
+
+    free ( TheStr );
+
+    return RCt;
+}   /* _StrCAdd () */
+
+static
+rc_t CC
+_StrCDeleteMany ( struct _StrC * self, size_t Qty, size_t Pos )
+{
+    rc_t RCt;
+    size_t Idx, To;
+
+    RCt = 0;
+    Idx = To = 0;
+
+    XFS_CAN ( self )
+
+    if ( Qty == 0 ) {
+        return 0;
+    }
+
+        /* First, we should to check upper and lower limits */
+    if ( self -> q <= Pos ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    To = Pos + Qty;
+    if ( self -> q <= To ) {
+        To = self -> q;
+    }
+
+        /* Second, we are deleting entries */
+    for ( Idx = Pos; Idx < To; Idx ++ ) {
+        free ( * ( self -> e + Idx ) );
+        * ( self -> e + Idx ) = NULL;
+    }
+
+        /* Third, we need to move some to fill a gap
+         */
+    if ( To < self -> q ) {
+        memmove (
+                self -> e + Pos,
+                self -> e + To,
+                ( self -> q - To ) * sizeof ( char * )
+                );
+
+        memset (
+                self -> e + self -> q - To + Pos,
+                0,
+                ( To - Pos ) * sizeof ( char * )
+                );
+    }
+
+
+    self -> q -= ( To - Pos );
+
+    return RCt;
+}   /* _StrCDeleteMany () */
+
+static
+rc_t CC
+_StrCDelete ( struct _StrC * self, size_t Pos )
+{
+    return _StrCDeleteMany ( self, 1, Pos );
+}   /* _StrCDelete () */
+
+const char * CC
+_StrCGet ( struct _StrC * self, size_t Idx )
+{
+    if ( self != NULL ) {
+        if ( Idx < self -> q ) {
+            return * ( self -> e + Idx );
+        }
+    }
+
+    return NULL;
+}   /* _StrCGet () */
+
+size_t CC
+_StrCCount ( struct _StrC * self )
+{
+    return self != NULL ? self -> q : 0;
+}   /* _StrCCount () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSPath {
+    KRefcount refcount;
+
+    struct _StrC * tokens;
+
+    const char * path;
+    const char * orig;
+    bool is_absolute;
+};
+
+static const char * _sXFSPath_classname = "XFSPath";
+
+static
+rc_t CC
+_PathPrune ( struct XFSPath * self )
+{
+    rc_t RCt;
+    size_t Idx;
+    const char * Str;
+
+    RCt = 0;
+    Idx = 0;
+    Str = NULL;
+
+    XFS_CAN ( self )
+
+    Idx = 0;
+    while ( Idx < _StrCCount ( self -> tokens ) ) {
+        Str = _StrCGet ( self -> tokens, Idx );
+
+        if ( strcmp ( Str, "." ) == 0 ) {
+            _StrCDelete ( self -> tokens, Idx );
+            continue;
+        }
+
+        if ( strcmp ( Str, ".." ) == 0 ) {
+            if ( 0 < Idx ) {
+                _StrCDelete ( self -> tokens, Idx );
+                Idx --;
+                _StrCDelete ( self -> tokens, Idx );
+
+                continue;
+            }
+        }
+
+        Idx ++;
+    }
+
+    return RCt;
+}   /* _PathPrune () */
+
+static
+rc_t CC
+_PathCompile ( struct XFSPath * self, const char ** Str )
+{
+    size_t Qty, Idx, StrSize;
+    char * Path;
+    const char * Token;
+
+    Qty = Idx = StrSize = 0;
+    Path = NULL;
+    Token = NULL;
+
+    XFS_CSAN ( Str )
+    XFS_CAN ( self )
+    XFS_CAN ( Str )
+
+        /* First we are calculating size of string
+         */
+    if ( self -> is_absolute ) {        /* Trailing slash */
+        StrSize += 1;
+    }
+
+    Qty = XFSPathPartCount ( self );   /* Concatinating slashes */
+    if ( 0 < Qty ) {
+        StrSize += Qty - 1;
+
+        for ( Idx = 0; Idx < Qty; Idx ++ ) {
+            StrSize += string_size ( XFSPathPartGet ( self, Idx ) );
+        }
+    }
+
+    Path = calloc ( StrSize + 1, sizeof ( char ) );
+    if ( Path == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    * Path = 0;
+
+    if ( self -> is_absolute ) {
+        strcat ( Path, "/" );
+    }
+
+    for ( Idx = 0; Idx < Qty; Idx ++ ) {
+        Token = XFSPathPartGet ( self, Idx );
+        if ( strcmp ( Token, "/" ) != 0 ) {
+            if ( Idx != 0 ) {
+                strcat ( Path, "/" );
+            }
+            strcat ( Path, Token );
+        }
+    }
+
+    * Str = Path;
+
+    return 0;
+}   /* _PathCompile () */
+
+static
+rc_t CC
+_PathRecompile ( struct XFSPath * self )
+{
+    XFS_CAN ( self )
+
+    if ( self -> path != NULL ) {
+        free ( ( char * ) self -> path );
+
+        self -> path = NULL;
+    }
+
+    return _PathCompile ( self, & ( self -> path ) );
+}   /* _PathRecompile () */
+
+static
+void CC
+_PathClear ( struct XFSPath * self )
+{
+    if ( self == NULL ) {
+        return;
+    }
+
+    _StrCClear ( self -> tokens );
+
+    if ( self -> orig != NULL ) {
+        free ( ( char * ) self -> orig );
+
+        self -> orig = NULL;
+    }
+
+    if ( self -> path != NULL ) {
+        free ( ( char * ) self -> path );
+
+        self -> path = NULL;
+    }
+}   /* _PathClear () */
+
+static
+rc_t CC
+_PathParse (
+            struct XFSPath * self,
+            bool AddPrecedingSlash,
+            const char * Path
+)
+{
+    rc_t RCt;
+    const char * Bg, * Cr, * En;
+    bool Abs;
+
+    RCt = 0;
+    Bg = NULL;
+    Cr = NULL;
+    En = NULL;
+    Abs = false;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Path )
+
+    _PathClear ( self );
+
+    Abs = * Path == '/';
+
+    if ( Abs && AddPrecedingSlash ) {
+        RCt = _StrCAdd ( self -> tokens, "/", 1 );
+    }
+
+    if ( RCt == 0 ) {
+        Bg = Path;
+        Cr = Path;
+        En = Bg + string_size ( Path );
+        while ( Cr < En ) {
+            if ( * Cr == '/' ) {
+                if ( 0 < Cr - Bg ) {
+                    RCt = _StrCAdd ( self -> tokens, Bg, Cr - Bg );
+                    if ( RCt != 0 ) {
+                        break;
+                    }
+                }
+
+        	    while ( Cr < En ) {
+                    if ( * Cr != '/' ) {
+                        Bg = Cr;
+                        break;
+                    }
+                    Cr ++;
+                }
+            }
+            Cr ++;
+        }
+    }
+
+    if ( RCt == 0 ) {
+        if ( 0 < Cr - Bg && * Bg != '/' ) {
+            RCt = _StrCAdd ( self -> tokens, Bg, Cr - Bg );
+        }
+
+        if ( RCt == 0 ) {
+            self -> is_absolute = Abs;
+
+            RCt = XFS_StrDup ( Path, & ( self -> orig ) );
+            if ( RCt == 0 ) {
+
+                RCt = _PathPrune ( self );
+                if ( RCt == 0 ) {
+                    RCt = _PathRecompile ( self );
+                }
+            }
+        }
+    }
+
+    return RCt;
+}   /* _PathParse () */
+
+static
+rc_t CC
+_PathDispose ( const struct XFSPath * self )
+{
+    struct XFSPath * Path = ( struct XFSPath * ) self;
+
+    if ( Path == NULL ) {
+        return 0;
+    }
+
+    _PathClear ( Path );
+
+    _StrCDispose ( Path -> tokens );
+
+    KRefcountWhack ( & ( Path -> refcount ), _sXFSPath_classname );
+
+    free ( Path );
+
+    return 0;
+}   /* _PathDispose () */
+
+/*) This will alloc XFSPath structure and initialize tokens.
+  | If the From parameter is not NULL, it will fill tokens wit From
+  | content
+  (*/
+static
+rc_t CC
+_PathAlloc ( struct XFSPath ** Out, struct _StrC * From_CanBeZero )
+{
+    rc_t RCt;
+    struct XFSPath * Ret;
+
+    RCt = 0;
+    Ret = NULL;
+
+    XFS_CSAN ( Out )
+    XFS_CAN ( Out )
+
+    Ret = calloc ( 1, sizeof ( struct XFSPath ) );
+    if ( Ret == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+
+    KRefcountInit (
+                & ( Ret -> refcount ),
+                1,
+                _sXFSPath_classname,
+                "_PathAlloc",
+                "Path"
+                );
+
+    RCt = From_CanBeZero == NULL
+            ? _StrCMake ( & ( Ret -> tokens ), 0 ) 
+            : _StrCMakeFrom ( From_CanBeZero, & ( Ret -> tokens ) )
+            ;
+    if ( RCt == 0 ) {
+        * Out = Ret;
+    }
+    else {
+        * Out = NULL;
+
+        _PathDispose ( Ret );
+    }
+
+    return RCt;
+}   /* _PathAlloc () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathVMake (
+            const struct XFSPath ** Out,
+            bool AddPrecedingSlash,
+            const char * Format,
+            va_list Args
+)
+{
+    rc_t RCt;
+    char BF [ XFS_SIZE_1024 ];
+    size_t NumWrit;
+    struct XFSPath * Ret;
+    va_list xArgs;
+
+    RCt = 0;
+    * BF = 0;
+    NumWrit = 0;
+    Ret = NULL;
+
+    XFS_CSAN ( Out )
+    XFS_CAN ( Format )
+    XFS_CAN ( Out )
+
+        /* First we are trying to allocate structure
+         */
+    RCt = _PathAlloc ( & Ret, NULL );
+    if ( RCt == 0 ) {
+            /* Second we should format path
+             */
+        va_copy ( xArgs, Args );
+        RCt = string_vprintf (
+                            BF,
+                            sizeof ( BF ),
+                            & NumWrit,
+                            Format,
+                            xArgs
+                            );
+        va_end ( xArgs );
+        if ( RCt == 0 ) {
+               /* Third we should parse path
+                */
+            RCt = _PathParse ( Ret, AddPrecedingSlash, BF );
+            if ( RCt == 0 ) {
+                * Out = Ret;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Out = NULL;
+        if ( Ret != NULL ) {
+            _PathDispose ( Ret );
+        }
+    }
+
+    return RCt;
+}   /* XFSPathVMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathMake (
+            const struct XFSPath ** Out,
+            bool AddPrecedingSlash,
+            const char * Format,
+            ...
+)
+{
+    rc_t RCt;
+    va_list Args;
+
+    RCt = 0;
+
+    va_start ( Args, Format );
+    RCt = XFSPathVMake ( Out, AddPrecedingSlash, Format, Args );
+    va_end ( Args );
+
+    return RCt;
+}   /* XFSPathMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathVMakeAbsolute (
+                const struct XFSPath ** Out,
+                bool AddPrecedingSlash,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    char BF [ XFS_SIZE_1024 ];
+    va_list xArgs;
+
+    RCt = 0;
+    * BF = 0;
+
+    XFS_CSAN ( Out )
+    XFS_CAN ( Out )
+    XFS_CAN ( Format )
+
+    va_copy ( xArgs, Args );
+    RCt = XFS_VResolvePath (
+                            true,   /* Absolute */
+                            BF,
+                            sizeof ( BF ),
+                            Format,
+                            xArgs
+                            );
+    va_end ( xArgs );
+    if ( RCt == 0 ) {
+        RCt = XFSPathMake ( Out, AddPrecedingSlash, BF );
+    }
+
+    return RCt;
+}   /* XFSPathVMakeAbsolute () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathMakeAbsolute (
+                const struct XFSPath ** Out,
+                bool AddPrecedingSlash,
+                const char * Format,
+                ...
+)
+{
+    rc_t RCt;
+    va_list Args;
+
+    va_start ( Args, Format );
+
+    RCt = XFSPathVMakeAbsolute ( Out, AddPrecedingSlash, Format, Args );
+
+    va_end ( Args );
+
+    return RCt;
+}   /* XFSPathMakeAbsolute () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathDup (
+            const struct XFSPath * In,
+            const struct XFSPath ** Out
+)
+{
+    rc_t RCt;
+    struct XFSPath * Ret;
+
+    RCt = 0;
+    Ret = NULL;
+
+    XFS_CSAN ( Out )
+    XFS_CAN ( In )
+    XFS_CAN ( Out )
+
+    RCt = _PathAlloc ( & Ret, In -> tokens );
+    if ( RCt == 0 ) {
+
+        RCt = XFS_StrDup ( In -> orig, & ( Ret -> orig ) );
+        if ( RCt == 0 ) {
+            RCt = XFS_StrDup ( In -> orig, & ( Ret -> orig ) );
+            if ( RCt == 0 ) {
+                Ret -> is_absolute = In -> is_absolute;
+                * Out = Ret;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Out = NULL;
+        if ( Ret != NULL ) {
+            _PathDispose ( Ret );
+        }
+    }
+
+    return RCt;
+}   /* XFSPathDup () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathRelease ( const struct XFSPath * self )
+{
+    rc_t RCt;
+    struct XFSPath * Path;
+
+    RCt = 0;
+    Path = ( struct XFSPath * ) self;
+
+    XFS_CAN ( Path )
+
+    switch ( KRefcountDrop ( & ( Path -> refcount ), _sXFSPath_classname ) ) {
+
+        case krefOkay :
+        case krefZero :
+                    RCt = 0;
+                    break;
+        case krefWhack :
+                    RCt = _PathDispose ( Path );
+                    break;
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSPathRelease () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathAddRef ( const struct XFSPath * self )
+{
+    rc_t RCt;
+    struct XFSPath * Path;
+
+    RCt = 0;
+    Path = ( struct XFSPath * ) self;
+
+
+    XFS_CAN ( Path )
+
+    switch ( KRefcountAdd ( & ( Path -> refcount ), _sXFSPath_classname )) {
+        case krefOkay :
+                    RCt = 0;
+                    break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSPathAddRef () */
+
+XFS_EXTERN
+rc_t CC
+XFSPathSet (
+            const struct XFSPath * self,
+            bool AddPrecedingSlash,
+            const char * Format,
+            ...
+)
+{
+    rc_t RCt;
+    va_list Args;
+    char BF [ XFS_SIZE_1024 ];
+    size_t NumWrit;
+
+    RCt = 0;
+    * BF = 0;
+    NumWrit = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Format )
+
+    va_start ( Args, Format );
+    RCt = string_printf (
+                        BF,
+                        sizeof ( BF ),
+                        & NumWrit,
+                        Format,
+                        Args
+                        );
+    va_end ( Args );
+    if ( RCt == 0 ) {
+        RCt = _PathParse ( ( struct XFSPath * ) self, AddPrecedingSlash, BF ); 
+    }
+
+    return RCt;
+}   /* XFSPathSet () */
+
+XFS_EXTERN
+rc_t CC
+XFSPathSetPath (
+                const struct XFSPath * self,
+                const struct XFSPath * Path
+)
+{
+    rc_t RCt;
+    struct XFSPath * TheSelf;
+
+    RCt = 0;
+    TheSelf = ( struct XFSPath * ) self;
+
+    XFS_CAN ( TheSelf )
+    XFS_CAN ( Path )
+
+    RCt = _StrCMakeFrom ( Path -> tokens, & ( TheSelf -> tokens ) );
+    if ( RCt == 0 ) {
+
+        RCt = XFS_StrDup ( Path -> orig, & ( TheSelf -> orig ) );
+        if ( RCt == 0 ) {
+            RCt = XFS_StrDup ( Path -> orig, & ( TheSelf -> orig ) );
+            if ( RCt == 0 ) {
+                TheSelf -> is_absolute = Path -> is_absolute;
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFSPathSetPath () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathAppend (
+                const struct XFSPath * self,
+                const char * Format,
+                ...
+)
+{
+    rc_t RCt;
+    const struct XFSPath * ThePath;
+    va_list Args;
+
+    RCt = 0;
+    ThePath = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Format )
+
+    va_start ( Args, Format );
+    RCt = XFSPathVMake ( & ThePath, false, Format, Args );
+    va_end ( Args );
+
+    if ( RCt == 0 ) {
+        RCt = XFSPathAppendPath ( self, ThePath );
+
+        XFSPathRelease ( ThePath );
+    }
+
+    return RCt;
+}   /* XFSPathAppend () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathAppendPath (
+                const struct XFSPath * self,
+                const struct XFSPath * Path
+)
+{
+    rc_t RCt;
+    char * NewOrig;
+    size_t NewLen;
+    struct XFSPath * TheSelf;
+
+    RCt = 0;
+    NewOrig = NULL;
+    NewLen = 0;
+    TheSelf = ( struct XFSPath * ) self;
+
+    XFS_CAN ( TheSelf )
+    XFS_CAN ( Path )
+
+    RCt = _StrCInsertMany (
+                        TheSelf -> tokens,
+                        Path -> tokens -> e, 
+                        Path -> tokens -> q, 
+                        TheSelf -> tokens -> q
+                        );
+    if ( RCt == 0 ) {
+        NewLen = strlen ( TheSelf -> orig ) + strlen ( Path -> orig );
+        NewOrig = calloc ( 1 + NewLen, sizeof ( char ) );
+        if ( NewOrig == NULL ) {
+            RCt = XFS_RC ( rcExhausted );
+        }
+        else {
+            strcpy ( NewOrig, TheSelf -> orig );
+            strcat ( NewOrig, Path -> orig );
+            if ( TheSelf -> orig != NULL ) {
+                free ( ( char * ) TheSelf -> orig );
+            }
+            TheSelf -> orig = NewOrig;
+
+            RCt = _PathPrune ( TheSelf );
+            if ( RCt == 0 ) {
+                RCt = _PathRecompile ( TheSelf );
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFSPathAppendPath () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+LIB_EXPORT
+bool CC
+XFSPathIsAbsolute ( const struct XFSPath * self )
+{
+    return self == NULL ? false : self -> is_absolute;
+}   /* XFSPathIsAbsolute () */
+
+LIB_EXPORT
+uint32_t CC
+XFSPathPartCount ( const struct XFSPath * self )
+{
+    return self == NULL ? 0 : _StrCCount ( self -> tokens );
+}   /* XFSPathPartCount () */
+
+LIB_EXPORT
+const char * CC
+XFSPathPartGet ( const struct XFSPath * self, uint32_t Index )
+{
+    return self == NULL ? 0 : _StrCGet ( self -> tokens, Index );
+}   /* XFSPathPartGet () */
+
+LIB_EXPORT
+const char * CC
+XFSPathGet ( const struct XFSPath * self )
+{
+    return self == NULL ? NULL : self -> path;
+}   /* XFSPathGet () */
+
+LIB_EXPORT
+const char * CC
+XFSPathOrig ( const struct XFSPath * self )
+{
+    return self == NULL ? NULL : self -> orig;
+}   /* XFSPathOrig () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathParent (
+                const struct XFSPath * self,
+                const struct XFSPath ** Parent
+)
+{
+    rc_t RCt;
+    const struct XFSPath * Path;
+    uint32_t Count;
+
+    RCt = 0;
+    Path = NULL;
+    Count = 0;
+
+    XFS_CSAN ( Parent )
+    XFS_CAN ( self )
+    XFS_CAN ( Parent )
+
+    Count = XFSPathPartCount ( self );
+    if ( Count < 1 ) {
+        RCt = _PathAlloc ( ( struct XFSPath ** ) & Path, NULL );
+    }
+    else {
+        RCt = XFSPathTo ( self, Count - 1, & Path );
+    }
+
+    if ( RCt == 0 ) {
+        * Parent = Path;
+    }
+    else {
+        * Parent = NULL;
+
+        if ( Path != NULL ) {
+            XFSPathRelease ( Path );
+        }
+    }
+
+    return RCt;
+}   /* XFSPathParent () */
+
+    /*) Don't forget to free Name after using it
+     (*/
+LIB_EXPORT
+const char * CC
+XFSPathName ( const struct XFSPath * self )
+{
+    uint32_t Count;
+
+    if ( self != NULL ) {
+        Count = XFSPathPartCount ( self );
+
+        return Count < 1
+                    ? _sPathEmptyName
+                    : XFSPathPartGet ( self, Count - 1 )
+                    ;
+    }
+
+    return NULL;
+}   /* XFSPathName () */
+
+LIB_EXPORT
+bool CC
+XFSPathEqual (
+            const struct XFSPath * Path1,
+            const struct XFSPath * Path2
+)
+{
+    size_t s;
+
+    if ( Path1 != NULL && Path2 != NULL ) {
+        if ( Path1 == Path2 ) {
+            return true;
+        }
+
+        s = string_size ( XFSPathGet ( Path1 ) );
+
+        if ( s == string_size ( XFSPathGet ( Path2 ) ) ) {
+            return string_cmp (
+                            XFSPathGet ( Path1 ),
+                            s,
+                            XFSPathGet ( Path2 ),
+                            s,
+                            s
+                            ) == 0;
+        }
+
+    }
+    return false;
+}   /* XFSPathEqual () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+LIB_EXPORT
+rc_t CC
+XFSPathSub (
+            const struct XFSPath * self,
+            size_t From,
+            size_t To,
+            const struct XFSPath ** Path
+)
+{
+    rc_t RCt;
+    size_t Idx, Qty;
+    struct XFSPath * Ret;
+
+    RCt = 0;
+    Idx = Qty = 0;
+    Ret = NULL;
+
+    XFS_CSAN ( Path )
+    XFS_CAN ( self )
+    XFS_CAN ( Path )
+
+        /*) First, checking range
+         (*/
+    Qty = XFSPathPartCount ( self );
+    if ( Qty < From || Qty < To ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = _PathAlloc ( & Ret, NULL );
+    if ( RCt == 0 ) {
+        for ( Idx = From; Idx < To; Idx ++ ) {
+            RCt = _StrCInsert (
+                            Ret -> tokens,
+                            _StrCGet ( self -> tokens, Idx ),
+                            _StrCCount ( Ret -> tokens )
+                            );
+            if ( RCt != 0 ) {
+                break;
+            }
+        }
+        if ( RCt == 0 ) {
+            Ret -> is_absolute = From == 0
+                                    ? self -> is_absolute
+                                    : false
+                                    ;
+            RCt = _PathPrune ( Ret );
+            if ( RCt == 0 ) {
+                RCt = _PathRecompile ( Ret );
+                if ( RCt == 0 ) {
+                    RCt = XFS_StrDup (
+                                    Ret -> path,
+                                    & ( Ret -> orig )
+                                    );
+                    if ( RCt == 0 ) {
+                        * Path = Ret;
+                    }
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Path = NULL;
+
+        if ( Ret != NULL ) {
+            _PathDispose ( Ret );
+        }
+    }
+
+    return RCt;
+}   /* XFSPathSub () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathFrom (
+            const struct XFSPath * self,
+            size_t From,
+            const struct XFSPath ** Path
+)
+{
+    XFS_CAN ( self )
+
+    return XFSPathSub ( self, From, XFSPathPartCount ( self ), Path );
+}   /* XFSPathFrom () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathTo (
+            const struct XFSPath * self,
+            size_t To,
+            const struct XFSPath ** Path
+)
+{
+    return XFSPathSub ( self, 0, To, Path );
+}   /* XFSPathTo () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*) That method will check if Path is base path for 'self'. i.e.
+| self could be composed as concatenation of Path and RelPath
+| RelPath could be zero, in that case it will be not returned
+| Apparently, that means Path is a sub of self, so we will call
+| XFSPathIsChild method with reversed parameters
+(*/
+LIB_EXPORT
+bool CC
+XFSPathIsBase (
+            const struct XFSPath * self,
+            const struct XFSPath * Path,
+            const struct XFSPath ** RelPath
+)
+{
+    return XFSPathIsChild ( Path, self, RelPath );
+}   /* XFSPathIsBase () */
+
+LIB_EXPORT
+bool CC
+XFSPathSIsBase (
+            const char * self,
+            const char * Path,
+            const struct XFSPath ** RelPath
+)
+{
+    return XFSPathSIsChild ( Path, self, RelPath );
+}   /* XFSPathSIsBase () */
+
+/*) That method will check if Path is child ( sub ) path for 'self'.
+| i.e. Path could be composed as concatenation of self and RelPath
+| RelPath could be zero, in that case it will be not returned
+(*/
+LIB_EXPORT
+bool CC
+XFSPathIsChild (
+            const struct XFSPath * self,
+            const struct XFSPath * Path,
+            const struct XFSPath ** RelPath
+)
+{
+    rc_t RCt;
+    bool RetVal;
+    size_t SelfQty, PathQty, Idx;
+    const char * s1, * s2;
+    const struct XFSPath * TheRel;
+
+    RCt = 0;
+    RetVal = false;
+    SelfQty = PathQty = Idx = 0;
+    s1 = s2 = NULL;
+    TheRel = NULL;
+
+    XFS_CSAN ( RelPath )
+    XFS_CAN ( self )
+    XFS_CAN ( Path )
+    XFS_CAN ( RelPath )
+
+
+    /*) Apparently we shoud check that all parts of TheSelf
+      | are also parts of ThePath
+      (*/
+    SelfQty = XFSPathPartCount ( self );
+    PathQty = XFSPathPartCount ( Path );
+
+        /* We could compare only absolute path ... because
+         | we can not tell about relative path how they are
+         | relative ... lol
+         */
+    if ( self -> is_absolute && Path -> is_absolute && 
+        SelfQty <= PathQty ) {
+        for ( Idx = 0; Idx < SelfQty; Idx ++ ) {
+            s1 = XFSPathPartGet ( self, Idx );
+            s2 = XFSPathPartGet ( Path, Idx );
+            if ( s1 == NULL || s2 == NULL ) {
+                RCt = XFS_RC ( rcInvalid );
+            }
+
+            if ( strcmp ( s1, s2 ) != 0 ) {
+                RCt = XFS_RC ( rcInvalid );
+            }
+        }
+
+        if ( RCt == 0 ) {
+            RetVal = true;
+
+            if ( RelPath != NULL ) {
+                RCt = XFSPathFrom (
+                                Path,
+                                SelfQty,
+                                & TheRel
+                                );
+                if ( RCt == 0 ) {
+                    * RelPath = TheRel;
+                }
+                else {
+                    if ( TheRel != NULL ) {
+                        _PathDispose ( TheRel );
+                    }
+                }
+            }
+        }
+    }
+
+    return RCt == 0 ? RetVal : false;
+}   /* XFSPathIsChild () */
+
+LIB_EXPORT
+bool CC
+XFSPathSIsChild (
+            const char * self,
+            const char * Path,
+            const struct XFSPath ** RelPath
+)
+{
+    rc_t RCt;
+    bool RetVal;
+    const struct XFSPath * TheSelf;
+    const struct XFSPath * ThePath;
+
+    RCt = 0;
+    RetVal = false;
+    ThePath = NULL;
+
+    XFS_CSAN ( RelPath )
+    XFS_CAN ( self )
+    XFS_CAN ( Path )
+
+    RCt = XFSPathMake ( & TheSelf, true, self );
+    if ( RCt == 0 ) {
+        RCt = XFSPathMake ( & ThePath, true, Path );
+        if ( RCt == 0 ) {
+            RetVal = XFSPathIsChild ( TheSelf, ThePath, RelPath );
+
+            XFSPathRelease ( ThePath );
+        }
+
+        XFSPathRelease ( TheSelf );
+    }
+
+    return RCt == 0 ? RetVal : false;
+}   /* XFSPathSIsChild () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+LIB_EXPORT
+void CC
+XFSPathDump ( const struct XFSPath * self )
+{
+    size_t Idx = 0;
+
+    if ( self == NULL ) {
+        LogMsg ( klogDebug, "  [Path] NULL" );
+        return;
+    }
+
+    pLogMsg ( klogDebug, "  [Path] [$(orig)]", "orig=%s", self -> orig );
+    pLogMsg ( klogDebug, "   [abs] [$(abs)]", "abs=%s", self -> is_absolute ? "yes" : "no" );
+    pLogMsg ( klogDebug, "  [path] [$(path)]", "path=%s", self -> path );
+
+    pLogMsg ( klogDebug, "   [qty] [$(qty)]", "qty=%ld", self -> tokens -> q );
+    for ( Idx = 0; Idx < self -> tokens ->q; Idx ++ ) {
+        pLogMsg ( klogDebug, "        [$(idx)] [$(token)]", "idx=%ld,token=%s", Idx, self -> tokens -> e [ Idx ] );
+    }
+
+}   /* XFSPathDump () */
diff --git a/libs/xfs/perm.c b/libs/xfs/perm.c
new file mode 100644
index 0000000..f7682f0
--- /dev/null
+++ b/libs/xfs/perm.c
@@ -0,0 +1,805 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+
+#include <xfs/perm.h>
+
+#include "zehr.h"
+
+#include <sysalloc.h>
+
+#include <ctype.h>  /* isspace () */
+#include <os-native.h>
+
+
+/*)))
+ |||
+ +++    XFSPerm and all about
+ |||
+(((*/
+
+static char _sUserDefault [ XFS_SIZE_128 ];
+static char _sGroupDefault [ XFS_SIZE_128 ];
+static char _sOtherDefault [ XFS_SIZE_128 ];
+
+/*))))))
+ //////  XFSAuth
+((((((*/
+
+/*))
+ ((     Structures itself
+  ))
+ ((*/
+struct XFSAuth {
+    char * Name;
+    bool NameDefaulted;
+    bool CanRead;
+    bool CanWrite;
+    bool CanExecute;
+};
+
+static
+rc_t CC
+_AuthDispose ( const struct XFSAuth * self )
+{
+    struct XFSAuth * Auth = ( struct XFSAuth * ) self;
+
+    if ( Auth != NULL ) {
+        if ( ! Auth -> NameDefaulted ) {
+            if ( Auth -> Name != NULL ) {
+                free ( Auth -> Name );
+            }
+        }
+        else {
+            Auth -> Name = NULL;
+        }
+
+        free ( Auth );
+    }
+
+    return 0;
+}   /* _AuthDispose () */
+
+static
+rc_t CC
+_AuthMake (
+            const char * Name,
+            bool NameDefaulted,
+            bool CanRead,
+            bool CanWrite,
+            bool CanExecute,
+            const struct XFSAuth ** Auth
+)
+{
+    struct XFSAuth * TheAuth;
+
+    if ( Name == NULL || Auth == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Auth = NULL;
+
+    TheAuth = calloc ( 1, sizeof ( struct XFSAuth ) );
+    if ( TheAuth == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    if ( ! NameDefaulted ) {
+        TheAuth -> Name = string_dup_measure ( Name, NULL );
+        if ( TheAuth -> Name == NULL ) {
+            _AuthDispose ( TheAuth );
+
+            return XFS_RC ( rcExhausted );
+        }
+    }
+    else {
+        TheAuth -> Name = ( char * ) Name;
+    }
+
+    TheAuth -> NameDefaulted = NameDefaulted;
+    TheAuth -> CanRead = CanRead;
+    TheAuth -> CanWrite = CanWrite;
+    TheAuth -> CanExecute = CanExecute;
+
+    * Auth = TheAuth;
+
+    return 0;
+}   /* _AuthMake () */
+
+/*))))))
+ //////  XFSPerm
+((((((*/
+/*))
+ ((     Structures itself : now it is just a three pointers, but
+  ))    I will make BStree in the case of something complex
+ ((*/
+struct XFSPerm {
+    const struct XFSAuth * U;
+    const struct XFSAuth * G;
+    const struct XFSAuth * O;
+};
+
+/*))
+ ((     Here we are.
+  ))
+ ((*/
+static
+const char * CC
+_Perm_SkipTrail ( const char * Start )
+{
+    if ( Start != NULL ) {
+        while ( true ) {
+            if ( * Start == 0 ) {
+                return NULL;
+            }
+            if ( ! isspace ( * Start ) ) {
+                return Start;
+            }
+
+            Start ++;
+        }
+    }
+
+    return NULL;
+}   /* _Perm_SkipTrail () */
+
+static
+rc_t CC
+_Perm_ReadValue (
+                const char * Start,
+                const char ** Next,
+                char ** Value
+)
+{
+    const char * End;
+
+    if ( Value == NULL || Next == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Next = NULL;
+    * Value = NULL;
+
+    if ( Start == NULL ) {
+        return 0;
+    }
+
+    End = Start;
+
+    while ( * End != 0 && * End != ':' ) { End ++; }
+
+    if ( 0 == End - Start ) {
+        if ( * End == ':' ) {
+            * Next = End + 1;
+        }
+        return 0;
+    }
+
+    * Value = string_dup ( Start, End - Start );
+    if ( * Value == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    if ( * End == ':' ) {
+        * Next = End + 1;
+    }
+
+    return 0;
+}   /* _Perm_ReadString () */
+
+static
+rc_t CC
+_Perm_StringParse (
+            const char * PermAsString,
+            char ** Perm,
+            char ** User,
+            char ** Group,
+            char ** Other
+)
+{
+    rc_t RCt;
+    const char * pStart, * pEnd;
+    char ch;
+    int llp;
+    const int _PLN = 9;
+
+    RCt = 0;
+    pStart = pEnd = NULL;
+    ch = 0;
+    llp = 0;
+
+        /*  We should get at least permissions
+         */
+    if ( PermAsString == NULL || Perm == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Perm = NULL;
+
+    if ( User != NULL )  { * User = NULL;  }
+    if ( Group != NULL ) { * Group = NULL; }
+    if ( Other != NULL ) { * Other = NULL; }
+
+    pStart = ( char * ) PermAsString;
+
+
+    pStart = _Perm_SkipTrail ( pStart );
+    if ( pStart == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+        /*  second we are reading permissions 9 characters;
+         */
+    for ( llp = 0; llp < _PLN ; llp ++ ) {
+        ch = * ( pStart + llp );
+        if ( ch == 0 ) {
+            return XFS_RC ( rcInvalid );
+        }
+
+        if ( ch != '-' ) {
+            if ( llp % 3 == 0 && ch != 'r' ) {
+                return XFS_RC ( rcInvalid );
+            }
+            if ( llp % 3 == 1 && ch != 'w' ) {
+                return XFS_RC ( rcInvalid );
+            }
+            if ( llp % 3 == 2 && ch != 'x' ) {
+                return XFS_RC ( rcInvalid );
+            }
+        }
+    }
+
+    * Perm = string_dup ( pStart, _PLN );
+    if ( * Perm == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    pStart += _PLN;
+
+        /*  skipping to the next entry
+         */
+    pStart = _Perm_SkipTrail ( pStart );
+    if ( pStart == NULL ) {
+        return 0;
+    }
+
+        /*  third we are reading user
+         */
+    RCt = _Perm_ReadValue ( pStart, & pEnd, User );
+    if ( RCt == 0 && pEnd != NULL ) {
+        RCt = _Perm_ReadValue ( pEnd, & pStart, Group );
+        if ( RCt == 0 && pStart != 0 ) {
+            RCt = _Perm_ReadValue ( pStart, & pEnd, Other );
+        }
+    }
+
+    return RCt;
+}   /* _Perm_StringParse () */
+
+static
+rc_t CC
+_MakeAuth (
+        XFSAType Type,
+        const char * Name,
+        const char * Perm,
+        const struct XFSAuth ** Auth
+)
+{
+    const char * RName;
+    bool DF, CR, CW, CE;
+
+    RName = NULL;
+    DF = CR = CW = CE = false;
+
+    if ( Auth == NULL || Perm == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Auth = NULL;
+
+    DF = Name == NULL;
+    RName = DF ? XFSPermDefaultName ( Type ) : Name;
+
+    CR = * ( Perm + ( Type * 3 ) + 0 ) == 'r';
+    CW = * ( Perm + ( Type * 3 ) + 1 ) == 'w';
+    CE = * ( Perm + ( Type * 3 ) + 2 ) == 'x';
+
+    return _AuthMake ( RName, DF, CR, CW, CE, Auth );
+}   /* _MakeAuth () */
+
+LIB_EXPORT
+rc_t CC
+XFSPermMake (
+            const char * PermAsString,
+            const struct XFSPerm ** Permissions
+)
+{
+    rc_t RCt;
+    struct XFSPerm * Perm;
+    char * SPerm, * User, * Group, * Other;
+
+    RCt = 0;
+    Perm = NULL;
+    SPerm = User = Group = Other = NULL;
+
+    if ( PermAsString == NULL || Permissions == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Permissions = NULL;
+
+    Perm = calloc ( 1, sizeof ( struct XFSPerm ) );
+    if ( Perm != NULL ) {
+        RCt = _Perm_StringParse (
+                            PermAsString,
+                            & SPerm,
+                            & User,
+                            & Group,
+                            & Other
+                        );
+        if ( RCt == 0 ) {
+            RCt = _MakeAuth ( kxfsUser, User, SPerm, & ( Perm -> U ) );
+            if ( RCt == 0 ) {
+                RCt = _MakeAuth (
+                                kxfsGroup,
+                                Group,
+                                SPerm,
+                                & ( Perm -> G )
+                                );
+                if ( RCt == 0 ) {
+                    RCt = _MakeAuth ( 
+                                kxfsOther,
+                                Other,
+                                SPerm,
+                                & ( Perm -> O )
+                                );
+                }
+            }
+        }
+    }
+    else {
+        RCt = XFS_RC ( rcExhausted );
+    }
+
+    if ( SPerm != NULL ) {
+        free ( SPerm );
+    }
+    if ( User != NULL ) {
+        free ( User );
+    }
+    if ( Group != NULL ) {
+        free ( Group );
+    }
+    if ( Other != NULL ) {
+        free ( Other );
+    }
+
+    if ( RCt != 0 ) {
+        XFSPermDispose ( Perm );
+    }
+    else {
+        * Permissions = Perm;
+    }
+
+    return RCt;
+}   /* XFSPermMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSPermDispose ( const struct XFSPerm * self )
+{
+    rc_t RCt;
+    struct XFSPerm * Perm;
+
+    RCt = 0;
+
+    Perm = ( struct XFSPerm * ) self;
+
+    if ( Perm != NULL ) {
+        if ( Perm -> U != NULL ) {
+            _AuthDispose ( Perm -> U );
+            Perm -> U = NULL;
+        }
+
+        if ( Perm -> G != NULL ) {
+            _AuthDispose ( Perm -> G );
+            Perm -> G = NULL;
+        }
+
+        if ( Perm -> O != NULL ) {
+            _AuthDispose ( Perm -> O );
+            Perm -> O = NULL;
+        }
+
+        free ( Perm );
+    }
+
+    return RCt;
+}   /* XFSPermDispose () */
+
+/*)))
+ ///    Defaults
+(((*/
+static
+rc_t CC
+_Perm_SetDefault (
+                const char * Default,
+                char * Buffer,
+                size_t BufferSize
+)
+{
+    size_t CYP;
+
+    if ( Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Default == NULL ) {
+        * Buffer = 0;
+        return 0;
+    }
+
+    CYP = string_size ( Default );
+
+    if ( BufferSize <= CYP ) {
+        return XFS_RC ( rcTooBig );
+    }
+
+        /* he-he ... should we check if it happens ? */
+    string_copy ( Buffer, BufferSize, Default, CYP );
+
+    return 0;
+}   /* _Perm_SetDefault () */
+
+LIB_EXPORT
+const struct XFSAuth * CC
+XFSPermAuth ( const struct XFSPerm * self, XFSAType Type )
+{
+    if ( self != NULL ) {
+        switch ( Type ) {
+            case kxfsUser  : return self -> U;
+            case kxfsGroup : return self -> G;
+            case kxfsOther : return self -> O;
+        }
+    }
+    return NULL;
+}   /* XFSPermAuth () */
+
+LIB_EXPORT
+rc_t CC
+XFSPermToString (
+            const struct XFSPerm * self,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    if ( self == NULL || Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+    * Buffer = 0;
+
+    if ( self -> U == NULL || self -> G == NULL || self -> O == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    strcat ( Buffer, ( self -> U -> CanRead )    ? "r" : "-" );
+    strcat ( Buffer, ( self -> U -> CanWrite )   ? "w" : "-" );
+    strcat ( Buffer, ( self -> U -> CanExecute ) ? "x" : "-" );
+    strcat ( Buffer, ( self -> G -> CanRead )    ? "r" : "-" );
+    strcat ( Buffer, ( self -> G -> CanWrite )   ? "w" : "-" );
+    strcat ( Buffer, ( self -> G -> CanExecute ) ? "x" : "-" );
+    strcat ( Buffer, ( self -> O -> CanRead )    ? "r" : "-" );
+    strcat ( Buffer, ( self -> O -> CanWrite )   ? "w" : "-" );
+    strcat ( Buffer, ( self -> O -> CanExecute ) ? "x" : "-" );
+
+    if (    ! self -> U -> NameDefaulted
+        ||  ! self -> G -> NameDefaulted
+        ||  ! self -> O -> NameDefaulted ) {
+
+        strcat ( Buffer, " " );
+
+        if ( ! self -> U -> NameDefaulted ) {
+            strcat ( Buffer, self -> U -> Name );
+        }
+
+        if (    ! self -> G -> NameDefaulted
+            ||  ! self -> O -> NameDefaulted ) {
+            strcat ( Buffer, ":" );
+        }
+
+        if ( ! self -> G -> NameDefaulted ) {
+            strcat ( Buffer, self -> G -> Name );
+        }
+
+        if ( ! self -> O -> NameDefaulted ) {
+            strcat ( Buffer, ":" );
+
+            strcat ( Buffer, self -> O -> Name );
+        }
+    }
+
+    return 0;
+}   /* XFSPermToString () */
+
+LIB_EXPORT
+const char * CC
+XFSPermDefaultName ( XFSAType Type )
+{
+    switch ( Type ) {
+        case kxfsUser :  return _sUserDefault;
+        case kxfsGroup : return _sGroupDefault;
+        case kxfsOther : return _sOtherDefault;
+    }
+    return NULL;
+}   /* XFSPermDefaultName () */
+
+LIB_EXPORT
+rc_t CC
+XFSPermSetDefaultName ( XFSAType Type, const char * Name )
+{
+    switch ( Type ) {
+        case kxfsUser :
+                return _Perm_SetDefault (
+                                        Name,
+                                        _sUserDefault,
+                                        sizeof ( _sUserDefault )
+                                        );
+        case kxfsGroup :
+                return _Perm_SetDefault (
+                                        Name,
+                                        _sGroupDefault,
+                                        sizeof ( _sGroupDefault )
+                                        );
+        case kxfsOther :
+                return _Perm_SetDefault (
+                                        Name,
+                                        _sOtherDefault,
+                                        sizeof ( _sOtherDefault )
+                                        );
+    }
+    return XFS_RC ( rcUnknown );
+}   /* XFSPermSetDefaultName () */
+
+LIB_EXPORT
+const char * CC
+XFSAuthName ( const struct XFSAuth * self )
+{
+    return self == NULL ? NULL : ( self -> Name );
+}   /* XFSAuthName () */
+
+LIB_EXPORT
+bool CC
+XFSAuthCanRead ( const struct XFSAuth * self )
+{
+    return self == NULL ? false : ( self -> CanRead );
+}   /* XFSAuthCanRead () */
+
+LIB_EXPORT
+bool CC
+XFSAuthCanWrite ( const struct XFSAuth * self )
+{
+    return self == NULL ? false : ( self -> CanWrite );
+}   /* XFSAuthCanWrite () */
+
+LIB_EXPORT
+bool CC
+XFSAuthCanExecute ( const struct XFSAuth * self )
+{
+    return self == NULL ? false : ( self -> CanExecute );
+}   /* XFSAuthCanExecute () */
+
+/*))))))
+ //////  Misc
+((((((*/
+
+LIB_EXPORT
+rc_t CC
+XFSPermToNum ( const char * Perm, uint32_t * Num )
+{
+    rc_t RCt;
+    uint32_t xNum;
+    const struct XFSPerm * xPerm;
+    const struct XFSAuth * xAuth;
+
+    RCt = 0;
+    xNum = 0;
+    xPerm = NULL;
+    xAuth = NULL;
+
+    if ( Num == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Num = 0;
+
+    if ( Perm == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSPermMake ( Perm, & xPerm );
+    if ( RCt == 0 ) {
+        xAuth = XFSPermAuth ( xPerm, kxfsUser );
+        if ( xAuth != NULL ) {
+            if ( XFSAuthCanRead    ( xAuth ) ) { xNum |= 0400; }
+            if ( XFSAuthCanWrite   ( xAuth ) ) { xNum |= 0200; }
+            if ( XFSAuthCanExecute ( xAuth ) ) { xNum |= 0100; }
+        }
+
+        xAuth = XFSPermAuth ( xPerm, kxfsGroup );
+        if ( xAuth != NULL ) {
+            if ( XFSAuthCanRead    ( xAuth ) ) { xNum |= 040; }
+            if ( XFSAuthCanWrite   ( xAuth ) ) { xNum |= 020; }
+            if ( XFSAuthCanExecute ( xAuth ) ) { xNum |= 010; }
+        }
+
+        xAuth = XFSPermAuth ( xPerm, kxfsOther );
+        if ( xAuth != NULL ) {
+            if ( XFSAuthCanRead    ( xAuth ) ) { xNum |= 04; }
+            if ( XFSAuthCanWrite   ( xAuth ) ) { xNum |= 02; }
+            if ( XFSAuthCanExecute ( xAuth ) ) { xNum |= 01; }
+        }
+
+        * Num = xNum;
+
+        XFSPermDispose ( xPerm );
+    }
+
+    return RCt;
+}   /* XFSPermToNum () */
+
+
+LIB_EXPORT
+rc_t CC
+XFSPermToChar ( uint32_t Num, char * Buf, size_t BufSize )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( Buf == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( BufSize <= 10 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Buf = 0;
+
+        /* owner */
+    Buf [ 0 ] = ( Num & 0400 ) == 0400 ? 'r' : '-';
+    Buf [ 1 ] = ( Num & 0200 ) == 0200 ? 'w' : '-';
+    Buf [ 2 ] = ( Num & 0100 ) == 0100 ? 'x' : '-';
+        /* group */
+    Buf [ 3 ] = ( Num & 040 ) == 040 ? 'r' : '-';
+    Buf [ 4 ] = ( Num & 020 ) == 020 ? 'w' : '-';
+    Buf [ 5 ] = ( Num & 010 ) == 010 ? 'x' : '-';
+        /* others */
+    Buf [ 6 ] = ( Num & 04 ) == 04 ? 'r' : '-';
+    Buf [ 7 ] = ( Num & 02 ) == 02 ? 'w' : '-';
+    Buf [ 8 ] = ( Num & 01 ) == 01 ? 'x' : '-';
+
+        /* internet users */
+    Buf [ 9 ] = 0;
+
+    return RCt;
+}   /* XFSPermToChar () */
+
+/*))))))
+ //////  Defaults ... sorry, hardcoding those
+((((((*/
+static const char * _DefROPermForContainer = "r-xr-xr-x";
+static const char * _DefROPermForNode = "r--r--r--";
+static uint32_t _DefROPermForContainerNum = 0;
+static uint32_t _DefROPermForNodeNum = 0;
+
+LIB_EXPORT
+const char * CC
+XFSPermRODefContChar ()
+{
+    return _DefROPermForContainer;
+}   /* XFSPermRODefContChar () */
+
+LIB_EXPORT
+const char * CC
+XFSPermRODefNodeChar ()
+{
+    return _DefROPermForNode;
+}   /* XFSPermRODefNodeChar () */
+
+LIB_EXPORT
+uint32_t CC
+XFSPermRODefContNum ()
+{
+    uint32_t T;
+
+    if ( _DefROPermForContainerNum == 0 ) {
+        XFSPermToNum ( XFSPermRODefContChar (), & T );
+        _DefROPermForContainerNum = T;
+    }
+
+    return _DefROPermForContainerNum;
+}   /* XFSPermRODefContNum () */
+
+LIB_EXPORT
+uint32_t CC
+XFSPermRODefNodeNum ()
+{
+    uint32_t T;
+
+    if ( _DefROPermForNodeNum == 0 ) {
+        XFSPermToNum ( XFSPermRODefNodeChar (), & T );
+        _DefROPermForNodeNum = T;
+    }
+
+    return _DefROPermForNodeNum;
+}   /* XFSPermRODefNodeNum () */
+
+/*))))))
+ //////  Defaults ... sorry, hardcoding those
+((((((*/
+static const char * _DefRWPermForContainer = "rwxr-xr-x";
+static const char * _DefRWPermForNode = "rw-r--r--";
+static uint32_t _DefRWPermForContainerNum = 0;
+static uint32_t _DefRWPermForNodeNum = 0;
+
+LIB_EXPORT
+const char * CC
+XFSPermRWDefContChar ()
+{
+    return _DefRWPermForContainer;
+}   /* XFSPermRWDefContChar () */
+
+LIB_EXPORT
+const char * CC
+XFSPermRWDefNodeChar ()
+{
+    return _DefRWPermForNode;
+}   /* XFSPermRWDefNodeChar () */
+
+LIB_EXPORT
+uint32_t CC
+XFSPermRWDefContNum ()
+{
+    uint32_t T;
+
+    if ( _DefRWPermForContainerNum == 0 ) {
+        XFSPermToNum ( XFSPermRWDefContChar (), & T );
+        _DefRWPermForContainerNum = T;
+    }
+
+    return _DefRWPermForContainerNum;
+}   /* XFSPermRWDefContNum () */
+
+LIB_EXPORT
+uint32_t CC
+XFSPermRWDefNodeNum ()
+{
+    uint32_t T;
+
+    if ( _DefRWPermForNodeNum == 0 ) {
+        XFSPermToNum ( XFSPermRWDefNodeChar (), & T );
+        _DefRWPermForNodeNum = T;
+    }
+
+    return _DefRWPermForNodeNum;
+}   /* XFSPermRWDefNodeNum () */
diff --git a/libs/xfs/platform.h b/libs/xfs/platform.h
new file mode 100644
index 0000000..193d7b0
--- /dev/null
+++ b/libs/xfs/platform.h
@@ -0,0 +1,51 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_platform_
+#define _h_platform_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   This file contains platform dependent forwards.
+  ))))
+ ((((*/
+
+/*))    Set virtual table for control Fuse or DOKAN based
+ ((*/
+XFS_EXTERN
+rc_t CC
+XFSControlPlatformInit ( struct XFSControl * self );
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _h_platform_ */
diff --git a/libs/xfs/readme.c b/libs/xfs/readme.c
new file mode 100644
index 0000000..470176a
--- /dev/null
+++ b/libs/xfs/readme.c
@@ -0,0 +1,193 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <xfs/model.h>
+#include <xfs/node.h>
+#include <xfs/doc.h>
+
+
+#include "teleport.h"
+#include "common.h"
+
+#include <sysalloc.h>
+
+
+/*)))
+ |||
+ +++    ReadMeNode lives here
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+static
+rc_t CC
+_ReadMeNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    const char * NodeName;
+    const char * TextOrSource;
+    struct XFSDoc * ReadMe;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+    TextOrSource = NULL;
+    ReadMe = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Model == NULL || Template == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    /*) There could be "text" and "source" parameters, we will leave
+      | source for a future development then, and will use it as text
+      (*/
+    TextOrSource = XFSModelNodeProperty ( Template, XFS_MODEL_TEXT );
+    if ( TextOrSource == NULL ) {
+        TextOrSource = XFSModelNodeProperty ( Template, XFS_MODEL_SOURCE );
+    }
+
+    if ( TextOrSource == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSTextDocMake ( & ReadMe );
+    if ( RCt == 0 ) {
+
+        RCt = XFSTextDocAppend ( ReadMe, "README:\n%s\n", TextOrSource );
+        if ( RCt == 0 ) {
+            RCt = XFSDocNodeMakeWithFlavor (
+                                & TheNode,
+                                ReadMe,
+                                NodeName,
+                                XFSModelNodeSecurity ( Template ),
+                                _sFlavorOfReadMe
+                                );
+            if ( RCt == 0 ) {
+                * Node = TheNode;
+            }
+            else {
+                if ( TheNode != NULL ) {
+                    XFSNodeDispose ( TheNode );
+                }
+            }
+        }
+
+        XFSDocRelease ( ReadMe );
+    }
+
+    return RCt;
+}   /* _ReadMeNodeConstructor () */
+
+/*)))
+ |||
+ +++    ReadMeNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_ReadMeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = _ReadMeNodeConstructor (
+                            Model,
+                            Template,
+                            Alias,
+                            Node
+                            );
+
+/*
+pLogMsg ( klogDebug, "_ReadMeConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,templat=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _ReadMeConstructor () */
+
+static
+rc_t CC
+_ReadMeValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_ReadMeValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,templat=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _ReadMeValidator () */
+
+static const struct XFSTeleport _sReadMeTeleport = {
+                                            _ReadMeConstructor,
+                                            _ReadMeValidator,
+                                            false
+                                            };
+
+
+LIB_EXPORT
+rc_t CC
+XFSReadMeProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sReadMeTeleport;
+
+    return 0;
+}   /* XFSReadMeProvider () */
+
diff --git a/libs/xfs/schwarzschraube.c b/libs/xfs/schwarzschraube.c
new file mode 100644
index 0000000..3062a0f
--- /dev/null
+++ b/libs/xfs/schwarzschraube.c
@@ -0,0 +1,334 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/printf.h>
+
+#include <vfs/manager.h>
+#include <kns/manager.h>
+#include <kfs/directory.h>
+
+#include "schwarzschraube.h"
+
+#include <sysalloc.h>
+
+ /*))))
+   |||| That file contains unsoted methods
+   ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))  if Source is NULL, it will be passed to Destination
+ ((*/
+LIB_EXPORT
+rc_t CC
+XFS_StrDup ( const char * Src,  const char ** Dst )
+{
+    char ** TheDst;
+
+    TheDst = ( char ** ) Dst;
+
+    if ( TheDst == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Src == NULL ) {
+        * TheDst = NULL;
+
+        return 0;
+    }
+
+    * TheDst = string_dup_measure ( Src, NULL );
+    if ( * TheDst == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    return 0;
+}   /* XFS_StrDup () */
+
+/*))  if Source is NULL, it will be passed to Destination
+ ((*/
+LIB_EXPORT
+rc_t CC
+XFS_SStrDup ( const struct String * Src,  const char ** Dst )
+{
+    char ** TheDst = ( char ** ) Dst;
+
+    if ( TheDst == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Src == NULL ) {
+        * TheDst = NULL;
+
+        return 0;
+    }
+
+    if ( Src -> size == 0 ) {
+        * TheDst = NULL;
+
+        return 0;
+    }
+
+    * TheDst = string_dup ( Src -> addr, Src -> size );
+    if ( * TheDst == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    return 0;
+}   /* XFS_SStrDup () */
+
+LIB_EXPORT
+rc_t CC
+XFS_StrEndsWith ( const char * Str, const char * End )
+{
+    uint32_t StrLen, EndLen;
+
+    if ( Str == NULL || End == NULL ) {
+        return false;
+    }
+
+    StrLen = string_len ( Str, string_size ( Str ) );
+    EndLen = string_len ( End, string_size ( End ) );
+
+    if ( StrLen >= EndLen && EndLen > 0 ) {
+        return string_cmp (
+                        Str + ( StrLen - EndLen ),
+                        EndLen,
+                        End,
+                        EndLen,
+                        EndLen
+                        ) == 0;
+    }
+
+    return false;
+}   /* XFS_StrEndsWith () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))   Sometime we need VFSManager, and it is very costly to
+ |||    make it each time on demand ... so here is it
+ |||    NOTE: Initializing and Destroying code arent thread safe!!!
+ |||          will add mutexes if it really need to :)
+(((*/
+
+static struct VFSManager * _sVfsManager = NULL;
+
+LIB_EXPORT
+rc_t CC
+XFS_VfsManagerInit ()
+{
+    rc_t RCt;
+    struct VFSManager * Manager;
+
+    RCt = 0;
+    Manager = NULL;
+
+    if ( _sVfsManager == NULL ) {
+        RCt = VFSManagerMake ( & Manager );
+        if ( RCt == 0 ) {
+            if ( Manager == NULL ) {
+                RCt = XFS_RC ( rcNull );
+            }
+            else {
+                _sVfsManager = Manager;
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFS_VfsManagerInit () */
+
+LIB_EXPORT
+rc_t CC
+XFS_VfsManagerDispose ()
+{
+    rc_t RCt;
+    struct VFSManager * Manager;
+
+    RCt = 0;
+    Manager = _sVfsManager;
+
+    if ( Manager != NULL ) {
+        _sVfsManager = NULL;
+
+        RCt = VFSManagerRelease ( Manager );
+    }
+
+    return RCt;
+}   /* XFS_VfsManagerDispose () */
+
+LIB_EXPORT
+const struct VFSManager * CC
+XFS_VfsManager ()
+{
+    return _sVfsManager;
+}   /* XFS_VfsManager () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))   Sometime we need KNSManager, and it is very costly to
+ |||    make it each time on demand ... so here is it
+ |||    NOTE: Initializing and Destroying code arent thread safe!!!
+ |||          will add mutexes if it really need to :)
+(((*/
+static struct KNSManager * _sKnsManager = NULL;
+
+LIB_EXPORT
+rc_t CC
+XFS_KnsManagerInit ()
+{
+    rc_t RCt;
+    struct KNSManager * Manager;
+
+    RCt = 0;
+    Manager = NULL;
+
+    if ( _sKnsManager == NULL ) {
+        RCt = KNSManagerMake ( & Manager );
+        if ( RCt == 0 ) {
+            if ( Manager == NULL ) {
+                RCt = XFS_RC ( rcNull );
+            }
+            else {
+                _sKnsManager = Manager;
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFS_KnsManagerInit () */
+
+LIB_EXPORT
+rc_t CC
+XFS_KnsManagerDispose ()
+{
+    rc_t RCt;
+    struct KNSManager * Manager;
+
+    RCt = 0;
+    Manager = _sKnsManager;
+
+    if ( Manager != NULL ) {
+        _sKnsManager = NULL;
+
+        RCt = KNSManagerRelease ( Manager );
+    }
+
+    return RCt;
+}   /* XFS_KnsManagerDispose () */
+
+LIB_EXPORT
+const struct KNSManager * CC
+XFS_KnsManager ()
+{
+    return _sKnsManager;
+}   /* XFS_KnsManager () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))   Simple resolving path Absolute/Relative
+ |||    Sometimes it necessary
+(((*/
+
+LIB_EXPORT
+rc_t CC
+XFS_ResolvePath (
+                bool Absolute,
+                char * Resolved,
+                size_t ResolvedSize,
+                const char * Format,
+                ...
+)
+{
+    rc_t RCt;
+    va_list Args;
+
+    RCt = 0;
+
+    XFS_CAN ( Format )
+
+    va_start ( Args, Format );
+
+    RCt = XFS_VResolvePath (
+                            Absolute,
+                            Resolved,
+                            ResolvedSize,
+                            Format,
+                            Args
+                            );
+
+    va_end ( Args );
+
+    return RCt;
+}   /* XFS_ResolvePath () */
+
+LIB_EXPORT
+rc_t CC
+XFS_VResolvePath (
+                bool Absolute,
+                char * Resolved,
+                size_t ResolvedSize,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct KDirectory * NatDir;
+
+    RCt = 0;
+    NatDir = NULL;
+
+    XFS_CAN ( Resolved )
+    XFS_CAN ( Format )
+    XFS_CA ( ResolvedSize, 0 )
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryVResolvePath (
+                                    NatDir,
+                                    Absolute,
+                                    Resolved,
+                                    ResolvedSize,
+                                    Format,
+                                    Args
+                                    );
+        KDirectoryRelease ( NatDir );
+    }
+
+    if ( RCt != 0 ) {
+        * Resolved = 0;
+    }
+
+    return 0;
+}   /* XFS_VResolvePath () */
diff --git a/libs/xfs/schwarzschraube.h b/libs/xfs/schwarzschraube.h
new file mode 100644
index 0000000..211e038
--- /dev/null
+++ b/libs/xfs/schwarzschraube.h
@@ -0,0 +1,118 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _schwarzschraube_
+#define _schwarzschraube_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*) Fowards, and others
+ (*/
+
+/*))))
+  ||||   Unsorted methods which usage was approved by usage
+  ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct String;
+
+/*)))   Dupping string, and if NULL is Src, it will be passed to Dst
+ (((*/
+XFS_EXTERN rc_t CC XFS_StrDup ( const char * Src,  const char ** Dst );
+
+/*)))   Dupping String, and if NULL is Src, it will be passed to Dst
+ (((*/
+XFS_EXTERN rc_t CC XFS_SStrDup (
+                                const struct String * Src,
+                                const char ** Dst
+                                );
+
+/*)))   Checking if string ends with string
+ (((*/
+XFS_EXTERN rc_t CC XFS_StrEndsWith (
+                                const char * Str, const char * End
+                                );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))   Sometimes I need VFSManager, and from different places, and
+  |||   it is very costly to make on Windows platform
+  (((*/
+struct VFSManager;
+
+XFS_EXTERN rc_t CC XFS_VfsManagerInit ( );
+XFS_EXTERN rc_t CC XFS_VfsManagerDispose ( );
+
+XFS_EXTERN const struct VFSManager * CC XFS_VfsManager ( );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))   Sometimes I need KNSManager, and from different places, and
+  |||   it is costly too
+  (((*/
+struct KNSManager;
+
+XFS_EXTERN rc_t CC XFS_KnsManagerInit ( );
+XFS_EXTERN rc_t CC XFS_KnsManagerDispose ( );
+
+XFS_EXTERN const struct KNSManager * CC XFS_KnsManager ( );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))   Just resolving absolute/relative path. Need it sometime
+  |||
+  (((*/
+XFS_EXTERN rc_t CC XFS_ResolvePath (
+                                bool Absolute,
+                                char * Resolved,
+                                size_t ResolvedSize,
+                                const char * Format,
+                                ...
+                                );
+XFS_EXTERN rc_t CC XFS_VResolvePath (
+                                bool Absolute,
+                                char * Resolved,
+                                size_t ResolvedSize,
+                                const char * Format,
+                                va_list Args
+                                );
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _schwarzschraube_ */
diff --git a/libs/xfs/simcon.c b/libs/xfs/simcon.c
new file mode 100644
index 0000000..2b8f8b7
--- /dev/null
+++ b/libs/xfs/simcon.c
@@ -0,0 +1,214 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <xfs/model.h>
+#include <xfs/node.h>
+
+#include "teleport.h"
+#include "common.h"
+#include "contnode.h"
+
+#include <sysalloc.h>
+
+/*)))
+ |||
+ +++    Simple Container lives here
+ |||
+(((*/
+
+/*)))
+ |||
+ +++    Simple Container has a Teleport, and it is HERE
+ |||
+(((*/
+
+static
+rc_t CC
+_SimpleContainerCreateChildren (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            struct XFSNode * Container
+)
+{
+    rc_t RCt;
+    const struct KNamelist * Children;
+    uint32_t ChildrenQty, llp;
+    const char * ChildName, * ChildAlias;
+    const struct XFSNode * TheNode;
+
+    RCt = 0;
+    Children = NULL;
+    ChildrenQty = 0;
+    ChildName = ChildAlias = NULL;
+    TheNode = NULL;
+
+
+    RCt = XFSModelNodeChildrenNames ( Template, & Children );
+    if ( RCt == 0 ) {
+
+        RCt = KNamelistCount ( Children, & ChildrenQty );
+        if ( RCt == 0 ) {
+
+            for ( llp = 0; llp < ChildrenQty; llp ++ ) {
+                RCt = KNamelistGet ( Children, llp, & ChildName );
+                if ( RCt == 0 ) {
+
+                    ChildAlias = XFSModelNodeChildAlias (
+                                                    Template,
+                                                    ChildName
+                                                    );
+
+/*
+pLogMsg ( klogDebug, " ||== Creating child [$(name)] alias [$(alias)]", "name=%s,alias=%s", ChildName, ( ChildAlias == NULL ? "NULL" : ChildAlias ) );
+*/
+
+                    RCt = XFSNodeMake (
+                                    Model,
+                                    ChildName,
+                                    ChildAlias,
+                                    & TheNode
+                                    );
+                    if ( RCt == 0 ) {
+                        RCt = XFSContNodeAddChild ( Container, TheNode );
+                        /* Don't know what to do here */
+                    }
+
+                    if ( RCt != 0 ) {
+                        break;
+                    }
+                }
+            }
+        }
+        KNamelistRelease ( Children );
+    }
+
+    return RCt;
+}   /* _SimpleContainerCreateChildren () */
+
+static
+rc_t CC
+_SimpleContainerConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    const char * NodeName;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Model == NULL || Template == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    RCt = XFSContNodeMakeWithFlavor (
+                                NodeName,
+                                XFSModelNodeSecurity ( Template ),
+                                _sFlavorOfSimpleContainer,
+                                & TheNode
+                                );
+    if ( RCt == 0 ) {
+        RCt = _SimpleContainerCreateChildren (
+                                            Model,
+                                            Template,
+                                            TheNode
+                                            );
+        if ( RCt == 0 ) {
+            * Node = TheNode;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        XFSNodeDispose ( TheNode );
+    }
+
+/*
+pLogMsg ( klogDebug, "_SimpleContainerConstructor ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _SimpleContainerConstructor () */
+
+static
+rc_t CC
+_SimpleContainerValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_SimpleContainerValidator ( $(model), $(template) (\"$(name)\"), \"$(alias)\" )", "model=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _SimpleContainerValidator () */
+
+static const struct XFSTeleport _sSimpleContainerTeleport = {
+                                        _SimpleContainerConstructor,
+                                        _SimpleContainerValidator,
+                                        false
+                                        };
+
+
+LIB_EXPORT
+rc_t CC
+XFSSimpleContainerProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sSimpleContainerTeleport;
+
+    return 0;
+}   /* XFSSimpleContainerProvider () */
+
+
diff --git a/libs/xfs/spen.c b/libs/xfs/spen.c
new file mode 100644
index 0000000..343fd4e
--- /dev/null
+++ b/libs/xfs/spen.c
@@ -0,0 +1,963 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <kproc/lock.h>
+#include <vfs/path.h>
+#include <kns/http.h>
+
+#include <kfg/repository.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/file-impl.h>
+
+#include "schwarzschraube.h"
+#include "zehr.h"
+#include "mehr.h"
+#include "spen.h"
+#include <xfs/path.h>
+
+#include <sysalloc.h>
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //     special structs _sP and _sPB are living here
+((*/
+
+struct XFSBurro;
+
+struct _sPB {
+    struct _sPB * prev;
+    struct _sPB * next;
+
+    struct XFSBurro * burro;
+};
+
+struct _sP {
+    struct _sPB * head;
+    struct _sPB * tail;
+
+    struct KLock * mutabor;
+
+    size_t capacity;
+    size_t qty;
+};
+
+/*))
+ //     XFSPen and XFSBurro are living here
+((*/
+
+struct XFSPen {
+    struct BSTree tree;
+
+    struct _sP * pen;
+
+    struct KLock * mutabor;
+};
+
+struct XFSBurro {
+    struct BSTNode node;
+
+    struct KLock * mutabor;
+    KRefcount refcount;
+
+    const struct XFSPen * pen;
+    struct _sPB * burro;
+
+    const char * url;
+    uint32_t url_hash;
+
+    const struct KFile * file;
+
+    size_t connect_attempts;
+    XFSStatus status;
+};
+
+static const char * _sBurro_classname = "Burro";
+static size_t _sDefaultConnectAttempts = 3;
+
+static rc_t CC _CloseBurro_callback (
+                                struct _sP * self,
+                                struct _sPB * Burro
+                                );
+#ifdef NOT_NEED_YET
+static rc_t CC _CloseBurroAndDelete_callback (
+                                struct _sP * self,
+                                struct _sPB * Burro
+                                );
+#endif /* NOT_NEED_YET */
+static rc_t CC _sPTrimToSize_NoLock (
+                                struct _sP * self,
+                                size_t Size,
+                                rc_t ( CC * callback ) (
+                                                    struct _sP * p,
+                                                    struct _sPB * b
+                                                    )
+                                );
+
+static
+rc_t CC
+_sPDispose ( struct _sP * self )
+{
+    if ( self != NULL ) {
+        if ( self -> mutabor != NULL ) {
+            KLockRelease ( self -> mutabor );
+        }
+
+        // _sPTrimToSize_NoLock ( self, 0, _CloseBurroAndDelete_callback );
+        _sPTrimToSize_NoLock ( self, 0, _CloseBurro_callback );
+
+        self -> qty = 0;
+        self -> capacity = 0;
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _sPDispose () */
+
+static
+rc_t CC
+_sPMake ( struct _sP ** Pen, size_t Capacity )
+{
+    rc_t RCt;
+    struct _sP * DasPen;
+
+    RCt = 0;
+    DasPen = NULL;
+
+    XFS_CSAN ( Pen )
+    XFS_CAN ( Pen )
+
+    DasPen = calloc ( 1, sizeof ( struct _sP ) );
+    if ( DasPen == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = KLockMake ( & ( DasPen -> mutabor ) );
+    if ( RCt == 0 ) {
+        DasPen -> capacity = Capacity;
+        DasPen -> qty = 0;
+
+        * Pen = DasPen;
+    }
+
+    if ( RCt != 0 ) {
+        * Pen = NULL;
+
+        _sPDispose ( DasPen );
+    }
+
+    return RCt;
+}   /* _sPMake () */
+
+static
+rc_t CC
+_sPDisconnect_NoLock (
+                    struct _sP * self,
+                    struct _sPB * Burro,
+                    rc_t ( CC * callback ) (
+                                        struct _sP * p,
+                                        struct _sPB * b
+                                        )
+)
+{
+    rc_t RCt = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Burro )
+
+    if ( Burro -> next == NULL && Burro -> prev == NULL ) {
+        if ( self -> head == Burro ) {
+            self -> head = self -> tail = NULL;
+
+            self -> qty --;
+
+            if ( callback != NULL ) {
+                RCt = callback ( self, Burro );
+            }
+        }
+    }
+    else {
+            /* Donkey is a head of household
+             */
+        if ( Burro -> prev == NULL ) {
+            if ( self -> head != Burro ) {
+                return XFS_RC ( rcInvalid );
+            }
+
+            if ( Burro -> next != NULL ) {
+                Burro -> next -> prev = NULL;
+                self -> head = Burro -> next;
+            }
+            else {
+                self -> head = self -> tail = NULL;
+            }
+        }
+        else {
+                /* Donkey is a tail of household
+                 */
+            if ( Burro -> next == NULL ) {
+                if ( self -> tail != Burro ) {
+                    return XFS_RC ( rcInvalid );
+                }
+
+                if ( Burro -> prev != NULL ) {
+                    Burro -> prev -> next = NULL;
+                    self -> tail = Burro -> prev;
+                }
+                else {
+                    self -> head = self -> tail = NULL;
+                }
+            }
+            else {
+                Burro -> prev -> next = Burro -> next -> prev;
+                Burro -> next -> prev = Burro -> prev -> next;
+            }
+        }
+
+        self -> qty --;
+        Burro -> next = Burro -> prev = NULL;
+
+
+        if ( callback != NULL ) {
+            RCt = callback ( self, Burro );
+        }
+    }
+
+    return RCt;
+}   /* _sPDisconnect_NoLock () */
+
+rc_t CC
+_sPTrimToSize_NoLock (
+                    struct _sP * self,
+                    size_t Size,
+                    rc_t ( CC * callback ) (
+                                        struct _sP * p,
+                                        struct _sPB * b
+                                        )
+)
+{
+    rc_t RCt;
+    struct _sPB * Burro;
+
+    RCt = 0;
+    Burro = NULL;
+
+    XFS_CAN ( self )
+
+    if ( 0 < self -> qty ) {
+        while ( Size < self -> qty ) {
+            Burro = self -> tail;
+            RCt = _sPDisconnect_NoLock ( self, Burro, callback );
+            if ( RCt != 0 ) {
+                break;
+            }
+
+            if ( Burro != NULL && Burro == self -> tail ) {
+                RCt = XFS_RC ( rcInvalid );
+                break;
+            }
+        }
+    }
+
+    return RCt;
+}   /* _sPTrimToSize_NoLock () */
+
+static
+rc_t CC
+_sPConnect_NoLock ( struct _sP * self, struct _sPB * Burro )
+{
+    rc_t RCt = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Burro )
+
+        /* Donkey is busy already 
+         */
+    if ( Burro -> next != NULL || Burro -> prev != NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+        /* Trimming pen to size
+         */
+    RCt = _sPTrimToSize_NoLock (
+                                self,
+                                self -> capacity - 1,
+                                _CloseBurro_callback
+                                );
+    if ( RCt == 0 ) {
+            /* There are no donkeys in a pen
+             */
+        if ( self -> head != NULL ) {
+            Burro -> next = self -> head;
+            self -> head -> prev = Burro;
+        }
+        else {
+            self -> tail = Burro;
+        }
+        self -> head = Burro;
+        self -> qty ++;
+    }
+
+    return RCt;
+}   /* _sPConnect_NoLock () */
+
+static
+rc_t CC
+_sPToFront ( struct _sP * self, struct _sPB * Burro )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Burro )
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+
+        // if ( Burro != self -> head ) {
+
+            RCt = _sPDisconnect_NoLock ( self, Burro, NULL );
+            if ( RCt == 0 ) {
+                RCt = _sPConnect_NoLock ( self, Burro );
+            }
+        // }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    return RCt;
+}   /* _sPToFront () */
+
+rc_t CC
+_CloseBurro_callback ( struct _sP * self, struct _sPB * Burro )
+{
+    rc_t RCt;
+    const struct XFSBurro * TheBurro;
+    struct KFile * File;
+
+    RCt = 0;
+    TheBurro = NULL;
+    File = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Burro )
+
+    TheBurro = Burro -> burro;
+
+    XFS_CAN ( TheBurro )
+
+    RCt = KLockAcquire ( TheBurro -> mutabor );
+    if ( RCt == 0 ) {
+        if ( TheBurro -> file != NULL ) {
+            File = ( struct KFile * ) TheBurro -> file;
+            ( ( struct XFSBurro * ) TheBurro ) -> file = NULL;
+        }
+        KLockUnlock ( TheBurro -> mutabor );
+    }
+
+    if ( RCt == 0 && File != 0 ) {
+        KFileRelease ( File );
+    }
+
+    return RCt;
+}   /* _CloseBurro_callback () */
+
+#ifdef NOT_NEED_YET
+rc_t CC
+_CloseBurroAndDelete_callback ( struct _sP * self, struct _sPB * Burro )
+{
+    rc_t RCt = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Burro )
+
+    RCt = _CloseBurro_callback ( self, Burro );
+
+    free ( Burro );
+
+    return RCt;
+}   /* _CloseBurroAndDelete_callback () */
+#endif /* NOT_NEED_YET */
+
+static
+rc_t CC
+_sPBMake ( struct _sPB ** RetVal, struct XFSBurro * Burro )
+{
+    struct _sPB * TheRet = NULL;
+
+    XFS_CSAN ( RetVal )
+    XFS_CAN ( RetVal )
+    XFS_CAN ( Burro )
+
+    TheRet = calloc ( 1, sizeof ( struct _sPB ) );
+    if ( TheRet == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    TheRet -> burro = Burro;
+    * RetVal = TheRet;
+
+    return 0;
+}   /* _sPBMake () */
+
+static
+rc_t CC
+_sPBDispose ( struct _sPB * self )
+{
+    if ( self != NULL ) {
+            /* We do not check if Burro was not disconnected
+               cuz it is too much to expect from us
+               Just shut them down
+             */
+        self -> prev = NULL;
+        self -> next = NULL;
+        self -> burro = NULL;
+
+        free ( self );
+    }
+    return 0;
+}   /* _sPBDispose () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSBurro                                                          */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static
+rc_t CC
+_BurroDispose ( const struct XFSBurro * self )
+{
+    struct XFSBurro * Burro = ( struct XFSBurro * ) self;
+
+    if ( Burro != NULL ) {
+        KRefcountWhack ( & ( Burro -> refcount ), _sBurro_classname );
+
+        if ( Burro -> mutabor !=  NULL ) {
+            KLockRelease ( Burro -> mutabor );
+            Burro -> mutabor = NULL;
+        }
+
+        if ( Burro -> burro != NULL ) {
+            _sPBDispose ( Burro -> burro );
+            Burro -> burro = NULL;
+        }
+
+        if ( Burro -> url != NULL ) {
+            free ( ( char * ) Burro -> url );
+            Burro -> url = NULL;
+        }
+
+        Burro -> url_hash = 0;
+
+        if ( Burro -> file != NULL ) {
+            KFileRelease ( Burro -> file );
+            Burro -> file = NULL;
+        }
+
+        Burro -> connect_attempts = _sDefaultConnectAttempts;
+        Burro -> status = kxfsInvalid;
+        Burro -> pen = NULL;
+
+        free ( Burro );
+    }
+
+    return 0;
+}   /* _BurroDispose () */
+
+static rc_t CC _PenAdd_NoLock (
+                            const struct XFSPen * self,
+                            const struct XFSBurro * Burro
+                            );
+
+static
+rc_t CC
+_BurroMake (
+            const struct XFSPen * Pen,
+            const struct XFSBurro ** Burro,
+            const char * Url
+)
+{
+    rc_t RCt;
+    struct XFSBurro * TheBurro;
+
+    RCt = 0;
+    TheBurro = NULL;
+
+    XFS_CSAN ( Burro )
+    XFS_CAN ( Burro )
+    XFS_CAN ( Url )
+
+    TheBurro = calloc ( 1, sizeof ( struct XFSBurro ) );
+    if ( TheBurro == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    KRefcountInit (
+                & ( TheBurro -> refcount ),
+                1,
+                _sBurro_classname,
+                "BurroMake",
+                "Burro"
+                );
+
+    RCt = KLockMake ( & ( TheBurro -> mutabor ) );
+    if ( RCt == 0 ) {
+        RCt = _sPBMake ( & ( TheBurro -> burro ), TheBurro );
+        if ( RCt == 0 ) {
+            RCt = XFS_StrDup ( Url, & ( TheBurro -> url ) );
+            if ( RCt == 0 ) {
+                RCt = _PenAdd_NoLock ( Pen, TheBurro );
+                if ( RCt == 0 ) {
+                    TheBurro -> url_hash = string_hash (
+                                        TheBurro -> url,
+                                        string_size ( TheBurro -> url )
+                                        );
+                    TheBurro -> file = NULL;
+                    TheBurro -> connect_attempts =
+                                            _sDefaultConnectAttempts;
+                    TheBurro -> status = kxfsReady;
+                    TheBurro -> pen = Pen;
+
+                    * Burro = TheBurro;
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Burro = NULL;
+
+        if ( TheBurro != NULL ) {
+            _BurroDispose ( TheBurro );
+        }
+    }
+
+    return RCt;
+}   /* _BurroMake () */
+
+rc_t CC
+XFSBurroAddRef ( const struct XFSBurro * self )
+{
+    rc_t RCt;
+    int RefC;
+
+    RCt = 0;
+    RefC = 0;
+
+    XFS_CAN ( self );
+
+    RefC = KRefcountAdd ( & ( self -> refcount ), _sBurro_classname );
+    switch ( RefC ) {
+        case krefOkay :
+            RCt = 0;
+            break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+            RCt = XFS_RC ( rcInvalid );
+            break;
+        default :
+            RCt = XFS_RC ( rcUnknown );
+            break;
+    }
+
+    return RCt;
+}   /* XFSBurroAddRef () */
+
+rc_t CC
+XFSBurroRelease ( const struct XFSBurro * self )
+{
+    rc_t RCt;
+    int RefC;
+
+    RCt = 0;
+    RefC = 0;
+
+    XFS_CAN ( self );
+
+    RefC = KRefcountDrop ( & ( self -> refcount ), _sBurro_classname );
+    switch ( RefC ) {
+        case krefOkay :
+        case krefZero :
+                RCt = 0;
+                break;
+        case krefWhack :
+                RCt = _BurroDispose ( self );
+                break;
+        case krefNegative :
+                RCt = XFS_RC ( rcInvalid );
+                break;
+        default :
+                RCt = XFS_RC ( rcUnknown );
+                break;
+    }
+
+    return RCt;
+}   /* XFSBurroRelease () */
+
+bool CC
+XFSBurroGood ( const struct XFSBurro * self )
+{
+    if ( self != NULL ) {
+        return self -> status == kxfsReady
+                || self -> status == kxfsGood;
+    }
+
+    return false;
+}   /* XFSBurroGood () */
+
+static
+rc_t CC
+_BurroCheckMakeFile_NoLock ( const struct XFSBurro * self )
+{
+    rc_t RCt;
+    const struct KFile * File;
+
+    RCt = 0;
+    File = NULL;
+
+    XFS_CAN ( self )
+
+    if ( self -> status != kxfsReady && self -> status != kxfsComplete ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    File = self -> file;
+    if ( File == NULL ) {
+        while ( 0 < self -> connect_attempts ) {
+            ( ( struct XFSBurro * ) self ) -> status = kxfsReady;
+            RCt = KNSManagerMakeHttpFile (
+                                    XFS_KnsManager (),
+                                    & File,
+                                    NULL,
+                                    0x01010000,
+                                    self -> url
+                                    );
+            if ( RCt == 0 ) {
+                ( ( struct XFSBurro * ) self ) -> status = kxfsComplete;
+                break;
+            }
+
+            ( ( struct XFSBurro * ) self ) -> status = kxfsBroken;
+            ( ( struct XFSBurro * ) self ) -> connect_attempts --;
+        }
+    }
+
+    if ( RCt == 0 ) {
+        ( ( struct XFSBurro * ) self ) -> connect_attempts =
+                                            _sDefaultConnectAttempts;
+        ( ( struct XFSBurro * ) self ) -> file = File;
+    }
+    else {
+        ( ( struct XFSBurro * ) self ) -> file = NULL;
+    }
+
+    return RCt;
+}   /* _BurroCheckMakeFile_NoLock () */
+
+static
+rc_t CC
+_BurroGetFile (
+                const struct XFSBurro * self,
+                const struct KFile ** File,
+                bool DropOld
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( self )
+    XFS_CAN ( self -> pen )
+    XFS_CAN ( self -> burro )
+    XFS_CAN ( File )
+
+        /* Check if we are OK */
+    if ( self -> status != kxfsReady && self -> status != kxfsComplete ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+        /* Read procedure is :
+         *    Take Burro from a line and put it on the top
+         *    Connect if necessary
+         *    Read, or return Error
+         */
+    RCt = _sPToFront ( self -> pen -> pen, self -> burro );
+    if ( RCt == 0 ) {
+        RCt = KLockAcquire ( self -> mutabor );
+        if ( RCt == 0 ) {
+            if ( DropOld ) {
+                if ( self -> file != NULL ) {
+                    KFileRelease ( self -> file );
+                    ( ( struct XFSBurro * ) self ) -> file = NULL;
+                }
+            }
+
+            RCt = _BurroCheckMakeFile_NoLock ( self );
+            if ( RCt == 0 ) {
+                RCt = KFileAddRef ( self -> file );
+                if ( RCt == 0 ) {
+                    * File = self -> file;
+                }
+            }
+
+            KLockUnlock ( self -> mutabor );
+        }
+    }
+
+    return RCt;
+}   /* _BurroGetFile () */
+
+rc_t CC
+XFSBurroCachedFile (
+                const struct XFSBurro * self,
+                const struct KFile ** File
+)
+{
+    return _BurroGetFile ( self, File, false );
+}   /* XFSBurroCachedFile () */
+
+rc_t CC
+XFSBurroRecachedFile (
+                const struct XFSBurro * self,
+                const struct KFile ** File
+)
+{
+    return _BurroGetFile ( self, File, true );
+}   /* XFSBurroRecachedFile () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSPen                                                            */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+rc_t CC
+XFSPenMake ( const struct XFSPen ** Pen, size_t Capacity )
+{
+    rc_t RCt;
+    struct XFSPen * ThePen;
+
+    RCt = 0;
+    ThePen = NULL;
+
+    XFS_CSAN ( Pen )
+    XFS_CAN ( Pen )
+
+    ThePen = calloc ( 1, sizeof ( struct XFSPen ) );
+    if ( ThePen == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    BSTreeInit ( & ( ThePen -> tree ) );
+
+    RCt = KLockMake ( & ( ThePen -> mutabor ) );
+    if ( RCt == 0 ) {
+        RCt = _sPMake ( & ( ThePen -> pen ), Capacity );
+        if ( RCt == 0 ) {
+            * Pen = ThePen;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Pen = NULL;
+
+        if ( ThePen != NULL ) {
+            XFSPenDispose ( ThePen );
+        }
+    }
+
+    return 0;
+}   /* XFSPenMake () */
+
+static
+void CC
+_PenTreeWhackCallback ( BSTNode * Node, void * unused )
+{
+    if ( Node != NULL ) {
+        XFSBurroRelease ( ( const struct XFSBurro * ) Node );
+    }
+}   /* _PenTreeWhackCallback () */
+
+rc_t CC
+XFSPenDispose ( const struct XFSPen * self )
+{
+    struct XFSPen * Pen = ( struct XFSPen * ) self;
+
+    if ( Pen != NULL ) {
+        if ( Pen -> mutabor != NULL ) {
+            KLockRelease ( Pen -> mutabor );
+            Pen -> mutabor = NULL;
+        }
+
+        if ( Pen -> pen != NULL ) {
+            _sPDispose ( Pen -> pen );
+            Pen -> pen = NULL;
+        }
+
+        BSTreeWhack ( & ( Pen -> tree ), _PenTreeWhackCallback, NULL );
+
+        free ( Pen );
+    }
+
+    return 0;
+}   /* XFSPenDispose () */
+
+static
+int64_t CC
+_PenFindCallback ( const void * Item, const struct BSTNode * Node )
+{
+    const char * ItemUrl, * NodeUrl;
+
+    ItemUrl = ( const char * ) Item;
+    NodeUrl = Node == NULL ? 0 : ( ( struct XFSBurro * ) Node ) -> url;
+
+    return XFS_StringCompare4BST_ZHR ( ItemUrl, NodeUrl );
+}   /* _PenFindCallback () */
+
+static
+rc_t CC
+_PenFind_NoLock (
+            const struct XFSPen * self,
+            const struct XFSBurro ** Burro,
+            const char * Url
+)
+{
+    rc_t RCt;
+    const struct XFSBurro * TheBurro;
+
+    RCt = 0;
+    TheBurro = NULL;
+
+    XFS_CSAN ( Burro )
+    XFS_CAN ( self )
+    XFS_CAN ( Burro )
+    XFS_CAN ( Url )
+
+    TheBurro = ( struct XFSBurro * ) BSTreeFind ( 
+                                            & ( self -> tree ),
+                                            Url,
+                                            _PenFindCallback
+                                            );
+    if ( TheBurro == NULL ) {
+        RCt = XFS_RC ( rcNotFound );
+    }
+    else {
+        * Burro = TheBurro;
+    }
+
+    return RCt;
+}   /* _PenFind_NoLock () */
+
+static
+int64_t CC
+_BurroAddCallback (
+const struct BSTNode * N1,
+const struct BSTNode * N2
+)
+{
+    return XFS_StringCompare4BST_ZHR (
+                                    ( ( struct XFSBurro * ) N1 ) -> url,
+                                    ( ( struct XFSBurro * ) N2 ) -> url
+                                    );
+}   /* _BurroAddCallback () */
+
+rc_t CC
+_PenAdd_NoLock (
+                const struct XFSPen * self,
+                const struct XFSBurro * Burro
+)
+{
+    XFS_CAN ( self )
+    XFS_CAN ( Burro )
+
+    return BSTreeInsert (
+                        & ( ( ( struct XFSPen * ) self ) -> tree ),
+                        ( struct BSTNode * ) Burro,
+                        _BurroAddCallback
+                        );
+}   /* _PenAdd_NoLock () */
+
+rc_t CC
+XFSPenGet ( 
+            const struct XFSPen * self,
+            const struct XFSBurro ** Burro,
+            const char * Url
+)
+{
+    rc_t RCt;
+    const struct XFSBurro * TheBurro;
+
+    RCt = 0;
+    TheBurro = NULL;
+
+    XFS_CSAN ( Burro )
+    XFS_CAN ( self )
+    XFS_CAN ( Burro )
+    XFS_CAN ( Url )
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _PenFind_NoLock ( self, & TheBurro, Url );
+        if ( GetRCState ( RCt ) == rcNotFound ) {
+            RCt = _BurroMake ( self, & TheBurro, Url );
+        }
+
+        if ( RCt == 0 ) {
+            RCt = XFSBurroAddRef ( TheBurro );
+            if ( RCt == 0 ) {
+                * Burro = TheBurro;
+            }
+        }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    if ( RCt != 0 ) {
+        * Burro = NULL;
+
+        if ( TheBurro != NULL ) {
+            _BurroDispose ( TheBurro );
+            TheBurro = NULL;
+        }
+    }
+
+    return RCt;
+}   /* XFSPenGet () */
+
diff --git a/libs/xfs/spen.h b/libs/xfs/spen.h
new file mode 100644
index 0000000..02a807d
--- /dev/null
+++ b/libs/xfs/spen.h
@@ -0,0 +1,121 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _spen_h_
+#define _spen_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * LYRICS:
+ *
+ * That file contains pool of KHttpFiles, for accessing dbGaP data
+ * Due to extremly sophisticated inner world of mine, I am introducing
+ * Pen primitive ( not Pool ), and Pen is 'pen'. There is also small
+ * donkey inside. Burro ( donkey ) it is structure which contains 
+ * pointer to cached/non_cached HTTP file.
+ *
+ * So, call "XFSPenMake ()" function and be ready for ride.
+ *
+ * Enjoy.
+ * 
+ * TODO: make some adjustments, when Kurt will implement timeout
+ *       in KFile interface.
+ * 
+ *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //     Forwards
+((*/
+struct XFSPen;
+struct XFSBurro;
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //     XFSPen Make/Dispose methods
+((*/
+rc_t CC XFSPenMake (
+                            const struct XFSPen ** Pen,
+                            size_t Capacity
+                            );
+rc_t CC XFSPenDispose ( const struct XFSPen * self );
+
+/*))
+ //     Returns object associated with URL
+((*/
+rc_t CC XFSPenGet (
+                            const struct XFSPen * self,
+                            const struct XFSBurro ** Burro,
+                            const char * Url
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //     XFSBurro methods
+((*/
+
+rc_t CC XFSBurroAddRef ( const struct XFSBurro * self );
+rc_t CC XFSBurroRelease ( const struct XFSBurro * self );
+
+bool CC XFSBurroGood ( const struct XFSBurro * self );
+
+/*))
+ //     Returns 'CACHED' KFile associated with URL
+((*/
+rc_t CC XFSBurroCachedFile (
+                                const struct XFSBurro * self,
+                                const struct KFile ** File
+                                );
+
+/*))
+ //     Drops old 'CACHED' KFile associated with URL, and returns new
+((*/
+rc_t CC XFSBurroRecachedFile (
+                                const struct XFSBurro * self,
+                                const struct KFile ** File
+                                );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _spen_h_ */
diff --git a/libs/xfs/tar.c b/libs/xfs/tar.c
new file mode 100644
index 0000000..85c1337
--- /dev/null
+++ b/libs/xfs/tar.c
@@ -0,0 +1,1225 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+#include <xfs/editors.h>
+#include <xfs/handle.h>
+#include <xfs/perm.h>
+
+#include "xtar.h"
+#include "mehr.h"
+#include "schwarzschraube.h"
+#include "teleport.h"
+#include "common.h"
+
+#include <sysalloc.h>
+
+#include <string.h>     /* memset */
+
+/*)))
+ |||    That file contains 'archive' XFSTar based nodes
+(((*/
+
+/*)))
+ |||
+ +++    TarRootNode, TarNode, and others
+ |||
+(((*/
+struct XFSTarNode {
+    struct XFSNode node;
+
+    const struct XFSTarEntry * entry;
+};
+
+struct XFSTarRootNode {
+    struct XFSTarNode node;
+
+    const struct XFSTar * tar;
+};
+
+struct XFSTarFileEditor {
+    struct XFSFileEditor Papahen;
+
+    const struct XFSTarEntry * entry;
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*                                                               *_*/
+/*_* TarNode is living here                                       *_*/
+/*_*                                                               *_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ |||
+ +++    TarNode virtual table is Living here :lol:
+ |||
+(((*/
+static rc_t CC _TarNodeFlavor_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _TarNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _TarRootNodeDispose_v1 (
+                                const struct XFSNode * self
+                                );
+static rc_t CC _TarNodeFindNode_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSPath * Path,
+                                uint32_t PathIndex,
+                                const struct XFSNode ** Node
+                                );
+static rc_t CC _TarNodeDir_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSDirEditor ** Dir
+                                );
+static rc_t CC _TarNodeFile_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSFileEditor ** File
+                                );
+static rc_t CC _TarNodeAttr_v1 (
+                                const struct XFSNode * self,
+                                const struct XFSAttrEditor ** Attr
+                                );
+static rc_t CC _TarNodeDescribe_v1 (
+                                const struct XFSNode * self,
+                                char * Buffer,
+                                size_t BufferSize
+                                );
+
+static const struct XFSNode_vt_v1 _sTarRootNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _TarNodeFlavor_v1,
+                                        _TarRootNodeDispose_v1,
+                                        _TarNodeFindNode_v1,
+                                        _TarNodeDir_v1,
+                                        _TarNodeFile_v1,
+                                        _TarNodeAttr_v1,
+                                        _TarNodeDescribe_v1
+                                        };
+
+static const struct XFSNode_vt_v1 _sTarNodeVT_v1 = {
+                                        1, 1,   /* nin naj */
+                                        _TarNodeFlavor_v1,
+                                        _TarNodeDispose_v1,
+                                        NULL,
+                                        _TarNodeDir_v1,
+                                        _TarNodeFile_v1,
+                                        _TarNodeAttr_v1,
+                                        _TarNodeDescribe_v1
+                                        };
+
+
+static
+rc_t CC
+XFSTarNodeMake (
+    struct XFSNode ** Node,
+    const char * Name,
+    const struct XFSTarEntry * Entry
+)
+{
+    rc_t RCt;
+    struct XFSTarNode * xNode;
+
+    RCt = 0;
+    xNode = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Node == NULL || Name == NULL || Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    xNode = calloc ( 1, sizeof ( struct XFSTarNode ) );
+    if ( xNode == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFSNodeInitVT (
+                    & ( xNode -> node ),
+                    Name,
+                    ( const union XFSNode_vt * ) & _sTarNodeVT_v1
+                    );
+
+    if ( RCt == 0 ) {
+        RCt = XFSTarEntryAddRef ( Entry );
+        if ( RCt == 0 ) {
+            xNode -> entry = Entry;
+
+            * Node = & ( xNode -> node );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( xNode != NULL ) {
+            RCt = XFSNodeDispose ( & ( xNode -> node ) );
+        }
+    }
+
+    return RCt;
+}   /* XFSTarNodeMake () */
+
+static
+rc_t CC
+XFSTarRootNodeMake (
+    struct XFSNode ** Node,
+    const char * Name,
+    const char * Path
+)
+{
+    rc_t RCt;
+    struct XFSTarRootNode * xNode;
+    const struct XFSTar * Tar;
+    const struct XFSTarEntry * Entry;
+
+    RCt = 0;
+    xNode = NULL;
+    Tar = NULL;
+    Entry = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Node == NULL || Name == NULL || Path == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    xNode = calloc ( 1, sizeof ( struct XFSTarRootNode ) );
+    if ( xNode == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSNodeInitVT (
+                    & ( xNode -> node . node),
+                    Name,
+                    ( const union XFSNode_vt * ) & _sTarRootNodeVT_v1
+                    );
+    if ( RCt == 0 ) {
+        RCt = XFSTarFindOrCreate ( Path, & Tar );
+        if ( RCt == 0 ) {
+            RCt = XFSTarGetEntry ( Tar, "/", & Entry );
+            if ( RCt == 0 ) {
+                if ( Entry == NULL ) {
+                    RCt = XFS_RC ( rcInvalid );
+                }
+                else {
+                    xNode -> node . entry = Entry;
+                    xNode -> tar = Tar;
+
+                    * Node = & ( xNode -> node . node );
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( xNode != NULL ) {
+            XFSNodeDispose ( ( const struct XFSNode * ) & ( xNode -> node ) );
+        }
+    }
+
+    return RCt;
+}   /* XFSTarRootNodeMake () */
+
+uint32_t CC
+_TarNodeFlavor_v1 ( const struct XFSNode * self )
+{
+    return _sFlavorOfTar;
+}   /* _TarNodeFlavor_v1 () */
+
+static
+rc_t CC
+XFSTarNodeDispose ( const struct XFSTarNode * self )
+{
+    struct XFSTarNode * Node = ( struct XFSTarNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "XFSTarNodeDispose ( $(node) )", "node=%p", ( void * ) Node );
+*/
+
+    if ( Node == 0 ) {
+        return 0;
+    }
+
+    if ( Node -> entry != NULL ) {
+        XFSTarEntryRelease ( Node -> entry );
+
+        Node -> entry = NULL;
+    }
+
+    free ( Node );
+
+    return 0;
+}   /* XFSTarNodeDispose () */
+
+static
+rc_t CC
+XFSTarRootNodeDispose ( const struct XFSTarRootNode * self )
+{
+    struct XFSTarRootNode * Node = ( struct XFSTarRootNode * ) self;
+
+/*
+pLogMsg ( klogDebug, "XFSTarRootNodeDispose ( $(node) )", "node=%p", ( void * ) Node );
+*/
+
+    if ( Node == 0 ) {
+        return 0;
+    }
+
+    if ( Node -> tar != NULL ) {
+        XFSTarRelease ( ( struct XFSTar * ) Node -> tar );
+        Node -> tar = NULL;
+    }
+
+    XFSTarNodeDispose ( & ( Node -> node ) );
+
+    return 0;
+}   /* XFSTarRootNodeDispose () */
+
+rc_t CC
+_TarRootNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return XFSTarRootNodeDispose ( ( const struct XFSTarRootNode * ) self );
+}   /* _TarRootNodeDispose_v1 () */
+
+rc_t CC
+_TarNodeDispose_v1 ( const struct XFSNode * self )
+{
+    return XFSTarNodeDispose ( ( const struct XFSTarNode * ) self );
+}   /* _TarNodeDispose_v1 () */
+
+/*)))
+ |||
+ +++  There are two methods to find node: for Root and non Root nodes
+ |||
+(((*/
+
+/*)) KDir version
+ ((*/
+rc_t CC
+_TarNodeFindNode_v1 (
+            const struct XFSNode * self,
+            const struct XFSPath * Path,
+            uint32_t PathIndex,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    uint32_t PathCount;
+    const char * NodeName;
+    struct XFSTarRootNode * RootNode;
+    struct XFSNode * RetNode;
+    const struct XFSTarEntry * Entry;
+    const struct XFSPath * xPath;
+    bool IsLast;
+
+    RCt = 0;
+    PathCount = 0;
+    NodeName = NULL;
+    RootNode = NULL;
+    RetNode = NULL;
+    Entry = NULL;
+    xPath = NULL;
+    IsLast = false;
+
+    RCt = XFSNodeFindNodeCheckInitStandard (
+                                            self,
+                                            Path,
+                                            PathIndex,
+                                            Node,
+                                            & NodeName,
+                                            & PathCount,
+                                            & IsLast
+                                            );
+    if ( RCt == 0 ) {
+        if ( IsLast ) {
+            RCt = XFSNodeAddRef ( self );
+
+            * Node = self;
+
+            return RCt;
+        }
+
+        RootNode = ( struct XFSTarRootNode * ) self;
+        if ( RootNode -> tar == NULL ) {
+            return XFS_RC ( rcInvalid );
+        }
+
+        RCt = XFSPathFrom ( Path, PathIndex + 1, & xPath );
+        if ( RCt == 0 ) {
+            RCt = XFSTarGetEntry (
+                                RootNode -> tar,
+                                XFSPathGet ( xPath ),
+                                & Entry
+                                );
+            if ( RCt == 0 ) {
+                RCt = XFSTarNodeMake (
+                                    & RetNode,
+                                    XFSPathName ( Path ),/* NodeName, */
+                                    Entry
+                                    );
+                if ( RCt == 0 ) {
+                    * Node = RetNode;
+                }
+            }
+
+            XFSPathRelease ( xPath );
+        }
+    }
+
+    return RCt;
+}   /* _TarNodeFindNode () */
+
+/*)))
+ |||
+ +++  Unified DirEditor
+ |||
+(((*/
+static
+rc_t CC
+_TarDir_dispose_v1 ( const struct XFSEditor * self )
+{
+    struct XFSDirEditor * Editor = ( struct XFSDirEditor * ) self;
+/*
+    pLogMsg ( klogDebug, "_TarDir_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( Editor != NULL ) {
+        free ( Editor );
+    }
+
+    return 0;
+}   /* _TarDir_dispose_v1 () */
+
+static
+rc_t CC
+_TarDir_list_v1 (
+                const struct XFSDirEditor * self,
+                const struct KNamelist ** List
+)
+{
+    rc_t RCt;
+    const struct XFSTarNode * Node;
+    struct KNamelist * TempList;
+
+    RCt = 0;
+    Node = NULL;
+    TempList = NULL;
+
+    if ( List != NULL ) {
+        * List = NULL;
+    }
+
+    if ( self == NULL || List == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Node = ( const struct XFSTarNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSTarEntryList ( Node -> entry, & TempList );
+    if ( RCt == 0 ) {
+        * List = TempList;
+    }
+
+    return RCt;
+}   /* _TarDir_list_v1 () */
+
+static
+rc_t CC
+_TarDir_find_v1 (
+                const struct XFSDirEditor * self,
+                const char * Name,
+                const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    const struct XFSTarNode * TarNode;
+    struct XFSNode * TempNode;
+    const struct XFSTarEntry * TempEntry;
+
+    RCt = 0;
+    TarNode = NULL;
+    TempNode = NULL;
+    TempEntry = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( self == NULL || Name == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    TarNode = ( const struct XFSTarNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( TarNode == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( TarNode -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSTarEntryGetChild ( TarNode -> entry, Name, & TempEntry );
+    if ( RCt == 0 ) {
+        RCt = XFSTarNodeMake ( & TempNode, Name, TempEntry );
+        if ( RCt == 0 ) {
+            * Node = TempNode;
+        }
+    }
+
+    return RCt;
+}   /* _TarDir_find_v1 () */
+
+rc_t CC
+_TarNodeDir_v1 (
+            const struct XFSNode * self,
+            const struct XFSDirEditor ** Dir
+)
+{
+    rc_t RCt;
+    struct XFSDirEditor * Editor;
+    const struct XFSTarNode * Node;
+
+    RCt = 0;
+    Editor = NULL;
+    Node = ( const struct XFSTarNode * ) self;
+
+    if ( Dir != NULL ) {
+        * Dir = NULL;
+    }
+
+    if ( self == NULL || Dir == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Node -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( ! XFSTarEntryIsFolder ( Node -> entry ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Editor = calloc ( 1, sizeof ( struct XFSDirEditor ) );
+    if ( Editor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    memset ( Editor, 0, sizeof ( struct XFSDirEditor ) );
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _TarDir_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> list = _TarDir_list_v1;
+        Editor -> find = _TarDir_find_v1;
+
+        * Dir = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _TarNodeDir_v1 () */
+
+/*)))
+ |||
+ +++  Unified FileEditor
+ |||
+(((*/
+
+static
+rc_t CC
+_TarFile_dispose_v1 ( const struct XFSEditor * self )
+{
+    struct XFSTarFileEditor * Editor = ( struct XFSTarFileEditor * ) self;
+/*
+    pLogMsg ( klogDebug, "_TarNodeFile_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( Editor != NULL ) {
+        if ( Editor -> entry != NULL ) {
+            XFSTarEntryRelease ( Editor -> entry );
+
+            Editor -> entry = NULL;
+        }
+
+        free ( Editor );
+    }
+
+    return 0;
+}   /* _TarFile_dispose_v1 () */
+
+static
+rc_t CC
+_TarFile_open_v1 (
+                    const struct XFSFileEditor * self,
+                    XFSNMode Mode
+)
+{
+    rc_t RCt;
+    const struct XFSTarNode * Node;
+    struct XFSTarFileEditor * Editor;
+
+    RCt = 0;
+    Node = NULL;
+    Editor = ( struct XFSTarFileEditor * ) self;
+
+    if ( Mode != kxfsRead ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Node = ( const struct XFSTarNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Editor = ( struct XFSTarFileEditor * ) self;
+    if ( Editor -> entry == NULL ) {
+        if ( ! XFSTarEntryIsOpen ( Node -> entry ) ) {
+            RCt = XFSTarEntryOpen ( Node -> entry );
+        }
+        if ( RCt == 0 ) {
+            Editor -> entry = Node -> entry;
+        }
+    }
+
+    return RCt;
+}   /* _TarFile_open_v1 () */
+
+static
+rc_t CC
+_TarFile_close_v1 ( const struct XFSFileEditor * self )
+{
+    rc_t RCt;
+    struct XFSTarFileEditor * Editor;
+
+    RCt = 0;
+    Editor = ( struct XFSTarFileEditor * ) self;
+
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+
+    if ( Editor -> entry != NULL ) {
+        RCt = XFSTarEntryClose ( Editor -> entry );
+        if ( RCt == 0 ) {
+            RCt = XFSTarEntryRelease ( Editor -> entry );
+
+            Editor -> entry = NULL;
+        }
+    }
+
+    return RCt;
+}   /* _TarFile_close_v1 () */
+
+static
+rc_t CC
+_TarFile_read_v1 (
+                    const struct XFSFileEditor * self,
+                    uint64_t Offset,
+                    void * Buffer,
+                    size_t SizeToRead,
+                    size_t * NumReaded
+)
+{
+    rc_t RCt;
+    struct XFSTarFileEditor * Editor;
+
+    RCt = 0;
+    Editor = ( struct XFSTarFileEditor * ) self;
+
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+
+    if ( Editor -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSTarEntryRead (
+                        Editor -> entry,
+                        Offset,
+                        Buffer,
+                        SizeToRead,
+                        NumReaded
+                        );
+
+    return RCt;
+}   /* _TarFile_read_v1 () */
+
+static
+rc_t CC
+_TarFile_size_v1 (
+                        const struct XFSFileEditor * self,
+                        uint64_t * Size
+)
+{
+    rc_t RCt;
+    struct XFSTarNode * Node;
+
+    RCt = 0;
+    Node = NULL;
+
+    XFS_CSA ( Size, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Size )
+
+    Node = ( struct XFSTarNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( XFSTarEntryIsFolder ( Node -> entry ) ) {
+        * Size = 0;
+    }
+    else {
+        RCt = XFSTarEntrySize ( Node -> entry, Size );
+        if ( RCt != 0 ) {
+            * Size = 0;
+        }
+    }
+
+    return RCt;
+}   /* _TarFile_size_v1 () */
+
+rc_t CC
+_TarNodeFile_v1 (
+            const struct XFSNode * self,
+            const struct XFSFileEditor ** File
+)
+{
+    rc_t RCt;
+    struct XFSTarFileEditor * FileEditor;
+    struct XFSFileEditor * Editor;
+
+    RCt = 0;
+    FileEditor = NULL;
+    Editor = NULL;
+
+    if ( File != NULL ) {
+        * File = NULL;
+    }
+
+    if ( self == NULL || File == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    FileEditor = calloc ( 1, sizeof ( struct XFSTarFileEditor ) );
+    if ( FileEditor == NULL ) { 
+        return XFS_RC ( rcExhausted );
+    }
+
+    memset ( FileEditor, 0, sizeof ( struct XFSTarFileEditor ) );
+
+    Editor = & ( FileEditor -> Papahen );
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _TarFile_dispose_v1
+                    );
+
+    if ( RCt == 0 ) {
+        Editor -> open = _TarFile_open_v1;
+        Editor -> close = _TarFile_close_v1;
+        Editor -> read = _TarFile_read_v1;
+        Editor -> size = _TarFile_size_v1;
+
+        * File = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _TarNodeFile_v1 () */
+
+/*)))
+ |||
+ +++  Unified Attr
+ |||
+(((*/
+
+static
+rc_t CC
+_TarAttr_dispose_v1 ( const struct XFSEditor * self )
+{
+/*
+    pLogMsg ( klogDebug, "_TarAttr_dispose_v1 ( $(editor) )", "editor=%p", ( void * ) self );
+*/
+
+    if ( self != NULL ) {
+        free ( ( struct XFSAttrEditor * ) self );
+    }
+
+    return 0;
+}   /* _TarAttr_dispose_v1 () */
+
+static
+rc_t CC
+_TarAttr_init_check_v1 (
+                const struct XFSAttrEditor * self,
+                const struct XFSTarEntry ** Entry
+)
+{
+    struct XFSTarNode * Node = NULL;
+
+    if ( Entry != NULL ) {
+        * Entry = NULL;
+    }
+
+    if ( self == NULL || Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Node = ( struct XFSTarNode * ) XFSEditorNode (
+                                                & ( self -> Papahen )
+                                                );
+    if ( Node == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Node -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Entry = Node -> entry;
+
+    return 0;
+}   /* _TarAttr_init_check_v1 () */
+
+static
+rc_t CC
+_TarAttr_permissions_v1 (
+                        const struct XFSAttrEditor * self,
+                        const char ** Permissions
+)
+{
+    rc_t RCt;
+    const struct XFSTarEntry * Entry;
+
+    RCt = 0;
+    Entry = NULL;
+
+    if ( Permissions == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Permissions = NULL;
+
+    RCt = _TarAttr_init_check_v1 ( self, & Entry );
+    if ( RCt == 0 ) {
+        * Permissions = XFSTarEntryIsFolder ( Entry )
+                                        ? XFSPermRODefContChar ()
+                                        : XFSPermRODefNodeChar ()
+                                        ;
+    }
+
+    return RCt;
+}   /* _TarAttr_permissions_v1 () */
+
+
+static
+rc_t CC
+_TarAttr_date_v1 (
+                        const struct XFSAttrEditor * self,
+                        KTime_t * Time
+)
+{
+    rc_t RCt;
+    const struct XFSTarEntry * Entry;
+
+    RCt = 0;
+    Entry = NULL;
+
+    if ( Time == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Time = 0;
+
+    RCt = _TarAttr_init_check_v1 ( self, & Entry );
+    if ( RCt == 0 ) {
+        RCt = XFSTarEntryTime ( Entry, Time );
+        if ( RCt != 0 ) {
+            * Time = 0;
+        }
+    }
+
+    return RCt;
+}   /* _TarAttr_date_v1 () */
+
+static
+rc_t CC
+_TarAttr_type_v1 (
+                        const struct XFSAttrEditor * self,
+                        XFSNType * Type
+)
+{
+    rc_t RCt;
+    const struct XFSTarEntry * Entry;
+
+    RCt = 0;
+    Entry = NULL;
+
+    if ( Type == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Type = kxfsNotFound;
+
+    RCt = _TarAttr_init_check_v1 ( self, & Entry );
+    if ( RCt == 0 ) {
+        * Type = XFSTarEntryIsFolder ( Entry ) ? kxfsDir : kxfsFile ;
+    }
+
+    return RCt;
+}   /* _TarAttr_type_v1 () */
+
+static
+rc_t CC
+_TarNodeAttr_v1 (
+            const struct XFSNode * self,
+            const struct XFSAttrEditor ** Attr
+)
+{
+    rc_t RCt;
+    struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+
+    if ( self == NULL || Attr == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Attr = NULL;
+
+    Editor = calloc ( 1, sizeof ( struct XFSAttrEditor ) );
+    if ( Editor == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSEditorInit (
+                    & ( Editor -> Papahen ),
+                    self,
+                    _TarAttr_dispose_v1
+                    );
+    if ( RCt == 0 ) {
+        Editor -> permissions = _TarAttr_permissions_v1;
+        Editor -> date = _TarAttr_date_v1;
+        Editor -> type = _TarAttr_type_v1;
+
+        * Attr = Editor;
+    }
+    else {
+        free ( Editor );
+    }
+
+    return RCt;
+}   /* _TarNodeAttr_v1 () */
+
+/*)))
+ |||
+ +++  Unified Discribe
+ |||
+(((*/
+
+rc_t CC
+_TarNodeDescribe_v1 (
+            const struct XFSNode * self,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumWrit;
+    const char * Abbr;
+
+    RCt = 0;
+    NumWrit = 0;
+    Abbr = NULL;
+
+    if ( Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Abbr = XFSTarEntryIsFolder ( ( ( const struct XFSTarNode * ) self ) -> entry )
+            ? "TAR FOLDER"
+            : "TAR NODE"
+            ;
+
+    if ( self == NULL ) {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[NULL][NULL]",
+                    Abbr
+                    );
+    }
+    else {
+        string_printf (
+                    Buffer,
+                    BufferSize,
+                    & NumWrit,
+                    "NODE (%s)[%s][0x%p]",
+                    Abbr,
+                    self -> Name,
+                    self
+                    );
+    }
+
+    return RCt;
+}   /* _TarNodeDescribe_v1 () */
+
+/*)))
+ |||
+ +++    FileNode lives here
+ |||
+(((*/
+
+/*))
+ ((     Node make/dispose
+  ))
+ ((*/
+
+/*)))
+ |||
+ +++    Non-Teleport methods to create nodes
+ |||
+(((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* ALL BELOW TODO!!!                                               */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*)))
+ |||
+ +++    TarRootNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_TarArchiveNodeConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+    const char * NodeName;
+
+    RCt = 0;
+    TheNode = NULL;
+    NodeName = NULL;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Model == NULL || Template == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    NodeName = Alias == NULL ? XFSModelNodeName ( Template ) : Alias;
+
+    RCt = XFSTarRootNodeMake (
+                    & TheNode,
+                    NodeName,
+                    XFSModelNodeProperty ( Template, XFS_MODEL_SOURCE )
+                    );
+    if ( RCt == 0 ) {
+        * Node = ( struct XFSNode * ) TheNode;
+    }
+
+    if ( RCt != 0 ) {
+        * Node = NULL;
+
+        if ( TheNode != NULL ) {
+            XFSTarRootNodeDispose ( ( const struct XFSTarRootNode * ) TheNode );
+        }
+    }
+
+    return RCt;
+}   /* _TarArchiveNodeConstructor () */
+
+/*)))
+ |||
+ +++    TarRootNode has a Teleport, and it is HERE
+ |||
+(((*/
+static
+rc_t CC
+_TarArchiveConstructor (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+
+    RCt = _TarArchiveNodeConstructor (
+                                        Model,
+                                        Template,
+                                        Alias,
+                                        Node
+                                        );
+
+/*
+pLogMsg ( klogDebug, "_TarArchiveConstructor ( $(node), $(template) (\"$(name)\"), \"$(alias)\" )", "node=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _TarArchiveConstructor () */
+
+static
+rc_t CC
+_TarArchiveValidator (
+            const struct XFSModel * Model,
+            const struct XFSModelNode * Template,
+            const char * Alias,
+            uint32_t Flags
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, "_TarArchiveValidator ( $(node), $(template) (\"$(name)\"), \"$(alias)\" )", "node=%p,template=%p,name=%s,alias=%s", ( void * ) Model, ( void * ) Template, XFSModelNodeName ( Template ), ( Alias == NULL ? "NULL" : Alias ) );
+*/
+
+    return RCt;
+}   /* _TarArchiveValidator () */
+
+static const struct XFSTeleport _sTarArchiveTeleport = {
+                                        _TarArchiveConstructor,
+                                        _TarArchiveValidator,
+                                        false
+                                        };
+
+
+LIB_EXPORT
+rc_t CC
+XFSTarArchiveProvider ( const struct XFSTeleport ** Teleport )
+{
+    if ( Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = & _sTarArchiveTeleport;
+
+    return 0;
+}   /* XFSTarArchiveProvider () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarArchiveNodeMake (
+                struct XFSNode ** Node,
+                const char * Name,
+                const char * Path,
+                const char * Perm
+)
+{
+    rc_t RCt;
+    struct XFSNode * TheNode;
+
+    RCt = 0;
+
+    if ( Node != NULL ) {
+        * Node = NULL;
+    }
+
+    if ( Name == NULL || Path == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull ) ;
+    }
+
+    RCt = XFSTarRootNodeMake ( & TheNode, Name, Path );
+    if ( RCt == 0 ) {
+        * Node = TheNode;
+    }
+    else {
+        if ( TheNode != NULL ) {
+            XFSTarRootNodeDispose ( ( const struct XFSTarRootNode * ) TheNode );
+        }
+    }
+
+    return RCt;
+}   /* XFSTarArchiveNodeMake () */
diff --git a/libs/xfs/teleport.c b/libs/xfs/teleport.c
new file mode 100644
index 0000000..0c98855
--- /dev/null
+++ b/libs/xfs/teleport.c
@@ -0,0 +1,460 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/namelist.h>
+#include <klib/printf.h>
+#include <klib/container.h>
+
+#include "teleport.h"
+#include "zehr.h"
+#include "schwarzschraube.h"
+
+#include <sysalloc.h>
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ (((    Place of teleport alive :lol:
+  )))   I will use BSTree to store all teleports, and I will inhitialize
+ (((    that tree ond allocate all related structures nce on a programs
+  )))   start, and ... sorry guys, but I am going simple drop that 
+ (((    on program exit without deallocation, cuz don't know when and
+  )))   how we should dispose it, but here will be method for it
+ (((*/
+
+static BSTree _sTeleport;
+static bool _sTeleportInited = false;
+
+struct _TNode {
+    BSTNode node;
+
+    const char * Type;
+    const struct XFSTeleport * Teleport;
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static
+int64_t
+_TeleportLookupCallback ( const void * Item, const BSTNode * Node )
+{
+    return XFS_StringCompare4BST_ZHR (
+                                ( const char * ) Item,
+                                ( ( struct _TNode * ) Node ) -> Type
+                                );
+}   /* _TeleportLookupCallback () */
+
+static
+const struct _TNode * CC
+_TeleportLookup ( const char * Type )
+{
+    if ( _sTeleportInited == true ) {
+        return ( const struct _TNode * ) BSTreeFind (
+                                        ( struct BSTree * ) & _sTeleport,
+                                        Type,
+                                        _TeleportLookupCallback
+                                        );
+    }
+
+    return NULL;
+}   /* _TeleportLookup () */
+
+static
+bool CC
+_TeleportHas ( const char * Type )
+{
+    return _TeleportLookup ( Type ) != NULL;
+}   /* _TeleportHas () */
+
+static
+int64_t
+_TeleportAddCallback ( const BSTNode * Item, const BSTNode * Node )
+{
+    return XFS_StringCompare4BST_ZHR (
+                                ( ( struct _TNode * ) Item ) -> Type,
+                                ( ( struct _TNode * ) Node ) -> Type
+                                );
+}   /* _TeleportAddCallback () */
+
+static
+rc_t CC
+_TeleportAdd ( const char * Name, XFSTeleportProvider_t Provider )
+{
+    rc_t RCt;
+    struct _TNode * Tde;
+
+    RCt = 0; 
+
+    if ( Name == NULL || Provider == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( _TeleportHas ( Name ) == true ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Tde = calloc ( 1, sizeof ( struct _TNode ) );
+    if ( Tde == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    if ( XFS_StrDup ( Name, & ( Tde -> Type ) ) != 0 ) {
+        free ( Tde );
+
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = Provider ( & Tde -> Teleport );
+
+    if ( RCt != 0 || Tde -> Teleport == NULL ) {
+        free ( ( char * ) Tde -> Type );
+        free ( Tde );
+
+        return XFS_RC ( rcInvalid );
+    }
+
+    BSTreeInsert (
+                ( struct BSTree * ) & _sTeleport,
+                ( struct BSTNode * ) Tde,
+                _TeleportAddCallback
+                );
+
+    return RCt;
+}   /* _TeleportAdd () */
+
+#define CACHE_NAME                  "cache"
+XFS_EXTERN rc_t CC XFSGapCacheProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define FILE_NAME                   "file"
+XFS_EXTERN rc_t CC XFSFileProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define ENCRYPTED_FILE_NAME         "encrypted-file"
+XFS_EXTERN rc_t CC XFSEncryptedFileProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define DIRECTORY_NAME             "directory"
+XFS_EXTERN rc_t CC XFSDirectoryProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define README_NAME                "readme"
+XFS_EXTERN rc_t CC XFSReadMeProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define KART_KARTS_NAME            "karts"
+XFS_EXTERN rc_t CC XFSGapKartsProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define KART_NAME                   "kart"
+XFS_EXTERN rc_t CC XFSGapKartProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define KART_FILES_NAME                   "kart-files"
+XFS_EXTERN rc_t CC XFSGapKartFilesProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define LINK_NAME                   "link"
+XFS_EXTERN rc_t CC XFSLinkProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define LOCAL_REPOSITORY_NAME       "local-repository"
+XFS_EXTERN rc_t CC XFSLocalRepositoryProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define REMOTE_REPOSITORY_NAME      "remote-repository"
+XFS_EXTERN rc_t CC XFSRemoteRepositoryProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+/* TODO !!!
+#define REMOTE_FILE_NAME            "remote-file"
+XFS_EXTERN rc_t CC XFSRemoteFileProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+*/
+
+#define WORKSPACE_NAME              "workspace"
+XFS_EXTERN rc_t CC XFSWorkspaceProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define SIMPLE_CONTAINER_NAME       "simple-container"
+XFS_EXTERN rc_t CC XFSSimpleContainerProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define TAR_ARCHIVE_NAME            "tar-archive"
+XFS_EXTERN rc_t CC XFSTarArchiveProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define GAP_PROJECT_NAME            "gap-project"
+XFS_EXTERN rc_t CC XFSGapProjectProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+#define GAP_FILE_NAME               "gap-file"
+XFS_EXTERN rc_t CC XFSGapFileProvider (
+                                const struct XFSTeleport ** Teleport
+                                );
+
+static
+rc_t CC
+_TeleportInit ()
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( _sTeleportInited == true ) {
+        return 0;
+    }
+
+    BSTreeInit ( & _sTeleport );
+    _sTeleportInited = true;
+
+        /* Here we are adding Teleports */
+    do {
+        RCt = _TeleportAdd ( CACHE_NAME, XFSGapCacheProvider );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd ( FILE_NAME, XFSFileProvider );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd (
+                        ENCRYPTED_FILE_NAME,
+                        XFSEncryptedFileProvider
+                        );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd ( DIRECTORY_NAME, XFSDirectoryProvider );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd ( README_NAME, XFSReadMeProvider );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd ( KART_KARTS_NAME, XFSGapKartsProvider );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd ( KART_NAME, XFSGapKartProvider );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd ( KART_FILES_NAME, XFSGapKartFilesProvider );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd ( LINK_NAME, XFSLinkProvider );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd (
+                        LOCAL_REPOSITORY_NAME,
+                        XFSLocalRepositoryProvider
+                        );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd (
+                        REMOTE_REPOSITORY_NAME,
+                        XFSRemoteRepositoryProvider
+                        );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd ( WORKSPACE_NAME, XFSWorkspaceProvider );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd (
+                        SIMPLE_CONTAINER_NAME,
+                        XFSSimpleContainerProvider
+                        );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd (
+                        TAR_ARCHIVE_NAME,
+                        XFSTarArchiveProvider
+                        );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd (
+                        GAP_PROJECT_NAME,
+                        XFSGapProjectProvider
+                        );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+        RCt = _TeleportAdd (
+                        GAP_FILE_NAME,
+                        XFSGapFileProvider
+                        );
+        if ( RCt != 0 ) { 
+            break;
+        }
+
+    } while ( false );
+
+    return RCt;
+}   /* _TeleportInit () */
+
+static
+void CC
+_TeleportWhacker ( BSTNode * Node, void * Unused )
+{
+    struct _TNode * Tode;
+
+    Tode = ( struct _TNode * ) Node;
+
+    if ( Tode != NULL ) {
+        if ( Tode -> Type != NULL ) {
+            free ( ( char * ) Tode -> Type );
+
+            Tode -> Type = NULL;
+        }
+
+        if ( Tode -> Teleport != NULL ) {
+            if ( Tode -> Teleport -> DeleteOnWhack ) {
+                free ( ( struct XFSTeleport * ) Tode -> Teleport );
+
+            }
+            Tode -> Teleport = NULL;
+        }
+
+        free ( Tode );
+    }
+}   /* _TeleportWhacker () */
+
+static
+rc_t CC
+_TeleportWhack ()
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( _sTeleportInited != true ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    BSTreeWhack ( & _sTeleport, _TeleportWhacker, NULL );
+
+    _sTeleportInited = false;
+
+    return RCt;
+}   /* _TeleportWhack () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+LIB_EXPORT
+rc_t CC
+XFSTeleportLookup (
+            const char * NodeType,
+            const struct XFSTeleport ** Teleport
+)
+{
+    rc_t RCt;
+    const struct _TNode * tNode;
+
+    RCt = 0;
+    tNode = NULL;
+
+    if ( NodeType == NULL || Teleport == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Teleport = NULL;
+
+    if ( _sTeleportInited == false ) {
+        /* HOHOA, will init it somewhere else
+            RCt = _TeleportInit ();
+         */
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( RCt == 0 ) {
+        tNode = _TeleportLookup ( NodeType );
+        if ( tNode == NULL ) {
+            RCt = XFS_RC ( rcNotFound );
+        }
+        else {
+            * Teleport = tNode -> Teleport;
+        }
+    }
+
+    return RCt;
+}   /* XFSTeleportLookup () */
+
+LIB_EXPORT
+rc_t CC
+XFSTeleportInit ()
+{
+    return _TeleportInit ();
+}   /* XFSTeleportInit () */
+
+LIB_EXPORT
+rc_t CC
+XFSTeleportDispose ()
+{
+    return _TeleportWhack ();
+}   /* XFSTeleportDispose () */
diff --git a/libs/xfs/teleport.h b/libs/xfs/teleport.h
new file mode 100644
index 0000000..c720141
--- /dev/null
+++ b/libs/xfs/teleport.h
@@ -0,0 +1,108 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _teleport_h_
+#define _teleport_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   This is unlegit file, which is access point to methods
+  ))))  which are needed to construct XFSNode from XFSModelNode
+ ((((   Will change it in future, but it is right now that way
+  ))))
+ ((((*/
+
+/*))
+ //  Forwards
+((*/
+struct XFSTeleport;
+struct XFSModel;
+struct XFSModelNode;
+struct XFSNode;
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))))
+ ////   Constructor, and validator. Think that it more than enough
+((((*/
+typedef rc_t ( CC * XFSNodeC_t ) (
+                            const struct XFSModel * Model,
+                            const struct XFSModelNode * Template,
+                            const char * Alias,
+                            const struct XFSNode ** Node
+                            );
+
+typedef rc_t ( CC * XFSNodeV_t ) (
+                            const struct XFSModel * Model,
+                            const struct XFSModelNode * Template,
+                            const char * Alias,
+                            uint32_t Flags
+                            );
+
+typedef rc_t ( CC * XFSTeleportProvider_t ) (
+                            const struct XFSTeleport ** Teleport
+                            );
+
+/*))))
+ ((((   Each type of node constructor and volidator by name
+  ))))  Constructor could not be NULL, but Validator could.
+ ((((*/
+struct XFSTeleport {
+        /* ??? mb. version */
+    XFSNodeC_t Constructor;
+    XFSNodeV_t Validator;
+
+    bool DeleteOnWhack;
+};
+
+/*))))
+ ////   Here we are going... I mean, getting teleport by name
+((((*/
+XFS_EXTERN
+rc_t CC
+XFSTeleportLookup (
+            const char * NodeType,
+            const struct XFSTeleport ** Teleport
+);
+
+/*))))
+ ////   Here we are initem'n'disposing Teleport
+((((*/
+XFS_EXTERN rc_t CC XFSTeleportInit ();
+XFS_EXTERN rc_t CC XFSTeleportDispose ();
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _teleport_h_ */
diff --git a/libs/xfs/tree.c b/libs/xfs/tree.c
new file mode 100644
index 0000000..b3aac62
--- /dev/null
+++ b/libs/xfs/tree.c
@@ -0,0 +1,717 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/namelist.h>
+#include <klib/log.h>
+#include <kproc/lock.h>
+
+#include <xfs/model.h>
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/path.h>
+
+#include "mehr.h"
+#include "zehr.h"
+#include "schwarzschraube.h"
+
+#include <sysalloc.h>
+
+/*)))
+ |||
+ +++    Tree and all the worst
+ |||
+(((*/
+
+/*)))
+ |||
+ +++    We believe that here could be many trees, so refcounts
+ +++    Also, we will not keep model in memory, because it could be
+ +++    reloaded from Resource at any time and compared by version
+ |||
+(((*/
+struct XFSNode;
+
+struct XFSTree {
+    KRefcount refcount;
+
+        /* Yes, it is pointer for something */
+    struct XFSNode * Root;
+
+    const char * Resource;
+    const char * Version;
+};
+
+/*)
+ /      Useful farriables
+(*/
+static const char * _sXFSTree_classname = "XFSTree";
+
+/*)))
+ |||
+ +++    Verificaion ... does not know yet what is it, but ...
+ |||
+(((*/
+
+static
+rc_t CC
+_VerifyTreeModelNode (
+                const struct XFSModel * Model,
+                const struct XFSModelNode * Node,
+                uint32_t Flags
+)
+{
+    rc_t RCt;
+    const char * Prop, * Name;
+    bool DoCheck;
+
+    RCt = 0;
+    Prop = NULL;
+    Name = NULL;
+
+    if ( Model == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    DoCheck = Flags != 0
+            && ( Flags & XFS_CHECK_INTEGRITY ) == XFS_CHECK_INTEGRITY;
+
+    if ( DoCheck ) {
+            /* First we should check that name exists and not NULL */
+        Name = XFSModelNodeName ( Node );
+        if ( Name == NULL ) {
+/*
+LogMsg ( klogDebug, "Node name missed" );
+*/
+            return XFS_RC ( rcInvalid );
+        }
+
+            /* checking noode with AS name */
+        Prop = XFSModelNodeAs ( Node );
+        if ( Prop != NULL ) {
+            if ( XFSModelLookupNode ( Model, Prop ) == NULL ) {
+/*
+pLogMsg ( klogDebug, "Node [$(name)] can not stat node with 'AS' name [$(name)]", "name=%s,as=%s", Name, Prop );
+*/
+                return XFS_RC ( rcInvalid );
+            }
+        }
+
+            /* there should not be node with name as property 'label' */
+        Prop = XFSModelNodeLabel ( Node );
+        if ( Prop != NULL ) {
+            /* TODO .... incorrect check, You should check all labels
+                for all modell nodes
+             */ 
+            if ( XFSModelLookupNode ( Model, Prop ) != NULL ) {
+/*
+pLogMsg ( klogDebug, "Node [$(name)] with 'LABEL' [$(label)] already exists", "name=%s,label=%s", Name, Prop );
+*/
+                return XFS_RC ( rcInvalid );
+            }
+        }
+    }
+
+    return RCt;
+}   /* _VerifyTreeModelNoode () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeVerifyModel ( const struct XFSModel * Model, uint32_t Flags )
+{
+    rc_t RCt;
+    const struct XFSModelNode * Root;
+    bool DoCheck;
+
+    RCt = 0;
+    Root = NULL;
+
+    if ( Model == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    DoCheck = Flags != 0
+            && ( Flags & XFS_CHECK_INTEGRITY ) == XFS_CHECK_INTEGRITY;
+
+    if ( DoCheck ) {
+        Root = XFSModelRootNode ( Model );
+        if ( Root == NULL ) {
+            return XFS_RC ( rcInvalid );
+        }
+
+        RCt = _VerifyTreeModelNode ( Model, Root, Flags );
+    }
+
+    return RCt;
+}   /* XFSTreeVerifyModel () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeMake ( const struct XFSModel * Model, struct XFSTree ** Tree )
+{
+    rc_t RCt;
+    struct XFSTree * tTree;
+
+    RCt = 0;
+
+    if ( Model == NULL || Tree == NULL ) { 
+        return XFS_RC ( rcNull );
+    }
+
+    * Tree = NULL;
+
+        /* Creating a tree */
+    tTree = calloc ( 1, sizeof ( struct XFSTree ) );
+/*
+pLogMsg ( klogDebug, " |<- TreeMake ( $(tree) )", "tree=%p", ( void * ) tTree );
+*/
+    if ( tTree == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    if ( XFS_StrDup (
+                    XFSModelResource ( Model ),
+                    & ( tTree -> Resource )
+                    ) != 0
+    ) {
+        XFSTreeDispose ( tTree );
+        return XFS_RC ( rcExhausted );
+    }
+
+    if ( XFSModelVersion ( Model ) != NULL ) {
+        if ( XFS_StrDup (
+                        XFSModelVersion ( Model ),
+                        & ( tTree -> Version ) ) != 0
+        ) {
+            XFSTreeDispose ( tTree );
+            return XFS_RC ( rcExhausted );
+        }
+    }
+    else {
+        tTree -> Version = NULL;
+    }
+
+    RCt = XFSNodeMake (
+                    Model,
+                    XFSModelNodeName ( XFSModelRootNode ( Model ) ),
+                    NULL,
+                    ( const struct XFSNode ** ) & ( tTree -> Root )
+                    );
+    if ( RCt == 0 ) {
+        KRefcountInit (
+                        & ( tTree -> refcount ),
+                        1,
+                        _sXFSTree_classname,
+                        "XFSTreeMake",
+                        "Tree"
+                        );
+    }
+
+    if ( RCt == 0 ) {
+        * Tree = tTree;
+    }
+    else {
+        XFSTreeDispose ( tTree );
+
+        tTree = NULL;
+    }
+
+/*
+pLogMsg ( klogDebug, " ->| TreeMake ( $(tree) )", "tree=%p", ( void * ) * Tree );
+*/
+
+    return RCt;
+}   /* XFSTreeMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeDispose ( struct XFSTree * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+/*
+pLogMsg ( klogDebug, " |<- TreeDispose ( $(tree) )", "tree=%p", ( void * ) self );
+*/
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> Root != NULL ) {
+        XFSNodeRelease ( self -> Root );
+
+        self -> Root = NULL;
+    }
+
+    if ( self -> Resource != NULL ) {
+        free ( ( char * ) self -> Resource );
+
+        self -> Resource = NULL;
+    }
+
+    if ( self -> Version != NULL ) {
+        free ( ( char * ) self -> Version );
+
+        self -> Version = NULL;
+    }
+
+    KRefcountWhack ( & ( self -> refcount ), _sXFSTree_classname );
+
+    free ( self );
+
+    return RCt;
+}   /* XFSTreeDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeAddRef ( const struct XFSTree * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self != NULL ) {
+        switch ( KRefcountAdd (
+                    & ( self -> refcount ),
+                    _sXFSTree_classname
+                    )
+        ) {
+            case krefOkay :
+                RCt = 0;
+                break;
+            case krefZero :
+            case krefLimit :
+            case krefNegative :
+                RCt = XFS_RC ( rcInvalid );
+                break;
+            default :
+                RCt = XFS_RC ( rcUnknown );
+                break;
+        }
+    }
+    else {
+        RCt = XFS_RC ( rcNull );
+    }
+
+    return RCt;
+}   /* XFSTreeAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeRelease ( const struct XFSTree * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+    if ( self != NULL ) {
+        switch ( KRefcountDrop (
+                        & ( self -> refcount ),
+                        _sXFSTree_classname
+                        )
+        ) {
+            case krefOkay :
+            case krefZero :
+                RCt = 0;
+                break;
+            case krefWhack :
+                RCt = XFSTreeDispose ( ( struct XFSTree * ) self );
+                break;
+            case krefNegative :
+                RCt = XFS_RC ( rcInvalid );
+                break;
+            default :
+                RCt = XFS_RC ( rcUnknown );
+                break;
+        }
+    }
+
+    return RCt;
+}   /* XFSTreeRelease () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeFindNode (
+                const struct XFSTree * self,
+                const char * Path,
+                const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    const struct XFSPath * XPath;
+
+    RCt = 0;
+    XPath = NULL;
+
+    if ( self == NULL || Path == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Node = NULL;
+
+    if ( self -> Root == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSPathMake ( & XPath, true, Path );
+    if ( RCt == 0 ) {
+
+        RCt = XFSNodeFindNode ( self -> Root, XPath, 0, Node );
+        if ( RCt != 0 ) {
+            RCt = XFSNodeNotFoundMake ( XFSPathName ( XPath ), Node );
+        }
+
+        XFSPathRelease ( XPath );
+    }
+
+    return RCt;
+}   /* XFSTreeFindNode () */
+
+XFS_EXTERN
+rc_t CC
+XFSTreeFindNodeForPath (
+                const struct XFSTree * self,
+                const struct VPath * Path,
+                const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    char Buf [ XFS_SIZE_4096 ];
+
+    RCt = 0;
+    * Buf = 0;
+
+    if ( self == NULL || Path == NULL || Node == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Node = NULL;
+
+
+    RCt = XFS_ReadVPath_ZHR ( Path, Buf, sizeof ( Buf ) , "" );
+    if ( RCt == 0 ) {
+        RCt = XFSTreeFindNode ( self, Buf, Node );
+    }
+
+    return RCt;
+}   /* XFSTreeFindNodeForPath () */
+
+/*)))
+ |||
+ +++    Tree Depot and all the worstterrerr
+ |||
+(((*/
+
+struct XFSTreeDepot {
+    KLock * mutabor;
+
+    struct XFSTree * Tree;
+};
+
+LIB_EXPORT
+rc_t CC
+XFSTreeDepotMake ( const struct XFSTreeDepot ** Depot )
+{
+    rc_t RCt;
+    struct XFSTreeDepot * TheDepot;
+
+    RCt = 0;
+    TheDepot = NULL;
+
+    if ( Depot == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Depot = NULL;
+
+    TheDepot = calloc ( 1, sizeof ( struct XFSTreeDepot ) );
+    if ( TheDepot == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = KLockMake ( & ( TheDepot -> mutabor ) );
+    if ( RCt == 0 ) {
+        * Depot = TheDepot;
+    }
+    else {
+        free ( TheDepot );
+
+        * Depot = NULL;
+    }
+
+/*
+pLogMsg ( klogDebug, " |<- TreeDepotMake ( $(tree) )", "tree=%p", ( void * ) * Depot );
+*/
+
+    return RCt;
+}   /* XFSTreeDepotMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeDepotDispose ( const struct XFSTreeDepot * self )
+{
+    rc_t RCt;
+    struct XFSTree * Tree;
+    KLock * mutabor;
+
+    RCt = 0;
+    Tree = NULL;
+    mutabor = NULL;
+
+/*
+pLogMsg ( klogDebug, " |<- TreeDepotDispose ( $(tree) )", "tree=%p", ( void * ) self );
+*/
+
+    if ( self == 0 ) {
+        return 0;
+    }
+
+    /* That is not thread safe method :lol: */
+
+    Tree = ( struct XFSTree * ) self -> Tree;
+    mutabor = self -> mutabor;
+
+    free ( ( struct XFSTreeDepot * ) self );
+
+    XFSTreeRelease ( Tree );
+    KLockRelease ( mutabor );
+
+    return RCt;
+}   /* XFSTreeDepotDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeDepotGet (
+            const struct XFSTreeDepot * self,
+            const struct XFSTree ** Tree
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL || Tree == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Tree = NULL;
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+
+        RCt = XFSTreeAddRef ( self -> Tree );
+        if ( RCt == 0 ) {
+            * Tree = self -> Tree;
+        }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSTreeDepotGet () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeDepotSet (
+            const struct XFSTreeDepot * self,
+            const struct XFSTree * Tree
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL || Tree == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = XFSTreeAddRef ( Tree );
+        if ( RCt == 0 ) {
+            if ( self -> Tree != NULL ) {
+
+                    /*)) I do not check return code here, because we
+                     //  are going to drop that tree anyway.
+                    ((*/
+                XFSTreeRelease ( self -> Tree );
+            }
+
+            ( ( struct XFSTreeDepot * ) self ) -> Tree =
+                                    ( struct XFSTree * ) Tree;
+        }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSTreeDepotSet () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeDepotVersion (
+                const struct XFSTreeDepot * self,
+                char * Buffer,
+                size_t BufferSize
+)
+{
+    rc_t RCt;
+    const struct XFSTree * Tree;
+
+    RCt = 0;
+    Tree = NULL;
+
+    if ( self == NULL || Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Buffer = 0;
+
+    RCt = XFSTreeDepotGet ( self, & Tree );
+    if ( RCt == 0 ) { 
+        if ( Tree != NULL ) {
+            if ( Tree -> Version != NULL ) {
+                string_copy_measure (
+                                    Buffer,
+                                    BufferSize,
+                                    Tree -> Version
+                                    );
+            }
+
+            XFSTreeRelease ( Tree );
+        }
+        else {
+            RCt = XFS_RC ( rcNotFound );
+        }
+    }
+
+    return RCt;
+}   /* XFSTreeDepotVersion () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeDepotResource (
+                const struct XFSTreeDepot * self,
+                char * Buffer,
+                size_t BufferSize
+)
+{
+    rc_t RCt;
+    const struct XFSTree * Tree;
+
+    RCt = 0;
+    Tree = NULL;
+
+    if ( self == NULL || Buffer == NULL || BufferSize == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Buffer = 0;
+
+    RCt = XFSTreeDepotGet ( self, & Tree );
+    if ( RCt == 0 ) { 
+        if ( Tree != NULL ) {
+            if ( Tree -> Resource != NULL ) {
+                string_copy_measure (
+                                    Buffer,
+                                    BufferSize,
+                                    Tree -> Resource
+                                    );
+            }
+
+            XFSTreeRelease ( Tree );
+        }
+        else {
+            RCt = XFS_RC ( rcNotFound );
+        }
+    }
+
+    return RCt;
+}   /* XFSTreeDepotResource () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeDepotFindNode (
+                    const struct XFSTreeDepot * self,
+                    const char * Path,
+                    const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    const struct XFSTree * Tree;
+
+    RCt = 0;
+    Tree = NULL;
+
+    if ( self == NULL || Path == NULL || Node == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Node = NULL;
+
+    RCt = XFSTreeDepotGet ( self, & Tree );
+    if ( RCt == 0 ) { 
+        if ( Tree != NULL ) {
+            RCt = XFSTreeFindNode ( Tree, Path, Node );
+
+            XFSTreeRelease ( Tree );
+        }
+        else {
+            RCt = XFS_RC ( rcNotFound );
+        }
+    }
+
+    return RCt;
+}   /* XFSTreeDepotFindNode () */
+
+LIB_EXPORT
+rc_t CC
+XFSTreeDepotFindNodeForPath (
+                    const struct XFSTreeDepot * self,
+                    const struct VPath * Path,
+                    const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    char Buf [ XFS_SIZE_4096 ];
+
+    RCt = 0;
+
+    if ( self == NULL || Path == NULL || Node == 0 ) {
+        return XFS_RC ( rcNull );
+    }
+    * Node = NULL;
+
+    RCt = XFS_ReadVPath_ZHR ( Path, Buf, sizeof ( Buf ) , "" );
+    if ( RCt == 0 ) {
+        RCt = XFSTreeDepotFindNode ( self, Buf, Node );
+    }
+
+    return RCt;
+}   /* XFSTreeDepotFindNodeForPath () */
+
diff --git a/libs/xfs/unix/operations.c b/libs/xfs/unix/operations.c
new file mode 100644
index 0000000..daadbc9
--- /dev/null
+++ b/libs/xfs/unix/operations.c
@@ -0,0 +1,2155 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+ /* Something unusual: Lyrics
+  *
+  * That file contains only one useful function:
+  *
+  *                       XFS_Private_InitOperations
+  *
+  * it needed to fill fuse_operations structure.
+  *
+  * I put here all possible ( for 2.5 ) stubs to fuse_operations
+  * functions. However, I will use only several of them while 
+  * structure initialisation. So, if You want to extend functionality,
+  * please edit already ready stub and add new function to structure
+  * initialized .
+  *
+  */
+
+#include <klib/out.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/defs.h>
+#include <klib/log.h>
+#include <vfs/path.h>
+#include <vfs/manager.h>
+
+
+#include <xfs/tree.h>
+#include <xfs/node.h>
+#include <xfs/handle.h>
+#include <xfs/editors.h>
+#include <xfs/perm.h>
+#include <xfs/path.h>
+
+#include "schwarzschraube.h"
+
+#include <sysalloc.h>
+#include <string.h> /* we are using memset() */
+#include <dirent.h>
+#include <unistd.h>
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/statvfs.h>
+
+#include "operations.h"
+
+
+/****************************************************************
+ * Something weird, but it could simplify somebody's life
+ *
+ *      FUSE method            Use/Not  Implemented  Comment
+ ****************************************************************/
+#define USE_XFS_FUSE_GETATTR      1     /* + */
+#define USE_XFS_FUSE_READLINK     0     /* - */ /* ? */
+#define USE_XFS_FUSE_GETDIR       0     /* - */ /* Obsolete method */
+#define USE_XFS_FUSE_MKNOD        0     /* - */ /* Do not need */
+#define USE_XFS_FUSE_MKDIR        1     /* + */
+#define USE_XFS_FUSE_UNLINK       1     /* + */
+#define USE_XFS_FUSE_RMDIR        1     /* + */
+#define USE_XFS_FUSE_SYMLINK      0     /* - */ /* ? */
+#define USE_XFS_FUSE_RENAME       1     /* + */
+#define USE_XFS_FUSE_LINK         0     /* - */ /* ? */
+#define USE_XFS_FUSE_CHMOD        1     /* - */ /* ? */
+#define USE_XFS_FUSE_CHOWN        0     /* - */ /* Do not need */
+#define USE_XFS_FUSE_TRUNCATE     1     /* + */
+#define USE_XFS_FUSE_UTIME        1     /* + */
+#define USE_XFS_FUSE_OPEN         1     /* + */
+#define USE_XFS_FUSE_READ         1     /* + */
+#define USE_XFS_FUSE_WRITE        1     /* + */
+#define USE_XFS_FUSE_STATFS       0     /* - */ /* ? */
+#define USE_XFS_FUSE_FLUSH        0     /* - */ /* Dummy ... ? */
+#define USE_XFS_FUSE_RELEASE      1     /* + */
+#define USE_XFS_FUSE_FSYNC        1     /* + */ /* ? */
+#define USE_XFS_FUSE_SETXATTR     0     /* - */ /* Do not need */
+#define USE_XFS_FUSE_GETXATTR     0     /* - */ /* Do not need */
+#define USE_XFS_FUSE_LISTXATTR    0     /* - */ /* Do not need */
+#define USE_XFS_FUSE_REMOVEXATTR  0     /* - */ /* Do not need */
+#define USE_XFS_FUSE_OPENDIR      1     /* + */
+#define USE_XFS_FUSE_READDIR      1     /* + */
+#define USE_XFS_FUSE_RELEASEDIR   1     /* + */
+#define USE_XFS_FUSE_FSYNCDIR     0     /* - */ /* ? */
+#define USE_XFS_FUSE_INIT         1     /* + */ /* Dummy ??? */
+#define USE_XFS_FUSE_DESTROY      1     /* + */ /* Dummy ??? */
+#define USE_XFS_FUSE_ACCESS       1     /* + */
+#define USE_XFS_FUSE_CREATE       1     /* + */
+#define USE_XFS_FUSE_FTRUNCATE    1     /* + */ /* ? */
+#define USE_XFS_FUSE_FGETATTR     1     /* + */
+#define USE_XFS_FUSE_LOCK         0     /* - */ /* Do not need */
+#define USE_XFS_FUSE_UTIMENS      0     /* - */ /* Do not need */
+#define USE_XFS_FUSE_BMAP         0     /* - */ /* Do not need */
+#define USE_XFS_FUSE_IOCTL        0     /* - */ /* Do not need */
+#define USE_XFS_FUSE_POLL         0     /* - */ /* Do not need */
+
+
+/*****************************************************
+ * Something unusual
+ * NOTE: that procedure is getting presetted peer from
+ *       fuse_context structure and context is valid
+ *       only while operation call. So, do not use that
+ *       method withoud being harmed
+ *****************************************************/
+static
+rc_t
+_FUSE_tree_depot ( const struct XFSTreeDepot ** Depot )
+{
+    struct fuse_context * TheContext = NULL;
+
+    XFS_CSAN ( Depot )
+    XFS_CAN ( Depot )
+
+    TheContext = fuse_get_context();
+    if ( TheContext == NULL ) {
+        LogErr (
+                klogErr,
+                XFS_RC ( rcNull ),
+                "ERROR: improper usage of 'fuse_get_context()'"
+                );
+        return XFS_RC ( rcNull );
+    }
+
+    * Depot = ( const struct XFSTreeDepot * ) TheContext -> private_data;
+    XFS_CAN ( * Depot )
+
+    return 0;
+}   /* _FUSE_tree_depot () */
+
+static
+rc_t
+_FUSE_make_v_path (
+                const char * ThePath,
+                const struct VPath ** DasPath
+)
+{
+    rc_t RCt;
+    struct VPath * Pth;
+
+    RCt = 0;
+    Pth = NULL;
+
+    XFS_CSAN ( DasPath )
+    XFS_CAN ( ThePath )
+    XFS_CAN ( DasPath )
+
+    RCt = VFSManagerMakePath ( XFS_VfsManager (), & Pth, ThePath );
+    if ( RCt == 0 ) {
+        * DasPath = Pth;
+    }
+
+    return RCt;
+}   /* _FUSE_make_v_path () */
+
+static
+rc_t 
+_FUSE_get_node (
+                const struct VPath * Path,
+                const struct XFSNode ** Node
+)
+{
+    rc_t RCt;
+    const struct XFSTreeDepot * Depot;
+    const struct XFSNode * TheNode;
+
+    RCt = 0;
+    Depot = NULL;
+    TheNode = NULL;
+
+    XFS_CSAN ( Node )
+    XFS_CAN ( Path )
+    XFS_CAN ( Node )
+
+    RCt = _FUSE_tree_depot ( & Depot );
+    if ( RCt == 0 ) {
+        if ( Depot == NULL ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+            RCt = XFSTreeDepotFindNodeForPath (
+                                            Depot,
+                                            Path,
+                                            & TheNode
+                                            );
+            if ( RCt == 0 ) {
+                * Node = TheNode;
+            }
+        }
+    }
+
+    return RCt;
+}   /* _FUSE_get_node () */
+
+static
+rc_t
+_FUSE_get_path_and_node (
+                    const char * ThePath,
+                    const struct VPath ** DasPath,
+                    const struct XFSNode ** Node,
+                    XFSNType * NodeType
+)
+{
+    rc_t RCt;
+    const struct XFSNode * RNode;
+    const struct VPath * RPath;
+    XFSNType Type;
+    const struct XFSAttrEditor * Editor;
+
+    RCt = 0;
+    RNode = NULL;
+    RPath = NULL;
+    Type = kxfsNotFound;
+    Editor = NULL;
+
+    XFS_CSAN ( DasPath )
+    XFS_CSAN ( Node )
+    XFS_CAN ( ThePath )
+
+    RCt = _FUSE_make_v_path ( ThePath, & RPath );
+    if ( RCt == 0 ) {
+
+        RCt = _FUSE_get_node ( RPath, & RNode );
+        if ( RCt == 0 ) {
+            if ( NodeType != NULL ) {
+                RCt = XFSNodeAttrEditor ( RNode, & Editor );
+                if ( RCt == 0 ) {
+                    RCt = XFSAttrEditorType ( Editor, & Type );
+
+                    XFSEditorDispose ( & ( Editor -> Papahen ) );
+                }
+            }
+        }
+    }
+
+    if ( RCt == 0 ) {
+        if ( DasPath != NULL ) {
+            * DasPath = RPath;
+        }
+        else {
+            VPathRelease ( RPath );
+        }
+
+        if ( Node != NULL ) {
+            * Node = RNode;
+        }
+        else {
+            XFSNodeRelease ( RNode );
+        }
+
+        if ( NodeType != NULL ) {
+            * NodeType = Type;
+        }
+    }
+    else {
+        if ( RPath != NULL ) {
+            VPathRelease ( RPath );
+        }
+
+        if ( RNode != NULL ) {
+            XFSNodeRelease ( RNode );
+        }
+    }
+
+    return RCt;
+}   /* _FUSE_get_path_and_node () */
+
+static
+rc_t
+_FUSE_get_parent_node (
+                    const char * Path,
+                    const struct XFSNode ** Parent,
+                    XFSNType * ParentType,      /* Could be NULL */
+                    char ** ChildName           /* Could be NULL */
+)
+{
+    rc_t RCt;
+    const struct XFSTreeDepot * Depot;
+    const struct XFSPath * xPath;
+    uint32_t xPathQ;
+    const struct XFSNode * xNode;
+    const struct XFSAttrEditor * xEditor;
+    char * xName;
+    const struct XFSPath * xParent;
+
+    RCt = 0;
+    Depot = NULL;
+    xPath = NULL;
+    xPathQ = 0;
+    xNode = NULL;
+    xEditor = NULL;
+    xName = NULL;
+    xParent = NULL;
+
+    XFS_CSAN ( Parent )
+    XFS_CSA ( ParentType, kxfsNotFound )
+    XFS_CSAN ( ChildName )
+    XFS_CAN ( Path )
+    XFS_CAN ( Parent )
+
+        /* TreeDepot is a key */
+    RCt = _FUSE_tree_depot ( & Depot );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+        /* Path to parent node is ... */
+    RCt = XFSPathMake ( & xPath, true, Path );
+    if ( RCt == 0 ) {
+        xPathQ = XFSPathPartCount ( xPath );
+        if ( xPathQ < 2 ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+                /* So, there is a path to parent */
+            RCt = XFSPathParent ( xPath, & xParent );
+            if ( RCt == 0 ) {
+                    /* Looking for node */
+                RCt = XFSTreeDepotFindNode (
+                                            Depot,
+                                            XFSPathGet ( xParent ),
+                                            & xNode
+                                            );
+                if ( RCt == 0 ) {
+                    if ( ParentType != NULL ) {
+                        RCt = XFSNodeAttrEditor ( xNode, & xEditor );
+                        if ( RCt == 0 ) {
+                            RCt = XFSAttrEditorType ( xEditor, ParentType );
+                            XFSEditorDispose ( & ( xEditor -> Papahen ) );
+                        }
+                    }
+
+                    if ( RCt == 0 ) {
+                        if ( ChildName != NULL ) {
+                            RCt = XFS_StrDup (
+                                            XFSPathName ( xPath ),
+                                            ( const char ** ) & xName
+                                            );
+                            if ( RCt == 0 ) {
+                                * ChildName = xName;
+                            }
+                        }
+                    }
+
+                    if ( RCt == 0 ) {
+                        * Parent = xNode;
+                    }
+                }
+
+                XFSPathRelease ( xParent );
+            }
+        }
+
+        XFSPathRelease ( xPath );
+    }
+
+    if ( RCt != 0 ) {
+        * Parent = NULL;
+        if ( ParentType != NULL ) {
+            * ParentType = kxfsNotFound;
+        }
+        if ( ChildName != NULL ) {
+            * ChildName = NULL;
+        }
+        if ( xNode != NULL ) {
+            XFSNodeRelease ( xNode );
+        }
+        if ( xName != NULL ) {
+            free ( xName );
+        }
+    }
+
+    return RCt;
+}   /* _FUSE_get_parent_node () */
+
+static
+rc_t
+_FUSE_delete_file_dir ( const char * Path )
+{
+    rc_t RCt;
+    const struct XFSNode * Parent;
+    char * Child;
+    const struct XFSDirEditor * Editor;
+
+    RCt = 0;
+    Parent = NULL;
+    Child = NULL;
+    Editor = NULL;
+
+    XFS_CAN ( Path )
+
+    RCt = _FUSE_get_parent_node ( Path, & Parent, NULL, & Child );
+    if ( RCt == 0 ) {
+        RCt = XFSNodeDirEditor ( Parent, & Editor );
+        if ( RCt == 0 ) {
+            RCt = XFSDirEditorDelete ( Editor, Child );
+
+            XFSEditorDispose ( & ( Editor -> Papahen ) );
+        }
+
+        XFSNodeRelease ( Parent );
+        free ( Child );
+    }
+
+    return RCt;
+}   /* _FUSE_delete_file_dir () */
+
+/*****************************************************
+ * Here are convertors
+ *****************************************************/
+ /*)
+ |*|  Converts permission string to stat mode_t
+ (*/
+static
+rc_t
+_FUSE_char_to_perm ( const char * Perm, XFSNType Type, mode_t * Mode )
+{
+    rc_t RCt;
+    uint32_t Temp;
+
+    RCt = 0;
+    Temp = 0;
+
+    XFS_CSA ( Mode, 0 )
+    XFS_CAN ( Mode )
+
+    if ( Perm == NULL ) {
+        Temp = Type == kxfsFile ? 0644 : 0744;
+    }
+    else {
+        RCt = XFSPermToNum ( Perm, & Temp );
+    }
+
+    if ( RCt == 0 ) {
+        switch ( Type ) {
+            case kxfsFile : Temp |= S_IFREG; break;
+            case kxfsDir:   Temp |= S_IFDIR; break;
+            case kxfsLink:  Temp |= S_IFLNK; break;
+            default:        Temp = 0;        break;
+        }
+
+        if ( Temp == 0 ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+            * Mode = Temp;
+        }
+    }
+
+    return RCt;
+}   /* _FUSE_char_to_perm () */
+
+static
+rc_t
+_FUSE_stat_for_node (
+                const struct XFSNode * Node,
+                struct stat * Stat,
+                const struct XFSFileEditor * FileEditor
+)
+{
+    rc_t RCt;
+    XFSNType Type;
+    KTime_t Time;
+    uint64_t Size;
+    const struct XFSAttrEditor * AttrEditor;
+    const char * Perm;
+
+    RCt = 0;
+    Type = kxfsNotFound;
+    Time = 0;
+    Size = 0;
+    AttrEditor = NULL;
+    Perm = NULL;
+
+    XFS_CAN ( Node )
+    XFS_CAN ( Stat )
+
+    RCt = XFSNodeAttrEditor ( Node, & AttrEditor );
+    if ( RCt != 0 || AttrEditor == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    /*) Here we are doing security ... later 
+     /  TODO Stat -> st_mode = SomeAccess
+    (*/
+
+    RCt = XFSAttrEditorType ( AttrEditor, & Type );
+    if ( RCt == 0 ) {
+        Stat -> st_mode = 0;
+        Stat -> st_uid = getuid();
+        Stat -> st_gid = getgid();
+
+        if ( XFSAttrEditorPermissions ( AttrEditor, & Perm ) == 0 ) {
+            _FUSE_char_to_perm ( Perm, Type, & ( Stat -> st_mode ) );
+        }
+
+        if ( XFSAttrEditorDate ( AttrEditor, & Time ) == 0 ) {
+            Stat -> st_atime = Time;
+            Stat -> st_mtime = Time;
+            Stat -> st_ctime = Time;
+        }
+
+        Stat -> st_blksize = XFS_SIZE_4096 * 8;
+        Stat -> st_size = 0;
+        if ( Type != kxfsDir ) {
+            if ( FileEditor != NULL ) {
+                if ( XFSFileEditorSize ( FileEditor, & Size ) == 0 ) {
+                    Stat -> st_size = Size;
+                }
+            }
+            else {
+                if ( XFSNodeFileEditor ( Node, & FileEditor ) == 0 ) {
+                    if ( FileEditor != NULL ) {
+                        if ( XFSFileEditorSize ( FileEditor, & Size ) == 0 ) {
+                            Stat -> st_size = Size;
+                        }
+                        XFSEditorDispose ( & ( FileEditor -> Papahen ) );
+                    }
+                }
+            }
+        }
+    }
+
+    XFSEditorDispose ( & ( AttrEditor -> Papahen ) );
+
+    return RCt;
+}   /* _FUSE_stat_for_node () */
+
+/*
+ $  Cache for less :)
+ $  Apparently, I can not to interpret all errors correctly, and
+ $  I will to the same thing as Anton: return EBADF.
+ */
+static
+int
+XFS_FUSE_rc_to_errno ( rc_t RCt )
+{
+    uint32_t Target, Object, State;
+
+    Target = Object = State = 0;
+
+    State = GetRCState ( RCt );
+    if ( State == rcNoErr ) {
+        return 0;
+    }
+
+    Target = GetRCTarget ( RCt );
+    Object = GetRCObject ( RCt );
+
+    if ( State == rcUnknown && Object == rcTransfer ) {
+        return EIO;
+    }
+
+    if ( Target == rcNoTarg && Object == rcNoObj ) {
+        switch ( State ) {
+                    /*  Missed Peer method */
+            case rcUnsupported :    return ENOSYS;
+                    /*  Some of peer parametes was NULL */
+            case rcNull :           return EFAULT;
+                    /*  Something is wrong */
+            case rcUnknown :        return EBADF;
+        }
+
+        return EBADF;
+    }
+
+    if ( Target == rcDirectory ) {
+        switch ( State ) {
+            case rcUnauthorized :   return EACCES;
+            case rcExhausted :      return Object == rcStorage
+                                                        ? ENOSPC
+                                                        : ENOMEM
+                                                        ;
+            case rcNotFound :       return ENOENT;
+            case rcInvalid :
+            case rcIncorrect :      return EINVAL;
+            case rcExcessive :      return Object == rcParam
+                                                        ? EFBIG
+                                                        : ENAMETOOLONG
+                                                        ;
+            case rcExists :         return EEXIST;
+            case rcBusy :           return EBUSY;
+            case rcIncomplete :     return EINTR;
+        }
+
+        return EBADF;
+    }
+
+    if ( Target == rcFile ) {
+        switch ( State ) {
+            case rcExhausted :      return Object == rcStorage
+                                                        ? ENOSPC
+                                                        : ENOMEM
+                                                        ;
+            case rcIncomplete :     return EINTR;
+            case rcExcessive :      return EFBIG;
+            case rcIncorrect :      return EISDIR;
+            case rcReadonly :       return EROFS;
+            case rcInvalid :        return EINVAL;
+        }
+
+        return EBADF;
+    }
+
+    if ( Object == rcMemMap ) {
+        switch ( State ) {
+            case rcNoPerm :         return EACCES;
+            case rcInvalid :        return EBADF;
+            case rcIncomplete :     return EAGAIN;
+            case rcExhausted :      return ENOMEM;
+        }
+
+        return EBADF;
+    }
+
+    return EBADF;
+}   /* XFS_FUSE_rc_to_errno () */
+
+
+/*****************************************************
+ * Operations
+ *****************************************************/
+
+/*****************************************************/
+#if USE_XFS_FUSE_GETATTR == 1
+
+static
+int
+XFS_FUSE_getattr ( const char * ThePath, struct stat * TheStat )
+{
+    rc_t RCt;
+    const struct XFSNode * Node;
+    XFSNType Type;
+
+    RCt = 0;
+    Node = NULL;
+    Type = kxfsNotFound;
+
+    pLogMsg ( klogDebug, "GETATTR(Fuse): [$(path)]", "path=%s", ThePath );
+
+    if ( ThePath == NULL || TheStat == NULL ) {
+pLogMsg ( klogDebug, "GETATTR(Fuse,cont): [$(path)] [INVALID]", "path=%s", ThePath );
+        return EINVAL * - 1;
+    }
+    memset ( TheStat, 0, sizeof ( struct stat ) );
+
+    RCt = _FUSE_get_path_and_node ( ThePath, NULL, & Node, & Type );
+    if ( RCt == 0 ) {
+        if ( Type == kxfsNotFound ) {
+            XFSNodeRelease ( Node );
+
+pLogMsg ( klogDebug, "GETATTR(Fuse,cont): [$(path)] [NotFound]", "path=%s", ThePath );
+            return ENOENT * - 1;
+        }
+
+        RCt = _FUSE_stat_for_node ( Node, TheStat, NULL );
+
+        XFSNodeRelease ( Node );
+    }
+
+    pLogMsg ( klogDebug, "GETATTR(Fuse,cont): [$(path)] [$(rc)]", "path=%s,rc=%d", ThePath, RCt );
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_getattr() */
+
+#endif /* USE_XFS_FUSE_GETATTR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_READLINK == 1
+
+static
+int
+XFS_FUSE_readlink (
+            const char * ThePath,
+            char * RetBuf,
+            size_t RetBufSize
+)
+{
+    pLogMsg ( klogDebug, "READLINK(!): [$(path)]", "path=%s", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_readlink() */
+
+#endif /* USE_XFS_FUSE_READLINK == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_GETDIR == 1
+
+static
+int
+XFS_FUSE_getdir (
+            const char * ThePath,
+            fuse_dirh_t TheFDH,
+            fuse_dirfil_t TheFDF
+)
+{
+    pLogMsg ( klogDebug, "GETDIR(!): [$(path)]", "path=%s", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_getdir() */
+
+#endif /* USE_XFS_FUSE_GETDIR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_MKNOD == 1
+
+static
+int
+XFS_FUSE_mknod ( const char * ThePath, mode_t TheMode, dev_t TheDev )
+{
+    pLogMsg ( klogDebug, "MKNOD(!): [$(path)]", "path=%s", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_mknod() */
+
+#endif /* USE_XFS_FUSE_MKNOD == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_MKDIR == 1
+
+static
+int
+XFS_FUSE_mkdir ( const char * ThePath, mode_t TheMode )
+{
+    rc_t RCt;
+    const struct XFSNode * Parent;
+    char * Child;
+    const struct XFSDirEditor * Editor;
+
+    RCt = 0;
+    Parent = NULL;
+    Child = NULL;
+    Editor = NULL;
+
+    pLogMsg ( klogDebug, "MKDIR(Fuse): [$(path)] MD[$(mode)]", "path=%s,mode=%d", ThePath, TheMode );
+
+    if ( ThePath == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    RCt = _FUSE_get_parent_node ( ThePath, & Parent, NULL, & Child );
+    if ( RCt == 0 ) {
+        RCt = XFSNodeDirEditor ( Parent, & Editor );
+        if ( RCt == 0 ) {
+            RCt = XFSDirEditorCreateDir ( Editor, Child );
+
+            XFSEditorDispose ( & ( Editor -> Papahen ) );
+        }
+
+        XFSNodeRelease ( Parent );
+        free ( Child );
+    }
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_mkdir() */
+
+#endif /* USE_XFS_FUSE_MKDIR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_UNLINK == 1
+
+static
+int
+XFS_FUSE_unlink ( const char * ThePath )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    pLogMsg ( klogDebug, "UNLINK(Fuse): [$(path)]", "path=%s", ThePath );
+
+    if ( ThePath == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    RCt = _FUSE_delete_file_dir ( ThePath );
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_unlink() */
+
+#endif /* USE_XFS_FUSE_UNLINK == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_RMDIR == 1
+
+static
+int
+XFS_FUSE_rmdir ( const char * ThePath )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    pLogMsg ( klogDebug, "RMDIR(Fuse): [$(path)]", "path=%s", ThePath );
+
+    if ( ThePath == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    RCt = _FUSE_delete_file_dir ( ThePath );
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_rmdir() */
+
+#endif /* USE_XFS_FUSE_RMDIR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_SYMLINK == 1
+
+static
+int
+XFS_FUSE_symlink ( const char * OldPath, const char * NewPath )
+{
+    pLogMsg ( klogDebug, "SYMLINK(!): [$(path)]", "path=%s", OldPath );
+
+    return -EPERM;
+}   /* XFS_FUSE_symlink() */
+
+#endif /* USE_XFS_FUSE_SYMLINK == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_RENAME == 1
+
+static
+int
+XFS_FUSE_rename ( const char * OldPath, const char * NewPath )
+{
+    rc_t RCt;
+    const struct XFSNode * OldDir, * NewDir;
+    char * OldName, * NewName;
+    const struct XFSDirEditor * Editor;
+
+    RCt = 0;
+    OldDir = NewDir = NULL;
+    OldName = NewName = NULL;
+    Editor = NULL;
+
+
+    pLogMsg ( klogDebug, "RENAME(Fuse): FR[$(from)] TO[$(to)]", "from=%s,to=%s", OldPath, NewPath );
+
+    if ( OldPath == NULL || NewPath == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    RCt = _FUSE_get_parent_node ( OldPath, & OldDir, NULL, & OldName );
+    if ( RCt == 0 ) {
+        RCt = _FUSE_get_parent_node ( NewPath, & NewDir, NULL, & NewName );
+
+        if ( RCt == 0 ) {
+            RCt = XFSNodeDirEditor ( OldDir, & Editor );
+            if ( RCt == 0 ) {
+                RCt = XFSDirEditorMove ( Editor, OldName, NewDir, NewName );
+                XFSEditorDispose ( & ( Editor -> Papahen ) );
+            }
+
+            XFSNodeRelease ( NewDir );
+            free ( NewName );
+        }
+
+        XFSNodeRelease ( OldDir );
+        free ( OldName );
+    }
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_rename() */
+
+#endif /* USE_XFS_FUSE_RENAME == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_LINK == 1
+
+static
+int
+XFS_FUSE_link ( const char * OldPath, const char * NewPath )
+{
+    pLogMsg ( klogDebug, "LINK(!): FR[$(from)] TO[$(to)]", "from=%s,to=%s", OldPath, NewPath );
+
+    return -EPERM;
+}   /* XFS_FUSE_link() */
+
+#endif /* USE_XFS_FUSE_LINK == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_CHMOD == 1
+
+static
+int
+XFS_FUSE_chmod ( const char * ThePath, mode_t TheMode )
+{
+    rc_t RCt;
+    const struct XFSAttrEditor * Editor;
+    const struct XFSNode * Node;
+    char Buf [ 16 ];
+
+    RCt = 0;
+    Editor = NULL;
+    Node = NULL;
+    * Buf = 0;
+
+    pLogMsg ( klogDebug, "CHMOD(Fuse): [$(path)] MD[$(mode)]", "path=%s,mode=%d", ThePath, TheMode );
+
+    if ( ThePath == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    RCt = XFSPermToChar ( TheMode, Buf, sizeof ( Buf ) );
+    if ( RCt == 0 ) {
+        RCt = _FUSE_get_path_and_node ( ThePath, NULL, & Node, NULL );
+        if ( RCt == 0 ) {
+            RCt = XFSNodeAttrEditor ( Node, & Editor );
+            if ( RCt == 0 ) {
+                RCt = XFSAttrEditorSetPermissions ( Editor, Buf );
+            }
+
+            XFSNodeRelease ( Node );
+        }
+    }
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_chmod() */
+
+#endif /* USE_XFS_FUSE_CHMOD == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_CHOWN == 1
+
+static
+int
+XFS_FUSE_chown ( const char * ThePath, uid_t TheUid, gid_t TheDid )
+{
+    pLogMsg ( klogDebug, "CHOWN(!): [$(path)]", "path=%s", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_chown() */
+
+#endif /* USE_XFS_FUSE_CHOWN == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_TRUNCATE == 1
+
+static
+int
+XFS_FUSE_truncate ( const char * ThePath, off_t TheSize )
+{
+    rc_t RCt;
+    const struct XFSFileEditor * Editor;
+    const struct XFSNode * Node;
+
+    RCt = 0;
+    Editor = NULL;
+    Node = NULL;
+
+    pLogMsg ( klogDebug, "TRUNCATE(Fuse): [$(path)] SZ[$(size)]", "path=%s,size=%d", ThePath, TheSize );
+
+    if ( ThePath == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    RCt = _FUSE_get_path_and_node ( ThePath, NULL, & Node, NULL );
+    if ( RCt == 0 ) {
+        RCt = XFSNodeFileEditor ( Node, & Editor );
+        if ( RCt == 0 ) {
+            RCt = XFSFileEditorSetSize ( Editor, TheSize );
+        }
+
+        XFSNodeRelease ( Node );
+    }
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_truncate() */
+
+#endif /* USE_XFS_FUSE_TRUNCATE == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_UTIME == 1
+
+static
+int
+XFS_FUSE_utime ( const char * ThePath, struct utimbuf * TheBuf )
+{
+    rc_t RCt;
+    const struct XFSAttrEditor * Editor;
+    const struct XFSNode * Node;
+
+    RCt = 0;
+    Editor = NULL;
+    Node = NULL;
+
+    pLogMsg ( klogDebug, "TRUNCATE(Fuse): [$(path)] AT[$(actime)] MT[$(modtime)]", "path=%s,actime=%d,modtime=%d", ThePath, TheBuf -> actime, TheBuf -> modtime );
+
+    if ( ThePath == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    RCt = _FUSE_get_path_and_node ( ThePath, NULL, & Node, NULL );
+    if ( RCt == 0 ) {
+        RCt = XFSNodeAttrEditor ( Node, & Editor );
+        if ( RCt == 0 ) {
+            RCt = XFSAttrEditorSetDate ( Editor, TheBuf -> modtime );
+        }
+
+        XFSNodeRelease ( Node );
+    }
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_utime() */
+
+#endif /* USE_XFS_FUSE_UTIME == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_OPEN == 1
+
+static
+int
+XFS_FUSE_open ( const char * ThePath, struct fuse_file_info * TheInfo )
+{
+    rc_t RCt;
+    const struct XFSNode * Node;
+    XFSNType Type;
+    int Flags;
+    const struct XFSFileEditor * Editor;
+    XFSNMode Mode;
+    const struct XFSHandle * Handle;
+
+    RCt = 0;
+    Node = NULL;
+    Type = kxfsNotFound;
+    Flags = TheInfo == NULL ? 0xbad : TheInfo -> flags;
+    Editor = NULL;
+    Mode = kxfsNone;
+    Handle = NULL;
+
+    pLogMsg ( klogDebug, "OPEN(Fuse): [$(path)] FI[$(info)] FL[$(flags)]", "path=%s,info=%p,flags=%d", ThePath, TheInfo, Flags );
+
+    if ( ThePath == NULL || TheInfo == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    if ( ( Flags & O_RDWR ) == O_RDWR ) {
+        Mode = kxfsReadWrite;
+    }
+    else {
+        if ( ( Flags & O_WRONLY ) == O_WRONLY ) {
+            Mode = kxfsWrite;
+        }
+        else {
+            Mode = kxfsRead;
+        }
+
+    }
+
+    RCt = _FUSE_get_path_and_node ( ThePath, NULL, & Node, & Type );
+    if ( RCt == 0 ) {
+        if ( Type == kxfsNotFound ) {
+            XFSNodeRelease ( Node );
+            return ENOENT * - 1;
+        }
+
+        RCt = XFSNodeFileEditor ( Node, & Editor );
+        if ( RCt == 0 ) {
+            RCt = XFSFileEditorOpen ( Editor, Mode );
+            if ( RCt == 0 ) {
+                RCt = XFSHandleMake ( Node, & Handle );
+                if ( RCt == 0 ) {
+                    XFSHandleSet ( Handle, ( void * ) Editor );
+                    TheInfo -> fh = ( uint64_t ) Handle;
+                }
+            }
+        }
+
+        XFSNodeRelease ( Node );
+    }
+
+    if ( RCt != 0 ) {
+        if ( Editor != NULL ) {
+            XFSEditorDispose ( & ( Editor -> Papahen ) );
+        }
+    }
+
+    pLogMsg ( klogDebug, "OPEN(Fuse,cont): [$(path)] RC[$(rc)] FI[$(info)] FH[$(handle)]", "path=%s,rc=%d,info=%p,handle=%p", ThePath, RCt, TheInfo, Handle );
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_open() */
+
+#endif /* USE_XFS_FUSE_OPEN == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_READ == 1
+
+static
+int
+XFS_FUSE_read (
+            const char * ThePath,
+            char * TheBuf,
+            size_t TheSizeRead,
+            off_t TheOffsetRead,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    rc_t RCt;
+    const struct XFSHandle * Handle;
+    const struct XFSFileEditor * Editor;
+    size_t NumBytesReaded;
+
+    RCt = 0;
+    Editor = NULL;
+    Handle = TheFileInfo == NULL
+                        ? NULL
+                        : ( const struct XFSHandle * ) TheFileInfo -> fh
+                        ;
+    NumBytesReaded = 0;
+
+    pLogMsg ( klogDebug, "READ(Fuse): [$(path)] FI[$(info)] FH[$(handle)] OF[$(off)] SZ[$(size)]", "path=%s,info=%p,handle=%p,off=%d,size=%d", ThePath, TheFileInfo, Handle, TheOffsetRead, TheSizeRead );
+
+    if ( ThePath == NULL || TheBuf == NULL || TheFileInfo == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    if ( Handle == NULL ) {
+        return EBADF * - 1;
+    }
+
+    Editor = ( const struct XFSFileEditor * ) XFSHandleGet ( Handle );
+    if ( Editor == NULL ) {
+        return EBADF * - 1;
+    }
+
+    RCt = XFSFileEditorRead (
+                        Editor,
+                        TheOffsetRead,
+                        TheBuf,
+                        TheSizeRead,
+                        & NumBytesReaded
+                        );
+    pLogMsg ( klogDebug, "READ(Fuse,cont): [$(path)] FI[$(info)] FH[$(handle)] OF[$(off)] SZ[$(size)] RD[$(read)] RC[$(rc)]", "path=%s,info=%p,handle=%p,off=%d,size=%d,read=%d,rc=%d", ThePath, TheFileInfo, Handle, TheOffsetRead, TheSizeRead, NumBytesReaded, RCt );
+
+    return RCt == 0
+                ? NumBytesReaded
+                : ( XFS_FUSE_rc_to_errno ( RCt ) * - 1)
+                ;
+
+}   /* XFS_FUSE_read() */
+
+#endif /* USE_XFS_FUSE_READ == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_WRITE == 1
+
+static
+int
+XFS_FUSE_write (
+            const char * ThePath,
+            const char * TheBuf,
+            size_t TheSizeWrite,
+            off_t TheOffsetWrite,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    rc_t RCt;
+    const struct XFSHandle * Handle;
+    const struct XFSFileEditor * Editor;
+    size_t NumBytesWritten;
+
+    RCt = 0;
+    Editor = NULL;
+    Handle = TheFileInfo == NULL
+                        ? NULL
+                        : ( const struct XFSHandle * ) TheFileInfo -> fh
+                        ;
+    NumBytesWritten = 0;
+
+    pLogMsg ( klogDebug, "WRITE(Fuse): [$(path)] FI[$(info)] FH[$(handle)] OF[$(off)] SZ[$(size)]", "path=%s,info=%p,handle=%p,off=%d,size=%d", ThePath, TheFileInfo, Handle, TheOffsetWrite, TheSizeWrite );
+
+    if ( ThePath == NULL || TheBuf == NULL || TheFileInfo == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    if ( Handle == NULL ) {
+        return EBADF * - 1;
+    }
+
+    Editor = ( const struct XFSFileEditor * ) XFSHandleGet ( Handle );
+    if ( Editor == NULL ) {
+        return EBADF * - 1;
+    }
+
+    RCt = XFSFileEditorWrite (
+                        Editor,
+                        TheOffsetWrite,
+                        TheBuf,
+                        TheSizeWrite,
+                        & NumBytesWritten
+                        );
+
+    pLogMsg ( klogDebug, "WRITE(Fuse,cont): [$(path)] FI[$(info)] FH[$(handle)] OF[$(off)] SZ[$(size)] WR[$(wrote)] RC[$(rc)]", "path=%s,info=%p,handle=%p,off=%d,size=%d,wrote=%d,rc=%d", ThePath, TheFileInfo, Handle, TheOffsetWrite, TheSizeWrite, NumBytesWritten, RCt );
+
+    return RCt == 0
+                ? NumBytesWritten
+                : ( XFS_FUSE_rc_to_errno ( RCt ) * - 1)
+                ;
+}   /* XFS_FUSE_write() */
+
+#endif /* USE_XFS_FUSE_WRITE == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_STATFS == 1
+
+static
+int
+XFS_FUSE_statfs (
+            const char * ThePath,
+            struct statvfs * TheFSStat
+)
+{
+    pLogMsg ( klogDebug, "STATFS(!): [$(path)]", "path=%d", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_statfs() */
+
+#endif /* USE_XFS_FUSE_STATFS == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_FLUSH == 1
+
+static
+int
+XFS_FUSE_flush (
+            const char * ThePath,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    pLogMsg ( klogDebug, "FLUSH(DUMMY): [$(path)] FI[$(info)]", "path=%d,info=%p", ThePath, TheFileInfo );
+
+    return 0;
+}   /* XFS_FUSE_flush() */
+
+#endif /* USE_XFS_FUSE_FLUSH == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_RELEASE == 1
+
+static
+int
+XFS_FUSE_release (
+            const char * ThePath,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    rc_t RCt;
+    const struct XFSHandle * Handle;
+    const struct XFSFileEditor * Editor;
+
+    RCt = 0;
+    Editor = NULL;
+    Handle = TheFileInfo == NULL
+                        ? NULL
+                        : ( const struct XFSHandle * ) TheFileInfo -> fh
+                        ;
+
+    pLogMsg ( klogDebug, "RELEASE(Fuse): [$(path)] FI[$(info)] FH[$(handle)]", "path=%d,info=%p,handle=%p", ThePath, TheFileInfo, Handle );
+
+    if ( ThePath == NULL || TheFileInfo == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    if ( Handle != NULL ) {
+        Editor = ( const struct XFSFileEditor * ) XFSHandleGet ( Handle );
+
+        if ( Editor != NULL ) {
+            XFSFileEditorClose ( Editor );
+            XFSEditorDispose ( & ( Editor -> Papahen ) );
+            XFSHandleSet ( Handle, NULL );
+        }
+
+        XFSHandleRelease ( Handle );
+    }
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_release() */
+
+#endif /* USE_XFS_FUSE_RELEASE == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_FSYNC == 1
+
+static
+int
+XFS_FUSE_fsync (
+            const char * ThePath,
+            int DataSync,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    pLogMsg ( klogDebug, "FSYNC(DUMMY): [$(path)] FI[$(info)] DT[$(data)]", "path=%d,info=%p,data=%p", ThePath, TheFileInfo, DataSync );
+	return 0;
+}   /* XFS_FUSE_fsync() */
+
+#endif /* USE_XFS_FUSE_FSYNC == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_SETXATTR == 1
+
+static
+int
+XFS_FUSE_setxattr (
+            const char * ThePath,
+            const char * TheName,
+            const char * TheValue,
+            size_t TheValueSize,
+            int TheFlags
+)
+{
+    pLogMsg ( klogDebug, "SETXATTR(!): [$(path)]", "path=%d", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_setxattr() */
+
+#endif /* USE_XFS_FUSE_SETXATTR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_GETXATTR == 1
+
+static
+int
+XFS_FUSE_getxattr (
+            const char * ThePath,
+            const char * TheName,
+            char * TheValue,
+            size_t TheValueSize
+)
+{
+    pLogMsg ( klogDebug, "GETXATTR(!): [$(path)]", "path=%d", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_getxattr() */
+
+#endif /* USE_XFS_FUSE_GETXATTR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_LISTXATTR == 1
+
+static
+int
+XFS_FUSE_listxattr (
+            const char * ThePath,
+            char * TheList,
+            size_t TheListSize
+)
+{
+    pLogMsg ( klogDebug, "LISTXATTR(!): [$(path)]", "path=%d", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_listxattr() */
+
+#endif /* USE_XFS_FUSE_LISTXATTR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_REMOVEXATTR == 1
+
+static
+int
+XFS_FUSE_removexattr ( const char * ThePath, const char * TheName)
+{
+    pLogMsg ( klogDebug, "REMOVEXATTR(!): [$(path)]", "path=%d", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_removexattr() */
+
+#endif /* USE_XFS_FUSE_REMOVEXATTR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_OPENDIR == 1
+
+static
+int
+XFS_FUSE_opendir (
+            const char * ThePath,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    rc_t RCt;
+    const struct XFSNode * Node;
+    const struct XFSHandle * Handle;
+    XFSNType Type;
+
+    RCt = 0;
+    Node = NULL;
+    Handle = NULL;
+    Type = kxfsBadPath;
+
+    if ( ThePath == NULL || TheFileInfo == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    pLogMsg ( klogDebug, "OPENDIR(Fuse): [$(path)] FI[$(info)] FL[$(flags)]", "path=%d,info=%p,flags=%d", ThePath, TheFileInfo, TheFileInfo -> flags );
+
+    RCt = _FUSE_get_path_and_node ( ThePath, NULL, & Node, & Type );
+    if ( RCt == 0 ) {
+        if ( Type != kxfsDir ) {
+            XFSNodeRelease ( Node );
+
+            return ENOENT * - 1;
+        }
+
+        RCt = XFSHandleMake ( Node, & Handle );
+        if ( RCt == 0 ) {
+            TheFileInfo -> fh = ( uint64_t ) Handle;
+        }
+
+        XFSNodeRelease ( Node );
+    }
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_opendir() */
+
+#endif /* USE_XFS_FUSE_OPENDIR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_READDIR == 1
+
+/*****************************************************************
+ * JUST FOR ANY CASE, THAT FUNCTION IS USED IN 'readdir()' TO 
+ * FILL BUFFER WITH DIRECTORY INFORMATION
+ *
+ *      typedef int (*fuse_fill_dir_t) (
+ *                  void *buf,
+ *                  const char *name,
+ *                  const struct stat *stbuf,
+ *                  off_t off
+ *                  );
+ *****************************************************************/
+
+static
+int
+XFS_FUSE_readdir (
+            const char * ThePath,
+            void * TheBuffer,
+            fuse_fill_dir_t TheFiller,
+            off_t TheOffset,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    rc_t RCt;
+    const struct XFSNode * Node;
+    const struct XFSHandle * Handle;
+    const struct XFSDirEditor * Editor;
+    const struct KNamelist * List;
+    uint32_t ListQty, llp;
+    const char * Name;
+
+    RCt = 0;
+    Node = NULL;
+    Handle = NULL;
+    Editor = NULL;
+    List = NULL;
+    ListQty = llp = 0;
+    Name = NULL;
+
+    if ( ThePath == NULL || TheFileInfo == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    Handle = ( const struct XFSHandle * ) TheFileInfo -> fh;
+
+    pLogMsg ( klogDebug, "READDIR(Fuse): [$(path)] FI[$(info)] FH[$(handle)]", "path=%d,info=%p,handle=%p", ThePath, TheFileInfo, ( void * ) Handle );
+
+    if ( Handle != NULL ) {
+        Node = XFSHandleNode ( Handle );
+        if ( Node == NULL ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+            RCt = XFSNodeDirEditor ( Node, & Editor );
+            if ( RCt == 0 ) {
+                if ( Editor == NULL ) {
+                    RCt = XFS_RC ( rcInvalid );
+                }
+                else {
+                    RCt = XFSDirEditorList ( Editor, & List );
+                    if ( RCt == 0 ) {
+                        RCt = KNamelistCount ( List, & ListQty );
+                        if ( RCt == 0 ) {
+                            for ( llp = 0; llp < ListQty; llp ++ ) {
+                                RCt = KNamelistGet ( List, llp, & Name );
+                                if ( RCt == 0 ) { 
+                                    TheFiller (
+                                            TheBuffer,
+                                            Name,
+                                            NULL,
+                                            0
+                                            );
+                                }
+
+                                if ( RCt != 0 ) {
+/* Do we need that? TODO!!!
+                                    break;
+*/
+                                    RCt = 0; /* Right ? */
+                                }
+                            }
+                        }
+
+                        KNamelistRelease ( List );
+                    }
+
+                    XFSEditorDispose ( & ( Editor -> Papahen ) );
+                }
+            }
+            else {
+                RCt = XFS_RC ( rcInvalid );
+            }
+        }
+    }
+    else {
+        RCt = XFS_RC ( rcInvalid );
+    }
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_readdir() */
+
+#endif /* USE_XFS_FUSE_READDIR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_RELEASEDIR == 1
+
+static
+int
+XFS_FUSE_releasedir (
+            const char * ThePath,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    rc_t RCt;
+    const struct XFSHandle * Handle;
+
+    RCt = 0;
+    Handle = NULL;
+
+    if ( ThePath == NULL || TheFileInfo == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    Handle = ( const struct XFSHandle * ) TheFileInfo -> fh;
+
+    pLogMsg ( klogDebug, "RELEASEDIR(Fuse): [$(path)] FI[$(info)] FH[$(handle)]", "path=%d,info=%p,handle=%p", ThePath, TheFileInfo, ( void * ) Handle );
+
+    if ( Handle != NULL ) {
+        RCt = XFSHandleRelease ( Handle );
+    }
+    else {
+        RCt = XFS_RC ( rcInvalid );
+    }
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_releasedir() */
+
+#endif /* USE_XFS_FUSE_RELEASEDIR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_FSYNCDIR == 1
+
+static
+int
+XFS_FUSE_fsyncdir (
+            const char * ThePath,
+            int DataSync,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    pLogMsg ( klogDebug, "FSYNCDIR(!): [$(path)]", "path=%d", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_fsyncdir() */
+
+#endif /* USE_XFS_FUSE_FSYNCDIR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_INIT == 1
+
+static
+void *
+XFS_FUSE_init ( struct fuse_conn_info * TheConnInfo )
+{
+    rc_t RCt;
+    const struct XFSTreeDepot * Depot;
+
+    RCt = 0;
+    Depot = NULL;
+
+    RCt = _FUSE_tree_depot ( & Depot );
+
+    pLogMsg ( klogDebug, "INIT(): TheConnInfo [$(conn)] TreeDepot [$(depot)]\n", "conn=%p,depot=%p", TheConnInfo, Depot );
+
+    return RCt != 0 ? NULL : ( void * ) Depot;
+}   /* XFS_FUSE_init() */
+
+#endif /* USE_XFS_FUSE_INIT == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_DESTROY == 1
+
+static
+void
+XFS_FUSE_destroy ( void * OnoSamoe )
+{
+    pLogMsg ( klogDebug, "DESTROY(Dummy): OnoSamoe [$(samoe)]", "samoe=%p", OnoSamoe );
+
+}   /* XFS_FUSE_destroy() */
+
+#endif /* USE_XFS_FUSE_DESTROY == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_ACCESS == 1
+
+static
+int
+XFS_FUSE_access ( const char * ThePath, int Access )
+{
+    rc_t RCt;
+    const struct XFSAttrEditor * Editor;
+    const struct XFSNode * Node;
+    bool xOK, rOK, wOK, fOK;
+    XFSNType Type;
+    const char * Perm;
+    const struct XFSPerm * xPerm;
+    const struct XFSAuth * Auth;
+
+    RCt = 0;
+    Editor = NULL;
+    Node = NULL;
+    Type = kxfsNotFound;
+    Perm = NULL;
+    xPerm = NULL;
+    Auth = NULL;
+
+    xOK = ( Access & X_OK ) == X_OK; /* Can Execute */
+    wOK = ( Access & W_OK ) == W_OK; /* Can Write */
+    rOK = ( Access & R_OK ) == R_OK; /* Can Read */
+    fOK = ( Access & F_OK ) == F_OK; /* File Exists */
+
+    pLogMsg ( klogDebug, "ACCESS(Fuse): [$(path)] MD[$(mode)] X[$(x)] W[$(w)] R[$(r)] F[$(f)]", "path=%s,mode=%d,x=%d,w=%d,r=%d,f=%d", ThePath, Access, xOK, wOK, rOK, fOK );
+
+    if ( ThePath == NULL ) {
+        return - 1;
+    }
+
+    if ( ! xOK && ! wOK && ! rOK && ! fOK ) {
+        return - 1;
+    }
+
+    RCt = _FUSE_get_path_and_node ( ThePath, NULL, & Node, & Type );
+    if ( RCt == 0 ) {
+            /* Check for fOK */
+        if ( Type == kxfsNotFound ) {
+            RCt = 1;
+        }
+        else {
+            if ( xOK || wOK || rOK ) {
+                RCt = XFSNodeAttrEditor ( Node, & Editor );
+                if ( RCt == 0 ) {
+                    RCt = XFSAttrEditorPermissions ( Editor, & Perm );
+                    if ( RCt == 0 ) {
+                        RCt = XFSPermMake ( Perm, & xPerm );
+                        if ( RCt == 0 ) {
+                            Auth = XFSPermAuth ( xPerm, kxfsUser );
+                            if ( Auth == NULL ) {
+                                RCt = 1;
+                            }
+                            else {
+                                if ( xOK ) {
+                                    RCt = ! XFSAuthCanExecute ( Auth );
+                                }
+                                if ( rOK && RCt == 0 ) {
+                                    RCt = ! XFSAuthCanRead ( Auth );
+                                }
+                                if ( wOK && RCt == 0 ) {
+                                    RCt = ! XFSAuthCanWrite ( Auth );
+                                }
+                            }
+
+                            XFSPermDispose ( xPerm );
+                        }
+                    }
+
+                    XFSEditorDispose ( & ( Editor -> Papahen ) );
+                }
+            }
+        }
+
+        XFSNodeRelease ( Node );
+    }
+
+    pLogMsg ( klogDebug, "ACCESS(Fuse,cont): [$(path)] RC[$(rc)]", "path=%s,rc=%d", ThePath, RCt );
+
+    return RCt == 0 ? 0 : - 1;
+}   /* XFS_FUSE_access() */
+
+#endif /* USE_XFS_FUSE_ACCESS == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_CREATE == 1
+
+static
+int
+XFS_FUSE_create (
+            const char * ThePath,
+            mode_t TheMode,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    rc_t RCt;
+    uint32_t Flags;
+    const struct XFSNode * Node;
+    const struct XFSDirEditor *Editor;
+    const struct XFSHandle * Handle;
+    char * Child;
+    XFSNMode Mode;
+
+    RCt = 0;
+    Node = NULL;
+    Editor = NULL;
+    Handle = NULL;
+    Child = NULL;
+    Mode = kxfsNone;
+
+    Flags = TheFileInfo -> flags;
+
+    pLogMsg ( klogDebug, "CREATE(Fuse): [$(path)] FI[$(info)] FL[$(flags)] MD[$(mode)]", "path=%s,info=%p,flags=%d,mode=%d", ThePath, TheFileInfo, Flags, TheMode );
+
+    if ( ThePath == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    if ( ( Flags & O_RDWR ) == O_RDWR ) {
+        Mode = kxfsReadWrite;
+    }
+    else {
+        if ( ( Flags & O_WRONLY ) == O_WRONLY ) {
+            Mode = kxfsWrite;
+        }
+        else {
+            Mode = kxfsRead;
+        }
+    }
+
+    RCt = _FUSE_get_parent_node ( ThePath, & Node, NULL, & Child );
+    if ( RCt == 0 ) {
+        RCt = XFSNodeDirEditor ( Node, & Editor );
+        if ( RCt == 0 ) {
+            RCt = XFSDirEditorCreate ( Editor, Child, Mode, & Handle );
+            if ( RCt != 0 ) {
+                XFSEditorDispose ( & ( Editor -> Papahen ) );
+                TheFileInfo -> fh = 0;
+            }
+            else {
+                TheFileInfo -> fh = ( uint64_t ) Handle;
+            }
+        }
+
+        XFSNodeRelease ( Node );
+        free ( Child );
+    }
+
+    pLogMsg ( klogDebug, "CREATE(Fuse,cont): [$(path)] FI[$(info)] FH[$(handle)] MD[$(mode)]", "path=%s,info=%p,handle=%p,mode=%d", ThePath, TheFileInfo, Handle, Mode );
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_create() */
+
+#endif /* USE_XFS_FUSE_CREATE == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_FTRUNCATE == 1
+
+static
+int
+XFS_FUSE_ftruncate (
+            const char * ThePath,
+            off_t TheSize,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    rc_t RCt;
+    const struct XFSHandle * Handle;
+    const struct XFSFileEditor * Editor;
+    const struct XFSNode * Node;
+
+    RCt = 0;
+    Editor = NULL;
+    Handle = TheFileInfo == NULL 
+                        ? NULL
+                        : ( const struct XFSHandle * ) TheFileInfo -> fh
+                        ;
+    Node = NULL;
+
+    pLogMsg ( klogDebug, "FTRUNCATE(Fuse): [$(path)] FI[$(info)] FH[$(hadle)] SZ[$(size)]", "path=%s,info=%p,handle=%p,size=%d", ThePath, TheFileInfo, Handle, TheSize );
+
+    if ( ThePath == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    if ( Handle != NULL ) {
+        Editor = ( const struct XFSFileEditor * )
+                                            XFSHandleGet ( Handle );
+    }
+    else {
+        RCt = _FUSE_get_path_and_node ( ThePath, NULL, & Node, NULL );
+        if ( RCt == 0 ) {
+            RCt = XFSNodeFileEditor ( Node, & Editor );
+
+            XFSNodeRelease ( Node );
+        }
+    }
+
+    if ( RCt == 0 && Editor != NULL ) {
+        RCt = XFSFileEditorSetSize ( Editor, TheSize );
+    }
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_ftruncate() */
+
+#endif /* USE_XFS_FUSE_FTRUNCATE == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_FGETATTR == 1
+
+static
+int
+XFS_FUSE_fgetattr (
+            const char * ThePath,
+            struct stat * TheStat,
+            struct fuse_file_info * TheFileInfo
+)
+{
+    rc_t RCt;
+    const struct XFSHandle * Handle;
+    const struct XFSNode * Node;
+    const struct XFSFileEditor * Editor;
+
+    RCt = 0;
+    Handle = TheFileInfo == NULL
+                        ? NULL
+                        : ( const struct XFSHandle * ) TheFileInfo -> fh
+                        ;
+    Node = NULL;
+    Editor = NULL;
+
+    pLogMsg ( klogDebug, "FGETATTR(Fuse): [$(path)] FI[$(info)] FH[$(hadle)]", "path=%s,info=%p,handle=%p", ThePath, TheFileInfo, Handle );
+
+    if ( ThePath == NULL || TheStat == NULL || TheFileInfo == NULL || Handle == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    memset ( TheStat, 0, sizeof ( struct stat ) );
+
+    Node = XFSHandleNode ( Handle );
+    if ( Node == NULL ) {
+        return EINVAL * - 1;
+    }
+
+    Editor = ( const struct XFSFileEditor * ) XFSHandleGet ( Handle );
+
+    RCt = _FUSE_stat_for_node ( Node, TheStat, Editor );
+
+    return XFS_FUSE_rc_to_errno ( RCt ) * - 1;
+}   /* XFS_FUSE_fgetattr () */
+
+#endif /* USE_XFS_FUSE_FGETATTR == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_LOCK == 1
+
+static
+int
+XFS_FUSE_lock (
+            const char * ThePath,
+            struct fuse_file_info * TheFileInfo,
+            int TheCmd,
+		    struct flock * TheFLock
+)
+{
+    pLogMsg ( klogDebug, "LOCK(!): [$(path)]", "path=%s", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_lock() */
+
+#endif /* USE_XFS_FUSE_LOCK == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_UTIMENS == 1
+
+static
+int
+XFS_FUSE_utimens (
+            const char * ThePath,
+            const struct timespec TheTimespec[2]
+)
+{
+    pLogMsg ( klogDebug, "UTIMENS(!): [$(path)]", "path=%s", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_utimens() */
+
+#endif /* USE_XFS_FUSE_UTIMENS == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_BMAP == 1
+
+static
+int
+XFS_FUSE_bmap (
+            const char * ThePath,
+            size_t TheBlockSize,
+            uint64_t *TheIdx
+)
+{
+    pLogMsg ( klogDebug, "BMAP(!): [$(path)]", "path=%s", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_bmap() */
+
+#endif /* USE_XFS_FUSE_BMAP == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_IOCTL == 1
+
+static
+int
+XFS_FUSE_ioctl (
+            const char * ThePath,
+            int TheCmd,
+            void *TheArg,
+            struct fuse_file_info * TheFileInfo,
+            unsigned int TheFlags,
+            void * TheData
+)
+{
+    pLogMsg ( klogDebug, "IOCTL(!): [$(path)]", "path=%s", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_ioctl() */
+
+#endif /* USE_XFS_FUSE_IOCTL == 1 */
+
+/*****************************************************/
+#if USE_XFS_FUSE_POLL == 1
+
+static
+int
+XFS_FUSE_poll (
+            const char * ThePath,
+            struct fuse_file_info * TheFileInfo,
+            struct fuse_pollhandle * ThePollHandle,
+            unsigned * TheReventsp
+)
+{
+    pLogMsg ( klogDebug, "POLL(*): [$(path)]", "path=%s", ThePath );
+
+    return -EPERM;
+}   /* XFS_FUSE_poll() */
+
+#endif /* USE_XFS_FUSE_POLL == 1 */
+
+/*  Very important method, but very stupid.
+ */
+rc_t
+XFS_Private_InitOperations ( struct fuse_operations * Operations )
+{
+    XFS_CAN ( Operations )
+
+    memset ( Operations, 0, sizeof( struct fuse_operations ) );
+
+#if USE_XFS_FUSE_GETATTR == 1
+    Operations -> getattr = XFS_FUSE_getattr;
+#endif /* USE_XFS_FUSE_GETATTR == 1 */
+
+#if USE_XFS_FUSE_READLINK == 1
+    Operations -> readlink = XFS_FUSE_readlink;
+#endif /* USE_XFS_FUSE_READLINK == 1 */
+
+#if USE_XFS_FUSE_GETDIR == 1
+    Operations -> getdir = XFS_FUSE_getdir;
+#endif /* USE_XFS_FUSE_GETDIR == 1 */
+
+#if USE_XFS_FUSE_MKNOD == 1
+    Operations -> mknod = XFS_FUSE_mknod;
+#endif /* USE_XFS_FUSE_MKNOD == 1 */
+
+#if USE_XFS_FUSE_MKDIR == 1
+    Operations -> mkdir = XFS_FUSE_mkdir;
+#endif /* USE_XFS_FUSE_MKDIR == 1 */
+
+#if USE_XFS_FUSE_UNLINK == 1
+    Operations -> unlink = XFS_FUSE_unlink;
+#endif /* USE_XFS_FUSE_UNLINK == 1 */
+
+#if USE_XFS_FUSE_RMDIR == 1
+    Operations -> rmdir = XFS_FUSE_rmdir;
+#endif /* USE_XFS_FUSE_RMDIR == 1 */
+
+#if USE_XFS_FUSE_SYMLINK == 1
+    Operations -> symlink = XFS_FUSE_symlink;
+#endif /* USE_XFS_FUSE_SYMLINK == 1 */
+
+#if USE_XFS_FUSE_RENAME == 1
+    Operations -> rename = XFS_FUSE_rename;
+#endif /* USE_XFS_FUSE_RENAME == 1 */
+
+#if USE_XFS_FUSE_LINK == 1
+    Operations -> link = XFS_FUSE_link;
+#endif /* USE_XFS_FUSE_LINK == 1 */
+
+#if USE_XFS_FUSE_CHMOD == 1
+    Operations -> chmod = XFS_FUSE_chmod;
+#endif /* USE_XFS_FUSE_CHMOD == 1 */
+
+#if USE_XFS_FUSE_CHOWN == 1
+    Operations -> chown = XFS_FUSE_chown;
+#endif /* USE_XFS_FUSE_CHOWN == 1 */
+
+#if USE_XFS_FUSE_TRUNCATE == 1
+    Operations -> truncate = XFS_FUSE_truncate;
+#endif /* USE_XFS_FUSE_TRUNCATE == 1 */
+
+#if USE_XFS_FUSE_UTIME == 1
+    Operations -> utime = XFS_FUSE_utime;
+#endif /* USE_XFS_FUSE_UTIME == 1 */
+
+#if USE_XFS_FUSE_OPEN == 1
+    Operations -> open = XFS_FUSE_open;
+#endif /* USE_XFS_FUSE_OPEN == 1 */
+
+#if USE_XFS_FUSE_READ == 1
+    Operations -> read = XFS_FUSE_read;
+#endif /* USE_XFS_FUSE_READ == 1 */
+
+#if USE_XFS_FUSE_WRITE == 1
+    Operations -> write = XFS_FUSE_write;
+#endif /* USE_XFS_FUSE_WRITE == 1 */
+
+#if USE_XFS_FUSE_STATFS == 1
+    Operations -> statfs = XFS_FUSE_statfs;
+#endif /* USE_XFS_FUSE_STATFS == 1 */
+
+#if USE_XFS_FUSE_FLUSH == 1
+    Operations -> flush = XFS_FUSE_flush;
+#endif /* USE_XFS_FUSE_FLUSH == 1 */
+
+#if USE_XFS_FUSE_RELEASE == 1
+    Operations -> release = XFS_FUSE_release;
+#endif /* USE_XFS_FUSE_RELEASE == 1 */
+
+#if USE_XFS_FUSE_FSYNC == 1
+    Operations -> fsync = XFS_FUSE_fsync;
+#endif /* USE_XFS_FUSE_FSYNC == 1 */
+
+#if USE_XFS_FUSE_SETXATTR == 1
+    Operations -> setxattr = XFS_FUSE_setxattr;
+#endif /* USE_XFS_FUSE_SETXATTR == 1 */
+
+#if USE_XFS_FUSE_GETXATTR == 1
+    Operations -> getxattr = XFS_FUSE_getxattr;
+#endif /* USE_XFS_FUSE_GETXATTR == 1 */
+
+#if USE_XFS_FUSE_LISTXATTR == 1
+    Operations -> listxattr = XFS_FUSE_listxattr;
+#endif /* USE_XFS_FUSE_LISTXATTR == 1 */
+
+#if USE_XFS_FUSE_REMOVEXATTR == 1
+    Operations -> removexattr = XFS_FUSE_removexattr;
+#endif /* USE_XFS_FUSE_REMOVEXATTR == 1 */
+
+#if USE_XFS_FUSE_OPENDIR == 1
+    Operations -> opendir = XFS_FUSE_opendir;
+#endif /* USE_XFS_FUSE_OPENDIR == 1 */
+
+#if USE_XFS_FUSE_READDIR == 1
+    Operations -> readdir = XFS_FUSE_readdir;
+#endif /* USE_XFS_FUSE_READDIR == 1 */
+
+#if USE_XFS_FUSE_RELEASEDIR == 1
+    Operations -> releasedir = XFS_FUSE_releasedir;
+#endif /* USE_XFS_FUSE_RELESEDIR == 1 */
+
+#if USE_XFS_FUSE_FSYNCDIR == 1
+    Operations -> fsyncdir = XFS_FUSE_fsyncdir;
+#endif /* USE_XFS_FUSE_FSYNCDIR == 1 */
+
+#if USE_XFS_FUSE_INIT == 1
+    Operations -> init = XFS_FUSE_init;
+#endif /* USE_XFS_FUSE_INIT == 1 */
+
+#if USE_XFS_FUSE_DESTROY == 1
+    Operations -> destroy = XFS_FUSE_destroy;
+#endif /* USE_XFS_FUSE_DESTROY == 1 */
+
+#if USE_XFS_FUSE_ACCESS == 1
+    Operations -> access = XFS_FUSE_access;
+#endif /* USE_XFS_FUSE_ACCESS == 1 */
+
+#if USE_XFS_FUSE_CREATE == 1
+    Operations -> create = XFS_FUSE_create;
+#endif /* USE_XFS_FUSE_CREATE == 1 */
+
+#if USE_XFS_FUSE_FTRUNCATE == 1
+    Operations -> ftruncate = XFS_FUSE_ftruncate;
+#endif /* USE_XFS_FUSE_FTRUNCATE == 1 */
+
+#if USE_XFS_FUSE_FGETATTR == 1
+    Operations -> fgetattr = XFS_FUSE_fgetattr;
+#endif /* USE_XFS_FUSE_FGETATTR == 1 */
+
+#if USE_XFS_FUSE_LOCK == 1
+    Operations -> lock = XFS_FUSE_lock;
+#endif /* USE_XFS_FUSE_LOCK == 1 */
+
+#if USE_XFS_FUSE_UTIMENS == 1
+    Operations -> utimens = XFS_FUSE_utimens;
+#endif /* USE_XFS_FUSE_UTIMENS == 1 */
+
+#if USE_XFS_FUSE_BMAP == 1
+    Operations -> bmap = XFS_FUSE_bmap;
+#endif /* USE_XFS_FUSE_BMAP == 1 */
+
+#if USE_XFS_FUSE_IOCTL == 1
+    Operations -> ioctl = XFS_FUSE_ioctl;
+#endif /* USE_XFS_FUSE_IOCTL == 1 */
+
+#if USE_XFS_FUSE_POLL == 1
+    Operations -> poll = XFS_FUSE_poll;
+#endif /* USE_XFS_FUSE_POLL == 1 */
+
+    return 0;
+}   /* XFS_Private_InitOperations() */
diff --git a/libs/xfs/unix/operations.h b/libs/xfs/unix/operations.h
new file mode 100644
index 0000000..d909c08
--- /dev/null
+++ b/libs/xfs/unix/operations.h
@@ -0,0 +1,54 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_xfs_native_peer_operations_
+#define _h_xfs_native_peer_operations_
+
+#include <klib/rc.h>
+
+    /*  We are still working under the version 2.5 because there is
+        port on MAC for that
+     */
+/*  Different fuse_mount implementation
+#define FUSE_USE_VERSION 25
+ */
+
+#define FUSE_USE_VERSION 26
+#include <fuse.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+    /*  Here we are going to fill that evis structure
+     */
+rc_t XFS_Private_InitOperations ( struct fuse_operations * Ops );
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _h_xfs_native_peer_operations_ */
diff --git a/libs/xfs/unix/platform.c b/libs/xfs/unix/platform.c
new file mode 100644
index 0000000..facb2f2
--- /dev/null
+++ b/libs/xfs/unix/platform.c
@@ -0,0 +1,359 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <kproc/thread.h>
+
+#include <xfs/xfs.h>
+#include <xfs/tree.h>
+#include <xfs/xlog.h>
+#include "xfs-priv.h"
+#include "schwarzschraube.h"
+
+#include <stdlib.h>     /* using malloc() */
+#include <string.h>     /* using memset() */
+#include <unistd.h>     /* using STDOUT_FILENO, STDERR_FILENO */
+
+/*  Some platform dependent headers
+ */
+
+#include "operations.h"
+
+#ifndef STDIN_FILENO
+#define STDIN_FILENO    0   /* Standard input.  */
+#define STDOUT_FILENO   1   /* Standard output.  */
+#define STDERR_FILENO   2   /* Standard error output.  */
+#endif /* STDIN_FILENO */
+
+/*
+ *  Virtuhai table and it's methods
+ */
+static rc_t XFS_FUSE_init_v1 ( struct XFSControl * self );
+static rc_t XFS_FUSE_destroy_v1 ( struct XFSControl * self );
+static rc_t XFS_FUSE_mount_v1 ( struct XFSControl * self );
+static rc_t XFS_FUSE_loop_v1 ( struct XFSControl * self );
+static rc_t XFS_FUSE_unmount_v1 ( struct XFSControl * self);
+
+static struct XFSControl_vt_v1 XFSControl_VT_V1 = {
+    1,
+    1,
+    XFS_FUSE_init_v1,
+    XFS_FUSE_destroy_v1,
+    XFS_FUSE_mount_v1,
+    XFS_FUSE_loop_v1,
+    XFS_FUSE_unmount_v1
+};
+
+static struct fuse_operations TheFuseOperations;
+
+/*  Control init.
+ */
+LIB_EXPORT
+rc_t CC
+XFSControlPlatformInit ( struct XFSControl * self )
+{
+    XFS_CAN ( self )
+
+    self -> vt = ( union XFSControl_vt * ) & XFSControl_VT_V1;
+
+    return 0;
+}   /* XFSControlPlatformInit () */
+
+/*  Overloadable versions
+ */
+rc_t
+XFS_FUSE_init_v1 ( struct XFSControl * self )
+{
+    rc_t RCt = 0;
+
+    XFS_CAN ( self )
+
+    LogMsg ( klogDebug, "XFS_FUSE_init()\n" );
+
+    if ( self -> Control != NULL ) {
+
+        return XFS_RC ( rcUnexpected );
+    }
+
+    if ( self -> Arguments == NULL ) {
+        LogErr ( klogErr, XFS_RC ( rcUnexpected ), "XFS_FUSE_init(): arguments are empty" );
+        return XFS_RC ( rcUnexpected );
+    }
+
+    return RCt;
+}   /* XFS_FUSE_init_v1 () */
+
+rc_t
+XFS_FUSE_destroy_v1 ( struct XFSControl * self )
+{
+    LogMsg ( klogDebug, "XFS_FUSE_destroy()\n" );
+
+    XFS_CAN ( self )
+
+    return 0;
+}   /* XFS_FUSE_destroy_v1 () */
+
+rc_t
+XFS_FUSE_mount_v1 ( struct XFSControl * self )
+{
+    rc_t RCt;
+
+    struct fuse_args FuseArgs;
+    struct fuse_chan * FuseChannel;
+    struct fuse * FuseStruct;
+    char * MountPoint;
+    const char * LogPath;
+    const char * Label;
+    int Foreground;
+    int Multithreaded;
+    int Result;
+
+    RCt = 0;
+    FuseChannel = NULL;
+    FuseStruct = NULL;
+    MountPoint = NULL;
+    LogPath = NULL;
+    Label = NULL;
+    Foreground = true;
+    Multithreaded = true;
+    Result = 0;
+
+    LogMsg ( klogDebug, "XFS_FUSE_mount()\n" );
+
+    XFS_CAN ( self )
+
+    RCt = XFS_Private_InitOperations ( & TheFuseOperations );
+    if ( RCt != 0 ) {
+        LogErr ( klogErr, XFS_RC ( rcFailed ), "Can not initialize operations" );
+        return XFS_RC ( rcFailed ); 
+    }
+
+    memset ( & FuseArgs, 0, sizeof FuseArgs );
+    Label = XFSControlGetLabel ( self );
+    Result = fuse_opt_add_arg ( & FuseArgs, Label == NULL ? "FUSE" : Label );
+    Result = fuse_opt_add_arg ( & FuseArgs, XFSControlGetMountPoint ( self ) );
+    LogPath = XFSControlGetLogFile ( self );
+
+        /* Foreground */
+    if ( ! XFSControlIsDaemonize ( self ) ) {
+        Result = fuse_opt_add_arg ( & FuseArgs, "-f" );
+    }
+
+#if ! MAC
+/* Options MAC does not know about */
+    Result = fuse_opt_add_arg ( & FuseArgs, "-o" );
+    Result = fuse_opt_add_arg( & FuseArgs, "big_writes" );
+#endif /* MAC */
+
+    if ( Result != 0 ) {
+        LogErr ( klogErr, XFS_RC ( rcFailed ), "Can not mount" );
+        return XFS_RC ( rcFailed ); 
+    }
+
+        /*  Adding the mountpoint
+         */
+    Result = fuse_parse_cmdline (
+                    & FuseArgs,
+                    & MountPoint,
+                    & Multithreaded,
+                    & Foreground
+                );
+    if ( Result != 0 ) {
+        LogErr ( klogErr, XFS_RC ( rcFailed ), "Can not parse arguments" );
+        return XFS_RC ( rcFailed ); 
+    }
+
+pLogMsg ( klogDebug, "MNT[$(mount)] MT[$(multi)] FG[$(fore)]", "mount=%s,multi=%d,fore=%d", MountPoint, Multithreaded, Foreground );
+
+
+    FuseChannel = fuse_mount ( MountPoint, & FuseArgs );
+    if ( FuseChannel == NULL ) {
+        fuse_opt_free_args ( & FuseArgs );
+
+        LogErr ( klogErr, XFS_RC ( rcFailed ), "Can not mount" );
+        return XFS_RC ( rcFailed ); 
+    }
+    self -> ControlAux = FuseChannel;
+
+        /*  Note passing TreeDepot as private data to fuse_context
+         */
+    FuseStruct = fuse_new (
+                        FuseChannel,
+                        & FuseArgs,
+                        & TheFuseOperations,
+                        sizeof ( struct fuse_operations ),
+                        self -> TreeDepot
+                    );
+    if ( FuseStruct == NULL ) {
+        fuse_unmount ( MountPoint, FuseChannel );
+
+        fuse_opt_free_args ( & FuseArgs );
+
+        LogErr ( klogErr, XFS_RC ( rcFailed ), "Can not fuse_new" );
+        return XFS_RC ( rcFailed ); 
+    }
+    self -> Control = FuseStruct;
+
+    Result = fuse_daemonize ( Foreground );
+    if ( Result == -1 ) {
+        fuse_unmount ( MountPoint, FuseChannel );
+
+        fuse_opt_free_args ( & FuseArgs );
+
+        LogErr ( klogErr, XFS_RC ( rcFailed ), "Can not daemonize" );
+        return XFS_RC ( rcFailed ); 
+    }
+
+        /*  Here we are setting the log file
+         */
+    if ( LogPath != NULL ) {
+        RCt = XFSLogInit ( LogPath );
+        if ( RCt != 0 ) {
+            fuse_unmount ( MountPoint, FuseChannel );
+
+            fuse_opt_free_args ( & FuseArgs );
+
+            LogErr ( klogErr, XFS_RC ( rcFailed ), "Can not set log file" );
+            return RCt;
+        }
+    }
+
+    Result = fuse_set_signal_handlers ( fuse_get_session ( FuseStruct ) );
+    if ( Result == -1 ) {
+        fuse_unmount ( MountPoint, FuseChannel );
+
+        fuse_opt_free_args ( & FuseArgs );
+
+        LogErr ( klogErr, XFS_RC ( rcFailed ), "Can not set signal handlers" );
+        return XFS_RC ( rcFailed ); 
+    }
+
+/*
+    if ( Multithreaded != 0 ) {
+        Result = fuse_loop_mt ( FuseStruct );
+    }
+    else {
+        Result = fuse_loop ( FuseStruct );
+    }
+
+    fuse_remove_signal_handlers ( fuse_get_session ( FuseStruct ) );
+*/
+
+
+    fuse_opt_free_args ( & FuseArgs );
+
+    pLogMsg ( klogDebug, " [XFS_FUSE_mount_v1] [$(line)] [$(rc)]", "line=%d,rc=%d", __LINE__, Result );
+
+
+    return Result == 0 ? 0 : XFS_RC ( rcInvalid );
+}   /* XFS_FUSE_mount_v1 () */
+
+rc_t
+XFS_FUSE_loop_v1( struct XFSControl * self )
+{
+    rc_t RCt;
+    struct fuse * FuseStruct;
+    int Result;
+
+    RCt = 0;
+    FuseStruct = NULL;
+    Result = 0;
+
+    LogMsg ( klogDebug, "XFS_FUSE_loop()" );
+
+    if ( self == NULL ) {
+        LogErr ( klogErr, XFS_RC ( rcInvalid ), "XFS_FUSE_loop(): empty control passed" );
+        RCt = 1;
+    }
+    else {
+        FuseStruct = (struct fuse * ) self -> Control;
+
+        Result = fuse_loop_mt ( FuseStruct );
+
+        RCt = Result == 0 ? 0 : 1;
+    }
+
+    return RCt;
+}   /* XFS_FUSE_loop_v1 () */
+
+rc_t
+XFS_FUSE_unmount_v1 ( struct XFSControl * self )
+{
+    struct fuse * FuseStruct = NULL;
+
+    FuseStruct = (struct fuse * ) self -> Control;
+
+    LogMsg ( klogDebug, "XFS_FUSE_unmount()" );
+
+    if ( self -> Control != NULL ) {
+
+#if ! MAC
+        fuse_exit ( FuseStruct );
+#endif /* MAC */
+
+LogMsg ( klogDebug, "|o|fuse_unmount()" );
+        fuse_unmount (
+                    XFSControlGetMountPoint ( self ),
+                    self -> ControlAux
+                    );
+
+LogMsg ( klogDebug, "|o|fuse_remove_signal_handlers()" );
+        fuse_remove_signal_handlers ( fuse_get_session ( FuseStruct ) );
+
+LogMsg ( klogDebug, "|o|fuse_destroy()" );
+        fuse_destroy ( FuseStruct );
+
+        self -> Control = NULL;
+        self -> ControlAux = NULL;
+
+LogMsg ( klogDebug, "|o|exiting fuse()" );
+
+        XFSLogDestroy ( );
+    }
+    else {
+        LogErr ( klogErr, XFS_RC ( rcNull ), "XFS_FUSE_unmount(): empty control passed" );
+    }
+
+    return 0;
+}   /* XFS_FUSE_unmount_v1 () */
+
+/*))    Special platform dependent method
+ ((*/
+void fuse_unmount_compat22(const char *mountpoint);
+
+LIB_EXPORT
+rc_t CC
+XFSUnmountAndDestroy ( const char * MountPoint )
+{
+        /*  Unfortunately, that method is standard, but returns nothing
+         *  So no error could be detected
+         */
+    fuse_unmount_compat22 ( MountPoint );
+    return 0;
+}   /* XFSUnmountAndDestroy () */
diff --git a/libs/xfs/unix/security.c b/libs/xfs/unix/security.c
new file mode 100644
index 0000000..0307413
--- /dev/null
+++ b/libs/xfs/unix/security.c
@@ -0,0 +1,24 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+===========================================================================*/
+
diff --git a/libs/xfs/xencro.c b/libs/xfs/xencro.c
new file mode 100644
index 0000000..180ff46
--- /dev/null
+++ b/libs/xfs/xencro.c
@@ -0,0 +1,944 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/container.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <kproc/lock.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+
+#include <xfs/path.h>
+
+#include "schwarzschraube.h"
+#include "xencro.h"
+#include "zehr.h"
+#include "lockdpt.h"
+
+#include <sysalloc.h>
+
+#include <ctype.h>
+#include <time.h>
+
+/*||*\
+  || Lyrics:
+  || That file contains interface to Encoded files based on 'krypto.
+  || package. Very experimental, cuz I do not really know what to do
+  || here.
+\*||*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)) XFSEncEntry and XFSEndKey and _EncDpt ( EncDepot ) structs are
+ ||  living here
+((*/
+
+/*))
+ //  EntryDepot this is responsible for sharing Enc resources
+ \\  Not sure if we need to collect keys tho
+ //
+((*/
+struct _EncDpt {
+    BSTree tree;
+
+    KLock * mutabor;
+};
+
+/*)) 
+ //  Just a path to file
+((*/
+struct XFSEncEntry {
+    BSTNode node;
+
+    KRefcount refcount;
+    KLock * mutabor;
+
+    const char * path;
+
+    struct KKey key;        /* Key for decription */
+
+    uint64_t size;          /* File size and time, I need to cache */
+    KTime_t time;           /* to avoid frequent file opening */
+
+    XFSStatus status;
+
+    const struct KFile * file;
+};
+
+static const char * _sXFSEncEntry_classname = "XFSEncEntry";
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _EncDpt Methods ...                                               */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static struct _EncDpt * _sEncDpt = NULL;
+
+static
+struct _EncDpt * CC
+_Dpt ()
+{
+    return _sEncDpt;
+}   /* _Dpt () */
+
+static
+void CC
+_EncDptWhackCallback ( BSTNode * Node, void * unused )
+{
+    if ( Node != NULL ) {
+        XFSEncEntryDispose ( ( const struct XFSEncEntry * ) Node );
+    }
+}   /* _EncDptWhackCallback () */
+
+static
+rc_t CC
+_EncDptDisposeImpl ( struct _EncDpt * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self != NULL ) { 
+        BSTreeWhack (
+                    & ( self -> tree ),
+                    _EncDptWhackCallback,
+                    NULL
+                    );
+
+        if ( self -> mutabor != NULL ) {
+            KLockRelease ( self -> mutabor );
+            self -> mutabor = NULL;
+        }
+
+        free ( self );
+    }
+
+    return RCt;
+}   /* _EncDptDisposeImpl () */
+
+LIB_EXPORT
+rc_t CC
+XFSEncDepotDispose ()
+{
+    struct _EncDpt * EncDpt;
+
+    EncDpt = _sEncDpt;
+    _sEncDpt = NULL;
+
+    if ( EncDpt != NULL ) {
+        _EncDptDisposeImpl ( EncDpt );
+    }
+
+    return 0;
+}   /* XFSEncDepotDispose () */
+
+static
+rc_t CC
+_EncDptMakeImpl ( struct _EncDpt ** EncDpt )
+{
+    rc_t RCt;
+    struct _EncDpt * TheD;
+
+    RCt = 0;
+    TheD = NULL;
+
+    if ( EncDpt != NULL ) {
+        * EncDpt = NULL;
+    }
+
+    if ( EncDpt == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    TheD = calloc ( 1, sizeof ( struct _EncDpt ) );
+    if ( TheD == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = KLockMake ( & ( TheD -> mutabor ) );
+    if ( RCt == 0 ) {
+        BSTreeInit ( & ( TheD -> tree ) );
+
+        * EncDpt = TheD;
+    }
+
+    if ( RCt != 0 ) {
+        * EncDpt = NULL;
+        _EncDptDisposeImpl ( TheD );
+    }
+
+    return RCt;
+}   /* _EncDptMakeImpl () */
+
+LIB_EXPORT
+rc_t CC
+XFSEncDepotInit ()
+{
+    rc_t RCt;
+    struct _EncDpt * EncDpt;
+
+    RCt = 0;
+    EncDpt = NULL;
+
+    if ( _sEncDpt == NULL ) {
+
+        RCt = _EncDptMakeImpl ( & EncDpt );
+        if ( RCt == 0 ) {
+            if ( _sEncDpt == NULL ) {
+                _sEncDpt = EncDpt;
+            }
+            else {
+                _EncDptDisposeImpl ( EncDpt );
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFSEncDepotInit () */
+
+static
+int64_t CC
+_EncCmpCallback ( const void * Item, const BSTNode * Node )
+{
+    const char * Str1, * Str2;
+
+    Str1 = ( const char * ) Item;
+
+    Str2 = Node == NULL
+                ? NULL
+                : ( ( struct XFSEncEntry * ) Node ) -> path
+                ;
+    return XFS_StringCompare4BST_ZHR ( Str1, Str2 );
+}   /* _EncCmpCallback () */
+
+static
+rc_t CC
+_EncDptGetNoLock (
+                struct _EncDpt * self,
+                const char * Path,
+                const struct XFSEncEntry ** EncEntry
+)
+{
+    const struct XFSEncEntry * RetVal = NULL;
+
+    if ( EncEntry != NULL ) {
+        * EncEntry = NULL;
+    }
+
+    if ( self == NULL || Path == NULL || EncEntry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RetVal = ( const struct XFSEncEntry * ) BSTreeFind (
+                                                & ( self -> tree ),
+                                                Path,
+                                                _EncCmpCallback
+                                                );
+
+
+    * EncEntry = RetVal;
+
+    return RetVal == NULL ? XFS_RC ( rcNotFound ) : 0;
+}   /* _EncDptGetNoLock () */
+
+static
+int64_t CC
+_EncAddCallback ( const BSTNode * N1, const BSTNode * N2 )
+{
+    return XFS_StringCompare4BST_ZHR (
+            ( ( struct XFSEncEntry * ) N1 ) -> path,
+            ( ( struct XFSEncEntry * ) N2 ) -> path
+            );
+}   /* _EncAddCallback () */
+
+static
+rc_t CC
+_EncDptAddNoLock (
+                struct _EncDpt * self,
+                const struct XFSEncEntry * EncEntry
+)
+{
+    rc_t RCt = 0;
+
+    if ( self == NULL || EncEntry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = BSTreeInsert (
+                    & ( self -> tree ),
+                    ( struct BSTNode * ) & ( EncEntry -> node ),
+                    _EncAddCallback
+                    );
+
+    return RCt;
+}   /* _EncDptAddNoLock () */
+
+static
+rc_t CC
+_EncDptDelNoLock (
+            struct _EncDpt * self,
+            const struct XFSEncEntry * EncEntry
+)
+{
+    if ( self == NULL || EncEntry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    BSTreeUnlink (
+                & ( self -> tree ),
+                ( struct BSTNode * ) & ( EncEntry -> node )
+                );
+    XFSEncEntryDispose ( EncEntry );
+
+    return 0;
+}   /* _EncDptDelNoLock () */
+
+static
+rc_t CC
+_EncDptClearNoLock ( struct _EncDpt * self )
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    BSTreeWhack ( & ( self -> tree ), _EncDptWhackCallback, NULL );
+    BSTreeInit ( & ( self -> tree ) );
+
+    return 0;
+}   /* _EncDptClearNoLock () */
+
+LIB_EXPORT
+rc_t CC
+XFSEncDepotClear ()
+{
+    rc_t RCt;
+    struct _EncDpt * D;
+
+    RCt = 0;
+    D = _Dpt ();
+
+    if ( D == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( D -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _EncDptClearNoLock ( D );
+
+        KLockUnlock ( D -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSEncDepotClear () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSEncEntry Methods ...                                           */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+static
+rc_t CC
+_EncEntryMake (
+            const char * Path,
+            const char * Passwd,
+            const char * EncodeType,
+            const struct XFSEncEntry ** EncEntry
+)
+{
+    rc_t RCt;
+    struct XFSEncEntry * TheEntry;
+
+    RCt = 0;
+    TheEntry = NULL;
+
+    XFS_CSAN ( EncEntry )
+
+    XFS_CAN ( Path )
+    XFS_CAN ( Passwd )
+    XFS_CAN ( EncEntry )
+
+    TheEntry = calloc ( 1, sizeof ( struct XFSEncEntry ) );
+    if ( TheEntry == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    TheEntry -> status = kxfsInvalid;
+
+    RCt = XFS_InitKKey_ZHR (
+                        Passwd,
+                        EncodeType,
+                        & ( TheEntry -> key )
+                        );
+    if ( RCt == 0 ) {
+        RCt = KLockMake ( & ( TheEntry -> mutabor ) );
+        if ( RCt == 0 ) {
+            KRefcountInit (
+                        & ( TheEntry -> refcount ),
+                        1,
+                        _sXFSEncEntry_classname,
+                        "EncEntryMake",
+                        "EncEntry"
+                        );
+
+            RCt = XFS_StrDup ( Path, & ( TheEntry -> path ) );
+            if ( RCt == 0 ) {
+                TheEntry -> status = kxfsReady;
+
+                * EncEntry = TheEntry;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * EncEntry = NULL;
+
+        if ( TheEntry != NULL ) {
+            XFSEncEntryDispose ( TheEntry );
+        }
+    }
+
+    return RCt;
+}   /* _EncEntryMake () */
+
+static
+rc_t CC
+_EncDptFindOrCreateNoLock (
+                struct _EncDpt * self,
+                const char * Path,
+                const char * Passwd,
+                const char * EncodeType,
+                const struct XFSEncEntry ** EncEntry
+)
+{
+    rc_t RCt;
+    const struct XFSEncEntry * Entry;
+
+    RCt = 0;
+
+    XFS_CSAN ( EncEntry )
+
+    XFS_CAN ( Path )
+    XFS_CAN ( Passwd )
+    XFS_CAN ( EncEntry )
+
+    RCt = _EncDptGetNoLock ( self, Path, & Entry );
+    if ( RCt == 0 ) {
+        RCt = XFSEncEntryAddRef ( Entry );
+    }
+    else {
+        RCt = _EncEntryMake ( Path, Passwd, EncodeType, & Entry );
+        if ( RCt == 0 ) {
+            RCt = _EncDptAddNoLock ( self, Entry );
+        }
+    }
+
+    if ( RCt == 0 ) {
+        * EncEntry = Entry;
+    }
+    else {
+        * EncEntry = NULL;
+
+        if ( Entry != NULL ) {
+            _EncDptDelNoLock ( self, Entry );
+        }
+    }
+
+    return RCt;
+}   /* _EncDptFindOrCreateNoLock () */
+
+LIB_EXPORT
+rc_t CC
+XFSEncEntryFindOrCreate (
+                const char * Path,
+                const char * Passwd,
+                const char * EncodeType,
+                const struct XFSEncEntry ** EncEntry
+)
+{
+    rc_t RCt;
+    const struct XFSEncEntry * TheEntry;
+    struct _EncDpt * Dpt;
+
+    RCt = 0;
+    TheEntry = NULL;
+    Dpt = _Dpt ();
+
+    XFS_CAN ( Dpt )
+
+    XFS_CSAN ( EncEntry )
+
+    RCt = KLockAcquire ( Dpt -> mutabor );
+    if ( RCt == 0 ) {
+
+        RCt = _EncDptFindOrCreateNoLock (
+                                        Dpt,
+                                        Path,
+                                        Passwd,
+                                        EncodeType,
+                                        & TheEntry
+                                        );
+        if ( RCt == 0 ) {
+            /* Here add to ... */
+
+            * EncEntry = TheEntry;
+        }
+
+        KLockUnlock ( Dpt -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSEncEntryFindOrCreate () */
+
+LIB_EXPORT
+rc_t CC
+XFSEncEntryDispose (
+    const struct XFSEncEntry * self
+)
+{
+    struct XFSEncEntry * Entry = ( struct XFSEncEntry * ) self;
+
+    if ( Entry == NULL ) {
+        return 0;
+    }
+
+    if ( XFSEncEntryIsOpen ( Entry ) ) {
+        XFSEncEntryClose ( Entry );
+    }
+
+    Entry -> status = kxfsInvalid;
+
+    if ( Entry -> file != NULL ) {
+        KFileRelease ( Entry -> file );
+
+        Entry -> file = NULL;
+    }
+
+    if ( Entry -> path != NULL ) {
+        free ( ( char * ) Entry -> path );
+
+        Entry -> path = NULL;
+    }
+
+    if ( Entry -> mutabor != NULL ) {
+        KLockRelease ( Entry -> mutabor );
+
+        Entry -> mutabor = NULL;
+    }
+
+    Entry -> size = 0;
+    Entry -> time = 0;
+    ( Entry -> key ) . type = kkeyTypeCount;
+
+    KRefcountWhack ( & ( Entry -> refcount ), _sXFSEncEntry_classname );
+
+    free ( Entry );
+
+    return 0;
+}   /* XFSEncEntryDispose () */
+
+
+LIB_EXPORT
+rc_t CC
+XFSEncEntryAddRef ( const struct XFSEncEntry * self )
+{
+    rc_t RCt;
+    struct XFSEncEntry * EncEntry;
+
+    RCt = 0;
+    EncEntry = ( struct XFSEncEntry * ) self;
+
+    if ( EncEntry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    switch ( KRefcountAdd ( & ( EncEntry -> refcount ), _sXFSEncEntry_classname ) ) {
+        case krefOkay :
+                    RCt = 0;
+                    break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSEncEntryAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSEncEntryRelease ( const struct XFSEncEntry * self )
+{
+    rc_t RCt;
+    struct XFSEncEntry * EncEntry;
+
+    RCt = 0;
+    EncEntry = ( struct XFSEncEntry * ) self;
+
+    if ( EncEntry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    switch ( KRefcountDrop ( & ( EncEntry -> refcount ), _sXFSEncEntry_classname ) ) {
+
+        case krefOkay :
+        case krefZero :
+                    RCt = 0;
+                    break;
+        case krefWhack :
+                    RCt = XFSEncEntryClose (
+                                    ( struct XFSEncEntry * ) EncEntry
+                                    );
+                    break;
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSEncEntryRelease () */
+
+static
+rc_t CC
+_OpenEncFileNoLock ( const struct XFSEncEntry * self )
+{
+    rc_t RCt;
+    struct XFSEncEntry * Entry;
+    struct KDirectory * NatD;
+    const struct KFile * File, * EncFile;
+    uint32_t PathType;
+
+    RCt = 0;
+    Entry = ( struct XFSEncEntry * ) self;
+    NatD = NULL;
+    File = EncFile = NULL;
+    PathType = kptNotFound;
+
+    XFS_CAN ( Entry )
+
+        /*  First we should check that entry is valid, or it's state
+         *  is Ready or Complete
+         */
+    if ( Entry -> status != kxfsReady
+        && Entry -> status != kxfsComplete ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+        /*  Second it is not open already
+         */
+    if ( Entry -> file != NULL ) {
+        return 0;
+    }
+
+    RCt = KDirectoryNativeDir ( & NatD );
+    if ( RCt == 0 ) {
+            /*  Third if it does exist and it is a FILE
+             */
+        PathType = KDirectoryPathType ( NatD, Entry -> path );
+        if ( PathType == kptFile ) {
+            RCt = KDirectoryOpenFileRead (
+                                        NatD,
+                                        & File,
+                                        Entry -> path
+                                        );
+            if ( RCt == 0 ) {
+                RCt = KEncFileMakeRead (
+                                        & EncFile,
+                                        File,
+                                        & Entry -> key
+                                        );
+                if ( RCt == 0 ) {
+                        /*  Here we are reading missing data
+                         */
+                    if ( Entry -> status == kxfsReady ) {
+                        RCt = KDirectoryDate (
+                                            NatD,
+                                            & ( Entry -> time ),
+                                            Entry -> path
+                                            );
+                        if ( RCt == 0 ) {
+                            RCt = KFileSize (
+                                            EncFile,
+                                            & ( Entry -> size )
+                                            );
+                            if ( RCt == 0 ) {
+                                Entry -> status = kxfsComplete;
+                            }
+                        }
+                    }
+                }
+
+                if ( RCt == 0 ) {
+                    Entry -> file = EncFile;
+                }
+
+                KFileRelease ( File );
+            }
+        }
+        else {
+            Entry -> status = kxfsBroken;
+            RCt = XFS_RC ( rcInvalid );
+        }
+
+        KDirectoryRelease ( NatD );
+    }
+
+    return RCt;
+}   /* _OpenEncFileNoLock () */
+
+static 
+rc_t CC
+_CloseEncFileNoLock ( const struct XFSEncEntry * self )
+{
+    rc_t RCt;
+    struct XFSEncEntry * Entry;
+
+    RCt = 0;
+    Entry = ( struct XFSEncEntry * ) self;
+
+    XFS_CAN ( Entry )
+
+    if ( Entry -> file != NULL ) {
+        KFileRelease ( Entry -> file );
+        Entry -> file = NULL;
+    }
+
+    return RCt;
+}   /* _CloseEncFileNoLock () */
+
+static
+rc_t CC
+_CompleteEncEntryNoLock ( const struct XFSEncEntry * self )
+{
+    rc_t RCt = 0;
+
+    XFS_CAN ( self )
+
+    if ( self -> status == kxfsComplete ) {
+        return 0;
+    }
+
+    if ( self -> status != kxfsReady ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = _OpenEncFileNoLock ( self );
+    if ( RCt == 0 ) {
+        RCt = _CloseEncFileNoLock ( self );
+    }
+
+    return RCt;
+}   /* _CompleteEncEntryNoLock () */
+
+XFS_EXTERN
+const char * CC
+XFSEncEntryPath ( const struct XFSEncEntry * self )
+{
+    return self == NULL
+                    ? NULL
+                    : self -> path
+                    ;
+}   /* XFSEncEntryPath () */
+
+XFS_EXTERN
+rc_t CC
+XFSEncEntrySize ( const struct XFSEncEntry * self, uint64_t * Size )
+{
+    rc_t RCt = 0;
+
+    XFS_CSA ( Size, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Size )
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) { 
+            /* Here we are ... if it is in Ready state, we should open
+               and read it. If it is in Complete state, we should just
+               return result
+             */
+        RCt = _CompleteEncEntryNoLock ( self );
+        if ( RCt == 0 ) {
+            * Size = self -> size;
+        }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSEncEntrySize () */
+
+XFS_EXTERN
+rc_t CC
+XFSEncEntryTime ( const struct XFSEncEntry * self, KTime_t * Time )
+{
+    rc_t RCt = 0;
+
+    XFS_CSA ( Time, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Time )
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) { 
+            /* Here we are ... if it is in Ready state, we should open
+               and read it. If it is in Complete state, we should just
+               return result
+             */
+        RCt = _CompleteEncEntryNoLock ( self );
+        if ( RCt == 0 ) {
+            * Time = self -> time;
+        }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSEncEntryTime () */
+
+XFS_EXTERN
+bool CC
+XFSEncEntryGood ( const struct XFSEncEntry * self )
+{
+    bool RetVal = false;
+
+    if ( self != NULL ) {
+        if ( KLockAcquire ( self -> mutabor ) == 0 ) {
+            RetVal = self -> status == kxfsGood;
+
+            KLockUnlock ( self -> mutabor );
+        }
+    }
+
+    return RetVal;
+}   /* XFSEncEntryGood () */
+
+XFS_EXTERN
+bool CC
+XFSEncEntryIsOpen ( const struct XFSEncEntry * self )
+{
+    bool RetVal = false;
+
+    if ( self != NULL ) {
+        if ( KLockAcquire ( self -> mutabor ) == 0 ) {
+            RetVal = self -> file != NULL;
+
+            KLockUnlock ( self -> mutabor );
+        }
+    }
+
+    return RetVal;
+}   /* XFSEncEntryIsOpen () */
+
+XFS_EXTERN
+rc_t CC
+XFSEncEntryOpen ( const struct XFSEncEntry * self )
+{
+    rc_t RCt = 0;
+
+    XFS_CAN ( self )
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _OpenEncFileNoLock ( self );
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSEncEntryOpen () */
+
+XFS_EXTERN
+rc_t CC
+XFSEncEntryClose ( const struct XFSEncEntry * self )
+{
+    rc_t RCt = 0;
+
+    XFS_CAN ( self )
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _CloseEncFileNoLock ( self );
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSEncEntryClose () */
+
+XFS_EXTERN
+rc_t CC
+XFSEncEntryRead (
+            const struct XFSEncEntry * self,
+            uint64_t Offset,
+            void * Buffer,
+            size_t BufferSize,
+            size_t * NumRead
+)
+{
+    rc_t RCt = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Buffer )
+    XFS_CAN ( NumRead )
+
+    if ( BufferSize == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+        if ( self -> file != NULL ) {
+            if ( self -> status == kxfsComplete ) {
+                RCt = KFileRead (
+                                self -> file,
+                                Offset,
+                                Buffer,
+                                BufferSize,
+                                NumRead
+                                );
+            }
+            else {
+                RCt = XFS_RC ( rcInvalid );
+            }
+        }
+        else {
+            RCt = XFS_RC ( rcInvalid );
+        }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSEncEntryReady () */
diff --git a/libs/xfs/xencro.h b/libs/xfs/xencro.h
new file mode 100644
index 0000000..4e8ce16
--- /dev/null
+++ b/libs/xfs/xencro.h
@@ -0,0 +1,118 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xencro_h_
+#define _xencro_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   There is some interface build to implement access to files
+  ))))  through Krypto package
+ ((((*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSEncEntry;
+
+/*))
+ //     We are cacheing info: key, size and date of encrypted file
+((*/
+XFS_EXTERN rc_t CC XFSEncDepotInit ();
+XFS_EXTERN rc_t CC XFSEncDepotDispose ();
+XFS_EXTERN rc_t CC XFSEncDepotClear ();
+
+/*))
+ || Just handles structure which reffer to encrypted file
+ || IMPORTANT: we are ReadOnlyMode only, which does means everything
+ || Also, Release method does not destroy EncEntry, only Dispose 
+ || call will do it. Release method will close associated file only
+ || 
+((*/
+XFS_EXTERN rc_t CC XFSEncEntryFindOrCreate (
+                            const char * Path,
+                            const char * Passwd,
+                            const char * EncodeType, /* could be NULL */
+                            const struct XFSEncEntry ** EncEntry
+                            );
+XFS_EXTERN rc_t CC XFSEncEntryDispose (
+                            const struct XFSEncEntry * self
+                            );
+
+XFS_EXTERN rc_t CC XFSEncEntryAddRef (
+                            const struct XFSEncEntry * self
+                            );
+XFS_EXTERN rc_t CC XFSEncEntryRelease (
+                            const struct XFSEncEntry * self
+                            );
+
+
+XFS_EXTERN const char * CC XFSEncEntryPath (
+                            const struct XFSEncEntry * self
+                            );
+XFS_EXTERN rc_t CC XFSEncEntrySize (
+                            const struct XFSEncEntry * self,
+                            uint64_t * Size
+                            );
+XFS_EXTERN rc_t CC XFSEncEntryTime (
+                            const struct XFSEncEntry * self,
+                            KTime_t * Time
+                            );
+XFS_EXTERN bool CC XFSEncEntryGood (
+                            const struct XFSEncEntry * self
+                            );
+/*))
+ //     There will no special reader. Entry reads.
+((*/
+XFS_EXTERN bool CC XFSEncEntryIsOpen (
+                            const struct XFSEncEntry * self
+                            );
+
+XFS_EXTERN rc_t CC XFSEncEntryOpen (
+                            const struct XFSEncEntry * self
+                            );
+XFS_EXTERN rc_t CC XFSEncEntryClose (
+                            const struct XFSEncEntry * self
+                            );
+
+XFS_EXTERN rc_t CC XFSEncEntryRead (
+                            const struct XFSEncEntry * self,
+                            uint64_t Offset,
+                            void * Buffer,
+                            size_t BufferSize,
+                            size_t * NumRead
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _xencro_h_ */
diff --git a/libs/xfs/xencws.c b/libs/xfs/xencws.c
new file mode 100644
index 0000000..6152649
--- /dev/null
+++ b/libs/xfs/xencws.c
@@ -0,0 +1,5090 @@
+ /*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/container.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+#include <kproc/lock.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/impl.h>
+
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+
+#include <xfs/doc.h>
+
+#include <va_copy.h>
+
+#include "schwarzschraube.h"
+#include "xencws.h"
+#include "zehr.h"
+#include "lreader.h"
+#include <xfs/path.h>
+
+#include <sysalloc.h>
+
+#include <ctype.h>
+#include <time.h>
+
+/*||*\
+  || Lyrics:
+  || 
+  || There is temporary solution for WORKSPACE directory, which
+  || supposes encrypting of everything.
+  || Simple simulation: directory could be opened as workspace
+  || if it contains special file with name _sDirectoryWsContent
+  || That file is simple file in format :
+  || 
+  ||     type<tab>eff_name<tab>display_name
+  ||     type<tab>eff_name<tab>display_name
+  ||     type<tab>eff_name<tab>display_name
+  || 
+  || Only entries from that file are accessible throught that interface
+  || There are two types of entries : file and folder
+  ||
+  || User should pass path and password to XFSEncDirectoryOpen
+  || method to open directory. All other operations with file
+  || system should be done relative to that directory.
+  ||
+\*||*/
+
+#ifdef JOJOBA
+#define LOG_LOC_ACQ(line,lockp) pLogMsg (   \
+                        klogDebug,  \
+                        " [KLockAcquire] [$(line)] [$(lockp)]", \
+                        "line=%d,lockp=%p", \
+                        line, ( void * )lockp   \
+                        )
+#define LOG_LOC_UNL(line,lockp) pLogMsg (   \
+                        klogDebug,  \
+                        " [KLockUnlock] [$(line)] [$(lockp)]", \
+                        "line=%d,lockp=%p", \
+                        line, ( void * )lockp   \
+                        )
+#else
+#define LOG_LOC_ACQ(line,lockp)
+#define LOG_LOC_UNL(line,lockp)
+#endif
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ ||  Usefull stuff
+((*/
+
+/* static const char * _sDirectoryWsContent = ".ncbi-ws-content"; */
+static const char * _sDirectoryWsContent = ".ncbi-ws-gehalt";
+static const char * _sFileExt            = ".datei";
+static const char * _sFolderExt          = ".mappe";
+static const char * _sFileTag            = "file";
+static const char * _sFolderTag          = "folder";
+
+#define _NAME_FORMAT_LEN_   8
+
+/* because of we unable to read encrypted file header in Write Only
+ * mode we are always opening files in Update mode. I have no idea how
+ * to fix that problem. Thinking about it.
+ */
+#define _ENCODED_FILE_UPDATE_ALWAYS_
+
+/*\
+ *  Other thoughts:
+ *
+ *  each directory will imediately synchronize it's content to disk.
+ *  That synchronisation works only in the case of : creation, deletion
+ *  and renaming file.
+\*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*                                                                   */
+/* As it usually happens, first is description of directory          */
+/*                                                                   */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct _DirC;
+
+struct _DirE {
+    BSTNode node;
+
+    KLock * mutabor;
+    KRefcount refcount;
+
+    const char * name;
+    const char * eff_name;
+
+    bool is_folder;
+    const struct _DirC * content;     /* NULL for non-folder */
+};
+
+struct _DirC {
+    BSTree tree;
+
+    struct KKey key;
+
+    const char * path;
+
+    uint64_t last;
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/**)))  There are too many places, where encrypted file is opened
+  (((**/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static const char * _sDirE_classname = "DirE";
+
+static rc_t CC _DirEDisposeContent ( const struct _DirE * self );
+
+static
+rc_t CC
+_DirEDispose ( const struct _DirE * self )
+{
+    struct _DirE * Entry = ( struct _DirE * ) self;
+
+    if ( Entry != NULL ) {
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " [-DSP] [$(line)] [$(entry)] [$(name)]", "line=%d,entry=%p,name=%s", __LINE__, Entry, Entry -> name );
+#endif /* JOJOBA */
+
+        if ( Entry -> mutabor != NULL ) {
+            KLockRelease ( Entry -> mutabor );
+            Entry -> mutabor = NULL;
+        }
+
+        KRefcountWhack (
+                        & ( Entry -> refcount ),
+                        _sDirE_classname
+                        );
+
+        if ( Entry -> name != NULL ) {
+            free ( ( char * ) Entry -> name );
+            Entry -> name = NULL;
+        }
+        if ( Entry -> eff_name != NULL ) {
+            free ( ( char * ) Entry -> eff_name );
+            Entry -> eff_name = NULL;
+        }
+
+        _DirEDisposeContent ( Entry );
+
+        free ( Entry );
+    }
+    return 0;
+}   /* _DirEDispose () */
+
+static
+rc_t CC
+_DirEMake (
+            const char * Type,
+            const char * EffName,
+            const char * DisplayName,
+            const struct _DirE ** Entry
+)
+{
+    rc_t RCt;
+    struct _DirE * RetVal;
+    bool IsFolder;
+
+    RCt = 0;
+    RetVal = NULL;
+    IsFolder = false;
+
+    if ( Type != NULL && EffName != NULL && DisplayName != NULL ) {
+        if ( strcmp ( Type, _sFileTag ) == 0 ) {
+            IsFolder = false;
+        }
+        else {
+            if ( strcmp ( Type, _sFolderTag ) == 0 ) {
+                IsFolder = true;
+            }
+            else {
+                RCt = XFS_RC ( rcInvalid );
+            }
+        }
+
+        if ( RCt == 0 ) {
+            RetVal = calloc ( 1, sizeof ( struct _DirE ) );
+            if ( RetVal == NULL ) {
+                RCt = XFS_RC ( rcExhausted );
+            }
+            else {
+                RCt = KLockMake ( & ( RetVal -> mutabor ) );
+                if ( RCt == 0 ) {
+                    KRefcountInit (
+                                & ( RetVal -> refcount ),
+                                1,
+                                _sDirE_classname,
+                                "DirEMake",
+                                "DirE"
+                                );
+
+                    RCt = XFS_StrDup (
+                                    DisplayName,
+                                    & ( RetVal -> name )
+                                    );
+                    if ( RCt == 0 ) {
+                        RCt = XFS_StrDup (
+                                        EffName,
+                                        & ( RetVal -> eff_name )
+                                        );
+                        if ( RCt == 0 ) {
+                            RetVal -> is_folder = IsFolder;
+                            * Entry = RetVal;
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " [-ALC] [$(line)] [$(entry)] [$(name)]", "line=%d,entry=%p,name=%s", __LINE__, RetVal, RetVal -> name );
+#endif /* JOJOBA */
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( RetVal != NULL ) {
+            if ( RetVal -> mutabor != NULL ) {
+                KLockRelease ( RetVal -> mutabor );
+                RetVal -> mutabor = NULL;
+            }
+            if ( RetVal -> name != NULL ) {
+                free ( ( char * ) RetVal -> name );
+                RetVal -> name = NULL;
+            }
+            if ( RetVal -> eff_name != NULL ) {
+                free ( ( char * ) RetVal -> eff_name );
+                RetVal -> eff_name = NULL;
+            }
+
+            free ( RetVal );
+        }
+
+        * Entry = NULL;
+    }
+
+    return RCt;
+}   /* _DirEMake () */
+
+static
+rc_t CC
+_DirEAddRef ( const struct _DirE * self )
+{
+    rc_t RCt;
+    struct _DirE * Entry;
+    int Refc;
+
+    RCt = 0;
+    Entry = ( struct _DirE * ) self;
+    Refc = 0;
+
+    XFS_CAN ( Entry )
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " [>ARE] [$(line)] [$(entry)] [$(name)]", "line=%d,entry=%p,name=%s", __LINE__, self, self -> name );
+#endif /* JOJOBA */
+
+    Refc = KRefcountAdd (
+                    & ( Entry -> refcount ),
+                    _sDirE_classname
+    );
+    switch ( Refc ) {
+        case krefOkay :
+                RCt = 0;
+                break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+                RCt = XFS_RC ( rcInvalid );
+                break;
+        default :
+                RCt = XFS_RC ( rcUnknown );
+                break;
+    }
+
+    return RCt;
+}   /* _DirEAddRef () */
+
+static
+rc_t CC
+_DirERelease ( const struct _DirE * self )
+{
+    rc_t RCt;
+    struct _DirE * Entry;
+    int Refc;
+
+    RCt = 0;
+    Entry = ( struct _DirE * ) self;
+    Refc = 0;
+
+    XFS_CAN ( Entry )
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " [<ARE] [$(line)] [$(entry)] [$(name)]", "line=%d,entry=%p,name=%s", __LINE__, self, self -> name );
+#endif /* JOJOBA */
+
+    Refc = KRefcountDrop (
+                    & ( Entry -> refcount ),
+                    _sDirE_classname
+                    );
+    switch ( Refc ) {
+        case krefOkay :
+        case krefZero :
+                RCt = 0;
+                break;
+        case krefWhack :
+                RCt = _DirEDispose ( self );
+                break;
+        case krefNegative :
+                RCt = XFS_RC ( rcInvalid );
+                break;
+        default :
+                RCt = XFS_RC ( rcUnknown );
+                break;
+    }
+
+    return RCt;
+}   /* _DirERelease () */
+
+static
+rc_t CC
+_NextWord (
+            const char * Line,
+            size_t Length,
+            const char ** Word,
+            const char ** NextLine
+)
+{
+    const char * Bg, * En, * Ps;
+
+    Bg = En = Ps = NULL;
+
+    XFS_CSAN ( Word )
+    XFS_CSAN ( NextLine )
+    XFS_CA ( Length, 0 )
+    XFS_CAN ( Word )
+    XFS_CAN ( NextLine )
+    XFS_CAN ( Line )
+
+    Bg = Line;
+    En = Line + Length;
+
+        /* Skipping fron tabls */
+    while ( Bg < En ) {
+        if ( * Bg != '\t' ) {
+            break;
+        }
+        Bg ++;
+    }
+
+    Ps = Bg;
+    while ( Ps < En ) {
+        if ( * Ps == '\t' ) {
+            break;
+        }
+        Ps ++;
+    }
+
+    if ( Ps == Bg ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Word = string_dup ( Bg, Ps - Bg );
+    if ( * Word == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    if ( Ps == En ) {
+        * NextLine = NULL;
+    }
+    else {
+        * NextLine = Ps + 1;
+    }
+
+    return 0;
+}   /* _NextWord () */
+
+static
+rc_t CC
+_DirEParse (
+            const struct String * Line,
+            const struct _DirE ** Entry
+)
+{
+    rc_t RCt;
+    const char * Start, * Name, * EffName, * Type, * NextLine;
+    size_t Len, Dif;
+
+    RCt = 0;
+    Start = Name = EffName = Type = NextLine = NULL;
+    Len = Dif = 0;
+
+    XFS_CSAN ( Entry )
+    XFS_CAN ( Line )
+    XFS_CAN ( Entry )
+
+    Start = Line -> addr;
+    Len = Line -> len;
+
+        /* First is Type */
+    RCt = _NextWord ( Start, Len, & Type, & NextLine );
+    if ( RCt == 0 ) {
+        Len -= NextLine - Start;
+        Start = NextLine;
+
+
+            /* Second is Effective Name */
+        RCt = _NextWord ( Start, Len, & EffName, & NextLine );
+        if ( RCt == 0 ) {
+            Len -= NextLine - Start;
+            Start = NextLine;
+
+                /* Third is display Name */
+            RCt = _NextWord ( Start, Len, & Name, & NextLine );
+            if ( RCt == 0 ) {
+                RCt = _DirEMake ( Type, EffName, Name, Entry );
+
+                free ( ( char * ) Name );
+                Name = NULL;
+            }
+
+            free ( ( char * ) EffName );
+            EffName = NULL;
+        }
+
+        free ( ( char * ) Type );
+        Type = NULL;
+    }
+
+    if ( RCt != 0 ) {
+        if ( * Entry != NULL ) {
+            _DirEDispose ( * Entry );
+        }
+    }
+
+    return RCt;
+}   /* _DirEParse () */
+
+static
+rc_t CC
+_OpenEncLineReader (
+                const struct XFSLineReader ** Reader,
+                const struct KKey * Key,
+                const char * Path,
+                ...
+)
+{
+    rc_t RCt;
+    struct KDirectory * NatDir;
+    const struct KFile * File;
+    const struct KFile * EncFile;
+    va_list Args;
+
+    RCt = 0;
+    NatDir = NULL;
+    File = NULL;
+    EncFile = NULL;
+
+    XFS_CSAN ( Reader )
+    XFS_CAN ( Key )
+    XFS_CAN ( Path )
+    XFS_CAN ( Reader )
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+
+        va_start ( Args, Path );
+        RCt = KDirectoryVOpenFileRead ( NatDir, & File, Path, Args );
+        va_end ( Args );
+
+        if ( RCt == 0 ) {
+            RCt = KEncFileMakeRead ( & EncFile, File, Key );
+            if ( RCt == 0 ) {
+                RCt = XFSLineReaderMake ( EncFile, Reader );
+
+                KFileRelease ( EncFile );
+            }
+
+            KFileRelease ( File );
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* _OpenEncLineReader () */
+
+/*))
+  ++    IMPORTANT: all modifications to Content should be made through 
+  ++               corresponding Entry
+  ((*/
+static rc_t CC _SyncronizeDirectoryContentNoLock (
+                                        const struct _DirE * self
+                                        );
+static rc_t CC _DirEAddEntryNoLock (
+                                    const struct _DirE * self,
+                                    const struct _DirE * Entry
+                                    );
+static
+rc_t CC
+_DirEReadContent ( const struct _DirE * self )
+{
+    rc_t RCt;
+    const struct XFSLineReader * Reader;
+    const struct _DirE * Entry;
+    const struct String Line;
+    size_t LineNo; 
+
+    RCt = 0;
+    Reader = NULL;
+    Entry = NULL;
+    LineNo = 0;
+
+    XFS_CAN ( self )
+
+    RCt = _OpenEncLineReader (
+                            & Reader,
+                            & ( self -> content -> key ),
+                            "%s/%s",
+                            self -> content -> path,
+                            _sDirectoryWsContent
+                            );
+
+    if ( RCt == 0 ) {
+        if ( XFSLineReaderGood ( Reader ) ) {
+            do {
+                RCt = XFSLineReaderGet ( Reader, & Line );
+                if ( RCt == 0 ) {
+                    RCt = _DirEParse ( & Line, & Entry );
+                    if ( RCt == 0 ) {
+                        RCt = _DirEAddEntryNoLock ( self, Entry );
+                        if ( RCt == 0 ) {
+/* TODO */
+                        }
+                    }
+                }
+
+                if ( RCt != 0 ) {
+                    XFSLineReaderLineNo ( Reader, & LineNo );
+pLogMsg ( klogDebug, " __DirE : invalid line no $(line)", "line=%d", ( int ) LineNo );
+                    RCt = 0;
+                }
+            } while ( XFSLineReaderNext ( Reader ) );
+
+        }
+        else {
+            /*  TODO : JUST a stub. I mean, it is not a problem. File
+             *  could be lost, or directory could be just created
+             */
+        }
+
+        XFSLineReaderRelease ( Reader );
+    }
+    else {
+        if ( GetRCState ( RCt ) == rcNotFound ) {
+            LogMsg ( klogDebug, " Mahindra: Syncronicytyty" );
+            RCt = _SyncronizeDirectoryContentNoLock ( self );
+        }
+    }
+
+    return RCt;
+}   /* _DirEReadContent () */
+
+static char _FmtStr [ 64 ];
+static char * _pFmtStr = NULL;
+static
+const char * CC
+_fFmtStr ()
+{
+    size_t NW;
+
+    if ( _pFmtStr == NULL ) {
+        string_printf (
+                    _FmtStr,
+                    sizeof ( _FmtStr ),
+                    & NW,
+                    ".%%0.%dd%%s",
+                    _NAME_FORMAT_LEN_
+                    );
+        _pFmtStr = _FmtStr;
+    }
+    return _pFmtStr;
+}   /* _fFmtStr () */
+
+static
+rc_t CC
+_DirCNewName (
+            const struct _DirC * self,
+            bool IsFolder,
+            char * Out,
+            size_t Len
+)
+{
+    rc_t RCt;
+    size_t Var;
+    int Series;
+    const char * Ext;
+
+    RCt = 0;
+    Series = 0;
+    Ext = IsFolder ? _sFolderExt : _sFileExt;
+    Var =    1                     /* trailing point */
+           + string_size ( Ext )   /* extention for folder or file */
+           + _NAME_FORMAT_LEN_     /* name */
+           + 1                     /* 0 */
+           ;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Out )
+    if ( Len <= Var ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Out = 0;
+
+    Series = ( int ) ( self -> last + 1 );
+
+    RCt = string_printf ( Out, Len, & Var, _fFmtStr (), Series, Ext );
+    if ( RCt == 0 ) {
+        ( ( struct _DirC * ) self ) -> last ++;
+    }
+    else {
+        * Out = 0;
+    }
+
+    return RCt;
+}   /* _DirCNewName () */
+
+static
+void CC
+_MakeContentDocumentCallback ( BSTNode * Node, void * Data )
+{
+    struct _DirE * Entry;
+    struct XFSDoc * Doc;
+
+    Entry = ( struct _DirE * ) Node;
+    Doc = ( struct XFSDoc * ) Data;
+
+    if ( Entry != NULL && Doc != NULL ) {
+        XFSTextDocAppend (
+                    Doc,
+                    "%s\t%s\t%s\n", 
+                    ( Entry -> is_folder ? _sFolderTag : _sFileTag ),
+                    Entry -> eff_name,
+                    Entry -> name
+                    );
+    }
+}   /* _MakeContentDocumentCallback () */
+
+static
+rc_t CC
+_MakeContentDocument (
+                    const struct _DirE * self,
+                    const struct XFSDoc ** Doc
+)
+{
+    rc_t RCt;
+    struct XFSDoc * RetVal;
+
+    RCt = 0;
+    RetVal = NULL;
+
+    XFS_CSAN ( Doc )
+    XFS_CAN ( self )
+    XFS_CAN ( Doc )
+    XFS_CAN ( self -> content )
+
+    RCt = XFSTextDocMake ( & RetVal );
+    if ( RCt == 0 ) {
+        BSTreeForEach ( 
+                    & ( self -> content -> tree ),
+                    false,
+                    _MakeContentDocumentCallback,
+                    RetVal
+                    );
+
+        * Doc = RetVal;
+    }
+
+    return RCt;
+}   /* _MakeContentDocument () */
+
+static
+rc_t CC
+_StoreContentDocument (
+                    const struct _DirE * self,
+                    const struct XFSDoc * Doc
+)
+{
+    rc_t RCt;
+    struct _DirC * Content;
+    struct KFile * File, * EncFile;
+    struct KDirectory * NatDir;
+    const char * Text;
+    uint64_t TextSize;
+    size_t NumWrit;
+    uint32_t PathType;
+
+    RCt = 0;
+    Content = NULL;
+    File = EncFile = NULL;
+    NatDir = NULL;
+    Text = NULL;
+    TextSize = 0;
+    NumWrit = 0;
+    PathType = kptNotFound;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Doc )
+    Content = ( struct _DirC * ) self -> content;
+    XFS_CAN ( Content )
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+        PathType = KDirectoryPathType (
+                                    NatDir,
+                                    "%s/%s",
+                                    Content -> path,
+                                    _sDirectoryWsContent
+                                    );
+        if ( PathType == kptNotFound ) {
+            RCt = KDirectoryCreateFile (
+                                        NatDir,
+                                        & File,
+                                        true,
+                                        0664,
+                                        kcmCreate,
+                                        "%s/%s",
+                                        Content -> path,
+                                        _sDirectoryWsContent
+                                        );
+        }
+        else {
+            RCt = KDirectoryOpenFileWrite (
+                                        NatDir,
+                                        & File,
+                                        true,
+                                        "%s/%s",
+                                        Content -> path,
+                                        _sDirectoryWsContent
+                                        );
+        }
+        if ( RCt == 0 ) {
+            RCt = KFileSetSize ( File, 0 );
+            if ( RCt == 0 ) {
+                RCt = KEncFileMakeUpdate (
+                                    & EncFile,
+                                    File,
+                                    & ( Content -> key )
+                                    );
+                KFileRelease ( File );
+                if ( RCt == 0 ) {
+                    RCt = XFSDocSize ( Doc, & TextSize );
+                    if ( RCt == 0 ) {
+                        if ( TextSize != 0 ) {
+                            RCt = XFSDocGet ( Doc, & Text );
+                            if ( RCt == 0 ) {
+                                RCt = KFileWrite (
+                                                EncFile,
+                                                0,
+                                                Text,
+                                                ( size_t ) TextSize,
+                                                & NumWrit
+                                                );
+                            }
+                        }
+                    }
+
+                    KFileRelease ( EncFile );
+                }
+            }
+
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* _StoreContentDocument () */
+
+/*))
+ //     Method is not synchronized, so lock it before, unlock after
+((*/
+static
+rc_t CC
+_SyncronizeDirectoryContentNoLock ( const struct _DirE * self )
+{
+    rc_t RCt;
+    const struct XFSDoc * Doc;
+
+    RCt = 0;
+    Doc = NULL;
+
+    XFS_CAN ( self );
+
+    if ( self -> content != NULL ) {
+        RCt = _MakeContentDocument ( self, & Doc );
+        if  ( RCt == 0 ) {
+
+            RCt = _StoreContentDocument ( self, Doc );
+
+            XFSDocRelease ( Doc );
+        }
+    }
+
+    return RCt;
+}   /* _SynchronizeDirectoryContentNoLock () */
+
+static
+void CC
+_DirCWhackCallback ( BSTNode * Node, void * unused )
+{
+    if ( Node != NULL ) {
+        _DirERelease ( ( const struct _DirE * ) Node );
+    }
+}   /* _DirCWhackCallback () */
+
+static
+rc_t CC
+_DirEDisposeContent ( const struct _DirE * self )
+{
+    struct _DirC * Content;
+
+    if ( self != NULL ) {
+
+        Content = ( struct _DirC * ) self -> content;
+        if ( Content != NULL ) {
+            BSTreeWhack (
+                        & ( Content -> tree ),
+                        _DirCWhackCallback,
+                        NULL
+                        );
+
+            if ( Content -> path != NULL ) {
+                free ( ( char * ) Content -> path );
+
+                Content -> path = NULL;
+            }
+
+            Content -> last = 0;
+
+            free ( Content );
+        }
+
+        ( ( struct _DirE * ) self ) -> content = NULL;
+    }
+
+    return 0;
+}   /* _DirEDisposeContent () */
+
+static
+rc_t CC
+_DirEVMakeContent (
+            const struct _DirE * self,
+            const struct KKey * Key,
+            const char * Format,
+            va_list Args
+)
+{
+    rc_t RCt;
+    struct _DirC * Cont;
+    const struct XFSPath * Path;
+    va_list xArgs;
+
+    RCt = 0;
+    Cont = NULL;
+    Path = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Format )
+    XFS_CAN ( Key )
+
+    if ( ! self -> is_folder ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( self -> content != NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    va_copy ( xArgs, Args );
+    RCt = XFSPathVMakeAbsolute ( & Path, false, Format, xArgs );
+    va_end ( xArgs );
+    if ( RCt != 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Cont = calloc ( 1, sizeof ( struct _DirC ) );
+    if ( Cont == NULL ) {
+        XFSPathRelease ( Path );
+
+        return XFS_RC ( rcExhausted );
+    }
+
+    ( ( struct _DirE * ) self ) -> content = Cont;
+
+    RCt = XFS_StrDup ( XFSPathGet ( Path ), & ( Cont -> path ) );
+    if ( RCt == 0 ) {
+        BSTreeInit ( & ( Cont -> tree ) );
+
+        memmove ( & ( Cont -> key ), Key, sizeof ( struct KKey ) );
+
+        RCt = _DirEReadContent ( self );
+    }
+
+    XFSPathRelease ( Path );
+
+    if ( RCt != 0 ) {
+        _DirEDisposeContent ( self );
+    }
+
+    return RCt;
+}   /* _DirEVMakeContent () */
+
+static
+rc_t CC
+_DirEMakeContent (
+            const struct _DirE * self,
+            const struct KKey * Key,
+            const char * Format,
+            ...
+)
+{
+    rc_t RCt;
+    va_list Args;
+
+    RCt = 0;
+
+    va_start ( Args, Format );
+    RCt = _DirEVMakeContent ( self, Key, Format, Args );
+    va_end ( Args );
+
+    return RCt;
+}   /* _DirEMakeContent () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))   
+ ||     NOTE: all non-locking methods which modify Content does not
+ ||           store Content, while all locking methods forcely store
+ ||           modified content to the disk
+ ||     There are Methods : Rename, Delete, Create
+ ||           All those are implemented in both locking/non-locking way
+ ||           Methods are selfexplainable, except Create, which will 
+ ||           return existing entry if it exists.
+ ||     There is list of methods which do not modify Content : Get and
+ ||           List. Those methods are implemented in both locking/non-
+ ||           locking way, but locking implementation does not perform
+ ||           synchronisation of Content on disk.
+((*/
+
+static
+int64_t CC
+_DirFindCallback ( const void * Item, const BSTNode * Node )
+{
+    const char * Str1, * Str2;
+
+    Str1 = ( const char * ) Item;
+
+    Str2 = Node == NULL
+                    ? NULL
+                    : ( ( struct _DirE * ) Node ) -> name
+                    ;
+
+    return XFS_StringCompare4BST_ZHR ( Str1, Str2 );
+}   /* _DirFindCallback () */
+
+static
+rc_t CC
+_DirEGetEntryNoLock (
+                const struct _DirE * self,
+                const char * Name,
+                const struct _DirE ** Entry
+)
+{
+    const struct _DirE * RetVal = NULL;
+
+    XFS_CSAN ( Entry )
+    XFS_CAN ( self )
+    XFS_CAN ( self -> content )
+    XFS_CAN ( Name )
+    XFS_CAN ( Entry )
+
+    if ( ! self -> is_folder ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RetVal = ( const struct _DirE * ) BSTreeFind (
+                                        & ( self -> content -> tree ),
+                                        Name,
+                                        _DirFindCallback
+                                        );
+    if ( RetVal != NULL ) {
+        if ( _DirEAddRef ( RetVal ) == 0 ) {
+            * Entry = RetVal;
+        }
+        else {
+            RetVal = NULL;
+        }
+    }
+
+    return RetVal == NULL ? XFS_RC ( rcNotFound ) : 0;
+}   /* _DirEGetEntryNoLock () */
+
+static
+rc_t CC
+_DirEGetEntry (
+                const struct _DirE * self,
+                const char * Name,
+                const struct _DirE ** Entry
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CSAN ( Entry )
+    XFS_CAN ( self )
+    XFS_CAN ( Name )
+    XFS_CAN ( Entry )
+
+    if ( ! self -> is_folder ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    LOG_LOC_ACQ ( __LINE__, self -> mutabor );
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _DirEGetEntryNoLock ( self, Name, Entry );
+
+        LOG_LOC_UNL ( __LINE__, self -> mutabor );
+        KLockUnlock ( self -> mutabor );
+    }
+    return RCt;
+}   /* _DirEGetEntry () */
+
+static
+void CC
+_DirCModifyLast ( const struct _DirC * self, const char * Name )
+{
+    const char * pStart, * pEnd;
+    struct _DirC * Content;
+    size_t NameLen;
+    uint64_t Series;
+
+    pStart = pEnd = NULL;
+    Content = ( struct _DirC * ) self;
+    NameLen = 0;
+    Series = 0;
+
+    if ( Content == NULL || Name == NULL ) {
+        return;
+    }
+
+    if ( string_size ( Name ) < _NAME_FORMAT_LEN_ ) {
+        return;
+    }
+
+    if ( * Name == '.' ) {
+        pStart = Name + 1;
+
+        NameLen = string_size ( pStart );
+        if ( _NAME_FORMAT_LEN_ <= NameLen ) {
+            pEnd = pStart + _NAME_FORMAT_LEN_;
+
+            while ( pStart < pEnd ) {
+                if ( * pStart != '0' ) {
+                    break;
+                }
+
+                pStart ++;
+
+            }
+            if ( pStart != pEnd ) {
+                Series = string_to_U64 ( pStart, pEnd - pStart, NULL );
+                if ( Content -> last <= Series ) {
+                    Content -> last = Series;
+                }
+            }
+        }
+    }
+}   /* _DirCModifyLast () */
+
+static
+int64_t CC
+_DirEAddCallback ( const BSTNode * N1, const BSTNode * N2 )
+{
+    return XFS_StringCompare4BST_ZHR (
+                                    ( ( struct _DirE * ) N1 ) -> name,
+                                    ( ( struct _DirE * ) N2 ) -> name
+                                    );
+}   /* _DirEAddCallback () */
+
+static
+rc_t CC
+_DirEAddEntryNoLock (
+                    const struct _DirE * self,
+                    const struct _DirE * Entry
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( self -> content )
+    XFS_CAN ( Entry )
+
+    if ( ! self -> is_folder ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = BSTreeInsert (
+                    ( struct BSTree * ) & ( self -> content -> tree ),
+                    ( struct BSTNode * ) & ( Entry -> node ),
+                    _DirEAddCallback
+                    );
+    if ( RCt == 0 ) {
+        _DirCModifyLast ( self -> content, Entry -> eff_name );
+    }
+
+    return RCt;
+}   /* _DirEAddEntryNoLock () */
+
+static
+rc_t CC
+_DirEDelEntryNoLock (
+            const struct _DirE * self,
+            const struct _DirE * Entry
+)
+{
+    XFS_CAN ( self )
+    XFS_CAN ( self -> content )
+    XFS_CAN ( Entry )
+
+    if ( ! self -> is_folder ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    BSTreeUnlink (
+                ( struct BSTree * ) & ( self -> content -> tree ),
+                ( struct BSTNode * ) & ( Entry -> node )
+                );
+
+    return _DirERelease ( Entry );
+}   /* _DirEDelEntryNoLock () */
+
+static
+rc_t CC
+_DirERenameEntryNoLock (
+                    const struct _DirE * self,
+                    const char * OldName,
+                    const char * NewName
+)
+{
+    rc_t RCt;
+    struct _DirE * Entry;
+
+    RCt = 0;
+    Entry = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( OldName )
+    XFS_CAN ( NewName )
+
+    if ( ! self -> is_folder ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = _DirEGetEntryNoLock (
+                            self,
+                            OldName,
+                            ( const struct _DirE ** ) & Entry
+                            );
+    if ( RCt == 0 ) {
+        if ( Entry != NULL ) {
+            RCt = _DirEDelEntryNoLock ( self, Entry );
+            if ( RCt == 0 ) {
+                free ( ( char * ) Entry -> name );
+                Entry -> name = NULL;
+
+                RCt = XFS_StrDup ( NewName, & ( Entry -> name ) );
+                if ( RCt == 0 ) {
+                    RCt = _DirEAddEntryNoLock ( self, Entry );
+                }
+            }
+        }
+
+        // _DirERelease ( Entry );
+    }
+
+    return RCt;
+}   /* _DirERenameEntryNoLock () */
+
+/*)) Rather long and weird method, which should be revisited TODO TODO
+ ((*/
+static
+rc_t CC
+_DirEMoveEntry (
+                    const struct _DirE * OldParent,
+                    const char * OldName,
+                    const struct _DirE * NewParent,
+                    const char * NewName
+)
+{
+    rc_t RCt;
+    struct KDirectory * NatDir;
+    const struct _DirE * Entry;
+    const struct _DirE * TmpEntry;
+    const struct XFSPath * OldPath;
+    const struct XFSPath * NewPath;
+    char BF [ 32 ];
+
+    RCt = 0;
+    NatDir = NULL;
+    Entry = NULL;
+    TmpEntry = NULL;
+    OldPath = NULL;
+    NewPath = NULL;
+    * BF = 0;
+
+    XFS_CAN ( OldParent )
+    XFS_CAN ( OldName )
+    XFS_CAN ( NewParent )
+    XFS_CAN ( NewName )
+
+        /* Locking first and accessing Entry to move
+         */
+    LOG_LOC_ACQ ( __LINE__, OldParent -> mutabor );
+    RCt = KLockAcquire ( OldParent -> mutabor );
+    if ( RCt == 0 ) {
+            /* First we are getting the entry to move 
+             */
+        RCt = _DirEGetEntryNoLock ( OldParent , OldName, & Entry );
+
+        LOG_LOC_UNL ( __LINE__, OldParent -> mutabor );
+        KLockUnlock ( OldParent -> mutabor );
+    }
+
+    if ( RCt == 0 ) {
+            /* Locking and creating space for Entry to move
+             */
+        LOG_LOC_ACQ ( __LINE__, NewParent -> mutabor );
+        RCt = KLockAcquire ( NewParent -> mutabor );
+        if ( RCt == 0 ) {
+            RCt = _DirEGetEntryNoLock (
+                                     NewParent ,
+                                     NewName,
+                                     & TmpEntry
+                                     );
+            if ( RCt == 0 ) {
+                RCt = _DirEDelEntryNoLock ( NewParent, TmpEntry );
+
+                _DirERelease ( TmpEntry );
+            }
+            else {
+                RCt = 0;
+            }
+
+            LOG_LOC_UNL ( __LINE__, NewParent -> mutabor );
+            KLockUnlock ( NewParent -> mutabor );
+        }
+    }
+
+    if ( RCt == 0 ) {
+        RCt = KDirectoryNativeDir ( & NatDir );
+
+        if ( RCt == 0 ) {
+                /* Here we are moving real file
+                 */
+            RCt = XFSPathMakeAbsolute (
+                                    & OldPath,
+                                    false,
+                                    "%s/%s",
+                                    OldParent -> content -> path,
+                                    Entry -> eff_name
+                                    );
+            if ( RCt == 0 ) {
+                RCt = _DirCNewName (
+                                NewParent -> content,
+                                Entry -> is_folder,
+                                BF,
+                                sizeof ( BF )
+                                );
+                if ( RCt == 0 ) {
+                    RCt = XFSPathMakeAbsolute (
+                                        & NewPath,
+                                        false,
+                                        "%s/%s",
+                                        NewParent -> content -> path,
+                                        BF
+                                        );
+                    if ( RCt == 0 ) {
+                        RCt = KDirectoryRename (
+                                                NatDir,
+                                                true, /* FORCE */
+                                                XFSPathGet ( OldPath ),
+                                                XFSPathGet ( NewPath )
+                                                );
+                        XFSPathRelease ( NewPath );
+                    }
+                }
+
+                XFSPathRelease ( OldPath );
+            }
+
+            KDirectoryRelease ( NatDir );
+        }
+    }
+
+        /* Here we are deleteing old entry and synchronizing
+         */
+    if ( RCt == 0 ) {
+        LOG_LOC_ACQ ( __LINE__, OldParent -> mutabor );
+        RCt = KLockAcquire ( OldParent -> mutabor );
+        if ( RCt == 0 ) {
+            RCt = _DirEDelEntryNoLock ( OldParent, Entry );
+            if ( RCt == 0 ) {
+                RCt = _SyncronizeDirectoryContentNoLock ( OldParent );
+            }
+            LOG_LOC_UNL ( __LINE__, OldParent -> mutabor );
+            KLockUnlock ( OldParent -> mutabor );
+        }
+    }
+
+        /* Here we are adding new 'old' entry and synchronizing
+         */
+    if ( RCt == 0 ) {
+        LOG_LOC_ACQ ( __LINE__, NewParent -> mutabor );
+        RCt = KLockAcquire ( NewParent -> mutabor );
+        if ( RCt == 0 ) {
+                /*  First, we should setup new : Name, EffName and Path,
+                 *  if it is a Folder
+                 */
+
+            free ( ( char * ) Entry -> name );
+            RCt = XFS_StrDup (
+                            NewName,
+                            ( const char ** ) & ( Entry -> name )
+                            );
+            if ( RCt == 0 ) {
+
+                free ( ( char * ) Entry -> eff_name );
+                RCt = XFS_StrDup (
+                            BF,
+                            ( const char ** ) & ( Entry -> eff_name )
+                            );
+                if ( RCt == 0 ) {
+                    if ( Entry -> is_folder ) {
+                        RCt = XFSPathMakeAbsolute (
+                                         & NewPath,
+                                         false,
+                                         "%s/%s",
+                                         NewParent -> content -> path,
+                                         BF
+                                         );
+                        if ( RCt == 0 ) {
+
+                            free ( ( char * ) Entry -> content -> path );
+                            XFS_StrDup (
+                                    XFSPathGet ( NewPath ),
+                                    ( const char ** ) & ( Entry -> content -> path )
+                                    );
+
+                            XFSPathRelease ( NewPath );
+                        }
+
+                    }
+
+                    if ( RCt == 0 ) {
+                        RCt = _DirEAddEntryNoLock ( NewParent, Entry );
+                        if ( RCt == 0 ) {
+                            RCt = _SyncronizeDirectoryContentNoLock (
+                                                            NewParent
+                                                            );
+                        }
+                    }
+                }
+            }
+        }
+
+        LOG_LOC_UNL ( __LINE__, NewParent -> mutabor );
+        KLockUnlock ( NewParent -> mutabor );
+    }
+
+    return RCt;
+}   /* _DirEMoveEntry () */
+
+static
+rc_t CC
+_DirECreateEntryNoLock (
+                const struct _DirE * self,
+                const char * Name,
+                bool IsFolder,
+                const struct _DirE ** Entry
+)
+{
+    rc_t RCt;
+    const struct _DirE * RetVal;
+    char Buf [ XFS_SIZE_64 ];
+
+    RCt = 0;
+    RetVal = NULL;
+    * Buf = 0;
+
+    XFS_CSAN ( Entry )
+    XFS_CAN ( self )
+    XFS_CAN ( Name )
+    XFS_CAN ( Entry )
+
+    if ( ! self -> is_folder ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = _DirEGetEntryNoLock ( self, Name, & RetVal );
+    if ( GetRCState ( RCt ) == rcNotFound ) {
+        RCt = _DirCNewName (
+                            self -> content,
+                            IsFolder,
+                            Buf,
+                            sizeof ( Buf )
+                            );
+        if ( RCt == 0 ) {
+            RCt = _DirEMake (
+                            ( IsFolder ? _sFolderTag : _sFileTag ),
+                            Buf,
+                            Name,
+                            & RetVal
+                            );
+            if ( RCt == 0 ) {
+                RCt = _DirEAddEntryNoLock ( self, RetVal );
+            }
+        }
+    }
+    else {
+        if ( RCt == 0 ) {
+            _DirERelease ( RetVal );
+        }
+    }
+
+    if ( RCt == 0 ) {
+        * Entry = RetVal;
+    }
+    else {
+        if ( RetVal != NULL ) {
+            _DirEDispose ( RetVal );
+        }
+    }
+
+    return RCt;
+}   /* _DirECreateEntryNoLock () */
+
+static
+bool CC 
+_DirEHasEntriesCallback ( BSTNode *n, void *data )
+{
+    return true;
+}   /* _DirEHasEntriesCallback () */
+
+static
+bool CC
+_DirEHasEntries ( const struct _DirE * self )
+{
+    if ( self == NULL ) {
+        return false;
+    }
+
+    if ( ! self -> is_folder ) {
+        return false;
+    }
+
+    if ( self -> content == NULL ) {
+        return false;
+    }
+
+    return  BSTreeDoUntil (
+                        & ( self -> content -> tree ),
+                        false,
+                        _DirEHasEntriesCallback,
+                        NULL
+                        );
+}   /* _DirEHasEntries () */
+
+static
+void
+_DirEListCalback ( BSTNode * Node, void * Data )
+{
+    struct VNamelist * List;
+    struct _DirE * Entry;
+
+    List = ( struct VNamelist * ) Data;
+    Entry = ( struct _DirE * ) Node;
+
+    if ( List != NULL && Entry != NULL ) {
+        VNamelistAppend ( List, Entry -> name );
+    }
+}   /* _DirEListCalback () */
+
+static
+rc_t CC
+_DirEListEntriesNoLock (
+                const struct _DirE * self,
+                struct KNamelist ** List
+)
+{
+    rc_t RCt;
+    struct VNamelist * xList;
+
+    RCt = 0;
+    xList = NULL;
+
+    XFS_CSAN ( List )
+    XFS_CAN ( self )
+    XFS_CAN ( self -> content )
+    XFS_CAN ( List )
+
+    if ( ! self -> is_folder ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = VNamelistMake ( & xList, 16 );
+    if ( RCt == 0 ) {
+        BSTreeForEach (
+                    & ( self -> content -> tree ),
+                    false,
+                    _DirEListCalback,
+                    xList
+                    );
+
+        RCt = VNamelistToNamelist ( xList, List );
+
+        VNamelistRelease ( xList );
+    }
+
+
+    return RCt;
+}   /* _DirEListEntries () */
+
+static
+rc_t CC
+_DirEVisitNoLock (
+                const struct _DirE * self, 
+                const struct KDirectory * Dir,
+                bool Recurse,
+                rc_t ( CC * Func ) (
+                            const struct KDirectory *,
+                            uint32_t,
+                            const char *,
+                            void *
+                            ), 
+                void * Data,
+                const char * Path
+)
+{
+    rc_t RCt;
+    struct KNamelist * List;
+    uint32_t ListQty;
+    uint32_t Idx;
+    const struct _DirE * Entry;
+    const char * Name;
+    char BF [ XFS_SIZE_4096 ];
+    size_t NumW;
+
+    RCt = 0;
+    List = NULL;
+    ListQty = 0;
+    Idx = 0;
+    Entry = NULL;
+    Name = NULL;
+    * BF = 0;
+    NumW = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Func )
+    XFS_CAN ( Path )
+
+    LOG_LOC_ACQ ( __LINE__, self -> mutabor );
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _DirEListEntriesNoLock ( self, & List );
+
+        LOG_LOC_UNL ( __LINE__, self -> mutabor );
+        KLockUnlock ( self -> mutabor );
+    }
+
+    if ( RCt == 0 ) {
+        RCt = KNamelistCount ( List, & ListQty );
+        if ( RCt == 0 ) {
+            for ( Idx = 0; ( Idx < ListQty ) && ( RCt == 0 ); Idx ++ ) {
+                RCt = KNamelistGet ( List, Idx, & Name );
+                if ( RCt == 0 ) {
+                    RCt = _DirEGetEntry ( self, Name, & Entry );
+                    if ( RCt == 0 ) {
+
+                        RCt = string_printf ( 
+                                            BF,
+                                            sizeof ( BF ),
+                                            & NumW,
+                                            "%s/%s",
+                                            Path,
+                                            Name
+                                            );
+                        if ( RCt == 0 ) {
+                            RCt = Func ( 
+                                        Dir,
+                                        Entry -> is_folder
+                                                        ? kptDir
+                                                        : kptFile
+                                                        ,
+                                        BF,
+                                        Data
+                                        );
+                            if ( RCt == 0 ) {
+                                if ( Entry -> is_folder && Recurse ) {
+                                    RCt = _DirEVisitNoLock (
+                                                            Entry,
+                                                            Dir,
+                                                            Recurse,
+                                                            Func,
+                                                            Data,
+                                                            BF
+                                                            );
+                                }
+                            }
+                        }
+
+                        _DirERelease ( Entry );
+                    }
+                }
+            }
+        }
+
+        KNamelistRelease ( List );
+    }
+
+    return RCt;
+}   /* _DirEVisitNoLock () */
+
+/*))    That method will get or create content from entry.
+ ((*/
+static
+rc_t CC
+_DirECheckLoadContent (
+                const struct _DirE * self,
+                const struct KKey * Key,
+                const char * Format,
+                ...
+)
+{
+    rc_t RCt;
+    va_list Args;
+
+    RCt = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Key )
+    XFS_CAN ( Format )
+
+    if ( ! self -> is_folder ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    LOG_LOC_ACQ ( __LINE__, self -> mutabor );
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+            /*)) Check if Content already loaded ((*/
+        if ( self -> content == NULL ) {
+
+                /*)) Tying to load Content ((*/
+            va_start ( Args, Format );
+            RCt = _DirEVMakeContent ( self, Key, Format, Args );
+            va_end ( Args );
+        }
+
+        if ( self -> content == NULL ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+
+        LOG_LOC_UNL ( __LINE__, self -> mutabor );
+        KLockUnlock ( self -> mutabor );
+
+    }
+
+    return RCt;
+}   /* _DirECheckLoadContent () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSWsDir {
+    struct KDirectory dir;
+
+    const char * passwd;
+    const char * enc_type;
+    bool update;
+
+    const struct _DirE * entry;
+};
+
+static
+rc_t CC
+_WsDirEntry (
+            const struct XFSWsDir * self,
+            const struct _DirE ** Entry
+)
+{
+    rc_t RCt = 0;
+
+    XFS_CSAN ( Entry )
+    XFS_CAN ( self )
+    XFS_CAN ( Entry )
+
+    XFS_CAN ( self -> entry ) 
+
+    RCt = _DirEAddRef ( self -> entry );
+    if ( RCt == 0 ) {
+        * Entry = self -> entry;
+    }
+
+    return RCt;
+}   /* _WsDirEntry () */
+
+static
+const struct KKey * CC
+_WsDirKey ( const struct XFSWsDir * self )
+{
+    if ( self != NULL ) {
+        if ( self -> entry != NULL ) {
+            if ( self -> entry -> content != NULL ) {
+                return & ( self -> entry -> content -> key );
+            }
+        }
+    }
+    return NULL;
+}   /* _WsDirKey () */
+
+static
+const char * CC
+_WsDirPath ( const struct XFSWsDir * self )
+{
+    if ( self != NULL ) {
+        if ( self -> entry != NULL ) {
+            if ( self -> entry -> content != NULL ) {
+                return self -> entry -> content -> path;
+            }
+        }
+    }
+    return NULL;
+}   /* _WsDirPath () */
+
+static
+rc_t CC
+_WsDirMapPath (
+            const struct XFSWsDir * self,
+            const struct XFSPath * Path,
+            const struct _DirE ** RetEntry,
+            const struct XFSPath ** EffPath
+)
+{
+    rc_t RCt;
+    size_t Idx, Qty;
+    const struct XFSPath * RetVal;
+    const struct _DirE * Entry, * TmpEntry;
+
+    RCt = 0;
+    Idx = Qty = 0;
+    RetVal = NULL;
+    Entry = TmpEntry = NULL;
+
+    XFS_CSAN ( EffPath )
+    XFS_CSAN ( RetEntry )
+    XFS_CAN ( self )
+    XFS_CAN ( Path )
+    XFS_CAN ( EffPath )
+    XFS_CAN ( RetEntry )
+
+        /*) First we are creating empty Path
+         */
+
+    RCt = XFSPathMake ( & RetVal, false, "" );
+    if ( RCt == 0 ) {
+        RCt = _WsDirEntry ( self, & Entry );
+        if ( RCt == 0 ) {
+
+            Qty = XFSPathPartCount ( Path );
+            for ( Idx = 0; Idx < Qty; Idx ++ ) {
+                RCt = _DirEGetEntry (
+                                    Entry,
+                                    XFSPathPartGet ( Path, Idx ),
+                                    & TmpEntry
+                                    );
+
+                if ( RCt != 0 ) {
+                    break;
+                }
+
+                if ( TmpEntry == NULL ) {
+                    RCt = XFS_RC ( rcNotFound );
+                    break;
+                }
+
+                if ( TmpEntry -> is_folder ) {
+                    RCt = _DirECheckLoadContent (
+                                    TmpEntry,
+                                    & ( Entry -> content -> key ),
+                                    "%s/%s",
+                                    Entry -> content -> path,
+                                    TmpEntry -> eff_name
+                                    );
+                    if ( RCt != 0 ) {
+                        break;
+                    }
+                }
+                else {
+                    if ( ( Idx + 1 ) < Qty ) {
+                        RCt = XFS_RC ( rcInvalid );
+                        break;
+                    }
+                }
+
+                RCt = XFSPathAppend ( RetVal, TmpEntry -> eff_name );
+                if ( RCt != 0 ) {
+                    break;
+                }
+
+                _DirERelease ( Entry );
+
+                Entry = TmpEntry;
+                TmpEntry = NULL;
+            }
+
+            if ( RCt == 0 ) {;
+                    /* Should we check Entry for NULL ? */
+                * EffPath = RetVal;
+
+                * RetEntry = Entry;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * EffPath = NULL;
+        * RetEntry = NULL;
+
+        if ( RetVal != NULL ) {
+            XFSPathRelease ( RetVal );
+        }
+
+        if ( Entry != NULL ) {
+            _DirERelease ( Entry );
+        }
+    }
+
+    return RCt;
+}   /* _WsDirMapPath () */
+
+static
+rc_t
+_WsDirVMapIt (
+            const struct XFSWsDir * self,
+            const struct _DirE ** Entry,
+            const struct XFSPath ** EffPath,   /* Could be NULL */
+            const char * Format,
+            va_list Args
+)
+{
+    rc_t RCt;
+    const struct XFSPath * WsPath;
+    const struct XFSPath * DerPath;
+    const struct XFSPath * TmpPath;
+    const struct XFSPath * ThePath;
+    const struct _DirE * TheEntry;
+    va_list xArgs;
+
+    RCt = 0;
+    WsPath = NULL;
+    DerPath = NULL;
+    TmpPath = NULL;
+    ThePath = NULL;
+    TheEntry = NULL;
+
+    XFS_CSAN( Entry )
+    XFS_CSAN( EffPath )
+    XFS_CAN ( self )
+    XFS_CAN ( Format )
+
+        /* First we shoud make sure that path is our.
+         | I mean, path should be part of Directory path.
+         */
+            /*) Orig Path
+             (*/
+    RCt = XFSPathMakeAbsolute ( & WsPath, false, _WsDirPath ( self ) );
+    if ( RCt == 0 ) {
+            /*) Absolute Input Path
+             (*/
+        va_copy ( xArgs, Args );
+        RCt = XFSPathVMakeAbsolute ( & DerPath, false, Format, xArgs );
+        va_end ( xArgs );
+
+        if ( RCt == 0 ) {
+            if ( XFSPathIsChild ( WsPath, DerPath, & TmpPath ) ) {
+                    /*) Here we are mapping effective path
+                     (*/
+                RCt = _WsDirMapPath (
+                                    self,
+                                    TmpPath,
+                                    & TheEntry,
+                                    & ThePath
+                                    );
+                if ( RCt == 0 ) {
+                    * Entry = TheEntry;
+
+                    if ( EffPath != NULL ) {
+                        XFSPathAddRef ( ThePath );
+                        * EffPath = ThePath;
+                    }
+
+                    XFSPathRelease ( ThePath );
+                }
+
+                XFSPathRelease ( TmpPath );
+            }
+            else {
+                RCt = XFS_RC ( rcOutOfKDirectory );
+            }
+
+            XFSPathRelease ( DerPath );
+        }
+
+        XFSPathRelease ( WsPath );
+    }
+
+    if ( RCt != 0 ) {
+        if ( EffPath != NULL ) {
+            * EffPath = NULL;
+        }
+    }
+
+    return RCt;
+}   /* _WsDirVMapIt () */
+
+static
+rc_t
+_WsDirMapIt (
+            const struct XFSWsDir * self,
+            const struct _DirE ** Entry,
+            const struct XFSPath ** EffPath,   /* Could be NULL */
+            const char * Format,
+            ...
+)
+{
+    rc_t RCt;
+    va_list Args;
+
+    RCt = 0;
+
+    va_start ( Args, Format );
+    RCt = _WsDirVMapIt ( self, Entry, EffPath, Format, Args );
+    va_end ( Args );
+
+    return RCt;
+}   /* _WsDirMapIt () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*  Cryptonomifile-ile-wile                                          */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ (((    Here is some lyrics. Current version of KEncFile is not 
+  )))   thread safe, so I had to add mutex here. However, the only
+ (((    way to create KEncFile is call "KEncFileMakeInt ()" which
+  )))   allocates KEncFile, and theree is no any 'Init" methods.
+ (((    So, we can not just do it in normal 'inheritance way' That's
+  )))   why there is that ugle-moogle
+ (((*/
+struct _xEncFile {
+    struct KFile file;
+
+    struct KFile * enc_file;
+
+    struct KLock * mutabor;
+};
+
+static
+rc_t CC
+_EncFileDestroy ( struct KFile * self )
+{
+    struct _xEncFile * File;
+
+    File = ( struct _xEncFile * ) self;
+
+    if ( File != NULL ) {
+
+        if ( File -> mutabor != NULL ) {
+            KLockRelease ( File -> mutabor );
+
+            File -> mutabor = NULL;
+        }
+
+        if ( File -> enc_file != NULL ) {
+            KFileRelease ( File -> enc_file );
+
+            File -> enc_file = NULL;
+        }
+
+        free ( File );
+    }
+
+    return 0;
+}   /* _EncFileDestroy () */
+
+static
+struct KSysFile * CC
+_EncFileGetSysFile ( const struct KFile * self, uint64_t * Offset )
+{
+    struct _xEncFile * File = ( struct _xEncFile * ) self;
+
+    if ( File != NULL ) {
+        if ( File -> enc_file != NULL ) {
+            return KFileGetSysFile ( File -> enc_file, Offset );
+        }
+    }
+
+    return NULL;
+}   /* _EncFileGetSysFile () */
+
+static
+rc_t CC
+_EncFileRandomAccess ( const struct KFile * self )
+{
+    const struct _xEncFile * File = ( const struct _xEncFile * ) self;
+
+    XFS_CAN ( File )
+    XFS_CAN ( File -> enc_file )
+
+    return KFileRandomAccess ( File -> enc_file );
+}   /* _EncFileRandomAccess () */
+
+static
+rc_t CC
+_EncFileSize ( const struct KFile * self, uint64_t * Size )
+{
+    rc_t RCt;
+    const struct _xEncFile * File;
+
+    RCt = 0;
+    File = ( const struct _xEncFile * ) self;
+
+    XFS_CSA ( Size, 0 )
+    XFS_CAN ( File )
+    XFS_CAN ( Size )
+    XFS_CAN ( File -> enc_file )
+    XFS_CAN ( File -> mutabor )
+
+    LOG_LOC_ACQ ( __LINE__, File -> mutabor );
+    RCt = KLockAcquire ( File -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = KFileSize ( File -> enc_file, Size );
+
+        LOG_LOC_UNL ( __LINE__, File -> mutabor );
+        KLockUnlock ( File -> mutabor );
+    }
+
+    return RCt;
+}   /* _EncFileSize () */
+
+static
+rc_t CC
+_EncFileSetSize ( struct KFile * self, uint64_t Size )
+{
+    rc_t RCt;
+    const struct _xEncFile * File;
+
+    RCt = 0;
+    File = ( const struct _xEncFile * ) self;
+
+    XFS_CAN ( File )
+    XFS_CAN ( File -> enc_file )
+    XFS_CAN ( File -> mutabor )
+
+    LOG_LOC_ACQ ( __LINE__, File -> mutabor );
+    RCt = KLockAcquire ( File -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = KFileSetSize ( File -> enc_file, Size );
+
+        LOG_LOC_UNL ( __LINE__, File -> mutabor );
+        KLockUnlock ( File -> mutabor );
+    }
+
+    return RCt;
+}   /* _EncFileSetSize () */
+
+static
+rc_t CC
+_EncFileRead (
+            const struct KFile * self,
+            uint64_t Pos,
+            void * Bf,
+            size_t BfSz,
+            size_t * NumRead
+)
+{
+    rc_t RCt;
+    const struct _xEncFile * File;
+
+    RCt = 0;
+    File = ( const struct _xEncFile * ) self;
+
+    XFS_CSA ( NumRead, 0 )
+    XFS_CAN ( File )
+    XFS_CAN ( Bf )
+    XFS_CAN ( NumRead )
+    XFS_CAN ( File -> enc_file )
+    XFS_CAN ( File -> mutabor )
+
+    LOG_LOC_ACQ ( __LINE__, File -> mutabor );
+    RCt = KLockAcquire ( File -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = KFileRead ( File -> enc_file, Pos, Bf, BfSz, NumRead );
+
+        LOG_LOC_UNL ( __LINE__, File -> mutabor );
+        KLockUnlock ( File -> mutabor );
+    }
+
+    return RCt;
+}   /* _EncFileRead () */
+
+static
+rc_t CC
+_EncFileWrite (
+            struct KFile * self,
+            uint64_t Pos,
+            const void * Bf,
+            size_t BfSz,
+            size_t * NumWrote
+)
+{
+    rc_t RCt;
+    struct _xEncFile * File;
+
+    RCt = 0;
+    File = ( struct _xEncFile * ) self;
+
+    XFS_CSA ( NumWrote, 0 )
+    XFS_CAN ( File )
+    XFS_CAN ( Bf )
+    XFS_CAN ( NumWrote )
+    XFS_CAN ( File -> enc_file )
+    XFS_CAN ( File -> mutabor )
+
+    LOG_LOC_ACQ ( __LINE__, File -> mutabor );
+    RCt = KLockAcquire ( File -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = KFileWrite ( File -> enc_file, Pos, Bf, BfSz, NumWrote );
+
+        LOG_LOC_UNL ( __LINE__, File -> mutabor );
+        KLockUnlock ( File -> mutabor );
+    }
+
+    return RCt;
+}   /* _EncFileWrite () */
+
+static
+uint32_t CC
+_EncFileType ( const struct KFile * self )
+{
+    const struct _xEncFile * File = ( const struct _xEncFile * ) self;
+
+    if ( File != NULL ) {
+        if ( File -> enc_file != NULL ) {
+            return KFileType ( File -> enc_file );
+        }
+    }
+
+    return kptFile;
+}   /* _EncFileType () */
+                                
+static struct KFile_vt_v1 _svxEncFile = {
+                                        /* version */
+                                    1, 1,
+                                
+                                        /* 1.0 */
+                                    _EncFileDestroy,
+                                    _EncFileGetSysFile,
+                                    _EncFileRandomAccess,
+                                    _EncFileSize,
+                                    _EncFileSetSize,
+                                    _EncFileRead,
+                                    _EncFileWrite,
+                                
+                                        /* 1.1 */
+                                    _EncFileType
+                                    };
+
+static
+rc_t CC
+_EncFileMake ( struct KFile * EncFile, struct KFile ** RetFile )
+{
+    rc_t RCt;
+    struct _xEncFile * File;
+
+    RCt = 0;
+    File = NULL;
+
+    XFS_CSAN ( RetFile )
+    XFS_CAN ( EncFile )
+    XFS_CAN ( RetFile )
+
+    File = calloc ( 1, sizeof ( struct _xEncFile ) );
+    if ( File == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = KFileInit (
+                        & ( File -> file ),
+                        ( const KFile_vt * ) & _svxEncFile,
+                        "XFSEncFile",
+                        "EncFile",
+                        EncFile -> read_enabled,
+                        EncFile -> write_enabled
+                        );
+        if ( RCt == 0 ) {
+            RCt = KLockMake ( & ( File -> mutabor ) );
+            if ( RCt == 0 ) {
+                File -> enc_file = EncFile;
+
+                * RetFile = & ( File -> file );
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * RetFile = NULL;
+
+        KFileRelease ( & ( File -> file ) );
+    }
+
+    return RCt;
+}   /* _EncFileMake () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*  Cryptonomicom-om-um                                              */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static
+rc_t CC
+_OpenEncryptedFileRead (
+                const struct KFile ** File,
+                struct KKey * Key,
+                const char * Path,
+                ...
+)
+{
+    rc_t RCt;
+    struct KDirectory * nDir;
+    const struct KFile * rFile, * xFile;
+    va_list Args;
+
+    RCt = 0;
+    nDir = NULL;
+    rFile = xFile = NULL;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( File )
+    XFS_CAN ( Key )
+    XFS_CAN ( Path )
+
+    RCt = KDirectoryNativeDir ( & nDir );
+    if ( RCt == 0 ) {
+        va_start ( Args, Path );
+        RCt = KDirectoryVOpenFileRead ( nDir, & rFile, Path, Args );
+        va_end ( Args );
+        if ( RCt == 0 ) {
+            RCt = KEncFileMakeRead ( & xFile, rFile, Key );
+
+            KFileRelease ( rFile );
+            if ( RCt == 0 ) {
+                RCt = _EncFileMake ( ( struct KFile * ) xFile, ( struct KFile ** ) File );
+            }
+else { RCt = XFS_RC ( rcBusy ); pLogMsg ( klogDebug, " RET_BUSY [$(line)]", "line=%d", __LINE__ ); }
+        }
+
+        KDirectoryRelease ( nDir );
+    }
+
+    return RCt;
+}   /* _OpenEncryptedFileRead () */
+
+static
+rc_t CC
+_OpenVEncryptedFileWrite (
+                struct KFile ** File,
+                struct KKey * Key,
+                bool Update,
+                const char * Path,
+                va_list VaList
+)
+{
+    rc_t RCt;
+    struct KDirectory * nDir;
+    struct KFile * wFile, * xFile;
+    va_list Args;
+
+    RCt = 0;
+    nDir = NULL;
+    wFile = xFile = NULL;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( File )
+    XFS_CAN ( Key )
+    XFS_CAN ( Path )
+
+/* because of we unable to read encrypted file header in Write Only
+ * mode we are always opening files in Update mode. I have no idea how
+ * to fix that problem. Thinking about it.
+ */
+#ifdef _ENCODED_FILE_UPDATE_ALWAYS_
+    Update = true;
+#endif /* _ENCODED_FILE_UPDATE_ALWAYS_ */
+
+    RCt = KDirectoryNativeDir ( & nDir );
+    if ( RCt == 0 ) {
+        va_copy ( Args, VaList );
+        RCt = KDirectoryVOpenFileWrite (
+                                        nDir,
+                                        & wFile,
+                                        Update,
+                                        Path,
+                                        Args
+                                        );
+        va_end ( Args );
+        if ( RCt == 0 ) {
+            RCt = Update
+                    ? KEncFileMakeUpdate ( & xFile, wFile, Key )
+                    : KEncFileMakeWrite ( & xFile, wFile, Key )
+                    ;
+            KFileRelease ( wFile );
+
+            if ( RCt == 0 ) {
+                RCt = _EncFileMake ( ( struct KFile * ) xFile, File );
+            }
+else { RCt = XFS_RC ( rcBusy ); pLogMsg ( klogDebug, " RET_BUSY [$(line)]", "line=%d", __LINE__ ); }
+
+        }
+
+        KDirectoryRelease ( nDir );
+    }
+
+    return RCt;
+}   /* _OpenVEncryptedFileWrite () */
+
+static
+rc_t CC
+_OpenEncryptedFileWrite (
+                struct KFile ** File,
+                struct KKey * Key,
+                bool Update,
+                const char * Path,
+                ...
+)
+{
+    rc_t RCt;
+    va_list Args;
+
+    RCt = 0;
+
+    va_start ( Args, Path );
+    RCt = _OpenVEncryptedFileWrite ( File, Key, Update, Path, Args );
+    va_end ( Args );
+
+    return RCt;
+}   /* _OpenEncryptedFileWrite () */
+
+static
+rc_t CC
+_CreateEncryptedFile (
+                struct KFile ** File,
+                const struct KKey * Key,
+                bool Update,
+                uint32_t Access,
+                KCreateMode Cmode,
+                const char * Format,
+                ...
+)
+{
+    rc_t RCt;
+    struct KDirectory * NativeDir;
+    struct KFile * TheFile, * EncFile;
+    va_list Args;
+
+    RCt = 0;
+    NativeDir = NULL;
+    TheFile = EncFile = NULL;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( File )
+    XFS_CAN ( Key )
+    XFS_CAN ( Format )
+
+/* because of we unable to read encrypted file header in Write Only
+ * mode we are always opening files in Update mode. I have no idea how
+ * to fix that problem. Thinking about it.
+ */
+#ifdef _ENCODED_FILE_UPDATE_ALWAYS_
+    Update = true;
+#endif /* _ENCODED_FILE_UPDATE_ALWAYS_ */
+
+    RCt = KDirectoryNativeDir ( & NativeDir );
+    if ( RCt == 0 ) {
+            /* Create File */
+        va_start ( Args, Format );
+        RCt = KDirectoryVCreateFile (
+                                    NativeDir,
+                                    & TheFile,
+                                    Update,
+                                    Access,
+                                    Cmode,
+                                    Format,
+                                    Args
+                                    );
+        va_end ( Args );
+        if ( RCt == 0 ) {
+                /* Create Encrypted File */
+            RCt = Update
+                        ? KEncFileMakeUpdate ( & EncFile, TheFile, Key )
+                        : KEncFileMakeWrite ( & EncFile, TheFile, Key )
+                        ;
+
+            KFileRelease ( TheFile );
+
+            if ( RCt == 0 ) {
+                RCt = _EncFileMake ( ( struct KFile * ) EncFile, File );
+                // * File = EncFile;
+            }
+        }
+
+        KDirectoryRelease ( NativeDir );
+    }
+
+    return RCt;
+}   /* _CreateEncryptedFile () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*  Some common things                                               */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*||+\
+ +||+   Don't forget to free 'EntryName'
+\+||*/
+static
+rc_t CC
+_GetNameAndMapParentEntryNoLock (
+                        struct  XFSWsDir * self,
+                        const struct _DirE ** ParentEntry,
+                        const struct XFSPath ** EffPath,
+                        const char ** EntryName,
+                        const char * Format,
+                        va_list Args
+)
+{
+    rc_t RCt;
+    const struct _DirE * RetEntry;
+    const struct XFSPath * RetEffPath;
+    const struct XFSPath * ThePath, * ParPath;
+    va_list xArgs;
+
+    RCt = 0;
+    RetEntry = NULL;
+    RetEffPath = NULL;
+    ThePath = ParPath = NULL;
+
+    XFS_CSAN ( ParentEntry )
+    XFS_CSAN ( EffPath )
+    XFS_CSAN ( EntryName )
+    XFS_CAN ( self )
+    XFS_CAN ( ParentEntry )
+    XFS_CAN ( EffPath )
+    XFS_CAN ( EntryName )
+    XFS_CAN ( Format )
+
+        /*) Simple : Map parent directory, create file, add record about
+         (*/
+    va_copy ( xArgs, Args );
+    RCt = XFSPathVMakeAbsolute ( & ThePath, false, Format, xArgs );
+    va_end ( xArgs );
+    if ( RCt == 0 ) {
+        RCt = XFSPathParent ( ThePath, & ParPath );
+        if ( RCt == 0 ) {
+            RCt = _WsDirMapIt (
+                            self,
+                            & RetEntry,
+                            & RetEffPath,
+                            XFSPathGet ( ParPath )
+                            );
+            if ( RCt == 0 ) {
+                RCt = _DirECheckLoadContent (
+                                            RetEntry,
+                                            _WsDirKey ( self ),
+                                            "%s/%s",
+                                            _WsDirPath ( self ),
+                                            XFSPathGet ( RetEffPath )
+                                            );
+                if ( RCt == 0 ) {
+                    RCt = XFS_StrDup (
+                                    XFSPathName ( ThePath ),
+                                    EntryName
+                                    );
+                    if ( RCt == 0 ) {
+                        * ParentEntry = RetEntry;
+                        * EffPath = RetEffPath;
+                    }
+                }
+            }
+
+            XFSPathRelease ( ParPath );
+        }
+
+        XFSPathRelease ( ThePath );
+    }
+
+    if ( RCt != 0 ) {
+        * ParentEntry = NULL;
+        * EffPath = NULL;
+
+        if ( RetEffPath != NULL ) {
+            XFSPathRelease ( RetEffPath );
+
+            RetEffPath = NULL;
+        }
+
+        if ( * EntryName != NULL ) {
+            free ( ( char * ) * EntryName );
+
+            * EntryName = NULL;
+        }
+
+        if ( RetEntry != NULL ) {
+            _DirERelease ( RetEntry );
+        }
+    }
+
+    return RCt;
+}   /* _GetNameAndMapParentEntryNoLock () */
+
+static
+rc_t CC
+_GetCNameAndMapParentEntryNoLock (
+                        struct  XFSWsDir * self,
+                        const struct _DirE ** ParentEntry,
+                        const struct XFSPath ** EffPath,
+                        const char ** EntryName,
+                        const char * Format,
+                        ...
+)
+{
+    rc_t RCt;
+
+    va_list Args;
+
+    va_start ( Args, Format );
+    RCt = _GetNameAndMapParentEntryNoLock (
+                                        self,
+                                        ParentEntry,
+                                        EffPath,
+                                        EntryName,
+                                        Format,
+                                        Args
+                                        );
+    va_end ( Args );
+
+    return RCt;
+}   /* _GetCNameAndMapParentEntryNoLock () */
+
+static
+rc_t CC
+_GetContentEntryAndLock (
+                        const struct _DirE * Parent,
+                        const struct _DirE ** Entry,
+                        const char * EntryName
+)
+{
+    rc_t RCt;
+    const struct _DirE * RetEntry;
+
+    RCt = 0;
+    RetEntry = NULL;
+
+    XFS_CSAN ( Entry )
+    XFS_CAN ( Parent )
+    XFS_CAN ( Entry )
+    XFS_CAN ( EntryName )
+
+        /*) Locking
+         (*/
+    LOG_LOC_ACQ ( __LINE__, Parent -> mutabor );
+    RCt = KLockAcquire ( Parent -> mutabor );
+    if ( RCt == 0 ) {
+            /*) Getting content entry for file
+             (*/
+        RCt = _DirEGetEntryNoLock ( Parent , EntryName, & RetEntry );
+        if ( RCt == 0 ) {
+            * Entry = RetEntry;
+        }
+        else {
+            LOG_LOC_UNL ( __LINE__, Parent -> mutabor );
+            KLockUnlock ( Parent -> mutabor );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Entry = NULL; 
+    }
+
+    return RCt;
+}   /* _GetContentEntryAndLock () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*  Dirty virtual table                                              */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirDestroy
+ */
+static
+rc_t CC
+XFSWsDirDestroy ( struct KDirectory * self )
+{
+    struct XFSWsDir * Dir = ( struct XFSWsDir * ) self;
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirDestroy] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    if ( Dir == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Dir -> entry != NULL ) {
+        _DirERelease ( Dir -> entry );
+        Dir -> entry = NULL;
+    }
+
+    if ( Dir -> passwd != NULL ) {
+        free ( ( char * ) Dir -> passwd );
+        Dir -> passwd = NULL;
+    }
+
+    if ( Dir -> enc_type != NULL ) {
+        free ( ( char * ) Dir -> enc_type );
+        Dir -> enc_type = NULL;
+    }
+
+    Dir -> update = false;
+
+    free ( Dir );
+
+    return 0;
+}   /* XFSWsDirDestroy () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirList
+ *  create a directory listing
+ *
+ *  "list" [ OUT ] - return parameter for list object
+ *
+ *  "path" [ IN, NULL OKAY ] - optional parameter for target
+ *  directory. if NULL, interpreted to mean "."
+ *
+ * [RET] rc_t		    0 for success; anything else for a failure
+ *						see itf/klib/rc.h for general details
+ * [IN]	 const XFSWsDir *	self		Object oriented C; XFSWsDir object for this method
+ * [OUT] KNamelist ** listp,
+ * [IN]  bool ( * f )( const KDirectory *, const char *, void * )
+ * [IN]  void *	data
+ * [IN]  const char * path
+ * [IN]  va_list args
+ */
+static
+rc_t CC
+XFSWsDirList (
+                const struct KDirectory * self,
+                struct KNamelist ** List,
+                bool ( CC * f ) (
+                            const struct KDirectory * dir,
+                            const char * name,
+                            void * data
+                            ),
+                void * Data,
+                const char * Path,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct XFSPath * TheEffPath;
+    struct KNamelist * TheList;
+    va_list xArgs;
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirList] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    RCt = 0;
+    Dir = ( struct XFSWsDir * ) self;
+    Entry = NULL;
+    TheEffPath = NULL;
+    TheList = NULL;
+
+    XFS_CSAN ( List )
+    XFS_CAN ( self )
+    XFS_CAN ( List )
+    XFS_CAN ( Path )
+
+        /*) first we are trying to map content entry according to path
+         (*/
+    va_copy ( xArgs, Args );
+    RCt = _WsDirVMapIt (
+                    Dir,
+                    & Entry,
+                    & TheEffPath,
+                    Path,
+                    Args
+                    );
+    va_end ( xArgs );
+    if ( RCt == 0 ) {
+        if ( ! Entry -> is_folder || Entry -> content == NULL ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+/*)
+ || IMPORTANT: For now Filtering function is not used
+ || TODO!!!!!!
+ (*/
+            LOG_LOC_ACQ ( __LINE__, Entry -> mutabor );
+            RCt = KLockAcquire ( Entry -> mutabor );
+            if ( RCt == 0 ) {
+
+                RCt = _DirEListEntriesNoLock ( Entry, & TheList );
+                if ( RCt == 0 ) {
+                    * List = TheList;
+                }
+
+                LOG_LOC_UNL ( __LINE__, Entry -> mutabor );
+                KLockUnlock ( Entry -> mutabor );
+            }
+        }
+
+        XFSPathRelease ( TheEffPath );
+        _DirERelease ( Entry );
+    }
+
+    return RCt;
+}   /* XFSWsDirList () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirVisit
+ *  visit each path under designated directory,
+ *  recursively if so indicated
+ *
+ *  "recurse" [ IN ] - if non-zero, recursively visit sub-directories
+ *
+ *  "f" [ IN ] and "data" [ IN, OPAQUE ] - function to execute
+ *  on each path. receives a base directory and relative path
+ *  for each entry, where each path is also given the leaf name
+ *  for convenience. if "f" returns non-zero, the iteration will
+ *  terminate and that value will be returned. NB - "dir" will not
+ *  be the same as "self".
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+static 
+rc_t CC
+XFSWsDirVisit (
+                const struct KDirectory * self, 
+                bool Recurse,
+                rc_t ( CC * Func ) (
+                            const struct KDirectory *,
+                            uint32_t,
+                            const char *,
+                            void *
+                            ), 
+                void * Data,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    const struct XFSWsDir * Dir;
+    const struct XFSPath * Path;
+    const struct XFSPath * RelPath;
+    const struct _DirE * Entry;
+    va_list xArgs;
+
+    RCt = 0;
+    Dir = ( const struct XFSWsDir * ) self;
+    Path = NULL;
+    RelPath = NULL;
+    Entry = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Func )
+    XFS_CAN ( Format )
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirVisit] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    va_copy ( xArgs, Args );
+    RCt = XFSPathVMakeAbsolute ( & Path, false, Format, xArgs );
+    va_end ( xArgs );
+    if ( RCt == 0 ) {
+        if ( XFSPathSIsChild (
+                            _WsDirPath ( Dir ),
+                            XFSPathGet ( Path ),
+                            & RelPath
+                            ) ) {
+                /* Mapping Node and path
+                */
+           va_copy ( xArgs, Args );
+           RCt = _WsDirVMapIt ( Dir, & Entry, NULL, Format, xArgs ); 
+           va_end ( xArgs );
+           if ( RCt == 0 ) {
+                /* check if it is a folder
+                 */
+                if ( Entry -> is_folder ) {
+                    RCt = _DirEVisitNoLock (
+                                    Entry,
+                                    self,
+                                    Recurse,
+                                    Func,
+                                    Data,
+                                    XFSPathGet ( RelPath )
+                                    );
+                }
+                else {
+                    RCt = XFS_RC ( rcInvalid );
+                }
+
+                _DirERelease ( Entry );
+            }
+
+            XFSPathRelease ( RelPath );
+        }
+        else {
+            RCt = XFS_RC ( rcOutOfKDirectory );
+        }
+
+        XFSPathRelease ( Path );
+    }
+
+
+    return RCt;
+}   /* XFSWsDirVisit () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirVisitUpdate
+ */
+static
+rc_t CC
+XFSWsDirVisitUpdate (
+                struct KDirectory * self,
+                bool recurse,
+                rc_t ( CC * f ) (
+                            struct KDirectory *,
+                            uint32_t,
+                            const char *
+                            ,void *
+                            ),
+                void * data,
+                const char * path,
+                va_list args
+)
+{
+/*)
+ || JOJOBA
+ (*/
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirVisitUpdate] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+    return RC (rcFS, rcDirectory, rcUpdating, rcFunction, rcUnsupported);
+}   /* XFSWsDirVisitUpdate () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirPathType
+ *  returns a KPathType
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native character set
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ *
+ * [RET] uint32_t
+ * [IN]  const XFSWsDir *	self		Object oriented C; XFSWsDir object for this method
+ * [IN]  const char *		path
+ * [IN]  va_list		args
+ */
+static
+uint32_t CC
+XFSWsDirPathType (
+                const struct KDirectory * self,
+                const char * Path,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    uint32_t RetVal;
+    va_list xArgs;
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirPathType] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    RCt = 0;
+    Dir = ( struct XFSWsDir * ) self;
+    Entry = NULL;
+    RetVal = kptNotFound;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Path )
+
+    va_copy ( xArgs, Args );
+    RCt = _WsDirVMapIt (
+                    Dir,
+                    & Entry,
+                    NULL,
+                    Path,
+                    xArgs
+                    );
+    va_end ( xArgs );
+    if ( RCt == 0 ) {
+        RetVal = Entry -> is_folder ? kptDir : kptFile;
+
+        _DirERelease ( Entry );
+
+        return RetVal;
+    }
+    else {
+        if ( RCt == XFS_RC ( rcNotFound ) ) {
+            return kptNotFound;
+        }
+    }
+
+    return kptBadPath;
+}   /* XFSWsDirPathType () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirResolvePath
+ *
+ *  resolves path to an absolute or directory-relative path
+ *
+ * [IN]  const XFSWsDir *self		Objected oriented self
+ * [IN]	 bool 		absolute	if non-zero, always give a path starting
+ *  					with '/'. NB - if the directory is 
+ *					chroot'd, the absolute path
+ *					will still be relative to directory root.
+ * [OUT] char *		resolved	buffer for NUL terminated result path in 
+ *					directory-native character set
+ * [IN]	 size_t		rsize		limiting size of resolved buffer
+ * [IN]  const char *	path		NUL terminated string in directory-native
+ *					character set denoting target path. 
+ *					NB - need not exist.
+ *
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC
+XFSWsDirResolvePath (
+                const struct KDirectory * self,
+                bool Absolute,
+                char * Resolved,
+                size_t Rsize,
+                const char * Path,
+                va_list Args
+)
+{
+    rc_t RCt;
+    va_list xArgs;
+
+    RCt = 0;
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirResolvePath] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    va_copy ( xArgs, Args );
+    RCt = XFS_VResolvePath ( Absolute, Resolved, Rsize, Path, xArgs );
+    va_end ( xArgs );
+
+    return RCt;
+}   /* XFSWsDirResolvePath () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirResolveAlias
+ *  resolves an alias path to its immediate target
+ *  NB - the resolved path may be yet another alias
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting an object presumed to be an alias.
+ *
+ *  "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ *  NUL terminated result path in directory-native character set
+ *
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC
+XFSWsDirResolveAlias (
+                const struct KDirectory * self, 
+				bool absolute,
+				char * resolved,
+				size_t rsize,
+				const char * alias,
+				va_list args
+)
+{
+/*)
+ || JOJOBA
+ (*/
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirResolveAlias] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+    return RC (rcFS, rcDirectory, rcAccessing, rcFunction, rcUnsupported);
+}   /* XFSWsDirResolveAlias () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirRename
+ *  rename an object accessible from directory, replacing
+ *  any existing target object of the same type
+ *
+ *  "from" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ *
+ *  "to" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting existing object
+ */
+static
+rc_t CC
+XFSWsDirRename (
+                struct KDirectory * self,
+                bool Force,
+                const char * OldName,
+                const char * NewName
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * OldParent, * NewParent;
+    const struct XFSPath * OldEffPath, * NewEffPath;
+    const char * OldEntryName, * NewEntryName;
+
+    RCt = 0;
+    Dir = ( struct XFSWsDir * ) self;
+
+    XFS_CAN ( self )
+    XFS_CAN ( OldName )
+    XFS_CAN ( NewName )
+
+    if ( ! Dir -> update ) {
+        return XFS_RC ( rcUnauthorized );
+    }
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirRename] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+        /*||   There are two steps : move factual file if it
+          ||   is necessary, and make corrections in content
+          ||   files
+          ||*/
+
+        /* First we should resolve parent directory for both
+         * path and decide if we should simple rename file withou
+         * moving or we should move file first.
+         */
+    RCt = _GetCNameAndMapParentEntryNoLock (
+                                            Dir,
+                                            & OldParent,
+                                            & OldEffPath,
+                                            & OldEntryName,
+                                            OldName
+                                            );
+    if ( RCt == 0 ) {
+        RCt = _GetCNameAndMapParentEntryNoLock (
+                                                Dir,
+                                                & NewParent,
+                                                & NewEffPath,
+                                                & NewEntryName,
+                                                NewName
+                                                );
+        if ( RCt == 0 ) {
+
+                /*  Since we are cacheing _DirE instances, it is 
+                 *  normal to compare pointers here :lol:
+                 */
+            if ( OldParent == NewParent ) {
+                /* No need to move */
+                LOG_LOC_ACQ ( __LINE__, OldParent -> mutabor );
+                RCt = KLockAcquire ( OldParent -> mutabor );
+                if ( RCt == 0 ) {
+                    RCt = _DirERenameEntryNoLock (
+                                                OldParent,
+                                                OldEntryName,
+                                                NewEntryName
+                                                );
+                    if ( RCt == 0 ) {
+                        RCt = _SyncronizeDirectoryContentNoLock (
+                                                            OldParent
+                                                            );
+                    }
+                    LOG_LOC_UNL ( __LINE__, OldParent -> mutabor );
+                    KLockUnlock ( OldParent -> mutabor );
+                }
+            }
+            else {
+                    /* Need to move */
+                RCt = _DirEMoveEntry (
+                                    OldParent,
+                                    OldEntryName,
+                                    NewParent,
+                                    NewEntryName
+                                    );
+            }
+
+            free ( ( char * ) NewEntryName );
+            XFSPathRelease ( NewEffPath );
+            _DirERelease ( NewParent );
+        }
+
+        free ( ( char * ) OldEntryName );
+        XFSPathRelease ( OldEffPath );
+        _DirERelease ( OldParent );
+    }
+
+    return RCt;
+}   /* XFSWsDirRename () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirRemove
+ *  remove an accessible object from its directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "force" [ IN ] - if non-zero and target is a directory,
+ *  remove recursively
+ */
+static
+rc_t CC
+XFSWsDirRemove (
+                struct KDirectory * self,
+                bool Force,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct _DirE * Parent;
+    const struct XFSPath * EffPath;
+    const char * EntryName;
+    struct KDirectory * NatDir;
+    bool HasEntries;
+    va_list xArgs;
+
+    RCt = 0;
+    Entry = NULL;
+    Parent = NULL;
+    EffPath = NULL;
+    Dir = ( struct XFSWsDir * ) self;
+    EntryName = NULL;
+    NatDir = NULL;
+    HasEntries = false;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Format )
+
+    if ( ! Dir -> update ) {
+        return XFS_RC ( rcUnauthorized );
+    }
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirRemove] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+        /*|| Simple: map it's parent and remove entry ||*/
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+        va_copy ( xArgs, Args );
+        RCt = _GetNameAndMapParentEntryNoLock (
+                                        Dir,
+                                        & Parent,
+                                        & EffPath,
+                                        & EntryName,
+                                        Format,
+                                        xArgs
+                                        );
+        va_end ( xArgs );
+        if ( RCt == 0 ) {
+            RCt = _GetContentEntryAndLock ( Parent, & Entry, EntryName );
+            if ( RCt == 0 ) {
+                HasEntries = _DirEHasEntries ( Entry );
+
+                if ( ( ! HasEntries ) || ( HasEntries && Force ) ) {
+                    if ( RCt == 0 ) {
+                /*|| IMPORTANT : we are not going to do it in right and 
+                  ||             legal way by visiting each entry. Here
+                  ||             could be trach remained ( not removed
+                  ||             files and directories )
+                  ||             Also we are forceing Force flag 8-|
+                  ||*/
+                        RCt = _DirEDelEntryNoLock ( Parent, Entry );
+                        if ( RCt == 0 ) {
+                            RCt = _SyncronizeDirectoryContentNoLock ( Parent );
+                            if ( RCt == 0 ) {
+                                RCt = KDirectoryRemove (
+                                                NatDir,
+                                                true,
+                                                "%s/%s/%s",
+                                                _WsDirPath ( Dir ),
+                                                XFSPathGet ( EffPath ),
+                                                Entry -> eff_name
+                                                );
+                            }
+                        }
+                    }
+                }
+
+                RCt = _DirERelease ( Entry );
+            }
+
+            free ( ( char * ) EntryName );
+
+            LOG_LOC_UNL ( __LINE__, Parent -> mutabor );
+            KLockUnlock ( Parent -> mutabor );
+
+            XFSPathRelease ( EffPath );
+
+            _DirERelease ( Parent );
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* XFSWsDirRemove () */
+
+static
+rc_t CC
+XFSWsDirRemoveU (
+                struct KDirectory * self,
+                bool Force,
+                const char * Format,
+                ...
+)
+{
+    rc_t RCt;
+    va_list Args;
+
+    va_start ( Args, Format );
+    RCt = XFSWsDirRemove ( self, Force, Format, Args );
+    va_end ( Args );
+
+    return RCt;
+}   /* XFSWsDirRemoveU () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirClearDir
+ *  remove all directory contents
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "force" [ IN ] - if non-zero and directory entry is a
+ *  sub-directory, remove recursively
+ */
+static
+rc_t CC
+XFSWsDirClearDir (
+                struct KDirectory * self,
+                bool Force,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    struct KNamelist * List;
+    uint32_t LQty, Idx;
+    const char * SubName;
+    const struct XFSPath * Path;
+    va_list xArgs;
+
+    RCt = 0;
+    Dir = ( struct XFSWsDir * ) self;
+    List = NULL;
+    LQty = Idx = 0;
+    SubName = NULL;
+    Path = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Format )
+
+    if ( ! Dir -> update ) {
+        return XFS_RC ( rcUnauthorized );
+    }
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirClearDir] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+        /* Second we should list directory entries
+         */
+    va_copy ( xArgs, Args );
+    RCt = XFSWsDirList ( self, & List, NULL, NULL, Format, xArgs );
+    va_end ( xArgs );
+    if ( RCt == 0 ) {
+            /* Removing content one by one
+             */
+        RCt = KNamelistCount ( List, & LQty );
+        if ( RCt == 0 && 0 < LQty ) {
+                /* First we need path
+                 */
+            va_copy ( xArgs, Args );
+            RCt = XFSPathVMakeAbsolute ( & Path, false, Format, xArgs );
+            va_end ( xArgs );
+            if ( RCt == 0 ) {
+                for ( Idx = 0; Idx < LQty; Idx ++ ) {
+                    RCt = KNamelistGet ( List, Idx, & SubName );
+                    if ( RCt != 0 ) {
+                        break;
+                    }
+
+                    RCt = XFSWsDirRemoveU (
+                                            self,
+                                            Force,
+                                            "%s/%s",
+                                            XFSPathGet ( Path ),
+                                            SubName
+                                            );
+
+                    if ( RCt != 0 ) {
+                        break;
+                    }
+                }
+
+                XFSPathRelease ( Path );
+            }
+        }
+
+        KNamelistRelease ( List );
+    }
+
+    return RCt;
+}   /* XFSWsDirClearDir () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirAccess
+ *  get access to object
+ *
+ *  "access" [ OUT ] - return parameter for Unix access mode
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC
+XFSWsDirVAccess (
+                const struct KDirectory * self,
+			    uint32_t * Access,
+			    const char * Format,
+			    va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct XFSPath * Path;
+    struct KDirectory * NatDir;
+    va_list xArgs;
+
+    RCt = 0;
+    Dir = ( struct XFSWsDir * ) self;
+    Entry = NULL;
+    Path = NULL;
+    NatDir = NULL;
+
+    XFS_CSA ( Access, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Access )
+    XFS_CAN ( Format )
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirVAccess] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+
+        va_copy ( xArgs, Args );
+        RCt = _WsDirVMapIt (
+                        Dir,
+                        & Entry,
+                        & Path,
+                        Format,
+                        xArgs
+                        );
+        va_end ( xArgs );
+        if ( RCt == 0 ) {
+            RCt = KDirectoryAccess (
+                                NatDir,
+                                Access,
+                                "%s/%s",
+                                _WsDirPath ( Dir ),
+                                XFSPathGet ( Path )
+                                );
+
+            XFSPathRelease ( Path );
+            _DirERelease ( Entry );
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* XFSWsDirVAccess () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirSetAccess
+ *  set access to object a la Unix "chmod"
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "access" [ IN ] and "mask" [ IN ] - definition of change
+ *  where "access" contains new bit values and "mask defines
+ *  which bits should be changed.
+ *
+ *  "recurse" [ IN ] - if non zero and "path" is a directory,
+ *  apply changes recursively.
+ */
+static
+rc_t CC
+XFSWsDirSetAccess (
+                struct KDirectory * self,
+			    bool Recurse,
+			    uint32_t Access,
+			    uint32_t Mask,
+			    const char * Format,
+			    va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct XFSPath * Path;
+    struct KDirectory * NatDir;
+    va_list xArgs;
+
+    RCt = 0;
+    Dir = ( struct XFSWsDir * ) self;
+    Entry = NULL;
+    Path = NULL;
+    NatDir = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Format )
+
+    if ( ! Dir -> update ) {
+        return XFS_RC ( rcUnauthorized );
+    }
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirSetAccess] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+
+        va_copy ( xArgs, Args );
+        RCt = _WsDirVMapIt (
+                        Dir,
+                        & Entry,
+                        & Path,
+                        Format,
+                        xArgs
+                        );
+        va_end ( xArgs );
+        if ( RCt == 0 ) {
+            RCt = KDirectorySetAccess (
+                                NatDir,
+                                Recurse,
+                                Access,
+                                Mask,
+                                "%s/%s",
+                                _WsDirPath ( Dir ),
+                                XFSPathGet ( Path )
+                                );
+
+            XFSPathRelease ( Path );
+            _DirERelease ( Entry );
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* XFSWsDirSetAccess () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirCreateAlias
+ *  creates a path alias according to create mode
+ *
+ *  "targ" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target object
+ *
+ *  "alias" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target alias
+ *
+ *  "access" [ IN ] - standard Unix directory access mode
+ *  used when "mode" has kcmParents set and alias path does
+ *  not exist.
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC
+XFSWsDirCreateAlias (
+                struct KDirectory * self,
+			    uint32_t access,
+			    KCreateMode mode,
+			    const char * targ,
+			    const char * alias
+)
+{
+    assert (self != NULL);
+    assert (targ != NULL);
+    assert (alias != NULL);
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirCreateAlias] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+/*)
+ || JOJOBA
+ (*/
+    return RC (rcFS, rcDirectory, rcCreating, rcSelf, rcUnsupported);
+}   /* XFSWsDirCreateAlias () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirOpenFileRead
+ *  opens an existing file with read-only access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC
+XFSWsDirOpenFileRead (
+                const struct KDirectory * self,
+                const struct KFile ** File,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct _DirE * Parent;
+    const char * EntryName;
+    const struct XFSPath * EffPath;
+    va_list xArgs;
+
+    RCt = 0;
+    Entry = NULL;
+    EffPath = NULL;
+    EntryName = NULL;
+    Dir = ( struct XFSWsDir * ) self;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( self )
+    XFS_CAN ( File )
+    XFS_CAN ( Format )
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirOpenFileRead] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+        /*) Mapping parent directory 
+         (*/
+    va_copy ( xArgs, Args );
+    RCt = _GetNameAndMapParentEntryNoLock (
+                                        Dir,
+                                        & Parent,
+                                        & EffPath,
+                                        & EntryName,
+                                        Format,
+                                        xArgs
+                                        );
+    va_end ( xArgs );
+    if ( RCt == 0 ) {
+        RCt = _GetContentEntryAndLock ( Parent, & Entry, EntryName );
+        if ( RCt == 0 ) {
+                /*) Opening file 
+                 (*/
+            RCt = _OpenEncryptedFileRead (
+                                    File,
+                                    ( struct KKey * ) _WsDirKey ( Dir ),
+                                    "%s/%s/%s",
+                                    _WsDirPath ( Dir ),
+                                    XFSPathGet ( EffPath ),
+                                    Entry -> eff_name
+                                    );
+
+            LOG_LOC_UNL ( __LINE__, Parent -> mutabor );
+            KLockUnlock ( Parent -> mutabor );
+            _DirERelease ( Entry );
+        }
+
+        free ( ( char * ) EntryName );
+
+        XFSPathRelease ( EffPath );
+
+        _DirERelease ( Parent );
+    }
+
+    return RCt;
+}   /* XFSWsDirOpenFileRead () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirOpenFileWrite
+ *  opens an existing file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ */
+static
+rc_t CC
+XFSWsDirOpenFileWrite (
+                struct KDirectory * self,
+                struct KFile ** File,
+                bool Update,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct _DirE * Parent;
+    const char * EntryName;
+    const struct XFSPath * EffPath;
+    va_list xArgs;
+
+    RCt = 0;
+    Entry = NULL;
+    Parent = NULL;
+    EffPath = NULL;
+    EntryName = NULL;
+    Dir = ( struct XFSWsDir * ) self;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( self )
+    XFS_CAN ( File )
+    XFS_CAN ( Format )
+
+    if ( ! Dir -> update ) {
+        return XFS_RC ( rcUnauthorized );
+    }
+
+// #ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirOpenFileWrite] [$(dir)]", "dir=%p", ( void * ) self );
+// #endif /* JOJOBA */
+
+        /*) Mapping parent directory 
+         (*/
+    va_copy ( xArgs, Args );
+    RCt = _GetNameAndMapParentEntryNoLock (
+                                        Dir,
+                                        & Parent,
+                                        & EffPath,
+                                        & EntryName,
+                                        Format,
+                                        xArgs
+                                        );
+    va_end ( xArgs );
+    if ( RCt == 0 ) {
+        RCt = _GetContentEntryAndLock ( Parent, & Entry, EntryName );
+        if ( RCt == 0 ) {
+                /*) Opening file
+                 (*/
+            RCt = _OpenEncryptedFileWrite (
+                                    File,
+                                    ( struct KKey * ) _WsDirKey ( Dir ),
+                                    Update,
+                                    "%s/%s/%s",
+                                    _WsDirPath ( Dir ),
+                                    XFSPathGet ( EffPath ),
+                                    Entry -> eff_name
+                                    );
+
+            LOG_LOC_UNL ( __LINE__, Parent -> mutabor );
+            KLockUnlock ( Parent -> mutabor );
+            _DirERelease ( Entry );
+        }
+
+        free ( ( char * ) EntryName );
+
+        XFSPathRelease ( EffPath );
+
+        _DirERelease ( Parent );
+    }
+
+    return RCt;
+}   /* XFSWsDirOpenFileWrite () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirCreateFile
+ *  opens a file with write access
+ *
+ *  "f" [ OUT ] - return parameter for newly opened file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ *  "update" [ IN ] - if non-zero, open in read/write mode
+ *  otherwise, open in write-only mode
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC
+XFSWsDirCreateFile	(
+                struct KDirectory * self,
+                struct KFile ** File,
+                bool Update,
+                uint32_t Access,
+                KCreateMode Cmode,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct _DirE * Parent;
+    const char * EntryName;
+    const struct XFSPath * EffPath;
+    va_list xArgs;
+
+    RCt = 0;
+    Entry = NULL;
+    Parent = NULL;
+    EffPath = NULL;
+    EntryName = NULL;
+    Dir = ( struct XFSWsDir * ) self;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( self )
+    XFS_CAN ( File )
+    XFS_CAN ( Format )
+
+    if ( ! Dir -> update ) {
+        return XFS_RC ( rcUnauthorized );
+    }
+
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirCreateFile] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+        /*) Mapping parent directory
+         (*/
+    va_copy ( xArgs, Args );
+    RCt = _GetNameAndMapParentEntryNoLock (
+                                        Dir,
+                                        & Parent,
+                                        & EffPath,
+                                        & EntryName,
+                                        Format,
+                                        xArgs
+                                        );
+    va_end ( xArgs );
+    if ( RCt == 0 ) {
+        LOG_LOC_ACQ ( __LINE__, Parent -> mutabor );
+        RCt = KLockAcquire ( Parent -> mutabor );
+        if ( RCt == 0 ) {
+            RCt = _DirEGetEntryNoLock (
+                                    Parent,
+                                    EntryName,
+                                    & Entry
+                                    );
+            if ( GetRCState ( RCt ) == rcNotFound ) {
+                    /*) Really we don't need to do it 
+                     (*/
+                RCt = 0;
+                    /*) Making record in journal 
+                     (*/
+                RCt = _DirECreateEntryNoLock (
+                                            Parent,
+                                            EntryName,
+                                            false,
+                                            & Entry
+                                            );
+                if ( RCt == 0 ) {
+                        /*) Here we are opening file 
+                        (*/
+                    RCt = _CreateEncryptedFile (
+                                            File,
+                                            _WsDirKey ( Dir ) ,
+                                            Update,
+                                            Access,
+                                            Cmode,
+                                            "%s/%s/%s",
+                                            _WsDirPath ( Dir ),
+                                            XFSPathGet ( EffPath ),
+                                            Entry -> eff_name
+                                            );
+                    if ( RCt == 0 ) {
+                        RCt = _SyncronizeDirectoryContentNoLock ( Parent );
+                    }
+                    else {
+                        _DirEDelEntryNoLock ( Parent, Entry );
+                    }
+                }
+            }
+            else {
+                if ( RCt == 0 ) {
+                    _DirERelease ( Entry );
+                }
+            }
+
+            LOG_LOC_UNL ( __LINE__, Parent -> mutabor );
+            KLockUnlock ( Parent -> mutabor );
+        }
+
+        free ( ( char * ) EntryName );
+
+        XFSPathRelease ( EffPath );
+
+        _DirERelease ( Parent );
+    }
+
+    return RCt;
+}   /* XFSWsDirCreateFile () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirFileSize
+ *  returns size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ OUT ] - return parameter for file size
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC
+XFSWsDirFileSize (
+                const struct KDirectory * self,
+                uint64_t * Size,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct XFSPath * Path;
+    struct KDirectory * NatDir;
+    const struct KFile * File;
+    va_list xArgs;
+
+    RCt = 0;
+    Dir = ( struct XFSWsDir * ) self;
+    Entry = NULL;
+    Path = NULL;
+    NatDir = NULL;
+    File = NULL;
+
+    XFS_CSA ( Size, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Size )
+    XFS_CAN ( Format )
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirFileSize] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+
+        va_copy ( xArgs, Args );
+        RCt = _WsDirVMapIt ( Dir, & Entry, & Path, Format, xArgs );
+        va_end ( xArgs );
+        if ( RCt == 0 ) {
+            if ( Entry -> is_folder ) {
+                RCt = XFS_RC ( rcInvalid );
+            }
+            else {
+                RCt = _OpenEncryptedFileRead (
+                                            & File, 
+                                            ( struct KKey * ) _WsDirKey ( Dir ),
+                                            "%s/%s",
+                                            _WsDirPath ( Dir ),
+                                            XFSPathGet ( Path )
+                                            );
+                if ( RCt == 0 ) {
+                    RCt = KFileSize ( File, Size );
+
+                    KFileRelease ( File );
+                }
+            }
+
+            XFSPathRelease ( Path );
+            _DirERelease ( Entry );
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* XFSWsDirFileSize () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirSetFileSize
+ *  sets size in bytes of target file
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target file
+ *
+ *  "size" [ IN ] - new file size
+ */
+static
+rc_t CC
+XFSWsDirSetFileSize (
+                struct KDirectory * self,
+                uint64_t Size,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct XFSPath * Path;
+    struct KDirectory * NatDir;
+    struct KFile * File;
+    va_list xArgs;
+
+    RCt = 0;
+    Dir = ( struct XFSWsDir * ) self;
+    Entry = NULL;
+    Path = NULL;
+    NatDir = NULL;
+    File = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Format )
+
+    if ( ! Dir -> update ) {
+        return XFS_RC ( rcUnauthorized );
+    }
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirSetFileSize] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+
+        va_copy ( xArgs, Args );
+        RCt = _WsDirVMapIt ( Dir, & Entry, & Path, Format, xArgs );
+        va_end ( xArgs );
+        if ( RCt == 0 ) {
+            if ( Entry -> is_folder ) {
+                RCt = XFS_RC ( rcInvalid );
+            }
+            else {
+                RCt = _OpenEncryptedFileWrite (
+                                            & File, 
+                                            ( struct KKey * ) _WsDirKey ( Dir ),
+                                            true,
+                                            "%s/%s",
+                                            _WsDirPath ( Dir ),
+                                            XFSPathGet ( Path )
+                                            );
+                if ( RCt == 0 ) {
+                    RCt = KFileSetSize ( File, Size );
+
+                    KFileRelease ( File );
+                }
+            }
+
+            XFSPathRelease ( Path );
+            _DirERelease ( Entry );
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* XFSWsDirSetFileSize () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirOpenDirRead
+ *
+ *  opens a sub-directory
+ *
+ * [IN]  const XFSWsDir *	self	Object Oriented C XFSWsDir self
+ * [OUT] const KDirectory **	subp	Where to put the new KDirectory/XFSWsDir
+ * [IN]  bool			chroot	Create a chroot cage for this new subdirectory
+ * [IN]  const char *		path	Path to the directory to open
+ * [IN]  va_list		args	So far the only use of args is possible additions to path
+ */
+static 
+rc_t CC
+XFSWsDirOpenDirRead (
+                const struct KDirectory * self,
+                const struct KDirectory ** Subp,
+                bool Chroot,
+                const char * Format,
+                va_list Args
+)
+{
+    assert (self != NULL);
+    assert (Subp != NULL);
+    assert (Format != NULL);
+
+/* We do not implement that method, because subdirectory workspace
+ * could clash with parent workspace on file synchronizing.
+ * Of course, we may hash each directory content in separate Depot,
+ *            and will do it if it is necessary
+ */
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirOpenDirRead] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    return RC (rcFS, rcDirectory, rcOpening, rcSelf, rcUnsupported);
+}   /* XFSWsDirOpenDirRead () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirOpenDirUpdate
+ *  opens a sub-directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "chroot" [ IN ] - if non-zero, the new directory becomes
+ *  chroot'd and will interpret paths beginning with '/'
+ *  relative to itself.
+ */
+static
+rc_t CC
+XFSWsDirOpenDirUpdate (
+                struct KDirectory * self,
+                struct KDirectory ** Subp, 
+                bool Chroot, 
+                const char * Format, 
+                va_list Args
+)
+{
+    assert (self != NULL);
+    assert (Subp != NULL);
+    assert (Format != NULL);
+/* We do not implement that method, because subdirectory workspace
+ * could clash with parent workspace on file synchronizing.
+ * Of course, we may hash each directory content in separate Depot,
+ *            and will do it if it is necessary
+ */
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirOpenDirUpdate] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}   /* XFSWsDirOpenDirUpdate () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirCreateDir
+ *  create a sub-directory
+ *
+ *  "path" [ IN ] - NUL terminated string in directory-native
+ *  character set denoting target directory
+ *
+ *  "access" [ IN ] - standard Unix directory permissions
+ *
+ *  "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC
+XFSWsDirCreateDir (
+                struct KDirectory * self,
+                uint32_t Access,
+                KCreateMode CreationMode,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct _DirE * Parent;
+    const struct XFSPath * EffPath;
+    const char * EntryName;
+    struct KDirectory * NatDir;
+    va_list xArgs;
+
+    RCt = 0;
+    Entry = NULL;
+    Parent = NULL;
+    EffPath = NULL;
+    EntryName = NULL;
+    Dir = ( struct XFSWsDir * ) self;
+    NatDir = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Format )
+
+    if ( ! Dir -> update ) {
+        return XFS_RC ( rcUnauthorized );
+    }
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirCreateDir] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+            /*) Mapping parent
+             (*/
+        va_copy ( xArgs, Args );
+        RCt = _GetNameAndMapParentEntryNoLock (
+                                            Dir,
+                                            & Parent,
+                                            & EffPath,
+                                            & EntryName,
+                                            Format,
+                                            xArgs
+                                            );
+        va_end ( xArgs );
+        if ( RCt == 0 ) {
+            LOG_LOC_ACQ ( __LINE__, Parent -> mutabor );
+            RCt = KLockAcquire ( Parent -> mutabor );
+            if ( RCt == 0 ) {
+                RCt = _DirEGetEntryNoLock ( Parent, EntryName, & Entry );
+                if ( GetRCState ( RCt ) == rcNotFound ) {
+
+                        /*) Really we don't need to do it
+                         (*/
+                    RCt = 0;
+
+                        /*) Making record in journal
+                         (*/
+                    RCt = _DirECreateEntryNoLock (
+                                            Parent,
+                                            EntryName,
+                                            true,
+                                            & Entry
+                                            );
+                    if ( RCt == 0 ) {
+                        /*) Here we are opening file
+                         (*/
+                        RCt = KDirectoryCreateDir (
+                                                NatDir,
+                                                Access,
+                                                CreationMode,
+                                                "%s/%s/%s",
+                                                _WsDirPath ( Dir ),
+                                                XFSPathGet ( EffPath ),
+                                                Entry -> eff_name
+                                                );
+                        if ( RCt == 0 ) {
+                            RCt = _SyncronizeDirectoryContentNoLock (
+                                                                Parent
+                                                                );
+                            if ( RCt == 0 ) {
+                                RCt = _SyncronizeDirectoryContentNoLock (
+                                                                Entry
+                                                                );
+                            }
+                        }
+                        else {
+                            _DirEDelEntryNoLock ( Parent, Entry );
+                        }
+
+                    }
+                }
+                else {
+                    if ( RCt == 0 ) {
+                        _DirERelease ( Entry );
+                    }
+                }
+
+                LOG_LOC_UNL ( __LINE__, Parent -> mutabor );
+                KLockUnlock ( Parent -> mutabor );
+            }
+
+            free ( ( char * ) EntryName );
+
+            XFSPathRelease ( EffPath );
+            
+            _DirERelease ( Parent );
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* XFSWsDirCreateDir () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * XFSWsDirDestroyFile
+ */
+static
+rc_t CC
+XFSWsDirDestroyFile ( struct KDirectory * self, struct KFile * File )
+{
+    assert (self != NULL);
+    assert (File != NULL);
+
+/* We don't really need that method
+ */
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirDestroyFile] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    return RC (rcFS, rcDirectory, rcDestroying, rcSelf, rcUnsupported);
+}   /* XFSWsDirDestroyFile () */
+
+static
+rc_t CC
+XFSWsDirDate (
+                const struct KDirectory * self,
+                KTime_t * Date,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct XFSPath * Path;
+    struct KDirectory * NatDir;
+    va_list xArgs;
+
+    RCt = 0;
+    Dir = ( struct XFSWsDir * ) self;
+    Entry = NULL;
+    Path = NULL;
+    NatDir = NULL;
+
+    XFS_CSA ( Date, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Date )
+    XFS_CAN ( Format )
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirDate] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+
+        va_copy ( xArgs, Args );
+        RCt = _WsDirVMapIt ( Dir, & Entry, & Path, Format, xArgs );
+        va_end ( xArgs );
+        if ( RCt == 0 ) {
+            RCt = KDirectoryDate (
+                                NatDir,
+                                Date, 
+                                "%s/%s",
+                                _WsDirPath ( Dir ),
+                                XFSPathGet ( Path )
+                                );
+
+            XFSPathRelease ( Path );
+            _DirERelease ( Entry );
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* XFSWsDirDate () */
+
+
+static
+rc_t CC
+XFSWsDirSetDate (
+                struct KDirectory * self,
+                bool Recurse,
+                KTime_t Date,
+                const char * Format,
+                va_list Args
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * Dir;
+    const struct _DirE * Entry;
+    const struct XFSPath * Path;
+    struct KDirectory * NatDir;
+    va_list xArgs;
+
+    RCt = 0;
+    Dir = ( struct XFSWsDir * ) self;
+    Entry = NULL;
+    Path = NULL;
+    NatDir = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Format )
+
+    if ( ! Dir -> update ) {
+        return XFS_RC ( rcUnauthorized );
+    }
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirSetDate] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+
+        va_copy ( xArgs, Args );
+        RCt = _WsDirVMapIt ( Dir, & Entry, & Path, Format, xArgs );
+        va_end ( xArgs );
+        if ( RCt == 0 ) {
+            RCt = KDirectorySetDate (
+                                NatDir,
+                                Recurse,
+                                Date, 
+                                "%s/%s",
+                                _WsDirPath ( Dir ),
+                                XFSPathGet ( Path )
+                                );
+
+            XFSPathRelease ( Path );
+            _DirERelease ( Entry );
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* XFSWsDirSetDate () */
+
+
+static
+struct KSysDir * CC
+XFSWsDirGetSysDir ( const struct KDirectory * self )
+{
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " <<<[XFSWsDirGetSysDir] [$(dir)]", "dir=%p", ( void * ) self );
+#endif /* JOJOBA */
+
+    return NULL;
+}   /* XFSWsDirGetSysDir () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ *
+ */
+static struct KDirectory_vt_v1 vtXFSWsDir =
+{
+    /* version 1.0 */
+    1, 1,
+
+    /* start minor version 0 methods*/
+    XFSWsDirDestroy,                    /* [+] */
+    XFSWsDirList,                       /* [+] */
+    XFSWsDirVisit,                      /* [-] */
+    XFSWsDirVisitUpdate,                /* [-] */
+    XFSWsDirPathType,                   /* [+] */
+    XFSWsDirResolvePath,                /* [+] */
+    XFSWsDirResolveAlias,               /* [-] */ /* 4 FUTURE */
+    XFSWsDirRename,                     /* [+] */
+    XFSWsDirRemove,                     /* [+] */
+    XFSWsDirClearDir,                   /* [+] */
+    XFSWsDirVAccess,                    /* [+] */
+    XFSWsDirSetAccess,                  /* [+] */
+    XFSWsDirCreateAlias,                /* [-] */ /* 4 FUTURE */
+    XFSWsDirOpenFileRead,               /* [+] */
+    XFSWsDirOpenFileWrite,              /* [+] */
+    XFSWsDirCreateFile,                 /* [+] */
+    XFSWsDirFileSize,                   /* [+] */
+    XFSWsDirSetFileSize,                /* [+] */
+    XFSWsDirOpenDirRead,                /* [-] */ /* WE DON"T DO IT */
+    XFSWsDirOpenDirUpdate,              /* [-] */ /* WE DON"T DO IT */
+    XFSWsDirCreateDir,                  /* [+] */
+    XFSWsDirDestroyFile,                /* [-] */ /* NO NEED */
+    /* end minor version 0 methods*/
+    /* start minor version 1 methods*/
+
+    XFSWsDirDate,                       /* [-] */
+    XFSWsDirSetDate,                    /* [-] */
+    XFSWsDirGetSysDir,                  /* [-] */
+    /* end minor version 2 methods*/
+#ifdef NO_JOJOBA
+    NULL,
+    /* end minor version 2 methods*/
+    /* end minor version 3 methods*/
+    NULL,
+    NULL
+    /* end minor version 3 methods*/
+#endif /* NO_JOJOBA */
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*
+ * DEPOT <<
+ */
+struct _WsDptE {
+    BSTNode node;
+
+    struct KDirectory * dir;
+    const char * path;
+};
+
+static
+rc_t CC
+_WsDptEDispose ( struct _WsDptE * self )
+{
+    if ( self != NULL ) {
+        if ( self -> dir != NULL ) {
+            KDirectoryRelease ( self -> dir );
+
+            self -> dir = NULL;
+        }
+
+        if ( self -> path != NULL ) {
+            free ( ( char * ) self -> path );
+
+            self -> path = NULL;
+        }
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _WsDptEDispose () */
+
+static
+rc_t CC
+_WsDptEMake (
+            const char * Path,
+            struct KDirectory * Dir,
+            struct _WsDptE ** Entry
+)
+{
+    rc_t RCt;
+    struct _WsDptE * RetEntry;
+
+    RCt = 0;
+    RetEntry = NULL;
+
+    RCt = 0;
+
+    XFS_CSAN ( Entry )
+    XFS_CAN ( Path )
+    XFS_CAN ( Dir )
+    XFS_CAN ( Entry )
+
+    RetEntry = calloc ( 1, sizeof ( struct _WsDptE ) );
+    if ( RetEntry == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = XFS_StrDup ( Path, & ( RetEntry -> path ) );
+        if ( RCt == 0 ) {
+            RetEntry -> dir = Dir;
+
+            * Entry = RetEntry;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Entry = NULL;
+
+        _WsDptEDispose ( RetEntry );
+    }
+
+    return RCt;
+}   /* _WsDptEMake () */
+
+struct _WsDpt {
+    BSTree tree;
+
+    struct KLock * mutabor;
+};
+
+static struct _WsDpt * _sWsDpt = NULL;
+
+static
+struct _WsDpt * CC
+_Dpt ()
+{
+    return _sWsDpt;
+}   /* _Dpt () */
+
+static
+void CC
+_WsDptWhackCallback ( BSTNode * Node, void * unused )
+{
+    if ( Node != NULL ) {
+        _WsDptEDispose ( ( struct _WsDptE * ) Node );
+    }
+}   /* _WsDptWhackCallback () */
+
+static
+rc_t CC
+_WsDptDisposeImpl ( struct _WsDpt * self )
+{
+    if ( self != NULL ) {
+        BSTreeWhack ( & ( self -> tree ) , _WsDptWhackCallback, NULL );
+
+        if ( self -> mutabor != NULL ) {
+            KLockRelease ( self -> mutabor );
+
+            self -> mutabor = NULL;
+        }
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _WsDptDipsoseImpl () */
+
+static
+rc_t CC
+_WsDptMakeImpl ( struct _WsDpt ** Depot )
+{
+    rc_t RCt;
+    struct _WsDpt * TheDepot;
+
+    RCt = 0;
+    TheDepot = NULL;
+
+    XFS_CSAN ( Depot )
+    XFS_CAN ( Depot )
+
+    TheDepot = calloc ( 1, sizeof ( struct _WsDpt ) );
+    if ( TheDepot != NULL ) {
+        RCt = KLockMake ( & ( TheDepot -> mutabor ) );
+
+        if ( RCt == 0 ) {
+            BSTreeInit ( & ( TheDepot -> tree ) );
+
+            * Depot = TheDepot;
+        }
+    }
+    else {
+        RCt = XFS_RC ( rcExhausted );
+    }
+
+    if ( RCt != 0 ) {
+        * Depot = NULL;
+
+        _WsDptDisposeImpl ( TheDepot );
+    }
+
+    return RCt;
+}   /* _WsDptMakeImpl () */
+
+LIB_EXPORT
+rc_t CC
+XFSEncDirectoryDepotInit ()
+{
+    rc_t RCt;
+    struct _WsDpt * Depot;
+
+    RCt = 0;
+    Depot = NULL;
+
+    if ( _sWsDpt == NULL ) {
+        RCt = _WsDptMakeImpl ( & Depot );
+        if ( RCt == 0 ) {
+            if ( _sWsDpt == NULL ) {
+                _sWsDpt = Depot;
+            }
+            else {
+                _WsDptDisposeImpl ( Depot );
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFSEncDirectoryDepotInit () */
+
+LIB_EXPORT
+rc_t CC
+XFSEncDirectoryDepotDispose ()
+{
+    struct _WsDpt * Depot;
+
+    Depot = _sWsDpt;
+    _sWsDpt = NULL;
+
+    if ( Depot != NULL ) {
+        _WsDptDisposeImpl ( Depot );
+    }
+
+    return 0;
+}   /* XFSEncDirectoryDepotDispose () */
+
+static
+int64_t CC
+_WsDptCmpCallback (const void * Item, const BSTNode * Node )
+{
+    const char * Str1, * Str2;
+
+    Str1 = ( const char * ) Item;
+
+    Str2 = Node == NULL
+                    ? NULL
+                    : ( ( struct _WsDptE * ) Node ) -> path
+                    ;
+
+    return XFS_StringCompare4BST_ZHR ( Str1, Str2 );
+}   /* _WsDptCmpCallback () */
+
+static
+rc_t CC
+_WsDptGetNoLock (
+                struct _WsDpt * self,
+                const char * Path,
+                struct KDirectory ** Dir
+)
+{
+    struct _WsDptE * Entry = NULL;
+
+    XFS_CSAN ( Dir )
+    XFS_CAN ( self )
+    XFS_CAN ( Path )
+    XFS_CAN ( Dir )
+
+    Entry = ( struct _WsDptE * ) BSTreeFind (
+                                            & ( self -> tree ),
+                                            Path,
+                                            _WsDptCmpCallback
+                                            );
+    if ( Entry != NULL ) {
+        * Dir = Entry -> dir;
+    }
+
+    return Entry == NULL ? XFS_RC ( rcNotFound ) : 0;
+}   /* _WsDptGetNoLock () */
+
+static
+int64_t CC
+_WsDptAddCallback ( const BSTNode * N1, const BSTNode * N2 )
+{
+    return XFS_StringCompare4BST_ZHR (
+                                ( ( struct _WsDptE * ) N1 ) -> path,
+                                ( ( struct _WsDptE * ) N2 ) -> path
+                                );
+}   /* _WsDptAddCallback () */
+
+static
+rc_t CC
+_WsDptAddNoLock (
+                struct _WsDpt * self,
+                const char * Path,
+                struct KDirectory * Dir
+)
+{
+    rc_t RCt;
+    struct _WsDptE * Entry;
+
+    RCt = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Path )
+    XFS_CAN ( Dir )
+
+    RCt = _WsDptEMake ( Path, Dir, & Entry );
+    if ( RCt == 0 ) {
+        RCt = BSTreeInsert (
+                            & ( self -> tree ),
+                            ( struct BSTNode * ) & ( Entry -> node ),
+                            _WsDptAddCallback
+                            );
+    }
+
+    return RCt;
+}   /* _WsDptAddNoLock () */
+
+static
+rc_t CC
+_WsDptClearNoLock ( struct _WsDpt * self )
+{
+    XFS_CAN ( self )
+
+    BSTreeWhack ( & ( self -> tree ), _WsDptWhackCallback, NULL );
+    BSTreeInit ( & ( self -> tree ) );
+
+    return 0;
+}   /* _WsDptClearNoLock () */
+
+LIB_EXPORT
+rc_t CC
+XFSEncDirectoryDepotClear ()
+{
+    rc_t RCt;
+    struct _WsDpt * Depot;
+
+    RCt = 0;
+    Depot = _Dpt ();
+
+    XFS_CAN ( Depot )
+
+    LOG_LOC_ACQ ( __LINE__, Depot -> mutabor );
+    RCt = KLockAcquire ( Depot -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _WsDptClearNoLock ( Depot );
+
+        LOG_LOC_UNL ( __LINE__, Depot -> mutabor );
+        KLockUnlock ( Depot -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSEncDirectoryDepotClear () */
+
+static
+rc_t CC
+_WsDptGet ( const char * Path, struct KDirectory ** Dir )
+{
+    rc_t RCt;
+    struct _WsDpt * Depot;
+
+    RCt = 0;
+    Depot = _Dpt ();
+
+    XFS_CAN ( Depot )
+
+    XFS_CSAN ( Dir )
+    XFS_CAN ( Path )
+    XFS_CAN ( Dir )
+
+    LOG_LOC_ACQ ( __LINE__, Depot -> mutabor );
+    RCt = KLockAcquire ( Depot -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _WsDptGetNoLock ( Depot, Path, Dir );
+
+        LOG_LOC_UNL ( __LINE__, Depot -> mutabor );
+        KLockUnlock ( Depot -> mutabor );
+    }
+
+    return RCt;
+}   /* _WsDptGet () */
+
+static
+rc_t CC
+_WsDptAdd ( const char * Path, struct KDirectory * Dir )
+{
+    rc_t RCt;
+    struct _WsDpt * Depot;
+    struct KDirectory * TheDir;
+
+    RCt = 0;
+    Depot = _Dpt ();
+    TheDir = NULL;
+
+    XFS_CAN ( Depot )
+
+    XFS_CAN ( Path )
+    XFS_CAN ( Dir )
+
+    LOG_LOC_ACQ ( __LINE__, Depot -> mutabor );
+    RCt = KLockAcquire ( Depot -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _WsDptGetNoLock ( Depot, Path, & TheDir );
+        if ( RCt == 0 ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+            RCt = _WsDptAddNoLock ( Depot, Path, Dir );
+        }
+
+        LOG_LOC_UNL ( __LINE__, Depot -> mutabor );
+        KLockUnlock ( Depot -> mutabor );
+    }
+
+
+    return RCt;
+}   /* _WsDptAdd () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+    /*)) That method does not do any checks
+     ((*/
+static
+rc_t CC
+_WsDirAlloc (
+        const char * AbsolutePath,
+        const char * DisplayName,
+        const char * Password,
+        const char * EncType,
+        bool Update,
+        struct KDirectory ** Dir
+)
+{
+    rc_t RCt;
+    struct XFSWsDir * RetDir;
+    struct KKey Key;
+    const struct _DirE * Entry;
+
+    RCt = 0;
+    RetDir = NULL;
+    Entry = NULL;
+
+    XFS_CSAN ( Dir )
+    XFS_CAN ( AbsolutePath )
+    XFS_CAN ( DisplayName )
+    XFS_CAN ( Password )
+    XFS_CAN ( Dir )
+
+    RetDir = calloc ( 1, sizeof ( struct XFSWsDir ) );
+    if ( RetDir == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RetDir -> update = rcUnauthorized;
+
+            /* First - init directory
+             */
+    RCt = KDirectoryInit (
+                        & ( RetDir -> dir ),
+                        ( const KDirectory_vt * ) & vtXFSWsDir,
+                        "WsDir",
+                        AbsolutePath,
+                        Update
+                        );
+
+    if ( RCt == 0 ) {
+            /* second : Creating entry
+             */
+        RCt = _DirEMake (
+                        _sFolderTag,
+                        DisplayName,
+                        DisplayName,
+                        & Entry
+                        );
+        if ( RCt == 0 ) {
+                /* third : Crating encoding key
+                 */
+            RCt =  XFS_InitKKey_ZHR ( Password, EncType, & Key );
+            if ( RCt == 0 ) {
+                    /* fourth : Trying to load content
+                     */
+                RCt = _DirEMakeContent ( Entry, & Key, AbsolutePath );
+                if ( RCt == 0 ) {
+
+                    RetDir -> entry = Entry;
+
+                    RCt = XFS_StrDup (
+                                    Password,
+                                    & ( RetDir -> passwd )
+                                    );
+                    if ( RCt == 0 ) {
+                        RCt = XFS_StrDup (
+                                        EncType,
+                                        & ( RetDir -> enc_type )
+                                        );
+
+                        if ( RCt == 0 ) {
+                            * Dir = & ( RetDir -> dir );
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Dir = NULL;
+
+        if ( RetDir != NULL ) {
+            XFSWsDirDestroy ( & ( RetDir -> dir ) );
+        }
+    }
+
+#ifdef JOJOBA
+pLogMsg ( klogDebug, " [_WsDirAlloc] [$(line)] [$(rc)]", "line=%d,rc=%d", __LINE__, RCt );
+#endif /* JOJOBA */
+
+    return RCt;
+}   /* _WsDirAlloc () */
+
+static
+rc_t CC
+_WsDirMake (
+                const struct KDirectory ** Dir,
+                bool Update,
+                const char * Password,
+                const char * EncType,
+                const char * Path,
+                va_list Args
+)
+{
+    rc_t RCt;
+    const struct XFSPath * aPath;
+    struct KDirectory * RetVal;
+    const char * Name;
+    va_list xArgs;
+
+    RCt = 0;
+    aPath = NULL;
+    RetVal = NULL;
+    Name = NULL;
+
+    XFS_CSAN ( Dir )
+    XFS_CAN ( Password )
+    XFS_CAN ( Path )
+    XFS_CAN ( Dir )
+
+        /* Creating valid path
+         */
+    va_copy ( xArgs, Args );
+    RCt = XFSPathVMakeAbsolute ( & aPath, false, Path, xArgs );
+    va_end ( xArgs );
+    if ( RCt == 0 ) {
+        RCt = _WsDptGet ( XFSPathGet ( aPath ), & RetVal );
+        if ( RCt != 0 ) {
+            RCt = 0;     /* We do not need that really */
+
+            Name = XFSPathName ( aPath );
+            if ( RCt == 0 ) {
+                    /* Creating encoded directory
+                     */
+                RCt = _WsDirAlloc (
+                                XFSPathGet ( aPath ),
+                                Name,
+                                Password,
+                                EncType,
+                                Update,
+                                & RetVal
+                                );
+                if ( RCt == 0 ) {
+                    RCt = _WsDptAdd ( XFSPathGet ( aPath ), RetVal );
+                }
+            }
+        }
+
+        XFSPathRelease ( aPath );
+    }
+
+    if ( RCt == 0 ) {
+        if ( Dir == NULL ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+            RCt = KDirectoryAddRef ( RetVal );
+            if ( RCt == 0 ) {
+                * Dir = RetVal;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Dir = NULL;
+
+        if ( RetVal != NULL ) {
+                /* Should we delete entry ? I think NO! */
+        }
+    }
+
+    return RCt;
+}   /* _WsDirMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSEncDirectoryOpen (
+                const struct KDirectory ** Dir,
+                bool Update,
+                const char * Password,
+                const char * EncType,
+                const char * Path,
+                ...
+)
+{
+    rc_t RCt;
+    va_list Args;
+
+    RCt = 0;
+
+    XFS_CSAN ( Dir )
+    XFS_CAN ( Password )
+    XFS_CAN ( Path )
+    XFS_CAN ( Dir )
+
+    va_start ( Args, Path );
+    RCt = _WsDirMake ( Dir, Update, Password, EncType, Path, Args );
+    va_end ( Args );
+
+    return RCt;
+}   /* XFSEncDirectoryOpen () */
+
diff --git a/libs/xfs/xencws.h b/libs/xfs/xencws.h
new file mode 100644
index 0000000..f80552d
--- /dev/null
+++ b/libs/xfs/xencws.h
@@ -0,0 +1,71 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xencws_h_
+#define _xencws_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   There is temporary interface which needed to store encrypted
+  ))))  data in encrypted directory
+ ((((*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))    Forwards
+ ((*/
+struct KDirectory;
+
+/*))
+ //     Depot
+((*/
+XFS_EXTERN rc_t CC XFSEncDirectoryDepotInit ();
+XFS_EXTERN rc_t CC XFSEncDirectoryDepotDispose ();
+XFS_EXTERN rc_t CC XFSEncDirectoryDepotClear ();
+
+/*))
+ //     The only method we will use
+((*/
+XFS_EXTERN rc_t CC XFSEncDirectoryOpen (
+                                const struct KDirectory ** Dir,
+                                bool Update,
+                                const char * Password,
+                                const char * EncType,
+                                const char * Path,
+                                ...
+                                );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _xencws_h_ */
diff --git a/libs/xfs/xfs-priv.h b/libs/xfs/xfs-priv.h
new file mode 100644
index 0000000..938404a
--- /dev/null
+++ b/libs/xfs/xfs-priv.h
@@ -0,0 +1,118 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_xfs_priv_
+#define _h_xfs_priv_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/*  Forwards forewer
+ */
+struct XFSTreeDepot;
+
+union XFSControl_vt;
+struct XFSControlArgs;
+struct XFSOwp;
+
+/*
+ *  XFSControl structure
+ *
+ *  Note, that structure is using two members : Tree and Control.
+ *  Tree is an object which is rendering tree, and it is accepting
+ *  callbacks from Control, which is definitely implementation of
+ *  Fuse/Dokan interface. THAT IS VERY IMPORTANT that Tree should
+ *  be initialized before Control.
+ *
+ */
+struct XFSControl {
+    const union XFSControl_vt *vt;
+
+        /*  "struct XFSTree", which should be responsible for rendering
+            tree structure into Fuse/Dokan terms of filesystem
+            NOTE: it should be initialized before Control
+        */
+    struct XFSTreeDepot * TreeDepot;
+
+        /*  "struct fuse" for Fuse, and something else for all
+            other platforms
+            "struct fuse" contains pointer for "fuse_session",
+            and it contains pointer for "fuse_chan", so it will
+            allow to define practically everything in environment.
+            NOTE: it should be initialized after Tree
+         */
+    void * Control;
+    void * ControlAux;
+
+        /*  That is for storeing of arguments to run fuse
+            I am not sure if we need it, but arguments for initializing
+            fuse and docan are passing in difeerent way.
+            BTW, prolly I need to use BSTree here, not sure.
+         */
+    struct XFSOwp * Arguments;
+};
+
+/*
+ *  Vertuhai table.
+ */
+struct XFSControl_vt_v1 {
+        /*  version == 1.x
+         */
+    uint32_t maj;
+    uint32_t min;
+
+        /*  overloaded methods
+         */
+        /*  version 0.0
+         */
+    rc_t ( CC * init ) ( struct XFSControl * self );
+    rc_t ( CC * destroy ) ( struct XFSControl * self );
+    rc_t ( CC * mount ) ( struct XFSControl * self );
+    rc_t ( CC * loop ) ( struct XFSControl * self );
+    rc_t ( CC * unmount ) ( struct XFSControl * self );
+};
+
+union XFSControl_vt {
+    struct XFSControl_vt_v1 v1;
+};
+
+/*))    Some usefull defines, used in Arguments
+ ((*/
+#define XFS_CONTROL_APPNAME     "appname"
+#define XFS_CONTROL_MOUNTPOINT  "mountpoint"
+#define XFS_CONTROL_LABEL       "label"
+#define XFS_CONTROL_LOGFILE     "logfile"
+#define XFS_CONTROL_DAEMONIZE   "daemonize"
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _h_xfs_priv_ */
diff --git a/libs/xfs/xfs.c b/libs/xfs/xfs.c
new file mode 100644
index 0000000..ba3d39b
--- /dev/null
+++ b/libs/xfs/xfs.c
@@ -0,0 +1,403 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/out.h>
+#include <klib/text.h>
+
+#include <xfs/xfs.h>
+#include <xfs/tree.h>
+
+#include "platform.h"
+#include "schwarzschraube.h"
+#include "owp.h"
+#include "xfs-priv.h"
+
+#include <sysalloc.h>
+#include <stdlib.h> /* we are using calloc */
+#include <string.h> /* we are using memset */
+
+/*  Some forwards and declarations
+ */
+static rc_t XFSVeryMainLoop ( void * Data );
+
+/*  The code, which is checking version is quite similar for
+ *  destroy/start/stop ... and, possible for other methods,
+ *  so we do that then.
+ */
+static
+rc_t
+XFSControlStandardSelfCheck( const struct XFSControl * self )
+{
+        /*  TODO : here and further not sure about rc */
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> vt == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+        /*  Should be extended for switch later
+         */
+    if ( self -> vt -> v1 . maj != 1 && self -> vt -> v1 . min != 1 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if (    self -> vt -> v1.init == NULL
+        ||  self -> vt -> v1.destroy == NULL 
+        ||  self -> vt -> v1.mount == NULL 
+        ||  self -> vt -> v1.loop == NULL 
+        ||  self -> vt -> v1.unmount == NULL 
+        ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( self -> Arguments == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    return 0;
+}   /* XFSControlStandardSelfCheck () */
+
+/*  The code will create  and init instance of XFSControl,
+ *  it is calling external method
+ *  XFSControlInitVT (), which is platform dependent
+ */
+LIB_EXPORT
+rc_t CC
+XFSControlMake (
+            const struct XFSTree * Tree,
+            struct XFSControl ** Control
+)
+{
+    rc_t RCt;
+    struct XFSControl * TheControl;
+
+    RCt = 0;
+    TheControl = NULL;
+
+    if ( Control == NULL || Tree == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Control = NULL;
+
+    TheControl = calloc ( 1, sizeof ( struct XFSControl ) );
+    if ( TheControl == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSOwpMake ( & ( TheControl -> Arguments ) );
+    if ( RCt == 0 ) {
+
+        RCt = XFSControlPlatformInit ( TheControl );
+        if ( RCt == 0 ) {
+
+            RCt = XFSTreeDepotMake (
+                        ( const struct XFSTreeDepot ** )
+                                & ( TheControl -> TreeDepot )
+                        );
+            if ( RCt == 0 ) {
+
+                RCt = XFSTreeDepotSet ( TheControl -> TreeDepot, Tree );
+                if ( RCt == 0 ) {
+
+                    RCt = TheControl -> vt -> v1.init ( TheControl );
+                    if ( RCt == 0 ) {
+                        * Control = TheControl;
+                    }
+                }
+            }
+        }
+    }
+
+
+    if ( RCt != 0 ) {
+        XFSControlDispose ( TheControl );
+
+        * Control = NULL;
+    }
+
+    return RCt;
+}   /* XFSControlInit () */
+
+/*  Control destroy.
+ */
+LIB_EXPORT
+rc_t CC
+XFSControlDispose ( struct XFSControl * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return 0;
+    }
+
+    if ( self -> TreeDepot != NULL ) {
+        XFSTreeDepotDispose ( self -> TreeDepot );
+
+        self -> TreeDepot = NULL;
+    }
+
+    if ( self -> Arguments != NULL ) {
+        XFSOwpDispose ( self -> Arguments );
+
+        self -> Arguments = NULL;
+    }
+
+    if ( self -> vt != NULL ) {
+        self -> vt -> v1.destroy ( self );
+
+        self -> vt = NULL;
+    }
+
+    free ( self );
+
+    return RCt;
+}   /* XFSControlDestroy () */
+
+/*  Start file system
+ */
+LIB_EXPORT
+rc_t CC
+XFSStart ( struct XFSControl * self )
+{
+    rc_t RCt;
+
+    RCt = XFSControlStandardSelfCheck ( self );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    RCt = self -> vt -> v1.mount ( self );
+    XFSVeryMainLoop ( self );
+
+    return RCt;
+}   /* XFSStart () */
+
+/*  Stop filesystem.
+ */
+LIB_EXPORT
+rc_t CC
+XFSStop ( struct XFSControl * self )
+{
+    rc_t RCt;
+
+    RCt = XFSControlStandardSelfCheck ( self );
+    if ( RCt == 0 ) {
+
+        RCt = self -> vt -> v1.unmount ( self );
+    }
+
+    return RCt;
+}   /* XFSStop () */
+
+LIB_EXPORT
+rc_t CC
+XFSControlGetTree (
+                struct XFSControl * self,
+                const struct XFSTree ** Tree
+)
+{
+    if ( self == NULL || Tree == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    return XFSTreeDepotGet ( self -> TreeDepot, Tree );
+}   /* XFSControlGetTree () */
+
+/*  Here we are goint to implement some Arguments methods
+ */
+LIB_EXPORT
+rc_t CC
+XFSControlSetArg (
+                struct XFSControl * self,
+                const char * ArgName,
+                const char * ArgValue
+)
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    return XFSOwpSet ( self -> Arguments, ArgName, ArgValue );
+}   /* XFSControlSetArg () */
+
+LIB_EXPORT
+const char * CC
+XFSControlGetArg ( struct XFSControl * self, const char * ArgName )
+{
+    return self == NULL
+                ? NULL
+                : XFSOwpGet ( self -> Arguments, ArgName )
+                ;
+}   /* XFSControlGetArg () */
+
+LIB_EXPORT
+bool CC
+XFSControlHasArg ( struct XFSControl * self, const char * ArgName )
+{
+    if ( self != NULL && ArgName != NULL ) {
+        return XFSOwpHas ( self -> Arguments, ArgName );
+    }
+    return false;
+}   /* XFSControlHasArg () */
+
+
+LIB_EXPORT
+rc_t CC
+XFSControlSetAppName ( struct XFSControl * self, const char * AppName )
+{
+    return XFSControlSetArg (
+                        self,
+                        XFS_CONTROL_APPNAME,
+                        ( AppName == NULL ? "mount-tool" : AppName )
+                        );
+}   /* XFSControlSetAppName () */
+
+LIB_EXPORT
+const char * CC
+XFSControlGetAppName ( struct XFSControl * self )
+{
+    return XFSControlGetArg ( self, XFS_CONTROL_APPNAME );
+}   /* XFSControlGetAppName () */
+
+LIB_EXPORT
+rc_t CC
+XFSControlDaemonize ( struct XFSControl * self )
+{
+    return XFSControlSetArg (
+                        self,
+                        XFS_CONTROL_DAEMONIZE,
+                        XFS_CONTROL_DAEMONIZE
+                        );
+}   /* XFSControlDaemonize () */
+
+LIB_EXPORT
+bool CC
+XFSControlIsDaemonize ( struct XFSControl * self )
+{
+    return XFSControlHasArg ( self, XFS_CONTROL_DAEMONIZE );
+}   /* XFSControlIsDaemonize () */
+
+LIB_EXPORT
+rc_t CC
+XFSControlSetMountPoint (
+                    struct XFSControl * self,
+                    const char * MountPoint
+)
+{
+    return MountPoint == NULL
+                ? XFS_RC ( rcNull )
+                : XFSControlSetArg (
+                                    self,
+                                    XFS_CONTROL_MOUNTPOINT,
+                                    MountPoint
+                                    )
+                ;
+}   /* XFSControlSetMountPoint () */
+
+LIB_EXPORT
+const char * CC
+XFSControlGetMountPoint ( struct XFSControl * self )
+{
+    return XFSControlGetArg ( self, XFS_CONTROL_MOUNTPOINT );
+}   /* XFSControlGetMountPoint () */
+
+LIB_EXPORT
+rc_t CC
+XFSControlSetLogFile ( struct XFSControl * self, const char * Path )
+{
+    rc_t RCt;
+    char BF [ XFS_SIZE_1024 ];
+
+    RCt = 0;
+    * BF = 0;
+
+    XFS_CAN ( self )
+
+    RCt = XFS_ResolvePath (
+                        true,
+                        BF,
+                        sizeof ( BF ),
+                        ( Path == NULL ? "./mount-tool.log" : Path )
+                        );
+    if ( RCt == 0 ) {
+        RCt = XFSControlSetArg ( self, XFS_CONTROL_LOGFILE, BF );
+    }
+
+    return RCt;
+}   /* XFSControlSetLogFile () */
+
+LIB_EXPORT
+const char * CC
+XFSControlGetLogFile ( struct XFSControl * self )
+{
+    return XFSControlGetArg ( self, XFS_CONTROL_LOGFILE );
+}   /* XFSControlGetLogFile () */
+
+LIB_EXPORT
+rc_t CC
+XFSControlSetLabel ( struct XFSControl * self, const char * Label )
+{
+    return Label == NULL
+                ? XFS_RC ( rcNull )
+                : XFSControlSetArg ( self, XFS_CONTROL_LABEL, Label )
+                ;
+}   /* XFSControlSetLabel () */
+
+LIB_EXPORT
+const char * CC
+XFSControlGetLabel ( struct XFSControl * self )
+{
+    return XFSControlGetArg ( self, XFS_CONTROL_LABEL );
+}   /* XFSControlGetLabel () */
+
+static
+rc_t
+XFSVeryMainLoop ( void * Data )
+{
+    struct XFSControl * TheControl;
+
+    TheControl = ( struct XFSControl * ) Data;
+
+    if ( TheControl == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( TheControl -> vt == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( TheControl -> vt -> v1.loop == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    return TheControl -> vt -> v1.loop ( TheControl );
+}   /* XFSVeryMainLoop () */
diff --git a/libs/xfs/xgap.c b/libs/xfs/xgap.c
new file mode 100644
index 0000000..8ccbc44
--- /dev/null
+++ b/libs/xfs/xgap.c
@@ -0,0 +1,1408 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/vector.h>
+#include <kproc/lock.h>
+#include <vfs/path.h>
+#include <vfs/manager.h>
+#include <vfs/resolver.h>
+#include <kns/http.h>
+
+#include <kfg/repository.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/file-impl.h>
+#include <kfs/cacheteefile.h>
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+
+#include "schwarzschraube.h"
+#include "zehr.h"
+#include "mehr.h"
+#include "xgap.h"
+#include <xfs/path.h>
+
+#include <sysalloc.h>
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))    XFSGapProject and XFSGapDepot
+ //     
+((*/
+
+struct _GapDepot {
+    BSTree tree;
+
+    struct KLock * mutabor;     /*  this lock is used for operations
+                                 *  related to retrieve GapProjects
+                                 */
+};
+
+struct XFSGapProject {
+    BSTNode node;
+
+    KRefcount refcount;
+
+    bool good;
+    uint32_t project_id;
+
+    const struct KRepository * repository;
+    const struct VResolver * resolver;
+
+    const char * pass;
+    size_t pass_size;
+    const struct KKey * key;
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* Weird stuff                                                       */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+static
+rc_t CC
+_GetRepository (
+                const struct KRepository ** Repository,
+                uint32_t ProjectId
+)
+{
+    rc_t RCt, TmpRCt;
+    struct KRepository * TheRepository;
+    KRepositoryVector RepositoryVec;
+    const struct KRepositoryMgr * RepositoryMgr;
+    uint32_t llp, qty, prj;
+    char Bf [ XFS_SIZE_128 ];
+
+    RCt = 0;
+    TmpRCt = 0;
+    TheRepository = NULL;
+    RepositoryMgr = NULL;
+    llp = qty = prj = 0;
+    * Bf = 0;
+
+    XFS_CSAN ( Repository )
+    XFS_CAN ( Repository )
+
+    RCt = KConfigMakeRepositoryMgrRead (
+                                    XFS_Config_MHR (),
+                                    & RepositoryMgr
+                                    );
+    if ( RCt == 0 ) {
+
+        RCt = KRepositoryMgrUserRepositories (
+                                            RepositoryMgr,
+                                            & RepositoryVec
+                                            );
+        if ( RCt == 0 ) {
+            qty = VectorLength ( & RepositoryVec );
+            for ( llp = 0; llp < qty; llp ++ ) {
+
+                TheRepository = VectorGet ( & RepositoryVec, llp );
+                if ( TheRepository == NULL ) {
+                    continue;
+                }
+
+                TmpRCt = KRepositoryName (
+                                        TheRepository,
+                                        Bf,
+                                        sizeof ( Bf ),
+                                        NULL
+                                        );
+                if ( TmpRCt != 0 ) {
+                    continue;
+                }
+
+                if ( ProjectId == XFS_PUBLIC_PROJECT_ID ) {
+                    if ( strcmp ( Bf, "public" ) != 0 ) {
+                        continue;
+                    }
+                }
+                else {
+                    TmpRCt = KRepositoryProjectId (
+                                                TheRepository,
+                                                & prj
+                                                );
+                    if ( TmpRCt != 0 ) {
+                        continue;
+                    }
+
+                    if ( prj != ProjectId ) {
+                        continue;
+                    }
+                }
+
+                    /* So, here we do have our repository */
+                RCt = KRepositoryAddRef ( TheRepository );
+                if ( RCt == 0 ) {
+                    * Repository = TheRepository;
+                }
+
+                break;
+            }
+
+            KRepositoryVectorWhack ( & RepositoryVec );
+        }
+
+        KRepositoryMgrRelease ( RepositoryMgr );
+    }
+
+    if ( * Repository == NULL ) {
+        RCt = XFS_RC ( rcNotFound );
+    }
+
+    return RCt;
+}   /*  _GetRepository () */
+
+static
+rc_t CC
+_MakeResolver (
+            const struct VResolver ** Resolver,
+            const struct KRepository * Repository
+)
+{
+    rc_t RCt;
+    struct VResolver * TheResolver;
+
+    RCt = 0;
+    TheResolver = NULL;
+
+    XFS_CSAN ( Resolver )
+    XFS_CAN ( Resolver )
+    XFS_CAN ( Repository )
+
+    RCt = KRepositoryMakeResolver (
+                                Repository,
+                                & TheResolver,
+                                XFS_Config_MHR ()
+                                );
+    if ( RCt == 0 ) {
+        * Resolver = TheResolver;
+    }
+
+    return RCt;
+}   /* _MakeResolver () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSGapProject                                                     */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static const char * _sGapProject_classname = "GapProject";
+
+static
+rc_t CC
+_GapProjectDispose ( const struct XFSGapProject * self )
+{
+    struct XFSGapProject * Project = ( struct XFSGapProject * ) self;
+
+    if ( Project != NULL ) {
+
+        Project -> good = false;
+
+        Project -> project_id = 0;
+
+        KRefcountWhack (
+                    & ( Project -> refcount ),
+                    _sGapProject_classname
+                    );
+
+        if ( Project -> repository != NULL ) {
+            KRepositoryRelease ( Project -> repository );
+            Project -> repository = NULL;
+        }
+
+        if ( Project -> resolver != NULL ) {
+            VResolverRelease ( Project -> resolver );
+            Project -> resolver = NULL;
+        }
+
+        if ( Project -> key != NULL ) {
+            free ( ( struct KKey * )  Project -> key );
+            Project -> key = NULL;
+        }
+
+        if ( Project -> pass != NULL ) {
+            free ( ( char * ) Project -> pass );
+            Project -> pass = NULL;
+        }
+
+        Project -> pass_size = 0;
+
+        free ( Project );
+    }
+
+    return 0;
+}   /* _GapProjectDispose () */
+
+static 
+rc_t CC
+_GapProjectMake (
+                const struct XFSGapProject ** Project,
+                uint32_t ProjectId
+)
+{
+    rc_t RCt;
+    struct XFSGapProject * TheProject;
+
+    RCt = 0;
+    TheProject = NULL;
+
+    XFS_CSAN ( Project )
+    XFS_CAN ( Project )
+
+    TheProject = calloc ( 1, sizeof ( struct XFSGapProject ) );
+    if ( TheProject == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+            /* until it is good */
+        TheProject -> good = false;
+
+        TheProject -> project_id = ProjectId;
+
+        TheProject -> key = NULL;
+
+        KRefcountInit (
+                    & ( TheProject -> refcount ),
+                    1,
+                    _sGapProject_classname,
+                    "GapProjectMake",
+                    "GapProject"
+                    );
+
+        RCt = _GetRepository (
+                            & ( TheProject -> repository ),
+                            TheProject -> project_id
+                            );
+        if ( RCt == 0 ) {
+
+            RCt = _MakeResolver (
+                            & ( TheProject -> resolver ),
+                            TheProject -> repository
+                            );
+            if ( RCt == 0 ) {
+                TheProject -> good = true;
+
+                * Project = TheProject;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Project = NULL;
+
+        if ( TheProject != 0 ) {
+            _GapProjectDispose ( TheProject );
+        }
+    }
+
+    return RCt;
+}   /* _GapProjectMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectAddRef ( const struct XFSGapProject * self )
+{
+    rc_t RCt;
+    int RefC;
+
+    RCt = 0;
+    RefC = 0;
+
+    XFS_CAN ( self );
+
+    RefC = KRefcountAdd (
+                        & ( self -> refcount ),
+                        _sGapProject_classname
+                        );
+    switch ( RefC ) {
+        case krefOkay :
+            RCt = 0;
+            break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+            RCt = XFS_RC ( rcInvalid );
+            break;
+        default :
+            RCt = XFS_RC ( rcUnknown );
+            break;
+    }
+
+    return RCt;
+}   /* XFSGapProjectAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectRelease ( const struct XFSGapProject * self )
+{
+    rc_t RCt;
+    int RefC;
+
+    RCt = 0;
+    RefC = 0;
+
+    XFS_CAN ( self );
+
+    RefC = KRefcountDrop (
+                        & ( self -> refcount ),
+                        _sGapProject_classname
+                        );
+    switch ( RefC ) {
+        case krefOkay :
+        case krefZero :
+                RCt = 0;
+                break;
+        case krefWhack :
+                RCt = _GapProjectDispose ( self );
+                break;
+        case krefNegative :
+                RCt = XFS_RC ( rcInvalid );
+                break;
+        default :
+                RCt = XFS_RC ( rcUnknown );
+                break;
+    }
+
+    return RCt;
+}   /* XFSGapProjectRelease () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectIsValid ( const struct XFSGapProject * self )
+{
+    return self != NULL ? ( self -> good  ) : false;
+}   /* XFSGapProjectIsValid () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectId ( const struct XFSGapProject * self, uint32_t * Id )
+{
+    XFS_CSA ( Id, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Id )
+
+    * Id = self -> project_id;
+
+    return 0;
+}   /* XFSGapProjectId () */
+
+static
+rc_t CC
+_GapProjectReadCharValue (
+                        const struct XFSGapProject * self,
+                        char ** RetValue,
+                        rc_t ( CC * Reader ) ( 
+                                        const struct KRepository * self,
+                                        char * Buffer,
+                                        size_t BufferSize,
+                                        size_t * RetSize
+                                        )
+)
+{
+    rc_t RCt;
+    char Bf [ XFS_SIZE_1024 ];
+    char * TheRetVal;
+    size_t TheRetValSize;
+
+    RCt = 0;
+    * Bf = 0;
+    TheRetVal = NULL;
+    TheRetValSize = 0;
+
+    XFS_CSAN ( RetValue )
+    XFS_CAN ( self )
+    XFS_CAN ( RetValue )
+    XFS_CAN ( Reader )
+
+    if ( ! XFSGapProjectIsValid ( self ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = Reader (
+                self -> repository,
+                Bf,
+                sizeof ( Bf ),
+                & TheRetValSize
+                );
+    if ( RCt == 0 ) {
+        if ( TheRetValSize != 0 ) {
+            RCt = XFS_StrDup ( Bf, ( const char ** ) ( & TheRetVal ) );
+            if ( RCt == 0 ) {
+                * RetValue = TheRetVal;
+            } 
+        }
+        else {
+            RCt = XFS_RC ( rcInvalid );
+        }
+    }
+
+    return RCt;
+}   /* _GapProjectReadCharValue () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectRepositoryName (
+                        const struct XFSGapProject * self,
+                        char ** RepositoryName
+)
+{
+    return _GapProjectReadCharValue (
+                                    self,
+                                    RepositoryName,
+                                    KRepositoryName
+                                    );
+}   /* XFSGapProjectRepositoryName () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectRepositoryDisplayName (
+                        const struct XFSGapProject * self,
+                        char ** DisplayName
+)
+{
+    return _GapProjectReadCharValue (
+                                    self,
+                                    DisplayName,
+                                    KRepositoryDisplayName
+                                    );
+}   /* XFSGapProjectRepositoryDisplayName () */
+
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectRepositoryRoot (
+                        const struct XFSGapProject * self,
+                        char ** RepositoryRoot
+)
+{
+    return _GapProjectReadCharValue (
+                                    self,
+                                    RepositoryRoot,
+                                    KRepositoryRoot
+                                    );
+}   /* XFSGapProjectRepositoryRoot () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectWorkspace (
+                        const struct XFSGapProject * self,
+                        char ** Workspace
+)
+{
+    rc_t RCt;
+    char * Root;
+    char BF [ XFS_SIZE_1024 ];
+    size_t NR;
+
+    RCt = 0;
+    Root = NULL;
+    * BF = 0;
+    NR = 0;
+
+    XFS_CSAN ( Workspace )
+    XFS_CAN ( self )
+    XFS_CAN ( Workspace )
+
+    RCt = XFSGapProjectRepositoryRoot ( self, & Root );
+    if ( RCt == 0 ) {
+        RCt = string_printf (
+                            BF,
+                            sizeof ( BF ) - 1,
+                            & NR,
+                            "%s/workspace",
+                            Root
+                            );
+        if ( RCt == 0 ) {
+            RCt = XFS_StrDup ( BF, ( const char ** ) Workspace );
+        }
+        free ( Root );
+    }
+
+    return RCt;
+}   /* XFSGapProjectWorkspace () */
+
+rc_t CC
+XFSGapPublicfiles ( char ** Publicfiles )
+{
+    rc_t RCt;
+    const struct XFSGapProject * Project;
+
+    RCt = 0;
+    Project = NULL;
+
+    XFS_CSAN ( Publicfiles )
+    XFS_CAN ( Publicfiles )
+
+    RCt = XFSGapFindOrCreate ( XFS_PUBLIC_PROJECT_ID, & Project );
+    if ( RCt == 0 ) {
+        RCt = XFSGapProjectRepositoryRoot ( Project, Publicfiles );
+
+        XFSGapProjectRelease ( Project );
+    }
+
+    return RCt;
+}   /* XFSGapPublicfiles () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartfiles ( char ** Kartfiles )
+{
+    rc_t RCt;
+    char * UserConfigDir;
+    const struct XFSPath * Path;
+
+    RCt = 0;
+    UserConfigDir = NULL;
+    Path = NULL;
+
+    XFS_CSAN ( Kartfiles )
+    XFS_CAN ( Kartfiles )
+
+    RCt = XFSGapUserConfigDir ( & UserConfigDir );
+    if ( RCt == 0 ) {
+        RCt= XFSPathMake (
+                        & Path,
+                        false,
+                        "%s/kart-files",
+                        UserConfigDir
+                        );
+        if ( RCt == 0 ) {
+            RCt = XFS_StrDup (
+                            XFSPathGet ( Path ),
+                            ( const char ** ) Kartfiles
+                            );
+
+            XFSPathRelease ( Path );
+        }
+
+        free ( UserConfigDir );
+    }
+
+    return RCt;
+}   /* XFSGapKartfiles () */
+
+static
+const char * CC
+_GapUserHomeDir ()
+{
+    const char * Ret = getenv ( "HOME" );
+    if ( Ret == NULL ) {
+        Ret = getenv ( "USERPROFILE" );
+    }
+
+    return Ret;
+}   /* _GapUserHomeDir () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapUserHome ( char ** UserHome )
+{
+    rc_t RCt;
+    const char * Var;
+
+    RCt = 0;
+    Var = NULL;
+
+    XFS_CSAN ( UserHome )
+    XFS_CAN ( UserHome )
+
+    Var = _GapUserHomeDir ();
+    if ( Var != NULL ) {
+        RCt = XFS_StrDup ( Var, ( const char ** ) UserHome );
+    }
+    else {
+        RCt = XFS_RC ( rcInvalid );
+    }
+
+    return RCt;
+}   /* XFSGapUserHome () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapUserConfigDir ( char ** UserConfigDir )
+{
+    rc_t RCt;
+    const char * Var;
+    const struct XFSPath * Path;
+
+    RCt = 0;
+    Var = NULL;
+    Path = NULL;
+
+    XFS_CSAN ( UserConfigDir )
+    XFS_CAN ( UserConfigDir )
+
+    Var = _GapUserHomeDir ();
+    if ( Var == NULL ) {
+        RCt = XFS_RC ( rcInvalid );
+    }
+    else {
+        RCt= XFSPathMake ( & Path, false, "%s/.ncbi", Var );
+        if ( RCt == 0 ) {
+            RCt = XFS_StrDup (
+                            XFSPathGet ( Path ) ,
+                            ( const char ** ) UserConfigDir
+                            );
+            XFSPathRelease ( Path );
+        }
+    }
+
+    return RCt;
+}   /* XFSGapUserConfigDir () */
+
+static
+rc_t CC
+_GapProjectLoadEncriptionKey ( const struct XFSGapProject * self )
+{
+    rc_t RCt;
+    struct XFSGapProject * Project;
+    struct KKey * Key;
+    char Pass [ XFS_SIZE_4096 ];
+    size_t PassSize;
+    char * ThePass;
+
+    RCt = 0;
+    Project = ( struct XFSGapProject * ) self;
+    Key = NULL;
+    * Pass = 0;
+    ThePass = NULL;
+    PassSize = 0;
+
+    XFS_CAN ( Project )
+
+    if ( ! XFSGapProjectIsValid ( Project ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KRepositoryEncryptionKey (
+                                Project -> repository,
+                                Pass,
+                                sizeof ( Pass ),
+                                & PassSize
+                                );
+    if ( RCt == 0 ) {
+        ThePass = string_dup ( Pass, PassSize );
+        if ( ThePass == NULL ) {
+            RCt = XFS_RC ( rcExhausted );
+        }
+        else {
+            Key = calloc ( 1, sizeof ( struct KKey ) );
+            if ( Key == NULL ) {
+                RCt = XFS_RC ( rcExhausted );
+            }
+            else {
+                RCt = KKeyInitRead (
+                                    Key,
+                                    kkeyAES128,
+                                    ThePass,
+                                    PassSize
+                                    );
+                if ( RCt == 0 ) {
+                    Project -> key = Key;
+                    Project -> pass = ThePass;
+                    Project -> pass_size = PassSize;
+                }
+            }
+        }
+    }
+
+    return RCt;
+}   /* _GapProjectLoadEncriptionKey () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectEncriptionKey (
+                        const struct XFSGapProject * self,
+                        const struct KKey ** EncriptionKey
+)
+{
+    rc_t RCt = 0;
+
+    XFS_CSAN ( EncriptionKey )
+    XFS_CAN ( self )
+    XFS_CAN ( EncriptionKey )
+
+    if ( self -> key == NULL ) {
+        RCt = _GapProjectLoadEncriptionKey ( self );
+    }
+
+    if ( RCt == 0 ) {
+        * EncriptionKey = self -> key;
+    }
+
+    return RCt;
+}   /* XFSGapProjectEncriptionKey () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectPassword (
+                        const struct XFSGapProject * self,
+                        const char ** Password,
+                        size_t * PasswordSize
+)
+{
+    rc_t RCt = 0;
+
+    XFS_CSAN ( Password )
+    XFS_CSA ( PasswordSize, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Password )
+    XFS_CAN ( PasswordSize )
+
+    if ( self -> key == NULL ) {
+        RCt = _GapProjectLoadEncriptionKey ( self );
+    }
+
+    if ( RCt == 0 ) {
+        * Password = self -> pass;
+        * PasswordSize = self -> pass_size;
+    }
+
+    return RCt;
+}   /* XFSGapProjectPassword () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectLocateAccession (
+                        const struct XFSGapProject * self,
+                        const char * Accession,
+                        const struct VPath ** Remote,
+                        const struct VPath ** Cache
+)
+{
+    rc_t RCt;
+    struct VPath * Query;
+
+    RCt = 0;
+    Query = NULL;
+
+    XFS_CSAN ( Remote )
+    XFS_CSAN ( Cache )
+    XFS_CAN ( self )
+    XFS_CAN ( Accession )
+
+    if ( ! XFSGapProjectIsValid ( self ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Remote == NULL && Cache == NULL ) {
+        return 0;
+    }
+
+    RCt = VFSManagerMakePath (
+                            XFS_VfsManager (),
+                            & Query,
+                            "ncbi-acc:%s",
+                            Accession
+                            );
+    if ( RCt == 0 ) {
+        RCt = VResolverQuery (
+                        self -> resolver,
+                        0,
+                        Query,
+                        NULL,
+                        Remote,
+                        Cache
+                        );
+
+        VPathRelease ( Query );
+    }
+
+    return RCt;
+}   /* XFSGapProjectLocateAccession () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectLocateObject (
+                        const struct XFSGapProject * self,
+                        uint32_t ObjectId,
+                        const struct VPath ** Remote,
+                        const struct VPath ** Cache
+)
+{
+    rc_t RCt;
+    struct VPath * Query;
+
+    RCt = 0;
+    Query = NULL;
+
+    XFS_CSAN ( Remote )
+    XFS_CSAN ( Cache )
+    XFS_CAN ( self )
+
+    if ( ! XFSGapProjectIsValid ( self ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Remote == NULL && Cache == NULL ) {
+        return 0;
+    }
+
+    RCt = VFSManagerMakePath (
+                            XFS_VfsManager (),
+                            & Query,
+                            "ncbi-obj:%d",
+                            ObjectId
+                            );
+    if ( RCt == 0 ) {
+        RCt = VResolverQuery (
+                        self -> resolver,
+                        0,
+                        Query,
+                        NULL,
+                        Remote,
+                        Cache
+                        );
+
+        VPathRelease ( Query );
+    }
+
+    return RCt;
+}   /* XFSGapProjectLocateObject () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectAccessionUrlAndPath (
+                            const struct XFSGapProject * self,
+                            const char * Accession,
+                            const char ** RemoteUrl,
+                            const char ** CachePath
+)
+{
+    rc_t RCt;
+    char BF [ XFS_SIZE_4096 ];
+    const struct VPath * rPath;
+    const struct VPath * cPath;
+    const char * rChar;
+    const char * cChar;
+
+    RCt = 0;
+    * BF = 0;
+    rPath = NULL;
+    cPath = NULL;
+    rChar = NULL;
+    cChar = NULL;
+
+    XFS_CSAN ( RemoteUrl )
+    XFS_CSAN ( CachePath )
+    XFS_CAN ( self )
+    XFS_CAN ( Accession )
+
+    if ( ! XFSGapProjectIsValid ( self ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( RemoteUrl == NULL && CachePath == NULL ) {
+        return 0;
+    }
+
+    RCt = XFSGapProjectLocateAccession (
+                                    self,
+                                    Accession,
+                                    RemoteUrl == NULL ? NULL : & rPath,
+                                    CachePath == NULL ? NULL : & cPath
+                                    );
+    if ( RCt == 0 ) {
+        if ( rPath != NULL ) {
+
+            RCt = XFS_ReadVUri_ZHR (
+                                    rPath,
+                                    BF,
+                                    sizeof ( BF ),
+                                    NULL
+                                    );
+            if ( RCt == 0 ) {
+                RCt = XFS_StrDup ( BF, & rChar );
+            }
+
+            VPathRelease ( rPath );
+        }
+
+        if ( cPath != NULL ) {
+            if ( RCt == 0 ) {
+
+                RCt = XFS_ReadVPath_ZHR (
+                                        cPath,
+                                        BF,
+                                        sizeof ( BF ),
+                                        NULL
+                                        );
+
+                if ( RCt == 0 ) {
+                    RCt = XFS_StrDup ( BF, & cChar );
+                }
+            }
+
+            VPathRelease ( cPath );
+        }
+
+        if ( RCt == 0 ) {
+            if ( RemoteUrl != NULL ) {
+                * RemoteUrl = rChar;
+            }
+
+            if ( CachePath != NULL ) {
+                * CachePath = cChar;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( RemoteUrl != NULL ) {
+            * RemoteUrl = NULL;
+        }
+
+        if ( CachePath != NULL ) {
+            * CachePath = NULL;
+        }
+
+        if ( rChar != NULL ) {
+            free ( ( char * ) rChar );
+        }
+
+        if ( cChar != NULL ) {
+            free ( ( char * ) cChar );
+        }
+    }
+
+    return RCt;
+}   /* XFSGapProjectAccessionUrlAndPath () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapProjectObjectUrlAndPath (
+                            const struct XFSGapProject * self,
+                            uint32_t ObjectId,
+                            const char ** RemoteUrl,
+                            const char ** CachePath
+)
+{
+    rc_t RCt;
+    char BF [ XFS_SIZE_4096 ];
+    const struct VPath * rPath;
+    const struct VPath * cPath;
+    const char * rChar;
+    const char * cChar;
+
+    RCt = 0;
+    * BF = 0;
+    rPath = NULL;
+    cPath = NULL;
+    rChar = NULL;
+    cChar = NULL;
+
+    XFS_CSAN ( RemoteUrl )
+    XFS_CSAN ( CachePath )
+    XFS_CAN ( self )
+
+    if ( ObjectId == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( ! XFSGapProjectIsValid ( self ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( RemoteUrl == NULL && CachePath == NULL ) {
+        return 0;
+    }
+
+    RCt = XFSGapProjectLocateObject (
+                                    self,
+                                    ObjectId,
+                                    RemoteUrl == NULL ? NULL : & rPath,
+                                    CachePath == NULL ? NULL : & cPath
+                                    );
+    if ( RCt == 0 ) {
+        if ( rPath != NULL ) {
+
+            RCt = XFS_ReadVUri_ZHR (
+                                    rPath,
+                                    BF,
+                                    sizeof ( BF ),
+                                    NULL
+                                    );
+            if ( RCt == 0 ) {
+                RCt = XFS_StrDup ( BF, & rChar );
+            }
+
+            VPathRelease ( rPath );
+        }
+
+        if ( cPath != NULL ) {
+            if ( RCt == 0 ) {
+
+                RCt = XFS_ReadVPath_ZHR (
+                                        cPath,
+                                        BF,
+                                        sizeof ( BF ),
+                                        NULL
+                                        );
+
+                if ( RCt == 0 ) {
+                    RCt = XFS_StrDup ( BF, & cChar );
+                }
+            }
+
+            VPathRelease ( cPath );
+        }
+
+        if ( RCt == 0 ) {
+            if ( RemoteUrl != NULL ) {
+                * RemoteUrl = rChar;
+            }
+            if ( CachePath != NULL ) {
+                * CachePath = cChar;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( RemoteUrl != NULL ) {
+            * RemoteUrl = NULL;
+        }
+        if ( CachePath != NULL ) {
+            * CachePath = NULL;
+        }
+
+        if ( rChar != NULL ) {
+            free ( ( char * ) rChar );
+        }
+
+        if ( cChar != NULL ) {
+            free ( ( char * ) cChar );
+        }
+    }
+
+    return RCt;
+}   /* XFSGapProjectObjectUrlAndPath () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _GapDepot                                                     */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static struct _GapDepot * _sDepot = NULL;
+
+static
+struct _GapDepot * CC
+_DepotGet ()
+{
+    return _sDepot;
+}   /* _DepotGet () */
+
+static
+void CC
+_DepotWhackCallback ( BSTNode * Node, void * unused )
+{
+    if ( Node != NULL ) {
+        XFSGapProjectRelease ( ( const struct XFSGapProject * ) Node );
+    }
+}   /* _DepotWhackCallback () */
+
+static
+rc_t CC
+_GapDepotDispose ( struct _GapDepot * self )
+{
+    if ( self != NULL ) {
+        BSTreeWhack ( & ( self -> tree ), _DepotWhackCallback, NULL );
+
+        if ( self -> mutabor != NULL ) {
+            KLockRelease ( self -> mutabor );
+            self -> mutabor = NULL;
+        }
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _GapDepotDispose () */
+
+static
+rc_t CC
+_GapDepotMake ( struct _GapDepot ** Depot )
+{
+    rc_t RCt;
+    struct _GapDepot * TheDepot;
+
+    RCt = 0;
+    TheDepot = NULL;
+
+    XFS_CSAN ( Depot )
+    XFS_CAN ( Depot )
+
+    TheDepot = calloc ( 1, sizeof ( struct _GapDepot ) );
+    if ( TheDepot == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = KLockMake ( & ( TheDepot -> mutabor ) );
+        if ( RCt == 0 ) {
+            BSTreeInit ( & ( TheDepot -> tree ) );
+
+            * Depot = TheDepot;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Depot = NULL;
+
+        if ( TheDepot != NULL ) {
+            _GapDepotDispose ( TheDepot );
+        }
+    }
+
+    return RCt;
+}   /* _GapDepotMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapInit ()
+{
+    if ( _sDepot == NULL ) {
+        return _GapDepotMake ( & _sDepot );
+    }
+
+    return 0;
+}   /* XFSGapDelete () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapDispose ()
+{
+    struct _GapDepot * Dpt = _sDepot;
+
+    if ( Dpt != NULL ) {
+        _sDepot = NULL;
+
+        return _GapDepotDispose ( Dpt );
+    }
+
+    return 0;
+}   /* XFSGapDelete () */
+
+static
+int64_t CC
+_DepotAddCallback (
+                const struct BSTNode * N1,
+                const struct BSTNode * N2
+)
+{
+    struct XFSGapProject * P1 = ( struct XFSGapProject * ) N1;
+    struct XFSGapProject * P2 = ( struct XFSGapProject * ) N2;
+    return  P1 -> project_id - P2 -> project_id;
+}   /* _DepotAddCallback () */
+
+static
+rc_t CC
+_DepotAdd_NoLock ( const struct XFSGapProject * Project )
+{
+    struct _GapDepot * Depot = _DepotGet ();
+
+    XFS_CAN ( Project )
+    XFS_CAN ( Depot )
+
+    return BSTreeInsert (
+                        & ( Depot -> tree ),
+                        ( struct BSTNode * ) Project,
+                        _DepotAddCallback
+                        );
+}   /* _DepotAdd_NoLock () */
+
+static
+int64_t CC
+_DepotFindCallback ( const void * Item, const struct BSTNode * Node )
+{
+    uint32_t ItemId, NodeId;
+
+    ItemId = * ( ( uint32_t * ) Item );
+    NodeId = Node == NULL
+                    ? 0
+                    : ( ( struct XFSGapProject * ) Node ) -> project_id
+                    ;
+
+
+    return ItemId - NodeId;
+}   /* _DepotFindCallback () */
+
+static
+rc_t CC
+_GapDepotFind_NoLock (
+                    uint32_t ProjectId,
+                    const struct XFSGapProject ** Project
+)
+{
+    rc_t RCt;
+    struct XFSGapProject * TheProject;
+    struct _GapDepot * Depot;
+
+    RCt = 0;
+    Depot = _DepotGet ();
+
+    XFS_CSAN ( Project )
+    XFS_CAN ( Depot )
+    XFS_CAN ( Project )
+    XFS_CAN ( Depot )
+
+    TheProject = ( struct XFSGapProject * ) BSTreeFind ( 
+                                        & ( Depot -> tree ),
+                                        ( const void * ) & ProjectId,
+                                        _DepotFindCallback
+                                        );
+    if ( TheProject == NULL ) {
+        RCt = XFS_RC ( rcNotFound );
+    }
+    else {
+        * Project = TheProject;
+    }
+
+    return RCt;
+}   /* _GapDepotFind () */
+
+LIB_EXPORT
+bool CC
+XFSGapHas ( uint32_t ProjectId )
+{
+    rc_t RCt;
+    struct _GapDepot * Depot;
+    const struct XFSGapProject * Project;
+
+    RCt = 0;
+    Project = NULL;
+    Depot = _DepotGet ();
+
+    XFS_CAN ( Depot )
+
+    RCt = KLockAcquire ( Depot -> mutabor );
+    if ( RCt == 0 ) {
+
+        RCt = _GapDepotFind_NoLock ( ProjectId, & Project );
+
+        KLockUnlock ( Depot -> mutabor );
+    }
+
+    return RCt == 0;
+}   /* XFSGapHas () */
+
+static
+rc_t CC
+_GapProjectMake_NoLock (
+                const struct XFSGapProject ** Project,
+                uint32_t ProjectId
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CSAN ( Project )
+    XFS_CAN ( Project )
+
+    RCt = _GapProjectMake ( Project, ProjectId );
+    if ( RCt == 0 ) {
+        RCt = _DepotAdd_NoLock ( * Project );
+        if ( RCt != 0 ) {
+            * Project = NULL;
+
+            _GapProjectDispose ( * Project );
+        }
+    }
+
+    return RCt;
+}   /* _GapProjectMake_NoLock () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapFindOrCreate (
+                uint32_t ProjectId,
+                const struct XFSGapProject ** Project
+)
+{
+    rc_t RCt;
+    struct _GapDepot * Depot;
+    const struct XFSGapProject * TheProject;
+
+    RCt = 0;
+    Depot = _DepotGet ();
+    TheProject = NULL;
+
+    XFS_CSAN ( Project )
+    XFS_CAN ( Project )
+
+    RCt = KLockAcquire ( Depot -> mutabor );
+    if ( RCt == 0 ) {
+
+        RCt = _GapDepotFind_NoLock ( ProjectId, & TheProject );
+        if ( GetRCState ( RCt ) == rcNotFound ) {
+            RCt = _GapProjectMake_NoLock ( & TheProject, ProjectId );
+        }
+
+        if ( RCt == 0 ) {
+            RCt = XFSGapProjectAddRef ( TheProject );
+
+            if ( RCt == 0 ) {
+                * Project = TheProject;
+            }
+        }
+
+        KLockUnlock ( Depot -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSGapFindOrCreate () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapRemove ( uint32_t ProjectId )
+{
+    rc_t RCt;
+    struct _GapDepot * Depot;
+    const struct XFSGapProject * Project;
+
+    RCt = 0;
+    Depot = _DepotGet ();
+    Project = NULL;
+
+    RCt = KLockAcquire ( Depot -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _GapDepotFind_NoLock ( ProjectId, & Project );
+        if ( RCt == 0 ) {
+            BSTreeUnlink (
+                        & ( Depot -> tree ),
+                        ( struct BSTNode * ) & ( Project -> node )
+                        );
+            XFSGapProjectRelease ( Project );
+        } 
+
+        KLockUnlock ( Depot -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSGapRemove () */
+
diff --git a/libs/xfs/xgap.h b/libs/xfs/xgap.h
new file mode 100644
index 0000000..4038859
--- /dev/null
+++ b/libs/xfs/xgap.h
@@ -0,0 +1,244 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xgap_h_
+#define _xgap_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   There is some thing which suppose to be a temporary stuff
+  ))))  of viewer for dbGaP projects
+ ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * LYRICS:
+ *
+ * That file contains methods which allow to access to dbGaP project
+ * data, as for :
+ * 
+ *      Directories
+ *      Files
+ *      Passwords
+ *
+ * XFSGapProject - dbGap Project defined by unique ProjectId (uint32_t)
+ *    1) does not have Make/Dispose methods - should be created by
+ *       Gap's FindOrCreate method, and Released after use
+ *    2) provides methods: Root directory, Key for ProjectId
+ *    3) provides access to Project Data by Accession or ObjectId
+ *       ( opens and decrypts files )
+ *    3) thread safe
+ *    4) struct itself hidden
+ *
+ * XFSGap - retrieves or creates dbGaP Project by ProjectId
+ *    1) provides access to dbGaP Project data by ProjectID
+ *    3) thread safe.
+ *
+ * There is special ProjectId = XFS_PUBLIC_PROJECT_ID ( 0 ), which is
+ * for 'public' data
+ *
+ *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //     Forwards
+((*/
+struct XFSGapProject;
+struct KKey;
+struct VPath;
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //     XFSGapInit/XFSGapDispose
+ \\     We are keepin' single instance of depot per program. These 
+ //     methods should be called at the program begining and end.
+((*/
+XFS_EXTERN rc_t CC XFSGapInit ();
+XFS_EXTERN rc_t CC XFSGapDispose ();
+
+    /*  Don't know if we need that method. Added for a sake of sake
+     *  Return true if Project with such ID exists
+     */
+XFS_EXTERN bool CC XFSGapHas ( uint32_t ProjectId );
+
+    /*  Usint method FindOrCreate, to avoid collisions from different
+     *  creative people :lol:
+     */
+XFS_EXTERN rc_t CC XFSGapFindOrCreate (
+                                uint32_t ProjectId,
+                                const struct XFSGapProject ** Project
+                                );
+
+    /*  Don't know if we need that method. Added for a sake of sake
+     */
+XFS_EXTERN rc_t CC XFSGapRemove ( uint32_t ProjectId );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*))
+ //     XFSGapProject
+((*/
+
+#define XFS_PUBLIC_PROJECT_ID   0
+
+XFS_EXTERN rc_t CC XFSGapProjectAddRef (
+                            const struct XFSGapProject * self
+                            );
+XFS_EXTERN rc_t CC XFSGapProjectRelease (
+                            const struct XFSGapProject * self
+                            );
+
+XFS_EXTERN bool CC XFSGapPfojectIsValid (
+                            const struct XFSGapProject * self
+                            );
+
+XFS_EXTERN rc_t CC XFSGapProjectId (
+                            const struct XFSGapProject * self,
+                            uint32_t * Id
+                            );
+
+    /* Both Remote and Cache could be NULL, so no data will be returned
+     * To dispose pahts, You should release them after using
+     */
+XFS_EXTERN rc_t CC XFSGapProjectLocateAccession (
+                            const struct XFSGapProject * self,
+                            const char * Accession,
+                            const struct VPath ** Remote,
+                            const struct VPath ** Cache
+                            );
+
+    /* Both Remote and Cache could be NULL, so no data will be returned
+     * To dispose pahts, You should release them after using
+     */
+XFS_EXTERN rc_t CC XFSGapProjectLocateObject (
+                            const struct XFSGapProject * self,
+                            uint32_t ObjectId,
+                            const struct VPath ** Remote,
+                            const struct VPath ** Cache
+                            );
+
+    /*  Both Remote and Cache could be NULL, and don't forget to free
+     *  them 
+     */
+XFS_EXTERN rc_t CC XFSGapProjectAccessionUrlAndPath (
+                            const struct XFSGapProject * self,
+                            const char * Accession,
+                            const char ** RemoteUrl,
+                            const char ** CachePath
+                            );
+
+    /*  Both Remote and Cache could be NULL, and don't forget to free
+     *  them 
+     */
+XFS_EXTERN rc_t CC XFSGapProjectObjectUrlAndPath (
+                            const struct XFSGapProject * self,
+                            uint32_t ObjectId,
+                            const char ** RemoteUrl,
+                            const char ** CachePath
+                            );
+
+    /* Don't forget to free RepositoryName, cuz it is part of a system
+     */
+XFS_EXTERN rc_t CC XFSGapProjectRepositoryName (
+                            const struct XFSGapProject * self,
+                            char ** RepositoryName
+                            );
+
+    /* Don't forget to free DislplayName, cuz it is part of a system
+     */
+XFS_EXTERN rc_t CC XFSGapProjectRepositoryDisplayName (
+                            const struct XFSGapProject * self,
+                            char ** DislplayName
+                            );
+
+    /* Don't forget to free RepositoryRoot, cuz it is part of a system
+     */
+XFS_EXTERN rc_t CC XFSGapProjectRepositoryRoot (
+                            const struct XFSGapProject * self,
+                            char ** RepositoryRoot
+                            );
+
+    /* No need to free Key, cuz it is part of a system
+     */
+XFS_EXTERN rc_t CC XFSGapProjectEncriptionKey (
+                            const struct XFSGapProject * self,
+                            const struct KKey ** EncriptionKey
+                            );
+
+    /* No need to free Password, cuz it is part of a system
+     */
+XFS_EXTERN rc_t CC XFSGapProjectPassword (
+                            const struct XFSGapProject * self,
+                            const char ** Password,
+                            size_t * PasswordSize
+                            );
+
+    /* Don't forget to free Workspace, cuz it is part of a system
+     */
+XFS_EXTERN rc_t CC XFSGapProjectWorkspace (
+                            const struct XFSGapProject * self,
+                            char ** Workspace
+                            );
+
+/*)))   Those do not need ProjectId
+ (((*/
+    /* Don't forget to free Kartfiles, cuz it is part of a system
+     */
+XFS_EXTERN rc_t CC XFSGapKartfiles ( char ** Kartfiles );
+
+    /* Don't forget to free Publicfiles, cuz it is part of a system
+     */
+XFS_EXTERN rc_t CC XFSGapPublicfiles ( char ** PublicFiles );
+
+/*)))   For those, who are lame. Apparently, there should be a
+ |||    method in kfg/config.h for that ... but ...
+(((*/
+    /* Don't forget to free UserHome, cuz it is part of a system
+     */
+XFS_EXTERN rc_t CC XFSGapUserHome ( char ** UserHome );
+
+    /* Don't forget to free UserConfigDir, cuz it is part of a system
+     */
+XFS_EXTERN rc_t CC XFSGapUserConfigDir ( char ** UserConfigDir );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _xgap_h_ */
diff --git a/libs/xfs/xgapf.c b/libs/xfs/xgapf.c
new file mode 100644
index 0000000..7e8927e
--- /dev/null
+++ b/libs/xfs/xgapf.c
@@ -0,0 +1,1822 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/vector.h>
+#include <kproc/lock.h>
+#include <vfs/path.h>
+#include <vfs/manager.h>
+#include <vfs/resolver.h>
+#include <kns/http.h>
+
+#include <kfg/repository.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/file-impl.h>
+#include <kfs/cacheteefile.h>
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+#include <krypto/wgaencrypt.h>
+
+#include <xfs/path.h>
+#include <xfs/perm.h>
+#include "schwarzschraube.h"
+#include "xgap.h"
+#include "xgapf.h"
+#include "spen.h"
+#include "zehr.h"
+
+#include <sysalloc.h>
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*))    Useful defines
+ ((*/
+
+    /* Do not comment that line unless You know what it does */
+#define _USE_CACHED_CONN_
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))    XFSGapFiles are living here
+ ((*/
+
+struct _GapFiles {
+    BSTree tree;
+
+    KLock * mutabor;
+
+    const struct XFSPen * pen;
+};
+
+typedef enum _EncType {
+                    kxfsEncInvalid,
+                    kxfsEncReady,
+                    kxfsEncNone,
+                    kxfsEncEncFile,
+                    kxfsEncSraFile,
+                    kxfsEncWGAFile,
+                    kxfsEncBroken
+                    } _EncType;
+
+struct _GapFilePeer {
+    BSTNode node;
+
+    KLock * mutabor;
+    KRefcount refcount;
+
+    uint32_t project_id;
+    const char * accession;
+    uint32_t object_id;
+
+    const char * remote_url;
+    const char * cache_path;
+
+    XFSStatus status;
+    _EncType enc_type;
+
+    uint64_t size;
+
+    const struct KFile * file;
+};
+
+struct _GapFile {
+    struct KFile file;
+
+    const struct KFile * looney_bin;
+
+    struct _GapFilePeer * peer;
+};
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _GapFiles ...                                                     */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+static struct _GapFiles * _sFiles = NULL;
+
+static
+struct _GapFiles *
+_FilesGet ()
+{
+    return _sFiles;
+}   /* _FilesGet () */
+
+static rc_t CC _GapFilePeerAddRef ( struct _GapFilePeer * self );
+static rc_t CC _GapFilePeerRelease ( struct _GapFilePeer * Peer );
+static rc_t CC _GapFilePeerMake (
+                                struct _GapFilePeer ** File,
+                                uint32_t ProjectId,
+                                const char * Accession,
+                                uint32_t ObjectId
+                                );
+static rc_t CC _GapFilePeerDispose ( struct _GapFilePeer * self );
+
+static
+void CC
+_GapFilesWhackCallback ( BSTNode * Node, void * unused )
+{
+    if ( Node != NULL ) {
+        _GapFilePeerRelease ( ( struct _GapFilePeer* ) Node );
+    }
+}   /* _GapFilesWhackCallback () */
+
+static
+rc_t CC
+_GapFilesDispose ( struct _GapFiles * self )
+{
+    if ( self != NULL ) {
+        BSTreeWhack (
+                    & ( self -> tree ),
+                    _GapFilesWhackCallback,
+                    NULL
+                    );
+
+        if ( self -> pen != NULL ) {
+            XFSPenDispose ( self -> pen );
+            self -> pen = NULL;
+        }
+
+        if ( self -> mutabor != NULL ) {
+            KLockRelease ( self -> mutabor );
+            self -> mutabor = NULL;
+        }
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _GapFilesDispose () */
+
+static
+rc_t CC
+_GapFilesMake ( struct _GapFiles ** Files )
+{
+    rc_t RCt;
+    struct _GapFiles * TheFiles;
+
+    RCt = 0;
+    TheFiles = NULL;
+
+    XFS_CSAN ( Files )
+    XFS_CAN ( Files )
+
+    TheFiles = calloc ( 1, sizeof ( struct _GapFiles ) );
+    if ( TheFiles == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = XFSPenMake ( & ( TheFiles -> pen ), 65 );
+        if ( RCt == 0 ) {
+            RCt = KLockMake ( & ( TheFiles -> mutabor ) );
+            if ( RCt == 0 ) {
+                BSTreeInit ( & ( TheFiles -> tree ) );
+
+                * Files = TheFiles;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Files = NULL;
+
+        if ( TheFiles != NULL ) {
+            _GapFilesDispose ( TheFiles );
+        }
+    }
+
+    return RCt;
+}   /* _GapFilesDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapFilesInit ()
+{
+    rc_t RCt = 0;
+
+    RCt = XFSGapInit ();
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    if ( _sFiles == NULL ) {
+        return _GapFilesMake ( & _sFiles );
+    }
+
+    return 0;
+}   /* XFSGapFilesInit () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapFilesDispose ()
+{
+    rc_t RCt;
+    struct _GapFiles * Files;
+
+    RCt = 0;
+    Files = _sFiles;
+
+    if ( Files != NULL ) {
+        _sFiles = NULL;
+
+        RCt = _GapFilesDispose ( Files );
+    }
+
+    XFSGapDispose ();
+
+    return RCt;
+}   /* XFSGapFilesDispose () */
+
+static
+int64_t CC
+_GapFilesFindCallback ( const void * Item, const BSTNode * Node )
+{
+    const char * Str1, * Str2;
+
+    Str1 = ( ( char * ) Item );
+    Str2 = Node == NULL
+                    ? NULL
+                    : ( ( struct _GapFilePeer * ) Node ) -> cache_path
+                    ;
+
+
+    return XFS_StringCompare4BST_ZHR ( Str1, Str2 );
+}   /* _GapFilesFindCallback () */
+
+static
+rc_t CC
+_GapFilesFind_NoLock (
+                    struct _GapFiles * self,
+                    struct _GapFilePeer ** Peer,
+                    const char * CachePath
+)
+{
+    rc_t RCt;
+    struct _GapFilePeer * ThePeer;
+
+    RCt = 0;
+    ThePeer = NULL;
+
+    XFS_CSAN ( Peer )
+    XFS_CAN ( self )
+    XFS_CAN ( Peer )
+    XFS_CAN ( CachePath )
+
+    ThePeer = ( struct _GapFilePeer * ) BSTreeFind ( 
+                                        & ( self -> tree ),
+                                        CachePath,
+                                        _GapFilesFindCallback
+                                        );
+    if ( ThePeer == NULL ) {
+
+        RCt = XFS_RC ( rcNotFound );
+    }
+    else {
+
+        * Peer = ThePeer;
+        RCt = 0;
+    }
+
+    return RCt;
+}   /* _GapFilesFind_NoLock () */
+
+static
+int64_t CC
+_GapFilesAddCallback (
+                    const struct BSTNode * N1,
+                    const struct BSTNode * N2
+)
+{
+    const char * Str1, * Str2;
+
+
+    Str1 = N1 == NULL
+                    ? NULL
+                    : ( ( ( struct _GapFilePeer * ) N1 ) -> cache_path )
+                    ;
+    Str2 = N2 == NULL
+                    ? NULL
+                    : ( ( ( struct _GapFilePeer * ) N2 ) -> cache_path )
+                    ;
+
+    return XFS_StringCompare4BST_ZHR ( Str1, Str2 );
+}   /* _GapFilesAddCallback () */
+
+static
+rc_t CC
+_GapFilesAddPeer_NoLock (
+                    struct _GapFiles * self,
+                    struct _GapFilePeer ** Peer,
+                    uint32_t ProjectId,
+                    const char * Accession,
+                    uint32_t ObjectId
+)
+{
+    rc_t RCt;
+    struct _GapFilePeer * ThePeer;
+
+    RCt = 0;
+    ThePeer = NULL;
+
+    XFS_CSAN ( Peer )
+    XFS_CAN ( self )
+    XFS_CAN ( Peer )
+
+    RCt = _GapFilePeerMake (
+                        & ThePeer,
+                        ProjectId,
+                        Accession,
+                        ObjectId
+                        );
+    if ( RCt == 0 ) {
+        RCt = BSTreeInsert (
+                        & ( self -> tree ),
+                        ( struct BSTNode * ) ThePeer,
+                        _GapFilesAddCallback
+                        );
+        if ( RCt == 0 ) {
+            * Peer = ThePeer;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Peer = NULL;
+
+        if ( ThePeer != NULL ) {
+            _GapFilePeerDispose ( ThePeer );
+        }
+    }
+
+    return RCt;
+}   /* _GapFilesAddPeer_NoLock () */
+
+static
+rc_t CC
+_GapFilesFindOrCreate (
+                    struct _GapFilePeer ** Peer,
+                    uint32_t ProjectId,
+                    const char * Accession,
+                    uint32_t ObjectId
+)
+{
+    rc_t RCt;
+    struct _GapFiles * Files;
+    struct _GapFilePeer * ThePeer;
+    const struct XFSGapProject * Project;
+    const char * CachePath;
+
+    RCt = 0;
+    ThePeer = NULL;
+    Files = _FilesGet ();
+    Project = NULL;
+    CachePath = NULL;
+
+    XFS_CSAN ( Peer )
+    XFS_CAN ( Files )
+    XFS_CAN ( Peer )
+
+    if ( Accession == NULL && ObjectId == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = XFSGapFindOrCreate ( ProjectId, & Project );
+    if ( RCt == 0 ) {
+        if ( Accession != NULL ) {
+            RCt = XFSGapProjectAccessionUrlAndPath (
+                                                Project,
+                                                Accession,
+                                                NULL,
+                                                & CachePath
+                                                );
+        }
+        else {
+            RCt = XFSGapProjectObjectUrlAndPath (
+                                                Project,
+                                                ObjectId,
+                                                NULL,
+                                                & CachePath
+                                                );
+        }
+
+        if ( RCt == 0 ) {
+            RCt = KLockAcquire ( Files -> mutabor );
+            if ( RCt == 0 ) {
+                    /* First we trying to locate already ready peer
+                     */
+                RCt = _GapFilesFind_NoLock (
+                                            Files,
+                                            & ThePeer,
+                                            CachePath
+                                            );
+                if ( GetRCState ( RCt ) == rcNotFound ) {
+                    RCt = _GapFilesAddPeer_NoLock (
+                                                Files,
+                                                & ThePeer,
+                                                ProjectId,
+                                                Accession,
+                                                ObjectId
+                                                );
+                }
+
+                if ( RCt == 0 ) {
+                    RCt = _GapFilePeerAddRef ( ThePeer );
+                    if ( RCt == 0 ) {
+                        * Peer = ThePeer;
+                    }
+                }
+
+                KLockUnlock ( Files -> mutabor );
+            }
+
+            free ( ( char * ) CachePath );
+        }
+
+        XFSGapProjectRelease ( Project );
+    }
+
+    return RCt;
+}   /* _GapFilesFindOrCreate () */
+
+static rc_t CC _GapFilePeerOpen (
+                            struct _GapFilePeer * self,
+                            const struct KFile ** File
+                            );
+static
+rc_t CC
+_GapFilesOpen (
+                const struct KFile ** File,
+                uint32_t ProjectId,
+                const char * Accession,
+                uint32_t ObjectId
+)
+{
+    rc_t RCt;
+    struct _GapFilePeer * Peer;
+    const struct KFile * TheFile;
+
+    RCt = 0;
+    Peer = NULL;
+    TheFile = NULL;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( File )
+
+    RCt = _GapFilesFindOrCreate (
+                                & Peer,
+                                ProjectId,
+                                Accession,
+                                ObjectId
+                                );
+    if ( RCt == 0 ) {
+        RCt = _GapFilePeerOpen ( Peer, & TheFile );
+        if ( RCt == 0 ) {
+            * File = TheFile;
+        }
+
+        _GapFilePeerRelease ( Peer );
+    }
+
+    return RCt;
+}   /* _GapFilesOpen () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapFilesOpenAccession (
+                        const struct KFile ** File,
+                        uint32_t ProjectId,
+                        const char * Accession
+)
+{
+    return _GapFilesOpen ( File, ProjectId, Accession, 0 );
+}   /* XFSGapFilesOpenAccession () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapFilesOpenObjectId (
+                        const struct KFile ** File,
+                        uint32_t ProjectId,
+                        uint32_t ObjectId
+)
+{
+    return _GapFilesOpen ( File, ProjectId, NULL, ObjectId );
+}   /* XFSGapFilesOpenObjectId () */
+
+static
+rc_t CC
+_GapFilesSize (
+                uint64_t * Size,
+                uint32_t ProjectId,
+                const char * Accession,
+                uint32_t ObjectId
+)
+{
+    rc_t RCt;
+    struct _GapFilePeer * Peer;
+    const struct KFile * TheFile;
+
+    RCt = 0;
+    Peer = NULL;
+    TheFile = NULL;
+
+    XFS_CSA ( Size, 0 )
+    XFS_CAN ( Size )
+
+    RCt = _GapFilesFindOrCreate (
+                                & Peer,
+                                ProjectId,
+                                Accession,
+                                ObjectId
+                                );
+    if ( RCt == 0 ) {
+        if ( Peer -> size == 0 ) {
+            RCt = _GapFilePeerOpen ( Peer, & TheFile );
+            if ( RCt == 0 ) {
+                KFileRelease ( TheFile );
+            }
+        }
+
+        if ( RCt == 0 ) {
+            * Size = Peer -> size;
+        }
+
+        _GapFilePeerRelease ( Peer );
+    }
+
+    return RCt;
+}   /* _GapFilesSize () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapFilesAccessionSize (
+                        uint64_t * Size,
+                        uint32_t ProjectId,
+                        const char * Accession
+)
+{
+    return _GapFilesSize ( Size, ProjectId, Accession, 0 );
+}   /* XFSGapFilesAccessionSize () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapFilesObjectIdSize (
+                        uint64_t * Size,
+                        uint32_t ProjectId,
+                        uint32_t ObjectId
+)
+{
+    return _GapFilesSize ( Size, ProjectId, NULL, ObjectId );
+}   /* XFSGapFilesObjectIdSize () */
+
+static
+rc_t CC
+_GapFilesPathDate (
+                KTime_t * Time,
+                const char * Path,
+                bool Completed
+)
+{
+    rc_t RCt;
+    struct KDirectory * NatDir;
+
+    RCt = 0;
+    NatDir = NULL;
+
+    XFS_CSA ( Time, 0 )
+    XFS_CAN ( Time )
+    XFS_CAN ( Path )
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+        if ( Completed ) {
+            RCt = KDirectoryDate ( NatDir, Time, Path );
+        }
+        else {
+            RCt = KDirectoryDate ( NatDir, Time, "%s.cache", Path );
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* _GapFilesPathDate () */
+
+static
+rc_t CC
+_GapFilesDate (
+                KTime_t * Time,
+                uint32_t ProjectId,
+                const char * Accession,
+                uint32_t ObjectId
+)
+{
+    rc_t RCt;
+    struct _GapFilePeer * Peer;
+    const struct KFile * TheFile;
+
+    RCt = 0;
+    Peer = NULL;
+    TheFile = NULL;
+
+    XFS_CSA ( Time, 0 )
+    XFS_CAN ( Time )
+
+    RCt = _GapFilesFindOrCreate (
+                                & Peer,
+                                ProjectId,
+                                Accession,
+                                ObjectId
+                                );
+    if ( RCt == 0 ) {
+            /*  It may be file does not exists
+             */
+        if ( Peer -> size == 0 ) {
+            RCt = _GapFilePeerOpen ( Peer, & TheFile );
+            if ( RCt == 0 ) {
+                KFileRelease ( TheFile );
+            }
+        }
+
+        if ( RCt == 0 ) {
+            RCt = _GapFilesPathDate (
+                                    Time,
+                                    Peer -> cache_path,
+                                    Peer -> status == kxfsComplete
+                                    );
+        }
+
+        _GapFilePeerRelease ( Peer );
+    }
+
+    return RCt;
+}   /* _GapFilesDate () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapFilesAccessionDate (
+                        KTime_t * Time,
+                        uint32_t ProjectId,
+                        const char * Accession
+)
+{
+    return _GapFilesDate ( Time, ProjectId, Accession, 0 );
+}   /* XFSGapFilesAccessionDate () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapFilesObjectIdDate (
+                        KTime_t * Time,
+                        uint32_t ProjectId,
+                        uint32_t ObjectId
+)
+{
+    return _GapFilesDate ( Time, ProjectId, NULL, ObjectId );
+}   /* XFSGapFilesObjectIdDate () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _GapFilesPeer                                                     */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static const char * _sGapFilePeer_classname = "GapFilePeer";
+
+rc_t CC
+_GapFilePeerDispose ( struct _GapFilePeer * self )
+{
+    if ( self != NULL ) {
+        if ( self -> mutabor != NULL ) {
+            KLockRelease ( self -> mutabor );
+            self -> mutabor = NULL;
+        }
+
+        KRefcountWhack (
+                        & ( self -> refcount ),
+                        _sGapFilePeer_classname
+                        );
+
+        self -> project_id = 0;
+
+        if ( self -> accession != NULL ) {
+            free ( ( char * ) self -> accession );
+            self -> accession = NULL;
+        }
+
+        self -> object_id = 0;
+
+        if ( self -> remote_url != NULL ) {
+            free ( ( char * ) self -> remote_url );
+            self -> remote_url = NULL;
+        }
+
+        if ( self -> cache_path != NULL ) {
+            free ( ( char * ) self -> cache_path );
+            self -> cache_path = NULL;
+        }
+
+        self -> status = kxfsReady;
+        self -> enc_type = kxfsEncReady;
+        self -> size = 0;
+
+        if ( self -> file != NULL ) {
+            ( ( struct _GapFile * ) self -> file ) -> peer = NULL;
+            KFileRelease ( self -> file );
+            self -> file = NULL;
+        }
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _GapFilePeerDispose () */
+
+rc_t CC
+_GapFilePeerMake (
+                struct _GapFilePeer ** File,
+                uint32_t ProjectId,
+                const char * Accession,
+                uint32_t ObjectId
+)
+{
+    rc_t RCt;
+    const struct XFSGapProject * Project;
+    struct _GapFilePeer * TheFile;
+
+    RCt = 0;
+    Project = NULL;
+    TheFile = NULL;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( File )
+
+    if ( Accession == NULL && ObjectId == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    TheFile = calloc ( 1, sizeof ( struct _GapFilePeer ) );
+    if ( TheFile == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        KRefcountInit (
+                    & ( TheFile -> refcount ),
+                    1,
+                    _sGapFilePeer_classname,
+                    "GapFilePeerMake",
+                    "GapFilePeer"
+                    );
+        TheFile -> project_id = ProjectId;
+        TheFile -> enc_type = kxfsEncInvalid;
+
+        RCt = XFSGapFindOrCreate ( ProjectId, & Project );
+
+        TheFile -> status = RCt == 0 ? kxfsInvalid : kxfsBroken;
+        TheFile -> size = 0;
+
+        if ( RCt == 0 ) {
+            if ( Accession != NULL ) {
+                RCt = XFS_StrDup (
+                                Accession,
+                                & ( TheFile -> accession )
+                                );
+            }
+            else {
+                TheFile -> object_id = ObjectId;
+            }
+
+            if ( RCt == 0 ) {
+                RCt = KLockMake ( & ( TheFile -> mutabor ) );
+                if ( RCt == 0 ) {
+
+                    if ( Accession != NULL ) {
+                        RCt = XFSGapProjectAccessionUrlAndPath (
+                                            Project,
+                                            Accession,
+                                            & ( TheFile -> remote_url ),
+                                            & ( TheFile -> cache_path )
+                                            );
+                    }
+                    else {
+                        RCt = XFSGapProjectObjectUrlAndPath (
+                                            Project,
+                                            ObjectId,
+                                            & ( TheFile -> remote_url ),
+                                            & ( TheFile -> cache_path )
+                                            );
+                    }
+
+                    if ( RCt == 0 ) {
+                        TheFile -> status = kxfsReady;
+                        TheFile -> enc_type = kxfsEncReady;
+                        TheFile -> size = 0;
+                    }
+                }
+            }
+
+            XFSGapProjectRelease ( Project );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( TheFile != NULL ) {
+            TheFile -> status = kxfsBroken;
+            TheFile -> enc_type = kxfsEncBroken;
+            TheFile -> size = 0;
+        }
+    }
+
+        /*  We have to return bad files too, to avoid multiply attempt
+         *  of initialization of the same files
+         */
+    if ( TheFile != NULL ) {
+        * File = TheFile;
+    }
+
+    return RCt;
+}   /* _GapFilePeerMake () */
+
+rc_t CC
+_GapFilePeerAddRef ( struct _GapFilePeer * self )
+{
+    rc_t RCt;
+    int RefC;
+
+    RCt = 0;
+    RefC = 0;
+
+    XFS_CAN ( self );
+
+    RefC = KRefcountAdd (
+                        & ( self -> refcount ),
+                        _sGapFilePeer_classname
+                        );
+    switch ( RefC ) {
+        case krefOkay :
+            RCt = 0;
+            break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+            RCt = XFS_RC ( rcInvalid );
+            break;
+        default :
+            RCt = XFS_RC ( rcUnknown );
+            break;
+    }
+
+    return RCt;
+}   /* _GapFilePeerAddRef () */
+
+rc_t CC
+_GapFilePeerRelease ( struct _GapFilePeer * self )
+{
+    rc_t RCt;
+    int RefC;
+
+    RCt = 0;
+    RefC = 0;
+
+    XFS_CAN ( self );
+
+    RefC = KRefcountDrop (
+                        & ( self -> refcount ),
+                        _sGapFilePeer_classname
+                        );
+    switch ( RefC ) {
+        case krefOkay :
+        case krefZero :
+                RCt = 0;
+                break;
+        case krefWhack :
+                RCt = _GapFilePeerDispose ( self );
+                break;
+        case krefNegative :
+                RCt = XFS_RC ( rcInvalid );
+                break;
+        default :
+                RCt = XFS_RC ( rcUnknown );
+                break;
+    }
+
+    return RCt;
+}   /* _GapFilePeerRelease () */
+
+static
+bool CC
+_GapFilePeerGood ( struct _GapFilePeer * self )
+{
+    if ( self != NULL ) {
+        return self -> status == kxfsReady || self -> status == kxfsGood;
+    }
+    return false;
+}   /* _GapFilePeerGood () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _GapFile ...                                                      */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static
+rc_t CC
+_GapFileLockPeer ( const struct _GapFile * File )
+{
+    XFS_CAN ( File );
+    XFS_CAN ( File -> peer );
+    XFS_CAN ( File -> peer -> mutabor );
+
+    return KLockAcquire ( File -> peer -> mutabor );
+}   /* _GapFileLockPeer () */
+
+static
+rc_t CC
+_GapFileUnlockPeer ( const struct _GapFile * File )
+{
+    XFS_CAN ( File );
+    XFS_CAN ( File -> peer );
+    XFS_CAN ( File -> peer -> mutabor );
+
+    return KLockUnlock ( File -> peer -> mutabor );
+}   /* _GapFileUnlockPeer () */
+
+/*))
+ || _GapFile virtual table
+((*/
+
+static rc_t CC _GapFile_destroy (
+                                struct KFile * self
+                                );
+static struct KSysFile_v1 * CC _GapFile_get_sysfile (
+                                const struct KFile * self,
+                                uint64_t * Offset
+                                );
+static rc_t CC _GapFile_random_access (
+                                const struct KFile * self
+                                );
+static rc_t CC _GapFile_get_size (
+                                const struct KFile * self,
+                                uint64_t * Size
+                                );
+static rc_t CC _GapFile_set_size (
+                                struct KFile * self,
+                                uint64_t Size
+                               );
+static rc_t CC _GapFile_read (
+                                const struct KFile * self,
+                                uint64_t Offset,
+                                void * Buffer,
+                                size_t BufferSize,
+                                size_t * NumRead
+                                );
+static rc_t CC _GapFile_write (
+                                struct KFile * self,
+                                uint64_t Offset,
+                                const void * Buffer,
+                                size_t BufferSize,
+                                size_t * NumWrite
+                                );
+static uint32_t CC _GapFile_get_type (
+                                const struct KFile * self
+                                );
+
+#ifdef MINOR_2_JOJOBA
+static rc_t CC _GapFile_timed_read (
+                                const struct KFile * self,
+                                uint64_t Offset,
+                                void * Buffer,
+                                size_t BufferSize,
+                                size_t * NumRead,
+                                struct timeout_t * Tm
+                                );
+static rc_t CC _GapFile_timed_write (
+                                struct KFile * self,
+                                uint64_t Offset,
+                                const void * Buffer,
+                                size_t BufferSize,
+                                size_t * NumWrit,
+                                struct timeout_t * Tm
+                                );
+#endif /* MINOR_2_JOJOBA */
+
+static struct KFile_vt_v1 _svtGapFile = {
+                                1,  /* maj */
+                                1,  /* min */
+
+                            /* start minor version == 0 */
+                                _GapFile_destroy,
+                                _GapFile_get_sysfile,
+                                _GapFile_random_access,
+                                _GapFile_get_size,
+                                _GapFile_set_size,
+                                _GapFile_read,
+                                _GapFile_write,
+                            /* end minor version == 0 */
+
+                            /* start minor version == 1 */
+                                _GapFile_get_type,
+                            /* end minor version == 1 */
+
+#ifdef MINOR_2_JOJOBA
+                            /* start minor version == 2 */
+                                _GapFile_timed_read,
+                                _GapFile_timed_write,
+                            /* end minor version == 2 */
+#endif /* MINOR_2_JOJOBA */
+};
+
+/*))
+ || _GapFile constructor
+((*/
+static
+rc_t CC
+_GapFileMake (
+            const struct KFile ** File,
+            const struct KFile * LooneyBin,
+            struct _GapFilePeer * Peer
+)
+{
+    rc_t RCt;
+    struct _GapFile * GapFile;
+
+    RCt = 0;
+    GapFile = NULL;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( File )
+    XFS_CAN ( LooneyBin )
+    XFS_CAN ( Peer )
+
+        /*  First we should check if Peer is good and valid 
+         */
+    if ( ! _GapFilePeerGood ( Peer ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    GapFile = calloc ( 1, sizeof ( struct _GapFile ) );
+    if ( GapFile == NULL ) {
+        RCt = XFS_RC ( rcNull );
+    }
+    else {
+        RCt = KFileInit (
+                & ( GapFile -> file ),
+                ( const KFile_vt * ) & _svtGapFile,
+                "GapFile",
+                "GapFile",
+                true,
+                false
+                );
+        if ( RCt == 0 ) {
+            RCt = _GapFilePeerAddRef ( Peer );
+            if ( RCt == 0 ) {
+                GapFile -> peer = Peer;
+                GapFile -> looney_bin = LooneyBin;
+
+                * File = ( const KFile * ) & ( GapFile -> file );
+
+                Peer -> file = * File;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * File = NULL;
+        KFileRelease ( & ( GapFile -> file ) );
+    }
+
+    return RCt;
+}   /* _GapFileMake () */
+
+/*))
+ || _GapFile virtual table implementation
+((*/
+rc_t CC
+_GapFile_destroy ( struct KFile * self )
+{
+    struct _GapFile * File;
+    struct _GapFilePeer * Peer;
+
+    Peer = NULL;
+    File = ( struct _GapFile * ) self;
+
+    if ( File != NULL ) {
+
+        Peer = File -> peer;
+        if ( Peer != NULL ) {
+            KLockAcquire ( Peer -> mutabor );
+
+            File -> peer = NULL;
+
+
+            if ( Peer -> file == & ( File -> file ) ) {
+                Peer -> file = NULL;
+            }
+
+            KLockUnlock ( Peer -> mutabor );
+
+            _GapFilePeerRelease ( Peer );
+        }
+
+        if ( File -> looney_bin != NULL ) {
+            KFileRelease ( File -> looney_bin );
+            File -> looney_bin = NULL;
+        }
+
+        free ( File );
+    }
+
+    return 0;
+}   /* _GapFile_destroy () */
+
+struct KSysFile_v1 * CC
+_GapFile_get_sysfile ( const struct KFile * self, uint64_t * Offset )
+{
+    struct _GapFile * File = ( struct _GapFile * ) self;
+
+    if ( File != NULL ) {
+        if ( File -> looney_bin != NULL ) {
+            return KFileGetSysFile ( File -> looney_bin, Offset );
+        }
+    }
+
+    return NULL;
+}   /* _GapFile_get_sysfile () */
+
+rc_t CC
+_GapFile_random_access ( const struct KFile * self )
+{
+    struct _GapFile * File = ( struct _GapFile * ) self;
+
+    XFS_CAN ( File )
+    XFS_CAN ( File -> looney_bin )
+
+    return KFileRandomAccess ( File -> looney_bin );
+}   /* _GapFile_random_access () */
+
+rc_t CC
+_GapFile_get_size ( const struct KFile * self, uint64_t * Size )
+{
+    rc_t RCt;
+    struct _GapFile * File;
+
+    RCt = 0;
+    File = ( struct _GapFile * ) self;
+
+    XFS_CSA ( Size, 0 )
+    XFS_CAN ( File )
+    XFS_CAN ( Size )
+    XFS_CAN ( File -> looney_bin )
+
+    RCt = _GapFileLockPeer ( File );
+    if ( RCt == 0 ) {
+        RCt = KFileSize ( File -> looney_bin, Size );
+
+        _GapFileUnlockPeer ( File );
+    }
+
+    return RCt;
+}   /* _GapFile_get_size () */
+
+rc_t CC
+_GapFile_set_size ( struct KFile * self, uint64_t Size )
+{
+    XFS_CAN ( self )
+
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}   /* _GapFile_set_size () */
+
+rc_t CC
+_GapFile_read (
+                const struct KFile * self,
+                uint64_t Offset,
+                void * Buffer,
+                size_t BufferSize,
+                size_t * NumRead
+)
+{
+    rc_t RCt;
+    struct _GapFile * File;
+
+    RCt = 0;
+    File = ( struct _GapFile * ) self;
+
+    XFS_CSA ( NumRead, 0 )
+    XFS_CAN ( File )
+    XFS_CAN ( Buffer )
+    XFS_CAN ( NumRead )
+    XFS_CAN ( File -> looney_bin )
+
+    RCt = _GapFileLockPeer ( File );
+    if ( RCt == 0 ) {
+        RCt = KFileReadAll (
+                        File -> looney_bin,
+                        Offset,
+                        Buffer,
+                        BufferSize,
+                        NumRead
+                        );
+
+        _GapFileUnlockPeer ( File );
+    }
+
+    return RCt;
+}   /* _GapFile_read () */
+
+rc_t CC
+_GapFile_write (
+                struct KFile * self,
+                uint64_t Offset,
+                const void * Buffer,
+                size_t BufferSize,
+                size_t * NumWrite
+)
+{
+    XFS_CSA ( NumWrite, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Buffer )
+    XFS_CAN ( NumWrite )
+
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}   /* _GapFile_write () */
+
+uint32_t CC
+_GapFile_get_type ( const struct KFile * self )
+{
+    struct _GapFile * File = ( struct _GapFile * ) self;
+    return KFileType ( File -> looney_bin );
+}   /* _GapFile_get_type () */
+
+
+#ifdef MINOR_2_JOJOBA
+rc_t CC
+_GapFile_timed_read (
+                const struct KFile * self,
+                uint64_t Offset,
+                void * Buffer,
+                size_t BufferSize,
+                size_t * NumRead,
+                struct timeout_t * Tm
+)
+{
+    rc_t RCt;
+    struct _GapFile * File;
+
+    RCt = 0;
+    File = ( struct _GapFile * ) self;
+
+    XFS_CSA ( NumRead, 0 )
+    XFS_CAN ( File )
+    XFS_CAN ( Buffer )
+    XFS_CAN ( NumRead )
+    XFS_CAN ( File -> looney_bin )
+
+    RCt = _GapFileLockPeer ( File );
+    if ( RCt == 0 ) {
+        KFileTimedRead (
+                        File,
+                        Offset,
+                        Buffer,
+                        BufferSize,
+                        NumRead,
+                        Tm
+                        );
+
+        _GapFileUnlockPeer ( File );
+    }
+
+    return RCt;
+}   /* _GapFile_timed_read () */
+
+rc_t CC
+_GapFile_timed_write (
+                struct KFile * self,
+                uint64_t Offset,
+                const void * Buffer,
+                size_t BufferSize,
+                size_t * NumWrite,
+                struct timeout_t * Tm
+)
+{
+    XFS_CSA ( NumWrite, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Buffer )
+    XFS_CAN ( NumWrite )
+    
+    return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}   /* _GapFile_timed_write () */
+
+#endif /* MINOR_2_JOJOBA */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _GapFilePeerOpen                                                  */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static
+rc_t CC
+_CheckMakeParentDir ( struct KDirectory * Directory, const char * Path )
+{
+    rc_t RCt;
+    const struct XFSPath * xPath;
+    const struct XFSPath * xParent;
+    const char * Parent;
+    uint32_t PathType;
+
+    RCt = 0;
+    xPath = NULL;
+    xParent = NULL;
+    Parent = NULL;
+    PathType = kptNotFound;
+
+    XFS_CAN ( Directory )
+    XFS_CAN ( Path )
+
+    RCt = XFSPathMake ( & xPath, false, Path );
+    if ( RCt == 0 ) {
+        RCt = XFSPathParent ( xPath, & xParent );
+        if ( RCt == 0 ) {
+            Parent = XFSPathGet ( xParent );
+
+            PathType = KDirectoryPathType ( Directory, Parent );
+            if ( PathType == kptNotFound ) {
+                RCt = KDirectoryCreateDir (
+                                        Directory,
+                                        XFSPermRWDefContNum (),
+                                        kcmCreate,
+                                        Parent
+                                        );
+            }
+            else {
+                if ( PathType != kptDir ) {
+                    RCt = XFS_RC ( rcInvalid );
+                }
+            }
+
+            XFSPathRelease ( xParent );
+        }
+
+        XFSPathRelease ( xPath );
+    }
+
+    return RCt;
+}   /* _CheckMakeParentDir () */
+
+static
+rc_t CC
+_Take_Burro_From_Pen (
+                    const struct KFile ** File,
+                    const char * Url,
+                    bool Cached
+)
+{
+    rc_t RCt;
+    struct _GapFiles * Files;
+    const struct XFSBurro * Burro;
+
+    RCt = 0;
+    Files = _FilesGet ();
+    Burro = NULL;
+
+    RCt = XFSPenGet ( Files -> pen, & Burro, Url );
+    if ( RCt == 0 ) {
+        if ( ! XFSBurroGood ( Burro ) ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+            RCt = Cached
+                        ? XFSBurroCachedFile ( Burro, File )
+                        : XFSBurroRecachedFile ( Burro, File )
+                        ;
+        }
+
+        XFSBurroRelease ( Burro );
+    }
+
+    return RCt;
+}   /* _Take_Burro_From_Pen_ () */
+
+static
+rc_t CC
+_Open_File_1 ( struct _GapFilePeer * self, const struct KFile ** File )
+{
+    rc_t RCt;
+    uint32_t PathType;
+    struct KDirectory * NatDir;
+    const struct KFile * File_1;
+    const struct KFile * File_2;
+
+    RCt = 0;
+    PathType = kptNotFound;
+    NatDir = NULL;
+    File_1 = NULL;
+    File_2 = NULL;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( self )
+    XFS_CAN ( File )
+
+    if ( ! _GapFilePeerGood ( self ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+            /*  First we should check if file is complete
+             */
+        if ( self -> status == kxfsReady ) {
+                /*  First we should check if cached file exists
+                 *  Open and return it
+                 */
+            PathType = KDirectoryPathType ( NatDir, self -> cache_path );
+            if ( PathType == kptNotFound ) {
+                    /*  Second, we should create parent directory if
+                     *  it does not exists
+                     */
+                RCt = _CheckMakeParentDir ( NatDir, self -> cache_path );
+                if ( RCt == 0 ) {
+                    /*  KNS File first
+                     */
+#ifdef _USE_CACHED_CONN_
+                    RCt = _Take_Burro_From_Pen (
+                                                & File_1,
+                                                self -> remote_url,
+                                                true
+                                                );
+#else /* _USE_CACHED_CONN_ */
+                    RCt = KNSManagerMakeHttpFile (
+                                                XFS_KnsManager (),
+                                                & File_1,
+                                                NULL,
+                                                0x01010000,
+                                                self -> remote_url
+                                                );
+#endif /* _USE_CACHED_CONN_ */
+
+                    if ( RCt == 0 ) {
+                        RCt = KDirectoryMakeCacheTee (
+                                            NatDir,
+                                            & File_2,
+                                            File_1,
+                                            32768 * 4, /* Buffer size */
+                                            self -> cache_path
+                                            );
+                        KFileRelease ( File_1 );
+                    }
+                }
+            }
+            else {
+                if ( PathType == kptFile ) {
+                    self -> status = kxfsComplete;
+                }
+                else {
+                    RCt = XFS_RC ( rcInvalid );
+                }
+            }
+
+        }
+
+        if ( self -> status == kxfsComplete ) {
+            RCt = KDirectoryOpenFileRead (
+                                        NatDir,
+                                        & File_2,
+                                        self -> cache_path
+                                        );
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    if ( RCt == 0 ) {
+            /* We suppose that all files from dbGaP has non ZERO size
+             * and that size does not change with time
+             */
+        if ( self -> size == 0 ) { 
+            RCt = KFileSize ( File_2, & ( self -> size ) );
+        }
+        if ( RCt == 0 ) {
+            * File = File_2;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * File = NULL;
+
+        self -> status = kxfsBroken;
+        self -> enc_type = kxfsEncBroken;
+        self -> size = 0;
+    }
+
+    return RCt;
+}   /* _Open_File_1 () */
+
+static
+rc_t CC
+_CheckEncType ( struct _GapFilePeer * self, const struct KFile * File )
+{
+    rc_t RCt;
+    char BF [ XFS_SIZE_128 ];
+    size_t NumRead;
+
+    RCt = 0;
+    NumRead = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( File )
+
+    switch ( self -> enc_type ) {
+        case kxfsEncInvalid :
+        case kxfsEncBroken :
+                return XFS_RC ( rcInvalid );
+
+        case kxfsEncNone :
+        case kxfsEncEncFile :
+        case kxfsEncSraFile :
+        case kxfsEncWGAFile :
+                return 0;
+
+        case kxfsEncReady :
+                break;
+
+        default :
+                return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KFileReadAll ( File, 0, BF, sizeof ( BF ), & NumRead );
+    if ( RCt != 0 ) {
+        self -> enc_type = kxfsEncBroken;
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KFileIsEnc ( BF, NumRead );
+    if ( RCt == 0 ) {
+        self -> enc_type = KFileIsSraEnc ( BF, NumRead ) == 0
+                                                    ? kxfsEncSraFile
+                                                    : kxfsEncEncFile
+                                                    ;
+
+    }
+    else {
+        self -> enc_type = KFileIsWGAEnc ( BF, NumRead ) == 0
+                                                    ? kxfsEncWGAFile
+                                                    : kxfsEncNone
+                                                    ;
+    }
+
+    return 0;
+}   /* _CheckEncType () */
+
+static
+rc_t CC
+_Open_File_2 (
+            struct _GapFilePeer * self,
+            const struct KFile ** DecFile,
+            const struct KFile * EncFile
+)
+{
+    rc_t RCt;
+    const struct KFile * File_2;
+    const struct XFSGapProject * Project;
+    const struct KKey * Key;
+    const char * Password;
+    size_t PasswordSize;
+
+    RCt = 0;
+    File_2 = NULL;
+    Project = NULL;
+    Key = NULL;
+    Password = NULL;
+    PasswordSize = 0;
+
+    XFS_CSAN ( DecFile )
+    XFS_CAN ( self )
+    XFS_CAN ( DecFile )
+    XFS_CAN ( EncFile )
+
+    if ( ! _GapFilePeerGood ( self ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    switch ( self -> enc_type ) {
+        case kxfsEncNone :
+            RCt = KFileAddRef ( EncFile );
+            if ( RCt == 0 ) {
+                File_2 = EncFile;
+            }
+            break;
+
+        case kxfsEncEncFile :
+            RCt = XFSGapFindOrCreate ( self -> project_id, & Project );
+            if ( RCt == 0 ) {
+                RCt = XFSGapProjectEncriptionKey ( Project, & Key );
+                if ( RCt == 0 ) {
+                    RCt = KEncFileMakeRead ( & File_2, EncFile, Key );
+                }
+
+                XFSGapProjectRelease ( Project );
+            }
+            break;
+
+        case kxfsEncSraFile :
+                /* Really I do not know what to do here
+                 */
+            RCt = KFileAddRef ( EncFile );
+            if ( RCt == 0 ) {
+                File_2 = EncFile;
+            }
+            break;
+
+        case kxfsEncWGAFile :
+            RCt = XFSGapFindOrCreate ( self -> project_id, & Project );
+            if ( RCt == 0 ) {
+                RCt = XFSGapProjectPassword (
+                                            Project,
+                                            & Password,
+                                            & PasswordSize
+                                            );
+                if ( RCt == 0 ) {
+                    RCt = KFileMakeWGAEncRead (
+                                            & File_2,
+                                            EncFile,
+                                            Password,
+                                            PasswordSize
+                                            );
+                }
+
+                XFSGapProjectRelease ( Project );
+            }
+            break;
+
+        default :
+            RCt = XFS_RC ( rcInvalid );
+            break;
+    }
+
+    if ( RCt == 0 ) {
+        * DecFile = File_2;
+    }
+    else {
+        * DecFile = NULL;
+
+        if ( File_2 != NULL ) {
+            KFileRelease ( File_2 );
+        }
+    }
+
+    return RCt;
+}   /* _Open_File_2 () */
+
+/*))
+  ||    This method, will return file opened for read.
+  ||    Unsynchronized. Uses Peer as input, but also
+  ||    modifies Peer's fields too
+  ((*/
+static
+rc_t CC
+_GapFilePeerOpen_NoLock (
+                    struct _GapFilePeer * self,
+                    const struct KFile ** File
+)
+{
+    rc_t RCt;
+    const struct KFile * File_1;
+    const struct KFile * File_2;
+    const struct KFile * File_3;
+
+    RCt = 0;
+    File_1 = NULL;
+    File_2 = NULL;
+    File_3 = NULL;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( self )
+    XFS_CAN ( File )
+
+        /*  The peer is invalid : something went wrong
+         */
+    if ( ! _GapFilePeerGood ( self ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+        /*  We do have open file already
+         */
+    File_1 = self -> file;
+    if ( File_1 != NULL ) {
+        RCt = KFileAddRef ( File_1 );
+        if ( RCt == 0 ) {
+            * File = File_1;
+        }
+        return RCt;
+    }
+
+        /*  Three stage process
+         *
+         *  First we shoud open Http and Tee files or just open file
+         *  if it is completed
+         *
+         *  Check type of file ( NoEnc, Enc, SRA/WGA )
+         *
+         *  Opening Encoded file
+         *
+         */
+    RCt = _Open_File_1 ( self, & File_1 );
+    if ( RCt == 0 ) {
+            /* Checking Encoding type */
+        RCt = _CheckEncType ( self, File_1 );
+        if ( RCt == 0 ) {
+            RCt = _Open_File_2 ( self, & File_2, File_1 );
+            if ( RCt == 0 ) {
+                    /* So, if file already dowloaded and it is not
+                     * encoded, we may just return file withou
+                     * modifying the peer
+                     */
+                if ( self -> status == kxfsComplete
+                    && self -> enc_type == kxfsEncNone
+                ) {
+                    * File = File_2;
+                }
+                else {
+                    RCt = _GapFileMake ( & File_3, File_2, self );
+                    if ( RCt == 0 ) {
+                        * File = File_3;
+                    }
+                }
+            }
+        }
+
+        KFileRelease ( File_1 );
+    }
+
+    if ( RCt != 0 ) {
+        * File = NULL;
+
+        if ( File_2 != NULL ) {
+            KFileRelease ( File_2 );
+        }
+
+        if ( File_3 != NULL ) {
+            KFileRelease ( File_3 );
+        }
+    }
+
+    return RCt;
+}   /* _GapFilePeerOpen_NoLock () */
+
+rc_t CC
+_GapFilePeerOpen (
+                struct _GapFilePeer * self,
+                const struct KFile ** File
+)
+{
+    rc_t RCt;
+    const struct KFile * TheFile;
+
+    RCt = 0;
+    TheFile = NULL;
+
+    XFS_CSAN ( File )
+    XFS_CAN ( self )
+    XFS_CAN ( File )
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _GapFilePeerOpen_NoLock ( self, & TheFile );
+        if ( RCt == 0 ) {
+            * File = TheFile;
+        }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    if ( RCt != 0 ) {
+        * File = NULL;
+
+        if ( TheFile != NULL ) {
+            KFileRelease ( TheFile );
+        }
+    }
+
+    return RCt;
+}   /* _GapFilePeerOpen () */
diff --git a/libs/xfs/xgapf.h b/libs/xfs/xgapf.h
new file mode 100644
index 0000000..3b9398b
--- /dev/null
+++ b/libs/xfs/xgapf.h
@@ -0,0 +1,126 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xgapf_h_
+#define _xgapf_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   There is some primitives which allow to access dbGaP files
+  ))))  
+ ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
+ * LYRICS:
+ *
+ * That file contains set of structures which will implement FUSE/DOKAN
+ * access to dbGaP data files.
+ * 
+ * PRIMITEVES:
+ *
+ * XFSGapFiles - use this structure to access dbGaP data files
+ *
+ *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //     Forwards
+((*/
+struct XFSGapFiles;
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //     XFSGapFiles
+((*/
+
+    /* These should be called before/after using this interface
+     */
+XFS_EXTERN rc_t CC XFSGapFilesInit ();
+XFS_EXTERN rc_t CC XFSGapFilesDipose ();
+
+/*))
+ //     Opening only for reading
+((*/
+XFS_EXTERN rc_t CC XFSGapFilesOpenAccession (
+                            const struct KFile ** File,
+                            uint32_t ProjectId,
+                            const char * Accession
+                            );
+
+XFS_EXTERN rc_t CC XFSGapFilesOpenObjectId (
+                            const struct KFile ** File,
+                            uint32_t ProjectId,
+                            uint32_t ObjectId
+                            );
+
+/*))
+ //     Attributes if possible
+((*/
+XFS_EXTERN rc_t CC XFSGapFilesAccessionSize (
+                            uint64_t * Size,
+                            uint32_t ProjectId,
+                            const char * Accession
+                            );
+
+XFS_EXTERN rc_t CC XFSGapFilesAccessionDate (
+                            KTime_t * Time,
+                            uint32_t ProjectId,
+                            const char * Accession
+                            );
+
+XFS_EXTERN rc_t CC XFSGapFilesObjectIdSize (
+                            uint64_t * Size,
+                            uint32_t ProjectId,
+                            uint32_t ObjectId
+                            );
+
+XFS_EXTERN rc_t CC XFSGapFilesObjectIdDate (
+                            KTime_t * Time,
+                            uint32_t ProjectId,
+                            uint32_t ObjectId
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*))
+ //     XFSGapKart_Temp
+((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _xgapf_h_ */
diff --git a/libs/xfs/xgapk.c b/libs/xfs/xgapk.c
new file mode 100644
index 0000000..3f75bc4
--- /dev/null
+++ b/libs/xfs/xgapk.c
@@ -0,0 +1,1777 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/container.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+
+#include <kproc/lock.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <kfg/kart.h>
+
+#include "schwarzschraube.h"
+#include "xgap.h"
+#include "xgapk.h"
+#include "zehr.h"
+
+#include <sysalloc.h>
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)) XFSGapKart and XFSGapKartItem structs are living here
+ ((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSGapKartItem ...                                                */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSGapKartItem {
+    BSTNode node;
+    KRefcount refcount;
+
+    uint32_t project_id;
+    uint32_t object_id;
+
+    const char * accession;
+    const char * name;
+    const char * description;
+};
+
+static const char * _sXFSGapKartItem_classname = "XFSGapKartItem";
+
+static
+rc_t CC
+_KartItemDispose ( struct XFSGapKartItem * self )
+{
+    if ( self != NULL ) {
+        KRefcountWhack (
+                    & ( self -> refcount ),
+                    _sXFSGapKartItem_classname
+                    ); 
+        self -> project_id = 0;
+        self -> object_id = 0;
+
+        if ( self -> accession != NULL ) {
+            free ( ( char * ) self -> accession ) ;
+            self -> accession = NULL;
+        }
+        if ( self -> name != NULL ) {
+            free ( ( char * ) self -> name ) ;
+            self -> name = NULL;
+        }
+        if ( self -> description != NULL ) {
+            free ( ( char * ) self -> description ) ;
+            self -> description = NULL;
+        }
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _KartItemDispose () */
+
+static
+rc_t CC
+_KartItemMake (
+            struct XFSGapKartItem ** RetItem,
+            const struct KartItem * Item
+)
+{
+    rc_t RCt;
+    const struct String * TheString;
+    struct XFSGapKartItem * xItem;
+    uint64_t ProjectId, ObjectId;
+
+    RCt = 0;
+    TheString = NULL;
+    xItem = NULL;
+    ProjectId = ObjectId = 0;
+
+    XFS_CSAN ( RetItem )
+    XFS_CAN ( RetItem )
+    XFS_CAN ( Item )
+
+    xItem = calloc ( 1, sizeof ( struct XFSGapKartItem ) );
+    if ( xItem == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    KRefcountInit (
+                & ( xItem -> refcount ),
+                1,
+                _sXFSGapKartItem_classname,
+                "_KartItemMake",
+                "KartItem"
+                );
+
+    RCt = KartItemProjIdNumber ( Item, & ProjectId );
+    if ( RCt == 0 ) {
+        xItem -> project_id = ( uint32_t ) ProjectId;
+    }
+
+    if ( RCt == 0 ) {
+        RCt = KartItemItemId ( Item, & TheString );
+        if ( RCt == 0 && TheString -> len != 0 ) {
+            RCt = KartItemItemIdNumber ( Item, & ObjectId );
+            if ( RCt == 0 ) {
+                xItem -> object_id = ( uint32_t ) ObjectId;
+            }
+        }
+        else {
+            xItem -> object_id = 0;
+        }
+    }
+
+    if ( RCt == 0 ) {
+        RCt = KartItemAccession ( Item, & TheString );
+        if ( RCt == 0 && TheString -> len != 0 ) {
+            RCt = XFS_SStrDup ( TheString, & xItem -> accession );
+        }
+        else {
+            xItem -> accession = NULL;
+        }
+    }
+
+    if ( RCt == 0 ) {
+        RCt = KartItemName ( Item, & TheString );
+        if ( RCt == 0 && TheString -> len != 0 ) {
+            RCt = XFS_SStrDup ( TheString, & xItem -> name );
+        }
+        else {
+            xItem -> name = NULL;
+        }
+    }
+
+    if ( RCt == 0 ) {
+        RCt = KartItemItemDesc ( Item, & TheString );
+        if ( RCt == 0 && TheString -> len != 0 ) {
+            RCt = XFS_SStrDup ( TheString, & xItem -> description );
+        }
+        else {
+            xItem -> description = NULL;
+        }
+    }
+
+    if ( xItem -> object_id == 0 && xItem -> accession == NULL ) {
+        RCt = XFS_RC ( rcInvalid );
+    }
+
+    if ( RCt == 0 ) {
+        * RetItem = xItem;
+    }
+    else {
+        if ( xItem != NULL ) {
+            _KartItemDispose ( xItem );
+        }
+    }
+
+    return RCt;
+}   /* _KartItemMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartItemAddRef ( const struct XFSGapKartItem * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CAN ( self )
+
+    switch ( KRefcountAdd ( & ( self -> refcount ), _sXFSGapKartItem_classname ) ) {
+        case krefOkay :
+                    RCt = 0;
+                    break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSGapKartItemAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartItemRelease ( const struct XFSGapKartItem * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CAN ( self )
+
+    switch ( KRefcountDrop ( & ( self -> refcount ), _sXFSGapKartItem_classname ) ) {
+
+        case krefOkay :
+        case krefZero :
+                    RCt = 0;
+                    break;
+        case krefWhack :
+                    RCt = _KartItemDispose ( ( struct XFSGapKartItem * ) self );
+                    break;
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSGapKartItemRelease () */
+
+LIB_EXPORT
+uint32_t CC
+XFSGapKartItemProjectId ( const struct XFSGapKartItem * self )
+{
+    return self == NULL ? 0 : self -> project_id;
+}   /* XFSGapKartItemProjectId () */
+
+LIB_EXPORT
+uint32_t CC
+XFSGapKartItemObjectId ( const struct XFSGapKartItem * self )
+{
+    return self == NULL ? 0 : self -> object_id;
+}   /* XFSGapKartItemObjectId () */
+
+LIB_EXPORT
+const char * CC
+XFSGapKartItemAccession ( const struct XFSGapKartItem * self )
+{
+    return self == NULL ? NULL : ( self -> accession );
+}   /* XFSGapKartItemAccession () */
+
+LIB_EXPORT
+const char * CC
+XFSGapKartItemName ( const struct XFSGapKartItem * self )
+{
+    return self == NULL ? NULL : ( self -> name );
+}   /* XFSGapKartItemName () */
+
+LIB_EXPORT
+const char * CC
+XFSGapKartItemDescription ( const struct XFSGapKartItem * self )
+{
+    return self == NULL ? NULL : ( self -> description );
+}   /* XFSGapKartItemDescription () */
+
+LIB_EXPORT
+const char * CC
+XFSGapKartItemDisplayName ( const struct XFSGapKartItem * self )
+{
+    if ( self != NULL ) {
+        return self -> accession == NULL
+                                    ? self -> name
+                                    : self -> accession
+                                    ;
+    }
+    return NULL;
+}   /* XFSGapKartItemProject () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))))
+ ((((   This is very stupid and under developed structure, which
+  ))))  is very un-effictive.
+ ((((   Kart could contain items, which belong to different
+  ))))  projects. I need fast way to check if cart contains items
+ ((((   which belong to some particular project.
+  ))))  Good thing, Kart could contain items for not more than two
+ ((((   or three projects so, we could use bubble search.
+  ))))  There is structure _LaIn ( LAme INdex )
+ ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _LaIn                                                           */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct _LaIn {
+    uint32_t q;     /* items qty */
+    uint32_t c;     /* array capasity */
+    uint32_t * a;   /* array */
+};
+
+static
+rc_t CC
+_LaInMake ( const struct _LaIn ** LaIn )
+{
+    struct _LaIn * Ret = NULL;
+
+    XFS_CSAN ( LaIn )
+    XFS_CAN ( LaIn )
+
+    Ret = calloc ( 1, sizeof ( struct _LaIn ) );
+    if ( Ret == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    * LaIn = Ret;
+
+    return 0;
+}   /* _LaInMake () */
+
+static
+rc_t CC
+_LaInDispose ( const struct _LaIn * self )
+{
+    struct _LaIn * LaIn = ( struct _LaIn * ) self;
+
+    if ( LaIn != NULL ) {
+        if ( LaIn -> a != NULL ) {
+            free ( LaIn -> a );
+            LaIn -> a = NULL;
+        }
+
+        LaIn -> q = 0;
+        LaIn -> c = 0;
+
+        free ( LaIn );
+    }
+
+    return 0;
+}   /* _LaInDispose () */
+
+static
+rc_t CC
+_LaInRealloc ( struct _LaIn * self, uint32_t Qty )
+{
+    rc_t RCt;
+    uint32_t * NewA;
+    uint32_t NewC;
+
+#define POPOTAN 4
+
+    RCt = 0;
+    NewA = NULL;
+    NewC = 0;
+
+    XFS_CAN ( self )
+
+    if ( Qty < self -> c ) {
+        return 0;
+    }
+
+    NewC = ( Qty / POPOTAN + 1 ) * POPOTAN;
+
+    NewA = malloc ( sizeof ( uint32_t ) * NewC );
+    if ( NewA == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    if ( self -> a != NULL ) {
+        if ( self -> q != 0 ) {
+            memmove ( NewA, self -> a, sizeof ( uint32_t ) * self -> q );
+        }
+
+        free ( self -> a );
+    }
+
+    self -> a = NewA;
+    self -> c = NewC;
+
+#undef POPOTAN
+
+    return RCt;
+}   /* _LaInRealloc () */
+
+static
+bool CC
+_LaInHas ( const struct _LaIn * self, uint32_t Value )
+{
+    uint32_t llp = 0;
+
+    if ( self != NULL ) {
+        for ( llp = 0; llp < self -> q; llp ++ ) {
+            if ( Value == * ( self -> a + llp ) ) {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}   /* _LaInHas () */
+
+static
+rc_t CC
+_LaInAdd ( const struct _LaIn * self, uint32_t Value )
+{
+    rc_t RCt;
+    struct _LaIn * LaIn;
+
+    RCt = 0;
+    LaIn = ( struct _LaIn * ) self;
+
+    XFS_CAN ( LaIn )
+
+    if ( ! _LaInHas ( LaIn, Value ) ) {
+            
+        RCt = _LaInRealloc ( LaIn, LaIn -> q + 1 );
+        if ( RCt == 0 ) {
+
+            LaIn -> a [ LaIn -> q ] = Value;
+            LaIn -> q ++;
+        }
+    }
+
+    return RCt;
+}   /* _LaInAdd () */
+
+#ifdef JOJOBA
+/*))  Unnecessary in real life
+ ((*/
+static
+rc_t CC
+_LaInQty ( const struct _LaIn * self, uint32_t * Qty )
+{
+    XFS_CSA ( Qty, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Qty )
+
+    * Qty = self -> q;
+
+    return 0;
+}   /* _LaInQty () */
+
+/*))  Unnecessary in real life
+ ((*/
+static
+rc_t CC
+_LaInGet (
+            const struct _LaIn * self,
+            uint32_t Index,
+            uint32_t * Value
+)
+{
+    XFS_CSA ( Value, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Value )
+
+    if ( Index < self -> q ) {
+        * Value = self -> a [ Index ];
+        return 0;
+    }
+
+    return XFS_RC ( rcInvalid );
+}   /* _LaInGet () */
+#endif /* JOJOBA */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSGapKart ...                                                    */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSGapKart {
+    BSTNode node;
+
+    BSTree tree;
+    KRefcount refcount;
+
+    const char * path;
+    const char * name;
+
+    const struct _LaIn * lain;
+};
+
+static const char * _sXFSGapKart_classname = "XFSGapKart";
+
+static rc_t CC _GapKartLoad ( struct XFSGapKart * self );
+
+static
+rc_t CC
+_KartPath (
+            const char * KartPath,
+            const char * KartName,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    rc_t RCt;
+    size_t NumW;
+
+    RCt = 0;
+    NumW = 0;
+
+    XFS_CAN ( KartPath )
+    XFS_CAN ( KartName )
+    XFS_CAN ( Buffer )
+
+    RCt = string_printf (
+                        Buffer,
+                        BufferSize,
+                        & NumW,
+                        "%s/%s",
+                        KartPath,
+                        KartName
+                        );
+    if ( RCt != 0 ) {
+        * Buffer = 0;
+    }
+
+    return RCt;
+}   /* _KartPath () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartMake (
+                const struct XFSGapKart ** Kart,
+                const char * Path,
+                const char * Name
+)
+{
+    rc_t RCt;
+    struct XFSGapKart * RetKart;
+
+    RCt = 0;
+    RetKart = NULL;
+
+    XFS_CSAN ( Kart )
+    XFS_CAN ( Kart )
+    XFS_CAN ( Path )
+
+    RetKart = calloc ( 1, sizeof ( struct XFSGapKart ) );
+    if ( RetKart == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    BSTreeInit ( & ( RetKart -> tree ) );
+    KRefcountInit (
+                & ( RetKart -> refcount ),
+                1,
+                _sXFSGapKart_classname,
+                "XFSGapKartMake",
+                "Kart"
+                );
+
+    RCt = _LaInMake ( & ( RetKart -> lain ) );
+    if ( RCt == 0 ) {
+        RCt = XFS_StrDup ( Path, & ( RetKart -> path ) );
+        if ( RCt == 0 ) {
+            RCt = XFS_StrDup ( Name, & ( RetKart -> name ) );
+            if ( RCt == 0 ) {
+                RCt = _GapKartLoad ( RetKart );
+                if ( RCt == 0 ) {
+                    * Kart = RetKart;
+                }
+                else {
+                    XFSGapKartDispose ( RetKart );
+                }
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFSGapKartMake () */
+
+static
+void CC
+_KartWhackCallback ( BSTNode * Node, void * unused )
+{
+    if ( Node != NULL ) {
+        XFSGapKartItemRelease ( ( struct XFSGapKartItem * ) Node );
+    }
+}   /* _KartWhackCallback () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartDispose ( const struct XFSGapKart * self )
+{
+    struct XFSGapKart * Kart = ( struct XFSGapKart * ) self;
+
+    if ( Kart != NULL ) {
+        if ( Kart -> lain != NULL ) {
+            _LaInDispose ( Kart -> lain );
+            Kart -> lain = NULL;
+        }
+
+        if ( Kart -> name != NULL ) {
+            free ( ( char * ) Kart -> name );
+            Kart -> name = NULL;
+        }
+
+        if ( Kart -> path != NULL ) {
+            free ( ( char * ) Kart -> path );
+            Kart -> path = NULL;
+        }
+
+        BSTreeWhack ( & ( Kart -> tree ), _KartWhackCallback, NULL );
+        KRefcountWhack ( & ( Kart -> refcount ), _sXFSGapKart_classname );
+
+        free ( Kart );
+    }
+
+    return 0;
+}   /* XFSGapKartDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartAddRef ( const struct XFSGapKart * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CAN ( self )
+
+    switch ( KRefcountAdd ( & ( self -> refcount ), _sXFSGapKart_classname ) ) {
+        case krefOkay :
+                    RCt = 0;
+                    break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSGapKartAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartRelease ( const struct XFSGapKart * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CAN ( self )
+
+    switch ( KRefcountDrop ( & ( self -> refcount ), _sXFSGapKart_classname ) ) {
+
+        case krefOkay :
+        case krefZero :
+                    RCt = 0;
+                    break;
+        case krefWhack :
+                    RCt = XFSGapKartDispose ( ( struct XFSGapKart * ) self );
+                    break;
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSGapKartRelease () */
+
+static
+int64_t CC
+_AddKartItemCallback ( const BSTNode * N1, const BSTNode * N2 )
+{
+    return XFS_StringCompare4BST_ZHR (
+        XFSGapKartItemDisplayName ( ( struct XFSGapKartItem * ) N1 ),
+        XFSGapKartItemDisplayName ( ( struct XFSGapKartItem * ) N2 )
+        );
+}   /* _AddKartItemCallback () */
+
+static
+rc_t CC
+_AddKartItem ( struct XFSGapKart * self, const struct KartItem * Item )
+{
+    rc_t RCt;
+    struct XFSGapKartItem * xItem;
+
+    XFS_CAN ( self )
+    XFS_CAN ( Item )
+
+    RCt = _KartItemMake ( & xItem, Item );
+    if ( RCt == 0 ) {
+        RCt = _LaInAdd (
+                        self -> lain,
+                        XFSGapKartItemProjectId ( xItem )
+                        );
+        if ( RCt == 0 ) {
+            RCt = BSTreeInsert (
+                            & ( self -> tree ),
+                            & ( xItem -> node ),
+                            _AddKartItemCallback
+                            );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        if ( xItem != NULL ) {
+            _KartItemDispose ( xItem );
+        }
+    }
+
+    return RCt;
+}   /* _AddKartItem () */
+
+rc_t CC
+_GapKartLoad ( struct XFSGapKart * self )
+{
+    rc_t RCt;
+    struct Kart * TheKart;
+    const struct KartItem * TheKartItem;
+    struct KDirectory * Directory;
+    bool IsKart;
+    char BF [ XFS_SIZE_1024 ];
+
+    RCt = 0;
+    TheKart = NULL;
+    IsKart = false;
+    Directory = NULL;
+    * BF = 0;
+
+    XFS_CAN ( self )
+    XFS_CAN ( self -> path )
+
+    RCt = _KartPath ( self -> path, self -> name , BF, sizeof ( BF ) );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryNativeDir ( & Directory );
+        if ( RCt == 0 ) {
+            RCt = KartMake ( Directory, BF, & TheKart, & IsKart );
+            if ( RCt == 0 ) {
+                if ( ! IsKart ) {
+                    RCt = XFS_RC ( rcInvalid );
+                }
+                else {
+                    while ( true ) {
+                        RCt = KartMakeNextItem (
+                                                TheKart,
+                                                & TheKartItem
+                                                );
+                        if ( RCt != 0 ) {   /* Error happened */
+                            break;
+                        }
+
+                        if ( TheKartItem == NULL ) { /* no more items */
+                            break;
+                        }
+
+                        RCt = _AddKartItem ( self, TheKartItem );
+
+                        KartItemRelease ( TheKartItem );
+
+                        if ( RCt != 0 ) {
+                            break;
+                        }
+                    }
+                }
+
+                if ( TheKart != NULL ) {
+                    KartRelease ( TheKart );
+                }
+            }
+
+            KDirectoryRelease ( Directory );
+        }
+    }
+
+    return RCt;
+}   /* _GapKartLoad () */
+
+struct _LollyPopp {
+    struct VNamelist * list;
+    uint32_t project_id;
+};
+
+static
+void
+_ListKartItemsCallback ( BSTNode * Node, void * Data )
+{
+    struct _LollyPopp * Popp;
+    struct XFSGapKartItem * Item;
+
+    Popp = ( struct _LollyPopp * ) Data;
+    Item = ( struct XFSGapKartItem * ) Node;
+
+    if ( Popp -> list != NULL && Item != NULL ) {
+        if ( Popp -> project_id == 0 || 
+            Popp -> project_id == XFSGapKartItemProjectId ( Item )
+        ) {
+            VNamelistAppend (
+                            Popp -> list,
+                            XFSGapKartItemDisplayName ( Item )
+                            );
+        }
+    }
+}   /* _ListKartItemsCallback () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartList (
+                const struct XFSGapKart * self,
+                struct KNamelist ** List,
+                uint32_t ProjectId
+)
+{
+    rc_t RCt;
+    struct VNamelist * xList;
+    struct _LollyPopp Popp;
+
+    RCt = 0;
+    xList = NULL;
+    Popp . list = NULL;
+    Popp . project_id = 0;
+
+    XFS_CSAN ( List )
+    XFS_CAN ( self )
+    XFS_CAN ( List )
+
+    RCt = VNamelistMake ( & xList, 16 /* ????? */ );
+    if ( RCt == 0 ) {
+        if ( XFSGapKartHasForProject ( self, ProjectId ) ) {
+            Popp . list = xList;
+            Popp . project_id = ProjectId;
+
+            BSTreeForEach (
+                        & ( self -> tree ),
+                        false,
+                        _ListKartItemsCallback,
+                        & Popp
+                        );
+        }
+
+        RCt = VNamelistToNamelist ( xList, List );
+
+        VNamelistRelease ( xList );
+    }
+
+    return RCt;
+}   /* XFSGapKartList () */
+
+static
+int64_t CC
+_KartItemCmp ( const void * Item, const BSTNode * Node )
+{
+    const char * Str1, * Str2;
+
+    Str1 = ( const char * ) Item;
+
+    Str2 = Node == NULL
+        ? NULL
+        : XFSGapKartItemDisplayName ( ( struct XFSGapKartItem * ) Node )
+        ;
+
+    if ( Str1 == NULL || Str2 == NULL ) {
+        if ( Str1 != NULL ) {
+            return 4096;
+        }
+
+        if ( Str2 != NULL ) {
+            return - 4096;
+        }
+
+        return 0;
+    }
+
+    return strcmp ( Str1, Str2 );
+}   /* _KartItemCmp () */
+
+LIB_EXPORT
+const struct XFSGapKartItem * CC
+XFSGapKartGet ( const struct XFSGapKart * self, const char * ItemName )
+{
+    const struct XFSGapKartItem * RetVal = NULL;
+
+    if ( self != NULL && ItemName != NULL ) {
+        RetVal = ( const struct XFSGapKartItem * ) BSTreeFind (
+                                                    & ( self -> tree ),
+                                                    ItemName,
+                                                    _KartItemCmp
+                                                    );
+    }
+
+    return RetVal;
+}   /* XFSGapKartGet () */
+
+LIB_EXPORT
+const char * CC
+XFSGapKartPath ( const struct XFSGapKart * self )
+{
+    return self == NULL ? NULL : ( self -> path );
+}   /* XFSGapKartPath () */
+
+LIB_EXPORT
+bool CC
+XFSGapKartHasForProject (
+                    const struct XFSGapKart * self,
+                    uint32_t ProjectId
+)
+{
+    if ( self != NULL ) {
+            /*  If ProjectId == 0 we should return everything
+             */
+        return ProjectId == 0
+                            ? true
+                            : _LaInHas ( self -> lain, ProjectId )
+                            ;
+    }
+
+    return false;
+}   /* XFSGapKartHasForProject () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _Kartophoby ...                                                  */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+    /*  Because that object changes only on the creation time,
+     *  we should not use any mutexes, and it is thread safe
+     */
+struct _Kartophoby {
+    BSTree tree;
+    KRefcount refcount;
+
+    const char * path;
+    uint64_t version;
+};
+
+static const char * _sKartophoby_classname = "_Kartophoby";
+
+static
+void CC
+_KartophobyWhackCallback ( BSTNode * Node, void * unused )
+{
+    if ( Node != NULL ) {
+        XFSGapKartRelease ( ( struct XFSGapKart * ) Node );
+    }
+}   /* _KartophobyWhackCallback () */
+
+static
+rc_t CC
+_KartophobyDispose ( const struct _Kartophoby * self )
+{
+    struct _Kartophoby * Phob = ( struct _Kartophoby * ) self;
+
+    if ( Phob != NULL ) {
+        BSTreeWhack (
+                    & ( Phob -> tree ),
+                    _KartophobyWhackCallback,
+                    NULL
+                    );
+
+        KRefcountWhack (
+            & ( Phob -> refcount ),
+            _sKartophoby_classname
+            );
+
+        if ( Phob -> path != NULL ) {
+            free ( ( char * ) Phob -> path );
+            Phob -> path = NULL;
+        }
+
+        Phob -> version = 0;
+
+        free ( Phob );
+    }
+
+    return 0;
+}   /* _KartophobyDispose () */
+
+static rc_t CC _KartophobyReadVersion (
+                                    struct _Kartophoby * self,
+                                    struct KNamelist ** List,
+                                    const char * Path
+                                    );
+
+static rc_t CC _KartophobyAddKart (
+                                    struct _Kartophoby * Phoby,
+                                    const char * KartName,
+                                    const struct _Kartophoby * LoadFrom
+                                    );
+
+static rc_t CC _KartophobyGet (
+                                    const struct _Kartophoby * self,
+                                    const struct XFSGapKart ** Kart,
+                                    const char * KartName
+                                    );
+
+static
+rc_t CC
+_KartophobyMake (
+                const struct _Kartophoby ** Phoby,
+                const char * Path,
+                const struct _Kartophoby * MakeFrom /* Could be NULL */
+)
+{
+    rc_t RCt;
+    struct _Kartophoby * ThePhoby;
+    struct KNamelist * List;
+    uint32_t Count, llp;
+    const char * Name;
+
+    RCt = 0;
+    ThePhoby = NULL;
+    List = NULL;
+    Count = llp = 0;
+    Name = NULL;
+
+    XFS_CSAN ( Phoby )
+    XFS_CAN ( Phoby )
+    XFS_CAN ( Path )
+
+        /* Creating Phoby is quite tricky :D
+         */
+    ThePhoby = calloc ( 1, sizeof ( struct _Kartophoby  ) );
+    if ( ThePhoby == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    KRefcountInit (
+                & ( ThePhoby -> refcount ),
+                1,
+                _sKartophoby_classname,
+                "_KartophobyMake",
+                "_Kartophoby"
+                );
+
+        /*  First we should check that path is valid and
+         *  read valid version for our phoby and list of Karts
+         */
+    RCt = _KartophobyReadVersion ( ThePhoby, & List, Path );
+    if ( RCt == 0 ) {
+        RCt = KNamelistCount ( List, & Count );
+        if ( RCt == 0 ) {
+            for ( llp = 0; llp < Count; llp ++ ) {
+                RCt = KNamelistGet ( List, llp, & Name );
+                if ( RCt == 0 ) {
+                    RCt = _KartophobyAddKart (
+                                            ThePhoby,
+                                            Name,
+                                            MakeFrom
+                                            );
+                    if ( RCt != 0 ) {
+                        RCt = 0;
+                    }
+                }
+            }
+        }
+
+        KNamelistRelease ( List );
+    }
+
+    if ( RCt != 0 ) {
+        * Phoby = NULL;
+
+        if ( ThePhoby != NULL ) {
+            _KartophobyDispose ( ThePhoby );
+        }
+    }
+
+    if ( RCt == 0 ) {
+        * Phoby = ThePhoby;
+    }
+
+    return RCt;
+}   /* _KartophobyMake () */
+
+static
+rc_t CC
+_KartophobyAddRef ( const struct _Kartophoby * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CAN ( self )
+
+    switch ( KRefcountAdd ( & ( self -> refcount ), _sKartophoby_classname ) ) {
+        case krefOkay :
+                    RCt = 0;
+                    break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* _KartophobyAddRef () */
+
+LIB_EXPORT
+rc_t CC
+_KartophobyRelease ( const struct _Kartophoby * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    XFS_CAN ( self )
+
+    switch ( KRefcountDrop ( & ( self -> refcount ), _sKartophoby_classname ) ) {
+
+        case krefOkay :
+        case krefZero :
+                    RCt = 0;
+                    break;
+        case krefWhack :
+                    RCt = _KartophobyDispose ( self );
+                    break;
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* _KartophobyRelease () */
+
+/*  Check and read directory version ( time ) and return List
+ *  if it is not NULL
+ */
+static
+rc_t CC
+_VersionAndListForPath (
+                        const char * Path,
+                        uint64_t * Version,
+                        struct KNamelist ** List
+)
+{
+    rc_t RCt;
+    struct KDirectory * NatDir;
+    KTime_t Date;
+    uint32_t PathType;
+
+    RCt = 0;
+    NatDir = NULL;
+    Date = 0;
+    PathType = kptNotFound;
+
+    XFS_CSAN ( List )
+    XFS_CSA ( Version, 0 )
+    XFS_CAN ( Path )
+    XFS_CAN ( Version )
+
+    RCt = KDirectoryNativeDir ( & NatDir );
+    if ( RCt == 0 ) {
+        PathType = KDirectoryPathType ( NatDir, Path );
+        switch ( PathType ) {
+            case kptNotFound:
+                RCt = KDirectoryCreateDir (
+                                            NatDir,
+                                            0755,
+                                            kcmCreate,
+                                            Path
+                                            );
+                break;
+            case kptDir:
+                break;
+            default:
+                RCt = XFS_RC ( rcInvalid );
+        }
+
+        if ( RCt == 0 ) {
+            RCt = KDirectoryDate ( NatDir, & Date, Path );
+            if ( RCt == 0 ) {
+                * Version = Date;
+
+                if ( List != NULL ) {
+                    RCt = KDirectoryList (
+                                        NatDir,
+                                        List,
+                                        NULL,
+                                        NULL,
+                                        Path
+                                        );
+                }
+            }
+        }
+
+        KDirectoryRelease ( NatDir );
+    }
+
+    return RCt;
+}   /* _VersionAndListForPath () */
+
+rc_t CC
+_KartophobyReadVersion (
+                        struct _Kartophoby * self,
+                        struct KNamelist ** List,
+                        const char * Path
+)
+{
+    rc_t RCt = 0;
+
+    XFS_CSAN ( List )
+    XFS_CAN ( self )
+    XFS_CAN ( List )
+
+    RCt = XFS_StrDup ( Path, & ( self -> path ) );
+    if ( RCt == 0 ) {
+        RCt = _VersionAndListForPath (
+                                    self -> path,
+                                    & ( self -> version),
+                                    List
+                                    );
+    }
+
+    return RCt;
+}   /* _KartophobyReadVersion () */
+
+static
+int64_t CC
+_KartophobyAddKartCallback ( const BSTNode * N1, const BSTNode * N2 )
+{
+    return XFS_StringCompare4BST_ZHR (
+                                ( ( struct XFSGapKart * ) N1 ) -> name,
+                                ( ( struct XFSGapKart * ) N2 ) -> name
+                                );
+}   /* _KartophobyAddKartCallback () */
+
+rc_t CC
+_KartophobyAddKart (
+                    struct _Kartophoby * self,
+                    const char * KartName,
+                    const struct _Kartophoby * LoadFrom
+)
+{
+    rc_t RCt;
+    const struct XFSGapKart * Kart;
+
+    RCt = 0;
+    Kart = NULL;
+
+    XFS_CAN ( self )
+    XFS_CAN ( KartName )
+
+        /*)     First we should check if we already have and use it
+         (*/
+    RCt = _KartophobyGet ( self, & Kart, KartName );
+    if ( RCt != 0 ) {
+            /*)     We should load kart if that exists
+             (*/
+        RCt = XFSGapKartMake ( & Kart, self -> path, KartName );
+    }
+
+    if ( RCt == 0 ) {
+            /*) Here we should add Kart to new Kartophoby
+             (*/
+        RCt = BSTreeInsert (
+                        & ( self -> tree ),
+                        & ( ( ( struct XFSGapKart * ) Kart ) -> node ),
+                        _KartophobyAddKartCallback
+                        );
+        if ( RCt != 0 ) {
+            XFSGapKartRelease ( Kart );
+        }
+    }
+
+    return RCt;
+}   /* _KartophobyAddKart () */
+
+static
+int64_t CC
+_KartophobyGetCallback ( const void * Item, const BSTNode * Node )
+{
+    const char * Str1, * Str2;
+
+    Str1 = ( ( char * ) Item );
+    Str2 = Node == NULL
+                    ? NULL
+                    : ( ( struct XFSGapKart * ) Node ) -> name
+                    ;
+
+
+    return XFS_StringCompare4BST_ZHR ( Str1, Str2 );
+}   /* _KartophobyGetCallback () */
+
+rc_t CC
+_KartophobyGet (
+                const struct _Kartophoby * self,
+                const struct XFSGapKart ** Kart,
+                const char * KartName
+)
+{
+    rc_t RCt;
+    const struct XFSGapKart * TheKart;
+
+    RCt = 0;
+    TheKart = NULL;
+
+    XFS_CSAN ( Kart )
+    XFS_CAN ( self )
+    XFS_CAN ( Kart )
+    XFS_CAN ( KartName )
+
+    TheKart = ( const struct XFSGapKart * ) BSTreeFind (
+                                            & ( self -> tree ),
+                                            KartName,
+                                            _KartophobyGetCallback
+                                            );
+    if ( TheKart != NULL ) {
+        RCt = XFSGapKartAddRef ( TheKart );
+        if ( RCt == 0 ) {
+            * Kart = TheKart;
+        }
+    }
+    else {
+        RCt = XFS_RC ( rcNotFound );
+    }
+
+    return RCt;
+}   /* _KartophobyGet () */
+
+rc_t CC
+_KartophobyVersion (
+                const struct _Kartophoby * self,
+                uint64_t * Version
+)
+{
+    XFS_CSA ( Version, 0 )
+    XFS_CAN ( self )
+    XFS_CAN ( Version )
+
+    * Version = self -> version;
+
+    return 0;
+}   /* _KartophobyVersion () */
+
+static
+void
+_ListKartophobyCallback ( BSTNode * Node, void * Data )
+{
+    struct _LollyPopp * Popp;
+    struct XFSGapKart * Kart;
+
+    Popp = ( struct _LollyPopp * ) Data;
+    Kart = ( struct XFSGapKart * ) Node;
+
+    if ( Popp -> list != NULL && Kart != NULL ) {
+        if ( Popp -> project_id == 0 ||
+            XFSGapKartHasForProject ( Kart, Popp -> project_id )
+        ) {
+            VNamelistAppend ( Popp -> list, Kart -> name );
+        }
+    }
+}   /* _ListKartophobyCallback () */
+
+static
+rc_t CC
+_KartophobyList (
+                const struct _Kartophoby * self,
+                struct KNamelist ** List,
+                uint32_t ProjectId
+)
+{
+    rc_t RCt;
+    struct VNamelist * xList;
+    struct _LollyPopp Popp;
+
+    RCt = 0;
+    xList = NULL;
+    Popp . list = NULL;
+    Popp . project_id = 0;
+
+    XFS_CSAN ( List )
+    XFS_CAN ( self )
+    XFS_CAN ( List )
+
+    RCt = VNamelistMake ( & xList, 16 /* ????? */ );
+    if ( RCt == 0 ) {
+        Popp . list = xList;
+        Popp . project_id = ProjectId;
+
+        BSTreeForEach (
+                        & ( self -> tree ),
+                        false,
+                        _ListKartophobyCallback,
+                        & Popp
+                        );
+
+        RCt = VNamelistToNamelist ( xList, List );
+
+        VNamelistRelease ( xList );
+    }
+
+    return RCt;
+}   /* _KartophobyList () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _KartDepot ...                                                    */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct _KartDepot {
+    KLock * mutabor;
+
+    char * path;
+
+    const struct _Kartophoby * phoby;
+};
+
+static struct _KartDepot * _sDpt = NULL;
+
+static rc_t CC _KartDepotPhoby ( const struct _Kartophoby ** Phoby );
+static rc_t CC _KartDepotPhobySet ( const struct _Kartophoby * Phoby );
+
+static
+rc_t CC
+_KartDepotDispose ( struct _KartDepot * self )
+{
+    if ( self != NULL ) {
+        if ( self -> phoby != NULL ) {
+            _KartophobyRelease ( self -> phoby );
+            self -> phoby = NULL;
+        }
+
+        if ( self -> path != NULL ) {
+            free ( self -> path );
+            self -> path = NULL;
+        }
+
+        if ( self -> mutabor != NULL ) {
+            KLockRelease ( self -> mutabor );
+            self -> mutabor = NULL;
+        }
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _KartDepotDispose () */
+
+static
+rc_t CC
+_KartDepotMake ( struct _KartDepot ** Dpt )
+{
+    rc_t RCt;
+    struct _KartDepot * Depot;
+
+    RCt = 0;
+    Depot = NULL;
+
+    XFS_CSAN ( Dpt )
+    XFS_CAN ( Dpt )
+
+    Depot = calloc ( 1, sizeof ( struct _KartDepot ) );
+    if ( Depot == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = KLockMake ( & ( Depot -> mutabor ) );
+        if ( RCt == 0 ) {
+
+            RCt = XFSGapKartfiles ( & ( Depot -> path ) );
+            if ( RCt == 0 ) {
+                RCt = _KartophobyMake ( 
+                                    & ( Depot -> phoby ),
+                                    Depot -> path,
+                                    NULL
+                                    );
+                if ( RCt == 0 ) {
+                    * Dpt = Depot;
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Dpt = NULL;
+
+        if ( Depot != NULL ) {
+            _KartDepotDispose ( Depot );
+        }
+    }
+
+    return RCt;
+}   /* _KartDepotMake () */
+
+static
+struct _KartDepot * CC
+_KartDepotGet ()
+{
+    return _sDpt;
+}   /* _KartDepotGet () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartDepotInit ()
+{
+    rc_t RCt;
+    struct _KartDepot * Depot;
+
+    RCt = 0;
+    Depot = NULL;
+
+    if ( _sDpt == NULL ) {
+        RCt = _KartDepotMake ( & Depot );
+        if ( RCt == 0 ) {
+            _sDpt = Depot;
+        }
+    }
+
+    return RCt;
+}   /* XFSGapKartDepotInit () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartDepotDispose ()
+{
+    struct _KartDepot * Depot = _sDpt;
+
+    _sDpt = NULL;
+
+    if ( Depot != NULL ) {
+        _KartDepotDispose ( Depot );
+    }
+
+    return 0;
+}   /* XFSGapKartDepotDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartDepotList ( struct KNamelist ** List, uint32_t ProjectId )
+{
+    rc_t RCt;
+    const struct _Kartophoby * Phoby;
+
+    RCt = 0;
+    Phoby = NULL;
+
+    XFS_CSAN ( List )
+    XFS_CAN ( List )
+
+    RCt = _KartDepotPhoby ( & Phoby );
+    if ( RCt == 0 ) {
+        RCt = _KartophobyList ( Phoby, List, ProjectId );
+
+        if ( Phoby != NULL ) {
+            _KartophobyRelease ( Phoby );
+        }
+    }
+
+    return RCt;
+}   /* XFSGapKartDepotList () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartDepotGet (
+                const struct XFSGapKart ** Kart,
+                const char * KartName
+)
+{
+    rc_t RCt;
+    const struct _Kartophoby * Phoby;
+
+    RCt = 0;
+    Phoby = NULL;
+
+    XFS_CSAN ( Kart )
+    XFS_CAN ( Kart )
+    XFS_CAN ( KartName )
+
+    RCt = _KartDepotPhoby ( & Phoby );
+    if ( RCt == 0 ) {
+        RCt = _KartophobyGet ( Phoby, Kart, KartName );
+
+        if ( Phoby != NULL ) {
+            _KartophobyRelease ( Phoby );
+        }
+    }
+
+    return RCt;
+}   /* XFSGapKartDepotGet () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartDepotRefresh ()
+{
+    rc_t RCt;
+    struct _KartDepot * Dpt;
+    uint64_t OldVer;
+    uint64_t NewVer;
+    const struct _Kartophoby * NewPhoby;
+    const struct _Kartophoby * OldPhoby;
+
+    RCt = 0;
+    Dpt = _KartDepotGet ();
+    OldVer = 0;
+    NewVer = 0;
+    OldPhoby = NULL;
+    NewPhoby = NULL;
+
+    XFS_CAN ( Dpt )
+
+    RCt = _VersionAndListForPath ( Dpt -> path, & NewVer, NULL );
+    if ( RCt == 0 ) {
+        RCt = _KartDepotPhoby ( & OldPhoby );
+        if ( RCt == 0 ) {
+            OldVer = OldPhoby == NULL
+                                ? ( NewVer - 1)
+                                : OldPhoby -> version
+                                ;
+            if ( OldVer != NewVer ) {
+                RCt = _KartophobyMake (
+                                    & NewPhoby,
+                                    Dpt -> path,
+                                    OldPhoby
+                                    );
+                if ( RCt == 0 ) {
+                    RCt = _KartDepotPhobySet ( NewPhoby );
+
+                    _KartophobyRelease ( NewPhoby );
+                }
+            }
+
+            if ( OldPhoby != NULL ) {
+                _KartophobyRelease ( OldPhoby );
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFSGapKartDepotRefresh () */
+
+LIB_EXPORT
+rc_t CC
+XFSGapKartDepotVersion ( uint64_t * Ver )
+{
+    rc_t RCt;
+    const struct _Kartophoby * Phoby;
+
+    RCt = 0;
+    Phoby = NULL;
+
+    XFS_CSA ( Ver, 0 )
+    XFS_CAN ( Ver )
+
+    RCt = _KartDepotPhoby ( & Phoby );
+    if ( RCt == 0 ) {
+        RCt = _KartophobyVersion ( Phoby, Ver );
+
+        if ( Phoby != NULL ) {
+            _KartophobyRelease ( Phoby );
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Ver = 0;
+    }
+
+    return RCt;
+}   /* XFSGapKartDepotVersion () */
+
+LIB_EXPORT
+const char * CC
+XFSGapKartDepotPath ()
+{
+    struct _KartDepot * Dpt = _KartDepotGet ();
+    return Dpt == NULL ? NULL : ( Dpt -> path );
+}   /* XFSGapKartDepotPath () */
+
+rc_t CC
+_KartDepotPhoby ( const struct _Kartophoby ** Phoby )
+{
+    rc_t RCt;
+    struct _KartDepot * Dpt;
+
+    RCt = 0;
+    Dpt = _KartDepotGet ();
+
+    XFS_CSAN ( Phoby )
+    XFS_CAN ( Phoby )
+    XFS_CAN ( Dpt )
+
+    RCt = KLockAcquire ( Dpt -> mutabor );
+    if ( RCt == 0 ) {
+        if  ( Dpt -> phoby != NULL ) {
+            RCt = _KartophobyAddRef ( Dpt -> phoby );
+            if ( RCt == 0 ) {
+                * Phoby = Dpt -> phoby;
+            }
+        }
+
+        KLockUnlock ( Dpt -> mutabor );
+    }
+
+    return RCt;
+}   /* _KartDepotPhoby () */
+
+rc_t CC
+_KartDepotPhobySet ( const struct _Kartophoby * Phoby )
+{
+    rc_t RCt;
+    struct _KartDepot * Dpt;
+
+    RCt = 0;
+    Dpt = _KartDepotGet ();
+
+    XFS_CAN ( Phoby )
+    XFS_CAN ( Dpt )
+
+    RCt = KLockAcquire ( Dpt -> mutabor );
+    if ( RCt == 0 ) {
+
+        RCt = _KartophobyAddRef ( Phoby );
+        if ( RCt == 0 ) {
+            if  ( Dpt -> phoby != NULL ) {
+                RCt = _KartophobyRelease ( Dpt -> phoby );
+            }
+
+            Dpt -> phoby = Phoby;
+        }
+
+        KLockUnlock ( Dpt -> mutabor );
+    }
+
+    return RCt;
+}   /* _KartDepotPhobySet () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
diff --git a/libs/xfs/xgapk.h b/libs/xfs/xgapk.h
new file mode 100644
index 0000000..a917b20
--- /dev/null
+++ b/libs/xfs/xgapk.h
@@ -0,0 +1,184 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xgapk_h_
+#define _xgapk_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   There is some interface build over Kart structure.
+  ))))  Called it XFSGapKart, sorry, weak imagination
+ ((((*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSGapKartItem;
+struct XFSGapKart;
+struct KNamelist;
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*))
+  ||    KartItem : user could not create or destroy it, only change
+  ||    referrence count. Item contains following data:
+  ||
+  ||       project_id, accession, object_id, name and description.
+  ||
+  ||    One method called as DisplayName, it is just Accession or
+  ||    Name if Accession equals NULL.
+ ((*/
+XFS_EXTERN rc_t CC XFSGapKartItemAddRef (
+                            const struct XFSGapKartItem * self
+                            );
+XFS_EXTERN rc_t CC XFSGapKartItemRelease (
+                            const struct XFSGapKartItem * self
+                            );
+
+XFS_EXTERN uint32_t CC XFSGapKartItemProjectId (
+                            const struct XFSGapKartItem * self
+                            );
+XFS_EXTERN uint32_t CC XFSGapKartItemObjectId (
+                            const struct XFSGapKartItem * self
+                            );
+XFS_EXTERN const char * CC XFSGapKartItemAccession (
+                            const struct XFSGapKartItem * self
+                            );
+XFS_EXTERN const char * CC XFSGapKartItemName (
+                            const struct XFSGapKartItem * self
+                            );
+XFS_EXTERN const char * CC XFSGapKartItemDescription (
+                            const struct XFSGapKartItem * self
+                            );
+    /*  This method will return name which will be used as filename
+     *  if Accession != NULL it will be Accession, overwise ItemName
+     */
+XFS_EXTERN const char * CC XFSGapKartItemDisplayName (
+                            const struct XFSGapKartItem * self
+                            );
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*))
+  ||    Kart : collection of KartItems.
+  ||
+  ||    Kart content could not be changed, so we may pass it from one
+  ||    collection to another. 
+  ||    Theoretically, Kart could contain items for different projects
+  ||    so, list method for Kart requires ProjectId
+  ||
+ ((*/
+/*))
+ //     Standard method of loading/uploading
+((*/
+XFS_EXTERN rc_t CC XFSGapKartMake (
+                            const struct XFSGapKart ** Kart,
+                            const char * Path,
+                            const char * Name
+                            );
+XFS_EXTERN rc_t CC XFSGapKartDispose (
+                            const struct XFSGapKart * self
+                            );
+
+XFS_EXTERN rc_t CC XFSGapKartAddRef (
+                            const struct XFSGapKart * self
+                            );
+XFS_EXTERN rc_t CC XFSGapKartRelease (
+                            const struct XFSGapKart * self
+                            );
+
+/*))
+ //     Accessing content
+((*/
+    /*  If ProjectId == 0 it will return all items 
+     */
+XFS_EXTERN rc_t CC XFSGapKartList (
+                            const struct XFSGapKart * self,
+                            struct KNamelist ** List,
+                            uint32_t ProjectId
+                            );
+XFS_EXTERN const struct XFSGapKartItem * CC XFSGapKartGet (
+                            const struct XFSGapKart * self,
+                            const char * ItemName
+                            );
+
+XFS_EXTERN const char * CC XFSGapKartPath (
+                            const struct XFSGapKart * self
+                            );
+XFS_EXTERN bool CC XFSGapKartHasForProject (
+                            const struct XFSGapKart * self,
+                            uint32_t ProjectId
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*))
+ ||    KartDepot : collection of Kart.
+ ||
+ ||    KartDepot is represented by real directory, where Kart files
+ ||    are stored.
+ ||    Content of KartDepot could be changed, there is Refresh method
+ ||    You may list stored Karts as by ProjectId and without
+ ||    There is only one KartDepot directory, so ...  
+ ||
+((*/
+
+XFS_EXTERN rc_t CC XFSGapKartDepotInit ();
+
+XFS_EXTERN rc_t CC XFSGapKartDepotDispose ();
+
+    /* If ProjectId == 0, it will return list of all kart files
+     */
+XFS_EXTERN rc_t CC XFSGapKartDepotList (
+                                    struct KNamelist ** List,
+                                    uint32_t ProjectId
+                                    );
+
+XFS_EXTERN rc_t CC XFSGapKartDepotGet (
+                                    const struct XFSGapKart ** Kart,
+                                    const char * KartName
+                                    );
+
+XFS_EXTERN rc_t CC XFSGapKartDepotRefresh ();
+
+XFS_EXTERN rc_t CC XFSGapKartDepotVersion ( uint64_t * Version );
+
+XFS_EXTERN const char * CC XFSGapKartDepotPath ();
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _xgapk_h_ */
diff --git a/libs/xfs/xhttp.c b/libs/xfs/xhttp.c
new file mode 100644
index 0000000..e3e2298
--- /dev/null
+++ b/libs/xfs/xhttp.c
@@ -0,0 +1,2988 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/container.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <kproc/lock.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kns/manager.h>
+#include <kns/http.h>
+#include <kns/stream.h>
+
+#include <xfs/path.h>
+
+#include "schwarzschraube.h"
+#include "xhttp.h"
+#include "zehr.h"
+#include "lockdpt.h"
+
+#include <sysalloc.h>
+
+#include <ctype.h>
+#include <os-native.h>
+#include <time.h>
+#include <stdio.h> /* sscanf */
+
+/*||*\
+  || Lyrics:
+  || That file contains interface to SRA archive at
+  ||
+  ||     https://sra-download.ncbi.nlm.nih.gov/sra
+  ||
+  || If we will enter 'DRR000001' subdirectory, we will file here :
+  ||
+  || (https://sra-download.ncbi.nlm.nih.gov/srapub/DRR000001/)
+  || 
+  ||     DRR000001.sra           26-May-2014 07:22  569M  
+  ||
+  || So, code could looks little weird, parsing and serving that format
+  ||
+\*||*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)) XFSHttp and XFSHttpEntry and _HttpED ( EntryDepot ) structs are
+ ||  living here
+((*/
+
+/*))
+ //  Status we will use in that module
+((*/
+
+/*)) Forward
+ ((*/
+struct _HttpHs;
+
+/*))
+ //  EntryDepot this is responsible for sharing HTTP resources
+((*/
+struct _HttpED {
+    BSTree tree;
+    KRefcount refcount;
+    KLock * mutabor;
+
+    struct XFSLockDepot * mutabors;
+    struct _HttpHs * http_hs;
+};
+
+/*)) 
+ //  Just a URL base to access entry by relative path.
+((*/
+struct XFSHttp {
+    KRefcount refcount;
+
+    const char * base_url;
+};
+
+/*)) 
+ //  Just a URL base to access entry by relative path.
+((*/
+struct XFSHttpEntry {
+    BSTNode node;
+    KRefcount refcount;
+
+    const char * name;
+    const char * url;
+    uint32_t url_hash;
+
+    bool is_folder;
+
+    struct VNamelist * list;    /* is null if not a folder */
+    uint64_t size;              /* is ZERO if a folder */
+    KTime_t time;
+
+    XFSStatus status;
+};
+
+struct XFSHttpReader {
+    KRefcount refcount;
+
+    const struct XFSHttpEntry * entry;
+};
+
+/*) Usefuls
+ (*/
+static const char * _sXFSHttpED_classname = "XFSHttpEntryDepot";
+static const char * _sXFSHttp_classname = "XFSHttp";
+static const char * _sXFSHttpEntry_classname = "XFSHttpEntry";
+static const char * _sXFSHttpReader_classname = "XFSHttpReader";
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _HttpHs/_HttpHsEn Methods ...                                     */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#define DEFAULT_PIPIRDA_SIZE    64
+
+struct _HttpHsEn {
+    struct _HttpHsEn * next;
+    struct _HttpHsEn * prev;
+
+    const struct XFSHttpEntry * entry;
+    const struct KFile * file;
+};
+
+struct _HttpHs {
+    KLock * mutabor;
+
+    uint32_t size;
+    uint32_t qty;
+
+    struct _HttpHsEn * kopf;
+    struct _HttpHsEn * arse;
+};
+
+static
+rc_t CC
+_HttpHsEnMake ( struct XFSHttpEntry * Entry, struct _HttpHsEn ** HsEn )
+{
+    struct _HttpHsEn * TheSi = NULL;
+
+    if ( HsEn != NULL ) {
+        * HsEn = NULL;
+    }
+
+    if ( Entry == NULL || HsEn == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    TheSi = calloc ( 1, sizeof ( struct _HttpHsEn ) );
+    if ( TheSi == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    TheSi -> entry = Entry;
+
+    * HsEn = TheSi;
+
+    return 0;
+}   /* _HttpHsEnMake () */
+
+static
+rc_t CC
+_HttpHsEnDispose ( struct _HttpHsEn * self )
+{
+    if ( self == NULL ) {
+        return 0;
+    }
+
+    if ( self -> file != NULL ) {
+        KFileRelease ( self -> file );
+
+        self -> file = NULL;
+    }
+
+    self -> next = self -> prev = NULL;
+    self -> entry = NULL;
+
+    free ( self );
+
+    return 0;
+}   /* _HttpHsEnDispose () */
+
+static
+rc_t CC
+_HttpHsEnConnect ( struct _HttpHsEn * self )
+{
+    rc_t RCt;
+    const struct KNSManager * Manager;
+    const struct KFile * File;
+
+    RCt = 0;
+    Manager = NULL;
+    File = NULL;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull ) ;
+    }
+
+    if ( self -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( self -> entry -> url == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( self -> entry -> is_folder ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+        /*)) Not sure about it ((*/
+    if ( self -> file != NULL ) {
+        return 0;
+    }
+
+        /*] Here we are [*/
+    Manager = XFS_KnsManager ();
+    if ( Manager == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = KNSManagerMakeHttpFile (
+                                    Manager,
+                                    & File,
+                                    NULL,   /* no open connections */
+                                    0x01010000,
+                                    self -> entry -> url
+                                    );
+        if ( RCt == 0 ) {
+            self -> file = File;
+        }
+    }
+
+    return RCt;
+}   /* _HttpHsEnConnect () */
+
+static
+void CC
+_HttpHsRemNoLock ( struct _HttpHs * self, struct _HttpHsEn * HsEn )
+{
+    if ( self == NULL || HsEn == NULL ) {
+        return;
+    }
+
+    if ( HsEn -> prev == NULL ) {       /* at the kopf */
+        if ( HsEn -> next == NULL ) {
+            self -> kopf = self -> arse = NULL;
+        }
+        else {
+            self -> kopf = HsEn -> next;
+            self -> kopf -> prev = NULL;
+        }
+    }
+    else {
+        if ( HsEn -> next == NULL ) {   /* at the arse */
+            self -> arse = HsEn -> prev;
+            self -> arse -> next = NULL;
+        }
+        else {                          /* in between */
+            HsEn -> prev -> next = HsEn -> next;
+            HsEn -> next -> prev = HsEn -> prev;
+        }
+    }
+
+    HsEn -> prev = HsEn -> next = NULL;
+
+    self -> qty ++;
+}   /* _HttpHsRemNoLock () */
+
+static
+void CC
+_HttpHsAddNoLock ( struct _HttpHs * self, struct _HttpHsEn * HsEn )
+{
+    if ( self == NULL || HsEn == NULL ) {
+        return;
+    }
+
+        /*)) Note, addidng always to head
+         ((*/
+    if ( self -> kopf == NULL ) {
+        HsEn -> next = HsEn -> prev = NULL;
+        self -> kopf = self -> arse = HsEn;
+    }
+    else {
+        self -> kopf -> prev = HsEn;
+        HsEn -> next = self -> kopf;
+        self -> kopf = HsEn;
+    }
+
+    self -> qty ++;
+}   /* _HttpHsAddNoLock () */
+
+static
+void CC
+_HttpHsMakeSlotNoLock ( const struct _HttpHs * self )
+{
+    struct _HttpHsEn * HsEn;
+
+    if ( self == NULL ) {
+        return;
+    }
+
+    if ( self -> arse == NULL ) {
+        return;
+    }
+
+    while ( self -> size <= self -> qty ) {
+        HsEn = self -> arse;
+        if ( HsEn == NULL ) {
+            break;
+        }
+
+        _HttpHsRemNoLock ( ( struct _HttpHs * ) self, HsEn );
+        _HttpHsEnDispose ( HsEn );
+    }
+}   /* _HttpHsMakeSlotNoLock () */
+
+static
+struct _HttpHsEn * CC
+_HttpHsFindNoLock (
+                const struct _HttpHs * self,
+                const struct XFSHttpEntry * Entry
+)
+{
+    struct _HttpHsEn * HsEn = NULL;
+
+    if ( self == NULL || Entry == NULL ) {
+        return NULL;
+    }
+
+    HsEn = self -> kopf;
+
+    while ( HsEn != NULL ) {
+        if ( HsEn -> entry == Entry ) {
+            _HttpHsRemNoLock ( ( struct _HttpHs * ) self, HsEn );
+            _HttpHsAddNoLock ( ( struct _HttpHs * ) self, HsEn );
+            return HsEn;
+        }
+
+        HsEn = HsEn -> next;
+    }
+
+    return NULL;
+}   /* _HttpHsFindNoLock () */
+
+static 
+rc_t CC
+_HttpHsMake ( uint32_t Size, struct _HttpHs ** Hs )
+{
+    rc_t RCt;
+    struct _HttpHs * TheHs;
+
+    RCt = 0;
+    TheHs = NULL;
+
+    if ( Hs == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Hs = NULL;
+
+    TheHs = calloc ( 1, sizeof ( struct _HttpHs ) );
+    if ( TheHs == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = KLockMake ( & ( TheHs -> mutabor ) );
+    if ( RCt == 0 ) {
+        TheHs -> size = Size == 0 ? DEFAULT_PIPIRDA_SIZE : Size ;
+        TheHs -> qty = 0;
+        * Hs = TheHs;
+    }
+    else {
+        free ( TheHs );
+    }
+
+    return RCt;
+}   /* _HttpHsMake () */
+
+static
+rc_t CC
+_HttpHsDispose ( struct _HttpHs * self )
+{
+    bool AbleToLock;
+    struct _HttpHsEn * HsEn;
+
+    AbleToLock = false;
+    HsEn = NULL;
+
+    if ( self == NULL ) {
+        return 0;
+    }
+
+    if ( self -> mutabor != NULL ) {
+        AbleToLock = KLockAcquire ( self -> mutabor ) == 0;
+    }
+
+    while ( self -> kopf != NULL ) {
+        HsEn = self -> kopf;
+
+        _HttpHsRemNoLock ( ( struct _HttpHs * ) self, HsEn );
+        _HttpHsEnDispose ( HsEn );
+    }
+
+    self -> kopf = self -> arse = NULL;
+    self -> size = self -> qty = 0;
+
+    if ( self -> mutabor != NULL ) {
+        if ( AbleToLock ) {
+            KLockUnlock ( self -> mutabor );
+        }
+        KLockRelease ( self -> mutabor );
+    }
+
+    free ( self );
+
+    return 0;
+}   /* _HttpHsDispose () */
+
+static
+rc_t CC
+_HttpHsFindOrCreate (
+                    const struct _HttpHs * self,
+                    const struct XFSHttpEntry * Entry,
+                    const struct _HttpHsEn ** HsEn
+)
+{
+    rc_t RCt;
+    struct _HttpHsEn * TheSi;
+
+    RCt = 0;
+    TheSi = NULL;
+
+    if ( HsEn != NULL ) {
+        * HsEn = NULL;
+    }
+
+    if ( self == NULL || Entry == NULL || HsEn == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+            /* First we are trying to find appropriate HttpHsEn
+             */
+        TheSi = _HttpHsFindNoLock ( self, Entry );
+        if ( TheSi == NULL ) {
+            RCt = _HttpHsEnMake (
+                            ( struct XFSHttpEntry * ) Entry,
+                            & TheSi
+                            );
+            if ( RCt == 0 ) {
+                _HttpHsMakeSlotNoLock ( self );
+                _HttpHsAddNoLock ( ( struct _HttpHs * ) self, TheSi );
+            }
+            else {
+                TheSi = NULL;
+                _HttpHsEnDispose ( TheSi );
+            }
+        }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    if ( RCt == 0 ) {
+        if ( TheSi == NULL ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+            RCt = _HttpHsEnConnect ( TheSi );
+            if ( RCt == 0 ) {
+                * HsEn = TheSi;
+            }
+        }
+    }
+
+    return RCt;
+}   /* _HttpHsFindOrCreate () */
+
+static
+rc_t CC
+_HttpHsDelete (
+            const struct _HttpHs * self,
+            const struct XFSHttpEntry * Entry
+)
+{
+    rc_t RCt;
+    struct _HttpHsEn * HsEn;
+
+    RCt = 0;
+    HsEn = NULL;
+
+    if ( self == NULL || Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+        HsEn = _HttpHsFindNoLock ( self, Entry );
+        if ( HsEn != NULL ) {
+            _HttpHsRemNoLock ( ( struct _HttpHs * ) self, HsEn );
+            _HttpHsEnDispose ( HsEn );
+        }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    return RCt;
+}   /* _HttpHsDelele () */
+
+static
+rc_t CC
+_HttpHsGetKFile (
+            const struct _HttpHs * self,
+            const struct XFSHttpEntry * Entry,
+            const struct KFile ** File
+)
+{
+    rc_t RCt;
+    const struct _HttpHsEn * HsEn;
+
+    RCt = 0;
+    HsEn = NULL;
+
+    RCt = _HttpHsFindOrCreate ( self, Entry, & HsEn );
+    if ( RCt == 0 ) {
+        RCt = KFileAddRef ( HsEn -> file );
+        if ( RCt == 0 ) {
+            * File = HsEn -> file;
+        }
+    }
+
+    return RCt;
+}   /* _HttpHsGetKFile () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _HttpED Methods ...                                               */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static struct _HttpED * _sHttpED = NULL;
+
+static
+struct _HttpED * CC
+_ED ()
+{
+    return _sHttpED;
+}   /* _ED () */
+
+static
+void CC
+_HttpEDWhackCallback ( BSTNode * Node, void * unused )
+{
+    if ( Node != NULL ) {
+        XFSHttpEntryRelease ( ( struct XFSHttpEntry * ) Node );
+    }
+}   /* _HttpEDWhackCallback () */
+
+static
+rc_t CC
+_HttpEDDisposeImpl ( struct _HttpED * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self != NULL ) { 
+        BSTreeWhack (
+                    & ( self -> tree ),
+                    _HttpEDWhackCallback,
+                    NULL
+                    );
+
+        KRefcountWhack (
+                    & ( self -> refcount ),
+                    _sXFSHttpED_classname
+                    );
+
+        XFSLockDepotDispose ( self -> mutabors );
+        _HttpHsDispose ( self -> http_hs );
+
+        if ( self -> mutabor != NULL ) {
+            KLockRelease ( self -> mutabor );
+            self -> mutabor = NULL;
+        }
+
+        free ( self );
+    }
+
+    return RCt;
+}   /* _HttpEDDisposeImpl () */
+
+static
+rc_t CC
+_HttpEDMakeImpl ( struct _HttpED ** HttpED )
+{
+    rc_t RCt;
+    struct _HttpED * TheED;
+
+    RCt = 0;
+    TheED = NULL;
+
+    if ( HttpED != NULL ) {
+        * HttpED = NULL;
+    }
+
+    if ( HttpED == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    TheED = calloc ( 1, sizeof ( struct _HttpED ) );
+    if ( TheED == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSLockDepotMake ( 0, & ( TheED -> mutabors ) );
+    if ( RCt == 0 ) {
+
+        RCt = _HttpHsMake ( 0, & ( TheED -> http_hs ) );
+        if ( RCt == 0 ) {
+
+            RCt = KLockMake ( & ( TheED -> mutabor ) );
+            if ( RCt == 0 ) {
+                BSTreeInit ( & ( TheED -> tree ) );
+
+                KRefcountInit (
+                            & ( TheED -> refcount ),
+                            1,
+                            _sXFSHttpED_classname,
+                            "_HttpEDMake",
+                            "HttpED"
+                            );
+
+                * HttpED = TheED;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * HttpED = NULL;
+        _HttpEDDisposeImpl ( TheED );
+    }
+
+    return RCt;
+}   /* _HttpEDMakeImpl () */
+
+static
+rc_t CC
+_HttpEDDispose ()
+{
+    struct _HttpED * HttpED;
+
+         /* Sorry, there is no any mutex available, so dummy
+          * TODO ... think about global lock ...
+          */
+    HttpED = _sHttpED;
+    _sHttpED = NULL;
+
+    if ( HttpED != NULL ) {
+        _HttpEDDisposeImpl ( HttpED );
+    }
+
+    return 0;
+}   /* _HttpEDDispose () */
+
+static
+rc_t CC
+_HttpEDMake ()
+{
+    rc_t RCt;
+    struct _HttpED * HttpED;
+
+    RCt = 0;
+    HttpED = NULL;
+
+    if ( _sHttpED == NULL ) {
+
+        RCt = _HttpEDMakeImpl ( & HttpED );
+        if ( RCt == 0 ) {
+                /* Sorry, there is no any mutex available, so dummy
+                 * TODO ... think about global lock ...
+                 */
+            if ( _sHttpED == NULL ) {
+                _sHttpED = HttpED;
+            }
+            else {
+                _HttpEDDisposeImpl ( HttpED );
+            }
+        }
+    }
+
+    return RCt;
+}   /* _HttpEDMake () */
+
+static
+rc_t CC
+_HttpEDAddRef ()
+{
+    rc_t RCt;
+    struct _HttpED * HttpED;
+
+    RCt = 0;
+    HttpED = _ED ();
+
+    if ( HttpED == NULL ) {
+        RCt = _HttpEDMake ( );
+        if ( RCt == 0 ) {
+        }
+    }
+    else {
+        RCt = KLockAcquire ( HttpED -> mutabor );
+        if ( RCt == 0 ) {
+            switch ( KRefcountAdd ( & ( HttpED -> refcount ), _sXFSHttpED_classname ) ) {
+                case krefOkay :
+                            RCt = 0;
+                            break;
+                case krefZero :
+                case krefLimit :
+                case krefNegative :
+                            RCt = XFS_RC ( rcInvalid );
+                            break;
+                default :
+                            RCt = XFS_RC ( rcUnknown );
+                            break;
+            }
+            KLockUnlock ( HttpED -> mutabor );
+        }
+    }
+
+    return RCt;
+}   /* _HttpEDAddRef () */
+
+static
+rc_t CC
+_HttpEDRelease ()
+{
+    rc_t RCt;
+    struct _HttpED * HttpED;
+    bool DisposeED;
+
+    RCt = 0;
+    HttpED = _ED ();
+    DisposeED = false;
+
+    if ( HttpED != NULL ) {
+        RCt = KLockAcquire ( HttpED -> mutabor );
+        if ( RCt == 0 ) {
+            switch ( KRefcountDrop ( & ( HttpED -> refcount ), _sXFSHttpED_classname ) ) {
+                case krefOkay :
+                case krefZero :
+                            RCt = 0;
+                            break;
+                case krefWhack :
+                            RCt = 0;
+                            DisposeED = true;
+                            break;
+                case krefNegative :
+                            RCt = XFS_RC ( rcInvalid );
+                            break;
+                default :
+                            RCt = XFS_RC ( rcUnknown );
+                            break;
+            }
+
+            KLockUnlock ( HttpED -> mutabor );
+        }
+        if ( DisposeED ) {
+            _HttpEDDispose ();
+        };
+    }
+
+    return RCt;
+}   /* _HttpEDRelease () */
+
+static
+int64_t CC
+_HttpEntryCmpCallback ( const void * Item, const BSTNode * Node )
+{
+    const char * Str1, * Str2;
+
+    Str1 = ( const char * ) Item;
+
+    Str2 = Node == NULL
+                ? NULL
+                : ( ( struct XFSHttpEntry * ) Node ) -> url
+                ;
+    return XFS_StringCompare4BST_ZHR ( Str1, Str2 );
+}   /* _HttpEntryCmpCallback () */
+
+static
+rc_t CC
+_HttpEDGetNoLock (
+                struct _HttpED * self,
+                const char * Url,
+                const struct XFSHttpEntry ** Entry
+)
+{
+    const struct XFSHttpEntry * RetVal = NULL;
+
+    if ( Entry != NULL ) {
+        * Entry = NULL;
+    }
+
+    if ( self == NULL || Url == NULL || Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RetVal = ( const struct XFSHttpEntry * ) BSTreeFind (
+                                                & ( self -> tree ),
+                                                Url,
+                                                _HttpEntryCmpCallback
+                                                );
+
+
+    * Entry = RetVal;
+
+    return 0;
+}   /* _HttpEDGetNoLock () */
+
+static
+rc_t CC
+_HttpEDGet ( const char * Url, const struct XFSHttpEntry ** Entry )
+{
+    rc_t RCt;
+    struct _HttpED * ED;
+
+    RCt = 0;
+    ED = _ED ();
+
+    if ( ED == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( ED -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _HttpEDGetNoLock ( ED, Url, Entry );
+
+        KLockUnlock ( ED -> mutabor );
+    }
+
+    return RCt;
+}   /* _HttpEDGet () */
+
+static
+int64_t CC
+_HttpEntryAddCallback ( const BSTNode * N1, const BSTNode * N2 )
+{
+    return XFS_StringCompare4BST_ZHR (
+            ( ( struct XFSHttpEntry * ) N1 ) -> url,
+            ( ( struct XFSHttpEntry * ) N2 ) -> url
+            );
+}   /* _HttpEntryAddCallback () */
+
+static
+rc_t CC
+_HttpEDAddNoLock (
+                struct _HttpED * self,
+                const char * Url,
+                const struct XFSHttpEntry * Entry
+)
+{
+    rc_t RCt;
+    const struct XFSHttpEntry * TheEntry;
+
+    RCt = 0;
+    TheEntry = NULL;
+
+    if ( self == NULL || Url == NULL || Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = _HttpEDGetNoLock ( self, Url, & TheEntry );
+    if ( RCt == 0 ) {
+        if ( TheEntry == NULL ) {
+            RCt = XFSHttpEntryAddRef ( Entry );
+            if ( RCt == 0 ) {
+                RCt = BSTreeInsert (
+                            & ( self -> tree ),
+                            ( struct BSTNode * ) & ( Entry -> node ),
+                            _HttpEntryAddCallback
+                            );
+                if ( RCt != 0 ) {
+                    XFSHttpEntryRelease ( Entry );
+                }
+            }
+        }
+    }
+
+    return RCt;
+}   /* _HttpEDAddNoLock () */
+
+static
+rc_t CC
+_HttpEDAdd ( const struct XFSHttpEntry * Entry )
+{
+    rc_t RCt;
+    struct _HttpED * ED;
+
+    RCt = 0;
+    ED = _ED ();
+
+    if ( ED == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( ED -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _HttpEDAddNoLock ( ED, Entry -> url, Entry );
+
+        KLockUnlock ( ED -> mutabor );
+    }
+    return RCt;
+}   /* _HttpEDAdd () */
+
+#ifdef NOT_NEED_YET
+static
+rc_t CC
+_HttpEDDelNoLock ( struct _HttpED * self, const char * Url )
+{
+    rc_t RCt;
+    const struct XFSHttpEntry * Entry;
+    bool DelSucc;
+
+    RCt = 0;
+    Entry = NULL;
+    DelSucc = false;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = _HttpEDGetNoLock ( self, Url, & Entry );
+    if ( RCt == 0 ) {
+        if ( Entry != NULL ) {
+            DelSucc = BSTreeUnlink (
+                                & ( self -> tree ),
+                                ( struct BSTNode * ) & ( Entry -> node )
+                                ); 
+            if ( DelSucc ) {
+                _HttpHsDelete ( self -> http_hs, Entry );
+                XFSHttpEntryRelease ( Entry );
+            }
+        }
+    }
+
+    return RCt;
+}   /* _HttpEDDelNoLock () */
+
+static
+rc_t CC
+_HttpEDDel ( const char * Url )
+{
+    rc_t RCt;
+    struct _HttpED * ED;
+
+    RCt = 0;
+    ED = _ED ();
+
+    if ( ED == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( ED -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _HttpEDDelNoLock ( ED, Url );
+
+        KLockUnlock ( ED -> mutabor );
+    }
+
+    return RCt;
+}   /* _HttpEDGet () */
+#endif /* NOT_NEED_YET */
+
+static
+rc_t CC
+_HttpEDClearNoLock ( struct _HttpED * self )
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    BSTreeWhack ( & ( self -> tree ), _HttpEDWhackCallback, NULL );
+    BSTreeInit ( & ( self -> tree ) );
+
+    return 0;
+}   /* _HttpEDClearNoLock () */
+
+static
+rc_t CC
+_HttpEDClear ()
+{
+    rc_t RCt;
+    struct _HttpED * ED;
+
+    RCt = 0;
+    ED = _ED ();
+
+    if ( ED == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( ED -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _HttpEDClearNoLock ( ED );
+
+        KLockUnlock ( ED -> mutabor );
+    }
+
+    return RCt;
+}   /* _HttpEDClear () */
+
+static 
+rc_t CC
+_HttpEDLock ( uint32_t HashValue )
+{
+    struct _HttpED * ED = _ED ();
+
+    if ( ED == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( ED -> mutabors == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    return XFSLockDepotAcquire ( ED -> mutabors, HashValue );
+}   /* _HttpEDLock () */
+
+static 
+rc_t CC
+_HttpEDUnlock ( uint32_t HashValue )
+{
+    struct _HttpED * ED = _ED ();
+
+    if ( ED == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( ED -> mutabors == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    return XFSLockDepotUnlock ( ED -> mutabors, HashValue );
+}   /* _HttpEDUnlock () */
+
+static
+rc_t CC
+_HttpEDGetFileForEntry (
+                    const struct XFSHttpEntry * Entry,
+                    const struct KFile ** File
+)
+{
+    struct _HttpED * ED = _ED ();
+
+    if ( File != NULL ) {
+        * File = NULL;
+    }
+
+    if ( ED == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( ED -> http_hs == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Entry == NULL || File == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    return _HttpHsGetKFile ( ED -> http_hs, Entry, File );
+}   /* _HttpEDHttpHs () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* Misk Methods ...                                                  */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*))
+ //   MISKA 1: Will concatenate base_url and Path.
+((*/
+static
+rc_t CC
+_HttpMakeUrlFromPath (
+                    const char * BaseUrl,
+                    const char * Path,
+                    const char ** Url
+)
+{
+    size_t PathSize, BaseSize, RetSize;
+    char * RetUrl;
+
+    PathSize = BaseSize = RetSize = 0;
+    RetUrl = NULL;
+
+    if ( Url != NULL ) {
+        * Url = NULL;
+    }
+
+    if ( BaseUrl == NULL || Path == NULL || Url == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    PathSize = string_size ( Path );
+    BaseSize = string_size ( BaseUrl );
+
+        /*  First we are calculating string size with some extra
+         */
+    RetSize = PathSize
+                + 1 /* slash */
+                + BaseSize
+                + 1 /* 0 at the end of string */
+                ;
+        /*  Second we are allocating string
+         */
+    RetUrl = calloc ( RetSize, sizeof ( char ) );
+    if ( RetUrl == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+        /*  Third we are copying base_url and removing exess of slashes
+         */
+    string_copy ( RetUrl, RetSize, BaseUrl, BaseSize );
+    if ( RetUrl [ BaseSize - 1 ] == '/' ) {
+        BaseSize --;
+        RetUrl [ BaseSize ] = 0;
+    }
+
+        /*  Fourth, adding trailing slash if it is necessary
+         */
+    if ( * Path != '/' ) {
+        RetUrl [ BaseSize ] = '/';
+        BaseSize ++;
+    }
+
+        /*  Fith we are copying Path
+         */
+    string_copy ( RetUrl + BaseSize, RetSize - BaseSize, Path, PathSize );
+
+    * Url = RetUrl;
+
+    return 0;
+}   /* _HttpMakeUrlFromPath () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSHttpEntry Make/Dispose Methods ...                             */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+static rc_t CC _HttpEntryDispose ( struct XFSHttpEntry * self );
+
+static
+rc_t CC
+_HttpCreateEntry (
+            const char * BaseUrl,
+            const char * Path,
+            bool IsFolder,
+            uint64_t Size,
+            KTime_t Time,
+            struct XFSHttpEntry ** Entry
+)
+{
+    rc_t RCt;
+    struct XFSHttpEntry * RetEntry;
+    size_t PathSize;
+
+    RCt = 0;
+    RetEntry = NULL;
+    PathSize = 0;
+
+    if ( Entry != NULL ) {
+        * Entry = NULL;
+    }
+
+    if ( BaseUrl == NULL || Path == NULL || Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    PathSize = string_size ( Path );
+    if ( PathSize == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RetEntry = calloc ( 1, sizeof ( struct XFSHttpEntry ) );
+    if ( RetEntry == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RetEntry -> status = kxfsInvalid;
+
+    RCt = VNamelistMake ( & ( RetEntry -> list ), 128 );
+    if ( RCt == 0 ) { 
+        RCt = _HttpMakeUrlFromPath ( BaseUrl, Path, & ( RetEntry -> url ) );
+        if ( RCt == 0 ) {
+            RCt = XFS_NameFromPath_ZHR ( Path, & ( RetEntry -> name ), false );
+            if ( RCt == 0 ) {
+                KRefcountInit (
+                            & ( RetEntry -> refcount ),
+                            1,
+                            _sXFSHttpEntry_classname,
+                            "_HttpCreateEntry",
+                            "HttpEntry"
+                            );
+                RetEntry -> is_folder = IsFolder;
+                RetEntry -> size = IsFolder ? 0 : Size;
+                RetEntry -> time = Time;
+                RetEntry -> url_hash = string_hash (
+                                            RetEntry -> url,
+                                            string_size ( RetEntry -> url )
+                                            );
+                    /* Last thing to do, it is Ready, not Complete !!! */
+                RetEntry -> status = kxfsReady;
+
+                * Entry = RetEntry;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Entry = NULL;
+
+        if ( RetEntry != NULL ) {
+            _HttpEntryDispose ( RetEntry );
+        }
+    }
+
+    return RCt;
+}   /* _HttpCreateEntry () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSHttp Methods ...                                               */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+LIB_EXPORT
+rc_t CC
+XFSHttpMake ( const char * BaseUrl, const struct XFSHttp ** TheHttp )
+{
+    rc_t RCt;
+    struct XFSHttp * RetHttp;
+    struct XFSHttpEntry * Entry;
+    size_t UrlSize;
+
+    RCt = 0;
+    RetHttp = NULL;
+
+    if ( TheHttp != NULL ) {
+        * TheHttp = NULL;
+    }
+
+    if ( TheHttp == NULL || BaseUrl == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+        /* First we should be sure that HttpED is good and trusty
+         */
+    RCt = _HttpEDAddRef ();
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    RetHttp = calloc ( 1, sizeof ( struct XFSHttp ) );
+    if ( RetHttp == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    KRefcountInit (
+                & ( RetHttp -> refcount ),
+                1,
+                _sXFSHttp_classname,
+                "XFSHttpMake",
+                "Http"
+                );
+
+    RCt = XFS_StrDup ( BaseUrl, & ( RetHttp -> base_url ) );
+    if ( RCt == 0 ) {
+            /* Here we are stripping last 'slash' if it is
+             */
+        UrlSize = string_size ( RetHttp -> base_url );
+        while ( 0 < UrlSize ) {
+            if ( RetHttp -> base_url [ UrlSize - 1 ] == '/' ) {
+                ( ( char * ) RetHttp -> base_url ) [ UrlSize - 1 ] = 0;
+                UrlSize --;
+            }
+            else {
+                break;
+            }
+        }
+
+        RCt = _HttpCreateEntry (
+                            RetHttp -> base_url,
+                            "/",
+                            true,
+                            0,
+                            0,
+                            & Entry
+                            );
+        if ( RCt == 0 ) {
+            RCt = _HttpEDAdd ( Entry );
+
+            if ( RCt != 0 ) {
+                _HttpEntryDispose ( Entry );
+
+                    /*  Really it is not error, and something else
+                     *  already created that entry
+                     */
+                RCt = 0;
+            }
+            * TheHttp = RetHttp;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * TheHttp = NULL;
+
+        XFSHttpDispose ( RetHttp );
+    }
+
+    return RCt;
+}   /* XFSHttpMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSHttpDispose ( const struct XFSHttp * self )
+{
+    struct XFSHttp * Http = ( struct XFSHttp * ) self;
+
+    if ( Http != NULL ) {
+        if ( Http -> base_url != NULL ) {
+            free ( ( char * ) Http -> base_url );
+            Http -> base_url = NULL;
+        }
+
+        KRefcountWhack ( & ( Http -> refcount ), _sXFSHttp_classname );
+
+        free ( Http );
+
+        _HttpEDRelease ();
+    }
+
+    return 0;
+}   /* XFSHttpDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSHttpAddRef ( const struct XFSHttp * self )
+{
+    rc_t RCt;
+    struct XFSHttp * Http;
+
+    RCt = 0;
+    Http = ( struct XFSHttp * ) self;
+
+    if ( Http == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    switch ( KRefcountAdd ( & ( Http -> refcount ), _sXFSHttp_classname ) ) {
+        case krefOkay :
+                    RCt = 0;
+                    break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSHttpAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSHttpRelease ( const struct XFSHttp * self )
+{
+    rc_t RCt;
+    struct XFSHttp * Http;
+
+    RCt = 0;
+    Http = ( struct XFSHttp * ) self;
+
+    if ( Http == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    switch ( KRefcountDrop ( & ( Http -> refcount ), _sXFSHttp_classname ) ) {
+
+        case krefOkay :
+        case krefZero :
+                    RCt = 0;
+                    break;
+        case krefWhack :
+                    RCt = XFSHttpDispose ( ( struct XFSHttp * ) Http );
+                    break;
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSHttpRelease () */
+
+LIB_EXPORT
+const char * CC 
+XFSHttpBaseUrl ( const struct XFSHttp * self )
+{
+    if ( self != NULL ) {
+        return self -> base_url;
+    }
+    return NULL;
+}   /* XFSHttpBaseUrl () */
+
+LIB_EXPORT
+bool CC
+XFSHttpHasEntry ( const struct XFSHttp * self, const char * Path )
+{
+    return XFSHttpGetEntry ( self, Path ) != NULL;
+}   /* XFSHttpHasEntry () */
+
+LIB_EXPORT
+const struct XFSHttpEntry * CC
+XFSHttpGetEntry ( const struct XFSHttp * self, const char * EntryPath )
+{
+    rc_t RCt;
+    const char * Url;
+    const struct XFSHttpEntry * RetEntry;
+
+    RCt = 0;
+    Url = NULL;
+    RetEntry = NULL;
+
+    if ( self != NULL && EntryPath != NULL ) {
+        RCt = _HttpMakeUrlFromPath ( self -> base_url, EntryPath, & Url );
+
+        if ( RCt == 0 ) {
+            RCt = _HttpEDGet ( Url, & RetEntry );
+            if ( RCt != 0 ) {
+                RetEntry = NULL;
+            }
+            free ( ( char * ) Url );
+        }
+    }
+
+    return RetEntry;
+}   /* XFSHttpGetEntry () */
+
+static rc_t CC _HttpLoadDirEntry ( const struct XFSHttpEntry * self );
+
+static
+rc_t CC
+_MakeValidPath (
+            const char * Path,
+            const struct XFSPath ** xPath,
+            uint32_t * xPathQty
+)
+{
+    rc_t RCt;
+    char BF [ XFS_SIZE_4096 ];
+    const char * P;
+
+    RCt = 0;
+    * BF = 0;
+    P = NULL;
+
+    if ( xPath != NULL ) {
+        * xPath = NULL;
+    }
+
+    if ( xPathQty != NULL ) {
+        * xPathQty = 0;
+    }
+
+    if ( xPath == NULL || Path == NULL || xPathQty == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( * Path == '/' ) {
+        P = Path;
+    }
+    else {
+        * BF = '/';
+        string_copy_measure ( BF + 1, sizeof ( BF ) - 1, Path );
+
+        P = BF;
+    }
+
+    RCt = XFSPathMake ( xPath, true, P );
+    if ( RCt == 0 ) {
+        * xPathQty = XFSPathPartCount ( * xPath );
+    }
+
+    return RCt;
+}   /* _MakeValidPath () */
+
+static
+rc_t CC
+_HttpOrCreateEntry (
+            const struct XFSHttp * self,
+            const char * Path,
+            const struct XFSHttpEntry ** Entry
+)
+{
+    rc_t RCt;
+    const struct XFSPath * xPath;
+    char BF [ XFS_SIZE_1024 ];
+    uint32_t xQty;
+    const struct XFSHttpEntry * Parent;
+    const struct XFSPath * xParent;
+
+    RCt = 0;
+    xPath = NULL;
+    * BF = 0;
+    xQty = 0;
+    Parent = NULL;
+    xParent = NULL;
+
+    if ( Entry != NULL ) {
+        * Entry = NULL;
+    }
+
+    if ( self == NULL || Path == NULL || Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = _MakeValidPath ( Path, & xPath, & xQty );
+    if ( RCt == 0 ) { 
+        if ( xQty < 2 ) {
+            /* Not an error ???
+                RCt = XFS_RC ( rcInvalid );
+            */
+        }
+        else {
+                /* Path to parent directory */
+            RCt = XFSPathParent ( xPath, & xParent );
+            if ( RCt == 0 ) {
+                    /* Trying to get ready one */
+                Parent = XFSHttpGetEntry ( self, XFSPathGet ( xParent ) );
+                if ( Parent == NULL ) {
+                        /* Creating new one */
+                    RCt = _HttpCreateEntry (
+                                    self -> base_url,
+                                    XFSPathGet ( xParent ),
+                                    true,
+                                    0,
+                                    0,
+                                    ( struct XFSHttpEntry ** ) & Parent
+                                    );
+                    if ( RCt == 0 ) {
+                        RCt = _HttpEDAdd ( Parent );
+                    }
+                }
+
+                if ( RCt == 0 ) {
+                        /* Checking and loading parent entry */
+                    if ( Parent -> status == kxfsReady ) {
+                        RCt = _HttpLoadDirEntry ( Parent );
+                    }
+
+                        /* Check if we obtained necessary node */
+                    if ( RCt == 0 ) {
+                        Parent = XFSHttpGetEntry ( self, Path );
+                        if ( Parent == NULL ) {
+                            RCt = XFS_RC ( rcNull );
+                        }
+                        else {
+                            * Entry = Parent;
+                        }
+
+                    }
+                }
+
+                XFSPathRelease ( xParent );
+            }
+        }
+
+        XFSPathRelease ( xPath );
+    }
+
+    return RCt;
+}   /* _HttpOrCreateEntry () */
+
+LIB_EXPORT
+rc_t CC
+XFSHttpGetOrCreateEntry (
+            const struct XFSHttp * self,
+            const char * Path,
+            const struct XFSHttpEntry ** Entry
+)
+{
+    rc_t RCt;
+    const struct XFSHttpEntry * TheEntry;
+
+    RCt = 0;
+    TheEntry = NULL;
+
+    if ( Entry != NULL ) {
+        * Entry = NULL;
+    }
+
+    if ( self == NULL || Entry == NULL || Path == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    TheEntry = XFSHttpGetEntry ( self, Path );
+    if ( TheEntry != NULL ) {
+        * Entry = TheEntry;
+    }
+    else {
+        /*)) we should find an parent directory and load it.
+          || after that we should search throught that directory
+          ((*/
+        RCt = _HttpOrCreateEntry ( self, Path , & TheEntry );
+        if ( RCt == 0 ) {
+            * Entry = TheEntry;
+        }
+    }
+
+    return RCt;
+}   /* XFSHttpGetOrCreateEntry () */
+
+static
+rc_t CC
+_HttpEntryDispose ( struct XFSHttpEntry * self )
+{
+    if ( self != NULL ) {
+        self -> status = kxfsInvalid;
+
+        KRefcountWhack (
+                    & ( self -> refcount ),
+                    _sXFSHttpEntry_classname
+                    ); 
+        if ( self -> name != NULL ) {
+            free ( ( char * ) self -> name ) ;
+            self -> name = NULL;
+        }
+        if ( self -> url != NULL ) {
+            free ( ( char * ) self -> url ) ;
+            self -> url = NULL;
+        }
+        self -> url_hash = 0;
+        self -> is_folder = false;
+
+        if ( self -> list != NULL ) {
+            VNamelistRelease ( self -> list );
+            self -> list = NULL;
+        }
+
+        self -> size = 0;
+        self -> time = 0;
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _HttpEntryDispose () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSHttpEntry Methods ...                                          */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+LIB_EXPORT
+rc_t CC
+XFSHttpEntryAddRef ( const struct XFSHttpEntry * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    switch ( KRefcountAdd ( & ( self -> refcount ), _sXFSHttpEntry_classname ) ) {
+        case krefOkay :
+                    RCt = 0;
+                    break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSHttpEntryAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSHttpEntryRelease ( const struct XFSHttpEntry * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    switch ( KRefcountDrop ( & ( self -> refcount ), _sXFSHttpEntry_classname ) ) {
+
+        case krefOkay :
+        case krefZero :
+                    RCt = 0;
+                    break;
+        case krefWhack :
+                    RCt = _HttpEntryDispose ( ( struct XFSHttpEntry * ) self );
+                    break;
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSHttpEntryRelease () */
+
+LIB_EXPORT
+bool CC
+XFSHttpEntryIsFolder ( const struct XFSHttpEntry * self )
+{
+    return self == NULL ? false : ( self -> is_folder );
+}   /* XFSHttpEntryIsFolder () */
+
+LIB_EXPORT
+const char * CC
+XFSHttpEntryName ( const struct XFSHttpEntry * self )
+{
+    return self == NULL ? NULL : ( self -> name );
+}   /* XFSHttpEntryName () */
+
+LIB_EXPORT
+const char * CC
+XFSHttpEntryUrl ( const struct XFSHttpEntry * self )
+{
+    return self == NULL ? NULL : ( self -> url );
+}   /* XFSHttpEntryUrl () */
+
+LIB_EXPORT
+uint32_t CC
+XFSHttpEntryUrlHash ( const struct XFSHttpEntry * self )
+{
+    return self == NULL ? 0 : ( self -> url_hash );
+}   /* XFSHttpEntryUrlHash () */
+
+static
+rc_t CC
+_HttpCheckLoadList ( const struct XFSHttpEntry * self )
+{
+    rc_t RCt;
+    struct XFSHttpEntry * Entry;
+
+    RCt = 0;
+    Entry = ( struct XFSHttpEntry * ) self;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> is_folder ) {
+        if ( self -> status == kxfsReady ) {
+            RCt = _HttpLoadDirEntry ( self );
+
+            Entry -> status = ( RCt == 0 ? kxfsComplete : kxfsBroken );
+        }
+    }
+
+    if ( self -> status != kxfsComplete
+        && self -> status != kxfsReady ) {
+        RCt = XFS_RC ( rcInvalid );
+    }
+
+    return RCt;
+}   /* _HttpCheckLoadList () */
+
+LIB_EXPORT
+rc_t CC
+XFSHttpEntryList (
+                const struct XFSHttpEntry * self,
+                struct KNamelist ** List
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( List != NULL ) {
+        * List = NULL;
+    }
+
+    if ( self == NULL || List == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( ! self -> is_folder ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = _HttpCheckLoadList ( self );
+    if ( RCt == 0 ) {
+            /* TODO : think where to keep empty list ?
+             */
+        RCt = VNamelistToNamelist ( self -> list, List );
+    }
+
+    return RCt;
+}   /* XFSHttpEntryList () */
+
+LIB_EXPORT
+rc_t CC
+XFSHttpEntrySize ( const struct XFSHttpEntry * self, uint64_t * Size )
+{
+    if ( Size != NULL ) {
+        * Size = 0;
+    }
+
+    if ( self == NULL || Size == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Size = self -> size;
+
+    return 0;
+}   /* XFSHttpEntrySize () */
+
+LIB_EXPORT
+rc_t CC
+XFSHttpEntryTime ( const struct XFSHttpEntry * self, KTime_t * Time )
+{
+    if ( Time != NULL ) {
+        * Time = 0;
+    }
+
+    if ( self == NULL || Time == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Time = self -> time;
+
+    return 0;
+}   /* XFSHttpEntryTime () */
+
+LIB_EXPORT
+bool CC
+XFSHttpEntryGood ( const struct XFSHttpEntry * self )
+{
+    if ( self != NULL ) {
+        return self -> status == kxfsReady
+                    || self -> status == kxfsComplete;
+    }
+    return false;
+}   /* XFSHttpEntryGood () */
+
+LIB_EXPORT
+bool CC
+XFSHttpEntryHas (
+                const struct XFSHttpEntry * self,
+                const char * ChildName
+)
+{
+    rc_t RCt;
+    uint32_t Cnt, llp;
+    const char * Name;
+    size_t CSz, NSz;
+
+    RCt = 0;
+    Cnt = llp = 0;
+    Name = NULL;
+    CSz = NSz = 0;
+
+    if ( self != NULL && ChildName != NULL ) {
+        CSz = string_size ( ChildName );
+
+        if ( self -> list != NULL ) {
+            RCt = VNameListCount ( self -> list, & Cnt );
+            if ( RCt == 0 ) {
+                for ( llp = 0; llp < Cnt; llp ++ ) {
+                    RCt = VNameListGet ( self -> list, llp, & Name );
+                    if ( RCt == 0 ) {
+                        NSz = string_size ( Name );
+                        if ( NSz == CSz ) {
+                            if ( string_cmp ( ChildName, CSz, Name, CSz, CSz ) == 0 ) {
+                                return true;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return false;
+}   /* XFSHttpEntryHas () */
+
+LIB_EXPORT
+rc_t CC
+XFSHttpEntryGet (
+                const struct XFSHttpEntry * self,
+                const char * ChildName,
+                const struct XFSHttpEntry ** Child
+)
+{
+    rc_t RCt;
+    const char * ChildPath;
+    const struct XFSHttpEntry * RetChild;
+
+    RCt = 0;
+    ChildPath = NULL;
+
+    if ( Child != NULL ) {
+        * Child = NULL;
+    }
+
+    if ( self == NULL || ChildName == NULL || Child == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = _HttpMakeUrlFromPath ( self -> url, ChildName, & ChildPath );
+    if ( RCt == 0 ) {
+        RCt = _HttpEDGet ( ChildPath, & RetChild );
+        if ( RCt == 0 ) {
+            * Child = RetChild;
+        }
+
+        free ( ( char * ) ChildPath );
+        ChildPath = NULL;
+    }
+
+    return RCt;
+}   /* XFSHttpEntryGet () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+LIB_EXPORT
+rc_t CC
+XFSHttpRehash ()
+{
+    return _HttpEDClear () ;
+}   /* XFSHttpRehash () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSHttpReader Methods ...                                         */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+LIB_EXPORT
+rc_t CC
+XFSHttpReaderMake (
+                const struct XFSHttpEntry * Entry,
+                const struct XFSHttpReader ** Reader
+)
+{
+    rc_t RCt;
+    struct XFSHttpReader * RetReader;
+
+    RCt = 0;
+    RetReader = NULL;
+
+    if ( Reader != NULL ) {
+        * Reader = NULL;
+    }
+
+    if ( Entry == NULL || Reader == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RetReader = calloc ( 1, sizeof ( struct XFSHttpReader ) );
+    if ( RetReader == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = XFSHttpEntryAddRef ( Entry );
+    if ( RCt == 0 ) {
+        RetReader -> entry = Entry;
+
+        KRefcountInit (
+                    & ( RetReader -> refcount ),
+                    1,
+                    _sXFSHttpReader_classname,
+                    "XFSHttpReaderMake",
+                    "HttpReader"
+                    );
+
+        * Reader = RetReader;
+    }
+    else {
+        free ( RetReader );
+    }
+
+    return RCt;
+}   /* XFSHttpReaderMake () */
+
+LIB_EXPORT
+rc_t CC
+XFSHttpReaderAddRef ( const struct XFSHttpReader * self )
+{
+    rc_t RCt;
+    struct XFSHttpReader * Reader;
+    uint32_t hash;
+
+    RCt = 0;
+    Reader = ( struct XFSHttpReader * ) self;
+    hash = 0;
+
+    if ( Reader == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Reader -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    hash = Reader -> entry -> url_hash;
+    RCt = _HttpEDLock ( hash );
+    if ( RCt == 0 ) {
+        switch ( KRefcountAdd ( & ( Reader -> refcount ), _sXFSHttpReader_classname ) ) {
+            case krefOkay :
+                        RCt = 0;
+                        break;
+            case krefZero :
+            case krefLimit :
+            case krefNegative :
+                        RCt = XFS_RC ( rcInvalid );
+                        break;
+            default :
+                        RCt = XFS_RC ( rcUnknown );
+                        break;
+        }
+
+        RCt = _HttpEDUnlock ( hash );
+    }
+
+    return RCt;
+}   /* XFSHttpReaderAddRef () */
+
+static
+rc_t CC
+_HttpReaderDispose ( const struct XFSHttpReader * self )
+{
+    struct XFSHttpReader * Reader;
+
+    Reader = ( struct XFSHttpReader * ) self;
+
+    if ( Reader == NULL ) {
+        return 0;
+    }
+
+        /* TODO We are not removing data from queue, it will die itself
+         */
+
+    KRefcountWhack (
+                & ( Reader -> refcount ),
+                _sXFSHttpReader_classname
+                );
+
+    if ( Reader -> entry != NULL ) {
+        _HttpHsDelete ( _ED () -> http_hs, Reader -> entry );
+
+        XFSHttpEntryRelease ( Reader -> entry );
+
+        Reader -> entry = NULL;
+    }
+
+    free ( Reader );
+
+    return 0;
+}   /* _HttpReaderDispose () */
+
+LIB_EXPORT
+rc_t CC
+XFSHttpReaderRelease ( const struct XFSHttpReader * self )
+{
+    rc_t RCt;
+    struct XFSHttpReader * Reader;
+    uint32_t hash;
+
+    RCt = 0;
+    Reader = ( struct XFSHttpReader * ) self;
+    hash = 0;
+
+    if ( Reader == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Reader -> entry == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    hash = Reader -> entry -> url_hash;
+    RCt = _HttpEDLock ( hash );
+    if ( RCt == 0 ) {
+        switch ( KRefcountDrop ( & ( Reader -> refcount ), _sXFSHttpReader_classname ) ) {
+            case krefOkay :
+            case krefZero :
+                        RCt = 0;
+                        break;
+            case krefWhack :
+                        RCt = 0;
+                        _HttpReaderDispose ( Reader );
+                        break;
+            case krefNegative :
+                        RCt = XFS_RC ( rcInvalid );
+                        break;
+            default :
+                        RCt = XFS_RC ( rcUnknown );
+                        break;
+        }
+
+        RCt = _HttpEDUnlock ( hash );
+    }
+
+    return RCt;
+}   /* XFSHttpReaderRelease () */
+
+static
+rc_t CC
+_CheckResoveOpen (
+            const struct XFSHttpEntry * self,
+            const struct KFile ** File
+)
+{
+    rc_t RCt;
+    struct XFSHttpEntry * Entry;
+    const struct KFile * TheFile;
+    uint64_t Size;
+
+    RCt = 0;
+    Entry = ( struct XFSHttpEntry * ) self;
+    TheFile = NULL;
+    Size = 0;
+
+    if ( File != NULL ) {
+        * File = NULL;
+    }
+
+    if ( File == NULL || self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> status == kxfsInvalid
+        || self -> status == kxfsBroken ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+
+    RCt = _HttpEDGetFileForEntry ( self, & TheFile );
+    if ( RCt != 0 ) {
+        ( ( struct XFSHttpEntry * ) self ) -> status = kxfsBroken;
+    }
+    else {
+        if ( self -> status == kxfsReady ) {
+            if ( ! self -> is_folder ) {
+                    /* Here we are reading real file size */
+                RCt = KFileSize ( TheFile, & Size );
+                if ( RCt == 0 ) {
+                    Entry -> size = Size;
+                }
+                else {
+                    RCt = 0; // TODO: not sure about it
+                }
+            }
+        }
+
+        ( ( struct XFSHttpEntry * ) self ) -> status = kxfsComplete;
+        * File = TheFile;
+    }
+
+    return RCt;
+}   /* _CheckResoveOpen () */
+
+
+LIB_EXPORT
+rc_t CC
+XFSHttpReaderRead (
+                const struct XFSHttpReader * self,
+                uint64_t Offset,
+                void * Buffer,
+                size_t BufferSize,
+                size_t * NumRead
+)
+{
+    rc_t RCt;
+    const struct KFile * File;
+
+    RCt = 0;
+    File = NULL;
+
+    if ( self == NULL || Buffer == NULL || NumRead == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( BufferSize == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = _HttpEDLock ( self -> entry -> url_hash );
+    if ( RCt == 0 ) {
+
+        RCt = _CheckResoveOpen ( self -> entry, &File );
+        if ( RCt == 0 ) {
+            RCt = KFileRead (
+                            File,
+                            Offset,
+                            Buffer,
+                            BufferSize,
+                            NumRead
+                            );
+            KFileRelease ( File );
+        }
+        _HttpEDUnlock ( self -> entry -> url_hash );
+    }
+
+    return RCt;
+}   /* XFSHttpReaderRead () */
+
+static
+rc_t CC
+_HttpMakeBuffer ( uint64_t Size, void ** Buffer )
+{
+    char * BF;
+
+    BF = NULL;
+
+    if ( Buffer == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Buffer = NULL;
+
+    if ( Size == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    BF = calloc ( ( size_t ) Size, sizeof ( char ) );
+    if ( BF == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+    BF [ Size - 1 ] = 0;
+
+    * Buffer = ( void * ) BF;
+
+    return 0;
+}   /* _HttpMakeBuffer () */
+
+/*))
+ // We do suppose that size of readed data will not exceed 128K
+((*/
+#define XFS_MAX_DIR_BUFFER 131072
+
+static
+rc_t CC
+_xStreamReadAll ( const char * Url, void ** Buffer, size_t * NumRead )
+{
+    rc_t RCt;
+    const struct XFSHttpStream * Stream;
+    char * BF;
+    uint64_t SZ, Off;
+    size_t NumR;
+
+    RCt = 0;
+    Stream = NULL;
+    BF = NULL;
+    SZ = XFS_MAX_DIR_BUFFER;
+    Off = 0;
+    NumR = 0;
+
+    if ( Buffer != NULL ) {
+        * Buffer = NULL;
+    }
+
+    if ( NumRead != NULL ) {
+        * NumRead = 0;
+    }
+
+    if ( Url == NULL || Buffer == NULL || NumRead == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = XFS_HttpStreamMake_ZHR ( Url, & Stream );
+    if ( RCt == 0 ) {
+        RCt = _HttpMakeBuffer ( SZ, ( void ** ) & BF );
+        if ( RCt == 0 ) {
+            while ( ! XFS_HttpStreamCompleted_ZHR ( Stream ) ) {
+                RCt = XFS_HttpStreamRead_ZHR (
+                                            Stream,
+                                            BF + Off,
+                                            ( size_t ) ( SZ - Off ),
+                                            & NumR
+                                            );
+                if ( RCt != 0 ) {
+                    break;
+                }
+
+                if ( NumR != 0 && SZ <= ( Off + NumR ) ) {
+                    RCt = XFS_RC ( rcInvalid );
+
+                    break;
+                }
+
+                Off += NumR;
+                NumR = 0;
+            }
+
+            if ( RCt == 0 ) {
+                * Buffer = BF;
+                * NumRead = ( size_t ) Off;
+            }
+        }
+
+        XFS_HttpStreamDispose_ZHR ( Stream );
+    }
+
+    if ( RCt != 0 ) {
+        * Buffer = NULL;
+        * NumRead = 0;
+
+        if ( BF != NULL ) {
+            free ( BF );
+        }
+    }
+
+    return RCt;
+}   /* _xStreamReadAll () */
+
+struct _BufferLR {
+    const char * buffer;
+    size_t length;
+
+    size_t line_start;
+    size_t line_end;
+    size_t line_no;
+};
+
+static
+rc_t CC
+_BufferLRInit (
+            struct _BufferLR * self,
+            const char * Buffer,
+            size_t Length
+)
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    self -> buffer = Buffer;
+    self -> length = Length;
+    self -> line_start = 0;
+    self -> line_end = 0;
+    self -> line_no = 0;
+
+    return 0;
+}   /* _BufferLRInit () */
+
+static
+rc_t CC
+_BufferLRWhack ( struct _BufferLR * self )
+{
+    if ( self != NULL ) {
+        self -> buffer = NULL;
+        self -> length = 0;
+        self -> line_start = 0;
+        self -> line_end = 0;
+        self -> line_no = 0;
+    }
+    return 0;
+}   /* _BufferLRWhack () */
+
+static
+bool CC
+_BufferLRNext (
+            struct _BufferLR * self,
+            const char ** NextLine,
+            size_t * Length
+)
+{
+    const char * start, * end, * kirdyk;
+
+    start = end = kirdyk = NULL;
+
+    if ( NextLine != NULL ) {
+        * NextLine = NULL;
+    }
+
+    if ( Length != NULL ) {
+        * Length = 0;
+    }
+
+    if ( self == NULL || NextLine == NULL || Length == NULL ) {
+        return false;
+    }
+
+        /* Line number, just for case */
+    self -> line_no ++;
+
+    kirdyk = self -> buffer + self -> length;
+    start = self -> buffer + self -> line_start;
+    end = self -> buffer + self -> line_end;
+
+        /* First, we are looking for start of new line */
+    start = NULL;
+    while ( end < kirdyk ) {
+        if ( isalnum ( * end ) || * end == '<' ) {
+            start = end;
+            break;
+        }
+        end ++;
+    }
+    if ( start == NULL ) {
+        return false;
+    }
+
+        /* Second we are looking for end of new line */
+    end ++;
+    while ( end < kirdyk ) {
+        if ( * end == '\n' ) {
+            break;
+        }
+
+        end ++;
+    }
+
+    self -> line_start = start - self -> buffer;
+    self -> line_end = end - self -> buffer;
+
+    * NextLine = start;
+    * Length = end - start;
+
+    return true;
+}   /* _BufferLRNext () */
+
+static
+bool CC
+_GetAnchor (
+        const char * Start,
+        const char * End,
+        const char ** AncStart,
+        const char ** AncEnd
+)
+{
+    const char * AncS, * AncE, * AncP;
+
+    AncS = AncE = AncP = NULL;
+
+    /* We are looking for "<a href ... </a>" tag */
+
+    AncP = Start;
+    while ( AncP < End ) {
+        if ( * AncP == '<' ) {
+            if ( 2 <= ( End - AncP ) ) {
+                if ( * ( AncP + 1 ) == 'a' && * ( AncP + 2 ) == ' ' ) {
+                    AncS = AncP;
+                    AncP += 8;
+
+                    break;
+                }
+            }
+        }
+
+        AncP ++;
+    }
+
+    if ( AncS == NULL ) {
+        return false;
+    }
+
+    while ( AncP < End ) {
+        if ( * AncP == '<' ) {
+            if ( 3 <= ( End - AncP ) ) {
+                if ( * ( AncP + 1 ) == '/' && * ( AncP + 2 ) == 'a' && * ( AncP + 3 ) == '>' ) {
+                    AncE = AncP + 4;
+
+                    break;
+                }
+            }
+        }
+
+        AncP ++;
+    }
+
+    if ( AncE == NULL ) {
+        return false;
+    }
+
+    * AncStart = AncS;
+    * AncEnd = AncE;
+
+    return true;
+}   /* _GetAnchor () */
+
+static
+bool CC
+_GetAnchorName (
+            const char * Start,
+            const char * End,
+            char ** Name,
+            bool * IsDir
+)
+{
+    const char * nS, * nE, * nP;
+    bool Dir;
+
+    nS = nE = nP = NULL;
+    Dir = false;
+
+    * Name = NULL;
+    * IsDir = false;
+
+    nP = Start;
+    while ( nP < End ) {
+        if ( * nP == '"' ) {
+            if ( 1 <= ( End - nP ) ) {
+                nP ++;
+                nS = nP;
+            }
+            break;
+        }
+
+        nP ++;
+    }
+    if ( nS == NULL ) {
+        return false;
+    }
+
+    while ( nP < End ) {
+        if ( * nP == '"' ) {
+            nE = nP;
+
+            break;
+        }
+
+        nP ++;
+    }
+    if ( nE == NULL ) {
+        return false;
+    }
+
+    if ( * ( nE - 1 ) == '/' ) {
+        Dir = true;
+        nE --;
+    }
+
+    if ( nE == nS ) {
+        return false;
+    }
+
+    * Name = string_dup ( nS, nE - nS );
+    * IsDir = Dir;
+
+    return * Name != NULL;
+}   /* _GetAnchorName () */
+
+static
+rc_t CC
+_GetNameFrom (
+            const char * Start,
+            const char * End,
+            char ** Name,
+            bool * IsDir,
+            const char ** Next
+)
+{
+    char * TheName;
+    const char * aS, * aE;
+
+    TheName = NULL;
+    aS = aE = NULL;
+
+    if ( Name != NULL ) {
+        * Name = NULL;
+    }
+
+    if ( Next != NULL ) {
+        * Next = NULL;
+    }
+
+    if ( IsDir != NULL ) {
+        * IsDir = false;
+    }
+
+    if ( Start == NULL || End == NULL || Name == NULL || Next == NULL || IsDir == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( ! _GetAnchor ( Start, End, & aS, & aE ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( ! _GetAnchorName ( aS, aE, & TheName, IsDir ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    * Name = TheName;
+    * Next = aE + 1;
+
+    return 0;
+}   /* _GetNameFrom () */
+
+static
+rc_t CC
+_GetTimeFrom (
+            const char * Start,
+            const char * End,
+            int64_t * Time,
+            const char ** Next
+)
+{
+    static const char * MNT [ 12 ] = {
+                        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+                        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+                        };
+    const char * Pos;
+    int Day, Year, Hour, Minute, Ret;
+    char Month [ 8 ];
+    struct tm Tm;
+
+    Pos = NULL;
+    Day = Year = Hour = Minute = Ret = 0;
+    * Month = 0;
+    memset ( & Tm, 0, sizeof ( struct tm ) );
+
+    if ( Time != NULL ) {
+        * Time = 0;
+    }
+    if ( Next != NULL ) {
+        * Next = NULL;
+    }
+
+    if ( Start == NULL || End == NULL || Time == NULL || Next == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+        /* We are parsing format "dd-mmm-YYYY HH:MM"
+         */
+    Start = XFS_SkipSpaces_ZHR ( Start, End );
+    if ( Start == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Pos = Start + 17;
+    Pos = XFS_SkipSpaces_ZHR ( Pos, End );
+
+    Ret = sscanf (
+            Start,
+            "%2d-%3s-%4d %2d:%2d",
+            & Day,
+            Month,
+            & Year,
+            & Hour,
+            & Minute
+            ); 
+    if ( Ret != 5 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    for ( Ret = 0; Ret < 12; Ret ++ ) {
+        if ( strncmp ( MNT [ Ret ], Month, 3 ) == 0 ) {
+            break;
+        }
+    }
+
+    if ( Ret == 12 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Tm . tm_min = Minute;
+    Tm . tm_hour = Hour;
+    Tm . tm_year = Year - 1900;
+    Tm . tm_mon = Ret;
+    Tm . tm_mday = Day;
+
+    * Time = mktime ( & Tm );
+    * Next = Pos;
+
+    return 0;
+}   /* _GetTimeFrom () */
+
+static
+rc_t CC
+_GetSizeFrom (
+            const char * Start,
+            const char * End,
+            uint64_t * Size,
+            const char ** Next
+)
+{
+    const char * Pos;
+    uint64_t TheSize;
+    float PP;
+    int Ret;
+
+    Pos = NULL;
+    TheSize = 0;
+    PP = 0;
+    Ret = 0;
+
+    if ( Size != NULL ) {
+        * Size = 0;
+    }
+
+    if ( Next != NULL ) {
+        * Next = NULL;
+    }
+
+    if ( Start == NULL || End == NULL || Size == NULL || Next == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Start = XFS_SkipSpaces_ZHR ( Start, End );
+    if ( Start == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Pos = XFS_SkipLetters_ZHR ( Start, End );
+    if ( Pos == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    Ret = sscanf ( Start, "%f", & PP );
+    if ( Ret != 1 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    switch ( * ( Pos - 1 ) ) {
+        case 'K' : TheSize = ( uint64_t ) ( PP * 1024.0 ); break;
+        case 'M' : TheSize = ( uint64_t ) ( PP * 1048576.0 ); break;
+        case 'G' : TheSize = ( uint64_t ) ( PP * 1073741824.0 ); break;
+        default  : TheSize = ( uint64_t ) ( PP * 1.0 ); break;
+    }
+
+    * Size = TheSize;
+    * Next = Pos;
+
+    return 0;
+}   /* _GetSizeFrom () */
+
+/*|
+|*  Very simple format of line. For file :
+ *|
+|*      name     dd-MMM-YYYY HH:MM   size
+ *|
+|*  For directory :
+ *|
+|*      name/    dd-MMM-YYYY HH:MM     -
+ *|
+|*  Bad thing : ther is no method to convert string to time
+ *|
+|*/
+
+static
+rc_t CC
+_HttpParseLine (
+            const char * Line,
+            size_t Length,
+            char ** Name,
+            uint64_t * Size,
+            int64_t * Time,
+            bool * IsDir
+)
+{
+    rc_t RCt;
+    const char * start, * end, * pos;
+    char * TheName;
+    bool TheIsDir;
+
+
+    RCt = 0;
+    start = end = pos = NULL;
+    TheName = NULL;
+    TheIsDir = false;
+
+    if ( Name != NULL ) {
+        * Name = NULL;
+    }
+
+    if ( Size != NULL ) {
+        * Size = 0;
+    }
+
+    if ( Time != NULL ) {
+        * Time = 0;
+    }
+
+    if ( IsDir != NULL ) {
+        * IsDir = false;
+    }
+
+    if ( Line == NULL || Length == 0 || Name == NULL || Size == NULL || Time == NULL || IsDir == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+        /* first we are extracting Name of entry */
+    start = Line;
+    end = start + Length;
+    RCt = _GetNameFrom ( start, end, & TheName, & TheIsDir, & start );
+    if ( RCt == 0 ) {
+
+        RCt = _GetTimeFrom ( start, end, Time, & start );
+        if ( RCt == 0 ) {
+
+            if ( ! TheIsDir ) {
+                RCt = _GetSizeFrom ( start, end, Size, & start );
+            }
+
+        }
+    }
+
+    if ( RCt == 0 ) {
+        * Name = TheName;
+        * IsDir = TheIsDir;
+    }
+    else {
+        free ( TheName );
+    }
+
+    return RCt;
+}   /* _HttpParseLine () */
+
+static
+rc_t CC
+_HttpParseEntry (
+                const struct XFSHttpEntry * self,
+                const char * Line,
+                size_t Length
+)
+{
+    rc_t RCt;
+    struct XFSHttpEntry * NewEntry;
+    char * Name;
+    uint64_t Size;
+    int64_t Time;
+    bool IsDir;
+
+    RCt = 0;
+    NewEntry = NULL;
+    Name = NULL;
+    Size = 0;
+    Time = 0;
+    IsDir = false;
+
+    if ( self == NULL || Line == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Length == 0 ) {
+        return XFS_RC ( rcInvalid );
+    } 
+
+    RCt = _HttpParseLine (
+                        Line,
+                        Length,
+                        & Name,
+                        & Size,
+                        & Time,
+                        & IsDir
+                        );
+    if ( RCt == 0 ) {
+            /*) First we should add name to list of items
+             (*/
+        RCt = VNamelistAppend ( self -> list, Name );
+        if ( RCt == 0 ) {
+                /*) Second we should add new entry to ED
+                 (*/
+            RCt = _HttpCreateEntry (
+                                self -> url,
+                                Name,
+                                IsDir,
+                                Size,
+                                Time,
+                                & NewEntry
+                                );
+            if ( RCt == 0 ) {
+                RCt = _HttpEDAdd ( NewEntry );
+                if ( RCt != 0 ) {
+                    _HttpEntryDispose ( NewEntry );
+                }
+            }
+        }
+
+        free ( Name );
+    }
+
+    return 0;
+}   /* _HttpParseEntry () */
+
+static
+rc_t CC
+_HttpParseFolder (
+            const struct XFSHttpEntry * self,
+            char * Buffer,
+            size_t BufferSize
+)
+{
+    rc_t RCt;
+    struct _BufferLR LineReader;
+    const char * Line;
+    size_t LineLength;
+
+    RCt = 0;
+    Line = NULL;
+    LineLength = 0;
+
+    RCt = _BufferLRInit ( & LineReader, Buffer, BufferSize );
+    if ( RCt == 0 ) {
+        while ( _BufferLRNext ( & LineReader, & Line, & LineLength ) ) {
+            if ( Line != NULL && LineLength != 0 ) {
+                RCt = _HttpParseEntry ( self, Line, LineLength );
+                if ( RCt != 0 ) {
+                        /*) TODO: It is OK, we will report on that only
+                         (*/
+                    RCt = 0;
+                }
+            }
+        }
+        _BufferLRWhack ( & LineReader );
+    }
+
+    return RCt;
+}   /* _HttpParseFolder () */
+
+rc_t CC
+_HttpLoadDirEntry ( const struct XFSHttpEntry * self )
+{
+    rc_t RCt;
+    char * Buffer;
+    size_t NumRead;
+
+    RCt = 0;
+    Buffer = NULL;
+    NumRead = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = _xStreamReadAll (
+                        self -> url,
+                        ( void ** ) & Buffer,
+                        & NumRead
+                        );
+    if ( RCt == 0 ) {
+        if ( Buffer != NULL ) {
+            RCt = _HttpParseFolder ( self, Buffer, NumRead );
+            if ( RCt != 0 ) {
+                    /* I am not sure, but I will do it */
+                RCt = 0;
+
+                ( ( struct XFSHttpEntry * ) self ) -> status
+                                                        = kxfsBroken;
+            }
+            else {
+                ( ( struct XFSHttpEntry * ) self ) -> status
+                                                        = kxfsComplete;
+            }
+
+            free ( Buffer );
+        }
+    }
+
+    return RCt;
+}   /* _HttpLoadDirEntry () */
diff --git a/libs/xfs/xhttp.h b/libs/xfs/xhttp.h
new file mode 100644
index 0000000..7a4c108
--- /dev/null
+++ b/libs/xfs/xhttp.h
@@ -0,0 +1,174 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xhttp_h_
+#define _xhttp_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   There is some interface build to implement access to files
+  ))))  through HTTP
+ ((((*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSHttp;
+struct XFSHttpEntry;
+struct XFSHttpReader;
+struct KNamelist;
+
+/*))
+ //     Standard method of loading/uploading
+((*/
+XFS_EXTERN rc_t CC XFSHttpMake (
+                            const char * BaseUrl,
+                            const struct XFSHttp ** Http
+                            );
+XFS_EXTERN rc_t CC XFSHttpDispose (
+                            const struct XFSHttp * self
+                            );
+
+XFS_EXTERN rc_t CC XFSHttpAddRef (
+                            const struct XFSHttp * self
+                            );
+XFS_EXTERN rc_t CC XFSHttpRelease (
+                            const struct XFSHttp * self
+                            );
+
+/*))
+ //     Accessing HttpItems
+((*/
+
+/*||
+  ||    Note, while accessing HttpEntry by Has adn Get methods
+  ||    the Path relative to Http base URL should be used
+  ||*/
+XFS_EXTERN const char * CC XFSHttpBaseUrl (
+                            const struct XFSHttp * self
+                            );
+XFS_EXTERN bool CC XFSHttpHasEntry (
+                            const struct XFSHttp * self,
+                            const char * Path
+                            );
+XFS_EXTERN const struct XFSHttpEntry * CC XFSHttpGetEntry (
+                            const struct XFSHttp * self,
+                            const char * Path
+                            );
+XFS_EXTERN rc_t CC XFSHttpGetOrCreateEntry (
+                            const struct XFSHttp * self,
+                            const char * Path,
+                            const struct XFSHttpEntry ** Entry
+                            );
+
+/*))
+ //     HttpEntry content
+((*/
+
+XFS_EXTERN rc_t CC XFSHttpEntryAddRef (
+                            const struct XFSHttpEntry * self
+                            );
+XFS_EXTERN rc_t CC XFSHttpEntryRelease (
+                            const struct XFSHttpEntry * self
+                            );
+
+XFS_EXTERN bool CC XFSHttpEntryIsFolder (
+                            const struct XFSHttpEntry * self
+                            );
+XFS_EXTERN const char * CC XFSHttpEntryName (
+                            const struct XFSHttpEntry * self
+                            );
+XFS_EXTERN const char * CC XFSHttpEntryUrl (
+                            const struct XFSHttpEntry * self
+                            );
+XFS_EXTERN uint32_t CC XFSHttpEntryUrlHash (
+                            const struct XFSHttpEntry * self
+                            );
+XFS_EXTERN rc_t CC XFSHttpEntryList (
+                            const struct XFSHttpEntry * self,
+                            struct KNamelist ** List
+                            );
+XFS_EXTERN rc_t CC XFSHttpEntrySize (
+                            const struct XFSHttpEntry * self,
+                            uint64_t * Size
+                            );
+XFS_EXTERN rc_t CC XFSHttpEntryTime (
+                            const struct XFSHttpEntry * self,
+                            KTime_t * Time
+                            );
+XFS_EXTERN bool CC XFSHttpEntryGood (
+                            const struct XFSHttpEntry * self
+                            );
+    /*))    Access to children nodes by name
+     ((*/
+XFS_EXTERN bool CC XFSHttpEntryHas (
+                            const struct XFSHttpEntry * self,
+                            const char * ChildName
+                            );
+XFS_EXTERN rc_t CC XFSHttpEntryGet (
+                            const struct XFSHttpEntry * self,
+                            const char * ChildName,
+                            const struct XFSHttpEntry ** Child
+                            );
+
+/*))
+ //     Special treatment
+((*/
+XFS_EXTERN rc_t CC XFSHttpRehash ();
+
+/*))
+ //     XFSHttpReader
+((*/
+XFS_EXTERN rc_t CC XFSHttpReaderMake (
+                            const struct XFSHttpEntry * Entry,
+                            const struct XFSHttpReader ** Reader
+                            );
+
+XFS_EXTERN rc_t CC XFSHttpReaderAddRef (
+                            const struct XFSHttpReader * self
+                            );
+XFS_EXTERN rc_t CC XFSHttpReaderRelease (
+                            const struct XFSHttpReader * self
+                            );
+
+XFS_EXTERN rc_t CC XFSHttpReaderRead (
+                            const struct XFSHttpReader * self,
+                            uint64_t Offset,
+                            void * Buffer,
+                            size_t BufferSize,
+                            size_t * NumRead
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _xhttp_h_ */
diff --git a/libs/xfs/xlog.c b/libs/xfs/xlog.c
new file mode 100644
index 0000000..848decc
--- /dev/null
+++ b/libs/xfs/xlog.c
@@ -0,0 +1,295 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/status.h>
+#include <kproc/lock.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <xfs/xlog.h>
+#include "schwarzschraube.h"
+
+#include <sysalloc.h>
+
+ /*))))
+   |||| That file contains unsoted methods
+   ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ || Setting log file is tricky and platform dependent
+((*/
+
+struct _LWr {
+    struct KLock * mutabor;
+
+    const char * path;
+    struct KFile * file;
+
+    uint64_t pos;
+};
+
+static struct _LWr * _sLWr = NULL;
+
+static
+rc_t CC
+_LWrClose ( struct _LWr * self )
+{
+    rc_t RCt = 0;
+
+    XFS_CAN ( self )
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+        if ( self -> file != NULL ) {
+            KFileRelease ( self -> file );
+            self -> file = NULL;
+        }
+
+        KLockUnlock ( self -> mutabor );
+    }
+
+    return 0;
+}   /* _LWrClose () */
+
+static
+rc_t CC
+_LWrOpen ( struct _LWr * self )
+{
+    rc_t RCt;
+    struct KDirectory * NatDir;
+
+    RCt = 0;
+    NatDir = NULL;
+
+    XFS_CAN ( self )
+
+    RCt = KLockAcquire ( self -> mutabor );
+    if ( RCt == 0 ) {
+        if ( self -> file == NULL ) {
+            RCt = KDirectoryNativeDir ( & NatDir );
+            if ( RCt == 0 ) {
+                RCt = KDirectoryCreateFile (
+                                            NatDir,
+                                            & ( self -> file ),
+                                            false,
+                                            0664,
+                                            kcmSharedAppend,
+                                            self -> path
+                                            );
+                if ( RCt == 0 ) {
+                    RCt = KFileSize (
+                                    self -> file,
+                                    & ( self -> pos )
+                                    );
+                }
+                KDirectoryRelease ( NatDir );
+            }
+
+        }
+        KLockUnlock ( self -> mutabor );
+    }
+
+    if ( RCt != 0 ) {
+        _LWrClose ( self );
+    }
+
+    return 0;
+}   /* _LWrOpen () */
+
+static
+rc_t CC
+_LWrDispose ( struct _LWr * self )
+{
+    if ( self != NULL ) {
+        _LWrClose ( self );
+
+        if ( self -> mutabor != NULL ) {
+            KLockRelease ( self -> mutabor );
+            self -> mutabor = NULL;
+        }
+
+        if ( self -> path != NULL ) {
+            free ( ( char * ) self -> path );
+            self -> path = NULL;
+        }
+
+        self -> pos = 0;
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _LWrDispose () */
+
+static 
+rc_t CC
+_LWrMake ( struct _LWr ** Writer, const char * LogFile )
+{
+    rc_t RCt;
+    struct _LWr * TheWriter;
+
+    RCt = 0;
+    TheWriter = NULL;
+
+    XFS_CSAN ( Writer )
+    XFS_CAN ( Writer )
+    XFS_CAN ( LogFile )
+
+    TheWriter = calloc ( 1, sizeof ( struct _LWr ) );
+    if ( TheWriter == NULL ) {
+        RCt = XFS_RC ( rcExhausted );
+    }
+    else {
+        RCt = KLockMake ( & ( TheWriter -> mutabor ) );
+        if ( RCt == 0 ) {
+            RCt = XFS_StrDup ( LogFile, & ( TheWriter -> path ) );
+            if ( RCt == 0 ) {
+                TheWriter -> pos = 0;
+
+                * Writer = TheWriter;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Writer = NULL;
+
+        if ( TheWriter != NULL ) {
+            _LWrDispose ( TheWriter );
+        }
+    }
+
+    return RCt;
+}   /* _LWrMake () */
+
+static
+rc_t CC
+_LWrWriter ( void * self, const char * Bf, size_t BfS, size_t * NWr )
+{
+    rc_t RCt;
+    struct _LWr * Writer;
+
+    RCt = 0;
+    Writer = ( struct _LWr * ) self;
+
+    XFS_CSA ( NWr, 0 )
+    XFS_CAN ( Bf )
+    XFS_CAN ( NWr )
+
+    if ( self != NULL && Writer -> file != NULL ) {
+        RCt = KFileWriteAll ( Writer -> file, Writer -> pos, Bf, BfS, NWr );
+        if ( RCt == 0 ) {
+            Writer -> pos += * NWr;
+        }
+    }
+
+    return RCt;
+}   /* _LWrWriter () */
+
+static
+rc_t CC
+_LWrWriterDummy ( void * s, const char * b, size_t bs, size_t * w )
+{
+    if ( w != NULL ) {
+        * w = bs;
+    }
+
+    return 0;
+}   /* _LWrWriterDummy () */
+
+LIB_EXPORT
+rc_t CC
+XFSLogInit ( const char * LogFile )
+{
+    rc_t RCt;
+    struct _LWr * Writer;
+
+    RCt = 0;
+    Writer = NULL;
+
+    if ( LogFile != NULL ) {
+        if ( _sLWr == NULL ) {
+            RCt = _LWrMake ( & Writer, LogFile );
+            if ( RCt == 0 ) {
+                RCt = _LWrOpen ( Writer );
+                if ( RCt == 0 ) {
+                    _sLWr = Writer;
+
+                    KOutHandlerSet( _LWrWriter, Writer );
+                    KDbgHandlerSet( _LWrWriter, Writer );
+                    KLogHandlerSet( _LWrWriter, Writer );
+                    KLogLibHandlerSet( _LWrWriter, Writer );
+                    KStsHandlerSet( _LWrWriter, Writer );
+                    KStsLibHandlerSet( _LWrWriter, Writer );
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 || LogFile == NULL ) {
+        _sLWr = NULL;
+
+        if ( Writer != NULL ) {
+            _LWrDispose ( Writer );
+        }
+        KOutHandlerSet( _LWrWriterDummy, NULL );
+        KDbgHandlerSet( _LWrWriterDummy, NULL );
+        KLogHandlerSet( _LWrWriterDummy, NULL );
+        KLogLibHandlerSet( _LWrWriterDummy, NULL );
+        KStsHandlerSet( _LWrWriterDummy, NULL );
+        KStsLibHandlerSet( _LWrWriterDummy, NULL );
+    }
+
+    return 0;
+    return RCt;
+}   /* XFSLogInit () */
+
+LIB_EXPORT
+rc_t CC
+XFSLogDestroy ( )
+{
+    struct _LWr * Writer = _sLWr;
+    if ( Writer != NULL ) {
+        _sLWr = NULL;
+
+        _LWrClose ( Writer );
+        _LWrDispose ( Writer );
+    }
+
+    return 0;
+}   /* XFSLogDestroy () */
diff --git a/libs/xfs/xtar.c b/libs/xfs/xtar.c
new file mode 100644
index 0000000..f6afa06
--- /dev/null
+++ b/libs/xfs/xtar.c
@@ -0,0 +1,1248 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/container.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <kproc/lock.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/tar.h>
+
+#include <xfs/path.h>
+
+#include "schwarzschraube.h"
+#include "xtar.h"
+#include "zehr.h"
+#include "lockdpt.h"
+
+#include <sysalloc.h>
+
+#include <ctype.h>
+#include <time.h>
+
+/*||*\
+  || Lyrics:
+  || That file contains interface to TAR archive
+  || Tar archive is readed by using KDirectoryOpenTarArchive from
+  || kfs/tar.h
+  ||
+\*||*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)) XFSTar and XFSTarEntry and _TarDpt ( TarDepot ) structs are
+ ||  living here
+((*/
+
+/*))
+ //  EntryDepot this is responsible for sharing Tar resources
+((*/
+struct _TarDpt {
+    BSTree tree;
+
+    KLock * mutabor;
+};
+
+/*)) 
+ //  Path to a file and related KDirectory
+((*/
+struct XFSTar {
+    BSTNode node;
+
+    KRefcount refcount;
+    KLock * mutabor;
+
+    const char * source;
+    const struct KDirectory * dir;
+
+    XFSStatus status;
+};
+
+/*)) 
+ //  Just a path to entry in TAR archive
+((*/
+struct XFSTarEntry {
+    KRefcount refcount; /* ??? */
+
+    const struct XFSTar * tar;    /* Way we go */
+
+    const char * name;
+    const char * path;
+
+    bool is_folder;
+
+    XFSStatus status;
+
+    const struct KFile * file;
+};
+
+/*) Usefuls
+ (*/
+static const char * _sXFSTar_classname = "XFSTar";
+static const char * _sXFSTarEntry_classname = "XFSTarEntry";
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* _TarDpt Methods ...                                               */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static struct _TarDpt * _sTarDpt = NULL;
+
+static
+struct _TarDpt * CC
+_Dpt ()
+{
+    return _sTarDpt;
+}   /* _Dpt () */
+
+static
+void CC
+_TarDptWhackCallback ( BSTNode * Node, void * unused )
+{
+    if ( Node != NULL ) {
+        XFSTarDispose ( ( struct XFSTar * ) Node );
+    }
+}   /* _TarDptWhackCallback () */
+
+static
+rc_t CC
+_TarDptDisposeImpl ( struct _TarDpt * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self != NULL ) { 
+        BSTreeWhack (
+                    & ( self -> tree ),
+                    _TarDptWhackCallback,
+                    NULL
+                    );
+
+        if ( self -> mutabor != NULL ) {
+            KLockRelease ( self -> mutabor );
+            self -> mutabor = NULL;
+        }
+
+        free ( self );
+    }
+
+    return RCt;
+}   /* _TarDptDisposeImpl () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarDepotDispose ()
+{
+    struct _TarDpt * TarDpt;
+
+    TarDpt = _sTarDpt;
+    _sTarDpt = NULL;
+
+    if ( TarDpt != NULL ) {
+        _TarDptDisposeImpl ( TarDpt );
+    }
+
+    return 0;
+}   /* XFSTarDepotDispose () */
+
+static
+rc_t CC
+_TarDptMakeImpl ( struct _TarDpt ** TarDpt )
+{
+    rc_t RCt;
+    struct _TarDpt * TheD;
+
+    RCt = 0;
+    TheD = NULL;
+
+    if ( TarDpt != NULL ) {
+        * TarDpt = NULL;
+    }
+
+    if ( TarDpt == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    TheD = calloc ( 1, sizeof ( struct _TarDpt ) );
+    if ( TheD == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RCt = KLockMake ( & ( TheD -> mutabor ) );
+    if ( RCt == 0 ) {
+        BSTreeInit ( & ( TheD -> tree ) );
+
+        * TarDpt = TheD;
+    }
+
+    if ( RCt != 0 ) {
+        * TarDpt = NULL;
+        _TarDptDisposeImpl ( TheD );
+    }
+
+    return RCt;
+}   /* _TarDptMakeImpl () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarDepotInit ()
+{
+    rc_t RCt;
+    struct _TarDpt * TarDpt;
+
+    RCt = 0;
+    TarDpt = NULL;
+
+    if ( _sTarDpt == NULL ) {
+
+        RCt = _TarDptMakeImpl ( & TarDpt );
+        if ( RCt == 0 ) {
+            if ( _sTarDpt == NULL ) {
+                _sTarDpt = TarDpt;
+            }
+            else {
+                _TarDptDisposeImpl ( TarDpt );
+            }
+        }
+    }
+
+    return RCt;
+}   /* XFSTarDepotInit () */
+
+static
+int64_t CC
+_TarCmpCallback ( const void * Item, const BSTNode * Node )
+{
+    const char * Str1, * Str2;
+
+    Str1 = ( const char * ) Item;
+
+    Str2 = Node == NULL
+                ? NULL
+                : ( ( struct XFSTar * ) Node ) -> source
+                ;
+    return XFS_StringCompare4BST_ZHR ( Str1, Str2 );
+}   /* _TarCmpCallback () */
+
+static
+rc_t CC
+_TarDptGetNoLock (
+                struct _TarDpt * self,
+                const char * Source,
+                const struct XFSTar ** Tar
+)
+{
+    const struct XFSTar * RetVal = NULL;
+
+    if ( Tar != NULL ) {
+        * Tar = NULL;
+    }
+
+    if ( self == NULL || Source == NULL || Tar == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RetVal = ( const struct XFSTar * ) BSTreeFind (
+                                                & ( self -> tree ),
+                                                Source,
+                                                _TarCmpCallback
+                                                );
+
+
+    * Tar = RetVal;
+
+    return 0;
+}   /* _TarDptGetNoLock () */
+
+static
+int64_t CC
+_TarAddCallback ( const BSTNode * N1, const BSTNode * N2 )
+{
+    return XFS_StringCompare4BST_ZHR (
+            ( ( struct XFSTar * ) N1 ) -> source,
+            ( ( struct XFSTar * ) N2 ) -> source
+            );
+}   /* _TarAddCallback () */
+
+static
+rc_t CC
+_TarDptAddNoLock ( struct _TarDpt * self, const struct XFSTar * Tar )
+{
+    rc_t RCt;
+    const struct XFSTar * TheTar;
+    const char * Source;
+
+    RCt = 0;
+    TheTar = NULL;
+    Source = NULL;
+
+    if ( self == NULL || Tar == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    Source = Tar -> source;
+
+    RCt = _TarDptGetNoLock ( self, Source, & TheTar );
+    if ( RCt == 0 ) {
+        if ( TheTar == NULL ) {
+            RCt = BSTreeInsert (
+                        & ( self -> tree ),
+                        ( struct BSTNode * ) & ( Tar -> node ),
+                        _TarAddCallback
+                        );
+            if ( RCt != 0 ) {
+                XFSTarRelease ( Tar );
+            }
+        }
+    }
+
+    return RCt;
+}   /* _TarDptAddNoLock () */
+
+static
+rc_t CC
+_TarDptDelNoLock ( struct _TarDpt * self, const struct XFSTar * Tar )
+{
+    if ( self == NULL || Tar == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    BSTreeUnlink ( & ( self -> tree ), ( struct BSTNode * ) & ( Tar -> node ) );
+    XFSTarDispose ( Tar );
+
+    return 0;
+}   /* _TarDptDelNoLock () */
+
+static
+rc_t CC
+_TarDptClearNoLock ( struct _TarDpt * self )
+{
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    BSTreeWhack ( & ( self -> tree ), _TarDptWhackCallback, NULL );
+    BSTreeInit ( & ( self -> tree ) );
+
+    return 0;
+}   /* _TarDptClearNoLock () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarDepotClear ()
+{
+    rc_t RCt;
+    struct _TarDpt * D;
+
+    RCt = 0;
+    D = _Dpt ();
+
+    if ( D == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( D -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _TarDptClearNoLock ( D );
+
+        KLockUnlock ( D -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSTarDepotClear () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSTar Methods ...                                                */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+static
+rc_t CC
+_TarOpen ( const struct XFSTar * self )
+{
+    rc_t RCt;
+    struct XFSTar * Tar;
+    const struct KDirectory * Dir;
+    struct KDirectory * NativeDir;
+
+    RCt = 0;
+    Dir = NativeDir = NULL;
+    Tar = ( struct XFSTar * ) self;
+
+    if ( Tar == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = KLockAcquire ( Tar -> mutabor );
+    if ( RCt == 0 ) { 
+        if ( Tar -> status != kxfsReady ) {
+            RCt = XFS_RC ( rcInvalid );
+        }
+        else {
+            if ( Tar -> dir == NULL ) {
+                RCt = KDirectoryNativeDir ( & NativeDir );
+                if ( RCt == 0 ) {
+                    RCt = KDirectoryOpenTarArchiveRead_silent (
+                                                        NativeDir,
+                                                        & Dir,
+                                                        1,
+                                                        Tar -> source
+                                                        );
+                    if ( RCt == 0 ) {
+                        Tar -> dir = Dir;
+                        Tar -> status = kxfsGood;
+                    }
+                    else {
+                        Tar -> status = kxfsBroken;
+                    }
+
+                    KDirectoryRelease ( NativeDir );
+                }
+            }
+        }
+
+        KLockUnlock ( Tar -> mutabor );
+    }
+
+    return RCt;
+}   /* _TarOpen () */
+
+static
+rc_t CC
+_TarClose ( const struct XFSTar * self )
+{
+    rc_t RCt;
+    struct XFSTar * Tar;
+
+    RCt = 0;
+    Tar = ( struct XFSTar * ) self;
+
+    if ( Tar == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = KLockAcquire ( Tar -> mutabor );
+    if ( RCt == 0 ) {
+        if ( Tar -> status == kxfsGood
+                || Tar -> status == kxfsReady /* shouldn't happen */
+        ) {
+            if ( Tar -> dir != NULL ) {
+                KDirectoryRelease ( Tar -> dir );
+
+                Tar -> dir = NULL;
+                Tar -> status = kxfsReady;
+            }
+        }
+        else {
+            RCt = XFS_RC ( rcInvalid );
+        }
+
+        KLockUnlock ( Tar -> mutabor );
+    }
+
+    return RCt;
+}   /* _TarClose () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarDispose ( const struct XFSTar * self )
+{
+    struct XFSTar * Tar = ( struct XFSTar * ) self;
+
+    if ( Tar != NULL ) {
+        Tar -> status = kxfsInvalid;
+
+        if ( Tar -> source != NULL ) {
+            free ( ( char * ) Tar -> source );
+
+            Tar -> source = NULL;
+        }
+
+        if ( Tar -> dir != NULL ) {
+            KDirectoryRelease ( Tar -> dir );
+
+            Tar -> dir = NULL;
+        }
+
+        if ( Tar -> mutabor != NULL ) {
+            KLockRelease ( Tar -> mutabor );
+
+            Tar -> mutabor = NULL;
+        }
+
+        KRefcountWhack ( & ( Tar -> refcount ), _sXFSTar_classname );
+
+        free ( Tar );
+    }
+
+    return 0;
+}   /* XFSTarDispose () */
+
+static
+rc_t CC
+_TarAddRef ( const struct XFSTar * self )
+{
+    rc_t RCt;
+    struct XFSTar * Tar;
+
+    RCt = 0;
+    Tar = ( struct XFSTar * ) self;
+
+    if ( Tar == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    switch ( KRefcountAdd ( & ( Tar -> refcount ), _sXFSTar_classname ) ) {
+        case krefOkay :
+                    RCt = 0;
+                    break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* _TarAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarRelease ( const struct XFSTar * self )
+{
+    rc_t RCt;
+    struct XFSTar * Tar;
+
+    RCt = 0;
+    Tar = ( struct XFSTar * ) self;
+
+    if ( Tar == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    switch ( KRefcountDrop ( & ( Tar -> refcount ), _sXFSTar_classname ) ) {
+
+        case krefOkay :
+        case krefZero :
+                    RCt = 0;
+                    break;
+        case krefWhack :
+                    RCt = _TarClose ( ( struct XFSTar * ) Tar );
+                    break;
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSTarRelease () */
+
+static
+rc_t CC
+_TarMake ( const char * Resource, const struct XFSTar ** Tar )
+{
+    rc_t RCt;
+    struct XFSTar * RetTar;
+
+    RCt = 0;
+    RetTar = NULL;
+
+    if ( Tar != NULL ) {
+        * Tar = NULL;
+    }
+
+    if ( Tar == NULL || Resource == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RetTar = calloc ( 1, sizeof ( struct XFSTar ) );
+    if ( RetTar == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RetTar -> status = kxfsInvalid;
+
+    RCt = KLockMake ( & ( RetTar -> mutabor ) );
+    if ( RCt == 0 ) {
+        KRefcountInit (
+                    & ( RetTar -> refcount ),
+                    1,
+                    _sXFSTar_classname,
+                    "_TarMake",
+                    "Tar"
+                    );
+
+        RCt = XFS_StrDup ( Resource, & ( RetTar -> source ) );
+        if ( RCt == 0 ) {
+            RetTar -> status = kxfsReady;
+
+            * Tar = RetTar;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Tar = NULL;
+
+        XFSTarDispose ( RetTar );
+    }
+
+    return RCt;
+}   /* _TarMake () */
+
+static
+rc_t CC
+_TarDptFindOrCreateNoLock (
+                    struct _TarDpt * self,
+                    const char * Resource,
+                    const struct XFSTar ** Tar
+)
+{
+    rc_t RCt;
+    const struct XFSTar * TheTar;
+
+    RCt = 0;
+    TheTar = NULL;
+
+    if ( Tar != NULL ) {
+        * Tar = NULL;
+    }
+
+    if ( self == NULL || Resource == NULL || Tar == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = _TarDptGetNoLock ( self, Resource, & TheTar );
+    if ( RCt == 0 ) {
+        if ( TheTar != NULL ) {
+            RCt = _TarAddRef ( TheTar );
+        }
+        else {
+            RCt = _TarMake ( Resource, & TheTar );
+        }
+
+    }
+
+    if ( RCt == 0 ) {
+        RCt = _TarDptAddNoLock ( self, TheTar );
+        if ( RCt == 0 ) {
+            * Tar = TheTar;
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Tar = NULL;
+
+        if ( TheTar != NULL ) {
+            _TarDptDelNoLock ( self, TheTar );
+        }
+    }
+
+    return RCt;
+}   /* _TarDptFindOrCreateNoLock () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarFindOrCreate ( const char * Resource, const struct XFSTar ** Tar )
+{
+    rc_t RCt;
+    struct _TarDpt * Dpt;
+    const struct XFSTar * TheTar;
+
+    RCt = 0;
+    TheTar = NULL;
+    Dpt = _Dpt ();
+
+    if ( Tar != NULL ) {
+        * Tar = NULL;
+    }
+
+    if ( Dpt == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( Resource == NULL || Tar == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = KLockAcquire ( Dpt -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = _TarDptFindOrCreateNoLock ( Dpt, Resource, & TheTar );
+
+        KLockUnlock ( Dpt -> mutabor );
+    }
+
+        /* Here we opens TAR directory, it will use another lock
+         */
+    if ( RCt == 0 ) {
+        RCt = _TarOpen ( TheTar );
+        if ( RCt == 0 ) {
+            * Tar = TheTar;
+        }
+        else {
+            XFSTarRelease ( TheTar );
+        }
+    }
+
+    return RCt;
+}   /* XFSTarFindOrCreate () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSTarEntry Make/Dispose Methods ...                             */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+static
+rc_t CC
+_TarEntryDispose ( struct XFSTarEntry * self )
+{
+    if ( self != NULL ) {
+        self -> status = kxfsInvalid;
+
+        if ( XFSTarEntryIsOpen ( self ) ) {
+            XFSTarEntryClose ( self );
+        }
+
+        if ( self -> tar != NULL ) {
+            XFSTarRelease ( self -> tar );
+            self -> tar = NULL;
+        }
+
+        KRefcountWhack (
+                    & ( self -> refcount ),
+                    _sXFSTarEntry_classname
+                    ); 
+
+        if ( self -> name != NULL ) {
+            free ( ( char * ) self -> name ) ;
+
+            self -> name = NULL;
+        }
+
+        if ( self -> path != NULL ) {
+            free ( ( char * ) self -> path ) ;
+
+            self -> path = NULL;
+        }
+
+        self -> is_folder = false;
+
+        free ( self );
+    }
+
+    return 0;
+}   /* _TarEntryDispose () */
+
+static
+rc_t CC
+_TarCreateEntry (
+            const struct XFSTar * self,
+            const char * Path,
+            const struct XFSTarEntry ** Entry
+)
+{
+    rc_t RCt;
+    struct XFSTarEntry * RetEntry;
+    size_t PathSize;
+    uint32_t PathType;
+
+    RCt = 0;
+    RetEntry = NULL;
+    PathSize = 0;
+    PathType = kptNotFound;
+
+    if ( Entry != NULL ) {
+        * Entry = NULL;
+    }
+
+    if ( self == NULL || Path == NULL || Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    PathSize = string_size ( Path );
+    if ( PathSize == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RetEntry = calloc ( 1, sizeof ( struct XFSTarEntry ) );
+    if ( RetEntry == NULL ) {
+        return XFS_RC ( rcExhausted );
+    }
+
+    RetEntry -> status = kxfsReady;
+
+    RCt = _TarAddRef ( self ); 
+    if ( RCt == 0 ) {
+        RetEntry -> tar = self;
+
+        RCt = XFS_StrDup ( Path, & ( RetEntry -> path ) );
+        if ( RCt == 0 ) {
+            RCt = XFS_NameFromPath_ZHR ( Path, & ( RetEntry -> name ), false );
+            if ( RCt == 0 ) {
+                KRefcountInit (
+                            & ( RetEntry -> refcount ),
+                            1,
+                            _sXFSTarEntry_classname,
+                            "_TarCreateEntry",
+                            "TarEntry"
+                            );
+                    /* Here we are going to check if it directory 
+                     */
+                PathType = KDirectoryPathType ( self -> dir, "./%s", Path );
+                switch ( PathType ) {
+                    case kptFile :
+                        RetEntry -> is_folder = false;
+                        break;
+                    case kptDir :
+                        RetEntry -> is_folder = true;
+                        break;
+                    default :
+                        RetEntry -> status = kxfsBroken;
+                        RCt = XFS_RC ( rcInvalid );
+                        break;
+                }
+                if ( RCt == 0 ) {
+                    RetEntry -> status = kxfsGood;
+
+                    * Entry = RetEntry;
+                }
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Entry = NULL;
+
+        if ( RetEntry != NULL ) {
+            _TarEntryDispose ( RetEntry );
+        }
+    }
+
+    return RCt;
+}   /* _TarCreateEntry () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarEntryAddRef ( const struct XFSTarEntry * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    switch ( KRefcountAdd ( & ( self -> refcount ), _sXFSTarEntry_classname ) ) {
+        case krefOkay :
+                    RCt = 0;
+                    break;
+        case krefZero :
+        case krefLimit :
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSTarEntryAddRef () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarEntryRelease ( const struct XFSTarEntry * self )
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( self == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    switch ( KRefcountDrop ( & ( self -> refcount ), _sXFSTarEntry_classname ) ) {
+
+        case krefOkay :
+        case krefZero :
+                    RCt = 0;
+                    break;
+        case krefWhack :
+                    RCt = _TarEntryDispose ( ( struct XFSTarEntry * ) self );
+                    break;
+        case krefNegative :
+                    RCt = XFS_RC ( rcInvalid );
+                    break;
+        default :
+                    RCt = XFS_RC ( rcUnknown );
+                    break;
+    }
+
+    return RCt;
+}   /* XFSTarEntryRelease () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSTar Methods ...                                               */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+LIB_EXPORT
+const char * CC
+XFSTarSource ( const struct XFSTar * self )
+{
+    if ( self != NULL ) {
+        return self -> source;
+    }
+
+    return NULL;
+}   /* XFSTarBaseUrl () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarGetEntry (
+            const struct XFSTar * self,
+            const char * Path,
+            const struct XFSTarEntry ** Entry
+)
+{
+    return _TarCreateEntry ( self, Path, Entry );
+}   /* XFSTarGetEntry () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* XFSTarEntry Methods ...                                          */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+LIB_EXPORT
+bool CC
+XFSTarEntryIsFolder ( const struct XFSTarEntry * self )
+{
+    return self == NULL ? false : ( self -> is_folder );
+}   /* XFSTarEntryIsFolder () */
+
+LIB_EXPORT
+const char * CC
+XFSTarEntryName ( const struct XFSTarEntry * self )
+{
+    return self == NULL ? NULL : ( self -> name );
+}   /* XFSTarEntryName () */
+
+LIB_EXPORT
+const char * CC
+XFSTarEntryPath ( const struct XFSTarEntry * self )
+{
+    return self == NULL ? NULL : ( self -> path );
+}   /* XFSTarEntryPath () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarEntryList (
+                const struct XFSTarEntry * self,
+                struct KNamelist ** List
+)
+{
+    rc_t RCt;
+
+    RCt = 0;
+
+    if ( List != NULL ) {
+        * List = NULL;
+    }
+
+    if ( self == NULL || List == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( ! self -> is_folder || ! ( self -> status == kxfsGood ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( self -> tar -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryList (
+                            self -> tar -> dir,
+                            List,
+                            NULL,
+                            NULL,
+                            "./%s",
+                            self -> path
+                            );
+        KLockUnlock ( self -> tar -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSTarEntryList () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarEntrySize ( const struct XFSTarEntry * self, uint64_t * Size )
+{
+    rc_t RCt = 0;
+
+    if ( Size != NULL ) {
+        * Size = 0;
+    }
+
+    if ( self == NULL || Size == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> status != kxfsGood ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( self -> tar -> mutabor );
+    if ( RCt == 0 ) {
+        if ( ! self -> is_folder ) {
+            RCt = KDirectoryFileSize (
+                                    self -> tar -> dir,
+                                    Size,
+                                    "./%s",
+                                    self -> path
+                                    );
+        }
+
+        KLockUnlock ( self -> tar -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSTarEntrySize () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarEntryTime ( const struct XFSTarEntry * self, KTime_t * Time )
+{
+    rc_t RCt = 0;
+
+    if ( Time != NULL ) {
+        * Time = 0;
+    }
+
+    if ( self == NULL || Time == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> status != kxfsGood ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( self -> tar -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryDate (
+                            self -> tar -> dir,
+                            Time,
+                            "./%s",
+                            self -> path
+                            );
+        KLockUnlock ( self -> tar -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSTarEntryTime () */
+
+LIB_EXPORT
+bool CC
+XFSTarEntryGood ( const struct XFSTarEntry * self )
+{
+    bool RV = false;
+
+    if ( self != NULL ) {
+        if ( KLockAcquire ( self -> tar -> mutabor ) == 0 ) {
+            RV = self -> status == kxfsGood;
+
+            KLockUnlock ( self -> tar -> mutabor );
+        }
+    }
+    return RV;
+}   /* XFSTarEntryGood () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarEntryGetChild (
+                const struct XFSTarEntry * self,
+                const char * ChildName,
+                const struct XFSTarEntry ** Child
+)
+{
+    rc_t RCt;
+    char BF [ XFS_SIZE_1024 ];
+    size_t NumW;
+
+    RCt = 0;
+    * BF = 0;
+    NumW = 0;
+
+    if ( Child != NULL ) {
+        * Child = NULL;
+    }
+
+    if ( self == NULL || ChildName == NULL || Child == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = string_printf (
+                        BF,
+                        sizeof ( BF ),
+                        & NumW,
+                        "%s/%s",
+                        self -> path,
+                        ChildName
+                        );
+    if ( RCt == 0 ) {
+        RCt = XFSTarGetEntry ( self -> tar, BF, Child );
+    }
+
+    return RCt;
+}   /* XFSTarEntryGetChild () */
+
+LIB_EXPORT
+bool CC
+XFSTarEntryIsOpen ( const struct XFSTarEntry * self ) 
+{
+    bool RetVal = false;
+
+    if ( self != NULL ) {
+        if ( KLockAcquire ( self -> tar -> mutabor ) == 0 ) {
+            RetVal = self -> file != NULL;
+
+            KLockUnlock ( self -> tar -> mutabor );
+        }
+    }
+    return RetVal;
+}   /* XFSTarEntryIsOpen () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarEntryOpen ( const struct XFSTarEntry * self )
+{
+    rc_t RCt;
+    struct XFSTarEntry * Entry;
+
+    RCt = 0;
+    Entry = ( struct XFSTarEntry * ) self;
+
+    if ( Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Entry -> status != kxfsGood || Entry -> is_folder == true ) {
+        RCt = XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( Entry -> tar -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = KDirectoryOpenFileRead (
+                                Entry -> tar -> dir,
+                                & ( Entry -> file ),
+                                "./%s",
+                                Entry -> path
+                                );
+        if ( RCt != 0 ) {
+            Entry -> status = kxfsBroken;
+        }
+
+        KLockUnlock ( Entry -> tar -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSTarEntryOpent () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarEntryRead (
+                const struct XFSTarEntry * self,
+                uint64_t Offset,
+                void * Buffer,
+                size_t BufferSize,
+                size_t * NumRead
+)
+{
+    rc_t RCt = 0;
+
+    if ( self == NULL || Buffer == NULL || NumRead == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( self -> file == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    if ( BufferSize == 0 ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( self -> tar -> mutabor );
+    if ( RCt == 0 ) {
+        RCt = KFileRead (
+                        self -> file,
+                        Offset,
+                        Buffer,
+                        BufferSize,
+                        NumRead
+                        );
+        KLockUnlock ( self -> tar -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSTarEntryRead () */
+
+LIB_EXPORT
+rc_t CC
+XFSTarEntryClose ( const struct XFSTarEntry * self )
+{
+    rc_t RCt;
+    struct XFSTarEntry * Entry;
+
+    RCt = 0;
+    Entry = ( struct XFSTarEntry * ) self;
+
+    if ( Entry == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Entry -> file == NULL ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+    RCt = KLockAcquire ( Entry -> tar -> mutabor );
+    if ( RCt == 0 ) {
+        KFileRelease ( Entry -> file );
+        Entry -> file = NULL;
+
+        KLockUnlock ( Entry -> tar -> mutabor );
+    }
+
+    return RCt;
+}   /* XFSTarEntryClose () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
diff --git a/libs/xfs/xtar.h b/libs/xfs/xtar.h
new file mode 100644
index 0000000..ef4461f
--- /dev/null
+++ b/libs/xfs/xtar.h
@@ -0,0 +1,160 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _xtar_h_
+#define _xtar_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   There is some interface build to implement access to files
+  ))))  through HTTP
+ ((((*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSTar;
+struct XFSTarEntry;
+struct XFSTarReader;
+struct KNamelist;
+
+/*))
+ //     Tar depot ... initializing depot for Tar archives
+((*/
+XFS_EXTERN rc_t CC XFSTarDepotInit ();
+XFS_EXTERN rc_t CC XFSTarDepotDispose ();
+XFS_EXTERN rc_t CC XFSTarDepotClear ();
+
+/*))
+ ||     Tar archive make/dispose
+ || There is no ArrRef method. FindOrCreate will add referrence to
+ || archive each time when it called. If refcount was zero, the 
+ || tar archive will be opened for reading. The call of Release 
+ || method reduce refcount, and, if resulting count will became zero,
+ || tar archive will be closed.
+ || To remove tar archive from depot user should use Dispose method.
+((*/
+XFS_EXTERN rc_t CC XFSTarFindOrCreate (
+                            const char * Resource,
+                            const struct XFSTar ** Tar
+                            );
+XFS_EXTERN rc_t CC XFSTarRelease (
+                            const struct XFSTar * self
+                            );
+XFS_EXTERN rc_t CC XFSTarDispose (
+                            const struct XFSTar * self
+                            );
+
+/*))
+ //     Accessing TarItems
+((*/
+
+/*||
+  ||    Note, while accessing TarEntry by Has adn Get methods
+  ||    the Path relative to Tar base URL should be used
+  ||*/
+XFS_EXTERN const char * CC XFSTarSource (
+                            const struct XFSTar * self
+                            );
+XFS_EXTERN rc_t CC XFSTarGetEntry (
+                            const struct XFSTar * self,
+                            const char * Path,
+                            const struct XFSTarEntry ** Entry
+                            );
+
+/*))
+ //     TarEntry content
+((*/
+
+XFS_EXTERN rc_t CC XFSTarEntryAddRef (
+                            const struct XFSTarEntry * self
+                            );
+XFS_EXTERN rc_t CC XFSTarEntryRelease (
+                            const struct XFSTarEntry * self
+                            );
+
+XFS_EXTERN bool CC XFSTarEntryIsFolder (
+                            const struct XFSTarEntry * self
+                            );
+XFS_EXTERN const char * CC XFSTarEntryName (
+                            const struct XFSTarEntry * self
+                            );
+XFS_EXTERN const char * CC XFSTarEntryPath (
+                            const struct XFSTarEntry * self
+                            );
+XFS_EXTERN rc_t CC XFSTarEntryList (
+                            const struct XFSTarEntry * self,
+                            struct KNamelist ** List
+                            );
+XFS_EXTERN rc_t CC XFSTarEntrySize (
+                            const struct XFSTarEntry * self,
+                            uint64_t * Size
+                            );
+XFS_EXTERN rc_t CC XFSTarEntryTime (
+                            const struct XFSTarEntry * self,
+                            KTime_t * Time
+                            );
+XFS_EXTERN bool CC XFSTarEntryGood (
+                            const struct XFSTarEntry * self
+                            );
+XFS_EXTERN rc_t CC XFSTarEntryGetChild (
+                            const struct XFSTarEntry * self,
+                            const char * ChildName,
+                            const struct XFSTarEntry ** Child
+                            );
+/*))
+ //     There will no special reader. Entry reads.
+((*/
+XFS_EXTERN bool CC XFSTarEntryIsOpen (
+                            const struct XFSTarEntry * self
+                            );
+
+XFS_EXTERN rc_t CC XFSTarEntryOpen (
+                            const struct XFSTarEntry * self
+                            );
+
+XFS_EXTERN rc_t CC XFSTarEntryRead (
+                            const struct XFSTarEntry * self,
+                            uint64_t Offset,
+                            void * Buffer,
+                            size_t BufferSize,
+                            size_t * NumRead
+                            );
+
+XFS_EXTERN rc_t CC XFSTarEntryClose (
+                            const struct XFSTarEntry * self
+                            );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _xtar_h_ */
diff --git a/libs/xfs/zehr.c b/libs/xfs/zehr.c
new file mode 100644
index 0000000..e225ea2
--- /dev/null
+++ b/libs/xfs/zehr.c
@@ -0,0 +1,1063 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/namelist.h>
+#include <klib/refcount.h>
+#include <klib/printf.h>
+#include <klib/container.h>
+#include <klib/text.h>
+
+#include <kfg/config.h>
+
+#include <kfs/file.h>
+#include <vfs/path.h>
+#include <kns/manager.h>
+#include <kns/http.h>
+#include <kns/stream.h>
+
+#include <krypto/key.h>
+
+#include "schwarzschraube.h"
+#include "zehr.h"
+#include "mehr.h"
+
+#include <sysalloc.h>
+
+#include <ctype.h>
+#include <os-native.h>
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))  Loading config. BTW, resource is a name of file or URL
+ ((*/
+LIB_EXPORT
+rc_t CC
+XFS_LoadConfig_ZHR (
+                const char * Resource,
+                const struct KConfig ** Config
+)
+{
+    rc_t RCt;
+    const struct KFile * File;
+    struct KConfig * TmpConfig;
+
+    RCt = 0;
+    TmpConfig = NULL;
+    File = NULL;
+
+        /* Now Resource could be NULL
+         */
+    XFS_CSAN ( Config )
+    XFS_CAN ( Config )
+
+    RCt = KConfigMake ( & TmpConfig, NULL );
+    if ( RCt != 0 ) {
+        return RCt;
+    }
+
+    if ( Resource != NULL ) {
+            /* Trying to open resource as file */
+        RCt = XFS_OpenResourceRead_MHR ( Resource, & File );
+        if ( RCt == 0 ) {
+            RCt = KConfigLoadFile ( TmpConfig, Resource, File );
+
+            KFileRelease ( File );
+        }
+    }
+
+    if ( RCt == 0 ) {
+        * Config = TmpConfig;
+    }
+    else {
+        if ( TmpConfig != NULL ) {
+            KConfigRelease ( TmpConfig );
+        }
+    }
+
+    return RCt;
+}   /* XFS_LoadConfig_ZHR () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //  Simple string tokenizer
+((*/
+
+static
+rc_t CC
+_AddTrimStringToList_ZHR ( struct VNamelist * List, char * String )
+{
+        /*))
+         ((    We suppose that String is null terminated and editable
+          ))   ... i.e. it could be called by Tokenizer only
+         ((*/
+    char * BG, * EN;
+
+    if ( String == NULL ) {
+        return 0;
+    }
+
+    if ( List == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    BG = String;
+    EN = BG + strlen ( String );
+
+        /*) Trim from front (*/
+    while ( BG < EN ) {
+        if ( isspace ( * BG ) ) {
+            BG ++;
+        }
+        else {
+            break;
+        }
+    }
+
+        /*) Trim from end (*/
+    while ( BG < EN ) {
+        if ( isspace ( * EN ) || * EN == 0 ) {
+            * EN = 0;
+            EN --;
+        }
+        else {
+            break;
+        }
+    }
+
+    if ( 0 < EN - BG ) {
+        return VNamelistAppend ( List, BG );
+    }
+
+    return 0;
+}   /* _AddTrimStringToList_ZHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_SimpleTokenize_ZHR (
+                    const char * SimpleString,
+                    char Separator,
+                    struct KNamelist ** Tokens
+)
+{
+    rc_t RCt;
+    struct VNamelist * List;
+    char LN [ XFS_SIZE_1024 ], * LNEnd;
+    const char * End;
+
+    RCt = 0;
+    List = NULL;
+    LNEnd = NULL;
+    End = NULL;
+
+    if ( Tokens == NULL || SimpleString == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+    * Tokens = NULL;
+
+    RCt = VNamelistMake ( & List, 16 /* he-he */ );
+    if ( RCt == 0 ) {
+        End = SimpleString;
+        LNEnd = LN;
+
+        while ( * End != 0 ) {
+            * LNEnd = * End;
+
+            if ( * End == Separator ) {
+                *LNEnd = 0;
+
+                RCt = _AddTrimStringToList_ZHR ( List, LN );
+                if ( RCt != 0 ) {
+                    break;
+                }
+
+                LNEnd = LN;
+                End ++;
+            }
+            else {
+                End ++;
+                LNEnd ++;
+            }
+
+        }
+
+        if ( RCt == 0 ) {
+            if ( LN != LNEnd ) {
+                * LNEnd = 0;
+                RCt = _AddTrimStringToList_ZHR ( List, LN );
+            }
+        }
+
+        if ( RCt == 0 ) {
+            RCt = VNamelistToNamelist ( List, Tokens );
+        }
+
+        VNamelistRelease ( List );
+    }
+
+    return RCt;
+}   /* XFS_SimpleTokenize_ZHR () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ //  Simple string comparator
+((*/
+LIB_EXPORT
+int CC
+XFS_StringCompare4BST_ZHR ( const char * Str1, const char * Str2 )
+{
+    if ( Str1 == NULL || Str2 == NULL ) {
+        if ( Str1 != NULL ) {
+            return 4096;
+        }
+        
+        if ( Str2 != NULL ) {
+            return 4096 * - 1;
+        }
+
+        return 0;
+    }
+
+    return strcmp ( Str1, Str2 );
+}   /* XFS_StringCompare4BST_XHR () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static
+rc_t CC
+_NameExtEndPosFromPath (
+                        const char * Path,
+                        const char ** Name,
+                        const char ** Ext,  /* Will be End if No */
+                        const char ** End   /* for Name + Ext */
+)
+{
+    const char * pStart;
+    const char * pEnd;
+    const char * pCurr;
+    const char * pExt;
+
+    pStart = pEnd = pCurr = pExt = NULL;
+
+    XFS_CSAN ( Name )
+    XFS_CSAN ( Ext )
+    XFS_CSAN ( End )
+    XFS_CAN ( Path )
+    XFS_CAN ( Name )
+    XFS_CAN ( Ext )
+    XFS_CAN ( End )
+
+    pStart = Path;
+    pEnd = Path + string_size ( Path );
+    pCurr = pEnd - 1;
+    pExt = pEnd;
+
+    if ( 0 == ( pEnd - pStart ) ) {
+        return XFS_RC ( rcInvalid );
+    }
+
+        /*  Lookin' for name
+         */
+    while ( pStart < pCurr ) {
+        if ( * pCurr == '/' ) {
+            pStart = pCurr + 1;
+            break;
+        }
+
+        pCurr --;
+    }
+
+        /*  Now lookin' for Extention
+         */
+    pCurr = pEnd - 1;
+    while ( pStart < pCurr ) {
+        if ( * pCurr == '.' ) {
+            pExt = pCurr;
+            break;
+        }
+
+        pCurr --;
+    }
+
+    * Name = pStart;
+    * Ext = pExt;
+    * End = pEnd;
+
+    return 0;
+}   /* _NameExtEndPosFromPath () */
+
+/*))
+ ||     Will return name with/without extension
+ ||     It will return new string, so don't forget to delete it
+((*/
+LIB_EXPORT
+rc_t CC
+XFS_NameFromPath_ZHR (
+                    const char * Path,
+                    const char ** Name,
+                    bool TrimExt
+)
+{
+    rc_t RCt;
+    const char * pName;
+    const char * pExt;
+    const char * pEnd;
+    char * RetVal;
+
+    RCt = 0;
+    pName = pExt = pEnd = NULL;
+    RetVal = NULL;
+
+    XFS_CSAN ( Name )
+    XFS_CAN ( Path )
+    XFS_CAN ( Name )
+
+    RCt = _NameExtEndPosFromPath ( Path, & pName, & pExt, & pEnd );
+    if ( RCt == 0 ) {
+
+        RetVal = string_dup (
+                            pName,
+                            ( TrimExt ? pExt : pEnd ) - pName
+                            );
+
+        if ( RetVal == NULL ) {
+            RCt = XFS_RC ( rcExhausted );
+        }
+        else {
+            * Name = RetVal;
+        }
+    }
+
+
+    return RCt;
+}   /* XFS_NameFromPath_ZHR () */
+
+/*))
+ ||     Will return null if Extension does not exists
+ ||     It will return new strings, so don't forget to delete them
+((*/
+LIB_EXPORT
+rc_t CC
+XFS_NameExtFromPath_ZHR (
+                    const char * Path,
+                    const char ** Name,
+                    const char ** Ext
+)
+{
+    rc_t RCt;
+    const char * pName;
+    const char * pExt;
+    const char * pEnd;
+    char * RetName;
+    char * RetExt;
+
+    RCt = 0;
+    pName = pExt = pEnd = NULL;
+    RetName = RetExt = NULL;
+
+    XFS_CSAN ( Name )
+    XFS_CSAN ( Ext )
+    XFS_CAN ( Path )
+    XFS_CAN ( Name )
+    XFS_CAN ( Ext )
+
+    RCt = _NameExtEndPosFromPath ( Path, & pName, & pExt, & pEnd );
+    if ( RCt == 0 ) {
+        RetName = string_dup ( pName, pExt - pName );
+        if ( RetName == NULL ) {
+            RCt = XFS_RC ( rcExhausted );
+        }
+        else {
+            if ( pExt != pEnd ) {
+
+                RetExt = string_dup ( pExt, pEnd - pExt );
+                if ( RetExt == NULL ) {
+                    RCt = XFS_RC ( rcExhausted );
+                }
+            }
+            if ( RCt == 0 ) {
+                * Name = RetName;
+                * Ext = RetExt;
+            }
+        }
+    }
+
+    if ( RCt != 0 ) {
+        * Name = NULL;
+        * Ext = NULL;
+
+        if ( RetName != NULL ) {
+            free ( RetName );
+        }
+
+        if ( RetExt != NULL ) {
+            free ( RetExt );
+        }
+    }
+
+    return RCt;
+}   /* XFS_NameExtFromPath_ZHR () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+ /*))))
+   (((( That file contains methods, which are common for all modules
+   )))) but I am not sure if they were implemented right or wrong.
+   ((((*/
+typedef rc_t ( CC * XFS_ReadV_ZHR ) (
+                                const struct VPath * self,
+                                char * buffer,
+                                size_t buffer_size,
+                                size_t * num_read
+                                );
+
+static
+rc_t CC
+XFS_ReadVEverything_ZHR (
+                const struct VPath * Path,
+                char * Buffer,
+                size_t BufferSize,
+                const char * Filler,
+                XFS_ReadV_ZHR Reader
+)
+{
+    rc_t RCt;
+    size_t NR;
+    const char * DefaultFiller = "NULL";
+
+    RCt = 0;
+
+    if ( Buffer == NULL || BufferSize <= 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Buffer = 0;
+
+    if ( Path != NULL ) {
+        RCt = Reader ( Path, Buffer, BufferSize, & NR );
+    }
+    else {
+        RCt = XFS_RC ( rcNull );
+
+        string_copy_measure (
+                        Buffer,
+                        sizeof ( Buffer ),
+                        ( Filler == NULL ? DefaultFiller : Filler )
+                        );
+    }
+
+    return RCt;
+}   /* XFS_ReadVEverything_ZHR () */
+
+static
+rc_t CC
+XFS_ReadCEverything_ZHR (
+                const char * Url,
+                char * Buffer,
+                size_t BufferSize,
+                const char * Filler,
+                XFS_ReadV_ZHR Reader
+)
+{
+    rc_t RCt;
+    size_t NR;
+    const char * DefaultFiller = "NULL";
+    struct VPath * Path;
+
+    RCt = 0;
+    NR = 0;
+    Path = NULL;
+
+    if ( Buffer == NULL || BufferSize <= 0 ) {
+        return XFS_RC ( rcNull );
+    }
+
+    * Buffer = 0;
+
+    if ( Url == NULL ) {
+        RCt = XFS_RC ( rcNull );
+
+        string_copy_measure (
+                        Buffer,
+                        sizeof ( Buffer ),
+                        ( Filler == NULL ? DefaultFiller : Filler )
+                        );
+    }
+    else {
+        RCt = VFSManagerMakePath ( XFS_VfsManager (), & Path, Url );
+        if ( RCt == 0 ) {
+            RCt = Reader ( Path, Buffer, BufferSize, & NR );
+
+            VPathRelease ( Path );
+        }
+    }
+
+    return RCt;
+}   /* XFS_ReadCEverything_ZHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_ReadVPath_ZHR (
+                const struct VPath * Path,
+                char * Buffer,
+                size_t BufferSize,
+                const char * Filler
+)
+{
+    return XFS_ReadVEverything_ZHR (
+                                Path,
+                                Buffer,
+                                BufferSize,
+                                Filler,
+                                VPathReadPath
+                                );
+}   /* XFS_ReadVPath_ZHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_ReadCPath_ZHR (
+                const char * Url,
+                char * Buffer,
+                size_t BufferSize,
+                const char * Filler
+)
+{
+    return XFS_ReadCEverything_ZHR (
+                                Url,
+                                Buffer,
+                                BufferSize,
+                                Filler,
+                                VPathReadPath
+                                );
+}   /* XFS_ReadCPath_ZHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_ReadVUri_ZHR (
+                const struct VPath * Path,
+                char * Buffer,
+                size_t BufferSize,
+                const char * Filler
+)
+{
+    return XFS_ReadVEverything_ZHR (
+                                Path,
+                                Buffer,
+                                BufferSize,
+                                Filler,
+                                VPathReadUri
+                                );
+}   /* XFS_ReadVUri_ZHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_ReadCUri_ZHR (
+                const char * Url,
+                char * Buffer,
+                size_t BufferSize,
+                const char * Filler
+)
+{
+    return XFS_ReadCEverything_ZHR (
+                                Url,
+                                Buffer,
+                                BufferSize,
+                                Filler,
+                                VPathReadUri
+                                );
+}   /* XFS_ReadCUri_ZHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_ReadVHost_ZHR (
+                const struct VPath * Path,
+                char * Buffer,
+                size_t BufferSize,
+                const char * Filler
+)
+{
+    return XFS_ReadVEverything_ZHR (
+                                Path,
+                                Buffer,
+                                BufferSize,
+                                Filler,
+                                VPathReadHost
+                                );
+}   /* XFS_ReadVHost_ZHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_ReadCHost_ZHR (
+                const char * Url,
+                char * Buffer,
+                size_t BufferSize,
+                const char * Filler
+)
+{
+    return XFS_ReadCEverything_ZHR (
+                                Url,
+                                Buffer,
+                                BufferSize,
+                                Filler,
+                                VPathReadHost
+                                );
+}   /* XFS_ReadCHost_ZHR () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+LIB_EXPORT
+const char * CC
+XFS_SkipSpaces_ZHR ( const char * Start, const char * End )
+{
+    if ( Start != NULL && End != NULL ) {
+        while ( Start < End ) {
+            if ( ! isspace ( * Start ) ) {
+                return Start;
+            }
+
+            Start ++;
+        }
+    }
+    return NULL;
+}   /* XFS_SkipSpaces_ZHR () */
+
+LIB_EXPORT
+const char * CC
+XFS_SkipLetters_ZHR ( const char * Start, const char * End )
+{
+    if ( Start != NULL && End != NULL ) {
+        while ( Start < End ) {
+            if ( isspace ( * Start ) ) {
+                return Start;
+            }
+
+            Start ++;
+        }
+    }
+    return NULL;
+}   /* XFS_SkipLetters_ZHR () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct XFSHttpStream {
+    KClientHttp * http;
+    KHttpRequest * req;
+    KHttpResult * res;
+    KStream * str;
+
+    rc_t last_error;
+    bool completed;
+};
+
+LIB_EXPORT
+rc_t CC
+XFS_HttpStreamMake_ZHR (
+                    const char * Url,
+                    const struct XFSHttpStream ** Stream
+)
+{
+    rc_t RCt;
+    struct VPath * Path;
+    struct String Host;
+    uint32_t Port;
+    struct XFSHttpStream * TheStream;
+
+    RCt = 0;
+    Path = NULL;
+    TheStream = NULL;
+
+    if ( Stream != NULL ) {
+        * Stream = NULL;
+    }
+
+    if ( Url == NULL || Stream == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    RCt = VFSManagerMakePath ( XFS_VfsManager (), & Path, Url );
+    if ( RCt == 0 ) {
+        RCt = VPathGetHost ( Path, & Host );
+        if ( RCt == 0 ) {
+            Port = VPathGetPortNum ( Path );
+
+            TheStream = calloc ( 1, sizeof ( struct XFSHttpStream ) );
+            if ( TheStream == NULL ) {
+                RCt = XFS_RC ( rcExhausted );
+            }
+            else {
+                RCt = KNSManagerMakeHttp (
+                                    XFS_KnsManager(),
+                                    & ( TheStream -> http ),
+                                    NULL,
+                                    0x01010000,
+                                    & Host,
+                                    Port
+                                    );
+                if ( RCt == 0 ) {
+                    RCt = KHttpMakeRequest (
+                                        TheStream -> http,
+                                        & ( TheStream -> req ),
+                                        Url
+                                        );
+                    if ( RCt == 0 ) {
+                        RCt = KHttpRequestGET (
+                                        TheStream -> req,
+                                        & ( TheStream -> res )
+                                        );
+                        if ( RCt == 0 ) {
+                            RCt = KHttpResultGetInputStream (
+                                                TheStream -> res,
+                                                & ( TheStream -> str )
+                                                );
+                            if ( RCt == 0 ) {
+                                TheStream -> completed = false;
+                                TheStream -> last_error = 0;
+
+                                * Stream = TheStream;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        VPathRelease ( Path );
+    }
+
+    if ( RCt != 0 ) {
+        * Stream = NULL;
+
+        if ( TheStream != NULL ) {
+            XFS_HttpStreamDispose_ZHR ( TheStream );
+        }
+    }
+
+    return RCt;
+}   /* XFS_HttpStreamMake_ZHR () */
+
+static
+rc_t CC
+_HttpStreamCloseInternals_ZHR ( const struct XFSHttpStream * self )
+{
+    struct XFSHttpStream * Stream = ( struct XFSHttpStream * ) self;
+
+    if ( Stream == 0 ) {
+        return 0;
+    }
+
+    if ( Stream -> str != NULL ) {
+        KStreamRelease ( Stream -> str );
+
+        Stream -> str = NULL;
+    }
+
+    if ( Stream -> res != NULL ) {
+        KClientHttpResultRelease ( Stream -> res );
+
+        Stream -> res = NULL;
+    }
+
+    if ( Stream -> req != NULL ) {
+        KClientHttpRequestRelease ( Stream -> req );
+
+        Stream -> req = NULL;
+    }
+
+    if ( Stream -> http != NULL ) {
+        KClientHttpRelease ( Stream -> http );
+
+        Stream -> http = NULL;
+    }
+
+    return 0;
+}   /* _HttpStreamCloseInternals_ZHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_HttpStreamDispose_ZHR ( const struct XFSHttpStream * self )
+{
+    struct XFSHttpStream * Stream = ( struct XFSHttpStream * ) self;
+
+    if ( Stream == NULL ) {
+        return 0;
+    }
+
+    Stream -> completed = false;
+    Stream -> last_error = XFS_RC ( rcInvalid );
+
+    _HttpStreamCloseInternals_ZHR ( self );
+
+    free ( Stream );
+
+    return 0;
+}   /* XFS_HttpStreamDispose_ZHR () */
+
+LIB_EXPORT
+bool CC
+XFS_HttpStreamGood_ZHR ( const struct XFSHttpStream * self )
+{
+    if ( self != NULL ) {
+        return self -> last_error == 0;
+    }
+    return false;
+}   /* XFS_HttpStreamGood_ZHR () */
+
+LIB_EXPORT
+bool CC
+XFS_HttpStreamCompleted_ZHR ( const struct XFSHttpStream * self )
+{
+    if ( self != NULL ) {
+        return self -> completed;
+    }
+    return true;
+}   /* XFS_HttpStreamCompleted_ZHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_HttpStreamRead_ZHR (
+                    const struct XFSHttpStream * self,
+                    void * Buffer,
+                    size_t Size,
+                    size_t * NumRead
+)
+{
+    struct XFSHttpStream * Stream = ( struct XFSHttpStream * ) self;
+
+    if ( NumRead != NULL ) {
+        * NumRead = 0;
+    }
+
+    if ( Stream == NULL || Buffer == NULL || Size == 0 || NumRead == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Stream -> last_error != 0 ) {
+        return Stream -> last_error;
+    }
+
+    if ( Stream -> completed ) {
+        * NumRead = 0;
+
+        return 0;
+    }
+
+    if ( Stream -> str == NULL ) {
+        _HttpStreamCloseInternals_ZHR ( Stream );
+
+        Stream -> last_error = XFS_RC ( rcInvalid );
+
+        return Stream -> last_error;
+    }
+
+    Stream -> last_error = KStreamRead ( 
+                                    Stream -> str,
+                                    Buffer,
+                                    Size,
+                                    NumRead
+                                    );
+    if ( Stream -> last_error == 0 ) {
+        if ( * NumRead == 0 ) {
+            _HttpStreamCloseInternals_ZHR ( Stream );
+
+            Stream -> completed = true;
+        }
+    }
+    else {
+        _HttpStreamCloseInternals_ZHR ( Stream );
+    }
+
+    return self -> last_error;
+}   /* XFS_HttpStreamRead_ZHR */
+
+LIB_EXPORT
+rc_t CC
+XFS_HttpStreamTimedRead_ZHR (
+                    const struct XFSHttpStream * self,
+                    void * Buffer,
+                    size_t Size,
+                    size_t * NumRead,
+                    struct timeout_t * Tm
+)
+{
+    struct XFSHttpStream * Stream = ( struct XFSHttpStream * ) self;
+
+    if ( NumRead != NULL ) {
+        * NumRead = 0;
+    }
+
+    if ( Stream == NULL || Buffer == NULL || Size == 0 || NumRead == NULL ) {
+        return XFS_RC ( rcNull );
+    }
+
+    if ( Stream -> last_error != 0 ) {
+        return Stream -> last_error;
+    }
+
+    if ( Stream -> completed ) {
+        * NumRead = 0;
+
+        return 0;
+    }
+
+    if ( Stream -> str == NULL ) {
+        _HttpStreamCloseInternals_ZHR ( Stream );
+
+        Stream -> last_error = XFS_RC ( rcInvalid );
+
+        return Stream -> last_error;
+    }
+
+    Stream -> last_error = KStreamTimedRead ( 
+                                    Stream -> str,
+                                    Buffer,
+                                    Size,
+                                    NumRead,
+                                    Tm
+                                    );
+    if ( Stream -> last_error == 0 ) {
+        if ( * NumRead == 0 ) {
+            _HttpStreamCloseInternals_ZHR ( Stream );
+
+            Stream -> completed = true;
+        }
+    }
+    else {
+        _HttpStreamCloseInternals_ZHR ( Stream );
+    }
+
+    return self -> last_error;
+}   /* XFS_HttpStreamTimedRead_ZHR */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static
+rc_t CC
+XFS_KeyType_ZHR ( const char * EncType, KKeyType * Type )
+{
+    size_t B;
+    const char * C;
+
+    B = 0;
+    C = NULL;
+
+    XFS_CAN ( Type )
+    * Type = kkeyNone;
+
+    if ( EncType == NULL ) {
+        * Type = KKeyTypeDefault;
+        return 0;
+    }
+
+    B = string_size ( EncType );
+
+    C = "AES128";
+    if ( strcase_cmp ( C, string_size ( C ), EncType, B, B ) == 0 ) {
+        * Type = kkeyAES128;
+        return 0;
+    }
+
+    C = "AES192";
+    if ( strcase_cmp ( C, string_size ( C ), EncType, B, B ) == 0 ) {
+        * Type = kkeyAES192;
+        return 0;
+    }
+
+    C = "AES256";
+    if ( strcase_cmp ( C, string_size ( C ), EncType, B, B ) == 0 ) {
+        * Type = kkeyAES256;
+        return 0;
+    }
+
+    return XFS_RC ( rcInvalid );
+}   /* XFS_KeyType_ZHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_InitKKey_ZHR (
+            const char * EncPass,
+            const char * EncType,
+            struct KKey * Key
+)
+{
+    rc_t RCt;
+    KKeyType Type;
+
+    RCt = 0;
+    Type = kkeyNone;
+
+    XFS_CAN ( EncPass )
+    XFS_CAN ( Key )
+
+    RCt = XFS_KeyType_ZHR ( EncType, & Type );
+    if ( RCt == 0 ) {
+        RCt = KKeyInitRead (
+                            Key,
+                            Type,
+                            EncPass,
+                            string_size ( EncPass )
+                            );
+    }
+
+    return RCt;
+}   /* XFS_InitKey_ZHR () */
+
+LIB_EXPORT
+rc_t CC
+XFS_CopyKKey_ZHR ( const struct KKey * Src, struct KKey * Dst )
+{
+    XFS_CAN ( Src )
+    XFS_CAN ( Dst )
+
+    memmove ( Dst, Src, sizeof ( struct KKey ) );
+
+    return 0;
+}   /* XFS_CopyKKey_ZHR () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
diff --git a/libs/xfs/zehr.h b/libs/xfs/zehr.h
new file mode 100644
index 0000000..5fa3ea1
--- /dev/null
+++ b/libs/xfs/zehr.h
@@ -0,0 +1,266 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _zehr_h_
+#define _zehr_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif /* __cplusplus */
+
+/*))))
+ ((((   This file contains methods and definitions, which
+  ))))  should be extended and reimplemented later
+ ((((     All names in that file ends with _ZHR
+  ))))
+ ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))  Universal method which should load config from resource
+ ((*/
+
+struct KConfig;
+
+XFS_EXTERN rc_t CC XFS_LoadConfig_ZHR (
+                                    const char * Resource,
+                                    const struct KConfig ** Konfig
+                                    );
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct KNamelist;
+
+/*))
+ ((   Simple string tokeniser: splits string by separator and fills
+  ))  KNamelist, trims 'isspace' from begin and end of strings
+ ((*/
+XFS_EXTERN rc_t CC XFS_SimpleTokenize_ZHR (
+                                        const char * SimpleString,
+                                        char Separator,
+                                        struct KNamelist ** Tokens
+                                        );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ ((   That is correct comparision function needed for BSTree operations
+  ))
+ ((*/
+XFS_EXTERN int CC XFS_StringCompare4BST_ZHR (
+                                    const char * Str1,
+                                    const char * Str2
+                                    );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+    /*))
+     ||     Will return name with/without extension
+     ||     It will return new string, so don't forget to delete it
+    ((*/
+XFS_EXTERN rc_t CC XFS_NameFromPath_ZHR (
+                                        const char * Paht,
+                                        const char ** Name,
+                                        bool TrimExtension
+                                        );
+
+    /*))
+     ||     Will return null if Extension does not exists
+     ||     It will return new strings, so don't forget to delete them
+    ((*/
+XFS_EXTERN rc_t CC XFS_NameExtFromPath_ZHR (
+                                        const char * Paht,
+                                        const char ** Name,
+                                        const char ** Extension
+                                        );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct VPath;
+
+/*))
+  ||   Prints VPath to buffer, and, if there was error of reading,
+  ||   or Path is NULL, the Filler value will be copied to buffer.
+  ||   Filler should be 0 terminated string, or NULL If Filler is
+  ||   NULL, the "NULL" will be copied to buffer then.
+  ((*/
+XFS_EXTERN rc_t CC XFS_ReadVPath_ZHR (
+                                    const struct VPath * Path,
+                                    char * Buffer,
+                                    size_t BufferSize,
+                                    const char * Filler
+                                    );
+XFS_EXTERN rc_t CC XFS_ReadCPath_ZHR (
+                                    const char * Url,
+                                    char * Buffer,
+                                    size_t BufferSize,
+                                    const char * Filler
+                                    );
+
+/*))
+  ||   Prints VPath Uri to buffer, and, if there was error of reading,
+  ||   or Path is NULL, the Filler value will be copied to buffer.
+  ||   Filler should be 0 terminated string, or NULL If Filler is
+  ||   NULL, the "NULL" will be copied to buffer then.
+  ((*/
+XFS_EXTERN rc_t CC XFS_ReadVUri_ZHR (
+                                    const struct VPath * Path,
+                                    char * Buffer,
+                                    size_t BufferSize,
+                                    const char * Filler
+                                    );
+XFS_EXTERN rc_t CC XFS_ReadCUri_ZHR (
+                                    const char * Url,
+                                    char * Buffer,
+                                    size_t BufferSize,
+                                    const char * Filler
+                                    );
+
+/*))
+  ||   Prints VPath Host to buffer, and, if there was error of reading,
+  ||   or Path is NULL, the Filler value will be copied to buffer.
+  ||   Filler should be 0 terminated string, or NULL If Filler is
+  ||   NULL, the "NULL" will be copied to buffer then.
+  ((*/
+XFS_EXTERN rc_t CC XFS_ReadVHost_ZHR (
+                                    const struct VPath * Path,
+                                    char * Buffer,
+                                    size_t BufferSize,
+                                    const char * Filler
+                                    );
+
+XFS_EXTERN rc_t CC XFS_ReadCHost_ZHR (
+                                    const char * Url,
+                                    char * Buffer,
+                                    size_t BufferSize,
+                                    const char * Filler
+                                    );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*|
+|*  Those methods does not do any error handling and returns NULL in 
+ *| the case of error, or if condition was not found
+|*/
+XFS_EXTERN const char * CC XFS_SkipSpaces_ZHR (
+                                    const char * Start,
+                                    const char * End
+                                    );
+
+XFS_EXTERN const char * CC XFS_SkipLetters_ZHR (
+                                    const char * Start,
+                                    const char * End
+                                    );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*\
+|*| That is representing HttpStreamer. The reason why I do it here,
+|*| is : KHttpFile does not work if "content-length" field missed
+|*| at header
+\*/
+struct XFSHttpStream;
+struct timeout_t;
+
+XFS_EXTERN rc_t CC XFS_HttpStreamMake_ZHR (
+                                    const char * Url,
+                                    const struct XFSHttpStream ** Stream
+                                    );
+
+XFS_EXTERN rc_t CC XFS_HttpStreamDispose_ZHR (
+                                    const struct XFSHttpStream * self
+                                    );
+
+XFS_EXTERN bool CC XFS_HttpStreamGood_ZHR (
+                                    const struct XFSHttpStream * self
+                                    );
+
+XFS_EXTERN bool CC XFS_HttpStreamCompleted_ZHR (
+                                    const struct XFSHttpStream * self
+                                    );
+
+    /*>>
+     // Reading :
+     \\     End of stream indicator is NumRead == 0 and rc_t == 0
+     //     If timeout == NULL - will block indefinitely
+    <<*/
+XFS_EXTERN rc_t CC XFS_HttpStreamRead_ZHR (
+                                    const struct XFSHttpStream * self,
+                                    void * Buffer,
+                                    size_t Size,
+                                    size_t * NumRead
+                                    );
+
+XFS_EXTERN rc_t CC XFS_HttpStreamTimedRead_ZHR (
+                                    const struct XFSHttpStream * self,
+                                    void * Buffer,
+                                    size_t Size,
+                                    size_t * NumRead,
+                                    struct timeout_t * Tm
+                                    );
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+struct KKey;
+XFS_EXTERN rc_t CC XFS_InitKKey_ZHR (
+                                    const char * EncPass,
+                                    const char * EncType,
+                                    struct KKey * Key
+                                    );
+XFS_EXTERN rc_t CC XFS_CopyKKey_ZHR (
+                                    const struct KKey * Src,
+                                    struct KKey * Dst
+                                    );
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+#ifdef __cplusplus 
+}
+#endif /* __cplusplus */
+
+#endif /* _zehr_h_ */
diff --git a/local-builds.sh b/local-builds.sh
new file mode 100755
index 0000000..e6dbd96
--- /dev/null
+++ b/local-builds.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+
+# consider the entire matrix to have a single timestamp
+NOW=$(date "+%Y-%m-%d.%H.%M.%S")
+
+# for most builds, we use a separate host to determine architecture
+# and these will have a single item in the list called "default"
+ARCH_LIST=$(make architectures)
+if [ "$ARCH_LIST" = "default" ]
+then
+    CUR_ARCH=$(make architecture)
+else
+    CUR_ARCH=all-arch
+fi
+
+run ()
+{
+    echo "MAKE COMMANDS: make $*"
+
+    for COMPILER in $(make compilers)
+    do
+        make $COMPILER 1> /dev/null
+
+        for LINKAGE in dynamic static
+        do
+
+            make $LINKAGE 1> /dev/null
+
+            for ARCHITECTURE in $ARCH_LIST 
+            do
+
+                if [ "$ARCHITECTURE" = "default" ]
+                then
+                    ARCHITECTURE=$CUR_ARCH
+                else
+                    make $ARCHITECTURE 1> /dev/null
+                fi
+
+                for OPTIMIZATION in debug release profile
+                do
+
+                    make $OPTIMIZATION 1> /dev/null
+
+                    TARGET_DIR=$(make targdir)
+
+                    if make $* 1> "$TARGET_DIR/$NOW-build.log" 2> "$TARGET_DIR/$NOW-build.err"
+                    then
+                        STATUS="COMPLETED"
+                    else
+                        STATUS=" FAILED  "
+                    fi
+
+                    printf "%-32s [ %s ]\n" $COMPILER.$LINKAGE.$ARCHITECTURE.$OPTIMIZATION "$STATUS"
+
+                done
+
+            done
+
+        done
+
+    done
+}
+
+# going to put a log of this activity into OS output directory
+OS_DIR=$(make osdir)
+[ -d "$OS_DIR" ] || mkdir -p "$OS_DIR"
+
+# log based upon architecture to avoid competitions
+LOG_FILE="$OS_DIR/$NOW-build-$CUR_ARCH.log"
+
+# run the matrix of builds
+run $* 2>&1 | tee "$LOG_FILE"
diff --git a/schema_crc.pl b/schema_crc.pl
new file mode 100755
index 0000000..ca5230e
--- /dev/null
+++ b/schema_crc.pl
@@ -0,0 +1,148 @@
+#!/usr/bin/perl -w
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+use File::Path;
+use IO::File;
+
+# walks a given range of accessions and prints 'crc of schema', platform,
+# obj-time, tabdb and loader
+
+# example: schema_crc.pl SRR 000010 000020
+# walks accessions SRR000010 ... SRR000020
+
+
+walk_acc ( @ARGV );
+
+sub walk_acc
+{
+    my( $prefix, $first, $last ) = @_;
+    my $count;
+
+    for ( $count = $first; $count <= $last; $count++ )
+    {
+        my $acc  = sprintf( "$prefix%.06d", $count );
+        my $path = `srapath $acc 2>/dev/null`;
+        chomp( $path );
+        if ( -e "$path" )
+        {
+            my $crc  = get_schema_crc( $acc );
+            my $pfm  = get_platform( $acc );
+            my $time = get_obj_time( $path );
+            my $tdb  = get_tabdb( $acc );
+            my $ldr  = get_loader( $path );
+            my $pt   = "file";
+            print( "$acc\t$pt\t$crc\t$pfm\t$time\t$tdb\t$ldr\n" );
+        }
+        elsif ( -d "$path" )
+        {
+            my $crc  = get_schema_crc( $acc );
+            my $pfm  = get_platform( $acc );
+            my $time = get_obj_time( $path );
+            my $tdb  = get_tabdb( $acc );
+            my $ldr  = get_loader( $path );
+            my $pt   = "dir";
+            print( "$acc\t$pt\t$crc\t$pfm\t$time\t$tdb\t$ldr\n" );
+        }
+        else
+        {
+            print( "$acc not-found\n" );
+        }
+    }
+}
+
+sub get_schema_crc
+{
+    my( $src ) = @_;
+    my $cmd = "vdb-dump $src -A | md5sum";
+    open ( PROC, "-|", "$cmd" ) or die "vdb-dump ( print schema ) failed";
+    my $row = <PROC>;
+    chomp( $row );
+    close ( PROC );
+    my @parts = split( / /, $row );
+    return $parts[ 0 ];
+}
+
+sub get_platform
+{
+    my( $src ) = @_;
+    my $cmd = "vdb-dump $src -N -R1 -CPLATFORM 2>/dev/null";
+    open ( PROC, "-|", "$cmd" ) or die "vdb-dump ( print platform ) failed";
+    my $row = <PROC>;
+    chomp( $row );
+    close ( PROC );
+    return $row;
+}
+
+sub get_obj_time
+{
+    my( $src ) = @_;
+    my $cmd = "ls -l -d $src 2>/dev/null";
+    open ( PROC, "-|", "$cmd" ) or die "ls -l failed";
+    my $row = <PROC>;
+    chomp( $row );
+    close ( PROC );
+    my @parts = split( ' ', $row );
+    my $res = sprintf( "%s-%s-%s", $parts[ 5 ], $parts[ 6 ], $parts[ 7 ] );
+    return $res;
+}
+
+sub get_tabdb
+{
+    my( $src ) = @_;
+    my $cmd = "vdb-dump $src -E 2>/dev/null";
+    open ( PROC, "-|", "$cmd" ) or die "vdb-dump ( check tab/db ) failed";
+    my $row = <PROC>;
+    chomp( $row );
+    close ( PROC );
+    my @parts = split( / /, $row );
+    if ( $row )
+    {
+        if ( $parts[ 0 ] eq "cannot" )
+        {
+            return "table";
+        }
+        else
+        {
+            return "database";
+        }
+    }
+}
+
+sub get_loader
+{
+    my( $src ) = @_;
+    my $cmd = "kdbmeta $src SOFTWARE/loader 2>/dev/null";
+    open ( PROC, "-|", "$cmd" ) or die "kdmeta failed";
+    my $row = <PROC>;
+    close ( PROC );
+    if ( $row )
+    {
+        chomp( $row );
+        return $row;
+    }
+    else
+    {
+        return "unknown";
+    }
+}
diff --git a/scripts/explain_sam_flags.py b/scripts/explain_sam_flags.py
deleted file mode 100755
index cb6ad02..0000000
--- a/scripts/explain_sam_flags.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/env python
-
-# The MIT License
-#
-# Copyright (c) $today.year The Broad Institute
-#
-# 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
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-#
-# $Header$
-
-"""usage %prog decimal-flag [decimal-flag...]
-
-Explain each flag on the command line in plain English
-"""
-
-from __future__ import division
-import sys
-
-lstFlags = [
-    ("read paired", 0x1),
-    ("read mapped in proper pair", 0x2),
-    ("read unmapped", 0x4),
-    ("mate unmapped", 0x8),
-    ("read reverse strand", 0x10),
-    ("mate reverse strand", 0x20),
-    ("first in pair", 0x40),
-    ("second in pair", 0x80),
-    ("not primary alignment", 0x100),
-    ("read fails platform/vendor quality checks", 0x200),
-    ("read is PCR or optical duplicate", 0x400),
-    ("supplementary alignment", 0x800)
-    ]
-    
-
-def explain_sam_flags(iFlags):
-    print iFlags, ":"
-    for strFlagName, iMask in lstFlags:
-        if iFlags & iMask:
-            print "\t" + strFlagName
-
-def main(argv=None):
-    if argv is None:
-        argv = sys.argv
-
-    for strArg in argv[1:]:
-        explain_sam_flags(int(strArg))
-
-if __name__ == "__main__":
-    sys.exit(main())
-    
diff --git a/scripts/release_picard.sh b/scripts/release_picard.sh
deleted file mode 100755
index 732234a..0000000
--- a/scripts/release_picard.sh
+++ /dev/null
@@ -1,152 +0,0 @@
-#! /bin/bash
-
-# The MIT License
-#
-# Copyright (c) $today.year The Broad Institute
-#
-# 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
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-
-PROGNAME=`basename $0`
-USERNAME=alecw
-
-function usage () {
-    echo "USAGE: $PROGNAME <release-id>" >&2
-    echo "Tags Github Picard source, checks out and builds sources, uploads build results to Sourceforge.">&2
-    echo "-t <tmpdir>                Build in <tmpdir>.  Default: $TMPDIR." >&2
-    echo "-u <sourceforge-user> Sourceforge username.  Default: $USERNAME." >&2
-}
-
-function tag_exists() {
-    git tag | grep -q "$1$"
-    if test $? = 0
-        then return 0
-        else return 1
-    fi
-}
-
-function remote_does_not_exist() {
-    git ls-remote $1 2>/dev/null 1>/dev/null
-    if test $? = 0
-        then return 1
-        else return 0
-    fi
-}
-
-function remote_tag_does_not_exist() {
-    git ls-remote --tags $2 | grep -q "$1$";
-    if test $? = 0
-        then return 0
-        else return 1
-    fi
-}
-
-set -e
-
-while getopts "ht:u:" options; do
-  case $options in
-    u ) USERNAME=$OPTARG;;
-    t ) TMPDIR=$OPTARG;;
-    h ) usage;;
-    \? ) usage
-         exit 1;;
-    * ) usage
-          exit 1;;
-
-  esac
-done
-shift $(($OPTIND - 1))
-
-if (( $# != 1 ))
- then echo "ERROR: Incorrect number of arguments." >&2
-      usage
-      exit 1
-fi
-
-if [[ x"$EDITOR" == x ]]
-then echo "EDITOR environment variable must be set." >&2
-       exit 1
-fi
-
-# Require actual Java 1.6.  This is not necessary for compiling, because can run 1.7 with -target 1.6,
-# but this is necessary in order to force unit tests to run with 1.6.
-(echo $JAVA_HOME | fgrep -q 1.6 ) || { echo "JAVA_HOME $JAVA_HOME is not 1.6" ; exit 1; }
-java_version=`java -version 2>&1 | fgrep -i version`
-(echo $java_version | fgrep -q 1.6. ) || { echo "java -version: $java_version is not 1.6"; exit 1; }
-
-GITROOT=git at github.com:samtools/htsjdk.git
-REMOTE=origin
-
-RELEASE_ID=$1
-
-# Since releases are lexically sorted, need to filter in order to have 1.1xx be at the bottom.
-PREV_RELEASE_ID=`git ls-remote --tags | grep -v "{}$" | awk '{print $2}' | sed -e "s_.*/__g" | egrep '[.]\d\d\d' | tail -1`
-
-if [[ -e $TMPDIR/htsjdk ]]
-then echo "$TMPDIR/htsjdk already exists.  Please remove or specify a different TMPDIR." >&2
-        exit 1
-fi
-cd $TMPDIR
-
-# clone
-git clone $GITROOT htsjdk 
-cd htsjdk
-ant clean # Shouldn't be necessary, but no harm
-
-# tag must not exist
-if tag_exists $RELEASE_ID
-then echo "ERROR: Tag $RELEASE_ID locally already exists"
-     exit 1
-fi
-
-# remote must exist
-if remote_does_not_exist $REMOTE
-then echo "ERROR: Remote $REMOTE does not exist"
-     exit 1
-fi
-
-# tag at remote must not exist
-if remote_tag_does_not_exist $RELEASE_ID $REMOTE
-then echo "ERROR: Tag $RELEASE_ID at remote $REMOTE already exists"
-     exit 1
-fi
-
-# tag the branch locally then push to remote
-echo Tagging master as $tag and pushing the tag to $remote
-# NB: we could use annotated tags in the future to store release notes, etc.
-git tag $tag
-git push $remote $tag # TODO: should we check this return value in case someone made a tag since we last checked?
-
-ant -lib lib/ant test
-
-ant -lib lib/ant clean all javadoc
-
-mkdir -p deploy/picard-tools/$RELEASE_ID
-
-mkdir -p deploy/htsjdk/$RELEASE_ID
-cp dist/htsjdk-$RELEASE_ID.jar deploy/htsjdk/$RELEASE_ID/
-
-# Make all files to be pushed to Sourceforge writable by group so that another Picard admin can overwrite them.
-
-chmod -R gu+rw javadoc deploy dist
-
-find javadoc deploy dist -type d -exec chmod g+s '{}' ';' 
-
-scp -p -r javadoc $USERNAME,picard at web.sourceforge.net:htdocs
-
-cd deploy
-scp -p -r htsjdk/$RELEASE_ID $USERNAME,picard at web.sourceforge.net:/home/frs/project/p/pi/picard/htsjdk/
diff --git a/setup/install b/setup/install
new file mode 100755
index 0000000..4dcf8cf
--- /dev/null
+++ b/setup/install
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+FILENAME="`basename $0`"
+CURDIR="`dirname $0`"
+
+if [ -z "$CURDIR" ]
+    then
+    echo error: install should be run as ./install
+    exit 1
+fi
+
+if [ "$FILENAME" != install -a ! -s install.perl ]
+    then
+    echo error: install should be run as ./install
+else
+    perl -v > /dev/null 2>&1 || { echo "checking for perl... no"; \
+        echo >&2 "error: perl not found."; exit 1; }
+
+    cd $CURDIR
+    perl -w ./install.perl "$@"
+fi
diff --git a/setup/install.perl b/setup/install.perl
new file mode 100644
index 0000000..fa2bae6
--- /dev/null
+++ b/setup/install.perl
@@ -0,0 +1,1329 @@
+################################################################################
+
+use strict;
+
+require 'install.prl';
+
+use Config;
+use Cwd        "abs_path";
+use File::Copy "copy";
+use File::Copy::Recursive qw(dircopy);
+use File::Path   "make_path";
+use FindBin    qw($Bin);
+use Getopt::Long "GetOptions";
+
+my ($OS, $MAKING, %INSTALLED_LIBS);
+{
+    my $file = 'os.prl';
+    if (-e $file) {
+        require $file;
+        $OS = OS();
+    } else {
+        ++$MAKING;
+    }
+}
+
+my %HAVE = HAVE();
+BINS() if ($HAVE{BINS});
+if ($HAVE{LIBS}) {
+    ++$HAVE{INCLUDES};
+    LIBS();
+}
+if ($HAVE{INCLUDES} || $HAVE{USR_INCLUDES}) {
+    die "no INCLUDES" unless INCLUDES();
+}
+die "no CONFIG_OUT" unless CONFIG_OUT();
+
+my @bits;
+my @options = ( 'debug', 'examplesdir=s', 'force', 'help',
+                'includedir=s', 'no-create', 'prefix=s', 'root=s', );
+push @options, 'oldincludedir=s' if ($HAVE{USR_INCLUDES});
+if ($HAVE{JAR}) {
+    push @options, 'jardir=s';
+    if (-e "$Bin/../jar") {
+        ++$HAVE{LIBS};
+        $_{JARDIR} = expand_path("$Bin/../jar");
+    }
+} elsif ($HAVE{PYTHON} && ! $MAKING) {
+    ++$HAVE{LIBS};
+}
+if (! $MAKING && ($HAVE{JAR} || $HAVE{PYTHON})) {
+    ++$HAVE{TWO_LIBS};
+    push @options, 'ngslibdir=s', 'vdblibdir=s';
+}
+push @options, 'bindir=s'                     if ($HAVE{BINS});
+push @options, 'bits=s' => \@bits, 'libdir=s' if ($HAVE{LIBS});
+
+my %OPT;
+unless (GetOptions(\%OPT, @options)) {
+    print "install: error\n";
+    exit 1;
+}
+ at bits = split(/,/,join(',', at bits));
+foreach (@bits) {
+    unless (/^32$/ || /^64$/) {
+        print "install: error: bad bits option argument value\n";
+        exit 1;
+    }
+}
+if ($#bits > 0) {
+    foreach (qw(bindir libdir ngslibdir vdblibdir)) {
+        if ($OPT{$_}) {
+            print "install: error: cannot supply multiple bits arguments "
+                . "when $_ argument is provided\n";
+            exit 1;
+        }
+    }
+}
+
+$OPT{root} = expand_path($OPT{root}) if ($OPT{root});
+
+prepare();
+
+my $LINUX_ROOT;
+++$LINUX_ROOT if (linux_root());
+my $ROOT = '';
+if ($OPT{root}) {
+    $ROOT = "$OPT{root}/root";
+    ++$LINUX_ROOT;
+    foreach ("$ROOT/usr/include", "$ROOT/etc/profile.d") {
+        unless (-e $_) {
+            print "mkdir -p $_... ";
+            eval { make_path($_) };
+            if ($@) {
+                print "failure: $@\n";
+                exit 1;
+            }
+            print "ok\n";
+        }
+    }
+}
+
+my $oldincludedir = "$ROOT/usr/include";
+
+my $EXAMPLES_DIR = "$Bin/../examples";
+
+ at _ = CONFIGURE();
+
+if ($OPT{help}) {
+    help();
+    exit 0;
+}
+
+foreach (qw(BITS INCDIR
+ INST_INCDIR INST_JARDIR INST_LIBDIR INST_NGSLIBDIR INST_SHAREDIR INST_VDBLIBDIR
+ LIBX LPFX MAJVERS MAJVERS_SHLX OS OTHER_PREFIX
+ PACKAGE_NAME PREFIX SHLX VERSION VERSION_LIBX VERSION_SHLX))
+{
+    unless ($_{$_}) {
+        next if (/^INST_JARDIR$/    && ! $HAVE{JAR});
+        next if (/^INST_NGSLIBDIR$/ && ! $HAVE{TWO_LIBS});
+        next if (/^INST_SHAREDIR$/  && ! $HAVE{EXAMPLES});
+        next if (/^INST_VDBLIBDIR$/ && ! $HAVE{TWO_LIBS});
+        fatal_config("$_ not found");
+    }
+}
+unless ($_{LIBDIR32} || $_{LIBDIR64} || ($HAVE{PYTHON} && $MAKING)) {
+    fatal_config('LIBDIR not found');
+}
+ 
+if ($OPT{prefix}) {
+    $OPT{prefix} = expand_path($OPT{prefix});
+    $_{INST_BINDIR  } = "$OPT{prefix}/bin";
+    $_{INST_LIBDIR  } = "$OPT{prefix}/lib";
+    $_{INST_NGSLIBDIR} = $_{INST_VDBLIBDIR} = $_{INST_LIBDIR};
+    $_{INST_INCDIR  } = "$OPT{prefix}/include";
+    $_{INST_JARDIR  } = "$OPT{prefix}/jar";
+    $_{INST_SHAREDIR} = "$OPT{prefix}/share";
+}
+$_{INST_SHAREDIR} = expand_path($OPT{examplesdir  }) if ($OPT{examplesdir  });
+$_{INST_INCDIR  } = expand_path($OPT{includedir   }) if ($OPT{includedir   });
+$_{INST_JARDIR  } = expand_path($OPT{jardir       }) if ($OPT{jardir       });
+$_{BIN_TARGET   } = expand_path($OPT{bindir       }) if ($OPT{bindir       });
+$oldincludedir    = expand_path($OPT{oldincludedir}) if ($OPT{oldincludedir});
+if ($OPT{libdir}) {
+    $_{INST_NGSLIBDIR} = $_{LIB_TARGET} = expand_path($OPT{libdir}) ;
+    $_{INST_VDBLIBDIR} = $_{LIB_TARGET};
+}
+$_{INST_NGSLIBDIR}= expand_path($OPT{ngslibdir}) if ($OPT{ngslibdir});
+$_{INST_VDBLIBDIR}= expand_path($OPT{vdblibdir}) if ($OPT{vdblibdir});
+
+if ($OPT{'no-create'} && $_{OS} eq 'linux') {
+    if ($LINUX_ROOT) {
+        print "root user\n\n";
+    } else {
+        print "non root user\n\n";
+    }
+}
+
+my $failures = 0;
+my $bFailure = 1;
+
+push @bits, $_{BITS} unless (@bits);
+foreach (@bits) {
+    $_{BITS} = $_;
+
+    print "installing $_{PACKAGE_NAME} ($_{VERSION}) package";
+    print " for $_{OS}-$_{BITS}" if ($HAVE{BINS} || $HAVE{LIBS});
+    print "...\n";
+
+    if ($HAVE{BINS}) {
+        $_{BINDIR} = $_{"BINDIR$_{BITS}"};
+        unless ($_{BINDIR}) {
+            print "install: error: $_{BITS}-bit version is not available\n\n";
+            next;
+        }
+    }
+    if ($HAVE{LIBS} || $HAVE{PYTHON}) {
+# ($_{LIBDIR} for python points where ngs-sdk and ncbi-vdb dynamic libraries
+# can be found to correctly set up LD_LIBRARY_PATH
+        $_{LIBDIR} = $_{"LIBDIR$_{BITS}"};
+        unless ($_{LIBDIR}) {
+            print "install: error: $_{BITS}-bit version is not available\n\n";
+            next;
+        }
+    }
+    if ($HAVE{JAR} && ! $_{JARDIR}) {
+        $_{JARDIR} = $_{"LIBDIR$_{BITS}"};
+        unless ($_{JARDIR}) {
+            if ($_{BITS} == 64) {
+                $_{JARDIR} = $_{LIBDIR32};
+            } else {
+                $_{JARDIR} = $_{LIBDIR64};
+            }
+            unless ($_{JARDIR}) {
+                print "install: error: jar file was not cannot found\n";
+                exit 1;
+            }
+        }
+    }
+    $bFailure = 0;
+
+    if ($OPT{'no-create'}) {
+        print     "includedir : '$_{INST_INCDIR  }'\n" if ($HAVE{INCLUDES  });
+        print     "libdir     : '$_{INST_LIBDIR}$_{BITS}'\n" if ($HAVE{LIBS});
+        print     "jardir     : '$_{INST_JARDIR  }'\n" if ($HAVE{JAR       });
+        print     "examplesdir: '$_{INST_SHAREDIR}'\n" if ($HAVE{EXAMPLES  });;
+        if ($LINUX_ROOT) {
+            print "oldincludedir: '$oldincludedir'\n"  if ($HAVE{USR_INCLUDES});
+        }
+        print "\n";
+        next;
+    }
+
+    $_{BIN_TARGET} = "$_{INST_BINDIR}$_{BITS}" unless ($OPT{bindir});
+    $_{LIB_TARGET} = "$_{INST_LIBDIR}$_{BITS}" unless ($OPT{libdir});
+
+    $File::Copy::Recursive::CPRFComp = 1;
+
+    $failures += copybins    () if ($HAVE{BINS});
+    $failures += copylibs    () if ($HAVE{LIBS});
+    $failures += copyincludes() if ($HAVE{INCLUDES});
+    $failures += copyjars    () if ($HAVE{JAR});
+    $failures += copyconfig  () if ($HAVE{CONFIG});
+
+    if ($HAVE{JAR}) {
+        $File::Copy::Recursive::CPRFComp = 0;
+        $failures += copydocs() ;
+        $File::Copy::Recursive::CPRFComp = 1;
+    }
+
+    $failures += copyexamples() if ($HAVE{EXAMPLES});
+    $failures += finishinstall() unless ($failures);
+
+    unless ($failures) {
+        print "\nsuccessfully installed $_{PACKAGE_NAME} ($_{VERSION}) package";
+    } else {
+        print "\nfailed to install $_{PACKAGE_NAME} ($_{VERSION}) package";
+    }
+    print " for $_{OS}-$_{BITS}" if ($HAVE{BINS} || $HAVE{LIBS});
+    print ".\n\n";
+}
+
+$failures = 1 if (!$failures && $bFailure);
+
+exit $failures;
+
+################################################################################
+
+sub copybins {
+    unless ($_{BIN_TARGET}) {
+        print "error: cannot install executables: no BIN_TARGET\n";
+        return 1;
+    }
+    my $s = $_{BINDIR};
+    my $d = $_{BIN_TARGET};
+    print "installing executables to $d...";
+    unless (-e $s) {
+        print " failure\n";
+        print "install: error: '$s' is not found.\n";
+        return 1;
+    }
+    print "\nchecking $d... ";
+    unless (-e $d) {
+        print "not found\n";
+        print "mkdir -p $d... ";
+        eval { make_path($d) };
+        if ($@) {
+            print "failure\ninstall: error: cannot mkdir $d\n";
+            return 1;
+        } else {
+            print "success\n";
+        }
+    } else {
+        print "exists\n";
+    }
+    print "\t\tcd $d\n" if ($OPT{debug});
+    chdir $d or die "cannot cd $d";
+    my $failures = 0;
+    foreach (BINS()) {
+        print "installing '$_'..." if ($OPT{debug});
+        my $df = "$_$_{VERSION_EXEX}";
+        my $sf = "$s/$df";
+        print "\n\t\t$sf -> $df\n\t" if ($OPT{debug});
+        unless (-e $sf) {
+            print " skipped\n" if ($OPT{debug});
+            next;
+        }
+        if ((! $OPT{force}) && (-e $df) && (-M $df < -M $sf)) {
+            print " found\n" if ($OPT{debug});
+        } else {
+            unless (copy($sf, $df)) {
+                print "failure\n";
+                print "install: error: cannot copy '$sf' '$df'.\n";
+                ++$failures;
+                next;
+            }
+            my $mode = 0755;
+            printf "\tchmod %o $df\n\t", $mode if ($OPT{debug});
+            unless (chmod($mode, $df)) {
+                print " failure\n" if ($OPT{debug});
+                print "install: error: cannot chmod '$df': $!\n";
+                ++$failures;
+                next;
+            }
+            unless (symlinks($_, $df, 'bin')) {
+                print " success\n" if ($OPT{debug});
+            } else {
+                print " failure\n" if ($OPT{debug});
+                ++$failures;
+            }
+        }
+    }
+    return $failures;
+}
+
+sub copyconfig {
+    my $d;
+    if ($LINUX_ROOT) {
+        $d = "$ROOT/etc";
+    }
+    elsif ($HAVE{BINS}) {
+        $d = $_{BIN_TARGET};
+        unless ($d) {
+            print
+               "error: cannot install configuration files: no BIN_TARGET\n";
+            return 1;
+        }
+    } else {
+        $d = $_{LIB_TARGET};
+        unless ($d) {
+            print
+               "error: cannot install configuration files: no LIB_TARGET\n";
+            return 1;
+        }
+    }
+    $d = File::Spec->catdir($d, 'ncbi');
+    my $kfg = File::Spec->catdir($Bin, '..', 'libs/kfg/default.kfg');
+    unless (-e $kfg) {
+        $kfg = File::Spec->catdir($Bin, '..', 'tools/vdb-copy/vdb-copy.kfg');
+    }
+    unless (-e $kfg) {
+        if ($_{BINDIR}) {
+            $kfg = File::Spec->catdir($_{BINDIR}, 'ncbi', 'vdb-copy.kfg');
+        } elsif ($_{LIBDIR}) {
+            $kfg = File::Spec->catdir($_{LIBDIR}, 'ncbi', 'default.kfg');
+            unless (-e $kfg) {
+                print
+                  "error: cannot install configuration files: no default.kfg\n";
+                return 1;
+            }
+        }
+    }
+    print "installing configuration files to $d... ";
+    print "\nchecking $d... ";
+    unless (-e $d) {
+        print "not found\n";
+        print "mkdir -p $d... ";
+        eval { make_path($d) };
+        if ($@) {
+            print "failure\ninstall: error: cannot mkdir $d\n";
+            return 1;
+        } else {
+            print "success\n";
+        }
+    } else {
+        print "exists\n";
+    }
+    my $df = File::Spec->catdir($d, 'ncbi-vdb.kfg');
+    print "\t\t$kfg -> $df\n" if ($OPT{debug});
+    unless (copy($kfg, $df)) {
+        print "install: error: cannot copy '$kfg' '$df'.\n";
+        return 1;
+    } else {
+        print "success\n";
+        return 0;
+    }
+}
+
+sub copylibs {
+    die unless ($HAVE{LIBS});
+
+    my $s = $_{LIBDIR};
+    my $d = $_{LIB_TARGET};
+
+    print "installing libraries to $d... ";
+
+    unless (-e $s) {
+        print "\tfailure\n";
+        print "install: error: '$s' is not found.\n";
+        return 1;
+    }
+
+    if ($HAVE{TWO_LIBS}) {
+        my $ngs = $_{INST_NGSLIBDIR};
+        if ($ngs && ! ($OPT{prefix} && $OPT{libdir} && $OPT{ngslibdir})) {
+            $ngs .= $_{BITS};
+        }
+        my $vdb = $_{INST_VDBLIBDIR};
+        if ($vdb && ! ($OPT{prefix} && $OPT{libdir} && $OPT{vdblibdir})) {
+            $vdb .= $_{BITS};
+        }
+        if ($ngs || $vdb) {
+            unless ($ngs && $vdb) {
+                $ngs = $d unless ($ngs);
+                $vdb = $d unless ($vdb);
+            }
+            $INSTALLED_LIBS{'ngs-sdk' } = $ngs;
+            $INSTALLED_LIBS{'ncbi-vdb'} = $vdb;
+        }
+    }
+    $INSTALLED_LIBS{0} = $d unless (%INSTALLED_LIBS);
+
+    foreach (keys %INSTALLED_LIBS) {
+        my $d = $INSTALLED_LIBS{$_};
+        print "\nchecking $d... ";
+        unless (-e $d) {
+            print "not found\n";
+            print "mkdir -p $d... ";
+            eval { make_path($d) };
+            if ($@) {
+                print "failure\ninstall: error: cannot mkdir $d\n";
+                return 1;
+            } else {
+                print "success\n";
+            }
+        } else {
+            print "exists\n";
+        }
+    }
+
+    return $MAKING ? copybldlibs($s, $d) : copydir($s, %INSTALLED_LIBS);
+}
+
+sub copybldlibs {
+    my ($s, $d) = @_;
+
+    print "\t\tcd $d\n" if ($OPT{debug});
+    chdir $d or die "cannot cd $d";
+
+    my $failures = 0;
+
+    my %LIBRARIES_TO_INSTALL = LIBS();
+    foreach (keys %LIBRARIES_TO_INSTALL) {
+        print "installing '$_'... ";
+
+        my $nb = "$_{LPFX}$_";
+        my $nv = "$nb.";
+        my $lib = 'dll';
+        if ($LIBRARIES_TO_INSTALL{$_} eq 'SHL') {
+            $nv .= $_{VERSION_SHLX};
+        } elsif ($LIBRARIES_TO_INSTALL{$_} eq 'LIB') {
+            $nv .= $_{VERSION_LIBX};
+            $lib = 'lib';
+        } else {
+            die "bad library type";
+        }
+
+        my $sf = "$s/$nv";
+        my $df = "$d/$nv";
+
+        print "\n\t\t$sf -> $df\n\t" if ($OPT{debug});
+
+        unless (-e $sf) {
+            print "failure\n";
+            print "install: error: '$sf' is not found.\n";
+            ++$failures;
+            next;
+        }
+
+        if ((! $OPT{force}) && (-e $df) && (-M $df < -M $sf)) {
+            print "found\n";
+        } else {
+            unless (copy($sf, $df)) {
+                print "failure\n";
+                print "install: error: cannot copy '$sf' '$df'.\n";
+                ++$failures;
+                next;
+            }
+            my $mode = 0644;
+            $mode = 0755 if ($lib eq 'dll');
+            printf "\tchmod %o $df\n\t", $mode if ($OPT{debug});
+            unless (chmod($mode, $df)) {
+                print "failure\n";
+                print "install: error: cannot chmod '$df': $!\n";
+                ++$failures;
+                next;
+            }
+            unless (symlinks($nb, $nv, $lib)) {
+                print "success\n";
+            } else {
+                print "failure\n";
+                ++$failures;
+            }
+        }
+    }
+
+    return $failures;
+}
+
+sub symlinks {
+    my ($nb, $nv, $type) = @_;
+
+    my @l;
+    if ($type eq 'lib') {
+        push @l, "$nb-static.$_{LIBX}";
+        push @l, "$nb.$_{LIBX}";
+        push @l, "$nb.$_{MAJVERS_LIBX}";
+    } elsif ($type eq 'dll') {
+        push @l, "$nb.$_{SHLX}";
+        push @l, "$nb.$_{MAJVERS_SHLX}";
+    } elsif ($type eq 'bin' || $type eq 'jar') {
+        push @l, $nb;
+        push @l, "$nb.$_{MAJVERS}";
+    } else {
+        print "failure\n";
+        print "install: error: unknown symlink type '$type'\n";
+        return 1;
+    }
+
+    my $failures = 0;
+
+    for (my $i = 0; $i <= $#l; ++$i) {
+        my $file = $l[$i];
+        if (-e $file) {
+            print "\trm $file\n\t" if ($OPT{debug});
+            unless (unlink $file) {
+                print "failure\n";
+                print "install: error: cannot rm '$file': $!\n";
+                ++$failures;
+                next;
+            }
+        }
+
+        my $o = $nv;
+        $o = $l[$i + 1] if ($i < $#l);
+
+        print "\tln -s $o $file\n\t" if ($OPT{debug});
+        unless (symlink $o, $file) {
+            print "failure\n";
+            print "install: error: cannot symlink '$o' '$file': $!\n";
+            ++$failures;
+            next;
+        }
+    }
+
+    return $failures;
+}
+
+sub copydir {
+    my ($s, %d) = @_;
+
+    my $failures = 0;
+
+    foreach my $pattern(keys %d) {
+        my $d = $d{$pattern};
+        print "\t\tcd $d\n" if ($OPT{debug});
+        chdir $d or die "cannot cd $d";
+
+        opendir(D, $s) or die "cannot opendir $s: $!";
+
+        while (readdir D) {
+            next if (/^\.{1,2}$/);
+            next if ($pattern && ! /$pattern/);
+
+            my $n = "$s/$_";
+
+            if (-l $n) {
+                print "\t\t$_ (symlink)... " if ($OPT{debug});
+                my $l = readlink $n;
+                if ((-e $_) && (!unlink $_)) {
+                    print "error: cannot remove $l: $!\n";
+                    ++$failures;
+                    next;
+                }
+                unless (symlink($l, $_)) {
+                    print "error: cannot create symlink from $_ to $l: $!\n";
+                    ++$failures;
+                    next;
+                }
+                print "success\n" if ($OPT{debug});
+            } else {
+                print "\t\t$_... " if ($OPT{debug});
+                if ((-e $_) && (!unlink $_)) {
+                    print "error: cannot remove $_: $!\n";
+                    ++$failures;
+                    next;
+                }
+                unless (copy($n, $_)) {
+                    print "error: cannot copy '$n' to '$_': $!\n";
+                    ++$failures;
+                    next;
+                }
+                print "success\n" if ($OPT{debug});
+            }
+        }
+
+        closedir D;
+    }
+
+    return $failures;
+}
+
+sub includes_out {
+    my $out = '';
+    eval { $out = INCLUDES_OUT(); };
+    $out = File::Spec->catdir($_{INST_INCDIR}, $out);
+    $out;
+}
+
+sub copyincludes {
+    print "installing includes to $_{INST_INCDIR}... ";
+
+    my $s = "$_{INCDIR}/" . INCLUDES();
+    unless (-e $s) {
+        print "\tfailure\n";
+        print "install: error: '$s' is not found.\n";
+        return 1;
+    }
+
+    my $out = includes_out();
+    my $d = $out;
+    $d = $_{INST_INCDIR} unless ($d);
+
+    unless (-e $d) {
+        print "\n\t\tmkdir -p $d" if ($OPT{debug});
+        eval { make_path($d) };
+        if ($@) {
+            print "\tfailure\ninstall: error: cannot mkdir $d\n";
+            return 1;
+        }
+    }
+
+    if ($out && -f $s) {
+        print "\n\t\tcp $s $d\n\t" if ($OPT{debug});
+        unless (copy($s, $d)) {
+            print "failure\n";
+            return 1;
+        }
+    } else {
+        print "\n\t\tcp -r $s $d\n\t" if ($OPT{debug});
+        unless (dircopy($s, $d)) {
+            print "\tfailure\ninstall: error: cannot copy '$s' 'd'";
+            return 1;
+        }
+    }
+
+    print "success\n";
+    return 0;
+}
+
+sub copyjars {
+    my $s = $_{JARDIR};
+    my $d = $_{INST_JARDIR};
+
+    print "installing jar files to $d... ";
+
+    unless (-e $s) {
+        print "\tfailure\n";
+        print "install: error: '$s' is not found.\n";
+        return 1;
+    }
+
+    print "\nchecking $d... ";
+    unless (-e $d) {
+        print "not found\n";
+        print "mkdir -p $d... ";
+        eval { make_path($d) };
+        if ($@) {
+            print "failure\ninstall: error: cannot mkdir $d\n";
+            return 1;
+        } else {
+            print "success\n";
+        }
+    } else {
+        print "exists\n";
+    }
+
+    return $MAKING ? copybldjars($s, $d) : copydir($s, 0 => $d);
+}
+
+sub copybldjars {
+    my ($s, $d) = @_;
+    my $n = 'ngs-java.jar';
+    $s .= "/$n";
+
+    unless (-e $s) {
+        print "\tfailure\n";
+        print "install: error: '$s' is not found.\n";
+        return 1;
+    }
+
+    my $nd = "$n.$_{VERSION}";
+    print "installing '$n'... ";
+
+    print "\t\tcd $d\n" if ($OPT{debug});
+    chdir $d or die "cannot cd $d";
+
+    $d .= "/$nd";
+
+    print "\n\t\t$s -> $d\n\t" if ($OPT{debug});
+
+    if ((! $OPT{force}) && (-e $d) && (-M $d < -M $s)) {
+        print "found\n";
+    } else {
+        unless (copy($s, $d)) {
+            print "failure\n";
+            print "install: error: cannot copy '$s' '$d'.\n";
+            return 1;
+        }
+        my $mode = 0644;
+        printf "\tchmod %o $d\n\t", $mode if ($OPT{debug});
+        unless (chmod($mode, $d)) {
+            print "failure\n";
+            print "install: error: cannot chmod '$d': $!\n";
+            return 1;
+        }
+        unless (symlinks($n, $nd, 'jar')) {
+            print "success\n";
+        } else {
+            print "failure\n";
+            return 1;
+        }
+    }
+
+    return 0;
+}
+
+sub copydocs {
+    my $s = "$_{JARDIR}/javadoc";
+    $s = expand_path("$Bin/../doc") unless ($MAKING);
+    my $d = "$_{INST_SHAREDIR}/doc";
+
+    print "installing html documents to $d... ";
+
+    unless (-e $s) {
+        print "\tfailure\n";
+        print "install: error: '$s' is not found.\n";
+        return 1;
+    }
+
+    print "\nchecking $d... ";
+    unless (-e $d) {
+        print "not found\n";
+        print "mkdir -p $d... ";
+        eval { make_path($d) };
+        if ($@) {
+            print "failure\ninstall: error: cannot mkdir $d\n";
+            return 1;
+        } else {
+            print "success\n";
+        }
+    } else {
+        print "exists\n";
+    }
+
+    print "\t\t$s -> $d\n\t" if ($OPT{debug});
+    unless (dircopy($s, $d)) {
+        print "\tfailure\ninstall: error: cannot copy '$s' to '$d'";
+        return 1;
+    }
+
+    print "success\n";
+    return 0;
+}
+
+sub copyexamples {
+    my $failures = 0;
+    my $CPRFComp = $File::Copy::Recursive::CPRFComp;
+    my $sd = $EXAMPLES_DIR;
+    return 0 unless (-e $sd);
+
+    my $d = $_{INST_SHAREDIR};
+    unless ($d) {
+        print "install: error: cannot install examples\n";
+        return 0;
+    }
+
+    if ($HAVE{JAR}) {
+        $d .= '/examples-java';
+    } elsif ($HAVE{PYTHON}) {
+        $File::Copy::Recursive::CPRFComp = 0;
+        $d .= '/examples-python';
+    }
+
+    print "installing examples to $d... ";
+
+    my $s = $sd;
+    $s = "$sd/examples" if ($HAVE{JAR} && $MAKING);
+
+    unless (-e $s) {
+        print "\tfailure\n";
+        print "install: error: '$s' is not found.\n";
+        ++$failures;
+    }
+
+    unless ($failures) {
+        print "\nchecking $d... ";
+        unless (-e $d) {
+            print "not found\n";
+            print "mkdir -p $d... ";
+            eval { make_path($d) };
+            if ($@) {
+                print "failure\ninstall: error: cannot mkdir $d\n";
+                ++$failures;
+            } else {
+                print "success\n";
+            }
+        } else {
+            print "exists\n";
+        }
+    }
+
+    unless ($failures) {
+        print "\t\t$s -> $d\n\t" if ($OPT{debug});
+        if ($HAVE{JAR} && ! $MAKING) {
+            if (copydir($s, 0 => $d)) {
+                ++$failures;
+            }
+        } else {
+            unless (dircopy($s, $d)) {
+                print "\tfailure\ninstall: error: cannot copy '$s' to '$d'";
+                ++$failures;
+            }
+        }
+    }
+
+    unless ($failures) {
+        if ($HAVE{JAR} && $MAKING) {
+            $sd = "$sd/Makefile";
+            $d = "$d/Makefile";
+            print "\t$sd -> $d\n\t" if ($OPT{debug});
+            unless (-e $sd) {
+                print "\tfailure\n";
+                print "install: error: '$sd' is not found.\n";
+                ++$failures;
+            }
+            unless ($failures) {
+                if (-e $d) {
+                unless (unlink $d) {
+                    print "failure\n";
+                    print "install: error: cannot rm '$d': $!\n";
+                    ++$failures;
+                }
+            }
+            unless ($failures) {
+                unless (copy($sd, $d)) {
+                    print "error: cannot copy '$sd' to '$d': $!\n";
+                    ++$failures;
+                }
+            }
+        }
+      }
+    }
+
+    print "success\n" unless ($failures);
+
+    $File::Copy::Recursive::CPRFComp = $CPRFComp;
+
+    return $failures;
+}
+
+sub finishinstall {
+    my $failures = 0;
+
+    $_{JAR_TARGET} = "$_{INST_JARDIR}/ngs-java.jar";
+
+    my @libs;
+    if (%INSTALLED_LIBS) {
+        my %libs;
+        ++$libs{$INSTALLED_LIBS{$_}} foreach (keys %INSTALLED_LIBS);
+        push @libs, $_ foreach (keys %libs);
+    } else {
+        push @libs, $_{LIB_TARGET};
+    }
+    my $libs;
+    foreach (@libs) {
+        $libs .= ":" if ($libs);
+        $libs .= $_;
+    }
+
+    if ($HAVE{PYTHON}) {
+        chdir "$Bin/.." or die "cannot cd '$Bin/..'";
+        my $cmd = "python setup.py install";
+        $cmd .= ' --user' unless (linux_root());
+        print `$cmd`;
+        if ($?) {
+            ++$failures;
+        } else {
+            unless ($libs) {
+                print "internal python failure\n";
+                ++$failures;
+            } elsif ($HAVE{LIBS}) {
+                print <<EndText;
+Please add $libs to your LD_LIBRARY_PATH, e.g.:
+      export LD_LIBRARY_PATH=$libs:\$LD_LIBRARY_PATH
+EndText
+            }
+        }
+    } elsif ($LINUX_ROOT) {
+        print "\t\tlinux root\n" if ($OPT{debug});
+
+        if ($HAVE{USR_INCLUDES}) {
+            unless (-e $oldincludedir) {
+                print "install: error: '$oldincludedir' does not exist\n";
+                ++$failures;
+            } else {
+                my $o = includes_out();
+                if ($o) {
+                    eval { INCLUDES_OUT(); };
+                    if ($@) {
+                        print "install: cannot find INCLUDES_OUT\n";
+                        ++$failures;
+                    } else {
+                        my $INCLUDE_SYMLINK
+                            = "$oldincludedir/" . INCLUDES_OUT();
+                        print "updating $INCLUDE_SYMLINK... ";
+                        unlink $INCLUDE_SYMLINK;
+                        if ($OPT{debug}) {
+                            print "\n\t\tln -s $o $INCLUDE_SYMLINK... ";
+                        }
+                        unless (symlink $o, $INCLUDE_SYMLINK) {
+                            print "failure\n";
+                            print "install: error: " .
+                                "cannot symlink '$o' '$INCLUDE_SYMLINK': $!\n";
+                            ++$failures;
+                        } else {
+                            print "success\n";
+                        }
+                    }
+                } else {
+                    my $INCLUDE_SYMLINK = "$oldincludedir/" . INCLUDES();
+                    print "updating $INCLUDE_SYMLINK... ";
+                    unlink $INCLUDE_SYMLINK;
+                    my $o = "$_{INST_INCDIR}/" . INCLUDES();
+                    unless (symlink $o, $INCLUDE_SYMLINK) {
+                        print "failure\n";
+                        print "install: error: "
+                            . "cannot symlink '$o' '$INCLUDE_SYMLINK': $!\n";
+                        ++$failures;
+                    } else {
+                        print "success\n";
+                    }
+                }
+            }
+        }
+
+        my $NAME = PACKAGE_NAME();
+        if ($HAVE{BINS} || $HAVE{JAR}
+            || ($HAVE{LIBS}
+                && ($HAVE{DLLS} || $NAME eq 'NGS-SDK' || $NAME eq 'NGS-BAM')
+               )
+            )
+        {
+            my $profile = "$ROOT/etc/profile.d";
+            my $PROFILE_FILE = "$profile/" . lc(PACKAGE_NAME());
+            unless (-e $profile) {
+                print "install: error: '$profile' does not exist\n";
+                ++$failures;
+            } else {
+                print "updating $PROFILE_FILE.[c]sh... ";
+
+                my $f = "$PROFILE_FILE.sh";
+                if (!open F, ">$f") {
+                    print "failure\n";
+                    print "install: error: cannot open '$f': $!\n";
+                    ++$failures;
+                } else {
+                    print F "#version $_{VERSION}\n\n";
+
+                    if ($HAVE{LIBS}) {
+                        unless (@libs) {
+                            print "internal root libraries failure\n";
+                            ++$failures;
+                        } else {
+                            if ($HAVE{DLLS}) {
+                                foreach (@libs) {
+                                    print F <<EndText;
+if ! echo \$LD_LIBRARY_PATH | /bin/grep -q $_
+then export LD_LIBRARY_PATH=$_:\$LD_LIBRARY_PATH
+fi
+
+EndText
+                                }
+                            }
+                            if ($NAME eq 'NGS-SDK') {
+                                print F "export NGS_LIBDIR=$_{LIB_TARGET}\n";
+                            } elsif ($NAME eq 'NGS-BAM') {
+                                print F
+                                      "\nexport NGS_BAM_LIBDIR=$_{LIB_TARGET}\n"
+                            }
+                        }
+                    }
+                    if ($HAVE{JAR}) {
+                        print F <<EndText;
+if ! echo \$CLASSPATH | /bin/grep -q $_{JAR_TARGET}
+then export CLASSPATH=$_{JAR_TARGET}:\$CLASSPATH
+fi
+EndText
+                    }
+                    if ($HAVE{BINS}) {
+                        print F <<EndText;
+if ! echo \$PATH | /bin/grep -q $_{INST_BINDIR}
+then export PATH=$_{INST_BINDIR}:\$PATH
+fi
+EndText
+                    }
+                    close F;
+                    unless (chmod(0644, $f)) {
+                        print "failure\n";
+                        print "install: error: cannot chmod '$f': $!\n";
+                        ++$failures;
+                    }
+                }
+            }
+
+            my $f = "$PROFILE_FILE.csh";
+            if (!open F, ">$f") {
+                print "failure\n";
+                print "install: error: cannot open '$f': $!\n";
+                ++$failures;
+            } else {
+                print F "#version $_{VERSION}\n\n";
+
+                if ($HAVE{LIBS}) {
+                    unless (@libs) {
+                        print "internal libraries failure\n";
+                        ++$failures;
+                    } else {
+                        if ($HAVE{DLLS}) {
+                            foreach (@libs) {
+                                print F <<EndText;
+echo \$LD_LIBRARY_PATH | /bin/grep -q $_
+if ( \$status ) setenv LD_LIBRARY_PATH $_:\$LD_LIBRARY_PATH
+
+EndText
+                            }
+                        }
+                    }
+                    if (PACKAGE_NAME() eq 'NGS-BAM') {
+                        print F "setenv NGS_BAM_LIBDIR $_{LIB_TARGET}\n";
+                    } elsif (PACKAGE_NAME() eq 'NGS-SDK') {
+                        print F "setenv NGS_LIBDIR $_{LIB_TARGET}\n";
+                    } elsif (PACKAGE_NAME() eq 'NCBI-VDB') {
+                        print F "setenv NCBI_VDB_LIBDIR $_{LIB_TARGET}\n";
+                    }
+                }
+                if ($HAVE{JAR}) {
+                    print F <<EndText;
+echo \$CLASSPATH | /bin/grep -q $_{JAR_TARGET}
+if ( \$status ) setenv CLASSPATH $_{JAR_TARGET}:\$CLASSPATH
+EndText
+                }
+                if ($HAVE{BINS}) {
+                    print F <<EndText;
+echo \$PATH | /bin/grep -q $_{INST_BINDIR}
+if ( \$status ) setenv PATH $_{INST_BINDIR}:\$PATH
+EndText
+                }
+                close F;
+                unless (chmod(0644, $f)) {
+                    print "failure\n";
+                    print "install: error: cannot chmod '$f': $!\n";
+                    ++$failures;
+                }
+            }
+#	@ #TODO: check version of the files above
+            print "success\n" unless ($failures);
+        }
+
+        unless ($failures) {
+            if ($HAVE{LIBS}) {
+                if (PACKAGE_NAME() eq 'NGS-BAM') {
+                    print "\n";
+                    print "Use \$NGS_BAM_LIBDIR in your link commands, e.g.:\n";
+                    print "      ld -L\$NGS_BAM_LIBDIR -lngs-bam ...\n";
+                } elsif (PACKAGE_NAME() eq 'NGS-SDK') {
+                    print "\nUse \$NGS_LIBDIR in your link commands, e.g.:\n";
+                    print "      ld -L\$NGS_LIBDIR -lngs-sdk ...\n";
+                } elsif (PACKAGE_NAME() eq 'NCBI-VDB') {
+                    print "\n"
+                       . "Use \$NCBI_VDB_LIBDIR in your link commands, e.g.:\n";
+                    print "      ld -L\$NCBI_VDB_LIBDIR -lncbi-vdb ...\n";
+                }
+            }
+        }
+    } else {
+        print "\t\tnot linux root\n" if ($OPT{debug});
+        if ($HAVE{LIBS}) {
+            unless ($libs) {
+                print "internal libraries failure\n";
+                ++$failures;
+            } else {
+                print "\n";
+                print <<EndText if ($HAVE{DLLS});
+Please add $libs to your LD_LIBRARY_PATH, e.g.:
+      export LD_LIBRARY_PATH=$libs:\$LD_LIBRARY_PATH
+EndText
+                if (PACKAGE_NAME() eq 'NGS-SDK') {
+                    print "Use $libs in your link commands, e.g.:\n"
+                        . "export NGS_LIBDIR=$libs\n"
+                        . "ld -L\$NGS_LIBDIR -lngs-sdk ...\n";
+                } elsif (PACKAGE_NAME() eq 'NGS-BAM') {
+                    print "Use $libs in your link commands, e.g.:\n"
+                        . "export NGS_BAM_LIBDIR=$libs\n"
+                        . "ld -L\$NGS_BAM_LIBDIR -lngs-bam ...\n";
+                }
+            }
+        }
+        if ($HAVE{JAR}) {
+            print <<EndText;
+
+Please add $_{JAR_TARGET} to your CLASSPATH, i.e.:
+      export CLASSPATH=$_{JAR_TARGET}:\$CLASSPATH
+EndText
+        }
+    }
+
+    return $failures;
+}
+
+sub expand_path {
+    my ($filename) = @_;
+    return unless ($filename);
+
+    if ($filename =~ /^~/) {
+        if ($filename =~ m|^~([^/]*)|) {
+            if ($1 && ! getpwnam($1)) {
+                print "install: error: bad path: '$filename'\n";
+                exit 1;
+            }
+        }
+
+        $filename =~ s{ ^ ~ ( [^/]* ) }
+                      { $1
+                            ? (getpwnam($1))[7]
+                            : ( $ENV{HOME} || $ENV{USERPROFILE} || $ENV{LOGDIR}
+                                || (getpwuid($<))[7]
+                              )
+                      }ex;
+    }
+
+    my $a = abs_path($filename);
+    $filename = $a if ($a);
+
+    $filename;
+}
+
+sub help {
+    $_{LIB_TARGET} = "$_{INST_LIBDIR}$_{BITS}";
+
+    print <<EndText;
+'install' installs $_{PACKAGE_NAME} $_{VERSION} package.
+
+Usage: ./install [OPTION]...
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+  -n, --no-create         do not run installation
+
+EndText
+
+    if ($HAVE{TWO_LIBS}) {
+        my $p = lc(PACKAGE_NAME());
+        print "By default, `./install' will install all the files in\n";
+        print "`/usr/local/ngs/$p/jar', " if ($HAVE{JAR});
+        print <<EndText;
+`/usr/local/ngs/$p/share',
+`/usr/local/ngs/ngs-sdk/lib$_{BITS}', `/usr/local/ncbi/ncbi-vdb/lib$_{BITS}'.
+You can spefify other installation directories using the options below.
+
+Fine tuning of the installation directories:
+EndText
+        if ($HAVE{JAR}) {
+            print
+                "  --jardir=DIR         jar files [/usr/local/ngs/$p/jar]\n"
+        }
+        print <<EndText;
+  --ngslibdir=DIR      ngs-sdk libraries [/usr/local/ngs/ngs-sdk/lib$_{BITS}]
+  --vdblibdir=DIR      ncbi-vdb libraries [/usr/local/ncbi/ncbi-vdb/lib$_{BITS}]
+  --examplesdir=DIR    example files [/usr/local/ngs/$p/share]
+
+  --libdir=DIR         install all libraries in the same directory
+  --prefix=DIR         install files in PREFIX/lib$_{BITS}, PREFIX/share etc.
+EndText
+    } else {
+        print <<EndText;
+Installation directories:
+  --prefix=PREFIX         install all files in PREFIX
+                          [$_{PREFIX}]
+
+By default, `./install' will install all the files in
+EndText
+
+        if ($HAVE{INCLUDES}) {
+            print
+"`$_{PREFIX}/include', `$_{PREFIX}/lib$_{BITS}' etc.  You can specify\n"
+        } elsif ($HAVE{JAR}) {
+            print "`$_{PREFIX}/jar', `$_{PREFIX}/share' etc.  You can specify\n"
+        } elsif ($MAKING) {
+            print "`$_{PREFIX}/share' etc.  You can specify\n"
+        } else {
+            print
+"`$_{PREFIX}/lib$_{BITS}' `$_{PREFIX}/share' etc.  You can specify\n"
+        }
+
+        print <<EndText;
+an installation prefix other than `$_{PREFIX}' using `--prefix',
+for instance `--prefix=$_{OTHER_PREFIX}'.
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+EndText
+
+        if ($HAVE{BINS}) {
+            print "  --bindir=DIR            executables [PREFIX/bin]\n";
+        }
+        if ($HAVE{JAR}) {
+            print "  --jardir=DIR            jar files [PREFIX/jar]\n";
+        }
+        if ($HAVE{LIBS}) {
+            print
+"  --libdir=DIR            object code libraries [PREFIX/lib$_{BITS}]\n"
+        }
+        if ($HAVE{INCLUDES}) {
+            print "  --includedir=DIR        C header files [PREFIX/include]\n";
+        }
+        if ($HAVE{USR_INCLUDES}) {
+            print
+"  --oldincludedir=DIR     C header files for non-gcc [$oldincludedir]\n"
+        }
+
+        if (-e $EXAMPLES_DIR) {
+            print "  --examplesdir=DIR       example files [PREFIX/share]\n";
+        }
+    }
+
+    if ($HAVE{LIBS}) {
+        print <<EndText;
+
+System types:
+  --bits=[32|64]          use a 32- or 64-bit data model
+EndText
+    }
+
+    print "\nReport bugs to sra-tools\@ncbi.nlm.nih.gov\n";
+}
+
+sub prepare {
+    if ($MAKING) {
+        my $os_arch = `perl -w $Bin/os-arch.perl`;
+        unless ($os_arch) {
+            print "install: error\n";
+            exit 1;
+        }
+        chomp $os_arch;
+        my $config =
+            "$Bin/../" . CONFIG_OUT() . "/Makefile.config.install.$os_arch.prl";
+        fatal_config("$config not found") unless (-e "$config");
+
+        eval { require $config; };
+        fatal_config($@) if ($@);
+    } else {
+        my $a = $Config{archname64};
+        $_ = lc PACKAGE_NAME();
+        my $root = '';
+        $root = $OPT{root} if ($OPT{root});
+        my $code = 
+            'sub CONFIGURE { ' .
+            '   $_{OS           } = $OS; ' .
+            '   $_{VERSION      } = "1.0.0"; ' .
+            '   $_{MAJVERS      } = "1"; ' .
+            '   $_{LPFX         } = "lib"; ' .
+            '   $_{LIBX         } = "a"; ' .
+            '   $_{MAJVERS_LIBX } = "a.1"; ' .
+            '   $_{VERSION_LIBX } = "a.1.0.0"; ' .
+            '   $_{SHLX         } = "so"; ' .
+            '   $_{OTHER_PREFIX } = \'$HOME/ngs/' . $_ . '\'; ' .
+            '   $_{PREFIX       } = "' . "$root/usr/local/ngs/$_" . '"; ' .
+            '   $_{INST_INCDIR  } = "$_{PREFIX}/include"; ' .
+            '   $_{INST_LIBDIR  } = "$_{PREFIX}/lib"; ' .
+            '   $_{INST_JARDIR  } = "$_{PREFIX}/jar"; ' .
+            '   $_{INST_SHAREDIR} = "$_{PREFIX}/share"; ' .
+            '   $_{INCDIR       } = "$Bin/../include"; ' .
+            '   $_{LIBDIR64     } = "$Bin/../lib64"; ' .
+            '   $_{LIBDIR32     } = "$Bin/../lib32"; ';
+        if ($HAVE{TWO_LIBS}) {
+            $code .=
+               '$_{INST_NGSLIBDIR} = "' . "$root/usr/local/ngs/ngs-sdk/lib\";"
+             . '$_{INST_VDBLIBDIR} = "' . "$root/usr/local/ncbi/ncbi-vdb/lib\";"
+        }
+        $code .= ' $_{PACKAGE_NAME} = "' . PACKAGE_NAME() . '"; ';
+
+        if (defined $Config{archname64}) {
+            $code .= ' $_{BITS} = 64; ';
+        } else {
+            $code .= ' $_{BITS} = 32; ';
+        }
+
+        $code .= 
+            '   $_{MAJVERS_SHLX } = "so.1"; ' .
+            '   $_{VERSION_SHLX } = "so.1.0.0"; ' ;
+
+        $code .= 
+            '   @_ ' .
+            '}';
+
+        eval $code;
+
+        die $@ if ($@);
+    }
+}
+
+sub linux_root { $^O eq 'linux' && `id -u` == 0 }
+
+sub fatal_config {
+    if ($OPT{debug}) {
+        print "\t\t";
+        print "@_";
+        print "\n";
+    }
+
+    print "install: error: run ./configure [OPTIONS] first.\n";
+
+    exit 1;
+}
+
+################################################################################
diff --git a/setup/install.prl b/setup/install.prl
new file mode 100644
index 0000000..941305f
--- /dev/null
+++ b/setup/install.prl
@@ -0,0 +1,9 @@
+sub PACKAGE_NAME { 'NCBI-VDB' }
+sub HAVE        { ( CONFIG => 1, DLLS => 1, LIBS => 1, USR_INCLUDES => 1, ) }
+sub CONFIG_OUT  {  'build' }
+sub INCLUDES    {  'interfaces/ngs/ncbi/NGS.hpp' }
+sub INCLUDES_OUT{  'ncbi-vdb' }
+sub LIBS
+    { ( 'ncbi-ngs-c++' => 'LIB', 'ncbi-vdb'  => 'LIB', 'ncbi-vdb'  => 'SHL',
+                                 'ncbi-wvdb' => 'LIB', 'ncbi-wvdb' => 'SHL', ) }
+1
diff --git a/setup/konfigure.perl b/setup/konfigure.perl
new file mode 100644
index 0000000..5568cdd
--- /dev/null
+++ b/setup/konfigure.perl
@@ -0,0 +1,1762 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+use strict;
+
+sub println  { print @_; print "\n" }
+
+my ($filename, $directories, $suffix) = fileparse($0);
+if ($directories ne "./") {
+    println "configure: error: $filename should be run as ./$filename";
+    exit 1;
+}
+
+require 'package.prl';
+require 'os-arch.prl';
+
+use Cwd qw(abs_path getcwd);
+use File::Basename 'fileparse';
+use File::Spec 'catdir';
+use FindBin qw($Bin);
+use Getopt::Long "GetOptions";
+
+chdir '..' or die "cannot cd to package root";
+
+check();
+
+my $LOCAL_BUILD_OUT
+    = -e File::Spec->catdir($ENV{HOME}, 'tmp', 'local-build-out');
+
+my ($CONFIGURED, $RECONFIGURE) = ('');
+if (@ARGV) {
+    foreach (@ARGV) {
+        $CONFIGURED .= "\t" if ($CONFIGURED);
+        $CONFIGURED .= "'$_'";
+    }
+} elsif (-f 'reconfigure') {
+    ++$RECONFIGURE unless ($LOCAL_BUILD_OUT);
+}
+
+my %PKG = PKG();
+
+my $PACKAGE_NAME = PACKAGE_NAME();
+my $OUT_MAKEFILE = 'Makefile.config';
+my $INS_MAKEFILE = 'Makefile.config.install';
+
+my $PACKAGE = PACKAGE();
+
+my $HOME = $ENV{HOME} || $ENV{USERPROFILE}
+    || $ENV{LOGDIR} || getcwd || (getpwuid($<))[7] || abs_path('.');
+
+$PKG{UPATH} = expand($PKG{UPATH});
+
+my $package_default_prefix = $PKG{PATH};
+my $schema_default_dir = $PKG{SCHEMA_PATH} if ($PKG{SCHEMA_PATH});
+
+my @REQ = REQ();
+
+my @options = ( 'build-prefix=s',
+                'clean',
+                'debug',
+                'help',
+                'prefix=s',
+                'reconfigure',
+                'status',
+                'with-debug',
+                'without-debug', );
+{
+    my ($OS, $ARCH, $OSTYPE, $MARCH, @ARCHITECTURES) = OsArch();
+    push @options, 'arch=s'    if (@ARCHITECTURES);
+}
+push @options, 'source=s' if ($PKG{LNG} eq 'JAVA');
+push @options, 'enable-static' if (PACKAGE_TYPE() eq 'B');
+foreach my $href (@REQ) {
+    my %a = %$href;
+    push @options, "$a{option}=s"  if ($a {option});
+    push @options, "$a{boption}=s" if ($a{boption});
+    $href->{usrpath} = '' unless ($href->{usrpath});
+    $href->{usrpath} = expand($href->{usrpath});
+}
+push @options, "shemadir" if ($PKG{SCHEMA_PATH});
+
+my %OPT;
+die "configure: error" unless (GetOptions(\%OPT, @options));
+++$OPT{'reconfigure'} if ($RECONFIGURE);
+
+if ($OPT{'reconfigure'}) {
+    unless (eval 'use Getopt::Long qw(GetOptionsFromString); 1') {
+        print <<EndText;
+configure: error: your perl does not support Getopt::Long::GetOptionsFromString
+                  reconfigure option is not avaliable.
+Run "sh ./reconfigure" instead.
+EndText
+        exit 1;
+    }
+    println "reconfiguring...";
+    open F, 'reconfigure' or die 'cannot open reconfigure';
+    $_ = <F>;
+    chomp;
+    unless (m|^\./configure\s*(.*)$|) {
+        println 'configure: error: cannot reconfigure';
+        println 'run "./configure --clean" then run "./configure [OPTIONS]"';
+        exit 1;
+    }
+
+    my $ARG = $1;
+    println "running \"./configure $ARG\"...";
+    undef %OPT;
+    die "configure: error" unless (GetOptionsFromString($ARG, \%OPT, @options));
+    $CONFIGURED = $ARG if ($#ARGV == -1 && $RECONFIGURE);
+    ++$OPT{reconfigure};
+}
+
+$OPT{'local-build-out'} = $LOCAL_BUILD_OUT;
+my $OUTDIR = File::Spec->catdir($HOME, $PKG{OUT});
+if ($OPT{'local-build-out'}) {
+    my $o = expand_path(File::Spec->catdir($Bin, $PKG{LOCOUT}));
+    $OUTDIR = $o if ($o);
+}
+
+if ($OPT{'help'}) {
+    help();
+    exit 0;
+} elsif ($OPT{'clean'}) {
+    {
+        foreach ('reconfigure', glob(CONFIG_OUT() . '/Makefile.config*'),
+            File::Spec->catdir(CONFIG_OUT(), 'Makefile.userconfig'),
+            File::Spec->catdir(CONFIG_OUT(), 'user.status'))
+        {
+            my $f = $_;
+            print "removing $f... ";
+            if (-e $f) {
+                if (unlink $f) {
+                    println "ok";
+                } else {
+                    println "failed";
+                }
+            } else {
+                println "not found";
+            }
+        }
+    }
+    if (CONFIG_OUT() ne '.') {
+        foreach
+            (glob('Makefile.config*'), 'user.status', 'Makefile.userconfig')
+        {
+            my $f = $_;
+            print "removing $f... ";
+            if (-e $f) {
+                if (unlink $f) {
+                    println "ok";
+                } else {
+                    println "failed";
+                }
+            } else {
+                println "not found";
+            }
+        }
+    }
+    exit 0;
+} elsif ($OPT{'status'}) {
+    status(1);
+    exit 0;
+}
+
+foreach (@ARGV) {
+    @_ = split('=');
+    next if ($#_ != 1);
+    $OPT{$_[0]} = $_[1] if ($_[0] eq 'CXX' || $_[0] eq 'LDFLAGS');
+}
+
+println "Configuring $PACKAGE_NAME package";
+
+$OPT{'prefix'} = $package_default_prefix unless ($OPT{'prefix'});
+
+my $AUTORUN = $OPT{status};
+print "checking system type... " unless ($AUTORUN);
+my ($OS, $ARCH, $OSTYPE, $MARCH, @ARCHITECTURES) = OsArch();
+println $OSTYPE unless ($AUTORUN);
+
+unless ($OSTYPE =~ /linux/i || $OSTYPE =~ /darwin/i || $OSTYPE eq 'win') {
+    println "configure: error: unsupported system '$OSTYPE'";
+    exit 1;
+}
+
+my $OS_DISTRIBUTOR = '';
+if ($OS eq 'linux') {
+    print "checking OS distributor... " unless ($AUTORUN);
+    $OS_DISTRIBUTOR = `lsb_release -si 2> /dev/null`;
+    chomp $OS_DISTRIBUTOR;
+    println $OS_DISTRIBUTOR unless ($AUTORUN);
+}
+
+print "checking machine architecture... " unless ($AUTORUN);
+println $MARCH unless ($AUTORUN);
+unless ($MARCH =~ /x86_64/i || $MARCH =~ /i?86/i) {
+    println "configure: error: unsupported architecture '$OSTYPE'";
+    exit 1;
+}
+
+{
+    $OPT{'prefix'} = expand_path($OPT{'prefix'});
+    my $prefix = $OPT{'prefix'};
+    $OPT{'eprefix'} = $prefix unless ($OPT{'eprefix'} || $OS eq 'win');
+    my $eprefix = $OPT{'eprefix'};
+    unless ($OPT{'bindir'} || $OS eq 'win') {
+        $OPT{'bindir'} = File::Spec->catdir($eprefix, 'bin') ;
+    }
+    unless ($OPT{'libdir'} || $OS eq 'win') {
+        $OPT{'libdir'} = File::Spec->catdir($eprefix, 'lib');
+    }
+    unless ($OPT{'includedir'} || $OS eq 'win') {
+        $OPT{'includedir'} = File::Spec->catdir($eprefix, 'include');
+    }
+    if ($PKG{LNG} eq 'PYTHON' && ! $OPT{'pythondir'} && $OS ne 'win') {
+        $OPT{'pythondir'} = $eprefix;
+    }
+    if ($PKG{LNG} eq 'JAVA' && ! $OPT{'javadir'} && $OS ne 'win') {
+        $OPT{'javadir'} = File::Spec->catdir($eprefix, 'jar');
+    }
+    if ($PKG{EXAMP} && ! $OPT{'sharedir'} && $OS ne 'win') {
+        $OPT{'sharedir'} = File::Spec->catdir($eprefix, 'share');
+    }
+}
+
+# initial values
+my $TARGDIR = File::Spec->catdir($OUTDIR, $PACKAGE);
+if ($OPT{'build-prefix'}) {
+    $TARGDIR = $OPT{'build-prefix'} = expand_path($OPT{'build-prefix'});
+    unless ($TARGDIR =~ /$PACKAGE$/) {
+        $TARGDIR = File::Spec->catdir($TARGDIR, $PACKAGE);
+    }
+}
+my $BUILD_PREFIX = $TARGDIR;
+
+my $BUILD = 'rel';
+
+# parse command line
+$BUILD = 'dbg' if ($OPT{'with-debug'});
+$BUILD = 'rel' if ($OPT{'without-debug'});
+
+my $BUILD_TYPE = "release";
+$BUILD_TYPE = "debug" if ( $BUILD eq "dbg" );
+
+$OPT{arch} = $ARCH if (@ARCHITECTURES && ! $OPT{arch});
+
+if ($OPT{arch}) {
+    my $found;
+    foreach (@ARCHITECTURES) {
+        if ($_ eq $OPT{arch}) {
+            ++$found;
+            last;
+        }
+    }
+    if ($found) {
+        $ARCH = $MARCH = $OPT{arch};
+        while (1) {
+            open F, ">Makefile.config.$OS.arch" or last;
+            print F "$ARCH\n";
+            close F;
+            last;
+        }
+        println "build architecture: $ARCH" unless ($AUTORUN);
+    } else {
+        delete $OPT{arch};
+    }
+}
+
+$OUT_MAKEFILE = File::Spec->catdir(CONFIG_OUT(), "$OUT_MAKEFILE.$OS.$ARCH");
+$INS_MAKEFILE = File::Spec->catdir(CONFIG_OUT(), "$INS_MAKEFILE.$OS.$ARCH.prl");
+
+my $TOOLS = "";
+$TOOLS = "jdk" if ($PKG{LNG} eq 'JAVA');
+
+# determine architecture
+
+print "checking for supported architecture... " unless ($AUTORUN);
+
+my $BITS;
+
+if ($MARCH =~ /x86_64/i) {
+    $BITS = 64;
+} elsif ($MARCH eq 'fat86') {
+    $BITS = '32_64';
+} elsif ($MARCH =~ /i?86/i) {
+    $BITS = 32;
+} else {
+    die "unrecognized Architecture '$ARCH'";
+}
+println "$MARCH ($BITS bits) is supported" unless ($AUTORUN);
+
+# determine OS and related norms
+my ($LPFX, $OBJX, $LOBX, $LIBX, $SHLX, $EXEX, $OSINC);
+
+print "checking for supported OS... " unless ($AUTORUN);
+if ($OSTYPE =~ /linux/i) {
+    $LPFX = 'lib';
+    $OBJX = 'o';
+    $LOBX = 'pic.o';
+    $LIBX = 'a';
+    $SHLX = 'so';
+    $EXEX = '';
+    $OSINC = 'unix';
+    $TOOLS = 'gcc' unless ($TOOLS);
+} elsif ($OSTYPE =~ /darwin/i) {
+    $LPFX = 'lib';
+    $OBJX = 'o';
+    $LOBX = 'pic.o';
+    $LIBX = 'a';
+    $SHLX = 'dylib';
+    $EXEX = '';
+    $OSINC = 'unix';
+    $TOOLS = 'clang' unless ($TOOLS);
+} elsif ($OSTYPE eq 'win') {
+    $TOOLS = 'vc++';
+} else {
+    die "unrecognized OS '$OSTYPE'";
+}
+
+println "$OSTYPE ($OS) is supported" unless ($AUTORUN);
+
+# tool chain
+my ($CPP, $CC, $CP, $AR, $ARX, $ARLS, $LD, $LP, $MAKE_MANIFEST);
+my ($JAVAC, $JAVAH, $JAR);
+my ($ARCH_FL, $DBG, $OPT, $PIC, $INC, $MD, $LDFLAGS) = ('');
+
+print "checking for supported tool chain... " unless ($AUTORUN);
+
+$CPP     = $OPT{CXX    } if ($OPT{CXX    });
+$LDFLAGS = $OPT{LDFLAGS} if ($OPT{LDFLAGS});
+
+if ($TOOLS =~ /gcc$/) {
+    $CPP  = 'g++' unless ($CPP);
+    $CC   = "$TOOLS -c";
+    $CP   = "$CPP -c";
+    $AR   = 'ar rc';
+    $ARX  = 'ar x';
+    $ARLS = 'ar t';
+    $LD   = $TOOLS;
+    $LP   = $CPP;
+
+    $DBG = '-g -DDEBUG';
+    $OPT = '-O3';
+    $PIC = '-fPIC';
+    $INC = '-I';
+    $MD  = '-MD';
+} elsif ($TOOLS eq 'clang') {
+    $CPP  = 'clang++' unless ($CPP);
+    $CC   = 'clang -c';
+    my $versionMin = '-mmacosx-version-min=10.6';
+    $CP   = "$CPP -c $versionMin";
+    if ($BITS ne '32_64') {
+        $ARCH_FL = '-arch i386' if ($BITS == 32);
+        $OPT = '-O3';
+        $AR      = 'ar rc';
+        $LD      = "clang $ARCH_FL";
+        $LP      = "$CPP $versionMin $ARCH_FL";
+    } else {
+        $MAKE_MANIFEST = '( echo "$^" > $@/manifest )';
+        $ARCH_FL       = '-arch i386 -arch x86_64';
+        $OPT    = '-O3';
+        $AR     = 'libtool -static -o';
+        $LD     = "clang -Wl,-arch_multiple $ARCH_FL -Wl,-all_load";
+        $LP     = "$CPP $versionMin -Wl,-arch_multiple $ARCH_FL -Wl,-all_load";
+    }
+    $ARX  = 'ar x';
+    $ARLS = 'ar t';
+
+    $DBG = '-g -DDEBUG';
+    $PIC = '-fPIC';
+    $INC = '-I';
+    $MD  = '-MD';
+} elsif ($TOOLS eq 'jdk') {
+    $JAVAC = 'javac';
+    if ($OPT{source}) {
+        $JAVAC .= ' -target ' . $OPT{source} . ' -source ' . $OPT{source};
+    }
+    $JAVAH = 'javah';
+    $JAR   = 'jar cf';
+
+    $DBG = '-g';
+} elsif ($TOOLS eq 'vc++') {
+} else {
+    die "unrecognized tool chain '$TOOLS'";
+}
+println "$TOOLS tool chain is supported" unless ($AUTORUN);
+
+if ($OS ne 'win' && $PKG{LNG} ne 'JAVA') {
+    $TARGDIR = File::Spec->catdir($TARGDIR, $OS, $TOOLS, $ARCH, $BUILD);
+}
+
+if ($CPP) {
+    unless (check_tool__h($CPP)) {
+        println "configure: error: '$CPP' cannot be found";
+        exit 1;
+    }
+}
+
+if ($JAVAC) {
+    unless (check_tool_h($JAVAC)) {
+        println "configure: error: '$JAVAC' cannot be found";
+        exit 1;
+    }
+}
+
+my $NO_ARRAY_BOUNDS_WARNING = '';
+if ($TOOLS =~ /gcc$/ && check_no_array_bounds()) {
+    $NO_ARRAY_BOUNDS_WARNING = '-Wno-array-bounds';
+}
+
+my $STATIC_LIBSTDCPP = '';
+if ($TOOLS =~ /gcc$/) {
+    $STATIC_LIBSTDCPP = check_static_libstdcpp();
+}
+
+my @dependencies;
+
+my %DEPEND_OPTIONS;
+foreach my $href (DEPENDS()) {
+    $_ = $href->{name};
+    my ($I, $L) = ($href->{Include});
+    my $o = "with-$_-prefix";
+    ++$DEPEND_OPTIONS{$o};
+    if ($OPT{$o}) {
+        $OPT{$o} = expand_path($OPT{$o});
+        $I = File::Spec->catdir($OPT{$o}, 'include');
+        if (/^xml2$/) {
+            my $t = File::Spec->catdir($I, 'libxml2');
+            $I = $t if (-e $t);
+        }
+        $L = File::Spec->catdir($OPT{$o}, 'lib');
+    }
+    my ($i, $l) = find_lib($_, $I, $L);
+    if (defined $i || $l) {
+        my $d = 'HAVE_' . uc($_) . ' = 1';
+        push @dependencies, $d;
+        println "\t\t$d" if ($OPT{'debug'});
+    }
+    if ($i) {
+        my $d = uc($_) . "_INCDIR = $i";
+        push @dependencies, $d;
+        println "\t\t$d" if ($OPT{'debug'});
+    }
+    if ($l) {
+        my $d = uc($_) . "_LIBDIR = $l";
+        push @dependencies, $d;
+        println "\t\t$d" if ($OPT{'debug'});
+    }
+}
+
+foreach my $href (@REQ) {
+    $href->{   bldpath} = expand($href->{   bldpath}) if ($href->{   bldpath});
+    $href->{locbldpath} = expand($href->{locbldpath}) if ($href->{locbldpath});
+
+    # found directories
+    my
+      ($found_itf, $found_bin, $found_lib, $found_ilib, $found_jar, $found_src);
+
+    my %a = %$href;
+    next if ($a{option} && $DEPEND_OPTIONS{$a{option}});
+    my $is_optional = optional($a{type});
+    my $quasi_optional = $a{type} =~ /Q/;
+    my $need_source = $a{type} =~ /S/;
+    my $need_bin = $a{type} =~ /E/;
+    my $need_build = $a{type} =~ /B/;
+    my $need_lib = $a{type} =~ /L|D/;
+    my $need_itf = ! ($a{type} =~ /D/ || $a{type} =~ /E/ || $a{type} =~ /J/);
+    my $need_jar = $a{type} =~ /J/;
+
+    my ($bin, $inc, $lib, $ilib, $src)
+        = ($a{bin}, $a{include}, $a{lib}, undef, $a{src}); # file names to check
+    $lib = '' unless ($lib);
+    $lib = expand($lib);
+
+    if ($need_build) {
+        $ilib = $a{ilib};
+        ++$need_lib;
+    }
+    unless ($AUTORUN) {
+        if ($need_source && $need_build) {
+            println
+               "checking for $a{name} package source files and build results..."
+        } elsif ($need_source) {
+            println "checking for $a{name} package source files...";
+        } else {
+            println "checking for $a{name} package...";
+        }
+    }
+    my %has_option;
+    my $tolib = $need_itf || $need_lib;
+    my $tojar = $need_jar;
+    foreach my $option ($a{option}, $a{boption}) {
+        next unless ($option);
+        if ($OPT{$option}) {
+            my $try = expand_path($OPT{$option});
+            if ($tojar && ! $found_jar && -f $try) {
+                println "\tjar... $try" unless ($AUTORUN);
+                $found_jar = $try;
+            }
+            elsif ($tolib) {
+                my ($i, $l, $il) = ($inc, $lib, $ilib);
+                if ($option =~ /-build$/) {
+                    undef $i;
+                    ++$has_option{build};
+                } elsif ($option =~ /-prefix$/) {
+                    undef $il;
+                    ++$has_option{prefix};
+                } elsif ($option =~ /-sources$/) {
+                    undef $l;
+                    undef $il;
+                    ++$has_option{sources};
+                }
+                my ($fi, $fl, $fil, $fs)
+                    = find_in_dir($try, $i, $l, $il, undef, undef, $src);
+                if ($fi || $fl || $fil) {
+                    $found_itf  = $fi  if (! $found_itf  && $fi);
+                    $found_lib  = $fl  if (! $found_lib  && $fl);
+                    $found_ilib = $fil if (! $found_ilib && $fil);
+                    $found_src  = $fs  if (! $found_src  && $fs);
+                } elsif (! ($try =~ /$a{name}$/)) {
+                    $try = File::Spec->catdir($try, $a{name});
+                    ($fi, $fl, $fil) = find_in_dir($try, $i, $l, $il);
+                    $found_itf  = $fi  if (! $found_itf  && $fi);
+                    $found_lib  = $fl  if (! $found_lib  && $fl);
+                    $found_ilib = $fil if (! $found_ilib && $fil);
+                }
+            } elsif ($need_bin) {
+                my (undef, $fl, $fil)
+                    = find_in_dir($try, undef, $lib, $ilib, undef, $bin);
+                $found_bin = $fl if ($fl);
+            }
+        }
+    }
+    if (! $found_itf && ! $has_option{sources} && $a{srcpath}) {
+        my $try = $a{srcpath};
+        ($found_itf, undef, undef, $found_src)
+            = find_in_dir($try, $inc, undef, undef, undef, undef, $src);
+    }
+    if (! $has_option{prefix}) {
+        my $try = $a{pkgpath};
+        if (($need_itf && ! $found_itf) || ($need_lib && ! $found_lib)) {
+            my ($fi, $fl) = find_in_dir($try, $inc, $lib);
+            $found_itf  = $fi  if (! $found_itf  && $fi);
+            $found_lib  = $fl  if (! $found_lib  && $fl);
+        }
+
+        if ($need_jar && ! $found_jar) {
+            (undef, $found_jar) = find_in_dir($try, undef, undef, undef, $lib);
+        }
+
+        $try = $a{usrpath};
+        if (($need_itf && ! $found_itf) || ($need_lib && ! $found_lib)) {
+            my ($fi, $fl) = find_in_dir($try, $inc, $lib);
+            $found_itf  = $fi  if (! $found_itf  && $fi);
+            $found_lib  = $fl  if (! $found_lib  && $fl);
+        }
+
+        if ($need_jar && ! $found_jar) {
+            (undef, $found_jar) = find_in_dir($try, undef, undef, undef, $lib);
+        }
+    }
+    if (! $has_option{build}) {
+        if ($a{bldpath}) {
+            my $tolib = $need_build || ($need_lib && ! $found_lib);
+            my $tobin = $need_bin && ! $found_bin;
+            my $tojar = $need_jar && ! $found_jar;
+            if ($tolib || $tobin || $tojar) {
+                my ($fl, $fil, $found);
+                if ($OPT{'build-prefix'}) {
+                    my $try = $OPT{'build-prefix'};
+                    if ($tolib) {
+                        (undef, $fl, $fil)
+                            = find_in_dir($try, undef, $lib, $ilib);
+                        if ($fl || $fil) {
+                            $found_lib  = $fl  if (! $found_lib  && $fl);
+                            $found_ilib = $fil if (! $found_ilib && $fil);
+                            ++$found;
+                        }
+                    }
+                    if ($tojar) {
+                        (undef, $found_jar)
+                            = find_in_dir($try, undef, undef, undef, $lib);
+                    }
+                    if (! ($try =~ /$a{name}$/)) {
+                        $try = File::Spec->catdir($try, $a{name});
+                        if ($tolib && ! $found) {
+                            (undef, $fl, $fil)
+                                = find_in_dir($try, undef, $lib, $ilib);
+                            if ($fl || $fil) {
+                                $found_lib  = $fl  if (! $found_lib  && $fl);
+                                $found_ilib = $fil if (! $found_ilib && $fil);
+                                ++$found;
+                            }
+                        }
+                        if ($need_jar && ! $found_jar) {
+                            (undef, $found_jar)
+                                = find_in_dir($try, undef, undef, undef, $lib);
+                        }
+                    }
+                }
+                unless ($found || $fl || $fil) {
+                    my $try = $a{bldpath};
+                    $try = $a{locbldpath} if ($OPT{'local-build-out'});
+                    if ($tolib && ! $found) {
+                        (undef, $fl, $fil)
+                            = find_in_dir($try, undef, $lib, $ilib);
+                        my $resetLib = ! $found_lib;
+                        if (! $found_ilib && $fil) {
+                            $found_ilib = $fil;
+                            ++$resetLib;
+                        }
+                        $found_lib  = $fl  if ($resetLib && $fl);
+                    }
+                    if ($tobin && ! $found) {
+                        (undef, $fl, $fil) =
+                            find_in_dir($try, undef, $lib, $ilib, undef, $bin);
+                        $found_bin = $fl if ($fl);
+                    }
+                    if ($need_jar && ! $found_jar) {
+                        (undef, $found_jar)
+                            = find_in_dir($try, undef, undef, undef, $lib);
+                    }
+                }
+            }
+        }
+    }
+    if (($need_itf && ! $found_itf) || ($need_lib && ! $found_lib) ||
+        ($need_jar && ! $found_jar) || ($ilib && ! $found_ilib) ||
+        ($need_bin && ! $found_bin))
+    {
+        if ($is_optional) {
+            println "configure: optional $a{name} package not found: skipped.";
+        } elsif ($quasi_optional && $found_itf && ($need_lib && ! $found_lib)) {
+            println "configure: $a{name} package: "
+                . "found interface files but not libraries.";
+        } else {
+            if ($OPT{'debug'}) {
+                $_ = "$a{name}: includes: ";
+                $found_itf = '' unless $found_itf;
+                $_ .= $found_itf;
+                unless ($need_lib) {
+                    $_ .= "; libs: not needed";
+                } else {
+                    $found_lib = '' unless $found_lib;
+                    $_ .= "; libs: " . $found_lib;
+                }
+                unless ($ilib) {
+                    $_ .= "; ilibs: not needed";
+                } else {
+                    $found_ilib = '' unless $found_ilib;
+                    $_ .= "; ilibs: " . $found_ilib;
+                }
+                println "\t\t$_";
+            }
+            println "configure: error: required $a{name} package not found.";
+            exit 1;
+        }
+    } else {
+        if ($found_itf) {
+            $found_itf = abs_path($found_itf);
+            push(@dependencies, "$a{aname}_INCDIR = $found_itf");
+            println "includes: $found_itf";
+        }
+        if ($found_src) {
+            $found_src = abs_path($found_src);
+            push(@dependencies, "$a{aname}_SRCDIR = $found_src");
+            println "sources: $found_src";
+        }
+        if ($found_lib) {
+            $found_lib = abs_path($found_lib);
+            if ($a{aname} eq 'NGS' || $a{aname} eq 'VDB') {
+                if ($OPT{PYTHON_LIB_PATH}) {
+                    $OPT{PYTHON_LIB_PATH} .= ':';
+                } else {
+                    $OPT{PYTHON_LIB_PATH} = '';
+                }
+                $OPT{PYTHON_LIB_PATH} .= $found_lib;
+            }
+            push(@dependencies, "$a{aname}_LIBDIR = $found_lib");
+            println "libraries: $found_lib";
+        }
+        if ($ilib && $found_ilib) {
+            $found_ilib = abs_path($found_ilib);
+            push(@dependencies, "$a{aname}_ILIBDIR = $found_ilib");
+            println "ilibraries: $found_ilib";
+        }
+        if ($found_bin) {
+            $found_bin = abs_path($found_bin);
+            push(@dependencies, "$a{aname}_BINDIR = $found_bin");
+            println "bin: $found_bin";
+        }
+        if ($found_jar) {
+            $found_jar = abs_path($found_jar);
+            push(@dependencies, "$a{aname}_JAR = $found_jar");
+            println "jar: $found_jar";
+        }
+    }
+}
+
+my ($E_BINDIR, $E_LIBDIR, $E_VERSION_LIBX, $E_MAJVERS_LIBX,
+                          $E_VERSION_EXEX, $E_MAJVERS_EXEX)
+    = (''    , '');
+
+println unless ($AUTORUN);
+
+if ($OS ne 'win' && ! $OPT{'status'}) {
+    if ($OSTYPE =~ /darwin/i && CONFIG_OUT() ne '.') {
+        my $COMP = File::Spec->catdir(CONFIG_OUT(), 'COMP.mac');
+        println "configure: creating '$COMP' ($TOOLS)" unless ($AUTORUN);
+        open F, ">$COMP" or die "cannot open $COMP to write";
+        print F "$TOOLS\n";
+        close F;
+    }
+
+    if ($TOOLS =~ /gcc$/) {
+        my $EXECMDF = File::Spec->catdir(CONFIG_OUT(), 'ld.linux.exe_cmd.sh');
+        println "configure: creating '$EXECMDF'" unless ($AUTORUN);
+        open F, ">$EXECMDF" or die "cannot open $EXECMDF to write";
+        print F "EXE_CMD=\"\$LD $STATIC_LIBSTDCPP -static-libgcc\"\n";
+        close F;
+    }
+
+    # create Makefile.config
+    println "configure: creating '$OUT_MAKEFILE'" unless ($AUTORUN);
+    open my $F, ">$OUT_MAKEFILE" or die "cannot open $OUT_MAKEFILE to write";
+
+    print $F <<EndText;
+### AUTO-GENERATED FILE ###
+
+# configuration command
+
+CONFIGURED = $CONFIGURED
+
+OS_ARCH = \$(shell perl \$(TOP)/setup/os-arch.perl)
+
+# install paths
+EndText
+
+    L($F, "INST_BINDIR = $OPT{'bindir'}"      ) if ($OPT{'bindir'});
+    L($F, "INST_LIBDIR = $OPT{'libdir'}"      ) if ($OPT{'libdir'});
+    L($F, "INST_INCDIR = $OPT{'includedir'}"  ) if ($OPT{'includedir'});
+    L($F, "INST_SCHEMADIR = $OPT{'shemadir'}" ) if ($OPT{'shemadir'});
+    L($F, "INST_SHAREDIR = $OPT{'sharedir'}"  ) if ($OPT{'sharedir'});
+    L($F, "INST_JARDIR = $OPT{'javadir'}"     ) if ($OPT{'javadir'});
+    L($F, "INST_PYTHONDIR = $OPT{'pythondir'}") if ($OPT{'pythondir'});
+
+    my ($E_VERSION_SHLX, $VERSION_SHLX,
+        $E_MAJVERS_SHLX , $MAJMIN_SHLX, $MAJVERS_SHLX);
+    if ($OSTYPE =~ /darwin/i) {
+        $E_VERSION_SHLX =  '$VERSION.$SHLX';
+        $VERSION_SHLX = '$(VERSION).$(SHLX)';
+        $MAJMIN_SHLX  = '$(MAJMIN).$(SHLX)';
+        $E_MAJVERS_SHLX = '$MAJVERS.$SHLX';
+        $MAJVERS_SHLX = '$(MAJVERS).$(SHLX)';
+    } else {
+        $E_VERSION_SHLX =  '$SHLX.$VERSION';
+        $VERSION_SHLX = '$(SHLX).$(VERSION)';
+        $MAJMIN_SHLX  = '$(SHLX).$(MAJMIN)';
+        $E_MAJVERS_SHLX =  '$SHLX.$MAJVERS';
+        $MAJVERS_SHLX = '$(SHLX).$(MAJVERS)';
+    }
+
+    $E_VERSION_LIBX = '$LIBX.$VERSION';
+    $E_MAJVERS_LIBX = '$LIBX.$MAJVERS';
+
+    L($F);
+    L($F, "# build type");
+
+    if ($OPT{'enable-static'}) {
+        L($F, "WANTS_STATIC = 1");
+    }
+
+    $E_VERSION_EXEX = '$EXEX.$VERSION';
+    $E_MAJVERS_EXEX = '$LIBX.$MAJVERS';
+
+    print $F <<EndText;
+BUILD = $BUILD
+
+# target OS
+OS    = $OS
+OSINC = $OSINC
+OS_DISTRIBUTOR = $OS_DISTRIBUTOR
+
+# prefix string for system libraries
+LPFX = $LPFX
+
+# suffix strings for system libraries
+LIBX = $LIBX
+VERSION_LIBX = \$(LIBX).\$(VERSION)
+MAJMIN_LIBX  = \$(LIBX).\$(MAJMIN)
+MAJVERS_LIBX = \$(LIBX).\$(MAJVERS)
+
+SHLX         = $SHLX
+VERSION_SHLX = $VERSION_SHLX
+MAJMIN_SHLX  = $MAJMIN_SHLX
+MAJVERS_SHLX = $MAJVERS_SHLX
+
+# suffix strings for system object files
+OBJX = $OBJX
+LOBX = $LOBX
+
+# suffix string for system executable
+EXEX         = $EXEX
+VERSION_EXEX = \$(EXEX).\$(VERSION)
+MAJMIN_EXEX  = \$(EXEX).\$(MAJMIN)
+MAJVERS_EXEX = \$(EXEX).\$(MAJVERS)
+
+# system architecture and wordsize
+ARCH = $ARCH
+EndText
+
+    L($F, "# ARCH = $ARCH ( $MARCH )") if ($ARCH ne $MARCH);
+
+    print $F <<EndText;
+BITS = $BITS
+
+# tools
+EndText
+
+    L($F, "CC            = $CC"           ) if ($CC);
+    L($F, "CPP           = $CPP"          ) if ($CPP);
+    L($F, "CP            = $CP"           ) if ($CP);
+    L($F, "AR            = $AR"           ) if ($AR);
+    L($F, "ARX           = $ARX"          ) if ($ARX);
+    L($F, "ARLS          = $ARLS"         ) if ($ARLS);
+    L($F, "LD            = $LD"           ) if ($LD);
+    L($F, "LP            = $LP"           ) if ($LP);
+    L($F, "JAVAC         = $JAVAC"        ) if ($JAVAC);
+    L($F, "JAVAH         = $JAVAH"        ) if ($JAVAH);
+    L($F, "JAR           = $JAR"          ) if ($JAR);
+    L($F, "MAKE_MANIFEST = $MAKE_MANIFEST") if ($MAKE_MANIFEST);
+    L($F);
+
+    L($F, '# tool options');
+    if ($BUILD eq "dbg") {
+        L($F, "DBG     = $DBG");
+        L($F, "OPT     = ");
+    } else {
+        L($F, "DBG     = -DNDEBUG") if ($PKG{LNG} eq 'C');
+        L($F, "OPT     = $OPT"    ) if ($OPT);
+    }
+    L($F, "PIC     = $PIC") if ($PIC);
+    if ($PKG{LNG} eq 'C') {
+        if ($TOOLS =~ /clang/i) {
+   L($F, 'SONAME  = -install_name ' .
+               '$(INST_LIBDIR)$(BITS)/$(subst $(VERSION),$(MAJVERS),$(@F)) \\');
+   L($F, '    -compatibility_version $(MAJMIN) -current_version $(VERSION) \\');
+   L($F, '    -flat_namespace -undefined suppress');
+        } else {
+      L($F, 'SONAME = -Wl,-soname=$(subst $(VERSION),$(MAJVERS),$(@F))');
+     }
+     L($F, "SRCINC  = $INC. $INC\$(SRCDIR)");
+    } elsif ($PKG{LNG} eq 'JAVA') {
+        L($F, 'SRCINC  = -sourcepath $(INCPATHS)');
+    }
+    if ($PIC) {
+        if (PACKAGE_NAMW() eq 'NGS') {
+            L($F, "INCDIRS = \$(SRCINC) $INC\$(TOP) "
+                .        "$INC\$(TOP)/ngs/\$(OSINC)/\$(ARCH)")
+        } elsif (PACKAGE_NAMW() eq 'NGS_BAM') {
+            L($F, "INCDIRS = \$(SRCINC) $INC\$(TOP) "
+                . "$INC\$(NGS_INCDIR)/ngs/\$(OSINC)/\$(ARCH)")
+        } else {
+            L($F, "INCDIRS = \$(SRCINC) $INC\$(TOP)")
+        }
+    }
+    if ($PKG{LNG} eq 'C') {
+        L($F, "CFLAGS  = \$(DBG) \$(OPT) \$(INCDIRS) $MD $ARCH_FL");
+    }
+    L($F, "LDFLAGS = $LDFLAGS") if ($LDFLAGS);
+
+    L($F, 'CLSPATH = -classpath $(CLSDIR)');
+    L($F, "NO_ARRAY_BOUNDS_WARNING = $NO_ARRAY_BOUNDS_WARNING");
+    L($F);
+
+# $PACKAGE_NAME and library version
+# \$(VERSION) is defined in a separate file which is updated every release
+    L($F, "include \$(TOP)/" . CONFIG_OUT() . "/Makefile.vers" );
+
+    print $F <<EndText;
+
+empty :=
+space := \$(empty) \$(empty)
+MAJMIN  = \$(subst \$(space),.,\$(wordlist 1,2,\$(subst .,\$(space),\$(VERSION))))
+MAJVERS = \$(firstword \$(subst .,\$(space),\$(VERSION)))
+
+# output path
+BUILD_PREFIX = $BUILD_PREFIX
+TARGDIR = $TARGDIR
+
+# derived paths
+MODPATH  ?= \$(subst \$(TOP)/,,\$(CURDIR))
+SRCDIR   ?= \$(TOP)/\$(MODPATH)
+MAKEFILE ?= \$(abspath \$(firstword \$(MAKEFILE_LIST)))
+BINDIR    = \$(TARGDIR)/bin
+EndText
+
+    if ($PKG{LNG} eq 'C') {
+        $E_BINDIR        = '$TARGDIR/bin';
+        $E_LIBDIR        = '$TARGDIR/lib';
+        L($F, 'LIBDIR    = $(TARGDIR)/lib');
+    } elsif ($PKG{LNG} eq 'JAVA') {
+        $E_LIBDIR        = '$TARGDIR/jar';
+        L($F, 'LIBDIR    = $(TARGDIR)/jar');
+    }
+
+    L($F, 'ILIBDIR   = $(TARGDIR)/ilib');
+    if ($PKG{NOMODPATH}) {
+        L($F, 'OBJDIR    = $(TARGDIR)/obj');
+    } else {
+        L($F, 'OBJDIR    = $(TARGDIR)/obj/$(MODPATH)');
+    }
+    L($F, 'CLSDIR    = $(TARGDIR)/cls');
+
+    if ($PKG{LNG} eq 'JAVA') {
+        L($F,
+            "INCPATHS = \$(SRCDIR):\$(SRCDIR)/itf:\$(TOP)/gov/nih/nlm/ncbi/ngs")
+    }
+
+    print $F <<EndText;
+
+# exports
+export TOP
+export MODPATH
+export SRCDIR
+export MAKEFILE
+
+# auto-compilation rules
+EndText
+
+    if ($PKG{LNG} eq 'C') {
+        L($F, '$(OBJDIR)/%.$(OBJX): %.c');
+        T($F, '$(CC) -o $@ $< $(CFLAGS)');
+        L($F, '$(OBJDIR)/%.$(LOBX): %.c');
+        T($F, '$(CC) -o $@ $< $(PIC) $(CFLAGS)');
+    }
+    L($F, '$(OBJDIR)/%.$(OBJX): %.cpp');
+    T($F, '$(CP) -o $@ $< $(CFLAGS)');
+    L($F, '$(OBJDIR)/%.$(LOBX): %.cpp');
+    T($F, '$(CP) -o $@ $< $(PIC) $(CFLAGS)');
+    L($F);
+
+    # this is part of Makefile
+    L($F, 'VPATH = $(SRCDIR)');
+    L($F);
+
+    # we know how to find jni headers
+    if ($PKG{LNG} eq 'JAVA' and $OPT{'with-ngs-sdk-src'}) {
+        L($F, "JNIPATH = $OPT{'with-ngs-sdk-src'}/language/java");
+    }
+
+    L($F, '# directory rules');
+    if ($PKG{LNG} eq 'C') {
+        L($F, '$(BINDIR) $(LIBDIR) $(ILIBDIR) '
+            . '$(OBJDIR) $(INST_LIBDIR) $(INST_LIBDIR)$(BITS):');
+        T($F, 'mkdir -p $@');
+    } elsif ($PKG{LNG} eq 'JAVA') {
+        # test if we have jni header path
+        L($F, '$(LIBDIR) $(CLSDIR) $(INST_JARDIR):');
+        T($F, 'mkdir -p $@');
+    }
+    L($F);
+
+    L($F, '# not real targets');
+    L($F, '.PHONY: default clean install all std $(TARGETS)');
+    L($F);
+
+    L($F, '# dependencies');
+    if ($PKG{LNG} eq 'C') {
+        L($F, 'include $(wildcard $(OBJDIR)/*.d)');
+    } elsif ($PKG{LNG} eq 'JAVA') {
+        L($F, 'include $(wildcard $(CLSDIR)/*.d)');
+    }
+    L($F, $_) foreach (@dependencies);
+    L($F);
+
+    # pass HAVE_XML2 to build scripts
+    L($F, 'ifeq (,$(HAVE_XML2))');
+    L($F, '    HAVE_XML2=0');
+    L($F, 'endif');
+    L($F, 'CONFIGURE_FOUND_XML2=$(HAVE_XML2)');
+    L($F, 'export CONFIGURE_FOUND_XML2');
+    L($F);
+
+    if ($OS eq 'linux' || $OS eq 'mac') {
+        L($F, '# installation rules');
+        L($F,
+        '$(INST_LIBDIR)$(BITS)/%.$(VERSION_LIBX): $(LIBDIR)/%.$(VERSION_LIBX)');
+        T($F, '@ echo -n "installing \'$(@F)\'... "');
+        T($F, '@ if cp $^ $@ && chmod 644 $@;                         \\');
+        T($F, '  then                                                 \\');
+        T($F, '      rm -f $(patsubst %$(VERSION),%$(MAJVERS),$@) '
+                     . '$(patsubst %$(VERSION_LIBX),%$(LIBX),$@) '
+                     . '$(patsubst %.$(VERSION_LIBX),%-static.$(LIBX),$@); \\');
+        T($F, '      ln -s $(@F) $(patsubst %$(VERSION),%$(MAJVERS),$@);   \\');
+        T($F, '      ln -s $(patsubst %$(VERSION),%$(MAJVERS),$(@F)) '
+                      . '$(patsubst %$(VERSION_LIBX),%$(LIBX),$@); \\');
+        T($F, '      ln -s $(patsubst %$(VERSION_LIBX),%$(LIBX),$(@F)) ' .
+   '$(INST_LIBDIR)$(BITS)/$(patsubst %.$(VERSION_LIBX),%-static.$(LIBX),$(@F));'
+                                                              . ' \\');
+        T($F, '      echo success;                                    \\');
+        T($F, '  else                                                 \\');
+        T($F, '      echo failure;                                    \\');
+        T($F, '      false;                                           \\');
+        T($F, '  fi');
+        L($F);
+
+        L($F,
+        '$(INST_LIBDIR)$(BITS)/%.$(VERSION_SHLX): $(LIBDIR)/%.$(VERSION_SHLX)');
+        T($F, '@ echo -n "installing \'$(@F)\'... "');
+        T($F, '@ if cp $^ $@ && chmod 755 $@;                         \\');
+        T($F, '  then                                                 \\');
+        if ($OS ne 'mac') {
+          T($F, '      rm -f $(patsubst %$(VERSION),%$(MAJVERS),$@) '
+                      . '$(patsubst %$(VERSION_SHLX),%$(SHLX),$@);    \\');
+        }
+        if ($OS eq 'linux') {
+          T($F, '      ln -s $(@F) $(patsubst %$(VERSION),%$(MAJVERS),$@); \\');
+        } elsif ($OS eq 'mac') {
+          T($F, '      ln -sf $(@F) '
+                   . '$(patsubst %$(VERSION_SHLX),%$(MAJVERS).$(SHLX),$@); \\');
+        } else {
+          die;
+        }
+        T($F, '      ln -sf $(patsubst %$(VERSION),%$(MAJVERS),$(@F)) '
+                      . '$(patsubst %$(VERSION_SHLX),%$(SHLX),$@); \\');
+        T($F, '      echo success;                                    \\');
+        T($F, '  else                                                 \\');
+        T($F, '      echo failure;                                    \\');
+        T($F, '      false;                                           \\');
+        T($F, '  fi');
+        L($F);
+
+        L($F, '$(INST_BINDIR)/%$(VERSION_EXEX): $(BINDIR)/%$(VERSION_EXEX)');
+        T($F, '@ echo -n "installing \'$(@F)\'... "');
+        T($F, '@ if cp $^ $@ && chmod 755 $@;                         \\');
+        T($F, '  then                                                 \\');
+        T($F, '      rm -f $(patsubst %$(VERSION),%$(MAJVERS),$@) '
+                      . '$(patsubst %$(VERSION_EXEX),%$(EXEX),$@);     \\');
+        T($F, '      ln -s $(@F) $(patsubst %$(VERSION),%$(MAJVERS),$@);   \\');
+        T($F, '      ln -s $(patsubst %$(VERSION),%$(MAJVERS),$(@F)) '
+                      . '$(patsubst %$(VERSION_EXEX),%$(EXEX),$@); \\');
+        T($F, '      echo success;                                    \\');
+        T($F, '  else                                                 \\');
+        T($F, '      echo failure;                                    \\');
+        T($F, '      false;                                           \\');
+        T($F, '  fi');
+    }
+    close $F;
+
+	# creation of Makefile.config.install is disabled, since nobody uses it now 
+	# and I need to remove versions from prl scripts
+	if (0) {
+	    # create Makefile.config.install
+	    println "configure: creating '$INS_MAKEFILE'" unless ($AUTORUN);
+	    open $F, ">$INS_MAKEFILE" or die "cannot open $INS_MAKEFILE to write";
+	
+	    $OPT{'javadir' } = '' unless ($OPT{'javadir' });
+	    $OPT{'sharedir'} = '' unless ($OPT{'sharedir'});
+	
+	    print $F "sub CONFIGURE {\n";
+	    print $F "    \$_{PACKAGE_NAME } = '$PACKAGE_NAME';\n";
+	    print $F "    \$_{VERSION      } = '\$VERSION';\n";
+	    print $F "    \$_{LNG          } = '$PKG{LNG}';\n";
+	    print $F "    \$_{OS           } = '$OS';\n";
+	    print $F "    \$_{BITS         } =  $BITS;\n";
+	    print $F "    \$_{MAJVERS      } =  \$MAJVERS;\n";
+	    print $F "    \$_{LPFX         } = '$LPFX';\n";
+	    print $F "    \$_{LIBX         } = '$LIBX';\n";
+	    print $F "    \$_{MAJVERS_LIBX } = '" . expand($E_MAJVERS_LIBX) . "';\n";
+	    print $F "    \$_{VERSION_LIBX } = '" . expand($E_VERSION_LIBX) . "';\n";
+	    print $F "    \$_{SHLX         } = '$SHLX';\n";
+	    print $F "    \$_{MAJVERS_SHLX } = '" . expand($E_MAJVERS_SHLX) . "';\n";
+	    print $F "    \$_{VERSION_SHLX } = '" . expand($E_VERSION_SHLX) . "';\n";
+	    print $F "    \$_{VERSION_EXEX } = '" . expand($E_VERSION_EXEX) . "';\n";
+	    print $F "    \$_{MAJVERS_EXEX } = '" . expand($E_MAJVERS_EXEX) . "';\n";
+	    print $F "    \$_{INCDIR       } = '" . expand("$Bin/.."      ) . "';\n";
+	    if ($PKG{LNG} ne 'PYTHON') {
+	        print $F "  \$_{BINDIR$BITS} = '" . expand($E_BINDIR      ) . "';\n";
+	        print $F "  \$_{LIBDIR$BITS} = '" . expand($E_LIBDIR      ) . "';\n";
+	    } elsif ($OPT{PYTHON_LIB_PATH}) {
+	        print $F "  \$_{LIBDIR$BITS} = '$OPT{PYTHON_LIB_PATH}';\n";
+	    }
+	    print $F "    \$_{OTHER_PREFIX } = '$PKG{UPATH}';\n";
+	    print $F "    \$_{PREFIX       } = '$OPT{'prefix'}';\n";
+	    print $F "    \$_{INST_INCDIR  } = '$OPT{'includedir'}';\n";
+	    print $F "    \$_{INST_BINDIR  } = '$OPT{'bindir'}';\n";
+	    print $F "    \$_{INST_LIBDIR  } = '$OPT{'libdir'}';\n";
+	    print $F "    \$_{INST_JARDIR  } = '$OPT{'javadir'}';\n";
+	    print $F "    \$_{INST_SHAREDIR} = '$OPT{'sharedir'}';\n";
+	    print $F "\n";
+	    print $F "    \@_\n";
+	    print $F "}\n";
+	    print $F "\n";
+	    print $F "1\n";
+	
+	    close $F;
+    }
+}
+
+if (! $OPT{'status'} ) {
+    if ($OS eq 'win') {
+        my $OUT = File::Spec->catdir(CONFIG_OUT(), 'Makefile.config.win');
+        println "configure: creating '$OUT'";
+        open OUT, ">$OUT" or die "cannot open $OUT to write";
+        my $name = PACKAGE_NAMW();
+        my $outdir = $name . '_OUTDIR';
+        my $root = $name . '_ROOT';
+
+        print OUT <<EndText;
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <$outdir>$TARGDIR/\</$outdir>
+EndText
+        foreach my $href (@REQ) {
+            my %a = %$href;
+            my $NGS_SDK_PREFIX = '';
+            $NGS_SDK_PREFIX = $a{found_itf} if ($a{found_itf});
+            if ($a{name} eq 'ngs-sdk') {
+                my $root = "$a{aname}_ROOT";
+                print OUT "    <$root>$NGS_SDK_PREFIX\/</$root>\n";
+                last;
+            }
+        }
+        print OUT <<EndText;
+    <$root>$Bin/\</$root>
+  </PropertyGroup>
+</Project>
+EndText
+        close OUT;
+    } else {
+        println "configure: creating 'Makefile.config'" unless ($AUTORUN);
+        my $CONFIG_OUT = CONFIG_OUT();
+        my $out = File::Spec->catdir($CONFIG_OUT, 'Makefile.config');
+        open COUT, ">$out" or die "cannot open $out to write";
+        print COUT "### AUTO-GENERATED FILE ###\n";
+        print COUT "\n";
+        print COUT "OS_ARCH = \$(shell perl \$(TOP)/setup/os-arch.perl)\n";
+        print COUT "include \$(TOP)/$CONFIG_OUT/Makefile.config.\$(OS_ARCH)\n";
+        close COUT;
+    }
+}
+
+unless ($OPT{'reconfigure'}) {
+    println "configure: creating 'reconfigure'" unless ($AUTORUN);
+    $CONFIGURED =~ s/\t/ /g;
+    open my $F, '>reconfigure' or die 'cannot open reconfigure to write';
+    print $F "./configure $CONFIGURED\n";
+    close $F;
+   # my $perm = (stat $fh)[2] & 07777;
+#   print "==================================================== $perm\n";
+}
+
+status() if ($OS ne 'win');
+
+unlink 'a.out';
+
+sub L { $_[1] = '' unless ($_[1]); print { $_[0] }   "$_[1]\n" }
+sub T {                            print { $_[0] } "\t$_[1]\n" }
+
+sub status {
+    my ($load) = @_;
+    if ($load) {
+        ($OS, $ARCH, $OSTYPE, $MARCH, @ARCHITECTURES) = OsArch();
+        my $MAKEFILE
+            = File::Spec->catdir(CONFIG_OUT(), "$OUT_MAKEFILE.$OS.$ARCH");
+        println "\t\tloading $MAKEFILE" if ($OPT{'debug'});
+        unless (-e $MAKEFILE) {
+            print STDERR "configure: error: run ./configure [OPTIONS] first.\n";
+            exit 1;
+        }
+        open F, $MAKEFILE or die "cannot open $MAKEFILE";
+        foreach (<F>) {
+            chomp;
+            if (/BUILD = (.+)/) {
+                $BUILD_TYPE = $1;
+            } elsif (/BUILD \?= /) {
+                $BUILD_TYPE = $_ unless ($BUILD_TYPE);
+            } elsif (/BUILD_PREFIX = /) {
+                $BUILD_PREFIX = $_;
+            } elsif (/^CC += (.+)/) {
+                $CC = $1;
+            } elsif (/CONFIGURED = (.*)/) {
+                $CONFIGURED = $1;
+            } elsif (/CPP += (.+)/) {
+                $CPP = $1;
+            } elsif (/LDFLAGS += (.+)/) {
+                $LDFLAGS = $1;
+            } elsif (/TARGDIR = /) {
+                $TARGDIR = $_;
+                println "\t\tgot $_" if ($OPT{'debug'});
+            } elsif (/TARGDIR \?= (.+)/) {
+                $TARGDIR = $1 unless ($TARGDIR);
+                println "\t\tgot $_" if ($OPT{'debug'});
+            }
+            elsif (/INST_INCDIR = (.+)/) {
+                $OPT{'includedir'} = $1;
+            }
+            elsif (/INST_BINDIR = (.+)/) {
+                $OPT{'bindir'} = $1;
+            }
+            elsif (/INST_LIBDIR = (.+)/) {
+                $OPT{'libdir'} = $1;
+            }
+        }
+    }
+
+    println "build type: $BUILD_TYPE";
+    println "build prefix: $BUILD_PREFIX" if ($OS ne 'win');
+    println "build output path: $TARGDIR" if ($OS ne 'win');
+
+#   print "prefix: ";    print $OPT{'prefix'} if ($OS ne 'win');    println;
+#   print "eprefix: ";    print $OPT{'eprefix'} if ($OPT{'eprefix'});   println;
+
+    print "includedir: ";
+    print $OPT{'includedir'} if ($OPT{'includedir'});
+    println;
+
+    print "bindir: ";
+    print $OPT{'bindir'} if ($OPT{'bindir'});
+    println;
+
+    print "libdir: ";
+    print $OPT{'libdir'} if ($OPT{'libdir'});
+    println;
+
+    println "schemadir: $OPT{'shemadir'}" if ($OPT{'shemadir'});
+    println "sharedir: $OPT{'sharedir'}" if ($OPT{'sharedir'});
+    println "javadir: $OPT{'javadir'}" if ($OPT{'javadir'});
+    println "pythondir: $OPT{'pythondir'}" if ($OPT{'pythondir'});
+
+    println "CC = $CC"   if ($CC );
+    println "CPP = $CPP" if ($CPP);
+    println "LDFLAGS = $LDFLAGS" if ($LDFLAGS);
+
+    $CONFIGURED =~ s/\t/ /g;
+    println "configured with: \"$CONFIGURED\"";
+}
+
+sub expand { $_[0] =~ s/(\$\w+)/$1/eeg; $_[0]; }
+
+sub expand_path {
+    my ($filename) = @_;
+    return unless ($filename);
+
+    if ($filename =~ /^~/) {
+        if ($filename =~ m|^~([^/]*)|) {
+            if ($1 && ! getpwnam($1)) {
+                print "configure: error: bad path: '$filename'\n";
+                exit 1;
+            }
+        }
+
+        $filename =~ s{ ^ ~ ( [^/]* ) }
+                      { $1
+                            ? (getpwnam($1))[7]
+                            : ( $ENV{HOME} || $ENV{USERPROFILE} || $ENV{LOGDIR}
+                                || (getpwuid($<))[7]
+                              )
+                      }ex;
+    }
+
+    my $a = abs_path($filename);
+    $filename = $a if ($a);
+    $filename;
+}
+
+sub find_in_dir {
+    my ($dir, $include, $lib, $ilib, $jar, $bin, $src) = @_;
+    unless (-d $dir) {
+        println "\t\tnot found $dir" if ($OPT{'debug'});
+        return;
+    }
+    my ($found_inc, $found_lib, $found_ilib, $found_src);
+    if ($include) {
+        print "\tincludes... " unless ($AUTORUN);
+        if (-e "$dir/$include") {
+            println $dir unless ($AUTORUN);
+            $found_inc = $dir;
+        } elsif (-e "$dir/include/$include") {
+            println $dir unless ($AUTORUN);
+            $found_inc = "$dir/include";
+        } elsif (-e "$dir/interfaces/$include") {
+            println $dir unless ($AUTORUN);
+            $found_inc = "$dir/interfaces";
+        } else {
+            print "$dir: " if ($OPT{'debug'});
+            println 'no' unless ($AUTORUN);
+        }
+    }
+    if ($lib || $ilib) {
+        print "\tlibraries... " unless ($AUTORUN);
+        if ($lib) {
+            my $builddir = File::Spec->catdir($dir, $OS, $TOOLS, $ARCH, $BUILD);
+            my $libdir  = File::Spec->catdir($builddir, 'lib');
+            my $ilibdir = File::Spec->catdir($builddir, 'ilib');
+            my $f = File::Spec->catdir($libdir, $lib);
+            print "\n\t\tchecking $f\n\t" if ($OPT{'debug'});
+            my $found;
+            if (-e $f) {
+                $found_lib = $libdir;
+                if ($ilib) {
+                    my $f = File::Spec->catdir($ilibdir, $ilib);
+                    print "\tchecking $f\n\t" if ($OPT{'debug'});
+                    if (-e $f) {
+                        println $ilibdir;
+                        $found_ilib = $ilibdir;
+                    } else {
+                        println 'no' unless ($AUTORUN);
+                        return;
+                    }
+                } else {
+                    println $libdir;
+                }
+                ++$found;
+            }
+            if (! $found) {
+                my $libdir = File::Spec->catdir($dir, 'lib' . $BITS);
+                my $f = File::Spec->catdir($libdir, $lib);
+                print "\tchecking $f\n\t" if ($OPT{'debug'});
+                if (-e $f) {
+                    println $libdir;
+                    $found_lib = $libdir;
+                    ++$found;
+                }
+            }
+            if (! $found) {
+                my $builddir = File::Spec->catdir
+                    ($dir, $OS, $TOOLS, $ARCH, reverse_build($BUILD));
+                my $libdir  = File::Spec->catdir($builddir, 'lib');
+                my $ilibdir = File::Spec->catdir($builddir, 'ilib');
+                my $f = File::Spec->catdir($libdir, $lib);
+                print "\tchecking $f\n\t" if ($OPT{'debug'});
+                if (-e $f) {
+                    $found_lib = $libdir;
+                    if ($ilib) {
+                        my $f = File::Spec->catdir($ilibdir, $ilib);
+                        print "\tchecking $f\n\t" if ($OPT{'debug'});
+                        if (-e $f) {
+                            println $ilibdir;
+                            $found_ilib = $ilibdir;
+                        } else {
+                            println 'no' unless ($AUTORUN);
+                            return;
+                        }
+                    } else {
+                        println $libdir;
+                    }
+                    ++$found;
+                } else {
+                    println 'no' unless ($AUTORUN);
+                }
+            }
+        }
+        if ($found_lib && $ilib && ! $found_ilib) {
+            println "\n\t\tfound $found_lib but no ilib/" if ($OPT{'debug'});
+            print "\t" if ($OPT{'debug'});
+            println 'no' unless ($AUTORUN);
+            undef $found_lib;
+        }
+    }
+    if ($bin) {
+        print "\t... " unless ($AUTORUN);
+        my $builddir = File::Spec->catdir($dir, $OS, $TOOLS, $ARCH, $BUILD);
+        my $bdir  = File::Spec->catdir($builddir, 'bin');
+        my $f = File::Spec->catdir($bdir, $bin);
+        print "\n\t\tchecking $f\n\t" if ($OPT{'debug'});
+        if (-e $f) {
+            $found_lib = $bdir;
+            println $bdir;
+        } else {
+            println 'no' unless ($AUTORUN);
+        }
+    }
+    if ($jar) {
+        print "\tjar... " unless ($AUTORUN);
+        my $try = "$dir/jar/$jar";
+        if (-e "$try") {
+            println $try unless ($AUTORUN);
+            $found_lib = $try;
+        }
+    }
+    if ($src) {
+        print "\tsrc... " unless ($AUTORUN);
+        my $try = "$dir/$src";
+        if (-e "$try") {
+            println $dir unless ($AUTORUN);
+            $found_src = $dir;
+        }
+    }
+    return ($found_inc, $found_lib, $found_ilib, $found_src);
+}
+
+sub reverse_build {
+    ($_) = @_;
+    if ($_ eq 'rel') {
+        return 'dbg';
+    } elsif ($_ eq 'dbg') {
+        return 'rel';
+    } else {
+        die $_;
+    }
+}
+
+################################################################################
+
+sub check_tool_h  { return check_tool(@_,  '-help'); }
+sub check_tool__h { return check_tool(@_, '--help'); }
+
+sub check_tool {
+    my ($tool, $o) = @_;
+    print "checking for $tool... ";
+    my $cmd = "$tool $o";
+    print "\n\t\trunning $cmd\n\t" if ($OPT{'debug'});
+    my $out = `$cmd 2>&1`;
+    if ($? == 0) {
+        println "yes";
+        return 1;
+    } else {
+        println "no";
+        return 0;
+    }
+}
+
+sub check_no_array_bounds {
+    check_compiler('O', '-Wno-array-bounds');
+}
+
+sub check_static_libstdcpp {
+    my $option = '-static-libstdc++';
+    my $save = $TOOLS;
+    $TOOLS = $CPP;
+    $_ = check_compiler('O', $option);
+    $TOOLS = $save;
+    $_ ? $option : ''
+}
+
+sub find_lib {
+    check_compiler('L', @_);
+}
+
+sub check_compiler {
+    my ($t, $n, $i, $l) = @_;
+    my $tool = $TOOLS;
+
+    if ($t eq 'L') {
+        print "checking for $n library... ";
+    } elsif ($t eq 'O') {
+        if ($tool && ($tool =~ /gcc$/ || $tool =~ /g\+\+$/)) {
+            print "checking whether $tool accepts $n... ";
+        } else {
+            return;
+        }
+    } else {
+        die "Unknown check_compiler option: '$t'";
+    }
+
+    unless ($tool) {
+        println "warning: unknown tool";
+        return;
+    }
+
+    while (1) {
+        my ($flags, $library, $log) = ('', '');
+
+        if ($t eq 'O') {
+            $flags = $n;
+            $log = '                      int main() {                     }\n'
+        } elsif ($n eq 'hdf5') {
+            $library = '-lhdf5';
+            $log = '#include <hdf5.h>  \n int main() { H5close         (); }\n'
+        } elsif ($n eq 'fuse') {
+            $flags = '-D_FILE_OFFSET_BITS=64';
+            $library = '-lfuse';
+            $log = '#include <fuse.h>  \n int main() { fuse_get_context(); }\n'
+        } elsif ($n eq 'magic') {
+            $library = '-lmagic';
+            $log = '#include <magic.h> \n int main() { magic_open     (0); }\n'
+        } elsif ($n eq 'xml2') {
+            $library  = '-lxml2';
+            $library .=       ' -liconv' if ($OS eq 'mac');
+            $log = '#include <libxml/xmlreader.h>\n' .
+                                         'int main() { xmlInitParser  ( ); }\n'
+        } else {
+            println 'unknown: skipped';
+            return;
+        }
+
+        if ($i && ! -d $i) {
+            print "'$i': " if ($OPT{'debug'});
+            println 'no';
+            return;
+        }
+        if ($l && ! -d $l) {
+            print "'$l': " if ($OPT{'debug'});            println 'no';
+            return;
+        }
+
+        my $cmd = $log;
+        $cmd =~ s/\\n/\n/g;
+
+        my $gcc = "| $tool -xc $flags " . ($i ? "-I$i " : ' ')
+                                      . ($l ? "-L$l " : ' ') . "- $library";
+        $gcc .= ' 2> /dev/null' unless ($OPT{'debug'});
+
+        open GCC, $gcc or last;
+        print "\n\t\trunning echo -e '$log' $gcc\n" if ($OPT{'debug'});
+        print GCC "$cmd" or last;
+        my $ok = close GCC;
+        print "\t" if ($OPT{'debug'});
+        println $ok ? 'yes' : 'no';
+
+        unlink 'a.out';
+
+        return if (!$ok);
+
+        return 1 if ($t eq 'O');
+
+        return ($i, $l);
+    }
+
+    println "cannot run $tool: skipped";
+}
+
+################################################################################
+
+sub check {
+    die "No CONFIG_OUT"   unless CONFIG_OUT();
+    die "No PACKAGE"      unless PACKAGE();
+    die "No PACKAGE_NAME" unless PACKAGE_NAME();
+    die "No PACKAGE_NAMW" unless PACKAGE_NAMW();
+    die "No PACKAGE_TYPE" unless PACKAGE_TYPE();
+
+    my %PKG = PKG();
+
+    die "No LNG"    unless $PKG{LNG};
+    die "No LOCOUT" unless $PKG{LOCOUT};
+    die "No OUT"    unless $PKG{OUT};
+    die "No PATH"   unless $PKG{PATH};
+    die "No UPATH"  unless $PKG{UPATH};
+
+    foreach my $href (DEPENDS()) { die "No DEPENDS::name" unless $href->{name} }
+
+    foreach my $href (REQ()) {
+        die         "No REQ::name" unless $href->{name};
+
+        die         "No $href->{name}:option"  unless $href->{option}
+                                                   || $href->{boption};
+
+        die         "No $href->{name}:type"    unless $href->{type};
+        unless ($href->{type} =~ /I/) {
+          unless ($href->{type} =~ /E/) {
+            die     "No $href->{name}:lib"     unless $href->{lib};
+          }
+            die     "No $href->{name}:pkgpath" unless $href->{pkgpath};
+            die     "No $href->{name}:usrpath" unless $href->{usrpath};
+        }
+
+        die         "No $href->{name}:origin"  unless $href->{origin};
+        if ($href->{origin} eq 'I') {
+            die     "No $href->{name}:aname"   unless $href->{aname};
+            unless ($href->{type} =~ /D/ || $href->{type} =~ /E/
+                                         || $href->{type} =~ /J/)
+            {
+                die "No $href->{name}:include" unless $href->{include};
+                die "No $href->{name}:srcpath" unless $href->{srcpath};
+            }
+            unless ($href->{type} =~ /I/) {
+                die "No $href->{name}:bldpath"    unless $href->{bldpath   };
+                die "No $href->{name}:locbldpath" unless $href->{locbldpath};
+            }
+            if ($href->{type} =~ /B/) {
+                die "No $href->{name}:ilib"    unless $href->{ilib};
+            }
+        }
+    }
+}
+
+################################################################################
+
+sub optional { $_[0] =~ /O/ }
+
+sub help {
+#  --prefix=PREFIX         install architecture-independent files in PREFIX
+    print <<EndText;
+`configure' configures $PACKAGE_NAME to adapt to many kinds of systems.
+
+Usage: ./configure [OPTION]...
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+
+EndText
+
+    if ($^O ne 'MSWin32') {
+        print <<EndText;
+Installation directories:
+  --prefix=PREFIX         install all files in PREFIX
+                          [$package_default_prefix]
+
+EndText
+
+        my $other_prefix = $PKG{UPATH};
+        if ($PACKAGE eq 'sra-tools' && 0) {
+            print <<EndText;
+  --shemadir=DIR          install schema files in DIR
+                          [$schema_default_dir]
+
+EndText
+        }
+
+        print "By default, \`make install' will install all the files in\n";
+
+        if (PACKAGE_TYPE() eq 'B') {
+            print "\`$package_default_prefix/bin', ";
+        } elsif (PACKAGE_TYPE() eq 'L') {
+            print "\`$package_default_prefix/include', ";
+        }
+        if (PACKAGE_TYPE() eq 'P') {
+            println "\`$package_default_prefix/share' etc.";
+        } else {
+            println "\`$package_default_prefix/lib' etc.";
+        }
+
+        print <<EndText;
+You can specify an installation prefix other than \`$package_default_prefix'
+using \`--prefix', for instance \`--prefix=$other_prefix'.
+EndText
+    }
+
+    print <<EndText;
+
+For better control, use the options below.
+
+EndText
+
+    my ($required, $optional);
+    foreach my $href (@REQ) {
+        if (optional($href->{type})) {
+            ++$optional;
+        } else {
+            ++$required;
+        }
+    }
+
+    if ($required) {
+        print "Required Packages:\n";
+        foreach my $href (@REQ) {
+            next if (optional($href->{type}));
+            my %a = %$href;
+            if ($a{type} =~ /S/) {
+                println "  --$a{option}=DIR    search for $a{name} package";
+                println "                                 source files in DIR";
+            } else {
+                unless ($a{type} =~ /E/) {
+                  println
+                    "  --$a{option}=DIR      search for $a{name} package in DIR"
+                }
+            }
+            if ($a{boption}) {
+                println "  --$a{boption}=DIR      search for $a{name} package";
+                println "                                 build output in DIR";
+            }
+            println;
+        }
+    }
+
+    if ($optional) {
+        print "Optional Packages:\n";
+        foreach my $href (@REQ) {
+            next unless (optional($href->{type}));
+            my %a = %$href;
+            if ($a{option} =~ /-sources$/) {
+                println "  --$a{option}=DIR    search for $a{name} package";
+                println "                                source files in DIR";
+            } else {
+                println "  --$a{option}=DIR    search for $a{name} files in DIR"
+            }
+        }
+        println;
+    }
+
+    print <<EndText if (PACKAGE_TYPE() eq 'B');
+Optional Features:
+  --enable-static         build static executable [default=no]
+
+EndText
+
+    my ($OS, $ARCH, $OSTYPE, $MARCH, @ARCHITECTURES) = OsArch();
+
+    if ($^O ne 'MSWin32') {
+        print "Build tuning:\n";
+        if ($PKG{LNG} ne 'JAVA') {
+            print <<EndText;
+  --with-debug
+  --without-debug
+EndText
+        }
+
+        if (@ARCHITECTURES) {
+            print
+"  --arch=name             specify the name of the target architecture\n";
+        }
+
+        if ($PKG{LNG} eq 'JAVA') {
+            print <<EndText;
+  --source=release        provide source compatibility with specified release,
+                          generate class files for specified VM version.
+                          e.g. `--source=1.6'
+EndText
+        } else {
+            print "\n";
+        }
+
+        print <<EndText;
+  --build-prefix=DIR      generate build output into DIR directory
+                          [$OUTDIR]
+
+EndText
+    }
+
+    println 'Miscellaneous:';
+    println '  --reconfigure           rerun `configure\'';
+    println '                          using the same command-line arguments';
+    if ($^O ne 'MSWin32') {
+        println
+            '  --status                print current configuration information'
+    }
+    print <<EndText;
+  --clean                 remove all configuration results
+  --debug                 print lots of debugging information
+
+If `configure' was already run running `configure' without options
+will rerun `configure' using the same command-line arguments.
+
+Report bugs to sra-tools\@ncbi.nlm.nih.gov
+EndText
+}
+
+################################################################################
diff --git a/setup/os-arch.perl b/setup/os-arch.perl
new file mode 100644
index 0000000..5f3f87a
--- /dev/null
+++ b/setup/os-arch.perl
@@ -0,0 +1,22 @@
+use strict;
+
+use FindBin qw($Bin);
+require "$Bin/os-arch.prl";
+
+my ($OS, $ARCH, $OSTYPE, $MARCH, @ARCHITECTURES) = OsArch();
+
+my $res = "$OS.$ARCH";
+
+if (@ARCHITECTURES) {
+    my $name = "$Bin/../Makefile.config.$OS.arch";
+    if (-e $name) {
+        while (1) {
+            open F, $name or last;
+            $res = "$OS." . <F>;
+            chomp $res;
+            last;
+        }
+    }
+}
+
+print "$res\n";
diff --git a/setup/os-arch.prl b/setup/os-arch.prl
new file mode 100644
index 0000000..5daa75e
--- /dev/null
+++ b/setup/os-arch.prl
@@ -0,0 +1,106 @@
+sub OsArch {
+    my ($UNAME, $HOST_OS, $HOST_ARCH,
+        $MARCH, # machine hardware name returned by uname -m
+        @ARCHITECTURES);
+    if ($^O eq 'MSWin32') {
+        $UNAME = $HOST_OS = 'win';
+        $HOST_ARCH = $MARCH = 'x86_64';
+        @ARCHITECTURES = qw(x86_64 i386);
+    } else {
+        $UNAME = `uname -s`;
+        chomp $UNAME;
+        if ($UNAME =~ /Darwin/) {
+            $HOST_OS = 'mac';
+        } elsif ($UNAME =~ /Linux/) {
+            $HOST_OS = 'linux';
+        } elsif ($UNAME =~ /SunOS/) {
+            $HOST_OS = 'sun';
+            @ARCHITECTURES = qw(x86_64 i386);
+        } elsif ($UNAME =~ /xCYGWIN/) {
+            $HOST_OS = 'win';
+        } elsif ($UNAME =~ /xMINGW/) {
+            $HOST_OS = 'win';
+        } else {
+            $HOST_OS = $UNAME;
+        }
+        if ($HOST_OS eq 'mac') {
+            $MARCH = $HOST_ARCH = MacArch();
+            @ARCHITECTURES = qw(x86_64 i386 fat86) if ($MARCH eq 'x86_64');
+        } else {
+            $MARCH = `uname -m`;
+            chomp $MARCH;
+            if ($MARCH =~ /i386/) {
+                $HOST_ARCH = 'i386';
+            } elsif ($MARCH =~ /i486/) {
+                $HOST_ARCH = 'i386';
+            } elsif ($MARCH =~ /i586/) {
+                $HOST_ARCH = 'i386';
+            } elsif ($MARCH =~ /i686/) {
+                if ($UNAME =~ /WOW64/) { # 64-bit capable Cygwin.
+                     # Analyze the version of cl to set the correct architecture
+                    my $CL = `cl.exe 2>&1 > /dev/null`;
+                    if ($CL =~ /for x64/) {
+                        $HOST_ARCH = 'x86_64';
+                    } else {
+                        $HOST_ARCH = 'i386';
+                    }
+                } else {
+                    $HOST_ARCH = 'i386';
+                }
+            } elsif ($MARCH =~ /x86_64/) {
+                $HOST_ARCH = 'x86_64';
+            } elsif ($MARCH =~ /i86pc/) {
+                $HOST_ARCH = 'x86_64';
+                @ARCHITECTURES = qw(x86_64 i386);
+            } elsif ($MARCH =~ /sun4v/) {
+                $HOST_ARCH = 'sparc64';
+                @ARCHITECTURES = qw(sparc64 sparc32);
+            } else {
+                $HOST_ARCH = $MARCH;
+            }
+        }
+    }
+    ($HOST_OS, $HOST_ARCH, $UNAME, $MARCH, @ARCHITECTURES);
+}
+
+sub MacArch {
+    my $ARCH = `uname -m`;
+    chomp $ARCH;
+    if ($ARCH eq 'x86_64') {
+        return $ARCH;
+    } else {
+        my $SYSCTL = '/usr/sbin/sysctl';
+        $SYSCTL = '/sbin/sysctl' if (-x '/sbin/sysctl');
+
+        my $CAP64 = `$SYSCTL -n hw.cpu64bit_capable`;
+        chomp $CAP64;
+
+        my $PADDR_BITS = `$SYSCTL -n machdep.cpu.address_bits.physical`;
+        chomp $PADDR_BITS;
+
+        my $VADDR_BITS = `$SYSCTL -n machdep.cpu.address_bits.virtual`;
+        chomp $VADDR_BITS;
+        
+        if ($CAP64 != 0) {
+            if ($PADDR_BITS > 32 && $VADDR_BITS > 32) {
+                if ($ARCH eq 'i386' || $ARCH eq 'x86_64') {
+                    return 'x86_64';
+                } elsif ($ARCH eq 'Power Macintosh') {
+                    return 'ppc64';
+                } else {
+                    return 'unrecognized';
+                }
+            }
+        }
+
+        if ($ARCH eq 'i386') {
+            return 'i386';
+        } elsif ($ARCH eq 'Power Macintosh') {
+            return 'ppc32';
+        } else {
+            return 'unrecognized';
+        }
+    }
+}
+
+1
diff --git a/setup/package.prl b/setup/package.prl
new file mode 100644
index 0000000..fa4d60e
--- /dev/null
+++ b/setup/package.prl
@@ -0,0 +1,57 @@
+################################################################################
+sub PACKAGE      { 'ncbi-vdb' }
+sub PACKAGE_TYPE { 'L' }
+sub PACKAGE_NAME { 'NCBI-VDB' }
+sub PACKAGE_NAMW { 'VDB' }
+sub CONFIG_OUT   { 'build' }
+sub PKG { ( LNG   => 'C',
+            OUT   => 'ncbi-outdir',
+            LOCOUT=> '../../OUTDIR',
+            PATH  => '/usr/local/ncbi/ncbi-vdb',
+            UPATH =>      '$HOME/ncbi/ncbi-vdb', ) }
+sub DEPENDS { ( { name => 'hdf5' , Include => '/usr/include'        , },
+                { name => 'magic', Include => '/usr/include'        , },
+                { name => 'xml2' , Include => '/usr/include/libxml2', } ) }
+sub REQ { ( { name    => 'ngs-sdk',
+              aname   => 'NGS',
+              option  => 'with-ngs-sdk-prefix',
+              origin  => 'I',
+              type    => 'IDQ',
+              srcpath => '../ngs/ngs-sdk',
+              pkgpath => '/usr/local/ngs/ngs-sdk',
+              usrpath =>      '$HOME/ngs/ngs-sdk',
+              bldpath => '$HOME/ncbi-outdir/ngs-sdk',
+              locbldpath=>'$Bin/../../OUTDIR/ngs-sdk',
+              include => 'ngs/itf/Refcount.h',
+              lib     => 'libngs-sdk.$SHLX',
+            },
+            { name    => 'ngs-java',
+              aname   => 'NGS_JAVA',
+              option  => 'with-ngs-java-prefix',
+              origin  => 'I',
+              type    => 'JO',
+              pkgpath => '/usr/local/ngs/ngs-java',
+              usrpath =>      '$HOME/ngs/ngs-java',
+              bldpath => '$HOME/ncbi-outdir/ngs-java',
+              locbldpath=>'$Bin/../../OUTDIR/ngs-java',
+              lib     => 'ngs-java.jar',
+            },
+            { name    => 'hdf5',
+              option  => 'with-hdf5-prefix',
+              origin  => 'E',
+              type    => 'LIO',
+              pkgpath => '/usr',
+              usrpath => '$HOME',
+              include => 'hdf5.h',
+              lib     => 'libhdf5.a',
+            },
+            { name    => 'xml2',
+              option  => 'with-xml2-prefix',
+              origin  => 'E',
+              type    => 'LIO',
+              pkgpath => '/usr',
+              usrpath => '$HOME',
+              include => 'libxml2/xmlreader.h',
+              lib     => 'libxml2.a',
+        } ) }
+1
diff --git a/setup/s/install b/setup/s/install
new file mode 100755
index 0000000..b1e201d
--- /dev/null
+++ b/setup/s/install
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+FILENAME="`basename $0`"
+CURDIR="`dirname $0`"
+
+if [ -z "$CURDIR" ]
+    then
+    echo error: install should be run as ./install
+    exit 1
+fi
+
+if [ "$FILENAME" != install -a ! -s setup/install.perl ]
+    then
+    echo error: install should be run as ./install
+else
+    perl -v > /dev/null 2>&1 || { echo "checking for perl... no"; \
+        echo >&2 "error: perl not found."; exit 1; }
+
+    cd $CURDIR/setup
+    perl -w ./install.perl "$@"
+fi
diff --git a/setup/s/os.prl b/setup/s/os.prl
new file mode 100644
index 0000000..5f75471
--- /dev/null
+++ b/setup/s/os.prl
@@ -0,0 +1,2 @@
+sub OS { 'linux' }
+1
diff --git a/src/main/java/htsjdk/samtools/AbstractBAMFileIndex.java b/src/main/java/htsjdk/samtools/AbstractBAMFileIndex.java
deleted file mode 100644
index 6bf28ef..0000000
--- a/src/main/java/htsjdk/samtools/AbstractBAMFileIndex.java
+++ /dev/null
@@ -1,721 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.BitSet;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Provides basic, generic capabilities to be used reading BAM index files.  Users can
- * subclass this class to create new BAM index functionality for adding querying facilities,
- * changing caching behavior, etc.
- *
- * Of particular note: the AbstractBAMFileIndex is, by design, the only class aware of the
- * details of the BAM index file format (other than the four classes representing the data,
- * BAMIndexContent, Bin, Chunk, LinearIndex, and the classes for building the BAM index).
- * Anyone wanting to implement a reader for a differing
- * or extended BAM index format should implement BAMIndex directly.
- */
-public abstract class AbstractBAMFileIndex implements BAMIndex {
-
-    private final IndexFileBuffer mIndexBuffer;
-
-    private SAMSequenceDictionary mBamDictionary = null;
-    
-    final int [] sequenceIndexes;
-
-    protected AbstractBAMFileIndex(
-        final SeekableStream stream, final SAMSequenceDictionary dictionary)
-    {
-        mBamDictionary = dictionary;
-        mIndexBuffer = new IndexStreamBuffer(stream);
-
-        verifyBAMMagicNumber(stream.getSource());
-
-        sequenceIndexes = new int[readInteger() + 1];
-        Arrays.fill(sequenceIndexes, -1);
-    }
-
-    protected AbstractBAMFileIndex(final File file, final SAMSequenceDictionary dictionary) {
-        this(file, dictionary, true);
-    }
-
-    protected AbstractBAMFileIndex(final File file, final SAMSequenceDictionary dictionary, final boolean useMemoryMapping) {
-        mBamDictionary = dictionary;
-        mIndexBuffer = (useMemoryMapping ? new MemoryMappedFileBuffer(file) : new RandomAccessFileBuffer(file));
-
-        verifyBAMMagicNumber(file.getName());
-
-        sequenceIndexes = new int[readInteger() + 1];
-        Arrays.fill(sequenceIndexes, -1);
-    }
-
-    /**
-     * Close this index and release any associated resources.
-     */
-    public void close() {
-        mIndexBuffer.close();
-    }
-
-    /**
-     * Get the number of levels employed by this index.
-     * @return Number of levels in this index.
-     */
-    public static int getNumIndexLevels() {
-        return GenomicIndexUtil.LEVEL_STARTS.length;
-    }
-
-    /**
-     * Gets the first bin in the given level.
-     * @param levelNumber Level number.  0-based.
-     * @return The first bin in this level.
-     */
-    public static int getFirstBinInLevel(final int levelNumber) {
-        return GenomicIndexUtil.LEVEL_STARTS[levelNumber];
-    }
-
-    /**
-     * Gets the number of bins in the given level.
-     * @param levelNumber Level number.  0-based.
-     * @return The size (number of possible bins) of the given level.
-     */
-    public int getLevelSize(final int levelNumber) {
-        if(levelNumber == getNumIndexLevels())
-            return GenomicIndexUtil.MAX_BINS+1-GenomicIndexUtil.LEVEL_STARTS[levelNumber];
-        else
-            return GenomicIndexUtil.LEVEL_STARTS[levelNumber+1]-GenomicIndexUtil.LEVEL_STARTS[levelNumber];
-    }
-
-    /**
-     * Gets the level associated with the given bin number.
-     * @param bin The bin  for which to determine the level.
-     * @return the level associated with the given bin number.
-     */
-    public int getLevelForBin(final Bin bin) {
-        if(bin.getBinNumber() >= GenomicIndexUtil.MAX_BINS)
-            throw new SAMException("Tried to get level for invalid bin.");
-        for(int i = getNumIndexLevels()-1; i >= 0; i--) {
-            if(bin.getBinNumber() >= GenomicIndexUtil.LEVEL_STARTS[i])
-                return i;
-        }
-        throw new SAMException("Unable to find correct bin for bin "+bin);
-    }
-
-    /**
-     * Gets the first locus that this bin can index into.
-     * @param bin The bin to test.
-     * @return The last position that the given bin can represent.
-     */
-    public int getFirstLocusInBin(final Bin bin) {
-        final int level = getLevelForBin(bin);
-        final int levelStart = GenomicIndexUtil.LEVEL_STARTS[level];
-        final int levelSize = ((level==getNumIndexLevels()-1) ? GenomicIndexUtil.MAX_BINS-1 : GenomicIndexUtil.LEVEL_STARTS[level+1]) - levelStart;
-        return (bin.getBinNumber() - levelStart)*(GenomicIndexUtil.BIN_GENOMIC_SPAN /levelSize)+1;
-    }
-
-    /**
-     * Gets the last locus that this bin can index into.
-     * @param bin The bin to test.
-     * @return The last position that the given bin can represent.
-     */
-    public int getLastLocusInBin(final Bin bin) {
-        final int level = getLevelForBin(bin);
-        final int levelStart = GenomicIndexUtil.LEVEL_STARTS[level];
-        final int levelSize = ((level==getNumIndexLevels()-1) ? GenomicIndexUtil.MAX_BINS-1 : GenomicIndexUtil.LEVEL_STARTS[level+1]) - levelStart;
-        return (bin.getBinNumber()-levelStart+1)*(GenomicIndexUtil.BIN_GENOMIC_SPAN /levelSize);
-    }
-
-    public int getNumberOfReferences() {
-        seek(4);
-        return readInteger();
-    }
-
-    /**
-     * Use to get close to the unmapped reads at the end of a BAM file.
-     * @return The file offset of the first record in the last linear bin, or -1
-     * if there are no elements in linear bins (i.e. no mapped reads).
-     */
-    public long getStartOfLastLinearBin() {
-        seek(4);
-
-        final int sequenceCount = readInteger();
-        // Because no reads may align to the last sequence in the sequence dictionary,
-        // grab the last element of the linear index for each sequence, and return
-        // the last one from the last sequence that has one.
-        long lastLinearIndexPointer = -1;
-        for (int i = 0; i < sequenceCount; i++) {
-            // System.out.println("# Sequence TID: " + i);
-            final int nBins = readInteger();
-            // System.out.println("# nBins: " + nBins);
-            for (int j1 = 0; j1 < nBins; j1++) {
-                // Skip bin #
-                skipBytes(4);
-                final int nChunks = readInteger();
-                // Skip chunks
-                skipBytes(16 * nChunks);
-            }
-            final int nLinearBins = readInteger();
-            if (nLinearBins > 0) {
-                // Skip to last element of list of linear bins
-                skipBytes(8 * (nLinearBins - 1));
-                lastLinearIndexPointer = readLong();
-            }
-        }
-
-        return lastLinearIndexPointer;
-    }
-
-    /**
-     * Return meta data for the given reference including information about number of aligned, unaligned, and noCoordinate records
-     *
-     * @param reference the reference of interest
-     * @return meta data for the reference
-     */
-    public BAMIndexMetaData getMetaData(final int reference) {
-        seek(4);
-
-        final List<Chunk> metaDataChunks = new ArrayList<Chunk>();
-
-        final int sequenceCount = readInteger();
-
-        if (reference >= sequenceCount) {
-            return null;
-        }
-
-        skipToSequence(reference);
-
-        final int binCount = readInteger();
-        for (int binNumber = 0; binNumber < binCount; binNumber++) {
-            final int indexBin = readInteger();
-            final int nChunks = readInteger();
-            if (indexBin == GenomicIndexUtil.MAX_BINS) {
-                for (int ci = 0; ci < nChunks; ci++) {
-                    final long chunkBegin = readLong();
-                    final long chunkEnd = readLong();
-                    metaDataChunks.add(new Chunk(chunkBegin, chunkEnd));
-                }
-            } else {
-                skipBytes(16 * nChunks);
-            }
-        }
-        return new BAMIndexMetaData(metaDataChunks);
-    }
-
-    /**
-     * Returns count of records unassociated with any reference. Call before the index file is closed
-     *
-     * @return meta data at the end of the bam index that indicates count of records holding no coordinates
-     * or null if no meta data (old index format)
-     */
-    public Long getNoCoordinateCount() {
-
-        seek(4);
-        final int sequenceCount = readInteger();
-
-        skipToSequence(sequenceCount);
-        try { // in case of old index file without meta data
-            return readLong();
-        } catch (final Exception e) {
-            return null;
-        }
-    }
-
-    protected BAMIndexContent query(final int referenceSequence, final int startPos, final int endPos) {
-        seek(4);
-
-        final List<Chunk> metaDataChunks = new ArrayList<Chunk>();
-
-        final int sequenceCount = readInteger();
-
-        if (referenceSequence >= sequenceCount) {
-            return null;
-        }
-
-        final BitSet regionBins = GenomicIndexUtil.regionToBins(startPos, endPos);
-        if (regionBins == null) {
-            return null;
-        }
-
-        skipToSequence(referenceSequence);
-
-        final int binCount = readInteger();
-        boolean metaDataSeen = false;
-        final Bin[] bins = new Bin[getMaxBinNumberForReference(referenceSequence) +1];
-        for (int binNumber = 0; binNumber < binCount; binNumber++) {
-            final int indexBin = readInteger();
-            final int nChunks = readInteger();
-            List<Chunk> chunks = null;
-            // System.out.println("# bin[" + i + "] = " + indexBin + ", nChunks = " + nChunks);
-            Chunk lastChunk = null;
-            if (regionBins.get(indexBin)) {
-            	chunks = new ArrayList<Chunk>(nChunks);
-                for (int ci = 0; ci < nChunks; ci++) {
-                    final long chunkBegin = readLong();
-                    final long chunkEnd = readLong();
-                    lastChunk = new Chunk(chunkBegin, chunkEnd);
-                    chunks.add(lastChunk);
-                }
-            } else if (indexBin == GenomicIndexUtil.MAX_BINS) {
-                // meta data - build the bin so that the count of bins is correct;
-                // but don't attach meta chunks to the bin, or normal queries will be off
-                for (int ci = 0; ci < nChunks; ci++) {
-                    final long chunkBegin = readLong();
-                    final long chunkEnd = readLong();
-                    lastChunk = new Chunk(chunkBegin, chunkEnd);
-                    metaDataChunks.add(lastChunk);
-                }
-                metaDataSeen = true;
-                continue; // don't create a Bin
-            } else {
-                skipBytes(16 * nChunks);
-                chunks = Collections.emptyList();
-            }
-            final Bin bin = new Bin(referenceSequence, indexBin);
-            bin.setChunkList(chunks);
-            bin.setLastChunk(lastChunk);
-            bins[indexBin] = bin;
-        }
-
-        final int nLinearBins = readInteger();
-
-        final int regionLinearBinStart = LinearIndex.convertToLinearIndexOffset(startPos);
-        final int regionLinearBinStop = endPos > 0 ? LinearIndex.convertToLinearIndexOffset(endPos) : nLinearBins-1;
-        final int actualStop = Math.min(regionLinearBinStop, nLinearBins -1);
-
-        long[] linearIndexEntries = new long[0];
-        if (regionLinearBinStart < nLinearBins) {
-            linearIndexEntries = new long[actualStop-regionLinearBinStart+1];
-            skipBytes(8 * regionLinearBinStart);
-            for(int linearBin = regionLinearBinStart; linearBin <= actualStop; linearBin++)
-                linearIndexEntries[linearBin-regionLinearBinStart] = readLong();
-        }
-
-        final LinearIndex linearIndex = new LinearIndex(referenceSequence,regionLinearBinStart,linearIndexEntries);
-
-        return new BAMIndexContent(referenceSequence, bins, binCount - (metaDataSeen? 1 : 0), new BAMIndexMetaData(metaDataChunks), linearIndex);
-    }
-
-    /**
-     * The maximum possible bin number for this reference sequence.
-     * This is based on the maximum coordinate position of the reference
-     * which is based on the size of the reference
-     */
-    private int getMaxBinNumberForReference(final int reference) {
-        try {
-            final int sequenceLength = mBamDictionary.getSequence(reference).getSequenceLength();
-            return getMaxBinNumberForSequenceLength(sequenceLength);
-        } catch (final Exception e) {
-            return GenomicIndexUtil.MAX_BINS;
-        }
-    }
-
-    /**
-     * The maxiumum bin number for a reference sequence of a given length
-     */
-    static int getMaxBinNumberForSequenceLength(final int sequenceLength) {
-        return getFirstBinInLevel(getNumIndexLevels() - 1) + (sequenceLength >> 14);
-        // return 4680 + (sequenceLength >> 14); // note 4680 = getFirstBinInLevel(getNumIndexLevels() - 1)
-    }
-
-    abstract protected BAMIndexContent getQueryResults(int reference);
-
-    /**
-     * Gets the possible number of bins for a given reference sequence.
-     * @return How many bins could possibly be used according to this indexing scheme to index a single contig.
-     */
-    protected int getMaxAddressibleGenomicLocation() {
-        return GenomicIndexUtil.BIN_GENOMIC_SPAN;
-    }
-
-    /**
-     * Get candidate bins for the specified region
-     * @param startPos 1-based start of target region, inclusive.
-     * @param endPos 1-based end of target region, inclusive.
-     * @return bit set for each bin that may contain SAMRecords in the target region.
-     */
-    protected BitSet regionToBins(final int startPos, final int endPos) {
-        final int maxPos = 0x1FFFFFFF;
-        final int start = (startPos <= 0) ? 0 : (startPos-1) & maxPos;
-        final int end = (endPos <= 0) ? maxPos : (endPos-1) & maxPos;
-        if (start > end) {
-            return null;
-        }
-        int k;
-        final BitSet bitSet = new BitSet(GenomicIndexUtil.MAX_BINS);
-        bitSet.set(0);
-        for (k =    1 + (start>>26); k <=    1 + (end>>26); ++k) bitSet.set(k);
-        for (k =    9 + (start>>23); k <=    9 + (end>>23); ++k) bitSet.set(k);
-        for (k =   73 + (start>>20); k <=   73 + (end>>20); ++k) bitSet.set(k);
-        for (k =  585 + (start>>17); k <=  585 + (end>>17); ++k) bitSet.set(k);
-        for (k = 4681 + (start>>14); k <= 4681 + (end>>14); ++k) bitSet.set(k);
-        return bitSet;
-    }
-
-    /**
-     * @deprecated Invoke {@link Chunk#optimizeChunkList} directly.
-     */
-    @Deprecated
-    protected List<Chunk> optimizeChunkList(final List<Chunk> chunks, final long minimumOffset) {
-        return Chunk.optimizeChunkList(chunks, minimumOffset);
-    }
-
-    private void verifyBAMMagicNumber(final String sourceName) {
-        // Verify the magic number.
-        seek(0);
-        final byte[] buffer = new byte[4];
-        readBytes(buffer);
-        if (!Arrays.equals(buffer, BAMFileConstants.BAM_INDEX_MAGIC)) {
-            throw new RuntimeIOException("Invalid file header in BAM index " + sourceName +
-                    ": " + new String(buffer));
-        }
-    }
-
-    private void skipToSequence(final int sequenceIndex) {
-    	//Use sequence position cache if available
-    	if(sequenceIndexes[sequenceIndex] != -1){
-    		seek(sequenceIndexes[sequenceIndex]);
-    		return;
-    	}
-    	
-        for (int i = 0; i < sequenceIndex; i++) {
-            // System.out.println("# Sequence TID: " + i);
-            final int nBins = readInteger();
-            // System.out.println("# nBins: " + nBins);
-            for (int j = 0; j < nBins; j++) {
-                readInteger(); // bin
-                final int nChunks = readInteger();
-                // System.out.println("# bin[" + j + "] = " + bin + ", nChunks = " + nChunks);
-                skipBytes(16 * nChunks);
-            }
-            final int nLinearBins = readInteger();
-            // System.out.println("# nLinearBins: " + nLinearBins);
-            skipBytes(8 * nLinearBins);
-        }
-        
-        //Update sequence position cache
-        sequenceIndexes[sequenceIndex] = position();
-    }
-
-    private void readBytes(final byte[] bytes) {
-        mIndexBuffer.readBytes(bytes);
-    }
-
-    private int readInteger() {
-        return mIndexBuffer.readInteger();
-    }
-
-    private long readLong() {
-        return mIndexBuffer.readLong();
-    }
-
-    private void skipBytes(final int count) {
-        mIndexBuffer.skipBytes(count);
-    }
-
-    private void seek(final int position) {
-        mIndexBuffer.seek(position);
-    }
-    
-    private int position(){
-    	return mIndexBuffer.position();
-    }
-
-    private abstract static class IndexFileBuffer {
-        abstract void readBytes(final byte[] bytes);
-        abstract int readInteger();
-        abstract long readLong();
-        abstract void skipBytes(final int count);
-        abstract void seek(final int position);
-        abstract int position();
-        abstract void close();
-    }
-
-    /**
-     * Traditional implementation of BAM index file access using memory mapped files.
-     */
-    private static class MemoryMappedFileBuffer extends IndexFileBuffer {
-        private MappedByteBuffer mFileBuffer;
-
-        MemoryMappedFileBuffer(final File file) {
-            try {
-                // Open the file stream.
-                final FileInputStream fileStream = new FileInputStream(file);
-                final FileChannel fileChannel = fileStream.getChannel();
-                mFileBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0L, fileChannel.size());
-                mFileBuffer.order(ByteOrder.LITTLE_ENDIAN);
-                fileChannel.close();
-                fileStream.close();
-            } catch (final IOException exc) {
-                throw new RuntimeIOException(exc.getMessage(), exc);
-            }
-        }
-
-        @Override
-        void readBytes(final byte[] bytes) {
-            mFileBuffer.get(bytes);
-        }
-
-        @Override
-        int readInteger() {
-            return mFileBuffer.getInt();
-        }
-
-        @Override
-        long readLong() {
-            return mFileBuffer.getLong();
-        }
-
-        @Override
-        void skipBytes(final int count) {
-            mFileBuffer.position(mFileBuffer.position() + count);
-        }
-
-        @Override
-        void seek(final int position) {
-            mFileBuffer.position(position);
-        }
-        
-        @Override
-		int position() {
-			return mFileBuffer.position();
-		}
-
-        @Override
-        void close() {
-            mFileBuffer = null;
-        }
-    }
-
-    /**
-     * Alternative implementation of BAM index file access using regular I/O instead of memory mapping.
-     * 
-     * This implementation can be more scalable for certain applications that need to access large numbers of BAM files.
-     * Java provides no way to explicitly release a memory mapping.  Instead, you need to wait for the garbage collector
-     * to finalize the MappedByteBuffer.  Because of this, when accessing many BAM files or when querying many BAM files
-     * sequentially, you cannot easily control the physical memory footprint of the java process.
-     * This can limit scalability and can have bad interactions with load management software like LSF, forcing you
-     * to reserve enough physical memory for a worst case scenario.
-     * The use of regular I/O allows you to trade somewhat slower performance for a small, fixed memory footprint
-     * if that is more suitable for your application.
-     */
-    private static class RandomAccessFileBuffer extends IndexFileBuffer {
-        private static final int PAGE_SIZE = 4 * 1024;
-        private static final int PAGE_OFFSET_MASK = PAGE_SIZE-1;
-        private static final int PAGE_MASK = ~PAGE_OFFSET_MASK;
-        private static final int INVALID_PAGE = 1;
-        private final File mFile;
-        private RandomAccessFile mRandomAccessFile;
-        private final int mFileLength;
-        private int mFilePointer = 0;
-        private int mCurrentPage = INVALID_PAGE;
-        private final byte[] mBuffer = new byte[PAGE_SIZE];
-
-        RandomAccessFileBuffer(final File file) {
-            mFile = file;
-            try {
-                mRandomAccessFile = new RandomAccessFile(file, "r");
-                final long fileLength = mRandomAccessFile.length();
-                if (fileLength > Integer.MAX_VALUE) {
-                    throw new RuntimeIOException("BAM index file " + mFile + " is too large: " + fileLength);
-                }
-                mFileLength = (int) fileLength;
-            } catch (final IOException exc) {
-                throw new RuntimeIOException(exc.getMessage(), exc);
-            }
-        }
-
-        @Override
-        void readBytes(final byte[] bytes) {
-            int resultOffset = 0;
-            int resultLength = bytes.length;
-            if (mFilePointer + resultLength > mFileLength) {
-                throw new RuntimeIOException("Attempt to read past end of BAM index file (file is truncated?): " + mFile);
-            }
-            while (resultLength > 0) {
-                loadPage(mFilePointer);
-                final int pageOffset = mFilePointer & PAGE_OFFSET_MASK;
-                final int copyLength = Math.min(resultLength, PAGE_SIZE - pageOffset);
-                System.arraycopy(mBuffer, pageOffset, bytes, resultOffset, copyLength);
-                mFilePointer += copyLength;
-                resultOffset += copyLength;
-                resultLength -= copyLength;
-            }
-        }
-
-        @Override
-        int readInteger() {
-            // This takes advantage of the fact that integers in BAM index files are always 4-byte aligned.
-            loadPage(mFilePointer);
-            final int pageOffset = mFilePointer & PAGE_OFFSET_MASK;
-            mFilePointer += 4;
-            return((mBuffer[pageOffset + 0] & 0xFF) |
-                   ((mBuffer[pageOffset + 1] & 0xFF) << 8) | 
-                   ((mBuffer[pageOffset + 2] & 0xFF) << 16) |
-                   ((mBuffer[pageOffset + 3] & 0xFF) << 24));
-        }
-
-        @Override
-        long readLong() {
-            // BAM index files are always 4-byte aligned, but not necessrily 8-byte aligned.
-            // So, rather than fooling with complex page logic we simply read the long in two 4-byte chunks.
-            final long lower = readInteger();
-            final long upper = readInteger();
-            return ((upper << 32) | (lower & 0xFFFFFFFFL));
-        }
-
-        @Override
-        void skipBytes(final int count) {
-            mFilePointer += count;
-        }
-        
-        @Override
-        void seek(final int position) {
-            mFilePointer = position;
-        }
-        
-        @Override
-		int position() {
-			return mFilePointer;
-		}
-
-        @Override
-        void close() {
-            mFilePointer = 0;
-            mCurrentPage = INVALID_PAGE;
-            if (mRandomAccessFile != null) {
-                try {
-                    mRandomAccessFile.close();
-                } catch (final IOException exc) {
-                    throw new RuntimeIOException(exc.getMessage(), exc);
-                }
-                mRandomAccessFile = null;
-            }
-        }
-
-        private void loadPage(final int filePosition) {
-            final int page = filePosition & PAGE_MASK;
-            if (page == mCurrentPage) {
-                return;
-            }
-            try {
-                mRandomAccessFile.seek(page);
-                final int readLength = Math.min(mFileLength - page, PAGE_SIZE);
-                mRandomAccessFile.readFully(mBuffer, 0, readLength);
-                mCurrentPage = page;
-            } catch (final IOException exc) {
-                throw new RuntimeIOException("Exception reading BAM index file " + mFile + ": " + exc.getMessage(), exc);
-            }
-        }
-    }
-
-    static class IndexStreamBuffer extends IndexFileBuffer {
-        private final SeekableStream in;
-        private final ByteBuffer tmpBuf;
-
-        /** Continually reads from the provided {@link SeekableStream} into the buffer until the specified number of bytes are read, or
-         * until the stream is exhausted, throwing a {@link RuntimeIOException}. */
-        private static void readFully(final SeekableStream in, final byte[] buffer, final int offset, final int length) {
-            int read = 0;
-            while (read < length) {
-                final int readThisLoop;
-                try {
-                    readThisLoop = in.read(buffer, read, length - read);
-                } catch (final IOException e) {
-                    throw new RuntimeIOException(e);
-                }
-                if (readThisLoop == -1) break;
-                read += readThisLoop;
-            }
-            if (read != length) throw new RuntimeIOException("Expected to read " + length + " bytes, but expired stream after " + read + ".");
-        }
-
-        public IndexStreamBuffer(final SeekableStream s) {
-            in = s;
-            tmpBuf = ByteBuffer.allocate(8); // Enough to fit a long.
-            tmpBuf.order(ByteOrder.LITTLE_ENDIAN);
-        }
-
-        @Override
-        public void close() {
-            try { in.close(); }
-            catch (final IOException e) { throw new RuntimeIOException(e); }
-        }
-        
-        @Override
-        public void readBytes(final byte[] bytes) {
-            readFully(in, bytes, 0, bytes.length);
-        }
-        
-        @Override
-        public void seek(final int position) {
-            try { in.seek(position); }
-            catch (final IOException e) { throw new RuntimeIOException(e); }
-        }
-
-        @Override
-        public int readInteger() {
-            readFully(in, tmpBuf.array(), 0, 4);
-            return tmpBuf.getInt(0);
-        }
-        
-        @Override
-        public long readLong() {
-            readFully(in, tmpBuf.array(), 0, 8);
-            return tmpBuf.getLong(0);
-        }
-        
-        @Override
-        public void skipBytes(final int count) {
-            try {
-                for (int s = count; s > 0;) {
-                    final int skipped = (int)in.skip(s);
-                    if (skipped <= 0)
-                        throw new RuntimeIOException("Failed to skip " + s);
-                    s -= skipped;
-                }
-            } catch (final IOException e) { throw new RuntimeIOException(e); }
-        }
-        
-        @Override
-        public int position() {
-			try {
-				return (int) in.position();
-			} catch (final IOException e) { throw new RuntimeIOException(e); }
-		}
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/AbstractSAMHeaderRecord.java b/src/main/java/htsjdk/samtools/AbstractSAMHeaderRecord.java
deleted file mode 100644
index 769a7a7..0000000
--- a/src/main/java/htsjdk/samtools/AbstractSAMHeaderRecord.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.bind.annotation.XmlTransient;
-
-/**
- * Base class for the various concrete records in a SAM header, providing uniform
- * access to the attributes.
- */
- at XmlTransient /* don't consider this class for XML-serialization */
-public abstract class AbstractSAMHeaderRecord implements Serializable {
-    public static final long serialVersionUID = 1L;
-
-    private final Map<String,String> mAttributes = new LinkedHashMap<String, String>();
-
-    public String getAttribute(final String key) {
-        return mAttributes.get(key);
-    }
-
-    /**
-     * Set the given value for the attribute named 'key'.  Replaces an existing value, if any.
-     * If value is null, the attribute is removed.
-     * Otherwise, the value will be converted to a String with toString.
-     * @param key attribute name
-     * @param value attribute value
-     * @deprecated Use {@link #setAttribute(String, String) instead
-     */
-    @Deprecated
-    public void setAttribute(final String key, final Object value) {
-        setAttribute(key, value == null? null: value.toString());
-    }
-
-    /**
-     * Set the given value for the attribute named 'key'.  Replaces an existing value, if any.
-     * If value is null, the attribute is removed.
-     * Supported types are Character, Integer, Float and String.  Byte and Short may also be
-     * passed in but they will be converted to Integer.
-     * @param key attribute name
-     * @param value attribute value
-     */
-    public void setAttribute(final String key, final String value) {
-        if (value == null) {
-            mAttributes.remove(key);
-        } else {
-            mAttributes.put(key, value);
-        }
-    }
-    /**
-     * Returns the Set of attributes.
-     */
-    public Set<Map.Entry<String,String>> getAttributes() {
-        return mAttributes.entrySet();
-    }
-
-
-    /**
-     * Returns the ID tag (or equivalent) for this header record. The
-     * default implementation throws a SAMException to indicate "not implemented".
-     */
-    public String getId() {
-        throw new UnsupportedOperationException("Method not implemented for: " + this.getClass());
-    }
-
-    /**
-     * For use in the equals() method of the concrete class.
-     */
-    protected boolean attributesEqual(final AbstractSAMHeaderRecord that) {
-        return mAttributes.equals(that.mAttributes);
-    }
-
-    /**
-     * For use in the hashCode() method of the concrete class.
-     */
-    protected int attributesHashCode() {
-        return (mAttributes != null ? mAttributes.hashCode() : 0);
-    }
-
-    /**
-     * Standard tags are the tags defined in SAM spec.  These do not have type information in the test
-     * representation, because the type information is predefined for each tag.
-     * @return list of predefined tags for the concrete SAMHeader record type.
-     */
-    abstract Set<String> getStandardTags();
-
-    /** Simple to String that outputs the concrete class name and the set of attributes stored. */
-    @Override public String toString() {
-        return getClass().getSimpleName() + this.mAttributes.toString();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/AlignmentBlock.java b/src/main/java/htsjdk/samtools/AlignmentBlock.java
deleted file mode 100644
index 1320dfd..0000000
--- a/src/main/java/htsjdk/samtools/AlignmentBlock.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-
-/**
- * Represents the contiguous alignment of a subset of read bases to a reference
- * sequence. Simply put an alignment block tells you that read bases from
- * readStart are aligned to the reference (matching or mismatching) from
- * referenceStart for length bases.
- *
- * @author Tim Fennell
- */
-public class AlignmentBlock implements Serializable {
-    public static final long serialVersionUID = 1L;
-
-    private int readStart;
-    private int referenceStart;
-    private int length;
-
-    /** Constructs a new alignment block with the supplied read and ref starts and length. */
-    AlignmentBlock(int readStart, int referenceStart, int length) {
-        this.readStart = readStart;
-        this.referenceStart = referenceStart;
-        this.length = length;
-    }
-
-    /** The first, 1-based, base in the read that is aligned to the reference reference. */
-    public int getReadStart() { return readStart; }
-
-    /** The first, 1-based, position in the reference to which the read is aligned. */
-    public int getReferenceStart() { return referenceStart; }
-
-    /** The number of contiguous bases aligned to the reference. */
-    public int getLength() { return length; }
-}
diff --git a/src/main/java/htsjdk/samtools/AsyncSAMFileWriter.java b/src/main/java/htsjdk/samtools/AsyncSAMFileWriter.java
deleted file mode 100644
index ab5b8d0..0000000
--- a/src/main/java/htsjdk/samtools/AsyncSAMFileWriter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.AbstractAsyncWriter;
-import htsjdk.samtools.util.ProgressLoggerInterface;
-
-/**
- * SAMFileWriter that can be wrapped around an underlying SAMFileWriter to provide asynchronous output. Records
- * added are placed into a queue, the queue is then drained into the underlying SAMFileWriter by a thread owned
- * by the instance.
- *
- * Exceptions experienced by the writer thread will be emitted back to the caller in subsequent calls to either
- * addAlignment() or close().
- *
- * @author Tim Fennell
- */
-class AsyncSAMFileWriter extends AbstractAsyncWriter<SAMRecord> implements SAMFileWriter {
-
-    private final SAMFileWriter underlyingWriter;
-
-    /**
-     * Creates a new AsyncSAMFileWriter wrapping the provided SAMFileWriter.
-     */
-    public AsyncSAMFileWriter(final SAMFileWriter out) {
-        this(out, DEFAULT_QUEUE_SIZE);
-    }
-
-    /**
-     * Creates an AsyncSAMFileWriter wrapping the provided SAMFileWriter and using the specified
-     * queue size for buffer SAMRecords.
-     */
-    public AsyncSAMFileWriter(final SAMFileWriter out, final int queueSize) {
-        super(queueSize);
-        this.underlyingWriter = out;
-    }
-
-    @Override protected void synchronouslyWrite(final SAMRecord item) { this.underlyingWriter.addAlignment(item); }
-
-    @Override protected void synchronouslyClose() { this.underlyingWriter.close();  }
-
-    @Override protected final String getThreadNamePrefix() { return "SAMFileWriterThread-"; }
-
-	@Override
-	public void setProgressLogger(final ProgressLoggerInterface progress) {
-		this.underlyingWriter.setProgressLogger(progress);
-	}
-
-    /**
-     * Adds an alignment to the queue to be written.  Will re-throw any exception that was received when
-     * writing prior record(s) to the underlying SAMFileWriter.
-     */
-    public void addAlignment(final SAMRecord alignment) {
-        write(alignment);
-    }
-
-    /** Returns the SAMFileHeader from the underlying SAMFileWriter. */
-    public SAMFileHeader getFileHeader() {
-        return this.underlyingWriter.getFileHeader();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMFileConstants.java b/src/main/java/htsjdk/samtools/BAMFileConstants.java
deleted file mode 100644
index be0f36d..0000000
--- a/src/main/java/htsjdk/samtools/BAMFileConstants.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Constants used in reading & writing BAM files
- */
-class BAMFileConstants {
-    /**
-     * The beginning of a BAMRecord is a fixed-size block of 8 int32s
-     */
-    static final int FIXED_BLOCK_SIZE = 8 * 4;
-
-    /**
-     * BAM file magic number.  This is what is present in the gunzipped version of the file,
-     * which never exists on disk.
-     */
-
-    static final byte[] BAM_MAGIC = "BAM\1".getBytes();
-    /**
-     * BAM index file magic number.
-     */
-    static final byte[] BAM_INDEX_MAGIC = "BAI\1".getBytes();
-}
diff --git a/src/main/java/htsjdk/samtools/BAMFileReader.java b/src/main/java/htsjdk/samtools/BAMFileReader.java
deleted file mode 100644
index 98bb74f..0000000
--- a/src/main/java/htsjdk/samtools/BAMFileReader.java
+++ /dev/null
@@ -1,913 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.StringLineReader;
-
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * Class for reading and querying BAM files.
- */
-class BAMFileReader extends SamReader.ReaderImplementation {
-    // True if reading from a File rather than an InputStream
-    private boolean mIsSeekable = false;
-
-    // For converting bytes into other primitive types
-    private BinaryCodec mStream = null;
-
-    // Underlying compressed data stream.
-    private final BlockCompressedInputStream mCompressedInputStream;
-    private SAMFileHeader mFileHeader = null;
-
-    // One of these is populated if the file is seekable and an index exists
-    private File mIndexFile = null;
-    private SeekableStream mIndexStream = null;
-
-    private BAMIndex mIndex = null;
-    private long mFirstRecordPointer = 0;
-    // If non-null, there is an unclosed iterator extant.
-    private CloseableIterator<SAMRecord> mCurrentIterator = null;
-
-    // If true, all SAMRecords are fully decoded as they are read.
-    private boolean eagerDecode;
-
-    // If true, the BAMFileReader will use asynchronous IO.
-    // Note: this field currently has no effect (is not hooked up anywhere), but will be in the future. See https://github.com/samtools/htsjdk/pull/576
-    private final boolean useAsynchronousIO;
-
-    // For error-checking.
-    private ValidationStringency mValidationStringency;
-
-    // For creating BAMRecords
-    private SAMRecordFactory samRecordFactory;
-
-    /**
-     * Use the caching index reader implementation rather than the disk-hit-per-file model.
-     */
-    private boolean mEnableIndexCaching = false;
-
-    /**
-     * Use the traditional memory-mapped implementation for BAM file indexes rather than regular I/O.
-     */
-    private boolean mEnableIndexMemoryMapping = true;
-
-    /**
-     * Add information about the origin (reader and position) to SAM records.
-     */
-    private SamReader mReader = null;
-
-    /**
-     * Prepare to read BAM from a stream (not seekable)
-     * @param stream source of bytes.
-     * @param eagerDecode if true, decode all BAM fields as reading rather than lazily.
-     * @param validationStringency Controls how to handle invalidate reads or header lines.
-     */
-    BAMFileReader(final InputStream stream,
-                  final File indexFile,
-                  final boolean eagerDecode,
-                  final boolean useAsynchronousIO,
-                  final ValidationStringency validationStringency,
-                  final SAMRecordFactory factory)
-        throws IOException {
-        mIndexFile = indexFile;
-        mIsSeekable = false;
-        this.useAsynchronousIO = useAsynchronousIO;
-        mCompressedInputStream = new BlockCompressedInputStream(stream);
-        mStream = new BinaryCodec(new DataInputStream(mCompressedInputStream));
-        this.eagerDecode = eagerDecode;
-        this.mValidationStringency = validationStringency;
-        this.samRecordFactory = factory;
-        this.mFileHeader = readHeader(this.mStream, this.mValidationStringency, null);
-    }
-
-    /**
-     * Prepare to read BAM from a file (seekable)
-     * @param file source of bytes.
-     * @param eagerDecode if true, decode all BAM fields as reading rather than lazily.
-     * @param validationStringency Controls how to handle invalidate reads or header lines.
-     */
-    BAMFileReader(final File file,
-                  final File indexFile,
-                  final boolean eagerDecode,
-                  final boolean useAsynchronousIO,
-                  final ValidationStringency validationStringency,
-                  final SAMRecordFactory factory)
-        throws IOException {
-        this(new BlockCompressedInputStream(file), indexFile!=null ? indexFile : SamFiles.findIndex(file), eagerDecode, useAsynchronousIO, file.getAbsolutePath(), validationStringency, factory);
-        if (mIndexFile != null && mIndexFile.lastModified() < file.lastModified()) {
-            System.err.println("WARNING: BAM index file " + mIndexFile.getAbsolutePath() +
-                    " is older than BAM " + file.getAbsolutePath());
-        }
-        // Provide better error message when there is an error reading.
-        mStream.setInputFileName(file.getAbsolutePath());
-    }
-
-    BAMFileReader(final SeekableStream strm,
-                  final File indexFile,
-                  final boolean eagerDecode,
-                  final boolean useAsynchronousIO,
-                  final ValidationStringency validationStringency,
-                  final SAMRecordFactory factory)
-        throws IOException {
-        this(new BlockCompressedInputStream(strm), indexFile, eagerDecode, useAsynchronousIO, strm.getSource(), validationStringency, factory);
-    }
-
-    BAMFileReader(final SeekableStream strm,
-                  final SeekableStream indexStream,
-                  final boolean eagerDecode,
-                  final boolean useAsynchronousIO,
-                  final ValidationStringency validationStringency,
-                  final SAMRecordFactory factory)
-        throws IOException {
-        this(new BlockCompressedInputStream(strm), indexStream, eagerDecode, useAsynchronousIO, strm.getSource(), validationStringency, factory);
-    }
-
-    private BAMFileReader(final BlockCompressedInputStream compressedInputStream,
-                          final File indexFile,
-                          final boolean eagerDecode,
-                          final boolean useAsynchronousIO,
-                          final String source,
-                          final ValidationStringency validationStringency,
-                          final SAMRecordFactory factory)
-        throws IOException {
-        mIndexFile = indexFile;
-        mIsSeekable = true;
-        mCompressedInputStream = compressedInputStream;
-        mStream = new BinaryCodec(new DataInputStream(mCompressedInputStream));
-        this.eagerDecode = eagerDecode;
-        this.useAsynchronousIO = useAsynchronousIO;
-        this.mValidationStringency = validationStringency;
-        this.samRecordFactory = factory;
-        this.mFileHeader = readHeader(this.mStream, this.mValidationStringency, source);
-        mFirstRecordPointer = mCompressedInputStream.getFilePointer();
-    }    
-
-    private BAMFileReader(final BlockCompressedInputStream compressedInputStream,
-                          final SeekableStream indexStream,
-                          final boolean eagerDecode,
-                          final boolean useAsynchronousIO,
-                          final String source,
-                          final ValidationStringency validationStringency,
-                          final SAMRecordFactory factory)
-        throws IOException {
-        mIndexStream = indexStream;
-        mIsSeekable = true;
-        mCompressedInputStream = compressedInputStream;
-        mStream = new BinaryCodec(new DataInputStream(mCompressedInputStream));
-        this.eagerDecode = eagerDecode;
-        this.useAsynchronousIO = useAsynchronousIO;
-        this.mValidationStringency = validationStringency;
-        this.samRecordFactory = factory;
-        this.mFileHeader = readHeader(this.mStream, this.mValidationStringency, source);
-        mFirstRecordPointer = mCompressedInputStream.getFilePointer();
-    }
-
-    /** Reads through the header and sequence records to find the virtual file offset of the first record in the BAM file. */
-    static long findVirtualOffsetOfFirstRecord(final File bam) throws IOException {
-        final BAMFileReader reader = new BAMFileReader(bam, null, false, false, ValidationStringency.SILENT, new DefaultSAMRecordFactory());
-        final long offset = reader.mFirstRecordPointer;
-        reader.close();
-        return offset;
-    }
-
-    /**
-     * If true, writes the source of every read into the source SAMRecords.
-     * @param enabled true to write source information into each SAMRecord.
-     */
-    void enableFileSource(final SamReader reader, final boolean enabled) {
-        this.mReader = enabled ? reader : null;
-    }
-
-    /**
-     * If true, uses the caching version of the index reader.
-     * @param enabled true to use the caching version of the reader.
-     */
-    protected void enableIndexCaching(final boolean enabled) {
-        if(mIndex != null)
-            throw new SAMException("Unable to turn on index caching; index file has already been loaded.");
-        this.mEnableIndexCaching = enabled;
-    }
-
-    /**
-     * If false, disable the use of memory mapping for accessing index files (default behavior is to use memory mapping).
-     * This is slower but more scalable when accessing large numbers of BAM files sequentially.
-     * @param enabled True to use memory mapping, false to use regular I/O.
-     */
-    protected void enableIndexMemoryMapping(final boolean enabled) {
-        if (mIndex != null) {
-            throw new SAMException("Unable to change index memory mapping; index file has already been loaded.");
-        }
-        this.mEnableIndexMemoryMapping = enabled;
-    }
-
-    @Override void enableCrcChecking(final boolean enabled) {
-        this.mCompressedInputStream.setCheckCrcs(enabled);
-    }
-
-    @Override void setSAMRecordFactory(final SAMRecordFactory factory) { this.samRecordFactory = factory; }
-
-    @Override
-    public SamReader.Type type() {
-        return SamReader.Type.BAM_TYPE;
-    }
-
-    /**
-     * @return true if ths is a BAM file, and has an index
-     */
-    public boolean hasIndex() {
-        return mIsSeekable && ((mIndexFile != null) || (mIndexStream != null));
-    }
-
-    /**
-     * Retrieves the index for the given file type.  Ensure that the index is of the specified type.
-     * @return An index of the given type.
-     */
-    public BAMIndex getIndex() {
-        if(!hasIndex())
-            throw new SAMException("No index is available for this BAM file.");
-        if(mIndex == null) {
-            if (mIndexFile != null)
-                mIndex = mEnableIndexCaching ? new CachingBAMFileIndex(mIndexFile, getFileHeader().getSequenceDictionary(), mEnableIndexMemoryMapping)
-                                             : new DiskBasedBAMFileIndex(mIndexFile, getFileHeader().getSequenceDictionary(), mEnableIndexMemoryMapping);
-            else
-                mIndex = mEnableIndexCaching ? new CachingBAMFileIndex(mIndexStream, getFileHeader().getSequenceDictionary())
-                                             : new DiskBasedBAMFileIndex(mIndexStream, getFileHeader().getSequenceDictionary());
-        }
-        return mIndex;
-    }
-
-    public void setEagerDecode(final boolean desired) { this.eagerDecode = desired; }
-
-    @Override
-    public void close() {
-        if (mCompressedInputStream != null) {
-            try {
-                mCompressedInputStream.close();
-            } catch (IOException e) {
-                throw new RuntimeIOException("Exception closing compressed input stream.", e);
-            }
-        }
-        if (mStream != null) {
-            mStream.close();
-        }
-        if (mIndex != null) {
-            mIndex.close();
-        }
-        mStream = null;
-        mFileHeader = null;
-        mIndex = null;
-    }
-
-    public SAMFileHeader getFileHeader() {
-        return mFileHeader;
-    }
-
-    /**
-     * Set error-checking level for subsequent SAMRecord reads.
-     */
-    void setValidationStringency(final ValidationStringency validationStringency) {
-        this.mValidationStringency = validationStringency;
-    }
-
-    public ValidationStringency getValidationStringency() {
-        return this.mValidationStringency;
-    }
-
-    /**
-     * Prepare to iterate through the SAMRecords in file order.
-     * Only a single iterator on a BAM file can be extant at a time.  If getIterator() or a query method has been called once,
-     * that iterator must be closed before getIterator() can be called again.
-     * A somewhat peculiar aspect of this method is that if the file is not seekable, a second call to
-     * getIterator() begins its iteration where the last one left off.  That is the best that can be
-     * done in that situation.
-     */
-    public CloseableIterator<SAMRecord> getIterator() {
-        if (mStream == null) {
-            throw new IllegalStateException("File reader is closed");
-        }
-        if (mCurrentIterator != null) {
-            throw new IllegalStateException("Iteration in progress");
-        }
-        if (mIsSeekable) {
-            try {
-                mCompressedInputStream.seek(mFirstRecordPointer);
-            } catch (final IOException exc) {
-                throw new RuntimeIOException(exc.getMessage(), exc);
-            }
-        }
-        mCurrentIterator = new BAMFileIterator();
-        return mCurrentIterator;
-    }
-
-    @Override
-    public CloseableIterator<SAMRecord> getIterator(final SAMFileSpan chunks) {
-        if (mStream == null) {
-            throw new IllegalStateException("File reader is closed");
-        }
-        if (mCurrentIterator != null) {
-            throw new IllegalStateException("Iteration in progress");
-        }
-        if (!(chunks instanceof BAMFileSpan)) {
-            throw new IllegalStateException("BAMFileReader cannot handle this type of file span.");
-        }
-
-        // Create an iterator over the given chunk boundaries.
-        mCurrentIterator = new BAMFileIndexIterator(((BAMFileSpan)chunks).toCoordinateArray());
-        return mCurrentIterator;
-    }
-
-    /**
-     * Gets an unbounded pointer to the first record in the BAM file.  Because the reader doesn't necessarily know
-     * when the file ends, the rightmost bound of the file pointer will not end exactly where the file ends.  However,
-     * the rightmost bound is guaranteed to be after the last read in the file.
-     * @return An unbounded pointer to the first record in the BAM file.
-     */
-    @Override
-    public SAMFileSpan getFilePointerSpanningReads() {
-        return new BAMFileSpan(new Chunk(mFirstRecordPointer,Long.MAX_VALUE));
-    }
-
-    /**
-     * Prepare to iterate through the SAMRecords that match the given interval.
-     * Only a single iterator on a BAMFile can be extant at a time.  The previous one must be closed
-     * before calling any of the methods that return an iterator.
-     *
-     * Note that an unmapped SAMRecord may still have a reference name and an alignment start for sorting
-     * purposes (typically this is the coordinate of its mate), and will be found by this method if the coordinate
-     * matches the specified interval.
-     *
-     * Note that this method is not necessarily efficient in terms of disk I/O.  The index does not have perfect
-     * resolution, so some SAMRecords may be read and then discarded because they do not match the specified interval.
-     *
-     * @param sequence Reference sequence sought.
-     * @param start Desired SAMRecords must overlap or be contained in the interval specified by start and end.
-     * A value of zero implies the start of the reference sequence.
-     * @param end A value of zero implies the end of the reference sequence.
-     * @param contained If true, the alignments for the SAMRecords must be completely contained in the interval
-     * specified by start and end.  If false, the SAMRecords need only overlap the interval.
-     * @return Iterator for the matching SAMRecords
-     */
-    CloseableIterator<SAMRecord> query(final String sequence, final int start, final int end, final boolean contained) {
-        if (mStream == null) {
-            throw new IllegalStateException("File reader is closed");
-        }
-        if (mCurrentIterator != null) {
-            throw new IllegalStateException("Iteration in progress");
-        }
-        if (!mIsSeekable) {
-            throw new UnsupportedOperationException("Cannot query stream-based BAM file");
-        }
-        final int referenceIndex = mFileHeader.getSequenceIndex(sequence);
-        if (referenceIndex == -1) {
-            mCurrentIterator = new EmptyBamIterator();
-        } else {
-            final QueryInterval[] queryIntervals = {new QueryInterval(referenceIndex, start, end)};
-            mCurrentIterator = createIndexIterator(queryIntervals, contained);
-        }
-        return mCurrentIterator;
-    }
-
-    /**
-     * Prepare to iterate through the SAMRecords that match any of the given intervals.
-     * Only a single iterator on a BAMFile can be extant at a time.  The previous one must be closed
-     * before calling any of the methods that return an iterator.
-     *
-     * Note that an unmapped SAMRecord may still have a reference name and an alignment start for sorting
-     * purposes (typically this is the coordinate of its mate), and will be found by this method if the coordinate
-     * matches the specified interval.
-     *
-     * Note that this method is not necessarily efficient in terms of disk I/O.  The index does not have perfect
-     * resolution, so some SAMRecords may be read and then discarded because they do not match the specified interval.
-     *
-     * @param intervals list of intervals to be queried.  Must be optimized.
-     * @param contained If true, the alignments for the SAMRecords must be completely contained in the interval
-     * specified by start and end.  If false, the SAMRecords need only overlap the interval.
-     * @return Iterator for the matching SAMRecords
-     * @see QueryInterval#optimizeIntervals(QueryInterval[])
-     */
-    public CloseableIterator<SAMRecord> query(final QueryInterval[] intervals, final boolean contained) {
-        if (mStream == null) {
-            throw new IllegalStateException("File reader is closed");
-        }
-        if (mCurrentIterator != null) {
-            throw new IllegalStateException("Iteration in progress");
-        }
-        if (!mIsSeekable) {
-            throw new UnsupportedOperationException("Cannot query stream-based BAM file");
-        }
-        mCurrentIterator = createIndexIterator(intervals, contained);
-        return mCurrentIterator;
-    }
-
-    /**
-     * Prepare to iterate through the SAMRecords with the given alignment start.
-     * Only a single iterator on a BAMFile can be extant at a time.  The previous one must be closed
-     * before calling any of the methods that return an iterator.
-     *
-     * Note that an unmapped SAMRecord may still have a reference name and an alignment start for sorting
-     * purposes (typically this is the coordinate of its mate), and will be found by this method if the coordinate
-     * matches the specified interval.
-     *
-     * Note that this method is not necessarily efficient in terms of disk I/O.  The index does not have perfect
-     * resolution, so some SAMRecords may be read and then discarded because they do not match the specified interval.
-     *
-     * @param sequence Reference sequence sought.
-     * @param start Alignment start sought.
-     * @return Iterator for the matching SAMRecords.
-     */
-    public CloseableIterator<SAMRecord> queryAlignmentStart(final String sequence, final int start) {
-        if (mStream == null) {
-            throw new IllegalStateException("File reader is closed");
-        }
-        if (mCurrentIterator != null) {
-            throw new IllegalStateException("Iteration in progress");
-        }
-        if (!mIsSeekable) {
-            throw new UnsupportedOperationException("Cannot query stream-based BAM file");
-        }
-        final int referenceIndex = mFileHeader.getSequenceIndex(sequence);
-        if (referenceIndex == -1) {
-            mCurrentIterator = new EmptyBamIterator();
-        } else {
-            mCurrentIterator = createStartingAtIndexIterator(referenceIndex, start);
-        }
-        return mCurrentIterator;
-    }
-
-    /**
-     * Prepare to iterate through the SAMRecords that are unmapped and do not have a reference name or alignment start.
-     * Only a single iterator on a BAMFile can be extant at a time.  The previous one must be closed
-     * before calling any of the methods that return an iterator.
-     *
-     * @return Iterator for the matching SAMRecords.
-     */
-    public CloseableIterator<SAMRecord> queryUnmapped() {
-        if (mStream == null) {
-            throw new IllegalStateException("File reader is closed");
-        }
-        if (mCurrentIterator != null) {
-            throw new IllegalStateException("Iteration in progress");
-        }
-        if (!mIsSeekable) {
-            throw new UnsupportedOperationException("Cannot query stream-based BAM file");
-        }
-        try {
-            final long startOfLastLinearBin = getIndex().getStartOfLastLinearBin();
-            if (startOfLastLinearBin != -1) {
-                mCompressedInputStream.seek(startOfLastLinearBin);
-            } else {
-                // No mapped reads in file, just start at the first read in file.
-                mCompressedInputStream.seek(mFirstRecordPointer);
-            }
-            mCurrentIterator = new BAMFileIndexUnmappedIterator();
-            return mCurrentIterator;
-        } catch (final IOException e) {
-            throw new RuntimeIOException("IOException seeking to unmapped reads", e);
-        }
-    }
-
-    /**
-     * Reads the header of a BAM file from a stream
-     * @param stream A BinaryCodec to read the header from
-     * @param validationStringency Determines how stringent to be when validating the sam
-     * @param source Note that this is used only for reporting errors.
-     */
-    protected static SAMFileHeader readHeader(final BinaryCodec stream, final ValidationStringency validationStringency, final String source)
-        throws IOException {
-
-        final byte[] buffer = new byte[4];
-        stream.readBytes(buffer);
-        if (!Arrays.equals(buffer, BAMFileConstants.BAM_MAGIC)) {
-            throw new IOException("Invalid BAM file header");
-        }
-
-        final int headerTextLength = stream.readInt();
-        final String textHeader = stream.readString(headerTextLength);
-        final SAMTextHeaderCodec headerCodec = new SAMTextHeaderCodec();
-        headerCodec.setValidationStringency(validationStringency);
-        final SAMFileHeader samFileHeader = headerCodec.decode(new StringLineReader(textHeader),
-                source);
-
-        final int sequenceCount = stream.readInt();
-        if (!samFileHeader.getSequenceDictionary().isEmpty()) {
-            // It is allowed to have binary sequences but no text sequences, so only validate if both are present
-            if (sequenceCount != samFileHeader.getSequenceDictionary().size()) {
-                throw new SAMFormatException("Number of sequences in text header (" +
-                        samFileHeader.getSequenceDictionary().size() +
-                        ") != number of sequences in binary header (" + sequenceCount + ") for file " + source);
-            }
-            for (int i = 0; i < sequenceCount; i++) {
-                final SAMSequenceRecord binarySequenceRecord = readSequenceRecord(stream, source);
-                final SAMSequenceRecord sequenceRecord = samFileHeader.getSequence(i);
-                if (!sequenceRecord.getSequenceName().equals(binarySequenceRecord.getSequenceName())) {
-                    throw new SAMFormatException("For sequence " + i + ", text and binary have different names in file " +
-                            source);
-                }
-                if (sequenceRecord.getSequenceLength() != binarySequenceRecord.getSequenceLength()) {
-                    throw new SAMFormatException("For sequence " + i + ", text and binary have different lengths in file " +
-                            source);
-                }
-            }
-        } else {
-            // If only binary sequences are present, copy them into samFileHeader
-            final List<SAMSequenceRecord> sequences = new ArrayList<SAMSequenceRecord>(sequenceCount);
-            for (int i = 0; i < sequenceCount; i++) {
-                sequences.add(readSequenceRecord(stream, source));
-            }
-            samFileHeader.setSequenceDictionary(new SAMSequenceDictionary(sequences));
-        }
-
-        return samFileHeader;
-    }
-
-    /**
-     * Reads a single binary sequence record from the file or stream
-     * @param source Note that this is used only for reporting errors.
-     */
-    private static SAMSequenceRecord readSequenceRecord(final BinaryCodec stream, final String source) {
-        final int nameLength = stream.readInt();
-        if (nameLength <= 1) {
-            throw new SAMFormatException("Invalid BAM file header: missing sequence name in file " + source);
-        }
-        final String sequenceName = stream.readString(nameLength - 1);
-        // Skip the null terminator
-        stream.readByte();
-        final int sequenceLength = stream.readInt();
-        return new SAMSequenceRecord(SAMSequenceRecord.truncateSequenceName(sequenceName), sequenceLength);
-    }
-
-    /**
-     * Encapsulates the restriction that only one iterator may be open at a time.
-     */
-    private abstract class AbstractBamIterator implements CloseableIterator<SAMRecord> {
-
-        private boolean isClosed = false;
-
-        public void close() {
-            if (!isClosed) {
-                if (mCurrentIterator != null && this != mCurrentIterator) {
-                    throw new IllegalStateException("Attempt to close non-current iterator");
-                }
-                mCurrentIterator = null;
-                isClosed = true;
-            }
-        }
-
-        protected void assertOpen() {
-            if (isClosed) throw new AssertionError("Iterator has been closed");
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException("Not supported: remove");
-        }
-
-    }
-
-    private class EmptyBamIterator extends AbstractBamIterator {
-        @Override
-        public boolean hasNext() {
-            return false;
-        }
-
-        @Override
-        public SAMRecord next() {
-            throw new NoSuchElementException("next called on empty iterator");
-        }
-    }
-
-    /**
-
-    /**
-     * Iterator for non-indexed sequential iteration through all SAMRecords in file.
-     * Starting point of iteration is wherever current file position is when the iterator is constructed.
-     */
-    private class BAMFileIterator extends AbstractBamIterator {
-        private SAMRecord mNextRecord = null;
-        private final BAMRecordCodec bamRecordCodec;
-        private long samRecordIndex = 0; // Records at what position (counted in records) we are at in the file
-
-        BAMFileIterator() {
-            this(true);
-        }
-
-        /**
-         * @param advance Trick to enable subclass to do more setup before advancing
-         */
-        BAMFileIterator(final boolean advance) {
-            this.bamRecordCodec = new BAMRecordCodec(getFileHeader(), samRecordFactory);
-            this.bamRecordCodec.setInputStream(BAMFileReader.this.mStream.getInputStream(),
-                    BAMFileReader.this.mStream.getInputFileName());
-
-            if (advance) {
-                advance();
-            }
-        }
-
-        public boolean hasNext() {
-            assertOpen();
-            return (mNextRecord != null);
-        }
-
-        public SAMRecord next() {
-            assertOpen();
-            final SAMRecord result = mNextRecord;
-            advance();
-            return result;
-        }
-
-        void advance() {
-            try {
-                mNextRecord = getNextRecord();
-
-                if (mNextRecord != null) {
-                    ++this.samRecordIndex;
-                    // Because some decoding is done lazily, the record needs to remember the validation stringency.
-                    mNextRecord.setValidationStringency(mValidationStringency);
-
-                    if (mValidationStringency != ValidationStringency.SILENT) {
-                        final List<SAMValidationError> validationErrors = mNextRecord.isValid(mValidationStringency == ValidationStringency.STRICT);
-                        SAMUtils.processValidationErrors(validationErrors,
-                                this.samRecordIndex, BAMFileReader.this.getValidationStringency());
-                    }
-                }
-                if (eagerDecode && mNextRecord != null) {
-                    mNextRecord.eagerDecode();
-                }
-            } catch (final IOException exc) {
-                throw new RuntimeIOException(exc.getMessage(), exc);
-            }
-        }
-
-        /**
-         * Read the next record from the input stream.
-         */
-        SAMRecord getNextRecord() throws IOException {
-            final long startCoordinate = mCompressedInputStream.getFilePointer();
-            final SAMRecord next = bamRecordCodec.decode();
-            final long stopCoordinate = mCompressedInputStream.getFilePointer();
-
-            if(mReader != null && next != null)
-                next.setFileSource(new SAMFileSource(mReader,new BAMFileSpan(new Chunk(startCoordinate,stopCoordinate))));
-
-            return next;
-        }
-
-        /**
-         * @return The record that will be return by the next call to next()
-         */
-        protected SAMRecord peek() {
-            return mNextRecord;
-        }
-    }
-
-    /**
-     * Prepare to iterate through SAMRecords in the given reference that start exactly at the given start coordinate.
-     * @param referenceIndex Desired reference sequence.
-     * @param start 1-based alignment start.
-     */
-    private CloseableIterator<SAMRecord> createStartingAtIndexIterator(final int referenceIndex,
-                                                                       final int start) {
-
-        // Hit the index to determine the chunk boundaries for the required data.
-        final BAMIndex fileIndex = getIndex();
-        final BAMFileSpan fileSpan = fileIndex.getSpanOverlapping(referenceIndex, start, 0);
-        final long[] filePointers = fileSpan != null ? fileSpan.toCoordinateArray() : null;
-
-        // Create an iterator over the above chunk boundaries.
-        final BAMFileIndexIterator iterator = new BAMFileIndexIterator(filePointers);
-
-        // Add some preprocessing filters for edge-case reads that don't fit into this
-        // query type.
-        return new BAMQueryFilteringIterator(iterator,new BAMStartingAtIteratorFilter(referenceIndex,start));
-    }
-
-    /**
-     * @throws java.lang.IllegalArgumentException if the intervals are not optimized
-     * @see QueryInterval#optimizeIntervals(QueryInterval[])
-     */
-    private void assertIntervalsOptimized(final QueryInterval[] intervals) {
-        if (intervals.length == 0) return;
-        for (int i = 1; i < intervals.length; ++i) {
-        final QueryInterval prev = intervals[i-1];
-        final QueryInterval thisInterval = intervals[i];
-            if (prev.compareTo(thisInterval) >= 0) {
-                throw new IllegalArgumentException(String.format("List of intervals is not sorted: %s >= %s", prev, thisInterval));
-            }
-            if (prev.overlaps(thisInterval)) {
-                throw new IllegalArgumentException(String.format("List of intervals is not optimized: %s intersects %s", prev, thisInterval));
-            }
-            if (prev.abuts(thisInterval)) {
-                throw new IllegalArgumentException(String.format("List of intervals is not optimized: %s abuts %s", prev, thisInterval));
-            }
-        }
-    }
-
-    private CloseableIterator<SAMRecord> createIndexIterator(final QueryInterval[] intervals,
-                                                             final boolean contained) {
-
-        assertIntervalsOptimized(intervals);
-
-        // Hit the index to determine the chunk boundaries for the required data.
-        final BAMFileSpan[] inputSpans = new BAMFileSpan[intervals.length];
-        final BAMIndex fileIndex = getIndex();
-        for (int i = 0; i < intervals.length; ++i) {
-            final QueryInterval interval = intervals[i];
-            final BAMFileSpan span = fileIndex.getSpanOverlapping(interval.referenceIndex, interval.start, interval.end);
-            inputSpans[i] = span;
-        }
-        final long[] filePointers;
-        if (inputSpans.length > 0) {
-            filePointers = BAMFileSpan.merge(inputSpans).toCoordinateArray();
-        } else {
-            filePointers = null;
-        }
-
-        // Create an iterator over the above chunk boundaries.
-        final BAMFileIndexIterator iterator = new BAMFileIndexIterator(filePointers);
-
-        // Add some preprocessing filters for edge-case reads that don't fit into this
-        // query type.
-        return new BAMQueryFilteringIterator(iterator, new BAMQueryMultipleIntervalsIteratorFilter(intervals, contained));
-    }
-
-    /**
-     * Iterate over the SAMRecords defined by the sections of the file described in the ctor argument.
-     */
-    private class BAMFileIndexIterator extends BAMFileIterator {
-
-        private long[] mFilePointers = null;
-        private int mFilePointerIndex = 0;
-        private long mFilePointerLimit = -1;
-
-        /**
-         * Prepare to iterate through SAMRecords stored in the specified compressed blocks at the given offset.
-         * @param filePointers the block / offset combination, stored in chunk format.
-         */
-        BAMFileIndexIterator(final long[] filePointers) {
-            super(false);  // delay advance() until after construction
-            mFilePointers = filePointers;
-            advance();
-        }
-
-        SAMRecord getNextRecord()
-            throws IOException {
-            // Advance to next file block if necessary
-            while (mCompressedInputStream.getFilePointer() >= mFilePointerLimit) {
-                if (mFilePointers == null ||
-                        mFilePointerIndex >= mFilePointers.length) {
-                    return null;
-                }
-                final long startOffset = mFilePointers[mFilePointerIndex++];
-                final long endOffset = mFilePointers[mFilePointerIndex++];
-                mCompressedInputStream.seek(startOffset);
-                mFilePointerLimit = endOffset;
-            }
-            // Pull next record from stream
-            return super.getNextRecord();
-        }
-    }
-
-    /**
-     * Pull SAMRecords from a coordinate-sorted iterator, and filter out any that do not match the filter.
-     */
-    public class BAMQueryFilteringIterator extends AbstractBamIterator {
-        /**
-         * The wrapped iterator.
-         */
-        protected final CloseableIterator<SAMRecord> wrappedIterator;
-        /**
-         * The next record to be returned.  Will be null if no such record exists.
-         */
-        protected SAMRecord mNextRecord;
-        private final BAMIteratorFilter iteratorFilter;
-
-        public BAMQueryFilteringIterator(final CloseableIterator<SAMRecord> iterator,
-                                         final BAMIteratorFilter iteratorFilter) {
-            this.wrappedIterator = iterator;
-            this.iteratorFilter = iteratorFilter;
-            mNextRecord = advance();
-        }
-
-        /**
-         * Returns true if a next element exists; false otherwise.
-         */
-        public boolean hasNext() {
-            assertOpen();
-            return mNextRecord != null;
-        }
-
-        /**
-         * Gets the next record from the given iterator.
-         * @return The next SAM record in the iterator.
-         */
-        public SAMRecord next() {
-            if(!hasNext())
-                throw new NoSuchElementException("BAMQueryFilteringIterator: no next element available");
-            final SAMRecord currentRead = mNextRecord;
-            mNextRecord = advance();
-            return currentRead;
-        }
-
-        SAMRecord advance() {
-            while (true) {
-                // Pull next record from stream
-                if(!wrappedIterator.hasNext())
-                    return null;
-
-                final SAMRecord record = wrappedIterator.next();
-                switch (iteratorFilter.compareToFilter(record)) {
-                    case MATCHES_FILTER: return record;
-                    case STOP_ITERATION: return null;
-                    case CONTINUE_ITERATION: break; // keep looping
-                    default: throw new SAMException("Unexpected return from compareToFilter");
-                }
-            }
-        }
-    }
-
-    /**
-     * A decorating iterator that filters out records that do not match the given reference and start position.
-     */
-    private class BAMStartingAtIteratorFilter implements BAMIteratorFilter {
-
-        private final int mReferenceIndex;
-        private final int mRegionStart;
-
-        public BAMStartingAtIteratorFilter(final int referenceIndex, final int start) {
-            mReferenceIndex = referenceIndex;
-            mRegionStart = start;
-        }
-
-        /**
-         *
-         * @return MATCHES_FILTER if this record matches the filter;
-         * CONTINUE_ITERATION if does not match filter but iteration should continue;
-         * STOP_ITERATION if does not match filter and iteration should end.
-         */
-        @Override
-        public FilteringIteratorState compareToFilter(final SAMRecord record) {
-            // If beyond the end of this reference sequence, end iteration
-            final int referenceIndex = record.getReferenceIndex();
-            if (referenceIndex < 0 || referenceIndex > mReferenceIndex) {
-                return FilteringIteratorState.STOP_ITERATION;
-            } else if (referenceIndex < mReferenceIndex) {
-                // If before this reference sequence, continue
-                return FilteringIteratorState.CONTINUE_ITERATION;
-            }
-            final int alignmentStart = record.getAlignmentStart();
-            if (alignmentStart > mRegionStart) {
-                // If scanned beyond target region, end iteration
-                return FilteringIteratorState.STOP_ITERATION;
-            } else  if (alignmentStart == mRegionStart) {
-                    return FilteringIteratorState.MATCHES_FILTER;
-            } else {
-                return FilteringIteratorState.CONTINUE_ITERATION;
-            }
-        }
-
-    }
-
-    private class BAMFileIndexUnmappedIterator extends BAMFileIterator  {
-        private BAMFileIndexUnmappedIterator() {
-            while (this.hasNext() && peek().getReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                advance();
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMFileSpan.java b/src/main/java/htsjdk/samtools/BAMFileSpan.java
deleted file mode 100644
index 193e443..0000000
--- a/src/main/java/htsjdk/samtools/BAMFileSpan.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * An ordered list of chunks, capable of representing a set of discontiguous
- * regions in the BAM file.  FileSpans are mutable within the package, but perceived
- * as immutable outside the package.
- *
- * Some operations on FileSpans assume that the spans are sorted.  In these cases,
- * sort order will be validated.
- *
- * @author mhanna
- * @version 0.1
- */
-public class BAMFileSpan implements SAMFileSpan, Serializable {
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * The constituent chunks of this list.
-     */
-    private final List<Chunk> chunks;
-
-    /**
-     * Create a new empty list of chunks.
-     */
-    public BAMFileSpan() {
-        this.chunks = new ArrayList<Chunk>();
-    }
-
-    /**
-     * Convenience constructor to construct a BAM file span from
-     * a single chunk.
-     * @param chunk Chunk to use as the sole region in this span.
-     */
-    public BAMFileSpan(final Chunk chunk) {
-        this.chunks = new ArrayList<Chunk>();
-        chunks.add(chunk);
-    }
-
-    /**
-     * Create a new chunk list from the given list of chunks.
-     * @param chunks Constituent chunks.
-     */
-    public BAMFileSpan(final List<Chunk> chunks) {
-        this.chunks = new ArrayList<Chunk>(chunks);
-    }
-
-    /**
-     * Does this chunk list map to any position within the BAM file?
-     * @return True iff the ChunkList points to any data within the BAM.
-     */
-    public boolean isEmpty() {
-        return chunks.isEmpty();
-    }
-
-    /**
-     * Deep clone the given chunk list.
-     * @return A copy of the chunk list.
-     */
-    public BAMFileSpan clone() {
-        final BAMFileSpan clone = new BAMFileSpan();
-        for(final Chunk chunk: chunks)
-            clone.chunks.add(chunk.clone());
-        return clone;
-    }
-
-    /**
-     * Creates a new file span by removing all chunks before the given file span starts.
-     * If a chunk in the chunk list starts before and ends after the given
-     * chunk, the first portion of the chunk will be deleted.
-     * @param fileSpan The filespan before which to eliminate.
-     * @return A new BAMFileSpan which contains the portion of the chunk list after the given chunk.
-     */
-    public SAMFileSpan removeContentsBefore(final SAMFileSpan fileSpan) {
-        if(fileSpan == null)
-            return clone();
-
-        if(!(fileSpan instanceof BAMFileSpan))
-            throw new SAMException("Unable to compare ");
-
-        final BAMFileSpan bamFileSpan = (BAMFileSpan)fileSpan;
-
-        if(bamFileSpan.isEmpty())
-            return clone();
-
-        validateSorted();
-
-        final BAMFileSpan trimmedChunkList = new BAMFileSpan();
-        for(final Chunk chunkToTrim: chunks) {
-            if(chunkToTrim.getChunkEnd() > chunkToTrim.getChunkStart()) {
-                if(chunkToTrim.getChunkStart() >= bamFileSpan.chunks.get(0).getChunkStart()) {
-                    // This chunk from the list is completely beyond the start of the filtering chunk.
-                    trimmedChunkList.add(chunkToTrim.clone());
-                }
-                else {
-                    // This chunk from the list partially overlaps the filtering chunk and must be trimmed.
-                    trimmedChunkList.add(new Chunk(bamFileSpan.chunks.get(0).getChunkStart(),chunkToTrim.getChunkEnd()));
-                }
-            }
-        }
-        return trimmedChunkList;
-    }
-
-    /**
-     * Gets a file span over the data immediately following this span.
-     * @return The a pointer to data immediately following this span.
-     */
-    public SAMFileSpan getContentsFollowing() {
-        if(chunks.isEmpty())
-            throw new SAMException("Unable to get the file pointer following this one: no data present.");
-        validateSorted();
-        return new BAMFileSpan(new Chunk(chunks.get(chunks.size()-1).getChunkEnd(),Long.MAX_VALUE));
-    }
-
-    /**
-     * Merge one span into another
-     *
-     * @param span - span with chunks to add to this one
-     */
-    protected void add(final BAMFileSpan span) {
-        for (final Chunk c : span.chunks) {
-            chunks.add(c);
-        }
-    }
-
-    /**
-     * Adds a new chunk to this list.  Visible only within the BAm.
-     * @param chunk Chunk to add.
-     */
-    protected void add(final Chunk chunk) {
-        chunks.add(chunk);
-    }
-
-    /**
-     * Convert the chunk list to an array of offsets, paired in [start,end) format.
-     * @return Array of offsets.
-     */
-    public long[] toCoordinateArray() {
-        final int count = chunks.size() * 2;
-        if (count == 0) {
-            return null;
-        }
-        int index = 0;
-        final long[] result = new long[count];
-        for (final Chunk chunk : chunks) {
-            result[index++] = chunk.getChunkStart();
-            result[index++] = chunk.getChunkEnd();
-        }
-        return result;
-    }
-
-    /**
-     * Find the first offset in the chunk list
-     * @return The first offset in the span
-     */
-    public long getFirstOffset() {
-        final long result = 0;
-        if (chunks == null){
-            return result;
-        }
-        for (final Chunk chunk : chunks) {
-            return chunk.getChunkStart();
-        }
-        return result;
-    }
-
-    /**
-     * Gets the constituent chunks stored in this span.
-     * @return An unmodifiable list of chunks.
-     */
-    public List<Chunk> getChunks() {
-        return Collections.unmodifiableList(chunks);
-    }
-
-    /**
-     * Checks that there is only a single chunk for this span and returns it.
-     * @return The single chunk stored in this span
-     */
-    protected Chunk getSingleChunk() {
-        if (chunks.size() != 1){
-            throw new SAMException("Expecting a single chunk for span. Found " + chunks.size());
-        }
-        return chunks.get(0);
-    }
-
-    /**
-     * The list of chunks is often represented as an array of
-     * longs where every even-numbered index is a start coordinate
-     * and every odd-numbered index is a stop coordinate.  Convert
-     * from that format back to a list of chunks.
-     * @param coordinateArray List of chunks to convert.
-     * @return A list of chunks.
-     */
-    protected static SAMFileSpan toChunkList(final long[] coordinateArray) {
-        if(coordinateArray.length % 2 != 0)
-            throw new SAMException("Data supplied does not appear to be in coordinate array format.");
-
-        final BAMFileSpan chunkList = new BAMFileSpan();
-        for(int i = 0; i < coordinateArray.length; i += 2)
-            chunkList.add(new Chunk(coordinateArray[i],coordinateArray[i+1]));
-
-        chunkList.validateSorted();
-
-        return chunkList;
-    }
-
-    /**
-     * Validates the list of chunks to ensure that they appear in sorted order.
-     */
-    private void validateSorted() {
-        for(int i = 1; i < chunks.size(); i++) {
-            if(chunks.get(i).getChunkStart() < chunks.get(i-1).getChunkEnd())
-                throw new SAMException(String.format("Chunk list is unsorted; chunk %s is before chunk %s",chunks.get(i-1),chunks.get(i)));
-        }
-    }
-
-    /**
-     * Creates a string representation of this chunk list.
-     */
-    @Override
-    public String toString() {
-        return StringUtil.join(";", chunks);
-    }
-
-    /**
-     *
-     * @return A single BAMFileSpan that is an intelligent merge of the input spans, i.e. contiguous, overlapping
-     * and contained chunks are intelligently merged, and the chunks are sorted.
-     */
-    public static BAMFileSpan merge(final BAMFileSpan[] spans) {
-        final ArrayList<Chunk> inputChunks = new ArrayList<Chunk>();
-        for (final BAMFileSpan span : spans) {
-            if(span != null){
-                inputChunks.addAll(span.chunks);
-            }
-        }
-        return new BAMFileSpan(Chunk.optimizeChunkList(inputChunks, 0));
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMFileWriter.java b/src/main/java/htsjdk/samtools/BAMFileWriter.java
deleted file mode 100644
index f6a474e..0000000
--- a/src/main/java/htsjdk/samtools/BAMFileWriter.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.zip.DeflaterFactory;
-
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.io.Writer;
-
-/**
- * Concrete implementation of SAMFileWriter for writing gzipped BAM files.
- */
-class BAMFileWriter extends SAMFileWriterImpl {
-
-    private final BinaryCodec outputBinaryCodec;
-    private BAMRecordCodec bamRecordCodec = null;
-    private final BlockCompressedOutputStream blockCompressedOutputStream;
-    private BAMIndexer bamIndexer = null;
-
-    protected BAMFileWriter(final File path) {
-        blockCompressedOutputStream = new BlockCompressedOutputStream(path);
-        outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
-        outputBinaryCodec.setOutputFileName(path.getAbsolutePath());
-    }
-
-    protected BAMFileWriter(final File path, final int compressionLevel) {
-        blockCompressedOutputStream = new BlockCompressedOutputStream(path, compressionLevel);
-        outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
-        outputBinaryCodec.setOutputFileName(path.getAbsolutePath());
-    }
-
-    protected BAMFileWriter(final OutputStream os, final File file) {
-        blockCompressedOutputStream = new BlockCompressedOutputStream(os, file);
-        outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
-        outputBinaryCodec.setOutputFileName(getPathString(file));
-    }
-
-    protected BAMFileWriter(final OutputStream os, final File file, final int compressionLevel) {
-        blockCompressedOutputStream = new BlockCompressedOutputStream(os, file, compressionLevel);
-        outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
-        outputBinaryCodec.setOutputFileName(getPathString(file));
-    }
-
-    protected BAMFileWriter(final OutputStream os, final File file, final int compressionLevel, final DeflaterFactory deflaterFactory) {
-        blockCompressedOutputStream = new BlockCompressedOutputStream(os, file, compressionLevel, deflaterFactory);
-        outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
-        outputBinaryCodec.setOutputFileName(getPathString(file));
-    }
-
-    private void prepareToWriteAlignments() {
-        if (bamRecordCodec == null) {
-            bamRecordCodec = new BAMRecordCodec(getFileHeader());
-            bamRecordCodec.setOutputStream(outputBinaryCodec.getOutputStream(), getFilename());
-        }
-    }
-
-    /** @return absolute path, or null if arg is null.  */
-    private String getPathString(final File path){
-        return (path != null) ? path.getAbsolutePath() : null;
-    }
-
-   // Allow enabling the bam index construction
-   // only enabled by factory method before anything is written
-   void enableBamIndexConstruction () {
-        if (!getSortOrder().equals(SAMFileHeader.SortOrder.coordinate)){
-           throw new SAMException("Not creating BAM index since not sorted by coordinates: " + getSortOrder());
-        }
-        if(getFilename() == null){
-            throw new SAMException("Not creating BAM index since we don't have an output file name");
-        }
-        bamIndexer = createBamIndex(getFilename());
-    }
-
-    private BAMIndexer createBamIndex(final String path) {
-        try {
-            final String indexFileBase = path.endsWith(BamFileIoUtils.BAM_FILE_EXTENSION) ?
-                    path.substring(0, path.lastIndexOf('.')) : path;
-            final File indexFile = new File(indexFileBase + BAMIndex.BAMIndexSuffix);
-            if (indexFile.exists()) {
-                if (!indexFile.canWrite()) {
-                    throw new SAMException("Not creating BAM index since unable to write index file " + indexFile);
-                }
-            }
-            return new BAMIndexer(indexFile, getFileHeader());
-        } catch (Exception e) {
-            throw new SAMException("Not creating BAM index", e);
-        }
-    }
-
-    protected void writeAlignment(final SAMRecord alignment) {
-        prepareToWriteAlignments();
-
-        if (bamIndexer != null) {
-            try {
-                final long startOffset = blockCompressedOutputStream.getFilePointer();
-                bamRecordCodec.encode(alignment);
-                final long stopOffset = blockCompressedOutputStream.getFilePointer();
-                // set the alignment's SourceInfo and then prepare its index information
-                alignment.setFileSource(new SAMFileSource(null, new BAMFileSpan(new Chunk(startOffset, stopOffset))));
-                bamIndexer.processAlignment(alignment);
-            } catch (Exception e) {
-                bamIndexer = null;
-                throw new SAMException("Exception when processing alignment for BAM index " + alignment, e);
-            }
-        } else {
-            bamRecordCodec.encode(alignment);
-        }
-    }
-
-    protected void writeHeader(final String textHeader) {
-        writeHeader(outputBinaryCodec, getFileHeader(), textHeader);
-    }
-
-    protected void finish() {
-        outputBinaryCodec.close();
-            try {
-                if (bamIndexer != null) {
-                    bamIndexer.finish();
-                }
-            } catch (Exception e) {
-                throw new SAMException("Exception writing BAM index file", e);
-            }
-    }
-
-    /** @return absolute path, or null if this writer does not correspond to a file.  */
-    protected String getFilename() {
-        return outputBinaryCodec.getOutputFileName();
-    }
-
-    /**
-     * Writes a header to a BAM file. samFileHeader and headerText are redundant - one can be used to regenerate the other but in
-     * some instances we already have both so this allows us to save some cycles
-     */
-    protected static void writeHeader(final BinaryCodec outputBinaryCodec, final SAMFileHeader samFileHeader, final String headerText) {
-        outputBinaryCodec.writeBytes(BAMFileConstants.BAM_MAGIC);
-
-        // calculate and write the length of the SAM file header text and the header text
-        outputBinaryCodec.writeString(headerText, true, false);
-
-        // write the sequences binarily.  This is redundant with the text header
-        outputBinaryCodec.writeInt(samFileHeader.getSequenceDictionary().size());
-        for (final SAMSequenceRecord sequenceRecord: samFileHeader.getSequenceDictionary().getSequences()) {
-            outputBinaryCodec.writeString(sequenceRecord.getSequenceName(), true, true);
-            outputBinaryCodec.writeInt(sequenceRecord.getSequenceLength());
-        }
-    }
-
-    /**
-     * Writes a header to a BAM file. Might need to regenerate the String version of the header, if one already has both the
-     * samFileHeader and the String, use the version of this method which takes both.
-     */
-    protected static void writeHeader(final BinaryCodec outputBinaryCodec, final SAMFileHeader samFileHeader) {
-        // Do not use SAMFileHeader.getTextHeader() as it is not updated when changes to the underlying object are made
-        final String headerString;
-        final Writer stringWriter = new StringWriter();
-        new SAMTextHeaderCodec().encode(stringWriter, samFileHeader, true);
-        headerString = stringWriter.toString();
-
-        writeHeader(outputBinaryCodec, samFileHeader, headerString);
-    }
-
-    protected static void writeHeader(final OutputStream outputStream, final SAMFileHeader samFileHeader) {
-        final BlockCompressedOutputStream blockCompressedOutputStream = new BlockCompressedOutputStream(outputStream, null);
-        final BinaryCodec outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
-        writeHeader(outputBinaryCodec, samFileHeader);
-        try {
-            blockCompressedOutputStream.flush();
-        } catch (final IOException ioe) {
-            throw new RuntimeIOException(ioe);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMIndex.java b/src/main/java/htsjdk/samtools/BAMIndex.java
deleted file mode 100644
index 3663df9..0000000
--- a/src/main/java/htsjdk/samtools/BAMIndex.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Closeable;
-
-/**
- * A basic interface for querying BAM indices.
- *
- * @author mhanna
- * @version 0.1
- */
-public interface BAMIndex extends Closeable {
-
-    public static final String BAMIndexSuffix = ".bai";
-
-    /**
-     * Gets the compressed chunks which should be searched for the contents of records contained by the span
-     * referenceIndex:startPos-endPos, inclusive.  See the BAM spec for more information on how a chunk is
-     * represented.
-     * 
-     * @param referenceIndex The contig.
-     * @param startPos Genomic start of query.
-     * @param endPos Genomic end of query.
-     * @return A file span listing the chunks in the BAM file.
-     */
-    BAMFileSpan getSpanOverlapping(final int referenceIndex, final int startPos, final int endPos);
-
-    /**
-     * Gets the start of the last linear bin in the index.
-     * @return The chunk indicating the start of the last bin in the linear index.
-     */
-    long getStartOfLastLinearBin();
-
-    /**
-     * Gets meta data for the given reference including information about number of aligned, unaligned, and noCoordinate records
-     * @param reference the reference of interest
-     * @return meta data for the reference
-     */
-    public BAMIndexMetaData getMetaData(int reference);
-
-    /**
-     * Close the index and release any associated resources.
-     */
-    void close();
-}
diff --git a/src/main/java/htsjdk/samtools/BAMIndexContent.java b/src/main/java/htsjdk/samtools/BAMIndexContent.java
deleted file mode 100644
index be9d856..0000000
--- a/src/main/java/htsjdk/samtools/BAMIndexContent.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Represents the contents of a bam index file for one reference.
- * A BAM index (.bai) file contains information for all references in the bam file.
- * This class describes the data present in the index file for one of these references;
- * including the bins, chunks, and linear index.
- */
-class BAMIndexContent extends BinningIndexContent {
-    /**
-     * Chunks containing metaData for the reference, e.g. number of aligned and unaligned records
-     */
-    private final BAMIndexMetaData mMetaData;
-
-
-
-    /**
-     * @param referenceSequence Content corresponds to this reference.
-     * @param binList              Array of bins represented by this content, possibly sparse
-     * @param metaData          Extra information about the reference in this index
-     * @param linearIndex       Additional index used to optimize queries
-     */
-    BAMIndexContent(final int referenceSequence, final BinList binList, final BAMIndexMetaData metaData, final LinearIndex linearIndex) {
-        super(referenceSequence, binList, linearIndex);
-        this.mMetaData = metaData;
-    }
-
-    /**
-     * @param referenceSequence Content corresponds to this reference.
-     * @param bins              Array of bins represented by this content, possibly sparse
-     * @param numberOfBins      Number of non-null bins
-     * @param metaData          Extra information about the reference in this index
-     * @param linearIndex       Additional index used to optimize queries
-     */
-    BAMIndexContent(final int referenceSequence, final Bin[] bins, final int numberOfBins, final BAMIndexMetaData metaData, final LinearIndex linearIndex) {
-        this(referenceSequence, new BinList(bins, numberOfBins), metaData, linearIndex);
-    }
-
-    /**
-     * @return the meta data chunks for this content
-     */
-    public BAMIndexMetaData getMetaData() {
-        return mMetaData;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/BAMIndexMetaData.java b/src/main/java/htsjdk/samtools/BAMIndexMetaData.java
deleted file mode 100644
index 3dceab2..0000000
--- a/src/main/java/htsjdk/samtools/BAMIndexMetaData.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.util.BlockCompressedFilePointerUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Metadata about the bam index contained within the bam index.
- * One instance created per index file.
- */
-public class BAMIndexMetaData {
-
-    // information for the entire index.
-    // stored at the end of the index
-    private long noCoordinateRecords = 0;
-
-    // information for each reference.
-    // stored in two chunks in bin # MAX_BINS
-    private long firstOffset = -1;
-    private long lastOffset = 0;
-    private int alignedRecords = 0;
-    private int unAlignedRecords = 0;  // unmapped, but associated with this reference
-
-
-    /**
-     * Constructor used when writing an index
-     * construct one instance for each index generated
-     */
-    BAMIndexMetaData() {
-        noCoordinateRecords = 0;
-        newReference();
-    }
-
-    /**
-     * Constructor used when reading an index
-     * construct one instance for each index generated
-     */
-    BAMIndexMetaData(List<Chunk> chunkList) {
-        noCoordinateRecords = 0;
-
-        if (chunkList == null || chunkList.isEmpty()) {
-            // System.out.println("No metadata chunks");
-        } else if (chunkList.size() != 2) {
-            throw new SAMException("Unexpected number of metadata chunks " + (chunkList.size()));
-        }
-        // fill in the first/lastOffset un/alignedRecords from this
-        boolean firstChunk = true;
-        if (chunkList != null) {
-            for (Chunk c : chunkList) {
-                long start = c.getChunkStart();
-                long end = c.getChunkEnd();
-                if (firstChunk) {
-                    firstOffset = start;
-                    lastOffset = end;
-                    firstChunk = false;
-                } else {
-                    firstChunk = true;
-                    alignedRecords = (int) start;
-                    unAlignedRecords = (int) end;
-                }
-            }
-        }
-    }
-
-    /**
-     * @return the count of aligned records associated with this reference
-     */
-    public int getAlignedRecordCount() {
-        return alignedRecords;
-    }
-
-    /**
-     * @return the count of unaligned records associated with this reference
-     */
-    public int getUnalignedRecordCount() {
-        return unAlignedRecords;
-    }
-
-    /**
-     * Call for each new reference sequence encountered
-     */
-    void newReference() {
-        firstOffset = -1;
-        lastOffset = 0;
-        alignedRecords = 0;
-        unAlignedRecords = 0;
-    }
-
-    /**
-     * Extract relevant metaData from the record and its filePointer
-     * Call only once per record in the file being indexed
-     *
-     * @param rec
-     */
-    void recordMetaData(final SAMRecord rec) {
-
-        final int alignmentStart = rec.getAlignmentStart();
-        if (alignmentStart == SAMRecord.NO_ALIGNMENT_START) {
-            incrementNoCoordinateRecordCount();
-            return;
-        }
-
-        if (rec.getFileSource() == null) {
-            throw new SAMException("BAM cannot be indexed without setting a fileSource for record " + rec);
-        }
-        final Chunk newChunk = ((BAMFileSpan) rec.getFileSource().getFilePointer()).getSingleChunk();
-        final long start = newChunk.getChunkStart();
-        final long end = newChunk.getChunkEnd();
-
-        if (rec.getReadUnmappedFlag()) {
-            unAlignedRecords++;
-        } else {
-            alignedRecords++;
-        }
-        if (BlockCompressedFilePointerUtil.compare(start, firstOffset) < 1 || firstOffset == -1) {
-            this.firstOffset = start;
-        }
-        if (BlockCompressedFilePointerUtil.compare(lastOffset, end) < 1) {
-            this.lastOffset = end;
-        }
-    }
-
-    /**
-     * @param slice
-     */
-    void recordMetaData(Slice slice) {
-
-        final int alignmentStart = slice.alignmentStart;
-        if (alignmentStart == SAMRecord.NO_ALIGNMENT_START) {
-            noCoordinateRecords+=slice.nofRecords;
-            return;
-        }
-
-        final long start = slice.offset;
-        final long end = slice.offset + 0;
-
-        if (slice.alignmentSpan < 1) {
-            unAlignedRecords += slice.nofRecords;
-        } else {
-            alignedRecords += slice.nofRecords;
-        }
-        if (BlockCompressedFilePointerUtil.compare(start, firstOffset) < 1 || firstOffset == -1) {
-            this.firstOffset = start;
-        }
-        if (BlockCompressedFilePointerUtil.compare(lastOffset, end) < 1) {
-            this.lastOffset = end;
-        }
-    }
-
-    /**
-     * Call whenever a reference with no coordinate information is encountered in the bam file
-     */
-    void incrementNoCoordinateRecordCount() {
-        noCoordinateRecords++;
-    }
-
-    /**
-     * Set local variable. Normally noCoordinateRecord count accessed from AbstractBAMFileIndex when reading
-     */
-    private void setNoCoordinateRecordCount(long count) {
-        noCoordinateRecords = count;
-    }
-
-
-    /**
-     * @return the count of records with no coordinate information in the bam file.
-     * Not public, since only used by BAMIndexer when writing bam index.
-     * Readers of bam index should use AbstractBAMFileIndex.getNoCoordinateRecordCount.
-     */
-    long getNoCoordinateRecordCount() {
-        return noCoordinateRecords;
-    }
-
-    /**
-     * @return the first virtual file offset used by this reference
-     */
-    long getFirstOffset() {
-        return firstOffset;
-    }
-
-    /**
-     * @return the last virtual file offset used by this reference
-     */
-    long getLastOffset() {
-        return lastOffset;
-    }
-
-    /**
-     * Prints meta-data statistics from BAM index (.bai) file
-     * Statistics include count of aligned and unaligned reads for each reference sequence
-     * and a count of all records with no start coordinate
-     */
-    static public void printIndexStats(final File inputBamFile) {
-        try {
-            final BAMFileReader bam = new BAMFileReader(inputBamFile, null, false, false, ValidationStringency.SILENT, new DefaultSAMRecordFactory());
-            if (!bam.hasIndex()) {
-                throw new SAMException("No index for bam file " + inputBamFile);
-            }
-            BAMIndexMetaData[] data = getIndexStats(bam);
-            // read through all the bins of every reference.
-            int nRefs = bam.getFileHeader().getSequenceDictionary().size();
-            for (int i = 0; i < nRefs; i++) {
-                final SAMSequenceRecord seq = bam.getFileHeader().getSequence(i);
-                if (seq == null) continue;
-                final String sequenceName = seq.getSequenceName();
-                final int sequenceLength = seq.getSequenceLength();
-                System.out.print(sequenceName + ' ' + "length=\t" + sequenceLength);
-                if (data[i] == null) {
-                    System.out.println();
-                    continue;
-                }
-                System.out.println("\tAligned= " + data[i].getAlignedRecordCount() +
-                        "\tUnaligned= " + data[i].getUnalignedRecordCount());
-            }
-            System.out.println("NoCoordinateCount= " + data[0].getNoCoordinateRecordCount());
-        } catch (IOException e) {
-            throw new SAMException("Exception in getting index statistics", e);
-        }
-    }
-
-    /**
-     * Prints meta-data statistics from BAM index (.bai) file
-     * Statistics include count of aligned and unaligned reads for each reference sequence
-     * and a count of all records with no start coordinate
-     */
-    static public BAMIndexMetaData[] getIndexStats(final BAMFileReader bam) {
-
-        AbstractBAMFileIndex index = (AbstractBAMFileIndex) bam.getIndex();
-        // read through all the bins of every reference.
-        int nRefs = index.getNumberOfReferences();
-        BAMIndexMetaData[] result = new BAMIndexMetaData[nRefs == 0 ? 1 : nRefs];
-        for (int i = 0; i < nRefs; i++) {
-            result[i] = index.getMetaData(i);
-        }
-
-        if (result[0] == null) {
-            result[0] = new BAMIndexMetaData();
-        }
-        final Long noCoordCount = index.getNoCoordinateCount();
-        if (noCoordCount != null)  // null in old index files without metadata
-            result[0].setNoCoordinateRecordCount(noCoordCount);
-
-        return result;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMIndexWriter.java b/src/main/java/htsjdk/samtools/BAMIndexWriter.java
deleted file mode 100644
index b036b68..0000000
--- a/src/main/java/htsjdk/samtools/BAMIndexWriter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Closeable;
-
-/**
- * A basic interface for writing BAM index files
- *
- * @author mborkan
- */
-interface BAMIndexWriter extends Closeable {  // note - only package visibility
-
-    /**
-     * Write the data for one alignments to one reference sequence
-     *
-     * @param content    BAMIndexContent containing the information for one reference
-     */
-    public void writeReference(final BAMIndexContent content);
-
-    /**
-     * Writes out the count of records without coordinates
-     *
-     * @param count
-     */
-    public void writeNoCoordinateRecordCount(final Long count);
-
-    /**
-     * Any necessary processing at the end of the file
-     */
-    public void close();
-
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/BAMIndexer.java b/src/main/java/htsjdk/samtools/BAMIndexer.java
deleted file mode 100644
index f5b1558..0000000
--- a/src/main/java/htsjdk/samtools/BAMIndexer.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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, sub-license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Log;
-
-import java.io.File;
-import java.io.OutputStream;
-import java.util.function.Function;
-
-/**
- * Class for both constructing BAM index content and writing it out.
- * There are two usage patterns:
- * 1) Building a bam index from an existing bam file
- * 2) Building a bam index while building the bam file
- * In both cases, processAlignment is called for each alignment record and
- * finish() is called at the end.
- */
-public class BAMIndexer {
-
-    // The number of references (chromosomes) in the BAM file
-    private final int numReferences;
-
-    // output written as binary, or (for debugging) as text
-    private final BAMIndexWriter outputWriter;
-
-    private int currentReference = 0;
-
-    // content is built up from the input bam file using this
-    private final BAMIndexBuilder indexBuilder;
-
-    private static final Log log = Log.getInstance(BAMIndexer.class);
-
-    /**
-     * @param output     binary BAM Index (.bai) file
-     * @param fileHeader header for the corresponding bam file
-     */
-    public BAMIndexer(final File output, final SAMFileHeader fileHeader) {
-        this(fileHeader, numRefs -> new BinaryBAMIndexWriter(numRefs, output));
-    }
-
-    /**
-     * Prepare to index a BAM.
-     *
-     * @param output     Index will be written here.  output will be closed when finish() method is called.
-     * @param fileHeader header for the corresponding bam file.
-     */
-    public BAMIndexer(final OutputStream output, final SAMFileHeader fileHeader) {
-        this(fileHeader, numRefs -> new BinaryBAMIndexWriter(numRefs, output));
-    }
-
-    /*
-     * Prepare to index a BAM.
-     *
-     * @param fileHeader header for the corresponding bam file.
-     * @param  createWrite a lambda that, given an Integer numReferences value, will create a BinaryBAMIndexWriter
-     *                     with that value and an appropriate output.
-      */
-    private BAMIndexer(final SAMFileHeader fileHeader, Function<Integer, BinaryBAMIndexWriter> createWriter) {
-        if (fileHeader.getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
-            if (fileHeader.getSortOrder() == SAMFileHeader.SortOrder.unsorted) {
-                log.warn("For indexing, the BAM file is required to be coordinate sorted. Attempting to index \"unsorted\" BAM file.");
-            }
-            else {
-                throw new SAMException("Indexing requires a coordinate-sorted input BAM.");
-            }
-        }
-        numReferences = fileHeader.getSequenceDictionary().size();
-        indexBuilder = new BAMIndexBuilder(fileHeader.getSequenceDictionary());
-        outputWriter = createWriter.apply(numReferences);
-    }
-
-    /**
-     * Record any index information for a given BAM record.
-     * If this alignment starts a new reference, write out the old reference.
-     * Requires a non-null value for rec.getFileSource().
-     *
-     * @param rec The BAM record
-     */
-    public void processAlignment(final SAMRecord rec) {
-        try {
-            final int reference = rec.getReferenceIndex();
-            if (reference != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && reference != currentReference) {
-                // process any completed references
-                advanceToReference(reference);
-            }
-            indexBuilder.processAlignment(rec);
-        } catch (final Exception e) {
-            throw new SAMException("Exception creating BAM index for record " + rec, e);
-        }
-    }
-
-    /**
-     * After all the alignment records have been processed, finish is called.
-     * Writes any final information and closes the output file.
-     */
-    public void finish() {
-        // process any remaining references
-        advanceToReference(numReferences);
-        outputWriter.writeNoCoordinateRecordCount(indexBuilder.getNoCoordinateRecordCount());
-        outputWriter.close();
-    }
-
-    /** write out any references between the currentReference and the nextReference */
-    private void advanceToReference(final int nextReference) {
-        while (currentReference < nextReference) {
-            final BAMIndexContent content = indexBuilder.processReference(currentReference);
-            outputWriter.writeReference(content);
-            currentReference++;
-            if (currentReference < numReferences) {
-                indexBuilder.startNewReference();
-            }
-        }
-    }
-
-    /**
-     * Generates a BAM index file, either textual or binary, from an input BAI file.
-     * Only used for testing, but located here for visibility into CachingBAMFileIndex.
-     *
-     * @param output     BAM Index (.bai) file (or bai.txt file when text)
-     * @param textOutput Whether to create text output or binary
-     */
-    static public void createAndWriteIndex(final File input, final File output, final boolean textOutput) {
-
-        // content is from an existing bai file.
-
-        final CachingBAMFileIndex existingIndex = new CachingBAMFileIndex(input, null);
-        final int n_ref = existingIndex.getNumberOfReferences();
-        final BAMIndexWriter outputWriter;
-        if (textOutput) {
-            outputWriter = new TextualBAMIndexWriter(n_ref, output);
-        } else {
-            outputWriter = new BinaryBAMIndexWriter(n_ref, output);
-        }
-
-        // write the content one reference at a time
-        try {
-            for (int i = 0; i < n_ref; i++) {
-                outputWriter.writeReference(existingIndex.getQueryResults(i));
-            }
-            outputWriter.writeNoCoordinateRecordCount(existingIndex.getNoCoordinateCount());
-            outputWriter.close();
-
-        } catch (final Exception e) {
-            throw new SAMException("Exception creating BAM index", e);
-        }
-    }
-
-    /**
-     * Class for constructing BAM index files.
-     * One instance is used to construct an entire index.
-     * processAlignment is called for each alignment until a new reference is encountered, then
-     * processReference is called when all records for the reference have been processed.
-     */
-    private class BAMIndexBuilder {
-
-        private final SAMSequenceDictionary sequenceDictionary;
-
-        private BinningIndexBuilder binningIndexBuilder;
-
-        private int currentReference = -1;
-
-        // information in meta data
-        private final BAMIndexMetaData indexStats = new BAMIndexMetaData();
-
-        BAMIndexBuilder(final SAMSequenceDictionary sequenceDictionary) {
-            this.sequenceDictionary = sequenceDictionary;
-            if (!sequenceDictionary.isEmpty()) startNewReference();
-        }
-
-        /**
-         * Record any index information for a given BAM record
-         *
-         * @param rec The BAM record. Requires rec.getFileSource() is non-null.
-         */
-        public void processAlignment(final SAMRecord rec) {
-
-            // metadata
-            indexStats.recordMetaData(rec);
-
-            if (rec.getAlignmentStart() == SAMRecord.NO_ALIGNMENT_START) {
-                return; // do nothing for records without coordinates, but count them
-            }
-
-            // various checks
-            final int reference = rec.getReferenceIndex();
-            if (reference != currentReference) {
-                throw new SAMException("Unexpected reference " + reference +
-                        " when constructing index for " + currentReference + " for record " + rec);
-            }
-
-            binningIndexBuilder.processFeature(new BinningIndexBuilder.FeatureToBeIndexed() {
-                @Override
-                public int getStart() {
-                    return rec.getAlignmentStart();
-                }
-
-                @Override
-                public int getEnd() {
-                    return rec.getAlignmentEnd();
-                }
-
-                @Override
-                public Integer getIndexingBin() {
-                    final Integer binNumber = rec.getIndexingBin();
-                    return (binNumber == null ? rec.computeIndexingBin() : binNumber);
-
-                }
-
-                @Override
-                public Chunk getChunk() {
-                    final SAMFileSource source = rec.getFileSource();
-                    if (source == null) {
-                        throw new SAMException("No source (virtual file offsets); needed for indexing on BAM Record " + rec);
-                    }
-                    return ((BAMFileSpan) source.getFilePointer()).getSingleChunk();
-                }
-            });
-
-        }
-
-        /**
-         * Creates the BAMIndexContent for this reference.
-         * Requires all alignments of the reference have already been processed.
-         *
-         * @return Null if there are no features for this reference.
-         */
-        public BAMIndexContent processReference(final int reference) {
-
-            if (reference != currentReference) {
-                throw new SAMException("Unexpected reference " + reference + " when constructing index for " + currentReference);
-            }
-
-            final BinningIndexContent indexContent = binningIndexBuilder.generateIndexContent();
-            if (indexContent == null) return null;
-            return new BAMIndexContent(indexContent.getReferenceSequence(), indexContent.getBins(),
-                    indexStats, indexContent.getLinearIndex());
-
-        }
-
-        /**
-         * @return the count of records with no coordinate positions
-         */
-        public long getNoCoordinateRecordCount() {
-            return indexStats.getNoCoordinateRecordCount();
-        }
-
-        /**
-         * reinitialize all data structures when the reference changes
-         */
-        void startNewReference() {
-            ++currentReference;
-            // I'm not crazy about recycling this object, but that is the way it was originally written and
-            // it helps keep track of no-coordinate read count (which shouldn't be stored in this class anyway).
-            indexStats.newReference();
-            binningIndexBuilder = new BinningIndexBuilder(currentReference,
-                    sequenceDictionary.getSequence(currentReference).getSequenceLength());
-        }
-    }
-
-    /**
-     * Generates a BAM index file from an input BAM file
-     *
-     * @param reader SamReader for input BAM file
-     * @param output File for output index file
-     */
-    public static void createIndex(SamReader reader, File output) {
-        createIndex(reader, output, null);
-    }
-
-    /**
-     * Generates a BAM index file from an input BAM file
-     *
-     * @param reader SamReader for input BAM file
-     * @param output File for output index file
-     */
-    public static void createIndex(SamReader reader, File output, Log log) {
-
-        BAMIndexer indexer = new BAMIndexer(output, reader.getFileHeader());
-
-        long totalRecords = 0;
-
-        // create and write the content
-        for (SAMRecord rec : reader) {
-            if (++totalRecords % 1000000 == 0) {
-                if (null != log) log.info(totalRecords + " reads processed ...");
-            }
-            indexer.processAlignment(rec);
-        }
-        indexer.finish();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMIteratorFilter.java b/src/main/java/htsjdk/samtools/BAMIteratorFilter.java
deleted file mode 100644
index bc7d2c0..0000000
--- a/src/main/java/htsjdk/samtools/BAMIteratorFilter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package htsjdk.samtools;
-
-
-/**
- * Interface implemented by filetering iterators used for BAM/CRAM readers.
- */
-interface BAMIteratorFilter {
-    public enum IntervalComparison {
-        BEFORE, AFTER, OVERLAPPING, CONTAINED
-    }
-
-    /**
-     * Type returned by BAMIteratorFilter that tell iterators implementing this interface
-     * how to handle each SAMRecord.
-     */
-    public enum FilteringIteratorState {
-        MATCHES_FILTER, STOP_ITERATION, CONTINUE_ITERATION
-    }
-
-    /**
-     * Determine if given record passes the filter, and if it does not, whether iteration
-     * should continue or if this record is beyond the region(s) of interest.
-     */
-    FilteringIteratorState compareToFilter(final SAMRecord record);
-}
-
diff --git a/src/main/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilter.java b/src/main/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilter.java
deleted file mode 100644
index 8dadc69..0000000
--- a/src/main/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CoordMath;
-
-/**
- * Filters out records that do not match any of the given intervals and query type.
- */
-public class BAMQueryMultipleIntervalsIteratorFilter implements BAMIteratorFilter {
-    final QueryInterval[] intervals;
-    final boolean contained;
-    int intervalIndex = 0;
-
-
-    public BAMQueryMultipleIntervalsIteratorFilter(final QueryInterval[] intervals,
-                                                   final boolean contained) {
-        this.contained = contained;
-        this.intervals = intervals;
-    }
-
-    @Override
-    public FilteringIteratorState compareToFilter(final SAMRecord record) {
-        while (intervalIndex < intervals.length) {
-            final IntervalComparison comparison = compareIntervalToRecord(intervals[intervalIndex], record);
-            switch (comparison) {
-                // Interval is before SAMRecord.  Try next interval;
-                case BEFORE: ++intervalIndex; break;
-                // Interval is after SAMRecord.  Keep scanning forward in SAMRecords
-                case AFTER: return FilteringIteratorState.CONTINUE_ITERATION;
-                // Found a good record
-                case CONTAINED: return FilteringIteratorState.MATCHES_FILTER;
-                // Either found a good record, or else keep scanning SAMRecords
-                case OVERLAPPING: return
-                        (contained ? FilteringIteratorState.CONTINUE_ITERATION : FilteringIteratorState.MATCHES_FILTER);
-            }
-        }
-        // Went past the last interval
-        return FilteringIteratorState.STOP_ITERATION;
-    }
-
-    public static IntervalComparison compareIntervalToRecord(final QueryInterval interval, final SAMRecord record) {
-        // interval.end <= 0 implies the end of the reference sequence.
-        final int intervalEnd = (interval.end <= 0? Integer.MAX_VALUE: interval.end);
-        final int alignmentEnd;
-        if (record.getReadUnmappedFlag() && record.getAlignmentStart() != SAMRecord.NO_ALIGNMENT_START) {
-            // Unmapped read with coordinate of mate.
-            alignmentEnd = record.getAlignmentStart();
-        } else {
-            alignmentEnd = record.getAlignmentEnd();
-        }
-
-        if (interval.referenceIndex < record.getReferenceIndex()) return IntervalComparison.BEFORE;
-        else if (interval.referenceIndex > record.getReferenceIndex()) return IntervalComparison.AFTER;
-        else if (intervalEnd < record.getAlignmentStart()) return IntervalComparison.BEFORE;
-        else if (alignmentEnd < interval.start) return IntervalComparison.AFTER;
-        else if (CoordMath.encloses(interval.start, intervalEnd, record.getAlignmentStart(), alignmentEnd)) {
-            return IntervalComparison.CONTAINED;
-        } else return IntervalComparison.OVERLAPPING;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMRecord.java b/src/main/java/htsjdk/samtools/BAMRecord.java
deleted file mode 100644
index c45566f..0000000
--- a/src/main/java/htsjdk/samtools/BAMRecord.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.StringUtil;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-
-/**
- * Wrapper class for binary BAM records.
- * Delays unpacking all data binary until requested.
- */
-public class BAMRecord extends SAMRecord {
-    /**
-     * Offset of the read name in the variable length section of the disk representation of BAMRecord
-     */
-    private static final int READ_NAME_OFFSET = 0;
-
-    /**
-     * Variable-length part of BAMRecord.  Lazily decoded.
-     */
-    private byte[] mRestOfBinaryData = null;
-
-    // Various lengths are stored, because they are in the fixed-length part of the BAMRecord, and it is
-    // more efficient to remember them than decode the element they store the length of.
-    // The length becomes invalid if the element is changed with a set() method.
-    private int mReadLength = 0;
-    private boolean mReadLengthValid = true;
-    private final short mReadNameLength;
-    private boolean mReadNameLengthValid = true;
-    private final int mCigarLength;
-    private boolean mCigarLengthValid = true;
-
-    // Whether or not the getter needs to decode the corresponding element.
-    // For all the other variable length elements, null == not yet decoded.
-    private boolean mAttributesDecoded = false;
-    private boolean mCigarDecoded = false;
-
-    /**
-     * If any of the properties set from mRestOfBinaryData have been overridden by calls to setters,
-     * this is set to true, indicating that mRestOfBinaryData cannot be used to write this record to disk.
-     */
-    private boolean mBinaryDataStale;
-
-    /**
-     * Create a new BAM Record. If the reference sequence index or mate reference sequence index are any value other
-     * than NO_ALIGNMENT_REFERENCE_INDEX (-1), then the specified index values must exist in the sequence dictionary
-     * in the header argument.
-     */
-    protected BAMRecord(final SAMFileHeader header,
-                        final int referenceID,
-                        final int coordinate,
-                        final short readNameLength,
-                        final short mappingQuality,
-                        final int indexingBin,
-                        final int cigarLen,
-                        final int flags,
-                        final int readLen,
-                        final int mateReferenceID,
-                        final int mateCoordinate,
-                        final int insertSize,
-                        final byte[] restOfData) {
-        super(header);
-        setReferenceIndex(referenceID);
-        setAlignmentStart(coordinate);
-        mReadNameLength = readNameLength;
-        setMappingQuality(mappingQuality);
-        mCigarLength = cigarLen;
-        setFlags(flags);
-        mReadLength = readLen;
-        setMateReferenceIndex(mateReferenceID);
-        setMateAlignmentStart(mateCoordinate);
-        setInferredInsertSize(insertSize);
-        mRestOfBinaryData = restOfData;
-
-        // Set these to null in order to mark them as being candidates for lazy initialization.
-        // If this is not done, they will have non-null defaults.
-        super.setReadName(null);
-        super.setCigarString(null);
-        super.setReadBases(null);
-        super.setBaseQualities(null);
-
-        // Do this after the above because setCigarString will clear it.
-        setIndexingBin(indexingBin);
-
-        // Mark the binary block as being valid for writing back out to disk
-        mBinaryDataStale = false;
-    }
-
-    /**
-     * Force all the lazily-initialized attributes to be decoded.
-     */
-    protected void eagerDecode() {
-        getReadName();
-        getCigar();
-        getReadBases();
-        getBaseQualities();
-        getBinaryAttributes();
-        super.eagerDecode();
-        mRestOfBinaryData = null;
-    }
-
-    /**
-     * If this record has a valid binary representation of the variable-length portion of a binary record stored,
-     * return that byte array, otherwise return null.  This will never be true for SAMRecords.  It will be true
-     * for BAMRecords that have not been eagerDecoded(), and for which none of the data in the variable-length
-     * portion has been changed.
-     */
-    @Override
-    public byte[] getVariableBinaryRepresentation() {
-        if (mBinaryDataStale) {
-            return null;
-        }
-        // This may have been set to null by eagerDecode()
-        return mRestOfBinaryData;
-    }
-
-    /**
-     * Depending on the concrete implementation, the binary file size of attributes may be known without
-     * computing them all.
-     *
-     * @return binary file size of attribute, if known, else -1.
-     */
-    @Override
-    public int getAttributesBinarySize() {
-        if (mBinaryDataStale || mRestOfBinaryData == null) {
-            return -1;
-        }
-        final int tagsOffset = readNameSize() + cigarSize() + basesSize() + qualsSize();
-        return mRestOfBinaryData.length - tagsOffset;
-    }
-
-    @Override
-    public void setReadName(final String value) {
-        super.setReadName(value);
-        mBinaryDataStale = true;
-        mReadNameLengthValid = false;
-    }
-
-    @Override
-    public void setCigar(final Cigar cigar) {
-        super.setCigar(cigar);
-        mBinaryDataStale = true;
-        mCigarLengthValid = false;
-        mCigarDecoded = true;
-    }
-
-    @Override
-    public void setCigarString(final String value) {
-        super.setCigarString(value);
-        mBinaryDataStale = true;
-        mCigarLengthValid = false;
-        mCigarDecoded = true;
-    }
-
-    @Override
-    public void setReadBases(final byte[] value) {
-        super.setReadBases(value);
-        mBinaryDataStale = true;
-        mReadLengthValid = false;
-    }
-
-    @Override
-    public void setBaseQualities(final byte[] value) {
-        super.setBaseQualities(value);
-        mBinaryDataStale = true;
-    }
-
-    @Override
-    protected void setAttribute(final short tag, final Object value, final boolean isUnsignedArray) {
-        // populate all the attributes from the binary block before overwriting one
-        getBinaryAttributes();
-        super.setAttribute(tag, value, isUnsignedArray);
-        mBinaryDataStale = true;
-    }
-
-    /**
-     * Removes all attributes.
-     */
-    @Override
-    public void clearAttributes() {
-        mAttributesDecoded = true;
-        mBinaryDataStale = true;
-        super.clearAttributes();
-    }
-
-    /**
-     * Avoids decoding binary block to get read length.
-     */
-    @Override
-    public int getReadLength() {
-        if (mReadLengthValid) {
-            return mReadLength;
-        }
-        return super.getReadLength();
-    }
-
-    @Override
-    public String getReadName() {
-        String result = super.getReadName();
-        if (mRestOfBinaryData != null && result == null) {
-            result = decodeReadName();
-            super.setReadName(result);
-        }
-        return result;
-    }
-
-    /**
-     * Avoids decoding read name to get read name length.  Do not include null terminator.
-     */
-    @Override
-    public int getReadNameLength() {
-        if (mReadNameLengthValid) {
-            return mReadNameLength - 1;
-        }
-        return super.getReadNameLength();
-    }
-
-    @Override
-    public Cigar getCigar() {
-        if (mRestOfBinaryData != null && !mCigarDecoded) {
-            final int cigarOffset = readNameSize();
-            final ByteBuffer byteBuffer  = ByteBuffer.wrap(mRestOfBinaryData, cigarOffset, cigarSize());
-            byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-            super.initializeCigar(BinaryCigarCodec.decode(byteBuffer));
-            mCigarDecoded = true;
-            if (null != getHeader() && getValidationStringency() != ValidationStringency.SILENT && !this.getReadUnmappedFlag()) {
-                // Don't know line number, and don't want to force read name to be decoded.
-                SAMUtils.processValidationErrors(validateCigar(-1L), -1, getValidationStringency());
-            }
-        }
-        return super.getCigar();
-    }
-
-    /**
-     * Avoids decoding CIGAR in order to get length.
-     */
-    @Override
-    public int getCigarLength() {
-        if (mCigarLengthValid) {
-            return mCigarLength;
-        } else {
-            return super.getCigarLength();
-        }
-    }
-
-    @Override
-    public byte[] getReadBases() {
-        byte[] result = super.getReadBases();
-        if (mRestOfBinaryData != null && result == null) {
-            result = decodeReadBases();
-            super.setReadBases(result);
-        }
-        return result;
-    }
-
-    @Override
-    public byte[] getBaseQualities() {
-        byte[] ret = super.getBaseQualities();
-        if (mRestOfBinaryData != null && ret == null) {
-            ret = decodeBaseQualities();
-            super.setBaseQualities(ret);
-        }
-        return ret;
-    }
-
-    @Override
-    public Object getAttribute(final short tag) {
-        if (!mAttributesDecoded) {
-            decodeAttributes();
-        }
-        return super.getAttribute(tag);
-    }
-
-    @Override
-    protected SAMBinaryTagAndValue getBinaryAttributes() {
-        if (!mAttributesDecoded) {
-            decodeAttributes();
-        }
-        return super.getBinaryAttributes();
-    }
-
-    private void decodeAttributes() {
-        if (mAttributesDecoded) {
-            return;
-        }
-        mAttributesDecoded = true;
-        final int tagsOffset = readNameSize() + cigarSize() + basesSize() + qualsSize();
-        final int tagsSize = mRestOfBinaryData.length - tagsOffset;
-        final SAMBinaryTagAndValue attributes = BinaryTagCodec.readTags(mRestOfBinaryData, tagsOffset, tagsSize, getValidationStringency());
-        setAttributes(attributes);
-    }
-
-    private byte[] decodeBaseQualities() {
-        if (mReadLength == 0) {
-            return SAMRecord.NULL_QUALS;
-        }
-        final int qualsOffset = readNameSize() + cigarSize() + basesSize();
-        final byte[] ret = new byte[qualsSize()];
-        System.arraycopy(mRestOfBinaryData, qualsOffset, ret, 0, qualsSize());
-        if (ret.length > 0 && ret[0] == (byte) 0xFF) {
-            // BAM files store missing qualities as an array of 0xFF bytes.
-            // 0xFF is an illegal quality score value (it cannot be encoded in SAM)
-            // and so the first byte is a suitable marker.
-            // We hide this quirk of the BAM encoding so that the BAM interface looks the same as SAM.
-            return NULL_QUALS;
-        }
-        return ret;
-    }
-
-    private String decodeReadName() {
-        // Don't include terminating null
-        return StringUtil.bytesToString(mRestOfBinaryData, READ_NAME_OFFSET, mReadNameLength-1);
-    }
-
-    private byte[] decodeReadBases() {
-        if (mReadLength == 0) {
-            return NULL_SEQUENCE;
-        }
-        final int basesOffset = readNameSize() + cigarSize();
-        return SAMUtils.compressedBasesToBytes(mReadLength, mRestOfBinaryData, basesOffset);
-    }
-
-    /* methods for computing disk size of variably-sized elements, in order to locate
-     * elements in mRestOfBinaryData */
-
-    private int readNameSize() {
-        return mReadNameLength;
-    }
-
-    private int cigarSize() {
-        return mCigarLength * 4;
-    }
-
-    private int basesSize() {
-        return (mReadLength + 1)/2;
-    }
-
-    private int qualsSize() {
-        return mReadLength;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMRecordCodec.java b/src/main/java/htsjdk/samtools/BAMRecordCodec.java
deleted file mode 100644
index dc1ca81..0000000
--- a/src/main/java/htsjdk/samtools/BAMRecordCodec.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.RuntimeEOFException;
-import htsjdk.samtools.util.SortingCollection;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-
-/**
- * Class for translating between in-memory and disk representation of BAMRecord.
- */
-public class BAMRecordCodec implements SortingCollection.Codec<SAMRecord> {
-    private final SAMFileHeader header;
-    private final BinaryCodec binaryCodec = new BinaryCodec();
-    private final BinaryTagCodec binaryTagCodec = new BinaryTagCodec(binaryCodec);
-    private final SAMRecordFactory samRecordFactory;
-
-    public BAMRecordCodec(final SAMFileHeader header) {
-        this(header, new DefaultSAMRecordFactory());
-    }
-
-    public BAMRecordCodec(final SAMFileHeader header, final SAMRecordFactory factory) {
-        this.header = header;
-        this.samRecordFactory = factory;
-    }
-
-    public BAMRecordCodec clone() {
-        // Do not clone the references to codecs, as they must be distinct for each instance.
-        return new BAMRecordCodec(this.header, this.samRecordFactory);
-    }
-
-
-    /** Sets the output stream that records will be written to. */
-    public void setOutputStream(final OutputStream os) {
-        this.binaryCodec.setOutputStream(os);
-    }
-
-    /** Sets the output stream that records will be written to. */
-    public void setOutputStream(final OutputStream os, final String filename) {
-        this.binaryCodec.setOutputStream(os);
-        this.binaryCodec.setOutputFileName(filename);
-    }
-
-    /** Sets the input stream that records will be read from. */
-    public void setInputStream(final InputStream is) {
-        this.binaryCodec.setInputStream(is);
-    }
-
-    /** Sets the input stream that records will be read from. */
-    public void setInputStream(final InputStream is, final String filename) {
-        this.binaryCodec.setInputStream(is);
-        this.binaryCodec.setInputFileName(filename);
-    }
-
-    /**
-     * Write object to OutputStream.
-     * Reference and mate reference indices must be resolvable, which either means that these have been set into the
-     * SAMRecord directly, or the SAMRecord must have a header assigned into it so that reference names can be
-     * resolved into indices.
-     *
-     * @param alignment Record to be written.
-     */
-    public void encode(final SAMRecord alignment) {
-        // Compute block size, as it is the first element of the file representation of SAMRecord
-        final int readLength = alignment.getReadLength();
-
-        final int cigarLength = alignment.getCigarLength();
-
-        int blockSize = BAMFileConstants.FIXED_BLOCK_SIZE + alignment.getReadNameLength() + 1  + // null terminated
-                        cigarLength * 4 +
-                        (readLength + 1) / 2 + // 2 bases per byte, round up
-                        readLength;
-
-        final int attributesSize = alignment.getAttributesBinarySize();
-        if (attributesSize != -1) {
-            // binary attribute size already known, don't need to compute.
-            blockSize += attributesSize;
-        } else {
-            SAMBinaryTagAndValue attribute = alignment.getBinaryAttributes();
-            while (attribute != null) {
-                blockSize += (BinaryTagCodec.getTagSize(attribute.value));
-                attribute = attribute.getNext();
-            }
-        }
-
-        int indexBin = 0;
-        if (alignment.getReferenceIndex() >= 0) {
-            if (alignment.getIndexingBin() != null) {
-                indexBin = alignment.getIndexingBin();
-            } else {
-                indexBin = alignment.computeIndexingBin();
-            }
-        }
-
-        // Blurt out the elements
-        this.binaryCodec.writeInt(blockSize);
-        this.binaryCodec.writeInt(alignment.getReferenceIndex());
-        // 0-based!!
-        this.binaryCodec.writeInt(alignment.getAlignmentStart() - 1);
-        this.binaryCodec.writeUByte((short)(alignment.getReadNameLength() + 1));
-        this.binaryCodec.writeUByte((short)alignment.getMappingQuality());
-        this.binaryCodec.writeUShort(indexBin);
-        this.binaryCodec.writeUShort(cigarLength);
-        this.binaryCodec.writeUShort(alignment.getFlags());
-        this.binaryCodec.writeInt(alignment.getReadLength());
-        this.binaryCodec.writeInt(alignment.getMateReferenceIndex());
-        this.binaryCodec.writeInt(alignment.getMateAlignmentStart() - 1);
-        this.binaryCodec.writeInt(alignment.getInferredInsertSize());
-        final byte[] variableLengthBinaryBlock = alignment.getVariableBinaryRepresentation();
-        if (variableLengthBinaryBlock != null) {
-            // Don't need to encode variable-length block, because it is unchanged from
-            // when the record was read from a BAM file.
-            this.binaryCodec.writeBytes(variableLengthBinaryBlock);
-        } else {
-            if (alignment.getReadLength() != alignment.getBaseQualities().length &&
-                alignment.getBaseQualities().length != 0) {
-                throw new RuntimeException("Mismatch between read length and quals length writing read " +
-                alignment.getReadName() + "; read length: " + alignment.getReadLength() +
-                "; quals length: " + alignment.getBaseQualities().length);
-            }
-            this.binaryCodec.writeString(alignment.getReadName(), false, true);
-            final int[] binaryCigar = BinaryCigarCodec.encode(alignment.getCigar());
-            for (final int cigarElement : binaryCigar) {
-                // Assumption that this will fit into an integer, despite the fact
-                // that it is specced as a uint.
-                this.binaryCodec.writeInt(cigarElement);
-            }
-            this.binaryCodec.writeBytes(SAMUtils.bytesToCompressedBases(alignment.getReadBases()));
-            byte[] qualities = alignment.getBaseQualities();
-            if (qualities.length == 0) {
-                qualities = new byte[alignment.getReadLength()];
-                Arrays.fill(qualities, (byte) 0xFF);
-            }
-            this.binaryCodec.writeBytes(qualities);
-            SAMBinaryTagAndValue attribute = alignment.getBinaryAttributes();
-            while (attribute != null) {
-                this.binaryTagCodec.writeTag(attribute.tag, attribute.value, attribute.isUnsignedArray());
-                attribute = attribute.getNext();
-            }
-        }
-    }
-
-    /**
-     * Read the next record from the input stream and convert into a java object.
-     *
-     * @return null if no more records.  Should throw exception if EOF is encountered in the middle of
-     *         a record.
-     */
-    public SAMRecord decode() {
-        int recordLength = 0;
-        try {
-            recordLength = this.binaryCodec.readInt();
-        }
-        catch (RuntimeEOFException e) {
-            return null;
-        }
-
-        if (recordLength < BAMFileConstants.FIXED_BLOCK_SIZE) {
-            throw new SAMFormatException("Invalid record length: " + recordLength);
-        }
-        
-        final int referenceID = this.binaryCodec.readInt();
-        final int coordinate = this.binaryCodec.readInt() + 1;
-        final short readNameLength = this.binaryCodec.readUByte();
-        final short mappingQuality = this.binaryCodec.readUByte();
-        final int bin = this.binaryCodec.readUShort();
-        final int cigarLen = this.binaryCodec.readUShort();
-        final int flags = this.binaryCodec.readUShort();
-        final int readLen = this.binaryCodec.readInt();
-        final int mateReferenceID = this.binaryCodec.readInt();
-        final int mateCoordinate = this.binaryCodec.readInt() + 1;
-        final int insertSize = this.binaryCodec.readInt();
-        final byte[] restOfRecord = new byte[recordLength - BAMFileConstants.FIXED_BLOCK_SIZE];
-        this.binaryCodec.readBytes(restOfRecord);
-        final BAMRecord ret = this.samRecordFactory.createBAMRecord(
-                header, referenceID, coordinate, readNameLength, mappingQuality,
-                bin, cigarLen, flags, readLen, mateReferenceID, mateCoordinate, insertSize, restOfRecord);
-
-        if (null != header) {
-            // don't reset a null header as this will clobber the reference and mate reference indices
-            ret.setHeader(header);
-        }
-        return ret;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BamFileIoUtils.java b/src/main/java/htsjdk/samtools/BamFileIoUtils.java
deleted file mode 100644
index b5c587a..0000000
--- a/src/main/java/htsjdk/samtools/BamFileIoUtils.java
+++ /dev/null
@@ -1,178 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BlockCompressedFilePointerUtil;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.BlockCompressedStreamConstants;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.Md5CalculatingOutputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.List;
-
-public class BamFileIoUtils {
-    private static final Log LOG = Log.getInstance(BamFileIoUtils.class);
-
-    public static final String BAM_FILE_EXTENSION = ".bam";
-
-    public static boolean isBamFile(final File file) {
-        return ((file != null) && file.getName().endsWith(BAM_FILE_EXTENSION));
-    }
-
-    public static void reheaderBamFile(final SAMFileHeader samFileHeader, final File inputFile, final File outputFile) {
-        reheaderBamFile(samFileHeader, inputFile, outputFile, true, true);
-    }
-
-    /**
-     * Copy a BAM file but replacing the header
-     *
-     * @param samFileHeader The header to use in the new file
-     * @param inputFile     The BAM file to copy, sans header
-     * @param outputFile    The new BAM file, constructed with the new header and the content from inputFile
-     * @param createMd5     Whether or not to create an MD5 file for the new BAM
-     * @param createIndex   Whether or not to create an index file for the new BAM
-     */
-    public static void reheaderBamFile(final SAMFileHeader samFileHeader, final File inputFile, final File outputFile, final boolean createMd5, final boolean createIndex) {
-        IOUtil.assertFileIsReadable(inputFile);
-        IOUtil.assertFileIsWritable(outputFile);
-
-        try {
-            BlockCompressedInputStream.assertNonDefectiveFile(inputFile);
-            assertSortOrdersAreEqual(samFileHeader, inputFile);
-
-            final OutputStream outputStream = buildOutputStream(outputFile, createMd5, createIndex);
-
-            BAMFileWriter.writeHeader(outputStream, samFileHeader);
-            blockCopyBamFile(inputFile, outputStream, true, false);
-
-            CloserUtil.close(inputFile);
-            outputStream.close();
-        } catch (final IOException ioe) {
-            throw new RuntimeIOException(ioe);
-        }
-    }
-
-    /**
-     * Copy data from a BAM file to an OutputStream by directly copying the gzip blocks
-     *
-     * @param inputFile      The file to be copied
-     * @param outputStream   The stream to write the copied data to
-     * @param skipHeader     If true, the header of the input file will not be copied to the output stream
-     * @param skipTerminator If true, the terminator block of the input file will not be written to the output stream
-     */
-    public static void blockCopyBamFile(final File inputFile, final OutputStream outputStream, final boolean skipHeader, final boolean skipTerminator) {
-        FileInputStream in = null;
-        try {
-            in = new FileInputStream(inputFile);
-
-            // a) It's good to check that the end of the file is valid and b) we need to know if there's a terminator block and not copy it if skipTerminator is true
-            final BlockCompressedInputStream.FileTermination term = BlockCompressedInputStream.checkTermination(inputFile);
-            if (term == BlockCompressedInputStream.FileTermination.DEFECTIVE)
-                throw new SAMException(inputFile.getAbsolutePath() + " does not have a valid GZIP block at the end of the file.");
-
-            if (skipHeader) {
-                final long vOffsetOfFirstRecord = SAMUtils.findVirtualOffsetOfFirstRecordInBam(inputFile);
-                final BlockCompressedInputStream blockIn = new BlockCompressedInputStream(inputFile);
-                blockIn.seek(vOffsetOfFirstRecord);
-                final long remainingInBlock = blockIn.available();
-
-                // If we found the end of the header then write the remainder of this block out as a
-                // new gzip block and then break out of the while loop
-                if (remainingInBlock >= 0) {
-                    final BlockCompressedOutputStream blockOut = new BlockCompressedOutputStream(outputStream, null);
-                    IOUtil.transferByStream(blockIn, blockOut, remainingInBlock);
-                    blockOut.flush();
-                    // Don't close blockOut because closing underlying stream would break everything
-                }
-
-                long pos = BlockCompressedFilePointerUtil.getBlockAddress(blockIn.getFilePointer());
-                blockIn.close();
-                while (pos > 0) {
-                    pos -= in.skip(pos);
-                }
-            }
-
-            // Copy remainder of input stream into output stream
-            final long currentPos = in.getChannel().position();
-            final long length = inputFile.length();
-            final long skipLast = ((term == BlockCompressedInputStream.FileTermination.HAS_TERMINATOR_BLOCK) && skipTerminator) ?
-                    BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length : 0;
-            final long bytesToWrite = length - skipLast - currentPos;
-
-            IOUtil.transferByStream(in, outputStream, bytesToWrite);
-        } catch (final IOException ioe) {
-            throw new RuntimeIOException(ioe);
-        } finally {
-            CloserUtil.close(in);
-        }
-    }
-
-    /**
-     * Assumes that all inputs and outputs are block compressed VCF files and copies them without decompressing and parsing
-     * most of the gzip blocks. Will decompress and parse blocks up to the one containing the end of the header in each file
-     * (often the first block) and re-compress any data remaining in that block into a new block in the output file. Subsequent
-     * blocks (excluding a terminator block if present) are copied directly from input to output.
-     */
-    public static void gatherWithBlockCopying(final List<File> bams, final File output, final boolean createIndex, final boolean createMd5) {
-        try {
-            OutputStream out = new FileOutputStream(output);
-            if (createMd5) out = new Md5CalculatingOutputStream(out, new File(output.getAbsolutePath() + ".md5"));
-            File indexFile = null;
-            if (createIndex) {
-                indexFile = new File(output.getParentFile(), IOUtil.basename(output) + BAMIndex.BAMIndexSuffix);
-                out = new StreamInflatingIndexingOutputStream(out, indexFile);
-            }
-
-            boolean isFirstFile = true;
-
-            for (final File f : bams) {
-                LOG.info(String.format("Block copying %s ...", f.getAbsolutePath()));
-                blockCopyBamFile(f, out, !isFirstFile, true);
-                isFirstFile = false;
-            }
-
-            // And lastly add the Terminator block and close up
-            out.write(BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK);
-            out.close();
-
-            // It is possible that the modified time on the index file is ever so slightly older than the original BAM file
-            // and this makes ValidateSamFile unhappy.
-            if (createIndex && (output.lastModified() > indexFile.lastModified())) {
-                final boolean success = indexFile.setLastModified(System.currentTimeMillis());
-                if (!success) {
-                    System.err.print(String.format("Index file is older than BAM file for %s and unable to resolve this", output.getAbsolutePath()));
-                }
-            }
-        } catch (final IOException ioe) {
-            throw new RuntimeIOException(ioe);
-        }
-    }
-
-    private static OutputStream buildOutputStream(final File outputFile, final boolean createMd5, final boolean createIndex) throws IOException {
-        OutputStream outputStream = new FileOutputStream(outputFile);
-        if (createMd5) {
-            outputStream = new Md5CalculatingOutputStream(outputStream, new File(outputFile.getAbsolutePath() + ".md5"));
-        }
-        if (createIndex) {
-            outputStream = new StreamInflatingIndexingOutputStream(outputStream, new File(outputFile.getParentFile(), IOUtil.basename(outputFile) + BAMIndex.BAMIndexSuffix));
-        }
-        return outputStream;
-    }
-
-    private static void assertSortOrdersAreEqual(final SAMFileHeader newHeader, final File inputFile) throws IOException {
-        final SamReader reader = SamReaderFactory.makeDefault().open(inputFile);
-        final SAMFileHeader origHeader = reader.getFileHeader();
-        final SAMFileHeader.SortOrder newSortOrder = newHeader.getSortOrder();
-        if (newSortOrder != SAMFileHeader.SortOrder.unsorted && newSortOrder != origHeader.getSortOrder()) {
-            throw new SAMException("Sort order of new header does not match the original file, needs to be " + origHeader.getSortOrder());
-        }
-        reader.close();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BamIndexValidator.java b/src/main/java/htsjdk/samtools/BamIndexValidator.java
deleted file mode 100644
index fb1c8d8..0000000
--- a/src/main/java/htsjdk/samtools/BamIndexValidator.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Class to validate (at two different levels of thoroughness) the index for a BAM file.
- *
- * This class is [<em>not</em>] thread safe [because it is immutable].
- */
-public class BamIndexValidator {
-
-    public enum IndexValidationStringency {
-        EXHAUSTIVE, LESS_EXHAUSTIVE, NONE
-    }
-
-    public static int exhaustivelyTestIndex(final SamReader reader) { // throws Exception {
-        // look at all chunk offsets in a linear index to make sure they are valid
-
-        if (reader.indexing().hasBrowseableIndex()) {
-
-            // content is from an existing bai file
-            final CachingBAMFileIndex existingIndex = (CachingBAMFileIndex) reader.indexing().getBrowseableIndex(); // new CachingBAMFileIndex(inputBai, null);
-            final int numRefs = existingIndex.getNumberOfReferences();
-
-            int chunkCount = 0;
-            int indexCount = 0;
-            for (int i = 0; i < numRefs; i++) {
-                final BAMIndexContent content = existingIndex.getQueryResults(i);
-                for (final Chunk c : content.getAllChunks()) {
-                    final CloseableIterator<SAMRecord> iter = ((SamReader.PrimitiveSamReaderToSamReaderAdapter) reader).iterator(new BAMFileSpan(c));
-                    chunkCount++;
-                    SAMRecord sam = null;
-                    try {
-                        sam = iter.next();
-                        iter.close();
-                    } catch (final Exception e) {
-                        throw new SAMException("Exception in BamIndexValidator. Last good record " + sam + " in chunk " + c + " chunkCount=" + chunkCount, e);
-                    }
-                }
-                // also seek to every position in the linear index
-                // final BAMRecordCodec bamRecordCodec = new BAMRecordCodec(reader.getFileHeader());
-                // bamRecordCodec.setInputStream(reader.getInputStream());
-
-                final LinearIndex linearIndex = content.getLinearIndex();
-                for (final long l : linearIndex.getIndexEntries()) {
-                    try {
-                        if (l != 0) {
-                            final CloseableIterator<SAMRecord> iter = ((SamReader.PrimitiveSamReaderToSamReaderAdapter) reader).iterator(new BAMFileSpan(new Chunk(l, l + 1)));
-                            final SAMRecord sam = iter.next();   // read the first record identified by the linear index
-                            indexCount++;
-                            iter.close();
-                        }
-                    } catch (final Exception e) {
-                        throw new SAMException("Exception in BamIndexValidator. Linear index access failure " + l + " indexCount=" + indexCount, e);
-                    }
-
-                }
-            }
-            return chunkCount;
-            // System.out.println("Found " chunkCount + " chunks in test " + inputBai +
-            // " linearIndex positions = " + indexCount);
-        } // else  not a bam file with a browseable index
-        //    System.err.println("No browseableIndex for reader");
-        return 0;
-    }
-
-    /**
-     * A less time-consuming index validation that only looks at the first and last references in the index
-     * and the first and last chunks in each of those
-     *
-     * @param reader
-     * @return # of chunks examined, or 0 if there is no browseable index for the reader
-     */
-    public static int lessExhaustivelyTestIndex(final SamReader reader) {
-        // look at all chunk offsets in a linear index to make sure they are valid
-        if (reader.indexing().hasBrowseableIndex()) {
-
-            // content is from an existing bai file
-            final CachingBAMFileIndex existingIndex = (CachingBAMFileIndex) reader.indexing().getBrowseableIndex();
-            final int numRefs = existingIndex.getNumberOfReferences();
-
-            int chunkCount = 0;
-            int indexCount = 0;
-            for (int i = 0; i < numRefs; i++) {
-
-                final BAMIndexContent content = existingIndex.getQueryResults(i);
-
-                final List<Chunk> chunks = content.getAllChunks();
-                final int numChunks = chunks.size();
-                // We are looking only at the first and last chunks
-                for (final int chunkNo : Arrays.asList(0, numChunks - 1)) {
-                    chunkCount++;
-
-                    final Chunk c = chunks.get(chunkNo);
-                    final CloseableIterator<SAMRecord> iter = ((SamReader.PrimitiveSamReaderToSamReaderAdapter) reader).iterator(new BAMFileSpan(c));
-                    try {
-                        final SAMRecord sam = iter.next();
-                        iter.close();
-                    } catch (final Exception e) {
-                        throw new SAMException("Exception querying chunk " + chunkNo + " from reference index " + i, e);
-                    }
-                }
-
-                // also seek to first and last position in the linear index
-                final long linearIndexEntries[] = content.getLinearIndex().getIndexEntries();
-                for (final int binNo : Arrays.asList(0, linearIndexEntries.length - 1)) {
-                    indexCount++;
-                    final long l = linearIndexEntries[binNo];
-                    try {
-                        if (l != 0) {
-                            final CloseableIterator<SAMRecord> iter = ((SamReader.PrimitiveSamReaderToSamReaderAdapter) reader).iterator(new BAMFileSpan(new Chunk(l, l + 1)));
-                            final SAMRecord sam = iter.next();   // read the first record identified by the linear index
-                            iter.close();
-                        }
-                    } catch (final Exception e) {
-                        throw new SAMException("Exception in BamIndexValidator. Linear index access failure " + l + " indexCount=" + indexCount, e);
-                    }
-                }
-            }
-            return chunkCount;
-        }
-        // else it's not a bam file with a browseable index
-        return 0;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/Bin.java b/src/main/java/htsjdk/samtools/Bin.java
deleted file mode 100644
index 1ac5724..0000000
--- a/src/main/java/htsjdk/samtools/Bin.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * An individual bin in a BAM file.
- *
- * @author mhanna
- * @version 0.1
- */
-public class Bin implements Comparable<Bin> {
-    /**
-     * The reference sequence associated with this bin.
-     */
-    private final int referenceSequence;
-
-    /**
-     * The number of this bin within the BAM file.
-     */
-    private final int binNumber;
-
-    /**
-     * The chunks associated with this bin.
-     */
-    private List<Chunk> chunkList;
-
-    /**
-     * The last chunk in the chunkList. Only maintained during index building,
-     * not when reading existing index
-     */
-    private Chunk lastChunk;
-
-    public Bin(final int referenceSequence, final int binNumber) {
-        this.referenceSequence = referenceSequence;
-        this.binNumber = binNumber;
-    }
-
-    protected int getReferenceSequence() {
-        return referenceSequence;
-    }
-
-    public int getBinNumber() {
-        return binNumber;
-    }
-
-    /**
-     * See whether two bins are equal.  If the ref seq and the bin number
-     * are equal, assume equality of the chunk list.
-     * @param other The other Bin to which to compare this.
-     * @return True if the two bins are equal.  False otherwise.
-     */
-    @Override
-    public boolean equals(final Object other) {
-        if(other == null) return false;
-        if(!(other instanceof Bin)) return false;
-
-        final Bin otherBin = (Bin)other;
-        return this.referenceSequence == otherBin.referenceSequence && this.binNumber == otherBin.binNumber;
-    }
-
-    /**
-     * Compute a unique hash code for the given reference sequence and bin number.
-     * @return A unique hash code.
-     */
-    @Override
-    public int hashCode() {
-        return ((Integer)referenceSequence).hashCode() ^ ((Integer)binNumber).hashCode();
-    }
-
-    /**
-     * Returns whether the bin currently contains chunks.
-     * @return True if the bin has chunks, false otherwise.
-     */
-    public boolean containsChunks() {
-        return chunkList != null;
-    }
-
-    /**
-     * Compare two bins to see what ordering they should appear in.
-     * @param other Other bin to which this bin should be compared.
-     * @return -1 if this < other, 0 if this == other, 1 if this > other.
-     */
-    public int compareTo(final Bin other) {
-        if(other == null)
-            throw new ClassCastException("Cannot compare to a null object");
-
-        // Check the reference sequences first.
-        if(this.referenceSequence != other.referenceSequence)
-            return referenceSequence - other.referenceSequence;
-
-        // Then check the bin ordering.
-        return binNumber - other.binNumber;
-    }
-
-    /**
-     * Adds the first chunk to the bin
-     */
-    public void addInitialChunk(final Chunk newChunk){
-        final List<Chunk> oldChunks = new ArrayList<Chunk>();
-        setChunkList(oldChunks);
-        setLastChunk(newChunk);
-        oldChunks.add(newChunk);
-    }
-
-    /**
-     * Sets the chunks associated with this bin
-     */
-    public void setChunkList(final List<Chunk> list){
-        chunkList = list;
-    }
-
-    /**
-     * Gets the list of chunks associated with this bin.
-     * @return the chunks in this bin.  If no chunks are associated, an empty list will be returned.
-     */
-    public List<Chunk> getChunkList(){
-        if(chunkList == null)
-            return Collections.<Chunk>emptyList();
-        return chunkList;
-    }
-
-    /**
-     * Optimization to keep lastChunk instead of iterating over all chunks repeatedly
-     */
-    public void setLastChunk(final Chunk c){
-        lastChunk = c;
-    }
-
-    /**
-     * Warning:  Currently only valid during index building, not when reading existing index,
-     * (AbstractBAMFileIndex.optimizeChunkList doesn't maintain this)
-     * @return  the last Chunk of the chunkList
-     */
-    public Chunk getLastChunk(){
-        return lastChunk;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BinList.java b/src/main/java/htsjdk/samtools/BinList.java
deleted file mode 100644
index e7107d4..0000000
--- a/src/main/java/htsjdk/samtools/BinList.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.BitSet;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * Provides a list of all bins which could exist in the BAM file.
- * Allows the user to iterate over all bins, selecting ones of interest
- * for later inspection.
- *
- * @author mhanna
- * @version 0.1
- */
-public class BinList implements Iterable<Bin> {
-    /**
-     * The reference sequence relevant to this bin list.
-     */
-    private final int referenceSequence;
-
-    /**
-     * For each sequence, which bins should be included in the BitSet.
-     */
-    private final BitSet bins;
-
-    /**
-     * Create a new BinList over sequenceCount sequences, consisting of the given bins.
-     * @param referenceSequence Reference sequence to which these bins are relevant.
-     * @param bins The given bins to include.
-     */
-    protected BinList(final int referenceSequence, final BitSet bins) {
-        this.referenceSequence = referenceSequence;
-        this.bins = bins;
-    }
-
-    /**
-     * Gets an iterator over all selected bins.
-     * @return An iterator over all selected bins.
-     */
-    public Iterator<Bin> iterator() {
-        return new BinIterator();
-    }
-
-    /**
-     * Get the reference sequence to which this bin belongs.
-     * @return Integer representing the reference sequence.
-     */
-    protected int getReferenceSequence() {
-        return referenceSequence;
-    }
-
-    /**
-     * Retrieves the bins stored in this list.
-     * @return A bitset where a bin is present in the list if the bit is true.
-     */
-    protected BitSet getBins() {
-        return bins;
-    }
-
-    private class BinIterator implements Iterator<Bin> {
-        /**
-         * Stores the bin currently in use.  Will be -1 if no more bins remain in the set.
-         */
-        private int nextBin;
-
-        public BinIterator() {
-            // Initialize the bin iterator to just before the first bin.
-            nextBin = bins.nextSetBit(0);
-        }
-
-        /**
-         * Are there more bins in this set, waiting to be returned?
-         * @return True if more bins are remaining.
-         */
-        public boolean hasNext() {
-            return nextBin >= 0;
-        }
-
-        /**
-         * Gets the next bin in the provided BinList.
-         * @return the next available bin in the BinList.
-         */
-        public Bin next() {
-            if(!hasNext())
-                throw new NoSuchElementException("This BinIterator is currently empty");
-            int currentBin = nextBin;
-            nextBin = bins.nextSetBit(nextBin+1);
-            return new Bin(referenceSequence,currentBin);
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException("Unable to remove from a bin iterator");
-        }
-    }
-}
-
diff --git a/src/main/java/htsjdk/samtools/BinaryBAMIndexWriter.java b/src/main/java/htsjdk/samtools/BinaryBAMIndexWriter.java
deleted file mode 100644
index 35a22f7..0000000
--- a/src/main/java/htsjdk/samtools/BinaryBAMIndexWriter.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.List;
-
-/**
- * Class for writing binary BAM index files
- */
-class BinaryBAMIndexWriter implements BAMIndexWriter {
-
-    protected final int nRef;
-    private final BinaryCodec codec;
-    private int count = 0;
-
-    /**
-     * constructor
-     *
-     * @param nRef    Number of reference sequences
-     * @param output  BAM Index output file
-     */
-    public BinaryBAMIndexWriter(final int nRef, final File output) {
-
-        this.nRef = nRef;
-
-        try {
-            codec = new BinaryCodec(output, true);
-            writeHeader();
-        } catch (final Exception e) {
-            throw new SAMException("Exception opening output file " + output, e);
-        }
-    }
-
-    /**
-     *
-     * @param nRef Number of reference sequences.
-     * @param output BAM index output stream.  This stream will be closed when BinaryBAMIndexWriter.close() is called.
-     */
-    public BinaryBAMIndexWriter(final int nRef, final OutputStream output) {
-
-        this.nRef = nRef;
-
-        try {
-            codec = new BinaryCodec(output);
-            writeHeader();
-        } catch (final Exception e) {
-            throw new SAMException("Exception opening output stream", e);
-        }
-    }
-
-    /**
-     * Write this content as binary output
-     */
-    public void writeReference(final BAMIndexContent content) {
-
-        if (content == null) {
-            writeNullContent();
-            count++;
-            return;
-        }
-
-        if (content.getReferenceSequence() != count){
-            throw new SAMException("Unexpectedly writing reference " + content.getReferenceSequence() +
-                ", expecting reference " + count);
-        }
-        count ++;
-
-        // write bins
-
-        final BAMIndexContent.BinList bins = content.getBins();
-        final int size = bins == null ? 0 : content.getNumberOfNonNullBins();
-
-        if (size == 0) {
-            writeNullContent();
-            return;
-        }
-
-        //final List<Chunk> chunks = content.getMetaData() == null ? null
-        //        : content.getMetaData().getMetaDataChunks();
-        final BAMIndexMetaData metaData = content.getMetaData();
-
-        codec.writeInt(size + ((metaData != null)? 1 : 0 ));
-        // codec.writeInt(size);
-        for (final Bin bin : bins) {   // note, bins will always be sorted
-            if (bin.getBinNumber() == GenomicIndexUtil.MAX_BINS)
-                continue;
-            writeBin(bin);
-        }
-
-        // write metadata "bin" and chunks        
-        if (metaData != null)
-            writeChunkMetaData(metaData);
-
-        // write linear index
-
-        final LinearIndex linearIndex = content.getLinearIndex();
-        final long[] entries = linearIndex == null ? null : linearIndex.getIndexEntries();
-        final int indexStart = linearIndex == null ? 0 : linearIndex.getIndexStart();
-        final int n_intv = entries == null ? indexStart : entries.length + indexStart;
-        codec.writeInt(n_intv);
-        if (entries == null) {
-            return;
-        }
-        // since indexStart is usually 0, this is usually a no-op
-        for (int i = 0; i < indexStart; i++) {
-            codec.writeLong(0);
-        }
-        for (int k = 0; k < entries.length; k++) {
-            codec.writeLong(entries[k]);
-        }
-        try {
-            codec.getOutputStream().flush();
-        } catch (final IOException e) {
-            throw new SAMException("IOException in BinaryBAMIndexWriter reference " + content.getReferenceSequence(), e);
-        }
-    }
-
-    /**
-     * Writes out the count of records without coordinates
-     *
-     * @param count
-     */
-    public void writeNoCoordinateRecordCount(final Long count) {
-        codec.writeLong(count == null ? 0 : count);
-    }
-
-    /**
-     * Any necessary processing at the end of the file
-     */
-    public void close() {
-        codec.close();
-    }
-
-    private void writeBin(final Bin bin) {
-        final int binNumber = bin.getBinNumber();
-        if (binNumber >= GenomicIndexUtil.MAX_BINS){
-            throw new SAMException("Unexpected bin number when writing bam index " + binNumber);
-        }
-        
-        codec.writeInt(binNumber);
-        if (bin.getChunkList() == null){
-            codec.writeInt(0);
-            return;
-        }
-        final List<Chunk> chunkList = bin.getChunkList();
-        final int n_chunk = chunkList.size();
-        codec.writeInt(n_chunk);
-        for (final Chunk c : chunkList) {
-            codec.writeLong(c.getChunkStart());
-            codec.writeLong(c.getChunkEnd());
-        }
-    }
-
-    /**
-     * Write the meta data represented by the chunkLists associated with bin MAX_BINS 37450
-     *
-     * @param metaData information describing numAligned records, numUnAligned, etc
-     */
-    private void writeChunkMetaData(final BAMIndexMetaData metaData) {
-        codec.writeInt(GenomicIndexUtil.MAX_BINS);
-        final int nChunk = 2;
-        codec.writeInt(nChunk);
-        codec.writeLong(metaData.getFirstOffset());
-        codec.writeLong(metaData.getLastOffset());
-        codec.writeLong(metaData.getAlignedRecordCount());
-        codec.writeLong(metaData.getUnalignedRecordCount());
-
-    }
-
-    private void writeHeader() {
-        // magic string
-        final byte[] magic = BAMFileConstants.BAM_INDEX_MAGIC;
-        codec.writeBytes(magic);
-        codec.writeInt(nRef);
-    }
-
-    private void writeNullContent() {
-        codec.writeLong(0);  // 0 bins , 0 intv
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BinaryCigarCodec.java b/src/main/java/htsjdk/samtools/BinaryCigarCodec.java
deleted file mode 100644
index 95c8e13..0000000
--- a/src/main/java/htsjdk/samtools/BinaryCigarCodec.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.nio.ByteBuffer;
-
-/**
- * Converter between disk and in-memory (object, not String) CIGAR representation.
- */
-class BinaryCigarCodec {
-
-    /**
-     * Convert CIGAR from object representation to disk representation.
-     * @return Array of unsigned ints, one for each element of CIGAR.
-     */
-    static int[] encode(final Cigar cigar) {
-        if (cigar.numCigarElements() == 0) {
-            return new int[0];
-        }
-
-        // Binary rep can be no longer than 1/2 of text rep
-        // Although this is documented as uint, I think lengths will never get that long,
-        // and it's a pain in Java.
-        final int[] binaryCigar = new int[cigar.numCigarElements()];
-        int binaryCigarLength = 0;
-        for (int i = 0; i < cigar.numCigarElements(); ++i) {
-            final CigarElement cigarElement = cigar.getCigarElement(i);
-            final int op = CigarOperator.enumToBinary(cigarElement.getOperator());
-            binaryCigar[binaryCigarLength++] = cigarElement.getLength() << 4 | op;
-        }
-        return binaryCigar;
-    }
-
-    /**
-     * Convert CIGAR from disk representation to object.
-     * @param binaryCigar ByteArray that is assumed to have byte order set appropriately for extracting ints.
-     */
-    static Cigar decode(final ByteBuffer binaryCigar) {
-        final Cigar ret = new Cigar();
-        while (binaryCigar.hasRemaining()) {
-            final int cigarette = binaryCigar.getInt();
-            ret.add(binaryCigarToCigarElement(cigarette));
-        }
-        return ret;
-    }
-
-    /**
-     * Convert CIGAR from disk representation to object.
-     * @param binaryCigar Array of unsigned ints, one for each CIGAR element.
-     */
-    static Cigar decode(final int[] binaryCigar) {
-        final Cigar ret = new Cigar();
-        for (final int cigarette : binaryCigar) {
-            ret.add(binaryCigarToCigarElement(cigarette));
-        }
-        return ret;
-    }
-
-    /**
-     * @param cigarette CIGAR element (operator + length) encoded as an unsigned int.
-     * @return Object representation of the CIGAR element.
-     */
-    private static CigarElement binaryCigarToCigarElement(final int cigarette) {
-        final int binaryOp = cigarette & 0xf;
-        final int length = cigarette >>> 4;
-        return new CigarElement(length, CigarOperator.binaryToEnum(binaryOp));
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BinaryTagCodec.java b/src/main/java/htsjdk/samtools/BinaryTagCodec.java
deleted file mode 100644
index 5603cfc..0000000
--- a/src/main/java/htsjdk/samtools/BinaryTagCodec.java
+++ /dev/null
@@ -1,425 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.StringUtil;
-
-import java.lang.reflect.Array;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Converter between disk and in-memory representation of a SAMRecord tag.
- */
-public class BinaryTagCodec {
-    // Size in bytes of the fixed part of the disk representation of a tag,
-    // i.e. the number of bytes occupied by the tag name and tag type fields.
-    private static final int FIXED_TAG_SIZE = 3;
-
-    // Size in bytes of the fixed part of the value of a binary array,
-    // i.e. the number of bytes occupied by the array type and the array length.
-    private static final int FIXED_BINARY_ARRAY_TAG_SIZE = 5;
-
-    // Integers are stored in the smallest size that will hold them.
-    private static final long MAX_INT = Integer.MAX_VALUE;
-    private static final long MAX_UINT = MAX_INT * 2 + 1;
-    private static final long MAX_SHORT = Short.MAX_VALUE;
-    private static final long MAX_USHORT = MAX_SHORT * 2 + 1;
-    private static final long MAX_BYTE = Byte.MAX_VALUE;
-    private static final long MAX_UBYTE = MAX_BYTE * 2 + 1;
-
-    // Source or sink for disk representation.
-    final BinaryCodec binaryCodec;
-
-    /**
-     * For writing tags.
-     * For reading tags, a BinaryCodec is not used.  See readTags() below.
-     * @param binaryCodec where to write the file rep of the tags
-     */
-    public BinaryTagCodec(final BinaryCodec binaryCodec) {
-        this.binaryCodec = binaryCodec;
-    }
-
-    /**
-     * @param attributeValue In-memory representation of a tag value.
-     * @return Size in bytes to store the value on disk.
-     */
-    private static int getBinaryValueSize(final Object attributeValue) {
-        switch (getTagValueType(attributeValue)) {
-            case 'Z':
-                return ((String)attributeValue).length() + 1;
-            case 'A':
-                return 1;
-            case 'I':
-            case 'i':
-                return 4;
-            case 's':
-            case 'S':
-                return 2;
-            case 'c':
-            case 'C':
-                return 1;
-            case 'f':
-                return 4;
-            case 'H':
-                final byte[] byteArray = (byte[])attributeValue;
-                return byteArray.length * 2 + 1;
-            case 'B':
-                final int numElements = Array.getLength(attributeValue);
-                final int elementSize;
-                if(attributeValue instanceof byte[]) {
-                    elementSize = 1;
-                } else if(attributeValue instanceof short[]) {
-                    elementSize = 2;
-                } else if(attributeValue instanceof int[]) {
-                    elementSize = 4;
-                } else if(attributeValue instanceof float[]) {
-                    elementSize = 4;
-                } else {
-                    throw new IllegalArgumentException("Unsupported array type: " + attributeValue.getClass());
-                }
-                return numElements * elementSize + FIXED_BINARY_ARRAY_TAG_SIZE;
-            default:
-                throw new IllegalArgumentException("When writing BAM, unrecognized tag type " +
-                        attributeValue.getClass().getName());
-        }
-    }
-
-    /**
-     * @param value In-memory representation of a tag value.
-     * @return Size in bytes to store the tag name, tag type and tag value on disk.
-     */
-    static int getTagSize(final Object value) {
-        return FIXED_TAG_SIZE + getBinaryValueSize(value);
-    }
-
-    /**
-     * @param value In-memory representation of a tag value.
-     * @return One-character disk representation of tag type.
-     */
-    static char getTagValueType(final Object value) {
-        if (value instanceof String) {
-            return 'Z';
-        } else if (value instanceof Character) {
-            return 'A';
-        } else if (value instanceof Float) {
-            return 'f';
-        } else if (value instanceof Number) {
-            if (!(value instanceof Byte || value instanceof Short || value instanceof Integer || value instanceof Long)) {
-                throw new IllegalArgumentException("Unrecognized tag type " + value.getClass().getName());
-            }
-            return getIntegerType(((Number)value).longValue());
-        } /*
-           Note that H tag type is never written anymore, because B style is more compact.
-           else if (value instanceof byte[]) {
-            return 'H';
-           }
-          */
-        else if (value instanceof byte[] || value instanceof short[] || value instanceof int[] || value instanceof float[]) {
-            return 'B';
-        } else {
-            throw new IllegalArgumentException("When writing BAM, unrecognized tag type " +
-                    value.getClass().getName());
-        }
-    }
-
-    /**
-     * @param val Integer tag value.
-     * @return Tag type corresponding to the smallest integer type that will hold the given value.
-     */
-    static private char getIntegerType(final long val) {
-        if (val > MAX_UINT) {
-            throw new IllegalArgumentException("Integer attribute value too large to be encoded in BAM");
-        }
-        if (val > MAX_INT) {
-            return 'I';
-        }
-        if (val > MAX_USHORT) {
-            return 'i';
-        }
-        if (val > MAX_SHORT) {
-            return 'S';
-        }
-        if (val > MAX_UBYTE) {
-            return 's';
-        }
-        if (val > MAX_BYTE) {
-            return 'C';
-        }
-        if (val >= Byte.MIN_VALUE) {
-            return 'c';
-        }
-        if (val >= Short.MIN_VALUE) {
-            return 's';
-        }
-        if (val >= Integer.MIN_VALUE) {
-            return 'i';
-        }
-        throw new IllegalArgumentException("Integer attribute value too negative to be encoded in BAM");
-    }
-
-    /**
-     * Write the given tag name and value to disk.
-     */
-    public void writeTag(final short tag, final Object value, final boolean isUnsignedArray) {
-        binaryCodec.writeShort(tag);
-        final char tagValueType = getTagValueType(value);
-        binaryCodec.writeByte(tagValueType);
-
-        switch (tagValueType) {
-            case 'Z':
-                binaryCodec.writeString((String)value, false, true);
-                break;
-            case 'A':
-                binaryCodec.writeByte(((Character)value));
-                break;
-            case 'I':
-                binaryCodec.writeUInt((Long)value);
-                break;
-            case 'i':
-                binaryCodec.writeInt(((Number)value).intValue());
-                break;
-            case 's':
-                binaryCodec.writeShort(((Number)value).shortValue());
-                break;
-            case 'S':
-                binaryCodec.writeUShort(((Number)value).intValue());
-                break;
-            case 'c':
-                binaryCodec.writeByte(((Number)value).byteValue());
-                break;
-            case 'C':
-                binaryCodec.writeUByte(((Integer)value).shortValue());
-                break;
-            case 'f':
-                binaryCodec.writeFloat((Float)value);
-                break;
-            /*
-            Writing H is no longer supported
-            case 'H':
-                final byte[] byteArray = (byte[])value;
-                binaryCodec.writeString(StringUtil.bytesToHexString(byteArray), false, true);
-                break;
-             */
-            case 'B':
-                writeArray(value, isUnsignedArray);
-                break;
-            default:
-                throw new IllegalArgumentException("When writing BAM, unrecognized tag type " +
-                        value.getClass().getName());
-        }
-    }
-
-    private void writeArray(final Object value, final boolean isUnsignedArray) {
-        if (value instanceof byte[]) {
-            binaryCodec.writeByte(isUnsignedArray? 'C': 'c');
-            final byte[] array = (byte[]) value;
-            binaryCodec.writeInt(array.length);
-            for (final byte element: array) binaryCodec.writeByte(element);
-
-        } else if (value instanceof short[]) {
-            binaryCodec.writeByte(isUnsignedArray? 'S': 's');
-            final short[] array = (short[]) value;
-            binaryCodec.writeInt(array.length);
-            for (final short element: array) binaryCodec.writeShort(element);
-
-        } else if (value instanceof int[]) {
-            binaryCodec.writeByte(isUnsignedArray? 'I': 'i');
-            final int[] array = (int[]) value;
-            binaryCodec.writeInt(array.length);
-            for (final int element: array) binaryCodec.writeInt(element);
-
-        } else if (value instanceof float[]) {
-            binaryCodec.writeByte('f');
-            final float[] array = (float[]) value;
-            binaryCodec.writeInt(array.length);
-            for (final float element: array) binaryCodec.writeFloat(element);
-
-        } else throw new SAMException("Unrecognized array value type: " + value.getClass());
-    }
-
-    /**
-     * Convert tags from little-endian disk representation to in-memory representation.
-     * @param binaryRep Byte buffer containing file representation of tags.
-     * @param offset Where in binaryRep tags start.
-     * @param length How many bytes in binaryRep are tag storage.
-     */
-    public static SAMBinaryTagAndValue readTags(final byte[] binaryRep, final int offset,
-                                                final int length, final ValidationStringency validationStringency) {
-        final ByteBuffer byteBuffer = ByteBuffer.wrap(binaryRep, offset, length);
-        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-
-        SAMBinaryTagAndValue head = null;
-        SAMBinaryTagAndValue tail = null;
-
-        while (byteBuffer.hasRemaining()) {
-            final short tag = byteBuffer.getShort();
-            final byte tagType = byteBuffer.get();
-            final SAMBinaryTagAndValue tmp;
-            if (tagType != 'B') {
-                tmp = new SAMBinaryTagAndValue(tag, readSingleValue(tagType, byteBuffer, validationStringency));
-            } else {
-                final TagValueAndUnsignedArrayFlag valueAndFlag = readArray(byteBuffer, validationStringency);
-                if (valueAndFlag.isUnsignedArray) tmp = new SAMBinaryTagAndUnsignedArrayValue(tag, valueAndFlag.value);
-                else tmp = new SAMBinaryTagAndValue(tag, valueAndFlag.value);
-            }
-
-            // If samjdk wrote the BAM then the attributes will be in lowest->highest tag order, to inserting at the
-            // head each time will be very inefficient. To fix that we check here to see if the tag should go right on
-            // the tail and if so stick it there, else insert it through the head.
-            if (head == null) {
-                head = tmp;
-                tail = tmp;
-            }
-            else if (tmp.tag > tail.tag) {
-                tail.insert(tmp);
-                tail = tmp;
-            }
-            else {
-                head = head.insert(tmp);
-            }
-        }
-
-        return head;
-    }
-
-    /**
-     * Read value of specified non-array type.
-     * @param tagType What type to read.
-     * @param byteBuffer Little-ending byte buffer to read value from.
-     * @return Value in in-memory Object form.
-     */
-    private static  Object readSingleValue(final byte tagType, final ByteBuffer byteBuffer,
-                                           final ValidationStringency validationStringency) {
-        switch (tagType) {
-            case 'Z':
-                return readNullTerminatedString(byteBuffer);
-            case 'A':
-                return (char)byteBuffer.get();
-            case 'I':
-                final long val = byteBuffer.getInt() & 0xffffffffL;
-                if ( val <= Integer.MAX_VALUE ) {
-                    return (int)val;
-                }
-                // If it won't fit into a signed integer, but is within range for an unsigned 32-bit integer,
-                // return it directly as a long
-                if (! SAMUtils.isValidUnsignedIntegerAttribute(val)) {
-                    SAMUtils.processValidationError(new SAMValidationError(SAMValidationError.Type.TAG_VALUE_TOO_LARGE,
-                            "Unsigned integer is out of range for a 32-bit unsigned value: " + val, null), validationStringency);
-                }
-                return val;
-            case 'i':
-                return byteBuffer.getInt();
-            case 's':
-                return (int)byteBuffer.getShort();
-            case 'S':
-                // Convert to unsigned short stored in an int
-                return byteBuffer.getShort() & 0xffff;
-            case 'c':
-                return (int)byteBuffer.get();
-            case 'C':
-                // Convert to unsigned byte stored in an int
-                return (int)byteBuffer.get() & 0xff;
-            case 'f':
-                return byteBuffer.getFloat();
-            case 'H':
-                final String hexRep = readNullTerminatedString(byteBuffer);
-                return StringUtil.hexStringToBytes(hexRep);
-            default:
-                throw new SAMFormatException("Unrecognized tag type: " + (char)tagType);
-        }
-    }
-
-
-
-
-    /**
-     * Read value of specified type.
-     * @param byteBuffer Little-ending byte buffer to read value from.
-     * @return CVO containing the value in in-memory Object form, and a flag indicating whether it is unsigned or not.
-     */
-    private static TagValueAndUnsignedArrayFlag readArray(final ByteBuffer byteBuffer,
-                                                          final ValidationStringency validationStringency) {
-        final byte arrayType = byteBuffer.get();
-        final boolean isUnsigned = Character.isUpperCase(arrayType);
-        final int length = byteBuffer.getInt();
-        final Object value;
-        switch (Character.toLowerCase(arrayType)) {
-            case 'c': {
-                final byte[] array = new byte[length];
-                value = array;
-                byteBuffer.get(array);
-                break;
-            }
-            case 's': {
-                final short[] array = new short[length];
-                value = array;
-                for (int i = 0; i < length; ++i) {
-                    array[i] = byteBuffer.getShort();
-                }
-                break;
-            }
-
-            case 'i': {
-                final int[] array = new int[length];
-                value = array;
-                for (int i = 0; i < length; ++i) {
-                    array[i] = byteBuffer.getInt();
-                }
-                break;
-            }
-
-            case 'f': {
-                final float[] array = new float[length];
-                value = array;
-                for (int i = 0; i < length; ++i) {
-                    array[i] = byteBuffer.getFloat();
-                }
-                break;
-            }
-
-            default:
-                throw new SAMFormatException("Unrecognized tag array type: " + (char)arrayType);
-        }
-        return new TagValueAndUnsignedArrayFlag(value, isUnsigned);
-    }
-
-    private static String readNullTerminatedString(final ByteBuffer byteBuffer) {
-        // Count the number of bytes in the string
-        byteBuffer.mark();
-        final int startPosition = byteBuffer.position();
-        while (byteBuffer.get() != 0) {}
-        final int endPosition = byteBuffer.position();
-
-        // Don't count null terminator
-        final byte[] buf = new byte[endPosition - startPosition - 1];
-        // Go back to the start of the string and read out the bytes
-        byteBuffer.reset();
-        byteBuffer.get(buf);
-        // Skip over the null terminator
-        byteBuffer.get();
-        return StringUtil.bytesToString(buf);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BinningIndexBuilder.java b/src/main/java/htsjdk/samtools/BinningIndexBuilder.java
deleted file mode 100644
index 37933f4..0000000
--- a/src/main/java/htsjdk/samtools/BinningIndexBuilder.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BlockCompressedFilePointerUtil;
-
-import java.util.List;
-
-import static htsjdk.samtools.GenomicIndexUtil.MAX_BINS;
-
-/**
- * Builder for a BinningIndexContent object.
- */
-public class BinningIndexBuilder {
-    private final int referenceSequence;
-    // the bins for the current reference
-    private final Bin[] bins; // made only as big as needed for each reference
-    private int binsSeen = 0;
-
-    // linear index for the current reference
-    private final long[] index = new long[LinearIndex.MAX_LINEAR_INDEX_SIZE];
-    private int largestIndexSeen = -1;
-
-
-    /**
-     *
-     * @param referenceSequence
-     * @param sequenceLength 0 implies unknown length.  Known length will reduce memory use.
-     */
-    public BinningIndexBuilder(final int referenceSequence, final int sequenceLength) {
-        this.referenceSequence = referenceSequence;
-        final int numBins;
-        if (sequenceLength <= 0) numBins = MAX_BINS + 1;
-        else numBins = AbstractBAMFileIndex.getMaxBinNumberForSequenceLength(sequenceLength) + 1;
-        bins = new Bin[numBins];
-    }
-
-    public BinningIndexBuilder(final int referenceSequence) {
-        this(referenceSequence, 0);
-    }
-
-    /**
-     * coordinates are 1-based, inclusive
-     */
-    public interface FeatureToBeIndexed {
-        public int getStart();
-        public int getEnd();
-        public Integer getIndexingBin();
-        public Chunk getChunk();
-    }
-
-    public void processFeature(final FeatureToBeIndexed feature) {
-
-        // process bins
-
-        final Integer binNumber = feature.getIndexingBin();
-        final int binNum = binNumber == null ? computeIndexingBin(feature) : binNumber;
-
-
-        // is there a bin already represented for this index?  if not, add one
-        final Bin bin;
-        if (bins[binNum] != null) {
-            bin = bins[binNum];
-        } else {
-            bin = new Bin(referenceSequence, binNum);
-            bins[binNum] = bin;
-            binsSeen++;
-        }
-
-        // process chunks
-
-        final Chunk newChunk = feature.getChunk();
-        final long chunkStart = newChunk.getChunkStart();
-        final long chunkEnd = newChunk.getChunkEnd();
-
-        final List<Chunk> oldChunks = bin.getChunkList();
-        if (!bin.containsChunks()) {
-            bin.addInitialChunk(newChunk);
-
-        } else {
-            final Chunk lastChunk = bin.getLastChunk();
-
-            // Coalesce chunks that are in the same or adjacent file blocks.
-            // Similar to AbstractBAMFileIndex.optimizeChunkList,
-            // but no need to copy the list, no minimumOffset, and maintain bin.lastChunk
-            if (BlockCompressedFilePointerUtil.areInSameOrAdjacentBlocks(lastChunk.getChunkEnd(), chunkStart)) {
-                lastChunk.setChunkEnd(chunkEnd);  // coalesced
-            } else {
-                oldChunks.add(newChunk);
-                bin.setLastChunk(newChunk);
-            }
-        }
-
-        // process linear index
-
-        // the smallest file offset that appears in the 16k window for this bin
-        final int featureEnd = feature.getEnd();
-        int startWindow = LinearIndex.convertToLinearIndexOffset(feature.getStart()); // the 16k window
-        final int endWindow;
-
-        if (featureEnd == GenomicIndexUtil.UNSET_GENOMIC_LOCATION) {   // assume feature uses one position
-            // Next line for C (samtools index) compatibility. Differs only when on a window boundary
-            startWindow = LinearIndex.convertToLinearIndexOffset(feature.getStart() - 1);
-            endWindow = startWindow;
-        } else {
-            endWindow = LinearIndex.convertToLinearIndexOffset(featureEnd);
-        }
-
-        if (endWindow > largestIndexSeen) {
-            largestIndexSeen = endWindow;
-        }
-
-        // set linear index at every 16K window that this feature overlaps
-        for (int win = startWindow; win <= endWindow; win++) {
-            if (index[win] == 0 || chunkStart < index[win]) {
-                index[win] = chunkStart;
-            }
-        }
-    }
-
-    /**
-     * Creates the BAMIndexContent for this reference.
-     * Requires all features of the reference have already been processed.
-     */
-    public BinningIndexContent generateIndexContent() {
-
-
-        // process bins
-        if (binsSeen == 0) return null;  // no bins for this reference
-
-        // process chunks
-        // nothing needed
-
-        // process linear index
-        // linear index will only be as long as the largest index seen
-        final long[] newIndex = new long[largestIndexSeen + 1]; // in java1.6 Arrays.copyOf(index, largestIndexSeen + 1);
-
-        // C (samtools index) also fills in intermediate 0's with values.  This seems unnecessary, but safe
-        long lastNonZeroOffset = 0;
-        for (int i = 0; i <= largestIndexSeen; i++) {
-            if (index[i] == 0) {
-                index[i] = lastNonZeroOffset; // not necessary, but C (samtools index) does this
-                // note, if you remove the above line BAMIndexWriterTest.compareTextual and compareBinary will have to change
-            } else {
-                lastNonZeroOffset = index[i];
-            }
-            newIndex[i] = index[i];
-        }
-
-        final LinearIndex linearIndex = new LinearIndex(referenceSequence, 0, newIndex);
-
-        return new BinningIndexContent(referenceSequence, new BinningIndexContent.BinList(bins, binsSeen), linearIndex);
-    }
-
-    private int computeIndexingBin(final FeatureToBeIndexed feature) {
-        // regionToBin has zero-based, half-open API
-        final int start = feature.getStart()-1;
-        int end = feature.getEnd();
-        if (end <= 0) {
-            // If feature end cannot be determined (e.g. because a read is not really aligned),
-            // then treat this as a one base feature for indexing purposes.
-            end = start + 1;
-        }
-        return GenomicIndexUtil.regionToBin(start, end);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BinningIndexContent.java b/src/main/java/htsjdk/samtools/BinningIndexContent.java
deleted file mode 100644
index 9e32601..0000000
--- a/src/main/java/htsjdk/samtools/BinningIndexContent.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.BitSet;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * In-memory representation of the binning index for a single reference.  BAM and Tabix are both binning indices
- * with slightly different disk formats but identical in-memory representations.
- */
-public class BinningIndexContent {
-    /**
-     * The reference sequence for the data currently loaded.
-     */
-    private final int mReferenceSequence;
-
-    /**
-     * A list of all bins in the above reference sequence.
-     */
-    private final BinList mBinList;
-
-    /**
-     * The linear index for the reference sequence above.
-     */
-    private final LinearIndex mLinearIndex;
-
-
-    /**
-     * @param referenceSequence Content corresponds to this reference.
-     * @param binList           Array of bins represented by this content, possibly sparse
-     * @param linearIndex       Additional index used to optimize queries
-     */
-    public BinningIndexContent(final int referenceSequence, final BinList binList, final LinearIndex linearIndex) {
-        this.mReferenceSequence = referenceSequence;
-        this.mBinList = binList;
-        this.mLinearIndex = linearIndex;
-    }
-
-    /**
-     * Reference for this Content
-     */
-    public int getReferenceSequence() {
-        return mReferenceSequence;
-    }
-
-    /**
-     * Does this content have anything in this bin?
-     */
-    public boolean containsBin(final Bin bin) {
-        return mBinList.getBin(bin.getBinNumber()) != null;
-    }
-
-    /**
-     * @return iterable list of bins represented by this content
-     */
-    public BinList getBins() {
-        return mBinList;
-    }
-
-    /**
-     * @return the number of non-null bins represented by this content
-     */
-    int getNumberOfNonNullBins() {
-        return mBinList.getNumberOfNonNullBins();
-    }
-
-    /**
-     * @return all chunks associated with all bins in this content
-     */
-    public List<Chunk> getAllChunks() {
-        final List<Chunk> allChunks = new ArrayList<Chunk>();
-        for (final Bin b : mBinList)
-            if (b.getChunkList() != null) {
-                allChunks.addAll(b.getChunkList());
-            }
-        return Collections.unmodifiableList(allChunks);
-    }
-
-    /**
-     * @return the linear index represented by this content
-     */
-    public LinearIndex getLinearIndex() {
-        return mLinearIndex;
-    }
-
-
-    /**
-     *
-     * @param startPos 1-based, inclusive
-     * @param endPos 1-based, inclusive
-     * @return List of Chunks overlapping the given region.  May return null if there are none.
-     */
-    public List<Chunk> getChunksOverlapping(final int startPos, final int endPos) {
-        final BitSet overlappingBins = GenomicIndexUtil.regionToBins(startPos,endPos);
-        if (overlappingBins == null) return null;
-
-        // System.out.println("# Sequence target TID: " + referenceIndex);
-        final List<Chunk> chunkList = new ArrayList<Chunk>();
-
-        for (int index = overlappingBins.nextSetBit(0); index >= 0; index = overlappingBins.nextSetBit(index + 1)) {
-            final Bin bin = getBins().getBin(index);
-            if (bin != null) {
-                for (final Chunk chunk : bin.getChunkList()) {
-                    chunkList.add(chunk.clone());
-                }
-            }
-        }
-
-        if (chunkList.isEmpty()) {
-            return null;
-        }
-
-        return Chunk.optimizeChunkList(chunkList, getLinearIndex().getMinimumOffset(startPos));
-    }
-    /**
-     * This class is used to encapsulate the list of Bins store in the BAMIndexContent
-     * While it is currently represented as an array, we may decide to change it to an ArrayList or other structure
-     */
-    public static class BinList implements Iterable<Bin> {
-
-        private final Bin[] mBinArray;
-        public final int numberOfNonNullBins;
-        public final int maxBinNumber;  // invariant: maxBinNumber = mBinArray.length -1 since array is 0 based
-
-        /**
-         * @param binArray            a sparse array representation of the bins. The index into the array is the bin number.
-         * @param numberOfNonNullBins
-         */
-        public BinList(final Bin[] binArray, final int numberOfNonNullBins) {
-            this.mBinArray = binArray;
-            this.numberOfNonNullBins = numberOfNonNullBins;
-            this.maxBinNumber = mBinArray.length - 1;
-        }
-
-        Bin getBin(final int binNumber) {
-            if (binNumber > maxBinNumber) return null;
-            return mBinArray[binNumber];
-        }
-
-        int getNumberOfNonNullBins() {
-            return numberOfNonNullBins;
-        }
-
-        /**
-         * @return An iterator over all non-empty bins.
-         */
-        public Iterator<Bin> iterator() {
-            return new BinIterator();
-        }
-
-        private class BinIterator implements Iterator<Bin> {
-            /**
-             * Stores the bin # of the Bin currently in use.
-             */
-            private int nextBin;
-
-            public BinIterator() {
-                nextBin = 0;
-            }
-
-            /**
-             * Are there more bins in this set, waiting to be returned?
-             *
-             * @return True if more bins are remaining.
-             */
-            public boolean hasNext() {
-                while (nextBin <= maxBinNumber) {
-                    if (getBin(nextBin) != null) return true;
-                    nextBin++;
-                }
-                return false;
-            }
-
-            /**
-             * Gets the next bin in the provided BinList.
-             *
-             * @return the next available bin in the BinList.
-             */
-            public Bin next() {
-                if (!hasNext())
-                    throw new NoSuchElementException("This BinIterator is currently empty");
-                final Bin result = getBin(nextBin);
-                nextBin++;
-                return result;
-            }
-
-            public void remove() {
-                throw new UnsupportedOperationException("Unable to remove from a bin iterator");
-            }
-        }
-
-        @Override
-        public boolean equals(final Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-
-            final BinList bins = (BinList) o;
-
-            if (maxBinNumber != bins.maxBinNumber) return false;
-            if (numberOfNonNullBins != bins.numberOfNonNullBins) return false;
-            if (!Arrays.equals(mBinArray, bins.mBinArray)) return false;
-
-            return true;
-        }
-
-        @Override
-        public int hashCode() {
-            int result = Arrays.hashCode(mBinArray);
-            result = 31 * result + numberOfNonNullBins;
-            result = 31 * result + maxBinNumber;
-            return result;
-        }
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final BinningIndexContent that = (BinningIndexContent) o;
-
-        if (mReferenceSequence != that.mReferenceSequence) return false;
-        if (!mBinList.equals(that.mBinList)) return false;
-        if (!mLinearIndex.equals(that.mLinearIndex)) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = mReferenceSequence;
-        result = 31 * result + mBinList.hashCode();
-        result = 31 * result + mLinearIndex.hashCode();
-        return result;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/BrowseableBAMIndex.java b/src/main/java/htsjdk/samtools/BrowseableBAMIndex.java
deleted file mode 100644
index c6eca51..0000000
--- a/src/main/java/htsjdk/samtools/BrowseableBAMIndex.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * An index interface with additional functionality for querying and inspecting the structure of a BAM index.
- *
- * @author mhanna
- * @version 0.1
- */
-public interface BrowseableBAMIndex extends BAMIndex {
-
-    /**
-     * Gets the size (number of bins in) a given level of a BAM index.
-     * @param levelNumber Level for which to inspect the size.
-     * @return Size of the given level.
-     */
-    public int getLevelSize(final int levelNumber);
-
-    /**
-     * Gets the level associated with the given bin number.
-     * @param bin The bin  for which to determine the level.
-     * @return the level associated with the given bin number.
-     */
-    public int getLevelForBin(final Bin bin);
-    
-    /**
-     * Gets the first locus that this bin can index into.
-     * @param bin The bin to test.
-     * @return The last position that the given bin can represent.
-     */
-    int getFirstLocusInBin(final Bin bin);
-
-    /**
-     * Gets the last locus that this bin can index into.
-     * @param bin The bin to test.
-     * @return The last position that the given bin can represent.
-     */
-    int getLastLocusInBin(final Bin bin);
-
-    /**
-     * Get a list of bins in the BAM file that may contain SAMRecords for the given range.
-     * @param referenceIndex sequence of desired SAMRecords
-     * @param startPos 1-based start of the desired interval, inclusive
-     * @param endPos 1-based end of the desired interval, inclusive
-     * @return a list of bins that contain relevant data.
-     */
-    BinList getBinsOverlapping(final int referenceIndex, final int startPos, final int endPos);
-
-    /**
-     * Perform an overlapping query of all bins bounding the given location.
-     * @param bin The bin over which to perform an overlapping query.
-     * @return The file pointers
-     */
-    BAMFileSpan getSpanOverlapping(final Bin bin);    
-}
diff --git a/src/main/java/htsjdk/samtools/CRAMBAIIndexer.java b/src/main/java/htsjdk/samtools/CRAMBAIIndexer.java
deleted file mode 100755
index 352e9e1..0000000
--- a/src/main/java/htsjdk/samtools/CRAMBAIIndexer.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/*******************************************************************************
- * Copyright 2013 EMBL-EBI
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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, sub-license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.ContainerParser;
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.BlockCompressedFilePointerUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.ProgressLogger;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-
-/**
- * Class for both constructing BAM index content and writing it out.
- * There are two usage patterns:
- * 1) Building a bam index from an existing cram file
- * 2) Building a bam index while building the cram file
- * In both cases, processAlignment is called for each cram slice and
- * finish() is called at the end.
- */
-public class CRAMBAIIndexer {
-
-    // The number of references (chromosomes) in the BAM file
-    private final int numReferences;
-
-    // output written as binary, or (for debugging) as text
-    private final BAMIndexWriter outputWriter;
-
-    private int currentReference = 0;
-
-    // content is built up from the input bam file using this
-    private final BAMIndexBuilder indexBuilder;
-
-    /**
-     * Create a CRAM indexer that writes BAI to a file.
-     *
-     * @param output     binary BAM Index (.bai) file
-     * @param fileHeader header for the corresponding bam file
-     */
-    public CRAMBAIIndexer(final File output, final SAMFileHeader fileHeader) {
-
-        numReferences = fileHeader.getSequenceDictionary().size();
-        indexBuilder = new BAMIndexBuilder(fileHeader);
-        outputWriter = new BinaryBAMIndexWriter(numReferences, output);
-    }
-
-    /**
-     * Create a CRAM indexer that writes BAI to a stream.
-     *
-     * @param output     Index will be written here.  output will be closed when finish() method is called.
-     * @param fileHeader header for the corresponding bam file.
-     */
-    public CRAMBAIIndexer(final OutputStream output, final SAMFileHeader fileHeader) {
-
-        numReferences = fileHeader.getSequenceDictionary().size();
-        indexBuilder = new BAMIndexBuilder(fileHeader);
-        outputWriter = new BinaryBAMIndexWriter(numReferences, output);
-    }
-
-    /**
-     * Index a container, any of mapped, unmapped and multiple references are allowed. The only requirement is sort
-     * order by coordinate.
-     * For multiref containers the method reads the container through unpacking all reads. This is slower than single
-     * reference but should be faster than normal reading.
-     *
-     * @param container container to be indexed
-     */
-    public void processContainer(final Container container, final ValidationStringency validationStringency) {
-        try {
-            if (container == null || container.isEOF()) {
-                return;
-            }
-
-            int sliceIndex = 0;
-            for (final Slice slice : container.slices) {
-                slice.containerOffset = container.offset;
-                slice.index = sliceIndex++;
-                if (slice.isMultiref()) {
-                    final ContainerParser parser = new ContainerParser(indexBuilder.bamHeader);
-                    final Map<Integer, AlignmentSpan> refSet = parser.getReferences(container, validationStringency);
-                    final Slice fakeSlice = new Slice();
-                    slice.containerOffset = container.offset;
-                    slice.index = sliceIndex++;
-                    /**
-                     * Unmapped span must be processed after mapped spans:
-                     */
-                    AlignmentSpan unmappedSpan = refSet.remove(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-                    for (final int refId : new TreeSet<>(refSet.keySet())) {
-                        final AlignmentSpan span = refSet.get(refId);
-                        fakeSlice.sequenceId = refId;
-                        fakeSlice.containerOffset = slice.containerOffset;
-                        fakeSlice.offset = slice.offset;
-                        fakeSlice.index = slice.index;
-
-                        fakeSlice.alignmentStart = span.getStart();
-                        fakeSlice.alignmentSpan = span.getSpan();
-                        fakeSlice.nofRecords = span.getCount();
-                        processSingleReferenceSlice(fakeSlice);
-                    }
-                    if (unmappedSpan != null) {
-                        final AlignmentSpan span = unmappedSpan;
-                        fakeSlice.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-                        fakeSlice.containerOffset = slice.containerOffset;
-                        fakeSlice.offset = slice.offset;
-                        fakeSlice.index = slice.index;
-
-                        fakeSlice.alignmentStart = SAMRecord.NO_ALIGNMENT_START;
-                        fakeSlice.alignmentSpan = 0;
-                        fakeSlice.nofRecords = span.getCount();
-                        processSingleReferenceSlice(fakeSlice);
-                    }
-                } else {
-                    processSingleReferenceSlice(slice);
-                }
-            }
-
-        } catch (final IOException e) {
-            throw new RuntimeIOException("Failed to read cram container", e);
-        }
-    }
-
-    /**
-     * Record index information for a given CRAM slice that contains either unmapped reads or
-     * reads mapped to a single reference.
-     * If this alignment starts a new reference, write out the old reference.
-     *
-     * @param slice The CRAM slice, single ref or unmapped only.
-     * @throws htsjdk.samtools.SAMException if slice refers to multiple reference sequences.
-     */
-    public void processSingleReferenceSlice(final Slice slice) {
-        try {
-            final int reference = slice.sequenceId;
-            if (reference == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                return;
-            }
-            if (slice.sequenceId == Slice.MULTI_REFERENCE) {
-                throw new SAMException("Expecting a single reference slice.");
-            }
-            if (reference != currentReference) {
-                // process any completed references
-                advanceToReference(reference);
-            }
-            indexBuilder.processSingleReferenceSlice(slice);
-        } catch (final Exception e) {
-            throw new SAMException("Exception creating BAM index for slice " + slice, e);
-        }
-    }
-
-    /**
-     * After all the slices have been processed, finish is called.
-     * Writes any final information and closes the output file.
-     */
-    public void finish() {
-        // process any remaining references
-        advanceToReference(numReferences);
-        outputWriter.writeNoCoordinateRecordCount(indexBuilder.getNoCoordinateRecordCount());
-        outputWriter.close();
-    }
-
-    /**
-     * write out any references between the currentReference and the nextReference
-     */
-    private void advanceToReference(final int nextReference) {
-        while (currentReference < nextReference) {
-            final BAMIndexContent content = indexBuilder.processReference(currentReference);
-            outputWriter.writeReference(content);
-            currentReference++;
-            indexBuilder.startNewReference();
-        }
-    }
-
-    /**
-     * Class for constructing BAM index files.
-     * One instance is used to construct an entire index.
-     * processAlignment is called for each alignment until a new reference is encountered, then
-     * processReference is called when all records for the reference have been processed.
-     */
-    private class BAMIndexBuilder {
-
-        private final SAMFileHeader bamHeader;
-
-        // the bins for the current reference
-        private Bin[] bins; // made only as big as needed for each reference
-        private int binsSeen = 0;
-
-        // linear index for the current reference
-        private final long[] index = new long[LinearIndex.MAX_LINEAR_INDEX_SIZE];
-        private int largestIndexSeen = -1;
-
-        // information in meta data
-        private final BAMIndexMetaData indexStats = new BAMIndexMetaData();
-
-        /**
-         * @param header SAMFileHeader used for reference name (in index stats) and for max bin number
-         */
-        BAMIndexBuilder(final SAMFileHeader header) {
-            this.bamHeader = header;
-        }
-
-        private int computeIndexingBin(final Slice slice) {
-            // regionToBin has zero-based, half-open API
-            final int alignmentStart = slice.alignmentStart - 1;
-            int alignmentEnd = slice.alignmentStart + slice.alignmentSpan - 1;
-            if (alignmentEnd <= alignmentStart) {
-                // If alignment end cannot be determined (e.g. because this read is not really aligned),
-                // then treat this as a one base alignment for indexing purposes.
-                alignmentEnd = alignmentStart + 1;
-            }
-            return GenomicIndexUtil.regionToBin(alignmentStart, alignmentEnd);
-        }
-
-
-        /**
-         * Record any index information for a given CRAM slice
-         *
-         * @param slice CRAM slice, single ref or unmapped only.
-         */
-        private void processSingleReferenceSlice(final Slice slice) {
-
-            // metadata
-            indexStats.recordMetaData(slice);
-
-            final int alignmentStart = slice.alignmentStart;
-            if (alignmentStart == SAMRecord.NO_ALIGNMENT_START) {
-                return; // do nothing for records without coordinates, but count them
-            }
-
-            // various checks
-            final int reference = slice.sequenceId;
-            if (reference != currentReference) {
-                throw new SAMException("Unexpected reference " + reference +
-                        " when constructing index for " + currentReference + " for record " + slice);
-            }
-
-            // process bins
-
-            final int binNum = computeIndexingBin(slice);
-
-            // has the bins array been allocated? If not, do so
-            if (bins == null) {
-                final SAMSequenceRecord seq = bamHeader.getSequence(reference);
-                if (seq == null) {
-                    bins = new Bin[GenomicIndexUtil.MAX_BINS + 1];
-                } else {
-                    bins = new Bin[AbstractBAMFileIndex.getMaxBinNumberForSequenceLength(seq.getSequenceLength()) + 1];
-                }
-            }
-
-            // is there a bin already represented for this index?  if not, add one
-            final Bin bin;
-            if (bins[binNum] != null) {
-                bin = bins[binNum];
-            } else {
-                bin = new Bin(reference, binNum);
-                bins[binNum] = bin;
-                binsSeen++;
-            }
-
-            // process chunks
-
-            final long chunkStart = (slice.containerOffset << 16) | slice.index;
-            final long chunkEnd = ((slice.containerOffset << 16) | slice.index) + 1;
-
-            final Chunk newChunk = new Chunk(chunkStart, chunkEnd);
-
-            final List<Chunk> oldChunks = bin.getChunkList();
-            if (!bin.containsChunks()) {
-                bin.addInitialChunk(newChunk);
-
-            } else {
-                final Chunk lastChunk = bin.getLastChunk();
-
-                // Coalesce chunks that are in the same or adjacent file blocks.
-                // Similar to AbstractBAMFileIndex.optimizeChunkList,
-                // but no need to copy the list, no minimumOffset, and maintain bin.lastChunk
-                if (BlockCompressedFilePointerUtil.areInSameOrAdjacentBlocks(lastChunk.getChunkEnd(), chunkStart)) {
-                    lastChunk.setChunkEnd(chunkEnd);  // coalesced
-                } else {
-                    oldChunks.add(newChunk);
-                    bin.setLastChunk(newChunk);
-                }
-            }
-
-            // process linear index
-
-            // the smallest file offset that appears in the 16k window for this bin
-            final int alignmentEnd = slice.alignmentStart + slice.alignmentSpan;
-            int startWindow = LinearIndex.convertToLinearIndexOffset(alignmentStart); // the 16k window
-            final int endWindow;
-
-            if (alignmentEnd == SAMRecord.NO_ALIGNMENT_START) {   // assume alignment uses one position
-                // Next line for C (samtools index) compatibility. Differs only when on a window boundary
-                startWindow = LinearIndex.convertToLinearIndexOffset(alignmentStart - 1);
-                endWindow = startWindow;
-            } else {
-                endWindow = LinearIndex.convertToLinearIndexOffset(alignmentEnd);
-            }
-
-            if (endWindow > largestIndexSeen) {
-                largestIndexSeen = endWindow;
-            }
-
-            // set linear index at every 16K window that this alignment overlaps
-            for (int win = startWindow; win <= endWindow; win++) {
-                if (index[win] == 0 || chunkStart < index[win]) {
-                    index[win] = chunkStart;
-                }
-            }
-        }
-
-        /**
-         * Creates the BAMIndexContent for this reference.
-         * Requires all alignments of the reference have already been processed.
-         */
-        public BAMIndexContent processReference(final int reference) {
-
-            if (reference != currentReference) {
-                throw new SAMException("Unexpected reference " + reference + " when constructing index for " + currentReference);
-            }
-
-            // process bins
-            if (binsSeen == 0) {
-                return null;  // no bins for this reference
-            }
-
-            // process chunks
-            // nothing needed
-
-            // process linear index
-            // linear index will only be as long as the largest index seen
-            final long[] newIndex = new long[largestIndexSeen + 1]; // in java1.6 Arrays.copyOf(index, largestIndexSeen + 1);
-
-            // C (samtools index) also fills in intermediate 0's with values.  This seems unnecessary, but safe
-            long lastNonZeroOffset = 0;
-            for (int i = 0; i <= largestIndexSeen; i++) {
-                if (index[i] == 0) {
-                    index[i] = lastNonZeroOffset; // not necessary, but C (samtools index) does this
-                    // note, if you remove the above line BAMIndexWriterTest.compareTextual and compareBinary will have to change
-                } else {
-                    lastNonZeroOffset = index[i];
-                }
-                newIndex[i] = index[i];
-            }
-
-            final LinearIndex linearIndex = new LinearIndex(reference, 0, newIndex);
-
-            return new BAMIndexContent(reference, bins, binsSeen, indexStats, linearIndex);
-        }
-
-        /**
-         * @return the count of records with no coordinate positions
-         */
-        public long getNoCoordinateRecordCount() {
-            return indexStats.getNoCoordinateRecordCount();
-        }
-
-        /**
-         * reinitialize all data structures when the reference changes
-         */
-        void startNewReference() {
-            bins = null;
-            if (binsSeen > 0) {
-                Arrays.fill(index, 0);
-            }
-            binsSeen = 0;
-            largestIndexSeen = -1;
-            indexStats.newReference();
-        }
-    }
-
-    /**
-     * Generates a BAI index file from an input CRAM stream
-     *
-     * @param stream CRAM stream to index
-     * @param output File for output index file
-     * @param log    optional {@link htsjdk.samtools.util.Log} to output progress
-     */
-    public static void createIndex(final SeekableStream stream, final File output, final Log log, final ValidationStringency validationStringency) throws IOException {
-
-        final CramHeader cramHeader = CramIO.readCramHeader(stream);
-        if (cramHeader.getSamFileHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
-            throw new SAMException("Expecting a coordinate sorted file.");
-        }
-        final CRAMBAIIndexer indexer = new CRAMBAIIndexer(output, cramHeader.getSamFileHeader());
-
-        int totalRecords = 0;
-        Container container = null;
-        ProgressLogger progressLogger = new ProgressLogger(log, 1, "indexed", "slices");
-        do {
-            try {
-                final long offset = stream.position();
-                container = ContainerIO.readContainer(cramHeader.getVersion(), stream);
-                if (container == null || container.isEOF()) {
-                    break;
-                }
-
-                container.offset = offset;
-
-                indexer.processContainer(container, validationStringency);
-
-                if (null != log) {
-                    String sequenceName;
-                    switch (container.sequenceId) {
-                        case SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX:
-                            sequenceName = "?";
-                            break;
-                        case Slice.MULTI_REFERENCE:
-                            sequenceName = "???";
-                            break;
-                        default:
-                            sequenceName = cramHeader.getSamFileHeader().getSequence(container.sequenceId).getSequenceName();
-                            break;
-                    }
-                    progressLogger.record(sequenceName, container.alignmentStart);
-                }
-
-            } catch (final IOException e) {
-                throw new RuntimeException("Failed to read cram container", e);
-            }
-
-        } while (!container.isEOF());
-
-        indexer.finish();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/CRAMCRAIIndexer.java b/src/main/java/htsjdk/samtools/CRAMCRAIIndexer.java
deleted file mode 100644
index 4599d9b..0000000
--- a/src/main/java/htsjdk/samtools/CRAMCRAIIndexer.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIEntry;
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.structure.*;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.BufferedOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-import java.util.Scanner;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.GZIPOutputStream;
-
-/**
- * Indexer for creating/reading/writing a CRAIIndex for a CRAM file/stream. There
- * are three ways to obtain an index:
- * </p><ul>
- * <li>create an index for an entire CRAM stream and write it to an output stream</li>
- * <li>create an index on-the-fly by processing one container at a time</li>
- * <li>read an existing index from an input stream</li>
- * </ul><p>
- */
-public class CRAMCRAIIndexer {
-
-    final private CRAIIndex craiIndex = new CRAIIndex();
-    final private GZIPOutputStream os;
-
-    /**
-     * Create a CRAMCRAIIndexer that writes to the given output stream.
-     * @param os output stream to which the index will be written
-     * @param samHeader SAMFileHeader - user to verify sort order
-     */
-    public CRAMCRAIIndexer(OutputStream os, SAMFileHeader samHeader) {
-        if (samHeader.getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
-            throw new SAMException("CRAM file be coordinate-sorted for indexing.");
-        }
-        try {
-            this.os = new GZIPOutputStream(new BufferedOutputStream(os));
-        }
-        catch (IOException e) {
-            throw new RuntimeIOException("Error opening CRAI index output stream");
-        }
-    }
-
-    /**
-     * Create index entries for a single container.
-     * @param container the container to index
-     */
-    public void processContainer(final Container container) {
-        craiIndex.processContainer(container);
-    }
-
-    // TODO this is only used by test code
-    public void addEntry(CRAIEntry entry) {
-        craiIndex.addEntry(entry);
-    }
-
-    /**
-     * Finish creating the index by writing the accumulated entries out to the stream.
-     */
-    public void finish() {
-        try {
-            craiIndex.writeIndex(os);
-            os.flush();
-            os.close();
-        }
-        catch (IOException e) {
-            throw new RuntimeIOException("Error writing CRAI index to output stream");
-        }
-    }
-
-    /**
-     * Generate and write a CRAI index to an output stream from a CRAM input stream
-     *
-     * @param cramStream CRAM stream to index; must be coordinate sorted
-     * @param craiStream stream for output index
-     */
-    public static void writeIndex(final SeekableStream cramStream, OutputStream craiStream) {
-        try {
-            final CramHeader cramHeader = CramIO.readCramHeader(cramStream);
-            final CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(craiStream, cramHeader.getSamFileHeader());
-            final Version cramVersion = cramHeader.getVersion();
-
-            // get the first container and it's offset
-            long offset = cramStream.position();
-            Container container = ContainerIO.readContainer(cramVersion, cramStream);
-
-            while (container != null && !container.isEOF()) {
-                container.offset = offset;
-                indexer.processContainer(container);
-                offset = cramStream.position();
-                container = ContainerIO.readContainer(cramVersion, cramStream);
-            }
-
-            indexer.finish();
-        }
-        catch (IOException e) {
-            throw new RuntimeIOException("Error writing CRAI index to output stream");
-        }
-    }
-
-    /**
-     * Read an input stream containing a .crai index and return a CRAIIndex object.
-     * @param is Input stream to read
-     * @return A CRAIIndex object representing the index.
-     */
-    public static CRAIIndex readIndex(final InputStream is) {
-        CRAIIndex craiIndex = new CRAIIndex();
-        Scanner scanner = null;
-
-        try {
-            scanner = new Scanner(new GZIPInputStream(is));
-            while (scanner.hasNextLine()) {
-                final String line = scanner.nextLine();
-                craiIndex.addEntry(new CRAIEntry(line));
-            }
-        }
-        catch (IOException e) {
-            throw new RuntimeIOException("Error reading CRAI index from output stream");
-        }
-        finally {
-            if (null != scanner) {
-                scanner.close();
-            }
-        }
-
-        return craiIndex;
-    }
-
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/CRAMContainerStreamWriter.java b/src/main/java/htsjdk/samtools/CRAMContainerStreamWriter.java
deleted file mode 100644
index 4707b7b..0000000
--- a/src/main/java/htsjdk/samtools/CRAMContainerStreamWriter.java
+++ /dev/null
@@ -1,495 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.ContainerFactory;
-import htsjdk.samtools.cram.build.Cram2SamRecordFactory;
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.build.CramNormalizer;
-import htsjdk.samtools.cram.build.Sam2CramRecordFactory;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.lossy.PreservationPolicy;
-import htsjdk.samtools.cram.lossy.QualityScorePreservation;
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.ref.ReferenceTracks;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-/**
- * Class for writing SAMRecords into a series of CRAM containers on an output stream.
- */
-public class CRAMContainerStreamWriter {
-    private static final Version cramVersion = CramVersions.DEFAULT_CRAM_VERSION;
-
-    static int DEFAULT_RECORDS_PER_SLICE = 10000;
-    static int MIN_SINGLE_REF_RECORDS = 1000;
-    protected final int recordsPerSlice = DEFAULT_RECORDS_PER_SLICE;
-    private static final int DEFAULT_SLICES_PER_CONTAINER = 1;
-    protected final int containerSize = recordsPerSlice * DEFAULT_SLICES_PER_CONTAINER;
-    private static final int REF_SEQ_INDEX_NOT_INITIALIZED = -3;
-
-    private final SAMFileHeader samFileHeader;
-    private final String cramID;
-    private final OutputStream outputStream;
-    private CRAMReferenceSource source;
-
-    private final List<SAMRecord> samRecords = new ArrayList<SAMRecord>();
-    private ContainerFactory containerFactory;
-    private int refSeqIndex = REF_SEQ_INDEX_NOT_INITIALIZED;
-
-    private static final Log log = Log.getInstance(CRAMContainerStreamWriter.class);
-
-    private boolean preserveReadNames = true;
-    private QualityScorePreservation preservation = null;
-    private boolean captureAllTags = true;
-    private Set<String> captureTags = new TreeSet<String>();
-    private Set<String> ignoreTags = new TreeSet<String>();
-
-    private CRAMBAIIndexer indexer;
-    private long offset;
-
-    /**
-     * Create a CRAMContainerStreamWriter for writing SAM records into a series of CRAM
-     * containers on output stream, with an optional index.
-     *
-     * @param outputStream where to write the CRAM stream.
-     * @param indexStream where to write the output index. Can be null if no index is required.
-     * @param source reference source
-     * @param samFileHeader {@link SAMFileHeader} to be used. Sort order is determined by the sortOrder property of this arg.
-     * @param cramId used for display in error message display
-     */
-    public CRAMContainerStreamWriter(
-            final OutputStream outputStream,
-            final OutputStream indexStream,
-            final CRAMReferenceSource source,
-            final SAMFileHeader samFileHeader,
-            final String cramId) {
-        this.outputStream = outputStream;
-        this.samFileHeader = samFileHeader;
-        this.cramID = cramId;
-        this.source = source;
-        containerFactory = new ContainerFactory(samFileHeader, recordsPerSlice);
-        if (indexStream != null) {
-            indexer = new CRAMBAIIndexer(indexStream, samFileHeader);
-        }
-    }
-
-    /**
-     * Write an alignment record.
-     * @param alignment must not be null
-     */
-    public void writeAlignment(final SAMRecord alignment) {
-        if (shouldFlushContainer(alignment)) {
-            try {
-                flushContainer();
-            } catch (IOException e) {
-                throw new RuntimeIOException(e);
-            } catch (IllegalAccessException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        updateReferenceContext(alignment.getReferenceIndex());
-
-        samRecords.add(alignment);
-    }
-
-    /**
-     * Write a CRAM file header and SAM header to the stream.
-
-     * @param header SAMFileHeader to write
-     */
-    public void writeHeader(final SAMFileHeader header) {
-        // TODO: header must be written exactly once per writer life cycle.
-        offset = CramIO.writeHeader(cramVersion, outputStream, header, cramID);
-    }
-
-    /**
-     * Finish writing to the stream. Flushes the record cache and optionally emits an EOF container.
-     * @param writeEOFContainer true if an EOF container should be written. Only use false if writing a CRAM file
-     *                          fragment which will later be aggregated into a complete CRAM file.
-     */
-    public void finish(final boolean writeEOFContainer) {
-        try {
-            if (!samRecords.isEmpty()) {
-                flushContainer();
-            }
-            if (writeEOFContainer) {
-                CramIO.issueEOF(cramVersion, outputStream);
-            }
-            outputStream.flush();
-            if (indexer != null) {
-                indexer.finish();
-            }
-            outputStream.close();
-        } catch (final IOException e) {
-            throw new RuntimeIOException(e);
-        } catch (final IllegalAccessException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public boolean isPreserveReadNames() {
-        return preserveReadNames;
-    }
-
-    public void setPreserveReadNames(final boolean preserveReadNames) {
-        this.preserveReadNames = preserveReadNames;
-    }
-
-    public List<PreservationPolicy> getPreservationPolicies() {
-        if (preservation == null) {
-            // set up greedy policy by default:
-            preservation = new QualityScorePreservation("*8");
-        }
-        return preservation.getPreservationPolicies();
-    }
-
-    public boolean isCaptureAllTags() {
-        return captureAllTags;
-    }
-
-    public void setCaptureAllTags(final boolean captureAllTags) {
-        this.captureAllTags = captureAllTags;
-    }
-
-    public Set<String> getCaptureTags() {
-        return captureTags;
-    }
-
-    public void setCaptureTags(final Set<String> captureTags) {
-        this.captureTags = captureTags;
-    }
-
-    public Set<String> getIgnoreTags() {
-        return ignoreTags;
-    }
-
-    public void setIgnoreTags(final Set<String> ignoreTags) {
-        this.ignoreTags = ignoreTags;
-    }
-
-    /**
-     * Decide if the current container should be completed and flushed. The decision is based on a) number of records and b) if the
-     * reference sequence id has changed.
-     *
-     * @param nextRecord the record to be added into the current or next container
-     * @return true if the current container should be flushed and the following records should go into a new container; false otherwise.
-     */
-    protected boolean shouldFlushContainer(final SAMRecord nextRecord) {
-        if (samRecords.isEmpty()) {
-            refSeqIndex = nextRecord.getReferenceIndex();
-            return false;
-        }
-
-        if (samRecords.size() >= containerSize) {
-            return true;
-        }
-
-        if (samFileHeader.getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
-            return false;
-        }
-
-        // make unmapped reads don't get into multiref containers:
-        if (refSeqIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && nextRecord.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-            return true;
-        }
-
-        if (refSeqIndex == Slice.MULTI_REFERENCE) {
-            return false;
-        }
-
-        final boolean sameRef = (refSeqIndex == nextRecord.getReferenceIndex());
-        if (sameRef) {
-            return false;
-        }
-
-        /**
-         * Protection against too small containers: flush at least X single refs, switch to multiref otherwise.
-         */
-        if (samRecords.size() > MIN_SINGLE_REF_RECORDS) {
-            return true;
-        } else {
-            refSeqIndex = Slice.MULTI_REFERENCE;
-            return false;
-        }
-    }
-
-    private static void updateTracks(final List<SAMRecord> samRecords, final ReferenceTracks tracks) {
-        for (final SAMRecord samRecord : samRecords) {
-            if (samRecord.getAlignmentStart() != SAMRecord.NO_ALIGNMENT_START) {
-                int refPos = samRecord.getAlignmentStart();
-                int readPos = 0;
-                for (final CigarElement cigarElement : samRecord.getCigar().getCigarElements()) {
-                    if (cigarElement.getOperator().consumesReferenceBases()) {
-                        for (int elementIndex = 0; elementIndex < cigarElement.getLength(); elementIndex++)
-                            tracks.addCoverage(refPos + elementIndex, 1);
-                    }
-                    switch (cigarElement.getOperator()) {
-                        case M:
-                        case X:
-                        case EQ:
-                            for (int pos = readPos; pos < cigarElement.getLength(); pos++) {
-                                final byte readBase = samRecord.getReadBases()[readPos + pos];
-                                final byte refBase = tracks.baseAt(refPos + pos);
-                                if (readBase != refBase) tracks.addMismatches(refPos + pos, 1);
-                            }
-                            break;
-
-                        default:
-                            break;
-                    }
-
-                    readPos += cigarElement.getOperator().consumesReadBases() ? cigarElement.getLength() : 0;
-                    refPos += cigarElement.getOperator().consumesReferenceBases() ? cigarElement.getLength() : 0;
-                }
-            }
-        }
-    }
-
-    /**
-     * Complete the current container and flush it to the output stream.
-     *
-     * @throws IllegalArgumentException
-     * @throws IllegalAccessException
-     * @throws IOException
-     */
-    protected void flushContainer() throws IllegalArgumentException, IllegalAccessException, IOException {
-
-        final byte[] refs;
-        String refSeqName = null;
-        switch (refSeqIndex) {
-            case Slice.MULTI_REFERENCE:
-                if (preservation != null && preservation.areReferenceTracksRequired()) {
-                    throw new SAMException("Cannot apply reference-based lossy compression on non-coordinate sorted reads.");
-                }
-            refs = new byte[0];
-                break;
-            case SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX:
-                refs = new byte[0];
-                break;
-            default:
-            final SAMSequenceRecord sequence = samFileHeader.getSequence(refSeqIndex);
-            refs = source.getReferenceBases(sequence, true);
-            refSeqName = sequence.getSequenceName();
-                break;
-        }
-
-        int start = SAMRecord.NO_ALIGNMENT_START;
-        int stop = SAMRecord.NO_ALIGNMENT_START;
-        for (final SAMRecord r : samRecords) {
-            if (r.getAlignmentStart() == SAMRecord.NO_ALIGNMENT_START) continue;
-
-            if (start == SAMRecord.NO_ALIGNMENT_START) start = r.getAlignmentStart();
-
-            start = Math.min(r.getAlignmentStart(), start);
-            stop = Math.max(r.getAlignmentEnd(), stop);
-        }
-
-        ReferenceTracks tracks = null;
-        if (preservation != null && preservation.areReferenceTracksRequired()) {
-            tracks = new ReferenceTracks(refSeqIndex, refSeqName, refs);
-
-            tracks.ensureRange(start, stop - start + 1);
-            updateTracks(samRecords, tracks);
-        }
-
-        final List<CramCompressionRecord> cramRecords = new ArrayList<CramCompressionRecord>(samRecords.size());
-
-        final Sam2CramRecordFactory sam2CramRecordFactory = new Sam2CramRecordFactory(refs, samFileHeader, cramVersion);
-        sam2CramRecordFactory.preserveReadNames = preserveReadNames;
-        sam2CramRecordFactory.captureAllTags = captureAllTags;
-        sam2CramRecordFactory.captureTags.addAll(captureTags);
-        sam2CramRecordFactory.ignoreTags.addAll(ignoreTags);
-        containerFactory.setPreserveReadNames(preserveReadNames);
-
-        int index = 0;
-        int prevAlStart = start;
-        for (final SAMRecord samRecord : samRecords) {
-            if (samRecord.getReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && refSeqIndex != samRecord.getReferenceIndex()) {
-                // this may load all ref sequences into memory:
-                sam2CramRecordFactory.setRefBases(source.getReferenceBases(samFileHeader.getSequence(samRecord.getReferenceIndex()), true));
-            }
-            final CramCompressionRecord cramRecord = sam2CramRecordFactory.createCramRecord(samRecord);
-            cramRecord.index = ++index;
-            cramRecord.alignmentDelta = samRecord.getAlignmentStart() - prevAlStart;
-            cramRecord.alignmentStart = samRecord.getAlignmentStart();
-            prevAlStart = samRecord.getAlignmentStart();
-
-            cramRecords.add(cramRecord);
-
-            if (preservation != null) preservation.addQualityScores(samRecord, cramRecord, tracks);
-            else if (cramRecord.qualityScores != SAMRecord.NULL_QUALS) cramRecord.setForcePreserveQualityScores(true);
-            }
-
-
-        if (sam2CramRecordFactory.getBaseCount() < 3 * sam2CramRecordFactory.getFeatureCount())
-            log.warn("Abnormally high number of mismatches, possibly wrong reference.");
-
-        {
-            if (samFileHeader.getSortOrder() == SAMFileHeader.SortOrder.coordinate) {
-                // mating:
-                final Map<String, CramCompressionRecord> primaryMateMap = new TreeMap<String, CramCompressionRecord>();
-                final Map<String, CramCompressionRecord> secondaryMateMap = new TreeMap<String, CramCompressionRecord>();
-                for (final CramCompressionRecord r : cramRecords) {
-                    if (!r.isMultiFragment()) {
-                        r.setDetached(true);
-
-                        r.setHasMateDownStream(false);
-                        r.recordsToNextFragment = -1;
-                        r.next = null;
-                        r.previous = null;
-                    } else {
-                        final String name = r.readName;
-                        final Map<String, CramCompressionRecord> mateMap = r.isSecondaryAlignment() ? secondaryMateMap : primaryMateMap;
-                        final CramCompressionRecord mate = mateMap.get(name);
-                        if (mate == null) {
-                            mateMap.put(name, r);
-                        } else {
-                            CramCompressionRecord prev = mate;
-                            while (prev.next != null) prev = prev.next;
-                            prev.recordsToNextFragment = r.index - prev.index - 1;
-                            prev.next = r;
-                            r.previous = prev;
-                            r.previous.setHasMateDownStream(true);
-                            r.setHasMateDownStream(false);
-                            r.setDetached(false);
-                            r.previous.setDetached(false);
-                        }
-                    }
-                }
-
-                // mark unpredictable reads as detached:
-                for (final CramCompressionRecord cramRecord : cramRecords) {
-                    if (cramRecord.next == null || cramRecord.previous != null) continue;
-                    CramCompressionRecord last = cramRecord;
-                    while (last.next != null) last = last.next;
-
-                    if (cramRecord.isFirstSegment() && last.isLastSegment()) {
-
-                        final int templateLength = CramNormalizer.computeInsertSize(cramRecord, last);
-
-                        if (cramRecord.templateSize == templateLength) {
-                            last = cramRecord.next;
-                            while (last.next != null) {
-                                if (last.templateSize != -templateLength)
-                                    break;
-
-                                last = last.next;
-                            }
-                            if (last.templateSize != -templateLength) detach(cramRecord);
-                        }else detach(cramRecord);
-                    } else detach(cramRecord);
-                }
-
-                for (final CramCompressionRecord cramRecord : primaryMateMap.values()) {
-                    if (cramRecord.next != null) continue;
-                    cramRecord.setDetached(true);
-
-                    cramRecord.setHasMateDownStream(false);
-                    cramRecord.recordsToNextFragment = -1;
-                    cramRecord.next = null;
-                    cramRecord.previous = null;
-                }
-
-                for (final CramCompressionRecord cramRecord : secondaryMateMap.values()) {
-                    if (cramRecord.next != null) continue;
-                    cramRecord.setDetached(true);
-
-                    cramRecord.setHasMateDownStream(false);
-                    cramRecord.recordsToNextFragment = -1;
-                    cramRecord.next = null;
-                    cramRecord.previous = null;
-                }
-            }
-            else {
-                for (final CramCompressionRecord cramRecord : cramRecords) {
-                    cramRecord.setDetached(true);
-                }
-            }
-        }
-
-
-        {
-            /**
-             * The following passage is for paranoid mode only. When java is run with asserts on it will throw an {@link AssertionError} if
-             * read bases or quality scores of a restored SAM record mismatch the original. This is effectively a runtime round trip test.
-             */
-            @SuppressWarnings("UnusedAssignment") boolean assertsEnabled = false;
-            //noinspection AssertWithSideEffects,ConstantConditions
-            assert assertsEnabled = true;
-            //noinspection ConstantConditions
-            if (assertsEnabled) {
-                final Cram2SamRecordFactory f = new Cram2SamRecordFactory(samFileHeader);
-                for (int i = 0; i < samRecords.size(); i++) {
-                    final SAMRecord restoredSamRecord = f.create(cramRecords.get(i));
-                    assert (restoredSamRecord.getAlignmentStart() == samRecords.get(i).getAlignmentStart());
-                    assert (restoredSamRecord.getReferenceName().equals(samRecords.get(i).getReferenceName()));
-                    assert (restoredSamRecord.getReadString().equals(samRecords.get(i).getReadString()));
-                    assert (restoredSamRecord.getBaseQualityString().equals(samRecords.get(i).getBaseQualityString()));
-                }
-            }
-        }
-
-        final Container container = containerFactory.buildContainer(cramRecords);
-        for (final Slice slice : container.slices) {
-            slice.setRefMD5(refs);
-        }
-        container.offset = offset;
-        offset += ContainerIO.writeContainer(cramVersion, container, outputStream);
-        if (indexer != null) {
-            /**
-             * Using silent validation here because the reads have been through validation already or
-             * they have been generated somehow through the htsjdk.
-             */
-            indexer.processContainer(container, ValidationStringency.SILENT);
-        }
-        samRecords.clear();
-        refSeqIndex = REF_SEQ_INDEX_NOT_INITIALIZED;
-    }
-
-    /**
-     * Traverse the graph and mark all segments as detached.
-     *
-     * @param cramRecord the starting point of the graph
-     */
-    private static void detach(CramCompressionRecord cramRecord) {
-        do {
-            cramRecord.setDetached(true);
-
-            cramRecord.setHasMateDownStream(false);
-            cramRecord.recordsToNextFragment = -1;
-        }
-        while ((cramRecord = cramRecord.next) != null);
-    }
-
-    /**
-     * Check if the reference has changed and create a new record factory using the new reference.
-     *
-     * @param samRecordReferenceIndex index of the new reference sequence
-     */
-    private void updateReferenceContext(final int samRecordReferenceIndex) {
-        if (refSeqIndex == Slice.MULTI_REFERENCE) {
-            return;
-        }
-
-        if (refSeqIndex == REF_SEQ_INDEX_NOT_INITIALIZED) {
-            refSeqIndex = samRecordReferenceIndex;
-        } else if (refSeqIndex != samRecordReferenceIndex) {
-            refSeqIndex = Slice.MULTI_REFERENCE;
-    }
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/CRAMFileReader.java b/src/main/java/htsjdk/samtools/CRAMFileReader.java
deleted file mode 100644
index 9a29d36..0000000
--- a/src/main/java/htsjdk/samtools/CRAMFileReader.java
+++ /dev/null
@@ -1,559 +0,0 @@
-/*******************************************************************************
- * Copyright 2013 EMBL-EBI
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package htsjdk.samtools;
-
-import htsjdk.samtools.SAMFileHeader.SortOrder;
-import htsjdk.samtools.SamReader.Type;
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.RuntimeEOFException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.NoSuchElementException;
-
-/**
- * {@link htsjdk.samtools.BAMFileReader BAMFileReader} analogue for CRAM files.
- * Supports random access using BAI index file formats.
- *
- * @author vadim
- */
- at SuppressWarnings("UnusedDeclaration")
-public class CRAMFileReader extends SamReader.ReaderImplementation implements SamReader.Indexing {
-    private File cramFile;
-    private final CRAMReferenceSource referenceSource;
-    private InputStream inputStream;
-    private CRAMIterator iterator;
-    private BAMIndex mIndex;
-    private File mIndexFile;
-    private boolean mEnableIndexCaching;
-    private boolean mEnableIndexMemoryMapping;
-
-    private ValidationStringency validationStringency;
-
-    private final static Log log = Log.getInstance(CRAMFileReader.class);
-
-    /**
-     * Create a CRAMFileReader from either a file or input stream using the reference source returned by
-     * {@link ReferenceSource#getDefaultCRAMReferenceSource() getDefaultCRAMReferenceSource}.
-     *
-     * @param cramFile CRAM file to open
-     * @param inputStream CRAM stream to read
-     *
-     * @throws IllegalArgumentException if the {@code cramFile} and the {@code inputStream} are both null
-     * @throws IllegalStateException if a {@link ReferenceSource#getDefaultCRAMReferenceSource() default}
-     * reference source cannot be acquired
-     */
-    public CRAMFileReader(final File cramFile, final InputStream inputStream) {
-        this(cramFile, inputStream, ReferenceSource.getDefaultCRAMReferenceSource());
-    }
-
-    /**
-     * Create a CRAMFileReader from either a file or input stream using the supplied reference source.
-     *
-     * @param cramFile        CRAM file to read
-     * @param inputStream     CRAM stream to read
-     * @param referenceSource a {@link htsjdk.samtools.cram.ref.ReferenceSource source} of
-     *                        reference sequences. May not be null.
-     *
-     * @throws IllegalArgumentException if the {@code cramFile} and the {@code inputStream} are both null
-     * or if the {@code CRAMReferenceSource} is null
-     */
-    public CRAMFileReader(final File cramFile, final InputStream inputStream,
-                          final CRAMReferenceSource referenceSource) {
-        if (cramFile == null && inputStream == null) {
-            throw new IllegalArgumentException("Either file or input stream is required.");
-        }
-        if (referenceSource == null) {
-            throw new IllegalArgumentException("A reference is required for CRAM readers");
-        }
-
-        this.cramFile = cramFile;
-        this.inputStream = inputStream;
-        this.referenceSource = referenceSource;
-        if (cramFile != null) {
-            mIndexFile = findIndexForFile(null, cramFile);
-        }
-        getIterator();
-    }
-
-    /**
-     * Create a CRAMFileReader from a file and optional index file using the supplied reference source. If index file
-     * is supplied then random access will be available.
-     *
-     * @param cramFile        CRAM file to read. May not be null.
-     * @param indexFile       index file to be used for random access. May be null.
-     * @param referenceSource a {@link htsjdk.samtools.cram.ref.CRAMReferenceSource source} of
-     *                        reference sequences. May not be null.
-     * @throws IllegalArgumentException if the {@code cramFile} or the {@code CRAMReferenceSource} is null
-     */
-    public CRAMFileReader(final File cramFile, final File indexFile,
-                          final CRAMReferenceSource referenceSource) {
-        if (cramFile == null)
-            throw new IllegalArgumentException("File is required.");
-        if (referenceSource == null) {
-            throw new IllegalArgumentException("A reference is required for CRAM readers");
-        }
-
-        this.cramFile = cramFile;
-        mIndexFile = findIndexForFile(indexFile, cramFile);
-        this.referenceSource = referenceSource;
-
-        getIterator();
-    }
-
-    /**
-     * Create a CRAMFileReader from a file using the supplied reference source.
-     *
-     * @param cramFile        CRAM file to read. Can not be null.
-     * @param referenceSource a {@link htsjdk.samtools.cram.ref.CRAMReferenceSource source} of
-     *                        reference sequences. May not be null.
-     * @throws IllegalArgumentException if the {@code cramFile} or the {@code CRAMReferenceSource} is null
-     */
-    public CRAMFileReader(final File cramFile, final CRAMReferenceSource referenceSource) {
-        if (cramFile == null)
-            throw new IllegalArgumentException("CRAM file cannot be null.");
-        if (referenceSource == null) {
-            throw new IllegalArgumentException("A reference is required for CRAM readers");
-        }
-
-        this.cramFile = cramFile;
-        this.referenceSource = referenceSource;
-        mIndexFile = findIndexForFile(null, cramFile);
-
-        getIterator();
-    }
-
-    /**
-     * Create a CRAMFileReader from an input stream and optional index stream using the supplied reference
-     * source and validation stringency.
-     *
-     * @param inputStream      CRAM stream to read. May not be null.
-     * @param indexInputStream index stream to be used for random access. May be null.
-     * @param referenceSource a {@link htsjdk.samtools.cram.ref.CRAMReferenceSource source} of
-     *                        reference sequences. May not be null.
-     * @param validationStringency Validation stringency to be used when reading
-     *
-     * @throws IllegalArgumentException if the {@code inputStream} or the {@code CRAMReferenceSource} is null
-     */
-    public CRAMFileReader(final InputStream inputStream, final SeekableStream indexInputStream,
-                          final CRAMReferenceSource referenceSource, final ValidationStringency validationStringency) throws IOException {
-        if (inputStream == null) {
-            throw new IllegalArgumentException("Input stream can not be null for CRAM reader");
-        }
-        if (referenceSource == null) {
-            throw new IllegalArgumentException("A reference is required for CRAM readers");
-        }
-        this.referenceSource = referenceSource;
-        initWithStreams(inputStream, indexInputStream, validationStringency);
-    }
-
-    /**
-     * Create a CRAMFileReader from an input stream and optional index file using the supplied reference
-     * source and validation stringency.
-     *
-     * @param stream            CRAM stream to read. May not be null.
-     * @param indexFile         index file to be used for random access. May be null.
-     * @param referenceSource a {@link htsjdk.samtools.cram.ref.CRAMReferenceSource source} of
-     *                        reference sequences. May not be null.
-     * @param validationStringency Validation stringency to be used when reading
-     *
-     * @throws IllegalArgumentException if the {@code inputStream} or the {@code CRAMReferenceSource} is null
-     */
-    public CRAMFileReader(final InputStream stream,
-                          final File indexFile, final CRAMReferenceSource referenceSource,
-                          final ValidationStringency validationStringency) throws IOException {
-        this(stream, indexFile == null ? null : new SeekableFileStream(indexFile), referenceSource, validationStringency);
-    }
-
-    /**
-     * Create a CRAMFileReader from a CRAM file and optional index file using the supplied reference
-     * source and validation stringency.
-     *
-     * @param cramFile        CRAM stream to read. May not be null.
-     * @param indexFile       index file to be used for random access. May be null.
-     * @param referenceSource a {@link htsjdk.samtools.cram.ref.CRAMReferenceSource source} of
-     *                        reference sequences. May not be null.
-     * @param validationStringency Validation stringency to be used when reading
-     *
-     * @throws IllegalArgumentException if the {@code cramFile} or the {@code CRAMReferenceSource} is null
-     */
-    public CRAMFileReader(final File cramFile, final File indexFile, final CRAMReferenceSource referenceSource,
-                          final ValidationStringency validationStringency) throws IOException {
-        if (cramFile == null) {
-            throw new IllegalArgumentException("Input file can not be null for CRAM reader");
-        }
-        if (referenceSource == null) {
-            throw new IllegalArgumentException("A reference is required for CRAM readers");
-        }
-        this.cramFile = cramFile;
-        this.referenceSource = referenceSource;
-        this.mIndexFile = findIndexForFile(indexFile, cramFile);
-        final SeekableFileStream indexStream = this.mIndexFile == null ? null : new SeekableFileStream(this.mIndexFile);
-        initWithStreams(new FileInputStream(cramFile), indexStream, validationStringency);
-    }
-
-    private void initWithStreams(final InputStream inputStream, final SeekableStream indexInputStream,
-                                 final ValidationStringency validationStringency) throws IOException {
-        this.inputStream = inputStream;
-        this.validationStringency = validationStringency;
-        iterator = new CRAMIterator(inputStream, referenceSource, validationStringency);
-        if (indexInputStream != null) {
-            SeekableStream baiStream = SamIndexes.asBaiSeekableStreamOrNull(indexInputStream, iterator.getSAMFileHeader().getSequenceDictionary());
-            if (null != baiStream)  {
-                mIndex = new CachingBAMFileIndex(baiStream, iterator.getSAMFileHeader().getSequenceDictionary());
-            }
-            else {
-                throw new IllegalArgumentException("CRAM index must be a BAI or CRAI stream");
-            }
-        }
-    }
-
-    private File findIndexForFile(File indexFile, final File cramFile) {
-        indexFile = indexFile == null ? SamFiles.findIndex(cramFile) : indexFile;
-        if (indexFile != null && indexFile.lastModified() < cramFile.lastModified()) {
-            log.warn("CRAM index file " + indexFile.getAbsolutePath() +
-                    " is older than CRAM " + cramFile.getAbsolutePath());
-        }
-        return indexFile;
-    }
-
-    @Override
-    void enableIndexCaching(final boolean enabled) {
-        // relevant to BAI only
-        mEnableIndexCaching = enabled;
-    }
-
-    @Override
-    void enableIndexMemoryMapping(final boolean enabled) {
-        // relevant to BAI only
-        mEnableIndexMemoryMapping = enabled;
-    }
-
-    @Override
-    void enableCrcChecking(final boolean enabled) {
-        // inapplicable to CRAM: do nothing
-    }
-
-    @Override
-    void setSAMRecordFactory(final SAMRecordFactory factory) {
-    }
-
-    @Override
-    public boolean hasIndex() {
-        return mIndex != null || mIndexFile != null;
-    }
-
-    @Override
-    public BAMIndex getIndex() {
-        if (!hasIndex())
-            throw new SAMException("No index is available for this CRAM file.");
-        if (mIndex == null) {
-            final SAMSequenceDictionary dictionary = getFileHeader()
-                    .getSequenceDictionary();
-            if (mIndexFile.getName().endsWith(BAMIndex.BAMIndexSuffix)) {
-                mIndex = mEnableIndexCaching ? new CachingBAMFileIndex(mIndexFile,
-                        dictionary, mEnableIndexMemoryMapping)
-                        : new DiskBasedBAMFileIndex(mIndexFile, dictionary,
-                        mEnableIndexMemoryMapping);
-                return mIndex;
-            }
-
-            if (!mIndexFile.getName().endsWith(CRAIIndex.CRAI_INDEX_SUFFIX)) return null;
-            // convert CRAI into BAI:
-            final SeekableStream baiStream;
-            try {
-                baiStream = SamIndexes.asBaiSeekableStreamOrNull(new SeekableFileStream(mIndexFile), iterator.getSAMFileHeader().getSequenceDictionary());
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-
-            mIndex = mEnableIndexCaching ? new CachingBAMFileIndex(baiStream, getFileHeader().getSequenceDictionary()) :
-                    new DiskBasedBAMFileIndex(baiStream, getFileHeader().getSequenceDictionary());
-        }
-        return mIndex;
-    }
-
-    @Override
-    public boolean hasBrowseableIndex() {
-        return false;
-    }
-
-    @Override
-    public BrowseableBAMIndex getBrowseableIndex() {
-        return null;
-    }
-
-    @Override
-    public SAMRecordIterator iterator(final SAMFileSpan fileSpan) {
-        // get the file coordinates for the span:
-        final long[] coordinateArray = ((BAMFileSpan) fileSpan).toCoordinateArray();
-        if (coordinateArray == null || coordinateArray.length == 0) return emptyIterator;
-        try {
-            // create an input stream that reads the source cram stream only within the coordinate pairs:
-            final SeekableStream seekableStream = getSeekableStreamOrFailWithRTE();
-            return new CRAMIterator(seekableStream, referenceSource, coordinateArray, validationStringency);
-        } catch (final IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public SAMFileHeader getFileHeader() {
-        return iterator.getSAMFileHeader();
-    }
-
-    @Override
-    public SAMRecordIterator getIterator() {
-        if (iterator != null && cramFile == null)
-            return iterator;
-        try {
-            final CRAMIterator newIterator;
-            if (cramFile != null) {
-                newIterator = new CRAMIterator(new FileInputStream(cramFile),
-                        referenceSource, validationStringency);
-            } else
-                newIterator = new CRAMIterator(inputStream, referenceSource, validationStringency);
-
-            iterator = newIterator;
-            return iterator;
-        } catch (final Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public CloseableIterator<SAMRecord> getIterator(final SAMFileSpan fileSpan) {
-        return iterator(fileSpan);
-    }
-
-    @Override
-    public SAMFileSpan getFilePointerSpanningReads() {
-        return new BAMFileSpan(new Chunk(iterator.firstContainerOffset << 16, Long.MAX_VALUE));
-    }
-
-    private static final SAMRecordIterator emptyIterator = new SAMRecordIterator() {
-
-        @Override
-        public boolean hasNext() {
-            return false;
-        }
-
-        @Override
-        public SAMRecord next() {
-            throw new RuntimeException("No records.");
-        }
-
-        @Override
-        public void remove() {
-            throw new RuntimeException("Remove not supported.");
-        }
-
-        @Override
-        public void close() {
-        }
-
-        @Override
-        public SAMRecordIterator assertSorted(final SortOrder sortOrder) {
-            return this;
-        }
-    };
-
-    @Override
-    public CloseableIterator<SAMRecord> queryAlignmentStart(final String sequence,
-                                                            final int start) {
-        final SAMFileHeader fileHeader = getFileHeader();
-        final int referenceIndex = fileHeader.getSequenceIndex(sequence);
-        return new CRAMIntervalIterator(new QueryInterval[]{new QueryInterval(referenceIndex, start, -1)}, true);
-    }
-
-    @Override
-    public CloseableIterator<SAMRecord> queryUnmapped() {
-        final long startOfLastLinearBin = getIndex().getStartOfLastLinearBin();
-
-        final SeekableStream seekableStream = getSeekableStreamOrFailWithRTE();
-        final CRAMIterator newIterator;
-        try {
-            seekableStream.seek(0);
-            newIterator = new CRAMIterator(seekableStream, referenceSource, validationStringency);
-            seekableStream.seek(startOfLastLinearBin >>> 16);
-            final Container container = ContainerIO.readContainerHeader(newIterator.getCramHeader().getVersion().major, seekableStream);
-            seekableStream.seek(seekableStream.position() + container.containerByteSize);
-            iterator = newIterator;
-            boolean atAlignments;
-            do {
-                atAlignments = iterator.advanceToAlignmentInContainer(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, SAMRecord.NO_ALIGNMENT_START);
-            } while (!atAlignments && iterator.hasNext());
-        } catch (final IOException e) {
-            throw new RuntimeEOFException(e);
-        }
-
-        return iterator;
-    }
-
-    private SeekableStream getSeekableStreamOrFailWithRTE() {
-        SeekableStream seekableStream = null;
-        if (cramFile != null) {
-            try {
-                seekableStream = new SeekableFileStream(cramFile);
-            } catch (final FileNotFoundException e) {
-                throw new RuntimeException(e);
-            }
-        } else if (inputStream instanceof SeekableStream) {
-            seekableStream = (SeekableStream) inputStream;
-        }
-        return seekableStream;
-    }
-
-    @Override
-    public void close() {
-        CloserUtil.close(iterator);
-        CloserUtil.close(inputStream);
-        CloserUtil.close(mIndex);
-    }
-
-    @Override
-    void setValidationStringency(final ValidationStringency validationStringency) {
-        this.validationStringency = validationStringency;
-        if (iterator != null) iterator.setValidationStringency(validationStringency);
-    }
-
-    @Override
-    public ValidationStringency getValidationStringency() {
-        return validationStringency;
-    }
-
-    @Override
-    public CloseableIterator<SAMRecord> query(final QueryInterval[] intervals,
-                                              final boolean contained) {
-        return new CRAMIntervalIterator(intervals, contained);
-    }
-
-    @Override
-    public Type type() {
-        return Type.CRAM_TYPE;
-    }
-
-    @Override
-    void enableFileSource(final SamReader reader, final boolean enabled) {
-        if (iterator != null)
-            iterator.setFileSource(enabled ? reader : null);
-    }
-
-    private class CRAMIntervalIterator
-            extends BAMQueryMultipleIntervalsIteratorFilter
-            implements SAMRecordIterator {
-
-        // the granularity of this iterator is the container, so the records returned
-        // by it must still be filtered to find those matching the filter criteria
-        private CRAMIterator unfilteredIterator;
-        SAMRecord nextRec = null;
-
-        public CRAMIntervalIterator(final QueryInterval[] queries, final boolean contained) {
-            super(queries, contained);
-
-            long[] coordinates = coordinatesFromQueryIntervals(getIndex(), queries);
-            if (coordinates != null && coordinates.length != 0) {
-                try {
-                    unfilteredIterator = new CRAMIterator(
-                            getSeekableStreamOrFailWithRTE(),
-                            referenceSource,
-                            coordinates,
-                            validationStringency
-                    );
-                } catch (final IOException e) {
-                    throw new RuntimeEOFException(e);
-                }
-                getNextRecord(); // advance to the first record that matches the filter criteria
-            }
-        }
-
-        // convert queries -> merged BAMFileSpan -> coordinate array
-        private long[] coordinatesFromQueryIntervals(BAMIndex index, QueryInterval[] queries) {
-            ArrayList<BAMFileSpan> spanList = new ArrayList<>(1);
-            Arrays.asList(queries).forEach(qi -> spanList.add(mIndex.getSpanOverlapping(qi.referenceIndex, qi.start, qi.end)));
-            BAMFileSpan spanArray[] = new BAMFileSpan[spanList.size()];
-            for (int i = 0; i < spanList.size(); i++) {
-                spanArray[i] = spanList.get(i);
-            }
-
-            return BAMFileSpan.merge(spanArray).toCoordinateArray();
-        }
-
-        @Override
-        public SAMRecordIterator assertSorted(final SortOrder sortOrder) {
-            return null;
-        }
-
-        @Override
-        public void close() {
-            if (unfilteredIterator != null) {
-                unfilteredIterator.close();
-            }
-        }
-
-        @Override
-        public boolean hasNext() {
-            return nextRec != null;
-        }
-
-        @Override
-        public SAMRecord next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException("Next called on empty CRAMIntervalIterator");
-            }
-            return getNextRecord();
-        }
-
-        private SAMRecord getNextRecord() {
-            final SAMRecord result = nextRec;
-            nextRec = null;
-            while(nextRec == null && unfilteredIterator.hasNext()) {
-                SAMRecord nextRecord = unfilteredIterator.next();
-                switch(compareToFilter(nextRecord)) {
-                    case MATCHES_FILTER:
-                        nextRec = nextRecord;
-                        break;
-                    case CONTINUE_ITERATION:
-                        continue;
-                    case STOP_ITERATION:
-                        break;
-                    default:
-                        throw new SAMException("Unexpected return from compareToFilter");
-                }
-            }
-            return result;
-        }
-
-        @Override
-        public void remove() {
-            throw new RuntimeException("Method \"remove\" not implemented for CRAMIntervalIterator.");
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/CRAMFileWriter.java b/src/main/java/htsjdk/samtools/CRAMFileWriter.java
deleted file mode 100644
index 5d3f2e2..0000000
--- a/src/main/java/htsjdk/samtools/CRAMFileWriter.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright 2013 EMBL-EBI
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.lossy.PreservationPolicy;
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.StringLineReader;
-
-import java.io.OutputStream;
-import java.util.List;
-import java.util.Set;
-
- at SuppressWarnings("UnusedDeclaration")
-public class CRAMFileWriter extends SAMFileWriterImpl {
-    private CRAMContainerStreamWriter cramContainerStream;
-    private final SAMFileHeader samFileHeader;
-    private final String fileName;
-
-    private static final Log log = Log.getInstance(CRAMFileWriter.class);
-
-    /**
-     * Create a CRAMFileWriter on an output stream. Requires input records to be presorted to match the
-     * sort order defined by the input {@code samFileHeader}.
-     *
-     * @param outputStream where to write the output. Can not be null.
-     * @param referenceSource reference source. Can not be null.
-     * @param samFileHeader {@link SAMFileHeader} to be used. Can not be null. Sort order is determined by the sortOrder property of this arg.
-     * @param fileName used for display in error messages
-     *
-     * @throws IllegalArgumentException if the {@code outputStream}, {@code referenceSource} or {@code samFileHeader} are null
-     */
-    public CRAMFileWriter(
-            final OutputStream outputStream,
-            final CRAMReferenceSource referenceSource,
-            final SAMFileHeader samFileHeader,
-            final String fileName)
-    {
-        this(outputStream, null, referenceSource, samFileHeader, fileName); // defaults to presorted == true
-    }
-
-    /**
-     * Create a CRAMFileWriter and optional index on output streams. Requires input records to be presorted to match the
-     * sort order defined by the input {@code samFileHeader}.
-     *
-     * @param outputStream where to write the output. Can not be null.
-     * @param indexOS where to write the output index. Can be null if no index is required.
-     * @param referenceSource reference source
-     * @param samFileHeader {@link SAMFileHeader} to be used. Can not be null. Sort order is determined by the sortOrder property of this arg.
-     * @param fileName used for display in error messages
-     *
-     * @throws IllegalArgumentException if the {@code outputStream}, {@code referenceSource} or {@code samFileHeader} are null
-     */
-    public CRAMFileWriter(
-            final OutputStream outputStream,
-            final OutputStream indexOS,
-            final CRAMReferenceSource referenceSource,
-            final SAMFileHeader samFileHeader,
-            final String fileName)
-    {
-        this(outputStream, indexOS, true, referenceSource, samFileHeader, fileName); // defaults to presorted==true
-    }
-
-    /**
-     * Create a CRAMFileWriter and optional index on output streams.
-     *
-     * @param outputStream where to write the output. Can not be null.
-     * @param indexOS where to write the output index. Can be null if no index is required.
-     * @param presorted if true records written to this writer must already be sorted in the order specified by the header
-     * @param referenceSource reference source
-     * @param samFileHeader {@link SAMFileHeader} to be used. Can not be null. Sort order is determined by the sortOrder property of this arg.
-     * @param fileName used for display in error message display
-     *
-     * @throws IllegalArgumentException if the {@code outputStream}, {@code referenceSource} or {@code samFileHeader} are null
-     */
-    public CRAMFileWriter(final OutputStream outputStream, final OutputStream indexOS, final boolean presorted,
-                          final CRAMReferenceSource referenceSource, final SAMFileHeader samFileHeader, final String fileName) {
-        if (outputStream == null) {
-            throw new IllegalArgumentException("CRAMWriter output stream can not be null.");
-        }
-        if (referenceSource == null) {
-            throw new IllegalArgumentException("A reference is required for CRAM writers");
-        }
-        if (samFileHeader == null) {
-            throw new IllegalArgumentException("A valid SAMFileHeader is required for CRAM writers");
-        }
-        this.samFileHeader = samFileHeader;
-        this.fileName = fileName;
-        setSortOrder(samFileHeader.getSortOrder(), presorted);
-        cramContainerStream = new CRAMContainerStreamWriter(outputStream, indexOS, referenceSource, samFileHeader, fileName);
-        setHeader(samFileHeader);
-    }
-
-    /**
-     * Write an alignment record.
-     * @param alignment must not be null and must have a valid SAMFileHeader.
-     */
-    @Override
-    protected void writeAlignment(final SAMRecord alignment) {
-        cramContainerStream.writeAlignment(alignment);
-    }
-
-    @Override
-    protected void writeHeader(final String textHeader) {
-        cramContainerStream.writeHeader(
-                new SAMTextHeaderCodec().decode(new StringLineReader(textHeader),fileName != null ? fileName : null));
-    }
-
-    @Override
-    protected void finish() {
-        cramContainerStream.finish(true); // flush the last container and issue EOF
-    }
-
-    @Override
-    protected String getFilename() {
-        return fileName;
-    }
-
-    public boolean isPreserveReadNames() {
-        return cramContainerStream.isPreserveReadNames();
-    }
-
-    public void setPreserveReadNames(final boolean preserveReadNames) {
-        cramContainerStream.setPreserveReadNames(preserveReadNames);
-    }
-
-    public List<PreservationPolicy> getPreservationPolicies() {
-        return cramContainerStream.getPreservationPolicies();
-    }
-
-    public boolean isCaptureAllTags() {
-        return cramContainerStream.isCaptureAllTags();
-    }
-
-    public void setCaptureAllTags(final boolean captureAllTags) {
-        cramContainerStream.setCaptureAllTags(captureAllTags);
-    }
-
-    public Set<String> getCaptureTags() {
-        return cramContainerStream.getCaptureTags();
-    }
-
-    public void setCaptureTags(final Set<String> captureTags) {
-        cramContainerStream.setCaptureTags(captureTags);
-    }
-
-    public Set<String> getIgnoreTags() {
-        return cramContainerStream.getIgnoreTags();
-    }
-
-    public void setIgnoreTags(final Set<String> ignoreTags) {
-        cramContainerStream.setIgnoreTags(ignoreTags);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/CRAMIterator.java b/src/main/java/htsjdk/samtools/CRAMIterator.java
deleted file mode 100644
index f8179e6..0000000
--- a/src/main/java/htsjdk/samtools/CRAMIterator.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*******************************************************************************
- * Copyright 2013 EMBL-EBI
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License countingInputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package htsjdk.samtools;
-
-import htsjdk.samtools.SAMFileHeader.SortOrder;
-import htsjdk.samtools.cram.build.ContainerParser;
-import htsjdk.samtools.cram.build.Cram2SamRecordFactory;
-import htsjdk.samtools.cram.build.CramContainerIterator;
-import htsjdk.samtools.cram.build.CramNormalizer;
-import htsjdk.samtools.cram.build.CramSpanContainerIterator;
-import htsjdk.samtools.cram.io.CountingInputStream;
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import htsjdk.samtools.cram.CRAMException;
-
-public class CRAMIterator implements SAMRecordIterator {
-    private static final Log log = Log.getInstance(CRAMIterator.class);
-    private final CountingInputStream countingInputStream;
-    private CramHeader cramHeader;
-    private ArrayList<SAMRecord> records;
-    private SAMRecord nextRecord = null;
-    private CramNormalizer normalizer;
-    private byte[] refs;
-    private int prevSeqId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-    public Container container;
-    private SamReader mReader;
-    long firstContainerOffset = 0;
-    private Iterator<Container> containerIterator;
-
-    private ContainerParser parser;
-    private final CRAMReferenceSource referenceSource;
-
-    private Iterator<SAMRecord> iterator = Collections.<SAMRecord>emptyList().iterator();
-
-    private ValidationStringency validationStringency = ValidationStringency.DEFAULT_STRINGENCY;
-
-    public ValidationStringency getValidationStringency() {
-        return validationStringency;
-    }
-
-    public void setValidationStringency(
-            final ValidationStringency validationStringency) {
-        this.validationStringency = validationStringency;
-    }
-
-    private long samRecordIndex;
-    private ArrayList<CramCompressionRecord> cramRecords;
-
-    public CRAMIterator(final InputStream inputStream, final CRAMReferenceSource referenceSource, final ValidationStringency validationStringency)
-            throws IOException {
-        if (null == referenceSource) {
-            throw new CRAMException("A reference source is required for CRAM files");
-        }
-        this.countingInputStream = new CountingInputStream(inputStream);
-        this.referenceSource = referenceSource;
-        this.validationStringency = validationStringency;
-        final CramContainerIterator containerIterator = new CramContainerIterator(this.countingInputStream);
-        cramHeader = containerIterator.getCramHeader();
-        this.containerIterator = containerIterator;
-
-        firstContainerOffset = this.countingInputStream.getCount();
-        records = new ArrayList<SAMRecord>(10000);
-        normalizer = new CramNormalizer(cramHeader.getSamFileHeader(),
-                referenceSource);
-        parser = new ContainerParser(cramHeader.getSamFileHeader());
-    }
-
-    public CRAMIterator(final SeekableStream seekableStream, final CRAMReferenceSource referenceSource, final long[] coordinates, final ValidationStringency validationStringency)
-            throws IOException {
-        if (null == referenceSource) {
-            throw new CRAMException("A reference source is required for CRAM files");
-        }
-        this.countingInputStream = new CountingInputStream(seekableStream);
-        this.referenceSource = referenceSource;
-        this.validationStringency = validationStringency;
-        final CramSpanContainerIterator containerIterator = CramSpanContainerIterator.fromFileSpan(seekableStream, coordinates);
-        cramHeader = containerIterator.getCramHeader();
-        this.containerIterator = containerIterator;
-
-        firstContainerOffset = containerIterator.getFirstContainerOffset();
-        records = new ArrayList<SAMRecord>(10000);
-        normalizer = new CramNormalizer(cramHeader.getSamFileHeader(),
-                referenceSource);
-        parser = new ContainerParser(cramHeader.getSamFileHeader());
-    }
-
-    @Deprecated
-    public CRAMIterator(final SeekableStream seekableStream, final CRAMReferenceSource referenceSource, final long[] coordinates)
-            throws IOException {
-        this(seekableStream, referenceSource, coordinates, ValidationStringency.DEFAULT_STRINGENCY);
-    }
-
-    public CramHeader getCramHeader() {
-        return cramHeader;
-    }
-
-    void nextContainer() throws IOException, IllegalArgumentException,
-            IllegalAccessException, CRAMException {
-
-        if (containerIterator != null) {
-            if (!containerIterator.hasNext()) {
-                records.clear();
-                nextRecord = null;
-                return;
-            }
-            container = containerIterator.next();
-            if (container.isEOF()) {
-                records.clear();
-                nextRecord = null;
-                return;
-            }
-        } else {
-            container = ContainerIO.readContainer(cramHeader.getVersion(), countingInputStream);
-            if (container.isEOF()) {
-                records.clear();
-                nextRecord = null;
-                return;
-            }
-        }
-
-        if (records == null)
-            records = new ArrayList<SAMRecord>(container.nofRecords);
-        else
-            records.clear();
-        if (cramRecords == null)
-            cramRecords = new ArrayList<CramCompressionRecord>(container.nofRecords);
-        else
-            cramRecords.clear();
-
-        parser.getRecords(container, cramRecords, validationStringency);
-
-        if (container.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-            refs = new byte[]{};
-            prevSeqId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-        } else if (container.sequenceId == Slice.MULTI_REFERENCE) {
-            refs = null;
-            prevSeqId = Slice.MULTI_REFERENCE;
-        } else if (prevSeqId < 0 || prevSeqId != container.sequenceId) {
-            final SAMSequenceRecord sequence = cramHeader.getSamFileHeader()
-                    .getSequence(container.sequenceId);
-            refs = referenceSource.getReferenceBases(sequence, true);
-            if (refs == null) {
-                throw new CRAMException(String.format("Contig %s not found in the reference file.", sequence.getSequenceName()));
-            }
-            prevSeqId = container.sequenceId;
-        }
-
-        for (int i = 0; i < container.slices.length; i++) {
-            final Slice slice = container.slices[i];
-            if (slice.sequenceId < 0)
-                continue;
-            if (!slice.validateRefMD5(refs)) {
-                final String msg = String.format(
-                        "Reference sequence MD5 mismatch for slice: sequence id %d, start %d, span %d, expected MD5 %s",
-                            slice.sequenceId,
-                            slice.alignmentStart,
-                            slice.alignmentSpan,
-                            String.format("%032x", new BigInteger(1, slice.refMD5)));
-                throw new CRAMException(msg);
-            }
-        }
-
-        normalizer.normalize(cramRecords, refs, 0,
-                container.header.substitutionMatrix);
-
-        final Cram2SamRecordFactory cramToSamRecordFactory = new Cram2SamRecordFactory(
-                cramHeader.getSamFileHeader());
-
-        for (final CramCompressionRecord cramRecord : cramRecords) {
-            final SAMRecord samRecord = cramToSamRecordFactory.create(cramRecord);
-            if (!cramRecord.isSegmentUnmapped()) {
-                final SAMSequenceRecord sequence = cramHeader.getSamFileHeader()
-                        .getSequence(cramRecord.sequenceId);
-                refs = referenceSource.getReferenceBases(sequence, true);
-            }
-
-            samRecord.setValidationStringency(validationStringency);
-
-            if (validationStringency != ValidationStringency.SILENT) {
-                final List<SAMValidationError> validationErrors = samRecord.isValid();
-                SAMUtils.processValidationErrors(validationErrors,
-                        samRecordIndex, validationStringency);
-            }
-
-            if (mReader != null) {
-                final long chunkStart = (container.offset << 16) | cramRecord.sliceIndex;
-                final long chunkEnd = ((container.offset << 16) | cramRecord.sliceIndex) + 1;
-                nextRecord.setFileSource(new SAMFileSource(mReader,
-                        new BAMFileSpan(new Chunk(chunkStart, chunkEnd))));
-            }
-
-            records.add(samRecord);
-            samRecordIndex++;
-        }
-        cramRecords.clear();
-        iterator = records.iterator();
-    }
-
-    /**
-     * Skip cached records until given alignment start position.
-     *
-     * @param refIndex reference sequence index
-     * @param pos      alignment start to skip to
-     */
-    public boolean advanceToAlignmentInContainer(final int refIndex, final int pos) {
-        if (!hasNext()) return false;
-        int i = 0;
-        for (final SAMRecord record : records) {
-            if (refIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && record.getReferenceIndex() != refIndex) continue;
-
-            if (pos <= 0) {
-                if (record.getAlignmentStart() == SAMRecord.NO_ALIGNMENT_START) {
-                    iterator = records.listIterator(i);
-                    return true;
-                }
-            } else {
-                if (record.getAlignmentStart() >= pos) {
-                    iterator = records.listIterator(i);
-                    return true;
-                }
-            }
-            i++;
-        }
-        iterator = Collections.<SAMRecord>emptyList().iterator();
-        return false;
-    }
-
-    @Override
-    public boolean hasNext() {
-        if (container != null && container.isEOF()) return false;
-        if (!iterator.hasNext()) {
-            try {
-                nextContainer();
-            } catch (IOException e) {
-                throw new SAMException(e);
-            } catch (IllegalAccessException e) {
-                throw new SAMException(e);
-            }
-        }
-
-        return !records.isEmpty();
-    }
-
-    @Override
-    public SAMRecord next() {
-        return iterator.next();
-    }
-
-    @Override
-    public void remove() {
-        throw new RuntimeException("Removal of records not implemented.");
-    }
-
-    @Override
-    public void close() {
-        records.clear();
-        //noinspection EmptyCatchBlock
-        try {
-            if (countingInputStream != null)
-                countingInputStream.close();
-        } catch (final IOException e) {
-        }
-    }
-
-    @Override
-    public SAMRecordIterator assertSorted(final SortOrder sortOrder) {
-        throw new RuntimeException("Not implemented.");
-    }
-
-    public SamReader getFileSource() {
-        return mReader;
-    }
-
-    public void setFileSource(final SamReader mReader) {
-        this.mReader = mReader;
-    }
-
-    public SAMFileHeader getSAMFileHeader() {
-        return cramHeader.getSamFileHeader();
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/CachingBAMFileIndex.java b/src/main/java/htsjdk/samtools/CachingBAMFileIndex.java
deleted file mode 100644
index 8010ce5..0000000
--- a/src/main/java/htsjdk/samtools/CachingBAMFileIndex.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.List;
-import java.util.WeakHashMap;
-
-/**
- * Class for reading BAM file indices, caching each contig as it's loaded and
- * dropping values when the next contig is loaded.
- */
-class CachingBAMFileIndex extends AbstractBAMFileIndex implements BrowseableBAMIndex
-{
-    private Integer mLastReferenceRetrieved = null;
-    private final WeakHashMap<Integer,BAMIndexContent> mQueriesByReference = new WeakHashMap<Integer,BAMIndexContent>();
-
-    public CachingBAMFileIndex(final File file, final SAMSequenceDictionary dictionary) {
-        super(file, dictionary);
-    }
-
-    public CachingBAMFileIndex(final SeekableStream stream, final SAMSequenceDictionary dictionary) {
-        super(stream, dictionary);
-    }
-
-    public CachingBAMFileIndex(final File file, final SAMSequenceDictionary dictionary, final boolean useMemoryMapping) {
-        super(file, dictionary, useMemoryMapping);
-    }
-
-    /**
-     * Get list of regions of BAM file that may contain SAMRecords for the given range
-     * @param referenceIndex sequence of desired SAMRecords
-     * @param startPos 1-based start of the desired interval, inclusive
-     * @param endPos 1-based end of the desired interval, inclusive
-     * @return the virtual file position.  Each pair is the first and last virtual file position
-     *         in a range that can be scanned to find SAMRecords that overlap the given positions.
-     *         May return null if there is no content overlapping the region.
-     */
-    public BAMFileSpan getSpanOverlapping(final int referenceIndex, final int startPos, final int endPos) {
-        final BAMIndexContent queryResults = getQueryResults(referenceIndex);
-
-        if(queryResults == null)
-            return null;
-
-        final List<Chunk> chunkList = queryResults.getChunksOverlapping(startPos, endPos);
-        if (chunkList == null) return null;
-
-        return new BAMFileSpan(chunkList);
-    }
-
-    /**
-     * Get a list of bins in the BAM file that may contain SAMRecords for the given range.
-     * @param referenceIndex sequence of desired SAMRecords
-     * @param startPos 1-based start of the desired interval, inclusive
-     * @param endPos 1-based end of the desired interval, inclusive
-     * @return a list of bins that contain relevant data.
-     */
-    public BinList getBinsOverlapping(final int referenceIndex, final int startPos, final int endPos) {
-        final BitSet regionBins = GenomicIndexUtil.regionToBins(startPos, endPos);
-        if (regionBins == null) {
-            return null;
-        }
-        return new BinList(referenceIndex,regionBins);        
-    }
-
-    /**
-     * Perform an overlapping query of all bins bounding the given location.
-     * @param bin The bin over which to perform an overlapping query.
-     * @return The file pointers
-     */
-    public BAMFileSpan getSpanOverlapping(final Bin bin) {
-        if(bin == null)
-            return null;
-
-        final int referenceSequence = bin.getReferenceSequence();
-        final BAMIndexContent indexQuery = getQueryResults(referenceSequence);
-
-        if(indexQuery == null)
-            return null;
-
-        final int binLevel = getLevelForBin(bin);
-        final int firstLocusInBin = getFirstLocusInBin(bin);
-
-        // Add the specified bin to the tree if it exists.
-        final List<Bin> binTree = new ArrayList<Bin>();
-        if(indexQuery.containsBin(bin))
-            binTree.add(indexQuery.getBins().getBin(bin.getBinNumber()));
-
-        int currentBinLevel = binLevel;
-        while(--currentBinLevel >= 0) {
-            final int binStart = getFirstBinInLevel(currentBinLevel);
-            final int binWidth = getMaxAddressibleGenomicLocation()/getLevelSize(currentBinLevel);
-            final int binNumber = firstLocusInBin/binWidth + binStart;
-            final Bin parentBin = indexQuery.getBins().getBin(binNumber);
-            if(parentBin != null && indexQuery.containsBin(parentBin))
-                binTree.add(parentBin);
-        }
-
-        List<Chunk> chunkList = new ArrayList<Chunk>();
-        for(final Bin coveringBin: binTree) {
-            for(final Chunk chunk: coveringBin.getChunkList())
-                chunkList.add(chunk.clone());
-        }
-
-        final int start = getFirstLocusInBin(bin);
-        chunkList = Chunk.optimizeChunkList(chunkList,indexQuery.getLinearIndex().getMinimumOffset(start));
-        return new BAMFileSpan(chunkList);
-    }
-
-    /**
-     * Looks up the cached BAM query results if they're still in the cache and not expired.  Otherwise,
-     * retrieves the cache results from disk.
-     * @param referenceIndex The reference to load.  CachingBAMFileIndex only stores index data for entire references. 
-     * @return The index information for this reference.
-     */
-    protected BAMIndexContent getQueryResults(final int referenceIndex) {
-        // WeakHashMap is a bit weird in that its lookups are done via equals() equality, but expirations must be
-        // handled via == equality.  This implementation jumps through a few hoops to make sure that == equality still
-        // holds even in the context of boxing/unboxing.
-
-        // If this query is for the same reference index as the last query, return it.
-        if(mLastReferenceRetrieved!=null && mLastReferenceRetrieved == referenceIndex)
-            return mQueriesByReference.get(referenceIndex);
-
-        // If not, check to see whether it's available in the cache.
-        BAMIndexContent queryResults = mQueriesByReference.get(referenceIndex);
-        if(queryResults != null) {
-            mLastReferenceRetrieved = referenceIndex;
-            mQueriesByReference.put(referenceIndex,queryResults);
-            return queryResults;
-        }
-
-        // If not in the cache, attempt to load it from disk.
-        queryResults = query(referenceIndex,1,-1);
-        if(queryResults != null) {
-            mLastReferenceRetrieved = referenceIndex;
-            mQueriesByReference.put(referenceIndex,queryResults);
-            return queryResults;
-        }
-
-        // Not even available on disk.
-        return null;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/ChainedDownsamplingIterator.java b/src/main/java/htsjdk/samtools/ChainedDownsamplingIterator.java
deleted file mode 100644
index 4fa3a7d..0000000
--- a/src/main/java/htsjdk/samtools/ChainedDownsamplingIterator.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Tim Fennell
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A DownsamplingIterator that combines the ConstantMemory and HighAccuracy downsampling techniques to provide an
- * iterator that has accuracy approaching that of HighAccuracy, but with more limited memory usage.  Instead of
- * requiring memory proportional to number of read names in the incoming stream of reads, requires memory
- * approximately proportional to the number of output reads.
- *
- * @author Tim Fennell
- */
-class ChainedDownsamplingIterator extends HighAccuracyDownsamplingIterator {
-    public static final int MIN_ACCURATE_INPUT_READS = 50000;
-
-    /**
-     * Constructs a chained iterator that will read from the provided iterator and attempt to downsampling to the provided proportion.
-     */
-    ChainedDownsamplingIterator(final Iterator<SAMRecord> iterator, final double proportion, final int seed) {
-        super(new ConstantMemoryDownsamplingIterator(iterator, adjustProportion(proportion), seed), proportion, seed);
-
-        // Deal with the fact that the iterator will advance and discard some reads at construction
-        final long discarded = ((ConstantMemoryDownsamplingIterator) getUnderlyingIterator()).getDiscardedCount();
-        recordDiscardRecords(discarded);
-    }
-
-    /**
-     * Calculates the upper bound of 99.9% CI given the proportion, that is used to "buffer" the proportion on
-     * the constant memory downsampler, to make sure it leaves enough reads for us to downsample.
-     *
-     * Uses an assumed number of reads tested as this is often not known until after the fact.
-     */
-    private static double adjustProportion(final double p) {
-        final double ciAdjustment99_9 = 3.3 * Math.sqrt(p/MIN_ACCURATE_INPUT_READS);
-        return Math.min(1, p + ciAdjustment99_9);
-    }
-
-
-    /**
-     * Resets statistics before reading from the underlying iterator.
-     */
-    @Override
-    protected void readFromUnderlyingIterator(final List<SAMRecord> recs, final Set<String> names, final int templatesToRead) {
-        // Reset the stats on the underlying iterator
-        ((ConstantMemoryDownsamplingIterator) getUnderlyingIterator()).resetStatistics();
-
-        // Read from the underlying iterator
-        super.readFromUnderlyingIterator(recs, names, templatesToRead);
-    }
-
-    @Override
-    protected int calculateTemplatesToKeep(final int templatesRead, final double overallProportion) {
-        // Calculate an adjusted proportion to keep, knowing what proportion the underlying iterator discarded
-        final ConstantMemoryDownsamplingIterator iter = (ConstantMemoryDownsamplingIterator) getUnderlyingIterator();
-        final double priorProportion = iter.getAcceptedFraction();
-        final double p = Math.max(0, Math.min(1, overallProportion / priorProportion));
-        final int retval =  super.calculateTemplatesToKeep(templatesRead, p);
-
-        // Record all the discarded records to keep the overall statistics accurate, but do it after
-        // the call to super() so it doesn't affect the proportion calculation.
-        recordDiscardRecords(iter.getDiscardedCount());
-
-        return retval;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/Chunk.java b/src/main/java/htsjdk/samtools/Chunk.java
deleted file mode 100644
index 0d77b0c..0000000
--- a/src/main/java/htsjdk/samtools/Chunk.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BlockCompressedFilePointerUtil;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A [start,stop) file pointer pairing into the BAM file, stored
- * as a BAM file index.  A chunk is represented as a single 64-bit
- * value where the high-order 48 bits point to the location of the
- * start of a compressed BGZF block within a BGZF file and the
- * low-order 16 bits point to a position within the decompressed
- * data in the BGZF block.
- *
- * See the SAM/BAM spec for more details.
- */
-public class Chunk implements Cloneable, Serializable,Comparable<Chunk> {
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * A pointer to the start of a region in a SAM/BAM file.  The
-     * start is inclusive: start reading from this point.
-     */
-    private long mChunkStart;
-
-    /**
-     * A pointer to the end of a region in a SAM/BAM file.  The end
-     * is exclusive: this pointer points to one byte past the end
-     * of the region of interest inside the file.
-     */
-    private long mChunkEnd;
-
-    public Chunk(final long start, final long end) {
-        mChunkStart = start;
-        mChunkEnd = end;
-    }
-
-    public Chunk clone() {
-        return new Chunk(mChunkStart,mChunkEnd);
-    }
-
-    public long getChunkStart() {
-        return mChunkStart;
-    }
-
-    protected void setChunkStart(final long value) {
-        mChunkStart = value;
-    }
-
-    public long getChunkEnd() {
-        return mChunkEnd;
-    }
-
-    protected void setChunkEnd(final long value) {
-        mChunkEnd = value;
-    }
-
-    public int compareTo(final Chunk chunk) {
-        int result = Long.signum(mChunkStart - chunk.mChunkStart);
-        if (result == 0) {
-            result = Long.signum(mChunkEnd - chunk.mChunkEnd);
-        }
-        return result;
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final Chunk chunk = (Chunk) o;
-
-        if (mChunkEnd != chunk.mChunkEnd) return false;
-        if (mChunkStart != chunk.mChunkStart) return false;
-
-        return true;
-    }
-
-    /**
-     * Returns whether two chunks overlap.
-     * @param other Chunk to which this should be compared.
-     * @return True if the chunks overlap.  Returns false if the two chunks abut or are disjoint.
-     */
-    public boolean overlaps(final Chunk other) {
-        final int comparison = this.compareTo(other);
-        if(comparison == 0)
-            return true;
-
-        // "sort" the two chunks using the comparator.
-        final Chunk leftMost = comparison==-1 ? this : other;
-        final Chunk rightMost = comparison==1 ? this : other;
-
-        final long leftMostBlockAddress = BlockCompressedFilePointerUtil.getBlockAddress(leftMost.getChunkEnd());
-        final long rightMostBlockAddress = BlockCompressedFilePointerUtil.getBlockAddress(rightMost.getChunkStart());
-
-        // If the left block's address is after the right block's address, compare the two blocks.
-        // If the two blocks are identical, compare the block offsets.
-        // If the right block is after the left block, no overlap is possible.
-        if(leftMostBlockAddress > rightMostBlockAddress)
-            return true;
-        else if(leftMostBlockAddress == rightMostBlockAddress) {
-            final int leftMostOffset = BlockCompressedFilePointerUtil.getBlockOffset(leftMost.getChunkEnd());
-            final int rightMostOffset = BlockCompressedFilePointerUtil.getBlockOffset(rightMost.getChunkStart());
-            return leftMostOffset > rightMostOffset;
-        }
-        else
-            return false;
-    }
-
-    /**
-     * Returns whether two chunks overlap.
-     * @param other Chunk to which this should be compared.
-     * @return True if the two chunks are adjacent.  Returns false if the chunks overlap or are discontinuous.
-     */
-    public boolean isAdjacentTo(final Chunk other) {
-        // Simpler implementation would be to == the chunk end of one to the chunk start of the other.  Chose this implementation to ensure that all chunk
-        // comparisons point directly to the 
-        return (BlockCompressedFilePointerUtil.getBlockAddress(this.getChunkEnd()) == BlockCompressedFilePointerUtil.getBlockAddress(other.getChunkStart()) &&
-                BlockCompressedFilePointerUtil.getBlockOffset(this.getChunkEnd()) == BlockCompressedFilePointerUtil.getBlockOffset(other.getChunkStart())) ||
-               (BlockCompressedFilePointerUtil.getBlockAddress(this.getChunkStart()) == BlockCompressedFilePointerUtil.getBlockAddress(other.getChunkEnd()) &&
-                BlockCompressedFilePointerUtil.getBlockOffset(this.getChunkStart()) == BlockCompressedFilePointerUtil.getBlockOffset(other.getChunkEnd()));
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (int) (mChunkStart ^ (mChunkStart >>> 32));
-        result = 31 * result + (int) (mChunkEnd ^ (mChunkEnd >>> 32));
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("%d:%d-%d:%d",mChunkStart >> 16,mChunkStart & 0xFFFF,mChunkEnd >> 16,mChunkEnd & 0xFFFF);
-    }
-
-    /**
-     * @param minimumOffset Discard chunks that end before this file offset.
-     * @return sorted list of chunks in which adjacent chunks are coalesced.
-     */
-    public static List<Chunk> optimizeChunkList(final List<Chunk> chunks, final long minimumOffset) {
-        Chunk lastChunk = null;
-        Collections.sort(chunks);
-        final List<Chunk> result = new ArrayList<Chunk>();
-        for (final Chunk chunk : chunks) {
-            if (chunk.getChunkEnd() <= minimumOffset) {
-                continue;               // linear index optimization
-            }
-            if (result.isEmpty()) {
-                result.add(chunk);
-                lastChunk = chunk;
-                continue;
-            }
-            // Coalesce chunks that are in adjacent file blocks.
-            // This is a performance optimization.
-            if (!lastChunk.overlaps(chunk) && !lastChunk.isAdjacentTo(chunk)) {
-                result.add(chunk);
-                lastChunk = chunk;
-            } else {
-                if (chunk.getChunkEnd() > lastChunk.getChunkEnd()) {
-                    lastChunk.setChunkEnd(chunk.getChunkEnd());
-                }
-            }
-        }
-        return result;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/Cigar.java b/src/main/java/htsjdk/samtools/Cigar.java
deleted file mode 100644
index 12ffd0c..0000000
--- a/src/main/java/htsjdk/samtools/Cigar.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A list of CigarElements, which describes how a read aligns with the reference.
- * E.g. the Cigar string 10M1D25M means
- * * match or mismatch for 10 bases
- * * deletion of 1 base
- * * match or mismatch for 25 bases
- *
- * c.f. http://samtools.sourceforge.net/SAM1.pdf for complete CIGAR specification.
- */
-public class Cigar implements Serializable, Iterable<CigarElement> {
-    public static final long serialVersionUID = 1L;
-
-    private final List<CigarElement> cigarElements = new ArrayList<CigarElement>();
-
-    public Cigar() {
-    }
-
-    public Cigar(final List<CigarElement> cigarElements) {
-        this.cigarElements.addAll(cigarElements);
-    }
-
-    public List<CigarElement> getCigarElements() {
-        return Collections.unmodifiableList(cigarElements);
-    }
-
-    public CigarElement getCigarElement(final int i) {
-        return cigarElements.get(i);
-    }
-
-    public void add(final CigarElement cigarElement) {
-        cigarElements.add(cigarElement);
-    }
-
-    public int numCigarElements() {
-        return cigarElements.size();
-    }
-
-    public boolean isEmpty() {
-        return cigarElements.isEmpty();
-    }
-
-    /**
-     * @return The number of reference bases that the read covers, excluding padding.
-     */
-    public int getReferenceLength() {
-        int length = 0;
-        for (final CigarElement element : cigarElements) {
-            switch (element.getOperator()) {
-                case M:
-                case D:
-                case N:
-                case EQ:
-                case X:
-                    length += element.getLength();
-                    break;
-                default: break;
-            }
-        }
-        return length;
-    }
-
-    /**
-     * @return The number of reference bases that the read covers, including padding.
-     */
-    public int getPaddedReferenceLength() {
-        int length = 0;
-        for (final CigarElement element : cigarElements) {
-            switch (element.getOperator()) {
-                case M:
-                case D:
-                case N:
-                case EQ:
-                case X:
-                case P:
-                    length += element.getLength();
-                    break;
-                default: break;
-            }
-        }
-        return length;
-    }
-
-    /**
-     * @return The number of read bases that the read covers.
-     */
-    public int getReadLength() {
-        return getReadLength(cigarElements);
-    }
-
-    /**
-     * @return The number of read bases that the read covers.
-     */
-    public static int getReadLength(final List<CigarElement> cigarElements) {
-        int length = 0;
-        for (final CigarElement element : cigarElements) {
-            if (element.getOperator().consumesReadBases()){
-                    length += element.getLength();
-            }
-        }
-        return length;
-    }
-
-    /**
-     * Exhaustive validation of CIGAR.
-     * Note that this method deliberately returns null rather than Collections.emptyList() if there
-     * are no validation errors, because callers tend to assume that if a non-null list is returned, it is modifiable.
-     * @param readName For error reporting only.  May be null if not known.
-     * @param recordNumber For error reporting only.  May be -1 if not known.
-     * @return List of validation errors, or null if no errors.
-     */
-    public List<SAMValidationError> isValid(final String readName, final long recordNumber) {
-        if (this.isEmpty()) {
-            return null;
-        }
-        List<SAMValidationError> ret = null;
-        boolean seenRealOperator = false;
-        for (int i = 0; i < cigarElements.size(); ++i) {
-            final CigarElement element = cigarElements.get(i);
-            if (element.getLength() == 0) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
-                        "CIGAR element with zero length", readName, recordNumber));
-            }
-            // clipping operator can only be at start or end of CIGAR
-            final CigarOperator op = element.getOperator();
-            if (isClippingOperator(op)) {
-                if (op == CigarOperator.H) {
-                    if (i != 0 && i != cigarElements.size() - 1) {
-                        if (ret == null) ret = new ArrayList<SAMValidationError>();
-                        ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
-                                "Hard clipping operator not at start or end of CIGAR", readName, recordNumber));
-                    }
-                } else {
-                    if (op != CigarOperator.S) throw new IllegalStateException("Should never happen: " + op.name());
-                    if (i == 0 || i == cigarElements.size() - 1) {
-                        // Soft clip at either end is fine
-                    } else if (i == 1) {
-                        if (cigarElements.size() == 3 && cigarElements.get(2).getOperator() == CigarOperator.H) {
-                            // Handle funky special case in which S operator is both one from the beginning and one
-                            // from the end.
-                        } else if (cigarElements.get(0).getOperator() != CigarOperator.H) {
-                            if (ret == null) ret = new ArrayList<SAMValidationError>();
-                            ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
-                                "Soft clipping CIGAR operator can only be inside of hard clipping operator",
-                                    readName, recordNumber));
-                        }
-                    } else if (i == cigarElements.size() - 2) {
-                        if (cigarElements.get(cigarElements.size() - 1).getOperator() != CigarOperator.H) {
-                            if (ret == null) ret = new ArrayList<SAMValidationError>();
-                            ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
-                                "Soft clipping CIGAR operator can only be inside of hard clipping operator",
-                                    readName, recordNumber));
-                        }
-                    } else {
-                        if (ret == null) ret = new ArrayList<SAMValidationError>();
-                        ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
-                            "Soft clipping CIGAR operator can at start or end of read, or be inside of hard clipping operator",
-                                readName, recordNumber));
-                    }
-
-                }
-            } else if (isRealOperator(op)) {
-                // Must be at least one real operator (MIDN)
-                seenRealOperator = true;
-                // There should be an M or P operator between any pair of IDN operators
-                if (isInDelOperator(op)) {
-                    for (int j = i+1; j < cigarElements.size(); ++j) {
-                        final CigarOperator nextOperator = cigarElements.get(j).getOperator();
-                        // Allow
-                        if ((isRealOperator(nextOperator) && !isInDelOperator(nextOperator)) || isPaddingOperator(nextOperator)) {
-                            break;
-                        }
-                        if (isInDelOperator(nextOperator) && op == nextOperator) {
-                            if (ret == null) ret = new ArrayList<SAMValidationError>();
-                            ret.add(new SAMValidationError(SAMValidationError.Type.ADJACENT_INDEL_IN_CIGAR,
-                                    "No M or N operator between pair of " + op.name() + " operators in CIGAR", readName, recordNumber));
-                        }
-                    }
-                }
-            } else if (isPaddingOperator(op)) {
-                if (i == 0) {
-                    /*
-                     * Removed restriction that padding not be the first operator because if a read starts in the middle of a pad
-                     * in a padded reference, it is necessary to precede the read with padding so that alignment start refers to a
-                     * position on the unpadded reference.
-                    */
-                } else if (i == cigarElements.size() - 1) {
-                    if (ret == null) ret = new ArrayList<SAMValidationError>();
-                    ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
-                            "Padding operator not valid at end of CIGAR", readName, recordNumber));
-                } else if (!isRealOperator(cigarElements.get(i-1).getOperator()) ||
-                        !isRealOperator(cigarElements.get(i+1).getOperator())) {
-                    if (ret == null) ret = new ArrayList<SAMValidationError>();
-                    ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
-                            "Padding operator not between real operators in CIGAR", readName, recordNumber));
-                }
-            }
-        }
-        if (!seenRealOperator) {
-            if (ret == null) ret = new ArrayList<SAMValidationError>();
-            ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
-                    "No real operator (M|I|D|N) in CIGAR", readName, recordNumber));
-        }
-        return ret;
-    }
-
-    private static boolean isRealOperator(final CigarOperator op) {
-        return op == CigarOperator.M || op == CigarOperator.EQ || op == CigarOperator.X || 
-               op == CigarOperator.I || op == CigarOperator.D || op == CigarOperator.N;
-    }
-
-    private static boolean isInDelOperator(final CigarOperator op) {
-        return op !=null && op.isIndel();
-    }
-
-    private static boolean isClippingOperator(final CigarOperator op) {
-        return op !=null && op.isClipping();
-    }
-
-    private static boolean isPaddingOperator(final CigarOperator op) {
-        return op !=null && op.isPadding();
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (!(o instanceof Cigar)) return false;
-
-        final Cigar cigar = (Cigar) o;
-
-        return cigarElements.equals(cigar.cigarElements);
-    }
-    
-    /** build a new Cigar object from a list of cigar operators.
-     * This can be used if you have the  operators associated to
-     * each base in the read.
-     * 
-     * e.g: read length =10 with cigar= <code>[M,M,M,M,M,M,M,M,M,M]</code>, here
-     * fromCigarOperators would generate the cigar '10M'
-     * 
-     * later the user resolved the 'M' to '=' or 'X', the array is now
-     * 
-     * <code>[=,=,=,=,=,X,X,=,=,=]</code>
-     * 
-     * fromCigarOperators would generate the cigar '5M2X3M'
-     * 
-     * */
-    public static Cigar fromCigarOperators(final List<CigarOperator> cigarOperators) {
-        if (cigarOperators == null) throw new IllegalArgumentException("cigarOperators is null");
-        final List<CigarElement> cigarElementList = new ArrayList<>();
-        int i = 0;
-        // find adjacent operators and build list of cigar elements
-        while (i < cigarOperators.size() ) {
-            final CigarOperator currentOp = cigarOperators.get(i);
-            int j = i + 1;
-            while (j < cigarOperators.size() && cigarOperators.get(j).equals(currentOp)) {
-                j++;
-            }
-            cigarElementList.add(new CigarElement(j - i, currentOp));
-            i = j;
-        }
-        return new Cigar(cigarElementList);
-    }
-    
-    /** shortcut to <code>getCigarElements().iterator()</code> */
-    @Override
-    public Iterator<CigarElement> iterator() {
-        return this.getCigarElements().iterator();
-    }
-    
-    /** returns true if the cigar string contains the given operator */
-    public boolean containsOperator(final CigarOperator operator) {
-        return this.cigarElements.stream().anyMatch( element -> element.getOperator() == operator);
-    }
-    
-    /** returns the first cigar element */
-    public CigarElement getFirstCigarElement() {
-        return isEmpty() ? null : this.cigarElements.get(0); 
-    }
-    
-    /** returns the last cigar element */
-    public CigarElement getLastCigarElement() {
-        return isEmpty() ? null : this.cigarElements.get(this.numCigarElements() - 1 ); 
-    }
-    
-    /** returns true if the cigar string starts With a clipping operator */
-    public boolean isLeftClipped() {
-        return !isEmpty() && isClippingOperator(getFirstCigarElement().getOperator());
-    }
-
-    /** returns true if the cigar string ends With a clipping operator */
-    public boolean isRightClipped() {
-        return !isEmpty() && isClippingOperator(getLastCigarElement().getOperator());
-    }
-
-    /** returns true if the cigar is clipped */
-    public boolean isClipped() {
-        return isLeftClipped() || isRightClipped();
-    }
-    
-    @Override
-    public int hashCode() {
-        return cigarElements.hashCode();
-    }
-
-    public String toString() {
-        return TextCigarCodec.encode(this);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/CigarElement.java b/src/main/java/htsjdk/samtools/CigarElement.java
deleted file mode 100644
index c645e6c..0000000
--- a/src/main/java/htsjdk/samtools/CigarElement.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-
-/**
- * One component of a cigar string.  The component comprises the operator, and the number of bases to which
- * the  operator applies.
- */
-public class CigarElement implements Serializable {
-    public static final long serialVersionUID = 1L;
-
-    private final int length;
-    private final CigarOperator operator;
-
-    public CigarElement(final int length, final CigarOperator operator) {
-        this.length = length;
-        this.operator = operator;
-    }
-
-    public int getLength() {
-        return length;
-    }
-
-    public CigarOperator getOperator() {
-        return operator;
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (!(o instanceof CigarElement)) return false;
-
-        final CigarElement that = (CigarElement) o;
-
-        if (length != that.length) return false;
-        if (operator != that.operator) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = length;
-        result = 31 * result + (operator != null ? operator.hashCode() : 0);
-        return result;
-    }
-    
-    @Override
-    public String toString() {
-        return String.valueOf(this.length)+this.operator;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/CigarOperator.java b/src/main/java/htsjdk/samtools/CigarOperator.java
deleted file mode 100644
index 46ea539..0000000
--- a/src/main/java/htsjdk/samtools/CigarOperator.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * The operators that can appear in a cigar string, and information about their disk representations.
- */
-public enum CigarOperator {
-    /** Match or mismatch */
-    M(true, true,   'M'),
-    /** Insertion vs. the reference. */
-    I(true, false,  'I'),
-    /** Deletion vs. the reference. */
-    D(false, true,  'D'),
-    /** Skipped region from the reference. */
-    N(false, true,  'N'),
-    /** Soft clip. */
-    S(true, false,  'S'),
-    /** Hard clip. */
-    H(false, false, 'H'),
-    /** Padding. */
-    P(false, false, 'P'),
-    /** Matches the reference. */
-    EQ(true, true,  '='),
-    /** Mismatches the reference. */
-    X(true, true,   'X')
-    ;
-
-    // Representation of CigarOperator in BAM file
-    private static final byte OP_M = 0;
-    private static final byte OP_I = 1;
-    private static final byte OP_D = 2;
-    private static final byte OP_N = 3;
-    private static final byte OP_S = 4;
-    private static final byte OP_H = 5;
-    private static final byte OP_P = 6;
-    private static final byte OP_EQ = 7;
-    private static final byte OP_X = 8;
-
-    private final boolean consumesReadBases;
-    private final boolean consumesReferenceBases;
-    private final byte character;
-    private final String string;
-
-    // Readable synonyms of the above enums
-    public static final CigarOperator MATCH_OR_MISMATCH = M;
-    public static final CigarOperator INSERTION = I;
-    public static final CigarOperator DELETION = D;
-    public static final CigarOperator SKIPPED_REGION = N;
-    public static final CigarOperator SOFT_CLIP = S;
-    public static final CigarOperator HARD_CLIP = H;
-    public static final CigarOperator PADDING = P;
-
-    /** Default constructor. */
-    CigarOperator(boolean consumesReadBases, boolean consumesReferenceBases, char character) {
-        this.consumesReadBases = consumesReadBases;
-        this.consumesReferenceBases = consumesReferenceBases;
-        this.character = (byte) character;
-        this.string = new String(new char[] {character}).intern();
-    }
-
-    /** If true, represents that this cigar operator "consumes" bases from the read bases. */
-    public boolean consumesReadBases() { return consumesReadBases; }
-
-    /** If true, represents that this cigar operator "consumes" bases from the reference sequence. */
-    public boolean consumesReferenceBases() { return consumesReferenceBases; }
-
-    /**
-     * @param b CIGAR operator in character form as appears in a text CIGAR string
-     * @return CigarOperator enum value corresponding to the given character.
-     */
-    public static CigarOperator characterToEnum(final int b) {
-        switch (b) {
-        case 'M':
-            return M;
-        case 'I':
-            return I;
-        case 'D':
-            return D;
-        case 'N':
-            return N;
-        case 'S':
-            return S;
-        case 'H':
-            return H;
-        case 'P':
-            return P;
-        case '=':
-            return EQ;
-        case 'X':
-            return X;
-        default:
-            throw new IllegalArgumentException("Unrecognized CigarOperator: " + b);
-        }
-    }
-
-    /**
-     * @param i CIGAR operator in binary form as appears in a BAMRecord.
-     * @return CigarOperator enum value corresponding to the given int value.
-     */
-    public static CigarOperator binaryToEnum(final int i) {
-        switch(i) {
-            case OP_M:
-                return M;
-            case OP_I:
-                return I;
-            case OP_D:
-                return D;
-            case OP_N:
-                return N;
-            case OP_S:
-                return S;
-            case OP_H:
-                return H;
-            case OP_P:
-                return P;
-            case OP_EQ:
-                return EQ;
-            case OP_X:
-                return X;
-            default:
-                throw new IllegalArgumentException("Unrecognized CigarOperator: " + i);
-        }
-    }
-
-    /**
-     *
-     * @param e CigarOperator enum value.
-     * @return CIGAR operator corresponding to the enum value in binary form as appears in a BAMRecord.
-     */
-    public static int enumToBinary(final CigarOperator e) {
-        switch(e) {
-            case M:
-                return OP_M;
-            case I:
-                return OP_I;
-            case D:
-                return OP_D;
-            case N:
-                return OP_N;
-            case S:
-                return OP_S;
-            case H:
-                return OP_H;
-            case P:
-                return OP_P;
-            case EQ:
-                return OP_EQ;
-            case X:
-                return OP_X;
-            default:
-                throw new IllegalArgumentException("Unrecognized CigarOperator: " + e);
-        }
-    }
-
-    /** Returns the character that should be used within a SAM file. */
-    public static byte enumToCharacter(final CigarOperator e) {
-        return e.character;
-    }
-
-    /** Returns true if the operator is a clipped (hard or soft) operator */
-    public boolean isClipping() {
-        return this == S || this == H;
-    }
-
-    /** Returns true if the operator is a Insertion or Deletion operator */
-    public boolean isIndel() {
-        return this == I || this == D;
-    }
-
-    /** Returns true if the operator is a Skipped Region Insertion or Deletion operator */
-    public boolean isIndelOrSkippedRegion() {
-        return this == N || isIndel();
-    }
-
-    /** Returns true if the operator is a M, a X or a EQ */
-    public boolean isAlignment() {
-        return this == M || this == X || this == EQ;
-    }
-    
-    /** Returns true if the operator is a Padding operator */
-    public boolean isPadding() {
-        return this == P;
-    }
-    
-    /** Returns the cigar operator as it would be seen in a SAM file. */
-    @Override public String toString() {
-        return this.string;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/ComparableSamRecordIterator.java b/src/main/java/htsjdk/samtools/ComparableSamRecordIterator.java
deleted file mode 100644
index 06186a1..0000000
--- a/src/main/java/htsjdk/samtools/ComparableSamRecordIterator.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.PeekableIterator;
-
-import java.util.Comparator;
-
-/**
- * Iterator for SAM records that implements comparable to enable sorting of iterators.
- * The comparison is performed by comparing the next record in the iterator to the next
- * record in another iterator and returning the ordering between those SAM records.
- */
-class ComparableSamRecordIterator extends PeekableIterator<SAMRecord> implements Comparable<ComparableSamRecordIterator> {
-    private final Comparator<SAMRecord> comparator;
-    private final SamReader reader;
-
-    /**
-     * Constructs a wrapping iterator around the given iterator that will be able
-     * to compare itself to other ComparableSamRecordIterators using the given comparator.
-     *
-     * @param iterator   the wrapped iterator.
-     * @param comparator the Comparator to use to provide ordering fo SAMRecords
-     */
-    public ComparableSamRecordIterator(final SamReader sam, final CloseableIterator<SAMRecord> iterator, final Comparator<SAMRecord> comparator) {
-        super(iterator);
-        this.reader = sam;
-        this.comparator = comparator;
-    }
-
-    /** Returns the reader from which this iterator was constructed. */
-    public SamReader getReader() {
-        return reader;
-    }
-
-    /**
-     * Compares this iterator to another comparable iterator based on the next record
-     * available in each iterator.  If the two comparable iterators have different
-     * comparator types internally an exception is thrown.
-     *
-     * @param that another iterator to compare to
-     * @return a negative, 0 or positive number as described in the Comparator interface
-     */
-    public int compareTo(final ComparableSamRecordIterator that) {
-        if (this.comparator.getClass() != that.comparator.getClass()) {
-            throw new IllegalStateException("Attempt to compare two ComparableSAMRecordIterators that " +
-                    "have different orderings internally");
-        }
-
-        final SAMRecord record = this.peek();
-        final SAMRecord record2 = that.peek();
-        return comparator.compare(record, record2);
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        return compareTo((ComparableSamRecordIterator) o) == 0;
-    }
-
-    @Override
-    public int hashCode() {
-        throw new UnsupportedOperationException("ComparableSamRecordIterator should not be hashed because it can change value");
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/ConstantMemoryDownsamplingIterator.java b/src/main/java/htsjdk/samtools/ConstantMemoryDownsamplingIterator.java
deleted file mode 100644
index c6e0de4..0000000
--- a/src/main/java/htsjdk/samtools/ConstantMemoryDownsamplingIterator.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Tim Fennell
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Murmur3;
-import htsjdk.samtools.util.PeekableIterator;
-
-import java.util.Iterator;
-
-/**
- * A DownsamplingIterator that runs in constant (and very small) memory. For each read the read name is hashed
- * using the Murmur3_32 hash algorithm to obtain an integer value that is, enough for our purposes, uniformly
- * distributed between the min and max int values even for highly similar inputs.  The proportion is used to
- * calculate a maximum acceptable hash value within the range.  Records whose hash value is below the limit
- * are emitted, records whose hash value is above the limit are discarded.
- *
- * Does not make any attempt to be accurate (have actual proportion == requested proportion) beyond what would
- * be expected for a random process and so may become quite inaccurate when downsampling to small numbers of
- * reads.
- *
- * @author Tim Fennell
- */
-class ConstantMemoryDownsamplingIterator extends DownsamplingIterator {
-    private final PeekableIterator<SAMRecord> underlyingIterator;
-    private final int maxHashValue;
-    private final Murmur3 hasher;
-
-
-    /** Constructs a downsampling iterator upon the supplied iterator, using the Random as the source of randomness. */
-    ConstantMemoryDownsamplingIterator(final Iterator<SAMRecord> iterator, final double proportion, final int seed) {
-        super(proportion);
-        this.hasher = new Murmur3(seed);
-        this.underlyingIterator = new PeekableIterator<SAMRecord>(iterator);
-
-        final long range = (long) Integer.MAX_VALUE - (long) Integer.MIN_VALUE;
-        this.maxHashValue = Integer.MIN_VALUE + (int) Math.round(range * proportion);
-
-        advanceToNextAcceptedRead();
-    }
-
-    /** Returns true if there is another record available post-downsampling, false otherwise. */
-    @Override public boolean hasNext() {
-        // The underlying iterator is always left at the next return-able read, so if it has a next read, so do we
-        return this.underlyingIterator.hasNext();
-    }
-
-    /**
-     * Advances the underlying, peekable, iterator until the next records is one that is to be emitted.
-     * @return true if there is at least one emittable record ready for emission, false otherwise
-     */
-    private boolean advanceToNextAcceptedRead() {
-        while (this.underlyingIterator.hasNext() && this.hasher.hashUnencodedChars(this.underlyingIterator.peek().getReadName()) > this.maxHashValue) {
-            this.underlyingIterator.next();
-            recordDiscardedRecord();
-        }
-
-        return this.underlyingIterator.hasNext();
-    }
-
-    /** Returns the next record from the iterator, or throws an exception if there is no next record. */
-    @Override public SAMRecord next() {
-        final SAMRecord rec = this.underlyingIterator.next();
-        recordAcceptedRecord();
-        advanceToNextAcceptedRead();
-        return rec;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/CoordinateSortedPairInfoMap.java b/src/main/java/htsjdk/samtools/CoordinateSortedPairInfoMap.java
deleted file mode 100644
index d892d65..0000000
--- a/src/main/java/htsjdk/samtools/CoordinateSortedPairInfoMap.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.FileAppendStreamLRUCache;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * Holds info about a mate pair for use when processing a coordinate sorted file.  When one read of a pair is encountered,
- * the caller should add a record to this map.  When the other read of a pair is encountered, the record should be removed.
- * This class assumes that reads will be processed in order of reference sequence index.  When the map is queried for
- * a record for a given reference sequence index, all the records for that sequence are loaded from temp file into RAM, so there
- * must be sufficient RAM to hold all the records for one reference sequence.  If the records are not processed in
- * reference sequence order, loading and unloading of records will cause performance to be terrible.
- * @param <KEY> KEY + reference sequence index are used to identify the record being stored or retrieved.
- * @param <REC> The type of record being retrieved.
- */
-public class CoordinateSortedPairInfoMap<KEY, REC> implements Iterable<Map.Entry<KEY, REC>> {
-    // -1 is a valid sequence index in this case
-    private final int INVALID_SEQUENCE_INDEX = -2;
-    /**
-     * directory where files will go
-     */
-    private final File workDir = IOUtil.createTempDir("CSPI.", null);
-    private int sequenceIndexOfMapInRam = INVALID_SEQUENCE_INDEX;
-    private Map<KEY, REC> mapInRam = null;
-    private final FileAppendStreamLRUCache outputStreams;
-    private final Codec<KEY, REC> elementCodec;
-    // Key is reference index (which is in the range [-1 .. max sequence index].
-    // Value is the number of records on disk for this index.
-    private final Map<Integer, Integer> sizeOfMapOnDisk = new HashMap<Integer, Integer>();
-
-    // No other methods may be called when iteration is in progress, because iteration depends on and changes
-    // internal state.
-    private boolean iterationInProgress = false;
-
-    public CoordinateSortedPairInfoMap(final int maxOpenFiles, final Codec<KEY, REC> elementCodec) {
-        this.elementCodec = elementCodec;
-        workDir.deleteOnExit();
-        outputStreams = new FileAppendStreamLRUCache(maxOpenFiles);
-    }
-
-    /**
-     *
-     * @param sequenceIndex
-     * @param key
-     * @return The record corresponding to the given sequenceIndex and key, or null if it is not present.
-     */
-    public REC remove(final int sequenceIndex, final KEY key) {
-        if (iterationInProgress) throw new IllegalStateException("Cannot be called when iteration is in progress");
-        ensureSequenceLoaded(sequenceIndex);
-        return mapInRam.remove(key);
-    }
-
-    private void ensureSequenceLoaded(final int sequenceIndex) {
-        try {
-            if (sequenceIndexOfMapInRam == sequenceIndex) {
-                return;
-            }
-
-            // Spill map in RAM to disk
-            if (mapInRam != null) {
-                final File spillFile = makeFileForSequence(sequenceIndexOfMapInRam);
-                if (spillFile.exists()) throw new IllegalStateException(spillFile + " should not exist.");
-                if (!mapInRam.isEmpty()) {
-                    // Do not create file or entry in sizeOfMapOnDisk if there is nothing to write.
-                    final OutputStream os = getOutputStreamForSequence(sequenceIndexOfMapInRam);
-                    elementCodec.setOutputStream(os);
-                    for (final Map.Entry<KEY, REC> entry : mapInRam.entrySet()) {
-                        elementCodec.encode(entry.getKey(), entry.getValue());
-                    }
-                    sizeOfMapOnDisk.put(sequenceIndexOfMapInRam, mapInRam.size());
-                    mapInRam.clear();
-                }
-            } else {
-                mapInRam = new HashMap<KEY, REC>();
-            }
-
-            sequenceIndexOfMapInRam = sequenceIndex;
-
-            // Load map from disk if it existed
-            File mapOnDisk = makeFileForSequence(sequenceIndex);
-            if (outputStreams.containsKey(mapOnDisk)) {
-                outputStreams.remove(mapOnDisk).close();
-            }
-            final Integer numRecords = sizeOfMapOnDisk.remove(sequenceIndex);
-            if (mapOnDisk.exists()) {
-                if (numRecords == null)
-                    throw new IllegalStateException("null numRecords for " + mapOnDisk);
-                FileInputStream is = null;
-                try {
-                    is = new FileInputStream(mapOnDisk);
-                    elementCodec.setInputStream(is);
-                    for (int i = 0; i < numRecords; ++i) {
-                        final Map.Entry<KEY, REC> keyAndRecord = elementCodec.decode();
-                        if (mapInRam.containsKey(keyAndRecord.getKey()))
-                            throw new SAMException("Value was put into PairInfoMap more than once.  " +
-                                    sequenceIndex + ": " + keyAndRecord.getKey());
-                        mapInRam.put(keyAndRecord.getKey(), keyAndRecord.getValue());
-                    }
-                } finally {
-                    CloserUtil.close(is);
-                }
-                htsjdk.samtools.util.IOUtil.deleteFiles(mapOnDisk);
-            } else if (numRecords != null && numRecords > 0)
-                throw new IllegalStateException("Non-zero numRecords but " + mapOnDisk + " does not exist");
-        } catch (IOException e) {
-            throw new SAMException("Error loading new map from disk.", e);
-        }
-    }
-
-    /**
-     * Store the record with the given sequence index and key.  It is assumed that value did not previously exist
-     * in the map, and an exception is thrown (possibly at a later time) if that is not the case.
-     * @param sequenceIndex
-     * @param key
-     * @param record
-     */
-    public void put(final int sequenceIndex, final KEY key, final REC record) {
-        if (iterationInProgress) throw new IllegalStateException("Cannot be called when iteration is in progress");
-        if (sequenceIndex == sequenceIndexOfMapInRam) {
-            // Store in RAM map
-            if (mapInRam.containsKey(key))
-                throw new IllegalArgumentException("Putting value into PairInfoMap that already existed. " +
-                        sequenceIndex + ": " + key);
-            mapInRam.put(key, record);
-        } else {
-            // Append to file
-            final OutputStream os = getOutputStreamForSequence(sequenceIndex);
-            elementCodec.setOutputStream(os);
-            elementCodec.encode(key, record);
-            Integer prevCount = sizeOfMapOnDisk.get(sequenceIndex);
-            if (prevCount == null) prevCount = 0;
-            sizeOfMapOnDisk.put(sequenceIndex,  prevCount + 1);
-        }
-    }
-
-    private File makeFileForSequence(final int index) {
-        final File file = new File(workDir, index + ".tmp");
-        file.deleteOnExit();
-        return file;
-    }
-
-    private OutputStream getOutputStreamForSequence(final int mateSequenceIndex) {
-        return outputStreams.get(makeFileForSequence(mateSequenceIndex));
-    }
-
-    public int size() {
-        int total = sizeInRam();
-        for (final Integer mapSize : sizeOfMapOnDisk.values()) {
-            if (mapSize != null) {
-                total += mapSize;
-            }
-        }
-        return total;
-    }
-
-    /**
-     * @return number of elements stored in RAM.  Always <= size()
-     */
-    public int sizeInRam() {
-        return mapInRam != null? mapInRam.size(): 0;
-    }
-
-    /**
-     * Creates an iterator over all elements in map, in arbitrary order.  Elements may not be added
-     * or removed from map when iteration is in progress, nor may a second iteration be started.
-     * Iterator must be closed in order to allow normal access to the map.
-     */
-    public CloseableIterator<Map.Entry<KEY, REC>> iterator() {
-        if (iterationInProgress) throw new IllegalStateException("Cannot be called when iteration is in progress");
-        iterationInProgress = true;
-        return new MapIterator();
-    }
-
-    private class MapIterator implements CloseableIterator<Map.Entry<KEY, REC>> {
-        private boolean closed = false;
-        private Set<Integer> referenceIndices = new HashSet<Integer>(sizeOfMapOnDisk.keySet());
-        private final Iterator<Integer> referenceIndexIterator;
-        private Iterator<Map.Entry<KEY, REC>> currentReferenceIterator = null;
-
-        private MapIterator() {
-            if (sequenceIndexOfMapInRam != INVALID_SEQUENCE_INDEX)
-                referenceIndices.add(sequenceIndexOfMapInRam);
-            referenceIndexIterator = referenceIndices.iterator();
-            advanceToNextNonEmptyReferenceIndex();
-        }
-
-        private void advanceToNextNonEmptyReferenceIndex() {
-            while (referenceIndexIterator.hasNext()) {
-                int nextReferenceIndex = referenceIndexIterator.next();
-                ensureSequenceLoaded(nextReferenceIndex);
-                if (!mapInRam.isEmpty()) {
-                    createIteratorForMapInRam();
-                    return;
-                }
-            }
-            // no more.
-            currentReferenceIterator = null;
-        }
-
-        private void createIteratorForMapInRam() {
-            currentReferenceIterator = mapInRam.entrySet().iterator();
-        }
-
-        public void close() {
-            closed = true;
-            iterationInProgress = false;
-        }
-
-        public boolean hasNext() {
-            if (closed) throw new IllegalStateException("Iterator has been closed");
-            if (currentReferenceIterator != null && !currentReferenceIterator.hasNext())
-                throw new IllegalStateException("Should not happen");
-            return currentReferenceIterator != null;
-        }
-
-        public Map.Entry<KEY, REC> next() {
-            if (closed) throw new IllegalStateException("Iterator has been closed");
-            if (!hasNext()) throw new NoSuchElementException();
-            final Map.Entry<KEY, REC> ret = currentReferenceIterator.next();
-            if (!currentReferenceIterator.hasNext()) advanceToNextNonEmptyReferenceIndex();
-            return ret;
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-    }
-
-    /**
-     * Client must implement this class, which defines the way in which records are written to and
-     * read from file.
-     */
-    public interface Codec<KEY, REC> {
-        /**
-         * Where to write encoded output
-         * @param os
-         */
-        void setOutputStream(OutputStream os);
-
-        /**
-         * Where to read encoded input from
-         * @param is
-         */
-        void setInputStream(InputStream is);
-
-        /**
-         * Write object to output stream.  If the key is part of the record, then there is no need to write
-         * it separately.
-         */
-        void encode(KEY key, REC record);
-
-        /**
-         * Read the next key and record from the input stream and convert into a java object.
-         * @return null if no more records.  Should throw exception if EOF is encountered in the middle of
-         * a record.
-         */
-        Map.Entry<KEY, REC> decode();
-
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/CustomReaderFactory.java b/src/main/java/htsjdk/samtools/CustomReaderFactory.java
deleted file mode 100644
index bb00da7..0000000
--- a/src/main/java/htsjdk/samtools/CustomReaderFactory.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Log;
-
-import java.net.URL;
-import java.net.URLClassLoader;
-
-
-/**
- * Factory for creating custom readers for accessing API based resources, 
- * e.g. ga4gh.
- * The configuration is controlled via custom_reader property (@see Defaults).
- * This allows injection of such readers from code bases outside HTSJDK.
- */
-public class CustomReaderFactory {
-  private final static Log LOG = Log.getInstance(CustomReaderFactory.class);
-  /**
-   * Interface to be implemented by custom factory classes that register
-   * themselves with this factory and are loaded dynamically.
-   */
-  public interface ICustomReaderFactory {
-    SamReader open(URL url);
-  }
-  
-  private static final CustomReaderFactory DEFAULT_FACTORY;
-  private static CustomReaderFactory currentFactory;
-  
-  private String urlPrefix = "";
-  private String factoryClassName = "";
-  private String jarFile = "";
-  private ICustomReaderFactory factory;
-  
-  static {
-      DEFAULT_FACTORY = new CustomReaderFactory();
-      currentFactory = DEFAULT_FACTORY;
-  }
-
-  public static void setInstance(final CustomReaderFactory factory){
-      currentFactory = factory;
-  }
-  
-  public static void resetToDefaultInstance() {
-    setInstance(DEFAULT_FACTORY);
-  }
-
-  public static CustomReaderFactory getInstance(){
-      return currentFactory;
-  }
-  
-  /**
-   * Initializes factory based on the custom_reader property specification.
-   */
-  private CustomReaderFactory() {
-    this(Defaults.CUSTOM_READER_FACTORY);
-  }
-  
-  CustomReaderFactory(String cfg) {
-    final String[] cfgComponents = cfg.split(",");
-    if (cfgComponents.length < 2) {
-      return;
-    }
-    urlPrefix = cfgComponents[0].toLowerCase();
-    factoryClassName = cfgComponents[1];
-    if (cfgComponents.length > 2) {
-      jarFile = cfgComponents[2];
-    }
-  }
-  
-  /**
-   * Lazily creates factory based on the configuration.
-   * @return null if creation fails, factory instance otherwise.
-   */
-  private synchronized ICustomReaderFactory getFactory() {
-    if (factory == null) {
-      try {
-        Class clazz = null;
-        
-        if (!jarFile.isEmpty()) {
-          LOG.info("Attempting to load factory class " + factoryClassName + 
-              " from " + jarFile);
-          final URL jarURL = new URL("file:///"+jarFile);
-          clazz = Class.forName(factoryClassName, true, 
-                    new URLClassLoader (new URL[] { jarURL }, 
-                        this.getClass().getClassLoader()));
-        } else {
-          LOG.info("Attempting to load factory class " + factoryClassName);
-          clazz = Class.forName(factoryClassName);
-        }
-        
-        factory = (ICustomReaderFactory)clazz.newInstance();
-        LOG.info("Created custom factory for " + urlPrefix + " from " + 
-            factoryClassName + " loaded from " + (jarFile.isEmpty() ? 
-                " this jar" : jarFile));
-      } catch (Exception e) {
-        LOG.error(e);
-        return null;
-      }
-    }
-    return factory;
-  }
-  
-  /**
-   * Check if the url is supposed to be handled by the custom factory and if so
-   * attempt to create reader via an instance of this custom factory.
-   * 
-   * @return null if the url is not handled by this factory, SamReader otherwise.
-   */
-  public SamReader maybeOpen(URL url) {
-    if (urlPrefix.isEmpty() || 
-        !url.toString().toLowerCase().startsWith(urlPrefix)) {
-      return null;
-    }
-    LOG.info("Attempting to open " + url + " with custom factory");
-    final ICustomReaderFactory factory = getFactory();
-    if (factory == null) {
-      return null;
-    }
-    return factory.open(url);
-  }
-}
diff --git a/src/main/java/htsjdk/samtools/DefaultSAMRecordFactory.java b/src/main/java/htsjdk/samtools/DefaultSAMRecordFactory.java
deleted file mode 100644
index 7e3848e..0000000
--- a/src/main/java/htsjdk/samtools/DefaultSAMRecordFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * Default factory for creating SAM and BAM records used by the {@link SamReader} classes.
- *
- * @author Tim Fennell
- */
-public class DefaultSAMRecordFactory implements SAMRecordFactory {
-
-    private static final DefaultSAMRecordFactory INSTANCE = new DefaultSAMRecordFactory();
-    
-    public static DefaultSAMRecordFactory getInstance() {
-        return INSTANCE;   
-    }
-
-    /** Create a new SAMRecord to be filled in */
-    public SAMRecord createSAMRecord(final SAMFileHeader header) {
-        return new SAMRecord(header);
-    }
-
-    /**
-     * Create a new BAM Record. If the reference sequence index or mate reference sequence index are
-     * any value other than NO_ALIGNMENT_REFERENCE_INDEX, the values must be resolvable against the sequence
-     * dictionary in the header argument.
-     */
-    public BAMRecord createBAMRecord (final SAMFileHeader header,
-                                      final int referenceSequenceIndex,
-                                      final int alignmentStart,
-                                      final short readNameLength,
-                                      final short mappingQuality,
-                                      final int indexingBin,
-                                      final int cigarLen,
-                                      final int flags,
-                                      final int readLen,
-                                      final int mateReferenceSequenceIndex,
-                                      final int mateAlignmentStart,
-                                      final int insertSize,
-                                      final byte[] variableLengthBlock) {
-
-        return new BAMRecord(header,
-                             referenceSequenceIndex,
-                             alignmentStart,
-                             readNameLength,
-                             mappingQuality,
-                             indexingBin,
-                             cigarLen,
-                             flags,
-                             readLen,
-                             mateReferenceSequenceIndex,
-                             mateAlignmentStart,
-                             insertSize,
-                             variableLengthBlock);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/Defaults.java b/src/main/java/htsjdk/samtools/Defaults.java
deleted file mode 100644
index 5e3f6da..0000000
--- a/src/main/java/htsjdk/samtools/Defaults.java
+++ /dev/null
@@ -1,174 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Log;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-/**
- * Embodies defaults for global values that affect how the SAM JDK operates. Defaults are encoded in the class
- * and are also overridable using system properties.
- *
- * @author Tim Fennell
- */
-public class Defaults {
-    private static Log log = Log.getInstance(Defaults.class);
-    
-    /** Should BAM index files be created when writing out coordinate sorted BAM files?  Default = false. */
-    public static final boolean CREATE_INDEX;
-
-    /** Should MD5 files be created when writing out SAM and BAM files?  Default = false. */
-    public static final boolean CREATE_MD5;
-
-    /** Should asynchronous read I/O be used where supported by the samtools package (one thread per file).
-     *  Default = false.
-     */
-    public static final boolean USE_ASYNC_IO_READ_FOR_SAMTOOLS;
-
-    /** Should asynchronous write I/O be used where supported by the samtools package (one thread per file).
-     *  Default = false.
-     */
-    public static final boolean USE_ASYNC_IO_WRITE_FOR_SAMTOOLS;
-
-    /** Should asynchronous write I/O be used where supported by the tribble package (one thread per file).
-     *  Default = false.
-     */
-    public static final boolean USE_ASYNC_IO_WRITE_FOR_TRIBBLE;
-
-    /** Compresion level to be used for writing BAM and other block-compressed outputs.  Default = 5. */
-    public static final int COMPRESSION_LEVEL;
-
-    /** Buffer size, in bytes, used whenever reading/writing files or streams.  Default = 128k. */
-    public static final int BUFFER_SIZE;
-
-    /** The output format of the flag field when writing SAM text.  Ignored for reading SAM text. */
-    public static final SamFlagField SAM_FLAG_FIELD_FORMAT;
-
-    /**
-     * Even if BUFFER_SIZE is 0, this is guaranteed to be non-zero.  If BUFFER_SIZE is non-zero,
-     * this == BUFFER_SIZE
-     */
-    public static final int NON_ZERO_BUFFER_SIZE;
-
-    /**
-     * The reference FASTA file.  If this is not set, the file is null.  This file may be required for reading
-     * writing SAM files (ex. CRAM).
-     */
-    public static final File REFERENCE_FASTA;
-
-    /** Custom reader factory able to handle URL based resources like ga4gh.
-     *  Expected format: <url prefix>,<fully qualified factory class name>[,<jar file name>]
-     *  E.g. https://www.googleapis.com/genomics/v1beta/reads/,com.google.genomics.ReaderFactory
-     *  OR https://www.googleapis.com/genomics/v1beta/reads/,com.google.genomics.ReaderFactory,/tmp/genomics.jar
-     */
-    public static final String CUSTOM_READER_FACTORY;
-
-    /**
-     * Boolean describing whether downloading a reference file is allowed (for CRAM files),
-     * in case the reference file is not specified by the user
-     * Enabling this is not necessarily a good idea, since this process often fails
-     */
-    public static final boolean USE_CRAM_REF_DOWNLOAD;
-
-    /**
-     * A mask (pattern) to use when building EBI reference service URL for a
-     * given MD5 checksum. Must contain one and only one string placeholder.
-     */
-    public static final String EBI_REFERENCE_SERVICE_URL_MASK;
-
-    /**
-     * Boolean describing whether downloading of SRA native libraries is allowed,
-     * in case such native libraries are not found locally
-     */
-    public static final boolean SRA_LIBRARIES_DOWNLOAD;
-
-
-    static {
-        CREATE_INDEX = getBooleanProperty("create_index", false);
-        CREATE_MD5 = getBooleanProperty("create_md5", false);
-        USE_ASYNC_IO_READ_FOR_SAMTOOLS = getBooleanProperty("use_async_io_read_samtools", false);
-        USE_ASYNC_IO_WRITE_FOR_SAMTOOLS = getBooleanProperty("use_async_io_write_samtools", false);
-        USE_ASYNC_IO_WRITE_FOR_TRIBBLE = getBooleanProperty("use_async_io_write_tribble", false);
-        COMPRESSION_LEVEL = getIntProperty("compression_level", 5);
-        BUFFER_SIZE = getIntProperty("buffer_size", 1024 * 128);
-        if (BUFFER_SIZE == 0) {
-            NON_ZERO_BUFFER_SIZE = 1024 * 128;
-        } else {
-            NON_ZERO_BUFFER_SIZE = BUFFER_SIZE;
-        }
-        REFERENCE_FASTA = getFileProperty("reference_fasta", null);
-        USE_CRAM_REF_DOWNLOAD = getBooleanProperty("use_cram_ref_download", false);
-        EBI_REFERENCE_SERVICE_URL_MASK = "http://www.ebi.ac.uk/ena/cram/md5/%s";
-        CUSTOM_READER_FACTORY = getStringProperty("custom_reader", "");
-        SAM_FLAG_FIELD_FORMAT = SamFlagField.valueOf(getStringProperty("sam_flag_field_format", SamFlagField.DECIMAL.name()));
-        SRA_LIBRARIES_DOWNLOAD = getBooleanProperty("sra_libraries_download", false);
-    }
-
-    /**
-     * Returns a map of all default values (keys are names), lexicographically sorted by keys.
-     * The returned map is unmodifiable.
-     * This function is useful for example when logging all defaults.
-     */
-    public static SortedMap<String, Object> allDefaults(){
-        final SortedMap<String, Object> result = new TreeMap<>();
-        result.put("CREATE_INDEX", CREATE_INDEX);
-        result.put("CREATE_MD5", CREATE_MD5);
-        result.put("USE_ASYNC_IO_READ_FOR_SAMTOOLS", USE_ASYNC_IO_READ_FOR_SAMTOOLS);
-        result.put("USE_ASYNC_IO_WRITE_FOR_SAMTOOLS", USE_ASYNC_IO_WRITE_FOR_SAMTOOLS);
-        result.put("USE_ASYNC_IO_WRITE_FOR_TRIBBLE", USE_ASYNC_IO_WRITE_FOR_TRIBBLE);
-        result.put("COMPRESSION_LEVEL", COMPRESSION_LEVEL);
-        result.put("BUFFER_SIZE", BUFFER_SIZE);
-        result.put("NON_ZERO_BUFFER_SIZE", NON_ZERO_BUFFER_SIZE);
-        result.put("REFERENCE_FASTA", REFERENCE_FASTA);
-        result.put("USE_CRAM_REF_DOWNLOAD", USE_CRAM_REF_DOWNLOAD);
-        result.put("EBI_REFERENCE_SERVICE_URL_MASK", EBI_REFERENCE_SERVICE_URL_MASK);
-        result.put("CUSTOM_READER_FACTORY", CUSTOM_READER_FACTORY);
-        result.put("SAM_FLAG_FIELD_FORMAT", SAM_FLAG_FIELD_FORMAT);
-        return Collections.unmodifiableSortedMap(result);
-    }
-
-    /** Gets a string system property, prefixed with "samjdk." using the default 
-     * if the property does not exist or if the java.security manager raises an exception for
-     * applications started with  -Djava.security.manager  . */
-    private static String getStringProperty(final String name, final String def) {
-        try {
-            return System.getProperty("samjdk." + name, def);
-        } catch (final java.security.AccessControlException error) {
-            log.warn(error,"java Security Manager forbids 'System.getProperty(\"" + name + "\")' , returning default value: " + def );
-            return def;
-        }
-    }
-
-    /** Checks whether a string system property, prefixed with "samjdk.", exists.
-     * If the property does not exist or if the java.security manager raises an exception for
-     * applications started with  -Djava.security.manager  this method returns false. */
-    private static boolean hasProperty(final String name){
-        try {
-            return null != System.getProperty("samjdk." + name);
-        } catch (final java.security.AccessControlException error) {
-            log.warn(error,"java Security Manager forbids 'System.getProperty(\"" + name + "\")' , returning false");
-            return false;
-        }
-    }
-
-    /** Gets a boolean system property, prefixed with "samjdk." using the default if the property does not exist. */
-    private static boolean getBooleanProperty(final String name, final boolean def) {
-        final String value = getStringProperty(name, Boolean.toString(def));
-        return Boolean.parseBoolean(value);
-    }
-
-    /** Gets an int system property, prefixed with "samjdk." using the default if the property does not exist. */
-    private static int getIntProperty(final String name, final int def) {
-        final String value = getStringProperty(name, Integer.toString(def));
-        return Integer.parseInt(value);
-    }
-
-    /** Gets a File system property, prefixed with "samjdk." using the default if the property does not exist. */
-    private static File getFileProperty(final String name, final String def) {
-        final String value = getStringProperty(name, def);
-        // TODO: assert that it is readable
-        return (null == value) ? null : new File(value);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/DiskBasedBAMFileIndex.java b/src/main/java/htsjdk/samtools/DiskBasedBAMFileIndex.java
deleted file mode 100644
index b5d6f59..0000000
--- a/src/main/java/htsjdk/samtools/DiskBasedBAMFileIndex.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A class for reading BAM file indices, hitting the disk once per query.
- */
-public class DiskBasedBAMFileIndex extends AbstractBAMFileIndex
-{
-    public DiskBasedBAMFileIndex(final File file, final SAMSequenceDictionary dictionary) {
-        super(file, dictionary);
-    }
-
-    public DiskBasedBAMFileIndex(final SeekableStream stream, final SAMSequenceDictionary dictionary) {
-        super(stream, dictionary);
-    }
-
-    public DiskBasedBAMFileIndex(final File file, final SAMSequenceDictionary dictionary, final boolean useMemoryMapping) {
-        super(file, dictionary, useMemoryMapping);
-    }
-
-    /**
-     * Get list of regions of BAM file that may contain SAMRecords for the given range
-     * @param referenceIndex sequence of desired SAMRecords
-     * @param startPos 1-based start of the desired interval, inclusive
-     * @param endPos 1-based end of the desired interval, inclusive
-     * @return array of pairs of virtual file positions.  Each pair is the first and last
-     * virtual file position in a range that can be scanned to find SAMRecords that overlap the given
-     * positions. The last position in each pair is a virtual file pointer to the first SAMRecord beyond
-     * the range that may contain the indicated SAMRecords.
-     */
-    public BAMFileSpan getSpanOverlapping(final int referenceIndex, final int startPos, final int endPos) {
-        final BAMIndexContent queryResults = query(referenceIndex,startPos,endPos);
-
-        if(queryResults == null)
-            return null;
-
-        List<Chunk> chunkList = new ArrayList<Chunk>();
-        for(final Chunk chunk: queryResults.getAllChunks())
-            chunkList.add(chunk.clone());
-        chunkList = Chunk.optimizeChunkList(chunkList,queryResults.getLinearIndex().getMinimumOffset(startPos));
-        return new BAMFileSpan(chunkList);
-    }
-
-     protected BAMIndexContent getQueryResults(final int reference){
-         throw new UnsupportedOperationException();
-         // todo: there ought to be a way to support this using the first startPos for the reference and the last
-         // return query(reference, 1, -1);
-         // If this were implemented, BAMIndexer.createAndWriteIndex could extend DiskBasedBAMFileIndex -or- CachingBAMFileIndex
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/DownsamplingIterator.java b/src/main/java/htsjdk/samtools/DownsamplingIterator.java
deleted file mode 100644
index 8ca0d84..0000000
--- a/src/main/java/htsjdk/samtools/DownsamplingIterator.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-/**
- * Abstract base class for all DownsamplingIterators that provides a uniform interface for recording
- * and reporting statistics bout how many records have been kept and discarded.
- *
- * A DownsamplingIterator is an iterator that takes another iterator of SAMRecords and filters out a
- * subset of those records in a random way, while ensuring that all records for a template (i.e. record name)
- * are either retained or discarded.  Strictly speaking the proportion parameter applies to templates,
- * though in most instances it is safe to think about it being applied to records.
- *
- * @author Tim Fennell
- */
-public abstract class DownsamplingIterator implements CloseableIterator<SAMRecord> {
-    private long recordsSeen;
-    private long recordsAccepted;
-    private double targetProportion;
-
-    /** Constructs a downsampling iterator that aims to retain the targetProportion of reads. */
-    public DownsamplingIterator(final double targetProportion) {
-        if (targetProportion < 0) throw new IllegalArgumentException("targetProportion must be >= 0");
-        if (targetProportion > 1) throw new IllegalArgumentException("targetProportion must be <= 1");
-        this.targetProportion = targetProportion;
-    }
-
-    /** Does nothing. */
-    @Override public void close() { /** No Op. */ }
-
-    /** Returns the number of records seen, including accepted and discarded, since creation of the last call to resetStatistics. */
-    public long getSeenCount() { return this.recordsSeen; }
-
-    /** Returns the number of records returned since creation of the last call to resetStatistics. */
-    public long getAcceptedCount() { return this.recordsAccepted; }
-
-    /** Returns the number of records discarded since creation of the last call to resetStatistics. */
-    public long getDiscardedCount() { return this.recordsSeen - this.recordsAccepted; }
-
-    /** Gets the fraction of records discarded since creation or the last call to resetStatistics(). */
-    public double getDiscardedFraction() { return getDiscardedCount() / (double) getSeenCount(); }
-
-    /** Gets the fraction of records accepted since creation or the last call to resetStatistics(). */
-    public double getAcceptedFraction() { return getAcceptedCount() / (double) getSeenCount(); }
-
-    /** Resets the statistics for records seen/accepted/discarded. */
-    public void resetStatistics() {
-        this.recordsSeen = 0;
-        this.recordsAccepted = 0;
-    }
-
-    /** Gets the target proportion of records that should be retained during downsampling. */
-    public double getTargetProportion() {
-        return targetProportion;
-    }
-
-    /** Method for subclasses to record a record as being discarded. */
-    protected final void recordDiscardedRecord() { this.recordsSeen++; }
-
-    /**
-     * Method for subclasses to record a specific record as being accepted. Null may be passed if a record
-     * was discarded but access to the object is no longer available.
-     */
-    protected final void recordAcceptedRecord() { this.recordsSeen++; this.recordsAccepted++; }
-
-    /** Record one or more records as having been discarded. */
-    protected final void recordDiscardRecords(final long n) {
-        this.recordsSeen += n;
-    }
-
-    /** Record one or more records as having been discarded. */
-    protected final void recordAcceptedRecords(final long n) {
-        this.recordsSeen += n;
-        this.recordsAccepted += n;
-    }
-
-    /**
-     * Indicates whether or not the strategy implemented by this DownsamplingIterator makes any effort to
-     * increase accuracy beyond random sampling (i.e. to reduce the delta between the requested proportion
-     * of reads and the actually emitted proportion of reads).
-     */
-    public boolean isHigherAccuracy() {
-        return false;
-    }
-
-    /** Not supported. */
-    @Override public void remove() {
-        throw new UnsupportedOperationException("remove() not supported in DownsamplingIterators");
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/DownsamplingIteratorFactory.java b/src/main/java/htsjdk/samtools/DownsamplingIteratorFactory.java
deleted file mode 100644
index d54e706..0000000
--- a/src/main/java/htsjdk/samtools/DownsamplingIteratorFactory.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Tim Fennell
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.File;
-import java.util.Iterator;
-
-/**
- * A factory for creating DownsamplingIterators that uses a number of different strategies to achieve downsampling while
- * meeting various criteria.
- *
- * @author Tim Fennell
- */
-public class DownsamplingIteratorFactory {
-    public static final String HIGH_ACCURACY_DESCRIPTION =
-            "Attempts (but does not guarantee) to provide accuracy up to a specified limit. Accuracy is defined as emitting " +
-            "a proportion of reads as close to the requested proportion as possible. In order to do so this strategy requires " +
-            "memory that is proportional to the number of template names in the incoming stream of reads, and will thus require " +
-            "large amounts of memory when running on large input files.";
-
-    public static final String CONSTANT_MEMORY_DESCRPTION =
-            "Downsamples a stream or file of SAMRecords using a hash-projection strategy such that it can run in constant memory. " +
-            "The downsampling is stochastic, and therefore the actual retained proportion will vary around the requested proportion. Due " +
-            "to working in fixed memory this strategy is good for large inputs, and due to the stochastic nature the accuracy of this strategy " +
-            "is highest with a high number of output records, and diminishes at low output volumes.";
-
-    public static final String CHAINED_DESCRIPTION =
-            "Attempts to provide a compromise strategy that offers some of the advantages of both the ConstantMemory and HighAccuracy strategies. " +
-            "Uses a ConstantMemory strategy to downsample the incoming stream to approximately the desired proportion, and then a HighAccuracy " +
-            "strategy to finish. Works in a single pass, and will provide accuracy close to (but often not as good as) HighAccuracy while requiring " +
-            "memory proportional to the set of reads emitted from the ConstantMemory strategy to the HighAccuracy strategy. Works well when downsampling " +
-            "large inputs to small proportions (e.g. downsampling hundreds of millions of reads and retaining only 2%. Should be accurate 99.9% of the time " +
-            "when the input contains >= 50,000 templates (read names). For smaller inputs, HighAccuracy is recommended instead.";
-
-    /** Describes the available downsampling strategies. */
-    public enum Strategy {
-        HighAccuracy(HIGH_ACCURACY_DESCRIPTION),
-        ConstantMemory(CONSTANT_MEMORY_DESCRPTION),
-        Chained(CHAINED_DESCRIPTION);
-
-        public final String description;
-
-        Strategy(final String description) {
-            this.description = description;
-        }
-
-        /** Gets the description of the strategy. */
-        public String getDescription() {
-            return description;
-        }
-    }
-
-    /**
-     * Creates a new DownsamplingIterator using the supplied Strategy that attempts to read from the provided iterator and return
-     * approximately proportion of the records read.
-     *
-     * @param iterator The iterator from which to consume SAMRecords
-     * @param strategy The downsampling strategy to use
-     * @param proportion The proportion of records the downsampling strategy should attempt to emit
-     * @param accuracy If supported by the downsampling strategy, the accuracy goal for the downsampler. Higher accuracy will generally
-     *                 require higher memory usage.  An accuracy value of 0.0001 tells the strategy to try and ensure the emitted proportion
-     *                 is within proportion +/0 0.0001.
-     * @param seed The seed value to use for any random process used in down-sampling.
-     */
-    public static DownsamplingIterator make(final Iterator<SAMRecord> iterator, final Strategy strategy, final double proportion, final double accuracy, final int seed) {
-        if (strategy == null) throw new IllegalArgumentException("strategy may not be null");
-        if (iterator == null) throw new IllegalArgumentException("iterator may not be null");
-        if (proportion < 0) throw new IllegalArgumentException("proportion must be greater than 0");
-        if (proportion > 1) throw new IllegalArgumentException("proportion must be less than 1");
-
-        switch (strategy) {
-            case HighAccuracy:   return new HighAccuracyDownsamplingIterator(iterator, proportion, seed).setTargetAccuracy(accuracy);
-            case ConstantMemory: return new ConstantMemoryDownsamplingIterator(iterator, proportion, seed);
-            case Chained:        return new ChainedDownsamplingIterator(iterator, proportion, seed).setTargetAccuracy(accuracy);
-            default: throw new IllegalStateException("Unexpected value for Strategy enum in switch statement. Bug!!");
-        }
-    }
-
-    /**
-     * Convenience method that constructs a downsampling iterator for all the reads in a SAM file.
-     * See {@link DownsamplingIteratorFactory#make(Iterator, Strategy, double, double, int)} for detailed parameter information.
-     */
-    public static DownsamplingIterator make(final File samFile, final Strategy strategy, final double proportion, final double accuracy, final int seed) {
-        IOUtil.assertFileIsReadable(samFile);
-        return make(SamReaderFactory.makeDefault().open(samFile), strategy, proportion, accuracy, seed);
-    }
-
-    /**
-     * Convenience method that constructs a downsampling iterator for all the reads available from a SamReader.
-     * See {@link DownsamplingIteratorFactory#make(Iterator, Strategy, double, double, int)} for detailed parameter information.
-     */
-    public static DownsamplingIterator make(final SamReader reader, final Strategy strategy, final double proportion, final double accuracy, final int seed) {
-        return make(reader.iterator(), strategy, proportion, accuracy, seed);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/DuplicateScoringStrategy.java b/src/main/java/htsjdk/samtools/DuplicateScoringStrategy.java
deleted file mode 100644
index 1abd514..0000000
--- a/src/main/java/htsjdk/samtools/DuplicateScoringStrategy.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Murmur3;
-
-/**
- * This class helps us compute and compare duplicate scores, which are used for selecting the non-duplicate
- * during duplicate marking (see MarkDuplicates).
- * @author nhomer
- */
-public class DuplicateScoringStrategy {
-
-    public enum ScoringStrategy {
-        SUM_OF_BASE_QUALITIES,
-        TOTAL_MAPPED_REFERENCE_LENGTH,
-        RANDOM,
-    }
-
-    /** Hash used for the RANDOM scoring strategy. */
-    private static final Murmur3 hasher = new Murmur3(1);
-
-    /** An enum to use for storing temporary attributes on SAMRecords. */
-    private static enum Attr { DuplicateScore }
-
-    /** Calculates a score for the read which is the sum of scores over Q15. */
-    private static short getSumOfBaseQualities(final SAMRecord rec) {
-        short score = 0;
-        for (final byte b : rec.getBaseQualities()) {
-            if (b >= 15) score += b;
-        }
-
-        return score;
-    }
-
-    /**
-     * Returns the duplicate score computed from the given fragment.
-     */
-    public static short computeDuplicateScore(final SAMRecord record, final ScoringStrategy scoringStrategy) {
-        return computeDuplicateScore(record, scoringStrategy, false);
-    }
-
-    /**
-     * Returns the duplicate score computed from the given fragment.
-     *
-     * If true is given to assumeMateCigar, then any score that can use the mate cigar to compute the mate's score will return the score
-     * computed on both ends.
-     */
-    public static short computeDuplicateScore(final SAMRecord record, final ScoringStrategy scoringStrategy, final boolean assumeMateCigar) {
-        Short storedScore = (Short) record.getTransientAttribute(Attr.DuplicateScore);
-
-        if (storedScore == null) {
-            short score = 0;
-
-            switch (scoringStrategy) {
-                case SUM_OF_BASE_QUALITIES:
-                    score += getSumOfBaseQualities(record);
-                    break;
-                case TOTAL_MAPPED_REFERENCE_LENGTH:
-                    if (!record.getReadUnmappedFlag()) {
-                        score += record.getCigar().getReferenceLength();
-                    }
-                    if (assumeMateCigar && record.getReadPairedFlag() && !record.getMateUnmappedFlag()) {
-                        score += SAMUtils.getMateCigar(record).getReferenceLength();
-                    }
-                    break;
-                case RANDOM:
-                    score += (short) (hasher.hashUnencodedChars(record.getReadName()) >> 16);
-            }
-
-            storedScore = score;
-            record.setTransientAttribute(Attr.DuplicateScore, storedScore);
-        }
-
-        return storedScore;
-    }
-
-    /**
-     * Compare two records based on their duplicate scores.  If the scores are equal, we break ties based on mapping quality
-     * (added to the mate's mapping quality if paired and mapped), then library/read name.
-     *
-     * If true is given to assumeMateCigar, then any score that can use the mate cigar to to compute the mate's score will return the score
-     * computed on both ends.
-     *
-     * We allow different scoring strategies. We return <0 if rec1 has a better strategy than rec2.
-     */
-    public static int compare(final SAMRecord rec1, final SAMRecord rec2, final ScoringStrategy scoringStrategy, final boolean assumeMateCigar) {
-        int cmp;
-
-        // always prefer paired over non-paired
-        if (rec1.getReadPairedFlag() != rec2.getReadPairedFlag()) return rec1.getReadPairedFlag() ? 1 : -1;
-
-        cmp = computeDuplicateScore(rec2, scoringStrategy, assumeMateCigar) - computeDuplicateScore(rec1, scoringStrategy, assumeMateCigar);
-
-        /**
-         * Finally, use library ID and read name
-         * This is important because we cannot control the order in which reads appear for reads that are comparable up to now (i.e. cmp == 0).  We want to deterministically
-         * choose them, and so we need this.
-         */
-        if (0 == cmp) cmp = SAMUtils.getCanonicalRecordName(rec1).compareTo(SAMUtils.getCanonicalRecordName(rec2));
-
-        return cmp;
-    }
-
-    /**
-     * Compare two records based on their duplicate scores.  The duplicate scores for each record is assume to be
-     * pre-computed by computeDuplicateScore and stored in the "DS" tag.  If the scores are equal, we break
-     * ties based on mapping quality (added to the mate's mapping quality if paired and mapped), then library/read name.
-     *
-     * We allow different scoring strategies. We return <0 if rec1 has a better strategy than rec2.
-     */
-    public static int compare(final SAMRecord rec1, final SAMRecord rec2, final ScoringStrategy scoringStrategy) {
-        return compare(rec1, rec2, scoringStrategy, false);
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/DuplicateSet.java b/src/main/java/htsjdk/samtools/DuplicateSet.java
deleted file mode 100644
index 8333069..0000000
--- a/src/main/java/htsjdk/samtools/DuplicateSet.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Stores a set of records that are duplicates of each other.  The first records in the list of records is 
- * considered the representative of the duplicate, and typically does not have it's duplicate flag set.  
- * The records' duplicate flag will be set appropriately as records are added.  This behavior can be 
- * turned off.
- *
- * At this time, this set does not track optical duplicates.
- *
- * @author nhomer
- */
-public class DuplicateSet {
-
-    private final List<SAMRecord> records;
-
-    private static final SAMRecordDuplicateComparator defaultComparator = new SAMRecordDuplicateComparator();
-
-    private final SAMRecordDuplicateComparator comparator;
-
-    private SAMRecord representative = null;
-
-    private boolean needsSorting = false;
-
-    private boolean setDuplicateFlag = false;
-
-    /** Sets the duplicate flag by default */
-    public DuplicateSet() {
-        this(true);
-    }
-
-    public DuplicateSet(final boolean setDuplicateFlag) {
-        this(setDuplicateFlag, defaultComparator);
-    }
-
-    public DuplicateSet(final SAMRecordDuplicateComparator comparator) {
-        this(true, comparator);
-    }
-
-    public DuplicateSet(final boolean setDuplicateFlag, final SAMRecordDuplicateComparator comparator) {
-        records = new ArrayList<SAMRecord>(10);
-        this.setDuplicateFlag = setDuplicateFlag;
-        this.comparator = comparator;
-    }
-
-    /**
-     * Adds a record to the set and returns zero if either the set is empty, or it is a duplicate of the records already in the set.  Otherwise,
-     * it does not add the record and returns non-zero.
-     * @param record the record to add.
-     * @return zero if the record belongs in this set, -1 in a previous set, or 1 in a subsequent set, according to the comparison order
-     */
-    public int add(final SAMRecord record) {
-
-        if (!this.records.isEmpty()) {
-            final int cmp = this.comparator.duplicateSetCompare(this.representative, record);
-            if (0 != cmp) {
-                return cmp;
-            }
-
-            // update representative
-            if (0 < this.comparator.compare(this.representative, record)) {
-                this.representative = record;
-            }
-        }
-        else {
-            this.representative = record;
-        }
-
-        this.records.add(record);
-        needsSorting = true;
-
-        return 0;
-    }
-
-    private void sort() {
-        if (!records.isEmpty()) {
-            if (1 < records.size()) {
-                Collections.sort(records, this.comparator);
-            }
-
-            if (setDuplicateFlag) {
-                // reset duplicate flags
-                for (final SAMRecord record : records) {
-                    if (!record.getReadUnmappedFlag() && !record.isSecondaryOrSupplementary() && !record.getReadName().equals(representative.getReadName())) {
-                        record.setDuplicateReadFlag(true);
-                    }
-                }
-                records.get(0).setDuplicateReadFlag(false);
-            }
-
-            if (!records.get(0).equals(this.representative)) {
-                throw new SAMException("BUG: the representative was not the first record after sorting."
-                + "\nFIRST: " + records.get(0).getSAMString() + "\nSECOND: " + this.representative.getSAMString());
-            }
-        }
-        needsSorting = false; // this could be in the if above if you think hard about it
-    }
-
-    /**
-     * Gets the list of records from this set.
-     *
-     * Setting sort to false likely will not yield records in duplicate order within the set.
-     *
-     * @param sort true if we want the records in the duplicate set sorted by duplicate order, false if we do not care about the order.
-     */
-    public List<SAMRecord> getRecords(final boolean sort) {
-        if (sort && needsSorting) {
-            sort();
-        }
-
-        return this.records;
-    }
-
-    /**
-     * Gets the list of records from this set.
-     */
-    public List<SAMRecord> getRecords() {
-        return getRecords(true);
-    }
-
-    /**
-     * Gets the representative record according to the duplicate comparator.
-     */
-    public SAMRecord getRepresentative() {
-        return this.representative;
-    }
-
-    /**
-     * Returns the number of records in this set.
-     */
-    public int size() {
-        return this.records.size();
-    }
-
-    /**
-     * Returns the number of duplicates in this set, including the representative record.  Does not include records that are unmapped,
-     * secondary, or supplementary.
-     */
-    public int numDuplicates() {
-        int n = 0;
-        for (final SAMRecord record : records) {
-            if (!record.getReadUnmappedFlag() && !record.isSecondaryOrSupplementary()) {
-                n++;
-            }
-        }
-        return n;
-    }
-
-    public boolean isEmpty() {
-        return this.records.isEmpty();
-    }
-
-    /**
-     * Controls if we should update the duplicate flag of the records in this set.
-     */
-    public void setDuplicateFlag(final boolean setDuplicateFlag) { this.setDuplicateFlag = setDuplicateFlag; }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/DuplicateSetIterator.java b/src/main/java/htsjdk/samtools/DuplicateSetIterator.java
deleted file mode 100644
index 9a0c6f1..0000000
--- a/src/main/java/htsjdk/samtools/DuplicateSetIterator.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.ProgressLogger;
-import htsjdk.samtools.util.SortingCollection;
-
-import java.io.File;
-import java.util.Collections;
-
-/**
- * An iterator of sets of duplicates.  Duplicates are defined currently by the ordering in
- * SAMRecordDuplicateComparator.
- * <p/>
- * If the input records are not pre-sorted according to the duplicate ordering, the records
- * will be sorted on-the-fly.  This may require extra memory or disk to buffer records, and
- * also computational time to perform the sorting.
- *
- * @author nhomer
- */
-public class DuplicateSetIterator implements CloseableIterator<DuplicateSet> {
-
-    private final CloseableIterator<SAMRecord> wrappedIterator;
-
-    private DuplicateSet duplicateSet = null;
-
-    private final SAMRecordDuplicateComparator comparator;
-
-    public DuplicateSetIterator(final CloseableIterator<SAMRecord> iterator, final SAMFileHeader header) {
-        this(iterator, header, false);
-    }
-
-    public DuplicateSetIterator(final CloseableIterator<SAMRecord> iterator,
-                                final SAMFileHeader header,
-                                final boolean preSorted) {
-        this(iterator, header, preSorted, null);
-    }
-
-    public DuplicateSetIterator(final CloseableIterator<SAMRecord> iterator,
-                                final SAMFileHeader header,
-                                final boolean preSorted,
-                                final SAMRecordDuplicateComparator comparator) {
-        this(iterator, header, preSorted, comparator, null);
-    }
-
-    /**
-     * Allows the user of this iterator to skip the sorting of the input if the input is already sorted.  If the records are said to be
-     * sorted but not actually sorted in the correct order, an exception during iteration will be thrown.  Progress information will
-     * be printed for sorting of the input if `log` is provided.
-     */
-    public DuplicateSetIterator(final CloseableIterator<SAMRecord> iterator,
-                                final SAMFileHeader header,
-                                final boolean preSorted,
-                                final SAMRecordDuplicateComparator comparator,
-                                final Log log) {
-        this.comparator = (comparator == null) ? new SAMRecordDuplicateComparator(Collections.singletonList(header)) : comparator;
-
-        if (preSorted) {
-            this.wrappedIterator = iterator;
-        } else {
-            ProgressLogger progressLogger = null;
-            if (log != null) {
-                progressLogger = new ProgressLogger(log, 100000);
-                log.info("Duplicate set iterator initializing.");
-            }
-
-            // Sort it!
-            final int maxRecordsInRam = SAMFileWriterImpl.getDefaultMaxRecordsInRam();
-            final File tmpDir = new File(System.getProperty("java.io.tmpdir"));
-            final SortingCollection<SAMRecord> alignmentSorter = SortingCollection.newInstance(SAMRecord.class,
-                    new BAMRecordCodec(header), this.comparator,
-                    maxRecordsInRam, tmpDir);
-
-            while (iterator.hasNext()) {
-                final SAMRecord record = iterator.next();
-                alignmentSorter.add(record);
-                if (progressLogger != null) progressLogger.record(record);
-            }
-            iterator.close();
-
-            this.wrappedIterator = alignmentSorter.iterator();
-            if (log != null) log.info("Duplicate set iterator initialized.");
-        }
-
-        this.duplicateSet = new DuplicateSet(this.comparator);
-
-        if (hasNext()) {
-            this.duplicateSet.add(this.wrappedIterator.next());
-        }
-
-    }
-
-    @Deprecated
-    /** Do not use this method as the first duplicate set will not be compared with this scoring strategy.
-      * Instead, provide a comparator to the constructor that has the scoring strategy set. */
-    public void setScoringStrategy(final DuplicateScoringStrategy.ScoringStrategy scoringStrategy) {
-        this.comparator.setScoringStrategy(scoringStrategy);
-    }
-
-    public DuplicateSet next() {
-        DuplicateSet duplicateSet = null;
-
-        int cmp = 0;
-
-        while (0 == cmp) {
-            if (!wrappedIterator.hasNext()) { // no more!
-                duplicateSet = this.duplicateSet;
-                this.duplicateSet = new DuplicateSet(this.comparator);
-                break;
-            } else {
-                // get another one
-                final SAMRecord record = this.wrappedIterator.next();
-
-                // assumes that the duplicate set always has at least one record inside!
-                final SAMRecord representative = this.duplicateSet.getRepresentative();
-
-                if (representative.getReadUnmappedFlag() || representative.isSecondaryOrSupplementary()) {
-                    duplicateSet = this.duplicateSet;
-                    this.duplicateSet = new DuplicateSet(this.comparator);
-                    this.duplicateSet.add(record);
-                    break; // exits the 0 == cmp loop
-                } else {
-                    // compare against the representative for set membership, not ordering
-                    cmp = this.duplicateSet.add(record);
-
-                    if (0 < cmp) {
-                        throw new SAMException("The input records were not sorted in duplicate order:\n" +
-                                representative.getSAMString() + record.getSAMString());
-                    } else if (cmp < 0) {
-                        duplicateSet = this.duplicateSet;
-                        this.duplicateSet = new DuplicateSet(this.comparator);
-                        this.duplicateSet.add(record);
-                    } // otherwise it was already added
-                }
-            }
-        }
-
-        return duplicateSet;
-    }
-
-    public void close() { wrappedIterator.close(); }
-
-    public boolean hasNext() {
-        return (!duplicateSet.isEmpty() || wrappedIterator.hasNext());
-    }
-
-    // Does nothing!
-    public void remove() { }
-}
diff --git a/src/main/java/htsjdk/samtools/FileTruncatedException.java b/src/main/java/htsjdk/samtools/FileTruncatedException.java
deleted file mode 100644
index 0adf799..0000000
--- a/src/main/java/htsjdk/samtools/FileTruncatedException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Thrown when it is possible to detect that a SAM or BAM file is truncated.
- *
- * @author alecw at broadinstitute.org
- */
-public class FileTruncatedException extends SAMException {
-    public FileTruncatedException() {
-    }
-
-    public FileTruncatedException(final String s) {
-        super(s);
-    }
-
-    public FileTruncatedException(final String s, final Throwable throwable) {
-        super(s, throwable);
-    }
-
-    public FileTruncatedException(final Throwable throwable) {
-        super(throwable);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/FixBAMFile.java b/src/main/java/htsjdk/samtools/FixBAMFile.java
deleted file mode 100755
index 6bea56e..0000000
--- a/src/main/java/htsjdk/samtools/FixBAMFile.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.CloserUtil;
-
-import java.io.File;
-
-public class FixBAMFile {
-    public static void main(String[] args) {
-        File inputFile = new File(args[0]);
-        File outputFile = new File(args[1]);
-        SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(inputFile);
-        SAMFileHeader header = reader.getFileHeader();
-        SAMFileWriter writer = new SAMFileWriterFactory().makeBAMWriter(header, true, outputFile);
-        for (SAMRecord record : reader) {
-            if (record.getIndexingBin() != null) {
-                record.setIndexingBin(record.computeIndexingBin());
-            }
-            writer.addAlignment(record);
-        }
-        writer.close();
-        CloserUtil.close(reader);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/GenomicIndexUtil.java b/src/main/java/htsjdk/samtools/GenomicIndexUtil.java
deleted file mode 100644
index f634932..0000000
--- a/src/main/java/htsjdk/samtools/GenomicIndexUtil.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.BitSet;
-
-/**
- * Constants and methods used by BAM and Tribble indices
- */
-public class GenomicIndexUtil {
-    /**
-     * Reports the total amount of genomic data that any bin can index.
-     */
-    public static final int BIN_GENOMIC_SPAN = 512*1024*1024;
-
-    /**
-     * What is the starting bin for each level?
-     */
-    public static final int[] LEVEL_STARTS = {0,1,9,73,585,4681};
-
-    /**
-     * Reports the maximum number of bins that can appear in a binning index.
-     */
-    public static final int MAX_BINS = 37450;   // =(8^6-1)/7+1
-
-    public static final int MAX_LINEAR_INDEX_SIZE = MAX_BINS+1-LEVEL_STARTS[LEVEL_STARTS.length-1];
-
-
-    /**
-     * E.g. for a SAMRecord with no genomic coordinate.
-     */
-    public static final int UNSET_GENOMIC_LOCATION = 0;
-
-    /**
-     * calculate the bin given an alignment in [beg,end)
-     * Described in "The Human Genome Browser at UCSC. Kent & al. doi: 10.1101/gr.229102 "
-     * @param beg 0-based start of read (inclusive)
-     * @param end 0-based end of read (exclusive)
-     */
-    public static int regionToBin(final int beg, int end)
-    {
-        --end;
-
-        if (beg>>14 == end>>14) return ((1<<15)-1)/7 + (beg>>14);
-        if (beg>>17 == end>>17) return ((1<<12)-1)/7 + (beg>>17);
-        if (beg>>20 == end>>20) return  ((1<<9)-1)/7 + (beg>>20);
-        if (beg>>23 == end>>23) return  ((1<<6)-1)/7 + (beg>>23);
-        if (beg>>26 == end>>26) return  ((1<<3)-1)/7 + (beg>>26);
-        return 0;
-    }
-
-    // TODO: It is disturbing that regionToBins is 0-based, but regionToBins is 1-based.
-    // TODO: It is also suspicious that regionToBins decrements endPos.  Test it!
-    // TODO: However end is decremented in regionToBins so perhaps there is no conflict.
-    /**
-     * Get candidate bins for the specified region
-     * @param startPos 1-based start of target region, inclusive.
-     * @param endPos 1-based end of target region, inclusive.
-     * @return bit set for each bin that may contain SAMRecords in the target region.
-     */
-    public static BitSet regionToBins(final int startPos, final int endPos) {
-        final int maxPos = 0x1FFFFFFF;
-        final int start = (startPos <= 0) ? 0 : (startPos-1) & maxPos;
-        final int end = (endPos <= 0) ? maxPos : (endPos-1) & maxPos;
-        if (start > end) {
-            return null;
-        }
-        int k;
-        final BitSet bitSet = new BitSet(GenomicIndexUtil.MAX_BINS);
-        bitSet.set(0);
-        for (k =    1 + (start>>26); k <=    1 + (end>>26); ++k) bitSet.set(k);
-        for (k =    9 + (start>>23); k <=    9 + (end>>23); ++k) bitSet.set(k);
-        for (k =   73 + (start>>20); k <=   73 + (end>>20); ++k) bitSet.set(k);
-        for (k =  585 + (start>>17); k <=  585 + (end>>17); ++k) bitSet.set(k);
-        for (k = 4681 + (start>>14); k <= 4681 + (end>>14); ++k) bitSet.set(k);
-        return bitSet;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/HighAccuracyDownsamplingIterator.java b/src/main/java/htsjdk/samtools/HighAccuracyDownsamplingIterator.java
deleted file mode 100644
index 2dd3b6c..0000000
--- a/src/main/java/htsjdk/samtools/HighAccuracyDownsamplingIterator.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Tim Fennell
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Random;
-import java.util.Set;
-
-/**
- * A DownsamplingIterator that attempts to provide very high accuracy (minimizing the difference between emitted proportion
- * and requested proportion) at the expense of using memory proportional to the number of reads in the incoming stream.
- *
- * @author Tim Fennell
- */
-class HighAccuracyDownsamplingIterator extends DownsamplingIterator {
-    private final Iterator<SAMRecord> underlyingIterator;
-    private final Random random;
-    private SAMRecord nextRecord;
-    private final Map<String, Boolean> decisions = new HashMap<String, Boolean>();
-
-    private double targetAccuracy = 0.0001;
-    private long totalTemplates, keptTemplates;
-    private Iterator<SAMRecord> bufferedRecords = new ArrayList<SAMRecord>().iterator();
-    private Set<String> bufferedRecordsToKeep;
-
-    /** Override method to make it clear that this iterator attempts to provide a higher accuracy of downsampling. */
-    @Override public boolean isHigherAccuracy() {
-        return true;
-    }
-
-    /** Constructs a downsampling iterator upon the supplied iterator, using the Random as the source of randomness. */
-    HighAccuracyDownsamplingIterator(final Iterator<SAMRecord> iterator, final double proportion, final int seed) {
-        super(proportion);
-        this.underlyingIterator = iterator;
-        this.random = new Random(seed);
-    }
-
-    /**
-     * Sets the target accuracy of the downsampling iterator.  The value should be thought of as
-     * probability +/- accuracy.  So a value of 0.001 would instruct the downsampling iterator to
-     * attempt to guarantee at accuracy to within 0.1%.  The downsampler will need to buffer reads
-     * for 1/accuracy templates, so setting this to extremely small numbers is not advisable.
-     */
-    public DownsamplingIterator setTargetAccuracy(final double accuracy) {
-        if (accuracy >= 1 || accuracy <= 1d/Integer.MAX_VALUE) throw new IllegalArgumentException("Illegal value. Must be 1/MAX_INT < accuracy < 1");
-        this.targetAccuracy = accuracy;
-        return this;
-    }
-
-    /** Returns true if there is another record available post-downsampling, false otherwise. */
-    @Override public boolean hasNext() {
-        return this.nextRecord != null || advance();
-    }
-
-    /** Returns the next record from the iterator, or throws an exception if there is no next record. */
-    @Override public SAMRecord next() {
-        if (this.nextRecord == null) {
-            throw new NoSuchElementException("Call to next() when hasNext() == false");
-        }
-        else {
-            final SAMRecord retval = this.nextRecord;
-            advance();
-            return retval;
-        }
-    }
-
-    /** Returns the underlying iterator so that subclasses may manipulate it. */
-    protected Iterator<SAMRecord> getUnderlyingIterator() {
-        return this.underlyingIterator;
-    }
-
-    /**
-     * Clears the current record and attempts to advance through the underlying iterator until a
-     * record is kept during downsampling.  If no more records are kept and the end of the input
-     * is reached this.nextRecord will be null.
-     *
-     * @return true if a record is available after advancing, false otherwise
-     */
-    protected boolean advance() {
-        this.nextRecord = null;
-
-        while (this.nextRecord == null && (this.bufferedRecords.hasNext() || bufferNextChunkOfRecords(getTargetProportion(), this.targetAccuracy))) {
-            final SAMRecord rec = this.bufferedRecords.next();
-            final String key = rec.getReadName();
-            final Boolean previous = decisions.get(key);
-            final boolean keepThisRecord;
-
-            if (previous == null) {
-                keepThisRecord = this.bufferedRecordsToKeep.contains(rec.getReadName());
-                decisions.put(key, keepThisRecord);
-            }
-            else {
-                keepThisRecord = previous;
-            }
-
-            if (keepThisRecord) {
-                this.nextRecord = rec;
-                recordAcceptedRecord();
-            }
-            else {
-                recordDiscardedRecord();
-            }
-        }
-
-        return this.nextRecord != null;
-    }
-
-    /**
-     * Buffers reads until either the end of the file is reached or enough reads have been buffered such
-     * that downsampling can be performed to the desired target accuracy.  Once reads have been buffered,
-     * template names are randomly sampled out for discarding until the desired number of reads have
-     * been discarded.
-     *
-     * @return True if one or more reads have been buffered, false otherwise
-     */
-    protected boolean bufferNextChunkOfRecords(final double proportion, final double accuracy) {
-        final int templatesToRead = (int) Math.ceil(1 / accuracy);
-        final Set<String> names = new HashSet<String>();
-        final List<SAMRecord> recs = new ArrayList<SAMRecord>(templatesToRead);
-
-        readFromUnderlyingIterator(recs, names, templatesToRead);
-
-        // Determine how many templates to keep/discard
-        final int templatesRead = names.size();
-        final int templatesToKeep = calculateTemplatesToKeep(templatesRead, proportion);
-
-        // Randomly shuffle a list of all the template names, and then remove some from the set
-        final int templatesToDiscard = templatesRead - templatesToKeep;
-        final List<String> tmp    = new ArrayList<String>(names);
-        Collections.shuffle(tmp, this.random);
-        for (int i = 0; i < templatesToDiscard; ++i) names.remove(tmp.get(i));
-
-        // Set all the instance state so that advance()/next() get what they need
-        this.bufferedRecordsToKeep = names;
-        this.bufferedRecords = recs.iterator();
-        this.totalTemplates += templatesRead;
-        this.keptTemplates  += names.size();
-        return !recs.isEmpty();
-    }
-
-    /**
-     * Calculates the number of templates to keep in a specific batch of reads having just read templatesRead reads
-     * and wanting to keep proportion of them.  Rounds the final number up or down based on whether, to this point,
-     * the iterator is under or over it's goal proportion.
-     *
-     * Implemented as second method to allow ChainedDownsamplingIterator to tamper with the strategy!
-     */
-    protected int calculateTemplatesToKeep(final int templatesRead, final double proportion) {
-        final double rawTemplatesToKeep = templatesRead * proportion;
-        return (keptTemplates / (double) totalTemplates < proportion)
-                ? (int) Math.ceil(rawTemplatesToKeep) : (int) Math.floor(rawTemplatesToKeep);
-    }
-
-    /**
-     * Reads from the underlying iterator until it has observed templatesToRead templates (i.e. read names) that it has not yet
-     * observed, so that templatesToRead new keep/reject decisions can be made.  The records that are read are placed into recs
-     * and _novel_ template names are placed into names.
-     */
-    protected void readFromUnderlyingIterator(final List<SAMRecord> recs, final Set<String> names, final int templatesToRead) {
-        while (this.underlyingIterator.hasNext() && names.size() < templatesToRead) {
-            final SAMRecord rec = this.underlyingIterator.next();
-            recs.add(rec);
-
-            if (this.decisions.containsKey(rec.getReadName())) continue;
-            names.add(rec.getReadName());
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/LinearIndex.java b/src/main/java/htsjdk/samtools/LinearIndex.java
deleted file mode 100644
index bccdfe8..0000000
--- a/src/main/java/htsjdk/samtools/LinearIndex.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.Arrays;
-
-/**
- * The linear index associated with a given reference in a BAM index.
- *
- * @author mhanna
- * @version 0.1
- */
-public class LinearIndex {
-
-    public static final int MAX_LINEAR_INDEX_SIZE = GenomicIndexUtil.MAX_LINEAR_INDEX_SIZE;
-
-    public static final int BAM_LIDX_SHIFT = 14;
-
-    /**
-     * The reference sequence number for this linear index.
-     */
-    private final int mReferenceSequence;
-
-    /**
-     * Dictates the first stored element of the index.
-     */
-    private final int mIndexStart;
-
-    /**
-     * The linear index entries within this bin.
-     */
-    private final long[] mIndexEntries;
-
-    public LinearIndex(final int referenceSequence, final int indexStart, final long[] indexEntries) {
-        this.mReferenceSequence = referenceSequence;
-        this.mIndexStart = indexStart;
-        this.mIndexEntries = indexEntries;
-    }
-
-    public int getReferenceSequence() {
-        return mReferenceSequence;
-    }
-
-    public int size() {
-        return mIndexEntries.length;
-    }
-
-    public long get(final int index) {
-        return mIndexEntries[index-mIndexStart];
-    }
-
-    public static int convertToLinearIndexOffset(final int contigPos) {
-        final int indexPos = (contigPos <= 0) ? 0 : contigPos-1;
-        return indexPos >> BAM_LIDX_SHIFT;
-    }
-
-    /**
-     * Gets the minimum offset of any alignment start appearing in this index, according to the linear index. 
-     * @param startPos Starting position for this query.
-     * @return The minimum offset, in chunk format, of any read appearing in this position.
-     */
-    public long getMinimumOffset(final int startPos) {
-        final int start = (startPos <= 0) ? 0 : startPos-1;
-        final int regionLinearBin = start >> BAM_LIDX_SHIFT;
-        // System.out.println("# regionLinearBin: " + regionLinearBin);
-        long minimumOffset = 0;
-        if (regionLinearBin-mIndexStart < mIndexEntries.length)
-            minimumOffset = mIndexEntries[regionLinearBin-mIndexStart];
-        return minimumOffset;
-    }
-
-    /**
-     * Direct access to the array.  Be careful!
-     * @return The elements of the linear index.
-     */
-    public long[] getIndexEntries() {
-        return mIndexEntries;
-    }
-
-    public int getIndexStart() {
-        return mIndexStart;
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final LinearIndex that = (LinearIndex) o;
-
-        if (mIndexStart != that.mIndexStart) return false;
-        if (mReferenceSequence != that.mReferenceSequence) return false;
-        if (!Arrays.equals(mIndexEntries, that.mIndexEntries)) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = mReferenceSequence;
-        result = 31 * result + mIndexStart;
-        result = 31 * result + Arrays.hashCode(mIndexEntries);
-        return result;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/MergingSamRecordIterator.java b/src/main/java/htsjdk/samtools/MergingSamRecordIterator.java
deleted file mode 100644
index a294752..0000000
--- a/src/main/java/htsjdk/samtools/MergingSamRecordIterator.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Map;
-import java.util.PriorityQueue;
-
-/**
- * Provides an iterator interface for merging multiple underlying iterators into a single
- * iterable stream. The underlying iterators/files must all have the same sort order unless
- * the requested output format is unsorted, in which case any combination is valid.
- */
-public class MergingSamRecordIterator implements CloseableIterator<SAMRecord> {
-    private final PriorityQueue<ComparableSamRecordIterator> pq;
-    private final SamFileHeaderMerger samHeaderMerger;
-    private final Collection<SamReader> readers;
-    private final SAMFileHeader.SortOrder sortOrder;
-    private final SAMRecordComparator comparator;
-
-    private boolean initialized = false;
-
-    /**
-     * Constructs a new merging iterator with the same set of readers and sort order as
-     * provided by the header merger parameter.
-     *
-     * @param headerMerger   The merged header and contents of readers.
-     * @param forcePresorted True to ensure that the iterator checks the headers of the readers for appropriate sort order.
-     * @deprecated replaced by {@link #MergingSamRecordIterator(SamFileHeaderMerger, Collection, boolean)}
-     */
-    @Deprecated
-    public MergingSamRecordIterator(final SamFileHeaderMerger headerMerger, final boolean forcePresorted) {
-        this(headerMerger, headerMerger.getReaders(), forcePresorted);
-    }
-
-    /**
-     * Constructs a new merging iterator with the same set of readers and sort order as
-     * provided by the header merger parameter.
-     *
-     * @param headerMerger The merged header and contents of readers.
-     * @param assumeSorted false ensures that the iterator checks the headers of the readers for appropriate sort order.
-     */
-    public MergingSamRecordIterator(final SamFileHeaderMerger headerMerger, Collection<SamReader> readers, final boolean assumeSorted) {
-        this.samHeaderMerger = headerMerger;
-        this.sortOrder = headerMerger.getMergedHeader().getSortOrder();
-        this.comparator = getComparator();
-        this.readers = readers;
-
-        this.pq = new PriorityQueue<ComparableSamRecordIterator>(readers.size());
-
-        for (final SamReader reader : readers) {
-            if (!samHeaderMerger.getHeaders().contains(reader.getFileHeader()))
-                throw new SAMException("All iterators to be merged must be accounted for in the SAM header merger");
-            if (!assumeSorted && this.sortOrder != SAMFileHeader.SortOrder.unsorted &&
-                    reader.getFileHeader().getSortOrder() != this.sortOrder) {
-                throw new SAMException("Files are not compatible with sort order");
-            }
-        }
-    }
-
-    /**
-     * Add a set of SAM file iterators to the merging iterator.  Use this to restrict the merged iteration to a given genomic interval,
-     * rather than iterating over every read in the backing file or stream.
-     *
-     * @param headerMerger The merged header and contents of readers.
-     * @param iterators    Iterator traversing over reader contents.
-     */
-    public MergingSamRecordIterator(final SamFileHeaderMerger headerMerger, final Map<SamReader, CloseableIterator<SAMRecord>> iterators, final boolean assumeSorted) {
-        this(headerMerger, iterators.keySet(), assumeSorted);
-        for (final Map.Entry<SamReader, CloseableIterator<SAMRecord>> mapping : iterators.entrySet())
-            addIfNotEmpty(new ComparableSamRecordIterator(mapping.getKey(), mapping.getValue(), comparator));
-        initialized = true;
-    }
-
-    private void startIterationIfRequired() {
-        if (initialized)
-            return;
-        for (final SamReader reader : readers)
-            addIfNotEmpty(new ComparableSamRecordIterator(reader, reader.iterator(), comparator));
-        initialized = true;
-    }
-
-    /**
-     * Close down all open iterators.
-     */
-    public void close() {
-        // Iterators not in the priority queue have already been closed; only close down the iterators that are still in the priority queue.
-        for (CloseableIterator<SAMRecord> iterator : pq)
-            iterator.close();
-    }
-
-    /** Returns true if any of the underlying iterators has more records, otherwise false. */
-    public boolean hasNext() {
-        startIterationIfRequired();
-        return !this.pq.isEmpty();
-    }
-
-    /** Returns the next record from the top most iterator during merging. */
-    public SAMRecord next() {
-        startIterationIfRequired();
-
-        final ComparableSamRecordIterator iterator = this.pq.poll();
-        final SAMRecord record = iterator.next();
-        addIfNotEmpty(iterator);
-        // this will resolve the reference indices against the new, merged header
-        record.setHeader(this.samHeaderMerger.getMergedHeader());
-
-        // Fix the read group if needs be
-        if (this.samHeaderMerger.hasReadGroupCollisions()) {
-            final String oldGroupId = (String) record.getAttribute(ReservedTagConstants.READ_GROUP_ID);
-            if (oldGroupId != null) {
-                final String newGroupId = this.samHeaderMerger.getReadGroupId(iterator.getReader().getFileHeader(), oldGroupId);
-                record.setAttribute(ReservedTagConstants.READ_GROUP_ID, newGroupId);
-            }
-        }
-
-        // Fix the program group if needs be
-        if (this.samHeaderMerger.hasProgramGroupCollisions()) {
-            final String oldGroupId = (String) record.getAttribute(ReservedTagConstants.PROGRAM_GROUP_ID);
-            if (oldGroupId != null) {
-                final String newGroupId = this.samHeaderMerger.getProgramGroupId(iterator.getReader().getFileHeader(), oldGroupId);
-                record.setAttribute(ReservedTagConstants.PROGRAM_GROUP_ID, newGroupId);
-            }
-        }
-
-        return record;
-    }
-
-    /**
-     * Adds iterator to priority queue. If the iterator has more records it is added
-     * otherwise it is closed and not added.
-     */
-    private void addIfNotEmpty(final ComparableSamRecordIterator iterator) {
-        if (iterator.hasNext()) {
-            pq.offer(iterator);
-        } else {
-            iterator.close();
-        }
-    }
-
-    /** Unsupported operation. */
-    public void remove() {
-        throw new UnsupportedOperationException("MergingSAMRecorderIterator.remove()");
-    }
-
-    /**
-     * Get the right comparator for a given sort order (coordinate, alphabetic). In the
-     * case of "unsorted" it will return a comparator that gives an arbitrary but reflexive
-     * ordering.
-     */
-    private SAMRecordComparator getComparator() {
-        // For unsorted build a fake comparator that compares based on object ID
-        if (this.sortOrder == SAMFileHeader.SortOrder.unsorted) {
-            return new SAMRecordComparator() {
-                public int fileOrderCompare(final SAMRecord lhs, final SAMRecord rhs) {
-                    return System.identityHashCode(lhs) - System.identityHashCode(rhs);
-                }
-
-                public int compare(final SAMRecord lhs, final SAMRecord rhs) {
-                    return fileOrderCompare(lhs, rhs);
-                }
-            };
-        }
-        if (samHeaderMerger.hasMergedSequenceDictionary() && sortOrder.equals(SAMFileHeader.SortOrder.coordinate)) {
-            return new MergedSequenceDictionaryCoordinateOrderComparator();
-        }
-
-        // Otherwise try and figure out what kind of comparator to return and build it
-        return this.sortOrder.getComparatorInstance();
-    }
-
-    /** Returns the merged header that the merging iterator is working from. */
-    public SAMFileHeader getMergedHeader() {
-        return this.samHeaderMerger.getMergedHeader();
-    }
-
-    /**
-     * Ugh.  Basically does a regular coordinate compare, but looks up the sequence indices in the merged
-     * sequence dictionary.  I hate the fact that this extends SAMRecordCoordinateComparator, but it avoids
-     * more copy & paste.
-     */
-    private class MergedSequenceDictionaryCoordinateOrderComparator extends SAMRecordCoordinateComparator implements Serializable {
-        private static final long serialVersionUID = 1L;
-
-        public int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
-            final int referenceIndex1 = getReferenceIndex(samRecord1);
-            final int referenceIndex2 = getReferenceIndex(samRecord2);
-            if (referenceIndex1 != referenceIndex2) {
-                if (referenceIndex1 == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                    return 1;
-                } else if (referenceIndex2 == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                    return -1;
-                } else {
-                    return referenceIndex1 - referenceIndex2;
-                }
-            }
-            if (referenceIndex1 == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                // Both are unmapped.
-                return 0;
-            }
-            return samRecord1.getAlignmentStart() - samRecord2.getAlignmentStart();
-        }
-
-        private int getReferenceIndex(final SAMRecord samRecord) {
-            if (samRecord.getReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                return samHeaderMerger.getMergedSequenceIndex(samRecord.getHeader(), samRecord.getReferenceIndex());
-            }
-            if (samRecord.getMateReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                return samHeaderMerger.getMergedSequenceIndex(samRecord.getHeader(), samRecord.getMateReferenceIndex());
-            }
-            return SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/NotPrimarySkippingIterator.java b/src/main/java/htsjdk/samtools/NotPrimarySkippingIterator.java
deleted file mode 100644
index 787da16..0000000
--- a/src/main/java/htsjdk/samtools/NotPrimarySkippingIterator.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.PeekIterator;
-
-/**
- * Wrapper around SAMRecord iterator that skips over non-primary elements.
- * This iterator conflates a filtering iterator and a peekable iterator.  It would be cleaner to
- * handle those concerns separately.
- */
-public class NotPrimarySkippingIterator {
-    private final PeekIterator<SAMRecord> it;
-
-    public NotPrimarySkippingIterator(final CloseableIterator<SAMRecord> underlyingIt) {
-        it = new PeekIterator<SAMRecord>(underlyingIt);
-        skipAnyNotprimary();
-    }
-
-    public boolean hasCurrent() {
-        return it.hasNext();
-    }
-
-    public SAMRecord getCurrent() {
-        assert(hasCurrent());
-        return it.peek();
-    }
-
-    public boolean advance() {
-        it.next();
-        skipAnyNotprimary();
-        return hasCurrent();
-    }
-
-    private void skipAnyNotprimary() {
-        while (it.hasNext() && it.peek().getNotPrimaryAlignmentFlag()) {
-            it.next();
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/QueryInterval.java b/src/main/java/htsjdk/samtools/QueryInterval.java
deleted file mode 100644
index bdfb52c..0000000
--- a/src/main/java/htsjdk/samtools/QueryInterval.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CoordMath;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Interval relative to a reference, for querying a BAM file.
- */
-public class QueryInterval implements Comparable<QueryInterval> {
-
-    /** Index of reference sequence, based on the sequence dictionary of the BAM file being queried. */
-    public final int referenceIndex;
-    /** 1-based, inclusive */
-    public final int start;
-    /** 1-based, inclusive.  If <= 0, implies that the interval goes to the end of the reference sequence */
-    public final int end;
-
-
-    public QueryInterval(final int referenceIndex, final int start, final int end) {
-        if (referenceIndex < 0) {
-            throw new IllegalArgumentException("Invalid reference index " + referenceIndex);
-        }
-        this.referenceIndex = referenceIndex;
-        this.start = start;
-        this.end = end;
-    }
-
-
-    public int compareTo(final QueryInterval other) {
-        int comp = this.referenceIndex - other.referenceIndex;
-        if (comp != 0) return comp;
-        comp = this.start - other.start;
-        if (comp != 0) return comp;
-        else if (this.end == other.end) return 0;
-        else if (this.end == 0) return 1;
-        else if (other.end == 0) return -1;
-        else return this.end - other.end;
-    }
-
-    /**
-     * @return true if both are on same reference, and other starts exactly where this ends.
-     */
-    public boolean abuts(final QueryInterval other) {
-        return this.referenceIndex == other.referenceIndex && this.end == other.start;
-    }
-
-    /**
-     * @return true if both are on same reference, and the overlap.
-     */
-    public boolean overlaps(final QueryInterval other) {
-        if (this.referenceIndex != other.referenceIndex) {
-            return false;
-        }
-        final int thisEnd = (this.end == 0 ? Integer.MAX_VALUE : this.end);
-        final int otherEnd = (other.end == 0 ? Integer.MAX_VALUE : other.end);
-        return CoordMath.overlaps(this.start, thisEnd, other.start, otherEnd);
-    }
-
-    @Override
-    public String toString() {
-        return String.format("%d:%d-%d", referenceIndex, start, end);
-    }
-
-    private static final QueryInterval[] EMPTY_QUERY_INTERVAL_ARRAY = new QueryInterval[0];
-
-    /**
-     * @param inputIntervals WARNING: This list is modified (sorted) by this method.
-     * @return Ordered list of intervals in which abutting and overlapping intervals are merged.
-     */
-    public static QueryInterval[] optimizeIntervals(final QueryInterval[] inputIntervals) {
-        if (inputIntervals.length == 0) return EMPTY_QUERY_INTERVAL_ARRAY;
-        Arrays.sort(inputIntervals);
-
-        final List<QueryInterval> unique = new ArrayList<QueryInterval>();
-        QueryInterval previous = inputIntervals[0];
-
-
-        for (int i = 1; i < inputIntervals.length; ++i) {
-            final QueryInterval next = inputIntervals[i];
-            if (previous.abuts(next) || previous.overlaps(next)) {
-                final int newEnd = ((previous.end == 0 || next.end == 0) ? 0 : Math.max(previous.end, next.end));
-                previous = new QueryInterval(previous.referenceIndex, previous.start, newEnd);
-            } else {
-                unique.add(previous);
-                previous = next;
-            }
-        }
-
-        if (previous != null) unique.add(previous);
-
-        return unique.toArray(EMPTY_QUERY_INTERVAL_ARRAY);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/ReservedTagConstants.java b/src/main/java/htsjdk/samtools/ReservedTagConstants.java
deleted file mode 100644
index c0d03b8..0000000
--- a/src/main/java/htsjdk/samtools/ReservedTagConstants.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Constants for tags used in our SAM/BAM files
- */
-public class ReservedTagConstants {
-    public static final String READ_GROUP_ID = SAMTag.RG.name(); // Specified in the SAM spec doc
-    public static final String PROGRAM_GROUP_ID =  SAMTag.PG.name(); // Specified in the SAM spec doc
-
-    /** Present and set to 1 if a read is a noise read. */
-    public static final String XN = "XN";
-
-    /** Number of nucleotide differences (Specified in the SAM spec doc) */
-    public static final String NM = SAMTag.NM.name();
-
-    /** The sum of the mismatched qualities. */
-    public static final String XQ = "XQ";
-
-    /**
-     * The name of an attribute which stores the 1-based index of the start of
-     * sequence within a read (in original orientation) that should be clipped
-     * or trimmed before alignment and downstream use.
-     * The region to be clipped extends from this position to the end of the read.
-     */
-    public static final String XT = "XT";
-
-    /** The original sequence before 454 cafie and homopolymer correction */
-    public static final String XS = "XS";
-
-    /** The Four54 edit string of 454 cafie and homopolymer corrections
-     * <pre>
-     *   editString ::= {base operator position [- position]}* ;  // Cafie needs 2 positions
-     *   base ::= A | T | G | C | N ;   // N only for undercall
-     *   operator ::= o | u | c ;       // o = Overcall, u = Undercall, c = Cafie.
-     *   position is 0 based position of the correction (assuming forward strand) .  Cafie positions are to-from.
-     *   For example: XF :Z:Gc4-6Nu11Co15 means a cafie correction moved a G from position 6 to 4,
-     *   an N was inserted for an undercall at position 11, and a C was removed as an overcall at position 15
-     */
-    public static final String XF = "XF";
-
-    /** The original pred quality scores before modifications such as 454 cafie and homopolymer correction */
-    public static final String OQ = SAMTag.OQ.name();
-
-    /** The original cigar before indel cleaning, or 454 cafie and homopolymer correction */
-    public static final String OC = "OC";
-
-}
diff --git a/src/main/java/htsjdk/samtools/SAMBinaryTagAndUnsignedArrayValue.java b/src/main/java/htsjdk/samtools/SAMBinaryTagAndUnsignedArrayValue.java
deleted file mode 100644
index 507e319..0000000
--- a/src/main/java/htsjdk/samtools/SAMBinaryTagAndUnsignedArrayValue.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Simple extension to SAMBinaryTagAndValue in order to distinguish unsigned array values, because
- * signedness cannot be determined by introspection of value. Must be array of byte, short, or int.
- *
- * @author alecw at broadinstitute.org
- */
-public class SAMBinaryTagAndUnsignedArrayValue extends SAMBinaryTagAndValue {
-    public SAMBinaryTagAndUnsignedArrayValue(final short tag, final Object value) {
-        super(tag, value);
-        if (!value.getClass().isArray() || value instanceof float[]) {
-            throw new IllegalArgumentException("Attribute type " + value.getClass() +
-                    " cannot be encoded as an unsigned array. Tag: " +
-                    SAMTagUtil.getSingleton().makeStringTag(tag));
-        }
-    }
-
-    /** Creates and returns a shallow copy of the list of tag/values. */
-    @Override
-    public SAMBinaryTagAndValue copy() {
-        final SAMBinaryTagAndValue retval = new SAMBinaryTagAndUnsignedArrayValue(this.tag, this.value);
-        if (next != null) retval.next = next.copy();
-        return retval;
-    }
-
-    /** Creates and returns a deep copy of the list of tag/values. */
-    @Override
-    public SAMBinaryTagAndValue deepCopy() {
-        final SAMBinaryTagAndValue retval = new SAMBinaryTagAndUnsignedArrayValue(this.tag, cloneValue());
-        if (next != null) {
-            retval.next = next.deepCopy();
-        }
-        return retval;
-    }
-
-
-    @Override
-    public boolean isUnsignedArray() {
-        return true;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMBinaryTagAndValue.java b/src/main/java/htsjdk/samtools/SAMBinaryTagAndValue.java
deleted file mode 100644
index 0778190..0000000
--- a/src/main/java/htsjdk/samtools/SAMBinaryTagAndValue.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-import java.util.Arrays;
-
-/**
- * Holds a SAMRecord attribute and the tagname (in binary form) for that attribute.
- * SAMRecord stores tag name and value in this form, because much String creation is avoided this way.
- * See SAMTagUtil to convert the tag to String form.
- *
- * Values associated with attribute tags must be of a type that implements {@link Serializable} or else
- * serialization will fail. Accepted types are String, scalar types Short, Integer, Character, Float,
- * and Long (see below); array types byte[], short[], int[] and float[]. Cannot be null.
- *
- * Long valued attributes are constrained to the range [Integer.MIN_VALUE, BinaryCodec.MAX_UINT],
- * which includes the entire range of signed ints [Integer.MIN_VALUE, Integer.MAX_VALUE] and
- * the entire range of unsigned ints that can be stored per the BAM spec [0, (Integer.MAX_VALUE * 2) + 1].
- *
- * @author alecw at broadinstitute.org
- */
-public class SAMBinaryTagAndValue implements Serializable {
-    public static final long serialVersionUID = 1L;
-
-    public final short tag;
-    public final Object value;
-    protected SAMBinaryTagAndValue next = null;
-
-    /**
-     * @param tag tagname (in binary form) for this attribute
-     * @param value value for this attribute (must be of a type that implements {@link Serializable}
-     *              or else serialization will fail). Cannot be null.
-     */
-    public SAMBinaryTagAndValue(final short tag, final Object value) {
-        if (null == value) {
-            throw new IllegalArgumentException("SAMBinaryTagAndValue value may not be null");
-        }
-        if (!isAllowedAttributeValue(value)) {
-            throw new IllegalArgumentException("Attribute type " + value.getClass() + " not supported. Tag: " +
-                    SAMTagUtil.getSingleton().makeStringTag(tag));
-        }
-        this.tag = tag;
-        this.value = value;
-    }
-
-    // Inspect the proposed value to determine if it is an allowed value type,
-    // and if the value is in range.
-    protected static boolean isAllowedAttributeValue(final Object value) {
-            if (value instanceof Byte ||
-                value instanceof Short ||
-                value instanceof Integer ||
-                value instanceof String ||
-                value instanceof Character ||
-                value instanceof Float ||
-                value instanceof byte[] ||
-                value instanceof short[] ||
-                value instanceof int[] ||
-                value instanceof float[]) {
-            return true;
-        }
-
-        // A special case for Longs: we require Long values to fit into either a uint32_t or an int32_t,
-        // as that is what the BAM spec allows.
-        if (value instanceof Long) {
-            return SAMUtils.isValidUnsignedIntegerAttribute((Long) value)
-                    || ((Long) value >= Integer.MIN_VALUE && (Long) value <= Integer.MAX_VALUE);
-        }
-        return false;
-    }
-
-    @Override public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        return typeSafeEquals((SAMBinaryTagAndValue) o);
-    }
-
-    /** Type safe equals method that recurses down the list looking for equality. */
-    private boolean typeSafeEquals(final SAMBinaryTagAndValue that) {
-        if (this.tag != that.tag) return false;
-        if (this.valueEquals(that)) {
-            if (this.next == null) return that.next == null;
-            else return this.next.equals(that.next);
-        }
-        else {
-            return false;
-        }
-    }
-
-    private boolean valueEquals(SAMBinaryTagAndValue that) {
-        if (this.value instanceof byte[]) {
-            return that.value instanceof byte[] ?
-                Arrays.equals((byte[])this.value, (byte[])that.value) : false;
-        }
-        else if (this.value instanceof short[]) {
-            return that.value instanceof short[] ?
-                    Arrays.equals((short[])this.value, (short[])that.value) : false;
-        }
-        else if (this.value instanceof int[]) {
-            return that.value instanceof int[] ?
-                    Arrays.equals((int[])this.value, (int[])that.value) : false;
-        }
-        else if (this.value instanceof float[]) {
-            return that.value instanceof float[] ?
-                    Arrays.equals((float[])this.value, (float[])that.value) : false;
-        }
-        else {
-            // otherwise, the api limits the remaining possible value types to
-            // immutable (String or boxed primitive) types
-            return this.value.equals(that.value);
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        int valueHash;
-        if (this.value instanceof byte[]) {
-            valueHash = Arrays.hashCode((byte[])this.value);
-        }
-        else if (this.value instanceof short[]) {
-            valueHash = Arrays.hashCode((short[])this.value);
-        }
-        else if (this.value instanceof int[]) {
-            valueHash = Arrays.hashCode((int[])this.value);
-        }
-        else if (this.value instanceof float[]) {
-            valueHash = Arrays.hashCode((float[])this.value);
-        }
-        else {
-            // otherwise, the api limits the remaining possible value types to
-            // immutable (String or boxed primitive) types
-            valueHash = value.hashCode();
-        }
-
-        return 31 * tag + valueHash;
-    }
-
-    /** Creates and returns a shallow copy of the list of tag/values. */
-    public SAMBinaryTagAndValue copy() {
-        final SAMBinaryTagAndValue retval = new SAMBinaryTagAndValue(this.tag, this.value);
-        if (next != null) {
-            retval.next = next.copy();
-        }
-        return retval;
-    }
-
-    /** Creates and returns a deep copy of the list of tag/values. */
-    public SAMBinaryTagAndValue deepCopy() {
-        final SAMBinaryTagAndValue retval = new SAMBinaryTagAndValue(this.tag, cloneValue());
-        if (next != null) {
-            retval.next = next.deepCopy();
-        }
-        return retval;
-    }
-
-    /* Create and return a clone of value object */
-    protected Object cloneValue() {
-        Object valueClone;
-
-        if (value instanceof byte[]) {
-            valueClone = ((byte[]) value).clone();
-        }
-        else if (value instanceof short[]) {
-            valueClone = ((short[]) value).clone();
-        }
-        else if (value instanceof int[]) {
-            valueClone = ((int[]) value).clone();
-        }
-        else if (value instanceof float[]) {
-            valueClone = ((float[]) value).clone();
-        }
-        else {
-            // otherwise, the api limits the remaining possible value types to
-            // immutable (String or boxed primitive) types
-            valueClone = value;
-        }
-        return valueClone;
-    }
-
-    // The methods below are for implementing a light-weight, single-direction linked list
-
-    public SAMBinaryTagAndValue getNext() { return this.next; }
-
-    /** Inserts at item into the ordered list of attributes and returns the head of the list/sub-list */
-    public SAMBinaryTagAndValue insert(final SAMBinaryTagAndValue attr) {
-        if (attr == null) return this;
-        if (attr.next != null) throw new IllegalStateException("Can only insert single tag/value combinations.");
-
-        if (attr.tag < this.tag) {
-            // attr joins the list ahead of this element
-            attr.next = this;
-            return attr;
-        }
-        else if (this.tag == attr.tag) {
-            // attr replaces this in the list
-            attr.next = this.next;
-            return attr;
-        }
-        else if (this.next == null) {
-            // attr gets stuck on the end
-            this.next = attr;
-            return this;
-        }
-        else {
-            // attr gets inserted somewhere in the tail
-            this.next = this.next.insert(attr);
-            return this;
-        }
-    }
-
-    /** Removes a tag from the list and returns the new head of the list/sub-list. */
-    public SAMBinaryTagAndValue remove(final short tag) {
-        if (this.tag == tag) return this.next;
-        else {
-            if (this.next != null) this.next = this.next.remove(tag);
-            return this;
-        }
-    }
-
-    /** Returns the SAMBinaryTagAndValue that contains the required tag, or null if not contained. */
-    public SAMBinaryTagAndValue find(final short tag) {
-        if (this.tag == tag) return this;
-        else if (this.tag > tag || this.next == null) return null;
-        else return this.next.find(tag); 
-    }
-
-    public boolean isUnsignedArray() {
-        return false;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMException.java b/src/main/java/htsjdk/samtools/SAMException.java
deleted file mode 100644
index add0745..0000000
--- a/src/main/java/htsjdk/samtools/SAMException.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class SAMException extends RuntimeException {
-    public SAMException() {
-    }
-
-    public SAMException(final String s) {
-        super(s);
-    }
-
-    public SAMException(final String s, final Throwable throwable) {
-        super(s, throwable);
-    }
-
-    public SAMException(final Throwable throwable) {
-        super(throwable);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileHeader.java b/src/main/java/htsjdk/samtools/SAMFileHeader.java
deleted file mode 100644
index 47543c2..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileHeader.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.StringLineReader;
-
-import java.io.StringWriter;
-import java.lang.reflect.Constructor;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Header information from a SAM or BAM file.
- */
-public class SAMFileHeader extends AbstractSAMHeaderRecord
-{
-    public static final String VERSION_TAG = "VN";
-    public static final String SORT_ORDER_TAG = "SO";
-    public static final String GROUP_ORDER_TAG = "GO";
-    public static final String CURRENT_VERSION = "1.5";
-    public static final Set<String> ACCEPTABLE_VERSIONS =
-            new HashSet<String>(Arrays.asList("1.0", "1.3", "1.4", "1.5"));
-
-    /**
-     * These tags are of known type, so don't need a type field in the text representation.
-     */
-    public static final Set<String> STANDARD_TAGS =
-            new HashSet<String>(Arrays.asList(VERSION_TAG, SORT_ORDER_TAG, GROUP_ORDER_TAG));
-
-    Set<String> getStandardTags() {
-        return STANDARD_TAGS;
-    }
-
-    /**
-     * Ways in which a SAM or BAM may be sorted.
-     */
-    public enum SortOrder {
-
-        unsorted(null),
-        queryname(SAMRecordQueryNameComparator.class),
-        coordinate(SAMRecordCoordinateComparator.class),
-        duplicate(SAMRecordDuplicateComparator.class); // NB: this is not in the SAM spec!
-
-        private final Class<? extends SAMRecordComparator> comparator;
-
-        SortOrder(final Class<? extends SAMRecordComparator> comparatorClass) {
-            this.comparator = comparatorClass;
-        }
-
-        /**
-         * @return Comparator class to sort in the specified order, or null if unsorted.
-         */
-        public Class<? extends SAMRecordComparator> getComparator() {
-            return comparator;
-        }
-
-        /**
-         * @return Comparator to sort in the specified order, or null if unsorted.
-         */
-        public SAMRecordComparator getComparatorInstance() {
-            if (comparator != null) {
-                try {
-                    final Constructor<? extends SAMRecordComparator> ctor = comparator.getConstructor();
-                    return ctor.newInstance();
-                }
-                catch (Exception e) {
-                    throw new IllegalStateException("Could not instantiate a comparator for sort order: " +
-                            this.name(), e);
-                }
-            }
-            return null;
-        }
-    }
-
-    public enum GroupOrder {
-        none, query, reference
-    }
-
-    private List<SAMReadGroupRecord> mReadGroups =
-        new ArrayList<SAMReadGroupRecord>();
-    private List<SAMProgramRecord> mProgramRecords = new ArrayList<SAMProgramRecord>();
-    private final Map<String, SAMReadGroupRecord> mReadGroupMap =
-        new HashMap<String, SAMReadGroupRecord>();
-    private final Map<String, SAMProgramRecord> mProgramRecordMap = new HashMap<String, SAMProgramRecord>();
-    private SAMSequenceDictionary mSequenceDictionary = new SAMSequenceDictionary();
-    final private List<String> mComments = new ArrayList<String>();
-    private String textHeader;
-    private final List<SAMValidationError> mValidationErrors = new ArrayList<SAMValidationError>();
-
-    public SAMFileHeader() {
-        setAttribute(VERSION_TAG, CURRENT_VERSION);
-    }
-
-    /** Constructor that initializes the sequence dictionary with the provided one. */
-    public SAMFileHeader(final SAMSequenceDictionary dict) {
-        this();
-        setSequenceDictionary(dict);
-    }
-
-    public String getVersion() {
-        return (String) getAttribute("VN");
-    }
-
-    public String getCreator() {
-        return (String) getAttribute("CR");
-    }
-
-    public SAMSequenceDictionary getSequenceDictionary() {
-        return mSequenceDictionary;
-    }
-
-    public List<SAMReadGroupRecord> getReadGroups() {
-        return Collections.unmodifiableList(mReadGroups);
-    }
-
-    /**
-     * Look up sequence record by name.
-     */
-    public SAMSequenceRecord getSequence(final String name) {
-        return mSequenceDictionary.getSequence(name);
-    }
-
-    /**
-     * Look up read group record by name.
-     */
-    public SAMReadGroupRecord getReadGroup(final String name) {
-        return mReadGroupMap.get(name);
-    }
-
-    /**
-     * Replace entire sequence dictionary.  The given sequence dictionary is stored, not copied.
-     */
-    public void setSequenceDictionary(final SAMSequenceDictionary sequenceDictionary) {
-        mSequenceDictionary = sequenceDictionary;
-    }
-
-    public void addSequence(final SAMSequenceRecord sequenceRecord) {
-        mSequenceDictionary.addSequence(sequenceRecord);
-    }
-
-    /**
-     * Look up a sequence record by index.  First sequence in the header is the 0th.
-     * @return The corresponding sequence record, or null if the index is out of range.
-     */
-    public SAMSequenceRecord getSequence(final int sequenceIndex) {
-        return mSequenceDictionary.getSequence(sequenceIndex);
-    }
-
-    /**
-     *
-     * @return Sequence index for the given sequence name, or -1 if the name is not found.
-     */
-    public int getSequenceIndex(final String sequenceName) {
-        return mSequenceDictionary.getSequenceIndex(sequenceName);
-    }
-
-    /**
-     * Replace entire list of read groups.  The given list is stored, not copied.
-     */
-    public void setReadGroups(final List<SAMReadGroupRecord> readGroups) {
-        mReadGroups = readGroups;
-        mReadGroupMap.clear();
-        for (final SAMReadGroupRecord readGroupRecord : readGroups) {
-            mReadGroupMap.put(readGroupRecord.getReadGroupId(), readGroupRecord);
-        }
-    }
-
-    public void addReadGroup(final SAMReadGroupRecord readGroup) {
-        if (mReadGroupMap.containsKey(readGroup.getReadGroupId())) {
-            throw new IllegalArgumentException("Read group with group id " +
-                readGroup.getReadGroupId() + " already exists in SAMFileHeader!");
-        }
-        mReadGroups.add(readGroup);
-        mReadGroupMap.put(readGroup.getReadGroupId(), readGroup);
-    }
-
-    public List<SAMProgramRecord> getProgramRecords() {
-        return Collections.unmodifiableList(mProgramRecords);
-    }
-
-    public void addProgramRecord(final SAMProgramRecord programRecord) {
-        if (mProgramRecordMap.containsKey(programRecord.getProgramGroupId())) {
-            throw new IllegalArgumentException("Program record with group id " +
-                programRecord.getProgramGroupId() + " already exists in SAMFileHeader!");
-        }
-        this.mProgramRecords.add(programRecord);
-        this.mProgramRecordMap.put(programRecord.getProgramGroupId(), programRecord);
-    }
-
-    public SAMProgramRecord getProgramRecord(final String pgId) {
-        return this.mProgramRecordMap.get(pgId);
-    }
-
-    /**
-     * Replace entire list of program records
-     * @param programRecords This list is used directly, not copied.
-     */
-    public void setProgramRecords(final List<SAMProgramRecord> programRecords) {
-        this.mProgramRecords = programRecords;
-        this.mProgramRecordMap.clear();
-        for (final SAMProgramRecord programRecord : this.mProgramRecords) {
-            this.mProgramRecordMap.put(programRecord.getProgramGroupId(), programRecord);
-        }
-    }
-
-    /**
-     * @return a new SAMProgramRecord with an ID guaranteed to not exist in this SAMFileHeader
-     */
-    public SAMProgramRecord createProgramRecord() {
-        for (int i = 0; i < Integer.MAX_VALUE; ++i) {
-            final String s = Integer.toString(i);
-            if (!this.mProgramRecordMap.containsKey(s)) {
-                final SAMProgramRecord ret = new SAMProgramRecord(s);
-                addProgramRecord(ret);
-                return ret;
-            }
-        }
-        throw new IllegalStateException("Surprising number of SAMProgramRecords");
-    }
-
-    public SortOrder getSortOrder() {
-        final String so = getAttribute("SO");
-        if (so == null || so.equals("unknown")) {
-            return SortOrder.unsorted;
-        }
-        return SortOrder.valueOf((String) so);
-    }
-
-    public void setSortOrder(final SortOrder so) {
-        setAttribute("SO", so.name());
-    }
-
-    public GroupOrder getGroupOrder() {
-        if (getAttribute("GO") == null) {
-            return GroupOrder.none;
-        }
-        return GroupOrder.valueOf((String)getAttribute("GO"));
-    }
-
-    public void setGroupOrder(final GroupOrder go) {
-        setAttribute("GO", go.name());
-    }
-
-    /**
-     * If this SAMHeader was read from a file, this property contains the header
-     * as it appeared in the file, otherwise it is null.  Note that this is not a toString()
-     * operation.  Changes to the SAMFileHeader object after reading from the file are not reflected in this value.
-     *
-     * In addition this value is only set if one of the following is true:
-     *   - The size of the header is < 1,048,576 characters (1MB ascii, 2MB unicode)
-     *   - There are either validation or parsing errors associated with the header
-     *
-     * Invalid header lines may appear in value but are not stored in the SAMFileHeader object.
-     */
-    public String getTextHeader() {
-        return textHeader;
-    }
-
-    public void setTextHeader(final String textHeader) {
-        this.textHeader = textHeader;
-    }
-
-    public List<String> getComments() {
-        return Collections.unmodifiableList(mComments);
-    }
-
-    public void addComment(String comment) {
-        if (!comment.startsWith(SAMTextHeaderCodec.COMMENT_PREFIX)) {
-            comment = SAMTextHeaderCodec.COMMENT_PREFIX + comment;
-        }
-        mComments.add(comment);
-    }
-
-
-    /**
-     * Replace existing comments with the contents of the given collection.
-     */
-    public void setComments(final Collection<String> comments) {
-        mComments.clear();
-        for (final String comment : comments) {
-            addComment(comment);
-        }
-    }
-
-    public List<SAMValidationError> getValidationErrors() {
-        return Collections.unmodifiableList(mValidationErrors);
-    }
-
-    public void addValidationError(final SAMValidationError error) {
-        mValidationErrors.add(error);
-    }
-
-    /**
-     * Replace list of validation errors with the elements of the given list.
-     */
-    public void setValidationErrors(final Collection<SAMValidationError> errors) {
-        mValidationErrors.clear();
-        mValidationErrors.addAll(errors);
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final SAMFileHeader that = (SAMFileHeader) o;
-
-        if (!attributesEqual(that)) return false;
-        if (mProgramRecords != null ? !mProgramRecords.equals(that.mProgramRecords) : that.mProgramRecords != null)
-            return false;
-        if (mReadGroups != null ? !mReadGroups.equals(that.mReadGroups) : that.mReadGroups != null) return false;
-        if (mSequenceDictionary != null ? !mSequenceDictionary.equals(that.mSequenceDictionary) : that.mSequenceDictionary != null)
-            return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = attributesHashCode();
-        result = 31 * result + (mSequenceDictionary != null ? mSequenceDictionary.hashCode() : 0);
-        result = 31 * result + (mReadGroups != null ? mReadGroups.hashCode() : 0);
-        result = 31 * result + (mProgramRecords != null ? mProgramRecords.hashCode() : 0);
-        return result;
-    }
-
-    public final SAMFileHeader clone() {
-        final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
-        codec.setValidationStringency(ValidationStringency.SILENT);
-        final StringWriter stringWriter = new StringWriter();
-        codec.encode(stringWriter, this);
-        return codec.decode(new StringLineReader(stringWriter.toString()), "SAMFileHeader.clone");
-    }
-
-    /** Little class to generate program group IDs */
-    public static class PgIdGenerator {
-        private int recordCounter;
-
-        private final Set<String> idsThatAreAlreadyTaken = new HashSet<String>();
-
-        public PgIdGenerator(final SAMFileHeader header) {
-            for (final SAMProgramRecord pgRecord : header.getProgramRecords()) {
-                idsThatAreAlreadyTaken.add(pgRecord.getProgramGroupId());
-            }
-            recordCounter = idsThatAreAlreadyTaken.size();
-        }
-
-        public String getNonCollidingId(final String recordId) {
-            if (!idsThatAreAlreadyTaken.contains(recordId)) {
-                // don't remap 1st record. If there are more records
-                // with this id, they will be remapped in the 'else'.
-                idsThatAreAlreadyTaken.add(recordId);
-                ++recordCounter;
-                return recordId;
-            } else {
-                String newId;
-                // Below we tack on one of roughly 1.7 million possible 4 digit base36 at random. We do this because
-                // our old process of just counting from 0 upward and adding that to the previous id led to 1000s of
-                // calls idsThatAreAlreadyTaken.contains() just to resolve 1 collision when merging 1000s of similarly
-                // processed bams.
-                while (idsThatAreAlreadyTaken.contains(newId = recordId + "." + SamFileHeaderMerger.positiveFourDigitBase36Str(recordCounter++)))
-                    ;
-
-                idsThatAreAlreadyTaken.add(newId);
-                return newId;
-            }
-
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileSource.java b/src/main/java/htsjdk/samtools/SAMFileSource.java
deleted file mode 100644
index 3130a73..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileSource.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Represents the origin of a SAM record.
- *
- * @author mhanna
- * @version 0.1
- */
-public class SAMFileSource {
-    /**
-     * The reader originating this SAM record.
-     */
-    private SamReader mReader;
-
-    /**
-     * The point on disk from which a record originates.
-     */
-    private SAMFileSpan mFilePointer;
-
-    /**
-     * Create a new SAMFileSource with the given reader and file pointer.
-     * @param reader reader.
-     * @param filePointer File pointer.
-     */
-    public SAMFileSource(final SamReader reader, final SAMFileSpan filePointer) {
-        this.mReader = reader;
-        this.mFilePointer = filePointer;
-    }
-
-    /**
-     * Retrieves the reader from which this read was initially retrieved.
-     * @return The reader.
-     */
-    public SamReader getReader() {
-        return mReader;
-    }
-
-    /**
-     * A pointer to the region on disk from which the read originated.
-     * @return A pointer within the file.
-     */
-    public SAMFileSpan getFilePointer() {
-        return mFilePointer;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileSpan.java b/src/main/java/htsjdk/samtools/SAMFileSpan.java
deleted file mode 100644
index 4122b24..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileSpan.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * A interface representing a collection of (possibly) discontinuous segments in the
- * BAM file, possibly representing the results of an index query.
- */
-public interface SAMFileSpan extends Cloneable {
-    /**
-     * Gets a pointer over the data immediately following this span.
-     * @return The a pointer to data immediately following this span.
-     */
-    public SAMFileSpan getContentsFollowing();
-
-    /**
-     * Remove all pointers in this file span before the given file span starts.
-     * @param fileSpan The filespan before which to eliminate.
-     * @return The portion of the chunk list after the given chunk.
-     */
-    public SAMFileSpan removeContentsBefore(final SAMFileSpan fileSpan);
-
-    /**
-     * Does this file span point to any data, or is it completely empty?
-     * @return True if the file span is empty, false otherwise.
-     */
-    public boolean isEmpty();
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileWriter.java b/src/main/java/htsjdk/samtools/SAMFileWriter.java
deleted file mode 100644
index fe99591..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileWriter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Closeable;
-
-import htsjdk.samtools.util.ProgressLoggerInterface;
-
-/**
- * Interface for SAMText and BAM file writers.  Clients need not care which they write to,
- * once the object is constructed.
- */
-public interface SAMFileWriter extends Closeable {
-
-	void addAlignment(SAMRecord alignment);
-
-    SAMFileHeader getFileHeader();
-
-	/**
-	 * Sets a ProgressLogger on this writer. This is useful when pulling, for instance, from a
-	 * SortingCollection.
-	 */
-	void setProgressLogger(final ProgressLoggerInterface progress);
-
-    /**
-     * Must be called to flush or file will likely be defective. 
-     */
-    void close();
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java b/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java
deleted file mode 100644
index 61f1c9c..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.Md5CalculatingOutputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.zip.DeflaterFactory;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.zip.Deflater;
-
-/**
- * Create a writer for writing SAM, BAM, or CRAM files.
- */
-public class SAMFileWriterFactory implements Cloneable {
-    private final static Log log = Log.getInstance(SAMFileWriterFactory.class);
-    private static boolean defaultCreateIndexWhileWriting = Defaults.CREATE_INDEX;
-    private boolean createIndex = defaultCreateIndexWhileWriting;
-    private static boolean defaultCreateMd5File = Defaults.CREATE_MD5;
-    private boolean createMd5File = defaultCreateMd5File;
-    private boolean useAsyncIo = Defaults.USE_ASYNC_IO_WRITE_FOR_SAMTOOLS;
-    private int asyncOutputBufferSize = AsyncSAMFileWriter.DEFAULT_QUEUE_SIZE;
-    private int bufferSize = Defaults.BUFFER_SIZE;
-    private File tmpDir;
-    /** compression level 0: min 9:max */
-    private int compressionLevel = BlockCompressedOutputStream.getDefaultCompressionLevel();
-    private SamFlagField samFlagFieldOutput = SamFlagField.NONE;
-    private Integer maxRecordsInRam = null;
-    private DeflaterFactory deflaterFactory = BlockCompressedOutputStream.getDefaultDeflaterFactory();
-
-    /** simple constructor */
-    public SAMFileWriterFactory() {
-    }
-    
-    /** copy constructor */
-    public SAMFileWriterFactory( final SAMFileWriterFactory other) {
-        if( other == null ) throw new IllegalArgumentException("SAMFileWriterFactory(null)");
-        this.createIndex = other.createIndex;
-        this.createMd5File = other.createMd5File;
-        this.useAsyncIo = other.useAsyncIo;
-        this.asyncOutputBufferSize = other.asyncOutputBufferSize;
-        this.bufferSize = other.bufferSize;
-        this.tmpDir = other.tmpDir;
-        this.compressionLevel = other.compressionLevel;
-        this.maxRecordsInRam = other.maxRecordsInRam;
-    }
-    
-    @Override
-    public SAMFileWriterFactory clone() {
-        return new SAMFileWriterFactory(this);
-    }
-
-    /**
-     * Sets the default for whether to create md5Files for BAM files this factory.
-     */
-    public static void setDefaultCreateMd5File(final boolean createMd5File) {
-        defaultCreateMd5File = createMd5File;
-    }
-
-    /**
-     * Sets whether to create md5Files for BAMs from this factory.
-     */
-    public SAMFileWriterFactory setCreateMd5File(final boolean createMd5File) {
-        this.createMd5File = createMd5File;
-        return this;
-    }
-
-    /**
-     * Set the deflater factory used by BAM writers created by this writer factory. Must not be null.
-     * If this method is not called, the default  {@link DeflaterFactory} is used which creates the default JDK {@link Deflater}.
-     * This method returns the SAMFileWriterFactory itself. */
-    public SAMFileWriterFactory setDeflaterFactory(final DeflaterFactory deflaterFactory){
-        if (deflaterFactory == null){
-            throw new IllegalArgumentException("null deflater factory");
-        }
-        this.deflaterFactory = deflaterFactory;
-        return this;
-    }
-
-    /** set compression level 0!none 9: max */
-    public SAMFileWriterFactory setCompressionLevel(final int compressionLevel) {
-        this.compressionLevel = Math.min(9, Math.max(0, compressionLevel));
-        return this;
-    }
-    
-    public int getCompressionLevel() {
-        return compressionLevel;
-    }
-    
-    /**
-     * Sets the default for subsequent SAMFileWriterFactories
-     * that do not specify whether to create an index.
-     * If a BAM (not SAM) file is created, the setting is true, and the file header specifies coordinate order,
-     * then a BAM index file will be written along with the BAM file.
-     *
-     * @param setting whether to attempt to create a BAM index while creating the BAM file
-     */
-    public static void setDefaultCreateIndexWhileWriting(final boolean setting) {
-        defaultCreateIndexWhileWriting = setting;
-    }
-
-    /**
-     * Convenience method allowing newSAMFileWriterFactory().setCreateIndex(true);
-     * Equivalent to SAMFileWriterFactory.setDefaultCreateIndexWhileWriting(true); newSAMFileWriterFactory();
-     * If a BAM or CRAM (not SAM) file is created, the setting is true, and the file header specifies coordinate order,
-     * then a BAM index file will be written along with the BAM file.
-     *
-     * @param setting whether to attempt to create a BAM index while creating the BAM file.
-     * @return this factory object
-     */
-    public SAMFileWriterFactory setCreateIndex(final boolean setting) {
-        this.createIndex = setting;
-        return this;
-    }
-
-    /**
-     * Before creating a writer that is not presorted, this method may be called in order to override
-     * the default number of SAMRecords stored in RAM before spilling to disk
-     * (c.f. SAMFileWriterImpl.MAX_RECORDS_IN_RAM).  When writing very large sorted SAM files, you may need
-     * call this method in order to avoid running out of file handles.  The RAM available to the JVM may need
-     * to be increased in order to hold the specified number of records in RAM.  This value affects the number
-     * of records stored in subsequent calls to one of the make...() methods.
-     *
-     * @param maxRecordsInRam Number of records to store in RAM before spilling to temporary file when
-     *                        creating a sorted SAM or BAM file.
-     */
-    public SAMFileWriterFactory setMaxRecordsInRam(final int maxRecordsInRam) {
-        this.maxRecordsInRam = maxRecordsInRam;
-        return this;
-    }
-
-    /**
-     * Turn on or off the use of asynchronous IO for writing output SAM and BAM files.  If true then
-     * each SAMFileWriter creates a dedicated thread which is used for compression and IO activities.
-     */
-    public SAMFileWriterFactory setUseAsyncIo(final boolean useAsyncIo) {
-        this.useAsyncIo = useAsyncIo;
-        return this;
-    }
-
-    /**
-     * If and only if using asynchronous IO then sets the maximum number of records that can be buffered per
-     * SAMFileWriter before producers will block when trying to write another SAMRecord.
-     */
-    public SAMFileWriterFactory setAsyncOutputBufferSize(final int asyncOutputBufferSize) {
-        this.asyncOutputBufferSize = asyncOutputBufferSize;
-        return this;
-    }
-
-    /**
-     * Controls size of write buffer.
-     * Default value: [[htsjdk.samtools.Defaults#BUFFER_SIZE]]
-     */
-    public SAMFileWriterFactory setBufferSize(final int bufferSize) {
-        this.bufferSize = bufferSize;
-        return this;
-    }
-
-    /**
-     * Set the temporary directory to use when sort data.
-     *
-     * @param tmpDir Path to the temporary directory
-     */
-    public SAMFileWriterFactory setTempDirectory(final File tmpDir) {
-        this.tmpDir = tmpDir;
-        return this;
-    }
-
-    /**
-     * Set the flag output format only when writing text.
-     * Default value: [[htsjdk.samtools.SAMTextWriter.samFlagFieldOutput.DECIMAL]]
-     */
-    public SAMFileWriterFactory setSamFlagFieldOutput(final SamFlagField samFlagFieldOutput) {
-        if (samFlagFieldOutput == null) throw new IllegalArgumentException("Sam flag field was null");
-        this.samFlagFieldOutput = samFlagFieldOutput;
-        return this;
-    }
-
-    /**
-     * Create a BAMFileWriter that is ready to receive SAMRecords.  Uses default compression level.
-     *
-     * @param header     entire header. Sort order is determined by the sortOrder property of this arg.
-     * @param presorted  if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
-     * @param outputFile where to write the output.
-     */
-    public SAMFileWriter makeBAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile) {
-        return makeBAMWriter(header, presorted, outputFile, this.getCompressionLevel());
-    }
-
-    /**
-     * Create a BAMFileWriter that is ready to receive SAMRecords.
-     *
-     * @param header           entire header. Sort order is determined by the sortOrder property of this arg.
-     * @param presorted        if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
-     * @param outputFile       where to write the output.
-     * @param compressionLevel Override default compression level with the given value, between 0 (fastest) and 9 (smallest).
-     */
-    public SAMFileWriter makeBAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile,
-                                       final int compressionLevel) {
-        try {
-            final boolean createMd5File = this.createMd5File && IOUtil.isRegularPath(outputFile);
-            if (this.createMd5File && !createMd5File) {
-                log.warn("Cannot create MD5 file for BAM because output file is not a regular file: " + outputFile.getAbsolutePath());
-            }
-            OutputStream os = IOUtil.maybeBufferOutputStream(new FileOutputStream(outputFile, false), bufferSize);
-            if (createMd5File) os = new Md5CalculatingOutputStream(os, new File(outputFile.getAbsolutePath() + ".md5"));
-            final BAMFileWriter ret = new BAMFileWriter(os, outputFile, compressionLevel, deflaterFactory);
-            final boolean createIndex = this.createIndex && IOUtil.isRegularPath(outputFile);
-            if (this.createIndex && !createIndex) {
-                log.warn("Cannot create index for BAM because output file is not a regular file: " + outputFile.getAbsolutePath());
-            }
-            if (this.tmpDir != null) ret.setTempDirectory(this.tmpDir);
-            initializeBAMWriter(ret, header, presorted, createIndex);
-
-            if (this.useAsyncIo) return new AsyncSAMFileWriter(ret, this.asyncOutputBufferSize);
-            else return ret;
-        } catch (final IOException ioe) {
-            throw new RuntimeIOException("Error opening file: " + outputFile.getAbsolutePath());
-        }
-    }
-
-    private void initializeBAMWriter(final BAMFileWriter writer, final SAMFileHeader header, final boolean presorted, final boolean createIndex) {
-        writer.setSortOrder(header.getSortOrder(), presorted);
-        if (maxRecordsInRam != null) {
-            writer.setMaxRecordsInRam(maxRecordsInRam);
-        }
-        writer.setHeader(header);
-        if (createIndex && writer.getSortOrder().equals(SAMFileHeader.SortOrder.coordinate)) {
-            writer.enableBamIndexConstruction();
-        }
-    }
-
-    /**
-     * Create a SAMTextWriter that is ready to receive SAMRecords.
-     *
-     * @param header     entire header. Sort order is determined by the sortOrder property of this arg.
-     * @param presorted  if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
-     * @param outputFile where to write the output.
-     */
-    public SAMFileWriter makeSAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile) {
-        /**
-         * Use the value specified from Defaults.SAM_FLAG_FIELD_FORMAT when samFlagFieldOutput value has not been set.  This should
-         * be SamFlagField.DECIMAL when the user has not set Defaults.SAM_FLAG_FIELD_FORMAT.
-         */
-        if (samFlagFieldOutput == SamFlagField.NONE) {
-            samFlagFieldOutput = Defaults.SAM_FLAG_FIELD_FORMAT;
-        }
-        try {
-            final SAMTextWriter ret = this.createMd5File
-                    ? new SAMTextWriter(new Md5CalculatingOutputStream(new FileOutputStream(outputFile, false),
-                    new File(outputFile.getAbsolutePath() + ".md5")), samFlagFieldOutput)
-                    : new SAMTextWriter(outputFile, samFlagFieldOutput);
-            ret.setSortOrder(header.getSortOrder(), presorted);
-            if (maxRecordsInRam != null) {
-                ret.setMaxRecordsInRam(maxRecordsInRam);
-            }
-            ret.setHeader(header);
-
-            if (this.useAsyncIo) return new AsyncSAMFileWriter(ret, this.asyncOutputBufferSize);
-            else return ret;
-        } catch (final IOException ioe) {
-            throw new RuntimeIOException("Error opening file: " + outputFile.getAbsolutePath());
-        }
-    }
-
-    /**
-     * Create a SAMTextWriter for writing to a stream that is ready to receive SAMRecords.
-     * This method does not support the creation of an MD5 file
-     *
-     * @param header    entire header. Sort order is determined by the sortOrder property of this arg.
-     * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
-     * @param stream    the stream to write records to.  Note that this method does not buffer the stream, so the
-     *                  caller must buffer if desired.  Note that PrintStream is buffered.
-     */
-    public SAMFileWriter makeSAMWriter(final SAMFileHeader header, final boolean presorted, final OutputStream stream) {
-        /**
-         * Use the value specified from Defaults.SAM_FLAG_FIELD_FORMAT when samFlagFieldOutput value has not been set.  This should
-         * be samFlagFieldOutput.DECIMAL when the user has not set Defaults.SAM_FLAG_FIELD_FORMAT.
-         */
-        if (samFlagFieldOutput == SamFlagField.NONE) {
-            samFlagFieldOutput = Defaults.SAM_FLAG_FIELD_FORMAT;
-        }
-        return initWriter(header, presorted, false, new SAMTextWriter(stream, samFlagFieldOutput));
-    }
-
-    /**
-     * Create a BAMFileWriter for writing to a stream that is ready to receive SAMRecords.
-     * This method does not support the creation of an MD5 file
-     *
-     * @param header    entire header. Sort order is determined by the sortOrder property of this arg.
-     * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
-     * @param stream    the stream to write records to.  Note that this method does not buffer the stream, so the
-     *                  caller must buffer if desired.  Note that PrintStream is buffered.
-     */
-
-    public SAMFileWriter makeBAMWriter(final SAMFileHeader header, final boolean presorted, final OutputStream stream) {
-        return initWriter(header, presorted, true, new BAMFileWriter(stream, null, this.getCompressionLevel(), this.deflaterFactory));
-    }
-
-    /**
-     * Initialize SAMTextWriter or a BAMFileWriter and possibly wrap in AsyncSAMFileWriter
-     *
-     * @param header    entire header. Sort order is determined by the sortOrder property of this arg.
-     * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
-     * @param binary    do we want to generate a BAM or a SAM
-     * @param writer    SAM or BAM writer to initialize and maybe wrap.
-     */
-
-    private SAMFileWriter initWriter(final SAMFileHeader header, final boolean presorted, final boolean binary,
-                                     final SAMFileWriterImpl writer) {
-        writer.setSortOrder(header.getSortOrder(), presorted);
-        if (maxRecordsInRam != null) {
-            writer.setMaxRecordsInRam(maxRecordsInRam);
-        }
-        writer.setHeader(header);
-
-        if (this.useAsyncIo) return new AsyncSAMFileWriter(writer, this.asyncOutputBufferSize);
-        else return writer;
-    }
-
-    /**
-     * Create either a SAM or a BAM writer based on examination of the outputFile extension.
-     *
-     * @param header     entire header. Sort order is determined by the sortOrder property of this arg.
-     * @param presorted  presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
-     * @param outputFile where to write the output.  Must end with .sam or .bam.
-     * @return SAM or BAM writer based on file extension of outputFile.
-     */
-    public SAMFileWriter makeSAMOrBAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile) {
-        final String filename = outputFile.getName();
-        if (filename.endsWith(BamFileIoUtils.BAM_FILE_EXTENSION)) {
-            return makeBAMWriter(header, presorted, outputFile);
-        }
-        if (filename.endsWith(".sam")) {
-            return makeSAMWriter(header, presorted, outputFile);
-        }
-        return makeBAMWriter(header, presorted, outputFile);
-    }
-
-    /**
-     *
-     * Create a SAM, BAM or CRAM writer based on examination of the outputFile extension.
-     *
-     * @param header header. Sort order is determined by the sortOrder property of this arg.
-     * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
-     * @param outputFile where to write the output.  Must end with .sam, .bam or .cram.
-     * @param referenceFasta reference sequence file
-     * @return SAMFileWriter appropriate for the file type specified in outputFile
-     *
-     */
-    public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presorted, final File outputFile, final File referenceFasta) {
-        if (outputFile.getName().endsWith(SamReader.Type.CRAM_TYPE.fileExtension())) {
-            return makeCRAMWriter(header, presorted, outputFile, referenceFasta);
-        }
-        else {
-            return makeSAMOrBAMWriter(header, presorted, outputFile);
-        }
-    }
-
-    /**
-     * Create a CRAMFileWriter on an output stream. Requires the input to be presorted to match the sort order defined
-     * by the input header.
-     *
-     * Note: does not honor factory settings for CREATE_MD5, CREATE_INDEX, USE_ASYNC_IO.
-     *
-     * @param header entire header. Sort order is determined by the sortOrder property of this arg.
-     * @param stream where to write the output.
-     * @param referenceFasta reference sequence file
-     * @return CRAMFileWriter
-     */
-    public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final OutputStream stream, final File referenceFasta) {
-        // create the CRAMFileWriter directly without propagating factory settings
-        final CRAMFileWriter writer = new CRAMFileWriter(stream, new ReferenceSource(referenceFasta), header, null);
-        setCRAMWriterDefaults(writer);
-        return writer;
-    }
-
-    /**
-     * Create a CRAMFileWriter on an output file. Requires input record to be presorted to match the
-     * sort order defined by the input header.
-     *
-     * Note: does not honor factory settings for USE_ASYNC_IO.
-     *
-     * @param header entire header. Sort order is determined by the sortOrder property of this arg.
-     * @param outputFile where to write the output.  Must end with .sam, .bam or .cram.
-     * @param referenceFasta reference sequence file
-     * @return CRAMFileWriter
-     *
-     */
-    public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final File outputFile, final File referenceFasta) {
-        return createCRAMWriterWithSettings(header, true, outputFile, referenceFasta);
-    }
-
-    /**
-     * Create a CRAMFileWriter on an output file.
-     *
-     * Note: does not honor factory setting for USE_ASYNC_IO.
-     *
-     * @param header entire header. Sort order is determined by the sortOrder property of this arg.
-     * @param presorted  if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
-     * @param outputFile where to write the output.  Must end with .sam, .bam or .cram.
-     * @param referenceFasta reference sequence file
-     * @return CRAMFileWriter
-     *
-     */
-    public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile, final File referenceFasta) {
-        return createCRAMWriterWithSettings(header, presorted, outputFile, referenceFasta);
-    }
-
-    /**
-     * Create a CRAMFileWriter on an output file based on factory settings.
-     *
-     * Note: does not honor the factory setting for USE_ASYNC_IO.
-     *
-     * @param header entire header. Sort order is determined by the sortOrder property of this arg.
-     * @param presorted  if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
-     * @param outputFile where to write the output.  Must end with .sam, .bam or .cram.
-     * @param referenceFasta reference sequence file
-     * @return CRAMFileWriter
-     */
-    private CRAMFileWriter createCRAMWriterWithSettings(
-            final SAMFileHeader header,
-            final boolean presorted,
-            final File outputFile,
-            final File referenceFasta) {
-        OutputStream cramOS = null;
-        OutputStream indexOS = null ;
-
-        if (createIndex) {
-            if (!IOUtil.isRegularPath(outputFile)) {
-                log.warn("Cannot create index for CRAM because output file is not a regular file: " + outputFile.getAbsolutePath());
-            }
-            else {
-                try {
-                    final File indexFile = new File(outputFile.getAbsolutePath() + BAMIndex.BAMIndexSuffix) ;
-                    indexOS = new FileOutputStream(indexFile) ;
-                }
-                catch (final IOException ioe) {
-                    throw new RuntimeIOException("Error creating index file for: " + outputFile.getAbsolutePath()+ BAMIndex.BAMIndexSuffix);
-                }
-            }
-        }
-
-        try {
-            cramOS = IOUtil.maybeBufferOutputStream(new FileOutputStream(outputFile, false), bufferSize);
-        }
-        catch (final IOException ioe) {
-            throw new RuntimeIOException("Error creating CRAM file: " + outputFile.getAbsolutePath());
-        }
-
-        final CRAMFileWriter writer = new CRAMFileWriter(
-                createMd5File ? new Md5CalculatingOutputStream(cramOS, new File(outputFile.getAbsolutePath() + ".md5")) : cramOS,
-                indexOS,
-                presorted,
-                new ReferenceSource(referenceFasta),
-                header,
-                outputFile.getAbsolutePath());
-        setCRAMWriterDefaults(writer);
-
-        return writer;
-    }
-
-    // Set the default CRAM writer preservation parameters
-    private void setCRAMWriterDefaults(final CRAMFileWriter writer) {
-        writer.setPreserveReadNames(true);
-        writer.setCaptureAllTags(true);
-    }
-
-    @Override
-    public String toString() {
-        return "SAMFileWriterFactory [createIndex=" + createIndex + ", createMd5File=" + createMd5File + ", useAsyncIo="
-                + useAsyncIo + ", asyncOutputBufferSize=" + asyncOutputBufferSize + ", bufferSize=" + bufferSize
-                + ", tmpDir=" + tmpDir + ", compressionLevel=" + compressionLevel + ", maxRecordsInRam="
-                + maxRecordsInRam + "]";
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java b/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java
deleted file mode 100644
index 130ecea..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.ProgressLoggerInterface;
-import htsjdk.samtools.util.SortingCollection;
-
-import java.io.File;
-import java.io.StringWriter;
-
-/**
- * Base class for implementing SAM writer with any underlying format.
- * Mostly this manages accumulation & sorting of SAMRecords when appropriate,
- * and produces the text version of the header, since that seems to be a popular item
- * in both text and binary file formats.
- */
-public abstract class SAMFileWriterImpl implements SAMFileWriter
-{
-    private static int DEAFULT_MAX_RECORDS_IN_RAM = 500000;      
-    private int maxRecordsInRam = DEAFULT_MAX_RECORDS_IN_RAM;
-    private SAMFileHeader.SortOrder sortOrder;
-    private SAMFileHeader header;
-    private SortingCollection<SAMRecord> alignmentSorter;
-    private File tmpDir = new File(System.getProperty("java.io.tmpdir"));
-    private ProgressLoggerInterface progressLogger = null;
-    private boolean isClosed = false;
-
-    // If true, records passed to addAlignment are already in the order specified by sortOrder
-    private boolean presorted;
-
-    // For validating presorted records.
-    private SAMSortOrderChecker sortOrderChecker;
-
-    /**
-     * When writing records that are not presorted, specify the number of records stored in RAM
-     * before spilling to disk.  This method sets the default value for all SamFileWriterImpl
-     * instances. Must be called before the constructor is called.
-     * @param maxRecordsInRam
-     */
-    public static void setDefaultMaxRecordsInRam(final int maxRecordsInRam) {
-        DEAFULT_MAX_RECORDS_IN_RAM = maxRecordsInRam;    
-    }
-    
-    /**
-     * When writing records that are not presorted, this number determines the 
-     * number of records stored in RAM before spilling to disk.
-     * @return DEAFULT_MAX_RECORDS_IN_RAM 
-     */
-    public static int getDefaultMaxRecordsInRam() {
-        return DEAFULT_MAX_RECORDS_IN_RAM;    
-    }
-
-    /**
-     * Sets the progress logger used by this implementation. Setting this lets this writer emit log
-     * messages as SAM records in a SortingCollection are being written to disk.
-     */
-    public void setProgressLogger(final ProgressLoggerInterface progress) {
-        this.progressLogger = progress;
-    }
-
-    /**
-     * Must be called before calling setHeader().  SortOrder value in the header passed
-     * to setHeader() is ignored.  If setSortOrder is not called, default is SortOrder.unsorted.
-     */
-    public void setSortOrder(final SAMFileHeader.SortOrder sortOrder, final boolean presorted) {
-        if (header != null) {
-            throw new IllegalStateException("Cannot call SAMFileWriterImpl.setSortOrder after setHeader for " +
-                    getFilename());
-        }
-        this.sortOrder = sortOrder;
-        this.presorted = presorted;
-    }
-
-    /**
-     * Must be called after calling setHeader().
-     */
-    protected SAMFileHeader.SortOrder getSortOrder() {
-        return this.sortOrder;
-    }
-
-    /**
-     * When writing records that are not presorted, specify the number of records stored in RAM
-     * before spilling to disk.  Must be called before setHeader().
-     * @param maxRecordsInRam
-     */
-    void setMaxRecordsInRam(final int maxRecordsInRam) {
-        if (this.header != null) {
-            throw new IllegalStateException("setMaxRecordsInRam must be called before setHeader()");
-        }
-        this.maxRecordsInRam = maxRecordsInRam;
-    }
-    
-    /**
-     * When writing records that are not presorted, specify the path of the temporary directory 
-     * for spilling to disk.  Must be called before setHeader().
-     * @param tmpDir path to the temporary directory
-     */
-    void setTempDirectory(final File tmpDir) {
-        if (tmpDir!=null) {
-            this.tmpDir = tmpDir;
-        }
-    }
-
-    /**
-     * Must be called before addAlignment. Header cannot be null.
-     */
-    public void setHeader(final SAMFileHeader header)
-    {
-        if (null == header) {
-            throw new IllegalArgumentException("A non-null SAMFileHeader is required for a writer");
-        }
-        this.header = header;
-        if (sortOrder == null) {
-             sortOrder = SAMFileHeader.SortOrder.unsorted;
-        }
-        header.setSortOrder(sortOrder);
-        final StringWriter headerTextBuffer = new StringWriter();
-        new SAMTextHeaderCodec().encode(headerTextBuffer, header);
-        final String headerText = headerTextBuffer.toString();
-
-        writeHeader(headerText);
-
-        if (presorted) {
-            if (sortOrder.equals(SAMFileHeader.SortOrder.unsorted)) {
-                presorted = false;
-            } else {
-                sortOrderChecker = new SAMSortOrderChecker(sortOrder);
-            }
-        } else if (!sortOrder.equals(SAMFileHeader.SortOrder.unsorted)) {
-            alignmentSorter = SortingCollection.newInstance(SAMRecord.class,
-                    new BAMRecordCodec(header), makeComparator(), maxRecordsInRam, tmpDir);
-        }
-    }
-
-    public SAMFileHeader getFileHeader() {
-        return header;
-    }
-
-    private SAMRecordComparator makeComparator() {
-        switch (sortOrder) {
-            case coordinate:
-                return new SAMRecordCoordinateComparator();
-            case queryname:
-                return new SAMRecordQueryNameComparator();
-            case duplicate:
-                return new SAMRecordDuplicateComparator();
-            case unsorted:
-                return null;
-        }
-        throw new IllegalStateException("sortOrder should not be null");
-    }
-
-    /**
-     * Add an alignment record to be emitted by the writer.
-     *
-     * @param alignment Must not be null. The record will be updated to use the header used by this writer, which will
-     *                  in turn cause any unresolved reference and mate reference indices to be resolved against the
-     *                  header's sequence dictionary.
-     * @throws IllegalArgumentException if the record's reference or mate reference indices cannot be
-     * resolved against the writer's header using the current reference and mate reference names
-     */
-    public void addAlignment(final SAMRecord alignment)
-    {
-        alignment.setHeaderStrict(header); // re-establish the record header and resolve reference indices
-        if (sortOrder.equals(SAMFileHeader.SortOrder.unsorted)) {
-            writeAlignment(alignment);
-        } else if (presorted) {
-            assertPresorted(alignment);
-            writeAlignment(alignment);
-        } else {
-            alignmentSorter.add(alignment);
-        }
-    }
-
-    private void assertPresorted(final SAMRecord alignment) {
-        final SAMRecord prev = sortOrderChecker.getPreviousRecord();
-        if (!sortOrderChecker.isSorted(alignment)) {
-            throw new IllegalArgumentException("Alignments added out of order in SAMFileWriterImpl.addAlignment for " +
-                    getFilename() + ". Sort order is " + this.sortOrder + ". Offending records are at ["
-                    + sortOrderChecker.getSortKey(prev) + "] and ["
-                    + sortOrderChecker.getSortKey(alignment) + "]");
-        }
-    }
-
-    /**
-     * Must be called or else file will likely be defective.
-     */
-    public final void close()
-    {
-        if (!isClosed) {
-            if (alignmentSorter != null) {
-                for (final SAMRecord alignment : alignmentSorter) {
-                    writeAlignment(alignment);
-                    if (progressLogger != null) progressLogger.record(alignment);
-                }
-                alignmentSorter.cleanup();
-            }
-            finish();
-        }
-        isClosed = true;
-    }
-
-    /**
-     * Writes the record to disk.  Sort order has been taken care of by the time
-     * this method is called. The record must hava a non-null SAMFileHeader.
-     * @param alignment
-     */
-    abstract protected void writeAlignment(SAMRecord alignment);
-
-    /**
-     * Write the header to disk.  Header object is available via getHeader().
-     * @param textHeader for convenience if the implementation needs it.
-     */
-    abstract protected void writeHeader(String textHeader);
-
-    /**
-     * Do any required flushing here.
-     */
-    abstract protected void finish();
-
-    /**
-     * For producing error messages.
-     * @return Output filename, or null if there isn't one.
-     */
-    abstract protected String getFilename();
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFlag.java b/src/main/java/htsjdk/samtools/SAMFlag.java
deleted file mode 100644
index 11dc155..0000000
--- a/src/main/java/htsjdk/samtools/SAMFlag.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * The MIT License
- *
- * Author: Pierre Lindenbaum PhD @yokofakun
- *  Institut du Thorax - Nantes - France
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * SAM flags as enum, to be used in GUI, menu, etc...
- */
-public enum SAMFlag {
-    READ_PAIRED(                    0x1,    "Template having multiple segments in sequencing"),
-    PROPER_PAIR(                    0x2,    "Each segment properly aligned according to the aligner"),
-    READ_UNMAPPED(                  0x4,    "Segment unmapped"),
-    MATE_UNMAPPED(                  0x8,    "Next segment in the template unmapped"),
-    READ_REVERSE_STRAND(            0x10,   "SEQ being reverse complemented"),
-    MATE_REVERSE_STRAND(            0x20,   "SEQ of the next segment in the template being reverse complemented"),
-    FIRST_OF_PAIR(                  0x40,   "The first segment in the template"),
-    SECOND_OF_PAIR(                 0x80,   "The last segment in the template"),
-    NOT_PRIMARY_ALIGNMENT(          0x100,  "Secondary alignment"),
-    READ_FAILS_VENDOR_QUALITY_CHECK(0x200,  "Not passing quality controls"),
-    DUPLICATE_READ(                 0x400,  "PCR or optical duplicate"), 
-    SUPPLEMENTARY_ALIGNMENT(        0x800,  "Supplementary alignment")
-    ;
-
-    /* visible for the package, to be used by SAMRecord */
-    final int flag;
-    private final String description;
-
-    SAMFlag(int flag, String description) {
-        this.flag = flag;
-        this.description = description;
-    }
-
-    /** @return this flag as an int */
-    public int intValue() {
-        return flag;
-    }
-
-    /** @return a human label for this SAMFlag */
-    public String getLabel() {
-        return name().toLowerCase().replace('_', ' ');
-    }
-
-    /** @return a human description for this SAMFlag */
-    public String getDescription() {
-        return this.description;
-    }
-
-    /** @return the SAMFlag for the value 'flag' or null if it was not found */
-    public static SAMFlag valueOf(int flag) {
-        for (SAMFlag f : values()) {
-            if (flag == f.flag)
-                return f;
-        }
-        return null;
-    }
-
-    /** @return find SAMFlag the flag by name, or null if it was not found */
-    public static SAMFlag findByName(String flag)
-        {   
-        for (SAMFlag f : values()) {
-            if (f.name().equals(flag))
-                return f;
-        }
-        return null;
-    }
-
-    /** @returns true if the bit for is set for flag */
-    public boolean isSet(int flag) {
-        return (this.flag & flag) != 0;
-    }
-
-    /** @returns true if the bit for is not set for flag */
-    public boolean isUnset(int flag) {
-        return !isSet(flag);
-    }
-
-    /** @returns the java.util.Set of SAMFlag for 'flag' */
-    public static Set<SAMFlag> getFlags(int flag) {
-        Set<SAMFlag> set = new HashSet<SAMFlag>();
-        for (SAMFlag f : values()) {
-            if (f.isSet(flag))
-                set.add(f);
-        }
-        return set;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFormatException.java b/src/main/java/htsjdk/samtools/SAMFormatException.java
deleted file mode 100644
index bce82bc..0000000
--- a/src/main/java/htsjdk/samtools/SAMFormatException.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Thrown when a SAM file being read or decoded (text or binary) looks bad.
- */
-public class SAMFormatException extends SAMException {
-    public SAMFormatException() {
-    }
-
-    public SAMFormatException(final String s) {
-        super(s);
-    }
-
-    public SAMFormatException(final String s, final Throwable throwable) {
-        super(s, throwable);
-    }
-
-    public SAMFormatException(final Throwable throwable) {
-        super(throwable);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMHeaderRecordComparator.java b/src/main/java/htsjdk/samtools/SAMHeaderRecordComparator.java
deleted file mode 100644
index f48df4d..0000000
--- a/src/main/java/htsjdk/samtools/SAMHeaderRecordComparator.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * The MIT License
- * <p/>
- * Copyright (c) 2014 The Broad Institute
- * <p/>
- * 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:
- * <p/>
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * <p/>
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * Provides ordering based on SAM header records' attribute values. Provide the list of attributes to use
- * in the comparison to the constructor. Null attribute values (i.e., those attributes not present in the
- * record) sort behind those that have values.
- */
-public class SAMHeaderRecordComparator<T extends AbstractSAMHeaderRecord> implements Comparator<T>, Serializable {
-	private static final long serialVersionUID = 1L;
-
-	private final String[] attributes;
-
-	public SAMHeaderRecordComparator(final String... attributes) {
-		this.attributes = attributes;
-	}
-
-	@Override
-	public int compare(final T left, final T right) {
-		for (final String attribute : attributes) {
-			final String leftValue = left.getAttribute(attribute);
-			final String rightValue = right.getAttribute(attribute);
-
-			if (leftValue == null) {
-				// Fastest comparison possible; two empty values are
-				// equivalent, so move along to the next attribute
-				if (rightValue == null) continue;
-
-					// Otherwise left < right, since right has a value
-				else return -1;
-			}
-
-			// left is not null; if right is, left > right
-			if (rightValue == null) return 1;
-
-			final int compare = leftValue.compareTo(rightValue);
-			if (compare != 0) return compare;
-		}
-
-		return 0;
-	}
-}
diff --git a/src/main/java/htsjdk/samtools/SAMLineParser.java b/src/main/java/htsjdk/samtools/SAMLineParser.java
deleted file mode 100644
index f73a67e..0000000
--- a/src/main/java/htsjdk/samtools/SAMLineParser.java
+++ /dev/null
@@ -1,487 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2012 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * This class enables creation of a SAMRecord object from a String in SAM text format.  The SAM flag field will be inferred
- * for each record separately, unless the expected format is set using `withSamFlagField`.
- */
-public class SAMLineParser {
-
-    // From SAM specification
-    private static final int QNAME_COL = 0;
-    private static final int FLAG_COL = 1;
-    private static final int RNAME_COL = 2;
-    private static final int POS_COL = 3;
-    private static final int MAPQ_COL = 4;
-    private static final int CIGAR_COL = 5;
-    private static final int MRNM_COL = 6;
-    private static final int MPOS_COL = 7;
-    private static final int ISIZE_COL = 8;
-    private static final int SEQ_COL = 9;
-    private static final int QUAL_COL = 10;
-
-    private static final int NUM_REQUIRED_FIELDS = 11;
-
-    /**
-     * Allocate this once rather than for every line as a performance
-     * optimization. The size is arbitrary -- merely large enough to handle the
-     * maximum number of fields we might expect from a reasonable SAM file.
-     */
-    private final String[] mFields = new String[10000];
-
-    /**
-     * Add information about the origin (reader and position) to SAM records.
-     */
-    private final SamReader mParentReader;
-    private final SAMRecordFactory samRecordFactory;
-    private final ValidationStringency validationStringency;
-    private final SAMFileHeader mFileHeader;
-    private final File mFile;
-    private Optional<SamFlagField> samFlagField = Optional.empty();
-
-    private final TextTagCodec tagCodec = new TextTagCodec();
-
-    private int currentLineNumber;
-    private String currentLine;
-
-    //
-    // Constructors
-    //
-
-    /**
-     * Public constructor. Use the default SAMRecordFactory and stringency.
-     *
-     * @param samFileHeader SAM file header
-     */
-    public SAMLineParser(final SAMFileHeader samFileHeader) {
-
-        this(new DefaultSAMRecordFactory(),
-                ValidationStringency.DEFAULT_STRINGENCY, samFileHeader,
-                null, null);
-    }
-
-    /**
-     * Public constructor. Use the default SAMRecordFactory and stringency.
-     *
-     * @param samFileHeader SAM file header
-     * @param samFileReader SAM file reader For passing to SAMRecord.setFileSource, may be null.
-     * @param samFile       SAM file being read (for error message only, may be null)
-     */
-    public SAMLineParser(final SAMFileHeader samFileHeader,
-                         final SamReader samFileReader, final File samFile) {
-
-        this(new DefaultSAMRecordFactory(),
-                ValidationStringency.DEFAULT_STRINGENCY, samFileHeader,
-                samFileReader, samFile);
-    }
-
-    /**
-     * Public constructor.
-     *
-     * @param samRecordFactory     SamRecord Factory
-     * @param validationStringency validation stringency
-     * @param samFileHeader        SAM file header
-     * @param samFileReader        SAM file reader For passing to SAMRecord.setFileSource, may be null.
-     * @param samFile              SAM file being read (for error message only, may be null)
-     */
-    public SAMLineParser(final SAMRecordFactory samRecordFactory,
-                         final ValidationStringency validationStringency,
-                         final SAMFileHeader samFileHeader, final SamReader samFileReader,
-                         final File samFile) {
-
-        if (samRecordFactory == null)
-            throw new NullPointerException("The SamRecordFactory must be set");
-
-        if (validationStringency == null)
-            throw new NullPointerException("The validationStringency must be set");
-
-        if (samFileHeader == null)
-            throw new NullPointerException("The mFileHeader must be set");
-
-        this.samRecordFactory = samRecordFactory;
-        this.validationStringency = validationStringency;
-        this.mFileHeader = samFileHeader;
-
-        // Can be null
-        this.mParentReader = samFileReader;
-
-        // Can be null
-        this.mFile = samFile;
-    }
-
-    /**
-     * Get the File header.
-     *
-     * @return the SAM file header
-     */
-    public SAMFileHeader getFileHeader() {
-
-        return this.mFileHeader;
-    }
-
-    /**
-     * Get validation stringency.
-     *
-     * @return validation stringency
-     */
-    public ValidationStringency getValidationStringency() {
-        return this.validationStringency;
-    }
-
-    /**
-     * Sets the expected SAM flag type expected for all records.
-     */
-    public SAMLineParser withSamFlagField(final SamFlagField samFlagField) {
-        if (samFlagField == null) throw new IllegalArgumentException("Sam flag field was null");
-        this.samFlagField = Optional.of(samFlagField);
-        return this;
-    }
-
-    private int parseInt(final String s, final String fieldName) {
-        final int ret;
-        try {
-            ret = Integer.parseInt(s);
-        } catch (NumberFormatException e) {
-            throw reportFatalErrorParsingLine("Non-numeric value in " + fieldName + " column");
-        }
-        return ret;
-    }
-    
-    private int parseFlag(final String s, final String fieldName) {
-        try {
-            return samFlagField.isPresent() ? samFlagField.get().parse(s) : SamFlagField.parseDefault(s);
-        } catch (NumberFormatException e) {
-            throw reportFatalErrorParsingLine("Non-numeric value in " + fieldName + " column");
-        } catch (SAMFormatException e) {
-            throw reportFatalErrorParsingLine("Error in " + fieldName + " column: " + e.getMessage(), e);
-        }
-    }
-
-    private void validateReferenceName(final String rname, final String fieldName) {
-        if (rname.equals("=")) {
-            if (fieldName.equals("MRNM")) {
-                return;
-            }
-            reportErrorParsingLine("= is not a valid value for "
-                    + fieldName + " field.");
-        }
-        if (!this.mFileHeader.getSequenceDictionary().isEmpty()) {
-            if (this.mFileHeader.getSequence(rname) == null) {
-                reportErrorParsingLine(fieldName
-                        + " '" + rname + "' not found in any SQ record");
-            }
-        }
-    }
-
-    /**
-     * Parse a SAM line.
-     *
-     * @param line line to parse
-     * @return a new SAMRecord object
-     */
-    public SAMRecord parseLine(final String line) {
-
-        return parseLine(line, -1);
-    }
-
-    /**
-     * Parse a SAM line.
-     *
-     * @param line       line to parse
-     * @param lineNumber line number in the file. If the line number is not known
-     *                   can be <=0.
-     * @return a new SAMRecord object
-     */
-    public SAMRecord parseLine(final String line, final int lineNumber) {
-
-        this.currentLineNumber = lineNumber;
-        this.currentLine = line;
-
-        final int numFields = StringUtil.split(line, mFields, '\t');
-        if (numFields < NUM_REQUIRED_FIELDS) {
-            throw reportFatalErrorParsingLine("Not enough fields");
-        }
-        if (numFields == mFields.length) {
-            reportErrorParsingLine("Too many fields in SAM text record.");
-        }
-        for (int i = 0; i < numFields; ++i) {
-            if (mFields[i].isEmpty()) {
-                reportErrorParsingLine("Empty field at position " + i + " (zero-based)");
-            }
-        }
-        final SAMRecord samRecord =
-                samRecordFactory.createSAMRecord(this.mFileHeader);
-        samRecord.setValidationStringency(this.validationStringency);
-        if (mParentReader != null)
-            samRecord.setFileSource(new SAMFileSource(mParentReader, null));
-        samRecord.setHeader(this.mFileHeader);
-        samRecord.setReadName(mFields[QNAME_COL]);
-
-        final int flags = parseFlag(mFields[FLAG_COL], "FLAG");
-        samRecord.setFlags(flags);
-
-        String rname = mFields[RNAME_COL];
-        if (!rname.equals("*")) {
-            rname = SAMSequenceRecord.truncateSequenceName(rname);
-            validateReferenceName(rname, "RNAME");
-            samRecord.setReferenceName(rname);
-        } else if (!samRecord.getReadUnmappedFlag()) {
-            reportErrorParsingLine("RNAME is not specified but flags indicate mapped");
-        }
-
-        final int pos = parseInt(mFields[POS_COL], "POS");
-        final int mapq = parseInt(mFields[MAPQ_COL], "MAPQ");
-        final String cigar = mFields[CIGAR_COL];
-        if (!SAMRecord.NO_ALIGNMENT_REFERENCE_NAME.equals(samRecord
-                .getReferenceName())) {
-            if (pos == 0) {
-                reportErrorParsingLine("POS must be non-zero if RNAME is specified");
-            }
-            if (!samRecord.getReadUnmappedFlag() && cigar.equals("*")) {
-                reportErrorParsingLine("CIGAR must not be '*' if RNAME is specified");
-            }
-        } else {
-            if (pos != 0) {
-                reportErrorParsingLine("POS must be zero if RNAME is not specified");
-            }
-            if (mapq != 0) {
-                reportErrorParsingLine("MAPQ must be zero if RNAME is not specified");
-            }
-            if (!cigar.equals("*")) {
-                reportErrorParsingLine("CIGAR must be '*' if RNAME is not specified");
-            }
-        }
-        samRecord.setAlignmentStart(pos);
-        samRecord.setMappingQuality(mapq);
-        samRecord.setCigarString(cigar);
-
-        String mateRName = mFields[MRNM_COL];
-        if (mateRName.equals("*")) {
-            if (samRecord.getReadPairedFlag() && !samRecord.getMateUnmappedFlag()) {
-                reportErrorParsingLine("MRNM not specified but flags indicate mate mapped");
-            }
-        } else {
-            if (!samRecord.getReadPairedFlag()) {
-                reportErrorParsingLine("MRNM specified but flags indicate unpaired");
-            }
-            if (!"=".equals(mateRName)) {
-                mateRName = SAMSequenceRecord.truncateSequenceName(mateRName);
-            }
-            validateReferenceName(mateRName, "MRNM");
-            if (mateRName.equals("=")) {
-                if (samRecord.getReferenceName() == null) {
-                    reportErrorParsingLine("MRNM is '=', but RNAME is not set");
-                }
-                samRecord.setMateReferenceName(samRecord.getReferenceName());
-            } else {
-                samRecord.setMateReferenceName(mateRName);
-            }
-        }
-
-        final int matePos = parseInt(mFields[MPOS_COL], "MPOS");
-        final int isize = parseInt(mFields[ISIZE_COL], "ISIZE");
-        if (!samRecord.getMateReferenceName().equals(
-                SAMRecord.NO_ALIGNMENT_REFERENCE_NAME)) {
-            if (matePos == 0) {
-                reportErrorParsingLine("MPOS must be non-zero if MRNM is specified");
-            }
-        } else {
-            if (matePos != 0) {
-                reportErrorParsingLine("MPOS must be zero if MRNM is not specified");
-            }
-            if (isize != 0) {
-                reportErrorParsingLine("ISIZE must be zero if MRNM is not specified");
-            }
-        }
-        samRecord.setMateAlignmentStart(matePos);
-        samRecord.setInferredInsertSize(isize);
-        if (!mFields[SEQ_COL].equals("*")) {
-            validateReadBases(mFields[SEQ_COL]);
-            samRecord.setReadString(mFields[SEQ_COL]);
-        } else {
-            samRecord.setReadBases(SAMRecord.NULL_SEQUENCE);
-        }
-        if (!mFields[QUAL_COL].equals("*")) {
-            if (samRecord.getReadBases() == SAMRecord.NULL_SEQUENCE) {
-                reportErrorParsingLine("QUAL should not be specified if SEQ is not specified");
-            }
-            if (samRecord.getReadString().length() != mFields[QUAL_COL].length()) {
-                reportErrorParsingLine("length(QUAL) != length(SEQ)");
-            }
-            samRecord.setBaseQualityString(mFields[QUAL_COL]);
-        } else {
-            samRecord.setBaseQualities(SAMRecord.NULL_QUALS);
-        }
-
-        for (int i = NUM_REQUIRED_FIELDS; i < numFields; ++i) {
-            parseTag(samRecord, mFields[i]);
-        }
-
-        // Only call samRecord.isValid() if errors would be reported since the validation
-        // is quite expensive in and of itself.
-        if (this.validationStringency != ValidationStringency.SILENT) {
-            final List<SAMValidationError> validationErrors = samRecord.isValid();
-            if (validationErrors != null) {
-                for (final SAMValidationError errorMessage : validationErrors) {
-                    reportErrorParsingLine(errorMessage.getMessage());
-                }
-            }
-        }
-
-        return samRecord;
-    }
-
-    private void validateReadBases(final String bases) {
-        /*
-        * Using regex is slow, so check for invalid characters via
-        * isValidReadBase(), which hopefully the JIT will optimize. if
-        * (!VALID_BASES.matcher(bases).matches()) {
-        * reportErrorParsingLine("Invalid character in read bases"); }
-        */
-        for (int i = 0; i < bases.length(); ++i) {
-            if (!isValidReadBase(bases.charAt(i))) {
-                reportErrorParsingLine("Invalid character in read bases");
-                return;
-            }
-        }
-    }
-
-    private boolean isValidReadBase(final char base) {
-        switch (base) {
-            case 'a':
-            case 'c':
-            case 'm':
-            case 'g':
-            case 'r':
-            case 's':
-            case 'v':
-            case 't':
-            case 'w':
-            case 'y':
-            case 'h':
-            case 'k':
-            case 'd':
-            case 'b':
-            case 'n':
-            case 'A':
-            case 'C':
-            case 'M':
-            case 'G':
-            case 'R':
-            case 'S':
-            case 'V':
-            case 'T':
-            case 'W':
-            case 'Y':
-            case 'H':
-            case 'K':
-            case 'D':
-            case 'B':
-            case 'N':
-            case '.':
-            case '=':
-                return true;
-            default:
-                return false;
-        }
-    }
-
-    private void parseTag(final SAMRecord samRecord, final String tag) {
-        Map.Entry<String, Object> entry = null;
-        try {
-            entry = tagCodec.decode(tag);
-        } catch (SAMFormatException e) {
-            reportErrorParsingLine(e);
-        }
-        if (entry != null) {
-            if (entry.getValue() instanceof TagValueAndUnsignedArrayFlag) {
-                final TagValueAndUnsignedArrayFlag valueAndFlag =
-                        (TagValueAndUnsignedArrayFlag) entry.getValue();
-                if (valueAndFlag.isUnsignedArray) {
-                    samRecord.setUnsignedArrayAttribute(entry.getKey(),
-                            valueAndFlag.value);
-                } else {
-                    samRecord.setAttribute(entry.getKey(), valueAndFlag.value);
-                }
-            } else {
-                samRecord.setAttribute(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    //
-    // Error methods
-    //
-
-    private RuntimeException reportFatalErrorParsingLine(final String reason) {
-        return new SAMFormatException(makeErrorString(reason));
-    }
-
-    private RuntimeException reportFatalErrorParsingLine(final String reason, final Throwable throwable) {
-        return new SAMFormatException(makeErrorString(reason), throwable);
-    }
-
-    private void reportErrorParsingLine(final String reason) {
-        final String errorMessage = makeErrorString(reason);
-
-        if (validationStringency == ValidationStringency.STRICT) {
-            throw new SAMFormatException(errorMessage);
-        } else if (validationStringency == ValidationStringency.LENIENT) {
-            System.err
-                    .println("Ignoring SAM validation error due to lenient parsing:");
-            System.err.println(errorMessage);
-        }
-    }
-
-    private void reportErrorParsingLine(final Exception e) {
-        final String errorMessage = makeErrorString(e.getMessage());
-        if (validationStringency == ValidationStringency.STRICT) {
-            throw new SAMFormatException(errorMessage);
-        } else if (validationStringency == ValidationStringency.LENIENT) {
-            System.err
-                    .println("Ignoring SAM validation error due to lenient parsing:");
-            System.err.println(errorMessage);
-        }
-    }
-
-    private String makeErrorString(final String reason) {
-        String fileMessage = "";
-        if (mFile != null) {
-            fileMessage = "File " + mFile + "; ";
-        }
-        return "Error parsing text SAM file. "
-                + reason + "; " + fileMessage + "Line "
-                + (this.currentLineNumber <= 0 ? "unknown" : this.currentLineNumber)
-                + "\nLine: " + this.currentLine;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/SAMProgramRecord.java b/src/main/java/htsjdk/samtools/SAMProgramRecord.java
deleted file mode 100644
index 3bbecf9..0000000
--- a/src/main/java/htsjdk/samtools/SAMProgramRecord.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * In-memory representation of @PG SAM header record.
- */
-public class SAMProgramRecord extends AbstractSAMHeaderRecord {
-    public static final String PROGRAM_GROUP_ID_TAG = "ID";
-    public static final String PROGRAM_NAME_TAG = "PN";
-    public static final String PROGRAM_VERSION_TAG = "VN";
-    public static final String COMMAND_LINE_TAG = "CL";
-    public static final String PREVIOUS_PROGRAM_GROUP_ID_TAG = "PP";
-    private String mProgramGroupId;
-    public static final Set<String> STANDARD_TAGS = Collections.unmodifiableSet(
-            new HashSet<String>(Arrays.asList(PROGRAM_GROUP_ID_TAG,
-                    PROGRAM_NAME_TAG,
-                    PROGRAM_VERSION_TAG,
-                    COMMAND_LINE_TAG,
-                    PREVIOUS_PROGRAM_GROUP_ID_TAG)) );
-
-    public SAMProgramRecord(final String programGroupId) {
-        this.mProgramGroupId = programGroupId;
-    }
-
-    public SAMProgramRecord(final String id, SAMProgramRecord srcProgramRecord) {
-        mProgramGroupId = id;
-        for (final Map.Entry<String, String> entry : srcProgramRecord.getAttributes()) {
-            setAttribute(entry.getKey(), entry.getValue());
-        }
-    }
-
-    public String getId() {
-        return getProgramGroupId();
-    }
-
-    public String getProgramGroupId() {
-        return mProgramGroupId;
-    }
-
-    public String getProgramName() {
-        return (String)getAttribute(PROGRAM_NAME_TAG);
-    }
-
-    public void setProgramName(final String name) {
-        setAttribute(PROGRAM_NAME_TAG, name);
-    }
-
-    public String getProgramVersion() {
-        return (String)getAttribute(PROGRAM_VERSION_TAG);
-    }
-
-    public void setProgramVersion(final String version) {
-        setAttribute(PROGRAM_VERSION_TAG, version);
-    }
-
-    public String getCommandLine() {
-        return (String)getAttribute(COMMAND_LINE_TAG);
-    }
-
-    public void setCommandLine(final String commandLine) {
-        setAttribute(COMMAND_LINE_TAG, commandLine);
-    }
-
-    public String getPreviousProgramGroupId() {
-        return (String)getAttribute(PREVIOUS_PROGRAM_GROUP_ID_TAG);
-    }
-
-    public void setPreviousProgramGroupId(final String id) {
-        setAttribute(PREVIOUS_PROGRAM_GROUP_ID_TAG, id);
-    }
-
-
-
-    /**
-     * @return true if this == that except for the program group ID, which is arbitrary
-     */
-    public boolean equivalent(final SAMProgramRecord that) {
-        return attributesEqual(that);
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final SAMProgramRecord that = (SAMProgramRecord) o;
-
-        if (!attributesEqual(that)) return false;
-        if (mProgramGroupId != null ? !mProgramGroupId.equals(that.mProgramGroupId) : that.mProgramGroupId != null) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = mProgramGroupId != null ? mProgramGroupId.hashCode() : 0;
-        result = 31 * result + attributesHashCode();
-        return result;
-    }
-
-    Set<String> getStandardTags() {
-        return STANDARD_TAGS;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMReadGroupRecord.java b/src/main/java/htsjdk/samtools/SAMReadGroupRecord.java
deleted file mode 100644
index fd81852..0000000
--- a/src/main/java/htsjdk/samtools/SAMReadGroupRecord.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.Iso8601Date;
-
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Header information about a read group.
- */
-public class SAMReadGroupRecord extends AbstractSAMHeaderRecord
-{
-    private String mReadGroupId = null;
-    public static final String READ_GROUP_ID_TAG = "ID";
-    public static final String SEQUENCING_CENTER_TAG = "CN";
-    public static final String DESCRIPTION_TAG = "DS";
-    public static final String DATE_RUN_PRODUCED_TAG = "DT";
-    public static final String FLOW_ORDER_TAG = "FO";
-    public static final String KEY_SEQUENCE_TAG = "KS";
-    public static final String LIBRARY_TAG = "LB";
-    public static final String PROGRAM_GROUP_TAG = "PG";
-    public static final String PREDICTED_MEDIAN_INSERT_SIZE_TAG = "PI";
-    public static final String PLATFORM_TAG = "PL";
-    public static final String PLATFORM_MODEL_TAG = "PM";
-    public static final String PLATFORM_UNIT_TAG = "PU";
-    public static final String READ_GROUP_SAMPLE_TAG = "SM";
-
-    /* Platform values for the @RG-PL tag */
-    public enum PlatformValue {
-        CAPILLARY, LS454, ILLUMINA,
-        SOLID, HELICOS, IONTORRENT, 
-        ONT, PACBIO
-    }
-
-    public static final Set<String> STANDARD_TAGS =
-            new HashSet<String>(Arrays.asList(READ_GROUP_ID_TAG, SEQUENCING_CENTER_TAG, DESCRIPTION_TAG,
-                    DATE_RUN_PRODUCED_TAG, FLOW_ORDER_TAG, KEY_SEQUENCE_TAG, LIBRARY_TAG,
-                    PROGRAM_GROUP_TAG, PREDICTED_MEDIAN_INSERT_SIZE_TAG, PLATFORM_TAG, PLATFORM_MODEL_TAG,
-                    PLATFORM_UNIT_TAG, READ_GROUP_SAMPLE_TAG));
-
-    public SAMReadGroupRecord(final String id) { mReadGroupId = id; }
-
-    public SAMReadGroupRecord(final String id, final SAMReadGroupRecord srcProgramRecord) {
-        mReadGroupId = id;
-        for (final Map.Entry<String, String> entry : srcProgramRecord.getAttributes()) {
-            setAttribute(entry.getKey(), entry.getValue());
-        }
-    }
-
-    public String getId() { return getReadGroupId();  }
-    public String getReadGroupId() { return mReadGroupId; }
-
-    public String getSample() { return getAttribute(READ_GROUP_SAMPLE_TAG); }
-    public void setSample(final String value) { setAttribute(READ_GROUP_SAMPLE_TAG, value); }
-
-    public String getLibrary() { return getAttribute(LIBRARY_TAG); }
-    public void setLibrary(final String value) { setAttribute(LIBRARY_TAG, value); }
-
-    public String getPlatformUnit() { return getAttribute(PLATFORM_UNIT_TAG); }
-    public void setPlatformUnit(final String pu) { setAttribute(PLATFORM_UNIT_TAG, pu); }
-
-    public String getPlatform() { return getAttribute(PLATFORM_TAG); }
-    public void setPlatform(final String platform) { setAttribute(PLATFORM_TAG, platform); }
-
-    public Date getRunDate() {
-        final String dt = getAttribute(DATE_RUN_PRODUCED_TAG);
-        if (dt == null) return null;
-        else return new Iso8601Date(dt);
-    }
-
-    public String getFlowOrder() { return getAttribute(FLOW_ORDER_TAG); }
-    public void setFlowOrder(final String flowOrder) { setAttribute(FLOW_ORDER_TAG, flowOrder); }
-
-    public String getKeySequence() { return getAttribute(KEY_SEQUENCE_TAG); }
-    public void setKeySequence(final String keySequence) { setAttribute(KEY_SEQUENCE_TAG, keySequence); }
-
-    /**
-     * Converts to Iso8601Date if not already in that form.
-     */
-    public void setRunDate(Date runDate) {
-        if (runDate != null && !(runDate instanceof Iso8601Date)) {
-            runDate = new Iso8601Date(runDate);
-        }
-        setAttribute(DATE_RUN_PRODUCED_TAG, runDate != null ? runDate.toString() : null);
-    }
-
-    public String getSequencingCenter() { return getAttribute(SEQUENCING_CENTER_TAG); }
-    public void setSequencingCenter(final String center) { setAttribute(SEQUENCING_CENTER_TAG, center); }
-
-    public String getDescription() { return getAttribute(DESCRIPTION_TAG); }
-    public void setDescription(final String description) { setAttribute(DESCRIPTION_TAG, description); }
-
-    public Integer getPredictedMedianInsertSize() {
-        final String stringRep = getAttribute(PREDICTED_MEDIAN_INSERT_SIZE_TAG);
-        if (stringRep == null) return null;
-        return Integer.parseInt(stringRep); 
-    }
-    public void setPredictedMedianInsertSize(final Integer predictedMedianInsertSize) {
-
-        setAttribute(PREDICTED_MEDIAN_INSERT_SIZE_TAG, (predictedMedianInsertSize == null? null: predictedMedianInsertSize.toString())); 
-    }
-
-    public String getProgramGroup() { return getAttribute(PROGRAM_GROUP_TAG); }
-    public void setProgramGroup(final String programGroup) { setAttribute(PROGRAM_GROUP_TAG, programGroup); }
-
-    public String getPlatformModel() { return getAttribute(PLATFORM_MODEL_TAG); }
-    public void setPlatformModel(final String platformModel) { setAttribute(PLATFORM_MODEL_TAG, platformModel); }
-    
-    /**
-     * @return true if this == that except for the read group ID, which is arbitrary
-     */
-    public boolean equivalent(final SAMReadGroupRecord that) {
-        return attributesEqual(that);
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final SAMReadGroupRecord that = (SAMReadGroupRecord) o;
-
-        if (!attributesEqual(that)) return false;
-        if (mReadGroupId != null ? !mReadGroupId.equals(that.mReadGroupId) : that.mReadGroupId != null) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return mReadGroupId.hashCode();
-    }
-
-    Set<String> getStandardTags() {
-        return STANDARD_TAGS;
-    }
-}
-
diff --git a/src/main/java/htsjdk/samtools/SAMRecord.java b/src/main/java/htsjdk/samtools/SAMRecord.java
deleted file mode 100644
index 13ec386..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecord.java
+++ /dev/null
@@ -1,2378 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.Locatable;
-import htsjdk.samtools.util.SequenceUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.util.*;
-
-
-/**
- * Java binding for a SAM file record.  c.f. http://samtools.sourceforge.net/SAM1.pdf
- * <p>
- * The presence of reference name/reference index and alignment start
- * do not necessarily mean that a read is aligned.  Those values may merely be set to force a SAMRecord
- * to appear in a certain place in the sort order.  The readUnmappedFlag must be checked to determine whether
- * or not a read is mapped.  Only if the readUnmappedFlag is false can the reference name/index and alignment start
- * be interpreted as indicating an actual alignment position.
- * <p>
- * Likewise, presence of mate reference name/index and mate alignment start do not necessarily mean that the
- * mate is aligned.  These may be set for an unaligned mate if the mate has been forced into a particular place
- * in the sort order per the above paragraph.  Only if the mateUnmappedFlag is false can the mate reference name/index
- * and mate alignment start be interpreted as indicating the actual alignment position of the mate.
- * <p>
- * Note also that there are a number of getters & setters that are linked, i.e. they present different representations
- * of the same underlying data.  In these cases there is typically a representation that is preferred because it
- * ought to be faster than some other representation.  The following are the preferred representations:
- * </p><ul>
- * <li>getReadNameLength() is preferred to getReadName().length()</li>
- * <li>get/setReadBases() is preferred to get/setReadString()</li>
- * <li>get/setBaseQualities() is preferred to get/setBaseQualityString()</li>
- * <li>get/setReferenceIndex() is preferred to get/setReferenceName() for records with valid SAMFileHeaders</li>
- * <li>get/setMateReferenceIndex() is preferred to get/setMateReferenceName() for records with valid SAMFileHeaders</li>
- * <li>getCigarLength() is preferred to getCigar().getNumElements()</li>
- * <li>get/setCigar() is preferred to get/setCigarString()</li>
- * </ul>
- * <p>
- * setHeader() is called by the SAM reading code, so the get/setReferenceIndex() and get/setMateReferenceIndex()
- * methods will have access to the sequence dictionary to resolve reference and mate reference names to dictionary
- * indices.
- * <p>
- * setHeader() need not be called explicitly when writing SAMRecords, however the writers require a record
- * in order to call get/setReferenceIndex() and get/setMateReferenceIndex(). Therefore adding records to a writer
- * has a side effect: any record that does not have an assigned header at the time it is added to a writer will be
- * updated and assigned the header associated with the writer.
- * <p>
- * Some of the get() methods return values that are mutable, due to the limitations of Java.  A caller should
- * never change the value returned by a get() method.  If you want to change the value of some attribute of a
- * SAMRecord, create a new value object and call the appropriate set() method.
- * </p>
- * Note that setIndexingBin() need not be called when writing SAMRecords.  It will be computed as necessary.  It is only
- * present as an optimization in the event that the value is already known and need not be computed.
- * <p>
- * By default, extensive validation of SAMRecords is done when they are read.  Very limited validation is done when
- * values are set onto SAMRecords.
- * <p>
- * <h3>Notes on Headerless SAMRecords</h3>
- * <p>
- * If the header is null, the following SAMRecord methods may throw exceptions:
- * <ul>
- * <li>getReferenceIndex</li>
- * <li>setReferenceIndex</li>
- * <li>getMateReferenceIndex</li>
- * <li>setMateReferenceIndex</li>
- * </ul><p>
- * Record comparators (i.e. SAMRecordCoordinateComparator and SAMRecordDuplicateComparator) require records with
- * non-null header values.
- * <p>
- * A record with null a header may be validated by the isValid method, but the reference and mate reference indices,
- * read group, sequence dictionary, and alignment start will not be fully validated unless a header is present.
- * <p>
- * Also, SAMTextWriter, BAMFileWriter, and CRAMFileWriter all require the reference and mate reference names to be valid
- * in order to be written. At the time a record is added to a writer it will be updated to use the header associated
- * with the writer and the reference and mate reference names must be valid for that header. If the names cannot be
- * resolved using the writer's header, an exception will be thrown.
- * <p>
- * @author alecw at broadinstitute.org
- * @author mishali.naik at intel.com
- */
-public class SAMRecord implements Cloneable, Locatable, Serializable {
-    public static final long serialVersionUID = 1L;
-
-    /**
-     * Alignment score for a good alignment, but where computing a Phred-score is not feasible. 
-     */
-    public static final int UNKNOWN_MAPPING_QUALITY = 255;
-
-    /**
-     * Alignment score for an unaligned read.
-     */
-    public static final int NO_MAPPING_QUALITY = 0;
-
-    /**
-     * If a read has this reference name, it is unaligned, but not all unaligned reads have
-     * this reference name (see above).
-     */
-    public static final String NO_ALIGNMENT_REFERENCE_NAME = "*";
-
-    /**
-     * If a read has this reference index, it is unaligned, but not all unaligned reads have
-     * this reference index (see above).
-     */
-    public static final int NO_ALIGNMENT_REFERENCE_INDEX = -1;
-
-    /**
-     * Cigar string for an unaligned read.
-     */
-    public static final String NO_ALIGNMENT_CIGAR = "*";
-
-    /**
-     * If a read has reference name "*", it will have this value for position.
-     */
-    public static final int NO_ALIGNMENT_START = GenomicIndexUtil.UNSET_GENOMIC_LOCATION;
-
-    /**
-     * This should rarely be used, since a read with no sequence doesn't make much sense.
-     */
-    public static final byte[] NULL_SEQUENCE = new byte[0];
-
-    public static final String NULL_SEQUENCE_STRING = "*";
-
-    /**
-     * This should rarely be used, since all reads should have quality scores.
-     */
-    public static final byte[] NULL_QUALS = new byte[0];
-    public static final String NULL_QUALS_STRING = "*";
-
-    /**
-     * abs(insertSize) must be <= this
-     */
-    public static final int MAX_INSERT_SIZE = 1<<29;
-
-    /**
-     * Tags that are known to need the reverse complement if the read is reverse complemented.
-     */
-    public static List<String> TAGS_TO_REVERSE_COMPLEMENT = Arrays.asList(SAMTag.E2.name(), SAMTag.SQ.name());
-
-    /**
-     * Tags that are known to need the reverse if the read is reverse complemented.
-     */
-    public static List<String> TAGS_TO_REVERSE = Arrays.asList(SAMTag.OQ.name(), SAMTag.U2.name());
-
-    private String mReadName = null;
-    private byte[] mReadBases = NULL_SEQUENCE;
-    private byte[] mBaseQualities = NULL_QUALS;
-    private String mReferenceName = NO_ALIGNMENT_REFERENCE_NAME;
-    private int mAlignmentStart = NO_ALIGNMENT_START;
-    private transient int mAlignmentEnd = NO_ALIGNMENT_START;
-    private int mMappingQuality = NO_MAPPING_QUALITY;
-    private String mCigarString = NO_ALIGNMENT_CIGAR;
-    private Cigar mCigar = null;
-    private List<AlignmentBlock> mAlignmentBlocks = null;
-    private int mFlags = 0;
-    private String mMateReferenceName = NO_ALIGNMENT_REFERENCE_NAME;
-    private int mMateAlignmentStart = 0;
-    private int mInferredInsertSize = 0;
-    private SAMBinaryTagAndValue mAttributes = null;
-    protected Integer mReferenceIndex = null;
-    protected Integer mMateReferenceIndex = null;
-    private Integer mIndexingBin = null;
-
-    /**
-     * Some attributes (e.g. CIGAR) are not decoded immediately.  Use this to decide how to validate when decoded.
-     */
-    private ValidationStringency mValidationStringency = ValidationStringency.SILENT;
-
-    /**
-     * File source of this record. May be null. Note that this field is not serializable (and therefore marked
-     * as transient) due to encapsulated stream objects within it -- so serializing a SAMRecord will cause its
-     * file source to be lost (if it had one).
-     */
-    private transient SAMFileSource mFileSource;
-    private SAMFileHeader mHeader = null;
-
-    /** Transient Map of attributes for use by anyone. */
-    private transient Map<Object,Object> transientAttributes;
-
-    public SAMRecord(final SAMFileHeader header) {
-        mHeader = header;
-    }
-
-    public String getReadName() {
-        return mReadName;
-    }
-
-    /**
-     * This method is preferred over getReadName().length(), because for BAMRecord
-     * it may be faster.
-     * @return length not including a null terminator.
-     */
-    public int getReadNameLength() {
-        return mReadName.length();
-    }
-
-    public void setReadName(final String value) {
-        mReadName = value;
-    }
-
-    /**
-     * @return read sequence as a string of ACGTN=.
-     */
-    public String getReadString() {
-        final byte[] readBases = getReadBases();
-        if (readBases.length == 0) {
-            return NULL_SEQUENCE_STRING;
-        }
-        return StringUtil.bytesToString(readBases);
-    }
-
-    public void setReadString(final String value) {
-        if (NULL_SEQUENCE_STRING.equals(value)) {
-            mReadBases = NULL_SEQUENCE;
-        } else {
-            final byte[] bases = StringUtil.stringToBytes(value);
-            SAMUtils.normalizeBases(bases);
-            setReadBases(bases);
-        }
-    }
-
-
-    /**
-     * Do not modify the value returned by this method.  If you want to change the bases, create a new
-     * byte[] and call setReadBases() or call setReadString().
-     * @return read sequence as ASCII bytes ACGTN=.
-     */
-    public byte[] getReadBases() {
-        return mReadBases;
-    }
-
-    public void setReadBases(final byte[] value) {
-        mReadBases = value;
-    }
-
-    /**
-     * This method is preferred over getReadBases().length, because for BAMRecord it may be faster.
-     * @return number of bases in the read.
-     */
-    public int getReadLength() {
-        return getReadBases().length;
-    }
-
-    /**
-     * @return Base qualities, encoded as a FASTQ string.
-     */
-    public String getBaseQualityString() {
-        if (Arrays.equals(NULL_QUALS, getBaseQualities())) {
-            return NULL_QUALS_STRING;
-        }
-        return SAMUtils.phredToFastq(getBaseQualities());
-    }
-
-    public void setBaseQualityString(final String value) {
-        if (NULL_QUALS_STRING.equals(value)) {
-            setBaseQualities(NULL_QUALS);
-        } else {
-            setBaseQualities(SAMUtils.fastqToPhred(value));
-        }
-    }
-
-    /**
-     * Do not modify the value returned by this method.  If you want to change the qualities, create a new
-     * byte[] and call setBaseQualities() or call setBaseQualityString().
-     * @return Base qualities, as binary phred scores (not ASCII).
-     */
-    public byte[] getBaseQualities() {
-        return mBaseQualities;
-    }
-
-    public void setBaseQualities(final byte[] value) {
-        mBaseQualities = value;
-    }
-
-    /**
-     * If the original base quality scores have been store in the "OQ" tag will return the numeric
-     * score as a byte[]
-     */
-    public byte[] getOriginalBaseQualities() {
-        final String oqString = (String) getAttribute("OQ");
-        if (oqString != null && !oqString.isEmpty()) {
-            return SAMUtils.fastqToPhred(oqString);
-        }
-        else {
-            return null;
-        }
-    }
-
-    /**
-     * Sets the original base quality scores into the "OQ" tag as a String.  Supplied value should be
-     * as phred-scaled numeric qualities.
-     */
-    public void setOriginalBaseQualities(final byte[] oq) {
-        setAttribute("OQ", SAMUtils.phredToFastq(oq));
-    }
-
-    private static boolean hasReferenceName(final Integer referenceIndex, final String referenceName) {
-        return (referenceIndex != null && !referenceIndex.equals(NO_ALIGNMENT_REFERENCE_INDEX)) ||
-                (!NO_ALIGNMENT_REFERENCE_NAME.equals(referenceName));
-    }
-
-    /**
-     * @return true if this SAMRecord has a reference, either as a String or index (or both).
-     */
-    private boolean hasReferenceName() {
-        return hasReferenceName(mReferenceIndex, mReferenceName);
-    }
-
-    /**
-     * @return true if this SAMRecord has a mate reference, either as a String or index (or both).
-     */
-    private boolean hasMateReferenceName() {
-        return hasReferenceName(mMateReferenceIndex, mMateReferenceName);
-    }
-
-    /**
-     * @return Reference name, or NO_ALIGNMENT_REFERENCE_NAME (*) if the record has no reference name
-     */
-    public String getReferenceName() { return mReferenceName; }
-
-    /**
-     * Sets the reference name for this record. If the record has a valid SAMFileHeader and the reference
-     * name is present in the associated sequence dictionary, the record's reference index will also be
-     * updated with the corresponding sequence index. If referenceName is NO_ALIGNMENT_REFERENCE_NAME, sets
-     * the reference index to NO_ALIGNMENT_REFERENCE_INDEX.
-     *
-     * @param referenceName - must not be null
-     * @throws IllegalArgumentException if {@code referenceName} is null
-     */
-    public void setReferenceName(final String referenceName) {
-        if (null == referenceName) {
-            throw new IllegalArgumentException(
-                    "Reference name must not be null. Use SAMRecord.NO_ALIGNMENT_REFERENCE_NAME to reset the reference name.");
-        }
-        if (null != mHeader) {
-            mReferenceIndex = resolveIndexFromName(referenceName, mHeader, false);
-            // String.intern() is surprisingly expensive, so avoid it by calling resolveNameFromIndex
-            // and using the interned value in the sequence dictionary if possible
-            mReferenceName = null == mReferenceIndex ?
-                                    referenceName.intern() :
-                                    resolveNameFromIndex(mReferenceIndex, mHeader);
-        }
-        else if (NO_ALIGNMENT_REFERENCE_NAME.equals(referenceName)) {
-            mReferenceName = NO_ALIGNMENT_REFERENCE_NAME;
-            mReferenceIndex = NO_ALIGNMENT_REFERENCE_INDEX;
-        }
-        else {
-            mReferenceName = referenceName.intern();
-            mReferenceIndex = null;
-        }
-    }
-
-    /**
-     * Returns the reference index for this record.
-     *
-     * If the reference name for this record has previously been resolved against the sequence dictionary, the corresponding
-     * index is returned directly. Otherwise, the record must have a non-null SAMFileHeader that can be used to
-     * resolve the index for the record's current reference name, unless the reference name is NO_ALIGNMENT_REFERENCE_NAME.
-     * If the record has a header, and the name does not appear in the header's sequence dictionary, the value
-     * NO_ALIGNMENT_REFERENCE_INDEX (-1) will be returned. If the record does not have a header, an IllegalStateException
-     * is thrown.
-     *
-     * @return Index in the sequence dictionary of the reference sequence. If the read has no reference sequence, or if
-     * the reference name is not found in the sequence index, NO_ALIGNMENT_REFERENCE_INDEX (-1) is returned.
-     *
-     * @throws IllegalStateException if the reference index must be resolved but cannot be because the SAMFileHeader
-     * for the record is null.
-     */
-    public Integer getReferenceIndex() {
-        if (null == mReferenceIndex) { // try to resolve the reference index
-            mReferenceIndex = resolveIndexFromName(mReferenceName, mHeader, false);
-            if (null == mReferenceIndex) {
-                mReferenceIndex = NO_ALIGNMENT_REFERENCE_INDEX;
-            }
-        }
-        return mReferenceIndex;
-    }
-
-    /**
-     * Updates the reference index. The record must have a valid SAMFileHeader unless the referenceIndex parameter equals
-     * NO_ALIGNMENT_REFERENCE_INDEX, and the reference index must appear in  the header's sequence dictionary. If the
-     * reference index is valid, the reference name will also be resolved and updated to the name for the sequence
-     * dictionary entry corresponding to the index.
-     *
-     * @param referenceIndex Must either equal NO_ALIGNMENT_REFERENCE_INDEX (-1) indicating no reference, or the
-     *                       record must have a SAMFileHeader and the index must exist in the associated sequence
-     *                       dictionary.
-     * @throws IllegalStateException if {@code referenceIndex} is not equal to NO_ALIGNMENT_REFERENCE_INDEX and the
-     * SAMFileHeader is null for this record
-     * @throws IllegalArgumentException if {@code referenceIndex} is not found in the sequence dictionary in the header
-     * for this record.
-     */
-    public void setReferenceIndex(final int referenceIndex) {
-        // resolveNameFromIndex throws if the index can't be resolved
-        setReferenceName(resolveNameFromIndex(referenceIndex, mHeader));
-        // setReferenceName does this as a side effect, but set the value here to be explicit
-        mReferenceIndex = referenceIndex;
-    }
-
-    /**
-     * @return Mate reference name, or NO_ALIGNMENT_REFERENCE_NAME (*) if the record has no mate reference name
-     */
-    public String getMateReferenceName() {
-        return mMateReferenceName;
-    }
-
-    /**
-     * Sets the mate reference name for this record. If the record has a valid SAMFileHeader and the mate reference
-     * name is present in the associated sequence dictionary, the record's mate reference index will also be
-     * updated with the corresponding sequence index. If mateReferenceName is NO_ALIGNMENT_REFERENCE_NAME, sets the
-     * mate reference index to NO_ALIGNMENT_REFERENCE_INDEX.
-     *
-     * @param mateReferenceName - must not be null
-     * @throws IllegalArgumentException if {@code mateReferenceName} is null
-     */
-    public void setMateReferenceName(final String mateReferenceName) {
-        if (null == mateReferenceName) {
-            throw new IllegalArgumentException("Mate reference name must not be null. Use SAMRecord.NO_ALIGNMENT_REFERENCE_NAME to reset the mate reference name.");
-        }
-        if (null != mHeader) {
-            mMateReferenceIndex = resolveIndexFromName(mateReferenceName, mHeader, false);
-            // String.intern() is surprisingly expensive, so avoid it by calling resolveNameFromIndex
-            // and using the interned value in the sequence dictionary if possible
-            mMateReferenceName = null == mMateReferenceIndex ?
-                                   mateReferenceName.intern() :
-                                   resolveNameFromIndex(mMateReferenceIndex, mHeader);
-        }
-        else if (NO_ALIGNMENT_REFERENCE_NAME.equals(mateReferenceName)) {
-            mMateReferenceName = NO_ALIGNMENT_REFERENCE_NAME;
-            mMateReferenceIndex = NO_ALIGNMENT_REFERENCE_INDEX;
-        }
-        else {
-            mMateReferenceName = mateReferenceName.intern();
-            mMateReferenceIndex = null;
-        }
-    }
-
-    /**
-     * Returns the mate reference index for this record.
-     *
-     * If the mate reference name for this record has previously been resolved against the sequence dictionary, the
-     * corresponding index is returned directly. Otherwise, the record must have a non-null SAMFileHeader that can be
-     * used to resolve the index for the record's current mate reference name, unless the mate reference name is
-     * NO_ALIGNMENT_REFERENCE_NAME. If the record has a header, and the name does not appear in the header's
-     * sequence dictionary, the value NO_ALIGNMENT_REFERENCE_INDEX (-1) will be returned. If the record does not have
-     * a header, an IllegalStateException is thrown.
-     *
-     * @return Index in the sequence dictionary of the mate reference sequence. If the read has no mate reference
-     * sequence, or if the mate reference name is not found in the sequence index, NO_ALIGNMENT_REFERENCE_INDEX (-1)
-     * is returned.
-     *
-     * @throws IllegalStateException if the mate reference index must be resolved but cannot be because the
-     * SAMFileHeader for the record is null.
-     */
-    public Integer getMateReferenceIndex() {
-        if (null == mMateReferenceIndex) { // try to resolve the mate reference index
-            mMateReferenceIndex = resolveIndexFromName(mMateReferenceName, mHeader, false);
-            if (null == mMateReferenceIndex) {
-                mMateReferenceIndex = NO_ALIGNMENT_REFERENCE_INDEX;
-            }
-        }
-        return mMateReferenceIndex;
-    }
-
-    /**
-     * Updates the mate reference index. The record must have a valid SAMFileHeader, and the mate reference index must appear in
-     * the header's sequence dictionary, unless the mateReferenceIndex parameter equals NO_ALIGNMENT_REFERENCE_INDEX. If the mate
-     * reference index is valid, the mate reference name will also be resolved and updated to the name for the sequence dictionary
-     * entry corresponding to the index.
-     *
-     * @param mateReferenceIndex Must either equal NO_ALIGNMENT_REFERENCE_INDEX (-1) indicating no reference, or the
-     *                       record must have a SAMFileHeader and the index must exist in the associated sequence
-     *                       dictionary.
-     * @throws IllegalStateException if the SAMFileHeader is null for this record
-     * @throws IllegalArgumentException if the mate reference index is not found in the sequence dictionary in the header for this record.
-     */
-    public void setMateReferenceIndex(final int mateReferenceIndex) {
-        // resolveNameFromIndex throws if the index can't be resolved
-        setMateReferenceName(resolveNameFromIndex(mateReferenceIndex, mHeader));
-        // setMateReferenceName does this as a side effect, but set the value here to be explicit
-        mMateReferenceIndex = mateReferenceIndex;
-    }
-
-    /**
-     * Static method that resolves and returns the reference index corresponding to a given reference name.
-     *
-     * @param referenceName If {@code referenceName} is NO_ALIGNMENT_REFERENCE_NAME, the value NO_ALIGNMENT_REFERENCE_INDEX
-     *                      is returned directly. Otherwise {@code referenceName}  must be looked up in the header's sequence
-     *                      dictionary.
-     * @param header SAMFileHeader to use when resolving {@code referenceName} to an index. Must be non null if the
-     *                {@code referenceName} is not NO_ALIGNMENT_REFERENCE_NAME.
-     * @param strict if true, throws if {@code referenceName}  does not appear in the header's sequence dictionary
-     * @returns the reference index corresponding to the {@code referenceName}, or null if strict is false and {@code referenceName}
-     * does not appear in the header's sequence dictionary.
-     * @throws IllegalStateException if {@code referenceName} is not equal to NO_ALIGNMENT_REFERENCE_NAME and the header is null
-     * @throws IllegalArgumentException if strict is true and the name does not appear in header's sequence dictionary.
-     *
-     * Does not mutate the SAMRecord.
-     */
-    protected static Integer resolveIndexFromName(final String referenceName, final SAMFileHeader header, final boolean strict) {
-        Integer referenceIndex = NO_ALIGNMENT_REFERENCE_INDEX;
-        if (!NO_ALIGNMENT_REFERENCE_NAME.equals(referenceName)) {
-            if (null == header) {
-                throw new IllegalStateException("A non-null SAMFileHeader is required to resolve the reference index or name");
-            }
-            referenceIndex = header.getSequenceIndex(referenceName);
-            if (NO_ALIGNMENT_REFERENCE_INDEX == referenceIndex) {
-                if (strict) {
-                    throw new IllegalArgumentException("Reference index for '" + referenceName + "' not found in sequence dictionary.");
-                }
-                else {
-                    referenceIndex = null;  // unresolved.
-                }
-            }
-        }
-        return referenceIndex;
-    }
-
-    /**
-     * Static method that resolves and returns the reference name corresponding to a given reference index.
-     *
-     * @param referenceIndex If {@code referenceIndex} is NO_ALIGNMENT_REFERENCE_INDEX, the value NO_ALIGNMENT_REFERENCE_NAME
-     *                      is returned directly. Otherwise {@code referenceIndex} must be looked up in the header's sequence
-     *                      dictionary.
-     * @param header SAMFileHeader to use when resolving {@code referenceIndex} to a name. Must be non null unless the
-     *               the {@code referenceIndex} is NO_ALIGNMENT_REFERENCE_INDEX.
-     * @returns the reference name corresponding to  {@code referenceIndex}
-     * @throws IllegalStateException if {@code referenceIndex} is not equal to NO_ALIGNMENT_REFERENCE_NAME and the header
-     * is null
-     * @throws IllegalArgumentException if {@code referenceIndex} does not appear in header's sequence dictionary.
-     *
-     * Does not mutate the SAMRecord.
-     */
-    protected static String resolveNameFromIndex(final int referenceIndex, final SAMFileHeader header) {
-        String referenceName = NO_ALIGNMENT_REFERENCE_NAME;
-        if (NO_ALIGNMENT_REFERENCE_INDEX != referenceIndex) {
-            if (null == header) {
-                throw new IllegalStateException("A non-null SAMFileHeader is required to resolve the reference index or name");
-            }
-            SAMSequenceRecord samSeq = header.getSequence(referenceIndex);
-            if (null == samSeq) {
-                throw new IllegalArgumentException("Reference name for '" + referenceIndex + "' not found in sequence dictionary.");
-            }
-            referenceName = samSeq.getSequenceName();
-        }
-
-        return referenceName;
-    }
-
-    /**
-     * @return 1-based inclusive leftmost position of the clipped sequence, or 0 if there is no position.
-     */
-    public int getAlignmentStart() {
-        return mAlignmentStart;
-    }
-
-    /**
-     * @param value 1-based inclusive leftmost position of the clipped sequence, or 0 if there is no position.
-     */
-    public void setAlignmentStart(final int value) {
-        mAlignmentStart = value;
-        // Clear cached alignment end
-        mAlignmentEnd = NO_ALIGNMENT_START;
-        // Change to alignmentStart could change indexing bin
-        setIndexingBin(null);
-    }
-
-    /**
-     * @return 1-based inclusive rightmost position of the clipped sequence, or 0 read if unmapped.
-     */
-    public int getAlignmentEnd() {
-        if (getReadUnmappedFlag()) {
-            return NO_ALIGNMENT_START;
-        }
-        else if (this.mAlignmentEnd == NO_ALIGNMENT_START) {
-            this.mAlignmentEnd = mAlignmentStart + getCigar().getReferenceLength() - 1;
-        }
-
-        return this.mAlignmentEnd;
-    }
-
-    /**
-     * @return the alignment start (1-based, inclusive) adjusted for clipped bases.  For example if the read
-     * has an alignment start of 100 but the first 4 bases were clipped (hard or soft clipped)
-     * then this method will return 96.
-     *
-     * Invalid to call on an unmapped read.
-     */
-    public int getUnclippedStart() {
-        return SAMUtils.getUnclippedStart(getAlignmentStart(), getCigar());
-    }
-
-    /**
-     * @return the alignment end (1-based, inclusive) adjusted for clipped bases.  For example if the read
-     * has an alignment end of 100 but the last 7 bases were clipped (hard or soft clipped)
-     * then this method will return 107.
-     *
-     * Invalid to call on an unmapped read.
-     */
-    public int getUnclippedEnd() {
-        return SAMUtils.getUnclippedEnd(getAlignmentEnd(), getCigar());
-    }
-
-
-    /**
-     * @param offset 1-based location within the unclipped sequence or 0 if there is no position.
-     * <p/>
-     * Non static version of the static function with the same name.
-     * @return 1-based inclusive reference position of the unclipped sequence at a given offset,
-     */
-    public int getReferencePositionAtReadPosition(final int offset) {
-        return getReferencePositionAtReadPosition(this, offset);
-    }
-
-    /**
-     * @param rec record to use
-     * @param offset 1-based location within the unclipped sequence
-     * @return 1-based inclusive reference position of the unclipped sequence at a given offset,
-     * or 0 if there is no position.
-     * For example, given the sequence NNNAAACCCGGG, cigar 3S9M, and an alignment start of 1,
-     * and a (1-based)offset 10 (start of GGG) it returns 7 (1-based offset starting after the soft clip.
-     * For example: given the sequence AAACCCGGGTTT, cigar 4M1D6M, an alignment start of 1,
-     * an offset of 4 returns reference position 4, an offset of 5 returns reference position 6.
-     * Another example: given the sequence AAACCCGGGTTT, cigar 4M1I6M, an alignment start of 1,
-     * an offset of 4 returns reference position 4, an offset of 5 returns 0.
-     */
-    public static int getReferencePositionAtReadPosition(final SAMRecord rec, final int offset) {
-
-        if (offset == 0) return 0;
-
-        for (final AlignmentBlock alignmentBlock : rec.getAlignmentBlocks()) {
-            if (CoordMath.getEnd(alignmentBlock.getReadStart(), alignmentBlock.getLength()) < offset) {
-                continue;
-            } else if (offset < alignmentBlock.getReadStart()) {
-                return 0;
-            } else {
-                return alignmentBlock.getReferenceStart() + offset - alignmentBlock.getReadStart();
-            }
-        }
-        return 0; // offset not located in an alignment block
-    }
-
-
-    /**
-     * @param pos 1-based reference position
-     * return the offset
-     * @return 1-based (to match getReferencePositionAtReadPosition behavior) inclusive position into the
-     * unclipped sequence at a given reference position, or 0 if there is no such position.
-     *
-     * See examples in the static version below
-     */
-    public int getReadPositionAtReferencePosition(final int pos) {
-        return getReadPositionAtReferencePosition(this, pos, false);
-    }
-
-    /**
-     * @param pos 1-based reference position
-     * @param returnLastBaseIfDeleted if positive, and reference position matches a deleted base in the read, function will
-     * return the offset
-     * @return 1-based (to match getReferencePositionAtReadPosition behavior) inclusive position into the
-     * unclipped sequence at a given reference position,
-     * or 0 if there is no such position. If returnLastBaseIfDeleted is true deletions are assumed to "live" on the last read base
-     * in the preceding block.
-     *
-     * Non-static version of static function with the same name. See examples below.
-     */
-    public int getReadPositionAtReferencePosition(final int pos, final boolean returnLastBaseIfDeleted) {
-        return getReadPositionAtReferencePosition(this, pos, returnLastBaseIfDeleted);
-    }
-
-    /**
-     * @param rec record to use
-     * @param pos 1-based reference position
-     * @param returnLastBaseIfDeleted if positive, and reference position matches a deleted base in the read, function will
-     * return the offset
-     * @return 1-based (to match getReferencePositionAtReadPosition behavior) inclusive position into the
-     * unclipped sequence at a given reference position,
-     * or 0 if there is no such position. If returnLastBaseIfDeleted is true deletions are assumed to "live" on the last read base
-     * in the preceding block.
-     * For example, given the sequence NNNAAACCCGGG, cigar 3S9M, and an alignment start of 1,
-     * and a (1-based)pos of 7 (start of GGG) it returns 10 (1-based offset including the soft clip.
-     * For example: given the sequence AAACCCGGGT, cigar 4M1D6M, an alignment start of 1,
-     * a reference position of 4 returns offset of 4, a reference of 5 also returns an offset 4 (using "left aligning") if returnLastBaseIfDeleted
-     * and 0 otherwise.
-     * For example: given the sequence AAACtCGGGTT, cigar 4M1I6M, an alignment start of 1,
-     * a position 4 returns an offset 5, a position of 5 returns 6 (the inserted base is the 5th offset), a position of 11 returns 0 since
-     * that position in the reference doesn't overlap the read at all.
-     *
-     */
-    public static int getReadPositionAtReferencePosition(final SAMRecord rec, final int pos, final boolean returnLastBaseIfDeleted) {
-
-        if (pos <= 0) {
-            return 0;
-        }
-
-        int lastAlignmentOffset = 0;
-        for (final AlignmentBlock alignmentBlock : rec.getAlignmentBlocks()) {
-            if (CoordMath.getEnd(alignmentBlock.getReferenceStart(), alignmentBlock.getLength()) >= pos) {
-                if (pos < alignmentBlock.getReferenceStart()) {
-                    //There must have been a deletion block that skipped
-                    return returnLastBaseIfDeleted ? lastAlignmentOffset : 0;
-                } else {
-                    return  pos - alignmentBlock.getReferenceStart() + alignmentBlock.getReadStart() ;
-                }
-            } else {
-                // record the offset to the last base in the current block, in case the next block starts too late
-                lastAlignmentOffset = alignmentBlock.getReadStart() + alignmentBlock.getLength() - 1 ;
-            }
-        }
-        // if we are here, the reference position was not overlapping the read at all
-        return 0;
-    }
-
-    /**
-     * @return 1-based inclusive leftmost position of the clipped mate sequence, or 0 if there is no position.
-     */
-    public int getMateAlignmentStart() {
-        return mMateAlignmentStart;
-    }
-
-    public void setMateAlignmentStart(final int mateAlignmentStart) {
-        this.mMateAlignmentStart = mateAlignmentStart;
-    }
-
-    /**
-     * @return insert size (difference btw 5' end of read & 5' end of mate), if possible, else 0.
-     * Negative if mate maps to lower position than read.
-     */
-    public int getInferredInsertSize() {
-        return mInferredInsertSize;
-    }
-
-    public void setInferredInsertSize(final int inferredInsertSize) {
-        this.mInferredInsertSize = inferredInsertSize;
-    }
-
-    /**
-     * @return phred scaled mapping quality.  255 implies valid mapping but quality is hard to compute.
-     */
-    public int getMappingQuality() {
-        return mMappingQuality;
-    }
-
-    public void setMappingQuality(final int value) {
-        mMappingQuality = value;
-    }
-
-    public String getCigarString() {
-        if (mCigarString == null && getCigar() != null) {
-            mCigarString = TextCigarCodec.encode(getCigar());
-        }
-        return mCigarString;
-    }
-
-    public void setCigarString(final String value) {
-        mCigarString = value;
-        mCigar = null;
-        mAlignmentBlocks = null;
-        // Clear cached alignment end
-        mAlignmentEnd = NO_ALIGNMENT_START;
-        // Change to cigar could change alignmentEnd, and thus indexing bin
-        setIndexingBin(null);
-    }
-
-    /**
-     * Do not modify the value returned by this method.  If you want to change the Cigar, create a new
-     * Cigar and call setCigar() or call setCigarString()
-     * @return Cigar object for the read, or null if there is none.
-     */
-    public Cigar getCigar() {
-        if (mCigar == null && mCigarString != null) {
-            mCigar = TextCigarCodec.decode(mCigarString);
-            if (null != getHeader() &&
-                    getValidationStringency() != ValidationStringency.SILENT &&
-                    !this.getReadUnmappedFlag()) {
-                // Don't know line number, and don't want to force read name to be decoded.
-                SAMUtils.processValidationErrors(this.validateCigar(-1L), -1L, getValidationStringency());
-            }
-        }
-        return mCigar;
-    }
-
-    /**
-     * This method is preferred over getCigar().getNumElements(), because for BAMRecord it may be faster.
-     * @return number of cigar elements (number + operator) in the cigar string.
-     */
-    public int getCigarLength() {
-        return getCigar().numCigarElements();
-    }
-
-    public void setCigar(final Cigar cigar) {
-        initializeCigar(cigar);
-        // Change to cigar could change alignmentEnd, and thus indexing bin
-        setIndexingBin(null);
-    }
-
-    /**
-     * For setting the Cigar string when BAMRecord has decoded it.  Use this rather than setCigar()
-     * so that indexing bin doesn't get clobbered.
-     */
-    protected void initializeCigar(final Cigar cigar) {
-        this.mCigar = cigar;
-        mCigarString = null;
-        mAlignmentBlocks = null;
-        // Clear cached alignment end
-        mAlignmentEnd = NO_ALIGNMENT_START;
-    }
-
-    /**
-     * Get the SAMReadGroupRecord for this SAMRecord.
-     * @return The SAMReadGroupRecord from the SAMFileHeader for this SAMRecord, or null if
-     * 1) this record has no RG tag, or 2) the header doesn't contain the read group with
-     * the given ID.or 3) this record has no SAMFileHeader
-     * @throws ClassCastException if RG tag does not have a String value.
-     */
-    public SAMReadGroupRecord getReadGroup() {
-        final String rgId = (String)getAttribute(SAMTagUtil.getSingleton().RG);
-        if (rgId == null || getHeader() == null) {
-            return null;
-        } else {
-            return getHeader().getReadGroup(rgId);
-        }
-    }
-
-    /**
-     * It is preferable to use the get*Flag() methods that handle the flag word symbolically.
-     */
-    public int getFlags() {
-        return mFlags;
-    }
-
-    public void setFlags(final int value) {
-        mFlags = value;
-        // Could imply change to readUnmapped flag, which could change indexing bin
-        setIndexingBin(null);
-    }
-
-    /**
-     * the read is paired in sequencing, no matter whether it is mapped in a pair.
-     */
-    public boolean getReadPairedFlag() {
-        return (mFlags & SAMFlag.READ_PAIRED.flag) != 0;
-    }
-
-    private void requireReadPaired() {
-        if (!getReadPairedFlag()) {
-            throw new IllegalStateException("Inappropriate call if not paired read");
-        }
-    }
-
-    /**
-     * the read is mapped in a proper pair (depends on the protocol, normally inferred during alignment).
-     */
-    public boolean getProperPairFlag() {
-        requireReadPaired();
-        return getProperPairFlagUnchecked();
-    }
-
-    private boolean getProperPairFlagUnchecked() {
-        return (mFlags & SAMFlag.PROPER_PAIR.flag) != 0;
-    }
-
-    /**
-     * the query sequence itself is unmapped.
-     */
-    public boolean getReadUnmappedFlag() {
-        return (mFlags & SAMFlag.READ_UNMAPPED.flag) != 0;
-    }
-
-    /**
-     * the mate is unmapped.
-     */
-    public boolean getMateUnmappedFlag() {
-        requireReadPaired();
-        return getMateUnmappedFlagUnchecked();
-    }
-
-    private boolean getMateUnmappedFlagUnchecked() {
-        return (mFlags & SAMFlag.MATE_UNMAPPED.flag) != 0;
-    }
-
-    /**
-     * strand of the query (false for forward; true for reverse strand).
-     */
-    public boolean getReadNegativeStrandFlag() {
-        return (mFlags & SAMFlag.READ_REVERSE_STRAND.flag) != 0;
-    }
-
-    /**
-     * strand of the mate (false for forward; true for reverse strand).
-     */
-    public boolean getMateNegativeStrandFlag() {
-        requireReadPaired();
-        return getMateNegativeStrandFlagUnchecked();
-    }
-
-    private boolean getMateNegativeStrandFlagUnchecked() {
-        return (mFlags & SAMFlag.MATE_REVERSE_STRAND.flag) != 0;
-    }
-
-    /**
-     * the read is the first read in a pair.
-     */
-    public boolean getFirstOfPairFlag() {
-        requireReadPaired();
-        return getFirstOfPairFlagUnchecked();
-    }
-
-    private boolean getFirstOfPairFlagUnchecked() {
-        return (mFlags & SAMFlag.FIRST_OF_PAIR.flag) != 0;
-    }
-
-    /**
-     * the read is the second read in a pair.
-     */
-    public boolean getSecondOfPairFlag() {
-        requireReadPaired();
-        return getSecondOfPairFlagUnchecked();
-    }
-
-    private boolean getSecondOfPairFlagUnchecked() {
-        return (mFlags & SAMFlag.SECOND_OF_PAIR.flag) != 0;
-    }
-
-    /**
-     * the alignment is not primary (a read having split hits may have multiple primary alignment records).
-     */
-    public boolean getNotPrimaryAlignmentFlag() {
-        return (mFlags & SAMFlag.NOT_PRIMARY_ALIGNMENT.flag) != 0;
-    }
-
-    /**
-     * the alignment is supplementary (TODO: further explanation?).
-     */
-    public boolean getSupplementaryAlignmentFlag() {
-        return (mFlags & SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag) != 0;
-    }
-
-    /**
-     * the read fails platform/vendor quality checks.
-     */
-    public boolean getReadFailsVendorQualityCheckFlag() {
-        return (mFlags & SAMFlag.READ_FAILS_VENDOR_QUALITY_CHECK.flag) != 0;
-    }
-
-    /**
-     * the read is either a PCR duplicate or an optical duplicate.
-     */
-    public boolean getDuplicateReadFlag() {
-        return (mFlags & SAMFlag.DUPLICATE_READ.flag) != 0;
-    }
-
-    /**
-     * the read is paired in sequencing, no matter whether it is mapped in a pair.
-     */
-    public void setReadPairedFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.READ_PAIRED.flag);
-    }
-
-    /**
-     * the read is mapped in a proper pair (depends on the protocol, normally inferred during alignment).
-     */
-    public void setProperPairFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.PROPER_PAIR.flag);
-    }
-
-    /**
-     * the query sequence itself is unmapped.  This method name is misspelled.
-     * Use {@link #setReadUnmappedFlag} instead.
-     * @deprecated
-     */
-    @Deprecated
-    public void setReadUmappedFlag(final boolean flag) {
-        setReadUnmappedFlag(flag);
-    }
-
-    /**
-     * the query sequence itself is unmapped.
-     */
-    public void setReadUnmappedFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.READ_UNMAPPED.flag);
-        // Change to readUnmapped could change indexing bin
-        setIndexingBin(null);
-    }
-
-    /**
-     * the mate is unmapped.
-     */
-    public void setMateUnmappedFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.MATE_UNMAPPED.flag);
-    }
-
-    /**
-     * strand of the query (false for forward; true for reverse strand).
-     */
-    public void setReadNegativeStrandFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.READ_REVERSE_STRAND.flag);
-    }
-
-    /**
-     * strand of the mate (false for forward; true for reverse strand).
-     */
-    public void setMateNegativeStrandFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.MATE_REVERSE_STRAND.flag);
-    }
-
-    /**
-     * the read is the first read in a pair.
-     */
-    public void setFirstOfPairFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.FIRST_OF_PAIR.flag);
-    }
-
-    /**
-     * the read is the second read in a pair.
-     */
-    public void setSecondOfPairFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.SECOND_OF_PAIR.flag);
-    }
-
-    /**
-     * the alignment is not primary (a read having split hits may have multiple primary alignment records).
-     */
-    public void setNotPrimaryAlignmentFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.NOT_PRIMARY_ALIGNMENT.flag);
-    }
-
-    /**
-     * the alignment is supplementary (TODO: further explanation?).
-     */
-    public void setSupplementaryAlignmentFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag);
-    }
-
-    /**
-     * the read fails platform/vendor quality checks.
-     */
-    public void setReadFailsVendorQualityCheckFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.READ_FAILS_VENDOR_QUALITY_CHECK.flag);
-    }
-
-    /**
-     * the read is either a PCR duplicate or an optical duplicate.
-     */
-    public void setDuplicateReadFlag(final boolean flag) {
-        setFlag(flag, SAMFlag.DUPLICATE_READ.flag);
-    }
-
-    /**
-     * Tests if this record is either a secondary and/or supplementary alignment;
-     * equivalent to {@code (getNotPrimaryAlignmentFlag() || getSupplementaryAlignmentFlag())}.
-     */
-    public boolean isSecondaryOrSupplementary() {
-        return getNotPrimaryAlignmentFlag() || getSupplementaryAlignmentFlag();
-    }
-
-    private void setFlag(final boolean flag, final int bit) {
-        if (flag) {
-            mFlags |= bit;
-        } else {
-            mFlags &= ~bit;
-        }
-    }
-
-    public ValidationStringency getValidationStringency() {
-        return mValidationStringency;
-    }
-
-    /**
-     * Control validation of lazily-decoded elements.
-     */
-    public void setValidationStringency(final ValidationStringency validationStringency) {
-        this.mValidationStringency = validationStringency;
-    }
-
-    /**
-     * Get the value for a SAM tag.
-     * WARNING: Some value types (e.g. byte[]) are mutable.  It is dangerous to change one of these values in
-     * place, because some SAMRecord implementations keep track of when attributes have been changed.  If you
-     * want to change an attribute value, call setAttribute() to replace the value.
-     *
-     * @param tag Two-character tag name.
-     * @return Appropriately typed tag value, or null if the requested tag is not present.
-     */
-    public Object getAttribute(final String tag) {
-        return getAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag));
-    }
-
-    /**
-     * Get the tag value and attempt to coerce it into the requested type.
-     * @param tag The requested tag.
-     * @return The value of a tag, converted into a signed Integer if possible.
-     * @throws RuntimeException If the value is not an integer type, or will not fit in a signed Integer.
-     */
-    public Integer getIntegerAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val == null) return null;
-        if (val instanceof Integer) {
-            return (Integer)val;
-        }
-        if (!(val instanceof Number)) {
-            throw new RuntimeException("Value for tag " + tag + " is not Number: " + val.getClass());
-        }
-        final long longVal = ((Number)val).longValue();
-        if (longVal < Integer.MIN_VALUE || longVal > Integer.MAX_VALUE) {
-            throw new RuntimeException("Value for tag " + tag + " is not in Integer range: " + longVal);
-        }
-        return (int)longVal;
-    }
-
-    /**
-     * A convenience method that will return a valid unsigned integer as a Long,
-     * or fail with an exception if the tag value is invalid.
-     *
-     * @param tag Two-character tag name.
-     * @return valid unsigned integer associated with the tag, as a Long
-     * @throws {@link htsjdk.samtools.SAMException} if the value is out of range for a 32-bit unsigned value, or not a Number
-     */
-    public Long getUnsignedIntegerAttribute(final String tag) throws SAMException {
-        return getUnsignedIntegerAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag));
-    }
-
-    /**
-     * A convenience method that will return a valid unsigned integer as a Long,
-     * or fail with an exception if the tag value is invalid.
-     *
-     * @param tag Binary representation of a 2-char String tag as created by SAMTagUtil.
-     * @return valid unsigned integer associated with the tag, as a Long
-     * @throws {@link htsjdk.samtools.SAMException} if the value is out of range for a 32-bit unsigned value, or not a Number
-     */
-    public Long getUnsignedIntegerAttribute(final short tag) throws SAMException {
-        final Object value = getAttribute(tag);
-        if (value == null) {
-            return null;
-        }
-
-        if (value instanceof Number) {
-            final long lValue = ((Number)value).longValue();
-            if (SAMUtils.isValidUnsignedIntegerAttribute(lValue)) {
-                return lValue;
-            } else {
-                throw new SAMException("Unsigned integer value of tag " +
-                        SAMTagUtil.getSingleton().makeStringTag(tag) + " is out of bounds for a 32-bit unsigned integer: " + lValue);
-            }
-        } else {
-            throw new SAMException("Unexpected attribute value data type " + value.getClass() + " for tag " +
-                    SAMTagUtil.getSingleton().makeStringTag(tag));
-        }
-    }
-
-    /**
-     * Get the tag value and attempt to coerce it into the requested type.
-     * @param tag The requested tag.
-     * @return The value of a tag, converted into a Short if possible.
-     * @throws RuntimeException If the value is not an integer type, or will not fit in a Short.
-     */
-    public Short getShortAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val == null) return null;
-        if (val instanceof Short) {
-            return (Short)val;
-        }
-        if (!(val instanceof Number)) {
-            throw new RuntimeException("Value for tag " + tag + " is not Number: " + val.getClass());
-        }
-        final long longVal = ((Number)val).longValue();
-        if (longVal < Short.MIN_VALUE || longVal > Short.MAX_VALUE) {
-            throw new RuntimeException("Value for tag " + tag + " is not in Short range: " + longVal);
-        }
-        return (short)longVal;
-    }
-
-    /**
-     * Get the tag value and attempt to coerce it into the requested type.
-     * @param tag The requested tag.
-     * @return The value of a tag, converted into a Byte if possible.
-     * @throws RuntimeException If the value is not an integer type, or will not fit in a Byte.
-     */
-    public Byte getByteAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val == null) return null;
-        if (val instanceof Byte) {
-            return (Byte)val;
-        }
-        if (!(val instanceof Number)) {
-            throw new RuntimeException("Value for tag " + tag + " is not Number: " + val.getClass());
-        }
-        final long longVal = ((Number)val).longValue();
-        if (longVal < Byte.MIN_VALUE || longVal > Byte.MAX_VALUE) {
-            throw new RuntimeException("Value for tag " + tag + " is not in Short range: " + longVal);
-        }
-        return (byte)longVal;
-    }
-
-    public String getStringAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val == null) return null;
-        if (val instanceof String) {
-            return (String)val;
-        }
-        throw new SAMException("Value for tag " + tag + " is not a String: " + val.getClass());
-    }
-
-    public Character getCharacterAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val == null) return null;
-        if (val instanceof Character) {
-            return (Character)val;
-        }
-        throw new SAMException("Value for tag " + tag + " is not a Character: " + val.getClass());
-    }
-
-    public Float getFloatAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val == null) return null;
-        if (val instanceof Float) {
-            return (Float)val;
-        }
-        throw new SAMException("Value for tag " + tag + " is not a Float: " + val.getClass());
-    }
-
-    /** Will work for signed byte array, unsigned byte array, or old-style hex array */
-    public byte[] getByteArrayAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val == null) return null;
-        if (val instanceof byte[]) {
-            return (byte[])val;
-        }
-        throw new SAMException("Value for tag " + tag + " is not a byte[]: " + val.getClass());
-    }
-
-    public byte[] getUnsignedByteArrayAttribute(final String tag) {
-        final byte[] ret = getByteArrayAttribute(tag);
-        if (ret != null) requireUnsigned(tag);
-        return ret;
-    }
-
-    /** Will work for signed byte array or old-style hex array */
-    public byte[] getSignedByteArrayAttribute(final String tag) {
-        final byte[] ret = getByteArrayAttribute(tag);
-        if (ret != null) requireSigned(tag);
-        return ret;
-    }
-
-    public short[] getUnsignedShortArrayAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val == null) return null;
-        if (val instanceof short[]) {
-            requireUnsigned(tag);
-            return (short[]) val;
-        }
-        throw new SAMException("Value for tag " + tag + " is not a short[]: " + val.getClass());
-    }
-
-    public short[] getSignedShortArrayAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val == null) return null;
-        if (val instanceof short[]) {
-            requireSigned(tag);
-            return (short[]) val;
-        }
-        throw new SAMException("Value for tag " + tag + " is not a short[]: " + val.getClass());
-    }
-
-    public int[] getUnsignedIntArrayAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val == null) return null;
-        if (val instanceof int[]) {
-            requireUnsigned(tag);
-            return (int[]) val;
-        }
-        throw new SAMException("Value for tag " + tag + " is not a int[]: " + val.getClass());
-    }
-
-    public int[] getSignedIntArrayAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val == null) return null;
-        if (val instanceof int[]) {
-            requireSigned(tag);
-            return (int[]) val;
-        }
-        throw new SAMException("Value for tag " + tag + " is not a int[]: " + val.getClass());
-    }
-
-    public float[] getFloatArrayAttribute(final String tag) {
-        final Object val = getAttribute(tag);
-        if (val != null && !(val instanceof float[])) {
-            throw new SAMException("Value for tag " + tag + " is not a float[]: " + val.getClass());
-        }
-        return (float[]) val;
-    }
-
-    /**
-     * @return True if this tag is an unsigned array, else false.
-     * @throws SAMException if the tag is not present.
-     */
-    public boolean isUnsignedArrayAttribute(final String tag) {
-        final SAMBinaryTagAndValue tmp = this.mAttributes.find(SAMTagUtil.getSingleton().makeBinaryTag(tag));
-        if (tmp != null) return tmp.isUnsignedArray();
-        throw new SAMException("Tag " + tag + " is not present in this SAMRecord");
-    }
-
-    private void requireSigned(final String tag) {
-        if (isUnsignedArrayAttribute(tag))  throw new SAMException("Value for tag " + tag + " is not signed");
-    }
-
-    private void requireUnsigned(final String tag) {
-        if (!isUnsignedArrayAttribute(tag))  throw new SAMException("Value for tag " + tag + " is not unsigned");
-    }
-
-    /**
-     * @see SAMRecord#getAttribute(java.lang.String)
-     * @param tag Binary representation of a 2-char String tag as created by SAMTagUtil.
-     */
-    public Object getAttribute(final short tag) {
-        if (this.mAttributes == null) return null;
-        else {
-            final SAMBinaryTagAndValue tmp = this.mAttributes.find(tag);
-            if (tmp != null) return tmp.value;
-            else return null;
-        }
-    }
-
-    /**
-     * Set a named attribute onto the SAMRecord.  Passing a null value causes the attribute to be cleared.
-     * @param tag two-character tag name.  See http://samtools.sourceforge.net/SAM1.pdf for standard and user-defined tags.
-     * @param value Supported types are String, Char, Integer, Float,
-     *              Long (for values that fit into a signed or unsigned 32-bit integer only),
-     *              byte[], short[], int[], float[].
-     * If value == null, tag is cleared.
-     *
-     * Byte and Short are allowed but discouraged.  If written to a SAM file, these will be converted to Integer,
-     * whereas if written to BAM, getAttribute() will return as Byte or Short, respectively.
-     *
-     * Long is allowed for values that fit into a signed or unsigned 32-bit integer only, but discouraged.
-     *
-     * To set unsigned byte[], unsigned short[] or unsigned int[] (which is discouraged because of poor Java language
-     * support), setUnsignedArrayAttribute() must be used instead of this method.
-     *
-     * String values are not validated to ensure that they conform to SAM spec.
-     */
-    public void setAttribute(final String tag, final Object value) {
-        if (value != null && value.getClass().isArray() && Array.getLength(value) == 0) {
-            throw new IllegalArgumentException("Empty value passed for tag " + tag);
-        }
-        setAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag), value);
-    }
-
-    /**
-     * Because Java does not support unsigned integer types, we think it is a bad idea to encode them in SAM
-     * files.  If you must do so, however, you must call this method rather than setAttribute, because calling
-     * this method is the way to indicate that, e.g. a short array should be interpreted as unsigned shorts.
-     * @param value must be one of byte[], short[], int[]
-     */
-    public void setUnsignedArrayAttribute(final String tag, final Object value) {
-        if (!value.getClass().isArray()) {
-            throw new IllegalArgumentException("Non-array passed to setUnsignedArrayAttribute for tag " + tag);
-        }
-        if (Array.getLength(value) == 0) {
-            throw new IllegalArgumentException("Empty array passed to setUnsignedArrayAttribute for tag " + tag);
-        }
-        setAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag), value, true);
-    }
-
-    /**
-     * @see htsjdk.samtools.SAMRecord#setAttribute(java.lang.String, java.lang.Object)
-     * @param tag Binary representation of a 2-char String tag as created by SAMTagUtil.
-     */
-    protected void setAttribute(final short tag, final Object value) {
-        setAttribute(tag, value, false);
-    }
-
-    /**
-     * Checks if the value is allowed as an attribute value.
-     *
-     * @param value the value to be checked
-     * @return true if the value is valid and false otherwise
-
-     * @deprecated
-     * The attribute type and value checks have been moved directly into
-     * {@link SAMBinaryTagAndValue}.
-     */
-    @Deprecated
-    protected static boolean isAllowedAttributeValue(final Object value) {
-        return SAMBinaryTagAndValue.isAllowedAttributeValue(value);
-    }
-
-    protected void setAttribute(final short tag, final Object value, final boolean isUnsignedArray) {
-        if (value == null) {
-            if (this.mAttributes != null) {
-                // setting a tag value to null removes the tag:
-                this.mAttributes = this.mAttributes.remove(tag);
-            }
-        } else {
-            final SAMBinaryTagAndValue tmp;
-            if (!isUnsignedArray) {
-                tmp = new SAMBinaryTagAndValue(tag, value);
-            } else {
-                tmp = new SAMBinaryTagAndUnsignedArrayValue(tag, value);
-            }
-
-            if (this.mAttributes == null) {
-                this.mAttributes = tmp;
-            } else {
-                this.mAttributes = this.mAttributes.insert(tmp);
-            }
-        }
-    }
-
-    /**
-     * Removes all attributes.
-     */
-    public void clearAttributes() {
-        mAttributes = null;
-    }
-
-    /**
-     * Replace any existing attributes with the given linked item.
-     */
-    protected void setAttributes(final SAMBinaryTagAndValue attributes) {
-        mAttributes = attributes;
-    }
-
-    /**
-     * @return Pointer to the first of the tags.  Returns null if there are no tags.
-     */
-    protected SAMBinaryTagAndValue getBinaryAttributes() {
-        return mAttributes;
-    }
-
-    /**
-     * @return reference name, null if this is unmapped
-     */
-    @Override
-    public String getContig() {
-        if( getReadUnmappedFlag()) {
-            return null;
-        } else {
-            return getReferenceName();
-        }
-    }
-
-    /**
-     * an alias of {@link #getAlignmentStart()
-     * @return 1-based inclusive leftmost position of the clipped sequence, or 0 if there is no position.
-     */
-    @Override
-    public int getStart() {
-        return getAlignmentStart();
-    }
-
-    /**
-     * an alias of {@link #getAlignmentEnd()}
-     * @return 1-based inclusive rightmost position of the clipped sequence, or 0 read if unmapped.
-     */
-    @Override
-    public int getEnd() {
-        return getAlignmentEnd();
-    }
-
-    /**
-     * Tag name and value of an attribute, for getAttributes() method.
-     */
-    public static class SAMTagAndValue {
-        public final String tag;
-        public final Object value;
-
-        public SAMTagAndValue(final String tag, final Object value) {
-            this.tag = tag;
-            this.value = value;
-        }
-    }
-
-    /**
-     * @return list of {tag, value} tuples
-     */
-    public List<SAMTagAndValue> getAttributes() {
-        SAMBinaryTagAndValue binaryAttributes = getBinaryAttributes();
-        final List<SAMTagAndValue> ret = new ArrayList<SAMTagAndValue>();
-        while (binaryAttributes != null) {
-            ret.add(new SAMTagAndValue(SAMTagUtil.getSingleton().makeStringTag(binaryAttributes.tag),
-                    binaryAttributes.value));
-            binaryAttributes = binaryAttributes.getNext();
-        }
-        return ret;
-    }
-
-    Integer getIndexingBin() {
-        return mIndexingBin;
-    }
-
-    /**
-     * Used internally when writing BAMRecords.
-     * @param mIndexingBin c.f. http://samtools.sourceforge.net/SAM1.pdf
-     */
-    void setIndexingBin(final Integer mIndexingBin) {
-        this.mIndexingBin = mIndexingBin;
-    }
-
-    /**
-     * Does not change state of this.
-     * @return indexing bin based on alignment start & end.
-     */
-    int computeIndexingBin() {
-        // regionToBin has zero-based, half-open API
-        final int alignmentStart = getAlignmentStart()-1;
-        int alignmentEnd = getAlignmentEnd();
-        if (alignmentEnd <= 0) {
-            // If alignment end cannot be determined (e.g. because this read is not really aligned),
-            // then treat this as a one base alignment for indexing purposes.
-            alignmentEnd = alignmentStart + 1;
-        }
-        return GenomicIndexUtil.regionToBin(alignmentStart, alignmentEnd);
-    }
-
-    /**
-     * @return the SAMFileHeader for this record. If the header is null, the following SAMRecord methods may throw
-     * exceptions:
-     * <p><ul>
-     * <li>getReferenceIndex</li>
-     * <li>setReferenceIndex</li>
-     * <li>getMateReferenceIndex</li>
-     * <li>setMateReferenceIndex</li>
-     * </ul><p>
-     * Record comparators (i.e. SAMRecordCoordinateComparator and SAMRecordDuplicateComparator) require records with
-     * non-null header values.
-     * <p>
-     * A record with null a header may be validated by the isValid method, but the reference and mate reference indices,
-     * read group, sequence dictionary, and alignment start will not be fully validated unless a header is present.
-     * <p>
-     * SAMTextWriter, BAMFileWriter, and CRAMFileWriter all require records to have a valid header in order to be
-     * written. Any record that does not have a header at the time it is added to the writer will be updated to use the
-     * header associated with the writer.
-     */
-    public SAMFileHeader getHeader() {
-        return mHeader;
-    }
-
-    /**
-     * Sets the SAMFileHeader for this record. Setting the header into SAMRecord facilitates conversion between reference
-     * sequence names and indices.
-     * <p>
-     * <b>NOTE:</b> If the record has a reference or mate reference name, the corresponding reference and mate reference
-     * indices are resolved and updated using the sequence dictionary in the new header. setHeader does not throw an
-     * exception if either the reference or mate reference name does not appear in the new header's sequence dictionary.
-     * <p>
-     * When the SAMFileHeader is set to null, the reference and mate reference indices are cleared. Therefore, calls to
-     * the following SAMRecord methods on records with a null header may throw IllegalArgumentExceptions:
-     * <ul>
-     * <li>getReferenceIndex</li>
-     * <li>setReferenceIndex</li>
-     * <li>getMateReferenceIndex</li>
-     * <li>setMateReferenceIndex</li>
-     * </ul><p>
-     * Record comparators (i.e. SAMRecordCoordinateComparator and SAMRecordDuplicateComparator) require records with
-     * non-null header values.
-     * <p>
-     * A record with null a header may be validated by the isValid method, but the reference and mate reference indices,
-     * read group, sequence dictionary, and alignment start will not be fully validated unless a header is present.
-     * <p>
-     * SAMTextWriter, BAMFileWriter, and CRAMFileWriter all require records to have a valid header in order to be
-     * written. Any record that does not have a header at the time it is added to the writer will be updated to use the
-     * header associated with the writer.
-     *
-     * @param header contains sequence dictionary for this SAMRecord
-     */
-    public void setHeader(final SAMFileHeader header) {
-        this.mHeader = header;
-        if (null == header) {
-            // mark the reference indices as unresolved
-            mReferenceIndex = null;
-            mMateReferenceIndex = null;
-        }
-        else {
-            // attempt to resolve the existing reference names and indices against the new sequence dictionary, but
-            // don't throw if the names don't appear in the dictionary
-            setReferenceName(mReferenceName);
-            setMateReferenceName(mMateReferenceName);
-        }
-    }
-
-    /**
-     * Establishes the SAMFileHeader for this record and forces resolution of the record's reference and mate reference
-     * names against the header using the sequence dictionary in the new header. If either the reference or mate
-     * reference name does not appear in the new header's sequence dictionary, an IllegalArgumentException is thrown.
-     *
-     * @param header new header for this record. May be null.
-     * @throws IllegalArgumentException if the record has reference or mate reference names that cannot be resolved
-     * to indices using the new header.
-     */
-    public void setHeaderStrict(final SAMFileHeader header) {
-        if (null == header) {
-            // mark the reference indices as unresolved
-            mReferenceIndex = null;
-            mMateReferenceIndex = null;
-        }
-        else {
-            // Attempt to resolve the existing reference names against the new sequence dictionary
-            // and throw if the names don't appear.
-            Integer referenceIndex = resolveIndexFromName(mReferenceName, header, true);
-            Integer mateReferenceIndex = resolveIndexFromName(mMateReferenceName, header, true);
-
-            // Mutate the record once we know the values are valid
-            mReferenceIndex = referenceIndex;
-            mMateReferenceIndex = mateReferenceIndex;
-        }
-        this.mHeader = header;
-    }
-
-    /**
-     * If this record has a valid binary representation of the variable-length portion of a binary record stored,
-     * return that byte array, otherwise return null.  This will never be true for SAMRecords.  It will be true
-     * for BAMRecords that have not been eagerDecoded(), and for which none of the data in the variable-length
-     * portion has been changed.
-     */
-    public byte[] getVariableBinaryRepresentation() {
-        return null;
-    }
-
-    /**
-     * Depending on the concrete implementation, the binary file size of attributes may be known without
-     * computing them all.
-     * @return binary file size of attribute, if known, else -1
-     */
-    public int getAttributesBinarySize() {
-        return -1;
-    }
-
-    /**
-     *
-     * @return String representation of this.
-     * @deprecated This method is not guaranteed to return a valid SAM text representation of the SAMRecord.
-     * To get standard SAM text representation, {@link SAMRecord#getSAMString}.
-     */
-    @Deprecated
-    public String format() {
-        final StringBuilder buffer = new StringBuilder();
-        addField(buffer, getReadName(), null, null);
-        addField(buffer, getFlags(), null, null);
-        addField(buffer, getReferenceName(), null, "*");
-        addField(buffer, getAlignmentStart(), 0, "*");
-        addField(buffer, getMappingQuality(), 0, "0");
-        addField(buffer, getCigarString(), null, "*");
-        addField(buffer, getMateReferenceName(), null, "*");
-        addField(buffer, getMateAlignmentStart(), 0, "*");
-        addField(buffer, getInferredInsertSize(), 0, "*");
-        addField(buffer, getReadString(), null, "*");
-        addField(buffer, getBaseQualityString(), null, "*");
-        if (mAttributes != null) {
-            SAMBinaryTagAndValue entry = getBinaryAttributes();
-            while (entry != null) {
-                addField(buffer, formatTagValue(entry.tag, entry.value));
-                entry = entry.getNext();
-            }
-        }
-        return buffer.toString();
-    }
-
-    private void addField(final StringBuilder buffer, final Object value, final Object defaultValue, final String defaultString) {
-        if (safeEquals(value, defaultValue)) {
-            addField(buffer, defaultString);
-        } else if (value == null) {
-            addField(buffer, "");
-        } else {
-            addField(buffer, value.toString());
-        }
-    }
-
-    private void addField(final StringBuilder buffer, final String field) {
-        if (buffer.length() > 0) {
-            buffer.append('\t');
-        }
-        buffer.append(field);
-    }
-
-    private String formatTagValue(final short tag, final Object value) {
-        final String tagString = SAMTagUtil.getSingleton().makeStringTag(tag);
-        if (value == null || value instanceof String) {
-            return tagString + ":Z:" + value;
-        } else if (value instanceof Integer || value instanceof Long ||
-                value instanceof Short || value instanceof Byte) {
-            return tagString + ":i:" + value;
-        } else if (value instanceof Character) {
-            return tagString + ":A:" + value;
-        } else if (value instanceof Float) {
-            return tagString + ":f:" + value;
-        } else if (value instanceof byte[]) {
-            return tagString + ":H:" + StringUtil.bytesToHexString((byte[]) value);
-        } else {
-            throw new RuntimeException("Unexpected value type for tag " + tagString +
-                    ": " + value + " of class " + value.getClass().getName());
-        }
-    }
-
-    private boolean safeEquals(final Object o1, final Object o2) {
-        if (o1 == o2) {
-            return true;
-        } else if (o1 == null || o2 == null) {
-            return false;
-        } else {
-            return o1.equals(o2);
-        }
-    }
-
-    /**
-     * Force all lazily-initialized data members to be initialized.  If a subclass overrides this method,
-     * typically it should also call  super method.
-     */
-    protected void eagerDecode() {
-        getCigar();
-        getCigarString();
-    }
-
-    /**
-     * Returns blocks of the read sequence that have been aligned directly to the
-     * reference sequence. Note that clipped portions of the read and inserted and
-     * deleted bases (vs. the reference) are not represented in the alignment blocks.
-     */
-    public List<AlignmentBlock> getAlignmentBlocks() {
-        if (this.mAlignmentBlocks == null) {
-            this.mAlignmentBlocks = SAMUtils.getAlignmentBlocks(getCigar(), getAlignmentStart(), "read cigar");
-        }
-        return this.mAlignmentBlocks;
-    }
-
-    /**
-     * Run all validations of CIGAR.  These include validation that the CIGAR makes sense independent of
-     * placement, plus validation that CIGAR + placement yields all bases with M operator within the range of the reference.
-     * @param recordNumber For error reporting.  -1 if not known.
-     * @return List of errors, or null if no errors.
-     */
-    public List<SAMValidationError> validateCigar(final long recordNumber) {
-        List<SAMValidationError> ret = null;
-
-        if (null != getHeader() && getValidationStringency() != ValidationStringency.SILENT && !this.getReadUnmappedFlag()) {
-            try {
-                //make sure that the cashed version is good
-                //wrapped in a try to catch an un-parsable string
-                return SAMUtils.validateCigar(this, getCigar(), getReferenceIndex(), getAlignmentBlocks(), recordNumber, "Read CIGAR");
-            } catch( final IllegalArgumentException e){
-                return Collections.singletonList(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,e.getMessage(),getReadName(),recordNumber));
-            }
-        }
-        return ret;
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (!(o instanceof SAMRecord)) return false;
-
-        final SAMRecord samRecord = (SAMRecord) o;
-
-        // First check all the elements that do not require decoding
-        if (mAlignmentStart != samRecord.mAlignmentStart) return false;
-        if (mFlags != samRecord.mFlags) return false;
-        if (mInferredInsertSize != samRecord.mInferredInsertSize) return false;
-        if (mMappingQuality != samRecord.mMappingQuality) return false;
-        if (mMateAlignmentStart != samRecord.mMateAlignmentStart) return false;
-        if (mIndexingBin != null ? !mIndexingBin.equals(samRecord.mIndexingBin) : samRecord.mIndexingBin != null)
-            return false;
-        if (mMateReferenceIndex != null ? !mMateReferenceIndex.equals(samRecord.mMateReferenceIndex) : samRecord.mMateReferenceIndex != null)
-            return false;
-        if (mReferenceIndex != null ? !mReferenceIndex.equals(samRecord.mReferenceIndex) : samRecord.mReferenceIndex != null)
-            return false;
-
-        eagerDecode();
-        samRecord.eagerDecode();
-
-        if (mReadName != null ? !mReadName.equals(samRecord.mReadName) : samRecord.mReadName != null) return false;
-        if (mAttributes != null ? !mAttributes.equals(samRecord.mAttributes) : samRecord.mAttributes != null)
-            return false;
-        if (!Arrays.equals(mBaseQualities, samRecord.mBaseQualities)) return false;
-        if (mCigar != null ? !mCigar.equals(samRecord.mCigar) : samRecord.mCigar != null)
-            return false;
-        if (mMateReferenceName != null ? !mMateReferenceName.equals(samRecord.mMateReferenceName) : samRecord.mMateReferenceName != null)
-            return false;
-        if (!Arrays.equals(mReadBases, samRecord.mReadBases)) return false;
-        if (mReferenceName != null ? !mReferenceName.equals(samRecord.mReferenceName) : samRecord.mReferenceName != null)
-            return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        eagerDecode();
-        int result = mReadName != null ? mReadName.hashCode() : 0;
-        result = 31 * result + (mReadBases != null ? Arrays.hashCode(mReadBases) : 0);
-        result = 31 * result + (mBaseQualities != null ? Arrays.hashCode(mBaseQualities) : 0);
-        result = 31 * result + (mReferenceName != null ? mReferenceName.hashCode() : 0);
-        result = 31 * result + mAlignmentStart;
-        result = 31 * result + mMappingQuality;
-        result = 31 * result + (mCigarString != null ? mCigarString.hashCode() : 0);
-        result = 31 * result + mFlags;
-        result = 31 * result + (mMateReferenceName != null ? mMateReferenceName.hashCode() : 0);
-        result = 31 * result + mMateAlignmentStart;
-        result = 31 * result + mInferredInsertSize;
-        result = 31 * result + (mAttributes != null ? mAttributes.hashCode() : 0);
-        result = 31 * result + (mReferenceIndex != null ? mReferenceIndex.hashCode() : 0);
-        result = 31 * result + (mMateReferenceIndex != null ? mMateReferenceIndex.hashCode() : 0);
-        result = 31 * result + (mIndexingBin != null ? mIndexingBin.hashCode() : 0);
-        return result;
-    }
-
-    /**
-     * Perform various validations of SAMRecord.
-     * Note that this method deliberately returns null rather than Collections.emptyList() if there
-     * are no validation errors, because callers tend to assume that if a non-null list is returned, it is modifiable.
-     *
-     * A record with null a header may be validated by the isValid method, but the reference and mate reference indices,
-     * read group, sequence dictionary, and alignment start will not be fully validated unless a header is present.
-     *
-     * @return null if valid.  If invalid, returns a list of error messages.
-     *
-     */
-    public List<SAMValidationError> isValid() {
-        return isValid(false);
-    }
-
-    /**
-     * Perform various validations of SAMRecord.
-     * Note that this method deliberately returns null rather than Collections.emptyList() if there
-     * are no validation errors, because callers tend to assume that if a non-null list is returned, it is modifiable.
-     *
-     * A record with null a header may be validated by the isValid method, but the reference and mate reference indices,
-     * read group, sequence dictionary, and alignment start will not be fully validated unless a header is present.
-     *
-     * @param firstOnly return only the first error if true, false otherwise
-     * @return null if valid.  If invalid, returns a list of error messages.
-     */
-    public List<SAMValidationError> isValid(final boolean firstOnly) {
-        // ret is only instantiate if there are errors to report, in order to reduce GC in the typical case
-        // in which everything is valid.  It's ugly, but more efficient.
-        ArrayList<SAMValidationError> ret = null;
-        if (!getReadPairedFlag()) {
-            if (getProperPairFlagUnchecked()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_PROPER_PAIR, "Proper pair flag should not be set for unpaired read.", getReadName()));
-                if (firstOnly) return ret;
-            }
-            if (getMateUnmappedFlagUnchecked()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_MATE_UNMAPPED, "Mate unmapped flag should not be set for unpaired read.", getReadName()));
-                if (firstOnly) return ret;
-            }
-            if (getMateNegativeStrandFlagUnchecked()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_MATE_NEG_STRAND, "Mate negative strand flag should not be set for unpaired read.", getReadName()));
-                if (firstOnly) return ret;
-            }
-            if (getFirstOfPairFlagUnchecked()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_FIRST_OF_PAIR, "First of pair flag should not be set for unpaired read.", getReadName()));
-                if (firstOnly) return ret;
-            }
-            if (getSecondOfPairFlagUnchecked()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_SECOND_OF_PAIR, "Second of pair flag should not be set for unpaired read.", getReadName()));
-                if (firstOnly) return ret;
-            }
-            if (null != getHeader() && getMateReferenceIndex() != NO_ALIGNMENT_REFERENCE_INDEX) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_MATE_REF_INDEX, "MRNM should not be set for unpaired read.", getReadName()));
-                if (firstOnly) return ret;
-            }
-        } else {
-            final List<SAMValidationError> errors = isValidReferenceIndexAndPosition(mMateReferenceIndex, mMateReferenceName,
-                    getMateAlignmentStart(), true, firstOnly);
-            if (errors != null) {
-                if (firstOnly) return errors;
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.addAll(errors);
-            }
-            if (!hasMateReferenceName() && !getMateUnmappedFlag()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_MATE_UNMAPPED, "Mapped mate should have mate reference name", getReadName()));
-                if (firstOnly) return ret;
-            }
-            if (!getFirstOfPairFlagUnchecked() && !getSecondOfPairFlagUnchecked()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.PAIRED_READ_NOT_MARKED_AS_FIRST_OR_SECOND,
-                        "Paired read should be marked as first of pair or second of pair.", getReadName()));
-                if (firstOnly) return ret;
-            }
-/*
-            TODO: PIC-97 This validation should be enabled, but probably at this point there are too many
-            BAM files that have the proper pair flag set when read or mate is unmapped.
-            if (getMateUnmappedFlag() && getProperPairFlagUnchecked()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_PROPER_PAIR, "Proper pair flag should not be set for unpaired read.", getReadName()));
-                if (firstOnly) return ret;
-            }
-*/
-        }
-        if (getInferredInsertSize() > MAX_INSERT_SIZE || getInferredInsertSize() < -MAX_INSERT_SIZE) {
-            if (ret == null) ret = new ArrayList<SAMValidationError>();
-            ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_INSERT_SIZE, "Insert size out of range", getReadName()));
-            if (firstOnly) return ret;
-        }
-        if (getReadUnmappedFlag()) {
-            if (getNotPrimaryAlignmentFlag()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_NOT_PRIM_ALIGNMENT, "Not primary alignment flag should not be set for unmapped read.", getReadName()));
-                if (firstOnly) return ret;
-            }
-            if (getSupplementaryAlignmentFlag()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_SUPPLEMENTARY_ALIGNMENT, "Supplementary alignment flag should not be set for unmapped read.", getReadName()));
-                if (firstOnly) return ret;
-            }
-            if (getMappingQuality() != 0) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_MAPPING_QUALITY, "MAPQ should be 0 for unmapped read.", getReadName()));
-                if (firstOnly) return ret;
-            }
-            /* non-empty CIGAR on unmapped read is now allowed, because there are special reads when SAM is used to store assembly. */
-/*
-            TODO: PIC-97 This validation should be enabled, but probably at this point there are too many
-            BAM files that have the proper pair flag set when read or mate is unmapped.
-            if (getProperPairFlagUnchecked()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_PROPER_PAIR, "Proper pair flag should not be set for unmapped read.", getReadName()));
-            }
-*/
-        } else {
-            if (getMappingQuality() >= 256) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_MAPPING_QUALITY, "MAPQ should be < 256.", getReadName()));
-                if (firstOnly) return ret;
-            }
-            if (getCigarLength() == 0) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR, "CIGAR should have > zero elements for mapped read.", getReadName()));
-            /* todo - will uncomment once unit tests are added
-            } else if (getCigar().getReadLength() != getReadLength()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR, "CIGAR read length " + getCigar().getReadLength() + " doesn't match read length " + getReadLength(), getReadName()));
-            */
-                if (firstOnly) return ret;
-            }
-            if (getHeader() != null && getHeader().getSequenceDictionary().isEmpty()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.MISSING_SEQUENCE_DICTIONARY, "Empty sequence dictionary.", getReadName()));
-                if (firstOnly) return ret;
-            }
-            if (!hasReferenceName()) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_READ_UNMAPPED, "Mapped read should have valid reference name", getReadName()));
-                if (firstOnly) return ret;
-            }
-/*
-            Oops!  We know this is broken in older BAM files, so this having this validation will cause all sorts of
-            problems!
-            if (getIndexingBin() != null && getIndexingBin() != computeIndexingBin()) {
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_INDEXING_BIN,
-                        "Indexing bin (" + getIndexingBin() + ") does not agree with computed value (" + computeIndexingBin() + ")",
-                        getReadName()));
-
-            }
-*/
-        }
-        // Validate the RG ID is found in header
-        final String rgId = (String)getAttribute(SAMTagUtil.getSingleton().RG);
-        if (rgId != null && getHeader() != null && getHeader().getReadGroup(rgId) == null) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.READ_GROUP_NOT_FOUND,
-                        "RG ID on SAMRecord not found in header: " + rgId, getReadName()));
-                if (firstOnly) return ret;
-        }
-        final List<SAMValidationError> errors = isValidReferenceIndexAndPosition(mReferenceIndex, mReferenceName, getAlignmentStart(), false);
-        if (errors != null) {
-            if (ret == null) ret = new ArrayList<SAMValidationError>();
-            ret.addAll(errors);
-            if (firstOnly) return ret;
-        }
-        // TODO(mccowan): Is this asking "is this the primary alignment"?
-        if (this.getReadLength() == 0 && !this.getNotPrimaryAlignmentFlag()) {
-            final Object fz = getAttribute(SAMTagUtil.getSingleton().FZ);
-            if (fz == null) {
-                final String cq = (String)getAttribute(SAMTagUtil.getSingleton().CQ);
-                final String cs = (String)getAttribute(SAMTagUtil.getSingleton().CS);
-                if (cq == null || cq.isEmpty() || cs == null || cs.isEmpty()) {
-                    if (ret == null) ret = new ArrayList<SAMValidationError>();
-                    ret.add(new SAMValidationError(SAMValidationError.Type.EMPTY_READ,
-                            "Zero-length read without FZ, CS or CQ tag", getReadName()));
-                    if (firstOnly) return ret;
-                } else if (!getReadUnmappedFlag()) {
-                    boolean hasIndel = false;
-                    for (final CigarElement cigarElement : getCigar().getCigarElements()) {
-                        if (cigarElement.getOperator() == CigarOperator.DELETION ||
-                                cigarElement.getOperator() == CigarOperator.INSERTION) {
-                            hasIndel = true;
-                            break;
-                        }
-                    }
-                    if (!hasIndel) {
-                        if (ret == null) ret = new ArrayList<SAMValidationError>();
-                        ret.add(new SAMValidationError(SAMValidationError.Type.EMPTY_READ,
-                                "Colorspace read with zero-length bases but no indel", getReadName()));
-                        if (firstOnly) return ret;
-                    }
-                }
-            }
-        }
-        if (this.getReadLength() != getBaseQualities().length &&  !Arrays.equals(getBaseQualities(), NULL_QUALS)) {
-            if (ret == null) ret = new ArrayList<SAMValidationError>();
-            ret.add(new SAMValidationError(SAMValidationError.Type.MISMATCH_READ_LENGTH_AND_QUALS_LENGTH,
-                    "Read length does not match quals length", getReadName()));
-            if (firstOnly) return ret;
-        }
-
-        if (this.getAlignmentStart() != NO_ALIGNMENT_START && this.getIndexingBin() != null &&
-                this.computeIndexingBin() != this.getIndexingBin()) {
-            if (ret == null) ret = new ArrayList<SAMValidationError>();
-            ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_INDEXING_BIN,
-                    "bin field of BAM record does not equal value computed based on alignment start and end, and length of sequence to which read is aligned",
-                    getReadName()));
-            if (firstOnly) return ret;
-        }
-
-        if (ret == null || ret.isEmpty()) {
-            return null;
-        }
-        return ret;
-    }
-
-    /**
-     * Gets the source of this SAM record -- both the reader that retrieved the record and the position on disk from
-     * whence it came. 
-     * @return The file source.  Note that the reader will be null if the reader source has not be set.
-     */
-    public SAMFileSource getFileSource() {
-        return mFileSource;
-    }
-
-    /**
-     * Sets a marker providing the source reader for this file and the position in the file from which the read originated.
-     * @param fileSource source of the given file.
-     */
-    protected void setFileSource(final SAMFileSource fileSource) {
-        mFileSource = fileSource;
-    }
-
-    private List<SAMValidationError> isValidReferenceIndexAndPosition(final Integer referenceIndex, final String referenceName,
-                                                                      final int alignmentStart, final boolean isMate) {
-        return isValidReferenceIndexAndPosition(referenceIndex, referenceName, alignmentStart, isMate, false);
-    }
-
-    private List<SAMValidationError> isValidReferenceIndexAndPosition(final Integer referenceIndex, final String referenceName,
-                                                                      final int alignmentStart, final boolean isMate, final boolean firstOnly) {
-        final boolean hasReference = hasReferenceName(referenceIndex, referenceName);
-
-        // ret is only instantiate if there are errors to report, in order to reduce GC in the typical case
-        // in which everything is valid.  It's ugly, but more efficient.
-        ArrayList<SAMValidationError> ret = null;
-        if (!hasReference) {
-            if (alignmentStart != 0) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_ALIGNMENT_START, buildMessage("Alignment start should be 0 because reference name = *.", isMate), getReadName()));
-                if (firstOnly) return ret;
-            }
-        } else {
-            if (alignmentStart == 0) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_ALIGNMENT_START, buildMessage("Alignment start should != 0 because reference name != *.", isMate), getReadName()));
-                if (firstOnly) return ret;
-            }
-            if (getHeader() != null && !getHeader().getSequenceDictionary().isEmpty()) {
-                final SAMSequenceRecord sequence =
-                        (referenceIndex != null? getHeader().getSequence(referenceIndex): getHeader().getSequence(referenceName));
-                if (sequence == null) {
-                    if (ret == null) ret = new ArrayList<SAMValidationError>();
-                    ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_REFERENCE_INDEX, buildMessage("Reference sequence not found in sequence dictionary.", isMate), getReadName()));
-                    if (firstOnly) return ret;
-                } else {
-                    if (alignmentStart > sequence.getSequenceLength()) {
-                        if (ret == null) ret = new ArrayList<SAMValidationError>();
-                        ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_ALIGNMENT_START, buildMessage("Alignment start (" + alignmentStart + ") must be <= reference sequence length (" +
-                                sequence.getSequenceLength() + ") on reference " + sequence.getSequenceName(), isMate), getReadName()));
-                        if (firstOnly) return ret;
-                    }
-                }
-            }
-        }
-        return ret;
-    }
-
-    private String buildMessage(final String baseMessage, final boolean isMate) {
-        return isMate ? "Mate " + baseMessage : baseMessage;
-    }
-
-    /**
-     * Note that this does a shallow copy of everything, except for the attribute list, for which a copy of the list
-     * is made, but the attributes themselves are copied by reference.  This should be safe because callers should
-     * never modify a mutable value returned by any of the get() methods anyway. If one of the cloned record's SEQ or
-     * QUAL needs to be modified, a deeper copy should be made (e.g. Reverse Complement).
-     */
-    @Override
-    public Object clone() throws CloneNotSupportedException {
-        final SAMRecord newRecord = (SAMRecord)super.clone();
-        if (mAttributes != null) {
-            newRecord.mAttributes = this.mAttributes.copy();
-        }
-
-        return newRecord;
-    }
-
-    /**
-     * Returns a deep copy of the SAM record, with the following exceptions:
-     *
-     *  - The header field, which shares the header reference with the original record
-     *  - The file source field, which will always always be set to null in the copy
-     */
-    public SAMRecord deepCopy() {
-        final SAMRecord newSAM = new SAMRecord(getHeader());
-
-        newSAM.setReadName(getReadName());
-        newSAM.setReadBases(Arrays.copyOf(getReadBases(), getReadLength()));
-        final byte baseQualities[] = getBaseQualities();
-        newSAM.setBaseQualities(Arrays.copyOf(baseQualities, baseQualities.length));
-        newSAM.setReferenceName(getReferenceName());
-        newSAM.setAlignmentStart(getAlignmentStart()); // clears mAlignmentEnd
-        newSAM.setMappingQuality(getMappingQuality());
-        newSAM.setCigarString(getCigarString()); // clears Cigar element and alignmentBlocks
-        newSAM.setFileSource(null);
-
-        newSAM.setFlags(getFlags());
-        newSAM.setMateReferenceName(getMateReferenceName());
-        newSAM.setMateAlignmentStart(getMateAlignmentStart());
-        newSAM.setInferredInsertSize(getInferredInsertSize());
-        // transfer the reference indices directly to avoid mutating
-        // the source record
-        newSAM.mReferenceIndex = this.mReferenceIndex;
-        newSAM.mMateReferenceIndex = this.mMateReferenceIndex;
-        newSAM.setValidationStringency(getValidationStringency());
-        SAMBinaryTagAndValue attributes = getBinaryAttributes();
-        if (null != attributes) {
-            newSAM.setAttributes(attributes.deepCopy());
-        }
-        newSAM.setIndexingBin(getIndexingBin());
-
-        return newSAM;
-    }
-
-    /** Simple toString() that gives a little bit of useful info about the read. */
-    @Override
-    public String toString() {
-        final StringBuilder builder = new StringBuilder(64);
-        builder.append(getReadName());
-        if (getReadPairedFlag()) {
-            if (getFirstOfPairFlag()) {
-                builder.append(" 1/2");
-            }
-            else {
-                builder.append(" 2/2");
-            }
-        }
-
-        builder.append(' ')
-                .append(String.valueOf(getReadLength()))
-                .append('b');
-
-        if (getReadUnmappedFlag()) {
-            builder.append(" unmapped read.");
-        }
-        else {
-            builder.append(" aligned read.");
-        }
-
-        return builder.toString();
-    }
-
-    /**
-     Returns the record in the SAM line-based text format.  Fields are
-     separated by '\t' characters, and the String is terminated by '\n'.
-     */
-    public String getSAMString() {
-        return SAMTextWriter.getSAMString(this);
-    }
-
-    public String getPairedReadName() {
-        final StringBuilder builder = new StringBuilder(64);
-        builder.append(getReadName());
-        if (getReadPairedFlag()) {
-            if (getFirstOfPairFlag()) {
-                builder.append(" 1/2");
-            } else {
-                builder.append(" 2/2");
-            }
-        }
-        return builder.toString();
-    }
-    
-    /** 
-     * shortcut to <pre>SAMFlag.getFlags( this.getFlags() );</pre>
-     * @returns a set of SAMFlag associated to this sam record */
-    public final Set<SAMFlag> getSAMFlags() {
-        return SAMFlag.getFlags(this.getFlags());
-    }
-
-    /**
-     * Fetches the value of a transient attribute on the SAMRecord, of null if not set.
-     *
-     * The intended use for transient attributes is to store values that are 1-to-1 with the SAMRecord,
-     * may be needed many times and are expensive to compute.  These values can be computed lazily and
-     * then stored as transient attributes to avoid frequent re-computation.
-     */
-    public final Object getTransientAttribute(final Object key) {
-        return (this.transientAttributes == null) ? null : this.transientAttributes.get(key);
-    }
-
-    /**
-     * Sets the value of a transient attribute, and returns the previous value if defined.
-     *
-     * The intended use for transient attributes is to store values that are 1-to-1 with the SAMRecord,
-     * may be needed many times and are expensive to compute.  These values can be computed lazily and
-     * then stored as transient attributes to avoid frequent re-computation.
-     */
-    public final Object setTransientAttribute(final Object key, final Object value) {
-        if (this.transientAttributes == null) this.transientAttributes = new HashMap<Object,Object>();
-        return this.transientAttributes.put(key, value);
-    }
-
-    /**
-     * Removes a transient attribute if it is stored, and returns the stored value. If there is not
-     * a stored value, will return null.
-     */
-    public final Object removeTransientAttribute(final Object key) {
-        if (this.transientAttributes != null) return this.transientAttributes.remove(key);
-        else return null;
-    }
-
-    /**
-     * Reverse-complement bases and reverse quality scores along with known optional attributes that
-     * need the same treatment. Changes made after making a copy of the bases, qualities,
-     * and any attributes that will be altered. If in-place update is needed use
-     * {@link #reverseComplement(boolean)}.
-     * See {@link #TAGS_TO_REVERSE_COMPLEMENT} {@link #TAGS_TO_REVERSE}
-     * for the default set of tags that are handled.
-     */
-    public void reverseComplement() {
-        reverseComplement(false);
-    }
-
-    /**
-     * Reverse-complement bases and reverse quality scores along with known optional attributes that
-     * need the same treatment. Optionally makes a copy of the bases, qualities or attributes instead
-     * of altering them in-place. See {@link #TAGS_TO_REVERSE_COMPLEMENT} {@link #TAGS_TO_REVERSE}
-     * for the default set of tags that are handled.
-     *
-     * @param inplace Setting this to false will clone all attributes, bases and qualities before changing the values.
-     */
-    public void reverseComplement(boolean inplace) {
-        reverseComplement(TAGS_TO_REVERSE_COMPLEMENT, TAGS_TO_REVERSE, inplace);
-    }
-
-    /**
-     * Reverse complement bases and reverse quality scores. In addition reverse complement any
-     * non-null attributes specified by tagsToRevcomp and reverse and non-null attributes
-     * specified by tagsToReverse.
-     */
-    public void reverseComplement(final Collection<String> tagsToRevcomp, final Collection<String> tagsToReverse, boolean inplace) {
-        final byte[] readBases = inplace ? getReadBases() : getReadBases().clone();
-        SequenceUtil.reverseComplement(readBases);
-        setReadBases(readBases);
-        final byte qualities[] = inplace ? getBaseQualities() : getBaseQualities().clone();
-        reverseArray(qualities);
-        setBaseQualities(qualities);
-
-        // Deal with tags that need to be reverse complemented
-        if (tagsToRevcomp != null) {
-            for (final String tag: tagsToRevcomp) {
-                Object value = getAttribute(tag);
-                if (value != null) {
-                    if (value instanceof byte[]) {
-                        value = inplace ? value : ((byte[]) value).clone();
-                        SequenceUtil.reverseComplement((byte[]) value);
-                    } else if (value instanceof String) {
-                        //SequenceUtil.reverseComplement is in-place for bytes but copies Strings since they are immutable.
-                        value = SequenceUtil.reverseComplement((String) value);
-                    } else {
-                        throw new UnsupportedOperationException("Don't know how to reverse complement: " + value);
-                    }
-                    setAttribute(tag, value);
-                }
-            }
-        }
-
-        // Deal with tags that needed to just be reversed
-        if (tagsToReverse != null) {
-            for (final String tag : tagsToReverse) {
-                Object value = getAttribute(tag);
-                if (value != null) {
-                    if (value instanceof String) {
-                        value = StringUtil.reverseString((String) value);
-                    } else if (value.getClass().isArray()) {
-                        if (value instanceof byte[]) {
-                            value = inplace ? value : ((byte[]) value).clone();
-                            reverseArray((byte[]) value);
-                        } else if (value instanceof short[]) {
-                            value = inplace ? value : ((short[]) value).clone();
-                            reverseArray((short[]) value);
-                        } else if (value instanceof int[]) {
-                            value = inplace ? value : ((int[]) value).clone();
-                            reverseArray((int[]) value);
-                        } else if (value instanceof float[]) {
-                            value = inplace ? value : ((float[]) value).clone();
-                            reverseArray((float[]) value);
-                        } else {
-                            throw new UnsupportedOperationException("Reversing array attribute of type " + value.getClass().getComponentType() + " not supported.");
-                        }
-                    } else {
-                        throw new UnsupportedOperationException("Don't know how to reverse: " + value);
-                    }
-
-                    setAttribute(tag, value);
-                }
-            }
-        }
-    }
-
-    private static void reverseArray(final byte[] array) {
-        for (int i=0, j=array.length-1; i<j; ++i, --j) {
-            final byte tmp = array[i];
-            array[i] = array[j];
-            array[j] = tmp;
-        }
-    }
-
-    private static void reverseArray(final short[] array) {
-        for (int i=0, j=array.length-1; i<j; ++i, --j) {
-            final short tmp = array[i];
-            array[i] = array[j];
-            array[j] = tmp;
-        }
-    }
-
-    private static void reverseArray(final int[] array) {
-        for (int i=0, j=array.length-1; i<j; ++i, --j) {
-            final int tmp = array[i];
-            array[i] = array[j];
-            array[j] = tmp;
-        }
-    }
-
-    private static void reverseArray(final float[] array) {
-        for (int i=0, j=array.length-1; i<j; ++i, --j) {
-            final float tmp = array[i];
-            array[i] = array[j];
-            array[j] = tmp;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordComparator.java b/src/main/java/htsjdk/samtools/SAMRecordComparator.java
deleted file mode 100644
index a39bedb..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordComparator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.Comparator;
-
-/**
- * Interface for comparators that define the various SAM sort orders.
- */
-public interface SAMRecordComparator extends Comparator<SAMRecord> {
-
-    /**
-     * Less stringent compare method than the regular compare.  If the two records
-     * are equal enough that their ordering in a sorted SAM file would be arbitrary,
-     * this method returns 0.
-     * @return negative if samRecord1 < samRecord2,  0 if equal, else positive
-     */
-    public int fileOrderCompare(SAMRecord samRecord1, SAMRecord samRecord2);
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordCoordinateComparator.java b/src/main/java/htsjdk/samtools/SAMRecordCoordinateComparator.java
deleted file mode 100644
index e8887bc..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordCoordinateComparator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-
-/**
- * Comparator for sorting SAMRecords by coordinate.  Note that the header is required because
- * the order of sequences in the header defines the major sort order.
- *
- * Ideally this method would only return 0 for completely equal SAMRecords, so that sort is
- * completely deterministic.  This implementation does not achieve this completely, but it
- * comes pretty close, while avoiding decoding the variable length fields, except for read name,
- * which is decoded if coordinate and strand are equal.
- *
- * Extreme care must be taken to ensure the following:
- * if A == B, then B == A
- * if A < B, then B > A
- * if A < B && B < C, then A < C
- *
- */
-public class SAMRecordCoordinateComparator implements SAMRecordComparator, Serializable {
-    private static final long serialVersionUID = 1L;
-
-    public int compare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
-        int cmp = fileOrderCompare(samRecord1, samRecord2);
-        if (cmp != 0) {
-            return cmp;
-        }
-        // Test of negative strand flag is not really necessary, because it is tested
-        // with cmp if getFlags, but it is left here because that is the way it was done
-        // in the past.
-        if (samRecord1.getReadNegativeStrandFlag() == samRecord2.getReadNegativeStrandFlag()) {
-            cmp = samRecord1.getReadName().compareTo(samRecord2.getReadName());
-            if (cmp != 0) return cmp;
-            cmp = compareInts(samRecord1.getFlags(), samRecord2.getFlags());
-            if (cmp != 0) return cmp;
-            cmp = compareInts(samRecord1.getMappingQuality(), samRecord2.getMappingQuality());
-            if (cmp != 0) return cmp;
-            cmp = compareInts(samRecord1.getMateReferenceIndex(), samRecord2.getMateReferenceIndex());
-            if (cmp != 0) return cmp;
-            cmp = compareInts(samRecord1.getMateAlignmentStart(), samRecord2.getMateAlignmentStart());
-            if (cmp != 0) return cmp;
-            cmp = compareInts(samRecord1.getInferredInsertSize(), samRecord2.getInferredInsertSize());
-            return cmp;
-
-        }
-        else return (samRecord1.getReadNegativeStrandFlag()? 1: -1);
-    }
-
-    private int compareInts(int i1, int i2) {
-        if (i1 < i2) return -1;
-        else if (i1 > i2) return 1;
-        else return 0;
-    }
-
-    /**
-     * Less stringent compare method than the regular compare.  If the two records
-     * are equal enough that their ordering in a sorted SAM file would be arbitrary,
-     * this method returns 0.  If read is paired and unmapped, use the mate mapping to sort.
-     * Records being compared must have non-null SAMFileHeaders.
-     *
-     * @return negative if samRecord1 < samRecord2,  0 if equal, else positive
-     */
-    public int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
-
-        if (null == samRecord1.getHeader() || null == samRecord2.getHeader()) {
-            throw new IllegalArgumentException("Records must have non-null SAMFileHeaders to be compared");
-        }
-
-        final int refIndex1 = samRecord1.getReferenceIndex();
-        final int refIndex2 = samRecord2.getReferenceIndex();
-        if (refIndex1 == -1) {
-            return (refIndex2 == -1? 0: 1);
-        } else if (refIndex2 == -1) {
-            return -1;
-        }
-        final int cmp = refIndex1 - refIndex2;
-        if (cmp != 0) {
-            return cmp;
-        }
-        return samRecord1.getAlignmentStart() - samRecord2.getAlignmentStart();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordDuplicateComparator.java b/src/main/java/htsjdk/samtools/SAMRecordDuplicateComparator.java
deleted file mode 100644
index 4ed2bb5..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordDuplicateComparator.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.DuplicateScoringStrategy.ScoringStrategy;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Compares records based on if they should be considered PCR Duplicates (see MarkDuplicates).
- * 
- * There are three orderings provided by this comparator: compare, duplicateSetCompare, and fileOrderCompare.
- *  
- * Specify the headers when constructing this comparator if you would like to consider the library as the major sort key.
- * The records being compared must also have non-null SAMFileHeaders.
- *
- * @author nhomer
- */
-public class SAMRecordDuplicateComparator implements SAMRecordComparator, Serializable {
-    private static final long serialVersionUID = 1L;
-
-    /** An enum to provide type-safe keys for transient attributes the comparator puts on SAMRecords. */
-    private static enum Attr {
-        LibraryId, ReadCoordinate, MateCoordinate
-    }
-
-    private static final byte FF = 0, FR = 1, F = 2, RF = 3, RR = 4, R = 5;
-
-    private final Map<String, Short> libraryIds = new HashMap<String, Short>(); // from library string to library id
-    private short nextLibraryId = 1;
-    
-    private ScoringStrategy scoringStrategy = ScoringStrategy.TOTAL_MAPPED_REFERENCE_LENGTH;
-    
-    public SAMRecordDuplicateComparator() {}
-
-    public SAMRecordDuplicateComparator(final List<SAMFileHeader> headers) {
-        // pre-populate the library names
-        for (final SAMFileHeader header : headers) {
-            for (final SAMReadGroupRecord readGroup : header.getReadGroups()) {
-                final String libraryName = readGroup.getLibrary();
-                if (null != libraryName) {
-                    final short libraryId = this.nextLibraryId++;
-                    this.libraryIds.put(libraryName, libraryId);
-                }
-            }
-        }
-    }
-    
-    public void setScoringStrategy(final ScoringStrategy scoringStrategy) {
-        this.scoringStrategy = scoringStrategy;
-    }
-
-    /**
-     * Populates the set of transient attributes on SAMRecords if they are not already there.
-     */
-    private void populateTransientAttributes(final SAMRecord... recs) {
-        for (final SAMRecord rec : recs) {
-            if (rec.getTransientAttribute(Attr.LibraryId) != null) continue;
-            rec.setTransientAttribute(Attr.LibraryId, getLibraryId(rec));
-            rec.setTransientAttribute(Attr.ReadCoordinate, rec.getReadNegativeStrandFlag() ? rec.getUnclippedEnd() : rec.getUnclippedStart());
-            rec.setTransientAttribute(Attr.MateCoordinate, getMateCoordinate(rec));
-        }
-    }
-
-    /**
-     * Gets the library name from the header for the record. If the RG tag is not present on
-     * the record, or the library isn't denoted on the read group, a constant string is
-     * returned.
-     */
-    private static String getLibraryName(final SAMRecord rec) {
-        final String readGroupId = (String) rec.getAttribute("RG");
-
-        if (readGroupId != null) {
-            final SAMFileHeader samHeader = rec.getHeader();
-            if (null != samHeader) {
-                final SAMReadGroupRecord rg = samHeader.getReadGroup(readGroupId);
-                if (rg != null) {
-                    final String libraryName = rg.getLibrary();
-                    if (null != libraryName) return libraryName;
-                }
-            }
-        }
-
-        return "Unknown Library";
-    }
-
-    /** Get the library ID for the given SAM record. */
-    private short getLibraryId(final SAMRecord rec) {
-        final String library = getLibraryName(rec);
-        Short libraryId = this.libraryIds.get(library);
-
-        if (libraryId == null) {
-            libraryId = this.nextLibraryId++;
-            this.libraryIds.put(library, libraryId);
-        }
-
-        return libraryId;
-    }
-
-    /**
-     * Convenience method for comparing two orientation bytes.  This is critical if we have mapped reads compared to fragment reads.
-     */
-    private int compareOrientationByteCollapseOrientation(final int orientation1, final int orientation2) {
-        // F == FR, F == FF
-        // R == RF, R == RR
-        if (F == orientation1 || R == orientation1) { // first orientation is fragment
-            /**
-             * We want 
-             * F == FR, F == FF
-             * R == RF, R == RR
-             */
-            if (F == orientation1) {
-                if (F == orientation2 || FR == orientation2 || FF == orientation2) {
-                    return 0;
-                }
-            }
-            else { // R == orientation1
-                if (R == orientation2 || RF == orientation2 || RR == orientation2) {
-                    return 0;
-                }
-            }
-        }
-        else if (F == orientation2 || R == orientation2) { // first orientation is paired, second is fragment
-            return -compareOrientationByteCollapseOrientation(orientation2, orientation1);
-        }
-
-        return orientation1 - orientation2;
-    }
-    
-    /**
-     * Returns a single byte that encodes the orientation of the two reads in a pair.
-     */
-    private static byte getPairedOrientationByte(final boolean read1NegativeStrand, final boolean read2NegativeStrand) {
-        if (read1NegativeStrand) {
-            if (read2NegativeStrand) return SAMRecordDuplicateComparator.RR;
-            else return SAMRecordDuplicateComparator.RF;
-        } else {
-            if (read2NegativeStrand) return SAMRecordDuplicateComparator.FR;
-            else return SAMRecordDuplicateComparator.FF;
-        }
-    }
-    
-    private int getFragmentOrientation(final SAMRecord record) {
-         return record.getReadNegativeStrandFlag() ? SAMRecordDuplicateComparator.R : SAMRecordDuplicateComparator.F;
-    }
-
-    private int getPairedOrientation(final SAMRecord record) {
-        if (record.getReadPairedFlag() && !record.getReadUnmappedFlag() && !record.getMateUnmappedFlag()) {
-            return getPairedOrientationByte(record.getReadNegativeStrandFlag(), record.getMateNegativeStrandFlag());
-        } else {
-            return getFragmentOrientation(record);
-        }
-    }
-
-    private int getMateReferenceIndex(final SAMRecord record) {
-        if (record.getReadPairedFlag() && !record.getReadUnmappedFlag() && !record.getMateUnmappedFlag()) {
-            return record.getMateReferenceIndex();
-        } else {
-            return -1;
-        }
-    }
-
-    private int getMateCoordinate(final SAMRecord record) {
-        if (record.getReadPairedFlag() && !record.getReadUnmappedFlag() && !record.getMateUnmappedFlag()) {
-            return record.getMateNegativeStrandFlag() ? SAMUtils.getMateUnclippedEnd(record) : SAMUtils.getMateUnclippedStart(record);
-        } else {
-            return -1;
-        }
-    }
-    
-    /** Is one end of a pair, or the fragment, unmapped? */
-    private boolean hasUnmappedEnd(final SAMRecord record) {
-        return (record.getReadUnmappedFlag() || (record.getReadPairedFlag() && record.getMateUnmappedFlag()));
-    }
-
-    /** Are both ends of a pair, or the fragment, mapped? */
-    private boolean hasMappedEnd(final SAMRecord record) {
-        return (!record.getReadUnmappedFlag() || (record.getReadPairedFlag() && !record.getMateUnmappedFlag()));
-    }
-    
-    /** Is this paired end and are both ends of a pair mapped */
-    private boolean pairedEndAndBothMapped(final SAMRecord record) {
-        return (record.getReadPairedFlag() && !record.getReadUnmappedFlag() && !record.getMateUnmappedFlag());
-        
-    }
-
-    /**
-     * Most stringent comparison.
-     *
-     * Two records are compared based on if they are duplicates of each other, and then based
-     * on if they should be prioritized for being the most "representative".  Typically, the representative
-     * is the record in the SAM file that is *not* marked as a duplicate within a set of duplicates.
-     *  
-     * Compare by file order, then duplicate scoring strategy, read name.
-     * 
-     * If both reads are paired and both ends mapped, always prefer the first end over the second end.  This is needed to
-     * properly choose the first end for optical duplicate identification when both ends are mapped to the same position etc. 
-     */ 
-    public int compare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
-        populateTransientAttributes(samRecord1, samRecord2);
-        int cmp;
-
-        // temporary variables for comparisons
-        int samRecord1Value, samRecord2Value;
-
-        cmp = fileOrderCompare(samRecord1, samRecord2);
-        // the duplicate scoring strategy
-        if (cmp == 0) {
-            cmp = DuplicateScoringStrategy.compare(samRecord1, samRecord2, this.scoringStrategy, true);
-        }
-        // the read name
-        if (cmp == 0) {
-            cmp = samRecord1.getReadName().compareTo(samRecord2.getReadName());
-        }
-        // needed for optical duplicate detection when both ends are mapped to the same position.
-        if (cmp == 0) {
-            if (samRecord1.getReadPairedFlag() && samRecord2.getReadPairedFlag()) {
-                samRecord1Value = samRecord1.getFirstOfPairFlag() ? 0 : 1;
-                samRecord2Value = samRecord2.getFirstOfPairFlag() ? 0 : 1;
-                cmp = samRecord1Value - samRecord2Value;
-            }
-        }
-
-        return cmp;
-    }
-
-    /**
-     * Compares: Library identifier, reference index, read coordinate, orientation of the read (or read pair), mate's coordinate (if paired and mapped),
-     * mapped ends, ...
-     *  
-     * collapseOrientation - true if we want cases where fragment orientation to paired end orientation can be equal (ex. F == FR), false otherwise
-     * considerNumberOfEndsMappedAndPairing - true if we want to prefer paired ends with both ends mapped over paired ends with only one end mapped, or paired ends with end
-     * mapped over fragment reads, false otherwise.
-     *  
-     */
-    private int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2, final boolean collapseOrientation, final boolean considerNumberOfEndsMappedAndPairing) {
-        populateTransientAttributes(samRecord1, samRecord2);
-        int cmp;
-
-        if (null == samRecord1.getHeader() || null == samRecord2.getHeader()) {
-            throw new IllegalArgumentException("Records must have non-null SAMFileHeaders to be compared");
-        }
-
-        // temporary variables for comparisons
-        int samRecord1Value, samRecord2Value;
-
-        // library identifier
-        {
-            samRecord1Value = (Short) samRecord1.getTransientAttribute(Attr.LibraryId);
-            samRecord2Value = (Short) samRecord2.getTransientAttribute(Attr.LibraryId);
-            cmp = samRecord1Value - samRecord2Value;
-        }
-        // reference index
-        if (cmp == 0) {
-            samRecord1Value = samRecord1.getReferenceIndex();
-            samRecord2Value = samRecord2.getReferenceIndex();
-            // NB: this accounts for unmapped reads to be placed at the ends of the file
-            if (samRecord1Value == -1) {
-                cmp = (samRecord2Value == -1) ? 0 : 1;
-            }
-            else if (samRecord2Value == -1) {
-                cmp = -1;
-            }
-            else {
-                cmp = samRecord1Value - samRecord2Value;
-            }
-        }
-        // read coordinate
-        if (cmp == 0) {
-            samRecord1Value = (Integer) samRecord1.getTransientAttribute(Attr.ReadCoordinate);
-            samRecord2Value = (Integer) samRecord2.getTransientAttribute(Attr.ReadCoordinate);
-            cmp = samRecord1Value - samRecord2Value;
-        }
-        // orientation
-        if (cmp == 0) {
-            samRecord1Value = getPairedOrientation(samRecord1);
-            samRecord2Value = getPairedOrientation(samRecord2);
-            if (collapseOrientation) {
-                cmp = compareOrientationByteCollapseOrientation(samRecord1Value, samRecord2Value);
-            }
-            else {
-                cmp = samRecord1Value - samRecord2Value;
-            }
-        }
-        // both ends need to be mapped
-        if (pairedEndAndBothMapped(samRecord1) && pairedEndAndBothMapped(samRecord2)) {
-            // mate's reference index
-            if (cmp == 0) {
-                samRecord1Value = getMateReferenceIndex(samRecord1);
-                samRecord2Value = getMateReferenceIndex(samRecord2);
-                cmp = samRecord1Value - samRecord2Value;
-            }
-            // mate's coordinate
-            if (cmp == 0) {
-                samRecord1Value = (Integer) samRecord1.getTransientAttribute(Attr.MateCoordinate);
-                samRecord2Value = (Integer) samRecord2.getTransientAttribute(Attr.MateCoordinate);;
-                cmp = samRecord1Value - samRecord2Value;
-            }
-        }
-        if (cmp == 0) {
-            samRecord1Value = hasMappedEnd(samRecord1) ? 0 : 1;
-            samRecord2Value = hasMappedEnd(samRecord2) ? 0 : 1;
-            cmp = samRecord1Value - samRecord2Value;
-        }
-        // if both paired or both unpaired, then check if one of the two ends (or single end) is unmapped
-        // else prefer the one that is paired end
-        if (cmp == 0 && considerNumberOfEndsMappedAndPairing) {
-            if (samRecord1.getReadPairedFlag() == samRecord2.getReadPairedFlag()) {
-                // Is this unmapped or its mate?
-                samRecord1Value = hasUnmappedEnd(samRecord1) ? 1 : 0;
-                samRecord2Value = hasUnmappedEnd(samRecord2) ? 1 : 0;
-                cmp = samRecord1Value - samRecord2Value;
-            }
-            else { // if we care if one is paired and the other is not
-                cmp = samRecord1.getReadPairedFlag() ? -1 : 1;
-            }
-        }
-
-        return cmp;
-    }
-
-    /**
-     * Less stringent than compare, such that two records are equal enough such that their ordering within their duplicate set would be arbitrary.
-     *
-     * Major difference between this and fileOrderCompare is how we compare the orientation byte.  Here we want:
-     *   F == FR, F == FF
-     *   R == RF, R == RR
-     */
-    public int duplicateSetCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
-        return fileOrderCompare(samRecord1, samRecord2, true, false);
-    }
-
-    /**
-     * Less stringent than duplicateSetCompare, such that two records are equal enough such that their ordering in a sorted SAM file would be arbitrary.
-     */
-    public int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
-        return fileOrderCompare(samRecord1, samRecord2, false, true);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordFactory.java b/src/main/java/htsjdk/samtools/SAMRecordFactory.java
deleted file mode 100644
index 0db0646..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordFactory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * Factory interface which allows plugging in of different classes for generating instances of
- * SAMRecord and BAMRecord when reading from SAM/BAM files.
- *
- * @author Tim Fennell
- */
-public interface SAMRecordFactory {
-
-    /** Create a new SAMRecord to be filled in */
-    public SAMRecord createSAMRecord(SAMFileHeader header);
-
-    /** Create a new BAM Record. */
-    public BAMRecord createBAMRecord(final SAMFileHeader header,
-                                     final int referenceSequenceIndex,
-                                     final int alignmentStart,
-                                     final short readNameLength,
-                                     final short mappingQuality,
-                                     final int indexingBin,
-                                     final int cigarLen,
-                                     final int flags,
-                                     final int readLen,
-                                     final int mateReferenceSequenceIndex,
-                                     final int mateAlignmentStart,
-                                     final int insertSize,
-                                     final byte[] variableLengthBlock);
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordIterator.java b/src/main/java/htsjdk/samtools/SAMRecordIterator.java
deleted file mode 100755
index 4ba5807..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordIterator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-/**
- * A general interface that adds functionality to a CloseableIterator of
- * SAMRecords.  Currently, this interface is implemented by iterators that
- * want to validate as they are iterating that that the records in the
- * underlying SAM/BAM file are in a particular order.
- */
-public interface SAMRecordIterator extends CloseableIterator<SAMRecord> {
-
-    /**
-     * Establishes that records returned by this iterator are expected to
-     * be in the specified sort order.  If this method has been called,
-     * then implementers must throw an IllegalStateException from next()
-     * when a record is read that violates the sort order.  This method
-     * may be called multiple times over the course of an iteration,
-     * changing the expected sort, if desired -- from the time it is called,
-     * it validates whatever sort is set, or stops validating if it
-     * is set to null or SAMFileHeader.SortOrder.unsorted.  If this method
-     * is not called, then no validation of the iterated records is done.
-     *
-     * @param sortOrder The order in which records are expected to be returned
-     * @return  This SAMRecordIterator
-     */
-    public SAMRecordIterator assertSorted(SAMFileHeader.SortOrder sortOrder);
-    
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordQueryHashComparator.java b/src/main/java/htsjdk/samtools/SAMRecordQueryHashComparator.java
deleted file mode 100644
index dce2ffb..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordQueryHashComparator.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Tim Fennell
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Murmur3;
-
-import java.io.Serializable;
-
-/**
- * SAMRecord comparator that provides an ordering based on a hash of the queryname. Has
- * the useful property that reads with the same name will be grouped together, but that
- * reads appear in an otherwise random order.  Useful for when the read names in a BAM
- * are correlated to something else (e.g. position, read group), making a straight
- * queryname sort undesirable.
- *
- * @author Tim Fennell
- */
-public class SAMRecordQueryHashComparator extends SAMRecordQueryNameComparator implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private final Murmur3 hasher = new Murmur3(42);
-
-    /**
-     * Compares two records based on an integer hash of their read name's. If the hash
-     * values are equal, falls back to the behaviour of SAMRecordQueryNameComparator
-     * to break the tie.
-     */
-    @Override
-    public int compare(final SAMRecord lhs, final SAMRecord rhs) {
-        final int retval = compareHashes(lhs, rhs);
-        if (retval == 0) return super.compare(lhs, rhs);
-        else return retval;
-    }
-
-    /**
-     * Compares two records based on an integer hash of their read names. If the hash
-     * values are equal, falls back to the behaviour of SAMRecordQueryNameComparator
-     * to break the tie.
-     */
-    @Override
-    public int fileOrderCompare(final SAMRecord lhs, final SAMRecord rhs) {
-        final int retval = compareHashes(lhs, rhs);
-        if (retval == 0) return super.fileOrderCompare(lhs, rhs);
-        else return retval;
-    }
-
-    /** Compares the hash values for two records. */
-    private int compareHashes(final SAMRecord lhs, final SAMRecord rhs) {
-        return Integer.compare(this.hasher.hashUnencodedChars(lhs.getReadName()), this.hasher.hashUnencodedChars(rhs.getReadName()));
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordQueryNameComparator.java b/src/main/java/htsjdk/samtools/SAMRecordQueryNameComparator.java
deleted file mode 100644
index 7fd97f5..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordQueryNameComparator.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-
-/**
- * Comparator for "queryname" ordering of SAMRecords.
- */
-public class SAMRecordQueryNameComparator implements SAMRecordComparator, Serializable {
-    private static final long serialVersionUID = 1L;
-
-    public int compare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
-        int cmp = fileOrderCompare(samRecord1, samRecord2);
-        if (cmp != 0) {
-            return cmp;
-        }
-
-        final boolean r1Paired = samRecord1.getReadPairedFlag();
-        final boolean r2Paired = samRecord2.getReadPairedFlag();
-
-        if (r1Paired || r2Paired) {
-            if (!r1Paired) return 1;
-            else if (!r2Paired) return -1;
-            else if (samRecord1.getFirstOfPairFlag()  && samRecord2.getSecondOfPairFlag()) return -1;
-            else if (samRecord1.getSecondOfPairFlag() && samRecord2.getFirstOfPairFlag()) return 1;
-        }
-
-        if (samRecord1.getReadNegativeStrandFlag() != samRecord2.getReadNegativeStrandFlag()) {
-            return (samRecord1.getReadNegativeStrandFlag()? 1: -1);
-        }
-        if (samRecord1.getNotPrimaryAlignmentFlag() != samRecord2.getNotPrimaryAlignmentFlag()) {
-            return samRecord2.getNotPrimaryAlignmentFlag()? -1: 1;
-        }
-        if (samRecord1.getSupplementaryAlignmentFlag() != samRecord2.getSupplementaryAlignmentFlag()) {
-            return samRecord2.getSupplementaryAlignmentFlag() ? -1 : 1;
-        }
-        final Integer hitIndex1 = samRecord1.getIntegerAttribute(SAMTag.HI.name());
-        final Integer hitIndex2 = samRecord2.getIntegerAttribute(SAMTag.HI.name());
-        if (hitIndex1 != null) {
-            if (hitIndex2 == null) return 1;
-            else {
-                cmp = hitIndex1.compareTo(hitIndex2);
-                if (cmp != 0) return cmp;
-            }
-        } else if (hitIndex2 != null) return -1;
-        return 0;
-    }
-
-    /**
-     * Less stringent compare method than the regular compare.  If the two records
-     * are equal enough that their ordering in a sorted SAM file would be arbitrary,
-     * this method returns 0.
-     *
-     * @return negative if samRecord1 < samRecord2,  0 if equal, else positive
-     */
-    public int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
-        return compareReadNames(samRecord1.getReadName(), samRecord2.getReadName());
-    }
-
-    /**
-     * Encapsulate algorithm for comparing read names in queryname-sorted file, since there have been
-     * conversations about changing the behavior.
-     */
-    public static int compareReadNames(final String readName1, final String readName2) {
-        return readName1.compareTo(readName2);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java b/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java
deleted file mode 100644
index 2af91c3..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java
+++ /dev/null
@@ -1,576 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.DuplicateScoringStrategy.ScoringStrategy;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.SequenceUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Random;
-import java.util.TreeSet;
-
-/**
- * Factory class for creating SAMRecords for testing purposes. Various methods can be called
- * to add new SAM records (or pairs of records) to a list which can then be returned at
- * any point. The records must reference human chromosomes (excluding randoms etc.).
- * <p/>
- * Although this is a class for testing, it is in the src tree because it is included in the sam jarfile.
- *
- * @author Tim Fennell
- */
-public class SAMRecordSetBuilder implements Iterable<SAMRecord> {
-    private static final String[] chroms = {
-            "chr1", "chr2", "chr3", "chr4", "chr5", "chr6", "chr7", "chr8", "chr9", "chr10",
-            "chr11", "chr12", "chr13", "chr14", "chr15", "chr16", "chr17", "chr18", "chr19", "chr20",
-            "chr21", "chr22", "chrX", "chrY", "chrM"
-    };
-    private static final byte[] BASES = {'A', 'C', 'G', 'T'};
-    private static final String READ_GROUP_ID = "1";
-    private static final String SAMPLE = "FREE_SAMPLE";
-    private final Random random = new Random();
-
-    private SAMFileHeader header;
-    private final Collection<SAMRecord> records;
-
-    private int readLength = 36;
-
-    private SAMProgramRecord programRecord = null;
-    private SAMReadGroupRecord readGroup = null;
-    private boolean useNmFlag = false;
-
-    private boolean unmappedHasBasesAndQualities = true;
-    
-    public static final int DEFAULT_CHROMOSOME_LENGTH = 200000000;
-
-    public static final ScoringStrategy DEFAULT_DUPLICATE_SCORING_STRATEGY = ScoringStrategy.TOTAL_MAPPED_REFERENCE_LENGTH;
-
-    /**
-     * Constructs a new SAMRecordSetBuilder with all the data needed to keep the records
-     * sorted in coordinate order.
-     */
-    public SAMRecordSetBuilder() {
-        this(true, SAMFileHeader.SortOrder.coordinate);
-    }
-
-    /**
-     * Construct a new SAMRecordSetBuilder.
-     *
-     * @param sortOrder If sortForMe, defines the sort order.
-     * @param sortForMe If true, keep the records created in sorted order.
-     */
-    public SAMRecordSetBuilder(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder) {
-        this(sortForMe, sortOrder, true);
-    }
-
-    public SAMRecordSetBuilder(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder, final boolean addReadGroup) {
-        this(sortForMe, sortOrder, addReadGroup, DEFAULT_CHROMOSOME_LENGTH);
-    }
-
-    public SAMRecordSetBuilder(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder, final boolean addReadGroup, final int defaultChromosomeLength) {
-        this(sortForMe, sortOrder, addReadGroup, defaultChromosomeLength, DEFAULT_DUPLICATE_SCORING_STRATEGY);
-    }
-
-    public SAMRecordSetBuilder(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder, final boolean addReadGroup,
-                               final int defaultChromosomeLength, final ScoringStrategy duplicateScoringStrategy) {
-        final List<SAMSequenceRecord> sequences = new ArrayList<SAMSequenceRecord>();
-        for (final String chrom : chroms) {
-            final SAMSequenceRecord sequenceRecord = new SAMSequenceRecord(chrom, defaultChromosomeLength);
-            sequences.add(sequenceRecord);
-        }
-
-        this.header = new SAMFileHeader();
-        this.header.setSequenceDictionary(new SAMSequenceDictionary(sequences));
-        this.header.setSortOrder(sortOrder);
-        if (sortForMe) {
-            final SAMRecordComparator comparator;
-            if (sortOrder == SAMFileHeader.SortOrder.queryname) {
-                comparator = new SAMRecordQueryNameComparator();
-            } else {
-                comparator = new SAMRecordCoordinateComparator();
-            }
-            this.records = new TreeSet<SAMRecord>(comparator);
-        } else {
-            this.records = new ArrayList<SAMRecord>();
-        }
-
-        if (addReadGroup) {
-            final SAMReadGroupRecord readGroupRecord = new SAMReadGroupRecord(READ_GROUP_ID);
-            readGroupRecord.setSample(SAMPLE);
-            readGroupRecord.setPlatform("ILLUMINA");
-            final List<SAMReadGroupRecord> readGroups = new ArrayList<SAMReadGroupRecord>();
-            readGroups.add(readGroupRecord);
-            this.header.setReadGroups(readGroups);
-        }
-    }
-
-    public void setUnmappedHasBasesAndQualities(final boolean value) {
-        this.unmappedHasBasesAndQualities = value;
-    }
-
-    public int size() {
-        return this.records.size();
-    }
-
-    /**
-     * Set the seed of the random number generator for cases in which repeatable result is desired.
-     *
-     * @param seed
-     */
-    public void setRandomSeed(final long seed) {
-        random.setSeed(seed);
-    }
-
-    /**
-     * Adds the given program record to the header, and assigns the PG tag to any SAMRecords
-     * created after it has been added. May be called multiple times in order to assign different
-     * PG IDs to different SAMRecords.  programRecord may be null to stop assignment of PG tag.
-     * It is up to the caller to ensure that program record IDs do not collide.
-     */
-    public void setProgramRecord(final SAMProgramRecord programRecord) {
-        this.programRecord = programRecord;
-        if (programRecord != null) {
-            this.header.addProgramRecord(programRecord);
-        }
-    }
-
-    public void setUseNmFlag(final boolean useNmFlag) {
-        this.useNmFlag = useNmFlag;
-    }
-
-    public void setReadGroup(final SAMReadGroupRecord readGroup) {
-        this.readGroup = readGroup;
-        if (readGroup != null) {
-            this.header.addReadGroup(readGroup);
-        }
-    }
-
-    /** Returns the accumulated list of sam records. */
-    public Collection<SAMRecord> getRecords() { return this.records; }
-
-    public void setHeader(final SAMFileHeader header) {
-        this.header = header.clone();
-    }
-
-
-    /** The record should already have the DS and MC tags computed */
-    public void addRecord(final SAMRecord record) {
-        if (record.getReadPairedFlag() && !record.getMateUnmappedFlag() &&
-                null == record.getAttribute(SAMTagUtil.getSingleton().MC)) {
-            throw new SAMException("Mate Cigar tag (MC) not found in: " + record.getReadName());
-        }
-        this.records.add(record);
-    }
-
-    /** Returns a CloseableIterator over the collection of SAMRecords. */
-    public CloseableIterator<SAMRecord> iterator() {
-        return new CloseableIterator<SAMRecord>() {
-            private final Iterator<SAMRecord> iterator = records.iterator();
-
-            public void close() { /** Do nothing. */}
-
-            public boolean hasNext() { return this.iterator.hasNext(); }
-
-            public SAMRecord next() { return this.iterator.next(); }
-
-            public void remove() { this.iterator.remove(); }
-        };
-    }
-
-    /**
-     * Adds a fragment record (mapped or unmapped) to the set using the provided contig start and optionally the strand,
-     * cigar string, quality string or default quality score.  This does not modify the flag field, which should be updated
-     * if desired before adding the return to the list of records.
-     */
-    private SAMRecord createReadNoFlag(final String name, final int contig, final int start, final boolean negativeStrand,
-                                       final boolean recordUnmapped, final String cigar, final String qualityString,
-                                       final int defaultQuality) throws SAMException {
-        final SAMRecord rec = new SAMRecord(this.header);
-        rec.setReadName(name);
-        if (header.getSequenceDictionary().size() <= contig) {
-            throw new SAMException("Contig too big [" + header.getSequenceDictionary().size() + " < " + contig);
-        }
-        if (0 <= contig) {
-            rec.setReferenceIndex(contig);
-            rec.setAlignmentStart(start);
-        }
-        if (!recordUnmapped) {
-            rec.setReadNegativeStrandFlag(negativeStrand);
-            if (null != cigar) {
-                rec.setCigarString(cigar);
-            } else if (!rec.getReadUnmappedFlag()) {
-                rec.setCigarString(readLength + "M");
-            }
-            rec.setMappingQuality(255);
-        } else {
-            rec.setReadUnmappedFlag(true);
-        }
-        rec.setAttribute(SAMTag.RG.name(), READ_GROUP_ID);
-
-        if(useNmFlag){
-            rec.setAttribute(SAMTag.NM.name(), SequenceUtil.calculateSamNmTagFromCigar(rec));
-        }
-
-        if (programRecord != null) {
-            rec.setAttribute(SAMTag.PG.name(), programRecord.getProgramGroupId());
-        }
-
-        if (readGroup != null) {
-            rec.setAttribute(SAMTag.RG.name(), readGroup.getReadGroupId());
-        }
-
-        if (!recordUnmapped || this.unmappedHasBasesAndQualities) {
-        fillInBasesAndQualities(rec, qualityString, defaultQuality);
-        }
-
-        return rec;
-    }
-
-    /**
-     * Adds a skeletal fragment (non-PE) record to the set using the provided
-     * contig start and strand information.
-     */
-    public SAMRecord addFrag(final String name, final int contig, final int start, final boolean negativeStrand) {
-        return addFrag(name, contig, start, negativeStrand, false, null, null, -1);
-    }
-
-    /**
-     * Adds a fragment record (mapped or unmapped) to the set using the provided contig start and optionally the strand,
-     * cigar string, quality string or default quality score.
-     */
-    public SAMRecord addFrag(final String name, final int contig, final int start, final boolean negativeStrand,
-                             final boolean recordUnmapped, final String cigar, final String qualityString,
-                             final int defaultQuality) throws SAMException {
-        return addFrag(name, contig, start, negativeStrand, recordUnmapped, cigar, qualityString, defaultQuality, false);
-    }
-
-    /**
-     * Adds a fragment record (mapped or unmapped) to the set using the provided contig start and optionally the strand,
-     * cigar string, quality string or default quality score.
-     */
-    public SAMRecord addFrag(final String name, final int contig, final int start, final boolean negativeStrand,
-                             final boolean recordUnmapped, final String cigar, final String qualityString,
-                             final int defaultQuality, final boolean isSecondary) throws SAMException {
-        final htsjdk.samtools.SAMRecord rec = createReadNoFlag(name, contig, start, negativeStrand, recordUnmapped, cigar, qualityString, defaultQuality);
-        if (isSecondary) rec.setNotPrimaryAlignmentFlag(true);
-        this.records.add(rec);
-        return rec;
-    }
-
-    /**
-     * Adds a fragment record (mapped or unmapped) to the set using the provided contig start and optionally the strand,
-     * cigar string, quality string or default quality score.
-     */
-    public SAMRecord addFrag(final String name, final int contig, final int start, final boolean negativeStrand,
-                             final boolean recordUnmapped, final String cigar, final String qualityString,
-                             final int defaultQuality, final boolean isSecondary, final boolean isSupplementary) throws SAMException {
-        final htsjdk.samtools.SAMRecord rec = createReadNoFlag(name, contig, start, negativeStrand, recordUnmapped, cigar, qualityString, defaultQuality);
-        if (isSecondary) rec.setNotPrimaryAlignmentFlag(true);
-        if (isSupplementary) rec.setSupplementaryAlignmentFlag(true);
-        this.records.add(rec);
-        return rec;
-    }
-
-
-    /**
-     * Fills in the bases and qualities for the given record. Quality data is randomly generated if the defaultQuality
-     * is set to -1. Otherwise all qualities will be set to defaultQuality. If a quality string is provided that string
-     * will be used instead of the defaultQuality.
-     */
-    private void fillInBasesAndQualities(final SAMRecord rec, final String qualityString, final int defaultQuality) {
-
-        if (null == qualityString) {
-            fillInBasesAndQualities(rec, defaultQuality);
-        } else {
-            fillInBases(rec);
-            rec.setBaseQualityString(qualityString);
-        }
-    }
-
-    /**
-     * Randomly fills in the bases for the given record.
-     */
-    private void fillInBases(final SAMRecord rec) {
-        final int length = this.readLength;
-        final byte[] bases = new byte[length];
-
-        for (int i = 0; i < length; ++i) {
-            bases[i] = BASES[this.random.nextInt(BASES.length)];
-        }
-
-        rec.setReadBases(bases);
-    }
-
-    /**
-     * Adds an unmapped fragment read to the builder.
-     */
-    public void addUnmappedFragment(final String name) {
-        addFrag(name, -1, -1, false, true, null, null, -1, false);
-    }
-
-
-    /**
-     * Adds a skeletal pair of records to the set using the provided
-     * contig starts.  The pair is assumed to be a well
-     * formed pair sitting on a single contig.
-     */
-    public void addPair(final String name, final int contig, final int start1, final int start2) {
-        final SAMRecord end1 = new SAMRecord(this.header);
-        final SAMRecord end2 = new SAMRecord(this.header);
-        final boolean end1IsFirstOfPair = this.random.nextBoolean();
-
-        end1.setReadName(name);
-        end1.setReferenceIndex(contig);
-        end1.setAlignmentStart(start1);
-        end1.setReadNegativeStrandFlag(false);
-        end1.setCigarString(readLength + "M");
-        if(useNmFlag) end1.setAttribute(ReservedTagConstants.NM, 0);
-        end1.setMappingQuality(255);
-        end1.setReadPairedFlag(true);
-        end1.setProperPairFlag(true);
-        end1.setMateReferenceIndex(contig);
-        end1.setAttribute(SAMTag.MC.name(), readLength + "M");
-        end1.setMateAlignmentStart(start2);
-        end1.setMateNegativeStrandFlag(true);
-        end1.setFirstOfPairFlag(end1IsFirstOfPair);
-        end1.setSecondOfPairFlag(!end1IsFirstOfPair);
-        end1.setInferredInsertSize((int) CoordMath.getLength(start1, CoordMath.getEnd(start2, this.readLength)));
-        end1.setAttribute(SAMTag.RG.name(), READ_GROUP_ID);
-        if (programRecord != null) {
-            end1.setAttribute(SAMTag.PG.name(), programRecord.getProgramGroupId());
-        }
-        if (readGroup != null) {
-            end1.setAttribute(SAMTag.RG.name(), readGroup.getReadGroupId());
-        }
-        fillInBasesAndQualities(end1);
-
-        end2.setReadName(name);
-        end2.setReferenceIndex(contig);
-        end2.setAlignmentStart(start2);
-        end2.setReadNegativeStrandFlag(true);
-        end2.setCigarString(readLength + "M");
-        if(useNmFlag) end2.setAttribute(ReservedTagConstants.NM,0);
-        end2.setMappingQuality(255);
-        end2.setReadPairedFlag(true);
-        end2.setProperPairFlag(true);
-        end2.setMateReferenceIndex(contig);
-        end2.setAttribute(SAMTag.MC.name(), readLength + "M");
-        end2.setMateAlignmentStart(start1);
-        end2.setMateNegativeStrandFlag(false);
-        end2.setFirstOfPairFlag(!end1IsFirstOfPair);
-        end2.setSecondOfPairFlag(end1IsFirstOfPair);
-        end2.setInferredInsertSize(end1.getInferredInsertSize());
-        end2.setAttribute(SAMTag.RG.name(), READ_GROUP_ID);
-        if (programRecord != null) {
-            end2.setAttribute(SAMTag.PG.name(), programRecord.getProgramGroupId());
-        }
-        if (readGroup != null) {
-            end2.setAttribute(SAMTag.RG.name(), readGroup.getReadGroupId());
-        }
-        fillInBasesAndQualities(end2);
-
-        this.records.add(end1);
-        this.records.add(end2);
-    }
-
-    /**
-     * Adds a pair of records (mapped or unmmapped) to the set using the provided contig starts.
-     * The pair is assumed to be a well formed pair sitting on a single contig.
-     */
-    public List<SAMRecord> addPair(final String name, final int contig, final int start1, final int start2,
-                                   final boolean record1Unmapped, final boolean record2Unmapped, final String cigar1,
-                                   final String cigar2, final boolean strand1, final boolean strand2, final int defaultQuality) {
-        return this.addPair(name, contig, contig, start1, start2, record1Unmapped, record2Unmapped, cigar1, cigar2, strand1, strand2, false, false, defaultQuality);
-    }
-
-    /**
-     * Adds a pair of records (mapped or unmmapped) to the set using the provided contig starts.
-     * The pair is assumed to be a well formed pair sitting on a single contig.
-     */
-    public List<SAMRecord> addPair(final String name, final int contig1, final int contig2, final int start1, final int start2,
-                                   final boolean record1Unmapped, final boolean record2Unmapped, final String cigar1,
-                                   final String cigar2, final boolean strand1, final boolean strand2, final boolean record1NonPrimary,
-                                   final boolean record2NonPrimary, final int defaultQuality) {
-        final List<SAMRecord> recordsList = new LinkedList<SAMRecord>();
-
-        final SAMRecord end1 = createReadNoFlag(name, contig1, start1, strand1, record1Unmapped, cigar1, null, defaultQuality);
-        final SAMRecord end2 = createReadNoFlag(name, contig2, start2, strand2, record2Unmapped, cigar2, null, defaultQuality);
-
-        end1.setReadPairedFlag(true);
-        end1.setFirstOfPairFlag(true);
-
-        if (!record1Unmapped && !record2Unmapped) {
-            end1.setProperPairFlag(true);
-            end2.setProperPairFlag(true);
-        }
-        end2.setReadPairedFlag(true);
-        end2.setSecondOfPairFlag(true);
-
-        if (record1NonPrimary) end1.setNotPrimaryAlignmentFlag(true);
-        if (record2NonPrimary) end2.setNotPrimaryAlignmentFlag(true);
-
-        if (record1NonPrimary) end1.setNotPrimaryAlignmentFlag(true);
-        if (record2NonPrimary) end2.setNotPrimaryAlignmentFlag(true);
-
-        // set mate info
-        SamPairUtil.setMateInfo(end1, end2, true);
-
-        recordsList.add(end1);
-        recordsList.add(end2);
-
-        records.add(end1);
-        records.add(end2);
-
-        return recordsList;
-    }
-
-    /**
-     * Adds a pair of records (mapped or unmmapped) to the set using the provided contig starts.
-     * The pair is assumed to be a well formed pair sitting on a single contig.
-     */
-    public List<SAMRecord> addPair(final String name, final int contig, final int start1, final int start2,
-                                   final boolean record1Unmapped, final boolean record2Unmapped, final String cigar1,
-                                   final String cigar2, final boolean strand1, final boolean strand2, final boolean record1NonPrimary,
-                                   final boolean record2NonPrimary, final int defaultQuality) {
-        return addPair(name, contig, contig, start1, start2, record1Unmapped, record2Unmapped, cigar1, cigar2, strand1, strand2,
-                record1NonPrimary, record2NonPrimary, defaultQuality);
-    }
-
-    /**
-     * Adds a pair with both ends unmapped to the builder.
-     */
-    public void addUnmappedPair(final String name) {
-        final SAMRecord end1 = new SAMRecord(this.header);
-        final SAMRecord end2 = new SAMRecord(this.header);
-        final boolean end1IsFirstOfPair = this.random.nextBoolean();
-
-        end1.setReadName(name);
-        end1.setReadPairedFlag(true);
-        end1.setReadUnmappedFlag(true);
-        end1.setAttribute(SAMTag.MC.name(), null);
-        end1.setProperPairFlag(false);
-        end1.setFirstOfPairFlag(end1IsFirstOfPair);
-        end1.setSecondOfPairFlag(!end1IsFirstOfPair);
-        end1.setMateUnmappedFlag(true);
-        end1.setAttribute(SAMTag.RG.name(), READ_GROUP_ID);
-        if (programRecord != null) {
-            end1.setAttribute(SAMTag.PG.name(), programRecord.getProgramGroupId());
-        }
-        if (this.unmappedHasBasesAndQualities) {
-        fillInBasesAndQualities(end1);
-        }
-
-        end2.setReadName(name);
-        end2.setReadPairedFlag(true);
-        end2.setReadUnmappedFlag(true);
-        end2.setAttribute(SAMTag.MC.name(), null);
-        end2.setProperPairFlag(false);
-        end2.setFirstOfPairFlag(!end1IsFirstOfPair);
-        end2.setSecondOfPairFlag(end1IsFirstOfPair);
-        end2.setMateUnmappedFlag(true);
-        end2.setAttribute(SAMTag.RG.name(), READ_GROUP_ID);
-        if (programRecord != null) {
-            end2.setAttribute(SAMTag.PG.name(), programRecord.getProgramGroupId());
-        }
-        if (this.unmappedHasBasesAndQualities) {
-        fillInBasesAndQualities(end2);
-        }
-
-        this.records.add(end1);
-        this.records.add(end2);
-    }
-
-    /**
-     * Fills in bases and qualities with randomly generated data.
-     * Relies on the alignment start and end having been set to get read length.
-     */
-    private void fillInBasesAndQualities(final SAMRecord rec) {
-        fillInBasesAndQualities(rec, -1);
-    }
-
-    /**
-     * Fills in bases and qualities with a set default quality. If the defaultQuality is set to -1 quality scores will
-     * be randomly generated.
-     * Relies on the alignment start and end having been set to get read length.
-     */
-    private void fillInBasesAndQualities(final SAMRecord rec, final int defaultQuality) {
-        final int length = this.readLength;
-        final byte[] quals = new byte[length];
-
-        if (-1 != defaultQuality) {
-            Arrays.fill(quals, (byte) defaultQuality);
-        } else {
-            for (int i = 0; i < length; ++i) {
-                quals[i] = (byte) this.random.nextInt(50);
-            }
-        }
-        rec.setBaseQualities(quals);
-        fillInBases(rec);
-    }
-
-    /**
-     * Creates samFileReader from the data in instance of this class
-     *
-     * @return SamReader
-     */
-    public SamReader getSamReader() {
-
-        final File tempFile;
-
-        try {
-            tempFile = File.createTempFile("temp", ".sam");
-        } catch (final IOException e) {
-            throw new RuntimeIOException("problems creating tempfile", e);
-        }
-
-        this.header.setAttribute("VN", "1.0");
-        final SAMFileWriter w = new SAMFileWriterFactory().makeBAMWriter(this.header, true, tempFile);
-        for (final SAMRecord r : this.getRecords()) {
-            w.addAlignment(r);
-        }
-
-        w.close();
-
-        final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(tempFile);
-        tempFile.deleteOnExit();
-
-        return reader;
-    }
-
-    public SAMFileHeader getHeader() {
-        return header;
-    }
-
-    public void setReadLength(final int readLength) { this.readLength = readLength; }
-
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordUtil.java b/src/main/java/htsjdk/samtools/SAMRecordUtil.java
deleted file mode 100644
index d778789..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.SequenceUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-/**
- *
- * Use {@link SAMRecord#reverseComplement()} instead, which defaults to making a copy of attributes for reverse
- * complement rather than changing them in-place.
- *
- * @author alecw at broadinstitute.org
- */
- at Deprecated
-public class SAMRecordUtil {
-    public static List<String> TAGS_TO_REVERSE_COMPLEMENT = Arrays.asList(SAMTag.E2.name(), SAMTag.SQ.name());
-    public static List<String> TAGS_TO_REVERSE            = Arrays.asList(SAMTag.OQ.name(), SAMTag.U2.name());
-
-    /**
-     * Reverse-complement bases and reverse quality scores along with known optional attributes that
-     * need the same treatment. Changes made in-place, instead of making a copy of the bases, qualities,
-     * or attributes. If a copy is needed use {@link #reverseComplement(SAMRecord, boolean)}.
-     * See {@link #TAGS_TO_REVERSE_COMPLEMENT} {@link #TAGS_TO_REVERSE}
-     * for the default set of tags that are handled.
-     */
-    public static void reverseComplement(final SAMRecord rec) {
-        rec.reverseComplement(TAGS_TO_REVERSE_COMPLEMENT, TAGS_TO_REVERSE, true);
-    }
-
-    /**
-     * Reverse-complement bases and reverse quality scores along with known optional attributes that
-     * need the same treatment. Optionally makes a copy of the bases, qualities or attributes instead
-     * of altering them in-place. See {@link #TAGS_TO_REVERSE_COMPLEMENT} {@link #TAGS_TO_REVERSE}
-     * for the default set of tags that are handled.
-     *
-     * @param rec Record to reverse complement.
-     * @param inplace Setting this to false will clone all attributes, bases and qualities before changing the values.
-     */
-    public static void reverseComplement(final SAMRecord rec, boolean inplace) {
-        rec.reverseComplement(TAGS_TO_REVERSE_COMPLEMENT, TAGS_TO_REVERSE, inplace);
-    }
-
-    /**
-     * Reverse complement bases and reverse quality scores. In addition reverse complement any
-     * non-null attributes specified by tagsToRevcomp and reverse and non-null attributes
-     * specified by tagsToReverse.
-     */
-    public static void reverseComplement(final SAMRecord rec, final Collection<String> tagsToRevcomp, final Collection<String> tagsToReverse, boolean inplace) {
-        rec.reverseComplement(tagsToRevcomp, tagsToReverse, inplace);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMSequenceDictionary.java b/src/main/java/htsjdk/samtools/SAMSequenceDictionary.java
deleted file mode 100644
index b7744d7..0000000
--- a/src/main/java/htsjdk/samtools/SAMSequenceDictionary.java
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Log;
-
-import java.io.Serializable;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.util.*;
-import java.util.stream.Collector;
-import java.util.stream.Collectors;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-
-import static htsjdk.samtools.SAMSequenceRecord.*;
-import static java.util.stream.Collectors.toList;
-
-/**
- * Collection of SAMSequenceRecords.
- */
- at XmlRootElement(name="References")
-public class SAMSequenceDictionary implements Serializable {
-    public static final long serialVersionUID = 1L;
-
-    /* xml Serialization , for `m_sequence` we use the field instead of the
-    getter because the later wraps the list into an unmodifiable List 
-    see http://tech.joshuacummings.com/2010/10/problems-with-defensive-collection.html */
-    @XmlElement(name="Reference")
-    private List<SAMSequenceRecord> mSequences = new ArrayList<SAMSequenceRecord>();
-    private final Map<String, SAMSequenceRecord> mSequenceMap = new HashMap<String, SAMSequenceRecord>();
-
-    public SAMSequenceDictionary() {
-    }
-
-    public SAMSequenceDictionary(final List<SAMSequenceRecord> list) {
-        this();
-        setSequences(list);
-    }
-
-    @XmlTransient //we use the field instead of getter/setter
-    public List<SAMSequenceRecord> getSequences() {
-        return Collections.unmodifiableList(mSequences);
-    }
-
-    private static Log log = Log.getInstance(SAMSequenceDictionary.class);
-
-    public SAMSequenceRecord getSequence(final String name) {
-        return mSequenceMap.get(name);
-    }
-
-    /**
-     * Replaces the existing list of SAMSequenceRecords with the given list.
-     * Reset the aliases
-     *
-     * @param list This value is used directly, rather than being copied.
-     */
-    public void setSequences(final List<SAMSequenceRecord> list) {
-        mSequences = list;
-        mSequenceMap.clear();
-        int index = 0;
-        for (final SAMSequenceRecord record : list) {
-            record.setSequenceIndex(index++);
-            if (mSequenceMap.put(record.getSequenceName(), record) != null) {
-                throw new IllegalArgumentException("Cannot add sequence that already exists in SAMSequenceDictionary: " +
-                        record.getSequenceName());
-            }
-        }
-    }
-
-    public void addSequence(final SAMSequenceRecord sequenceRecord) {
-        if (mSequenceMap.containsKey(sequenceRecord.getSequenceName())) {
-            throw new IllegalArgumentException("Cannot add sequence that already exists in SAMSequenceDictionary: " +
-                    sequenceRecord.getSequenceName());
-        }
-        sequenceRecord.setSequenceIndex(mSequences.size());
-        mSequences.add(sequenceRecord);
-        mSequenceMap.put(sequenceRecord.getSequenceName(), sequenceRecord);
-    }
-
-    /**
-     * @return The SAMSequenceRecord with the given index, or null if index is out of range.
-     */
-    public SAMSequenceRecord getSequence(final int sequenceIndex) {
-        if (sequenceIndex < 0 || sequenceIndex >= mSequences.size()) {
-            return null;
-        }
-        return mSequences.get(sequenceIndex);
-    }
-
-    /**
-     * @return The index for the given sequence name, or -1 if the name is not found.
-     */
-    public int getSequenceIndex(final String sequenceName) {
-        final SAMSequenceRecord record = mSequenceMap.get(sequenceName);
-        if (record == null) {
-            return -1;
-        }
-        return record.getSequenceIndex();
-    }
-
-    /**
-     * @return number of SAMSequenceRecord(s) in this dictionary
-     */
-    public int size() {
-        return mSequences.size();
-    }
-
-    /**
-     * @return The sum of the lengths of the sequences in this dictionary
-     */
-    public long getReferenceLength() {
-        long len = 0L;
-        for (final SAMSequenceRecord seq : getSequences()) {
-            len += seq.getSequenceLength();
-        }
-        return len;
-    }
-
-    /**
-     * @return true is the dictionary is empty
-     */
-    public boolean isEmpty() {
-        return mSequences.isEmpty();
-    }
-
-    private static String DICT_MISMATCH_TEMPLATE = "SAM dictionaries are not the same: %s.";
-    /**
-     * Non-comprehensive {@link #equals(Object)}-assertion: instead of calling {@link SAMSequenceRecord#equals(Object)} on constituent
-     * {@link SAMSequenceRecord}s in this dictionary against its pair in the target dictionary, in order,  call
-     * {@link SAMSequenceRecord#isSameSequence(SAMSequenceRecord)}.
-     * Aliases are ignored.
-     *
-     * @throws AssertionError When the dictionaries are not the same, with some human-readable information as to why
-     */
-    public void assertSameDictionary(final SAMSequenceDictionary that) {
-        if (this == that) return;
-
-        final Iterator<SAMSequenceRecord> thatSequences = that.mSequences.iterator();
-        for (final SAMSequenceRecord thisSequence : mSequences) {
-            if (!thatSequences.hasNext())
-                throw new AssertionError(String.format(DICT_MISMATCH_TEMPLATE, thisSequence + " is present in only one dictionary"));
-            else {
-                final SAMSequenceRecord thatSequence = thatSequences.next();
-                if(!thatSequence.isSameSequence(thisSequence))
-                    throw new AssertionError(
-                            String.format(DICT_MISMATCH_TEMPLATE, thatSequence + " was found when " + thisSequence + " was expected")
-                    );
-            }
-        }
-        if (thatSequences.hasNext())
-            throw new AssertionError(String.format(DICT_MISMATCH_TEMPLATE, thatSequences.next() + " is present in only one dictionary"));
-    }
-
-    /** returns true if the two dictionaries are the same, aliases are NOT considered */
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        SAMSequenceDictionary that = (SAMSequenceDictionary) o;
-
-        if (!mSequences.equals(that.mSequences)) return false;
-
-        return true;
-    }
-
-    /**
-     * Add an alias to a SAMSequenceRecord. This can be use to provide some
-     * alternate names fo a given contig. e.g:
-     * <code>1,chr1,chr01,01,CM000663,NC_000001.10</code> e.g:
-     * <code>MT,chrM</code>
-     *
-     * @param originalName
-     *            existing contig name
-     * @param altName
-     *            new contig name
-     * @return the contig associated to the 'originalName/altName'
-     */
-    public SAMSequenceRecord addSequenceAlias(final String originalName,
-            final String altName) {
-        if (originalName == null) throw new IllegalArgumentException("original name cannot be null");
-        if (altName == null) throw new IllegalArgumentException("alt name cannot be null");
-        final SAMSequenceRecord originalSeqRecord = getSequence(originalName);
-        if (originalSeqRecord == null) throw new IllegalArgumentException("Sequence " + originalName + " doesn't exist in dictionary.");
-        // same name, nothing to do
-        if (originalName.equals(altName)) return originalSeqRecord;
-        final SAMSequenceRecord altSeqRecord = getSequence(altName);
-        if (altSeqRecord != null) {
-            // alias was already set to the same record
-            if (altSeqRecord.equals(originalSeqRecord)) return originalSeqRecord;
-            // alias was already set to another record
-            throw new IllegalArgumentException("Alias " + altName +
-                    " was already set to " + altSeqRecord.getSequenceName());
-        }
-        mSequenceMap.put(altName, originalSeqRecord);
-        return originalSeqRecord;
-    }
-
-    /**
-     * return a MD5 sum for ths dictionary, the checksum is re-computed each
-     * time this method is called.
-     *
-     * <pre>
-     * md5( (seq1.md5_if_available) + ' '+(seq2.name+seq2.length) + ' '+...)
-     * </pre>
-     *
-     * @return a MD5 checksum for this dictionary or the empty string if it is
-     *         empty
-     */
-    public String md5() {
-        if (isEmpty())
-            return "";
-        try {
-            final MessageDigest md5 = MessageDigest.getInstance("MD5");
-            md5.reset();
-            for (final SAMSequenceRecord samSequenceRecord : mSequences) {
-                if (samSequenceRecord.getSequenceIndex() > 0)
-                    md5.update((byte) ' ');
-                final String md5_tag = samSequenceRecord.getAttribute(SAMSequenceRecord.MD5_TAG);
-                if (md5_tag != null) {
-                    md5.update(md5_tag.getBytes());
-                } else {
-                    md5.update(samSequenceRecord.getSequenceName().getBytes());
-                    md5.update(String.valueOf(samSequenceRecord.getSequenceLength()).getBytes());
-                }
-            }
-            String hash = new BigInteger(1, md5.digest()).toString(16);
-            if (hash.length() != 32) {
-                final String zeros = "00000000000000000000000000000000";
-                hash = zeros.substring(0, 32 - hash.length()) + hash;
-            }
-            return hash;
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return mSequences.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "SAMSequenceDictionary:( sequences:"+ size()+
-                " length:"+ getReferenceLength()+" "+
-                " md5:"+md5()+")";
-    }
-
-    public static final List<String> DEFAULT_DICTIONARY_EQUAL_TAG = Arrays.asList(
-            SAMSequenceRecord.MD5_TAG,
-            SAMSequenceRecord.SEQUENCE_LENGTH_TAG);
-
-    /**
-     * Will merge dictionaryTags from two dictionaries into one focusing on merging the tags rather than the sequences.
-     *
-     * Requires that dictionaries have the same SAMSequence records in the same order.
-     * For each sequenceIndex, the union of the tags from both sequences will be added to the new sequence, mismatching
-     * values (for tags that are in both) will generate a warning, and the value from dict1 will be used.
-     * For tags that are in tagsToEquate an unequal value will generate an error (an IllegalArgumentException will
-     * be thrown.) tagsToEquate must include LN and MD.
-     *
-     * @param dict1 first dictionary
-     * @param dict2 first dictionary
-     * @param tagsToMatch list of tags that must be equal if present in both sequence. Must contain MD, and LN
-     * @return dictionary consisting of the same sequences as the two inputs with the merged values of tags.
-     */
-    static public SAMSequenceDictionary mergeDictionaries(final SAMSequenceDictionary dict1,
-                                                          final SAMSequenceDictionary dict2,
-                                                          final List<String> tagsToMatch) {
-
-        // We require MD and LN to match.
-        if (!tagsToMatch.contains(MD5_TAG) || !tagsToMatch.contains(SEQUENCE_LENGTH_TAG)) {
-            throw new IllegalArgumentException("Both " + MD5_TAG + " and " + SEQUENCE_LENGTH_TAG + " must be matched " +
-                    "when merging dictionaries. Found: " + String.join(",", tagsToMatch));
-        }
-
-        if (!dict1.getSequences().stream().map(SAMSequenceRecord::getSequenceName).collect(Collectors.toList()).equals(
-                dict2.getSequences().stream().map(SAMSequenceRecord::getSequenceName).collect(Collectors.toList()))) {
-
-            throw new IllegalArgumentException(String.format("Do not use this function to merge dictionaries with " +
-                            "different sequences in them. Sequences must be in the same order as well. Found [%s] and [%s].",
-                    String.join(", ", dict1.getSequences().stream().map(SAMSequenceRecord::getSequenceName).collect(toList())),
-                    String.join(", ", dict2.getSequences().stream().map(SAMSequenceRecord::getSequenceName).collect(toList()))));
-        }
-
-        final SAMSequenceDictionary finalDict = new SAMSequenceDictionary();
-        for (int sequenceIndex = 0; sequenceIndex < dict1.getSequences().size(); sequenceIndex++) {
-            final SAMSequenceRecord s1 = dict1.getSequence(sequenceIndex);
-            final SAMSequenceRecord s2 = dict2.getSequence(sequenceIndex);
-
-            final String sName = s1.getSequenceName();
-            final SAMSequenceRecord sMerged = new SAMSequenceRecord(sName, UNKNOWN_SEQUENCE_LENGTH);
-            finalDict.addSequence(sMerged);
-
-            final Set<String> allTags = new HashSet<>();
-            s1.getAttributes().stream().forEach(a -> allTags.add(a.getKey()));
-            s2.getAttributes().stream().forEach(a -> allTags.add(a.getKey()));
-
-            for (final String tag : allTags) {
-                final String value1 = s1.getAttribute(tag);
-                final String value2 = s2.getAttribute(tag);
-
-                if (value1 != null && value2 != null && !value1.equals(value2)) {
-                    String baseMessage = String.format("Found sequence entry for which " +
-                                    "tags differ: %s and tag %s has the two values: %s and %s.",
-                            sName, tag, value1, value2);
-
-                    if (tagsToMatch.contains(tag)) {
-                        log.error("Cannot merge dictionaries. ", baseMessage);
-                        throw new IllegalArgumentException("Cannot merge dictionaries. " + baseMessage);
-                    } else {
-                        log.warn(baseMessage, " Using ", value1);
-                    }
-                }
-                sMerged.setAttribute(tag, value1 == null ? value2 : value1);
-            }
-
-            final int length1 = s1.getSequenceLength();
-            final int length2 = s2.getSequenceLength();
-
-            if (length1 != UNKNOWN_SEQUENCE_LENGTH && length2 != UNKNOWN_SEQUENCE_LENGTH && length1 != length2) {
-                throw new IllegalArgumentException(String.format("Cannot merge the two dictionaries. " +
-                        "Found sequence entry for which " + "lengths differ: %s has lengths %s and %s", sName, length1, length2));
-            }
-            sMerged.setSequenceLength(length1 == UNKNOWN_SEQUENCE_LENGTH ? length2 : length1);
-        }
-        return finalDict;
-    }
-}
-
diff --git a/src/main/java/htsjdk/samtools/SAMSequenceDictionaryCodec.java b/src/main/java/htsjdk/samtools/SAMSequenceDictionaryCodec.java
deleted file mode 100644
index e6e3ba5..0000000
--- a/src/main/java/htsjdk/samtools/SAMSequenceDictionaryCodec.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.LineReader;
-import java.io.BufferedWriter;
-
-/**
- * "On the fly" codec SAMSequenceDictionaryCodec.
- * Encodes each sequence and directly writes it to the Dictionary file.
- *
- * To use this class you should provide BufferedWriter to it, and so you should close it as you stop using this class.
- * You can work with this class as shown below.
- *
- * Example of using this class:
- *
- * List<SAMSequenceRecord> dict = ...;
- *
- * //open BufferedReader and close in try-with-resources
- * try(BufferedWriter writer = new BufferedWriter(new FileWriter("path/to/file"))) {
- *      SAMSequenceDictionaryCodec codec = new SAMSequenceDictionaryCodec(writer);
- *
- *      //we have list of sequences, so encode header line and after that encode each sequence
- *      codec.encodeHeaderLine(false);
- *      dict.forEach(codec::encodeSequenceRecord);
- *}
- *
- * or
- *
- * SAMSequenceDictionary dict = ...;
- *
- * //open BufferedReader and close in try-with-resources
- * try(BufferedWriter writer = new BufferedWriter(new FileWriter("path/to/file"))) {
- *      SAMSequenceDictionaryCodec codec = new SAMSequenceDictionaryCodec(writer);
- *
- *      //we have complete {@link SAMSequenceDictionary}, so just encode it.
- *      codec.encode(dict);
- *}
- *
- * @author Pavel_Silin at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-public class SAMSequenceDictionaryCodec {
-
-    private static final SAMFileHeader EMPTY_HEADER = new SAMFileHeader();
-
-    private final SAMTextHeaderCodec codec;
-
-    public SAMSequenceDictionaryCodec(final BufferedWriter writer) {
-        codec = new SAMTextHeaderCodec();
-        codec.setmFileHeader(EMPTY_HEADER);
-        codec.setWriter(writer);
-    }
-
-    /**
-     * Write {@link SAMSequenceRecord}.
-     * @param sequenceRecord object to be converted to text.
-     */
-    public void encodeSequenceRecord(final SAMSequenceRecord sequenceRecord) {
-        codec.encodeSequenceRecord(sequenceRecord);
-    }
-
-    /**
-     * Write Header line.
-     * @param keepExistingVersionNumber boolean flag to keep existing version number.
-     */
-    public void encodeHeaderLine(final boolean keepExistingVersionNumber) {
-        codec.encodeHeaderLine(keepExistingVersionNumber);
-    }
-
-    /**
-     * Reads text SAM header and converts to a SAMSequenceDictionary object.
-     * @param reader Where to get header text from.
-     * @param source Name of the input file, for error messages.  May be null.
-     * @return complete SAMSequenceDictionary object.
-     */
-    public SAMSequenceDictionary decode(final LineReader reader, final String source) {
-       return codec.decode(reader, source).getSequenceDictionary();
-    }
-
-    /**
-     * Convert {@link SAMSequenceDictionary} from in-memory representation to text representation.
-     * @param dictionary object to be converted to text.
-     */
-    public void encode(final SAMSequenceDictionary dictionary) {
-        codec.encodeHeaderLine(false);
-        dictionary.getSequences().forEach(this::encodeSequenceRecord);
-    }
-
-    public void setValidationStringency(final ValidationStringency validationStringency) {
-        codec.setValidationStringency(validationStringency);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMSequenceRecord.java b/src/main/java/htsjdk/samtools/SAMSequenceRecord.java
deleted file mode 100644
index 6bca979..0000000
--- a/src/main/java/htsjdk/samtools/SAMSequenceRecord.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.math.BigInteger;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlValue;
-
-/**
- * Header information about a reference sequence.  Corresponds to @SQ header record in SAM text header.
- */
- at XmlRootElement(name="Reference")
-public class SAMSequenceRecord extends AbstractSAMHeaderRecord implements Cloneable
-{
-    public static final long serialVersionUID = 1L; // AbstractSAMHeaderRecord implements Serializable
-    private String mSequenceName = null; // Value must be interned() if it's ever set/modified
-    private int mSequenceIndex = -1;
-    private int mSequenceLength = 0;
-    public static final String SEQUENCE_NAME_TAG = "SN";
-    public static final String SEQUENCE_LENGTH_TAG = "LN";
-    public static final String MD5_TAG = "M5";
-    public static final String ASSEMBLY_TAG = "AS";
-    public static final String URI_TAG = "UR";
-    public static final String SPECIES_TAG = "SP";
-
-    /** If one sequence has this length, and another sequence had a different length, isSameSequence will
-     * not complain that they are different sequences. */
-    public static final int UNKNOWN_SEQUENCE_LENGTH = 0;
-
-
-    /**
-     * This is not a valid sequence name, because it is reserved in the MRNM field of SAM text format
-     * to mean "same reference as RNAME field."
-     */
-    public static final String RESERVED_MRNM_SEQUENCE_NAME = "=";
-
-    /**
-     * The standard tags are stored in text header without type information, because the type of these tags is known.
-     */
-    public static final Set<String> STANDARD_TAGS =
-            new HashSet<String>(Arrays.asList(SEQUENCE_NAME_TAG, SEQUENCE_LENGTH_TAG, ASSEMBLY_TAG, MD5_TAG, URI_TAG,
-                                                SPECIES_TAG));
-
-    // Split on any whitespace
-    private static Pattern SEQUENCE_NAME_SPLITTER = Pattern.compile("\\s");
-    // These are the chars matched by \\s.
-    private static char[] WHITESPACE_CHARS = {' ', '\t', '\n', '\013', '\f', '\r'}; // \013 is vertical tab
-
-    /** a (private) empty constructor is required for JAXB.XML-serialisation */
-    @SuppressWarnings("unused")
-    private SAMSequenceRecord() {
-    }
-    
-    /**
-     * @deprecated Use {@link #SAMSequenceRecord(String, int)} instead.
-     * sequenceLength is required for the object to be considered valid.
-     */
-    @Deprecated
-    public SAMSequenceRecord(final String name) {
-        this(name, UNKNOWN_SEQUENCE_LENGTH);
-    }
-
-    public SAMSequenceRecord(final String name, final int sequenceLength) {
-        if (name != null) {
-            if (SEQUENCE_NAME_SPLITTER.matcher(name).find()) {
-                throw new SAMException("Sequence name contains invalid character: " + name);
-            }
-            validateSequenceName(name);
-            mSequenceName = name.intern();
-        }
-        mSequenceLength = sequenceLength;
-    }
-    
-    @XmlValue
-    public String getSequenceName() { return mSequenceName; }
-   
-    /* this private method is used by XML serialization */
-    @SuppressWarnings("unused")
-    private void setSequenceName(final String name) {
-        if (name != null) {
-            mSequenceName = name.intern();
-        }
-        else {
-            mSequenceName = null;
-        }
-    }
-    
-    @XmlAttribute(name="length")
-    public int getSequenceLength() { return mSequenceLength; }
-    public void setSequenceLength(final int value) { mSequenceLength = value; }
-
-    @XmlAttribute(name="assembly")
-    public String getAssembly() { return (String) getAttribute(ASSEMBLY_TAG); }
-    public void setAssembly(final String value) { setAttribute(ASSEMBLY_TAG, value); }
-
-    @XmlAttribute(name="species")
-    public String getSpecies() { return (String) getAttribute(SPECIES_TAG); }
-    public void setSpecies(final String value) { setAttribute(SPECIES_TAG, value); }
-
-    @XmlAttribute(name="md5")
-    public String getMd5() { return (String) getAttribute(MD5_TAG); }
-    public void setMd5(final String value) { setAttribute(MD5_TAG, value); }
-
-    /**
-     * @return Index of this record in the sequence dictionary it lives in. 
-     */
-    @XmlAttribute(name="index")
-    public int getSequenceIndex() { return mSequenceIndex; }
-
-    // Private state used only by SAM implementation.
-    public void setSequenceIndex(final int value) { mSequenceIndex = value; }
-
-    /**
-     * Looser comparison than equals().  We look only at sequence index, sequence length, and MD5 tag value
-     * (or sequence names, if there is no MD5 tag in either record.
-     */
-    public boolean isSameSequence(final SAMSequenceRecord that) {
-        if (this == that) return true;
-        if (that == null) return false;
-
-        if (mSequenceIndex != that.mSequenceIndex) return false;
-        // PIC-439.  Allow undefined length.
-        if (mSequenceLength != UNKNOWN_SEQUENCE_LENGTH && that.mSequenceLength != UNKNOWN_SEQUENCE_LENGTH && mSequenceLength != that.mSequenceLength)
-            return false;
-        if (this.getAttribute(SAMSequenceRecord.MD5_TAG) != null && that.getAttribute(SAMSequenceRecord.MD5_TAG) != null) {
-            final BigInteger thisMd5 = new BigInteger((String)this.getAttribute(SAMSequenceRecord.MD5_TAG), 16);
-            final BigInteger thatMd5 = new BigInteger((String)that.getAttribute(SAMSequenceRecord.MD5_TAG), 16);
-            if (!thisMd5.equals(thatMd5)) {
-                return false;
-            }
-        }
-        else {
-            if (mSequenceName != that.mSequenceName) return false; // Compare using == since we intern() the Strings
-        }
-
-        return true;
-    }
-
-    private URI makeURI(final String s) throws URISyntaxException {
-        URI uri = new URI(s);
-        if (uri.getScheme() == null) {
-            uri = new URI("file", uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), uri.getQuery(), uri.getFragment());
-        }
-        return uri;
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (!(o instanceof SAMSequenceRecord)) return false;
-
-        final SAMSequenceRecord that = (SAMSequenceRecord) o;
-
-        if (mSequenceIndex != that.mSequenceIndex) return false;
-        if (mSequenceLength != that.mSequenceLength) return false;
-        if (!attributesEqual(that)) return false;
-        if (mSequenceName != that.mSequenceName) return false; // Compare using == since we intern() the name
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return mSequenceName != null ? mSequenceName.hashCode() : 0;
-    }
-
-    Set<String> getStandardTags() {
-        return STANDARD_TAGS;
-    }
-
-    public final SAMSequenceRecord clone() {
-        final SAMSequenceRecord ret = new SAMSequenceRecord(this.mSequenceName, this.mSequenceLength);
-        ret.mSequenceIndex = this.mSequenceIndex;
-        for (final Map.Entry<String, String> entry : this.getAttributes()) {
-            ret.setAttribute(entry.getKey(), entry.getValue());
-        }
-        return ret;
-    }
-
-    /**
-     * Truncate sequence name at first whitespace.
-     */
-    public static String truncateSequenceName(final String sequenceName) {
-        /*
-         * Instead of using regex split, do it manually for better performance.
-        return SEQUENCE_NAME_SPLITTER.split(sequenceName, 2)[0];
-        */
-        int truncateAt = sequenceName.length();
-        for (final char c : WHITESPACE_CHARS) {
-            int index = sequenceName.indexOf(c);
-            if (index != -1 && index < truncateAt) {
-                truncateAt = index;
-            }
-        }
-        return sequenceName.substring(0, truncateAt);
-    }
-
-    /**
-     * Throw an exception if the sequence name is not valid.
-     */
-    public static void validateSequenceName(final String name) {
-        if (RESERVED_MRNM_SEQUENCE_NAME.equals(name)) {
-            throw new SAMException("'" + RESERVED_MRNM_SEQUENCE_NAME + "' is not a valid sequence name");
-        }
-    }
-
-    @Override
-    public String toString() {
-        return String.format(
-                "SAMSequenceRecord(name=%s,length=%s,dict_index=%s,assembly=%s)", 
-                getSequenceName(), 
-                getSequenceLength(), 
-                getSequenceIndex(),
-                getAssembly()
-        );
-    }
-}
-
diff --git a/src/main/java/htsjdk/samtools/SAMSortOrderChecker.java b/src/main/java/htsjdk/samtools/SAMSortOrderChecker.java
deleted file mode 100644
index b6b7dd4..0000000
--- a/src/main/java/htsjdk/samtools/SAMSortOrderChecker.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Encapsulates simple check for SAMRecord order.
- * @author alecw at broadinstitute.org
- */
-public class SAMSortOrderChecker {
-    private final SAMFileHeader.SortOrder sortOrder;
-    private SAMRecord prev;
-    private final SAMRecordComparator comparator;
-
-    public SAMSortOrderChecker(final SAMFileHeader.SortOrder sortOrder) {
-        this.sortOrder = sortOrder;
-        switch (sortOrder) {
-            case coordinate:
-                comparator = new SAMRecordCoordinateComparator();
-                break;
-            case queryname:
-                comparator = new SAMRecordQueryNameComparator();
-                break;
-            case duplicate:
-                comparator = new SAMRecordDuplicateComparator();
-                break;
-            case unsorted:
-            default:
-                comparator = null;
-                break;
-        }
-    }
-
-    /**
-     * Check if given SAMRecord violates sort order relative to previous SAMRecord.
-     * @return True if sort order is unsorted, if this is the first record, or if previous <= rec.
-     */
-    public boolean isSorted(final SAMRecord rec) {
-        if (comparator == null) {
-            return true;
-        }
-        boolean ret = true;
-        if (prev != null) {
-            ret = comparator.fileOrderCompare(prev, rec) <= 0;
-        }
-        prev = rec;
-        return ret;
-    }
-
-    public SAMRecord getPreviousRecord() {
-        return prev;
-    }
-
-    /**
-     * Return the sort key used for the given sort order.  Useful in error messages.
-     */
-    public String getSortKey(final SAMRecord rec) {
-        switch (sortOrder) {
-
-            case coordinate:
-                return rec.getReferenceName() + ":" + rec.getAlignmentStart();
-            case queryname:
-                return rec.getReadName();
-            case unsorted:
-            default:
-                return null;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTag.java b/src/main/java/htsjdk/samtools/SAMTag.java
deleted file mode 100644
index fa25728..0000000
--- a/src/main/java/htsjdk/samtools/SAMTag.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * The standard tags for a SAM record that are defined in the SAM spec.
- */
-public enum SAMTag {
-    AM,
-    AS,
-    BC,
-    BQ,
-    CC,
-    CM,
-    CO,
-    CP,
-    CQ,
-    CS,
-    CT,
-    E2,
-    FI,
-    FS,
-    FT,
-    FZ,
-    GC, // for backwards compatibility
-    GS, // for backwards compatibility
-    GQ, // for backwards compatibility
-    LB,
-    H0,
-    H1,
-    H2,
-    HI,
-    IH,
-    MC,
-    MF, // for backwards compatibility
-    MD,
-    MQ,
-    NH,
-    NM,
-    OQ,
-    OP,
-    OC,
-    OF,
-    OR,
-    PG,
-    PQ,
-    PT,
-    PU,
-    QT,
-    Q2,
-    R2,
-    RG,
-    RT,
-    S2, // for backwards compatibility
-    SA,
-    SM,
-    SQ, // for backwards compatibility
-    TC,
-    U2,
-    UQ
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTagUtil.java b/src/main/java/htsjdk/samtools/SAMTagUtil.java
deleted file mode 100644
index 0266b0e..0000000
--- a/src/main/java/htsjdk/samtools/SAMTagUtil.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.StringUtil;
-
-/**
- * Facility for converting between String and short representation of a SAM tag.  short representation
- * is used by SAM JDK internally and is much more efficient.  Callers are encouraged to obtain the short
- * value for a tag of interest once, and then use the SAMRecord attribute API that takes shorts rather than
- * Strings.
- *
- * @author alecw at broadinstitute.org
- */
-public class SAMTagUtil {
-
-    // Standard tags pre-computed for convenience
-    public final short RG = makeBinaryTag(SAMTag.RG.name());
-    public final short LB = makeBinaryTag(SAMTag.LB.name());
-    public final short PU = makeBinaryTag(SAMTag.PU.name());
-    public final short PG = makeBinaryTag(SAMTag.PG.name());
-    public final short AS = makeBinaryTag(SAMTag.AS.name());
-    public final short SQ = makeBinaryTag(SAMTag.SQ.name());
-    public final short MQ = makeBinaryTag(SAMTag.MQ.name());
-    public final short NM = makeBinaryTag(SAMTag.NM.name());
-    public final short H0 = makeBinaryTag(SAMTag.H0.name());
-    public final short H1 = makeBinaryTag(SAMTag.H1.name());
-    public final short H2 = makeBinaryTag(SAMTag.H2.name());
-    public final short UQ = makeBinaryTag(SAMTag.UQ.name());
-    public final short PQ = makeBinaryTag(SAMTag.PQ.name());
-    public final short NH = makeBinaryTag(SAMTag.NH.name());
-    public final short IH = makeBinaryTag(SAMTag.IH.name());
-    public final short HI = makeBinaryTag(SAMTag.HI.name());
-    public final short MD = makeBinaryTag(SAMTag.MD.name());
-    public final short CS = makeBinaryTag(SAMTag.CS.name());
-    public final short CQ = makeBinaryTag(SAMTag.CQ.name());
-    public final short CM = makeBinaryTag(SAMTag.CM.name());
-    public final short R2 = makeBinaryTag(SAMTag.R2.name());
-    public final short Q2 = makeBinaryTag(SAMTag.Q2.name());
-    public final short S2 = makeBinaryTag(SAMTag.S2.name());
-    public final short CC = makeBinaryTag(SAMTag.CC.name());
-    public final short CP = makeBinaryTag(SAMTag.CP.name());
-    public final short SM = makeBinaryTag(SAMTag.SM.name());
-    public final short AM = makeBinaryTag(SAMTag.AM.name());
-    public final short MF = makeBinaryTag(SAMTag.MF.name());
-    public final short E2 = makeBinaryTag(SAMTag.E2.name());
-    public final short U2 = makeBinaryTag(SAMTag.U2.name());
-    public final short OQ = makeBinaryTag(SAMTag.OQ.name());
-    public final short FZ = makeBinaryTag(SAMTag.FZ.name());
-    public final short SA = makeBinaryTag(SAMTag.SA.name());
-    public final short MC = makeBinaryTag(SAMTag.MC.name());
-
-    private static SAMTagUtil singleton;
-
-    // Cache of already-converted tags.  Should speed up SAM text generation.
-    // Not synchronized because race condition is not a problem.
-    private final String[] stringTags = new String[Short.MAX_VALUE];
-
-    /**
-     * Despite the fact that this class has state, it should be thread-safe because the cache
-     * gets filled with the same values by any thread.
-     */
-    public static SAMTagUtil getSingleton() {
-        if (singleton == null) {
-            singleton = new SAMTagUtil();
-        }
-        return singleton;
-    }
-
-
-    /**
-     * Convert from String representation of tag name to short representation.
-     *
-     * @param tag 2-character String representation of a tag name.
-     * @return Tag name packed as 2 ASCII bytes in a short.
-     */
-    public short makeBinaryTag(final String tag) {
-        if (tag.length() != 2) {
-            throw new IllegalArgumentException("String tag does not have length() == 2: " + tag);
-        }
-        return (short)(tag.charAt(1) << 8 | tag.charAt(0));
-    }
-
-    /**
-     * Convert from short representation of tag name to String representation.
-     *
-     * @param tag Tag name packed as 2 ASCII bytes in a short.
-     * @return 2-character String representation of a tag name.
-     */
-    public String makeStringTag(final short tag) {
-        String ret = stringTags[tag];
-        if (ret == null) {
-            final byte[] stringConversionBuf = new byte[2];
-            stringConversionBuf[0] = (byte)(tag & 0xff);
-            stringConversionBuf[1] = (byte)((tag >> 8) & 0xff);
-            ret = StringUtil.bytesToString(stringConversionBuf);
-            stringTags[tag] = ret;
-        }
-        return ret;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTestUtil.java b/src/main/java/htsjdk/samtools/SAMTestUtil.java
deleted file mode 100644
index 83766f3..0000000
--- a/src/main/java/htsjdk/samtools/SAMTestUtil.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Misc methods for SAM-related unit tests.  These are in the src tree rather than the tests tree
- * so that they will be included in sam.jar, and therefore can be used by tests outside of htsjdk.samtools.
- */
-public class SAMTestUtil {
-
-    /**
-     * Indicates that a required sanity-check condition was not met.
-     */
-    public static class SanityCheckFailedException extends RuntimeException {
-        public SanityCheckFailedException(String message) {
-            super(message);
-        }
-    }
-
-    /**
-     * Basic sanity check for a pair of SAMRecords.
-     * @throws SanityCheckFailedException if the sanity check failed
-     */
-    public void assertPairValid(final SAMRecord firstEnd, final SAMRecord secondEnd) throws SanityCheckFailedException {
-        assertEquals(firstEnd.getReadName(), secondEnd.getReadName());
-        assertTrue(firstEnd.getFirstOfPairFlag());
-        assertTrue(secondEnd.getSecondOfPairFlag());
-        assertFalse(secondEnd.getFirstOfPairFlag());
-        assertFalse(firstEnd.getSecondOfPairFlag());
-        if (!firstEnd.getReadUnmappedFlag() && !secondEnd.getReadUnmappedFlag()) {
-            assertNotSame(firstEnd.getReadNegativeStrandFlag(),
-                    secondEnd.getReadNegativeStrandFlag());
-        }
-    }
-
-    /**
-     * Basic sanity check for a SAMRecord.
-     * @throws SanityCheckFailedException if the sanity check failed
-     */
-    public void assertReadValid(final SAMRecord read) throws SanityCheckFailedException {
-        assertEquals(read.getReadBases().length, read.getBaseQualities().length);
-        // Note that it is possible to have an unmapped read that has a coordinate
-        if (read.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME)) {
-            assertEquals(read.getAlignmentStart(), SAMRecord.NO_ALIGNMENT_START);
-            assertTrue(read.getReadUnmappedFlag());
-        } else {
-            assertNotSame(read.getAlignmentStart(), SAMRecord.NO_ALIGNMENT_START);
-        }
-        if (read.getReadUnmappedFlag()) {
-            assertEquals(read.getMappingQuality(), SAMRecord.NO_MAPPING_QUALITY);
-            assertEquals(read.getCigar().getCigarElements().size(), 0);
-        } else {
-            assertNotSame(read.getCigar().getCigarElements(), 0);
-        }
-        if (read.getReadPairedFlag()) {
-            if (read.getMateReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME)) {
-                assertEquals(read.getMateAlignmentStart(), SAMRecord.NO_ALIGNMENT_START);
-                assertTrue(read.getMateUnmappedFlag());
-            } else {
-                // Even if the mate is unmapped, if it has a reference name, it should have a position.
-                assertNotSame(read.getMateAlignmentStart(), SAMRecord.NO_ALIGNMENT_START);
-            }
-            if (read.getReadUnmappedFlag() || read.getMateUnmappedFlag() ||
-                    !read.getReferenceName().equals(read.getMateReferenceName())) {
-                assertEquals(read.getInferredInsertSize(), 0);
-            } else {
-                assertNotSame(read.getInferredInsertSize(), 0);
-            }
-            if (!read.getReadUnmappedFlag() && !read.getMateUnmappedFlag()) {
-                assertNotSame(read.getReadNegativeStrandFlag(), read.getMateNegativeStrandFlag());
-                assertNotSame(read.getMateNegativeStrandFlag(),
-                        read.getReadName());
-            }
-
-        } else {
-            assertEquals(read.getInferredInsertSize(), 0);
-        }
-    }
-
-    private static <T> void assertEquals(T a, T b) {
-        if (a == null) {
-            if (b != null) {
-                throw new SanityCheckFailedException("\"" + a + "\" does not equal \"" + b + "\"");
-            }
-        } else if (!a.equals(b)) {
-            throw new SanityCheckFailedException("\"" + a + "\" does not equal \"" + b + "\"");
-        }
-    }
-
-    private static <T> void assertNotSame(T a, T b) {
-        if (a != b) {
-            throw new SanityCheckFailedException("\"" + a + "\" and \"" + b + "\" are not the same object");
-        }
-    }
-
-    private static void assertTrue(boolean condition) {
-        if (!condition) {
-            throw new SanityCheckFailedException("The condition is false");
-        }
-    }
-
-    private static void assertFalse(boolean condition) {
-        if (condition) {
-            throw new SanityCheckFailedException("The condition is true");
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTextHeaderCodec.java b/src/main/java/htsjdk/samtools/SAMTextHeaderCodec.java
deleted file mode 100644
index fb4b02a..0000000
--- a/src/main/java/htsjdk/samtools/SAMTextHeaderCodec.java
+++ /dev/null
@@ -1,500 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.DateParser;
-import htsjdk.samtools.util.LineReader;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * Parser for a SAM text header, and a generator of SAM text header.
- */
-public class SAMTextHeaderCodec {
-    private static final String HEADER_LINE_START = "@";
-
-    // These attributes are populated when parsing or generating
-    private SAMFileHeader mFileHeader;
-    private final TextTagCodec mTagCodec = new TextTagCodec();
-
-    // These attributes are populated when parsing text
-    private String mCurrentLine;
-    private LineReader mReader;
-    private String mSource;
-    private List<SAMSequenceRecord> sequences;
-    private List<SAMReadGroupRecord> readGroups;
-    // Accumulate header while reading it from input.
-    private final StringBuilder textHeader = new StringBuilder();
-
-    // For error reporting when parsing
-    private ValidationStringency validationStringency = ValidationStringency.SILENT;
-
-    // These attributes are populated when generating text
-    private BufferedWriter writer;
-
-    private static final String TAG_KEY_VALUE_SEPARATOR = ":";
-    private static final char TAG_KEY_VALUE_SEPARATOR_CHAR = ':';
-    private static final String FIELD_SEPARATOR = "\t";
-    private static final char FIELD_SEPARATOR_CHAR = '\t';
-    private static final Pattern FIELD_SEPARATOR_RE = Pattern.compile(FIELD_SEPARATOR);
-
-    public static final String COMMENT_PREFIX = HEADER_LINE_START + HeaderRecordType.CO.name() + FIELD_SEPARATOR;
-
-    void setWriter(final BufferedWriter writer) {
-        this.writer = writer;
-    }
-
-    void setmFileHeader(final SAMFileHeader header) {
-        this.mFileHeader = header;
-    }
-
-    /**
-     * Reads text SAM header and converts to a SAMFileHeader object.
-     * @param reader Where to get header text from.
-     * @param source Name of the input file, for error messages.  May be null.
-     * @return complete header object.
-     */
-    public SAMFileHeader decode(final LineReader reader, final String source) {
-        mFileHeader = new SAMFileHeader();
-        mReader = reader;
-        mSource = source;
-        sequences = new ArrayList<>();
-        readGroups = new ArrayList<>();
-
-        while (advanceLine() != null) {
-            final ParsedHeaderLine parsedHeaderLine = new ParsedHeaderLine(mCurrentLine);
-            if (!parsedHeaderLine.isLineValid()) {
-                continue;
-            }
-            switch (parsedHeaderLine.getHeaderRecordType()) {
-
-                case HD:
-                    parseHDLine(parsedHeaderLine);
-                    break;
-                case PG:
-                    parsePGLine(parsedHeaderLine);
-                    break;
-                case RG:
-                    parseRGLine(parsedHeaderLine);
-                    break;
-                case SQ:
-                    parseSQLine(parsedHeaderLine);
-                    break;
-                case CO:
-                    mFileHeader.addComment(mCurrentLine);
-                    break;
-                default:
-                    throw new IllegalStateException("Unrecognized header record type: " +
-                            parsedHeaderLine.getHeaderRecordType());
-            }
-        }
-        mFileHeader.setSequenceDictionary(new SAMSequenceDictionary(sequences));
-        mFileHeader.setReadGroups(readGroups);
-
-        // Only store the header text if there was a parsing error or the it's less than 1MB on disk / 2MB in mem
-        if (!mFileHeader.getValidationErrors().isEmpty() || textHeader.length() < (1024 * 1024)) {
-            mFileHeader.setTextHeader(textHeader.toString());
-        }
-
-        SAMUtils.processValidationErrors(mFileHeader.getValidationErrors(), -1, validationStringency);
-        return mFileHeader;
-    }
-
-    private String advanceLine() {
-        final int nextChar = mReader.peek();
-        if (nextChar != '@') {
-            return null;
-        }
-        mCurrentLine = mReader.readLine();
-        textHeader.append(mCurrentLine).append('\n');
-        return mCurrentLine;
-    }
-
-    /**
-     * Transfer standard and non-standard tags from text representation to in-memory representation.
-     * All values are now stored as Strings.
-     * @param record attributes get set into this object.
-     * @param textAttributes Map of tag type to value.  Some values may be removed by this method.
-     */
-    private void transferAttributes(final AbstractSAMHeaderRecord record, final Map<String, String> textAttributes) {
-        // All header tags are now of type String, so no need to distinguish standard from non-standard.
-        for (final Map.Entry<String, String> entry : textAttributes.entrySet()) {
-            record.setAttribute(entry.getKey(), entry.getValue());
-        }
-
-    }
-
-    private void parsePGLine(final ParsedHeaderLine parsedHeaderLine) {
-        assert(HeaderRecordType.PG.equals(parsedHeaderLine.getHeaderRecordType()));
-        if (!parsedHeaderLine.requireTag(SAMProgramRecord.PROGRAM_GROUP_ID_TAG)) {
-            return;
-        }
-        final SAMProgramRecord programRecord = new SAMProgramRecord(parsedHeaderLine.removeValue(SAMProgramRecord.PROGRAM_GROUP_ID_TAG));
-
-        transferAttributes(programRecord, parsedHeaderLine.mKeyValuePairs);
-        mFileHeader.addProgramRecord(programRecord);
-    }
-
-    private void parseRGLine(final ParsedHeaderLine parsedHeaderLine) {
-        assert(HeaderRecordType.RG.equals(parsedHeaderLine.getHeaderRecordType()));
-        if (!parsedHeaderLine.requireTag(SAMReadGroupRecord.READ_GROUP_ID_TAG)) {
-            return;
-        }
-        // Allow no SM tag if validation stringency is not strict.  This call has the side effect of reporting an error
-        // or throwing an exception depending on validation stringency if this is missing.
-        parsedHeaderLine.requireTag(SAMReadGroupRecord.READ_GROUP_SAMPLE_TAG);
-        final SAMReadGroupRecord samReadGroupRecord = new SAMReadGroupRecord(parsedHeaderLine.removeValue(SAMReadGroupRecord.READ_GROUP_ID_TAG));
-        transferAttributes(samReadGroupRecord, parsedHeaderLine.mKeyValuePairs);
-
-        // Convert non-String attributes to the appropriate types
-        final String predictedMedianInsertSize =
-                (String)samReadGroupRecord.getAttribute(SAMReadGroupRecord.PREDICTED_MEDIAN_INSERT_SIZE_TAG);
-        if (predictedMedianInsertSize != null) {
-            try {
-                Integer.parseInt(predictedMedianInsertSize);
-                samReadGroupRecord.setAttribute(SAMReadGroupRecord.PREDICTED_MEDIAN_INSERT_SIZE_TAG,predictedMedianInsertSize);
-            } catch (NumberFormatException e) {
-                reportErrorParsingLine(SAMReadGroupRecord.PREDICTED_MEDIAN_INSERT_SIZE_TAG +
-                        " is not numeric: " + predictedMedianInsertSize, SAMValidationError.Type.INVALID_PREDICTED_MEDIAN_INSERT_SIZE,
-                        e);
-            }
-        }
-
-        final String dateRunProduced = (String)samReadGroupRecord.getAttribute(SAMReadGroupRecord.DATE_RUN_PRODUCED_TAG);
-        if (dateRunProduced != null) {
-            Object date;
-            try {
-                date = mTagCodec.decodeDate(dateRunProduced);
-            } catch (DateParser.InvalidDateException e) {
-                // Can't convert date string into Date object.  Treat it as a string if validation
-                //  stringency allows it.
-                date = dateRunProduced;
-                reportErrorParsingLine(SAMReadGroupRecord.DATE_RUN_PRODUCED_TAG + " tag value '" +
-                dateRunProduced + "' is not parseable as a date", SAMValidationError.Type.INVALID_DATE_STRING,
-                        e);
-            }
-            samReadGroupRecord.setAttribute(SAMReadGroupRecord.DATE_RUN_PRODUCED_TAG, date.toString());
-        }
-
-        readGroups.add(samReadGroupRecord);
-    }
-
-    private void parseSQLine(final ParsedHeaderLine parsedHeaderLine) {
-        assert(HeaderRecordType.SQ.equals(parsedHeaderLine.getHeaderRecordType()));
-        if (!parsedHeaderLine.requireTag(SAMSequenceRecord.SEQUENCE_NAME_TAG) ||
-                !parsedHeaderLine.requireTag(SAMSequenceRecord.SEQUENCE_LENGTH_TAG)) {
-            return;
-        }
-        String sequenceName = parsedHeaderLine.removeValue(SAMSequenceRecord.SEQUENCE_NAME_TAG);
-        sequenceName = SAMSequenceRecord.truncateSequenceName(sequenceName);
-        final SAMSequenceRecord samSequenceRecord = new SAMSequenceRecord(sequenceName,
-                Integer.parseInt(parsedHeaderLine.removeValue(SAMSequenceRecord.SEQUENCE_LENGTH_TAG)));
-        transferAttributes(samSequenceRecord, parsedHeaderLine.mKeyValuePairs);
-        sequences.add(samSequenceRecord);
-    }
-
-    private void parseHDLine(final ParsedHeaderLine parsedHeaderLine) {
-        assert(HeaderRecordType.HD.equals(parsedHeaderLine.getHeaderRecordType()));
-        if (!parsedHeaderLine.requireTag(SAMFileHeader.VERSION_TAG)) {
-            return;
-        }
-        transferAttributes(mFileHeader, parsedHeaderLine.mKeyValuePairs);
-    }
-
-    private void reportErrorParsingLine(String reason, final SAMValidationError.Type type, final Throwable nestedException) {
-        reason = "Error parsing SAM header. " + reason + ". Line:\n" + mCurrentLine;
-        if (validationStringency != ValidationStringency.STRICT) {
-            final SAMValidationError error = new SAMValidationError(type, reason, null, mReader.getLineNumber());
-            error.setSource(mSource);
-            mFileHeader.addValidationError(error);
-        } else {
-            String fileMessage = "";
-            if (mSource != null) {
-                fileMessage = "File " + mSource;
-            }
-            throw new SAMFormatException(reason + "; " + fileMessage +
-                    "; Line number " + mReader.getLineNumber(), nestedException);
-        }
-    }
-
-    private enum HeaderRecordType {
-        HD, SQ, RG, PG, CO
-    }
-
-    /**
-     * Takes a header line as a String and converts it into a HeaderRecordType, and a map of key:value strings.
-     * If the line does not contain a recognized HeaderRecordType, then the line is considered invalid, and will
-     * not have any key:value pairs.
-     */
-    private class ParsedHeaderLine {
-        private HeaderRecordType mHeaderRecordType;
-        private final Map<String, String> mKeyValuePairs = new LinkedHashMap<String, String>();
-        private boolean lineValid = false;
-
-        ParsedHeaderLine(final String line) {
-            assert(line.startsWith(HEADER_LINE_START));
-
-            // Tab-separate
-            String[] fields = new String[1024];
-            int numFields = StringUtil.split(line, fields, FIELD_SEPARATOR_CHAR);
-            if (numFields == fields.length) {
-                // Lots of fields, so fall back
-                fields = FIELD_SEPARATOR_RE.split(line);
-                numFields = fields.length;
-            }
-
-            // Parse the HeaderRecordType
-            try {
-                mHeaderRecordType = HeaderRecordType.valueOf(fields[0].substring(1));
-            } catch (IllegalArgumentException e) {
-                reportErrorParsingLine("Unrecognized header record type", SAMValidationError.Type.UNRECOGNIZED_HEADER_TYPE, null);
-                mHeaderRecordType = null;
-                return;
-            }
-
-            // Do not parse key:value pairs for comment lines.
-            if (mHeaderRecordType == HeaderRecordType.CO) {
-                lineValid = true;
-                return;
-            }
-
-            final String[] keyAndValue = new String[2];
-            // Parse they key:value pairs
-            for (int i = 1; i < numFields; ++i) {
-                if (StringUtil.splitConcatenateExcessTokens(fields[i], keyAndValue, TAG_KEY_VALUE_SEPARATOR_CHAR) != 2) {
-                    reportErrorParsingLine("Problem parsing " + HEADER_LINE_START + mHeaderRecordType +
-                            " key:value pair", SAMValidationError.Type.POORLY_FORMATTED_HEADER_TAG, null);
-                    continue;
-                }
-                if (mKeyValuePairs.containsKey(keyAndValue[0]) &&
-                        ! mKeyValuePairs.get(keyAndValue[0]).equals(keyAndValue[1])) {
-                    reportErrorParsingLine("Problem parsing " + HEADER_LINE_START + mHeaderRecordType +
-                            " key:value pair " + keyAndValue[0] + ":" + keyAndValue[1] +
-                            " clashes with " + keyAndValue[0] + ":" + mKeyValuePairs.get(keyAndValue[0]),
-                            SAMValidationError.Type.HEADER_TAG_MULTIPLY_DEFINED, null);
-                    continue;
-                }
-                mKeyValuePairs.put(keyAndValue[0], keyAndValue[1]);
-            }
-            lineValid = true;
-        }
-
-        /**
-         * True if the line is recognized as one of the valid HeaderRecordTypes.
-         */
-        public boolean isLineValid() {
-            return lineValid;
-        }
-
-        /**
-         * Handling depends on the validation stringency.  If the tag is not present, and stringency is strict,
-         * an exception is thrown.  If stringency is not strict, false is returned.
-         * @param tag Must be present for the line to be considered value.
-         * @return True if tag is present.
-         */
-        boolean requireTag(final String tag) {
-            if (!mKeyValuePairs.containsKey(tag)) {
-                reportErrorParsingLine(HEADER_LINE_START + mHeaderRecordType + " line missing " + tag + " tag",
-                        SAMValidationError.Type.HEADER_RECORD_MISSING_REQUIRED_TAG, null);
-                return false;
-            }
-            return true;
-        }
-
-        /**
-         * @return null if line is invalid, otherwise the parsed HeaderRecordType
-         */
-        public HeaderRecordType getHeaderRecordType() {
-            return mHeaderRecordType;
-        }
-
-        boolean containsKey(final String key) {
-            return mKeyValuePairs.containsKey(key);
-        }
-
-        String getValue(final String key) {
-            return mKeyValuePairs.get(key);
-        }
-
-        String removeValue(final String key) {
-            final String ret = mKeyValuePairs.get(key);
-            mKeyValuePairs.remove(key);
-            return ret;
-        }
-
-    }
-
-    /**
-     * Convert SAMFileHeader from in-memory representation to text representation. Always writes
-     * SAMFileHeader.CURRENT_VERSION as the version in the header.
-     * @param writer where to write the header text.
-     * @param header object to be converted to text.
-     */
-    public void encode(final Writer writer, final SAMFileHeader header) {
-        encode(writer, header, false);
-    }
-
-    /**
-     * Convert SAMFileHeader from in-memory representation to text representation.
-     * @param writer where to write the header text.
-     * @param header object to be converted to text.
-     * @param keepExistingVersionNumber If true, writes whatever version # was in the header.  If false, writes
-     *                                  SAMFileHeader.CURRENT_VERSION.
-     */
-    public void encode(final Writer writer, final SAMFileHeader header, final boolean keepExistingVersionNumber) {
-        mFileHeader = header;
-        this.writer = new BufferedWriter(writer);
-        writeHDLine(keepExistingVersionNumber);
-        for (final SAMSequenceRecord sequenceRecord: header.getSequenceDictionary().getSequences()) {
-            writeSQLine(sequenceRecord);
-        }
-
-        for (final SAMReadGroupRecord readGroup : header.getReadGroups()) {
-            writeRGLine(readGroup);
-        }
-        for (final SAMProgramRecord programRecord : header.getProgramRecords()) {
-            writePGLine(programRecord);
-        }
-        for (final String comment : header.getComments()) {
-            println(comment);
-        }
-        try {
-            this.writer.flush();
-        } catch (IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    /**
-     * Encode {@link SAMSequenceRecord}.
-     * Designed for using in {@link SAMSequenceDictionaryCodec}, allows to implement recording on the fly.
-     * @throws IllegalStateException, if writer is null.
-     */
-    void encodeSequenceRecord(final SAMSequenceRecord sequenceRecord) {
-        if (writer == null) {
-            throw new IllegalStateException("writer couldn't be null");
-        }
-        writeSQLine(sequenceRecord);
-    }
-
-    /**
-     * Encode HD line.
-     * Designed for using in {@link SAMSequenceDictionaryCodec}, allows to implement recording on the fly.
-     * @throws IllegalStateException, if writer is null.
-     */
-    void encodeHeaderLine(final boolean keepExistingVersionNumber) {
-        if (writer == null) {
-            throw new IllegalStateException("writer couldn't be null");
-        }
-        writeHDLine(keepExistingVersionNumber);
-    }
-
-    private void println(final String s) {
-        try {
-            writer.append(s);
-            writer.append("\n");
-        } catch (IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    private void writePGLine(final SAMProgramRecord programRecord) {
-        if (programRecord == null) {
-            return;
-        }
-        final String[] fields = new String[2 + programRecord.getAttributes().size()];
-        fields[0] = HEADER_LINE_START + HeaderRecordType.PG;
-        fields[1] = SAMProgramRecord.PROGRAM_GROUP_ID_TAG + TAG_KEY_VALUE_SEPARATOR + programRecord.getProgramGroupId();
-        encodeTags(programRecord, fields, 2);
-        println(StringUtil.join(FIELD_SEPARATOR, fields));
-    }
-
-    private void writeRGLine(final SAMReadGroupRecord readGroup) {
-        final String[] fields = new String[2 + readGroup.getAttributes().size()];
-        fields[0] = HEADER_LINE_START + HeaderRecordType.RG;
-        fields[1] = SAMReadGroupRecord.READ_GROUP_ID_TAG + TAG_KEY_VALUE_SEPARATOR + readGroup.getReadGroupId();
-        encodeTags(readGroup, fields, 2);
-        println(StringUtil.join(FIELD_SEPARATOR, fields));
-    }
-
-    private void writeHDLine(final boolean keepExistingVersionNumber) {
-        final SAMFileHeader newHeader;
-        if (keepExistingVersionNumber) {
-            newHeader = mFileHeader;
-        } else {
-            // Make a copy of the header, excluding the version from the input header, so that
-            // output get CURRENT_VERSION instead of whatever the version of the input header was.
-            newHeader = new SAMFileHeader();
-
-            for (final Map.Entry<String, String> entry : mFileHeader.getAttributes()) {
-                if (!entry.getKey().equals(SAMFileHeader.VERSION_TAG)) {
-                    newHeader.setAttribute(entry.getKey(), entry.getValue());
-                }
-            }
-        }
-
-        final String[] fields = new String[1 + newHeader.getAttributes().size()];
-        fields[0] = HEADER_LINE_START + HeaderRecordType.HD;
-        encodeTags(newHeader, fields, 1);
-        println(StringUtil.join(FIELD_SEPARATOR, fields));
-    }
-
-    private void writeSQLine(final SAMSequenceRecord sequenceRecord) {
-        final int numAttributes = sequenceRecord.getAttributes() != null ? sequenceRecord.getAttributes().size() : 0;
-        final String[] fields = new String[3 + numAttributes];
-        fields[0] = HEADER_LINE_START + HeaderRecordType.SQ;
-        fields[1] = SAMSequenceRecord.SEQUENCE_NAME_TAG + TAG_KEY_VALUE_SEPARATOR + sequenceRecord.getSequenceName();
-        fields[2] = SAMSequenceRecord.SEQUENCE_LENGTH_TAG + TAG_KEY_VALUE_SEPARATOR + Integer.toString(sequenceRecord.getSequenceLength());
-        encodeTags(sequenceRecord, fields, 3);
-        println(StringUtil.join(FIELD_SEPARATOR, fields));
-    }
-
-    /**
-     * Encode all the attributes in the given object as text
-     * @param rec object containing attributes, and knowledge of which are standard tags
-     * @param fields where to put the text representation of the tags.  Must be big enough to hold all tags.
-     * @param offset where to start putting text tag representations.
-     */
-    private void encodeTags(final AbstractSAMHeaderRecord rec, final String[] fields, int offset) {
-        for (final Map.Entry<String, String> entry: rec.getAttributes()) {
-            fields[offset++] = mTagCodec.encodeUntypedTag(entry.getKey(), entry.getValue());
-        }
-    }
-
-    public void setValidationStringency(final ValidationStringency validationStringency) {
-        if (validationStringency == null) {
-            throw new IllegalArgumentException("null validationStringency not allowed");
-        }
-        this.validationStringency = validationStringency;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTextReader.java b/src/main/java/htsjdk/samtools/SAMTextReader.java
deleted file mode 100644
index 3968f1c..0000000
--- a/src/main/java/htsjdk/samtools/SAMTextReader.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.BufferedLineReader;
-import htsjdk.samtools.util.CloseableIterator;
-
-import java.io.File;
-import java.io.InputStream;
-
-
-/**
- * Internal class for reading SAM text files.
- */
-class SAMTextReader extends SamReader.ReaderImplementation {
-
-
-    private SAMRecordFactory samRecordFactory;
-    private BufferedLineReader mReader;
-    private SAMFileHeader mFileHeader = null;
-    private String mCurrentLine = null;
-    private RecordIterator mIterator = null;
-    private File mFile = null;
-
-    private ValidationStringency validationStringency = ValidationStringency.DEFAULT_STRINGENCY;
-
-    /**
-     * Add information about the origin (reader and position) to SAM records.
-     */
-    private SamReader mParentReader;
-
-    /**
-     * Prepare to read a SAM text file.
-     *
-     * @param stream Need not be buffered, as this class provides buffered reading.
-     */
-    public SAMTextReader(final InputStream stream, final ValidationStringency validationStringency, final SAMRecordFactory factory) {
-        mReader = new BufferedLineReader(stream);
-        this.validationStringency = validationStringency;
-        this.samRecordFactory = factory;
-        readHeader();
-    }
-
-    /**
-     * Prepare to read a SAM text file.
-     *
-     * @param stream Need not be buffered, as this class provides buffered reading.
-     * @param file   For error reporting only.
-     */
-    public SAMTextReader(final InputStream stream, final File file, final ValidationStringency validationStringency, final SAMRecordFactory factory) {
-        this(stream, validationStringency, factory);
-        mFile = file;
-    }
-
-    /**
-     * If true, writes the source of every read into the source SAMRecords.
-     *
-     * @param enabled true to write source information into each SAMRecord.
-     */
-    public void enableFileSource(final SamReader reader, final boolean enabled) {
-        this.mParentReader = enabled ? reader : null;
-    }
-
-    void enableIndexCaching(final boolean enabled) {
-        throw new UnsupportedOperationException("Cannot enable index caching for a SAM text reader");
-    }
-
-    void enableIndexMemoryMapping(final boolean enabled) {
-        throw new UnsupportedOperationException("Cannot enable index memory mapping for a SAM text reader");
-    }
-
-    void enableCrcChecking(final boolean enabled) {
-        // Do nothing - this has no meaning for SAM reading
-    }
-
-    void setSAMRecordFactory(final SAMRecordFactory factory) {
-        this.samRecordFactory = factory;
-    }
-
-    @Override
-    public SamReader.Type type() {
-        return SamReader.Type.SAM_TYPE;
-    }
-
-    public boolean hasIndex() {
-        return false;
-    }
-
-    public BAMIndex getIndex() {
-        throw new UnsupportedOperationException();
-    }
-
-    public void close() {
-        if (mReader != null) {
-            try {
-                mReader.close();
-            } finally {
-                mReader = null;
-            }
-        }
-    }
-
-    public SAMFileHeader getFileHeader() {
-        return mFileHeader;
-    }
-
-    public ValidationStringency getValidationStringency() {
-        return validationStringency;
-    }
-
-    public void setValidationStringency(final ValidationStringency stringency) {
-        this.validationStringency = stringency;
-    }
-
-    /**
-     * There can only be one extant iterator on a SAMTextReader at a time.  The previous one must
-     * be closed before calling getIterator().  Because the input stream is not seekable, a subsequent
-     * call to getIterator() returns an iterator that starts where the last one left off.
-     *
-     * @return Iterator of SAMRecords in file order.
-     */
-    public CloseableIterator<SAMRecord> getIterator() {
-        if (mReader == null) {
-            throw new IllegalStateException("File reader is closed");
-        }
-        if (mIterator != null) {
-            throw new IllegalStateException("Iteration in progress");
-        }
-        mIterator = new RecordIterator();
-        return mIterator;
-    }
-
-    /**
-     * Generally loads data at a given point in the file.  Unsupported for SAMTextReaders.
-     *
-     * @param fileSpan The file span.
-     * @return An iterator over the given file span.
-     */
-    public CloseableIterator<SAMRecord> getIterator(final SAMFileSpan fileSpan) {
-        throw new UnsupportedOperationException("Cannot directly iterate over regions within SAM text files.");
-    }
-
-    /**
-     * Generally gets a pointer to the first read in the file.  Unsupported for SAMTextReaders.
-     *
-     * @return An pointer to the first read in the file.
-     */
-    public SAMFileSpan getFilePointerSpanningReads() {
-        throw new UnsupportedOperationException("Cannot retrieve file pointers within SAM text files.");
-    }
-
-    /**
-     * Unsupported for SAM text files.
-     */
-    public CloseableIterator<SAMRecord> query(final String sequence, final int start, final int end, final boolean contained) {
-        throw new UnsupportedOperationException("Cannot query SAM text files");
-    }
-
-    @Override
-    public CloseableIterator<SAMRecord> query(final QueryInterval[] intervals, final boolean contained) {
-        throw new UnsupportedOperationException("Cannot query SAM text files");
-    }
-
-    /**
-     * Unsupported for SAM text files.
-     */
-    public CloseableIterator<SAMRecord> queryAlignmentStart(final String sequence, final int start) {
-        throw new UnsupportedOperationException("Cannot query SAM text files");
-    }
-
-    public CloseableIterator<SAMRecord> queryUnmapped() {
-        throw new UnsupportedOperationException("Cannot query SAM text files");
-    }
-
-    private void readHeader() {
-        final SAMTextHeaderCodec headerCodec = new SAMTextHeaderCodec();
-        headerCodec.setValidationStringency(validationStringency);
-        mFileHeader = headerCodec.decode(mReader, (mFile != null ? mFile.toString() : null));
-        advanceLine();
-    }
-
-    private String advanceLine() {
-        mCurrentLine = mReader.readLine();
-        return mCurrentLine;
-    }
-
-    /**
-     * SAMRecord iterator for SAMTextReader
-     */
-    private class RecordIterator implements CloseableIterator<SAMRecord> {
-
-        private final SAMLineParser parser = new SAMLineParser(samRecordFactory, validationStringency,
-                mFileHeader, mParentReader, mFile);
-
-        private RecordIterator() {
-            if (mReader == null) {
-                throw new IllegalStateException("Reader is closed.");
-            }
-        }
-
-        public void close() {
-            SAMTextReader.this.close();
-        }
-
-        public boolean hasNext() {
-            return mCurrentLine != null;
-        }
-
-        public SAMRecord next() {
-            if (!hasNext()) {
-                throw new IllegalStateException("Cannot call next() on exhausted iterator");
-            }
-            try {
-                return parseLine();
-            } finally {
-                advanceLine();
-            }
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException("Not supported: remove");
-        }
-
-        private SAMRecord parseLine() {
-
-            return parser.parseLine(mCurrentLine, mReader.getLineNumber());
-        }
-
-    }
-}
-
diff --git a/src/main/java/htsjdk/samtools/SAMTextWriter.java b/src/main/java/htsjdk/samtools/SAMTextWriter.java
deleted file mode 100644
index 0786d67..0000000
--- a/src/main/java/htsjdk/samtools/SAMTextWriter.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.AsciiWriter;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.io.Writer;
-
-/**
- * Writer for text-format SAM files.
- */
-public class SAMTextWriter extends SAMFileWriterImpl {
-    private static final String FIELD_SEPARATOR = "\t";
-
-    private final Writer out;
-    // For error reporting only.
-    private final File file;
-    private final TextTagCodec tagCodec = new TextTagCodec();
-    private final SAMTagUtil tagUtil = new SAMTagUtil();
-
-    private final SamFlagField samFlagFieldOutput;
-    
-    /**
-     * Constructs a SAMTextWriter that outputs to a Writer.
-     * @param out Writer.
-     */
-    public SAMTextWriter(final Writer out) {
-        this(out, SamFlagField.DECIMAL);
-    }
-
-    /**
-     * Constructs a SAMTextWriter that writes to a File.
-     * @param file Where to write the output.
-     */
-    public SAMTextWriter(final File file) {
-        this(file, SamFlagField.DECIMAL);
-    }
-
-    /**
-     * Returns the Writer used by this instance.  Useful for flushing the output.
-     */
-    public Writer getWriter() {
-	return out;
-    }
-
-    /**
-     * Constructs a SAMTextWriter that writes to an OutputStream.  The OutputStream
-     * is wrapped in an AsciiWriter, which can be retrieved with getWriter().
-     * @param stream Need not be buffered because this class provides buffering. 
-     */
-    public SAMTextWriter(final OutputStream stream) {
-        this(stream, SamFlagField.DECIMAL);
-    }
-
-    /**
-     * Constructs a SAMTextWriter that outputs to a Writer.
-     * @param out Writer.
-     */
-    public SAMTextWriter(final Writer out, final SamFlagField samFlagFieldOutput) {
-        if (samFlagFieldOutput == null) throw new IllegalArgumentException("Sam flag field was null");
-        this.out = out;
-        this.file = null;
-        this.samFlagFieldOutput = samFlagFieldOutput;
-    }
-
-    /**
-     * Constructs a SAMTextWriter that writes to a File.
-     * @param file Where to write the output.
-     */
-    public SAMTextWriter(final File file, final SamFlagField samFlagFieldOutput) {
-        if (samFlagFieldOutput == null) throw new IllegalArgumentException("Sam flag field was null");
-        try {
-            this.file = file;
-            this.out = new AsciiWriter(new FileOutputStream(file));
-        } catch (final IOException e) {
-            throw new RuntimeIOException(e);
-        }
-        this.samFlagFieldOutput = samFlagFieldOutput;
-    }
-
-    /**
-     * Constructs a SAMTextWriter that writes to an OutputStream.  The OutputStream
-     * is wrapped in an AsciiWriter, which can be retrieved with getWriter().
-     * @param stream Need not be buffered because this class provides buffering.
-     */
-    public SAMTextWriter(final OutputStream stream, final SamFlagField samFlagFieldOutput) {
-        if (samFlagFieldOutput == null) throw new IllegalArgumentException("Sam flag field was null");
-        this.file = null;
-        this.out = new AsciiWriter(stream);
-        this.samFlagFieldOutput = samFlagFieldOutput;
-    }
-
-    /**
-     * Write the record.
-     *
-     * @param alignment SAMRecord.
-     */
-    public void writeAlignment(final SAMRecord alignment) {
-        try {
-            out.write(alignment.getReadName());
-            out.write(FIELD_SEPARATOR);
-            out.write(this.samFlagFieldOutput.format(alignment.getFlags()));
-            out.write(FIELD_SEPARATOR);
-            out.write(alignment.getReferenceName());
-            out.write(FIELD_SEPARATOR);
-            out.write(Integer.toString(alignment.getAlignmentStart()));
-            out.write(FIELD_SEPARATOR);
-            out.write(Integer.toString(alignment.getMappingQuality()));
-            out.write(FIELD_SEPARATOR);
-            out.write(alignment.getCigarString());
-            out.write(FIELD_SEPARATOR);
-
-            //  == is OK here because these strings are interned
-            if (alignment.getReferenceName() == alignment.getMateReferenceName() &&
-                    SAMRecord.NO_ALIGNMENT_REFERENCE_NAME != alignment.getReferenceName()) {
-                out.write("=");
-            } else {
-                out.write(alignment.getMateReferenceName());
-            }
-            out.write(FIELD_SEPARATOR);
-            out.write(Integer.toString(alignment.getMateAlignmentStart()));
-            out.write(FIELD_SEPARATOR);
-            out.write(Integer.toString(alignment.getInferredInsertSize()));
-            out.write(FIELD_SEPARATOR);
-            out.write(alignment.getReadString());
-            out.write(FIELD_SEPARATOR);
-            out.write(alignment.getBaseQualityString());
-            SAMBinaryTagAndValue attribute = alignment.getBinaryAttributes();
-            while (attribute != null) {
-                out.write(FIELD_SEPARATOR);
-                final String encodedTag;
-                if (attribute.isUnsignedArray()) {
-                    encodedTag = tagCodec.encodeUnsignedArray(tagUtil.makeStringTag(attribute.tag), attribute.value);
-                } else {
-                    encodedTag = tagCodec.encode(tagUtil.makeStringTag(attribute.tag), attribute.value);
-                }
-                out.write(encodedTag);
-                attribute = attribute.getNext();
-            }
-            out.write("\n");
-
-        } catch (final IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    /* This method is called by SAMRecord.getSAMString(). */
-    private static SAMTextWriter textWriter = null;
-    private static StringWriter stringWriter = null;
-    static synchronized String getSAMString(final SAMRecord alignment) {
-        if (stringWriter == null) stringWriter = new StringWriter();
-        if (textWriter == null) textWriter = new SAMTextWriter(stringWriter);
-        stringWriter.getBuffer().setLength(0);
-        textWriter.writeAlignment(alignment);
-        return stringWriter.toString();
-    }
-
-    /**
-     * Write the header text.  This method can also be used to write
-     * an arbitrary String, not necessarily the header.
-     *
-     * @param textHeader String containing the text to write.
-     */
-    public void writeHeader(final String textHeader) {
-        try {
-            out.write(textHeader);
-        } catch (final IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    /**
-     * Do any required flushing here.
-     */
-    public void finish() {
-        try {
-            out.close();
-        } catch (final IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    /**
-     * For producing error messages.
-     *
-     * @return Output filename, or null if there isn't one.
-     */
-    public String getFilename() {
-        if (file == null) {
-            return null;
-        }
-        return file.getAbsolutePath();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTools.java b/src/main/java/htsjdk/samtools/SAMTools.java
deleted file mode 100644
index 551f846..0000000
--- a/src/main/java/htsjdk/samtools/SAMTools.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.CloseableIterator;
-
-import java.io.File;
-
-
-/**
- * Command line utility for manipulating SAM/BAM files.
- */
-public class SAMTools {
-    private String mCommand = null;
-    private File mInputFile = null;
-
-
-    public static void main(final String[] args)
-            throws Exception {
-        final int status = new SAMTools().run(args);
-        if (status != 0) {
-            System.exit(status);
-        }
-    }
-
-    private SAMTools() {
-    }
-
-    private void usage() {
-        System.out.println();
-        System.out.println("SAMTools version 0.1.0");
-        System.out.println("Tools for manipulating SAM/BAM files");
-        System.out.println();
-        System.out.println("Usage: SAMTools <command> <options...>");
-        System.out.println();
-        System.out.println("Commands:");
-        System.out.println("  help");
-        System.out.println("  view        <file>");
-        System.out.println();
-    }
-
-    private boolean parseArguments(final String[] args) {
-        if (args.length == 0) {
-            usage();
-            return true;
-        }
-        final String command = args[0];
-        final int argpos = 1;
-        final int argcount = args.length - argpos;
-        if (command.equals("help")) {
-            usage();
-            return true;
-        } else if (command.equals("view")) {
-            if (argcount != 1) {
-                usage();
-                return false;
-            }
-            mInputFile = new File(args[1]);
-            if (!mInputFile.exists()) {
-                System.out.println("Input file not found: " + mInputFile);
-                return false;
-            }
-        } else {
-            System.out.println("Unrecognized command: " + command);
-            System.out.println();
-            usage();
-            return false;
-        }
-        mCommand = command;
-        return true;
-    }
-
-    private int run(final String[] args)
-            throws Exception {
-        if (!parseArguments(args)) {
-            return 1;
-        }
-        if (mCommand == null) {
-            return 0;
-        }
-        if (mCommand.equals("view")) {
-            return runView();
-        }
-        return 1;
-    }
-
-    private int runView() {
-        final SamReader reader = SamReaderFactory.makeDefault().open(mInputFile);
-        final CloseableIterator<SAMRecord> iterator = reader.iterator();
-        while (iterator.hasNext()) {
-            final SAMRecord record = iterator.next();
-            System.out.println(record.getSAMString());
-        }
-        iterator.close();
-        return 0;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMUtils.java b/src/main/java/htsjdk/samtools/SAMUtils.java
deleted file mode 100644
index 25b6799..0000000
--- a/src/main/java/htsjdk/samtools/SAMUtils.java
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.CigarUtil;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.RuntimeEOFException;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.regex.Pattern;
-
-
-/**
- * Utilty methods.
- */
-public final class SAMUtils {
-    /** regex for semicolon, used in {@link SAMUtils#getOtherCanonicalAlignments(SAMRecord)} */
-    private static final Pattern SEMICOLON_PAT = Pattern.compile("[;]");
-    /** regex for comma, used in {@link SAMUtils#getOtherCanonicalAlignments(SAMRecord)} */
-    private static final Pattern COMMA_PAT = Pattern.compile("[,]");
-
-    // Representation of bases, one for when in low-order nybble, one for when in high-order nybble.
-    private static final byte COMPRESSED_EQUAL_LOW = 0;
-    private static final byte COMPRESSED_A_LOW = 1;
-    private static final byte COMPRESSED_C_LOW = 2;
-    private static final byte COMPRESSED_M_LOW = 3;
-    private static final byte COMPRESSED_G_LOW = 4;
-    private static final byte COMPRESSED_R_LOW = 5;
-    private static final byte COMPRESSED_S_LOW = 6;
-    private static final byte COMPRESSED_V_LOW = 7;
-    private static final byte COMPRESSED_T_LOW = 8;
-    private static final byte COMPRESSED_W_LOW = 9;
-    private static final byte COMPRESSED_Y_LOW = 10;
-    private static final byte COMPRESSED_H_LOW = 11;
-    private static final byte COMPRESSED_K_LOW = 12;
-    private static final byte COMPRESSED_D_LOW = 13;
-    private static final byte COMPRESSED_B_LOW = 14;
-    private static final byte COMPRESSED_N_LOW = 15;
-    private static final byte COMPRESSED_EQUAL_HIGH = COMPRESSED_EQUAL_LOW << 4;
-    private static final byte COMPRESSED_A_HIGH = COMPRESSED_A_LOW << 4;
-    private static final byte COMPRESSED_C_HIGH = COMPRESSED_C_LOW << 4;
-    private static final byte COMPRESSED_G_HIGH = COMPRESSED_G_LOW << 4;
-    private static final byte COMPRESSED_T_HIGH = (byte) (COMPRESSED_T_LOW << 4);
-    private static final byte COMPRESSED_N_HIGH = (byte) (COMPRESSED_N_LOW << 4);
-
-    private static final byte COMPRESSED_M_HIGH = (byte) (COMPRESSED_M_LOW << 4);
-    private static final byte COMPRESSED_R_HIGH = (byte) (COMPRESSED_R_LOW << 4);
-    private static final byte COMPRESSED_S_HIGH = (byte) (COMPRESSED_S_LOW << 4);
-    private static final byte COMPRESSED_V_HIGH = (byte) (COMPRESSED_V_LOW << 4);
-    private static final byte COMPRESSED_W_HIGH = (byte) (COMPRESSED_W_LOW << 4);
-    private static final byte COMPRESSED_Y_HIGH = (byte) (COMPRESSED_Y_LOW << 4);
-    private static final byte COMPRESSED_H_HIGH = (byte) (COMPRESSED_H_LOW << 4);
-    private static final byte COMPRESSED_K_HIGH = (byte) (COMPRESSED_K_LOW << 4);
-    private static final byte COMPRESSED_D_HIGH = (byte) (COMPRESSED_D_LOW << 4);
-    private static final byte COMPRESSED_B_HIGH = (byte) (COMPRESSED_B_LOW << 4);
-    
-    private static final byte [] COMPRESSED_LOOKUP_TABLE = 
-            new byte[]{
-                '=',
-                'A',
-                'C',
-                'M',
-                'G',
-                'R',
-                'S',
-                'V',
-                'T',
-                'W',
-                'Y',
-                'H',
-                'K',
-                'D',
-                'B',
-                'N'
-            };
-    
-    public static final int MAX_PHRED_SCORE = 93;
-
-    /**
-     * Convert from a byte array containing =AaCcGgTtNn represented as ASCII, to a byte array half as long,
-     * with =, A, C, G, T converted to 0, 1, 2, 4, 8, 15.
-     *
-     * @param readBases Bases as ASCII bytes.
-     * @return New byte array with bases represented as nybbles, in BAM binary format.
-     */
-    static byte[] bytesToCompressedBases(final byte[] readBases) {
-        final byte[] compressedBases = new byte[(readBases.length + 1) / 2];
-        int i;
-        for (i = 1; i < readBases.length; i += 2) {
-            compressedBases[i / 2] = (byte) (charToCompressedBaseHigh(readBases[i - 1]) |
-                    charToCompressedBaseLow(readBases[i]));
-        }
-        // Last nybble
-        if (i == readBases.length) {
-            compressedBases[i / 2] = charToCompressedBaseHigh((char) readBases[i - 1]);
-        }
-        return compressedBases;
-    }
-
-    /**
-     * Convert from a byte array with basese stored in nybbles, with =, A, C, G, T represented as 0, 1, 2, 4, 8, 15,
-     * to a a byte array containing =AaCcGgTtNn represented as ASCII.
-     *
-     * @param length Number of bases (not bytes) to convert.
-     * @param compressedBases Bases represented as nybbles, in BAM binary format.
-     * @param compressedOffset Byte offset in compressedBases to start.
-     * @return New byte array with bases as ASCII bytes.
-     */
-    public static byte[] compressedBasesToBytes(final int length, final byte[] compressedBases, final int compressedOffset) {
-        final byte[] ret = new byte[length];
-        int i;
-        for (i = 1; i < length; i += 2) {
-            final int compressedIndex = i / 2 + compressedOffset;
-            ret[i - 1] = compressedBaseToByteHigh(compressedBases[compressedIndex]);
-            ret[i] = compressedBaseToByteLow(compressedBases[compressedIndex]);
-        }
-        // Last nybble
-        if (i == length) {
-            ret[i - 1] = compressedBaseToByteHigh(compressedBases[i / 2 + compressedOffset]);
-        }
-        return ret;
-    }
-
-    /**
-     * Convert from ASCII byte to BAM nybble representation of a base in low-order nybble.
-     *
-     * @param base One of =AaCcGgTtNn.
-     * @return Low-order nybble-encoded equivalent.
-     */
-    private static byte charToCompressedBaseLow(final int base) {
-        switch (base) {
-            case '=':
-                return COMPRESSED_EQUAL_LOW;
-            case 'a':
-            case 'A':
-                return COMPRESSED_A_LOW;
-            case 'c':
-            case 'C':
-                return COMPRESSED_C_LOW;
-            case 'g':
-            case 'G':
-                return COMPRESSED_G_LOW;
-            case 't':
-            case 'T':
-                return COMPRESSED_T_LOW;
-            case 'n':
-            case 'N':
-            case '.':
-                return COMPRESSED_N_LOW;
-
-            // IUPAC ambiguity codes
-            case 'M':
-            case 'm':
-                return COMPRESSED_M_LOW;
-            case 'R':
-            case 'r':
-                return COMPRESSED_R_LOW;
-            case 'S':
-            case 's':
-                return COMPRESSED_S_LOW;
-            case 'V':
-            case 'v':
-                return COMPRESSED_V_LOW;
-            case 'W':
-            case 'w':
-                return COMPRESSED_W_LOW;
-            case 'Y':
-            case 'y':
-                return COMPRESSED_Y_LOW;
-            case 'H':
-            case 'h':
-                return COMPRESSED_H_LOW;
-            case 'K':
-            case 'k':
-                return COMPRESSED_K_LOW;
-            case 'D':
-            case 'd':
-                return COMPRESSED_D_LOW;
-            case 'B':
-            case 'b':
-                return COMPRESSED_B_LOW;
-            default:
-                throw new IllegalArgumentException("Bad  byte passed to charToCompressedBase: " + base);
-        }
-    }
-
-    /**
-     * Convert from ASCII byte to BAM nybble representation of a base in high-order nybble.
-     *
-     * @param base One of =AaCcGgTtNn.
-     * @return High-order nybble-encoded equivalent.
-     */
-    private static byte charToCompressedBaseHigh(final int base) {
-        switch (base) {
-            case '=':
-                return COMPRESSED_EQUAL_HIGH;
-            case 'a':
-            case 'A':
-                return COMPRESSED_A_HIGH;
-            case 'c':
-            case 'C':
-                return COMPRESSED_C_HIGH;
-            case 'g':
-            case 'G':
-                return COMPRESSED_G_HIGH;
-            case 't':
-            case 'T':
-                return COMPRESSED_T_HIGH;
-            case 'n':
-            case 'N':
-            case '.':
-                return COMPRESSED_N_HIGH;
-
-            // IUPAC ambiguity codes
-            case 'M':
-            case 'm':
-                return COMPRESSED_M_HIGH;
-            case 'R':
-            case 'r':
-                return COMPRESSED_R_HIGH;
-            case 'S':
-            case 's':
-                return COMPRESSED_S_HIGH;
-            case 'V':
-            case 'v':
-                return COMPRESSED_V_HIGH;
-            case 'W':
-            case 'w':
-                return COMPRESSED_W_HIGH;
-            case 'Y':
-            case 'y':
-                return COMPRESSED_Y_HIGH;
-            case 'H':
-            case 'h':
-                return COMPRESSED_H_HIGH;
-            case 'K':
-            case 'k':
-                return COMPRESSED_K_HIGH;
-            case 'D':
-            case 'd':
-                return COMPRESSED_D_HIGH;
-            case 'B':
-            case 'b':
-                return COMPRESSED_B_HIGH;
-            default:
-                throw new IllegalArgumentException("Bad  byte passed to charToCompressedBase: " + base);
-        }
-    }
-    
-    /**
-     * Returns the byte corresponding to a certain nybble
-     * @param base One of COMPRESSED_*_LOW, a low-order nybble encoded base.
-     * @return ASCII base, one of ACGTN=.
-     */
-    private static byte compressedBaseToByte(byte base){
-        try{
-            return COMPRESSED_LOOKUP_TABLE[base];
-        }catch(IndexOutOfBoundsException e){
-            throw new IllegalArgumentException("Bad  byte passed to charToCompressedBase: " + base);
-        }
-    }
-
-    /**
-     * Convert from BAM nybble representation of a base in low-order nybble to ASCII byte.
-     *
-     * @param base One of COMPRESSED_*_LOW, a low-order nybble encoded base.
-     * @return ASCII base, one of ACGTN=.
-     */
-    private static byte compressedBaseToByteLow(final int base) {
-        return compressedBaseToByte((byte)(base & 0xf));
-    }
-
-    /**
-     * Convert from BAM nybble representation of a base in high-order nybble to ASCII byte.
-     *
-     * @param base One of COMPRESSED_*_HIGH, a high-order nybble encoded base.
-     * @return ASCII base, one of ACGTN=.
-     */
-    private static byte compressedBaseToByteHigh(final int base) {
-        return compressedBaseToByte((byte)((base >> 4) & 0xf));
-    }
-
-    /**
-     * Convert bases in place into canonical form, upper case, and with no-call represented as N.
-     *
-     * @param bases
-     */
-    static void normalizeBases(final byte[] bases) {
-        for (int i = 0; i < bases.length; ++i) {
-            bases[i] = StringUtil.toUpperCase(bases[i]);
-            if (bases[i] == '.') {
-                bases[i] = 'N';
-            }
-        }
-    }
-
-    /**
-     * Convert an array of bytes, in which each byte is a binary phred quality score, to
-     * printable ASCII representation of the quality scores, ala FASTQ format.
-     * <p/>
-     * Equivalent to phredToFastq(data, 0, data.length)
-     *
-     * @param data Array of bytes in which each byte is a binar phred score.
-     * @return String with ASCII representation of those quality scores.
-     */
-    public static String phredToFastq(final byte[] data) {
-        if (data == null) {
-            return null;
-        }
-        return phredToFastq(data, 0, data.length);
-    }
-
-    /**
-     * Convert an array of bytes, in which each byte is a binary phred quality score, to
-     * printable ASCII representation of the quality scores, ala FASTQ format.
-     *
-     * @param buffer Array of bytes in which each byte is a binar phred score.
-     * @param offset Where in buffer to start conversion.
-     * @param length How many bytes of buffer to convert.
-     * @return String with ASCII representation of those quality scores.
-     */
-    public static String phredToFastq(final byte[] buffer, final int offset, final int length) {
-        final char[] chars = new char[length];
-        for (int i = 0; i < length; i++) {
-            chars[i] = phredToFastq(buffer[offset + i] & 0xFF);
-        }
-        return new String(chars);
-    }
-
-    /**
-     * Convert a single binary phred score to printable ASCII representation, ala FASTQ format.
-     *
-     * @param phredScore binary phred score.
-     * @return Printable ASCII representation of phred score.
-     */
-    public static char phredToFastq(final int phredScore) {
-        if (phredScore < 0 || phredScore > MAX_PHRED_SCORE) {
-            throw new IllegalArgumentException("Cannot encode phred score: " + phredScore);
-        }
-        return (char) (33 + phredScore);
-    }
-
-    /**
-     * Convert a string with phred scores in printable ASCII FASTQ format to an array
-     * of binary phred scores.
-     *
-     * @param fastq Phred scores in FASTQ printable ASCII format.
-     * @return byte array of binary phred scores in which each byte corresponds to a character in the input string.
-     */
-    public static byte[] fastqToPhred(final String fastq) {
-        if (fastq == null) {
-            return null;
-        }
-        final int length = fastq.length();
-        final byte[] scores = new byte[length];
-        for (int i = 0; i < length; i++) {
-            scores[i] = (byte) fastqToPhred(fastq.charAt(i));
-        }
-        return scores;
-    }
-
-    /**
-     * Converts printable qualities in Sanger fastq format to binary phred scores.
-     */
-    public static void fastqToPhred(final byte[] fastq) {
-        for (int i = 0; i < fastq.length; ++i) {
-            fastq[i] = (byte) fastqToPhred((char) (fastq[i] & 0xff));
-        }
-    }
-
-    /**
-     * Convert a single printable ASCII FASTQ format phred score to binary phred score.
-     *
-     * @param ch Printable ASCII FASTQ format phred score.
-     * @return Binary phred score.
-     */
-    public static int fastqToPhred(final char ch) {
-        if (ch < 33 || ch > 126) {
-            throw new IllegalArgumentException("Invalid fastq character: " + ch);
-        }
-        return (ch - 33);
-    }
-
-    /**
-     * calculate the bin given an alignment in [beg,end)
-     * Copied from SAM spec.
-     *
-     * @param beg 0-based start of read (inclusive)
-     * @param end 0-based end of read (exclusive)
-     * @deprecated Use {@link GenomicIndexUtil#regionToBin}
-     */
-    @Deprecated
-    static int reg2bin(final int beg, final int end) {
-        return GenomicIndexUtil.regionToBin(beg, end);
-    }
-
-    /**
-     * Handle a list of validation errors according to the validation stringency.
-     *
-     * @param validationErrors List of errors to report, or null if there are no errors.
-     * @param samRecordIndex Record number of the SAMRecord corresponding to the validation errors, or -1 if
-     * the record number is not known.
-     * @param validationStringency If STRICT, throw a SAMFormatException.  If LENIENT, print the validation
-     * errors to stderr.  If SILENT, do nothing.
-     */
-    public static void processValidationErrors(final List<SAMValidationError> validationErrors,
-                                               final long samRecordIndex,
-                                               final ValidationStringency validationStringency) {
-        if (validationErrors != null && !validationErrors.isEmpty()) {
-            for (final SAMValidationError validationError : validationErrors) {
-                validationError.setRecordNumber(samRecordIndex);
-            }
-            if (validationStringency == ValidationStringency.STRICT) {
-                throw new SAMFormatException("SAM validation error: " + validationErrors.get(0));
-            } else if (validationStringency == ValidationStringency.LENIENT) {
-                for (final SAMValidationError error : validationErrors) {
-                    System.err.println("Ignoring SAM validation error: " + error);
-                }
-            }
-        }
-    }
-
-    public static void processValidationError(final SAMValidationError validationError,
-                                              final ValidationStringency validationStringency) {
-        if (validationStringency == ValidationStringency.STRICT) {
-            throw new SAMFormatException("SAM validation error: " + validationError);
-        } else if (validationStringency == ValidationStringency.LENIENT) {
-            System.err.println("Ignoring SAM validation error: " + validationError);
-        }
-
-    }
-
-    private static final SAMHeaderRecordComparator<SAMReadGroupRecord> HEADER_RECORD_COMPARATOR =
-            new SAMHeaderRecordComparator<SAMReadGroupRecord>(
-                    SAMReadGroupRecord.PLATFORM_UNIT_TAG,
-                    SAMReadGroupRecord.LIBRARY_TAG,
-                    SAMReadGroupRecord.DATE_RUN_PRODUCED_TAG,
-                    SAMReadGroupRecord.READ_GROUP_SAMPLE_TAG,
-                    SAMReadGroupRecord.SEQUENCING_CENTER_TAG,
-                    SAMReadGroupRecord.PLATFORM_TAG,
-                    SAMReadGroupRecord.DESCRIPTION_TAG,
-                    SAMReadGroupRecord.READ_GROUP_ID_TAG    // We don't actually want to compare with ID but it's suitable
-                    // "just in case" since it's the only one that's actually required
-            );
-
-    /**
-     * Calculate a hash code from identifying information in the RG (read group) records in a SAM file's
-     * header. This hash code changes any time read groups are added or removed. Comparing one file's
-     * hash code to another's tells you if the read groups in the BAM files are different.
-     */
-    public static String calculateReadGroupRecordChecksum(final File input, final File referenceFasta) {
-        final String ENCODING = "UTF-8";
-
-        final MessageDigest digest;
-        try {
-            digest = MessageDigest.getInstance("MD5");
-        } catch (final NoSuchAlgorithmException nsae) {
-            throw new Error("No MD5 algorithm was available in a Java JDK? Unheard-of!");
-        }
-
-        // Sort the read group records by their first
-        final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(referenceFasta).open(input);
-        final List<SAMReadGroupRecord> sortedRecords = new ArrayList<SAMReadGroupRecord>(reader.getFileHeader().getReadGroups());
-        Collections.sort(sortedRecords, HEADER_RECORD_COMPARATOR);
-
-        for (final SAMReadGroupRecord rgRecord : sortedRecords) {
-            final TreeMap<String, String> sortedAttributes = new TreeMap<String, String>();
-            for (final Map.Entry<String, String> attributeEntry : rgRecord.getAttributes()) {
-                sortedAttributes.put(attributeEntry.getKey(), attributeEntry.getValue());
-            }
-
-            try {
-                for (final Map.Entry<String, String> sortedEntry : sortedAttributes.entrySet()) {
-                    if (!sortedEntry.getKey().equals(SAMReadGroupRecord.READ_GROUP_ID_TAG)) { // Redundant check, safety first
-                        digest.update(sortedEntry.getKey().getBytes(ENCODING));
-                        digest.update(sortedEntry.getValue().getBytes(ENCODING));
-                    }
-                }
-            } catch (final UnsupportedEncodingException uee) {
-                throw new Error("No " + ENCODING + "!? WTH?");
-            }
-        }
-
-        // Convert to a String and pad to get the full 32 chars.
-        final StringBuilder hashText = new StringBuilder((new BigInteger(1, digest.digest())).toString(16));
-        while (hashText.length() < 32) hashText.insert(0, "0");
-
-        CloserUtil.close(reader);
-        return hashText.toString();
-    }
-
-    /**
-     * Chains <code>program</code> in front of the first "head" item in the list of
-     * SAMProgramRecords in <code>header</code>.  This method should not be used
-     * when there are multiple chains of program groups in a header, only when
-     * it can safely be assumed that there is only one chain.  It correctly handles
-     * the case where <code>program</code> has already been added to the header, so
-     * it can be used whether creating a SAMProgramRecord with a constructor or when
-     * calling SAMFileHeader.createProgramRecord().
-     */
-    public static void chainSAMProgramRecord(final SAMFileHeader header, final SAMProgramRecord program) {
-
-        final List<SAMProgramRecord> pgs = header.getProgramRecords();
-        if (!pgs.isEmpty()) {
-            final List<String> referencedIds = new ArrayList<String>();
-            for (final SAMProgramRecord pg : pgs) {
-                if (pg.getPreviousProgramGroupId() != null) {
-                    referencedIds.add(pg.getPreviousProgramGroupId());
-                }
-            }
-            for (final SAMProgramRecord pg : pgs) {
-                // if record being chained has already been added, ignore it
-                if (pg.getProgramGroupId().equals(program.getProgramGroupId())) {
-                    continue;
-                }
-                if (!referencedIds.contains(pg.getProgramGroupId())) {
-                    program.setPreviousProgramGroupId(pg.getProgramGroupId());
-                    break;
-                }
-            }
-        }
-    }
-
-    /**
-     * Strip mapping information from a SAMRecord.
-     *
-     * WARNING: by clearing the secondary and supplementary flags,
-     * this may have the affect of producing multiple distinct records with the
-     * same read name and flags, which may lead to invalid SAM/BAM output.
-     * Callers of this method should make sure to deal with this issue.
-     */
-    public static void makeReadUnmapped(final SAMRecord rec) {
-        if (rec.getReadNegativeStrandFlag()) {
-            SAMRecordUtil.reverseComplement(rec);
-            rec.setReadNegativeStrandFlag(false);
-        }
-        rec.setDuplicateReadFlag(false);
-        rec.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-        rec.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
-        rec.setCigarString(SAMRecord.NO_ALIGNMENT_CIGAR);
-        rec.setMappingQuality(SAMRecord.NO_MAPPING_QUALITY);
-        rec.setInferredInsertSize(0);
-        rec.setNotPrimaryAlignmentFlag(false);
-        rec.setSupplementaryAlignmentFlag(false);
-        rec.setProperPairFlag(false);
-        rec.setReadUnmappedFlag(true);
-    }
-
-    /**
-     * Strip mapping information from a SAMRecord, but preserve it in the 'O' tags if it isn't already set.
-     */
-    public static void makeReadUnmappedWithOriginalTags(final SAMRecord rec) {
-        if (!hasOriginalMappingInformation(rec)) {
-            rec.setAttribute(SAMTag.OP.name(), rec.getAlignmentStart());
-            rec.setAttribute(SAMTag.OC.name(), rec.getCigarString());
-            rec.setAttribute(SAMTag.OF.name(), rec.getFlags());
-            rec.setAttribute(SAMTag.OR.name(), rec.getReferenceName());
-        }
-        makeReadUnmapped(rec);
-    }
-
-    /**
-     * See if any tags pertaining to original mapping information have been set.
-     */
-    public static boolean hasOriginalMappingInformation(final SAMRecord rec) {
-        return rec.getAttribute(SAMTag.OP.name()) != null
-                || rec.getAttribute(SAMTag.OC.name()) != null
-                || rec.getAttribute(SAMTag.OF.name()) != null
-                || rec.getAttribute(SAMTag.OR.name()) != null;
-    }
-
-    /**
-     * Determines if a cigar has any element that both consumes read bases and consumes reference bases
-     * (e.g. is not all soft-clipped)
-     */
-    public static boolean cigarMapsNoBasesToRef(final Cigar cigar) {
-        for (final CigarElement el : cigar.getCigarElements()) {
-            if (el.getOperator().consumesReadBases() && el.getOperator().consumesReferenceBases()) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Tests if the provided record is mapped entirely beyond the end of the reference (i.e., the alignment start is greater than the
-     * length of the sequence to which the record is mapped).
-     * @param record must not have a null SamFileHeader
-     */
-    public static boolean recordMapsEntirelyBeyondEndOfReference(final SAMRecord record) {
-        if (record.getHeader() == null) {
-            throw new SAMException("A non-null SAMHeader is required to resolve the mapping position: " + record.getReadName());
-        }
-        else {
-            return record.getHeader().getSequence(record.getReferenceIndex()).getSequenceLength() < record.getAlignmentStart();
-        }
-    }
-
-    /**
-     * @return negative if mapq1 < mapq2, etc.
-     * Note that MAPQ(0) < MAPQ(255) < MAPQ(1)
-     */
-    public static int compareMapqs(final int mapq1, final int mapq2) {
-        if (mapq1 == mapq2) return 0;
-        if (mapq1 == 0) return -1;
-        else if (mapq2 == 0) return 1;
-        else if (mapq1 == 255) return -1;
-        else if (mapq2 == 255) return 1;
-        else return mapq1 - mapq2;
-    }
-
-
-    /**
-     * Hokey algorithm for combining two MAPQs into values that are comparable, being cognizant of the fact
-     * that in MAPQ world, 1 > 255 > 0. In this algorithm, 255 is treated as if it were 0.01, so that
-     * CombinedMapq(1,0) > CombinedMapq(255, 255) > CombinedMapq(0, 0).
-     * The return value should not be used for anything other than comparing to the return value of other
-     * invocations of this method.
-     */
-    public static int combineMapqs(int m1, int m2) {
-        if (m1 == 255) m1 = 1;
-        else m1 *= 100;
-
-        if (m2 == 255) m2 = 1;
-        else m2 *= 100;
-
-        return m1 + m2;
-
-    }
-
-    /**
-     * Returns the virtual file offset of the first record in a BAM file - i.e. the virtual file
-     * offset after skipping over the text header and the sequence records.
-     */
-    public static long findVirtualOffsetOfFirstRecordInBam(final File bamFile) {
-        try {
-            return BAMFileReader.findVirtualOffsetOfFirstRecord(bamFile);
-        } catch (final IOException ioe) {
-            throw new RuntimeEOFException(ioe);
-        }
-    }
-
-    /**
-     * Given a Cigar, Returns blocks of the sequence that have been aligned directly to the
-     * reference sequence. Note that clipped portions, and inserted and deleted bases (vs. the reference)
-     * are not represented in the alignment blocks.
-     *
-     * @param cigar The cigar containing the alignment information
-     * @param alignmentStart The start (1-based) of the alignment
-     * @param cigarTypeName The type of cigar passed - for error logging.
-     * @return List of alignment blocks
-     */
-    public static List<AlignmentBlock> getAlignmentBlocks(final Cigar cigar, final int alignmentStart, final String cigarTypeName) {
-        if (cigar == null) return Collections.emptyList();
-
-        final List<AlignmentBlock> alignmentBlocks = new ArrayList<AlignmentBlock>();
-        int readBase = 1;
-        int refBase = alignmentStart;
-
-        for (final CigarElement e : cigar.getCigarElements()) {
-            switch (e.getOperator()) {
-                case H:
-                    break; // ignore hard clips
-                case P:
-                    break; // ignore pads
-                case S:
-                    readBase += e.getLength();
-                    break; // soft clip read bases
-                case N:
-                    refBase += e.getLength();
-                    break;  // reference skip
-                case D:
-                    refBase += e.getLength();
-                    break;
-                case I:
-                    readBase += e.getLength();
-                    break;
-                case M:
-                case EQ:
-                case X:
-                    final int length = e.getLength();
-                    alignmentBlocks.add(new AlignmentBlock(readBase, refBase, length));
-                    readBase += length;
-                    refBase += length;
-                    break;
-                default:
-                    throw new IllegalStateException("Case statement didn't deal with " + cigarTypeName + " op: " + e.getOperator());
-            }
-        }
-        return Collections.unmodifiableList(alignmentBlocks);
-    }
-
-    /**
-     * @param alignmentStart The start (1-based) of the alignment
-     * @param cigar The cigar containing the alignment information
-     * @return the alignment start (1-based, inclusive) adjusted for clipped bases.  For example if the read
-     * has an alignment start of 100 but the first 4 bases were clipped (hard or soft clipped)
-     * then this method will return 96.
-     * <p/>
-     * Invalid to call on an unmapped read.
-     * Invalid to call with cigar = null
-     */
-    public static int getUnclippedStart(final int alignmentStart, final Cigar cigar) {
-        int unClippedStart = alignmentStart;
-        for (final CigarElement cig : cigar.getCigarElements()) {
-            final CigarOperator op = cig.getOperator();
-            if (op == CigarOperator.SOFT_CLIP || op == CigarOperator.HARD_CLIP) {
-                unClippedStart -= cig.getLength();
-            } else {
-                break;
-            }
-        }
-
-        return unClippedStart;
-    }
-
-    /**
-     * @param alignmentEnd The end (1-based) of the alignment
-     * @param cigar The cigar containing the alignment information
-     * @return the alignment end (1-based, inclusive) adjusted for clipped bases.  For example if the read
-     * has an alignment end of 100 but the last 7 bases were clipped (hard or soft clipped)
-     * then this method will return 107.
-     * <p/>
-     * Invalid to call on an unmapped read.
-     * Invalid to call with cigar = null
-     */
-    public static int getUnclippedEnd(final int alignmentEnd, final Cigar cigar) {
-        int unClippedEnd = alignmentEnd;
-        final List<CigarElement> cigs = cigar.getCigarElements();
-        for (int i = cigs.size() - 1; i >= 0; --i) {
-            final CigarElement cig = cigs.get(i);
-            final CigarOperator op = cig.getOperator();
-
-            if (op == CigarOperator.SOFT_CLIP || op == CigarOperator.HARD_CLIP) {
-                unClippedEnd += cig.getLength();
-            } else {
-                break;
-            }
-        }
-
-        return unClippedEnd;
-    }
-
-    /**
-     * Returns the Mate Cigar String as stored in the attribute 'MC'.
-     *
-     * @param rec the SAM record
-     * @return Mate Cigar String, or null if there is none.
-     */
-    public static String getMateCigarString(final SAMRecord rec) {
-        return rec.getStringAttribute(SAMTag.MC.name());
-    }
-
-    /**
-     * Returns the Mate Cigar or null if there is none.
-     *
-     * @param rec the SAM record
-     * @param withValidation true if we are to validate the mate cigar before returning, false otherwise.
-     * @return Cigar object for the read's mate, or null if there is none.
-     */
-    public static Cigar getMateCigar(final SAMRecord rec, final boolean withValidation) {
-        final String mateCigarString = getMateCigarString(rec);
-        Cigar mateCigar = null;
-        if (mateCigarString != null) {
-            mateCigar = TextCigarCodec.decode(mateCigarString);
-            if (withValidation && rec.getValidationStringency() != ValidationStringency.SILENT) {
-                final List<AlignmentBlock> alignmentBlocks = getAlignmentBlocks(mateCigar, rec.getMateAlignmentStart(), "mate cigar");
-                SAMUtils.processValidationErrors(validateCigar(rec, mateCigar, rec.getMateReferenceIndex(), alignmentBlocks, -1, "Mate CIGAR"), -1L, rec.getValidationStringency());
-            }
-        }
-        return mateCigar;
-    }
-
-    /**
-     * Returns the Mate Cigar or null if there is none.  No validation is done on the returned cigar.
-     *
-     * @param rec the SAM record
-     * @return Cigar object for the read's mate, or null if there is none.
-     */
-    public static Cigar getMateCigar(final SAMRecord rec) {
-        return getMateCigar(rec, false);
-    }
-
-    /**
-     * @param rec the SAM record
-     * @return number of cigar elements (number + operator) in the mate cigar string.
-     */
-    public static int getMateCigarLength(final SAMRecord rec) {
-        final Cigar mateCigar = getMateCigar(rec);
-        return (mateCigar != null) ? mateCigar.numCigarElements() : 0;
-    }
-
-    /**
-     * This method uses the MateCigar value as determined from the attribute MC.  It must be non-null.
-     *
-     * @param rec the SAM record
-     * @return 1-based inclusive rightmost position of the clipped mate sequence, or 0 read if unmapped.
-     */
-    public static int getMateAlignmentEnd(final SAMRecord rec) {
-        if (rec.getMateUnmappedFlag()) {
-            throw new RuntimeException("getMateAlignmentEnd called on an unmapped mate.");
-        }
-        final Cigar mateCigar = SAMUtils.getMateCigar(rec);
-        if (mateCigar == null) {
-            throw new SAMException("Mate CIGAR (Tag MC) not found.");
-        }
-        return CoordMath.getEnd(rec.getMateAlignmentStart(), mateCigar.getReferenceLength());
-    }
-
-    /**
-     * @param rec the SAM record
-     * @return the mate alignment start (1-based, inclusive) adjusted for clipped bases.  For example if the mate
-     * has an alignment start of 100 but the first 4 bases were clipped (hard or soft clipped)
-     * then this method will return 96.
-     * <p/>
-     * Invalid to call on an unmapped read.
-     */
-    public static int getMateUnclippedStart(final SAMRecord rec) {
-        if (rec.getMateUnmappedFlag())
-            throw new RuntimeException("getMateUnclippedStart called on an unmapped mate.");
-        final Cigar mateCigar = getMateCigar(rec);
-        if (mateCigar == null) {
-            throw new SAMException("Mate CIGAR (Tag MC) not found.");
-        }
-        return SAMUtils.getUnclippedStart(rec.getMateAlignmentStart(), mateCigar);
-    }
-
-
-    /**
-     * @param rec the SAM record
-     * @return the mate alignment end (1-based, inclusive) adjusted for clipped bases.  For example if the mate
-     * has an alignment end of 100 but the last 7 bases were clipped (hard or soft clipped)
-     * then this method will return 107.
-     * <p/>
-     * Invalid to call on an unmapped read.
-     */
-    public static int getMateUnclippedEnd(final SAMRecord rec) {
-        if (rec.getMateUnmappedFlag()) {
-            throw new RuntimeException("getMateUnclippedEnd called on an unmapped mate.");
-        }
-        final Cigar mateCigar = SAMUtils.getMateCigar(rec);
-        if (mateCigar == null) {
-            throw new SAMException("Mate CIGAR (Tag MC) not found.");
-        }
-        return SAMUtils.getUnclippedEnd(getMateAlignmentEnd(rec), mateCigar);
-    }
-
-    /**
-     * @param rec the SAM record
-     * Returns blocks of the mate sequence that have been aligned directly to the
-     * reference sequence. Note that clipped portions of the mate and inserted and
-     * deleted bases (vs. the reference) are not represented in the alignment blocks.
-     */
-    public static List<AlignmentBlock> getMateAlignmentBlocks(final SAMRecord rec) {
-        return getAlignmentBlocks(getMateCigar(rec), rec.getMateAlignmentStart(), "mate cigar");
-    }
-
-    /**
-     * Run all validations of the mate's CIGAR.  These include validation that the CIGAR makes sense independent of
-     * placement, plus validation that CIGAR + placement yields all bases with M operator within the range of the reference.
-     *
-     * @param rec the SAM record
-     * @param cigar The cigar containing the alignment information
-     * @param referenceIndex The reference index
-     * @param alignmentBlocks The alignment blocks (parsed from the cigar)
-     * @param recordNumber For error reporting.  -1 if not known.
-     * @param cigarTypeName For error reporting.  "Read CIGAR" or "Mate Cigar"
-     * @return List of errors, or null if no errors.
-     */
-
-    public static List<SAMValidationError> validateCigar(final SAMRecord rec,
-                                                         final Cigar cigar,
-                                                         final Integer referenceIndex,
-                                                         final List<AlignmentBlock> alignmentBlocks,
-                                                         final long recordNumber,
-                                                         final String cigarTypeName) {
-        // Don't know line number, and don't want to force read name to be decoded.
-        List<SAMValidationError> ret = cigar.isValid(rec.getReadName(), recordNumber);
-        if (referenceIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-            SAMFileHeader samHeader = rec.getHeader();
-            if (null == samHeader) {
-                if (ret == null) ret = new ArrayList<SAMValidationError>();
-                ret.add(new SAMValidationError(SAMValidationError.Type.MISSING_HEADER,
-                        cigarTypeName + " A non-null SAMHeader is required to validate cigar elements for: ", rec.getReadName(), recordNumber));
-            }
-            else {
-                final SAMSequenceRecord sequence = samHeader.getSequence(referenceIndex);
-                final int referenceSequenceLength = sequence.getSequenceLength();
-                for (final AlignmentBlock alignmentBlock : alignmentBlocks) {
-                    if (alignmentBlock.getReferenceStart() + alignmentBlock.getLength() - 1 > referenceSequenceLength) {
-                        if (ret == null) ret = new ArrayList<SAMValidationError>();
-                        ret.add(new SAMValidationError(SAMValidationError.Type.CIGAR_MAPS_OFF_REFERENCE,
-                                cigarTypeName + " M operator maps off end of reference", rec.getReadName(), recordNumber));
-                        break;
-                    }
-                }
-            }
-        }
-        return ret;
-    }
-
-    /**
-     * Run all validations of the mate's CIGAR.  These include validation that the CIGAR makes sense independent of
-     * placement, plus validation that CIGAR + placement yields all bases with M operator within the range of the reference.
-     *
-     * @param rec the SAM record
-     * @param recordNumber For error reporting.  -1 if not known.
-     * @return List of errors, or null if no errors.
-     */
-    public static List<SAMValidationError> validateMateCigar(final SAMRecord rec, final long recordNumber) {
-        List<SAMValidationError> ret = null;
-
-        if (rec.getValidationStringency() != ValidationStringency.SILENT) {
-            if (rec.getReadPairedFlag() && !rec.getMateUnmappedFlag()) {      // The mateCigar will be defined if the mate is mapped
-                if (getMateCigarString(rec) != null) {
-                    ret = SAMUtils.validateCigar(rec, getMateCigar(rec), rec.getMateReferenceIndex(), getMateAlignmentBlocks(rec), recordNumber, "Mate CIGAR");
-                }
-            } else {
-                if (getMateCigarString(rec) != null) {
-                    ret = new ArrayList<SAMValidationError>();
-                    if (!rec.getReadPairedFlag()) {
-                        // If the read is not paired, and the Mate Cigar String (MC Attribute) exists, that is a validation error
-                        ret.add(new SAMValidationError(SAMValidationError.Type.MATE_CIGAR_STRING_INVALID_PRESENCE,
-                                "Mate CIGAR String (MC Attribute) present for a read that is not paired", rec.getReadName(), recordNumber));
-                    } else { // will hit here if rec.getMateUnmappedFlag() is true
-                        // If the Mate is unmapped, and the Mate Cigar String (MC Attribute) exists, that is a validation error.
-                        ret.add(new SAMValidationError(SAMValidationError.Type.MATE_CIGAR_STRING_INVALID_PRESENCE,
-                                "Mate CIGAR String (MC Attribute) present for a read whose mate is unmapped", rec.getReadName(), recordNumber));
-                    }
-                }
-            }
-        }
-
-        return ret;
-    }
-
-    /**
-     * Checks to see if it is valid for this record to have a mate CIGAR (MC) and then if there is a mate CIGAR available.  This is done by
-     * checking that this record is paired, its mate is mapped, and that it returns a non-null mate CIGAR.
-     *
-     * @param rec
-     * @return
-     */
-    public static boolean hasMateCigar(SAMRecord rec) {
-        // NB: use getMateCigarString rather than getMateCigar to avoid validation.
-        return (rec.getReadPairedFlag() && !rec.getMateUnmappedFlag() && null != SAMUtils.getMateCigarString(rec));
-    }
-
-    /**
-     * Returns a string that is the the read group ID and read name separated by a colon.  This is meant to cannonically
-     * identify a given record within a set of records.
-     *
-     * @param record
-     * @return
-     */
-    public static String getCanonicalRecordName(final SAMRecord record) {
-        String name = record.getStringAttribute(ReservedTagConstants.READ_GROUP_ID);
-        if (null == name) name = record.getReadName();
-        else name = name + ":" + record.getReadName();
-        return name;
-    }
-
-    /**
-     * Returns the number of bases that need to be clipped due to overlapping pairs.  If the record is not paired,
-     * or the given record's start position is greater than its mate's start position, zero is automatically returned.
-     * NB: This method assumes that the record's mate is not contained within the given record's alignment.
-     *
-     * @param rec
-     * @return the number of bases at the end of the read that need to be clipped such that there would be no overlapping bases with its mate.
-     * Read bases include only those from insertion, match, or mismatch Cigar operators.
-     */
-    public static int getNumOverlappingAlignedBasesToClip(final SAMRecord rec) {
-        // NB: ignores how to handle supplemental records when present for both ends by just using the mate information in the record.
-
-        if (!rec.getReadPairedFlag() || rec.getReadUnmappedFlag() || rec.getMateUnmappedFlag()) return 0;
-
-        // Only clip records that are left-most in genomic order and overlapping.
-        if (rec.getMateAlignmentStart() < rec.getAlignmentStart()) return 0; // right-most, so ignore.
-        else if (rec.getMateAlignmentStart() == rec.getAlignmentStart() && rec.getFirstOfPairFlag()) return 0; // same start, so pick the first end
-
-        // Find the number of read bases after the given mate's alignment start.
-        int numBasesToClip = 0;
-        final int refStartPos = rec.getMateAlignmentStart(); // relative reference position after which we should start clipping
-        final Cigar cigar = rec.getCigar();
-        int refPos = rec.getAlignmentStart();
-        for (final CigarElement el : cigar.getCigarElements()) {
-            final CigarOperator operator = el.getOperator();
-            final int refBasesLength = operator.consumesReferenceBases() ? el.getLength() : 0;
-            if (refStartPos <= refPos + refBasesLength - 1) { // add to clipped bases
-                if (operator == CigarOperator.MATCH_OR_MISMATCH) { // M
-                    if (refStartPos < refPos) numBasesToClip += refBasesLength; // use all of the bases
-                    else numBasesToClip += (refPos + refBasesLength) - refStartPos;  // since the mate's alignment start can be in the middle of a cigar element
-                }
-                else if (operator == CigarOperator.SOFT_CLIP || operator == CigarOperator.HARD_CLIP || operator == CigarOperator.PADDING || operator == CigarOperator.SKIPPED_REGION) {
-                    // ignore
-                }
-                else { // ID
-                    numBasesToClip += operator.consumesReadBases() ? el.getLength() : 0; // clip all the bases in the read from this operator
-                }
-            }
-            refPos += refBasesLength;
-        }
-
-        if (numBasesToClip < 0) return 0; // left-most but not overlapping
-
-        return numBasesToClip;
-    }
-
-    /**
-     * Returns a (possibly new) record that has been clipped if isa  mapped paired and has overlapping bases with its mate.
-     * See {@link #getNumOverlappingAlignedBasesToClip(SAMRecord)} for how the number of overlapping bases is computed.
-     * NB: this does not properly consider a cigar like: 100M20S10H.
-     * NB: This method assumes that the record's mate is not contained within the given record's alignment.
-     *
-     * @param record the record from which to clip bases.
-     * @param noSideEffects if true a modified clone of the original record is returned, otherwise we modify the record directly.
-     * @return
-     */
-    public static SAMRecord clipOverlappingAlignedBases(final SAMRecord record, final boolean noSideEffects) {
-        return clipOverlappingAlignedBases(record, getNumOverlappingAlignedBasesToClip(record), noSideEffects);
-    }
-
-    /**
-     * Returns a (possibly new) SAMRecord with the given number of bases soft-clipped at the end of the read if is a mapped
-     * paired and has overlapping bases with its mate.
-     * NB: this does not properly consider a cigar like: 100M20S10H.
-     * NB: This method assumes that the record's mate is not contained within the given record's alignment.
-     *
-     * @param record the record from which to clip bases.
-     * @param numOverlappingBasesToClip the number of bases to clip at the end of the read.
-     * @param noSideEffects if true a modified clone of the original record is returned, otherwise we modify the record directly.
-     * @return
-     */
-    public static SAMRecord clipOverlappingAlignedBases(final SAMRecord record, final int numOverlappingBasesToClip, final boolean noSideEffects) {
-        // NB: ignores how to handle supplemental records when present for both ends by just using the mate information in the record.
-
-        if (numOverlappingBasesToClip <= 0 || record.getReadUnmappedFlag() || record.getMateUnmappedFlag()) return record;
-
-        try {
-            final SAMRecord rec = noSideEffects ? ((SAMRecord)record.clone()) : record;
-
-            // watch out for when the second read overlaps all of the first read
-            if (rec.getMateAlignmentStart() <= rec.getAlignmentStart()) { // make it unmapped
-                rec.setReadUnmappedFlag(true);
-                return rec;
-            }
-
-            // 1-based index of first base in read to clip.
-            int clipFrom = rec.getReadLength() - numOverlappingBasesToClip + 1;
-            // we have to check if the last cigar element is soft-clipping, so we can subtract that from clipFrom
-            final CigarElement cigarElement = rec.getCigar().getCigarElement(rec.getCigarLength()-1);
-            if (CigarOperator.SOFT_CLIP == cigarElement.getOperator()) clipFrom -= cigarElement.getLength();
-            // FIXME: does not properly consider a cigar like: 100M20S10H
-
-            // clip it, clip it good
-            rec.setCigar(new Cigar(CigarUtil.softClipEndOfRead(clipFrom, rec.getCigar().getCigarElements())));
-            return rec;
-        } catch (final CloneNotSupportedException e) {
-            throw new SAMException(e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Checks if a long attribute value is within the allowed range of a 32-bit unsigned integer.
-     *
-     * @param value a long value to check
-     * @return true if value is >= 0 and <= {@link BinaryCodec#MAX_UINT}, and false otherwise
-     */
-    public static boolean isValidUnsignedIntegerAttribute(long value) {
-        return value >= 0 && value <= BinaryCodec.MAX_UINT;
-    }
-
-    /**
-     * Extract a List of 'other canonical alignments' from a SAM record. Those alignments are stored as a string in the 'SA' tag as defined
-     * in the SAM specification.
-     * The name, sequence and qualities, mate data are copied from the original record.
-     * @param record must be non null and must have a non-null associated header.
-     * @return a list of 'other canonical alignments' SAMRecords. The list is empty if the 'SA' attribute is missing.
-     */
-    public static List<SAMRecord> getOtherCanonicalAlignments(final SAMRecord record) {
-        if( record == null ) throw new IllegalArgumentException("record is null");
-        if( record.getHeader() == null ) throw new IllegalArgumentException("record.getHeader() is null");
-        /* extract value of SA tag */
-        final Object saValue = record.getAttribute( SAMTagUtil.getSingleton().SA );
-        if( saValue == null ) return Collections.emptyList();
-        if( ! (saValue instanceof String) ) throw new SAMException(
-                "Expected a String for attribute 'SA' but got " + saValue.getClass() );
-
-        final SAMRecordFactory samReaderFactory = new DefaultSAMRecordFactory();
-
-        /* the spec says: "Other canonical alignments in a chimeric alignment, formatted as a
-         * semicolon-delimited list: (rname,pos,strand,CIGAR,mapQ,NM;)+.
-         * Each element in the list represents a part of the chimeric alignment.
-         * Conventionally, at a supplementary line, the  1rst element points to the primary line.
-         */
-
-        /* break string using semicolon */
-        final String semiColonStrs[] = SEMICOLON_PAT.split((String)saValue);
-
-        /* the result list */
-        final List<SAMRecord> alignments = new ArrayList<>( semiColonStrs.length );
-
-        /* base SAM flag */
-        int record_flag = record.getFlags() ;
-        record_flag &= ~SAMFlag.PROPER_PAIR.flag;
-        record_flag &= ~SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag;
-        record_flag &= ~SAMFlag.READ_REVERSE_STRAND.flag;
-
-
-        for(int i=0; i< semiColonStrs.length;++i  ) {
-            final String semiColonStr = semiColonStrs[i];
-            /* ignore empty string */
-            if( semiColonStr.isEmpty() ) continue;
-
-            /* break string using comma */
-            final String commaStrs[] = COMMA_PAT.split(semiColonStr);
-            if( commaStrs.length != 6 )  throw new SAMException("Bad 'SA' attribute in " + semiColonStr);
-
-            /* create the new record */
-            final SAMRecord otherRec = samReaderFactory.createSAMRecord( record.getHeader() );
-
-            /* copy fields from the original record */
-            otherRec.setReadName( record.getReadName() );
-            otherRec.setReadBases( record.getReadBases() );
-            otherRec.setBaseQualities( record.getBaseQualities() );
-            if( record.getReadPairedFlag() && !record.getMateUnmappedFlag()) {
-                otherRec.setMateReferenceIndex( record.getMateReferenceIndex() );
-                otherRec.setMateAlignmentStart( record.getMateAlignmentStart() );
-            }
-
-
-            /* get reference sequence */
-            final int tid = record.getHeader().getSequenceIndex( commaStrs[0] );
-            if( tid == -1 ) throw new SAMException("Unknown contig in " + semiColonStr);
-            otherRec.setReferenceIndex( tid );
-
-            /* fill POS */
-            final int alignStart;
-            try {
-                alignStart = Integer.parseInt(commaStrs[1]);
-            } catch( final NumberFormatException err ) {
-                throw new SAMException("bad POS in "+semiColonStr, err);
-            }
-
-            otherRec.setAlignmentStart( alignStart );
-
-            /* set TLEN */
-            if( record.getReadPairedFlag() &&
-                !record.getMateUnmappedFlag() &&
-                record.getMateReferenceIndex() == tid ) {
-                otherRec.setInferredInsertSize( record.getMateAlignmentStart() - alignStart );
-            }
-
-            /* set FLAG */
-           int other_flag = record_flag;
-           other_flag |= (commaStrs[2].equals("+") ? 0 : SAMFlag.READ_REVERSE_STRAND.flag) ;
-           /* spec: Conventionally, at a supplementary line, the  1st element points to the primary line */
-           if( !( record.getSupplementaryAlignmentFlag() && i==0 ) ) {
-               other_flag |= SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag;
-           }
-           otherRec.setFlags(other_flag);
-
-           /* set CIGAR */
-           otherRec.setCigar( TextCigarCodec.decode( commaStrs[3] ) );
-
-            /* set MAPQ */
-            try {
-                otherRec.setMappingQuality( Integer.parseInt(commaStrs[4]) );
-            } catch (final NumberFormatException err) {
-                throw new SAMException("bad MAPQ in "+semiColonStr, err);
-            }
-
-            /* fill NM */
-            try {
-                if (!commaStrs[5].equals("*")) {
-                    otherRec.setAttribute(SAMTagUtil.getSingleton().NM, Integer.parseInt(commaStrs[5]));
-                }
-            } catch (final NumberFormatException err) {
-                throw new SAMException("bad NM in "+semiColonStr, err);
-            }
-
-            /* if strand is not the same: reverse-complement */
-            if( otherRec.getReadNegativeStrandFlag() != record.getReadNegativeStrandFlag() ) {
-                SAMRecordUtil.reverseComplement(otherRec);
-            }
-
-            /* add the alignment */
-            alignments.add( otherRec );
-        }
-        return alignments;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMValidationError.java b/src/main/java/htsjdk/samtools/SAMValidationError.java
deleted file mode 100644
index d560b11..0000000
--- a/src/main/java/htsjdk/samtools/SAMValidationError.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-
-/**
- * Class that encapsulates a validation error message as well as a type code so that
- * errors can be aggregated by type.
- *
- * @author Doug Voet
- */
-public class SAMValidationError implements Serializable {
-    public static final long serialVersionUID = 1L;
-
-    public enum Severity {
-        WARNING, ERROR
-    }
-
-    public enum Type {
-        /** quality encodings out of range; appear to be Solexa or Illumina when Phread expected */
-        INVALID_QUALITY_FORMAT(Severity.WARNING),
-
-        /** proper pair flag set for unpaired read */
-        INVALID_FLAG_PROPER_PAIR,
-
-        /** mate unmapped flag set when mate is mapped or not set when mate is not mapped */
-        INVALID_FLAG_MATE_UNMAPPED,
-
-        /** mate unmapped flag does not match read unmapped flag of mate */
-        MISMATCH_FLAG_MATE_UNMAPPED,
-
-        /** mate negative strand flag set for unpaired read */
-        INVALID_FLAG_MATE_NEG_STRAND,
-
-        /** mate negative strand flag does not match read negative strand flag of mate */
-        MISMATCH_FLAG_MATE_NEG_STRAND,
-
-        /** first of pair flag set for unpaired read */
-        INVALID_FLAG_FIRST_OF_PAIR,
-
-        /** second of pair flag set for unpaired read */
-        INVALID_FLAG_SECOND_OF_PAIR,
-
-        /** pair flag set but not marked as first or second of pair */
-        PAIRED_READ_NOT_MARKED_AS_FIRST_OR_SECOND(Severity.WARNING),
-
-        /** not primary alignment flag set for unmapped read */
-        INVALID_FLAG_NOT_PRIM_ALIGNMENT,
-
-        /** supplementary alignment flag set for unmapped read */
-        INVALID_FLAG_SUPPLEMENTARY_ALIGNMENT,
-
-        /** mapped read flat not set for mapped read */
-        INVALID_FLAG_READ_UNMAPPED,
-
-        /**
-         * inferred insert size is out of range
-         * @see SAMRecord#MAX_INSERT_SIZE
-         */
-        INVALID_INSERT_SIZE,
-
-        /** mapping quality set for unmapped read or is >= 256 */
-        INVALID_MAPPING_QUALITY,
-
-        /** CIGAR string is empty for mapped read or not empty of unmapped read, or other CIGAR badness. */
-        INVALID_CIGAR,
-
-        /** CIGAR string contains I followed by D, or vice versa */
-        ADJACENT_INDEL_IN_CIGAR(Severity.WARNING),
-
-        /** mate reference index (MRNM) set for unpaired read */
-        INVALID_MATE_REF_INDEX,
-
-        /** mate reference index (MRNM) does not match reference index of mate */
-        MISMATCH_MATE_REF_INDEX,
-
-        /** reference index not found in sequence dictionary */
-        INVALID_REFERENCE_INDEX,
-
-        /** alignment start is can not be correct */
-        INVALID_ALIGNMENT_START,
-
-        /** mate alignment does not match alignment start of mate */
-        MISMATCH_MATE_ALIGNMENT_START,
-
-        /** the record's mate fields do not match the corresponding fields of the mate */
-        MATE_FIELD_MISMATCH,
-
-        /** the NM tag (nucleotide differences) is incorrect */
-        INVALID_TAG_NM,
-
-        /** the NM tag (nucleotide differences) is missing */
-        MISSING_TAG_NM(Severity.WARNING),
-
-        /** the sam/bam file is missing the header */
-        MISSING_HEADER,
-
-        /** there is no sequence dictionary in the header */
-        MISSING_SEQUENCE_DICTIONARY,
-
-        /** the header is missing read group information */
-        MISSING_READ_GROUP,
-
-        /** the record is out of order */
-        RECORD_OUT_OF_ORDER,
-
-        /** A read group ID on a SAMRecord is not found in the header */
-        READ_GROUP_NOT_FOUND,
-
-        /** A SAMRecord is found with no read group id */
-        RECORD_MISSING_READ_GROUP(Severity.WARNING),
-
-        /** Indexing bin set on SAMRecord does not agree with computed value. */
-        INVALID_INDEXING_BIN,
-
-        MISSING_VERSION_NUMBER,
-
-        INVALID_VERSION_NUMBER,
-
-        TRUNCATED_FILE,
-
-        MISMATCH_READ_LENGTH_AND_QUALS_LENGTH,
-
-        EMPTY_READ,
-
-        /**
-         * Bases corresponding to M operator in CIGAR are beyond the end of the reference.
-         */
-        CIGAR_MAPS_OFF_REFERENCE,
-
-        /** Length of E2 (secondary base calls) and U2 (secondary base quals) tag values should match read length */
-        MISMATCH_READ_LENGTH_AND_E2_LENGTH,
-        MISMATCH_READ_LENGTH_AND_U2_LENGTH,
-
-        /** Secondary base calls should not be the same as primary, unless one or the other is N */
-        E2_BASE_EQUALS_PRIMARY_BASE(Severity.WARNING),
-
-        /** BAM appears to be healthy, but is an older file so doesn't have terminator block. */
-        BAM_FILE_MISSING_TERMINATOR_BLOCK(Severity.WARNING),
-
-        /** Header record is not one of the standard types */
-        UNRECOGNIZED_HEADER_TYPE,
-
-        /** Header tag does not have colon */
-        POORLY_FORMATTED_HEADER_TAG,
-
-        /** Header tag appears more than once in header line with different value */
-        HEADER_TAG_MULTIPLY_DEFINED,
-
-        HEADER_RECORD_MISSING_REQUIRED_TAG,
-
-        /** Date string is not ISO-8601 */
-        INVALID_DATE_STRING(Severity.WARNING),
-
-        /** Unsigned integer tag value is deprecated in BAM. */
-        TAG_VALUE_TOO_LARGE,
-
-        /** Invalid virtualFilePointer in index */
-        INVALID_INDEX_FILE_POINTER,
-
-        /** PI tag value is not numeric. */
-        INVALID_PREDICTED_MEDIAN_INSERT_SIZE,
-
-        /** Same read group id appears more than once */
-        DUPLICATE_READ_GROUP_ID,
-
-        /** The read group is missing its PL (platform unit) field */
-        MISSING_PLATFORM_VALUE,
-
-        /** The read group has an invalid value set for its PL field */
-        INVALID_PLATFORM_VALUE,
-
-        /** Same program group id appears more than once */
-        DUPLICATE_PROGRAM_GROUP_ID,
-
-        /** Read is marked as paired, but its pair was not found.  */
-        MATE_NOT_FOUND,
-
-        /** Both mates are marked as first of pair, or both mates are marked as second of pair. */
-        MATES_ARE_SAME_END,
-
-        /** The Cigar String in the MC Tag does not match the Cigar String for the mate of this read. */
-        MISMATCH_MATE_CIGAR_STRING,
-
-        /** There is a Cigar String (stored in the MC Tag) for a read whose mate is NOT mapped. */
-        MATE_CIGAR_STRING_INVALID_PRESENCE;
-
-        public final Severity severity;
-
-        private Type() {
-            this.severity = Severity.ERROR;
-        }
-
-        private Type(final Severity severity) {
-            this.severity = severity;
-        }
-
-        /**
-         * @return Format for writing to histogram summary output.
-         */
-        public String getHistogramString() {
-            return this.severity.name() + ":" + this.name();
-        }
-    }
-
-    private final Type type;
-    private final String message;
-    private final String readName;
-    private long recordNumber = -1;
-    private String source;
-
-    /**
-     * Construct a SAMValidationError with unknown record number.
-     * @param type
-     * @param message
-     * @param readName May be null if readName is not known.
-     */
-    public SAMValidationError(final Type type, final String message, final String readName) {
-        this.type = type;
-        this.message = message;
-        this.readName = readName;
-    }
-
-    /**
-     * Construct a SAMValidationError with possibly-known record number.
-     * @param type
-     * @param message
-     * @param readName May be null if readName is not known.
-     * @param recordNumber Position of the record in the SAM file it has been read from.  -1 if not known.
-     */
-    public SAMValidationError(final Type type, final String message, final String readName, final long recordNumber) {
-        this(type, message, readName);
-        this.recordNumber = recordNumber;
-    }
-
-    public String toString() {
-        final StringBuilder builder = new StringBuilder();
-        builder.append(type.severity.toString()).append(": ");
-        if (source != null) {
-            builder.append("File ").append(source.toString()).append(", ");
-        }
-        if (recordNumber > 0) {
-            builder.append("Record ").append(recordNumber).append(", ");
-        }
-        if (readName != null) {
-            builder.append("Read name ").append(readName).append(", ");
-        }
-        return builder.append(message).toString();
-    }
-
-    public Type getType() { return type; }
-    public String getMessage() { return message; }
-
-    /** may be null */
-    public String getReadName() { return readName; }
-
-    /** 1-based.  -1 if not known. */
-    public long getRecordNumber() { return recordNumber; }
-
-    public void setRecordNumber(final long recordNumber) { this.recordNumber = recordNumber; }
-
-    public String getSource() {
-        return source;
-    }
-
-    public void setSource(final String source) {
-        this.source = source;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SQTagUtil.java b/src/main/java/htsjdk/samtools/SQTagUtil.java
deleted file mode 100644
index daee4c3..0000000
--- a/src/main/java/htsjdk/samtools/SQTagUtil.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Utility methods for encoding and decoding the SQ tag value of SAMRecord.
- * 
- * @author alecw at broadinstitute.org
- */
-public class SQTagUtil {
-    /**
-     * The ordinals of these are stored in the high-order 2 bits of each byte of the SQ tag.
-     * Note that these have the convenient property that the binary complement of each ordinal, masked to
-     * the two low-order bits, is the complementary base.
-     */
-    public enum SQBase {
-        SQ_A('A'), SQ_C('C'), SQ_G('G'), SQ_T('T');
-        private final Character base;
-
-        SQBase(final Character base) {
-            this.base = base;
-        }
-
-        public Character getBase() {
-            return base;
-        }
-    }
-
-    /**
-     * For complementing SQBase ordinals.
-     */
-    private static final int COMPLEMENT_MASK = 3;
-
-    private static final int QUALITY_MASK = 0x3f;
-    public static final byte MAX_QUALITY = QUALITY_MASK;
-    private static final int BASE_INDEX_SHIFT = 6;
-
-    /**
-     * Convert a pair of likelihoods into a value suitable for passing to baseAndProbDiffToSqValue.
-     * @param secondBestLikelihood Probability of the 2nd-best base call.  1 > secondBestLikelihood > thirdBestLikelihood.
-     * @param thirdBestLikelihood Probability of the 3rd-best base call.  thirdBestLikelihood > 0.
-     * @return ratio of input probabilities for storing in SQ tag.
-     */
-    public static byte sqScaledProbabilityRatio(final double secondBestLikelihood, final double thirdBestLikelihood) {
-        if (secondBestLikelihood >= 1.0 || thirdBestLikelihood <= 0 || thirdBestLikelihood > secondBestLikelihood) {
-            throw new IllegalArgumentException("Likelihoods out of range.  second best: " + secondBestLikelihood +
-            "; third best: " + thirdBestLikelihood);
-        }
-        // Cap value at QUALITY_MASK
-        return (byte)(Math.min(Math.round(-10.0 * Math.log10(thirdBestLikelihood/secondBestLikelihood)), QUALITY_MASK));
-    }
-
-    /**
-     * Compress a base and a log probabiliy difference (-10log10(p3/p2)) into
-     * a single byte so that it can be output in a SAMRecord's SQ field.
-     *
-     * @param base  the 2nd-best base.
-     * @param probRatio   the log probability difference between the secondary and tertiary bases (-10log10(p3/p2)),
-     * rounded to an integer and capped so it fits in 6 bits.
-     * @return a byte containing the index and the log probability difference.
-     */
-    public static byte baseAndProbDiffToSqValue(final SQBase base, final byte probRatio) {
-        return baseAndProbDiffToSqValue(base.ordinal(), probRatio);
-    }
-
-    /**
-     * Compress a base and a log probabiliy difference (-10log10(p3/p2)) into
-     * a single byte so that it can be output in a SAMRecord's SQ field.
-     *
-     * @param base  the 2nd-best base (A=0, C=1, G=2, T=3).
-     * @param probRatio   the log probability difference between the secondary and tertiary bases (-10log10(p3/p2)),
-     * rounded to an integer and capped so it fits in 6 bits.  If this value is > MAX_QUALITY, it is truncated to that.
-     * @return a byte containing the index and the log probability difference.
-     */
-    public static byte baseAndProbDiffToSqValue(final int base, final byte probRatio) {
-        return (byte)((base << BASE_INDEX_SHIFT) | Math.min(probRatio, QUALITY_MASK));
-    }
-
-    /**
-     * Retrieve SQ-scaled probability ratio from SQ value.
-     * @param sqValue
-     * @return the log probability difference between the secondary and tertiary bases (-10log10(p3/p2)).
-     */
-    public static byte sqValueToProbRatio(final byte sqValue) {
-        return (byte)(sqValue & QUALITY_MASK);
-    }
-
-    /**
-     * Retrieve the 2nd-best base call from SQ value.
-     * @param sqValue
-     * @return 2nd-best base call.
-     */
-    public static SQBase sqValueToBase(final byte sqValue) {
-        return SQBase.values()[sqValueToBaseOrdinal(sqValue)];
-    }
-
-    /**
-     * Retrieve the 2nd-best base call from SQ value.
-     * @param sqValue
-     * @return Ordinal of 2nd-best base call.
-     */
-    public static int sqValueToBaseOrdinal(final byte sqValue) {
-        return (sqValue & 0xff) >>> BASE_INDEX_SHIFT;
-    }
-
-
-    /**
-     * Reverses and complements the sqValues in place.
-     * @param sqArray Array of SQ-values, with 2nd-best base in high-order 2 bits, and probability diff
-     * in low-order 6 bits.
-     */
-    public static void reverseComplementSqArray(final byte[] sqArray) {
-        final int lastIndex = sqArray.length - 1;
-
-        int i, j;
-        for (i=0, j=lastIndex; i<j; ++i, --j) {
-            final byte tmp = complementSqValue(sqArray[i]);
-            sqArray[i] = complementSqValue(sqArray[j]);
-            sqArray[j] = tmp;
-        }
-        if (sqArray.length % 2 == 1) {
-            sqArray[i] = complementSqValue(sqArray[i]);
-        }
-    }
-
-    private static byte complementSqValue(final byte sqValue) {
-        final byte probDiff = sqValueToProbRatio(sqValue);
-        final int baseOrdinal = sqValueToBaseOrdinal(sqValue);
-        final int complementOrdinal = COMPLEMENT_MASK & ~baseOrdinal;
-        return baseAndProbDiffToSqValue(complementOrdinal, probDiff);
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/SRAFileReader.java b/src/main/java/htsjdk/samtools/SRAFileReader.java
deleted file mode 100644
index e76e10b..0000000
--- a/src/main/java/htsjdk/samtools/SRAFileReader.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*===========================================================================
-*
-*                            PUBLIC DOMAIN NOTICE
-*               National Center for Biotechnology Information
-*
-*  This software/database is a "United States Government Work" under the
-*  terms of the United States Copyright Act.  It was written as part of
-*  the author's official duties as a United States Government employee and
-*  thus cannot be copyrighted.  This software/database is freely available
-*  to the public for use. The National Library of Medicine and the U.S.
-*  Government have not placed any restriction on its use or reproduction.
-*
-*  Although all reasonable efforts have been taken to ensure the accuracy
-*  and reliability of the software and data, the NLM and the U.S.
-*  Government do not and cannot warrant the performance or results that
-*  may be obtained by using this software or data. The NLM and the U.S.
-*  Government disclaim all warranties, express or implied, including
-*  warranties of performance, merchantability or fitness for any particular
-*  purpose.
-*
-*  Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-/**
- * Created by andrii.nikitiuk on 8/11/15.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.sra.ReferenceCache;
-import htsjdk.samtools.sra.SRAAccession;
-import htsjdk.samtools.util.CloseableIterator;
-
-import htsjdk.samtools.SamReader.Type;
-
-import htsjdk.samtools.util.Log;
-import ngs.ErrorMsg;
-import ngs.ReadCollection;
-import ngs.ReadGroupIterator;
-import ngs.ReferenceIterator;
-import ngs.Reference;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class SRAFileReader extends SamReader.ReaderImplementation implements SamReader.Indexing {
-    private static final Log log = Log.getInstance(SRAFileReader.class);
-    private SRAAccession acc;
-    private SAMFileHeader virtualHeader;
-    private ReadCollection run;
-    private ValidationStringency validationStringency;
-    private SRAIterator.RecordRangeInfo recordRangeInfo;
-    private SRAIndex index;
-    private ReferenceCache cachedReferences;
-
-    public SRAFileReader(final SRAAccession acc) {
-        this.acc = acc;
-
-        if (!acc.isValid()) {
-            throw new IllegalArgumentException("SRAFileReader: cannot resolve SRA accession '" + acc + "'\n" +
-                "Possible causes are an invalid SRA accession or a connection problem.");
-        }
-
-        try {
-            run = gov.nih.nlm.ncbi.ngs.NGS.openReadCollection(acc.toString());
-            virtualHeader = loadSamHeader();
-        } catch (final Exception e) {
-            throw new RuntimeException(e);
-        }
-
-        cachedReferences = new ReferenceCache(run, virtualHeader);
-        recordRangeInfo = SRAIterator.getRecordsRangeInfo(run);
-        index = new SRAIndex(virtualHeader, recordRangeInfo);
-    }
-
-    @Override
-    public Type type() {
-        return Type.SRA_TYPE;
-    }
-
-    @Override
-    public boolean hasIndex() {
-        return true;
-    }
-
-    @Override
-    public BAMIndex getIndex() {
-        return index;
-    }
-
-    @Override
-    public SAMFileHeader getFileHeader() {
-        return virtualHeader;
-    }
-
-    @Override
-    public CloseableIterator<SAMRecord> getIterator() {
-        return getIterator(getFilePointerSpanningReads());
-    }
-
-    @Override
-    public CloseableIterator<SAMRecord> getIterator(SAMFileSpan chunks) {
-        if (run == null) {
-            throw new RuntimeException("Cannot create iterator - SRA run is uninitialized");
-        }
-
-        if (virtualHeader == null) {
-            throw new RuntimeException("Cannot create iterator - SAM file header is uninitialized");
-        }
-
-        List<Chunk> chunkList = ((BAMFileSpan) chunks).getChunks();
-
-        final SRAIterator newIterator = new SRAIterator(acc, run, virtualHeader, cachedReferences, recordRangeInfo, chunkList);
-        if (validationStringency != null) {
-            newIterator.setValidationStringency(validationStringency);
-        }
-
-        return newIterator;
-    }
-
-    @Override
-    public SAMFileSpan getFilePointerSpanningReads() {
-        if (recordRangeInfo.getTotalRecordRangeLength() <= 0) {
-            throw new RuntimeException("Cannot create file span - SRA file is empty");
-        }
-
-        return new BAMFileSpan(new Chunk(0, recordRangeInfo.getTotalRecordRangeLength()));
-    }
-
-    @Override
-    public CloseableIterator<SAMRecord> query(QueryInterval[] intervals, boolean contained) {
-        BAMFileSpan span = new BAMFileSpan();
-        BrowseableBAMIndex index = getBrowseableIndex();
-
-        for (QueryInterval interval : intervals) {
-            BAMFileSpan intervalSpan;
-            if (!contained) {
-                intervalSpan = index.getSpanOverlapping(interval.referenceIndex, interval.start, interval.end);
-
-            } else {
-                intervalSpan = getSpanContained(interval.referenceIndex, interval.start, interval.end);
-            }
-            span.add(intervalSpan);
-        }
-
-        return getIterator(span);
-    }
-
-    @Override
-    public CloseableIterator<SAMRecord> queryAlignmentStart(String sequence, int start) {
-        int sequenceIndex = virtualHeader.getSequenceIndex(sequence);
-        if (sequenceIndex == -1) {
-            throw new IllegalArgumentException("Unknown sequence '" + sequence + "' was passed to SRAFileReader");
-        }
-
-        return getIterator(getSpanContained(sequenceIndex, start, -1));
-    }
-
-    @Override
-    public CloseableIterator<SAMRecord> queryUnmapped() {
-        if (recordRangeInfo.getTotalRecordRangeLength() <= 0) {
-            throw new RuntimeException("Cannot create file span - SRA file is empty");
-        }
-
-        SAMFileSpan span = new BAMFileSpan(new Chunk(recordRangeInfo.getTotalReferencesLength(), recordRangeInfo.getTotalRecordRangeLength()));
-        return getIterator(span);
-    }
-
-    @Override
-    public void close() {
-        run = null;
-    }
-
-    @Override
-    public ValidationStringency getValidationStringency() {
-        return validationStringency;
-    }
-
-
-    /** INDEXING */
-
-
-    /**
-     * Returns true if the supported index is browseable, meaning the bins in it can be traversed
-     * and chunk data inspected and retrieved.
-     *
-     * @return True if the index supports the BrowseableBAMIndex interface.  False otherwise.
-     */
-    @Override
-    public boolean hasBrowseableIndex() {
-        return true;
-    }
-
-    /**
-     * Gets an index tagged with the BrowseableBAMIndex interface.  Throws an exception if no such
-     * index is available.
-     *
-     * @return An index with a browseable interface, if possible.
-     * @throws SAMException if no such index is available.
-     */
-    @Override
-    public BrowseableBAMIndex getBrowseableIndex() {
-        return index;
-    }
-
-    /**
-     * Iterate through the given chunks in the file.
-     *
-     * @param chunks List of chunks for which to retrieve data.
-     * @return An iterator over the given chunks.
-     */
-    @Override
-    public SAMRecordIterator iterator(final SAMFileSpan chunks) {
-        CloseableIterator<SAMRecord> it = getIterator(chunks);
-        if (it == null) {
-            return null;
-        }
-        return (SAMRecordIterator) it;
-    }
-
-    /** ReaderImplementation */
-    @Override
-    void enableFileSource(final SamReader reader, final boolean enabled) {
-        log.info("enableFileSource is not supported");
-    }
-
-    @Override
-    void enableIndexCaching(final boolean enabled) {
-        log.info("enableIndexCaching is not supported");
-    }
-
-    @Override
-    void enableIndexMemoryMapping(final boolean enabled) {
-        log.info("enableIndexMemoryMapping is not supported");
-    }
-
-    @Override
-    void enableCrcChecking(final boolean enabled) {
-        log.info("enableCrcChecking is not supported");
-    }
-
-    @Override
-    void setSAMRecordFactory(final SAMRecordFactory factory) {
-        log.info("setSAMRecordFactory is not supported");
-    }
-
-    @Override
-    void setValidationStringency(final ValidationStringency validationStringency) {
-        this.validationStringency = validationStringency;
-    }
-
-    protected SRAIterator.RecordRangeInfo getRecordsRangeInfo() {
-        return recordRangeInfo;
-    }
-
-    private SAMFileHeader loadSamHeader() throws ErrorMsg {
-        if (run == null) {
-            throw new RuntimeException("Cannot load SAMFileHeader - SRA run is uninitialized");
-        }
-
-        String runName = run.getName();
-
-        SAMFileHeader header = new SAMFileHeader();
-        header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-
-        ReadGroupIterator itRg = run.getReadGroups();
-        while (itRg.nextReadGroup()) {
-            String rgName = itRg.getName();
-            if (rgName.isEmpty())
-                rgName = runName;
-            SAMReadGroupRecord rg = new SAMReadGroupRecord(rgName);
-            rg.setSample(runName);
-            header.addReadGroup(rg);
-        }
-
-        ReferenceIterator itRef = run.getReferences();
-        while (itRef.nextReference()) {
-            header.addSequence(new SAMSequenceRecord(itRef.getCanonicalName(), (int) itRef.getLength()));
-        }
-
-        return header;
-    }
-
-    private BAMFileSpan getSpanContained(int sequenceIndex, long start, long end) {
-        if (recordRangeInfo.getTotalRecordRangeLength() <= 0) {
-            throw new RuntimeException("Cannot create file span - SRA file is empty");
-        }
-
-        long sequenceOffset = recordRangeInfo.getReferenceOffsets().get(sequenceIndex);
-        long sequenceLength = recordRangeInfo.getReferenceLengthsAligned().get(sequenceIndex);
-        if (end == -1) {
-            end = sequenceLength;
-        }
-
-        if (start > sequenceLength) {
-            throw new IllegalArgumentException("Sequence start position is larger than its length");
-        }
-
-        if (end > sequenceLength) {
-            throw new IllegalArgumentException("Sequence end position is larger than its length");
-        }
-
-        return new BAMFileSpan(new Chunk(sequenceOffset + start, sequenceOffset + end));
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SRAIndex.java b/src/main/java/htsjdk/samtools/SRAIndex.java
deleted file mode 100644
index b74ee63..0000000
--- a/src/main/java/htsjdk/samtools/SRAIndex.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*===========================================================================
-*
-*                            PUBLIC DOMAIN NOTICE
-*               National Center for Biotechnology Information
-*
-*  This software/database is a "United States Government Work" under the
-*  terms of the United States Copyright Act.  It was written as part of
-*  the author's official duties as a United States Government employee and
-*  thus cannot be copyrighted.  This software/database is freely available
-*  to the public for use. The National Library of Medicine and the U.S.
-*  Government have not placed any restriction on its use or reproduction.
-*
-*  Although all reasonable efforts have been taken to ensure the accuracy
-*  and reliability of the software and data, the NLM and the U.S.
-*  Government do not and cannot warrant the performance or results that
-*  may be obtained by using this software or data. The NLM and the U.S.
-*  Government disclaim all warranties, express or implied, including
-*  warranties of performance, merchantability or fitness for any particular
-*  purpose.
-*
-*  Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools;
-
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Emulates BAM index so that we can request chunks of records from SRAFileReader
- *
- * Here is how it works:
- *  SRA allows reading of alignments by Reference position fast, so we divide our "file" range for alignments as
- *  a length of all references. Reading unaligned reads is then fast if we use read positions for lookup and (internally)
- *  filter out aligned fragments.
- *
- *  Total SRA "file" range is calculated as sum of all reference lengths plus number of reads (both aligned and unaligned)
- *  in SRA archive.
- *
- *  Now, we can use Chunks to lookup for aligned and unaligned fragments.
- *
- *  We emulate BAM index bins by mapping SRA reference positions to bin numbers.
- *  And then we map from bin number to list of chunks, which represent SRA "file" positions (which are simply reference
- *  positions).
- *
- *  We only emulate last level of BAM index bins (and they refer to a portion of reference SRA_BIN_SIZE bases long).
- *  For all other bins RuntimeException will be returned (but since nobody else creates bins, except SRAIndex class
- *  that is fine).
- *
- *  But since the last level of bins was not meant to refer to fragments that only partially overlap bin reference
- *  positions, we also return chunk that goes 5000 bases left before beginning of the bin to assure fragments that
- *  start before the bin positions but still overlap with it can be retrieved by SRA reader.
- *  Later we will add support to NGS API to get a maximum number of bases that we need to go left to retrieve such fragments.
- *
- * Created by andrii.nikitiuk on 9/4/15.
- */
-public class SRAIndex implements BrowseableBAMIndex {
-    /**
-     * Number of reference bases bins in last level can represent
-     */
-    public static final int SRA_BIN_SIZE = 16 * 1024;
-
-    /**
-     * Chunks of that size will be created when using SRA index
-     */
-    public static final int SRA_CHUNK_SIZE = 50000;
-
-    /**
-     * First bin number in last level
-     */
-    private static final int SRA_BIN_INDEX_OFFSET = GenomicIndexUtil.LEVEL_STARTS[GenomicIndexUtil.LEVEL_STARTS.length - 1];
-
-    /**
-     * How many bases should we go left on the reference to find all fragments that start before requested interval
-     * but overlap with it
-     */
-    private static final int MAX_FRAGMENT_OVERLAP = 5000;
-
-    private SAMFileHeader header;
-    private SRAIterator.RecordRangeInfo recordRangeInfo;
-
-    /**
-     * @param header sam header
-     * @param recordRangeInfo info about record ranges withing SRA archive
-     */
-    public SRAIndex(SAMFileHeader header, SRAIterator.RecordRangeInfo recordRangeInfo) {
-        this.header = header;
-        this.recordRangeInfo = recordRangeInfo;
-    }
-
-    /**
-     * Gets the size (number of bins in) a given level of a BAM index.
-     * @param levelNumber Level for which to inspect the size.
-     * @return Size of the given level.
-     */
-    @Override
-    public int getLevelSize(int levelNumber) {
-        if (levelNumber == GenomicIndexUtil.LEVEL_STARTS.length - 1)
-            return GenomicIndexUtil.MAX_BINS - GenomicIndexUtil.LEVEL_STARTS[levelNumber]-1;
-        else
-            return GenomicIndexUtil.LEVEL_STARTS[levelNumber+1] - GenomicIndexUtil.LEVEL_STARTS[levelNumber];
-    }
-
-    /**
-     * SRA only operates on bins from last level
-     * @param bin The bin  for which to determine the level.
-     * @return bin level
-     */
-    @Override
-    public int getLevelForBin(Bin bin) {
-        if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) {
-            throw new RuntimeException("SRA only supports bins from the last level");
-        }
-        return GenomicIndexUtil.LEVEL_STARTS.length - 1;
-    }
-
-    /**
-     * Gets the first locus that this bin can index into.
-     * @param bin The bin to test.
-     * @return first position that associated with given bin number
-     */
-    @Override
-    public int getFirstLocusInBin(Bin bin) {
-        if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) {
-            throw new RuntimeException("SRA only supports bins from the last level");
-        }
-
-        return (bin.getBinNumber() - SRA_BIN_INDEX_OFFSET) * SRA_BIN_SIZE + 1;
-    }
-
-    /**
-     * Gets the last locus that this bin can index into.
-     * @param bin The bin to test.
-     * @return last position that associated with given bin number
-     */
-    @Override
-    public int getLastLocusInBin(Bin bin) {
-        if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) {
-            throw new RuntimeException("SRA only supports bins from the last level");
-        }
-
-        return (bin.getBinNumber() - SRA_BIN_INDEX_OFFSET + 1) * SRA_BIN_SIZE;
-    }
-
-    /**
-     * Provides a list of bins that contain bases at requested positions
-     * @param referenceIndex sequence of desired SAMRecords
-     * @param startPos 1-based start of the desired interval, inclusive
-     * @param endPos 1-based end of the desired interval, inclusive
-     * @return a list of bins that contain relevant data
-     */
-    @Override
-    public BinList getBinsOverlapping(int referenceIndex, int startPos, int endPos) {
-        long refLength = recordRangeInfo.getReferenceLengthsAligned().get(referenceIndex);
-
-        // convert to chunk address space within reference
-        long refStartPos =  startPos - 1;
-        long refEndPos = endPos;
-        if (refEndPos >= refLength) {
-            throw new RuntimeException("refEndPos is larger than reference length");
-        }
-
-        int firstBinNumber = (int)refStartPos / SRA_BIN_SIZE;
-        int lastBinNumber = (int)(refEndPos - 1) / SRA_BIN_SIZE;
-
-        int numberOfBins = ((int)refLength / SRA_BIN_SIZE) + 1;
-
-        BitSet binBitSet = new BitSet();
-        binBitSet.set(0, SRA_BIN_INDEX_OFFSET, false);
-        if (firstBinNumber > 0) {
-            binBitSet.set(SRA_BIN_INDEX_OFFSET, SRA_BIN_INDEX_OFFSET + firstBinNumber, false);
-        }
-        binBitSet.set(SRA_BIN_INDEX_OFFSET + firstBinNumber, SRA_BIN_INDEX_OFFSET + lastBinNumber + 1, true);
-        if (lastBinNumber + 1 < numberOfBins) {
-            binBitSet.set(SRA_BIN_INDEX_OFFSET + lastBinNumber + 1, SRA_BIN_INDEX_OFFSET + numberOfBins, false);
-        }
-
-        return new BinList(referenceIndex, binBitSet);
-    }
-
-    @Override
-    public BAMFileSpan getSpanOverlapping(Bin bin) {
-        return new BAMFileSpan(getBinChunks(bin));
-    }
-
-    @Override
-    public BAMFileSpan getSpanOverlapping(int referenceIndex, int startPos, int endPos) {
-        BinList binList = getBinsOverlapping(referenceIndex, startPos, endPos);
-        BAMFileSpan result = new BAMFileSpan();
-        Set<Chunk> savedChunks = new HashSet<Chunk>();
-        for (Bin bin : binList) {
-            List<Chunk> chunks = getSpanOverlapping(bin).getChunks();
-            for (Chunk chunk : chunks) {
-                if (!savedChunks.contains(chunk)) {
-                    savedChunks.add(chunk);
-                    result.add(chunk);
-                }
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * @return a position where aligned fragments end
-     */
-    @Override
-    public long getStartOfLastLinearBin() {
-        int numberOfReferences = recordRangeInfo.getReferenceLengthsAligned().size();
-        long refOffset = recordRangeInfo.getReferenceOffsets().get(numberOfReferences - 1);
-        long lastChunkNumber = recordRangeInfo.getReferenceLengthsAligned().get(numberOfReferences - 1) / SRA_CHUNK_SIZE;
-        return lastChunkNumber * SRA_CHUNK_SIZE + refOffset;
-    }
-
-    @Override
-    public BAMIndexMetaData getMetaData(int reference) {
-        throw new UnsupportedOperationException("Getting of BAM index metadata for SRA is not implemented");
-    }
-
-    @Override
-    public void close() { }
-
-    /**
-     * @param bin Requested bin
-     * @return chunks that represent all bases of requested bin
-     */
-    private List<Chunk> getBinChunks(Bin bin) {
-        if (bin.containsChunks()) {
-            return bin.getChunkList();
-        }
-
-        if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) {
-            throw new RuntimeException("SRA only supports bins from the last level");
-        }
-        int binNumber = bin.getBinNumber() - SRA_BIN_INDEX_OFFSET;
-        long refOffset = recordRangeInfo.getReferenceOffsets().get(bin.getReferenceSequence());
-
-        // move requested position MAX_FRAGMENT_OVERLAP bases behind, so that we take all the reads that overlap requested position
-        int firstChunkCorrection = binNumber == 0 ? 0 : -MAX_FRAGMENT_OVERLAP;
-
-        long binGlobalOffset = binNumber * SRA_BIN_SIZE + refOffset;
-        long firstChunkNumber = (binGlobalOffset + firstChunkCorrection) / SRA_CHUNK_SIZE;
-        long lastChunkNumber = (binGlobalOffset + SRA_BIN_SIZE - 1) / SRA_CHUNK_SIZE;
-        List<Chunk> chunks = new ArrayList<Chunk>();
-        for (long chunkNumber = firstChunkNumber; chunkNumber <= lastChunkNumber; chunkNumber++) {
-            chunks.add(new Chunk(chunkNumber * SRA_CHUNK_SIZE, (chunkNumber + 1) * SRA_CHUNK_SIZE));
-        }
-
-        return chunks;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SRAIterator.java b/src/main/java/htsjdk/samtools/SRAIterator.java
deleted file mode 100644
index 9fbbc97..0000000
--- a/src/main/java/htsjdk/samtools/SRAIterator.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*===========================================================================
-*
-*                            PUBLIC DOMAIN NOTICE
-*               National Center for Biotechnology Information
-*
-*  This software/database is a "United States Government Work" under the
-*  terms of the United States Copyright Act.  It was written as part of
-*  the author's official duties as a United States Government employee and
-*  thus cannot be copyrighted.  This software/database is freely available
-*  to the public for use. The National Library of Medicine and the U.S.
-*  Government have not placed any restriction on its use or reproduction.
-*
-*  Although all reasonable efforts have been taken to ensure the accuracy
-*  and reliability of the software and data, the NLM and the U.S.
-*  Government do not and cannot warrant the performance or results that
-*  may be obtained by using this software or data. The NLM and the U.S.
-*  Government disclaim all warranties, express or implied, including
-*  warranties of performance, merchantability or fitness for any particular
-*  purpose.
-*
-*  Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-/**
- * Created by andrii.nikitiuk on 8/11/15.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.SAMFileHeader.SortOrder;
-
-import htsjdk.samtools.sra.ReferenceCache;
-import htsjdk.samtools.sra.SRAAccession;
-import htsjdk.samtools.sra.SRAAlignmentIterator;
-import htsjdk.samtools.sra.SRAUnalignmentIterator;
-import htsjdk.samtools.sra.SRAUtils;
-import ngs.ErrorMsg;
-import ngs.ReadCollection;
-import ngs.Reference;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * SRA iterator which returns SAMRecords for requested list of chunks
- */
-public class SRAIterator implements SAMRecordIterator {
-    private ValidationStringency validationStringency;
-
-    private SRAAccession accession;
-    private ReadCollection run;
-    private SAMFileHeader header;
-    private ReferenceCache cachedReferences;
-    private RecordRangeInfo recordRangeInfo;
-    private Iterator<Chunk> chunksIterator;
-    private Chunk currentChunk;
-
-    private SRAAlignmentIterator alignmentIterator;
-    private SRAUnalignmentIterator unalignmentIterator;
-
-    /**
-     * Describes record ranges info needed for emulating BAM index
-     */
-    public static class RecordRangeInfo {
-        private List<Long> referenceOffsets;
-        private List<Long> referenceLengthsAligned;
-        private long totalReferencesLength;
-        private long numberOfReads; // is used for unaligned read space
-        private long totalRecordRangeLength;
-
-        /**
-         * @param referenceLengthsAligned a list with lengths of each reference
-         * @param numberOfReads total number of reads within SRA archive
-         */
-        public RecordRangeInfo(List<Long> referenceLengthsAligned, long numberOfReads) {
-            this.numberOfReads = numberOfReads;
-            this.referenceLengthsAligned = referenceLengthsAligned;
-
-            referenceOffsets = new ArrayList<Long>();
-
-            totalReferencesLength = 0;
-            for (Long refLen : referenceLengthsAligned) {
-                referenceOffsets.add(totalReferencesLength);
-                totalReferencesLength += refLen;
-            }
-
-            totalRecordRangeLength = totalReferencesLength + this.numberOfReads;
-        }
-
-        public long getNumberOfReads() {
-            return numberOfReads;
-        }
-
-        public long getTotalReferencesLength() {
-            return totalReferencesLength;
-        }
-
-        public long getTotalRecordRangeLength() {
-            return totalRecordRangeLength;
-        }
-
-        public final List<Long> getReferenceOffsets() {
-            return Collections.unmodifiableList(referenceOffsets);
-        }
-
-        public final List<Long> getReferenceLengthsAligned() {
-            return Collections.unmodifiableList(referenceLengthsAligned);
-        }
-    }
-
-    /**
-     * Loads record ranges needed for emulating BAM index
-     * @param run read collection
-     * @return record ranges
-     */
-    public static RecordRangeInfo getRecordsRangeInfo(ReadCollection run) {
-        try {
-            return new RecordRangeInfo(SRAUtils.getReferencesLengthsAligned(run), SRAUtils.getNumberOfReads(run));
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * @param run opened read collection
-     * @param header sam header
-     * @param cachedReferences list of cached references shared among all iterators from a single SRAFileReader
-     * @param recordRangeInfo info about record ranges withing SRA archive
-     * @param chunks used to determine which records the iterator should return
-     */
-    public SRAIterator(SRAAccession accession, final ReadCollection run, final SAMFileHeader header, ReferenceCache cachedReferences,
-                       final RecordRangeInfo recordRangeInfo, final List<Chunk> chunks) {
-        this.accession = accession;
-        this.run = run;
-        this.header = header;
-        this.cachedReferences = cachedReferences;
-        this.recordRangeInfo = recordRangeInfo;
-        chunksIterator = chunks.iterator();
-        if (chunksIterator.hasNext()) {
-            currentChunk = chunksIterator.next();
-        }
-
-        hasNext();
-    }
-
-    /**
-     * NGS iterators implement a single method "nextObject" which return true if the operation was successful or
-     * false if there are no more objects available.
-     * That means that there is no way to check "hasNext" without actually moving the iterator forward.
-     * Because of that all the logic of moving iterator forward is actually happens in "hasNext".
-     *
-     * Here is explanation of how it works:
-     *  Iterator holds a list of chunks of requested records. Here we have chunksIterator that walks though that list.
-     *  We walk though that list using chunksIterator. If current chunk can represent aligned fragments then we create
-     *  SRAAlignmentIterator iterator, pass the chunk into it and ask if it can find any record. If record was found,
-     *  we say that we have next; otherwise we check if the chunk can represent unaligned fragments and then create
-     *  SRAUnalignmentIterator if so and do the same steps as with alignemnt iterator.
-     *
-     *  If record was not found in both SRAAlignmentIterator and SRAUnalignmentIterator (it is possible that reference
-     *  range has no alignments or that reads range has all aligned fragment), we try the next chunk.
-     *
-     *  When there are no more chunks and both iterators have no more records we return false.
-     *
-     * @return true if there are more records available
-     */
-    @Override
-    public boolean hasNext() {
-        while (currentChunk != null) {
-            if (alignmentIterator == null) {
-                if (currentChunk.getChunkStart() < recordRangeInfo.getTotalReferencesLength()) {
-                    alignmentIterator = new SRAAlignmentIterator(accession, run, header, cachedReferences, recordRangeInfo, currentChunk);
-                    if (validationStringency != null) {
-                        alignmentIterator.setValidationStringency(validationStringency);
-                    }
-                }
-            }
-
-            if (alignmentIterator != null && alignmentIterator.hasNext()) {
-                return true;
-            }
-
-            if (unalignmentIterator == null) {
-                if (currentChunk.getChunkEnd() > recordRangeInfo.getTotalReferencesLength()) {
-                    unalignmentIterator = new SRAUnalignmentIterator(accession, run, header, recordRangeInfo, currentChunk);
-                    if (validationStringency != null) {
-                        unalignmentIterator.setValidationStringency(validationStringency);
-                    }
-                }
-            }
-            if (unalignmentIterator != null && unalignmentIterator.hasNext()) {
-                return true;
-            }
-
-            if (alignmentIterator != null) {
-                alignmentIterator.close();
-            }
-            alignmentIterator = null;
-            unalignmentIterator = null;
-            if (chunksIterator.hasNext()) {
-                currentChunk = chunksIterator.next();
-            } else {
-                currentChunk = null;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Call hasNext to make sure that one of inner iterators points to the next record, the retrieve the record from
-     * one of them.
-     * @return lazy SRA record
-     */
-    @Override
-    public SAMRecord next() {
-        if (!hasNext()) {
-            throw new NoSuchElementException("No more records are available in SRAIterator");
-        }
-
-        if (alignmentIterator != null && alignmentIterator.hasNext()) {
-            return alignmentIterator.next();
-        }
-
-        return unalignmentIterator.next();
-    }
-
-    @Override
-    public void remove() { throw new UnsupportedOperationException("Removal of records not implemented."); }
-
-    @Override
-    public void close() {
-        if (alignmentIterator != null) {
-            alignmentIterator.close();
-            alignmentIterator = null;
-        }
-    }
-
-    @Override
-    public SAMRecordIterator assertSorted(final SortOrder sortOrder) { throw new UnsupportedOperationException("assertSorted is not implemented."); }
-
-    public void setValidationStringency(ValidationStringency validationStringency) {
-        this.validationStringency = validationStringency;
-
-        if (alignmentIterator != null) {
-            alignmentIterator.setValidationStringency(validationStringency);
-        }
-        if (unalignmentIterator != null) {
-            unalignmentIterator.setValidationStringency(validationStringency);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SamFileHeaderMerger.java b/src/main/java/htsjdk/samtools/SamFileHeaderMerger.java
deleted file mode 100644
index b3f588c..0000000
--- a/src/main/java/htsjdk/samtools/SamFileHeaderMerger.java
+++ /dev/null
@@ -1,786 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.SequenceUtil;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Merges SAMFileHeaders that have the same sequences into a single merged header
- * object while providing read group translation for cases where read groups
- * clash across input headers.
- */
-public class SamFileHeaderMerger {
-
-    /**
-     * A 4-digit base 36 number is going to be attached to colliding SAMFileHeaderRecords,
-     * To do this we first create an array of values to convert integer remainders into
-     * base 36 values, we use base 36 because we have 10 digits and 26 numbers
-     */
-    private static final char[] INT_TO_BASE36 = new char[36];
-
-    static {
-        int aVal = (int) 'A';
-        int zeroVal = (int) '0';
-
-        for (int i = 0; i < 10; i++) {
-            INT_TO_BASE36[i] = (char) (zeroVal + i);
-        }
-
-        for (int i = 0; i < 26; i++) {
-            INT_TO_BASE36[i + 10] = (char) (aVal + i);
-        }
-    }
-
-    //Super Header to construct
-    private final SAMFileHeader mergedHeader;
-    private Collection<SamReader> readers;
-    private final Collection<SAMFileHeader> headers;
-    private int recordCounter;
-
-    //Translation of old group ids to new group ids
-    private final Map<SAMFileHeader, Map<String, String>> samReadGroupIdTranslation =
-            new IdentityHashMap<SAMFileHeader, Map<String, String>>();
-
-    //the read groups from different files use the same group ids
-    private boolean hasReadGroupCollisions = false;
-
-    //the program records from different files use the same program record ids
-    private boolean hasProgramGroupCollisions = false;
-
-    //Translation of old program group ids to new program group ids
-    private final Map<SAMFileHeader, Map<String, String>> samProgramGroupIdTranslation =
-            new IdentityHashMap<SAMFileHeader, Map<String, String>>();
-
-    private boolean hasMergedSequenceDictionary = false;
-
-    // Translation of old sequence dictionary ids to new dictionary ids
-    // This is an IdentityHashMap because it can be quite expensive to compute the hashCode for
-    // large SAMFileHeaders.  It is possible that two input files will have identical headers so that
-    // the regular HashMap would fold them together, but the value stored in each of the two
-    // Map entries will be the same, so it should not hurt anything.
-    private final Map<SAMFileHeader, Map<Integer, Integer>> samSeqDictionaryIdTranslationViaHeader =
-            new IdentityHashMap<SAMFileHeader, Map<Integer, Integer>>();
-
-    //HeaderRecordFactory that creates SAMReadGroupRecord instances.
-    private static final HeaderRecordFactory<SAMReadGroupRecord> READ_GROUP_RECORD_FACTORY = new HeaderRecordFactory<SAMReadGroupRecord>() {
-        public SAMReadGroupRecord createRecord(final String id, final SAMReadGroupRecord srcReadGroupRecord) {
-            return new SAMReadGroupRecord(id, srcReadGroupRecord);
-        }
-    };
-
-    //HeaderRecordFactory that creates SAMProgramRecord instances.
-    private static final HeaderRecordFactory<SAMProgramRecord> PROGRAM_RECORD_FACTORY = new HeaderRecordFactory<SAMProgramRecord>() {
-        public SAMProgramRecord createRecord(final String id, final SAMProgramRecord srcProgramRecord) {
-            return new SAMProgramRecord(id, srcProgramRecord);
-        }
-    };
-
-    //comparator used to sort lists of program group and read group records
-    private static final Comparator<AbstractSAMHeaderRecord> RECORD_ID_COMPARATOR = new Comparator<AbstractSAMHeaderRecord>() {
-        public int compare(final AbstractSAMHeaderRecord o1, final AbstractSAMHeaderRecord o2) {
-            return o1.getId().compareTo(o2.getId());
-        }
-    };
-
-    /**
-     * Create SAMFileHeader with additional information.  Required that sequence dictionaries agree.
-     *
-     * @param readers   sam file readers to combine
-     * @param sortOrder sort order new header should have
-     * @deprecated replaced by {@link #SamFileHeaderMerger(SAMFileHeader.SortOrder, Collection, boolean)}
-     */
-    @Deprecated
-    public SamFileHeaderMerger(final Collection<SamReader> readers, final SAMFileHeader.SortOrder sortOrder) {
-        this(readers, sortOrder, false);
-    }
-
-    /**
-     * Create SAMFileHeader with additional information.
-     *
-     * @param readers           sam file readers to combine
-     * @param sortOrder         sort order new header should have
-     * @param mergeDictionaries If true, merge sequence dictionaries in new header.  If false, require that
-     *                          all input sequence dictionaries be identical.
-     * @deprecated replaced by {@link #SamFileHeaderMerger(SAMFileHeader.SortOrder, Collection, boolean)}
-     */
-    @Deprecated
-    public SamFileHeaderMerger(final Collection<SamReader> readers, final SAMFileHeader.SortOrder sortOrder, final boolean mergeDictionaries) {
-        this(sortOrder, getHeadersFromReaders(readers), mergeDictionaries);
-        this.readers = readers;
-    }
-
-    /**
-     * Create SAMFileHeader with additional information..  This is the preferred constructor.
-     *
-     * @param sortOrder         sort order new header should have
-     * @param headers           sam file headers to combine
-     * @param mergeDictionaries If true, merge sequence dictionaries in new header.  If false, require that
-     *                          all input sequence dictionaries be identical.
-     */
-    public SamFileHeaderMerger(final SAMFileHeader.SortOrder sortOrder, final Collection<SAMFileHeader> headers, final boolean mergeDictionaries) {
-        this.headers = new LinkedHashSet<SAMFileHeader>(headers);
-        this.mergedHeader = new SAMFileHeader();
-
-        SAMSequenceDictionary sequenceDictionary;
-        try {
-            sequenceDictionary = getSequenceDictionary(headers);
-            this.hasMergedSequenceDictionary = false;
-        } catch (SequenceUtil.SequenceListsDifferException pe) {
-            if (mergeDictionaries) {
-                sequenceDictionary = mergeSequenceDictionaries(headers);
-                this.hasMergedSequenceDictionary = true;
-            } else {
-                throw pe;
-            }
-        }
-
-        this.mergedHeader.setSequenceDictionary(sequenceDictionary);
-
-        // Set program that creates input alignments
-        for (final SAMProgramRecord program : mergeProgramGroups(headers)) {
-            this.mergedHeader.addProgramRecord(program);
-        }
-
-        // Set read groups for merged header
-        final List<SAMReadGroupRecord> readGroups = mergeReadGroups(headers);
-        this.mergedHeader.setReadGroups(readGroups);
-        this.mergedHeader.setGroupOrder(SAMFileHeader.GroupOrder.none);
-
-        this.mergedHeader.setSortOrder(sortOrder);
-
-        for (final SAMFileHeader header : headers) {
-            for (final String comment : header.getComments()) {
-                this.mergedHeader.addComment(comment);
-            }
-        }
-    }
-
-    // Utility method to make use with old constructor
-    private static List<SAMFileHeader> getHeadersFromReaders(final Collection<SamReader> readers) {
-        final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>(readers.size());
-        for (final SamReader reader : readers) {
-            headers.add(reader.getFileHeader());
-        }
-        return headers;
-    }
-
-
-    /**
-     * Checks to see if there are clashes where different readers are using the same read
-     * group IDs. If yes, then those IDs that collided are remapped.
-     *
-     * @param headers headers to combine
-     * @return new list of read groups constructed from all the readers
-     */
-    private List<SAMReadGroupRecord> mergeReadGroups(final Collection<SAMFileHeader> headers) {
-        //prepare args for mergeHeaderRecords(..) call
-        final HashSet<String> idsThatAreAlreadyTaken = new HashSet<String>();
-
-        final List<HeaderRecordAndFileHeader<SAMReadGroupRecord>> readGroupsToProcess = new LinkedList<HeaderRecordAndFileHeader<SAMReadGroupRecord>>();
-        for (final SAMFileHeader header : headers) {
-            for (final SAMReadGroupRecord readGroup : header.getReadGroups()) {
-                //verify that there are no existing id collisions in this input file
-                if (!idsThatAreAlreadyTaken.add(readGroup.getId()))
-                    throw new SAMException("Input file: " + header + " contains more than one RG with the same id (" + readGroup.getId() + ")");
-
-                readGroupsToProcess.add(new HeaderRecordAndFileHeader<SAMReadGroupRecord>(readGroup, header));
-            }
-            idsThatAreAlreadyTaken.clear();
-        }
-
-        final List<SAMReadGroupRecord> result = new LinkedList<SAMReadGroupRecord>();
-
-        recordCounter = 0;
-        hasReadGroupCollisions = mergeHeaderRecords(readGroupsToProcess, READ_GROUP_RECORD_FACTORY, idsThatAreAlreadyTaken, samReadGroupIdTranslation, result);
-
-        //sort the result list by record id
-        Collections.sort(result, RECORD_ID_COMPARATOR);
-
-        return result;
-    }
-
-
-    /**
-     * Checks to see if there are clashes where different readers are using the same program
-     * group IDs. If yes, then those IDs that collided are remapped.
-     *
-     * @param headers headers to combine
-     * @return new list of program groups constructed from all the readers
-     */
-    private List<SAMProgramRecord> mergeProgramGroups(final Collection<SAMFileHeader> headers) {
-
-        final List<SAMProgramRecord> overallResult = new LinkedList<SAMProgramRecord>();
-
-        //this Set will accumulate all SAMProgramRecord ids that have been encountered so far.
-        final HashSet<String> idsThatAreAlreadyTaken = new HashSet<String>();
-
-        //need to process all program groups
-        List<HeaderRecordAndFileHeader<SAMProgramRecord>> programGroupsLeftToProcess = new LinkedList<HeaderRecordAndFileHeader<SAMProgramRecord>>();
-        for (final SAMFileHeader header : headers) {
-            for (final SAMProgramRecord programGroup : header.getProgramRecords()) {
-                //verify that there are no existing id collisions in this input file
-                if (!idsThatAreAlreadyTaken.add(programGroup.getId()))
-                    throw new SAMException("Input file: " + header + " contains more than one PG with the same id (" + programGroup.getId() + ")");
-
-                programGroupsLeftToProcess.add(new HeaderRecordAndFileHeader<SAMProgramRecord>(programGroup, header));
-            }
-            idsThatAreAlreadyTaken.clear();
-        }
-
-        recordCounter = 0;
-
-        //A program group header (lets say ID=2 PN=B PP=1) may have a PP (previous program) attribute which chains it to
-        //another program group header (lets say ID=1 PN=A) to indicate that the given file was
-        //processed by program A followed by program B. These PP attributes potentially
-        //connect headers into one or more tree structures. Merging is done by
-        //first merging all headers that don't have PP attributes (eg. tree roots),
-        //then updating and merging all headers whose PPs point to the tree-root headers,
-        //and so on until all program group headers are processed.
-
-        //currentProgramGroups is the list of records to merge next. Start by merging the programGroups that don't have a PP attribute (eg. the tree roots).
-        List<HeaderRecordAndFileHeader<SAMProgramRecord>> currentProgramGroups = new LinkedList<HeaderRecordAndFileHeader<SAMProgramRecord>>();
-        for (final Iterator<HeaderRecordAndFileHeader<SAMProgramRecord>> programGroupsLeftToProcessIterator = programGroupsLeftToProcess.iterator(); programGroupsLeftToProcessIterator.hasNext(); ) {
-            final HeaderRecordAndFileHeader<SAMProgramRecord> pair = programGroupsLeftToProcessIterator.next();
-            if (pair.getHeaderRecord().getAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG) == null) {
-                programGroupsLeftToProcessIterator.remove();
-                currentProgramGroups.add(pair);
-            }
-        }
-
-        //merge currentProgramGroups
-        while (!currentProgramGroups.isEmpty()) {
-            final List<SAMProgramRecord> currentResult = new LinkedList<SAMProgramRecord>();
-
-            hasProgramGroupCollisions |= mergeHeaderRecords(currentProgramGroups, PROGRAM_RECORD_FACTORY, idsThatAreAlreadyTaken, samProgramGroupIdTranslation, currentResult);
-
-            //add currentResults to overallResults
-            overallResult.addAll(currentResult);
-
-            //apply the newly-computed id translations to currentProgramGroups and programGroupsLeftToProcess
-            currentProgramGroups = translateIds(currentProgramGroups, samProgramGroupIdTranslation, false);
-            programGroupsLeftToProcess = translateIds(programGroupsLeftToProcess, samProgramGroupIdTranslation, true);
-
-            //find all records in programGroupsLeftToProcess whose ppId points to a record that was just processed (eg. a record that's in currentProgramGroups),
-            //and move them to the list of programGroupsToProcessNext.
-            final LinkedList<HeaderRecordAndFileHeader<SAMProgramRecord>> programGroupsToProcessNext = new LinkedList<HeaderRecordAndFileHeader<SAMProgramRecord>>();
-            for (final Iterator<HeaderRecordAndFileHeader<SAMProgramRecord>> programGroupsLeftToProcessIterator = programGroupsLeftToProcess.iterator(); programGroupsLeftToProcessIterator.hasNext(); ) {
-                final HeaderRecordAndFileHeader<SAMProgramRecord> pairLeftToProcess = programGroupsLeftToProcessIterator.next();
-                final Object ppIdOfRecordLeftToProcess = pairLeftToProcess.getHeaderRecord().getAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG);
-                //find what currentProgramGroups this ppId points to (NOTE: they have to come from the same file)
-                for (final HeaderRecordAndFileHeader<SAMProgramRecord> justProcessedPair : currentProgramGroups) {
-                    final String idJustProcessed = justProcessedPair.getHeaderRecord().getId();
-                    if (pairLeftToProcess.getFileHeader() == justProcessedPair.getFileHeader() && ppIdOfRecordLeftToProcess.equals(idJustProcessed)) {
-                        programGroupsLeftToProcessIterator.remove();
-                        programGroupsToProcessNext.add(pairLeftToProcess);
-                        break;
-                    }
-                }
-            }
-
-            currentProgramGroups = programGroupsToProcessNext;
-        }
-
-        //verify that all records were processed
-        if (!programGroupsLeftToProcess.isEmpty()) {
-            final StringBuffer errorMsg = new StringBuffer(programGroupsLeftToProcess.size() + " program groups weren't processed. Do their PP ids point to existing PGs? \n");
-            for (final HeaderRecordAndFileHeader<SAMProgramRecord> pair : programGroupsLeftToProcess) {
-                final SAMProgramRecord record = pair.getHeaderRecord();
-                errorMsg.append("@PG ID:" + record.getProgramGroupId() + " PN:" + record.getProgramName() + " PP:" + record.getPreviousProgramGroupId() + "\n");
-            }
-            throw new SAMException(errorMsg.toString());
-        }
-
-        //sort the result list by record id
-        Collections.sort(overallResult, RECORD_ID_COMPARATOR);
-
-        return overallResult;
-    }
-
-
-    /**
-     * Utility method that takes a list of program groups and remaps all their
-     * ids (including ppIds if requested) using the given idTranslationTable.
-     * <p/>
-     * NOTE: when remapping, this method creates new SAMProgramRecords and
-     * doesn't mutate any records in the programGroups list.
-     *
-     * @param programGroups      The program groups to translate.
-     * @param idTranslationTable The translation table.
-     * @param translatePpIds     Whether ppIds should be translated as well.
-     * @return The list of translated records.
-     */
-    private List<HeaderRecordAndFileHeader<SAMProgramRecord>> translateIds(
-            final List<HeaderRecordAndFileHeader<SAMProgramRecord>> programGroups,
-            final Map<SAMFileHeader, Map<String, String>> idTranslationTable,
-            final boolean translatePpIds) {
-
-        //go through programGroups and translate any IDs and PPs based on the idTranslationTable.
-        final List<HeaderRecordAndFileHeader<SAMProgramRecord>> result = new LinkedList<HeaderRecordAndFileHeader<SAMProgramRecord>>();
-        for (final HeaderRecordAndFileHeader<SAMProgramRecord> pair : programGroups) {
-            final SAMProgramRecord record = pair.getHeaderRecord();
-            final String id = record.getProgramGroupId();
-            final String ppId = (String) record.getAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG);
-
-            final SAMFileHeader header = pair.getFileHeader();
-            final Map<String, String> translations = idTranslationTable.get(header);
-
-            //see if one or both ids need to be translated
-            SAMProgramRecord translatedRecord = null;
-            if (translations != null) {
-                final String translatedId = translations.get(id);
-                final String translatedPpId = translatePpIds ? translations.get(ppId) : null;
-
-                final boolean needToTranslateId = translatedId != null && !translatedId.equals(id);
-                final boolean needToTranslatePpId = translatedPpId != null && !translatedPpId.equals(ppId);
-
-                if (needToTranslateId && needToTranslatePpId) {
-                    translatedRecord = new SAMProgramRecord(translatedId, record);
-                    translatedRecord.setAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG, translatedPpId);
-                } else if (needToTranslateId) {
-                    translatedRecord = new SAMProgramRecord(translatedId, record);
-                } else if (needToTranslatePpId) {
-                    translatedRecord = new SAMProgramRecord(id, record);
-                    translatedRecord.setAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG, translatedPpId);
-                }
-            }
-
-            if (translatedRecord != null) {
-                result.add(new HeaderRecordAndFileHeader<SAMProgramRecord>(translatedRecord, header));
-            } else {
-                result.add(pair); //keep the original record
-            }
-        }
-
-        return result;
-    }
-
-
-    /**
-     * Utility method for merging a List of AbstractSAMHeaderRecords. If it finds
-     * records that have identical ids and attributes, it will collapse them
-     * into one record. If it finds records that have identical ids but
-     * non-identical attributes, this is treated as a collision. When collision happens,
-     * the records' ids are remapped, and an old-id to new-id mapping is added to the idTranslationTable.
-     * <p/>
-     * NOTE: Non-collided records also get recorded in the idTranslationTable as
-     * old-id to old-id. This way, an idTranslationTable lookup should never return null.
-     *
-     * @param headerRecords          The header records to merge.
-     * @param headerRecordFactory    Constructs a specific subclass of AbstractSAMHeaderRecord.
-     * @param idsThatAreAlreadyTaken If the id of a headerRecord matches an id in this set, it will be treated as a collision, and the headRecord's id will be remapped.
-     * @param idTranslationTable     When records collide, their ids are remapped, and an old-id to new-id
-     *                               mapping is added to the idTranslationTable. Non-collided records also get recorded in the idTranslationTable as
-     *                               old-id to old-id. This way, an idTranslationTable lookup should never return null.
-     * @param result                 The list of merged header records.
-     * @return True if there were collisions.
-     */
-    private <RecordType extends AbstractSAMHeaderRecord> boolean mergeHeaderRecords(final List<HeaderRecordAndFileHeader<RecordType>> headerRecords, final HeaderRecordFactory<RecordType> headerRecordFactory,
-                                                                                    final HashSet<String> idsThatAreAlreadyTaken, final Map<SAMFileHeader, Map<String, String>> idTranslationTable, final List<RecordType> result) {
-
-        //The outer Map bins the header records by their ids. The nested Map further collapses
-        //header records which, in addition to having the same id, also have identical attributes.
-        //In other words, each key in the nested map represents one or more
-        //header records which have both identical ids and identical attributes. The List of
-        //SAMFileHeaders keeps track of which readers these header record(s) came from.
-        final Map<String, Map<RecordType, List<SAMFileHeader>>> idToRecord =
-                new LinkedHashMap<String, Map<RecordType, List<SAMFileHeader>>>();
-
-        //Populate the idToRecord and seenIds data structures
-        for (final HeaderRecordAndFileHeader<RecordType> pair : headerRecords) {
-            final RecordType record = pair.getHeaderRecord();
-            final SAMFileHeader header = pair.getFileHeader();
-            final String recordId = record.getId();
-            Map<RecordType, List<SAMFileHeader>> recordsWithSameId = idToRecord.get(recordId);
-            if (recordsWithSameId == null) {
-                recordsWithSameId = new LinkedHashMap<RecordType, List<SAMFileHeader>>();
-                idToRecord.put(recordId, recordsWithSameId);
-            }
-
-            List<SAMFileHeader> fileHeaders = recordsWithSameId.get(record);
-            if (fileHeaders == null) {
-                fileHeaders = new LinkedList<SAMFileHeader>();
-                recordsWithSameId.put(record, fileHeaders);
-            }
-
-            fileHeaders.add(header);
-        }
-
-        //Resolve any collisions between header records by remapping their ids.
-        boolean hasCollisions = false;
-        for (final Map.Entry<String, Map<RecordType, List<SAMFileHeader>>> entry : idToRecord.entrySet()) {
-            final String recordId = entry.getKey();
-            final Map<RecordType, List<SAMFileHeader>> recordsWithSameId = entry.getValue();
-
-
-            for (final Map.Entry<RecordType, List<SAMFileHeader>> recordWithUniqueAttr : recordsWithSameId.entrySet()) {
-                final RecordType record = recordWithUniqueAttr.getKey();
-                final List<SAMFileHeader> fileHeaders = recordWithUniqueAttr.getValue();
-
-                String newId;
-                if (!idsThatAreAlreadyTaken.contains(recordId)) {
-                    //don't remap 1st record. If there are more records
-                    //with this id, they will be remapped in the 'else'.
-                    newId = recordId;
-                    idsThatAreAlreadyTaken.add(recordId);
-                    ++recordCounter;
-                } else {
-                    //there is more than one record with this id.
-                    hasCollisions = true;
-
-                    //Below we tack on one of roughly 1.7 million possible 4 digit base36 at random we do this because
-                    //our old process of just counting from 0 upward and adding that to the previous id led to 1000s of hits on
-                    //idsThatAreAlreadyTaken.contains just to resolve 1 collision when merging 1000s of similarly processed bams
-                    while (idsThatAreAlreadyTaken.contains(newId = recordId + "." + positiveFourDigitBase36Str(recordCounter++))) ;
-
-                    idsThatAreAlreadyTaken.add(newId);
-                }
-
-                for (final SAMFileHeader fileHeader : fileHeaders) {
-                    Map<String, String> readerTranslationTable = idTranslationTable.get(fileHeader);
-                    if (readerTranslationTable == null) {
-                        readerTranslationTable = new HashMap<String, String>();
-                        idTranslationTable.put(fileHeader, readerTranslationTable);
-                    }
-                    readerTranslationTable.put(recordId, newId);
-                }
-
-                result.add(headerRecordFactory.createRecord(newId, record));
-            }
-        }
-
-        return hasCollisions;
-    }
-
-    /**
-     * Convert an integer to base36, protected solely for testing
-     *
-     * @param leftOver Both the initial value and the running quotient
-     * @return A four digit string composed of base 36 symbols
-     */
-    public static String positiveFourDigitBase36Str(int leftOver) {
-        if (leftOver == 0) {
-            return "0";
-        }
-
-        final StringBuilder builder = new StringBuilder(10);
-
-        while (leftOver > 0) {
-            final int valueIndex = leftOver % 36;
-            builder.append(INT_TO_BASE36[valueIndex]);
-            leftOver /= 36;
-        }
-
-        return builder.reverse().toString();
-    }
-
-
-    /**
-     * Get the sequences off the SAMFileHeader.  Throws runtime exception if the sequence
-     * are different from one another.
-     *
-     * @param headers headers to pull sequences from
-     * @return sequences from files.  Each file should have the same sequence
-     */
-    private SAMSequenceDictionary getSequenceDictionary(final Collection<SAMFileHeader> headers) {
-        SAMSequenceDictionary sequences = null;
-        for (final SAMFileHeader header : headers) {
-
-            if (sequences == null) {
-                sequences = header.getSequenceDictionary();
-            } else {
-                final SAMSequenceDictionary currentSequences = header.getSequenceDictionary();
-                SequenceUtil.assertSequenceDictionariesEqual(sequences, currentSequences);
-            }
-        }
-
-        return sequences;
-    }
-
-    /**
-     * Get the sequences from the SAMFileHeader, and merge the resulting sequence dictionaries.
-     *
-     * @param headers headers to pull sequences from
-     * @return sequences from files.  Each file should have the same sequence
-     */
-    private SAMSequenceDictionary mergeSequenceDictionaries(final Collection<SAMFileHeader> headers) {
-        SAMSequenceDictionary sequences = new SAMSequenceDictionary();
-        for (final SAMFileHeader header : headers) {
-            final SAMSequenceDictionary currentSequences = header.getSequenceDictionary();
-            sequences = mergeSequences(sequences, currentSequences);
-        }
-        // second pass, make a map of the original seqeunce id -> new sequence id
-        createSequenceMapping(headers, sequences);
-        return sequences;
-    }
-
-    /**
-     * They've asked to merge the sequence headers.  What we support right now is finding the sequence name superset.
-     *
-     * @param mergeIntoDict the result of merging so far.  All SAMSequenceRecords in here have been cloned from the originals.
-     * @param mergeFromDict A new sequence dictionary to merge into mergeIntoDict.
-     * @return A new sequence dictionary that resulting from merging the two inputs.
-     */
-    private SAMSequenceDictionary mergeSequences(final SAMSequenceDictionary mergeIntoDict, final SAMSequenceDictionary mergeFromDict) {
-
-        // a place to hold the sequences that we haven't found a home for, in the order the appear in mergeFromDict.
-        final LinkedList<SAMSequenceRecord> holder = new LinkedList<SAMSequenceRecord>();
-
-        // Return value will be created from this.
-        final LinkedList<SAMSequenceRecord> resultingDict = new LinkedList<SAMSequenceRecord>();
-        for (final SAMSequenceRecord sequenceRecord : mergeIntoDict.getSequences()) {
-            resultingDict.add(sequenceRecord);
-        }
-
-        // Index into resultingDict of previous SAMSequenceRecord from mergeFromDict that already existed in mergeIntoDict.
-        int prevloc = -1;
-        // Previous SAMSequenceRecord from mergeFromDict that already existed in mergeIntoDict.
-        SAMSequenceRecord previouslyMerged = null;
-
-        for (final SAMSequenceRecord sequenceRecord : mergeFromDict.getSequences()) {
-            // Does it already exist in resultingDict?
-            final int loc = getIndexOfSequenceName(resultingDict, sequenceRecord.getSequenceName());
-            if (loc == -1) {
-                // If doesn't already exist in resultingDict, save it an decide where to insert it later.
-                holder.add(sequenceRecord.clone());
-            } else if (prevloc > loc) {
-                // If sequenceRecord already exists in resultingDict, but prior to the previous one
-                // from mergeIntoDict that already existed, cannot merge.
-                throw new SAMException("Cannot merge sequence dictionaries because sequence " +
-                        sequenceRecord.getSequenceName() + " and " + previouslyMerged.getSequenceName() +
-                        " are in different orders in two input sequence dictionaries.");
-            } else {
-                // Since sequenceRecord already exists in resultingDict, don't need to add it.
-                // Add in all the sequences prior to it that have been held in holder.
-                resultingDict.addAll(loc, holder);
-                // Remember the index of sequenceRecord so can check for merge incompatibility.
-                prevloc = loc + holder.size();
-                previouslyMerged = sequenceRecord;
-                holder.clear();
-            }
-        }
-        // Append anything left in holder.
-        if (!holder.isEmpty()) {
-            resultingDict.addAll(holder);
-        }
-        return new SAMSequenceDictionary(resultingDict);
-    }
-
-    /**
-     * Find sequence in list.
-     *
-     * @param list         List to search for the sequence name.
-     * @param sequenceName Name to search for.
-     * @return Index of SAMSequenceRecord with the given name in list, or -1 if not found.
-     */
-    private static int getIndexOfSequenceName(final List<SAMSequenceRecord> list, final String sequenceName) {
-        for (int i = 0; i < list.size(); ++i) {
-            if (list.get(i).getSequenceName().equals(sequenceName)) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    /**
-     * create the sequence mapping.  This map is used to convert the unmerged header sequence ID's to the merged
-     * list of sequence id's.
-     *
-     * @param headers          the collections of headers.
-     * @param masterDictionary the superset dictionary we've created.
-     */
-    private void createSequenceMapping(final Collection<SAMFileHeader> headers, final SAMSequenceDictionary masterDictionary) {
-        final LinkedList<String> resultingDictStr = new LinkedList<>();
-        for (final SAMSequenceRecord r : masterDictionary.getSequences()) {
-            resultingDictStr.add(r.getSequenceName());
-        }
-        for (final SAMFileHeader header : headers) {
-            final Map<Integer, Integer> seqMap = new HashMap<>();
-            final SAMSequenceDictionary dict = header.getSequenceDictionary();
-            for (final SAMSequenceRecord rec : dict.getSequences()) {
-                seqMap.put(rec.getSequenceIndex(), resultingDictStr.indexOf(rec.getSequenceName()));
-            }
-            this.samSeqDictionaryIdTranslationViaHeader.put(header, seqMap);
-        }
-    }
-
-
-    /**
-     * Returns the read group id that should be used for the input read and RG id.
-     *
-     * @deprecated replaced by {@link #getReadGroupId(SAMFileHeader, String)}
-     */
-    @Deprecated
-    public String getReadGroupId(final SamReader reader, final String originalReadGroupId) {
-        return getReadGroupId(reader.getFileHeader(), originalReadGroupId);
-    }
-
-    /** Returns the read group id that should be used for the input read and RG id. */
-    public String getReadGroupId(final SAMFileHeader header, final String originalReadGroupId) {
-        return this.samReadGroupIdTranslation.get(header).get(originalReadGroupId);
-    }
-
-    /**
-     * @param reader                 one of the input files
-     * @param originalProgramGroupId a program group ID from the above input file
-     * @return new ID from the merged list of program groups in the output file
-     * @deprecated replaced by {@link #getProgramGroupId(SAMFileHeader, String)}
-     */
-    @Deprecated
-    public String getProgramGroupId(final SamReader reader, final String originalProgramGroupId) {
-        return getProgramGroupId(reader.getFileHeader(), originalProgramGroupId);
-    }
-
-    /**
-     * @param header                 one of the input headers
-     * @param originalProgramGroupId a program group ID from the above input file
-     * @return new ID from the merged list of program groups in the output file
-     */
-    public String getProgramGroupId(final SAMFileHeader header, final String originalProgramGroupId) {
-        return this.samProgramGroupIdTranslation.get(header).get(originalProgramGroupId);
-    }
-
-    /** Returns true if there are read group duplicates within the merged headers. */
-    public boolean hasReadGroupCollisions() {
-        return this.hasReadGroupCollisions;
-    }
-
-    /** Returns true if there are program group duplicates within the merged headers. */
-    public boolean hasProgramGroupCollisions() {
-        return hasProgramGroupCollisions;
-    }
-
-    /** @return if we've merged the sequence dictionaries, return true */
-    public boolean hasMergedSequenceDictionary() {
-        return hasMergedSequenceDictionary;
-    }
-
-    /** Returns the merged header that should be written to any output merged file. */
-    public SAMFileHeader getMergedHeader() {
-        return this.mergedHeader;
-    }
-
-    /**
-     * Returns the collection of readers that this header merger is working with. May return null.
-     *
-     * @deprecated replaced by {@link #getHeaders()}
-     */
-    @Deprecated
-    public Collection<SamReader> getReaders() {
-        return this.readers;
-    }
-
-    /**
-     * Returns the collection of readers that this header merger is working with.
-     */
-    public Collection<SAMFileHeader> getHeaders() {
-        return this.headers;
-    }
-
-    /**
-     * returns the new mapping for a specified reader, given it's old sequence index
-     *
-     * @param reader                    the reader
-     * @param oldReferenceSequenceIndex the old sequence (also called reference) index
-     * @return the new index value
-     * @deprecated replaced by {@link #getMergedSequenceIndex(SAMFileHeader, Integer)}
-     */
-    @Deprecated
-    public Integer getMergedSequenceIndex(final SamReader reader, final Integer oldReferenceSequenceIndex) {
-        return this.getMergedSequenceIndex(reader.getFileHeader(), oldReferenceSequenceIndex);
-    }
-
-    /**
-     * Another mechanism for getting the new sequence index, for situations in which the reader is not available.
-     * Note that if the SAMRecord has already had its header replaced with the merged header, this won't work.
-     *
-     * @param header                    The original header for the input record in question.
-     * @param oldReferenceSequenceIndex The original sequence index.
-     * @return the new index value that is compatible with the merged sequence index.
-     */
-    public Integer getMergedSequenceIndex(final SAMFileHeader header, final Integer oldReferenceSequenceIndex) {
-        final Map<Integer, Integer> mapping = this.samSeqDictionaryIdTranslationViaHeader.get(header);
-        if (mapping == null) {
-            throw new SAMException("No sequence dictionary mapping available for header: " + header);
-        }
-
-        final Integer newIndex = mapping.get(oldReferenceSequenceIndex);
-        if (newIndex == null) {
-            throw new SAMException("No mapping for reference index " + oldReferenceSequenceIndex + " from header: " + header);
-        }
-
-        return newIndex;
-    }
-
-
-    /**
-     * Implementations of this interface are used by mergeHeaderRecords(..) to instantiate
-     * specific subclasses of AbstractSAMHeaderRecord.
-     */
-    private interface HeaderRecordFactory<RecordType extends AbstractSAMHeaderRecord> {
-
-        /**
-         * Constructs a new instance of RecordType.
-         *
-         * @param id        The id of the new record.
-         * @param srcRecord Except for the id, the new record will be a copy of this source record.
-         */
-        RecordType createRecord(final String id, RecordType srcRecord);
-    }
-
-    /**
-     * Struct that groups together a subclass of AbstractSAMHeaderRecord with the
-     * SAMFileHeader that it came from.
-     */
-    private static class HeaderRecordAndFileHeader<RecordType extends AbstractSAMHeaderRecord> {
-        private final RecordType headerRecord;
-        private final SAMFileHeader samFileHeader;
-
-        public HeaderRecordAndFileHeader(final RecordType headerRecord, final SAMFileHeader samFileHeader) {
-            this.headerRecord = headerRecord;
-            this.samFileHeader = samFileHeader;
-        }
-
-        public RecordType getHeaderRecord() {
-            return headerRecord;
-        }
-
-        public SAMFileHeader getFileHeader() {
-            return samFileHeader;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SamFileValidator.java b/src/main/java/htsjdk/samtools/SamFileValidator.java
deleted file mode 100644
index e40bfe9..0000000
--- a/src/main/java/htsjdk/samtools/SamFileValidator.java
+++ /dev/null
@@ -1,872 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009-2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.SAMValidationError.Type;
-import htsjdk.samtools.BamIndexValidator.IndexValidationStringency;
-import htsjdk.samtools.metrics.MetricBase;
-import htsjdk.samtools.metrics.MetricsFile;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import htsjdk.samtools.reference.ReferenceSequenceFileWalker;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.FastqQualityFormat;
-import htsjdk.samtools.util.Histogram;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.ProgressLogger;
-import htsjdk.samtools.util.QualityEncodingDetector;
-import htsjdk.samtools.util.SequenceUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Validates SAM files as follows:
- * <ul>
- * <li>checks sam file header for sequence dictionary</li>
- * <li>checks sam file header for read groups</li>
- * <li>for each sam record
- * <ul>
- * <li>reports error detected by SAMRecord.isValid()</li>
- * <li>validates NM (nucleotide differences) exists and matches reality</li>
- * <li>validates mate fields agree with data in the mate record</li>
- * </ul>
- * </li>
- * </ul>
- *
- * @author Doug Voet
- * @see SAMRecord#isValid()
- */
-public class SamFileValidator {
-
-    private final static Log log = Log.getInstance(SamFileValidator.class);
-
-    private final PrintWriter out;
-    private Histogram<Type> errorsByType;
-    private PairEndInfoMap pairEndInfoByName;
-    private ReferenceSequenceFileWalker refFileWalker;
-    private boolean verbose;
-    private int maxVerboseOutput;
-    private SAMSortOrderChecker orderChecker;
-    private Set<Type> errorsToIgnore;
-    private boolean ignoreWarnings;
-    private boolean bisulfiteSequenced;
-    private IndexValidationStringency indexValidationStringency;
-    private boolean sequenceDictionaryEmptyAndNoWarningEmitted;
-
-    private final int maxTempFiles;
-
-    public SamFileValidator(final PrintWriter out, final int maxTempFiles) {
-        this.out = out;
-        this.maxTempFiles = maxTempFiles;
-        this.errorsByType = new Histogram<>();
-        this.refFileWalker = null;
-        this.maxVerboseOutput = 100;
-        this.indexValidationStringency = IndexValidationStringency.NONE;
-        this.errorsToIgnore = EnumSet.noneOf(Type.class);
-        this.verbose = false;
-        this.ignoreWarnings = false;
-        this.bisulfiteSequenced = false;
-        this.sequenceDictionaryEmptyAndNoWarningEmitted = false;
-    }
-
-    Histogram<Type> getErrorsByType() {
-        return errorsByType;
-    }
-
-    /**
-     * Sets one or more error types that should not be reported on.
-     */
-    public void setErrorsToIgnore(final Collection<Type> types) {
-        if (!types.isEmpty()) {
-            this.errorsToIgnore = EnumSet.copyOf(types);
-        }
-    }
-
-    public void setIgnoreWarnings(final boolean ignoreWarnings) {
-        this.ignoreWarnings = ignoreWarnings;
-    }
-
-    /**
-     * Outputs validation summary report to out.
-     *
-     * @param samReader records to validate
-     * @param reference if null, NM tag validation is skipped
-     * @return boolean  true if there are no validation errors, otherwise false
-     */
-    public boolean validateSamFileSummary(final SamReader samReader, final ReferenceSequenceFile reference) {
-        init(reference, samReader.getFileHeader());
-
-        validateSamFile(samReader, out);
-
-        boolean result = errorsByType.isEmpty();
-
-        if (errorsByType.getCount() > 0) {
-            // Convert to a histogram with String IDs so that WARNING: or ERROR: can be prepended to the error type.
-            final Histogram<String> errorsAndWarningsByType = new Histogram<>("Error Type", "Count");
-            for (final Histogram.Bin<Type> bin : errorsByType.values()) {
-                errorsAndWarningsByType.increment(bin.getId().getHistogramString(), bin.getValue());
-            }
-            final MetricsFile<ValidationMetrics, String> metricsFile = new MetricsFile<ValidationMetrics, String>();
-            errorsByType.setBinLabel("Error Type");
-            errorsByType.setValueLabel("Count");
-            metricsFile.setHistogram(errorsAndWarningsByType);
-            metricsFile.write(out);
-        }
-        cleanup();
-        return result;
-    }
-
-    /**
-     * Outputs validation error details to out.
-     *
-     * @param samReader records to validate
-     * @param reference if null, NM tag validation is skipped
-     *                  processing will stop after this threshold has been reached
-     * @return boolean  true if there are no validation errors, otherwise false
-     */
-    public boolean validateSamFileVerbose(final SamReader samReader, final ReferenceSequenceFile reference) {
-        init(reference, samReader.getFileHeader());
-
-        try {
-            validateSamFile(samReader, out);
-        } catch (MaxOutputExceededException e) {
-            out.println("Maximum output of [" + maxVerboseOutput + "] errors reached.");
-        }
-        boolean result = errorsByType.isEmpty();
-        cleanup();
-        return result;
-    }
-
-    public void validateBamFileTermination(final File inputFile) {
-        BufferedInputStream inputStream = null;
-        try {
-            inputStream = IOUtil.toBufferedStream(new FileInputStream(inputFile));
-            if (!BlockCompressedInputStream.isValidFile(inputStream)) {
-                return;
-            }
-            final BlockCompressedInputStream.FileTermination terminationState =
-                    BlockCompressedInputStream.checkTermination(inputFile);
-            if (terminationState.equals(BlockCompressedInputStream.FileTermination.DEFECTIVE)) {
-                addError(new SAMValidationError(Type.TRUNCATED_FILE, "BAM file has defective last gzip block",
-                        inputFile.getPath()));
-            } else if (terminationState.equals(BlockCompressedInputStream.FileTermination.HAS_HEALTHY_LAST_BLOCK)) {
-                addError(new SAMValidationError(Type.BAM_FILE_MISSING_TERMINATOR_BLOCK,
-                        "Older BAM file -- does not have terminator block",
-                        inputFile.getPath()));
-
-            }
-        } catch (IOException e) {
-            throw new SAMException("IOException", e);
-        } finally {
-            if (inputStream != null) {
-                CloserUtil.close(inputStream);
-            }
-        }
-    }
-
-    private void validateSamFile(final SamReader samReader, final PrintWriter out) {
-        try {
-            validateHeader(samReader.getFileHeader());
-            orderChecker = new SAMSortOrderChecker(samReader.getFileHeader().getSortOrder());
-            validateSamRecordsAndQualityFormat(samReader, samReader.getFileHeader());
-            validateUnmatchedPairs();
-            if (indexValidationStringency != IndexValidationStringency.NONE) {
-                try {
-                    if (indexValidationStringency == IndexValidationStringency.LESS_EXHAUSTIVE) {
-                        BamIndexValidator.lessExhaustivelyTestIndex(samReader);
-                    }
-                    else {
-                        BamIndexValidator.exhaustivelyTestIndex(samReader);
-                    }
-                } catch (Exception e) {
-                    addError(new SAMValidationError(Type.INVALID_INDEX_FILE_POINTER, e.getMessage(), null));
-                }
-            }
-
-            if (errorsByType.isEmpty()) {
-                out.println("No errors found");
-            }
-        } finally {
-            out.flush();
-        }
-    }
-
-
-    /**
-     * Report on reads marked as paired, for which the mate was not found.
-     */
-    private void validateUnmatchedPairs() {
-        final InMemoryPairEndInfoMap inMemoryPairMap;
-        if (pairEndInfoByName instanceof CoordinateSortedPairEndInfoMap) {
-            // For the coordinate-sorted map, need to detect mate pairs in which the mateReferenceIndex on one end
-            // does not match the readReference index on the other end, so the pairs weren't united and validated.
-            inMemoryPairMap = new InMemoryPairEndInfoMap();
-            CloseableIterator<Map.Entry<String, PairEndInfo>> it = ((CoordinateSortedPairEndInfoMap) pairEndInfoByName).iterator();
-            while (it.hasNext()) {
-                Map.Entry<String, PairEndInfo> entry = it.next();
-                PairEndInfo pei = inMemoryPairMap.remove(entry.getValue().readReferenceIndex, entry.getKey());
-                if (pei != null) {
-                    // Found a mismatch btw read.mateReferenceIndex and mate.readReferenceIndex
-                    List<SAMValidationError> errors = pei.validateMates(entry.getValue(), entry.getKey());
-                    for (final SAMValidationError error : errors) {
-                        addError(error);
-                    }
-                } else {
-                    // Mate not found.
-                    inMemoryPairMap.put(entry.getValue().mateReferenceIndex, entry.getKey(), entry.getValue());
-                }
-            }
-            it.close();
-        } else {
-            inMemoryPairMap = (InMemoryPairEndInfoMap) pairEndInfoByName;
-        }
-        // At this point, everything in InMemoryMap is a read marked as a pair, for which a mate was not found.
-        for (final Map.Entry<String, PairEndInfo> entry : inMemoryPairMap) {
-            addError(new SAMValidationError(Type.MATE_NOT_FOUND, "Mate not found for paired read", entry.getKey()));
-        }
-    }
-
-    /**
-     * SAM record and quality format validations are combined into a single method because validation must be completed
-     * in only a single pass of the SamRecords (because a SamReader's iterator() method may not return the same
-     * records on a subsequent call).
-     */
-    private void validateSamRecordsAndQualityFormat(final Iterable<SAMRecord> samRecords, final SAMFileHeader header) {
-        final SAMRecordIterator iter = (SAMRecordIterator) samRecords.iterator();
-        final ProgressLogger progress = new ProgressLogger(log, 10000000, "Validated Read");
-        final QualityEncodingDetector qualityDetector = new QualityEncodingDetector();
-        try {
-            while (iter.hasNext()) {
-                final SAMRecord record = iter.next();
-
-                qualityDetector.add(record);
-
-                final long recordNumber = progress.getCount() + 1;
-                final Collection<SAMValidationError> errors = record.isValid();
-                if (errors != null) {
-                    for (final SAMValidationError error : errors) {
-                        error.setRecordNumber(recordNumber);
-                        addError(error);
-                    }
-                }
-
-                validateMateFields(record, recordNumber);
-                final boolean hasValidSortOrder = validateSortOrder(record, recordNumber);
-                validateReadGroup(record, header);
-                final boolean cigarIsValid = validateCigar(record, recordNumber);
-                if (cigarIsValid) {
-                    try {
-                        validateNmTag(record, recordNumber);
-                    }
-                    catch (SAMException e) {
-                        if (hasValidSortOrder) {
-                            // If a CRAM file has an invalid sort order, the ReferenceFileWalker will throw a
-                            // SAMException due to an out of order request when retrieving reference bases during NM
-                            // tag validation; rethrow the exception only if the sort order is valid, otherwise
-                            // swallow the exception and carry on validating
-                            throw e;
-                        }
-                    }
-                }
-                validateSecondaryBaseCalls(record, recordNumber);
-                validateTags(record, recordNumber);
-                if (sequenceDictionaryEmptyAndNoWarningEmitted && !record.getReadUnmappedFlag()) {
-                    addError(new SAMValidationError(Type.MISSING_SEQUENCE_DICTIONARY, "Sequence dictionary is empty", null));
-                    sequenceDictionaryEmptyAndNoWarningEmitted = false;
-
-                }
-                progress.record(record);
-            }
-
-            try {
-                if (progress.getCount() > 0) { // Avoid exception being thrown as a result of no qualities being read
-                    final FastqQualityFormat format = qualityDetector.generateBestGuess(QualityEncodingDetector.FileContext.SAM, FastqQualityFormat.Standard);
-                    if (format != FastqQualityFormat.Standard) {
-                        addError(new SAMValidationError(Type.INVALID_QUALITY_FORMAT, String.format("Detected %s quality score encoding, but expected %s.", format, FastqQualityFormat.Standard), null));
-                    }
-                }
-            } catch (SAMException e) {
-                addError(new SAMValidationError(Type.INVALID_QUALITY_FORMAT, e.getMessage(), null));
-            }
-        } catch (SAMFormatException e) {
-            // increment record number because the iterator behind the SamReader
-            // reads one record ahead so we will get this failure one record ahead
-            final String msg = "SAMFormatException on record " + progress.getCount() + 1;
-            out.println(msg);
-            throw new SAMException(msg, e);
-        } catch (FileTruncatedException e) {
-            addError(new SAMValidationError(Type.TRUNCATED_FILE, "File is truncated", null));
-        } finally {
-            iter.close();
-        }
-    }
-
-    private void validateReadGroup(final SAMRecord record, final SAMFileHeader header) {
-        final SAMReadGroupRecord rg = record.getReadGroup();
-        if (rg == null) {
-            addError(new SAMValidationError(Type.RECORD_MISSING_READ_GROUP,
-                    "A record is missing a read group", record.getReadName()));
-        } else if (header.getReadGroup(rg.getId()) == null) {
-            addError(new SAMValidationError(Type.READ_GROUP_NOT_FOUND,
-                    "A record has a read group not found in the header: ",
-                    record.getReadName() + ", " + rg.getReadGroupId()));
-        }
-    }
-
-    /**
-     * Report error if a tag value is a Long.
-     */
-    private void validateTags(final SAMRecord record, final long recordNumber) {
-        for (final SAMRecord.SAMTagAndValue tagAndValue : record.getAttributes()) {
-            if (tagAndValue.value instanceof Long) {
-                addError(new SAMValidationError(Type.TAG_VALUE_TOO_LARGE,
-                        "Numeric value too large for tag " + tagAndValue.tag,
-                        record.getReadName(), recordNumber));
-            }
-        }
-    }
-
-    private void validateSecondaryBaseCalls(final SAMRecord record, final long recordNumber) {
-        final String e2 = (String) record.getAttribute(SAMTag.E2.name());
-        if (e2 != null) {
-            if (e2.length() != record.getReadLength()) {
-                addError(new SAMValidationError(Type.MISMATCH_READ_LENGTH_AND_E2_LENGTH,
-                        String.format("E2 tag length (%d) != read length (%d)", e2.length(), record.getReadLength()),
-                        record.getReadName(), recordNumber));
-            }
-            final byte[] bases = record.getReadBases();
-            final byte[] secondaryBases = StringUtil.stringToBytes(e2);
-            for (int i = 0; i < Math.min(bases.length, secondaryBases.length); ++i) {
-                if (SequenceUtil.isNoCall(bases[i]) || SequenceUtil.isNoCall(secondaryBases[i])) {
-                    continue;
-                }
-                if (SequenceUtil.basesEqual(bases[i], secondaryBases[i])) {
-                    addError(new SAMValidationError(Type.E2_BASE_EQUALS_PRIMARY_BASE,
-                            String.format("Secondary base call  (%c) == primary base call (%c)",
-                                    (char) secondaryBases[i], (char) bases[i]),
-                            record.getReadName(), recordNumber));
-                    break;
-                }
-            }
-        }
-        final String u2 = (String) record.getAttribute(SAMTag.U2.name());
-        if (u2 != null && u2.length() != record.getReadLength()) {
-            addError(new SAMValidationError(Type.MISMATCH_READ_LENGTH_AND_U2_LENGTH,
-                    String.format("U2 tag length (%d) != read length (%d)", u2.length(), record.getReadLength()),
-                    record.getReadName(), recordNumber));
-        }
-    }
-
-    private boolean validateCigar(final SAMRecord record, final long recordNumber) {
-        if (record.getReadUnmappedFlag()) {
-            return true;
-        }
-        return validateCigar(record, recordNumber, true);
-    }
-
-    private boolean validateMateCigar(final SAMRecord record, final long recordNumber) {
-        return validateCigar(record, recordNumber, false);
-    }
-
-    private boolean validateCigar(final SAMRecord record, final long recordNumber, final boolean isReadCigar) {
-        final ValidationStringency savedStringency = record.getValidationStringency();
-        record.setValidationStringency(ValidationStringency.LENIENT);
-        final List<SAMValidationError> errors = isReadCigar ? record.validateCigar(recordNumber) : SAMUtils.validateMateCigar(record, recordNumber);
-        record.setValidationStringency(savedStringency);
-        if (errors == null) {
-            return true;
-        }
-        boolean valid = true;
-        for (final SAMValidationError error : errors) {
-            addError(error);
-            valid = false;
-        }
-        return valid;
-    }
-
-
-    private boolean validateSortOrder(final SAMRecord record, final long recordNumber) {
-        final SAMRecord prev = orderChecker.getPreviousRecord();
-        boolean isValidSortOrder = orderChecker.isSorted(record);
-        if (!isValidSortOrder) {
-            addError(new SAMValidationError(
-                    Type.RECORD_OUT_OF_ORDER,
-                    String.format(
-                            "The record is out of [%s] order, prior read name [%s], prior coodinates [%d:%d]",
-                            record.getHeader().getSortOrder().name(),
-                            prev.getReadName(),
-                            prev.getReferenceIndex(),
-                            prev.getAlignmentStart()),
-                    record.getReadName(),
-                    recordNumber));
-        }
-        return isValidSortOrder;
-    }
-
-    private void init(final ReferenceSequenceFile reference, final SAMFileHeader header) {
-        if (header.getSortOrder() == SAMFileHeader.SortOrder.coordinate) {
-            this.pairEndInfoByName = new CoordinateSortedPairEndInfoMap();
-        } else {
-            this.pairEndInfoByName = new InMemoryPairEndInfoMap();
-        }
-        if (reference != null) {
-            this.refFileWalker = new ReferenceSequenceFileWalker(reference);
-        }
-    }
-
-    private void cleanup() {
-        this.errorsByType = null;
-        this.pairEndInfoByName = null;
-        this.refFileWalker = null;
-    }
-
-    private void validateNmTag(final SAMRecord record, final long recordNumber) {
-        if (!record.getReadUnmappedFlag()) {
-            final Integer tagNucleotideDiffs = record.getIntegerAttribute(ReservedTagConstants.NM);
-            if (tagNucleotideDiffs == null) {
-                addError(new SAMValidationError(
-                        Type.MISSING_TAG_NM,
-                        "NM tag (nucleotide differences) is missing",
-                        record.getReadName(),
-                        recordNumber));
-            } else if (refFileWalker != null) {
-                final ReferenceSequence refSequence = refFileWalker.get(record.getReferenceIndex());
-                final int actualNucleotideDiffs = SequenceUtil.calculateSamNmTag(record, refSequence.getBases(),
-                        0, isBisulfiteSequenced());
-
-                if (!tagNucleotideDiffs.equals(actualNucleotideDiffs)) {
-                    addError(new SAMValidationError(
-                            Type.INVALID_TAG_NM,
-                            "NM tag (nucleotide differences) in file [" + tagNucleotideDiffs +
-                                    "] does not match reality [" + actualNucleotideDiffs + "]",
-                            record.getReadName(),
-                            recordNumber));
-                }
-            }
-        }
-    }
-
-    private void validateMateFields(final SAMRecord record, final long recordNumber) {
-        if (!record.getReadPairedFlag() || record.isSecondaryOrSupplementary()) {
-            return;
-        }
-        validateMateCigar(record, recordNumber);
-
-        final PairEndInfo pairEndInfo = pairEndInfoByName.remove(record.getReferenceIndex(), record.getReadName());
-        if (pairEndInfo == null) {
-            pairEndInfoByName.put(record.getMateReferenceIndex(), record.getReadName(), new PairEndInfo(record, recordNumber));
-        } else {
-            final List<SAMValidationError> errors =
-                    pairEndInfo.validateMates(new PairEndInfo(record, recordNumber), record.getReadName());
-            for (final SAMValidationError error : errors) {
-                addError(error);
-            }
-        }
-    }
-
-    private void validateHeader(final SAMFileHeader fileHeader) {
-        for (final SAMValidationError error : fileHeader.getValidationErrors()) {
-            addError(error);
-        }
-        if (fileHeader.getVersion() == null) {
-            addError(new SAMValidationError(Type.MISSING_VERSION_NUMBER, "Header has no version number", null));
-        } else if (!SAMFileHeader.ACCEPTABLE_VERSIONS.contains(fileHeader.getVersion())) {
-            addError(new SAMValidationError(Type.INVALID_VERSION_NUMBER, "Header version: " +
-                    fileHeader.getVersion() + " does not match any of the acceptable versions: " +
-                    StringUtil.join(", ", SAMFileHeader.ACCEPTABLE_VERSIONS.toArray(new String[0])),
-                    null));
-        }
-        if (fileHeader.getSequenceDictionary().isEmpty()) {
-            sequenceDictionaryEmptyAndNoWarningEmitted = true;
-        }
-        if (fileHeader.getReadGroups().isEmpty()) {
-            addError(new SAMValidationError(Type.MISSING_READ_GROUP, "Read groups is empty", null));
-        }
-        final List<SAMProgramRecord> pgs = fileHeader.getProgramRecords();
-        for (int i = 0; i < pgs.size() - 1; i++) {
-            for (int j = i + 1; j < pgs.size(); j++) {
-                if (pgs.get(i).getProgramGroupId().equals(pgs.get(j).getProgramGroupId())) {
-                    addError(new SAMValidationError(Type.DUPLICATE_PROGRAM_GROUP_ID, "Duplicate " +
-                            "program group id: " + pgs.get(i).getProgramGroupId(), null));
-                }
-            }
-        }
-
-        final List<SAMReadGroupRecord> rgs = fileHeader.getReadGroups();
-        final Set<String> readGroupIDs = new HashSet<String>();
-
-        for (final SAMReadGroupRecord record : rgs) {
-            final String readGroupID = record.getReadGroupId();
-            if (readGroupIDs.contains(readGroupID)) {
-                addError(new SAMValidationError(Type.DUPLICATE_READ_GROUP_ID, "Duplicate " +
-                        "read group id: " + readGroupID, null));
-            } else {
-                readGroupIDs.add(readGroupID);
-            }
-
-            final String platformValue = record.getPlatform();
-            if (platformValue == null || "".equals(platformValue)) {
-                addError(new SAMValidationError(Type.MISSING_PLATFORM_VALUE,
-                        "A platform (PL) attribute was not found for read group ",
-                        readGroupID));
-            }
-            else { 
-                // NB: cannot be null, so not catching a NPE
-                try {
-                    SAMReadGroupRecord.PlatformValue.valueOf(platformValue.toUpperCase());
-                } catch (IllegalArgumentException e) {
-                    addError(new SAMValidationError(Type.INVALID_PLATFORM_VALUE, 
-                            "The platform (PL) attribute (" + platformValue + ") + was not one of the valid values for read group ",
-                            readGroupID));
-                }
-            }
-        }
-    }
-
-    private void addError(final SAMValidationError error) {
-        // Just ignore an error if it's of a type we're not interested in
-        if (this.errorsToIgnore.contains(error.getType())) return;
-
-        if (this.ignoreWarnings && error.getType().severity == SAMValidationError.Severity.WARNING) return;
-
-        this.errorsByType.increment(error.getType());
-        if (verbose) {
-            out.println(error);
-            out.flush();
-            if (this.errorsByType.getCount() >= maxVerboseOutput) {
-                throw new MaxOutputExceededException();
-            }
-        }
-    }
-
-    /**
-     * Control verbosity
-     *
-     * @param verbose          True in order to emit a message per error or warning.
-     * @param maxVerboseOutput If verbose, emit no more than this many messages.  Ignored if !verbose.
-     */
-    public void setVerbose(final boolean verbose, final int maxVerboseOutput) {
-        this.verbose = verbose;
-        this.maxVerboseOutput = maxVerboseOutput;
-    }
-
-    public boolean isBisulfiteSequenced() {
-        return bisulfiteSequenced;
-    }
-
-    public void setBisulfiteSequenced(boolean bisulfiteSequenced) {
-        this.bisulfiteSequenced = bisulfiteSequenced;
-    }
-
-    /**
-     * @deprecated use {@link #setIndexValidationStringency} instead
-     */
-    @Deprecated
-    public SamFileValidator setValidateIndex(final boolean validateIndex) {
-        // The SamReader must also have IndexCaching enabled to have the index validated,
-        return this.setIndexValidationStringency(validateIndex ? IndexValidationStringency.EXHAUSTIVE : IndexValidationStringency.NONE);
-    }
-
-    public SamFileValidator setIndexValidationStringency(final IndexValidationStringency stringency) {
-        this.indexValidationStringency = stringency;
-        return this;
-    }
-
-    public static class ValidationMetrics extends MetricBase {
-    }
-
-    /**
-     * This class is used so we don't have to store the entire SAMRecord in memory while we wait
-     * to find a record's mate and also to store the record number.
-     */
-    private static class PairEndInfo {
-        private final int readAlignmentStart;
-        private final int readReferenceIndex;
-        private final boolean readNegStrandFlag;
-        private final boolean readUnmappedFlag;
-        private final String readCigarString;
-
-        private final int mateAlignmentStart;
-        private final int mateReferenceIndex;
-        private final boolean mateNegStrandFlag;
-        private final boolean mateUnmappedFlag;
-        private final String mateCigarString;
-
-        private final boolean firstOfPairFlag;
-
-        private final long recordNumber;
-
-        public PairEndInfo(final SAMRecord record, final long recordNumber) {
-            this.recordNumber = recordNumber;
-
-            this.readAlignmentStart = record.getAlignmentStart();
-            this.readNegStrandFlag = record.getReadNegativeStrandFlag();
-            this.readReferenceIndex = record.getReferenceIndex();
-            this.readUnmappedFlag = record.getReadUnmappedFlag();
-            this.readCigarString = record.getCigarString();
-
-            this.mateAlignmentStart = record.getMateAlignmentStart();
-            this.mateNegStrandFlag = record.getMateNegativeStrandFlag();
-            this.mateReferenceIndex = record.getMateReferenceIndex();
-            this.mateUnmappedFlag = record.getMateUnmappedFlag();
-            final Object mcs = record.getAttribute(SAMTag.MC.name());
-            this.mateCigarString = (mcs != null) ? (String) mcs : null;
-
-            this.firstOfPairFlag = record.getFirstOfPairFlag();
-        }
-
-        private PairEndInfo(int readAlignmentStart, int readReferenceIndex, boolean readNegStrandFlag, boolean readUnmappedFlag,
-                            String readCigarString,
-                            int mateAlignmentStart, int mateReferenceIndex, boolean mateNegStrandFlag, boolean mateUnmappedFlag,
-                            String mateCigarString,
-                            boolean firstOfPairFlag, long recordNumber) {
-            this.readAlignmentStart = readAlignmentStart;
-            this.readReferenceIndex = readReferenceIndex;
-            this.readNegStrandFlag = readNegStrandFlag;
-            this.readUnmappedFlag = readUnmappedFlag;
-            this.readCigarString = readCigarString;
-            this.mateAlignmentStart = mateAlignmentStart;
-            this.mateReferenceIndex = mateReferenceIndex;
-            this.mateNegStrandFlag = mateNegStrandFlag;
-            this.mateUnmappedFlag = mateUnmappedFlag;
-            this.mateCigarString = mateCigarString;
-            this.firstOfPairFlag = firstOfPairFlag;
-            this.recordNumber = recordNumber;
-        }
-
-        public List<SAMValidationError> validateMates(final PairEndInfo mate, final String readName) {
-            final List<SAMValidationError> errors = new ArrayList<SAMValidationError>();
-            validateMateFields(this, mate, readName, errors);
-            validateMateFields(mate, this, readName, errors);
-            // Validations that should not be repeated on both ends
-            if (this.firstOfPairFlag == mate.firstOfPairFlag) {
-                final String whichEnd = this.firstOfPairFlag ? "first" : "second";
-                errors.add(new SAMValidationError(
-                        Type.MATES_ARE_SAME_END,
-                        "Both mates are marked as " + whichEnd + " of pair",
-                        readName,
-                        this.recordNumber
-                ));
-            }
-            return errors;
-        }
-
-        private void validateMateFields(final PairEndInfo end1, final PairEndInfo end2, final String readName, final List<SAMValidationError> errors) {
-            if (end1.mateAlignmentStart != end2.readAlignmentStart) {
-                errors.add(new SAMValidationError(
-                        Type.MISMATCH_MATE_ALIGNMENT_START,
-                        "Mate alignment does not match alignment start of mate",
-                        readName,
-                        end1.recordNumber));
-            }
-            if (end1.mateNegStrandFlag != end2.readNegStrandFlag) {
-                errors.add(new SAMValidationError(
-                        Type.MISMATCH_FLAG_MATE_NEG_STRAND,
-                        "Mate negative strand flag does not match read negative strand flag of mate",
-                        readName,
-                        end1.recordNumber));
-            }
-            if (end1.mateReferenceIndex != end2.readReferenceIndex) {
-                errors.add(new SAMValidationError(
-                        Type.MISMATCH_MATE_REF_INDEX,
-                        "Mate reference index (MRNM) does not match reference index of mate",
-                        readName,
-                        end1.recordNumber));
-            }
-            if (end1.mateUnmappedFlag != end2.readUnmappedFlag) {
-                errors.add(new SAMValidationError(
-                        Type.MISMATCH_FLAG_MATE_UNMAPPED,
-                        "Mate unmapped flag does not match read unmapped flag of mate",
-                        readName,
-                        end1.recordNumber));
-            }
-            if ((end1.mateCigarString != null) && (!end1.mateCigarString.equals(end2.readCigarString))) {
-                errors.add(new SAMValidationError(
-                        Type.MISMATCH_MATE_CIGAR_STRING,
-                        "Mate CIGAR string does not match CIGAR string of mate",
-                        readName,
-                        end1.recordNumber));
-            }
-            // Note - don't need to validate that the mateCigarString is a valid cigar string, since this
-            // will be validated by validateCigar on the mate's record itself.
-        }
-    }
-
-    /**
-     * Thrown in addError indicating that maxVerboseOutput has been exceeded and processing should stop
-     */
-    private static class MaxOutputExceededException extends SAMException {
-        MaxOutputExceededException() {
-            super("maxVerboseOutput exceeded.");
-        }
-    }
-
-    interface PairEndInfoMap extends Iterable<Map.Entry<String, PairEndInfo>> {
-        void put(int mateReferenceIndex, String key, PairEndInfo value);
-
-        PairEndInfo remove(int mateReferenceIndex, String key);
-
-        CloseableIterator<Map.Entry<String, PairEndInfo>> iterator();
-    }
-
-    private class CoordinateSortedPairEndInfoMap implements PairEndInfoMap {
-        private final CoordinateSortedPairInfoMap<String, PairEndInfo> onDiskMap =
-                new CoordinateSortedPairInfoMap<String, PairEndInfo>(maxTempFiles, new Codec());
-
-        public void put(int mateReferenceIndex, String key, PairEndInfo value) {
-            onDiskMap.put(mateReferenceIndex, key, value);
-        }
-
-        public PairEndInfo remove(int mateReferenceIndex, String key) {
-            return onDiskMap.remove(mateReferenceIndex, key);
-        }
-
-        public CloseableIterator<Map.Entry<String, PairEndInfo>> iterator() {
-            return onDiskMap.iterator();
-        }
-
-        private class Codec implements CoordinateSortedPairInfoMap.Codec<String, PairEndInfo> {
-            private DataInputStream in;
-            private DataOutputStream out;
-
-            public void setOutputStream(final OutputStream os) {
-                this.out = new DataOutputStream(os);
-            }
-
-            public void setInputStream(final InputStream is) {
-                this.in = new DataInputStream(is);
-            }
-
-            public void encode(final String key, final PairEndInfo record) {
-                try {
-                    out.writeUTF(key);
-                    out.writeInt(record.readAlignmentStart);
-                    out.writeInt(record.readReferenceIndex);
-                    out.writeBoolean(record.readNegStrandFlag);
-                    out.writeBoolean(record.readUnmappedFlag);
-                    out.writeUTF(record.readCigarString);
-                    out.writeInt(record.mateAlignmentStart);
-                    out.writeInt(record.mateReferenceIndex);
-                    out.writeBoolean(record.mateNegStrandFlag);
-                    out.writeBoolean(record.mateUnmappedFlag);
-                    // writeUTF can't take null, so store a null mateCigarString as an empty string
-                    out.writeUTF(record.mateCigarString != null ? record.mateCigarString : "");
-                    out.writeBoolean(record.firstOfPairFlag);
-                    out.writeLong(record.recordNumber);
-                } catch (IOException e) {
-                    throw new SAMException("Error spilling PairInfo to disk", e);
-                }
-            }
-
-            public Map.Entry<String, PairEndInfo> decode() {
-                try {
-                    final String key = in.readUTF();
-                    final int readAlignmentStart = in.readInt();
-                    final int readReferenceIndex = in.readInt();
-                    final boolean readNegStrandFlag = in.readBoolean();
-                    final boolean readUnmappedFlag = in.readBoolean();
-                    final String readCigarString = in.readUTF();
-
-                    final int mateAlignmentStart = in.readInt();
-                    final int mateReferenceIndex = in.readInt();
-                    final boolean mateNegStrandFlag = in.readBoolean();
-                    final boolean mateUnmappedFlag = in.readBoolean();
-
-                    // read mateCigarString - note that null value is stored as an empty string
-                    final String mcs = in.readUTF();
-                    final String mateCigarString = !mcs.isEmpty() ? mcs : null;
-
-                    final boolean firstOfPairFlag = in.readBoolean();
-
-                    final long recordNumber = in.readLong();
-                    final PairEndInfo rec = new PairEndInfo(readAlignmentStart, readReferenceIndex, readNegStrandFlag,
-                            readUnmappedFlag, readCigarString, mateAlignmentStart, mateReferenceIndex, mateNegStrandFlag,
-                            mateUnmappedFlag, mateCigarString,
-                            firstOfPairFlag, recordNumber);
-                    return new AbstractMap.SimpleEntry(key, rec);
-                } catch (IOException e) {
-                    throw new SAMException("Error reading PairInfo from disk", e);
-                }
-            }
-        }
-    }
-
-    private static class InMemoryPairEndInfoMap implements PairEndInfoMap {
-        private final Map<String, PairEndInfo> map = new HashMap<String, PairEndInfo>();
-
-        public void put(int mateReferenceIndex, String key, PairEndInfo value) {
-            if (mateReferenceIndex != value.mateReferenceIndex)
-                throw new IllegalArgumentException("mateReferenceIndex does not agree with PairEndInfo");
-            map.put(key, value);
-        }
-
-        public PairEndInfo remove(int mateReferenceIndex, String key) {
-            return map.remove(key);
-        }
-
-        public CloseableIterator<Map.Entry<String, PairEndInfo>> iterator() {
-            final Iterator<Map.Entry<String, PairEndInfo>> it = map.entrySet().iterator();
-            return new CloseableIterator<Map.Entry<String, PairEndInfo>>() {
-                public void close() {
-                    // do nothing
-                }
-
-                public boolean hasNext() {
-                    return it.hasNext();
-                }
-
-                public Map.Entry<String, PairEndInfo> next() {
-                    return it.next();
-                }
-
-                public void remove() {
-                    it.remove();
-                }
-            };
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SamFiles.java b/src/main/java/htsjdk/samtools/SamFiles.java
deleted file mode 100644
index 874fc10..0000000
--- a/src/main/java/htsjdk/samtools/SamFiles.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.cram.build.CramIO;
-
-import htsjdk.samtools.util.Log;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-/**
- * @author mccowan
- */
-public class SamFiles {
-
-    private final static Log LOG = Log.getInstance(SamFiles.class);
-
-    /**
-     * Finds the index file associated with the provided SAM file.  The index file must exist and be reachable to be found.
-     *
-     * If the file is a symlink and the index cannot be found, try to unsymlink the file and look for the bai in the actual file path.
-     *
-     * @return The index for the provided SAM, or null if one was not found.
-     */
-    public static File findIndex(final File samFile) {
-        Path path = findIndex(samFile.toPath());
-        return path == null ? null : path.toFile();
-    }
-
-    /**
-     * Finds the index file associated with the provided SAM file.  The index file must exist and be reachable to be found.
-     *
-     * If the file is a symlink and the index cannot be found, try to unsymlink the file and look for the bai in the actual file path.
-     *
-     * @return The index for the provided SAM, or null if one was not found.
-     */
-    public static Path findIndex(final Path samPath) {
-        final Path indexPath = lookForIndex(samPath); //try to find the index
-        if (indexPath == null) {
-            return unsymlinkAndLookForIndex(samPath);
-        } else {
-            return indexPath;
-        }
-    }
-
-    /**
-     * resolve the canonical path of samFile and attempt to find an index there.
-     * @return an index file or null if no index is found.
-     */
-    private static Path unsymlinkAndLookForIndex(Path samPath) {
-        try {
-            final Path canonicalSamPath = samPath.toRealPath(); // resolve symbolic links
-            final Path canonicalIndexPath = lookForIndex(canonicalSamPath);
-            if ( canonicalIndexPath != null) {
-                LOG.warn("The index file " + canonicalIndexPath.toAbsolutePath()
-                        + " was found by resolving the canonical path of a symlink: "
-                        + samPath.toAbsolutePath() + " -> " + samPath.toRealPath());
-            }
-            return canonicalIndexPath;
-        } catch (IOException e) {
-            return null;
-        }
-    }
-
-    private static Path lookForIndex(final Path samPath) {// If input is foo.bam, look for foo.bai
-        Path indexPath;
-        final String fileName = samPath.getFileName().toString(); // works for all path types (e.g. HDFS)
-        if (fileName.endsWith(BamFileIoUtils.BAM_FILE_EXTENSION)) {
-            final String bai = fileName.substring(0, fileName.length() - BamFileIoUtils.BAM_FILE_EXTENSION.length()) + BAMIndex.BAMIndexSuffix;
-            indexPath = samPath.resolveSibling(bai);
-            if (Files.isRegularFile(indexPath)) { // works for all path types (e.g. HDFS)
-                return indexPath;
-            }
-
-
-        } else if (fileName.endsWith(CramIO.CRAM_FILE_EXTENSION)) {
-            final String crai = fileName.substring(0, fileName.length() - CramIO.CRAM_FILE_EXTENSION.length()) + CRAIIndex.CRAI_INDEX_SUFFIX;
-            indexPath = samPath.resolveSibling(crai);
-            if (Files.isRegularFile(indexPath)) {
-                return indexPath;
-            }
-
-            indexPath = samPath.resolveSibling(fileName + CRAIIndex.CRAI_INDEX_SUFFIX);
-            if (Files.isRegularFile(indexPath)) {
-                return indexPath;
-            }
-        }
-
-        // If foo.bai doesn't exist look for foo.bam.bai or foo.cram.bai
-        indexPath = samPath.resolveSibling(fileName + BAMIndex.BAMIndexSuffix);
-        if (Files.isRegularFile(indexPath)) {
-            return indexPath;
-        }
-
-        return null;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SamFlagField.java b/src/main/java/htsjdk/samtools/SamFlagField.java
deleted file mode 100644
index 82f2a29..0000000
--- a/src/main/java/htsjdk/samtools/SamFlagField.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Nils Homer
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-/**
- * This determines how flag fields are represented in the SAM file.
- *
- * In a string FLAG, each character represents one bit with
- * p=0x1 (paired), P=0x2 (properly paired), u=0x4 (unmapped),
- * U=0x8 (mate unmapped), r=0x10 (reverse), R=0x20 (mate reverse)
- * 1=0x40 (first), 2=0x80 (second), s=0x100 (not primary), 
- * x=0x200 (failure), d=0x400 (duplicate), and S=0x800 (secondary).
- * This was inspired by 'samtools view -X'.
- *
- * We also output a character when the following bits *are not* set:
- * m=0x4 (mapped), M=0x8 (mate mapped), f=0x10 (forward), F=0x20 
- * (mate forward).
- * 
- * @author nhomer
- */
-public enum SamFlagField {
-    NONE {
-        @Override
-        public String format(final int flag) {
-            throw new SAMFormatException("NONE not allowed for the SamFlagField when writing the SAM flag field.");
-        }
-        @Override
-        protected int parseWithoutValidation(final String flag) {
-            throw new SAMFormatException("NONE not allowed for the SamFlagField when reading the SAM flag field.");
-        } 
-    },
-    DECIMAL {
-        @Override
-        public String format(final int flag) {
-            return Integer.toString(flag);
-        }
-        /** Throws NumberFormatException if it can't parse the flag **/
-        @Override
-        protected int parseWithoutValidation(final String flag) {
-            return Integer.parseInt(flag);
-        }
-    },
-    HEXADECIMAL {
-        @Override
-        public String format(final int flag) {
-            return String.format("%#x", flag);
-        }
-        @Override
-        protected int parseWithoutValidation(final String flag) {
-            return Integer.valueOf(flag.substring(2), 16);
-        }
-    },
-    OCTAL {
-        @Override
-        public String format(final int flag) {
-            return String.format("%#o", flag);
-        }
-        @Override
-        protected int parseWithoutValidation(final String flag) {
-            return Integer.valueOf(flag, 8);
-        }
-    },
-    STRING {
-        /*
-        It is important that the first character of a string does not start with a digit, so we can
-        determine which format given an input flag value.  See of.
-         */
-
-        @Override
-        public String format(final int flag) {
-            // Adapted from the the implementation here:
-            //   https://github.com/jmarshall/cansam/blob/master/lib/alignment.cpp
-            final StringBuilder value = new StringBuilder();
-
-            if ((flag & SAMFlag.READ_UNMAPPED.flag) != 0)                   value.append('u');
-            else                                                            value.append('m');
-
-            if ((flag & SAMFlag.READ_REVERSE_STRAND.flag) != 0)             value.append('r');
-            else if ((flag & SAMFlag.READ_UNMAPPED.flag) == 0)              value.append('f');
-
-            if ((flag & SAMFlag.MATE_UNMAPPED.flag) != 0)                   value.append('U');
-            else if ((flag & SAMFlag.READ_PAIRED.flag) != 0)                value.append('M');
-
-            if ((flag & SAMFlag.MATE_REVERSE_STRAND.flag) != 0)             value.append('R');
-            else if ((flag & SAMFlag.READ_PAIRED.flag) != 0)                value.append('F');
-
-            if ((flag & SAMFlag.READ_PAIRED.flag) != 0)                     value.append('p');
-            if ((flag & SAMFlag.PROPER_PAIR.flag) != 0)                     value.append('P');
-            if ((flag & SAMFlag.FIRST_OF_PAIR.flag) != 0)                   value.append('1');
-            if ((flag & SAMFlag.SECOND_OF_PAIR.flag) != 0)                  value.append('2');
-
-            if ((flag & SAMFlag.NOT_PRIMARY_ALIGNMENT.flag) != 0)           value.append('s');
-            if ((flag & SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag) != 0)         value.append('S');
-            if ((flag & SAMFlag.READ_FAILS_VENDOR_QUALITY_CHECK.flag) != 0) value.append('x');
-            if ((flag & SAMFlag.DUPLICATE_READ.flag) != 0)                  value.append('d');
-
-            return value.toString();
-        }
-
-        @Override
-        protected int parseWithoutValidation(final String flag) {
-            SamFlagField.validate(flag, STRING);
-
-            // Adapted from the the implementation here:
-            //   https://github.com/jmarshall/cansam/blob/master/lib/alignment.cpp
-
-            int value = 0;
-
-            for (int i = 0; i < flag.length(); i++) {
-                switch (flag.charAt(i)) {
-                    case 'p':  value |= SAMFlag.READ_PAIRED.flag;  break;
-                    case 'P':  value |= SAMFlag.PROPER_PAIR.flag;  break;
-                    case 'u':  value |= SAMFlag.READ_UNMAPPED.flag;  break;
-                    case 'U':  value |= SAMFlag.MATE_UNMAPPED.flag;  break;
-                    case 'r':  value |= SAMFlag.READ_REVERSE_STRAND.flag;  break;
-                    case 'R':  value |= SAMFlag.MATE_REVERSE_STRAND.flag;  break;
-                    case '1':  value |= SAMFlag.FIRST_OF_PAIR.flag;  break;
-                    case '2':  value |= SAMFlag.SECOND_OF_PAIR.flag;  break;
-                    case 's':  value |= SAMFlag.NOT_PRIMARY_ALIGNMENT.flag;  break;
-                    case 'x':  value |= SAMFlag.READ_FAILS_VENDOR_QUALITY_CHECK.flag;  break;
-                    case 'd':  value |= SAMFlag.DUPLICATE_READ.flag;  break;
-                    case 'S':  value |= SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag;  break;
-                    case 'f':
-                    case 'F':
-                    case 'm':
-                    case 'M':
-                    case '_':
-                        break;
-                    default:
-                        throw new SAMFormatException("Unknown flag character '" + flag.charAt(i) + "' in flag '" + flag + "'");
-                }
-            }
-
-            return value;
-        }
-    };
-
-    /** Returns the string associated with this flag field. */
-    abstract public String format(final int flag);
-
-    /** Parses the flag.  Validates that the flag is of the correct type. */
-    public final int parse(final String flag) {
-        return parse(flag, true);
-    }
-
-    /** Infers the format from the flag string and parses the flag. */
-    public static int parseDefault(final String flag) {
-        return SamFlagField.of(flag).parse(flag, false);
-    }
-
-    /** Performs the actual parsing based on the radix.  No validation that the flag is of the correct radix
-     * should be performed.
-     */
-    abstract protected int parseWithoutValidation(final String flag);
-
-    /** Parses the flag.  Performs optional validation that the flag is of the correct type. */
-    private int parse(final String flag, final boolean withValidation) {
-        if (withValidation) SamFlagField.validate(flag, this);
-        return parseWithoutValidation(flag);
-    }
-
-    /**
-     * Returns the type of flag field for this string.  This does not guarantee it is of the flag field,
-     * as it only checks the first two characters.
-     */
-    public static SamFlagField of(final String s) {
-        if (s.isEmpty()) throw new SAMFormatException("Could not determine flag field type; saw an empty flag field");
-        else if (s.startsWith("0x")) return HEXADECIMAL;
-        else if (s.startsWith("0X")) return HEXADECIMAL;
-        else if (s.startsWith("0") && s.length() > 1) return OCTAL;
-        else if (Character.isDigit(s.charAt(0))) return DECIMAL;
-        else return STRING;
-    }
-
-    private static void validate(final String flag, final SamFlagField expectedField) {
-        final SamFlagField actualField = SamFlagField.of(flag);
-        if (actualField != expectedField) {
-            throw new SAMFormatException(expectedField.name() + " sam flag must start with [1-9] but found '" + flag + "' (" + actualField.name() + ")");
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/SamIndexes.java b/src/main/java/htsjdk/samtools/SamIndexes.java
deleted file mode 100644
index a888811..0000000
--- a/src/main/java/htsjdk/samtools/SamIndexes.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.seekablestream.SeekableBufferedStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * A helper class to read BAI and CRAI indexes. Main goal is to provide BAI stream as a sort of common API for all index types.
- * <p/>
- * Created by vadim on 14/08/2015.
- */
-public enum SamIndexes {
-    BAI(BAMIndex.BAMIndexSuffix, "BAI\1".getBytes()),
-    // CRAI is gzipped text, so it's magic is same as {@link java.util.zip.GZIPInputStream.GZIP_MAGIC}
-    CRAI(CRAIIndex.CRAI_INDEX_SUFFIX, new byte[]{(byte) 0x1f, (byte) 0x8b});
-
-    public final String fileNameSuffix;
-    public final byte[] magic;
-
-    SamIndexes(final String fileNameSuffix, final byte[] magic) {
-        this.fileNameSuffix = fileNameSuffix;
-        this.magic = magic;
-    }
-
-    public static InputStream openIndexFileAsBaiOrNull(final File file, final SAMSequenceDictionary dictionary) throws IOException {
-        return openIndexUrlAsBaiOrNull(file.toURI().toURL(), dictionary);
-    }
-
-    public static InputStream openIndexUrlAsBaiOrNull(final URL url, final SAMSequenceDictionary dictionary) throws IOException {
-        if (url.getFile().toLowerCase().endsWith(BAI.fileNameSuffix.toLowerCase())) {
-            return url.openStream();
-        }
-        if (url.getFile().toLowerCase().endsWith(CRAI.fileNameSuffix.toLowerCase())) {
-            return CRAIIndex.openCraiFileAsBaiStream(url.openStream(), dictionary);
-        }
-
-        return null;
-    }
-
-    public static InputStream asBaiStreamOrNull(final InputStream inputStream, final SAMSequenceDictionary dictionary) throws IOException {
-        final BufferedInputStream bis = new BufferedInputStream(inputStream);
-        bis.mark(BAI.magic.length);
-        if (doesStreamStartWith(bis, BAI.magic)) {
-            bis.reset();
-            return bis;
-        } else {
-            bis.reset();
-        }
-
-        bis.mark(CRAI.magic.length);
-        if (doesStreamStartWith(bis, CRAI.magic)) {
-            bis.reset();
-            return CRAIIndex.openCraiFileAsBaiStream(bis, dictionary);
-        } else {
-            bis.reset();
-        }
-
-        return null;
-    }
-
-    public static SeekableStream asBaiSeekableStreamOrNull(final SeekableStream inputStream, final SAMSequenceDictionary dictionary) throws IOException {
-        final SeekableBufferedStream bis = new SeekableBufferedStream(inputStream);
-        bis.seek(0);
-        if (doesStreamStartWith(bis, BAI.magic)) {
-            bis.seek(0);
-            return bis;
-        }
-
-        bis.seek(0);
-        if (doesStreamStartWith(bis, CRAI.magic)) {
-            bis.seek(0);
-            return CRAIIndex.openCraiFileAsBaiStream(bis, dictionary);
-        } else {
-            bis.reset();
-        }
-
-        return null;
-    }
-
-    private static boolean doesStreamStartWith(final InputStream is, final byte[] bytes) throws IOException {
-        for (final byte b : bytes) {
-            if (is.read() != (0xFF & b)) {
-                return false;
-            }
-        }
-        return true;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SamInputResource.java b/src/main/java/htsjdk/samtools/SamInputResource.java
deleted file mode 100644
index f25d97b..0000000
--- a/src/main/java/htsjdk/samtools/SamInputResource.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekablePathStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import htsjdk.samtools.sra.SRAAccession;
-import htsjdk.samtools.util.Lazy;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.nio.file.FileSystemNotFoundException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-/**
- * Describes a SAM-like resource, including its data (where the records are), and optionally an index.
- * <p/>
- * A data or index source may originate from a {@link java.io.File}, {@link java.io.InputStream}, {@link URL}, or
- * {@link htsjdk.samtools.seekablestream.SeekableStream}; look for the appropriate overload for
- * {@code htsjdk.samtools.SamInputResource#of()}.
- *
- * @author mccowan
- */
-public class SamInputResource {
-    private final InputResource source;
-    private InputResource index;
-
-    SamInputResource(final InputResource data) {
-        this(data, null);
-    }
-
-    SamInputResource(final InputResource source, final InputResource index) {
-        if (source == null) throw new NullPointerException("source");
-        this.source = source;
-        this.index = index;
-    }
-
-    /** The resource that is the SAM data (e.g., records) */
-    InputResource data() {
-        return source;
-    }
-
-    /**
-     * The resource that is the SAM index
-     *
-     * @return null, if no index is defined for this resource
-     */
-    InputResource indexMaybe() {
-        return index;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("data=%s;index=%s", source, index);
-    }
-
-    /** Creates a {@link SamInputResource} reading from the provided resource, with no index. */
-    public static SamInputResource of(final File file) { return new SamInputResource(new FileInputResource(file)); }
-
-    /** Creates a {@link SamInputResource} reading from the provided resource, with no index. */
-    public static SamInputResource of(final Path path) { return new SamInputResource(new PathInputResource(path)); }
-
-    /** Creates a {@link SamInputResource} reading from the provided resource, with no index. */
-    public static SamInputResource of(final InputStream inputStream) { return new SamInputResource(new InputStreamInputResource(inputStream)); }
-
-    /** Creates a {@link SamInputResource} reading from the provided resource, with no index. */
-    public static SamInputResource of(final URL url) { return new SamInputResource(new UrlInputResource(url)); }
-
-    /** Creates a {@link SamInputResource} reading from the provided resource, with no index. */
-    public static SamInputResource of(final SeekableStream seekableStream) { return new SamInputResource(new SeekableStreamInputResource(seekableStream)); }
-
-    public static SamInputResource of(final SRAAccession acc) { return new SamInputResource(new SRAInputResource(acc)); }
-
-    /** Creates a {@link SamInputResource} from a string specifying *either* a url or a file path */
-    public static SamInputResource of(final String string) { 
-      try {
-        URL url = new URL(string);    // this will throw if its not a url
-        return of(url); 
-      } catch (MalformedURLException e) {
-       // ignore
-      }
-      return of(new File(string));
-    }
-    
-    /** Updates the index to point at the provided resource, then returns itself. */
-    public SamInputResource index(final File file) {
-        this.index = new FileInputResource(file);
-        return this;
-    }
-
-    /** Updates the index to point at the provided resource, then returns itself. */
-    public SamInputResource index(final Path path) {
-        this.index = new PathInputResource(path);
-        return this;
-    }
-
-    /** Updates the index to point at the provided resource, then returns itself. */
-    public SamInputResource index(final InputStream inputStream) {
-        this.index = new InputStreamInputResource(inputStream);
-        return this;
-    }
-
-    /** Updates the index to point at the provided resource, then returns itself. */
-    public SamInputResource index(final URL url) {
-        this.index = new UrlInputResource(url);
-        return this;
-    }
-
-    /** Updates the index to point at the provided resource, then returns itself. */
-    public SamInputResource index(final SeekableStream seekableStream) {
-        this.index = new SeekableStreamInputResource(seekableStream);
-        return this;
-    }
-
-}
-
-/**
- * Describes an arbitrary input source, which is something that can be accessed as either a
- * {@link htsjdk.samtools.seekablestream.SeekableStream} or {@link java.io.InputStream}.  A concrete implementation of this class exists for
- * each of {@link InputResource.Type}.
- */
-abstract class InputResource {
-    protected InputResource(final Type type) {this.type = type;}
-
-    enum Type {
-        FILE, PATH, URL, SEEKABLE_STREAM, INPUT_STREAM, SRA_ACCESSION
-    }
-
-    private final Type type;
-
-    final Type type() {
-        return type;
-    }
-
-    /** Returns null if this resource cannot be represented as a {@link File}. */
-    abstract File asFile();
-
-    /** Returns null if this resource cannot be represented as a {@link Path}. */
-    abstract Path asPath();
-
-    /** Returns null if this resource cannot be represented as a {@link URL}. */
-    abstract URL asUrl();
-
-    /** Returns null if this resource cannot be represented as a {@link htsjdk.samtools.seekablestream.SeekableStream}. */
-    abstract SeekableStream asUnbufferedSeekableStream();
-
-    /** All resource types support {@link java.io.InputStream} generation. */
-    abstract InputStream asUnbufferedInputStream();
-
-    /** SRA archive resource */
-    abstract SRAAccession asSRAAccession();
-
-    @Override
-    public String toString() {
-        final String childToString;
-        switch (type()) {
-            case FILE:
-                childToString = asFile().toString();
-                break;
-            case PATH:
-                childToString = asPath().toString();
-                break;
-            case INPUT_STREAM:
-                childToString = asUnbufferedInputStream().toString();
-                break;
-            case SEEKABLE_STREAM:
-                childToString = asUnbufferedSeekableStream().toString();
-                break;
-            case URL:
-                childToString = asUrl().toString();
-                break;
-            case SRA_ACCESSION:
-                childToString = asSRAAccession().toString();
-                break;
-            default:
-                throw new IllegalStateException();
-        }
-        return String.format("%s:%s", type(), childToString);
-    }
-}
-
-class FileInputResource extends InputResource {
-
-    final File fileResource;
-    final Lazy<SeekableStream> lazySeekableStream = new Lazy<SeekableStream>(new Lazy.LazyInitializer<SeekableStream>() {
-        @Override
-        public SeekableStream make() {
-            try {
-                return new SeekableFileStream(fileResource);
-            } catch (final FileNotFoundException e) {
-                throw new RuntimeIOException(e);
-            }
-        }
-    });
-
-
-    FileInputResource(final File fileResource) {
-        super(Type.FILE);
-        this.fileResource = fileResource;
-    }
-
-    @Override
-    public File asFile() {
-        return fileResource;
-    }
-
-    @Override
-    public Path asPath() {
-        return fileResource.toPath();
-    }
-
-    @Override
-    public URL asUrl() {
-        try {
-            return asPath().toUri().toURL();
-        } catch (MalformedURLException e) {
-            return null;
-        }
-    }
-
-    @Override
-    public SeekableStream asUnbufferedSeekableStream() {
-        return lazySeekableStream.get();
-    }
-
-    @Override
-    public InputStream asUnbufferedInputStream() {
-        return asUnbufferedSeekableStream();
-    }
-
-    @Override
-    public SRAAccession asSRAAccession() {
-        return null;
-    }
-}
-
-class PathInputResource extends InputResource {
-
-    final Path pathResource;
-    final Lazy<SeekableStream> lazySeekableStream = new Lazy<SeekableStream>(new Lazy.LazyInitializer<SeekableStream>() {
-        @Override
-        public SeekableStream make() {
-            try {
-                return new SeekablePathStream(pathResource);
-            } catch (final IOException e) {
-                throw new RuntimeIOException(e);
-            }
-        }
-    });
-
-
-    PathInputResource(final Path pathResource) {
-        super(Type.PATH);
-        this.pathResource = pathResource;
-    }
-
-    @Override
-    public File asFile() {
-        try {
-            return asPath().toFile();
-        } catch (UnsupportedOperationException e) {
-            return null;
-        }
-    }
-
-    @Override
-    public Path asPath() {
-        return pathResource;
-    }
-
-    @Override
-    public URL asUrl() {
-        try {
-            return asPath().toUri().toURL();
-        } catch (MalformedURLException e) {
-            return null;
-        }
-    }
-
-    @Override
-    public SeekableStream asUnbufferedSeekableStream() {
-        return lazySeekableStream.get();
-    }
-
-    @Override
-    public InputStream asUnbufferedInputStream() {
-        return asUnbufferedSeekableStream();
-    }
-
-    @Override
-    public SRAAccession asSRAAccession() {
-        return null;
-    }
-}
-
-class UrlInputResource extends InputResource {
-
-    final URL urlResource;
-    final Lazy<SeekableStream> lazySeekableStream = new Lazy<SeekableStream>(new Lazy.LazyInitializer<SeekableStream>() {
-        @Override
-        public SeekableStream make() {
-            try { return SeekableStreamFactory.getInstance().getStreamFor(urlResource); }
-            catch (final IOException ioe) { throw new RuntimeIOException(ioe); }
-        }
-    });
-
-    UrlInputResource(final URL urlResource) {
-        super(Type.URL);
-        this.urlResource = urlResource;
-    }
-
-    @Override
-    public File asFile() {
-        return null;
-    }
-
-    @Override
-    public Path asPath() {
-        try {
-            return Paths.get(urlResource.toURI());
-        } catch (URISyntaxException | IllegalArgumentException |
-            FileSystemNotFoundException | SecurityException e) {
-            return null;
-        }
-    }
-
-    @Override
-    public URL asUrl() {
-        return urlResource;
-    }
-
-    @Override
-    public SeekableStream asUnbufferedSeekableStream() {
-        return lazySeekableStream.get();
-    }
-
-    @Override
-    public InputStream asUnbufferedInputStream() {
-        return asUnbufferedSeekableStream();
-    }
-
-    @Override
-    public SRAAccession asSRAAccession() {
-        return null;
-    }
-}
-
-class SeekableStreamInputResource extends InputResource {
-
-    final SeekableStream seekableStreamResource;
-
-    SeekableStreamInputResource(final SeekableStream seekableStreamResource) {
-        super(Type.SEEKABLE_STREAM);
-        this.seekableStreamResource = seekableStreamResource;
-    }
-
-    @Override
-    File asFile() {
-        return null;
-    }
-
-    @Override
-    Path asPath() {
-        return null;
-    }
-
-    @Override
-    URL asUrl() {
-        return null;
-    }
-
-    @Override
-    SeekableStream asUnbufferedSeekableStream() {
-        return seekableStreamResource;
-    }
-
-    @Override
-    InputStream asUnbufferedInputStream() {
-        return asUnbufferedSeekableStream();
-    }
-
-    @Override
-    public SRAAccession asSRAAccession() {
-        return null;
-    }
-}
-
-class InputStreamInputResource extends InputResource {
-
-    final InputStream inputStreamResource;
-
-    InputStreamInputResource(final InputStream inputStreamResource) {
-        super(Type.INPUT_STREAM);
-        this.inputStreamResource = inputStreamResource;
-    }
-
-    @Override
-    File asFile() {
-        return null;
-    }
-
-    @Override
-    Path asPath() {
-        return null;
-    }
-
-    @Override
-    URL asUrl() {
-        return null;
-    }
-
-    @Override
-    SeekableStream asUnbufferedSeekableStream() {
-        return null;
-    }
-
-    @Override
-    InputStream asUnbufferedInputStream() {
-        return inputStreamResource;
-    }
-
-    @Override
-    public SRAAccession asSRAAccession() {
-        return null;
-    }
-}
-
-class SRAInputResource extends InputResource {
-
-    final SRAAccession accession;
-
-    SRAInputResource(final SRAAccession accession) {
-        super(Type.SRA_ACCESSION);
-        this.accession = accession;
-    }
-
-    @Override
-    File asFile() {
-        return null;
-    }
-
-    @Override
-    Path asPath() {
-        return null;
-    }
-
-    @Override
-    URL asUrl() {
-        return null;
-    }
-
-    @Override
-    SeekableStream asUnbufferedSeekableStream() {
-        return null;
-    }
-
-    @Override
-    InputStream asUnbufferedInputStream() {
-        return null;
-    }
-
-    @Override
-    public SRAAccession asSRAAccession() {
-        return accession;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SamPairUtil.java b/src/main/java/htsjdk/samtools/SamPairUtil.java
deleted file mode 100644
index ee1707b..0000000
--- a/src/main/java/htsjdk/samtools/SamPairUtil.java
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.PeekableIterator;
-
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Queue;
-
-/**
- * Utility methods for pairs of SAMRecords
- */
-public class SamPairUtil {
-
-    /**
-     * The possible orientations of paired reads.
-     *
-     * F = mapped to forward strand
-     * R = mapped to reverse strand
-     *
-     * FR means the read that's mapped to the forward strand comes before the
-     * read mapped to the reverse strand when their 5'-end coordinates are
-     * compared.
-     */
-    public static enum PairOrientation
-    {
-        FR,     // ( 5' --F-->       <--R-- 5'  )  - aka. innie
-        RF,     // (   <--R-- 5'   5' --F-->    )  - aka. outie
-        TANDEM // ( 5' --F-->   5' --F-->  or  (  <--R-- 5'   <--R-- 5'  )
-
-    }
-
-
-    /**
-     * Computes the pair orientation of the given SAMRecord.
-     * @param r
-     * @return PairOrientation of the given SAMRecord.
-     * @throws IllegalArgumentException If the record is not a paired read, or
-     * one or both reads are unmapped.
-     */
-    public static PairOrientation getPairOrientation(final SAMRecord r)
-    {
-        final boolean readIsOnReverseStrand = r.getReadNegativeStrandFlag();
-
-        if(r.getReadUnmappedFlag() || !r.getReadPairedFlag() || r.getMateUnmappedFlag()) {
-            throw new IllegalArgumentException("Invalid SAMRecord: " + r.getReadName() + ". This method only works for SAMRecords " +
-                    "that are paired reads with both reads aligned.");
-        }
-
-        if(readIsOnReverseStrand == r.getMateNegativeStrandFlag() )  {
-            return PairOrientation.TANDEM;
-        }
-
-        final long positiveStrandFivePrimePos = ( readIsOnReverseStrand
-                ?  r.getMateAlignmentStart()  //mate's 5' position  ( x---> )
-                :  r.getAlignmentStart() );   //read's 5' position  ( x---> )
-
-        final long negativeStrandFivePrimePos = ( readIsOnReverseStrand
-                ?  r.getAlignmentEnd()                                   //read's 5' position  ( <---x )
-                :  r.getAlignmentStart() + r.getInferredInsertSize() );  //mate's 5' position  ( <---x )
-
-        return ( positiveStrandFivePrimePos < negativeStrandFivePrimePos
-                ? PairOrientation.FR
-                : PairOrientation.RF );
-    }
-
-
-
-    // TODO: KT and TF say this is more complicated than what I have here
-    public static boolean isProperPair(final SAMRecord firstEnd, final SAMRecord secondEnd,
-                                       final List<PairOrientation> expectedOrientations) {
-        // are both records mapped?
-        if (firstEnd.getReadUnmappedFlag() || secondEnd.getReadUnmappedFlag()) {
-            return false;
-        }
-        if (firstEnd.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME)) {
-            return false;
-        }
-        // AND are they both mapped to the same chromosome
-
-        if (!firstEnd.getReferenceName().equals(secondEnd.getReferenceName())) {
-            return false;
-        }
-
-        // AND is the pair orientation in the set of expected orientations
-        final PairOrientation actual = getPairOrientation(firstEnd);
-        return expectedOrientations.contains(actual);
-    }
-
-    public static void assertMate(final SAMRecord firstOfPair, final SAMRecord secondOfPair) {
-        // Validate paired reads arrive as first of pair, then second of pair
-
-        if (firstOfPair == null) {
-            throw new SAMException(
-                    "First record does not exist - cannot perform mate assertion!");
-        } else if (secondOfPair == null) {
-            throw new SAMException(
-                    firstOfPair.toString() + " is missing its mate");
-        } else if (!firstOfPair.getReadPairedFlag()) {
-            throw new SAMException(
-                    "First record is not marked as paired: " + firstOfPair.toString());
-        } else if (!secondOfPair.getReadPairedFlag()) {
-            throw new SAMException(
-                    "Second record is not marked as paired: " + secondOfPair.toString());
-        } else if (!firstOfPair.getFirstOfPairFlag()) {
-            throw new SAMException(
-                    "First record is not marked as first of pair: " + firstOfPair.toString());
-        } else if (!secondOfPair.getSecondOfPairFlag()) {
-            throw new SAMException(
-                    "Second record is not marked as second of pair: " + secondOfPair.toString());
-        } else if (!firstOfPair.getReadName().equals(secondOfPair.getReadName())) {
-            throw new SAMException(
-                    "First [" + firstOfPair.getReadName() + "] and Second [" +
-                            secondOfPair.getReadName() + "] readnames do not match!");
-        }
-    }
-
-    /**
-     * Obtain the secondOfPair mate belonging to the firstOfPair SAMRecord
-     * (assumed to be in the next element of the specified samRecordIterator)
-     * @param samRecordIterator the iterator assumed to contain the secondOfPair SAMRecord in the
-     * next element in the iteration
-     * @param firstOfPair the firstOfPair SAMRecord
-     * @return the secondOfPair SAMRecord
-     * @throws SAMException when the secondOfPair mate cannot be obtained due to assertion failures
-     */
-    public static SAMRecord obtainAssertedMate(final Iterator<SAMRecord> samRecordIterator,
-                                               final SAMRecord firstOfPair) {
-        if (samRecordIterator.hasNext()) {
-            final SAMRecord secondOfPair = samRecordIterator.next();
-            assertMate(firstOfPair, secondOfPair);
-            return secondOfPair;
-        } else {
-            throw new SAMException(
-                    "Second record does not exist: " + firstOfPair.getReadName());
-        }
-    }
-
-    /**
-     * Compute SAMRecord insert size
-     * @param firstEnd
-     * @param secondEnd
-     * @return note that when storing insert size on the secondEnd, the return value must be negated.
-     */
-    public static int computeInsertSize(final SAMRecord firstEnd, final SAMRecord secondEnd) {
-        if (firstEnd.getReadUnmappedFlag() || secondEnd.getReadUnmappedFlag()) {
-            return 0;
-        }
-        if (!firstEnd.getReferenceName().equals(secondEnd.getReferenceName())) {
-            return 0;
-        }
-
-        final int firstEnd5PrimePosition = firstEnd.getReadNegativeStrandFlag()? firstEnd.getAlignmentEnd(): firstEnd.getAlignmentStart();
-        final int secondEnd5PrimePosition = secondEnd.getReadNegativeStrandFlag()? secondEnd.getAlignmentEnd(): secondEnd.getAlignmentStart();
-
-        final int adjustment = (secondEnd5PrimePosition >= firstEnd5PrimePosition) ? +1 : -1;
-        return secondEnd5PrimePosition - firstEnd5PrimePosition + adjustment;
-    }
-
-    /**
-     * Write the mate info for two SAMRecords.  This will always clear/remove any mate cigar tag that is present.
-     * @param rec1 the first SAM record
-     * @param rec2 the second SAM record
-     */
-    public static void setMateInfo(final SAMRecord rec1, final SAMRecord rec2) {
-        setMateInfo(rec1, rec2, false);
-    }
-
-    /**
-     * Write the mate info for two SAMRecords
-     * @param rec1 the first SAM record. Must have a non-null SAMFileHeader.
-     * @param rec2 the second SAM record. Must have a non-null SAMFileHeader.
-     * @param setMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
-     */
-    public static void setMateInfo(final SAMRecord rec1, final SAMRecord rec2, final boolean setMateCigar) {
-        // If neither read is unmapped just set their mate info
-        if (!rec1.getReadUnmappedFlag() && !rec2.getReadUnmappedFlag()) {
-            rec1.setMateReferenceIndex(rec2.getReferenceIndex());
-            rec1.setMateAlignmentStart(rec2.getAlignmentStart());
-            rec1.setMateNegativeStrandFlag(rec2.getReadNegativeStrandFlag());
-            rec1.setMateUnmappedFlag(false);
-            rec1.setAttribute(SAMTag.MQ.name(), rec2.getMappingQuality());
-
-            rec2.setMateReferenceIndex(rec1.getReferenceIndex());
-            rec2.setMateAlignmentStart(rec1.getAlignmentStart());
-            rec2.setMateNegativeStrandFlag(rec1.getReadNegativeStrandFlag());
-            rec2.setMateUnmappedFlag(false);
-            rec2.setAttribute(SAMTag.MQ.name(), rec1.getMappingQuality());
-
-            if (setMateCigar) {
-                rec1.setAttribute(SAMTag.MC.name(), rec2.getCigarString());
-                rec2.setAttribute(SAMTag.MC.name(), rec1.getCigarString());
-            }
-            else {
-                rec1.setAttribute(SAMTag.MC.name(), null);
-                rec2.setAttribute(SAMTag.MC.name(), null);
-            }
-        }
-        // Else if they're both unmapped set that straight
-        else if (rec1.getReadUnmappedFlag() && rec2.getReadUnmappedFlag()) {
-            rec1.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-            rec1.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
-            rec1.setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-            rec1.setMateAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
-            rec1.setMateNegativeStrandFlag(rec2.getReadNegativeStrandFlag());
-            rec1.setMateUnmappedFlag(true);
-            rec1.setAttribute(SAMTag.MQ.name(), null);
-            rec1.setAttribute(SAMTag.MC.name(), null);
-            rec1.setInferredInsertSize(0);
-
-            rec2.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-            rec2.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
-            rec2.setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-            rec2.setMateAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
-            rec2.setMateNegativeStrandFlag(rec1.getReadNegativeStrandFlag());
-            rec2.setMateUnmappedFlag(true);
-            rec2.setAttribute(SAMTag.MQ.name(), null);
-            rec2.setAttribute(SAMTag.MC.name(), null);
-            rec2.setInferredInsertSize(0);
-        }
-        // And if only one is mapped copy it's coordinate information to the mate
-        else {
-            final SAMRecord mapped   = rec1.getReadUnmappedFlag() ? rec2 : rec1;
-            final SAMRecord unmapped = rec1.getReadUnmappedFlag() ? rec1 : rec2;
-            unmapped.setReferenceIndex(mapped.getReferenceIndex());
-            unmapped.setAlignmentStart(mapped.getAlignmentStart());
-
-            mapped.setMateReferenceIndex(unmapped.getReferenceIndex());
-            mapped.setMateAlignmentStart(unmapped.getAlignmentStart());
-            mapped.setMateNegativeStrandFlag(unmapped.getReadNegativeStrandFlag());
-            mapped.setMateUnmappedFlag(true);
-            mapped.setAttribute(SAMTag.MQ.name(), null);
-            mapped.setAttribute(SAMTag.MC.name(), null);
-            mapped.setInferredInsertSize(0);
-
-            unmapped.setMateReferenceIndex(mapped.getReferenceIndex());
-            unmapped.setMateAlignmentStart(mapped.getAlignmentStart());
-            unmapped.setMateNegativeStrandFlag(mapped.getReadNegativeStrandFlag());
-            unmapped.setMateUnmappedFlag(false);
-            unmapped.setAttribute(SAMTag.MQ.name(), mapped.getMappingQuality());
-            // For the unmapped read, set mateCigar to the mate's Cigar, since the mate must be mapped
-            if (setMateCigar) unmapped.setAttribute(SAMTag.MC.name(), mapped.getCigarString());
-            else unmapped.setAttribute(SAMTag.MC.name(), null);
-            unmapped.setInferredInsertSize(0);
-        }
-
-        final int insertSize = SamPairUtil.computeInsertSize(rec1, rec2);
-        rec1.setInferredInsertSize(insertSize);
-        rec2.setInferredInsertSize(-insertSize);
-    }
-
-    /**
-     * Write the mate info for two SAMRecords
-     * @param rec1 the first SAM record
-     * @param rec2 the second SAM record
-     * @param header the SAM file header
-     * @param setMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
-     * @deprecated use {@link #setMateInfo(SAMRecord, SAMRecord, boolean)} instead
-     */
-    @Deprecated
-    public static void setMateInfo(final SAMRecord rec1, final SAMRecord rec2, final SAMFileHeader header, final boolean setMateCigar) {
-        setMateInfo(rec1, rec2, setMateCigar);
-    }
-
-    /**
-     * Write the mate info for two SAMRecords.  This will always clear/remove any mate cigar tag that is present.
-     * @param rec1 the first SAM record
-     * @param rec2 the second SAM record
-     * @param header the SAM file header
-     * @deprecated use {@link #setMateInfo(SAMRecord, SAMRecord)} instead
-     */
-    @Deprecated
-    public static void setMateInfo(final SAMRecord rec1, final SAMRecord rec2, final SAMFileHeader header) {
-        setMateInfo(rec1, rec2);
-    }
-
-    /**
-     * Sets mate pair information appropriately on a supplemental SAMRecord (e.g. from a split alignment)
-     * using the primary alignment of the read's mate.
-     * @param supplemental a supplemental alignment for the mate pair of the primary supplied
-     * @param matePrimary the primary alignment of the the mate pair of the supplemental
-     * @param setMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
-     */
-    public static void setMateInformationOnSupplementalAlignment( final SAMRecord supplemental,
-                                                                  final SAMRecord matePrimary,
-                                                                  final boolean setMateCigar) {
-        supplemental.setMateReferenceIndex(matePrimary.getReferenceIndex());
-        supplemental.setMateAlignmentStart(matePrimary.getAlignmentStart());
-        supplemental.setMateNegativeStrandFlag(matePrimary.getReadNegativeStrandFlag());
-        supplemental.setMateUnmappedFlag(matePrimary.getReadUnmappedFlag());
-        supplemental.setInferredInsertSize(-matePrimary.getInferredInsertSize());
-        if (setMateCigar && !matePrimary.getReadUnmappedFlag()) {
-            supplemental.setAttribute(SAMTag.MC.name(), matePrimary.getCigarString());
-        }
-        else {
-            supplemental.setAttribute(SAMTag.MC.name(), null);
-        }
-    }
-
-    /**
-     * Sets mate pair information appropriately on a supplemental SAMRecord (e.g. from a split alignment)
-     * using the primary alignment of the read's mate.
-     * @param supplemental a supplemental alignment for the mate pair of the primary supplied
-     * @param matePrimary the primary alignment of the the mate pair of the supplemental
-     */
-    public static void setMateInformationOnSupplementalAlignment( final SAMRecord supplemental,
-                                                                  final SAMRecord matePrimary) {
-        setMateInformationOnSupplementalAlignment(supplemental, matePrimary, false);
-    }
-
-    /**
-     * This method will clear any mate cigar already present.
-     * @deprecated use {@link #setProperPairAndMateInfo(SAMRecord, SAMRecord, List)} instead
-     */
-    @Deprecated
-    public static void setProperPairAndMateInfo(final SAMRecord rec1, final SAMRecord rec2,
-                                                final SAMFileHeader header,
-                                                final List<PairOrientation> expectedOrientations) {
-        setProperPairAndMateInfo(rec1, rec2, expectedOrientations);
-    }
-
-    /**
-     * @param addMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
-     * @deprecated use {@link #setProperPairAndMateInfo(SAMRecord, SAMRecord, List, boolean)}
-     */
-    @Deprecated
-    public static void setProperPairAndMateInfo(final SAMRecord rec1, final SAMRecord rec2,
-                                                final SAMFileHeader header,
-                                                final List<PairOrientation> expectedOrientations,
-                                                final boolean addMateCigar) {
-        setProperPairAndMateInfo(rec1, rec2, expectedOrientations, addMateCigar);
-    }
-
-    /**
-     * This method will clear any mate cigar already present.
-     */
-    public static void setProperPairAndMateInfo(final SAMRecord rec1, final SAMRecord rec2,
-                                                final List<PairOrientation> expectedOrientations) {
-        setProperPairAndMateInfo(rec1, rec2, expectedOrientations, false);
-    }
-
-    /**
-     * @param addMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
-     */
-    public static void setProperPairAndMateInfo(final SAMRecord rec1, final SAMRecord rec2,
-                                                final List<PairOrientation> expectedOrientations,
-                                                final boolean addMateCigar) {
-        setMateInfo(rec1, rec2, addMateCigar);
-        setProperPairFlags(rec1, rec2, expectedOrientations);
-    }
-
-    public static void setProperPairFlags(final SAMRecord rec1, final SAMRecord rec2, final List<PairOrientation> expectedOrientations) {
-        final boolean properPair =  (!rec1.getReadUnmappedFlag() && !rec2.getReadUnmappedFlag())
-                ? isProperPair(rec1, rec2, expectedOrientations)
-                : false;
-        rec1.setProperPairFlag(properPair);
-        rec2.setProperPairFlag(properPair);
-    }
-
-    /**
-     * A class to iterate through SAMRecords and set mate information on the given records, and optionally
-     * set the mate cigar tag (true by default).
-     */
-    public static class SetMateInfoIterator extends PeekableIterator<SAMRecord> {
-
-        private final Queue<SAMRecord> records = new LinkedList<SAMRecord>();
-        private final boolean setMateCigar;
-        private final boolean ignoreMissingMates;
-        private long numMateCigarsAdded = 0;
-
-        /**
-         * By default, the mate cigar tag is set
-         * @param iterator the iterator to wrap
-         */
-        public SetMateInfoIterator(final Iterator<SAMRecord> iterator) {
-            this(iterator, true);
-        }
-
-        /**
-         * @param iterator the iterator to wrap
-         * @param setMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
-         */
-        public SetMateInfoIterator(final Iterator<SAMRecord> iterator, final boolean setMateCigar) {
-            this(iterator, setMateCigar, false);
-        }
-
-        /**
-         * @param iterator the iterator to wrap
-         * @param setMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
-         * @param ignoreMissingMates set this to true if we are to ignore missing mates, otherwise an exception will be thrown when a missing mate is encountered
-         */
-        public SetMateInfoIterator(final Iterator<SAMRecord> iterator, final boolean setMateCigar, final boolean ignoreMissingMates) {
-            super(iterator);
-            this.setMateCigar = setMateCigar;
-            this.ignoreMissingMates = ignoreMissingMates;
-        }
-
-        /**
-         * @return the current number of mate cigars added.  This could be more than the number of records returned.
-         */
-        public long getNumMateCigarsAdded() { return this.numMateCigarsAdded; }
-
-        public boolean hasNext() {
-            return (!records.isEmpty() || super.hasNext());
-        }
-
-        /**
-         * Populate this.records if necessary.
-         */
-        private void advance() {
-
-            // No need to advance if we have records remaining
-            if (!records.isEmpty()) return;
-
-            /**
-             * Get all records with the same name, and then identify the canonical first and second end to which we
-             * want to set mate info.
-             */
-            SAMRecord firstPrimaryRecord = null, secondPrimaryRecord = null;
-            final SAMRecord first = super.peek(); // peek so we consider it in the following loop
-            boolean containsSupplementalRecord = false;
-            while (super.hasNext() && super.peek().getReadName().equals(first.getReadName())) {
-                final SAMRecord record = super.next();
-                // We must make sure that we find only one "primary" alignments for each end
-                if (record.getReadPairedFlag()) {
-                    if (!record.isSecondaryOrSupplementary()) {
-                        if (record.getFirstOfPairFlag()) {
-                            if (null != firstPrimaryRecord) {
-                                throw new SAMException("Found two records that are paired, not supplementary, and first of the pair");
-                            }
-                            firstPrimaryRecord = record;
-                        } else if (record.getSecondOfPairFlag()) {
-                            if (null != secondPrimaryRecord) {
-                                throw new SAMException("Found two records that are paired, not supplementary, and second of the pair");
-                            }
-                            secondPrimaryRecord = record;
-                        }
-                    }
-                    if (record.getSupplementaryAlignmentFlag()) containsSupplementalRecord = true;
-                }
-                records.add(record);
-            }
-            // TODO: should we check that we do not have a mix of paired and fragment reads?
-
-
-            // we must find both records to update the mate info
-            if (null != firstPrimaryRecord && null != secondPrimaryRecord) {
-                // Update mate info
-                SamPairUtil.setMateInfo(firstPrimaryRecord, secondPrimaryRecord, this.setMateCigar);
-                if (this.setMateCigar) this.numMateCigarsAdded += 2;
-
-                // Set mate information on supplemental records
-                if (containsSupplementalRecord) {
-                    for (final SAMRecord record : records) {
-                        if (record.getReadPairedFlag() && record.getSupplementaryAlignmentFlag()) {
-                            if (record.getFirstOfPairFlag()) {
-                                SamPairUtil.setMateInformationOnSupplementalAlignment(record, secondPrimaryRecord, this.setMateCigar);
-                            } else {
-                                SamPairUtil.setMateInformationOnSupplementalAlignment(record, firstPrimaryRecord, this.setMateCigar);
-                            }
-                            this.numMateCigarsAdded++;
-                        }
-                    }
-                }
-            } else if (!this.ignoreMissingMates) {
-                if (null != firstPrimaryRecord && firstPrimaryRecord.getReadPairedFlag()) {
-                    throw new SAMException("Missing second read of pair: " + firstPrimaryRecord.getReadName());
-                } else if (null != secondPrimaryRecord && secondPrimaryRecord.getReadPairedFlag()) {
-                    throw new SAMException("Missing first read of pair: " + secondPrimaryRecord.getReadName());
-                }
-            }
-        }
-
-        public SAMRecord next() {
-            advance();
-            if (records.isEmpty()) throw new IllegalStateException("Unexpectedly found an empty record list");
-            return this.records.poll();
-        }
-
-        public SAMRecord peek() {
-            advance();
-            if (records.isEmpty()) throw new IllegalStateException("Unexpectedly found an empty record list");
-            return this.records.peek();
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SamReader.java b/src/main/java/htsjdk/samtools/SamReader.java
deleted file mode 100644
index 2f1b2f9..0000000
--- a/src/main/java/htsjdk/samtools/SamReader.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-import java.io.Closeable;
-import java.text.MessageFormat;
-
-/**
- * Describes functionality for objects that produce {@link SAMRecord}s and associated information.
- *
- * Currently, only deprecated readers implement this directly; actual readers implement this
- * via {@link ReaderImplementation} and {@link PrimitiveSamReader}, which {@link SamReaderFactory}
- * converts into full readers by using {@link PrimitiveSamReaderToSamReaderAdapter}.
- *
- * @author mccowan
- */
-public interface SamReader extends Iterable<SAMRecord>, Closeable {
-
-    /** Describes a type of SAM file. */
-    public abstract class Type {
-        /** A string representation of this type. */
-        abstract String name();
-
-        /** The recommended file extension for SAMs of this type, without a period. */
-        public abstract String fileExtension();
-
-        /** The recommended file extension for SAM indexes of this type, without a period, or null if this type is not associated with indexes. */
-        abstract String indexExtension();
-
-        static class TypeImpl extends Type {
-            final String name, fileExtension, indexExtension;
-
-            TypeImpl(final String name, final String fileExtension, final String indexExtension) {
-                this.name = name;
-                this.fileExtension = fileExtension;
-                this.indexExtension = indexExtension;
-            }
-
-            @Override
-            String name() {
-                return name;
-            }
-
-            @Override
-            public String fileExtension() {
-                return fileExtension;
-            }
-
-            @Override
-            String indexExtension() {
-                return indexExtension;
-            }
-
-            @Override
-            public String toString() {
-                return String.format("TypeImpl{name='%s', fileExtension='%s', indexExtension='%s'}", name, fileExtension, indexExtension);
-            }
-        }
-
-        public static Type SRA_TYPE = new TypeImpl("SRA", "sra", null);
-        public static Type CRAM_TYPE = new TypeImpl("CRAM", "cram", "crai");
-        public static Type BAM_TYPE = new TypeImpl("BAM", "bam", "bai");
-        public static Type SAM_TYPE = new TypeImpl("SAM", "sam", null);
-    }
-
-    /**
-     * Facet for index-related operations.
-     */
-    public interface Indexing {
-        /**
-         * Retrieves the index for the given file type.  Ensure that the index is of the specified type.
-         *
-         * @return An index of the given type.
-         */
-        public BAMIndex getIndex();
-
-        /**
-         * Returns true if the supported index is browseable, meaning the bins in it can be traversed
-         * and chunk data inspected and retrieved.
-         *
-         * @return True if the index supports the BrowseableBAMIndex interface.  False otherwise.
-         */
-        public boolean hasBrowseableIndex();
-
-        /**
-         * Gets an index tagged with the BrowseableBAMIndex interface.  Throws an exception if no such
-         * index is available.
-         *
-         * @return An index with a browseable interface, if possible.
-         * @throws SAMException if no such index is available.
-         */
-        public BrowseableBAMIndex getBrowseableIndex();
-
-        /**
-         * Iterate through the given chunks in the file.
-         *
-         * @param chunks List of chunks for which to retrieve data.
-         * @return An iterator over the given chunks.
-         */
-        public SAMRecordIterator iterator(final SAMFileSpan chunks);
-
-        /**
-         * Gets a pointer spanning all reads in the BAM file.
-         *
-         * @return Unbounded pointer to the first record, in chunk format.
-         */
-        public SAMFileSpan getFilePointerSpanningReads();
-
-    }
-
-    public SAMFileHeader getFileHeader();
-
-    /**
-     * @return the {@link htsjdk.samtools.SamReader.Type} of this {@link htsjdk.samtools.SamReader}
-     */
-    public Type type();
-
-    /**
-     * @return a human readable description of the resource backing this sam reader
-     */
-    public String getResourceDescription();
-
-    /**
-     * @return true if ths is a BAM file, and has an index
-     */
-    public boolean hasIndex();
-
-    /**
-     * Exposes the {@link SamReader.Indexing} facet of this {@link SamReader}.
-     *
-     * @throws java.lang.UnsupportedOperationException If {@link #hasIndex()} returns false.
-     */
-    public Indexing indexing();
-
-    /**
-     * Iterate through file in order.  For a SamReader constructed from an InputStream, and for any SAM file,
-     * a 2nd iteration starts where the 1st one left off.  For a BAM constructed from a SeekableStream or File, each new iteration
-     * starts at the first record.
-     * <p/>
-     * Only a single open iterator on a SAM or BAM file may be extant at any one time.  If you want to start
-     * a second iteration, the first one must be closed first.
-     */
-    public SAMRecordIterator iterator();
-
-    /**
-     * Iterate over records that match the given interval.  Only valid to call this if hasIndex() == true.
-     * <p/>
-     * Only a single open iterator on a given SamReader may be extant at any one time.  If you want to start
-     * a second iteration, the first one must be closed first.  You can use a second SamReader to iterate
-     * in parallel over the same underlying file.
-     * <p/>
-     * Note that indexed lookup is not perfectly efficient in terms of disk I/O.  I.e. some SAMRecords may be read
-     * and then discarded because they do not match the interval of interest.
-     * <p/>
-     * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
-     * is in the query region.
-     *
-     * @param sequence  Reference sequence of interest.
-     * @param start     1-based, inclusive start of interval of interest. Zero implies start of the reference sequence.
-     * @param end       1-based, inclusive end of interval of interest. Zero implies end of the reference sequence.
-     * @param contained If true, each SAMRecord returned will have its alignment completely contained in the
-     *                  interval of interest.  If false, the alignment of the returned SAMRecords need only overlap the interval of interest.
-     * @return Iterator over the SAMRecords matching the interval.
-     */
-    public SAMRecordIterator query(final String sequence, final int start, final int end, final boolean contained);
-
-    /**
-     * Iterate over records that overlap the given interval.  Only valid to call this if hasIndex() == true.
-     * <p/>
-     * Only a single open iterator on a given SamReader may be extant at any one time.  If you want to start
-     * a second iteration, the first one must be closed first.
-     * <p/>
-     * Note that indexed lookup is not perfectly efficient in terms of disk I/O.  I.e. some SAMRecords may be read
-     * and then discarded because they do not match the interval of interest.
-     * <p/>
-     * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
-     * is in the query region.
-     *
-     * @param sequence Reference sequence of interest.
-     * @param start    1-based, inclusive start of interval of interest. Zero implies start of the reference sequence.
-     * @param end      1-based, inclusive end of interval of interest. Zero implies end of the reference sequence.
-     * @return Iterator over the SAMRecords overlapping the interval.
-     */
-    public SAMRecordIterator queryOverlapping(final String sequence, final int start, final int end);
-
-    /**
-     * Iterate over records that are contained in the given interval.  Only valid to call this if hasIndex() == true.
-     * <p/>
-     * Only a single open iterator on a given SamReader may be extant at any one time.  If you want to start
-     * a second iteration, the first one must be closed first.
-     * <p/>
-     * Note that indexed lookup is not perfectly efficient in terms of disk I/O.  I.e. some SAMRecords may be read
-     * and then discarded because they do not match the interval of interest.
-     * <p/>
-     * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
-     * is in the query region.
-     *
-     * @param sequence Reference sequence of interest.
-     * @param start    1-based, inclusive start of interval of interest. Zero implies start of the reference sequence.
-     * @param end      1-based, inclusive end of interval of interest. Zero implies end of the reference sequence.
-     * @return Iterator over the SAMRecords contained in the interval.
-     */
-    public SAMRecordIterator queryContained(final String sequence, final int start, final int end);
-
-    /**
-     * Iterate over records that match one of the given intervals.  This may be more efficient than querying
-     * each interval separately, because multiple reads of the same SAMRecords is avoided.
-     * <p/>
-     * Only valid to call this if hasIndex() == true.
-     * <p/>
-     * Only a single open iterator on a given SamReader may be extant at any one time.  If you want to start
-     * a second iteration, the first one must be closed first.  You can use a second SamReader to iterate
-     * in parallel over the same underlying file.
-     * <p/>
-     * Note that indexed lookup is not perfectly efficient in terms of disk I/O.  I.e. some SAMRecords may be read
-     * and then discarded because they do not match an interval of interest.
-     * <p/>
-     * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
-     * is in the query region.
-     *
-     * @param intervals Intervals to be queried.  The intervals must be optimized, i.e. in order, with overlapping
-     *                  and abutting intervals merged.  This can be done with {@link htsjdk.samtools.QueryInterval#optimizeIntervals}
-     * @param contained If true, each SAMRecord returned is will have its alignment completely contained in one of the
-     *                  intervals of interest.  If false, the alignment of the returned SAMRecords need only overlap one of
-     *                  the intervals of interest.
-     * @return Iterator over the SAMRecords matching the interval.
-     */
-    public SAMRecordIterator query(final QueryInterval[] intervals, final boolean contained);
-
-    /**
-     * Iterate over records that overlap any of the given intervals.  This may be more efficient than querying
-     * each interval separately, because multiple reads of the same SAMRecords is avoided.
-     * <p/>
-     * Only valid to call this if hasIndex() == true.
-     * <p/>
-     * Only a single open iterator on a given SamReader may be extant at any one time.  If you want to start
-     * a second iteration, the first one must be closed first.
-     * <p/>
-     * Note that indexed lookup is not perfectly efficient in terms of disk I/O.  I.e. some SAMRecords may be read
-     * and then discarded because they do not match the interval of interest.
-     * <p/>
-     * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
-     * is in the query region.
-     *
-     * @param intervals Intervals to be queried.  The intervals must be optimized, i.e. in order, with overlapping
-     *                  and abutting intervals merged.  This can be done with {@link htsjdk.samtools.QueryInterval#optimizeIntervals}
-     */
-    public SAMRecordIterator queryOverlapping(final QueryInterval[] intervals);
-
-    /**
-     * Iterate over records that are contained in the given interval.  This may be more efficient than querying
-     * each interval separately, because multiple reads of the same SAMRecords is avoided.
-     * <p/>
-     * Only valid to call this if hasIndex() == true.
-     * <p/>
-     * Only a single open iterator on a given SamReader may be extant at any one time.  If you want to start
-     * a second iteration, the first one must be closed first.
-     * <p/>
-     * Note that indexed lookup is not perfectly efficient in terms of disk I/O.  I.e. some SAMRecords may be read
-     * and then discarded because they do not match the interval of interest.
-     * <p/>
-     * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
-     * is in the query region.
-     *
-     * @param intervals Intervals to be queried.  The intervals must be optimized, i.e. in order, with overlapping
-     *                  and abutting intervals merged.  This can be done with {@link htsjdk.samtools.QueryInterval#optimizeIntervals}
-     * @return Iterator over the SAMRecords contained in any of the intervals.
-     */
-    public SAMRecordIterator queryContained(final QueryInterval[] intervals);
-
-
-    public SAMRecordIterator queryUnmapped();
-
-    /**
-     * Iterate over records that map to the given sequence and start at the given position.  Only valid to call this if hasIndex() == true.
-     * <p/>
-     * Only a single open iterator on a given SamReader may be extant at any one time.  If you want to start
-     * a second iteration, the first one must be closed first.
-     * <p/>
-     * Note that indexed lookup is not perfectly efficient in terms of disk I/O.  I.e. some SAMRecords may be read
-     * and then discarded because they do not match the interval of interest.
-     * <p/>
-     * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
-     * matches the arguments.
-     *
-     * @param sequence Reference sequence of interest.
-     * @param start    Alignment start of interest.
-     * @return Iterator over the SAMRecords with the given alignment start.
-     */
-    public SAMRecordIterator queryAlignmentStart(final String sequence, final int start);
-
-    /**
-     * Fetch the mate for the given read.  Only valid to call this if hasIndex() == true.
-     * This will work whether the mate has a coordinate or not, so long as the given read has correct
-     * mate information.  This method iterates over the SAM file, so there may not be an unclosed
-     * iterator on the SAM file when this method is called.
-     * <p/>
-     * Note that it is not possible to call queryMate when iterating over the SamReader, because queryMate
-     * requires its own iteration, and there cannot be two simultaneous iterations on the same SamReader.  The
-     * work-around is to open a second SamReader on the same input file, and call queryMate on the second
-     * reader.
-     *
-     * @param rec Record for which mate is sought.  Must be a paired read.
-     * @return rec's mate, or null if it cannot be found.
-     */
-    public SAMRecord queryMate(final SAMRecord rec);
-
-    /**
-     * The minimal subset of functionality needed for a {@link SAMRecord} data source.
-     * {@link SamReader} itself is somewhat large and bulky, but the core functionality can be captured in
-     * relatively few methods, which are included here. For documentation, see the corresponding methods
-     * in {@link SamReader}.
-     *
-     * See also: {@link PrimitiveSamReaderToSamReaderAdapter}, {@link ReaderImplementation}
-     *
-     */
-    public interface PrimitiveSamReader {
-        Type type();
-
-        boolean hasIndex();
-
-        BAMIndex getIndex();
-
-        SAMFileHeader getFileHeader();
-
-        CloseableIterator<SAMRecord> getIterator();
-
-        CloseableIterator<SAMRecord> getIterator(SAMFileSpan fileSpan);
-
-        SAMFileSpan getFilePointerSpanningReads();
-
-        CloseableIterator<SAMRecord> query(QueryInterval[] intervals, boolean contained);
-
-        CloseableIterator<SAMRecord> queryAlignmentStart(String sequence, int start);
-
-        CloseableIterator<SAMRecord> queryUnmapped();
-
-        void close();
-
-        ValidationStringency getValidationStringency();
-    }
-
-    /**
-     * Decorator for a {@link SamReader.PrimitiveSamReader} that expands its functionality into a {@link SamReader},
-     * given the backing {@link SamInputResource}.
-     *
-     * Wraps the {@link Indexing} interface as well, which was originally separate from {@link SamReader} but in practice
-     * the two are always implemented by the same class.
-     *
-     */
-    class PrimitiveSamReaderToSamReaderAdapter implements SamReader, Indexing {
-        final PrimitiveSamReader p;
-        final SamInputResource resource;
-
-        public PrimitiveSamReaderToSamReaderAdapter(final PrimitiveSamReader p, final SamInputResource resource) {
-            this.p = p;
-            this.resource = resource;
-        }
-
-        PrimitiveSamReader underlyingReader() {
-            return p;
-        }
-
-        @Override
-        public SAMRecordIterator queryOverlapping(final String sequence, final int start, final int end) {
-            return query(sequence, start, end, false);
-        }
-
-        @Override
-        public SAMRecordIterator queryOverlapping(final QueryInterval[] intervals) {
-            return query(intervals, false);
-        }
-
-        @Override
-        public SAMRecordIterator queryContained(final String sequence, final int start, final int end) {
-            return query(sequence, start, end, true);
-        }
-
-        @Override
-        public SAMRecordIterator queryContained(final QueryInterval[] intervals) {
-            return query(intervals, true);
-        }
-
-        /**
-         * Wraps the boilerplate code for querying a record's mate, which is common across many implementations.
-         *
-         * @param rec Record for which mate is sought.  Must be a paired read.
-         * @return
-         */
-        @Override
-        public SAMRecord queryMate(final SAMRecord rec) {
-            if (!rec.getReadPairedFlag()) {
-                throw new IllegalArgumentException("queryMate called for unpaired read.");
-            }
-            if (rec.getFirstOfPairFlag() == rec.getSecondOfPairFlag()) {
-                throw new IllegalArgumentException("SAMRecord must be either first and second of pair, but not both.");
-            }
-            final boolean firstOfPair = rec.getFirstOfPairFlag();
-            final CloseableIterator<SAMRecord> it;
-            if (rec.getMateReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                it = queryUnmapped();
-            } else {
-                it = queryAlignmentStart(rec.getMateReferenceName(), rec.getMateAlignmentStart());
-            }
-            try {
-                SAMRecord mateRec = null;
-                while (it.hasNext()) {
-                    final SAMRecord next = it.next();
-                    if (!next.getReadPairedFlag()) {
-                        if (rec.getReadName().equals(next.getReadName())) {
-                            throw new SAMFormatException("Paired and unpaired reads with same name: " + rec.getReadName());
-                        }
-                        continue;
-                    }
-                    if (firstOfPair) {
-                        if (next.getFirstOfPairFlag()) continue;
-                    } else {
-                        if (next.getSecondOfPairFlag()) continue;
-                    }
-                    if (rec.getReadName().equals(next.getReadName())) {
-                        if (mateRec != null) {
-                            throw new SAMFormatException("Multiple SAMRecord with read name " + rec.getReadName() +
-                                    " for " + (firstOfPair ? "second" : "first") + " end.");
-                        }
-                        mateRec = next;
-                    }
-                }
-                return mateRec;
-            } finally {
-                it.close();
-            }
-        }
-
-        @Override
-        public boolean hasBrowseableIndex() {
-            return hasIndex() && getIndex() instanceof BrowseableBAMIndex;
-        }
-
-        @Override
-        public BrowseableBAMIndex getBrowseableIndex() {
-            final BAMIndex index = getIndex();
-            if (!(index instanceof BrowseableBAMIndex))
-                throw new SAMException("Cannot return index: index created by BAM is not browseable.");
-            return BrowseableBAMIndex.class.cast(index);
-        }
-
-        @Override
-        public SAMRecordIterator iterator() {
-            return new AssertingIterator(p.getIterator());
-        }
-
-        @Override
-        public SAMRecordIterator iterator(final SAMFileSpan chunks) {
-            return new AssertingIterator(p.getIterator(chunks));
-        }
-
-        @Override
-        public void close() {
-            p.close();
-        }
-
-        @Override
-        public SAMFileSpan getFilePointerSpanningReads() {
-            return p.getFilePointerSpanningReads();
-        }
-
-        @Override
-        public SAMFileHeader getFileHeader() {
-            return p.getFileHeader();
-        }
-
-        @Override
-        public Type type() {
-            return p.type();
-        }
-
-        @Override
-        public String getResourceDescription() {
-            return this.resource.toString();
-        }
-
-        @Override
-        public boolean hasIndex() {
-            return p.hasIndex();
-        }
-
-        @Override
-        public Indexing indexing() {
-            return this;
-        }
-
-        @Override
-        public BAMIndex getIndex() {
-            return p.getIndex();
-        }
-
-        @Override
-        public SAMRecordIterator query(final QueryInterval[] intervals, final boolean contained) {
-            return AssertingIterator.of(p.query(intervals, contained));
-        }
-
-        @Override
-        public SAMRecordIterator query(final String sequence, final int start, final int end, final boolean contained) {
-            return query(new QueryInterval[]{new QueryInterval(getFileHeader().getSequenceIndex(sequence), start, end)}, contained);
-        }
-
-        @Override
-        public SAMRecordIterator queryUnmapped() {
-            return AssertingIterator.of(p.queryUnmapped());
-        }
-
-        @Override
-        public SAMRecordIterator queryAlignmentStart(final String sequence, final int start) {
-            return AssertingIterator.of(p.queryAlignmentStart(sequence, start));
-        }
-
-    }
-
-    static class AssertingIterator implements SAMRecordIterator {
-
-        static AssertingIterator of(final CloseableIterator<SAMRecord> iterator) {
-            return new AssertingIterator(iterator);
-        }
-
-        private final CloseableIterator<SAMRecord> wrappedIterator;
-        private SAMRecord previous = null;
-        private SAMRecordComparator comparator = null;
-
-        public AssertingIterator(final CloseableIterator<SAMRecord> iterator) {
-            wrappedIterator = iterator;
-        }
-
-        public SAMRecordIterator assertSorted(final SAMFileHeader.SortOrder sortOrder) {
-
-            if (sortOrder == null || sortOrder == SAMFileHeader.SortOrder.unsorted) {
-                comparator = null;
-                return this;
-            }
-
-            comparator = sortOrder.getComparatorInstance();
-            return this;
-        }
-
-        public SAMRecord next() {
-            final SAMRecord result = wrappedIterator.next();
-            if (comparator != null) {
-                if (previous != null) {
-                    if (comparator.fileOrderCompare(previous, result) > 0) {
-                        throw new IllegalStateException(MessageFormat.format(
-                                "Records {0} ({1}:{2}) should come after {3} ({4}:{5}) when sorting with {6}",
-                                previous.getReadName(),
-                                previous.getReferenceName(),
-                                previous.getAlignmentStart(),
-                                result.getReadName(),
-                                result.getReferenceName(),
-                                result.getAlignmentStart(),
-                                comparator.getClass().getName())
-                        );
-                    }
-                }
-                previous = result;
-            }
-            return result;
-        }
-
-        public void close() { wrappedIterator.close(); }
-
-        public boolean hasNext() { return wrappedIterator.hasNext(); }
-
-        public void remove() { wrappedIterator.remove(); }
-    }
-
-    /**
-     * Internal interface for SAM/BAM/CRAM file reader implementations,
-     * as distinct from non-file-based readers.
-     *
-     * Implemented as an abstract class to enforce better access control.
-     *
-     * TODO -- Many of these methods only apply for a subset of implementations,
-     * TODO -- and either no-op or throw an exception for the others.
-     * TODO -- We should consider refactoring things to avoid this;
-     * TODO -- perhaps we can get away with not having this class at all.
-     */
-    abstract class ReaderImplementation implements PrimitiveSamReader {
-        abstract void enableFileSource(final SamReader reader, final boolean enabled);
-
-        abstract void enableIndexCaching(final boolean enabled);
-
-        abstract void enableIndexMemoryMapping(final boolean enabled);
-
-        abstract void enableCrcChecking(final boolean enabled);
-
-        abstract void setSAMRecordFactory(final SAMRecordFactory factory);
-
-        abstract void setValidationStringency(final ValidationStringency validationStringency);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SamReaderFactory.java b/src/main/java/htsjdk/samtools/SamReaderFactory.java
deleted file mode 100644
index 8769f48..0000000
--- a/src/main/java/htsjdk/samtools/SamReaderFactory.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.sra.SRAAccession;
-import htsjdk.samtools.util.*;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Path;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.zip.GZIPInputStream;
-
-/**
- * <p>Describes the functionality for producing {@link SamReader}, and offers a
- * handful of static generators.</p>
- * <pre>
- *     SamReaderFactory.makeDefault().open(new File("/my/bam.bam");
- * </pre>
- * <p>Example: Configure a factory</p>
- * <pre>
- *      final {@link SamReaderFactory} factory =
- *          SamReaderFactory.makeDefault()
- *              .enable({@link Option#INCLUDE_SOURCE_IN_RECORDS}, {@link Option#VALIDATE_CRC_CHECKSUMS})
- *              .validationStringency({@link ValidationStringency#SILENT});
- *
- * </pre>
- * <p>Example: Open two bam files from different sources, using different options</p>
- * <pre>
- *     final {@link SamReaderFactory} factory =
- *          SamReaderFactory.makeDefault()
- *              .enable({@link Option#INCLUDE_SOURCE_IN_RECORDS}, {@link Option#VALIDATE_CRC_CHECKSUMS})
- *              .validationStringency({@link ValidationStringency#SILENT});
- *
- *     // File-based bam
- *     final {@link SamReader} fileReader = factory.open(new File("/my/bam.bam"));
- *
- *     // HTTP-hosted BAM with index from an arbitrary stream
- *     final SeekableStream myBamIndexStream = ...
- *     final {@link SamInputResource} resource =
- *          {@link SamInputResource}.of(new URL("http://example.com/data.bam")).index(myBamIndexStream);
- *     final {@link SamReader} complicatedReader = factory.open(resource);
- * </pre>
- *
- * @author mccowan
- */
-public abstract class SamReaderFactory {
-
-    private static ValidationStringency defaultValidationStringency = ValidationStringency.DEFAULT_STRINGENCY;
-    
-    abstract public SamReader open(final File file);
-
-    public SamReader open(final Path path) {
-        final SamInputResource r = SamInputResource.of(path);
-        final Path indexMaybe = SamFiles.findIndex(path);
-        if (indexMaybe != null) r.index(indexMaybe);
-        return open(r);
-    }
-
-    abstract public SamReader open(final SamInputResource resource);
-
-    abstract public ValidationStringency validationStringency();
-
-    abstract public CRAMReferenceSource referenceSource();
-
-    /** Set this factory's {@link htsjdk.samtools.SAMRecordFactory} to the provided one, then returns itself. */
-    abstract public SamReaderFactory samRecordFactory(final SAMRecordFactory samRecordFactory);
-
-    /** Enables the provided {@link Option}s, then returns itself. */
-    abstract public SamReaderFactory enable(final Option... options);
-
-    /** Disables the provided {@link Option}s, then returns itself. */
-    abstract public SamReaderFactory disable(final Option... options);
-
-    /** Sets a specific Option to a boolean value. * */
-    abstract public SamReaderFactory setOption(final Option option, boolean value);
-
-    /** Sets the specified reference sequence * */
-    abstract public SamReaderFactory referenceSequence(File referenceSequence);
-
-    /** Sets the specified reference sequence * */
-    abstract public SamReaderFactory referenceSource(CRAMReferenceSource referenceSequence);
-
-    /** Utility method to open the file get the header and close the file */
-    abstract public SAMFileHeader getFileHeader(File samFile);
-
-    /** Reapplies any changed options to the reader * */
-    abstract public void reapplyOptions(SamReader reader);
-
-    /** Set this factory's {@link ValidationStringency} to the provided one, then returns itself. */
-    abstract public SamReaderFactory validationStringency(final ValidationStringency validationStringency);
-
-    /** Set whether readers created by this factory will use asynchronous IO.
-     * If this methods is not called, this flag will default to the value of {@link Defaults#USE_ASYNC_IO_FOR_SAMTOOLS}.
-     * Note that this option may not be applicable to all readers returned from this factory.
-     * Returns the factory itself. */
-    abstract public SamReaderFactory setUseAsyncIo(final boolean asynchronousIO);
-
-    private static SamReaderFactoryImpl DEFAULT =
-            new SamReaderFactoryImpl(Option.DEFAULTS, defaultValidationStringency, DefaultSAMRecordFactory.getInstance());
-
-    public static void setDefaultValidationStringency(final ValidationStringency defaultValidationStringency) {
-        SamReaderFactory.defaultValidationStringency = defaultValidationStringency;
-        // The default may have changed, so reset the default SamReader
-        DEFAULT = new SamReaderFactoryImpl(Option.DEFAULTS, defaultValidationStringency, DefaultSAMRecordFactory.getInstance());
-    }
-
-    /** Creates a copy of the default {@link SamReaderFactory}. */
-    public static SamReaderFactory makeDefault() {
-        return SamReaderFactoryImpl.copyOf(DEFAULT);
-    }
-
-    /**
-     * Creates an "empty" factory with no enabled {@link Option}s, {@link ValidationStringency#DEFAULT_STRINGENCY}, and
-     * {@link htsjdk.samtools.DefaultSAMRecordFactory}.
-     */
-    public static SamReaderFactory make() {
-        return new SamReaderFactoryImpl(EnumSet.noneOf(Option.class), ValidationStringency.DEFAULT_STRINGENCY, DefaultSAMRecordFactory.getInstance());
-    }
-
-    private static class SamReaderFactoryImpl extends SamReaderFactory {
-        private final static Log LOG = Log.getInstance(SamReaderFactory.class);
-        private final EnumSet<Option> enabledOptions;
-        private ValidationStringency validationStringency;
-        private boolean asynchronousIO = Defaults.USE_ASYNC_IO_READ_FOR_SAMTOOLS;
-        private SAMRecordFactory samRecordFactory;
-        private CustomReaderFactory customReaderFactory;
-        private CRAMReferenceSource referenceSource;
-
-        private SamReaderFactoryImpl(final EnumSet<Option> enabledOptions, final ValidationStringency validationStringency, final SAMRecordFactory samRecordFactory) {
-            this.enabledOptions = EnumSet.copyOf(enabledOptions);
-            this.samRecordFactory = samRecordFactory;
-            this.validationStringency = validationStringency;
-            this.customReaderFactory = CustomReaderFactory.getInstance();
-        }
-   
-        @Override
-        public SamReader open(final File file) {
-            final SamInputResource r = SamInputResource.of(file);
-            final File indexMaybe = SamFiles.findIndex(file);
-            if (indexMaybe != null) r.index(indexMaybe);
-            return open(r);
-        }
-
-
-        @Override
-        public ValidationStringency validationStringency() {
-            return validationStringency;
-        }
-
-        @Override
-        public CRAMReferenceSource referenceSource() {
-            return referenceSource;
-        }
-
-        @Override
-        public SamReaderFactory samRecordFactory(final SAMRecordFactory samRecordFactory) {
-            this.samRecordFactory = samRecordFactory;
-            return this;
-        }
-
-        @Override
-        public SamReaderFactory enable(final Option... options) {
-            Collections.addAll(this.enabledOptions, options);
-            return this;
-        }
-
-        @Override
-        public SamReaderFactory disable(final Option... options) {
-            for (final Option option : options) {
-                this.enabledOptions.remove(option);
-            }
-            return this;
-        }
-
-        @Override
-        public SamReaderFactory setOption(final Option option, final boolean value) {
-            if (value) {
-                return enable(option);
-            } else {
-                return disable(option);
-            }
-        }
-
-        @Override
-        public SamReaderFactory referenceSequence(final File referenceSequence) {
-            this.referenceSource = new ReferenceSource(referenceSequence);
-            return this;
-        }
-
-        @Override
-        public SamReaderFactory referenceSource(final CRAMReferenceSource referenceSource) {
-            this.referenceSource = referenceSource;
-            return this;
-        }
-
-        @Override
-        public SAMFileHeader getFileHeader(final File samFile) {
-            final SamReader reader = open(samFile);
-            final SAMFileHeader header = reader.getFileHeader();
-            CloserUtil.close(reader);
-            return header;
-        }
-
-        @Override
-        public void reapplyOptions(final SamReader reader) {
-            for (final Option option : enabledOptions) {
-                option.applyTo((SamReader.PrimitiveSamReaderToSamReaderAdapter) reader);
-            }
-        }
-
-        @Override
-        public SamReaderFactory validationStringency(final ValidationStringency validationStringency) {
-            this.validationStringency = validationStringency;
-            return this;
-        }
-
-        @Override
-        public SamReaderFactory setUseAsyncIo(final boolean asynchronousIO){
-            this.asynchronousIO = asynchronousIO;
-            return this;
-        }
-
-        @Override
-        public SamReader open(final SamInputResource resource) {
-            final SamReader.PrimitiveSamReader primitiveSamReader;
-            try {
-                final InputResource data = resource.data();
-                final InputResource indexMaybe = resource.indexMaybe();
-                final boolean indexDefined = indexMaybe != null;
-
-                final InputResource.Type type = data.type();
-                if (type == InputResource.Type.URL) {
-                  SamReader reader = customReaderFactory.maybeOpen(
-                      data.asUrl());
-                  if (reader != null) {
-                    return reader;
-                  }
-                }
-                if (type == InputResource.Type.SEEKABLE_STREAM || type == InputResource.Type.URL) {
-                    if (SamStreams.sourceLikeBam(data.asUnbufferedSeekableStream())) {
-                        final SeekableStream bufferedIndexStream;
-                        if (indexDefined && indexMaybe.asUnbufferedSeekableStream() != null) {
-                            bufferedIndexStream = IOUtil.maybeBufferedSeekableStream(indexMaybe.asUnbufferedSeekableStream());
-                        } else {
-                            // TODO: Throw an exception here?  An index _may_ have been provided, but we're ignoring it
-                            bufferedIndexStream = null;
-                        }
-                        primitiveSamReader = new BAMFileReader(
-                                IOUtil.maybeBufferedSeekableStream(data.asUnbufferedSeekableStream()),
-                                bufferedIndexStream,
-                                false,
-                                asynchronousIO,
-                                validationStringency,
-                                this.samRecordFactory
-                        );
-                    } else if (SamStreams.sourceLikeCram(data.asUnbufferedSeekableStream())) {
-                        if (referenceSource == null) {
-                            referenceSource = ReferenceSource.getDefaultCRAMReferenceSource();
-                        }
-                        SeekableStream bufferedIndexStream = indexDefined ?
-                                IOUtil.maybeBufferedSeekableStream(indexMaybe.asUnbufferedSeekableStream()) :
-                                null;
-                        primitiveSamReader = new CRAMFileReader(
-                                IOUtil.maybeBufferedSeekableStream(data.asUnbufferedSeekableStream()),
-                                bufferedIndexStream, referenceSource, validationStringency);
-                    } else {
-                        // assume its a SAM file/no index
-                        LOG.warn("Unable to detect file format from input URL or stream, assuming SAM format.");
-                        primitiveSamReader = new SAMTextReader(
-                                IOUtil.toBufferedStream(data.asUnbufferedInputStream()),
-                                validationStringency, this.samRecordFactory);
-                    }
-                } else if (type == InputResource.Type.SRA_ACCESSION) {
-                    primitiveSamReader = new SRAFileReader(data.asSRAAccession());
-                } else {
-                    InputStream bufferedStream =
-                            IOUtil.maybeBufferInputStream(
-                                    data.asUnbufferedInputStream(),
-                                    Math.max(Defaults.BUFFER_SIZE, BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE)
-                            );
-                    File sourceFile = data.asFile();
-                    // calling asFile is safe even if indexMaybe is a Google Cloud Storage bucket
-                    // (in that case we just get null)
-                    final File indexFile = indexMaybe == null ? null : indexMaybe.asFile();
-                    if (SamStreams.isBAMFile(bufferedStream)) {
-                        if (sourceFile == null || !sourceFile.isFile()) {
-                            // check whether we can seek
-                            final SeekableStream indexSeekable = indexMaybe == null ? null : indexMaybe.asUnbufferedSeekableStream();
-                            // do not close bufferedStream, it's the same stream we're getting here.
-                            SeekableStream sourceSeekable = data.asUnbufferedSeekableStream();
-                            if (null == sourceSeekable || null == indexSeekable) {
-                                // not seekable.
-                                // it's OK that we consumed a bit of the stream already, this ctor expects it.
-                                primitiveSamReader = new BAMFileReader(bufferedStream, indexFile, false, asynchronousIO, validationStringency, this.samRecordFactory);
-                            } else {
-                                // seekable.
-                                // need to return to the beginning because it's the same stream we used earlier
-                                // and read a bit from, and that form of the ctor expects the stream to start at 0.
-                                sourceSeekable.seek(0);
-                                primitiveSamReader = new BAMFileReader(
-                                        sourceSeekable, indexSeekable, false, asynchronousIO, validationStringency, this.samRecordFactory);
-                            }
-                        } else {
-                            bufferedStream.close();
-                            primitiveSamReader = new BAMFileReader(sourceFile, indexFile, false, asynchronousIO, validationStringency, this.samRecordFactory);
-                        }
-                    } else if (BlockCompressedInputStream.isValidFile(bufferedStream)) {
-                        primitiveSamReader = new SAMTextReader(new BlockCompressedInputStream(bufferedStream), validationStringency, this.samRecordFactory);
-                    } else if (SamStreams.isGzippedSAMFile(bufferedStream)) {
-                        primitiveSamReader = new SAMTextReader(new GZIPInputStream(bufferedStream), validationStringency, this.samRecordFactory);
-                    } else if (SamStreams.isCRAMFile(bufferedStream)) {
-                        if (referenceSource == null) {
-                            referenceSource = ReferenceSource.getDefaultCRAMReferenceSource();
-                        }
-                        if (sourceFile == null || !sourceFile.isFile()) {
-                            primitiveSamReader = new CRAMFileReader(bufferedStream, indexFile, referenceSource, validationStringency);
-                        } else {
-                            bufferedStream.close();
-                            primitiveSamReader = new CRAMFileReader(sourceFile, indexFile, referenceSource, validationStringency);
-                        }
-                    } else if (sourceFile != null && isSra(sourceFile)) {
-                        if (bufferedStream != null) {
-                            bufferedStream.close();
-                        }
-                        primitiveSamReader = new SRAFileReader(new SRAAccession(sourceFile.getPath()));
-                    } else {
-                        if (indexDefined) {
-                            bufferedStream.close();
-                            throw new RuntimeException("Cannot use index file with textual SAM file");
-                        }
-                        primitiveSamReader = new SAMTextReader(bufferedStream, sourceFile, validationStringency, this.samRecordFactory);
-                    }
-                }
-
-                // Apply the options defined by this factory to this reader
-                final SamReader.PrimitiveSamReaderToSamReaderAdapter reader =
-                        new SamReader.PrimitiveSamReaderToSamReaderAdapter(primitiveSamReader, resource);
-
-                for (final Option option : enabledOptions) {
-                    option.applyTo(reader);
-                }
-
-                return reader;
-            } catch (final IOException e) {
-                throw new RuntimeIOException(e);
-            }
-        }
-
-        /** Attempts to detect whether the file is an SRA accessioned file. If SRA support is not available, returns false. */
-        private boolean isSra(final File sourceFile) {
-            try {
-                // if SRA fails to initialize (the most common reason is a failure to find/load native libraries),
-                // it will throw a subclass of java.lang.Error and here we only catch subclasses of java.lang.Exception
-                //
-                // Note: SRA initialization errors should not be ignored, but rather shown to user
-                return SRAAccession.isValid(sourceFile.getPath());
-            } catch (final Exception e) {
-                return false;
-            }
-        }
-
-        public static SamReaderFactory copyOf(final SamReaderFactoryImpl target) {
-            return new SamReaderFactoryImpl(target.enabledOptions, target.validationStringency, target.samRecordFactory);
-        }
-    }
-
-    /** A collection of binary {@link SamReaderFactory} options. */
-    public enum Option {
-        /**
-         * The factory's {@link SamReader}s will produce populated (non-null) values when calling {@link SAMRecord#getFileSource()}.
-         * <p/>
-         * This option increases memory footprint slightly per {@link htsjdk.samtools.SAMRecord}.
-         */
-        INCLUDE_SOURCE_IN_RECORDS {
-            @Override
-            void applyTo(final BAMFileReader underlyingReader, final SamReader reader) {
-                underlyingReader.enableFileSource(reader, true);
-            }
-
-            @Override
-            void applyTo(final SAMTextReader underlyingReader, final SamReader reader) {
-                underlyingReader.enableFileSource(reader, true);
-            }
-
-            @Override
-            void applyTo(final CRAMFileReader underlyingReader, final SamReader reader) {
-                underlyingReader.enableFileSource(reader, true);
-            }
-
-            @Override
-            void applyTo(final SRAFileReader underlyingReader, final SamReader reader) {
-                underlyingReader.enableFileSource(reader, true);
-            }
-        },
-
-        /**
-         * The factory's {@link SamReader}s' {@link SamReader#indexing()}'s calls to {@link SamReader.Indexing#getIndex()} will produce
-         * {@link BAMIndex}es that do some caching in memory instead of reading the index from the disk for each query operation.
-         *
-         * @see SamReader#indexing()
-         * @see htsjdk.samtools.SamReader.Indexing#getIndex()
-         */
-        CACHE_FILE_BASED_INDEXES {
-            @Override
-            void applyTo(final BAMFileReader underlyingReader, final SamReader reader) {
-                underlyingReader.enableIndexCaching(true);
-            }
-
-            @Override
-            void applyTo(final SAMTextReader underlyingReader, final SamReader reader) {
-                logDebugIgnoringOption(reader, this);
-            }
-
-            @Override
-            void applyTo(final CRAMFileReader underlyingReader, final SamReader reader) {
-                underlyingReader.enableIndexCaching(true);
-            }
-
-            @Override
-            void applyTo(final SRAFileReader underlyingReader, final SamReader reader) {
-                underlyingReader.enableIndexCaching(true);
-            }
-        },
-
-        /**
-         * The factory's {@link SamReader}s' will not use memory mapping for accessing index files (which is used by default).  This is
-         * slower but more scalable when accessing large numbers of BAM files sequentially.
-         *
-         * @see SamReader#indexing()
-         * @see htsjdk.samtools.SamReader.Indexing#getIndex()
-         */
-        DONT_MEMORY_MAP_INDEX {
-            @Override
-            void applyTo(final BAMFileReader underlyingReader, final SamReader reader) {
-                underlyingReader.enableIndexMemoryMapping(false);
-            }
-
-            @Override
-            void applyTo(final SAMTextReader underlyingReader, final SamReader reader) {
-                logDebugIgnoringOption(reader, this);
-            }
-
-            @Override
-            void applyTo(final CRAMFileReader underlyingReader, final SamReader reader) {
-                underlyingReader.enableIndexMemoryMapping(false);
-            }
-
-            @Override
-            void applyTo(final SRAFileReader underlyingReader, final SamReader reader) {
-                underlyingReader.enableIndexMemoryMapping(false);
-            }
-        },
-
-        /**
-         * Eagerly decode {@link htsjdk.samtools.SamReader}'s {@link htsjdk.samtools.SAMRecord}s, which can reduce memory footprint if many
-         * fields are being read per record, or if fields are going to be updated.
-         */
-        EAGERLY_DECODE {
-            @Override
-            void applyTo(final BAMFileReader underlyingReader, final SamReader reader) {
-                underlyingReader.setEagerDecode(true);
-            }
-
-            @Override
-            void applyTo(final SAMTextReader underlyingReader, final SamReader reader) {
-                logDebugIgnoringOption(reader, this);
-            }
-
-            @Override
-            void applyTo(final CRAMFileReader underlyingReader, final SamReader reader) {
-                logDebugIgnoringOption(reader, this);
-            }
-
-            @Override
-            void applyTo(final SRAFileReader underlyingReader, final SamReader reader) {
-                logDebugIgnoringOption(reader, this);
-            }
-        },
-
-        /**
-         * For {@link htsjdk.samtools.SamReader}s backed by block-compressed streams, enable CRC validation of those streams.  This is an
-         * expensive operation, but serves to ensure validity of the stream.
-         */
-        VALIDATE_CRC_CHECKSUMS {
-            @Override
-            void applyTo(final BAMFileReader underlyingReader, final SamReader reader) {
-                underlyingReader.enableCrcChecking(true);
-            }
-
-            @Override
-            void applyTo(final SAMTextReader underlyingReader, final SamReader reader) {
-                logDebugIgnoringOption(reader, this);
-            }
-
-            @Override
-            void applyTo(final CRAMFileReader underlyingReader, final SamReader reader) {
-                logDebugIgnoringOption(reader, this);
-            }
-
-            @Override
-            void applyTo(final SRAFileReader underlyingReader, final SamReader reader) {
-                logDebugIgnoringOption(reader, this);
-            }
-
-        };
-
-        public static EnumSet<Option> DEFAULTS = EnumSet.noneOf(Option.class);
-
-        /** Applies this option to the provided reader, if applicable. */
-        void applyTo(final SamReader.PrimitiveSamReaderToSamReaderAdapter reader) {
-            final SamReader.PrimitiveSamReader underlyingReader = reader.underlyingReader();
-            if (underlyingReader instanceof BAMFileReader) {
-                applyTo((BAMFileReader) underlyingReader, reader);
-            } else if (underlyingReader instanceof SAMTextReader) {
-                applyTo((SAMTextReader) underlyingReader, reader);
-            } else if (underlyingReader instanceof CRAMFileReader) {
-                applyTo((CRAMFileReader) underlyingReader, reader);
-            } else if (underlyingReader instanceof SRAFileReader) {
-                applyTo((SRAFileReader) underlyingReader, reader);
-            } else {
-                throw new IllegalArgumentException(String.format("Unrecognized reader type: %s.", underlyingReader.getClass()));
-            }
-
-        }
-
-        private static void logDebugIgnoringOption(final SamReader r, final Option option) {
-            LOG.debug(String.format("Ignoring %s option; does not apply to %s readers.", option, r.getClass().getSimpleName()));
-        }
-
-        private final static Log LOG = Log.getInstance(Option.class);
-
-        abstract void applyTo(final BAMFileReader underlyingReader, final SamReader reader);
-
-        abstract void applyTo(final SAMTextReader underlyingReader, final SamReader reader);
-
-        abstract void applyTo(final CRAMFileReader underlyingReader, final SamReader reader);
-
-        abstract void applyTo(final SRAFileReader underlyingReader, final SamReader reader);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/SamStreams.java b/src/main/java/htsjdk/samtools/SamStreams.java
deleted file mode 100644
index 114d23b..0000000
--- a/src/main/java/htsjdk/samtools/SamStreams.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.BlockCompressedStreamConstants;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Arrays;
-import java.util.zip.GZIPInputStream;
-
-/**
- * Utilities related to processing of {@link java.io.InputStream}s encoding SAM data
- * 
- * @author mccowan
- */
-public class SamStreams {
-    private static int readBytes(final InputStream stream, final byte[] buffer, final int offset, final int length)
-            throws IOException {
-        int bytesRead = 0;
-        while (bytesRead < length) {
-            final int count = stream.read(buffer, offset + bytesRead, length - bytesRead);
-            if (count <= 0) {
-                break;
-            }
-            bytesRead += count;
-        }
-        return bytesRead;
-    }
-
-    public static boolean isCRAMFile(final InputStream stream) throws IOException {
-        stream.mark(4);
-        final int buffSize = CramHeader.MAGIC.length;
-        final byte[] buffer = new byte[buffSize];
-        readBytes(stream, buffer, 0, buffSize);
-        stream.reset();
-
-        return Arrays.equals(buffer, CramHeader.MAGIC);
-    }
-
-    /**
-     * @param stream stream.markSupported() must be true
-     * @return true if this looks like a BAM file.
-     */
-    public static boolean isBAMFile(final InputStream stream)
-            throws IOException {
-        if (!BlockCompressedInputStream.isValidFile(stream)) {
-            return false;
-        }
-        final int buffSize = BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE;
-        stream.mark(buffSize);
-        final byte[] buffer = new byte[buffSize];
-        readBytes(stream, buffer, 0, buffSize);
-        stream.reset();
-        try(final BlockCompressedInputStream bcis = new BlockCompressedInputStream(new ByteArrayInputStream(buffer))){
-            final byte[] magicBuf = new byte[4];
-            final int magicLength = readBytes(bcis, magicBuf, 0, 4);
-            return magicLength == BAMFileConstants.BAM_MAGIC.length && Arrays.equals(BAMFileConstants.BAM_MAGIC, magicBuf);
-        }
-    }
-
-    /**
-     * Checks whether the file is a gzipped sam file.  Returns true if it
-     * is and false otherwise.
-     */
-    public static boolean isGzippedSAMFile(final InputStream stream) {
-        if (!stream.markSupported()) {
-            throw new IllegalArgumentException("Cannot test a stream that doesn't support marking.");
-        }
-        stream.mark(8000);
-
-        try {
-            final GZIPInputStream gunzip = new GZIPInputStream(stream);
-            final int ch = gunzip.read();
-            return true;
-        } catch (final IOException ioe) {
-            return false;
-        } finally {
-            try {
-                stream.reset();
-            } catch (final IOException ioe) {
-                throw new IllegalStateException("Could not reset stream.");
-            }
-        }
-    }
-
-    // Its too expensive to examine the remote file to determine type.
-    // Rely on file extension.
-    public static boolean sourceLikeBam(final SeekableStream strm) {
-        String source = strm.getSource();
-        if (source == null) {
-            // assume any stream with a null source is a BAM file
-            // (https://github.com/samtools/htsjdk/issues/619)
-            return true;
-        }
-
-        //Source will typically be a file path or URL
-        //If it's a URL we require one of the query parameters to be a cram file
-        try {
-            final URL sourceURL = new URL(source);
-            final String urlPath = sourceURL.getPath().toLowerCase();
-            String queryParams = sourceURL.getQuery();
-            if (queryParams != null) {
-                queryParams = queryParams.toLowerCase();
-            }
-            return urlPath.endsWith(".bam") ||
-                    (queryParams != null &&
-                            (queryParams.endsWith(".bam") ||
-                                    queryParams.contains(".bam?") ||
-                                    queryParams.contains(".bam&") ||
-                                    queryParams.contains(".bam%26"))
-                    );
-        }
-        catch (MalformedURLException e) {
-            source = source.toLowerCase();
-            return source.endsWith(".bam") ||
-                    source.contains(".bam?") ||
-                    source.contains(".bam&") ||
-                    source.contains(".bam%26");
-        }
-    }
-
-    // Its too expensive to examine the remote file to determine type.
-    // Rely on file extension.
-    public static boolean sourceLikeCram(final SeekableStream strm) {
-        String source = strm.getSource();
-        if (source == null) {
-            // sourceLikeBam assumes any stream with a null source is a BAM file
-            // (https://github.com/samtools/htsjdk/issues/619); in order to not
-            // propagate more chaos we return false here
-            return false;
-        }
-
-        // Source will typically be a file path or URL
-        // If it's a URL we require one of the query parameters to be a cram file
-        try {
-            final URL sourceURL = new URL(source);
-            final String urlPath = sourceURL.getPath().toLowerCase();
-            String queryParams = sourceURL.getQuery();
-            if (queryParams != null) {
-                queryParams = queryParams.toLowerCase();
-            }
-            return urlPath.endsWith(".cram") ||
-                    (queryParams != null &&
-                            (queryParams.endsWith(".cram") ||
-                             queryParams.contains(".cram?") ||
-                             queryParams.contains(".cram&") ||
-                             queryParams.contains(".cram%26"))
-                    );
-        }
-        catch (MalformedURLException e) {
-            source = source.toLowerCase();
-            return source.endsWith(".cram") ||
-                    source.contains(".cram?") ||
-                    source.contains(".cram&") ||
-                    source.contains(".cram%26");
-        }
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/SecondaryOrSupplementarySkippingIterator.java b/src/main/java/htsjdk/samtools/SecondaryOrSupplementarySkippingIterator.java
deleted file mode 100644
index 328e748..0000000
--- a/src/main/java/htsjdk/samtools/SecondaryOrSupplementarySkippingIterator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.PeekIterator;
-
-/**
- * Wrapper around SAMRecord iterator that skips over secondary and supplementary elements.
- * This iterator conflates a filtering iterator and a peekable iterator.  It would be cleaner to
- * handle those concerns separately. This class should be viewed as a replacement for NotPrimarySkippingIterator,
- * in that we did not want to change the functionality of NPSI to no longer match its name
- */
-public class SecondaryOrSupplementarySkippingIterator {
-    private final PeekIterator<SAMRecord> it;
-
-    public SecondaryOrSupplementarySkippingIterator(final CloseableIterator<SAMRecord> underlyingIt) {
-        it = new PeekIterator<SAMRecord>(underlyingIt);
-        skipAnyNotprimary();
-    }
-
-    public boolean hasCurrent() {
-        return it.hasNext();
-    }
-
-    public SAMRecord getCurrent() {
-        assert(hasCurrent());
-        return it.peek();
-    }
-
-    public boolean advance() {
-        it.next();
-        skipAnyNotprimary();
-        return hasCurrent();
-    }
-
-    private void skipAnyNotprimary() {
-        while (it.hasNext() && it.peek().isSecondaryOrSupplementary()) {
-            it.next();
-        }
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/StreamInflatingIndexingOutputStream.java b/src/main/java/htsjdk/samtools/StreamInflatingIndexingOutputStream.java
deleted file mode 100644
index 6b653fe..0000000
--- a/src/main/java/htsjdk/samtools/StreamInflatingIndexingOutputStream.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-
-/**
- * OutputStream implementation that writes output to an underlying output stream while also copying the
- * same bytes to a PipedOutputStream that routes the data back into an Indexer to generate a BAMIndex
- * by inflating and decoding the stream and feeding the SAMRecords to a BAMIndexer.
- */
-class StreamInflatingIndexingOutputStream extends OutputStream {
-    private final OutputStream s1;
-    private final PipedOutputStream s2;
-    private final Thread thread;
-
-    public StreamInflatingIndexingOutputStream(final OutputStream s1, final File indexFile) {
-        try {
-            this.s1 = s1;
-            this.s2 = new PipedOutputStream();
-            final PipedInputStream pin = new PipedInputStream(this.s2, Defaults.NON_ZERO_BUFFER_SIZE);
-            this.thread = new Thread(new Indexer(indexFile, pin), "BamIndexingThread");
-            this.thread.start();
-        } catch (final IOException ioe) {
-            throw new RuntimeIOException(ioe);
-        }
-    }
-
-    @Override
-    public final void write(final int b) throws IOException {
-        this.s1.write(b);
-        this.s2.write(b);
-    }
-
-    @Override
-    public final void write(final byte[] b) throws IOException {
-        this.s1.write(b);
-        this.s2.write(b);
-    }
-
-    @Override
-    public final void write(final byte[] b, final int off, final int len) throws IOException {
-        this.s1.write(b, off, len);
-        this.s2.write(b, off, len);
-    }
-
-    @Override
-    public final void flush() throws IOException {
-        this.s1.flush();
-        this.s2.flush();
-    }
-
-    @Override
-    public final void close() throws IOException {
-        this.s1.close();
-        this.s2.close();
-
-        try {
-            this.thread.join();
-        } catch (final InterruptedException ie) {
-            throw new RuntimeException(ie);
-        }
-    }
-}
-
-/**
- * A little class that takes an InputStream from which it reads a BAM file, generates
- * a BAMIndex and then writes the index to the File provided.  All operations are designed
- * to be carried out in a separate thread.
- */
-class Indexer implements Runnable {
-    private final File index;
-    private final InputStream stream;
-
-    /** Constructs an indexer that reads from the stream provided and writes an index to the File provided. */
-    Indexer(final File index, final InputStream stream) {
-        this.index = index;
-        this.stream = stream;
-    }
-
-    /** Runnable implementation that reads the entire stream and writes the index. */
-    @Override
-    public void run() {
-        final SamReader in = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
-                .enable(SamReaderFactory.Option.INCLUDE_SOURCE_IN_RECORDS).disable(SamReaderFactory.Option.VALIDATE_CRC_CHECKSUMS)
-                .open(SamInputResource.of(this.stream));
-
-        final BAMIndexer indexer = new BAMIndexer(this.index, in.getFileHeader());
-        for (final SAMRecord rec : in) {
-            indexer.processAlignment(rec);
-        }
-
-        indexer.finish();
-        CloserUtil.close(in);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/TagValueAndUnsignedArrayFlag.java b/src/main/java/htsjdk/samtools/TagValueAndUnsignedArrayFlag.java
deleted file mode 100644
index 084d9c0..0000000
--- a/src/main/java/htsjdk/samtools/TagValueAndUnsignedArrayFlag.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2011 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * CVO to use as a method return value.
- */
-public class TagValueAndUnsignedArrayFlag {
-    public final Object value;
-    public final boolean isUnsignedArray;
-
-    public TagValueAndUnsignedArrayFlag(Object value, boolean unsignedArray) {
-        this.value = value;
-        isUnsignedArray = unsignedArray;
-    }
-
-    TagValueAndUnsignedArrayFlag(Object value) {
-        this.value = value;
-        this.isUnsignedArray = false;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/TextCigarCodec.java b/src/main/java/htsjdk/samtools/TextCigarCodec.java
deleted file mode 100755
index 6175443..0000000
--- a/src/main/java/htsjdk/samtools/TextCigarCodec.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.StringUtil;
-
-/**
- * Convert between String and Cigar class representations of CIGAR.
- */
-public class TextCigarCodec
-{
-    private static final byte ZERO_BYTE = "0".getBytes()[0];
-    private static final byte NINE_BYTE = "9".getBytes()[0];
-
-    /**
-     * Convert from Cigar class representation to String.
-     * @param cigar in Cigar class format
-     * @return CIGAR in String form ala SAM text file.  "*" means empty CIGAR.
-     */
-    public static String encode(final Cigar cigar) {
-        if (cigar.isEmpty()) {
-            return SAMRecord.NO_ALIGNMENT_CIGAR;
-        }
-        final StringBuilder ret = new StringBuilder();
-        for (final CigarElement cigarElement : cigar.getCigarElements()) {
-            ret.append(cigarElement.getLength());
-            ret.append(cigarElement.getOperator());
-        }
-        return ret.toString();
-    }
-
-    /**
-     * Convert from String CIGAR representation to Cigar class representation.  Does not
-     * do validation beyond the most basic CIGAR string well-formedness, i.e. each operator is
-     * valid, and preceded by a decimal length.
-     * @param textCigar CIGAR in String form ala SAM text file.  "*" means empty CIGAR.
-     * @throws RuntimeException if textCigar is invalid at the most basic level.
-     * @return cigar in Cigar class format
-     */
-    public static Cigar decode(final String textCigar) {
-        if (SAMRecord.NO_ALIGNMENT_CIGAR.equals(textCigar)) {
-            return new Cigar();
-        }
-        final Cigar ret = new Cigar();
-        final byte[] cigarBytes = StringUtil.stringToBytes(textCigar);
-        for (int i = 0; i < cigarBytes.length; ++i) {
-            if (!isDigit(cigarBytes[i])) {
-                throw new IllegalArgumentException("Malformed CIGAR string: " + textCigar);
-            }
-            int length = (cigarBytes[i] - ZERO_BYTE);
-            for (++i; isDigit(cigarBytes[i]); ++i) {
-                length = (length * 10) + cigarBytes[i] - ZERO_BYTE;
-            }
-            final CigarOperator operator = CigarOperator.characterToEnum(cigarBytes[i]);
-            ret.add(new CigarElement(length, operator));
-        }
-        return ret;
-    }
-    
-    private static boolean isDigit(final byte c) {
-        return c >= ZERO_BYTE && c <= NINE_BYTE;
-    }
-
-    
-        
-}
-
-/******************************************************************/
-/**************************[END OF TextCigarCodec.java]*************************/
-/******************************************************************/
diff --git a/src/main/java/htsjdk/samtools/TextTagCodec.java b/src/main/java/htsjdk/samtools/TextTagCodec.java
deleted file mode 100644
index 60363e1..0000000
--- a/src/main/java/htsjdk/samtools/TextTagCodec.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.DateParser;
-import htsjdk.samtools.util.Iso8601Date;
-import htsjdk.samtools.util.StringUtil;
-
-import java.lang.reflect.Array;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.util.Date;
-import java.util.Map;
-
-/**
- * Converter between SAM text representation of a tag, and in-memory Object representation.
- * Note that this class is not thread-safe, in that some local variables have been made into instance
- * variables in order to reduce object creation, but it should not ever be the case that the same
- * instance is used in multiple threads.
- */
-public class TextTagCodec {
-    // 3 fields for non-empty strings 2 fields if the string is empty.
-    private static final int NUM_TAG_FIELDS = 3;
-
-    /**
-     * This is really a local variable of decode(), but allocated here to reduce allocations.
-     */
-    private final String[] fields = new String[NUM_TAG_FIELDS];
-
-    /**
-     * Convert in-memory representation of tag to SAM text representation.
-     * @param tagName Two-character tag name.
-     * @param value Tag value as approriate Object subclass.
-     * @return SAM text String representation, i.e. name:type:value
-     */
-    public String encode(final String tagName, Object value) {
-        final StringBuilder sb = new StringBuilder(tagName);
-        sb.append(':');
-        char tagType = BinaryTagCodec.getTagValueType(value);
-        switch (tagType) {
-            case 'c':
-            case 'C':
-            case 's':
-            case 'S':
-            case 'I':
-                tagType = 'i';
-        }
-        if (tagType == 'H') {
-            // H should never happen anymore.
-            value = StringUtil.bytesToHexString((byte[])value);
-        } else if (tagType == 'B') {
-            value = getArrayType(value, false) + "," + encodeArrayValue(value);
-        } else if (tagType == 'i') {
-            final long longVal = ((Number) value).longValue();
-            // as the spec says: [-2^31, 2^32)
-            if (longVal < Integer.MIN_VALUE || longVal > BinaryCodec.MAX_UINT) {
-                throw new IllegalArgumentException("Value for tag " + tagName + " cannot be stored in either a signed or unsigned 32-bit integer: " + longVal);
-            }
-        }
-        sb.append(tagType).append(':').append(value.toString());
-        return sb.toString();
-    }
-
-    private char getArrayType(final Object array, final boolean isUnsigned) {
-        final char type;
-        final Class<?> componentType = array.getClass().getComponentType();
-        if (componentType == Float.TYPE) {
-            if (isUnsigned) throw new IllegalArgumentException("float array cannot be unsigned");
-            return 'f';
-        }
-        else if (componentType == Byte.TYPE)    type = 'c';
-        else if (componentType == Short.TYPE)   type = 's';
-        else if (componentType == Integer.TYPE) type = 'i';
-        else throw new IllegalArgumentException("Unrecognized array type " + componentType);
-        return (isUnsigned? Character.toUpperCase(type): type);
-    }
-
-    private String encodeArrayValue(final Object value) {
-        final StringBuilder ret = new StringBuilder(Array.get(value, 0).toString());
-        final int length = Array.getLength(value);
-        for (int i = 1; i < length; ++i) {
-            ret.append(',');
-            ret.append(Array.get(value, i).toString());
-        }
-        return ret.toString();
-
-    }
-
-    private long[] widenToUnsigned(final Object array) {
-        final Class<?> componentType = array.getClass().getComponentType();
-        final long mask;
-        if (componentType == Byte.TYPE)    mask = 0xffL;
-        else if (componentType == Short.TYPE)   mask = 0xffffL;
-        else if (componentType == Integer.TYPE) mask = 0xffffffffL;
-        else throw new IllegalArgumentException("Unrecognized unsigned array type " + componentType);
-        final long[] ret = new long[Array.getLength(array)];
-        for (int i = 0; i < ret.length; ++i) {
-            ret[i] = Array.getLong(array, i) & mask;
-        }
-        return ret;
-    }
-
-    String encodeUnsignedArray(final String tagName, final Object array) {
-        if (!array.getClass().isArray()) {
-            throw new IllegalArgumentException("Non-array passed to encodeUnsignedArray: " + array.getClass());
-        }
-        final long[] widened = widenToUnsigned(array);
-        return tagName + ":B:" + getArrayType(array, true) + "," + encodeArrayValue(widened);
-    }
-
-    /**
-     * Encode a standard header tag, which should not have a type field.
-     * @param tagName 2-character String.
-     * @param value Not necessarily a String.  Some of these are integers but the type is implied by
-     * the tagName.  Converted to String with toString().
-     * @return Colon-separated text representation suitable for a SAM header, i.e. name:value.
-     */
-    public String encodeUntypedTag(final String tagName, final Object value) {
-        return new StringBuilder(tagName).append(':')
-                .append(value.toString()).toString();
-    }
-
-    /**
-     * Convert typed tag in SAM text format (name:type:value) into tag name and Object value representation.
-     * @param tag SAM text format name:type:value tag.
-     * @return Tag name as 2-character String, and tag value in appropriate class based on tag type.
-     * If value is an unsigned array, then the value is a TagValueAndUnsignedArrayFlag object.
-     */
-    public Map.Entry<String, Object> decode(final String tag) {
-        final int numFields = StringUtil.splitConcatenateExcessTokens(tag, fields, ':');
-        if (numFields != TextTagCodec.NUM_TAG_FIELDS && numFields != TextTagCodec.NUM_TAG_FIELDS - 1) {
-            throw new SAMFormatException("Not enough fields in tag '" + tag + "'");
-        }
-        final String key = fields[0];
-        final String type = fields[1];
-        final String stringVal = numFields == TextTagCodec.NUM_TAG_FIELDS ? fields[2] : "";
-        final Object val = convertStringToObject(type, stringVal);
-        return new Map.Entry<String, Object>() {
-            public String getKey() {
-                return key;
-            }
-
-            public Object getValue() {
-                return val;
-            }
-
-            public Object setValue(final Object o) {
-                throw new UnsupportedOperationException();
-            }
-        };
-    }
-
-    private Object convertStringToObject(final String type, final String stringVal) {
-        if (type.equals("Z")) {
-            return stringVal;
-        } else if (type.equals("A")) {
-            if (stringVal.length() != 1) {
-                throw new SAMFormatException("Tag of type A should have a single-character value");
-            }
-            return stringVal.charAt(0);
-        } else if (type.equals("i")) {
-            final long lValue;
-            try {
-                lValue = Long.valueOf(stringVal);
-            } catch (NumberFormatException e) {
-                throw new SAMFormatException("Tag of type i should have signed decimal value");
-            }
-
-            if (lValue >= Integer.MIN_VALUE && lValue <= Integer.MAX_VALUE) {
-                return (int) lValue;
-            }
-            else if (SAMUtils.isValidUnsignedIntegerAttribute(lValue)) {
-                return lValue;
-            }
-            else {
-                throw new SAMFormatException("Integer is out of range for both a 32-bit signed and unsigned integer: " + stringVal);
-            }
-        } else if (type.equals("f")) {
-            try {
-                return new Float(stringVal);
-            } catch (NumberFormatException e) {
-                throw new SAMFormatException("Tag of type f should have single-precision floating point value");
-            }
-        } else if (type.equals("H")) {
-            try {
-                return StringUtil.hexStringToBytes(stringVal);
-            } catch (NumberFormatException e) {
-                throw new SAMFormatException("Tag of type H should have valid hex string with even number of digits");
-            }
-        } else if (type.equals("B")) {
-            return covertStringArrayToObject(stringVal);
-        } else {
-            throw new SAMFormatException("Unrecognized tag type: " + type);
-        }
-    }
-
-    private Object covertStringArrayToObject(final String stringVal) {
-        final String[] elementTypeAndValue = new String[2];
-        if (StringUtil.splitConcatenateExcessTokens(stringVal, elementTypeAndValue, ',') != 2) {
-            throw new SAMFormatException("Tag of type B should have an element type followed by comma");
-        }
-        if (elementTypeAndValue[0].length() != 1) {
-            throw new SAMFormatException("Unrecognized element type for array tag value: " + elementTypeAndValue[0]);
-        }
-        final char elementType = elementTypeAndValue[0].charAt(0);
-        final String[] stringValues = elementTypeAndValue[1].split(",");
-        if (stringValues.length == 0) throw new SAMFormatException("Tag of type B should have at least one element");
-        if (elementType == 'f') {
-            final float[] ret = new float[stringValues.length];
-            for (int i = 0; i < stringValues.length; ++i) {
-                try {
-                    ret[i] = Float.parseFloat(stringValues[i]);
-                } catch (NumberFormatException e) {
-                    throw new SAMFormatException("Array tag of type f should have single-precision floating point value");
-                }
-            }
-            return ret;
-        }
-        long mask = Long.MAX_VALUE;
-        long minValue = Long.MAX_VALUE;
-        long maxValue = Long.MIN_VALUE;
-        final boolean isUnsigned = Character.isUpperCase(elementType);
-        switch (Character.toLowerCase(elementType)) {
-            case 'c':
-                if (isUnsigned) {
-                    mask = 0xffL;
-                } else {
-                    minValue = Byte.MIN_VALUE;
-                    maxValue = Byte.MAX_VALUE;
-                }
-                break;
-            case 's':
-                if (isUnsigned) {
-                    mask = 0xffffL;
-                } else {
-                    minValue = Short.MIN_VALUE;
-                    maxValue = Short.MAX_VALUE;
-                }
-                break;
-            case 'i':
-                if (isUnsigned) {
-                    mask = 0xffffffffL;
-                } else {
-                    minValue = Integer.MIN_VALUE;
-                    maxValue = Integer.MAX_VALUE;
-                }
-                break;
-            default:
-                throw new SAMFormatException("Unrecognized array tag element type: " + elementType);
-        }
-        if (isUnsigned) {
-            minValue = 0;
-            maxValue = mask;
-        }
-        final long[] longValues = new long[stringValues.length];
-        for (int i = 0; i < stringValues.length; ++i) {
-            final long longValue;
-            try {
-                longValue = Long.parseLong(stringValues[i]);
-            } catch (NumberFormatException e) {
-                throw new SAMFormatException("Array tag of type " + elementType + " should have integral value");
-            }
-            if (longValue < minValue || longValue > maxValue) {
-                throw new SAMFormatException("Value for element of array tag of type " + elementType +
-                " is out of allowed range: " + longValue);
-            }
-            longValues[i] = longValue;
-        }
-
-        switch (Character.toLowerCase(elementType)) {
-            case 'c': {
-                final byte[] array = new byte[longValues.length];
-                for (int i = 0; i < longValues.length; ++i) array[i] = (byte)longValues[i];
-                if (isUnsigned) return new TagValueAndUnsignedArrayFlag(array, true);
-                else return array;
-            }
-            case 's': {
-                final short[] array = new short[longValues.length];
-                for (int i = 0; i < longValues.length; ++i) array[i] = (short)longValues[i];
-                if (isUnsigned) return new TagValueAndUnsignedArrayFlag(array, true);
-                else return array;
-            }
-            case 'i':{
-                final int[] array = new int[longValues.length];
-                for (int i = 0; i < longValues.length; ++i) array[i] = (int)longValues[i];
-                if (isUnsigned) return new TagValueAndUnsignedArrayFlag(array, true);
-                else return array;
-            }
-            default:
-                throw new SAMFormatException("Unrecognized array tag element type: " + elementType);
-        }
-    }
-
-    Iso8601Date decodeDate(final String dateStr) {
-        try {
-            return new Iso8601Date(dateStr);
-        } catch (DateParser.InvalidDateException ex) {
-            try {
-                return new Iso8601Date(DateFormat.getDateTimeInstance().parse(dateStr));
-            } catch (ParseException e) {
-                try {
-                    return new Iso8601Date(new Date(dateStr));
-                } catch (Exception e1) {
-                    throw new DateParser.InvalidDateException("Could not parse as date: " + dateStr, e);
-                }
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/TextualBAMIndexWriter.java b/src/main/java/htsjdk/samtools/TextualBAMIndexWriter.java
deleted file mode 100644
index d790270..0000000
--- a/src/main/java/htsjdk/samtools/TextualBAMIndexWriter.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.PrintWriter;
-import java.util.List;
-
-/**
- * Class for writing binary BAM index files as human-readable text.
- * Used for testing only.
-
- */
-class TextualBAMIndexWriter implements BAMIndexWriter {
-
-    protected final int nRef;
-    protected final File output;
-    private final PrintWriter pw;
-    private int count = 0;
-
-    /**
-     * constructor
-     *
-     * @param nRef    Number of reference sequences
-     * @param output   BAM Index output file
-     */
-    public TextualBAMIndexWriter(final int nRef, final File output) {
-        this.output = output;
-        this.nRef = nRef;
-        try {
-            pw = new PrintWriter(output);
-        } catch (final FileNotFoundException e) {
-            throw new SAMException("Can't find output file " + output, e);
-        }
-        writeHeader();
-    }
-
-    /**
-     * Write header information at the beginning of the file
-     */
-    private void writeHeader() {
-        pw.println("n_ref=" + nRef);
-    }
-
-    /**
-     * Write this content as human-readable text
-     */
-    public void writeReference(final BAMIndexContent content) {
-
-        final int reference = content.getReferenceSequence();
-
-        if (content == null) {
-            writeNullContent(reference);
-            count++;
-            return;
-        }
-
-        if (reference != count){
-            throw new SAMException("Reference on content is " + reference + " but expecting reference " + count);
-        }
-        count++;
-
-        final BAMIndexContent.BinList bins = content.getBins();
-        final int size = bins == null ? 0 : content.getNumberOfNonNullBins();
-
-        if (size == 0) {
-            writeNullContent(reference);
-            return;
-        }
-
-        //final List<Chunk> chunks = content.getMetaData() == null ? null
-        //        : content.getMetaData().getMetaDataChunks();
-        final BAMIndexMetaData metaData = content.getMetaData();
-
-        pw.println("Reference " + reference + " has n_bin= " + Integer.toString(size + (metaData != null? 1 : 0)));
-
-        // chunks
-        for (final Bin bin : bins) {   // note, bins will always be sorted
-            if (bin.getBinNumber() == GenomicIndexUtil.MAX_BINS)  break;
-            if (bin.getChunkList() == null) {
-                pw.println("  Ref " + reference + " bin " + bin.getBinNumber() + " has no binArray");  // remove?
-                continue;
-            }
-            final List<Chunk> chunkList = bin.getChunkList();
-            if (chunkList == null) {
-                pw.println("  Ref " + reference + " bin " + bin.getBinNumber() + " has no chunkList");
-                continue;
-            }
-            pw.print("  Ref " + reference + " bin " + bin.getBinNumber() + " has n_chunk= " + chunkList.size());
-            if (chunkList.isEmpty()) {
-                 pw.println();
-            }
-            for (final Chunk c : chunkList) {
-                pw.println("     Chunk: " + c.toString() +
-                        " start: " + Long.toString(c.getChunkStart(), 16) +
-                        " end: " + Long.toString(c.getChunkEnd(), 16));
-            }
-        }
-
-        writeChunkMetaData(reference, metaData);
-        
-        // linear index
-        final LinearIndex linearIndex = content.getLinearIndex();
-        if (linearIndex == null || linearIndex.getIndexEntries() == null) {
-            pw.println("Reference " + reference + " has n_intv= 0");
-            return;
-        }
-        final long[] entries = linearIndex.getIndexEntries();
-        final int indexStart = linearIndex.getIndexStart();
-        // System.out.println("index start is " + indexStart);
-        final int n_intv = entries.length + indexStart;
-        pw.println("Reference " + reference + " has n_intv= " + n_intv);
-        for (int k = 0; k < entries.length; k++) {
-            if (entries[k] != 0) {
-                pw.println("  Ref " + reference + " ioffset for " + (k + indexStart) + " is " + Long.toString(entries[k]));
-            }
-        }
-        pw.flush ();  // write each reference to disk as it's being created
-    }
-
-    /**
-     * Write the meta data represented by the chunkLists associated with bin MAX_BINS 37450
-     *
-     * @param metaData information describing numAligned records, numUnAligned, etc
-     */
-    private void writeChunkMetaData(final int reference, final BAMIndexMetaData metaData) {
-        final int nChunks = metaData == null ? 0 : 2;
-        pw.print("  Ref " + reference + " bin 37450 has n_chunk= " + nChunks);
-        if (nChunks == 0) {
-            pw.println();
-        } else {
-            pw.println("     Chunk: " + //  c.toString() +
-                    " start: " + Long.toString(metaData.getFirstOffset(), 16) +
-                    " end: " + Long.toString(metaData.getLastOffset(), 16));
-            pw.println("     Chunk: " + //  c.toString() +
-                    " start: " + Long.toString(metaData.getAlignedRecordCount(), 16) +
-                    " end: " + Long.toString(metaData.getUnalignedRecordCount(), 16));
-        }
-
-    }
-       
-    private void writeNullContent(final int reference) {
-        pw.println("Reference " + reference + " has n_bin=0");
-        pw.println("Reference " + reference + " has n_intv=0");
-    }
-
-    /**
-     * Write count of records without coordinates
-     *
-     * @param noCoordinateCount the count of records seen with no coordinate positions in the start coordinate
-     */
-    public void writeNoCoordinateRecordCount(final Long noCoordinateCount) {
-        pw.println("No Coordinate Count=" + noCoordinateCount);
-    }
-
-    /**
-     * Any necessary processing at the end of the file
-     */
-    public void close() {
-        pw.close();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/ValidationStringency.java b/src/main/java/htsjdk/samtools/ValidationStringency.java
deleted file mode 100644
index 1fe2124..0000000
--- a/src/main/java/htsjdk/samtools/ValidationStringency.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * How strict to be when reading a SAM or BAM, beyond bare minimum validation.
- */
-public enum ValidationStringency {
-    /**
-     * Do the right thing, throw an exception if something looks wrong.
-     */
-    STRICT,
-    /**
-     * Emit warnings but keep going if possible.
-     */
-    LENIENT,
-    /**
-     * Like LENIENT, only don't emit warning messages.
-     */
-    SILENT;
-
-    public static final ValidationStringency DEFAULT_STRINGENCY = STRICT;
-}
diff --git a/src/main/java/htsjdk/samtools/apps/TimeChannel.java b/src/main/java/htsjdk/samtools/apps/TimeChannel.java
deleted file mode 100644
index e3f707a..0000000
--- a/src/main/java/htsjdk/samtools/apps/TimeChannel.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- */
-package htsjdk.samtools.apps;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class TimeChannel {
-    public static void main(String[] args) throws Exception {
-        long fileSize = new File(args[0]).length();
-        FileInputStream in = new FileInputStream(args[0]);
-        FileChannel channel = in.getChannel();
-        byte[] buf = new byte[64 * 1024];
-        long totalBytesRead = 0;
-        long mappedOffset = 0;
-        // Map a round number of bytes that might correspond to some kind of page size boundary.
-        long maxToMapAtATime = 1024 * 1024 * 1024;
-        long mappedSize = Math.min(fileSize, maxToMapAtATime);
-        while (totalBytesRead < fileSize) {
-            System.err.println("mappedOffset: " + mappedOffset + "; mappedSize: " + mappedSize);
-            System.err.println("fileSize: " + fileSize + "; totalBytesRead: " + totalBytesRead);
-            MappedByteBuffer mappedBuffer = channel.map(FileChannel.MapMode.READ_ONLY, mappedOffset, mappedSize);
-            while (mappedBuffer.remaining() > 0) {
-                int bytesRead = Math.min(mappedBuffer.remaining(), buf.length);
-                mappedBuffer.get(buf, 0, bytesRead);
-                totalBytesRead += bytesRead;
-            }
-            mappedOffset += mappedSize;
-            mappedSize = Math.min(fileSize - totalBytesRead, maxToMapAtATime);
-        }
-        System.out.println("Total bytes: " + totalBytesRead);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/apps/TimeRandomAccessFile.java b/src/main/java/htsjdk/samtools/apps/TimeRandomAccessFile.java
deleted file mode 100644
index bebb948..0000000
--- a/src/main/java/htsjdk/samtools/apps/TimeRandomAccessFile.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- */
-package htsjdk.samtools.apps;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class TimeRandomAccessFile {
-    public static void main(String[] args) throws Exception {
-        RandomAccessFile raf = new RandomAccessFile(new File(args[0]), "r");
-        byte[] buf = new byte[64 * 1024];
-        long totalBytesRead = 0;
-        int bytesRead;
-        while ((bytesRead = readBytes(raf, buf, 0, buf.length)) > 0) {
-            totalBytesRead += bytesRead;
-        }
-        System.out.println("Total bytes: " + totalBytesRead);
-    }
-    private static int readBytes(final RandomAccessFile file, final byte[] buffer, final int offset, final int length)
-        throws IOException {
-        int bytesRead = 0;
-        while (bytesRead < length) {
-            final int count = file.read(buffer, offset + bytesRead, length - bytesRead);
-            if (count <= 0) {
-                break;
-            }
-            bytesRead += count;
-        }
-        return bytesRead;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/CRAIEntry.java b/src/main/java/htsjdk/samtools/cram/CRAIEntry.java
deleted file mode 100644
index dd22a00..0000000
--- a/src/main/java/htsjdk/samtools/cram/CRAIEntry.java
+++ /dev/null
@@ -1,195 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * A class representing CRAI index entry: file and alignment offsets for each slice.
- * Created by vadim on 10/08/2015.
- */
-public class CRAIEntry implements Comparable<CRAIEntry>, Cloneable {
-    public int sequenceId;
-    public int alignmentStart;
-    public int alignmentSpan;
-    public long containerStartOffset;
-    public int sliceOffset;
-    public int sliceSize;
-    public int sliceIndex;
-
-    private static int CRAI_INDEX_COLUMNS = 6;
-    private static String entryFormat = "%d\t%d\t%d\t%d\t%d\t%d";
-
-    public CRAIEntry() {
-    }
-
-    /**
-     * Create a CRAI Entry from a serialized CRAI index line.
-     *
-     * @param line string formatted as a CRAI index entry
-     * @throws CRAIIndex.CRAIIndexException
-     */
-    public CRAIEntry(final String line) throws CRAIIndex.CRAIIndexException {
-        final String[] chunks = line.split("\t");
-        if (chunks.length != CRAI_INDEX_COLUMNS) {
-            throw new CRAIIndex.CRAIIndexException(
-                    "Malformed CRAI index entry: expecting " + CRAI_INDEX_COLUMNS + " columns but got " + chunks.length);
-        }
-
-        try {
-            sequenceId = Integer.parseInt(chunks[0]);
-            alignmentStart = Integer.parseInt(chunks[1]);
-            alignmentSpan = Integer.parseInt(chunks[2]);
-            containerStartOffset = Long.parseLong(chunks[3]);
-            sliceOffset = Integer.parseInt(chunks[4]);
-            sliceSize = Integer.parseInt(chunks[5]);
-        } catch (final NumberFormatException e) {
-            throw new CRAIIndex.CRAIIndexException(e);
-        }
-    }
-
-    /**
-     * Serialize the entry to a CRAI index stream.
-     * @param os stream to write to
-     */
-    public void writeToStream(OutputStream os) {
-        try {
-            os.write(serializeToString().getBytes());
-            os.write('\n');
-        }
-        catch (IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    /**
-     * Format the entry as a string suitable for serialization in the CRAI index
-     */
-    private String serializeToString() {
-        return String.format(entryFormat,
-                sequenceId, alignmentStart, alignmentSpan,
-                containerStartOffset, sliceOffset, sliceSize);
-    }
-
-    @Override
-    public String toString() { return serializeToString(); }
-
-    public static List<CRAIEntry> fromContainer(final Container container) {
-        final List<CRAIEntry> entries = new ArrayList<>(container.slices.length);
-        for (int i = 0; i < container.slices.length; i++) {
-            final Slice s = container.slices[i];
-            final CRAIEntry e = new CRAIEntry();
-            e.sequenceId = s.sequenceId;
-            e.alignmentStart = s.alignmentStart;
-            e.alignmentSpan = s.alignmentSpan;
-            e.containerStartOffset = s.containerOffset;
-            e.sliceOffset = container.landmarks[i];
-            e.sliceSize = s.size;
-
-            e.sliceIndex = i;
-            entries.add(e);
-        }
-        return entries;
-    }
-
-    @Override
-    public int compareTo(final CRAIEntry o) {
-        if (o == null) {
-            return 1;
-        }
-        if (sequenceId != o.sequenceId) {
-            return sequenceId - o.sequenceId;
-        }
-        if (alignmentStart != o.alignmentStart) {
-            return alignmentStart - o.alignmentStart;
-        }
-
-        return (int) (containerStartOffset - o.containerStartOffset);
-    }
-
-    @Override
-    public CRAIEntry clone() throws CloneNotSupportedException {
-        super.clone();
-        final CRAIEntry entry = new CRAIEntry();
-        entry.sequenceId = sequenceId;
-        entry.alignmentStart = alignmentStart;
-        entry.alignmentSpan = alignmentSpan;
-        entry.containerStartOffset = containerStartOffset;
-        entry.sliceOffset = sliceOffset;
-        entry.sliceSize = sliceSize;
-        return entry;
-    }
-
-    public static Comparator<CRAIEntry> byEnd = new Comparator<CRAIEntry>() {
-
-        @Override
-        public int compare(final CRAIEntry o1, final CRAIEntry o2) {
-            if (o1.sequenceId != o2.sequenceId) {
-                return o2.sequenceId - o1.sequenceId;
-            }
-            if (o1.alignmentStart + o1.alignmentSpan != o2.alignmentStart + o2.alignmentSpan) {
-                return o1.alignmentStart + o1.alignmentSpan - o2.alignmentStart - o2.alignmentSpan;
-            }
-
-            return (int) (o1.containerStartOffset - o2.containerStartOffset);
-        }
-    };
-
-    public static final Comparator<CRAIEntry> byStart = new Comparator<CRAIEntry>() {
-
-        @Override
-        public int compare(final CRAIEntry o1, final CRAIEntry o2) {
-            if (o1.sequenceId != o2.sequenceId) {
-                return o2.sequenceId - o1.sequenceId;
-            }
-            if (o1.alignmentStart != o2.alignmentStart) {
-                return o1.alignmentStart - o2.alignmentStart;
-            }
-
-            return (int) (o1.containerStartOffset - o2.containerStartOffset);
-        }
-    };
-
-    public static Comparator<CRAIEntry> byStartDesc = new Comparator<CRAIEntry>() {
-
-        @Override
-        public int compare(CRAIEntry o1, CRAIEntry o2) {
-            if (o1.sequenceId != o2.sequenceId) {
-                if (o1.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)
-                    return 1;
-                if (o2.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)
-                    return -1;
-                return -o2.sequenceId + o1.sequenceId;
-            }
-            if (o1.alignmentStart != o2.alignmentStart)
-                return o1.alignmentStart - o2.alignmentStart;
-
-            return (int) (o1.containerStartOffset - o2.containerStartOffset);
-        }
-    };
-
-    public static boolean intersect(final CRAIEntry e0, final CRAIEntry e1) {
-        if (e0.sequenceId != e1.sequenceId) {
-            return false;
-        }
-        if (e0.sequenceId < 0) {
-            return false;
-        }
-
-        final int a0 = e0.alignmentStart;
-        final int a1 = e1.alignmentStart;
-
-        final int b0 = a0 + e0.alignmentSpan;
-        final int b1 = a1 + e1.alignmentSpan;
-
-        return Math.abs(a0 + b0 - a1 - b1) < (e0.alignmentSpan + e1.alignmentSpan);
-
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/CRAIIndex.java b/src/main/java/htsjdk/samtools/cram/CRAIIndex.java
deleted file mode 100644
index 256b35e..0000000
--- a/src/main/java/htsjdk/samtools/cram/CRAIIndex.java
+++ /dev/null
@@ -1,267 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.CRAMBAIIndexer;
-import htsjdk.samtools.CRAMCRAIIndexer;
-import htsjdk.samtools.cram.encoding.reader.DataReaderFactory;
-import htsjdk.samtools.cram.encoding.reader.RefSeqIdReader;
-import htsjdk.samtools.cram.io.DefaultBitInputStream;
-import htsjdk.samtools.cram.structure.*;
-import htsjdk.samtools.seekablestream.SeekableMemoryStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.ValidationStringency;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import java.util.List;
-
-/**
- * CRAI index used for CRAM files.
- */
-public class CRAIIndex {
-    public static final String CRAI_INDEX_SUFFIX = ".crai";
-    final private List<CRAIEntry> entries = new ArrayList<>();
-
-    /**
-     * Add a single entry to the CRAI index.
-     * @param entry entry to be added
-     */
-    public void addEntry(CRAIEntry entry) {
-        entries.add(entry);
-    }
-
-    // This is used for testing and should be removed when there are no more
-    // consumers that know about the internal structure of a CRAI
-    public List<CRAIEntry> getCRAIEntries() {
-        return entries;
-    }
-
-    /**
-     * Write out the index to an output stream;
-     * @param os Stream to write index to
-     */
-    public void writeIndex(final OutputStream os) {
-        Collections.sort(entries, CRAIEntry.byStartDesc);
-        entries.stream().forEach(e -> e.writeToStream(os));
-    }
-
-    /**
-     * Create index entries for a single container.
-     * @param c the container to index
-     */
-    public void processContainer(final Container c) {
-        // TODO: this should be refactored and delegate to container/slice
-        if (!c.isEOF()) {
-            for (int i = 0; i < c.slices.length; i++) {
-                Slice s = c.slices[i];
-                if (s.sequenceId == Slice.MULTI_REFERENCE) {
-                    this.entries.addAll(getCRAIEntriesForMultiRefSlice(s, c.header, c.offset, c.landmarks));
-                }
-                else {
-                    CRAIEntry e = new CRAIEntry();
-
-                    e.sequenceId = c.sequenceId;
-                    e.alignmentStart = s.alignmentStart;
-                    e.alignmentSpan = s.alignmentSpan;
-                    e.containerStartOffset = c.offset;
-                    e.sliceOffset = c.landmarks[i];
-                    e.sliceSize = s.size;
-                    e.sliceIndex = i;
-
-                    entries.add(e);
-                }
-            }
-        }
-    }
-
-    /**
-     * Return a list of CRAI Entries; one for each reference in the multireference slice.
-     * TODO: this should be refactored and delegate to container/slice
-     */
-    private static Collection<CRAIEntry> getCRAIEntriesForMultiRefSlice(
-            final Slice slice,
-            final CompressionHeader header,
-            final long containerOffset,
-            final int[] landmarks)
-    {
-        final DataReaderFactory dataReaderFactory = new DataReaderFactory();
-        final Map<Integer, InputStream> inputMap = new HashMap<>();
-        for (final Integer exId : slice.external.keySet()) {
-            inputMap.put(exId, new ByteArrayInputStream(slice.external.get(exId).getRawContent()));
-        }
-
-        final RefSeqIdReader reader = new RefSeqIdReader(
-                slice.sequenceId,
-                slice.alignmentStart,
-                ValidationStringency.DEFAULT_STRINGENCY);
-        dataReaderFactory.buildReader(
-                reader,
-                new DefaultBitInputStream(new ByteArrayInputStream(slice.coreBlock.getRawContent())),
-                inputMap,
-                header,
-                slice.sequenceId
-        );
-        reader.APDelta = header.APDelta;
-
-        for (int i = 0; i < slice.nofRecords; i++) {
-            final CramCompressionRecord record = new CramCompressionRecord();
-            record.sliceIndex = slice.index;
-            record.index = i;
-
-            reader.read();
-
-            if (record.sequenceId == slice.sequenceId) {
-                record.sequenceId = slice.sequenceId;
-            }
-            else if (record.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                record.sequenceName = SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
-            }
-        }
-
-        Map<Integer, AlignmentSpan> spans = reader.getReferenceSpans();
-        List<CRAIEntry> entries = new ArrayList<>(spans.size());
-        for (int seqId : spans.keySet()) {
-            CRAIEntry e = new CRAIEntry();
-            e.sequenceId = seqId;
-            AlignmentSpan span = spans.get(seqId);
-            e.alignmentStart = span.getStart();
-            e.alignmentSpan = span.getSpan();
-            e.sliceSize = slice.size;
-            e.sliceIndex = slice.index;
-            e.containerStartOffset = containerOffset;
-            e.sliceOffset = landmarks[slice.index];
-
-            entries.add(e);
-        }
-
-        return entries;
-    }
-
-    public static SeekableStream openCraiFileAsBaiStream(final File cramIndexFile, final SAMSequenceDictionary dictionary) throws IOException {
-        return openCraiFileAsBaiStream(new FileInputStream(cramIndexFile), dictionary);
-    }
-
-    public static SeekableStream openCraiFileAsBaiStream(final InputStream indexStream, final SAMSequenceDictionary dictionary) throws IOException, CRAIIndexException {
-        final List<CRAIEntry> full = CRAMCRAIIndexer.readIndex(indexStream).getCRAIEntries();
-        Collections.sort(full);
-
-        final SAMFileHeader header = new SAMFileHeader();
-        header.setSequenceDictionary(dictionary);
-
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final CRAMBAIIndexer indexer = new CRAMBAIIndexer(baos, header);
-
-        for (final CRAIEntry entry : full) {
-            final Slice slice = new Slice();
-            slice.containerOffset = entry.containerStartOffset;
-            slice.alignmentStart = entry.alignmentStart;
-            slice.alignmentSpan = entry.alignmentSpan;
-            slice.sequenceId = entry.sequenceId;
-            // https://github.com/samtools/htsjdk/issues/531
-            // entry.sliceSize is the slice size in bytes, not the number of
-            // records; this results in the BAMIndex metadata being wrong
-            slice.nofRecords = entry.sliceSize;
-            slice.index = entry.sliceIndex;
-            slice.offset = entry.sliceOffset;
-
-            indexer.processSingleReferenceSlice(slice);
-        }
-        indexer.finish();
-
-        return new SeekableMemoryStream(baos.toByteArray(), "CRAI to BAI converter");
-    }
-
-    public static List<CRAIEntry> find(final List<CRAIEntry> list, final int seqId, final int start, final int span) {
-        final boolean whole = start < 1 || span < 1;
-        final CRAIEntry query = new CRAIEntry();
-        query.sequenceId = seqId;
-        query.alignmentStart = start < 1 ? 1 : start;
-        query.alignmentSpan = span < 1 ? Integer.MAX_VALUE : span;
-        query.containerStartOffset = Long.MAX_VALUE;
-        query.sliceOffset = Integer.MAX_VALUE;
-        query.sliceSize = Integer.MAX_VALUE;
-
-        final List<CRAIEntry> l = new ArrayList<>();
-        for (final CRAIEntry e : list) {
-            if (e.sequenceId != seqId) {
-                continue;
-            }
-            if (whole || CRAIEntry.intersect(e, query)) {
-                l.add(e);
-            }
-        }
-        Collections.sort(l, CRAIEntry.byStart);
-        return l;
-    }
-
-    public static CRAIEntry getLeftmost(final List<CRAIEntry> list) {
-        if (list == null || list.isEmpty()) {
-            return null;
-        }
-        CRAIEntry left = list.get(0);
-
-        for (final CRAIEntry e : list) {
-            if (e.alignmentStart < left.alignmentStart) {
-                left = e;
-            }
-        }
-
-        return left;
-    }
-
-    /**
-     * Find index of the last aligned entry in the list. Assumes the index is sorted by coordinate and unmapped entries (with sequence id = -1) follow the mapped entries.
-     *
-     * @param list a list of CRAI entries
-     * @return integer index of the last entry with sequence id not equal to -1
-     */
-    public static int findLastAlignedEntry(final List<CRAIEntry> list) {
-        if (list.isEmpty()) {
-            return -1;
-        }
-
-        int low = 0;
-        int high = list.size() - 1;
-
-        while (low <= high) {
-            final int mid = (low + high) >>> 1;
-            final CRAIEntry midVal = list.get(mid);
-
-            if (midVal.sequenceId >= 0) {
-                low = mid + 1;
-            } else {
-                high = mid - 1;
-            }
-        }
-        if (low >= list.size()) {
-            return list.size() - 1;
-        }
-        for (; low >= 0 && list.get(low).sequenceId == -1; low--) {
-        }
-        return low;
-    }
-
-    public static class CRAIIndexException extends RuntimeException {
-
-        public CRAIIndexException(final String s) {
-            super(s);
-        }
-
-        public CRAIIndexException(final NumberFormatException e) {
-            super(e);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/CRAMException.java b/src/main/java/htsjdk/samtools/cram/CRAMException.java
deleted file mode 100644
index 7d5fb72..0000000
--- a/src/main/java/htsjdk/samtools/cram/CRAMException.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.SAMException;
-
-/**
- * Created by edwardk on 8/13/15.
- */
-public class CRAMException extends SAMException {
-    public CRAMException() {}
-
-    public CRAMException(final String s) {
-        super(s);
-    }
-
-    public CRAMException(final String s, final Throwable throwable) {
-        super(s, throwable);
-    }
-
-    public CRAMException(final Throwable throwable) {
-        super(throwable);
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/cram/build/CompressionHeaderFactory.java b/src/main/java/htsjdk/samtools/cram/build/CompressionHeaderFactory.java
deleted file mode 100644
index c958fa4..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/CompressionHeaderFactory.java
+++ /dev/null
@@ -1,592 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.cram.common.MutableInt;
-import htsjdk.samtools.cram.encoding.ByteArrayLenEncoding;
-import htsjdk.samtools.cram.encoding.ByteArrayStopEncoding;
-import htsjdk.samtools.cram.encoding.ExternalByteEncoding;
-import htsjdk.samtools.cram.encoding.ExternalCompressor;
-import htsjdk.samtools.cram.encoding.ExternalIntegerEncoding;
-import htsjdk.samtools.cram.encoding.huffman.codec.HuffmanIntegerEncoding;
-import htsjdk.samtools.cram.encoding.rans.RANS;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.EncodingParams;
-import htsjdk.samtools.cram.structure.ReadTag;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * A class responsible for decisions about which encodings to use for a given set of records.
- * This particular version relies heavily on GZIP and RANS for better compression.
- */
-public class CompressionHeaderFactory {
-    private static final int TAG_VALUE_BUFFER_SIZE = 1024 * 1024;
-    public static final int BYTE_SPACE_SIZE = 256;
-    public static final int ALL_BYTES_USED = -1;
-    private final Map<Integer, EncodingDetails> bestEncodings = new HashMap<>();
-    private final ByteArrayOutputStream baosForTagValues;
-
-    public CompressionHeaderFactory() {
-        baosForTagValues = new ByteArrayOutputStream(TAG_VALUE_BUFFER_SIZE);
-    }
-
-    /**
-     * Decides on compression methods to use for the given records.
-     *
-     * @param records
-     *            the data to be compressed
-     * @param substitutionMatrix
-     *            a matrix of base substitution frequencies, can be null, in
-     *            which case it is re-calculated.
-     * @param sorted
-     *            if true the records are assumed to be sorted by alignment
-     *            position
-     * @return {@link htsjdk.samtools.cram.structure.CompressionHeader} object
-     *         describing the encoding chosen for the data
-     */
-    public CompressionHeader build(final List<CramCompressionRecord> records, SubstitutionMatrix substitutionMatrix,
-                                   final boolean sorted) {
-
-        final CompressionHeaderBuilder builder = new CompressionHeaderBuilder(sorted);
-
-        builder.addExternalIntegerRansOrderZeroEncoding(EncodingKey.AP_AlignmentPositionOffset);
-        builder.addExternalByteRansOrderOneEncoding(EncodingKey.BA_Base);
-        // BB is not used
-        builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.BF_BitFlags);
-        builder.addExternalByteGzipEncoding(EncodingKey.BS_BaseSubstitutionCode);
-        builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.CF_CompressionBitFlags);
-        builder.addExternalIntegerGzipEncoding(EncodingKey.DL_DeletionLength);
-        builder.addExternalByteGzipEncoding(EncodingKey.FC_FeatureCode);
-        builder.addExternalIntegerGzipEncoding(EncodingKey.FN_NumberOfReadFeatures);
-        builder.addExternalIntegerGzipEncoding(EncodingKey.FP_FeaturePosition);
-        builder.addExternalIntegerGzipEncoding(EncodingKey.HC_HardClip);
-        builder.addExternalByteArrayStopTabGzipEncoding(EncodingKey.IN_Insertion);
-        builder.addExternalIntegerGzipEncoding(EncodingKey.MF_MateBitFlags);
-        builder.addExternalIntegerGzipEncoding(EncodingKey.MQ_MappingQualityScore);
-        builder.addExternalIntegerGzipEncoding(EncodingKey.NF_RecordsToNextFragment);
-        builder.addExternalIntegerGzipEncoding(EncodingKey.NP_NextFragmentAlignmentStart);
-        builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.NS_NextFragmentReferenceSequenceID);
-        builder.addExternalIntegerGzipEncoding(EncodingKey.PD_padding);
-        // QQ is not used
-        builder.addExternalByteRansOrderOneEncoding(EncodingKey.QS_QualityScore);
-        builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.RG_ReadGroup);
-        builder.addExternalIntegerRansOrderZeroEncoding(EncodingKey.RI_RefId);
-        builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.RL_ReadLength);
-        builder.addExternalByteArrayStopTabGzipEncoding(EncodingKey.RN_ReadName);
-        builder.addExternalIntegerGzipEncoding(EncodingKey.RS_RefSkip);
-        builder.addExternalByteArrayStopTabGzipEncoding(EncodingKey.SC_SoftClip);
-        builder.addExternalIntegerGzipEncoding(EncodingKey.TC_TagCount);
-        builder.addExternalIntegerEncoding(EncodingKey.TL_TagIdList, ExternalCompressor.createGZIP());
-        builder.addExternalIntegerGzipEncoding(EncodingKey.TN_TagNameAndType);
-        builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.TS_InsetSize);
-
-        builder.setTagIdDictionary(buildTagIdDictionary(records));
-
-        buildTagEncodings(records, builder);
-
-        if (substitutionMatrix == null) {
-            substitutionMatrix = new SubstitutionMatrix(buildFrequencies(records));
-            updateSubstitutionCodes(records, substitutionMatrix);
-        }
-        builder.setSubstitutionMatrix(substitutionMatrix);
-        return builder.getHeader();
-    }
-
-    /**
-     * Iterate over the records and for each tag found come up with an encoding.
-     * Tag encodings are registered via the builder.
-     *
-     * @param records
-     *            CRAM records holding the tags to be encoded
-     * @param builder
-     *            compression header builder to register encodings
-     */
-    private void buildTagEncodings(final List<CramCompressionRecord> records, final CompressionHeaderBuilder builder) {
-        final Set<Integer> tagIdSet = new HashSet<>();
-
-        for (final CramCompressionRecord record : records) {
-            if (record.tags == null || record.tags.length == 0) {
-                continue;
-            }
-
-            for (final ReadTag tag : record.tags) {
-                tagIdSet.add(tag.keyType3BytesAsInt);
-            }
-        }
-
-        for (final int tagId : tagIdSet) {
-            if (bestEncodings.containsKey(tagId)) {
-                builder.addTagEncoding(tagId, bestEncodings.get(tagId));
-            } else {
-                final EncodingDetails e = buildEncodingForTag(records, tagId);
-                builder.addTagEncoding(tagId, e);
-                bestEncodings.put(tagId, e);
-            }
-        }
-    }
-
-    /**
-     * Given the records update the substitution matrix with actual substitution
-     * codes.
-     *
-     * @param records
-     *            CRAM records
-     * @param substitutionMatrix
-     *            the matrix to be updated
-     */
-    static void updateSubstitutionCodes(final List<CramCompressionRecord> records,
-                                                final SubstitutionMatrix substitutionMatrix) {
-        for (final CramCompressionRecord record : records) {
-            if (record.readFeatures != null) {
-                for (final ReadFeature recordFeature : record.readFeatures) {
-                    if (recordFeature.getOperator() == Substitution.operator) {
-                        final Substitution substitution = ((Substitution) recordFeature);
-                        if (substitution.getCode() == Substitution.NO_CODE) {
-                            final byte refBase = substitution.getReferenceBase();
-                            final byte base = substitution.getBase();
-                            substitution.setCode(substitutionMatrix.code(refBase, base));
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Build an array of substitution frequencies for the given CRAM records.
-     *
-     * @param records
-     *            CRAM records to scan
-     * @return a 2D array of frequencies, see
-     *         {@link htsjdk.samtools.cram.structure.SubstitutionMatrix}
-     */
-    static long[][] buildFrequencies(final List<CramCompressionRecord> records) {
-        final long[][] frequencies = new long[BYTE_SPACE_SIZE][BYTE_SPACE_SIZE];
-        for (final CramCompressionRecord record : records) {
-            if (record.readFeatures != null) {
-                for (final ReadFeature readFeature : record.readFeatures) {
-                    if (readFeature.getOperator() == Substitution.operator) {
-                        final Substitution substitution = ((Substitution) readFeature);
-                        final byte refBase = substitution.getReferenceBase();
-                        final byte base = substitution.getBase();
-                        frequencies[refBase][base]++;
-                    }
-                }
-            }
-        }
-        return frequencies;
-    }
-
-    /**
-     * Build a dictionary of tag ids.
-     *
-     * @param records
-     *            records holding the tags
-     * @return a 3D byte array: a set of unique lists of tag ids.
-     */
-    private static byte[][][] buildTagIdDictionary(final List<CramCompressionRecord> records) {
-        final Comparator<ReadTag> comparator = new Comparator<ReadTag>() {
-
-            @Override
-            public int compare(final ReadTag o1, final ReadTag o2) {
-                return o1.keyType3BytesAsInt - o2.keyType3BytesAsInt;
-            }
-        };
-
-        final Comparator<byte[]> baComparator = new Comparator<byte[]>() {
-
-            @Override
-            public int compare(final byte[] o1, final byte[] o2) {
-                if (o1.length - o2.length != 0) {
-                    return o1.length - o2.length;
-                }
-
-                for (int i = 0; i < o1.length; i++) {
-                    if (o1[i] != o2[i]) {
-                        return o1[i] - o2[i];
-                    }
-                }
-
-                return 0;
-            }
-        };
-
-        final Map<byte[], MutableInt> map = new TreeMap<>(baComparator);
-        final MutableInt noTagCounter = new MutableInt();
-        map.put(new byte[0], noTagCounter);
-        for (final CramCompressionRecord record : records) {
-            if (record.tags == null) {
-                noTagCounter.value++;
-                record.tagIdsIndex = noTagCounter;
-                continue;
-            }
-
-            Arrays.sort(record.tags, comparator);
-            record.tagIds = new byte[record.tags.length * 3];
-
-            int tagIndex = 0;
-            for (int i = 0; i < record.tags.length; i++) {
-                record.tagIds[i * 3] = (byte) record.tags[tagIndex].keyType3Bytes.charAt(0);
-                record.tagIds[i * 3 + 1] = (byte) record.tags[tagIndex].keyType3Bytes.charAt(1);
-                record.tagIds[i * 3 + 2] = (byte) record.tags[tagIndex].keyType3Bytes.charAt(2);
-                tagIndex++;
-            }
-
-            MutableInt count = map.get(record.tagIds);
-            if (count == null) {
-                count = new MutableInt();
-                map.put(record.tagIds, count);
-            }
-            count.value++;
-            record.tagIdsIndex = count;
-        }
-
-        final byte[][][] dictionary = new byte[map.size()][][];
-        int i = 0;
-        for (final byte[] idsAsBytes : map.keySet()) {
-            final int nofIds = idsAsBytes.length / 3;
-            dictionary[i] = new byte[nofIds][];
-            for (int j = 0; j < idsAsBytes.length;) {
-                final int idIndex = j / 3;
-                dictionary[i][idIndex] = new byte[3];
-                dictionary[i][idIndex][0] = idsAsBytes[j++];
-                dictionary[i][idIndex][1] = idsAsBytes[j++];
-                dictionary[i][idIndex][2] = idsAsBytes[j++];
-            }
-            map.get(idsAsBytes).value = i++;
-        }
-        return dictionary;
-    }
-
-    /**
-     * Tag id is and integer where the first byte is its type and the other 2
-     * bytes represent the name. For example 'OQZ', where 'OQ' stands for
-     * original quality score tag and 'Z' stands for string type.
-     *
-     * @param tagID
-     *            a 3 byte tag id stored in an int
-     * @return tag type, the lowest byte in the tag id
-     */
-    static byte getTagType(final int tagID) {
-        return (byte) (tagID & 0xFF);
-    }
-
-    static ExternalCompressor getBestExternalCompressor(final byte[] data) {
-        final ExternalCompressor gzip = ExternalCompressor.createGZIP();
-        final int gzipLen = gzip.compress(data).length;
-
-        final ExternalCompressor rans0 = ExternalCompressor.createRANS(RANS.ORDER.ZERO);
-        final int rans0Len = rans0.compress(data).length;
-
-        final ExternalCompressor rans1 = ExternalCompressor.createRANS(RANS.ORDER.ONE);
-        final int rans1Len = rans1.compress(data).length;
-
-        // find the best of general purpose codecs:
-        final int minLen = Math.min(gzipLen, Math.min(rans0Len, rans1Len));
-        if (minLen == rans0Len) {
-            return rans0;
-        } else if (minLen == rans1Len) {
-            return rans1;
-        } else {
-            return gzip;
-        }
-    }
-
-    byte[] getDataForTag(final List<CramCompressionRecord> records, final int tagID) {
-        baosForTagValues.reset();
-
-        for (final CramCompressionRecord record : records) {
-            if (record.tags == null) {
-                continue;
-            }
-
-            for (final ReadTag tag : record.tags) {
-                if (tag.keyType3BytesAsInt != tagID) {
-                    continue;
-                }
-                final byte[] valueBytes = tag.getValueAsByteArray();
-                try {
-                    baosForTagValues.write(valueBytes);
-                } catch (final IOException e) {
-                    throw new RuntimeIOException(e);
-                }
-            }
-        }
-
-        return baosForTagValues.toByteArray();
-    }
-
-    static ByteSizeRange geByteSizeRangeOfTagValues(final List<CramCompressionRecord> records, final int tagID) {
-        final byte type = getTagType(tagID);
-        final ByteSizeRange stats = new ByteSizeRange();
-        for (final CramCompressionRecord record : records) {
-            if (record.tags == null) {
-                continue;
-            }
-
-            for (final ReadTag tag : record.tags) {
-                if (tag.keyType3BytesAsInt != tagID) {
-                    continue;
-                }
-                final int size = getTagValueByteSize(type, tag.getValue());
-                if (stats.min > size)
-                    stats.min = size;
-                if (stats.max < size)
-                    stats.max = size;
-            }
-        }
-        return stats;
-    }
-
-    /**
-     * Find a byte value never mentioned in the array
-     * @param array bytes
-     * @return byte value or -1 if the array contains all possible byte values.
-     */
-    static int getUnusedByte(final byte[] array) {
-        final byte[] usage = new byte[BYTE_SPACE_SIZE];
-        for (final byte b : array) {
-            usage[0xFF & b] = 1;
-        }
-
-        for (int i = 0; i < usage.length; i++) {
-            if (usage[i] == 0)
-                return i;
-        }
-        return ALL_BYTES_USED;
-    }
-
-    static class ByteSizeRange {
-        int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
-    }
-
-    /**
-     * A combination of external compressor and encoding params. This is all
-     * that is needed to encode a data series.
-     */
-    private static class EncodingDetails {
-        ExternalCompressor compressor;
-        EncodingParams params;
-    }
-
-    /**
-     * Build an encoding for a specific tag for given records.
-     *
-     * @param records
-     *            CRAM records holding the tags
-     * @param tagID
-     *            an integer id of the tag
-     * @return an encoding for the tag
-     */
-    private EncodingDetails buildEncodingForTag(final List<CramCompressionRecord> records, final int tagID) {
-        final EncodingDetails details = new EncodingDetails();
-        final byte[] data = getDataForTag(records, tagID);
-
-        details.compressor = getBestExternalCompressor(data);
-
-        final byte type = getTagType(tagID);
-        switch (type) {
-            case 'A':
-            case 'c':
-            case 'C':
-                details.params = ByteArrayLenEncoding.toParam(
-                        HuffmanIntegerEncoding.toParam(new int[] { 1 }, new int[] { 0 }),
-                        ExternalByteEncoding.toParam(tagID));
-                return details;
-            case 'I':
-            case 'i':
-            case 'f':
-                details.params = ByteArrayLenEncoding.toParam(
-                        HuffmanIntegerEncoding.toParam(new int[] { 4 }, new int[] { 0 }),
-                        ExternalByteEncoding.toParam(tagID));
-                return details;
-
-            case 's':
-            case 'S':
-                details.params = ByteArrayLenEncoding.toParam(
-                        HuffmanIntegerEncoding.toParam(new int[] { 2 }, new int[] { 0 }),
-                        ExternalByteEncoding.toParam(tagID));
-                return details;
-            case 'Z':
-            case 'B':
-                final ByteSizeRange stats = geByteSizeRangeOfTagValues(records, tagID);
-                final boolean singleSize = stats.min == stats.max;
-                if (singleSize) {
-                    details.params = ByteArrayLenEncoding.toParam(
-                            HuffmanIntegerEncoding.toParam(new int[] { stats.min }, new int[] { 0 }),
-                            ExternalByteEncoding.toParam(tagID));
-                    return details;
-                }
-
-                if (type == 'Z') {
-                    details.params = ByteArrayStopEncoding.toParam((byte) '\t', tagID);
-                    return details;
-                }
-
-                final int minSize_threshold_ForByteArrayStopEncoding = 100;
-                if (stats.min > minSize_threshold_ForByteArrayStopEncoding) {
-                    final int unusedByte = getUnusedByte(data);
-                    if (unusedByte > ALL_BYTES_USED) {
-                        details.params = ByteArrayStopEncoding.toParam((byte) unusedByte, tagID);
-                        return details;
-                    }
-                }
-
-                details.params = ByteArrayLenEncoding.toParam(ExternalIntegerEncoding.toParam(tagID),
-                        ExternalByteEncoding.toParam(tagID));
-                return details;
-            default:
-                throw new IllegalArgumentException("Unknown tag type: " + (char) type);
-        }
-    }
-
-    /**
-     * A helper class to build
-     * {@link htsjdk.samtools.cram.structure.CompressionHeader} object.
-     */
-    private static class CompressionHeaderBuilder {
-        private final CompressionHeader header;
-
-        CompressionHeaderBuilder(final boolean sorted) {
-            header = new CompressionHeader();
-            header.externalIds = new ArrayList<>();
-            header.tMap = new TreeMap<>();
-
-            header.encodingMap = new TreeMap<>();
-            header.APDelta = sorted;
-        }
-
-        CompressionHeader getHeader() {
-            return header;
-        }
-
-        void addExternalEncoding(final EncodingKey encodingKey, final EncodingParams params,
-                                 final ExternalCompressor compressor) {
-            header.externalIds.add(encodingKey.ordinal());
-            header.externalCompressors.put(encodingKey.ordinal(), compressor);
-            header.encodingMap.put(encodingKey, params);
-        }
-
-        void addExternalByteArrayStopTabGzipEncoding(final EncodingKey encodingKey) {
-            addExternalEncoding(encodingKey, ByteArrayStopEncoding.toParam((byte) '\t', encodingKey.ordinal()),
-                    ExternalCompressor.createGZIP());
-        }
-
-        void addExternalIntegerEncoding(final EncodingKey encodingKey, final ExternalCompressor compressor) {
-            addExternalEncoding(encodingKey, ExternalIntegerEncoding.toParam(encodingKey.ordinal()), compressor);
-        }
-
-        void addExternalIntegerGzipEncoding(final EncodingKey encodingKey) {
-            addExternalEncoding(encodingKey, ExternalIntegerEncoding.toParam(encodingKey.ordinal()),
-                    ExternalCompressor.createGZIP());
-        }
-
-        void addExternalByteGzipEncoding(final EncodingKey encodingKey) {
-            addExternalEncoding(encodingKey, ExternalByteEncoding.toParam(encodingKey.ordinal()),
-                    ExternalCompressor.createGZIP());
-        }
-
-        void addExternalByteRansOrderOneEncoding(final EncodingKey encodingKey) {
-            addExternalEncoding(encodingKey, ExternalByteEncoding.toParam(encodingKey.ordinal()),
-                    ExternalCompressor.createRANS(RANS.ORDER.ONE));
-        }
-
-        void addExternalIntegerRansOrderOneEncoding(final EncodingKey encodingKey) {
-            addExternalIntegerEncoding(encodingKey, ExternalCompressor.createRANS(RANS.ORDER.ONE));
-        }
-
-        void addExternalIntegerRansOrderZeroEncoding(final EncodingKey encodingKey) {
-            addExternalIntegerEncoding(encodingKey, ExternalCompressor.createRANS(RANS.ORDER.ZERO));
-        }
-
-        void addTagEncoding(final int tagId, final EncodingDetails encodingDetails) {
-            header.externalIds.add(tagId);
-            header.externalCompressors.put(tagId, encodingDetails.compressor);
-            header.tMap.put(tagId, encodingDetails.params);
-        }
-
-        void setTagIdDictionary(final byte[][][] dictionary) {
-            header.dictionary = dictionary;
-        }
-
-        void setSubstitutionMatrix(final SubstitutionMatrix substitutionMatrix) {
-            header.substitutionMatrix = substitutionMatrix;
-        }
-    }
-
-    /**
-     * Calculate byte size of a tag value based on it's type and value class
-     * @param type tag type, like 'A' or 'i'
-     * @param value object representing the tag value
-     * @return number of bytes used for the tag value
-     */
-    static int getTagValueByteSize(final byte type, final Object value) {
-        switch (type) {
-            case 'A':
-                return 1;
-            case 'I':
-                return 4;
-            case 'i':
-                return 4;
-            case 's':
-                return 2;
-            case 'S':
-                return 2;
-            case 'c':
-                return 1;
-            case 'C':
-                return 1;
-            case 'f':
-                return 4;
-            case 'Z':
-                return ((String) value).length()+1;
-            case 'B':
-                if (value instanceof byte[])
-                    return 1+ 4+ ((byte[]) value).length;
-                if (value instanceof short[])
-                    return 1+ 4+ ((short[]) value).length * 2;
-                if (value instanceof int[])
-                    return 1+ 4+ ((int[]) value).length * 4;
-                if (value instanceof float[])
-                    return 1+ 4+ ((float[]) value).length * 4;
-                if (value instanceof long[])
-                    return 1+ 4+ ((long[]) value).length * 4;
-
-                throw new RuntimeException("Unknown tag array class: " + value.getClass());
-            default:
-                throw new RuntimeException("Unknown tag type: " + (char) type);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/ContainerFactory.java b/src/main/java/htsjdk/samtools/cram/build/ContainerFactory.java
deleted file mode 100644
index 1c39ed2..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/ContainerFactory.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.digest.ContentDigests;
-import htsjdk.samtools.cram.encoding.ExternalCompressor;
-import htsjdk.samtools.cram.encoding.writer.DataWriterFactory;
-import htsjdk.samtools.cram.encoding.writer.Writer;
-import htsjdk.samtools.cram.io.DefaultBitOutputStream;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.structure.Block;
-import htsjdk.samtools.cram.structure.BlockContentType;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class ContainerFactory {
-    private final SAMFileHeader samFileHeader;
-    private int recordsPerSlice = 10000;
-    private boolean preserveReadNames = true;
-    private long globalRecordCounter = 0;
-
-    public ContainerFactory(final SAMFileHeader samFileHeader, final int recordsPerSlice) {
-        this.samFileHeader = samFileHeader;
-        this.recordsPerSlice = recordsPerSlice;
-    }
-
-    public Container buildContainer(final List<CramCompressionRecord> records)
-            throws IllegalArgumentException, IllegalAccessException,
-            IOException {
-        return buildContainer(records, null);
-    }
-
-    Container buildContainer(final List<CramCompressionRecord> records,
-                             final SubstitutionMatrix substitutionMatrix)
-            throws IllegalArgumentException, IllegalAccessException,
-            IOException {
-        // get stats, create compression header and slices
-        final long time1 = System.nanoTime();
-        final CompressionHeader header = new CompressionHeaderFactory().build(records,
-                substitutionMatrix, samFileHeader.getSortOrder() == SAMFileHeader.SortOrder.coordinate);
-        header.APDelta = samFileHeader.getSortOrder() == SAMFileHeader.SortOrder.coordinate;
-        final long time2 = System.nanoTime();
-
-        header.readNamesIncluded = preserveReadNames;
-
-        final List<Slice> slices = new ArrayList<Slice>();
-
-        final Container container = new Container();
-        container.header = header;
-        container.nofRecords = records.size();
-        container.globalRecordCounter = globalRecordCounter;
-        container.bases = 0;
-        container.blockCount = 0;
-
-        final long time3 = System.nanoTime();
-        long lastGlobalRecordCounter = container.globalRecordCounter;
-        for (int i = 0; i < records.size(); i += recordsPerSlice) {
-            final List<CramCompressionRecord> sliceRecords = records.subList(i,
-                    Math.min(records.size(), i + recordsPerSlice));
-            final Slice slice = buildSlice(sliceRecords, header);
-            slice.globalRecordCounter = lastGlobalRecordCounter;
-            lastGlobalRecordCounter += slice.nofRecords;
-            container.bases += slice.bases;
-            slices.add(slice);
-
-            // assuming one sequence per container max:
-            if (container.sequenceId == -1 && slice.sequenceId != -1)
-                container.sequenceId = slice.sequenceId;
-        }
-
-        final long time4 = System.nanoTime();
-
-        container.slices = slices.toArray(new Slice[slices.size()]);
-        calculateAlignmentBoundaries(container);
-
-        container.buildHeaderTime = time2 - time1;
-        container.buildSlicesTime = time4 - time3;
-
-        globalRecordCounter += records.size();
-        return container;
-    }
-
-    private static void calculateAlignmentBoundaries(final Container container) {
-        int start = Integer.MAX_VALUE;
-        int end = Integer.MIN_VALUE;
-        for (final Slice s : container.slices) {
-            if (s.sequenceId != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                start = Math.min(start, s.alignmentStart);
-                end = Math.max(end, s.alignmentStart + s.alignmentSpan);
-            }
-        }
-
-        if (start < Integer.MAX_VALUE) {
-            container.alignmentStart = start;
-            container.alignmentSpan = end - start;
-        }
-    }
-
-    private static Slice buildSlice(final List<CramCompressionRecord> records,
-                                    final CompressionHeader header)
-            throws IllegalArgumentException, IllegalAccessException,
-            IOException {
-        final Map<Integer, ExposedByteArrayOutputStream> map = new HashMap<Integer, ExposedByteArrayOutputStream>();
-        for (final int id : header.externalIds) {
-            map.put(id, new ExposedByteArrayOutputStream());
-        }
-
-        final DataWriterFactory dataWriterFactory = new DataWriterFactory();
-        final ExposedByteArrayOutputStream bitBAOS = new ExposedByteArrayOutputStream();
-        final DefaultBitOutputStream bitOutputStream = new DefaultBitOutputStream(bitBAOS);
-
-        final Slice slice = new Slice();
-        slice.nofRecords = records.size();
-
-        int minAlStart = Integer.MAX_VALUE;
-        int maxAlEnd = SAMRecord.NO_ALIGNMENT_START;
-        {
-            // @formatter:off
-            /*
-             * 1) Count slice bases.
-			 * 2) Decide if the slice is single ref, unmapped or multi reference.
-			 * 3) Detect alignment boundaries for the slice if not multi reference.
-			 */
-            // @formatter:on
-            slice.sequenceId = records.get(0).sequenceId;
-            final ContentDigests hasher = ContentDigests.create(ContentDigests.ALL);
-            for (final CramCompressionRecord record : records) {
-                slice.bases += record.readLength;
-                hasher.add(record);
-                if (slice.sequenceId == Slice.MULTI_REFERENCE) continue;
-
-                if (slice.sequenceId != record.sequenceId) {
-                    slice.sequenceId = Slice.MULTI_REFERENCE;
-                } else if (record.alignmentStart != SAMRecord.NO_ALIGNMENT_START) {
-                    minAlStart = Math.min(record.alignmentStart, minAlStart);
-                    maxAlEnd = Math.max(record.getAlignmentEnd(), maxAlEnd);
-                }
-            }
-
-            slice.sliceTags = hasher.getAsTags();
-        }
-
-        if (slice.sequenceId == Slice.MULTI_REFERENCE
-                || minAlStart == Integer.MAX_VALUE) {
-            slice.alignmentStart = Slice.NO_ALIGNMENT_START;
-            slice.alignmentSpan = Slice.NO_ALIGNMENT_SPAN;
-        } else {
-            slice.alignmentStart = minAlStart;
-            slice.alignmentSpan = maxAlEnd - minAlStart + 1;
-        }
-
-        final Writer writer = dataWriterFactory.buildWriter(bitOutputStream, map, header, slice.sequenceId);
-        int prevAlStart = slice.alignmentStart;
-        for (final CramCompressionRecord record : records) {
-            record.alignmentDelta = record.alignmentStart - prevAlStart;
-            prevAlStart = record.alignmentStart;
-            writer.write(record);
-        }
-
-        bitOutputStream.close();
-        slice.coreBlock = Block.buildNewCore(bitBAOS.toByteArray());
-
-        slice.external = new HashMap<Integer, Block>();
-        for (final Integer key : map.keySet()) {
-            final ExposedByteArrayOutputStream os = map.get(key);
-
-            final Block externalBlock = new Block();
-            externalBlock.setContentId(key);
-            externalBlock.setContentType(BlockContentType.EXTERNAL);
-
-            final ExternalCompressor compressor = header.externalCompressors.get(key);
-            final byte[] rawData = os.toByteArray();
-            final byte[] compressed = compressor.compress(rawData);
-            externalBlock.setContent(rawData, compressed);
-            externalBlock.setMethod(compressor.getMethod());
-            slice.external.put(key, externalBlock);
-        }
-
-        return slice;
-    }
-
-    public boolean isPreserveReadNames() {
-        return preserveReadNames;
-    }
-
-    public void setPreserveReadNames(final boolean preserveReadNames) {
-        this.preserveReadNames = preserveReadNames;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/ContainerParser.java b/src/main/java/htsjdk/samtools/cram/build/ContainerParser.java
deleted file mode 100644
index 050fce7..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/ContainerParser.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.encoding.reader.CramRecordReader;
-import htsjdk.samtools.cram.encoding.reader.DataReaderFactory;
-import htsjdk.samtools.cram.encoding.reader.DataReaderFactory.DataReaderWithStats;
-import htsjdk.samtools.cram.encoding.reader.RefSeqIdReader;
-import htsjdk.samtools.cram.io.DefaultBitInputStream;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.Log.LogLevel;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class ContainerParser {
-    private static final Log log = Log.getInstance(ContainerParser.class);
-
-    private final SAMFileHeader samFileHeader;
-    private final Map<String, Long> nanosecondsMap = new TreeMap<String, Long>();
-
-    public ContainerParser(final SAMFileHeader samFileHeader) {
-        this.samFileHeader = samFileHeader;
-    }
-
-    public List<CramCompressionRecord> getRecords(final Container container,
-                                                  ArrayList<CramCompressionRecord> records, final ValidationStringency validationStringency) throws IllegalArgumentException,
-            IllegalAccessException {
-        if (container.isEOF()) return Collections.emptyList();
-        final long time1 = System.nanoTime();
-        if (records == null) {
-            records = new ArrayList<CramCompressionRecord>(container.nofRecords);
-        }
-
-        for (final Slice slice : container.slices) {
-            records.addAll(getRecords(slice, container.header, validationStringency));
-        }
-
-        final long time2 = System.nanoTime();
-
-        container.parseTime = time2 - time1;
-
-        if (log.isEnabled(LogLevel.DEBUG)) {
-            for (final String key : nanosecondsMap.keySet()) {
-                log.debug(String.format("%s: %dms.", key, nanosecondsMap.get(key) / 1000000));
-            }
-        }
-
-        return records;
-    }
-
-    public Map<Integer, AlignmentSpan> getReferences(final Container container, final ValidationStringency validationStringency) throws IOException {
-        final Map<Integer, AlignmentSpan> containerSpanMap  = new HashMap<>();
-        for (final Slice slice : container.slices) {
-            addAllSpans(containerSpanMap, getReferences(slice, container.header, validationStringency));
-        }
-        return containerSpanMap;
-    }
-
-    private static void addSpan(final int seqId, final int start, final int span, final int count, final Map<Integer, AlignmentSpan> map) {
-        if (map.containsKey(seqId)) {
-            map.get(seqId).add(start, span, count);
-        } else {
-            map.put(seqId, new AlignmentSpan(start, span, count));
-        }
-    }
-
-    private static Map<Integer, AlignmentSpan> addAllSpans(final Map<Integer, AlignmentSpan> spanMap, final Map<Integer, AlignmentSpan> addition) {
-        for (final Map.Entry<Integer, AlignmentSpan> entry:addition.entrySet()) {
-            addSpan(entry.getKey(), entry.getValue().getStart(), entry.getValue().getCount(), entry.getValue().getSpan(), spanMap);
-        }
-        return spanMap;
-    }
-
-    Map<Integer, AlignmentSpan> getReferences(final Slice slice, final CompressionHeader header, final ValidationStringency validationStringency) throws IOException {
-        final Map<Integer, AlignmentSpan> spanMap = new HashMap<>();
-        switch (slice.sequenceId) {
-            case SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX:
-                spanMap.put(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, AlignmentSpan.UNMAPPED_SPAN);
-                break;
-            case Slice.MULTI_REFERENCE:
-                final DataReaderFactory dataReaderFactory = new DataReaderFactory();
-                final Map<Integer, InputStream> inputMap = new HashMap<Integer, InputStream>();
-                for (final Integer exId : slice.external.keySet()) {
-                    inputMap.put(exId, new ByteArrayInputStream(slice.external.get(exId)
-                            .getRawContent()));
-                }
-
-                final RefSeqIdReader reader = new RefSeqIdReader(Slice.MULTI_REFERENCE, slice.alignmentStart, validationStringency);
-                dataReaderFactory.buildReader(reader, new DefaultBitInputStream(
-                                new ByteArrayInputStream(slice.coreBlock.getRawContent())),
-                        inputMap, header, slice.sequenceId);
-
-                for (int i = 0; i < slice.nofRecords; i++) {
-                    reader.read();
-                }
-                addAllSpans(spanMap, reader.getReferenceSpans());
-                break;
-            default:
-                addSpan(slice.sequenceId, slice.alignmentStart, slice.alignmentSpan, slice.nofRecords, spanMap);
-                break;
-        }
-        return spanMap;
-    }
-
-    ArrayList<CramCompressionRecord> getRecords(ArrayList<CramCompressionRecord> records,
-                                                final Slice slice, final CompressionHeader header, final ValidationStringency validationStringency) throws IllegalArgumentException,
-            IllegalAccessException {
-        String seqName = SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
-        switch (slice.sequenceId) {
-            case SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX:
-            case -2:
-                break;
-
-            default:
-                final SAMSequenceRecord sequence = samFileHeader
-                        .getSequence(slice.sequenceId);
-                seqName = sequence.getSequenceName();
-                break;
-        }
-
-        final DataReaderFactory dataReaderFactory = new DataReaderFactory();
-        final Map<Integer, InputStream> inputMap = new HashMap<Integer, InputStream>();
-        for (final Integer exId : slice.external.keySet()) {
-            log.debug("Adding external data: " + exId);
-            inputMap.put(exId, new ByteArrayInputStream(slice.external.get(exId)
-                    .getRawContent()));
-        }
-
-        long time;
-        final CramRecordReader reader = new CramRecordReader(validationStringency);
-        dataReaderFactory.buildReader(reader, new DefaultBitInputStream(
-                        new ByteArrayInputStream(slice.coreBlock.getRawContent())),
-                inputMap, header, slice.sequenceId);
-
-        if (records == null) {
-            records = new ArrayList<CramCompressionRecord>(slice.nofRecords);
-        }
-
-        long readNanos = 0;
-        int prevStart = slice.alignmentStart;
-        for (int i = 0; i < slice.nofRecords; i++) {
-            final CramCompressionRecord record = new CramCompressionRecord();
-            record.sliceIndex = slice.index;
-            record.index = i;
-
-            time = System.nanoTime();
-            reader.read(record);
-            readNanos += System.nanoTime() - time;
-
-            if (record.sequenceId == slice.sequenceId) {
-                record.sequenceName = seqName;
-                record.sequenceId = slice.sequenceId;
-            } else {
-                if (record.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                    record.sequenceName = SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
-                } else {
-                    record.sequenceName = samFileHeader.getSequence(record.sequenceId)
-                            .getSequenceName();
-                }
-            }
-
-            records.add(record);
-
-            if (header.APDelta) {
-                prevStart += record.alignmentDelta;
-                record.alignmentStart = prevStart;
-            }
-        }
-        log.debug("Slice records read time: " + readNanos / 1000000);
-
-        final Map<String, DataReaderWithStats> statMap = dataReaderFactory.getStats(reader);
-        for (final String key : statMap.keySet()) {
-            final long value;
-            if (!nanosecondsMap.containsKey(key)) {
-                nanosecondsMap.put(key, 0L);
-                value = 0;
-            } else {
-                value = nanosecondsMap.get(key);
-            }
-            nanosecondsMap.put(key, value + statMap.get(key).nanos);
-        }
-        return records;
-    }
-
-    List<CramCompressionRecord> getRecords(final Slice slice, final CompressionHeader header, final ValidationStringency validationStringency)
-            throws IllegalArgumentException, IllegalAccessException {
-        return getRecords(null, slice, header, validationStringency);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/Cram2SamRecordFactory.java b/src/main/java/htsjdk/samtools/cram/build/Cram2SamRecordFactory.java
deleted file mode 100644
index 699bd2a..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/Cram2SamRecordFactory.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMReadGroupRecord;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.HardClip;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.Padding;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadBase;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.ReadTag;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-public class Cram2SamRecordFactory {
-
-    private final SAMFileHeader header;
-
-    public Cram2SamRecordFactory(final SAMFileHeader header) {
-        this.header = header;
-    }
-
-    public SAMRecord create(final CramCompressionRecord cramRecord) {
-        final SAMRecord samRecord = new SAMRecord(header);
-
-        samRecord.setReadName(cramRecord.readName);
-        copyFlags(cramRecord, samRecord);
-
-        if (cramRecord.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-            samRecord.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
-            samRecord.setMappingQuality(SAMRecord.NO_MAPPING_QUALITY);
-            samRecord.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-        } else {
-            samRecord.setReferenceIndex(cramRecord.sequenceId);
-            samRecord.setAlignmentStart(cramRecord.alignmentStart);
-            samRecord.setMappingQuality(cramRecord.mappingQuality);
-        }
-
-        if (cramRecord.isSegmentUnmapped())
-            samRecord.setCigarString(SAMRecord.NO_ALIGNMENT_CIGAR);
-        else
-            samRecord.setCigar(getCigar2(cramRecord.readFeatures,
-                    cramRecord.readLength));
-
-        if (samRecord.getReadPairedFlag()) {
-            samRecord.setMateReferenceIndex(cramRecord.mateSequenceID);
-            samRecord
-                    .setMateAlignmentStart(cramRecord.mateAlignmentStart > 0 ? cramRecord.mateAlignmentStart : SAMRecord
-                            .NO_ALIGNMENT_START);
-            samRecord.setMateNegativeStrandFlag(cramRecord.isMateNegativeStrand());
-            samRecord.setMateUnmappedFlag(cramRecord.isMateUnmapped());
-        } else {
-            samRecord
-                    .setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-            samRecord.setMateAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
-        }
-
-        samRecord.setInferredInsertSize(cramRecord.templateSize);
-        samRecord.setReadBases(cramRecord.readBases);
-        samRecord.setBaseQualities(cramRecord.qualityScores);
-
-        if (cramRecord.tags != null)
-            for (final ReadTag tag : cramRecord.tags)
-                samRecord.setAttribute(tag.getKey(), tag.getValue());
-
-        if (cramRecord.readGroupID > -1) {
-            final SAMReadGroupRecord readGroupRecord = header.getReadGroups().get(
-                    cramRecord.readGroupID);
-            samRecord.setAttribute("RG", readGroupRecord.getId());
-        }
-
-        return samRecord;
-    }
-
-    private static void copyFlags(final CramCompressionRecord cramRecord, final SAMRecord samRecord) {
-        samRecord.setReadPairedFlag(cramRecord.isMultiFragment());
-        samRecord.setProperPairFlag(cramRecord.isProperPair());
-        samRecord.setReadUnmappedFlag(cramRecord.isSegmentUnmapped());
-        samRecord.setReadNegativeStrandFlag(cramRecord.isNegativeStrand());
-        samRecord.setFirstOfPairFlag(cramRecord.isFirstSegment());
-        samRecord.setSecondOfPairFlag(cramRecord.isLastSegment());
-        samRecord.setNotPrimaryAlignmentFlag(cramRecord.isSecondaryAlignment());
-        samRecord.setReadFailsVendorQualityCheckFlag(cramRecord.isVendorFiltered());
-        samRecord.setDuplicateReadFlag(cramRecord.isDuplicate());
-        samRecord.setSupplementaryAlignmentFlag(cramRecord.isSupplementary());
-    }
-
-    private static Cigar getCigar2(final Collection<ReadFeature> features,
-                                   final int readLength) {
-        if (features == null || features.isEmpty()) {
-            final CigarElement cigarElement = new CigarElement(readLength, CigarOperator.M);
-            return new Cigar(Collections.singletonList(cigarElement));
-        }
-
-        final List<CigarElement> list = new ArrayList<CigarElement>();
-        int totalOpLen = 1;
-        CigarElement cigarElement;
-        CigarOperator lastOperator = CigarOperator.MATCH_OR_MISMATCH;
-        int lastOpLen = 0;
-        int lastOpPos = 1;
-        CigarOperator cigarOperator;
-        int readFeatureLength;
-        for (final ReadFeature feature : features) {
-
-            final int gap = feature.getPosition() - (lastOpPos + lastOpLen);
-            if (gap > 0) {
-                if (lastOperator != CigarOperator.MATCH_OR_MISMATCH) {
-                    list.add(new CigarElement(lastOpLen, lastOperator));
-                    lastOpPos += lastOpLen;
-                    totalOpLen += lastOpLen;
-                    lastOpLen = gap;
-                } else {
-                    lastOpLen += gap;
-                }
-
-                lastOperator = CigarOperator.MATCH_OR_MISMATCH;
-            }
-
-            switch (feature.getOperator()) {
-                case Insertion.operator:
-                    cigarOperator = CigarOperator.INSERTION;
-                    readFeatureLength = ((Insertion) feature).getSequence().length;
-                    break;
-                case SoftClip.operator:
-                    cigarOperator = CigarOperator.SOFT_CLIP;
-                    readFeatureLength = ((SoftClip) feature).getSequence().length;
-                    break;
-                case HardClip.operator:
-                    cigarOperator = CigarOperator.HARD_CLIP;
-                    readFeatureLength = ((HardClip) feature).getLength();
-                    break;
-                case InsertBase.operator:
-                    cigarOperator = CigarOperator.INSERTION;
-                    readFeatureLength = 1;
-                    break;
-                case Deletion.operator:
-                    cigarOperator = CigarOperator.DELETION;
-                    readFeatureLength = ((Deletion) feature).getLength();
-                    break;
-                case RefSkip.operator:
-                    cigarOperator = CigarOperator.SKIPPED_REGION;
-                    readFeatureLength = ((RefSkip) feature).getLength();
-                    break;
-                case Padding.operator:
-                    cigarOperator = CigarOperator.PADDING;
-                    readFeatureLength = ((Padding) feature).getLength();
-                    break;
-                case Substitution.operator:
-                case ReadBase.operator:
-                    cigarOperator = CigarOperator.MATCH_OR_MISMATCH;
-                    readFeatureLength = 1;
-                    break;
-                default:
-                    continue;
-            }
-
-            if (lastOperator != cigarOperator) {
-                // add last feature
-                if (lastOpLen > 0) {
-                    list.add(new CigarElement(lastOpLen, lastOperator));
-                    totalOpLen += lastOpLen;
-                }
-                lastOperator = cigarOperator;
-                lastOpLen = readFeatureLength;
-                lastOpPos = feature.getPosition();
-            } else
-                lastOpLen += readFeatureLength;
-
-            if (!cigarOperator.consumesReadBases())
-                lastOpPos -= readFeatureLength;
-        }
-
-        if (lastOperator != null) {
-            if (lastOperator != CigarOperator.M) {
-                list.add(new CigarElement(lastOpLen, lastOperator));
-                if (readLength >= lastOpPos + lastOpLen) {
-                    cigarElement = new CigarElement(readLength - (lastOpLen + lastOpPos)
-                            + 1, CigarOperator.M);
-                    list.add(cigarElement);
-                }
-            } else if (readLength == 0 || readLength > lastOpPos - 1) {
-                if (readLength == 0)
-                    cigarElement = new CigarElement(lastOpLen, CigarOperator.M);
-                else
-                    cigarElement = new CigarElement(readLength - lastOpPos + 1,
-                            CigarOperator.M);
-                list.add(cigarElement);
-            }
-        }
-
-        if (list.isEmpty()) {
-            cigarElement = new CigarElement(readLength, CigarOperator.M);
-            return new Cigar(Collections.singletonList(cigarElement));
-        }
-
-        return new Cigar(list);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java b/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java
deleted file mode 100644
index a38e6b8..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.cram.io.CountingInputStream;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramHeader;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Iterator;
-
-/**
- * An iterator of CRAM containers read from an {@link java.io.InputStream}.
- */
-public class CramContainerIterator implements Iterator<Container> {
-    private CramHeader cramHeader;
-    private InputStream inputStream;
-    private Container nextContainer;
-    private boolean eof = false;
-    private long offset = 0;
-
-    public CramContainerIterator(final InputStream inputStream) throws IOException {
-        cramHeader = CramIO.readCramHeader(inputStream);
-        this.inputStream = inputStream;
-    }
-
-    void readNextContainer() {
-        try {
-            final CountingInputStream cis = new CountingInputStream(inputStream);
-            nextContainer = ContainerIO.readContainer(cramHeader.getVersion(), cis);
-            final long containerSizeInBytes = cis.getCount();
-
-            nextContainer.offset = offset;
-            offset += containerSizeInBytes;
-        } catch (final IOException e) {
-            throw new RuntimeException(e);
-        }
-
-        if (nextContainer.isEOF()) {
-            eof = true;
-            nextContainer = null;
-        }
-    }
-
-    @Override
-    public boolean hasNext() {
-        if (eof) return false;
-        if (nextContainer == null) readNextContainer();
-        return !eof;
-    }
-
-    @Override
-    public Container next() {
-        final Container result = nextContainer;
-        nextContainer = null;
-        return result;
-    }
-
-    @Override
-    public void remove() {
-        throw new RuntimeException("Read only iterator.");
-    }
-
-    public CramHeader getCramHeader() {
-        return cramHeader;
-    }
-
-    public void close() {
-        nextContainer = null;
-        cramHeader = null;
-        //noinspection EmptyCatchBlock
-        try {
-            inputStream.close();
-        } catch (final Exception e) {
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/CramIO.java b/src/main/java/htsjdk/samtools/cram/build/CramIO.java
deleted file mode 100644
index 04ac339..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/CramIO.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMTextHeaderCodec;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.io.CountingInputStream;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.cram.structure.Block;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.BufferedLineReader;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.RandomAccessFile;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-
-/**
- * A collection of methods to open and close CRAM files.
- */
-public class CramIO {
-    public static final String CRAM_FILE_EXTENSION = ".cram";
-    /**
-     * The 'zero-B' EOF marker as per CRAM specs v2.1. This is basically a serialized empty CRAM container with sequence id set to some
-     * number to spell out 'EOF' in hex.
-     */
-    public static final byte[] ZERO_B_EOF_MARKER = bytesFromHex("0b 00 00 00 ff ff ff ff ff e0 45 4f 46 00 00 00 00 01 00 00 01 00 06 06 01 00 " +
-            "" + "01 00 01 00");
-    /**
-     * The zero-F EOF marker as per CRAM specs v3.0. This is basically a serialized empty CRAM container with sequence id set to some number
-     * to spell out 'EOF' in hex.
-     */
-    public static final byte[] ZERO_F_EOF_MARKER = bytesFromHex("0f 00 00 00 ff ff ff ff 0f e0 45 4f 46 00 00 00 00 01 00 05 bd d9 4f 00 01 00 " +
-            "" + "06 06 01 00 01 00 01 00 ee 63 01 4b");
-
-
-    private static final int DEFINITION_LENGTH = 4 + 1 + 1 + 20;
-    private static final Log log = Log.getInstance(CramIO.class);
-
-    private static byte[] bytesFromHex(final String string) {
-        final String clean = string.replaceAll("[^0-9a-fA-F]", "");
-        if (clean.length() % 2 != 0) throw new RuntimeException("Not a hex string: " + string);
-        final byte[] data = new byte[clean.length() / 2];
-        for (int i = 0; i < clean.length(); i += 2) {
-            data[i / 2] = (Integer.decode("0x" + clean.charAt(i) + clean.charAt(i + 1))).byteValue();
-        }
-        return data;
-    }
-
-    /**
-     * Write an end-of-file marker to the {@link OutputStream}. The specific EOF marker is chosen based on the CRAM version.
-     *
-     * @param version      the CRAM version to assume
-     * @param outputStream the stream to write to
-     * @return the number of bytes written out
-     * @throws IOException as per java IO contract
-     */
-    public static long issueEOF(final Version version, final OutputStream outputStream) throws IOException {
-        if (version.compatibleWith(CramVersions.CRAM_v3)) {
-            outputStream.write(ZERO_F_EOF_MARKER);
-            return ZERO_F_EOF_MARKER.length;
-        }
-
-        if (version.compatibleWith(CramVersions.CRAM_v2_1)) {
-            outputStream.write(ZERO_B_EOF_MARKER);
-            return ZERO_B_EOF_MARKER.length;
-        }
-        return 0;
-    }
-
-    /**
-     * Write a CRAM File header and a SAM Header to an output stream.
-     *
-     * @param cramVersion
-     * @param outStream
-     * @param samFileHeader
-     * @param cramID
-     * @return the offset in the stream after writing the headers
-     */
-
-    public static long writeHeader(final Version cramVersion, final OutputStream outStream, final SAMFileHeader samFileHeader, String cramID) {
-        final CramHeader cramHeader = new CramHeader(cramVersion, cramID, samFileHeader);
-        try {
-            return CramIO.writeCramHeader(cramHeader, outStream);
-        } catch (final IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    private static boolean streamEndsWith(final SeekableStream seekableStream, final byte[] marker) throws IOException {
-        final byte[] tail = new byte[marker.length];
-
-        seekableStream.seek(seekableStream.length() - marker.length);
-        InputStreamUtils.readFully(seekableStream, tail, 0, tail.length);
-
-        if (Arrays.equals(tail, marker)) return true ;
-        // relaxing the ITF8 hanging bits:
-        tail[8] = marker[8];
-        return Arrays.equals(tail, marker);
-    }
-
-    /**
-     * Check if the {@link SeekableStream} is properly terminated with a end-of-file marker.
-     *
-     * @param version        CRAM version to assume
-     * @param seekableStream the stream to read from
-     * @return true if the stream ends with a correct EOF marker, false otherwise
-     * @throws IOException as per java IO contract
-     */
-    @SuppressWarnings("SimplifiableIfStatement")
-    private static boolean checkEOF(final Version version, final SeekableStream seekableStream) throws IOException {
-
-        if (version.compatibleWith(CramVersions.CRAM_v3)) return streamEndsWith(seekableStream, ZERO_F_EOF_MARKER);
-        if (version.compatibleWith(CramVersions.CRAM_v2_1)) return streamEndsWith(seekableStream, ZERO_B_EOF_MARKER);
-
-        return false;
-    }
-
-    /**
-     * Check if the file: 1) contains proper CRAM header. 2) given the version info from the header check the end of file marker.
-     *
-     * @param file the CRAM file to check
-     * @return true if the file is a valid CRAM file and is properly terminated with respect to the version.
-     * @throws IOException as per java IO contract
-     */
-    public static boolean checkHeaderAndEOF(final File file) throws IOException {
-        final SeekableStream seekableStream = new SeekableFileStream(file);
-        final CramHeader cramHeader = readCramHeader(seekableStream);
-        return checkEOF(cramHeader.getVersion(), seekableStream);
-    }
-
-    /**
-     * Writes CRAM header into the specified {@link OutputStream}.
-     *
-     * @param cramHeader the {@link CramHeader} object to write
-     * @param outputStream         the output stream to write to
-     * @return the number of bytes written out
-     * @throws IOException as per java IO contract
-     */
-    public static long writeCramHeader(final CramHeader cramHeader, final OutputStream outputStream) throws IOException {
-//        if (cramHeader.getVersion().major < 3) throw new RuntimeException("Deprecated CRAM version: " + cramHeader.getVersion().major);
-        outputStream.write("CRAM".getBytes("US-ASCII"));
-        outputStream.write(cramHeader.getVersion().major);
-        outputStream.write(cramHeader.getVersion().minor);
-        outputStream.write(cramHeader.getId());
-        for (int i = cramHeader.getId().length; i < 20; i++)
-            outputStream.write(0);
-
-        final long length = CramIO.writeContainerForSamFileHeader(cramHeader.getVersion().major, cramHeader.getSamFileHeader(), outputStream);
-
-        return CramIO.DEFINITION_LENGTH + length;
-    }
-
-    private static CramHeader readFormatDefinition(final InputStream inputStream) throws IOException {
-        for (final byte magicByte : CramHeader.MAGIC) {
-            if (magicByte != inputStream.read()) throw new RuntimeException("Unknown file format.");
-        }
-
-        final Version version = new Version(inputStream.read(), inputStream.read(), 0);
-
-        final CramHeader header = new CramHeader(version, null, null);
-
-        final DataInputStream dataInputStream = new DataInputStream(inputStream);
-        dataInputStream.readFully(header.getId());
-
-        return header;
-    }
-
-    /**
-     * Read CRAM header from the given {@link InputStream}.
-     *
-     * @param inputStream input stream to read from
-     * @return complete {@link CramHeader} object
-     * @throws IOException as per java IO contract
-     */
-    public static CramHeader readCramHeader(final InputStream inputStream) throws IOException {
-        final CramHeader header = readFormatDefinition(inputStream);
-
-        final SAMFileHeader samFileHeader = readSAMFileHeader(header.getVersion(), inputStream, new String(header.getId()));
-
-        return new CramHeader(header.getVersion(), new String(header.getId()), samFileHeader);
-    }
-
-    private static byte[] toByteArray(final SAMFileHeader samFileHeader) {
-        final ExposedByteArrayOutputStream headerBodyOS = new ExposedByteArrayOutputStream();
-        final OutputStreamWriter outStreamWriter = new OutputStreamWriter(headerBodyOS);
-        new SAMTextHeaderCodec().encode(outStreamWriter, samFileHeader);
-        try {
-            outStreamWriter.close();
-        } catch (final IOException e) {
-            throw new RuntimeException(e);
-        }
-
-        final ByteBuffer buf = ByteBuffer.allocate(4);
-        buf.order(ByteOrder.LITTLE_ENDIAN);
-        buf.putInt(headerBodyOS.size());
-        buf.flip();
-        final byte[] bytes = new byte[buf.limit()];
-        buf.get(bytes);
-
-        final ByteArrayOutputStream headerOS = new ByteArrayOutputStream();
-        try {
-            headerOS.write(bytes);
-            headerOS.write(headerBodyOS.getBuffer(), 0, headerBodyOS.size());
-        } catch (final IOException e) {
-            throw new RuntimeException(e);
-        }
-
-        return headerOS.toByteArray();
-    }
-
-    private static long writeContainerForSamFileHeader(final int major, final SAMFileHeader samFileHeader, final OutputStream os) throws IOException {
-        final byte[] data = toByteArray(samFileHeader);
-        final int length = Math.max(1024, data.length + data.length / 2);
-        final byte[] blockContent = new byte[length];
-        System.arraycopy(data, 0, blockContent, 0, Math.min(data.length, length));
-        final Block block = Block.buildNewFileHeaderBlock(blockContent);
-
-        final Container container = new Container();
-        container.blockCount = 1;
-        container.blocks = new Block[]{block};
-        container.landmarks = new int[0];
-        container.slices = new Slice[0];
-        container.alignmentSpan = Slice.NO_ALIGNMENT_SPAN;
-        container.alignmentStart = Slice.NO_ALIGNMENT_START;
-        container.bases = 0;
-        container.globalRecordCounter = 0;
-        container.nofRecords = 0;
-        container.sequenceId = 0;
-
-        final ExposedByteArrayOutputStream byteArrayOutputStream = new ExposedByteArrayOutputStream();
-        block.write(major, byteArrayOutputStream);
-        container.containerByteSize = byteArrayOutputStream.size();
-
-        final int containerHeaderByteSize = ContainerIO.writeContainerHeader(major, container, os);
-        os.write(byteArrayOutputStream.getBuffer(), 0, byteArrayOutputStream.size());
-
-        return containerHeaderByteSize + byteArrayOutputStream.size();
-    }
-
-    private static SAMFileHeader readSAMFileHeader(final Version version, InputStream inputStream, final String id) throws IOException {
-        final Container container = ContainerIO.readContainerHeader(version.major, inputStream);
-        final Block block;
-        {
-            if (version.compatibleWith(CramVersions.CRAM_v3)) {
-                final byte[] bytes = new byte[container.containerByteSize];
-                InputStreamUtils.readFully(inputStream, bytes, 0, bytes.length);
-                block = Block.readFromInputStream(version.major, new ByteArrayInputStream(bytes));
-                // ignore the rest of the container
-            } else {
-                /*
-                 * pending issue: container.containerByteSize inputStream 2 bytes shorter
-				 * then needed in the v21 test cram files.
-				 */
-                block = Block.readFromInputStream(version.major, inputStream);
-            }
-        }
-
-        inputStream = new ByteArrayInputStream(block.getRawContent());
-
-        final ByteBuffer buffer = ByteBuffer.allocate(4);
-        buffer.order(ByteOrder.LITTLE_ENDIAN);
-        for (int i = 0; i < 4; i++)
-            buffer.put((byte) inputStream.read());
-        buffer.flip();
-        final int size = buffer.asIntBuffer().get();
-
-        final DataInputStream dataInputStream = new DataInputStream(inputStream);
-        final byte[] bytes = new byte[size];
-        dataInputStream.readFully(bytes);
-
-        final BufferedLineReader bufferedLineReader = new BufferedLineReader(new ByteArrayInputStream(bytes));
-        final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
-        return codec.decode(bufferedLineReader, id);
-    }
-
-    /**
-     * Attempt to replace the SAM file header in the CRAM file. This will succeed only if there is sufficient space reserved in the existing
-     * CRAM header. The implementation re-writes the first FILE_HEADER block in the first container of the CRAM file using random file
-     * access.
-     *
-     * @param file      the CRAM file
-     * @param newHeader the new CramHeader container a new SAM file header
-     * @return true if successfully replaced the header, false otherwise
-     * @throws IOException as per java IO contract
-     */
-    public static boolean replaceCramHeader(final File file, final CramHeader newHeader) throws IOException {
-
-        final CountingInputStream countingInputStream = new CountingInputStream(new FileInputStream(file));
-
-        final CramHeader header = readFormatDefinition(countingInputStream);
-        final Container c = ContainerIO.readContainerHeader(header.getVersion().major, countingInputStream);
-        final long pos = countingInputStream.getCount();
-        countingInputStream.close();
-
-        final Block block = Block.buildNewFileHeaderBlock(toByteArray(newHeader.getSamFileHeader()));
-        final ExposedByteArrayOutputStream byteArrayOutputStream = new ExposedByteArrayOutputStream();
-        block.write(newHeader.getVersion().major, byteArrayOutputStream);
-        if (byteArrayOutputStream.size() > c.containerByteSize) {
-            log.error("Failed to replace CRAM header because the new header does not fit.");
-            return false;
-        }
-        final RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
-        randomAccessFile.seek(pos);
-        randomAccessFile.write(byteArrayOutputStream.getBuffer(), 0, byteArrayOutputStream.size());
-        randomAccessFile.close();
-        return true;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/CramNormalizer.java b/src/main/java/htsjdk/samtools/cram/build/CramNormalizer.java
deleted file mode 100644
index 1be1aa5..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/CramNormalizer.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadBase;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-import htsjdk.samtools.util.Log;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class CramNormalizer {
-    private final SAMFileHeader header;
-    private int readCounter = 0;
-
-    private static Log log = Log.getInstance(CramNormalizer.class);
-    private CRAMReferenceSource referenceSource;
-
-    private CramNormalizer(final SAMFileHeader header) {
-        this.header = header;
-    }
-
-    public CramNormalizer(final SAMFileHeader header, final CRAMReferenceSource referenceSource) {
-        if (referenceSource == null) {
-            throw new IllegalArgumentException("A reference is required.");
-        }
-        this.header = header;
-        this.referenceSource = referenceSource;
-    }
-
-    public void normalize(final ArrayList<CramCompressionRecord> records,
-                          final byte[] ref, final int refOffset_zeroBased,
-                          final SubstitutionMatrix substitutionMatrix) {
-
-        final int startCounter = readCounter;
-
-        for (final CramCompressionRecord record : records) {
-            record.index = ++readCounter;
-
-            if (record.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                record.sequenceName = SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
-                record.alignmentStart = SAMRecord.NO_ALIGNMENT_START;
-            } else {
-                record.sequenceName = header.getSequence(record.sequenceId)
-                        .getSequenceName();
-            }
-        }
-
-        {// restore pairing first:
-            for (final CramCompressionRecord record : records) {
-                if (!record.isMultiFragment() || record.isDetached()) {
-                    record.recordsToNextFragment = -1;
-
-                    record.next = null;
-                    record.previous = null;
-                    continue;
-                }
-                if (record.isHasMateDownStream()) {
-                    final CramCompressionRecord downMate = records.get(record.index
-                            + record.recordsToNextFragment - startCounter);
-                    record.next = downMate;
-                    downMate.previous = record;
-                }
-            }
-            for (final CramCompressionRecord record : records) {
-                if (record.previous != null) continue;
-                if (record.next == null) continue;
-                restoreMateInfo(record);
-            }
-        }
-
-        // assign some read names if needed:
-        for (final CramCompressionRecord record : records) {
-            if (record.readName == null) {
-                final String readNamePrefix = "";
-                final String name = readNamePrefix + record.index;
-                record.readName = name;
-                if (record.next != null)
-                    record.next.readName = name;
-                if (record.previous != null)
-                    record.previous.readName = name;
-            }
-        }
-
-        // resolve bases:
-        for (final CramCompressionRecord record : records) {
-            if (record.isSegmentUnmapped())
-                continue;
-
-            byte[] refBases = ref;
-            {
-                // ref could be supplied (aka forced) already or needs looking up:
-                // ref.length=0 is a special case of seqId=-2 (multiref)
-                if ((ref == null || ref.length == 0) && referenceSource != null)
-                    refBases = referenceSource.getReferenceBases(
-                            header.getSequence(record.sequenceId), true);
-            }
-
-            if (record.isUnknownBases()) {
-                record.readBases = SAMRecord.NULL_SEQUENCE;
-            } else
-                record.readBases = restoreReadBases(record, refBases, refOffset_zeroBased,
-                        substitutionMatrix);
-        }
-
-        // restore quality scores:
-        final byte defaultQualityScore = '?' - '!';
-        restoreQualityScores(defaultQualityScore, records);
-    }
-
-    private static void restoreMateInfo(final CramCompressionRecord record) {
-        if (record.next == null) {
-
-            return;
-        }
-        CramCompressionRecord cur;
-        cur = record;
-        while (cur.next != null) {
-            setNextMate(cur, cur.next);
-            cur = cur.next;
-        }
-
-        // cur points to the last segment now:
-        final CramCompressionRecord last = cur;
-        setNextMate(last, record);
-//        record.setFirstSegment(true);
-//        last.setLastSegment(true);
-
-        final int templateLength = computeInsertSize(record, last);
-        record.templateSize = templateLength;
-        last.templateSize = -templateLength;
-    }
-
-    private static void setNextMate(final CramCompressionRecord record, final CramCompressionRecord next) {
-        record.mateAlignmentStart = next.alignmentStart;
-        record.setMateUnmapped(next.isSegmentUnmapped());
-        record.setMateNegativeStrand(next.isNegativeStrand());
-        record.mateSequenceID = next.sequenceId;
-        if (record.mateSequenceID == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)
-            record.mateAlignmentStart = SAMRecord.NO_ALIGNMENT_START;
-    }
-
-    public static void restoreQualityScores(final byte defaultQualityScore,
-                                            final List<CramCompressionRecord> records) {
-        for (final CramCompressionRecord record : records)
-            restoreQualityScores(defaultQualityScore, record);
-    }
-
-    private static byte[] restoreQualityScores(final byte defaultQualityScore,
-                                               final CramCompressionRecord record) {
-        if (!record.isForcePreserveQualityScores()) {
-            boolean star = true;
-            final byte[] scores = new byte[record.readLength];
-            Arrays.fill(scores, defaultQualityScore);
-            if (record.readFeatures != null)
-                for (final ReadFeature feature : record.readFeatures) {
-                    switch (feature.getOperator()) {
-                        case BaseQualityScore.operator:
-                            int pos = feature.getPosition();
-                            scores[pos - 1] = ((BaseQualityScore) feature).getQualityScore();
-                            star = false;
-                            break;
-                        case ReadBase.operator:
-                            pos = feature.getPosition();
-                            scores[pos - 1] = ((ReadBase) feature).getQualityScore();
-                            star = false;
-                            break;
-
-                        default:
-                            break;
-                    }
-                }
-
-            if (star)
-                record.qualityScores = SAMRecord.NULL_QUALS;
-            else
-                record.qualityScores = scores;
-        } else {
-            final byte[] scores = record.qualityScores;
-            int missingScores = 0;
-            for (int i = 0; i < scores.length; i++)
-                if (scores[i] == -1) {
-                    scores[i] = defaultQualityScore;
-                    missingScores++;
-                }
-            if (missingScores == scores.length)
-                record.qualityScores = SAMRecord.NULL_QUALS;
-        }
-
-        return record.qualityScores;
-    }
-
-    private static byte[] restoreReadBases(final CramCompressionRecord record, final byte[] ref,
-                                           final int refOffsetZeroBased, final SubstitutionMatrix substitutionMatrix) {
-        if (record.isUnknownBases() || record.readLength == 0) return SAMRecord.NULL_SEQUENCE;
-        final int readLength = record.readLength;
-        final byte[] bases = new byte[readLength];
-
-        int posInRead = 1;
-        final int alignmentStart = record.alignmentStart - 1;
-
-        int posInSeq = 0;
-        if (record.readFeatures == null || record.readFeatures.isEmpty()) {
-            if (ref.length + refOffsetZeroBased < alignmentStart
-                    + bases.length) {
-                Arrays.fill(bases, (byte) 'N');
-                System.arraycopy(
-                        ref,
-                        alignmentStart - refOffsetZeroBased,
-                        bases,
-                        0,
-                        Math.min(bases.length, ref.length + refOffsetZeroBased
-                                - alignmentStart));
-            } else
-                System.arraycopy(ref, alignmentStart - refOffsetZeroBased,
-                        bases, 0, bases.length);
-            return bases;
-        }
-        final List<ReadFeature> variations = record.readFeatures;
-        for (final ReadFeature variation : variations) {
-            for (; posInRead < variation.getPosition(); posInRead++) {
-                final int rp = alignmentStart + posInSeq++ - refOffsetZeroBased;
-                bases[posInRead - 1] = getByteOrDefault(ref, rp, (byte) 'N');
-            }
-
-            switch (variation.getOperator()) {
-                case Substitution.operator:
-                    final Substitution substitution = (Substitution) variation;
-                    byte refBase = getByteOrDefault(ref, alignmentStart + posInSeq
-                            - refOffsetZeroBased, (byte) 'N');
-                    refBase = Utils.normalizeBase(refBase);
-                    final byte base = substitutionMatrix.base(refBase, substitution.getCode());
-                    substitution.setBase(base);
-                    substitution.setReferenceBase(refBase);
-                    bases[posInRead++ - 1] = base;
-                    posInSeq++;
-                    break;
-                case Insertion.operator:
-                    final Insertion insertion = (Insertion) variation;
-                    for (int i = 0; i < insertion.getSequence().length; i++)
-                        bases[posInRead++ - 1] = insertion.getSequence()[i];
-                    break;
-                case SoftClip.operator:
-                    final SoftClip softClip = (SoftClip) variation;
-                    for (int i = 0; i < softClip.getSequence().length; i++)
-                        bases[posInRead++ - 1] = softClip.getSequence()[i];
-                    break;
-                case Deletion.operator:
-                    final Deletion deletion = (Deletion) variation;
-                    posInSeq += deletion.getLength();
-                    break;
-                case InsertBase.operator:
-                    final InsertBase insert = (InsertBase) variation;
-                    bases[posInRead++ - 1] = insert.getBase();
-                    break;
-                case RefSkip.operator:
-                    posInSeq += ((RefSkip) variation).getLength();
-                    break;
-            }
-        }
-        for (; posInRead <= readLength
-                && alignmentStart + posInSeq - refOffsetZeroBased < ref.length; posInRead++, posInSeq++) {
-            bases[posInRead - 1] = ref[alignmentStart + posInSeq
-                    - refOffsetZeroBased];
-        }
-
-        // ReadBase overwrites bases:
-        for (final ReadFeature variation : variations) {
-            switch (variation.getOperator()) {
-                case ReadBase.operator:
-                    final ReadBase readBase = (ReadBase) variation;
-                    bases[variation.getPosition() - 1] = readBase.getBase();
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        for (int i = 0; i < bases.length; i++) {
-            bases[i] = Utils.normalizeBase(bases[i]);
-        }
-
-        return bases;
-    }
-
-    private static byte getByteOrDefault(final byte[] array, final int pos,
-                                         final byte outOfBoundsValue) {
-        if (pos >= array.length)
-            return outOfBoundsValue;
-        else
-            return array[pos];
-    }
-
-    /**
-     * The method is similar in semantics to
-     * {@link htsjdk.samtools.SamPairUtil#computeInsertSize(SAMRecord, SAMRecord)
-     * computeInsertSize} but operates on CRAM native records instead of
-     * SAMRecord objects.
-     *
-     * @param firstEnd  first mate of the pair
-     * @param secondEnd second mate of the pair
-     * @return template length
-     */
-    public static int computeInsertSize(final CramCompressionRecord firstEnd,
-                                        final CramCompressionRecord secondEnd) {
-        if (firstEnd.isSegmentUnmapped() || secondEnd.isSegmentUnmapped()) {
-            return 0;
-        }
-        if (firstEnd.sequenceId != secondEnd.sequenceId) {
-            return 0;
-        }
-
-        final int firstEnd5PrimePosition = firstEnd.isNegativeStrand() ? firstEnd.getAlignmentEnd() : firstEnd.alignmentStart;
-        final int secondEnd5PrimePosition = secondEnd.isNegativeStrand() ? secondEnd.getAlignmentEnd() : secondEnd.alignmentStart;
-
-        final int adjustment = (secondEnd5PrimePosition >= firstEnd5PrimePosition) ? +1 : -1;
-        return secondEnd5PrimePosition - firstEnd5PrimePosition + adjustment;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/CramSpanContainerIterator.java b/src/main/java/htsjdk/samtools/cram/build/CramSpanContainerIterator.java
deleted file mode 100644
index 2956cda..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/CramSpanContainerIterator.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * An iterator of CRAM containers read from locations in {@link htsjdk.samtools.seekablestream.SeekableStream}. The locations are specified with
- * pairs of coordinates, they are basically file pointers as returned for example by {@link htsjdk.samtools.SamReader.Indexing#getFilePointerSpanningReads()}
- */
-public class CramSpanContainerIterator implements Iterator<Container> {
-    private final CramHeader cramHeader;
-    private final SeekableStream seekableStream;
-    private Iterator<Boundary> containerBoundaries;
-    private Boundary currentBoundary;
-    private long firstContainerOffset;
-
-    private CramSpanContainerIterator(final SeekableStream seekableStream, final long[] coordinates) throws IOException {
-        this.seekableStream = seekableStream;
-        seekableStream.seek(0);
-        this.cramHeader = CramIO.readCramHeader(seekableStream);
-        firstContainerOffset = seekableStream.position();
-
-        final List<Boundary> boundaries = new ArrayList<Boundary>();
-        for (int i = 0; i < coordinates.length; i += 2) {
-            boundaries.add(new Boundary(coordinates[i], coordinates[i + 1]));
-        }
-
-        containerBoundaries = boundaries.iterator();
-        currentBoundary = containerBoundaries.next();
-    }
-
-    public static CramSpanContainerIterator fromFileSpan(final SeekableStream seekableStream, final long[] coordinates) throws IOException {
-        return new CramSpanContainerIterator(seekableStream, coordinates);
-    }
-
-    @Override
-    public boolean hasNext() {
-        try {
-            if (currentBoundary.hasNext()) return true;
-            if (!containerBoundaries.hasNext()) return false;
-            currentBoundary = containerBoundaries.next();
-            return currentBoundary.hasNext();
-        } catch (final IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public Container next() {
-        try {
-            return currentBoundary.next();
-        } catch (final IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public void remove() {
-        throw new RuntimeException("Not allowed.");
-    }
-
-    public CramHeader getCramHeader() {
-        return cramHeader;
-    }
-
-    private class Boundary {
-        final long start;
-        final long end;
-
-        public Boundary(final long start, final long end) {
-            this.start = start;
-            this.end = end;
-            if (start >= end) throw new RuntimeException("Boundary start is greater than end.");
-        }
-
-        boolean hasNext() throws IOException {
-            return seekableStream.position() <= (end >> 16);
-        }
-
-        Container next() throws IOException {
-            if (seekableStream.position() < (start >> 16)) seekableStream.seek(start >> 16);
-            if (seekableStream.position() > (end >> 16)) throw new RuntimeException("No more containers in this boundary.");
-            final long offset = seekableStream.position();
-            final Container c = ContainerIO.readContainer(cramHeader.getVersion(), seekableStream);
-            c.offset = offset;
-            return c;
-        }
-    }
-
-    public long getFirstContainerOffset() {
-        return firstContainerOffset;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/Sam2CramRecordFactory.java b/src/main/java/htsjdk/samtools/cram/build/Sam2CramRecordFactory.java
deleted file mode 100644
index b7ffcb1..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/Sam2CramRecordFactory.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMReadGroupRecord;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecord.SAMTagAndValue;
-import htsjdk.samtools.SAMTag;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.HardClip;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Padding;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.ReadTag;
-import htsjdk.samtools.util.Log;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-public class Sam2CramRecordFactory {
-
-    public static final String UNKNOWN_READ_GROUP_ID = "UNKNOWN";
-    public static final String UNKNOWN_READ_GROUP_SAMPLE = "UNKNOWN";
-
-    private final static byte QS_asciiOffset = 33;
-    public final static byte unsetQualityScore = 32;
-    public final static byte ignorePositionsWithQualityScore = -1;
-
-    private byte[] refBases;
-    private final Version version;
-    private byte[] refSNPs;
-
-    final private SAMFileHeader header;
-
-    private static final Log log = Log.getInstance(Sam2CramRecordFactory.class);
-
-    private final Map<String, Integer> readGroupMap = new HashMap<String, Integer>();
-
-    private long landedRefMaskScores = 0;
-    private long landedTotalScores = 0;
-
-    public boolean captureAllTags = false;
-    public boolean preserveReadNames = false;
-    public final Set<String> captureTags = new TreeSet<String>();
-    public final Set<String> ignoreTags = new TreeSet<String>();
-
-    {
-        ignoreTags.add(SAMTag.RG.name());
-    }
-
-    private final List<ReadTag> readTagList = new ArrayList<ReadTag>();
-
-    private long baseCount = 0;
-    private long featureCount = 0;
-
-    public Sam2CramRecordFactory(final byte[] refBases, final SAMFileHeader samFileHeader, final Version version) {
-        this.refBases = refBases;
-        this.version = version;
-        this.header = samFileHeader;
-
-        final List<SAMReadGroupRecord> readGroups = samFileHeader.getReadGroups();
-        for (int i = 0; i < readGroups.size(); i++) {
-            final SAMReadGroupRecord readGroupRecord = readGroups.get(i);
-            readGroupMap.put(readGroupRecord.getId(), i);
-        }
-    }
-
-    /**
-     * Create a CramCompressionRecord.
-     *
-     * @param record If the input record does not have an associated SAMFileHeader, it will be updated
-     *               with the header used for the factory in order to allow reference indices to be resolved.
-     * @return CramCompressionRecord
-     */
-    public CramCompressionRecord createCramRecord(final SAMRecord record) {
-        if (null == record.getHeader()) {
-            record.setHeader(header);
-        }
-        final CramCompressionRecord cramRecord = new CramCompressionRecord();
-        if (record.getReadPairedFlag()) {
-            cramRecord.mateAlignmentStart = record.getMateAlignmentStart();
-            cramRecord.setMateUnmapped(record.getMateUnmappedFlag());
-            cramRecord.setMateNegativeStrand(record.getMateNegativeStrandFlag());
-            cramRecord.mateSequenceID = record.getMateReferenceIndex();
-        } else cramRecord.mateSequenceID = -1;
-        cramRecord.sequenceId = record.getReferenceIndex();
-        cramRecord.readName = record.getReadName();
-        cramRecord.alignmentStart = record.getAlignmentStart();
-
-        cramRecord.setMultiFragment(record.getReadPairedFlag());
-        cramRecord.setProperPair(record.getReadPairedFlag() && record.getProperPairFlag());
-        cramRecord.setSegmentUnmapped(record.getReadUnmappedFlag());
-        cramRecord.setNegativeStrand(record.getReadNegativeStrandFlag());
-        cramRecord.setFirstSegment(record.getReadPairedFlag() && record.getFirstOfPairFlag());
-        cramRecord.setLastSegment(record.getReadPairedFlag() && record.getSecondOfPairFlag());
-        cramRecord.setSecondaryAlignment(record.getNotPrimaryAlignmentFlag());
-        cramRecord.setVendorFiltered(record.getReadFailsVendorQualityCheckFlag());
-        cramRecord.setDuplicate(record.getDuplicateReadFlag());
-        cramRecord.setSupplementary(record.getSupplementaryAlignmentFlag());
-
-        cramRecord.readLength = record.getReadLength();
-        cramRecord.mappingQuality = record.getMappingQuality();
-        cramRecord.setDuplicate(record.getDuplicateReadFlag());
-
-        cramRecord.templateSize = record.getInferredInsertSize();
-
-        final SAMReadGroupRecord readGroup = record.getReadGroup();
-        if (readGroup != null) cramRecord.readGroupID = readGroupMap.get(readGroup.getId());
-        else cramRecord.readGroupID = -1;
-
-        if (!record.getReadPairedFlag()) cramRecord.setLastSegment(false);
-        else {
-            if (record.getFirstOfPairFlag()) cramRecord.setLastSegment(false);
-            else if (record.getSecondOfPairFlag()) cramRecord.setLastSegment(true);
-        }
-
-        if (!record.getReadUnmappedFlag() && record.getAlignmentStart() != SAMRecord.NO_ALIGNMENT_START) {
-            cramRecord.readFeatures = checkedCreateVariations(cramRecord, record);
-        } else cramRecord.readFeatures = Collections.emptyList();
-
-        cramRecord.readBases = record.getReadBases();
-        cramRecord.qualityScores = record.getBaseQualities();
-        landedTotalScores += cramRecord.readLength;
-        if (version.compatibleWith(CramVersions.CRAM_v3))
-            cramRecord.setUnknownBases(record.getReadBases() == SAMRecord.NULL_SEQUENCE);
-
-        readTagList.clear();
-        if (captureAllTags) {
-            final List<SAMTagAndValue> attributes = record.getAttributes();
-            for (final SAMTagAndValue tagAndValue : attributes) {
-                if (ignoreTags.contains(tagAndValue.tag)) continue;
-                readTagList.add(ReadTag.deriveTypeFromValue(tagAndValue.tag, tagAndValue.value));
-            }
-        } else {
-            if (!captureTags.isEmpty()) {
-                final List<SAMTagAndValue> attributes = record.getAttributes();
-                cramRecord.tags = new ReadTag[attributes.size()];
-                for (final SAMTagAndValue tagAndValue : attributes) {
-                    if (captureTags.contains(tagAndValue.tag)) {
-                        readTagList.add(ReadTag.deriveTypeFromValue(tagAndValue.tag, tagAndValue.value));
-                    }
-                }
-            }
-        }
-        cramRecord.tags = readTagList.toArray(new ReadTag[readTagList.size()]);
-
-        cramRecord.setVendorFiltered(record.getReadFailsVendorQualityCheckFlag());
-
-        if (preserveReadNames) cramRecord.readName = record.getReadName();
-
-        return cramRecord;
-    }
-
-    /**
-     * A wrapper method to provide better diagnostics for ArrayIndexOutOfBoundsException.
-     *
-     * @param cramRecord CRAM record
-     * @param samRecord SAM record
-     * @return a list of read features created for the given {@link htsjdk.samtools.SAMRecord}
-     */
-    private List<ReadFeature> checkedCreateVariations(final CramCompressionRecord cramRecord, final SAMRecord samRecord) {
-        try {
-            return createVariations(cramRecord, samRecord);
-        } catch (final ArrayIndexOutOfBoundsException e) {
-            log.error("Reference bases array length=" + refBases.length);
-            log.error("Offensive CRAM record: " + cramRecord.toString());
-            log.error("Offensive SAM record: " + samRecord.getSAMString());
-            throw e;
-        }
-    }
-
-    private List<ReadFeature> createVariations(final CramCompressionRecord cramRecord, final SAMRecord samRecord) {
-        final List<ReadFeature> features = new LinkedList<ReadFeature>();
-        int zeroBasedPositionInRead = 0;
-        int alignmentStartOffset = 0;
-        int cigarElementLength;
-
-        final List<CigarElement> cigarElements = samRecord.getCigar().getCigarElements();
-
-        int cigarLen = 0;
-        for (final CigarElement cigarElement : cigarElements)
-            if (cigarElement.getOperator().consumesReadBases())
-                cigarLen += cigarElement.getLength();
-
-        byte[] bases = samRecord.getReadBases();
-        if (bases.length == 0) {
-            bases = new byte[cigarLen];
-            Arrays.fill(bases, (byte) 'N');
-        }
-        final byte[] qualityScore = samRecord.getBaseQualities();
-
-        for (final CigarElement cigarElement : cigarElements) {
-            cigarElementLength = cigarElement.getLength();
-            final CigarOperator operator = cigarElement.getOperator();
-
-            switch (operator) {
-                case D:
-                    features.add(new Deletion(zeroBasedPositionInRead + 1, cigarElementLength));
-                    break;
-                case N:
-                    features.add(new RefSkip(zeroBasedPositionInRead + 1, cigarElementLength));
-                    break;
-                case P:
-                    features.add(new Padding(zeroBasedPositionInRead + 1, cigarElementLength));
-                    break;
-                case H:
-                    features.add(new HardClip(zeroBasedPositionInRead + 1, cigarElementLength));
-                    break;
-                case S:
-                    addSoftClip(features, zeroBasedPositionInRead, cigarElementLength, bases);
-                    break;
-                case I:
-                    addInsertion(features, zeroBasedPositionInRead, cigarElementLength, bases);
-                    break;
-                case M:
-                case X:
-                case EQ:
-                    addSubstitutionsAndMaskedBases(cramRecord, features, zeroBasedPositionInRead, alignmentStartOffset,
-                            cigarElementLength, bases, qualityScore);
-                    break;
-                default:
-                    throw new IllegalArgumentException("Unsupported cigar operator: " + cigarElement.getOperator());
-            }
-
-            if (cigarElement.getOperator().consumesReadBases()) zeroBasedPositionInRead += cigarElementLength;
-            if (cigarElement.getOperator().consumesReferenceBases()) alignmentStartOffset += cigarElementLength;
-        }
-
-        this.baseCount += bases.length;
-        this.featureCount += features.size();
-
-        return features;
-    }
-
-    private void addSoftClip(final List<ReadFeature> features, final int zeroBasedPositionInRead, final int cigarElementLength, final byte[] bases) {
-        final byte[] insertedBases = Arrays.copyOfRange(bases, zeroBasedPositionInRead, zeroBasedPositionInRead + cigarElementLength);
-
-        final SoftClip softClip = new SoftClip(zeroBasedPositionInRead + 1, insertedBases);
-        features.add(softClip);
-    }
-
-    private void addHardClip(final List<ReadFeature> features, final int zeroBasedPositionInRead, final int cigarElementLength, final byte[] bases) {
-        final byte[] insertedBases = Arrays.copyOfRange(bases, zeroBasedPositionInRead, zeroBasedPositionInRead + cigarElementLength);
-
-        final HardClip hardClip = new HardClip(zeroBasedPositionInRead + 1, insertedBases.length);
-        features.add(hardClip);
-    }
-
-    private void addInsertion(final List<ReadFeature> features, final int zeroBasedPositionInRead, final int cigarElementLength, final byte[] bases) {
-        final byte[] insertedBases = Arrays.copyOfRange(bases, zeroBasedPositionInRead, zeroBasedPositionInRead + cigarElementLength);
-
-
-        for (int i = 0; i < insertedBases.length; i++) {
-            // single base insertion:
-            final InsertBase insertBase = new InsertBase();
-            insertBase.setPosition(zeroBasedPositionInRead + 1 + i);
-            insertBase.setBase(insertedBases[i]);
-            features.add(insertBase);
-        }
-    }
-
-    private void addSubstitutionsAndMaskedBases(final CramCompressionRecord cramRecord, final List<ReadFeature> features, final int fromPosInRead, final int
-            alignmentStartOffset, final int nofReadBases, final byte[] bases, final byte[] qualityScore) {
-        int oneBasedPositionInRead;
-        final boolean noQS = (qualityScore.length == 0);
-
-        int i;
-        boolean qualityAdded;
-        byte refBase;
-        for (i = 0; i < nofReadBases; i++) {
-            oneBasedPositionInRead = i + fromPosInRead + 1;
-            final int referenceCoordinates = cramRecord.alignmentStart + i + alignmentStartOffset - 1;
-            qualityAdded = false;
-            if (referenceCoordinates >= refBases.length) refBase = 'N';
-            else refBase = refBases[referenceCoordinates];
-            refBase = Utils.normalizeBase(refBase);
-
-            if (bases[i + fromPosInRead] != refBase) {
-                final Substitution substitution = new Substitution();
-                substitution.setPosition(oneBasedPositionInRead);
-                substitution.setBase(bases[i + fromPosInRead]);
-                substitution.setReferenceBase(refBase);
-
-                features.add(substitution);
-
-                if (noQS) continue;
-            }
-
-            if (noQS) continue;
-
-            if (refSNPs != null) {
-                final byte snpOrNot = refSNPs[referenceCoordinates];
-                if (snpOrNot != 0) {
-                    final byte score = (byte) (QS_asciiOffset + qualityScore[i + fromPosInRead]);
-                    features.add(new BaseQualityScore(oneBasedPositionInRead, score));
-                    qualityAdded = true;
-                    landedRefMaskScores++;
-                }
-            }
-
-            if (qualityAdded) landedTotalScores++;
-        }
-    }
-
-    public long getLandedRefMaskScores() {
-        return landedRefMaskScores;
-    }
-
-    public long getLandedTotalScores() {
-        return landedTotalScores;
-    }
-
-    public byte[] getRefBases() {
-        return refBases;
-    }
-
-    public void setRefBases(final byte[] refBases) {
-        this.refBases = refBases;
-    }
-
-    public byte[] getRefSNPs() {
-        return refSNPs;
-    }
-
-    public void setRefSNPs(final byte[] refSNPs) {
-        this.refSNPs = refSNPs;
-    }
-
-    public Map<String, Integer> getReadGroupMap() {
-        return readGroupMap;
-    }
-
-
-    public long getBaseCount() {
-        return baseCount;
-    }
-
-    public long getFeatureCount() {
-        return featureCount;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/Utils.java b/src/main/java/htsjdk/samtools/cram/build/Utils.java
deleted file mode 100644
index 7fdeeba..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/Utils.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-final public class Utils {
-
-    private Utils() {};
-
-    /**
-     * CRAM operates with upper case bases, so both read and ref bases should be
-     * upper-cased and vocab controlled. This method does exactly this: upper
-     * case acgt and replace everything else with N.
-     *
-     * @param base a base to normalize
-     * @return a normalized base
-     */
-    public static byte normalizeBase(final byte base) {
-        switch (base) {
-            case 'a':
-            case 'A':
-                return 'A';
-
-            case 'c':
-            case 'C':
-                return 'C';
-
-            case 'g':
-            case 'G':
-                return 'G';
-
-            case 't':
-            case 'T':
-                return 'T';
-
-            default:
-                return 'N';
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/common/CramVersionPolicies.java b/src/main/java/htsjdk/samtools/cram/common/CramVersionPolicies.java
deleted file mode 100644
index fa1eafb..0000000
--- a/src/main/java/htsjdk/samtools/cram/common/CramVersionPolicies.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package htsjdk.samtools.cram.common;
-
-import htsjdk.samtools.util.Log;
-
-/**
- * The class provides version-dependant rules and policies for CRAM data.
- */
-public class CramVersionPolicies {
-    private static final Log log = Log.getInstance(CramVersionPolicies.class);
-
-    /**
-     * The method holds the behaviour for when the EOF marker is not found. Depending on the CRAM version this will be ignored, a warning
-     * issued or an exception produced.
-     *
-     * @param version CRAM version to assume
-     */
-    public static void eofNotFound(final Version version) {
-        if (version.compatibleWith(CramVersions.CRAM_v3)) {
-            log.error("Incomplete data: EOF marker not found.");
-            throw new RuntimeException("EOF not found.");
-        }
-        if (version.compatibleWith(CramVersions.CRAM_v2_1)) log.warn("EOF marker not found, possibly incomplete file/stream.");
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/common/CramVersions.java b/src/main/java/htsjdk/samtools/cram/common/CramVersions.java
deleted file mode 100644
index 26d5685..0000000
--- a/src/main/java/htsjdk/samtools/cram/common/CramVersions.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package htsjdk.samtools.cram.common;
-
-public class CramVersions {
-    public static final Version CRAM_v2_1 = new Version(2, 1, 0);
-    public static final Version CRAM_v3 = new Version(3, 0, 0);
-
-    /**
-     * The default CRAM version when creating a new CRAM output file or stream.
-     */
-    public static final Version DEFAULT_CRAM_VERSION = CRAM_v3;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/common/IntHashMap.java b/src/main/java/htsjdk/samtools/cram/common/IntHashMap.java
deleted file mode 100644
index f2bca06..0000000
--- a/src/main/java/htsjdk/samtools/cram/common/IntHashMap.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.common;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Note: originally released under the GNU LGPL v2.1, 
- * but re-released by the original author under the ASF license (above).
- */
-
-/**
- * <p>
- * A hash map that uses primitive ints for the key rather than objects.
- * </p>
- * <p/>
- * <p>
- * Note that this class is for internal optimization purposes only, and may not
- * be supported in future releases of Apache Commons Lang. Utilities of this
- * sort may be included in future releases of Apache Commons Collections.
- * </p>
- *
- * @author Justin Couch
- * @author Alex Chaffee (alex at apache.org)
- * @author Stephen Colebourne
- * @version $Revision: 561230 $
- * @see java.util.HashMap
- * @since 2.0
- */
-public class IntHashMap<T> {
-
-    /**
-     * The hash table data.
-     */
-    private transient Entry<T> table[];
-
-    /**
-     * The total number of entries in the hash table.
-     */
-    private transient int count;
-
-    /**
-     * The table is rehashed when its size exceeds this threshold. (The value of
-     * this field is (int)(capacity * loadFactor).)
-     *
-     * @serial
-     */
-    private int threshold;
-
-    /**
-     * The load factor for the hashtable.
-     *
-     * @serial
-     */
-    private float loadFactor;
-
-    /**
-     * <p>
-     * Innerclass that acts as a datastructure to create a new entry in the
-     * table.
-     * </p>
-     */
-    private static class Entry<E> {
-        final int hash;
-        final int key;
-        E value;
-        Entry<E> next;
-
-        /**
-         * <p>
-         * Create a new entry with the given values.
-         * </p>
-         *
-         * @param hash  The code used to hash the object with
-         * @param key   The key used to enter this in the table
-         * @param value The value for this key
-         * @param next  A reference to the next entry in the table
-         */
-        protected Entry(final int hash, final int key, final E value, final Entry<E> next) {
-            this.hash = hash;
-            this.key = key;
-            this.value = value;
-            this.next = next;
-        }
-    }
-
-    /**
-     * <p>
-     * Constructs a new, empty hashtable with a default capacity and load
-     * factor, which is <code>20</code> and <code>0.75</code> respectively.
-     * </p>
-     */
-    public IntHashMap() {
-        this(20, 0.75f);
-    }
-
-    /**
-     * <p>
-     * Constructs a new, empty hashtable with the specified initial capacity and
-     * default load factor, which is <code>0.75</code>.
-     * </p>
-     *
-     * @param initialCapacity the initial capacity of the hashtable.
-     * @throws IllegalArgumentException if the initial capacity is less than zero.
-     */
-    public IntHashMap(final int initialCapacity) {
-        this(initialCapacity, 0.75f);
-    }
-
-    /**
-     * <p>
-     * Constructs a new, empty hashtable with the specified initial capacity and
-     * the specified load factor.
-     * </p>
-     *
-     * @param initialCapacity the initial capacity of the hashtable.
-     * @param loadFactor      the load factor of the hashtable.
-     * @throws IllegalArgumentException if the initial capacity is less than zero, or if the load
-     *                                  factor is non-positive.
-     */
-    public IntHashMap(int initialCapacity, final float loadFactor) {
-        super();
-        if (initialCapacity < 0) {
-            throw new IllegalArgumentException("Illegal Capacity: "
-                    + initialCapacity);
-        }
-        if (loadFactor <= 0) {
-            throw new IllegalArgumentException("Illegal Load: " + loadFactor);
-        }
-        if (initialCapacity == 0) {
-            initialCapacity = 1;
-        }
-
-        this.loadFactor = loadFactor;
-        table = new Entry[initialCapacity];
-        threshold = (int) (initialCapacity * loadFactor);
-    }
-
-    /**
-     * <p>
-     * Returns the number of keys in this hashtable.
-     * </p>
-     *
-     * @return the number of keys in this hashtable.
-     */
-    public int size() {
-        return count;
-    }
-
-    /**
-     * <p>
-     * Tests if this hashtable maps no keys to values.
-     * </p>
-     *
-     * @return <code>true</code> if this hashtable maps no keys to values;
-     * <code>false</code> otherwise.
-     */
-    public boolean isEmpty() {
-        return count == 0;
-    }
-
-    /**
-     * <p>
-     * Tests if some key maps into the specified value in this hashtable. This
-     * operation is more expensive than the <code>containsKey</code> method.
-     * </p>
-     * <p/>
-     * <p>
-     * Note that this method is identical in functionality to containsValue,
-     * (which is part of the Map interface in the collections framework).
-     * </p>
-     *
-     * @param value a value to search for.
-     * @return <code>true</code> if and only if some key maps to the
-     * <code>value</code> argument in this hashtable as determined by
-     * the <tt>equals</tt> method; <code>false</code> otherwise.
-     * @throws NullPointerException if the value is <code>null</code>.
-     * @see #containsKey(int)
-     * @see #containsValue(Object)
-     * @see java.util.Map
-     */
-    public boolean contains(final Object value) {
-        if (value == null) {
-            throw new NullPointerException();
-        }
-
-        final Entry<T>[] tab = table;
-        for (int i = tab.length; i-- > 0; ) {
-            for (Entry<T> e = tab[i]; e != null; e = e.next) {
-                if (e.value.equals(value)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * <p>
-     * Returns <code>true</code> if this HashMap maps one or more keys to this
-     * value.
-     * </p>
-     * <p/>
-     * <p>
-     * Note that this method is identical in functionality to contains (which
-     * predates the Map interface).
-     * </p>
-     *
-     * @param value value whose presence in this HashMap is to be tested.
-     * @return boolean <code>true</code> if the value is contained
-     * @see java.util.Map
-     * @since JDK1.2
-     */
-    public boolean containsValue(final Object value) {
-        return contains(value);
-    }
-
-    /**
-     * <p>
-     * Tests if the specified object is a key in this hashtable.
-     * </p>
-     *
-     * @param key possible key.
-     * @return <code>true</code> if and only if the specified object is a key in
-     * this hashtable, as determined by the <tt>equals</tt> method;
-     * <code>false</code> otherwise.
-     * @see #contains(Object)
-     */
-    public boolean containsKey(final int key) {
-        final Entry<T>[] tab = table;
-        final int index = (key & 0x7FFFFFFF) % tab.length;
-        for (Entry<T> entry = tab[index]; entry != null; entry = entry.next) {
-            if (entry.hash == key) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * <p>
-     * Returns the value to which the specified key is mapped in this map.
-     * </p>
-     *
-     * @param key a key in the hashtable.
-     * @return the value to which the key is mapped in this hashtable;
-     * <code>null</code> if the key is not mapped to any value in this
-     * hashtable.
-     * @see #put(int, Object)
-     */
-    public T get(final int key) {
-        final Entry<T>[] tab = table;
-        final int index = (key & 0x7FFFFFFF) % tab.length;
-        for (Entry<T> e = tab[index]; e != null; e = e.next) {
-            if (e.hash == key) {
-                return e.value;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * <p>
-     * Increases the capacity of and internally reorganizes this hashtable, in
-     * order to accommodate and access its entries more efficiently.
-     * </p>
-     * <p/>
-     * <p>
-     * This method is called automatically when the number of keys in the
-     * hashtable exceeds this hashtable's capacity and load factor.
-     * </p>
-     */
-    protected void rehash() {
-        final int oldCapacity = table.length;
-        final Entry<T>[] oldMap = table;
-
-        final int newCapacity = oldCapacity * 2 + 1;
-        final Entry<T>[] newMap = new Entry[newCapacity];
-
-        threshold = (int) (newCapacity * loadFactor);
-        table = newMap;
-
-        for (int i = oldCapacity; i-- > 0; ) {
-            for (Entry<T> old = oldMap[i]; old != null; ) {
-                final Entry<T> entry = old;
-                old = old.next;
-
-                final int index = (entry.hash & 0x7FFFFFFF) % newCapacity;
-                entry.next = newMap[index];
-                newMap[index] = entry;
-            }
-        }
-    }
-
-    /**
-     * <p>
-     * Maps the specified <code>key</code> to the specified <code>value</code>
-     * in this hashtable. The key cannot be <code>null</code>.
-     * </p>
-     * <p/>
-     * <p>
-     * The value can be retrieved by calling the <code>get</code> method with a
-     * key that is equal to the original key.
-     * </p>
-     *
-     * @param key   the hashtable key.
-     * @param value the value.
-     * @return the previous value of the specified key in this hashtable, or
-     * <code>null</code> if it did not have one.
-     * @throws NullPointerException if the key is <code>null</code>.
-     * @see #get(int)
-     */
-    public Object put(final int key, final T value) {
-        // Makes sure the key is not already in the hashtable.
-        Entry<T> tab[] = table;
-        int index = (key & 0x7FFFFFFF) % tab.length;
-        for (Entry<T> entry = tab[index]; entry != null; entry = entry.next) {
-            if (entry.hash == key) {
-                final Object old = entry.value;
-                entry.value = value;
-                return old;
-            }
-        }
-
-        if (count >= threshold) {
-            // Rehash the table if the threshold is exceeded
-            rehash();
-
-            tab = table;
-            index = (key & 0x7FFFFFFF) % tab.length;
-        }
-
-        // Creates the new entry.
-        final Entry<T> entry = new Entry<T>(key, key, value, tab[index]);
-        tab[index] = entry;
-        count++;
-        return null;
-    }
-
-    /**
-     * <p>
-     * Removes the key (and its corresponding value) from this hashtable.
-     * </p>
-     * <p/>
-     * <p>
-     * This method does nothing if the key is not present in the hashtable.
-     * </p>
-     *
-     * @param key the key that needs to be removed.
-     * @return the value to which the key had been mapped in this hashtable, or
-     * <code>null</code> if the key did not have a mapping.
-     */
-    public Object remove(final int key) {
-        final Entry<T>[] tab = table;
-        final int index = (key & 0x7FFFFFFF) % tab.length;
-        for (Entry<T> entry = tab[index], prev = null; entry != null; prev = entry, entry = entry.next) {
-            if (entry.hash == key) {
-                if (prev != null) {
-                    prev.next = entry.next;
-                } else {
-                    tab[index] = entry.next;
-                }
-                count--;
-                final Object oldValue = entry.value;
-                entry.value = null;
-                return oldValue;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * <p>
-     * Clears this hashtable so that it contains no keys.
-     * </p>
-     */
-    public synchronized void clear() {
-        final Entry<T>[] tab = table;
-        for (int index = tab.length; --index >= 0; ) {
-            tab[index] = null;
-        }
-        count = 0;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/common/MutableInt.java b/src/main/java/htsjdk/samtools/cram/common/MutableInt.java
deleted file mode 100644
index 4b3d4ff..0000000
--- a/src/main/java/htsjdk/samtools/cram/common/MutableInt.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.common;
-
-public class MutableInt {
-    public int value = 0;
-
-    @Override
-    public int hashCode() {
-        return value;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/common/Version.java b/src/main/java/htsjdk/samtools/cram/common/Version.java
deleted file mode 100644
index d20ecf9..0000000
--- a/src/main/java/htsjdk/samtools/cram/common/Version.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package htsjdk.samtools.cram.common;
-
-/**
- * A class to represent a version information, 3 number: major, minor and build number.
- */
-public class Version implements Comparable<Version> {
-    public final int major;
-    public final int minor;
-    private final int build;
-
-    public Version(final int major, final int minor, final int build) {
-        this.major = major;
-        this.minor = minor;
-        this.build = build;
-    }
-
-    public Version(final String version) {
-        final String[] numbers = version.split("[\\.\\-b]");
-        major = Integer.valueOf(numbers[0]);
-        minor = Integer.valueOf(numbers[1]);
-        if (numbers.length > 3) build = Integer.valueOf(numbers[3]);
-        else build = 0;
-    }
-
-    @Override
-    public String toString() {
-        if (build > 0) return String.format("%d.%d-b%d", major, minor, build);
-        else return String.format("%d.%d", major, minor);
-    }
-
-    /**
-     * Compare with another version.
-     *
-     * @param o another version
-     * @return 0 if both versions are the same, a negative if the other version is higher and a positive otherwise.
-     */
-    @Override
-    public int compareTo(@SuppressWarnings("NullableProblems") final Version o) {
-        if (o == null) return -1;
-        if (major - o.major != 0) return major - o.major;
-        if (minor - o.minor != 0) return minor - o.minor;
-
-        if (build < 1 || o.build < 1) return 0;
-        return build - o.build;
-    }
-
-    /**
-     * Check if another version is exactly the same as this one.
-     *
-     * @param obj another version object
-     * @return true if both versions are the same, false otherwise.
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == null || !(obj instanceof Version)) return false;
-        final Version version = (Version) obj;
-        return major == version.major && minor == version.minor;
-    }
-
-    public boolean compatibleWith(final Version version) {
-        return compareTo(version) >= 0;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/cram/digest/AbstractSerialDigest.java b/src/main/java/htsjdk/samtools/cram/digest/AbstractSerialDigest.java
deleted file mode 100644
index f1a2f18..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/AbstractSerialDigest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-abstract class AbstractSerialDigest<T> {
-    private final Combine<T> combine;
-    T value;
-
-    AbstractSerialDigest(final Combine<T> combine, final T value) {
-        this.combine = combine;
-        this.value = value;
-    }
-
-    protected abstract void resetAndUpdate(byte[] data);
-
-    protected abstract T getValue();
-
-    protected abstract byte[] asByteArray();
-
-    void add(final byte[] data) {
-        resetAndUpdate(data);
-        final T updateValue = getValue();
-        if (value == null)
-            value = updateValue;
-        else
-            value = combine.combine(value, updateValue);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/ByteSumCombine.java b/src/main/java/htsjdk/samtools/cram/digest/ByteSumCombine.java
deleted file mode 100644
index 25dd77f..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/ByteSumCombine.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-class ByteSumCombine implements Combine<byte[]> {
-
-    @Override
-    public byte[] combine(final byte[] state, final byte[] update) {
-        for (int i = 0; i < state.length; i++)
-            state[i] += update[i];
-        return state;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/Combine.java b/src/main/java/htsjdk/samtools/cram/digest/Combine.java
deleted file mode 100644
index 4868127..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/Combine.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-interface Combine<T> {
-
-    T combine(T state, T update);
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/ContentDigests.java b/src/main/java/htsjdk/samtools/cram/digest/ContentDigests.java
deleted file mode 100644
index bbfe1ed..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/ContentDigests.java
+++ /dev/null
@@ -1,217 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-import htsjdk.samtools.SAMBinaryTagAndValue;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMTagUtil;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.util.Log;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.LinkedList;
-import java.util.List;
-
-public class ContentDigests {
-    public static final EnumSet<KNOWN_DIGESTS> ALL = EnumSet
-            .allOf(KNOWN_DIGESTS.class);
-    public static final EnumSet<KNOWN_DIGESTS> CRC32 = EnumSet.of(
-            KNOWN_DIGESTS.BD, KNOWN_DIGESTS.SD);
-
-    private static final Log log = Log.getInstance(ContentDigests.class);
-    private List<Digester> digesters = new LinkedList<ContentDigests.Digester>();
-
-    public static ContentDigests create(final EnumSet<KNOWN_DIGESTS> requestedDigests) {
-        final List<Digester> digesters = new LinkedList<ContentDigests.Digester>();
-        for (final KNOWN_DIGESTS digest : requestedDigests)
-            digesters.add(digest.createDigester());
-        return new ContentDigests(digesters);
-    }
-
-    public static ContentDigests create(final SAMBinaryTagAndValue binaryTags) {
-        final List<Digester> digesters = new LinkedList<ContentDigests.Digester>();
-        SAMBinaryTagAndValue binaryTag = binaryTags;
-        while (binaryTag != null) {
-            final String tagID = SAMTagUtil.getSingleton().makeStringTag(
-                    binaryTag.tag);
-            final KNOWN_DIGESTS hash;
-            try {
-                hash = KNOWN_DIGESTS.valueOf(tagID);
-                digesters.add(hash.createDigester());
-            } catch (final IllegalArgumentException e) {
-                // The tag is not one of the known content digest tags.
-            }
-            binaryTag = binaryTag.getNext();
-        }
-        return new ContentDigests(digesters);
-    }
-
-    private ContentDigests(final List<Digester> hashers) {
-        this.digesters = hashers;
-    }
-
-    void add(final SAMRecord record) {
-        for (final Digester digester : digesters)
-            digester.add(record);
-    }
-
-    public void add(final CramCompressionRecord record) {
-        for (final Digester digester : digesters)
-            digester.addCramRecord(record);
-    }
-
-    public void addSAMRecords(final Iterable<SAMRecord> records) {
-        for (final SAMRecord record : records)
-            add(record);
-    }
-
-    public void addCramRecords(final Iterable<CramCompressionRecord> records) {
-        for (final CramCompressionRecord record : records)
-            add(record);
-    }
-
-    public SAMBinaryTagAndValue getAsTags() {
-        SAMBinaryTagAndValue tag = null;
-        for (final Digester digester : digesters) {
-            if (tag == null)
-                tag = digester.toTag();
-            else
-                tag = tag.insert(digester.toTag());
-        }
-
-        return tag;
-    }
-
-    public boolean test(final SAMBinaryTagAndValue tags) {
-        for (final Digester digester : digesters) {
-            final SAMBinaryTagAndValue foundTag = tags.find(digester.tagCode);
-            if (foundTag == null)
-                continue;
-
-            if (!(foundTag.value instanceof byte[]))
-                throw new RuntimeException("Expecting a byte array but got: "
-                        + foundTag.value.getClass().getName());
-
-            final byte[] expected = (byte[]) foundTag.value;
-            final byte[] actual = digester.digest.asByteArray();
-            if (!Arrays.equals(expected, actual)) {
-                final String expectedString = toHexString(expected);
-                final String actualString = toHexString(actual);
-                log.error(String
-                        .format("Content hash mismatch for tag %s, actual: %s; expected: %s",
-                                digester.tagID, actualString, expectedString));
-                return false;
-            } else
-                log.debug("Content digest ok: " + digester.tagID);
-        }
-        return true;
-    }
-
-    private static String toHex(final byte[] bytes) {
-        final StringBuilder sb = new StringBuilder();
-        for (final byte t : bytes) {
-            sb.append(String.format("%02x", (0xFF & t)).toUpperCase()).append(
-                    ' ');
-        }
-        return sb.toString();
-    }
-
-    private static String toHexString(final byte[] bytes) {
-        return toHex(bytes).replace(" ", "");
-    }
-
-    private static class Digester {
-        final AbstractSerialDigest<?> digest;
-        final SERIES series;
-        final String tagID;
-        final short tagCode;
-
-        Digester(final AbstractSerialDigest<?> digest, final SERIES series, final String tagID) {
-            this.digest = digest;
-            this.series = series;
-            this.tagID = tagID;
-            this.tagCode = SAMTagUtil.getSingleton().makeBinaryTag(tagID);
-        }
-
-        void add(final SAMRecord record) {
-            digest.add(series.getBytes(record));
-        }
-
-        void addCramRecord(final CramCompressionRecord record) {
-            digest.add(series.getBytes(record));
-        }
-
-        SAMBinaryTagAndValue toTag() {
-            return new SAMBinaryTagAndValue(tagCode, digest.asByteArray());
-        }
-    }
-
-    public enum KNOWN_DIGESTS {
-        BD {
-            @Override
-            Digester createDigester() {
-                return new Digester(new Crc32Hasher(new IntegerSumCombine()),
-                        SERIES.BASES, name());
-            }
-        },
-        SD {
-            @Override
-            Digester createDigester() {
-                return new Digester(new Crc32Hasher(new IntegerSumCombine()),
-                        SERIES.SCORES, name());
-            }
-        },
-        B5 {
-            @Override
-            Digester createDigester() {
-                try {
-                    return new Digester(new MessageDigestHasher(
-                            MessageDigest.getInstance("SHA-512"),
-                            new ByteSumCombine(), null), SERIES.BASES, name());
-                } catch (final NoSuchAlgorithmException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        },
-        S5 {
-            @Override
-            Digester createDigester() {
-                try {
-                    return new Digester(new MessageDigestHasher(
-                            MessageDigest.getInstance("SHA-512"),
-                            new ByteSumCombine(), null), SERIES.SCORES, name());
-                } catch (final NoSuchAlgorithmException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        },
-        B1 {
-            @Override
-            Digester createDigester() {
-                try {
-                    return new Digester(new MessageDigestHasher(
-                            MessageDigest.getInstance("SHA-1"),
-                            new ByteSumCombine(), null), SERIES.BASES, name());
-                } catch (final NoSuchAlgorithmException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        },
-        S1 {
-            @Override
-            Digester createDigester() {
-                try {
-                    return new Digester(new MessageDigestHasher(
-                            MessageDigest.getInstance("SHA-1"),
-                            new ByteSumCombine(), null), SERIES.SCORES, name());
-                } catch (final NoSuchAlgorithmException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        };
-
-        abstract Digester createDigester();
-
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/Crc32Hasher.java b/src/main/java/htsjdk/samtools/cram/digest/Crc32Hasher.java
deleted file mode 100644
index 464e220..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/Crc32Hasher.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-import java.nio.ByteOrder;
-import java.util.zip.CRC32;
-
-class Crc32Hasher extends AbstractSerialDigest<Integer> {
-    private final CRC32 crc32 = new CRC32();
-    private final ByteOrder byteOrder = ByteOrder.LITTLE_ENDIAN;
-
-    Crc32Hasher(final Combine<Integer> combine) {
-        super(combine, null);
-    }
-
-    @Override
-    protected void resetAndUpdate(final byte[] data) {
-        crc32.reset();
-        crc32.update(data);
-    }
-
-    @Override
-    protected Integer getValue() {
-        return (int) (crc32.getValue() & 0xFFFFFFFFL);
-    }
-
-    @Override
-    protected byte[] asByteArray() {
-        final byte[] array = new byte[4];
-        if (byteOrder == ByteOrder.LITTLE_ENDIAN) {
-            array[3] = (byte) ((value >>> 24) & 0xFF);
-            array[2] = (byte) ((value >>> 16) & 0xFF);
-            array[1] = (byte) ((value >>> 8) & 0xFF);
-            array[0] = (byte) ((value) & 0xFF);
-        } else {
-            array[0] = (byte) ((value >>> 24) & 0xFF);
-            array[1] = (byte) ((value >>> 16) & 0xFF);
-            array[2] = (byte) ((value >>> 8) & 0xFF);
-            array[3] = (byte) ((value) & 0xFF);
-        }
-        return array;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/IntegerSumCombine.java b/src/main/java/htsjdk/samtools/cram/digest/IntegerSumCombine.java
deleted file mode 100644
index d6b18e0..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/IntegerSumCombine.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-class IntegerSumCombine implements Combine<Integer> {
-
-    @Override
-    public Integer combine(final Integer state, final Integer update) {
-        return state + update;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/MessageDigestHasher.java b/src/main/java/htsjdk/samtools/cram/digest/MessageDigestHasher.java
deleted file mode 100644
index e5f8f35..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/MessageDigestHasher.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-import java.security.MessageDigest;
-
-class MessageDigestHasher extends AbstractSerialDigest<byte[]> {
-    private final MessageDigest messageDigest;
-
-    MessageDigestHasher(final MessageDigest messageDigest, final Combine<byte[]> combine,
-                        final byte[] value) {
-        super(combine, value);
-        this.messageDigest = messageDigest;
-    }
-
-    @Override
-    protected void resetAndUpdate(final byte[] data) {
-        messageDigest.reset();
-        messageDigest.update(data);
-    }
-
-    @Override
-    protected byte[] getValue() {
-        return messageDigest.digest();
-    }
-
-    @Override
-    protected byte[] asByteArray() {
-        return messageDigest.digest();
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/SERIES.java b/src/main/java/htsjdk/samtools/cram/digest/SERIES.java
deleted file mode 100644
index 82ce6f6..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/SERIES.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-
-enum SERIES {
-    BASES {
-        @Override
-        byte[] getBytes(final SAMRecord record) {
-            return record.getReadBases();
-        }
-
-        @Override
-        byte[] getBytes(final CramCompressionRecord record) {
-            return record.readBases;
-        }
-    },
-    SCORES {
-        @Override
-        byte[] getBytes(final SAMRecord record) {
-            return record.getBaseQualities();
-        }
-
-        @Override
-        byte[] getBytes(final CramCompressionRecord record) {
-            return record.qualityScores;
-        }
-    };
-
-    abstract byte[] getBytes(SAMRecord record);
-
-    abstract byte[] getBytes(CramCompressionRecord record);
-
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/AbstractBitCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/AbstractBitCodec.java
deleted file mode 100644
index a15c893..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/AbstractBitCodec.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-public abstract class AbstractBitCodec<T> implements BitCodec<T> {
-
-    @Override
-    public abstract T read(BitInputStream bitInputStream) throws IOException;
-
-    @Override
-    public abstract T read(BitInputStream bitInputStream, int valueLen) throws IOException;
-
-    @Override
-    public void readInto(final BitInputStream bitInputStream, final byte[] array, final int offset,
-                         final int valueLen) throws IOException {
-        throw new RuntimeException("Not implemented.");
-    }
-
-    @Override
-    public void skip(final BitInputStream bitInputStream) throws IOException {
-        read(bitInputStream);
-    }
-
-    @Override
-    public void skip(final BitInputStream bitInputStream, final int length) throws IOException {
-        read(bitInputStream, length);
-    }
-
-    @Override
-    public abstract long write(BitOutputStream bitOutputStream, T object)
-            throws IOException;
-
-    @Override
-    public abstract long numberOfBits(T object);
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerCodec.java
deleted file mode 100644
index 496f5a6..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerCodec.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class BetaIntegerCodec extends AbstractBitCodec<Integer> {
-    private int offset = 0;
-    private final int readNofBits;
-
-    public BetaIntegerCodec(final int offset, final int readNofBits) {
-        this.offset = offset;
-        this.readNofBits = readNofBits;
-    }
-
-    @Override
-    public final Integer read(final BitInputStream bitInputStream) throws IOException {
-        return bitInputStream.readBits(readNofBits) - offset;
-    }
-
-    @Override
-    public final long write(final BitOutputStream bitOutputStream, final Integer value) throws IOException {
-        final int nofBits = (int) numberOfBits(value);
-        final long newValue = value + offset;
-        bitOutputStream.write(newValue, nofBits);
-        return nofBits;
-    }
-
-    @Override
-    public final long numberOfBits(final Integer value) {
-        if (value > (1L << readNofBits))
-            throw new IllegalArgumentException("Value written is bigger then allowed: value=" + value
-                    + ", max nof bits=" + readNofBits);
-
-        return readNofBits;
-    }
-
-    @Override
-    public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
-        throw new RuntimeException("Not implemented.");
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerEncoding.java
deleted file mode 100644
index 486ae36..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerEncoding.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class BetaIntegerEncoding implements Encoding<Integer> {
-    private static final EncodingID ENCODING_ID = EncodingID.BETA;
-    private int offset;
-    private int bitLimit;
-
-    public BetaIntegerEncoding() {
-    }
-
-    public BetaIntegerEncoding(final int offset, final int bitLimit) {
-        this.offset = offset;
-        this.bitLimit = bitLimit;
-    }
-
-    @Override
-    public EncodingID id() {
-        return ENCODING_ID;
-    }
-
-    public static EncodingParams toParam(final int offset, final int bitLimit) {
-        final BetaIntegerEncoding encoding = new BetaIntegerEncoding();
-        encoding.offset = offset;
-        encoding.bitLimit = bitLimit;
-        return new EncodingParams(ENCODING_ID, encoding.toByteArray());
-    }
-
-    @Override
-    public byte[] toByteArray() {
-        final ByteBuffer buffer = ByteBuffer.allocate(10);
-        ITF8.writeUnsignedITF8(offset, buffer);
-        ITF8.writeUnsignedITF8(bitLimit, buffer);
-        buffer.flip();
-        final byte[] array = new byte[buffer.limit()];
-        buffer.get(array);
-        return array;
-    }
-
-    @Override
-    public void fromByteArray(final byte[] data) {
-        final ByteBuffer buffer = ByteBuffer.wrap(data);
-        offset = ITF8.readUnsignedITF8(buffer);
-        bitLimit = ITF8.readUnsignedITF8(buffer);
-    }
-
-    @Override
-    public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
-                                        final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        return new BetaIntegerCodec(offset, bitLimit);
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/BitCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/BitCodec.java
deleted file mode 100644
index 2920f11..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/BitCodec.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-/**
- * An interface that defines requirements for serializing/deserializing objects into and from a bit stream.
- *
- * @param <T> data series type to be read or written
- * @noinspection UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier
- */
-public interface BitCodec<T> {
-
-    /**
-     * Read a single object from the bit stream.
-     *
-     * @param bitInputStream the bit input stream to rad from
-     * @return an object from the stream
-     * @throws IOException as per java IO contract
-     */
-    T read(BitInputStream bitInputStream) throws IOException;
-
-    /**
-     * Read a array of specified length from the bit stream.
-     *
-     * @param bitInputStream the bit input stream to rad from
-     * param valueLen the number of elements to read
-     * @return an object from the stream
-     * @throws IOException as per java IO contract
-     */
-    T read(BitInputStream bitInputStream, int valueLen) throws IOException;
-
-    /**
-     * Read a array of specified length from the bit stream into a given byte array.
-     * This method is a way to optimize byte array IO operations by bypassing abstraction. Leaky, I know.
-     *
-     * @param bitInputStream the bit input stream to rad from
-     * @param array the array to read into
-     * @param offset offset in the array
-     * @param valueLen number of elements to read
-     * @throws IOException as per java IO contract
-     */
-    void readInto(BitInputStream bitInputStream, byte[] array, int offset,
-                  int valueLen) throws IOException;
-
-    /**
-     * Skip the next object in the bit stream.
-     * @param bitInputStream the bit stream to operate on
-     * @throws IOException as per java IO contract
-     */
-    void skip(BitInputStream bitInputStream) throws IOException;
-
-    /**
-     * Skip the next length objects in the bit stream.
-     * @param bitInputStream the bit stream to operate on
-     * @param length the number of objects to skip
-     *
-     * @throws IOException as per java IO contract
-     */
-    void skip(BitInputStream bitInputStream, int length) throws IOException;
-
-    /**
-     * Write an object into the bit stream
-     * @param bitOutputStream the output bit stream to write to
-     * @param object the object to write
-     * @return the number of bits written out
-     * @throws IOException as per java IO contract
-     */
-    long write(BitOutputStream bitOutputStream, T object) throws IOException;
-
-    /**
-     * Calculate the number of bits that the object would take in bit serialized form.
-     * @param object an object
-     * @return the number of bits
-     */
-    long numberOfBits(T object);
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayLenEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayLenEncoding.java
deleted file mode 100644
index 0c76a5b..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayLenEncoding.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class ByteArrayLenEncoding implements Encoding<byte[]> {
-    private final static EncodingID ID = EncodingID.BYTE_ARRAY_LEN;
-    private Encoding<Integer> lenEncoding;
-    private Encoding<byte[]> byteEncoding;
-
-    public ByteArrayLenEncoding() {
-    }
-
-    @Override
-    public EncodingID id() {
-        return ID;
-    }
-
-    public static EncodingParams toParam(final EncodingParams lenParams,
-                                         final EncodingParams byteParams) {
-        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        try {
-            byteArrayOutputStream.write((byte) lenParams.id.ordinal());
-            ITF8.writeUnsignedITF8(lenParams.params.length, byteArrayOutputStream);
-            byteArrayOutputStream.write(lenParams.params);
-
-            byteArrayOutputStream.write((byte) byteParams.id.ordinal());
-            ITF8.writeUnsignedITF8(byteParams.params.length, byteArrayOutputStream);
-            byteArrayOutputStream.write(byteParams.params);
-        } catch (final IOException e) {
-            throw new RuntimeException("It never happened. ");
-        }
-        return new EncodingParams(ID, byteArrayOutputStream.toByteArray());
-    }
-
-    public byte[] toByteArray() {
-        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        try {
-            byteArrayOutputStream.write((byte) lenEncoding.id().ordinal());
-            final byte[] lenBytes = lenEncoding.toByteArray();
-            ITF8.writeUnsignedITF8(lenBytes.length, byteArrayOutputStream);
-            byteArrayOutputStream.write(lenBytes);
-
-            byteArrayOutputStream.write((byte) byteEncoding.id().ordinal());
-            final byte[] byteBytes = byteEncoding.toByteArray();
-            ITF8.writeUnsignedITF8(byteBytes.length, byteArrayOutputStream);
-            byteArrayOutputStream.write(byteBytes);
-        } catch (final IOException e) {
-            throw new RuntimeException("It never happened. ");
-        }
-        return byteArrayOutputStream.toByteArray();
-    }
-
-    public void fromByteArray(final byte[] data) {
-        final ByteBuffer buffer = ByteBuffer.wrap(data);
-
-        final EncodingFactory encodingFactory = new EncodingFactory();
-
-        final EncodingID lenID = EncodingID.values()[buffer.get()];
-        lenEncoding = encodingFactory.createEncoding(DataSeriesType.INT, lenID);
-        int length = ITF8.readUnsignedITF8(buffer);
-        byte[] bytes = new byte[length];
-        buffer.get(bytes);
-        lenEncoding.fromByteArray(bytes);
-
-        final EncodingID byteID = EncodingID.values()[buffer.get()];
-        byteEncoding = encodingFactory.createEncoding(DataSeriesType.BYTE_ARRAY, byteID);
-        length = ITF8.readUnsignedITF8(buffer);
-        bytes = new byte[length];
-        buffer.get(bytes);
-        byteEncoding.fromByteArray(bytes);
-    }
-
-    @Override
-    public BitCodec<byte[]> buildCodec(final Map<Integer, InputStream> inputMap,
-                                       final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        return new ByteArrayLenCodec(
-                lenEncoding.buildCodec(inputMap, outputMap),
-                byteEncoding.buildCodec(inputMap, outputMap));
-    }
-
-    private static class ByteArrayLenCodec extends AbstractBitCodec<byte[]> {
-        private final BitCodec<Integer> lenCodec;
-        private final BitCodec<byte[]> byteCodec;
-
-        public ByteArrayLenCodec(final BitCodec<Integer> lenCodec,
-                                 final BitCodec<byte[]> byteCodec) {
-            super();
-            this.lenCodec = lenCodec;
-            this.byteCodec = byteCodec;
-        }
-
-        @Override
-        public byte[] read(final BitInputStream bitInputStream) throws IOException {
-            final int length = lenCodec.read(bitInputStream);
-            return byteCodec.read(bitInputStream, length);
-        }
-
-        @Override
-        public byte[] read(final BitInputStream bitInputStream, final int length) throws IOException {
-            throw new RuntimeException("Not implemented.");
-        }
-
-        @Override
-        public long write(final BitOutputStream bitOutputStream, final byte[] object)
-                throws IOException {
-            long length = lenCodec.write(bitOutputStream, object.length);
-            length += byteCodec.write(bitOutputStream, object);
-            return length;
-        }
-
-        @Override
-        public long numberOfBits(final byte[] object) {
-            return lenCodec.numberOfBits(object.length)
-                    + byteCodec.numberOfBits(object);
-        }
-
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayStopEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayStopEncoding.java
deleted file mode 100644
index c46d967..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayStopEncoding.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License inputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Map;
-
-public class ByteArrayStopEncoding implements Encoding<byte[]> {
-    private final static EncodingID ID = EncodingID.BYTE_ARRAY_STOP;
-    private byte stopByte = 0;
-    private int externalId;
-
-    public ByteArrayStopEncoding() {
-    }
-
-    @Override
-    public EncodingID id() {
-        return ID;
-    }
-
-    private ByteArrayStopEncoding(final byte stopByte, final int externalId) {
-        this.stopByte = stopByte;
-        this.externalId = externalId;
-    }
-
-    public static EncodingParams toParam(final byte stopByte, final int externalId) {
-        final ByteArrayStopEncoding e = new ByteArrayStopEncoding(stopByte,
-                externalId);
-        return new EncodingParams(ID, e.toByteArray());
-    }
-
-    public byte[] toByteArray() {
-        final ByteBuffer buf = ByteBuffer.allocate(1024);
-        buf.order(ByteOrder.LITTLE_ENDIAN);
-        buf.put(stopByte);
-        ITF8.writeUnsignedITF8(externalId, buf);
-
-        buf.flip();
-        final byte[] array = new byte[buf.limit()];
-        buf.get(array);
-
-        return array;
-    }
-
-    public void fromByteArray(final byte[] data) {
-        final ByteBuffer buf = ByteBuffer.wrap(data);
-        buf.order(ByteOrder.LITTLE_ENDIAN);
-        stopByte = buf.get();
-        externalId = ITF8.readUnsignedITF8(buf);
-    }
-
-    @Override
-    public BitCodec<byte[]> buildCodec(final Map<Integer, InputStream> inputMap,
-                                       final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        final InputStream is = inputMap == null ? null : inputMap.get(externalId);
-        final ExposedByteArrayOutputStream os = outputMap == null ? null : outputMap
-                .get(externalId);
-        return new ByteArrayStopCodec(stopByte, is, os);
-    }
-
-    public static class ByteArrayStopCodec extends AbstractBitCodec<byte[]> {
-
-        private final int stop;
-        private final InputStream inputStream;
-        private final OutputStream outputStream;
-        private final ByteArrayOutputStream readingBAOS = new ByteArrayOutputStream();
-        private int b;
-
-        public ByteArrayStopCodec(final byte stopByte, final InputStream inputStream, final OutputStream outputStream) {
-            this.stop = 0xFF & stopByte;
-            this.inputStream = inputStream;
-            this.outputStream = outputStream;
-        }
-
-        @Override
-        public byte[] read(final BitInputStream bitInputStream) throws IOException {
-            readingBAOS.reset();
-            while ((b = inputStream.read()) != -1 && b != stop)
-                readingBAOS.write(b);
-
-            return readingBAOS.toByteArray();
-        }
-
-        @Override
-        public byte[] read(final BitInputStream bitInputStream, final int length) throws IOException {
-            throw new RuntimeException("Not implemented.");
-        }
-
-        @Override
-        public long write(final BitOutputStream bitOutputStream, final byte[] object)
-                throws IOException {
-            outputStream.write(object);
-            outputStream.write(stop);
-            return object.length + 1;
-        }
-
-        @Override
-        public long numberOfBits(final byte[] object) {
-            return object.length + 1;
-        }
-
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/DataSeries.java b/src/main/java/htsjdk/samtools/cram/encoding/DataSeries.java
deleted file mode 100644
index de4fd5e..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/DataSeries.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.structure.EncodingKey;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * An annotation to denote a data series field in a java class.
- * Some data can be represented as a set of column (data series) where
- * each column is characterized by it's intention ({@link htsjdk.samtools.cram.structure.EncodingKey} for CRAM)
- * and it's data type, like {@link java.lang.Integer}or {@link java.lang.String}.
- * Annotating fields in a class with this annotation allows for automated discovery of such column (data series)
- * and attaching specific codec to serialise/deserialize data.
- */
- at Target(ElementType.FIELD)
- at Retention(RetentionPolicy.RUNTIME)
-public @interface DataSeries {
-    /**
-     * One of the pre-defined CRAM data series names
-     * @return CRAM data series name (key)
-     */
-    EncodingKey key();
-
-    /**
-     * Data type of the series.
-     * @return data type of the series
-     */
-    DataSeriesType type();
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesMap.java b/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesMap.java
deleted file mode 100644
index b16ab8d..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesMap.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
- at Target(ElementType.FIELD)
- at Retention(RetentionPolicy.RUNTIME)
-public @interface DataSeriesMap {
-    String name() default "TAG";
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesType.java b/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesType.java
deleted file mode 100644
index 6eecb7c..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesType.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-/**
- * Data series types known to CRAM.
- */
-public enum DataSeriesType {
-
-    /**
-     * A single signed byte (256 distinct values)
-     */
-    BYTE,
-    /**
-     * A signed integer ~4 billions of them.
-     */
-    INT,
-    /**
-     * A signed long value, 64 bits, too many to count.
-     */
-    LONG,
-    /**
-     * An array of bytes.
-     */
-    BYTE_ARRAY
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/Encoding.java b/src/main/java/htsjdk/samtools/cram/encoding/Encoding.java
deleted file mode 100644
index 1fc18df..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/Encoding.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.structure.EncodingID;
-
-import java.io.InputStream;
-import java.util.Map;
-
-/**
- * An interface to describe how a data series is encoded.
- * It also has methods to serialize/deserialize to/from byte array and a method to construct
- * a {@link htsjdk.samtools.cram.encoding.BitCodec} instance.
- *
- * @param <T> data series type
- */
-public interface Encoding<T> {
-
-    EncodingID id();
-
-    byte[] toByteArray();
-
-    void fromByteArray(byte[] data);
-
-    BitCodec<T> buildCodec(Map<Integer, InputStream> inputMap,
-                           Map<Integer, ExposedByteArrayOutputStream> outputMap);
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/EncodingFactory.java b/src/main/java/htsjdk/samtools/cram/encoding/EncodingFactory.java
deleted file mode 100644
index 258e148..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/EncodingFactory.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.encoding.huffman.codec.HuffmanByteEncoding;
-import htsjdk.samtools.cram.encoding.huffman.codec.HuffmanIntegerEncoding;
-import htsjdk.samtools.cram.structure.EncodingID;
-
-/**
- * A helper class to instantiate an appropriate {@link htsjdk.samtools.cram.encoding.Encoding}
- * for a given {@link htsjdk.samtools.cram.encoding.DataSeriesType} and
- * {@link htsjdk.samtools.cram.encoding.Encoding}.
- * Also useful to hide encoding implementations.
- */
- at SuppressWarnings("unchecked")
-public class EncodingFactory {
-
-    /**
-     * Create an encoding for the data series type and encoding id.
-     * @param valueType data type of the values to be produced/consumed by the encoding
-     * @param id encoding id used for data serialization
-     * @param <T> encoding object type, like Integer or String.
-     * @return a new encoding with the requested parameters
-     */
-    public <T> Encoding<T> createEncoding(final DataSeriesType valueType,
-                                          final EncodingID id) {
-        switch (valueType) {
-            case BYTE:
-                switch (id) {
-                    case EXTERNAL:
-                        return (Encoding<T>) new ExternalByteEncoding();
-                    case HUFFMAN:
-                        return (Encoding<T>) new HuffmanByteEncoding();
-                    case NULL:
-                        return new NullEncoding<T>();
-
-                    default:
-                        break;
-                }
-
-                break;
-
-            case INT:
-                switch (id) {
-                    case HUFFMAN:
-                        return (Encoding<T>) new HuffmanIntegerEncoding();
-                    case NULL:
-                        return new NullEncoding<T>();
-                    case EXTERNAL:
-                        return (Encoding<T>) new ExternalIntegerEncoding();
-                    case GOLOMB:
-                        return (Encoding<T>) new GolombIntegerEncoding();
-                    case GOLOMB_RICE:
-                        return (Encoding<T>) new GolombRiceIntegerEncoding();
-                    case BETA:
-                        return (Encoding<T>) new BetaIntegerEncoding();
-                    case GAMMA:
-                        return (Encoding<T>) new GammaIntegerEncoding();
-                    case SUBEXPONENTIAL:
-                        return (Encoding<T>) new SubexponentialIntegerEncoding();
-
-                    default:
-                        break;
-                }
-                break;
-
-            case LONG:
-                switch (id) {
-                    case NULL:
-                        return new NullEncoding<T>();
-                    case GOLOMB:
-                        return (Encoding<T>) new GolombLongEncoding();
-                    case EXTERNAL:
-                        return (Encoding<T>) new ExternalLongEncoding();
-
-                    default:
-                        break;
-                }
-                break;
-
-            case BYTE_ARRAY:
-                switch (id) {
-                    case NULL:
-                        return new NullEncoding<T>();
-                    case BYTE_ARRAY_LEN:
-                        return (Encoding<T>) new ByteArrayLenEncoding();
-                    case BYTE_ARRAY_STOP:
-                        return (Encoding<T>) new ByteArrayStopEncoding();
-                    case EXTERNAL:
-                        return (Encoding<T>) new ExternalByteArrayEncoding();
-
-                    default:
-                        break;
-                }
-                break;
-
-            default:
-                break;
-        }
-
-        return null;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayCodec.java
deleted file mode 100644
index 4ebad39..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayCodec.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License inputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-class ExternalByteArrayCodec extends AbstractBitCodec<byte[]> {
-    private final OutputStream outputStream;
-    private final InputStream inputStream;
-
-    public ExternalByteArrayCodec(final OutputStream outputStream, final InputStream inputStream) {
-        this.outputStream = outputStream;
-        this.inputStream = inputStream;
-    }
-
-    @Override
-    public byte[] read(final BitInputStream bitInputStream, final int length) throws IOException {
-        return InputStreamUtils.readFully(inputStream, length);
-    }
-
-    @Override
-    public void readInto(final BitInputStream bitInputStream, final byte[] array, final int offset,
-                         final int valueLen) throws IOException {
-        InputStreamUtils.readFully(inputStream, array, offset, valueLen);
-    }
-
-    @Override
-    public void skip(final BitInputStream bitInputStream) throws IOException {
-        //noinspection ResultOfMethodCallIgnored
-        inputStream.skip(1);
-    }
-
-    @Override
-    public void skip(final BitInputStream bitInputStream, final int length) throws IOException {
-        //noinspection ResultOfMethodCallIgnored
-        inputStream.skip(length);
-    }
-
-    @Override
-    public long write(final BitOutputStream bitOutputStream, final byte[] object) throws IOException {
-        outputStream.write(object);
-        return numberOfBits(object);
-    }
-
-    @Override
-    public long numberOfBits(final byte[] object) {
-        return object.length * 8;
-    }
-
-    @Override
-    public byte[] read(final BitInputStream bitInputStream) throws IOException {
-        throw new RuntimeException("Cannot read byte array of unknown length.");
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayEncoding.java
deleted file mode 100644
index 2fc707c..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayEncoding.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.util.Map;
-
-public class ExternalByteArrayEncoding implements Encoding<byte[]> {
-    private static final EncodingID encodingId = EncodingID.EXTERNAL;
-    private int contentId = -1;
-
-    public ExternalByteArrayEncoding() {
-    }
-
-    public static EncodingParams toParam(final int contentId) {
-        final ExternalByteArrayEncoding e = new ExternalByteArrayEncoding();
-        e.contentId = contentId;
-        return new EncodingParams(encodingId, e.toByteArray());
-    }
-
-    public byte[] toByteArray() {
-        return ITF8.writeUnsignedITF8(contentId);
-    }
-
-    public void fromByteArray(final byte[] data) {
-        contentId = ITF8.readUnsignedITF8(data);
-    }
-
-    @Override
-    public BitCodec<byte[]> buildCodec(final Map<Integer, InputStream> inputMap,
-                                       final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        final InputStream inputStream = inputMap == null ? null : inputMap.get(contentId);
-        final ExposedByteArrayOutputStream outputStream = outputMap == null ? null : outputMap
-                .get(contentId);
-        return new ExternalByteArrayCodec(outputStream, inputStream);
-    }
-
-    @Override
-    public EncodingID id() {
-        return encodingId;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteCodec.java
deleted file mode 100644
index b1c8529..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteCodec.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License inputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-
-class ExternalByteCodec extends AbstractBitCodec<Byte> {
-    private final OutputStream outputStream;
-    private final InputStream inputStream;
-
-    public ExternalByteCodec(final OutputStream outputStream, final InputStream inputStream) {
-        this.outputStream = outputStream;
-        this.inputStream = inputStream;
-    }
-
-    @Override
-    public Byte read(final BitInputStream bitInputStream) throws IOException {
-        return (byte) inputStream.read();
-    }
-
-    @Override
-    public long write(final BitOutputStream bitOutputStream, final Byte object) throws IOException {
-        outputStream.write(object);
-        return 8;
-    }
-
-    @Override
-    public long numberOfBits(final Byte object) {
-        return 8;
-    }
-
-    @Override
-    public Byte read(final BitInputStream bitInputStream, final int length) throws IOException {
-        throw new RuntimeException("Not implemented.");
-    }
-
-    @Override
-    public void readInto(final BitInputStream bitInputStream, final byte[] array, final int offset,
-                         final int valueLen) throws IOException {
-        InputStreamUtils.readFully(inputStream, array, offset, valueLen);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteEncoding.java
deleted file mode 100644
index 0fed720..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteEncoding.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.util.Map;
-
-public class ExternalByteEncoding implements Encoding<Byte> {
-    private static final EncodingID encodingId = EncodingID.EXTERNAL;
-    private int contentId = -1;
-
-    public ExternalByteEncoding() {
-    }
-
-    public static EncodingParams toParam(final int contentId) {
-        final ExternalByteEncoding externalByteEncoding = new ExternalByteEncoding();
-        externalByteEncoding.contentId = contentId;
-        return new EncodingParams(encodingId, externalByteEncoding.toByteArray());
-    }
-
-    public byte[] toByteArray() {
-        return ITF8.writeUnsignedITF8(contentId);
-    }
-
-    public void fromByteArray(final byte[] data) {
-        contentId = ITF8.readUnsignedITF8(data);
-    }
-
-    @Override
-    public BitCodec<Byte> buildCodec(final Map<Integer, InputStream> inputMap,
-                                     final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        final InputStream inputStream = inputMap == null ? null : inputMap.get(contentId);
-        final ExposedByteArrayOutputStream outputStream = outputMap == null ? null : outputMap.get(contentId);
-        return new ExternalByteCodec(outputStream, inputStream);
-    }
-
-    @Override
-    public EncodingID id() {
-        return encodingId;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalCompressor.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalCompressor.java
deleted file mode 100644
index 0987294..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalCompressor.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.encoding.rans.RANS.ORDER;
-import htsjdk.samtools.cram.io.ExternalCompression;
-import htsjdk.samtools.cram.structure.BlockCompressionMethod;
-
-import java.io.IOException;
-
-public abstract class ExternalCompressor {
-    private final BlockCompressionMethod method;
-
-    private ExternalCompressor(final BlockCompressionMethod method) {
-        this.method = method;
-    }
-
-    public BlockCompressionMethod getMethod() {
-        return method;
-    }
-
-    public abstract byte[] compress(byte[] data);
-
-    public static ExternalCompressor createRAW() {
-        return new ExternalCompressor(BlockCompressionMethod.RAW) {
-
-            @Override
-            public byte[] compress(final byte[] data) {
-                return data;
-            }
-        };
-    }
-
-    public static ExternalCompressor createGZIP() {
-        return new ExternalCompressor(BlockCompressionMethod.GZIP) {
-
-            @Override
-            public byte[] compress(final byte[] data) {
-                try {
-                    return ExternalCompression.gzip(data);
-                } catch (final IOException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        };
-    }
-
-    public static ExternalCompressor createLZMA() {
-        return new ExternalCompressor(BlockCompressionMethod.LZMA) {
-
-            @Override
-            public byte[] compress(final byte[] data) {
-                try {
-                    return ExternalCompression.xz(data);
-                } catch (final IOException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        };
-    }
-
-    public static ExternalCompressor createBZIP2() {
-        return new ExternalCompressor(BlockCompressionMethod.BZIP2) {
-
-            @Override
-            public byte[] compress(final byte[] data) {
-                try {
-                    return ExternalCompression.bzip2(data);
-                } catch (final IOException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        };
-
-    }
-
-    public static ExternalCompressor createRANS(final ORDER order) {
-        return new ExternalCompressor(BlockCompressionMethod.RANS) {
-
-            @Override
-            public byte[] compress(final byte[] data) {
-                return ExternalCompression.rans(data, order);
-            }
-        };
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerCodec.java
deleted file mode 100644
index d26b0db..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerCodec.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License inputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-
-class ExternalIntegerCodec extends AbstractBitCodec<Integer> {
-    private final OutputStream outputStream;
-    private final InputStream inputStream;
-    private final OutputStream nullOutputStream = new OutputStream() {
-
-        @Override
-        public void write(@SuppressWarnings("NullableProblems") final byte[] b) throws IOException {
-        }
-
-        @Override
-        public void write(final int b) throws IOException {
-        }
-
-        @Override
-        public void write(@SuppressWarnings("NullableProblems") final byte[] b, final int off, final int length) throws IOException {
-        }
-    };
-
-    public ExternalIntegerCodec(final OutputStream outputStream, final InputStream inputStream) {
-        this.outputStream = outputStream;
-        this.inputStream = inputStream;
-    }
-
-    @Override
-    public Integer read(final BitInputStream bitInputStream) throws IOException {
-        return ITF8.readUnsignedITF8(inputStream);
-    }
-
-    @Override
-    public long write(final BitOutputStream bitOutputStream, final Integer value) throws IOException {
-        return ITF8.writeUnsignedITF8(value, outputStream);
-    }
-
-    @Override
-    public long numberOfBits(final Integer value) {
-        try {
-            return ITF8.writeUnsignedITF8(value, nullOutputStream);
-        } catch (final IOException e) {
-            // this should never happened but still:
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
-        throw new RuntimeException("Not implemented.");
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerEncoding.java
deleted file mode 100644
index a7c5736..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerEncoding.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.util.Map;
-
-public class ExternalIntegerEncoding implements Encoding<Integer> {
-    private static final EncodingID encodingId = EncodingID.EXTERNAL;
-    private int contentId = -1;
-
-    public ExternalIntegerEncoding() {
-    }
-
-    public static EncodingParams toParam(final int contentId) {
-        final ExternalIntegerEncoding externalIntegerEncoding = new ExternalIntegerEncoding();
-        externalIntegerEncoding.contentId = contentId;
-        return new EncodingParams(encodingId, externalIntegerEncoding.toByteArray());
-    }
-
-    public byte[] toByteArray() {
-        return ITF8.writeUnsignedITF8(contentId);
-    }
-
-    public void fromByteArray(final byte[] data) {
-        contentId = ITF8.readUnsignedITF8(data);
-    }
-
-    @Override
-    public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
-                                        final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        final InputStream inputStream = inputMap == null ? null : inputMap.get(contentId);
-        final ExposedByteArrayOutputStream outputStream = outputMap == null ? null : outputMap.get(contentId);
-        return new ExternalIntegerCodec(outputStream, inputStream);
-    }
-
-    @Override
-    public EncodingID id() {
-        return encodingId;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongCodec.java
deleted file mode 100644
index 328f940..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongCodec.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License inputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-
-class ExternalLongCodec extends AbstractBitCodec<Long> {
-    private final OutputStream outputStream;
-    private final InputStream inputStream;
-
-    public ExternalLongCodec(final OutputStream outputStream, final InputStream inputStream) {
-        this.outputStream = outputStream;
-        this.inputStream = inputStream;
-    }
-
-    @Override
-    public Long read(final BitInputStream bitInputStream) throws IOException {
-        long result = 0;
-        for (int i = 0; i < 8; i++) {
-            result <<= 8;
-            result |= inputStream.read();
-        }
-        return result;
-    }
-
-    @Override
-    public long write(final BitOutputStream bitOutputStream, Long value) throws IOException {
-        for (int i = 0; i < 8; i++) {
-            outputStream.write((int) (value & 0xFF));
-            value >>>= 8;
-        }
-        return 64;
-    }
-
-    @Override
-    public long numberOfBits(final Long object) {
-        return 8;
-    }
-
-    @Override
-    public Long read(final BitInputStream bitInputStream, final int length) throws IOException {
-        throw new RuntimeException("Not implemented.");
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongEncoding.java
deleted file mode 100644
index 402cea8..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongEncoding.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.util.Map;
-
-public class ExternalLongEncoding implements Encoding<Long> {
-    private static final EncodingID encodingId = EncodingID.EXTERNAL;
-    private int contentId = -1;
-
-    public ExternalLongEncoding() {
-    }
-
-    public static EncodingParams toParam(final int contentId) {
-        final ExternalLongEncoding externalLongEncoding = new ExternalLongEncoding();
-        externalLongEncoding.contentId = contentId;
-        return new EncodingParams(encodingId, externalLongEncoding.toByteArray());
-    }
-
-    public byte[] toByteArray() {
-        return ITF8.writeUnsignedITF8(contentId);
-    }
-
-    public void fromByteArray(final byte[] data) {
-        contentId = ITF8.readUnsignedITF8(data);
-    }
-
-    @Override
-    public BitCodec<Long> buildCodec(final Map<Integer, InputStream> inputMap,
-                                     final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        final InputStream inputStream = inputMap == null ? null : inputMap.get(contentId);
-        final ExposedByteArrayOutputStream outputStream = outputMap == null ? null : outputMap.get(contentId);
-        return new ExternalLongCodec(outputStream, inputStream);
-    }
-
-    @Override
-    public EncodingID id() {
-        return encodingId;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerCodec.java
deleted file mode 100644
index 9b6cc7f..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerCodec.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-class GammaIntegerCodec extends AbstractBitCodec<Integer> {
-    private int offset = 0;
-
-    public GammaIntegerCodec(final int offset) {
-        this.offset = offset;
-    }
-
-    @Override
-    public final Integer read(final BitInputStream bitInputStream) throws IOException {
-        int length = 1;
-        final boolean lenCodingBit = false;
-        //noinspection ConstantConditions,PointlessBooleanExpression
-        while (bitInputStream.readBit() == lenCodingBit)
-            length++;
-        final int readBits = bitInputStream.readBits(length - 1);
-        final int value = readBits | 1 << (length - 1);
-        return value - offset;
-    }
-
-    @Override
-    public final long write(final BitOutputStream bitOutputStream, final Integer value) throws IOException {
-        if (value + offset < 1)
-            throw new IllegalArgumentException("Gamma codec handles only positive values: " + value);
-
-        final long newValue = value + offset;
-        final int betaCodeLength = 1 + (int) (Math.log(newValue) / Math.log(2));
-        if (betaCodeLength > 1)
-            bitOutputStream.write(0L, betaCodeLength - 1);
-
-        bitOutputStream.write(newValue, betaCodeLength);
-        return betaCodeLength * 2 - 1;
-    }
-
-    @Override
-    public final long numberOfBits(final Integer value) {
-        final long newValue = value + offset;
-        if (newValue < 1)
-            throw new RuntimeException("Invalid valid: " + newValue);
-        final int betaCodeLength = 1 + (int) (Math.log(newValue) / Math.log(2));
-        return betaCodeLength * 2 - 1;
-    }
-
-    @Override
-    public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
-        throw new RuntimeException("Not implemented.");
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerEncoding.java
deleted file mode 100644
index 00c38a2..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerEncoding.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class GammaIntegerEncoding implements Encoding<Integer> {
-    private static final EncodingID ENCODING_ID = EncodingID.GAMMA;
-    private int offset;
-
-    public GammaIntegerEncoding() {
-        this(0);
-    }
-
-    public GammaIntegerEncoding(final int offset) {
-        this.offset = offset;
-    }
-
-    @Override
-    public EncodingID id() {
-        return ENCODING_ID;
-    }
-
-    public static EncodingParams toParam(final int offset) {
-        final GammaIntegerEncoding gammaIntegerEncoding = new GammaIntegerEncoding();
-        gammaIntegerEncoding.offset = offset;
-        return new EncodingParams(ENCODING_ID, gammaIntegerEncoding.toByteArray());
-    }
-
-    @Override
-    public byte[] toByteArray() {
-        final ByteBuffer buffer = ByteBuffer.allocate(10);
-        ITF8.writeUnsignedITF8(offset, buffer);
-        buffer.flip();
-        final byte[] array = new byte[buffer.limit()];
-        buffer.get(array);
-        return array;
-    }
-
-    @Override
-    public void fromByteArray(final byte[] data) {
-        offset = ITF8.readUnsignedITF8(data);
-    }
-
-    @Override
-    public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
-                                        final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        return new GammaIntegerCodec(offset);
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerCodec.java
deleted file mode 100644
index 1a15efa..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerCodec.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class GolombIntegerCodec extends AbstractBitCodec<Integer> {
-    private int m;
-    private boolean quotientBit = true;
-    private int offset = 0;
-
-    public GolombIntegerCodec(final int m, final Integer offset) {
-        if (m < 2)
-            throw new IllegalArgumentException(
-                    "M parameter must be at least 2.");
-        this.m = m;
-        this.quotientBit = true;
-        this.offset = offset;
-    }
-
-    @Override
-    public final Integer read(final BitInputStream bitInputStream) throws IOException {
-        int quotient = 0;
-        while (bitInputStream.readBit() == quotientBit)
-            quotient++;
-
-        final int ceiling = (int) (Math.log(m) / Math.log(2) + 1);
-        int reminder = bitInputStream.readBits(ceiling - 1);
-        if (reminder >= Math.pow(2, ceiling) - m) {
-            reminder <<= 1;
-            reminder |= bitInputStream.readBits(1);
-            reminder -= Math.pow(2, ceiling) - m;
-        }
-
-        return (quotient * m + reminder) - offset;
-    }
-
-    @Override
-    public final long write(final BitOutputStream bitOutputStream, final Integer value)
-            throws IOException {
-        final int newValue = value + offset;
-        final int quotient = newValue / m;
-        final int reminder = newValue % m;
-        final int ceiling = (int) (Math.log(m) / Math.log(2) + 1);
-
-        int length = quotient + 1;
-        bitOutputStream.write(quotientBit, quotient);
-        bitOutputStream.write(!quotientBit);
-
-        if (reminder < Math.pow(2, ceiling) - m) {
-            bitOutputStream.write(reminder, ceiling - 1);
-            length += ceiling - 1;
-        } else {
-            bitOutputStream.write((int) (reminder + Math.pow(2, ceiling) - m),
-                    ceiling);
-            length += ceiling;
-        }
-        return length;
-    }
-
-    @Override
-    public final long numberOfBits(final Integer value) {
-        final int newValue = value + offset;
-        final int quotient = newValue / m;
-        final int reminder = newValue % m;
-        final int ceiling = (int) (Math.log(m) / Math.log(2) + 1);
-        int l = quotient + 1;
-
-        if (reminder < Math.pow(2, ceiling) - m)
-            l += ceiling - 1;
-        else
-            l += ceiling;
-
-        return l;
-    }
-
-    @Override
-    public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
-        throw new RuntimeException("Multi-value read method not defined.");
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerEncoding.java
deleted file mode 100644
index 2332b5e..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerEncoding.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class GolombIntegerEncoding implements Encoding<Integer> {
-    private static final EncodingID ENCODING_ID = EncodingID.GOLOMB;
-    private int m;
-    private int offset;
-
-    public GolombIntegerEncoding() {
-    }
-
-    @Override
-    public EncodingID id() {
-        return ENCODING_ID;
-    }
-
-    public static EncodingParams toParam(final int m) {
-        final GolombIntegerEncoding golombIntegerEncoding = new GolombIntegerEncoding();
-        golombIntegerEncoding.m = m;
-        golombIntegerEncoding.offset = 0;
-        return new EncodingParams(ENCODING_ID, golombIntegerEncoding.toByteArray());
-    }
-
-    public static EncodingParams toParam(final int m, final int offset) {
-        final GolombIntegerEncoding e = new GolombIntegerEncoding();
-        e.m = m;
-        e.offset = offset;
-        return new EncodingParams(ENCODING_ID, e.toByteArray());
-    }
-
-    @Override
-    public byte[] toByteArray() {
-        final ByteBuffer buffer = ByteBuffer.allocate(10);
-        ITF8.writeUnsignedITF8(offset, buffer);
-        ITF8.writeUnsignedITF8(m, buffer);
-        buffer.flip();
-        final byte[] array = new byte[buffer.limit()];
-        buffer.get(array);
-        return array;
-    }
-
-    @Override
-    public void fromByteArray(final byte[] data) {
-        final ByteBuffer buffer = ByteBuffer.wrap(data);
-        offset = ITF8.readUnsignedITF8(buffer);
-        m = ITF8.readUnsignedITF8(buffer);
-    }
-
-    @Override
-    public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
-                                        final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        return new GolombIntegerCodec(m, offset);
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombLongCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombLongCodec.java
deleted file mode 100644
index ef0c12c..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombLongCodec.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class GolombLongCodec extends AbstractBitCodec<Long> {
-    private int m;
-    private boolean quotientBit = true;
-    private long offset = 0L;
-
-    public GolombLongCodec(final long offset, final int m) {
-        if (m < 2)
-            throw new IllegalArgumentException(
-                    "M parameter must be at least 2.");
-        this.m = m;
-        this.quotientBit = true;
-        this.offset = offset;
-    }
-
-    @Override
-    public final Long read(final BitInputStream bitInputStream) throws IOException {
-        long quotient = 0L;
-        while (bitInputStream.readBit() == quotientBit)
-            quotient++;
-
-        final long ceiling = (long) (Math.log(m) / Math.log(2) + 1);
-        long reminder = bitInputStream.readBits((int) (ceiling - 1));
-        if (reminder >= Math.pow(2, ceiling) - m) {
-            reminder <<= 1;
-            reminder |= bitInputStream.readBits(1);
-            reminder -= Math.pow(2, ceiling) - m;
-        }
-
-        return (quotient * m + reminder) - offset;
-    }
-
-    @Override
-    public final long write(final BitOutputStream bitOutputStream, final Long value)
-            throws IOException {
-        final long newValue = value + offset;
-        final long quotient = newValue / m;
-        final long reminder = newValue % m;
-        final long ceiling = (long) (Math.log(m) / Math.log(2) + 1);
-
-        long length = quotient + 1;
-        bitOutputStream.write(quotientBit, quotient);
-        bitOutputStream.write(!quotientBit);
-
-        if (reminder < Math.pow(2, ceiling) - m) {
-            bitOutputStream.write(reminder, (int) ceiling - 1);
-            length += ceiling - 1;
-        } else {
-            bitOutputStream.write((int) (reminder + Math.pow(2, ceiling) - m),
-                    (int) ceiling);
-            length += ceiling;
-        }
-        return length;
-    }
-
-    @Override
-    public final long numberOfBits(final Long value) {
-        final long newValue = value + offset;
-        final long quotient = newValue / m;
-        final long reminder = newValue % m;
-        final long ceiling = (long) (Math.log(m) / Math.log(2) + 1);
-        long l = quotient + 1;
-
-        if (reminder < Math.pow(2, ceiling) - m)
-            l += ceiling - 1;
-        else
-            l += ceiling;
-
-        return l;
-    }
-
-    @Override
-    public Long read(final BitInputStream bitInputStream, final int length) throws IOException {
-        throw new RuntimeException("Multi-value read method not defined.");
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombLongEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombLongEncoding.java
deleted file mode 100644
index eabec1b..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombLongEncoding.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class GolombLongEncoding implements Encoding<Long> {
-    private static final EncodingID ENCODING_ID = EncodingID.GOLOMB;
-    private int m;
-    private int offset;
-
-    public GolombLongEncoding() {
-    }
-
-    @Override
-    public EncodingID id() {
-        return ENCODING_ID;
-    }
-
-    public static EncodingParams toParam(final int offset, final int m) {
-        final GolombLongEncoding golombLongEncoding = new GolombLongEncoding();
-        golombLongEncoding.offset = offset;
-        golombLongEncoding.m = m;
-        return new EncodingParams(ENCODING_ID, golombLongEncoding.toByteArray());
-    }
-
-    @Override
-    public byte[] toByteArray() {
-        final ByteBuffer buffer = ByteBuffer.allocate(10);
-        ITF8.writeUnsignedITF8(offset, buffer);
-        ITF8.writeUnsignedITF8(m, buffer);
-        buffer.flip();
-        final byte[] array = new byte[buffer.limit()];
-        buffer.get(array);
-        return array;
-    }
-
-    @Override
-    public void fromByteArray(final byte[] data) {
-        final ByteBuffer buffer = ByteBuffer.wrap(data);
-        offset = ITF8.readUnsignedITF8(buffer);
-        m = ITF8.readUnsignedITF8(buffer);
-    }
-
-    @Override
-    public BitCodec<Long> buildCodec(final Map<Integer, InputStream> inputMap,
-                                     final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        return new GolombLongCodec(offset, m);
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerCodec.java
deleted file mode 100644
index e5962a1..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerCodec.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class GolombRiceIntegerCodec extends AbstractBitCodec<Integer> {
-    private final int m;
-    private final int log2m;
-    private final long mask;
-    private boolean quotientBit = false;
-    private int offset = 0;
-
-    public GolombRiceIntegerCodec(final int offset, final int log2m) {
-        this.log2m = log2m;
-        m = 1 << log2m;
-        this.quotientBit = true;
-        this.offset = offset;
-        mask = ~(~0 << log2m);
-    }
-
-    public final Integer read(final BitInputStream bitInputStream) throws IOException {
-
-        int unary = 0;
-        while (bitInputStream.readBit() == quotientBit)
-            unary++;
-
-        final int remainder = bitInputStream.readBits(log2m);
-
-        final int result = unary * m + remainder;
-        return result - offset;
-    }
-
-    @Override
-    public final long write(final BitOutputStream bitOutputStream, final Integer value) throws IOException {
-        final long newValue = value + offset;
-        final long quotient = newValue >>> log2m;
-        if (quotient > 0x7fffffffL)
-            for (long i = 0; i < quotient; i++)
-                bitOutputStream.write(quotientBit);
-
-        else if (quotient > 0) {
-            final int qi = (int) quotient;
-            for (int i = 0; i < qi; i++)
-                bitOutputStream.write(quotientBit);
-        }
-        bitOutputStream.write(!quotientBit);
-        final long remainder = newValue & mask;
-        long reminderMask = 1 << (log2m - 1);
-        for (int i = log2m - 1; i >= 0; i--) {
-            final long b = remainder & reminderMask;
-            bitOutputStream.write(b != 0L);
-            reminderMask >>>= 1;
-        }
-        return quotient + 1 + log2m;
-    }
-
-    @Override
-    public final long numberOfBits(final Integer value) {
-        return (value + offset) / m + 1 + log2m;
-    }
-
-    @Override
-    public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
-        throw new RuntimeException("Not implemented.");
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerEncoding.java
deleted file mode 100644
index 8f8d27b..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerEncoding.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class GolombRiceIntegerEncoding implements Encoding<Integer> {
-    private static final EncodingID ENCODING_ID = EncodingID.GOLOMB_RICE;
-    private int offset;
-    private int m;
-
-    public GolombRiceIntegerEncoding() {
-    }
-
-    @Override
-    public EncodingID id() {
-        return ENCODING_ID;
-    }
-
-    public static EncodingParams toParam(final int offset, final int m) {
-        final GolombRiceIntegerEncoding golombRiceIntegerEncoding = new GolombRiceIntegerEncoding();
-        golombRiceIntegerEncoding.offset = offset;
-        golombRiceIntegerEncoding.m = m;
-        return new EncodingParams(ENCODING_ID, golombRiceIntegerEncoding.toByteArray());
-    }
-
-    @Override
-    public byte[] toByteArray() {
-        final ByteBuffer buffer = ByteBuffer.allocate(10);
-        ITF8.writeUnsignedITF8(offset, buffer);
-        ITF8.writeUnsignedITF8(m, buffer);
-        buffer.flip();
-        final byte[] array = new byte[buffer.limit()];
-        buffer.get(array);
-        return array;
-    }
-
-    @Override
-    public void fromByteArray(final byte[] data) {
-        final ByteBuffer buffer = ByteBuffer.wrap(data);
-        offset = ITF8.readUnsignedITF8(buffer);
-        m = ITF8.readUnsignedITF8(buffer);
-    }
-
-    @Override
-    public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
-                                        final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        return new GolombRiceIntegerCodec(offset, m);
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/NullCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/NullCodec.java
deleted file mode 100644
index 6f1038c..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/NullCodec.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class NullCodec<T> extends AbstractBitCodec<T> {
-    private final T defaultValue = null;
-
-    public NullCodec() {
-    }
-
-    @Override
-    public T read(final BitInputStream bitInputStream) throws IOException {
-        return defaultValue;
-    }
-
-    @Override
-    public T read(final BitInputStream bitInputStream, final int length) throws IOException {
-        return defaultValue;
-    }
-
-    @Override
-    public long write(final BitOutputStream bitOutputStream, final T object) throws IOException {
-        return 0;
-    }
-
-    @Override
-    public long numberOfBits(final T object) {
-        return 0;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/NullEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/NullEncoding.java
deleted file mode 100644
index 9af54bd..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/NullEncoding.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.util.Map;
-
-public class NullEncoding<T> implements Encoding<T> {
-    private static final EncodingID ENCODING_ID = EncodingID.NULL;
-
-    public NullEncoding() {
-    }
-
-    @Override
-    public EncodingID id() {
-        return ENCODING_ID;
-    }
-
-    public static EncodingParams toParam() {
-        return new EncodingParams(ENCODING_ID, new NullEncoding().toByteArray());
-    }
-
-    @Override
-    public byte[] toByteArray() {
-        return new byte[]{};
-    }
-
-    @Override
-    public void fromByteArray(final byte[] data) {
-    }
-
-    @Override
-    public BitCodec<T> buildCodec(final Map<Integer, InputStream> inputMap,
-                                  final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        return new NullCodec<T>();
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerCodec.java
deleted file mode 100644
index 54dc809..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerCodec.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class SubexponentialIntegerCodec extends AbstractBitCodec<Integer> {
-    private int offset = 0;
-    private int k = 2;
-    private boolean unaryBit = true;
-
-    SubexponentialIntegerCodec(final int offset, final int k) {
-        this.offset = offset;
-        this.k = k;
-        this.unaryBit = true;
-    }
-
-    @Override
-    public final Integer read(final BitInputStream bitInputStream) throws IOException {
-        int u = 0;
-        while (bitInputStream.readBit() == unaryBit)
-            u++;
-
-        final int b;
-        final int n;
-        if (u == 0) {
-            b = k;
-            n = bitInputStream.readBits(b);
-        } else {
-            b = u + k - 1;
-            n = (1 << b) | bitInputStream.readBits(b);
-        }
-
-        return n - offset;
-    }
-
-    @Override
-    public final long write(final BitOutputStream bitOutputStream, final Integer value) throws IOException {
-        if (value + offset < 0)
-            throw new IllegalArgumentException("Value is less then offset: " + value);
-
-        final long newValue = value + offset;
-        final int b;
-        final int u;
-        if (newValue < (1L << k)) {
-            b = k;
-            u = 0;
-        } else {
-            b = (int) (Math.log(newValue) / Math.log(2));
-            u = b - k + 1;
-        }
-
-        bitOutputStream.write(unaryBit, u);
-        bitOutputStream.write(!unaryBit);
-
-        bitOutputStream.write(newValue, b);
-        return u + 1 + b;
-    }
-
-    @Override
-    public final long numberOfBits(final Integer value) {
-        final long newValue = value + offset;
-        final long b;
-        final long u;
-        if (newValue < (1L << k)) {
-            b = k;
-            u = 0;
-        } else {
-            b = (long) Math.floor(Math.log(newValue) / Math.log(2));
-            u = b - k + 1;
-        }
-        return u + 1 + b;
-    }
-
-    @Override
-    public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
-        throw new RuntimeException("Not implemented.");
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerEncoding.java
deleted file mode 100644
index 03911b6..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerEncoding.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class SubexponentialIntegerEncoding implements Encoding<Integer> {
-    private static final EncodingID ENCODING_ID = EncodingID.SUBEXPONENTIAL;
-    private int offset;
-    private int k;
-
-    public SubexponentialIntegerEncoding() {
-    }
-
-    public SubexponentialIntegerEncoding(final int offset, final int k) {
-        this.offset = offset;
-        this.k = k;
-    }
-
-    @Override
-    public EncodingID id() {
-        return ENCODING_ID;
-    }
-
-    public static EncodingParams toParam(final int offset, final int k) {
-        final SubexponentialIntegerEncoding subexponentialIntegerEncoding = new SubexponentialIntegerEncoding();
-        subexponentialIntegerEncoding.offset = offset;
-        subexponentialIntegerEncoding.k = k;
-        return new EncodingParams(ENCODING_ID, subexponentialIntegerEncoding.toByteArray());
-    }
-
-    @Override
-    public byte[] toByteArray() {
-        final ByteBuffer buffer = ByteBuffer.allocate(10);
-        ITF8.writeUnsignedITF8(offset, buffer);
-        ITF8.writeUnsignedITF8(k, buffer);
-        buffer.flip();
-        final byte[] bytes = new byte[buffer.limit()];
-        buffer.get(bytes);
-        return bytes;
-    }
-
-    @Override
-    public void fromByteArray(final byte[] data) {
-        final ByteBuffer buffer = ByteBuffer.wrap(data);
-        offset = ITF8.readUnsignedITF8(buffer);
-        k = ITF8.readUnsignedITF8(buffer);
-    }
-
-    @Override
-    public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
-                                        final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        return new SubexponentialIntegerCodec(offset, k);
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanCode.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanCode.java
deleted file mode 100644
index cbb855f..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanCode.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class HuffmanCode {
-
-    public static <T> HuffmanTree<T> buildTree(final int[] charFrequencies, final T[] values) {
-        final LinkedList<HuffmanTree<T>> list = new LinkedList<HuffmanTree<T>>();
-        for (int i = 0; i < charFrequencies.length; i++)
-            if (charFrequencies[i] > 0)
-                list.add(new HuffmanLeaf<T>(charFrequencies[i], values[i]));
-
-        final Comparator<HuffmanTree<T>> comparator = new Comparator<HuffmanTree<T>>() {
-
-            @Override
-            public int compare(final HuffmanTree<T> o1, final HuffmanTree<T> o2) {
-                return o1.frequency - o2.frequency;
-            }
-        };
-
-        while (list.size() > 1) {
-            Collections.sort(list, comparator);
-            // dumpList(list) ;
-            final HuffmanTree<T> left = list.remove();
-            final HuffmanTree<T> right = list.remove();
-            list.add(new HuffmanNode<T>(left, right));
-        }
-        return list.isEmpty() ? null : list.remove();
-    }
-
-    public static <T> void getValuesAndBitLengths(final List<T> values,
-                                                  final List<Integer> lens, final HuffmanTree<T> tree) {
-        final TreeMap<T, HuffmanBitCode<T>> codes = new TreeMap<T, HuffmanBitCode<T>>();
-        getBitCode(tree, new HuffmanBitCode<T>(), codes);
-
-        for (final T value : codes.keySet()) {
-            final HuffmanBitCode<T> code = codes.get(value);
-            values.add(value);
-            lens.add(code.bitLength);
-        }
-    }
-
-    private static class HuffmanBitCode<T> {
-        long bitCode;
-        int bitLength;
-    }
-
-    private static <T> void getBitCode(final HuffmanTree<T> tree,
-                                       final HuffmanBitCode<T> code, final Map<T, HuffmanBitCode<T>> codes) {
-        if (tree instanceof HuffmanLeaf) {
-            final HuffmanLeaf<T> leaf = (HuffmanLeaf<T>) tree;
-            final HuffmanBitCode<T> readyCode = new HuffmanBitCode<T>();
-            readyCode.bitCode = code.bitCode;
-            readyCode.bitLength = code.bitLength;
-            codes.put(leaf.value, readyCode);
-
-        } else if (tree instanceof HuffmanNode) {
-            final HuffmanNode<T> node = (HuffmanNode<T>) tree;
-
-            // traverse left
-            code.bitCode = code.bitCode << 1;
-            code.bitLength++;
-
-            getBitCode(node.left, code, codes);
-            code.bitCode = code.bitCode >>> 1;
-            code.bitLength--;
-
-            // traverse right
-            code.bitCode = code.bitCode << 1 | 1;
-            code.bitLength++;
-
-            getBitCode(node.right, code, codes);
-            code.bitCode = code.bitCode >>> 1;
-            code.bitLength--;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanLeaf.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanLeaf.java
deleted file mode 100644
index 81b3f56..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanLeaf.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman;
-
-class HuffmanLeaf<T> extends HuffmanTree<T> {
-    // user object, attached to the leaf:
-    public final T value;
-
-    public HuffmanLeaf(final int freq, final T val) {
-        super(freq);
-        value = val;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanNode.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanNode.java
deleted file mode 100644
index 2411c4a..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanNode.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman;
-
-class HuffmanNode<T> extends HuffmanTree<T> {
-    public final HuffmanTree<T> left, right;
-
-    public HuffmanNode(final HuffmanTree<T> left, final HuffmanTree<T> right) {
-        super(left.frequency + right.frequency);
-        this.left = left;
-        this.right = right;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanTree.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanTree.java
deleted file mode 100644
index 43500c4..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanTree.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman;
-
-public abstract class HuffmanTree<T> implements Comparable<HuffmanTree<T>> {
-    public final int frequency;
-
-    HuffmanTree(final int freq) {
-        frequency = freq;
-    }
-
-    public int compareTo(@SuppressWarnings("NullableProblems") final HuffmanTree<T> tree) {
-        return frequency - tree.frequency;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanByteCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanByteCodec.java
deleted file mode 100644
index 83b001c..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanByteCodec.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.encoding.AbstractBitCodec;
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-class CanonicalHuffmanByteCodec extends AbstractBitCodec<Byte> {
-    private final HuffmanByteHelper helper;
-
-    /*
-     * values[]: the alphabet (provided as Integers) bitLengths[]: the number of
-     * bits of symbol's huffman code
-     */
-    public CanonicalHuffmanByteCodec(final byte[] values, final int[] bitLengths) {
-        helper = new HuffmanByteHelper(values, bitLengths);
-    }
-
-    @Override
-    public Byte read(final BitInputStream bitInputStream) throws IOException {
-        return helper.read(bitInputStream);
-    }
-
-    @Override
-    public long write(final BitOutputStream bitOutputStream, final Byte object) throws IOException {
-        return helper.write(bitOutputStream, object);
-    }
-
-    @Override
-    public long numberOfBits(final Byte object) {
-        final HuffmanBitCode bitCode;
-        try {
-            //noinspection SuspiciousMethodCalls
-            bitCode = helper.codes.get(object);
-            return bitCode.bitLength;
-        } catch (final NullPointerException e) {
-            throw new RuntimeException("Value " + object + " not found.", e);
-        }
-    }
-
-    @Override
-    public Byte read(final BitInputStream bitInputStream, final int length) throws IOException {
-        throw new RuntimeException("Not implemented");
-    }
-
-    @Override
-    public void readInto(final BitInputStream bitInputStream, final byte[] array, final int offset,
-                         final int valueLen) throws IOException {
-        for (int i = 0; i < valueLen; i++)
-            array[offset + i] = helper.read(bitInputStream);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanIntegerCodec.java
deleted file mode 100644
index 96dfc78..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanIntegerCodec.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.encoding.AbstractBitCodec;
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class CanonicalHuffmanIntegerCodec extends AbstractBitCodec<Integer> {
-    private final HuffmanIntHelper helper;
-
-    /*
-     * values[]: the alphabet (provided as Integers) bitLengths[]: the number of
-     * bits of symbol's huffman code
-     */
-    public CanonicalHuffmanIntegerCodec(final int[] values, final int[] bitLengths) {
-        helper = new HuffmanIntHelper(values, bitLengths);
-    }
-
-    @Override
-    public Integer read(final BitInputStream bitInputStream) throws IOException {
-        return helper.read(bitInputStream);
-    }
-
-    @Override
-    public long write(final BitOutputStream bitOutputStream, final Integer object) throws IOException {
-        return helper.write(bitOutputStream, object);
-    }
-
-    @Override
-    public long numberOfBits(final Integer object) {
-        final HuffmanBitCode bitCode;
-        bitCode = helper.codes.get(object);
-        return bitCode.bitLength;
-    }
-
-    @Override
-    public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
-        throw new RuntimeException("Not implemented");
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanBitCode.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanBitCode.java
deleted file mode 100644
index 7d4c0e0..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanBitCode.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-class HuffmanBitCode {
-    int bitCode;
-    int bitLength;
-    int value;
-
-    @Override
-    public String toString() {
-        return value + ":\t" + Integer.toBinaryString(bitCode).substring(32 - bitLength) + " " + bitCode;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteEncoding.java
deleted file mode 100644
index 64a6729..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteEncoding.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.encoding.BitCodec;
-import htsjdk.samtools.cram.encoding.Encoding;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class HuffmanByteEncoding implements Encoding<Byte> {
-    private static final EncodingID ENCODING_ID = EncodingID.HUFFMAN;
-    private int[] bitLengths;
-    private byte[] values;
-    private ByteBuffer buf = ByteBuffer.allocate(1024);
-
-    public HuffmanByteEncoding() {
-    }
-
-    @Override
-    public EncodingID id() {
-        return ENCODING_ID;
-    }
-
-    @Override
-    public byte[] toByteArray() {
-        buf.clear();
-        if (buf.capacity() < values.length * 8)
-            buf = ByteBuffer.allocate(values.length * 8);
-
-        ITF8.writeUnsignedITF8(values.length, buf);
-        for (final byte value : values)
-            buf.put(value);
-
-        ITF8.writeUnsignedITF8(bitLengths.length, buf);
-        for (final int value : bitLengths)
-            ITF8.writeUnsignedITF8(value, buf);
-
-        buf.flip();
-        final byte[] array = new byte[buf.limit()];
-        buf.get(array);
-        return array;
-    }
-
-    @Override
-    public void fromByteArray(final byte[] data) {
-        final ByteBuffer buf = ByteBuffer.wrap(data);
-        int size = ITF8.readUnsignedITF8(buf);
-        values = new byte[size];
-        buf.get(values);
-
-        size = ITF8.readUnsignedITF8(buf);
-        bitLengths = new int[size];
-        for (int i = 0; i < size; i++)
-            bitLengths[i] = ITF8.readUnsignedITF8(buf);
-    }
-
-    @Override
-    public BitCodec<Byte> buildCodec(final Map<Integer, InputStream> inputMap,
-                                     final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        return new CanonicalHuffmanByteCodec(values, bitLengths);
-    }
-
-    public static EncodingParams toParam(final byte[] bfValues, final int[] bfBitLens) {
-        final HuffmanByteEncoding e = new HuffmanByteEncoding();
-        e.values = bfValues;
-        e.bitLengths = bfBitLens;
-        return new EncodingParams(ENCODING_ID, e.toByteArray());
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteHelper.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteHelper.java
deleted file mode 100644
index af62c5e..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteHelper.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-class HuffmanByteHelper {
-    TreeMap<Integer, HuffmanBitCode> codes;
-
-    private final int[] values;
-    private final int[] bitLengths;
-    private TreeMap<Integer, SortedSet<Integer>> codeBook;
-
-    private final HuffmanBitCode[] sortedCodes;
-    private final int[] sortedValuesByBitCode;
-    private final int[] sortedBitLensByBitCode;
-    private final int[] bitCodeToValue;
-    private final HuffmanBitCode[] valueToCode;
-
-    HuffmanByteHelper(final byte[] values, final int[] bitLengths) {
-        this.values = new int[values.length];
-        for (int i = 0; i < values.length; i++)
-            this.values[i] = 0xFF & values[i];
-
-        this.bitLengths = bitLengths;
-
-        buildCodeBook();
-        buildCodes();
-
-        final ArrayList<HuffmanBitCode> list = new ArrayList<HuffmanBitCode>(
-                codes.size());
-        list.addAll(codes.values());
-        Collections.sort(list, bitCodeComparator);
-        sortedCodes = list.toArray(new HuffmanBitCode[list
-                .size()]);
-
-        final byte[] sortedValues = Arrays.copyOf(values, values.length);
-        Arrays.sort(sortedValues);
-
-        sortedValuesByBitCode = new int[sortedCodes.length];
-        sortedBitLensByBitCode = new int[sortedCodes.length];
-        int maxBitCode = 0;
-        for (int i = 0; i < sortedCodes.length; i++) {
-            sortedValuesByBitCode[i] = sortedCodes[i].value;
-            sortedBitLensByBitCode[i] = sortedCodes[i].bitLength;
-            if (maxBitCode < sortedCodes[i].bitCode)
-                maxBitCode = sortedCodes[i].bitCode;
-        }
-
-        bitCodeToValue = new int[maxBitCode + 1];
-        Arrays.fill(bitCodeToValue, -1);
-        for (int i = 0; i < sortedCodes.length; i++) {
-            bitCodeToValue[sortedCodes[i].bitCode] = i;
-        }
-
-        valueToCode = new HuffmanBitCode[255];
-        Arrays.fill(valueToCode, null);
-        for (final HuffmanBitCode code : sortedCodes) {
-            valueToCode[code.value] = code;
-        }
-    }
-
-    private void buildCodeBook() {
-        codeBook = new TreeMap<Integer, SortedSet<Integer>>();
-        for (int i = 0; i < values.length; i++) {
-            if (codeBook.containsKey(bitLengths[i]))
-                codeBook.get(bitLengths[i]).add(values[i]);
-            else {
-                final TreeSet<Integer> entry = new TreeSet<Integer>();
-                entry.add(values[i]);
-                codeBook.put(bitLengths[i], entry);
-            }
-        }
-    }
-
-    private void buildCodes() {
-        codes = new TreeMap<Integer, HuffmanBitCode>();
-        int codeLength = 0, codeValue = -1;
-        for (final Object key : codeBook.keySet()) { // Iterate over code lengths
-
-            @SuppressWarnings("SuspiciousMethodCalls") final SortedSet<Integer> get = codeBook.get(key);
-            final int intKey = Integer.parseInt(key.toString());
-            for (final Integer entry : get) { // Iterate over symbols
-                final HuffmanBitCode code = new HuffmanBitCode();
-                code.bitLength = intKey; // given: bit length
-                code.value = entry; // given: symbol
-
-                codeValue++; // increment bit value by 1
-                final int delta = intKey - codeLength; // new length?
-                codeValue = codeValue << delta; // pad with 0's
-                code.bitCode = codeValue; // calculated: huffman code
-                codeLength += delta; // adjust current code length
-
-                if (NumberOfSetBits(codeValue) > intKey)
-                    throw new IllegalArgumentException("Symbol out of range");
-
-                codes.put(entry, code); // Store HuffmanBitCode
-
-            }
-
-        }
-    }
-
-    final long write(final BitOutputStream bitOutputStream, final byte value)
-            throws IOException {
-        final HuffmanBitCode code = valueToCode[value];
-        if (code.value != value)
-            throw new RuntimeException(String.format(
-                    "Searching for %d but found %s.", value, code.toString()));
-        bitOutputStream.write(code.bitCode, code.bitLength);
-        // System.out.println("Writing: " + code.toString());
-        return code.bitLength;
-    }
-
-    final byte read(final BitInputStream bitInputStream) throws IOException {
-        int prevLen = 0;
-        int bits = 0;
-        for (int i = 0; i < sortedCodes.length; i++) {
-            final int length = sortedCodes[i].bitLength;
-            bits <<= length - prevLen;
-            bits |= bitInputStream.readBits(length - prevLen);
-            prevLen = length;
-
-            final int index = bitCodeToValue[bits];
-            if (index > -1 && sortedBitLensByBitCode[index] == length)
-                return (byte) (0xFF & sortedValuesByBitCode[index]);
-
-            for (int j = i; sortedCodes[j + 1].bitLength == length
-                    && j < sortedCodes.length; j++)
-                i++;
-        }
-
-        throw new RuntimeException("Not found.");
-    }
-
-    private static final Comparator<HuffmanBitCode> bitCodeComparator = new Comparator<HuffmanBitCode>() {
-
-        @Override
-        public int compare(final HuffmanBitCode o1, final HuffmanBitCode o2) {
-            final int result = o1.bitLength - o2.bitLength;
-            if (result == 0)
-                return o1.bitCode - o2.bitCode;
-            else
-                return result;
-        }
-    };
-
-    private static int NumberOfSetBits(int i) {
-        i = i - ((i >> 1) & 0x55555555);
-        i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
-        return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntHelper.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntHelper.java
deleted file mode 100644
index 7f7e564..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntHelper.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-class HuffmanIntHelper {
-    TreeMap<Integer, HuffmanBitCode> codes;
-
-    private final int[] values;
-    private final int[] bitLengths;
-    private TreeMap<Integer, SortedSet<Integer>> codeBook;
-
-    private final HuffmanBitCode[] sortedCodes;
-    private final HuffmanBitCode[] sortedByValue;
-    private final int[] sortedValues;
-    private final int[] sortedValuesByBitCode;
-    private final int[] sortedBitLensByBitCode;
-    private final int[] bitCodeToValue;
-
-    public HuffmanIntHelper(final int[] values, final int[] bitLengths) {
-        this.values = values;
-        this.bitLengths = bitLengths;
-
-        buildCodeBook();
-        buildCodes();
-
-        final ArrayList<HuffmanBitCode> list = new ArrayList<HuffmanBitCode>(
-                codes.size());
-        list.addAll(codes.values());
-        Collections.sort(list, bitCodeComparator);
-        sortedCodes = list.toArray(new HuffmanBitCode[list
-                .size()]);
-
-        sortedValues = Arrays.copyOf(values, values.length);
-        Arrays.sort(sortedValues);
-        {
-            int i = 0;
-            sortedByValue = new HuffmanBitCode[sortedValues.length];
-            for (final int value : sortedValues)
-                sortedByValue[i++] = codes.get(value);
-        }
-
-        final int[] sortedBitCodes = new int[sortedCodes.length];
-        sortedValuesByBitCode = new int[sortedCodes.length];
-        sortedBitLensByBitCode = new int[sortedCodes.length];
-        int maxBitCode = 0;
-        for (int i = 0; i < sortedBitCodes.length; i++) {
-            sortedBitCodes[i] = sortedCodes[i].bitCode;
-            sortedValuesByBitCode[i] = sortedCodes[i].value;
-            sortedBitLensByBitCode[i] = sortedCodes[i].bitLength;
-            if (maxBitCode < sortedCodes[i].bitCode)
-                maxBitCode = sortedCodes[i].bitCode;
-        }
-
-        bitCodeToValue = new int[maxBitCode + 1];
-        Arrays.fill(bitCodeToValue, -1);
-        for (int i = 0; i < sortedBitCodes.length; i++) {
-            bitCodeToValue[sortedCodes[i].bitCode] = i;
-        }
-    }
-
-    private void buildCodeBook() {
-        codeBook = new TreeMap<Integer, SortedSet<Integer>>();
-        for (int i = 0; i < values.length; i++) {
-            if (codeBook.containsKey(bitLengths[i]))
-                codeBook.get(bitLengths[i]).add(values[i]);
-            else {
-                final TreeSet<Integer> entry = new TreeSet<Integer>();
-                entry.add(values[i]);
-                codeBook.put(bitLengths[i], entry);
-            }
-        }
-    }
-
-    private void buildCodes() {
-        codes = new TreeMap<Integer, HuffmanBitCode>();
-        int codeLength = 0, codeValue = -1;
-        for (final Object key : codeBook.keySet()) { // Iterate over code lengths
-
-            @SuppressWarnings("SuspiciousMethodCalls") final SortedSet<Integer> get = codeBook.get(key);
-            final int intKey = Integer.parseInt(key.toString());
-            for (final Integer entry : get) { // Iterate over symbols
-                final HuffmanBitCode code = new HuffmanBitCode();
-                code.bitLength = intKey; // given: bit length
-                code.value = entry; // given: symbol
-
-                codeValue++; // increment bit value by 1
-                final int delta = intKey - codeLength; // new length?
-                codeValue = codeValue << delta; // pad with 0's
-                code.bitCode = codeValue; // calculated: huffman code
-                codeLength += delta; // adjust current code length
-
-                if (NumberOfSetBits(codeValue) > intKey)
-                    throw new IllegalArgumentException("Symbol out of range");
-
-                codes.put(entry, code); // Store HuffmanBitCode
-
-            }
-
-        }
-    }
-
-    public final long write(final BitOutputStream bitOutputStream, final int value) throws IOException {
-        final int index = Arrays.binarySearch(sortedValues, value);
-        final HuffmanBitCode code = sortedByValue[index];
-        if (code.value != value)
-            throw new RuntimeException(String.format(
-                    "Searching for %d but found %s.", value, code.toString()));
-        bitOutputStream.write(code.bitCode, code.bitLength);
-        return code.bitLength;
-    }
-
-    public final int read(final BitInputStream bitInputStream) throws IOException {
-        int prevLen = 0;
-        int bits = 0;
-        for (int i = 0; i < sortedCodes.length; i++) {
-            final int length = sortedCodes[i].bitLength;
-            bits <<= length - prevLen;
-            bits |= bitInputStream.readBits(length - prevLen);
-            prevLen = length;
-            { // Variant 2:
-                final int index = bitCodeToValue[bits];
-                if (index > -1 && sortedBitLensByBitCode[index] == length)
-                    return sortedValuesByBitCode[index];
-
-                for (int j = i; sortedCodes[j + 1].bitLength == length
-                        && j < sortedCodes.length; j++)
-                    i++;
-            }
-        }
-
-        throw new RuntimeException("Not found.");
-    }
-
-    private static final Comparator<HuffmanBitCode> bitCodeComparator = new Comparator<HuffmanBitCode>() {
-
-        @Override
-        public int compare(final HuffmanBitCode o1, final HuffmanBitCode o2) {
-            final int result = o1.bitLength - o2.bitLength;
-            if (result == 0)
-                return o1.bitCode - o2.bitCode;
-            else
-                return result;
-        }
-    };
-
-    private static int NumberOfSetBits(int i) {
-        i = i - ((i >> 1) & 0x55555555);
-        i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
-        return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntegerEncoding.java
deleted file mode 100644
index 230a664..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntegerEncoding.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.encoding.BitCodec;
-import htsjdk.samtools.cram.encoding.Encoding;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Map;
-
-public class HuffmanIntegerEncoding implements Encoding<Integer> {
-    private static final EncodingID ENCODING_ID = EncodingID.HUFFMAN;
-    private int[] bitLengths;
-    private int[] values;
-    private final ByteBuffer buf = ByteBuffer.allocate(1024 * 10);
-
-    public HuffmanIntegerEncoding() {
-    }
-
-    @Override
-    public EncodingID id() {
-        return ENCODING_ID;
-    }
-
-    @Override
-    public byte[] toByteArray() {
-        buf.clear();
-        ITF8.writeUnsignedITF8(values.length, buf);
-        for (final int value : values)
-            ITF8.writeUnsignedITF8(value, buf);
-
-        ITF8.writeUnsignedITF8(bitLengths.length, buf);
-        for (final int value : bitLengths)
-            ITF8.writeUnsignedITF8(value, buf);
-
-        buf.flip();
-        final byte[] array = new byte[buf.limit()];
-        buf.get(array);
-        return array;
-    }
-
-    @Override
-    public void fromByteArray(final byte[] data) {
-        final ByteBuffer buf = ByteBuffer.wrap(data);
-        int size = ITF8.readUnsignedITF8(buf);
-        values = new int[size];
-
-        for (int i = 0; i < size; i++)
-            values[i] = ITF8.readUnsignedITF8(buf);
-
-        size = ITF8.readUnsignedITF8(buf);
-        bitLengths = new int[size];
-        for (int i = 0; i < size; i++)
-            bitLengths[i] = ITF8.readUnsignedITF8(buf);
-    }
-
-    @Override
-    public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
-                                        final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        return new CanonicalHuffmanIntegerCodec(values, bitLengths);
-    }
-
-    public static EncodingParams toParam(final int[] bfValues, final int[] bfBitLens) {
-        final HuffmanIntegerEncoding e = new HuffmanIntegerEncoding();
-        e.values = bfValues;
-        e.bitLengths = bfBitLens;
-        return new EncodingParams(ENCODING_ID, e.toByteArray());
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj instanceof HuffmanIntegerEncoding) {
-            final HuffmanIntegerEncoding foe = (HuffmanIntegerEncoding) obj;
-            return Arrays.equals(bitLengths, foe.bitLengths) && Arrays.equals(values, foe.values);
-
-        }
-        return false;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanParamsCalculator.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanParamsCalculator.java
deleted file mode 100644
index c489a73..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanParamsCalculator.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.common.MutableInt;
-import htsjdk.samtools.cram.encoding.huffman.HuffmanCode;
-import htsjdk.samtools.cram.encoding.huffman.HuffmanTree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * A utility class to calculate Huffman encoding parameters based on the values to be encoded.
- */
-class HuffmanParamsCalculator {
-    private final HashMap<Integer, MutableInt> countMap = new HashMap<>();
-    private int[] values = new int[]{};
-    private int[] bitLens = new int[]{};
-
-    public void add(final int value) {
-        MutableInt counter = countMap.get(value);
-        if (counter == null) {
-            counter = new MutableInt();
-            countMap.put(value, counter);
-        }
-        counter.value++;
-    }
-
-    public void add(final Integer value, final int inc) {
-        MutableInt counter = countMap.get(value);
-        if (counter == null) {
-            counter = new MutableInt();
-            countMap.put(value, counter);
-        }
-        counter.value += inc;
-    }
-
-    public int[] bitLens() {
-        return bitLens;
-    }
-
-    public int[] values() {
-        return values;
-    }
-
-    public Integer[] valuesAsAutoIntegers() {
-        final Integer[] intValues = new Integer[values.length];
-        for (int i = 0; i < intValues.length; i++) {
-            intValues[i] = values[i];
-        }
-
-        return intValues;
-    }
-
-    public byte[] valuesAsBytes() {
-        final byte[] byteValues = new byte[values.length];
-        for (int i = 0; i < byteValues.length; i++) {
-            byteValues[i] = (byte) (0xFF & values[i]);
-        }
-
-        return byteValues;
-    }
-
-    public Byte[] valuesAsAutoBytes() {
-        final Byte[] byteValues = new Byte[values.length];
-        for (int i = 0; i < byteValues.length; i++) {
-            byteValues[i] = (byte) (0xFF & values[i]);
-        }
-
-        return byteValues;
-    }
-
-    public void calculate() {
-        final HuffmanTree<Integer> tree;
-        {
-            final int size = countMap.size();
-            final int[] frequencies = new int[size];
-            final int[] values = new int[size];
-
-            int i = 0;
-            for (final Integer key : countMap.keySet()) {
-                values[i] = key;
-                frequencies[i] = countMap.get(key).value;
-                i++;
-            }
-            tree = HuffmanCode.buildTree(frequencies, autobox(values));
-        }
-
-        final List<Integer> valueList = new ArrayList<Integer>();
-        final List<Integer> lens = new ArrayList<Integer>();
-        HuffmanCode.getValuesAndBitLengths(valueList, lens, tree);
-
-        // the following sorting is not really required, but whatever:
-        final BitCode[] codes = new BitCode[valueList.size()];
-        for (int i = 0; i < valueList.size(); i++) {
-            codes[i] = new BitCode(valueList.get(i), lens.get(i));
-        }
-        Arrays.sort(codes);
-
-        values = new int[codes.length];
-        bitLens = new int[codes.length];
-
-        for (int i = 0; i < codes.length; i++) {
-            final BitCode code = codes[i];
-            bitLens[i] = code.length;
-            values[i] = code.value;
-        }
-    }
-
-    private static Integer[] autobox(final int[] array) {
-        final Integer[] newArray = new Integer[array.length];
-        for (int i = 0; i < array.length; i++) {
-            newArray[i] = array[i];
-        }
-        return newArray;
-    }
-
-    private static class BitCode implements Comparable<BitCode> {
-        final int value;
-        final int length;
-
-        public BitCode(final int value, final int length) {
-            this.value = value;
-            this.length = length;
-        }
-
-        @Override
-        public int compareTo(@SuppressWarnings("NullableProblems") final BitCode o) {
-            final int result = value - o.value;
-            if (result != 0) {
-                return result;
-            }
-            return length - o.length;
-        }
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/Constants.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/Constants.java
deleted file mode 100644
index 2981aa5..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/Constants.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-class Constants {
-    static final int TF_SHIFT = 12;
-    static final int TOTFREQ = (1 << TF_SHIFT);
-    static final int RANS_BYTE_L = 1 << 23;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/D04.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/D04.java
deleted file mode 100644
index 69990b3..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/D04.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import java.nio.ByteBuffer;
-
-class D04 {
-    static void uncompress(final ByteBuffer in, final Decoding.AriDecoder D,
-                           final Decoding.RansDecSymbol[] syms, final ByteBuffer out) {
-        int rans0, rans1, rans2, rans3;
-        rans0 = in.getInt();
-        rans1 = in.getInt();
-        rans2 = in.getInt();
-        rans3 = in.getInt();
-
-        final int out_sz = out.remaining();
-        final int out_end = (out_sz & ~3);
-        for (int i = 0; i < out_end; i += 4) {
-            final byte c0 = D.R[Decoding.RansDecGet(rans0, Constants.TF_SHIFT)];
-            final byte c1 = D.R[Decoding.RansDecGet(rans1, Constants.TF_SHIFT)];
-            final byte c2 = D.R[Decoding.RansDecGet(rans2, Constants.TF_SHIFT)];
-            final byte c3 = D.R[Decoding.RansDecGet(rans3, Constants.TF_SHIFT)];
-
-            out.put(i, c0);
-            out.put(i + 1, c1);
-            out.put(i + 2, c2);
-            out.put(i + 3, c3);
-
-            rans0 = Decoding.RansDecAdvanceSymbolStep(rans0, syms[0xFF & c0],
-                    Constants.TF_SHIFT);
-            rans1 = Decoding.RansDecAdvanceSymbolStep(rans1, syms[0xFF & c1],
-                    Constants.TF_SHIFT);
-            rans2 = Decoding.RansDecAdvanceSymbolStep(rans2, syms[0xFF & c2],
-                    Constants.TF_SHIFT);
-            rans3 = Decoding.RansDecAdvanceSymbolStep(rans3, syms[0xFF & c3],
-                    Constants.TF_SHIFT);
-
-            rans0 = Decoding.RansDecRenormalize(rans0, in);
-            rans1 = Decoding.RansDecRenormalize(rans1, in);
-            rans2 = Decoding.RansDecRenormalize(rans2, in);
-            rans3 = Decoding.RansDecRenormalize(rans3, in);
-        }
-
-        out.position(out_end);
-        byte c;
-        switch (out_sz & 3) {
-            case 0:
-                break;
-            case 1:
-                c = D.R[Decoding.RansDecGet(rans0, Constants.TF_SHIFT)];
-                Decoding.RansDecAdvanceSymbol(rans0, in, syms[0xFF & c],
-                        Constants.TF_SHIFT);
-                out.put(c);
-                break;
-
-            case 2:
-                c = D.R[Decoding.RansDecGet(rans0, Constants.TF_SHIFT)];
-                Decoding.RansDecAdvanceSymbol(rans0, in, syms[0xFF & c],
-                        Constants.TF_SHIFT);
-                out.put(c);
-
-                c = D.R[Decoding.RansDecGet(rans1, Constants.TF_SHIFT)];
-                Decoding.RansDecAdvanceSymbol(rans1, in, syms[0xFF & c],
-                        Constants.TF_SHIFT);
-                out.put(c);
-                break;
-
-            case 3:
-                c = D.R[Decoding.RansDecGet(rans0, Constants.TF_SHIFT)];
-                Decoding.RansDecAdvanceSymbol(rans0, in, syms[0xFF & c],
-                        Constants.TF_SHIFT);
-                out.put(c);
-
-                c = D.R[Decoding.RansDecGet(rans1, Constants.TF_SHIFT)];
-                Decoding.RansDecAdvanceSymbol(rans1, in, syms[0xFF & c],
-                        Constants.TF_SHIFT);
-                out.put(c);
-
-                c = D.R[Decoding.RansDecGet(rans2, Constants.TF_SHIFT)];
-                Decoding.RansDecAdvanceSymbol(rans2, in, syms[0xFF & c],
-                        Constants.TF_SHIFT);
-                out.put(c);
-                break;
-        }
-
-        out.position(0);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/D14.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/D14.java
deleted file mode 100644
index 9523d2e..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/D14.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-class D14 {
-    static void uncompress(final ByteBuffer in, final ByteBuffer out_buf, final Decoding.AriDecoder[] D,
-                           final Decoding.RansDecSymbol[][] syms) {
-        final int out_sz = out_buf.remaining();
-        int rans0, rans1, rans2, rans7;
-        in.order(ByteOrder.LITTLE_ENDIAN);
-        rans0 = in.getInt();
-        rans1 = in.getInt();
-        rans2 = in.getInt();
-        rans7 = in.getInt();
-
-        final int isz4 = out_sz >> 2;
-        int i0 = 0;
-        int i1 = isz4;
-        int i2 = 2 * isz4;
-        int i7 = 3 * isz4;
-        int l0 = 0;
-        int l1 = 0;
-        int l2 = 0;
-        int l7 = 0;
-        for (; i0 < isz4; i0++, i1++, i2++, i7++) {
-            final int c0 = 0xFF & D[l0].R[Decoding.RansDecGet(rans0,
-                    Constants.TF_SHIFT)];
-            final int c1 = 0xFF & D[l1].R[Decoding.RansDecGet(rans1,
-                    Constants.TF_SHIFT)];
-            final int c2 = 0xFF & D[l2].R[Decoding.RansDecGet(rans2,
-                    Constants.TF_SHIFT)];
-            final int c7 = 0xFF & D[l7].R[Decoding.RansDecGet(rans7,
-                    Constants.TF_SHIFT)];
-
-            out_buf.put(i0, (byte) c0);
-            out_buf.put(i1, (byte) c1);
-            out_buf.put(i2, (byte) c2);
-            out_buf.put(i7, (byte) c7);
-
-            rans0 = Decoding.RansDecAdvanceSymbolStep(rans0, syms[l0][c0],
-                    Constants.TF_SHIFT);
-            rans1 = Decoding.RansDecAdvanceSymbolStep(rans1, syms[l1][c1],
-                    Constants.TF_SHIFT);
-            rans2 = Decoding.RansDecAdvanceSymbolStep(rans2, syms[l2][c2],
-                    Constants.TF_SHIFT);
-            rans7 = Decoding.RansDecAdvanceSymbolStep(rans7, syms[l7][c7],
-                    Constants.TF_SHIFT);
-
-            rans0 = Decoding.RansDecRenormalize(rans0, in);
-            rans1 = Decoding.RansDecRenormalize(rans1, in);
-            rans2 = Decoding.RansDecRenormalize(rans2, in);
-            rans7 = Decoding.RansDecRenormalize(rans7, in);
-
-            l0 = c0;
-            l1 = c1;
-            l2 = c2;
-            l7 = c7;
-        }
-
-        // Remainder
-        for (; i7 < out_sz; i7++) {
-            final int c7 = 0xFF & D[l7].R[Decoding.RansDecGet(rans7,
-                    Constants.TF_SHIFT)];
-            out_buf.put(i7, (byte) c7);
-            rans7 = Decoding.RansDecAdvanceSymbol(rans7, in, syms[l7][c7],
-                    Constants.TF_SHIFT);
-            l7 = c7;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/Decoding.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/Decoding.java
deleted file mode 100644
index fd29ab7..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/Decoding.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import java.nio.ByteBuffer;
-
- at SuppressWarnings("SameParameterValue")
-class Decoding {
-
-    static class FC {
-        int F, C;
-    }
-
-    static class AriDecoder {
-        final FC[] fc = new FC[256];
-        byte[] R;
-    }
-
-    static class RansDecSymbol {
-        int start; // Start of range.
-        int freq; // Symbol frequency.
-    }
-
-    // Initialize a decoder symbol to start "start" and frequency "freq"
-    static void RansDecSymbolInit(final RansDecSymbol symbol, final int start, final int freq) {
-        assert (start <= (1 << 16));
-        assert (freq <= (1 << 16) - start);
-        symbol.start = start;
-        symbol.freq = freq;
-    }
-
-    // Advances in the bit stream by "popping" a single symbol with range start
-    // "start" and frequency "freq". All frequencies are assumed to sum to
-    // "1 << scale_bits".
-    // No renormalization or output happens.
-    private static int RansDecAdvanceStep(final int r, final int start, final int freq, final int scale_bits) {
-        final int mask = ((1 << scale_bits) - 1);
-
-        // s, x = D(x)
-        return freq * (r >> scale_bits) + (r & mask) - start;
-    }
-
-    // Equivalent to RansDecAdvanceStep that takes a symbol.
-    static int RansDecAdvanceSymbolStep(final int r, final RansDecSymbol sym, final int scale_bits) {
-        return RansDecAdvanceStep(r, sym.start, sym.freq, scale_bits);
-    }
-
-    // Returns the current cumulative frequency (map it to a symbol yourself!)
-    static int RansDecGet(final int r, final int scale_bits) {
-        return r & ((1 << scale_bits) - 1);
-    }
-
-    // Equivalent to RansDecAdvance that takes a symbol.
-    static int RansDecAdvanceSymbol(final int r, final ByteBuffer pptr, final RansDecSymbol sym,
-                                    final int scale_bits) {
-        return Decoding
-                .RansDecAdvance(r, pptr, sym.start, sym.freq, scale_bits);
-    }
-
-    // Advances in the bit stream by "popping" a single symbol with range start
-    // "start" and frequency "freq". All frequencies are assumed to sum to
-    // "1 << scale_bits",
-    // and the resulting bytes get written to ptr (which is updated).
-    private static int RansDecAdvance(int r, final ByteBuffer pptr, final int start, final int freq,
-                                      final int scale_bits) {
-        final int mask = (1 << scale_bits) - 1;
-
-        // s, x = D(x)
-        r = freq * (r >> scale_bits) + (r & mask) - start;
-
-        // re-normalize
-        if (r < Constants.RANS_BYTE_L) {
-            do {
-                final int b = 0xFF & pptr.get();
-                r = (r << 8) | b;
-            } while (r < Constants.RANS_BYTE_L);
-
-        }
-
-        return r;
-    }
-
-    // Re-normalize.
-    static int RansDecRenormalize(int r, final ByteBuffer pptr) {
-        // re-normalize
-        if (r < Constants.RANS_BYTE_L) {
-            do
-                r = (r << 8) | (0xFF & pptr.get());
-            while (r < Constants.RANS_BYTE_L);
-        }
-
-        return r;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/E04.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/E04.java
deleted file mode 100644
index 456520f..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/E04.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import htsjdk.samtools.cram.encoding.rans.Encoding.RansEncSymbol;
-
-import java.nio.ByteBuffer;
-
-class E04 {
-
-    static int compress(final ByteBuffer in, final RansEncSymbol[] syms,
-                        final ByteBuffer cp) {
-        final int cdata_size;
-        final int in_size = in.remaining();
-        int rans0, rans1, rans2, rans3;
-        final ByteBuffer ptr = cp.slice();
-
-        rans0 = Constants.RANS_BYTE_L;
-        rans1 = Constants.RANS_BYTE_L;
-        rans2 = Constants.RANS_BYTE_L;
-        rans3 = Constants.RANS_BYTE_L;
-
-        int i;
-        switch (i = (in_size & 3)) {
-            case 3:
-                rans2 = Encoding.RansEncPutSymbol(rans2, ptr,
-                        syms[0xFF & in.get(in_size - (i - 2))]);
-            case 2:
-                rans1 = Encoding.RansEncPutSymbol(rans1, ptr,
-                        syms[0xFF & in.get(in_size - (i - 1))]);
-            case 1:
-                rans0 = Encoding.RansEncPutSymbol(rans0, ptr,
-                        syms[0xFF & in.get(in_size - (i))]);
-            case 0:
-                break;
-        }
-        for (i = (in_size & ~3); i > 0; i -= 4) {
-            final int c3 = 0xFF & in.get(i - 1);
-            final int c2 = 0xFF & in.get(i - 2);
-            final int c1 = 0xFF & in.get(i - 3);
-            final int c0 = 0xFF & in.get(i - 4);
-
-            rans3 = Encoding.RansEncPutSymbol(rans3, ptr, syms[c3]);
-            rans2 = Encoding.RansEncPutSymbol(rans2, ptr, syms[c2]);
-            rans1 = Encoding.RansEncPutSymbol(rans1, ptr, syms[c1]);
-            rans0 = Encoding.RansEncPutSymbol(rans0, ptr, syms[c0]);
-        }
-
-        ptr.putInt(rans3);
-        ptr.putInt(rans2);
-        ptr.putInt(rans1);
-        ptr.putInt(rans0);
-        ptr.flip();
-        cdata_size = ptr.limit();
-        // reverse the compressed bytes, so that they become in REVERSE
-        // order:
-        Utils.reverse(ptr);
-        in.position(in.limit());
-        return cdata_size;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/E14.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/E14.java
deleted file mode 100644
index 01602c6..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/E14.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import htsjdk.samtools.cram.encoding.rans.Encoding.RansEncSymbol;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
- at SuppressWarnings("UnusedAssignment")
-class E14 {
-
-    static int compress(final ByteBuffer in, final RansEncSymbol[][] syms,
-                        final ByteBuffer out_buf) {
-        final int in_size = in.remaining();
-        final int compressedBlob_size;
-        int rans0, rans1, rans2, rans3;
-        rans0 = Constants.RANS_BYTE_L;
-        rans1 = Constants.RANS_BYTE_L;
-        rans2 = Constants.RANS_BYTE_L;
-        rans3 = Constants.RANS_BYTE_L;
-
-		/*
-         * Slicing is needed for buffer reversing later.
-		 */
-        final ByteBuffer ptr = out_buf.slice();
-
-        final int isz4 = in_size >> 2;
-        int i0 = isz4 - 2;
-        int i1 = 2 * isz4 - 2;
-        int i2 = 3 * isz4 - 2;
-        int i3 = 4 * isz4 - 2;
-
-        int l0 = 0;
-        if (i0 + 1 >= 0)
-            l0 = 0xFF & in.get(i0 + 1);
-        int l1 = 0;
-        if (i1 + 1 >= 0)
-            l1 = 0xFF & in.get(i1 + 1);
-        int l2 = 0;
-        if (i2 + 1 >= 0)
-            l2 = 0xFF & in.get(i2 + 1);
-        int l3;
-
-        // Deal with the remainder
-        l3 = 0xFF & in.get(in_size - 1);
-        for (i3 = in_size - 2; i3 > 4 * isz4 - 2 && i3 >= 0; i3--) {
-            final int c3 = 0xFF & in.get(i3 > -1 ? i3 : 0);
-            rans3 = Encoding.RansEncPutSymbol(rans3, ptr, syms[c3][l3]);
-            l3 = c3;
-        }
-
-        for (; i0 >= 0; i0--, i1--, i2--, i3--) {
-            final int c0 = 0xFF & in.get(i0);
-            final int c1 = 0xFF & in.get(i1);
-            final int c2 = 0xFF & in.get(i2);
-            final int c3 = 0xFF & in.get(i3);
-
-            rans3 = Encoding.RansEncPutSymbol(rans3, ptr, syms[c3][l3]);
-            rans2 = Encoding.RansEncPutSymbol(rans2, ptr, syms[c2][l2]);
-            rans1 = Encoding.RansEncPutSymbol(rans1, ptr, syms[c1][l1]);
-            rans0 = Encoding.RansEncPutSymbol(rans0, ptr, syms[c0][l0]);
-
-            l0 = c0;
-            l1 = c1;
-            l2 = c2;
-            l3 = c3;
-        }
-
-        rans3 = Encoding.RansEncPutSymbol(rans3, ptr, syms[0][l3]);
-        rans2 = Encoding.RansEncPutSymbol(rans2, ptr, syms[0][l2]);
-        rans1 = Encoding.RansEncPutSymbol(rans1, ptr, syms[0][l1]);
-        rans0 = Encoding.RansEncPutSymbol(rans0, ptr, syms[0][l0]);
-
-        ptr.order(ByteOrder.BIG_ENDIAN);
-        ptr.putInt(rans3);
-        ptr.putInt(rans2);
-        ptr.putInt(rans1);
-        ptr.putInt(rans0);
-        ptr.flip();
-        compressedBlob_size = ptr.limit();
-        Utils.reverse(ptr);
-        /*
-         * Depletion of the in buffer cannot be confirmed because of the get(int
-		 * position) method use during encoding, hence enforcing:
-		 */
-        in.position(in.limit());
-        return compressedBlob_size;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/Encoding.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/Encoding.java
deleted file mode 100644
index 069b946..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/Encoding.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import java.nio.ByteBuffer;
-
- at SuppressWarnings("SameParameterValue")
-class Encoding {
-
-    static class RansEncSymbol {
-        int x_max; // (Exclusive) upper bound of pre-normalization interval
-        int rcp_freq; // Fixed-point reciprocal frequency
-        int bias; // Bias
-        int cmpl_freq; // Complement of frequency: (1 << scale_bits) - freq
-        int rcp_shift; // Reciprocal shift
-    }
-
-    static void RansEncSymbolInit(final RansEncSymbol s, final int start, final int freq,
-                                  final int scale_bits) {
-        // RansAssert(scale_bits <= 16); RansAssert(start <= (1u <<
-        // scale_bits)); RansAssert(freq <= (1u << scale_bits) - start);
-
-        s.x_max = ((Constants.RANS_BYTE_L >> scale_bits) << 8) * freq;
-        s.cmpl_freq = (1 << scale_bits) - freq;
-        if (freq < 2) {
-            s.rcp_freq = (int) ~0L;
-            s.rcp_shift = 0;
-            s.bias = start + (1 << scale_bits) - 1;
-        } else {
-            // Alverson, "Integer Division using reciprocals"
-            // shift=ceil(log2(freq))
-            int shift = 0;
-            while (freq > (1L << shift))
-                shift++;
-
-            s.rcp_freq = (int) (((1L << (shift + 31)) + freq - 1) / freq);
-            s.rcp_shift = shift - 1;
-
-            // With these values, 'q' is the correct quotient, so we
-            // have bias=start.
-            s.bias = start;
-        }
-
-        s.rcp_shift += 32; // Avoid the extra >>32 in RansEncPutSymbol
-    }
-
-    static int RansEncPutSymbol(int r, final ByteBuffer ptr, final RansEncSymbol sym) {
-        assert (sym.x_max != 0); // can't encode symbol with freq=0
-
-        // re-normalize
-        int x = r;
-        final int x_max = sym.x_max;
-        if (x >= x_max) {
-            if (x >= x_max) {
-                ptr.put((byte) (x & 0xFF));
-                x >>= 8;
-                if (x >= x_max) {
-                    ptr.put((byte) (x & 0xFF));
-                    x >>= 8;
-                }
-            }
-        }
-
-        // x = C(s,x)
-        // NOTE: written this way so we get a 32-bit "multiply high" when
-        // available. If you're on a 64-bit platform with cheap multiplies
-        // (e.g. x64), just bake the +32 into rcp_shift.
-        // int q = (int) (((uint64_t)x * sym.rcp_freq) >> 32) >> sym.rcp_shift;
-
-        // The extra >>32 has already been added to RansEncSymbolInit
-        final long q = ((x * (0xFFFFFFFFL & sym.rcp_freq)) >> sym.rcp_shift);
-        r = (int) (x + sym.bias + q * sym.cmpl_freq);
-        return r;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/Frequencies.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/Frequencies.java
deleted file mode 100644
index bf6fc5d..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/Frequencies.java
+++ /dev/null
@@ -1,331 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import htsjdk.samtools.cram.encoding.rans.Encoding.RansEncSymbol;
-
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-
- at SuppressWarnings({"ConstantConditions", "StatementWithEmptyBody"})
-class Frequencies {
-
-    static void readStats_o0(final ByteBuffer cp, final Decoding.AriDecoder decoder, final Decoding.RansDecSymbol[] syms) {
-        // Pre-compute reverse lookup of frequency.
-        int rle = 0;
-        int x = 0;
-        int j = cp.get() & 0xFF;
-        do {
-            if (decoder.fc[j] == null)
-                decoder.fc[j] = new Decoding.FC();
-            if ((decoder.fc[j].F = (cp.get() & 0xFF)) >= 128) {
-                decoder.fc[j].F &= ~128;
-                decoder.fc[j].F = ((decoder.fc[j].F & 127) << 8) | (cp.get() & 0xFF);
-            }
-            decoder.fc[j].C = x;
-
-            Decoding.RansDecSymbolInit(syms[j], decoder.fc[j].C, decoder.fc[j].F);
-
-			/* Build reverse lookup table */
-            if (decoder.R == null)
-                decoder.R = new byte[Constants.TOTFREQ];
-            Arrays.fill(decoder.R, x, x + decoder.fc[j].F, (byte) j);
-
-            x += decoder.fc[j].F;
-
-            if (rle == 0 && j + 1 == (0xFF & cp.get(cp.position()))) {
-                j = cp.get() & 0xFF;
-                rle = cp.get() & 0xFF;
-            } else if (rle != 0) {
-                rle--;
-                j++;
-            } else {
-                j = cp.get() & 0xFF;
-            }
-        } while (j != 0);
-
-        assert (x < Constants.TOTFREQ);
-    }
-
-    static void readStats_o1(final ByteBuffer cp, final Decoding.AriDecoder[] D,
-                             final Decoding.RansDecSymbol[][] syms) {
-        int rle_i = 0;
-        int i = 0xFF & cp.get();
-        do {
-            int rle_j = 0;
-            int x = 0;
-            int j = 0xFF & cp.get();
-            if (D[i] == null)
-                D[i] = new Decoding.AriDecoder();
-            do {
-                if (D[i].fc[j] == null)
-                    D[i].fc[j] = new Decoding.FC();
-                if ((D[i].fc[j].F = (0xFF & cp.get())) >= 128) {
-                    D[i].fc[j].F &= ~128;
-                    D[i].fc[j].F = ((D[i].fc[j].F & 127) << 8)
-                            | (0xFF & cp.get());
-                }
-                D[i].fc[j].C = x;
-
-                if (D[i].fc[j].F == 0)
-                    D[i].fc[j].F = Constants.TOTFREQ;
-
-                if (syms[i][j] == null)
-                    syms[i][j] = new Decoding.RansDecSymbol();
-
-                Decoding.RansDecSymbolInit(syms[i][j], D[i].fc[j].C,
-                        D[i].fc[j].F);
-
-				/* Build reverse lookup table */
-                if (D[i].R == null)
-                    D[i].R = new byte[Constants.TOTFREQ];
-                Arrays.fill(D[i].R, x, x + D[i].fc[j].F, (byte) j);
-
-                x += D[i].fc[j].F;
-                assert (x <= Constants.TOTFREQ);
-
-                if (rle_j == 0 && j + 1 == (0xFF & cp.get(cp.position()))) {
-                    j = (0xFF & cp.get());
-                    rle_j = (0xFF & cp.get());
-                } else if (rle_j != 0) {
-                    rle_j--;
-                    j++;
-                } else {
-                    j = (0xFF & cp.get());
-                }
-            } while (j != 0);
-
-            if (rle_i == 0 && i + 1 == (0xFF & cp.get(cp.position()))) {
-                i = (0xFF & cp.get());
-                rle_i = (0xFF & cp.get());
-            } else if (rle_i != 0) {
-                rle_i--;
-                i++;
-            } else {
-                i = (0xFF & cp.get());
-            }
-        } while (i != 0);
-    }
-
-    static int[] calcFrequencies_o0(final ByteBuffer in) {
-        final int in_size = in.remaining();
-
-        // Compute statistics
-        final int[] F = new int[256];
-        int T = 0;
-        for (int i = 0; i < in_size; i++) {
-            F[0xFF & in.get()]++;
-            T++;
-        }
-        final long tr = ((long) Constants.TOTFREQ << 31) / T + (1 << 30) / T;
-
-        // Normalise so T[i] == TOTFREQ
-        int m = 0, M = 0;
-        for (int j = 0; j < 256; j++) {
-            if (m < F[j]) {
-                m = F[j];
-                M = j;
-            }
-        }
-
-        int fsum = 0;
-        for (int j = 0; j < 256; j++) {
-            if (F[j] == 0)
-                continue;
-            if ((F[j] = (int) ((F[j] * tr) >> 31)) == 0)
-                F[j] = 1;
-            fsum += F[j];
-        }
-
-        fsum++;
-        if (fsum < Constants.TOTFREQ)
-            F[M] += Constants.TOTFREQ - fsum;
-        else
-            F[M] -= fsum - Constants.TOTFREQ;
-
-        assert (F[M] > 0);
-        return F;
-    }
-
-    static int[][] calcFrequencies_o1(final ByteBuffer in) {
-        final int in_size = in.remaining();
-
-        final int[][] F = new int[256][256];
-        final int[] T = new int[256];
-        int c;
-
-        int last_i = 0;
-        for (int i = 0; i < in_size; i++) {
-            F[last_i][c = (0xFF & in.get())]++;
-            T[last_i]++;
-            last_i = c;
-        }
-        F[0][0xFF & in.get((in_size >> 2))]++;
-        F[0][0xFF & in.get(2 * (in_size >> 2))]++;
-        F[0][0xFF & in.get(3 * (in_size >> 2))]++;
-        T[0] += 3;
-
-        for (int i = 0; i < 256; i++) {
-            if (T[i] == 0)
-                continue;
-
-            final double p = ((double) Constants.TOTFREQ) / T[i];
-            int t2 = 0, m = 0, M = 0;
-            for (int j = 0; j < 256; j++) {
-                if (F[i][j] == 0)
-                    continue;
-
-                if (m < F[i][j]) {
-                    m = F[i][j];
-                    M = j;
-                }
-
-                if ((F[i][j] *= p) == 0)
-                    F[i][j] = 1;
-                t2 += F[i][j];
-            }
-
-            t2++;
-            if (t2 < Constants.TOTFREQ)
-                F[i][M] += Constants.TOTFREQ - t2;
-            else
-                F[i][M] -= t2 - Constants.TOTFREQ;
-        }
-
-        return F;
-    }
-
-    static RansEncSymbol[] buildSyms_o0(final int[] F) {
-        final int[] C = new int[256];
-        final RansEncSymbol[] syms = new RansEncSymbol[256];
-        for (int i = 0; i < syms.length; i++)
-            syms[i] = new RansEncSymbol();
-
-        int T = 0;
-        for (int j = 0; j < 256; j++) {
-            C[j] = T;
-            T += F[j];
-            if (F[j] != 0) {
-                Encoding.RansEncSymbolInit(syms[j], C[j], F[j],
-                        Constants.TF_SHIFT);
-            }
-        }
-        return syms;
-    }
-
-    static int writeFrequencies_o0(final ByteBuffer cp, final int[] F) {
-        final int start = cp.position();
-
-        int rle = 0;
-        for (int j = 0; j < 256; j++) {
-            if (F[j] != 0) {
-                // j
-                if (rle != 0) {
-                    rle--;
-                } else {
-                    cp.put((byte) j);
-                    if (rle == 0 && j != 0 && F[j - 1] != 0) {
-                        for (rle = j + 1; rle < 256 && F[rle] != 0; rle++)
-                            ;
-                        rle -= j + 1;
-                        cp.put((byte) rle);
-                    }
-                }
-
-                // F[j]
-                if (F[j] < 128) {
-                    cp.put((byte) (F[j]));
-                } else {
-                    cp.put((byte) (128 | (F[j] >> 8)));
-                    cp.put((byte) (F[j] & 0xff));
-                }
-            }
-        }
-
-        cp.put((byte) 0);
-        return cp.position() - start;
-    }
-
-    static RansEncSymbol[][] buildSyms_o1(final int[][] F) {
-        final RansEncSymbol[][] syms = new RansEncSymbol[256][256];
-        for (int i = 0; i < syms.length; i++)
-            for (int j = 0; j < syms[i].length; j++)
-                syms[i][j] = new RansEncSymbol();
-
-        for (int i = 0; i < 256; i++) {
-            final int[] F_i_ = F[i];
-            int x = 0;
-            for (int j = 0; j < 256; j++) {
-                if (F_i_[j] != 0) {
-                    Encoding.RansEncSymbolInit(syms[i][j], x, F_i_[j],
-                            Constants.TF_SHIFT);
-                    x += F_i_[j];
-                }
-            }
-        }
-
-        return syms;
-    }
-
-    static int writeFrequencies_o1(final ByteBuffer cp, final int[][] F) {
-        final int start = cp.position();
-        final int[] T = new int[256];
-
-        for (int i = 0; i < 256; i++)
-            for (int j = 0; j < 256; j++)
-                T[i] += F[i][j];
-
-        int rle_i = 0;
-        for (int i = 0; i < 256; i++) {
-            if (T[i] == 0)
-                continue;
-
-            // Store frequency table
-            // i
-            if (rle_i != 0) {
-                rle_i--;
-            } else {
-                cp.put((byte) i);
-                // FIXME: could use order-0 statistics to observe which alphabet
-                // symbols are present and base RLE on that ordering instead.
-                if (i != 0 && T[i - 1] != 0) {
-                    for (rle_i = i + 1; rle_i < 256 && T[rle_i] != 0; rle_i++)
-                        ;
-                    rle_i -= i + 1;
-                    cp.put((byte) rle_i);
-                }
-            }
-
-            final int[] F_i_ = F[i];
-            int rle_j = 0;
-            for (int j = 0; j < 256; j++) {
-                if (F_i_[j] != 0) {
-
-                    // j
-                    if (rle_j != 0) {
-                        rle_j--;
-                    } else {
-                        cp.put((byte) j);
-                        if (rle_j == 0 && j != 0 && F_i_[j - 1] != 0) {
-                            for (rle_j = j + 1; rle_j < 256 && F_i_[rle_j] != 0; rle_j++)
-                                ;
-                            rle_j -= j + 1;
-                            cp.put((byte) rle_j);
-                        }
-                    }
-
-                    // F_i_[j]
-                    if (F_i_[j] < 128) {
-                        cp.put((byte) F_i_[j]);
-                    } else {
-                        cp.put((byte) (128 | (F_i_[j] >> 8)));
-                        cp.put((byte) (F_i_[j] & 0xff));
-                    }
-                }
-            }
-            cp.put((byte) 0);
-        }
-        cp.put((byte) 0);
-
-        return cp.position() - start;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/RANS.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/RANS.java
deleted file mode 100644
index c75881a..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/RANS.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import htsjdk.samtools.cram.encoding.rans.Encoding.RansEncSymbol;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-public class RANS {
-    public enum ORDER {
-        ZERO, ONE;
-
-        public static ORDER fromInt(final int value) {
-            try {
-                return ORDER.values()[value];
-            } catch (final ArrayIndexOutOfBoundsException e) {
-                throw new RuntimeException("Unknown rANS order: " + value);
-            }
-        }
-    }
-
-    private static final int ORDER_BYTE_LENGTH = 1;
-    private static final int COMPRESSED_BYTE_LENGTH = 4;
-    private static final int RAW_BYTE_LENGTH = 4;
-    private static final int PREFIX_BYTE_LENGTH = ORDER_BYTE_LENGTH
-            + COMPRESSED_BYTE_LENGTH + RAW_BYTE_LENGTH;
-    private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.allocate(0);
-
-    public static ByteBuffer uncompress(final ByteBuffer in, ByteBuffer out) {
-        if (in.remaining() == 0)
-            return ByteBuffer.allocate(0);
-
-        final ORDER order = ORDER.fromInt(in.get());
-
-        in.order(ByteOrder.LITTLE_ENDIAN);
-        final int in_sz = in.getInt();
-        if (in_sz != in.remaining() - RAW_BYTE_LENGTH)
-            throw new RuntimeException("Incorrect input length.");
-        final int out_sz = in.getInt();
-        if (out == null)
-            out = ByteBuffer.allocate(out_sz);
-        else
-            out.limit(out_sz);
-        if (out.remaining() < out_sz)
-            throw new RuntimeException("Output buffer too small to fit "
-                    + out_sz + " bytes.");
-
-        switch (order) {
-            case ZERO:
-                return uncompress_order0_way4(in, out);
-
-            case ONE:
-                return uncompress_order1_way4(in, out);
-
-            default:
-                throw new RuntimeException("Unknown rANS order: " + order);
-        }
-    }
-
-    public static ByteBuffer compress(final ByteBuffer in, final ORDER order, final ByteBuffer out) {
-        if (in.remaining() == 0)
-            return EMPTY_BUFFER;
-
-        if (in.remaining() < 4)
-            return encode_order0_way4(in, out);
-
-        switch (order) {
-            case ZERO:
-                return encode_order0_way4(in, out);
-            case ONE:
-                return encode_order1_way4(in, out);
-
-            default:
-                throw new RuntimeException("Unknown rANS order: " + order);
-        }
-    }
-
-    private static ByteBuffer allocateIfNeeded(final int in_size,
-                                               final ByteBuffer out_buf) {
-        final int compressedSize = (int) (1.05 * in_size + 257 * 257 * 3 + 4);
-        if (out_buf == null)
-            return ByteBuffer.allocate(compressedSize);
-        if (out_buf.remaining() < compressedSize)
-            throw new RuntimeException("Insufficient buffer size.");
-        out_buf.order(ByteOrder.LITTLE_ENDIAN);
-        return out_buf;
-    }
-
-    private static ByteBuffer encode_order0_way4(final ByteBuffer in,
-                                                 ByteBuffer out_buf) {
-        final int in_size = in.remaining();
-        out_buf = allocateIfNeeded(in_size, out_buf);
-        final int freqTableStart = PREFIX_BYTE_LENGTH;
-        out_buf.position(freqTableStart);
-
-        final int[] F = Frequencies.calcFrequencies_o0(in);
-        final RansEncSymbol[] syms = Frequencies.buildSyms_o0(F);
-
-        final ByteBuffer cp = out_buf.slice();
-        final int frequencyTable_size = Frequencies.writeFrequencies_o0(cp, F);
-
-        in.rewind();
-        final int compressedBlob_size = E04.compress(in, syms, cp);
-
-        finalizeCompressed(0, out_buf, in_size, frequencyTable_size,
-                compressedBlob_size);
-        return out_buf;
-    }
-
-    private static ByteBuffer encode_order1_way4(final ByteBuffer in,
-                                                 ByteBuffer out_buf) {
-        final int in_size = in.remaining();
-        out_buf = allocateIfNeeded(in_size, out_buf);
-        final int freqTableStart = PREFIX_BYTE_LENGTH;
-        out_buf.position(freqTableStart);
-
-        final int[][] F = Frequencies.calcFrequencies_o1(in);
-        final RansEncSymbol[][] syms = Frequencies.buildSyms_o1(F);
-
-        final ByteBuffer cp = out_buf.slice();
-        final int frequencyTable_size = Frequencies.writeFrequencies_o1(cp, F);
-
-        in.rewind();
-        final int compressedBlob_size = E14.compress(in, syms, cp);
-
-        finalizeCompressed(1, out_buf, in_size, frequencyTable_size,
-                compressedBlob_size);
-        return out_buf;
-    }
-
-    private static void finalizeCompressed(final int order, final ByteBuffer out_buf,
-                                           final int in_size, final int frequencyTable_size, final int compressedBlob_size) {
-        out_buf.limit(PREFIX_BYTE_LENGTH + frequencyTable_size
-                + compressedBlob_size);
-        out_buf.put(0, (byte) order);
-        out_buf.order(ByteOrder.LITTLE_ENDIAN);
-        final int compressedSizeOffset = ORDER_BYTE_LENGTH;
-        out_buf.putInt(compressedSizeOffset, frequencyTable_size
-                + compressedBlob_size);
-        final int rawSizeOffset = ORDER_BYTE_LENGTH + COMPRESSED_BYTE_LENGTH;
-        out_buf.putInt(rawSizeOffset, in_size);
-        out_buf.rewind();
-    }
-
-    private static ByteBuffer uncompress_order0_way4(final ByteBuffer in,
-                                                     final ByteBuffer out) {
-        in.order(ByteOrder.LITTLE_ENDIAN);
-        final Decoding.AriDecoder D = new Decoding.AriDecoder();
-        final Decoding.RansDecSymbol[] syms = new Decoding.RansDecSymbol[256];
-        for (int i = 0; i < syms.length; i++)
-            syms[i] = new Decoding.RansDecSymbol();
-
-        Frequencies.readStats_o0(in, D, syms);
-
-        D04.uncompress(in, D, syms, out);
-
-        return out;
-    }
-
-    private static ByteBuffer uncompress_order1_way4(final ByteBuffer in,
-                                                     final ByteBuffer out_buf) {
-        final Decoding.AriDecoder[] D = new Decoding.AriDecoder[256];
-        final Decoding.RansDecSymbol[][] syms = new Decoding.RansDecSymbol[256][256];
-        for (int i = 0; i < syms.length; i++)
-            for (int j = 0; j < syms[i].length; j++)
-                syms[i][j] = new Decoding.RansDecSymbol();
-        Frequencies.readStats_o1(in, D, syms);
-
-        D14.uncompress(in, out_buf, D, syms);
-
-        return out_buf;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/Utils.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/Utils.java
deleted file mode 100644
index e424c20..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/Utils.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import java.nio.ByteBuffer;
-
-class Utils {
-    private static void reverse(final byte[] array, final int offset, final int size) {
-        if (array == null) {
-            return;
-        }
-        int i = offset;
-        int j = offset + size - 1;
-        byte tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    static void reverse(final ByteBuffer ptr) {
-        byte tmp;
-        if (ptr.hasArray()) {
-            reverse(ptr.array(), ptr.arrayOffset(), ptr.limit());
-        } else {
-            for (int i = 0; i < ptr.limit(); i++) {
-                tmp = ptr.get(i);
-                ptr.put(i, ptr.get(ptr.limit() - i - 1));
-                ptr.put(ptr.limit() - i - 1, tmp);
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/reader/AbstractReader.java b/src/main/java/htsjdk/samtools/cram/encoding/reader/AbstractReader.java
deleted file mode 100644
index 83446f4..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/reader/AbstractReader.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.reader;
-
-import htsjdk.samtools.cram.common.IntHashMap;
-import htsjdk.samtools.cram.encoding.DataSeries;
-import htsjdk.samtools.cram.encoding.DataSeriesMap;
-import htsjdk.samtools.cram.encoding.DataSeriesType;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-
-import java.nio.charset.Charset;
-
- at SuppressWarnings({"WeakerAccess", "UnusedDeclaration"})
-public abstract class AbstractReader {
-    final Charset charset = Charset.forName("UTF8");
-    public boolean captureReadNames = false;
-    public byte[][][] tagIdDictionary;
-
-    @DataSeries(key = EncodingKey.BF_BitFlags, type = DataSeriesType.INT)
-    public DataReader<Integer> bitFlagsCodec;
-
-    @DataSeries(key = EncodingKey.CF_CompressionBitFlags, type = DataSeriesType.BYTE)
-    public DataReader<Byte> compressionBitFlagsCodec;
-
-    @DataSeries(key = EncodingKey.RL_ReadLength, type = DataSeriesType.INT)
-    public DataReader<Integer> readLengthCodec;
-
-    @DataSeries(key = EncodingKey.AP_AlignmentPositionOffset, type = DataSeriesType.INT)
-    public DataReader<Integer> alignmentStartCodec;
-
-    @DataSeries(key = EncodingKey.RG_ReadGroup, type = DataSeriesType.INT)
-    public DataReader<Integer> readGroupCodec;
-
-    @DataSeries(key = EncodingKey.RN_ReadName, type = DataSeriesType.BYTE_ARRAY)
-    public DataReader<byte[]> readNameCodec;
-
-    @DataSeries(key = EncodingKey.NF_RecordsToNextFragment, type = DataSeriesType.INT)
-    public DataReader<Integer> distanceToNextFragmentCodec;
-
-    @DataSeriesMap(name = "TAG")
-    public IntHashMap<DataReader<byte[]>> tagValueCodecs;
-
-    @DataSeries(key = EncodingKey.FN_NumberOfReadFeatures, type = DataSeriesType.INT)
-    public DataReader<Integer> numberOfReadFeaturesCodec;
-
-    @DataSeries(key = EncodingKey.FP_FeaturePosition, type = DataSeriesType.INT)
-    public DataReader<Integer> readFeaturePositionCodec;
-
-    @DataSeries(key = EncodingKey.FC_FeatureCode, type = DataSeriesType.BYTE)
-    public DataReader<Byte> readFeatureCodeCodec;
-
-    @DataSeries(key = EncodingKey.BA_Base, type = DataSeriesType.BYTE)
-    public DataReader<Byte> baseCodec;
-
-    @DataSeries(key = EncodingKey.QS_QualityScore, type = DataSeriesType.BYTE)
-    public DataReader<Byte> qualityScoreCodec;
-
-    @DataSeries(key = EncodingKey.QS_QualityScore, type = DataSeriesType.BYTE_ARRAY)
-    public DataReader<byte[]> qualityScoresCodec;
-
-    @DataSeries(key = EncodingKey.BS_BaseSubstitutionCode, type = DataSeriesType.BYTE)
-    public DataReader<Byte> baseSubstitutionCodec;
-
-    @DataSeries(key = EncodingKey.IN_Insertion, type = DataSeriesType.BYTE_ARRAY)
-    public DataReader<byte[]> insertionCodec;
-
-    @DataSeries(key = EncodingKey.SC_SoftClip, type = DataSeriesType.BYTE_ARRAY)
-    public DataReader<byte[]> softClipCodec;
-
-    @DataSeries(key = EncodingKey.HC_HardClip, type = DataSeriesType.INT)
-    public DataReader<Integer> hardClipCodec;
-
-    @DataSeries(key = EncodingKey.PD_padding, type = DataSeriesType.INT)
-    public DataReader<Integer> paddingCodec;
-
-    @DataSeries(key = EncodingKey.DL_DeletionLength, type = DataSeriesType.INT)
-    public DataReader<Integer> deletionLengthCodec;
-
-    @DataSeries(key = EncodingKey.MQ_MappingQualityScore, type = DataSeriesType.INT)
-    public DataReader<Integer> mappingScoreCodec;
-
-    @DataSeries(key = EncodingKey.MF_MateBitFlags, type = DataSeriesType.BYTE)
-    public DataReader<Byte> mateBitFlagCodec;
-
-    @DataSeries(key = EncodingKey.NS_NextFragmentReferenceSequenceID, type = DataSeriesType.INT)
-    public DataReader<Integer> mateReferenceIdCodec;
-
-    @DataSeries(key = EncodingKey.NP_NextFragmentAlignmentStart, type = DataSeriesType.INT)
-    public DataReader<Integer> mateAlignmentStartCodec;
-
-    @DataSeries(key = EncodingKey.TS_InsetSize, type = DataSeriesType.INT)
-    public DataReader<Integer> insertSizeCodec;
-
-    @DataSeries(key = EncodingKey.TL_TagIdList, type = DataSeriesType.INT)
-    public DataReader<Integer> tagIdListCodec;
-
-    @DataSeries(key = EncodingKey.RI_RefId, type = DataSeriesType.INT)
-    public DataReader<Integer> refIdCodec;
-
-    @DataSeries(key = EncodingKey.RS_RefSkip, type = DataSeriesType.INT)
-    public DataReader<Integer> refSkipCodec;
-
-    @DataSeries(key = EncodingKey.BB_bases, type = DataSeriesType.BYTE_ARRAY)
-    public DataReader<byte[]> basesCodec;
-
-    @DataSeries(key = EncodingKey.QQ_scores, type = DataSeriesType.BYTE_ARRAY)
-    public DataReader<byte[]> scoresCodec;
-
-    public int refId;
-    SubstitutionMatrix substitutionMatrix;
-    public boolean APDelta = true;
-
-    static int detachedCount = 0;
-    int recordCounter = 0;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/reader/CramRecordReader.java b/src/main/java/htsjdk/samtools/cram/encoding/reader/CramRecordReader.java
deleted file mode 100644
index 7cbd98d..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/reader/CramRecordReader.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.reader;
-
-import htsjdk.samtools.SAMFormatException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.Bases;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.HardClip;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.Padding;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadBase;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.Scores;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.ReadTag;
-
-import java.util.LinkedList;
-
-public class CramRecordReader extends AbstractReader {
-    private CramCompressionRecord prevRecord;
-    private ValidationStringency validationStringency;
-
-    public CramRecordReader(ValidationStringency validationStringency) {
-        this.validationStringency = validationStringency;
-    }
-
-    @SuppressWarnings("ConstantConditions")
-    public void read(final CramCompressionRecord cramRecord) {
-        try {
-            // int mark = testCodec.readData();
-            // if (Writer.TEST_MARK != mark) {
-            // System.err.println("Record counter=" + recordCount);
-            // System.err.println(cramRecord.toString());
-            // throw new RuntimeException("Test mark not found.");
-            // }
-
-            cramRecord.flags = bitFlagsCodec.readData();
-            cramRecord.compressionFlags = compressionBitFlagsCodec.readData();
-            if (refId == -2)
-                cramRecord.sequenceId = refIdCodec.readData();
-            else
-                cramRecord.sequenceId = refId;
-
-            cramRecord.readLength = readLengthCodec.readData();
-            if (APDelta)
-                cramRecord.alignmentDelta = alignmentStartCodec.readData();
-            else
-                cramRecord.alignmentStart = alignmentStartCodec.readData();
-            cramRecord.readGroupID = readGroupCodec.readData();
-
-            if (captureReadNames)
-                cramRecord.readName = new String(readNameCodec.readData(), charset);
-
-            // mate record:
-            if (cramRecord.isDetached()) {
-                cramRecord.mateFlags = mateBitFlagCodec.readData();
-                if (!captureReadNames)
-                    cramRecord.readName = new String(readNameCodec.readData(), charset);
-
-                cramRecord.mateSequenceID = mateReferenceIdCodec.readData();
-                cramRecord.mateAlignmentStart = mateAlignmentStartCodec.readData();
-                cramRecord.templateSize = insertSizeCodec.readData();
-                detachedCount++;
-            } else if (cramRecord.isHasMateDownStream())
-                cramRecord.recordsToNextFragment = distanceToNextFragmentCodec.readData();
-
-            final Integer tagIdList = tagIdListCodec.readData();
-            final byte[][] ids = tagIdDictionary[tagIdList];
-            if (ids.length > 0) {
-                final int tagCount = ids.length;
-                cramRecord.tags = new ReadTag[tagCount];
-                for (int i = 0; i < ids.length; i++) {
-                    final int id = ReadTag.name3BytesToInt(ids[i]);
-                    final DataReader<byte[]> dataReader = tagValueCodecs.get(id);
-                    final ReadTag tag = new ReadTag(id, dataReader.readData(), validationStringency);
-                    cramRecord.tags[i] = tag;
-                }
-            }
-
-            if (!cramRecord.isSegmentUnmapped()) {
-                // reading read features:
-                final int size = numberOfReadFeaturesCodec.readData();
-                int prevPos = 0;
-                final java.util.List<ReadFeature> readFeatures = new LinkedList<ReadFeature>();
-                cramRecord.readFeatures = readFeatures;
-                for (int i = 0; i < size; i++) {
-                    final Byte operator = readFeatureCodeCodec.readData();
-
-                    final int pos = prevPos + readFeaturePositionCodec.readData();
-                    prevPos = pos;
-
-                    switch (operator) {
-                        case ReadBase.operator:
-                            final ReadBase readBase = new ReadBase(pos, baseCodec.readData(), qualityScoreCodec.readData());
-                            readFeatures.add(readBase);
-                            break;
-                        case Substitution.operator:
-                            final Substitution substitution = new Substitution();
-                            substitution.setPosition(pos);
-                            final byte code = baseSubstitutionCodec.readData();
-                            substitution.setCode(code);
-                            readFeatures.add(substitution);
-                            break;
-                        case Insertion.operator:
-                            final Insertion insertion = new Insertion(pos, insertionCodec.readData());
-                            readFeatures.add(insertion);
-                            break;
-                        case SoftClip.operator:
-                            final SoftClip softClip = new SoftClip(pos, softClipCodec.readData());
-                            readFeatures.add(softClip);
-                            break;
-                        case HardClip.operator:
-                            final HardClip hardCLip = new HardClip(pos, hardClipCodec.readData());
-                            readFeatures.add(hardCLip);
-                            break;
-                        case Padding.operator:
-                            final Padding padding = new Padding(pos, paddingCodec.readData());
-                            readFeatures.add(padding);
-                            break;
-                        case Deletion.operator:
-                            final Deletion deletion = new Deletion(pos, deletionLengthCodec.readData());
-                            readFeatures.add(deletion);
-                            break;
-                        case RefSkip.operator:
-                            final RefSkip refSkip = new RefSkip(pos, refSkipCodec.readData());
-                            readFeatures.add(refSkip);
-                            break;
-                        case InsertBase.operator:
-                            final InsertBase insertBase = new InsertBase(pos, baseCodec.readData());
-                            readFeatures.add(insertBase);
-                            break;
-                        case BaseQualityScore.operator:
-                            final BaseQualityScore baseQualityScore = new BaseQualityScore(pos, qualityScoreCodec.readData());
-                            readFeatures.add(baseQualityScore);
-                            break;
-                        case Bases.operator:
-                            final Bases bases = new Bases(pos, basesCodec.readData());
-                            readFeatures.add(bases);
-                            break;
-                        case Scores.operator:
-                            final Scores scores = new Scores(pos, scoresCodec.readData());
-                            readFeatures.add(scores);
-                            break;
-                        default:
-                            throw new RuntimeException("Unknown read feature operator: " + operator);
-                    }
-                }
-
-                // mapping quality:
-                cramRecord.mappingQuality = mappingScoreCodec.readData();
-                if (cramRecord.isForcePreserveQualityScores()) {
-                    cramRecord.qualityScores = qualityScoresCodec.readDataArray(cramRecord.readLength);
-                }
-            } else {
-                if (cramRecord.isUnknownBases()) {
-                    cramRecord.readBases = SAMRecord.NULL_SEQUENCE;
-                    cramRecord.qualityScores = SAMRecord.NULL_QUALS;
-                } else {
-                    final byte[] bases = new byte[cramRecord.readLength];
-                    for (int i = 0; i < bases.length; i++)
-                        bases[i] = baseCodec.readData();
-                    cramRecord.readBases = bases;
-
-
-                    if (cramRecord.isForcePreserveQualityScores()) {
-                        cramRecord.qualityScores = qualityScoresCodec.readDataArray(cramRecord.readLength);
-                    }
-                }
-            }
-
-            recordCounter++;
-
-            prevRecord = cramRecord;
-        }
-        catch (final SAMFormatException e) {
-            if (prevRecord != null) {
-                System.err.printf("Failed at record %d. Here is the previously read record: %s\n", recordCounter,
-                        prevRecord.toString());
-            }
-            throw e;
-        }
-        catch (final Exception e) {
-            if (prevRecord != null) {
-                System.err.printf("Failed at record %d. Here is the previously read record: %s\n", recordCounter,
-                        prevRecord.toString());
-            }
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReader.java b/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReader.java
deleted file mode 100644
index 47fba2f..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReader.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.reader;
-
-import java.io.IOException;
-
-/**
- * A basic interface for reading data. The details of what is data and from where to read are implementation specific. Pure consumer.
- *
- * @param <T> data type of the series to be read
- */
-public interface DataReader<T> {
-
-    /**
-     * Read a single object
-     * @return an object or a primitive value read
-     * @throws IOException as per java IO contract
-     */
-    T readData() throws IOException;
-
-    /**
-     * Read an array of specified length. Normally this is a byte array. The intent here is optimization: reading an array may be faster than reading elements one by one.
-     * @param length the length of the array to be read
-     * @return the array of objects
-     * @throws IOException as per java IO contract
-     */
-    T readDataArray(int length) throws IOException;
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReaderFactory.java b/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReaderFactory.java
deleted file mode 100644
index 253ab15..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReaderFactory.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.reader;
-
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.cram.common.IntHashMap;
-import htsjdk.samtools.cram.encoding.BitCodec;
-import htsjdk.samtools.cram.encoding.DataSeries;
-import htsjdk.samtools.cram.encoding.DataSeriesMap;
-import htsjdk.samtools.cram.encoding.DataSeriesType;
-import htsjdk.samtools.cram.encoding.Encoding;
-import htsjdk.samtools.cram.encoding.EncodingFactory;
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.EncodingParams;
-import htsjdk.samtools.cram.structure.ReadTag;
-import htsjdk.samtools.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class DataReaderFactory {
-    private static Log log = Log.getInstance(DataReaderFactory.class);
-
-    private final static boolean collectStats = false;
-
-    public AbstractReader buildReader(final AbstractReader reader,
-                                      final BitInputStream bitInputStream, final Map<Integer, InputStream> inputMap,
-                                      final CompressionHeader header, final int refId) throws IllegalArgumentException {
-        reader.captureReadNames = header.readNamesIncluded;
-        reader.refId = refId;
-        reader.APDelta = header.APDelta;
-
-        for (final Field field : reader.getClass().getFields()) {
-            if (field.isAnnotationPresent(DataSeries.class)) {
-                final DataSeries dataSeries = field.getAnnotation(DataSeries.class);
-                final EncodingKey key = dataSeries.key();
-                final DataSeriesType type = dataSeries.type();
-                if (header.encodingMap.get(key) != null) {
-                    try {
-                        field.set(reader,
-                                createReader(type, header.encodingMap.get(key), bitInputStream, inputMap));
-                    } catch (IllegalAccessException e) {
-                        throw new CRAMException(e);
-                    }
-                }
-            }
-
-            if (field.isAnnotationPresent(DataSeriesMap.class)) {
-                final DataSeriesMap dataSeriesMap = field.getAnnotation(DataSeriesMap.class);
-                final String name = dataSeriesMap.name();
-                if ("TAG".equals(name)) {
-                    final IntHashMap map = new IntHashMap();
-                    for (final Integer key : header.tMap.keySet()) {
-                        final EncodingParams params = header.tMap.get(key);
-                        final DataReader<byte[]> tagReader = createReader(
-                                DataSeriesType.BYTE_ARRAY, params, bitInputStream,
-                                inputMap);
-                        map.put(key, tagReader);
-                    }
-                    try {
-                        field.set(reader, map);
-                    } catch (IllegalAccessException e) {
-                        throw new CRAMException(e);
-                    }
-                }
-            }
-        }
-
-        reader.tagIdDictionary = header.dictionary;
-        return reader;
-    }
-
-    private <T> DataReader<T> createReader(final DataSeriesType valueType,
-                                           final EncodingParams params, final BitInputStream bitInputStream,
-                                           final Map<Integer, InputStream> inputMap) {
-        if (params.id == EncodingID.NULL)
-            //noinspection ConstantConditions
-            return collectStats ? new DataReaderWithStats(
-                    buildNullReader(valueType)) : buildNullReader(valueType);
-
-        final EncodingFactory encodingFactory = new EncodingFactory();
-        final Encoding<T> encoding = encodingFactory.createEncoding(valueType, params.id);
-        if (encoding == null)
-            throw new RuntimeException("Encoding not found for value type "
-                    + valueType.name() + ", id=" + params.id);
-        encoding.fromByteArray(params.params);
-
-        //noinspection ConstantConditions
-        return collectStats ? new DataReaderWithStats(new DefaultDataReader<T>(
-                encoding.buildCodec(inputMap, null), bitInputStream))
-                : new DefaultDataReader<T>(encoding.buildCodec(inputMap, null),
-                bitInputStream);
-    }
-
-    private static <T> DataReader<T> buildNullReader(final DataSeriesType valueType) {
-        switch (valueType) {
-            case BYTE:
-                return (DataReader<T>) new SingleValueReader<Byte>((byte) 0);
-            case INT:
-                return (DataReader<T>) new SingleValueReader<Integer>(
-                        0);
-            case LONG:
-                return (DataReader<T>) new SingleValueReader<Long>((long) 0);
-            case BYTE_ARRAY:
-                return (DataReader<T>) new SingleValueReader<byte[]>(new byte[]{});
-
-            default:
-                throw new RuntimeException("Unknown data type: " + valueType.name());
-        }
-    }
-
-    private static class DefaultDataReader<T> implements DataReader<T> {
-        private final BitCodec<T> codec;
-        private final BitInputStream bitInputStream;
-
-        public DefaultDataReader(final BitCodec<T> codec, final BitInputStream bitInputStream) {
-            this.codec = codec;
-            this.bitInputStream = bitInputStream;
-        }
-
-        @Override
-        public T readData() throws IOException {
-            return codec.read(bitInputStream);
-        }
-
-        @Override
-        public T readDataArray(final int length) throws IOException {
-            return codec.read(bitInputStream, length);
-        }
-
-    }
-
-    private static class SingleValueReader<T> implements DataReader<T> {
-        private final T value;
-
-        public SingleValueReader(final T value) {
-            this.value = value;
-        }
-
-        @Override
-        public T readData() throws IOException {
-            return value;
-        }
-
-        @Override
-        public T readDataArray(final int length) {
-            return value;
-        }
-    }
-
-    public static class DataReaderWithStats<T> implements DataReader<T> {
-        public long nanos = 0;
-        final DataReader<T> delegate;
-
-        public DataReaderWithStats(final DataReader<T> delegate) {
-            this.delegate = delegate;
-        }
-
-        @Override
-        public T readData() throws IOException {
-            final long time = System.nanoTime();
-            final T value = delegate.readData();
-            nanos += System.nanoTime() - time;
-            return value;
-        }
-
-        @Override
-        public T readDataArray(final int length) throws IOException {
-            final long time = System.nanoTime();
-            final T value = delegate.readDataArray(length);
-            nanos += System.nanoTime() - time;
-            return value;
-        }
-    }
-
-    public Map<String, DataReaderWithStats> getStats(final CramRecordReader reader)
-            throws IllegalArgumentException, IllegalAccessException {
-        final Map<String, DataReaderWithStats> map = new TreeMap<String, DataReaderFactory.DataReaderWithStats>();
-        //noinspection ConstantConditions,PointlessBooleanExpression
-        if (!collectStats)
-            return map;
-
-        for (final Field field : reader.getClass().getFields()) {
-            if (field.isAnnotationPresent(DataSeries.class)) {
-                final DataSeries dataSeries = field.getAnnotation(DataSeries.class);
-                final EncodingKey key = dataSeries.key();
-                map.put(key.name(), (DataReaderWithStats) field.get(reader));
-            }
-
-            if (field.isAnnotationPresent(DataSeriesMap.class)) {
-                final DataSeriesMap dataSeriesMap = field.getAnnotation(DataSeriesMap.class);
-                final String name = dataSeriesMap.name();
-                if ("TAG".equals(name)) {
-                    final Map<Integer, DataReader<byte[]>> tagMap = (Map<Integer, DataReader<byte[]>>) field
-                            .get(reader);
-                    for (final Integer key : tagMap.keySet()) {
-                        final String tag = ReadTag.intToNameType4Bytes(key);
-                        map.put(tag, (DataReaderWithStats) tagMap.get(key));
-                    }
-                }
-            }
-        }
-
-        return map;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/reader/RefSeqIdReader.java b/src/main/java/htsjdk/samtools/cram/encoding/reader/RefSeqIdReader.java
deleted file mode 100644
index 1289429..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/reader/RefSeqIdReader.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright 2013 EMBL-EBI
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package htsjdk.samtools.cram.encoding.reader;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.Bases;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.HardClip;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.Padding;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadBase;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.Scores;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.ReadTag;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-
-/**
- * A reader that only keeps track of alignment spans. The intended use is for
- * CRAI index.
- * 
- * @author vadim
- *
- */
-public class RefSeqIdReader extends AbstractReader {
-	/**
-	 * Reference sequence id set by default
-	 */
-	private final int globalReferenceSequenceId;
-
-	/**
-	 * Alignment start to start counting from
-	 */
-	private int alignmentStart;
-	private ValidationStringency validationStringency;
-	/**
-	 * For diagnostic purposes
-	 */
-	private int recordCounter = 0;
-
-	/**
-	 * Single record to use for capturing read fields:
- 	 */
-	private final CramCompressionRecord cramRecord = new CramCompressionRecord();
-
-	/**
-	 * Detected sequence spans
-	 */
-	private final Map<Integer, AlignmentSpan> spans = new HashMap<>();
-
-	public RefSeqIdReader(final int seqId, final int alignmentStart, ValidationStringency validationStringency) {
-		super();
-		this.globalReferenceSequenceId = seqId;
-		this.alignmentStart = alignmentStart;
-		this.validationStringency = validationStringency;
-	}
-
-	public Map<Integer, AlignmentSpan> getReferenceSpans() {
-		return spans;
-	}
-
-	public void read() {
-		cramRecord.sequenceId = globalReferenceSequenceId;
-		try {
-			cramRecord.flags = bitFlagsCodec.readData();
-			cramRecord.compressionFlags = compressionBitFlagsCodec.readData();
-			if (refId == Slice.MULTI_REFERENCE)
-				cramRecord.sequenceId = refIdCodec.readData();
-			else
-				cramRecord.sequenceId = refId;
-
-			cramRecord.readLength = readLengthCodec.readData();
-			if (APDelta) {
-				cramRecord.alignmentDelta = alignmentStartCodec.readData();
-				alignmentStart += cramRecord.alignmentDelta;
-			}
-			else {
-				cramRecord.alignmentStart = alignmentStartCodec.readData();
-				alignmentStart = cramRecord.alignmentStart;
-			}
-
-			cramRecord.readGroupID = readGroupCodec.readData();
-
-			if (captureReadNames)
-				cramRecord.readName = new String(readNameCodec.readData(), charset);
-
-			// mate record:
-			if (cramRecord.isDetached()) {
-				cramRecord.mateFlags = mateBitFlagCodec.readData();
-				if (!captureReadNames)
-					cramRecord.readName = new String(readNameCodec.readData(), charset);
-
-				cramRecord.mateSequenceID = mateReferenceIdCodec.readData();
-				cramRecord.mateAlignmentStart = mateAlignmentStartCodec.readData();
-				cramRecord.templateSize = insertSizeCodec.readData();
-				detachedCount++;
-			} else if (cramRecord.isHasMateDownStream())
-				cramRecord.recordsToNextFragment = distanceToNextFragmentCodec.readData();
-
-			final Integer tagIdList = tagIdListCodec.readData();
-			final byte[][] ids = tagIdDictionary[tagIdList];
-			if (ids.length > 0) {
-				final int tagCount = ids.length;
-				cramRecord.tags = new ReadTag[tagCount];
-				for (int i = 0; i < ids.length; i++) {
-					final int id = ReadTag.name3BytesToInt(ids[i]);
-					final DataReader<byte[]> dataReader = tagValueCodecs.get(id);
-					final ReadTag tag = new ReadTag(id, dataReader.readData(), validationStringency);
-					cramRecord.tags[i] = tag;
-				}
-			}
-
-			if (!cramRecord.isSegmentUnmapped()) {
-				// reading read features:
-				final int size = numberOfReadFeaturesCodec.readData();
-				int prevPos = 0;
-				final java.util.List<ReadFeature> readFeatures = new LinkedList<>();
-				cramRecord.readFeatures = readFeatures;
-				for (int i = 0; i < size; i++) {
-					final Byte operator = readFeatureCodeCodec.readData();
-
-					final int pos = prevPos + readFeaturePositionCodec.readData();
-					prevPos = pos;
-
-					switch (operator) {
-					case ReadBase.operator:
-						final ReadBase readBase = new ReadBase(pos, baseCodec.readData(), qualityScoreCodec.readData());
-						readFeatures.add(readBase);
-						break;
-					case Substitution.operator:
-						final Substitution substitution = new Substitution();
-						substitution.setPosition(pos);
-						final byte code = baseSubstitutionCodec.readData();
-						substitution.setCode(code);
-						readFeatures.add(substitution);
-						break;
-					case Insertion.operator:
-						final Insertion insertion = new Insertion(pos, insertionCodec.readData());
-						readFeatures.add(insertion);
-						break;
-					case SoftClip.operator:
-						final SoftClip softClip = new SoftClip(pos, softClipCodec.readData());
-						readFeatures.add(softClip);
-						break;
-					case HardClip.operator:
-						final HardClip hardCLip = new HardClip(pos, hardClipCodec.readData());
-						readFeatures.add(hardCLip);
-						break;
-					case Padding.operator:
-						final Padding padding = new Padding(pos, paddingCodec.readData());
-						readFeatures.add(padding);
-						break;
-					case Deletion.operator:
-						final Deletion deletion = new Deletion(pos, deletionLengthCodec.readData());
-						readFeatures.add(deletion);
-						break;
-					case RefSkip.operator:
-						final RefSkip refSkip = new RefSkip(pos, refSkipCodec.readData());
-						readFeatures.add(refSkip);
-						break;
-					case InsertBase.operator:
-						final InsertBase insertBase = new InsertBase(pos, baseCodec.readData());
-						readFeatures.add(insertBase);
-						break;
-					case BaseQualityScore.operator:
-						final BaseQualityScore baseQualityScore = new BaseQualityScore(pos,
-								qualityScoreCodec.readData());
-						readFeatures.add(baseQualityScore);
-						break;
-					case Bases.operator:
-						final Bases bases = new Bases(pos, basesCodec.readData());
-						readFeatures.add(bases);
-						break;
-					case Scores.operator:
-						final Scores scores = new Scores(pos, scoresCodec.readData());
-						readFeatures.add(scores);
-						break;
-					default:
-						throw new RuntimeException("Unknown read feature operator: " + operator);
-					}
-				}
-
-				// mapping quality:
-				cramRecord.mappingQuality = mappingScoreCodec.readData();
-				if (cramRecord.isForcePreserveQualityScores()) {
-					cramRecord.qualityScores = qualityScoresCodec.readDataArray(cramRecord.readLength);
-				}
-			} else {
-				if (cramRecord.isUnknownBases()) {
-					cramRecord.readBases = SAMRecord.NULL_SEQUENCE;
-					cramRecord.qualityScores = SAMRecord.NULL_QUALS;
-				} else {
-					final byte[] bases = new byte[cramRecord.readLength];
-					for (int i = 0; i < bases.length; i++)
-						bases[i] = baseCodec.readData();
-					cramRecord.readBases = bases;
-
-					if (cramRecord.isForcePreserveQualityScores()) {
-						cramRecord.qualityScores = qualityScoresCodec.readDataArray(cramRecord.readLength);
-					}
-				}
-			}
-
-			recordCounter++;
-
-		} catch (final IOException e) {
-			throw new RuntimeIOException(e);
-		}
-
-		if (!spans.containsKey(cramRecord.sequenceId)) {
-			spans.put(cramRecord.sequenceId, new AlignmentSpan(alignmentStart, cramRecord.readLength));
-		} else
-			spans.get(cramRecord.sequenceId).addSingle(alignmentStart, cramRecord.readLength);
-	}
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/BaseQualityScore.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/BaseQualityScore.java
deleted file mode 100644
index 41a69d2..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/BaseQualityScore.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a single quality score in a read.
- */
-public class BaseQualityScore implements Serializable, ReadFeature {
-
-    private int position;
-    private byte qualityScore;
-
-    public static final byte operator = 'Q';
-
-    public BaseQualityScore(final int position, final byte qualityScore) {
-        this.position = position;
-        this.qualityScore = qualityScore;
-    }
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    @Override
-    public int getPosition() {
-        return position;
-    }
-
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    public byte getQualityScore() {
-        return qualityScore;
-    }
-
-    public void setQualityScore(final byte qualityScore) {
-        this.qualityScore = qualityScore;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof BaseQualityScore))
-            return false;
-
-        final BaseQualityScore v = (BaseQualityScore) obj;
-
-        return position == v.position && qualityScore == v.qualityScore;
-
-    }
-
-    @Override
-    public String toString() {
-        return new StringBuilder().append((char) operator).append('@')
-                .append(position).append('#').appendCodePoint(qualityScore).toString();
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Bases.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Bases.java
deleted file mode 100644
index b2f066b..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Bases.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-import java.util.Arrays;
-
-public class Bases implements Serializable, ReadFeature {
-
-    private int position;
-    private byte[] bases;
-
-    public byte[] getBases() {
-        return bases;
-    }
-
-    public void setBases(final byte[] bases) {
-        this.bases = bases;
-    }
-
-    public Bases() {
-    }
-
-    public Bases(final int position, final byte[] sequence) {
-        this.position = position;
-        this.bases = sequence;
-    }
-
-    public static final byte operator = 'b';
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    @Override
-    public int getPosition() {
-        return position;
-    }
-
-    @Override
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof Bases))
-            return false;
-
-        final Bases bases = (Bases) obj;
-
-        return position == bases.position && !Arrays.equals(this.bases, bases.bases);
-
-    }
-
-    @Override
-    public String toString() {
-        return getClass().getSimpleName() + "[" + "position=" + position + "; bases=" + new String(bases) + "] ";
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Deletion.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Deletion.java
deleted file mode 100644
index b4a0181..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Deletion.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a deletion of one or more bases similar to {@link htsjdk.samtools.CigarOperator#D}.
- */
-public class Deletion implements Serializable, ReadFeature {
-
-    private int position;
-    private int length;
-    public static final byte operator = 'D';
-
-    public Deletion() {
-    }
-
-    public Deletion(final int position, final int length) {
-        this.position = position;
-        this.length = length;
-    }
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    @Override
-    public int getPosition() {
-        return position;
-    }
-
-    @Override
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    public int getLength() {
-        return length;
-    }
-
-    public void setLength(final int length) {
-        this.length = length;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof Deletion))
-            return false;
-
-        final Deletion deleteion = (Deletion) obj;
-
-        return position == deleteion.position && length == deleteion.length;
-
-    }
-
-    @Override
-    public String toString() {
-        return String.valueOf((char) operator) + '@' + position + '+' + length;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/HardClip.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/HardClip.java
deleted file mode 100644
index 3c3c7ad..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/HardClip.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a hard clip similar to {@link htsjdk.samtools.CigarOperator#H}.
- */
-public class HardClip implements Serializable, ReadFeature {
-    public static final byte operator = 'H';
-
-    private int position;
-    private int length;
-
-    public HardClip() {
-    }
-
-    public HardClip(final int position, final int length) {
-        this.position = position;
-        this.length = length;
-    }
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    public int getPosition() {
-        return position;
-    }
-
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    public int getLength() {
-        return length;
-    }
-
-    public void setLength(final int length) {
-        this.length = length;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof HardClip))
-            return false;
-
-        final HardClip hardClip = (HardClip) obj;
-
-        return position == hardClip.position && length == hardClip.length;
-
-    }
-
-    @Override
-    public String toString() {
-        return getClass().getSimpleName() + "[" + "position=" + position + "; length=" + length + "] ";
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/InsertBase.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/InsertBase.java
deleted file mode 100644
index 5970413..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/InsertBase.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a single insert base.
- */
-public class InsertBase implements Serializable, ReadFeature {
-
-    private int position;
-    private byte base;
-    public static final byte operator = 'i';
-
-    public InsertBase() {
-    }
-
-    public InsertBase(final int position, final byte base) {
-        this.position = position;
-        this.base = base;
-    }
-
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    public int getPosition() {
-        return position;
-    }
-
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof InsertBase))
-            return false;
-
-        final InsertBase insertBase = (InsertBase) obj;
-
-        return position == insertBase.position && base == insertBase.base;
-
-    }
-
-    @Override
-    public String toString() {
-        return new StringBuilder().append((char) operator).append('@')
-                .append(position).append('\\').appendCodePoint(base).toString();
-    }
-
-    public byte getBase() {
-        return base;
-    }
-
-    public void setBase(final byte base) {
-        this.base = base;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Insertion.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Insertion.java
deleted file mode 100644
index e0182c3..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Insertion.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-import java.util.Arrays;
-
-/**
- * A read feature representing a multi-base insertion.
- */
-public class Insertion implements Serializable, ReadFeature {
-
-    private int position;
-    private byte[] sequence;
-    public static final byte operator = 'I';
-
-    public Insertion() {
-    }
-
-    public Insertion(final int position, final byte[] sequence) {
-        this.position = position;
-        this.sequence = sequence;
-    }
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    public int getPosition() {
-        return position;
-    }
-
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    public byte[] getSequence() {
-        return sequence;
-    }
-
-    public void setSequence(final byte[] sequence) {
-        this.sequence = sequence;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof Insertion))
-            return false;
-
-        final Insertion insertion = (Insertion) obj;
-
-        return position == insertion.position && Arrays.equals(sequence, insertion.sequence);
-    }
-
-    @Override
-    public String toString() {
-        return getClass().getSimpleName() + "[" + "position=" + position + "; sequence=" + new String(sequence) + "] ";
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Padding.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Padding.java
deleted file mode 100644
index 85e90fd..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Padding.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing padding, similar to {@link htsjdk.samtools.CigarOperator#P}.
- */
-public class Padding implements Serializable, ReadFeature {
-
-    private int position;
-    private int length;
-    public static final byte operator = 'P';
-
-    public Padding() {
-    }
-
-    public Padding(final int position, final int length) {
-        this.position = position;
-        this.length = length;
-    }
-
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    public int getPosition() {
-        return position;
-    }
-
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    public int getLength() {
-        return length;
-    }
-
-    public void setLength(final int length) {
-        this.length = length;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof Padding))
-            return false;
-
-        final Padding padding = (Padding) obj;
-
-        return position == padding.position && length == padding.length;
-
-    }
-
-    @Override
-    public String toString() {
-        return String.valueOf((char) operator) + '@' + position + '+' + length;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadBase.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadBase.java
deleted file mode 100644
index 73ae208..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadBase.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a single base with associated quality score.
- */
-public class ReadBase implements Serializable, ReadFeature {
-
-    private int position;
-    private byte base;
-    private byte qualityScore;
-
-    public static final byte operator = 'B';
-
-    public ReadBase(final int position, final byte base, final byte qualityScore) {
-        this.position = position;
-        this.base = base;
-        this.qualityScore = qualityScore;
-    }
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    @Override
-    public int getPosition() {
-        return position;
-    }
-
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    public byte getQualityScore() {
-        return qualityScore;
-    }
-
-    public void setQualityScore(final byte qualityScore) {
-        this.qualityScore = qualityScore;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof ReadBase))
-            return false;
-
-        final ReadBase readBase = (ReadBase) obj;
-
-        return position == readBase.position && base == readBase.base && qualityScore == readBase.qualityScore;
-
-    }
-
-    @Override
-    public String toString() {
-        return new StringBuilder(getClass().getSimpleName() + "[")
-                .append("position=").append(position)
-                .append("; base=").appendCodePoint(base)
-                .append("; score=").appendCodePoint(qualityScore)
-                .append("] ").toString();
-    }
-
-    public byte getBase() {
-        return base;
-    }
-
-    public void setBase(final byte base) {
-        this.base = base;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadFeature.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadFeature.java
deleted file mode 100644
index 863cd18..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadFeature.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-/**
- * An interface to capture data in read coordinates.
- */
-public interface ReadFeature {
-    /**
-     * @return zero-based position in the read
-     */
-    int getPosition();
-
-    void setPosition(int position);
-
-    /**
-     * Read features are distinguished by operator, similar to cigar operator.
-     * @return type of the read feature
-     */
-    byte getOperator();
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/RefSkip.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/RefSkip.java
deleted file mode 100644
index 1b99f09..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/RefSkip.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a reference skip similar to {@link htsjdk.samtools.CigarOperator#N}.
- */
-public class RefSkip implements Serializable, ReadFeature {
-
-    private int position;
-    private int length;
-    public static final byte operator = 'N';
-
-    public RefSkip() {
-    }
-
-    public RefSkip(final int position, final int length) {
-        this.position = position;
-        this.length = length;
-    }
-
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    public int getPosition() {
-        return position;
-    }
-
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    public int getLength() {
-        return length;
-    }
-
-    public void setLength(final int length) {
-        this.length = length;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof RefSkip))
-            return false;
-
-        final RefSkip refSkip = (RefSkip) obj;
-
-        return position == refSkip.position && length == refSkip.length;
-
-    }
-
-    @Override
-    public String toString() {
-        return String.valueOf((char) operator) + '@' + position + '+' + length;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Scores.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Scores.java
deleted file mode 100644
index bd409fd..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Scores.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-import java.util.Arrays;
-
-/**
- * A read feature representing a contiguous stretch of quality scores in a read.
- */
-public class Scores implements Serializable, ReadFeature {
-
-    private int position;
-    private byte[] scores;
-
-    public byte[] getScores() {
-        return scores;
-    }
-
-    public void setScores(final byte[] scores) {
-        this.scores = scores;
-    }
-
-    public Scores() {
-    }
-
-    public Scores(final int position, final byte[] sequence) {
-        this.position = position;
-        this.scores = sequence;
-    }
-
-    public static final byte operator = 'q';
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    @Override
-    public int getPosition() {
-        return position;
-    }
-
-    @Override
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof Scores))
-            return false;
-
-        final Scores scores = (Scores) obj;
-
-        return position == scores.position && !Arrays.equals(this.scores, scores.scores);
-
-    }
-
-    @Override
-    public String toString() {
-        return getClass().getSimpleName() + "[" + "position=" + position + "; scores=" + new String(scores) + "] ";
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/SoftClip.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/SoftClip.java
deleted file mode 100644
index b142595..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/SoftClip.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-import java.util.Arrays;
-
-/**
- * A read feature representing a soft clip similar to {@link htsjdk.samtools.CigarOperator#S}.
- */
-public class SoftClip implements Serializable, ReadFeature {
-
-    private int position;
-    private byte[] sequence;
-
-    public byte[] getSequence() {
-        return sequence;
-    }
-
-    public void setSequence(final byte[] sequence) {
-        this.sequence = sequence;
-    }
-
-    public SoftClip() {
-    }
-
-    public SoftClip(final int position, final byte[] sequence) {
-        this.position = position;
-        this.sequence = sequence;
-    }
-
-    public static final byte operator = 'S';
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    public int getPosition() {
-        return position;
-    }
-
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof SoftClip))
-            return false;
-
-        final SoftClip softClip = (SoftClip) obj;
-
-        return position == softClip.position && !Arrays.equals(sequence, softClip.sequence);
-
-    }
-
-    @Override
-    public String toString() {
-        return getClass().getSimpleName() + "[" + "position=" + position + "; bases=" + new String(sequence) + "] ";
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Substitution.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Substitution.java
deleted file mode 100644
index b2ed5de..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Substitution.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A substitution event captured in read coordinates. It is characterized by position in read, read base and reference base.
- * The class is also responsible for converting combinations of read base and reference base into a byte value (code).
- */
-public class Substitution implements Serializable, ReadFeature {
-    public static final int NO_CODE = -1;
-
-    /**
-     * zero-based position in read
-     */
-    private int position;
-    /**
-     * The read base (ACGTN)
-     */
-    private byte base = -1;
-    /**
-     * The reference sequence base matching the position of this substitution.
-     */
-    private byte referenceBase = -1;
-    /**
-     * A byte value denoting combination of the read base and the reference base.
-     */
-    private byte code = NO_CODE;
-
-    public byte getCode() {
-        return code;
-    }
-
-    public void setCode(final byte code) {
-        this.code = code;
-    }
-
-    public static final byte operator = 'X';
-
-    @Override
-    public byte getOperator() {
-        return operator;
-    }
-
-    public int getPosition() {
-        return position;
-    }
-
-    public void setPosition(final int position) {
-        this.position = position;
-    }
-
-    public byte getBase() {
-        return base;
-    }
-
-    public void setBase(final byte base) {
-        this.base = base;
-    }
-
-    public byte getReferenceBase() {
-        return referenceBase;
-    }
-
-    public void setReferenceBase(final byte referenceBase) {
-        this.referenceBase = referenceBase;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof Substitution))
-            return false;
-
-        final Substitution substitution = (Substitution) obj;
-
-        if (position != substitution.position)
-            return false;
-
-        if ((code != substitution.code) & (code == NO_CODE || substitution.code == NO_CODE)) {
-            return false;
-        }
-
-        if (code > NO_CODE && substitution.code > NO_CODE) {
-            if (referenceBase != substitution.referenceBase) return false;
-            if (base != substitution.base) return false;
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return String.valueOf((char) operator) + '@' + position + '\\' + (char) base + (char) referenceBase;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriter.java b/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriter.java
deleted file mode 100644
index c50254e..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.writer;
-
-import java.io.IOException;
-
-/**
- * A basic interface defining a writer. It can ... write!
- * In terms of CRAM this is an abstraction to get rid off implementation details like what is data and where to write to. Pure consumer.
- * Note: the interface does not have writeArray method like it's counterpart {@link htsjdk.samtools.cram.encoding.reader.DataReader} because
- * array length is known when writing, therefore the same interface can be used both for single objects and arrays.
- *
- * @param <T> data type of the series to be written.
- */
-public interface DataWriter<T> {
-
-    /**
-     * Write some data out.
-     *
-     * @param value data to be written
-     * @return number of bits written
-     * @throws IOException as per java IO contract
-     */
-    @SuppressWarnings("UnusedReturnValue")
-    long writeData(T value) throws IOException;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriterFactory.java b/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriterFactory.java
deleted file mode 100644
index 3980c82..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriterFactory.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.writer;
-
-import htsjdk.samtools.cram.encoding.BitCodec;
-import htsjdk.samtools.cram.encoding.DataSeries;
-import htsjdk.samtools.cram.encoding.DataSeriesMap;
-import htsjdk.samtools.cram.encoding.DataSeriesType;
-import htsjdk.samtools.cram.encoding.Encoding;
-import htsjdk.samtools.cram.encoding.EncodingFactory;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
-public class DataWriterFactory {
-
-    public Writer buildWriter(final BitOutputStream bitOutputStream,
-                              final Map<Integer, ExposedByteArrayOutputStream> outputMap,
-                              final CompressionHeader h, final int refId) throws IllegalArgumentException,
-            IllegalAccessException {
-        final Writer writer = new Writer();
-        writer.setCaptureReadNames(h.readNamesIncluded);
-        writer.refId = refId;
-        writer.substitutionMatrix = h.substitutionMatrix;
-        writer.AP_delta = h.APDelta;
-
-        for (final Field f : writer.getClass().getFields()) {
-            if (f.isAnnotationPresent(DataSeries.class)) {
-                final DataSeries ds = f.getAnnotation(DataSeries.class);
-                final EncodingKey key = ds.key();
-                final DataSeriesType type = ds.type();
-
-                f.set(writer,
-                        createWriter(type, h.encodingMap.get(key), bitOutputStream, outputMap));
-            }
-
-            if (f.isAnnotationPresent(DataSeriesMap.class)) {
-                final DataSeriesMap dsm = f.getAnnotation(DataSeriesMap.class);
-                final String name = dsm.name();
-                if ("TAG".equals(name)) {
-                    final Map<Integer, DataWriter<byte[]>> map = new HashMap<Integer, DataWriter<byte[]>>();
-                    for (final Integer key : h.tMap.keySet()) {
-                        final EncodingParams params = h.tMap.get(key);
-                        final DataWriter<byte[]> tagWriter = createWriter(
-                                DataSeriesType.BYTE_ARRAY, params, bitOutputStream,
-                                outputMap);
-                        map.put(key, tagWriter);
-                    }
-                    f.set(writer, map);
-                }
-            }
-        }
-
-        return writer;
-    }
-
-    private <T> DataWriter<T> createWriter(final DataSeriesType valueType,
-                                           final EncodingParams params, final BitOutputStream bitOutputStream,
-                                           final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
-        final EncodingFactory f = new EncodingFactory();
-        final Encoding<T> encoding = f.createEncoding(valueType, params.id);
-        if (encoding == null)
-            throw new RuntimeException("Encoding not found: value type="
-                    + valueType.name() + ", encoding id=" + params.id.name());
-
-        encoding.fromByteArray(params.params);
-
-        return new DefaultDataWriter<T>(encoding.buildCodec(null, outputMap),
-                bitOutputStream);
-    }
-
-    private static class DefaultDataWriter<T> implements DataWriter<T> {
-        private final BitCodec<T> codec;
-        private final BitOutputStream bitOutputStream;
-
-        public DefaultDataWriter(final BitCodec<T> codec, final BitOutputStream bitOutputStream) {
-            this.codec = codec;
-            this.bitOutputStream = bitOutputStream;
-        }
-
-        @Override
-        public long writeData(final T value) throws IOException {
-            return codec.write(bitOutputStream, value);
-        }
-
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/writer/Writer.java b/src/main/java/htsjdk/samtools/cram/encoding/writer/Writer.java
deleted file mode 100644
index 3686f44..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/writer/Writer.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.writer;
-
-import htsjdk.samtools.cram.encoding.DataSeries;
-import htsjdk.samtools.cram.encoding.DataSeriesMap;
-import htsjdk.samtools.cram.encoding.DataSeriesType;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.HardClip;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.Padding;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadBase;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.util.Map;
-
- at SuppressWarnings({"UnusedDeclaration", "WeakerAccess"})
-public class Writer {
-
-    private Charset charset = Charset.forName("UTF8");
-    private boolean captureReadNames = false;
-
-    @DataSeries(key = EncodingKey.BF_BitFlags, type = DataSeriesType.INT)
-    public DataWriter<Integer> bitFlagsC;
-
-    @DataSeries(key = EncodingKey.CF_CompressionBitFlags, type = DataSeriesType.BYTE)
-    public DataWriter<Byte> compBitFlagsC;
-
-    @DataSeries(key = EncodingKey.RL_ReadLength, type = DataSeriesType.INT)
-    public DataWriter<Integer> readLengthC;
-
-    @DataSeries(key = EncodingKey.AP_AlignmentPositionOffset, type = DataSeriesType.INT)
-    public DataWriter<Integer> alStartC;
-
-    @DataSeries(key = EncodingKey.RG_ReadGroup, type = DataSeriesType.INT)
-    public DataWriter<Integer> readGroupC;
-
-    @DataSeries(key = EncodingKey.RN_ReadName, type = DataSeriesType.BYTE_ARRAY)
-    public DataWriter<byte[]> readNameC;
-
-    @DataSeries(key = EncodingKey.NF_RecordsToNextFragment, type = DataSeriesType.INT)
-    public DataWriter<Integer> distanceC;
-
-    @DataSeriesMap(name = "TAG")
-    public Map<Integer, DataWriter<byte[]>> tagValueCodecs;
-
-    @DataSeries(key = EncodingKey.FN_NumberOfReadFeatures, type = DataSeriesType.INT)
-    public DataWriter<Integer> numberOfReadFeaturesCodec;
-
-    @DataSeries(key = EncodingKey.FP_FeaturePosition, type = DataSeriesType.INT)
-    public DataWriter<Integer> featurePositionCodec;
-
-    @DataSeries(key = EncodingKey.FC_FeatureCode, type = DataSeriesType.BYTE)
-    public DataWriter<Byte> featuresCodeCodec;
-
-    @DataSeries(key = EncodingKey.BA_Base, type = DataSeriesType.BYTE)
-    public DataWriter<Byte> baseCodec;
-
-    @DataSeries(key = EncodingKey.QS_QualityScore, type = DataSeriesType.BYTE)
-    public DataWriter<Byte> qualityScoreCodec;
-
-    @DataSeries(key = EncodingKey.QS_QualityScore, type = DataSeriesType.BYTE_ARRAY)
-    public DataWriter<byte[]> qualityScoreArrayCodec;
-
-    @DataSeries(key = EncodingKey.BS_BaseSubstitutionCode, type = DataSeriesType.BYTE)
-    public DataWriter<Byte> baseSubstitutionCodeCodec;
-
-    @DataSeries(key = EncodingKey.IN_Insertion, type = DataSeriesType.BYTE_ARRAY)
-    public DataWriter<byte[]> insertionCodec;
-
-    @DataSeries(key = EncodingKey.SC_SoftClip, type = DataSeriesType.BYTE_ARRAY)
-    public DataWriter<byte[]> softClipCodec;
-
-    @DataSeries(key = EncodingKey.HC_HardClip, type = DataSeriesType.INT)
-    public DataWriter<Integer> hardClipCodec;
-
-    @DataSeries(key = EncodingKey.PD_padding, type = DataSeriesType.INT)
-    public DataWriter<Integer> paddingCodec;
-
-    @DataSeries(key = EncodingKey.DL_DeletionLength, type = DataSeriesType.INT)
-    public DataWriter<Integer> deletionLengthCodec;
-
-    @DataSeries(key = EncodingKey.MQ_MappingQualityScore, type = DataSeriesType.INT)
-    public DataWriter<Integer> mappingQualityScoreCodec;
-
-    @DataSeries(key = EncodingKey.MF_MateBitFlags, type = DataSeriesType.BYTE)
-    public DataWriter<Byte> mateBitFlagsCodec;
-
-    @DataSeries(key = EncodingKey.NS_NextFragmentReferenceSequenceID, type = DataSeriesType.INT)
-    public DataWriter<Integer> nextFragmentReferenceSequenceIDCodec;
-
-    @DataSeries(key = EncodingKey.NP_NextFragmentAlignmentStart, type = DataSeriesType.INT)
-    public DataWriter<Integer> nextFragmentAlignmentStart;
-
-    @DataSeries(key = EncodingKey.TS_InsetSize, type = DataSeriesType.INT)
-    public DataWriter<Integer> templateSize;
-
-    @DataSeries(key = EncodingKey.TL_TagIdList, type = DataSeriesType.INT)
-    public DataWriter<Integer> tagIdListCodec;
-
-    @DataSeries(key = EncodingKey.RI_RefId, type = DataSeriesType.INT)
-    public DataWriter<Integer> refIdCodec;
-
-    @DataSeries(key = EncodingKey.RS_RefSkip, type = DataSeriesType.INT)
-    public DataWriter<Integer> refSkipCodec;
-
-    public int refId;
-    public SubstitutionMatrix substitutionMatrix;
-    public boolean AP_delta = true;
-
-    public static int detachedCount = 0;
-
-    public void write(final CramCompressionRecord r) throws IOException {
-        bitFlagsC.writeData(r.flags);
-        compBitFlagsC.writeData(r.getCompressionFlags());
-        if (refId == -2)
-            refIdCodec.writeData(r.sequenceId);
-
-        readLengthC.writeData(r.readLength);
-
-        if (AP_delta)
-            alStartC.writeData(r.alignmentDelta);
-        else
-            alStartC.writeData(r.alignmentStart);
-
-        readGroupC.writeData(r.readGroupID);
-
-        if (isCaptureReadNames()) {
-            readNameC.writeData(r.readName.getBytes(charset));
-        }
-
-        // mate record:
-        if (r.isDetached()) {
-            mateBitFlagsCodec.writeData(r.getMateFlags());
-            if (!isCaptureReadNames())
-                readNameC.writeData(r.readName.getBytes(charset));
-
-            nextFragmentReferenceSequenceIDCodec.writeData(r.mateSequenceID);
-            nextFragmentAlignmentStart.writeData(r.mateAlignmentStart);
-            templateSize.writeData(r.templateSize);
-
-            detachedCount++;
-        } else if (r.isHasMateDownStream())
-            distanceC.writeData(r.recordsToNextFragment);
-
-        // tag records:
-        tagIdListCodec.writeData(r.tagIdsIndex.value);
-        if (r.tags != null) {
-            for (int i = 0; i < r.tags.length; i++) {
-                final DataWriter<byte[]> writer = tagValueCodecs.get(r.tags[i].keyType3BytesAsInt);
-                writer.writeData(r.tags[i].getValueAsByteArray());
-            }
-        }
-
-        if (!r.isSegmentUnmapped()) {
-            // writing read features:
-            numberOfReadFeaturesCodec.writeData(r.readFeatures.size());
-            int prevPos = 0;
-            for (final ReadFeature f : r.readFeatures) {
-                featuresCodeCodec.writeData(f.getOperator());
-                switch (f.getOperator()) {
-                    case Substitution.operator:
-                        break;
-
-                    default:
-                        break;
-                }
-
-                featurePositionCodec.writeData(f.getPosition() - prevPos);
-                prevPos = f.getPosition();
-
-                switch (f.getOperator()) {
-                    case ReadBase.operator:
-                        final ReadBase rb = (ReadBase) f;
-                        baseCodec.writeData(rb.getBase());
-                        qualityScoreCodec.writeData(rb.getQualityScore());
-                        break;
-                    case Substitution.operator:
-                        final Substitution sv = (Substitution) f;
-                        if (sv.getCode() < 0)
-                            baseSubstitutionCodeCodec.writeData(substitutionMatrix.code(sv.getReferenceBase(), sv.getBase()));
-                        else
-                            baseSubstitutionCodeCodec.writeData(sv.getCode());
-                        // baseSubstitutionCodec.writeData((byte) sv.getBaseChange().getChange());
-                        break;
-                    case Insertion.operator:
-                        final Insertion iv = (Insertion) f;
-                        insertionCodec.writeData(iv.getSequence());
-                        break;
-                    case SoftClip.operator:
-                        final SoftClip fv = (SoftClip) f;
-                        softClipCodec.writeData(fv.getSequence());
-                        break;
-                    case HardClip.operator:
-                        final HardClip hv = (HardClip) f;
-                        hardClipCodec.writeData(hv.getLength());
-                        break;
-                    case Padding.operator:
-                        final Padding pv = (Padding) f;
-                        paddingCodec.writeData(pv.getLength());
-                        break;
-                    case Deletion.operator:
-                        final Deletion dv = (Deletion) f;
-                        deletionLengthCodec.writeData(dv.getLength());
-                        break;
-                    case RefSkip.operator:
-                        final RefSkip rsv = (RefSkip) f;
-                        refSkipCodec.writeData(rsv.getLength());
-                        break;
-                    case InsertBase.operator:
-                        final InsertBase ib = (InsertBase) f;
-                        baseCodec.writeData(ib.getBase());
-                        break;
-                    case BaseQualityScore.operator:
-                        final BaseQualityScore bqs = (BaseQualityScore) f;
-                        qualityScoreCodec.writeData(bqs.getQualityScore());
-                        break;
-                    default:
-                        throw new RuntimeException("Unknown read feature operator: " + (char) f.getOperator());
-                }
-            }
-
-            // mapping quality:
-            mappingQualityScoreCodec.writeData(r.mappingQuality);
-            if (r.isForcePreserveQualityScores()) {
-                qualityScoreArrayCodec.writeData(r.qualityScores);
-            }
-        } else {
-            if (!r.isUnknownBases())
-                for (final byte b : r.readBases)
-                    baseCodec.writeData(b);
-            if (r.isForcePreserveQualityScores()) {
-                qualityScoreArrayCodec.writeData(r.qualityScores);
-            }
-        }
-    }
-
-    public boolean isCaptureReadNames() {
-        return captureReadNames;
-    }
-
-    public void setCaptureReadNames(final boolean captureReadNames) {
-        this.captureReadNames = captureReadNames;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/BitInputStream.java b/src/main/java/htsjdk/samtools/cram/io/BitInputStream.java
deleted file mode 100644
index 95300f3..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/BitInputStream.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * An interface to describe the requirements for reading bit data as opposed to bytes. Implementors must keep track of the amount of data
- * read similar to {@link InputStream} concept.
- */
-public interface BitInputStream {
-
-    /**
-     * Reads a single bit from the stream.
-     *
-     * @throws IOException as per streaming contract in java.
-     */
-    boolean readBit() throws IOException;
-
-    /**
-     * Read specified number of bits from the stream. The bits are return in an integer value.
-     *
-     * @param length number of bits to read
-     * @throws IOException as per streaming contract in java.
-     */
-    int readBits(int length) throws IOException;
-
-    /**
-     * Read specified number of bits from the stream. The bits are return in a long value.
-     *
-     * @param length number of bits to read
-     * @throws IOException as per streaming contract in java.
-     */
-    long readLongBits(int length) throws IOException;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/BitOutputStream.java b/src/main/java/htsjdk/samtools/cram/io/BitOutputStream.java
deleted file mode 100644
index b2a081f..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/BitOutputStream.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.Closeable;
-import java.io.Flushable;
-import java.io.IOException;
-import java.io.OutputStream;
-
-
-/**
- * An interface to describe the requirements for writing out bits as opposed to bytes. Implementors must keep track of the amount of data
- * written similar to {@link OutputStream} concept and provide flush/close functionality accordingly.
- */
-public interface BitOutputStream extends Closeable, Flushable {
-
-    /**
-     * Write specified number of bits supplied in the integer value. The method is naturally limited to 32 bits max.
-     * @param bitContainer an integer containing the bits to be written out
-     * @param nofBits the number of bits to written out, minimum 0, maximum 32.
-     * @throws IOException as per streaming contract in java.
-     */
-    void write(int bitContainer, int nofBits) throws IOException;
-
-
-    /**
-     * Write specified number of bits supplied in the long value. The method is naturally limited to 64 bits max.
-     * @param bitContainer an integer containing the bits to be written out
-     * @param nofBits the number of bits to written out, minimum 0, maximum 64.
-     * @throws IOException as per streaming contract in java.
-     */
-    void write(long bitContainer, int nofBits) throws IOException;
-
-
-    /**
-     * Write specified number of bits supplied in the byte value. The method is naturally limited to 8 bits max.
-     * @param bitContainer an integer containing the bits to be written out
-     * @param nofBits the number of bits to written out, minimum 0, maximum 8.
-     * @throws IOException as per streaming contract in java.
-     */
-    void write(byte bitContainer, int nofBits) throws IOException;
-
-
-    /**
-     * Write a single bit specified in the boolean argument.
-     * @param bit emit 1 if true, 0 otherwise.
-     * @throws IOException as per streaming contract in java.
-     */
-    void write(boolean bit) throws IOException;
-
-    /**
-     * Write a single bit specified in the boolean argument repeatedly.
-     * @param bit emit 1 if true, 0 otherwise.
-     * @param repeat the number of bits to emit.
-     * @throws IOException as per streaming contract in java.
-     */
-    void write(boolean bit, long repeat) throws IOException;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/CRC32InputStream.java b/src/main/java/htsjdk/samtools/cram/io/CRC32InputStream.java
deleted file mode 100644
index 31e957e..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/CRC32InputStream.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.CRC32;
-
-/**
- * An input stream that calculates CRC32 of all the bytes passed through it. The java {@link java.util.zip.CRC32}
- * class is used to internally.
- */
-public class CRC32InputStream extends InputStream {
-    private final InputStream delegate;
-    private final CRC32 crc32 = new CRC32();
-
-    public CRC32InputStream(final InputStream delegate) {
-        super();
-        this.delegate = delegate;
-    }
-
-    public int getCRC32() {
-        return (int) (crc32.getValue());
-    }
-
-    @Override
-    public int read() throws IOException {
-        final int value = delegate.read();
-        if (value != -1)
-            crc32.update(value);
-        return value;
-    }
-
-    @Override
-    public int read(@SuppressWarnings("NullableProblems") final byte[] b) throws IOException {
-        final int result = delegate.read(b);
-        if (result != -1)
-            crc32.update(b, 0, result);
-        return result;
-    }
-
-    @Override
-    public int read(@SuppressWarnings("NullableProblems") final byte[] b, final int off, final int length) throws IOException {
-        final int result = delegate.read(b, off, length);
-        crc32.update(b, off, result);
-        return result;
-    }
-
-    @Override
-    public long skip(final long n) throws IOException {
-        return delegate.skip(n);
-    }
-
-    @Override
-    public int available() throws IOException {
-        return delegate.available();
-    }
-
-    @Override
-    public void close() throws IOException {
-        delegate.close();
-    }
-
-    @Override
-    public void mark(final int readLimit) {
-        delegate.mark(readLimit);
-    }
-
-    @Override
-    public void reset() throws IOException {
-        delegate.reset();
-    }
-
-    @Override
-    public boolean markSupported() {
-        return delegate.markSupported();
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/CRC32OutputStream.java b/src/main/java/htsjdk/samtools/cram/io/CRC32OutputStream.java
deleted file mode 100644
index dff2137..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/CRC32OutputStream.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.zip.CRC32;
-
-/**
- * An output stream that calculates CRC32 checksum of all the bytes written through the stream. The java {@link java.util.zip.CRC32}
- * class is used to internally.
- */
-public class CRC32OutputStream extends FilterOutputStream {
-
-    private final CRC32 crc32 = new CRC32();
-
-    public CRC32OutputStream(final OutputStream out) {
-        super(out);
-    }
-
-    @Override
-    public void write(@SuppressWarnings("NullableProblems") final byte[] b, final int off, final int length) throws IOException {
-        crc32.update(b, off, length);
-        out.write(b, off, length);
-    }
-
-    @Override
-    public void write(final int b) throws IOException {
-        crc32.update(b);
-        out.write(b);
-    }
-
-    @Override
-    public void write(@SuppressWarnings("NullableProblems") final byte[] b) throws IOException {
-        crc32.update(b);
-        out.write(b);
-    }
-
-    public long getLongCrc32() {
-        return crc32.getValue();
-    }
-
-    public byte[] getCrc32_BigEndian() {
-        final long value = crc32.getValue();
-        return new byte[]{(byte) (0xFF & (value >> 24)),
-                (byte) (0xFF & (value >> 16)), (byte) (0xFF & (value >> 8)),
-                (byte) (0xFF & value)};
-    }
-
-    public byte[] getCrc32_LittleEndian() {
-        final long value = crc32.getValue();
-        return new byte[]{(byte) (0xFF & (value)),
-                (byte) (0xFF & (value >> 8)), (byte) (0xFF & (value >> 16)),
-                (byte) (0xFF & (value >> 24))};
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/CountingInputStream.java b/src/main/java/htsjdk/samtools/cram/io/CountingInputStream.java
deleted file mode 100644
index b5e5642..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/CountingInputStream.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * An input stream that counts the bytes read from it.
- */
-public class CountingInputStream extends InputStream {
-    private final InputStream delegate;
-    private long count = 0;
-
-    public CountingInputStream(final InputStream inputStream) {
-        delegate = inputStream;
-    }
-
-    @Override
-    public int read() throws IOException {
-        count++;
-        return delegate.read();
-    }
-
-    public int read(@SuppressWarnings("NullableProblems") final byte[] b) throws IOException {
-        final int read = delegate.read(b);
-        count += read;
-        return read;
-    }
-
-    public int read(@SuppressWarnings("NullableProblems") final byte[] b, final int off, final int length) throws IOException {
-        final int read = delegate.read(b, off, length);
-        count += read;
-        return read;
-    }
-
-    public long skip(final long n) throws IOException {
-        final long skipped = delegate.skip(n);
-        count += skipped;
-        return skipped;
-    }
-
-    public int available() throws IOException {
-        return delegate.available();
-    }
-
-    public void close() throws IOException {
-        if (delegate != null)
-            delegate.close();
-    }
-
-    public void mark(final int readLimit) {
-        delegate.mark(readLimit);
-    }
-
-    public void reset() throws IOException {
-        delegate.reset();
-        count = 0;
-    }
-
-    public boolean markSupported() {
-        return delegate.markSupported();
-    }
-
-    public long getCount() {
-        return count;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/CramArray.java b/src/main/java/htsjdk/samtools/cram/io/CramArray.java
deleted file mode 100644
index 819319e..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/CramArray.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Methods to read and write CRAM array of integers data type.
- */
-public class CramArray {
-    /**
-     * Read CRAM int array from a {@link InputStream}.
-     *
-     * @param inputStream the inputs stream to read from
-     * @return array of integers from the input stream
-     * @throws IOException as per java IO contract
-     */
-    public static int[] array(final InputStream inputStream) throws IOException {
-        final int size = ITF8.readUnsignedITF8(inputStream);
-        final int[] array = new int[size];
-        for (int i = 0; i < size; i++)
-            array[i] = ITF8.readUnsignedITF8(inputStream);
-
-        return array;
-    }
-
-    /**
-     * Write CRAM int array to a {@link OutputStream}.
-     *
-     * @param array the array to be written
-     * @param outputStream    the output stream to write to
-     * @return the number of bits written out
-     * @throws IOException as per java IO contract
-     */
-    public static int write(final int[] array, final OutputStream outputStream) throws IOException {
-        int length = ITF8.writeUnsignedITF8(array.length, outputStream);
-        for (final int intValue : array) length += ITF8.writeUnsignedITF8(intValue, outputStream);
-
-        return length;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/CramInt.java b/src/main/java/htsjdk/samtools/cram/io/CramInt.java
deleted file mode 100644
index 1b0432f..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/CramInt.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-
-/**
- * Methods to read and write CRAM int values as given in the file format specification.
- */
-
-public class CramInt {
-    /**
-     * Read unsigned little-endian 4 byte integer from an {@link InputStream}.
-     *
-     * @param inputStream input stream to read from
-     * @return an integer value read
-     * @throws IOException as per java IO contract
-     */
-    public static int int32(final InputStream inputStream) throws IOException {
-        return inputStream.read() | inputStream.read() << 8 | inputStream.read() << 16 | inputStream.read() << 24;
-    }
-
-    /**
-     * Read unsigned little-endian 4 byte integer from an array of bytes.
-     *
-     * @param data input stream to read from
-     * @return an integer value read
-     */
-    public static int int32(final byte[] data) {
-        if (data.length != 4)
-            throw new IllegalArgumentException("Expecting a 4-byte integer. ");
-        return (0xFF & data[0]) | ((0xFF & data[1]) << 8) | ((0xFF & data[2]) << 16) | ((0xFF & data[3]) << 24);
-    }
-
-    /**
-     * Read unsigned little-endian 4 byte integer from an {@link ByteBuffer}.
-     *
-     * @param buffer {@link ByteBuffer} to read from
-     * @return an integer value read from the buffer
-     */
-    public static int int32(final ByteBuffer buffer) {
-        return buffer.get() | buffer.get() << 8 | buffer.get() << 16 | buffer.get() << 24;
-    }
-
-    /**
-     * Write int value to {@link OutputStream} encoded as CRAM int data type.
-     *
-     * @param value value to be written out
-     * @param outputStream    the output stream
-     * @return the number of bits written out
-     * @throws IOException as per java IO contract
-     */
-    @SuppressWarnings("SameReturnValue")
-    public static int writeInt32(final int value, final OutputStream outputStream) throws IOException {
-        outputStream.write((byte) value);
-        outputStream.write((byte) (value >> 8));
-        outputStream.write((byte) (value >> 16));
-        outputStream.write((byte) (value >> 24));
-        return 4 * 8;
-    }
-
-    /**
-     * Write int value to {@link OutputStream} encoded as CRAM int data type.
-     *
-     * @param value value to be written out
-     * @return the byte array holding the value encoded as CRAM int data type
-     */
-    public static byte[] writeInt32(final int value) {
-        final byte[] data = new byte[4];
-        data[0] = (byte) (value & 0xFF);
-        data[1] = (byte) (value >> 8 & 0xFF);
-        data[2] = (byte) (value >> 16 & 0xFF);
-        data[3] = (byte) (value >> 24 & 0xFF);
-        return data;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/DefaultBitInputStream.java b/src/main/java/htsjdk/samtools/cram/io/DefaultBitInputStream.java
deleted file mode 100644
index 519cf9d..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/DefaultBitInputStream.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.DataInputStream;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Must not read from delegate unless no bits left in the buffer!!!
- *
- * @author vadim
- */
-public class DefaultBitInputStream extends DataInputStream implements BitInputStream {
-
-    private int nofBufferedBits = 0;
-    private int byteBuffer = 0;
-    private boolean throwEOF = false;
-    private static final long[] masks = new long[]{0, (1L << 1) - 1, (1L << 2) - 1, (1L << 3) - 1, (1L << 4) - 1,
-            (1L << 5) - 1, (1L << 6) - 1, (1L << 7) - 1, (1L << 8) - 1};
-
-    public DefaultBitInputStream(final InputStream in) {
-
-        super(in);
-        this.throwEOF = true;
-    }
-
-    public final boolean readBit() throws IOException {
-        if (--nofBufferedBits >= 0)
-            return ((byteBuffer >>> nofBufferedBits) & 1) == 1;
-
-        nofBufferedBits = 7;
-        byteBuffer = in.read();
-        if (byteBuffer == -1) {
-            if (throwEOF)
-                throw new EOFException("End of stream.");
-        }
-
-        return ((byteBuffer >>> 7) & 1) == 1;
-    }
-
-    public final int readBits(int n) throws IOException {
-        if (n == 0)
-            return 0;
-        int x = 0;
-        while (n > nofBufferedBits) {
-            n -= nofBufferedBits;
-            x |= rightBits(nofBufferedBits, byteBuffer) << n;
-            byteBuffer = in.read();
-            if (byteBuffer == -1) {
-                throw new EOFException("End of stream.");
-            }
-
-            nofBufferedBits = 8;
-        }
-        nofBufferedBits -= n;
-        return x | rightBits(n, byteBuffer >>> nofBufferedBits);
-    }
-
-    private static int rightBits(final int n, final int x) {
-        return x & ((1 << n) - 1);
-    }
-
-    public final long readLongBits(int n) throws IOException {
-        if (n > 64)
-            throw new RuntimeException("More then 64 bits are requested in one read from bit stream.");
-
-        if (n == 0)
-            return 0;
-
-        long x = 0;
-        long byteBuffer = this.byteBuffer;
-        if (nofBufferedBits == 0) {
-            byteBuffer = in.read();
-            if (byteBuffer == -1) {
-                throw new EOFException("End of stream.");
-            }
-            nofBufferedBits = 8;
-        }
-        byteBuffer &= masks[nofBufferedBits];
-        while (n > nofBufferedBits) {
-            n -= nofBufferedBits;
-            x |= byteBuffer << n;
-            byteBuffer = in.read();
-            if (byteBuffer == -1) {
-                throw new EOFException("End of stream.");
-            }
-            nofBufferedBits = 8;
-        }
-        nofBufferedBits -= n;
-        this.byteBuffer = (int) (byteBuffer & masks[nofBufferedBits]);
-        return x | (byteBuffer >>> nofBufferedBits);
-    }
-
-    public void reset() {
-        nofBufferedBits = 0;
-        byteBuffer = 0;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/DefaultBitOutputStream.java b/src/main/java/htsjdk/samtools/cram/io/DefaultBitOutputStream.java
deleted file mode 100644
index 2d702ee..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/DefaultBitOutputStream.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-public class DefaultBitOutputStream extends OutputStream implements BitOutputStream {
-
-    private static final byte[] bitMasks = new byte[8];
-
-    static {
-        for (byte i = 0; i < 8; i++)
-            bitMasks[i] = (byte) (~(0xFF >>> i));
-    }
-
-    private final OutputStream out;
-
-    private int bufferByte = 0;
-    private int bufferedNumberOfBits = 0;
-
-    public DefaultBitOutputStream(final OutputStream delegate) {
-        this.out = delegate;
-    }
-
-    public void write(final byte b) throws IOException {
-        out.write((int) b);
-    }
-
-    @Override
-    public void write(final int value) throws IOException {
-        out.write(value);
-    }
-
-    @Override
-    public String toString() {
-        return "DefaultBitOutputStream: "
-                + Integer.toBinaryString(bufferByte).substring(0, bufferedNumberOfBits);
-    }
-
-    public void write(final long bitContainer, final int nofBits) throws IOException {
-        if (nofBits == 0)
-            return;
-
-        if (nofBits < 1 || nofBits > 64)
-            throw new IOException("Expecting 1 to 64 bits, got: value=" + bitContainer + ", nofBits=" + nofBits);
-
-        if (nofBits <= 8)
-            write((byte) bitContainer, nofBits);
-        else {
-            for (int i = nofBits - 8; i >= 0; i -= 8) {
-                final byte v = (byte) (bitContainer >>> i);
-                writeByte(v);
-            }
-            if (nofBits % 8 != 0) {
-                final byte v = (byte) bitContainer;
-                write(v, nofBits % 8);
-            }
-        }
-    }
-
-    void write_int_LSB_0(final int value, final int nofBitsToWrite) throws IOException {
-        if (nofBitsToWrite == 0)
-            return;
-
-        if (nofBitsToWrite < 1 || nofBitsToWrite > 32)
-            throw new IOException("Expecting 1 to 32 bits.");
-
-        if (nofBitsToWrite <= 8)
-            write((byte) value, nofBitsToWrite);
-        else {
-            for (int i = nofBitsToWrite - 8; i >= 0; i -= 8) {
-                final byte v = (byte) (value >>> i);
-                writeByte(v);
-            }
-            if (nofBitsToWrite % 8 != 0) {
-                final byte v = (byte) value;
-                write(v, nofBitsToWrite % 8);
-            }
-        }
-    }
-
-    public void write(final int bitContainer, final int nofBits) throws IOException {
-        write_int_LSB_0(bitContainer, nofBits);
-    }
-
-    private void writeByte(final int value) throws IOException {
-        if (bufferedNumberOfBits == 0)
-            out.write(value);
-        else {
-            bufferByte = ((value & 0xFF) >>> bufferedNumberOfBits) | bufferByte;
-            out.write(bufferByte);
-            bufferByte = (value << (8 - bufferedNumberOfBits)) & 0xFF;
-        }
-    }
-
-    public void write(byte bitContainer, final int nofBits) throws IOException {
-        if (nofBits < 0 || nofBits > 8)
-            throw new IOException("Expecting 0 to 8 bits.");
-
-        if (nofBits == 8)
-            writeByte(bitContainer);
-        else {
-            if (bufferedNumberOfBits == 0) {
-                bufferByte = (bitContainer << (8 - nofBits)) & 0xFF;
-                bufferedNumberOfBits = nofBits;
-            } else {
-                bitContainer = (byte) (bitContainer & ~bitMasks[8 - nofBits]);
-                int bits = 8 - bufferedNumberOfBits - nofBits;
-                if (bits < 0) {
-                    bits = -bits;
-                    bufferByte |= (bitContainer >>> bits);
-                    out.write(bufferByte);
-                    bufferByte = (bitContainer << (8 - bits)) & 0xFF;
-                    bufferedNumberOfBits = bits;
-                } else if (bits == 0) {
-                    bufferByte = bufferByte | bitContainer;
-                    out.write(bufferByte);
-                    bufferedNumberOfBits = 0;
-                } else {
-                    bufferByte = bufferByte | (bitContainer << bits);
-                    bufferedNumberOfBits = 8 - bits;
-                }
-            }
-        }
-    }
-
-    @Override
-    public void write(final boolean bit) throws IOException {
-        write(bit ? (byte) 1 : (byte) 0, 1);
-    }
-
-    public void write(final boolean bit, final long repeat) throws IOException {
-        for (long i = 0; i < repeat; i++)
-            write(bit);
-    }
-
-    @Override
-    public void close() throws IOException {
-        flush();
-        out.close();
-    }
-
-    @Override
-    public void flush() throws IOException {
-        if (bufferedNumberOfBits > 0)
-            out.write(bufferByte);
-
-        bufferedNumberOfBits = 0;
-        out.flush();
-    }
-
-    @Override
-    public void write(@SuppressWarnings("NullableProblems") final byte[] b) throws IOException {
-        out.write(b);
-    }
-
-    @Override
-    public void write(@SuppressWarnings("NullableProblems") final byte[] b, final int off, final int length) throws IOException {
-        out.write(b, off, length);
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/ExposedByteArrayOutputStream.java b/src/main/java/htsjdk/samtools/cram/io/ExposedByteArrayOutputStream.java
deleted file mode 100644
index 0bac0dd..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/ExposedByteArrayOutputStream.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.ByteArrayOutputStream;
-
-public class ExposedByteArrayOutputStream extends ByteArrayOutputStream {
-    public byte[] getBuffer() {
-        return buf;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/ExternalCompression.java b/src/main/java/htsjdk/samtools/cram/io/ExternalCompression.java
deleted file mode 100644
index 4905a96..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/ExternalCompression.java
+++ /dev/null
@@ -1,152 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import htsjdk.samtools.cram.encoding.rans.RANS;
-import htsjdk.samtools.util.IOUtil;
-import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
-import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
-import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
-import org.apache.commons.compress.compressors.xz.XZCompressorOutputStream;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.GZIPOutputStream;
-
-/**
- * Methods to provide CRAM external compression/decompression features.
- */
-public class ExternalCompression {
-    private static final int GZIP_COMPRESSION_LEVEL = Integer.valueOf(System.getProperty("gzip.compression.level", "5"));
-
-    /**
-     * Compress a byte array into GZIP blob. The method obeys {@link ExternalCompression#GZIP_COMPRESSION_LEVEL} compression level.
-     *
-     * @param data byte array to compress
-     * @return compressed blob
-     */
-    public static byte[] gzip(final byte[] data) throws IOException {
-        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        final GZIPOutputStream gos = new GZIPOutputStream(byteArrayOutputStream) {
-            {
-                def.setLevel(GZIP_COMPRESSION_LEVEL);
-            }
-        };
-        IOUtil.copyStream(new ByteArrayInputStream(data), gos);
-        gos.close();
-
-        return byteArrayOutputStream.toByteArray();
-    }
-
-    /**
-     * Uncompress a GZIP data blob into a new byte array.
-     *
-     * @param data compressed data blob
-     * @return uncompressed data
-     * @throws IOException as per java IO contract
-     */
-    public static byte[] gunzip(final byte[] data) throws IOException {
-        final GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(data));
-        return InputStreamUtils.readFully(gzipInputStream);
-    }
-
-    /**
-     * Compress a byte array into BZIP2 blob.
-     *
-     * @param data byte array to compress
-     * @return compressed blob
-     */
-    public static byte[] bzip2(final byte[] data) throws IOException {
-        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        final BZip2CompressorOutputStream bos = new BZip2CompressorOutputStream(byteArrayOutputStream);
-        IOUtil.copyStream(new ByteArrayInputStream(data), bos);
-        bos.close();
-        return byteArrayOutputStream.toByteArray();
-    }
-
-    /**
-     * Uncompress a BZIP2 data blob into a new byte array.
-     *
-     * @param data compressed data blob
-     * @return uncompressed data
-     * @throws IOException as per java IO contract
-     */
-    @SuppressWarnings("ResultOfMethodCallIgnored")
-    public static byte[] unbzip2(final byte[] data) throws IOException {
-        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
-        return InputStreamUtils.readFully(new BZip2CompressorInputStream(byteArrayInputStream));
-    }
-
-    /**
-     * Compress a byte array into rANS blob.
-     *
-     * @param data  byte array to compress
-     * @param order rANS order
-     * @return compressed blob
-     */
-    public static byte[] rans(final byte[] data, final RANS.ORDER order) {
-        final ByteBuffer buffer = RANS.compress(ByteBuffer.wrap(data), order, null);
-        return toByteArray(buffer);
-    }
-
-    /**
-     * Compress a byte array into rANS blob.
-     *
-     * @param data  byte array to compress
-     * @param order rANS order
-     * @return compressed blob
-     */
-    public static byte[] rans(final byte[] data, final int order) {
-        final ByteBuffer buffer = RANS.compress(ByteBuffer.wrap(data), RANS.ORDER.fromInt(order), null);
-        return toByteArray(buffer);
-    }
-
-    /**
-     * Uncompress a rANS data blob into a new byte array.
-     *
-     * @param data compressed data blob
-     * @return uncompressed data
-     */
-    public static byte[] unrans(final byte[] data) {
-        final ByteBuffer buf = RANS.uncompress(ByteBuffer.wrap(data), null);
-        return toByteArray(buf);
-    }
-
-
-    /**
-     * Compress a byte array into XZ blob.
-     *
-     * @param data byte array to compress
-     * @return compressed blob
-     */
-    public static byte[] xz(final byte[] data) throws IOException {
-        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(data.length * 2);
-        final XZCompressorOutputStream xzCompressorOutputStream = new XZCompressorOutputStream(byteArrayOutputStream);
-        xzCompressorOutputStream.write(data);
-        xzCompressorOutputStream.close();
-        return byteArrayOutputStream.toByteArray();
-    }
-
-
-    /**
-     * Uncompress a XZ data blob into a new byte array.
-     *
-     * @param data compressed data blob
-     * @return uncompressed data
-     * @throws IOException as per java IO contract
-     */
-    public static byte[] unxz(final byte[] data) throws IOException {
-        final XZCompressorInputStream xzCompressorInputStream = new XZCompressorInputStream(new ByteArrayInputStream(data));
-        return InputStreamUtils.readFully(xzCompressorInputStream);
-    }
-
-
-    private static byte[] toByteArray(final ByteBuffer buffer) {
-        if (buffer.hasArray() && buffer.arrayOffset() == 0 && buffer.array().length == buffer.limit()) return buffer.array();
-
-        final byte[] bytes = new byte[buffer.remaining()];
-        buffer.get(bytes);
-        return bytes;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/ITF8.java b/src/main/java/htsjdk/samtools/cram/io/ITF8.java
deleted file mode 100644
index edaca09..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/ITF8.java
+++ /dev/null
@@ -1,186 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-
-/**
- * Methods to read and write int values as per ITF8 specification in CRAM.
- */
-public class ITF8 {
-
-    /**
-     * Reads an unsigned (32 bit) integer from an {@link InputStream}. The sign bit should be interpreted as a value bit.
-     *
-     * @param inputStream the stream to read from
-     * @return the value read
-     * @throws IOException as per java IO contract
-     */
-    public static int readUnsignedITF8(final InputStream inputStream) throws IOException {
-        final int b1 = inputStream.read();
-        if (b1 == -1)
-            throw new EOFException();
-
-        if ((b1 & 128) == 0)
-            return b1;
-
-        if ((b1 & 64) == 0)
-            return ((b1 & 127) << 8) | inputStream.read();
-
-        if ((b1 & 32) == 0) {
-            final int b2 = inputStream.read();
-            final int b3 = inputStream.read();
-            return ((b1 & 63) << 16) | b2 << 8 | b3;
-        }
-
-        if ((b1 & 16) == 0)
-            return ((b1 & 31) << 24) | inputStream.read() << 16 | inputStream.read() << 8 | inputStream.read();
-
-        return ((b1 & 15) << 28) | inputStream.read() << 20 | inputStream.read() << 12 | inputStream.read() << 4 | (15 & inputStream.read());
-    }
-
-    /**
-     * Writes an unsigned (32 bit) integer to an {@link OutputStream} encoded as ITF8. The sign bit is interpreted as a value bit.
-     *
-     * @param value the value to be written out
-     * @param outputStream    the stream to write to
-     * @return number of bits written
-     * @throws IOException as per java IO contract
-     */
-    public static int writeUnsignedITF8(final int value, final OutputStream outputStream) throws IOException {
-        if ((value >>> 7) == 0) {
-            outputStream.write(value);
-            return 8;
-        }
-
-        if ((value >>> 14) == 0) {
-            outputStream.write(((value >> 8) | 128));
-            outputStream.write((value & 0xFF));
-            return 16;
-        }
-
-        if ((value >>> 21) == 0) {
-            outputStream.write(((value >> 16) | 192));
-            outputStream.write(((value >> 8) & 0xFF));
-            outputStream.write((value & 0xFF));
-            return 24;
-        }
-
-        if ((value >>> 28) == 0) {
-            outputStream.write(((value >> 24) | 224));
-            outputStream.write(((value >> 16) & 0xFF));
-            outputStream.write(((value >> 8) & 0xFF));
-            outputStream.write((value & 0xFF));
-            return 32;
-        }
-
-        outputStream.write(((value >> 28) | 240));
-        outputStream.write(((value >> 20) & 0xFF));
-        outputStream.write(((value >> 12) & 0xFF));
-        outputStream.write(((value >> 4) & 0xFF));
-        outputStream.write((value & 0xFF));
-        return 40;
-    }
-
-    /**
-     * Reads an unsigned (32 bit) integer from an array of bytes. The sign bit should be interpreted as a value bit.
-     *
-     * @param data the bytes to read from
-     * @return the value read
-     */
-    public static int readUnsignedITF8(final byte[] data) {
-        final ByteBuffer buffer = ByteBuffer.wrap(data);
-        final int value = readUnsignedITF8(buffer);
-        buffer.clear();
-
-        return value;
-    }
-
-    /**
-     * Writes an unsigned (32 bit) integer to a byte new array encoded as ITF8. The sign bit is interpreted as a value bit.
-     *
-     * @param value the value to be written out
-     * @return the bytes holding ITF8 representation of the value
-     */
-    public static byte[] writeUnsignedITF8(final int value) {
-        final ByteBuffer buffer = ByteBuffer.allocate(10);
-        writeUnsignedITF8(value, buffer);
-
-        buffer.flip();
-        final byte[] array = new byte[buffer.limit()];
-        buffer.get(array);
-
-        buffer.clear();
-        return array;
-    }
-
-    /**
-     * Reads an unsigned (32 bit) integer from a {@link ByteBuffer}. The sign bit should be interpreted as a value bit.
-     *
-     * @param buffer the bytes to read from
-     * @return unsigned integer value from the buffer
-     */
-    public static int readUnsignedITF8(final ByteBuffer buffer) {
-        final int b1 = 0xFF & buffer.get();
-
-        if ((b1 & 128) == 0)
-            return b1;
-
-        if ((b1 & 64) == 0)
-            return ((b1 & 127) << 8) | (0xFF & buffer.get());
-
-        if ((b1 & 32) == 0) {
-            final int b2 = 0xFF & buffer.get();
-            final int b3 = 0xFF & buffer.get();
-            return ((b1 & 63) << 16) | b2 << 8 | b3;
-        }
-
-        if ((b1 & 16) == 0)
-            return ((b1 & 31) << 24) | (0xFF & buffer.get()) << 16 | (0xFF & buffer.get()) << 8 | (0xFF & buffer.get());
-
-        return ((b1 & 15) << 28) | (0xFF & buffer.get()) << 20 | (0xFF & buffer.get()) << 12 | (0xFF & buffer.get()) << 4
-                | (15 & buffer.get());
-    }
-
-    /**
-     * Writes an unsigned (32 bit) integer to an {@link OutputStream} encoded as ITF8. The sign bit is interpreted as a value bit.
-     *
-     * @param value the value to be written out
-     * @param buffer   the {@link ByteBuffer} to write to
-     */
-    public static void writeUnsignedITF8(final int value, final ByteBuffer buffer) {
-        if ((value >>> 7) == 0) {
-            buffer.put((byte) value);
-            return;
-        }
-
-        if ((value >>> 14) == 0) {
-            buffer.put((byte) ((value >> 8) | 128));
-            buffer.put((byte) (value & 0xFF));
-            return;
-        }
-
-        if ((value >>> 21) == 0) {
-            buffer.put((byte) ((value >> 16) | 192));
-            buffer.put((byte) ((value >> 8) & 0xFF));
-            buffer.put((byte) (value & 0xFF));
-            return;
-        }
-
-        if ((value >>> 28) == 0) {
-            buffer.put((byte) ((value >> 24) | 224));
-            buffer.put((byte) ((value >> 16) & 0xFF));
-            buffer.put((byte) ((value >> 8) & 0xFF));
-            buffer.put((byte) (value & 0xFF));
-            return;
-        }
-
-        buffer.put((byte) ((value >> 28) | 240));
-        buffer.put((byte) ((value >> 20) & 0xFF));
-        buffer.put((byte) ((value >> 12) & 0xFF));
-        buffer.put((byte) ((value >> 4) & 0xFF));
-        buffer.put((byte) (value & 0xFF));
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/InputStreamUtils.java b/src/main/java/htsjdk/samtools/cram/io/InputStreamUtils.java
deleted file mode 100644
index 3d1c96d..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/InputStreamUtils.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.ByteArrayOutputStream;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Convenience methods to read from {@link java.io.InputStream}.
- */
-public class InputStreamUtils {
-
-    /**
-     * Read the {@link InputStream} until the end into a new byte array.
-     *
-     * @param input the input stream to read
-     * @return a new byte array containing data from the input stream
-     */
-    public static byte[] readFully(final InputStream input) {
-        final ByteArrayOutputStream output = new ByteArrayOutputStream();
-        IOUtil.copyStream(input, output);
-        return output.toByteArray();
-    }
-
-    /**
-     * Read the specified number of bytes from the {@link InputStream} into a new byte array. The length of the array is less or equal to
-     * length.
-     *
-     * @param inputStream  the input stream to read from
-     * @param length the number of bytes to read
-     * @return a new byte array containing data from the input stream
-     * @throws IOException  as per java IO contract
-     * @throws EOFException if there is less than length bytes in the stream
-     */
-    public static byte[] readFully(final InputStream inputStream, final int length) throws IOException {
-        final byte[] b = new byte[length];
-        readFully(inputStream, b, 0, length);
-        return b;
-    }
-
-    /**
-     * Read the specified number of bytes from the {@link InputStream} into the byte array starting from the specified position. The length
-     * of the array is less or equal to length.
-     *
-     * @param inputStream  the input stream to read from
-     * @param b   the byte array to read into
-     * @param off offset in the byte array
-     * @param length the number of bytes to read
-     * @throws IOException  as per java IO contract
-     * @throws EOFException if there is less than length bytes in the stream
-     */
-    public static void readFully(final InputStream inputStream, final byte[] b, final int off, final int length) throws IOException {
-        if (length < 0) throw new IndexOutOfBoundsException();
-        int n = 0;
-        while (n < length) {
-            final int count = inputStream.read(b, off + n, length - n);
-            if (count < 0) throw new EOFException();
-            n += count;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/LTF8.java b/src/main/java/htsjdk/samtools/cram/io/LTF8.java
deleted file mode 100644
index 3e98ba6..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/LTF8.java
+++ /dev/null
@@ -1,193 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Methods to read and write LTF8 as per CRAM specs.
- */
-public class LTF8 {
-    /**
-     * Reads an unsigned long value from the input stream. The sign bit should be interpreted just as other bits in the value.
-     *
-     * @param inputStream input stream to be read from
-     * @return value encoded in the stream as LTF8
-     * @throws IOException as per java IO contract
-     */
-    public static long readUnsignedLTF8(final InputStream inputStream) throws IOException {
-        final int b1 = inputStream.read();
-        if (b1 == -1)
-            throw new EOFException();
-
-        if ((b1 & 128) == 0)
-            return b1;
-
-        if ((b1 & 64) == 0)
-            return ((b1 & 127) << 8) | inputStream.read();
-
-        if ((b1 & 32) == 0) {
-            final int b2 = inputStream.read();
-            final int b3 = inputStream.read();
-            return ((b1 & 63) << 16) | b2 << 8 | b3;
-        }
-
-        if ((b1 & 16) == 0) {
-            long result = ((long) (b1 & 31) << 24);
-            result |= inputStream.read() << 16;
-            result |= inputStream.read() << 8;
-            result |= inputStream.read();
-            return result;
-        }
-
-        if ((b1 & 8) == 0) {
-            long value = ((long) (b1 & 15) << 32);
-            value |= ((0xFF & ((long) inputStream.read())) << 24);
-            value |= (inputStream.read() << 16);
-            value |= (inputStream.read() << 8);
-            value |= inputStream.read();
-            return value;
-        }
-
-        if ((b1 & 4) == 0) {
-            long result = ((long) (b1 & 7) << 40);
-            result |= (0xFF & ((long) inputStream.read())) << 32;
-            result |= (0xFF & ((long) inputStream.read())) << 24;
-            result |= inputStream.read() << 16;
-            result |= inputStream.read() << 8;
-            result |= inputStream.read();
-            return result;
-        }
-
-        if ((b1 & 2) == 0) {
-            long result = ((long) (b1 & 3) << 48);
-            result |= (0xFF & ((long) inputStream.read())) << 40;
-            result |= (0xFF & ((long) inputStream.read())) << 32;
-            result |= (0xFF & ((long) inputStream.read())) << 24;
-            result |= inputStream.read() << 16;
-            result |= inputStream.read() << 8;
-            result |= inputStream.read();
-            return result;
-        }
-
-        if ((b1 & 1) == 0) {
-            long result = (0xFF & ((long) inputStream.read())) << 48;
-            result |= (0xFF & ((long) inputStream.read())) << 40;
-            result |= (0xFF & ((long) inputStream.read())) << 32;
-            result |= (0xFF & ((long) inputStream.read())) << 24;
-            result |= inputStream.read() << 16;
-            result |= inputStream.read() << 8;
-            result |= inputStream.read();
-            return result;
-        }
-
-        long result = (0xFF & ((long) inputStream.read())) << 56;
-        result |= (0xFF & ((long) inputStream.read())) << 48;
-        result |= (0xFF & ((long) inputStream.read())) << 40;
-        result |= (0xFF & ((long) inputStream.read())) << 32;
-        result |= (0xFF & ((long) inputStream.read())) << 24;
-        result |= inputStream.read() << 16;
-        result |= inputStream.read() << 8;
-        result |= inputStream.read();
-        return result;
-    }
-
-    /**
-     * Writes an unsigned long value to the output stream. The sign bit is interpreted just as other bits in the value.
-     *
-     * @param value the value to be written
-     * @param outputStream    the output stream to write to
-     * @return the number of bits written
-     * @throws IOException as per java IO contract
-     */
-    public static int writeUnsignedLTF8(final long value, final OutputStream outputStream) throws IOException {
-        if ((value >>> 7) == 0) {
-            // no control bits
-            outputStream.write((int) value);
-            return 8;
-        }
-
-        if ((value >>> 14) == 0) {
-            // one control bit
-            outputStream.write((int) ((value >> 8) | 0x80));
-            outputStream.write((int) (value & 0xFF));
-            return 16;
-        }
-
-        if ((value >>> 21) == 0) {
-            // two control bits
-            outputStream.write((int) ((value >> 16) | 0xC0));
-            outputStream.write((int) ((value >> 8) & 0xFF));
-            outputStream.write((int) (value & 0xFF));
-            return 24;
-        }
-
-        if ((value >>> 28) == 0) {
-            // three control bits
-            outputStream.write((int) ((value >> 24) | 0xE0));
-            outputStream.write((int) ((value >> 16) & 0xFF));
-            outputStream.write((int) ((value >> 8) & 0xFF));
-            outputStream.write((int) (value & 0xFF));
-            return 32;
-        }
-
-        if ((value >>> 35) == 0) {
-            // four control bits
-            outputStream.write((int) ((value >> 32) | 0xF0));
-            outputStream.write((int) ((value >> 24) & 0xFF));
-            outputStream.write((int) ((value >> 16) & 0xFF));
-            outputStream.write((int) ((value >> 8) & 0xFF));
-            outputStream.write((int) (value & 0xFF));
-            return 40;
-        }
-
-        if ((value >>> 42) == 0) {
-            // five control bits
-            outputStream.write((int) ((value >> 40) | 0xF8));
-            outputStream.write((int) ((value >> 32) & 0xFF));
-            outputStream.write((int) ((value >> 24) & 0xFF));
-            outputStream.write((int) ((value >> 16) & 0xFF));
-            outputStream.write((int) ((value >> 8) & 0xFF));
-            outputStream.write((int) (value & 0xFF));
-            return 48;
-        }
-
-        if ((value >>> 49) == 0) {
-            // six control bits
-            outputStream.write((int) ((value >> 48) | 0xFC));
-            outputStream.write((int) ((value >> 40) & 0xFF));
-            outputStream.write((int) ((value >> 32) & 0xFF));
-            outputStream.write((int) ((value >> 24) & 0xFF));
-            outputStream.write((int) ((value >> 16) & 0xFF));
-            outputStream.write((int) ((value >> 8) & 0xFF));
-            outputStream.write((int) (value & 0xFF));
-            return 56;
-        }
-
-        if ((value >>> 56) == 0) {
-            // seven control bits
-            outputStream.write(0xFE);
-            outputStream.write((int) ((value >> 48) & 0xFF));
-            outputStream.write((int) ((value >> 40) & 0xFF));
-            outputStream.write((int) ((value >> 32) & 0xFF));
-            outputStream.write((int) ((value >> 24) & 0xFF));
-            outputStream.write((int) ((value >> 16) & 0xFF));
-            outputStream.write((int) ((value >> 8) & 0xFF));
-            outputStream.write((int) (value & 0xFF));
-            return 64;
-        }
-
-        // eight control bits
-        outputStream.write((0xFF));
-        outputStream.write((int) ((value >> 56) & 0xFF));
-        outputStream.write((int) ((value >> 48) & 0xFF));
-        outputStream.write((int) ((value >> 40) & 0xFF));
-        outputStream.write((int) ((value >> 32) & 0xFF));
-        outputStream.write((int) ((value >> 28) & 0xFF));
-        outputStream.write((int) ((value >> 16) & 0xFF));
-        outputStream.write((int) ((value >> 8) & 0xFF));
-        outputStream.write((int) (value & 0xFF));
-        return 72;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/BaseCategory.java b/src/main/java/htsjdk/samtools/cram/lossy/BaseCategory.java
deleted file mode 100644
index ca40a92..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/BaseCategory.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public class BaseCategory {
-    public final BaseCategoryType type;
-    public final int param;
-
-    private BaseCategory(final BaseCategoryType type, final int param) {
-        this.type = type;
-        this.param = param;
-    }
-
-    public static BaseCategory match() {
-        return new BaseCategory(BaseCategoryType.MATCH, -1);
-    }
-
-    public static BaseCategory mismatch() {
-        return new BaseCategory(BaseCategoryType.MISMATCH, -1);
-    }
-
-    public static BaseCategory flankingDeletion() {
-        return new BaseCategory(BaseCategoryType.FLANKING_DELETION, -1);
-    }
-
-    public static BaseCategory pileup(final int threshold) {
-        return new BaseCategory(BaseCategoryType.PILEUP, threshold);
-    }
-
-    public static BaseCategory lowerThanCoverage(final int coverage) {
-        return new BaseCategory(BaseCategoryType.LOWER_COVERAGE, coverage);
-    }
-
-    public static BaseCategory insertion() {
-        return new BaseCategory(BaseCategoryType.INSERTION, -1);
-    }
-
-    @Override
-    public String toString() {
-        return String.format("[%s%d]", type.name(), param);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/BaseCategoryType.java b/src/main/java/htsjdk/samtools/cram/lossy/BaseCategoryType.java
deleted file mode 100644
index 93e98cc..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/BaseCategoryType.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public enum BaseCategoryType {
-    MATCH('R'), MISMATCH('N'), FLANKING_DELETION('D'), PILEUP('P'), LOWER_COVERAGE(
-            'X'), INSERTION('I');
-
-    @SuppressWarnings("FieldCanBeLocal")
-    private final char code;
-
-    BaseCategoryType(final char code) {
-        this.code = code;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/Binning.java b/src/main/java/htsjdk/samtools/cram/lossy/Binning.java
deleted file mode 100644
index 2ff6d9b..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/Binning.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-class Binning {
-
-    // @formatter:off
-    // NCBI binning scheme:
-    // Low High Value
-    // 0 0 0
-    // 1 1 1
-    // 2 2 2
-    // 3 14 9
-    // 15 19 17
-    // 20 24 22
-    // 25 29 28
-    // 30 noLimit 35
-    // @formatter:on
-    public static byte[] NCBI_BINNING_MATRIX = new byte[]{
-            // @formatter:off
-            0, 1, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 17, 17, 17, 17,
-            22, 22, 22, 22,
-            22,
-            28,
-            28,
-            28,
-            28,
-            28,
-            // @formatter:on
-            35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-            35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-            35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-            35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-            35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-            35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-            35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-            35};
-
-    // @formatter:off
-
-    // Illumina binning scheme:
-    // 2-9 6
-    // 10-19 15
-    // 20-24 22
-    // 25-29 27
-    // 30-34 33
-    // 35-39 37
-    // greater than or equal to 40 40
-    // @formatter:on
-    public static final byte[] ILLUMINA_BINNING_MATRIX = new byte[]{
-            // @formatter:off
-            0, 1, 6, 6, 6, 6, 6, 6, 6, 6, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-            15, 22, 22, 22, 22, 22, 27, 27, 27, 27, 27, 33, 33, 33, 33, 33, 37,
-            37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-            40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-            40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-            40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-            40, 40, 40, 40, 40, 40};
-    // @formatter:on
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/PreservationPolicy.java b/src/main/java/htsjdk/samtools/cram/lossy/PreservationPolicy.java
deleted file mode 100644
index fa8c5d3..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/PreservationPolicy.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class PreservationPolicy {
-    public ReadCategory readCategory;
-    public final List<BaseCategory> baseCategories = new ArrayList<BaseCategory>();
-
-    public QualityScoreTreatment treatment;
-
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder();
-        if (readCategory != null)
-            sb.append(readCategory.toString());
-
-        if (baseCategories != null)
-            for (final BaseCategory c : baseCategories)
-                sb.append(c.toString());
-
-        sb.append(treatment.toString());
-        return sb.toString();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/QualityScorePreservation.java b/src/main/java/htsjdk/samtools/cram/lossy/QualityScorePreservation.java
deleted file mode 100644
index 5ffe3c1..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/QualityScorePreservation.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.ref.ReferenceTracks;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.List;
-
-public class QualityScorePreservation {
-    private final List<PreservationPolicy> policyList;
-
-    public QualityScorePreservation(final String specification) {
-        policyList = parsePolicies(specification);
-    }
-
-    public List<PreservationPolicy> getPreservationPolicies() {
-        return policyList;
-    }
-
-    private static int readParam(final LinkedList<Character> list) {
-        int value = 0;
-
-        while (!list.isEmpty() && Character.isDigit(list.getFirst()))
-            value = value * 10 + (list.removeFirst() - 48);
-
-        return value;
-    }
-
-    private static QualityScoreTreatment readTreatment(
-            final LinkedList<Character> list) {
-        final int param = readParam(list);
-        final QualityScoreTreatment qualityScoreTreatment;
-        switch (param) {
-            case 0:
-                qualityScoreTreatment = QualityScoreTreatment.drop();
-                break;
-            case 40:
-                qualityScoreTreatment = QualityScoreTreatment.preserve();
-                break;
-
-            default:
-                qualityScoreTreatment = QualityScoreTreatment.bin(param);
-                break;
-
-        }
-        return qualityScoreTreatment;
-    }
-
-    private static List<PreservationPolicy> parsePolicies(final String spec) {
-        final List<PreservationPolicy> policyList = new ArrayList<PreservationPolicy>();
-        for (final String string : spec.split("-")) {
-            if (string.isEmpty())
-                continue;
-            final PreservationPolicy policy = parseSinglePolicy(string);
-            policyList.add(policy);
-        }
-
-        Collections.sort(policyList, new Comparator<PreservationPolicy>() {
-
-            @Override
-            public int compare(final PreservationPolicy o1, final PreservationPolicy o2) {
-                final QualityScoreTreatment t1 = o1.treatment;
-                final QualityScoreTreatment t2 = o2.treatment;
-                final int result = t2.type.ordinal() - t1.type.ordinal();
-                if (result != 0)
-                    return result;
-
-                return 0;
-            }
-        });
-
-        return policyList;
-    }
-
-    private static PreservationPolicy parseSinglePolicy(final String spec) {
-        final PreservationPolicy preservationPolicy = new PreservationPolicy();
-        final LinkedList<Character> list = new LinkedList<Character>();
-        for (final char character : spec.toCharArray())
-            list.add(character);
-
-        while (!list.isEmpty()) {
-            final char code = list.removeFirst();
-            switch (code) {
-                case 'R':
-                    preservationPolicy.baseCategories.add(BaseCategory.match());
-                    preservationPolicy.treatment = readTreatment(list);
-                    break;
-                case 'N':
-                    preservationPolicy.baseCategories.add(BaseCategory.mismatch());
-                    preservationPolicy.treatment = readTreatment(list);
-                    break;
-                case 'X':
-                    final int coverage = readParam(list);
-                    preservationPolicy.baseCategories
-                            .add(BaseCategory.lowerThanCoverage(coverage));
-                    break;
-                case 'D':
-                    preservationPolicy.baseCategories.add(BaseCategory.flankingDeletion());
-                    preservationPolicy.treatment = readTreatment(list);
-                    break;
-                case 'M':
-                    int score = readParam(list);
-                    preservationPolicy.readCategory = ReadCategory.higher_than_mapping_score(score);
-                    break;
-                case 'm':
-                    score = readParam(list);
-                    preservationPolicy.readCategory = ReadCategory.lower_than_mapping_score(score);
-                    break;
-                case 'U':
-                    preservationPolicy.readCategory = ReadCategory.unplaced();
-                    preservationPolicy.treatment = readTreatment(list);
-                    break;
-                case 'P':
-                    final int mismatches = readParam(list);
-                    preservationPolicy.baseCategories.add(BaseCategory.pileup(mismatches));
-                    preservationPolicy.treatment = readTreatment(list);
-                    break;
-                case 'I':
-                    preservationPolicy.baseCategories.add(BaseCategory.insertion());
-                    preservationPolicy.treatment = readTreatment(list);
-                    break;
-                case '_':
-                    preservationPolicy.treatment = readTreatment(list);
-                    break;
-                case '*':
-                    preservationPolicy.readCategory = ReadCategory.all();
-                    preservationPolicy.treatment = readTreatment(list);
-                    break;
-
-                default:
-                    throw new RuntimeException("Unknown read or base category: "
-                            + code);
-            }
-
-            if (preservationPolicy.treatment == null)
-                preservationPolicy.treatment = QualityScoreTreatment.preserve();
-        }
-
-        return preservationPolicy;
-    }
-
-    private static void applyBinning(final byte[] scores) {
-        for (int i = 0; i < scores.length; i++)
-            scores[i] = Binning.ILLUMINA_BINNING_MATRIX[scores[i]];
-    }
-
-    private static byte applyTreatment(final byte score, final QualityScoreTreatment qualityScoreTreatment) {
-        switch (qualityScoreTreatment.type) {
-            case BIN:
-                return Binning.ILLUMINA_BINNING_MATRIX[score];
-            case DROP:
-                return -1;
-            case PRESERVE:
-                return score;
-
-        }
-        throw new RuntimeException("Unknown quality score treatment type: "
-                + qualityScoreTreatment.type.name());
-    }
-
-    public void addQualityScores(final SAMRecord samRecord, final CramCompressionRecord cramRecord,
-                                 final ReferenceTracks referenceTracks) {
-        if (samRecord.getBaseQualities() == SAMRecord.NULL_QUALS) {
-            cramRecord.qualityScores = SAMRecord.NULL_QUALS;
-            cramRecord.setForcePreserveQualityScores(false);
-            return;
-        }
-
-        final byte[] scores = new byte[samRecord.getReadLength()];
-        Arrays.fill(scores, (byte) -1);
-        for (final PreservationPolicy preservationPolicy : policyList)
-            addQS(samRecord, cramRecord, scores, referenceTracks, preservationPolicy);
-
-        if (!cramRecord.isForcePreserveQualityScores()) {
-            for (int i = 0; i < scores.length; i++) {
-                if (scores[i] > -1) {
-                    if (cramRecord.readFeatures == null)
-                        cramRecord.readFeatures = new LinkedList<ReadFeature>();
-                    cramRecord.readFeatures.add(new BaseQualityScore(i + 1, scores[i]));
-                }
-            }
-            if (cramRecord.readFeatures != null)
-                Collections.sort(cramRecord.readFeatures, readFeaturePositionComparator);
-        }
-        cramRecord.qualityScores = scores;
-    }
-
-    private static final Comparator<ReadFeature> readFeaturePositionComparator = new Comparator<ReadFeature>() {
-
-        @Override
-        public int compare(final ReadFeature o1, final ReadFeature o2) {
-            return o1.getPosition() - o2.getPosition();
-        }
-    };
-
-    public boolean areReferenceTracksRequired() {
-        if (policyList == null || policyList.isEmpty()) return false;
-        for (final PreservationPolicy preservationPolicy : policyList) {
-            if (preservationPolicy.baseCategories == null || preservationPolicy.baseCategories.isEmpty())
-                continue;
-            for (final BaseCategory c : preservationPolicy.baseCategories) {
-                switch (c.type) {
-                    case LOWER_COVERAGE:
-                    case PILEUP:
-                        return true;
-
-                    default:
-                        break;
-                }
-            }
-        }
-        return false;
-
-    }
-
-    private static void addQS(final SAMRecord samRecord, final CramCompressionRecord cramRecord,
-                              final byte[] scores, final ReferenceTracks referenceTracks, final PreservationPolicy preservationPolicy) {
-        final int alSpan = samRecord.getAlignmentEnd() - samRecord.getAlignmentStart();
-        final byte[] qualityScores = samRecord.getBaseQualities();
-
-        // check if read is falling into the read category:
-        if (preservationPolicy.readCategory != null) {
-            @SuppressWarnings("UnusedAssignment") boolean properRead = false;
-            switch (preservationPolicy.readCategory.type) {
-                case ALL:
-                    properRead = true;
-                    break;
-                case UNPLACED:
-                    properRead = samRecord.getReadUnmappedFlag();
-                    break;
-                case LOWER_MAPPING_SCORE:
-                    properRead = samRecord.getMappingQuality() < preservationPolicy.readCategory.param;
-                    break;
-                case HIGHER_MAPPING_SCORE:
-                    properRead = samRecord.getMappingQuality() > preservationPolicy.readCategory.param;
-                    break;
-
-                default:
-                    throw new RuntimeException("Unknown read category: "
-                            + preservationPolicy.readCategory.type.name());
-            }
-
-            if (!properRead) // nothing to do here:
-                return;
-        }
-
-        // apply treatment if there is no per-base policy:
-        if (preservationPolicy.baseCategories == null || preservationPolicy.baseCategories.isEmpty()) {
-            switch (preservationPolicy.treatment.type) {
-                case BIN:
-                    if (cramRecord.qualityScores == null)
-                        cramRecord.qualityScores = samRecord.getBaseQualities();
-                    System.arraycopy(samRecord.getBaseQualities(), 0, scores, 0,
-                            scores.length);
-                    applyBinning(scores);
-                    cramRecord.setForcePreserveQualityScores(true);
-                    break;
-                case PRESERVE:
-                    System.arraycopy(samRecord.getBaseQualities(), 0, scores, 0,
-                            scores.length);
-                    cramRecord.setForcePreserveQualityScores(true);
-                    break;
-                case DROP:
-                    cramRecord.qualityScores = null;
-                    cramRecord.setForcePreserveQualityScores(false);
-                    break;
-
-                default:
-                    throw new RuntimeException(
-                            "Unknown quality score treatment type: "
-                                    + preservationPolicy.treatment.type.name());
-            }
-
-            // nothing else to do here:
-            return;
-        }
-
-        // here we go, scan all bases to check if the policy applies:
-        final boolean[] mask = new boolean[qualityScores.length];
-
-        final int alStart = samRecord.getAlignmentStart();
-        // must be a mapped read at this point:
-        if (alStart == SAMRecord.NO_ALIGNMENT_START)
-            return;
-        referenceTracks.ensureRange(alStart, alSpan);
-
-        for (final BaseCategory baseCategory : preservationPolicy.baseCategories) {
-            int pos;
-            int refPos;
-            switch (baseCategory.type) {
-                case FLANKING_DELETION:
-                    pos = 0;
-                    for (final CigarElement cigarElement : samRecord.getCigar().getCigarElements()) {
-                        if (cigarElement.getOperator() == CigarOperator.D) {
-                            // if (pos > 0)
-                            mask[pos] = true;
-                            if (pos + 1 < mask.length)
-                                mask[pos + 1] = true;
-                        }
-
-                        pos += cigarElement.getOperator().consumesReadBases() ? cigarElement
-                                .getLength() : 0;
-                    }
-                    break;
-                case MATCH:
-                case MISMATCH:
-                    pos = 0;
-                    refPos = samRecord.getAlignmentStart();
-                    for (final CigarElement cigarElement : samRecord.getCigar().getCigarElements()) {
-                        if (cigarElement.getOperator().consumesReadBases()) {
-                            for (int i = 0; i < cigarElement.getLength(); i++) {
-                                final boolean match = samRecord.getReadBases()[pos + i] == referenceTracks
-                                        .baseAt(refPos + i);
-                                mask[pos + i] = (baseCategory.type == BaseCategoryType.MATCH && match)
-                                        || (baseCategory.type == BaseCategoryType.MISMATCH && !match);
-                            }
-                            pos += cigarElement.getLength();
-                        }
-                        refPos += cigarElement.getOperator().consumesReferenceBases() ? cigarElement
-                                .getLength() : 0;
-                    }
-                    break;
-                case INSERTION:
-                    pos = 0;
-                    for (final CigarElement cigarElement : samRecord.getCigar().getCigarElements()) {
-                        switch (cigarElement.getOperator()) {
-                            case I:
-                                for (int i = 0; i < cigarElement.getLength(); i++)
-                                    mask[pos + i] = true;
-                                break;
-                            default:
-                                break;
-                        }
-
-                        pos += cigarElement.getOperator().consumesReadBases() ? cigarElement
-                                .getLength() : 0;
-                    }
-                    break;
-                case LOWER_COVERAGE:
-                    pos = 1;
-                    refPos = samRecord.getAlignmentStart();
-                    for (final CigarElement cigarElement : samRecord.getCigar().getCigarElements()) {
-                        switch (cigarElement.getOperator()) {
-                            case M:
-                            case EQ:
-                            case X:
-                                for (int i = 0; i < cigarElement.getLength(); i++)
-                                    mask[pos + i - 1] = referenceTracks.coverageAt(refPos + i) < baseCategory.param;
-                                break;
-                            default:
-                                break;
-                        }
-
-                        pos += cigarElement.getOperator().consumesReadBases() ? cigarElement
-                                .getLength() : 0;
-                        refPos += cigarElement.getOperator().consumesReferenceBases() ? cigarElement
-                                .getLength() : 0;
-                    }
-                    break;
-                case PILEUP:
-                    for (int i = 0; i < qualityScores.length; i++)
-                        if (referenceTracks.mismatchesAt(alStart + i) > baseCategory.param)
-                            mask[i] = true;
-                    break;
-
-                default:
-                    break;
-            }
-
-        }
-
-        int maskedCount = 0;
-        for (int i = 0; i < mask.length; i++)
-            if (mask[i]) {
-                scores[i] = applyTreatment(qualityScores[i], preservationPolicy.treatment);
-                maskedCount++;
-            }
-
-        // safety latch, store all qs if there are too many individual score
-        // to store:
-        if (maskedCount > samRecord.getReadLength() / 2)
-            cramRecord.setForcePreserveQualityScores(true);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatment.java b/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatment.java
deleted file mode 100644
index 6f9a7e3..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatment.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public class QualityScoreTreatment {
-    public final QualityScoreTreatmentType type;
-    public final int param;
-
-    private QualityScoreTreatment(final QualityScoreTreatmentType type, final int param) {
-        this.type = type;
-        this.param = param;
-    }
-
-    public static QualityScoreTreatment preserve() {
-        return new QualityScoreTreatment(
-                QualityScoreTreatmentType.PRESERVE, 40);
-    }
-
-    public static QualityScoreTreatment drop() {
-        return new QualityScoreTreatment(QualityScoreTreatmentType.DROP, 40);
-    }
-
-    public static QualityScoreTreatment bin(final int bins) {
-        return new QualityScoreTreatment(QualityScoreTreatmentType.BIN,
-                bins);
-    }
-
-    @Override
-    public String toString() {
-        return String.format("[%s%d]", type.name(), param);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatmentType.java b/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatmentType.java
deleted file mode 100644
index dfb61dc..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatmentType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public enum QualityScoreTreatmentType {
-    PRESERVE, BIN, DROP
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/ReadCategory.java b/src/main/java/htsjdk/samtools/cram/lossy/ReadCategory.java
deleted file mode 100644
index 14a41b3..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/ReadCategory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public class ReadCategory {
-    public final ReadCategoryType type;
-    public final int param;
-
-    private ReadCategory(final ReadCategoryType type, final int param) {
-        this.type = type;
-        this.param = param;
-    }
-
-    public static ReadCategory unplaced() {
-        return new ReadCategory(ReadCategoryType.UNPLACED, -1);
-    }
-
-    public static ReadCategory higher_than_mapping_score(final int score) {
-        return new ReadCategory(ReadCategoryType.HIGHER_MAPPING_SCORE,
-                score);
-    }
-
-    public static ReadCategory lower_than_mapping_score(final int score) {
-        return new ReadCategory(ReadCategoryType.LOWER_MAPPING_SCORE, score);
-    }
-
-    public static ReadCategory all() {
-        return new ReadCategory(ReadCategoryType.ALL, -1);
-    }
-
-    @Override
-    public String toString() {
-        return String.format("[%s%d]", type.name(), param);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/ReadCategoryType.java b/src/main/java/htsjdk/samtools/cram/lossy/ReadCategoryType.java
deleted file mode 100644
index 7924550..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/ReadCategoryType.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public enum ReadCategoryType {
-    UNPLACED('P'), HIGHER_MAPPING_SCORE('M'), LOWER_MAPPING_SCORE('m'), ALL('*');
-
-    @SuppressWarnings("FieldCanBeLocal")
-    private final char code;
-
-    ReadCategoryType(final char code) {
-        this.code = code;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/CRAMReferenceSource.java b/src/main/java/htsjdk/samtools/cram/ref/CRAMReferenceSource.java
deleted file mode 100644
index c77aaae..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/CRAMReferenceSource.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package htsjdk.samtools.cram.ref;
-
-import htsjdk.samtools.SAMSequenceRecord;
-
-/**
- * Interface used to supply a reference source when reading CRAM files.
- */
-public interface CRAMReferenceSource {
-
-    /**
-     * getReferenceBases
-     * @param sequenceRecord the SAMSequenceRecord identifying the reference
-     *                       being requested
-     * @param tryNameVariants if true, attempt to match the requested sequence name
-     *                        against the reference by using common name variations,
-     *                        such as adding or removing a leading "chr" prefix
-     *                        from the requested name. if false, use exact match
-     * @return the upper cased, normalized (see {@link htsjdk.samtools.cram.build.Utils#normalizeBase})
-     * bases representing the requested sequence, or null if the sequence cannot be found
-     */
-    byte[] getReferenceBases(final SAMSequenceRecord sequenceRecord, final boolean tryNameVariants);
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/EnaRefService.java b/src/main/java/htsjdk/samtools/cram/ref/EnaRefService.java
deleted file mode 100644
index 4d99d1e..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/EnaRefService.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package htsjdk.samtools.cram.ref;
-
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-public class EnaRefService {
-    private static final Log log = Log.getInstance(EnaRefService.class);
-    private static final int HTTP_OK = 200;
-    private static final int HTTP_FOUND = 302;
-    private static final int HTTP_NOT_FOUND = 404;
-    private static final int HTTP_INTERNAL_SEVER_PROBLEM = 500;
-    private static final int HTTP_CONNECTION_TIMEOUT = 522;
-
-    byte[] getSequence(final String md5) throws GaveUpException {
-        final int restBetweenTries_ms = 0;
-        final int maxTries = 1;
-        final int timeout_ms = 0;
-        return getSequence(md5, timeout_ms, maxTries, restBetweenTries_ms);
-    }
-
-    /**
-     * Tries to download sequence bases using its md5 checksum. This method can
-     * try downloading the sequence many times before giving up.
-     *
-     * @param md5                 MD5 checksum string of the sequence to download
-     * @param timeoutMs          timeout in milliseconds before failing with the {@link EnaRefService.GaveUpException}
-     * @param maxTries            maximum number of tries before failing with the {@link EnaRefService.GaveUpException}
-     * @param restBetweenTriesMs wait this number of milliseconds before repeating attempt
-     * @return sequence bases or null if there is no sequence with such md5
-     * @throws GaveUpException if the sequence could not be downloaded within the time/try
-     *                         limit.
-     */
-    byte[] getSequence(final String md5, final long timeoutMs, int maxTries, final long restBetweenTriesMs) throws
-            GaveUpException {
-        if (md5 == null)
-            throw new NullPointerException("Expecting sequence md5 but got null.");
-        if (!md5.matches("[a-z0-9]{32}"))
-            throw new RuntimeException("Does not look like an md5 checksum: " + md5);
-
-        final String httpEbiString = "http://www.ebi.ac.uk/ena/cram/md5/%s";
-        final String urlString = String.format(httpEbiString, md5);
-        final URL url;
-        try {
-            url = new URL(urlString);
-        } catch (final MalformedURLException e) {
-            throw new RuntimeException("Invalid sequence url: " + urlString, e);
-        }
-
-        InputStream inputStream = null;
-        final long startTime = System.currentTimeMillis();
-        do {
-            try {
-                final HttpURLConnection http = (HttpURLConnection) url.openConnection();
-                final int readTimeoutMs = 0;
-                http.setReadTimeout(readTimeoutMs);
-                final int code = http.getResponseCode();
-                switch (code) {
-                    case HTTP_OK:
-                        inputStream = http.getInputStream();
-                        if (inputStream == null)
-                            throw new RuntimeException("Failed to download sequence for md5: " + md5);
-
-                        log.info("Downloading reference sequence: " + urlString);
-                        final byte[] bases = InputStreamUtils.readFully(inputStream);
-                        log.info("Downloaded " + bases.length + " bases.");
-                        return bases;
-                    case HTTP_NOT_FOUND:
-                        return null;
-                    case HTTP_CONNECTION_TIMEOUT:
-                    case HTTP_INTERNAL_SEVER_PROBLEM:
-                        break;
-                    default:
-                        throw new RuntimeException("Unknown http status code: " + code);
-                }
-
-                if (startTime - System.currentTimeMillis() < timeoutMs && maxTries > 1 && restBetweenTriesMs > 0)
-                    try {
-                        Thread.sleep(restBetweenTriesMs);
-                    } catch (final InterruptedException e) {
-                        throw new RuntimeException(e);
-                    }
-
-            } catch (final IOException e) {
-                log.error("Connection attempt failed: " + e.getMessage());
-            } finally {
-                if (inputStream != null) {
-                    try {
-                        inputStream.close();
-                    } catch (final Exception e) {
-                        log.error(e.getMessage());
-                    }
-                }
-            }
-
-        } while (startTime - System.currentTimeMillis() < timeoutMs && --maxTries > 0);
-
-        throw new GaveUpException(md5);
-    }
-
-    public static class GaveUpException extends Exception {
-        private static final long serialVersionUID = -8997576068346912410L;
-        private String md5;
-
-        public GaveUpException(final String md5) {
-            this.setMd5(md5);
-        }
-
-        public String getMd5() {
-            return md5;
-        }
-
-        public void setMd5(final String md5) {
-            this.md5 = md5;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/InMemoryReferenceSequenceFile.java b/src/main/java/htsjdk/samtools/cram/ref/InMemoryReferenceSequenceFile.java
deleted file mode 100644
index 34bfc19..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/InMemoryReferenceSequenceFile.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.ref;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-class InMemoryReferenceSequenceFile implements ReferenceSequenceFile {
-    private Map<Integer, byte[]> sequences = new HashMap<Integer, byte[]>();
-    private SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
-    private int currentIndex = 0;
-
-    public void addSequence(final String name, final byte[] bases) {
-        final SAMSequenceRecord r = new SAMSequenceRecord(name, bases.length);
-        dictionary.addSequence(r);
-        final int index = getSequenceDictionary().getSequenceIndex(name);
-        sequences.put(index, bases);
-    }
-
-    @Override
-    public ReferenceSequence getSequence(final String name) {
-        final int index = getSequenceDictionary().getSequenceIndex(name);
-        return new ReferenceSequence(name, index, sequences.get(index));
-    }
-
-    @Override
-    public SAMSequenceDictionary getSequenceDictionary() {
-        return dictionary;
-    }
-
-    @Override
-    public ReferenceSequence getSubsequenceAt(final String name, final long start, final long stop) {
-        final int index = getSequenceDictionary().getSequenceIndex(name);
-        final byte[] bases = Arrays.copyOfRange(sequences.get(index), (int) start,
-                (int) stop + 1);
-        return new ReferenceSequence(name, index, bases);
-    }
-
-    @Override
-    public void close() throws IOException {
-        sequences = null;
-        dictionary = null;
-    }
-
-    /**
-     * Returns a new object representing the requested region on the reference sequence.
-     * @param name name of the reference sequence
-     * @param start inclusive starting position on the reference sequence
-     * @param stop  inclusive end position on the reference sequence
-     * @return a new region object
-     */
-    public ReferenceRegion getRegion(final String name, final long start, final long stop) {
-        final int index = getSequenceDictionary().getSequenceIndex(name);
-        if (!sequences.containsKey(index))
-            throw new RuntimeException("Sequence not found: " + name);
-
-        return new ReferenceRegion(sequences.get(index),
-                index, name, start, stop);
-    }
-
-    @Override
-    public boolean isIndexed() {
-        return true;
-    }
-
-    @Override
-    public ReferenceSequence nextSequence() {
-        if (currentIndex >= dictionary.size())
-            return null;
-
-        final SAMSequenceRecord sequence = dictionary.getSequence(currentIndex++);
-        return getSequence(sequence.getSequenceName());
-    }
-
-    @Override
-    public void reset() {
-        currentIndex = 0;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/ReferenceRegion.java b/src/main/java/htsjdk/samtools/cram/ref/ReferenceRegion.java
deleted file mode 100644
index 14799d2..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/ReferenceRegion.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.ref;
-
-import java.util.Arrays;
-
-/**
- * A class representing a region on a reference sequence.
- */
-class ReferenceRegion {
-    private final int index;
-    private final String name;
-    private long alignmentStart;
-    private int arrayStart;
-    private final byte[] array;
-
-    /**
-     * Construct reference sequence region with the given bases.
-     * @param bases the bases for the sequence
-     * @param sequenceIndex index in the {@link htsjdk.samtools.SAMSequenceDictionary}
-     * @param sequenceName name of the reference sequence
-     * @param alignmentStart 1-based inclusive position of the region start on the reference sequence
-     * @param alignmentEnd   1-based inclusive position of the region end on the reference sequence
-     */
-    public ReferenceRegion(final byte[] bases, final int sequenceIndex,
-                           final String sequenceName, final long alignmentStart, long alignmentEnd) {
-        this.array = bases;
-        this.index = sequenceIndex;
-        this.name = sequenceName;
-
-        if (alignmentEnd == -1)
-            alignmentEnd = bases.length;
-
-        if (alignmentStart < 1 || alignmentEnd < alignmentStart
-                || alignmentEnd - alignmentStart > bases.length
-                || alignmentEnd - 1 > bases.length)
-            throw new IllegalArgumentException(String.format(
-                    "Invalid reference region: %s, %d, %d.", sequenceName,
-                    alignmentStart, alignmentEnd));
-
-        this.alignmentStart = alignmentStart;
-
-        this.arrayStart = (int) (alignmentStart - 1);
-    }
-
-    int arrayPosition(final long alignmentPosition) {
-        final int arrayPosition = (int) (arrayStart + (alignmentPosition - alignmentStart));
-
-        if (arrayPosition < 0 || arrayPosition > array.length)
-            throw new IllegalArgumentException(
-                    "The alignment position is out of the region: "
-                            + alignmentPosition);
-
-        return arrayPosition;
-    }
-
-    public byte base(final long alignmentPosition) {
-        return array[arrayPosition(alignmentPosition)];
-    }
-
-    public byte[] copy(final long alignmentStart, final int alignmentSpan) {
-        final int from = arrayPosition(alignmentStart);
-        final int to = arrayPosition(alignmentStart + alignmentSpan);
-        return Arrays.copyOfRange(array, from, to);
-    }
-
-    public int getIndex() {
-        return index;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public long getAlignmentStart() {
-        return alignmentStart;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/ReferenceSource.java b/src/main/java/htsjdk/samtools/cram/ref/ReferenceSource.java
deleted file mode 100644
index e73fb41..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/ReferenceSource.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.ref;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.cram.build.Utils;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import htsjdk.samtools.reference.ReferenceSequenceFileFactory;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.SequenceUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.ref.WeakReference;
-import java.net.URL;
-import java.nio.file.Path;
-import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * Used to represent a CRAM reference, the backing source for which can either be
- * a file or the EBI ENA reference service.
- *
- * NOTE: In a future release, this class will be renamed and the functionality it
- * contains will be refactored and distributed into one or more separate reference
- * source implementations, each corresponding to the type of resource backing the
- * reference.
- */
-public class ReferenceSource implements CRAMReferenceSource {
-    private static final Log log = Log.getInstance(ReferenceSource.class);
-    private ReferenceSequenceFile rsFile;
-    private int downloadTriesBeforeFailing = 2;
-
-    private final Map<String, WeakReference<byte[]>> cacheW = new HashMap<String, WeakReference<byte[]>>();
-
-    private ReferenceSource() {
-    }
-
-    public ReferenceSource(final File file) {
-        this(file == null ? null : file.toPath());
-    }
-
-    public ReferenceSource(final Path path) {
-        if (path != null)
-            rsFile = ReferenceSequenceFileFactory.getReferenceSequenceFile(path);
-    }
-
-    public ReferenceSource(final ReferenceSequenceFile rsFile) {
-        this.rsFile = rsFile;
-    }
-
-    /**
-     * Attempts to construct a default CRAMReferenceSource for use with CRAM files when
-     * one has not been explicitly provided.
-     *
-     * @return CRAMReferenceSource if one can be acquired. Guaranteed to not be null if none
-     * of the listed exceptions is thrown.
-     * @throws IllegalStateException if no default reference source can be acquired
-     * @throws IllegalArgumentException if the reference_fasta environment variable refers to a
-     * a file that doesn't exist
-     *<p>
-     * Construct a default reference source to use when an explicit reference has not been
-     * provided by checking for fallback sources in this order:
-     *<p><ul>
-     * <li>Defaults.REFERENCE_FASTA - the value of the system property "reference_fasta". If set,
-     * must refer to a valid reference file.</li>
-     * <li>ENA Reference Service if it is enabled</li>
-     * </ul>
-     */
-     public static CRAMReferenceSource getDefaultCRAMReferenceSource() {
-        if (null != Defaults.REFERENCE_FASTA) {
-            if (Defaults.REFERENCE_FASTA.exists()) {
-                return new ReferenceSource(Defaults.REFERENCE_FASTA);
-            }
-            else {
-                throw new IllegalArgumentException(
-                        "The file specified by the reference_fasta property does not exist: " + Defaults.REFERENCE_FASTA.getName());
-            }
-        }
-        else if (Defaults.USE_CRAM_REF_DOWNLOAD) {
-            return new ReferenceSource();
-        }
-        else {
-            throw new IllegalStateException(
-                    "A valid CRAM reference was not supplied and one cannot be acquired via the property settings reference_fasta or use_cram_ref_download");
-        }
-    }
-
-    public void clearCache() {
-        cacheW.clear();
-    }
-
-    private byte[] findInCache(final String name) {
-        final WeakReference<byte[]> weakReference = cacheW.get(name);
-        if (weakReference != null) {
-            final byte[] bytes = weakReference.get();
-            if (bytes != null)
-                return bytes;
-        }
-        return null;
-    }
-
-    // Upper case and normalize (-> ACGTN) in-place, and add to the cache
-    private byte[] addToCache(final String sequenceName, final byte[] bases) {
-        for (int i = 0; i < bases.length; i++) {
-            bases[i] = Utils.normalizeBase(bases[i]);
-        }
-        cacheW.put(sequenceName, new WeakReference<byte[]>(bases));
-        return bases;
-    }
-
-    public synchronized byte[] getReferenceBases(final SAMSequenceRecord record,
-                                                 final boolean tryNameVariants) {
-        { // check cache by sequence name:
-            final String name = record.getSequenceName();
-            final byte[] bases = findInCache(name);
-            if (bases != null) {
-                return bases;
-            }
-        }
-
-        final String md5 = record.getAttribute(SAMSequenceRecord.MD5_TAG);
-        { // check cache by md5:
-            if (md5 != null) {
-                byte[] bases = findInCache(md5);
-                if (bases != null)
-                    return bases;
-                bases = findInCache(md5.toLowerCase());
-                if (bases != null)
-                    return bases;
-                bases = findInCache(md5.toUpperCase());
-                if (bases != null)
-                    return bases;
-            }
-        }
-
-        byte[] bases;
-
-        { // try to fetch sequence by name:
-            bases = findBasesByName(record.getSequenceName(), tryNameVariants);
-            if (bases != null) {
-                return addToCache(record.getSequenceName(), bases);
-            }
-        }
-
-        {
-            if (Defaults.USE_CRAM_REF_DOWNLOAD) { // try to fetch sequence by md5:
-                if (md5 != null) {
-                    try {
-                        bases = findBasesByMD5(md5.toLowerCase());
-                    } catch (final Exception e) {
-                        throw new RuntimeException(e);
-                    }
-                }
-                if (bases != null) {
-                    return addToCache(md5, bases);
-                }
-            }
-        }
-
-        // sequence not found, give up:
-        return null;
-    }
-
-    byte[] findBasesByName(final String name, final boolean tryVariants) {
-        if (rsFile == null || !rsFile.isIndexed())
-            return null;
-
-        ReferenceSequence sequence = null;
-        try {
-            sequence = rsFile.getSequence(name);
-        } catch (final SAMException e) {
-            // the only way to test if rsFile contains the sequence is to try and catch exception.
-        }
-        if (sequence != null)
-            return sequence.getBases();
-
-        if (tryVariants) {
-            for (final String variant : getVariants(name)) {
-                try {
-                    sequence = rsFile.getSequence(variant);
-                } catch (final SAMException e) {
-                    log.warn("Sequence not found: " + variant);
-                }
-                if (sequence != null)
-                    return sequence.getBases();
-            }
-        }
-        return null;
-    }
-
-    byte[] findBasesByMD5(final String md5) throws
-            IOException {
-        final String url = String.format(Defaults.EBI_REFERENCE_SERVICE_URL_MASK, md5);
-
-        for (int i = 0; i < downloadTriesBeforeFailing; i++) {
-            final InputStream is = new URL(url).openStream();
-            if (is == null)
-                return null;
-
-            log.debug("Downloading reference sequence: " + url);
-            final byte[] data = InputStreamUtils.readFully(is);
-            log.debug("Downloaded " + data.length + " bytes for md5 " + md5);
-            is.close();
-
-            try {
-                final String downloadedMD5 = SequenceUtil.calculateMD5String(data);
-                if (md5.equals(downloadedMD5)) {
-                    return data;
-                } else {
-                    final String message = String
-                            .format("Downloaded sequence is corrupt: requested md5=%s, received md5=%s",
-                                    md5, downloadedMD5);
-                    log.error(message);
-                }
-            } catch (final NoSuchAlgorithmException e) {
-                throw new RuntimeException(e);
-            }
-        }
-        throw new RuntimeException("Giving up on downloading sequence for md5 "
-                + md5);
-    }
-
-    private static final Pattern chrPattern = Pattern.compile("chr.*",
-            Pattern.CASE_INSENSITIVE);
-
-    List<String> getVariants(final String name) {
-        final List<String> variants = new ArrayList<String>();
-
-        if (name.equals("M"))
-            variants.add("MT");
-
-        if (name.equals("MT"))
-            variants.add("M");
-
-        final boolean chrPatternMatch = chrPattern.matcher(name).matches();
-        if (chrPatternMatch)
-            variants.add(name.substring(3));
-        else
-            variants.add("chr" + name);
-
-        if ("chrM".equals(name)) {
-            // chrM case:
-            variants.add("MT");
-        }
-        return variants;
-    }
-
-    public int getDownloadTriesBeforeFailing() {
-        return downloadTriesBeforeFailing;
-    }
-
-    public void setDownloadTriesBeforeFailing(final int downloadTriesBeforeFailing) {
-        this.downloadTriesBeforeFailing = downloadTriesBeforeFailing;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/ReferenceTracks.java b/src/main/java/htsjdk/samtools/cram/ref/ReferenceTracks.java
deleted file mode 100644
index f81faed..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/ReferenceTracks.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.ref;
-
-import java.util.Arrays;
-
-public class ReferenceTracks {
-    public static final int DEFAULT_WINDOW_SIZE = 1000000;
-    private final int sequenceId;
-    private final String sequenceName;
-    private final byte[] reference;
-
-    private int position;
-
-    // a copy of ref bases for the given range:
-    private final byte[] bases;
-    private final short[] coverage;
-    private final short[] mismatches;
-
-
-    public ReferenceTracks(final int sequenceId, final String sequenceName,
-                           final byte[] reference) {
-        this(sequenceId, sequenceName, reference, DEFAULT_WINDOW_SIZE);
-    }
-
-    private ReferenceTracks(final int sequenceId, final String sequenceName,
-                            final byte[] reference, final int windowSize) {
-        this.sequenceId = sequenceId;
-        this.sequenceName = sequenceName;
-        this.reference = reference;
-
-        bases = new byte[Math.min(windowSize, reference.length)];
-        coverage = new short[Math.min(windowSize, reference.length)];
-        mismatches = new short[Math.min(windowSize, reference.length)];
-        position = 1;
-
-        reset();
-    }
-
-    public int getSequenceId() {
-        return sequenceId;
-    }
-
-    public String getSequenceName() {
-        return sequenceName;
-    }
-
-    public int getWindowPosition() {
-        return position;
-    }
-
-    public int getWindowLength() {
-        return bases.length;
-    }
-
-    public int getReferenceLength() {
-        return reference.length;
-    }
-
-    public void ensure(final int start, final int end) {
-        if (end - start > bases.length)
-            throw new RuntimeException("Window is too small for start " + start
-                    + " end " + end);
-        if (position < start)
-            moveForwardTo(start);
-    }
-
-    /**
-     * Shift the window forward to a new position on the reference.
-     *
-     * @param newPos 1-based reference coordinate, must be greater than current
-     *               position and smaller than reference length.
-     */
-    void moveForwardTo(int newPos) {
-        if (newPos - 1 >= reference.length)
-            throw new RuntimeException("New position is beyond the reference: "
-                    + newPos);
-
-        if (newPos < position)
-            throw new RuntimeException(
-                    "Cannot shift to smaller position on the reference.");
-
-        if (newPos > reference.length - bases.length + 1)
-            newPos = reference.length - bases.length + 1;
-
-        if (newPos == position)
-            return;
-
-        System.arraycopy(reference, newPos - 1, bases, 0,
-                Math.min(bases.length, reference.length - newPos + 1));
-
-        if (newPos > position && position + bases.length - newPos > 0) {
-            for (int i = 0; i < coverage.length; i++) {
-                if (i + newPos - position < coverage.length) {
-                    coverage[i] = coverage[i + newPos - position];
-                    mismatches[i] = mismatches[i + newPos - position];
-                } else {
-                    coverage[i] = 0;
-                    mismatches[i] = 0;
-                }
-            }
-        } else {
-            Arrays.fill(coverage, (short) 0);
-            Arrays.fill(mismatches, (short) 0);
-        }
-
-        this.position = newPos;
-    }
-
-    void reset() {
-        System.arraycopy(reference, position - 1, bases, 0,
-                Math.min(bases.length, reference.length - position + 1));
-        Arrays.fill(coverage, (short) 0);
-        Arrays.fill(mismatches, (short) 0);
-    }
-
-    public void ensureRange(final int start, final int length) {
-        if (start < position)
-            throw new RuntimeException("Cannot move the window backwards: "
-                    + start);
-
-        if (start > position || start + length > position + bases.length)
-            moveForwardTo(start);
-    }
-
-    public final byte baseAt(final int pos) {
-        if (pos - this.position < coverage.length)
-            return bases[pos - this.position];
-        else
-            return 'N';
-    }
-
-    public final short coverageAt(final int pos) {
-        if (pos - this.position >= coverage.length)
-            return 0;
-        else {
-            return coverage[pos - this.position];
-        }
-    }
-
-    public final short mismatchesAt(final int pos) {
-        if (pos - this.position >= coverage.length)
-            return 0;
-        else
-            return mismatches[pos - this.position];
-    }
-
-    public final void addCoverage(final int pos, final int amount) {
-        if (pos - this.position < coverage.length)
-            coverage[pos - this.position] += amount;
-    }
-
-    public final void addMismatches(final int pos, final int amount) {
-        if (pos - this.position < coverage.length)
-            mismatches[pos - this.position] += amount;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/AlignmentSpan.java b/src/main/java/htsjdk/samtools/cram/structure/AlignmentSpan.java
deleted file mode 100644
index 6e18dd2..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/AlignmentSpan.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * A span of reads on a single reference.
- */
-public class AlignmentSpan {
-    /**
-     * A constant to represent an unmapped span.
-     */
-    public static final AlignmentSpan UNMAPPED_SPAN = new AlignmentSpan(SAMRecord.NO_ALIGNMENT_START, 0);
-
-    private int start;
-    private int span;
-    private int count;
-
-    /**
-     * Create a new span with a single read in it.
-     *
-     * @param start alignment start of the span
-     * @param span  alignment span
-     */
-    public AlignmentSpan(final int start, final int span) {
-        this.setStart(start);
-        this.setSpan(span);
-        this.count = 1;
-    }
-
-    /**
-     * Create a new span with a multiple reads in it.
-     *
-     * @param start alignment start of the span
-     * @param span  alignment span
-     * @param count number of reads in the span
-     */
-    public AlignmentSpan(final int start, final int span, final int count) {
-        this.setStart(start);
-        this.setSpan(span);
-        this.count = count;
-    }
-
-    /**
-     * Add multiple reads to the span.
-     *
-     * @param start alignment start
-     * @param span  alignment span
-     * @param count number of reads to add
-     */
-    public void add(final int start, final int span, final int count) {
-        if (this.getStart() > start) {
-            this.setSpan(Math.max(this.getStart() + this.getSpan(), start + span) - start);
-            this.setStart(start);
-        } else if (this.getStart() < start) {
-            this.setSpan(Math.max(this.getStart() + this.getSpan(), start + span) - this.getStart());
-        } else {
-            this.setSpan(Math.max(this.getSpan(), span));
-        }
-
-        this.count += count;
-    }
-
-    /**
-     * Add a single read to the span
-     *
-     * @param start alignment start
-     * @param span  read span on the reference
-     */
-    public void addSingle(final int start, final int span) {
-        add(start, span, 1);
-    }
-
-    public int getStart() {
-        return start;
-    }
-
-    public void setStart(final int start) {
-        this.start = start;
-    }
-
-    public int getSpan() {
-        return span;
-    }
-
-    public void setSpan(final int span) {
-        this.span = span;
-    }
-
-    public int getCount() {
-        return count;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/Block.java b/src/main/java/htsjdk/samtools/cram/structure/Block.java
deleted file mode 100644
index 2e99b8a..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/Block.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.io.CRC32InputStream;
-import htsjdk.samtools.cram.io.CRC32OutputStream;
-import htsjdk.samtools.cram.io.CramInt;
-import htsjdk.samtools.cram.io.ExternalCompression;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-
-/**
- * Class representing CRAM block concept and some methods to operate with block content. CRAM block is used to hold some (usually
- * homogeneous) binary data. An external compression can be applied to the content of a block. The class provides some instantiation static
- * methods, for example to read a block from an input stream. Blocks can be written out to an output stream, this may be considered as a way
- * to serialize/deserialize blocks.
- */
-public class Block {
-    /**
-     * Compression method that applied to this block's content.
-     */
-    private BlockCompressionMethod method;
-    /**
-     * Identifies CRAM content type of the block.
-     */
-    private BlockContentType contentType;
-    /**
-     * A handle to bind the block with it's metadata.
-     */
-    private int contentId;
-    /**
-     * The size of the compressed content in bytes.
-     */
-    private int compressedContentSize;
-    /**
-     * The size of the uncompressed content in bytes.
-     */
-    private int rawContentSize;
-
-    /**
-     * Uncompressed and compressed contents respectively.
-     */
-    private byte[] rawContent, compressedContent;
-
-    public Block() {
-    }
-
-    /**
-     * Deserialize the block from the {@link InputStream}. The reading is parametrized by the major CRAM version number.
-     *
-     * @param major CRAM version major number
-     * @param inputStream    input stream to read the block from
-     * @return a new {@link Block} object with fields and content from the input stream
-     * @throws IOException as per java IO contract
-     */
-    public static Block readFromInputStream(final int major, InputStream inputStream) throws IOException {
-        final Block block = new Block();
-        final boolean v3OrHigher = major >= CramVersions.CRAM_v3.major;
-        if (v3OrHigher) inputStream = new CRC32InputStream(inputStream);
-        block.setMethod(BlockCompressionMethod.values()[inputStream.read()]);
-
-        final int contentTypeId = inputStream.read();
-        block.setContentType(BlockContentType.values()[contentTypeId]);
-
-        block.setContentId(ITF8.readUnsignedITF8(inputStream));
-        block.compressedContentSize = ITF8.readUnsignedITF8(inputStream);
-        block.rawContentSize = ITF8.readUnsignedITF8(inputStream);
-
-        block.compressedContent = new byte[block.compressedContentSize];
-        InputStreamUtils.readFully(inputStream, block.compressedContent, 0, block.compressedContent.length);
-        if (v3OrHigher) {
-            final int actualChecksum = ((CRC32InputStream) inputStream).getCRC32();
-            final int checksum = CramInt.int32(inputStream);
-            if (checksum != actualChecksum)
-                throw new RuntimeException(String.format("Block CRC32 mismatch: %04x vs %04x", checksum, actualChecksum));
-        }
-
-        block.uncompress();
-        return block;
-    }
-
-    /**
-     * Create a new slice header block with the given uncompressed content. The block wil have RAW (no compression) and MAPPED_SLICE content
-     * type.
-     *
-     * @param rawContent the content of the block
-     * @return a new mapped slice {@link Block} object
-     */
-    public static Block buildNewSliceHeaderBlock(final byte[] rawContent) {
-        return new Block(BlockContentType.MAPPED_SLICE, rawContent);
-    }
-
-    /**
-     * Create a new core block with the given uncompressed content. The block wil have RAW (no compression) and CORE content type.
-     *
-     * @param rawContent the content of the block
-     * @return a new core {@link Block} object
-     */
-    public static Block buildNewCore(final byte[] rawContent) {
-        return new Block(BlockContentType.CORE, rawContent);
-    }
-
-    /**
-     * Create a new core block with the given uncompressed content. The block wil have RAW (no compression) and CORE content type.
-     *
-     * @param rawContent the content of the block
-     * @return a new core {@link Block} object
-     */
-    public static Block buildNewFileHeaderBlock(final byte[] rawContent) {
-        final Block block = new Block(BlockContentType.FILE_HEADER, rawContent);
-        block.compress();
-        return block;
-    }
-
-    private Block(final BlockContentType contentType, final byte[] rawContent) {
-        this.setMethod(BlockCompressionMethod.RAW);
-        this.setContentType(contentType);
-        this.setContentId(0);
-        if (rawContent != null) setRawContent(rawContent);
-    }
-
-    @Override
-    public String toString() {
-        final String raw = rawContent == null ? "NULL" : Arrays.toString(Arrays.copyOf(rawContent, Math.min(5, rawContent.length)));
-        final String comp = compressedContent == null ? "NULL" : Arrays.toString(Arrays.copyOf(compressedContent, Math.min(5,
-                compressedContent.length)));
-
-        return String.format("method=%s, type=%s, id=%d, raw size=%d, compressed size=%d, raw=%s, comp=%s.", getMethod().name(),
-                getContentType().name(), getContentId(), rawContentSize, compressedContentSize, raw, comp);
-    }
-
-    boolean isCompressed() {
-        return compressedContent != null;
-    }
-
-    boolean isUncompressed() {
-        return rawContent != null;
-    }
-
-    public void setRawContent(final byte[] raw) {
-        rawContent = raw;
-        rawContentSize = raw == null ? 0 : raw.length;
-
-        compressedContent = null;
-        compressedContentSize = 0;
-    }
-
-    public byte[] getRawContent() {
-        if (rawContent == null) uncompress();
-        return rawContent;
-    }
-
-    public int getRawContentSize() {
-        return rawContentSize;
-    }
-
-    public void setContent(final byte[] raw, final byte[] compressed) {
-        rawContent = raw;
-        compressedContent = compressed;
-
-        if (raw == null) rawContentSize = 0;
-        else rawContentSize = raw.length;
-
-        if (compressed == null) compressedContentSize = 0;
-        else compressedContentSize = compressed.length;
-    }
-
-    void setCompressedContent(final byte[] compressed) {
-        this.compressedContent = compressed;
-        compressedContentSize = compressed == null ? 0 : compressed.length;
-
-        rawContent = null;
-        rawContentSize = 0;
-    }
-
-    byte[] getCompressedContent() {
-        if (compressedContent == null) compress();
-        return compressedContent;
-    }
-
-    private void compress() {
-        if (compressedContent != null || rawContent == null) return;
-
-        switch (getMethod()) {
-            case RAW:
-                compressedContent = rawContent;
-                compressedContentSize = rawContentSize;
-                break;
-            case GZIP:
-                try {
-                    compressedContent = ExternalCompression.gzip(rawContent);
-                } catch (final IOException e) {
-                    throw new RuntimeException("This should have never happened.", e);
-                }
-                compressedContentSize = compressedContent.length;
-                break;
-            case RANS:
-                compressedContent = ExternalCompression.rans(rawContent, 1);
-                compressedContentSize = compressedContent.length;
-                break;
-            default:
-                break;
-        }
-    }
-
-    private void uncompress() {
-        if (rawContent != null || compressedContent == null) return;
-
-        switch (getMethod()) {
-            case RAW:
-                rawContent = compressedContent;
-                rawContentSize = compressedContentSize;
-                break;
-            case GZIP:
-                try {
-                    rawContent = ExternalCompression.gunzip(compressedContent);
-                } catch (final IOException e) {
-                    throw new RuntimeException("This should have never happened.", e);
-                }
-                break;
-            case BZIP2:
-                try {
-                    rawContent = ExternalCompression.unbzip2(compressedContent);
-                } catch (final IOException e) {
-                    throw new RuntimeException("This should have never happened.", e);
-                }
-                break;
-            case LZMA:
-                try {
-                    rawContent = ExternalCompression.unxz(compressedContent);
-                } catch (final IOException e) {
-                    throw new RuntimeException("This should have never happened.", e);
-                }
-                break;
-            case RANS:
-                rawContent = ExternalCompression.unrans(compressedContent);
-                break;
-            default:
-                throw new RuntimeException("Unknown block compression method: " + getMethod().name());
-        }
-    }
-
-    /**
-     * Write the block out to the the specified {@link OutputStream}. The method is parametrized with CRAM major version number.
-     *
-     * @param major CRAM version major number
-     * @param outputStream    output stream to write to
-     * @throws IOException as per java IO contract
-     */
-    public void write(final int major, final OutputStream outputStream) throws IOException {
-        if (major >= CramVersions.CRAM_v3.major) {
-
-            final CRC32OutputStream crc32OutputStream = new CRC32OutputStream(outputStream);
-
-            doWrite(crc32OutputStream);
-
-            outputStream.write(crc32OutputStream.getCrc32_LittleEndian());
-        } else doWrite(outputStream);
-    }
-
-    private void doWrite(final OutputStream outputStream) throws IOException {
-        if (!isCompressed()) compress();
-        if (!isUncompressed()) uncompress();
-
-        outputStream.write(getMethod().ordinal());
-        outputStream.write(getContentType().ordinal());
-
-        ITF8.writeUnsignedITF8(getContentId(), outputStream);
-        ITF8.writeUnsignedITF8(compressedContentSize, outputStream);
-        ITF8.writeUnsignedITF8(rawContentSize, outputStream);
-
-        outputStream.write(getCompressedContent());
-    }
-
-    BlockCompressionMethod getMethod() {
-        return method;
-    }
-
-    public void setMethod(final BlockCompressionMethod method) {
-        this.method = method;
-    }
-
-    public BlockContentType getContentType() {
-        return contentType;
-    }
-
-    public void setContentType(final BlockContentType contentType) {
-        this.contentType = contentType;
-    }
-
-    public int getContentId() {
-        return contentId;
-    }
-
-    public void setContentId(final int contentId) {
-        this.contentId = contentId;
-    }
-
-    public int getCompressedContentSize() {
-        return compressedContentSize;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/BlockCompressionMethod.java b/src/main/java/htsjdk/samtools/cram/structure/BlockCompressionMethod.java
deleted file mode 100644
index 918b3bd..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/BlockCompressionMethod.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-public enum BlockCompressionMethod {
-    RAW, GZIP, BZIP2, LZMA, RANS
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/BlockContentType.java b/src/main/java/htsjdk/samtools/cram/structure/BlockContentType.java
deleted file mode 100644
index e10b9f1..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/BlockContentType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-public enum BlockContentType {
-    FILE_HEADER, COMPRESSION_HEADER, MAPPED_SLICE, RESERVED, EXTERNAL, CORE
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/CompressionHeader.java b/src/main/java/htsjdk/samtools/cram/structure/CompressionHeader.java
deleted file mode 100644
index 2278bf1..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/CompressionHeader.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.cram.encoding.ExternalCompressor;
-import htsjdk.samtools.cram.encoding.NullEncoding;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.util.Log;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class CompressionHeader {
-    private static final String RN_readNamesIncluded = "RN";
-    private static final String AP_alignmentPositionIsDelta = "AP";
-    private static final String RR_referenceRequired = "RR";
-    private static final String TD_tagIdsDictionary = "TD";
-    private static final String SM_substitutionMatrix = "SM";
-
-    private static final Log log = Log.getInstance(CompressionHeader.class);
-
-    public boolean readNamesIncluded;
-    public boolean APDelta = true;
-    private boolean referenceRequired = true;
-
-    public Map<EncodingKey, EncodingParams> encodingMap;
-    public Map<Integer, EncodingParams> tMap;
-    public final Map<Integer, ExternalCompressor> externalCompressors = new HashMap<Integer, ExternalCompressor>();
-
-    public SubstitutionMatrix substitutionMatrix;
-
-    public List<Integer> externalIds;
-
-    public byte[][][] dictionary;
-
-    public CompressionHeader() {
-    }
-
-    private CompressionHeader(final InputStream inputStream) throws IOException {
-        read(inputStream);
-    }
-
-    private byte[][][] parseDictionary(final byte[] bytes) {
-        final List<List<byte[]>> dictionary = new ArrayList<List<byte[]>>();
-        {
-            int i = 0;
-            while (i < bytes.length) {
-                final List<byte[]> list = new ArrayList<byte[]>();
-                while (bytes[i] != 0) {
-                    list.add(Arrays.copyOfRange(bytes, i, i + 3));
-                    i += 3;
-                }
-                i++;
-                dictionary.add(list);
-            }
-        }
-
-        int maxWidth = 0;
-        for (final List<byte[]> list : dictionary)
-            maxWidth = Math.max(maxWidth, list.size());
-
-        final byte[][][] array = new byte[dictionary.size()][][];
-        for (int i = 0; i < dictionary.size(); i++) {
-            final List<byte[]> list = dictionary.get(i);
-            array[i] = list.toArray(new byte[list.size()][]);
-        }
-
-        return array;
-    }
-
-    private byte[] dictionaryToByteArray() {
-        int size = 0;
-        for (final byte[][] dictionaryArrayArray : dictionary) {
-            for (final byte[] dictionaryArray : dictionaryArrayArray) size += dictionaryArray.length;
-            size++;
-        }
-
-        final byte[] bytes = new byte[size];
-        final ByteBuffer buffer = ByteBuffer.wrap(bytes);
-        for (final byte[][] dictionaryArrayArray : dictionary) {
-            for (final byte[] dictionaryArray : dictionaryArrayArray) buffer.put(dictionaryArray);
-            buffer.put((byte) 0);
-        }
-
-        return bytes;
-    }
-
-    public byte[][] getTagIds(final int id) {
-        return dictionary[id];
-    }
-
-    public void read(final byte[] data) {
-        try {
-            read(new ByteArrayInputStream(data));
-        } catch (final IOException e) {
-            throw new RuntimeException("This should have never happened.");
-        }
-    }
-
-    void read(final InputStream is) throws IOException {
-        { // preservation map:
-            final int byteSize = ITF8.readUnsignedITF8(is);
-            final byte[] bytes = new byte[byteSize];
-            InputStreamUtils.readFully(is, bytes, 0, bytes.length);
-            final ByteBuffer buffer = ByteBuffer.wrap(bytes);
-
-            final int mapSize = ITF8.readUnsignedITF8(buffer);
-            for (int i = 0; i < mapSize; i++) {
-                final String key = new String(new byte[]{buffer.get(), buffer.get()});
-                if (RN_readNamesIncluded.equals(key))
-                    readNamesIncluded = buffer.get() == 1;
-                else if (AP_alignmentPositionIsDelta.equals(key))
-                    APDelta = buffer.get() == 1;
-                else if (RR_referenceRequired.equals(key))
-                    referenceRequired = buffer.get() == 1;
-                else if (TD_tagIdsDictionary.equals(key)) {
-                    final int size = ITF8.readUnsignedITF8(buffer);
-                    final byte[] dictionaryBytes = new byte[size];
-                    buffer.get(dictionaryBytes);
-                    dictionary = parseDictionary(dictionaryBytes);
-                } else if (SM_substitutionMatrix.equals(key)) {
-                    // parse subs matrix here:
-                    final byte[] matrixBytes = new byte[5];
-                    buffer.get(matrixBytes);
-                    substitutionMatrix = new SubstitutionMatrix(matrixBytes);
-                } else
-                    throw new RuntimeException("Unknown preservation map key: "
-                            + key);
-            }
-        }
-
-        { // encoding map:
-            final int byteSize = ITF8.readUnsignedITF8(is);
-            final byte[] bytes = new byte[byteSize];
-            InputStreamUtils.readFully(is, bytes, 0, bytes.length);
-            final ByteBuffer buffer = ByteBuffer.wrap(bytes);
-
-            final int mapSize = ITF8.readUnsignedITF8(buffer);
-            encodingMap = new TreeMap<EncodingKey, EncodingParams>();
-            for (final EncodingKey encodingKey : EncodingKey.values())
-                encodingMap.put(encodingKey, NullEncoding.toParam());
-
-            for (int i = 0; i < mapSize; i++) {
-                final String key = new String(new byte[]{buffer.get(), buffer.get()});
-                final EncodingKey encodingKey = EncodingKey.byFirstTwoChars(key);
-                if (encodingKey == null) {
-                    throw new CRAMException("Unknown encoding key: " + key);
-                }
-
-                final EncodingID id = EncodingID.values()[buffer.get()];
-                final int paramLen = ITF8.readUnsignedITF8(buffer);
-                final byte[] paramBytes = new byte[paramLen];
-                buffer.get(paramBytes);
-
-                encodingMap.put(encodingKey, new EncodingParams(id, paramBytes));
-
-                log.debug(String.format("FOUND ENCODING: %s, %s, %s.",
-                        encodingKey.name(), id.name(),
-                        Arrays.toString(Arrays.copyOf(paramBytes, 20))));
-            }
-        }
-
-        { // tag encoding map:
-            final int byteSize = ITF8.readUnsignedITF8(is);
-            final byte[] bytes = new byte[byteSize];
-            InputStreamUtils.readFully(is, bytes, 0, bytes.length);
-            final ByteBuffer buf = ByteBuffer.wrap(bytes);
-
-            final int mapSize = ITF8.readUnsignedITF8(buf);
-            tMap = new TreeMap<Integer, EncodingParams>();
-            for (int i = 0; i < mapSize; i++) {
-                final int key = ITF8.readUnsignedITF8(buf);
-
-                final EncodingID id = EncodingID.values()[buf.get()];
-                final int paramLen = ITF8.readUnsignedITF8(buf);
-                final byte[] paramBytes = new byte[paramLen];
-                buf.get(paramBytes);
-
-                tMap.put(key, new EncodingParams(id, paramBytes));
-            }
-        }
-    }
-
-    public byte[] toByteArray() throws IOException {
-        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        write(byteArrayOutputStream);
-        return byteArrayOutputStream.toByteArray();
-    }
-
-    void write(final OutputStream outputStream) throws IOException {
-
-        { // preservation map:
-            final ByteBuffer mapBuffer = ByteBuffer.allocate(1024 * 100);
-            ITF8.writeUnsignedITF8(5, mapBuffer);
-
-            mapBuffer.put(RN_readNamesIncluded.getBytes());
-            mapBuffer.put((byte) (readNamesIncluded ? 1 : 0));
-
-            mapBuffer.put(AP_alignmentPositionIsDelta.getBytes());
-            mapBuffer.put((byte) (APDelta ? 1 : 0));
-
-            mapBuffer.put(RR_referenceRequired.getBytes());
-            mapBuffer.put((byte) (referenceRequired ? 1 : 0));
-
-            mapBuffer.put(SM_substitutionMatrix.getBytes());
-            mapBuffer.put(substitutionMatrix.getEncodedMatrix());
-
-            mapBuffer.put(TD_tagIdsDictionary.getBytes());
-            {
-                final byte[] dictionaryBytes = dictionaryToByteArray();
-                ITF8.writeUnsignedITF8(dictionaryBytes.length, mapBuffer);
-                mapBuffer.put(dictionaryBytes);
-            }
-
-            mapBuffer.flip();
-            final byte[] mapBytes = new byte[mapBuffer.limit()];
-            mapBuffer.get(mapBytes);
-
-            ITF8.writeUnsignedITF8(mapBytes.length, outputStream);
-            outputStream.write(mapBytes);
-        }
-
-        { // encoding map:
-            int size = 0;
-            for (final EncodingKey encodingKey : encodingMap.keySet()) {
-                if (encodingMap.get(encodingKey).id != EncodingID.NULL)
-                    size++;
-            }
-
-            final ByteBuffer mapBuffer = ByteBuffer.allocate(1024 * 100);
-            ITF8.writeUnsignedITF8(size, mapBuffer);
-            for (final EncodingKey encodingKey : encodingMap.keySet()) {
-                if (encodingMap.get(encodingKey).id == EncodingID.NULL)
-                    continue;
-
-                mapBuffer.put((byte) encodingKey.name().charAt(0));
-                mapBuffer.put((byte) encodingKey.name().charAt(1));
-
-                final EncodingParams params = encodingMap.get(encodingKey);
-                mapBuffer.put((byte) (0xFF & params.id.ordinal()));
-                ITF8.writeUnsignedITF8(params.params.length, mapBuffer);
-                mapBuffer.put(params.params);
-            }
-            mapBuffer.flip();
-            final byte[] mapBytes = new byte[mapBuffer.limit()];
-            mapBuffer.get(mapBytes);
-
-            ITF8.writeUnsignedITF8(mapBytes.length, outputStream);
-            outputStream.write(mapBytes);
-        }
-
-        { // tag encoding map:
-            final ByteBuffer mapBuffer = ByteBuffer.allocate(1024 * 100);
-            ITF8.writeUnsignedITF8(tMap.size(), mapBuffer);
-            for (final Integer encodingKey : tMap.keySet()) {
-                ITF8.writeUnsignedITF8(encodingKey, mapBuffer);
-
-                final EncodingParams params = tMap.get(encodingKey);
-                mapBuffer.put((byte) (0xFF & params.id.ordinal()));
-                ITF8.writeUnsignedITF8(params.params.length, mapBuffer);
-                mapBuffer.put(params.params);
-            }
-            mapBuffer.flip();
-            final byte[] mapBytes = new byte[mapBuffer.limit()];
-            mapBuffer.get(mapBytes);
-
-            ITF8.writeUnsignedITF8(mapBytes.length, outputStream);
-            outputStream.write(mapBytes);
-        }
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/Container.java b/src/main/java/htsjdk/samtools/cram/structure/Container.java
deleted file mode 100644
index 2a4eb3b..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/Container.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMRecord;
-
-public class Container {
-    // container header as defined in the specs:
-    /**
-     * Byte size of the content excluding header.
-     */
-    public int containerByteSize;
-    public int sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-    public int alignmentStart = Slice.NO_ALIGNMENT_START;
-    public int alignmentSpan = Slice.NO_ALIGNMENT_SPAN;
-    public int nofRecords = 0;
-    public long globalRecordCounter = 0;
-
-    public long bases = 0;
-    public int blockCount = -1;
-    public int[] landmarks;
-    public int checksum = 0;
-
-    /**
-     * Container data
-     */
-    public Block[] blocks;
-
-    public CompressionHeader header;
-
-    // slices found in the container:
-    public Slice[] slices;
-
-    // for performance measurement:
-    public long buildHeaderTime;
-    public long buildSlicesTime;
-    public long writeTime;
-    public long parseTime;
-    public long readTime;
-
-    // for indexing:
-    /**
-     * Container start in the stream.
-     */
-    public long offset;
-
-    @Override
-    public String toString() {
-        return String
-                .format("seqID=%d, start=%d, span=%d, records=%d, slices=%d, blocks=%d.",
-                        sequenceId, alignmentStart, alignmentSpan, nofRecords,
-                        slices == null ? -1 : slices.length, blockCount);
-    }
-
-    public boolean isEOF() {
-        final boolean v3 = containerByteSize == 15 && sequenceId == -1
-                && alignmentStart == 4542278 && blockCount == 1
-                && nofRecords == 0 && (slices == null || slices.length == 0);
-
-        final boolean v2 = containerByteSize == 11 && sequenceId == -1
-                && alignmentStart == 4542278 && blockCount == 1
-                && nofRecords == 0 && (slices == null || slices.length == 0);
-
-        return v3 || v2;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/ContainerHeaderIO.java b/src/main/java/htsjdk/samtools/cram/structure/ContainerHeaderIO.java
deleted file mode 100644
index fd6edfe..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/ContainerHeaderIO.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.cram.io.CRC32OutputStream;
-import htsjdk.samtools.cram.io.CramArray;
-import htsjdk.samtools.cram.io.CramInt;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.io.LTF8;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-class ContainerHeaderIO {
-
-    public boolean readContainerHeader(final Container container, final InputStream inputStream)
-            throws IOException {
-        return readContainerHeader(2, container, inputStream);
-    }
-
-    public boolean readContainerHeader(final int major, final Container container, final InputStream inputStream)
-            throws IOException {
-        final byte[] peek = new byte[4];
-        int character = inputStream.read();
-        if (character == -1)
-            return false;
-
-        peek[0] = (byte) character;
-        for (int i = 1; i < peek.length; i++) {
-            character = inputStream.read();
-            if (character == -1)
-                throw new RuntimeException("Incomplete or broken stream.");
-            peek[i] = (byte) character;
-        }
-
-        container.containerByteSize = CramInt.int32(peek);
-        container.sequenceId = ITF8.readUnsignedITF8(inputStream);
-        container.alignmentStart = ITF8.readUnsignedITF8(inputStream);
-        container.alignmentSpan = ITF8.readUnsignedITF8(inputStream);
-        container.nofRecords = ITF8.readUnsignedITF8(inputStream);
-        container.globalRecordCounter = LTF8.readUnsignedLTF8(inputStream);
-        container.bases = LTF8.readUnsignedLTF8(inputStream);
-        container.blockCount = ITF8.readUnsignedITF8(inputStream);
-        container.landmarks = CramArray.array(inputStream);
-        if (major >= 3)
-            container.checksum = CramInt.int32(inputStream);
-
-        return true;
-    }
-
-    /**
-     * Write CRAM {@link Container} out into the given {@link OutputStream}.
-     * @param major CRAM major version
-     * @param container container to be written
-     * @param outputStream the output stream to write the container to
-     * @return number of bytes written out to the output stream
-     * @throws IOException as per java IO contract
-     */
-    public int writeContainerHeader(final int major, final Container container, final OutputStream outputStream)
-            throws IOException {
-        final CRC32OutputStream crc32OutputStream = new CRC32OutputStream(outputStream);
-
-        int length = (CramInt.writeInt32(container.containerByteSize, crc32OutputStream) + 7) / 8;
-        length += (ITF8.writeUnsignedITF8(container.sequenceId, crc32OutputStream) + 7) / 8;
-        length += (ITF8.writeUnsignedITF8(container.alignmentStart, crc32OutputStream) + 7) / 8;
-        length += (ITF8.writeUnsignedITF8(container.alignmentSpan, crc32OutputStream) + 7) / 8;
-        length += (ITF8.writeUnsignedITF8(container.nofRecords, crc32OutputStream) + 7) / 8;
-        length += (LTF8.writeUnsignedLTF8(container.globalRecordCounter, crc32OutputStream) + 7) / 8;
-        length += (LTF8.writeUnsignedLTF8(container.bases, crc32OutputStream) + 7) / 8;
-        length += (ITF8.writeUnsignedITF8(container.blockCount, crc32OutputStream) + 7) / 8;
-        length += (CramArray.write(container.landmarks, crc32OutputStream) + 7) / 8;
-
-        if (major >= 3) {
-            outputStream.write(crc32OutputStream.getCrc32_LittleEndian());
-            length += 4 ;
-        }
-
-        return length;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/ContainerIO.java b/src/main/java/htsjdk/samtools/cram/structure/ContainerIO.java
deleted file mode 100644
index 6796d34..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/ContainerIO.java
+++ /dev/null
@@ -1,237 +0,0 @@
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.common.CramVersionPolicies;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.util.Log;
-import org.apache.commons.compress.utils.CountingOutputStream;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Methods to read and write CRAM containers.
- */
-public class ContainerIO {
-    private static final Log log = Log.getInstance(ContainerIO.class);
-
-    /**
-     * Reads a CRAM container from the input stream. Returns an EOF container when there is no more data or the EOF marker found.
-     *
-     * @param version CRAM version to expect
-     * @param inputStream      the stream to read from
-     * @return a new container object read from the stream
-     * @throws IOException as per java IO contract
-     */
-    public static Container readContainer(final Version version, final InputStream inputStream) throws IOException {
-        final Container container = readContainer(version.major, inputStream);
-        if (container == null) {
-            // this will cause System.exit(1):
-            CramVersionPolicies.eofNotFound(version);
-
-            return readContainer(version.major, new ByteArrayInputStream(CramIO.ZERO_B_EOF_MARKER));
-        }
-        if (container.isEOF()) log.debug("EOF marker found, file/stream is complete.");
-
-        return container;
-    }
-
-    /**
-     * Reads next container from the stream.
-     *
-     * @param inputStream the stream to read from
-     * @return CRAM container or null if no more data
-     * @throws IOException
-     */
-    private static Container readContainer(final int major, final InputStream inputStream) throws IOException {
-        return readContainer(major, inputStream, 0, Integer.MAX_VALUE);
-    }
-
-    /**
-     * Reads container header only from a {@link InputStream}.
-     *
-     * @param major the CRAM version to assume
-     * @param inputStream    the input stream to read from
-     * @return a new {@link Container} object with container header values filled out but empty body (no slices and blocks).
-     * @throws IOException as per java IO contract
-     */
-    public static Container readContainerHeader(final int major, final InputStream inputStream) throws IOException {
-        final Container container = new Container();
-        final ContainerHeaderIO containerHeaderIO = new ContainerHeaderIO();
-        if (!containerHeaderIO.readContainerHeader(major, container, inputStream)) {
-            containerHeaderIO.readContainerHeader(container, new ByteArrayInputStream((major >= 3 ? CramIO.ZERO_F_EOF_MARKER : CramIO.ZERO_B_EOF_MARKER)));
-            return container;
-        }
-        return container;
-    }
-
-    @SuppressWarnings("SameParameterValue")
-    private static Container readContainer(final int major, final InputStream inputStream, final int fromSlice, int howManySlices) throws IOException {
-
-        final long time1 = System.nanoTime();
-        final Container container = readContainerHeader(major, inputStream);
-        if (container.isEOF()) return container;
-
-        final Block block = Block.readFromInputStream(major, inputStream);
-        if (block.getContentType() != BlockContentType.COMPRESSION_HEADER)
-            throw new RuntimeException("Content type does not match: " + block.getContentType().name());
-        container.header = new CompressionHeader();
-        container.header.read(block.getRawContent());
-
-        howManySlices = Math.min(container.landmarks.length, howManySlices);
-
-        if (fromSlice > 0) //noinspection ResultOfMethodCallIgnored
-            inputStream.skip(container.landmarks[fromSlice]);
-
-        final List<Slice> slices = new ArrayList<Slice>();
-        for (int sliceCount = fromSlice; sliceCount < howManySlices - fromSlice; sliceCount++) {
-            final Slice slice = new Slice();
-            SliceIO.read(major, slice, inputStream);
-            slice.index = sliceCount;
-            slices.add(slice);
-        }
-
-        container.slices = slices.toArray(new Slice[slices.size()]);
-
-        calculateSliceOffsetsAndSizes(container);
-
-        final long time2 = System.nanoTime();
-
-        log.debug("READ CONTAINER: " + container.toString());
-        container.readTime = time2 - time1;
-
-        return container;
-    }
-
-    private static void calculateSliceOffsetsAndSizes(final Container container) {
-        if (container.slices.length == 0) return;
-        for (int i = 0; i < container.slices.length - 1; i++) {
-            final Slice slice = container.slices[i];
-            slice.offset = container.landmarks[i];
-            slice.size = container.landmarks[i + 1] - slice.offset;
-            slice.containerOffset = container.offset;
-            slice.index = i;
-        }
-        final Slice lastSlice = container.slices[container.slices.length - 1];
-        lastSlice.offset = container.landmarks[container.landmarks.length - 1];
-        lastSlice.size = container.containerByteSize - lastSlice.offset;
-        lastSlice.containerOffset = container.offset;
-        lastSlice.index = container.slices.length - 1;
-    }
-
-    /**
-     * Writes a {@link Container} header information to a {@link OutputStream}.
-     *
-     * @param major     the CRAM version to assume
-     * @param container the container holding the header to write
-     * @param outputStream        the stream to write to
-     * @return the number of bytes written
-     * @throws IOException as per java IO contract
-     */
-    public static int writeContainerHeader(final int major, final Container container, final OutputStream outputStream) throws IOException {
-        return new ContainerHeaderIO().writeContainerHeader(major, container, outputStream);
-    }
-
-    /**
-     * Writes a complete {@link Container} with it's header to a {@link OutputStream}. The method is aware of file header containers and is
-     * suitable for general purpose use: basically any container is allowed.
-     *
-     * @param version   the CRAM version to assume
-     * @param container the container to write
-     * @param outputStream        the stream to write to
-     * @return the number of bytes written out
-     * @throws IOException as per java IO contract
-     */
-    public static int writeContainer(final Version version, final Container container, final OutputStream outputStream) throws IOException {
-        {
-            if (container.blocks != null && container.blocks.length > 0) {
-
-                final Block firstBlock = container.blocks[0];
-                final boolean isFileHeaderContainer = firstBlock.getContentType() == BlockContentType.FILE_HEADER;
-                if (isFileHeaderContainer) {
-                    final ExposedByteArrayOutputStream byteArrayOutputStream = new ExposedByteArrayOutputStream();
-                    firstBlock.write(version.major, byteArrayOutputStream);
-                    container.containerByteSize = byteArrayOutputStream.size();
-
-                    final int containerHeaderByteSize = new ContainerHeaderIO().writeContainerHeader(version.major, container, outputStream);
-                    outputStream.write(byteArrayOutputStream.getBuffer(), 0, byteArrayOutputStream.size());
-                    return containerHeaderByteSize + byteArrayOutputStream.size();
-                }
-            }
-        }
-
-        final long time1 = System.nanoTime();
-        final ExposedByteArrayOutputStream byteArrayOutputStream = new ExposedByteArrayOutputStream();
-
-        final Block block = new Block();
-        block.setContentType(BlockContentType.COMPRESSION_HEADER);
-        block.setContentId(0);
-        block.setMethod(BlockCompressionMethod.RAW);
-        final byte[] bytes;
-        try {
-            bytes = container.header.toByteArray();
-        } catch (final IOException e) {
-            throw new RuntimeException("This should have never happened.");
-        }
-        block.setRawContent(bytes);
-        block.write(version.major, byteArrayOutputStream);
-        container.blockCount = 1;
-
-        final List<Integer> landmarks = new ArrayList<Integer>();
-        for (int i = 0; i < container.slices.length; i++) {
-            final Slice slice = container.slices[i];
-            landmarks.add(byteArrayOutputStream.size());
-            SliceIO.write(version.major, slice, byteArrayOutputStream);
-            container.blockCount++;
-            container.blockCount++;
-            if (slice.embeddedRefBlock != null) container.blockCount++;
-            container.blockCount += slice.external.size();
-        }
-        container.landmarks = new int[landmarks.size()];
-        for (int i = 0; i < container.landmarks.length; i++)
-            container.landmarks[i] = landmarks.get(i);
-
-        container.containerByteSize = byteArrayOutputStream.size();
-        calculateSliceOffsetsAndSizes(container);
-
-        int length = new ContainerHeaderIO().writeContainerHeader(version.major, container, outputStream);
-        outputStream.write(byteArrayOutputStream.getBuffer(), 0, byteArrayOutputStream.size());
-        length += byteArrayOutputStream.size();
-
-        final long time2 = System.nanoTime();
-
-        log.debug("CONTAINER WRITTEN: " + container.toString());
-        container.writeTime = time2 - time1;
-
-        return length;
-    }
-
-    /**
-     * Calculates the byte size of a container based on the CRAM version.
-     *
-     * @param version   the CRAM version to assume
-     * @param container the container to be weighted
-     * @return the total number of bytes the container would occupy if written out
-     */
-    public static long getByteSize(final Version version, final Container container) {
-        final CountingOutputStream countingOutputStream = new CountingOutputStream(new OutputStream() {
-            @Override
-            public void write(final int b) throws IOException {
-            }
-        });
-
-        try {
-            writeContainer(version, container, countingOutputStream);
-            countingOutputStream.close();
-        } catch (final IOException e) {
-            throw new RuntimeException(e);
-        }
-
-        return countingOutputStream.getBytesWritten();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/CramCompressionRecord.java b/src/main/java/htsjdk/samtools/cram/structure/CramCompressionRecord.java
deleted file mode 100644
index 4997194..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/CramCompressionRecord.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.common.MutableInt;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-public class CramCompressionRecord {
-    private static final int MULTI_FRAGMENT_FLAG = 0x1;
-    private static final int PROPER_PAIR_FLAG = 0x2;
-    private static final int SEGMENT_UNMAPPED_FLAG = 0x4;
-    private static final int NEGATIVE_STRAND_FLAG = 0x10;
-    private static final int FIRST_SEGMENT_FLAG = 0x40;
-    private static final int LAST_SEGMENT_FLAG = 0x80;
-    private static final int SECONDARY_ALIGNMENT_FLAG = 0x100;
-    private static final int VENDOR_FILTERED_FLAG = 0x200;
-    private static final int DUPLICATE_FLAG = 0x400;
-    private static final int SUPPLEMENTARY_FLAG = 0x800;
-
-    private static final int MATE_NEG_STRAND_FLAG = 0x1;
-    private static final int MATE_UNMAPPED_FLAG = 0x2;
-
-    private static final int FORCE_PRESERVE_QS_FLAG = 0x1;
-    private static final int DETACHED_FLAG = 0x2;
-    private static final int HAS_MATE_DOWNSTREAM_FLAG = 0x4;
-    private static final int UNKNOWN_BASES = 0x8;
-
-    // sequential index of the record in a stream:
-    public int index = 0;
-    public int alignmentStart;
-    public int alignmentDelta;
-    private int alignmentEnd = -1;
-    private int alignmentSpan = -1;
-
-    public int readLength;
-
-    public int recordsToNextFragment = -1;
-
-    public byte[] readBases;
-    public byte[] qualityScores;
-
-    public List<ReadFeature> readFeatures;
-
-    public int readGroupID = 0;
-
-    // bit flags:
-    public int flags = 0;
-    public int mateFlags = 0;
-    public int compressionFlags = 0;
-
-    // pointers to the previous and next segments in the template:
-    public CramCompressionRecord next, previous;
-
-    public int mateSequenceID = -1;
-    public int mateAlignmentStart = 0;
-
-    public int mappingQuality;
-
-    public String sequenceName;
-    public int sequenceId;
-    public String readName;
-
-    // insert size:
-    public int templateSize;
-
-    public ReadTag[] tags;
-    public byte[] tagIds;
-    public MutableInt tagIdsIndex;
-
-    public int sliceIndex = 0;
-
-    public byte getMateFlags() {
-        return (byte) (0xFF & mateFlags);
-    }
-
-    public byte getCompressionFlags() {
-        return (byte) (0xFF & compressionFlags);
-    }
-
-    @SuppressWarnings("SimplifiableIfStatement")
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof CramCompressionRecord)) return false;
-
-        final CramCompressionRecord cramRecord = (CramCompressionRecord) obj;
-
-        if (alignmentStart != cramRecord.alignmentStart) return false;
-        if (isNegativeStrand() != cramRecord.isNegativeStrand()) return false;
-        if (isVendorFiltered() != cramRecord.isVendorFiltered()) return false;
-        if (isSegmentUnmapped() != cramRecord.isSegmentUnmapped()) return false;
-        if (readLength != cramRecord.readLength) return false;
-        if (isLastSegment() != cramRecord.isLastSegment()) return false;
-        if (recordsToNextFragment != cramRecord.recordsToNextFragment) return false;
-        if (isFirstSegment() != cramRecord.isFirstSegment()) return false;
-        if (mappingQuality != cramRecord.mappingQuality) return false;
-
-        if (!deepEquals(readFeatures, cramRecord.readFeatures)) return false;
-
-        if (!Arrays.equals(readBases, cramRecord.readBases)) return false;
-        return Arrays.equals(qualityScores, cramRecord.qualityScores) && areEqual(flags, cramRecord.flags) && areEqual(readName, cramRecord.readName);
-
-    }
-
-    private boolean areEqual(final Object o1, final Object o2) {
-        return o1 == null && o2 == null || o1 != null && o1.equals(o2);
-    }
-
-    private boolean deepEquals(final Collection<?> c1, final Collection<?> c2) {
-        return (c1 == null || c1.isEmpty()) && (c2 == null || c2.isEmpty()) || c1 != null && c1.equals(c2);
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder stringBuilder = new StringBuilder("[");
-        if (readName != null) stringBuilder.append(readName).append("; ");
-        stringBuilder.append("flags=").append(flags)
-                .append("; alignmentOffset=").append(alignmentDelta)
-                .append("; mateOffset=").append(recordsToNextFragment)
-                .append("; mappingQuality=").append(mappingQuality);
-
-        if (readFeatures != null) for (final ReadFeature feature : readFeatures)
-            stringBuilder.append("; ").append(feature.toString());
-
-        if (readBases != null) stringBuilder.append("; ").append("bases: ").append(new String(readBases));
-        if (qualityScores != null) stringBuilder.append("; ").append("scores: ").append(new String(qualityScores));
-
-        stringBuilder.append(']');
-        return stringBuilder.toString();
-    }
-
-    public int getAlignmentSpan() {
-        if (alignmentSpan < 0) calculateAlignmentBoundaries();
-        return alignmentSpan;
-    }
-
-    void calculateAlignmentBoundaries() {
-        if (isSegmentUnmapped()) {
-            alignmentSpan = 0;
-            alignmentEnd = SAMRecord.NO_ALIGNMENT_START;
-        } else if (readFeatures == null || readFeatures.isEmpty()) {
-            alignmentSpan = readLength;
-            alignmentEnd = alignmentStart + alignmentSpan - 1;
-        } else {
-            alignmentSpan = readLength;
-            for (final ReadFeature readFeature : readFeatures) {
-                switch (readFeature.getOperator()) {
-                    case InsertBase.operator:
-                        alignmentSpan--;
-                        break;
-                    case Insertion.operator:
-                        alignmentSpan -= ((Insertion) readFeature).getSequence().length;
-                        break;
-                    case SoftClip.operator:
-                        alignmentSpan -= ((SoftClip) readFeature).getSequence().length;
-                        break;
-                    case Deletion.operator:
-                        alignmentSpan += ((Deletion) readFeature).getLength();
-                        break;
-
-                    default:
-                        break;
-                }
-            }
-            alignmentEnd = alignmentStart + alignmentSpan - 1;
-        }
-    }
-
-    public int getAlignmentEnd() {
-        if (alignmentEnd < 0) calculateAlignmentBoundaries();
-        return alignmentEnd;
-    }
-
-    public boolean isMultiFragment() {
-        return (flags & MULTI_FRAGMENT_FLAG) != 0;
-    }
-
-    public void setMultiFragment(final boolean multiFragment) {
-        flags = multiFragment ? flags | MULTI_FRAGMENT_FLAG : flags & ~MULTI_FRAGMENT_FLAG;
-    }
-
-    public boolean isSegmentUnmapped() {
-        return (flags & SEGMENT_UNMAPPED_FLAG) != 0;
-    }
-
-    public void setSegmentUnmapped(final boolean segmentUnmapped) {
-        flags = segmentUnmapped ? flags | SEGMENT_UNMAPPED_FLAG : flags & ~SEGMENT_UNMAPPED_FLAG;
-    }
-
-    public boolean isFirstSegment() {
-        return (flags & FIRST_SEGMENT_FLAG) != 0;
-    }
-
-    public void setFirstSegment(final boolean firstSegment) {
-        flags = firstSegment ? flags | FIRST_SEGMENT_FLAG : flags & ~FIRST_SEGMENT_FLAG;
-    }
-
-    public boolean isLastSegment() {
-        return (flags & LAST_SEGMENT_FLAG) != 0;
-    }
-
-    public void setLastSegment(final boolean lastSegment) {
-        flags = lastSegment ? flags | LAST_SEGMENT_FLAG : flags & ~LAST_SEGMENT_FLAG;
-    }
-
-    public boolean isSecondaryAlignment() {
-        return (flags & SECONDARY_ALIGNMENT_FLAG) != 0;
-    }
-
-    public void setSecondaryAlignment(final boolean secondaryAlignment) {
-        flags = secondaryAlignment ? flags | SECONDARY_ALIGNMENT_FLAG : flags & ~SECONDARY_ALIGNMENT_FLAG;
-    }
-
-    public boolean isVendorFiltered() {
-        return (flags & VENDOR_FILTERED_FLAG) != 0;
-    }
-
-    public void setVendorFiltered(final boolean vendorFiltered) {
-        flags = vendorFiltered ? flags | VENDOR_FILTERED_FLAG : flags & ~VENDOR_FILTERED_FLAG;
-    }
-
-    public boolean isProperPair() {
-        return (flags & PROPER_PAIR_FLAG) != 0;
-    }
-
-    public void setProperPair(final boolean properPair) {
-        flags = properPair ? flags | PROPER_PAIR_FLAG : flags & ~PROPER_PAIR_FLAG;
-    }
-
-    public boolean isDuplicate() {
-        return (flags & DUPLICATE_FLAG) != 0;
-    }
-
-    public void setDuplicate(final boolean duplicate) {
-        flags = duplicate ? flags | DUPLICATE_FLAG : flags & ~DUPLICATE_FLAG;
-    }
-
-    public boolean isNegativeStrand() {
-        return (flags & NEGATIVE_STRAND_FLAG) != 0;
-    }
-
-    public void setNegativeStrand(final boolean negativeStrand) {
-        flags = negativeStrand ? flags | NEGATIVE_STRAND_FLAG : flags & ~NEGATIVE_STRAND_FLAG;
-    }
-
-    public boolean isMateUnmapped() {
-        return (mateFlags & MATE_UNMAPPED_FLAG) != 0;
-    }
-
-    public void setMateUnmapped(final boolean mateUnmapped) {
-        mateFlags = mateUnmapped ? mateFlags | MATE_UNMAPPED_FLAG : mateFlags & ~MATE_UNMAPPED_FLAG;
-    }
-
-    public boolean isMateNegativeStrand() {
-        return (mateFlags & MATE_NEG_STRAND_FLAG) != 0;
-    }
-
-    public void setMateNegativeStrand(final boolean mateNegativeStrand) {
-        mateFlags = mateNegativeStrand ? mateFlags | MATE_NEG_STRAND_FLAG : mateFlags & ~MATE_NEG_STRAND_FLAG;
-    }
-
-    public boolean isHasMateDownStream() {
-        return (compressionFlags & HAS_MATE_DOWNSTREAM_FLAG) != 0;
-    }
-
-    public void setHasMateDownStream(final boolean hasMateDownStream) {
-        compressionFlags = hasMateDownStream ? compressionFlags | HAS_MATE_DOWNSTREAM_FLAG : compressionFlags & ~HAS_MATE_DOWNSTREAM_FLAG;
-    }
-
-    public boolean isDetached() {
-        return (compressionFlags & DETACHED_FLAG) != 0;
-    }
-
-    public void setDetached(final boolean detached) {
-        compressionFlags = detached ? compressionFlags | DETACHED_FLAG : compressionFlags & ~DETACHED_FLAG;
-    }
-
-    public boolean isForcePreserveQualityScores() {
-        return (compressionFlags & FORCE_PRESERVE_QS_FLAG) != 0;
-    }
-
-    public void setForcePreserveQualityScores(final boolean forcePreserveQualityScores) {
-        compressionFlags = forcePreserveQualityScores ? compressionFlags | FORCE_PRESERVE_QS_FLAG : compressionFlags &
-                ~FORCE_PRESERVE_QS_FLAG;
-    }
-
-    public boolean isUnknownBases() {
-        return (compressionFlags & UNKNOWN_BASES) != 0;
-    }
-
-    public void setUnknownBases(final boolean unknownBases) {
-        compressionFlags = unknownBases ? compressionFlags | UNKNOWN_BASES : compressionFlags &
-                ~UNKNOWN_BASES;
-    }
-
-    public boolean isSupplementary() {
-        return (flags & SUPPLEMENTARY_FLAG) != 0;
-    }
-
-    public void setSupplementary(final boolean supplementary) {
-        flags = supplementary ? flags | SUPPLEMENTARY_FLAG : flags & ~SUPPLEMENTARY_FLAG;
-    }
-
-    public static class BAM_FLAGS {
-        public static final int READ_PAIRED_FLAG = 0x1;
-        public static final int PROPER_PAIR_FLAG = 0x2;
-        public static final int READ_UNMAPPED_FLAG = 0x4;
-        public static final int MATE_UNMAPPED_FLAG = 0x8;
-        public static final int READ_STRAND_FLAG = 0x10;
-        public static final int MATE_STRAND_FLAG = 0x20;
-        public static final int FIRST_OF_PAIR_FLAG = 0x40;
-        public static final int SECOND_OF_PAIR_FLAG = 0x80;
-        public static final int NOT_PRIMARY_ALIGNMENT_FLAG = 0x100;
-        public static final int READ_FAILS_VENDOR_QUALITY_CHECK_FLAG = 0x200;
-        public static final int DUPLICATE_READ_FLAG = 0x400;
-        public static final int SUPPLEMENTARY_FLAG = 0x800;
-    }
-
-    public static int getBAMFlags(final int cramFlags, final byte cramMateFlags) {
-        int value = cramFlags;
-        if ((cramMateFlags & MATE_NEG_STRAND_FLAG) != 0) value |= BAM_FLAGS.MATE_STRAND_FLAG;
-        if ((cramMateFlags & MATE_UNMAPPED_FLAG) != 0) value |= BAM_FLAGS.MATE_UNMAPPED_FLAG;
-        return value;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/CramHeader.java b/src/main/java/htsjdk/samtools/cram/structure/CramHeader.java
deleted file mode 100644
index 05e772a..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/CramHeader.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.cram.common.Version;
-
-import java.util.Arrays;
-
-/**
- * A starting object when dealing with CRAM files. A {@link CramHeader} holds 2 things: 1. File format definition, including content id and
- * version information 2. SAM file header
- */
-public final class CramHeader {
-    public static final byte[] MAGIC = "CRAM".getBytes();
-
-    private Version version;
-    private final byte[] id = new byte[20];
-
-    {
-        Arrays.fill(id, (byte) 0);
-    }
-
-    private SAMFileHeader samFileHeader;
-
-    /**
-     * Create a new {@link CramHeader} empty object.
-     */
-    private CramHeader() {
-    }
-
-    /**
-     * Create a new {@link CramHeader} object with the specified version, id and SAM file header.
-     * The id field by default is guaranteed to be byte[20].
-     *
-     * @param version       the CRAM version to assume
-     * @param id            an identifier of the content associated with this header
-     * @param samFileHeader the SAM file header
-     */
-    public CramHeader(final Version version, final String id, final SAMFileHeader samFileHeader) {
-        this.version = version;
-
-        if (id != null) System.arraycopy(id.getBytes(), 0, this.id, 0, Math.min(id.length(), this.id.length));
-        this.samFileHeader = samFileHeader;
-    }
-
-    /**
-     * Set the id of the header. A typical use is for example file name to be used when streaming or a checksum of the data contained in the
-     * file.
-     *
-     * @param stringID a new id; only first 20 bytes from byte representation of java {@link String} will be used.
-     */
-    public void setID(final String stringID) {
-        System.arraycopy(stringID.getBytes(), 0, this.id, 0, Math.min(this.id.length, stringID.length()));
-    }
-
-    /**
-     * Copy the CRAM header into a new {@link CramHeader} object.
-     * @return a complete copy of the header
-     */
-    @SuppressWarnings("CloneDoesntCallSuperClone")
-    @Override
-    public CramHeader clone() {
-        final CramHeader clone = new CramHeader();
-        clone.version = version;
-        System.arraycopy(id, 0, clone.id, 0, id.length);
-        clone.samFileHeader = getSamFileHeader().clone();
-
-        return clone;
-    }
-
-
-    /**
-     * Checks if content of a header is the same as this one.
-     * @param obj another header to compare to
-     * @return true if versions, ids and SAM file header are exactly the same, false otherwise
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == null) return false;
-        if (!(obj instanceof CramHeader)) return false;
-
-        final CramHeader header = (CramHeader) obj;
-
-        if (getVersion().major != header.getVersion().major) return false;
-        //noinspection SimplifiableIfStatement
-        if (getVersion().minor != header.getVersion().minor) return false;
-        return Arrays.equals(id, header.id) && getSamFileHeader().equals(header.getSamFileHeader());
-    }
-
-    /**
-     * Get the {@link SAMFileHeader} object associated with this CRAM file header.
-     * @return the SAM file header
-     */
-    public SAMFileHeader getSamFileHeader() {
-        return samFileHeader;
-    }
-
-    public byte[] getId() {
-        return id;
-    }
-
-    public Version getVersion() {
-        return version;
-    }
-
-    public void setVersion(final Version version) { this.version = version; }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/EncodingID.java b/src/main/java/htsjdk/samtools/cram/structure/EncodingID.java
deleted file mode 100644
index 3073704..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/EncodingID.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-/**
- * Encoding ID as defined in the CRAM specs. These are basically ways to serialize a data series.
- */
-public enum EncodingID {
-    /**
-     * "Do nothing" encoding. Should throw an exception when trying reading or writing with this encoding.
-     */
-    NULL,
-    /**
-     * Shove the data into a byte array for compressing later with a generic compressor like GZIP.
-     */
-    EXTERNAL,
-    /**
-     * 'naf said: http://en.wikipedia.org/wiki/Golomb_coding
-     */
-    GOLOMB,
-    /**
-     * http://en.wikipedia.org/wiki/Huffman_coding
-     */
-    HUFFMAN,
-    /**
-     * A byte array serialized as [length][elements]
-     */
-    BYTE_ARRAY_LEN,
-    /**
-     * A byte array serialized as [elements][stop]
-     */
-    BYTE_ARRAY_STOP,
-    /**
-     * http://en.wikipedia.org/wiki/Beta_Code
-     */
-    BETA,
-    /**
-     * Subexponential codes, see the CRAM specs for details.
-     */
-    SUBEXPONENTIAL,
-    /**
-     * A variant of GOLOMB encoding: http://en.wikipedia.org/wiki/Golomb_coding
-     */
-    GOLOMB_RICE,
-    /**
-     * http://en.wikipedia.org/wiki/Elias_gamma_coding
-     */
-    GAMMA
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/EncodingKey.java b/src/main/java/htsjdk/samtools/cram/structure/EncodingKey.java
deleted file mode 100644
index e7b85ff..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/EncodingKey.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-public enum EncodingKey {
-    BF_BitFlags, AP_AlignmentPositionOffset, FP_FeaturePosition,
-    FC_FeatureCode, QS_QualityScore, DL_DeletionLength, BA_Base, TN_TagNameAndType,
-    NF_RecordsToNextFragment, RL_ReadLength, RG_ReadGroup, MQ_MappingQualityScore,
-    RN_ReadName, NP_NextFragmentAlignmentStart, TS_InsetSize, FN_NumberOfReadFeatures,
-    BS_BaseSubstitutionCode, IN_Insertion, TC_TagCount, MF_MateBitFlags,
-    NS_NextFragmentReferenceSequenceID, CF_CompressionBitFlags, TV_TestMark, TM_TestMark,
-    TL_TagIdList, RI_RefId, RS_RefSkip, SC_SoftClip, HC_HardClip, PD_padding, BB_bases, QQ_scores;
-
-    public static EncodingKey byFirstTwoChars(final String chars) {
-        for (final EncodingKey encodingKey : values()) {
-            if (encodingKey.name().startsWith(chars))
-                return encodingKey;
-        }
-        return null;
-    }
-
-    public static byte[] toTwoBytes(final EncodingKey key) {
-        return new byte[]{(byte) key.name().charAt(0), (byte) key.name().charAt(1)};
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/EncodingParams.java b/src/main/java/htsjdk/samtools/cram/structure/EncodingParams.java
deleted file mode 100644
index 586fa90..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/EncodingParams.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-
-import java.util.Arrays;
-
-public class EncodingParams {
-
-    public final EncodingID id;
-    public final byte[] params;
-
-    public EncodingParams(final EncodingID id, final byte[] params) {
-        super();
-        this.id = id;
-        this.params = params;
-    }
-
-    @Override
-    public String toString() {
-        return id.name() + ":" + javax.xml.bind.DatatypeConverter.printHexBinary(Arrays.copyOfRange(params, 0, Math.max(20, params.length)));
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/ReadTag.java b/src/main/java/htsjdk/samtools/cram/structure/ReadTag.java
deleted file mode 100644
index 791bf2c..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/ReadTag.java
+++ /dev/null
@@ -1,487 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFormatException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecord.SAMTagAndValue;
-import htsjdk.samtools.SAMTagUtil;
-import htsjdk.samtools.SAMUtils;
-import htsjdk.samtools.SAMValidationError;
-import htsjdk.samtools.TagValueAndUnsignedArrayFlag;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.util.StringUtil;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.charset.Charset;
-
-/**
- * CRAM counterpart of {@link htsjdk.samtools.SAMTag}.
- * TODO: consider merging/dropping this class in favour of SAMTag or a SAMTag implementation.
- */
-public class ReadTag implements Comparable<ReadTag> {
-    private static final long MAX_INT = Integer.MAX_VALUE;
-    private static final long MAX_UINT = MAX_INT * 2 + 1;
-    private static final long MAX_SHORT = Short.MAX_VALUE;
-    private static final long MAX_USHORT = MAX_SHORT * 2 + 1;
-    private static final long MAX_BYTE = Byte.MAX_VALUE;
-    private static final long MAX_UBYTE = MAX_BYTE * 2 + 1;
-
-    // non-null
-    private String key;
-    private String keyAndType;
-    public String keyType3Bytes;
-    public int keyType3BytesAsInt;
-    private char type;
-    private Object value;
-    private short code;
-    private byte index;
-
-    public ReadTag(final int id, final byte[] dataAsByteArray, ValidationStringency validationStringency) {
-        this.type = (char) (0xFF & id);
-        key = new String(new char[]{(char) ((id >> 16) & 0xFF), (char) ((id >> 8) & 0xFF)});
-        value = restoreValueFromByteArray(type, dataAsByteArray, validationStringency);
-        keyType3Bytes = this.key + this.type;
-
-        keyType3BytesAsInt = id;
-
-        code = SAMTagUtil.getSingleton().makeBinaryTag(this.key);
-    }
-
-    private ReadTag(final String key, final char type, final Object value) {
-        if (key == null)
-            throw new NullPointerException("Tag key cannot be null.");
-        if (value == null)
-            throw new NullPointerException("Tag value cannot be null.");
-
-        this.value = value;
-
-        if (key.length() == 2) {
-            this.key = key;
-            this.type = type;
-            // this.type = getTagValueType(value);
-            keyAndType = key + ":" + getType();
-        } else if (key.length() == 4) {
-            this.key = key.substring(0, 2);
-            this.type = key.charAt(3);
-        }
-
-        keyType3Bytes = this.key + this.type;
-        keyType3BytesAsInt = nameType3BytesToInt(this.key, this.type);
-
-        code = SAMTagUtil.getSingleton().makeBinaryTag(this.key);
-    }
-
-    public static int name3BytesToInt(final byte[] name) {
-        int value = 0xFF & name[0];
-        value <<= 8;
-        value |= 0xFF & name[1];
-        value <<= 8;
-        value |= 0xFF & name[2];
-
-        return value;
-    }
-
-    public static int nameType3BytesToInt(final String name, final char type) {
-        int value = 0xFF & name.charAt(0);
-        value <<= 8;
-        value |= 0xFF & name.charAt(1);
-        value <<= 8;
-        value |= 0xFF & type;
-
-        return value;
-    }
-
-    public static String intToNameType3Bytes(final int value) {
-        final byte b3 = (byte) (0xFF & value);
-        final byte b2 = (byte) (0xFF & (value >> 8));
-        final byte b1 = (byte) (0xFF & (value >> 16));
-
-        return new String(new byte[]{b1, b2, b3});
-    }
-
-    public static String intToNameType4Bytes(final int value) {
-        final byte b3 = (byte) (0xFF & value);
-        final byte b2 = (byte) (0xFF & (value >> 8));
-        final byte b1 = (byte) (0xFF & (value >> 16));
-
-        return new String(new byte[]{b1, b2, ':', b3});
-    }
-
-    public SAMTagAndValue createSAMTag() {
-        return new SAMTagAndValue(key, value);
-    }
-
-    public static ReadTag deriveTypeFromKeyAndType(final String keyAndType, final Object value) {
-        if (keyAndType.length() != 4)
-            throw new RuntimeException("Tag key and type must be 4 char long: " + keyAndType);
-
-        return new ReadTag(keyAndType.substring(0, 2), keyAndType.charAt(3), value);
-    }
-
-    public static ReadTag deriveTypeFromValue(final String key, final Object value) {
-        if (key.length() != 2)
-            throw new RuntimeException("Tag key must be 2 char long: " + key);
-
-        return new ReadTag(key, getTagValueType(value), value);
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    @Override
-    public int compareTo(@SuppressWarnings("NullableProblems") final ReadTag o) {
-        return key.compareTo(o.key);
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (!(obj instanceof ReadTag))
-            return false;
-
-        final ReadTag foe = (ReadTag) obj;
-        return key.equals(foe.key) && (value == null && foe.value == null || value != null && value.equals(foe.value));
-
-    }
-
-    @Override
-    public int hashCode() {
-        return key.hashCode();
-    }
-
-    public Object getValue() {
-        return value;
-    }
-
-    char getType() {
-        return type;
-    }
-
-    public String getKeyAndType() {
-        return keyAndType;
-    }
-
-    public byte[] getValueAsByteArray() {
-        return writeSingleValue((byte) type, value, false);
-    }
-
-    private static Object restoreValueFromByteArray(final char type, final byte[] array, ValidationStringency validationStringency) {
-        final ByteBuffer buffer = ByteBuffer.wrap(array);
-        buffer.order(ByteOrder.LITTLE_ENDIAN);
-        return readSingleValue((byte) type, buffer, validationStringency);
-    }
-
-    // copied from net.sf.samtools.BinaryTagCodec 1.62:
-    private static char getTagValueType(final Object value) {
-        if (value instanceof String) {
-            return 'Z';
-        } else if (value instanceof Character) {
-            return 'A';
-        } else if (value instanceof Float) {
-            return 'f';
-        } else if (value instanceof Number) {
-            if (!(value instanceof Byte || value instanceof Short
-                    || value instanceof Integer || value instanceof Long)) {
-                throw new IllegalArgumentException("Unrecognized tag type "
-                        + value.getClass().getName());
-            }
-            return getIntegerType(((Number) value).longValue());
-        } /*
-         * Note that H tag type is never written anymore, because B style is
-		 * more compact. else if (value instanceof byte[]) { return 'H'; }
-		 */ else if (value instanceof byte[] || value instanceof short[]
-                || value instanceof int[] || value instanceof float[]) {
-            return 'B';
-        } else {
-            throw new IllegalArgumentException(
-                    "When writing BAM, unrecognized tag type "
-                            + value.getClass().getName());
-        }
-    }
-
-    // copied from net.sf.samtools.BinaryTagCodec:
-    static private char getIntegerType(final long val) {
-        if (val > MAX_UINT) {
-            throw new IllegalArgumentException("Integer attribute value too large: "+val);
-        }
-        if (val > MAX_INT) {
-            return 'I';
-        }
-        if (val > MAX_USHORT) {
-            return 'i';
-        }
-        if (val > MAX_SHORT) {
-            return 'S';
-        }
-        if (val > MAX_UBYTE) {
-            return 's';
-        }
-        if (val > MAX_BYTE) {
-            return 'C';
-        }
-        if (val >= Byte.MIN_VALUE) {
-            return 'c';
-        }
-        if (val >= Short.MIN_VALUE) {
-            return 's';
-        }
-        if (val >= Integer.MIN_VALUE) {
-            return 'i';
-        }
-        throw new IllegalArgumentException(
-                "Integer attribute value too negative to be encoded in BAM");
-    }
-
-    public void setIndex(final byte i) {
-        this.index = i;
-    }
-
-    public byte getIndex() {
-        return index;
-    }
-
-    // yeah, I'm that risky:
-    // with a little less thread risky.
-    private static final ThreadLocal<ByteBuffer> bufferLocal = new ThreadLocal<ByteBuffer>() {
-        @Override
-        protected ByteBuffer initialValue() {
-            final ByteBuffer buf = ByteBuffer.allocateDirect(10 * 1024 * 1024);
-            buf.order(ByteOrder.LITTLE_ENDIAN);
-            return buf;
-        }
-    };
-
-    private static final Charset charset = Charset.forName("US-ASCII");
-
-    public static byte[] writeSingleValue(final byte tagType, final Object value,
-                                          final boolean isUnsignedArray) {
-
-        final ByteBuffer buffer = bufferLocal.get();
-        buffer.clear();
-        switch (tagType) {
-            case 'Z':
-                String s = (String) value;
-                buffer.put(s.getBytes(charset));
-                buffer.put((byte) 0);
-                break;
-            case 'A':
-                buffer.put((byte) ((Character) value).charValue());
-                break;
-            case 'I':
-                // this is tricky:
-                buffer.putLong((Long) value);
-                buffer.position(buffer.position() - 4);
-                break;
-            case 'i':
-                buffer.putInt(((Number) value).intValue());
-                break;
-            case 's':
-                buffer.putShort(((Number) value).shortValue());
-                break;
-            case 'S':
-                // Convert to unsigned short stored in an int
-                buffer.putInt(((Number) value).intValue());
-                buffer.position(buffer.position() - 2);
-                break;
-            case 'c':
-                buffer.put(((Number) value).byteValue());
-                break;
-            case 'C':
-                // Convert to unsigned byte stored in an int
-                buffer.putShort(((Integer) value).shortValue());
-                buffer.position(buffer.position() - 1);
-                break;
-            case 'f':
-                buffer.putFloat((Float) value);
-                break;
-            case 'H':
-                s = StringUtil.bytesToHexString((byte[]) value);
-                buffer.put(s.getBytes(charset));
-                buffer.put((byte) 0);
-                break;
-            case 'B':
-                writeArray(value, isUnsignedArray, buffer);
-                break;
-            default:
-                throw new SAMFormatException("Unrecognized tag type: "
-                        + (char) tagType);
-        }
-
-        buffer.flip();
-        final byte[] bytes = new byte[buffer.limit()];
-        buffer.get(bytes);
-
-        return bytes;
-    }
-
-    private static void writeArray(final Object value,
-                                   final boolean isUnsignedArray, final ByteBuffer buffer) {
-        if (value instanceof byte[]) {
-            buffer.put((byte) (isUnsignedArray ? 'C' : 'c'));
-            final byte[] array = (byte[]) value;
-            buffer.putInt(array.length);
-            for (final byte element : array)
-                buffer.put(element);
-
-        } else if (value instanceof short[]) {
-            buffer.put((byte) (isUnsignedArray ? 'S' : 's'));
-            final short[] array = (short[]) value;
-            buffer.putInt(array.length);
-            for (final short element : array)
-                buffer.putShort(element);
-
-        } else if (value instanceof int[]) {
-            buffer.put((byte) (isUnsignedArray ? 'I' : 'i'));
-            final int[] array = (int[]) value;
-            buffer.putInt(array.length);
-            for (final int element : array)
-                buffer.putInt(element);
-
-        } else if (value instanceof float[]) {
-            buffer.put((byte) 'f');
-            final float[] array = (float[]) value;
-            buffer.putInt(array.length);
-            for (final float element : array)
-                buffer.putFloat(element);
-
-        } else
-            throw new SAMException("Unrecognized array value type: "
-                    + value.getClass());
-    }
-
-    public static Object readSingleValue(final byte tagType,
-                                         final ByteBuffer byteBuffer, ValidationStringency validationStringency) {
-        switch (tagType) {
-            case 'Z':
-                return readNullTerminatedString(byteBuffer);
-            case 'A':
-                return (char) byteBuffer.get();
-            case 'I':
-                final long val = byteBuffer.getInt() & 0xffffffffL;
-                if (val <= Integer.MAX_VALUE) {
-                    return (int)val;
-                }
-                // If it won't fit into a signed integer, but is within range for an unsigned 32-bit integer,
-                // return it directly as a long
-                if (! SAMUtils.isValidUnsignedIntegerAttribute(val)) {
-                    SAMUtils.processValidationError(new SAMValidationError(SAMValidationError.Type.TAG_VALUE_TOO_LARGE,
-                            "Unsigned integer is out of range for a 32-bit unsigned value: " + val, null), validationStringency);
-                }
-                return val;
-            case 'i':
-                return byteBuffer.getInt();
-            case 's':
-                return (int) byteBuffer.getShort();
-            case 'S':
-                // Convert to unsigned short stored in an int
-                return byteBuffer.getShort() & 0xffff;
-            case 'c':
-                return (int) byteBuffer.get();
-            case 'C':
-                // Convert to unsigned byte stored in an int
-                return byteBuffer.get() & 0xff;
-            case 'f':
-                return byteBuffer.getFloat();
-            case 'H':
-                final String hexRep = readNullTerminatedString(byteBuffer);
-                return StringUtil.hexStringToBytes(hexRep);
-            case 'B':
-                final TagValueAndUnsignedArrayFlag valueAndFlag = readArray(
-                        byteBuffer);
-                return valueAndFlag.value;
-            default:
-                throw new SAMFormatException("Unrecognized tag type: "
-                        + (char) tagType);
-        }
-    }
-
-    /**
-     * Read value of specified type.
-     *
-     * @param byteBuffer Little-ending byte buffer to read value from.
-     * @return CVO containing the value in in-memory Object form, and a flag
-     * indicating whether it is unsigned or not.
-     */
-    private static TagValueAndUnsignedArrayFlag readArray(
-            final ByteBuffer byteBuffer) {
-        final byte arrayType = byteBuffer.get();
-        final boolean isUnsigned = Character.isUpperCase(arrayType);
-        final int length = byteBuffer.getInt();
-        final Object value;
-        switch (Character.toLowerCase(arrayType)) {
-            case 'c': {
-                final byte[] array = new byte[length];
-                value = array;
-                byteBuffer.get(array);
-                break;
-            }
-            case 's': {
-                final short[] array = new short[length];
-                value = array;
-                for (int i = 0; i < length; ++i) {
-                    array[i] = byteBuffer.getShort();
-                }
-                break;
-            }
-
-            case 'i': {
-                final int[] array = new int[length];
-                value = array;
-                for (int i = 0; i < length; ++i) {
-                    array[i] = byteBuffer.getInt();
-                }
-                break;
-            }
-
-            case 'f': {
-                final float[] array = new float[length];
-                value = array;
-                for (int i = 0; i < length; ++i) {
-                    array[i] = byteBuffer.getFloat();
-                }
-                break;
-            }
-
-            default:
-                throw new SAMFormatException("Unrecognized tag array type: "
-                        + (char) arrayType);
-        }
-        return new TagValueAndUnsignedArrayFlag(value, isUnsigned);
-    }
-
-    private static String readNullTerminatedString(final ByteBuffer byteBuffer) {
-        // Count the number of bytes in the string
-        byteBuffer.mark();
-        final int startPosition = byteBuffer.position();
-        //noinspection StatementWithEmptyBody
-        while (byteBuffer.get() != 0) ;
-        final int endPosition = byteBuffer.position();
-
-        // Don't count null terminator
-        final byte[] buf = new byte[endPosition - startPosition - 1];
-        // Go back to the start of the string and read out the bytes
-        byteBuffer.reset();
-        byteBuffer.get(buf);
-        // Skip over the null terminator
-        byteBuffer.get();
-        return StringUtil.bytesToString(buf);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/Slice.java b/src/main/java/htsjdk/samtools/cram/structure/Slice.java
deleted file mode 100644
index 30f0a74..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/Slice.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at4
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMBinaryTagAndUnsignedArrayValue;
-import htsjdk.samtools.SAMBinaryTagAndValue;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMTagUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.SequenceUtil;
-
-import java.lang.reflect.Array;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.Map;
-
-/**
- * CRAM slice is a logical union of blocks into for example alignment slices.
- */
-public class Slice {
-    public static final int MULTI_REFERENCE = -2;
-    public static final int NO_ALIGNMENT_START = -1;
-    public static final int NO_ALIGNMENT_SPAN = 0;
-    private static final Log log = Log.getInstance(Slice.class);
-
-    // as defined in the specs:
-    public int sequenceId = -1;
-    public int alignmentStart = -1;
-    public int alignmentSpan = -1;
-    public int nofRecords = -1;
-    public long globalRecordCounter = -1;
-    public int nofBlocks = -1;
-    public int[] contentIDs;
-    public int embeddedRefBlockContentID = -1;
-    public byte[] refMD5 = new byte[16];
-
-    // content associated with ids:
-    public Block headerBlock;
-    public Block coreBlock;
-    public Block embeddedRefBlock;
-    public Map<Integer, Block> external;
-
-    // for indexing purposes:
-    public int offset = -1;
-    public long containerOffset = -1;
-    public int size = -1;
-    public int index = -1;
-
-    // to pass this to the container:
-    public long bases;
-
-    public SAMBinaryTagAndValue sliceTags;
-
-    private void alignmentBordersSanityCheck(final byte[] ref) {
-        if (sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) return ;
-        if (alignmentStart > 0 && sequenceId >= 0 && ref == null) throw new IllegalArgumentException ("Mapped slice reference is null.");
-
-        if (alignmentStart > ref.length) {
-            log.error(String.format("Slice mapped outside of reference: seqID=%d, start=%d, counter=%d.", sequenceId, alignmentStart,
-                    globalRecordCounter));
-            throw new RuntimeException("Slice mapped outside of the reference.");
-        }
-
-        if (alignmentStart - 1 + alignmentSpan > ref.length) {
-            log.warn(String.format("Slice partially mapped outside of reference: seqID=%d, start=%d, span=%d, counter=%d.",
-                    sequenceId, alignmentStart, alignmentSpan, globalRecordCounter));
-        }
-    }
-
-    public boolean validateRefMD5(final byte[] ref) {
-        if(sequenceId == Slice.MULTI_REFERENCE)
-            throw new SAMException("Cannot verify a slice with multiple references on a single reference.");
-
-        if (sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) return true;
-
-        alignmentBordersSanityCheck(ref);
-
-        if (!validateRefMD5(ref, alignmentStart, alignmentSpan, refMD5)) {
-            final int shoulderLength = 10;
-            final String excerpt = getBrief(alignmentStart, alignmentSpan, ref, shoulderLength);
-
-            if (validateRefMD5(ref, alignmentStart, alignmentSpan - 1, refMD5)) {
-                log.warn(String.format("Reference MD5 matches partially for slice %d:%d-%d, %s", sequenceId, alignmentStart,
-                        alignmentStart + alignmentSpan - 1, excerpt));
-                return true;
-            }
-
-            log.error(String.format("Reference MD5 mismatch for slice %d:%d-%d, %s", sequenceId, alignmentStart, alignmentStart +
-                    alignmentSpan - 1, excerpt));
-            return false;
-        }
-
-        return true;
-    }
-
-    private static boolean validateRefMD5(final byte[] ref, final int alignmentStart, final int alignmentSpan, final byte[] expectedMD5) {
-        final int span = Math.min(alignmentSpan, ref.length - alignmentStart + 1);
-        final String md5 = SequenceUtil.calculateMD5String(ref, alignmentStart - 1, span);
-        return md5.equals(String.format("%032x", new BigInteger(1, expectedMD5)));
-    }
-
-    private static String getBrief(final int startOneBased, final int span, final byte[] bases, final int shoulderLength) {
-        if (span >= bases.length)
-            return new String(bases);
-
-        final StringBuilder sb = new StringBuilder();
-        final int fromInc = startOneBased - 1;
-
-        int toExc = startOneBased + span - 1;
-        toExc = Math.min(toExc, bases.length);
-
-        if (toExc - fromInc <= 2 * shoulderLength) {
-            sb.append(new String(Arrays.copyOfRange(bases, fromInc, toExc)));
-        } else {
-            sb.append(new String(Arrays.copyOfRange(bases, fromInc, fromInc + shoulderLength)));
-            sb.append("...");
-            sb.append(new String(Arrays.copyOfRange(bases, toExc - shoulderLength, toExc)));
-        }
-
-        return sb.toString();
-    }
-
-    @Override
-    public String toString() {
-        return String.format("slice: seqID %d, start %d, span %d, records %d.", sequenceId, alignmentStart, alignmentSpan, nofRecords);
-    }
-
-    public void setRefMD5(final byte[] ref) {
-        alignmentBordersSanityCheck(ref);
-
-        if (sequenceId < 0 && alignmentStart < 1) {
-            refMD5 = new byte[16];
-            Arrays.fill(refMD5, (byte) 0);
-
-            log.debug("Empty slice ref md5 is set.");
-        } else {
-
-            final int span = Math.min(alignmentSpan, ref.length - alignmentStart + 1);
-
-            if (alignmentStart + span > ref.length + 1)
-                throw new RuntimeException("Invalid alignment boundaries.");
-
-            refMD5 = SequenceUtil.calculateMD5(ref, alignmentStart - 1, span);
-
-            if (log.isEnabled(Log.LogLevel.DEBUG)) {
-                final StringBuilder sb = new StringBuilder();
-                final int shoulder = 10;
-                if (ref.length <= shoulder * 2)
-                    sb.append(new String(ref));
-                else {
-
-                    sb.append(getBrief(alignmentStart, alignmentSpan, ref, shoulder));
-                }
-
-                log.debug(String.format("Slice md5: %s for %d:%d-%d, %s",
-                        String.format("%032x", new BigInteger(1, refMD5)),
-                        sequenceId, alignmentStart, alignmentStart + span - 1,
-                        sb.toString()));
-            }
-        }
-    }
-
-    /**
-     * Hijacking attributes-related methods from SAMRecord:
-     */
-
-    /**
-     * Get tag value attached to the slice.
-     * @param tag tag ID as a short integer as returned by {@link htsjdk.samtools.SAMTagUtil#makeBinaryTag(java.lang.String)}
-     * @return a value of the tag
-     */
-    public Object getAttribute(final short tag) {
-        if (this.sliceTags == null) return null;
-        else {
-            final SAMBinaryTagAndValue tmp = this.sliceTags.find(tag);
-            if (tmp != null) return tmp.value;
-            else return null;
-        }
-    }
-
-    /**
-     * Set a value for the tag.
-     * @param tag tag ID as a short integer as returned by {@link htsjdk.samtools.SAMTagUtil#makeBinaryTag(java.lang.String)}
-     * @param value tag value
-     */
-    public void setAttribute(final String tag, final Object value) {
-        if (value != null && value.getClass().isArray() && Array.getLength(value) == 0) {
-            throw new IllegalArgumentException("Empty value passed for tag " + tag);
-        }
-        setAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag), value);
-    }
-
-    public void setUnsignedArrayAttribute(final String tag, final Object value) {
-        if (!value.getClass().isArray()) {
-            throw new IllegalArgumentException("Non-array passed to setUnsignedArrayAttribute for tag " + tag);
-        }
-        if (Array.getLength(value) == 0) {
-            throw new IllegalArgumentException("Empty array passed to setUnsignedArrayAttribute for tag " + tag);
-        }
-        setAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag), value, true);
-    }
-
-    void setAttribute(final short tag, final Object value) {
-        setAttribute(tag, value, false);
-    }
-
-    void setAttribute(final short tag, final Object value, final boolean isUnsignedArray) {
-        if (value == null) {
-            if (this.sliceTags != null) this.sliceTags = this.sliceTags.remove(tag);
-        } else {
-            final SAMBinaryTagAndValue tmp;
-            if (!isUnsignedArray) {
-                tmp = new SAMBinaryTagAndValue(tag, value);
-            } else {
-                tmp = new SAMBinaryTagAndUnsignedArrayValue(tag, value);
-            }
-            if (this.sliceTags == null) this.sliceTags = tmp;
-            else this.sliceTags = this.sliceTags.insert(tmp);
-        }
-    }
-
-    public boolean isMapped() {
-        return sequenceId > SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-    }
-
-    public boolean isMultiref() {
-        return sequenceId == Slice.MULTI_REFERENCE;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/SliceIO.java b/src/main/java/htsjdk/samtools/cram/structure/SliceIO.java
deleted file mode 100644
index 4ccbb36..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/SliceIO.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.BinaryTagCodec;
-import htsjdk.samtools.SAMBinaryTagAndValue;
-import htsjdk.samtools.SAMTagUtil;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.io.CramArray;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.cram.io.LTF8;
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.Log;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.HashMap;
-
-class SliceIO {
-    private static final Log log = Log.getInstance(SliceIO.class);
-
-    private static void readSliceHeadBlock(final int major, final Slice slice, final InputStream inputStream) throws IOException {
-        slice.headerBlock = Block.readFromInputStream(major, inputStream);
-        parseSliceHeaderBlock(major, slice);
-    }
-
-    private static void parseSliceHeaderBlock(final int major, final Slice slice) throws IOException {
-        final InputStream inputStream = new ByteArrayInputStream(slice.headerBlock.getRawContent());
-
-        slice.sequenceId = ITF8.readUnsignedITF8(inputStream);
-        slice.alignmentStart = ITF8.readUnsignedITF8(inputStream);
-        slice.alignmentSpan = ITF8.readUnsignedITF8(inputStream);
-        slice.nofRecords = ITF8.readUnsignedITF8(inputStream);
-        slice.globalRecordCounter = LTF8.readUnsignedLTF8(inputStream);
-        slice.nofBlocks = ITF8.readUnsignedITF8(inputStream);
-
-        slice.contentIDs = CramArray.array(inputStream);
-        slice.embeddedRefBlockContentID = ITF8.readUnsignedITF8(inputStream);
-        slice.refMD5 = new byte[16];
-        InputStreamUtils.readFully(inputStream, slice.refMD5, 0, slice.refMD5.length);
-
-        final byte[] bytes = InputStreamUtils.readFully(inputStream);
-
-        if (major >= CramVersions.CRAM_v3.major) {
-            slice.sliceTags = BinaryTagCodec.readTags(bytes, 0, bytes.length, ValidationStringency.DEFAULT_STRINGENCY);
-
-            SAMBinaryTagAndValue tags = slice.sliceTags;
-            while (tags != null) {
-                log.debug(String.format("Found slice tag: %s", SAMTagUtil.getSingleton().makeStringTag(tags.tag)));
-                tags = tags.getNext();
-            }
-        }
-    }
-
-    private static byte[] createSliceHeaderBlockContent(final int major, final Slice slice) throws IOException {
-        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        ITF8.writeUnsignedITF8(slice.sequenceId, byteArrayOutputStream);
-        ITF8.writeUnsignedITF8(slice.alignmentStart, byteArrayOutputStream);
-        ITF8.writeUnsignedITF8(slice.alignmentSpan, byteArrayOutputStream);
-        ITF8.writeUnsignedITF8(slice.nofRecords, byteArrayOutputStream);
-        LTF8.writeUnsignedLTF8(slice.globalRecordCounter, byteArrayOutputStream);
-        ITF8.writeUnsignedITF8(slice.nofBlocks, byteArrayOutputStream);
-
-        slice.contentIDs = new int[slice.external.size()];
-        int i = 0;
-        for (final int id : slice.external.keySet())
-            slice.contentIDs[i++] = id;
-        CramArray.write(slice.contentIDs, byteArrayOutputStream);
-        ITF8.writeUnsignedITF8(slice.embeddedRefBlockContentID, byteArrayOutputStream);
-        byteArrayOutputStream.write(slice.refMD5 == null ? new byte[16] : slice.refMD5);
-
-        if (major >= CramVersions.CRAM_v3.major) {
-            if (slice.sliceTags != null) {
-                final BinaryCodec binaryCoded = new BinaryCodec(byteArrayOutputStream);
-                final BinaryTagCodec binaryTagCodec = new BinaryTagCodec(binaryCoded);
-                SAMBinaryTagAndValue samBinaryTagAndValue = slice.sliceTags;
-                do {
-                    log.debug("Writing slice tag: " + SAMTagUtil.getSingleton().makeStringTag(samBinaryTagAndValue.tag));
-                    binaryTagCodec.writeTag(samBinaryTagAndValue.tag, samBinaryTagAndValue.value, samBinaryTagAndValue.isUnsignedArray());
-                } while ((samBinaryTagAndValue = samBinaryTagAndValue.getNext()) != null);
-                // BinaryCodec doesn't seem to cache things.
-                // In any case, not calling baseCodec.close() because it's behaviour is
-                // irrelevant here.
-            }
-        }
-
-        return byteArrayOutputStream.toByteArray();
-    }
-
-    private static void readSliceBlocks(final int major, final Slice slice, final InputStream inputStream) throws IOException {
-        slice.external = new HashMap<Integer, Block>();
-        for (int i = 0; i < slice.nofBlocks; i++) {
-            final Block block = Block.readFromInputStream(major, inputStream);
-
-            switch (block.getContentType()) {
-                case CORE:
-                    slice.coreBlock = block;
-                    break;
-                case EXTERNAL:
-                    if (slice.embeddedRefBlockContentID == block.getContentId()) slice.embeddedRefBlock = block;
-                    slice.external.put(block.getContentId(), block);
-                    break;
-
-                default:
-                    throw new RuntimeException("Not a slice block, content type id " + block.getContentType().name());
-            }
-        }
-    }
-
-    public static void write(final int major, final Slice slice, final OutputStream outputStream) throws IOException {
-
-        slice.nofBlocks = 1 + slice.external.size() + (slice.embeddedRefBlock == null ? 0 : 1);
-
-        {
-            slice.contentIDs = new int[slice.external.size()];
-            final int i = 0;
-            for (final int id : slice.external.keySet())
-                slice.contentIDs[i] = id;
-        }
-
-        slice.headerBlock = Block.buildNewSliceHeaderBlock(createSliceHeaderBlockContent(major, slice));
-        slice.headerBlock.write(major, outputStream);
-
-        slice.coreBlock.write(major, outputStream);
-        for (final Block block : slice.external.values())
-            block.write(major, outputStream);
-    }
-
-    public static void read(final int major, final Slice slice, final InputStream inputStream) throws IOException {
-        readSliceHeadBlock(major, slice, inputStream);
-        readSliceBlocks(major, slice, inputStream);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/SubstitutionMatrix.java b/src/main/java/htsjdk/samtools/cram/structure/SubstitutionMatrix.java
deleted file mode 100644
index d9948be..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/SubstitutionMatrix.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import java.util.Arrays;
-import java.util.Comparator;
-
-public class SubstitutionMatrix {
-    public static final byte[] BASES = new byte[]{'A', 'C', 'G', 'T', 'N'};
-    private static final byte[] BASES_LC = new byte[]{'a', 'c', 'g', 't', 'n'};
-    private static final byte[] ORDER;
-
-    static {
-        ORDER = new byte[255];
-        Arrays.fill(ORDER, (byte) -1);
-        ORDER['A'] = 0;
-        ORDER['C'] = 1;
-        ORDER['G'] = 2;
-        ORDER['T'] = 3;
-        ORDER['N'] = 4;
-    }
-
-    private byte[] bytes = new byte[5];
-    private final byte[][] codes = new byte[255][255];
-    private final byte[][] bases = new byte[255][255];
-
-    public SubstitutionMatrix(final long[][] frequencies) {
-        for (final byte base : BASES) {
-            bytes[ORDER[base]] = rank(base, frequencies[base]);
-        }
-        for (final byte[] base : bases) Arrays.fill(base, (byte) 'N');
-
-        for (int i = 0; i < BASES.length; i++) {
-            final byte r = BASES[i];
-            for (final byte b : BASES) {
-                if (r == b)
-                    continue;
-                bases[r][codes[r][b]] = b;
-                bases[BASES_LC[i]][codes[r][b]] = b;
-            }
-        }
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder stringBuilder = new StringBuilder();
-        for (final byte r : "ACGTN".getBytes()) {
-            stringBuilder.append((char) r);
-            stringBuilder.append(':');
-            for (int i = 0; i < 4; i++) {
-                stringBuilder.append((char) bases[r][i]);
-            }
-            stringBuilder.append('\t');
-        }
-        return stringBuilder.toString();
-    }
-
-    public SubstitutionMatrix(final byte[] matrix) {
-        this.bytes = matrix;
-
-        for (final byte[] base : bases) Arrays.fill(base, (byte) 'N');
-
-        bases['A'][(bytes[0] >> 6) & 3] = 'C';
-        bases['A'][(bytes[0] >> 4) & 3] = 'G';
-        bases['A'][(bytes[0] >> 2) & 3] = 'T';
-        bases['A'][(bytes[0]) & 3] = 'N';
-        System.arraycopy(bases['A'], 0, bases['a'], 0, 4);
-
-        bases['C'][(bytes[1] >> 6) & 3] = 'A';
-        bases['C'][(bytes[1] >> 4) & 3] = 'G';
-        bases['C'][(bytes[1] >> 2) & 3] = 'T';
-        bases['C'][(bytes[1]) & 3] = 'N';
-        System.arraycopy(bases['C'], 0, bases['c'], 0, 4);
-
-        bases['G'][(bytes[2] >> 6) & 3] = 'A';
-        bases['G'][(bytes[2] >> 4) & 3] = 'C';
-        bases['G'][(bytes[2] >> 2) & 3] = 'T';
-        bases['G'][(bytes[2]) & 3] = 'N';
-        System.arraycopy(bases['G'], 0, bases['g'], 0, 4);
-
-        bases['T'][(bytes[3] >> 6) & 3] = 'A';
-        bases['T'][(bytes[3] >> 4) & 3] = 'C';
-        bases['T'][(bytes[3] >> 2) & 3] = 'G';
-        bases['T'][(bytes[3]) & 3] = 'N';
-        System.arraycopy(bases['T'], 0, bases['t'], 0, 4);
-
-        bases['N'][(bytes[4] >> 6) & 3] = 'A';
-        bases['N'][(bytes[4] >> 4) & 3] = 'C';
-        bases['N'][(bytes[4] >> 2) & 3] = 'G';
-        bases['N'][(bytes[4]) & 3] = 'T';
-
-        for (final byte refBase : BASES) {
-            for (byte code = 0; code < 4; code++)
-                codes[refBase][bases[refBase][code]] = code;
-        }
-    }
-
-    public byte[] getEncodedMatrix() {
-        return bytes;
-    }
-
-    private static class SubCode {
-        final byte base;
-        long freq;
-        byte rank;
-
-        public SubCode(final byte base, final long freq) {
-            this.base = base;
-            this.freq = freq;
-        }
-
-    }
-
-    private static final Comparator<SubCode> comparator = new Comparator<SubstitutionMatrix.SubCode>() {
-
-        @Override
-        public int compare(final SubCode o1, final SubCode o2) {
-            if (o1.freq != o2.freq)
-                return (int) (o2.freq - o1.freq);
-            return ORDER[o1.base] - ORDER[o2.base];
-        }
-    };
-
-    private byte rank(final byte refBase, final long[] frequencies) {
-        // in alphabetical order:
-        final SubCode[] subCodes = new SubCode[4];
-        {
-            int i = 0;
-            for (final byte base : BASES) {
-                if (refBase == base)
-                    continue;
-                subCodes[i++] = new SubCode(base, frequencies[base]);
-            }
-        }
-
-        Arrays.sort(subCodes, comparator);
-
-        for (byte i = 0; i < subCodes.length; i++)
-            subCodes[i].rank = i;
-
-        for (final SubCode subCode1 : subCodes) subCode1.freq = 0;
-
-        Arrays.sort(subCodes, comparator);
-
-        byte rank = 0;
-        for (final SubCode subCode : subCodes) {
-            rank <<= 2;
-            rank |= subCode.rank;
-        }
-
-        for (final SubCode s : subCodes)
-            codes[refBase][s.base] = s.rank;
-
-        return rank;
-    }
-
-    public byte code(final byte refBase, final byte readBase) {
-        return codes[refBase][readBase];
-    }
-
-    public byte base(final byte refBase, final byte code) {
-        return bases[refBase][code];
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/example/ExampleSamUsage.java b/src/main/java/htsjdk/samtools/example/ExampleSamUsage.java
deleted file mode 100644
index 925e053..0000000
--- a/src/main/java/htsjdk/samtools/example/ExampleSamUsage.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.example;
-
-import htsjdk.samtools.DefaultSAMRecordFactory;
-import htsjdk.samtools.SAMFileWriter;
-import htsjdk.samtools.SAMFileWriterFactory;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SamInputResource;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-public class ExampleSamUsage {
-    public static SeekableStream myIndexSeekableStream() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** Example usages of {@link htsjdk.samtools.SamReaderFactory} */
-    public void openSamExamples() throws MalformedURLException {
-        /**
-         * Simplest case
-         */
-        final SamReader reader = SamReaderFactory.makeDefault().open(new File("/my.bam"));
-
-        /**
-         * With different reader options
-         */
-        final SamReader readerFromConfiguredFactory =
-                SamReaderFactory.make()
-                        .enable(SamReaderFactory.Option.DONT_MEMORY_MAP_INDEX)
-                        .validationStringency(ValidationStringency.SILENT)
-                        .samRecordFactory(DefaultSAMRecordFactory.getInstance())
-                        .open(new File("/my.bam"));
-
-        /**
-         * With a more complicated source 
-         */
-        final SamReader complicatedReader =
-                SamReaderFactory.makeDefault()
-                        .open(
-                                SamInputResource.of(new URL("http://broadinstitute.org/my.bam")).index(myIndexSeekableStream())
-                        );
-
-        /**
-         * Broken down
-         */
-        final SamReaderFactory factory =
-                SamReaderFactory.makeDefault().enable(SamReaderFactory.Option.VALIDATE_CRC_CHECKSUMS).validationStringency(ValidationStringency.LENIENT);
-
-        final SamInputResource resource = SamInputResource.of(new File("/my.bam")).index(new URL("http://broadinstitute.org/my.bam.bai"));
-
-        final SamReader myReader = factory.open(resource);
-
-        for (final SAMRecord samRecord : myReader) {
-            System.err.print(samRecord);
-        }
-
-    }
-
-    /**
-     * Read a SAM or BAM file, convert each read name to upper case, and write a new
-     * SAM or BAM file.
-     */
-    public void convertReadNamesToUpperCase(final File inputSamOrBamFile, final File outputSamOrBamFile) throws IOException {
-
-        final SamReader reader = SamReaderFactory.makeDefault().open(inputSamOrBamFile);
-
-        // makeSAMorBAMWriter() writes a file in SAM text or BAM binary format depending
-        // on the file extension, which must be either .sam or .bam.
-
-        // Since the SAMRecords will be written in the same order as they appear in the input file,
-        // and the output file is specified as having the same sort order (as specified in
-        // SAMFileHeader.getSortOrder(), presorted == true.  This is much more efficient than
-        // presorted == false, if coordinate or queryname sorting is specified, because the SAMRecords
-        // can be written to the output file directly rather than being written to a temporary file
-        // and sorted after all records have been sent to outputSam.
-
-        final SAMFileWriter outputSam = new SAMFileWriterFactory().makeSAMOrBAMWriter(reader.getFileHeader(),
-                true, outputSamOrBamFile);
-
-        for (final SAMRecord samRecord : reader) {
-            // Convert read name to upper case.
-            samRecord.setReadName(samRecord.getReadName().toUpperCase());
-            outputSam.addAlignment(samRecord);
-        }
-
-        outputSam.close();
-        reader.close();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/example/PrintReadsExample.java b/src/main/java/htsjdk/samtools/example/PrintReadsExample.java
deleted file mode 100755
index 7bbec0a..0000000
--- a/src/main/java/htsjdk/samtools/example/PrintReadsExample.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- */
-package htsjdk.samtools.example;
-
-import htsjdk.samtools.*;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.ProgressLogger;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-
-/**
- * This is a example program showing how to use SAM readers and (optionally) writers.
- * It's also useful for measuring time.
- * An example invocation is:
- * <code>java -cp dist/htsjdk-2.1.1.jar htsjdk.samtools.example.PrintReadsExample in.bam false a.bam</code>
- * Arguments:
- * - the first argument is the input file (SAM or BAM)
- * - the second argument is a boolean (true or false) that indicates whether reads are to be eagerly decoded (useful for benchmarking)
- * - the third argument is optional and is the name of the output file (nothing gets written if this argument is missing)
- */
-public final class PrintReadsExample {
-    private PrintReadsExample() {
-    }
-
-    private static final Log log = Log.getInstance(PrintReadsExample.class);
-
-    public static void main(String[] args) throws IOException {
-        if (args.length < 2) {
-            System.out.println("Usage: " + PrintReadsExample.class.getCanonicalName() + " inFile eagerDecode [outFile]");
-            System.exit(1);
-        }
-        final File inputFile = new File(args[0]);
-        final boolean eagerDecode = Boolean.parseBoolean(args[1]); //useful to test (realistic) scenarios in which every record is always fully decoded.
-        final File outputFile = args.length >= 3 ? new File(args[2]) : null;
-
-        final long start = System.currentTimeMillis();
-
-        log.info("Start with args:" + Arrays.toString(args));
-        printConfigurationInfo();
-
-        SamReaderFactory readerFactory = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
-        if (eagerDecode) {
-            readerFactory = readerFactory.enable(SamReaderFactory.Option.EAGERLY_DECODE);
-        }
-
-        try (final SamReader reader = readerFactory.open(inputFile)) {
-            final SAMFileHeader header = reader.getFileHeader();
-            try (final SAMFileWriter writer = outputFile != null ? new SAMFileWriterFactory().makeBAMWriter(header, true, outputFile) : null) {
-                final ProgressLogger pl = new ProgressLogger(log, 1000000);
-                for (final SAMRecord record : reader) {
-                    if (writer != null) {
-                        writer.addAlignment(record);
-                    }
-                    pl.record(record);
-                }
-            }
-        }
-        final long end = System.currentTimeMillis();
-        log.info(String.format("Done. Elapsed time %.3f seconds", (end - start) / 1000.0));
-    }
-
-    private static void printConfigurationInfo() throws IOException {
-        log.info("Executing as " +
-                System.getProperty("user.name") + '@' + InetAddress.getLocalHost().getHostName() +
-                " on " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") +
-                ' ' + System.getProperty("os.arch") + "; " + System.getProperty("java.vm.name") +
-                ' ' + System.getProperty("java.runtime.version"));
-
-        final List<String> list = Defaults.allDefaults().entrySet().stream().map(e -> e.getKey() + ':' + e.getValue()).collect(Collectors.toList());
-        log.info(String.join(" ", list));
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/AsyncFastqWriter.java b/src/main/java/htsjdk/samtools/fastq/AsyncFastqWriter.java
deleted file mode 100644
index dee0a16..0000000
--- a/src/main/java/htsjdk/samtools/fastq/AsyncFastqWriter.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package htsjdk.samtools.fastq;
-
-import htsjdk.samtools.util.AbstractAsyncWriter;
-
-/**
- * Implementation of a FastqWriter that provides asynchronous output.
- * @author Tim Fennell
- */
-public class AsyncFastqWriter extends AbstractAsyncWriter<FastqRecord> implements FastqWriter {
-    private final FastqWriter writer;
-
-    public AsyncFastqWriter(final FastqWriter out, final int queueSize) {
-        super(queueSize);
-        this.writer = out;
-    }
-
-    @Override protected String getThreadNamePrefix() { return "FastqWriterThread-"; }
-    @Override protected void synchronouslyWrite(final FastqRecord item) { this.writer.write(item); }
-    @Override protected void synchronouslyClose() { this.writer.close(); }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/BasicFastqWriter.java b/src/main/java/htsjdk/samtools/fastq/BasicFastqWriter.java
deleted file mode 100644
index 8a5afd3..0000000
--- a/src/main/java/htsjdk/samtools/fastq/BasicFastqWriter.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.fastq;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.File;
-import java.io.Flushable;
-import java.io.OutputStream;
-import java.io.PrintStream;
-
-/**
- * In general FastqWriterFactory should be used so that AsyncFastqWriter can be enabled, but there are some
- * cases in which that behavior is explicitly not wanted.
- */
-public class BasicFastqWriter implements FastqWriter,Flushable {
-    private final String path;
-    private final PrintStream writer;
-
-    public BasicFastqWriter(final File file) {
-        this(file, false);
-    }
-
-    public BasicFastqWriter(final File file, final boolean createMd5) {
-        this(file, new PrintStream(IOUtil.maybeBufferOutputStream(maybeMd5Wrap(file, createMd5))));
-    }
-
-    private BasicFastqWriter(final File file, final PrintStream writer) {
-        this.path = (file != null? file.getAbsolutePath(): "");
-        this.writer = writer;
-    }
-
-    public BasicFastqWriter(final PrintStream writer) {
-        this(null, writer);
-    }
-
-    @Override
-    public void write(final FastqRecord rec) {
-        writer.print(FastqConstants.SEQUENCE_HEADER);
-        writer.println(rec.getReadHeader());
-        writer.println(rec.getReadString());
-        writer.print(FastqConstants.QUALITY_HEADER);
-        writer.println(rec.getBaseQualityHeader() == null ? "" : rec.getBaseQualityHeader());
-        writer.println(rec.getBaseQualityString());
-        if (writer.checkError()) {
-            throw new SAMException("Error in writing fastq file " + path);
-        }
-    }
-
-    @Override
-    public void flush() {
-        writer.flush();
-    }
-
-    @Override
-    public void close() {
-        writer.close();
-    }
-
-    private static OutputStream maybeMd5Wrap(final File file, final boolean createMd5) {
-        if (createMd5) {
-            return IOUtil.openFileForMd5CalculatingWriting(file);
-        } else {
-            return IOUtil.openFileForWriting(file);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/FastqConstants.java b/src/main/java/htsjdk/samtools/fastq/FastqConstants.java
deleted file mode 100644
index f5d4150..0000000
--- a/src/main/java/htsjdk/samtools/fastq/FastqConstants.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.fastq;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class FastqConstants {
-    public static final String SEQUENCE_HEADER = "@" ;
-    public static final String QUALITY_HEADER = "+" ;
-    
-    public enum FastqExtensions {
-        FASTQ(".fastq"),
-        FASTQ_GZ(".fastq.gz"),
-        FQ(".fq"),
-        FQ_GZ(".fq.gz"),
-        BFQ(".bfq");
-        
-        private final String extension;
-        
-        private FastqExtensions(final String extension) {
-            this.extension = extension;
-        }
-        
-        public String getExtension() { return this.extension; }
-        
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/FastqReader.java b/src/main/java/htsjdk/samtools/fastq/FastqReader.java
deleted file mode 100755
index 8086dfa..0000000
--- a/src/main/java/htsjdk/samtools/fastq/FastqReader.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.fastq;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.BufferedReader;
-import java.io.Closeable;
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * Reads a FASTQ file with four lines per record.
- * WARNING: Despite the fact that this class implements Iterable, calling iterator() method does not
- * start iteration from the beginning of the file.  Developers should probably not call iterator()
- * directly.  It is provided so that this class can be used in Java for-each loop.
- */
-public class FastqReader implements Iterator<FastqRecord>, Iterable<FastqRecord>, Closeable {
-    final private File fastqFile;
-    final private BufferedReader reader;
-    private FastqRecord nextRecord;
-    private int line=1;
-
-    final private boolean skipBlankLines;
-
-    public FastqReader(final File file) {
-        this(file,false);
-    }
-    
-    /**
-     * Constructor
-     * @param file of FASTQ to read read. Will be opened with htsjdk.samtools.util.IOUtil.openFileForBufferedReading
-     * @param skipBlankLines should we skip blank lines ?
-     */
-    public FastqReader(final File file, final boolean skipBlankLines) {
-        this.skipBlankLines=skipBlankLines;
-        fastqFile = file;
-        reader = IOUtil.openFileForBufferedReading(fastqFile);
-        nextRecord = readNextRecord();
-    }
-
-    public FastqReader(final BufferedReader reader) {
-        this(null, reader);
-    }
-
-    /**
-     * Constructor
-     * @param file Name of FASTQ being read, or null if not known.
-     * @param reader input reader . Will be closed by the close method
-     * @param skipBlankLines should we skip blank lines ?
-     */
-    public FastqReader(final File file, final BufferedReader reader,boolean skipBlankLines) {
-        this.fastqFile = file;
-        this.reader = reader;
-        this.nextRecord = readNextRecord();
-        this.skipBlankLines = skipBlankLines;
-    }
-
-    public FastqReader(final File file, final BufferedReader reader) {
-        this(file,reader,false);
-    }
-
-    private FastqRecord readNextRecord() {
-        try {
-
-            // Read sequence header
-            final String seqHeader = readLineConditionallySkippingBlanks();
-            if (seqHeader == null) return null ;
-            if (StringUtil.isBlank(seqHeader)) {
-                throw new SAMException(error("Missing sequence header"));
-            }
-            if (!seqHeader.startsWith(FastqConstants.SEQUENCE_HEADER)) {
-                throw new SAMException(error("Sequence header must start with "+ FastqConstants.SEQUENCE_HEADER+": "+seqHeader));
-            }
-
-            // Read sequence line
-            final String seqLine = readLineConditionallySkippingBlanks();
-            checkLine(seqLine,"sequence line");
-
-            // Read quality header
-            final String qualHeader = readLineConditionallySkippingBlanks();
-            checkLine(qualHeader,"quality header");
-            if (!qualHeader.startsWith(FastqConstants.QUALITY_HEADER)) {
-                throw new SAMException(error("Quality header must start with "+ FastqConstants.QUALITY_HEADER+": "+qualHeader));
-            }
-
-            // Read quality line
-            final String qualLine = readLineConditionallySkippingBlanks();
-            checkLine(qualLine,"quality line");
-
-            // Check sequence and quality lines are same length
-            if (seqLine.length() != qualLine.length()) {
-                throw new SAMException(error("Sequence and quality line must be the same length"));
-            }
-
-            final FastqRecord frec = new FastqRecord(seqHeader.substring(1, seqHeader.length()), seqLine,
-                    qualHeader.substring(1, qualHeader.length()), qualLine);
-            line += 4 ;
-            return frec ;
-
-        } catch (IOException e) {
-            throw new SAMException(String.format("Error reading fastq '%s'", getAbsolutePath()), e);
-        }
-    }
-
-    public boolean hasNext() { return nextRecord != null; }
-
-    public FastqRecord next() {
-        if (!hasNext()) {
-            throw new NoSuchElementException("next() called when !hasNext()");
-        }
-        final FastqRecord rec = nextRecord;
-        nextRecord = readNextRecord();
-        return rec;
-    }
-
-    public void remove() { throw new UnsupportedOperationException("Unsupported operation"); }
-
-    /**
-     * WARNING: Despite the fact that this class implements Iterable, calling iterator() method does not
-     * start iteration from the beginning of the file.  Developers should probably not call iterator()
-     * directly.  It is provided so that this class can be used in Java for-each loop.
-     */
-    public Iterator<FastqRecord> iterator() { return this; }
-
-    public int getLineNumber() { return line ; }
-
-
-    /**
-     * @return Name of FASTQ being read, or null if not known.
-     */
-    public File getFile() { return fastqFile ; }
-
-    @Override
-    public void close() {
-        try {
-            reader.close();
-        } catch (IOException e) {
-            throw new SAMException("IO problem in fastq file "+getAbsolutePath(), e);
-        }
-    }
-
-    private void checkLine(final String line, final String kind) {
-        if (line == null) {
-            throw new SAMException(error("File is too short - missing "+kind+" line"));
-        }
-        if (StringUtil.isBlank(line)) {
-            throw new SAMException(error("Missing "+kind));
-        }
-    }
-
-    private String error(final String msg) {
-        return msg + " at line "+line+" in fastq "+getAbsolutePath();
-    }
-
-    private String getAbsolutePath() {
-        if (fastqFile == null) return "";
-        else return fastqFile.getAbsolutePath();
-    }
-
-    private String readLineConditionallySkippingBlanks() throws IOException {
-        String line;
-        do {
-            line = reader.readLine();
-            if (line == null) return line;
-        } while(skipBlankLines && StringUtil.isBlank(line));
-        return line;
-    }
-
-    @Override
-    public String toString() {
-        return "FastqReader["+(this.fastqFile == null?"":this.fastqFile)+ " Line:"+getLineNumber()+"]";
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/FastqRecord.java b/src/main/java/htsjdk/samtools/fastq/FastqRecord.java
deleted file mode 100755
index b1d3f75..0000000
--- a/src/main/java/htsjdk/samtools/fastq/FastqRecord.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.fastq;
-
-import java.io.Serializable;
-
-/**
- * Represents a fastq record, fairly literally, i.e. without any conversion.
- */
-public class FastqRecord implements Serializable {
-    private static final long serialVersionUID = 1L;
-    private final String seqHeaderPrefix;
-    private final String seqLine;
-    private final String qualHeaderPrefix;
-    private final String qualLine;
-
-    public FastqRecord(final String seqHeaderPrefix, final String seqLine, final String qualHeaderPrefix, final String qualLine) {
-        if (seqHeaderPrefix != null && !seqHeaderPrefix.isEmpty()) this.seqHeaderPrefix = seqHeaderPrefix;
-        else this.seqHeaderPrefix = null;
-        if (qualHeaderPrefix != null && !qualHeaderPrefix.isEmpty()) this.qualHeaderPrefix = qualHeaderPrefix;
-        else this.qualHeaderPrefix = null;
-        this.seqLine = seqLine ;
-        this.qualLine = qualLine ;
-    }
-    
-    /** copy constructor */
-    public FastqRecord(final FastqRecord other) {
-        if( other == null ) throw new IllegalArgumentException("new FastqRecord(null)");
-        this.seqHeaderPrefix = other.seqHeaderPrefix;
-        this.seqLine = other.seqLine;
-        this.qualHeaderPrefix = other.qualHeaderPrefix;
-        this.qualLine = other.qualLine;
-    }
-
-    /** @return the read name */
-    public String getReadHeader() { return seqHeaderPrefix; }
-    /** @return the read DNA sequence */
-    public String getReadString() { return seqLine; }
-    /** @return the quality header */
-    public String getBaseQualityHeader() { return qualHeaderPrefix; }
-    /** @return the quality string */
-    public String getBaseQualityString() { return qualLine; }
-    /** shortcut to getReadString().length() */
-    public int length() { return this.seqLine==null?0:this.seqLine.length();}
-    
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime
-                * result
-                + ((qualHeaderPrefix == null) ? 0 : qualHeaderPrefix.hashCode());
-        result = prime * result
-                + ((qualLine == null) ? 0 : qualLine.hashCode());
-        result = prime * result
-                + ((seqHeaderPrefix == null) ? 0 : seqHeaderPrefix.hashCode());
-        result = prime * result + ((seqLine == null) ? 0 : seqLine.hashCode());
-        return result;
-    }
-    
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        FastqRecord other = (FastqRecord) obj;
-        if (seqLine == null) {
-            if (other.seqLine != null)
-                return false;
-        } else if (!seqLine.equals(other.seqLine))
-            return false;
-        if (qualHeaderPrefix == null) {
-            if (other.qualHeaderPrefix != null)
-                return false;
-        } else if (!qualHeaderPrefix.equals(other.qualHeaderPrefix))
-            return false;
-        if (qualLine == null) {
-            if (other.qualLine != null)
-                return false;
-        } else if (!qualLine.equals(other.qualLine))
-            return false;
-        if (seqHeaderPrefix == null) {
-            if (other.seqHeaderPrefix != null)
-                return false;
-        } else if (!seqHeaderPrefix.equals(other.seqHeaderPrefix))
-            return false;
-        
-        return true;
-    }
-    
-    @Override
-    public String toString() {
-        return new StringBuilder().
-                append(FastqConstants.SEQUENCE_HEADER).append(this.seqHeaderPrefix==null?"":this.seqHeaderPrefix).append('\n').
-                append(this.seqLine==null?"":this.seqLine).append('\n').
-                append(FastqConstants.QUALITY_HEADER).append(this.qualHeaderPrefix==null?"":this.qualHeaderPrefix).append('\n').
-                append(this.qualLine==null?"":this.qualLine).
-                toString();
-        }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/FastqWriter.java b/src/main/java/htsjdk/samtools/fastq/FastqWriter.java
deleted file mode 100644
index e37aec5..0000000
--- a/src/main/java/htsjdk/samtools/fastq/FastqWriter.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package htsjdk.samtools.fastq;
-
-import java.io.Closeable;
-
-/**
- * Simple interface for a class that can write out fastq records.
- *
- * @author Tim Fennell
- */
-public interface FastqWriter extends Closeable {
-    void write(final FastqRecord rec);
-    void close();
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/FastqWriterFactory.java b/src/main/java/htsjdk/samtools/fastq/FastqWriterFactory.java
deleted file mode 100644
index 273e352..0000000
--- a/src/main/java/htsjdk/samtools/fastq/FastqWriterFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package htsjdk.samtools.fastq;
-
-import htsjdk.samtools.Defaults;
-
-import java.io.File;
-
-/**
- * Factory class for creating FastqWriter objects.
- *
- * @author Tim Fennell
- */
-public class FastqWriterFactory {
-    boolean useAsyncIo = Defaults.USE_ASYNC_IO_WRITE_FOR_SAMTOOLS;
-    boolean createMd5  = Defaults.CREATE_MD5;
-
-    /** Sets whether or not to use async io (i.e. a dedicated thread per writer. */
-    public void setUseAsyncIo(final boolean useAsyncIo) { this.useAsyncIo = useAsyncIo; }
-
-    /** If true, compute MD5 and write appropriately-named file when file is closed. */
-    public void setCreateMd5(final boolean createMd5) { this.createMd5 = createMd5; }
-
-    public FastqWriter newWriter(final File out) {
-        final FastqWriter writer = new BasicFastqWriter(out, createMd5);
-        if (useAsyncIo) {
-            return new AsyncFastqWriter(writer, AsyncFastqWriter.DEFAULT_QUEUE_SIZE);
-        }
-        else {
-            return writer;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/AbstractJavascriptFilter.java b/src/main/java/htsjdk/samtools/filter/AbstractJavascriptFilter.java
deleted file mode 100644
index 9163735..0000000
--- a/src/main/java/htsjdk/samtools/filter/AbstractJavascriptFilter.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-
-import javax.script.Bindings;
-import javax.script.Compilable;
-import javax.script.CompiledScript;
-import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
-import javax.script.ScriptException;
-import javax.script.SimpleBindings;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.RuntimeScriptException;
-
-/**
- * Javascript filter with HEADER type containing TYPE records. contains two
- * static method to get a SAM Read filter or a VariantFilter.
- * 
- * warning: tools, like galaxy, using this class are not safe because a script
- * can access the filesystem.
- * 
- * @author Pierre Lindenbaum PhD
- */
-public abstract class AbstractJavascriptFilter<HEADER, TYPE> {
-    public static final String DEFAULT_HEADER_KEY = "header";
-    /** compiled user script */
-    private CompiledScript script = null;
-
-    /** javascript bindings */
-    protected Bindings bindings;
-
-    /**
-     * constructor using a java.io.File script, compiles the script, puts
-     * 'header' in the bindings
-     */
-    protected AbstractJavascriptFilter(final File scriptFile, final HEADER header) throws IOException {
-        this(new FileReader(scriptFile), header);
-    }
-
-    /**
-     * constructor using a java.lang.String script, compiles the script, puts
-     * 'header' in the bindings
-     */
-    protected AbstractJavascriptFilter(final String scriptExpression, final HEADER header) {
-        this(new StringReader(scriptExpression), header);
-    }
-
-    /**
-     * Constructor, compiles script, put header in the bindings
-     * 
-     * @param scriptReader
-     *            reader containing the script. will be closed.
-     * @param header
-     *            the header to be injected in the javascript context
-     */
-    protected AbstractJavascriptFilter(final Reader scriptReader, final HEADER header) {
-        final ScriptEngineManager manager = new ScriptEngineManager();
-        /* get javascript engine */
-        final ScriptEngine engine = manager.getEngineByName("js");
-        if (engine == null) {
-            CloserUtil.close(scriptReader);
-            throw new RuntimeScriptException("The embedded 'javascript' engine is not available in java. "
-                    + "Do you use the SUN/Oracle Java Runtime ?");
-        }
-        if (scriptReader == null) {
-            throw new RuntimeScriptException("missing ScriptReader.");
-        }
-        
-        try {
-            final Compilable compilingEngine = getCompilable(engine);
-            this.script = compilingEngine.compile(scriptReader);
-        } catch (ScriptException err) {
-            throw new RuntimeScriptException("Script error in input", err);
-        } finally {
-            CloserUtil.close(scriptReader);
-        }
-
-        /*
-         * create the javascript bindings and put the file header in that
-         * context
-         */
-        this.bindings = new SimpleBindings();
-        this.bindings.put(DEFAULT_HEADER_KEY, header);
-    }
-
-    /** return a javascript engine as a Compilable */
-    private static Compilable getCompilable(final ScriptEngine engine) {
-        if (!(engine instanceof Compilable)) {
-            throw new IllegalStateException("The current javascript engine (" + engine.getClass()
-                    + ") cannot be cast to Compilable. " + "Do you use the SUN/Oracle Java Runtime ?");
-        }
-        return Compilable.class.cast(engine);
-    }
-
-    /** returns key used for header binding */
-    public String getHeaderKey() {
-        return DEFAULT_HEADER_KEY;
-    }
-
-    /** returns key used for record binding */
-    public abstract String getRecordKey();
-
-    /**
-     * Evaluates this predicate on the given argument
-     * 
-     * @param record
-     *            the record to test. It will be inject in the javascript
-     *            context using getRecordKey()
-     * @return true (keep) if the user script returned 1 or true, else false
-     *         (reject).
-     */
-    protected boolean accept(final TYPE record) {
-        try {
-            /* insert the record into the javascript context */
-            this.bindings.put(getRecordKey(), record);
-            /* get the result */
-            final Object result = this.script.eval(this.bindings);
-            if (result == null) {
-                return false;
-            } else if (result instanceof Boolean) {
-                return Boolean.TRUE.equals(result);
-            } else if (result instanceof Number) {
-                return (((Number) result).intValue() == 1);
-            } else {
-                return false;
-            }
-        } catch (ScriptException err) {
-            throw new RuntimeException(err);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/AggregateFilter.java b/src/main/java/htsjdk/samtools/filter/AggregateFilter.java
deleted file mode 100644
index f396c59..0000000
--- a/src/main/java/htsjdk/samtools/filter/AggregateFilter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-import java.util.List;
-
-/**
- * Aggregates multiple filters and provides a method for applying them all to a given record with
- * one method call.
- *
- * $Id$
- */
-public class AggregateFilter implements SamRecordFilter {
-
-    private final List<SamRecordFilter> filters;
-
-    /**
-     * Constructor
-     * @param filters   the list of filters that this Aggregator applies
-     */
-    public AggregateFilter(final List<SamRecordFilter> filters) {
-        this.filters = filters;
-    }
-
-    /**
-     * Determines whether a SAMRecord matches this filter
-     *
-     * @param record    the SAMRecord to evaluate
-     * @return  true if the SAMRecord matches at least one filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord record) {
-        for (final SamRecordFilter filter : filters) {
-            if (filter.filterOut(record)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Determines whether a pair of SAMRecord matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the SAMRecords matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-         for (final SamRecordFilter filter : filters) {
-            if (filter.filterOut(first, second)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/AlignedFilter.java b/src/main/java/htsjdk/samtools/filter/AlignedFilter.java
deleted file mode 100644
index c70453d..0000000
--- a/src/main/java/htsjdk/samtools/filter/AlignedFilter.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter to either include or exclude aligned reads
- *
- * $Id$
- */
-public class AlignedFilter implements SamRecordFilter {
-
-    private boolean includeAligned = false;
-
-    public AlignedFilter(final boolean includeAligned) {
-        this.includeAligned = includeAligned;
-    }
-
-    /**
-     * Determines whether a SAMRecord matches this filter
-     *
-     * @param record the SAMRecord to evaluate
-     *
-     * @return true if the SAMRecord matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord record) {
-        if (includeAligned) {
-            if (!record.getReadUnmappedFlag()) {
-                return false;
-            }
-        } else {
-            // exclude aligned
-            if (record.getReadUnmappedFlag()) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Determines whether a pair of SAMRecord matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the SAMRecords matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-
-        if (includeAligned) {
-            // both first and second must be mapped for it to not be filtered out
-            if (!first.getReadUnmappedFlag() && !second.getReadUnmappedFlag()) {
-                return false;
-            }
-        } else {
-            // exclude aligned - if either first or second is unmapped don't filter it out
-            if (first.getReadUnmappedFlag() || second.getReadUnmappedFlag()) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/filter/DuplicateReadFilter.java b/src/main/java/htsjdk/samtools/filter/DuplicateReadFilter.java
deleted file mode 100644
index c79b3cc..0000000
--- a/src/main/java/htsjdk/samtools/filter/DuplicateReadFilter.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter out SAMRecords with DuplicateRead flag set
- *
- * $Id$
- */
-public class DuplicateReadFilter implements SamRecordFilter {
-    /**
-     * @param record the SAMRecord to evaluate
-     * @return true if the SAMRecord matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord record) {
-        return record.getDuplicateReadFlag();
-    }
-
-    /**
-     * Determines whether a pair of SAMRecord matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the SAMRecords matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        throw new UnsupportedOperationException("Paired DuplicateReadFilter filter not implemented!");
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/FailsVendorReadQualityFilter.java b/src/main/java/htsjdk/samtools/filter/FailsVendorReadQualityFilter.java
deleted file mode 100644
index 7c6825c..0000000
--- a/src/main/java/htsjdk/samtools/filter/FailsVendorReadQualityFilter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter for filtering out reads that do not pass the quality filter
- *
- * $Id$
- */
-public class FailsVendorReadQualityFilter implements SamRecordFilter {
-
-    /**
-     * Determines whether a SAMRecord matches this filter
-     *
-     * @param record    the SAMRecord to evaluate
-     * @return  true if the SAMRecord matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord record) {
-        return record.getReadFailsVendorQualityCheckFlag();
-    }
-
-    /**
-     * Determines whether a pair of SAMRecord matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the SAMRecords matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        // if either fails, exclude them both
-        return (first.getReadFailsVendorQualityCheckFlag() || second.getReadFailsVendorQualityCheckFlag());
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/FilteringIterator.java b/src/main/java/htsjdk/samtools/filter/FilteringIterator.java
deleted file mode 100644
index 3ce9f96..0000000
--- a/src/main/java/htsjdk/samtools/filter/FilteringIterator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-import java.util.Iterator;
-
-/**
- * Filtering Iterator which takes a filter and an iterator and iterates through only those records
- * which are not rejected by the filter.
- * <p/>
- * $Id$
- *
- * @author Kathleen Tibbetts
- *
- * use {@link FilteringSamIterator} instead
- */
-
- at Deprecated /** use {@link FilteringSamIterator} instead **/
-public class FilteringIterator extends FilteringSamIterator{
-
-    public FilteringIterator(final Iterator<SAMRecord> iterator, final SamRecordFilter filter, final boolean filterByPair) {
-        super(iterator, filter, filterByPair);
-    }
-
-    public FilteringIterator(final Iterator<SAMRecord> iterator, final SamRecordFilter filter) {
-        super(iterator, filter);
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/filter/FilteringSamIterator.java b/src/main/java/htsjdk/samtools/filter/FilteringSamIterator.java
deleted file mode 100644
index 7ac1c0a..0000000
--- a/src/main/java/htsjdk/samtools/filter/FilteringSamIterator.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SamPairUtil;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.PeekableIterator;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * Filtering Iterator which takes a filter and an iterator and iterates through only those records
- * which are not rejected by the filter.
- * <p/>
- * $Id$
- *
- * @author Kathleen Tibbetts
- */
-public class FilteringSamIterator implements CloseableIterator<SAMRecord> {
-
-    private final PeekableIterator<SAMRecord> iterator;
-    private final SamRecordFilter filter;
-    private boolean filterReadPairs = false;
-    private SAMRecord next = null;
-
-    /**
-     * Constructor
-     *
-     * @param iterator     the backing iterator
-     * @param filter       the filter (which may be a FilterAggregator)
-     * @param filterByPair if true, filter reads in pairs
-     */
-    public FilteringSamIterator(final Iterator<SAMRecord> iterator, final SamRecordFilter filter,
-                                final boolean filterByPair) {
-
-        if (filterByPair && iterator instanceof SAMRecordIterator) {
-            ((SAMRecordIterator)iterator).assertSorted(SAMFileHeader.SortOrder.queryname);
-        }
-
-        this.iterator = new PeekableIterator<SAMRecord>(iterator);
-        this.filter = filter;
-        this.filterReadPairs = filterByPair;
-        next = getNextRecord();
-    }
-
-    /**
-     * Constructor
-     *
-     * @param iterator the backing iterator
-     * @param filter   the filter (which may be a FilterAggregator)
-     */
-    public FilteringSamIterator(final Iterator<SAMRecord> iterator, final SamRecordFilter filter) {
-        this.iterator = new PeekableIterator<SAMRecord>(iterator);
-        this.filter = filter;
-        next = getNextRecord();
-    }
-
-    /**
-     * Returns true if the iteration has more elements.
-     *
-     * @return true if the iteration has more elements.  Otherwise returns false.
-     */
-    public boolean hasNext() {
-        return next != null;
-    }
-
-    /**
-     * Returns the next element in the iteration.
-     *
-     * @return the next element in the iteration
-     * @throws java.util.NoSuchElementException
-     *
-     */
-    public SAMRecord next() {
-        if (next == null) {
-            throw new NoSuchElementException("Iterator has no more elements.");
-        }
-        final SAMRecord result = next;
-        next = getNextRecord();
-        return result;
-    }
-
-    /**
-     * Required method for Iterator API.
-     *
-     * @throws UnsupportedOperationException
-     */
-    public void remove() {
-        throw new UnsupportedOperationException("Remove() not supported by FilteringSamIterator");
-    }
-
-    public void close() {
-        CloserUtil.close(iterator);
-    }
-
-    /**
-     * Gets the next record from the underlying iterator that passes the filter
-     *
-     * @return SAMRecord    the next filter-passing record
-     */
-    private SAMRecord getNextRecord() {
-
-        while (iterator.hasNext()) {
-            final SAMRecord record = iterator.next();
-
-            if (filterReadPairs && record.getReadPairedFlag() && record.getFirstOfPairFlag() &&
-                iterator.hasNext()) {
-
-                SamPairUtil.assertMate(record, iterator.peek());
-
-                if (filter.filterOut(record, iterator.peek())) {
-                    // skip second read
-                    iterator.next();
-                } else {
-                    return record;
-                }
-            } else if (filterReadPairs && record.getReadPairedFlag() &&
-                record.getSecondOfPairFlag()) {
-                // assume that we did a pass(first, second) and it passed the filter
-                return record;
-            } else if (!filter.filterOut(record)) {
-                return record;
-            }
-        }
-
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/filter/InsertSizeFilter.java b/src/main/java/htsjdk/samtools/filter/InsertSizeFilter.java
deleted file mode 100644
index 1e99fa9..0000000
--- a/src/main/java/htsjdk/samtools/filter/InsertSizeFilter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter things that fall outside a specified range of insert sizes.
- * This will automatically omit unpaired reads.
- */
-public class InsertSizeFilter implements SamRecordFilter {
-    final int minInsertSize;
-    final int maxInsertSize;
-
-    public InsertSizeFilter(final int minInsertSize, final int maxInsertSize) {
-        if (minInsertSize > maxInsertSize) throw new SAMException("Cannot have minInsertSize > maxInsertSize");
-        this.minInsertSize = minInsertSize;
-        this.maxInsertSize = maxInsertSize;
-    }
-
-    @Override
-    public boolean filterOut(final SAMRecord rec) {
-        if (!rec.getReadPairedFlag()) return true;
-        final int ins = Math.abs(rec.getInferredInsertSize());
-        return ins < minInsertSize || ins > maxInsertSize;
-    }
-
-    @Override
-    public boolean filterOut(final SAMRecord r1, final SAMRecord r2) {
-        return filterOut(r1) || filterOut(r2);
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/filter/IntervalFilter.java b/src/main/java/htsjdk/samtools/filter/IntervalFilter.java
deleted file mode 100644
index ff3620a..0000000
--- a/src/main/java/htsjdk/samtools/filter/IntervalFilter.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.IntervalUtil;
-
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Filter SAMRecords so that only those that overlap the given list of intervals.
- * It is required that the SAMRecords are passed in coordinate order, and have non-null SAMFileHeaders.
- *
- * $Id$
- *
- * @author alecw at broadinstitute.org
- */
-public class IntervalFilter implements SamRecordFilter {
-    private final Iterator<Interval> intervals;
-    /**
-     * Null only if there are no more intervals
-     */
-    private final SAMFileHeader samHeader;
-    private Interval currentInterval;
-    private int currentSequenceIndex;
-
-    /**
-     * Prepare to filter out SAMRecords that do not overlap the given list of intervals
-     * @param intervals -- must be locus-ordered & non-overlapping
-     */
-    public IntervalFilter(final List<Interval> intervals, final SAMFileHeader samHeader) {
-        this.samHeader = samHeader;
-        IntervalUtil.assertOrderedNonOverlapping(intervals.iterator(), samHeader.getSequenceDictionary());
-        this.intervals = intervals.iterator();
-        advanceInterval();
-    }
-
-    /**
-     * Determines whether a SAMRecord matches this filter
-     *
-     * @param record the SAMRecord to evaluate
-     * @return true if the SAMRecord matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord record) {
-        while (currentInterval != null &&
-                (currentSequenceIndex < record.getReferenceIndex() ||
-                 (currentSequenceIndex == record.getReferenceIndex() && currentInterval.getEnd() < record.getAlignmentStart()))) {
-            advanceInterval();
-        }
-        // Return true if record should be filtered out
-        return !(currentInterval != null && currentSequenceIndex == record.getReferenceIndex() &&
-                 currentInterval.getStart() <= record.getAlignmentEnd());
-    }
-
-    private void advanceInterval() {
-        if (intervals.hasNext()) {
-            currentInterval = intervals.next();
-            currentSequenceIndex = samHeader.getSequenceIndex(currentInterval.getContig());
-        } else {
-            currentInterval = null;
-        }
-    }
-
-    /**
-     * Determines whether a pair of SAMRecord matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the SAMRecords matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        // This can never be implemented because if the bam is coordinate sorted,
-        // which it has to be for this filter, it will never get both the first and second reads together
-        // and the filterOut method goes in order of the intervals in coordinate order so it will miss reads.
-        throw new UnsupportedOperationException("Paired IntervalFilter filter cannot be implemented, use IntervalKeepPairFilter.");
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/IntervalKeepPairFilter.java b/src/main/java/htsjdk/samtools/filter/IntervalKeepPairFilter.java
deleted file mode 100644
index 5a7961b..0000000
--- a/src/main/java/htsjdk/samtools/filter/IntervalKeepPairFilter.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMUtils;
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.OverlapDetector;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Filter out SAMRecords where neither record of a pair overlaps a given set of
- * intervals. If one record of a pair overlaps the interval list, than both are
- * kept. It is required that the SAMRecords are passed in coordinate order, have
- * non-null SAMFileHeaders, and that Mate Cigar (MC) is present.
- *
- * @author kbergin at broadinstitute.org
- */
-public class IntervalKeepPairFilter implements SamRecordFilter {
-    private final OverlapDetector<Interval> intervalOverlapDetector;
-
-    /**
-     * Prepare to filter out SAMRecords that do not overlap the given list of
-     * intervals
-     * @param intervals
-     */
-    public IntervalKeepPairFilter(final List<Interval> intervals) {
-        this.intervalOverlapDetector = new OverlapDetector<>(0, 0);
-        this.intervalOverlapDetector.addAll(intervals, intervals);
-    }
-
-    /**
-     * Determines whether a SAMRecord matches this filter. Takes record, finds
-     * the location of its mate using the MC tag. Checks if either record
-     * overlaps the current interval using overlap detector. If yes, return
-     * false -> don't filter it out.
-     *
-     * If a read is secondary or supplementary, filter read out. Use
-     * {@link IntervalFilter} if you want to keep these reads, but NOTE: the
-     * resulting bam may not be valid.
-     *
-     * @param record the SAMRecord to evaluate
-     * @return true if the SAMRecord matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord record) {
-        if (record.isSecondaryOrSupplementary()) {
-           return true;
-        }
-
-        if (!record.getReadUnmappedFlag()
-                && hasOverlaps(record.getReferenceName(), record.getStart(), record.getEnd())) {
-            return false;
-        }
-
-        return record.getMateUnmappedFlag() || !hasOverlaps(record.getMateReferenceName(),
-                record.getMateAlignmentStart(), SAMUtils.getMateAlignmentEnd(record));
-    }
-
-    /**
-     * Returns true if the record overlaps any intervals in list, false otherwise.
-     *
-     * @param refSequence Reference contig name where record maps
-     * @param start Record alignment start
-     * @param end Record alignment end
-     * @return true if SAMRecord overlaps any intervals in list
-     */
-    private boolean hasOverlaps(final String refSequence, final int start, final int end) {
-        final Interval readInterval = new Interval(refSequence, start, end);
-        final Collection<Interval> overlapsRead = intervalOverlapDetector.getOverlaps(readInterval);
-
-        return !overlapsRead.isEmpty();
-    }
-
-    /**
-     * Determines whether a pair of SAMRecord matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if both SAMRecords do not overlap the interval list
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        return filterOut(first) && filterOut(second);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/JavascriptSamRecordFilter.java b/src/main/java/htsjdk/samtools/filter/JavascriptSamRecordFilter.java
deleted file mode 100644
index 20c784b..0000000
--- a/src/main/java/htsjdk/samtools/filter/JavascriptSamRecordFilter.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.Reader;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-
-/**
- * javascript based read filter
- * 
- * 
- * The script puts the following variables in the script context:
- *
- * - 'record' a SamRecord (
- * https://github.com/samtools/htsjdk/blob/master/src/java/htsjdk/samtools/
- * SAMRecord.java ) - 'header' (
- * https://github.com/samtools/htsjdk/blob/master/src/java/htsjdk/samtools/
- * SAMFileHeader.java )
- * 
- * @author Pierre Lindenbaum PhD Institut du Thorax - INSERM - Nantes - France
- */
-public class JavascriptSamRecordFilter extends AbstractJavascriptFilter<SAMFileHeader, SAMRecord>
-        implements SamRecordFilter {
-    /**
-     * constructor using a javascript File
-     * 
-     * @param scriptFile
-     *            the javascript file to be compiled
-     * @param header
-     *            the SAMHeader
-     */
-    public JavascriptSamRecordFilter(final File scriptFile, final SAMFileHeader header) throws IOException {
-        super(scriptFile, header);
-    }
-
-    /**
-     * constructor using a javascript expression
-     * 
-     * @param scriptExpression
-     *            the javascript expression to be compiled
-     * @param header
-     *            the SAMHeader
-     */
-    public JavascriptSamRecordFilter(final String scriptExpression, final SAMFileHeader header) {
-        super(scriptExpression, header);
-    }
-
-    /**
-     * constructor using a java.io.Reader
-     * 
-     * @param scriptReader
-     *            the javascript reader to be compiled. will be closed
-     * @param header
-     *            the SAMHeader
-     */
-    public JavascriptSamRecordFilter(final Reader scriptReader, final SAMFileHeader header) {
-        super(scriptReader, header);
-    }
-
-    /** return true of both records are filteredOut (AND) */
-    @Override
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        return filterOut(first) && filterOut(second);
-    }
-
-    /** read is filtered out if the javascript program returns false */
-    @Override
-    public boolean filterOut(final SAMRecord record) {
-        return !accept(record);
-    }
-
-    @Override
-    public String getRecordKey() {
-        return "record";
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/MappingQualityFilter.java b/src/main/java/htsjdk/samtools/filter/MappingQualityFilter.java
deleted file mode 100644
index d25df73..0000000
--- a/src/main/java/htsjdk/samtools/filter/MappingQualityFilter.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter things with low mapping quality.
- */
-public class MappingQualityFilter implements SamRecordFilter {
-
-    private int minimumMappingQuality = Integer.MIN_VALUE;
-
-    public MappingQualityFilter(final int minimumMappingQuality) {
-        this.minimumMappingQuality = minimumMappingQuality;
-    }
-
-    @Override
-    public boolean filterOut(final SAMRecord record) {
-        return record.getMappingQuality() < this.minimumMappingQuality;
-    }
-
-    @Override
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        return filterOut(first) || filterOut(second);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/NotPrimaryAlignmentFilter.java b/src/main/java/htsjdk/samtools/filter/NotPrimaryAlignmentFilter.java
deleted file mode 100644
index 0f2364c..0000000
--- a/src/main/java/htsjdk/samtools/filter/NotPrimaryAlignmentFilter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter out SAMRecords with NotPrimaryAlignment flag set
- *
- * $Id$
- */
-public class NotPrimaryAlignmentFilter implements SamRecordFilter {
-    /**
-     * @param record the SAMRecord to evaluate
-     * @return true if the SAMRecord matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord record) {
-        return record.getNotPrimaryAlignmentFlag();
-    }
-
-    /**
-     * Determines whether a pair of SAMRecord matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the SAMRecords matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        // if either fails, exclude them both
-        return (first.getNotPrimaryAlignmentFlag() || second.getNotPrimaryAlignmentFlag());
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/OverclippedReadFilter.java b/src/main/java/htsjdk/samtools/filter/OverclippedReadFilter.java
deleted file mode 100644
index 2e8f43f..0000000
--- a/src/main/java/htsjdk/samtools/filter/OverclippedReadFilter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filters out reads with very few unclipped bases, likely due to the read coming
- * from a foreign organism, e.g. bacterial contamination.
- *
- * Based on GATK's OverclippedReadFilter.
- */
-public class OverclippedReadFilter implements SamRecordFilter {
-    // if the number of unclipped bases is below this threshold, the read is considered overclipped
-    private final int unclippedBasesThreshold;
-    // if set to true, then reads with at least one clipped end will be filtered; if false, we require both ends to be clipped
-    private final boolean filterSingleEndClips;
-
-    public OverclippedReadFilter(final int unclippedBasesThreshold, final boolean filterSingleEndClips) {
-        if (unclippedBasesThreshold < 0) throw new SAMException("unclippedBasesThreshold must be non-negative");
-        this.unclippedBasesThreshold = unclippedBasesThreshold;
-        this.filterSingleEndClips = filterSingleEndClips;
-    }
-
-    @Override
-    public boolean filterOut(final SAMRecord record) {
-        int alignedLength = 0;
-        int softClipBlocks = 0;
-        int minSoftClipBlocks = filterSingleEndClips ? 1 : 2;
-        CigarOperator lastOperator = null;
-
-        for ( final CigarElement element : record.getCigar().getCigarElements() ) {
-            if ( element.getOperator() == CigarOperator.S ) {
-                //Treat consecutive S blocks as a single one
-                if(lastOperator != CigarOperator.S){
-                    softClipBlocks += 1;
-                }
-
-            } else if ( element.getOperator().consumesReadBases() ) {   // M, I, X, and EQ (S was already accounted for above)
-                alignedLength += element.getLength();
-            }
-            lastOperator = element.getOperator();
-        }
-
-        return(alignedLength < unclippedBasesThreshold && softClipBlocks >= minSoftClipBlocks);
-    }
-
-    @Override
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        return filterOut(first) || filterOut(second);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/ReadNameFilter.java b/src/main/java/htsjdk/samtools/filter/ReadNameFilter.java
deleted file mode 100644
index e4b2a20..0000000
--- a/src/main/java/htsjdk/samtools/filter/ReadNameFilter.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Filter by a set of specified readnames
- * <p/>
- * $Id$
- */
-public class ReadNameFilter implements SamRecordFilter {
-
-    private boolean includeReads = false;
-    private Set<String> readNameFilterSet = new HashSet<String>();
-
-    public ReadNameFilter(final File readNameFilterFile, final boolean includeReads) {
-
-        IOUtil.assertFileIsReadable(readNameFilterFile);
-        IOUtil.assertFileSizeNonZero(readNameFilterFile);
-
-        try {
-            final BufferedReader in = IOUtil.openFileForBufferedReading(readNameFilterFile);
-
-            String line = null;
-
-            while ((line = in.readLine()) != null) {
-                if (!line.trim().isEmpty()) {
-                    readNameFilterSet.add(line.split("\\s+")[0]);
-                }
-            }
-
-            in.close();
-        } catch (IOException e) {
-            throw new SAMException(e.getMessage(), e);
-        }
-
-        this.includeReads = includeReads;
-    }
-
-    public ReadNameFilter(final Set<String> readNameFilterSet, final boolean includeReads) {
-        this.readNameFilterSet = readNameFilterSet;
-        this.includeReads = includeReads;
-    }
-
-    /**
-     * Determines whether a SAMRecord matches this filter
-     *
-     * @param record the SAMRecord to evaluate
-     *
-     * @return true if the SAMRecord matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord record) {
-        if (includeReads) {
-            if (readNameFilterSet.contains(record.getReadName())) {
-                return false;
-            }
-        } else {
-            if (!readNameFilterSet.contains(record.getReadName())) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Determines whether a pair of SAMRecords matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the pair of records matches filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        if (includeReads) {
-            if (readNameFilterSet.contains(first.getReadName()) &&
-                readNameFilterSet.contains(second.getReadName())) {
-                return false;
-            }
-        } else {
-            if (!readNameFilterSet.contains(first.getReadName()) &&
-                !readNameFilterSet.contains(second.getReadName())) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/filter/SamRecordFilter.java b/src/main/java/htsjdk/samtools/filter/SamRecordFilter.java
deleted file mode 100644
index 5ca280e..0000000
--- a/src/main/java/htsjdk/samtools/filter/SamRecordFilter.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * API for filtering SAMRecords
- *
- * $Id$
- */
-public interface SamRecordFilter {
-
-    /**
-     * Determines whether a SAMRecord matches this filter
-     *
-     * @param record the SAMRecord to evaluate
-     *
-     * @return true if the SAMRecord matches the filter, otherwise false
-     */
-    public boolean filterOut(SAMRecord record);
-
-    /**
-     * Determines whether a pair of SAMRecords matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the pair of records matches filter, otherwise false
-     */
-    public boolean filterOut(SAMRecord first, SAMRecord second);
-}
diff --git a/src/main/java/htsjdk/samtools/filter/SecondaryAlignmentFilter.java b/src/main/java/htsjdk/samtools/filter/SecondaryAlignmentFilter.java
deleted file mode 100644
index d91212d..0000000
--- a/src/main/java/htsjdk/samtools/filter/SecondaryAlignmentFilter.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * SamRecordFilter that filters out secondary alignments, but not supplemental alignments.
- */
-public class SecondaryAlignmentFilter implements SamRecordFilter {
-    /**
-     * Returns true if the read is marked as secondary.
-     */
-    public boolean filterOut(final SAMRecord record) { return record.getNotPrimaryAlignmentFlag(); }
-
-    /**
-     * Returns true if either read is marked as secondary.
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        return first.getNotPrimaryAlignmentFlag() || second.getNotPrimaryAlignmentFlag();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/SecondaryOrSupplementaryFilter.java b/src/main/java/htsjdk/samtools/filter/SecondaryOrSupplementaryFilter.java
deleted file mode 100644
index ae57fd9..0000000
--- a/src/main/java/htsjdk/samtools/filter/SecondaryOrSupplementaryFilter.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter out SAMRecords with NotPrimaryAlignment or Supplementary flag set
- * This class should be viewed as a replacement for NotPrimarySkippingIterator,
- * in that we did not want to change the functionality of NPSI to no longer match its name
- * $Id$
- */
-public class SecondaryOrSupplementaryFilter  implements SamRecordFilter {
-    /**
-     * @param record the SAMRecord to evaluate
-     * @return true if the SAMRecord matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord record) {
-        return record.isSecondaryOrSupplementary();
-    }
-
-    /**
-     * Determines whether a pair of SAMRecord matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the SAMRecords matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        // if either fails, exclude them both
-        return first.isSecondaryOrSupplementary() || second.isSecondaryOrSupplementary();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/SolexaNoiseFilter.java b/src/main/java/htsjdk/samtools/filter/SolexaNoiseFilter.java
deleted file mode 100644
index bfb31d6..0000000
--- a/src/main/java/htsjdk/samtools/filter/SolexaNoiseFilter.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.util.SequenceUtil;
-
-/**
- * Filter to determine whether a read is "noisy" due to a poly-A run that is a sequencing artifact.
- * Currently we filter out only reads that are composed entirely of As.
- *
- * $Id$
- */
-public class SolexaNoiseFilter implements SamRecordFilter {
-
-    /**
-     * Determines whether a SAMRecord matches this filter
-     *
-     * @param record    the SAMRecord to evaluate
-     * @return  true if the SAMRecord matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord record) {
-        final byte[] sequence = record.getReadBases();
-        for (final byte base : sequence) {
-            if (base != 'A' && base != 'a' &&
-                !SequenceUtil.isNoCall(base)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Determines whether a pair of SAMRecord matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the SAMRecords matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        // only filter out the pair if both first and second reads have all As
-        return (filterOut(first) && filterOut(second));
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/TagFilter.java b/src/main/java/htsjdk/samtools/filter/TagFilter.java
deleted file mode 100644
index 5182e83..0000000
--- a/src/main/java/htsjdk/samtools/filter/TagFilter.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Filter class for matching tag attributes in SAMRecords
- *
- * $Id$
- */
-public class TagFilter implements SamRecordFilter {
-
-    private final String tag;           // The key of the tag to match
-    private final List<Object> values;  // The list of matching values
-
-    /**
-     * Constructor for a single value
-     *
-     * @param tag       the key of the tag to match
-     * @param value     the value to match
-     */
-    public TagFilter(String tag, Object value) {
-        this.tag = tag;
-        this.values = Arrays.asList(value);
-    }
-
-    /**
-     * Constructor for multiple values
-     *
-     * @param tag       the key of the tag to match
-     * @param values    the matching values
-     */
-    public TagFilter(String tag, List<Object> values) {
-        this.tag = tag;
-        this.values = values;
-    }
-
-    /**
-     * Determines whether a SAMRecord matches this filter
-     *
-     * @param record    the SAMRecord to evaluate
-     * @return  true if the SAMRecord matches the filter, otherwise false
-     */
-    public boolean filterOut(SAMRecord record) {
-        return values.contains(record.getAttribute(tag));
-    }
-
-    /**
-     * Determines whether a paired of SAMRecord matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the SAMRecords matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        // both first and second must have the tag in order for it to be filtered out
-         return values.contains(first.getAttribute(tag)) && values.contains(second.getAttribute(tag));
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/WholeReadClippedFilter.java b/src/main/java/htsjdk/samtools/filter/WholeReadClippedFilter.java
deleted file mode 100644
index 2a1566c..0000000
--- a/src/main/java/htsjdk/samtools/filter/WholeReadClippedFilter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.ReservedTagConstants;
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter SAMRecords so that only those that have at least one un-clipped base are
- * returned.
- *
- * $Id$
- *
- * @author ktibbett at broadinstitute.org
- */
-public class WholeReadClippedFilter implements SamRecordFilter {
-
-    /**
-     * Determines whether a SAMRecord matches this filter
-     *
-     * @param record the SAMRecord to evaluate
-     * @return true if the SAMRecord matches the filter, and should be filtered out,
-     *         otherwise false
-     */
-    @Override
-    public boolean filterOut(final SAMRecord record) {
-        return record.getAttribute(ReservedTagConstants.XT) != null
-                && (Integer)record.getAttribute(ReservedTagConstants.XT) == 1;
-    }
-
-     /**
-     * Determines whether a paired of SAMRecord matches this filter
-     *
-     * @param first  the first SAMRecord to evaluate
-     * @param second the second SAMRecord to evaluate
-     *
-     * @return true if the SAMRecords matches the filter, otherwise false
-     */
-    public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-        // if either fails, exclude them both
-        return (filterOut(first) || filterOut(second));
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/liftover/Chain.java b/src/main/java/htsjdk/samtools/liftover/Chain.java
deleted file mode 100644
index 8ac87fb..0000000
--- a/src/main/java/htsjdk/samtools/liftover/Chain.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.liftover;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.BufferedLineReader;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.OverlapDetector;
-
-import java.io.File;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.regex.Pattern;
-
-/**
- * Holds a single chain from a UCSC chain file.  Chain file format is described here: http://genome.ucsc.edu/goldenPath/help/chain.html
- *
- * In a chain file, a chain consists of a header line followed by alignment data lines.  Chain class embodies the header
- * line, and the list of ContinuousBlocks embodies the alignment data lines.
- *
- * A continuous block represents a continuous range of the "from" genome that maps to a continuous range of the "to"
- * genome of the same length.  A chain is an ordered list of continuous blocks, with gaps between the continuous blocks.
- * All the continuous blocks in a chain must map from a single "from" sequence to a single "to" sequence.  All the
- * continuous blocks in a chain map from the positive strand in the "from" genome build to the same strand in the
- * "to" genome build.  The gaps in between the continuous blocks in a chain represent un-lift-overable regions.
- * A gap in a chain may be found in another chain (e.g. if a portion of a sequence is reversed in the "to" genome).
- *
- * In UCSC liftOver terminology, the "target" is the "from" genome build, and the "query" is the "to" genome build.
- * E.g. when mapping from HG18 to HG19, the HG18 coordinates are "target" and HG19 is "query."  The USCS terminology
- * is not used here because it confuses me.
- *
- * Chain coordinates are zero-based, half open.  However, there is also an Interval attribute of Chain that is in
- * standard Picard coordinates, i.e. one-based inclusive.
- *
- * @author alecw at broadinstitute.org
- */
-class Chain {
-    // For parsing chain file
-    private static final Pattern SPLITTER = Pattern.compile("\\s");
-
-    /** Score is not used in basic liftover implementation, but is stored so that chain can be written to disk. */
-    final double score;
-    /** one-based, inclusive, so that Chain can be stored in an OverlapDetector */
-    final Interval interval;
-    /** Total score for chain is not used in basic liftover so not stored. */
-    // final double score;
-    final String fromSequenceName;
-    /** Overall size of the "from" sequence. */
-    final int fromSequenceSize;
-    /* tStrand always +, so not stored */
-    /** Start of range covered in "from" sequence. */
-    final int fromChainStart;
-    /** End of range covered in "from" sequence. */
-    final int fromChainEnd;
-    final String toSequenceName;
-    /** Overall size of the "to" sequence. */
-    final int toSequenceSize;
-    /** "to" strand. If this is true, then the region covered by this chain is flipped in the "to" genome.  */
-    final boolean toOppositeStrand;
-    /** Start of range covered in "to" sequence. */
-    final int toChainStart;
-    /** End of range covered in "to" sequence. */
-    final int toChainEnd;
-    /** ID of chain in file.  */
-    final int id;
-    private final List<ContinuousBlock> blockList = new ArrayList<ContinuousBlock>();
-
-    /**
-     * Construct a Chain from the parsed header fields.
-     */
-    private Chain(final double score, final String fromSequenceName, final int fromSequenceSize, final int fromChainStart, final int fromChainEnd,
-          final String toSequenceName, final int toSequenceSize, final boolean toOppositeStrand,
-          final int toChainStart, final int toChainEnd, final int id) {
-        // Convert  to one-based, inclusive for Interval.
-        interval = new Interval(fromSequenceName, fromChainStart + 1, fromChainEnd);
-        this.score = score;
-        this.toChainEnd = toChainEnd;
-        this.toSequenceName = toSequenceName;
-        this.toOppositeStrand = toOppositeStrand;
-        this.toSequenceSize = toSequenceSize;
-        this.toChainStart = toChainStart;
-        // not used
-        //this.score = score;
-        this.fromChainEnd = fromChainEnd;
-        this.fromSequenceName = fromSequenceName;
-        this.fromSequenceSize = fromSequenceSize;
-        this.fromChainStart = fromChainStart;
-        this.id = id;
-    }
-
-
-    /**
-     * Holds a range that continuously lines up between target and query genome builds.
-     * Indices are 0-based, half-open.
-     */
-    static class ContinuousBlock {
-        final int fromStart;	  /* Start of range covered in "from". */
-        final int toStart;		  /* Range covered in "to". */
-        final int blockLength;    /* length of continuous block of that maps btw from and to */
-        //int score;	 	 	  /* Score of block. */
-
-        private ContinuousBlock(final int fromStart, final int toStart, final int blockLength) {
-            this.fromStart = fromStart;
-            this.toStart = toStart;
-            this.blockLength = blockLength;
-        }
-
-        /**
-         * @return 0-based, half-open end of region in "from"
-         */
-        int getFromEnd() {
-            return fromStart + blockLength;
-        }
-
-        /**
-         * @return 0-based, half-open end of region in "to"
-         */
-        int getToEnd() {
-            return toStart + blockLength;
-        }
-
-        @Override
-        public boolean equals(final Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-
-            final ContinuousBlock that = (ContinuousBlock) o;
-
-            if (blockLength != that.blockLength) return false;
-            if (fromStart != that.fromStart) return false;
-            if (toStart != that.toStart) return false;
-
-            return true;
-        }
-
-        @Override
-        public int hashCode() {
-            int result = fromStart;
-            result = 31 * result + toStart;
-            result = 31 * result + blockLength;
-            return result;
-        }
-    }
-
-    private void addBlock(final int tStart, final int qStart, final int blockLength) {
-        blockList.add(new ContinuousBlock(tStart, qStart, blockLength));
-    }
-
-    /**
-     * @return The ith ContinuousBlock in this Chain.
-     */
-    ContinuousBlock getBlock(final int i) {
-        return blockList.get(i);
-    }
-
-    /**
-     * @return Unmodifiable list of ContinuousBlocks in this Chain.
-     */
-    List<ContinuousBlock> getBlocks() {
-        return Collections.unmodifiableList(blockList);
-    }
-
-    void write(final PrintWriter writer) {
-        writer.printf("chain\t%f\t%s\t%d\t+\t%d\t%d\t%s\t%d\t%s\t%d\t%d\t%d\n",
-                score, fromSequenceName, fromSequenceSize, fromChainStart, fromChainEnd,
-                toSequenceName, toSequenceSize, (toOppositeStrand ? "-": "+"), toChainStart, toChainEnd, id);
-        for (int i = 0; i < blockList.size() - 1; ++i) {
-            final ContinuousBlock thisBlock = blockList.get(i);
-            final ContinuousBlock nextBlock = blockList.get(i+1);
-
-            final int fromGap = nextBlock.fromStart - thisBlock.getFromEnd();
-            final int toGap = nextBlock.toStart - thisBlock.getToEnd();
-            writer.printf("%d\t%d\t%d\n", thisBlock.blockLength, fromGap, toGap);
-        }
-        writer.printf("%d\n", blockList.get(blockList.size() - 1).blockLength);
-        writer.println();
-    }
-
-    /**
-     * Throw an exception if Chain looks strange.
-     */
-    void validate() {
-        validatePositive("fromSequenceSize", fromSequenceSize);
-        validateNonNegative("fromChainStart", fromChainStart);
-        validateNonNegative("fromChainEnd", fromChainEnd);
-        validatePositive("toSequenceSize", toSequenceSize);
-        validateNonNegative("toChainStart", toChainStart);
-        validateNonNegative("toChainEnd", toChainEnd);
-        int fromLength = fromChainEnd - fromChainStart;
-        validatePositive("from length", fromLength);
-        int toLength = toChainEnd - toChainStart;
-        validatePositive("to length", toLength);
-        if (fromLength > fromSequenceSize) throw new SAMException("From chain length (" + fromLength +
-                ") < from sequence length (" + fromSequenceSize + ") for chain " + id);
-        if (toLength > toSequenceSize) throw new SAMException("To chain length (" + toLength +
-                ") < to sequence length (" + toSequenceSize + ") for chain " + id);
-        if (fromSequenceName.isEmpty()) throw new SAMException("Chain " + id + "has empty from sequence name.");
-        if (toSequenceName.isEmpty()) throw new SAMException("Chain " + id + "has empty to sequence name.");
-        if (blockList.isEmpty()) throw new SAMException("Chain " + id + " has empty block list.");
-        final ContinuousBlock firstBlock = blockList.get(0);
-        if (firstBlock.fromStart != fromChainStart) {
-            throw new SAMException("First block from start != chain from start for chain " + id);
-        }
-        if (firstBlock.toStart != toChainStart) {
-            throw new SAMException("First block to start != chain to start for chain " + id);
-        }
-        final ContinuousBlock lastBlock = blockList.get(blockList.size() - 1);
-        if (lastBlock.getFromEnd() != fromChainEnd) {
-            throw new SAMException("Last block from end != chain from end for chain " + id);
-        }
-        if (lastBlock.getToEnd() != toChainEnd) {
-            throw new SAMException("Last block to end < chain to end for chain " + id);
-        }
-        for (int i = 1; i < blockList.size(); ++i) {
-            final ContinuousBlock thisBlock = blockList.get(i);
-            final ContinuousBlock prevBlock = blockList.get(i-1);
-            if (thisBlock.fromStart < prevBlock.getFromEnd()) {
-                throw new SAMException("Continuous block " + i + " from starts before previous block ends for chain " + id);
-            }
-            if (thisBlock.toStart < prevBlock.getToEnd()) {
-                throw new SAMException("Continuous block " + i + " to starts before previous block ends for chain " + id);
-            }
-        }
-    }
-
-    private void validatePositive(final String attributeName, final int attribute) {
-        if (attribute <= 0) {
-            throw new SAMException(attributeName + " is not positive: " + attribute + " for chain " + id);
-        }
-    }
-
-    private void validateNonNegative(final String attributeName, final int attribute) {
-        if (attribute < 0) {
-            throw new SAMException(attributeName + " is negative: " + attribute + " for chain " + id);
-        }
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final Chain chain = (Chain) o;
-
-        if (fromChainEnd != chain.fromChainEnd) return false;
-        if (fromChainStart != chain.fromChainStart) return false;
-        if (fromSequenceSize != chain.fromSequenceSize) return false;
-        if (id != chain.id) return false;
-        if (Double.compare(chain.score, score) != 0) return false;
-        if (toChainEnd != chain.toChainEnd) return false;
-        if (toChainStart != chain.toChainStart) return false;
-        if (toOppositeStrand != chain.toOppositeStrand) return false;
-        if (toSequenceSize != chain.toSequenceSize) return false;
-        if (blockList != null ? !blockList.equals(chain.blockList) : chain.blockList != null) return false;
-        if (fromSequenceName != null ? !fromSequenceName.equals(chain.fromSequenceName) : chain.fromSequenceName != null)
-            return false;
-        if (interval != null ? !interval.equals(chain.interval) : chain.interval != null) return false;
-        if (toSequenceName != null ? !toSequenceName.equals(chain.toSequenceName) : chain.toSequenceName != null)
-            return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result;
-        long temp;
-        temp = score != +0.0d ? Double.doubleToLongBits(score) : 0L;
-        result = (int) (temp ^ (temp >>> 32));
-        result = 31 * result + (interval != null ? interval.hashCode() : 0);
-        result = 31 * result + (fromSequenceName != null ? fromSequenceName.hashCode() : 0);
-        result = 31 * result + fromSequenceSize;
-        result = 31 * result + fromChainStart;
-        result = 31 * result + fromChainEnd;
-        result = 31 * result + (toSequenceName != null ? toSequenceName.hashCode() : 0);
-        result = 31 * result + toSequenceSize;
-        result = 31 * result + (toOppositeStrand ? 1 : 0);
-        result = 31 * result + toChainStart;
-        result = 31 * result + toChainEnd;
-        result = 31 * result + id;
-        result = 31 * result + (blockList != null ? blockList.hashCode() : 0);
-        return result;
-    }
-
-    /**
-     * Read all the chains and load into an OverlapDetector.
-     * @param chainFile File in UCSC chain format.
-     * @return OverlapDetector will all Chains from reader loaded into it.
-     */
-    static OverlapDetector<Chain> loadChains(final File chainFile) {
-        final BufferedLineReader reader = new BufferedLineReader(IOUtil.openFileForReading(chainFile));
-        final OverlapDetector<Chain> ret = new OverlapDetector<Chain>(0, 0);
-        Chain chain;
-        while ((chain = Chain.loadChain(reader, chainFile.toString())) != null) {
-            ret.addLhs(chain, chain.interval);
-        }
-        reader.close();
-        return ret;
-    }
-
-    /**
-     * Read a single Chain from reader.
-     * @param reader Text representation of chains.
-     * @param chainFile For error messages only.
-     * @return New Chain with associated ContinuousBlocks.
-     */
-    private static Chain loadChain(final BufferedLineReader reader, final String chainFile) {
-        String line;
-        while (true) {
-            line = reader.readLine();
-            if (line == null) {
-                return null;
-            }
-            // Skip comment lines
-            if (!line.startsWith("#")) {
-                break;
-            }
-        }
-        final String[] chainFields = SPLITTER.split(line);
-        if (chainFields.length != 13) {
-            throwChainFileParseException("chain line has wrong number of fields", chainFile, reader.getLineNumber());
-        }
-        if (!"chain".equals(chainFields[0])) {
-            throwChainFileParseException("chain line does not start with 'chain'", chainFile, reader.getLineNumber());
-        }
-        double score = 0;
-        String fromSequenceName = null;
-        int fromSequenceSize = 0;
-        int fromChainStart = 0;
-        int fromChainEnd = 0;
-        String toSequenceName = null;
-        int toSequenceSize = 0;
-        boolean toNegativeStrand = false;
-        int toChainStart = 0;
-        int toChainEnd = 0;
-        int id = 0;
-        try {
-            score = Double.parseDouble(chainFields[1]);
-            fromSequenceName = chainFields[2];
-            fromSequenceSize = Integer.parseInt(chainFields[3]);
-            // Strand ignored because it is always +
-            fromChainStart = Integer.parseInt(chainFields[5]);
-            fromChainEnd = Integer.parseInt(chainFields[6]);
-            toSequenceName = chainFields[7];
-            toSequenceSize = Integer.parseInt(chainFields[8]);
-            toNegativeStrand = chainFields[9].equals("-");
-            toChainStart = Integer.parseInt(chainFields[10]);
-            toChainEnd = Integer.parseInt(chainFields[11]);
-            id = Integer.parseInt(chainFields[12]);
-        } catch (NumberFormatException e) {
-            throwChainFileParseException("Invalid field", chainFile, reader.getLineNumber());
-        }
-        final Chain chain = new Chain(score, fromSequenceName, fromSequenceSize, fromChainStart, fromChainEnd, toSequenceName, toSequenceSize, toNegativeStrand, toChainStart,
-                toChainEnd, id);
-        int toBlockStart = chain.toChainStart;
-        int fromBlockStart = chain.fromChainStart;
-        boolean sawLastLine = false;
-        while (true) {
-            line = reader.readLine();
-            if (line == null || line.equals("")) {
-                if (!sawLastLine) {
-                    throwChainFileParseException("Reached end of chain without seeing terminal block", chainFile, reader.getLineNumber());
-                }
-                break;
-            }
-            if (sawLastLine) {
-                throwChainFileParseException("Terminal block seen before end of chain", chainFile, reader.getLineNumber());
-            }
-            String[] blockFields = SPLITTER.split(line);
-            if (blockFields.length == 1) {
-                sawLastLine = true;
-            } else if (blockFields.length != 3) {
-                throwChainFileParseException("Block line has unexpected number of fields", chainFile, reader.getLineNumber());
-            }
-            int size = Integer.parseInt(blockFields[0]);
-            chain.addBlock(fromBlockStart, toBlockStart, size);
-            if (!sawLastLine) {
-                fromBlockStart += Integer.parseInt(blockFields[1]) + size;
-                toBlockStart += Integer.parseInt(blockFields[2]) + size;
-            }
-
-        }
-        chain.validate();
-        return chain;
-    }
-
-    private static void throwChainFileParseException(final String message, final String chainFile, final int lineNumber) {
-        throw new SAMException(message + " in chain file " + chainFile + " at line " + lineNumber);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/liftover/LiftOver.java b/src/main/java/htsjdk/samtools/liftover/LiftOver.java
deleted file mode 100644
index e422a72..0000000
--- a/src/main/java/htsjdk/samtools/liftover/LiftOver.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.liftover;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.OverlapDetector;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Java port of UCSC liftOver.  Only the most basic liftOver functionality is implemented.
- * Internally coordinates are 0-based, half-open. The API is standard Picard 1-based, inclusive.
- *
- * @author alecw at broadinstitute.org
- */
-public class LiftOver {
-    private static final Log LOG = Log.getInstance(LiftOver.class);
-    
-    public static final double DEFAULT_LIFTOVER_MINMATCH = 0.95;
-
-    private double liftOverMinMatch = DEFAULT_LIFTOVER_MINMATCH;
-    private final OverlapDetector<Chain> chains;
-    private final Map<String, Set<String>> contigMap = new HashMap<>();
-
-    /**
-     * Load UCSC chain file in order to lift over Intervals.
-     */
-    public LiftOver(File chainFile) {
-        IOUtil.assertFileIsReadable(chainFile);
-        chains = Chain.loadChains(chainFile);
-
-        for (final Chain chain : this.chains.getAll()) {
-            final String from = chain.fromSequenceName;
-            final String to   = chain.toSequenceName;
-            final Set<String> names;
-            if (contigMap.containsKey(from)) {
-                names = contigMap.get(from);
-            }
-            else {
-                names = new HashSet<>();
-                contigMap.put(from, names);
-            }
-            names.add(to);
-        }
-    }
-
-    /**
-     * Throw an exception if all the "to" sequence names in the chains are not found in the given sequence dictionary.
-     */
-    public void validateToSequences(final SAMSequenceDictionary sequenceDictionary) {
-        for (final Chain chain : chains.getAll()) {
-            if (sequenceDictionary.getSequence(chain.toSequenceName) == null) {
-                throw new SAMException("Sequence " + chain.toSequenceName + " from chain file is not found in sequence dictionary.");
-            }
-        }
-
-    }
-
-    /**
-     * Lift over the given interval to the new genome build using the liftOverMinMatch set for this
-     * LiftOver object.
-     * @param interval Interval to be lifted over.
-     * @return Interval in the output build coordinates, or null if it cannot be lifted over.
-     */
-    public Interval liftOver(final Interval interval) {
-        return liftOver(interval, liftOverMinMatch);
-    }
-
-    /**
-     * Lift over the given interval to the new genome build.
-     * @param interval Interval to be lifted over.
-     * @param liftOverMinMatch Minimum fraction of bases that must remap.
-     * @return Interval in the output build coordinates, or null if it cannot be lifted over.
-     */
-    public Interval liftOver(final Interval interval, final double liftOverMinMatch) {
-        if (interval.length() == 0) {
-            throw new IllegalArgumentException("Zero-length interval cannot be lifted over.  Interval: " +
-                    interval.getName());
-        }
-        Chain chainHit = null;
-        TargetIntersection targetIntersection = null;
-        // Number of bases in interval that can be lifted over must be >= this.
-        double minMatchSize = liftOverMinMatch * interval.length();
-
-        // Find the appropriate Chain, and the part of the chain corresponding to the interval to be lifted over.
-        for (final Chain chain : chains.getOverlaps(interval)) {
-            final TargetIntersection candidateIntersection = targetIntersection(chain, interval);
-            if (candidateIntersection != null && candidateIntersection.intersectionLength >= minMatchSize) {
-                if (chainHit != null) {
-                    // In basic liftOver, multiple hits are not allowed.
-                    return null;
-                }
-                chainHit = chain;
-                targetIntersection = candidateIntersection;
-            } else if (candidateIntersection != null) {
-                LOG.info("Interval " + interval.getName() + " failed to match chain " + chain.id +
-                " because intersection length " + candidateIntersection.intersectionLength + " < minMatchSize "
-                + minMatchSize +
-                " (" + (candidateIntersection.intersectionLength/(float)interval.length()) + " < " + liftOverMinMatch + ")");
-            }
-        }
-        if (chainHit == null) {
-            // Can't be lifted over.
-            return null;
-        }
-
-        return createToInterval(interval.getName(), interval.isNegativeStrand(), targetIntersection);
-    }
-
-    public List<PartialLiftover> diagnosticLiftover(final Interval interval) {
-        final List<PartialLiftover> ret = new ArrayList<PartialLiftover>();
-        if (interval.length() == 0) {
-            throw new IllegalArgumentException("Zero-length interval cannot be lifted over.  Interval: " +
-                    interval.getName());
-        }
-        for (final Chain chain : chains.getOverlaps(interval)) {
-            Interval intersectingChain = interval.intersect(chain.interval);
-            final TargetIntersection targetIntersection = targetIntersection(chain, intersectingChain);
-            if (targetIntersection == null) {
-                ret.add(new PartialLiftover(intersectingChain, chain.id));
-            } else {
-                Interval toInterval = createToInterval(interval.getName(), interval.isNegativeStrand(), targetIntersection);
-                float percentLiftedOver = targetIntersection.intersectionLength/(float)interval.length();
-                ret.add(new PartialLiftover(intersectingChain, toInterval, targetIntersection.chain.id, percentLiftedOver));
-            }
-        }
-        return ret;
-    }
-
-    /**
-     * @return the set of destination contigs for each source contig in the chains file.
-     */
-    public Map<String, Set<String>> getContigMap() {
-        return Collections.unmodifiableMap(contigMap);
-    }
-
-    private static Interval createToInterval(final String intervalName, final boolean sourceNegativeStrand, final TargetIntersection targetIntersection) {
-        // Compute the query interval given the offsets of the target interval start and end into the first and
-        // last ContinuousBlocks.
-        int toStart = targetIntersection.chain.getBlock(targetIntersection.firstBlockIndex).toStart + targetIntersection.startOffset;
-        int toEnd = targetIntersection.chain.getBlock(targetIntersection.lastBlockIndex).getToEnd() - targetIntersection.offsetFromEnd;
-        if (toEnd <= toStart || toStart < 0) {
-            throw new SAMException("Something strange lifting over interval " + intervalName);
-        }
-
-        if (targetIntersection.chain.toOppositeStrand) {
-            // Flip if query is negative.
-            int negativeStart = targetIntersection.chain.toSequenceSize - toEnd;
-            int negativeEnd = targetIntersection.chain.toSequenceSize - toStart;
-            toStart = negativeStart;
-            toEnd = negativeEnd;
-        }
-        // Convert to 1-based, inclusive.
-        final boolean negativeStrand = targetIntersection.chain.toOppositeStrand ? !sourceNegativeStrand : sourceNegativeStrand;
-        return new Interval(targetIntersection.chain.toSequenceName, toStart+1, toEnd, negativeStrand, intervalName);
-    }
-
-    /**
-     * Add up overlap btw the blocks in this chain and the given interval.
-     * @return Length of overlap, offsets into first and last ContinuousBlocks, and indices of first and
-     * last ContinuousBlocks.
-     */
-    private static TargetIntersection targetIntersection(final Chain chain, final Interval interval) {
-        int intersectionLength = 0;
-        // Convert interval to 0-based, half-open
-        int start = interval.getStart() - 1;
-        int end = interval.getEnd();
-        int firstBlockIndex = -1;
-        int lastBlockIndex = -1;
-        int startOffset = -1;
-        int offsetFromEnd = -1;
-        List<Chain.ContinuousBlock> blockList = chain.getBlocks();
-        for (int i = 0; i < blockList.size(); ++i) {
-            final Chain.ContinuousBlock block = blockList.get(i);
-            if (block.fromStart >= end) {
-                break;
-            } else if (block.getFromEnd() <= start) {
-                continue;
-            }
-            if (firstBlockIndex == -1) {
-                firstBlockIndex = i;
-                if (start > block.fromStart) {
-                    startOffset = start - block.fromStart;
-                } else {
-                    startOffset = 0;
-                }
-            }
-            lastBlockIndex = i;
-            if (block.getFromEnd() > end) {
-                offsetFromEnd = block.getFromEnd() - end;
-            } else {
-                offsetFromEnd = 0;
-            }
-            int thisIntersection = Math.min(end, block.getFromEnd()) - Math.max(start, block.fromStart);
-            if (thisIntersection <= 0) {
-                throw new SAMException("Should have been some intersection.");
-            }
-            intersectionLength += thisIntersection;
-        }
-        if (intersectionLength == 0) {
-            return null;
-        }
-        return new TargetIntersection(chain, intersectionLength, startOffset, offsetFromEnd, firstBlockIndex, lastBlockIndex);
-    }
-
-    /**
-     * Get minimum fraction of bases that must remap.
-     */
-    public double getLiftOverMinMatch() {
-        return liftOverMinMatch;
-    }
-
-    /**
-     * Set minimum fraction of bases that must remap.
-     */
-    public void setLiftOverMinMatch(final double liftOverMinMatch) {
-        this.liftOverMinMatch = liftOverMinMatch;
-    }
-
-    /**
-    * Value class returned by targetIntersection()
-    */
-    private static class TargetIntersection {
-        /** Chain used for this intersection */
-        final Chain chain;
-        /** Total intersectionLength length */
-        final int intersectionLength;
-        /** Offset of target interval start in first block. */
-        final int startOffset;
-        /** Distance from target interval end to end of last block. */
-        final int offsetFromEnd;
-        /** Index of first ContinuousBlock matching interval. */
-        final int firstBlockIndex;
-        /** Index of last ContinuousBlock matching interval. */
-        final int lastBlockIndex;
-
-        TargetIntersection(final Chain chain,final int intersectionLength, final int startOffset,
-                           final int offsetFromEnd, final int firstBlockIndex, final int lastBlockIndex) {
-            this.chain = chain;
-            this.intersectionLength = intersectionLength;
-            this.startOffset = startOffset;
-            this.offsetFromEnd = offsetFromEnd;
-            this.firstBlockIndex = firstBlockIndex;
-            this.lastBlockIndex = lastBlockIndex;
-        }
-    }
-
-    /**
-     * Represents a portion of a liftover operation, for use in diagnosing liftover failures.
-     */
-    public static class PartialLiftover {
-        /** Intersection between "from" interval and "from" region of a chain. */
-        final Interval fromInterval;
-        /**
-         * Result of lifting over fromInterval (with no percentage mapped requirement).  This is null
-         * if fromInterval falls entirely with a gap of the chain. */
-        final Interval toInterval;
-        /** id of chain used for this liftover */
-        final int chainId;
-        /** Percentage of bases in fromInterval that lifted over.  0 if fromInterval is not covered by any chain. */
-        final float percentLiftedOver;
-
-        PartialLiftover(final Interval fromInterval, final Interval toInterval, final int chainId, final float percentLiftedOver) {
-            this.fromInterval = fromInterval;
-            this.toInterval = toInterval;
-            this.chainId = chainId;
-            this.percentLiftedOver = percentLiftedOver;
-        }
-
-        PartialLiftover(final Interval fromInterval, final int chainId) {
-            this.fromInterval = fromInterval;
-            this.toInterval = null;
-            this.chainId = chainId;
-            this.percentLiftedOver = 0.0f;
-        }
-
-        public String toString() {
-            if (toInterval == null) {
-                // Matched a chain, but entirely within a gap.
-                return fromInterval.toString() + " (len " + fromInterval.length() + ")=>null using chain " + chainId;
-            }
-            final String strand = toInterval.isNegativeStrand()? "-": "+";
-            return fromInterval.toString() + " (len " + fromInterval.length() + ")=>" + toInterval + "(" + strand
-                    + ") using chain " + chainId + " ; pct matched " + percentLiftedOver;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/metrics/Header.java b/src/main/java/htsjdk/samtools/metrics/Header.java
deleted file mode 100644
index 3672d8b..0000000
--- a/src/main/java/htsjdk/samtools/metrics/Header.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import java.io.Serializable;
-
-/**
- * A header for a metrics file.  A header simply consists of a type and some arbitrary
- * data, but must be able to turn itself into a String and parse it's data back out
- * of that String at a later date.
- *
- * @author Tim Fennell
- */
-public interface Header extends Serializable {
-    /** Converts the header to a String for persisting to a file. */
-    public String toString();
-
-    /** Parses the data contained in the String version of the header. */
-    public void parse(String in);
-
-}
diff --git a/src/main/java/htsjdk/samtools/metrics/MetricBase.java b/src/main/java/htsjdk/samtools/metrics/MetricBase.java
deleted file mode 100644
index 119a479..0000000
--- a/src/main/java/htsjdk/samtools/metrics/MetricBase.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.FormatUtil;
-
-import java.lang.reflect.Field;
-
-/**
- * A base class from which all Metric classes should inherit.
- *
- * @author Tim Fennell
- */
-public class MetricBase {
-    /**
-     * An equals method that checks equality by asserting that the classes are of the exact
-     * same type and that all public fields are equivalent.  Equivalence is checked by formatting
-     * the field as it would be written to disk and then checking String equality.
-     *
-     * @param o an instance to compare to
-     * @return true if they are equal, false otherwise
-     */
-    public boolean equals(final Object o) {
-        if (o == null) return false;
-        if (o.getClass() != getClass()) return false;
-        
-        final FormatUtil formatter = new FormatUtil();
-        // Loop through all the fields and check that they are either
-        // null in both objects or equal in both objects
-        for (final Field f : getClass().getFields()) {
-            try {
-                final Object lhs = f.get(this);
-                final Object rhs = f.get(o);
-
-                if (lhs == null) {
-                    if (rhs == null) {
-                        // keep going
-                    }
-                    else {
-                        return false;
-                    }
-                }
-                else {
-                    if (formatter.format(lhs).equals(formatter.format(rhs))) //compare based on the serialized representation
-                    {
-                        // keep going
-                    }
-                    else {
-                        return false;
-                    }
-                }
-            }
-            catch (IllegalAccessException iae) {
-                throw new SAMException("Could not read field " + f.getName() + " from a " + getClass().getSimpleName());
-            }
-        }
-
-        // If we got this far all the fields are equal
-        return true;
-    }
-
-    /**
-     * Computes a hashcode by formatting each field into its on disk representation 
-     * and summing the hashcodes of all the fields.
-     */
-    public int hashCode() {
-        int result = 0;
-        FormatUtil formatter = new FormatUtil();
-        for (final Field f : getClass().getFields()) {
-            try {
-                Object value = f.get(this);
-                value = formatter.format(value); //format the value the way it will be written to disk
-                final int fieldHash = value != null ? value.hashCode() : 0;
-                result = 31 * result + fieldHash;
-            } catch (IllegalAccessException e) {
-                throw new SAMException("Could not read field " + f.getName() + " from a " + getClass().getSimpleName());
-            }
-        }
-        return result;
-    }
-
-    /** Converts the metric class to a human readable string. */
-    public String toString() {
-        final StringBuilder buffer = new StringBuilder();
-        final FormatUtil formatter = new FormatUtil();
-
-        for (final Field f : getClass().getFields()) {
-            try {
-                buffer.append(f.getName());
-                buffer.append('\t');
-                buffer.append(formatter.format(f.get(this)));
-                buffer.append('\n');
-            }
-            catch (IllegalAccessException iae) {
-                throw new SAMException("Could not read field " + f.getName() + " from a " + getClass().getSimpleName());
-            }
-        }
-
-        return buffer.toString();
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/metrics/MetricsFile.java b/src/main/java/htsjdk/samtools/metrics/MetricsFile.java
deleted file mode 100644
index ac0628a..0000000
--- a/src/main/java/htsjdk/samtools/metrics/MetricsFile.java
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.FormatUtil;
-import htsjdk.samtools.util.Histogram;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.*;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Contains a set of metrics that can be written to a file and parsed back
- * again. The set of metrics is composed of zero or more instances of a class,
- * BEAN, that extends {@link MetricBase} (all instances must be of the same type)
- * and may optionally include one or more histograms that share the same key set.
- *
- * @author Tim Fennell
- */
-public class MetricsFile<BEAN extends MetricBase, HKEY extends Comparable> implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    public static final String MAJOR_HEADER_PREFIX = "## ";
-    public static final String MINOR_HEADER_PREFIX = "# ";
-    public static final String SEPARATOR = "\t";
-    public static final String HISTO_HEADER = "## HISTOGRAM\t";
-    public static final String METRIC_HEADER = "## METRICS CLASS\t";
-
-    private final Set<String> columnLabels = new HashSet<>();
-    private final List<Header> headers = new ArrayList<>();
-    private final List<BEAN> metrics = new ArrayList<>();
-    private final List<Histogram<HKEY>> histograms = new ArrayList<>();
-
-    /** Adds a header to the collection of metrics. */
-    public void addHeader(Header h) { this.headers.add(h); }
-
-    /** Returns the list of headers. */
-    public List<Header> getHeaders() { return Collections.unmodifiableList(this.headers); }
-
-    /** Adds a bean to the collection of metrics. */
-    public void addMetric(final BEAN bean) { this.metrics.add(bean); }
-
-    /** Add multiple metric beans at once. */
-    public void addAllMetrics(final Iterable<BEAN> beanz) {
-        for (final BEAN bean : beanz) { this.addMetric(bean); }
-    }
-
-    /** Returns the list of headers. */
-    public List<BEAN> getMetrics() { return Collections.unmodifiableList(this.metrics); }
-
-    public Set<String> getMetricsColumnLabels() { return Collections.unmodifiableSet(this.columnLabels); }
-
-    /** Returns the histogram contained in the metrics file if any. */
-    public Histogram<HKEY> getHistogram() {
-        if (!histograms.isEmpty()) return this.histograms.get(0);
-        else return null;
-    }
-
-    /** Sets the histogram contained in the metrics file. */
-    public void setHistogram(final Histogram<HKEY> histogram) {
-        if (this.histograms.isEmpty()) {
-            if (histogram != null) this.histograms.add(histogram);
-        }
-        else {
-            this.histograms.set(0, histogram);
-        }
-    }
-
-    /** Adds a histogram to the list of histograms in the metrics file. */
-    public void addHistogram(final Histogram<HKEY> histogram) {
-        this.histograms.add(histogram);
-    }
-
-    //** Returns an unmodifiable version of the histogram list */
-    public List<Histogram<HKEY>> getAllHistograms() {
-        return Collections.unmodifiableList(histograms);
-    }
-
-    /** Returns the number of histograms added to the metrics file. */
-    public int getNumHistograms() 
-    {
-    	return this.histograms.size();
-    }
-    
-    /** Returns the list of headers with the specified type. */
-    public List<Header> getHeaders(final Class<? extends Header> type) {
-        List<Header> tmp = new ArrayList<Header>();
-        for (final Header h : this.headers) {
-            if (h.getClass().equals(type)) {
-                tmp.add(h);
-            }
-        }
-
-        return tmp;
-    }
-
-    /**
-     * Writes out the metrics file to the supplied file. The file is written out
-     * headers first, metrics second and histogram third.
-     *
-     * @param f a File into which to write the metrics
-     */
-    public void write(final File f) {
-        FileWriter w = null;
-        try {
-            w = new FileWriter(f);
-            write(w);
-        }
-        catch (IOException ioe) {
-            throw new SAMException("Could not write metrics to file: " + f.getAbsolutePath(), ioe);
-        }
-        finally {
-            if (w != null) {
-                try {
-                    w.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-    }
-
-    /**
-     * Writes out the metrics file to the supplied writer. The file is written out
-     * headers first, metrics second and histogram third.
-     *
-     * @param w a Writer into which to write the metrics
-     */
-    public void write(final Writer w) {
-        try {
-            final FormatUtil formatter = new FormatUtil();
-            final BufferedWriter out = new BufferedWriter(w);
-            printHeaders(out);
-            out.newLine();
-
-            printBeanMetrics(out, formatter);
-            out.newLine();
-
-            printHistogram(out, formatter);
-            out.newLine();
-            out.flush();
-        }
-        catch (IOException ioe) {
-            throw new SAMException("Could not write metrics file.", ioe);
-        }
-    }
-
-    /** Prints the headers into the provided PrintWriter. */
-    private void printHeaders(final BufferedWriter out) throws IOException {
-        for (final Header h : this.headers) {
-            out.append(MAJOR_HEADER_PREFIX);
-            out.append(h.getClass().getName());
-            out.newLine();
-            out.append(MINOR_HEADER_PREFIX);
-            out.append(h.toString());
-            out.newLine();
-        }
-    }
-
-    /** Prints each of the metrics entries into the provided PrintWriter. */
-    private void printBeanMetrics(final BufferedWriter out, final FormatUtil formatter) throws IOException {
-        if (this.metrics.isEmpty()) {
-            return;
-        }
-
-        // Write out a header row with the type of the metric class
-        out.append(METRIC_HEADER + getBeanType().getName());
-        out.newLine();
-
-        // Write out the column headers
-        final Field[] fields = getBeanType().getFields();
-        final int fieldCount = fields.length;
-
-        // Write out the column headers
-        for (int i=0; i<fieldCount; ++i) {
-            out.append(fields[i].getName());
-            if (i < fieldCount - 1) {
-                out.append(MetricsFile.SEPARATOR);
-            }
-            else {
-                out.newLine();
-            }
-        }
-
-        // Write out each of the data rows
-        for (final BEAN bean : this.metrics) {
-            for (int i=0; i<fieldCount; ++i) {
-                try {
-                    final Object value = fields[i].get(bean);
-                    out.append(StringUtil.assertCharactersNotInString(formatter.format(value), '\t', '\n'));
-
-                    if (i < fieldCount - 1) {
-                        out.append(MetricsFile.SEPARATOR);
-                    }
-                    else {
-                        out.newLine();
-                    }
-                }
-                catch (IllegalAccessException iae) {
-                    throw new SAMException("Could not read property " + fields[i].getName()
-                            + " from class of type " + bean.getClass());
-                }
-            }
-        }
-
-        out.flush();
-    }
-
-    /** Prints the histogram if one is present. */
-    private void printHistogram(final BufferedWriter out, final FormatUtil formatter) throws IOException {
-        final List<Histogram<HKEY>> nonEmptyHistograms = new ArrayList<Histogram<HKEY>>();
-        for (final Histogram<HKEY> histo : this.histograms) {
-            if (!histo.isEmpty()) nonEmptyHistograms.add(histo);
-        }
-
-        if (nonEmptyHistograms.isEmpty()) {
-            return;
-        }
-
-        // Build a combined key set.  Assume comparator is the same for all Histograms
-        final java.util.Set<HKEY> keys = new TreeSet<HKEY>(nonEmptyHistograms.get(0).comparator());
-        for (final Histogram<HKEY> histo : nonEmptyHistograms) {
-            if (histo != null) keys.addAll(histo.keySet());
-        }
-
-        // Add a header for the histogram key type
-        out.append(HISTO_HEADER + nonEmptyHistograms.get(0).keySet().iterator().next().getClass().getName());
-        out.newLine();
-
-        // Output a header row
-        out.append(StringUtil.assertCharactersNotInString(nonEmptyHistograms.get(0).getBinLabel(), '\t', '\n'));
-        for (final Histogram<HKEY> histo : nonEmptyHistograms) {
-            out.append(SEPARATOR);
-            out.append(StringUtil.assertCharactersNotInString(histo.getValueLabel(), '\t', '\n'));
-        }
-        out.newLine();
-
-        for (final HKEY key : keys) {
-            out.append(key.toString());
-
-            for (final Histogram<HKEY> histo : nonEmptyHistograms) {
-                final Histogram.Bin<HKEY> bin = histo.get(key);
-                final double value = (bin == null ? 0 : bin.getValue());
-
-                out.append(SEPARATOR);
-                out.append(formatter.format(value));
-            }
-
-            out.newLine();
-        }
-    }
-
-    /** Gets the type of the metrics bean being used. */
-    private Class<?> getBeanType() {
-        if (this.metrics.isEmpty()) {
-            return null;
-        } else {
-            return this.metrics.get(0).getClass();
-        }
-    }
-
-    /** Reads the Metrics in from the given reader. */
-    public void read(final Reader r) {
-        final BufferedReader in = new BufferedReader(r);
-        final FormatUtil formatter = new FormatUtil();
-        String line = null;
-
-        try {
-            // First read the headers
-            Header header = null;
-            while ((line = in.readLine()) != null) {
-                line = line.trim();
-                if ("".equals(line)) {
-                    // Do nothing! Nothing to be done!
-                }
-                else if (line.startsWith(METRIC_HEADER) || line.startsWith(HISTO_HEADER)) {
-                    // A line that starts with "## METRICS CLASS" heralds the start of the actual
-                    // data. Bounce our butts out of header parsing without reading the next line.
-                    // This isn't in the while loop's conditional because we want to trim() first.
-                    break;
-                }
-                else if (line.startsWith(MAJOR_HEADER_PREFIX)) {
-                    if (header != null) {
-                        throw new IllegalStateException("Consecutive header class lines encountered.");
-                    }
-                    
-                    final String className = line.substring(MAJOR_HEADER_PREFIX.length()).trim();
-                    try {
-                        header = (Header) loadClass(className, true).newInstance();
-                    }
-                    catch (final Exception e) {
-                        throw new SAMException("Error load and/or instantiating an instance of " + className, e);
-                    }
-                }
-                else if (line.startsWith(MINOR_HEADER_PREFIX)) {
-                    if (header == null) {
-                        throw new IllegalStateException("Header class must precede header value:" + line);
-                    }
-                    header.parse(line.substring(MINOR_HEADER_PREFIX.length()));
-                    this.headers.add(header);
-                    header = null;
-                }
-                else {
-                    throw new SAMException("Illegal state. Found following string in metrics file header: " + line);
-                }
-            }
-
-            // Read space between headers and metrics, if any
-            while (line != null && ! line.trim().startsWith(MAJOR_HEADER_PREFIX)) {
-                line = in.readLine();
-            }
-
-
-            if (line != null) {
-                line = line.trim();
-            
-                // Then read the metrics if there are any
-                if (line.startsWith(METRIC_HEADER)) {
-                    // Get the metric class from the header
-                    final String className = line.split(SEPARATOR)[1];
-                    Class<?> type = null;
-                    try {
-                        type = loadClass(className, true);
-                    }
-                    catch (final ClassNotFoundException cnfe) {
-                        throw new SAMException("Could not locate class with name " + className, cnfe);
-                    }
-
-                    // Read the next line with the column headers
-                    final String[] fieldNames = in.readLine().split(SEPARATOR);
-                    Collections.addAll(columnLabels, fieldNames);
-                    final Field[] fields = new Field[fieldNames.length];
-                    for (int i=0; i<fieldNames.length; ++i) {
-                        try {
-                            fields[i] = type.getField(fieldNames[i]);
-                        }
-                        catch (final Exception e) {
-                            throw new SAMException("Could not get field with name " + fieldNames[i] +
-                                " from class " + type.getName());
-                        }
-                    }
-
-                    // Now read the values
-                    while ((line = in.readLine()) != null) {
-                        if ("".equals(line.trim())) {
-                            break;
-                        }
-                        else {
-                            final String[] values = line.split(SEPARATOR, -1);
-                            BEAN bean = null;
-
-                            try { bean = (BEAN) type.newInstance(); }
-                            catch (final Exception e) { throw new SAMException("Error instantiating a " + type.getName(), e); }
-
-                            for (int i=0; i<fields.length; ++i) {
-                                Object value = null;
-                                if (values[i] != null && !values[i].isEmpty()) {
-                                    value = formatter.parseObject(values[i], fields[i].getType());
-                                }
-
-                                try { fields[i].set(bean, value); }
-                                catch (final Exception e) {
-                                    throw new SAMException("Error setting field " + fields[i].getName() +
-                                            " on class of type " + type.getName(), e);
-                                }
-                            }
-
-                            this.metrics.add(bean);
-                        }
-                    }
-                }
-            }
-
-            // Read away any blank lines between metrics and histograms
-            while (line != null && ! line.trim().startsWith(MAJOR_HEADER_PREFIX)) {
-                line = in.readLine();
-            }
-
-            // Then read the histograms if any are present
-            if (line != null) {
-                line = line.trim();
-
-                if (line.startsWith(HISTO_HEADER)) {
-                    // Get the key type of the histogram
-                    final String keyClassName = line.split(SEPARATOR)[1].trim();
-                    Class<?> keyClass = null;
-
-                    try { keyClass = loadClass(keyClassName, true); }
-                    catch (final ClassNotFoundException cnfe) { throw new SAMException("Could not load class with name " + keyClassName); }
-
-                    // Read the next line with the bin and value labels
-                    final String[] labels = in.readLine().split(SEPARATOR);
-                    for (int i=1; i<labels.length; ++i) {
-                        this.histograms.add(new Histogram<HKEY>(labels[0], labels[i]));
-                    }
-
-                    // Read the entries in the histograms
-                    while ((line = in.readLine()) != null && !"".equals(line)) {
-                        final String[] fields = line.trim().split(SEPARATOR);
-                        final HKEY key = (HKEY) formatter.parseObject(fields[0], keyClass);
-
-                        for (int i=1; i<fields.length; ++i) {
-                            final double value = formatter.parseDouble(fields[i]);
-                            this.histograms.get(i-1).increment(key, value);
-                        }
-                    }
-                }
-            }
-        }
-        catch (final IOException ioe) {
-            throw new SAMException("Could not read metrics from reader.", ioe);
-        }
-        finally{
-            CloserUtil.close(in);
-        }
-    }
-
-    /** Attempts to load a class, taking into account that some classes have "migrated" from the broad to sf. */
-    private Class<?> loadClass(final String className, final boolean tryOtherPackages) throws ClassNotFoundException {
-        // List of alternative packages to check in case classes moved around
-        final String[] packages = new String[] {
-                "edu.mit.broad.picard.genotype.concordance",
-                "edu.mit.broad.picard.genotype.fingerprint",
-                "edu.mit.broad.picard.ic",
-                "edu.mit.broad.picard.illumina",
-                "edu.mit.broad.picard.jumping",
-                "edu.mit.broad.picard.quality",
-                "edu.mit.broad.picard.samplevalidation",
-                "htsjdk.samtools.analysis",
-                "htsjdk.samtools.analysis.directed",
-                "htsjdk.samtools.sam",
-                "htsjdk.samtools.metrics",
-                "picard.sam",
-                "picard.metrics",
-                "picard.illumina",
-                "picard.analysis",
-                "picard.analysis.directed",
-                "picard.vcf"
-        };
-
-        try { return Class.forName(className); }
-        catch (ClassNotFoundException cnfe) {
-            if (tryOtherPackages) {
-                for (final String p : packages) {
-                    try {
-                        return loadClass(p + className.substring(className.lastIndexOf('.')), false);
-                    }
-                    catch (ClassNotFoundException cnf2) {/* do nothing */}
-                    // If it ws an inner class, try and see if it's a stand-alone class now
-                    if (className.indexOf('$') > -1) {
-                        try {
-                            return loadClass(p + "." + className.substring(className.lastIndexOf('$') + 1), false);
-                        }
-                        catch (ClassNotFoundException cnf2) {/* do nothing */}
-                    }
-                }
-            }
-
-            throw cnfe;
-        }
-    }
-
-    /** Checks that the headers, metrics and histogram are all equal. */
-    @Override
-    public boolean equals(final Object o) {
-        if (o == null) {
-            return false;
-        }
-        if (getClass() != o.getClass()) {
-            return false;
-        }
-        final MetricsFile that = (MetricsFile) o;
-
-        if (!areHeadersEqual(that)) {
-            return false;
-        }
-        if (!areMetricsEqual(that)) {
-            return false;
-        }
-        if (!areHistogramsEqual(that)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    public boolean areHeadersEqual(final MetricsFile that) {
-        return this.headers.equals(that.headers);
-    }
-
-    public boolean areMetricsEqual(final MetricsFile that) {
-        return this.metrics.equals(that.metrics);
-    }
-
-    public boolean areHistogramsEqual(final MetricsFile that) {
-        return this.histograms.equals(that.histograms);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = headers.hashCode();
-        result = 31 * result + metrics.hashCode();
-        return result;
-    }
-
-    /**
-     * Convenience method to read all the Metric beans from a metrics file.
-     * @param file to be read.
-     * @return list of beans from the file.
-     */
-    public static <T extends MetricBase> List<T> readBeans(final File file) {
-        final MetricsFile<T, ?> metricsFile = new MetricsFile<>();
-        final Reader in = IOUtil.openFileForBufferedReading(file);
-        metricsFile.read(in);
-        CloserUtil.close(in);
-        return metricsFile.getMetrics();
-    }
-
-    /**
-     * Method to read the header from a metrics file.
-     */
-    public static List<Header> readHeaders(final File file) {
-        try {
-            final MetricsFile<MetricBase, ?> metricsFile = new MetricsFile<>();
-            metricsFile.read(new FileReader(file));
-            return metricsFile.getHeaders();
-        } catch (FileNotFoundException e) {
-            throw new SAMException(e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Compare the metrics in two files, ignoring headers and histograms.
-     */
-    public static boolean areMetricsEqual(final File file1, final File file2) {
-        try {
-            final MetricsFile<MetricBase, ?> mf1 = new MetricsFile<>();
-            final MetricsFile<MetricBase, ?> mf2 = new MetricsFile<>();
-            mf1.read(new FileReader(file1));
-            mf2.read(new FileReader(file2));
-            return mf1.areMetricsEqual(mf2);
-        } catch (FileNotFoundException e) {
-            throw new SAMException(e.getMessage(), e);
-        }
-
-    }
-
-    /**
-     * Compare the metrics and histograms in two files, ignoring headers.
-     */
-    public static boolean areMetricsAndHistogramsEqual(final File file1, final File file2) {
-        try {
-            final MetricsFile<MetricBase, ?> mf1 = new MetricsFile<>();
-            final MetricsFile<MetricBase, ?> mf2 = new MetricsFile<>();
-            mf1.read(new FileReader(file1));
-            mf2.read(new FileReader(file2));
-
-            return mf1.areMetricsEqual(mf2) && mf1.areHistogramsEqual(mf2);
-
-        } catch (FileNotFoundException e) {
-            throw new SAMException(e.getMessage(), e);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/metrics/StringHeader.java b/src/main/java/htsjdk/samtools/metrics/StringHeader.java
deleted file mode 100644
index ced1595..0000000
--- a/src/main/java/htsjdk/samtools/metrics/StringHeader.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.util.StringUtil;
-
-/**
- * A simple header who's data type is a single String.  Should not be used for anything other
- * than comments or descriptive text.
- *
- * @author Tim Fennell
- */
-public class StringHeader implements Header {
-    private String value;
-
-    /** Default constructor. */
-    public StringHeader() {}
-
-    /** Constructor that uses the supplied value as the value of the header. */
-    public StringHeader(String value) {
-        setValue(value);
-    }
-
-    public void parse(String in) { value = in.trim(); }
-    public String toString() { return value; }
-
-    public String getValue() { return value; }
-    public void setValue(String value) { this.value = StringUtil.assertCharactersNotInString(value, '\n'); }
-
-    /** Checks equality on the value of the header. */
-    public boolean equals(Object o) {
-        if (o != null && o instanceof StringHeader) {
-            StringHeader that = (StringHeader) o;
-            if (this.value == null) {
-                return that.value == null;
-            }
-            else {
-                return this.value.equals(that.value);
-            }
-        }
-        else {
-            return false;
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return value != null ? value.hashCode() : 0;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/metrics/VersionHeader.java b/src/main/java/htsjdk/samtools/metrics/VersionHeader.java
deleted file mode 100644
index ae08455..0000000
--- a/src/main/java/htsjdk/samtools/metrics/VersionHeader.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.util.StringUtil;
-
-/**
- * Header that stores information about the version of some piece of software or
- * data used to create the metrics file.  Payload consists of a name or description
- * of the versioned item and a version string.
- *
- * @author Tim Fennell
- */
-public class VersionHeader implements Header {
-    private String versionedItem;
-    private String versionString;
-
-    public void parse(String in) {
-        String[] fields = in.split("\t");
-        this.versionedItem = fields[0];
-        this.versionString = fields[1];
-    }
-
-    public String toString() {
-        return this.versionedItem + "\t" + this.versionString;
-    }
-
-    public String getVersionedItem() { return versionedItem; }
-    public void setVersionedItem(String versionedItem) {
-        this.versionedItem = StringUtil.assertCharactersNotInString(versionedItem, '\t', '\n');
-    }
-
-    public String getVersionString() { return versionString; }
-    public void setVersionString(String versionString) {
-        this.versionString = StringUtil.assertCharactersNotInString(versionString, '\t', '\n');
-    }
-
-    /** Equals method that checks that both the item and version string are equal. */
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        VersionHeader that = (VersionHeader) o;
-
-        if (versionString != null ? !versionString.equals(that.versionString) : that.versionString != null)
-            return false;
-        if (versionedItem != null ? !versionedItem.equals(that.versionedItem) : that.versionedItem != null)
-            return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = versionedItem != null ? versionedItem.hashCode() : 0;
-        result = 31 * result + (versionString != null ? versionString.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java
deleted file mode 100644
index 86f11fe..0000000
--- a/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMTextHeaderCodec;
-import htsjdk.samtools.util.BufferedLineReader;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-/**
- * Provide core sequence dictionary functionality required by all fasta file readers.
- * @author Matt Hanna
- */
-abstract class AbstractFastaSequenceFile implements ReferenceSequenceFile {
-    private final Path path;
-    protected SAMSequenceDictionary sequenceDictionary;
-
-    /**
-     * Finds and loads the sequence file dictionary.
-     * @param file Fasta file to read.  Also acts as a prefix for supporting files.
-     */
-    AbstractFastaSequenceFile(final File file) {
-        this(file == null ? null : file.toPath());
-    }
-
-    /**
-     * Finds and loads the sequence file dictionary.
-     * @param path Fasta file to read.  Also acts as a prefix for supporting files.
-     */
-    AbstractFastaSequenceFile(final Path path) {
-        this.path = path;
-        final Path dictionary = findSequenceDictionary(path);
-
-        if (dictionary != null) {
-            IOUtil.assertFileIsReadable(dictionary);
-
-            try {
-                final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
-                final BufferedLineReader reader = new BufferedLineReader(Files.newInputStream(dictionary));
-                final SAMFileHeader header = codec.decode(reader,
-                        dictionary.toString());
-                if (header.getSequenceDictionary() != null && !header.getSequenceDictionary().isEmpty()) {
-                    this.sequenceDictionary = header.getSequenceDictionary();
-                }
-                reader.close();
-            }
-            catch (Exception e) {
-                throw new SAMException("Could not open sequence dictionary file: " + dictionary, e);
-            }
-        }
-    }
-
-    protected static File findSequenceDictionary(final File file) {
-        if (file == null) {
-            return null;
-        }
-        Path dictionary = findSequenceDictionary(file.toPath());
-        if (dictionary == null) {
-            return null;
-        }
-        return dictionary.toFile();
-    }
-
-    protected static Path findSequenceDictionary(final Path path) {
-        if (path == null) {
-            return null;
-        }
-        // Try and locate the dictionary
-        Path dictionary = path.toAbsolutePath();
-        Path dictionaryExt = path.toAbsolutePath();
-        boolean fileTypeSupported = false;
-        for (final String extension : ReferenceSequenceFileFactory.FASTA_EXTENSIONS) {
-            String filename = dictionary.getFileName().toString();
-            if (filename.endsWith(extension)) {
-                dictionaryExt = dictionary.resolveSibling(filename + IOUtil
-                    .DICT_FILE_EXTENSION);
-                String filenameNoExt = filename.substring(0, filename.lastIndexOf(extension));
-                dictionary = dictionary.resolveSibling(filenameNoExt+ IOUtil.DICT_FILE_EXTENSION);
-                fileTypeSupported = true;
-                break;
-            }
-        }
-        if (!fileTypeSupported)
-            throw new IllegalArgumentException("File is not a supported reference file type: " + path.toAbsolutePath());
-
-        if (Files.exists(dictionary))
-            return dictionary;
-        // try without removing the file extension
-        if (Files.exists(dictionaryExt))
-            return dictionaryExt;
-        else return null;
-    }
-
-    /** Returns the path to the reference file. */
-    protected Path getPath() {
-        return path;
-    }
-
-    /**
-     * Returns the list of sequence records associated with the reference sequence if found
-     * otherwise null.
-     */
-    public SAMSequenceDictionary getSequenceDictionary() {
-        return this.sequenceDictionary;
-    }
-
-    /** Returns the full path to the reference file. */
-    protected String getAbsolutePath() {
-        return path.toAbsolutePath().toString();
-    }
-
-    /** Returns the full path to the reference file. */
-    public String toString() {
-        return getAbsolutePath();
-    }
-
-    /** default implementation -- override if index is supported */
-    public boolean isIndexed() {return false;}
-
-    /** default implementation -- override if index is supported */
-    public ReferenceSequence getSequence( String contig ) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** default implementation -- override if index is supported */
-    public ReferenceSequence getSubsequenceAt( String contig, long start, long stop ) {
-        throw new UnsupportedOperationException("Index does not appear to exist for " + getAbsolutePath() + ".  samtools faidx can be used to create an index");
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java
deleted file mode 100644
index 72c0583..0000000
--- a/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.util.FastLineReader;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.File;
-import java.nio.file.Path;
-
-/**
- * Implementation of ReferenceSequenceFile for reading from FASTA files.
- *
- * @author Tim Fennell
- */
-public class FastaSequenceFile extends AbstractFastaSequenceFile {
-
-    private final boolean truncateNamesAtWhitespace;
-    private FastLineReader in;
-    private int sequenceIndex = -1;
-    private final byte[] basesBuffer = new byte[Defaults.NON_ZERO_BUFFER_SIZE];
-
-
-    /** Constructs a FastaSequenceFile that reads from the specified file. */
-    public FastaSequenceFile(final File file, final boolean truncateNamesAtWhitespace) {
-        this(file == null ? null : file.toPath(), truncateNamesAtWhitespace);
-    }
-
-    /** Constructs a FastaSequenceFile that reads from the specified file. */
-    public FastaSequenceFile(final Path path, final boolean truncateNamesAtWhitespace) {
-        super(path);
-        this.truncateNamesAtWhitespace = truncateNamesAtWhitespace;
-        this.in = new FastLineReader(IOUtil.openFileForReading(path));
-    }
-
-    /**
-     * It's good to call this to free up memory.
-     */
-    public void close() {
-        in.close();
-    }
-
-    public ReferenceSequence nextSequence() {
-        this.sequenceIndex += 1;
-
-        // Read the header line
-        final String name = readSequenceName();
-        if (name == null) {
-            close();
-            return null;
-        }
-
-        // Read the sequence
-        final int knownLength = (this.sequenceDictionary == null) ? -1 : this.sequenceDictionary.getSequence(this.sequenceIndex).getSequenceLength();
-        final byte[] bases = readSequence(knownLength);
-
-        return new ReferenceSequence(name, this.sequenceIndex, bases);
-    }
-
-    public void reset() {
-        this.sequenceIndex = -1;
-        this.in.close();
-        this.in = new FastLineReader(IOUtil.openFileForReading(getPath()));
-
-    }
-
-    private String readSequenceName() {
-        in.skipNewlines();
-        if (in.eof()) {
-            return null;
-        }
-        final byte b = in.getByte();
-        if (b != '>') {
-            throw new SAMException("Format exception reading FASTA " + getAbsolutePath() + ".  Expected > but saw chr(" +
-            b + ") at start of sequence with index " + this.sequenceIndex);
-        }
-        final byte[] nameBuffer = new byte[4096];
-        int nameLength = 0;
-        do {
-            if (in.eof()) {
-                break;
-            }
-            nameLength += in.readToEndOfOutputBufferOrEoln(nameBuffer, nameLength);
-            if (nameLength == nameBuffer.length && !in.atEoln()) {
-                throw new SAMException("Sequence name too long in FASTA " + getAbsolutePath());
-            }
-        } while (!in.atEoln());
-        if (nameLength == 0) {
-            throw new SAMException("Missing sequence name in FASTA " + getAbsolutePath());
-        }
-        String name = StringUtil.bytesToString(nameBuffer, 0, nameLength).trim();
-        if (truncateNamesAtWhitespace) {
-            name = SAMSequenceRecord.truncateSequenceName(name);
-        }
-        return name;
-    }
-
-    /**
-     * Read bases from input
-     * @param knownLength For performance:: -1 if length is not known, otherwise the length of the sequence.
-     * @return ASCII bases for sequence
-     */
-    private byte[] readSequence(final int knownLength) {
-        byte[] bases = (knownLength == -1) ?  basesBuffer : new byte[knownLength] ;
-
-        int sequenceLength = 0;
-        while (!in.eof()) {
-            final boolean sawEoln = in.skipNewlines();
-            if (in.eof()) {
-                break;
-            }
-            if (sawEoln && in.peekByte() == '>') {
-                break;
-            }
-            sequenceLength += in.readToEndOfOutputBufferOrEoln(bases, sequenceLength);
-            while (sequenceLength > 0 && Character.isWhitespace(StringUtil.byteToChar(bases[sequenceLength - 1]))) {
-                --sequenceLength;
-            }
-            if (sequenceLength == knownLength) {
-                // When length is known, make sure there is no trailing whitespace that hasn't been traversed.
-                skipToEoln();
-                break;
-            }
-            if (sequenceLength == bases.length) {
-                    final byte[] tmp = new byte[bases.length * 2];
-                    System.arraycopy(bases, 0, tmp, 0, sequenceLength);
-                    bases = tmp;
-            }
-        }
-
-        // And lastly resize the array down to the right size
-        if (sequenceLength != bases.length || bases == basesBuffer) {
-            final byte[] tmp = new byte[sequenceLength];
-            System.arraycopy(bases, 0, tmp, 0, sequenceLength);
-            bases = tmp;
-        }
-        return bases;
-    }
-
-    private void skipToEoln() {
-        byte[] ignoreBuffer = new byte[1024];
-        while (!in.eof() && !in.atEoln()) {
-            in.readToEndOfOutputBufferOrEoln(ignoreBuffer, 0);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java
deleted file mode 100644
index e314fcc..0000000
--- a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Scanner;
-import java.util.regex.MatchResult;
-
-/**
- * Reads a fasta index file (.fai), as generated by `samtools faidx`.
- */
-public class FastaSequenceIndex implements Iterable<FastaSequenceIndexEntry> {
-    /**
-     * Store the entries.  Use a LinkedHashMap for consistent iteration in insertion order.
-     */
-    private final Map<String,FastaSequenceIndexEntry> sequenceEntries = new LinkedHashMap<String,FastaSequenceIndexEntry>();
-
-    /**
-     * Build a sequence index from the specified file.
-     * @param indexFile File to open.
-     * @throws FileNotFoundException if the index file cannot be found.
-     */
-    public FastaSequenceIndex( File indexFile ) {
-        this(indexFile == null ? null : indexFile.toPath());
-    }
-
-    /**
-     * Build a sequence index from the specified file.
-     * @param indexFile File to open.
-     * @throws FileNotFoundException if the index file cannot be found.
-     */
-    public FastaSequenceIndex( Path indexFile ) {
-        IOUtil.assertFileIsReadable(indexFile);
-        parseIndexFile(indexFile);
-    }
-
-    /**
-     * Empty, protected constructor for unit testing.
-     */
-    protected FastaSequenceIndex() {}
-
-    /**
-     * Add a new index entry to the list.  Protected for unit testing.
-     * @param indexEntry New index entry to add.
-     */
-    protected void add(FastaSequenceIndexEntry indexEntry) {
-        final FastaSequenceIndexEntry ret = sequenceEntries.put(indexEntry.getContig(),indexEntry);
-        if (ret != null) {
-            throw new SAMException("Contig '" + indexEntry.getContig() + "' already exists in fasta index.");
-        }
-    }
-
-    /**
-     * Renames the existing index entry to the new index entry with the specified name.
-     * @param entry entry to update.
-     * @param newName New name for the index entry.
-     */
-    protected void rename(FastaSequenceIndexEntry entry,String newName) {
-        sequenceEntries.remove(entry.getContig());
-        entry.setContig(newName);
-        add(entry);
-    }
-
-    /**
-     * Compare two FastaSequenceIndex objects for equality.
-     * @param other Another FastaSequenceIndex to compare
-     * @return True if index has the same entries as other instance, in the same order
-     */
-    public boolean equals(Object other) {
-        if(!(other instanceof FastaSequenceIndex))
-            return false;
-
-        if (this == other) return true;
-
-        FastaSequenceIndex otherIndex = (FastaSequenceIndex)other;
-        if(this.size() != otherIndex.size())
-            return false;
-
-        Iterator<FastaSequenceIndexEntry> iter = this.iterator();
-        Iterator<FastaSequenceIndexEntry> otherIter = otherIndex.iterator();
-        while (iter.hasNext()) {
-            if (!otherIter.hasNext())
-                return false;
-            if (!iter.next().equals(otherIter.next()))
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * Parse the contents of an index file, caching the results internally.
-     * @param indexFile File to parse.
-     * @throws IOException Thrown if file could not be opened.
-     */
-    private void parseIndexFile(Path indexFile) {
-        try {
-            Scanner scanner = new Scanner(indexFile);
-            int sequenceIndex = 0;
-            while( scanner.hasNext() ) {
-                // Tokenize and validate the index line.
-                String result = scanner.findInLine("(.+)\\t+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)");
-                if( result == null )
-                    throw new SAMException("Found invalid line in index file:" + scanner.nextLine());
-                MatchResult tokens = scanner.match();
-                if( tokens.groupCount() != 5 )
-                    throw new SAMException("Found invalid line in index file:" + scanner.nextLine());
-
-                // Skip past the line separator
-                scanner.nextLine();
-
-                // Parse the index line.
-                String contig = tokens.group(1);
-                long size = Long.valueOf(tokens.group(2));
-                long location = Long.valueOf(tokens.group(3));
-                int basesPerLine = Integer.valueOf(tokens.group(4));
-                int bytesPerLine = Integer.valueOf(tokens.group(5));
-
-                contig = SAMSequenceRecord.truncateSequenceName(contig);
-                // Build sequence structure
-                add(new FastaSequenceIndexEntry(contig,location,size,basesPerLine,bytesPerLine, sequenceIndex++) );
-            }
-            scanner.close();
-        } catch (IOException e) {
-            throw new SAMException("Fasta index file could not be opened: " + indexFile, e);
-
-        }
-    }
-
-    /**
-     * Does the given contig name have a corresponding entry?
-     * @param contigName The contig name for which to search.
-     * @return True if contig name is present; false otherwise.
-     */
-    public boolean hasIndexEntry( String contigName ) {
-        return sequenceEntries.containsKey(contigName);
-    }
-
-    /**
-     * Retrieve the index entry associated with the given contig.
-     * @param contigName Name of the contig for which to search.
-     * @return Index entry associated with the given contig.
-     * @throws SAMException if the associated index entry can't be found.
-     */
-    public FastaSequenceIndexEntry getIndexEntry( String contigName ) {
-        if( !hasIndexEntry(contigName) )
-            throw new SAMException("Unable to find entry for contig: " + contigName);
-
-        return sequenceEntries.get(contigName);
-    }
-
-    /**
-     * Creates an iterator which can iterate through all entries in a fasta index.
-     * @return iterator over all fasta index entries.
-     */
-    public Iterator<FastaSequenceIndexEntry> iterator() {
-        return sequenceEntries.values().iterator();
-    }
-
-    /**
-     * Returns the number of elements in the index.
-     * @return Number of elements in the index.
-     */
-    public int size() {
-        return sequenceEntries.size();
-    }
-}
-
-/**
- * Hold an individual entry in a fasta sequence index file.
- */
-class FastaSequenceIndexEntry {
-    private String contig;
-    private long location;
-    private long size;
-    private int basesPerLine;
-    private int bytesPerLine;
-    private final int sequenceIndex;
-
-    /**
-     * Create a new entry with the given parameters.
-     * @param contig Contig this entry represents.
-     * @param location Location (byte coordinate) in the fasta file.
-     * @param size The number of bases in the contig.
-     * @param basesPerLine How many bases are on each line.
-     * @param bytesPerLine How many bytes are on each line (includes newline characters).
-     */
-    public FastaSequenceIndexEntry( String contig,
-                                    long location,
-                                    long size,
-                                    int basesPerLine,
-                                    int bytesPerLine,
-                                    int sequenceIndex) {
-        this.contig = contig;
-        this.location = location;
-        this.size = size;
-        this.basesPerLine = basesPerLine;
-        this.bytesPerLine = bytesPerLine;
-        this.sequenceIndex = sequenceIndex;
-    }
-
-    /**
-     * Gets the contig associated with this entry.
-     * @return String representation of the contig.
-     */
-    public String getContig() {
-        return contig;
-    }
-
-    /**
-     * Sometimes contigs need to be adjusted on-the-fly to
-     * match sequence dictionary entries.  Provide that capability
-     * to other classes w/i the package. 
-     * @param contig New value for the contig.
-     */
-    protected void setContig(String contig) {
-        this.contig = contig;
-    }
-
-    /**
-     * Gets the location of this contig within the fasta.
-     * @return seek position within the fasta.
-     */
-    public long getLocation() {
-        return location;
-    }
-
-    /**
-     * Gets the size, in bytes, of the data in the contig.
-     * @return size of the contig bases in bytes.
-     */
-    public long getSize() {
-        return size;
-    }
-
-    /**
-     * Gets the number of bases in a given line.
-     * @return Number of bases in the fasta line.
-     */
-    public int getBasesPerLine() {
-        return basesPerLine;
-    }
-
-    /**
-     * How many bytes (bases + whitespace) are consumed by the
-     * given line?
-     * @return Number of bytes in a line.
-     */
-    public int getBytesPerLine() {
-        return bytesPerLine;
-    }
-
-    public int getSequenceIndex() {
-        return sequenceIndex;
-    }
-
-    /**
-     * For debugging.  Emit the contents of each contig line.
-     * @return A string representation of the contig line.
-     */
-    public String toString() {
-        return String.format("contig %s; location %d; size %d; basesPerLine %d; bytesPerLine %d", contig,
-                                                                                                  location,
-                                                                                                  size,
-                                                                                                  basesPerLine,
-                                                                                                  bytesPerLine );
-    }
-
-    /**
-     * Compare this index entry to another index entry.
-     * @param other another FastaSequenceIndexEntry
-     * @return True if each has the same name, location, size, basesPerLine and bytesPerLine
-     */
-    public boolean equals(Object other) {
-        if(!(other instanceof FastaSequenceIndexEntry))
-            return false;
-
-        if (this == other) return true;
-
-        FastaSequenceIndexEntry otherEntry = (FastaSequenceIndexEntry)other;
-        return (contig.equals(otherEntry.contig) && size == otherEntry.size && location == otherEntry.location
-        && basesPerLine == otherEntry.basesPerLine && bytesPerLine == otherEntry.bytesPerLine);
-    }
-
-    /**
-     * In general, we expect one entry per contig, so compute the hash based only on the contig.
-     * @return A unique hash code representing this object.
-     */
-    public int hashCode() {
-        return contig.hashCode();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java
deleted file mode 100644
index 60cc3b1..0000000
--- a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.Closeable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.channels.SeekableByteChannel;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Iterator;
-
-/**
- * A fasta file driven by an index for fast, concurrent lookups.  Supports two interfaces:
- * the ReferenceSequenceFile for old-style, stateful lookups and a direct getter.
- */
-public class IndexedFastaSequenceFile extends AbstractFastaSequenceFile implements Closeable {
-    /**
-     * The interface facilitating direct access to the fasta.
-     */
-    private final SeekableByteChannel channel;
-
-    /**
-     * A representation of the sequence index, stored alongside the fasta in a .fasta.fai file.
-     */
-    private final FastaSequenceIndex index;
-
-    /**
-     * An iterator into the fasta index, for traversing iteratively across the fasta.
-     */
-    private Iterator<FastaSequenceIndexEntry> indexIterator;
-
-    /**
-     * Open the given indexed fasta sequence file.  Throw an exception if the file cannot be opened.
-     * @param file The file to open.
-     * @param index Pre-built FastaSequenceIndex, for the case in which one does not exist on disk.
-     * @throws FileNotFoundException If the fasta or any of its supporting files cannot be found.
-     */
-    public IndexedFastaSequenceFile(final File file, final FastaSequenceIndex index) {
-        this(file == null ? null : file.toPath(), index);
-    }
-
-    /**
-     * Open the given indexed fasta sequence file.  Throw an exception if the file cannot be opened.
-     * @param file The file to open.
-     * @throws FileNotFoundException If the fasta or any of its supporting files cannot be found.
-     */
-    public IndexedFastaSequenceFile(final File file) throws FileNotFoundException {
-        this(file, new FastaSequenceIndex((findRequiredFastaIndexFile(file))));
-    }
-
-    /**
-     * Open the given indexed fasta sequence file.  Throw an exception if the file cannot be opened.
-     * @param path The file to open.
-     * @param index Pre-built FastaSequenceIndex, for the case in which one does not exist on disk.
-     */
-    public IndexedFastaSequenceFile(final Path path, final FastaSequenceIndex index) {
-        super(path);
-        if (index == null) throw new IllegalArgumentException("Null index for fasta " + path);
-        this.index = index;
-        IOUtil.assertFileIsReadable(path);
-        try {
-            this.channel = Files.newByteChannel(path);
-        } catch (IOException e) {
-            throw new SAMException("Fasta file should be readable but is not: " + path, e);
-        }
-        reset();
-
-        if(getSequenceDictionary() != null)
-            sanityCheckDictionaryAgainstIndex(path.toAbsolutePath().toString(),sequenceDictionary,index);
-    }
-
-    /**
-     * Open the given indexed fasta sequence file.  Throw an exception if the file cannot be opened.
-     * @param path The file to open.
-     * @throws FileNotFoundException If the fasta or any of its supporting files cannot be found.
-     */
-    public IndexedFastaSequenceFile(final Path path) throws FileNotFoundException {
-        this(path, new FastaSequenceIndex((findRequiredFastaIndexFile(path))));
-    }
-
-    public boolean isIndexed() {return true;}
-
-    private static File findFastaIndex(File fastaFile) {
-        File indexFile = getFastaIndexFileName(fastaFile);
-        if (!indexFile.exists()) return null;
-        return indexFile;
-    }
-
-    private static File getFastaIndexFileName(File fastaFile) {
-        return new File(fastaFile.getAbsolutePath() + ".fai");
-    }
-
-    private static File findRequiredFastaIndexFile(File fastaFile) throws FileNotFoundException {
-        File ret = findFastaIndex(fastaFile);
-        if (ret == null) throw new FileNotFoundException(getFastaIndexFileName(fastaFile) + " not found.");
-        return ret;
-    }
-
-    public static boolean canCreateIndexedFastaReader(final File fastaFile) {
-        return (fastaFile.exists() &&
-                findFastaIndex(fastaFile) != null);
-    }
-
-    private static Path findFastaIndex(Path fastaFile) {
-        Path indexFile = getFastaIndexFileName(fastaFile);
-        if (!Files.exists(indexFile)) return null;
-        return indexFile;
-    }
-
-    private static Path getFastaIndexFileName(Path fastaFile) {
-        return fastaFile.resolveSibling(fastaFile.getFileName() + ".fai");
-    }
-
-    private static Path findRequiredFastaIndexFile(Path fastaFile) throws FileNotFoundException {
-        Path ret = findFastaIndex(fastaFile);
-        if (ret == null) throw new FileNotFoundException(getFastaIndexFileName(fastaFile) + " not found.");
-        return ret;
-    }
-
-    public static boolean canCreateIndexedFastaReader(final Path fastaFile) {
-        return (Files.exists(fastaFile) &&
-            findFastaIndex(fastaFile) != null);
-    }
-
-    /**
-     * Do some basic checking to make sure the dictionary and the index match.
-     * @param fastaFile Used for error reporting only.
-     * @param sequenceDictionary sequence dictionary to check against the index.
-     * @param index index file to check against the dictionary.
-     */
-    protected static void sanityCheckDictionaryAgainstIndex(final String fastaFile,
-                                                            final SAMSequenceDictionary sequenceDictionary,
-                                                            final FastaSequenceIndex index) {
-        // Make sure dictionary and index are the same size.
-        if( sequenceDictionary.getSequences().size() != index.size() )
-            throw new SAMException("Sequence dictionary and index contain different numbers of contigs");
-
-        Iterator<SAMSequenceRecord> sequenceIterator = sequenceDictionary.getSequences().iterator();
-        Iterator<FastaSequenceIndexEntry> indexIterator = index.iterator();
-
-        while(sequenceIterator.hasNext() && indexIterator.hasNext()) {
-            SAMSequenceRecord sequenceEntry = sequenceIterator.next();
-            FastaSequenceIndexEntry indexEntry = indexIterator.next();
-
-            if(!sequenceEntry.getSequenceName().equals(indexEntry.getContig())) {
-                throw new SAMException(String.format("Mismatch between sequence dictionary fasta index for %s, sequence '%s' != '%s'.",
-                        fastaFile, sequenceEntry.getSequenceName(),indexEntry.getContig()));
-            }
-
-            // Make sure sequence length matches index length.
-            if( sequenceEntry.getSequenceLength() != indexEntry.getSize())
-                throw new SAMException("Index length does not match dictionary length for contig: " + sequenceEntry.getSequenceName() );
-        }
-    }
-
-    /**
-     * Retrieves the sequence dictionary for the fasta file.
-     * @return sequence dictionary of the fasta.
-     */
-    public SAMSequenceDictionary getSequenceDictionary() {
-        return sequenceDictionary;
-    }
-
-    /**
-     * Retrieves the complete sequence described by this contig.
-     * @param contig contig whose data should be returned.
-     * @return The full sequence associated with this contig.
-     */
-    public ReferenceSequence getSequence( String contig ) {
-        return getSubsequenceAt( contig, 1, (int)index.getIndexEntry(contig).getSize() );
-    }
-
-    /**
-     * Gets the subsequence of the contig in the range [start,stop]
-     * @param contig Contig whose subsequence to retrieve.
-     * @param start inclusive, 1-based start of region.
-     * @param stop inclusive, 1-based stop of region.
-     * @return The partial reference sequence associated with this range.
-     */
-    public ReferenceSequence getSubsequenceAt( String contig, long start, long stop ) {
-        if(start > stop + 1)
-            throw new SAMException(String.format("Malformed query; start point %d lies after end point %d",start,stop));
-
-        FastaSequenceIndexEntry indexEntry = index.getIndexEntry(contig);
-
-        if(stop > indexEntry.getSize())
-            throw new SAMException("Query asks for data past end of contig");
-
-        int length = (int)(stop - start + 1);
-
-        byte[] target = new byte[length];
-        ByteBuffer targetBuffer = ByteBuffer.wrap(target);
-
-        final int basesPerLine = indexEntry.getBasesPerLine();
-        final int bytesPerLine = indexEntry.getBytesPerLine();
-        final int terminatorLength = bytesPerLine - basesPerLine;
-
-        long startOffset = ((start-1)/basesPerLine)*bytesPerLine + (start-1)%basesPerLine;
-        // Cast to long so the second argument cannot overflow a signed integer.
-        final long minBufferSize = Math.min((long) Defaults.NON_ZERO_BUFFER_SIZE, (long)(length / basesPerLine + 2) * (long)bytesPerLine);
-        if (minBufferSize > Integer.MAX_VALUE) throw new SAMException("Buffer is too large: " +  minBufferSize);
-
-        // Allocate a buffer for reading in sequence data.
-        final ByteBuffer channelBuffer = ByteBuffer.allocate((int)minBufferSize);
-
-        while(targetBuffer.position() < length) {
-            // If the bufferOffset is currently within the eol characters in the string, push the bufferOffset forward to the next printable character.
-            startOffset += Math.max((int)(startOffset%bytesPerLine - basesPerLine + 1),0);
-
-            try {
-                startOffset += readFromPosition(channel, channelBuffer, indexEntry.getLocation()+startOffset);
-            }
-            catch(IOException ex) {
-                throw new SAMException("Unable to load " + contig + "(" + start + ", " + stop + ") from " + getAbsolutePath(), ex);
-            }
-
-            // Reset the buffer for outbound transfers.
-            channelBuffer.flip();
-
-            // Calculate the size of the next run of bases based on the contents we've already retrieved.
-            final int positionInContig = (int)start-1+targetBuffer.position();
-            final int nextBaseSpan = Math.min(basesPerLine-positionInContig%basesPerLine,length-targetBuffer.position());
-            // Cap the bytes to transfer by limiting the nextBaseSpan to the size of the channel buffer.
-            int bytesToTransfer = Math.min(nextBaseSpan,channelBuffer.capacity());
-
-            channelBuffer.limit(channelBuffer.position()+bytesToTransfer);
-
-            while(channelBuffer.hasRemaining()) {
-                targetBuffer.put(channelBuffer);
-
-                bytesToTransfer = Math.min(basesPerLine,length-targetBuffer.position());
-                channelBuffer.limit(Math.min(channelBuffer.position()+bytesToTransfer+terminatorLength,channelBuffer.capacity()));
-                channelBuffer.position(Math.min(channelBuffer.position()+terminatorLength,channelBuffer.capacity()));
-            }
-
-            // Reset the buffer for inbound transfers.
-            channelBuffer.flip();
-        }
-
-        return new ReferenceSequence( contig, indexEntry.getSequenceIndex(), target );
-    }
-
-    /**
-     * Reads a sequence of bytes from this channel into the given buffer,
-     * starting at the given file position.
-     * @param channel the channel to read from
-     * @param buffer the buffer into which bytes are to be transferred
-     * @param position the position to start reading at
-     * @return the number of bytes read
-     * @throws IOException if an I/O error occurs while reading
-     */
-    private static int readFromPosition(final SeekableByteChannel channel, final ByteBuffer buffer, long position) throws IOException {
-        if (channel instanceof FileChannel) { // special case to take advantage of native code path
-            return ((FileChannel) channel).read(buffer,position);
-        } else {
-            long oldPos = channel.position();
-            try {
-                channel.position(position);
-                return channel.read(buffer);
-            } finally {
-                channel.position(oldPos);
-            }
-        }
-    }
-
-    /**
-     * Gets the next sequence if available, or null if not present.
-     * @return next sequence if available, or null if not present.
-     */
-    public ReferenceSequence nextSequence() {
-        if( !indexIterator.hasNext() )
-            return null;
-        return getSequence( indexIterator.next().getContig() );
-    }
-
-    /**
-     * Reset the iterator over the index.
-     */
-    public void reset() {
-        indexIterator = index.iterator();
-    }
-
-    /**
-     * A simple toString implementation for debugging.
-     * @return String representation of the file.
-     */
-    public String toString() {
-        return getAbsolutePath();
-    }
-
-    @Override
-    public void close() throws IOException {
-        channel.close();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/ReferenceSequence.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequence.java
deleted file mode 100644
index a7ddb44..0000000
--- a/src/main/java/htsjdk/samtools/reference/ReferenceSequence.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.util.StringUtil;
-
-/**
- * Wrapper around a reference sequence that has been read from a reference file.
- *
- * @author Tim Fennell
- */
-public class ReferenceSequence {
-    private final String name;
-    private final byte[] bases;
-    private final int contigIndex;
-    private final int length;
-
-    /**
-     * creates a fully formed ReferenceSequence
-     *
-     * @param name the name of the sequence from the source file
-     * @param index the zero based index of this contig in the source file
-     * @param bases the bases themselves stored as one-byte characters
-     */
-    public ReferenceSequence(String name, int index, byte[] bases) {
-        this.name = name;
-        this.contigIndex = index;
-        this.bases = bases;
-        this.length = bases.length;
-    }
-
-    /** Gets the set of names given to this sequence in the source file. */
-    public String getName() { return name; }
-
-    /**
-     * Gets the array of bases that define this sequence. The bases can include any
-     * letter and possibly include masking information in the form of lower case
-     * letters.  This array is mutable (obviously!) and it NOT a clone of the array
-     * held interally.  Do not modify it!!!
-     */
-    public byte[] getBases() { return bases; }
-
-    /**
-     * Returns the bases represented by this ReferenceSequence as a String. Since this will copy the bases
-     * and convert them to two-byte characters, this should not be used on very long reference sequences,
-     * but as a convenience when manipulating short sequences returned by
-     * {@link ReferenceSequenceFile#getSubsequenceAt(String, long, long)}
-     *
-     * @return The set of bases represented by this ReferenceSequence, as a String
-     */
-    public String getBaseString() { return StringUtil.bytesToString(bases); }
-
-    /** Gets the 0-based index of this contig in the source file from which it came. */
-    public int getContigIndex() { return contigIndex; }
-
-    /** Gets the length of this reference sequence in bases. */
-    public int length() { return length; }
-    
-    public String toString() {
-        return "ReferenceSequence " + getName();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFile.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFile.java
deleted file mode 100644
index e7d3c28..0000000
--- a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFile.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-
-import java.io.Closeable;
-import java.io.IOException;
-
-/**
- * An interface for working with files of reference sequences regardless of the file format
- * being used.
- *
- * @author Tim Fennell
- */
-public interface ReferenceSequenceFile extends Closeable {
-
-    /**
-     * Must return a sequence dictionary with at least the following fields completed
-     * for each sequence: name, length.
-     *
-     * @return a list of sequence records representing the sequences in this reference file
-     */
-    public SAMSequenceDictionary getSequenceDictionary();
-
-    /**
-     * Retrieves the next whole sequences from the file.
-     * @return a ReferenceSequence or null if at the end of the file
-     */
-    public ReferenceSequence nextSequence();
-
-    /**
-     * Resets the ReferenceSequenceFile so that the next call to nextSequence() will return
-     * the first sequence in the file.
-     */
-    public void reset();
-
-
-    /**
-     * @return true if getSequence and getSubsequenceAt methods are allowed.
-     */
-    public boolean isIndexed();
-
-    /**
-     * Retrieves the complete sequence described by this contig.
-     * @param contig contig whose data should be returned.
-     * @return The full sequence associated with this contig.
-     * @throws UnsupportedOperationException if !sIndexed.
-     */
-    public ReferenceSequence getSequence( String contig );
-
-    /**
-     * Gets the subsequence of the contig in the range [start,stop]
-     * @param contig Contig whose subsequence to retrieve.
-     * @param start inclusive, 1-based start of region.
-     * @param stop inclusive, 1-based stop of region.
-     * @return The partial reference sequence associated with this range.
-     * @throws UnsupportedOperationException if !sIndexed.
-     */
-    public ReferenceSequence getSubsequenceAt( String contig, long start, long stop );
-    
-    /**
-     * @return Reference name, file name, or something other human-readable representation.
-     */
-    public String toString();
-
-    public void close() throws IOException;
-}
diff --git a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java
deleted file mode 100644
index 5978072..0000000
--- a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.nio.file.Path;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Factory class for creating ReferenceSequenceFile instances for reading reference
- * sequences store in various formats.
- *
- * @author Tim Fennell
- */
-public class ReferenceSequenceFileFactory {
-    public static final Set<String> FASTA_EXTENSIONS = new HashSet<String>() {{
-        add(".fasta");
-        add(".fasta.gz");
-        add(".fa");
-        add(".fa.gz");
-        add(".fna");
-        add(".fna.gz");
-        add(".txt");
-        add(".txt.gz");
-    }};
-
-    /**
-     * Attempts to determine the type of the reference file and return an instance
-     * of ReferenceSequenceFile that is appropriate to read it.  Sequence names
-     * will be truncated at first whitespace, if any.
-     *
-     * @param file the reference sequence file on disk
-     */
-    public static ReferenceSequenceFile getReferenceSequenceFile(final File file) {
-        return getReferenceSequenceFile(file, true);
-    }
-
-    /**
-     * Attempts to determine the type of the reference file and return an instance
-     * of ReferenceSequenceFile that is appropriate to read it.
-     *
-     * @param file the reference sequence file on disk
-     * @param truncateNamesAtWhitespace if true, only include the first word of the sequence name
-     */
-    public static ReferenceSequenceFile getReferenceSequenceFile(final File file, final boolean truncateNamesAtWhitespace) {
-        return getReferenceSequenceFile(file, truncateNamesAtWhitespace, true);
-    }
-
-    /**
-     * Attempts to determine the type of the reference file and return an instance
-     * of ReferenceSequenceFile that is appropriate to read it.
-     *
-     * @param file the reference sequence file on disk
-     * @param truncateNamesAtWhitespace if true, only include the first word of the sequence name
-     * @param preferIndexed if true attempt to return an indexed reader that supports non-linear traversal, else return the non-indexed reader
-     */
-    public static ReferenceSequenceFile getReferenceSequenceFile(final File file, final boolean truncateNamesAtWhitespace, final boolean preferIndexed) {
-        return getReferenceSequenceFile(file.toPath(), truncateNamesAtWhitespace, preferIndexed);
-    }
-
-    /**
-     * Attempts to determine the type of the reference file and return an instance
-     * of ReferenceSequenceFile that is appropriate to read it.  Sequence names
-     * will be truncated at first whitespace, if any.
-     *
-     * @param path the reference sequence file on disk
-     */
-    public static ReferenceSequenceFile getReferenceSequenceFile(final Path path) {
-        return getReferenceSequenceFile(path, true);
-    }
-
-    /**
-     * Attempts to determine the type of the reference file and return an instance
-     * of ReferenceSequenceFile that is appropriate to read it.
-     *
-     * @param path the reference sequence file on disk
-     * @param truncateNamesAtWhitespace if true, only include the first word of the sequence name
-     */
-    public static ReferenceSequenceFile getReferenceSequenceFile(final Path path, final boolean truncateNamesAtWhitespace) {
-        return getReferenceSequenceFile(path, truncateNamesAtWhitespace, true);
-    }
-
-    /**
-     * Attempts to determine the type of the reference file and return an instance
-     * of ReferenceSequenceFile that is appropriate to read it.
-     *
-     * @param path the reference sequence file path
-     * @param truncateNamesAtWhitespace if true, only include the first word of the sequence name
-     * @param preferIndexed if true attempt to return an indexed reader that supports non-linear traversal, else return the non-indexed reader
-     */
-    public static ReferenceSequenceFile getReferenceSequenceFile(final Path path, final boolean truncateNamesAtWhitespace, final boolean preferIndexed) {
-        final String name = path.getFileName().toString();
-        for (final String ext : FASTA_EXTENSIONS) {
-            if (name.endsWith(ext)) {
-                // Using faidx requires truncateNamesAtWhitespace
-                if (truncateNamesAtWhitespace && preferIndexed && IndexedFastaSequenceFile.canCreateIndexedFastaReader(path)) {
-                    try {
-                        return new IndexedFastaSequenceFile(path);
-                    }
-                    catch (final FileNotFoundException e) {
-                        throw new IllegalStateException("Should never happen, because existence of files has been checked.", e);
-                    }
-                }
-                else {
-                    return new FastaSequenceFile(path, truncateNamesAtWhitespace);
-                }
-            }
-        }
-
-        throw new IllegalArgumentException("File is not a supported reference file type: " + path.toAbsolutePath());
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileWalker.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileWalker.java
deleted file mode 100644
index d66f0f8..0000000
--- a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileWalker.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-
-import java.io.Closeable;
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Manages a ReferenceSequenceFile.  Loads the requested sequence, ensuring that
- * access is in order, and confirming that sequence name and index agree.
- *
- * @author alecw at broadinstitute.org
- */
-public class ReferenceSequenceFileWalker implements Closeable {
-    private final ReferenceSequenceFile referenceSequenceFile;
-    private ReferenceSequence referenceSequence = null;
-
-    public ReferenceSequenceFileWalker(final ReferenceSequenceFile referenceSequenceFile) {
-        this.referenceSequenceFile = referenceSequenceFile;
-    }
-
-    public ReferenceSequenceFileWalker(final File file) {
-        this(ReferenceSequenceFileFactory.getReferenceSequenceFile(file, true, false));
-    }
-
-    /**
-     * Ensure that the requested sequence is loaded.  Throws an exception if out-of-order
-     * request is made, or if there is a mismatch between the requested name and the name
-     * found in the ReferenceSequenceFile
-     */
-    public ReferenceSequence get(final int sequenceIndex, final String sequenceName, final int length) {
-        // Has the side-effect of setting referenceSequence member
-        get(sequenceIndex);
-        if (!referenceSequence.getName().equals(sequenceName)) {
-            // Sanity check the sequence names against the sequence dictionary while scanning through.
-            throw new SAMException("Sequence name mismatch at sequence index (" + referenceSequence.getContigIndex() +
-                    ", " + referenceSequence.getName() + ") != " + sequenceName);
-        }
-        if (referenceSequence.getBases().length != length) {
-            throw new SAMException("Sequence length mismatch for (" + sequenceIndex + ", " + sequenceName +
-            ").  expected " + length + " but found " + referenceSequence.getBases().length);
-        }
-        return referenceSequence;
-    }
-
-    /**
-     * Get reference sequence without validating name or length.  This is OK if the entire sequence
-     * dictionary was validated before reading sequences.
-     */
-    public ReferenceSequence get(final int sequenceIndex) {
-        if (referenceSequence != null && referenceSequence.getContigIndex() == sequenceIndex) {
-            return referenceSequence;
-        }
-        if (referenceSequence != null && referenceSequence.getContigIndex() > sequenceIndex) {
-            throw new SAMException("Requesting earlier reference sequence: " + sequenceIndex + " < " +
-            referenceSequence.getContigIndex());
-        }
-        referenceSequence = null;
-
-        if(referenceSequenceFile.isIndexed()) {
-            final SAMSequenceRecord samSequenceRecord = referenceSequenceFile.getSequenceDictionary().getSequence(sequenceIndex);
-            if(samSequenceRecord != null) {
-                referenceSequence = referenceSequenceFile.getSequence(samSequenceRecord.getSequenceName()) ;
-            } // else referenceSequence will remain null
-        } else {
-            do {
-                referenceSequence = referenceSequenceFile.nextSequence();
-            }
-            while (referenceSequence != null && referenceSequence.getContigIndex() < sequenceIndex);
-        }
-        if (referenceSequence == null || referenceSequence.getContigIndex() != sequenceIndex) {
-            throw new SAMException("Reference sequence (" + sequenceIndex +
-                    ") not found in " + referenceSequenceFile.toString());
-        }
-        return referenceSequence;
-    }
-
-    public SAMSequenceDictionary getSequenceDictionary() {
-        return referenceSequenceFile.getSequenceDictionary();
-    }
-
-    public void close() throws IOException {
-        referenceSequenceFile.close();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/ByteArraySeekableStream.java b/src/main/java/htsjdk/samtools/seekablestream/ByteArraySeekableStream.java
deleted file mode 100644
index 4f8c322..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/ByteArraySeekableStream.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.IOException;
-
-/**
-* Created by vadim on 23/03/2015.
-*/
-public class ByteArraySeekableStream extends SeekableStream {
-    private byte[] bytes;
-    private long position = 0;
-
-    public ByteArraySeekableStream(byte[] bytes) {
-        this.bytes = bytes;
-    }
-
-    @Override
-    public long length() {
-        return bytes.length;
-    }
-
-    @Override
-    public long position() throws IOException {
-        return position;
-    }
-
-    @Override
-    public void seek(long position) throws IOException {
-        this.position = position;
-    }
-
-    @Override
-    public int read() throws IOException {
-        if (position < bytes.length)
-            return 0xFF & bytes[((int) position++)];
-        else return -1;
-    }
-
-    @Override
-    public int read(byte[] b, int off, int len) throws IOException {
-        if (b == null) {
-            throw new NullPointerException();
-        } else if (off < 0 || len < 0 || len > b.length - off) {
-            throw new IndexOutOfBoundsException();
-        }
-        if (position >= bytes.length) {
-            return -1;
-        }
-        if (position + len > bytes.length) {
-            len = (int) (bytes.length - position);
-        }
-        if (len <= 0) {
-            return 0;
-        }
-        System.arraycopy(bytes, (int) position, b, off, len);
-        position += len;
-        return len;
-    }
-
-    @Override
-    public void close() throws IOException {
-        bytes = null;
-    }
-
-    @Override
-    public boolean eof() throws IOException {
-        return position >= bytes.length;
-    }
-
-    @Override
-    public String getSource() {
-        return null;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/ISeekableStreamFactory.java b/src/main/java/htsjdk/samtools/seekablestream/ISeekableStreamFactory.java
deleted file mode 100644
index dff28b0..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/ISeekableStreamFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package htsjdk.samtools.seekablestream;
-
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * Factory for creating {@link SeekableStream}s based on URLs/paths.
- * Implementations can be set as the default with {@link SeekableStreamFactory#setInstance(ISeekableStreamFactory)}
- * @author jacob
- * @date 2013-Oct-24
- */
-public interface ISeekableStreamFactory {
-
-    public SeekableStream getStreamFor(URL url) throws IOException;
-
-    public SeekableStream getStreamFor(String path) throws IOException;
-
-    /**
-     * Return a buffered {@code SeekableStream} which wraps the input {@code stream}
-     * using the default buffer size
-     * @param stream
-     * @return
-     */
-    public SeekableStream getBufferedStream(SeekableStream stream);
-
-    /**
-     * Return a buffered {@code SeekableStream} which wraps the input {@code stream}
-     * @param stream
-     * @param bufferSize
-     * @return
-     */
-    public SeekableStream getBufferedStream(SeekableStream stream, int bufferSize);
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java
deleted file mode 100644
index 56b4d0c..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A wrapper class to provide buffered read access to a SeekableStream.  Just wrapping such a stream with
- * a BufferedInputStream will not work as it does not support seeking.  In this implementation a
- * seek call is delegated to the wrapped stream, and the buffer reset.
- */
-public class SeekableBufferedStream extends SeekableStream {
-
-    /** Little extension to buffered input stream to give access to the available bytes in the buffer. */
-    private class ExtBufferedInputStream extends BufferedInputStream {
-        private ExtBufferedInputStream(final InputStream inputStream, final int i) {
-            super(inputStream, i);
-        }
-
-        /** Returns the number of bytes that can be read from the buffer without reading more into the buffer. */
-        int getBytesInBufferAvailable() {
-            if (this.count == this.pos) return 0; // documented test for "is buffer empty"
-            else return this.buf.length - this.pos;
-        }
-    }
-
-
-    public static final int DEFAULT_BUFFER_SIZE = 512000;
-
-    final private int bufferSize;
-    final SeekableStream wrappedStream;
-    ExtBufferedInputStream bufferedStream;
-    long position;
-
-    public SeekableBufferedStream(final SeekableStream stream, final int bufferSize) {
-        this.bufferSize = bufferSize;
-        this.wrappedStream = stream;
-        this.position = 0;
-        bufferedStream = new ExtBufferedInputStream(wrappedStream, bufferSize);
-    }
-
-    public SeekableBufferedStream(final SeekableStream stream) {
-        this(stream, DEFAULT_BUFFER_SIZE);
-    }
-
-    public long length() {
-        return wrappedStream.length();
-    }
-
-    @Override
-    public long skip(final long skipLength) throws IOException {
-        if (skipLength < this.bufferedStream.getBytesInBufferAvailable()) {
-            final long retval = this.bufferedStream.skip(skipLength);
-            this.position += retval;
-            return retval;
-        } else {
-            final long position = this.position + skipLength;
-            seek(position);
-            return skipLength;
-        }
-    }
-
-    public void seek(final long position) throws IOException {
-        this.position = position;
-        wrappedStream.seek(position);
-        bufferedStream = new ExtBufferedInputStream(wrappedStream, bufferSize);
-    }
-
-    public int read() throws IOException {
-        int b = bufferedStream.read();
-        position++;
-        return b;
-    }
-
-    public int read(final byte[] buffer, final int offset, final int length) throws IOException {
-        int nBytesRead = bufferedStream.read(buffer, offset, length);
-        if (nBytesRead > 0) {
-            //if we can't read as many bytes as we are asking for then attempt another read to reset the buffer.
-            if (nBytesRead < length) {
-                final int additionalBytesRead = bufferedStream.read(buffer, nBytesRead + offset, length - nBytesRead);
-                //if there were additional bytes read then update nBytesRead
-                if (additionalBytesRead > 0) {
-                    nBytesRead += additionalBytesRead;
-                }
-            }
-            position += nBytesRead;
-        }
-        return nBytesRead;
-    }
-
-    public void close() throws IOException {
-        wrappedStream.close();
-    }
-
-    public boolean eof() throws IOException {
-        return position >= wrappedStream.length();
-    }
-
-    @Override
-    public String getSource() {
-        return wrappedStream.getSource();
-    }
-
-    @Override
-    public long position() throws IOException {
-        return position;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStream.java
deleted file mode 100644
index 0a64a7c..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStream.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard.  All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * Unfortunately the seekable stream classes exist for both Tribble and Picard, and we need both.  This class
- * is for use with Tribble and delegates all the work to a helper.
- *
- * @author jrobinso
- * @date Oct 27, 2010
- */
-public class SeekableFTPStream extends SeekableStream {
-
-    SeekableFTPStreamHelper helper;
-    public SeekableFTPStream(URL url) throws IOException {
-        this(url, null);
-    }
-
-    public SeekableFTPStream(URL url, UserPasswordInput userPasswordInput) throws IOException {
-        helper = new SeekableFTPStreamHelper(url, userPasswordInput);
-    }
-
-    public void seek(long position) {
-        helper.seek(position);
-    }
-
-    public long position() {
-        return helper.position();
-    }
-
-    @Override
-    public boolean eof() throws IOException {
-        return helper.eof();
-    }
-
-    @Override
-    public String getSource() {
-        return null; //TODO
-    }
-
-    @Override
-    public long length() {
-        return helper.length();
-    }
-
-
-    @Override
-    public long skip(long n) throws IOException {
-        return helper.skip(n);
-    }
-
-
-    @Override
-    public int read(byte[] buffer, int offset, int len) throws IOException {
-        return helper.read(buffer, offset, len);
-    }
-
-
-    public void close() throws IOException {
-        helper.close();
-    }
-
-    public int read() throws IOException {
-        return helper.read();
-    }
-
-//    private static final String EXPECTED = "Apache Software Foundation";
-    private static final String EXPECTED1 = "\u00cf\u00ac\u00c9\u0075\u0043\u00d4\u00d5\u0079";
-    private static final String EXPECTED2 = "\u00e4\u006c\u0077\u000c\u0016\u00f1\u0030\u008f";
-    public static void main(String[] args) throws IOException {
-//    	String testURL = (args.length < 1) ? "ftp://apache.cs.utah.edu/apache.org/HEADER.html" : args[0];
-    	String testURL = (args.length < 1) ? "ftp://hgdownload.cse.ucsc.edu/goldenPath/panTro3/vsHg19/panTro3.hg19.all.chain.gz" : args[0];
-        long startPosition = (args.length < 2) ? 0x0b66c78l : Long.parseLong(args[1]);
-        int len = (args.length < 3) ? 8 : Integer.parseInt(args[2]);
-        int skipLen = (args.length < 4) ? 0x18 : Integer.parseInt(args[3]);
-        SeekableStream s = SeekableStreamFactory.getInstance().getStreamFor(testURL);
-        byte[] buffer = new byte[len];
-        s.seek(startPosition);
-        s.read(buffer, 0, len);
-        if (s.position() != startPosition + len && s.position() != s.length()) {
-        	System.out.println("1) updated position is incorrect");
-        }
-        String data = new String(buffer);
-        System.out.println("1) read:" + data);
-        if (args.length == 0) {
-            System.out.println("1) expected:" + EXPECTED1);
-            System.out.println("1) values do" + (EXPECTED1.equals(data) ? "" : " not") + " match");
-        }
-        s.skip(skipLen);
-        s.read(buffer, 0, len);
-        if (s.position() != startPosition + 2 * len + skipLen && s.position() != s.length()) {
-        	System.out.println("2) updated position is incorrect");
-        }
-        String data2 = new String(buffer);
-        System.out.println("2) read:" + data2);
-        if (args.length == 0) {
-            System.out.println("2) expected:" + EXPECTED2);
-            System.out.println("2) values do" + (EXPECTED2.equals(data2) ? "" : " not") + " match");
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStreamHelper.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStreamHelper.java
deleted file mode 100644
index 10b1391..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStreamHelper.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard.  All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.util.ftp.FTPClient;
-import htsjdk.samtools.util.ftp.FTPReply;
-import htsjdk.samtools.util.ftp.FTPUtils;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * @author jrobinso
- * @date Oct 27, 2010
- */
-public class SeekableFTPStreamHelper {
-
-    private long position = 0;
-    private long contentLength = -1;
-    private String host;
-    private String path;
-    private String userInfo;
-    FTPClient ftp = null;
-    private UserPasswordInput userPasswordInput;
-
-    SeekableFTPStreamHelper(URL url, UserPasswordInput userPasswordInput) throws IOException {
-        this.userInfo = url.getUserInfo();
-        this.host = url.getHost();
-        this.path = url.getPath();
-        this.userPasswordInput = userPasswordInput;
-        ftp = FTPUtils.connect(host, userInfo, userPasswordInput);
-
-        ftp.binary();
-        FTPReply reply = ftp.size(path);
-        if(reply.isSuccess()) {
-            contentLength = Long.parseLong(reply.getReplyString());
-        }
-
-    }
-
-    public void seek(long position) {
-        this.position = position;
-    }
-
-    public long position() {
-        return position;
-    }
-
-    public boolean eof() throws IOException {
-        return false;
-    }
-
-    public long length() {
-        return contentLength;
-    }
-
-
-    public long skip(long n) throws IOException {
-        long bytesToSkip = n;
-        position += bytesToSkip;
-        if (ftp != null) {
-            ftp.setRestPosition(position);
-        }
-        return bytesToSkip;
-    }
-
-    public int read(byte[] buffer, int offset, int len) throws IOException {
-
-        if (ftp == null) {
-            ftp = FTPUtils.connect(host, userInfo, userPasswordInput);
-        }
-
-        if (offset < 0 || len < 0 || (offset + len) > buffer.length) {
-            throw new IndexOutOfBoundsException();
-        }
-
-        if (len == 0) {
-            return 0;
-        }
-
-        int n = 0;
-        try {
-
-            FTPReply reply = ftp.pasv();
-
-            // If we are positioned at or beyond the EOF return -1
-            if(contentLength >= 0 && position >= contentLength) {
-                return -1;
-            }
-
-            if (position > 0) ftp.setRestPosition(position);
-
-            reply = ftp.retr(path);
-
-            InputStream is = ftp.getDataStream();
-
-            while (n < len) {
-                int count = is.read(buffer, offset + n, len - n);
-                if (count < 0) {
-                    if (n == 0) {
-                        return -1;
-                    } else {
-                        break;
-                    }
-                }
-                n += count;
-            }
-
-            position += n;
-
-            return n;
-        } catch (EOFException e) {
-            if (n < 0) {
-                return -1;
-            } else {
-                position += n;
-                return n;
-            }
-        } finally {
-            // ALWAYS close ftp connection,  this is more robust than trying to resue them,
-            // and we don't want open connections hanging about
-            ftp.disconnect();
-            ftp = null;
-        }
-    }
-
-
-    private void reconnect() throws IOException {
-        if (ftp != null) {
-            ftp.disconnect();
-        }
-        ftp = FTPUtils.connect(host, userInfo, userPasswordInput);
-    }
-
-
-    public void close() throws IOException {
-        if (ftp != null) {
-            ftp.disconnect();
-            ftp = null;
-        }
-    }
-
-
-    public int read() throws IOException {
-        throw new UnsupportedOperationException("read() is not supported on SeekableHTTPStream.  Must read in blocks.");
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableFileStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableFileStream.java
deleted file mode 100644
index 38191d7..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableFileStream.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 2007-2009 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-package htsjdk.samtools.seekablestream;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-
-/**
- *
- * @author jrobinso
- */
-public class SeekableFileStream extends SeekableStream {
-
-    /**
-     * Collection of all open instances.  SeekableFileStream objects are usually open and kept open for the
-     * duration of a session.  This collection supports a method to close them all.
-     */
-    static Collection<SeekableFileStream> allInstances =
-            Collections.synchronizedCollection(new HashSet<SeekableFileStream>());
-
-
-    File file;
-    RandomAccessFile fis;
-
-    public SeekableFileStream(final File file) throws FileNotFoundException {
-        this.file = file;
-        fis = new RandomAccessFile(file, "r");
-        allInstances.add(this);
-    }
-
-    public long length() {
-        return file.length();
-    }
-
-    public boolean eof() throws IOException {
-        return fis.length() == fis.getFilePointer();
-    }
-
-    public void seek(final long position) throws IOException {
-        fis.seek(position);
-    }
-
-    public long position() throws IOException {
-        return fis.getChannel().position();
-    }
-
-    @Override
-    public long skip(long n) throws IOException {
-        long initPos = position();
-        fis.getChannel().position(initPos + n);
-        return position() - initPos;
-    }
-    
-    public int read(final byte[] buffer, final int offset, final int length) throws IOException {
-        if (length < 0) {
-            throw new IndexOutOfBoundsException();
-        }
-        int n = 0;
-        while (n < length) {
-            final int count = fis.read(buffer, offset + n, length - n);
-            if (count < 0) {
-              if (n > 0) {
-                return n;
-              } else {
-                return count;
-              }
-            }
-            n += count;
-        }
-        return n;
-
-    }
-
-    public int read() throws IOException {
-        return fis.read();  
-    }
-
-    @Override
-    public int read(byte[] b) throws IOException {
-        return fis.read(b);
-    }
-
-    @Override
-    public String getSource() {
-        return file.getAbsolutePath();
-    }
-
-
-    public void close() throws IOException {
-        allInstances.remove(this);
-        fis.close();
-
-    }
-
-    public static synchronized void closeAllInstances() {
-        Collection<SeekableFileStream> clonedInstances = new HashSet<SeekableFileStream>();
-        clonedInstances.addAll(allInstances);
-        for (SeekableFileStream sfs : clonedInstances) {
-            try {
-                sfs.close();
-            } catch (IOException e) {
-                //TODO
-                //log.error("Error closing SeekableFileStream", e);
-            }
-        }
-        allInstances.clear();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableHTTPStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableHTTPStream.java
deleted file mode 100644
index 4a864b7..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableHTTPStream.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.util.HttpUtils;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.Proxy;
-import java.net.URL;
-
-/**
- * @author jrobinso
- */
-public class SeekableHTTPStream extends SeekableStream {
-
-    private long position = 0;
-    private long contentLength = -1;
-    private final URL url;
-    private final Proxy proxy;
-
-    public SeekableHTTPStream(final URL url) {
-        this(url, null);
-
-    }
-
-    public SeekableHTTPStream(final URL url, Proxy proxy) {
-
-        this.proxy = proxy;
-        this.url = url;
-
-        // Try to get the file length
-        // Note: This also sets setDefaultUseCaches(false), which is important
-        final String contentLengthString = HttpUtils.getHeaderField(url, "Content-Length");
-        if (contentLengthString != null) {
-            try {
-                contentLength = Long.parseLong(contentLengthString);
-            }
-            catch (NumberFormatException ignored) {
-                System.err.println("WARNING: Invalid content length (" + contentLengthString + "  for: " + url);
-                contentLength = -1;
-            }
-        }
-
-    }
-
-    public long position() {
-        return position;
-    }
-
-    public long length() {
-        return contentLength;
-    }
-
-    @Override
-    public long skip(long n) throws IOException {
-        long bytesToSkip = Math.min(n, contentLength - position);
-        position += bytesToSkip;
-        return bytesToSkip;
-    }
-
-    public boolean eof() throws IOException {
-        return contentLength > 0 && position >= contentLength;
-    }
-
-    public void seek(final long position) {
-        this.position = position;
-    }
-
-    public int read(byte[] buffer, int offset, int len) throws IOException {
-
-        if (offset < 0 || len < 0 || (offset + len) > buffer.length) {
-            throw new IndexOutOfBoundsException("Offset="+offset+",len="+len+",buflen="+buffer.length);
-        }
-        if (len == 0 || position == contentLength) {
-            return 0;
-        }
-
-        HttpURLConnection connection = null;
-        InputStream is = null;
-        String byteRange = "";
-        int n = 0;
-        try {
-            connection = proxy == null ?
-                    (HttpURLConnection) url.openConnection() :
-                    (HttpURLConnection) url.openConnection(proxy);
-
-            long endRange = position + len - 1;
-            // IF we know the total content length, limit the end range to that.
-            if (contentLength > 0) {
-                endRange = Math.min(endRange, contentLength);
-            }
-            byteRange = "bytes=" + position + "-" + endRange;
-            connection.setRequestProperty("Range", byteRange);
-
-            is = connection.getInputStream();
-
-            while (n < len) {
-                int count = is.read(buffer, offset + n, len - n);
-                if (count < 0) {
-                    if (n == 0) {
-                        return -1;
-                    } else {
-                        break;
-                    }
-                }
-                n += count;
-            }
-
-            position += n;
-
-            return n;
-
-        }
-
-        catch (IOException e) {
-            // THis is a bit of a hack, but its not clear how else to handle this.  If a byte range is specified
-            // that goes past the end of the file the response code will be 416.  The MAC os translates this to
-            // an IOException with the 416 code in the message.  Windows translates the error to an EOFException.
-            //
-            //  The BAM file iterator  uses the return value to detect end of file (specifically looks for n == 0).
-            if (e.getMessage().contains("416") || (e instanceof EOFException)) {
-                if (n == 0) {
-                    return -1;
-                } else {
-                    position += n;
-                    // As we are at EOF, the contentLength and position are by definition =
-                    contentLength = position;
-                    return n;
-                }
-            } else {
-                throw e;
-            }
-
-        }
-
-        finally {
-            if (is != null) {
-                is.close();
-            }
-            if (connection != null) {
-                connection.disconnect();
-            }
-        }
-    }
-
-
-    public void close() throws IOException {
-        // Nothing to do
-    }
-
-
-    public int read() throws IOException {
-    	byte []tmp=new byte[1];
-    	read(tmp,0,1);
-    	return (int) tmp[0] & 0xFF; 
-    }
-
-    @Override
-    public String getSource() {
-        return url.toString();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableMemoryStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableMemoryStream.java
deleted file mode 100644
index 37a5ab4..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableMemoryStream.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package htsjdk.samtools.seekablestream;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-public class SeekableMemoryStream extends SeekableStream {
-    private final ByteBuffer buf;
-    private final String source;
-
-    public SeekableMemoryStream(final byte[] data, final String source) {
-        this.buf = ByteBuffer.wrap(data);
-        this.source = source;
-    }
-
-    @Override
-    public void close() throws IOException {
-        buf.clear();
-    }
-
-    @Override
-    public boolean eof() throws IOException {
-        return buf.position() == buf.limit();
-    }
-
-    @Override
-    public String getSource() {
-        return source;
-    }
-
-    @Override
-    public long length() {
-        return buf.array().length - buf.arrayOffset();
-    }
-
-    @Override
-    public int read(final byte[] buffer, final int offset, final int length) throws IOException {
-        int availableLength = Math.min(length, buf.remaining());
-        if (availableLength < 1) {
-            return -1;
-        }
-        buf.get(buffer, offset, availableLength);
-        return availableLength;
-    }
-
-    @Override
-    public void seek(final long position) throws IOException {
-        buf.position((int) position);
-    }
-
-    @Override
-    public int read() throws IOException {
-        if (buf.position() < buf.limit()) {
-            return buf.get() & 0xFF;
-        } else {
-            return -1;
-        }
-    }
-
-    @Override
-    public long position() throws IOException {
-        return buf.position();
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekablePathStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekablePathStream.java
deleted file mode 100644
index 18a41e7..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekablePathStream.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.util.Log;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.SeekableByteChannel;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-
-/**
- * An implementation of {@link SeekableStream} for {@link Path}.
- */
-public class SeekablePathStream extends SeekableStream {
-
-    private final static Log LOG = Log.getInstance(SeekablePathStream.class);
-
-    /**
-     * Collection of all open instances.  SeekablePathStream objects are usually open and kept open for the
-     * duration of a session.  This collection supports a method to close them all.
-     */
-    private static final Collection<SeekablePathStream> ALL_INSTANCES =
-            Collections.synchronizedCollection(new HashSet<SeekablePathStream>());
-
-    private final Path path;
-    private final SeekableByteChannel sbc;
-    private final ByteBuffer oneByteBuf = ByteBuffer.allocate(1);
-
-    public SeekablePathStream(final Path path) throws IOException {
-        this.path = path;
-        this.sbc = Files.newByteChannel(path);
-        ALL_INSTANCES.add(this);
-    }
-
-    @Override
-    public long length() {
-        try {
-            return sbc.size();
-        } catch (IOException e) {
-            LOG.error("Cannot find length of path: " + path, e);
-            return 0; // consistent with java.io.File
-        }
-    }
-
-    @Override
-    public boolean eof() throws IOException {
-        return length() == position();
-    }
-
-    @Override
-    public void seek(final long position) throws IOException {
-        sbc.position(position);
-    }
-
-    @Override
-    public long position() throws IOException {
-        return sbc.position();
-    }
-
-    @Override
-    public long skip(long n) throws IOException {
-        long initPos = position();
-        sbc.position(initPos + n);
-        return position() - initPos;
-    }
-
-    @Override
-    public int read(final byte[] buffer, final int offset, final int length) throws IOException {
-        if (length < 0) {
-            throw new IndexOutOfBoundsException();
-        }
-        ByteBuffer buf = ByteBuffer.wrap(buffer, offset, length);
-        int n = 0;
-        while (n < length) {
-            final int count = sbc.read(buf);
-            if (count < 0) {
-              if (n > 0) {
-                return n;
-              } else {
-                return count;
-              }
-            }
-            n += count;
-        }
-        return n;
-    }
-
-    @Override
-    public int read() throws IOException {
-        oneByteBuf.clear();
-        int n = sbc.read(oneByteBuf);
-        return n == 1 ? oneByteBuf.array()[0] & 0xff : n;
-    }
-
-    @Override
-    public String getSource() {
-        return path.toAbsolutePath().toString();
-    }
-
-
-    @Override
-    public void close() throws IOException {
-        ALL_INSTANCES.remove(this);
-        sbc.close();
-    }
-
-    public static synchronized void closeAllInstances() {
-        Collection<SeekablePathStream> clonedInstances = new HashSet<SeekablePathStream>();
-        clonedInstances.addAll(ALL_INSTANCES);
-        for (SeekablePathStream sfs : clonedInstances) {
-            try {
-                sfs.close();
-            } catch (IOException e) {
-                LOG.error("Error closing SeekablePathStream", e);
-            }
-        }
-        ALL_INSTANCES.clear();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableStream.java
deleted file mode 100644
index 673f08c..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableStream.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-
-public abstract class SeekableStream extends InputStream {
-
-    public abstract long length();
-
-    public abstract long position() throws IOException;
-
-    public abstract void seek(long position) throws IOException;
-
-    public abstract int read(byte[] buffer, int offset, int length) throws IOException;
-
-    public abstract void close() throws IOException;
-
-    public abstract boolean eof() throws IOException;
-
-    /**
-     * @return String representation of source (e.g. URL, file path, etc.), or null if not available.
-     */
-    public abstract String getSource();
-
-    /**
-     * Read enough bytes to fill the input buffer.
-     * @param b
-     * @throws EOFException If EOF is reached before buffer is filled
-     */
-    public void readFully(byte b[]) throws IOException {
-        int len = b.length;
-        if (len < 0){
-            throw new IndexOutOfBoundsException();
-        }
-        int n = 0;
-        while (n < len) {
-            int count = read(b, n, len - n);
-            if (count < 0){
-                throw new EOFException();
-            }
-            n += count;
-        }
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableStreamFactory.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableStreamFactory.java
deleted file mode 100644
index fe8f42a..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableStreamFactory.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * Singleton class for getting {@link SeekableStream}s from URL/paths
- * Applications using this library can set their own factory
- * @author jrobinso
- * @date Nov 30, 2009
- */
-public class SeekableStreamFactory{
-
-    private static final ISeekableStreamFactory DEFAULT_FACTORY;
-    private static ISeekableStreamFactory currentFactory;
-
-    static{
-        DEFAULT_FACTORY = new DefaultSeekableStreamFactory();
-        currentFactory = DEFAULT_FACTORY;
-    }
-
-    private SeekableStreamFactory(){}
-
-    public static void setInstance(final ISeekableStreamFactory factory){
-        currentFactory = factory;
-    }
-
-    public static ISeekableStreamFactory getInstance(){
-        return currentFactory;
-    }
-
-    /**
-     * Does this path point to a regular file on disk and not something like a URL?
-     * @param path the path to test
-     * @return true if the path is to a file on disk
-     */
-    public static boolean isFilePath(final String path) {
-        return ! ( path.startsWith("http:") || path.startsWith("https:") || path.startsWith("ftp:") );
-    }
-
-    private static class DefaultSeekableStreamFactory implements ISeekableStreamFactory {
-
-        public SeekableStream getStreamFor(final URL url) throws IOException {
-            return getStreamFor(url.toExternalForm());
-        }
-
-        public SeekableStream getStreamFor(final String path) throws IOException {
-            // todo -- add support for SeekableBlockInputStream
-
-            if (path.startsWith("http:") || path.startsWith("https:")) {
-                final URL url = new URL(path);
-                return new SeekableHTTPStream(url);
-            } else if (path.startsWith("ftp:")) {
-                return new SeekableFTPStream(new URL(path));
-            } else if (path.startsWith("file:")) {
-                return new SeekableFileStream(new File(new URL(path).getPath()));
-            } else {
-                return new SeekableFileStream(new File(path));
-            }
-        }
-
-        public SeekableStream getBufferedStream(SeekableStream stream){
-            return getBufferedStream(stream, SeekableBufferedStream.DEFAULT_BUFFER_SIZE);
-        }
-
-        public SeekableStream getBufferedStream(SeekableStream stream, int bufferSize){
-            if (bufferSize == 0) return stream;
-            else return new SeekableBufferedStream(stream, bufferSize);
-        }
-
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/UserPasswordInput.java b/src/main/java/htsjdk/samtools/seekablestream/UserPasswordInput.java
deleted file mode 100644
index eda1ef2..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/UserPasswordInput.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-public interface UserPasswordInput {
-	public void setHost(String host);
-    public boolean showDialog();
-    public String getUser();
-    public String getPassword();
-}
diff --git a/src/main/java/htsjdk/samtools/sra/ReferenceCache.java b/src/main/java/htsjdk/samtools/sra/ReferenceCache.java
deleted file mode 100644
index 9eb389a..0000000
--- a/src/main/java/htsjdk/samtools/sra/ReferenceCache.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.SAMFileHeader;
-import ngs.ErrorMsg;
-import ngs.ReadCollection;
-import ngs.Reference;
-
-
-/**
- * That is a thread-safe wrapper for a list of cache Reference objects.
- * Those objects can be used from different threads without issues, however to load and save a Reference object, we
- * need to acquire a lock.
- *
- * Created by andrii.nikitiuk on 10/28/15.
- */
-public class ReferenceCache {
-    private ReadCollection run;
-    private SAMFileHeader virtualHeader;
-    private Reference cachedReference;
-
-    public ReferenceCache(ReadCollection run, SAMFileHeader virtualHeader) {
-        this.run = run;
-        this.virtualHeader = virtualHeader;
-    }
-
-    /**
-     * This method returns Reference objects by reference indexes in SAM header
-     * Those objects do not maintain thread safety
-     *
-     * @param referenceIndex reference index in
-     * @return a Reference object
-     */
-    public Reference get(int referenceIndex) {
-        String contig = virtualHeader.getSequence(referenceIndex).getSequenceName();
-
-        try {
-            if (cachedReference == null || !cachedReference.getCanonicalName().equals(contig)) {
-                cachedReference = run.getReference(contig);
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-
-        return cachedReference;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/sra/SRAAccession.java b/src/main/java/htsjdk/samtools/sra/SRAAccession.java
deleted file mode 100644
index 9aeb10f..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRAAccession.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*===========================================================================
-*
-*                            PUBLIC DOMAIN NOTICE
-*               National Center for Biotechnology Information
-*
-*  This software/database is a "United States Government Work" under the
-*  terms of the United States Copyright Act.  It was written as part of
-*  the author's official duties as a United States Government employee and
-*  thus cannot be copyrighted.  This software/database is freely available
-*  to the public for use. The National Library of Medicine and the U.S.
-*  Government have not placed any restriction on its use or reproduction.
-*
-*  Although all reasonable efforts have been taken to ensure the accuracy
-*  and reliability of the software and data, the NLM and the U.S.
-*  Government do not and cannot warrant the performance or results that
-*  may be obtained by using this software or data. The NLM and the U.S.
-*  Government disclaim all warranties, express or implied, including
-*  warranties of performance, merchantability or fitness for any particular
-*  purpose.
-*
-*  Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-import gov.nih.nlm.ncbi.ngs.error.LibraryLoadError;
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.util.Log;
-import gov.nih.nlm.ncbi.ngs.NGS;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.Arrays;
-
-/**
- * Describes a single SRA accession for SRA read collection
- * Also provides app string functionality and allows to check if working SRA is supported on the running platform
- *
- * Important: due to checks performed in SRAAccession.isValid(), we won't recognise any accessions other
- * than ones that follow the pattern "^[SED]RR[0-9]{6,9}$", e.g. SRR000123
- */
-public class SRAAccession implements Serializable {
-    private static final Log log = Log.getInstance(SRAAccession.class);
-
-    private static boolean noLibraryDownload;
-    private static boolean initTried = false;
-    private static String appVersionString = null;
-    private final static String defaultAppVersionString = "[unknown software]";
-    private final static String htsJdkVersionString = "HTSJDK-NGS";
-
-    static final String REMOTE_ACCESSION_PATTERN = "^[SED]RR[0-9]{6,9}$";
-
-    private String acc;
-
-    static {
-        noLibraryDownload = !Defaults.SRA_LIBRARIES_DOWNLOAD;
-        if (noLibraryDownload) {
-            System.setProperty("vdb.System.noLibraryDownload", "1");
-        }
-    }
-
-    /**
-     * Sets an app version string which will let SRA know which software uses it.
-     * @param appVersionString a string that describes running application
-     */
-    public static void setAppVersionString(String appVersionString) {
-        SRAAccession.appVersionString = appVersionString;
-    }
-
-    /**
-     * @return true if SRA successfully loaded native libraries and fully initialized,
-     * false otherwise
-     * @deprecated use {@link #checkIfInitialized} instead
-     */
-    @Deprecated
-    public static boolean isSupported() {
-        return checkIfInitialized() == null;
-    }
-
-    /**
-     * Tries to initialize SRA. Initialization error is saved during first call,
-     * all subsequent calls will return the same saved error or null.
-     *
-     * @return ExceptionInInitializerError if initialization failed, null if initialization was successful
-     */
-    public static ExceptionInInitializerError checkIfInitialized() {
-        final ExceptionInInitializerError ngsInitError;
-        if (!initTried) {
-            log.debug("Initializing SRA module");
-            ngsInitError = NGS.getInitializationError();
-            if (ngsInitError != null) {
-                log.info("SRA initialization failed. Will not be able to read from SRA");
-            } else {
-                NGS.setAppVersionString(getFullVersionString());
-            }
-            initTried = true;
-        } else {
-            ngsInitError = NGS.getInitializationError();
-        }
-        return ngsInitError;
-    }
-
-    /**
-     * @param acc accession
-     * @return true if a string is a valid SRA accession
-     */
-    public static boolean isValid(String acc) {
-        boolean looksLikeSRA = false;
-        File f = new File(acc);
-        if (f.isFile()) {
-            byte[] buffer = new byte[8];
-            byte[] signature1 = "NCBI.sra".getBytes();
-            byte[] signature2 = "NCBInenc".getBytes();
-
-            try (InputStream is = new FileInputStream(f)) {
-                int numRead = is.read(buffer);
-
-                looksLikeSRA = numRead == buffer.length &&
-                        (Arrays.equals(buffer, signature1) || Arrays.equals(buffer, signature2));
-            } catch (IOException e) {
-                looksLikeSRA = false;
-            }
-        } else if (f.exists()) {
-            // anything else local other than a file is not an SRA archive
-            looksLikeSRA = false;
-        } else {
-            looksLikeSRA = acc.toUpperCase().matches ( REMOTE_ACCESSION_PATTERN );
-        }
-
-        if (!looksLikeSRA) return false;
-
-        final ExceptionInInitializerError initError = checkIfInitialized();
-        if (initError != null) {
-            if (noLibraryDownload && initError instanceof LibraryLoadError) {
-                throw new LinkageError(
-                        "Failed to load SRA native libraries and auto-download is disabled. " +
-                        "Please re-run with JVM argument -Dsamjdk.sra_libraries_download=true to enable auto-download of native libraries",
-                        initError
-                );
-            } else {
-                throw initError;
-            }
-        }
-
-        return NGS.isValid(acc);
-    }
-
-    /**
-     * @param acc accession
-     */
-    public SRAAccession(String acc) {
-        this.acc = acc;
-    }
-
-    public String toString() {
-        return acc;
-    }
-
-    /**
-     * @return true if contained string is an SRA accession
-     */
-    public boolean isValid() {
-        return SRAAccession.isValid(acc);
-    }
-
-    private static String getFullVersionString() {
-        String versionString = appVersionString == null ? defaultAppVersionString : appVersionString;
-        versionString += " through " + htsJdkVersionString;
-        return versionString;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/sra/SRAAlignmentIterator.java b/src/main/java/htsjdk/samtools/sra/SRAAlignmentIterator.java
deleted file mode 100644
index 650ddce..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRAAlignmentIterator.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*===========================================================================
-*
-*                            PUBLIC DOMAIN NOTICE
-*               National Center for Biotechnology Information
-*
-*  This software/database is a "United States Government Work" under the
-*  terms of the United States Copyright Act.  It was written as part of
-*  the author's official duties as a United States Government employee and
-*  thus cannot be copyrighted.  This software/database is freely available
-*  to the public for use. The National Library of Medicine and the U.S.
-*  Government have not placed any restriction on its use or reproduction.
-*
-*  Although all reasonable efforts have been taken to ensure the accuracy
-*  and reliability of the software and data, the NLM and the U.S.
-*  Government do not and cannot warrant the performance or results that
-*  may be obtained by using this software or data. The NLM and the U.S.
-*  Government disclaim all warranties, express or implied, including
-*  warranties of performance, merchantability or fitness for any particular
-*  purpose.
-*
-*  Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SRAIterator;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.util.CloseableIterator;
-import ngs.Alignment;
-import ngs.AlignmentIterator;
-import ngs.ErrorMsg;
-import ngs.ReadCollection;
-import ngs.Reference;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-
-/**
- * Iterator for aligned reads.
- * Is used from SRAIterator.
- * Created by andrii.nikitiuk on 9/3/15.
- */
-public class SRAAlignmentIterator implements CloseableIterator<SAMRecord> {
-    private ValidationStringency validationStringency;
-
-    private SRAAccession accession;
-    private ReadCollection run;
-    private SAMFileHeader header;
-    private ReferenceCache cachedReferences;
-    private List<Long> referencesLengths;
-    private Iterator<Chunk> referencesChunksIterator;
-    private int currentReference = -1;
-
-    private boolean hasMoreReferences = true;
-
-    private AlignmentIterator alignedIterator;
-    private Boolean hasMoreAlignments = false;
-
-    private SRALazyRecord lastRecord;
-
-    /**
-     * @param run opened read collection
-     * @param header sam header
-     * @param cachedReferences list of cached references shared among all iterators from a single SRAFileReader
-     * @param recordRangeInfo info about record ranges withing SRA archive
-     * @param chunk used to determine which alignments the iterator should return
-     */
-    public SRAAlignmentIterator(SRAAccession accession, final ReadCollection run, final SAMFileHeader header, ReferenceCache cachedReferences,
-                                final SRAIterator.RecordRangeInfo recordRangeInfo, final Chunk chunk) {
-        this.accession = accession;
-        this.run = run;
-        this.header = header;
-        this.cachedReferences = cachedReferences;
-        this.referencesLengths = recordRangeInfo.getReferenceLengthsAligned();
-
-        referencesChunksIterator = getReferenceChunks(chunk).iterator();
-
-        try {
-            nextReference();
-        } catch (final Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public boolean hasNext() {
-        // check aligned
-        if (lastRecord != null) {
-            lastRecord.detachFromIterator();
-            lastRecord = null;
-        }
-
-        if (hasMoreAlignments == null) {
-            try {
-                hasMoreAlignments = alignedIterator.nextAlignment();
-            } catch (ErrorMsg e) {
-                throw new RuntimeException(e);
-            }
-        }
-        while (!hasMoreAlignments && hasMoreReferences) {
-            nextReference();
-        }
-
-        return hasMoreAlignments;
-    }
-
-    @Override
-    public SAMRecord next() {
-        if (!hasNext()) {
-            throw new NoSuchElementException("No more alignments are available");
-        }
-
-        return nextAlignment();
-    }
-
-    @Override
-    public void remove() {
-        throw new UnsupportedOperationException("Removal of records not implemented.");
-    }
-
-    public void setValidationStringency(ValidationStringency validationStringency) {
-        this.validationStringency = validationStringency;
-    }
-
-    private SAMRecord nextAlignment() {
-        try {
-            lastRecord = new SRALazyRecord(header, accession, run, alignedIterator, alignedIterator.getReadId(), alignedIterator.getAlignmentId());
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-        if (validationStringency != null) {
-            lastRecord.setValidationStringency(validationStringency);
-        }
-
-        hasMoreAlignments = null;
-
-        return lastRecord;
-    }
-
-    private void nextReference() {
-        if (!hasMoreReferences) {
-            throw new NoSuchElementException("Cannot get next reference - already at last one");
-        }
-
-        try {
-            alignedIterator = null;
-            hasMoreAlignments = false;
-
-            hasMoreReferences = referencesChunksIterator.hasNext();
-            if (!hasMoreReferences) {
-                return;
-            }
-
-            currentReference++;
-            Chunk refChunk = referencesChunksIterator.next();
-            if (refChunk == null) {
-                return;
-            }
-
-            Reference reference = cachedReferences.get(currentReference);
-
-            alignedIterator = reference.getFilteredAlignmentSlice(
-                    refChunk.getChunkStart(), refChunk.getChunkEnd() - refChunk.getChunkStart(),
-                    Alignment.all, Alignment.startWithinSlice | Alignment.passDuplicates | Alignment.passFailed, 0);
-
-            hasMoreAlignments = alignedIterator.nextAlignment();
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private List<Chunk> getReferenceChunks(final Chunk chunk) {
-        List<Chunk> referencesChunks = new ArrayList<Chunk>();
-        long refOffset = 0;
-        for (Long refLen : referencesLengths) {
-            if (chunk.getChunkStart() - refOffset >= refLen || chunk.getChunkEnd() - refOffset <= 0) {
-                referencesChunks.add(null);
-            } else {
-                long refChunkStart = Math.max(chunk.getChunkStart() - refOffset, 0);
-                long refChunkEnd = Math.min(chunk.getChunkEnd() - refOffset, refLen);
-                referencesChunks.add(new Chunk(refChunkStart, refChunkEnd));
-            }
-
-            refOffset += refLen;
-        }
-
-        return referencesChunks;
-    }
-
-    @Override
-    public void close() {
-        if (lastRecord != null) {
-            lastRecord.detachFromIterator();
-            lastRecord = null;
-        }
-
-        alignedIterator = null;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/sra/SRAIndexedSequenceFile.java b/src/main/java/htsjdk/samtools/sra/SRAIndexedSequenceFile.java
deleted file mode 100644
index 1d9a471..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRAIndexedSequenceFile.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import ngs.ErrorMsg;
-import ngs.ReadCollection;
-import ngs.Reference;
-import ngs.ReferenceIterator;
-
-import java.io.IOException;
-import java.util.Iterator;
-
-/**
- * Allows reading Reference data from SRA
- */
-public class SRAIndexedSequenceFile implements ReferenceSequenceFile {
-    private SRAAccession acc;
-    private ReadCollection run;
-    private Reference cachedReference;
-
-    private Iterator<SAMSequenceRecord> sequenceRecordIterator;
-
-    protected SAMSequenceDictionary sequenceDictionary;
-
-    /**
-     * @param acc accession
-     */
-    public SRAIndexedSequenceFile(SRAAccession acc) {
-        this.acc = acc;
-
-        if (!acc.isValid()) {
-            throw new RuntimeException("Passed an invalid SRA accession into SRA reader: " + acc);
-        }
-
-        try {
-            run = gov.nih.nlm.ncbi.ngs.NGS.openReadCollection(acc.toString());
-            sequenceDictionary = loadSequenceDictionary();
-        } catch (final ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-
-        reset();
-    }
-
-    @Override
-    public SAMSequenceDictionary getSequenceDictionary() {
-        return sequenceDictionary;
-    }
-
-    @Override
-    public ReferenceSequence nextSequence() {
-        SAMSequenceRecord sequence = sequenceRecordIterator.next();
-        return getSubsequenceAt(sequence.getSequenceName(), 1L, sequence.getSequenceLength());
-    }
-
-    @Override
-    public void reset() {
-        sequenceRecordIterator = sequenceDictionary.getSequences().iterator();
-    }
-
-    @Override
-    public boolean isIndexed() {
-        return true;
-    }
-
-    @Override
-    public ReferenceSequence getSequence(String contig) {
-        return getSubsequenceAt(contig, 1L, sequenceDictionary.getSequence(contig).getSequenceLength());
-    }
-
-    @Override
-    public ReferenceSequence getSubsequenceAt(String contig, long start, long stop) {
-        SAMSequenceRecord sequence = sequenceDictionary.getSequence(contig);
-        int referenceIndex = sequence.getSequenceIndex();
-
-        byte[] bases;
-
-        try {
-            Reference reference;
-            synchronized (this) {
-                if (cachedReference == null || !cachedReference.getCanonicalName().equals(contig)) {
-                    cachedReference = run.getReference(contig);
-                }
-                reference = cachedReference;
-
-                bases = reference.getReferenceBases(start - 1, stop - (start - 1)).getBytes();
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-
-        return new ReferenceSequence(contig, referenceIndex, bases);
-    }
-
-    @Override
-    public void close() throws IOException {
-        cachedReference = null;
-    }
-
-    protected SAMSequenceDictionary loadSequenceDictionary() throws ErrorMsg {
-        SAMSequenceDictionary dict = new SAMSequenceDictionary();
-
-        ReferenceIterator itRef = run.getReferences();
-        while (itRef.nextReference()) {
-            dict.addSequence(new SAMSequenceRecord(itRef.getCanonicalName(), (int) itRef.getLength()));
-        }
-
-        return dict;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/sra/SRALazyRecord.java b/src/main/java/htsjdk/samtools/sra/SRALazyRecord.java
deleted file mode 100644
index 4391857..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRALazyRecord.java
+++ /dev/null
@@ -1,1056 +0,0 @@
-/*===========================================================================
-*
-*                            PUBLIC DOMAIN NOTICE
-*               National Center for Biotechnology Information
-*
-*  This software/database is a "United States Government Work" under the
-*  terms of the United States Copyright Act.  It was written as part of
-*  the author's official duties as a United States Government employee and
-*  thus cannot be copyrighted.  This software/database is freely available
-*  to the public for use. The National Library of Medicine and the U.S.
-*  Government have not placed any restriction on its use or reproduction.
-*
-*  Although all reasonable efforts have been taken to ensure the accuracy
-*  and reliability of the software and data, the NLM and the U.S.
-*  Government do not and cannot warrant the performance or results that
-*  may be obtained by using this software or data. The NLM and the U.S.
-*  Government disclaim all warranties, express or implied, including
-*  warranties of performance, merchantability or fitness for any particular
-*  purpose.
-*
-*  Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-import gov.nih.nlm.ncbi.ngs.NGS;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMTagUtil;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.SAMBinaryTagAndValue;
-import htsjdk.samtools.SAMUtils;
-import htsjdk.samtools.SAMValidationError;
-import htsjdk.samtools.util.Log;
-import ngs.ReadCollection;
-import ngs.AlignmentIterator;
-import ngs.Alignment;
-import ngs.ReadIterator;
-import ngs.Read;
-import ngs.Fragment;
-import ngs.ErrorMsg;
-
-import java.io.IOException;
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.List;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-/**
- * Extends SAMRecord so that any of the fields will be loaded only when needed.
- * Since SRA is a column oriented database, it is very inefficient to load all the fields at once.
- * However, loading only set of actually needed fields will be even faster than in row oriented databases.
- *
- * Because of that we are providing lazy loading of fields, flags and attributes.
- *
- * Created by andrii.nikitiuk on 8/25/15.
- */
-public class SRALazyRecord extends SAMRecord {
-    private static final Log log = Log.getInstance(SRALazyRecord.class);
-
-    private SRAAccession accession;
-    private boolean isAligned;
-    private transient ReadCollection run;
-    private transient Alignment alignmentIterator;
-    private transient Read unalignmentIterator;
-    private String sraReadId;
-    private String sraAlignmentId;
-    private int unalignedReadFragmentIndex = -1;
-
-
-    private Set<LazyField> initializedFields = EnumSet.noneOf(LazyField.class);
-    private Set<LazyFlag> initializedFlags = EnumSet.noneOf(LazyFlag.class);
-    private Set<LazyAttribute> initializedAttributes = EnumSet.noneOf(LazyAttribute.class);
-
-    private enum LazyField {
-        ALIGNMENT_START {
-            @Override
-            public void loadValue(SRALazyRecord self) {
-                self.getAlignmentStart();
-            }
-        },
-        MAPPING_QUALITY {
-            @Override
-            public void loadValue(SRALazyRecord self) {
-                self.getMappingQuality();
-            }
-        },
-        REFERENCE_NAME {
-            @Override
-            public void loadValue(SRALazyRecord self) {
-                self.getReferenceName();
-            }
-        },
-        CIGAR_STRING {
-            @Override
-            public void loadValue(SRALazyRecord self) {
-                self.getCigarString();
-            }
-        },
-        BASES {
-            @Override
-            public void loadValue(SRALazyRecord self) {
-                self.getReadBases();
-            }
-        },
-        QUALS {
-            @Override
-            public void loadValue(SRALazyRecord self) {
-                self.getBaseQualities();
-            }
-        },
-        MATE_ALIGNMENT_START {
-            @Override
-            public void loadValue(SRALazyRecord self) {
-                self.getMateAlignmentStart();
-            }
-        },
-        MATE_REFERENCE_NAME {
-            @Override
-            public void loadValue(SRALazyRecord self) {
-                self.getMateReferenceName();
-            }
-        },
-        INFERRED_INSERT_SIZE {
-            @Override
-            public void loadValue(SRALazyRecord self) {
-                self.getInferredInsertSize();
-            }
-        };
-
-        public abstract void loadValue(SRALazyRecord self);
-    }
-
-    private enum LazyFlag {
-        READ_NEGATIVE_STRAND(true) {
-            @Override
-            public boolean getFlag(SRALazyRecord self) {
-                return self.getReadNegativeStrandFlag();
-            }
-        },
-        READ_PAIRED(true) {
-            @Override
-            public boolean getFlag(SRALazyRecord self) {
-                return self.getReadPairedFlag();
-            }
-        },
-        PROPER_PAIR(false) {
-            @Override
-            public boolean getFlag(SRALazyRecord self) {
-                return self.getProperPairFlag();
-            }
-        },
-        NOT_PRIMARY_ALIGNMENT(true) {
-            @Override
-            public boolean getFlag(SRALazyRecord self) {
-                return self.getNotPrimaryAlignmentFlag();
-            }
-        },
-        MATE_NEGATIVE_STRAND(false) {
-            @Override
-            public boolean getFlag(SRALazyRecord self) {
-                return self.getMateNegativeStrandFlag();
-            }
-        },
-        MATE_UNMAPPED(false) {
-            @Override
-            public boolean getFlag(SRALazyRecord self) {
-                return self.getMateUnmappedFlag();
-            }
-        },
-        FIRST_OF_PAIR(false) {
-            @Override
-            public boolean getFlag(SRALazyRecord self) {
-                return self.getFirstOfPairFlag();
-            }
-        },
-        SECOND_OF_PAIR(false) {
-            @Override
-            public boolean getFlag(SRALazyRecord self) {
-                return self.getSecondOfPairFlag();
-            }
-        };
-
-        private final boolean canCallOnNotPaired;
-
-        LazyFlag(final boolean canCallOnNotPaired) {
-            this.canCallOnNotPaired = canCallOnNotPaired;
-        }
-
-        public boolean canCallOnNotPaired() { return canCallOnNotPaired; }
-
-        public abstract boolean getFlag(SRALazyRecord self);
-    }
-
-    private enum LazyAttribute {
-        RG {
-            @Override
-            public String getAttribute(SRALazyRecord self) {
-                return self.getAttributeGroupNameImpl();
-            }
-        };
-
-        public abstract String getAttribute(SRALazyRecord self);
-    }
-
-    private static Map<Short, LazyAttribute> lazyAttributeTags;
-    static
-    {
-        lazyAttributeTags = new HashMap<Short, LazyAttribute>();
-        lazyAttributeTags.put(SAMTagUtil.getSingleton().RG, LazyAttribute.RG);
-    }
-
-    public SRALazyRecord(final SAMFileHeader header, SRAAccession accession, ReadCollection run, AlignmentIterator alignmentIterator, String readId, String alignmentId) {
-        this(header, accession, readId, alignmentId);
-
-        this.run = run;
-        this.alignmentIterator = alignmentIterator;
-    }
-
-    public SRALazyRecord(final SAMFileHeader header, SRAAccession accession, ReadCollection run, ReadIterator unalignmentIterator, String readId, int unalignedReadFragmentIndex) {
-        this(header, accession, readId, unalignedReadFragmentIndex);
-
-        this.run = run;
-        this.unalignmentIterator = unalignmentIterator;
-    }
-
-    protected SRALazyRecord(final SAMFileHeader header, SRAAccession accession, String readId, String alignmentId) {
-        this(header, accession, readId, true);
-
-        this.sraAlignmentId = alignmentId;
-    }
-
-    protected SRALazyRecord(final SAMFileHeader header, SRAAccession accession, String readId, int unalignedReadFragmentIndex) {
-        this(header, accession, readId, false);
-
-        this.unalignedReadFragmentIndex = unalignedReadFragmentIndex;
-    }
-
-    private SRALazyRecord(final SAMFileHeader header, SRAAccession accession, String readId, boolean isAligned) {
-        super(header);
-
-        this.accession = accession;
-        this.isAligned = isAligned;
-        this.sraReadId = readId;
-        setReadName(readId);
-        setReadUnmappedFlag(!isAligned);
-    }
-
-    /**
-     * Is being called when original NGS iterator is being moved to the next object.
-     * Later, if any of uninitialized fields is requested, either Read object or Alignment has to be retrieved from
-     * ReadCollection
-     */
-    public void detachFromIterator() {
-        alignmentIterator = null;
-        unalignmentIterator = null;
-    }
-
-    // ===== fields =====
-
-    @Override
-    public int getAlignmentStart() {
-        if (!initializedFields.contains(LazyField.ALIGNMENT_START)) {
-            setAlignmentStart(getAlignmentStartImpl());
-        }
-        return super.getAlignmentStart();
-    }
-
-    @Override
-    public void setAlignmentStart(final int value) {
-        if (!initializedFields.contains(LazyField.ALIGNMENT_START)) {
-            initializedFields.add(LazyField.ALIGNMENT_START);
-        }
-        super.setAlignmentStart(value);
-    }
-
-    @Override
-    public int getMappingQuality() {
-        if (!initializedFields.contains(LazyField.MAPPING_QUALITY)) {
-            setMappingQuality(getMappingQualityImpl());
-        }
-        return super.getMappingQuality();
-    }
-
-    @Override
-    public void setMappingQuality(final int value) {
-        if (!initializedFields.contains(LazyField.MAPPING_QUALITY)) {
-            initializedFields.add(LazyField.MAPPING_QUALITY);
-        }
-        super.setMappingQuality(value);
-    }
-
-    @Override
-    public String getReferenceName() {
-        if (!initializedFields.contains(LazyField.REFERENCE_NAME)) {
-            setReferenceName(getReferenceNameImpl());
-        }
-        return super.getReferenceName();
-    }
-
-    @Override
-    public void setReferenceName(final String value) {
-        if (!initializedFields.contains(LazyField.REFERENCE_NAME)) {
-            initializedFields.add(LazyField.REFERENCE_NAME);
-        }
-        super.setReferenceName(value);
-    }
-
-    @Override
-    public Integer getReferenceIndex() {
-        if (!initializedFields.contains(LazyField.REFERENCE_NAME)) {
-            setReferenceName(getReferenceNameImpl());
-        }
-        return super.getReferenceIndex();
-    }
-
-    @Override
-    public void setReferenceIndex(final int value) {
-        if (!initializedFields.contains(LazyField.REFERENCE_NAME)) {
-            initializedFields.add(LazyField.REFERENCE_NAME);
-        }
-        super.setReferenceIndex(value);
-    }
-
-    @Override
-    public String getCigarString() {
-        if (!initializedFields.contains(LazyField.CIGAR_STRING)) {
-            setCigarString(getCigarStringImpl());
-        }
-        return super.getCigarString();
-    }
-
-    @Override
-    public void setCigarString(final String value) {
-        if (!initializedFields.contains(LazyField.CIGAR_STRING)) {
-            initializedFields.add(LazyField.CIGAR_STRING);
-        }
-        super.setCigarString(value);
-    }
-
-    @Override
-    public Cigar getCigar() {
-        if (!initializedFields.contains(LazyField.CIGAR_STRING)) {
-            setCigarString(getCigarStringImpl());
-        }
-        return super.getCigar();
-    }
-
-    @Override
-    public void setCigar(final Cigar value) {
-        if (!initializedFields.contains(LazyField.CIGAR_STRING)) {
-            initializedFields.add(LazyField.CIGAR_STRING);
-        }
-        super.setCigar(value);
-    }
-
-    @Override
-    public byte[] getReadBases() {
-        if (!initializedFields.contains(LazyField.BASES)) {
-            setReadBases(getReadBasesImpl());
-        }
-        return super.getReadBases();
-    }
-
-    @Override
-    public void setReadBases(final byte[] value) {
-        if (!initializedFields.contains(LazyField.BASES)) {
-            initializedFields.add(LazyField.BASES);
-        }
-        super.setReadBases(value);
-    }
-
-    @Override
-    public byte[] getBaseQualities() {
-        if (!initializedFields.contains(LazyField.QUALS)) {
-            setBaseQualities(getBaseQualitiesImpl());
-        }
-        return super.getBaseQualities();
-    }
-
-    @Override
-    public void setBaseQualities(final byte[] value) {
-        if (!initializedFields.contains(LazyField.QUALS)) {
-            initializedFields.add(LazyField.QUALS);
-        }
-        super.setBaseQualities(value);
-    }
-
-    @Override
-    public int getMateAlignmentStart() {
-        if (!initializedFields.contains(LazyField.MATE_ALIGNMENT_START)) {
-            setMateAlignmentStart(getMateAlignmentStartImpl());
-        }
-        return super.getMateAlignmentStart();
-    }
-
-    @Override
-    public void setMateAlignmentStart(final int value) {
-        if (!initializedFields.contains(LazyField.MATE_ALIGNMENT_START)) {
-            initializedFields.add(LazyField.MATE_ALIGNMENT_START);
-        }
-        super.setMateAlignmentStart(value);
-    }
-
-    @Override
-    public String getMateReferenceName() {
-        if (!initializedFields.contains(LazyField.MATE_REFERENCE_NAME)) {
-            setMateReferenceName(getMateReferenceNameImpl());
-        }
-        return super.getMateReferenceName();
-    }
-
-    @Override
-    public void setMateReferenceName(final String value) {
-        if (!initializedFields.contains(LazyField.MATE_REFERENCE_NAME)) {
-            initializedFields.add(LazyField.MATE_REFERENCE_NAME);
-        }
-        super.setMateReferenceName(value);
-    }
-
-    @Override
-    public Integer getMateReferenceIndex() {
-        if (!initializedFields.contains(LazyField.MATE_REFERENCE_NAME)) {
-            setMateReferenceName(getMateReferenceNameImpl());
-        }
-        return super.getMateReferenceIndex();
-    }
-
-    @Override
-    public void setMateReferenceIndex(final int value) {
-        if (!initializedFields.contains(LazyField.MATE_REFERENCE_NAME)) {
-            initializedFields.add(LazyField.MATE_REFERENCE_NAME);
-        }
-        super.setMateReferenceIndex(value);
-    }
-
-    @Override
-    public int getInferredInsertSize() {
-        if (!initializedFields.contains(LazyField.INFERRED_INSERT_SIZE)) {
-            setInferredInsertSize(getInferredInsertSizeImpl());
-        }
-        return super.getInferredInsertSize();
-    }
-
-    @Override
-    public void setInferredInsertSize(final int value) {
-        if (!initializedFields.contains(LazyField.INFERRED_INSERT_SIZE)) {
-            initializedFields.add(LazyField.INFERRED_INSERT_SIZE);
-        }
-        super.setInferredInsertSize(value);
-    }
-
-    // ===== flags =====
-
-    @Override
-    public int getFlags() {
-        for (LazyFlag flag : LazyFlag.values()) {
-            if (initializedFlags.contains(flag)) {
-                continue;
-            }
-
-            if (flag.canCallOnNotPaired() || getReadPairedFlag()) {
-                flag.getFlag(this);
-            }
-        }
-
-        return super.getFlags();
-    }
-
-    @Override
-    public void setFlags(final int value) {
-        for (LazyFlag flag : LazyFlag.values()) {
-            if (!initializedFlags.contains(flag)) {
-                initializedFlags.add(flag);
-            }
-        }
-        super.setFlags(value);
-    }
-
-    @Override
-    public boolean getReadNegativeStrandFlag() {
-        if (!initializedFlags.contains(LazyFlag.READ_NEGATIVE_STRAND)) {
-            setReadNegativeStrandFlag(getReadNegativeStrandFlagImpl());
-        }
-        return super.getReadNegativeStrandFlag();
-    }
-
-    @Override
-    public void setReadNegativeStrandFlag(final boolean flag) {
-        if (!initializedFlags.contains(LazyFlag.READ_NEGATIVE_STRAND)) {
-            initializedFlags.add(LazyFlag.READ_NEGATIVE_STRAND);
-        }
-        super.setReadNegativeStrandFlag(flag);
-    }
-
-    @Override
-    public boolean getReadPairedFlag() {
-        if (!initializedFlags.contains(LazyFlag.READ_PAIRED)) {
-            setReadPairedFlag(getReadPairedFlagImpl());
-        }
-        return super.getReadPairedFlag();
-    }
-
-    @Override
-    public void setReadPairedFlag(final boolean flag) {
-        if (!initializedFlags.contains(LazyFlag.READ_PAIRED)) {
-            initializedFlags.add(LazyFlag.READ_PAIRED);
-        }
-        super.setReadPairedFlag(flag);
-    }
-
-    @Override
-    public boolean getProperPairFlag() {
-        if (!initializedFlags.contains(LazyFlag.PROPER_PAIR)) {
-            setProperPairFlag(getProperPairFlagImpl());
-        }
-        return super.getProperPairFlag();
-    }
-
-    @Override
-    public void setProperPairFlag(final boolean flag) {
-        if (!initializedFlags.contains(LazyFlag.PROPER_PAIR)) {
-            initializedFlags.add(LazyFlag.PROPER_PAIR);
-        }
-        super.setProperPairFlag(flag);
-    }
-
-    @Override
-    public boolean getNotPrimaryAlignmentFlag() {
-        if (!initializedFlags.contains(LazyFlag.NOT_PRIMARY_ALIGNMENT)) {
-            setNotPrimaryAlignmentFlag(getNotPrimaryAlignmentFlagImpl());
-        }
-        return super.getNotPrimaryAlignmentFlag();
-    }
-
-    @Override
-    public void setNotPrimaryAlignmentFlag(final boolean flag) {
-        if (!initializedFlags.contains(LazyFlag.NOT_PRIMARY_ALIGNMENT)) {
-            initializedFlags.add(LazyFlag.NOT_PRIMARY_ALIGNMENT);
-        }
-        super.setNotPrimaryAlignmentFlag(flag);
-    }
-
-    @Override
-    public boolean getMateNegativeStrandFlag() {
-        if (!initializedFlags.contains(LazyFlag.MATE_NEGATIVE_STRAND)) {
-            setMateNegativeStrandFlag(getMateNegativeStrandFlagImpl());
-        }
-        return super.getMateNegativeStrandFlag();
-    }
-
-    @Override
-    public void setMateNegativeStrandFlag(final boolean flag) {
-        if (!initializedFlags.contains(LazyFlag.MATE_NEGATIVE_STRAND)) {
-            initializedFlags.add(LazyFlag.MATE_NEGATIVE_STRAND);
-        }
-        super.setMateNegativeStrandFlag(flag);
-    }
-
-    @Override
-    public boolean getMateUnmappedFlag() {
-        if (!initializedFlags.contains(LazyFlag.MATE_UNMAPPED)) {
-            setMateUnmappedFlag(getMateUnmappedFlagImpl());
-        }
-        return super.getMateUnmappedFlag();
-    }
-
-    @Override
-    public void setMateUnmappedFlag(final boolean flag) {
-        if (!initializedFlags.contains(LazyFlag.MATE_UNMAPPED)) {
-            initializedFlags.add(LazyFlag.MATE_UNMAPPED);
-        }
-        super.setMateUnmappedFlag(flag);
-    }
-
-    @Override
-    public boolean getFirstOfPairFlag() {
-        if (!initializedFlags.contains(LazyFlag.FIRST_OF_PAIR)) {
-            setFirstOfPairFlag(getFirstOfPairFlagImpl());
-        }
-        return super.getFirstOfPairFlag();
-    }
-
-    @Override
-    public void setFirstOfPairFlag(final boolean flag) {
-        if (!initializedFlags.contains(LazyFlag.FIRST_OF_PAIR)) {
-            initializedFlags.add(LazyFlag.FIRST_OF_PAIR);
-        }
-        super.setFirstOfPairFlag(flag);
-    }
-
-    @Override
-    public boolean getSecondOfPairFlag() {
-        if (!initializedFlags.contains(LazyFlag.SECOND_OF_PAIR)) {
-            setSecondOfPairFlag(getSecondOfPairFlagImpl());
-        }
-        return super.getSecondOfPairFlag();
-    }
-
-    @Override
-    public void setSecondOfPairFlag(final boolean flag) {
-        if (!initializedFlags.contains(LazyFlag.SECOND_OF_PAIR)) {
-            initializedFlags.add(LazyFlag.SECOND_OF_PAIR);
-        }
-        super.setSecondOfPairFlag(flag);
-    }
-
-
-    // ===== attributes =====
-
-    @Override
-    public Object getAttribute(final short tag) {
-        LazyAttribute attr = lazyAttributeTags.get(tag);
-        if (attr != null) {
-            if (!initializedAttributes.contains(attr)) {
-                setAttribute(tag, attr.getAttribute(this));
-            }
-        }
-        return super.getAttribute(tag);
-    }
-
-    @Override
-    public void setAttribute(final short tag, final Object value) {
-        LazyAttribute attr = lazyAttributeTags.get(tag);
-        if (attr != null && !initializedAttributes.contains(attr)) {
-            initializedAttributes.add(attr);
-        }
-        super.setAttribute(tag, value);
-    }
-
-    @Override
-    protected void setAttribute(final short tag, final Object value, final boolean isUnsignedArray) {
-        LazyAttribute attr = lazyAttributeTags.get(tag);
-        if (attr != null && !initializedAttributes.contains(attr)) {
-            initializedAttributes.add(attr);
-        }
-        super.setAttribute(tag, value, isUnsignedArray);
-    }
-
-    @Override
-    public void clearAttributes() {
-        for (LazyAttribute lazyAttribute : LazyAttribute.values()) {
-            if (!initializedAttributes.contains(lazyAttribute)) {
-                initializedAttributes.add(lazyAttribute);
-            }
-        }
-        super.clearAttributes();
-    }
-
-    @Override
-    protected void setAttributes(final SAMBinaryTagAndValue attributes) {
-        for (LazyAttribute lazyAttribute : LazyAttribute.values()) {
-            if (!initializedAttributes.contains(lazyAttribute)) {
-                initializedAttributes.add(lazyAttribute);
-            }
-        }
-        super.setAttributes(attributes);
-    }
-
-    @Override
-    protected SAMBinaryTagAndValue getBinaryAttributes() {
-        for (Map.Entry<Short, LazyAttribute> info : lazyAttributeTags.entrySet()) {
-            if (!initializedAttributes.contains(info.getValue())) {
-                getAttribute(info.getKey());
-            }
-        }
-
-        return super.getBinaryAttributes();
-    }
-
-    public boolean isUnsignedArrayAttribute(final String tag) {
-        Short binaryTag = SAMTagUtil.getSingleton().makeBinaryTag(tag);
-        LazyAttribute attr = lazyAttributeTags.get(binaryTag);
-        if (attr != null && !initializedAttributes.contains(attr)) {
-            getAttribute(binaryTag);
-        }
-
-        return super.isUnsignedArrayAttribute(tag);
-    }
-
-    // ===== misc ====
-
-    /**
-     * For records equality, we should only compare read id, reference and position on the reference.
-     * Since read id is a constructor parameter, we only need to make sure that reference info is loaded.
-     * @param o other
-     * @return comparison result
-     */
-    @Override
-    public boolean equals(final Object o) {
-        if (o instanceof SRALazyRecord) {
-            SRALazyRecord otherRecord = (SRALazyRecord)o;
-            otherRecord.getReferenceIndex();
-            otherRecord.getAlignmentStart();
-        }
-
-        getReferenceIndex();
-        getAlignmentStart();
-
-        return super.equals(o);
-    }
-
-    /**
-     * The same approach as with 'equals' method. We only load reference and position.
-     */
-    @Override
-    public int hashCode() {
-        getReferenceIndex();
-        getAlignmentStart();
-
-        return super.hashCode();
-    }
-
-    /**
-     * Performs a deep copy of the SAMRecord and detaches a copy from NGS iterator
-     * @return new object
-     * @throws CloneNotSupportedException
-     */
-    @Override
-    public Object clone() throws CloneNotSupportedException {
-        SRALazyRecord newObject = (SRALazyRecord)super.clone();
-        newObject.initializedFields = EnumSet.copyOf(this.initializedFields);
-        newObject.initializedFlags = EnumSet.copyOf(this.initializedFlags);
-        newObject.initializedAttributes = EnumSet.copyOf(this.initializedAttributes);
-        newObject.detachFromIterator();
-
-        return newObject;
-    }
-
-    @Override
-    public String format() {
-        if (!initializedAttributes.contains(LazyAttribute.RG)) {
-            getAttribute("RG");
-        }
-        return super.format();
-    }
-
-    @Override
-    public List<SAMValidationError> isValid(final boolean firstOnly) {
-        loadFields();
-        getFlags();
-        getBinaryAttributes();
-
-        return super.isValid(firstOnly);
-    }
-
-    // =============================== Implementation ========================================
-
-    private ReadCollection getReadCollection() {
-        if (run != null) {
-            return run;
-        }
-
-        log.debug("Recovering SRA read collection. Accession: " + accession);
-        try {
-            return run = NGS.openReadCollection(accession.toString());
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private Alignment getCurrentAlignment() throws ErrorMsg {
-        if (!isAligned) {
-            throw new RuntimeException("Should be called for aligned records only");
-        }
-
-        if (alignmentIterator == null) {
-            log.debug("Recovering SAM record after detaching from iterator. Alignment id: " + sraAlignmentId);
-            if (sraAlignmentId == null) {
-                throw new RuntimeException("Cannot recover SAM object after detaching from iterator: no alignment id");
-            }
-
-            alignmentIterator = getReadCollection().getAlignment(sraAlignmentId);
-        }
-        return alignmentIterator;
-    }
-
-    private Read getCurrentUnalignedRead() throws ErrorMsg {
-        if (isAligned) {
-            throw new RuntimeException("Should be called for unaligned records only");
-        }
-
-        if (unalignmentIterator == null) {
-            log.debug("Recovering SAM record after detaching from iterator. Read id: " + sraReadId + ", fragment index: " + unalignedReadFragmentIndex);
-            if (sraReadId == null) {
-                throw new RuntimeException("Cannot recover SAM object after detaching from iterator: no read id");
-            }
-
-            Read read = getReadCollection().getRead(sraReadId);
-            for (int i = 0; i < unalignedReadFragmentIndex + 1; i++) {
-                read.nextFragment();
-            }
-
-            unalignmentIterator = read;
-        }
-        return unalignmentIterator;
-    }
-
-    // ===== fields =====
-
-    private void loadFields() {
-        for (LazyField field : LazyField.values()) {
-            if (initializedFields.contains(field)) {
-                continue;
-            }
-
-            field.loadValue(this);
-        }
-    }
-
-    private int getAlignmentStartImpl() {
-        try {
-            if (isAligned) {
-                return (int) getCurrentAlignment().getAlignmentPosition() + 1;
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-        return SAMRecord.NO_ALIGNMENT_START;
-    }
-
-    private int getMappingQualityImpl() {
-        try {
-            if (isAligned) {
-                return getCurrentAlignment().getMappingQuality();
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-        return SAMRecord.NO_MAPPING_QUALITY;
-    }
-
-    private String getReferenceNameImpl() {
-        try {
-            if (isAligned) {
-                return getCurrentAlignment().getReferenceSpec();
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-        return SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
-    }
-
-    private String getCigarStringImpl() {
-        try {
-            if (isAligned) {
-                return getCurrentAlignment().getShortCigar(false);
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-        return SAMRecord.NO_ALIGNMENT_CIGAR;
-    }
-
-    private byte[] getReadBasesImpl() {
-        try {
-            if (isAligned) {
-                return getCurrentAlignment().getAlignedFragmentBases().getBytes();
-            } else {
-                return getCurrentUnalignedRead().getFragmentBases().getBytes();
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private byte[] getBaseQualitiesImpl() {
-        try {
-            Fragment fragment;
-            if (isAligned) {
-                fragment = getCurrentAlignment();
-            } else {
-                fragment = getCurrentUnalignedRead();
-            }
-
-            // quals are being taken from PRIMARY_ALIGNMENT.SAM_QUALITY column which reverse automatically them if needed
-            return SAMUtils.fastqToPhred(fragment.getFragmentQualities());
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private int getMateAlignmentStartImpl() {
-        try {
-            if (isAligned && getReadPairedFlag() && !getMateUnmappedFlag()) {
-                Alignment mate = getCurrentAlignment().getMateAlignment();
-                return (int) mate.getAlignmentPosition() + 1;
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-        return SAMRecord.NO_ALIGNMENT_START;
-    }
-
-    private String getMateReferenceNameImpl() {
-        try {
-            if (isAligned && getReadPairedFlag() && !getMateUnmappedFlag()) {
-                return getCurrentAlignment().getMateReferenceSpec();
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-        return SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
-    }
-
-    private int getInferredInsertSizeImpl() {
-        try {
-            if (isAligned) {
-                return (int) getCurrentAlignment().getTemplateLength();
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-        return 0;
-    }
-
-    // ===== flags =====
-
-    private boolean getReadNegativeStrandFlagImpl() {
-        try {
-            if (isAligned) {
-                return getCurrentAlignment().getIsReversedOrientation();
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-        return false;
-    }
-
-    private boolean getReadPairedFlagImpl() {
-        try {
-            if (isAligned) {
-                return getCurrentAlignment().isPaired();
-            } else {
-                return getCurrentUnalignedRead().getNumFragments() > 1;
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private boolean getProperPairFlagImpl() {
-        return isAligned && getReadPairedFlag() && !getMateUnmappedFlag();
-    }
-
-    private boolean getNotPrimaryAlignmentFlagImpl() {
-        try {
-            if (isAligned) {
-                return getCurrentAlignment().getAlignmentCategory() == Alignment.secondaryAlignment;
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-
-        return false;
-    }
-
-    private boolean getMateNegativeStrandFlagImpl() {
-        try {
-            if (isAligned && getReadPairedFlag() && !getMateUnmappedFlag()) {
-                Alignment mate = getCurrentAlignment().getMateAlignment();
-                return mate.getIsReversedOrientation();
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-
-        return false;
-    }
-
-    private boolean getMateUnmappedFlagImpl() {
-        try {
-            if (isAligned) {
-                return !getCurrentAlignment().hasMate();
-            } else {
-                Read unalignedRead = getCurrentUnalignedRead();
-                int numFragments = unalignedRead.getNumFragments();
-                int nextFragmentIdx = unalignedReadFragmentIndex + 1;
-                if (nextFragmentIdx == numFragments) {
-                    nextFragmentIdx = 0;
-                }
-
-                return unalignedRead.fragmentIsAligned(nextFragmentIdx);
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private boolean getFirstOfPairFlagImpl() {
-        if (!getReadPairedFlag()) {
-            return false;
-        }
-        try {
-            if (isAligned) {
-                String fragmentId = getCurrentAlignment().getFragmentId();
-                if (!fragmentId.contains(".FA")) {
-                    throw new RuntimeException("Invalid fragment id: " + fragmentId);
-                }
-
-                return fragmentId.contains(".FA0.");
-            } else {
-                return unalignedReadFragmentIndex == 0;
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private boolean getSecondOfPairFlagImpl() {
-        if (!getReadPairedFlag()) {
-            return false;
-        }
-        try {
-            if (isAligned) {
-                String fragmentId = getCurrentAlignment().getFragmentId();
-                if (!fragmentId.contains(".FA")) {
-                    throw new RuntimeException("Invalid fragment id: " + fragmentId);
-                }
-
-                return !fragmentId.contains(".FA0.");
-            } else {
-                return unalignedReadFragmentIndex != 0;
-            }
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    // ===== attributes =====
-
-    private String getAttributeGroupNameImpl() {
-        try {
-            String readGroupName;
-            if (isAligned) {
-                readGroupName = getCurrentAlignment().getReadGroup();
-            } else {
-                readGroupName = getCurrentUnalignedRead().getReadGroup();
-            }
-
-            if (!readGroupName.isEmpty()) {
-                return readGroupName;
-            }
-            return getReadCollection().getName();
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/sra/SRAUnalignmentIterator.java b/src/main/java/htsjdk/samtools/sra/SRAUnalignmentIterator.java
deleted file mode 100644
index f128a2b..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRAUnalignmentIterator.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*===========================================================================
-*
-*                            PUBLIC DOMAIN NOTICE
-*               National Center for Biotechnology Information
-*
-*  This software/database is a "United States Government Work" under the
-*  terms of the United States Copyright Act.  It was written as part of
-*  the author's official duties as a United States Government employee and
-*  thus cannot be copyrighted.  This software/database is freely available
-*  to the public for use. The National Library of Medicine and the U.S.
-*  Government have not placed any restriction on its use or reproduction.
-*
-*  Although all reasonable efforts have been taken to ensure the accuracy
-*  and reliability of the software and data, the NLM and the U.S.
-*  Government do not and cannot warrant the performance or results that
-*  may be obtained by using this software or data. The NLM and the U.S.
-*  Government disclaim all warranties, express or implied, including
-*  warranties of performance, merchantability or fitness for any particular
-*  purpose.
-*
-*  Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SRAIterator;
-import htsjdk.samtools.ValidationStringency;
-import ngs.ErrorMsg;
-import ngs.Read;
-import ngs.ReadCollection;
-import ngs.ReadIterator;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * Iterator for unaligned reads.
- * Is used from SRAIterator.
- *
- * Created by andrii.nikitiuk on 9/3/15.
- */
-public class SRAUnalignmentIterator implements Iterator<SAMRecord> {
-    private ValidationStringency validationStringency;
-
-    private SRAAccession accession;
-    private ReadCollection run;
-    private SAMFileHeader header;
-    private SRAIterator.RecordRangeInfo recordRangeInfo;
-
-    private ReadIterator unalignedIterator;
-    private boolean hasMoreUnalignedReads = true;
-    private Boolean hasMoreUnalignedFragments = false;
-    private int lastUnalignedFragmentIndex;
-
-    private SRALazyRecord lastRecord;
-
-    /**
-     *
-     * @param run opened read collection
-     * @param header sam header
-     * @param recordRangeInfo info about record ranges withing SRA archive
-     * @param chunk used to determine which unaligned reads the iterator should return
-     */
-    public SRAUnalignmentIterator(SRAAccession accession, final ReadCollection run, final SAMFileHeader header, SRAIterator.RecordRangeInfo recordRangeInfo, Chunk chunk) {
-        this.accession = accession;
-        this.run = run;
-        this.header = header;
-        this.recordRangeInfo = recordRangeInfo;
-
-        long readStart = chunk.getChunkStart() - recordRangeInfo.getTotalReferencesLength();
-        if (readStart < 0) {
-            readStart = 0;
-        } else if (readStart >= recordRangeInfo.getNumberOfReads()) {
-            throw new RuntimeException("Invalid chunk provided: chunkStart position is after last read");
-        }
-
-        long readEnd = chunk.getChunkEnd() - recordRangeInfo.getTotalReferencesLength();
-        if (readEnd > recordRangeInfo.getNumberOfReads()) {
-            readEnd = recordRangeInfo.getNumberOfReads();
-        } else if (readEnd <= 0) {
-            throw new RuntimeException("Invalid chunk provided: chunkEnd position is before last read");
-        }
-
-        try {
-            unalignedIterator = run.getReadRange(readStart + 1, readEnd - readStart, Read.partiallyAligned | Read.unaligned);
-            nextUnalignedFragment();
-
-        } catch (final Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public boolean hasNext() {
-        // check unaligned
-        if (hasMoreUnalignedFragments == null) {
-            try {
-                lastRecord.detachFromIterator();
-                nextUnalignedFragment();
-            } catch (ErrorMsg e) {
-                throw new RuntimeException(e);
-            }
-        }
-        return hasMoreUnalignedFragments;
-    }
-
-    @Override
-    public SAMRecord next() {
-        if (!hasNext()) {
-            throw new NoSuchElementException("No more alignments are available");
-        }
-
-        return nextUnalignment();
-    }
-
-    @Override
-    public void remove() {
-        throw new UnsupportedOperationException("Removal of records not implemented.");
-    }
-
-    public void setValidationStringency(ValidationStringency validationStringency) {
-        this.validationStringency = validationStringency;
-    }
-
-    private SAMRecord nextUnalignment() {
-        try {
-            lastRecord = new SRALazyRecord(header, accession, run, unalignedIterator, unalignedIterator.getReadId(), lastUnalignedFragmentIndex);
-        } catch (ErrorMsg e) {
-            throw new RuntimeException(e);
-        }
-
-        if (validationStringency != null) {
-            lastRecord.setValidationStringency(validationStringency);
-        }
-
-        hasMoreUnalignedFragments = null;
-
-        return lastRecord;
-    }
-
-    private void nextUnalignedFragment() throws ErrorMsg {
-        while (hasMoreUnalignedFragments == null || hasMoreUnalignedFragments) {
-            hasMoreUnalignedFragments = unalignedIterator.nextFragment();
-            lastUnalignedFragmentIndex++;
-
-            if (hasMoreUnalignedFragments && !unalignedIterator.isAligned()) {
-                return;
-            }
-        }
-
-        if (!hasMoreUnalignedReads) {
-            throw new RuntimeException("Cannot get next unaligned read - already at last one");
-        }
-
-        while (true) {
-            hasMoreUnalignedReads = unalignedIterator.nextRead();
-            lastUnalignedFragmentIndex = -1;
-            if (!hasMoreUnalignedReads) {
-                break;
-            }
-
-            // search for unaligned fragment
-            do {
-                hasMoreUnalignedFragments = unalignedIterator.nextFragment();
-                lastUnalignedFragmentIndex++;
-            } while (hasMoreUnalignedFragments && unalignedIterator.isAligned());
-
-            // means that we found fragment
-            if (hasMoreUnalignedFragments) {
-                return;
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/sra/SRAUtils.java b/src/main/java/htsjdk/samtools/sra/SRAUtils.java
deleted file mode 100644
index e72caa8..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRAUtils.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*===========================================================================
-*
-*                            PUBLIC DOMAIN NOTICE
-*               National Center for Biotechnology Information
-*
-*  This software/database is a "United States Government Work" under the
-*  terms of the United States Copyright Act.  It was written as part of
-*  the author's official duties as a United States Government employee and
-*  thus cannot be copyrighted.  This software/database is freely available
-*  to the public for use. The National Library of Medicine and the U.S.
-*  Government have not placed any restriction on its use or reproduction.
-*
-*  Although all reasonable efforts have been taken to ensure the accuracy
-*  and reliability of the software and data, the NLM and the U.S.
-*  Government do not and cannot warrant the performance or results that
-*  may be obtained by using this software or data. The NLM and the U.S.
-*  Government disclaim all warranties, express or implied, including
-*  warranties of performance, merchantability or fitness for any particular
-*  purpose.
-*
-*  Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-import ngs.ErrorMsg;
-import ngs.Read;
-import ngs.ReadCollection;
-import ngs.ReferenceIterator;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Provides some functionality which can be used by other classes
- *
- * Created by andrii.nikitiuk on 10/28/15.
- */
-public class SRAUtils {
-    /**
-     * References are stored in SRA table in chunks of 5k bases per row, while last chunk of a reference is less or
-     * equal than 5k bases in size (even if the next reference follows).
-     * So, it will be optimal if we align reference sizes to 5k bases to read by reference rows.
-     */
-    public static final int REFERENCE_ALIGNMENT = 5000;
-
-    /**
-     * Is used to build RecordRangeInfo
-     * @param run open read collection
-     * @return total number of reads (both aligned and unaligned) in SRA archive
-     * @throws ErrorMsg
-     */
-    public static long getNumberOfReads(ReadCollection run) throws ErrorMsg {
-        return run.getReadCount(Read.all);
-    }
-
-    /**
-     * Loads reference lengths from a read collection.
-     * Aligns reference lengths by REFERENCE_ALIGNMENT bases for optimal loads of alignments
-     * (references are stored in REFERENCE_ALIGNMENT bases chunks in SRA table)
-     *
-     * Is used to build RecordRangeInfo
-     * @param run single opened read collection
-     * @return list with references lengths
-     * @throws ErrorMsg
-     */
-    public static List<Long> getReferencesLengthsAligned(ReadCollection run) throws ErrorMsg {
-        ReferenceIterator refIt = run.getReferences();
-        List<Long> lengths = new ArrayList<Long>();
-        while (refIt.nextReference()) {
-            long refLen = refIt.getLength();
-            // lets optimize references so they always align in 5000 bases positions
-            if (refLen % REFERENCE_ALIGNMENT != 0) {
-                refLen += REFERENCE_ALIGNMENT - (refLen % REFERENCE_ALIGNMENT);
-            }
-            lengths.add(refLen);
-        }
-        return lengths;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractAsyncWriter.java b/src/main/java/htsjdk/samtools/util/AbstractAsyncWriter.java
deleted file mode 100644
index ef1803b..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractAsyncWriter.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.io.Closeable;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * Abstract class that is designed to be extended and specialized to provide an asynchronous
- * wrapper around any kind of Writer class that takes an object and writes it out somehow.
- *
- * NOTE: Objects of subclasses of this class are not intended to be shared between threads.
- * In particular there must be only one thread that calls {@link #write} and {@link #close}.
- *
- * NOTE: Any exception thrown by the underlying Writer will be propagated back to the caller
- * during the next available call to {@link #write} or {@link #close}. After the exception
- * has been thrown to the caller, it is not safe to attempt further operations on the instance.
- *
- * @author Tim Fennell
- */
-public abstract class AbstractAsyncWriter<T> implements Closeable {
-    private static volatile int threadsCreated = 0; // Just used for thread naming.
-    public static final int DEFAULT_QUEUE_SIZE = 2000;
-
-    private final AtomicBoolean isClosed = new AtomicBoolean(false);
-    private final BlockingQueue<T> queue;
-    private final Thread writer;
-    private final WriterRunnable writerRunnable;
-    private final AtomicReference<Throwable> ex = new AtomicReference<Throwable>(null);
-
-    /** Returns the prefix to use when naming threads. */
-    protected abstract String getThreadNamePrefix();
-
-    protected abstract void synchronouslyWrite(final T item);
-
-    protected abstract void synchronouslyClose();
-
-    /**
-     * Creates an AbstractAsyncWriter that will use the provided WriterRunnable to consume from the
-     * internal queue and write records into the synchronous writer.
-     */
-    protected AbstractAsyncWriter(final int queueSize) {
-        this.queue = new ArrayBlockingQueue<T>(queueSize);
-        this.writerRunnable = new WriterRunnable();
-        this.writer = new Thread(writerRunnable, getThreadNamePrefix() + threadsCreated++);
-        this.writer.setDaemon(true);
-        this.writer.start();
-    }
-
-    /**
-     * Public method for sub-classes or ultimately consumers to put an item into the queue
-     * to be written out.
-     */
-    public void write(final T item) {
-        if (this.isClosed.get()) throw new RuntimeIOException("Attempt to add record to closed writer.");
-
-        checkAndRethrow();
-        try { this.queue.put(item); }
-        catch (final InterruptedException ie) { throw new RuntimeException("Interrupted queueing item for writing.", ie); }
-        checkAndRethrow();
-    }
-
-    /**
-     * Attempts to finish draining the queue and then calls synchronouslyClose() to allow implementation
-     * to do any one time clean up.
-     */
-    public void close() {
-        checkAndRethrow();
-
-        if (!this.isClosed.getAndSet(true)) {
-            try {
-                if (this.queue.isEmpty()) this.writer.interrupt(); // signal to writer clean up
-            	this.writer.join();
-            } catch (final InterruptedException ie) {
-            	throw new RuntimeException("Interrupted waiting on writer thread.", ie);
-        	}
-
-            //The queue should be empty but if it's not, we'll drain it here to protect against any lost data.
-            //There's no need to timeout on poll because poll is called only when queue is not empty and
-            // at this point the writer thread is definitely dead and noone is removing items from the queue.
-            //The item pulled will never be null (same reasoning).
-            while (!this.queue.isEmpty()) {
-                final T item = queue.poll();
-                synchronouslyWrite(item);
-            }
-
-            synchronouslyClose();
-            checkAndRethrow();
-        }
-    }
-
-    /**
-     * Checks to see if an exception has been raised in the writer thread and if so rethrows it as an Error
-     * or RuntimeException as appropriate.
-     */
-    private final void checkAndRethrow() {
-        final Throwable t = this.ex.getAndSet(null);
-        if (t != null) {
-            this.isClosed.set(true); // Ensure no further attempts to write
-            if (t instanceof Error) throw (Error) t;
-            if (t instanceof RuntimeException) throw (RuntimeException) t;
-            else throw new RuntimeException(t);
-        }
-    }
-
-    /**
-     * Small Runnable implementation that simply reads from the blocking queue and writes to the
-     * synchronous writer.
-     */
-    private class WriterRunnable implements Runnable {
-        public void run() {
-            try {
-                //The order of the two conditions is important, see https://github.com/samtools/htsjdk/issues/564
-                //because we want to make sure that emptiness status of the queue does not change after we have evaluated isClosed
-                //as it is now (isClosed checked before queue.isEmpty),
-                //the two operations are effectively atomic if isClosed returns true
-                while (!isClosed.get() || !queue.isEmpty()) {
-                    try {
-                        final T item = queue.poll(2, TimeUnit.SECONDS);
-                        if (item != null) synchronouslyWrite(item);
-                    }
-                    catch (final InterruptedException ie) {
-                        /* Do Nothing */
-                    }
-                }
-            }
-            catch (final Throwable t) {
-                ex.compareAndSet(null, t);
-                // In case a writer was blocking on a full queue before ex has been set, clear the queue
-                // so that the writer will no longer be blocked so that it can see the exception.
-                queue.clear();
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractIterator.java b/src/main/java/htsjdk/samtools/util/AbstractIterator.java
deleted file mode 100644
index 2e75dc4..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractIterator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2011 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * Base class of implementing iterators. All you have to do is implement advance which gets
- * the next element.
- *
- * @author Doug Voet (dvoet at broadinstitute dot org)
- */
-public abstract class AbstractIterator<E> implements Iterator<E> {
-    protected E next;
-    private boolean iterating = false;
-
-    @Override
-    public boolean hasNext() {
-        // If this is the start of iteration, queue up the first item
-        if (!iterating) {
-            next = advance();
-            iterating = true;
-        }
-        return next != null;
-    }
-
-    @Override
-    public E next() {
-        if (!hasNext()) {
-            throw new NoSuchElementException();
-        }
-
-        E ret = next;
-        next = advance();
-        return ret;
-    }
-
-    @Override
-    public void remove() {
-        throw new UnsupportedOperationException("Remove() not supported.");
-    }
-
-    /**
-     * @return the next element or null if the iterator is at the end
-     */
-    protected abstract E advance();
-
-    /**
-     * Returns the next element in the iterator, if one exists.  Otherwise, returns null.  Invoking this method does not advance the iterator.
-     * @return The next element in the iterator, without advancing, or, if no other element exists, null.
-     */
-    public E peek() {
-        return next;
-    }
-
-    /**
-     * @return true after the first time hasNext() or next() have been called
-     */
-    protected boolean isIterating() {
-        return iterating;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java b/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java
deleted file mode 100644
index 4e02007..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMSequenceRecord;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * The unit of iteration for AbstractLocusIterator.
- * Holds information about the locus (the SAMSequenceRecord and 1-based position on the reference),
- * plus list of AbstractRecordAndOffset objects,
- * If <code>RecordAndOffset</code> class is used, one object represents one aligned read that overlaps the locus.
- * If <code>TypedRecordAndOffset</code> class is used, one object represents one aligned read,
- * that starts or ends at the locus.
- *
- * @author Darina_Nikolaeva at epam.com, EPAM Systems, Inc. <www.epam.com>
- *
- */
-public class AbstractLocusInfo<E extends AbstractRecordAndOffset> implements Locus {
-    /**
-     * Reference sequence, to which the reads are aligned.
-     **/
-    private final SAMSequenceRecord referenceSequence;
-    /**
-     * Position in the sequence, to which the reads are aligned.
-     **/
-    private final int position;
-
-    /**
-     * Initial size for the list of <code>AbstractRecordAndOffset</code> objects
-     **/
-    private final static int INITIAL_LIST_SIZE = 100;
-
-    /**
-     * List of aligned to current position reads
-     **/
-    private final List<E> recordAndOffsets = new ArrayList<>(INITIAL_LIST_SIZE);
-
-    /**
-     * @param referenceSequence reference sequence to which the reads are aligned
-     * @param position          position in the sequence to which the reads are aligned
-     */
-    public AbstractLocusInfo(final SAMSequenceRecord referenceSequence, final int position) {
-        this.referenceSequence = referenceSequence;
-        this.position = position;
-    }
-
-    /**
-     * Accumulates info for one read aligned to the locus. Method doesn't check, that <code>recordAndOffset</code>
-     * is really aligned to current reference position, so it must have valid reference sequence and
-     * position or further processing can go wrong.
-     *
-     * @param recordAndOffset object to add to current locus
-     */
-    public void add(E recordAndOffset) {
-        recordAndOffsets.add(recordAndOffset);
-    }
-
-    /**
-     * @return the index of reference sequence
-     */
-    public int getSequenceIndex() {
-        return referenceSequence.getSequenceIndex();
-    }
-
-    /**
-     * @return 1-based reference position
-     */
-    public int getPosition() {
-        return position;
-    }
-
-    /**
-     * @deprecated since name of the method can be confusing, new implementation should be used
-     *          {@code getRecordAndOffsets()}
-     * @return unmodifiable list of aligned to the reference position <code>recordsAndOffsets</code>
-     */
-    @Deprecated
-    public List<E> getRecordAndPositions() {
-        return Collections.unmodifiableList(recordAndOffsets);
-    }
-
-    /**
-     * @return unmodifiable list of aligned to the reference position <code>recordsAndOffsets</code>
-     */
-    public List<E> getRecordAndOffsets() {
-        return Collections.unmodifiableList(recordAndOffsets);
-    }
-
-    /**
-     * @return the name of reference sequence
-     */
-    public String getSequenceName() {
-        return referenceSequence.getSequenceName();
-    }
-
-    @Override
-    public String toString() {
-        return referenceSequence.getSequenceName() + ":" + position;
-    }
-
-    /**
-     * @return the length of reference sequence
-     */
-    public int getSequenceLength() {
-        return referenceSequence.getSequenceLength();
-    }
-
-    /** 
-     * @return the number of records overlapping the position
-     */
-    public int size() { 
-        return this.recordAndOffsets.size(); 
-    }
-
-    /**
-     * @return <code>true</code> if RecordAndOffset list is empty;
-     */
-    public boolean isEmpty() {
-        return getRecordAndOffsets().isEmpty();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractLocusIterator.java b/src/main/java/htsjdk/samtools/util/AbstractLocusIterator.java
deleted file mode 100644
index 6ff8e83..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractLocusIterator.java
+++ /dev/null
@@ -1,572 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.filter.AggregateFilter;
-import htsjdk.samtools.filter.DuplicateReadFilter;
-import htsjdk.samtools.filter.FilteringSamIterator;
-import htsjdk.samtools.filter.SamRecordFilter;
-import htsjdk.samtools.filter.SecondaryOrSupplementaryFilter;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Iterator that traverses a SAM File, accumulating information on a per-locus basis.
- * Optionally takes a target interval list, in which case the loci returned are the ones covered by
- * the interval list.  If no target interval list, whatever loci are covered by the input reads are returned.
- * By default duplicate reads and non-primary alignments are filtered out.  Filtering may be changed
- * via setSamFilters().
- *
- * @author Darina_Nikolaeva at epam.com, EPAM Systems, Inc. <www.epam.com>
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-
-public abstract class AbstractLocusIterator<T extends AbstractRecordAndOffset, K extends AbstractLocusInfo<T>> implements Iterable<K>, CloseableIterator<K> {
-
-    static final Log LOG = Log.getInstance(AbstractLocusIterator.class);
-
-    private final SamReader samReader;
-    final private ReferenceSequenceMask referenceSequenceMask;
-    private PeekableIterator<SAMRecord> samIterator;
-    private List<SamRecordFilter> samFilters = Arrays.asList(new SecondaryOrSupplementaryFilter(),
-            new DuplicateReadFilter());
-    final List<Interval> intervals;
-
-    /**
-     * If true, do indexed lookup to improve performance.  Not relevant if intervalList == null.
-     * It is no longer the case the useIndex==true can make performance worse.  It should always perform at least
-     * as well as useIndex==false, and generally will be much faster.
-     */
-    private final boolean useIndex;
-
-    /**
-     * LocusInfos on this list are ready to be returned by iterator.  All reads that overlap
-     * the locus have been accumulated before the AbstractLocusInfo is moved into this list.
-     */
-    private final ArrayList<K> complete = new ArrayList<>(100);
-
-    /**
-     * LocusInfos for which accumulation is in progress.  When {@link #accumulateSamRecord(SAMRecord)} is called
-     * the state of this list is guaranteed to be either:
-     * a) Empty, or
-     * b) That the element at index 0 corresponds to the same genomic locus as the first aligned base
-     * in the read being accumulated
-     * <p>
-     * Before each new read is accumulated the accumulator is examined and:
-     * i) any LocusInfos at positions earlier than the read start are moved to {@link #complete}
-     * ii) any uncovered positions between the last AbstractLocusInfo and the first aligned base of the new read
-     * have LocusInfos created and added to {@link #complete} if we are emitting uncovered loci
-     */
-    final ArrayList<K> accumulator = new ArrayList<>(100);
-
-    private int qualityScoreCutoff = Integer.MIN_VALUE;
-    private int mappingQualityScoreCutoff = Integer.MIN_VALUE;
-    private boolean includeNonPfReads = true;
-
-    /**
-     * If true, emit a AbstractLocusInfo for every locus in the target map, or if no target map,
-     * emit a AbstractLocusInfo for every locus in the reference sequence.
-     * If false, emit a AbstractLocusInfo only if a locus has coverage.
-     */
-    private boolean emitUncoveredLoci = true;
-
-    /**
-     * If set, this will cap the number of reads we accumulate for any given position.
-     * Note that if we hit the maximum threshold at the first position in the accumulation queue,
-     * then we throw further reads overlapping that position completely away (including for subsequent positions).
-     * This is a useful feature if one wants to minimize the memory footprint in files with a few massively large pileups,
-     * but it must be pointed out that it could cause major bias because of the non-random nature with which the cap is
-     * applied (the first maxReadsToAccumulatePerLocus reads are kept and all subsequent ones are dropped).
-     */
-    private int maxReadsToAccumulatePerLocus = Integer.MAX_VALUE;
-
-    /**
-     * Set to true when we have enforced the accumulation limit for the first time
-     */
-    private boolean enforcedAccumulationLimit = false;
-
-    /**
-     * If true, include indels in the LocusInfo
-     */
-    protected boolean includeIndels = false;
-
-    /**
-     * When there is a target mask, these members remember the last locus for which a AbstractLocusInfo has been
-     * returned, so that any uncovered locus in the target mask can be covered by a 0-coverage AbstractLocusInfo
-     */
-    private int lastReferenceSequence = 0;
-
-    /**
-     * Last processed locus position in the reference
-     */
-    private int lastPosition = 0;
-
-    /**
-     * Set to true when past all aligned reads in input SAM file
-     */
-    private boolean finishedAlignedReads = false;
-
-    private final LocusComparator<Locus> locusComparator = new LocusComparator<>();
-
-    /**
-     * Last processed interval, relevant only if list of intervals is defined.
-     */
-    private int lastInterval = 0;
-
-    /**
-     * Prepare to iterate through the given SAM records, skipping non-primary alignments
-     *
-     * @param samReader    must be coordinate sorted
-     * @param intervalList Either the list of desired intervals, or null.  Note that if an intervalList is
-     *                     passed in that is not coordinate sorted, it will eventually be coordinated sorted by this class.
-     * @param useIndex     If true, do indexed lookup to improve performance.  Not relevant if intervalList == null.
-     *                     It is no longer the case the useIndex==true can make performance worse.  It should always perform at least
-     *                     as well as useIndex==false, and generally will be much faster.
-     */
-
-    public AbstractLocusIterator(final SamReader samReader, final IntervalList intervalList, final boolean useIndex) {
-        final String className = this.getClass().getSimpleName();
-        if (samReader.getFileHeader().getSortOrder() == null || samReader.getFileHeader().getSortOrder() == SAMFileHeader.SortOrder.unsorted) {
-
-            LOG.warn(className + " constructed with samReader that has SortOrder == unsorted.  ", "" +
-                    "Assuming SAM is coordinate sorted, but exceptions may occur if it is not.");
-        } else if (samReader.getFileHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
-            throw new SAMException(className + " cannot operate on a SAM file that is not coordinate sorted.");
-        }
-        this.samReader = samReader;
-        this.useIndex = useIndex;
-        if (intervalList != null) {
-            intervals = intervalList.uniqued().getIntervals();
-            this.referenceSequenceMask = new IntervalListReferenceSequenceMask(intervalList);
-        } else {
-            intervals = null;
-            this.referenceSequenceMask = new WholeGenomeReferenceSequenceMask(samReader.getFileHeader());
-        }
-    }
-
-    /**
-     * @return iterator over all/all covered locus position in reference according to <code>emitUncoveredLoci</code>
-     * value.
-     */
-    public Iterator<K> iterator() {
-        if (samIterator != null) {
-            throw new IllegalStateException("Cannot call iterator() more than once on " + this.getClass().getSimpleName());
-        }
-        CloseableIterator<SAMRecord> tempIterator;
-        if (intervals != null) {
-            tempIterator = new SamRecordIntervalIteratorFactory().makeSamRecordIntervalIterator(samReader, intervals, useIndex);
-        } else {
-            tempIterator = samReader.iterator();
-        }
-        if (samFilters != null) {
-            tempIterator = new FilteringSamIterator(tempIterator, new AggregateFilter(samFilters));
-        }
-        samIterator = new PeekableIterator<>(tempIterator);
-        return this;
-    }
-
-    /**
-     * Closes inner <code>SamIterator</>.
-     */
-    public void close() {
-        this.samIterator.close();
-    }
-
-    private boolean samHasMore() {
-        return !finishedAlignedReads && (samIterator.peek() != null);
-    }
-
-    /**
-     * Returns true if there are more AbstractLocusInfo<T> objects that can be returned, due to any of the following reasons:
-     * 1) there are more aligned reads in the SAM file
-     * 2) there are AbstractLocusInfo<T>s in some stage of accumulation
-     * 3) there are loci in the target mask that have yet to be accumulated (even if there are no reads covering them)
-     */
-    public boolean hasNext() {
-        if (this.samIterator == null) {
-            iterator();
-        }
-
-        while (complete.isEmpty() && ((!accumulator.isEmpty()) || samHasMore() || hasRemainingMaskBases())) {
-            final K locusInfo = next();
-            if (locusInfo != null) {
-                complete.add(0, locusInfo);
-            }
-        }
-        return !complete.isEmpty();
-    }
-
-    /**
-     * @return true if there are more bases at which the locus iterator must emit AbstractLocusInfo<T>s because
-     * there are loci beyond the last emitted loci which are in the set of loci to be emitted and
-     * the iterator is setup to emit uncovered loci - so we can guarantee we'll emit those loci.
-     */
-    private boolean hasRemainingMaskBases() {
-        // if there are more sequences in the mask, by definition some of them must have
-        // marked bases otherwise if we're in the last sequence, but we're not at the last marked position,
-        // there is also more in the mask
-        if (!emitUncoveredLoci) {
-            // If not emitting uncovered loci, this check is irrelevant
-            return false;
-        }
-        return (lastReferenceSequence < referenceSequenceMask.getMaxSequenceIndex() ||
-                (lastReferenceSequence == referenceSequenceMask.getMaxSequenceIndex() &&
-                        lastPosition < referenceSequenceMask.nextPosition(lastReferenceSequence, lastPosition)));
-    }
-
-    /**
-     * hasNext() has been fixed so that if it returns true, next() is now guaranteed not to return null.
-     *
-     * @return information about next locus position in reference sequence
-     */
-    public K next() {
-        // if we don't have any completed entries to return, try and make some!
-        while (complete.isEmpty() && samHasMore()) {
-            final SAMRecord rec = samIterator.peek();
-
-            // There might be unmapped reads mixed in with the mapped ones, but when a read
-            // is encountered with no reference index it means that all the mapped reads have been seen.
-            if (rec.getReferenceIndex() == -1) {
-                this.finishedAlignedReads = true;
-                continue;
-
-            }
-            // Skip over an unaligned read that has been forced to be sorted with the aligned reads
-            if (rec.getReadUnmappedFlag()
-                    || rec.getMappingQuality() < this.mappingQualityScoreCutoff
-                    || (!this.includeNonPfReads && rec.getReadFailsVendorQualityCheckFlag())) {
-                samIterator.next();
-                continue;
-            }
-
-            int start = rec.getAlignmentStart();
-            // only if we are including indels and the record does not start in the first base of the reference
-            // the stop locus to populate the queue is not the same if the record starts with an insertion
-            if (includeIndels && start != 1 && startWithInsertion(rec.getCigar())) {
-                // the start to populate is one less
-                start--;
-            }
-            final Locus alignmentStart = new LocusImpl(rec.getReferenceIndex(), start);
-            // emit everything that is before the start of the current read, because we know no more
-            // coverage will be accumulated for those loci.
-            while (!accumulator.isEmpty() && locusComparator.compare(accumulator.get(0), alignmentStart) < 0) {
-                final K first = accumulator.get(0);
-                populateCompleteQueue(alignmentStart);
-                if (!complete.isEmpty()) {
-                    return complete.remove(0);
-                }
-                if (!accumulator.isEmpty() && first == accumulator.get(0)) {
-                    throw new SAMException("Stuck in infinite loop");
-                }
-            }
-
-            // at this point, either the accumulator list is empty or the head should
-            // be the same position as the first base of the read (or insertion if first)
-            if (!accumulator.isEmpty()) {
-                if (accumulator.get(0).getSequenceIndex() != rec.getReferenceIndex() ||
-                        accumulator.get(0).getPosition() != start) {
-                    throw new IllegalStateException("accumulator should be empty or aligned with current SAMRecord");
-                }
-            }
-
-            // Store the loci for the read in the accumulator
-            if (!surpassedAccumulationThreshold()) {
-                accumulateSamRecord(rec);
-                // Store the indels if requested
-                if (includeIndels) {
-                    accumulateIndels(rec);
-                }
-            }
-            samIterator.next();
-        }
-
-        final Locus endLocus = new LocusImpl(Integer.MAX_VALUE, Integer.MAX_VALUE);
-        // if we have nothing to return to the user, and we're at the end of the SAM iterator,
-        // push everything into the complete queue
-        if (complete.isEmpty() && !samHasMore()) {
-            while (!accumulator.isEmpty()) {
-                populateCompleteQueue(endLocus);
-                if (!complete.isEmpty()) {
-                    return complete.remove(0);
-                }
-            }
-        }
-
-        // if there are completed entries, return those
-        if (!complete.isEmpty()) {
-            return complete.remove(0);
-        } else if (emitUncoveredLoci) {
-            final Locus afterLastMaskPositionLocus = new LocusImpl(referenceSequenceMask.getMaxSequenceIndex(),
-                    referenceSequenceMask.getMaxPosition() + 1);
-            // In this case... we're past the last read from SAM so see if we can
-            // fill out any more (zero coverage) entries from the mask
-            return createNextUncoveredLocusInfo(afterLastMaskPositionLocus);
-        } else {
-            return null;
-        }
-    }
-
-
-    /**
-     * @return true if we have surpassed the maximum accumulation threshold for the first locus in the accumulator, false otherwise
-     */
-
-    private boolean surpassedAccumulationThreshold() {
-        final boolean surpassesThreshold = !accumulator.isEmpty() && accumulator.get(0).getRecordAndOffsets().size() >= maxReadsToAccumulatePerLocus;
-        if (surpassesThreshold && !enforcedAccumulationLimit) {
-            LOG.warn("We have encountered greater than " + maxReadsToAccumulatePerLocus + " reads at position " + accumulator.get(0).toString() + " and will ignore the remaining reads at this position.  Note that further warnings will be suppressed.");
-            enforcedAccumulationLimit = true;
-        }
-        return surpassesThreshold;
-    }
-
-    /**
-     * Capture the loci covered by the given SAMRecord in the LocusInfos in the accumulator,
-     * creating new LocusInfos as needed.
-     *
-     * @param rec record to add to accumulator
-     */
-    abstract void accumulateSamRecord(final SAMRecord rec);
-
-
-    /**
-     * Requires that the accumulator for the record is previously fill with
-     * {@link #accumulateSamRecord(htsjdk.samtools.SAMRecord)}.
-     * Include in the LocusInfo the indels; the quality threshold does not affect insertions/deletions
-     */
-    abstract void accumulateIndels(final SAMRecord rec);
-
-    /**
-     * @param rec         aligned SamRecord
-     * @param readOffset  offset from start of read
-     * @param length      length of aligned block
-     * @param refPosition position in the reference sequence
-     * @return RecordAndOffset
-     */
-    abstract T createRecordAndOffset(SAMRecord rec, int readOffset, int length, int refPosition);
-
-    /**
-     * Create the next relevant zero-coverage AbstractLocusInfo<T>
-     *
-     * @param stopBeforeLocus don't go up to this sequence and position
-     * @return a zero-coverage AbstractLocusInfo<T>, or null if there is none before the stopBefore locus
-     */
-    private K createNextUncoveredLocusInfo(final Locus stopBeforeLocus) {
-        while (lastReferenceSequence <= stopBeforeLocus.getSequenceIndex() &&
-                lastReferenceSequence <= referenceSequenceMask.getMaxSequenceIndex()) {
-
-            if (lastReferenceSequence == stopBeforeLocus.getSequenceIndex() &&
-                    lastPosition + 1 >= stopBeforeLocus.getPosition()) {
-                return null;
-            }
-
-            final int nextbit = referenceSequenceMask.nextPosition(lastReferenceSequence, lastPosition);
-
-            // try the next reference sequence
-            if (nextbit == -1) {
-                // No more in this reference sequence
-                if (lastReferenceSequence == stopBeforeLocus.getSequenceIndex()) {
-                    lastPosition = stopBeforeLocus.getPosition();
-                    return null;
-                }
-                lastReferenceSequence++;
-                lastPosition = 0;
-            } else if (lastReferenceSequence < stopBeforeLocus.getSequenceIndex() || nextbit < stopBeforeLocus.getPosition()) {
-                lastPosition = nextbit;
-                return createLocusInfo(getReferenceSequence(lastReferenceSequence), lastPosition);
-            } else if (nextbit >= stopBeforeLocus.getPosition()) {
-                return null;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param referenceSequence processed reference sequence
-     * @param lastPosition      last processed reference locus position
-     * @return <code>AbstractLocusInfo<T></code> for the lastPosition
-     */
-    abstract K createLocusInfo(SAMSequenceRecord referenceSequence, int lastPosition);
-
-    /**
-     * Pop the first entry from the AbstractLocusInfo<T> accumulator into the complete queue.  In addition,
-     * check the ReferenceSequenceMask and if there are intervening mask positions between the last popped base and the one
-     * about to be popped, put those on the complete queue as well.
-     * Note that a single call to this method may not empty the accumulator completely, or even
-     * empty it at all, because it may just put a zero-coverage AbstractLocusInfo<T> into the complete queue.
-     *
-     * @param stopBeforeLocus don't go up to this sequence and position
-     */
-    private void populateCompleteQueue(final Locus stopBeforeLocus) {
-        // Because of gapped alignments, it is possible to create LocusInfo's with no reads associated with them.
-        // Skip over these if not including indels
-        while (!accumulator.isEmpty() && accumulator.get(0).isEmpty() &&
-                locusComparator.compare(accumulator.get(0), stopBeforeLocus) < 0) {
-            accumulator.remove(0);
-        }
-        if (accumulator.isEmpty()) {
-            return;
-        }
-        final K locusInfo = accumulator.get(0);
-        if (locusComparator.compare(stopBeforeLocus, locusInfo) <= 0) {
-            return;
-        }
-
-        // If necessary, emit a zero-coverage LocusInfo
-        if (emitUncoveredLoci) {
-            final K zeroCoverage = createNextUncoveredLocusInfo(locusInfo);
-            if (zeroCoverage != null) {
-                complete.add(zeroCoverage);
-                return;
-            }
-        }
-
-        // At this point we know we're going to process the LocusInfo, so remove it from the accumulator.
-        accumulator.remove(0);
-
-        // fill in any gaps based on our genome mask
-        final int sequenceIndex = locusInfo.getSequenceIndex();
-
-
-        // only add to the complete queue if it's in the mask (or we have no mask!)
-        if (referenceSequenceMask.get(locusInfo.getSequenceIndex(), locusInfo.getPosition())) {
-            complete.add(locusInfo);
-        }
-
-        lastReferenceSequence = sequenceIndex;
-        lastPosition = locusInfo.getPosition();
-    }
-
-    protected SAMSequenceRecord getReferenceSequence(final int referenceSequenceIndex) {
-        return samReader.getFileHeader().getSequence(referenceSequenceIndex);
-    }
-
-    public void remove() {
-        throw new UnsupportedOperationException("Can not remove records from a SAM file via an iterator!");
-    }
-
-    /**
-     * Check if cigar start with an insertion, ignoring other operators that do not consume references bases
-     *
-     * @param cigar the cigar
-     * @return <code>true</code> if the first operator to consume reference bases or be an insertion, is an insertion; <code>false</code> otherwise
-     */
-    protected static boolean startWithInsertion(final Cigar cigar) {
-        for (final CigarElement element : cigar.getCigarElements()) {
-            if (element.getOperator() == CigarOperator.I) return true;
-            if (!element.getOperator().consumesReferenceBases()) continue;
-            break;
-        }
-        return false;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    // Helper methods below this point...
-    // --------------------------------------------------------------------------------------------
-
-    /**
-     * Controls which, if any, SAMRecords are filtered.  By default duplicate reads and non-primary alignments
-     * are filtered out.  The list of filters passed here replaces any existing filters.
-     *
-     * @param samFilters list of filters, or null if no filtering is desired.
-     */
-    public void setSamFilters(final List<SamRecordFilter> samFilters) {
-        this.samFilters = samFilters;
-    }
-
-    public int getQualityScoreCutoff() {
-        return qualityScoreCutoff;
-    }
-
-    public void setQualityScoreCutoff(final int qualityScoreCutoff) {
-        this.qualityScoreCutoff = qualityScoreCutoff;
-    }
-
-    public int getMappingQualityScoreCutoff() {
-        return mappingQualityScoreCutoff;
-    }
-
-    public void setMappingQualityScoreCutoff(final int mappingQualityScoreCutoff) {
-        this.mappingQualityScoreCutoff = mappingQualityScoreCutoff;
-    }
-
-    public boolean isIncludeNonPfReads() {
-        return includeNonPfReads;
-    }
-
-    public void setIncludeNonPfReads(final boolean includeNonPfReads) {
-        this.includeNonPfReads = includeNonPfReads;
-    }
-
-    public boolean isEmitUncoveredLoci() {
-        return emitUncoveredLoci;
-    }
-
-    public void setEmitUncoveredLoci(final boolean emitUncoveredLoci) {
-        this.emitUncoveredLoci = emitUncoveredLoci;
-    }
-
-    public int getMaxReadsToAccumulatePerLocus() {
-        return maxReadsToAccumulatePerLocus;
-    }
-
-    /**
-     * If set, this will cap the number of reads we accumulate for any given position.
-     * As is pointed out above, setting this could cause major bias because of the non-random nature with which the
-     * cap is applied (the first maxReadsToAccumulatePerLocus reads are kept and all subsequent ones are dropped).
-     */
-    public void setMaxReadsToAccumulatePerLocus(final int maxReadsToAccumulatePerLocus) {
-        this.maxReadsToAccumulatePerLocus = maxReadsToAccumulatePerLocus;
-    }
-
-    protected List<Interval> getIntervals() {
-        return intervals;
-    }
-
-    protected Interval getCurrentInterval() {
-        if (intervals == null) return null;
-        return intervals.get(lastInterval);
-    }
-
-    public boolean isIncludeIndels() {
-        return includeIndels;
-    }
-
-    public void setIncludeIndels(final boolean includeIndels) {
-        this.includeIndels = includeIndels;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractProgressLogger.java b/src/main/java/htsjdk/samtools/util/AbstractProgressLogger.java
deleted file mode 100644
index de1f694..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractProgressLogger.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecord;
-
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
-
-/**
- * Abstract implementation of a Little progress logging class to facilitate consistent output of useful information when progressing
- * through a stream of SAM records.
- *
- * Concrete subclasses must provide the logger
- */
-abstract public class AbstractProgressLogger implements ProgressLoggerInterface {
-    private final int n;
-    private final String verb;
-    private final String noun;
-    private final long startTime = System.currentTimeMillis();
-    private final NumberFormat fmt = new DecimalFormat("#,###");
-    private final NumberFormat timeFmt = new DecimalFormat("00");
-    private long processed = 0;
-    // Set to -1 until the first record is added
-    private long lastStartTime = -1;
-
-    /**
-     * Construct an AbstractProgressLogger.
-     *
-     * This must be called by any subclasses
-     *
-     * @param n the frequency with which to output (i.e. every N records)
-     * @param verb the verb to log, e.g. "Processed, Read, Written".
-     * @param noun the noun to use when logging, e.g. "Records, Variants, Loci"
-     */
-    protected AbstractProgressLogger(final String noun, final String verb, final int n) {
-        this.noun = noun;
-        this.verb = verb;
-        this.n = n;
-    }
-
-    /**
-     * Log a message to whatever logger is being used
-     *
-     * @param message a message to be logged by the logger (recommended output level is INFO or the equivalent)
-     */
-    abstract protected void log(String ... message);
-
-    @Override
-    public synchronized boolean record(final String chrom, final int pos) {
-	    if (this.lastStartTime == -1) this.lastStartTime = System.currentTimeMillis();
-	    if (++this.processed % this.n == 0) {
-            final long now = System.currentTimeMillis();
-            final long lastPeriodSeconds = (now - this.lastStartTime) / 1000;
-            this.lastStartTime = now;
-
-            final long seconds = (System.currentTimeMillis() - startTime) / 1000;
-            final String elapsed   = formatElapseTime(seconds);
-            final String period    = pad(fmt.format(lastPeriodSeconds), 4);
-            final String processed = pad(fmt.format(this.processed), 13);
-
-            final String readInfo;
-            if (chrom == null) readInfo = "*/*";
-            else readInfo = chrom + ":" + fmt.format(pos);
-
-            log(this.verb, " ", processed, " " + noun + ".  Elapsed time: ", elapsed, "s.  Time for last ", fmt.format(this.n),
-                    ": ", period, "s.  Last read position: ", readInfo);
-            return true;
-        }
-        else {
-            return false;
-        }
-    }
-
-    /**
-     * Records that a given record has been processed and triggers logging if necessary.
-     * @return boolean true if logging was triggered, false otherwise
-     */
-    @Override
-    public synchronized boolean record(final SAMRecord rec) {
-        if (SAMRecord.NO_ALIGNMENT_REFERENCE_NAME.equals(rec.getReferenceName())) {
-            return record(null, 0);
-        }
-        else {
-            return record(rec.getReferenceName(), rec.getAlignmentStart());
-        }
-    }
-
-    /** Records multiple SAMRecords and triggers logging if necessary. */
-    @Override
-    public boolean record(final SAMRecord... recs) {
-        boolean triggered = false;
-        for (final SAMRecord rec : recs) triggered = record(rec) || triggered;
-        return triggered;
-    }
-
-    /** Returns the count of records processed. */
-    public synchronized long getCount() { return this.processed; }
-
-    /** Returns the number of seconds since progress tracking began. */
-    public long getElapsedSeconds() { return (System.currentTimeMillis() - this.startTime) / 1000; }
-
-    /** Left pads a string until it is at least the given length. */
-    private String pad (String in, final int length) {
-        while (in.length() < length) {
-            in = " " + in;
-        }
-
-        return in;
-    }
-
-    /** Formats a number of seconds into hours:minutes:seconds. */
-    private String formatElapseTime(final long seconds) {
-        final long s = seconds % 60;
-        final long allMinutes = seconds / 60;
-        final long m = allMinutes % 60;
-        final long h = allMinutes / 60;
-
-        return timeFmt.format(h) + ":" + timeFmt.format(m) + ":" + timeFmt.format(s);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractRecordAndOffset.java b/src/main/java/htsjdk/samtools/util/AbstractRecordAndOffset.java
deleted file mode 100644
index 28b9d34..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractRecordAndOffset.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Holds a SAMRecord plus the zero-based offset into that SAMRecord's bases and quality scores that corresponds
- * to the base and quality at the genomic position described the containing AbstractLocusInfo. One object represents
- * one base for <code>SamLocusIterator.RecordAndOffset</code> implementation or one alignment block of
- * <code>SAMRecord</code> for <code>TypedRecordAndOffset</code> implementation.
- * 
- * @author Darina_Nikolaeva at epam.com, EPAM Systems, Inc. <www.epam.com>
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-public class AbstractRecordAndOffset {
-
-    /**
-     * A SAMRecord aligned to reference position
-     */
-    protected final SAMRecord record;
-    /**
-     * Zero-based offset in the read corresponding to the current position in AbstractLocusInfo
-     */
-    protected final int offset;
-
-    /**
-     * @param record inner SAMRecord
-     * @param offset from the start of the read
-     * @param length of alignment block
-     * @param refPos corresponding to read offset reference position
-     */
-    public AbstractRecordAndOffset(final SAMRecord record, final int offset, int length, int refPos) {
-        this(record, offset);
-    }
-
-    /**
-     * @param record inner SAMRecord
-     * @param offset from the start of the read
-     */
-    public AbstractRecordAndOffset(final SAMRecord record, final int offset) {
-        this.offset = offset;
-        this.record = record;
-    }
-
-    /**
-     * @return offset of aligned read base from the start of the read.
-     */
-    public int getOffset() {
-        return offset;
-    }
-
-    /**
-     * @return inner <code>SAMRecord</code> object.
-     */
-    public SAMRecord getRecord() {
-        return record;
-    }
-
-    /**
-     * @return the read base according to <code>offset</code>.
-     */
-    public byte getReadBase() {
-        return record.getReadBases()[offset];
-    }
-
-    /**
-     * @return the length of alignment block represented by the object.
-     */
-    public int getLength() {
-        return 1;
-    }
-
-    /**
-     * @return the position in reference sequence, to which the start of alignment block is aligned.
-     */
-    public int getRefPos() {
-        return -1;
-    }
-
-    /**
-     * @return read name of inner SAMRecord.
-     */
-    public String getReadName() {
-        return record.getReadName();
-    }
-
-    /**
-     * @return array of base qualities of inner SAMRecord.
-     */
-    public byte[] getBaseQualities() {
-        return record.getBaseQualities();
-    }
-    
-    /**
-     * @return the base quality according to <code>offset</code>.
-     */
-    public byte getBaseQuality() {
-        return record.getBaseQualities()[offset];
-    }
-
-    protected void validateOffset(int offset, final byte[] array) {
-        if (offset < 0 || offset >= array.length) {
-            throw new IllegalArgumentException("The requested position is not covered by this " + this.getClass().getSimpleName() +
-                    " object.");
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AsciiWriter.java b/src/main/java/htsjdk/samtools/util/AsciiWriter.java
deleted file mode 100644
index 00c6f7f..0000000
--- a/src/main/java/htsjdk/samtools/util/AsciiWriter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Defaults;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-
-/**
- * Fast (I hope) buffered Writer that converts char to byte merely by casting, rather than charset conversion.
- */
-public class AsciiWriter extends Writer {
-
-    private final OutputStream os;
-    // Buffer size has not been tuned.
-    private final byte[] buffer = new byte[Defaults.NON_ZERO_BUFFER_SIZE];
-    private int numBytes;
-
-    /**
-     * @param os need not be buffered as this class buffers
-     */
-    public AsciiWriter(final OutputStream os) {
-        this.os = os;
-        numBytes = 0;
-    }
-
-    /**
-     * flushes and closes underlying OutputStream.
-     */
-    public void close() throws IOException {
-        flush();
-        os.close();
-    }
-
-    /**
-     * flushes underlying OutputStream
-     */
-    public void flush() throws IOException {
-        os.write(buffer, 0, numBytes);
-        numBytes = 0;
-        os.flush();
-    }
-
-    /**
-     * All other Writer methods vector through this, so this is the only one that must be overridden.
-     */
-    public void write(final char[] chars, int offset, int length) throws IOException {
-        while (length > 0) {
-            final int charsToConvert = Math.min(length, buffer.length - numBytes);
-            StringUtil.charsToBytes(chars, offset, charsToConvert, buffer, numBytes);
-            numBytes += charsToConvert;
-            offset += charsToConvert;
-            length -= charsToConvert;
-            if (numBytes == buffer.length) {
-                os.write(buffer, 0, numBytes);
-                numBytes = 0;
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AsyncBufferedIterator.java b/src/main/java/htsjdk/samtools/util/AsyncBufferedIterator.java
deleted file mode 100644
index bf78ecb..0000000
--- a/src/main/java/htsjdk/samtools/util/AsyncBufferedIterator.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Daniel Cameron
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Iterator that uses a dedicated background thread to perform read-ahead to improve
- * throughput at the expense of increased latency. This iterator will block
- * until the background thread has read a full buffer of records.
- * 
- * Note that this implementation is not synchronized. If multiple threads
- * access an instance concurrently, it must be synchronized externally. 
- * 
- * @author Daniel Cameron
- *
- */
-public class AsyncBufferedIterator<T> implements CloseableIterator<T> {
-    private static final Log log = Log.getInstance(AsyncBufferedIterator.class);
-    private static final AtomicInteger threadsCreated = new AtomicInteger(0);
-    private final int bufferSize;
-    /**
-     * A dedicated background thread is required since these iterators can be chained
-     * thus able to block on each other. Usage of a thread pool would result in
-     * a deadlock due to task dependencies.
-     */
-    private Thread backgroundThread;
-    private final Iterator<T> underlyingIterator;
-    private final BlockingQueue<IteratorBuffer<T>> buffers;
-    private IteratorBuffer<T> currentBlock = new IteratorBuffer<>(Collections.emptyList());
-
-    /**
-     * Creates a new iterator that traverses the given iterator on a background
-     * thread
-     * 
-     * @param iterator iterator to traverse
-     * @param bufferSize size of read-ahead buffer. A larger size will increase both throughput and latency.
-     * Double buffering is used so the maximum number of records on which read-ahead is performed is twice this.
-     */
-    public AsyncBufferedIterator(final Iterator<T> iterator, final int bufferSize) {
-        this(iterator, bufferSize, 1, null);
-    }
-    
-    /**
-     * Creates a new iterator that traverses the given iterator on a background
-     * thread
-     * 
-     * @param iterator iterator to traverse
-     * @param bufferSize size of each read-ahead buffer. A larger size will increase both throughput and latency.
-     * @param bufferCount number of read-ahead buffers
-     */
-    public AsyncBufferedIterator(final Iterator<T> iterator, final int bufferSize, final int bufferCount) {
-        this(iterator, bufferSize, bufferCount, null);
-    }
-
-    /**
-     * Creates a new iterator that traverses the given iterator on a background
-     * thread
-     * 
-     * @param iterator iterator to traverse
-     * @param bufferSize size of each read-ahead buffer. A larger size will increase both throughput and latency.
-     * @param bufferCount number of read-ahead buffers
-     * @param threadName background thread name. A name will be automatically generated if this parameter is null.
-     */
-    public AsyncBufferedIterator(final Iterator<T> iterator, final int bufferSize, final int bufferCount, final String threadName) {
-        if (iterator == null) throw new IllegalArgumentException("iterator cannot be null");
-        if (bufferCount <= 0) throw new IllegalArgumentException("Must use at least 1 buffer.");
-        if (bufferSize <= 0) throw new IllegalArgumentException("Buffer size must be at least 1 record.");
-        this.underlyingIterator = iterator;
-        this.buffers = new ArrayBlockingQueue<>(bufferCount);
-        this.bufferSize = bufferSize;
-        int threadNumber = threadsCreated.incrementAndGet();
-        this.backgroundThread = new Thread(new Runnable() {
-                @Override
-                public void run() {
-                    backgroundRun();
-                }
-            }, threadName != null ? threadName : getThreadNamePrefix() + threadNumber);
-        this.backgroundThread.setDaemon(true);
-        log.debug("Starting thread " + this.backgroundThread.getName());
-        this.backgroundThread.start();
-    }
-
-    protected String getThreadNamePrefix() {
-        return AsyncBufferedIterator.class.getSimpleName();
-    }
-
-    @Override
-    public void close() {
-        if (backgroundThread != null) {
-            try {
-                backgroundThread.interrupt();
-                buffers.clear();
-                backgroundThread.join();
-            } catch (InterruptedException ie) {
-                throw new RuntimeException("Interrupted waiting for background thread to complete", ie);
-            } finally {
-                CloserUtil.close(underlyingIterator);
-                backgroundThread = null;
-                currentBlock = null;
-            }
-        }
-    }
-    
-    private void ensureHasNext() {
-        if (!currentBlock.hasNext()) {
-            // Rethrow any exceptions raised on the background thread
-            // at the point the exception would have been encountered
-            // if we had performed synchronous iteration
-            raiseBackgroundThreadException();
-            if (!currentBlock.isEndOfStream()) {
-                try {
-                    // Load the next block
-                    // All exceptions on the background thread are swallowed (except InterruptedException)
-                    // so there's no risk of blocking forever except when the background thread is
-                    // interrupted as we aren't. This does not happen during normal operation as
-                    // interrupting the background thread should only happen during the close() method.
-                    currentBlock = buffers.take();
-                } catch (InterruptedException e) {
-                    throw new RuntimeException("Error reading from background thread", e);
-                }
-            }
-        }
-    }
-
-    @Override
-    public boolean hasNext() {
-        if (backgroundThread == null) {
-            throw new IllegalStateException("iterator has been closed");
-        }
-        ensureHasNext();
-        return currentBlock.hasNext();
-    }
-
-    /**
-     * Raises any exception encountered when processing records on
-     * the background thread back to the foreground caller 
-     * @throws Error
-     */
-    private void raiseBackgroundThreadException() throws Error {
-        Throwable t = currentBlock.getException();
-        if (t != null) {
-            if (t instanceof Error) {
-                throw (Error) t;
-            } else if (t instanceof RuntimeException) {
-                throw (RuntimeException) t;
-            } else {
-                throw new RuntimeException(t);
-            }
-        }
-    }
-
-    @Override
-    public T next() {
-        if (hasNext()) {
-            return currentBlock.next();
-        }
-        throw new NoSuchElementException("next");
-    }
-
-    /**
-     * Performs 1 buffer worth of read-ahead on the underlying iterator
-     * (background thread method) 
-     */
-    private IteratorBuffer<T> readAhead() {
-        List<T> readAhead = null;
-        try {
-            if (!underlyingIterator.hasNext()) return new IteratorBuffer<>();
-            readAhead = new ArrayList<>(bufferSize);
-            for (int i = 0; i < bufferSize && underlyingIterator.hasNext(); i++) {
-                if (Thread.currentThread().isInterrupted()) {
-                    // eager abort if we've been told to stop
-                    return new IteratorBuffer<>(readAhead, new InterruptedException());
-                }
-                readAhead.add(underlyingIterator.next());
-            }
-            return new IteratorBuffer<>(readAhead);
-        } catch (Throwable t) {
-            // Catch absolutely everything so we can try to raise it on the foreground thread
-            return new IteratorBuffer<>(readAhead, t);
-        }
-    }
-    /**
-     * Background thread run loop
-     * @throws InterruptedException 
-     */
-    private void backgroundRun() {
-        try {
-            IteratorBuffer<T> block;
-            do {
-                block = readAhead();
-                if (block.getException() instanceof InterruptedException) {
-                    // stop thread immediately if we've been told to stop
-                    return;
-                }
-                buffers.put(block);
-            } while (!block.isEndOfStream());
-        } catch (InterruptedException e) {
-            // stop thread
-        }
-    }
-    /**
-     * Block of records from the underlying iterator 
-     */
-    private static class IteratorBuffer<U> implements Iterator<U> {
-        private final Throwable exception;
-        private final Iterator<U> it;
-        public IteratorBuffer(Iterable<U> it) {
-            this.it = it != null ? it.iterator() : null;;
-            this.exception = null;
-        }
-
-        /**
-         * Record block with exception thrown when attempting to retrieve the next record
-         * @param it records successfully iterated over
-         * @param exception exception thrown when attempting to iterate over the next record
-         */
-        public IteratorBuffer(Iterable<U> it, Throwable exception) {
-            this.it = it != null ? it.iterator() : null;
-            this.exception = exception;
-        }
-        
-        /**
-         * Record block indicating end of stream 
-         */
-        public IteratorBuffer() {
-            this.it = null;
-            this.exception = null;
-        }
-
-        @Override
-        public boolean hasNext() {
-            return it != null && it.hasNext();
-        }
-
-        @Override
-        public U next() {
-            return it.next();
-        }
-        
-        public boolean isEndOfStream() {
-            return it == null;
-        }
-        
-        /**
-         * Exception thrown when attempting to retrieve records from the underlying stream
-         * @return exception thrown on background thread, null if no exception occurred
-         */
-        public Throwable getException() {
-            return exception;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/BinaryCodec.java b/src/main/java/htsjdk/samtools/util/BinaryCodec.java
deleted file mode 100644
index 8933ee3..0000000
--- a/src/main/java/htsjdk/samtools/util/BinaryCodec.java
+++ /dev/null
@@ -1,670 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.ByteArrayInputStream;
-import java.io.Closeable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.SyncFailedException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Encapsulates file representation of various primitive data types.  Forces little-endian disk representation.
- * Note that this class is currently not very efficient.  There are plans to increase the size of the ByteBuffer,
- * and move data between the ByteBuffer and the underlying input or output stream in larger chunks.
- *
- * All the read methods throw RuntimeEOFException if the input stream is exhausted before the required number
- * of bytes are read.
- *
- * @author Dave Tefft
- */
-public class BinaryCodec implements Closeable {
-
-    //Outstream to write to
-    private OutputStream outputStream;
-    //If a file or filename was given it will be stored here.  Used for error reporting.
-    private String outputFileName;
-
-    //Input stream to read from
-    private InputStream inputStream;
-    //If a file or filename was give to read from it will be stored here.  Used for error reporting.
-    private String inputFileName;
-
-    /*
-    Mode that the BinaryCodec is in.  It is either writing to a binary file or reading from.
-    This is set to true if it is writing to a binary file
-    Right now we don't support reading and writing to the same file with the same BinaryCodec instance
-    */
-    private boolean isWriting;
-
-    /**
-     * For byte swapping.
-     */
-    private ByteBuffer byteBuffer;
-
-    /**
-     * For reading Strings of known length, this can reduce object creation
-     */
-    private final byte[] scratchBuffer = new byte[16];
-
-    // Byte order used in BAM files.
-    private static final ByteOrder LITTLE_ENDIAN = ByteOrder.LITTLE_ENDIAN;
-    private static final byte NULL_BYTE[] = {0};
-
-    public static final long MAX_UBYTE = (Byte.MAX_VALUE * 2) + 1;
-    public static final long MAX_USHORT = (Short.MAX_VALUE * 2) + 1;
-    public static final long MAX_UINT = ((long)Integer.MAX_VALUE * 2) + 1;
-
-    // We never serialize more than this much at a time (except for Strings)
-    private static final int MAX_BYTE_BUFFER = 8;
-
-    //////////////////////////////////////////////////
-    // Constructors                                 //
-    //////////////////////////////////////////////////
-
-    /**
-     * Constructs BinaryCodec from a file and set it's mode to writing or not
-     *
-     * @param file    file to be written to or read from
-     * @param writing whether the file is being written to
-     */
-    public BinaryCodec(final File file, final boolean writing) {
-        this();
-        try {
-            this.isWriting = writing;
-            if (this.isWriting) {
-                this.outputStream = IOUtil.maybeBufferOutputStream(new FileOutputStream(file));
-                this.outputFileName = file.getName();
-            } else {
-                this.inputStream = IOUtil.maybeBufferInputStream(new FileInputStream(file));
-                this.inputFileName = file.getName();
-            }
-        } catch (FileNotFoundException e) {
-            throw new RuntimeIOException("File not found: " + file, e);
-        }
-    }
-
-    /**
-     * Constructs BinaryCodec from a file name and set it's mode to writing or not
-     *
-     * @param fileName name of the file to be written to or read from
-     * @param writing  writing whether the file is being written to
-     */
-    public BinaryCodec(final String fileName, final boolean writing) {
-        this(new File(fileName), writing);
-    }
-
-    /**
-     * Constructs BinaryCodec from an output stream
-     *
-     * @param outputStream Stream to write to, since it's an output stream we know that isWriting
-     *                     should be set to true
-     */
-    public BinaryCodec(final OutputStream outputStream) {
-        this();
-        setOutputStream(outputStream);
-    }
-
-    /**
-     * Constructs BinaryCodec from an input stream
-     *
-     * @param inputStream Stream to read from, since we are reading isWriting is set to false
-     */
-    public BinaryCodec(final InputStream inputStream) {
-        this();
-        setInputStream(inputStream);
-    }
-
-    /**
-     * Ambiguous whether reading or writing until set{In,Out}putStream is called
-     */
-    public BinaryCodec() {
-        initByteBuffer();
-    }
-
-    /**
-     * Shared among ctors.
-     * Note that if endianness is changed, all the unsigned methods must also be changed.
-     */
-    private void initByteBuffer() {
-        byteBuffer = ByteBuffer.allocate(MAX_BYTE_BUFFER);
-        byteBuffer.order(LITTLE_ENDIAN);
-    }
-
-    //////////////////////////////////////////////////
-    // Writing methods                              //
-    //////////////////////////////////////////////////
-
-
-    /**
-     * Write whatever has been put into the byte buffer
-     * @param numBytes -- how much to write.  Note that in case of writing an unsigned value,
-     * more bytes were put into the ByteBuffer than will get written out.
-     */
-    private void writeByteBuffer(final int numBytes) {
-        assert(numBytes <= byteBuffer.limit());
-        writeBytes(byteBuffer.array(), 0, numBytes);
-    }
-
-    /**
-     * Writes a byte to the output buffer
-     *
-     * @param bite byte array to write
-     */
-    public void writeByte(final byte bite) {
-        byteBuffer.clear();
-        byteBuffer.put(bite);
-        writeByteBuffer(1);
-    }
-
-    public void writeByte(final int b) {
-        writeByte((byte)b);
-    }
-
-    /**
-     * Writes a byte array to the output buffer
-     *
-     * @param bytes value to write
-     */
-    public void writeBytes(final byte[] bytes) {
-        writeBytes(bytes,  0, bytes.length);
-    }
-
-    public void writeBytes(final byte[] bytes, final int startOffset, final int numBytes) {
-        if (!isWriting) {
-            throw new IllegalStateException("Calling write method on BinaryCodec open for read.");
-        }
-        try {
-            outputStream.write(bytes, startOffset, numBytes);
-        } catch (IOException e) {
-            throw new RuntimeIOException(constructErrorMessage("Write error"), e);
-        }
-    }
-
-    /**
-     * Write a 32-bit int to the output stream
-     *
-     * @param value int to write
-     */
-    public void writeInt(final int value) {
-        byteBuffer.clear();
-        byteBuffer.putInt(value);
-        writeByteBuffer(4);
-    }
-
-    /**
-     * Write a double (8 bytes) to the output stream
-     *
-     * @param value double to write
-     */
-    public void writeDouble(final double value) {
-        byteBuffer.clear();
-        byteBuffer.putDouble(value);
-        writeByteBuffer(8);
-    }
-
-    /**
-     * Write a 64-bit long to the output stream
-     *
-     * @param value long to write
-     */
-    public void writeLong(final long value) {
-        byteBuffer.clear();
-        byteBuffer.putLong(value);
-        writeByteBuffer(8);
-    }
-
-
-    /**
-     * Write a 16-bit short to output stream
-     */
-    public void writeShort(final short value) {
-        byteBuffer.clear();
-        byteBuffer.putShort(value);
-        writeByteBuffer(2);
-    }
-
-    /**
-     * Write a float (4 bytes) to the output stream
-     *
-     * @param value float to write
-     */
-    public void writeFloat(final float value) {
-        byteBuffer.clear();
-        byteBuffer.putFloat(value);
-        writeByteBuffer(4);
-    }
-
-    /**
-     * Writes a boolean (1 byte) to the output buffer
-     *
-     * @param value boolean to write
-     */
-    public void writeBoolean(final boolean value) {
-        byteBuffer.clear();
-        byteBuffer.put(value ? (byte)1 : (byte)0);
-        writeByteBuffer(1);
-    }
-
-    /**
-     * Writes a string to the buffer as ASCII bytes
-     *
-     * @param value       string to write to buffer
-     * @param writeLength prefix the string with the length as a 32-bit int
-     * @param appendNull  add a null byte to the end of the string
-     */
-    public void writeString(final String value, final boolean writeLength, final boolean appendNull) {
-        if (writeLength) {
-            int lengthToWrite = value.length();
-            if (appendNull) lengthToWrite++;
-            writeInt(lengthToWrite);
-        }
-
-        //Actually writes the string to a buffer
-        writeString(value);
-
-        if (appendNull) writeBytes(NULL_BYTE);
-
-    }
-
-
-    /**
-     * Write a string to the buffer as ASCII bytes
-     *
-     * @param value string to write
-     */
-    private void writeString(final String value) {
-        writeBytes(StringUtil.stringToBytes(value));
-    }
-
-    /**
-     * Write an 8-bit unsigned byte.
-     * NOTE: This method will break if we change to big-endian.
-     */
-    public void writeUByte(final short val) {
-        if (val < 0) {
-            throw new IllegalArgumentException("Negative value (" + val + ") passed to unsigned writing method.");
-        }
-        if (val > MAX_UBYTE) {
-            throw new IllegalArgumentException("Value (" + val + ") to large to be written as ubyte.");
-        }
-        byteBuffer.clear();
-        byteBuffer.putShort(val);
-        writeByteBuffer(1);
-    }
-
-    /**
-     * Write a 16-bit unsigned short.
-     * NOTE: This method will break if we change to big-endian.
-     */
-    public void writeUShort(final int val) {
-        if (val < 0) {
-            throw new IllegalArgumentException("Negative value (" + val + ") passed to unsigned writing method.");
-        }
-        if (val > MAX_USHORT) {
-            throw new IllegalArgumentException("Value (" + val + ") too large to be written as ushort.");
-        }
-        byteBuffer.clear();
-        byteBuffer.putInt(val);
-        writeByteBuffer(2);
-    }
-
-    /**
-     * Write a 32-bit unsigned int.
-     * NOTE: This method will break if we change to big-endian.
-     */
-    public void writeUInt(final long val) {
-        if (val < 0) {
-            throw new IllegalArgumentException("Negative value (" + val + ") passed to unsigned writing method.");
-        }
-        if (val > MAX_UINT) {
-            throw new IllegalArgumentException("Value (" + val + ") to large to be written as uint.");
-        }
-        byteBuffer.clear();
-        byteBuffer.putLong(val);
-        writeByteBuffer(4);
-    }
-
-    //////////////////////////////////////////////////
-    // Reading methods                              //
-    //////////////////////////////////////////////////
-
-    /**
-     * Read a byte array from the input stream.
-     *
-     * @throws htsjdk.samtools.util.RuntimeEOFException if fewer than buffer.length bytes to read
-     */
-    public void readBytes(final byte[] buffer) {
-        readBytes(buffer, 0, buffer.length);
-    }
-
-    /**
-     * Read a byte array from the input stream
-     *
-     * @param buffer where to put bytes read
-     * @param offset offset to start putting bytes into buffer
-     * @param length number of bytes to read
-     * @throws RuntimeEOFException if fewer than length bytes to read
-     */
-    public void readBytes(final byte[] buffer, final int offset, final int length) {
-        int totalNumRead = 0;
-        do {
-            final int numRead = readBytesOrFewer(buffer, offset + totalNumRead, length - totalNumRead);
-            if (numRead < 0) {
-                String msg = String.format("Premature EOF. Expected %d but only received %d", length, totalNumRead);
-                throw new RuntimeEOFException(constructErrorMessage(msg));
-            } else {
-                totalNumRead += numRead;
-            }
-        } while (totalNumRead < length);
-    }
-
-    /**
-     * Reads a byte array from the input stream.
-     *
-     * @param buffer where to put bytes read
-     * @param offset offset to start putting bytes into buffer
-     * @param length number of bytes to read.  Fewer bytes may be read if EOF is reached before length bytes
-     *        have been read.
-     * @return the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.
-     */
-    public int readBytesOrFewer(final byte[] buffer, final int offset, final int length) {
-        if (isWriting) {
-            throw new IllegalStateException("Calling read method on BinaryCodec open for write.");
-        }
-        try {
-            return inputStream.read(buffer, offset, length);
-        } catch (IOException e) {
-            throw new RuntimeIOException(constructErrorMessage("Read error"), e);
-        }
-    }
-
-    /**
-     * @return a single byte read from the input stream.
-     */
-    public byte readByte() {
-        if (isWriting) {
-            throw new IllegalStateException("Calling read method on BinaryCodec open for write.");
-        }
-        try {
-            final int ret = inputStream.read();
-            if (ret == -1) {
-                throw new RuntimeEOFException(constructErrorMessage("Premature EOF"));
-            }
-            return (byte)ret;
-        } catch (IOException e) {
-            throw new RuntimeIOException(constructErrorMessage("Read error"), e);
-        }
-    }
-
-    /**
-     * @return true if it is possible to know for sure if at EOF, and it is known for sure.
-     * If the input stream is a ByteArrayInputStream, this is faster than causing a RuntimeEOFException
-     * to be thrown.
-     */
-    public boolean knownAtEof() {
-        if (isWriting) {
-            throw new IllegalStateException("Calling knownAtEof method on BinaryCodec open for write.");
-        }
-        try {
-            return inputStream instanceof ByteArrayInputStream && inputStream.available() == 0;
-        } catch (IOException e) {
-            throw new RuntimeIOException(constructErrorMessage("available() error"), e);
-        }
-    }
-
-    /**
-     * Read a string off the input stream, as ASCII bytes
-     *
-     * @param length length of string to read
-     * @return String read from stream
-     */
-    public String readString(final int length) {
-        final byte[] buffer;
-        // Recycle single buffer if possible
-        if (length <= scratchBuffer.length) {
-            buffer = scratchBuffer;
-        } else {
-            buffer = new byte[length];
-
-        }
-        readBytes(buffer, 0, length);
-
-        return StringUtil.bytesToString(buffer, 0, length);
-    }
-
-    /**
-     * Read ASCII bytes from the input stream until a null byte is read
-     * @return String constructed from the ASCII bytes read
-     */
-    public String readNullTerminatedString() {
-        return StringUtil.readNullTerminatedString(this);
-    }
-
-    /**
-     * Read an int length, and then a String of that length
-     * @param devourNull if true, the length include a null terminator, which is read and discarded
-     */
-    public String readLengthAndString(final boolean devourNull) {
-        int length = readInt();
-        if (devourNull) {
-            --length;
-        }
-        final String ret = readString(length);
-        if (devourNull) {
-            readByte();
-        }
-        return ret;
-    }
-
-    private void readByteBuffer(final int numBytes) {
-        assert(numBytes <= byteBuffer.capacity());
-        readBytes(byteBuffer.array(), 0, numBytes);
-        byteBuffer.limit(byteBuffer.capacity());
-        byteBuffer.position(numBytes);
-    }
-
-    /**
-     * Read an int off the input stream
-     *
-     * @return int from input stream
-     */
-    public int readInt() {
-        readByteBuffer(4);
-        byteBuffer.flip();
-        return byteBuffer.getInt();
-    }
-
-    /**
-     * Reads a double off the input stream
-     *
-     * @return double
-     */
-    public double readDouble() {
-        readByteBuffer(8);
-        byteBuffer.flip();
-        return byteBuffer.getDouble();
-    }
-
-    /**
-     * Reads a long off the input stream
-     *
-     * @return long
-     */
-    public long readLong()  {
-        readByteBuffer(8);
-        byteBuffer.flip();
-        return byteBuffer.getLong();
-    }
-
-    public short readShort() {
-        readByteBuffer(2);
-        byteBuffer.flip();
-        return byteBuffer.getShort();
-    }
-
-    /**
-     * Reads a float off the input stream
-     *
-     * @return float
-     */
-    public float readFloat() {
-        readByteBuffer(4);
-        byteBuffer.flip();
-        return byteBuffer.getFloat();
-    }
-
-    /**
-     * Reads a boolean off the input stream, represented as a byte with value 1 or 0
-     *
-     * @return boolean
-     */
-    public boolean readBoolean() {
-        return (((int)readByte()) == 1);
-    }
-
-    /**
-     * Reads an 8-bit unsigned byte from the input stream.
-     * This method assumes little-endianness.
-     */
-    public short readUByte() {
-        readByteBuffer(1);
-        byteBuffer.put((byte)0);
-        byteBuffer.flip();
-        return byteBuffer.getShort();
-    }
-
-    /**
-     * Reads a 16-bit unsigned short from the input stream.
-     * This method assumes little-endianness.
-     */
-    public int readUShort() {
-        readByteBuffer(2);
-        byteBuffer.putShort((short)0);
-        byteBuffer.flip();
-        return byteBuffer.getInt();
-    }
-
-    /**
-     * Reads a 32-bit unsigned int from the input stream.
-     * This method assumes little-endianness.
-     */
-    public long readUInt() {
-        readByteBuffer(4);
-        byteBuffer.putInt(0);
-        byteBuffer.flip();
-        return byteBuffer.getLong();
-    }
-
-    /**
-     * Close the appropriate stream
-     */
-    public void close() {
-        try {
-            if (this.isWriting) {
-                // To the degree possible, make sure the bytes get forced to the file system,
-                // or else cause an exception to be thrown.
-                this.outputStream.flush();
-                if (this.outputStream instanceof FileOutputStream) {
-                    FileOutputStream fos = (FileOutputStream)this.outputStream;
-                    try {
-                        fos.getFD().sync();
-                    } catch (SyncFailedException e) {
-                        // Since the sync is belt-and-suspenders anyway, don't throw an exception if it fails,
-                        // because on some OSs it will fail for some types of output.  E.g. writing to /dev/null
-                        // on some Unixes.
-                    }
-                }
-                this.outputStream.close();
-            }
-            else this.inputStream.close();
-        } catch (IOException e) {
-            throw new RuntimeIOException(e.getMessage(), e);
-        }
-    }
-
-    private String constructErrorMessage(final String msg) {
-        final StringBuilder sb = new StringBuilder(msg);
-        sb.append("; BinaryCodec in ")
-                .append(isWriting? "write": "read").append("mode; ");
-        final String filename = isWriting? outputFileName: inputFileName;
-        if (filename != null) {
-            sb.append("file: ").append(filename);
-        } else  {
-            sb.append("streamed file (filename not available)");
-        }
-        return sb.toString();
-    }
-
-    //////////////////////////////////////////////////
-    // Some getters                                 //
-    //////////////////////////////////////////////////
-
-
-    public String getInputFileName() {
-        return inputFileName;
-    }
-
-    public String getOutputFileName() {
-        return outputFileName;
-    }
-
-    public void setOutputFileName(final String outputFileName) {
-        this.outputFileName = outputFileName;
-    }
-
-    public void setInputFileName(final String inputFileName) {
-        this.inputFileName = inputFileName;
-    }
-
-    public boolean isWriting() {
-        return isWriting;
-    }
-
-    public OutputStream getOutputStream() {
-        return outputStream;
-    }
-
-    public InputStream getInputStream() {
-        return inputStream;
-    }
-
-    public void setInputStream(final InputStream is) {
-        isWriting = false;
-        this.inputStream = is;
-    }
-
-    public void setOutputStream(final OutputStream os) {
-        isWriting = true;
-        this.outputStream = os;
-
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/BlockCompressedFilePointerUtil.java b/src/main/java/htsjdk/samtools/util/BlockCompressedFilePointerUtil.java
deleted file mode 100644
index 634534c..0000000
--- a/src/main/java/htsjdk/samtools/util/BlockCompressedFilePointerUtil.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Static for manipulating virtual file pointers in BGZF files.
- */
-public class BlockCompressedFilePointerUtil {
-    private static final int SHIFT_AMOUNT = 16;
-    private static final int OFFSET_MASK = 0xffff;
-    private static final long ADDRESS_MASK = 0xFFFFFFFFFFFFL;
-
-    public static final long MAX_BLOCK_ADDRESS = ADDRESS_MASK;
-    public static final int MAX_OFFSET = OFFSET_MASK;
-    
-    /**
-     * @param vfp1
-     * @param vfp2
-     * @return negative if vfp1 is earlier in file than vfp2, positive if it is later, 0 if equal.
-     */
-    public static int compare(final long vfp1, final long vfp2) {
-        if (vfp1 == vfp2) return 0;
-        // When treating as unsigned, negative number is > positive.
-        if (vfp1 < 0 && vfp2 >= 0) return 1;
-        if (vfp1 >= 0 && vfp2 < 0) return -1;
-        // Either both negative or both non-negative, so regular comparison works.
-        if (vfp1 < vfp2) return -1;
-        return 1; // vfp1 > vfp2
-    }
-
-    /**
-     * @return true if vfp2 points to somewhere in the same BGZF block, or the one immediately following vfp1's BGZF block.
-     */
-    public static boolean areInSameOrAdjacentBlocks(final long vfp1, final long vfp2) {
-        final long block1 = getBlockAddress(vfp1);
-        final long block2 = getBlockAddress(vfp2);
-        return (block1 == block2 || block1 + 1 == block2);        
-    }
-
-    /**
-     * @param blockAddress File offset of start of BGZF block.
-     * @param blockOffset Offset into uncompressed block.
-     * @return Virtual file pointer that embodies the input parameters.
-     */
-    static long makeFilePointer(final long blockAddress, final int blockOffset) {
-        if (blockOffset < 0) {
-            throw new IllegalArgumentException("Negative blockOffset " + blockOffset + " not allowed.");
-        }
-        if (blockAddress < 0) {
-            throw new IllegalArgumentException("Negative blockAddress " + blockAddress + " not allowed.");
-        }
-        if (blockOffset > MAX_OFFSET) {
-            throw new IllegalArgumentException("blockOffset " + blockOffset + " too large.");
-        }
-        if (blockAddress > MAX_BLOCK_ADDRESS) {
-            throw new IllegalArgumentException("blockAddress " + blockAddress + " too large.");
-        }
-        return blockAddress << SHIFT_AMOUNT | blockOffset;
-    }
-
-    /**
-     * @param virtualFilePointer
-     * @return File offset of start of BGZF block for this virtual file pointer.
-     */
-    public static long getBlockAddress(final long virtualFilePointer) {
-        return (virtualFilePointer >> SHIFT_AMOUNT) & ADDRESS_MASK;
-    }
-
-    /**
-     * @param virtualFilePointer
-     * @return Offset into uncompressed block for this virtual file pointer.
-     */
-    public static int getBlockOffset(final long virtualFilePointer) {
-        return (int) (virtualFilePointer & OFFSET_MASK);
-    }
-
-    public static String asString(final long vfp) {
-        return String.format("%d(0x%x): (block address: %d, offset: %d)", vfp, vfp, getBlockAddress(vfp), getBlockOffset(vfp));
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/BlockCompressedInputStream.java b/src/main/java/htsjdk/samtools/util/BlockCompressedInputStream.java
deleted file mode 100755
index b0ac001..0000000
--- a/src/main/java/htsjdk/samtools/util/BlockCompressedInputStream.java
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-
-import htsjdk.samtools.FileTruncatedException;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.seekablestream.SeekableBufferedStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableHTTPStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.RandomAccessFile;
-import java.net.URL;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-
-/*
- * Utility class for reading BGZF block compressed files.  The caller can treat this file like any other InputStream.
- * It probably is not necessary to wrap this stream in a buffering stream, because there is internal buffering.
- * The advantage of BGZF over conventional GZip format is that BGZF allows for seeking without having to read the
- * entire file up to the location being sought.  Note that seeking is only possible if the ctor(File) is used.
- *
- * c.f. http://samtools.sourceforge.net/SAM1.pdf for details of BGZF format
- */
-public class BlockCompressedInputStream extends InputStream implements LocationAware {
-
-    public final static String INCORRECT_HEADER_SIZE_MSG = "Incorrect header size for file: ";
-    public final static String UNEXPECTED_BLOCK_LENGTH_MSG = "Unexpected compressed block length: ";
-    public final static String PREMATURE_END_MSG = "Premature end of file: ";
-    public final static String CANNOT_SEEK_STREAM_MSG = "Cannot seek on stream based file ";
-    public final static String INVALID_FILE_PTR_MSG = "Invalid file pointer: ";
-
-    private InputStream mStream = null;
-    private SeekableStream mFile = null;
-    private byte[] mFileBuffer = null;
-    private byte[] mCurrentBlock = null;
-    private int mCurrentOffset = 0;
-    private long mBlockAddress = 0;
-    private int mLastBlockLength = 0;
-    private final BlockGunzipper blockGunzipper = new BlockGunzipper();
-
-
-    /**
-     * Note that seek() is not supported if this ctor is used.
-     */
-    public BlockCompressedInputStream(final InputStream stream) {
-        this(stream, true);
-    }
-
-    /**
-     * Note that seek() is not supported if this ctor is used.
-     */
-    public BlockCompressedInputStream(final InputStream stream, final boolean allowBuffering) {
-        if (allowBuffering) {
-            mStream = IOUtil.toBufferedStream(stream);
-        }
-        else {
-            mStream = stream;
-        }
-
-        mFile = null;
-    }
-
-    /**
-     * Use this ctor if you wish to call seek()
-     */
-    public BlockCompressedInputStream(final File file) throws IOException {
-        mFile = new SeekableFileStream(file);
-        mStream = null;
-
-    }
-
-    public BlockCompressedInputStream(final URL url) {
-        mFile = new SeekableBufferedStream(new SeekableHTTPStream(url));
-        mStream = null;
-    }
-
-    /**
-     * For providing some arbitrary data source.  No additional buffering is
-     * provided, so if the underlying source is not buffered, wrap it in a
-     * SeekableBufferedStream before passing to this ctor.
-     */
-    public BlockCompressedInputStream(final SeekableStream strm) {
-        mFile = strm;
-        mStream = null;
-    }
-
-    /**
-     * Determines whether or not the inflater will re-calculated the CRC on the decompressed data
-     * and check it against the value stored in the GZIP header.  CRC checking is an expensive
-     * operation and should be used accordingly.
-     */
-    public void setCheckCrcs(final boolean check) {
-        this.blockGunzipper.setCheckCrcs(check);
-    }
-
-    /**
-     * @return the number of bytes that can be read (or skipped over) from this input stream without blocking by the
-     * next caller of a method for this input stream. The next caller might be the same thread or another thread.
-     * Note that although the next caller can read this many bytes without blocking, the available() method call itself
-     * may block in order to fill an internal buffer if it has been exhausted.
-     */
-    public int available() throws IOException {
-        if (mCurrentBlock == null || mCurrentOffset == mCurrentBlock.length) {
-            readBlock();
-        }
-        if (mCurrentBlock == null) {
-            return 0;
-        }
-        return mCurrentBlock.length - mCurrentOffset;
-    }
-
-    /**
-     * @return <code>true</code> if the stream is at the end of a BGZF block,
-     * <code>false</code> otherwise.
-     */
-    public boolean endOfBlock() {
-        return (mCurrentBlock != null && mCurrentOffset == mCurrentBlock.length);
-    }
-
-    /**
-     * Closes the underlying InputStream or RandomAccessFile
-     */
-    public void close() throws IOException {
-        if (mFile != null) {
-            mFile.close();
-            mFile = null;
-        } else if (mStream != null) {
-            mStream.close();
-            mStream = null;
-        }
-        // Encourage garbage collection
-        mFileBuffer = null;
-        mCurrentBlock = null;
-    }
-
-    /**
-     * Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255.
-     * If no byte is available because the end of the stream has been reached, the value -1 is returned.
-     * This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.
-
-     * @return the next byte of data, or -1 if the end of the stream is reached.
-     */
-    public int read() throws IOException {
-        return (available() > 0) ? (mCurrentBlock[mCurrentOffset++] & 0xFF) : -1;
-    }
-
-    /**
-     * Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes
-     * actually read is returned as an integer. This method blocks until input data is available, end of file is detected,
-     * or an exception is thrown.
-     *
-     * read(buf) has the same effect as read(buf, 0, buf.length).
-     *
-     * @param buffer the buffer into which the data is read.
-     * @return the total number of bytes read into the buffer, or -1 is there is no more data because the end of
-     * the stream has been reached.
-     */
-    public int read(final byte[] buffer) throws IOException {
-        return read(buffer, 0, buffer.length);
-    }
-
-    private volatile ByteArrayOutputStream buf = null;
-    private static final byte eol = '\n';
-    private static final byte eolCr = '\r';
-    
-    /**
-     * Reads a whole line. A line is considered to be terminated by either a line feed ('\n'), 
-     * carriage return ('\r') or carriage return followed by a line feed ("\r\n").
-     *
-     * @return  A String containing the contents of the line, excluding the line terminating
-     *          character, or null if the end of the stream has been reached
-     *
-     * @exception  IOException  If an I/O error occurs
-     * @
-     */
-    public String readLine() throws IOException {
-    	int available = available();
-        if (available == 0) {
-            return null;
-        }
-        if(null == buf){ // lazy initialisation 
-        	buf = new ByteArrayOutputStream(8192);
-        }
-        buf.reset();
-    	boolean done = false;
-    	boolean foundCr = false; // \r found flag
-        while (!done) {
-        	int linetmpPos = mCurrentOffset;
-        	int bCnt = 0;
-        	while((available-- > 0)){
-        		final byte c = mCurrentBlock[linetmpPos++];
-        		if(c == eol){ // found \n
-        			done = true;
-        			break;
-        		} else if(foundCr){  // previous char was \r
-        			--linetmpPos; // current char is not \n so put it back
-        			done = true;
-        			break;
-        		} else if(c == eolCr){ // found \r
-					foundCr = true;
-        			continue; // no ++bCnt
-        		}
-				++bCnt;
-        	}
-        	if(mCurrentOffset < linetmpPos){
-				buf.write(mCurrentBlock, mCurrentOffset, bCnt);
-	        	mCurrentOffset = linetmpPos;
-        	}
-        	available = available();    
-        	if(available == 0){
-        		// EOF
-        		done = true;
-        	}
-        }
-    	return buf.toString();
-    }
-
-    /**
-     * Reads up to len bytes of data from the input stream into an array of bytes. An attempt is made to read
-     * as many as len bytes, but a smaller number may be read. The number of bytes actually read is returned as an integer.
-     *
-     * This method blocks until input data is available, end of file is detected, or an exception is thrown.
-     *
-     * @param buffer buffer into which data is read.
-     * @param offset the start offset in array b  at which the data is written.
-     * @param length the maximum number of bytes to read.
-     * @return the total number of bytes read into the buffer, or -1 if there is no more data because the end of
-     * the stream has been reached.
-     */
-    public int read(final byte[] buffer, int offset, int length) throws IOException {
-        final int originalLength = length;
-        while (length > 0) {
-            final int available = available();
-            if (available == 0) {
-                // Signal EOF to caller
-                if (originalLength == length) {
-                    return -1;
-                }
-                break;
-            }
-            final int copyLength = Math.min(length, available);
-            System.arraycopy(mCurrentBlock, mCurrentOffset, buffer, offset, copyLength);
-            mCurrentOffset += copyLength;
-            offset += copyLength;
-            length -= copyLength;
-        }
-        return originalLength - length;
-    }
-
-    /**
-     * Seek to the given position in the file.  Note that pos is a special virtual file pointer,
-     * not an actual byte offset.
-     *
-     * @param pos virtual file pointer
-     */
-    public void seek(final long pos) throws IOException {
-        if (mFile == null) {
-            throw new IOException(CANNOT_SEEK_STREAM_MSG);
-        }
-        // Decode virtual file pointer
-        // Upper 48 bits is the byte offset into the compressed stream of a block.
-        // Lower 16 bits is the byte offset into the uncompressed stream inside the block.
-        final long compressedOffset = BlockCompressedFilePointerUtil.getBlockAddress(pos);
-        final int uncompressedOffset = BlockCompressedFilePointerUtil.getBlockOffset(pos);
-        final int available;
-        if (mBlockAddress == compressedOffset && mCurrentBlock != null) {
-            available = mCurrentBlock.length;
-        } else {
-            mFile.seek(compressedOffset);
-            mBlockAddress = compressedOffset;
-            mLastBlockLength = 0;
-            readBlock();
-            available = available();
-        }
-        if (uncompressedOffset > available ||
-                (uncompressedOffset == available && !eof())) {
-            throw new IOException(INVALID_FILE_PTR_MSG + pos + " for " + mFile.getSource());
-        }
-        mCurrentOffset = uncompressedOffset;
-    }
-
-    private boolean eof() throws IOException {
-        if (mFile.eof()) {
-            return true;
-        }
-        // If the last remaining block is the size of the EMPTY_GZIP_BLOCK, this is the same as being at EOF.
-        return (mFile.length() - (mBlockAddress + mLastBlockLength) == BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length);
-    }
-
-    /**
-     * @return virtual file pointer that can be passed to seek() to return to the current position.  This is
-     * not an actual byte offset, so arithmetic on file pointers cannot be done to determine the distance between
-     * the two.
-     */
-    public long getFilePointer() {
-        if (mCurrentOffset == mCurrentBlock.length) {
-            // If current offset is at the end of the current block, file pointer should point
-            // to the beginning of the next block.
-            return BlockCompressedFilePointerUtil.makeFilePointer(mBlockAddress + mLastBlockLength, 0);
-        }
-        return BlockCompressedFilePointerUtil.makeFilePointer(mBlockAddress, mCurrentOffset);
-    }
-
-    @Override
-    public long getPosition() {
-        return getFilePointer();
-    }
-
-    public static long getFileBlock(final long bgzfOffset) {
-        return BlockCompressedFilePointerUtil.getBlockAddress(bgzfOffset);
-    }
-    
-    /**
-     * @param stream Must be at start of file.  Throws RuntimeException if !stream.markSupported().
-     * @return true if the given file looks like a valid BGZF file.
-     */
-    public static boolean isValidFile(final InputStream stream) throws IOException {
-        if (!stream.markSupported()) {
-            throw new RuntimeException("Cannot test non-buffered stream");
-        }
-        stream.mark(BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH);
-        final byte[] buffer = new byte[BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH];
-        final int count = readBytes(stream, buffer, 0, BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH);
-        stream.reset();
-        return count == BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH && isValidBlockHeader(buffer);
-    }
-
-    private static boolean isValidBlockHeader(final byte[] buffer) {
-        return (buffer[0] == BlockCompressedStreamConstants.GZIP_ID1 &&
-                (buffer[1] & 0xFF) == BlockCompressedStreamConstants.GZIP_ID2 &&
-                (buffer[3] & BlockCompressedStreamConstants.GZIP_FLG) != 0 &&
-                buffer[10] == BlockCompressedStreamConstants.GZIP_XLEN &&
-                buffer[12] == BlockCompressedStreamConstants.BGZF_ID1 &&
-                buffer[13] == BlockCompressedStreamConstants.BGZF_ID2);
-    }
-
-    private void readBlock() throws IOException {
-
-        if (mFileBuffer == null) {
-            mFileBuffer = new byte[BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE];
-        }
-        int count = readBytes(mFileBuffer, 0, BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH);
-        if (count == 0) {
-            // Handle case where there is no empty gzip block at end.
-            mCurrentOffset = 0;
-            mBlockAddress += mLastBlockLength;
-            mCurrentBlock = new byte[0];
-            return;
-        }
-        if (count != BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH) {
-            throw new IOException(INCORRECT_HEADER_SIZE_MSG + mFile.getSource());
-        }
-        final int blockLength = unpackInt16(mFileBuffer, BlockCompressedStreamConstants.BLOCK_LENGTH_OFFSET) + 1;
-        if (blockLength < BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH || blockLength > mFileBuffer.length) {
-            throw new IOException(UNEXPECTED_BLOCK_LENGTH_MSG + blockLength + " for " + mFile.getSource());
-        }
-        final int remaining = blockLength - BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH;
-        count = readBytes(mFileBuffer, BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH, remaining);
-        if (count != remaining) {
-            throw new FileTruncatedException(PREMATURE_END_MSG + mFile.getSource());
-        }
-        inflateBlock(mFileBuffer, blockLength);
-        mCurrentOffset = 0;
-        mBlockAddress += mLastBlockLength;
-        mLastBlockLength = blockLength;
-    }
-
-    private void inflateBlock(final byte[] compressedBlock, final int compressedLength) throws IOException {
-        final int uncompressedLength = unpackInt32(compressedBlock, compressedLength-4);
-        byte[] buffer = mCurrentBlock;
-        mCurrentBlock = null;
-        if (buffer == null || buffer.length != uncompressedLength) {
-            try {
-                buffer = new byte[uncompressedLength];
-            } catch (final NegativeArraySizeException e) {
-                throw new RuntimeIOException(mFile.getSource() + " has invalid uncompressedLength: " + uncompressedLength, e);
-            }
-        }
-        blockGunzipper.unzipBlock(buffer, compressedBlock, compressedLength);
-        mCurrentBlock = buffer;
-    }
-
-    private int readBytes(final byte[] buffer, final int offset, final int length) throws IOException {
-        if (mFile != null) {
-            return readBytes(mFile, buffer, offset, length);
-        } else if (mStream != null) {
-            return readBytes(mStream, buffer, offset, length);
-        } else {
-            return 0;
-        }
-    }
-
-    private static int readBytes(final SeekableStream file, final byte[] buffer, final int offset, final int length) throws IOException {
-        int bytesRead = 0;
-        while (bytesRead < length) {
-            final int count = file.read(buffer, offset + bytesRead, length - bytesRead);
-            if (count <= 0) {
-                break;
-            }
-            bytesRead += count;
-        }
-        return bytesRead;
-    }
-
-    private static int readBytes(final InputStream stream, final byte[] buffer, final int offset, final int length) throws IOException {
-        int bytesRead = 0;
-        while (bytesRead < length) {
-            final int count = stream.read(buffer, offset + bytesRead, length - bytesRead);
-            if (count <= 0) {
-                break;
-            }
-            bytesRead += count;
-        }
-        return bytesRead;
-    }
-
-    private int unpackInt16(final byte[] buffer, final int offset) {
-        return ((buffer[offset] & 0xFF) |
-                ((buffer[offset+1] & 0xFF) << 8));
-    }
-
-    private int unpackInt32(final byte[] buffer, final int offset) {
-        return ((buffer[offset] & 0xFF) |
-                ((buffer[offset+1] & 0xFF) << 8) |
-                ((buffer[offset+2] & 0xFF) << 16) |
-                ((buffer[offset+3] & 0xFF) << 24));
-    }
-
-    public enum FileTermination {HAS_TERMINATOR_BLOCK, HAS_HEALTHY_LAST_BLOCK, DEFECTIVE}
-
-    public static FileTermination checkTermination(final File file) throws IOException {
-        final long fileSize = file.length();
-        if (fileSize < BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length) {
-            return FileTermination.DEFECTIVE;
-        }
-        final RandomAccessFile raFile = new RandomAccessFile(file, "r");
-        try {
-            raFile.seek(fileSize - BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length);
-            byte[] buf = new byte[BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length];
-            raFile.readFully(buf);
-            if (Arrays.equals(buf, BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK)) {
-                return FileTermination.HAS_TERMINATOR_BLOCK;
-            }
-            final int bufsize = (int)Math.min(fileSize, BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE);
-            buf = new byte[bufsize];
-            raFile.seek(fileSize - bufsize);
-            raFile.read(buf);
-            for (int i = buf.length - BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length;
-                    i >= 0; --i) {
-                if (!preambleEqual(BlockCompressedStreamConstants.GZIP_BLOCK_PREAMBLE,
-                        buf, i, BlockCompressedStreamConstants.GZIP_BLOCK_PREAMBLE.length)) {
-                    continue;
-                }
-                final ByteBuffer byteBuffer = ByteBuffer.wrap(buf, i + BlockCompressedStreamConstants.GZIP_BLOCK_PREAMBLE.length, 4);
-                byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-                final int totalBlockSizeMinusOne =  byteBuffer.getShort() & 0xFFFF;
-                if (buf.length - i == totalBlockSizeMinusOne + 1) {
-                    return FileTermination.HAS_HEALTHY_LAST_BLOCK;
-                } else {
-                    return FileTermination.DEFECTIVE;
-                }
-            }
-            return FileTermination.DEFECTIVE;
-        } finally {
-            raFile.close();
-        }
-    }
-
-    public static void assertNonDefectiveFile(final File file) throws IOException {
-        if (checkTermination(file) == FileTermination.DEFECTIVE) {
-            throw new SAMException(file.getAbsolutePath() + " does not have a valid GZIP block at the end of the file.");
-        }
-    }
-
-    private static boolean preambleEqual(final byte[] preamble, final byte[] buf, final int startOffset, final int length) {
-        for (int i = 0; i < length; ++i) {
-            if (preamble[i] != buf[i + startOffset]) {
-                return false;
-            }
-        }
-        return true;
-    }
-}
-
-
diff --git a/src/main/java/htsjdk/samtools/util/BlockCompressedOutputStream.java b/src/main/java/htsjdk/samtools/util/BlockCompressedOutputStream.java
deleted file mode 100644
index 408282f..0000000
--- a/src/main/java/htsjdk/samtools/util/BlockCompressedOutputStream.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.util.zip.DeflaterFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.zip.CRC32;
-import java.util.zip.Deflater;
-
-/**
- * Writer for a file that is a series of gzip blocks (BGZF format).  The caller just treats it as an
- * OutputStream, and under the covers a gzip block is written when the amount of uncompressed as-yet-unwritten
- * bytes reaches a threshold.
- *
- * The advantage of BGZF over conventional gzip is that BGZF allows for seeking without having to scan through
- * the entire file up to the position being sought.
- *
- * Note that the flush() method should not be called by client
- * unless you know what you're doing, because it forces a gzip block to be written even if the
- * number of buffered bytes has not reached threshold.  close(), on the other hand, must be called
- * when done writing in order to force the last gzip block to be written.
- *
- * c.f. http://samtools.sourceforge.net/SAM1.pdf for details of BGZF file format.
- */
-public class BlockCompressedOutputStream
-        extends OutputStream
-        implements LocationAware
-{
-
-    private static final Log log = Log.getInstance(BlockCompressedOutputStream.class);
-
-    private static int defaultCompressionLevel = BlockCompressedStreamConstants.DEFAULT_COMPRESSION_LEVEL;
-    private static DeflaterFactory defaultDeflaterFactory = new DeflaterFactory();
-
-    /**
-     * Sets the GZip compression level for subsequent BlockCompressedOutputStream object creation
-     * that do not specify the compression level.
-     * @param compressionLevel 1 <= compressionLevel <= 9
-     */
-    public static void setDefaultCompressionLevel(final int compressionLevel) {
-        if (compressionLevel < Deflater.NO_COMPRESSION || compressionLevel > Deflater.BEST_COMPRESSION) {
-            throw new IllegalArgumentException("Invalid compression level: " + compressionLevel);
-        }
-        defaultCompressionLevel = compressionLevel;
-    }
-
-    public static int getDefaultCompressionLevel() {
-        return defaultCompressionLevel;
-    }
-
-    /**
-     * Sets the default {@link DeflaterFactory} that will be used for all instances unless specified otherwise in the constructor.
-     * If this method is not called the default is a factory that will create the JDK {@link Deflater}.
-     * @param deflaterFactory non-null default factory.
-     */
-    public static void setDefaultDeflaterFactory(final DeflaterFactory deflaterFactory) {
-        if (deflaterFactory == null) {
-            throw new IllegalArgumentException("null deflaterFactory");
-        }
-        defaultDeflaterFactory = deflaterFactory;
-    }
-
-    public static DeflaterFactory getDefaultDeflaterFactory() {
-        return defaultDeflaterFactory;
-    }
-
-    private final BinaryCodec codec;
-    private final byte[] uncompressedBuffer = new byte[BlockCompressedStreamConstants.DEFAULT_UNCOMPRESSED_BLOCK_SIZE];
-    private int numUncompressedBytes = 0;
-    private final byte[] compressedBuffer =
-            new byte[BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE -
-                    BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH];
-    private final Deflater deflater;
-
-    // A second deflater is created for the very unlikely case where the regular deflation actually makes
-    // things bigger, and the compressed block is too big.  It should be possible to downshift the
-    // primary deflater to NO_COMPRESSION level, recompress, and then restore it to its original setting,
-    // but in practice that doesn't work.
-    // The motivation for deflating at NO_COMPRESSION level is that it will predictably produce compressed
-    // output that is 10 bytes larger than the input, and the threshold at which a block is generated is such that
-    // the size of tbe final gzip block will always be <= 64K.  This is preferred over the previous method,
-    // which would attempt to compress up to 64K bytes, and if the resulting compressed block was too large,
-    // try compressing fewer input bytes (aka "downshifting').  The problem with downshifting is that
-    // getFilePointer might return an inaccurate value.
-    // I assume (AW 29-Oct-2013) that there is no value in using hardware-assisted deflater for no-compression mode,
-    // so just use JDK standard.
-    private final Deflater noCompressionDeflater = new Deflater(Deflater.NO_COMPRESSION, true);
-    private final CRC32 crc32 = new CRC32();
-    private File file = null;
-    private long mBlockAddress = 0;
-
-
-    // Really a local variable, but allocate once to reduce GC burden.
-    private final byte[] singleByteArray = new byte[1];
-
-    /**
-     * Uses default compression level, which is 5 unless changed by setCompressionLevel
-     * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
-     * Use {@link #BlockCompressedOutputStream(File, int, DeflaterFactory)} to specify a custom factory.
-     */
-    public BlockCompressedOutputStream(final String filename) {
-        this(filename, defaultCompressionLevel);
-    }
-
-    /**
-     * Uses default compression level, which is 5 unless changed by setCompressionLevel
-     * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
-     * Use {@link #BlockCompressedOutputStream(File, int, DeflaterFactory)} to specify a custom factory.
-     */
-    public BlockCompressedOutputStream(final File file) {
-        this(file, defaultCompressionLevel);
-    }
-
-    /**
-     * Prepare to compress at the given compression level
-     * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
-     * @param compressionLevel 1 <= compressionLevel <= 9
-     */
-    public BlockCompressedOutputStream(final String filename, final int compressionLevel) {
-        this(new File(filename), compressionLevel);
-    }
-
-    /**
-     * Prepare to compress at the given compression level
-     * @param compressionLevel 1 <= compressionLevel <= 9
-     * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
-     * Use {@link #BlockCompressedOutputStream(File, int, DeflaterFactory)} to specify a custom factory.
-     */
-    public BlockCompressedOutputStream(final File file, final int compressionLevel) {
-        this(file, compressionLevel, defaultDeflaterFactory);
-    }
-
-    /**
-     * Prepare to compress at the given compression level
-     * @param compressionLevel 1 <= compressionLevel <= 9
-     * @param deflaterFactory custom factory to create deflaters (overrides the default)
-     */
-    public BlockCompressedOutputStream(final File file, final int compressionLevel, final DeflaterFactory deflaterFactory) {
-        this.file = file;
-        codec = new BinaryCodec(file, true);
-        deflater = deflaterFactory.makeDeflater(compressionLevel, true);
-        log.debug("Using deflater: " + deflater.getClass().getSimpleName());
-    }
-
-    /**
-     * Uses default compression level, which is 5 unless changed by setCompressionLevel
-     * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
-     * Use {@link #BlockCompressedOutputStream(OutputStream, File, int, DeflaterFactory)} to specify a custom factory.
-     *
-     * @param file may be null
-     */
-    public BlockCompressedOutputStream(final OutputStream os, final File file) {
-        this(os, file, defaultCompressionLevel);
-    }
-
-    /**
-     * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
-     * Use {@link #BlockCompressedOutputStream(OutputStream, File, int, DeflaterFactory)} to specify a custom factory.
-     */
-    public BlockCompressedOutputStream(final OutputStream os, final File file, final int compressionLevel) {
-        this(os, file, compressionLevel, defaultDeflaterFactory);
-    }
-
-    /**
-     * Creates the output stream.
-     * @param os output stream to create a BlockCompressedOutputStream from
-     * @param file file to which to write the output or null if not available
-     * @param compressionLevel the compression level (0-9)
-     * @param deflaterFactory custom factory to create deflaters (overrides the default)
-     */
-    public BlockCompressedOutputStream(final OutputStream os, final File file, final int compressionLevel, final DeflaterFactory deflaterFactory) {
-        this.file = file;
-        codec = new BinaryCodec(os);
-        if (file != null) {
-            codec.setOutputFileName(file.getAbsolutePath());
-        }
-        deflater = deflaterFactory.makeDeflater(compressionLevel, true);
-        log.debug("Using deflater: " + deflater.getClass().getSimpleName());
-    }
-
-    /**
-     *
-     * @param location May be null.  Used for error messages, and for checking file termination.
-     * @param output May or not already be a BlockCompressedOutputStream.
-     * @return A BlockCompressedOutputStream, either by wrapping the given OutputStream, or by casting if it already
-     *         is a BCOS.
-     */
-    public static BlockCompressedOutputStream maybeBgzfWrapOutputStream(final File location, OutputStream output) {
-        if (!(output instanceof BlockCompressedOutputStream)) {
-           return new BlockCompressedOutputStream(output, location);
-        } else {
-           return (BlockCompressedOutputStream)output;
-        }
-    }
-
-    /**
-     * Writes b.length bytes from the specified byte array to this output stream. The general contract for write(b)
-     * is that it should have exactly the same effect as the call write(b, 0, b.length).
-     * @param bytes the data
-     */
-    @Override
-    public void write(final byte[] bytes) throws IOException {
-        write(bytes, 0, bytes.length);
-    }
-
-    /**
-     * Writes len bytes from the specified byte array starting at offset off to this output stream. The general
-     * contract for write(b, off, len) is that some of the bytes in the array b are written to the output stream in order;
-     * element b[off] is the first byte written and b[off+len-1] is the last byte written by this operation.
-     *
-     * @param bytes the data
-     * @param startIndex the start offset in the data
-     * @param numBytes the number of bytes to write
-     */
-    @Override
-    public void write(final byte[] bytes, int startIndex, int numBytes) throws IOException {
-        assert(numUncompressedBytes < uncompressedBuffer.length);
-        while (numBytes > 0) {
-            final int bytesToWrite = Math.min(uncompressedBuffer.length - numUncompressedBytes, numBytes);
-            System.arraycopy(bytes, startIndex, uncompressedBuffer, numUncompressedBytes, bytesToWrite);
-            numUncompressedBytes += bytesToWrite;
-            startIndex += bytesToWrite;
-            numBytes -= bytesToWrite;
-            assert(numBytes >= 0);
-            if (numUncompressedBytes == uncompressedBuffer.length) {
-                deflateBlock();
-            }
-        }
-    }
-
-    /**
-     * WARNING: flush() affects the output format, because it causes the current contents of uncompressedBuffer
-     * to be compressed and written, even if it isn't full.  Unless you know what you're doing, don't call flush().
-     * Instead, call close(), which will flush any unwritten data before closing the underlying stream.
-     *
-     */
-    @Override
-    public void flush() throws IOException {
-        while (numUncompressedBytes > 0) {
-            deflateBlock();
-        }
-        codec.getOutputStream().flush();
-    }
-
-    /**
-     * close() must be called in order to flush any remaining buffered bytes.  An unclosed file will likely be
-     * defective.
-     *
-     */
-    @Override
-    public void close() throws IOException {
-        flush();
-        // For debugging...
-        // if (numberOfThrottleBacks > 0) {
-        //     System.err.println("In BlockCompressedOutputStream, had to throttle back " + numberOfThrottleBacks +
-        //                        " times for file " + codec.getOutputFileName());
-        // }
-        codec.writeBytes(BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK);
-        codec.close();
-        // Can't re-open something that is not a regular file, e.g. a named pipe or an output stream
-        if (this.file == null || !this.file.isFile()) return;
-        if (BlockCompressedInputStream.checkTermination(this.file) !=
-                BlockCompressedInputStream.FileTermination.HAS_TERMINATOR_BLOCK) {
-            throw new IOException("Terminator block not found after closing BGZF file " + this.file);
-        }
-    }
-
-    /**
-     * Writes the specified byte to this output stream. The general contract for write is that one byte is written
-     * to the output stream. The byte to be written is the eight low-order bits of the argument b.
-     * The 24 high-order bits of b are ignored.
-     * @param bite
-     * @throws IOException
-     */
-    public void write(final int bite) throws IOException {
-        singleByteArray[0] = (byte)bite;
-        write(singleByteArray);
-    }
-
-    /** Encode virtual file pointer
-     * Upper 48 bits is the byte offset into the compressed stream of a block.
-     * Lower 16 bits is the byte offset into the uncompressed stream inside the block.
-     */
-    public long getFilePointer(){
-        return BlockCompressedFilePointerUtil.makeFilePointer(mBlockAddress, numUncompressedBytes);
-    }
-
-    @Override
-    public long getPosition() {
-        return getFilePointer();
-    }
-
-    /**
-     * Attempt to write the data in uncompressedBuffer to the underlying file in a gzip block.
-     * If the entire uncompressedBuffer does not fit in the maximum allowed size, reduce the amount
-     * of data to be compressed, and slide the excess down in uncompressedBuffer so it can be picked
-     * up in the next deflate event.
-     * @return size of gzip block that was written.
-     */
-    private int deflateBlock() {
-        if (numUncompressedBytes == 0) {
-            return 0;
-        }
-        final int bytesToCompress = numUncompressedBytes;
-        // Compress the input
-        deflater.reset();
-        deflater.setInput(uncompressedBuffer, 0, bytesToCompress);
-        deflater.finish();
-        int compressedSize = deflater.deflate(compressedBuffer, 0, compressedBuffer.length);
-
-        // If it didn't all fit in compressedBuffer.length, set compression level to NO_COMPRESSION
-        // and try again.  This should always fit.
-        if (!deflater.finished()) {
-            noCompressionDeflater.reset();
-            noCompressionDeflater.setInput(uncompressedBuffer, 0, bytesToCompress);
-            noCompressionDeflater.finish();
-            compressedSize = noCompressionDeflater.deflate(compressedBuffer, 0, compressedBuffer.length);
-            if (!noCompressionDeflater.finished()) {
-                throw new IllegalStateException("unpossible");
-            }
-        }
-        // Data compressed small enough, so write it out.
-        crc32.reset();
-        crc32.update(uncompressedBuffer, 0, bytesToCompress);
-
-        final int totalBlockSize = writeGzipBlock(compressedSize, bytesToCompress, crc32.getValue());
-        assert(bytesToCompress <= numUncompressedBytes);
-
-        // Clear out from uncompressedBuffer the data that was written
-        if (bytesToCompress == numUncompressedBytes) {
-            numUncompressedBytes = 0;
-        } else {
-            System.arraycopy(uncompressedBuffer, bytesToCompress, uncompressedBuffer, 0,
-                    numUncompressedBytes - bytesToCompress);
-            numUncompressedBytes -= bytesToCompress;
-        }
-        mBlockAddress += totalBlockSize;
-        return totalBlockSize;
-    }
-
-    /**
-     * Writes the entire gzip block, assuming the compressed data is stored in compressedBuffer
-     * @return  size of gzip block that was written.
-     */
-    private int writeGzipBlock(final int compressedSize, final int uncompressedSize, final long crc) {
-        // Init gzip header
-        codec.writeByte(BlockCompressedStreamConstants.GZIP_ID1);
-        codec.writeByte(BlockCompressedStreamConstants.GZIP_ID2);
-        codec.writeByte(BlockCompressedStreamConstants.GZIP_CM_DEFLATE);
-        codec.writeByte(BlockCompressedStreamConstants.GZIP_FLG);
-        codec.writeInt(0); // Modification time
-        codec.writeByte(BlockCompressedStreamConstants.GZIP_XFL);
-        codec.writeByte(BlockCompressedStreamConstants.GZIP_OS_UNKNOWN);
-        codec.writeShort(BlockCompressedStreamConstants.GZIP_XLEN);
-        codec.writeByte(BlockCompressedStreamConstants.BGZF_ID1);
-        codec.writeByte(BlockCompressedStreamConstants.BGZF_ID2);
-        codec.writeShort(BlockCompressedStreamConstants.BGZF_LEN);
-        final int totalBlockSize = compressedSize + BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH +
-                BlockCompressedStreamConstants.BLOCK_FOOTER_LENGTH;
-
-        // I don't know why we store block size - 1, but that is what the spec says
-        codec.writeShort((short)(totalBlockSize - 1));
-        codec.writeBytes(compressedBuffer, 0, compressedSize);
-        codec.writeInt((int)crc);
-        codec.writeInt(uncompressedSize);
-        return totalBlockSize;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/BlockCompressedStreamConstants.java b/src/main/java/htsjdk/samtools/util/BlockCompressedStreamConstants.java
deleted file mode 100644
index 4f45057..0000000
--- a/src/main/java/htsjdk/samtools/util/BlockCompressedStreamConstants.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Defaults;
-
-/**
- * Constants shared by BlockCompressed{Input,Output}Stream classes
- */
-public class BlockCompressedStreamConstants {
-    // Number of bytes in the gzip block before the deflated data.
-    // This is not the standard header size, because we include one optional subfield,
-    // but it is the standard for us.
-    public static final int BLOCK_HEADER_LENGTH = 18;
-
-    // Location in the gzip block of the total block size (actually total block size - 1)
-    public static final int BLOCK_LENGTH_OFFSET = 16;
-
-    // Number of bytes that follow the deflated data
-    public static final int BLOCK_FOOTER_LENGTH = 8;
-
-    // We require that a compressed block (including header and footer, be <= this)
-    public static final int MAX_COMPRESSED_BLOCK_SIZE = 64 * 1024;
-
-    // Gzip overhead is the header, the footer, and the block size (encoded as a short).
-    public static final int GZIP_OVERHEAD = BLOCK_HEADER_LENGTH + BLOCK_FOOTER_LENGTH + 2;
-
-    // If Deflater has compression level == NO_COMPRESSION, 10 bytes of overhead (determined experimentally).
-    public static final int NO_COMPRESSION_OVERHEAD = 10;
-
-    // Push out a gzip block when this many uncompressed bytes have been accumulated.
-    // This size is selected so that if data is not compressible,  if Deflater is given
-    // compression level == NO_COMPRESSION, compressed size is guaranteed to be <= MAX_COMPRESSED_BLOCK_SIZE.
-    public static final int DEFAULT_UNCOMPRESSED_BLOCK_SIZE = 64 * 1024 - (GZIP_OVERHEAD + NO_COMPRESSION_OVERHEAD);
-
-    // Magic numbers
-    public static final byte GZIP_ID1 = 31;
-    public static final int GZIP_ID2 = 139;
-
-    // FEXTRA flag means there are optional fields
-    public static final int GZIP_FLG = 4;
-
-    // extra flags
-    public static final int GZIP_XFL = 0;
-
-    // length of extra subfield
-    public static final short GZIP_XLEN = 6;
-
-    // The deflate compression, which is customarily used by gzip
-    public static final byte GZIP_CM_DEFLATE = 8;
-
-    public static final int DEFAULT_COMPRESSION_LEVEL = Defaults.COMPRESSION_LEVEL;
-
-    // We don't care about OS because we're not doing line terminator translation
-    public static final int GZIP_OS_UNKNOWN = 255;
-
-    // The subfield ID
-    public static final byte BGZF_ID1 = 66;
-    public static final byte BGZF_ID2 = 67;
-
-    // subfield length in bytes
-    public static final byte BGZF_LEN = 2;
-
-    public static final byte[] EMPTY_GZIP_BLOCK = {
-            BlockCompressedStreamConstants.GZIP_ID1,
-            (byte)BlockCompressedStreamConstants.GZIP_ID2,
-            BlockCompressedStreamConstants.GZIP_CM_DEFLATE,
-            BlockCompressedStreamConstants.GZIP_FLG,
-            0, 0, 0, 0, // Modification time
-            BlockCompressedStreamConstants.GZIP_XFL,
-            (byte)BlockCompressedStreamConstants.GZIP_OS_UNKNOWN,
-            BlockCompressedStreamConstants.GZIP_XLEN, 0, // Little-endian short
-            BlockCompressedStreamConstants.BGZF_ID1,
-            BlockCompressedStreamConstants.BGZF_ID2,
-            BlockCompressedStreamConstants.BGZF_LEN, 0, // Little-endian short
-            // Total block size - 1
-            BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH +
-                    BlockCompressedStreamConstants.BLOCK_FOOTER_LENGTH - 1 + 2, 0, // Little-endian short
-            // Dummy payload?
-            3, 0,
-            0, 0, 0, 0, // crc
-            0, 0, 0, 0, // uncompressedSize
-    };
-    public static final byte[] GZIP_BLOCK_PREAMBLE = {
-            BlockCompressedStreamConstants.GZIP_ID1,
-            (byte)BlockCompressedStreamConstants.GZIP_ID2,
-            BlockCompressedStreamConstants.GZIP_CM_DEFLATE,
-            BlockCompressedStreamConstants.GZIP_FLG,
-            0, 0, 0, 0, // Modification time
-            BlockCompressedStreamConstants.GZIP_XFL,
-            (byte)BlockCompressedStreamConstants.GZIP_OS_UNKNOWN,
-            BlockCompressedStreamConstants.GZIP_XLEN, 0, // Little-endian short
-            BlockCompressedStreamConstants.BGZF_ID1,
-            BlockCompressedStreamConstants.BGZF_ID2,
-            BlockCompressedStreamConstants.BGZF_LEN, 0, // Little-endian short
-    };
-}
diff --git a/src/main/java/htsjdk/samtools/util/BlockGunzipper.java b/src/main/java/htsjdk/samtools/util/BlockGunzipper.java
deleted file mode 100644
index 18e9285..0000000
--- a/src/main/java/htsjdk/samtools/util/BlockGunzipper.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFormatException;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.zip.CRC32;
-import java.util.zip.DataFormatException;
-import java.util.zip.Inflater;
-
-/**
- * Alternative to GZIPInputStream, for decompressing GZIP blocks that are already loaded into a byte[].
- * The main advantage is that this object can be used over and over again to decompress many blocks,
- * whereas a new GZIPInputStream and ByteArrayInputStream would otherwise need to be created for each
- * block to be decompressed.
- *
- * This code requires that the GZIP header conform to the GZIP blocks written to BAM files, with
- * a specific subfield and no other optional stuff.
- *
- * @author alecw at broadinstitute.org
- */
-public class BlockGunzipper {
-    private final Inflater inflater = new Inflater(true); // GZIP mode
-    private final CRC32 crc32 = new CRC32();
-    private boolean checkCrcs = false;
-
-    /** Allows the caller to decide whether or not to check CRCs on when uncompressing blocks. */
-    public void setCheckCrcs(final boolean check) {
-        this.checkCrcs = check;
-    }
-
-    /**
-     * Decompress GZIP-compressed data
-     * @param uncompressedBlock must be big enough to hold decompressed output.
-     * @param compressedBlock compressed data starting at offset 0
-     * @param compressedLength size of compressed data, possibly less than the size of the buffer.
-     * @return the uncompressed data size.
-     */
-    public int unzipBlock(byte[] uncompressedBlock, byte[] compressedBlock, int compressedLength) {
-        return unzipBlock(uncompressedBlock, 0, compressedBlock, 0, compressedLength);
-    }
-
-    /**
-     * Decompress GZIP-compressed data
-     * @param uncompressedBlock must be big enough to hold decompressed output.
-     * @param uncompressedBlockOffset the offset into uncompressedBlock.
-     * @param compressedBlock compressed data starting at offset 0.
-     * @param compressedBlock  the offset into the compressed data.
-     * @param compressedLength size of compressed data, possibly less than the size of the buffer.
-     * @return the uncompressed data size.
-     */
-    public int unzipBlock(byte[] uncompressedBlock, int uncompressedBlockOffset,
-                           byte[] compressedBlock, int compressedBlockOffset, int compressedLength) {
-        int uncompressedSize;
-        try {
-            ByteBuffer byteBuffer = ByteBuffer.wrap(compressedBlock, compressedBlockOffset, compressedLength);
-            byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-
-            // Validate GZIP header
-            if (byteBuffer.get() != BlockCompressedStreamConstants.GZIP_ID1 ||
-                    byteBuffer.get() != (byte)BlockCompressedStreamConstants.GZIP_ID2 ||
-                    byteBuffer.get() != BlockCompressedStreamConstants.GZIP_CM_DEFLATE ||
-                    byteBuffer.get() != BlockCompressedStreamConstants.GZIP_FLG
-                    ) {
-                throw new SAMFormatException("Invalid GZIP header");
-            }
-            // Skip MTIME, XFL, OS fields
-            byteBuffer.position(byteBuffer.position() + 6);
-            if (byteBuffer.getShort() != BlockCompressedStreamConstants.GZIP_XLEN) {
-                throw new SAMFormatException("Invalid GZIP header");
-            }
-            // Skip blocksize subfield intro
-            byteBuffer.position(byteBuffer.position() + 4);
-            // Read ushort
-            final int totalBlockSize = (byteBuffer.getShort() & 0xffff) + 1;
-            if (totalBlockSize != compressedLength) {
-                throw new SAMFormatException("GZIP blocksize disagreement");
-            }
-
-            // Read expected size and CRD from end of GZIP block
-            final int deflatedSize = compressedLength - BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH - BlockCompressedStreamConstants.BLOCK_FOOTER_LENGTH;
-            byteBuffer.position(byteBuffer.position() + deflatedSize);
-            int expectedCrc = byteBuffer.getInt();
-            uncompressedSize = byteBuffer.getInt();
-            inflater.reset();
-
-            // Decompress
-            inflater.setInput(compressedBlock, compressedBlockOffset + BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH, deflatedSize);
-            final int inflatedBytes = inflater.inflate(uncompressedBlock, uncompressedBlockOffset, uncompressedSize);
-            if (inflatedBytes != uncompressedSize) {
-                throw new SAMFormatException("Did not inflate expected amount");
-            }
-
-            // Validate CRC if so desired
-            if (this.checkCrcs) {
-                crc32.reset();
-                crc32.update(uncompressedBlock, uncompressedBlockOffset, uncompressedSize);
-                final long crc = crc32.getValue();
-                if ((int)crc != expectedCrc) {
-                    throw new SAMFormatException("CRC mismatch");
-                }
-            }
-        } catch (DataFormatException e)
-        {
-            throw new RuntimeIOException(e);
-        }
-        return uncompressedSize;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/BufferedLineReader.java b/src/main/java/htsjdk/samtools/util/BufferedLineReader.java
deleted file mode 100644
index de1115d..0000000
--- a/src/main/java/htsjdk/samtools/util/BufferedLineReader.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Defaults;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.nio.charset.Charset;
-
-/**
- * Implementation of LineReader that is a thin wrapper around BufferedReader.  On Linux, this is faster
- * than AsciiLineReaderImpl.  If you use AsciiLineReader rather than this class, it will detect the OS
- * and delegate to the preferred implementation.
- *
- * TODO: Replace this with {@link java.io.LineNumberReader}?
- * 
- * @author alecw at broadinstitute.org
- */
-public class BufferedLineReader implements LineReader {
-
-    private final BufferedReader reader;
-    private int lineNumber = 0;
-    private String peekedLine;
-
-    public BufferedLineReader(final InputStream is) {
-        this(is, Defaults.NON_ZERO_BUFFER_SIZE);
-    }
-
-    public BufferedLineReader(final InputStream is, final int bufferSize) {
-        reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")), bufferSize);
-    }
-
-    /**
-     * Read a line and remove the line terminator
-     *
-     * @return the line read, or null if EOF has been reached.
-     */
-    public String readLine() {
-        ++lineNumber;
-        try {
-            final String ret;
-            if (peekedLine != null) {
-                ret = peekedLine;
-                peekedLine = null;
-            } else {
-            ret = reader.readLine();
-            }
-            return ret;
-        } catch (IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    /**
-     * @return 1-based number of line most recently read
-     */
-    public int getLineNumber() {
-        return lineNumber;
-    }
-
-    /**
-     * Non-destructive one-character look-ahead.
-     *
-     * @return If not eof, the next character that would be read.  If eof, -1.
-     */
-    public int peek() {
-        if (peekedLine == null) {
-            try {
-                peekedLine = reader.readLine();
-            } catch (IOException e) {
-                throw new RuntimeIOException(e);
-            }
-        }
-        if (peekedLine == null) {
-            return -1;
-        }
-        if (peekedLine.isEmpty()) {
-            return '\n';
-        }
-        return peekedLine.charAt(0);
-    }
-
-    public void close() {
-        peekedLine = null;
-        try {
-            reader.close();
-        } catch (IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CigarUtil.java b/src/main/java/htsjdk/samtools/util/CigarUtil.java
deleted file mode 100644
index e6c14ab..0000000
--- a/src/main/java/htsjdk/samtools/util/CigarUtil.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMValidationError;
-import htsjdk.samtools.TextCigarCodec;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class CigarUtil {
-        private static final Log log = Log.getInstance(CigarUtil.class);
-
-    /** adjust the cigar based on adapter clipping.
-     * TODO: If there is hard clipping at the end of the input CIGAR, it is lost.  It should not be. 
-     * *
-     * @param clipFrom       1-based position where the clipping starts
-     * @param oldCigar       The existing unclipped cigar
-     * @return               New adjusted list of cigar elements
-     */
-    // package visible so can be unit-tested
-    public static List<CigarElement> softClipEndOfRead(final int clipFrom, final List<CigarElement> oldCigar) {
-        final int clippedBases = (int)CoordMath.getLength(clipFrom, Cigar.getReadLength(oldCigar));
-        List<CigarElement> newCigar = new LinkedList<CigarElement>();
-        int pos = 1;
-
-        for (CigarElement c : oldCigar) {
-            // Distinguish two cases:
-            //	c occurs before the clipped region
-            //	c is adjacent to or straddles the boundary between clipped and unclipped region.
-            //  c never occurs after the clipped region; clipped region is always at the end
-
-            final CigarOperator op = c.getOperator();
-            final int length = op.consumesReadBases()? c.getLength() : 0;
-            final int endPos = pos + length - 1;  // same as pos on next iteration
-
-            if (endPos < (clipFrom - 1)) {
-                // handle elements before clip position (just copy them)
-                newCigar.add(c);
-
-            } else if (endPos >= (clipFrom - 1)) {
-                // handle adjacent or straddling element
-                elementStraddlesClippedRead(newCigar, c,
-                        (clipFrom -1) - (pos -1) , clippedBases);
-                break;
-            }
-
-            pos = endPos + 1;      // update pos for next iteration
-        } // end loop over cigar elements
-        return newCigar;
-    }
-
-    // a cigar element occurs in the middle of an adapter clipping
-    static private void elementStraddlesClippedRead(List<CigarElement> newCigar, CigarElement c,
-                                                    int relativeClippedPosition,
-                                                    int clippedBases){
-        final CigarOperator op = c.getOperator();
-        int clipAmount = clippedBases;
-        if (op.consumesReadBases()){
-            if (op.consumesReferenceBases() & relativeClippedPosition > 0){
-               newCigar.add(new CigarElement(relativeClippedPosition, op));
-            }
-            if (!op.consumesReferenceBases()){
-                clipAmount = clippedBases + relativeClippedPosition;
-            }
-        } else if (relativeClippedPosition != 0){
-                throw new SAMException("Unexpected non-0 relativeClippedPosition " + relativeClippedPosition);
-        }
-        newCigar.add(new CigarElement(clipAmount, CigarOperator.S));  // S is always last element
-    }
-
-    /**
-     * Adds a soft-clip, based on <code>clipFrom</code>, to the SAM record's existing cigar
-     * and, for negative strands, also adjusts the SAM record's start position.
-     * Soft clips the end of the read as the read came off the sequencer.
-     */
-    public static void softClip3PrimeEndOfRead(SAMRecord rec, final int clipFrom) {
-
-        final Cigar cigar = rec.getCigar();
-        // we don't worry about SEED_REGION_LENGTH in clipFrom
-        final boolean negativeStrand = rec.getReadNegativeStrandFlag();
-        List<CigarElement> oldCigar = cigar.getCigarElements();
-
-        if (!isValidCigar(rec, cigar, true)){
-            return; // log message already issued
-        }
-        if (negativeStrand){
-            // Can't just use Collections.reverse() here because oldCigar is unmodifiable
-            oldCigar = new ArrayList<CigarElement>(oldCigar);
-            Collections.reverse(oldCigar);
-        }
-        List<CigarElement> newCigarElems = CigarUtil.softClipEndOfRead(clipFrom, oldCigar);
-
-        if (negativeStrand) {
-            Collections.reverse(newCigarElems);
-        }
-
-        final Cigar newCigar = new Cigar(newCigarElems);
-        if (negativeStrand){
-            int oldLength = cigar.getReferenceLength();
-            int newLength = newCigar.getReferenceLength();
-            int sizeChange = oldLength - newLength;
-            if (sizeChange > 0){
-                rec.setAlignmentStart(rec.getAlignmentStart() + sizeChange);
-            } else if (sizeChange < 0){
-                throw new SAMException("The clipped length " + newLength +
-                        " is longer than the old unclipped length " + oldLength);
-            }
-        }
-        rec.setCigar(newCigar);
-
-        // Check that the end result is not a read without any aligned bases
-        boolean hasMappedBases = false;
-        for (final CigarElement elem : newCigar.getCigarElements()) {
-            final CigarOperator op = elem.getOperator();
-            if (op.consumesReferenceBases() && op.consumesReadBases()) {
-                hasMappedBases = true;
-                break;
-            }
-        }
-
-        if (!hasMappedBases) {
-            rec.setReadUnmappedFlag(true);
-            rec.setCigarString(SAMRecord.NO_ALIGNMENT_CIGAR);
-            rec.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-            rec.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
-            rec.setMappingQuality(SAMRecord.NO_MAPPING_QUALITY);
-            rec.setInferredInsertSize(0);
-        }
-        else if (!isValidCigar(rec, newCigar, false)){
-            // log message already issued
-            throw new IllegalStateException("Invalid new Cigar: " + newCigar  + " (" + oldCigar + ") for " +
-                    rec.getReadName());
-        }
-
-    }
-
-    private static boolean isValidCigar(SAMRecord rec, Cigar cigar, boolean isOldCigar) {
-        if (cigar == null || cigar.getCigarElements() == null || cigar.getCigarElements().isEmpty()) {
-            if (isOldCigar) {
-                if (rec.getReadUnmappedFlag()) {
-                    // don't bother to warn since this does occur for PE reads
-                } else {
-                    log.warn("Cigar is empty for read " + rec);
-                }
-            } else {
-                log.error("Empty new cigar");
-            }
-            return false;
-        }
-
-        if (rec.getReadUnmappedFlag()){
-            log.info("Unmapped read with cigar: " + rec.getReadName() + " (" + rec.getCigarString() + "/" + cigar.toString()  + ")");
-
-        }
-        final List<SAMValidationError> validationErrors = cigar.isValid(rec.getReadName(), -1);
-        if (validationErrors != null && !validationErrors.isEmpty()) {
-            log.error("Invalid cigar for read " + rec +
-                (isOldCigar ? " " : " for new cigar with clipped adapter ") +
-                 " (" + rec.getCigarString() + "/" + cigar.toString()  + ") " +
-                validationErrors);
-            return false;
-        }
-    
-        if (rec.getReadLength() != cigar.getReadLength()){
-            // throw new SAMException(
-            log.error( rec.getReadLength() +
-               " read length does not = cigar length " + cigar.getReferenceLength() +
-               (isOldCigar? " oldCigar " : " ") +
-               rec + " cigar:" + cigar);
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Adds additional soft-clipped bases at the 3' and/or 5' end of the cigar.  Does not
-     * change the existing cigar except to merge the newly added soft-clipped bases if the
-     * element at the end of the cigar being modified is also a soft-clip.
-     *
-     * @param cigar             The cigar on which to base the new cigar
-     * @param negativeStrand    Whether the read is on the negative strand
-     * @param threePrimeEnd     number of soft-clipped bases to add to the 3' end of the read
-     * @param fivePrimeEnd      number of soft-clipped bases to add to the 5' end of the read
-     */
-    public static Cigar addSoftClippedBasesToEndsOfCigar(Cigar cigar, boolean negativeStrand,
-                                                         final int threePrimeEnd, final int fivePrimeEnd) {
-
-        List<CigarElement> newCigar = new ArrayList<CigarElement>(cigar.getCigarElements());
-        if (negativeStrand) {
-            Collections.reverse(newCigar);
-        }
-
-        if (threePrimeEnd > 0) {
-            int last = newCigar.size()-1;
-            int bases = threePrimeEnd;
-            if (newCigar.get(last).getOperator() == CigarOperator.SOFT_CLIP) {
-                CigarElement oldSoftClip = newCigar.remove(last);
-                bases += oldSoftClip.getLength();
-            }
-            newCigar.add(new CigarElement(bases, CigarOperator.SOFT_CLIP));
-        }
-
-        if (fivePrimeEnd > 0) {
-            int bases = fivePrimeEnd;
-            if (newCigar.get(0).getOperator() == CigarOperator.SOFT_CLIP) {
-                CigarElement oldSoftClip = newCigar.remove(0);
-                bases += oldSoftClip.getLength();
-            }
-            newCigar.add(0, new CigarElement(bases, CigarOperator.SOFT_CLIP));
-        }
-
-        if (negativeStrand) {
-            Collections.reverse(newCigar);
-        }
-        return new Cigar(newCigar);
-    }
-
-    // unpack a cigar string into an array of cigarOperators
-    // to facilitate sequence manipulation
-    public static char[] cigarArrayFromElements(List<CigarElement> cigar){
-        int pos = 0;
-        int length = 0;
-        for (CigarElement e : cigar){
-            length += e.getLength();
-        }
-        char[] result = new char[length];
-        for (CigarElement e : cigar){
-            for (int i = 0; i < e.getLength(); i++){
-                CigarOperator o = e.getOperator();
-                result[i+pos] = (char) CigarOperator.enumToCharacter(o);
-            }
-            pos += e.getLength();
-        }
-        return result;
-    }
-
-    // unpack a cigar string into an array of cigarOperators
-    // to facilitate sequence manipulation
-    public static char[] cigarArrayFromString(String cigar){
-          return cigarArrayFromElements(TextCigarCodec.decode(cigar).getCigarElements());
-    }
-
-    // construct a cigar string from an array of cigarOperators.
-    public static String cigarStringFromArray(final char[] cigar){
-        String result = "";
-        int length = cigar.length;
-        char lastOp = 0;  int lastLen = 0;
-        for (int i=0; i < length; i++){
-             if (cigar[i] == lastOp){
-                 lastLen++;
-             } else if (cigar[i] == '-'){
-                 ; // nothing - just ignore '-'
-             } else {
-                 if (lastOp != 0)
-                     result = result + Integer.toString(lastLen) + Character.toString(lastOp);
-                 lastLen = 1;
-                 lastOp = cigar[i];
-             }
-        }
-        return result + Integer.toString(lastLen) + Character.toString(lastOp);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CloseableIterator.java b/src/main/java/htsjdk/samtools/util/CloseableIterator.java
deleted file mode 100755
index d26443e..0000000
--- a/src/main/java/htsjdk/samtools/util/CloseableIterator.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.Closeable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Spliterator;
-import java.util.Spliterators;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-
-/**
- * This interface is used by iterators that use releasable resources during iteration.
- * 
- * The consumer of a CloseableIterator should ensure that the close() method is always called,
- * for example by putting such a call in a finally block.  Two conventions should be followed
- * by all implementors of CloseableIterator:
- * 1) The close() method should be idempotent: calling close() twice should have no effect.
- * 2) When hasNext() returns false, the iterator implementation should automatically close itself.
- *    The latter makes it somewhat safer for consumers to use the for loop syntax for iteration:
- *    for (Type obj : getCloseableIterator()) { ... }
- */
-public interface CloseableIterator<T> extends Iterator<T>, Closeable {
-    /** Should be implemented to close/release any underlying resources. */
-    void close();
-
-    /** Consumes the contents of the iterator and returns it as a List. */
-    default List<T> toList() {
-        final List<T> list = new ArrayList<>();
-        while (hasNext()) list.add(next());
-        close();
-        return list;
-    }
-
-    /** Returns a Stream that will consume from the underlying iterator. */
-    default Stream<T> stream() {
-        final Spliterator<T> s = Spliterators.spliteratorUnknownSize(this, Spliterator.ORDERED);
-        return StreamSupport.stream(s, false).onClose(this::close);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CloserUtil.java b/src/main/java/htsjdk/samtools/util/CloserUtil.java
deleted file mode 100644
index c236197..0000000
--- a/src/main/java/htsjdk/samtools/util/CloserUtil.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Utility to close things that implement Closeable
- * WARNING: This should only be used for Closeable things open for read, because it ignores exceptions, and
- * the caller will probably want to know about exceptions when closing a file being written to, because
- * this may indicate a failure to flush.
- *
- * @author Kathleen Tibbetts
- */
-public class CloserUtil {
-
-    /**
-     * Calls close() on <code>obj</code> if it implements Closeable
-     *
-     * @param obj   The potentially closeable object
-     */
-    public static void close(Object obj) {
-        if (obj != null) {
-            close(Arrays.asList(obj));
-        }
-    }
-
-    /**
-     * Calls close() on all elements of <code>objs</code> that implement Closeable
-     *
-     * @param objs   A list of potentially closeable objects
-     *
-     * NOTE: This method must take a List<? extends Object>, not List<Object>, otherwise the overload above will be selected
-     * if the argument is not exactly List<Object>.
-     */
-    public static void close(List<? extends Object> objs) {
-        for (Object o : objs) {
-            if (o instanceof Closeable) {
-                try {
-                    ((Closeable)o).close();
-                }
-                catch (IOException ioe) {
-                    // Do nothing 
-                }
-            } else if (o instanceof CloseableIterator) {
-                ((CloseableIterator)o).close();
-            }
-            else {
-                try {
-                    java.lang.reflect.Method m = o.getClass().getMethod("close");
-                    m.invoke(o);
-                }
-                catch (Exception e) { /** Ignore */ }
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CodeUtil.java b/src/main/java/htsjdk/samtools/util/CodeUtil.java
deleted file mode 100644
index 29e9348..0000000
--- a/src/main/java/htsjdk/samtools/util/CodeUtil.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * Miscellaneous util methods that don't fit anywhere else.
- */
-public class CodeUtil {
-
-    /** Mimic of Oracle's nvl() - returns the first value if not null, otherwise the second value. */
-    public static <T> T getOrElse(final T value1, final T value2) {
-        if (value1 != null) return value1;
-        else return value2;
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/CollectionUtil.java b/src/main/java/htsjdk/samtools/util/CollectionUtil.java
deleted file mode 100755
index 0354a5b..0000000
--- a/src/main/java/htsjdk/samtools/util/CollectionUtil.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-
-/**
- * Small utility methods for dealing with collection classes.
- * @author mccowan
- */
-public class CollectionUtil {
-
-    /** Simple case-insensitive lexical comparator of objects using their {@link Object#toString()} value. */
-    final public static Comparator<Object> OBJECT_TOSTRING_COMPARATOR = (o1, o2) -> o1.toString().compareToIgnoreCase(o2.toString());
-
-    public static <T> List<T> makeList(final T... list) {
-        final List<T> result = new ArrayList<>();
-        Collections.addAll(result, list);
-
-        return result;
-    }
-
-    public static <T> Set<T> makeSet(final T... list) {
-        final Set<T> result = new HashSet<>();
-        Collections.addAll(result, list);
-        return result;
-    }
-
-    public static <T> Collection<T> makeCollection(final Iterator<T> i) {
-        final List<T> list = new LinkedList<>();
-        while (i.hasNext()) {
-            list.add(i.next());
-        }
-        return list;
-    }
-
-    /** Construct a string by toString()ing each item in the collection with inBetween between each item. */
-    public static String join(final Collection<?> items, final String inBetween) {
-        final StringBuilder builder = new StringBuilder();
-        for (final Object item : items) {
-            if (builder.length() > 0) builder.append(inBetween);
-            builder.append(item);
-        }
-
-        return builder.toString();
-    }
-
-    public static <T> T getSoleElement(final Collection<T> items) {
-        if (items.size() != 1)
-            throw new IllegalArgumentException(String.format("Expected a single element in %s, but found %s.", items, items.size()));
-        return items.iterator().next();
-    }
-
-    /** Simple multi-map for convenience of storing collections in map values. */
-    public static class MultiMap<K, V> extends HashMap<K, Collection<V>> {
-        public void append(final K k, final V v) {
-            this.initializeKeyIfUninitialized(k);
-            this.get(k).add(v);
-        }
-
-        public void appendAll(final K k, final Collection<? extends V> v) {
-            this.initializeKeyIfUninitialized(k);
-            this.get(k).addAll(v);
-        }
-
-        private void initializeKeyIfUninitialized(final K k) {
-            if (!this.containsKey(k))
-                this.put(k, new LinkedList<>());
-        }
-    }
-
-    /**
-     * Partitions a collection into groups based on a characteristics of that group.  Partitions are embodied in a map, whose keys are the
-     * value of that characteristic, and the values are the partition of elements whose characteristic evaluate to that key.
-     *
-     * @deprecated use java8 .stream().collect(Collectors.groupingBy(()-> function)) instead
-     */
-    @Deprecated
-    public static <K, V> Map<K, Collection<V>> partition(final Collection<V> collection, final Partitioner<V, K> p) {
-        final MultiMap<K, V> partitionToValues = new MultiMap<>();
-        for (final V entry : collection) {
-            partitionToValues.append(p.getPartition(entry), entry);
-        }
-        return partitionToValues;
-    }
-
-    /**
-     * @deprecated use Collectors.groupingBy instead
-     */
-    @Deprecated
-    public static abstract class Partitioner<V, K> {
-        public abstract K getPartition(final V v);
-    }
-
-    /**
-     * Partitions a collection into groups based on a characteristics of that group.  Partitions are embodied in a map, whose keys are the
-     * value of that characteristic, and the values are the partition of elements whose characteristic evaluate to that key.
-     */
-    public static <K, V> Map<K, Collection<V>> partition(final Collection<V> collection, final Function<? super V, ? extends K> keyer) {
-        final MultiMap<K, V> partitionToValues = new MultiMap<>();
-        for (final V entry : collection) {
-            partitionToValues.append(keyer.apply(entry), entry);
-        }
-        return partitionToValues;
-    }
-
-    /**
-     * A defaulting map, which returns a default value when a value that does not exist in the map is looked up.
-     * 
-     * This map supports two modes: injecting-on-default, and not injecting-on-default.  When injecting on default, when a lookup is
-     * performed and a default value is returned, the default value is injected at that key, so that it now lives in the underlying map.
-     * Without this mode, the value is simply returned and the underlying map is unaffected.
-     * 
-     * Note: When using injecting-on-default mode, and performing a lookup with a non-key type (the get method accepts any object), a 
-     * class cast exception will be thrown because a non-key type cannot be added to the map.
-     * @param <K>
-     * @param <V>
-     */
-    public static class DefaultingMap<K, V> extends HashMap<K, V> {
-        final Factory<V, K> defaultGenerator;
-        final boolean injectValueOnDefault;
-        
-        /** Creates a defaulting map which defaults to the provided value and with injecting-on-default disabled. */
-        public DefaultingMap(final V defaultValue) {
-            this(k -> defaultValue, false);
-        }
-        
-        /**
-         * Creates a defaulting map that generates defaults from the provided factory. This is useful when the default is non-static, or
-         * the default is mutable, and the client wishes to get a value and mutate it and persist those changes in the map.
-         */
-        public DefaultingMap(final Factory<V, K> defaultGenerator, final boolean injectValueOnDefaulting) {
-            this.defaultGenerator = defaultGenerator;
-            this.injectValueOnDefault = injectValueOnDefaulting;
-        }
-
-        @Override
-        @SuppressWarnings("unchecked") // Expect that the cast is successful; otherwise, client is breaking contract.
-        public V get(final Object key) {
-            if (!this.containsKey(key)) {
-                final V val = this.defaultGenerator.make((K) key);
-                if (this.injectValueOnDefault) {
-                    this.put((K) key, val); 
-                }
-                return val;
-            } else {
-                return super.get(key);
-            }
-        }
-        
-        public interface Factory<V, K> {
-            /**
-             * @param k
-             */
-            V make(K k);
-        }
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/ComparableTuple.java b/src/main/java/htsjdk/samtools/util/ComparableTuple.java
deleted file mode 100644
index 1fe86ed..0000000
--- a/src/main/java/htsjdk/samtools/util/ComparableTuple.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * A simple extension of the Tuple class that, for comparable Types, allows comparing Tuples of non-null elements.
- * <p>
- * The comparison will compare the first arguments and if equal (compareTo returns 0) compare the second arguments.
- *
- * @author farjoun
- */
-public class ComparableTuple<A extends Comparable<A>, B extends Comparable<B>> extends Tuple<A, B> implements Comparable<ComparableTuple<A, B>> {
-
-    public ComparableTuple(final A a, final B b) {
-        super(a, b);
-
-        if (a == null || b == null) {
-            throw new IllegalArgumentException("ComparableTuple's behavior is undefined when containing a null.");
-        }
-    }
-
-    @Override
-    public int compareTo(final ComparableTuple<A, B> o) {
-        int retval = a.compareTo(o.a);
-        if (retval == 0) {
-            retval = b.compareTo(o.b);
-        }
-        return retval;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CoordMath.java b/src/main/java/htsjdk/samtools/util/CoordMath.java
deleted file mode 100644
index 7682026..0000000
--- a/src/main/java/htsjdk/samtools/util/CoordMath.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Static methods that encapsulate the standard SAM way of storing ranges: one-based, with both ends
- * inclusive.
- */
-public class CoordMath {
-
-    public static int getLength(final int start, final int end) {
-        return (end - start) + 1;
-    }
-
-    public static int getStart(final int end, final int length) {
-        return end - length + 1;
-    }
-
-    public static int getEnd(final int start, final int length) {
-        return start + length - 1;
-    }
-
-    /**
-     * Checks to see if the two sets of coordinates have any overlap.
-     */
-    public static boolean overlaps(final int start, final int end, final int start2, final int end2) {
-        return (start2 >= start && start2 <= end) || (end2 >=start && end2 <= end) ||
-                encloses(start2, end2, start, end);
-    }
-
-    /** Returns true if the "inner" coords and totally enclosed by the "outer" coords. */
-    public static boolean encloses(final int outerStart, final int outerEnd, final int innerStart, final int innerEnd) {
-        return innerStart >= outerStart && innerEnd <= outerEnd;
-    }
-
-    /**
-     * Determines the amount of overlap between two coordinate ranges. Assumes that the two ranges
-     * actually do overlap and therefore may produce strange results when they do not!
-     */
-    public static int getOverlap(final int start, final int end, final int start2, final int end2) {
-        return getLength(Math.max(start, start2), Math.min(end, end2));
-    }
-    
-    /** 
-     * Determines the read cycle number for the base
-     * 
-     *  @param isNegativeStrand true if the read is negative strand
-     *  @param readLength
-     *  @param readBaseIndex the 0-based index of the read base in question
-     */
-    public static int getCycle(boolean isNegativeStrand, int readLength, final int readBaseIndex) {
-        return isNegativeStrand ? readLength - readBaseIndex : readBaseIndex + 1;
-    }
-    
-}
diff --git a/src/main/java/htsjdk/samtools/util/CoordSpanInputSteam.java b/src/main/java/htsjdk/samtools/util/CoordSpanInputSteam.java
deleted file mode 100644
index 92f60f7..0000000
--- a/src/main/java/htsjdk/samtools/util/CoordSpanInputSteam.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * An input stream that wraps a {@link htsjdk.samtools.seekablestream.SeekableStream} to produce only bytes specified within coordinates.
- * Created by vadim on 25/03/2015.
- */
-public class CoordSpanInputSteam extends InputStream {
-    private SeekableStream delegate;
-    private Iterator<Chunk> it;
-    private Chunk current;
-    private boolean eof = false;
-
-    /**
-     * Wrap {@link htsjdk.samtools.seekablestream.SeekableStream} to read only bytes within boundaries specified in the coords array.
-     * The coords array consists of [inclusive; exclusive) pairs of long coordinates.
-     * This constructor will throw exception if a start coordinate is beyond stream length.
-     * End coordinates are capped at the stream length.
-     */
-    public CoordSpanInputSteam(SeekableStream delegate, long[] coords) throws IOException {
-        this.delegate = delegate;
-
-        List<Chunk> chunks = new ArrayList<Chunk>();
-        for (int i = 0; i < coords.length; i += 2) {
-            if (coords[i] > delegate.length()) throw new RuntimeException("Chunk start is passed EOF: " + coords[i]);
-            Chunk chunk = new Chunk(coords[i], coords[i + 1] > delegate.length() ? delegate.length() : coords[i + 1]);
-            chunks.add(chunk);
-            System.err.printf("Adding chunk: %d - %d\n", chunk.getChunkStart(), chunk.getChunkEnd());
-        }
-        it = chunks.iterator();
-        nextChunk();
-    }
-
-    private void nextChunk() throws IOException {
-        if (eof || !it.hasNext()) {
-            eof = true;
-            return;
-        }
-
-        current = it.next();
-        delegate.seek(current.getChunkStart());
-    }
-
-    @Override
-    public int read() throws IOException {
-        if (eof || delegate.eof()) {
-            eof = true;
-            return -1;
-        }
-
-        if (delegate.position() < current.getChunkEnd())
-            return delegate.read();
-
-        nextChunk();
-
-        if (eof) return -1;
-        return delegate.read();
-    }
-
-    @Override
-    public int read(byte[] buffer, int offset, int length) throws IOException {
-        if (eof || delegate.eof()) {
-            eof = true;
-            return -1;
-        }
-
-        int available = available();
-        if (available > length) return delegate.read(buffer, offset, length);
-
-        int read = delegate.read(buffer, offset, available);
-        if (delegate.position() >= current.getChunkEnd())
-            nextChunk();
-        return read;
-    }
-
-    /**
-     * Returns how many bytes are left in the current chunk.
-     *
-     * @return number of unread bytes in the current chunk.
-     * @throws IOException
-     */
-    @Override
-    public int available() throws IOException {
-        return (int) (current.getChunkEnd() - delegate.position());
-    }
-
-    @Override
-    public void close() throws IOException {
-        delegate.close();
-        it = null;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CustomGzipOutputStream.java b/src/main/java/htsjdk/samtools/util/CustomGzipOutputStream.java
deleted file mode 100644
index cb3652e..0000000
--- a/src/main/java/htsjdk/samtools/util/CustomGzipOutputStream.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.zip.GZIPOutputStream;
-
-/**
- * Hacky little class used to allow us to set the compression level on a GZIP output stream which, for some
- * bizarre reason, is not exposed in the standard API.
- *
- * @author Tim Fennell
- */
-public class CustomGzipOutputStream extends GZIPOutputStream {
-    CustomGzipOutputStream(final OutputStream outputStream, final int bufferSize, final int compressionLevel) throws
-            IOException {
-        super(outputStream, bufferSize);
-        this.def.setLevel(compressionLevel);
-    }
-
-    CustomGzipOutputStream(final OutputStream outputStream, final int compressionLevel) throws IOException {
-        super(outputStream);
-        this.def.setLevel(compressionLevel);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/DateParser.java b/src/main/java/htsjdk/samtools/util/DateParser.java
deleted file mode 100644
index 02a9609..0000000
--- a/src/main/java/htsjdk/samtools/util/DateParser.java
+++ /dev/null
@@ -1,337 +0,0 @@
-// DateParser.java
-// $Id: DateParser.java,v 1.3 2001/01/04 13:26:19 bmahe Exp $
-// (c) COPYRIGHT MIT, INRIA and Keio, 2000.
-
-/*
-W3C IPR SOFTWARE NOTICE
-
-Copyright 1995-1998 World Wide Web Consortium, (Massachusetts Institute of
-Technology, Institut National de Recherche en Informatique et en
-Automatique, Keio University). All Rights Reserved.
-http://www.w3.org/Consortium/Legal/
-
-This W3C work (including software, documents, or other related items) is
-being provided by the copyright holders under the following license. By
-obtaining, using and/or copying this work, you (the licensee) agree that you
-have read, understood, and will comply with the following terms and
-conditions:
-
-Permission to use, copy, and modify this software and its documentation,
-with or without modification,  for any purpose and without fee or royalty is
-hereby granted, provided that you include the following on ALL copies of the
-software and documentation or portions thereof, including modifications,
-that you make:
-
-  1. The full text of this NOTICE in a location viewable to users of the
-     redistributed or derivative work.
-  2. Any pre-existing intellectual property disclaimers, notices, or terms
-     and conditions. If none exist, a short notice of the following form
-     (hypertext is preferred, text is permitted) should be used within the
-     body of any redistributed or derivative code: "Copyright World Wide
-     Web Consortium, (Massachusetts Institute of Technology, Institut
-     National de Recherche en Informatique et en Automatique, Keio
-     University). All Rights Reserved. http://www.w3.org/Consortium/Legal/"
-  3. Notice of any changes or modifications to the W3C files, including the
-     date changes were made. (We recommend you provide URIs to the location
-     from which the code is derived).
-
-In addition, creators of derivitive works must include the full text of this
-NOTICE in a location viewable to users of the derivitive work.
-
-THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
-MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
-PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
-ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
-DOCUMENTATION.
-
-The name and trademarks of copyright holders may NOT be used in advertising
-or publicity pertaining to the software without specific, written prior
-permission. Title to copyright in this software and any associated
-documentation will at all times remain with copyright holders.
-
-____________________________________
-
-This formulation of W3C's notice and license became active on August 14
-1998. See the older formulation for the policy prior to this date. Please
-see our Copyright FAQ for common questions about using materials from our
-site, including specific terms and conditions for packages like libwww,
-Amaya, and Jigsaw. Other questions about this notice can be directed to
-site-policy at w3.org .
-
-
-
-
-webmaster
-(last updated 14-Aug-1998)
-
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.StringTokenizer;
-import java.util.TimeZone;
-
-/**
- * NOTE: This code has been taken from w3.org, and modified slightly to handle timezones of the form [-+]DDDD,
- * and also to fix a bug in the application of time zone to the parsed date.
- *
- * Date parser for ISO 8601 format
- * http://www.w3.org/TR/1998/NOTE-datetime-19980827
- * @version $Revision: 1.3 $
- * @author  bmahe at w3.org
- */
-public class DateParser {
-
-    private static boolean check(StringTokenizer st, String token)
-            throws InvalidDateException
-    {
-        if (!st.hasMoreElements()) return false;
-        if (st.nextToken().equals(token)) {
-            return true;
-        } else {
-            throw new InvalidDateException("Missing ["+token+"]");
-        }
-    }
-
-    private static Calendar getCalendar(String isodate)
-            throws InvalidDateException
-    {
-        // YYYY-MM-DDThh:mm:ss.sTZD
-        StringTokenizer st = new StringTokenizer(isodate, "-T:.+Z", true);
-
-        Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
-        calendar.clear();
-        try {
-            // Year
-            if (st.hasMoreTokens()) {
-                int year = Integer.parseInt(st.nextToken());
-                calendar.set(Calendar.YEAR, year);
-            } else {
-                return calendar;
-            }
-            // Month
-            if (check(st, "-") && (st.hasMoreTokens())) {
-                int month = Integer.parseInt(st.nextToken()) -1;
-                calendar.set(Calendar.MONTH, month);
-            } else {
-                return calendar;
-            }
-            // Day
-            if (check(st, "-") && (st.hasMoreTokens())) {
-                int day = Integer.parseInt(st.nextToken());
-                calendar.set(Calendar.DAY_OF_MONTH, day);
-            } else {
-                return calendar;
-            }
-            // Hour
-            if (check(st, "T") && (st.hasMoreTokens())) {
-                int hour = Integer.parseInt(st.nextToken());
-                calendar.set(Calendar.HOUR_OF_DAY, hour);
-            } else {
-                calendar.set(Calendar.HOUR_OF_DAY, 0);
-                calendar.set(Calendar.MINUTE, 0);
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-                return calendar;
-            }
-            // Minutes
-            if (check(st, ":") && (st.hasMoreTokens())) {
-                int minutes = Integer.parseInt(st.nextToken());
-                calendar.set(Calendar.MINUTE, minutes);
-            } else {
-                calendar.set(Calendar.MINUTE, 0);
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-                return calendar;
-            }
-
-            //
-            // Not mandatory now
-            //
-
-            // Secondes
-            if (! st.hasMoreTokens()) {
-                return calendar;
-            }
-            String tok = st.nextToken();
-            if (tok.equals(":")) { // secondes
-                if (st.hasMoreTokens()) {
-                    int secondes = Integer.parseInt(st.nextToken());
-                    calendar.set(Calendar.SECOND, secondes);
-                    if (! st.hasMoreTokens()) {
-                        return calendar;
-                    }
-                    // frac sec
-                    tok = st.nextToken();
-                    if (tok.equals(".")) {
-                        // bug fixed, thx to Martin Bottcher
-                        String nt = st.nextToken();
-                        while(nt.length() < 3) {
-                            nt += "0";
-                        }
-                        nt = nt.substring( 0, 3 ); //Cut trailing chars..
-                        int millisec = Integer.parseInt(nt);
-                        //int millisec = Integer.parseInt(st.nextToken()) * 10;
-                        calendar.set(Calendar.MILLISECOND, millisec);
-                        if (! st.hasMoreTokens()) {
-                            return calendar;
-                        }
-                        tok = st.nextToken();
-                    } else {
-                        calendar.set(Calendar.MILLISECOND, 0);
-                    }
-                } else {
-                    throw new InvalidDateException("No secondes specified");
-                }
-            } else {
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-            }
-            // Timezone
-            if (! tok.equals("Z")) { // UTC
-                if (! (tok.equals("+") || tok.equals("-"))) {
-                    throw new InvalidDateException("only Z, + or - allowed");
-                }
-                boolean plus = tok.equals("+");
-                if (! st.hasMoreTokens()) {
-                    throw new InvalidDateException("Missing hour field");
-                }
-                int tzhour = Integer.parseInt(st.nextToken());
-                int tzmin  = 0;
-                if (check(st, ":") && (st.hasMoreTokens())) {
-                    tzmin = Integer.parseInt(st.nextToken());
-                } else {
-                    // Modified by AW -- minute field is not required, and minutes may be represented
-                    // without colon between hours and minutes
-                    // throw new InvalidDateException("Missing minute field");
-                    if (tzhour >= 100) {
-                        tzmin = tzhour % 100;
-                        tzhour /= 100;
-                    }
-                }
-                if (!plus) { // Modified by AW -- !plus instead of plus
-                    calendar.add(Calendar.HOUR, tzhour);
-                    calendar.add(Calendar.MINUTE, tzmin);
-                } else {
-                    calendar.add(Calendar.HOUR, -tzhour);
-                    calendar.add(Calendar.MINUTE, -tzmin);
-                }
-            }
-        } catch (NumberFormatException ex) {
-            throw new InvalidDateException("["+ex.getMessage()+
-                    "] is not an integer");
-        }
-        return calendar;
-    }
-
-    /**
-     * Parse the given string in ISO 8601 format and build a Date object.
-     * @param isodate the date in ISO 8601 format
-     * @return a Date instance
-     * @exception InvalidDateException if the date is not valid
-     */
-    public static Date parse(String isodate)
-            throws InvalidDateException
-    {
-        Calendar calendar = getCalendar(isodate);
-        return calendar.getTime();
-    }
-
-    private static String twoDigit(int i) {
-        if (i >=0 && i < 10) {
-            return "0"+String.valueOf(i);
-        }
-        return String.valueOf(i);
-    }
-
-    /**
-     * Generate a ISO 8601 date
-     * @param date a Date instance
-     * @return a string representing the date in the ISO 8601 format
-     */
-    public static String getIsoDate(Date date) {
-        Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
-        calendar.setTime(date);
-        return new StringBuffer().append(calendar.get(Calendar.YEAR))
-                .append("-")
-                .append(twoDigit(calendar.get(Calendar.MONTH) + 1))
-                .append("-")
-                .append(twoDigit(calendar.get(Calendar.DAY_OF_MONTH)))
-                .append("T")
-                .append(twoDigit(calendar.get(Calendar.HOUR_OF_DAY)))
-                .append(":")
-                .append(twoDigit(calendar.get(Calendar.MINUTE)))
-                .append(":")
-                .append(twoDigit(calendar.get(Calendar.SECOND)))
-                .append(".")
-                .append(twoDigit(calendar.get(Calendar.MILLISECOND) / 10))
-                .append("Z").toString();
-    }
-
-    public static void test(String isodate) {
-        System.out.println("----------------------------------");
-        try {
-            Date date = parse(isodate);
-            System.out.println(">> "+isodate);
-            System.out.println(">> "+date.toString()+" ["+date.getTime()+"]");
-            System.out.println(">> "+getIsoDate(date));
-        } catch (InvalidDateException ex) {
-            System.err.println(isodate+" is invalid");
-            System.err.println(ex.getMessage());
-        }
-        System.out.println("----------------------------------");
-    }
-
-    public static void test(Date date) {
-        String isodate = null;
-        System.out.println("----------------------------------");
-        try {
-            System.out.println(">> "+date.toString()+" ["+date.getTime()+"]");
-            isodate = getIsoDate(date);
-            System.out.println(">> "+isodate);
-            date = parse(isodate);
-            System.out.println(">> "+date.toString()+" ["+date.getTime()+"]");
-        } catch (InvalidDateException ex) {
-            System.err.println(isodate+" is invalid");
-            System.err.println(ex.getMessage());
-        }
-        System.out.println("----------------------------------");
-    }
-
-    public static void main(String args[]) {
-        test("1997-07-16T19:20:30.45-02:00");
-        test("1997-07-16T19:20:30+01:00");
-        test("1997-07-16T19:20:30+01:00");
-        test("1997-07-16T19:20");
-        test("1997-07-16");
-        test("1997-07");
-        test("1997");
-        test(new Date());
-    }
-
-    public static class InvalidDateException extends SAMException {
-        public InvalidDateException() {
-        }
-
-        public InvalidDateException(final String s) {
-            super(s);
-        }
-
-        public InvalidDateException(final String s, final Throwable throwable) {
-            super(s, throwable);
-        }
-
-        public InvalidDateException(final Throwable throwable) {
-            super(throwable);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/DelegatingIterator.java b/src/main/java/htsjdk/samtools/util/DelegatingIterator.java
deleted file mode 100644
index 054352b..0000000
--- a/src/main/java/htsjdk/samtools/util/DelegatingIterator.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.util.Iterator;
-
-/**
- * Simple iterator class that delegates all method calls to an underlying iterator. Useful
- * for in-line subclassing to add behaviour to one or more methods.
- *
- * @author Tim Fennell
- */
-public class DelegatingIterator<T> implements CloseableIterator<T> {
-    private final Iterator<T> iterator;
-
-    public DelegatingIterator(final Iterator<T> iterator) {
-        this.iterator = iterator;
-    }
-
-    public void close() {
-        if (iterator instanceof CloseableIterator) {
-            ((CloseableIterator) this.iterator).close();
-        }
-    }
-
-    public boolean hasNext() {
-        return this.iterator.hasNext();
-    }
-
-    public T next() {
-        return this.iterator.next();
-    }
-
-    public void remove() {
-        this.iterator.remove();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/DiskBackedQueue.java b/src/main/java/htsjdk/samtools/util/DiskBackedQueue.java
deleted file mode 100644
index bbf3818..0000000
--- a/src/main/java/htsjdk/samtools/util/DiskBackedQueue.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayDeque;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Queue;
-
-/**
- * A single-ended FIFO queue. Writes elements to temporary files when the queue gets too big.
- * External references to elements in this queue are NOT guaranteed to be valid, due to the disk write/read
- * <p/>
- * NB: The queue becomes read-only after the first time that an on-disk record is "next up" to be read (i.e. has been
- * loaded into headRecord). Max size is therefore non-deterministic.
- * This avoids issues arising from conflicts between the input and output streams.
- * This could perhaps be avoided by creating a version of BAMRecordCodec that operates on RandomAccessFiles or channels.
- * <p/>
- *
- *
- * Created by bradt on 4/28/14.
- */
-public class DiskBackedQueue<E> implements Queue<E> {
-    private final int maxRecordsInRamQueue;
-    private final Queue<E> ramRecords;
-    private File diskRecords = null;
-    private final TempStreamFactory tempStreamFactory = new TempStreamFactory();
-    private OutputStream outputStream = null;
-    private InputStream inputStream = null;
-    private boolean canAdd = true;
-    private int numRecordsOnDisk = 0;
-
-    /** Record representing the head of the queue; returned by peek, poll **/
-    private E headRecord = null;
-
-    /** Directories where file of records go. **/
-    private final List<File> tmpDirs;
-
-    /**
-     * Used to write records to file, and used as a prototype to create codecs for reading.
-     */
-    private final SortingCollection.Codec<E> codec;
-
-
-    /**
-     * Prepare to accumulate records
-     *
-     * @param codec For writing records to file and reading them back into RAM
-     * @param maxRecordsInRam how many records to accumulate before spilling to disk
-     * @param tmpDirs Where to write files of records that will not fit in RAM
-     */
-    private DiskBackedQueue(final SortingCollection.Codec<E> codec,
-                            final int maxRecordsInRam, final List<File> tmpDirs) {
-        if (maxRecordsInRam < 0) {
-            throw new IllegalArgumentException("maxRecordsInRamQueue must be >= 0");
-        }
-        if (tmpDirs == null || tmpDirs.isEmpty()) {
-            throw new IllegalArgumentException("At least one temp directory must be provided.");
-        }
-        for (final File tmpDir : tmpDirs) IOUtil.assertDirectoryIsWritable(tmpDir);
-        this.tmpDirs = tmpDirs;
-        this.codec = codec;
-        this.maxRecordsInRamQueue = (maxRecordsInRam == 0) ? 0 : maxRecordsInRam - 1; // the first of our ram records is stored as headRecord
-        this.ramRecords = new ArrayDeque<E>(this.maxRecordsInRamQueue);
-    }
-
-    /**
-     * Syntactic sugar around the ctor, to save some typing of type parameters
-     *
-     * @param codec For writing records to file and reading them back into RAM
-     * @param maxRecordsInRam how many records to accumulate in memory before spilling to disk
-     * @param tmpDir Where to write files of records that will not fit in RAM
-     */
-    public static <T> DiskBackedQueue<T> newInstance(final SortingCollection.Codec<T> codec,
-                                                     final int maxRecordsInRam,
-                                                     final List<File> tmpDir) {
-        return new DiskBackedQueue<T>(codec, maxRecordsInRam, tmpDir);
-    }
-
-    public boolean canAdd() {
-        return this.canAdd;
-    }
-
-    public int getNumRecordsOnDisk() {
-        return this.numRecordsOnDisk;
-    }
-
-    public boolean headRecordIsFromDisk() {
-        return (!this.canAdd);
-    }
-
-    /**
-     * Add the record to the tail of the queue, spilling to disk if necessary
-     * Must check that (canAdd() == true) before calling this method
-     *
-     * @param record The record to be added to the queue
-     * @return true (if add successful)
-     * @throws IllegalStateException if the queue cannot be added to
-     */
-    public boolean add(final E record) throws IllegalStateException {
-        if (!canAdd) throw new IllegalStateException("Cannot add to DiskBackedQueue whose canAdd() method returns false");
-
-        // NB: we add all the records before removing them, so we can never have spilled to disk unless all the space for ram records
-        // have been exhausted.
-        if (this.headRecord == null) { // this is the first record in the queue
-            if (0 < this.numRecordsOnDisk) throw new SAMException("Head record was null but we have records on disk. Bug!");
-            this.headRecord = record;
-        }
-        else if (this.ramRecords.size() == this.maxRecordsInRamQueue) {
-            spillToDisk(record);
-        }
-        else {
-            if (0 < this.numRecordsOnDisk) throw new SAMException("Trying to add records to RAM but there were records on disk. Bug!");
-            this.ramRecords.add(record);
-        }
-        return true;
-    }
-
-    @Override
-    public boolean offer(final E e) {
-        return this.canAdd && this.add(e);
-    }
-
-    @Override
-    public E remove() {
-        final E element = this.poll();
-        if (element == null) {
-            throw new NoSuchElementException("Attempting to remove() from empty DiskBackedQueue");
-        }
-        else {
-            return element;
-        }
-    }
-
-    @Override
-    public E poll() {
-        final E outRecord = this.headRecord;
-        if (outRecord != null) {
-            updateQueueHead();
-        }
-        return outRecord;
-    }
-
-    @Override
-    public E element() {
-        if (this.headRecord != null) {
-            return this.headRecord;
-        }
-        else {
-            throw new NoSuchElementException("Attempting to element() from empty DiskBackedQueue");
-        }
-    }
-
-    @Override
-    public E peek() {
-        return this.headRecord;
-    }
-
-    /**
-     * Return the total number of elements in the queue, both in memory and on disk
-     */
-    public int size() {
-        return (this.headRecord == null) ? 0 : (1 + this.ramRecords.size() + this.numRecordsOnDisk);
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return (this.headRecord == null);
-    }
-
-    /**
-     * Add all elements from collection c to this DiskBackedQueue
-     * Must check that (canAdd() == true) before calling this method
-     *
-     * @param c the collection of elements to add
-     * @return true if this collection changed as a result of the call
-     * @throws IllegalStateException if the queue cannot be added to
-     */
-    @Override
-    public boolean addAll(final Collection<? extends E> c) {
-        try {
-            for (final E element : c) {
-                this.add(element);
-            }
-            return true;
-        } catch (final IllegalStateException e) {
-            throw new IllegalStateException("Cannot add to DiskBackedQueue whose canAdd() method returns false", e);
-        }
-    }
-
-    @Override
-    public void clear() {
-        this.headRecord = null;
-        this.ramRecords.clear();
-        this.closeIOResources();
-        this.outputStream = null;
-        this.inputStream = null;
-        this.diskRecords = null;
-        this.canAdd = true;
-    }
-
-    /**
-     * Clean up disk resources in case clear() has not been explicitly called (as would be preferable)
-     * Closes the input and output streams associated with this DiskBackedQueue and deletes the temporary file
-     *
-     * @throws Throwable
-     */
-    protected void finalize() throws Throwable {
-        this.closeIOResources();
-        super.finalize(); // NB: intellij wanted me to do this. Need I?  I'm not extending anything
-    }
-
-    /**
-     * Write the present record to the end of a file representing the tail of the queue.
-     * @throws RuntimeIOException
-     */
-    private void spillToDisk(final E record) throws RuntimeIOException {
-        try {
-            if (this.diskRecords == null) {
-                this.diskRecords = newTempFile();
-                this.outputStream = tempStreamFactory.wrapTempOutputStream(new FileOutputStream(this.diskRecords), Defaults.BUFFER_SIZE);
-                this.codec.setOutputStream(this.outputStream);
-            }
-            this.codec.encode(record);
-            this.outputStream.flush();
-            this.numRecordsOnDisk++;
-        } catch (final IOException e) {
-            throw new RuntimeIOException("Problem writing temporary file. Try setting TMP_DIR to a file system with lots of space.", e);
-        }
-    }
-
-    /**
-     * Creates a new tmp file on one of the available temp filesystems, registers it for deletion
-     * on JVM exit and then returns it.
-     */
-    private File newTempFile() throws IOException {
-        return IOUtil.newTempFile("diskbackedqueue.", ".tmp", this.tmpDirs.toArray(new File[tmpDirs.size()]), IOUtil.FIVE_GBS);
-    }
-
-    /**
-     * Update the head of the queue with the next record in memory or on disk.
-     * Sets headRecord to null if the queue is now empty
-     */
-    private void updateQueueHead() {
-        if (!this.ramRecords.isEmpty()) {
-            this.headRecord = this.ramRecords.poll();
-            if (0 < numRecordsOnDisk) this.canAdd = false;
-        }
-        else if (this.diskRecords != null) {
-            this.headRecord = this.readFileRecord(this.diskRecords);
-            this.canAdd = false;
-        }
-        else {
-            this.canAdd = true;
-            this.headRecord = null;
-        }
-    }
-
-    /**
-     * Read back a record that had been spilled to disk. Return null if there are no disk records
-     * Note- if we are reading disk records, we can no longer add additional elements to this DiskBackedQueue
-     *
-     * @param file the file to read from
-     * @return The next element from the head of the file, or null if end-of-file is reached
-     * @throws RuntimeIOException
-     */
-    private E readFileRecord (final File file) {
-        if (this.canAdd) this.canAdd = false; // NB: should this just be an assignment regardless?
-
-        // we never wrote a record to disk
-        if (file == null) {
-            throw new IllegalStateException("The file to read from was null");
-        }
-        try {
-            if (this.inputStream == null) {
-                inputStream = new FileInputStream(file);
-                this.codec.setInputStream(tempStreamFactory.wrapTempInputStream(inputStream, Defaults.BUFFER_SIZE));
-            }
-            final E record = this.codec.decode(); // NB: returns null if end-of-file is reached.
-            if (record != null) {
-                numRecordsOnDisk--;
-            }
-            return record;
-        } catch (final IOException e) {
-            throw new RuntimeIOException("DiskBackedQueue encountered an error reading from a file", e);
-        }
-    }
-
-    private void closeIOResources() {
-        CloserUtil.close(this.outputStream);
-        CloserUtil.close(this.inputStream);
-        if (this.diskRecords != null) IOUtil.deleteFiles(this.diskRecords);
-    }
-
-    /**
-     * Not supported. Cannot access particular elements, as some elements may have been written to disk
-     *
-     * @throws UnsupportedOperationException
-     */
-    @Override
-    public boolean remove(final Object o) {
-        throw new UnsupportedOperationException("DiskBackedQueue does not support remove(Object o)");
-    }
-
-    /**
-     * Not supported. Cannot access particular elements, as some elements may have been written to disk
-     *
-     * @throws UnsupportedOperationException
-     */
-    @Override
-    public boolean removeAll(final Collection<?> c) {
-        throw new UnsupportedOperationException("DiskBackedQueue does not support removeAll(Collection<?> c)");
-    }
-
-    /**
-     * Not supported. Cannot access particular elements, as some elements may have been written to disk
-     *
-     * @throws UnsupportedOperationException
-     */
-    @Override
-    public boolean retainAll(final Collection<?> c) {
-        throw new UnsupportedOperationException("DiskBackedQueue does not support retainAll(Collection<?> c)");
-    }
-
-    /**
-     * Not supported. It is not possible to check for the presence of a particular element,
-     * as some elements may have been written to disk
-     *
-     * @throws UnsupportedOperationException
-     */
-    @Override
-    public boolean contains(final Object o) {
-        throw new UnsupportedOperationException("DiskBackedQueue does not support contains(Object o)");
-    }
-
-    /**
-     * Not supported. It is not possible to check for the presence of a particular element,
-     * as some elements may have been written to disk
-     *
-     * @throws UnsupportedOperationException
-     */
-    @Override
-    public boolean containsAll(final Collection<?> c) {
-        throw new UnsupportedOperationException("DiskBackedQueue does not support containsAll(Collection<?> c)");
-    }
-
-    /**
-     * Not supported at this time
-     * @throws UnsupportedOperationException
-     */
-    @Override
-    public Iterator<E> iterator() {
-        throw new UnsupportedOperationException("DiskBackedQueue does not support iterator()");
-    }
-
-    /**
-     * Not supported at this time
-     * @throws UnsupportedOperationException
-     */
-    @Override
-    public Object[] toArray() {
-        throw new UnsupportedOperationException("DiskBackedQueue does not support toArray()");
-    }
-
-    /**
-     * Not supported at this time
-     * @throws UnsupportedOperationException
-     */
-    @Override
-    public <T1> T1[] toArray(final T1[] a) {
-        throw new UnsupportedOperationException("DiskBackedQueue does not support toArray(T1[] a)");
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/EdgeReadIterator.java b/src/main/java/htsjdk/samtools/util/EdgeReadIterator.java
deleted file mode 100644
index 0d779a8..0000000
--- a/src/main/java/htsjdk/samtools/util/EdgeReadIterator.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.AlignmentBlock;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SamReader;
-
-/**
- * Iterator that traverses a SAM File, accumulating information on a per-locus basis.
- * Optionally takes a target interval list, in which case the loci returned are the ones covered by
- * the interval list.  If no target interval list, whatever loci are covered by the input reads are returned.
- * By default duplicate reads and non-primary alignments are filtered out.  Filtering may be changed
- * via setSamFilters(). Difference from SamLocusIterator is that this implementation accumulates data
- * only about start and end of alignment blocks from reads, not about each aligned base.
- * 
- * @author Darina_Nikolaeva at epam.com, EPAM Systems, Inc. <www.epam.com>
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- * 
- */
-public class EdgeReadIterator extends AbstractLocusIterator<EdgingRecordAndOffset, AbstractLocusInfo<EdgingRecordAndOffset>> {
-
-    /**
-     * Prepare to iterate through the given SAM records, skipping non-primary alignments.  Do not use
-     * BAM index even if available.
-     *
-     * @param samReader must be coordinate sorted
-     */
-    public EdgeReadIterator(final SamReader samReader) {
-        this(samReader, null);
-    }
-
-    /**
-     * Prepare to iterate through the given SAM records, skipping non-primary alignments.
-     *
-     * @param samReader    must be coordinate sorted
-     * @param intervalList Either the list of desired intervals, or null.  Note that if an intervalList is
-     *                     passed in that is not coordinate sorted, it will eventually be coordinated sorted by this class.
-     */
-    public EdgeReadIterator(final SamReader samReader, final IntervalList intervalList) {
-        this(samReader, intervalList, samReader.hasIndex());
-    }
-
-    /**
-     * Prepare to iterate through the given SAM records, skipping non-primary alignments
-     *
-     * @param samReader    must be coordinate sorted
-     * @param intervalList Either the list of desired intervals, or null.  Note that if an intervalList is
-     *                     passed in that is not coordinate sorted, it will eventually be coordinated sorted by this class.
-     * @param useIndex     If true, do indexed lookup to improve performance.  Not relevant if intervalList == null.
-     *                     It is no longer the case the useIndex==true can make performance worse.  It should always perform at least
-     *                     as well as useIndex==false, and generally will be much faster.
-     */
-    public EdgeReadIterator(final SamReader samReader, final IntervalList intervalList, final boolean useIndex) {
-        super(samReader, intervalList, useIndex);
-    }
-
-    /**
-     * Capture the loci covered by the given SAMRecord in the AbstractLocusInfos in the accumulator,
-     * creating new AbstractLocusInfos as needed. EdgingRecordAndOffset object are created only for start
-     * and end of each alignment block of SAMRecord.
-     * If list of intervals is defined, start or/and length of alignment block are shifted to match the interval, to
-     * prevent exceeding the interval.
-     * @param rec SAMRecord to process and add to <code>AbstractLocusInfo</code>
-     */
-    @Override
-    void accumulateSamRecord(SAMRecord rec) {
-        // interpret the CIGAR string and add the base info
-        for (final AlignmentBlock alignmentBlock : rec.getAlignmentBlocks()) {
-            // 0-based offset into the read of the current base
-            final int readOffset = alignmentBlock.getReadStart() - 1;
-            // 1-based reference position that the current base aligns to
-            final int refPos = alignmentBlock.getReferenceStart();
-
-            // 0-based offset from the aligned position of the first base in the read to the aligned position
-            // of the current base.
-            final int refOffset = refPos - rec.getAlignmentStart();
-            final int refOffsetEnd = refPos - rec.getAlignmentStart() + alignmentBlock.getLength();
-
-
-            // Ensure there are AbstractLocusInfos up to and including this position
-            for (int j = accumulator.size(); j <= refOffsetEnd; ++j) {
-                accumulator.add(createLocusInfo(getReferenceSequence(rec.getReferenceIndex()),
-                        rec.getAlignmentStart() + j));
-            }
-
-            /* Let's assume an alignment block starts in some locus. 
-             * We put two records to the accumulator. The first one has the "begin" type which corresponds to the locus 
-             * where the block starts. The second one has the "end" type which corresponds to the other locus where the block ends. 
-            */
-            int refOffsetInterval = refOffset; // corresponds to the beginning of the alignment block 
-            int refOffsetEndInterval = refOffsetEnd;
-            int startShift = 0;
-
-            // intersect intervals and alignment block
-            if (getIntervals() != null) {
-                // get the current interval we're processing 
-                Interval interval = getCurrentInterval();
-                if (interval != null) {
-                    final int intervalEnd = interval.getEnd();
-                    final int intervalStart = interval.getStart();
-                    // check if an interval and the alignment block overlap
-                    if (!CoordMath.overlaps(refPos, refPos + alignmentBlock.getLength(), intervalStart, intervalEnd)) {
-                        continue;
-                    }
-                    // if the alignment block starts out of an interval, shift the starting position
-                    if (refPos < intervalStart) {
-                        startShift = intervalStart - refPos;
-                        refOffsetInterval = refOffsetInterval + startShift;
-                    }
-                    // if the alignment block ends out of an interval, shift the ending position
-                    final int readEnd = refPos + alignmentBlock.getLength();
-                    if (refPos + alignmentBlock.getLength() > intervalEnd) {
-                        refOffsetEndInterval = refOffsetEndInterval - (readEnd - intervalEnd) + 1;
-                    }
-                }
-            }
-            final int length = refOffsetEndInterval - refOffsetInterval;
-            // add the alignment block to the accumulator when it starts and when it ends 
-            final EdgingRecordAndOffset recordAndOffset = createRecordAndOffset(rec, readOffset + startShift, length, refPos + startShift);
-            // accumulate start of the alignment block
-            accumulator.get(refOffsetInterval).add(recordAndOffset);
-            final EdgingRecordAndOffset recordAndOffsetEnd = createRecordAndOffset(recordAndOffset);
-            // accumulate end of the alignment block
-            accumulator.get(refOffsetEndInterval).add(recordAndOffsetEnd);
-        }
-    }
-
-    @Override
-    void accumulateIndels(SAMRecord rec) {
-        throw new UnsupportedOperationException("Indels accumulation is not supported for " + getClass().getSimpleName() + ".");
-    }
-
-    /**
-     * Creates a new <code>EdgingRecordAndOffset</code> for given input values
-     *
-     * @param rec        aligned SamRecord
-     * @param readOffset offset from start of read
-     * @param length     length of alignment block
-     * @param refPos     position in the reference sequence
-     * @return created <code>EdgingRecordAndOffset</code>
-     */
-    @Override
-    EdgingRecordAndOffset createRecordAndOffset(SAMRecord rec, int readOffset, int length, int refPos) {
-        return EdgingRecordAndOffset.createBeginRecord(rec, readOffset, length, refPos);
-    }
-
-    EdgingRecordAndOffset createRecordAndOffset(EdgingRecordAndOffset startRecord) {
-        return EdgingRecordAndOffset.createEndRecord(startRecord);
-    }
-
-    /**
-     * @param referenceSequence processed reference sequence
-     * @param lastPosition      last processed reference locus position
-     * @return <code>AbstractLocusInfo<T></code> for the lastPosition
-     */
-    @Override
-    AbstractLocusInfo<EdgingRecordAndOffset> createLocusInfo(SAMSequenceRecord referenceSequence, int lastPosition) {
-        return new AbstractLocusInfo<>(referenceSequence, lastPosition);
-    }
-
-    /**
-     * This method isn't supported in current implementation.
-     *
-     * @param maxReadsToAccumulatePerLocus maximum number of <code>RecordAndOffset</code> objects to store for
-     *                                     one loci in reference sequence.
-     */
-    @Override
-    public void setMaxReadsToAccumulatePerLocus(int maxReadsToAccumulatePerLocus) {
-        if (getMaxReadsToAccumulatePerLocus() != 0) {
-            throw new UnsupportedOperationException("Locus cap is not supported for " + getClass().getSimpleName() + ".");
-        }
-    }
-
-    /**
-     * This method isn't supported in current implementation.
-     *
-     * @param qualityScoreCutoff the minimum base quality to include in <code>AbstractLocusInfo</code>.
-     */
-    @Override
-    public void setQualityScoreCutoff(int qualityScoreCutoff) {
-        throw new UnsupportedOperationException("Quality filtering is not supported for " + getClass().getSimpleName() + ".");
-    }
-
-    /**
-     * For correct work of <code>EdgeReadIterator</code> value <code>emitUncoveredLoci</code> must be true.
-     *
-     * @param emitUncoveredLoci if false, iterator will skip uncovered loci in reference sequence, otherwise
-     *                          empty <code>AbstractLocusInfo</code> will be created for each loci.
-     */
-    @Override
-    public void setEmitUncoveredLoci(boolean emitUncoveredLoci) {
-        if (isEmitUncoveredLoci() != emitUncoveredLoci) {
-            throw new UnsupportedOperationException(getClass().getSimpleName() + " doesn't support work with skipping " +
-                    "uncovered bases.");
-        }
-    }
-
-    @Override
-    public void setIncludeIndels(boolean includeIndels) {
-        if (isIncludeIndels() != includeIndels) {
-            throw new UnsupportedOperationException("Indels accumulation is not supported for " + getClass().getSimpleName() + ".");
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/EdgingRecordAndOffset.java b/src/main/java/htsjdk/samtools/util/EdgingRecordAndOffset.java
deleted file mode 100644
index b83a169..0000000
--- a/src/main/java/htsjdk/samtools/util/EdgingRecordAndOffset.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecord;
-
-import static htsjdk.samtools.util.EdgingRecordAndOffset.Type.BEGIN;
-import static htsjdk.samtools.util.EdgingRecordAndOffset.Type.END;
-
-/**
- * Holds a SAMRecord plus the zero-based offset into that SAMRecord's bases and quality scores that corresponds
- * to the base and quality for the start of alignment block at the genomic position described by the AbstractLocusInfo.
- * This is implementation for EdgeReadIterator, field <code>type</code> added to indicate whether object
- * represents the start or the end of an alignment block.
- * <p>
- * Subclasses StartEdgingRecordAndOffset and EndEdgingRecordAndOffset are used in EdgeReadIterator to
- * distinguish starting and ending of the alignment block
- * as for each alignment block two objects of <code>EdgingRecordAndOffset</code> are created with two different types.
- * The main idea of using EdgeReadIterator is to process alignment block starting from locus where BEGIN type occurs,
- * aggregate information per locus and keep it until END type occurs, then remove alignment block from consideration.
- * 
- * @author Darina_Nikolaeva at epam.com, EPAM Systems, Inc. <www.epam.com>
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-public abstract class EdgingRecordAndOffset extends AbstractRecordAndOffset {
-
-    private EdgingRecordAndOffset(SAMRecord record, int offset) {
-        super(record, offset);
-    }
-
-    public abstract EdgingRecordAndOffset getStart();
-
-    public abstract Type getType();
-
-    public abstract byte getBaseQuality(int position);
-
-    public static EdgingRecordAndOffset createBeginRecord(SAMRecord record, int offset, int length, int refPos) {
-        return new StartEdgingRecordAndOffset(record, offset, length, refPos);
-    }
-
-    public static EdgingRecordAndOffset createEndRecord(EdgingRecordAndOffset startRecord) {
-        return new EndEdgingRecordAndOffset(startRecord);
-    }
-
-    /**
-     * Describes the type of <code>TypedRecordAndOffset</code>, whether it represents the start or the end of
-     * an alignment block.
-     */
-    public enum Type {
-        BEGIN, END
-    }
-
-    private static class StartEdgingRecordAndOffset extends EdgingRecordAndOffset {
-        /**
-         * Length of alignment block of the read
-         */
-        private final int length;
-        /**
-         * A reference position to which read offset is aligned.
-         */
-        private final int refPos;
-
-        private int hash = 0;
-
-        /**
-         * @param record inner SAMRecord
-         * @param offset from the start of the read
-         * @param length of alignment block
-         * @param refPos corresponding to read offset reference position
-         */
-        protected StartEdgingRecordAndOffset(SAMRecord record, int offset, int length, int refPos) {
-            super(record, offset);
-            if (length > record.getReadLength()) {
-                throw new IllegalArgumentException("Block length cannot be larger than whole read length");
-            }
-            this.length = length;
-            this.refPos = refPos;
-        }
-
-        /**
-         * @param position in the reference
-         * @return base quality of a read base, corresponding to a given reference position
-         */
-        public byte getBaseQuality(int position) {
-            int rOffset = getRelativeOffset(position);
-            byte[] baseQualities = record.getBaseQualities();
-            validateOffset(rOffset, baseQualities);
-            return baseQualities[rOffset];
-        }
-
-        /**
-         * @return the length of alignment block represented by the object.
-         */
-        @Override
-        public int getLength() {
-            return length;
-        }
-
-        /**
-         * @return the position in reference sequence, to which the start of alignment block is aligned.
-         */
-        @Override
-        public int getRefPos() {
-            return refPos;
-        }
-
-        /**
-         * @return type of object
-         */
-        @Override
-        public Type getType() {
-            return BEGIN;
-        }
-
-        /**
-         * @return <code>EdgingRecordAndOffset</code> that represents the start of alignment block of the read
-         * for object with type END. For object with type BEGIN will return null.
-         */
-        @Override
-        public EdgingRecordAndOffset getStart() {
-            return null;
-        }
-
-        @Override
-        public int hashCode() {
-            if (hash != 0) return hash;
-            hash = record.hashCode();
-            hash = 31 * hash + length;
-            hash = 31 * hash + offset;
-            hash = 31 * hash + refPos;
-            return hash;
-        }
-
-        private int getRelativeOffset(int position) {
-            return position - refPos + offset;
-        }
-    }
-
-    private static class EndEdgingRecordAndOffset extends EdgingRecordAndOffset {
-
-        /**
-         * For object with type END this fields holds the reference to object with type BEGIN for the read.
-         */
-        final private EdgingRecordAndOffset start;
-
-        EndEdgingRecordAndOffset(EdgingRecordAndOffset record) {
-            super(record.getRecord(), record.getOffset());
-            this.start = record;
-        }
-
-        /**
-         * @param position in the reference
-         * @return base quality of a read base, corresponding to a given reference position
-         */
-        public byte getBaseQuality(int position) {
-            return start.getBaseQuality(position);
-        }
-
-        /**
-         * @return the length of alignment block represented by the object.
-         */
-        @Override
-        public int getLength() {
-            return start.getLength();
-        }
-
-        /**
-         * @return the position in reference sequence, to which the start of alignment block is aligned.
-         */
-        @Override
-        public int getRefPos() {
-            return start.getRefPos();
-        }
-
-        /**
-         * @return type of object
-         */
-        @Override
-        public Type getType() {
-            return END;
-        }
-
-        /**
-         * @return <code>EdgingRecordAndOffset</code> that represents the start of alignment block of the read
-         * for object with type END
-         */
-        @Override
-        public EdgingRecordAndOffset getStart() {
-            return start;
-        }
-
-        @Override
-        public int hashCode() {
-            return start.hashCode();
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/FastLineReader.java b/src/main/java/htsjdk/samtools/util/FastLineReader.java
deleted file mode 100644
index d802fad..0000000
--- a/src/main/java/htsjdk/samtools/util/FastLineReader.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Line-oriented InputStream reader that uses one buffer for disk buffering and line-termination-finding,
- * in order to improve performance.
- *
- * Implementation detail: All public methods must leave the input buffer in a non-empty state, unless at EOF.
- *
- * @author alecw at broadinstitute.org
- */
-public class FastLineReader implements Closeable {
-    private InputStream in;
-    private byte[] fileBuffer = new byte[512000];
-    // Next byte to read in fileBuffer
-    private int nextByte = 0;
-    // Number of bytes in fileBuffer
-    private int numBytes = 0;
-    private boolean atEof;
-
-    public FastLineReader(final InputStream in) {
-        this.in = in;
-        ensureBufferNotEmpty();
-    }
-
-    /**
-     * @return true if input is exhausted
-     */
-    public boolean eof() {
-        return atEof;
-    }
-
-    /**
-     * @return peeks at the next byte in the stream and returns true if it is CR or LF.  Returns false if EOF or
-     * next byte is not CR or LF.
-     */
-    public boolean atEoln() {
-        return ensureBufferNotEmpty() && (fileBuffer[nextByte] == '\n' || fileBuffer[nextByte] == '\r');
-    }
-
-    /**
-     * Advance over any EOLN chars (CR or LF)
-     * @return true if saw one or more CR or LFs
-     */
-    public boolean skipNewlines() {
-        boolean sawEoln = false;
-        while (atEoln()) {
-            sawEoln = true;
-            ++nextByte;
-        }
-        return sawEoln;
-    }
-
-    public void close() {
-        CloserUtil.close(in);
-        in = null;
-        fileBuffer = null;
-    }
-
-    /**
-     * @return Next byte from the input.  Do not call if at EOF.
-     */
-    public byte getByte() {
-        final byte ret = peekByte(); 
-        ++nextByte;
-        ensureBufferNotEmpty();
-        return ret;
-    }
-
-    /**
-     * @return Next byte from the input, without advancing over that byte.  Do not call if at EOF.
-     */
-    public byte peekByte() {
-        if (eof()) {
-            throw new IllegalStateException("Cannot getByte() if EOF.");
-        }
-        return fileBuffer[nextByte];
-    }
-
-    /**
-     * Read from input until input is exhausted, EOLN is seen, or output buffer is filled
-     * @param outputBuffer where to put bytes read
-     * @param startOutputIndex where to start putting bytes read
-     * @return number of bytes read
-     */
-    public int readToEndOfOutputBufferOrEoln(final byte[] outputBuffer, final int startOutputIndex) {
-        boolean sawNewline;
-        int totalGrabbed = 0;
-        do {
-            if (!ensureBufferNotEmpty()) {
-                break;
-            }
-            final int startInputIndex = nextByte;
-            sawNewline = advanceToEobOrEoln();
-            int lengthOfChunk = nextByte - startInputIndex;
-
-            // Roll back if went past the amount that can be stored in the output buffer.
-            // Assumption is that lines are relatively short so this won't happen very often.
-            if (lengthOfChunk > outputBuffer.length - (startOutputIndex + totalGrabbed)) {
-                lengthOfChunk = outputBuffer.length - (startOutputIndex + totalGrabbed);
-                nextByte = startInputIndex + lengthOfChunk;
-            }
-            System.arraycopy(fileBuffer, startInputIndex, outputBuffer, startOutputIndex + totalGrabbed, lengthOfChunk);
-            totalGrabbed += lengthOfChunk;
-        } while (!sawNewline && totalGrabbed < outputBuffer.length - startOutputIndex);
-        ensureBufferNotEmpty();
-        return totalGrabbed;
-    }
-
-    /**
-     * Advance nextByte to end of currently-buffered input or to line terminator
-     * @return true if saw a line terminator
-     */
-    private boolean advanceToEobOrEoln() {
-        while (nextByte < numBytes) {
-            if (atEoln()) {
-                return true;
-            }
-            ++nextByte;
-        }
-        return false;
-    }
-
-    /**
-     * Ensure that fileBuffer has at least one byte available in it.  Potentially wipes out
-     * what is in fileBuffer so everything from fileBuffer[0..nextByte] should already have been pulled out.
-     * @return false if EOF, else true
-     */
-    private boolean ensureBufferNotEmpty() {
-        try {
-            if (nextByte < numBytes) {
-                return true;
-            }
-            nextByte = 0;
-            numBytes = in.read(fileBuffer);
-            atEof = (numBytes < 1);
-            return !atEof;
-        } catch (IOException e) {
-            throw new SAMException("Exception reading InputStream", e);
-        }
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/FastqQualityFormat.java b/src/main/java/htsjdk/samtools/util/FastqQualityFormat.java
deleted file mode 100644
index b7a7bfb..0000000
--- a/src/main/java/htsjdk/samtools/util/FastqQualityFormat.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Enumeration for FastQ quality score formats formats.
- */
-public enum FastqQualityFormat {
-    /** Early Solexa/Illumina (pre pipeline 1.3) style scores  which encode Solexa qualities using an ASCII offset of 64 */
-    Solexa,
-    /** Recent Solexa/Illumina (pipeline 1.3+) style scores which encode PHRED qualities using an ASCII offset of 64 */
-    Illumina,
-    /** Sanger style FASTQ files which encode PHRED qualities using an ASCII offset of 33 */
-    Standard
-}
diff --git a/src/main/java/htsjdk/samtools/util/FileAppendStreamLRUCache.java b/src/main/java/htsjdk/samtools/util/FileAppendStreamLRUCache.java
deleted file mode 100644
index bc8bc01..0000000
--- a/src/main/java/htsjdk/samtools/util/FileAppendStreamLRUCache.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * LRU cache of OutputStreams to handle situation in which it is necessary to have more FileOutputStreams
- * than resource limits will allow.  Least-recently-used FileOutputStream is closed when it is pushed out of
- * the cache.  When adding a new element to the cache, the file is opened in append mode.
- *
- * Actual elements in the cache are usually BufferedOutputStreams wrapping the FileOutputStreams, but will
- * be FileOutputStreams if Defaults.BUFFER_SIZE = 0.
- *
- * @author alecw at broadinstitute.org
- */
-public class FileAppendStreamLRUCache extends ResourceLimitedMap<File, OutputStream> {
-    public FileAppendStreamLRUCache(final int cacheSize) {
-        super(cacheSize, new Functor());
-    }
-
-    private static class Functor implements ResourceLimitedMapFunctor<File, OutputStream> {
-        public OutputStream makeValue(final File file) {
-            try {
-                return IOUtil.maybeBufferOutputStream(new FileOutputStream(file, true));
-            }
-            catch (final FileNotFoundException e) {
-                // In case the file could not be opened because of too many file handles, try to force
-                // file handles to be closed.
-                System.gc();
-                System.runFinalization();
-                try {
-                    return IOUtil.maybeBufferOutputStream(new FileOutputStream(file, true));
-                }
-                catch (final FileNotFoundException e2) {
-                    throw new SAMException(file + "not found", e2);
-                }
-            }
-        }
-
-        public void finalizeValue(final File file, final OutputStream out) {
-            try {
-                out.flush();
-                out.close();
-            }
-            catch (final IOException e) {
-                throw new SAMException("Exception closing FileOutputStream for " + file, e);
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/FormatUtil.java b/src/main/java/htsjdk/samtools/util/FormatUtil.java
deleted file mode 100644
index a80c240..0000000
--- a/src/main/java/htsjdk/samtools/util/FormatUtil.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.File;
-import java.math.RoundingMode;
-import java.security.InvalidParameterException;
-import java.text.DateFormat;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * Simple class used to format object values into a standard format for printing.
- *
- * @author Tim Fennell
- */
-public class FormatUtil {
-    public static final int DECIMAL_DIGITS_TO_PRINT = 6;
-    private final DateFormat dateFormat;
-    private final NumberFormat integerFormat;
-    private final NumberFormat floatFormat;
-
-    /** Constructs a new FormatUtil and initializes various internal formatters. 
-    * This is necessary because SimpleDateFormat and other formatters are not threadsafe.
-    */
-    public FormatUtil() {
-        this.dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-
-        this.integerFormat = NumberFormat.getIntegerInstance();
-        this.integerFormat.setGroupingUsed(false);
-
-        this.floatFormat = NumberFormat.getNumberInstance();
-        this.floatFormat.setGroupingUsed(false);
-        this.floatFormat.setMaximumFractionDigits(DECIMAL_DIGITS_TO_PRINT);
-        this.floatFormat.setRoundingMode(RoundingMode.HALF_DOWN);
-        if (this.floatFormat instanceof DecimalFormat) {
-            final DecimalFormat decimalFormat = (DecimalFormat)this.floatFormat;
-            final DecimalFormatSymbols decimalFormatSymbols = decimalFormat.getDecimalFormatSymbols();
-            decimalFormatSymbols.setNaN("?");
-            decimalFormatSymbols.setInfinity("?");
-            decimalFormat.setDecimalFormatSymbols(decimalFormatSymbols);
-        }
-    }
-
-    /** Formats a short to an integer string. */
-    public String format(short value) { return this.integerFormat.format(value); }
-
-    /** Formats an int to an integer string. */
-    public String format(int value) { return this.integerFormat.format(value); }
-
-    /** Formats a long to an integer string. */
-    public String format(long value) { return this.integerFormat.format(value); }
-
-    /** Formats a float to a floating point string. */
-    public String format(float value) {return this.floatFormat.format(value); }
-
-    /** Formats a double to a floating point string. */
-    public String format(double value) {return this.floatFormat.format(value); }
-
-    /** Formats a char as a string. */
-    public String format(char value) { return Character.toString(value); }
-
-    /** Formats an enum to the String representation of an enum. */
-    public String format(Enum value) { return value.name(); }
-
-    /** Formats a date to a date string without time. */
-    public String format(Date value) { return this.dateFormat.format(value); }
-
-    /** Formats date & time */
-    public String format(final Iso8601Date value) { return value.toString(); }
-
-    /** Formats a boolean value to a String. */
-    public String format(boolean value) { if (value) return "Y"; else return "N"; }
-
-    /** Attempts to determine the type of value and format it appropriately. */
-    public String format(Object value) {
-        if (value == null) return "";
-        if (value instanceof Short)       return format( ((Short) value).shortValue() );
-        if (value instanceof Integer)     return format( ((Integer) value).intValue() );
-        if (value instanceof Long)        return format( ((Long) value).longValue() );
-        if (value instanceof Float)       return format( ((Float) value).floatValue() );
-        if (value instanceof Double)      return format( ((Double) value).doubleValue() );
-        if (value instanceof Enum)        return format( ((Enum) value) );
-        if (value instanceof Iso8601Date) return format((Iso8601Date)value);
-        if (value instanceof Date)        return format( ((Date) value) );
-        if (value instanceof Boolean)     return format( ((Boolean) value).booleanValue() );
-        if (value instanceof Character)   return format( ((Character)value).charValue() );
-        return value.toString();
-    }
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Parsing methods
-    ///////////////////////////////////////////////////////////////////////////
-
-    /** Parses a String into a short. */
-    public short parseShort(String value) { return Short.parseShort(value); }
-
-    /** Parses a String into an int. */
-    public int parseInt(String value) { return Integer.parseInt(value); }
-
-    /** Parses a String into a long. */
-    public long parseLong(String value) { return Long.parseLong(value); }
-
-    /** Parses a String into a float. */
-    public float parseFloat(String value) {
-        if ("?".equals(value) || "-?".equals(value)) return Float.NaN;
-        else return Float.parseFloat(value);
-    }
-
-    /** Parses a String into a double. */
-    public double parseDouble(String value) {
-        if ("?".equals(value) || "-?".equals(value)) return Double.NaN;        
-        else return Double.parseDouble(value);
-    }
-
-    /** Parses a String into an Enum of the given type. */
-    public <E extends Enum> E parseEnum(String value, Class<E> type) { return (E) Enum.valueOf(type, value); }
-
-    /** Parses a String into a date. */
-    public Date parseDate(String value) {
-        try {
-            return this.dateFormat.parse(value);
-        }
-        catch (ParseException pe) {
-            throw new SAMException("Could not parse value as date: " + value, pe);
-        }
-    }
-
-    /** Parse a String into an Iso8601 Date */
-    public Iso8601Date parseIso8601Date(String value) { return new Iso8601Date(value); }
-
-    /** Parses a String into a boolean, as per the above convention that true = Y and false = N. */
-    public boolean parseBoolean(String value) {
-        if (value == null || value.isEmpty()) return false;
-        char ch = Character.toUpperCase(value.charAt(0));
-        return (ch == 'Y');
-    }
-
-    /** Parses a String into a char. We expect the String to have a length of exactly one, otherwise throw an exception. */
-    public char parseChar(String value) {
-        if (value == null) {
-            throw new SAMException("Cannot parse null string into char");
-        } else if (value.length() != 1) {
-            throw new SAMException("Cannot parse string into char because length != 1 : " + value);
-        } else {
-            return value.charAt(0);
-        }
-    }
-
-    /**
-     * Attempts to determine the correct parse method to call based on the desired
-     * return type and then parses the String and returns the value.
-     *
-     * @param value the String value to be parsed
-     * @param returnType the desired return type
-     * @return an object of the returnType
-     */
-    public Object parseObject(String value, Class<?> returnType) {
-        if (returnType == Short.class     || returnType == Short.TYPE)     return parseShort(value);
-        if (returnType == Integer.class   || returnType == Integer.TYPE)   return parseInt(value);
-        if (returnType == Long.class      || returnType == Long.TYPE)      return parseLong(value);
-        if (returnType == Float.class     || returnType == Float.TYPE)     return parseFloat(value);
-        if (returnType == Double.class    || returnType == Double.TYPE)    return parseDouble(value);
-        if (returnType == Boolean.class   || returnType == Boolean.TYPE)   return parseBoolean(value);
-        if (returnType == Byte.class      || returnType == Byte.TYPE)      return parseInt(value);
-        if (returnType == Character.class || returnType == Character.TYPE) return parseChar(value);
-        if (returnType == Iso8601Date.class)                               return parseIso8601Date(value);
-        if (returnType == Date.class)                                      return parseDate(value);
-        if (returnType == File.class)                                      return new File(value);
-        if (Enum.class.isAssignableFrom(returnType)) return parseEnum(value, (Class<? extends Enum>)returnType);
-        if (returnType == String.class) return value;
-
-        throw new InvalidParameterException("Don't know how to convert a String to a " + returnType.getName());
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Histogram.java b/src/main/java/htsjdk/samtools/util/Histogram.java
deleted file mode 100644
index 19cbc1d..0000000
--- a/src/main/java/htsjdk/samtools/util/Histogram.java
+++ /dev/null
@@ -1,567 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import java.io.Serializable;
-import java.util.*;
-
-import static java.lang.Math.*;
-
-/**
- * Class for computing and accessing histogram type data.  Stored internally in
- * a sorted Map so that keys can be iterated in order.
- *
- * @author Tim Fennell
- */
-public final class Histogram<K extends Comparable> implements Serializable {
-    private static final long serialVersionUID = 1L;
-    private String binLabel   = "BIN";
-    private String valueLabel = "VALUE";
-    private final NavigableMap<K, Bin<K>> map;
-
-    /** Constructs a new Histogram with default bin and value labels. */
-    public Histogram() {
-        this.map = new TreeMap<>();
-    }
-
-    /** Constructs a new Histogram with supplied bin and value labels. */
-    public Histogram(final String binLabel, final String valueLabel) {
-        this();
-        this.binLabel = binLabel;
-        this.valueLabel = valueLabel;
-    }
-
-    /** Constructs a new Histogram that'll use the supplied comparator to sort keys. */
-    public Histogram(final Comparator<? super K> comparator) {
-        this.map = new TreeMap<>(comparator);
-    }
-
-    /** Constructor that takes labels for the bin and values and a comparator to sort the bins. */
-    public Histogram(final String binLabel, final String valueLabel, final Comparator<? super K> comparator) {
-        this(comparator);
-        this.binLabel = binLabel;
-        this.valueLabel = valueLabel;
-    }
-
-    /** Copy constructor for a histogram. */
-    public Histogram(final Histogram<K> in) {
-        this.map = new TreeMap<>(in.map);
-        this.binLabel = in.binLabel;
-        this.valueLabel = in.valueLabel;
-    }
-
-    /** Represents a bin in the Histogram. */
-    public static class Bin<K extends Comparable> implements Serializable {
-        private static final long serialVersionUID = 1L;
-        private final K id;
-        private double value = 0;
-
-        /** Constructs a new bin with the given ID. */
-        private Bin(final K id) { this.id = id; }
-
-        /** Gets the ID of this bin. */
-        public K getId() { return id; }
-
-        /** Gets the value in the bin. */
-        public double getValue() { return value; }
-
-        /** Returns the String format for the value in the bin. */
-        @Override
-        public String toString() { return String.valueOf(this.value); }
-
-        /** Checks the equality of the bin by ID and value. */
-        @Override
-        public boolean equals(final Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-
-            final Bin<K> bin = (Bin<K>) o;
-
-            if (Double.compare(bin.value, value) != 0) return false;
-            if (!id.equals(bin.id)) return false;
-
-            return true;
-        }
-
-        @Override
-        public int hashCode() {
-            int result;
-            final long temp;
-            result = id.hashCode();
-            temp = value != +0.0d ? Double.doubleToLongBits(value) : 0L;
-            result = 31 * result + (int) (temp ^ (temp >>> 32));
-            return result;
-        }
-
-        public double getIdValue() {
-            if (id instanceof Number) {
-                return ((Number) id).doubleValue();
-            } else {
-                throw new UnsupportedOperationException("getIdValue only supported for Histogram<? extends Number>");
-            }
-        }
-    }
-
-    /** Prefill the histogram with the supplied set of bins. */
-    public void prefillBins(final K... ids) {
-        for (final K id : ids) {
-            map.put(id, new Bin<>(id));
-        }
-    }
-
-    /** Increments the value in the designated bin by 1. */
-    public void increment(final K id) {
-        increment(id, 1d);
-    }
-
-    /** Increments the value in the designated bin by the supplied increment. */
-    public void increment(final K id, final double increment) {
-        Bin<K> bin = map.get(id);
-        if (bin == null) {
-            bin = new Bin<>(id);
-            map.put(id, bin);
-        }
-
-        bin.value += increment;
-    }
-
-    public String getBinLabel() { return binLabel; }
-    public void setBinLabel(final String binLabel) { this.binLabel = binLabel; }
-
-    public String getValueLabel() { return valueLabel; }
-    public void setValueLabel(final String valueLabel) { this.valueLabel = valueLabel; }
-
-    /** Checks that the labels and values in the two histograms are identical. */
-    @Override
-    public boolean equals(final Object o) {
-        if (o == this) {
-            return true;
-        }
-        return o != null &&
-                (o instanceof Histogram) &&
-                ((Histogram) o).binLabel.equals(this.binLabel) &&
-                ((Histogram) o).valueLabel.equals(this.valueLabel) &&
-                ((Histogram) o).map.equals(this.map);
-    }
-
-    @Override
-    public String toString() {
-        return map.toString();
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(binLabel, valueLabel, map);
-    }
-
-    /**
-     * Assuming that the key type for the histogram is a Number type, returns the mean of
-     * all the items added to the histogram.
-     */
-    public double getMean() {
-        // Could use simply getSum() / getCount(), but that would require iterating over the
-        // values() set twice, which seems inefficient given how simply the computation is.
-        double product=0, totalCount=0;
-        for (final Bin<K> bin : map.values()) {
-            final double idValue = bin.getIdValue();
-            final double count   = bin.getValue();
-
-            product += idValue * count;
-            totalCount += count;
-        }
-
-        return product / totalCount;
-    }
-
-    /**
-     * Returns the sum of the products of the histgram bin ids and the number of entries in each bin.
-     * Note: This is only supported if this histogram stores instances of Number.
-     */
-    public double getSum() {
-        double total = 0;
-        for (final Bin<K> bin : map.values()) {
-            total += bin.getValue() * bin.getIdValue();
-        }
-
-        return total;
-    }
-
-    /**
-     * Returns the sum of the number of entries in each bin.
-     */
-    public double getSumOfValues() {
-        double total = 0;
-        for (final Bin<K> bin : map.values()) {
-            total += bin.getValue();
-        }
-
-        return total;
-    }
-
-    public double getStandardDeviation() {
-        final double mean = getMean();
-
-        double count = 0;
-        double total = 0;
-
-        for (final Bin<K> bin : map.values()) {
-            final double localCount = bin.getValue();
-            final double value = bin.getIdValue();
-
-            count += localCount;
-            total += localCount * pow(value - mean, 2);
-        }
-
-        return Math.sqrt(total / (count-1));
-    }
-
-    /**
-     * Calculates the mean bin size
-     */
-    public double getMeanBinSize() {
-        return (getSumOfValues() / size());
-    }
-
-    /**
-     * Returns the size of this histogram.
-     */
-    public int size() {
-        return map.size();
-    }
-
-    /**
-     * Returns the comparator used to order the keys in this histogram, or
-     * {@code null} if this histogram uses the {@linkplain Comparable
-     * natural ordering} of its keys.
-     *
-     * @return the comparator used to order the keys in this histogram,
-     *         or {@code null} if this histogram uses the natural ordering
-     *         of its keys
-     */
-    public Comparator<? super K> comparator() {
-        return map.comparator();
-    }
-
-    /**
-	 * Calculates the median bin size
-	 */
-	public double getMedianBinSize() {
-		if (size() == 0) {
-			return 0;
-		}
-
-		final List<Double> binValues = new ArrayList<>();
-		for (final Bin<K> bin : values()) {
-			binValues.add(bin.getValue());
-		}
-		Collections.sort(binValues);
-
-		final int midPoint = binValues.size() / 2;
-		double median = binValues.get(midPoint);
-		if (binValues.size() % 2 == 0) {
-			median = (median + binValues.get(midPoint-1)) / 2;
-		}
-
-		return median;
-	}
-
-    /**
-     * Returns a {@link Collection} view of the values contained in this histogram.
-     * The collection's iterator returns the values in ascending order
-     * of the corresponding keys.
-     */
-    public Collection<Bin<K>> values() {
-        return map.values();
-    }
-
-    /**
-     * Calculates the standard deviation of the bin size
-     */
-    public double getStandardDeviationBinSize(final double mean) {
-        double total = 0;
-        for(final Bin<K> bin : values()) {
-            total += Math.pow(bin.getValue() - mean, 2);
-        }
-        return Math.sqrt(total / (Math.max(1,values().size()-1)));
-    }
-
-    /**
-     * Gets the bin in which the given percentile falls.
-     *
-     * @param percentile a value between 0 and 1
-     * @return the bin value in which the percentile falls
-     */
-    public double getPercentile(final double percentile) {
-        if (percentile <= 0) throw new IllegalArgumentException("Cannot query percentiles of 0 or below");
-        if (percentile >= 1) throw new IllegalArgumentException("Cannot query percentiles of 1 or above");
-
-        double total = getCount();
-        double sofar = 0;
-        for (Bin<K> bin : values()) {
-            sofar += bin.getValue();
-            if (sofar / total >= percentile) return bin.getIdValue();
-        }
-
-        throw new IllegalStateException("Could not find percentile: " + percentile);
-    }
-
-    /**
-     * Returns the cumulative probability of observing a value <= v when sampling the
-     * distribution represented by this histogram.
-     * @throws UnsupportedOperationException if this histogram does not store instances of Number
-     */
-    public double getCumulativeProbability(final double v) {
-        double count = 0;
-        double total = 0;
-
-        for (final Bin<K> bin : values()) {
-            final double binValue = bin.getIdValue();
-            if (binValue <= v) count += bin.getValue();
-            total += bin.getValue();
-        }
-
-        return count / total;
-    }
-
-    public double getMedian() {
-        double total = 0;
-        double count = getCount();
-
-        // Base cases
-        if (count == 0) return 0;
-        if (count == 1) return values().iterator().next().getIdValue();
-
-        final double midLow, midHigh;
-        if (count % 2 == 0) {
-            midLow = count / 2;
-            midHigh = midLow + 1;
-        }
-        else {
-            midLow = Math.ceil(count / 2);
-            midHigh = midLow;
-        }
-
-        Double midLowValue  = null;
-        Double midHighValue = null;
-        for (final Bin<K> bin : values()) {
-            total += bin.getValue();
-            if (midLowValue  == null && total >= midLow)  midLowValue  = bin.getIdValue();
-            if (midHighValue == null && total >= midHigh) midHighValue = bin.getIdValue();
-            if (midLowValue != null && midHighValue != null) break;
-        }
-
-        return (midLowValue + midHighValue) / 2;
-    }
-
-    /** Gets the median absolute deviation of the distribution. */
-    public double getMedianAbsoluteDeviation() {
-        final double median = getMedian();
-        final Histogram<Double> deviations = new Histogram<>();
-        for (final Bin<K> bin : values()) {
-            final double dev = abs(bin.getIdValue() - median);
-            deviations.increment(dev, bin.getValue());
-        }
-
-        return deviations.getMedian();
-    }
-
-    /**
-     * Returns a value that is intended to estimate the mean of the distribution, if the distribution is
-     * essentially normal, by using the median absolute deviation to remove the effect of
-     * erroneous massive outliers.
-     */
-    public double estimateSdViaMad() {
-        return 1.4826 * getMedianAbsoluteDeviation();
-    }
-
-    /** Returns id of the Bin that's the mode of the distribution (i.e. the largest bin).
-     * @throws UnsupportedOperationException if this histogram does not store instances of Number
-     */
-    public double getMode() {
-        return getModeBin().getIdValue();
-    }
-
-    /** Returns the Bin that's the mode of the distribution (i.e. the largest bin). */
-    private Bin<K> getModeBin() {
-        Bin<K> modeBin = null;
-
-        for (final Bin<K> bin : values()) {
-            if (modeBin == null || modeBin.value < bin.value) {
-                modeBin = bin;
-            }
-        }
-
-        return modeBin;
-    }
-
-
-    /**
-     * Returns the key with the lowest count.
-     * @throws UnsupportedOperationException if this histogram does not store instances of Number
-     */
-    public double getMin() {
-        return map.firstEntry().getValue().getIdValue();
-    }
-
-    /**
-     * Returns the key with the highest count.
-     * @throws UnsupportedOperationException if this histogram does not store instances of Number
-     */
-    public double getMax() {
-        return map.lastEntry().getValue().getIdValue();
-    }
-
-    public double getCount() {
-        double count = 0;
-        for (final Bin<K> bin : values()) {
-            count += bin.value;
-        }
-
-        return count;
-    }
-
-    /** Gets the geometric mean of the distribution. */
-    public double getGeometricMean() {
-        double total = 0;
-        double count = 0;
-        for (final Bin<K> bin : values()) {
-            total += bin.value * log(bin.getIdValue());
-            count += bin.value;
-        }
-
-        return exp(total / count);
-    }
-
-    /**
-     * Trims the histogram when the bins in the tail of the distribution contain fewer than mode/tailLimit items
-     */
-    public void trimByTailLimit(final int tailLimit) {
-        if (isEmpty()) {
-            return;
-        }
-
-        final Bin<K> modeBin = getModeBin();
-        final double mode = modeBin.getIdValue();
-        final double sizeOfModeBin = modeBin.getValue();
-        final double minimumBinSize = sizeOfModeBin/tailLimit;
-        Bin<K> lastBin = null;
-
-        final List<K> binsToKeep = new ArrayList<>();
-        for (Bin<K> bin : values()) {
-            double binId = ((Number)bin.getId()).doubleValue();
-
-            if (binId <= mode) {
-                binsToKeep.add(bin.getId());
-            }
-            else if ((lastBin != null && ((Number)lastBin.getId()).doubleValue() != binId - 1) || bin.getValue() < minimumBinSize) {
-                break;
-            }
-            else {
-                binsToKeep.add(bin.getId());
-            }
-            lastBin = bin;
-        }
-
-        final Object keys[] = keySet().toArray();
-        for (Object binId : keys) {
-            if (!binsToKeep.contains(binId)) {
-                remove(binId);
-            }
-        }
-    }
-
-    private Bin<K> remove(final Object key) {
-        return map.remove(key);
-    }
-
-    /**
-     * Returns true if this histogram has no data in in, false otherwise.
-     */
-    public boolean isEmpty() {
-        return map.isEmpty();
-    }
-
-    /**
-     * Trims the histogram so that only bins <= width are kept.
-     */
-    public void trimByWidth(final int width) {
-        final Iterator<K> it = map.descendingKeySet().iterator();
-        while (it.hasNext()) {
-
-            if (((Number)it.next()).doubleValue() > width) {
-                it.remove();
-            } else break;
-        }
-    }
-
-    /***
-     * Immutable method that divides the current Histogram by an input Histogram and generates a new one
-     * Throws an exception if the bins don't match up exactly
-     * @param divisorHistogram
-     * @return
-     * @throws IllegalArgumentException if the keySet of this histogram is not equal to the keySet of the given divisorHistogram
-     */
-    public Histogram<K> divideByHistogram(final Histogram<K> divisorHistogram) {
-        final Histogram<K> output = new Histogram<K>();
-        if (!this.keySet().equals(divisorHistogram.keySet())) throw new IllegalArgumentException("Attempting to divide Histograms with non-identical bins");
-        for (final K key : this.keySet()){
-            final Bin<K> dividend = this.get(key);
-            final Bin<K> divisor = divisorHistogram.get(key);
-            output.increment(key, dividend.getValue()/divisor.getValue());
-        }
-        return output;
-    }
-
-    /***
-     * Mutable method that allows the addition of a Histogram into the current one.
-     * @param addHistogram
-     */
-    public void addHistogram(final Histogram<K> addHistogram) {
-        for (final K key : addHistogram.keySet()){
-            this.increment(key, addHistogram.get(key).getValue());
-        }
-    }
-
-    /**
-     * Retrieves the bin associated with the given key.
-     */
-    public Bin<K> get(final K key) {
-        return map.get(key);
-    }
-
-    /**
-     * Returns the set of keys for this histogram.
-     */
-    public Set<K> keySet() {
-        return map.keySet();
-    }
-
-    /**
-     * Return whether this histogram contains the given key.
-     */
-    public boolean containsKey(final K key){
-        return map.containsKey(key);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/HttpUtils.java b/src/main/java/htsjdk/samtools/util/HttpUtils.java
deleted file mode 100644
index 49ec560..0000000
--- a/src/main/java/htsjdk/samtools/util/HttpUtils.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-
-/**
- * User: jrobinso
- * Date: Sep 23, 2009
- */
-public class HttpUtils {
-
-    public static String getETag(final URL url) {
-        return getHeaderField(url, "ETag");
-    }
-
-    private static URLConnection openConnection(final URL url) throws IOException{
-        URLConnection conn = url.openConnection();
-        conn.setReadTimeout(3000);
-        conn.setDefaultUseCaches(false);
-        conn.setUseCaches(false);
-        return conn;
-    }
-
-    public static String getHeaderField(final URL url, final String name) {
-        URLConnection conn = null;
-        try {
-            // Create a URLConnection object for a URL
-            conn = openConnection(url);
-            return conn.getHeaderField(name);
-
-        } catch (IOException e) {
-            e.printStackTrace();
-            return null;
-        }
-        finally {
-            if (conn != null && conn instanceof HttpURLConnection) {
-                ((HttpURLConnection) conn).disconnect();
-            }
-        }
-    }
-
-    public static void printHeaderFields(final URL url) {
-
-        URLConnection conn = null;
-        try {
-            // Create a URLConnection object for a URL
-            conn = openConnection(url);
-
-            for (final String name : conn.getHeaderFields().keySet()) {
-                System.out.println(name + "\t" + conn.getHeaderField(name));
-
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        finally {
-            if (conn != null && conn instanceof HttpURLConnection) {
-                ((HttpURLConnection) conn).disconnect();
-            }
-        }
-    }
-
-    public static boolean resourceAvailable(final URL url) {
-        return getETag(url) != null;
-    }
-
-    public static void main(final String[] args) throws MalformedURLException {
-        //printHeaderFields(new URL(
-        //        "http://www.broadinstitute.org/igvdata/1KG/DCC_merged/freeze5/NA12891.pilot2.SLX.bam"));
-        System.out.println(getETag(new URL(
-                 "http://www.broadinstitute.org/igvdata/test/sam/303KY.8.paired1.bam.tdf")));
-        System.out.println(resourceAvailable(new URL(
-                "http://www.broadinstitute.org/igvdata/test/sam/303KY.8.paired1.bam.tdf")));
-
-
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IOUtil.java b/src/main/java/htsjdk/samtools/util/IOUtil.java
deleted file mode 100644
index 07ae900..0000000
--- a/src/main/java/htsjdk/samtools/util/IOUtil.java
+++ /dev/null
@@ -1,946 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.seekablestream.SeekableBufferedStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableHTTPStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Scanner;
-import java.util.Stack;
-import java.util.regex.Pattern;
-import java.util.zip.Deflater;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.GZIPOutputStream;
-
-/**
- * Miscellaneous stateless static IO-oriented methods.
- *  Also used for utility methods that wrap or aggregate functionality in Java IO.
- */
-public class IOUtil {
-    /**
-     * @deprecated Use {@link Defaults#NON_ZERO_BUFFER_SIZE} instead.
-     */
-    @Deprecated
-    public static final int STANDARD_BUFFER_SIZE = Defaults.NON_ZERO_BUFFER_SIZE;
-
-    public static final long ONE_GB = 1024 * 1024 * 1024;
-    public static final long TWO_GBS = 2 * ONE_GB;
-    public static final long FIVE_GBS = 5 * ONE_GB;
-
-    /** Possible extensions for VCF files and related formats. */
-    public static final String[] VCF_EXTENSIONS = new String[] {".vcf", ".vcf.gz", ".bcf"};
-
-    public static final String INTERVAL_LIST_FILE_EXTENSION = IntervalList.INTERVAL_LIST_FILE_EXTENSION;
-
-    public static final String SAM_FILE_EXTENSION = ".sam";
-
-    public static final String DICT_FILE_EXTENSION = ".dict";
-
-    private static int compressionLevel = Defaults.COMPRESSION_LEVEL;
-
-    /**
-     * Sets the GZip compression level for subsequent GZIPOutputStream object creation.
-     * @param compressionLevel 0 <= compressionLevel <= 9
-     */
-    public static void setCompressionLevel(final int compressionLevel) {
-        if (compressionLevel < Deflater.NO_COMPRESSION || compressionLevel > Deflater.BEST_COMPRESSION) {
-            throw new IllegalArgumentException("Invalid compression level: " + compressionLevel);
-        }
-        IOUtil.compressionLevel = compressionLevel;
-    }
-
-    public static int getCompressionLevel() {
-        return compressionLevel;
-    }
-
-    /**
-     * Wrap the given stream in a BufferedInputStream, if it isn't already wrapper
-     *
-     * @param stream stream to be wrapped
-     * @return A BufferedInputStream wrapping stream, or stream itself if stream instanceof BufferedInputStream.
-     */
-    public static BufferedInputStream toBufferedStream(final InputStream stream) {
-        if (stream instanceof BufferedInputStream) {
-            return (BufferedInputStream) stream;
-        } else {
-            return new BufferedInputStream(stream, Defaults.NON_ZERO_BUFFER_SIZE);
-        }
-    }
-
-    /**
-     * Transfers from the input stream to the output stream using stream operations and a buffer.
-     */
-    public static void transferByStream(final InputStream in, final OutputStream out, final long bytes) {
-        final byte[] buffer = new byte[Defaults.NON_ZERO_BUFFER_SIZE];
-        long remaining = bytes;
-
-        try {
-            while (remaining > 0) {
-                final int read = in.read(buffer, 0, (int) Math.min(buffer.length, remaining));
-                out.write(buffer, 0, read);
-                remaining -= read;
-            }
-        }
-        catch (final IOException ioe) {
-            throw new RuntimeIOException(ioe);
-        }
-    }
-
-    /**
-     * @return If Defaults.BUFFER_SIZE > 0, wrap os in BufferedOutputStream, else return os itself.
-     */
-    public static OutputStream maybeBufferOutputStream(final OutputStream os) {
-        return maybeBufferOutputStream(os, Defaults.BUFFER_SIZE);
-    }
-
-    /**
-     * @return If bufferSize > 0, wrap os in BufferedOutputStream, else return os itself.
-     */
-    public static OutputStream maybeBufferOutputStream(final OutputStream os, final int bufferSize) {
-        if (bufferSize > 0) return new BufferedOutputStream(os, bufferSize);
-        else return os;
-    }
-
-    public static SeekableStream maybeBufferedSeekableStream(final SeekableStream stream, final int bufferSize) {
-        return bufferSize > 0 ? new SeekableBufferedStream(stream, bufferSize) : stream; 
-    }
-    
-    public static SeekableStream maybeBufferedSeekableStream(final SeekableStream stream) {
-        return maybeBufferedSeekableStream(stream, Defaults.BUFFER_SIZE);
-    }
-    
-    public static SeekableStream maybeBufferedSeekableStream(final File file) {
-        try {
-            return maybeBufferedSeekableStream(new SeekableFileStream(file));
-        } catch (final FileNotFoundException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    public static SeekableStream maybeBufferedSeekableStream(final URL url) {
-        return maybeBufferedSeekableStream(new SeekableHTTPStream(url));
-    }
-
-    /**
-     * @return If Defaults.BUFFER_SIZE > 0, wrap is in BufferedInputStream, else return is itself.
-     */
-    public static InputStream maybeBufferInputStream(final InputStream is) {
-        return maybeBufferInputStream(is, Defaults.BUFFER_SIZE);
-    }
-
-    /**
-     * @return If bufferSize > 0, wrap is in BufferedInputStream, else return is itself.
-     */
-    public static InputStream maybeBufferInputStream(final InputStream is, final int bufferSize) {
-        if (bufferSize > 0) return new BufferedInputStream(is, bufferSize);
-        else return is;
-    }
-
-    public static Reader maybeBufferReader(Reader reader, final int bufferSize) {
-        if (bufferSize > 0) reader = new BufferedReader(reader, bufferSize);
-        return reader;
-    }
-
-    public static Reader maybeBufferReader(final Reader reader) {
-        return maybeBufferReader(reader, Defaults.BUFFER_SIZE);
-    }
-
-    public static Writer maybeBufferWriter(Writer writer, final int bufferSize) {
-        if (bufferSize > 0) writer = new BufferedWriter(writer, bufferSize);
-        return writer;
-    }
-
-    public static Writer maybeBufferWriter(final Writer writer) {
-        return maybeBufferWriter(writer, Defaults.BUFFER_SIZE);
-    }
-
-
-    /**
-     * Delete a list of files, and write a warning message if one could not be deleted.
-     *
-     * @param files Files to be deleted.
-     */
-    public static void deleteFiles(final File... files) {
-        for (final File f : files) {
-            if (!f.delete()) {
-                System.err.println("Could not delete file " + f);
-            }
-        }
-    }
-
-    public static void deleteFiles(final Iterable<File> files) {
-        for (final File f : files) {
-            if (!f.delete()) {
-                System.err.println("Could not delete file " + f);
-            }
-        }
-    }
-
-
-    /**
-     * @return true if the path is not a device (e.g. /dev/null or /dev/stdin), and is not
-     * an existing directory.  I.e. is is a regular path that may correspond to an existing
-     * file, or a path that could be a regular output file.
-     */
-    public static boolean isRegularPath(final File file) {
-        return !file.exists() || file.isFile();
-    }
-
-    /**
-     * Creates a new tmp file on one of the available temp filesystems, registers it for deletion
-     * on JVM exit and then returns it.
-     */
-    public static File newTempFile(final String prefix, final String suffix,
-                                   final File[] tmpDirs, final long minBytesFree) throws IOException {
-        File f = null;
-
-        for (int i = 0; i < tmpDirs.length; ++i) {
-            if (i == tmpDirs.length - 1 || tmpDirs[i].getUsableSpace() > minBytesFree) {
-                f = File.createTempFile(prefix, suffix, tmpDirs[i]);
-                f.deleteOnExit();
-                break;
-            }
-        }
-
-        return f;
-    }
-
-    /** Creates a new tmp file on one of the potential filesystems that has at least 5GB free. */
-    public static File newTempFile(final String prefix, final String suffix,
-                                   final File[] tmpDirs) throws IOException {
-        return newTempFile(prefix, suffix, tmpDirs, FIVE_GBS);
-    }
-
-
-    /** Returns a default tmp directory. */
-    public static File getDefaultTmpDir() {
-        final String user = System.getProperty("user.name");
-        final String tmp = System.getProperty("java.io.tmpdir");
-
-        if (tmp.endsWith(File.separatorChar + user)) return new File(tmp);
-        else return new File(tmp, user);
-    }
-
-    /** Returns the name of the file minus the extension (i.e. text after the last "." in the filename). */
-    public static String basename(final File f) {
-        final String full = f.getName();
-        final int index = full.lastIndexOf('.');
-        if (index > 0  && index > full.lastIndexOf(File.separator)) {
-            return full.substring(0, index);
-        }
-        else {
-            return full;
-        }
-    }
-    
-    /**
-     * Checks that an input is  is non-null, a URL or a file, exists, 
-     * and if its a file then it is not a directory and is readable.  If any
-     * condition is false then a runtime exception is thrown.
-     *
-     * @param input the input to check for validity
-     */
-    public static void assertInputIsValid(final String input) {
-      if (input == null) {
-        throw new IllegalArgumentException("Cannot check validity of null input.");
-      }
-      if (!isUrl(input)) {
-        assertFileIsReadable(new File(input));
-      }
-    }
-    
-    /** 
-     * Returns true iff the string is a url. 
-     * Helps distinguish url inputs form file path inputs.
-     */
-    public static boolean isUrl(final String input) {
-      try {
-        new URL(input);
-        return true;
-      } catch (MalformedURLException e) {
-        return false;
-      }
-    }
-
-    /**
-     * Checks that a file is non-null, exists, is not a directory and is readable.  If any
-     * condition is false then a runtime exception is thrown.
-     *
-     * @param file the file to check for readability
-     */
-    public static void assertFileIsReadable(final File file) {
-        assertFileIsReadable(file == null ? null : file.toPath());
-    }
-
-    /**
-     * Checks that a file is non-null, exists, is not a directory and is readable.  If any
-     * condition is false then a runtime exception is thrown.
-     *
-     * @param path the file to check for readability
-     */
-    public static void assertFileIsReadable(final Path path) {
-        if (path == null) {
-            throw new IllegalArgumentException("Cannot check readability of null file.");
-        } else if (!Files.exists(path)) {
-            throw new SAMException("Cannot read non-existent file: " + path.toAbsolutePath());
-        }
-        else if (Files.isDirectory(path)) {
-            throw new SAMException("Cannot read file because it is a directory: " + path.toAbsolutePath());
-        }
-        else if (!Files.isReadable(path)) {
-            throw new SAMException("File exists but is not readable: " + path.toAbsolutePath());
-        }
-    }
-
-    /**
-     * Checks that each file is non-null, exists, is not a directory and is readable.  If any
-     * condition is false then a runtime exception is thrown.
-     *
-     * @param files the list of files to check for readability
-     */
-    public static void assertFilesAreReadable(final List<File> files) {
-        for (final File file : files) assertFileIsReadable(file);
-    }
-    
-    /**
-     * Checks that each string is non-null, exists or is a URL, 
-     * and if it is a file then not a directory and is readable.  If any
-     * condition is false then a runtime exception is thrown.
-     *
-     * @param files the list of files to check for readability
-     */
-    public static void assertInputsAreValid(final List<String> inputs) {
-        for (final String input : inputs) assertInputIsValid(input);
-    }
-
-    /**
-     * Checks that a file is non-null, and is either extent and writable, or non-existent but
-     * that the parent directory exists and is writable. If any
-     * condition is false then a runtime exception is thrown.
-     *
-     * @param file the file to check for writability
-     */
-    public static void assertFileIsWritable(final File file) {
-        if (file == null) {
-			throw new IllegalArgumentException("Cannot check readability of null file.");
-		} else if (!file.exists()) {
-            // If the file doesn't exist, check that it's parent directory does and is writable
-            final File parent = file.getAbsoluteFile().getParentFile();
-            if (!parent.exists()) {
-                throw new SAMException("Cannot write file: " + file.getAbsolutePath() + ". " +
-                        "Neither file nor parent directory exist.");
-            }
-            else if (!parent.isDirectory()) {
-                throw new SAMException("Cannot write file: " + file.getAbsolutePath() + ". " +
-                        "File does not exist and parent is not a directory.");
-            }
-            else if (!parent.canWrite()) {
-                throw new SAMException("Cannot write file: " + file.getAbsolutePath() + ". " +
-                        "File does not exist and parent directory is not writable..");
-            }
-        }
-        else if (file.isDirectory()) {
-            throw new SAMException("Cannot write file because it is a directory: " + file.getAbsolutePath());
-        }
-        else if (!file.canWrite()) {
-            throw new SAMException("File exists but is not writable: " + file.getAbsolutePath());
-        }
-    }
-
-    /**
-     * Checks that each file is non-null, and is either extent and writable, or non-existent but
-     * that the parent directory exists and is writable. If any
-     * condition is false then a runtime exception is thrown.
-     *
-     * @param files the list of files to check for writability
-     */
-    public static void assertFilesAreWritable(final List<File> files) {
-        for (final File file : files) assertFileIsWritable(file);
-    }
-
-    /**
-     * Checks that a directory is non-null, extent, writable and a directory
-     * otherwise a runtime exception is thrown.
-     *
-     * @param dir the dir to check for writability
-     */
-    public static void assertDirectoryIsWritable(final File dir) {
-        if (dir == null) {
-            throw new IllegalArgumentException("Cannot check readability of null file.");
-        }
-        else if (!dir.exists()) {
-            throw new SAMException("Directory does not exist: " + dir.getAbsolutePath());
-        }
-        else if (!dir.isDirectory()) {
-            throw new SAMException("Cannot write to directory because it is not a directory: " + dir.getAbsolutePath());
-        }
-        else if (!dir.canWrite()) {
-            throw new SAMException("Directory exists but is not writable: " + dir.getAbsolutePath());
-        }
-    }
-
-    /**
-     * Checks that a directory is non-null, extent, readable and a directory
-     * otherwise a runtime exception is thrown.
-     *
-     * @param dir the dir to check for writability
-     */
-    public static void assertDirectoryIsReadable(final File dir) {
-        if (dir == null) {
-            throw new IllegalArgumentException("Cannot check readability of null file.");
-        }
-        else if (!dir.exists()) {
-            throw new SAMException("Directory does not exist: " + dir.getAbsolutePath());
-        }
-        else if (!dir.isDirectory()) {
-            throw new SAMException("Cannot read from directory because it is not a directory: " + dir.getAbsolutePath());
-        }
-        else if (!dir.canRead()) {
-            throw new SAMException("Directory exists but is not readable: " + dir.getAbsolutePath());
-        }
-    }
-
-    /**
-     * Checks that the two files are the same length, and have the same content, otherwise throws a runtime exception.
-     */
-    public static void assertFilesEqual(final File f1, final File f2) {
-        try {
-            if (f1.length() != f2.length()) {
-                throw new SAMException("Files " + f1 + " and " + f2 + " are different lengths.");
-            }
-            final FileInputStream s1 = new FileInputStream(f1);
-            final FileInputStream s2 = new FileInputStream(f2);
-            final byte[] buf1 = new byte[1024 * 1024];
-            final byte[] buf2 = new byte[1024 * 1024];
-            int len1;
-            while ((len1 = s1.read(buf1)) != -1) {
-                final int len2 = s2.read(buf2);
-                if (len1 != len2) {
-                    throw new SAMException("Unexpected EOF comparing files that are supposed to be the same length.");
-                }
-                if (!Arrays.equals(buf1, buf2)) {
-                    throw new SAMException("Files " + f1 + " and " + f2 + " differ.");
-                }
-            }
-            s1.close();
-            s2.close();
-        } catch (IOException e) {
-            throw new SAMException("Exception comparing files " + f1 + " and " + f2, e);
-        }
-
-    }
-
-    /**
-     * Checks that a file is of non-zero length
-     */
-    public static void assertFileSizeNonZero(final File file) {
-        if (file.length() == 0) {
-            throw new SAMException(file.getAbsolutePath() + " has length 0");
-        }
-    }
-
-    /**
-     * Opens a file for reading, decompressing it if necessary
-     *
-     * @param file  The file to open
-     * @return the input stream to read from
-     */
-    public static InputStream openFileForReading(final File file) {
-        return openFileForReading(file.toPath());
-    }
-
-    /**
-     * Opens a file for reading, decompressing it if necessary
-     *
-     * @param path  The file to open
-     * @return the input stream to read from
-     */
-    public static InputStream openFileForReading(final Path path) {
-
-        try {
-            if (path.getFileName().toString().endsWith(".gz") ||
-                path.getFileName().toString().endsWith(".bfq"))  {
-                return openGzipFileForReading(path);
-            }
-            else {
-                return Files.newInputStream(path);
-            }
-        }
-        catch (IOException ioe) {
-            throw new SAMException("Error opening file: " + path, ioe);
-        }
-
-    }
-
-    /**
-     * Opens a GZIP-encoded file for reading, decompressing it if necessary
-     *
-     * @param file  The file to open
-     * @return the input stream to read from
-     */
-    public static InputStream openGzipFileForReading(final File file) {
-        return openGzipFileForReading(file.toPath());
-    }
-
-    /**
-     * Opens a GZIP-encoded file for reading, decompressing it if necessary
-     *
-     * @param path  The file to open
-     * @return the input stream to read from
-     */
-    public static InputStream openGzipFileForReading(final Path path) {
-
-        try {
-            return new GZIPInputStream(Files.newInputStream(path));
-        }
-        catch (IOException ioe) {
-            throw new SAMException("Error opening file: " + path, ioe);
-        }
-    }
-
-    /**
-     * Opens a file for writing, overwriting the file if it already exists
-     *
-     * @param file  the file to write to
-     * @return the output stream to write to
-     */
-    public static OutputStream openFileForWriting(final File file) {
-        return openFileForWriting(file, false);
-    }
-
-    /**
-     * Opens a file for writing
-     *
-     * @param file  the file to write to
-     * @param append    whether to append to the file if it already exists (we overwrite it if false)
-     * @return the output stream to write to
-     */
-    public static OutputStream openFileForWriting(final File file, final boolean append) {
-
-        try {
-            if (file.getName().endsWith(".gz") ||
-                file.getName().endsWith(".bfq")) {
-                return openGzipFileForWriting(file, append);
-            }
-            else {
-                return new FileOutputStream(file, append);
-            }
-        }
-        catch (IOException ioe) {
-            throw new SAMException("Error opening file for writing: " + file.getName(), ioe);
-        }
-    }
-
-    /**
-     * Preferred over PrintStream and PrintWriter because an exception is thrown on I/O error
-     */
-    public static BufferedWriter openFileForBufferedWriting(final File file, final boolean append) {
-        return new BufferedWriter(new OutputStreamWriter(openFileForWriting(file, append)), Defaults.NON_ZERO_BUFFER_SIZE);
-    }
-
-    /**
-     * Preferred over PrintStream and PrintWriter because an exception is thrown on I/O error
-     */
-    public static BufferedWriter openFileForBufferedWriting(final File file) {
-        return openFileForBufferedWriting(file, false);
-    }
-
-    /**
-     * Preferred over PrintStream and PrintWriter because an exception is thrown on I/O error
-     */
-    public static BufferedWriter openFileForBufferedUtf8Writing(final File file) {
-        return new BufferedWriter(new OutputStreamWriter(openFileForWriting(file), Charset.forName("UTF-8")),
-                Defaults.NON_ZERO_BUFFER_SIZE);
-    }
-
-    /**
-     * Opens a file for reading, decompressing it if necessary
-     *
-     * @param file  The file to open
-     * @return the input stream to read from
-     */
-    public static BufferedReader openFileForBufferedUtf8Reading(final File file) {
-        return new BufferedReader(new InputStreamReader(openFileForReading(file), Charset.forName("UTF-8")));
-    }
-
-    /**
-     * Opens a GZIP encoded file for writing
-     *
-     * @param file  the file to write to
-     * @param append    whether to append to the file if it already exists (we overwrite it if false)
-     * @return the output stream to write to
-     */
-    public static OutputStream openGzipFileForWriting(final File file, final boolean append) {
-
-        try {
-            if (Defaults.BUFFER_SIZE > 0) {
-            return new CustomGzipOutputStream(new FileOutputStream(file, append),
-                                              Defaults.BUFFER_SIZE,
-                                              compressionLevel);
-            } else {
-                return new CustomGzipOutputStream(new FileOutputStream(file, append), compressionLevel);
-            }
-        }
-        catch (IOException ioe) {
-            throw new SAMException("Error opening file for writing: " + file.getName(), ioe);
-        }
-    }
-
-    public static OutputStream openFileForMd5CalculatingWriting(final File file) {
-        return new Md5CalculatingOutputStream(IOUtil.openFileForWriting(file), new File(file.getAbsolutePath() + ".md5"));
-    }
-
-    /**
-     * Utility method to copy the contents of input to output. The caller is responsible for
-     * opening and closing both streams.
-     *
-     * @param input contents to be copied
-     * @param output destination
-     */
-    public static void copyStream(final InputStream input, final OutputStream output) {
-        try {
-            final byte[] buffer = new byte[Defaults.NON_ZERO_BUFFER_SIZE];
-            int bytesRead = 0;
-            while((bytesRead = input.read(buffer)) > 0) {
-                output.write(buffer, 0, bytesRead);
-            }
-        } catch (IOException e) {
-            throw new SAMException("Exception copying stream", e);
-        }
-    }
-
-    /**
-     * Copy input to output, overwriting output if it already exists.
-     */
-    public static void copyFile(final File input, final File output) {
-        try {
-            final InputStream is = new FileInputStream(input);
-            final OutputStream os = new FileOutputStream(output);
-            copyStream(is, os);
-            os.close();
-            is.close();
-        } catch (IOException e) {
-            throw new SAMException("Error copying " + input + " to " + output, e);
-        }
-    }
-
-    /**
-     *
-     * @param directory
-     * @param regexp
-     * @return list of files matching regexp.
-     */
-    public static File[] getFilesMatchingRegexp(final File directory, final String regexp) {
-        final Pattern pattern = Pattern.compile(regexp);
-        return getFilesMatchingRegexp(directory, pattern);
-    }
-
-    public static File[] getFilesMatchingRegexp(final File directory, final Pattern regexp) {
-        return directory.listFiles( new FilenameFilter() {
-            public boolean accept(final File dir, final String name) {
-                return regexp.matcher(name).matches();
-            }
-        });
-    }
-
-    /**
-     * Delete the given file or directory.  If a directory, all enclosing files and subdirs are also deleted.
-     */
-    public static boolean deleteDirectoryTree(final File fileOrDirectory) {
-        boolean success = true;
-
-        if (fileOrDirectory.isDirectory()) {
-            for (final File child : fileOrDirectory.listFiles()) {
-                success = success && deleteDirectoryTree(child);
-            }
-        }
-
-        success = success && fileOrDirectory.delete();
-        return success;
-    }
-
-    /**
-     * Returns the size (in bytes) of the file or directory and all it's children.
-     */
-    public static long sizeOfTree(final File fileOrDirectory) {
-        long total = fileOrDirectory.length();
-        if (fileOrDirectory.isDirectory()) {
-            for (final File f : fileOrDirectory.listFiles()) {
-                total += sizeOfTree(f);
-            }
-        }
-
-        return total;
-    }
-
-    /**
-     *
-     * Copies a directory tree (all subdirectories and files) recursively to a destination
-     */
-    public static void copyDirectoryTree(final File fileOrDirectory, final File destination) {
-        if (fileOrDirectory.isDirectory()) {
-            destination.mkdir();
-            for(final File f : fileOrDirectory.listFiles()) {
-                final File destinationFileOrDirectory =  new File(destination.getPath(),f.getName());
-                if (f.isDirectory()){
-                    copyDirectoryTree(f,destinationFileOrDirectory);
-                }
-                else {
-                    copyFile(f,destinationFileOrDirectory);
-                }
-            }
-        }
-    }
-
-    /**
-     * Create a temporary subdirectory in the default temporary-file directory, using the given prefix and suffix to generate the name.
-     * Note that this method is not completely safe, because it create a temporary file, deletes it, and then creates
-     * a directory with the same name as the file.  Should be good enough.
-     *
-     * @param prefix The prefix string to be used in generating the file's name; must be at least three characters long
-     * @param suffix The suffix string to be used in generating the file's name; may be null, in which case the suffix ".tmp" will be used
-     * @return File object for new directory
-     */
-    public static File createTempDir(final String prefix, final String suffix) {
-        try {
-            final File tmp = File.createTempFile(prefix, suffix);
-            if (!tmp.delete()) {
-                throw new SAMException("Could not delete temporary file " + tmp);
-            }
-            if (!tmp.mkdir()) {
-                throw new SAMException("Could not create temporary directory " + tmp);
-            }
-            return tmp;
-        } catch (IOException e) {
-            throw new SAMException("Exception creating temporary directory.", e);
-        }
-    }
-
-    /** Checks that a file exists and is readable, and then returns a buffered reader for it. */
-    public static BufferedReader openFileForBufferedReading(final File file) {
-        return new BufferedReader(new InputStreamReader(openFileForReading(file)), Defaults.NON_ZERO_BUFFER_SIZE);
-	}
-
-    /** Takes a string and replaces any characters that are not safe for filenames with an underscore */
-    public static String makeFileNameSafe(final String str) {
-        return str.trim().replaceAll("[\\s!\"#$%&'()*/:;<=>?@\\[\\]\\\\^`{|}~]", "_");
-    }
-
-    /** Returns the name of the file extension (i.e. text after the last "." in the filename) including the . */
-    public static String fileSuffix(final File f) {
-        final String full = f.getName();
-        final int index = full.lastIndexOf('.');
-        if (index > 0 && index > full.lastIndexOf(File.separator)) {
-            return full.substring(index);
-        } else {
-            return null;
-        }
-    }
-
-    /** Returns the full path to the file with all symbolic links resolved **/
-    public static String getFullCanonicalPath(final File file) {
-        try {
-            File f = file.getCanonicalFile();
-            String canonicalPath = "";
-            while (f != null  && !f.getName().equals("")) {
-                canonicalPath = "/" + f.getName() + canonicalPath;
-                f = f.getParentFile();
-                if (f != null) f = f.getCanonicalFile();
-            }
-            return canonicalPath;
-        } catch (final IOException ioe) {
-            throw new RuntimeIOException("Error getting full canonical path for " +
-                    file + ": " + ioe.getMessage(), ioe);
-        }
-   }
-
-    /**
-     * Reads everything from an input stream as characters and returns a single String.
-     */
-    public static String readFully(final InputStream in) {
-        try {
-            final BufferedReader r = new BufferedReader(new InputStreamReader(in), Defaults.NON_ZERO_BUFFER_SIZE);
-            final StringBuilder builder = new StringBuilder(512);
-            String line = null;
-
-            while ((line = r.readLine()) != null) {
-                if (builder.length() > 0) builder.append('\n');
-                builder.append(line);
-            }
-
-            return builder.toString();
-        }
-        catch (final IOException ioe) {
-            throw new RuntimeIOException("Error reading stream", ioe);
-        }
-    }
-
-    /**
-     * Returns an iterator over the lines in a text file. The underlying resources are automatically
-     * closed when the iterator hits the end of the input, or manually by calling close().
-     *
-     * @param f a file that is to be read in as text
-     * @return an iterator over the lines in the text file
-     */
-    public static IterableOnceIterator<String> readLines(final File f) {
-        try {
-            final BufferedReader in = IOUtil.openFileForBufferedReading(f);
-
-            return new IterableOnceIterator<String>() {
-                private String next = in.readLine();
-
-                /** Returns true if there is another line to read or false otherwise. */
-                @Override public boolean hasNext() { return next != null; }
-
-                /** Returns the next line in the file or null if there are no more lines. */
-                @Override public String next() {
-                    try {
-                        final String tmp = next;
-                        next = in.readLine();
-                        if (next == null) in.close();
-                        return tmp;
-                    }
-                    catch (final IOException ioe) { throw new RuntimeIOException(ioe); }
-                }
-
-                /** Closes the underlying input stream. Not required if end of stream has already been hit. */
-                @Override public void close() throws IOException { CloserUtil.close(in); }
-            };
-        }
-        catch (final IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    /** Returns all of the untrimmed lines in the provided file. */
-    public static List<String> slurpLines(final File file) throws FileNotFoundException {
-        return slurpLines(new FileInputStream(file));
-    }
-
-    public static List<String> slurpLines(final InputStream is) throws FileNotFoundException {
-        /** See {@link java.util.Scanner} source for origin of delimiter used here.  */
-        return tokenSlurp(is, Charset.defaultCharset(), "\r\n|[\n\r\u2028\u2029\u0085]");
-    }
-
-    /** Convenience overload for {@link #slurp(java.io.InputStream, java.nio.charset.Charset)} using the default charset {@link java.nio.charset.Charset#defaultCharset()}. */
-    public static String slurp(final File file) throws FileNotFoundException {
-        return slurp(new FileInputStream(file));
-    }
-
-    /** Convenience overload for {@link #slurp(java.io.InputStream, java.nio.charset.Charset)} using the default charset {@link java.nio.charset.Charset#defaultCharset()}. */
-    public static String slurp(final InputStream is) {
-        return slurp(is, Charset.defaultCharset());
-    }
-
-    /** Reads all of the stream into a String, decoding with the provided {@link java.nio.charset.Charset} then closes the stream quietly. */
-    public static String slurp(final InputStream is, final Charset charSet) {
-        final List<String> tokenOrEmpty = tokenSlurp(is, charSet, "\\A");
-        return tokenOrEmpty.isEmpty() ? StringUtil.EMPTY_STRING : CollectionUtil.getSoleElement(tokenOrEmpty);
-    }
-
-    /** Tokenizes the provided input stream into memory using the given delimiter. */
-    private static List<String> tokenSlurp(final InputStream is, final Charset charSet, final String delimiterPattern) {
-        try {
-            final Scanner s = new Scanner(is, charSet.toString()).useDelimiter(delimiterPattern);
-            final LinkedList<String> tokens = new LinkedList<String>();
-            while (s.hasNext()) {
-                tokens.add(s.next());
-            }
-            return tokens;
-        } finally {
-            CloserUtil.close(is);
-        }
-    }
-
-    /**
-     * Go through the files provided and if they have one of the provided file extensions pass the file into the output
-     * otherwise assume that file is a list of filenames and unfold it into the output.
-     */
-    public static List<File> unrollFiles(final Collection<File> inputs, final String... extensions) {
-        if (extensions.length < 1) throw new IllegalArgumentException("Must provide at least one extension.");
-
-        final Stack<File> stack = new Stack<File>();
-        final List<File> output = new ArrayList<File>();
-        stack.addAll(inputs);
-
-        while (!stack.empty()) {
-            final File f = stack.pop();
-            final String name = f.getName();
-            boolean matched = false;
-
-            for (final String ext : extensions) {
-                if (!matched && name.endsWith(ext)) {
-                    output.add(f);
-                    matched = true;
-                }
-            }
-
-            // If the file didn't match a given extension, treat it as a list of files
-            if (!matched) {
-                IOUtil.assertFileIsReadable(f);
-
-                for (final String s : IOUtil.readLines(f)) {
-                    if (!s.trim().isEmpty()) stack.push(new File(s.trim()));
-                }
-            }
-        }
-
-        // Preserve input order (since we're using a stack above) for things that care
-        Collections.reverse(output);
-
-        return output;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Interval.java b/src/main/java/htsjdk/samtools/util/Interval.java
deleted file mode 100644
index 779bb25..0000000
--- a/src/main/java/htsjdk/samtools/util/Interval.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.util.Collection;
-
-/**
- * Represents a simple interval on a sequence.  Coordinates are 1-based closed ended.
- *
- * @author Tim Fennell
- */
-public class Interval implements Comparable<Interval>, Cloneable, Locatable {
-    private final boolean negativeStrand;
-    private final String name;
-    private final String contig;
-    private final int start;
-    private final int end;
-
-    /**
-     * Constructs an interval with the supplied sequence and start and end. If the end
-     * position is less than the start position an exception is thrown.
-     *
-     * @param sequence the name of the sequence
-     * @param start the start position of the interval on the sequence
-     * @param end the end position of the interval on the sequence
-     */
-    public Interval(final String sequence, final int start, final int end) {
-        this(sequence, start, end, false, null);
-    }
-
-    /**
-     * Constructs an interval with the supplied sequence and start, end, strand and name.
-     * If the end position is less than the start position an exception is thrown.
-     *
-     * @param sequence the name of the sequence
-     * @param start the start position of the interval on the sequence
-     * @param end the end position of the interval on the sequence
-     * @param negative true to indicate negative strand, false otherwise
-     * @param name the name (possibly null) of the interval
-     *
-     */
-    public Interval(final String sequence, final int start, final int end, final boolean negative, final String name) {
-        this.contig = sequence;
-        this.start = start;
-        this.end = end;
-        this.negativeStrand = negative;
-        this.name = name;
-    }
-
-    /** Gets the name of the sequence on which the interval resides.
-     * This is a simple alias of getContig()
-     * @deprecated use getContig() instead
-     */
-    @Deprecated
-    public String getSequence() { return getContig(); }
-
-
-    /** Returns true if the interval is on the negative strand, otherwise false. */
-    public boolean isNegativeStrand() { return this.negativeStrand; }
-
-    /** Returns true if the interval is on the positive strand, otherwise false. */
-    public boolean isPositiveStrand() { return !this.negativeStrand; }
-
-    /** Returns the name of the interval, possibly null. */
-    public String getName() { return this.name; }
-
-    /** Returns true if this interval overlaps the other interval, otherwise false. */
-    public boolean intersects(final Interval other) {
-        return  (this.getContig().equals(other.getContig()) &&
-                 CoordMath.overlaps(this.getStart(), this.getEnd(), other.getStart(), other.getEnd()));
-    }
-
-    public int getIntersectionLength(final Interval other) {
-        if (this.intersects(other)) {
-            return (int)CoordMath.getOverlap(this.getStart(), this.getEnd(), other.getStart(), other.getEnd());
-        }
-        return 0;
-    }
-
-
-    /** Returns a new Interval that represents the intersection between the two intervals. */
-    public Interval intersect(final Interval that) {
-        if (!intersects(that)) throw new IllegalArgumentException(that + " does not intersect " + this);
-        return new Interval(this.getContig(),
-                            Math.max(this.getStart(), that.getStart()),
-                            Math.min(this.getEnd(), that.getEnd()),
-                            this.negativeStrand,
-                            this.name + " intersection " + that.name);
-    }
-
-
-    /** Returns true if this interval overlaps the other interval, otherwise false. */
-    public boolean abuts(final Interval other) {
-        return this.getContig().equals(other.getContig()) &&
-               (this.getStart() == other.getEnd() + 1 || other.getStart() == this.getEnd() + 1);
-    }
-
-    /** Gets the length of this interval. */
-    public int length() { return this.getEnd() - this.getStart() + 1; }
-
-    /** Returns a new interval that is padded by the amount of bases specified on either side. */
-    public Interval pad(final int left, final int right) {
-        return new Interval(this.getContig(), this.getStart()-left, this.getEnd()+right, this.negativeStrand, this.name);
-    }
-
-    /** Counts the total number of bases a collection of intervals. */
-    public static long countBases(final Collection<Interval> intervals) {
-        long total = 0;
-        for (final Interval i : intervals) {
-            total += i.length();
-        }
-
-        return total;
-    }
-
-
-    /**
-     * Sort based on sequence.compareTo, then start pos, then end pos
-     * with null objects coming lexically last
-     */
-    public int compareTo(final Interval that) {
-        if (that == null) return -1; // nulls last
-
-        int result = this.getContig().compareTo(that.getContig());
-        if (result == 0) {
-            if (this.getStart() == that.getStart()) {
-                result = this.getEnd() - that.getEnd();
-            }
-            else {
-                result = this.getStart() - that.getStart();
-            }
-        }
-
-        return result;
-    }
-
-    /** Equals method that agrees with {@link #compareTo(Interval)}. */
-    public boolean equals(final Object other) {
-        if (!(other instanceof Interval)) return false;
-        else if (this == other) return true;
-        else {
-            Interval that = (Interval)other;
-            return (this.compareTo(that) == 0);
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        int result = getContig().hashCode();
-        result = 31 * result + getStart();
-        result = 31 * result + getEnd();
-        return result;
-    }
-
-    public String toString() {
-        return getContig() + ":" + getStart() + "-" + getEnd() + "\t" + (negativeStrand ? '-' : '+') + "\t" + ((null == name) ? '.' : name);
-    }
-
-    @Override
-    public Interval clone() {
-        try { return (Interval) super.clone(); }
-        catch (CloneNotSupportedException cnse) { throw new SAMException("That's unpossible", cnse); }
-    }
-
-    @Override
-    public String getContig() {
-        return contig;
-    }
-
-    @Override
-    public int getStart() {
-        return start;
-    }
-
-    @Override
-    public int getEnd() {
-        return end;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IntervalList.java b/src/main/java/htsjdk/samtools/util/IntervalList.java
deleted file mode 100644
index 76cb508..0000000
--- a/src/main/java/htsjdk/samtools/util/IntervalList.java
+++ /dev/null
@@ -1,790 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SAMTextHeaderCodec;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * Represents a list of intervals against a reference sequence that can be written to
- * and read from a file.  The file format is relatively simple and reflects the SAM
- * alignment format to a degree.
- *
- * A SAM style header must be present in the file which lists the sequence records
- * against which the intervals are described.  After the header the file then contains
- * records one per line in text format with the following values tab-separated:
- *    Sequence name,
- *    Start position (1-based),
- *    End position (1-based, end inclusive),
- *    Strand (either + or -),
- *    Interval name (an, ideally unique, name for the interval),
- *
- * @author Tim Fennell
- * @author Yossi Farjoun
- */
-public class IntervalList implements Iterable<Interval> {
-    public static final String INTERVAL_LIST_FILE_EXTENSION = ".interval_list";
-
-    private final SAMFileHeader header;
-    private final List<Interval> intervals = new ArrayList<Interval>();
-
-    private static final Log log = Log.getInstance(IntervalList.class);
-
-    /** Constructs a new interval list using the supplied header information. */
-    public IntervalList(final SAMFileHeader header) {
-        if (header == null) throw new IllegalArgumentException("SAMFileHeader must be supplied.");
-        this.header = header;
-    }
-
-    /** Constructs a new interval list using the supplied header information. */
-    public IntervalList(final SAMSequenceDictionary dict) {
-        this(new SAMFileHeader(dict));
-    }
-
-    /** Gets the header (if there is one) for the interval list. */
-    public SAMFileHeader getHeader() { return header; }
-
-    /** Returns an iterator over the intervals. */
-    public Iterator<Interval> iterator() { return this.intervals.iterator(); }
-
-    /** Adds an interval to the list of intervals. */
-    public void add(final Interval interval) {
-        if (header.getSequence(interval.getContig()) == null) {
-            throw new IllegalArgumentException(String.format("Cannot add interval %s, contig not in header", interval.toString()));
-        }
-        this.intervals.add(interval);
-    }
-
-    /** Adds a Collection of intervals to the list of intervals. */
-    public void addall(final Collection<Interval> intervals) {
-        //use this instead of addAll so that the contig checking happens.
-        for (Interval interval : intervals) {
-            add(interval);
-        }
-    }
-
-    /**
-     * Sorts the internal collection of intervals by coordinate.
-     *
-     * Note: this function modifies the object in-place and is therefore difficult to work with.
-     *
-     * @deprecated use {@link #sorted()} instead.
-     */
-    @Deprecated
-    public void sort() {
-        Collections.sort(this.intervals, new IntervalCoordinateComparator(this.header));
-        this.header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-    }
-
-    /** Returns a new IntervalList where each interval is padded by the specified amount of bases. */
-    public IntervalList padded(final int before, final int after) {
-        if (before < 0 || after < 0) throw new IllegalArgumentException("Padding values must be >= 0.");
-        final IntervalList padded = new IntervalList(this.getHeader().clone());
-        final SAMSequenceDictionary dict = padded.getHeader().getSequenceDictionary();
-        for (final Interval i : this) {
-            final SAMSequenceRecord seq = dict.getSequence(i.getContig());
-            final int start = Math.max(1, i.getStart() - before);
-            final int end   = Math.min(seq.getSequenceLength(), i.getEnd() + after);
-            padded.add(new Interval(i.getContig(), start, end, i.isNegativeStrand(), i.getName()));
-        }
-
-        return padded;
-    }
-
-    /** Returns a new IntervalList where each interval is padded by 'padding' bases on each side. */
-    public IntervalList padded(final int padding) {
-        return padded(padding, padding);
-    }
-
-    /** returns an independent sorted IntervalList*/
-    public IntervalList sorted() {
-        final IntervalList sorted = IntervalList.copyOf(this);
-        Collections.sort(sorted.intervals, new IntervalCoordinateComparator(sorted.header));
-        sorted.header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-        return sorted;
-    }
-
-    /** Returned an independent IntervalList that is sorted and uniquified. */
-    public IntervalList uniqued() {
-        return uniqued(true);
-    }
-
-    /**
-     * Returned an independent IntervalList that is sorted and uniquified.
-     * @param concatenateNames If false, interval names are not concatenated when merging intervals to save space.
-     */
-    public IntervalList uniqued(final boolean concatenateNames) {
-        final List<Interval> tmp = getUniqueIntervals(sorted(), concatenateNames);
-        final IntervalList value = new IntervalList(this.header.clone());
-        value.intervals.addAll(tmp);
-        return value;
-    }
-
-    /**
-     * Sorts and uniques the list of intervals held within this interval list.
-     *
-     * Note: this function modifies the object in-place and is therefore difficult to work with.
-     *
-     * @deprecated use {@link #uniqued()} instead.
-     */
-    @Deprecated
-    public void unique() {
-        unique(true);
-    }
-
-    /**
-     * Sorts and uniques the list of intervals held within this interval list.
-     *
-     * Note: this function modifies the object in-place and is therefore difficult to work with.
-     *
-     * @param concatenateNames If false, interval names are not concatenated when merging intervals to save space.
-     * @deprecated use {@link #uniqued(boolean)} instead.
-     */
-    @Deprecated
-    public void unique(final boolean concatenateNames) {
-        sort();
-        final List<Interval> tmp = getUniqueIntervals(concatenateNames);
-        this.intervals.clear();
-        this.intervals.addAll(tmp);
-    }
-
-    /** Gets the set of intervals as held internally. */
-    public List<Interval> getIntervals() {
-        return Collections.unmodifiableList(this.intervals);
-    }
-
-    /**
-     * Merges the list of intervals and then reduces them down where regions overlap
-     * or are directly adjacent to one another.  During this process the "merged" interval
-     * will retain the strand and name of the 5' most interval merged.
-     *
-     * Note: has the side-effect of sorting the stored intervals in coordinate order if not already sorted.
-     *
-     * Note: this function modifies the object in-place and is therefore difficult to work with.
-     *
-     * @return the set of unique intervals condensed from the contained intervals
-     * @deprecated use {@link #uniqued()#getIntervals()} instead.
-     */
-    @Deprecated
-    public List<Interval> getUniqueIntervals() {
-        return getUniqueIntervals(true);
-    }
-
-    //NO SIDE EFFECTS HERE!
-    /**
-     * Merges list of intervals and reduces them like htsjdk.samtools.util.IntervalList#getUniqueIntervals()
-     * @param concatenateNames If false, the merged interval has the name of the earlier interval.  This keeps name shorter.
-     */
-    public static List<Interval> getUniqueIntervals(final IntervalList list, final boolean concatenateNames) {
-        return getUniqueIntervals(list, concatenateNames, false);
-    }
-
-    //NO SIDE EFFECTS HERE!
-    /**
-     * Merges list of intervals and reduces them like htsjdk.samtools.util.IntervalList#getUniqueIntervals()
-     * @param concatenateNames If false, the merged interval has the name of the earlier interval.  This keeps name shorter.
-     * @param enforceSameStrands enforce that merged intervals have the same strand, otherwise ignore.
-     */
-    public static List<Interval> getUniqueIntervals(final IntervalList list, final boolean concatenateNames, final boolean enforceSameStrands) {
-
-        final List<Interval> intervals;
-        if (list.getHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
-            intervals = list.sorted().intervals;
-        }
-        else {
-            intervals = list.intervals;
-        }
-
-        final List<Interval> unique = new ArrayList<Interval>();
-        final TreeSet<Interval> toBeMerged = new TreeSet<Interval>();
-        Interval current = null;
-
-        for (final Interval next : intervals) {
-            if (current == null) {
-                toBeMerged.add(next);
-                current = next;
-            }
-            else if (current.intersects(next) || current.abuts(next)) {
-                if (enforceSameStrands && current.isNegativeStrand() != next.isNegativeStrand()) throw new SAMException("Strands were not equal for: " + current.toString() + " and " + next.toString());
-                toBeMerged.add(next);
-                current = new Interval(current.getContig(), current.getStart(), Math.max(current.getEnd(), next.getEnd()), current.isNegativeStrand(), null);
-            }
-            else {
-                // Emit merged/unique interval
-                unique.add(merge(toBeMerged, concatenateNames));
-
-                // Set current == next for next iteration
-                toBeMerged.clear();
-                current = next;
-                toBeMerged.add(current);
-            }
-        }
-
-        if (!toBeMerged.isEmpty()) unique.add(merge(toBeMerged, concatenateNames));
-        return unique;
-    }
-
-    /**
-     * Merges list of intervals and reduces them like {@link #getUniqueIntervals()}.
-     *
-     * Note: this function modifies the object in-place and is therefore difficult to work with.
-     *
-     * @param concatenateNames If false, the merged interval has the name of the earlier interval. This keeps name shorter.
-     * @deprecated use {@link #uniqued(boolean)#getIntervals()} or {@link #getUniqueIntervals(IntervalList, boolean)} instead.
-     */
-    @Deprecated
-    public List<Interval> getUniqueIntervals(final boolean concatenateNames) {
-        if (getHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
-            sort();
-        }
-
-        return getUniqueIntervals(this, concatenateNames);
-    }
-
-    /**
-     * Given a list of Intervals and a band multiple, this method will return a list of Intervals such that all of the intervals
-     * do not straddle integer multiples of that band.
-     *
-     * ex: if there is an interval (7200-9300) and the bandMultiple is 1000, the interval will be split into:
-     * (7200-7999, 8000-8999, 9000-9300)
-     * @param intervals A list of Interval
-     * @param bandMultiple integer value (> 0) to break up intervals in the list at integer multiples of
-     * @return list of intervals that are broken up
-     */
-    public static List<Interval> breakIntervalsAtBandMultiples(final List<Interval> intervals, final int bandMultiple) {
-        final List<Interval> brokenUpIntervals = new ArrayList<Interval>();
-        for (final Interval interval : intervals) {
-            if (interval.getEnd() >= interval.getStart()) {       // Normal, non-empty intervals
-                final int startIndex = interval.getStart() / bandMultiple;
-                final int endIndex = interval.getEnd() / bandMultiple;
-                if (startIndex == endIndex) {
-                    brokenUpIntervals.add(interval);
-                } else {
-                    brokenUpIntervals.addAll(breakIntervalAtBandMultiples(interval, bandMultiple));
-                }
-            }
-            else {                                  // Special case - empty intervals ex: (100-99)
-                brokenUpIntervals.add(interval);
-            }
-        }
-        return brokenUpIntervals;
-    }
-
-    /**
-     * Given an Interval and a band multiple, this method will return a list of Intervals such that all of the intervals
-     * do not straddle integer multiples of that band.
-     *
-     * ex: if the interval is (7200-9300) and the bandMultiple is 1000, the interval will be split into:
-     * (7200-7999, 8000-8999, 9000-9300)
-     * @param interval an Interval
-     * @param bandMultiple integer value (> 0) to break up intervals in the list at integer multiples of
-     * @return list of intervals that are broken up
-     */
-    private static List<Interval> breakIntervalAtBandMultiples(final Interval interval, final int bandMultiple) {
-        final List<Interval> brokenUpIntervals = new ArrayList<Interval>();
-
-        int startPos = interval.getStart();
-        final int startOfIntervalIndex = startPos / bandMultiple;
-        int startIndex = startOfIntervalIndex;
-        final int endIndex = interval.getEnd() / bandMultiple;
-        while (startIndex <= endIndex) {
-            int endPos = (startIndex + 1) * bandMultiple -1;
-            if (endPos > interval.getEnd()) {
-                endPos = interval.getEnd();
-            }
-            // add start/end to list of broken up intervals to return (and uniquely name it).
-            brokenUpIntervals.add(new Interval(interval.getContig(), startPos, endPos, interval.isNegativeStrand(), interval.getName() + "." + (startIndex - startOfIntervalIndex + 1)));
-            startIndex++;
-            startPos = startIndex * bandMultiple;
-        }
-        return brokenUpIntervals;
-    }
-
-
-    /** Merges a sorted collection of intervals and optionally concatenates unique names or takes the first name. */
-    static Interval merge(final SortedSet<Interval> intervals, final boolean concatenateNames) {
-        final String chrom = intervals.first().getContig();
-        int start = intervals.first().getStart();
-        int end   = intervals.last().getEnd();
-        final boolean neg  = intervals.first().isNegativeStrand();
-        final LinkedHashSet<String> names = new LinkedHashSet<String>();
-        final String name;
-
-        for (final Interval i : intervals) {
-            if (i.getName() != null) names.add(i.getName());
-            start = Math.min(start, i.getStart());
-            end   = Math.max(end, i.getEnd());
-        }
-
-        if (concatenateNames) {
-            if (names.isEmpty()) name = null;
-            else name = StringUtil.join("|", names);
-        }
-        else { name = names.iterator().next(); }
-
-        return new Interval(chrom, start, end, neg, name);
-    }
-
-    /** Gets the (potentially redundant) sum of the length of the intervals in the list. */
-    public long getBaseCount() {
-        return Interval.countBases(this.intervals);
-    }
-
-    /** Gets the count of unique bases represented by the intervals in the list. */
-    public long getUniqueBaseCount() {
-        return uniqued().getBaseCount();
-    }
-
-    /** Returns the count of intervals in the list. */
-    public int size() {
-        return this.intervals.size();
-    }
-
-    /** creates a independent copy of the given IntervalList
-     *
-     * @param list
-     * @return
-     */
-    public static IntervalList copyOf(final IntervalList list){
-        final IntervalList clone = new IntervalList(list.header.clone());
-        clone.intervals.addAll(list.intervals);
-        return clone;
-    }
-
-    /**
-     * Parses an interval list from a file.
-     * @param file the file containing the intervals
-     * @return an IntervalList object that contains the headers and intervals from the file
-     */
-    public static IntervalList fromFile(final File file) {
-        final BufferedReader reader= IOUtil.openFileForBufferedReading(file);
-        final IntervalList list = fromReader(reader);
-        try {
-            reader.close();
-        } catch (final IOException e) {
-            throw new SAMException(String.format("Failed to close file %s after reading",file));
-        }
-
-        return list;
-    }
-
-    /**
-     * Creates an IntervalList from the given sequence name
-     * @param header header to use to create IntervalList
-     * @param sequenceName name of sequence in header
-     * @return a new intervalList with given header that contains the reference name
-     */
-    public static IntervalList fromName(final SAMFileHeader header, final String sequenceName) {
-        final IntervalList ref = new IntervalList(header);
-        ref.add(new Interval(sequenceName, 1, header.getSequence(sequenceName).getSequenceLength()));
-
-        return ref;
-    }
-
-    /**
-     * Calls {@link #fromFile(java.io.File)} on the provided files, and returns their {@link #union(java.util.Collection)}.
-     */
-    public static IntervalList fromFiles(final Collection<File> intervalListFiles) {
-        final Collection<IntervalList> intervalLists = new ArrayList<IntervalList>();
-        for (final File file : intervalListFiles) {
-            intervalLists.add(IntervalList.fromFile(file));
-        }
-        return IntervalList.union(intervalLists);
-    }
-
-    /**
-     * Parses an interval list from a reader in a stream based fashion.
-     * @param in a BufferedReader that can be read from
-     * @return an IntervalList object that contains the headers and intervals from the file
-     */
-    public static IntervalList fromReader(final BufferedReader in) {
-        try {
-            // Setup a reader and parse the header
-            final StringBuilder builder = new StringBuilder(4096);
-            String line = null;
-
-            while ((line = in.readLine()) != null) {
-                if (line.startsWith("@")) {
-                    builder.append(line).append('\n');
-                }
-                else {
-                    break;
-                }
-            }
-
-            if (builder.length() == 0) {
-                throw new IllegalStateException("Interval list file must contain header. ");
-            }
-
-            final StringLineReader headerReader = new StringLineReader(builder.toString());
-            final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
-            final IntervalList list = new IntervalList(codec.decode(headerReader, "BufferedReader"));
-            final SAMSequenceDictionary dict = list.getHeader().getSequenceDictionary();
-
-            //there might not be any lines after the header, in which case we should return an empty list
-            if(line == null) return list;
-
-            // Then read in the intervals
-            final FormatUtil format = new FormatUtil();
-            do {
-                if (line.trim().isEmpty()) continue; // skip over blank lines
-
-                // Make sure we have the right number of fields
-                final String[] fields = line.split("\t");
-                if (fields.length != 5) {
-                    throw new SAMException("Invalid interval record contains " +
-                            fields.length + " fields: " + line);
-                }
-
-                // Then parse them out
-                final String seq = fields[0];
-                final int start = format.parseInt(fields[1]);
-                final int end   = format.parseInt(fields[2]);
-
-                final boolean negative;
-                if (fields[3].equals("-")) negative = true;
-                else if (fields[3].equals("+")) negative = false;
-                else throw new IllegalArgumentException("Invalid strand field: " + fields[3]);
-
-                final String name = fields[4];
-
-                final Interval interval = new Interval(seq, start, end, negative, name);
-                if (dict.getSequence(seq) == null) {
-                    log.warn("Ignoring interval for unknown reference: " + interval);
-                }
-                else {
-                    list.intervals.add(interval);
-                }
-            }
-            while ((line = in.readLine()) != null);
-
-            return list;
-        }
-        catch (final IOException ioe) {
-            throw new SAMException("Error parsing interval list.", ioe);
-        }
-        finally {
-            try { in.close(); } catch (final Exception e) { /* do nothing */ }
-        }
-    }
-
-    /**
-     * Writes out the list of intervals to the supplied file.
-     * @param file a file to write to.  If exists it will be overwritten.
-     */
-    public void write(final File file) {
-        try {
-            final BufferedWriter out = IOUtil.openFileForBufferedWriting(file);
-            final FormatUtil format = new FormatUtil();
-
-            // Write out the header
-            if (this.header != null) {
-                final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
-                codec.encode(out, this.header);
-            }
-
-            // Write out the intervals
-            for (final Interval interval : this) {
-                out.write(interval.getContig());
-                out.write('\t');
-                out.write(format.format(interval.getStart()));
-                out.write('\t');
-                out.write(format.format(interval.getEnd()));
-                out.write('\t');
-                out.write(interval.isPositiveStrand() ? '+' : '-');
-                out.write('\t');
-                if(interval.getName() != null){
-                    out.write(interval.getName());
-                }
-                else{
-                    out.write(".");
-                }
-                out.newLine();
-            }
-
-            out.flush();
-            out.close();
-        }
-        catch (final IOException ioe) {
-            throw new SAMException("Error writing out interval list to file: " + file.getAbsolutePath(), ioe);
-        }
-    }
-
-    /**
-     * A utility function for generating the intersection of two IntervalLists, checks for equal dictionaries.
-     *
-     * @param list1 the first IntervalList
-     * @param list2 the second IntervalList
-     * @return the intersection of list1 and list2.
-     */
-
-    public static IntervalList intersection(final IntervalList list1, final IntervalList list2) {
-
-        final IntervalList result;
-        // Ensure that all the sequence dictionaries agree and merge the lists
-        SequenceUtil.assertSequenceDictionariesEqual(list1.getHeader().getSequenceDictionary(),
-                list2.getHeader().getSequenceDictionary());
-
-        result = new IntervalList(list1.getHeader().clone());
-
-        final OverlapDetector<Interval> detector = new OverlapDetector<Interval>(0, 0);
-
-        detector.addAll(list1.getIntervals(), list1.getIntervals());
-
-        for (final Interval i : list2.getIntervals()) {
-            final Collection<Interval> as = detector.getOverlaps(i);
-            for (final Interval j : as) {
-                final Interval tmp = i.intersect(j);
-
-                result.add(tmp);
-            }
-        }
-        return result.uniqued();
-
-    }
-
-    /**
-     * A utility function for intersecting a list of IntervalLists, checks for equal dictionaries.
-     *
-     * @param lists the list of IntervalList
-     * @return the intersection of all the IntervalLists in lists.
-     */
-
-
-    public static IntervalList intersection(final Collection<IntervalList> lists) {
-
-        IntervalList intersection = null;
-        for (final IntervalList list : lists) {
-            if(intersection == null){
-                intersection = list;
-            }
-            else{
-                intersection = intersection(intersection, list);
-            }
-        }
-        return intersection;
-    }
-
-    /**
-     * A utility function for merging a list of IntervalLists, checks for equal dictionaries.
-     * Merging does not look for overlapping intervals nor uniquify
-     *
-     * @param lists a list of IntervalList
-     * @return the union of all the IntervalLists in lists.
-     */
-    public static IntervalList concatenate(final Collection<IntervalList> lists) {
-        if(lists.isEmpty()){
-            throw new SAMException("Cannot concatenate an empty list of IntervalLists.");
-        }
-
-        // Ensure that all the sequence dictionaries agree and merge the lists
-        final SAMFileHeader header = lists.iterator().next().getHeader().clone();
-        header.setSortOrder(SAMFileHeader.SortOrder.unsorted);
-
-        final IntervalList merged = new IntervalList(header);
-
-        for (final IntervalList in : lists) {
-            SequenceUtil.assertSequenceDictionariesEqual(merged.getHeader().getSequenceDictionary(),
-                    in.getHeader().getSequenceDictionary());
-
-            merged.addall(in.intervals);
-        }
-
-        return merged;
-    }
-
-    /**
-     * A utility function for finding the union of a list of IntervalLists, checks for equal dictionaries.
-     * also looks for overlapping intervals, uniquifies, and sorts (by coordinate)
-     *
-     * @param lists the list of IntervalList
-     * @return the union of all the IntervalLists in lists.
-     */
-    public static IntervalList union(final Collection<IntervalList> lists) {
-        final IntervalList merged = concatenate(lists);
-        return merged.uniqued();
-    }
-
-    public static IntervalList union(final IntervalList list1, final IntervalList list2) {
-        final Collection<IntervalList> duo = CollectionUtil.makeList(list1, list2);
-        return IntervalList.union(duo);
-    }
-
-    /** inverts an IntervalList and returns one that has exactly all the bases in the dictionary that the original one does not.
-     *
-     * @param list an IntervalList
-     * @return an IntervalList that is complementary to list
-     */
-    public static IntervalList invert(final IntervalList list) {
-        final IntervalList inverse = new IntervalList(list.header.clone());
-
-        final ListMap<Integer,Interval> map = new ListMap<Integer,Interval>();
-
-        //add all the intervals (uniqued and therefore also sorted) to a ListMap from sequenceIndex to a list of Intervals
-        for(final Interval i : list.uniqued().getIntervals()){
-            map.add(list.getHeader().getSequenceIndex(i.getContig()),i);
-        }
-
-        // a counter to supply newly-created intervals with a name
-        int intervals = 0;
-
-        //iterate over the contigs in the dictionary
-        for (final SAMSequenceRecord samSequenceRecord : list.getHeader().getSequenceDictionary().getSequences()) {
-            final Integer sequenceIndex = samSequenceRecord.getSequenceIndex();
-            final String sequenceName   = samSequenceRecord.getSequenceName();
-            final int sequenceLength    = samSequenceRecord.getSequenceLength();
-
-            Integer lastCoveredPosition = 0; //start at beginning of sequence
-            //iterate over list of intervals that are in sequence
-            if (map.containsKey(sequenceIndex)) // if there are intervals in the ListMap on this contig, iterate over them (in order)
-                for (final Interval i : map.get(sequenceIndex)) {
-                    if (i.getStart() > lastCoveredPosition + 1) //if there's space between the last interval and the current one, add an interval between them
-                        inverse.add(new Interval(sequenceName, lastCoveredPosition + 1, i.getStart() - 1, false, "interval-" + (++intervals)));
-                    lastCoveredPosition = i.getEnd(); //update the last covered position
-                }
-            //finally, if there's room between the last covered position and the end of the sequence, add an interval
-            if (sequenceLength > lastCoveredPosition) //if there's space between the last interval and the next
-                // one, add an interval. This also covers the case that there are no intervals in the ListMap for a contig.
-                inverse.add(new Interval(sequenceName, lastCoveredPosition + 1, sequenceLength, false, "interval-" + (++intervals)));
-        }
-
-        return inverse;
-    }
-
-    /**
-     * A utility function for subtracting a collection of IntervalLists from another. Resulting loci are those that are in the first collection
-     * but not the second.
-     *
-     * @param lhs the collection of IntervalList from which to subtract intervals
-     * @param rhs the collection of intervals to subtract
-     * @return an IntervalList comprising all loci that are in the first collection but not the second  lhs-rhs=answer.
-     */
-    public static IntervalList subtract(final Collection<IntervalList> lhs, final Collection<IntervalList> rhs) {
-        return intersection(
-                union(lhs),
-                invert(union(rhs)));
-    }
-
-    /**
-     * A utility function for subtracting a single IntervalList from another. Resulting loci are those that are in the first List
-     * but not the second.
-     *
-     * @param lhs the IntervalList from which to subtract intervals
-     * @param rhs the IntervalList to subtract
-     * @return an IntervalList comprising all loci that are in first IntervalList but not the second. lhs-rhs=answer
-     */
-    public static IntervalList subtract(final IntervalList lhs, final IntervalList rhs) {
-        return subtract(Collections.singletonList(lhs),
-                Collections.singletonList(rhs));
-    }
-
-    /**
-     * A utility function for finding the difference between two IntervalLists.
-     *
-     * @param lists1 the first collection of IntervalLists
-     * @param lists2 the second collection of IntervalLists
-     * @return the difference between the two intervals, i.e. the loci that are only in one IntervalList but not both
-     */
-    public static IntervalList difference(final Collection<IntervalList> lists1, final Collection<IntervalList> lists2) {
-        return union(
-                subtract(lists1, lists2),
-                subtract(lists2, lists1));
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final IntervalList intervals1 = (IntervalList) o;
-
-        return header.equals(intervals1.header) && intervals.equals(intervals1.intervals);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = header.hashCode();
-        result = 31 * result + intervals.hashCode();
-        return result;
-    }
-}
-
-/**
- * Comparator that orders intervals based on their sequence index, by coordinate
- * then by strand and finally by name.
- */
-class IntervalCoordinateComparator implements Comparator<Interval>, Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private final SAMFileHeader header;
-
-    /** Constructs a comparator using the supplied sequence header. */
-    IntervalCoordinateComparator(final SAMFileHeader header) {
-        this.header = header;
-    }
-
-    public int compare(final Interval lhs, final Interval rhs) {
-        final int lhsIndex = this.header.getSequenceIndex(lhs.getContig());
-        final int rhsIndex = this.header.getSequenceIndex(rhs.getContig());
-        int retval = lhsIndex - rhsIndex;
-
-        if (retval == 0) retval = lhs.getStart() - rhs.getStart();
-        if (retval == 0) retval = lhs.getEnd()   - rhs.getEnd();
-        if (retval == 0) {
-            if (lhs.isPositiveStrand() && rhs.isNegativeStrand()) retval = -1;
-            else if (lhs.isNegativeStrand() && rhs.isPositiveStrand()) retval = 1;
-        }
-        if (retval == 0) {
-            if (lhs.getName() == null) {
-                if (rhs.getName() == null) return 0;
-                else return -1;
-            } else if (rhs.getName() == null) {
-                return 1;
-            }
-            else {
-                return lhs.getName().compareTo(rhs.getName());
-            }
-        }
-
-        return retval;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IntervalListReferenceSequenceMask.java b/src/main/java/htsjdk/samtools/util/IntervalListReferenceSequenceMask.java
deleted file mode 100644
index 1ddd164..0000000
--- a/src/main/java/htsjdk/samtools/util/IntervalListReferenceSequenceMask.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFileHeader;
-
-import java.util.BitSet;
-import java.util.List;
-
-/**
- * Serve up loci of interest based on an interval list.
- *
- * @author alecw at broadinstitute dot oh are gee
- */
-public class IntervalListReferenceSequenceMask implements ReferenceSequenceMask {
-
-    private final SAMFileHeader header;
-    // if memory usage becomes a problem... this could be changed to a SparseBitSet
-    // http://java.sun.com/developer/onlineTraining/collections/magercises/BitSet/index.html
-    private final BitSet currentBitSet = new BitSet();
-    private int currentSequenceIndex = -1;
-    private final PeekableIterator<Interval> intervalIterator;
-    private final int lastSequenceIndex;
-    private final int lastPosition;
-
-    public IntervalListReferenceSequenceMask(final IntervalList intervalList) {
-        this.header = intervalList.getHeader();
-        if (intervalList.getHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
-            intervalList.sorted();
-        }
-        final List<Interval> uniqueIntervals = intervalList.uniqued().getIntervals();
-        if (uniqueIntervals.isEmpty()) {
-            lastSequenceIndex = -1;
-            lastPosition = 0;
-        } else {
-            final Interval lastInterval = uniqueIntervals.get(uniqueIntervals.size() - 1);
-            lastSequenceIndex = header.getSequenceIndex((lastInterval.getContig()));
-            lastPosition = lastInterval.getEnd();
-        }
-        intervalIterator = new PeekableIterator<Interval>(uniqueIntervals.iterator());
-    }
-
-    /**
-     * It is required that sequenceIndex is >= any previous sequenceIndex passed to this class.
-     *
-     * @return true if the mask is set for the given sequence and position
-     */
-    public boolean get(final int sequenceIndex, final int position) {
-        ensureSequenceLoaded(sequenceIndex);
-        return currentBitSet.get(position);
-    }
-
-    /**
-     * It is required that sequenceIndex is >= any previous sequenceIndex passed to this class.
-     *
-     * @return the next pos on the given sequence >= position that is set, or -1 if there are no more set positions
-     */
-    public int nextPosition(final int sequenceIndex, final int position) {
-        ensureSequenceLoaded(sequenceIndex);
-        // nextSetBit returns the first set bit on or after the starting index, therefore position+1
-        return currentBitSet.nextSetBit(position + 1);
-    }
-
-    private void ensureSequenceLoaded(final int sequenceIndex) {
-        if (sequenceIndex < this.currentSequenceIndex) {
-            throw new IllegalArgumentException("Cannot look at an earlier sequence.  Current: " +
-                    this.currentSequenceIndex + "; requested: " + sequenceIndex);
-        }
-        if (sequenceIndex > currentSequenceIndex) {
-            currentBitSet.clear();
-            while (intervalIterator.hasNext()) {
-                final Interval interval = intervalIterator.peek();
-                final int nextSequenceIndex = header.getSequenceIndex(interval.getContig());
-                if (nextSequenceIndex < sequenceIndex) {
-                    intervalIterator.next();
-                } else if (nextSequenceIndex == sequenceIndex) {
-                    currentBitSet.set(interval.getStart(), interval.getEnd() + 1);
-                    intervalIterator.next();
-                } else {
-                    break;
-                }
-            }
-            currentSequenceIndex = sequenceIndex;
-        }
-    }
-
-    /**
-     * @return Largest sequence index for which there are set bits.
-     */
-    public int getMaxSequenceIndex() {
-        return lastSequenceIndex;
-    }
-
-    /**
-     * @return the largest position on the last sequence index
-     */
-    public int getMaxPosition() {
-        return lastPosition;
-    }
-
-    public SAMFileHeader getHeader() {
-        return header;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IntervalTree.java b/src/main/java/htsjdk/samtools/util/IntervalTree.java
deleted file mode 100644
index 49c3017..0000000
--- a/src/main/java/htsjdk/samtools/util/IntervalTree.java
+++ /dev/null
@@ -1,1227 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.ConcurrentModificationException;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * A Red-Black tree with intervals for keys.
- * Not thread-safe, and cannot be made so.
- *
- * 7/24/2008: This was copied from the tedUtils package.
- * IMPORTANT!!! It has been modified to use the Reseq way of
- * handling coordinates (end-inclusive).
- *
- * @author tsharpe
- */
-public class IntervalTree<V> implements Iterable<IntervalTree.Node<V>>
-{
-    /**
-     * Return the number of intervals in the tree.
-     * @return The number of intervals.
-     */
-    public int size()
-    {
-        return mRoot == null ? 0 : mRoot.getSize();
-    }
-
-    /**
-     * Remove all entries.
-     */
-    public void clear()
-    {
-        mRoot = null;
-    }
-
-    /**
-     * Put a new interval into the tree (or update the value associated with an existing interval).
-     * If the interval is novel, the special sentinel value is returned.
-     * @param start The interval's start.
-     * @param end The interval's end.
-     * @param value The associated value.
-     * @return The old value associated with that interval, or the sentinel.
-     */
-    @SuppressWarnings("null")
-    public V put( final int start, final int end, final V value )
-    {
-        if ( start > end )
-            throw new IllegalArgumentException("Start cannot exceed end.");
-
-        V result = mSentinel;
-
-        if ( mRoot == null )
-        {
-            mRoot = new Node<V>(start,end,value);
-        }
-        else
-        {
-            Node<V> parent = null;
-            Node<V> node = mRoot;
-            int cmpVal = 0;
-
-            while ( node != null )
-            {
-                parent = node; // last non-null node
-                cmpVal = node.compare(start,end);
-                if ( cmpVal == 0 )
-                {
-                    break;
-                }
-
-                node = cmpVal < 0 ? node.getLeft() : node.getRight();
-            }
-
-            if ( cmpVal == 0 )
-            {
-                result = parent.setValue(value);
-            }
-            else
-            {
-                if ( cmpVal < 0 )
-                {
-                    mRoot = parent.insertLeft(start,end,value,mRoot);
-                }
-                else
-                {
-                    mRoot = parent.insertRight(start,end,value,mRoot);
-                }
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Remove an interval from the tree.  If the interval does not exist in the tree the
-     * special sentinel value is returned.
-     * @param start The interval's start.
-     * @param end The interval's end.
-     * @return The value associated with that interval, or the sentinel.
-     */
-    public V remove( final int start, final int end )
-    {
-        V result = mSentinel;
-        Node<V> node = mRoot;
-
-        while ( node != null )
-        {
-            final int cmpVal = node.compare(start,end);
-            if ( cmpVal == 0 )
-            {
-                result = node.getValue();
-                mRoot = node.remove(mRoot);
-                break;
-            }
-
-            node = cmpVal < 0 ? node.getLeft() : node.getRight();
-        }
-
-        return result;
-    }
-
-    /**
-     * Find an interval.
-     * @param start The interval's start.
-     * @param end The interval's end.
-     * @return The Node that represents that interval, or null.
-     */
-    public Node<V> find( final int start, final int end )
-    {
-        Node<V> node = mRoot;
-
-        while ( node != null )
-        {
-            final int cmpVal = node.compare(start,end);
-            if ( cmpVal == 0 )
-            {
-                break;
-            }
-
-            node = cmpVal < 0 ? node.getLeft() : node.getRight();
-        }
-
-        return node;
-    }
-
-    /**
-     * Find the nth interval in the tree.
-     * @param idx The rank of the interval sought (from 0 to size()-1).
-     * @return The Node that represents the nth interval.
-     */
-    public Node<V> findByIndex( final int idx )
-    {
-        return Node.findByRank(mRoot,idx+1);
-    }
-
-    /**
-     * Find the rank of the specified interval.  If the specified interval is not in the
-     * tree, then -1 is returned.
-     * @param start The interval's start.
-     * @param end The interval's end.
-     * @return The rank of that interval, or -1.
-     */
-    public int getIndex( final int start, final int end )
-    {
-        return Node.getRank(mRoot,start,end) - 1;
-    }
-
-    /**
-     * Find the least interval in the tree.
-     * @return The earliest interval, or null if the tree is empty.
-     */
-    public Node<V> min()
-    {
-        Node<V> result = null;
-        Node<V> node = mRoot;
-
-        while ( node != null )
-        {
-            result = node;
-            node = node.getLeft();
-        }
-
-        return result;
-    }
-
-    /**
-     * Find the earliest interval in the tree greater than or equal to the specified interval.
-     * @param start The interval's start.
-     * @param end The interval's end.
-     * @return The earliest >= interval, or null if there is none.
-     */
-    @SuppressWarnings("null")
-    public Node<V> min( final int start, final int end )
-    {
-        Node<V> result = null;
-        Node<V> node = mRoot;
-        int cmpVal = 0;
-
-        while ( node != null )
-        {
-            result = node;
-            cmpVal = node.compare(start,end);
-            if ( cmpVal == 0 )
-            {
-                break;
-            }
-
-            node = cmpVal < 0 ? node.getLeft() : node.getRight();
-        }
-
-        if ( cmpVal > 0 )
-        {
-            result = result.getNext();
-        }
-
-        return result;
-    }
-
-    /**
-     * Find the earliest interval in the tree that overlaps the specified interval.
-     * @param start The interval's start.
-     * @param end The interval's end.
-     * @return The earliest overlapping interval, or null if there is none.
-     */
-    public Node<V> minOverlapper( final int start, final int end )
-    {
-        Node<V> result = null;
-        Node<V> node = mRoot;
-
-        if ( node != null && node.getMaxEnd() >= start )
-        {
-            while ( true )
-            {
-                if ( node.getStart() <= end && start <= node.getEnd() )
-                { // this node overlaps.  there might be a lesser overlapper down the left sub-tree.
-                  // no need to consider the right sub-tree:  even if there's an overlapper, if won't be minimal
-                    result = node;
-                    node = node.getLeft();
-                    if ( node == null || node.getMaxEnd() < start )
-                        break; // no left sub-tree or all nodes end too early
-                }
-                else
-                { // no overlap.  if there might be a left sub-tree overlapper, consider the left sub-tree.
-                    final Node<V> left = node.getLeft();
-                    if ( left != null && left.getMaxEnd() >= start )
-                    {
-                        node = left;
-                    }
-                    else
-                    { // left sub-tree cannot contain an overlapper.  consider the right sub-tree.
-                        if ( node.getStart() > end )
-                            break; // everything in the right sub-tree is past the end of the query interval
-
-                        node = node.getRight();
-                        if ( node == null || node.getMaxEnd() < start )
-                            break; // no right sub-tree or all nodes end too early
-                    }
-                }
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Find the greatest interval in the tree.
-     * @return The latest interval, or null if the tree is empty.
-     */
-    public Node<V> max()
-    {
-        Node<V> result = null;
-        Node<V> node = mRoot;
-
-        while ( node != null )
-        {
-            result = node;
-            node = node.getRight();
-        }
-
-        return result;
-    }
-
-    /**
-     * Find the latest interval in the tree less than or equal to the specified interval.
-     * @param start The interval's start.
-     * @param end The interval's end.
-     * @return The latest >= interval, or null if there is none.
-     */
-    @SuppressWarnings("null")
-    public Node<V> max( final int start, final int end )
-    {
-        Node<V> result = null;
-        Node<V> node = mRoot;
-        int cmpVal = 0;
-
-        while ( node != null )
-        {
-            result = node;
-            cmpVal = node.compare(start,end);
-            if ( cmpVal == 0 )
-            {
-                break;
-            }
-
-            node = cmpVal < 0 ? node.getLeft() : node.getRight();
-        }
-
-        if ( cmpVal < 0 )
-        {
-            result = result.getPrev();
-        }
-
-        return result;
-    }
-
-    /**
-     * Return an iterator over the entire tree.
-     * @return An iterator.
-     */
-    public Iterator<Node<V>> iterator()
-    {
-        return new FwdIterator(min());
-    }
-
-    /**
-     * Return an iterator over all intervals greater than or equal to the specified interval.
-     * @param start The interval's start.
-     * @param end The interval's end.
-     * @return An iterator.
-     */
-    public Iterator<Node<V>> iterator( final int start, final int end )
-    {
-        return new FwdIterator(min(start,end));
-    }
-
-    /**
-     * Return an iterator over all intervals overlapping the specified range.
-     * @param start The range start.
-     * @param end The range end.
-     * @return An iterator.
-     */
-    public Iterator<Node<V>> overlappers( final int start, final int end )
-    {
-        return new OverlapIterator(start,end);
-    }
-
-    /**
-     * Return an iterator over the entire tree that returns intervals in reverse order.
-     * @return An iterator.
-     */
-    public Iterator<Node<V>> reverseIterator()
-    {
-        return new RevIterator(max());
-    }
-
-    /**
-     * Return an iterator over all intervals less than or equal to the specified interval, in reverse order.
-     * @param start The interval's start.
-     * @param end The interval's end.
-     * @return An iterator.
-     */
-    public Iterator<Node<V>> reverseIterator( final int start, final int end )
-    {
-        return new RevIterator(max(start,end));
-    }
-
-    /**
-     * Get the special sentinel value that will be used to signal novelty when putting a new interval
-     * into the tree, or to signal "not found" when removing an interval.  This is null by default.
-     * @return The sentinel value.
-     */
-    public V getSentinel()
-    {
-        return mSentinel;
-    }
-
-    /**
-     * Set the special sentinel value that will be used to signal novelty when putting a new interval
-     * into the tree, or to signal "not found" when removing an interval.
-     * @param sentinel The new sentinel value.
-     * @return The old sentinel value.
-     */
-    public V setSentinel( final V sentinel )
-    {
-        final V result = mSentinel;
-        mSentinel = sentinel;
-        return result;
-    }
-
-    /**
-     * This method is only for debugging.
-     * It verifies whether the tree is internally consistent with respect to the mMaxEnd cached on each node.
-     * @throws IllegalStateException If an inconsistency is detected.
-     */
-    public void checkMaxEnds() {
-        if (mRoot != null) mRoot.checkMaxEnd();
-    }
-
-    /**
-     * This method draws a nested picture of the tree on System.out.
-     * Useful for debugging.
-     */
-    public void printTree() {
-        if (mRoot != null) mRoot.printNode();
-    }
-
-    void removeNode( final Node<V> node )
-    {
-        mRoot = node.remove(mRoot);
-    }
-
-    private Node<V> mRoot;
-    private V mSentinel;
-
-    public static class Node<V1>
-    {
-        // bit-wise definitions from which the other constants are composed
-        public static final int HAS_LESSER_PART = 1;
-        public static final int HAS_OVERLAPPING_PART = 2;
-        public static final int HAS_GREATER_PART = 4;
-        public static final int IS_ADJACENT_AND_EMPTY = 0;
-        public static final int IS_STRICTLY_LESS = HAS_LESSER_PART; // 1
-        public static final int IS_SUBSET = HAS_OVERLAPPING_PART; // 2
-        public static final int IS_LEFT_OVERHANGING_OVERLAPPER = HAS_LESSER_PART | HAS_OVERLAPPING_PART; // 3
-        public static final int IS_STRICTLY_GREATER = HAS_GREATER_PART; // 4
-        // there is no value that equals 5, since that would imply overhanging on left and right without overlapping
-        public static final int IS_RIGHT_OVERHANGING_OVERLAPPER = HAS_GREATER_PART | HAS_OVERLAPPING_PART; // 6
-        public static final int IS_SUPERSET = HAS_LESSER_PART | HAS_OVERLAPPING_PART | HAS_GREATER_PART; // 7
-
-        Node( final int start, final int end, final V1 value )
-        {
-            mStart = start;
-            mEnd = end;
-            mValue = value;
-            mSize = 1;
-            mMaxEnd = mEnd;
-            mIsBlack = true;
-        }
-
-        Node( final Node<V1> parent, final int start, final int end, final V1 value )
-        {
-            mParent = parent;
-            mStart = start;
-            mEnd = end;
-            mValue = value;
-            mMaxEnd = mEnd;
-            mSize = 1;
-        }
-
-        public int getStart()
-        {
-            return mStart;
-        }
-
-        public int getEnd()
-        {
-            return mEnd;
-        }
-
-        public int getLength()
-        {
-            return mEnd - mStart;
-        }
-
-        public int getRelationship( final Node<V1> interval )
-        {
-            int result = 0;
-            if ( mStart < interval.getStart() )
-                result = HAS_LESSER_PART;
-            if ( mEnd > interval.getEnd() )
-                result |= HAS_GREATER_PART;
-            if ( mStart < interval.getEnd() && interval.getStart() < mEnd )
-                result |= HAS_OVERLAPPING_PART;
-            return result;
-        }
-
-        public boolean isAdjacent( final Node<V1> interval )
-        {
-            return mStart == interval.getEnd() || mEnd == interval.getStart();
-        }
-
-        public V1 getValue()
-        {
-            return mValue;
-        }
-
-        public V1 setValue( final V1 value )
-        {
-            final V1 result = mValue;
-            mValue = value;
-            return result;
-        }
-
-        int getSize()
-        {
-            return mSize;
-        }
-
-        int getMaxEnd()
-        {
-            return mMaxEnd;
-        }
-
-        Node<V1> getLeft()
-        {
-            return mLeft;
-        }
-
-        Node<V1> insertLeft( final int start, final int end, final V1 value, final Node<V1> root )
-        {
-            mLeft = new Node<V1>(this,start,end,value);
-            return insertFixup(mLeft,root);
-        }
-
-        Node<V1> getRight()
-        {
-            return mRight;
-        }
-
-        Node<V1> insertRight( final int start, final int end, final V1 value, final Node<V1> root )
-        {
-            mRight = new Node<V1>(this,start,end,value);
-            return insertFixup(mRight,root);
-        }
-
-        Node<V1> getNext()
-        {
-            Node<V1> result;
-
-            if ( mRight != null )
-            {
-                result = mRight;
-                while ( result.mLeft != null )
-                {
-                    result = result.mLeft;
-                }
-            }
-            else
-            {
-                Node<V1> node = this;
-                result = mParent;
-                while ( result != null && node == result.mRight )
-                {
-                    node = result;
-                    result = result.mParent;
-                }
-            }
-
-            return result;
-        }
-
-        Node<V1> getPrev()
-        {
-            Node<V1> result;
-
-            if ( mLeft != null )
-            {
-                result = mLeft;
-                while ( result.mRight != null )
-                {
-                    result = result.mRight;
-                }
-            }
-            else
-            {
-                Node<V1> node = this;
-                result = mParent;
-                while ( result != null && node == result.mLeft )
-                {
-                    node = result;
-                    result = result.mParent;
-                }
-            }
-
-            return result;
-        }
-
-        boolean wasRemoved()
-        {
-            return mSize == 0;
-        }
-
-        Node<V1> remove( Node<V1> root )
-        {
-            if ( mSize == 0 )
-            {
-                throw new IllegalStateException("Entry was already removed.");
-            }
-
-            if ( mLeft == null )
-            {
-                if ( mRight == null )
-                { // no children
-                    if ( mParent == null )
-                    {
-                        root = null;
-                    }
-                    else if ( mParent.mLeft == this )
-                    {
-                        mParent.mLeft = null;
-                        fixup(mParent);
-
-                        if ( mIsBlack )
-                            root = removeFixup(mParent,null,root);
-                    }
-                    else
-                    {
-                        mParent.mRight = null;
-                        fixup(mParent);
-
-                        if ( mIsBlack )
-                            root = removeFixup(mParent,null,root);
-                    }
-                }
-                else
-                { // single child on right
-                    root = spliceOut(mRight,root);
-                }
-            }
-            else if ( mRight == null )
-            { // single child on left
-                root = spliceOut(mLeft,root);
-            }
-            else
-            { // two children
-                final Node<V1> next = getNext();
-                root = next.remove(root);
-
-                // put next into tree in same position as this, effectively removing this
-                if ( (next.mParent = mParent) == null )
-                    root = next;
-                else if ( mParent.mLeft == this )
-                    mParent.mLeft = next;
-                else
-                    mParent.mRight = next;
-
-                if ( (next.mLeft = mLeft) != null )
-                {
-                    mLeft.mParent = next;
-                }
-
-                if ( (next.mRight = mRight) != null )
-                {
-                    mRight.mParent = next;
-                }
-
-                next.mIsBlack = mIsBlack;
-                next.mSize = mSize;
-
-                // PIC-123 fix
-                fixup(next);
-            }
-
-            mSize = 0;
-            return root;
-        }
-
-        // backwards comparison!  compares start+end to this.
-        int compare( final int start, final int end )
-        {
-            int result = 0;
-
-            if ( start > mStart )
-                result = 1;
-            else if ( start < mStart )
-                result = -1;
-            else if ( end > mEnd )
-                result = 1;
-            else if ( end < mEnd )
-                result = -1;
-
-            return result;
-        }
-
-        @SuppressWarnings("null")
-        static <V1> Node<V1> getNextOverlapper( Node<V1> node, final int start, final int end )
-        {
-            do
-            {
-                Node<V1> nextNode = node.mRight;
-                if ( nextNode != null && nextNode.mMaxEnd >= start )
-                {
-                    node = nextNode;
-                    while ( (nextNode = node.mLeft) != null && nextNode.mMaxEnd >= start )
-                        node = nextNode;
-                }
-                else
-                {
-                    nextNode = node;
-                    while ( (node = nextNode.mParent) != null && node.mRight == nextNode )
-                        nextNode = node;
-                }
-
-                if ( node != null && node.mStart > end )
-                    node = null;
-            }
-            while ( node != null && !(node.mStart <= end && start <= node.mEnd) );
-
-            return node;
-        }
-
-        static <V1> Node<V1> findByRank( Node<V1> node, int rank )
-        {
-            while ( node != null )
-            {
-                final int nodeRank = node.getRank();
-                if ( rank == nodeRank )
-                    break;
-
-                if ( rank < nodeRank )
-                {
-                    node = node.mLeft;
-                }
-                else
-                {
-                    node = node.mRight;
-                    rank -= nodeRank;
-                }
-            }
-
-            return node;
-        }
-
-        static <V1> int getRank( Node<V1> node, final int start, final int end )
-        {
-            int rank = 0;
-
-            while ( node != null )
-            {
-                final int cmpVal = node.compare(start,end);
-                if ( cmpVal < 0 )
-                {
-                    node = node.mLeft;
-                }
-                else
-                {
-                    rank += node.getRank();
-                    if ( cmpVal == 0 )
-                        return rank; // EARLY RETURN!!!
-
-                    node = node.mRight;
-                }
-            }
-
-            return 0;
-        }
-
-        private int getRank()
-        {
-            int result = 1;
-            if ( mLeft != null )
-                result = mLeft.mSize + 1;
-            return result;
-        }
-
-        private Node<V1> spliceOut( final Node<V1> child, Node<V1> root )
-        {
-            if ( (child.mParent = mParent) == null )
-            {
-                root = child;
-                child.mIsBlack = true;
-            }
-            else
-            {
-                if ( mParent.mLeft == this )
-                    mParent.mLeft = child;
-                else
-                    mParent.mRight = child;
-                fixup(mParent);
-
-                if ( mIsBlack )
-                    root = removeFixup(mParent,child,root);
-            }
-
-            return root;
-        }
-
-        private Node<V1> rotateLeft( Node<V1> root )
-        {
-            final Node<V1> child = mRight;
-
-            final int childSize = child.mSize;
-            child.mSize = mSize;
-            mSize -= childSize;
-
-            if ( (mRight = child.mLeft) != null )
-            {
-                mRight.mParent = this;
-                mSize += mRight.mSize;
-            }
-
-            if ( (child.mParent = mParent) == null )
-                root = child;
-            else if ( this == mParent.mLeft )
-                mParent.mLeft = child;
-            else
-                mParent.mRight = child;
-
-            child.mLeft = this;
-            mParent = child;
-
-            setMaxEnd();
-            child.setMaxEnd();
-
-            return root;
-        }
-
-        private Node<V1> rotateRight( Node<V1> root )
-        {
-            final Node<V1> child = mLeft;
-
-            final int childSize = child.mSize;
-            child.mSize = mSize;
-            mSize -= childSize;
-
-            if ( (mLeft = child.mRight) != null )
-            {
-                mLeft.mParent = this;
-                mSize += mLeft.mSize;
-            }
-
-            if ( (child.mParent = mParent) == null )
-                root = child;
-            else if ( this == mParent.mLeft )
-                mParent.mLeft = child;
-            else
-                mParent.mRight = child;
-
-            child.mRight = this;
-            mParent = child;
-
-            setMaxEnd();
-            child.setMaxEnd();
-
-            return root;
-        }
-
-        private void setMaxEnd()
-        {
-            mMaxEnd = mEnd;
-            if ( mLeft != null )
-                mMaxEnd = Math.max(mMaxEnd,mLeft.mMaxEnd);
-            if ( mRight != null )
-                mMaxEnd = Math.max(mMaxEnd,mRight.mMaxEnd);
-        }
-
-        private static <V1> void fixup( Node<V1> node )
-        {
-            do
-            {
-                node.mSize = 1;
-                node.mMaxEnd = node.mEnd;
-                if ( node.mLeft != null )
-                {
-                    node.mSize += node.mLeft.mSize;
-                    node.mMaxEnd = Math.max(node.mMaxEnd,node.mLeft.mMaxEnd);
-                }
-                if ( node.mRight != null )
-                {
-                    node.mSize += node.mRight.mSize;
-                    node.mMaxEnd = Math.max(node.mMaxEnd,node.mRight.mMaxEnd);
-                }
-            }
-            while ( (node = node.mParent) != null );
-        }
-
-        private static <V1> Node<V1> insertFixup( Node<V1> daughter, Node<V1> root )
-        {
-            Node<V1> mom = daughter.mParent;
-            fixup(mom);
-
-            while( mom != null && !mom.mIsBlack )
-            {
-                final Node<V1> gramma = mom.mParent;
-                Node<V1> auntie = gramma.mLeft;
-                if ( auntie == mom )
-                {
-                    auntie = gramma.mRight;
-                    if ( auntie != null && !auntie.mIsBlack )
-                    {
-                        mom.mIsBlack = true;
-                        auntie.mIsBlack = true;
-                        gramma.mIsBlack = false;
-                        daughter = gramma;
-                    }
-                    else
-                    {
-                        if ( daughter == mom.mRight )
-                        {
-                            root = mom.rotateLeft(root);
-                            mom = daughter;
-                        }
-                        mom.mIsBlack = true;
-                        gramma.mIsBlack = false;
-                        root = gramma.rotateRight(root);
-                        break;
-                    }
-                }
-                else
-                {
-                    if ( auntie != null && !auntie.mIsBlack )
-                    {
-                        mom.mIsBlack = true;
-                        auntie.mIsBlack = true;
-                        gramma.mIsBlack = false;
-                        daughter = gramma;
-                    }
-                    else
-                    {
-                        if ( daughter == mom.mLeft )
-                        {
-                            root = mom.rotateRight(root);
-                            mom = daughter;
-                        }
-                        mom.mIsBlack = true;
-                        gramma.mIsBlack = false;
-                        root = gramma.rotateLeft(root);
-                        break;
-                    }
-                }
-                mom = daughter.mParent;
-            }
-            root.mIsBlack = true;
-            return root;
-        }
-
-        private static <V1> Node<V1> removeFixup( Node<V1> parent, Node<V1> node, Node<V1> root )
-        {
-            do
-            {
-                if ( node == parent.mLeft )
-                {
-                    Node<V1> sister = parent.mRight;
-                    if ( !sister.mIsBlack )
-                    {
-                        sister.mIsBlack = true;
-                        parent.mIsBlack = false;
-                        root = parent.rotateLeft(root);
-                        sister = parent.mRight;
-                    }
-                    if ( (sister.mLeft == null || sister.mLeft.mIsBlack) && (sister.mRight == null || sister.mRight.mIsBlack) )
-                    {
-                        sister.mIsBlack = false;
-                        node = parent;
-                    }
-                    else
-                    {
-                        if ( sister.mRight == null || sister.mRight.mIsBlack )
-                        {
-                            sister.mLeft.mIsBlack = true;
-                            sister.mIsBlack = false;
-                            root = sister.rotateRight(root);
-                            sister = parent.mRight;
-                        }
-                        sister.mIsBlack = parent.mIsBlack;
-                        parent.mIsBlack = true;
-                        sister.mRight.mIsBlack = true;
-                        root = parent.rotateLeft(root);
-                        node = root;
-                    }
-                }
-                else
-                {
-                    Node<V1> sister = parent.mLeft;
-                    if ( !sister.mIsBlack )
-                    {
-                        sister.mIsBlack = true;
-                        parent.mIsBlack = false;
-                        root = parent.rotateRight(root);
-                        sister = parent.mLeft;
-                    }
-                    if ( (sister.mLeft == null || sister.mLeft.mIsBlack) && (sister.mRight == null || sister.mRight.mIsBlack) )
-                    {
-                        sister.mIsBlack = false;
-                        node = parent;
-                    }
-                    else
-                    {
-                        if ( sister.mLeft == null || sister.mLeft.mIsBlack )
-                        {
-                            sister.mRight.mIsBlack = true;
-                            sister.mIsBlack = false;
-                            root = sister.rotateLeft(root);
-                            sister = parent.mLeft;
-                        }
-                        sister.mIsBlack = parent.mIsBlack;
-                        parent.mIsBlack = true;
-                        sister.mLeft.mIsBlack = true;
-                        root = parent.rotateRight(root);
-                        node = root;
-                    }
-                }
-                parent = node.mParent;
-            }
-            while ( parent != null && node.mIsBlack );
-
-            node.mIsBlack = true;
-            return root;
-        }
-
-        public void checkMaxEnd() {
-            if (mMaxEnd != calcMaxEnd()) {
-                throw new IllegalStateException("Max end mismatch " + mMaxEnd + " vs " + calcMaxEnd() + ": " + this);
-            }
-            if (mLeft != null) mLeft.checkMaxEnd();
-            if (mRight != null) mRight.checkMaxEnd();
-        }
-
-        private int calcMaxEnd() {
-            int end = mEnd;
-            if (mLeft != null) end = Math.max(end, mLeft.mMaxEnd);
-            if (mRight != null) end = Math.max(end, mRight.mMaxEnd);
-            return end;
-        }
-
-        public void printNode() {
-            this.printNodeInternal("", "root: ");
-        }
-
-        private void printNodeInternal(final String padding, final String tag) {
-            System.out.println(padding + tag + " " + this);
-            if (mLeft != null) mLeft.printNodeInternal(padding + "  ", "left: ");
-            if (mRight != null) mRight.printNodeInternal(padding + "  ", "right:");
-        }
-
-        public String toString() {
-            return "Node(" + mStart + "," + mEnd + "," + mValue + "," + mSize + "," + mMaxEnd + "," + mIsBlack + ")";
-        }
-
-        private Node<V1> mParent;
-        private Node<V1> mLeft;
-        private Node<V1> mRight;
-        private final int mStart;
-        private final int mEnd;
-        private V1 mValue;
-        private int mSize;
-        private int mMaxEnd;
-        private boolean mIsBlack;
-    }
-
-    public class FwdIterator
-        implements Iterator<Node<V>>
-    {
-        public FwdIterator( final Node<V> node )
-        {
-            mNext = node;
-        }
-
-        public boolean hasNext()
-        {
-            return mNext != null;
-        }
-
-        public Node<V> next()
-        {
-            if ( mNext == null )
-            {
-                throw new NoSuchElementException("No next element.");
-            }
-
-            if ( mNext.wasRemoved() )
-            {
-                mNext = min(mNext.getStart(),mNext.getEnd());
-                if ( mNext == null )
-                    throw new ConcurrentModificationException("Current element was removed, and there are no more elements.");
-            }
-            mLast = mNext;
-            mNext = mNext.getNext();
-            return mLast;
-        }
-
-        public void remove()
-        {
-            if ( mLast == null )
-            {
-                throw new IllegalStateException("No entry to remove.");
-            }
-
-            removeNode(mLast);
-            mLast = null;
-        }
-
-        private Node<V> mNext;
-        private Node<V> mLast;
-    }
-
-    public class RevIterator
-        implements Iterator<Node<V>>
-    {
-        public RevIterator( final Node<V> node )
-        {
-            mNext = node;
-        }
-
-        public boolean hasNext()
-        {
-            return mNext != null;
-        }
-
-        public Node<V> next()
-        {
-            if ( mNext == null )
-                throw new NoSuchElementException("No next element.");
-            if ( mNext.wasRemoved() )
-            {
-                mNext = max(mNext.getStart(),mNext.getEnd());
-                if ( mNext == null )
-                    throw new ConcurrentModificationException("Current element was removed, and there are no more elements.");
-            }
-            mLast = mNext;
-            mNext = mNext.getPrev();
-            return mLast;
-        }
-
-        public void remove()
-        {
-            if ( mLast == null )
-            {
-                throw new IllegalStateException("No entry to remove.");
-            }
-
-            removeNode(mLast);
-            mLast = null;
-        }
-
-        private Node<V> mNext;
-        private Node<V> mLast;
-    }
-
-    public class OverlapIterator
-        implements Iterator<Node<V>>
-    {
-        public OverlapIterator( final int start, final int end )
-        {
-            mNext = minOverlapper(start,end);
-            mStart = start;
-            mEnd = end;
-        }
-
-        public boolean hasNext()
-        {
-            return mNext != null;
-        }
-
-        public Node<V> next()
-        {
-            if ( mNext == null )
-            {
-                throw new NoSuchElementException("No next element.");
-            }
-
-            if ( mNext.wasRemoved() )
-            {
-                throw new ConcurrentModificationException("Current element was removed.");
-            }
-
-            mLast = mNext;
-            mNext = Node.getNextOverlapper(mNext,mStart,mEnd);
-            return mLast;
-        }
-
-        public void remove()
-        {
-            if ( mLast == null )
-            {
-                throw new IllegalStateException("No entry to remove.");
-            }
-
-            removeNode(mLast);
-            mLast = null;
-        }
-
-        private Node<V> mNext;
-        private Node<V> mLast;
-        private final int mStart;
-        private final int mEnd;
-    }
-
-    public static class ValuesIterator<V1>
-        implements Iterator<V1>
-    {
-        public ValuesIterator( final Iterator<Node<V1>> itr )
-        {
-            mItr = itr;
-        }
-
-        public boolean hasNext()
-        {
-            return mItr.hasNext();
-        }
-
-        public V1 next()
-        {
-            return mItr.next().getValue();
-        }
-
-        public void remove()
-        {
-            mItr.remove();
-        }
-
-        private final Iterator<Node<V1>> mItr;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IntervalTreeMap.java b/src/main/java/htsjdk/samtools/util/IntervalTreeMap.java
deleted file mode 100644
index ffeae94..0000000
--- a/src/main/java/htsjdk/samtools/util/IntervalTreeMap.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import java.util.AbstractMap;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * Utility class that implements an interval map.
- * This class functions as a java map but also supports efficient interval overlap queries.
- *
- * @author Bob Handsaker
- */
-public class IntervalTreeMap<T>
-    extends AbstractMap<Interval, T>
-{
-    private final Map<String, IntervalTree<T>> mSequenceMap = new HashMap<String, IntervalTree<T>>();
-    private final EntrySet mEntrySet = new EntrySet();
-
-    public IntervalTree<T> debugGetTree(final String sequence) {
-        return mSequenceMap.get(sequence);
-    }
-
-    public IntervalTreeMap() {
-    }
-
-    public IntervalTreeMap(final Map<? extends Interval, ? extends T> map) {
-        for (final Map.Entry<? extends Interval, ? extends T> entry : map.entrySet()) {
-            put(entry.getKey(), entry.getValue());
-        }
-    }
-
-    public void clear() {
-        mSequenceMap.clear();
-    }
-
-    public boolean containsKey(final Object object) {
-        if (!(object instanceof Interval)) {
-            return false;
-        }
-        return containsKey((Interval) object);
-    }
-
-    public boolean containsKey(final Interval key) {
-        final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
-        if (tree == null) {
-            return false;
-        }
-        return (tree.find(key.getStart(), key.getEnd()) != null);
-    }
-
-    public Set<Entry<Interval, T>> entrySet() {
-        return mEntrySet;
-    }
-
-    @SuppressWarnings("rawtypes")
-	public boolean equals(final Object o) {
-        if (!(o instanceof IntervalTreeMap)) {
-            return false;
-        }
-        return mSequenceMap.equals(((IntervalTreeMap)o).mSequenceMap);
-    }
-
-    public int hashCode() {
-        return mSequenceMap.hashCode();
-    }
-
-    public T get(final Object object) {
-        if (!(object instanceof Interval)) {
-            return null;
-        }
-        return get((Interval) object);
-    }
-
-    public T get(final Interval key) {
-        final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
-        if (tree == null) {
-            return null;
-        }
-        final IntervalTree.Node<T> node = tree.find(key.getStart(), key.getEnd());
-        if (node == null) {
-            return null;
-        }
-        return node.getValue();
-    }
-
-    public boolean isEmpty() {
-        for (final IntervalTree<T> tree : mSequenceMap.values()) {
-            if (tree.size() > 0) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public T put(final Interval key, final T value) {
-        IntervalTree<T> tree = mSequenceMap.get(key.getContig());
-        if (tree == null) {
-            tree = new IntervalTree<T>();
-            mSequenceMap.put(key.getContig(), tree);
-        }
-        return tree.put(key.getStart(), key.getEnd(), value);
-    }
-
-    public T remove(final Object object) {
-        if (!(object instanceof Interval)) {
-            return null;
-        }
-        return remove((Interval)object);
-    }
-
-    public T remove(final Interval key) {
-        final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
-        if (tree == null) {
-            return null;
-        }
-        return tree.remove(key.getStart(), key.getEnd());
-    }
-
-    public int size() {
-        // Note: We should think about caching the size to avoid having to recompute it.
-        int size = 0;
-        for (final IntervalTree<T> tree : mSequenceMap.values()) {
-            size += tree.size();
-        }
-        return size;
-    }
-    /**
-     * Test overlapping interval 
-     * @param key the interval
-     * @return true if it contains an object overlapping the interval 
-     */
-    public boolean containsOverlapping(final Interval key) {
-        final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
-        return tree!=null && tree.overlappers(key.getStart(), key.getEnd()).hasNext();
-    	}
-    
-    
-    public Collection<T> getOverlapping(final Interval key) {
-        final List<T> result = new ArrayList<T>();
-        final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
-        if (tree != null) {
-            final Iterator<IntervalTree.Node<T>> iterator = tree.overlappers(key.getStart(), key.getEnd());
-            while (iterator.hasNext()) {
-                result.add(iterator.next().getValue());
-            }
-        }
-        return result;
-    }
-    /**
-     * Test if this contains an object that is contained by 'key'
-     * @param key the interval
-     * @return true if it contains an object is contained by 'key'
-     */
-    public boolean containsContained(final Interval key) {
-        final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
-        if(tree==null) return false;
-            final Iterator<IntervalTree.Node<T>> iterator = tree.overlappers(key.getStart(), key.getEnd());
-            while (iterator.hasNext()) {
-                final IntervalTree.Node<T> node = iterator.next();
-                if (node.getStart() >= key.getStart() && node.getEnd() <= key.getEnd()) {
-                    return true;
-                }
-            }
-        return false;
-    }
-    
-    
-    public Collection<T> getContained(final Interval key) {
-        final List<T> result = new ArrayList<T>();
-        final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
-        if (tree != null) {
-            final Iterator<IntervalTree.Node<T>> iterator = tree.overlappers(key.getStart(), key.getEnd());
-            while (iterator.hasNext()) {
-                final IntervalTree.Node<T> node = iterator.next();
-                if (node.getStart() >= key.getStart() && node.getEnd() <= key.getEnd()) {
-                    result.add(node.getValue());
-                }
-            }
-        }
-        return result;
-    }
-
-    private class EntrySet
-        extends AbstractSet<Map.Entry<Interval,T>> {
-
-        public void clear() {
-           IntervalTreeMap.this.clear();
-        }
-
-        public boolean contains(final Map.Entry<Interval,T> entry) {
-            if (entry == null) {
-                return false;
-            }
-            return entry.getValue().equals(IntervalTreeMap.this.get(entry.getKey()));
-        }
-
-        public boolean isEmpty() {
-            return IntervalTreeMap.this.isEmpty();
-        }
-
-        public Iterator<Map.Entry<Interval,T>> iterator() {
-            return new EntryIterator();
-        }
-
-        @SuppressWarnings("unchecked")
-        public boolean remove(final Object object) {
-            // Note: Could not figure out how to eliminate the unchecked cast.
-            if (!(object instanceof Map.Entry)) {
-                return false;
-            }
-            return remove((Map.Entry<Interval,T>)object);
-        }
-
-        public boolean remove(final Map.Entry<Interval,T> entry) {
-            if (this.contains(entry)) {
-                IntervalTreeMap.this.remove(entry.getKey());
-                return true;
-            } else {
-                return false;
-            }
-        }
-
-        public int size() {
-            return IntervalTreeMap.this.size();
-        }
-    }
-
-    private class EntryIterator
-        implements Iterator<Map.Entry<Interval, T>> {
-
-        private String mSequence = null;
-        private Iterator<String> mSequenceIterator = null;
-        private Iterator<IntervalTree.Node<T>> mTreeIterator = null;
-
-        EntryIterator() {
-            mSequenceIterator = mSequenceMap.keySet().iterator();
-            advanceSequence();
-        }
-
-        public boolean hasNext() {
-            return (mTreeIterator != null && mTreeIterator.hasNext());
-        }
-
-        public Map.Entry<Interval,T> next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException("Iterator exhausted");
-            }
-            final IntervalTree.Node<T> node = mTreeIterator.next();
-            final String sequence = mSequence;
-            if (!mTreeIterator.hasNext()) {
-                advanceSequence();
-            }
-            final Interval key = new Interval(sequence, node.getStart(), node.getEnd());
-            final T value = node.getValue();
-            return new MapEntry(key, value);
-        }
-
-        public void remove() {
-            if (mTreeIterator == null) {
-                throw new IllegalStateException("Iterator.next() has not been called");
-            }
-            mTreeIterator.remove();
-        }
-
-        private void advanceSequence() {
-            while (mSequenceIterator.hasNext()) {
-                mSequence = mSequenceIterator.next();
-                mTreeIterator = mSequenceMap.get(mSequence).iterator();
-                if (mTreeIterator.hasNext()) {
-                    break;
-                }
-            }
-        }
-    }
-
-    private class MapEntry
-        implements Map.Entry<Interval,T> {
-
-        private final Interval mKey;
-        private T mValue;
-
-        MapEntry(final Interval key, final T value) {
-            mKey = key;
-            mValue = value;
-        }
-
-        public Interval getKey() {
-            return mKey;
-        }
-
-        public T getValue() {
-            return mValue;
-        }
-
-        public T setValue(final T value) {
-            mValue = value;
-            return IntervalTreeMap.this.put(mKey, mValue);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IntervalUtil.java b/src/main/java/htsjdk/samtools/util/IntervalUtil.java
deleted file mode 100644
index d761707..0000000
--- a/src/main/java/htsjdk/samtools/util/IntervalUtil.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceDictionary;
-
-import java.util.Iterator;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class IntervalUtil {
-
-    /** Return true if the sequence/position lie in the provided interval. */
-    public static boolean contains(final Interval interval, final String sequenceName, final long position) {
-        return interval.getContig().equals(sequenceName) && (position >= interval.getStart() && position <= interval.getEnd());
-    }
-
-    /** Return true if the sequence/position lie in the provided interval list. */
-    public static boolean contains(final IntervalList intervalList, final String sequenceName, final long position) {
-        for (final Interval interval : intervalList.uniqued().getIntervals()) {
-            if (contains(interval, sequenceName, position))
-                return true;
-        }
-        return false;
-    }
-
-    /**
-     * Throws RuntimeException if the given intervals are not locus ordered and non-overlapping
-     *
-     * @param intervals
-     * @param sequenceDictionary used to determine order of sequences
-     */
-    public static void assertOrderedNonOverlapping(final Iterator<Interval> intervals, final SAMSequenceDictionary sequenceDictionary) {
-        if (!intervals.hasNext()) {
-            return;
-        }
-        Interval prevInterval = intervals.next();
-        int prevSequenceIndex = sequenceDictionary.getSequenceIndex(prevInterval.getContig());
-        while (intervals.hasNext()) {
-            final Interval interval = intervals.next();
-            if (prevInterval.intersects(interval)) {
-                throw new SAMException("Intervals should not overlap: " + prevInterval + "; " + interval);
-            }
-            final int thisSequenceIndex = sequenceDictionary.getSequenceIndex(interval.getContig());
-            if (prevSequenceIndex > thisSequenceIndex ||
-                    (prevSequenceIndex == thisSequenceIndex && prevInterval.compareTo(interval) >= 0)) {
-                throw new SAMException("Intervals not in order: " + prevInterval + "; " + interval);
-            }
-            prevInterval = interval;
-            prevSequenceIndex = thisSequenceIndex;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Iso8601Date.java b/src/main/java/htsjdk/samtools/util/Iso8601Date.java
deleted file mode 100644
index 9128867..0000000
--- a/src/main/java/htsjdk/samtools/util/Iso8601Date.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * Use this type rather than java.util.Date in command-line options in order to get ISO 8601 parsing.
- * The ctors below truncate milliseconds, since our formatter does not write them.  Note that it is possible
- * to modify an Iso8601Date so that it has fractional seconds, but that is discouraged.
- *
- * @author alecw at broadinstitute.org
- */
-public class Iso8601Date extends Date {
-    private static final ThreadLocal<DateFormat> iso8601DateFormatter = new ThreadLocal<DateFormat>() {
-        protected synchronized DateFormat initialValue() {
-            return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
-        }
-    };
-
-    public Iso8601Date(final String dateStr) {
-        super(DateParser.parse(dateStr).getTime());
-        truncateMilliseconds();
-    }
-
-    public Iso8601Date(final Date date) {
-        super(date.getTime());
-        truncateMilliseconds();
-    }
-
-    public String toString() {
-        return iso8601DateFormatter.get().format(this);
-    }
-
-    private void truncateMilliseconds() {
-        long time = getTime();
-        long mod = time % 1000;
-        if (mod != 0) {
-            super.setTime(time - mod);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IterableAdapter.java b/src/main/java/htsjdk/samtools/util/IterableAdapter.java
deleted file mode 100644
index f31d6b1..0000000
--- a/src/main/java/htsjdk/samtools/util/IterableAdapter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.util.ConcurrentModificationException;
-import java.util.Iterator;
-
-/**
- * Provides an adapter to wrap an Iterator with an Iterable, allowing it to be run through a foreach loop. Will only
- * allow iterator() to be called a single time - this is intended to be called inline.
- *
- * @author jgentry at broadinstitute.org
- */
-public class IterableAdapter<T> implements Iterable<T> {
-    private boolean isIteratorCalled = false;
-    private final Iterator<T> theIterator;
-
-    public IterableAdapter(final Iterator<T> theIterator) {
-        this.theIterator = theIterator;
-    }
-
-    @Override
-    public Iterator<T> iterator() {
-        if (isIteratorCalled) {
-            throw new ConcurrentModificationException("iterator() can only be called once!");
-        }
-
-        isIteratorCalled = true;
-        return theIterator;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IterableOnceIterator.java b/src/main/java/htsjdk/samtools/util/IterableOnceIterator.java
deleted file mode 100644
index 5ca4bc1..0000000
--- a/src/main/java/htsjdk/samtools/util/IterableOnceIterator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.Iterator;
-
-/**
- * Abstract implementation of an iterator that also implements Iterable (to return itself)
- * so that it can be used if for() loops.  Only supports calling iterator() once since new
- * iterators are not manufactured but the same object returned.
- *
- * @author Tim Fennell
- */
-public abstract class IterableOnceIterator<T> implements Iterable<T>, Iterator<T>, Closeable {
-    private boolean iterated = false;
-
-    /**
-     * On the first call returns this object which is also an iterator.  On subsequent calls throws
-     * an exception since new iterators cannot be generated.
-     */
-    @Override
-    public Iterator<T> iterator() {
-        if (iterated) {
-            throw new IllegalStateException("May not call iterator() more than once on IterableOnceIterator.");
-        }
-        else {
-            iterated = true;
-            return this;
-        }
-    }
-
-    /** Operation not supported. */
-    @Override
-    public void remove() {
-        throw new UnsupportedOperationException("remove() not supported");
-    }
-
-    /** Does nothing, intended to be overridden when needed. */
-    @Override public void close() throws IOException {
-        // Default do nothing implementation
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Iterables.java b/src/main/java/htsjdk/samtools/util/Iterables.java
deleted file mode 100644
index 46c8d5a..0000000
--- a/src/main/java/htsjdk/samtools/util/Iterables.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * @author mccowan
- */
-public class Iterables {
-    private Iterables() {
-        
-    }
-
-    public static <T> List<T> slurp(final Iterator<T> iterator) {
-        final List<T> ts = new ArrayList<T>();
-        while (iterator.hasNext()) ts.add(iterator.next());
-        return ts;
-    }
-
-    public static <T> List<T> slurp(final Iterable<T> iterable) {
-        return slurp(iterable.iterator());
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Lazy.java b/src/main/java/htsjdk/samtools/util/Lazy.java
deleted file mode 100644
index 13726b8..0000000
--- a/src/main/java/htsjdk/samtools/util/Lazy.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * Simple utility for building an on-demand (lazy) object-initializer.
- * 
- * Works by accepting an initializer describing how to build the on-demand object, which is only called once and only after the first
- * invocation of {@link #get()} (or it may not be called at all).
- * 
- * @author mccowan
- */
-public class Lazy<T> {
-    private final LazyInitializer<T> initializer;
-    private boolean isInitialized = false;
-    private T instance;
-
-    /** Simple cons */
-    public Lazy(final LazyInitializer<T> initializer) {
-        this.initializer = initializer;
-    }
-
-    /** Returns the instance associated with this {@link Lazy}, initializing it if necessary. */
-    public synchronized T get() {
-        if (!isInitialized) {
-            this.instance = initializer.make();
-            isInitialized = true;
-        }
-        return instance;
-    }
-
-    /** Describes how to build the instance of the lazy object. */
-    @FunctionalInterface
-    public interface LazyInitializer<T> {
-        /** Returns the desired object instance. */
-        T make();
-    }
-
-    public boolean isInitialized() {
-        return isInitialized;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/LineReader.java b/src/main/java/htsjdk/samtools/util/LineReader.java
deleted file mode 100644
index 0185700..0000000
--- a/src/main/java/htsjdk/samtools/util/LineReader.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.Closeable;
-
-/**
- * Interface allows for implementations that read lines from a String, an ASCII file, or somewhere else.
- */
-public interface LineReader extends Closeable{
-
-    /**
-     * Read a line and remove the line terminator
-     * @return the line read, or null if EOF has been reached.
-     */
-    String readLine();
-
-    /**
-     * @return 1-based number of line most recently read
-     */
-    int getLineNumber();
-
-    /**
-     * Non-destructive one-character look-ahead.
-     * @return If not eof, the next character that would be read.  If eof, -1.
-     */
-    int peek();
-
-    public void close();
-}
diff --git a/src/main/java/htsjdk/samtools/util/ListMap.java b/src/main/java/htsjdk/samtools/util/ListMap.java
deleted file mode 100755
index 385c2e8..0000000
--- a/src/main/java/htsjdk/samtools/util/ListMap.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * A Map class that holds a list of entries under each key instead of a single entry, and
- * provides utility methods for adding an entry under a key.
- *
- * @author Tim Fennell
- */
-public class ListMap<K,V> extends HashMap<K, List<V>> {
-    /** Adds a single value to the list stored under a key. */
-    public void add(K key, V value) {
-        List<V> values = get(key);
-        if (values == null) {
-            values = new ArrayList<V>();
-            put(key, values);
-        }
-
-        values.add(value);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Locatable.java b/src/main/java/htsjdk/samtools/util/Locatable.java
deleted file mode 100644
index 0d70090..0000000
--- a/src/main/java/htsjdk/samtools/util/Locatable.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * Any class that has a single logical mapping onto the genome should implement Locatable
- * positions should be reported as 1-based and closed at both ends
- *
- */
-public interface Locatable {
-
-    /**
-     * Gets the contig name for the contig this is mapped to.  May return null if there is no unique mapping.
-     * @return name of the contig this is mapped to, potentially null
-     */
-    String getContig();
-
-    /**
-     * @return 1-based start position, undefined if getContig() == null
-     */
-    int getStart();
-
-    /**
-     * @return 1-based closed-ended position, undefined if getContig() == null
-     */
-    int getEnd();
-}
diff --git a/src/main/java/htsjdk/samtools/util/LocationAware.java b/src/main/java/htsjdk/samtools/util/LocationAware.java
deleted file mode 100644
index 46e1d2d..0000000
--- a/src/main/java/htsjdk/samtools/util/LocationAware.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * Describes API for getting current position in a stream, writer, or underlying file.
- * 
- * The expected functionality is simple: if you are a output stream / writer, and you've written 50 bytes to the stream, then 
- * {@link #getPosition()} should return 50; if you are an input stream or file reader, and you've read 25 bytes from the object, then it 
- * should return 25.
- * 
- * In the context of an iterator or any producer-like object that doesn't map directly to a byte stream, {@link #getPosition()} should
- * return the position (in the underlying stream being read/written to) of the most-recently read/written element.  For example, if you
- * are reading lines from a file with a {@link htsjdk.tribble.readers.AsciiLineReaderIterator}, calling {@link #getPosition()} should return the byte position
- * of the start of the most recent line returned by {@link htsjdk.tribble.readers.AsciiLineReaderIterator#next()}.
- * 
- * @author mccowan
- */
-public interface LocationAware {
-    /**
-     * The current offset, in bytes, of this stream/writer/file.  Or, if this is an iterator/producer, the offset (in bytes) of the
-     * END of the most recently returned record (since a produced record corresponds to something that has been read already). See class
-     * javadoc for more.
-     *
-     * Note that for BGZF files, this does not represent an actually file position, but a virtual file pointer.
-     */
-    public long getPosition();
-}
diff --git a/src/main/java/htsjdk/samtools/util/Locus.java b/src/main/java/htsjdk/samtools/util/Locus.java
deleted file mode 100644
index 8012263..0000000
--- a/src/main/java/htsjdk/samtools/util/Locus.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Location info about a locus.
- *
- * @author Doug Voet (dvoet at broadinstitute dot org)
- */
-public interface Locus {
-    int getSequenceIndex();
-
-    /** @return 1-based position */
-    int getPosition();
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/util/LocusComparator.java b/src/main/java/htsjdk/samtools/util/LocusComparator.java
deleted file mode 100644
index e0f04d9..0000000
--- a/src/main/java/htsjdk/samtools/util/LocusComparator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * compares first by sequence index then by position
- *
- * @author Doug Voet (dvoet at broadinstitute dot org)
- */
-public class LocusComparator<T extends Locus> implements Comparator<T>, Serializable {
-    private static final long serialVersionUID = 1L;
-
-    public int compare(T thing1, T thing2) {
-        int refCompare = thing1.getSequenceIndex() - thing2.getSequenceIndex();
-        return refCompare == 0 ? thing1.getPosition() - thing2.getPosition() : refCompare;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/LocusImpl.java b/src/main/java/htsjdk/samtools/util/LocusImpl.java
deleted file mode 100644
index 8629078..0000000
--- a/src/main/java/htsjdk/samtools/util/LocusImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Simple implementation of Locus interface for ease of passing as an arg and comparing with other Locus implementations.
- * @author alecw at broadinstitute.org
- */
-public class LocusImpl implements Locus {
-    private final int sequenceIndex;
-    private final int position;
-
-    public LocusImpl(int sequenceIndex, int position) {
-        this.position = position;
-        this.sequenceIndex = sequenceIndex;
-    }
-
-    public int getSequenceIndex() {
-        return sequenceIndex;
-    }
-
-    /**
-     * @return 1-based position
-     */
-    public int getPosition() {
-        return position;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Log.java b/src/main/java/htsjdk/samtools/util/Log.java
deleted file mode 100644
index acbd3c4..0000000
--- a/src/main/java/htsjdk/samtools/util/Log.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.PrintStream;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Date;
-
-/**
- * <p>A <em>wafer thin</em> wrapper around System.err that uses var-args to make it
- * much more efficient to call the logging methods in without having to
- * surround every call site with calls to Log.isXXXEnabled().  All the methods on this
- * class take a variable length list of arguments and, only if logging is enabled for
- * the level and channel being logged to, will those arguments be toString()'d and
- * appended together.</p>
- *
- * @author Tim Fennell
- */
-public final class Log {
-    /** Enumeration for setting log levels. */
-    public static enum LogLevel { ERROR, WARNING, INFO, DEBUG }
-
-    private static LogLevel globalLogLevel = LogLevel.INFO;
-
-    private final Class<?> clazz;
-    private final String className;
-    private final PrintStream out = System.err;
-
-    /**
-     * Private constructor
-     */
-    private Log(final Class<?> clazz) {
-        this.clazz = clazz;
-        this.className = clazz.getSimpleName();
-    }
-
-    /**
-     * Get a Log instance to perform logging within the Class specified.  Returns an instance
-     * of this class which wraps an instance of the commons logging Log class.
-     * @param clazz the Class which is going to be doing the logging
-     * @return a Log instance with which to log
-     */
-    public static Log getInstance(final Class<?> clazz) {
-        return new Log(clazz);
-    }
-
-    public static void setGlobalLogLevel(final LogLevel logLevel) {
-        globalLogLevel = logLevel;
-    }
-
-    /** Returns true if the specified log level is enabled otherwise false. */
-    public static final boolean isEnabled(final LogLevel level) {
-        return level.ordinal() <= globalLogLevel.ordinal();
-    }
-
-    /**
-     * Private method that does the actual printing of messages to a PrintWriter. Outputs the log level,
-     * class name and parts followed by the stack trace if a throwable is provided.
-     *
-     * @param level the Log level being logged at
-     * @param throwable a Throwable if one is available otherwise null
-     * @param parts the parts of the message to be concatenated
-     */
-    private void emit(final LogLevel level, final Throwable throwable, final Object... parts) {
-        if (isEnabled(level)) {
-        	StringBuffer tmp = new StringBuffer();
-            tmp.append(level.name())
-                    .append('\t')
-                    .append(getTimestamp())
-                    .append('\t')
-                    .append(this.className)
-                    .append('\t');
-
-            for (final Object part : parts) {
-                if (part != null && part.getClass().isArray()) {
-                    final Class<?> component = part.getClass().getComponentType();
-                    if (component.equals(Boolean.TYPE))        tmp.append(Arrays.toString( (boolean[]) part));
-                    else if (component.equals(Byte.TYPE))      tmp.append(Arrays.toString( (byte[]) part));
-                    else if (component.equals(Character.TYPE)) tmp.append(Arrays.toString( (char[]) part));
-                    else if (component.equals(Double.TYPE))    tmp.append(Arrays.toString( (double[]) part));
-                    else if (component.equals(Float.TYPE))     tmp.append(Arrays.toString( (float[]) part));
-                    else if (component.equals(Integer.TYPE))   tmp.append(Arrays.toString( (int[]) part));
-                    else if (component.equals(Long.TYPE))      tmp.append(Arrays.toString( (long[]) part));
-                    else if (component.equals(Short.TYPE))     tmp.append(Arrays.toString( (short[]) part));
-                    else tmp.append(Arrays.toString( (Object[]) part));
-                }
-                else {
-                    tmp.append(part);
-                }
-            }
-
-            // Print out the exception if there is one
-            if (throwable != null) {
-             	synchronized (this.out) {
-                    this.out.println(tmp.toString());
-                    throwable.printStackTrace(this.out);
-             	}
-            }
-            else {
-                this.out.println(tmp.toString());
-            }
-        }
-    }
-
-    /**
-     * Creates a date string for insertion into the log.  Given that logs are sometimes held statically
-     * and SimpleDateFormat is not thread safe, currently creates an instance each time :/
-     */
-    protected String getTimestamp() {
-        final DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        return fmt.format(new Date());
-    }
-
-    /**
-     * Logs a Throwable and optional message parts at level error.
-     * @param throwable an instance of Throwable that should be logged with stack trace
-     * @param messageParts zero or more objects which should be combined, by calling toString()
-     *        to form the log message.
-     */
-    public final void error(final Throwable throwable, final Object... messageParts) {
-        emit(LogLevel.ERROR, throwable, messageParts);
-    }
-
-    /**
-     * Logs a Throwable and optional message parts at level warn.
-     * @param throwable an instance of Throwable that should be logged with stack trace
-     * @param messageParts zero or more objects which should be combined, by calling toString()
-     *        to form the log message.
-     */
-    public final void warn(final Throwable throwable, final Object... messageParts) {
-        emit(LogLevel.WARNING, throwable, messageParts);
-    }
-
-    /**
-     * Logs a Throwable and optional message parts at level info.
-     * @param throwable an instance of Throwable that should be logged with stack trace
-     * @param messageParts zero or more objects which should be combined, by calling toString()
-     *        to form the log message.
-     */
-    public final void info(final Throwable throwable, final Object... messageParts) {
-        emit(LogLevel.INFO, throwable, messageParts);
-    }
-
-    /**
-     * Logs a Throwable and optional message parts at level debug.
-     * @param throwable an instance of Throwable that should be logged with stack trace
-     * @param messageParts zero or more objects which should be combined, by calling toString()
-     *        to form the log message.
-     */
-    public final void debug(final Throwable throwable, final Object... messageParts) {
-        emit(LogLevel.DEBUG, throwable, messageParts);
-    }
-
-    // Similar methods, but without Throwables, follow
-
-    /**
-     * Logs one or more message parts at level error.
-     * @param messageParts one or more objects which should be combined, by calling toString()
-     *        to form the log message.
-     */
-    public final void error(final Object... messageParts) {
-        emit(LogLevel.ERROR, null, messageParts);
-    }
-
-    /**
-     * Logs one or more message parts at level warn.
-     * @param messageParts one or more objects which should be combined, by calling toString()
-     *        to form the log message.
-     */
-    public final void warn(final Object... messageParts) {
-        emit(LogLevel.WARNING, null, messageParts);
-    }
-
-    /**
-     * Logs one or more message parts at level info.
-     * @param messageParts one or more objects which should be combined, by calling toString()
-     *        to form the log message.
-     */
-    public final void info(final Object... messageParts) {
-        emit(LogLevel.INFO, null, messageParts);
-    }
-
-    /**
-     * Logs one or more message parts at level debug.
-     * @param messageParts one or more objects which should be combined, by calling toString()
-     *        to form the log message.
-     */
-    public final void debug(final Object... messageParts) {
-        emit(LogLevel.DEBUG, null, messageParts);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Md5CalculatingInputStream.java b/src/main/java/htsjdk/samtools/util/Md5CalculatingInputStream.java
deleted file mode 100755
index e0e7cd5..0000000
--- a/src/main/java/htsjdk/samtools/util/Md5CalculatingInputStream.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-/**
- * Class to generate an MD5 string for a file as it is being read
- *
- * @author ktibbett at broadinstitue.org
- */
-public class Md5CalculatingInputStream extends InputStream {
-
-    private final InputStream is;
-    private final MessageDigest md5;
-    private final File digestFile;
-    private String hash;
-
-    /**
-     * Constructor that takes in the InputStream that we are wrapping
-     * and creates the MD5 MessageDigest
-     */
-    public Md5CalculatingInputStream(InputStream is, File digestFile) {
-        super();
-        this.is = is;
-        this.digestFile = digestFile;
-        this.hash = null;
-
-        try {
-            md5 = MessageDigest.getInstance("MD5");
-            md5.reset();
-        }
-        catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException("MD5 algorithm not found", e);
-        }
-    }
-
-    public int read() throws IOException {
-        int result = is.read();
-        if (result != -1) md5.update((byte)result);
-        return result;
-    }
-
-    public int read(byte[] b) throws IOException {
-        int result = is.read(b);
-        if (result != -1) md5.update(b, 0, result);
-        return result;
-    }
-
-
-    public int read(byte[] b, int off, int len) throws IOException {
-        int result = is.read(b, off, len);
-        if (result != -1) md5.update(b, off, result);
-        return result;
-    }
-
-    public String md5() {
-        if(hash == null) {
-            throw new SAMException("Attempting to access md5 digest before the entire file is read!  Call close first.");
-        }
-        return hash;
-    }
-
-    private String makeHash() {
-        if(hash == null) {
-            hash = new BigInteger(1, md5.digest()).toString(16);
-            if (hash.length() != 32) {
-                final String zeros = "00000000000000000000000000000000";
-                hash = zeros.substring(0, 32 - hash.length()) + hash;
-            }
-            return hash;
-        } else {
-            throw new SAMException("MD5InputStream is already closed!");
-        }
-    }
-
-    public void close() throws IOException {
-        is.close();
-        makeHash();
-
-        if(digestFile != null) {
-            BufferedWriter writer = new BufferedWriter(new FileWriter(digestFile));
-            writer.write(hash);
-            writer.close();
-        }
-    }
-
-    // Methods not supported or overridden because they would not result in a valid hash
-    public boolean markSupported() { return false; }
-    public void	mark(int readlimit) {
-        throw new UnsupportedOperationException("mark() is not supported by the MD5CalculatingInputStream");
-    }
-    public void	reset() throws IOException {
-        throw new UnsupportedOperationException("reset() is not supported by the MD5CalculatingInputStream");
-    }
-    public long skip(long n) throws IOException {
-        throw new UnsupportedOperationException("skip() is not supported by the MD5CalculatingInputStream");
-    }
-
-    // Methods delegated to the wrapped InputStream
-    public int available() throws IOException { return is.available(); }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/Md5CalculatingOutputStream.java b/src/main/java/htsjdk/samtools/util/Md5CalculatingOutputStream.java
deleted file mode 100755
index 3c5a492..0000000
--- a/src/main/java/htsjdk/samtools/util/Md5CalculatingOutputStream.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-/**
- * Class to generate an MD5 string for a file as it is being read
- *
- * @author ktibbett at broadinstitue.org
- */
-public class Md5CalculatingOutputStream extends OutputStream {
-
-    private final OutputStream os;
-    private final MessageDigest md5;
-    private final File digestFile;
-    private String hash;
-
-    /**
-     * Constructor that takes in the OutputStream that we are wrapping
-     * and creates the MD5 MessageDigest
-     */
-    public Md5CalculatingOutputStream(OutputStream os, File digestFile) {
-        super();
-        this.hash = null;
-        this.os = os;
-        this.digestFile = digestFile;
-
-        try {
-            md5 = MessageDigest.getInstance("MD5");
-            md5.reset();
-        }
-        catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException("MD5 algorithm not found", e);
-        }
-    }
-
-    public void write(int b) throws IOException {
-        md5.update((byte)b);
-        os.write(b);
-    }
-
-    public void write(byte[] b) throws IOException {
-        md5.update(b);
-        os.write(b);
-    }
-
-
-    public void write(byte[] b, int off, int len) throws IOException {
-        md5.update(b, off, len);
-        os.write(b, off, len);
-    }
-
-    public String md5() {
-        if(hash == null) {
-            throw new SAMException("Attempting to access md5 digest before the entire file is written!  Call close first.");
-        }
-
-        return hash;
-    }
-
-    private String makeHash() {
-        if(hash == null) {
-            hash = new BigInteger(1, md5.digest()).toString(16);
-            if (hash.length() != 32) {
-                final String zeros = "00000000000000000000000000000000";
-                hash = zeros.substring(0, 32 - hash.length()) + hash;
-            }
-            return hash;
-        } else {
-            throw new SAMException("Calling close on Md5CalculatingOutputStream twice!");
-        }
-    }
-
-    public void close() throws IOException {
-        os.close();
-        makeHash();
-
-        if(digestFile != null) {
-            BufferedWriter writer = new BufferedWriter(new FileWriter(digestFile));
-            writer.write(hash);
-            writer.close();
-        }
-    }
-
-    // Pass-through method
-    public void flush() throws IOException { os.flush(); }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/MergingIterator.java b/src/main/java/htsjdk/samtools/util/MergingIterator.java
deleted file mode 100644
index 14da4b0..0000000
--- a/src/main/java/htsjdk/samtools/util/MergingIterator.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2012 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.PriorityQueue;
-
-/**
- * An iterator over Iterators that return Ts. Calling next() returns the next T ordered according
- * to Comparator provided at construction time. Importantly, the elements in the input Iterators
- * must already be sorted according to the provided Comparator.
- */
-public class MergingIterator<T> implements CloseableIterator<T> {
-
-	/*
-	 * An Iterator whose natural ordering is by the T that will be returned by the next call to
-	 * next().
-	 */
-	private class ComparableIterator extends PeekableIterator<T> implements Comparable<ComparableIterator> {
-
-		public ComparableIterator(final Iterator<T> iterator) {
-			super(iterator);
-		}
-
-		@Override
-		public int compareTo(final ComparableIterator that) {
-			if (comparator.getClass() != comparator.getClass()) {
-				throw new IllegalStateException("Can't compare two ComparableIterators that have different orderings.");
-			}
-
-			return comparator.compare(this.peek(), that.peek());
-		}
-	}
-
-	/*
-	 * The general flow is to pull the "top" (according to the ComparableIterator's compareTo())
-	 * iterator off on calls to this.next(), get iterator.next() and then re-add the iterator to
-	 * the queue. Readding reorders the queue so the next "top" iterator is ready.
-	 */
-	private final PriorityQueue<ComparableIterator> queue;
-
-	private final Comparator<T> comparator;
-
-	// This is the last T returned by the call to next(). It's used to make sure that the comparators
-	// always return correctly ordered Ts.
-	private T lastReturned;
-
-	/**
-	 * Creates a MergingIterator over the given Collection of iterators whose elements will be
-	 * returned in the order defined by the given Comparator.
-	 */
-	public MergingIterator(final Comparator<T> comparator, final Collection<CloseableIterator<T>> iterators) {
-		if (iterators.isEmpty()) throw new IllegalArgumentException("One or more CloseableIterators must be provided.");
-
-		this.comparator = comparator;
-
-		this.queue = new PriorityQueue<ComparableIterator>();
-		for (final CloseableIterator<T> iterator : iterators) {
-			this.addIfNotEmpty(new ComparableIterator(iterator));
-		}
-
-		// If there are no iterators to read from after adding them all to the prioqueue,
-		// should we throw? it's prob'ly an error.
-	}
-
-	/**
-	 * @see java.util.Iterator<T>.hasNext
-	 */
-	@Override
-	public boolean hasNext() {
-		return ! this.queue.isEmpty();
-	}
-
-	/**
-	 * @see java.util.Iterator<T>.next
-	 */
-	@Override
-	public T next() {
-		if ( ! this.hasNext()) throw new NoSuchElementException();
-
-		final ComparableIterator recordIterator = this.queue.poll();
-		// Assumes the iterator is closed & removed from the queue before recordIterator.hasNext() == false
-		final T next = recordIterator.next();
-		// I don't like having to test for null here -- it's really only null before the first call
-		// to next() -- but I don't see any other way
-		if (this.lastReturned != null && this.comparator.compare(lastReturned, next) > 0) {
-			throw new IllegalStateException(
-					"The elements of the input Iterators are not sorted according to the comparator " +
-							this.comparator.getClass().getName());
-		}
-
-		addIfNotEmpty(recordIterator);
-		this.lastReturned = next;
-		return next;
-	}
-
-	/**
-	 * Unsupported.
-	 */
-	@Override
-	public void remove() {
-		throw new UnsupportedOperationException();
-	}
-
-	/**
-	 * Closes every CloseableIterator in this MergingIterator. After calling, calls to
-	 * hasNext() will always return false.
-	 */
-	@Override
-	public void close() {
-		for (final ComparableIterator iterator : this.queue) {
-			iterator.close();
-			this.queue.remove(iterator);
-		}
-	}
-
-	private void addIfNotEmpty(final ComparableIterator iterator) {
-		if (iterator.hasNext()) queue.offer(iterator);
-		else iterator.close();
-	}
-}
diff --git a/src/main/java/htsjdk/samtools/util/Murmur3.java b/src/main/java/htsjdk/samtools/util/Murmur3.java
deleted file mode 100644
index b0c4a3a..0000000
--- a/src/main/java/htsjdk/samtools/util/Murmur3.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2011 The Guava Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- *
- * MurmurHash3 was written by Austin Appleby, and is placed in the public
- * domain. The author hereby disclaims copyright to this source code.
- *
- * Source:
- * http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
- * (Modified to adapt to Guava coding conventions and to use the HashFunction interface)
- *
- * Modified to remove stuff Clojure doesn't need, placed under clojure.lang namespace,
- * all fns made static, added hashOrdered/Unordered
- *
- * Modified again by Tim Fennell to remove code not needed by HTSJDK, to make methods non-static (so that different uses can
- * supply different seed values without colliding) and to comform to HTSJDK coding conventions where possible.
- *
- * @author Austin Appleby
- * @author Dimitris Andreou
- * @author Kurt Alfred Kluever
- */
-package htsjdk.samtools.util;
-
-import java.io.Serializable;
-
-/**
- * Provides an implementation of the Murmur3_32 hash algorithm that has desirable properties in terms of randomness
- * and uniformity of the distribution of output values that make it a useful hashing algorithm for downsampling.
- */
-public final class Murmur3 implements Serializable{
-    private static final long serialVersionUID = 1L;
-
-    private final int seed ;
-
-    /** Constructs a Murmur3 hash with the given seed. */
-    public Murmur3(final int seed) {
-        this.seed = seed;
-    }
-
-    /** Hashes a character stream to an int using Murmur3. */
-    public int hashUnencodedChars(CharSequence input){
-        int h1 = this.seed;
-
-        // step through the CharSequence 2 chars at a time
-        final int length = input.length();
-        for(int i = 1; i < length; i += 2)  {
-            int k1 = input.charAt(i - 1) | (input.charAt(i) << 16);
-            k1 = mixK1(k1);
-            h1 = mixH1(h1, k1);
-        }
-
-        // deal with any remaining characters
-        if((length & 1) == 1) {
-            int k1 = input.charAt(length - 1);
-            k1 = mixK1(k1);
-            h1 ^= k1;
-        }
-
-        return fmix(h1, 2 * length);
-    }
-
-    private int hashInt(int input){
-        if(input == 0) return 0;
-        int k1 = mixK1(input);
-        int h1 = mixH1(this.seed, k1);
-
-        return fmix(h1, 4);
-    }
-
-    private int hashLong(long input){
-        if(input == 0) return 0;
-        int low = (int) input;
-        int high = (int) (input >>> 32);
-
-        int k1 = mixK1(low);
-        int h1 = mixH1(this.seed, k1);
-
-        k1 = mixK1(high);
-        h1 = mixH1(h1, k1);
-
-        return fmix(h1, 8);
-    }
-
-    private static int mixK1(int k1){
-        final int c1 = 0xcc9e2d51;
-        final int c2 = 0x1b873593;
-        k1 *= c1;
-        k1 = Integer.rotateLeft(k1, 15);
-        k1 *= c2;
-        return k1;
-    }
-
-    private static int mixH1(int h1, int k1){
-        h1 ^= k1;
-        h1 = Integer.rotateLeft(h1, 13);
-        h1 = h1 * 5 + 0xe6546b64;
-        return h1;
-    }
-
-    // Finalization mix - force all bits of a hash block to avalanche
-    private static int fmix(int h1, int length){
-        h1 ^= length;
-        h1 ^= h1 >>> 16;
-        h1 *= 0x85ebca6b;
-        h1 ^= h1 >>> 13;
-        h1 *= 0xc2b2ae35;
-        h1 ^= h1 >>> 16;
-        return h1;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/util/OverlapDetector.java b/src/main/java/htsjdk/samtools/util/OverlapDetector.java
deleted file mode 100644
index ba177b7..0000000
--- a/src/main/java/htsjdk/samtools/util/OverlapDetector.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.*;
-
-/**
- * Utility class to efficiently do in memory overlap detection between a large
- * set of mapping like objects, and one or more candidate mappings.
- *
- * You can use it for example to detect all locatables overlapping a given set of locatables:
- * <pre>{@code
- *    OverlapDetector<Locatable> detector = OverlapDetector.create(locatables);
- *    Set<Locatable> overlaps = detector.getOverlaps(query);
- *
- *    boolean anyOverlap = detector.overlapsAny(query); //faster API for checking presence of any overlap
- * }</pre>
- */
-public class OverlapDetector<T> {
-    private final Map<Object, IntervalTree<Set<T>>> cache = new HashMap<>();
-    private final int lhsBuffer;
-    private final int rhsBuffer;
-
-    /**
-     * Constructs an overlap detector.
-     * @param lhsBuffer the amount by which to "trim" coordinates of mappings on the left
-     *                  hand side when calculating overlaps
-     * @param rhsBuffer the amount by which to "trim" coordinates of mappings on the right
-     *                  hand side when calculating overlaps
-     */
-    public OverlapDetector(int lhsBuffer, int rhsBuffer) {
-        this.lhsBuffer = lhsBuffer;
-        this.rhsBuffer = rhsBuffer;
-    }
-
-    /**
-     * Creates a new OverlapDetector with no trim and the given set of intervals.
-     */
-    public static <T extends Locatable> OverlapDetector<T> create(final List<T> intervals) {
-        final OverlapDetector<T> detector = new OverlapDetector<>(0, 0);
-        detector.addAll(intervals, intervals);
-        return detector;
-    }
-
-    /** Adds a Locatable to the set of Locatables against which to match candidates. */
-    public void addLhs(final T object, final Locatable interval) {
-        if (object == null) {
-            throw new IllegalArgumentException("null object");
-        }
-        if (interval == null) {
-            throw new IllegalArgumentException("null interval");
-        }
-        final String seqId = interval.getContig();
-
-        IntervalTree<Set<T>> tree = this.cache.get(seqId);
-        if (tree == null) {
-            tree = new IntervalTree<>();
-            this.cache.put(seqId, tree);
-        }
-
-        final int start = interval.getStart() + this.lhsBuffer;
-        final int end   = interval.getEnd()   - this.lhsBuffer;
-
-        final Set<T> objects = new HashSet<>(1);
-        objects.add(object);
-        if (start <= end) {  // Don't put in sequences that have no overlappable bases
-            final Set<T> alreadyThere = tree.put(start, end, objects);
-            if (alreadyThere != null) {
-                alreadyThere.add(object);
-                tree.put(start, end, alreadyThere);
-            }
-        }
-    }
-
-    /**
-     * Adds all items to the overlap detector.
-     *
-     * The order of the lists matters only in the sense that it needs to be the same for the intervals
-     * and the corresponding objects.
-     */
-    public void addAll(final List<T> objects, final List<? extends Locatable> intervals) {
-        if (objects == null) {
-            throw new IllegalArgumentException("null objects");
-        }
-        if (intervals == null) {
-            throw new IllegalArgumentException("null intervals");
-        }
-        if (objects.size() != intervals.size()) {
-            throw new IllegalArgumentException("Objects and intervals must be the same size but were " + objects.size() + " and " + intervals.size());
-        }
-
-        for (int i=0; i<objects.size(); ++i) {
-            addLhs(objects.get(i), intervals.get(i));
-        }
-    }
-
-    /**
-     * Gets all the objects that could be returned by the overlap detector.
-     */
-    public Set<T> getAll() {
-        final Set<T> all = new HashSet<>();
-        for (final IntervalTree<Set<T>> tree : this.cache.values()) {
-            for (IntervalTree.Node<Set<T>> node : tree) {
-                all.addAll(node.getValue());
-            }
-        }
-        return all;
-    }
-
-    /**
-     * Returns true iff the given locatable overlaps any locatable in this detector.
-     *
-     * This is a performance shortcut API functionally equivalent to:
-     * <pre>{@code
-     *      ! getOverlaps(locatable).isEmpty()
-     * }</pre>
-     */
-    public boolean overlapsAny(final Locatable locatable) {
-        if (locatable == null) {
-            throw new IllegalArgumentException("null locatable");
-        }
-        final String seqId = locatable.getContig();
-        final IntervalTree<Set<T>> tree = this.cache.get(seqId);
-        if (tree == null) {
-            return false;
-        }
-        final int start = locatable.getStart() + this.rhsBuffer;
-        final int end   = locatable.getEnd()   - this.rhsBuffer;
-
-        if (start > end) {
-            return false;
-        }
-
-        final Iterator<IntervalTree.Node<Set<T>>> it = tree.overlappers(start, end);
-        while (it.hasNext()) {
-            final IntervalTree.Node<Set<T>> node = it.next();
-            if (!node.getValue().isEmpty()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Gets the Set of objects that overlap the provided locatable.
-     * The returned set may not be modifiable.
-     */
-    public Set<T> getOverlaps(final Locatable locatable)  {
-        if (locatable == null) {
-            throw new IllegalArgumentException("null locatable");
-        }
-        final String seqId = locatable.getContig();
-        final IntervalTree<Set<T>> tree = this.cache.get(seqId);
-        if (tree == null) {
-            return Collections.emptySet();
-        }
-        final int start = locatable.getStart() + this.rhsBuffer;
-        final int end   = locatable.getEnd()   - this.rhsBuffer;
-
-        if (start > end) {
-            return Collections.emptySet();
-        }
-
-        final Set<T> matches = new HashSet<>();
-        final Iterator<IntervalTree.Node<Set<T>>> it = tree.overlappers(start, end);
-        while (it.hasNext()) {
-            final IntervalTree.Node<Set<T>> node = it.next();
-            matches.addAll(node.getValue());
-        }
-        return matches;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/PeekIterator.java b/src/main/java/htsjdk/samtools/util/PeekIterator.java
deleted file mode 100644
index 9f16a51..0000000
--- a/src/main/java/htsjdk/samtools/util/PeekIterator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.Iterator;
-
-/**
- * Wrapper around an iterator that enables non-destructive peeking at the next element that would
- * be returned by next()
- */
-public class PeekIterator<T> implements Iterator<T> {
-    Iterator<T> underlyingIterator;
-    T peekedElement = null;
-
-    public PeekIterator(final Iterator<T> underlyingIterator) {
-        this.underlyingIterator = underlyingIterator;
-    }
-
-    /**
-     * @return true if the iteration has more elements. (In other words, returns true if next would return an element 
-     * rather than throwing an exception.)
-     */
-    public boolean hasNext() {
-        return peekedElement != null || underlyingIterator.hasNext();  
-    }
-
-    /**
-     * @return the next element in the iteration. Calling this method repeatedly until the hasNext() method returns
-     * false will return each element in the underlying collection exactly once.
-     */
-    public T next() {
-        if (peekedElement != null) {
-            final T ret = peekedElement;
-            peekedElement = null;
-            return ret;
-        }
-        return underlyingIterator.next();
-    }
-
-    /**
-     * @return the next element in the iteration, but without removing it, so the next call to next() or peek()
-     * will return the same element as returned by the current call to peek().
-     */
-    public T peek() {
-        if (peekedElement == null) {
-            peekedElement = underlyingIterator.next();
-        }
-        return peekedElement;
-    }
-
-    /**
-     * Unsupported
-     */
-    public void remove() {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * @return the iterator wrapped by this object.
-     */
-    public Iterator<T> getUnderlyingIterator() {
-        return underlyingIterator;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/PeekableIterator.java b/src/main/java/htsjdk/samtools/util/PeekableIterator.java
deleted file mode 100644
index 1587dd2..0000000
--- a/src/main/java/htsjdk/samtools/util/PeekableIterator.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.Iterator;
-
-/**
- * Generic Closable Iterator that allows you to peek at the next value before calling next
- */
-public class PeekableIterator<Object> implements CloseableIterator<Object> {
-    private Iterator<Object> iterator;
-    private Object nextObject;
-
-    /** Constructs a new iterator that wraps the supplied iterator. */
-    public PeekableIterator(Iterator<Object> iterator) {
-        this.iterator = iterator;
-        advance();
-    }
-
-    /** Closes the underlying iterator. */
-    public void close() {
-        CloserUtil.close(iterator);
-    }
-
-    /** True if there are more items, in which case both next() and peek() will return a value. */
-    public boolean hasNext() {
-        return this.nextObject != null;
-    }
-
-    /** Returns the next object and advances the iterator. */
-    public Object next() {
-        Object retval = this.nextObject;
-        advance();
-        return retval;
-    }
-
-    /**
-     * Returns the next object but does not advance the iterator. Subsequent calls to peek()
-     * and next() will return the same object.
-     */
-    public Object peek(){
-        return this.nextObject;
-    }
-
-    private void advance(){
-        if (this.iterator.hasNext()) {
-            this.nextObject = iterator.next();
-        }
-        else {
-            this.nextObject = null;
-        }
-    }
-
-    /** Unsupported Operation. */
-    public void remove() {
-        throw new UnsupportedOperationException("Not supported: remove");
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/PositionalOutputStream.java b/src/main/java/htsjdk/samtools/util/PositionalOutputStream.java
deleted file mode 100644
index ef28be6..0000000
--- a/src/main/java/htsjdk/samtools/util/PositionalOutputStream.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.samtools.util;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * Wraps output stream in a manner which keeps track of the position within the file and allowing writes
- * at arbitrary points
- */
-public final class PositionalOutputStream extends OutputStream implements LocationAware
-{
-    private final OutputStream out;
-    private long position = 0;
-
-    public PositionalOutputStream(final OutputStream out) {
-        this.out = out;
-    }
-
-    public final void write(final byte[] bytes) throws IOException {
-        write(bytes, 0, bytes.length);
-    }
-
-    public final void write(final byte[] bytes, final int startIndex, final int numBytes) throws IOException {
-        position += numBytes;
-        out.write(bytes, startIndex, numBytes);
-    }
-
-    public final void write(final int c)  throws IOException {
-        position++;
-        out.write(c);
-    }
-
-    public final long getPosition() { return position; }
-
-    @Override
-    public void close() throws IOException {
-        super.close();
-        out.close();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ProcessExecutor.java b/src/main/java/htsjdk/samtools/util/ProcessExecutor.java
deleted file mode 100644
index 5ff6673..0000000
--- a/src/main/java/htsjdk/samtools/util/ProcessExecutor.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ThreadFactory;
-
-/**
- * Utility class that will execute sub processes via Runtime.getRuntime().exec(...) and read
- * off the output from stderr and stdout of the sub process. This implementation uses a different
- * thread to read each stream: the current thread for stdout and another, internal thread for 
- * stderr. This utility is able to handle concurrent executions, spawning as many threads as
- * are required to handle the concurrent load.
- *
- * @author Doug Voet (dvoet at broadinstitute dot org)
- */
-public class ProcessExecutor {
-    private static final Log log = Log.getInstance(ProcessExecutor.class);
-    private static final ExecutorService executorService = Executors.newCachedThreadPool(new ThreadFactory() {
-        @Override
-        public Thread newThread(final Runnable r) {
-            return new Thread(r, "ProcessExecutor Thread");
-        }
-    });
-    
-    /**
-     * Executes the command via Runtime.getRuntime().exec() then writes stderr to log.error
-     * and stdout to log.info and blocks until the command is complete.
-     * 
-     * @see Runtime#exec(String)
-     * 
-     * @param command command string
-     * @return return code of command
-     */
-    public static int execute(final String command) {
-        try {
-            final Process process = Runtime.getRuntime().exec(command);
-            return readStreamsAndWaitFor(process);
-        } catch (Throwable t) {
-            throw new SAMException("Unexpected exception executing [" + htsjdk.samtools.util.StringUtil.join(" ", command) + "]", t);
-        }
-    }
-
-    /**
-     * Executes the command via Runtime.getRuntime().exec() then writes stderr to log.error
-     * and stdout to log.info and blocks until the command is complete.
-     * 
-     * @see Runtime#exec(String[])
-     * 
-     * @param commandParts command string
-     * @return return code of command
-     */
-    public static int execute(final String[] commandParts) {
-        return execute(commandParts, null);
-    }
-
-    /**
-     * Executes the command via Runtime.getRuntime().exec(), writes <code>outputStreamString</code>
-     * to the process output stream if it is not null, then writes stderr to log.error
-     * and stdout to log.info and blocks until the command is complete.
-     *
-     * @see Runtime#exec(String[])
-     *
-     * @param commandParts command string
-     * @return return code of command
-     */
-    public static int execute(final String[] commandParts, String outputStreamString) {
-        try {
-            final Process process = Runtime.getRuntime().exec(commandParts);
-            if (outputStreamString != null) {
-                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
-                writer.write(outputStreamString);
-                writer.newLine();
-                writer.close();
-            }
-            return readStreamsAndWaitFor(process);
-        } catch (Throwable t) {
-            throw new SAMException("Unexpected exception executing [" + htsjdk.samtools.util.StringUtil.join(" ", commandParts) + "]", t);
-        }
-    }
-
-    public static String executeAndReturnResult(final String command) {
-        try {
-            final Process process = Runtime.getRuntime().exec(command);
-            final StringBuilderProcessOutputReader err = new StringBuilderProcessOutputReader(process.getErrorStream());
-            final Future<?> stderrReader = executorService.submit(err);
-            final StringBuilderProcessOutputReader stdout = new StringBuilderProcessOutputReader(process.getInputStream());
-            stdout.run();
-            // wait for stderr reader to be done
-            stderrReader.get();
-            final int result = process.waitFor();
-            return result == 0 ? stdout.getOutput() : err.getOutput();
-        } catch (Throwable t) {
-            throw new SAMException("Unexpected exception executing [" + command + "]", t);
-        }
-
-    }
-
-    public static class ExitStatusAndOutput {
-        public final int exitStatus;
-        public final String stdout;
-        /** May be null if interleaved */
-        public final String stderr;
-
-        public ExitStatusAndOutput(int exitStatus, String stdout, String stderr) {
-            this.exitStatus = exitStatus;
-            this.stdout = stdout;
-            this.stderr = stderr;
-        }
-    }
-
-    /**
-     * Execute the command and capture stdout and stderr.
-     * @return Exit status of command, and both stderr and stdout interleaved into stdout attribute.
-     */
-    public static ExitStatusAndOutput executeAndReturnInterleavedOutput(final String command) {
-        try {
-            final Process process = Runtime.getRuntime().exec(command);
-            return interleaveProcessOutput(process);
-
-        } catch (Throwable t) {
-            throw new SAMException("Unexpected exception executing [" + command + "]", t);
-        }
-    }
-
-    /**
-     * Execute the command and capture stdout and stderr.
-     * @return Exit status of command, and both stderr and stdout interleaved into stdout attribute.
-     */
-    public static ExitStatusAndOutput executeAndReturnInterleavedOutput(final String[] commandArray) {
-        try {
-            final Process process = Runtime.getRuntime().exec(commandArray);
-            return interleaveProcessOutput(process);
-
-        } catch (Throwable t) {
-            throw new SAMException("Unexpected exception executing [" + StringUtil.join(" ", commandArray) + "]", t);
-        }
-    }
-
-    private static ExitStatusAndOutput interleaveProcessOutput(final Process process) throws InterruptedException, IOException {
-        final BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
-        final BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
-        final StringBuilder sb = new StringBuilder();
-
-        String stdoutLine = null;
-        String stderrLine = null;
-        while ((stderrLine = stderrReader.readLine()) != null ||
-                (stdoutLine = stdoutReader.readLine()) != null) {
-            if (stderrLine!= null) sb.append(stderrLine).append('\n');
-            if (stdoutLine!= null) sb.append(stdoutLine).append('\n');
-            stderrLine = null;
-            stdoutLine = null;
-        }
-        return new ExitStatusAndOutput(process.waitFor(), sb.toString(), null);
-
-    }
-
-    private static int readStreamsAndWaitFor(final Process process)
-            throws InterruptedException, ExecutionException {
-        final Future<?> stderrReader = executorService.submit(new LogErrorProcessOutputReader(process.getErrorStream()));
-        new LogInfoProcessOutputReader(process.getInputStream()).run();
-        // wait for stderr reader to be done
-        stderrReader.get();
-        return process.waitFor();
-    }
-
-
-    /**
-     * Runnable that reads off the given stream and logs it somewhere.
-     */
-    private static abstract class ProcessOutputReader implements Runnable {
-        private final BufferedReader reader;
-        public ProcessOutputReader(final InputStream stream) {
-            reader = new BufferedReader(new InputStreamReader(stream));
-        }
-
-        @Override
-        public void run() {
-            try {
-                String line;
-                while ((line = reader.readLine()) != null) {
-                    write(line);
-                }
-            } catch (IOException e) {
-                throw new SAMException("Unexpected exception reading from process stream", e);
-            }
-        }
-        
-        protected abstract void write(String message);
-    }
-
-
-    private static class LogErrorProcessOutputReader extends ProcessOutputReader {
-        public LogErrorProcessOutputReader(final InputStream stream) { super(stream); }
-        @Override protected void write(final String message) { log.error(message); }
-    }
-
-    private static class LogInfoProcessOutputReader extends ProcessOutputReader {
-        public LogInfoProcessOutputReader(final InputStream stream) { super(stream); }
-        @Override protected void write(final String message) { log.info(message); }
-    }
-
-    private static class StringBuilderProcessOutputReader extends ProcessOutputReader {
-        private final StringBuilder sb = new StringBuilder();
-        public StringBuilderProcessOutputReader(final InputStream stream) { super(stream); }
-        @Override protected void write(final String message) { sb.append(message).append('\n'); }
-        public String getOutput() { return sb.toString(); }
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/ProgressLogger.java b/src/main/java/htsjdk/samtools/util/ProgressLogger.java
deleted file mode 100644
index 6a293d6..0000000
--- a/src/main/java/htsjdk/samtools/util/ProgressLogger.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * Little progress logging class to facilitate consistent output of useful information when progressing
- * through a stream of SAM records.
- *
- * @author Tim Fennell
- */
-public class ProgressLogger extends AbstractProgressLogger {
-
-    private final Log log;
-
-    /**
-     * Construct a progress logger.
-     * @param log the Log object to write outputs to
-     * @param n the frequency with which to output (i.e. every N records)
-     * @param verb the verb to log, e.g. "Processed, Read, Written".
-     * @param noun the noun to use when logging, e.g. "Records, Variants, Loci"
-     */
-    public ProgressLogger(final Log log, final int n, final String verb, final String noun) {
-        super(noun, verb, n);
-        this.log = log;
-    }
-
-    /**
-     * Construct a progress logger.
-     * @param log the Log object to write outputs to
-     * @param n the frequency with which to output (i.e. every N records)
-     * @param verb the verb to log, e.g. "Processed, Read, Written".
-     */
-    public ProgressLogger(final Log log, final int n, final String verb) {
-        this(log, n, verb, "records");
-    }
-
-    /**
-     * Construct a progress logger with the desired log and frequency and the verb "Processed".
-     * @param log the Log object to write outputs to
-     * @param n the frequency with which to output (i.e. every N records)
-     */
-    public ProgressLogger(final Log log, final int n) { this(log, n, "Processed"); }
-
-    /**
-     * Construct a progress logger with the desired log, the verb "Processed" and a period of 1m records.
-     * @param log the Log object to write outputs to
-     */
-    public ProgressLogger(final Log log) { this(log, 1000000); }
-
-    @Override
-    protected void log(final String... message) {
-        log.info((Object[])message);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ProgressLoggerInterface.java b/src/main/java/htsjdk/samtools/util/ProgressLoggerInterface.java
deleted file mode 100644
index a3ef7bc..0000000
--- a/src/main/java/htsjdk/samtools/util/ProgressLoggerInterface.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * The MIT License
- * <p/>
- * Copyright (c) 2014 The Broad Institute
- * <p/>
- * 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:
- * <p/>
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * <p/>
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * An interface defining the record() methods of the Picard-public ProgressLogger implementation.
- */
-public interface ProgressLoggerInterface {
-
-	boolean record(final String chrom, final int pos);
-	boolean record(final SAMRecord rec);
-	boolean record(final SAMRecord... recs);
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/QualityEncodingDetector.java b/src/main/java/htsjdk/samtools/util/QualityEncodingDetector.java
deleted file mode 100644
index b0a965c..0000000
--- a/src/main/java/htsjdk/samtools/util/QualityEncodingDetector.java
+++ /dev/null
@@ -1,405 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMUtils;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.fastq.FastqReader;
-import htsjdk.samtools.fastq.FastqRecord;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Queue;
-import java.util.Set;
-
-import static java.util.Arrays.asList;
-
-/**
- * Utility for determining the type of quality encoding/format (see {@link FastqQualityFormat}) used in a SAM/BAM or Fastq.
- * <p/>
- * To use this class, invoke the detect() method with a {@link SamReader} or {@link FastqReader}, as appropriate.  The consumer is
- * responsible for closing readers.
- *
- * @author mccowan at broadinstitute.org
- */
-public class QualityEncodingDetector {
-
-    private QualityRecordAggregator qualityAggregator = new QualityRecordAggregator();
-
-    /**
-     * The maximum number of records over which the detector will iterate before making a determination, by default.
-     */
-    public static final long DEFAULT_MAX_RECORDS_TO_ITERATE = 10000;
-    private static final Log log = Log.getInstance(QualityEncodingDetector.class);
-
-    public enum FileContext {FASTQ, SAM}
-
-    static class Range {
-        final int low, high;
-
-        Range(final int low, final int high) {
-            this.low = low;
-            this.high = high;
-        }
-
-        boolean contains(final int value) {
-            return value <= high && value >= low;
-        }
-    }
-
-    /**
-     * Collection of data about the different quality formats and how they are interpreted.
-     */
-    enum QualityScheme {
-        Phred(
-                new Range(0, 93),           // Raw value range
-                new Range(33, 126),         // ASCII value range
-                asList(new Range(33, 58)),  // Ranges into which we expect at least one ASCII value to fall
-                FastqQualityFormat.Standard // Associated quality format
-        ),
-        Solexa(
-                new Range(-5, 62),
-                new Range(59, 126),
-                new ArrayList<Range>(),
-                FastqQualityFormat.Solexa
-        ),
-        Illumina(
-                new Range(0, 62),
-                new Range(64, 126),
-                new ArrayList<Range>(),
-                FastqQualityFormat.Illumina
-        );
-        final Range rawRange, asciiRange;
-        /**
-         * Ranges into which we expect at least one value to fall if this formatting is being used.  For example, for
-         * Standard encoding, we expect to at least one ASCII value between 33 and 58 (0 and 25); otherwise, it's
-         * probably not Standard-encoded.
-         */
-        final List<Range> expectedAsciiRanges;
-        final FastqQualityFormat qualityFormat;
-
-        QualityScheme(final Range rawRange, final Range asciiRange, final List<Range> expectedAsciiRanges, final FastqQualityFormat qualityFormat) {
-            this.rawRange = rawRange;
-            this.asciiRange = asciiRange;
-            this.expectedAsciiRanges = expectedAsciiRanges;
-            this.qualityFormat = qualityFormat;
-        }
-    }
-
-    /**
-     * Collecting reads and their quality scores for later analysis.  Uses ASCII values since those are the inherently
-     * "raw-est", read unmodified from the file.
-     */
-    private static class QualityRecordAggregator {
-        private Set<Integer> observedAsciiQualities = new HashSet<Integer>();
-
-        public Set<Integer> getObservedAsciiQualities() {
-            return Collections.unmodifiableSet(observedAsciiQualities);
-        }
-
-        /**
-         * Adds the FastqRecord's quality scores.
-         */
-        public void add(final FastqRecord fastqRecord) {
-            addAsciiQuality(fastqRecord.getBaseQualityString().getBytes());
-        }
-
-        /**
-         * Adds the SAMRecord's quality scores.
-         * <p/>
-         * Does not assume Phred quality encoding (for obvious reasons); getBaseQualityString() is used to read the
-         * unmodified ASCII score.  To elaborate, the {@link SamReader}, which is generating these {@link SAMRecord}s, builds the
-         * SAMRecord by subtracting a value from each quality score and storing that transformed value internally.
-         * Since we desire original scores here (whatever was in the file to begin with), we effectively undo this
-         * transformation by asking {@link SAMRecord} to convert the quality back into the ASCII that was read in the file.
-         */
-        public void add(final SAMRecord samRecord, final boolean useOriginalQualities) {
-            addAsciiQuality(useOriginalQualities && samRecord.getOriginalBaseQualities() != null
-                    ? SAMUtils.phredToFastq(samRecord.getOriginalBaseQualities()).getBytes()
-                    : samRecord.getBaseQualityString().getBytes());
-        }
-
-        public void add(final SAMRecord samRecord) {
-            add(samRecord, false);
-        }
-
-        private void addAsciiQuality(final byte... asciiQualities) {
-            for (final byte asciiQuality : asciiQualities) {
-                observedAsciiQualities.add((int) asciiQuality);
-            }
-        }
-    }
-
-    /**
-     * Adds the provided reader's records to the detector.
-     *
-     * @return The number of records read
-     */
-    public long add(final long maxRecords, final FastqReader... readers) {
-        final Iterator<FastqRecord> iterator = generateInterleavedFastqIterator(readers);
-        long recordCount = 0;
-        while (iterator.hasNext() && recordCount++ != maxRecords) {
-            this.add(iterator.next());
-        }
-        log.debug(String.format("Read %s records from %s.", recordCount, Arrays.toString(readers)));
-        return recordCount;
-    }
-
-    /**
-     * Adds the provided reader's records to the detector.
-     *
-     * @return The number of records read
-     */
-    public long add(final long maxRecords, final SamReader reader) {
-        return add(maxRecords, reader.iterator());
-    }
-
-    /**
-     * Adds the provided iterator's records (optionally using the original qualities) to the detector.
-     *
-     * @return The number of records read
-     */
-    public long add(final long maxRecords, final CloseableIterator<SAMRecord> iterator, final boolean useOriginalQualities) {
-        long recordCount = 0;
-        try {
-            while (iterator.hasNext() && recordCount++ != maxRecords) {
-                this.add(iterator.next(), useOriginalQualities);
-            }
-
-            return recordCount;
-        } finally {
-            iterator.close();
-        }
-    }
-
-    public long add(final long maxRecords, final CloseableIterator<SAMRecord> iterator) {
-        return add(maxRecords, iterator, false);
-    }
-
-    /**
-     * Adds the provided record's qualities to the detector.
-     */
-    public void add(final FastqRecord fastqRecord) {
-        this.qualityAggregator.add(fastqRecord);
-    }
-
-    /**
-     * Adds the provided record's qualities to the detector.
-     */
-    public void add(final SAMRecord samRecord, final boolean useOriginalQualities) {
-        this.qualityAggregator.add(samRecord, useOriginalQualities);
-    }
-
-    public void add(final SAMRecord samRecord) {
-        this.add(samRecord, false);
-    }
-
-    /**
-     * Tests whether or not the detector can make a determination without guessing (i.e., if all but one quality format
-     * can be excluded using established exclusion conventions).
-     *
-     * @return True if more than one format is possible after exclusions; false otherwise
-     */
-    public boolean isDeterminationAmbiguous() {
-        return this.generateCandidateQualities(true).size() > 1;
-    }
-
-    /**
-     * Processes collected quality data and applies rules to determine which quality formats are possible.
-     * <p/>
-     * Specifically, for each format's known range of possible values (its "quality scheme"), exclude formats if any
-     * observed values fall outside of that range.  Additionally, exclude formats for which we expect to see at
-     * least one quality in a range of values, but do not.  (For example, for Phred, we expect to eventually see
-     * a value below 58.  If we never see such a value, we exclude Phred as a possible format unless the checkExpected
-     * flag is set to false in which case we leave Phred as a possible quality format.)
-     */
-    public EnumSet<FastqQualityFormat> generateCandidateQualities(final boolean checkExpected) {
-        final EnumSet<FastqQualityFormat> candidateFormats = EnumSet.allOf(FastqQualityFormat.class);
-        final Set<Integer> observedAsciiQualities = this.qualityAggregator.getObservedAsciiQualities();
-        if (observedAsciiQualities.isEmpty())
-            throw new SAMException("Cannot determine candidate qualities: no qualities found.");
-
-        for (final QualityScheme scheme : QualityScheme.values()) {
-            final Iterator<Integer> qualityBinIterator = observedAsciiQualities.iterator();
-            final Collection<Range> remainingExpectedValueRanges = new ArrayList<Range>(scheme.expectedAsciiRanges);
-            while (qualityBinIterator.hasNext()) {
-                final int quality = qualityBinIterator.next();
-                if (!scheme.asciiRange.contains(quality)) {
-                    candidateFormats.remove(scheme.qualityFormat);
-                }
-
-                final Iterator<Range> expectedValueRangeIterator = remainingExpectedValueRanges.iterator();
-                while (expectedValueRangeIterator.hasNext()) {
-                    if (expectedValueRangeIterator.next().contains(quality)) {
-                        expectedValueRangeIterator.remove();
-                    }
-                }
-            }
-
-            /**
-             * We remove elements from this list as we observe values in the corresponding range; if the list isn't
-             * empty, we haven't seen a value in that range.  In other words, we haven't seen a value we expected.
-             * Consequently, we remove the corresponding format from the running possibilities.
-             */
-            if (!remainingExpectedValueRanges.isEmpty() && checkExpected) {
-                candidateFormats.remove(scheme.qualityFormat);
-            }
-        }
-
-        return candidateFormats;
-    }
-
-    /**
-     * Interleaves FastqReader iterators so that serial-iteration of the result cycles between the constituent iterators.
-     */
-    private static Iterator<FastqRecord> generateInterleavedFastqIterator(final FastqReader... readers) {
-        return new Iterator<FastqRecord>() {
-            private Queue<Iterator<FastqRecord>> queue = new LinkedList<Iterator<FastqRecord>>();
-
-            {
-                for (final FastqReader reader : readers) {
-                    queue.add(reader.iterator());
-                }
-            }
-
-            public boolean hasNext() {
-                // If this returns true, the head of the queue will have a next element
-                while (!queue.isEmpty()) {
-                    if (queue.peek().hasNext()) {
-                        return true;
-                    }
-                    queue.poll();
-                }
-                return false;
-            }
-
-            public FastqRecord next() {
-                if (!hasNext()) throw new NoSuchElementException();
-                final Iterator<FastqRecord> i = queue.poll();
-                final FastqRecord result = i.next();
-                queue.offer(i);
-                return result;
-            }
-
-            public void remove() {
-                throw new UnsupportedOperationException();
-            }
-        };
-    }
-
-    /**
-     * Reads through the records in the provided fastq reader and uses their quality scores to determine the quality
-     * format used in the fastq.
-     *
-     * @param readers    The fastq readers from which qualities are to be read; at least one must be provided
-     * @param maxRecords The maximum number of records to read from the reader before making a determination (a guess,
-     *                   so more records is better)
-     * @return The determined quality format
-     */
-    public static FastqQualityFormat detect(final long maxRecords, final FastqReader... readers) {
-        final QualityEncodingDetector detector = new QualityEncodingDetector();
-        final long recordCount = detector.add(maxRecords, readers);
-        log.debug(String.format("Read %s records from %s.", recordCount, Arrays.toString(readers)));
-        return detector.generateBestGuess(FileContext.FASTQ, null);
-    }
-
-    public static FastqQualityFormat detect(final FastqReader... readers) {
-        return detect(DEFAULT_MAX_RECORDS_TO_ITERATE, readers);
-    }
-
-    /**
-     * Reads through the records in the provided SAM reader and uses their quality scores to determine the quality
-     * format used in the SAM.
-     *
-     * @param iterator   The iterator from which SAM records are to be read
-     * @param maxRecords The maximum number of records to read from the reader before making a determination (a guess,
-     * @param useOriginalQualities whether to use the original qualities (if available) rather than the current ones
-     *                   so more records is better)
-     * @return The determined quality format
-     */
-    public static FastqQualityFormat detect(final long maxRecords, final CloseableIterator<SAMRecord> iterator, final boolean useOriginalQualities) {
-        final QualityEncodingDetector detector = new QualityEncodingDetector();
-        final long recordCount = detector.add(maxRecords, iterator, useOriginalQualities);
-        log.debug(String.format("Read %s records.", recordCount));
-        return detector.generateBestGuess(FileContext.SAM, null);
-
-    }
-
-    public static FastqQualityFormat detect(final long maxRecords, final CloseableIterator<SAMRecord> iterator) {
-        return detect(maxRecords, iterator, false);
-    }
-
-    public static FastqQualityFormat detect(final long maxRecords, final SamReader reader) {
-        return detect(maxRecords, reader.iterator());
-    }
-
-    public static FastqQualityFormat detect(final SamReader reader) {
-        return detect(DEFAULT_MAX_RECORDS_TO_ITERATE, reader);
-    }
-
-
-    /**
-     * Reads through the records in the provided SAM reader and uses their quality scores to sanity check the expected
-     * quality passed in. If the expected quality format is sane we just hand this back otherwise we throw a
-     * {@link SAMException}.
-     */
-    public static FastqQualityFormat detect(final SamReader reader, final FastqQualityFormat expectedQualityFormat) {
-        //sanity check expectedQuality
-        final QualityEncodingDetector detector = new QualityEncodingDetector();
-        final long recordCount = detector.add(DEFAULT_MAX_RECORDS_TO_ITERATE, reader.iterator());
-        log.debug(String.format("Read %s records from %s.", recordCount, reader));
-        return detector.generateBestGuess(FileContext.SAM, expectedQualityFormat);
-    }
-
-    /**
-     * Make the best guess at the quality format. If an expected quality is passed in the values are sanity checked
-     * (ignoring expected range) and if they are deemed acceptable the expected quality is passed back. Otherwise we use
-     * a set of heuristics to make our best guess.
-     */
-    public FastqQualityFormat generateBestGuess(final FileContext context, final FastqQualityFormat expectedQuality) {
-        final EnumSet<FastqQualityFormat> possibleFormats;
-        if (null != expectedQuality) {
-            possibleFormats = this.generateCandidateQualities(false);
-            if (possibleFormats.contains(expectedQuality)) {
-                return expectedQuality;
-            } else {
-                throw new SAMException(
-                        String.format("The quality values do not fall in the range appropriate for the expected quality of %s.",
-                                expectedQuality.name()));
-            }
-        } else {
-            possibleFormats = this.generateCandidateQualities(true);
-            switch (possibleFormats.size()) {
-                case 1:
-                    return possibleFormats.iterator().next();
-                case 2:
-                    if (possibleFormats.equals(EnumSet.of(FastqQualityFormat.Illumina, FastqQualityFormat.Solexa))) {
-                        return FastqQualityFormat.Illumina;
-                    } else if (possibleFormats.equals(EnumSet.of(FastqQualityFormat.Illumina, FastqQualityFormat.Standard))) {
-                        switch (context) {
-                            case FASTQ:
-                                return FastqQualityFormat.Illumina;
-                            case SAM:
-                                return FastqQualityFormat.Standard;
-                        }
-                    } else if (possibleFormats.equals(EnumSet.of(FastqQualityFormat.Standard, FastqQualityFormat.Solexa))) {
-                        return FastqQualityFormat.Standard;
-                    } else throw new SAMException("Unreachable code.");
-                case 3:
-                    throw new SAMException("The quality format cannot be determined: no formats were excluded.");
-                case 0:
-                    throw new SAMException("The quality format cannot be determined: all formats were excluded.");
-                default:
-                    throw new SAMException("Unreachable code.");
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/QualityUtil.java b/src/main/java/htsjdk/samtools/util/QualityUtil.java
deleted file mode 100644
index e9ad9ec..0000000
--- a/src/main/java/htsjdk/samtools/util/QualityUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Utility class for working with quality scores and error probabilities.
- *
- * @author Tim Fennell
- */
-public final class QualityUtil {
-    private static final double[] errorProbabilityByPhredScore;
-
-    static {
-        errorProbabilityByPhredScore = new double[101];
-        for (int i=0; i<errorProbabilityByPhredScore.length; ++i) {
-            errorProbabilityByPhredScore[i] = 1d/Math.pow(10d, i/10d);
-        }
-    }
-
-    /** Given a phred score between 0 and 100 returns the probability of error. */
-    public static double getErrorProbabilityFromPhredScore(final int i) {
-        return errorProbabilityByPhredScore[i];
-    }
-
-    /** Gets the phred score for any given probability of error. */
-    public static int getPhredScoreFromErrorProbability(final double probability) {
-        return (int) Math.round(-10 * Math.log10(probability));
-    }
-
-    /** Gets the phred score given the specified observations and errors. */
-    public static int getPhredScoreFromObsAndErrors(final double observations, final double errors) {
-        return getPhredScoreFromErrorProbability(errors / observations);
-    }
-
-    /**
-     * Calculates the sum of error probabilities for all read bases in the SAM record. Takes
-     * the SAM record as opposed to the qualities directly so that it can make sure to count
-     * no-calls as 1 instead of what the quality score says.
-     * */
-    public static double sumOfErrorProbabilities(final SAMRecord rec) {
-        final byte[] bases = rec.getReadBases();
-        final byte[] quals = rec.getBaseQualities();
-
-        double sum = 0;
-
-        for (int i=0; i<bases.length; ++i) {
-            if (SequenceUtil.isNoCall(bases[i])) ++sum;
-            else sum += QualityUtil.getErrorProbabilityFromPhredScore(quals[i]);
-        }
-
-        return sum;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ReferenceSequenceMask.java b/src/main/java/htsjdk/samtools/util/ReferenceSequenceMask.java
deleted file mode 100644
index 302825a..0000000
--- a/src/main/java/htsjdk/samtools/util/ReferenceSequenceMask.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Interface for specifying loci of interest for genotype calling and other operations.
- * It is a requirement that the sequences be probed in ascending order.
- *
- * @author alecw at broadinstitute dot oh are gee
- */
-public interface ReferenceSequenceMask {
-
-    /**
-     * It is required that sequenceIndex is >= any previous sequenceIndex passed to this class.
-     * @return true if the mask is set for the given sequence and position
-     */
-    boolean get(int sequenceIndex, int position);
-
-    /**
-     * It is required that sequenceIndex is >= any previous sequenceIndex passed to this class.
-     * @return the next pos on the given sequence >= position that is set, or -1 if there are no more set positions
-     */
-    int nextPosition(int sequenceIndex, int position);
-
-    /**
-     * @return Largest sequence index for which there are set bits.
-     */
-    int getMaxSequenceIndex();
-
-    /**
-     * @return the largest position on the last sequence index
-     */
-    int getMaxPosition();
-}
diff --git a/src/main/java/htsjdk/samtools/util/RelativeIso8601Date.java b/src/main/java/htsjdk/samtools/util/RelativeIso8601Date.java
deleted file mode 100644
index ebcb44f..0000000
--- a/src/main/java/htsjdk/samtools/util/RelativeIso8601Date.java
+++ /dev/null
@@ -1,203 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.util.Date;
-
-/**
- * Like {@link Iso8601Date}, but also comes in a "lazy now" flavor.
- * <p/>
- * When "lazy now" mode is enabled, this instance's date value is undefined until the first time it is queried, at which time it is set to
- * {@link System#currentTimeMillis()}.  This value is returned on subsequent queries, so it is consistent.
- * <p/>
- * The "lazy state" is conveyed via {@link #toString()}.  A "lazy now" instance will answer {@link #toString()} with
- * {@link #LAZY_NOW_LABEL} if the time has not yet been queried/set, or a {@link Iso8601Date}-formatted date of the query time if it
- * has been queried.  This characteristic is useful for serialization and persistence purposes.
- * <p/>
- * Consumers can create "lazy now" instances via the {@link #generateLazyNowInstance()} factory method or by passing {@link #LAZY_NOW_LABEL} to
- * {@link #RelativeIso8601Date(String)}.
- *
- * @author mccowan
- */
-public class RelativeIso8601Date extends Iso8601Date {
-
-    public static final String LAZY_NOW_LABEL = "NOW";
-
-    /** Flag that indicates this instance is lazy and has not yet been queried (and so its value should be updated at the next query). */
-    private boolean doSetTimeNextQuery = false;
-
-    /** Returns a "lazy now" instance. */
-    public static RelativeIso8601Date generateLazyNowInstance() {
-        return new RelativeIso8601Date(LAZY_NOW_LABEL);
-    }
-
-    public RelativeIso8601Date(final Date date) {
-        super(date);
-        doSetTimeNextQuery = false;
-    }
-
-    public RelativeIso8601Date(final String dateStr) {
-        /**
-         * We must pass a date parsable {@link Iso8601Date#Iso8601Date(String)}; we will never actually read the passed value, so it doesn't
-         * matter what it is.
-         */
-        super(LAZY_NOW_LABEL.equals(dateStr) ? new Iso8601Date(new Date()).toString() : dateStr);
-        doSetTimeNextQuery = LAZY_NOW_LABEL.equals(dateStr);
-    }
-
-    /** Updates the time stored by this instance if it's a "lazy now" instance and has never been stored. */
-    private synchronized void conditionallyUpdateTime() {
-        if (doSetTimeNextQuery) {
-            super.setTime(System.currentTimeMillis());
-            doSetTimeNextQuery = false;
-        }
-    }
-
-    /**
-     * Returns a {@link String} representation of this date.
-     *
-     * @return An {@link Iso8601Date}-formatted string, or the value of {@link #LAZY_NOW_LABEL} if this is a "lazy now" instance.
-     */
-    @Override
-    public String toString() {
-        return doSetTimeNextQuery ? LAZY_NOW_LABEL : super.toString();
-    }
-
-    @Override
-    public long getTime() {
-        conditionallyUpdateTime();
-        return super.getTime();
-    }
-
-    @Override
-    public boolean after(final Date when) {
-        conditionallyUpdateTime();
-        return super.after(when);
-    }
-
-    @Override
-    public boolean before(final Date when) {
-        conditionallyUpdateTime();
-        return super.before(when);
-    }
-
-    @Override
-    public Object clone() {
-        conditionallyUpdateTime();
-        return super.clone();
-    }
-
-    @Override
-    public int compareTo(final Date anotherDate) {
-        conditionallyUpdateTime();
-        return super.compareTo(anotherDate);
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        conditionallyUpdateTime();
-        return super.equals(obj);
-    }
-
-    @Override
-    @Deprecated
-    public int getDate() {
-        conditionallyUpdateTime();
-        return super.getDate();
-    }
-
-    @Override
-    @Deprecated
-    public int getDay() {
-        conditionallyUpdateTime();
-        return super.getDay();
-    }
-
-    @Override
-    @Deprecated
-    public int getHours() {
-        conditionallyUpdateTime();
-        return super.getHours();
-    }
-
-    @Override
-    @Deprecated
-    public int getMinutes() {
-        conditionallyUpdateTime();
-        return super.getMinutes();
-    }
-
-    @Override
-    @Deprecated
-    public int getMonth() {
-        conditionallyUpdateTime();
-        return super.getMonth();
-    }
-
-    @Override
-    @Deprecated
-    public int getSeconds() {
-        conditionallyUpdateTime();
-        return super.getSeconds();
-    }
-
-    @Override
-    @Deprecated
-    public int getTimezoneOffset() {
-        conditionallyUpdateTime();
-        return super.getTimezoneOffset();
-    }
-
-    @Override
-    @Deprecated
-    public int getYear() {
-        conditionallyUpdateTime();
-        return super.getYear();
-    }
-
-    @Override
-    public int hashCode() {
-        conditionallyUpdateTime();
-        return super.hashCode();
-    }
-
-    @Override
-    @Deprecated
-    public void setDate(final int date) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    @Deprecated
-    public void setHours(final int hours) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    @Deprecated
-    public void setMinutes(final int minutes) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    @Deprecated
-    public void setMonth(final int month) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    @Deprecated
-    public void setSeconds(final int seconds) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    @Deprecated
-    public void setTime(final long time) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    @Deprecated
-    public void setYear(final int year) {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ResourceLimitedMap.java b/src/main/java/htsjdk/samtools/util/ResourceLimitedMap.java
deleted file mode 100644
index 51f91da..0000000
--- a/src/main/java/htsjdk/samtools/util/ResourceLimitedMap.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * LRU collection class for managing objects that place some resource burden such that not too many of them
- * can existing in the VM at one time, but they can be reconstructed ias necessary.
- * Original motivation was for an LRU cache of FileOutputStreams.
- *
- * @author alecw at broadinstitute.org
- */
-public class ResourceLimitedMap<Key, Value> {
-    private static final float   hashTableLoadFactor = 0.75f;
-
-    private final LinkedHashMap<Key,Value> map;
-    private final int cacheSize;
-    private final ResourceLimitedMapFunctor<Key, Value> functor;
-
-    /**
-     * Create LRU cache
-     * @param cacheSize Max number of objects to be stored in the cache.
-     * @param functor Encapsulates methods for creating a new object if it isn't in the cache, and
-     * for finalizing an object that is getting LRU'ed out of the cache.
-     */
-    public ResourceLimitedMap(final int cacheSize, final ResourceLimitedMapFunctor<Key, Value> functor) {
-        this.cacheSize = cacheSize;
-        this.functor = functor;
-        // Make hash table big enough so that it never gets resized.
-        final int hashTableCapacity = (int)Math.ceil(cacheSize / hashTableLoadFactor) + 1;
-
-        // Created LinkedHashMap in LRU mode
-        map = new LinkedHashMap<Key,Value>(hashTableCapacity, hashTableLoadFactor, true) {
-            @Override protected boolean removeEldestEntry (final Map.Entry<Key,Value> eldest) {
-               if (size() > ResourceLimitedMap.this.cacheSize) {
-                   ResourceLimitedMap.this.functor.finalizeValue(eldest.getKey(), eldest.getValue());
-                   return true;
-               } else {
-                   return false;
-               }
-            }
-        };
-    }
-
-    /**
-     * Return an existing value, or create a new one if necessary.  If creating a new one and the
-     * cache is full, the eldest object is pushed out of the cache.
-     * @param key Key of desired value.
-     * @return Either existing value, or new value created from key and inserted into map.
-     */
-    public Value get(final Key key) {
-        if (!map.containsKey(key)) {
-            map.put(key, functor.makeValue(key));
-        }
-        return map.get(key);
-    }
-
-    public Value remove(final Key key) {
-        return map.remove(key);
-    }
-
-    /**
-     * Determine if the map contains the given key.  Note that even if the map does not contain
-     * the key, get(key) will return a value, because one will be created.
-     * @param key
-     * @return true if the map currently contains the given key.  It is unknown whether the map
-     * may have contained the key in the past.
-     */
-    public boolean containsKey(final Key key) {
-        return map.containsKey(key);
-    }
-
-    /**
-     * Remove all the values from the map, and call functory.finalizeValue() on each of them.
-     */
-    public void finalizeAll() {
-        for (final Map.Entry<Key, Value> entry : map.entrySet()) {
-            functor.finalizeValue(entry.getKey(), entry.getValue());
-        }
-        map.clear();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ResourceLimitedMapFunctor.java b/src/main/java/htsjdk/samtools/util/ResourceLimitedMapFunctor.java
deleted file mode 100644
index 6ca8031..0000000
--- a/src/main/java/htsjdk/samtools/util/ResourceLimitedMapFunctor.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * c.f. ResourceLimitedMap for details.
- * @param <Key> Used to find and create value.
- * @param <Value> Type stored in ResourceLimitedMap, which is created as necessary
- * and finalized when it is the least-recently used.
- */
-public interface ResourceLimitedMapFunctor<Key, Value> {
-
-    /**
-     * Create a new value corresponding to the key
-     * @param key
-     * @return a new value corresponding to the key
-     */
-    Value makeValue(final Key key);
-
-    /**
-     * Clean up an existing value in conjunction with removing from ResourceLimitedMap.
-     * @param key
-     * @param value
-     */
-    void finalizeValue(final Key key, final Value value);
-}
diff --git a/src/main/java/htsjdk/samtools/util/RuntimeEOFException.java b/src/main/java/htsjdk/samtools/util/RuntimeEOFException.java
deleted file mode 100644
index 2e80fa6..0000000
--- a/src/main/java/htsjdk/samtools/util/RuntimeEOFException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-/**
- * Thrown by various codecs to indicate EOF without having to clutter the API with throws clauses
- */
-public class RuntimeEOFException extends SAMException {
-    public RuntimeEOFException() {
-    }
-
-    public RuntimeEOFException(final String s) {
-        super(s);
-    }
-
-    public RuntimeEOFException(final String s, final Throwable throwable) {
-        super(s, throwable);
-    }
-
-    public RuntimeEOFException(final Throwable throwable) {
-        super(throwable);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/RuntimeIOException.java b/src/main/java/htsjdk/samtools/util/RuntimeIOException.java
deleted file mode 100644
index 571571b..0000000
--- a/src/main/java/htsjdk/samtools/util/RuntimeIOException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-/**
- * Thrown by various IO classes to indicate IOException without having to clutter the API with throws clauses
- */
-public class RuntimeIOException extends SAMException {
-    public RuntimeIOException() {
-    }
-
-    public RuntimeIOException(final String s) {
-        super(s);
-    }
-
-    public RuntimeIOException(final String s, final Throwable throwable) {
-        super(s, throwable);
-    }
-
-    public RuntimeIOException(final Throwable throwable) {
-        super(throwable);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/RuntimeScriptException.java b/src/main/java/htsjdk/samtools/util/RuntimeScriptException.java
deleted file mode 100644
index 570a64e..0000000
--- a/src/main/java/htsjdk/samtools/util/RuntimeScriptException.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * The MIT License
- *
- * Pierre Lindenbaum PhD @yokofakun
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-
-/**
- * Thrown by classes handling script engines like the javascript-based filters for SAM/VCF
- */
-public class RuntimeScriptException extends RuntimeException {
-    public RuntimeScriptException() {
-    }
-
-    public RuntimeScriptException(final String s) {
-        super(s);
-    }
-
-    public RuntimeScriptException(final String s, final Throwable throwable) {
-        super(s, throwable);
-    }
-
-    public RuntimeScriptException(final Throwable throwable) {
-        super(throwable);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SamLocusIterator.java b/src/main/java/htsjdk/samtools/util/SamLocusIterator.java
deleted file mode 100644
index 7a60756..0000000
--- a/src/main/java/htsjdk/samtools/util/SamLocusIterator.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.AlignmentBlock;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SamReader;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Iterator that traverses a SAM File, accumulating information on a per-locus basis.
- * Optionally takes a target interval list, in which case the loci returned are the ones covered by
- * the interval list.  If no target interval list, whatever loci are covered by the input reads are returned.
- * By default duplicate reads and non-primary alignments are filtered out.  Filtering may be changed
- * via setSamFilters().
- *
- * @author alecw at broadinstitute.org
- */
-
-public class SamLocusIterator extends AbstractLocusIterator<SamLocusIterator.RecordAndOffset, SamLocusIterator.LocusInfo> {
-
-    /**
-     * Prepare to iterate through the given SAM records, skipping non-primary alignments.  Do not use
-     * BAM index even if available.
-     *
-     * @param samReader must be coordinate sorted
-     */
-    public SamLocusIterator(final SamReader samReader) {
-        this(samReader, null);
-    }
-
-    /**
-     * Prepare to iterate through the given SAM records, skipping non-primary alignments.  Do not use
-     * BAM index even if available.
-     *
-     * @param samReader    must be coordinate sorted
-     * @param intervalList Either the list of desired intervals, or null.  Note that if an intervalList is
-     *                     passed in that is not coordinate sorted, it will eventually be coordinated sorted by this class.
-     */
-    public SamLocusIterator(final SamReader samReader, final IntervalList intervalList) {
-        this(samReader, intervalList, samReader.hasIndex());
-    }
-
-    /**
-     * Prepare to iterate through the given SAM records, skipping non-primary alignments
-     *
-     * @param samReader    must be coordinate sorted
-     * @param intervalList Either the list of desired intervals, or null.  Note that if an intervalList is
-     *                     passed in that is not coordinate sorted, it will eventually be coordinated sorted by this class.
-     * @param useIndex     If true, do indexed lookup to improve performance.  Not relevant if intervalList == null.
-     *                     It is no longer the case the useIndex==true can make performance worse.  It should always perform at least
-     *                     as well as useIndex==false, and generally will be much faster.
-     */
-    public SamLocusIterator(final SamReader samReader, final IntervalList intervalList, final boolean useIndex) {
-        super(samReader, intervalList, useIndex);
-    }
-
-    /**
-     * Capture the loci covered by the given SAMRecord in the LocusInfos in the accumulator,
-     * creating new LocusInfos as needed. RecordAndOffset object are created for each aligned base of
-     * <code>SAMRecord</code>.
-     *
-     * @param rec SAMRecord to process and add to <code>LocusInfo</code>
-     */
-    @Override
-    void accumulateSamRecord(final SAMRecord rec) {
-        // get the accumulator offset
-        int accOffset = getAccumulatorOffset(rec);
-
-        final int minQuality = getQualityScoreCutoff();
-        final boolean dontCheckQualities = minQuality == 0;
-        final byte[] baseQualities = dontCheckQualities ? null : rec.getBaseQualities();
-
-        // interpret the CIGAR string and add the base info
-        for (final AlignmentBlock alignmentBlock : rec.getAlignmentBlocks()) {
-            final int readStart = alignmentBlock.getReadStart();
-            final int refStart = alignmentBlock.getReferenceStart();
-            final int blockLength = alignmentBlock.getLength();
-
-            for (int i = 0; i < blockLength; ++i) {
-                // 0-based offset into the read of the current base
-                final int readOffset = readStart + i - 1;
-
-                // if the quality score cutoff is met, accumulate the base info
-                if (dontCheckQualities || baseQualities.length == 0 || baseQualities[readOffset] >= minQuality) {
-                    // 0-based offset from the aligned position of the first base in the read to the aligned position of the current base.
-                    final int refOffset = refStart + i - accOffset;
-                    accumulator.get(refOffset).add(new RecordAndOffset(rec, readOffset));
-                }
-            }
-        }
-    }
-
-    /**
-     * Requires that the accumulator for the record is previously fill with
-     * {@link #accumulateSamRecord(htsjdk.samtools.SAMRecord)}.
-     * Include in the LocusInfo the indels; the quality threshold does not affect insertions/deletions
-     */
-    @Override
-    void accumulateIndels(SAMRecord rec) {
-        // get the cigar elements
-        final List<CigarElement> cigar = rec.getCigar().getCigarElements();
-        // 0-based offset into the read of the current base
-        int readBase = 0;
-        // 0-based offset for the reference of the current base
-        // the accumulator could have the previous position because an indel is accumulating
-        int refBase = rec.getAlignmentStart() - getAccumulatorOffset(rec);
-        // iterate over the cigar element
-        for (int elementIndex = 0; elementIndex < cigar.size(); elementIndex++) {
-            final CigarElement e = cigar.get(elementIndex);
-            final CigarOperator operator = e.getOperator();
-            if (operator.equals(CigarOperator.I)) {
-                System.err.println("");
-                // insertions are included in the previous base
-                accumulator.get(refBase - 1).addInserted(rec, readBase);
-                readBase += e.getLength();
-            } else if (operator.equals(CigarOperator.D)) {
-                // accumulate for each position that spans the deletion
-                for (int i = 0; i < e.getLength(); i++) {
-                    // the offset is the one for the previous base
-                    accumulator.get(refBase + i).addDeleted(rec, readBase - 1);
-                }
-                refBase += e.getLength();
-            } else {
-                if (operator.consumesReadBases()) readBase += e.getLength();
-                if (operator.consumesReferenceBases()) refBase += e.getLength();
-            }
-        }
-    }
-
-    /**
-     * Ensure that the queue is populated and get the accumulator offset for the current record
-     */
-    private int getAccumulatorOffset(SAMRecord rec) {
-        final SAMSequenceRecord ref = getReferenceSequence(rec.getReferenceIndex());
-        final int alignmentStart = rec.getAlignmentStart();
-        final int alignmentEnd = rec.getAlignmentEnd();
-        final int alignmentLength = alignmentEnd - alignmentStart;
-        // get the offset for an insertion if we are tracking them
-        final int insOffset = (includeIndels && startWithInsertion(rec.getCigar())) ? 1 : 0;
-        // if there is an insertion in the first base and it is not tracked in the accumulator, add it
-        if (insOffset == 1 && accumulator.isEmpty()) {
-            accumulator.add(new LocusInfo(ref, alignmentStart - 1));
-        }
-        // Ensure there are LocusInfos up to and including this position
-        for (int i = accumulator.size(); i <= alignmentLength + insOffset; ++i) {
-            accumulator.add(new LocusInfo(ref, alignmentStart + i - insOffset));
-        }
-        return alignmentStart - insOffset;
-    }
-
-
-    /**
-     * @param rec        aligned SamRecord
-     * @param readOffset offset from start of read
-     * @param length     1, as object represents only one aligned base
-     * @param refPos     -1,  as this filed isn't used for this implementation
-     * @param type       null for this implementation
-     * @return created RecordAndOffset
-     */
-    @Override
-    RecordAndOffset createRecordAndOffset(SAMRecord rec, int readOffset, int length, int refPos) {
-        return new RecordAndOffset(rec, readOffset);
-    }
-
-    /**
-     * @param referenceSequence processed reference sequence
-     * @param lastPosition      last processed reference locus position
-     * @return <code>LocusInfo<T></code> for the lastPosition
-     */
-    @Override
-    LocusInfo createLocusInfo(SAMSequenceRecord referenceSequence, int lastPosition) {
-        return new LocusInfo(referenceSequence, lastPosition);
-    }
-
-    // --------------------------------------------------------------------------------------------
-    // Helper methods below this point...
-    // --------------------------------------------------------------------------------------------
-
-    /**
-     * Implementation of <code>AbstractRecordAndOffset</code> class for <code>SamLocusIterator</code>.
-     * One object represents one aligned base of inner <code>SAMRecord</code>.
-     */
-    public static class RecordAndOffset extends AbstractRecordAndOffset {
-
-        /**
-         * @param record inner <code>SAMRecord</code>
-         * @param offset 0-based offset from the start of <code>SAMRecord</code>
-         */
-        public RecordAndOffset(final SAMRecord record, final int offset) {
-            super(record, offset);
-        }
-    }
-
-    /**
-     * The unit of iteration.  Holds information about the locus (the SAMSequenceRecord and 1-based position
-     * on the reference), plus List of ReadAndOffset objects, one for each read that overlaps the locus;
-     * two more List_s_ of ReadAndOffset objects include reads that overlap the locus with insertions and deletions
-     * respectively
-     */
-    public static final class LocusInfo extends AbstractLocusInfo<RecordAndOffset> {
-
-        private List<RecordAndOffset> deletedInRecord = null;
-        private List<RecordAndOffset> insertedInRecord = null;
-
-        /**
-         * @param referenceSequence reference sequence at which the reads are aligned
-         * @param position          position in the sequence at which the reads are aligned
-         */
-        public LocusInfo(SAMSequenceRecord referenceSequence, int position) {
-            super(referenceSequence, position);
-        }
-
-        /**
-         * Accumulate info for one read with a deletion
-         */
-        public void addDeleted(final SAMRecord read, int previousPosition) {
-            if (deletedInRecord == null) {
-                deletedInRecord = new ArrayList<>();
-            }
-            deletedInRecord.add(new RecordAndOffset(read, previousPosition));
-        }
-
-        /**
-         * Accumulate info for one read with an insertion.
-         * For this locus, the reads in the insertion are included also in recordAndOffsets
-         */
-
-        public void addInserted(final SAMRecord read, int firstPosition) {
-
-            if (insertedInRecord == null) {
-                insertedInRecord = new ArrayList<>();
-            }
-            insertedInRecord.add(new RecordAndOffset(read, firstPosition));
-        }
-
-        public List<RecordAndOffset> getDeletedInRecord() {
-            return (deletedInRecord == null) ? Collections.emptyList() : Collections.unmodifiableList(deletedInRecord);
-        }
-
-        public List<RecordAndOffset> getInsertedInRecord() {
-            return (insertedInRecord == null) ? Collections.emptyList() : Collections.unmodifiableList(insertedInRecord);
-        }
-        
-        /** 
-         * @return the number of records overlapping the position, with deletions included if they are being tracked. 
-         */
-        @Override
-        public int size() { 
-            return super.size() + ((deletedInRecord == null) ? 0 : deletedInRecord.size()); 
-        }
-
-
-        /**
-         * @return <code>true</code> if all the RecordAndOffset lists are empty;
-         * <code>false</code> if at least one have records
-         */
-        @Override
-        public boolean isEmpty() {
-            return getRecordAndPositions().isEmpty() &&
-                    (deletedInRecord == null || deletedInRecord.isEmpty()) &&
-                    (insertedInRecord == null || insertedInRecord.isEmpty());
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SamRecordIntervalIteratorFactory.java b/src/main/java/htsjdk/samtools/util/SamRecordIntervalIteratorFactory.java
deleted file mode 100644
index 5d173a5..0000000
--- a/src/main/java/htsjdk/samtools/util/SamRecordIntervalIteratorFactory.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.QueryInterval;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.filter.IntervalFilter;
-import htsjdk.samtools.filter.SamRecordFilter;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * Create an iterator over a {@link SamReader} that only returns reads that overlap one of the intervals
- * in an interval list.
- *
- * @author alecw at broadinstitute.org
- */
-public class SamRecordIntervalIteratorFactory {
-
-    /**
-     * @param samReader
-     * @param uniqueIntervals list of intervals of interest, with overlaps merged, in coordinate order
-     * @param useIndex        if false, do not use a BAM index even if it is present.
-     * @return an iterator that will be filtered so that only SAMRecords overlapping the intervals
-     * in uniqueIntervals will be returned.  If a BAM index is available, it will be used to improve performance.
-     * Note however that if there are many intervals that cover a great deal of the genome, using the BAM
-     * index may actually make performance worse.
-     */
-    public CloseableIterator<SAMRecord> makeSamRecordIntervalIterator(final SamReader samReader,
-                                                                      final List<Interval> uniqueIntervals,
-                                                                      final boolean useIndex) {
-        if (!samReader.hasIndex() || !useIndex) {
-            final int stopAfterSequence;
-            final int stopAfterPosition;
-            if (uniqueIntervals.isEmpty()) {
-                stopAfterSequence = -1;
-                stopAfterPosition = -1;
-            } else {
-                final Interval lastInterval = uniqueIntervals.get(uniqueIntervals.size() - 1);
-                stopAfterSequence = samReader.getFileHeader().getSequenceIndex(lastInterval.getContig());
-                stopAfterPosition = lastInterval.getEnd();
-            }
-            final IntervalFilter intervalFilter = new IntervalFilter(uniqueIntervals, samReader.getFileHeader());
-            return new StopAfterFilteringIterator(samReader.iterator(), intervalFilter, stopAfterSequence, stopAfterPosition);
-        } else {
-            final QueryInterval[] queryIntervals = new QueryInterval[uniqueIntervals.size()];
-            for (int i = 0; i < queryIntervals.length; ++i) {
-                final Interval inputInterval = uniqueIntervals.get(i);
-                queryIntervals[i] = new QueryInterval(samReader.getFileHeader().getSequenceIndex(inputInterval.getContig()),
-                        inputInterval.getStart(), inputInterval.getEnd());
-            }
-            return samReader.queryOverlapping(queryIntervals);
-        }
-    }
-
-    /**
-     * Halt iteration after a read is encountered that starts after the given sequence and position.
-     * Note that most of this code is copied from FilteringSamIterator.  It would be nice just to override getNextRecord,
-     * but that method is called FilteringSamIterator ctor, so the stopAfter members can't be initialized before
-     * it is called.
-     * FilteringSamIterator ctor could take a boolean "advance" that would tell it whether or not to call getNextRecord
-     * in the ctor, so that it could be delayed in the subclass.  If this pattern happens again, we should do that.
-     */
-    private class StopAfterFilteringIterator implements CloseableIterator<SAMRecord> {
-        private final int stopAfterSequence;
-        private final int stopAfterPosition;
-        private final Iterator<SAMRecord> iterator;
-        private final SamRecordFilter filter;
-        private SAMRecord next = null;
-
-        private StopAfterFilteringIterator(Iterator<SAMRecord> iterator, SamRecordFilter filter,
-                                           int stopAfterSequence, int stopAfterPosition) {
-            this.stopAfterSequence = stopAfterSequence;
-            this.stopAfterPosition = stopAfterPosition;
-            this.iterator = iterator;
-            this.filter = filter;
-            next = getNextRecord();
-        }
-
-
-        /**
-         * Returns true if the iteration has more elements.
-         *
-         * @return true if the iteration has more elements.  Otherwise returns false.
-         */
-        public boolean hasNext() {
-            return next != null;
-        }
-
-        /**
-         * Returns the next element in the iteration.
-         *
-         * @return the next element in the iteration
-         * @throws java.util.NoSuchElementException
-         */
-        public SAMRecord next() {
-            if (next == null) {
-                throw new NoSuchElementException("Iterator has no more elements.");
-            }
-            final SAMRecord result = next;
-            next = getNextRecord();
-            return result;
-        }
-
-        /**
-         * Required method for Iterator API.
-         *
-         * @throws UnsupportedOperationException
-         */
-        public void remove() {
-            throw new UnsupportedOperationException("Remove() not supported by FilteringSamIterator");
-        }
-
-        public void close() {
-            CloserUtil.close(iterator);
-        }
-
-        protected SAMRecord getNextRecord() {
-            while (iterator.hasNext()) {
-                SAMRecord record = iterator.next();
-                if (record.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) return null;
-                else if (record.getReferenceIndex() > stopAfterSequence) return null;
-                else if (record.getReferenceIndex() == stopAfterSequence && record.getAlignmentStart() > stopAfterPosition) {
-                    return null;
-                }
-                if (!filter.filterOut(record)) {
-                    return record;
-                }
-            }
-            return null;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SamRecordTrackingBuffer.java b/src/main/java/htsjdk/samtools/util/SamRecordTrackingBuffer.java
deleted file mode 100644
index 46cf8bf..0000000
--- a/src/main/java/htsjdk/samtools/util/SamRecordTrackingBuffer.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.BAMRecordCodec;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-
-import java.io.File;
-import java.util.ArrayDeque;
-import java.util.BitSet;
-import java.util.Deque;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * This class stores SAMRecords for return.  The purpose of this class is to buffer records that need to be modified or processed in some
- * fashion, and only return (or emit) them when they have been recorded as being fully examined.  If we have too many records in RAM,
- * we can spill over to disk.  The order in which they are given (via SamRecordWithOrdinal) determines their order of being returned.  It is the
- * responsibility of the user of this class to make sure all records have unique index and are added in order.
- *
- * When a record is examined, we also store a result state.  This is currently a boolean to reduce on memory and disk footprint.
- *
- * We store groups of records in blocks and the size of these blocks can be controlled.  If we have too many records in RAM, we start
- * spilling blocks to disk.
- *
- * Users should check isEmpty() to see if any records are still being tracked.  If so, they should check canEmit() to see if the
- * next record can be returned.  If so, they can call next() to get that record.
- *
- * When users are done with this structure, call close().
- *
- * @author bradtaylor
- */
-public class SamRecordTrackingBuffer<T extends SamRecordWithOrdinal> {
-    private int availableRecordsInMemory; // how many more records can we store in memory
-    private final int blockSize; // the size of each block
-    private final List<File> tmpDirs; // the list of temporary directories to use
-    private long queueHeadRecordIndex; // the index of the head of the buffer
-    private long queueTailRecordIndex; // the index of the tail of the buffer
-    private final Deque<BufferBlock> blocks; // the queue of blocks, in which records are contained
-    private final SAMFileHeader header;
-
-    private final Class<T> clazz; // the class to create
-
-    /**
-     * @param maxRecordsInRam how many records to buffer before spilling to disk
-     * @param blockSize the number of records in a given block
-     * @param tmpDirs the temporary directories to use when spilling to disk
-     * @param header the header
-     * @param clazz the class that extends SamRecordWithOrdinal
-     */
-    public SamRecordTrackingBuffer(final int maxRecordsInRam, final int blockSize, final List<File> tmpDirs, final SAMFileHeader header, final Class<T> clazz) {
-        this.availableRecordsInMemory = maxRecordsInRam;
-        this.blockSize = blockSize;
-        this.tmpDirs = tmpDirs;
-        this.queueHeadRecordIndex = -1;
-        this.queueTailRecordIndex = -1;
-        this.blocks = new ArrayDeque<BufferBlock>();
-        this.header = header;
-        this.clazz = clazz;
-    }
-
-    /** Returns true if we are tracking no records, false otherwise */
-    public boolean isEmpty() { return (blocks.isEmpty() || this.blocks.getFirst().isEmpty()); }
-
-    /** Returns true if we can return the next record (it has been examined). */
-    public boolean canEmit() { return (!this.blocks.isEmpty() && this.blocks.getFirst().canEmit()); }
-
-    /**
-     * Add the given SAMRecordIndex to the buffer.  The records must be added in order.
-     * @param samRecordWithOrdinal The samRecordWithOrdinal to be added
-     */
-    public void add(final SamRecordWithOrdinal samRecordWithOrdinal) {
-        if (this.isEmpty()) {
-            this.queueHeadRecordIndex = samRecordWithOrdinal.getRecordOrdinal();
-            this.queueTailRecordIndex = samRecordWithOrdinal.getRecordOrdinal() - 1;
-        }
-        this.queueTailRecordIndex++;
-        if (samRecordWithOrdinal.getRecordOrdinal() != this.queueTailRecordIndex) {
-            throw new SAMException("The records were added out of order");
-        }
-        // If necessary, create a new block, using as much ram as available up to its total size
-        if (this.blocks.isEmpty() || !this.blocks.getLast().canAdd()) {
-            // once ram is given to a block, we can't give it to another block (until some is recovered from the head of the queue)
-            final int blockRam = Math.min(this.blockSize, this.availableRecordsInMemory);
-            this.availableRecordsInMemory = this.availableRecordsInMemory - blockRam;
-            final BufferBlock block = new BufferBlock(this.blockSize, blockRam, this.tmpDirs, this.header, samRecordWithOrdinal.getRecordOrdinal());
-            this.blocks.addLast(block);
-        }
-        this.blocks.getLast().add(samRecordWithOrdinal);
-    }
-
-    /**
-     * Returns the next element in the iteration.
-     *
-     * @return The next element in the iteration.
-     * @throws java.util.NoSuchElementException if the buffer is empty.
-     * @throws SAMException if the buffer is not competent to emit (canEmit returns false)
-     */
-    public SamRecordWithOrdinal next() {
-        if (this.isEmpty())
-            throw new NoSuchElementException("Attempting to remove an element from an empty SamRecordTrackingBuffer");
-        final BufferBlock headBlock = this.blocks.getFirst();
-        if (!headBlock.canEmit())
-            throw new SAMException("Attempting to get a samRecordWithOrdinal from the SamRecordTrackingBuffer that has not been through " +
-                    "marked as examined. canEmit() must return true in order to call next()");
-
-        // If the samRecordWithOrdinal was stored in memory, reclaim its ram for use in additional blocks at tail of queue
-        // NB: this must be checked before calling next(), as that method updates the block-head
-        if (!headBlock.headRecordIsFromDisk()) {
-            this.availableRecordsInMemory++;
-        }
-        final SamRecordWithOrdinal samRecordWithOrdinal = headBlock.next();
-        if (headBlock.hasBeenDrained()) {
-            blocks.poll(); // remove the block as it is now empty
-            headBlock.clear(); // free any disk io resources associated with empty block
-        }
-        this.queueHeadRecordIndex++;
-        return samRecordWithOrdinal;
-    }
-
-    /** Removes the next record from this buffer */
-    public void remove() { this.next(); }
-
-    /**
-     * Return the total number of elements in the queue, both in memory and on disk
-     */
-    public long size() { return this.queueTailRecordIndex - this.queueHeadRecordIndex + 1; }
-
-    /** Returns the block that holds the sam record at the given index, null if no such block exists */
-    private BufferBlock getBlock(final SamRecordWithOrdinal samRecordWithOrdinal) {
-        for (final BufferBlock block : this.blocks) {
-            if (block.getStartIndex() <= samRecordWithOrdinal.getRecordOrdinal() && block.getEndIndex() >= samRecordWithOrdinal.getRecordOrdinal()) {
-                return block;
-            }
-        }
-        return null;
-    }
-
-    /** Returns true if this buffer contains the record at the given index, false otherwise */
-    public boolean contains(final SamRecordWithOrdinal samRecordWithOrdinal) {
-        return (null != getBlock(samRecordWithOrdinal));
-    }
-
-    /**
-     * Mark the current samRecordWithOrdinal as having been examined.
-     *
-     * @param samRecordWithOrdinal The samRecordWithOrdinal to be marked
-     * @param resultState Boolean flag indicating the result of the examination of this record.
-     * @throws SAMException if the provided recordIndex is not found within the SamRecordTrackingBuffer
-     */
-    public void setResultState(final SamRecordWithOrdinal samRecordWithOrdinal, final boolean resultState) {
-        final BufferBlock block = getBlock(samRecordWithOrdinal);
-        if (null == block) {
-            throw new SAMException("Attempted to set examined information on a samRecordWithOrdinal whose index is not found " +
-                    "in the SamRecordTrackingBuffer. recordIndex: " + samRecordWithOrdinal.getRecordOrdinal());
-        }
-        block.setResultState(samRecordWithOrdinal, resultState);
-    }
-
-    /**
-     * Close IO resources associated with each underlying BufferBlock
-     */
-    public void close() {
-        while (!blocks.isEmpty()) {
-            final BufferBlock block = blocks.pollFirst();
-            block.clear();
-        }
-    }
-
-    /**
-     * This stores blocks of records, either in memory or on disk, or both!
-     */
-    private class BufferBlock {
-        private final DiskBackedQueue<SAMRecord> recordsQueue;
-        private final int maxBlockSize;
-        private long currentStartIndex;
-        private final long originalStartIndex;
-        private long endIndex;
-
-        private final BitSet wasExaminedIndexes;
-        private final BitSet resultStateIndexes;
-
-        /** Creates an empty block buffer, with an allowable # of records in RAM */
-        public BufferBlock(final int maxBlockSize, final int maxBlockRecordsInMemory, final List<File> tmpDirs,
-                           final SAMFileHeader header,
-                           final long originalStartIndex) {
-            this.recordsQueue = DiskBackedQueue.newInstance(new BAMRecordCodec(header), maxBlockRecordsInMemory, tmpDirs);
-            this.maxBlockSize = maxBlockSize;
-            this.currentStartIndex = 0;
-            this.endIndex = -1;
-            this.wasExaminedIndexes = new BitSet(maxBlockSize);
-            this.resultStateIndexes = new BitSet(maxBlockSize);
-            this.originalStartIndex = originalStartIndex;
-        }
-
-        /**
-         * Check that the tail of the block has not grown past the maximum block size (even if records were popped) and that the underlying queue can be added to.
-         * TODO - reimplement with a circular byte array buffer PROVIDED RECORDS ARE IN MEMORY
-         * @return
-         */
-        public boolean canAdd() { return (this.endIndex - this.originalStartIndex + 1) < this.maxBlockSize && this.recordsQueue.canAdd(); }
-
-        /** Returns true if the record at the front of the buffer is on disk */
-        public boolean headRecordIsFromDisk() { return this.recordsQueue.headRecordIsFromDisk(); }
-
-        /**
-         * Check whether we have read all possible records from this block (and it is available to be destroyed)
-         * @return true if we have read the last /possible/ record (ie the block size, or if !canAdd the end index)
-         */
-        public boolean hasBeenDrained() {
-            final long maximalIndex = (this.canAdd()) ? (this.originalStartIndex + this.maxBlockSize) : this.endIndex;
-            return this.currentStartIndex > maximalIndex;       //NB: watch out for an off by one here
-        }
-
-        /** Gets the index of the first record in this block */
-        public long getStartIndex() { return this.currentStartIndex; }
-
-        /** Gets the index of the last record in this block */
-        public long getEndIndex() { return this.endIndex; }
-
-        /** Add a record to this block */
-        public void add(final SamRecordWithOrdinal samRecordWithOrdinal) {
-            if (this.recordsQueue.canAdd()) {
-                if (this.recordsQueue.isEmpty()) {
-                    this.currentStartIndex = samRecordWithOrdinal.getRecordOrdinal();
-                    this.endIndex = samRecordWithOrdinal.getRecordOrdinal() - 1;
-                }
-                this.recordsQueue.add(samRecordWithOrdinal.getRecord());
-                this.endIndex++;
-            } else {
-                throw new IllegalStateException("Cannot add to DiskBackedQueue whose canAdd() method returns false");
-            }
-        }
-
-        private int ensureIndexFitsInAnInt(final long value) {
-            if (value < Integer.MIN_VALUE || Integer.MAX_VALUE < value) throw new SAMException("Error: index out of range: " + value);
-            return (int)value;
-        }
-
-        /**
-         * Mark the current samRecordWithOrdinal as having been examined with a given result state.
-         *
-         * @param samRecordWithOrdinal The samRecordWithOrdinal to be marked
-         * @param resultState Boolean flag indicating the result of the examination of this record.
-         *
-         * This assumes that this record index does not fall out of range.
-         */
-        public void setResultState(final SamRecordWithOrdinal samRecordWithOrdinal, final boolean resultState) {
-            // find the correct byte array index and update both metadata byte arrays
-            this.wasExaminedIndexes.set(ensureIndexFitsInAnInt(samRecordWithOrdinal.getRecordOrdinal() - this.originalStartIndex), true);
-            this.resultStateIndexes.set(ensureIndexFitsInAnInt(samRecordWithOrdinal.getRecordOrdinal() - this.originalStartIndex), resultState);
-        }
-
-        public boolean isEmpty() {
-            return (this.recordsQueue.isEmpty());
-        }
-
-        public boolean canEmit() {
-            // TODO: what if isEmpty() == true?
-            return this.wasExaminedIndexes.get(ensureIndexFitsInAnInt(this.currentStartIndex - this.originalStartIndex));
-        }
-
-        public SamRecordWithOrdinal next() throws IllegalStateException {
-            if (this.canEmit()) {
-                try {
-                    // create a wrapped record for the head of the queue, and set the underlying record's examined information appropriately
-                    final SamRecordWithOrdinal samRecordWithOrdinal = clazz.newInstance();
-                    samRecordWithOrdinal.setRecord(this.recordsQueue.poll());
-                    samRecordWithOrdinal.setRecordOrdinal(this.currentStartIndex);
-                    samRecordWithOrdinal.setResultState(this.resultStateIndexes.get(ensureIndexFitsInAnInt(this.currentStartIndex - this.originalStartIndex)));
-                    this.currentStartIndex++;
-                    return samRecordWithOrdinal;
-                } catch (final Exception e) {
-                    throw new RuntimeException(e);
-                }
-            } else {
-                throw new IllegalStateException("Cannot call next() on a buffer block where canEmit() is false!");
-            }
-        }
-
-        /**
-         * Remove, but do not return, the next samRecordWithOrdinal in the iterator
-         */
-        public void remove() { this.next(); }
-
-        /**
-         * Return the total number of elements in the block, both in memory and on disk
-         */
-        public long size() { return this.endIndex - this.currentStartIndex + 1; }
-
-        /**
-         * Close disk IO resources associated with the underlying records queue.
-         * This must be called when a block is no longer needed in order to prevent memory leaks.
-         */
-        public void clear() { this.recordsQueue.clear(); }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SamRecordWithOrdinal.java b/src/main/java/htsjdk/samtools/util/SamRecordWithOrdinal.java
deleted file mode 100644
index 096c416..0000000
--- a/src/main/java/htsjdk/samtools/util/SamRecordWithOrdinal.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * A little class to store the unique index associated with this record.  The index is determined as records are read in, so is in fact
- * gives the ordinal of the record in the input file.  All sub-classes should have a default constructor.  Additionally, all implementations
- * of this class must implement setResultState, as this class is typically used when wanting to return SAMRecord's in same input order,
- * but only when some computation (ex. duplicate marking) has been performed.
- */
-public abstract class SamRecordWithOrdinal {
-    private SAMRecord record;
-    private long recordOrdinal;
-
-    public SamRecordWithOrdinal() {
-        this.record = null;
-        this.recordOrdinal = -1;
-    }
-
-    public SamRecordWithOrdinal(final SAMRecord record, final long recordOrdinal) {
-        this.record = record;
-        this.recordOrdinal = recordOrdinal;
-    }
-
-    public SAMRecord getRecord() { return this.record; }
-    public void setRecord(final SAMRecord record) { this.record = record; }
-    public long getRecordOrdinal() { return this.recordOrdinal; }
-    public void setRecordOrdinal(final long recordOrdinal) { this.recordOrdinal = recordOrdinal; }
-
-    /** Set the result state on this record. */
-    abstract public void setResultState(final boolean resultState);
-}
diff --git a/src/main/java/htsjdk/samtools/util/SequenceUtil.java b/src/main/java/htsjdk/samtools/util/SequenceUtil.java
deleted file mode 100644
index 3108cee..0000000
--- a/src/main/java/htsjdk/samtools/util/SequenceUtil.java
+++ /dev/null
@@ -1,1031 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.AlignmentBlock;
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SAMTag;
-
-import java.io.File;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class SequenceUtil {
-    /** Byte typed variables for all normal bases. */
-    public static final byte a = 'a', c = 'c', g = 'g', t = 't', n = 'n', A = 'A', C = 'C', G = 'G', T = 'T', N = 'N';
-
-    public static final byte[] VALID_BASES_UPPER = new byte[]{A, C, G, T};
-    public static final byte[] VALID_BASES_LOWER = new byte[]{a, c, g, t};
-
-    private static final byte A_MASK = 1;
-    private static final byte C_MASK = 2;
-    private static final byte G_MASK = 4;
-    private static final byte T_MASK = 8;
-
-    private static final byte[] bases = new byte[127];
-
-    /*
-     * Definition of IUPAC codes:
-     * http://www.bioinformatics.org/sms2/iupac.html
-     */
-    static {
-        Arrays.fill(bases, (byte) 0);
-        bases[A] = A_MASK;
-        bases[C] = C_MASK;
-        bases[G] = G_MASK;
-        bases[T] = T_MASK;
-        bases['M'] = A_MASK | C_MASK;
-        bases['R'] = A_MASK | G_MASK;
-        bases['W'] = A_MASK | T_MASK;
-        bases['S'] = C_MASK | G_MASK;
-        bases['Y'] = C_MASK | T_MASK;
-        bases['K'] = G_MASK | T_MASK;
-        bases['V'] = A_MASK | C_MASK | G_MASK;
-        bases['H'] = A_MASK | C_MASK | T_MASK;
-        bases['D'] = A_MASK | G_MASK | T_MASK;
-        bases['B'] = C_MASK | G_MASK | T_MASK;
-        bases['N'] = A_MASK | C_MASK | G_MASK | T_MASK;
-        // Also store the bases in lower case
-        for (int i = 'A'; i <= 'Z'; i++) {
-            bases[(byte) i + 32] = bases[(byte) i];
-        }
-        bases['.'] = A_MASK | C_MASK | G_MASK | T_MASK;
-    };
-
-
-    /**
-     * Calculate the reverse complement of the specified sequence
-     * (Stolen from Reseq)
-     *
-     * @param sequenceData
-     * @return reverse complement
-     */
-    public static String reverseComplement(final String sequenceData) {
-        final byte[] bases = htsjdk.samtools.util.StringUtil.stringToBytes(sequenceData);
-        reverseComplement(bases);
-        return htsjdk.samtools.util.StringUtil.bytesToString(bases);
-    }
-
-
-    /**
-     * Efficiently compare two IUPAC base codes, simply returning true if they are equal (ignoring case),
-     * without considering the set relationships between ambiguous codes.
-     */
-    public static boolean basesEqual(final byte lhs, final byte rhs) {
-        return (bases[lhs] == bases[rhs]);
-    }
-
-    /**
-     * Efficiently compare two IUPAC base codes, one coming from a read sequence and the other coming from
-     * a reference sequence, using the reference code as a 'pattern' that the read base must match.
-     *
-     * We take ambiguous codes into account, returning true if the set of possible bases
-     * represented by the read value is a (non-strict) subset of the possible bases represented
-     * by the reference value.
-     *
-     * Since the comparison is directional, make sure to pass read / ref codes in correct order.
-     */
-    public static boolean readBaseMatchesRefBaseWithAmbiguity(final byte readBase, final byte refBase) {
-        return (bases[readBase] & bases[refBase]) == bases[readBase];
-    }
-
-    /**
-     * returns true if the value of base represents a no call
-     */
-    public static boolean isNoCall(final byte base) {
-        return base == 'N' || base == 'n' || base == '.';
-    }
-
-    /** Returns true if the byte is in [acgtACGT]. */
-    public static boolean isValidBase(final byte b) {
-        return isValidBase(b, VALID_BASES_UPPER) || isValidBase(b, VALID_BASES_LOWER);
-    }
-
-    private static boolean isValidBase(final byte b, final byte[] validBases) {
-        for (final byte validBase : validBases) {
-            if (b == validBase) return true;
-        }
-        return false;
-    }
-
-    /** Calculates the fraction of bases that are G/C in the sequence. */
-    public static double calculateGc(final byte[] bases) {
-        int gcs = 0;
-        for (int i = 0; i < bases.length; ++i) {
-            final byte b = bases[i];
-            if (b == 'C' || b == 'G' || b == 'c' || b == 'g') ++gcs;
-        }
-
-        return gcs / (double) bases.length;
-    }
-
-    /**
-     * default signature that forces the lists to be the same size
-     *
-     * @param s1 a list of sequence headers
-     * @param s2 a second list of sequence headers
-     */
-    public static void assertSequenceListsEqual(final List<SAMSequenceRecord> s1, final List<SAMSequenceRecord> s2) {
-        assertSequenceListsEqual(s1, s2, false);
-    }
-    /**
-     * Throws an exception only if both (first) parameters are not null
-     * optionally check that one list is a (nonempty) prefix of the other.
-     *
-     * @param s1 a list of sequence headers
-     * @param s2 a second list of sequence headers
-     * @param checkPrefixOnly a flag specifying whether to only look at the first records in the lists. This will then check that the
-     * records of the smaller dictionary are equal to the records of the beginning of the larger dictionary, which can be useful since
-     * sometimes different pipelines choose to use only the first contigs of a standard reference.
-     */
-    public static void assertSequenceListsEqual(final List<SAMSequenceRecord> s1, final List<SAMSequenceRecord> s2, final boolean checkPrefixOnly) {
-        if (s1 != null && s2 != null) {
-
-            final int sizeToTest;
-
-            if (checkPrefixOnly) {
-                sizeToTest = Math.min(s1.size(), s2.size());
-                if (sizeToTest == 0) {
-                    throw new SequenceListsDifferException("Neither of the dictionaries can be empty.");
-                }
-            } else {
-                sizeToTest = s1.size();
-                if (s1.size() != s2.size()) {
-                    throw new SequenceListsDifferException(
-                            "Sequence dictionaries are not the same size (" + s1.size() + ", " + s2.size() +
-                                    ")");
-                }
-            }
-            for (int i = 0; i < sizeToTest; ++i) {
-                if (!s1.get(i).isSameSequence(s2.get(i))) {
-                    String s1Attrs = "";
-                    for (final java.util.Map.Entry<String, String> entry : s1.get(i)
-                            .getAttributes()) {
-                        s1Attrs += "/" + entry.getKey() + "=" + entry.getValue();
-                    }
-                    String s2Attrs = "";
-                    for (final java.util.Map.Entry<String, String> entry : s2.get(i)
-                            .getAttributes()) {
-                        s2Attrs += "/" + entry.getKey() + "=" + entry.getValue();
-                    }
-                    throw new SequenceListsDifferException(
-                            "Sequences at index " + i + " don't match: " +
-                                    s1.get(i).getSequenceIndex() + "/" + s1.get(i).getSequenceLength() +
-                                    "/" + s1.get(i).getSequenceName() + s1Attrs + " " +
-                                    s2.get(i).getSequenceIndex() + "/" + s2.get(i).getSequenceLength() +
-                                    "/" + s2.get(i).getSequenceName() + s2Attrs);
-                }
-            }
-        }
-    }
-
-    public static class SequenceListsDifferException extends SAMException {
-        public SequenceListsDifferException() {
-        }
-
-        public SequenceListsDifferException(final String s) {
-            super(s);
-        }
-
-        public SequenceListsDifferException(final String s, final Throwable throwable) {
-            super(s, throwable);
-        }
-
-        public SequenceListsDifferException(final Throwable throwable) {
-            super(throwable);
-        }
-    }
-
-    /**
-     * Returns true if both parameters are null or equal, otherwise returns false
-     *
-     * @param s1 a list of sequence headers
-     * @param s2 a second list of sequence headers
-     */
-    public static boolean areSequenceDictionariesEqual(final SAMSequenceDictionary s1, final SAMSequenceDictionary s2) {
-        if (s1 == null && s2 == null) return true;
-        if (s1 == null || s2 == null) return false;
-
-        try {
-            assertSequenceListsEqual(s1.getSequences(), s2.getSequences());
-            return true;
-        } catch (final SequenceListsDifferException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Throws an exception if both parameters are non-null and unequal.
-     *
-     * @param s1 a list of sequence headers
-     * @param s2 a second list of sequence headers
-     */
-    public static void assertSequenceDictionariesEqual(final SAMSequenceDictionary s1, final SAMSequenceDictionary s2) {
-        assertSequenceDictionariesEqual(s1, s2, false);
-    }
-
-    /**
-     * Throws an exception if both (first) parameters are non-null and unequal (if checkPrefixOnly, checks prefix of lists only).
-     *
-     * @param s1 a list of sequence headers
-     * @param s2 a second list of sequence headers
-     * @param checkPrefixOnly a flag specifying whether to only look at the first records in the lists. This will then check that the
-     * records of the smaller dictionary are equal to the records of the beginning of the larger dictionary, which can be useful since
-     * sometimes different pipelines choose to use only the first contigs of a standard reference.
-     */
-    public static void assertSequenceDictionariesEqual(final SAMSequenceDictionary s1, final SAMSequenceDictionary s2, final boolean checkPrefixOnly) {
-        if (s1 == null || s2 == null) return;
-        assertSequenceListsEqual(s1.getSequences(), s2.getSequences(), checkPrefixOnly);
-    }
-
-    /**
-     * Throws an exception if both parameters are non-null and unequal, including the filenames.
-     */
-    public static void assertSequenceDictionariesEqual(final SAMSequenceDictionary s1, final SAMSequenceDictionary s2,
-                                                       final File f1, final File f2) {
-        try {
-            assertSequenceDictionariesEqual(s1, s2);
-        } catch (final SequenceListsDifferException e) {
-            throw new SequenceListsDifferException("In files " + f1.getAbsolutePath() + " and " + f2.getAbsolutePath(), e);
-        }
-    }
-
-    /**
-     * Create a simple ungapped cigar string, which might have soft clipping at either end
-     *
-     * @param alignmentStart raw aligment start, which may result in read hanging off beginning or end of read
-     * @return cigar string that may have S operator at beginning or end, and has M operator for the rest of the read
-     */
-    public static String makeCigarStringWithPossibleClipping(final int alignmentStart, final int readLength, final int referenceSequenceLength) {
-        int start = alignmentStart;
-        int leftSoftClip = 0;
-        if (start < 1) {
-            leftSoftClip = 1 - start;
-            start = 1;
-        }
-        int rightSoftClip = 0;
-        if (alignmentStart + readLength > referenceSequenceLength + 1) {
-            rightSoftClip = alignmentStart + readLength - referenceSequenceLength - 1;
-        }
-        // CIGAR is trivial because there are no indels or clipping in Gerald
-        final int matchLength = readLength - leftSoftClip - rightSoftClip;
-        if (matchLength < 1) {
-            throw new SAMException("Unexpected cigar string with no M op for read.");
-        }
-        return makeSoftClipCigar(leftSoftClip) + Integer.toString(matchLength) + "M" + makeSoftClipCigar(rightSoftClip);
-    }
-
-    /**
-     * Create a cigar string for a gapped alignment, which may have soft clipping at either end
-     *
-     * @param alignmentStart          raw alignment start, which may result in read hanging off beginning or end of read
-     * @param readLength
-     * @param referenceSequenceLength
-     * @param indelPosition           number of matching bases before indel.  Must be > 0
-     * @param indelLength             length of indel.  Positive for insertion, negative for deletion.
-     * @return cigar string that may have S operator at beginning or end, has one or two M operators, and an I or a D.
-     */
-    public static String makeCigarStringWithIndelPossibleClipping(final int alignmentStart,
-                                                                  final int readLength,
-                                                                  final int referenceSequenceLength,
-                                                                  final int indelPosition,
-                                                                  final int indelLength) {
-        int start = alignmentStart;
-        int leftSoftClip = 0;
-        if (start < 1) {
-            leftSoftClip = 1 - start;
-            start = 1;
-        }
-        int rightSoftClip = 0;
-        final int alignmentEnd = alignmentStart + readLength - indelLength;
-        if (alignmentEnd > referenceSequenceLength + 1) {
-            rightSoftClip = alignmentEnd - referenceSequenceLength - 1;
-        }
-        if (leftSoftClip >= indelPosition) {
-            throw new IllegalStateException("Soft clipping entire pre-indel match. leftSoftClip: " + leftSoftClip +
-                    "; indelPosition: " + indelPosition);
-        }
-        // CIGAR is trivial because there are no indels or clipping in Gerald
-        final int firstMatchLength = indelPosition - leftSoftClip;
-        final int secondMatchLength = readLength - indelPosition - (indelLength > 0 ? indelLength : 0) - rightSoftClip;
-        if (secondMatchLength < 1) {
-            throw new SAMException("Unexpected cigar string with no M op for read.");
-        }
-        return makeSoftClipCigar(leftSoftClip) + Integer.toString(firstMatchLength) + "M" +
-                Math.abs(indelLength) + (indelLength > 0 ? "I" : "D") +
-                Integer.toString(secondMatchLength) + "M" +
-                makeSoftClipCigar(rightSoftClip);
-    }
-
-    public static String makeSoftClipCigar(final int clipLength) {
-        if (clipLength == 0) {
-            return "";
-        }
-        return Integer.toString(clipLength) + "S";
-    }
-
-    /**
-     * Helper method to handle the various use cases of base comparison.
-     *
-     * @param readBase the read base to match
-     * @param refBase the reference base to match
-     * @param negativeStrand set to true if the base to test is on the negative strand and should be reverse complemented (only applies if bisulfiteSequence is true)
-     * @param bisulfiteSequence set to true if the base to match is a bisulfite sequence and needs to be converted
-     * @param matchAmbiguousRef causes the match to return true when the read base is a subset of the possible IUPAC reference bases, but not the other way around
-     * @return true if the bases match, false otherwise
-     */
-    private static boolean basesMatch(final byte readBase, final byte refBase, final boolean negativeStrand,
-                                      final boolean bisulfiteSequence, final boolean matchAmbiguousRef) {
-        if (bisulfiteSequence) {
-            if (matchAmbiguousRef) return bisulfiteBasesMatchWithAmbiguity(negativeStrand, readBase, refBase);
-            else return bisulfiteBasesEqual(negativeStrand, readBase, refBase);
-        } else {
-            if (matchAmbiguousRef) return readBaseMatchesRefBaseWithAmbiguity(readBase, refBase);
-            else return basesEqual(readBase, refBase);
-        }
-    }
-
-    /** Calculates the number of mismatches between the read and the reference sequence provided. */
-    public static int countMismatches(final SAMRecord read, final byte[] referenceBases) {
-        return countMismatches(read, referenceBases, 0, false);
-    }
-
-    /** Calculates the number of mismatches between the read and the reference sequence provided. */
-    public static int countMismatches(final SAMRecord read, final byte[] referenceBases, final int referenceOffset) {
-        return countMismatches(read, referenceBases, referenceOffset, false);
-    }
-
-    /**
-     * Calculates the number of mismatches between the read and the reference sequence provided.
-     *
-     * @param referenceBases    Array of ASCII bytes that covers at least the the portion of the reference sequence
-     *                          to which read is aligned from getReferenceStart to getReferenceEnd.
-     * @param referenceOffset   0-based offset of the first element of referenceBases relative to the start
-     *                          of that reference sequence.
-     * @param bisulfiteSequence If this is true, it is assumed that the reads were bisulfite treated
-     *                          and C->T on the positive strand and G->A on the negative strand will not be counted
-     *                          as mismatches.
-     */
-    public static int countMismatches(final SAMRecord read, final byte[] referenceBases, final int referenceOffset, final boolean bisulfiteSequence) {
-        return countMismatches(read, referenceBases, referenceOffset, bisulfiteSequence, false);
-    }
-
-    public static int countMismatches(final SAMRecord read, final byte[] referenceBases, final int referenceOffset,
-                                      final boolean bisulfiteSequence, final boolean matchAmbiguousRef) {
-        try {
-            int mismatches = 0;
-
-            final byte[] readBases = read.getReadBases();
-
-            for (final AlignmentBlock block : read.getAlignmentBlocks()) {
-                final int readBlockStart = block.getReadStart() - 1;
-                final int referenceBlockStart = block.getReferenceStart() - 1 - referenceOffset;
-                final int length = block.getLength();
-
-                for (int i = 0; i < length; ++i) {
-                    if (!basesMatch(readBases[readBlockStart + i], referenceBases[referenceBlockStart + i],
-                            read.getReadNegativeStrandFlag(), bisulfiteSequence, matchAmbiguousRef)) {
-                        ++mismatches;
-                    }
-                }
-            }
-            return mismatches;
-        } catch (final Exception e) {
-            throw new SAMException("Exception counting mismatches for read " + read, e);
-        }
-    }
-
-    /**
-     * Calculates the number of mismatches between the read and the reference sequence provided.
-     *
-     * @param referenceBases    Array of ASCII bytes that covers at least the the portion of the reference sequence
-     *                          to which read is aligned from getReferenceStart to getReferenceEnd.
-     * @param bisulfiteSequence If this is true, it is assumed that the reads were bisulfite treated
-     *                          and C->T on the positive strand and G->A on the negative strand will not be counted
-     *                          as mismatches.
-     */
-    public static int countMismatches(final SAMRecord read, final byte[] referenceBases, final boolean bisulfiteSequence) {
-        return countMismatches(read, referenceBases, 0, bisulfiteSequence);
-    }
-
-    /**
-     * Calculates the sum of qualities for mismatched bases in the read.
-     *
-     * @param referenceBases Array of ASCII bytes in which the 0th position in the array corresponds
-     *                       to the first element of the reference sequence to which read is aligned.
-     */
-    public static int sumQualitiesOfMismatches(final SAMRecord read, final byte[] referenceBases) {
-        return sumQualitiesOfMismatches(read, referenceBases, 0, false);
-    }
-
-    /**
-     * Calculates the sum of qualities for mismatched bases in the read.
-     *
-     * @param referenceBases  Array of ASCII bytes that covers at least the the portion of the reference sequence
-     *                        to which read is aligned from getReferenceStart to getReferenceEnd.
-     * @param referenceOffset 0-based offset of the first element of referenceBases relative to the start
-     *                        of that reference sequence.
-     */
-    public static int sumQualitiesOfMismatches(final SAMRecord read, final byte[] referenceBases,
-                                               final int referenceOffset) {
-        return sumQualitiesOfMismatches(read, referenceBases, referenceOffset, false);
-    }
-
-    /**
-     * Calculates the sum of qualities for mismatched bases in the read.
-     *
-     * @param referenceBases    Array of ASCII bytes that covers at least the the portion of the reference sequence
-     *                          to which read is aligned from getReferenceStart to getReferenceEnd.
-     * @param referenceOffset   0-based offset of the first element of referenceBases relative to the start
-     *                          of that reference sequence.
-     * @param bisulfiteSequence If this is true, it is assumed that the reads were bisulfite treated
-     *                          and C->T on the positive strand and G->A on the negative strand will not be counted
-     *                          as mismatches.
-     */
-    public static int sumQualitiesOfMismatches(final SAMRecord read, final byte[] referenceBases,
-                                               final int referenceOffset, final boolean bisulfiteSequence) {
-        int qualities = 0;
-
-        final byte[] readBases = read.getReadBases();
-        final byte[] readQualities = read.getBaseQualities();
-
-        if (read.getAlignmentStart() <= referenceOffset) {
-            throw new IllegalArgumentException("read.getAlignmentStart(" + read.getAlignmentStart() +
-                    ") <= referenceOffset(" + referenceOffset + ")");
-        }
-
-        for (final AlignmentBlock block : read.getAlignmentBlocks()) {
-            final int readBlockStart = block.getReadStart() - 1;
-            final int referenceBlockStart = block.getReferenceStart() - 1 - referenceOffset;
-            final int length = block.getLength();
-
-            for (int i = 0; i < length; ++i) {
-                if (!bisulfiteSequence) {
-                    if (!basesEqual(readBases[readBlockStart + i], referenceBases[referenceBlockStart + i])) {
-                        qualities += readQualities[readBlockStart + i];
-                    }
-
-                } else {
-                    if (!bisulfiteBasesEqual(read.getReadNegativeStrandFlag(), readBases[readBlockStart + i],
-                            referenceBases[referenceBlockStart + i])) {
-                        qualities += readQualities[readBlockStart + i];
-                    }
-                }
-            }
-        }
-
-        return qualities;
-    }
-
-    public static int countInsertedBases(final Cigar cigar) {
-        int ret = 0;
-        for (final CigarElement element : cigar.getCigarElements()) {
-            if (element.getOperator() == CigarOperator.INSERTION) ret += element.getLength();
-        }
-        return ret;
-    }
-
-    public static int countDeletedBases(final Cigar cigar) {
-        int ret = 0;
-        for (final CigarElement element : cigar.getCigarElements()) {
-            if (element.getOperator() == CigarOperator.DELETION) ret += element.getLength();
-        }
-        return ret;
-    }
-
-    public static int countInsertedBases(final SAMRecord read) {
-        return countInsertedBases(read.getCigar());
-    }
-
-    public static int countDeletedBases(final SAMRecord read) {
-        return countDeletedBases(read.getCigar());
-    }
-
-    /**
-     * Calculates the predefined NM tag from the SAM spec: (# of mismatches + # of indels)
-     * For the purposes for calculating mismatches, we do not yet support IUPAC ambiguous codes
-     * (see <code>readBaseMatchesRefBaseWithAmbiguity</code> method).
-     */
-    public static int calculateSamNmTag(final SAMRecord read, final byte[] referenceBases) {
-        return calculateSamNmTag(read, referenceBases, 0, false);
-    }
-
-    /**
-     * Calculates the predefined NM tag from the SAM spec: (# of mismatches + # of indels)
-     * For the purposes for calculating mismatches, we do not yet support IUPAC ambiguous codes
-     * (see <code>readBaseMatchesRefBaseWithAmbiguity</code> method).
-     *
-     * @param referenceOffset 0-based offset of the first element of referenceBases relative to the start
-     *                        of that reference sequence.
-     */
-    public static int calculateSamNmTag(final SAMRecord read, final byte[] referenceBases,
-                                        final int referenceOffset) {
-        return calculateSamNmTag(read, referenceBases, referenceOffset, false);
-    }
-
-    /**
-     * Calculates the predefined NM tag from the SAM spec: (# of mismatches + # of indels)
-     * For the purposes for calculating mismatches, we do not yet support IUPAC ambiguous codes
-     * (see <code>readBaseMatchesRefBaseWithAmbiguity</code> method).
-     *
-     * @param referenceOffset   0-based offset of the first element of referenceBases relative to the start
-     *                          of that reference sequence.
-     * @param bisulfiteSequence If this is true, it is assumed that the reads were bisulfite treated
-     *                          and C->T on the positive strand and G->A on the negative strand will not be counted
-     *                          as mismatches.
-     */
-    public static int calculateSamNmTag(final SAMRecord read, final byte[] referenceBases,
-                                        final int referenceOffset, final boolean bisulfiteSequence) {
-        int samNm = countMismatches(read, referenceBases, referenceOffset, bisulfiteSequence, false);
-        for (final CigarElement el : read.getCigar().getCigarElements()) {
-            if (el.getOperator() == CigarOperator.INSERTION || el.getOperator() == CigarOperator.DELETION) {
-                samNm += el.getLength();
-            }
-        }
-        return samNm;
-    }
-
-    /**
-     * Attempts to calculate the predefined NM tag from the SAM spec using the cigar string alone.
-     * It may calculate incorrectly if ambiguous operators (Like M) are used.
-     *
-     * Needed for testing infrastructure: SAMRecordSetBuilder
-     */
-    public static int calculateSamNmTagFromCigar(final SAMRecord record) {
-        int samNm = 0;
-        for (final CigarElement el : record.getCigar().getCigarElements()) {
-            if ( el.getOperator() == CigarOperator.X ||
-                 el.getOperator() == CigarOperator.INSERTION ||
-                 el.getOperator() == CigarOperator.DELETION) {
-                samNm += el.getLength();
-            }
-        }
-        return samNm;
-    }
-
-    /** Returns the complement of a single byte. */
-    public static byte complement(final byte b) {
-        switch (b) {
-            case a:
-                return t;
-            case c:
-                return g;
-            case g:
-                return c;
-            case t:
-                return a;
-            case A:
-                return T;
-            case C:
-                return G;
-            case G:
-                return C;
-            case T:
-                return A;
-            default:
-                return b;
-        }
-    }
-
-    /** Reverses and complements the bases in place. */
-    public static void reverseComplement(final byte[] bases) {
-        final int lastIndex = bases.length - 1;
-
-        int i, j;
-        for (i = 0, j = lastIndex; i < j; ++i, --j) {
-            final byte tmp = complement(bases[i]);
-            bases[i] = complement(bases[j]);
-            bases[j] = tmp;
-        }
-        if (bases.length % 2 == 1) {
-            bases[i] = complement(bases[i]);
-        }
-    }
-
-    /** Reverses the quals in place. */
-    public static void reverseQualities(final byte[] quals) {
-        final int lastIndex = quals.length - 1;
-
-        int i, j;
-        for (i = 0, j = lastIndex; i < j; ++i, --j) {
-            final byte tmp = quals[i];
-            quals[i] = quals[j];
-            quals[j] = tmp;
-        }
-    }
-
-    /**
-     * Returns true if the bases are equal OR if the mismatch can be accounted for by
-     * bisulfite treatment. C->T on the positive strand and G->A on the negative strand
-     * do not count as mismatches.
-     */
-    public static boolean bisulfiteBasesEqual(final boolean negativeStrand, final byte read, final byte reference) {
-        return (basesEqual(read, reference)) || (isBisulfiteConverted(read, reference, negativeStrand));
-    }
-
-    public static boolean bisulfiteBasesEqual(final byte read, final byte reference) {
-        return bisulfiteBasesEqual(false, read, reference);
-    }
-
-    /**
-     * Same as above, but use <code>readBaseMatchesRefBaseWithAmbiguity</code> instead of <code>basesEqual</code>.
-     * Note that <code>isBisulfiteConverted</code> is not affected because it only applies when the
-     * reference base is non-ambiguous.
-     */
-    public static boolean bisulfiteBasesMatchWithAmbiguity(final boolean negativeStrand, final byte read, final byte reference) {
-        return (readBaseMatchesRefBaseWithAmbiguity(read, reference)) || (isBisulfiteConverted(read, reference, negativeStrand));
-    }
-
-    /**
-     * Checks for bisulfite conversion, C->T on the positive strand and G->A on the negative strand.
-     */
-    public static boolean isBisulfiteConverted(final byte read, final byte reference, final boolean negativeStrand) {
-        if (negativeStrand) {
-            if (basesEqual(reference, G) && basesEqual(read, A)) {
-                return true;
-            }
-        } else {
-            if (basesEqual(reference, C) && basesEqual(read, T)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static boolean isBisulfiteConverted(final byte read, final byte reference) {
-        return isBisulfiteConverted(read, reference, false);
-    }
-
-    /*
-     * Regexp for MD string.
-     *
-     * \G = end of previous match.
-     * (?:[0-9]+) non-capturing (why non-capturing?) group of digits.  For this number of bases read matches reference.
-     *  - or -
-     * Single reference base for case in which reference differs from read.
-     *  - or -
-     * ^one or more reference bases that are deleted in read.
-     *
-     */
-    static final Pattern mdPat = Pattern.compile("\\G(?:([0-9]+)|([ACTGNactgn])|(\\^[ACTGNactgn]+))");
-
-    /**
-     * Produce reference bases from an aligned SAMRecord with MD string and Cigar.
-     *
-     * @param rec                               Must contain non-empty CIGAR and MD attribute.
-     * @param includeReferenceBasesForDeletions If true, include reference bases that are deleted in the read.
-     *                                          This will make the returned array not line up with the read if there are deletions.
-     * @return References bases corresponding to the read.  If there is an insertion in the read, reference contains
-     * '-'.  If the read is soft-clipped, reference contains '0'.  If there is a skipped region and
-     * includeReferenceBasesForDeletions==true, reference will have Ns for the skipped region.
-     */
-    public static byte[] makeReferenceFromAlignment(final SAMRecord rec, final boolean includeReferenceBasesForDeletions) {
-        final String md = rec.getStringAttribute(SAMTag.MD.name());
-        if (md == null) {
-            throw new SAMException("Cannot create reference from SAMRecord with no MD tag, read: " + rec.getReadName());
-        }
-        // Not sure how long output will be, but it will be no longer than this.
-        int maxOutputLength = 0;
-        final Cigar cigar = rec.getCigar();
-        if (cigar == null) {
-            throw new SAMException("Cannot create reference from SAMRecord with no CIGAR, read: " + rec.getReadName());
-        }
-        for (final CigarElement cigarElement : cigar.getCigarElements()) {
-            maxOutputLength += cigarElement.getLength();
-        }
-        final byte[] ret = new byte[maxOutputLength];
-        int outIndex = 0;
-
-        final Matcher match = mdPat.matcher(md);
-        int curSeqPos = 0;
-
-        int savedBases = 0;
-        final byte[] seq = rec.getReadBases();
-        for (final CigarElement cigEl : cigar.getCigarElements()) {
-            final int cigElLen = cigEl.getLength();
-            final CigarOperator cigElOp = cigEl.getOperator();
-
-
-            if (cigElOp == CigarOperator.SKIPPED_REGION) {
-                // We've decided that MD tag will not contain bases for skipped regions, as they
-                // could be megabases long, so just put N in there if caller wants reference bases,
-                // otherwise ignore skipped regions.
-                if (includeReferenceBasesForDeletions) {
-                    for (int i = 0; i < cigElLen; ++i) {
-                        ret[outIndex++] = N;
-                    }
-                }
-            }
-            // If it consumes reference bases, it's either a match or a deletion in the sequence
-            // read.  Either way, we're going to need to parse through the MD.
-            else if (cigElOp.consumesReferenceBases()) {
-                // We have a match region, go through the MD
-                int basesMatched = 0;
-
-                // Do we have any saved matched bases?
-                while ((savedBases > 0) && (basesMatched < cigElLen)) {
-                    ret[outIndex++] = seq[curSeqPos++];
-                    savedBases--;
-                    basesMatched++;
-                }
-
-                while (basesMatched < cigElLen) {
-                    boolean matched = match.find();
-                    if (matched) {
-                        String mg;
-                        if (((mg = match.group(1)) != null) && (!mg.isEmpty())) {
-                            // It's a number , meaning a series of matches
-                            final int num = Integer.parseInt(mg);
-                            for (int i = 0; i < num; i++) {
-                                if (basesMatched < cigElLen) {
-                                    ret[outIndex++] = seq[curSeqPos++];
-                                } else {
-                                    savedBases++;
-                                }
-                                basesMatched++;
-                            }
-                        } else if (((mg = match.group(2)) != null) && (!mg.isEmpty())) {
-                            // It's a single nucleotide, meaning a mismatch
-                            if (basesMatched < cigElLen) {
-                                ret[outIndex++] = StringUtil.charToByte(mg.charAt(0));
-                                curSeqPos++;
-                            } else {
-                                throw new IllegalStateException("Should never happen.");
-                            }
-                            basesMatched++;
-                        } else if (((mg = match.group(3)) != null) && (!mg.isEmpty())) {
-                            // It's a deletion, starting with a caret
-                            // don't include caret
-                            if (includeReferenceBasesForDeletions) {
-                                final byte[] deletedBases = StringUtil.stringToBytes(mg);
-                                System.arraycopy(deletedBases, 1, ret, outIndex, deletedBases.length - 1);
-                                outIndex += deletedBases.length - 1;
-                            }
-                            basesMatched += mg.length() - 1;
-
-                            // Check just to make sure.
-                            if (basesMatched != cigElLen) {
-                                throw new SAMException("Got a deletion in CIGAR (" + cigar + ", deletion " + cigElLen +
-                                        " length) with an unequal ref insertion in MD (" + md + ", md " + basesMatched + " length");
-                            }
-                            if (cigElOp != CigarOperator.DELETION) {
-                                throw new SAMException("Got an insertion in MD (" + md + ") without a corresponding deletion in cigar (" + cigar + ")");
-                            }
-
-                        } else {
-                            matched = false;
-                        }
-                    }
-
-                    if (!matched) {
-                        throw new SAMException("Illegal MD pattern: " + md + " for read " + rec.getReadName() +
-                                " with CIGAR " + rec.getCigarString());
-                    }
-                }
-
-            } else if (cigElOp.consumesReadBases()) {
-                // We have an insertion in read
-                for (int i = 0; i < cigElLen; i++) {
-                    final char c = (cigElOp == CigarOperator.SOFT_CLIP) ? '0' : '-';
-                    ret[outIndex++] = StringUtil.charToByte(c);
-                    curSeqPos++;
-                }
-            } else {
-                // It's an op that consumes neither read nor reference bases.  Do we just ignore??
-            }
-
-        }
-        if (outIndex < ret.length) {
-            final byte[] shorter = new byte[outIndex];
-            System.arraycopy(ret, 0, shorter, 0, outIndex);
-            return shorter;
-        }
-        return ret;
-    }
-
-    public static void reverse(final byte[] array, final int offset, final int len) {
-        final int lastIndex = len - 1;
-
-        int i, j;
-        for (i = offset, j = offset + lastIndex; i < j; ++i, --j) {
-            final byte tmp = array[i];
-            array[i] = array[j];
-            array[j] = tmp;
-        }
-        if (len % 2 == 1) {
-            array[i] = array[i];
-        }
-    }
-
-    public static void reverseComplement(final byte[] bases, final int offset, final int len) {
-        final int lastIndex = len - 1;
-
-        int i, j;
-        for (i = offset, j = offset + lastIndex; i < j; ++i, --j) {
-            final byte tmp = complement(bases[i]);
-            bases[i] = complement(bases[j]);
-            bases[j] = tmp;
-        }
-        if (len % 2 == 1) {
-            bases[i] = complement(bases[i]);
-        }
-    }
-
-    public static String calculateMD5String(final byte[] data)
-            throws NoSuchAlgorithmException {
-        return SequenceUtil.calculateMD5String(data, 0, data.length);
-    }
-
-    public static String calculateMD5String(final byte[] data, final int offset, final int len) {
-        final byte[] digest = calculateMD5(data, offset, len);
-        return String.format("%032x", new BigInteger(1, digest));
-    }
-
-    public static byte[] calculateMD5(final byte[] data, final int offset, final int len) {
-        final MessageDigest md5_MessageDigest;
-        try {
-            md5_MessageDigest = MessageDigest.getInstance("MD5");
-            md5_MessageDigest.reset();
-
-            md5_MessageDigest.update(data, offset, len);
-            return md5_MessageDigest.digest();
-        } catch (final NoSuchAlgorithmException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Calculate MD and NM similarly to Samtools, except that N->N is a match.
-     *
-     * @param record Input record for which to calculate NM and MD.
-     *               The appropriate tags will be added/updated in the record
-     * @param ref    The reference bases for the sequence to which the record is mapped
-     * @param calcMD A flag indicating whether to update the MD tag in the record
-     * @param calcNM A flag indicating whether to update the NM tag in the record
-     */
-    public static void calculateMdAndNmTags(final SAMRecord record, final byte[] ref,
-                                            final boolean calcMD, final boolean calcNM) {
-        if (!calcMD && !calcNM)
-            return;
-
-        final Cigar cigar = record.getCigar();
-        final List<CigarElement> cigarElements = cigar.getCigarElements();
-        final byte[] seq = record.getReadBases();
-        final int alignmentStart = record.getAlignmentStart() - 1;
-        int cigarIndex, blockRefPos, blockReadStart, matchCount = 0;
-        int nmCount = 0;
-        final StringBuilder mdString = new StringBuilder();
-
-        final int nElements = cigarElements.size();
-        for (cigarIndex = blockReadStart = 0, blockRefPos = alignmentStart; cigarIndex < nElements; ++cigarIndex) {
-            final CigarElement ce = cigarElements.get(cigarIndex);
-            int inBlockOffset;
-            final int blockLength = ce.getLength();
-            final CigarOperator op = ce.getOperator();
-            if (op == CigarOperator.MATCH_OR_MISMATCH || op == CigarOperator.EQ
-                    || op == CigarOperator.X) {
-                for (inBlockOffset = 0; inBlockOffset < blockLength; ++inBlockOffset) {
-                    final int readOffset = blockReadStart + inBlockOffset;
-
-                    if (ref.length <= blockRefPos + inBlockOffset) break; // out of boundary
-
-                    final byte readBase = seq[readOffset];
-                    final byte refBase = ref[blockRefPos + inBlockOffset];
-
-                    if ((bases[readBase] == bases[refBase]) || readBase == 0) {
-                        // a match
-                        ++matchCount;
-                    } else {
-                        mdString.append(matchCount);
-                        mdString.appendCodePoint(refBase);
-                        matchCount = 0;
-                        ++nmCount;
-                    }
-                }
-                if (inBlockOffset < blockLength) break;
-                blockRefPos += blockLength;
-                blockReadStart += blockLength;
-            } else if (op == CigarOperator.DELETION) {
-                mdString.append(matchCount);
-                mdString.append('^');
-                for (inBlockOffset = 0; inBlockOffset < blockLength; ++inBlockOffset) {
-                    if (ref[blockRefPos + inBlockOffset] == 0) break;
-                    mdString.appendCodePoint(ref[blockRefPos + inBlockOffset]);
-                }
-                matchCount = 0;
-                if (inBlockOffset < blockLength) break;
-                blockRefPos += blockLength;
-                nmCount += blockLength;
-            } else if (op == CigarOperator.INSERTION
-                    || op == CigarOperator.SOFT_CLIP) {
-                blockReadStart += blockLength;
-                if (op == CigarOperator.INSERTION) nmCount += blockLength;
-            } else if (op == CigarOperator.SKIPPED_REGION) {
-                blockRefPos += blockLength;
-            }
-        }
-        mdString.append(matchCount);
-
-        if (calcMD) record.setAttribute(SAMTag.MD.name(), mdString.toString());
-        if (calcNM) record.setAttribute(SAMTag.NM.name(), nmCount);
-    }
-
-    public static byte upperCase(final byte base) {
-        return base >= a ? (byte) (base - (a - A)) : base;
-    }
-
-    public static byte[] upperCase(final byte[] bases) {
-        for (int i = 0; i < bases.length; i++)
-            bases[i] = upperCase(bases[i]);
-        return bases;
-    }
-
-    /** Generates all possible unambiguous kmers (upper-case) of length and returns them as byte[]s. */
-    public static List<byte[]> generateAllKmers(final int length) {
-        final List<byte[]> sofar = new LinkedList<>();
-
-        if (sofar.isEmpty()) {
-            sofar.add(new byte[length]);
-        }
-
-        while (true) {
-            final byte[] bs = sofar.remove(0);
-            int indexOfNextBase = -1;
-            for (int i = 0; i < bs.length; ++i) {
-                if (bs[i] == 0) {
-                    indexOfNextBase = i;
-                    break;
-                }
-            }
-
-            if (indexOfNextBase == -1) {
-                sofar.add(bs);
-                break;
-            } else {
-                for (final byte b : VALID_BASES_UPPER) {
-                    final byte[] next = Arrays.copyOf(bs, bs.length);
-                    next[indexOfNextBase] = b;
-                    sofar.add(next);
-                }
-            }
-        }
-
-        return sofar;
-    }
-
-    /**
-     * Returns a read name from a FASTQ header string suitable for use in a SAM/BAM file.  Any letters after the first space are ignored.
-     * Ths method also strips trailing "/1" or "/2" so that paired end reads have the same name.
-     *
-     * @param fastqHeader the header from a {@link htsjdk.samtools.fastq.FastqRecord}.
-     * @return a read name appropriate for output in a SAM/BAM file.
-     */
-    // Read names cannot contain blanks
-    public static String getSamReadNameFromFastqHeader(final String fastqHeader) {
-        final int idx = fastqHeader.indexOf(" ");
-        String readName = (idx == -1) ? fastqHeader : fastqHeader.substring(0,idx);
-
-        // NOTE: the while loop isn't necessarily the most efficient way to handle this but we don't
-        // expect this to ever happen more than once, just trapping pathological cases
-        while ((readName.endsWith("/1") || readName.endsWith("/2"))) {
-            // If this is an unpaired run we want to make sure that "/1" isn't tacked on the end of the read name,
-            // as this can cause problems down the road (ex. in Picard's MergeBamAlignment).
-            readName = readName.substring(0, readName.length() - 2);
-        }
-
-        return readName;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SnappyLoader.java b/src/main/java/htsjdk/samtools/util/SnappyLoader.java
deleted file mode 100644
index 52abcef..0000000
--- a/src/main/java/htsjdk/samtools/util/SnappyLoader.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2011 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-import org.xerial.snappy.LoadSnappy;
-import org.xerial.snappy.SnappyInputStream;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.reflect.Constructor;
-
-/**
- * If Snappy is available, obtain single-arg ctors for SnappyInputStream and SnappyOutputStream.
- */
-public class SnappyLoader {
-    private static final int SNAPPY_BLOCK_SIZE = 32768;  // keep this as small as can be without hurting compression ratio.
-    private final Constructor<InputStream> SnappyInputStreamCtor;
-    private final Constructor<OutputStream> SnappyOutputStreamCtor;
-    public final boolean SnappyAvailable;
-
-    // Force Snappy-java code to be loaded into executable jars.
-    private final SnappyInputStream ignoreMe = null;
-
-    // Force bcel to load Snappy.
-    //private static final Class SnappyClass = SnappyInputStream.class;
-
-    private static final boolean DefaultVerbosity = Boolean.valueOf(System.getProperty("snappy.loader.verbosity", "false"));
-
-    public SnappyLoader() {
-        this(DefaultVerbosity);
-    }
-
-    /**
-     * Constructs a new SnappyLoader which will check to see if snappy is available in the JVM/library path.
-     * @param verbose if true output a small number of debug messages to System.err
-     */
-    public SnappyLoader(final boolean verbose) {
-        Constructor<InputStream> inputStreamCtor = null;
-        Constructor<OutputStream> outputStreamCtor = null;
-        Class<Error> snappyErrorClass = null;
-
-        if (java.lang.Boolean.valueOf(System.getProperty("snappy.disable", "false"))) {
-            System.err.println("Snappy is disabled via system property.");
-        }
-        else {
-            try {
-                final Class<InputStream> snappyInputStreamClass = (Class<InputStream>)Class.forName("org.xerial.snappy.SnappyInputStream");
-                final Class<OutputStream> snappyOutputStreamClass = (Class<OutputStream>)Class.forName("org.xerial.snappy.SnappyOutputStream");
-                snappyErrorClass = (Class<Error>)Class.forName("org.xerial.snappy.SnappyError");
-                inputStreamCtor = snappyInputStreamClass.getConstructor(InputStream.class);
-                outputStreamCtor = snappyOutputStreamClass.getConstructor(OutputStream.class, Integer.TYPE);
-            }
-            catch (NoSuchMethodException e) { /* Do nothing. */ }
-            catch (ClassNotFoundException e) { /* Do nothing. */ }
-        }
-
-        this.SnappyInputStreamCtor = inputStreamCtor;
-        this.SnappyOutputStreamCtor = outputStreamCtor;
-
-        if (this.SnappyInputStreamCtor != null && this.SnappyOutputStreamCtor != null) {
-            // Don't try to call any Snappy code until classes have been found via reflection above.
-            boolean tmpSnappyAvailable;
-            try {
-                if (!LoadSnappy.load()) {
-                    if (verbose) System.err.println("Snappy dll failed to load.");
-                    tmpSnappyAvailable = false;
-                }
-                else {
-                    if (verbose) System.err.println("Snappy stream classes loaded.");
-                    tmpSnappyAvailable = true;
-                }
-            } catch (Error e) {
-                if (e.getClass().equals(snappyErrorClass)) {
-                    if (verbose) System.err.println("Snappy dll failed to load: " + e.getMessage());
-                    tmpSnappyAvailable = false;
-                } else {
-                    throw e;
-                }
-            }
-            SnappyAvailable = tmpSnappyAvailable;
-        }
-        else {
-            if (verbose) System.err.println("Snappy stream classes not loaded.");
-            SnappyAvailable = false;
-        }
-    }
-
-    /** Wrap an InputStream in a SnappyInputStream. If Snappy is not available will throw an exception. */
-    public InputStream wrapInputStream(final InputStream inputStream) {
-        try {
-            return SnappyInputStreamCtor.newInstance(inputStream);
-        } catch (Exception e) {
-            throw new SAMException("Error instantiating SnappyInputStream", e);
-        }
-    }
-
-    /** Wrap an InputStream in a SnappyInputStream. If Snappy is not available will throw an exception. */
-    public OutputStream wrapOutputStream(final OutputStream outputStream) {
-        try {
-            return SnappyOutputStreamCtor.newInstance(outputStream, SNAPPY_BLOCK_SIZE);
-        } catch (Exception e) {
-            throw new SAMException("Error instantiating SnappyOutputStream", e);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SolexaQualityConverter.java b/src/main/java/htsjdk/samtools/util/SolexaQualityConverter.java
deleted file mode 100644
index ba12678..0000000
--- a/src/main/java/htsjdk/samtools/util/SolexaQualityConverter.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Optimized method for converting Solexa ASCII qualities into Phred scores.
- * Pre-computes all values in order to eliminate repeated computation.
- */
-public class SolexaQualityConverter {
-
-    /**
-     * This value is added to a Solexa quality score to make it printable ASCII
-     */
-    public static final int SOLEXA_ADDEND = 64;
-
-    /**
-     * This value is added to a Phred scord to make it printable ASCII
-     */
-    public static final int PHRED_ADDEND = 33;
-
-    /**
-     * This value is removed from an Illumina 1.8 quality score to make it a Phred score
-     */
-    public final static int ILLUMINA_TO_PHRED_SUBTRAHEND = SOLEXA_ADDEND - PHRED_ADDEND;
-
-    private static SolexaQualityConverter singleton = null;
-
-    public static synchronized SolexaQualityConverter getSingleton()  {
-        if (singleton == null) {
-            singleton = new SolexaQualityConverter();
-        }
-        return singleton;
-    }
-
-    /**
-     * Mapping from ASCII value in Gerald export file to phred score
-     */
-    private final byte[] phredScore = new byte[256];
-
-    private SolexaQualityConverter() {
-        for (int i = 0; i < SOLEXA_ADDEND; ++i) {
-            phredScore[i] = 0;
-        }
-        for (int i = SOLEXA_ADDEND; i < phredScore.length; ++i) {
-            phredScore[i] = convertSolexaQualityCharToPhredBinary(i);
-        }
-    }
-
-
-    /** Converts a solexa character quality into a phred numeric quality. */
-    private byte convertSolexaQualityCharToPhredBinary(final int solexaQuality) {
-        return (byte) Math.round(10d * Math.log10(1d+Math.pow(10d, (solexaQuality - SOLEXA_ADDEND)/10d)));
-    }
-
-    /**
-     * Convert a solexa quality ASCII character into a phred score.
-     */
-    public byte solexaCharToPhredBinary(final byte solexaQuality) {
-        return phredScore[solexaQuality];
-    }
-
-    /**
-     * @return a byte array that can be indexed by Solexa ASCII quality, with value
-     * of corresponding Phred score.  Elements 0-63 are invalid because Solexa qualities
-     * should all be >= 64.  Do not modify this array!
-     */
-    public byte[] getSolexaToPhredConversionTable() {
-        return phredScore;
-    }
-
-    /**
-     * Decodes an array of solexa quality ASCII chars into Phred numeric space.
-     * Decode in place in order to avoid extra object allocation.
-     */
-    public void convertSolexaQualityCharsToPhredBinary(final byte[] solexaQuals) {
-        for (int i=0; i<solexaQuals.length; ++i) {
-            solexaQuals[i] = phredScore[solexaQuals[i]];
-        }
-    }
-
-    /**
-     * Decodes an array of solexa quality ASCII chars into Phred ASCII space.
-     * Decode in place in order to avoid extra object allocation.
-     */
-    public void convertSolexaQualityCharsToPhredChars(final byte[] solexaQuals) {
-        for (int i=0; i<solexaQuals.length; ++i) {
-            solexaQuals[i] = (byte)((phredScore[solexaQuals[i]] + PHRED_ADDEND) & 0xff);
-        }
-    }
-
-    /**
-     * Casava 1.3 stores phred-scaled qualities, but non-standard because they have 64 added to them
-     * rather than the standard 33.
-     * @param solexaQuals qualities are converted in place.
-     */
-    public void convertSolexa_1_3_QualityCharsToPhredBinary(final byte[] solexaQuals) {
-        for (int i=0; i<solexaQuals.length; ++i) {
-            solexaQuals[i] -= SOLEXA_ADDEND;
-        }
-    }
-
-    public void convertSolexa_1_3_QualityCharsToPhredBinary(int offset, int length, final byte[] solexaQuals) {
-        final int limit = offset + length;
-        for (int i=offset; i < limit; ++i) {
-            solexaQuals[i] -= SOLEXA_ADDEND;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SortingCollection.java b/src/main/java/htsjdk/samtools/util/SortingCollection.java
deleted file mode 100644
index 6babd4e..0000000
--- a/src/main/java/htsjdk/samtools/util/SortingCollection.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Defaults;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.TreeSet;
-
-/**
- * Collection to which many records can be added.  After all records are added, the collection can be
- * iterated, and the records will be returned in order defined by the comparator.  Records may be spilled
- * to a temporary directory if there are more records added than will fit in memory.  As a result of this,
- * the objects returned may not be identical to the objects added to the collection, but they should be
- * equal as determined by the codec used to write them to disk and read them back.
- *
- * When iterating over the collection, the number of file handles required is numRecordsInCollection/maxRecordsInRam.
- * If this becomes a limiting factor, a file handle cache could be added.
- *
- * If Snappy DLL is available and snappy.disable system property is not set to true, then Snappy is used
- * to compress temporary files.
- */
-public class SortingCollection<T> implements Iterable<T> {
-
-    /**
-     * Client must implement this class, which defines the way in which records are written to and
-     * read from file.
-     */
-    public interface Codec<T> extends Cloneable {
-        /**
-         * Where to write encoded output
-         * @param os
-         */
-        void setOutputStream(OutputStream os);
-
-        /**
-         * Where to read encoded input from
-         * @param is
-         */
-        void setInputStream(InputStream is);
-        /**
-         * Write object to output stream
-         * @param val what to write
-         */
-        void encode(T val);
-
-        /**
-         * Read the next record from the input stream and convert into a java object.
-         * @return null if no more records.  Should throw exception if EOF is encountered in the middle of
-         * a record.
-         */
-        T decode();
-
-        /**
-         * Must return a cloned copy of the codec that can be used independently of
-         * the original instance.  This is required so that multiple codecs can exist simultaneously
-         * that each is reading a separate file.
-         */
-        Codec<T> clone();
-    }
-
-    /** Directories where files of sorted records go. */
-    private final File[] tmpDirs;
-
-    /** The minimum amount of space free on a temp filesystem to write a file there. */
-    private final long TMP_SPACE_FREE = IOUtil.FIVE_GBS;
-
-    /**
-     * Used to write records to file, and used as a prototype to create codecs for reading.
-     */
-    private final SortingCollection.Codec<T> codec;
-
-    /**
-     * For sorting, both when spilling records to file, and merge sorting.
-     */
-    private final Comparator<T> comparator;
-    private final int maxRecordsInRam;
-    private int numRecordsInRam = 0;
-    private T[] ramRecords;
-    private boolean iterationStarted = false;
-    private boolean doneAdding = false;
-
-    /**
-     * Set to true when all temp files have been cleaned up
-     */
-    private boolean cleanedUp = false;
-
-    /**
-     * List of files in tmpDir containing sorted records
-     */
-    private final List<File> files = new ArrayList<File>();
-
-    private boolean destructiveIteration = true;
-
-    private TempStreamFactory tempStreamFactory = new TempStreamFactory();
-
-    /**
-     * Prepare to accumulate records to be sorted
-     * @param componentType Class of the record to be sorted.  Necessary because of Java generic lameness.
-     * @param codec For writing records to file and reading them back into RAM
-     * @param comparator Defines output sort order
-     * @param maxRecordsInRam how many records to accumulate before spilling to disk
-     * @param tmpDir Where to write files of records that will not fit in RAM
-     */
-    private SortingCollection(final Class<T> componentType, final SortingCollection.Codec<T> codec,
-                             final Comparator<T> comparator, final int maxRecordsInRam, final File... tmpDir) {
-        if (maxRecordsInRam <= 0) {
-            throw new IllegalArgumentException("maxRecordsInRam must be > 0");
-        }
-
-        if (tmpDir == null || tmpDir.length == 0) {
-            throw new IllegalArgumentException("At least one temp directory must be provided.");
-        }
-
-        this.tmpDirs = tmpDir;
-        this.codec = codec;
-        this.comparator = comparator;
-        this.maxRecordsInRam = maxRecordsInRam;
-        this.ramRecords = (T[])Array.newInstance(componentType, maxRecordsInRam);
-    }
-
-    public void add(final T rec) {
-        if (doneAdding) {
-            throw new IllegalStateException("Cannot add after calling doneAdding()");
-        }
-        if (iterationStarted) {
-            throw new IllegalStateException("Cannot add after calling iterator()");
-        }
-        if (numRecordsInRam == maxRecordsInRam) {
-            spillToDisk();
-        }
-        ramRecords[numRecordsInRam++] = rec;
-    }
-
-    /**
-     * This method can be called after caller is done adding to collection, in order to possibly free
-     * up memory.  If iterator() is called immediately after caller is done adding, this is not necessary,
-     * because iterator() triggers the same freeing.
-     */
-    public void doneAdding() {
-        if (this.cleanedUp) {
-            throw new IllegalStateException("Cannot call doneAdding() after cleanup() was called.");
-        }
-        if (doneAdding) {
-            return;
-        }
-
-        doneAdding = true;
-
-        if (this.files.isEmpty()) {
-            return;
-        }
-
-        if (this.numRecordsInRam > 0) {
-            spillToDisk();
-        }
-
-        // Facilitate GC
-        this.ramRecords = null;
-    }
-
-    /**
-     * @return True if this collection is allowed to discard data during iteration in order to reduce memory
-     * footprint, precluding a second iteration over the collection.
-     */
-    public boolean isDestructiveIteration() {
-        return destructiveIteration;
-    }
-
-    /**
-     * Tell this collection that it is allowed to discard data during iteration in order to reduce memory footprint,
-     * precluding a second iteration.  This is true by default.
-     */
-    public void setDestructiveIteration(boolean destructiveIteration) {
-        this.destructiveIteration = destructiveIteration;
-    }
-
-    /**
-     * Sort the records in memory, write them to a file, and clear the buffer of records in memory.
-     */
-    private void spillToDisk() {
-        try {
-            Arrays.sort(this.ramRecords, 0, this.numRecordsInRam, this.comparator);
-            final File f = newTempFile();
-            OutputStream os = null;
-            try {
-                os = tempStreamFactory.wrapTempOutputStream(new FileOutputStream(f), Defaults.BUFFER_SIZE);
-                this.codec.setOutputStream(os);
-                for (int i = 0; i < this.numRecordsInRam; ++i) {
-                    this.codec.encode(ramRecords[i]);
-                    // Facilitate GC
-                    this.ramRecords[i] = null;
-                }
-
-                os.flush();
-            } catch (RuntimeIOException ex) {
-                throw new RuntimeIOException("Problem writing temporary file " + f.getAbsolutePath() +
-                        ".  Try setting TMP_DIR to a file system with lots of space.", ex);
-            } finally {
-                if (os != null) {
-                    os.close();
-                }
-            }
-
-            this.numRecordsInRam = 0;
-            this.files.add(f);
-
-        }
-        catch (IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    /**
-     * Creates a new tmp file on one of the available temp filesystems, registers it for deletion
-     * on JVM exit and then returns it.
-     */
-    private File newTempFile() throws IOException {
-        return IOUtil.newTempFile("sortingcollection.", ".tmp", this.tmpDirs, TMP_SPACE_FREE);
-    }
-
-    /**
-     * Prepare to iterate through the records in order.  This method may be called more than once,
-     * but add() may not be called after this method has been called.
-     */
-    public CloseableIterator<T> iterator() {
-        if (this.cleanedUp) {
-            throw new IllegalStateException("Cannot call iterator() after cleanup() was called.");
-        }
-        doneAdding();
-
-        this.iterationStarted = true;
-        if (this.files.isEmpty()) {
-            return new InMemoryIterator();
-        } else {
-            return new MergingIterator();
-        }
-    }
-
-    /**
-     * Delete any temporary files.  After this method is called, iterator() may not be called.
-     */
-    public void cleanup() {
-        this.iterationStarted = true;
-        this.cleanedUp = true;
-
-        IOUtil.deleteFiles(this.files);
-    }
-
-    /**
-     * Syntactic sugar around the ctor, to save some typing of type parameters
-     *
-     * @param componentType Class of the record to be sorted.  Necessary because of Java generic lameness.
-     * @param codec For writing records to file and reading them back into RAM
-     * @param comparator Defines output sort order
-     * @param maxRecordsInRAM how many records to accumulate in memory before spilling to disk
-     * @param tmpDir Where to write files of records that will not fit in RAM
-     */
-    public static <T> SortingCollection<T> newInstance(final Class<T> componentType,
-                                                       final SortingCollection.Codec<T> codec,
-                                                       final Comparator<T> comparator,
-                                                       final int maxRecordsInRAM,
-                                                       final File... tmpDir) {
-        return new SortingCollection<T>(componentType, codec, comparator, maxRecordsInRAM, tmpDir);
-
-    }
-
-    /**
-     * Syntactic sugar around the ctor, to save some typing of type parameters
-     *
-     * @param componentType Class of the record to be sorted.  Necessary because of Java generic lameness.
-     * @param codec For writing records to file and reading them back into RAM
-     * @param comparator Defines output sort order
-     * @param maxRecordsInRAM how many records to accumulate in memory before spilling to disk
-     * @param tmpDirs Where to write files of records that will not fit in RAM
-     */
-    public static <T> SortingCollection<T> newInstance(final Class<T> componentType,
-                                                       final SortingCollection.Codec<T> codec,
-                                                       final Comparator<T> comparator,
-                                                       final int maxRecordsInRAM,
-                                                       final Collection<File> tmpDirs) {
-        return new SortingCollection<T>(componentType,
-                                        codec,
-                                        comparator,
-                                        maxRecordsInRAM,
-                                        tmpDirs.toArray(new File[tmpDirs.size()]));
-
-    }
-
-
-    /**
-     * Syntactic sugar around the ctor, to save some typing of type parameters.  Writes files to java.io.tmpdir
-     *
-     * @param componentType Class of the record to be sorted.  Necessary because of Java generic lameness.
-     * @param codec For writing records to file and reading them back into RAM
-     * @param comparator Defines output sort order
-     * @param maxRecordsInRAM how many records to accumulate in memory before spilling to disk
-     */
-    public static <T> SortingCollection<T> newInstance(final Class<T> componentType,
-                                                       final SortingCollection.Codec<T> codec,
-                                                       final Comparator<T> comparator,
-                                                       final int maxRecordsInRAM) {
-
-        final File tmpDir = new File(System.getProperty("java.io.tmpdir"));
-        return new SortingCollection<T>(componentType, codec, comparator, maxRecordsInRAM, tmpDir);
-    }
-
-    /**
-     * For iteration when number of records added is less than the threshold for spilling to disk.
-     */
-    class InMemoryIterator implements CloseableIterator<T> {
-        private int iterationIndex = 0;
-
-        InMemoryIterator() {
-            Arrays.sort(SortingCollection.this.ramRecords,
-                        0,
-                        SortingCollection.this.numRecordsInRam,
-                        SortingCollection.this.comparator);
-        }
-
-        public void close() {
-            // nothing to do
-        }
-
-        public boolean hasNext() {
-            return this.iterationIndex < SortingCollection.this.numRecordsInRam;
-        }
-
-        public T next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException();
-            }
-            T ret = SortingCollection.this.ramRecords[iterationIndex];
-            if (destructiveIteration) SortingCollection.this.ramRecords[iterationIndex] = null;
-            ++iterationIndex;
-            return ret;
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-    }
-
-    /**
-     * For iteration when spilling to disk has occurred.
-     * Each file is has records in sort order within the file.
-     * This iterator automatically closes when it iterates to the end, but if not iterating
-     * to the end it is a good idea to call close().
-     *
-     * Algorithm: MergingIterator maintains a PriorityQueue of PeekFileRecordIterators.
-     * Each PeekFileRecordIterator iterates through a file in which the records are sorted.
-     * The comparator for PeekFileRecordIterator used by the PriorityQueue peeks at the next record from
-     * the file, so the first element in the PriorityQueue is the file that has the next record to be emitted.
-     * In order to get the next record, the first PeekFileRecordIterator in the PriorityQueue is popped,
-     * the record is obtained from that iterator, and then if that iterator is not empty, it is pushed back into
-     * the PriorityQueue.  Because it now has a different record as its next element, it may go into another
-     * location in the PriorityQueue
-     */
-    class MergingIterator implements CloseableIterator<T> {
-        private final TreeSet<PeekFileRecordIterator> queue;
-
-        MergingIterator() {
-            this.queue = new TreeSet<PeekFileRecordIterator>(new PeekFileRecordIteratorComparator());
-            int n = 0;
-            for (final File f : SortingCollection.this.files) {
-                final FileRecordIterator it = new FileRecordIterator(f);
-                if (it.hasNext()) {
-                    this.queue.add(new PeekFileRecordIterator(it, n++));
-                }
-                else {
-                    it.close();
-                }
-            }
-        }
-
-        public boolean hasNext() {
-            return !this.queue.isEmpty();
-        }
-
-        public T next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException();
-            }
-
-            final PeekFileRecordIterator fileIterator = queue.pollFirst();
-            final T ret = fileIterator.next();
-            if (fileIterator.hasNext()) {
-                this.queue.add(fileIterator);
-            }
-            else {
-                ((CloseableIterator<T>)fileIterator.getUnderlyingIterator()).close();
-            }
-
-            return ret;
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-
-        public void close() {
-            while (!this.queue.isEmpty()) {
-                final PeekFileRecordIterator it = this.queue.pollFirst();
-                ((CloseableIterator<T>)it.getUnderlyingIterator()).close();
-            }
-        }
-    }
-
-    /**
-     * Read a file of records in format defined by the codec
-     */
-    class FileRecordIterator implements CloseableIterator<T> {
-        private final File file;
-        private final FileInputStream is;
-        private final Codec<T> codec;
-        private T currentRecord = null;
-
-        FileRecordIterator(final File file) {
-            this.file = file;
-            try {
-                this.is = new FileInputStream(file);
-                this.codec = SortingCollection.this.codec.clone();
-                this.codec.setInputStream(tempStreamFactory.wrapTempInputStream(this.is, Defaults.BUFFER_SIZE));
-                advance();
-            }
-            catch (FileNotFoundException e) {
-                throw new RuntimeIOException(e);
-            }
-        }
-
-        public boolean hasNext() {
-            return this.currentRecord != null;
-        }
-
-        public T next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException();
-            }
-            final T ret = this.currentRecord;
-            advance();
-            return ret;
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-
-        private void advance() {
-            this.currentRecord = this.codec.decode();
-        }
-
-        public void close() {
-            CloserUtil.close(this.is);
-        }
-    }
-
-
-    /**
-     * Just a typedef
-     */
-    class PeekFileRecordIterator extends PeekIterator<T> {
-        final int n; // A serial number used for tie-breaking in the sort
-        PeekFileRecordIterator(final Iterator<T> underlyingIterator, final int n) {
-            super(underlyingIterator);
-            this.n = n;
-        }
-    }
-
-    class PeekFileRecordIteratorComparator implements Comparator<PeekFileRecordIterator>, Serializable {
-        private static final long serialVersionUID = 1L;
-
-        public int compare(final PeekFileRecordIterator lhs, final PeekFileRecordIterator rhs) {
-            final int result = comparator.compare(lhs.peek(), rhs.peek());
-            if (result == 0) return lhs.n - rhs.n;
-            else return result;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SortingLongCollection.java b/src/main/java/htsjdk/samtools/util/SortingLongCollection.java
deleted file mode 100644
index 4cf0c36..0000000
--- a/src/main/java/htsjdk/samtools/util/SortingLongCollection.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.EOFException;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.PriorityQueue;
-
-/**
- * Accumulate a list of longs that can then be sorted in natural order and iterated over.
- * If there are more values accumulated than a specified maximum, values are spilled to disk.
- * <p/>
- * Note that because this class returns primitive longs rather than Longs, it does not conform to
- * any of the Collection iteration interfaces.  Use as follows:
- * <p/>
- * 1. ctor
- * 2. call add() as many times as desired.
- * 3. call doneAddingStartIteration().
- * 4. call hasNext() and next() until exhausted or had enough.
- * 5. optionally call cleanup() to free space in temporary directory as soon as possible.
- * <p/>
- * If there are few enough values so that they all can be kept in RAM, then the array is sorted
- * and iterated over trivially.
- * <p/>
- * If there are more values that can fit in RAM, then values are sorted and written to a temp file when the max
- * number to be stored in RAM is reached. Multiple temp files are then merged during iteration via PriorityQueue.
- * <p/>
- * c.f. SortingCollection for more details.
- *
- * @author alecw at broadinstitute.org
- */
-public class SortingLongCollection {
-    public static final int SIZEOF = 8;
-    public static final int MAX_ITEMS_IN_RAM = (int) Math.floor((Integer.MAX_VALUE / 8) * .999);
-
-    /**
-     * Where files of sorted values go.
-     */
-    private final File[] tmpDir;
-
-    private final int maxValuesInRam;
-    private int numValuesInRam = 0;
-    private long[] ramValues;
-
-
-    /**
-     * Set to true when done adding and ready to iterate
-     */
-    private boolean doneAdding = false;
-
-    /**
-     * Set to true when all temp files have been cleaned up
-     */
-    private boolean cleanedUp = false;
-
-    /**
-     * List of files in tmpDir containing sorted values
-     */
-    private final List<File> files = new ArrayList<File>();
-
-    // for in-memory iteration
-    private int iterationIndex = 0;
-
-    // For disk-based iteration
-    private PriorityQueue<PeekFileValueIterator> priorityQueue;
-
-    /**
-     * Prepare to accumulate values to be sorted
-     *
-     * @param maxValuesInRam how many values to accumulate before spilling to disk
-     * @param tmpDir         Where to write files of values that will not fit in RAM
-     */
-    public SortingLongCollection(final int maxValuesInRam, final File... tmpDir) {
-        if (maxValuesInRam <= 0) {
-            throw new IllegalArgumentException("maxValuesInRam must be > 0");
-        }
-        this.tmpDir = tmpDir;
-        this.maxValuesInRam = Math.min(maxValuesInRam, MAX_ITEMS_IN_RAM);
-        this.ramValues = new long[maxValuesInRam];
-    }
-
-    /**
-     * Add a value to the collection.
-     *
-     * @param value
-     */
-    public void add(final long value) {
-        if (doneAdding) {
-            throw new IllegalStateException("Cannot add after calling doneAddingStartIteration()");
-        }
-        if (numValuesInRam == maxValuesInRam) {
-            spillToDisk();
-        }
-        ramValues[numValuesInRam++] = value;
-    }
-
-    /**
-     * This method must be called after done adding, and before calling hasNext() or next().
-     */
-    public void doneAddingStartIteration() {
-        if (cleanedUp || doneAdding) {
-            throw new IllegalStateException("Cannot call doneAddingStartIteration() after cleanup() was called.");
-        }
-        doneAdding = true;
-
-        if (this.files.isEmpty()) {
-            Arrays.sort(this.ramValues, 0, this.numValuesInRam);
-            return;
-        }
-
-        if (this.numValuesInRam > 0) {
-            spillToDisk();
-        }
-
-        this.priorityQueue = new PriorityQueue<PeekFileValueIterator>(files.size(),
-                new PeekFileValueIteratorComparator());
-        for (final File f : files) {
-            final FileValueIterator it = new FileValueIterator(f);
-            if (it.hasNext()) {
-                this.priorityQueue.offer(new PeekFileValueIterator(it));
-            }
-        }
-
-        // Facilitate GC
-        this.ramValues = null;
-    }
-
-    /**
-     * Sort the values in memory, write them to a file, and clear the buffer of values in memory.
-     */
-    private void spillToDisk() {
-
-        try {
-            Arrays.sort(this.ramValues, 0, this.numValuesInRam);
-            final File f = IOUtil.newTempFile("sortingcollection.", ".tmp", this.tmpDir, IOUtil.FIVE_GBS);
-            DataOutputStream os = null;
-            try {
-                final long numBytes = this.numValuesInRam * SIZEOF;
-                os = new DataOutputStream(IOUtil.maybeBufferOutputStream(new FileOutputStream(f)));
-                f.deleteOnExit();
-                for (int i = 0; i < this.numValuesInRam; ++i) {
-                    os.writeLong(ramValues[i]);
-                }
-                os.flush();
-            } finally {
-                if (os != null) {
-                    os.close();
-                }
-            }
-
-            this.numValuesInRam = 0;
-            this.files.add(f);
-
-        } catch (IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    /**
-     * Delete any temporary files.  After this method is called, no other method calls should be made on this object.
-     */
-    public void cleanup() {
-        this.doneAdding = true;
-        this.cleanedUp = true;
-        this.ramValues = null;
-
-        IOUtil.deleteFiles(this.files);
-    }
-
-
-    /**
-     * Call only after doneAddingStartIteration() has been called.
-     *
-     * @return true if there is another value to be gotten.
-     */
-    public boolean hasNext() {
-        if (!doneAdding || cleanedUp) {
-            throw new IllegalStateException();
-        }
-        if (this.ramValues != null) {
-            // in-memory iteration
-            return this.iterationIndex < numValuesInRam;
-        } else {
-            return !priorityQueue.isEmpty();
-        }
-    }
-
-    /**
-     * Call only if hasNext() == true.
-     *
-     * @return next value from collection, in natural sort order.
-     */
-    public long next() {
-        if (!hasNext()) {
-            throw new NoSuchElementException();
-        }
-        if (this.ramValues != null) {
-            // in-memory iteration
-            return ramValues[iterationIndex++];
-        } else {
-
-            final PeekFileValueIterator fileIterator = priorityQueue.poll();
-            final long ret = fileIterator.next();
-            if (fileIterator.hasNext()) {
-                this.priorityQueue.offer(fileIterator);
-            } else {
-                fileIterator.close();
-            }
-            return ret;
-        }
-    }
-
-    /**
-     * Read a file of longs
-     */
-    private static class FileValueIterator {
-        private final File file;
-        private final DataInputStream is;
-        private long currentRecord = 0;
-        private boolean isCurrentRecord = true;
-
-        FileValueIterator(final File file) {
-            this.file = file;
-            try {
-                is = new DataInputStream(IOUtil.maybeBufferInputStream(new FileInputStream(file)));
-                next();
-            } catch (FileNotFoundException e) {
-                throw new RuntimeIOException(file.getAbsolutePath(), e);
-            }
-        }
-
-        boolean hasNext() {
-            return isCurrentRecord;
-        }
-
-        long next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException();
-            }
-            final long ret = currentRecord;
-            try {
-                currentRecord = is.readLong();
-            } catch (final EOFException eof) {
-                isCurrentRecord = false;
-                currentRecord = 0;
-            } catch (final IOException e) {
-                throw new RuntimeIOException(e);
-            }
-            return ret;
-        }
-
-        void close() {
-            CloserUtil.close(is);
-        }
-    }
-
-
-    /**
-     * Add peek() functionality to FileValueIterator
-     */
-    private static class PeekFileValueIterator {
-        private FileValueIterator underlyingIterator;
-        private long peekValue;
-        private boolean hasPeekedValue = false;
-
-        PeekFileValueIterator(final FileValueIterator underlyingIterator) {
-            this.underlyingIterator = underlyingIterator;
-        }
-
-        boolean hasNext() {
-            return hasPeekedValue || underlyingIterator.hasNext();
-        }
-
-        long next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException();
-            }
-            if (hasPeekedValue) {
-                hasPeekedValue = false;
-                return peekValue;
-            }
-            return underlyingIterator.next();
-        }
-
-        long peek() {
-            if (!hasNext()) {
-                throw new NoSuchElementException();
-            }
-            if (!hasPeekedValue) {
-                peekValue = underlyingIterator.next();
-                hasPeekedValue = true;
-            }
-            return peekValue;
-        }
-
-        void close() {
-            underlyingIterator.close();
-            hasPeekedValue = false;
-            underlyingIterator = null;
-        }
-    }
-
-    private static class PeekFileValueIteratorComparator implements Comparator<PeekFileValueIterator>, Serializable {
-        private static final long serialVersionUID = 1L;
-
-        public int compare(final PeekFileValueIterator it1, final PeekFileValueIterator it2) {
-            if (it1.peek() < it2.peek()) {
-                return -1;
-            }
-            if (it1.peek() == it2.peek()) {
-                return 0;
-            }
-            return 1;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/StopWatch.java b/src/main/java/htsjdk/samtools/util/StopWatch.java
deleted file mode 100644
index 8e12916..0000000
--- a/src/main/java/htsjdk/samtools/util/StopWatch.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Utility to help in performance testing.
- */
-public class StopWatch {
-
-    private long startTime = 0;
-    private long elapsedTime = 0;
-    private boolean running = false;
-
-
-    public void start() {
-        this.startTime = System.currentTimeMillis();
-        this.running = true;
-    }
-
-
-    public void stop() {
-        long stopTime = System.currentTimeMillis();
-        elapsedTime += stopTime - startTime;
-        this.running = false;
-    }
-
-    public void reset() {
-        stop();
-        elapsedTime = 0;
-        startTime = 0;
-    }
-
-    /**
-     * Returns the cumulative time between all the start() and stop() calls made to this object.  If the
-     * StopWatch is currently running, also includes the time between the most recent start() and now.
-     * @return elapsedTime in milliseconds
-     */
-    public long getElapsedTime() {
-        final long currentElapsed;
-        if (running) {
-             currentElapsed = (System.currentTimeMillis() - startTime);
-        } else {
-            currentElapsed = 0;
-        }
-        return currentElapsed + elapsedTime;
-    }
-
-
-    /**
-     * @return same as getElapsedTime(), but truncated to seconds.
-     */
-    public long getElapsedTimeSecs() {
-        return getElapsedTime() / 1000;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/StringLineReader.java b/src/main/java/htsjdk/samtools/util/StringLineReader.java
deleted file mode 100644
index ed383a2..0000000
--- a/src/main/java/htsjdk/samtools/util/StringLineReader.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.regex.Pattern;
-
-/**
- * Implementation of LineReader that gets its input from a String.  No charset conversion
- * is necessary because the String is in unicode.  Handles CR, LF or CRLF line termination,
- * but if asked to return the line terminator, it always comes back as LF.
- */
-public class StringLineReader implements LineReader {
-    private static final Pattern CRLF = Pattern.compile("\r\n");
-    private final String theString;
-    private int curPos = 0;
-    private int lineNumber = 0;
-
-    public StringLineReader(final String s) {
-        // Simplify later processing by replacing crlf with just lf, and replacing solo cr with lf.
-        // Note that String.replace(String, String) causes a regex to be used, so precompilation should be
-        // the best we can do short of handling the string directly.
-        this.theString = CRLF.matcher(s).replaceAll("\n").replace('\r', '\n');
-    }
-
-    /**
-     * Read a line and remove the line terminator
-     */
-    public String readLine() {
-        return readLine(false);
-    }
-
-    /**
-     * Read a line and optionally include the line terminator
-     *
-     * @param includeTerminators
-     * @return the next line from the input, with \n terminator if present and requested, or null if no more input.
-     */
-    private String readLine(final boolean includeTerminators) {
-        if (curPos == theString.length()) {
-            return null;
-        }
-        final int nextLfIndex = theString.indexOf('\n', curPos);
-        if (nextLfIndex == -1) {
-            final int startPos = curPos;
-            curPos = theString.length();
-            ++lineNumber;
-            return theString.substring(startPos);
-        }
-        final int startPos = curPos;
-        final int endPos = nextLfIndex + (includeTerminators? 1: 0);
-        curPos = nextLfIndex + 1;
-        ++lineNumber;
-        return theString.substring(startPos, endPos);
-    }
-
-    /**
-     * @return 1-based number of line most recently read
-     */
-    public int getLineNumber() {
-        return lineNumber;
-    }
-
-    /**
-     * Non-destructive one-character look-ahead.
-     *
-     * @return If not eof, the next character that would be read.  If eof, -1.
-     */
-    public int peek() {
-        if (curPos == theString.length()) {
-            return -1;
-        }
-        return theString.charAt(curPos);
-    }
-
-    public void close() {
-        curPos = theString.length();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/StringUtil.java b/src/main/java/htsjdk/samtools/util/StringUtil.java
deleted file mode 100644
index 9049253..0000000
--- a/src/main/java/htsjdk/samtools/util/StringUtil.java
+++ /dev/null
@@ -1,603 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Grab-bag of stateless String-oriented utilities.
- */
-public class StringUtil {
-    private static final byte UPPER_CASE_OFFSET = 'A' - 'a';
-
-    /**
-     * @param separator String to interject between each string in strings arg
-     * @param objs List of objs to be joined
-     * @return String that concatenates the result of each item's to String method for all items in objs, with separator between each of them.
-     */
-    public static <T> String join(final String separator, final Collection<T> objs) {
-        if (objs.isEmpty()) {
-            return "";
-        }
-
-        boolean notFirst = false;
-
-        final StringBuilder ret = new StringBuilder();
-        for (final Object obj : objs) {
-            if(notFirst) {
-                ret.append(separator);
-            }
-            ret.append(obj.toString());
-            notFirst = true;
-        }
-        return ret.toString();
-    }
-
-    public static <T> String join(final String separator, final T... objs) {
-        final List<T> values = Arrays.asList(objs);
-        return join(separator, values);
-    }
-
-
-    /**
-     * Split the string into tokens separated by the given delimiter.  Profiling has
-     * revealed that the standard string.split() method typically takes > 1/2
-     * the total time when used for parsing ascii files.
-     * Note that if tokens arg is not large enough to all the tokens in the string, excess tokens are discarded.
-     *
-     * @param aString  the string to split
-     * @param tokens an array to hold the parsed tokens
-     * @param delim  character that delimits tokens
-     * @return the number of tokens parsed
-     */
-    public static int split(final String aString, final String[] tokens, final char delim) {
-
-        final int maxTokens = tokens.length;
-        int nTokens = 0;
-        int start = 0;
-        int end = aString.indexOf(delim);
-        if(end < 0) {
-            tokens[nTokens++] = aString;
-            return nTokens;
-        }
-        while ((end >= 0) && (nTokens < maxTokens))
-        {
-            tokens[nTokens++] = aString.substring(start, end);
-            start = end + 1;
-            end = aString.indexOf(delim, start);
-
-        }
-        // Add the trailing string,  if there is room and if it is not empty.
-        if (nTokens < maxTokens)
-        {
-            final String trailingString = aString.substring(start);
-            if (!trailingString.isEmpty())
-            {
-                tokens[nTokens++] = trailingString;
-            }
-        }
-        return nTokens;
-    }
-
-    /**
-     * Split the string into tokens separated by the given delimiter.  Profiling has
-     * revealed that the standard string.split() method typically takes > 1/2
-     * the total time when used for parsing ascii files.
-     * Note that the string is split into no more elements than tokens arg will hold, so the final tokenized
-     * element may contain delimiter chars.
-     *
-     * @param aString  the string to split
-     * @param tokens an array to hold the parsed tokens
-     * @param delim  character that delimits tokens
-     * @return the number of tokens parsed
-     */
-    public static int splitConcatenateExcessTokens(final String aString, final String[] tokens, final char delim) {
-
-        final int maxTokens = tokens.length;
-        int nTokens = 0;
-        int start = 0;
-        int end = aString.indexOf(delim);
-        if(end < 0) {
-            tokens[nTokens++] = aString;
-            return nTokens;
-        }
-        while ((end >= 0) && (nTokens < maxTokens - 1))
-        {
-            tokens[nTokens++] = aString.substring(start, end);
-            start = end + 1;
-            end = aString.indexOf(delim, start);
-
-        }
-        // Add the trailing string,  if it is not empty.
-        final String trailingString = aString.substring(start);
-        if (!trailingString.isEmpty())
-        {
-            tokens[nTokens++] = trailingString;
-        }
-        return nTokens;
-    }
-
-    /**
-     * @param b ASCII character
-     * @return lowercase version of arg if it was uppercase, otherwise returns arg
-     */
-    public static byte toLowerCase(final byte b) {
-        if (b < 'A' || b > 'Z') {
-            return b;
-        }
-        return (byte)(b - UPPER_CASE_OFFSET);
-    }
-
-    /**
-     * @param b ASCII character
-     * @return uppercase version of arg if it was lowercase, otherwise returns arg
-     */
-    public static byte toUpperCase(final byte b) {
-        if (b < 'a' || b > 'z') {
-            return b;
-        }
-        return (byte)(b + UPPER_CASE_OFFSET);
-    }
-
-    /**
-     * Converts in place all lower case letters to upper case in the byte array provided.
-     */
-    public static void toUpperCase(final byte[] bytes) {
-        final int length = bytes.length;
-        for (int i=0; i<length; ++i) {
-            if (bytes[i] >= 'a' && bytes[i] <= 'z') {
-                bytes[i] = (byte) (bytes[i] + UPPER_CASE_OFFSET);
-            }
-        }
-    }
-
-
-    /**
-     * Checks that a String doesn't contain one or more characters of interest.
-     *
-     * @param illegalChars the String to check
-     * @param chars the characters to check for
-     * @return String the input String for convenience
-     * @throws IllegalArgumentException if the String contains one or more of the characters
-     */
-    public static String assertCharactersNotInString(final String illegalChars, final char... chars) {
-        for (final char illegalChar : illegalChars.toCharArray()) {
-            for (final char ch: chars) {
-                if (illegalChar == ch) {
-                    throw new IllegalArgumentException("Supplied String contains illegal character '" + illegalChar + "'.");
-                }
-            }
-        }
-
-        return illegalChars;
-    }
-
-    /**
-     * Return input string with newlines inserted to ensure that all lines
-     * have length <= maxLineLength.  if a word is too long, it is simply broken
-     * at maxLineLength.  Does not handle tabs intelligently (due to implementer laziness).
-     */
-    public static String wordWrap(final String s, final int maxLineLength) {
-        final String[] lines = s.split("\n");
-        final StringBuilder sb = new StringBuilder();
-        for (final String line: lines) {
-            if (sb.length() > 0) {
-                sb.append('\n');
-            }
-            sb.append(wordWrapSingleLine(line, maxLineLength));
-        }
-        if (s.endsWith("\n")) {
-            sb.append('\n');
-        }
-        return sb.toString();
-    }
-
-    public static String wordWrapSingleLine(final String s, final int maxLineLength) {
-        if (s.length() <= maxLineLength) {
-            return s;
-        }
-        final StringBuilder sb = new StringBuilder();
-        int startCopyFrom = 0;
-        while (startCopyFrom < s.length()) {
-            int lastSpaceIndex = startCopyFrom;
-            int i;
-            // Find break point (if it exists)
-            for (i = startCopyFrom; i < s.length() && i - startCopyFrom < maxLineLength; ++i) {
-                if (Character.isWhitespace(s.charAt(i))) {
-                    lastSpaceIndex = i;
-                }
-            }
-            if (i - startCopyFrom < maxLineLength) {
-                lastSpaceIndex = i;
-            }
-            // Include any trailing whitespace
-            for (; lastSpaceIndex < s.length() && Character.isWhitespace(s.charAt(lastSpaceIndex)); ++lastSpaceIndex) {}
-            if (sb.length() > 0) {
-                sb.append('\n');
-            }
-            // Handle situation in which there is no word break.  Just break the word in the middle.
-            if (lastSpaceIndex == startCopyFrom) {
-                lastSpaceIndex = i;
-            }
-            sb.append(s.substring(startCopyFrom, lastSpaceIndex));
-            startCopyFrom = lastSpaceIndex;
-        }
-        return sb.toString();
-    }
-
-
-    public static String intValuesToString(final int[] intVals) {
-        final StringBuilder sb = new StringBuilder(intVals.length);
-        if(intVals.length > 0) {
-            sb.append(String.valueOf(intVals[0]));
-            for(int i = 1; i < intVals.length; i++) {
-                sb.append(", ");
-                sb.append(String.valueOf(intVals[i]));
-            }
-        }
-
-        return sb.toString();
-    }
-
-    public static String intValuesToString(final short[] shortVals) {
-        final StringBuilder sb = new StringBuilder(shortVals.length);
-        if(shortVals.length > 0) {
-            sb.append(String.valueOf(shortVals[0]));
-            for(int i = 1; i < shortVals.length; i++) {
-                sb.append(", ");
-                sb.append(String.valueOf(shortVals[i]));
-            }
-        }
-
-        return sb.toString();
-    }
-
-    ////////////////////////////////////////////////////////////////////
-    // The following methods all convert btw bytes and Strings, without
-    // using the Java character set mechanism.
-    ////////////////////////////////////////////////////////////////////
-
-    public static String bytesToString(final byte[] data) {
-        if (data == null) {
-            return null;
-        }
-        return bytesToString(data, 0, data.length);
-    }
-
-    @SuppressWarnings("deprecation")
-    public static String bytesToString(final byte[] buffer, final int offset, final int length) {
-/*
-        The non-deprecated way, that requires allocating char[]
-        final char[] charBuffer = new char[length];
-        for (int i = 0; i < length; ++i) {
-            charBuffer[i] = (char)buffer[i+offset];
-        }
-        return new String(charBuffer);
-*/
-        return new String(buffer, 0, offset, length);
-    }
-
-    @SuppressWarnings("deprecation")
-    public static byte[] stringToBytes(final String s) {
-/*
-        The non-deprecated way, that requires allocating char[]
-        final byte[] byteBuffer = new byte[s.length()];
-        final char[] charBuffer = s.toCharArray();
-        for (int i = 0; i < charBuffer.length; ++i) {
-            byteBuffer[i] = (byte)(charBuffer[i] & 0xff);
-        }
-        return byteBuffer;
-*/
-        final byte[] byteBuffer = new byte[s.length()];
-        s.getBytes(0, byteBuffer.length, byteBuffer, 0);
-        return byteBuffer;
-    }
-
-    @SuppressWarnings("deprecation")
-    public static byte[] stringToBytes(final String s, final int offset, final int length) {
-        final byte[] byteBuffer = new byte[length];
-        s.getBytes(offset, offset + length, byteBuffer, 0);
-        return byteBuffer;
-    }
-
-    // This method might more appropriately live in BinaryCodec, but all the byte <=> char conversion
-    // should be in the same place.
-    public static String readNullTerminatedString(final BinaryCodec binaryCodec) {
-        final StringBuilder ret = new StringBuilder();
-        for (byte b = binaryCodec.readByte(); b != 0; b = binaryCodec.readByte()) {
-            ret.append((char)(b & 0xff));
-        }
-        return ret.toString();
-    }
-
-    /**
-     * Convert chars to bytes merely by casting
-     * @param chars input chars
-     * @param charOffset where to start converting from chars array
-     * @param length how many chars to convert
-     * @param bytes where to put the converted output
-     * @param byteOffset where to start writing the converted output.
-     */
-    public static void charsToBytes(final char[] chars, final int charOffset, final int length,
-                                    final byte[] bytes, final int byteOffset) {
-        for (int i = 0; i < length; ++i) {
-            bytes[byteOffset + i] = (byte)chars[charOffset + i];
-        }
-    }
-
-    /**
-     * Convert ASCII char to byte.
-     */
-    public static byte charToByte(final char c) {
-        return (byte)c;
-    }
-
-    /**
-     * Convert ASCII byte to ASCII char.
-     */
-    public static char byteToChar(final byte b) {
-        return (char)(b & 0xff);
-    }
-
-    /**
-     * Convert a byte array into a String hex representation.
-     * @param data Input to be converted.
-     * @return String twice as long as data.length with hex representation of data.
-     */
-    public static String bytesToHexString(final byte[] data) {
-        final char[] chars = new char[2 * data.length];
-        for (int i = 0; i < data.length; i++) {
-            final byte b = data[i];
-            chars[2*i] = toHexDigit((b >> 4) & 0xF);
-            chars[2*i+1] = toHexDigit(b & 0xF);
-        }
-        return new String(chars);
-    }
-
-    /**
-     * Convert a String containing hex characters into an array of bytes with the binary representation
-     * of the hex string
-     * @param s Hex string.  Length must be even because each pair of hex chars is converted into a byte.
-     * @return byte array with binary representation of hex string.
-     * @throws NumberFormatException
-     */
-    public static byte[] hexStringToBytes(final String s)  throws NumberFormatException {
-        if (s.length() % 2 != 0) {
-            throw new NumberFormatException("Hex representation of byte string does not have even number of hex chars: " + s);
-        }
-        final byte[] ret = new byte[s.length() / 2];
-        for (int i = 0; i < ret.length; ++i) {
-            ret[i] = (byte) ((fromHexDigit(s.charAt(i * 2)) << 4) | fromHexDigit(s.charAt(i * 2 + 1)));
-        }
-        return ret;
-    }
-
-    public static char toHexDigit(final int value) {
-        return (char) ((value < 10) ? ('0' + value) : ('A' + value - 10));
-    }
-
-    public static int fromHexDigit(final char c) throws NumberFormatException {
-        final int ret = Character.digit(c, 16);
-        if (ret == -1) {
-            throw new NumberFormatException("Not a valid hex digit: " + c);
-        }
-        return ret;
-    }
-
-    /**
-     * Reverse the given string.  Does not check for null.
-     * @param s String to be reversed.
-     * @return New string that is the reverse of the input string.
-     */
-    public static String reverseString(final String s) {
-        final StringBuilder sb = new StringBuilder(s);
-        sb.reverse();
-        return sb.toString();
-    }
-
-    /**
-     * <p>Checks if a String is whitespace, empty ("") or null.</p>
-     *
-     * <pre>
-     * StringUtils.isBlank(null)      = true
-     * StringUtils.isBlank("")        = true
-     * StringUtils.isBlank(" ")       = true
-     * StringUtils.isBlank("sam")     = false
-     * StringUtils.isBlank("  sam  ") = false
-     * </pre>
-     *
-     * @param str  the String to check, may be null
-     * @return <code>true</code> if the String is null, empty or whitespace
-     */
-    public static boolean isBlank(String str) {
-        int strLen;
-        if (str == null || (strLen = str.length()) == 0) {
-            return true;
-        }
-        for (int i = 0; i < strLen; i++) {
-            if (!Character.isWhitespace(str.charAt(i)) ) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-     /* <p>Generates a string of one character to a specified length</p>
-     *
-     * @param c  the Character to repeat
-     * @param repeatNumber the number of times to repeat the character
-     * @return String with the character c repeated repeatNumber times
-     */
-    public static String repeatCharNTimes(char c, int repeatNumber) {
-        char[] output = new char[repeatNumber];
-        Arrays.fill(output, c);
-        return String.valueOf(output);
-    }
-
-    /** Returns {@link Object#toString()} of the provided value if it isn't null; "" otherwise. */
-    public static final String EMPTY_STRING = "";
-    public static String asEmptyIfNull(final Object string) {
-        return string == null ? EMPTY_STRING : string.toString();
-    }
-
-    /*
-    * This is from GIT!
-    *  This function implements the Damerau-Levenshtein algorithm to
-    * calculate a distance between strings.
-    *
-    * Basically, it says how many letters need to be swapped, substituted,
-    * deleted from, or added to string1, at least, to get string2.
-    *
-    * The idea is to build a distance matrix for the substrings of both
-    * strings.  To avoid a large space complexity, only the last three rows
-    * are kept in memory (if swaps had the same or higher cost as one deletion
-    * plus one insertion, only two rows would be needed).
-    *
-    * At any stage, "i + 1" denotes the length of the current substring of
-    * string1 that the distance is calculated for.
-    *
-    * row2 holds the current row, row1 the previous row (i.e. for the substring
-    * of string1 of length "i"), and row0 the row before that.
-    *
-    * In other words, at the start of the big loop, row2[j + 1] contains the
-    * Damerau-Levenshtein distance between the substring of string1 of length
-    * "i" and the substring of string2 of length "j + 1".
-    *
-    * All the big loop does is determine the partial minimum-cost paths.
-    *
-    * It does so by calculating the costs of the path ending in characters
-    * i (in string1) and j (in string2), respectively, given that the last
-    * operation is a substitution, a swap, a deletion, or an insertion.
-    *
-    * This implementation allows the costs to be weighted:
-    *
-    * Note that this algorithm calculates a distance _iff_ d == a.
-    */
-    public static int levenshteinDistance(final String string1, final String string2, int swap, int substitution, int insertion, int deletion) {
-        int i, j;
-
-        int[] row0 = new int[(string2.length() + 1)];
-        int[] row1 = new int[(string2.length() + 1)];
-        int[] row2 = new int[(string2.length() + 1)];
-        int[] dummy;
-
-        final byte[] str1 = string1.getBytes();
-        final byte[] str2 = string2.getBytes();
-
-        for (j = 0; j < str2.length; j++) {
-            row1[j] = j * insertion;
-        }
-        for (i = 0; i < str1.length; i++) {
-            row2[0] = (i + 1) * deletion;
-            for (j = 0; j < str2.length; j++) {
-                /* substitution */
-                row2[j + 1] = row1[j];
-                if (str1[i] != str2[j]) {
-                    row2[j + 1] += substitution;
-                }
-                /* swap */
-                if (i > 0 && j > 0 && str1[i - 1] == str2[j] &&
-                        str1[i] == str2[j - 1] &&
-                        row2[j + 1] > row0[j - 1] + swap) {
-                    row2[j + 1] = row0[j - 1] + swap;
-                }
-                /* deletion */
-                if (row2[j + 1] > row1[j + 1] + deletion) {
-                    row2[j + 1] = row1[j + 1] + deletion;
-                }
-                /* insertion */
-                if (row2[j + 1] > row2[j] + insertion) {
-                    row2[j + 1] = row2[j] + insertion;
-                }
-            }
-
-            dummy = row0;
-            row0 = row1;
-            row1 = row2;
-            row2 = dummy;
-        }
-
-        i = row1[str2.length];
-
-        return i;
-    }
-
-    /**
-     * Calculates the Hamming distance (number of character mismatches) between two strings s1 and s2.
-     * Since Hamming distance is not defined for strings of differing lengths, we throw an exception if
-     * the two strings are of different lengths.  Hamming distance is case sensitive and does not have
-     * any special treatment for DNA.
-     *
-     * @param s1 The first string to compare
-     * @param s2 The second string to compare, note that if s1 and s2 are swapped the value returned will be identical.
-     * @return Hamming distance between s1 and s2.
-     * @throws IllegalArgumentException If the two strings have differing lengths.
-     */
-    public static int hammingDistance(final String s1, final String s2) {
-        if (s1.length() != s2.length()) {
-            throw new IllegalArgumentException("Attempted to determine Hamming distance of strings with differing lengths. " +
-                    "The first string has length " + s1.length() + " and the second string has length " + s2.length() + ".");
-        }
-        int measuredDistance = 0;
-        for (int i = 0;i < s1.length();i++) {
-            if (s1.charAt(i) != s2.charAt(i)) {
-                measuredDistance++;
-            }
-        }
-        return measuredDistance;
-    }
-
-    /**
-     * Determines if two strings s1 and s2 are within maxHammingDistance of each other using the Hamming distance metric.
-     * Since Hamming distance is not defined for strings of differing lengths, we throw an exception if
-     * the two strings are of different lengths.  Hamming distance is case sensitive and does not have any
-     * special treatment for DNA.
-     *
-     * @param s1 The first string to compare
-     * @param s2 The second string to compare, note that if s1 and s2 are swapped the value returned will be identical.
-     * @param maxHammingDistance The largest Hamming distance the strings can have for this function to return true.
-     * @return true if the two strings are within maxHammingDistance of each other, false otherwise.
-     * @throws IllegalArgumentException If the two strings have differing lengths.
-     */
-    public static boolean isWithinHammingDistance(final String s1, final String s2, final int maxHammingDistance) {
-        if (s1.length() != s2.length()) {
-            throw new IllegalArgumentException("Attempted to determine if two strings of different length were within a specified edit distance.");
-        }
-        int measuredDistance = 0;
-        for (int i = 0;i < s1.length();i++) {
-            if (s1.charAt(i) != s2.charAt(i)) {
-                measuredDistance++;
-                // If the measuredDistance is larger than the maxHammingDistance we can short circuit and return
-                // false, there is no need to continue evaluating the distance.
-                if (measuredDistance > maxHammingDistance) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/TempStreamFactory.java b/src/main/java/htsjdk/samtools/util/TempStreamFactory.java
deleted file mode 100644
index 0915037..0000000
--- a/src/main/java/htsjdk/samtools/util/TempStreamFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2011 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.BufferedOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Factory class for wrapping input and output streams for temporary files.  If available, Snappy is used to
- * compress output files.  Therefore, if a temporary output file is written with an output stream obtained
- * from this class, it must be read by an input stream created by this class, otherwise a file written with
- * compression will not be read with decompression.
- */
-public class TempStreamFactory {
-    private static SnappyLoader snappyLoader = null;
-
-    private static synchronized SnappyLoader getSnappyLoader() {
-        if (snappyLoader == null) snappyLoader = new SnappyLoader();
-        return snappyLoader;
-    }
-
-    /**
-     * Wrap the given InputStream in a SnappyInputStream if available.
-     * @return If Snappy is available, a SnappyInputStream wrapping inputStream.
-     * If not, and bufferSize > 0, a BufferedInputStream.
-     * Otherwise inputStream is returned.
-     */
-    public InputStream wrapTempInputStream(final InputStream inputStream, final int bufferSize) {
-        InputStream is = IOUtil.maybeBufferInputStream(inputStream, bufferSize);
-        if (getSnappyLoader().SnappyAvailable) {
-            try {
-                return getSnappyLoader().wrapInputStream(is);
-            } catch (Exception e) {
-                throw new SAMException("Error creating SnappyInputStream", e);
-            }
-        } else {
-            return is;
-        }
-    }
-
-    /**
-     * Wrap the given OutputStream in a SnappyOutputStream if available.
-     * @return If Snappy is available, a SnappyOutputStream wrapping outputStream.
-     * If not, and bufferSize > 0, a BufferedOutputStream.
-     * Otherwise outputStream is returned.
-     */
-    public OutputStream wrapTempOutputStream(final OutputStream outputStream, final int bufferSize) {
-        OutputStream os = outputStream;
-        if (bufferSize > 0) os = new BufferedOutputStream(os, bufferSize);
-        if (getSnappyLoader().SnappyAvailable) {
-            try {
-                os = getSnappyLoader().wrapOutputStream(os);
-            } catch (Exception e) {
-                throw new SAMException("Error creating SnappyOutputStream", e);
-            }
-        }
-        return os;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/TestUtil.java b/src/main/java/htsjdk/samtools/util/TestUtil.java
deleted file mode 100644
index fd840d1..0000000
--- a/src/main/java/htsjdk/samtools/util/TestUtil.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.*;
-
-public class TestUtil {
-
-    /**
-     * Base url where all test files for http tests are found
-     */
-    public static final String BASE_URL_FOR_HTTP_TESTS = "https://personal.broadinstitute.org/picard/testdata/";
-
-    public static File getTempDirectory(final String prefix, final String suffix) {
-        final File tempDirectory;
-        try {
-            tempDirectory = File.createTempFile(prefix, suffix);
-        } catch (IOException e) {
-            throw new SAMException("Failed to create temporary file.", e);
-        }
-        if (!tempDirectory.delete())
-            throw new SAMException("Failed to delete file: " + tempDirectory);
-        if (!tempDirectory.mkdir())
-            throw new SAMException("Failed to make directory: " + tempDirectory);
-        tempDirectory.deleteOnExit();
-        return tempDirectory;
-    }
-
-    /**
-     * @deprecated Use properly spelled method. {@link #getTempDirectory}
-     */
-    @Deprecated
-    public static File getTempDirecory(final String prefix, final String suffix) {
-        return getTempDirectory(prefix, suffix);
-    }
-
-        /**
-         * Little test utility to help tests that create multiple levels of subdirectories
-         * clean up after themselves.
-         *
-         * @param directory The directory to be deleted (along with its subdirectories)
-         */
-    public static void recursiveDelete(final File directory) {
-        for (final File f : directory.listFiles()) {
-            if (f.isDirectory()) {
-                recursiveDelete(f);
-            }
-            f.delete();
-        }
-    }
-
-    /**
-     * Serialize and Deserialize an object
-     * Useful for testing if serialization is correctly handled for a class.
-     * @param input an object to serialize and then deserialize
-     * @param <T> any Serializable type
-     * @return a copy of the initial object
-     * @throws IOException
-     * @throws ClassNotFoundException
-     */
-    public static <T extends Serializable> T serializeAndDeserialize(T input) throws IOException, ClassNotFoundException {
-        final ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
-        final ObjectOutputStream out = new ObjectOutputStream(byteArrayStream);
-
-        out.writeObject(input);
-        final ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(byteArrayStream.toByteArray()));
-
-        @SuppressWarnings("unchecked")
-        final T result = (T) in.readObject();
-
-        out.close();
-        in.close();
-        return result;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/TrimmingUtil.java b/src/main/java/htsjdk/samtools/util/TrimmingUtil.java
deleted file mode 100644
index 06667d3..0000000
--- a/src/main/java/htsjdk/samtools/util/TrimmingUtil.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Tim Fennell
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Utility code for performing quality trimming.
- *
- * @author Tim Fennell
- */
-public class TrimmingUtil {
-    /**
-     * Implements phred-style quality trimming. Takes in an array of quality values as a
-     * byte[] and return the first index within the byte array that should be clipped,
-     * such that the caller can then invoke things like:
-     *     int retval = findQualityTrimPoint(10, quals);
-     *     final byte[] trimmedQuals = Arrays.copyOfRange(quals, 0, retval);
-     *     final String trimmedBases = bases.substring(0, retval);
-     *
-     * If the entire read is of low quality this function may return 0!  It is left to the caller
-     * to decide whether or not to trim reads down to 0-bases, or to enforce some minimum length.
-     *
-     * @param quals a byte[] of quality scores in phred scaling (i.e. integer values between 0 and ~60)
-     * @param trimQual the lowest quality that is considered "good". In the simplest case
-     *                 where a read is composed exclusively of "good" qualities followed by
-     *                 "bad" qualities, this is the lowest quality value left after trimming.
-     * @return The zero-based index of the first base within the quality string that should be trimmed.
-     *         When no trimming is required, quals.length (i.e. an index one greater than the last valid
-     *         index) will be returned.
-     */
-    public static int findQualityTrimPoint(final byte[] quals, final int trimQual) {
-        final int length = quals.length;
-        int score = 0, maxScore = 0, trimPoint = length;
-        if (trimQual < 1 || length == 0) return 0;
-
-        for (int i=length-1; i>=0; --i) {
-            score += trimQual - (quals[i]);
-            if (score < 0) break;
-            if (score > maxScore) {
-                maxScore = score;
-                trimPoint = i;
-            }
-        }
-
-        return trimPoint;
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Tuple.java b/src/main/java/htsjdk/samtools/util/Tuple.java
deleted file mode 100644
index 2177920..0000000
--- a/src/main/java/htsjdk/samtools/util/Tuple.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * A simple tuple class.
- *
- * @author mccowan
- */
-public class Tuple<A, B> {
-    public final A a;
-    public final B b;
-
-    public Tuple(final A a, final B b) {
-        this.a = a;
-        this.b = b;
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final Tuple<?, ?> tuple = (Tuple<?, ?>) o;
-
-        if (a != null ? !a.equals(tuple.a) : tuple.a != null) return false;
-
-        return !(b != null ? !b.equals(tuple.b) : tuple.b != null);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = a != null ? a.hashCode() : 0;
-        result = 31 * result + (b != null ? b.hashCode() : 0);
-
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return "[" + a + ", " + b + "]";
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/WholeGenomeReferenceSequenceMask.java b/src/main/java/htsjdk/samtools/util/WholeGenomeReferenceSequenceMask.java
deleted file mode 100644
index 1263285..0000000
--- a/src/main/java/htsjdk/samtools/util/WholeGenomeReferenceSequenceMask.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceRecord;
-
-/**
- * Implementation of ReferenceSequenceMask that indicates that all the loci in the sequence dictionary are of interest.
- * @author alecw at broadinstitute dot org
- */
-public class WholeGenomeReferenceSequenceMask implements ReferenceSequenceMask {
-
-    SAMFileHeader header;
-
-    public WholeGenomeReferenceSequenceMask(final SAMFileHeader header) {
-        this.header = header;
-    }
-
-    /**
-     * @return true if the mask is set for the given sequence and position
-     */
-    public boolean get(final int sequenceIndex, final int position) {
-        if (sequenceIndex < 0) {
-            throw new IllegalArgumentException("Negative sequence index " + sequenceIndex);
-        }
-        if (sequenceIndex >= header.getSequenceDictionary().size()) {
-            return false;
-        }
-        final SAMSequenceRecord sequenceRecord = header.getSequence(sequenceIndex);
-        return position <= sequenceRecord.getSequenceLength();
-    }
-
-    /**
-     * @return the next pos on the given sequence >= position that is set, or -1 if there are no more set positions
-     */
-    public int nextPosition(final int sequenceIndex, final int position) {
-        if (get(sequenceIndex, position + 1)) {
-            return position + 1;
-        } else {
-            return -1;
-        }
-    }
-
-    /**
-     * @return Largest sequence index for which there are set bits.
-     */
-    public int getMaxSequenceIndex() {
-        return header.getSequenceDictionary().size() - 1;
-    }
-
-    /**
-     * @return the largest position on the last sequence index
-     */
-    public int getMaxPosition() {
-        SAMSequenceRecord lastSequenceRecord = header.getSequence(getMaxSequenceIndex());
-        return lastSequenceRecord.getSequenceLength();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ftp/FTPClient.java b/src/main/java/htsjdk/samtools/util/ftp/FTPClient.java
deleted file mode 100644
index 3af6deb..0000000
--- a/src/main/java/htsjdk/samtools/util/ftp/FTPClient.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard.  All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTIES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.util.ftp;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.BufferedReader;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintStream;
-import java.net.Socket;
-import java.util.NoSuchElementException;
-import java.util.StringTokenizer;
-
-/**
- * @author jrobinso
- * @date Oct 30, 2010
- */
-public class FTPClient {
-
-    private Socket commandSocket = null;
-
-    public static int READ_TIMEOUT = 5 * 60 * 1000;
-
-    /**
-     * Stream to write commands.
-     * NOTE -- a PrintStream is used no purpose (as opposed to PrintWriter).  PrintWriter will not work!
-     */
-    private PrintStream commandStream = null;
-    private BufferedReader responseReader = null;
-    private InputStream dataStream;
-    private String passiveHost;
-    private int passivePort;
-    long restPosition = -1;
-    String host;
-
-    /**
-     * Connects to the given FTP host on the default port.
-     */
-    public FTPReply connect(String host) throws IOException {
-        this.host = host;
-        commandSocket = new Socket(host, 21);
-        commandSocket.setSoTimeout(READ_TIMEOUT);
-        commandStream = new PrintStream(commandSocket.getOutputStream());
-        responseReader = new BufferedReader(new InputStreamReader(commandSocket.getInputStream()));
-
-        FTPReply reply = new FTPReply(responseReader);
-
-        if (!reply.isPositiveCompletion()) {
-            disconnect();
-        }
-
-        return reply;
-    }
-
-
-    /**
-     * Executes the given FTP command on our current connection, returning the
-     * three digit response code from the server.  This method only works for
-     * commands that do not require an additional data port.
-     */
-    public FTPReply executeCommand(String command) throws IOException {
-        commandStream.println(command);
-        return new FTPReply(responseReader);
-    }
-
-
-    /**
-     * Wrapper for the commands <code>user [username]</code> and <code>pass
-     * [password]</code>.
-     */
-    public FTPReply login(String username, String password) throws IOException {
-        FTPReply response = executeCommand("user " + username);
-        if (!response.isPositiveIntermediate()) return response;
-        response = executeCommand("pass " + password);
-        return response;
-    }
-
-    public FTPReply quit() throws IOException {
-        return executeCommand("QUIT");
-    }
-
-    public FTPReply binary() throws IOException {
-        return executeCommand("TYPE I");
-    }
-
-
-    public FTPReply pasv() throws IOException {
-
-        FTPReply reply = executeCommand("PASV");
-
-        if (reply.getCode() == 226 || reply.getCode() == 426) {
-            reply = getReply();
-        }
-
-        String response = reply.getReplyString();
-
-
-        int code = reply.getCode();
-
-        int opening = response.indexOf('(');
-        int closing = response.indexOf(')', opening + 1);
-        if (closing > 0) {
-            String dataLink = response.substring(opening + 1, closing);
-            StringTokenizer tokenizer = new StringTokenizer(dataLink, ",");
-            try {
-                passiveHost = tokenizer.nextToken() + "." + tokenizer.nextToken() + "."
-                        + tokenizer.nextToken() + "." + tokenizer.nextToken();
-                passivePort = Integer.parseInt(tokenizer.nextToken()) * 256
-                        + Integer.parseInt(tokenizer.nextToken());
-            } catch (NumberFormatException e) {
-                throw new IOException("SimpleFTP received bad data link information: " + response);
-            } catch (NoSuchElementException e){
-                throw new IOException("SimpleFTP received bad data link information: " + response);
-            }
-        }
-
-        if (reply.isPositiveCompletion()) {
-            if (dataStream == null) {
-                Socket dataSocket = new Socket(passiveHost, passivePort);
-                dataSocket.setSoTimeout(READ_TIMEOUT);
-                dataStream = new SocketInputStream(dataSocket, dataSocket.getInputStream());
-            }
-        }
-        return reply;
-    }
-
-    public void setRestPosition(long position) {
-        this.restPosition = position;
-    }
-
-    public FTPReply retr(String file) throws IOException {
-
-        if (restPosition >= 0) {
-            FTPReply restReply = executeCommand("REST " + restPosition);
-            if (!restReply.isSuccess()) {
-                return restReply;
-            }
-        }
-
-        return executeCommand("RETR " + file);
-    }
-
-    public FTPReply getReply() throws IOException {
-        return new FTPReply(responseReader);
-    }
-
-    /**
-     * Return the size of the remote file
-     *
-     * @param file
-     * @return
-     * @throws IOException
-     */
-    public FTPReply size(String file) throws IOException {
-
-        return executeCommand("SIZE " + file);
-
-    }
-
-
-    public InputStream getDataStream() throws IOException {
-        return dataStream;
-    }
-
-    public void closeDataStream() throws IOException {
-        //  NOTE -- some ftp servers seem to need a pause before closing the data stream
-        // if (dataStream != null) {
-        //    try {
-        //        //
-        //        Thread.sleep(3000);
-        //    } catch (InterruptedException e) {
-        //
-        //    }
-        dataStream.close();
-        //}
-        dataStream = null;
-    }
-
-
-    /**
-     * Disconnects from the host to which we are currently connected.
-     */
-    public void disconnect() {
-        try {
-            //quit();
-            if (commandStream != null) {
-                commandStream.close();
-                responseReader.close();
-                commandSocket.close();
-
-                if (dataStream != null) {
-                    dataStream.close();
-                }
-            }
-        } catch (IOException e) {
-            throw new SAMException("Error disconnecting", e);
-        }
-
-        commandStream = null;
-        responseReader = null;
-        commandSocket = null;
-    }
-
-    class SocketInputStream extends FilterInputStream {
-
-        Socket socket;
-
-        SocketInputStream(Socket socket, InputStream inputStream) {
-            super(inputStream);
-            this.socket = socket;
-        }
-
-        @Override
-        public void close() throws IOException {
-            super.close();
-            socket.close();
-            FTPClient.this.dataStream = null;
-        }
-    }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/ftp/FTPReply.java b/src/main/java/htsjdk/samtools/util/ftp/FTPReply.java
deleted file mode 100644
index 4648d9d..0000000
--- a/src/main/java/htsjdk/samtools/util/ftp/FTPReply.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard.  All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.util.ftp;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-
-/**
- * @author jrobinso
- * @date Oct 30, 2010
- */
-public class FTPReply {
-
-    String reply;
-    int code;
-
-    public FTPReply(BufferedReader inputStream) throws IOException {
-
-        String response = null;
-        do {
-            response = inputStream.readLine();
-        } while (response != null &&
-                !(Character.isDigit(response.charAt(0)) &&
-                        Character.isDigit(response.charAt(1)) &&
-                        Character.isDigit(response.charAt(2)) &&
-                        response.charAt(3) == ' '));
-        if (response == null || response.length() < 3) {
-            code = -1;
-        } else {
-            code = Integer.parseInt(response.substring(0, 3));
-            reply = response.substring(3).trim();
-
-        }
-    }
-
-    /**
-     * Gets server reply code from the control port after an ftp command has
-     * been executed.  It knows the last line of the response because it begins
-     * with a 3 digit number and a space, (a dash instead of a space would be a
-     * continuation).
-     */
-
-    public int getCode() throws IOException {
-        return code;
-    }
-
-
-    /**
-     * Gets server reply string from the control port after an ftp command has
-     * been executed.  This consists only of the last line of the response,
-     * and only the part after the response code.
-     */
-    public String getReplyString()
-            throws IOException {
-
-        return reply;
-    }
-
-
-    public boolean isSuccess() {
-        return isPositiveCompletion() || isPositiveIntermediate();
-    }
-
-    /**
-     * Determine if a reply code is a positive completion response.  All
-     * codes beginning with a 2 are positive completion responses.
-     * The FTP server will send a positive completion response on the final
-     * successful completion of a command.
-     * <p/>
-     *
-     * @return True if a reply code is a postive completion response, false
-     *         if not.
-     *         *
-     */
-    public boolean isPositiveCompletion() {
-        return (code >= 200 && code < 300);
-    }
-
-
-    /**
-     * Determine if a reply code is a positive intermediate response.  All
-     * codes beginning with a 3 are positive intermediate responses.
-     * The FTP server will send a positive intermediate response on the
-     * successful completion of one part of a multi-part sequence of
-     * commands.  For example, after a successful USER command, a positive
-     * intermediate response will be sent to indicate that the server is
-     * ready for the PASS command.
-     * <p/>
-     *
-     * @return True if a reply code is a postive intermediate response, false
-     *         if not.
-     *         *
-     */
-    public boolean isPositiveIntermediate() {
-        return (code >= 300 && code < 400);
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ftp/FTPStream.java b/src/main/java/htsjdk/samtools/util/ftp/FTPStream.java
deleted file mode 100644
index 11a531c..0000000
--- a/src/main/java/htsjdk/samtools/util/ftp/FTPStream.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard.  All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.util.ftp;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-
-/**
- * A "non-seekable" ftp stream.  This one doesn't support random access.
- *
- * It is assumed that the ftp client has been connected, put in passive mode,
- * set to binary, and otherwise prepped for reading before creating this stream.
- *
- * @author jrobinso
- * @date Oct 31, 2010
- */
-public class FTPStream extends FilterInputStream {
-
-    FTPClient ftp;
-
-    public FTPStream(FTPClient ftp) throws IOException {
-        super(ftp.getDataStream());
-        this.ftp = ftp;
-    }
-
-
-    @Override
-    public int read(byte[] bytes, int i, int i1) throws IOException {
-        return super.read(bytes, i, i1);    //To change body of overridden methods use File | Settings | File Templates.
-    }
-
-    @Override
-    public void close() throws IOException {
-        super.close();
-        ftp.disconnect();
-    }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ftp/FTPUtils.java b/src/main/java/htsjdk/samtools/util/ftp/FTPUtils.java
deleted file mode 100644
index a9f8cde..0000000
--- a/src/main/java/htsjdk/samtools/util/ftp/FTPUtils.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard.  All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.util.ftp;
-
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.seekablestream.UserPasswordInput;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * @author jrobinso
- * @date Aug 31, 2010
- */
-public class FTPUtils {
-
-    static Map<String, String> userCredentials = new HashMap<String, String>();
-
-    static int TIMEOUT = 10000;
-
-    public static boolean resourceAvailable(URL url) {
-        InputStream is = null;
-        try {
-            URLConnection conn = url.openConnection();
-            conn.setConnectTimeout(TIMEOUT);
-            conn.setReadTimeout(TIMEOUT);
-            is = conn.getInputStream();
-            return (is.read() >= 0);
-
-        } catch (IOException e) {
-            return false;
-        }
-        finally {
-            if (is != null) {
-                try {
-                    is.close();
-                } catch (IOException e) {
-                    throw new SAMException("Error closing connection", e);
-                }
-            }
-        }
-    }
-
-    public static long getContentLength(URL url) throws IOException {
-        FTPClient ftp = null;
-        try {
-            ftp = FTPUtils.connect(url.getHost(), url.getUserInfo(), null);
-            String sizeString = ftp.executeCommand("size " + url.getPath()).getReplyString();
-            return Integer.parseInt(sizeString);
-        } catch (Exception e) {
-            return -1 ;
-        }
-        finally {
-            if(ftp != null) {
-                ftp.disconnect();
-            }
-        }
-    }
-
-
-    /**
-     * Connect to an FTP server
-     *
-     * @param host
-     * @param userInfo
-     * @param userPasswordInput Dialog with which a user can enter credentials, if login fails
-     * @return
-     * @throws IOException
-     */
-    public static synchronized FTPClient connect(String host, String userInfo, UserPasswordInput userPasswordInput) throws IOException {
-
-        FTPClient ftp = new FTPClient();
-        FTPReply reply = ftp.connect(host);
-        if (!reply.isSuccess()) {
-            throw new RuntimeIOException("Could not connect to " + host);
-        }
-
-        String user = "anonymous";
-        String password = "igv at broadinstitute.org";
-
-        if (userInfo == null) {
-            userInfo = userCredentials.get(host);
-        }
-        if (userInfo != null) {
-            String[] tmp = userInfo.split(":");
-            user = tmp[0];
-            if (tmp.length > 1) {
-                password = tmp[1];
-            }
-        }
-
-        reply = ftp.login(user, password);
-        if (!reply.isSuccess()) {
-        	if (userPasswordInput == null) {
-                throw new RuntimeIOException("Login failure for host: " + host);
-        	}
-        	else {
-	        	userPasswordInput.setHost(host);
-	            boolean success = false;
-	            while (!success) {
-	                if (userPasswordInput.showDialog()) {
-	                    user = userPasswordInput.getUser();
-	                    password = userPasswordInput.getPassword();
-	                    reply = ftp.login(user, password);
-	                    success = reply.isSuccess();
-	                } else {
-	                    // canceled
-	                    break;
-	                }
-	
-	            }
-	            if (success) {
-	                userInfo = user + ":" + password;
-	                userCredentials.put(host, userInfo);
-	            } else {
-	                throw new RuntimeIOException("Login failure for host: " + host);
-	            }
-        	}
-        }
-
-        reply = ftp.binary();
-        if (!(reply.isSuccess())) {
-            throw new RuntimeIOException("Could not set binary mode on host: " + host);
-        }
-
-        return ftp;
-
-    }
-
-}
-
diff --git a/src/main/java/htsjdk/samtools/util/zip/DeflaterFactory.java b/src/main/java/htsjdk/samtools/util/zip/DeflaterFactory.java
deleted file mode 100644
index c15e7c6..0000000
--- a/src/main/java/htsjdk/samtools/util/zip/DeflaterFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util.zip;
-
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import java.util.zip.Deflater;
-
-/**
- * Factory for {@link Deflater} objects used by {@link BlockCompressedOutputStream}.
- * This class may be extended to provide alternative deflaters (e.g., for improved performance).
- */
-public class DeflaterFactory {
-
-    public DeflaterFactory() {
-        //Note: made explicit constructor to make searching for references easier
-    }
-
-    /**
-     * Returns a deflater object that will be used when writing BAM files.
-     * Subclasses may override to provide their own deflater implementation.
-     * @param compressionLevel the compression level (0-9)
-     * @param nowrap if true then use GZIP compatible compression
-     */
-    public Deflater makeDeflater(final int compressionLevel, final boolean nowrap) {
-        return new Deflater(compressionLevel, nowrap);
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/AbstractFeatureCodec.java b/src/main/java/htsjdk/tribble/AbstractFeatureCodec.java
deleted file mode 100644
index a1e2771..0000000
--- a/src/main/java/htsjdk/tribble/AbstractFeatureCodec.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-import java.io.IOException;
-
-/**
- * Simple basic class providing much of the basic functionality of codecs
- * Every concrete subclass must implement {@link FeatureCodec#canDecode(String)} to indicate whether it can decode the file.
- * Note that that method is the only way that the right codec for a file is identified and that <bold>only one</bold> codec
- * is allowed to identify itself as being able to decode any given file.
- */
-public abstract class AbstractFeatureCodec<FEATURE_TYPE extends Feature, SOURCE> implements FeatureCodec<FEATURE_TYPE, SOURCE> {
-    private final Class<FEATURE_TYPE> myClass;
-
-    protected AbstractFeatureCodec(final Class<FEATURE_TYPE> myClass) {
-        this.myClass = myClass;
-    }
-    
-    @Override
-    public Feature decodeLoc(final SOURCE source) throws IOException {
-        return decode(source);
-    }
-
-    @Override
-    public Class<FEATURE_TYPE> getFeatureType() {
-        return myClass;
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/AbstractFeatureReader.java b/src/main/java/htsjdk/tribble/AbstractFeatureReader.java
deleted file mode 100644
index 80d9a6c..0000000
--- a/src/main/java/htsjdk/tribble/AbstractFeatureReader.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble;
-
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.tribble.util.TabixUtils;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * jrobinso
- * <p/>
- * the feature reader class, which uses indices and codecs to read in Tribble file formats.
- */
-public abstract class AbstractFeatureReader<T extends Feature, SOURCE> implements FeatureReader<T> {
-    // the logging destination for this source
-    //private final static Logger log = Logger.getLogger("BasicFeatureSource");
-
-    // the path to underlying data source
-    String path;
-
-    // the query source, codec, and header
-    // protected final QuerySource querySource;
-    protected final FeatureCodec<T, SOURCE> codec;
-    protected FeatureCodecHeader header;
-
-    private static ComponentMethods methods = new ComponentMethods();
-
-    public static final Set<String> BLOCK_COMPRESSED_EXTENSIONS = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(".gz", ".gzip", ".bgz", ".bgzf")));
-
-    /**
-     * Calls {@link #getFeatureReader(String, FeatureCodec, boolean)} with {@code requireIndex} = true
-     */
-    public static <FEATURE extends Feature, SOURCE> AbstractFeatureReader<FEATURE, SOURCE> getFeatureReader(final String featureFile, final FeatureCodec<FEATURE, SOURCE> codec) throws TribbleException {
-        return getFeatureReader(featureFile, codec, true);
-    }
-
-    /**
-     * {@link #getFeatureReader(String, String, FeatureCodec, boolean)} with {@code null} for indexResource
-     * @throws TribbleException
-     */
-    public static <FEATURE extends Feature, SOURCE> AbstractFeatureReader<FEATURE, SOURCE> getFeatureReader(final String featureResource, final FeatureCodec<FEATURE, SOURCE> codec, final boolean requireIndex) throws TribbleException {
-        return getFeatureReader(featureResource, null, codec, requireIndex);
-    }
-
-    /**
-     *
-     * @param featureResource the feature file to create from
-     * @param indexResource   the index for the feature file. If null, will auto-generate (if necessary)
-     * @param codec
-     * @param requireIndex    whether an index is required for this file
-     * @return
-     * @throws TribbleException
-     */
-    public static <FEATURE extends Feature, SOURCE> AbstractFeatureReader<FEATURE, SOURCE> getFeatureReader(final String featureResource, String indexResource, final FeatureCodec<FEATURE, SOURCE> codec, final boolean requireIndex) throws TribbleException {
-
-        try {
-            // Test for tabix index
-            if (methods.isTabix(featureResource, indexResource)) {
-                if ( ! (codec instanceof AsciiFeatureCodec) )
-                    throw new TribbleException("Tabix indexed files only work with ASCII codecs, but received non-Ascii codec " + codec.getClass().getSimpleName());
-                return new TabixFeatureReader<FEATURE, SOURCE>(featureResource, indexResource, (AsciiFeatureCodec) codec);
-            }
-            // Not tabix => tribble index file (might be gzipped, but not block gzipped)
-            else {
-                return new TribbleIndexedFeatureReader<FEATURE, SOURCE>(featureResource, indexResource, codec, requireIndex);
-            }
-        } catch (IOException e) {
-            throw new TribbleException.MalformedFeatureFile("Unable to create BasicFeatureReader using feature file ", featureResource, e);
-        } catch (TribbleException e) {
-            e.setSource(featureResource);
-            throw e;
-        }
-    }
-
-    /**
-     * Return a reader with a supplied index.
-     *
-     * @param featureResource the path to the source file containing the features
-     * @param codec used to decode the features
-     * @param index index of featureResource
-     * @return a reader for this data
-     * @throws TribbleException
-     */
-    public static <FEATURE extends Feature, SOURCE> AbstractFeatureReader<FEATURE, SOURCE> getFeatureReader(final String featureResource, final FeatureCodec<FEATURE, SOURCE>  codec, final Index index) throws TribbleException {
-        try {
-            return new TribbleIndexedFeatureReader<FEATURE, SOURCE>(featureResource, codec, index);
-        } catch (IOException e) {
-            throw new TribbleException.MalformedFeatureFile("Unable to create AbstractFeatureReader using feature file ", featureResource, e);
-        }
-
-    }
-
-    protected AbstractFeatureReader(final String path, final FeatureCodec<T, SOURCE> codec) {
-        this.path = path;
-        this.codec = codec;
-    }
-
-    /**
-     * Whether the reader has an index or not
-     * Default implementation returns false
-     * @return
-     */
-    public boolean hasIndex(){
-        return false;
-    }
-
-    public static void setComponentMethods(ComponentMethods methods){
-        AbstractFeatureReader.methods = methods;
-    }
-
-    /**
-     * Whether a filename ends in one of the BLOCK_COMPRESSED_EXTENSIONS
-     * @param fileName
-     * @return
-     */
-    public static boolean hasBlockCompressedExtension (final String fileName) {
-        for (final String extension : BLOCK_COMPRESSED_EXTENSIONS) {
-            if (fileName.toLowerCase().endsWith(extension))
-                return true;
-        }
-        return false;
-    }
-
-    /**
-     * Whether the name of a file ends in one of the BLOCK_COMPRESSED_EXTENSIONS
-     * @param file
-     * @return
-     */
-    public static boolean hasBlockCompressedExtension (final File file) {
-        return hasBlockCompressedExtension(file.getName());
-    }
-
-    /**
-     * Whether the path of a URI resource ends in one of the BLOCK_COMPRESSED_EXTENSIONS
-     * @param uri a URI representing the resource to check
-     * @return
-     */
-    public static boolean hasBlockCompressedExtension (final URI uri) {
-        return hasBlockCompressedExtension(uri.getPath());
-    }
-
-    /**
-     * get the header
-     *
-     * @return the header object we've read-in
-     */
-    public Object getHeader() {
-        return header.getHeaderValue();
-    }
-
-    static class EmptyIterator<T extends Feature> implements CloseableTribbleIterator<T> {
-        public Iterator iterator() { return this; }
-        public boolean hasNext() { return false; }
-        public T next() { return null; }
-        public void remove() { }
-        @Override public void close() { }
-    }
-
-    public static class ComponentMethods{
-
-        public boolean isTabix(String resourcePath, String indexPath) throws IOException{
-            if(indexPath == null){
-                indexPath = ParsingUtils.appendToPath(resourcePath, TabixUtils.STANDARD_INDEX_EXTENSION);
-            }
-            return hasBlockCompressedExtension(resourcePath) && ParsingUtils.resourceExists(indexPath);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/AsciiFeatureCodec.java b/src/main/java/htsjdk/tribble/AsciiFeatureCodec.java
deleted file mode 100644
index 141b764..0000000
--- a/src/main/java/htsjdk/tribble/AsciiFeatureCodec.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.tribble.readers.*;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A convenience base class for codecs that want to read in features from ASCII lines.
- * <p/>
- * This class overrides the general decode locs for streams and presents instead
- * Strings to decode(String) and readHeader(LineReader) functions.
- *
- * @param <T> The feature type this codec reads
- */
-public abstract class AsciiFeatureCodec<T extends Feature> extends AbstractFeatureCodec<T, LineIterator> {
-    protected AsciiFeatureCodec(final Class<T> myClass) {
-        super(myClass);
-    }
-    
-    @Override
-    public void close(final LineIterator lineIterator) {
-        CloserUtil.close(lineIterator);
-    }
-
-    @Override
-    public boolean isDone(final LineIterator lineIterator) {
-        return !lineIterator.hasNext();
-    }
-
-    @Override
-    public LocationAware makeIndexableSourceFromStream(final InputStream bufferedInputStream) {
-        final PositionalBufferedStream pbs;
-        if (bufferedInputStream instanceof PositionalBufferedStream) {
-            pbs = (PositionalBufferedStream) bufferedInputStream;
-        } else {
-            pbs = new PositionalBufferedStream(bufferedInputStream);
-        }
-        return new AsciiLineReaderIterator(new AsciiLineReader(pbs));
-    }
-
-    @Override
-    public LineIterator makeSourceFromStream(final InputStream bufferedInputStream) {
-        return new LineIteratorImpl(new SynchronousLineReader(bufferedInputStream));
-    }
-
-    /** 
-     * Convenience method.  Decoding in ASCII files operates line-by-line, so obviate the need to call 
-     * {@link htsjdk.tribble.readers.LineIterator#next()} in implementing classes and, instead, have them implement
-     * {@link AsciiFeatureCodec#decode(String)}.
-     */
-    @Override
-    public T decode(final LineIterator lineIterator) {
-        return decode(lineIterator.next());
-    }
-
-    /** @see AsciiFeatureCodec#decode(htsjdk.tribble.readers.LineIterator) */
-    public abstract T decode(String s);
-
-    @Override
-    public FeatureCodecHeader readHeader(final LineIterator lineIterator) throws IOException {
-        // TODO: Track header end here, rather than assuming there isn't one.
-        return new FeatureCodecHeader(readActualHeader(lineIterator), FeatureCodecHeader.NO_HEADER_END);
-    }
-
-    /**
-     * Read and return the header, or null if there is no header.
-     *
-     * @return the actual header data in the file, or null if none is available
-     */
-    abstract public Object readActualHeader(final LineIterator reader);
-}
diff --git a/src/main/java/htsjdk/tribble/BinaryFeatureCodec.java b/src/main/java/htsjdk/tribble/BinaryFeatureCodec.java
deleted file mode 100644
index dbd0afc..0000000
--- a/src/main/java/htsjdk/tribble/BinaryFeatureCodec.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.readers.PositionalBufferedStream;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Implements common methods of {@link FeatureCodec}s that read from {@link htsjdk.tribble.readers.PositionalBufferedStream}s.
- * @author mccowan
- */
-abstract public class BinaryFeatureCodec<T extends Feature> implements FeatureCodec<T, PositionalBufferedStream> {
-    @Override
-    public PositionalBufferedStream makeSourceFromStream(final InputStream bufferedInputStream) {
-        if (bufferedInputStream instanceof PositionalBufferedStream)
-            return (PositionalBufferedStream) bufferedInputStream;
-        else
-            return new PositionalBufferedStream(bufferedInputStream);
-    }
-
-    /** {@link PositionalBufferedStream} is already {@link LocationAware}. */
-    @Override
-    public LocationAware makeIndexableSourceFromStream(final InputStream bufferedInputStream) {
-        return makeSourceFromStream(bufferedInputStream);
-    }
-
-    @Override
-    public void close(final PositionalBufferedStream source) {
-        CloserUtil.close(source);
-    }
-
-    @Override
-    public boolean isDone(final PositionalBufferedStream source) {
-        try {
-            return source.isDone();
-        } catch (final IOException e) {
-            throw new RuntimeIOException("Failure reading from stream.", e);
-        }
-    }
-
-    /**
-     * Marked as final because binary features could not be tabix indexed
-     */
-    @Override
-    public final TabixFormat getTabixFormat() {
-        throw new TribbleException("Binary codecs does not support tabix");
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/CloseableTribbleIterator.java b/src/main/java/htsjdk/tribble/CloseableTribbleIterator.java
deleted file mode 100644
index 71c2cf6..0000000
--- a/src/main/java/htsjdk/tribble/CloseableTribbleIterator.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2009-2010 by The Broad Institute, Inc.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-/**
- * The basic iterator we use in Tribble, which allows closing and basic iteration.
- * @param <T> the feature type
- */
-public interface CloseableTribbleIterator<T extends Feature> extends CloseableIterator<T>, Iterable<T> {}
diff --git a/src/main/java/htsjdk/tribble/Feature.java b/src/main/java/htsjdk/tribble/Feature.java
deleted file mode 100644
index 941790f..0000000
--- a/src/main/java/htsjdk/tribble/Feature.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-
-import htsjdk.samtools.util.Locatable;
-
-/**
- * Represents a locus on a reference sequence.   All Features are expected to return 1-based closed-ended intervals.
- */
-public interface Feature extends Locatable {
-
-    /**
-     * Return the features reference sequence name, e.g chromosome or contig
-     * @deprecated use getContig() instead
-     */
-    @Deprecated
-    default public String getChr() {
-        return getContig();
-    }
-
-}
diff --git a/src/main/java/htsjdk/tribble/FeatureCodec.java b/src/main/java/htsjdk/tribble/FeatureCodec.java
deleted file mode 100644
index f14191a..0000000
--- a/src/main/java/htsjdk/tribble/FeatureCodec.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.tribble.index.tabix.TabixFormat;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * The base interface for classes that read in features.
- * <p/>
- * FeatureCodecs have to implement two key methods:
- * <p/>
- * {@link #readHeader(SOURCE)} - Reads the header, provided a {@link SOURCE} pointing at the beginning of the source input.
- * {@link #decode(SOURCE)} - Reads a {@link Feature} record, provided a {@link SOURCE} pointing at the beginning of a record within the 
- * source input.
- * <p/>
- * Note that it's not safe to carry state about the {@link SOURCE} within the codec.  There's no guarantee about its  state between calls.
- *
- * @param <FEATURE_TYPE> The type of {@link Feature} this codec generates
- * @param <SOURCE> The type of the data source this codec reads from
- */
-public interface FeatureCodec<FEATURE_TYPE extends Feature, SOURCE> {
-    /**
-     * Decode a line to obtain just its FeatureLoc for indexing -- contig, start, and stop.
-     *
-     * @param source the input stream from which to decode the next record
-     * @return Return the FeatureLoc encoded by the line, or null if the line does not represent a feature (e.g. is
-     *         a comment)
-     */
-    public Feature decodeLoc(final SOURCE source) throws IOException;
-
-    /**
-     * Decode a single {@link Feature} from the {@link SOURCE}, reading no further in the underlying source than beyond that feature.
-     *
-     * @param source the input stream from which to decode the next record
-     * @return Return the Feature encoded by the line,  or null if the line does not represent a feature (e.g. is
-     *         a comment)
-     */
-    public FEATURE_TYPE decode(final SOURCE source) throws IOException;
-
-    /**
-     * Read and return the header, or null if there is no header.
-     * 
-     * Note: Implementers of this method must be careful to read exactly as much from {@link SOURCE} as needed to parse the header, and no 
-     * more. Otherwise, data that might otherwise be fed into parsing a {@link Feature} may be lost.
-     *
-     * @param source the source from which to decode the header
-     * @return header object
-     */
-    public FeatureCodecHeader readHeader(final SOURCE source) throws IOException;
-
-    /**
-     * <p>
-     * This function returns the object the codec generates.  This is allowed to be Feature in the case where
-     * conditionally different types are generated.  Be as specific as you can though.
-     * </p>
-     * <p>
-     * This function is used by reflections based tools, so we can know the underlying type
-     * </p>
-     * 
-     * @return the feature type this codec generates.
-     */
-    public Class<FEATURE_TYPE> getFeatureType();
-
-    /**
-     * Generates a reader of type {@link SOURCE} appropriate for use by this codec from the generic input stream.  Implementers should
-     * assume the stream is buffered.
-     */
-    public SOURCE makeSourceFromStream(final InputStream bufferedInputStream);
-
-    /**
-     * Generates a {@link LocationAware} reader of type {@link SOURCE}.  Like {@link #makeSourceFromStream(java.io.InputStream)}, except
-     * the {@link LocationAware} compatibility is required for creating indexes.
-     * 
-     * Implementers of this method must return a type that is both {@link LocationAware} as well as {@link SOURCE}.  Note that this 
-     * requirement cannot be enforced via the method signature due to limitations in Java's generic typing system.  Instead, consumers
-     * should cast the call result into a {@link SOURCE} when applicable.
-     */
-    public LocationAware makeIndexableSourceFromStream(final InputStream bufferedInputStream);
-
-    /** Adapter method that assesses whether the provided {@link SOURCE} has more data. True if it does, false otherwise. */
-    public boolean isDone(final SOURCE source);
-
-    /** Adapter method that closes the provided {@link SOURCE}. */
-    public void close(final SOURCE source);
-
-    /**
-     * <p>
-     * This function returns true iff the File potentialInput can be parsed by this
-     * codec. Note that checking the file's extension is a perfectly acceptable implementation of this method
-     * and file contents only rarely need to be checked.
-     * </p>
-     * <p>
-     * There is an assumption that there's never a situation where two different Codecs
-     * return true for the same file.  If this occurs, the recommendation would be to error out.
-     * </p>
-     * Note this function must never throw an error.  All errors should be trapped
-     * and false returned.
-     *
-     * @param path the file to test for parsability with this codec
-     * @return true if potentialInput can be parsed, false otherwise
-     */
-    public boolean canDecode(final String path);
-
-    /**
-     * Define the tabix format for the feature, used for indexing. Default implementation throws an exception.
-     *
-     * Note that only {@link AsciiFeatureCodec} could read tabix files as defined in
-     * {@link AbstractFeatureReader#getFeatureReader(String, String, FeatureCodec, boolean)}
-     *
-     * @return the format to use with tabix
-     * @throws TribbleException if the format is not defined
-     */
-    default public TabixFormat getTabixFormat() {
-        throw new TribbleException(this.getClass().getSimpleName() + "does not have defined tabix format");
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/FeatureCodecHeader.java b/src/main/java/htsjdk/tribble/FeatureCodecHeader.java
deleted file mode 100644
index 042f1d0..0000000
--- a/src/main/java/htsjdk/tribble/FeatureCodecHeader.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-/**
- * A class to represent a header of a feature containing file.  Specific to a codec.  All
- * codecs must return a non-null value now for their header, but the header can be the
- * empty header object or the end case be set to NO_HEADER_END.
- *
- * Note that if the headerEnd value is > 0 the readers will skip the header for the codec upfront,
- * so that decode() doesn't have to deal with potentially seeing header records in the inputstream.
- *
- * @author Mark DePristo
- * @since 5/2/12
- */
-public class FeatureCodecHeader {
-    /** The value of the headerEnd field when there's no header */
-    public final static long NO_HEADER_END = 0;
-
-    /** An public instance representing no header */
-    public final static FeatureCodecHeader EMPTY_HEADER = new FeatureCodecHeader(null, NO_HEADER_END);
-
-    private final Object headerValue;
-    private final long headerEnd;
-
-    /**
-     * Create a FeatureCodecHeader indicating the contents of the header (can be null)
-     * and the byte position in the file where the header ends (not inclusive).  headerEnd
-     * should be NO_HEADER_END when no header is present.
-     *
-     * @param headerValue the header data read by the codec
-     * @param headerEnd the position (not inclusive) of the end of the header.  1 would
-     *                  mean just the first byte of the file is the header.  Zero indicates
-     *                  there's no header at all
-     */
-    public FeatureCodecHeader(final Object headerValue, final long headerEnd) {
-        if ( headerEnd < 0 ) throw new TribbleException("Header end < 0");
-        this.headerValue = headerValue;
-        this.headerEnd = headerEnd;
-    }
-
-    /**
-     * @return the header value provided by the codec for this file
-     */
-    public Object getHeaderValue() {
-        return headerValue;
-    }
-
-    /**
-     * @return to position, not inclusive, where the header ends.  Must be >= 0
-     */
-    public long getHeaderEnd() {
-        return headerEnd;
-    }
-
-    /**
-     * @return true if we should skip some bytes to skip this header
-     */
-    public boolean skipHeaderBytes() {
-        return getHeaderEnd() != NO_HEADER_END;
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/FeatureReader.java b/src/main/java/htsjdk/tribble/FeatureReader.java
deleted file mode 100644
index 3471393..0000000
--- a/src/main/java/htsjdk/tribble/FeatureReader.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * the basic interface that feature sources need to match
- * @param <T> a feature type
- */
-public interface FeatureReader<T extends Feature> extends Closeable {
-    
-    public CloseableTribbleIterator<T> query(final String chr, final int start, final int end) throws IOException;
-
-    public CloseableTribbleIterator<T> iterator() throws IOException;
-
-    public void close() throws IOException;
-
-    public List<String> getSequenceNames();
-
-    public Object getHeader();
-
-}
diff --git a/src/main/java/htsjdk/tribble/NameAwareCodec.java b/src/main/java/htsjdk/tribble/NameAwareCodec.java
deleted file mode 100755
index ce90f5c..0000000
--- a/src/main/java/htsjdk/tribble/NameAwareCodec.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2010, The Broad Institute
- *
- * 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 AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble;
-
-/**
- * Created by IntelliJ IDEA.
- * User: depristo
- * Date: Jun 29, 2010
- * Time: 3:48:47 PM
- * To change this template use File | Settings | File Templates.
- */
-public interface NameAwareCodec {
-    public String getName();
-    public void setName(String name);
-}
diff --git a/src/main/java/htsjdk/tribble/SimpleFeature.java b/src/main/java/htsjdk/tribble/SimpleFeature.java
deleted file mode 100644
index ddc62fa..0000000
--- a/src/main/java/htsjdk/tribble/SimpleFeature.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package htsjdk.tribble;
-
-/*
- * Copyright (c) 2012, The Broad Institute
- *
- * 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 AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/**
- * A simple concrete Feature.
- */
-public class SimpleFeature implements Feature {
-
-    private final String contig;
-    private final int start;
-    private final int end;
-
-    public SimpleFeature(final String contig, final int start, final int end) {
-        this.contig = contig;
-        this.start = start;
-        this.end = end;
-    }
-
-    public String getContig() {
-        return contig;
-    }
-
-    public int getStart() {
-        return start;
-    }
-
-    public int getEnd() {
-        return end;
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/TabixFeatureReader.java b/src/main/java/htsjdk/tribble/TabixFeatureReader.java
deleted file mode 100644
index 5d90295..0000000
--- a/src/main/java/htsjdk/tribble/TabixFeatureReader.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.readers.*;
-import htsjdk.tribble.util.ParsingUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * @author Jim Robinson
- * @since 2/11/12
- */
-public class TabixFeatureReader<T extends Feature, SOURCE> extends AbstractFeatureReader<T, SOURCE> {
-
-    TabixReader tabixReader;
-    List<String> sequenceNames;
-
-    /**
-     *
-     * @param featureFile - path to a feature file. Can be a local file, http url, or ftp url
-     * @param codec
-     * @throws IOException
-     */
-    public TabixFeatureReader(final String featureFile, final AsciiFeatureCodec codec) throws IOException {
-        super(featureFile, codec);
-        tabixReader = new TabixReader(featureFile);
-        sequenceNames = new ArrayList<String>(tabixReader.getChromosomes());
-        readHeader();
-    }
-
-    /**
-     *
-     * @param featureFile - path to a feature file. Can be a local file, http url, or ftp url
-     * @param indexFile - path to the index file.
-     * @param codec
-     * @throws IOException
-     */
-    public TabixFeatureReader(final String featureFile, final String indexFile, final AsciiFeatureCodec codec) throws IOException {
-        super(featureFile, codec);
-        tabixReader = new TabixReader(featureFile, indexFile);
-        sequenceNames = new ArrayList<String>(tabixReader.getChromosomes());
-        readHeader();
-    }
-
-
-    /**
-     * read the header
-     *
-     * @return a Object, representing the file header, if available
-     * @throws IOException throws an IOException if we can't open the file
-     */
-    private void readHeader() throws IOException {
-        SOURCE source = null;
-        try {
-            source = codec.makeSourceFromStream(new PositionalBufferedStream(new BlockCompressedInputStream(ParsingUtils.openInputStream(path))));
-            header = codec.readHeader(source);
-        } catch (Exception e) {
-            throw new TribbleException.MalformedFeatureFile("Unable to parse header with error: " + e.getMessage(), path, e);
-        } finally {
-            if (source != null) {
-                codec.close(source);
-            }
-        }
-    }
-
-    @Override
-    public boolean hasIndex(){
-        return true;
-    }
-
-
-    public List<String> getSequenceNames() {
-        return sequenceNames;
-    }
-
-    /**
-     * Return iterator over all features overlapping the given interval
-     *
-     * @param chr
-     * @param start
-     * @param end
-     * @return
-     * @throws IOException
-     */
-    public CloseableTribbleIterator<T> query(final String chr, final int start, final int end) throws IOException {
-        final List<String> mp = getSequenceNames();
-        if (mp == null) throw new TribbleException.TabixReaderFailure("Unable to find sequence named " + chr +
-                " in the tabix index. ", path);
-        if (!mp.contains(chr)) {
-            return new EmptyIterator<T>();
-        }
-        final TabixIteratorLineReader lineReader = new TabixIteratorLineReader(tabixReader.query(tabixReader.chr2tid(chr), start - 1, end));
-        return new FeatureIterator<T>(lineReader, start - 1, end);
-    }
-
-    public CloseableTribbleIterator<T> iterator() throws IOException {
-        final InputStream is = new BlockCompressedInputStream(ParsingUtils.openInputStream(path));
-        final PositionalBufferedStream stream = new PositionalBufferedStream(is);
-        final LineReader reader = new SynchronousLineReader(stream);
-        return new FeatureIterator<T>(reader, 0, Integer.MAX_VALUE);
-    }
-
-    public void close() throws IOException {
-        tabixReader.close();
-    }
-
-
-    class FeatureIterator<T extends Feature> implements CloseableTribbleIterator<T> {
-        private T currentRecord;
-        private LineReader lineReader;
-        private int start;
-        private int end;
-
-        public FeatureIterator(final LineReader lineReader, final int start, final int end) throws IOException {
-            this.lineReader = lineReader;
-            this.start = start;
-            this.end = end;
-            readNextRecord();
-        }
-
-
-        /**
-         * Advance to the next record in the query interval.
-         *
-         * @throws IOException
-         */
-        protected void readNextRecord() throws IOException {
-            currentRecord = null;
-            String nextLine;
-            while (currentRecord == null && (nextLine = lineReader.readLine()) != null) {
-                final Feature f;
-                try {
-                    f = ((AsciiFeatureCodec)codec).decode(nextLine);
-                    if (f == null) {
-                        continue;   // Skip
-                    }
-                    if (f.getStart() > end) {
-                        return;    // Done
-                    }
-                    if (f.getEnd() <= start) {
-                        continue;   // Skip
-                    }
-
-                    currentRecord = (T) f;
-
-                } catch (TribbleException e) {
-                    e.setSource(path);
-                    throw e;
-                } catch (NumberFormatException e) {
-                    String error = "Error parsing line: " + nextLine;
-                    throw new TribbleException.MalformedFeatureFile(error, path, e);
-                }
-
-
-            }
-        }
-
-
-        public boolean hasNext() {
-            return currentRecord != null;
-        }
-
-        public T next() {
-            T ret = currentRecord;
-            try {
-                readNextRecord();
-            } catch (IOException e) {
-                throw new RuntimeIOException("Unable to read the next record, the last record was at " +
-                        ret.getContig() + ":" + ret.getStart() + "-" + ret.getEnd(), e);
-            }
-            return ret;
-
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException("Remove is not supported in Iterators");
-        }
-
-        public void close() {
-            lineReader.close();
-        }
-
-        public Iterator<T> iterator() {
-            return this;
-        }
-    }
-
-
-}
diff --git a/src/main/java/htsjdk/tribble/Tribble.java b/src/main/java/htsjdk/tribble/Tribble.java
deleted file mode 100644
index 468f55d..0000000
--- a/src/main/java/htsjdk/tribble/Tribble.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.tribble.util.TabixUtils;
-
-import java.io.File;
-
-/**
- * Common, tribble wide constants and static functions
- */
-public class Tribble {
-    private Tribble() { } // can't be instantiated
-
-    public final static String STANDARD_INDEX_EXTENSION = ".idx";
-
-    /**
-     * Return the name of the index file for the provided vcf {@code filename}
-     * Does not actually create an index
-     * @param filename  name of the vcf file
-     * @return non-null String representing the index filename
-     */
-    public static String indexFile(final String filename) {
-        return indexFile(filename, STANDARD_INDEX_EXTENSION);
-    }
-
-    /**
-     * Return the File of the index file for the provided vcf {@code file}
-     * Does not actually create an index
-     * @param file  the vcf file
-     * @return a non-null File representing the index
-     */
-    public static File indexFile(final File file) {
-        return indexFile(file.getAbsoluteFile(), STANDARD_INDEX_EXTENSION);
-    }
-
-    /**
-     * Return the name of the tabix index file for the provided vcf {@code filename}
-     * Does not actually create an index
-     * @param filename  name of the vcf file
-     * @return non-null String representing the index filename
-     */
-    public static String tabixIndexFile(final String filename) {
-        return indexFile(filename, TabixUtils.STANDARD_INDEX_EXTENSION);
-    }
-
-    /**
-     * Return the File of the tabix index file for the provided vcf {@code file}
-     * Does not actually create an index
-     * @param file  the vcf file
-     * @return a non-null File representing the index
-     */
-    public static File tabixIndexFile(final File file) {
-        return indexFile(file.getAbsoluteFile(), TabixUtils.STANDARD_INDEX_EXTENSION);
-    }
-
-    /**
-     * Return the name of the index file for the provided vcf {@code filename} and {@code extension}
-     * Does not actually create an index
-     * @param filename  name of the vcf file
-     * @param extension the extension to use for the index
-     * @return non-null String representing the index filename
-     */
-    private static String indexFile(final String filename, final String extension) {
-        return ParsingUtils.appendToPath(filename, extension);
-    }
-
-    /**
-     * Return the File of the index file for the provided vcf {@code file} and {@code extension}
-     * Does not actually create an index
-     * @param file  the vcf file
-     * @param extension the extension to use for the index
-     * @return a non-null File representing the index
-     */
-    private static File indexFile(final File file, final String extension) {
-        return new File(file.getAbsoluteFile() + extension);
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/TribbleException.java b/src/main/java/htsjdk/tribble/TribbleException.java
deleted file mode 100644
index 86202eb..0000000
--- a/src/main/java/htsjdk/tribble/TribbleException.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-
-/**
- * @author Aaron
- *
- * The base Tribble exception; this allows external libraries to catch any exception Tribble generates
- * 
- */
-public class TribbleException extends RuntimeException {
-    // what file or input source we are working from
-    String source;
-
-    public TribbleException(String msg) {
-        super(msg);
-    }
-
-    public TribbleException(String message, Throwable throwable) {
-        super(message, throwable);
-    }
-
-    /**
-     * set the source for the file; where we got lines from
-     * @param source the source location, usually a file though it could be a http link or other source
-     */
-    public void setSource(String source) {
-        this.source = source;
-    }
-
-    /**
-     * override the default message with ours, which attaches the source file in question
-     * @return a string with our internal error, along with the causitive source file (or other input source)
-     */
-    public String getMessage() {
-        String ret = super.getMessage();
-        if ( source != null )
-            ret = ret + ", for input source: " + source;
-        return ret;
-    }
-
-    // //////////////////////////////////////////////////////////////////////
-    // other more specific exceptions generated in Tribble
-    // //////////////////////////////////////////////////////////////////////
-
-
-    // //////////////////////////////////////////////////////////////////////
-    // Codec exception
-    // //////////////////////////////////////////////////////////////////////
-    // if the line to decode is incorrect
-    public static class InvalidDecodeLine extends TribbleException {
-        public InvalidDecodeLine(String message, String line) { super (message + ", line = " + line); }
-
-        public InvalidDecodeLine(String message, int lineNo) { super (message + ", at line number " + lineNo); }
-    }
-
-    public static class InvalidHeader extends TribbleException {
-        public InvalidHeader(String message) { super ("Your input file has a malformed header: " + message); }
-    }
-
-    // capture other internal codec exceptions
-    public static class InternalCodecException extends TribbleException {
-        public InternalCodecException(String message) { super (message); }
-    }
-
-    // //////////////////////////////////////////////////////////////////////
-    // Index exceptions
-    // //////////////////////////////////////////////////////////////////////
-    public static class UnableToCreateCorrectIndexType extends TribbleException {
-        public UnableToCreateCorrectIndexType(String message, Exception e) {
-            super(message,e);
-        }
-        public UnableToCreateCorrectIndexType(String message) {
-            super(message);
-        }
-    }
-
-    // //////////////////////////////////////////////////////////////////////
-    // Source exceptions
-    // //////////////////////////////////////////////////////////////////////
-    public static class FeatureFileDoesntExist extends TribbleException {
-        public FeatureFileDoesntExist(String message, String file) {
-            super(message);
-            setSource(file);
-        }
-    }
-
-    public static class MalformedFeatureFile extends TribbleException {
-        public MalformedFeatureFile(String message, String f, Exception e) {
-            super(message,e);
-            setSource(f);
-        }
-        public MalformedFeatureFile(String message, String f) {
-            super(message);
-            setSource(f);
-        }
-    }
-
-    public static class UnableToReadIndexFile extends TribbleException {
-        public UnableToReadIndexFile(String message, String f, Exception e) {
-            super(message,e);
-            setSource(f);
-        }
-    }
-
-    public static class TabixReaderFailure extends TribbleException {
-        public TabixReaderFailure(String message, String f, Exception e) {
-            super(message,e);
-            setSource(f);
-        }
-
-        public TabixReaderFailure(String message, String f) {
-            super(message);
-            setSource(f);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/TribbleIndexedFeatureReader.java b/src/main/java/htsjdk/tribble/TribbleIndexedFeatureReader.java
deleted file mode 100644
index 514782d..0000000
--- a/src/main/java/htsjdk/tribble/TribbleIndexedFeatureReader.java
+++ /dev/null
@@ -1,573 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.readers.PositionalBufferedStream;
-import htsjdk.tribble.util.ParsingUtils;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.zip.GZIPInputStream;
-
-/**
- * A reader for text feature files  (i.e. not tabix files).   This includes tribble-indexed and non-indexed files.  If
- * index both iterate() and query() methods are supported.
- * <p/>
- * Note: Non-indexed files can be gzipped, but not bgzipped.
- *
- * @author Jim Robinson
- * @since 2/11/12
- */
-public class TribbleIndexedFeatureReader<T extends Feature, SOURCE> extends AbstractFeatureReader<T, SOURCE> {
-
-    private Index index;
-
-    /**
-     * is the path pointing to our source data a regular file?
-     */
-    private final boolean pathIsRegularFile;
-
-    /**
-     * a potentially reusable seekable stream for queries over regular files
-     */
-    private SeekableStream seekableStream = null;
-
-    /**
-     * We lazy-load the index but it might not even exist
-     * Don't want to keep checking if that's the case
-     */
-    private boolean needCheckForIndex = true;
-
-    /**
-     * @param featurePath  - path to the feature file, can be a local file path, http url, or ftp url
-     * @param codec        - codec to decode the features
-     * @param requireIndex - true if the reader will be queries for specific ranges.  An index (idx) file must exist
-     * @throws IOException
-     */
-    public TribbleIndexedFeatureReader(final String featurePath, final FeatureCodec<T, SOURCE> codec, final boolean requireIndex) throws IOException {
-
-        super(featurePath, codec);
-
-        if (requireIndex) {
-            this.loadIndex();
-            if(!this.hasIndex()){
-                throw new TribbleException("An index is required, but none found.");
-            }
-        }
-
-        // does path point to a regular file?
-        this.pathIsRegularFile = SeekableStreamFactory.isFilePath(path);
-
-        readHeader();
-    }
-
-    /**
-     * @param featureFile  - path to the feature file, can be a local file path, http url, or ftp url
-     * @param indexFile    - path to the index file
-     * @param codec        - codec to decode the features
-     * @param requireIndex - true if the reader will be queries for specific ranges.  An index (idx) file must exist
-     * @throws IOException
-     */
-    public TribbleIndexedFeatureReader(final String featureFile, final String indexFile, final FeatureCodec<T, SOURCE> codec, final boolean requireIndex) throws IOException {
-        this(featureFile, codec, false); // required to read the header
-        if (indexFile != null && ParsingUtils.resourceExists(indexFile)) {
-            index = IndexFactory.loadIndex(indexFile);
-            this.needCheckForIndex = false;
-        } else {
-            if (requireIndex) {
-                this.loadIndex();
-                if(!this.hasIndex()){
-                    throw new TribbleException("An index is required, but none found.");
-                }
-            }
-        }
-    }
-
-    /**
-     * @param featureFile - path to the feature file, can be a local file path, http url, or ftp url
-     * @param codec       - codec to decode the features
-     * @param index       - a tribble Index object
-     * @throws IOException
-     */
-    public TribbleIndexedFeatureReader(final String featureFile, final FeatureCodec<T, SOURCE> codec, final Index index) throws IOException {
-        this(featureFile, codec, false); // required to read the header
-        this.index = index;
-        this.needCheckForIndex = false;
-    }
-
-    /**
-     * Attempt to load the index for the specified {@link #path}.
-     * If the {@link #path} has no available index file,
-     * does nothing
-     * @throws IOException
-     */
-    private void loadIndex() throws IOException{
-        String indexFile = Tribble.indexFile(this.path);
-        if (ParsingUtils.resourceExists(indexFile)) {
-            index = IndexFactory.loadIndex(indexFile);
-        } else {
-            // See if the index itself is gzipped
-            indexFile = ParsingUtils.appendToPath(indexFile, ".gz");
-            if (ParsingUtils.resourceExists(indexFile)) {
-                index = IndexFactory.loadIndex(indexFile);
-            }
-        }
-        this.needCheckForIndex = false;
-    }
-
-    /**
-     * Get a seekable stream appropriate to read information from the current feature path
-     * <p/>
-     * This function ensures that if reuseStreamInQuery returns true then this function will only
-     * ever return a single unique instance of SeekableStream for all calls given this instance of
-     * TribbleIndexedFeatureReader.  If reuseStreamInQuery() returns false then the returned SeekableStream
-     * will be newly opened each time, and should be closed after each use.
-     *
-     * @return a SeekableStream
-     */
-    private SeekableStream getSeekableStream() throws IOException {
-        final SeekableStream result;
-        if (reuseStreamInQuery()) {
-            // if the stream points to an underlying file, only create the underlying seekable stream once
-            if (seekableStream == null) seekableStream = SeekableStreamFactory.getInstance().getStreamFor(path);
-            result = seekableStream;
-        } else {
-            // we are not reusing the stream, so make a fresh copy each time we request it
-            result = SeekableStreamFactory.getInstance().getStreamFor(path);
-        }
-
-        return result;
-    }
-
-    /**
-     * Are we attempting to reuse the underlying stream in query() calls?
-     *
-     * @return true if
-     */
-    private boolean reuseStreamInQuery() {
-        return pathIsRegularFile;
-    }
-
-    public void close() throws IOException {
-        // close the seekable stream if that's necessary
-        if (seekableStream != null) seekableStream.close();
-    }
-
-    /**
-     * Return the sequence (chromosome/contig) names in this file, if known.
-     *
-     * @return list of strings of the contig names
-     */
-    public List<String> getSequenceNames() {
-        return !this.hasIndex() ? new ArrayList<String>() : new ArrayList<String>(index.getSequenceNames());
-    }
-
-    @Override
-    public boolean hasIndex() {
-        if(index == null && this.needCheckForIndex){
-            try {
-                this.loadIndex();
-            } catch (IOException e) {
-                throw new TribbleException("Error loading index file: " + e.getMessage(), e);
-            }
-        }
-        return index != null;
-    }
-
-    /**
-     * read the header from the file
-     *
-     * @throws IOException throws an IOException if we can't open the file
-     */
-    private void readHeader() throws IOException {
-        InputStream is = null;
-        PositionalBufferedStream pbs = null;
-        try {
-            is = ParsingUtils.openInputStream(path);
-            if (hasBlockCompressedExtension(new URI(URLEncoder.encode(path, "UTF-8")))) {
-                // TODO -- warning I don't think this can work, the buffered input stream screws up position
-                is = new GZIPInputStream(new BufferedInputStream(is));
-            }
-            pbs = new PositionalBufferedStream(is);
-            final SOURCE source = codec.makeSourceFromStream(pbs);
-            header = codec.readHeader(source);
-        } catch (Exception e) {
-            throw new TribbleException.MalformedFeatureFile("Unable to parse header with error: " + e.getMessage(), path, e);
-        } finally {
-            if (pbs != null) pbs.close();
-            else if (is != null) is.close();
-        }
-    }
-
-    /**
-     * Return an iterator to iterate over features overlapping the specified interval
-     * <p/>
-     * Note that TribbleIndexedFeatureReader only supports issuing and manipulating a single query
-     * for each reader.  That is, the behavior of the following code is undefined:
-     * <p/>
-     * reader = new TribbleIndexedFeatureReader()
-     * Iterator it1 = reader.query("x", 10, 20)
-     * Iterator it2 = reader.query("x", 1000, 1010)
-     * <p/>
-     * As a consequence of this, the TribbleIndexedFeatureReader are also not thread-safe.
-     *
-     * @param chr   contig
-     * @param start start position
-     * @param end   end position
-     * @return an iterator of records in this interval
-     * @throws IOException
-     */
-    public CloseableTribbleIterator<T> query(final String chr, final int start, final int end) throws IOException {
-
-        if (!this.hasIndex()) {
-            throw new TribbleException("Index not found for: " + path);
-        }
-
-        if (index.containsChromosome(chr)) {
-            final List<Block> blocks = index.getBlocks(chr, start - 1, end);
-            return new QueryIterator(chr, start, end, blocks);
-        } else {
-            return new EmptyIterator<T>();
-        }
-    }
-
-
-    /**
-     * @return Return an iterator to iterate over the entire file
-     * @throws IOException
-     */
-    public CloseableTribbleIterator<T> iterator() throws IOException {
-        return new WFIterator();
-    }
-
-    /**
-     * @deprecated use {@link #hasBlockCompressedExtension(String)} instead
-     */
-    //Visible for testing
-    @Deprecated
-    static boolean isGZIPPath(final String path) {
-        if (path.toLowerCase().endsWith(".gz")) {
-            return true;
-        }
-        else {
-            String uriPath = null;
-            try {
-                URI uri = new URI(path);
-                if (uri != null) {
-                    uriPath = uri.getPath();
-                    return uriPath != null && uriPath.toLowerCase().endsWith(".gz");
-                }
-                return false;
-            }
-            catch (URISyntaxException e) {
-                return false;
-            }
-        }
-    }
-
-    /**
-     * Class to iterator over an entire file.
-     */
-    class WFIterator implements CloseableTribbleIterator<T> {
-        private T currentRecord;
-        private SOURCE source;
-
-        /**
-         * Constructor for iterating over the entire file (seekableStream).
-         *
-         * @throws IOException
-         */
-        public WFIterator() throws IOException {
-            final InputStream inputStream = ParsingUtils.openInputStream(path);
-
-            final PositionalBufferedStream pbs;
-            if (hasBlockCompressedExtension(path)) {
-                // Gzipped -- we need to buffer the GZIPInputStream methods as this class makes read() calls,
-                // and seekableStream does not support single byte reads
-                final InputStream is = new GZIPInputStream(new BufferedInputStream(inputStream, 512000));
-                pbs = new PositionalBufferedStream(is, 1000);  // Small buffer as this is buffered already.
-            } else {
-                pbs = new PositionalBufferedStream(inputStream, 512000);
-            }
-            /**
-             * The header was already read from the original source in the constructor; don't read it again, since some codecs keep state
-             * about its initializagtion.  Instead, skip that part of the stream.
-             */
-            pbs.skip(header.getHeaderEnd());
-            source = codec.makeSourceFromStream(pbs);
-            readNextRecord();
-        }
-
-        @Override
-        public boolean hasNext() {
-            return currentRecord != null;
-        }
-
-        @Override
-        public T next() {
-            final T ret = currentRecord;
-            try {
-                readNextRecord();
-            } catch (IOException e) {
-                throw new RuntimeIOException("Unable to read the next record, the last record was at " +
-                        ret.getContig() + ":" + ret.getStart() + "-" + ret.getEnd(), e);
-            }
-            return ret;
-        }
-
-        /**
-         * Advance to the next record in the query interval.
-         *
-         * @throws IOException
-         */
-        private void readNextRecord() throws IOException {
-            currentRecord = null;
-
-            while (!codec.isDone(source)) {
-                final T f;
-                try {
-                    f = codec.decode(source);
-
-                    if (f == null) {
-                        continue;
-                    }
-
-                    currentRecord = f;
-                    return;
-
-                } catch (TribbleException e) {
-                    e.setSource(path);
-                    throw e;
-                } catch (NumberFormatException e) {
-                    final String error = "Error parsing line at byte position: " + source;
-                    throw new TribbleException.MalformedFeatureFile(error, path, e);
-                }
-            }
-        }
-
-        @Override
-        public void remove() {
-            throw new UnsupportedOperationException("Remove is not supported in Iterators");
-        }
-
-        @Override
-        public void close() {
-            codec.close(source);
-        }
-
-        @Override
-        public WFIterator iterator() {
-            return this;
-        }
-    }
-
-    /**
-     * Iterator for a query interval
-     */
-    class QueryIterator implements CloseableTribbleIterator<T> {
-        private String chrAlias;
-        int start;
-        int end;
-        private T currentRecord;
-        private SOURCE source;
-        private SeekableStream mySeekableStream;
-        private Iterator<Block> blockIterator;
-
-
-        public QueryIterator(final String chr, final int start, final int end, final List<Block> blocks) throws IOException {
-            this.start = start;
-            this.end = end;
-            mySeekableStream = getSeekableStream();
-            blockIterator = blocks.iterator();
-            advanceBlock();
-            readNextRecord();
-
-            // The feature chromosome might not be the query chromosome, due to alias definitions.  We assume
-            // the chromosome of the first record is correct and record it here.  This is not pretty.
-            chrAlias = (currentRecord == null ? chr : currentRecord.getContig());
-
-        }
-
-
-        public boolean hasNext() {
-            return currentRecord != null;
-        }
-
-        public T next() {
-            final T ret = currentRecord;
-            try {
-                readNextRecord();
-            } catch (IOException e) {
-                throw new RuntimeIOException("Unable to read the next record, the last record was at " +
-                        ret.getContig() + ":" + ret.getStart() + "-" + ret.getEnd(), e);
-            }
-            return ret;
-        }
-
-
-        private void advanceBlock() throws IOException {
-            while (blockIterator != null && blockIterator.hasNext()) {
-                final Block block = blockIterator.next();
-                if (block.getSize() > 0) {
-                    final int bufferSize = Math.min(2000000, block.getSize() > 100000000 ? 10000000 : (int) block.getSize());
-                    source = codec.makeSourceFromStream(new PositionalBufferedStream(new BlockStreamWrapper(mySeekableStream, block), bufferSize));
-                    // note we don't have to skip the header here as the block should never start in the header
-                    return;
-                }
-            }
-
-            // If we get here the blocks are exhausted, set reader to null
-            if (source != null) {
-                codec.close(source);
-                source = null;
-            }
-        }
-
-        /**
-         * Advance to the next record in the query interval.
-         *
-         * @throws IOException
-         */
-        private void readNextRecord() throws IOException {
-
-            if (source == null) {
-                return;  // <= no more features to read
-            }
-
-            currentRecord = null;
-
-            while (true) {   // Loop through blocks
-                while (!codec.isDone(source)) {  // Loop through current block
-                    final T f;
-                    try {
-                        f = codec.decode(source);
-                        if (f == null) {
-                            continue;   // Skip
-                        }
-                        if ((chrAlias != null && !f.getContig().equals(chrAlias)) || f.getStart() > end) {
-                            if (blockIterator.hasNext()) {
-                                advanceBlock();
-                                continue;
-                            } else {
-                                return;    // Done
-                            }
-                        }
-                        if (f.getEnd() < start) {
-                            continue;   // Skip
-                        }
-
-                        currentRecord = f;     // Success
-                        return;
-
-                    } catch (TribbleException e) {
-                        e.setSource(path);
-                        throw e;
-                    } catch (NumberFormatException e) {
-                        final String error = "Error parsing line: " + source;
-                        throw new TribbleException.MalformedFeatureFile(error, path, e);
-                    }
-                }
-                if (blockIterator != null && blockIterator.hasNext()) {
-                    advanceBlock();   // Advance to next block
-                } else {
-                    return;   // No blocks left, we're done.
-                }
-            }
-        }
-
-
-        public void remove() {
-            throw new UnsupportedOperationException("Remove is not supported.");
-        }
-
-
-        public void close() {
-            // Note that this depends on BlockStreamWrapper not actually closing the underlying stream
-            codec.close(source);
-            if (!reuseStreamInQuery()) {
-                // if we are going to reuse the underlying stream we don't close the underlying stream.
-                try {
-                    mySeekableStream.close();
-                } catch (IOException e) {
-                    throw new TribbleException("Couldn't close seekable stream", e);
-                }
-            }
-        }
-
-        public Iterator<T> iterator() {
-            return this;
-        }
-    }
-
-
-    /**
-     * Wrapper around a SeekableStream that limits reading to the specified "block" of bytes.  Attempts to
-     * read beyond the end of the block should return -1  (EOF).
-     */
-    static class BlockStreamWrapper extends InputStream {
-
-        SeekableStream seekableStream;
-        long maxPosition;
-
-        BlockStreamWrapper(final SeekableStream seekableStream, final Block block) throws IOException {
-            this.seekableStream = seekableStream;
-            seekableStream.seek(block.getStartPosition());
-            maxPosition = block.getEndPosition();
-        }
-
-        @Override
-        public int read() throws IOException {
-            return (seekableStream.position() > maxPosition) ? -1 : seekableStream.read();
-        }
-
-        @Override
-        public int read(final byte[] bytes, final int off, final int len) throws IOException {
-            // note the careful treatment here to ensure we can continue to
-            // read very long > Integer sized blocks
-            final long maxBytes = maxPosition - seekableStream.position();
-            if (maxBytes <= 0) {
-                return -1;
-            }
-
-            final int bytesToRead = (int) Math.min(len, Math.min(maxBytes, Integer.MAX_VALUE));
-            return seekableStream.read(bytes, off, bytesToRead);
-
-        }
-    }
-
-}
diff --git a/src/main/java/htsjdk/tribble/annotation/Strand.java b/src/main/java/htsjdk/tribble/annotation/Strand.java
deleted file mode 100644
index 581a885..0000000
--- a/src/main/java/htsjdk/tribble/annotation/Strand.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.annotation;
-
-/**
- * Enum for strand, which can be encoded as string
- */
-public enum Strand {
-    POSITIVE("+"), NEGATIVE("-"), NONE("!");  // not really sure what we should do for the NONE Enum
-
-    /**
-     * How we represent the strand information as text
-     */
-    private String encoding;
-    Strand(String str) {
-        encoding = str;
-    }
-
-    /**
-     * provide a way to take an encoding string, and produce a Strand
-     * @param encoding the encoding string
-     * @return a Strand object, if an appropriate one cannot be located an IllegalArg exception
-     */
-    public static Strand toStrand(String encoding) {
-        for (Strand st : Strand.values())
-            if (st.encoding.equals(encoding))
-                return st;
-        throw new IllegalArgumentException("Unable to match encoding to Strand enum for encoding string " + encoding);
-    }
-
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/bed/BEDCodec.java b/src/main/java/htsjdk/tribble/bed/BEDCodec.java
deleted file mode 100644
index ea1e889..0000000
--- a/src/main/java/htsjdk/tribble/bed/BEDCodec.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.bed;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.AsciiFeatureCodec;
-import htsjdk.tribble.annotation.Strand;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.readers.LineIterator;
-import htsjdk.tribble.util.ParsingUtils;
-
-import java.util.regex.Pattern;
-
-/**
- * Codec for parsing BED file, as described by UCSC
- * See https://genome.ucsc.edu/FAQ/FAQformat.html#format1
- *
- * @author jrobinso
- *         Date: Dec 20, 2009
- */
-public class BEDCodec extends AsciiFeatureCodec<BEDFeature> {
-
-    /** Default extension for BED files. */
-    public static final String BED_EXTENSION = ".bed";
-
-    private static final Pattern SPLIT_PATTERN = Pattern.compile("\\t|( +)");
-    private final int startOffsetValue;
-
-    /**
-     * Calls {@link #BEDCodec(StartOffset)} with an argument
-     * of {@code StartOffset.ONE}
-     */
-    public BEDCodec() {
-        this(StartOffset.ONE);
-    }
-
-
-    /**
-     * BED format is 0-based, but Tribble is 1-based.
-     * Set desired start position at either ZERO or ONE
-     */
-    public BEDCodec(final StartOffset startOffset) {
-        super(BEDFeature.class);
-        this.startOffsetValue = startOffset.value();
-    }
-
-
-    public BEDFeature decodeLoc(String line) {
-        return decode(line);
-    }
-
-    @Override
-    public BEDFeature decode(String line) {
-
-        if (line.trim().isEmpty()) {
-            return null;
-        }
-
-        if (line.startsWith("#") || line.startsWith("track") || line.startsWith("browser")) {
-            this.readHeaderLine(line);
-            return null;
-        }
-
-        String[] tokens = SPLIT_PATTERN.split(line, -1);
-        return decode(tokens);
-    }
-
-    @Override
-    public Object readActualHeader(LineIterator reader) {
-        return null;
-    }
-
-    public BEDFeature decode(String[] tokens) {
-        int tokenCount = tokens.length;
-
-        // The first 3 columns are non optional for BED.  We will relax this
-        // and only require 2.
-
-        if (tokenCount < 2) {
-            return null;
-        }
-
-        String chr = tokens[0];
-
-        // The BED format uses a first-base-is-zero convention,  Tribble features use 1 => add 1.
-        int start = Integer.parseInt(tokens[1]) + startOffsetValue;
-
-        int end = start;
-        if (tokenCount > 2) {
-            end = Integer.parseInt(tokens[2]);
-        }
-
-        FullBEDFeature feature = new FullBEDFeature(chr, start, end);
-
-        // The rest of the columns are optional.  Stop parsing upon encountering
-        // a non-expected value
-
-        // Name
-        if (tokenCount > 3) {
-            String name = tokens[3].replaceAll("\"", "");
-            feature.setName(name);
-        }
-
-        // Score
-        if (tokenCount > 4) {
-            try {
-                float score = Float.parseFloat(tokens[4]);
-                feature.setScore(score);
-            } catch (NumberFormatException numberFormatException) {
-
-                // Unexpected, but does not invalidate the previous values.
-                // Stop parsing the line here but keep the feature
-                // Don't log, would just slow parsing down.
-                return feature;
-            }
-        }
-
-        // Strand
-        if (tokenCount > 5) {
-            String strandString = tokens[5].trim();
-            char strand = (strandString.isEmpty())
-                    ? ' ' : strandString.charAt(0);
-
-            if (strand == '-') {
-                feature.setStrand(Strand.NEGATIVE);
-            } else if (strand == '+') {
-                feature.setStrand(Strand.POSITIVE);
-            } else {
-                feature.setStrand(Strand.NONE);
-            }
-        }
-
-        //Color
-        if (tokenCount > 8) {
-            String colorString = tokens[8];
-            feature.setColor(ParsingUtils.parseColor(colorString));
-        }
-
-        // Coding information is optional
-        if (tokenCount > 11) {
-            createExons(start, tokens, feature, feature.getStrand());
-        }
-
-        return feature;
-    }
-
-    protected boolean readHeaderLine(String line) {
-        //We don't parse BED header
-        return false;
-    }
-
-    private void createExons(int start, String[] tokens, FullBEDFeature gene,
-                             Strand strand) throws NumberFormatException {
-
-        int cdStart = Integer.parseInt(tokens[6]) + startOffsetValue;
-        int cdEnd = Integer.parseInt(tokens[7]);
-
-        int exonCount = Integer.parseInt(tokens[9]);
-        String[] exonSizes = new String[exonCount];
-        String[] startsBuffer = new String[exonCount];
-        ParsingUtils.split(tokens[10], exonSizes, ',');
-        ParsingUtils.split(tokens[11], startsBuffer, ',');
-
-        int exonNumber = (strand == Strand.NEGATIVE ? exonCount : 1);
-
-        if (startsBuffer.length == exonSizes.length) {
-            for (int i = 0; i < startsBuffer.length; i++) {
-                int exonStart = start + Integer.parseInt(startsBuffer[i]);
-                int exonEnd = exonStart + Integer.parseInt(exonSizes[i]) - 1;
-                gene.addExon(exonStart, exonEnd, cdStart, cdEnd, exonNumber);
-
-                if (strand == Strand.NEGATIVE) {
-                    exonNumber--;
-                } else {
-                    exonNumber++;
-                }
-            }
-        }
-    }
-
-    @Override
-    public boolean canDecode(final String path) {
-        final String toDecode;
-        if (AbstractFeatureReader.hasBlockCompressedExtension(path)) {
-            toDecode = path.substring(0, path.lastIndexOf("."));
-        } else {
-            toDecode = path;
-        }
-        return toDecode.toLowerCase().endsWith(BED_EXTENSION);
-    }
-
-    public int getStartOffset() {
-        return this.startOffsetValue;
-    }
-
-    /**
-     * Indicate whether co-ordinates or 0-based or 1-based.
-     * <p/>
-     * Tribble uses 1-based, BED files use 0.
-     * e.g.:
-     * start_position = bedline_start_position - startIndex.value()
-     */
-    public enum StartOffset {
-        ZERO(0),
-        ONE(1);
-        private int start;
-
-        private StartOffset(int start) {
-            this.start = start;
-        }
-
-        public int value() {
-            return this.start;
-        }
-    }
-
-    @Override
-    public TabixFormat getTabixFormat() {
-        return TabixFormat.BED;
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/bed/BEDFeature.java b/src/main/java/htsjdk/tribble/bed/BEDFeature.java
deleted file mode 100644
index d70e605..0000000
--- a/src/main/java/htsjdk/tribble/bed/BEDFeature.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.bed;
-
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.annotation.Strand;
-
-import java.awt.*;
-
-/**
- * @author jrobinso
- * @date Dec 24, 2009
- *
- * BED feature start and end positions must adhere to the Feature interval specifications.
- * This is different than the 0-based representation in a BED file.  This conversion is handled by {@link BEDCodec}.
- * Anyone writing a bed file should be aware of this difference.
- */
-public interface BEDFeature extends Feature {
-    Strand getStrand();
-
-    String getType();
-
-    Color getColor();
-
-    String getDescription();
-
-    java.util.List<FullBEDFeature.Exon> getExons();
-
-    String getName();
-
-    float getScore();
-
-    String getLink();
-}
diff --git a/src/main/java/htsjdk/tribble/bed/FullBEDFeature.java b/src/main/java/htsjdk/tribble/bed/FullBEDFeature.java
deleted file mode 100644
index eab5688..0000000
--- a/src/main/java/htsjdk/tribble/bed/FullBEDFeature.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.bed;
-
-import htsjdk.tribble.annotation.Strand;
-
-import java.util.ArrayList;
-
-/**
- * Object for full BED file.
- */
-public class FullBEDFeature extends SimpleBEDFeature implements BEDFeature {
-
-    private java.util.List<Exon> exons = new ArrayList();
-
-    public FullBEDFeature(String chr, int start, int end) {
-        super(start, end, chr);
-
-    }
-
-    public java.util.List<Exon> getExons() {
-        return exons;
-    }
-
-    public void setExons(java.util.List<Exon> exons) {
-        this.exons = exons;
-    }
-
-    public void addExon(Exon exon) {
-        if (exon == null) {
-            this.exons = new ArrayList();
-        }
-        exons.add(exon);
-    }
-
-    public void addExon(int exonStart, int exonEnd, int cdStart, int cdEnd, int exonNumber) {
-        Exon exon = new Exon(exonStart, exonEnd);
-        exon.setCodingStart(cdStart);
-        exon.setCodingEnd(cdEnd);
-        exon.setNumber(exonNumber);
-        addExon(exon);
-    }
-
-    /**
-     * A sub region of a feature.  For example,  a Gene exon
-     *
-     * @author jrobinso
-     */
-    public class Exon {
-
-        int start;
-        int end;
-        /**
-         * The index of the exon relative to the start codon.  The exon with the start
-         * codon is number "1".
-         */
-        private int number;
-        private int readingFrame = -1;
-
-        /**
-         * Coding start position.  This is the leftmost position of the coding region, not neccessarily the 5'utr end
-         */
-        private int codingStart;
-        private int codingEnd;
-        boolean utr = false;
-
-        // The position of the first base of this exon relative to the start of the mRNA.  This will correspond
-        // to either the beginning or end of the exon, depending on the strand
-        private int mrnaBase = -1;
-
-
-        public void setMrnaBase(int base) {
-            this.mrnaBase = base;
-        }
-
-
-        /**
-         * Constructs ...
-         *
-         * @param start
-         * @param end
-         */
-        public Exon(int start, int end) {
-            this.start = start;
-            this.end = end;
-
-            // By default the entre exon is a coding region
-            this.codingStart = start;
-            this.codingEnd = end;
-        }
-
-        /**
-         * Flag indicating that the entire exon is the UTR.
-         *
-         * @param utr
-         */
-        public void setUTR(boolean utr) {
-            this.utr = utr;
-            if (strand == Strand.POSITIVE) {
-                codingStart = codingEnd = end;
-            } else {
-                codingStart = codingEnd = start;
-            }
-        }
-
-        /**
-         * Method description
-         *
-         * @param codingStart
-         */
-        public void setCodingStart(int codingStart) {
-            this.codingStart = Math.max(start, codingStart);
-        }
-
-        /**
-         * Method description
-         *
-         * @param codingEnd
-         */
-        public void setCodingEnd(int codingEnd) {
-            this.codingEnd = Math.min(end, codingEnd);
-        }
-
-        /**
-         * Method description
-         *
-         * @param offset
-         */
-        public void setReadingFrame(int offset) {
-            this.readingFrame = offset;
-        }
-
-        /**
-         * Method description
-         *
-         * @param phase
-         */
-        public void setPhase(int phase) {
-            if (strand == Strand.POSITIVE) {
-                readingFrame = phase;
-            } else if (strand == Strand.NEGATIVE) {
-                int modLen = (getCodingLength() - phase) % 3;
-                readingFrame = modLen;
-            }
-        }
-
-
-        /**
-         * Method description
-         *
-         * @return
-         */
-        public int getCdStart() {
-            return codingStart;
-        }
-
-        /**
-         * Method description
-         *
-         * @return
-         */
-        public int getCdEnd() {
-            return this.codingEnd;
-        }
-
-        /**
-         * Method description
-         *
-         * @return
-         */
-        public int getCodingLength() {
-            return utr ? 0 : Math.max(0, codingEnd - codingStart + 1);
-        }
-
-        /**
-         * This is exposed for unit tests.
-         *
-         * @return
-         */
-        int getReadingShift() {
-            return readingFrame;
-        }
-
-
-        public String getValueString(double position) {
-            String msg = number > 0 ? "Exon number: " + number : "";
-            return msg;
-        }
-
-        public int getNumber() {
-            return number;
-        }
-
-        public void setNumber(int number) {
-            this.number = number;
-        }
-    }
-
-
-    public class Exon2 {
-
-        /**
-         * The index of the exon relative to the start codon.  The exon with the start
-         * codon is number "1".
-         */
-        private int number;
-        private int readingFrame = -1;
-
-        /**
-         * Coding start position.  This is the leftmost position of the coding region, not neccessarily the 5'utr end
-         */
-        private int start;
-        private int end;
-        private int codingStart;
-        private int codingEnd;
-        //private AminoAcidSequence aminoAcidSequence;
-        boolean utr = false;
-
-        // The position of the first base of this exon relative to the start of the mRNA.  This will correspond
-        // to either the beginning or end of the exon, depending on the strand
-        private int mrnaBase = -1;
-
-
-        public Exon2(int start, int end, int codingStart, int codingDne) {
-
-            this.start = start;
-            this.end = end;
-            this.codingStart = codingStart;
-            this.codingEnd = codingDne;
-        }
-
-
-        public void setMrnaBase(int base) {
-            this.mrnaBase = base;
-        }
-
-        public int getAminoAcidNumber(int genomeCoordinate) {
-            if (mrnaBase < 0) {
-                return -1;
-            }
-            if (genomeCoordinate < getStart() || genomeCoordinate > getEnd()) {
-                throw new IndexOutOfBoundsException();
-            }
-            if (getStrand() == Strand.POSITIVE) {
-                int mrnaCoord = mrnaBase + (genomeCoordinate - codingStart) - 1;
-                return mrnaCoord < 0 ? -1 : mrnaCoord / 3 + 1;
-
-            } else if (getStrand() == Strand.NEGATIVE) {
-                int mrnaCoord = mrnaBase + (codingEnd - genomeCoordinate);
-                return mrnaCoord < 0 ? -1 : mrnaCoord / 3 + 1;
-
-            } else {
-                return 0;
-            }
-        }
-
-        /**
-         * Flag indicating that the entire exon is the UTR.
-         *
-         * @param utr
-         */
-        public void setUTR(boolean utr) {
-            this.utr = utr;
-            if (getStrand() == Strand.POSITIVE) {
-                codingStart = codingEnd = getEnd();
-            } else {
-                codingStart = codingEnd = getStart();
-            }
-        }
-
-        /**
-         * Method description
-         *
-         * @param codingStart
-         */
-        public void setCodingStart(int codingStart) {
-            this.codingStart = Math.max(getStart(), codingStart);
-        }
-
-        /**
-         * Method description
-         *
-         * @param codingEnd
-         */
-        public void setCodingEnd(int codingEnd) {
-            this.codingEnd = Math.min(getEnd(), codingEnd);
-        }
-
-        /**
-         * Method description
-         *
-         * @param offset
-         */
-        public void setReadingFrame(int offset) {
-            this.readingFrame = offset;
-        }
-
-        /**
-         * Method description
-         *
-         * @param phase
-         */
-        public void setPhase(int phase) {
-            if (getStrand() == Strand.POSITIVE) {
-                readingFrame = phase;
-            } else if (getStrand() == Strand.NEGATIVE) {
-                int modLen = (getCodingLength() - phase) % 3;
-                readingFrame = modLen;
-            }
-        }
-
-
-        /**
-         * Method description
-         *
-         * @return
-         */
-        public int getCdStart() {
-            return codingStart;
-        }
-
-        /**
-         * Method description
-         *
-         * @return
-         */
-        public int getCdEnd() {
-            return this.codingEnd;
-        }
-
-        /**
-         * Method description
-         *
-         * @return
-         */
-        public int getCodingLength() {
-            return utr ? 0 : Math.max(0, codingEnd - codingStart);
-        }
-
-        /**
-         * This is exposed for unit tests.
-         *
-         * @return
-         */
-        int getReadingShift() {
-            return readingFrame;
-        }
-
-
-        /**
-         * Method description
-         *
-         * @return
-         */
-        /*
-        public AminoAcidSequence getAminoAcidSequence() {
-            if (aminoAcidSequence == null) {
-                computeAminoAcidSequence();
-            }
-            return aminoAcidSequence;
-        }
-        */
-
-
-        /*
-        public void setAminoAcidSequence(AminoAcidSequence aminoAcidSequence) {
-            this.aminoAcidSequence = aminoAcidSequence;
-        }
-        */
-
-        /*
-        private void computeAminoAcidSequence() {
-
-            if (utr) {
-                return;
-            }
-            int start = getStart();
-            int end = getEnd();
-            String chr = getChr();
-            if (readingFrame >= 0) {
-                int readStart = (codingStart > start) ? codingStart : start + readingFrame;
-                int readEnd = Math.min(end, codingEnd);
-                if (readEnd > readStart + 3) {
-                    String genome = IGVModel.getInstance().getViewContext().getGenomeId();
-                    aminoAcidSequence = AminoAcidManager.getAminoAcidSequence(genome, chr, readStart,
-                            readEnd, getStrand());
-                }
-            }
-        }
-        */
-
-
-        public String getValueString(double position) {
-            String msg = number > 0 ? "Exon number: " + number : "";
-            int aaNumber = this.getAminoAcidNumber((int) position);
-            if (aaNumber > 0) {
-                msg += "<br>Amino acid number: " + aaNumber;
-            }
-            return msg;
-        }
-
-        public int getNumber() {
-            return number;
-        }
-
-        public void setNumber(int number) {
-            this.number = number;
-        }
-
-    }
-
-}
diff --git a/src/main/java/htsjdk/tribble/bed/SimpleBEDFeature.java b/src/main/java/htsjdk/tribble/bed/SimpleBEDFeature.java
deleted file mode 100644
index 77a030f..0000000
--- a/src/main/java/htsjdk/tribble/bed/SimpleBEDFeature.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.bed;
-
-import htsjdk.tribble.annotation.Strand;
-
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- *  Feature from a BED file without exon blocks.
- */
-public class SimpleBEDFeature implements BEDFeature {
-    protected String chr;
-    protected int start = -1;
-    protected int end = -1;
-    protected Strand strand = Strand.NONE;
-    private String name = "";
-    private float score = Float.NaN;
-    private String type = "";
-    private Color color;
-    private String description;//protected float confidence;
-    //private String identifier;
-    private String link;
-
-    public SimpleBEDFeature(int start, int end, String chr) {
-        this.start = start;
-        this.end = end;
-        this.chr = chr;
-    }
-
-    @Override
-    public String getContig() {
-        return chr;
-    }
-
-    public int getStart() {
-        return start;
-    }
-
-    public int getEnd() {
-        return end;
-    }
-
-    public Strand getStrand() {
-        return strand;
-    }
-
-    public void setStrand(Strand strand) {
-        this.strand = strand;
-    }
-
-    public void setChr(String chr) {
-        this.chr = chr;
-    }
-
-    public void setStart(int start) {
-        this.start = start;
-    }
-
-    public void setEnd(int end) {
-        this.end = end;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public Color getColor() {
-        return color;
-    }
-
-    public void setColor(Color color) {
-        this.color = color;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public float getScore() {
-        return score;
-    }
-
-    public void setScore(float score) {
-        this.score = score;
-    }
-
-    public String getLink() {
-        return link;
-    }
-
-    public void setLink(String link) {
-        this.link = link;
-    }
-
-    final static List<FullBEDFeature.Exon> emptyExonList = new ArrayList();
-
-    public java.util.List<FullBEDFeature.Exon> getExons() {
-        return emptyExonList;
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/example/CountRecords.java b/src/main/java/htsjdk/tribble/example/CountRecords.java
deleted file mode 100644
index 230c1bf..0000000
--- a/src/main/java/htsjdk/tribble/example/CountRecords.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.example;
-
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.gelitext.GeliTextCodec;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.index.linear.LinearIndex;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Iterator;
-
-/**
- * An example of how to index a feature file, and then count all the records in the file.
- * This is also useful for testing the feature reader
- */
-public class CountRecords {
-
-    /**
-     *  The main method of this class:
-     *  1) checks to see that the feature file exists
-     *  2) loads an index from disk, if one doesn't exist, it creates it and writes it to disk
-     *  3) creates a FeatureSource
-     *  4) iterates over the records, emitting a final tally for the number of features seen
-     *
-     * @param args a single parameter, the file name to load
-     */
-    public static void main(String[] args) {
-        
-        // check yourself before you wreck yourself - we require one arg, the input file
-        if (args.length > 2)
-            printUsage();
-
-        // our feature file
-        File featureFile = new File(args[0]);
-        if (!featureFile.exists()) {
-            System.err.println("File " + featureFile.getAbsolutePath() + " doesnt' exist");
-            printUsage();
-        }
-
-        int optimizeIndex = args.length == 2 ? Integer.valueOf(args[1]) : -1;
-
-        // determine the codec
-        FeatureCodec codec = getFeatureCodec(featureFile);
-
-        runWithIndex(featureFile, codec, optimizeIndex);
-
-    }
-
-    /**
-     *
-     * @see htsjdk.tribble.index.linear.LinearIndex#optimize(double)
-     * @param featureInput  File containing features
-     * @param codec  Codec used to read the features
-     * @param optimizeThreshold Threshold used to optimize the linear index
-     * @return
-     */
-    public static long runWithIndex(File featureInput, FeatureCodec codec, int optimizeThreshold) {
-        // get an index
-        Index index = loadIndex(featureInput, codec);
-        if ( optimizeThreshold != -1 )
-            ((LinearIndex)index).optimize(optimizeThreshold);
-
-        // get a reader
-        AbstractFeatureReader reader = null;
-        try {
-            reader =   AbstractFeatureReader.getFeatureReader(featureInput.getAbsolutePath(), codec, index);
-
-            // now read iterate over the file
-            long recordCount = 0l;
-
-            // this call could be replaced with a query
-            Iterator<Feature> iter = reader.iterator();
-
-            // cycle through the iterators
-            while (iter.hasNext()) {
-                Feature feat = iter.next();
-                ++recordCount;
-            }
-
-            System.err.println("We saw " + recordCount + " record in file " + featureInput);
-            return recordCount;
-
-        } catch (IOException e) {
-            throw new RuntimeIOException("Something went wrong while reading feature file " + featureInput, e);
-        }
-    }
-
-    /**
-     * print usage information
-     */
-    public static void printUsage() {
-        System.err.println("Usage: java -jar CountRecords.jar <inputFile>");
-        System.err.println("    Where input can be of type: VCF (ends in .vcf or .VCF");
-        System.err.println("                                Bed (ends in .bed or .bed");
-        /**
-         * you could add others here; also look in the GATK code-base for an example of a dynamic way
-         * to load Tribble codecs.
-         */
-        System.exit(1);
-    }
-
-    /**
-     *
-     * @param featureFile the feature file
-     * @param codec the codec to decode features with
-     * @return an index instance
-     */
-    public static Index loadIndex(File featureFile, FeatureCodec codec) {
-        // lets setup a index file name
-        File indexFile = Tribble.indexFile(featureFile);
-
-        // our index instance;
-        Index index = null;
-
-        // can we read the index file
-        if (indexFile.canRead()) {
-            System.err.println("Loading index from disk for index file -> " + indexFile);
-            index = IndexFactory.loadIndex(indexFile.getAbsolutePath());
-        // else we want to make the index, and write it to disk if possible
-        } else {
-            System.err.println("Creating the index and memory, then writing to disk for index file -> " + indexFile);
-            index = createAndWriteNewIndex(featureFile,indexFile,codec);
-        }
-
-        return index;
-    }
-
-    /**
-     * creates a new index, given the feature file and the codec
-     * @param featureFile the feature file (i.e. .vcf, .bed)
-     * @param indexFile the index file; the location we should be writing the index to
-     * @param codec the codec to read features with
-     * @return an index instance
-     */
-    public static Index createAndWriteNewIndex(File featureFile, File indexFile, FeatureCodec codec) {
-        try {
-            Index index = IndexFactory.createLinearIndex(featureFile, codec);
-
-            // try to write it to disk
-            LittleEndianOutputStream stream = new LittleEndianOutputStream(new BufferedOutputStream(new FileOutputStream(indexFile)));
-            		
-            index.write(stream);
-            stream.close();
-
-            return index;
-        } catch (IOException e) {
-            throw new RuntimeIOException("Unable to create index from file " + featureFile,e);
-        }
-    }
-
-    /**
-     * Return a {@code FeatureCodec} instance appropriate for the given
-     * {@code featureFile}. Codec is generated based on file extension
-     * @param featureFile
-     * @return
-     * @throws IllegalArgumentException If a codec cannot be found
-     */
-    public static FeatureCodec getFeatureCodec(File featureFile) {
-        // quickly determine the codec type
-        //if (featureFile.getName().endsWith(".vcf") || featureFile.getName().endsWith(".VCF") )
-        //    return new VCFCodec();
-        if (featureFile.getName().endsWith(".bed") || featureFile.getName().endsWith(".BED") )
-            return new BEDCodec();
-        if (featureFile.getName().endsWith(".geli.calls") || featureFile.getName().endsWith(".geli") )
-            return new GeliTextCodec();
-        throw new IllegalArgumentException("Unable to determine correct file type based on the file name, for file -> " + featureFile);
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/example/ExampleBinaryCodec.java b/src/main/java/htsjdk/tribble/example/ExampleBinaryCodec.java
deleted file mode 100644
index 9628cc4..0000000
--- a/src/main/java/htsjdk/tribble/example/ExampleBinaryCodec.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.example;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.SimpleFeature;
-import htsjdk.tribble.BinaryFeatureCodec;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.tribble.FeatureCodecHeader;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.readers.AsciiLineReader;
-import htsjdk.tribble.readers.LineIterator;
-import htsjdk.tribble.readers.PositionalBufferedStream;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * An example binary codec that encodes / decodes contig / start / stop values via DataInputStreams
- *
- * @author Mark DePristo
- */
-public class ExampleBinaryCodec extends BinaryFeatureCodec<Feature> {
-    public final static String HEADER_LINE = "# BinaryTestFeature";
-
-    @Override
-    public Feature decodeLoc(final PositionalBufferedStream stream) throws IOException {
-        return decode(stream);
-    }
-
-    @Override
-    public Feature decode(final PositionalBufferedStream stream) throws IOException {
-        DataInputStream dis = new DataInputStream(stream);
-        String contig = dis.readUTF();
-        int start = dis.readInt();
-        int stop = dis.readInt();
-        return new SimpleFeature(contig, start, stop);
-    }
-
-    @Override
-    public FeatureCodecHeader readHeader(final PositionalBufferedStream stream) throws IOException {
-        // Construct a reader that does not read ahead (because we don't want to consume data from the stream that is not the header)
-        final AsciiLineReader nonReadAheadLineReader = new AsciiLineReader(stream);
-        final List<String> headerLines = new ArrayList<String>();
-        long headerLengthInBytes = 0;
-        while (stream.peek() == ('#' & 0xff)) { // Look for header lines, which are prefixed by '#'.
-            headerLines.add(nonReadAheadLineReader.readLine());
-            headerLengthInBytes = stream.getPosition();
-        }
-        return new FeatureCodecHeader(headerLines, headerLengthInBytes);
-    }
-
-    @Override
-    public Class<Feature> getFeatureType() {
-
-        return Feature.class;
-    }
-    @Override
-    public boolean canDecode(final String path) {
-        return false;
-    }
-
-    /**
-     * Convenience method that creates an ExampleBinaryCodec file from another feature file.
-     *
-     * For testing purposes really
-     *
-     * @param source file containing the features
-     * @param dest the place to write the binary features
-     * @param codec of the source file features
-     * @throws IOException
-     */
-    public static <FEATURE_TYPE extends Feature> void convertToBinaryTest(final File source, final File dest, final FeatureCodec<FEATURE_TYPE, LineIterator> codec) throws IOException {
-        final FeatureReader<FEATURE_TYPE> reader = AbstractFeatureReader.getFeatureReader(source.getAbsolutePath(), codec, false); // IndexFactory.loadIndex(idxFile));
-        final OutputStream output = new FileOutputStream(dest);
-        ExampleBinaryCodec.convertToBinaryTest(reader, output);
-    }
-
-    /**
-     * Convenience method that creates an ExampleBinaryCodec file from another feature file.
-     *
-     * For testing purposes really
-     *
-     * @throws IOException
-     */
-    public static <FEATURE_TYPE extends Feature> void convertToBinaryTest(final FeatureReader<FEATURE_TYPE> reader, final OutputStream out) throws IOException {
-        DataOutputStream dos = new DataOutputStream(out);
-        dos.writeBytes(HEADER_LINE + "\n");
-        Iterator<FEATURE_TYPE> it = reader.iterator();
-        while ( it.hasNext() ) {
-            final Feature f = it.next();
-            dos.writeUTF(f.getContig());
-            dos.writeInt(f.getStart());
-            dos.writeInt(f.getEnd());
-        }
-        dos.close();
-        reader.close();
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/example/IndexToTable.java b/src/main/java/htsjdk/tribble/example/IndexToTable.java
deleted file mode 100644
index 9cf6c70..0000000
--- a/src/main/java/htsjdk/tribble/example/IndexToTable.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2010, The Broad Institute
- *
- * 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 AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble.example;
-
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.index.linear.LinearIndex;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.PrintStream;
-
-
-public class IndexToTable {
-
-    /**
-     * this class:
-     *  1) checks to see that the feature file exists
-     *  2) loads an index from disk, if one doesn't exist, it creates it and writes it to disk
-     *  3) Converts the index to a human readable table
-     *  @see htsjdk.tribble.index.linear.LinearIndex#writeTable(java.io.PrintStream)
-     *
-     * @param args 2 parameters:
-     *             1) The path of the file to index
-     *             2) The output file path
-     */
-    public static void main(String[] args) {
-
-        // check yourself before you wreck yourself - we require one arg, the input file
-        if (args.length != 2)
-            printUsage();
-
-        //LinearIndex.enableAdaptiveIndexing = false;
-        LinearIndex idx = (LinearIndex) IndexFactory.loadIndex(new File(args[0]).getAbsolutePath());
-        try {
-            idx.writeTable(new PrintStream(new FileOutputStream(new File(args[1]))));
-        } catch ( FileNotFoundException e ) {
-            e.printStackTrace();
-            System.exit(1);
-        }
-    }
-
-    /**
-     * print usage information
-     */
-    public static void printUsage() {
-        System.err.println("Usage: java -jar IndexToTable.jar index.file output.table");
-        System.exit(1);
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/example/IndicesAreEqual.java b/src/main/java/htsjdk/tribble/example/IndicesAreEqual.java
deleted file mode 100644
index b0ea712..0000000
--- a/src/main/java/htsjdk/tribble/example/IndicesAreEqual.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.example;
-
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-
-import java.io.File;
-
-/**
- * Check with two index files are equal
- */
-public class IndicesAreEqual {
-
-    /**
-     *
-     * @param args 2 parameters, the paths of the two index files to compare
-     */
-    public static void main(String[] args) {
-        if ( args.length != 2 )
-            printUsage();
-        else {
-            Index index1 = loadIndex(args[0]);
-            Index index2 = loadIndex(args[1]);
-            System.out.printf("%n");
-            System.out.printf("index1: %s%n", args[0]);
-            System.out.printf("index2: %s%n", args[1]);
-            boolean eq = index1.equals(index2);
-            System.out.printf("  equals() = %b%n", eq);
-        }
-    }
-
-    /**
-     * print usage information
-     */
-    public static void printUsage() {
-        System.err.println("Usage: java -jar IndicesAreEqual.jar index1 index2");
-        System.err.println("    Prints out true / false if index1 and index2 are equal");
-        System.exit(1);
-    }
-
-    /**
-     * @return an index instance
-     */
-    public static Index loadIndex(String filename) {
-        //System.err.println("Loading index from disk for index file -> " + filename);
-        File file = new File(filename);
-        if (file.canRead()) {
-            return IndexFactory.loadIndex(file.getAbsolutePath());
-        } else {
-            printUsage();
-            return null;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/example/ProfileIndexReading.java b/src/main/java/htsjdk/tribble/example/ProfileIndexReading.java
deleted file mode 100644
index 6e3ef13..0000000
--- a/src/main/java/htsjdk/tribble/example/ProfileIndexReading.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2010, The Broad Institute
- *
- * 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 AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble.example;
-
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-
-public class ProfileIndexReading {
-
-    /**
-     * This class times the loading of an index file a number of times,
-     * and prints the result of each trial
-     * @param args Two parameters:
-     *             1) The number of trials to run
-     *             2) Index file to load
-     */
-    public static void main(String[] args) {
-
-        // check yourself before you wreck yourself - we require one arg, the input file
-        if (args.length < 2)
-            printUsage();
-
-        int iterations = Integer.valueOf(args[0]);
-        for ( int j = 1; j < args.length; j++  ) {
-            String indexFile = args[j];
-            System.out.printf("Reading %s%n", indexFile);
-            long startTime = System.currentTimeMillis();
-            for ( int i = 0; i < iterations; i++ ) {
-                System.out.printf("  iteration %d%n", i);
-                Index index = IndexFactory.loadIndex(indexFile);
-            }
-            long stopTime = System.currentTimeMillis();
-            System.out.printf("Runtime %s %.2f%n", indexFile, (stopTime - startTime) / 1000.0);
-        }
-    }
-
-    /**
-     * print usage information
-     */
-    public static void printUsage() {
-        System.err.println("Usage: java -jar ReadIndices.jar iterations index.file...");
-        System.exit(1);
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/exception/CodecLineParsingException.java b/src/main/java/htsjdk/tribble/exception/CodecLineParsingException.java
deleted file mode 100644
index 8cc3042..0000000
--- a/src/main/java/htsjdk/tribble/exception/CodecLineParsingException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.exception;
-
-
-/**
- * Class CodecLineParsingException
- *
- * a generic exception we use if the codec has trouble parsing the line its given
- *
- * @author aaron
- */
-public class CodecLineParsingException extends RuntimeException {
-
-    public CodecLineParsingException(Throwable cause) {
-        super(cause);
-    }
-
-    public CodecLineParsingException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public CodecLineParsingException(String message) {
-        super(message);
-    }
-
-    public CodecLineParsingException() {
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/exception/UnsortedFileException.java b/src/main/java/htsjdk/tribble/exception/UnsortedFileException.java
deleted file mode 100644
index 7f5e387..0000000
--- a/src/main/java/htsjdk/tribble/exception/UnsortedFileException.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.exception;
-
-/**
- * an exception for when we've discovered that an input file is unsorted; sorted files are required by Tribble
- */
-public class UnsortedFileException extends RuntimeException {
-
-    public UnsortedFileException(Throwable cause) {
-        super(cause);
-    }
-
-    public UnsortedFileException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public UnsortedFileException(String message) {
-        super(message);
-    }
-
-    public UnsortedFileException() {
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/gelitext/DiploidGenotype.java b/src/main/java/htsjdk/tribble/gelitext/DiploidGenotype.java
deleted file mode 100644
index f533432..0000000
--- a/src/main/java/htsjdk/tribble/gelitext/DiploidGenotype.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.gelitext;
-
-
-/**
- * Class DiploidGenotype
- *
- * Enum describing all possible combinations of diploid genotype variations;
- * AA, AC, etc.
- *
- * @author aaron
- */
- at Deprecated
-public enum DiploidGenotype {
-    AA, AC, AG, AT, CC, CG, CT, GG, GT, TT;
-
-    public static DiploidGenotype toDiploidGenotype(String genotype) {
-        if (genotype.length() != 2)
-            throw new DiploidGenotypeException("Genotype string for conversion should be of length 2, we were passed = " + genotype);
-        genotype = genotype.toUpperCase();
-        for (DiploidGenotype g: DiploidGenotype.values())
-            if (g.toString().equals(genotype)) return g;
-        throw new DiploidGenotypeException("Unable to find genotype matching " + genotype);
-    }
-
-    public boolean isHet() {
-        return toString().toCharArray()[0] != toString().toCharArray()[1];
-    }
-
-    public boolean containsBase(char base) {
-        return (toString().charAt(0) == base || toString().charAt(1) == base);
-    }
-}
-
- at Deprecated
-class DiploidGenotypeException extends RuntimeException {
-    DiploidGenotypeException(String s) {
-        super(s);
-    }
-
-    DiploidGenotypeException(String s, Throwable throwable) {
-        super(s, throwable);
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/gelitext/GeliTextCodec.java b/src/main/java/htsjdk/tribble/gelitext/GeliTextCodec.java
deleted file mode 100644
index 394b5dc..0000000
--- a/src/main/java/htsjdk/tribble/gelitext/GeliTextCodec.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.gelitext;
-
-import htsjdk.samtools.util.CollectionUtil;
-import htsjdk.tribble.AsciiFeatureCodec;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.exception.CodecLineParsingException;
-import htsjdk.tribble.readers.LineIterator;
-
-import java.util.Arrays;
-
-
-/**
- * <p/>
- * A codec for parsing geli text files, which is the text version of the geli binary format.
- * <p/>
- * <p/>
- * GELI text has the following tab-seperated fields:
- * contig             the contig (string)
- * position           the position on the contig (long)
- * refBase            the reference base (char)
- * depthOfCoverage    the depth of coverage at this position (int)
- * maximumMappingQual the maximum mapping quality of a read at this position (int)
- * genotype           the called genotype (string)
- * LODBestToReference the LOD score of the best to the reference (double)
- * LODBestToNext      the LOD score of the best to the next best genotype (double)
- * likelihoods        the array of all genotype likelihoods, in ordinal ordering (array of 10 doubles, in ordinal order)
- *
- * @author aaron
- * @deprecated This is deprecated and unsupported.
- */
- at Deprecated
-public class GeliTextCodec extends AsciiFeatureCodec<GeliTextFeature> {
-    public GeliTextCodec() {
-        super(GeliTextFeature.class);
-    }
-
-    public Feature decodeLoc(final String line) {
-        return decode(line);
-    }
-
-    @Override
-    public GeliTextFeature decode(final String line) {
-        // clean out header lines and comments
-        if (line.startsWith("#") || line.startsWith("@"))
-            return null;
-
-        // parse into tokens
-        final String[] parts = line.trim().split("\\s+");
-        return decode(parts);
-    }
-
-    @Override
-    public boolean canDecode(String path){
-	return path.toLowerCase().endsWith(".geli.calls") || path.toLowerCase().endsWith(".geli");
-    }
-
-    @Override
-    public Object readActualHeader(LineIterator reader) {
-        return null;
-    }
-
-    public GeliTextFeature decode(final String[] tokens) {
-        try {
-            // check that we got the correct number of tokens in the split
-            if (tokens.length != 18)
-                throw new CodecLineParsingException("Invalid GeliTextFeature row found -- incorrect element count.  Expected 18, got " + tokens.length + " line = " + CollectionUtil.join(Arrays.asList(tokens), " "));
-
-            // UPPER case and sort
-            final char[] x = tokens[5].toUpperCase().toCharArray();
-            Arrays.sort(x);
-            final String bestGenotype = new String(x);
-
-            final double[] genotypeLikelihoods = new double[10];
-            for (int pieceIndex = 8, offset = 0; pieceIndex < 18; pieceIndex++, offset++) {
-                genotypeLikelihoods[offset] = Double.valueOf(tokens[pieceIndex]);
-            }
-            return new GeliTextFeature(tokens[0],
-                    Long.valueOf(tokens[1]),
-                    Character.toUpperCase(tokens[2].charAt(0)),
-                    Integer.valueOf(tokens[3]),
-                    Integer.valueOf(tokens[4]),
-                    DiploidGenotype.toDiploidGenotype(bestGenotype),
-                    Double.valueOf(tokens[6]),
-                    Double.valueOf(tokens[7]),
-                    genotypeLikelihoods);
-        } catch (CodecLineParsingException e) {
-            e.printStackTrace();
-            throw new RuntimeException("Unable to parse line " + CollectionUtil.join(Arrays.asList(tokens), " "), e);
-        } catch (NumberFormatException e) {
-            e.printStackTrace();
-            throw new RuntimeException("Unable to parse line " + CollectionUtil.join(Arrays.asList(tokens), " "), e);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/gelitext/GeliTextFeature.java b/src/main/java/htsjdk/tribble/gelitext/GeliTextFeature.java
deleted file mode 100644
index baad1ca..0000000
--- a/src/main/java/htsjdk/tribble/gelitext/GeliTextFeature.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.gelitext;
-
-import htsjdk.tribble.Feature;
-
-import java.util.Arrays;
-
-
-/**
- *         <p/>
- *         Class GeliTextFeature
- *         <p/>
- *         This is a feature for the Geli text object, which is the text version of the Geli binary genotyping format.
- *
- * @author aaron
- * @deprecated this is deprecated and no longer supported
- */
- at Deprecated
-public class GeliTextFeature implements Feature {
-
-    private final String contig;                // the contig name
-    private final long position;                // the position on the contig
-    private final char refBase;                 // the reference base
-    private final int depthOfCoverage;          // the depth of coverage at this position
-    private final int maximumMappingQual;       // the maximum mapping quality of a read at this position
-    private final DiploidGenotype genotype;     // the called genotype
-    private final double LODBestToReference;    // the LOD score of the best to the reference
-    private final double LODBestToNext;         // the LOD score of the best to the next best genotype
-    private final double likelihoods[];         // the array of all genotype likelihoods, in ordinal order
-
-    /**
-     * Create a geli text feature, given:
-     *
-     * @param contig             the contig
-     * @param position           the position on the contig
-     * @param refBase            the reference base
-     * @param depthOfCoverage    the depth of coverage at this position
-     * @param maximumMappingQual the maximum mapping quality of a read at this position
-     * @param genotype           the called genotype
-     * @param LODBestToReference the LOD score of the best to the reference
-     * @param LODBestToNext      the LOD score of the best to the next best genotype
-     * @param likelihoods        the array of all genotype likelihoods, in ordinal ordering
-     */
-    public GeliTextFeature(String contig,
-                           long position,
-                           char refBase,
-                           int depthOfCoverage,
-                           int maximumMappingQual,
-                           DiploidGenotype genotype,
-                           double LODBestToReference,
-                           double LODBestToNext,
-                           double[] likelihoods) {
-        this.contig = contig;
-        this.position = position;
-        this.refBase = refBase;
-        this.depthOfCoverage = depthOfCoverage;
-        this.maximumMappingQual = maximumMappingQual;
-        this.genotype = genotype;
-        this.LODBestToReference = LODBestToReference;
-        this.LODBestToNext = LODBestToNext;
-        this.likelihoods = likelihoods;
-    }
-
-    @Override
-    public String getContig() {
-        return this.contig;
-    }
-
-    /** Return the start position in 1-based coordinates (first base is 1) */
-    public int getStart() {
-        return (int) this.position;
-    }
-
-    /**
-     * Return the end position following 1-based fully closed conventions.  The length of a feature is
-     * end - start + 1;
-     */
-    public int getEnd() {
-        return (int) this.position;
-    }
-
-    public char getRefBase() {
-        return refBase;
-    }
-
-    public int getDepthOfCoverage() {
-        return depthOfCoverage;
-    }
-
-    public int getMaximumMappingQual() {
-        return maximumMappingQual;
-    }
-
-    public DiploidGenotype getGenotype() {
-        return genotype;
-    }
-
-    public double getLODBestToNext() {
-        return LODBestToNext;
-    }
-
-    public double getLODBestToReference() {
-        return LODBestToReference;
-    }
-
-    public double[] getLikelihoods() {
-        return likelihoods;
-    }
-
-    private static double Epsilon = 0.0001;
-    public boolean equals(Object o) {
-        if (!(o instanceof GeliTextFeature)) return false;
-        GeliTextFeature other = (GeliTextFeature)o;
-        if (!Arrays.equals(likelihoods,other.likelihoods)) return false;
-        if (!contig.equals(other.contig)) return false;
-        if (!(position == other.position)) return false;
-        if (!(refBase == other.refBase)) return false;
-        if (!(depthOfCoverage == other.depthOfCoverage)) return false;
-        if (!(maximumMappingQual == other.maximumMappingQual)) return false;
-        if (!(genotype == other.genotype)) return false;
-        if (!(Math.abs(LODBestToReference - other.LODBestToReference) < Epsilon)) return false;
-        if (!(Math.abs(LODBestToNext - other.LODBestToNext) < Epsilon)) return false;
-        return true;
-    }
-
-}
diff --git a/src/main/java/htsjdk/tribble/index/AbstractIndex.java b/src/main/java/htsjdk/tribble/index/AbstractIndex.java
deleted file mode 100644
index 47e31cc..0000000
--- a/src/main/java/htsjdk/tribble/index/AbstractIndex.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index;
-
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p/>
- * An abstract implementation of the index class.  This class takes care of the basics that are common
- * to all of the current indexing classes; including the version information, common header properties,
- * and reading and writing the header to disk.
- *
- * @author jrobinso
- */
-public abstract class AbstractIndex implements MutableIndex {
-
-    public enum IndexType {
-        LINEAR(1),
-        INTERVAL_TREE(2);
-        public final int fileHeaderTypeIdentifier;
-
-        IndexType(int fileHeaderTypeIdentifier) {
-            this.fileHeaderTypeIdentifier = fileHeaderTypeIdentifier;
-        }
-    }
-
-    // todo -- up to version 4 and use ETag to detect out of date
-    // todo -- inode number + size in bytes + modification time
-    // todo -- remove MD5
-
-    // the current version of the index
-    public static final int VERSION = 3;
-    public static final int MAGIC_NUMBER = 1480870228;   //  byte[]{'T', 'I', 'D', 'X'};
-
-
-    private final static String NO_MD5 = "";
-    private final static long NO_FILE_SIZE = -1L;
-    private final static long NO_TS = -1L;
-
-    protected int version;                    // Our version value
-    protected File indexedFile = null;         // The file we've created this index for
-    protected long indexedFileSize = NO_FILE_SIZE; // The size of the indexed file
-    protected long indexedFileTS = NO_TS;      // The timestamp
-    protected String indexedFileMD5 = NO_MD5;        // The MD5 value, generally not filled in (expensive to calc)
-    protected int flags;
-
-    public boolean hasFileSize() {
-        return indexedFileSize != NO_FILE_SIZE;
-    }
-
-    public boolean hasTimestamp() {
-        return indexedFileTS != NO_TS;
-    }
-
-    public boolean hasMD5() {
-        return indexedFileMD5 != NO_MD5;
-    }
-
-    private LinkedHashMap<String, String> properties;
-
-    /**
-     * the map of our chromosome bins
-     */
-    protected LinkedHashMap<String, ChrIndex> chrIndices;
-
-    /**
-     * Any flags we're using
-     */
-    private static final int SEQUENCE_DICTIONARY_FLAG = 0x8000; // if we have a sequence dictionary in our header
-
-    /**
-     * @param obj
-     * @return true if this and obj are 'effectively' equivalent data structures.
-     */
-    public boolean equalsIgnoreProperties(final Object obj) {
-        if (this == obj) return true;
-        if (!(obj instanceof AbstractIndex)) {
-            System.err.printf("equals: %s not instance of AbstractIndex", obj);
-            return false;
-        }
-
-        final AbstractIndex other = (AbstractIndex) obj;
-
-        if (version != other.version) {
-            System.err.printf("equals version: this %d != other %d%n", version, other.version);
-            return false;
-        }
-
-        if (indexedFile != other.indexedFile && (indexedFile == null || !indexedFile.equals(other.indexedFile))) {
-            System.err.printf("equals indexedFile: this %s != other %s%n", indexedFile, other.indexedFile);
-            return false;
-        }
-
-        if (indexedFileSize != other.indexedFileSize) {
-            System.err.printf("equals indexedFileSize: this %d != other %d%n", indexedFileSize, other.indexedFileSize);
-            return false;
-        }
-
-        if (!indexedFileMD5.equals(other.indexedFileMD5)) {
-            System.err.printf("equals indexedFileMD5: this %s != other %s%n", indexedFileMD5, other.indexedFileMD5);
-            return false;
-        }
-
-        if (flags != other.flags) {
-            System.err.printf("equals flags: this %d != other %d%n", flags, other.flags);
-            return false;
-        }
-
-        if (!chrIndices.equals(other.chrIndices)) {
-            System.err.printf("equals chrIndeces: this %s != other %s%n", chrIndices, other.chrIndices);
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * create an abstract index, with defaults for the version value, and empty properties and chromosome lists
-     */
-    public AbstractIndex() {
-        this.version = VERSION; // <= is overriden when file is read
-        this.properties = new LinkedHashMap<String, String>();
-        chrIndices = new LinkedHashMap<String, ChrIndex>();
-    }
-
-    /**
-     * create an index file from the target feature file
-     *
-     * @param featureFile the feature file to create an index from
-     */
-    public AbstractIndex(final String featureFile) {
-        this(new File(featureFile));
-    }
-
-    public AbstractIndex(final File featureFile) {
-        this();
-        this.indexedFile = featureFile;
-    }
-
-    public AbstractIndex(final AbstractIndex parent) {
-        this();
-        this.version = parent.version;
-        this.indexedFile = parent.indexedFile;
-        this.indexedFileSize = parent.indexedFileSize;
-        this.indexedFileTS = parent.indexedFileTS;
-        this.indexedFileMD5 = parent.indexedFileMD5;
-        this.flags = parent.flags;
-        this.properties = (LinkedHashMap<String, String>) parent.properties.clone();
-    }
-
-    protected void validateIndexHeader(final int indexType, final LittleEndianInputStream dis) throws IOException {
-        final int magicNumber = dis.readInt();
-        if (magicNumber != MAGIC_NUMBER) {
-            throw new TribbleException(String.format("Unexpected magic number %d", magicNumber));
-        }
-        final int type = dis.readInt();
-        if (type != indexType) {
-            throw new TribbleException(String.format("Unexpected index type %d", type));
-        }
-
-    }
-
-    /**
-     * check the current version against the version we read in
-     *
-     * @return true if we're up to date, false otherwise
-     */
-    public boolean isCurrentVersion() {
-        return version == VERSION;
-    }
-
-    public File getIndexedFile() {
-        return indexedFile;
-    }
-
-    public long getIndexedFileSize() {
-        return indexedFileSize;
-    }
-
-    public long getIndexedFileTS() {
-        return indexedFileTS;
-    }
-
-    public String getIndexedFileMD5() {
-        return indexedFileMD5;
-    }
-
-    public int getFlags() {
-        return flags;
-    }
-
-    public int getVersion() {
-        return version;
-    }
-
-    public void setMD5(final String md5) {
-        this.indexedFileMD5 = md5;
-    }
-
-    public boolean containsChromosome(final String chr) {
-        return chrIndices.containsKey(chr);
-    }
-
-    public void finalizeIndex() {
-        // these two functions must be called now because the file may be being written during on the fly indexing
-        if (indexedFile != null) {
-            this.indexedFileSize = indexedFile.length();
-            this.indexedFileTS = indexedFile.lastModified();
-        }
-    }
-
-    /**
-     * write the header to the target output stream
-     *
-     * @param dos the little endian output stream
-     * @throws IOException an exception when we can't write to the file
-     */
-    private void writeHeader(final LittleEndianOutputStream dos) throws IOException {
-        dos.writeInt(MAGIC_NUMBER);
-        dos.writeInt(getType());
-        dos.writeInt(version);
-        dos.writeString(indexedFile.getAbsolutePath());
-        dos.writeLong(indexedFileSize);
-        dos.writeLong(indexedFileTS);
-        dos.writeString(indexedFileMD5);
-        dos.writeInt(flags);
-
-        // Properties (Version 3 and later)
-        dos.writeInt(properties.size());
-        for (final Map.Entry<String, String> prop : properties.entrySet()) {
-            dos.writeString(prop.getKey());
-            dos.writeString(prop.getValue());
-        }
-    }
-
-    /**
-     * read the header from the input stream
-     *
-     * @param dis the little endian input stream
-     * @throws IOException if we fail to read from the file at any point
-     */
-    private void readHeader(final LittleEndianInputStream dis) throws IOException {
-
-        version = dis.readInt();
-        indexedFile = new File(dis.readString());
-        indexedFileSize = dis.readLong();
-        indexedFileTS = dis.readLong();
-        indexedFileMD5 = dis.readString();
-        flags = dis.readInt();
-        if (version < 3 && (flags & SEQUENCE_DICTIONARY_FLAG) == SEQUENCE_DICTIONARY_FLAG) {
-            readSequenceDictionary(dis);
-        }
-
-        if (version >= 3) {
-            int nProperties = dis.readInt();
-            while (nProperties-- > 0) {
-                final String key = dis.readString();
-                final String value = dis.readString();
-                properties.put(key, value);
-            }
-        }
-    }
-
-    /**
-     * Kept to maintain backward compatibility with pre version 3 indexes.  The sequence dictionary is no longer
-     * used,  use getSequenceNames() instead.
-     *
-     * @param dis
-     * @throws IOException
-     */
-    private void readSequenceDictionary(final LittleEndianInputStream dis) throws IOException {
-        final int size = dis.readInt();
-        if (size < 0) throw new IllegalStateException("Size of the sequence dictionary entries is negative");
-        for (int x = 0; x < size; x++) {
-            dis.readString();
-            dis.readInt();
-        }
-    }
-
-    public List<String> getSequenceNames() {
-        return new ArrayList<String>(chrIndices.keySet());
-    }
-
-    public List<Block> getBlocks(final String chr, final int start, final int end) {
-        return getChrIndex(chr).getBlocks(start, end);
-    }
-
-    public List<Block> getBlocks(final String chr) {
-        return getChrIndex(chr).getBlocks();
-    }
-
-    /**
-     * @param chr
-     * @return return the ChrIndex associated with chr,
-     * @throws IllegalArgumentException if {@code chr} not found
-     */
-    private final ChrIndex getChrIndex(final String chr) {
-        final ChrIndex chrIdx = chrIndices.get(chr);
-        if (chrIdx == null) {
-            throw new IllegalArgumentException("getBlocks() called with of unknown contig " + chr);
-        } else {
-            return chrIdx;
-        }
-    }
-
-    public void write(final LittleEndianOutputStream stream) throws IOException {
-        writeHeader(stream);
-
-        //# of chromosomes
-        stream.writeInt(chrIndices.size());
-        for (final ChrIndex chrIdx : chrIndices.values()) {
-            chrIdx.write(stream);
-        }
-    }
-
-    @Override
-    public void write(final File idxFile) throws IOException {
-        try(final LittleEndianOutputStream idxStream = new LittleEndianOutputStream(new BufferedOutputStream(new FileOutputStream(idxFile)))) {
-            write(idxStream);
-        }
-    }
-
-    @Override
-    public void writeBasedOnFeatureFile(final File featureFile) throws IOException {
-        if (!featureFile.isFile()) return;
-        write(Tribble.indexFile(featureFile));
-    }
-
-    public void read(final LittleEndianInputStream dis) throws IOException {
-        try {
-            readHeader(dis);
-
-            int nChromosomes = dis.readInt();
-            chrIndices = new LinkedHashMap<String, ChrIndex>(nChromosomes);
-
-            while (nChromosomes-- > 0) {
-                final ChrIndex chrIdx = (ChrIndex) getChrIndexClass().newInstance();
-                chrIdx.read(dis);
-                chrIndices.put(chrIdx.getName(), chrIdx);
-            }
-
-        } catch (final InstantiationException e) {
-            throw new TribbleException.UnableToCreateCorrectIndexType("Unable to create class " + getChrIndexClass(), e);
-        } catch (final IllegalAccessException e) {
-            throw new TribbleException.UnableToCreateCorrectIndexType("Unable to create class " + getChrIndexClass(), e);
-        } finally {
-            dis.close();
-        }
-
-        //printIndexInfo();
-    }
-
-    protected void printIndexInfo() {
-        System.out.println(String.format("Index for %s with %d indices", indexedFile, chrIndices.size()));
-        final BlockStats stats = getBlockStats(true);
-        System.out.println(String.format("  total blocks %d", stats.total));
-        System.out.println(String.format("  total empty blocks %d", stats.empty));
-    }
-
-    protected static class BlockStats {
-        long total = 0, empty = 0, objects = 0, size = 0;
-    }
-
-    protected BlockStats getBlockStats(final boolean logDetails) {
-        final BlockStats stats = new BlockStats();
-        for (final Map.Entry<String, ChrIndex> elt : chrIndices.entrySet()) {
-            final List<Block> blocks = elt.getValue().getBlocks();
-
-            if (blocks != null) {
-                final int nBlocks = blocks.size();
-
-                int nEmptyBlocks = 0;
-                for (final Block b : elt.getValue().getBlocks()) {
-                    if (b.getSize() == 0) nEmptyBlocks++;
-                }
-                stats.empty += nEmptyBlocks;
-                stats.total += nBlocks;
-
-                if (logDetails)
-                    System.out.println(String.format("  %s => %d blocks, %d empty, %.2f", elt.getKey(), nBlocks, nEmptyBlocks, (100.0 * nEmptyBlocks) / nBlocks));
-            }
-        }
-
-        return stats;
-    }
-
-    protected String statsSummary() {
-        final BlockStats stats = getBlockStats(false);
-        return String.format("%12d blocks (%12d empty (%.2f%%))", stats.total, stats.empty, (100.0 * stats.empty) / stats.total);
-    }
-
-    public void addProperty(final String key, final String value) {
-        properties.put(key, value);
-    }
-
-    public void addProperties(final Map<String, String> properties) {
-        this.properties.putAll(properties);
-    }
-
-    /**
-     * return a mapping of name to property value
-     *
-     * @return the mapping of values as an unmodifiable map
-     */
-    public Map<String, String> getProperties() {
-        return Collections.unmodifiableMap(properties);
-    }
-
-    /**
-     * get the index type
-     *
-     * @return The index type
-     */
-    protected abstract int getType();
-
-    /**
-     * returns the class for the index type
-     *
-     * @return a Class, from which a new instance can be created
-     */
-    public abstract Class getChrIndexClass();
-}
diff --git a/src/main/java/htsjdk/tribble/index/Block.java b/src/main/java/htsjdk/tribble/index/Block.java
deleted file mode 100644
index 15ac799..0000000
--- a/src/main/java/htsjdk/tribble/index/Block.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-/**
- * Represents a contiguous block of bytes in a file, defined by a start position and size (in bytes)
-*/
-public class Block {
-
-    private final long startPosition;
-    private long size;
-
-    /**
-     * @param startPosition  in bytes
-     * @param size in bytes
-     */
-    public Block(final long startPosition, final long size) {
-        this.startPosition = startPosition;
-        this.size = size;
-    }
-
-    /**
-     * @return the startPosition
-     */
-    public long getStartPosition() {
-        return startPosition;
-    }
-
-    public long getEndPosition() {
-        return startPosition + size;
-    }
-
-    /**
-     * This method is used to aid in consolidating blocks.
-     * Sets the size based on the provided {@code endPosition}
-     * @param endPosition Where the block ends, in bytes
-     */
-    public void setEndPosition(final long endPosition) {
-        if(endPosition < startPosition)
-            throw new IllegalArgumentException("Attempting to set block end position to " +
-                                                                           endPosition + " which is before the start of " + startPosition);
-        size = endPosition - startPosition;
-
-    }
-
-    /**
-     * @return the # of bytes in this block.  Note that for block-compressed files, this is not truly the
-     * size of the block in the file.  getEndPosition should be used to determine the virtual file offset
-     * of the end of the region of interest.
-     */
-    public long getSize() {
-        return size;
-    }
-
-    public boolean equals(final Object obj) {
-        if ( this == obj ) return true;
-        if ( ! (obj instanceof Block) ) return false;
-        final Block otherBlock = (Block)obj;
-        return this.startPosition == otherBlock.startPosition && this.size == otherBlock.size;
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/index/ChrIndex.java b/src/main/java/htsjdk/tribble/index/ChrIndex.java
deleted file mode 100644
index b1582ea..0000000
--- a/src/main/java/htsjdk/tribble/index/ChrIndex.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Represents an index on a specific chromosome
- */
-
-public interface ChrIndex {
-
-    public String getName();
-
-    /**
-     * @return all blocks in ChrIndex
-     */
-    List<Block> getBlocks();
-
-    /**
-     * @param start the start position, one based
-     * @param end   the end position, one based
-     * @return a list of blocks that include the region defined from start to stop.  Can never return null
-     */
-    List<Block> getBlocks(int start, int end);
-
-    void write(LittleEndianOutputStream dos) throws IOException;
-
-    void read(LittleEndianInputStream dis) throws IOException;
-}
diff --git a/src/main/java/htsjdk/tribble/index/DynamicIndexCreator.java b/src/main/java/htsjdk/tribble/index/DynamicIndexCreator.java
deleted file mode 100644
index 52153a5..0000000
--- a/src/main/java/htsjdk/tribble/index/DynamicIndexCreator.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (c) 2010, The Broad Institute
- *
- * 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 AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble.index;
-
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.index.interval.IntervalIndexCreator;
-import htsjdk.tribble.index.linear.LinearIndexCreator;
-import htsjdk.tribble.util.MathUtils;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.TreeMap;
-
-
-/**
- * A DynamicIndexCreator creates the proper index based on an {@link IndexFactory.IndexBalanceApproach} and
- * the characteristics of the file.  Ultimately this is either a LinearIndex or an IntervalTreeIndex, with index
- * parameters based on whether seek time or file size is to be minimized.
- */
-public class DynamicIndexCreator extends TribbleIndexCreator {
-    IndexFactory.IndexBalanceApproach iba;
-    Map<IndexFactory.IndexType,TribbleIndexCreator> creators;
-
-    /**
-     * we're interested in two stats:
-     * the longest feature and the density of features
-      */
-    int longestFeatureLength = 0;
-    long featureCount = 0;
-
-    MathUtils.RunningStat stats = new MathUtils.RunningStat();
-    long basesSeen = 0;
-    Feature lastFeature = null;
-    File inputFile;
-
-    public DynamicIndexCreator(final File inputFile, final IndexFactory.IndexBalanceApproach iba) {
-        this.iba = iba;
-        // get a list of index creators
-        this.inputFile = inputFile;
-        creators = getIndexCreators(inputFile,iba);
-    }
-
-    public Index finalizeIndex(final long finalFilePosition) {
-        // finalize all of the indexes
-        // return the score of the indexes we've generated
-        final Map<Double,TribbleIndexCreator> mapping = scoreIndexes((double)featureCount/(double)basesSeen, creators, longestFeatureLength, iba);
-        final TribbleIndexCreator creator = getMinIndex(mapping, this.iba);
-
-        for (final Map.Entry<String, String> entry : properties.entrySet()) {
-            creator.addProperty(entry.getKey(), entry.getValue());
-        }
-
-        // add our statistics to the file
-        creator.addProperty("FEATURE_LENGTH_MEAN",String.valueOf(stats.mean()));
-        creator.addProperty("FEATURE_LENGTH_STD_DEV",String.valueOf(stats.standardDeviation()));
-        creator.addProperty("MEAN_FEATURE_VARIANCE",String.valueOf(stats.variance()));
-
-        // add the feature count
-        creator.addProperty("FEATURE_COUNT",String.valueOf(featureCount));
-
-        // Now let's finalize and create the index itself
-        return creator.finalizeIndex(finalFilePosition);
-    }
-
-    /**
-     * create a list of index creators (initialized) representing the common index types we'd suspect they'd like to use
-     * @param inputFile the input file to use to create the indexes
-     * @return a map of index type to the best index for that balancing approach
-     */
-    private Map<IndexFactory.IndexType,TribbleIndexCreator> getIndexCreators(final File inputFile, final IndexFactory.IndexBalanceApproach iba) {
-        final Map<IndexFactory.IndexType,TribbleIndexCreator> creators = new HashMap<IndexFactory.IndexType,TribbleIndexCreator>();
-
-        if (iba == IndexFactory.IndexBalanceApproach.FOR_SIZE) {
-            // add a linear index with the default bin size
-            final LinearIndexCreator linearNormal = new LinearIndexCreator(inputFile, LinearIndexCreator.DEFAULT_BIN_WIDTH);
-            creators.put(IndexFactory.IndexType.LINEAR,linearNormal);
-
-            // create a tree index with the default size
-            final IntervalIndexCreator treeNormal = new IntervalIndexCreator(inputFile, IntervalIndexCreator.DEFAULT_FEATURE_COUNT);
-            creators.put(IndexFactory.IndexType.INTERVAL_TREE,treeNormal);
-        }
-
-        // this section is a little more arbitrary; we're creating indexes with a bin size that's a portion of the default; these
-        // values were determined experimentally
-        if (iba == IndexFactory.IndexBalanceApproach.FOR_SEEK_TIME) {
-            // create a linear index with a small bin size
-            final LinearIndexCreator linearSmallBin =
-                    new LinearIndexCreator(inputFile, Math.max(200, LinearIndexCreator.DEFAULT_BIN_WIDTH / 4));
-            creators.put(IndexFactory.IndexType.LINEAR,linearSmallBin);
-
-            // create a tree index with a small index size
-            final IntervalIndexCreator treeSmallBin =
-                    new IntervalIndexCreator(inputFile, Math.max(20, IntervalIndexCreator.DEFAULT_FEATURE_COUNT / 8));
-            creators.put(IndexFactory.IndexType.INTERVAL_TREE,treeSmallBin);
-        }
-
-        return creators;
-    }
-
-
-    public void addFeature(final Feature f, final long filePosition) {
-        // protected static Map<Double,Index> createIndex(FileBasedFeatureIterator<Feature> iterator, Map<IndexType,IndexCreator> creators, IndexBalanceApproach iba) {
-        // feed each feature to the indexes we've created
-        // first take care of the stats
-        featureCount++;
-
-        // calculate the number of bases seen - we have to watch out for the situation where the last record was on the previous chromosome
-        basesSeen = (lastFeature == null) ? basesSeen + f.getStart() :
-                ((f.getStart() - lastFeature.getStart() >= 0) ? basesSeen + (f.getStart() - lastFeature.getStart()) : basesSeen + f.getStart());
-
-        longestFeatureLength = Math.max(longestFeatureLength,(f.getEnd()-f.getStart()) + 1);
-
-        // push the longest feature to the running stats
-        stats.push(longestFeatureLength);
-
-        // now feed the feature to each of our creators
-        for (final IndexCreator creator : creators.values()) {
-            creator.addFeature(f,filePosition);
-        }
-
-        //Redundant check, done in IndexFactory
-        // if the last feature is after the current feature, exception out
-//        if (lastFeature != null && f.getStart() < lastFeature.getStart() && lastFeature.getChr().equals(f.getChr()))
-//            throw new TribbleException.MalformedFeatureFile("We saw a record with a start of " + f.getChr() + ":" + f.getStart() +
-//                    " after a record with a start of " + lastFeature.getChr() + ":" + lastFeature.getStart(), inputFile.getAbsolutePath());
-
-        // save the last feature
-        lastFeature = f;
-    }
-
-    /**
-     * score the available indexes for the specified density and feature lengths
-     *
-     * The scoring method is trying to determine how many features would be returned for a sample one base query; or:
-     * (features/seek).  For the interval index this is clear: it's the bin size (interval is binned by feature count).
-     * for Linear indexes it's the density of features X the number of bins we need to retrieve (which is determined
-     * by the bin size X the longest feature).
-     *
-     * @param densityOfFeatures the density of features (features/base)
-     * @param indexes Map from IndexType -> IndexCreator
-     * @param longestFeature the longest feature we've found
-     * @param iba the index balancing approach
-     * @return the best index available for the target indexes
-     */
-    protected static LinkedHashMap<Double,TribbleIndexCreator> scoreIndexes(final double densityOfFeatures, final Map<IndexFactory.IndexType,TribbleIndexCreator> indexes, final int longestFeature, final IndexFactory.IndexBalanceApproach iba) {
-        if (indexes.size() < 1) throw new IllegalArgumentException("Please specify at least one index to evaluate");
-
-        final LinkedHashMap<Double,TribbleIndexCreator> scores = new LinkedHashMap<Double,TribbleIndexCreator>();
-
-        for (final Map.Entry<IndexFactory.IndexType,TribbleIndexCreator> entry : indexes.entrySet()) {
-            // we have different scoring
-            if (entry.getValue() instanceof LinearIndexCreator) {
-                final double binSize = ((LinearIndexCreator)(entry.getValue())).getBinSize();
-                scores.put(binSize * densityOfFeatures * Math.ceil((double) longestFeature / binSize), entry.getValue());
-            } else if (entry.getValue() instanceof IntervalIndexCreator) {
-                scores.put((double) ((IntervalIndexCreator)entry.getValue()).getFeaturesPerInterval(), entry.getValue());
-            } else {
-                throw new TribbleException.UnableToCreateCorrectIndexType("Unknown index type, we don't have a scoring method for " + entry.getValue().getClass());
-            }
-        }
-        return scores;
-    }
-
-    /**
-     * utility function to find the min of a list
-     * @param scores the list of scaled features/bin scores for each index type
-     * @return the best score <b>index value</b>
-     */
-    private TribbleIndexCreator getMinIndex(final Map<Double,TribbleIndexCreator> scores, final IndexFactory.IndexBalanceApproach iba) {
-        final TreeMap<Double,TribbleIndexCreator> map = new TreeMap<Double,TribbleIndexCreator>();
-        map.putAll(scores);
-        
-        // if we are optimizing for seek time, choose the lowest score (adjusted features/bin value), if for storage size, choose the opposite
-        final TribbleIndexCreator idx = (iba != IndexFactory.IndexBalanceApproach.FOR_SEEK_TIME) ? map.get(map.lastKey()) : map.get(map.firstKey());
-        return idx;
-    }
-
-    @Override
-    public void addProperty(final String key, final String value) {
-        for (final TribbleIndexCreator creator : creators.values()) {
-            creator.addProperty(key, value);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/index/Index.java b/src/main/java/htsjdk/tribble/index/Index.java
deleted file mode 100644
index ca6cc60..0000000
--- a/src/main/java/htsjdk/tribble/index/Index.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Interface for all index implementations.
- * An index file is used for efficient lookup of features from a feature file;
- * and Index represents that index file.
- */
-public interface Index {
-    /**
-     * Query the index.
-     * @param chr the chromosome
-     * @param start the start position
-     * @param end the end position
-     * @return a list of blocks that contain the specified interval.  Can never return null
-     * @throws IllegalArgumentException of chr isn't part of this index
-     */
-    List<Block> getBlocks(String chr, int start, int end);
-
-    /**
-     * @return true if the index is up to date, false otherwise
-     */
-    public boolean isCurrentVersion();
-
-    /**
-     * @return a list of the sequence names we've seen during indexing, in order
-     */
-    List<String> getSequenceNames();
-
-    /**
-     * @param chr the chromosome (or contig) name
-     * @return true if we have an entry; false otherwise
-     */
-    public boolean containsChromosome(final String chr);
-
-    /**
-     * all indexes are writable to disk
-     * @param stream the stream to write the index to.  Caller must close after invocation.
-     * @throws IOException if the index is unable to write to the specified location
-     */
-    public void write(LittleEndianOutputStream stream) throws IOException;
-
-    /**
-     * Writes the index into a file.
-     *
-     * @param idxFile Where to write the index.
-     * @throws IOException if the index is unable to write to the specified file
-     */
-    public void write(final File idxFile) throws IOException;
-
-    /**
-     * Write an appropriately named and located Index file based on the name and location of the featureFile.
-     * If featureFile is not a normal file, the index will silently not be written.
-     * @param featureFile
-     */
-    public void writeBasedOnFeatureFile(File featureFile) throws IOException;
-
-    /**
-     * @return get the list of properties for this index.  Returns null if no properties.
-     */
-    public Map<String,String> getProperties();
-
-    /**
-     * Returns true if this and obj are 'effectively' equivalent indices.  Ignores the
-     * time stamp on the file, as this may not be the same for even identical indices
-     * @param obj
-     * @return
-     */
-    public boolean equalsIgnoreProperties(Object obj);
-}
diff --git a/src/main/java/htsjdk/tribble/index/IndexCreator.java b/src/main/java/htsjdk/tribble/index/IndexCreator.java
deleted file mode 100644
index c90ec9f..0000000
--- a/src/main/java/htsjdk/tribble/index/IndexCreator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.tribble.Feature;
-
-/**
- *
- * An interface for creating indexes
- *
- * @author jrobinso
- */                                                                           
-public interface IndexCreator {
-    /**
-     * Add a feature to the index
-     * @param feature the feature, of which start, end, and contig must be filled in
-     * @param filePosition the current file position, at the beginning of the specified feature
-     */
-    public void addFeature(Feature feature, long filePosition);
-
-    /**
-     * Create the index, given the stream of features passed in to this point
-     * @param finalFilePosition the final file position, for indexes that have to close out with the final position
-     * @return an index object
-     */
-    public Index finalizeIndex(long finalFilePosition);
-
-    /**
-     * Set the sequence dictionary for the index. Default implementation does nothing.
-     * @param dict the dictionary to add to the index.
-     */
-    public default void setIndexSequenceDictionary(final SAMSequenceDictionary dict) { }
-}
-
-
diff --git a/src/main/java/htsjdk/tribble/index/IndexFactory.java b/src/main/java/htsjdk/tribble/index/IndexFactory.java
deleted file mode 100644
index 4e23e93..0000000
--- a/src/main/java/htsjdk/tribble/index/IndexFactory.java
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.seekablestream.ISeekableStreamFactory;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.BlockCompressedStreamConstants;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.tribble.*;
-import htsjdk.tribble.index.interval.IntervalIndexCreator;
-import htsjdk.tribble.index.interval.IntervalTreeIndex;
-import htsjdk.tribble.index.linear.LinearIndex;
-import htsjdk.tribble.index.linear.LinearIndexCreator;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.index.tabix.TabixIndex;
-import htsjdk.tribble.index.tabix.TabixIndexCreator;
-import htsjdk.tribble.readers.PositionalBufferedStream;
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.tribble.util.TabixUtils;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Constructor;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.zip.GZIPInputStream;
-
-/**
- * Factory class for creating indexes.  It is the responsibility of this class to determine and create the
- * correct index type from the input file or stream.  Only LinearIndex and IntervalTreeIndex are supported
- * by this factory.
- */
-public class IndexFactory {
-    /** We can optimize index-file-creation for different factors. As of this writing, those are index-file size or seeking time. */
-    public enum IndexBalanceApproach {
-        FOR_SIZE,
-        FOR_SEEK_TIME
-    }
-
-    /**
-     * an enum that contains all of the information about the index types, and how to create them
-     */
-    public enum IndexType {
-        LINEAR(LinearIndex.MAGIC_NUMBER, LinearIndex.INDEX_TYPE, LinearIndexCreator.class, LinearIndex.class, LinearIndexCreator.DEFAULT_BIN_WIDTH),
-        INTERVAL_TREE(IntervalTreeIndex.MAGIC_NUMBER, IntervalTreeIndex.INDEX_TYPE, IntervalIndexCreator.class, IntervalTreeIndex.class, IntervalIndexCreator.DEFAULT_FEATURE_COUNT),
-        // Tabix index initialization requires additional information, so generic construction won't work, thus indexCreatorClass is null.
-        TABIX(TabixIndex.MAGIC_NUMBER, null, null, TabixIndex.class, -1);
-
-        private final int magicNumber;
-        private final Integer tribbleIndexType;
-        private final Class<IndexCreator> indexCreatorClass;
-        private final int defaultBinSize;
-        private final Class<Index> indexType;
-
-        public int getDefaultBinSize() {
-            return defaultBinSize;
-        }
-
-        public IndexCreator getIndexCreator() {
-            try {
-                return indexCreatorClass.newInstance();
-            } catch ( final InstantiationException e ) {
-                throw new TribbleException("Couldn't make index creator in " + this, e);
-            } catch ( final IllegalAccessException e ) {
-                throw new TribbleException("Couldn't make index creator in " + this, e);
-            }
-        }
-
-        public boolean canCreate() {
-            return indexCreatorClass != null;
-        }
-
-        IndexType(final int magicNumber, final Integer tribbleIndexType, final Class creator, final Class indexClass, final int defaultBinSize) {
-            this.magicNumber = magicNumber;
-            this.tribbleIndexType = tribbleIndexType;
-            indexCreatorClass = creator;
-            indexType = indexClass;
-            this.defaultBinSize = defaultBinSize;
-        }
-
-        public Integer getTribbleIndexType() {
-            return tribbleIndexType;
-        }
-
-        public Class<Index> getIndexType() {
-            return indexType;
-        }
-
-        public int getMagicNumber() { return magicNumber; }
-
-        /**
-         *
-         * @param is InputStream of index.  This will be reset to location it was at when method was invoked.
-         * @return The {@code IndexType} based on the {@code headerValue}
-         * @throws TribbleException.UnableToCreateCorrectIndexType
-         */
-        public static IndexType getIndexType(final BufferedInputStream is) {
-            // Currently only need 8 bytes, so this should be plenty
-            is.mark(128);
-            final LittleEndianInputStream dis = new LittleEndianInputStream(is);
-            final int magicNumber;
-            final int type;
-
-            try {
-                // Read the type and version,  then create the appropriate type
-                magicNumber = dis.readInt();
-                // This is not appropriate for all types, but it doesn't hurt to read it.
-                type = dis.readInt();
-                is.reset();
-
-                for (final IndexType indexType : IndexType.values()) {
-                    if (indexType.magicNumber == magicNumber &&
-                            (indexType.tribbleIndexType == null || indexType.tribbleIndexType == type)) {
-                        return indexType;
-                    }
-                }
-            } catch (final IOException e) {
-                throw new TribbleException("Problem detecting index type", e);
-            }
-
-            throw new TribbleException.UnableToCreateCorrectIndexType(
-                    String.format("Unknown index type.  magic number: 0x%x; type %d", magicNumber, type));
-        }
-    }
-
-
-    /**
-     * Load in index from the specified file.   The type of index (LinearIndex or IntervalTreeIndex) is determined
-     * at run time by reading the type flag in the file.
-     *
-     * @param indexFile from which to load the index
-     */
-    public static Index loadIndex(final String indexFile) {
-        // Must be buffered, because getIndexType uses mark and reset
-        try (BufferedInputStream bufferedInputStream = new BufferedInputStream(indexFileInputStream(indexFile), Defaults.NON_ZERO_BUFFER_SIZE)){
-            final Class<Index> indexClass = IndexType.getIndexType(bufferedInputStream).getIndexType();
-            final Constructor<Index> ctor = indexClass.getConstructor(InputStream.class);
-            return ctor.newInstance(bufferedInputStream);
-        } catch (final IOException ex) {
-            throw new TribbleException.UnableToReadIndexFile("Unable to read index file", indexFile, ex);
-        } catch (final Exception ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
-    private static InputStream indexFileInputStream(final String indexFile) throws IOException {
-        final InputStream inputStreamInitial = ParsingUtils.openInputStream(indexFile);
-        if (indexFile.endsWith(".gz")) {
-            return new GZIPInputStream(inputStreamInitial);
-        }
-        else if (indexFile.endsWith(TabixUtils.STANDARD_INDEX_EXTENSION)) {
-            return new BlockCompressedInputStream(inputStreamInitial);
-        }
-        else {
-            return inputStreamInitial;
-        }
-    }
-
-    /**
-     * a helper method for creating a linear binned index with default bin size
-     *
-     * @param inputFile the input file to load features from
-     * @param codec     the codec to use for decoding records
-     */
-    public static LinearIndex createLinearIndex(final File inputFile, final FeatureCodec codec) {
-        return createLinearIndex(inputFile, codec, LinearIndexCreator.DEFAULT_BIN_WIDTH);
-    }
-
-    /**
-     * a helper method for creating a linear binned index
-     *
-     * @param inputFile the input file to load features from
-     * @param codec     the codec to use for decoding records
-     * @param binSize   the bin size
-     */
-    public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> LinearIndex createLinearIndex(final File inputFile,
-                                                                                      final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
-                                                                                      final int binSize) {
-        final LinearIndexCreator indexCreator = new LinearIndexCreator(inputFile, binSize);
-        return (LinearIndex)createIndex(inputFile, new FeatureIterator<FEATURE_TYPE, SOURCE_TYPE>(inputFile, codec), indexCreator);
-    }
-
-    /**
-     * create an interval-tree index with the default features per bin count
-     *
-     * @param inputFile the file containing the features
-     * @param codec to decode the features
-     */
-    public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> IntervalTreeIndex createIntervalIndex(final File inputFile,
-                                                                                        final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec) {
-        return createIntervalIndex(inputFile, codec, IntervalIndexCreator.DEFAULT_FEATURE_COUNT);
-    }
-
-
-    /**
-     * a helper method for creating an interval-tree index
-     *
-     * @param inputFile the input file to load features from
-     * @param codec     the codec to use for decoding records
-     * @param featuresPerInterval
-     */
-    public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> IntervalTreeIndex createIntervalIndex(final File inputFile,
-                                                                                        final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
-                                                                                        final int featuresPerInterval) {
-        final IntervalIndexCreator indexCreator = new IntervalIndexCreator(inputFile, featuresPerInterval);
-        return (IntervalTreeIndex)createIndex(inputFile, new FeatureIterator<FEATURE_TYPE, SOURCE_TYPE>(inputFile, codec), indexCreator);
-    }
-
-    /**
-     * Create a dynamic index with the default balancing approach
-     *
-     * @param inputFile the input file to load features from
-     * @param codec     the codec to use for decoding records
-     */
-    public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> Index createDynamicIndex(final File inputFile, final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec) {
-        return createDynamicIndex(inputFile, codec, IndexBalanceApproach.FOR_SEEK_TIME);
-    }
-
-    /**
-     * Create a index of the specified type with default binning parameters
-     *
-     * @param inputFile the input file to load features from
-     * @param codec     the codec to use for decoding records
-     * @param type      the type of index to create
-     */
-    public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> Index createIndex(final File inputFile,
-                                                                                final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
-                                                                                final IndexType type) {
-        return createIndex(inputFile, codec, type, null);
-    }
-
-    /**
-     * Create an index of the specified type with default binning parameters
-     *
-     * @param inputFile the input file to load features from
-     * @param codec     the codec to use for decoding records
-     * @param type      the type of index to create
-     * @param sequenceDictionary May be null, but if present may reduce memory footprint for tabix index creation
-     */
-    public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> Index createIndex(final File inputFile,
-                                                                                final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
-                                                                                final IndexType type,
-                                                                                final SAMSequenceDictionary sequenceDictionary) {
-        switch (type) {
-            case INTERVAL_TREE: return createIntervalIndex(inputFile, codec);
-            case LINEAR:        return createLinearIndex(inputFile, codec);
-            case TABIX:         return createTabixIndex(inputFile, codec, sequenceDictionary);
-        }
-        throw new IllegalArgumentException("Unrecognized IndexType " + type);
-    }
-
-    /**
-     * Write the index to a file; little endian.
-     * @param idx
-     * @param idxFile
-     * @throws IOException
-     * @deprecated use {@link Index#write(File)} instead
-     */
-    @Deprecated
-    public static void writeIndex(final Index idx, final File idxFile) throws IOException {
-        idx.write(idxFile);
-    }
-
-    /**
-     * create a dynamic index, given an input file, codec, and balance approach
-     *
-     * @param inputFile the input file to load features from
-     * @param codec     the codec to use for decoding records
-     * @param iba       the index balancing approach
-     */
-    public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> Index createDynamicIndex(final File inputFile,
-                                                                                       final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
-                                                                                       final IndexBalanceApproach iba) {
-        // get a list of index creators
-        final DynamicIndexCreator indexCreator = new DynamicIndexCreator(inputFile, iba);
-        return createIndex(inputFile, new FeatureIterator<FEATURE_TYPE, SOURCE_TYPE>(inputFile, codec), indexCreator);
-    }
-
-    /**
-     * @param inputFile The file to be indexed.
-     * @param codec Mechanism for reading inputFile.
-     * @param tabixFormat Header fields for TabixIndex to be produced.
-     * @param sequenceDictionary May be null, but if present may reduce memory footprint for index creation.  Features
-     *                           in inputFile must be in the order defined by sequenceDictionary, if it is present.
-     */
-    public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> TabixIndex createTabixIndex(final File inputFile,
-                                                                                     final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
-                                                                                     final TabixFormat tabixFormat,
-                                                                                     final SAMSequenceDictionary sequenceDictionary) {
-        final TabixIndexCreator indexCreator = new TabixIndexCreator(sequenceDictionary, tabixFormat);
-        return (TabixIndex)createIndex(inputFile, new FeatureIterator<FEATURE_TYPE, SOURCE_TYPE>(inputFile, codec), indexCreator);
-    }
-
-    /**
-     * @param inputFile The file to be indexed.
-     * @param codec the codec to use for decoding records
-     * @param sequenceDictionary May be null, but if present may reduce memory footprint for index creation.  Features
-     *                           in inputFile must be in the order defined by sequenceDictionary, if it is present.
-     *
-     */
-    public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> TabixIndex createTabixIndex(final File inputFile,
-            final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
-            final SAMSequenceDictionary sequenceDictionary) {
-        return createTabixIndex(inputFile, codec, codec.getTabixFormat(), sequenceDictionary);
-    }
-
-    private static Index createIndex(final File inputFile, final FeatureIterator iterator, final IndexCreator creator) {
-        Feature lastFeature = null;
-        Feature currentFeature;
-        final Map<String, Feature> visitedChromos = new HashMap<String, Feature>(40);
-        while (iterator.hasNext()) {
-            final long position = iterator.getPosition();
-            currentFeature = iterator.next();
-
-            checkSorted(inputFile, lastFeature, currentFeature);
-            //should only visit chromosomes once
-            final String curChr = currentFeature.getContig();
-            final String lastChr = lastFeature != null ? lastFeature.getContig() : null;
-            if(!curChr.equals(lastChr)){
-                if(visitedChromos.containsKey(curChr)){
-                    String msg = "Input file must have contiguous chromosomes.";
-                    msg += " Saw feature " + featToString(visitedChromos.get(curChr));
-                    msg += " followed later by " + featToString(lastFeature);
-                    msg += " and then " + featToString(currentFeature);
-                    throw new TribbleException.MalformedFeatureFile(msg, inputFile.getAbsolutePath());
-                }else{
-                    visitedChromos.put(curChr, currentFeature);
-                }
-            }
-
-            creator.addFeature(currentFeature, position);
-
-            lastFeature = currentFeature;
-        }
-
-        iterator.close();
-        return creator.finalizeIndex(iterator.getPosition());
-    }
-
-    private static String featToString(final Feature feature){
-        return feature.getContig() + ":" + feature.getStart() + "-" + feature.getEnd();
-    }
-
-    private static void checkSorted(final File inputFile, final Feature lastFeature, final Feature currentFeature){
-        // if the last currentFeature is after the current currentFeature, exception out
-        if (lastFeature != null && currentFeature.getStart() < lastFeature.getStart() && lastFeature.getContig().equals(currentFeature.getContig()))
-            throw new TribbleException.MalformedFeatureFile("Input file is not sorted by start position. \n" +
-                    "We saw a record with a start of " + currentFeature.getContig() + ":" + currentFeature.getStart() +
-                    " after a record with a start of " + lastFeature.getContig() + ":" + lastFeature.getStart(), inputFile.getAbsolutePath());
-    }
-
-
-    /**
-     * Iterator for reading features from a file, given a {@code FeatureCodec}.
-     */
-    static class FeatureIterator<FEATURE_TYPE extends Feature, SOURCE> implements CloseableTribbleIterator<Feature> {
-        // the stream we use to get features
-        private final SOURCE source;
-        // the next feature
-        private Feature nextFeature;
-        // our codec
-        private final FeatureCodec<FEATURE_TYPE, SOURCE> codec;
-        private final File inputFile;
-
-        // we also need cache our position
-        private long cachedPosition;
-
-        /**
-         *
-         * @param inputFile The file from which to read. Stream for reading is opened on construction.
-         * @param codec
-         */
-        public FeatureIterator(final File inputFile, final FeatureCodec<FEATURE_TYPE, SOURCE> codec) {
-            this.codec = codec;
-            this.inputFile = inputFile;
-            final FeatureCodecHeader header = readHeader();
-            source = (SOURCE) codec.makeIndexableSourceFromStream(initStream(inputFile, header.getHeaderEnd()));
-            readNextFeature();
-        }
-
-        /**
-         * Some codecs,  e.g. VCF files,  need the header to decode features.  This is a rather poor design,
-         * the internal header is set as a side-affect of reading it, but we have to live with it for now.
-         */
-        private FeatureCodecHeader readHeader() {
-            try {
-                final SOURCE source = this.codec.makeSourceFromStream(initStream(inputFile, 0));
-                final FeatureCodecHeader header = this.codec.readHeader(source);
-                codec.close(source);
-                return header;
-            } catch (final IOException e) {
-                throw new TribbleException.InvalidHeader("Error reading header " + e.getMessage());
-            }
-        }
-
-        private PositionalBufferedStream initStream(final File inputFile, final long skip) {
-            try {
-                final FileInputStream fileStream = new FileInputStream(inputFile);
-                final InputStream is;
-
-                // if this looks like a block compressed file and it in fact is, we will use it
-                // otherwise we will use the file as is
-                if (AbstractFeatureReader.hasBlockCompressedExtension(inputFile)) {
-                    // make a buffered stream to test that this is in fact a valid block compressed file
-                    final int bufferSize = Math.max(Defaults.BUFFER_SIZE, BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE);
-                    final BufferedInputStream bufferedStream = new BufferedInputStream(fileStream, bufferSize);
-
-                    if (!BlockCompressedInputStream.isValidFile(bufferedStream)) {
-                        throw new TribbleException.MalformedFeatureFile("Input file is not in valid block compressed format.", inputFile.getAbsolutePath());
-                    }
-
-                    final ISeekableStreamFactory ssf = SeekableStreamFactory.getInstance();
-                    // if we got here, the file is valid, make a SeekableStream for the BlockCompressedInputStream to read from
-                    final SeekableStream seekableStream =
-                            ssf.getBufferedStream(ssf.getStreamFor(inputFile.getAbsolutePath()));
-                    is = new BlockCompressedInputStream(seekableStream);
-                }
-                else {
-                    is = fileStream;
-                }
-
-                final PositionalBufferedStream pbs = new PositionalBufferedStream(is);
-
-                if ( skip > 0 ) pbs.skip(skip);
-                return pbs;
-            } catch (final FileNotFoundException e) {
-                throw new TribbleException.FeatureFileDoesntExist("Unable to open the input file, most likely the file doesn't exist.", inputFile.getAbsolutePath());
-            } catch (final IOException e) {
-                throw new TribbleException.MalformedFeatureFile("Error initializing stream", inputFile.getAbsolutePath(), e);
-            }
-        }
-
-        public boolean hasNext() {
-            return nextFeature != null;
-        }
-
-        public Feature next() {
-            final Feature ret = nextFeature;
-            readNextFeature();
-            return ret;
-        }
-
-        /**
-         * @throws UnsupportedOperationException
-         */
-        public void remove() {
-            throw new UnsupportedOperationException("We cannot remove");
-        }
-
-
-        /**
-         * @return the file position from the underlying reader
-         */
-        public long getPosition() {
-            return (hasNext()) ? cachedPosition : ((LocationAware) source).getPosition();
-        }
-
-        @Override
-        public Iterator<Feature> iterator() {
-            return this;
-        }
-
-        @Override
-        public void close() {
-            codec.close(source);
-        }
-
-        /**
-         * Read the next feature from the stream
-         * @throws TribbleException.MalformedFeatureFile
-         */
-        private void readNextFeature() {
-            cachedPosition = ((LocationAware) source).getPosition();
-            try {
-                nextFeature = null;
-                while (nextFeature == null && !codec.isDone(source)) {
-                    nextFeature = codec.decodeLoc(source);
-                }
-            } catch (final IOException e) {
-                throw new TribbleException.MalformedFeatureFile("Unable to read a line from the file", inputFile.getAbsolutePath(), e);
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/index/MutableIndex.java b/src/main/java/htsjdk/tribble/index/MutableIndex.java
deleted file mode 100644
index 425b996..0000000
--- a/src/main/java/htsjdk/tribble/index/MutableIndex.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import java.util.Map;
-
-/**
- * Some Index implementations can be modified in memory.  Also, properties do not make sense for all index types.
- * Only the relevant index implementations implement this interface.
- */
-public interface MutableIndex extends Index {
-    void addProperty(String key, String value);
-
-    void addProperties(Map<String, String> properties);
-}
diff --git a/src/main/java/htsjdk/tribble/index/TribbleIndexCreator.java b/src/main/java/htsjdk/tribble/index/TribbleIndexCreator.java
deleted file mode 100644
index f7385e8..0000000
--- a/src/main/java/htsjdk/tribble/index/TribbleIndexCreator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-
-import java.util.LinkedHashMap;
-
-/**
- * Base class for Tribble-specific index creators.
- */
-public abstract class TribbleIndexCreator implements IndexCreator {
-    // a constant we use for marking sequence dictionary entries in the Tribble index property list
-    private static final String SEQUENCE_DICTIONARY_PROPERTY_PREDICATE = "DICT:";
-
-    protected LinkedHashMap<String, String> properties = new LinkedHashMap<String, String>();
-
-    public void addProperty(final String key, final String value) {
-        properties.put(key, value);
-    }
-
-    /** Set the sequence dictionary entries for the index property list. */
-    @Override
-    public void setIndexSequenceDictionary(final SAMSequenceDictionary dict) {
-        for (final SAMSequenceRecord seq : dict.getSequences()) {
-            final String contig = SEQUENCE_DICTIONARY_PROPERTY_PREDICATE + seq.getSequenceName();
-            final String length = String.valueOf(seq.getSequenceLength());
-            addProperty(contig,length);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/index/interval/Interval.java b/src/main/java/htsjdk/tribble/index/interval/Interval.java
deleted file mode 100644
index 9d47877..0000000
--- a/src/main/java/htsjdk/tribble/index/interval/Interval.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.interval;
-
-import htsjdk.tribble.index.Block;
-
-
-/**
- *  Quick and dirty interval class
- *  Describes a genomic interval and where in a file information for that
- *  interval can be obtained
- */
-public class Interval implements Comparable {
-    /**
-     * Start of the interval in genomic coordinates -- this is exposed on purpose, getters have a significant
-     * performance penalty for this field.
-     */
-     final int start;
-
-    /**
-     * End of the interval in genomic coordinates -- this is exposed on purpose, getters have a significant
-     * performance penalty for this field.
-     */
-     final int end;
-
-    /**
-     * File block  (position, size) containing the data for this interval
-     */
-    private Block block;
-
-    public Interval(int start, int end) {
-        assert start <= end;
-        this.start = start;
-        this.end = end;
-    }
-
-
-    public Interval(int start, int end, Block block) {
-        assert start <= end;
-        this.start = start;
-        this.end = end;
-        this.block = block;
-    }
-
-
-    public boolean equals(Object other) {
-        if (this == other)
-            return true;
-        if (this.getClass().equals(other.getClass())) {
-            Interval otherInterval = (Interval) other;
-            return (this.start == otherInterval.start &&
-                    this.end == otherInterval.end);
-        }
-        return false;
-    }
-
-
-    public int hashCode() {
-        return start;
-    }
-
-
-    public int compareTo(Object o) {
-        Interval other = (Interval) o;
-        if (this.start < other.start)
-            return -1;
-        if (this.start > other.start)
-            return 1;
-
-        if (this.end < other.end)
-            return -1;
-        if (this.end > other.end)
-            return 1;
-
-        return 0;
-    }
-
-    public String toString() {
-        return "Interval[" + this.start + ", " + this.end + "]";
-    }
-
-
-    /**
-     * @return whether this interval overlaps the other.
-     */
-    public boolean overlaps(Interval other) {
-        return (this.start <= other.end &&
-                other.start <= this.end);
-    }
-
-
-    /**
-     * @return The file block for this interval
-     */
-    public Block getBlock() {
-        return block;
-    }
-}
-
diff --git a/src/main/java/htsjdk/tribble/index/interval/IntervalIndexCreator.java b/src/main/java/htsjdk/tribble/index/interval/IntervalIndexCreator.java
deleted file mode 100644
index e826eda..0000000
--- a/src/main/java/htsjdk/tribble/index/interval/IntervalIndexCreator.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.interval;
-
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.TribbleIndexCreator;
-import htsjdk.tribble.index.interval.IntervalTreeIndex.ChrIndex;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.LinkedList;
-
-/**
- * Creates interval indexes from a stream of features
- * @author jrobinso
- */
-public class IntervalIndexCreator extends TribbleIndexCreator {
-
-    public static int DEFAULT_FEATURE_COUNT = 600;
-
-    /**
-     * Maximum number of features stored per interval.
-     * @see #DEFAULT_FEATURE_COUNT
-     */
-    private int featuresPerInterval = DEFAULT_FEATURE_COUNT;
-
-    private final LinkedList<ChrIndex> chrList = new LinkedList<ChrIndex>();
-
-    /**
-     * Instance variable for the number of features we currently are storing in the interval
-     */
-    private int featureCount = 0;
-
-    private final ArrayList<MutableInterval> intervals = new ArrayList<MutableInterval>();
-
-    File inputFile;
-
-    public IntervalIndexCreator(final File inputFile, final int featuresPerInterval) {
-        this.inputFile = inputFile;
-        this.featuresPerInterval = featuresPerInterval;
-    }
-
-    public IntervalIndexCreator(final File inputFile) {
-        this(inputFile, DEFAULT_FEATURE_COUNT);
-    }
-
-    public void addFeature(final Feature feature, final long filePosition) {
-        // if we don't have a chrIndex yet, or if the last one was for the previous contig, create a new one
-        if (chrList.isEmpty() || !chrList.getLast().getName().equals(feature.getContig())) {
-            // if we're creating a new chrIndex (not the first), make sure to dump the intervals to the old chrIndex
-            if (!chrList.isEmpty())
-                addIntervalsToLastChr(filePosition);
-
-            // create a new chr index for the current contig
-            chrList.add(new ChrIndex(feature.getContig()));
-            intervals.clear();
-        }
-
-        // if we're about to overflow the current bin, make a new one
-        if (featureCount >= featuresPerInterval || intervals.isEmpty()) {
-            final MutableInterval i = new MutableInterval();
-            i.setStart(feature.getStart());
-            i.setStartFilePosition(filePosition);
-            if(!intervals.isEmpty()) intervals.get(intervals.size()-1).setEndFilePosition(filePosition);
-            featureCount = 0; // reset the feature count
-            intervals.add(i);
-        }
-        
-        // make sure we update the ending position of the bin
-        intervals.get(intervals.size()-1).setStop(Math.max(feature.getEnd(),intervals.get(intervals.size()-1).getStop()));
-        featureCount++;
-    }
-
-    /**
-     * dump the intervals we have stored to the last chrList entry
-     * @param currentPos the current position, for the last entry in the interval list
-     */
-    private void addIntervalsToLastChr(final long currentPos) {
-        for (int x = 0; x < intervals.size(); x++) {
-            if (x == intervals.size()-1) intervals.get(x).setEndFilePosition(currentPos);
-            chrList.getLast().insert(intervals.get(x).toInterval());
-        }
-    }
-
-    /**
-     * finalize the index; create a tree index given the feature list passed in so far
-     * @param finalFilePosition the final file position, for indexes that have to close out with the final position
-     * @return a Tree Index
-     */
-    public Index finalizeIndex(final long finalFilePosition) {
-        final IntervalTreeIndex featureIndex = new IntervalTreeIndex(inputFile.getAbsolutePath());
-        // dump the remaining bins to the index
-        addIntervalsToLastChr(finalFilePosition);
-        featureIndex.setChrIndex(chrList);
-        featureIndex.addProperties(properties);
-        featureIndex.finalizeIndex();
-        return featureIndex;
-    }
-
-    public int getFeaturesPerInterval() {
-        return featuresPerInterval;
-    }
-}
-
-/**
- * The interval class isn't mutable; use this private class as a temporary storage until we're ready to make intervals
- */
-class MutableInterval {
-
-    // the start, the stop, and the start position
-    private int start;
-    private int stop;                                                                                                                                               
-    private long startFilePosition;
-    private long endFilePosition;
-
-    public void setStart(final int start) {
-        if (start < 0) throw new IllegalArgumentException("Start must be greater than 0!");
-        this.start = start;
-    }
-
-    public void setStop(final int stop) {
-        if (stop < 0) throw new IllegalArgumentException("Start must be greater than 0!");
-        this.stop = stop;
-    }
-
-    public void setStartFilePosition(final long startFilePosition) {
-        this.startFilePosition = startFilePosition;
-    }
-
-    public void setEndFilePosition(final long endFilePosition) {
-        this.endFilePosition = endFilePosition;
-    }
-
-    public Interval toInterval() {
-        return new Interval(start,stop,new Block(startFilePosition, endFilePosition - startFilePosition));
-    }
-
-    public int getStop() {
-        return stop;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/index/interval/IntervalTree.java b/src/main/java/htsjdk/tribble/index/interval/IntervalTree.java
deleted file mode 100644
index 855ade9..0000000
--- a/src/main/java/htsjdk/tribble/index/interval/IntervalTree.java
+++ /dev/null
@@ -1,551 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.interval;
-
-
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * An implementation of an interval tree, following the explanation.
- * from CLR. For efficiently finding all intervals which overlap a given
- * interval or point.
- * <p/>
- * References:
- * http://en.wikipedia.org/wiki/Interval_tree
- * <p/>
- * Cormen, Thomas H.; Leiserson, Charles E., Rivest, Ronald L. (1990). Introduction to Algorithms (1st ed.). MIT Press and McGraw-Hill. ISBN 0-262-03141-8
- */
-public class IntervalTree {
-
-    Node root;
-    Node NIL = Node.NIL;
-
-    /**
-     * See {@link #getSize()}
-     */
-    int size;
-
-    public IntervalTree() {
-        this.root = NIL;
-        this.size = 0;
-    }
-
-
-    public void insert(Interval interval) {
-        Node node = new Node(interval);
-        insert(node);
-        size++;
-    }
-
-    /**
-     * The estimated size of the tree. We keep a running count
-     * on each insert, this getter returns that count.
-     *
-     * @return
-     * @see #size()
-     */
-    public int getSize() {
-        return size;
-    }
-
-    /**
-     * @param interval
-     * @return all matches as a list of Intervals
-     */
-    public List<Interval> findOverlapping(Interval interval) {
-
-        if (root().isNull()) {
-            return Collections.emptyList();
-        }
-
-        List<Interval> results = new ArrayList<Interval>();
-        searchAll(interval, root(), results);
-        return results;
-    }
-
-    public String toString() {
-        return root().toString();
-    }
-
-    private List<Interval> searchAll(Interval interval, Node node, List<Interval> results) {
-        if (node.interval.overlaps(interval)) {
-            results.add(node.interval);
-        }
-        if (!node.left.isNull() && node.left.max >= interval.start) {
-            searchAll(interval, node.left, results);
-        }
-        if (!node.right.isNull() && node.right.min <= interval.end) {
-            searchAll(interval, node.right, results);
-        }
-        return results;
-    }
-
-    /**
-     * Return all intervals in tree.
-     * TODO: an iterator would be more effecient.
-     *
-     * @return
-     */
-    public List<Interval> getIntervals() {
-        if (root().isNull()) {
-            return Collections.emptyList();
-        }
-        List<Interval> results = new ArrayList<Interval>(size);
-        getAll(root(), results);
-        return results;
-    }
-
-    /**
-     * Get all nodes which are descendants of {@code node}, inclusive.
-     * {@code results} is modified in place
-     *
-     * @param node
-     * @param results
-     * @return the total list of descendants, including original {@code results}
-     */
-    private List<Interval> getAll(Node node, List<Interval> results) {
-
-        results.add(node.interval);
-        if (!node.left.isNull()) {
-            getAll(node.left, results);
-        }
-        if (!node.right.isNull()) {
-            getAll(node.right, results);
-        }
-        return results;
-    }
-
-
-    /**
-     * Used for testing only.
-     *
-     * @param node
-     * @return
-     */
-    private int getRealMax(Node node) {
-        if (node.isNull())
-            return Integer.MIN_VALUE;
-        int leftMax = getRealMax(node.left);
-        int rightMax = getRealMax(node.right);
-        int nodeHigh = (node.interval).end;
-
-        int max1 = (leftMax > rightMax ? leftMax : rightMax);
-        return (max1 > nodeHigh ? max1 : nodeHigh);
-    }
-
-    /**
-     * Used for testing only
-     *
-     * @param node
-     * @return
-     */
-    private int getRealMin(Node node) {
-        if (node.isNull())
-            return Integer.MAX_VALUE;
-
-        int leftMin = getRealMin(node.left);
-        int rightMin = getRealMin(node.right);
-        int nodeLow = (node.interval).start;
-
-        int min1 = (leftMin < rightMin ? leftMin : rightMin);
-        return (min1 < nodeLow ? min1 : nodeLow);
-    }
-
-
-    private void insert(Node x) {
-        assert (x != null);
-        assert (!x.isNull());
-
-        treeInsert(x);
-        x.color = Node.RED;
-        while (x != this.root && x.parent.color == Node.RED) {
-            if (x.parent == x.parent.parent.left) {
-                Node y = x.parent.parent.right;
-                if (y.color == Node.RED) {
-                    x.parent.color = Node.BLACK;
-                    y.color = Node.BLACK;
-                    x.parent.parent.color = Node.RED;
-                    x = x.parent.parent;
-                } else {
-                    if (x == x.parent.right) {
-                        x = x.parent;
-                        this.leftRotate(x);
-                    }
-                    x.parent.color = Node.BLACK;
-                    x.parent.parent.color = Node.RED;
-                    this.rightRotate(x.parent.parent);
-                }
-            } else {
-                Node y = x.parent.parent.left;
-                if (y.color == Node.RED) {
-                    x.parent.color = Node.BLACK;
-                    y.color = Node.BLACK;
-                    x.parent.parent.color = Node.RED;
-                    x = x.parent.parent;
-                } else {
-                    if (x == x.parent.left) {
-                        x = x.parent;
-                        this.rightRotate(x);
-                    }
-                    x.parent.color = Node.BLACK;
-                    x.parent.parent.color = Node.RED;
-                    this.leftRotate(x.parent.parent);
-                }
-            }
-        }
-        this.root.color = Node.BLACK;
-    }
-
-
-    private Node root() {
-        return this.root;
-    }
-
-
-    private void leftRotate(Node x) {
-        Node y = x.right;
-        x.right = y.left;
-        if (y.left != NIL) {
-            y.left.parent = x;
-        }
-        y.parent = x.parent;
-        if (x.parent == NIL) {
-            this.root = y;
-        } else {
-            if (x.parent.left == x) {
-                x.parent.left = y;
-            } else {
-                x.parent.right = y;
-            }
-        }
-        y.left = x;
-        x.parent = y;
-
-        applyUpdate(x);
-        // no need to apply update on y, since it'll y is an ancestor
-        // of x, and will be touched by applyUpdate().
-    }
-
-
-    private void rightRotate(Node x) {
-        Node y = x.left;
-        x.left = y.right;
-        if (y.right != NIL) {
-            y.right.parent = x;
-        }
-        y.parent = x.parent;
-        if (x.parent == NIL) {
-            this.root = y;
-        } else {
-            if (x.parent.right == x) {
-                x.parent.right = y;
-            } else {
-                x.parent.left = y;
-            }
-        }
-        y.right = x;
-        x.parent = y;
-
-
-        applyUpdate(x);
-        // no need to apply update on y, since it'll y is an ancestor
-        // of x, and will be touched by applyUpdate().
-    }
-
-
-    /**
-     * Note:  Does not maintain RB constraints,  this is done post insert
-     *
-     * @param x
-     */
-    private void treeInsert(Node x) {
-        Node node = this.root;
-        Node y = NIL;
-        while (node != NIL) {
-            y = node;
-            if (x.interval.start <= node.interval.start) {
-                node = node.left;
-            } else {
-                node = node.right;
-            }
-        }
-        x.parent = y;
-
-        if (y == NIL) {
-            this.root = x;
-            x.left = x.right = NIL;
-        } else {
-            if (x.interval.start <= y.interval.start) {
-                y.left = x;
-            } else {
-                y.right = x;
-            }
-        }
-
-        this.applyUpdate(x);
-    }
-
-
-    // Applies the statistic update on the node and its ancestors.
-
-    private void applyUpdate(Node node) {
-        while (!node.isNull()) {
-            this.update(node);
-            node = node.parent;
-        }
-    }
-
-    private void update(Node node) {
-        node.max = Math.max(Math.max(node.left.max, node.right.max), node.interval.end);
-        node.min = Math.min(Math.min(node.left.min, node.right.min), node.interval.start);
-    }
-
-    /**
-     * @return Returns the number of nodes in the tree.
-     * Recalculated each call
-     * @see #getSize()
-     */
-    public int size() {
-        return _size(this.root);
-    }
-
-
-    private int _size(Node node) {
-        if (node.isNull())
-            return 0;
-        return 1 + _size(node.left) + _size(node.right);
-    }
-
-
-    private boolean allRedNodesFollowConstraints(Node node) {
-        if (node.isNull())
-            return true;
-
-        if (node.color == Node.BLACK) {
-            return (allRedNodesFollowConstraints(node.left) &&
-                    allRedNodesFollowConstraints(node.right));
-        }
-
-        // At this point, we know we're on a RED node.
-        return (node.left.color == Node.BLACK &&
-                node.right.color == Node.BLACK &&
-                allRedNodesFollowConstraints(node.left) &&
-                allRedNodesFollowConstraints(node.right));
-    }
-
-
-    // Check that both ends are equally balanced in terms of black height.
-
-    private boolean isBalancedBlackHeight(Node node) {
-        if (node.isNull())
-            return true;
-        return (blackHeight(node.left) == blackHeight(node.right) &&
-                isBalancedBlackHeight(node.left) &&
-                isBalancedBlackHeight(node.right));
-    }
-
-
-    // The black height of a node should be left/right equal.
-
-    private int blackHeight(Node node) {
-        if (node.isNull())
-            return 0;
-        int leftBlackHeight = blackHeight(node.left);
-        if (node.color == Node.BLACK) {
-            return leftBlackHeight + 1;
-        } else {
-            return leftBlackHeight;
-        }
-    }
-
-
-    /**
-     * Test code: make sure that the tree has all the properties
-     * defined by Red Black trees and interval trees
-     * <p/>
-     * o.  Root is black.
-     * <p/>
-     * o.  NIL is black.
-     * <p/>
-     * o.  Red nodes have black children.
-     * <p/>
-     * o.  Every path from root to leaves contains the same number of
-     * black nodes.
-     * <p/>
-     * o.  getMax(node) is the maximum of any interval rooted at that node..
-     * <p/>
-     * This code is expensive, and only meant to be used for
-     * assertions and testing.
-     */
-    public boolean isValid() {
-        if (this.root.color != Node.BLACK) {
-            //logger.warn("root color is wrong");
-            return false;
-        }
-        if (NIL.color != Node.BLACK) {
-            //logger.warn("NIL color is wrong");
-            return false;
-        }
-        if (allRedNodesFollowConstraints(this.root) == false) {
-            //logger.warn("red node doesn't follow constraints");
-            return false;
-        }
-        if (isBalancedBlackHeight(this.root) == false) {
-            //logger.warn("black height unbalanced");
-            return false;
-        }
-
-        return hasCorrectMaxFields(this.root) &&
-                hasCorrectMinFields(this.root);
-    }
-
-
-    private boolean hasCorrectMaxFields(Node node) {
-        if (node.isNull())
-            return true;
-        return (getRealMax(node) == (node.max) &&
-                hasCorrectMaxFields(node.left) &&
-                hasCorrectMaxFields(node.right));
-    }
-
-
-    private boolean hasCorrectMinFields(Node node) {
-        if (node.isNull())
-            return true;
-        return (getRealMin(node) == (node.min) &&
-                hasCorrectMinFields(node.left) &&
-                hasCorrectMinFields(node.right));
-    }
-
-
-    static class Node {
-
-        public static boolean BLACK = false;
-        public static boolean RED = true;
-
-        Interval interval;
-        int min;
-        int max;
-        Node left;
-        Node right;
-
-        // Color and parent are used for inserts.  If tree is immutable these are not required (no requirement
-        // to store these persistently).
-        boolean color;
-        Node parent;
-
-
-        private Node() {
-            this.max = Integer.MIN_VALUE;
-            this.min = Integer.MAX_VALUE;
-        }
-
-        public void store(DataOutputStream dos) throws IOException {
-            dos.writeInt(interval.start);
-            dos.writeInt(interval.end);
-            dos.writeInt(min);
-            dos.writeInt(max);
-
-        }
-
-        public Node(Interval interval) {
-            this();
-            this.parent = NIL;
-            this.left = NIL;
-            this.right = NIL;
-            this.interval = interval;
-            this.color = RED;
-        }
-
-
-        static Node NIL;
-
-        static {
-            NIL = new Node();
-            NIL.color = BLACK;
-            NIL.parent = NIL;
-            NIL.left = NIL;
-            NIL.right = NIL;
-        }
-
-
-        public boolean isNull() {
-            return this == NIL;
-        }
-
-
-        public String toString() {
-
-            // Make some shorthand for the nodes
-            Map<Interval, Integer> keys = new LinkedHashMap<Interval, Integer>();
-
-            if (this == NIL) {
-                return "nil";
-            }
-
-            StringBuffer buf = new StringBuffer();
-            _toString(buf, keys);
-
-            buf.append('\n');
-            for (Map.Entry<Interval, Integer> entry : keys.entrySet()) {
-                buf.append(entry.getValue() + " = " + entry.getKey());
-                buf.append('\n');
-            }
-
-            return buf.toString();
-        }
-
-        public void _toString(StringBuffer buf, Map<Interval, Integer> keys) {
-            if (this == NIL) {
-                buf.append("nil");
-                buf.append('\n');
-                return;
-            }
-
-            Integer selfKey = keys.get(this.interval);
-            if (selfKey == null) {
-                selfKey = keys.size();
-                keys.put(this.interval, selfKey);
-            }
-            Integer leftKey = keys.get(this.left.interval);
-            if (leftKey == null) {
-                leftKey = keys.size();
-                keys.put(this.left.interval, leftKey);
-            }
-            Integer rightKey = keys.get(this.right.interval);
-            if (rightKey == null) {
-                rightKey = keys.size();
-                keys.put(this.right.interval, rightKey);
-            }
-
-
-            buf.append(selfKey + " -> " + leftKey + " , " + rightKey);
-            buf.append('\n');
-            this.left._toString(buf, keys);
-            this.right._toString(buf, keys);
-        }
-    }
-}
-
diff --git a/src/main/java/htsjdk/tribble/index/interval/IntervalTreeIndex.java b/src/main/java/htsjdk/tribble/index/interval/IntervalTreeIndex.java
deleted file mode 100644
index 055888e..0000000
--- a/src/main/java/htsjdk/tribble/index/interval/IntervalTreeIndex.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.interval;
-
-import htsjdk.tribble.index.AbstractIndex;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Index based on an interval tree
- *
- * @author jrobinso
- * @date Jul 9, 2010
- * @see IntervalTree
- */
-public class IntervalTreeIndex extends AbstractIndex {
-    public static final int INDEX_TYPE = IndexType.INTERVAL_TREE.fileHeaderTypeIdentifier;
-
-    /**
-     * Load from file.
-     *
-     * @param inputStream This method assumes that the input stream is already buffered as appropriate.  Caller
-     *                    should close after this object is constructed.
-     */
-    public IntervalTreeIndex(final InputStream inputStream) throws IOException {
-        final LittleEndianInputStream dis = new LittleEndianInputStream(inputStream);
-        validateIndexHeader(INDEX_TYPE, dis);
-        read(dis);
-    }
-
-    /**
-     * Prepare to build an index.
-     *
-     * @param featureFile File which we are indexing
-     */
-    public IntervalTreeIndex(final String featureFile) {
-        super(featureFile);
-    }
-
-    @Override
-    public Class getChrIndexClass() {
-        return ChrIndex.class;
-    }
-
-    @Override
-    protected int getType() {
-        return INDEX_TYPE;
-    }
-
-    /**
-     * Add a new interval to this index
-     *
-     * @param chr      Chromosome
-     * @param interval
-     */
-    public void insert(final String chr, final Interval interval) {
-        ChrIndex chrIdx = (ChrIndex) chrIndices.get(chr);
-        if (chrIdx == null) {
-            chrIdx = new ChrIndex(chr);
-            chrIndices.put(chr, chrIdx);
-        }
-        chrIdx.insert(interval);
-    }
-
-    protected void setChrIndex(final List<ChrIndex> indicies) {
-        for (final ChrIndex index : indicies) {
-            chrIndices.put(index.getName(), index);
-        }
-    }
-
-    public void printTree() {
-
-        for (final String chr : chrIndices.keySet()) {
-            System.out.println(chr + ":");
-            final ChrIndex chrIdx = (ChrIndex) chrIndices.get(chr);
-            chrIdx.printTree();
-            System.out.println();
-        }
-    }
-
-    public static class ChrIndex implements htsjdk.tribble.index.ChrIndex {
-
-        IntervalTree tree;
-        String name;
-
-        /**
-         * Default constructor needed for factory methods -- DO NOT REMOVE
-         */
-        public ChrIndex() {
-
-        }
-
-        public ChrIndex(final String name) {
-            this.name = name;
-            tree = new IntervalTree();
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public void insert(final Interval iv) {
-            tree.insert(iv);
-        }
-
-        public List<Block> getBlocks() {
-            return null;
-        }
-
-
-        public List<Block> getBlocks(final int start, final int end) {
-
-            // Get intervals and build blocks list
-            final List<Interval> intervals = tree.findOverlapping(new Interval(start, end));
-
-            // save time (and save throwing an exception) if the blocks are empty, return now
-            if (intervals == null || intervals.isEmpty()) return new ArrayList<Block>();
-
-            final Block[] blocks = new Block[intervals.size()];
-            int idx = 0;
-            for (final Interval iv : intervals) {
-                blocks[idx++] = iv.getBlock();
-            }
-
-            // Sort blocks by start position
-            Arrays.sort(blocks, new Comparator<Block>() {
-                public int compare(final Block b1, final Block b2) {
-                    // this is a little cryptic because the normal method (b1.getStartPosition() - b2.getStartPosition()) wraps in int space and we incorrectly sort the blocks in extreme cases
-                    return b1.getStartPosition() - b2.getStartPosition() < 1 ? -1 : (b1.getStartPosition() - b2.getStartPosition() > 1 ? 1 : 0);
-                }
-            });
-
-            // Consolidate blocks  that are close together
-            final List<Block> consolidatedBlocks = new ArrayList<Block>(blocks.length);
-            Block lastBlock = blocks[0];
-            consolidatedBlocks.add(lastBlock);
-            for (int i = 1; i < blocks.length; i++) {
-                final Block block = blocks[i];
-                if (block.getStartPosition() < (lastBlock.getEndPosition() + 1000)) {
-                    lastBlock.setEndPosition(block.getEndPosition());
-                } else {
-                    lastBlock = block;
-                    consolidatedBlocks.add(lastBlock);
-                }
-            }
-
-            return consolidatedBlocks;
-        }
-
-        public void printTree() {
-            System.out.println(tree.toString());
-        }
-
-        public void write(final LittleEndianOutputStream dos) throws IOException {
-
-            dos.writeString(name);
-            final List<Interval> intervals = tree.getIntervals();
-
-            dos.writeInt(intervals.size());
-            for (final Interval interval : intervals) {
-                dos.writeInt(interval.start);
-                dos.writeInt(interval.end);
-                dos.writeLong(interval.getBlock().getStartPosition());
-                dos.writeInt((int) interval.getBlock().getSize());
-            }
-
-        }
-
-        public void read(final LittleEndianInputStream dis) throws IOException {
-
-            tree = new IntervalTree();
-
-            name = dis.readString();
-            int nIntervals = dis.readInt();
-            while (nIntervals-- > 0) {
-
-                final int start = dis.readInt();
-                final int end = dis.readInt();
-                final long pos = dis.readLong();
-                final int size = dis.readInt();
-
-                final Interval iv = new Interval(start, end, new Block(pos, size));
-                tree.insert(iv);
-            }
-
-
-        }
-
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/index/linear/LinearIndex.java b/src/main/java/htsjdk/tribble/index/linear/LinearIndex.java
deleted file mode 100644
index 4f4d910..0000000
--- a/src/main/java/htsjdk/tribble/index/linear/LinearIndex.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * Copyright (c) 2009-2010 by The Broad Institute, Inc.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.linear;
-
-import htsjdk.tribble.index.AbstractIndex;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Index defined by dividing the genome by chromosome, then each chromosome into bins of fixed width (in
- * genomic coordinates).   Features are allocated to bins by start position.  The longest feature in each
- * recorded and used to adjust the start position of a query to include all bins that might have a feature
- * that overlaps the query interval.  This works well for feature sets of approximately homogeneous length,
- * or whose longest feature is on the order of the bin width or less.
- * <p/>
- * magicNumber      integer
- * type             integer
- * version          integer
- * filename         null terminated character array
- * filesize         long
- * lastModified     long
- * md5              String
- * flags            integer
- * <p/>
- * ------  LINEAR INDEX
- * nChromosomes     integer
- */
-public class LinearIndex extends AbstractIndex {
-
-    // NOTE: To debug uncomment the System.getProperty and recompile.
-    public static final double MAX_FEATURES_PER_BIN = Double.valueOf(System.getProperty("MAX_FEATURES_PER_BIN", "100"));
-    public static final int INDEX_TYPE = IndexType.LINEAR.fileHeaderTypeIdentifier;
-
-    private final static int MAX_BIN_WIDTH = 1 * 1000 * 1000 * 1000; //  widths must be less than 1 billion
-
-    // 1MB: we will no merge bins with any features in them beyond this size, no matter how sparse, per chromosome
-    private static final long MAX_BIN_WIDTH_FOR_OCCUPIED_CHR_INDEX = Long.valueOf(System.getProperty("MAX_BIN_WIDTH_FOR_OCCUPIED_CHR_INDEX", "1024000"));
-
-    public static boolean enableAdaptiveIndexing = true;
-
-    /**
-     * Initialize using the specified {@code indices}
-     * @param indices
-     * @param featureFile
-     */
-    public LinearIndex(final List<ChrIndex> indices, final File featureFile) {
-        super(featureFile.getAbsolutePath());
-        for (final ChrIndex index : indices)
-            chrIndices.put(index.getName(), index);
-    }
-
-    private LinearIndex(final LinearIndex parent, final List<ChrIndex> indices) {
-        super(parent);
-        for (final ChrIndex index : indices)
-            chrIndices.put(index.getName(), index);
-    }
-
-    /**
-     * Initialize with default parameters
-     * @param featureFile File for which this is an index
-     */
-    public LinearIndex(final String featureFile) {
-        super(featureFile);
-    }
-
-    /**
-     * Load from file.
-     * @param inputStream This method assumes that the input stream is already buffered as appropriate.
-     */
-    public LinearIndex(final InputStream inputStream) throws IOException {
-        final LittleEndianInputStream dis = new LittleEndianInputStream(inputStream);
-        validateIndexHeader(INDEX_TYPE, dis);
-        read(dis);
-    }
-
-    public boolean isCurrentVersion() {
-        if (!super.isCurrentVersion()) return false;
-
-        // todo fixme nasty hack to determine if this is an old style V3 linear index (without nFeaturesPerBin)
-        for (final htsjdk.tribble.index.ChrIndex chrIndex : chrIndices.values())
-            if (((ChrIndex) chrIndex).OLD_V3_INDEX)
-                return false;
-
-        return true;
-    }
-
-    @Override
-    protected int getType() {
-        return INDEX_TYPE;
-    }
-
-    public List<String> getSequenceNames() {
-        return (chrIndices == null ? Collections.EMPTY_LIST :
-                Collections.unmodifiableList(new ArrayList<String>(chrIndices.keySet())));
-    }
-
-    @Override
-    public Class getChrIndexClass() {
-        return ChrIndex.class;
-    }
-
-
-    /**
-     * Blocks are organized as a simple flat list:
-     * <p/>
-     * Block 0
-     * Block 1
-     * Block 2
-     * <p/>
-     * There's a constant bin width, so that each block corresponds to a specific interval
-     * over the genome based on its index, as in:
-     * <p/>
-     * Block 0: (0 - binWidth]
-     * Block 1: (binWidth - 2 * binWidth]
-     * Block 2: (2 * binWidth - 3 * binWidth]
-     * <p/>
-     * Note that covered regions are open on the left ( and closed on the right ].
-     * <p/>
-     * In general, if block i is the ith block (starting from 0), then block i
-     * contains all records that have starting position > (i * binWidth) and
-     * <= ((i + 1) * binWidth))
-     */
-    public static class ChrIndex implements htsjdk.tribble.index.ChrIndex {
-        private String name = "";
-        private int binWidth;
-        private int longestFeature;
-        private int nFeatures;
-        private List<Block> blocks;
-
-        private boolean OLD_V3_INDEX = false;
-
-        /**
-         * Default constructor needed for factory methods -- DO NOT REMOVE
-         */
-        public ChrIndex() {
-
-        }
-
-        ChrIndex(final String name, final int binWidth) {
-            this.name = name;
-            this.binWidth = binWidth;
-            this.blocks = new ArrayList<Block>(100);
-            this.longestFeature = 0;
-            //this.largestBlockSize = 0;
-            this.nFeatures = 0;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        void addBlock(final Block block) {
-            blocks.add(block);
-            //largestBlockSize = Math.max(largestBlockSize, block.getSize());
-        }
-
-        public int getNBlocks() {
-            return blocks.size();
-        }
-
-        public List<Block> getBlocks() {
-            return blocks;
-        }
-
-        public List<Block> getBlocks(final int start, final int end) {
-            if (blocks.isEmpty()) {
-                return Collections.emptyList();
-            } else {
-                // Adjust position for the longest feature in this chromosome.  This insures we get
-                // features that start before the bin but extend into it
-                final int adjustedPosition = Math.max(start - longestFeature, 0);
-                final int startBinNumber = adjustedPosition / binWidth;
-                if (startBinNumber >= blocks.size()) // are we off the end of the bin list, so return nothing
-                    return Collections.emptyList();
-                else {
-                    final int endBinNumber = Math.min((end - 1) / binWidth, blocks.size() - 1);
-
-                    // By definition blocks are adjacent for the liner index.  Combine them into one merged block
-
-                    final long startPos = blocks.get(startBinNumber).getStartPosition();
-                    final long endPos = blocks.get(endBinNumber).getStartPosition() + blocks.get(endBinNumber).getSize();
-                    final long size = endPos - startPos;
-                    if (size == 0) {
-                        return Collections.EMPTY_LIST;
-                    } else {
-                        final Block mergedBlock = new Block(startPos, size);
-                        return Arrays.asList(mergedBlock);
-                    }
-                }
-            }
-        }
-
-
-        public void updateLongestFeature(final int featureLength) {
-            longestFeature = Math.max(longestFeature, featureLength);
-        }
-
-        public int getNFeatures() {
-            return this.nFeatures;
-        }
-
-        public void incrementFeatureCount() {
-            this.nFeatures++;
-        }
-
-        public void write(final LittleEndianOutputStream dos) throws IOException {
-
-            // Chr name, binSize,  # bins,  longest feature
-            dos.writeString(name);
-            dos.writeInt(binWidth);
-            dos.writeInt(blocks.size());
-            dos.writeInt(longestFeature);
-            dos.writeInt(0);    // no longer used
-            //dos.writeInt(largestBlockSize);
-            dos.writeInt(nFeatures);
-
-            long pos = 0;
-            long size = 0;
-            for (final Block block : blocks) {
-                pos = block.getStartPosition();
-                size = block.getSize();
-                dos.writeLong(pos);
-            }
-            // End of last block for this chromosome
-            dos.writeLong(pos + size);
-        }
-
-        public void read(final LittleEndianInputStream dis) throws IOException {
-            name = dis.readString();
-            binWidth = dis.readInt();
-            final int nBins = dis.readInt();
-            longestFeature = dis.readInt();
-            //largestBlockSize = dis.readInt();
-            // largestBlockSize and totalBlockSize are old V3 index values.  largest block size should be 0 for
-            // all newer V3 block.  This is a nasty hack that should be removed when we go to V4 (XML!) indices
-            OLD_V3_INDEX = dis.readInt() > 0;
-            nFeatures = dis.readInt();
-
-            // note the code below accounts for > 60% of the total time to read an index
-            blocks = new ArrayList<Block>(nBins);
-            long pos = dis.readLong();
-            for (int binNumber = 0; binNumber < nBins; binNumber++) {
-                final long nextPos = dis.readLong();
-                final long size = nextPos - pos;
-                blocks.add(new Block(pos, size));
-                pos = nextPos;
-            }
-        }
-
-        public boolean equals(final Object obj) {
-            if (this == obj) return true;
-            if (!(obj instanceof ChrIndex)) return false;
-            final ChrIndex other = (ChrIndex) obj;
-            return binWidth == other.binWidth
-                    && longestFeature == other.longestFeature
-                    //&& largestBlockSize == other.largestBlockSize
-                    && nFeatures == other.nFeatures
-                    && name.equals(other.name)
-                    && blocks.equals(other.blocks);
-        }
-
-        /**
-         * @return  Total size of all blocks
-         */
-        public long getTotalSize() {
-            long n = 0;
-            for (final Block b : getBlocks())
-                n += b.getSize();
-            return n;
-        }
-
-        public double getAverageFeatureSize() {
-            return (1.0 * getTotalSize()) / getNFeatures();
-        }
-
-        public double getFeaturesPerBlock() {
-            return (1.0 * getNFeatures()) / getNBlocks();
-        }
-
-        private double getNFeaturesOfMostDenseBlock(final double featureSize) {
-            double m = -1;
-            for (final Block b : getBlocks()) {
-                final double n = b.getSize() / featureSize;
-                if (m == -1 || n > m) m = n;
-            }
-            return m;
-        }
-
-        private double optimizeScore() {
-            return getNFeaturesOfMostDenseBlock(getAverageFeatureSize());
-        }
-
-        public ChrIndex optimize(final double threshold) {
-            return optimize(this, threshold, 0);
-        }
-
-        private static boolean badBinWidth(final ChrIndex idx) {
-            if (idx.binWidth > MAX_BIN_WIDTH || idx.binWidth < 0) // an overflow occurred
-                return true;
-            else if (MAX_BIN_WIDTH_FOR_OCCUPIED_CHR_INDEX != 0 && idx.getNFeatures() > 1 && idx.binWidth > MAX_BIN_WIDTH_FOR_OCCUPIED_CHR_INDEX) {
-                return true;
-            } else {
-                return false;
-            }
-        }
-
-        private static ChrIndex optimize(ChrIndex idx, final double threshold, int level) {
-            ChrIndex best = idx;
-
-            while (true) {
-                final double score = idx.optimizeScore();
-
-                if (score > threshold || idx.getNBlocks() == 1 || badBinWidth(idx))
-                    break;
-                else {
-                    best = idx; // remember the last best option
-
-                    // try to make a better one
-                    idx = mergeBlocks(idx);
-                    level++;
-                }
-
-                if (level > 30) throw new IllegalStateException("Too many iterations");
-            }
-
-            return best;
-        }
-
-        private static ChrIndex mergeBlocks(final ChrIndex idx) {
-            final ChrIndex merged = new ChrIndex(idx.name, idx.binWidth * 2); // increasing width by 2 each time
-            merged.longestFeature = idx.longestFeature;
-            merged.nFeatures = idx.nFeatures;
-
-            final Iterator<Block> blocks = idx.getBlocks().iterator();
-            if (!blocks.hasNext())
-                throw new IllegalStateException("Block iterator cannot be empty at the start for " + idx.getName());
-
-            // extremely simple merging algorithm.  Walk left to right, joining up blocks adjacent blocks.
-            while (blocks.hasNext()) {
-                final Block b1 = blocks.next();
-                final Block b2 = blocks.hasNext() ? blocks.next() : null;
-
-                if (b2 == null)
-                    merged.addBlock(b1);
-                else
-                    // the new block is simply the start of the first block and the size of both together
-                    merged.addBlock(new Block(b1.getStartPosition(), b1.getSize() + b2.getSize()));
-            }
-
-            return merged;
-        }
-
-        private static String dupString(final char c, final int nCopies) {
-            final char[] chars = new char[nCopies];
-            Arrays.fill(chars, c);
-            return new String(chars);
-        }
-    }
-
-    /**
-     * Adapative optimization of the linear index
-     * @param threshold threshold to use for optimizing each constituent {@code chrIndex}
-     * @return The new optimized index
-     */
-    public Index optimize(final double threshold) {
-        if (enableAdaptiveIndexing) {
-
-            final List<ChrIndex> newIndices = new ArrayList<ChrIndex>(this.chrIndices.size());
-            for (final String name : chrIndices.keySet()) {
-                final LinearIndex.ChrIndex oldIdx = (LinearIndex.ChrIndex) chrIndices.get(name);
-                final LinearIndex.ChrIndex newIdx = oldIdx.optimize(threshold);
-                newIndices.add(newIdx);
-            }
-            return new LinearIndex(this, newIndices);
-        } else {
-            return this;
-        }
-    }
-
-    public Index optimize() {
-        return optimize(MAX_FEATURES_PER_BIN);
-    }
-
-    /**
-     * Code to convert linear index to a text table for analysis
-     * @param out Stream to which to write out table to
-     */
-    public void writeTable(final PrintStream out) {
-        out.printf("chr binWidth avg.feature.size nFeatures.total block.id start.pos size nFeatures%n");
-        for (final String name : chrIndices.keySet()) {
-            final LinearIndex.ChrIndex chrIdx = (LinearIndex.ChrIndex) chrIndices.get(name);
-            int blockCount = 0;
-            for (final Block b : chrIdx.getBlocks()) {
-                out.printf("%s %d %.2f %d %d %d %d %d%n", name, chrIdx.binWidth, chrIdx.getAverageFeatureSize(), chrIdx.getNFeatures(), blockCount,
-                        blockCount * chrIdx.binWidth, b.getSize(), (int) (b.getSize() / chrIdx.getAverageFeatureSize()));
-                blockCount++;
-            }
-        }
-    }
-
-    // purely for testing purposes
-    protected final void setTS(final long ts) {
-        this.indexedFileTS = ts;
-    }
-}
-
diff --git a/src/main/java/htsjdk/tribble/index/linear/LinearIndexCreator.java b/src/main/java/htsjdk/tribble/index/linear/LinearIndexCreator.java
deleted file mode 100644
index 1158fdf..0000000
--- a/src/main/java/htsjdk/tribble/index/linear/LinearIndexCreator.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index.linear;
-
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.TribbleIndexCreator;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.LinkedList;
-
-/**
- * For creating a LinearIndex from a stream of features.
- *
- * @author jrobinso
- */
-public class LinearIndexCreator  extends TribbleIndexCreator {
-    public static int DEFAULT_BIN_WIDTH = 8000;
-    // the set bin width
-    private int binWidth = DEFAULT_BIN_WIDTH;
-
-    // the input file
-    private final File inputFile;
-
-    private final LinkedList<LinearIndex.ChrIndex> chrList = new LinkedList<LinearIndex.ChrIndex>();
-    private int longestFeature= 0;
-
-    private final ArrayList<Block> blocks = new ArrayList<Block>();
-
-    public LinearIndexCreator(final File inputFile, final int binSize) {
-        this.inputFile = inputFile;
-        binWidth = binSize;
-    }
-
-    public LinearIndexCreator(final File inputFile) {
-        this(inputFile, DEFAULT_BIN_WIDTH);
-    }
-
-    /**
-     * add a feature to the index
-     * @param feature the feature, from which we use the contig, start, and stop
-     * @param filePosition the position of the file at the BEGINNING of the current feature
-     */
-    public void addFeature(final Feature feature, final long filePosition) {
-        // fi we don't have a chrIndex yet, or if the last one was for the previous contig, create a new one
-        if (chrList.isEmpty() || !chrList.getLast().getName().equals(feature.getContig())) {
-            // if we're creating a new chrIndex (not the first), make sure to dump the blocks to the old chrIndex
-            if (!chrList.isEmpty())
-                for (int x = 0; x < blocks.size(); x++) {
-                    blocks.get(x).setEndPosition((x + 1 == blocks.size()) ? filePosition : blocks.get(x + 1).getStartPosition());
-                    chrList.getLast().addBlock(blocks.get(x));
-                }
-            chrList.add(new LinearIndex.ChrIndex(feature.getContig(),binWidth));
-            blocks.clear();
-
-            // Add the first block
-            blocks.add(new Block(filePosition, 0));
-            longestFeature = 0;
-        }
-
-        // if start > current bin location, make new bins until we're at the correct location
-        while (feature.getStart() > blocks.size() * binWidth) {
-            blocks.add(new Block(filePosition,0));
-        }
-        if ((feature.getEnd()- feature.getStart())+1 > longestFeature) {
-            longestFeature = (feature.getEnd()- feature.getStart())+1;
-            chrList.getLast().updateLongestFeature(longestFeature);
-        }
-        chrList.getLast().incrementFeatureCount();
-    }
-
-    /**
-     * finalize the index; producing an index object
-     * @param finalFilePosition the final file position, for indexes that have to close out with the final position
-     * @return an Index object
-     */
-    public Index finalizeIndex(final long finalFilePosition) {
-        if (finalFilePosition == 0)
-            throw new IllegalArgumentException("finalFilePosition != 0, -> " + finalFilePosition);
-
-        for (int x = 0; x < blocks.size(); x++) {
-            blocks.get(x).setEndPosition((x + 1 == blocks.size()) ? finalFilePosition : blocks.get(x+1).getStartPosition());
-            chrList.getLast().addBlock(blocks.get(x));
-        }
-        blocks.clear();
-
-        final LinearIndex index = new LinearIndex(chrList,inputFile);
-        index.addProperties(properties);
-        index.finalizeIndex();
-        return index.optimize();
-    }
-
-    /**
-     * the current default bin size
-     * @return
-     */
-    public int defaultBinSize() {
-        return DEFAULT_BIN_WIDTH;
-    }
-
-    public int getBinSize() { return binWidth; }
-}
-
diff --git a/src/main/java/htsjdk/tribble/index/tabix/TabixFormat.java b/src/main/java/htsjdk/tribble/index/tabix/TabixFormat.java
deleted file mode 100644
index 0cf910f..0000000
--- a/src/main/java/htsjdk/tribble/index/tabix/TabixFormat.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index.tabix;
-
-import htsjdk.tribble.TribbleException;
-
-/**
- * The values in a Tabix header that define the format of the file being indexed, e.g. gff, bed, vcf
- */
-public class TabixFormat implements Cloneable {
-    public static final int ZERO_BASED    = 0x10000;
-    public static final int GENERIC_FLAGS = 0;
-    public static final int SAM_FLAGS     = 1;
-    public static final int VCF_FLAGS     = 2;
-    public static final int UCSC_FLAGS    = GENERIC_FLAGS | ZERO_BASED;
-
-    /** Predefined headers for known formats */
-    public static TabixFormat GFF = new TabixFormat(GENERIC_FLAGS, 1, 4, 5, '#', 0);
-    public static TabixFormat BED = new TabixFormat(UCSC_FLAGS, 1, 2, 3, '#', 0);
-    public static TabixFormat PSLTBL = new TabixFormat(UCSC_FLAGS, 15, 17, 18, '#', 0);
-    public static TabixFormat SAM = new TabixFormat(SAM_FLAGS, 3, 4, 0, '@', 0);
-    public static TabixFormat VCF = new TabixFormat(VCF_FLAGS, 1, 2, 0, '#', 0);
-
-    /** Describes interpretation of file being indexed.  See FLAGS constants above. */
-    public int flags;
-    /** One-based index of the column in the file being indexed containing the sequence name */
-    public int sequenceColumn;
-    /** One-based index of the column in the file being indexed containing the start position. */
-    public int startPositionColumn;
-    /**
-     * One-based index of the column in the file being indexed containing the end position. Zero implies
-     * there is no end position column.
-     */
-    public int endPositionColumn;
-    /** Lines in the file being indexed that start with this character are ignored. */
-    public char metaCharacter;
-    /** This is part of the index header, but does not appear to be used. */
-    public int numHeaderLinesToSkip;
-
-    public TabixFormat() {
-    }
-
-    public TabixFormat(final int flags, final int sequenceColumn, final int startPositionColumn, final int endPositionColumn, final char metaCharacter, final int numHeaderLinesToSkip) {
-        this.flags = flags;
-        this.sequenceColumn = sequenceColumn;
-        this.startPositionColumn = startPositionColumn;
-        this.endPositionColumn = endPositionColumn;
-        this.metaCharacter = metaCharacter;
-        this.numHeaderLinesToSkip = numHeaderLinesToSkip;
-    }
-
-    @Override
-    public TabixFormat clone() {
-        try {
-            return (TabixFormat)super.clone();
-        } catch (final CloneNotSupportedException e) {
-            throw new TribbleException("unpossible!");
-        }
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final TabixFormat that = (TabixFormat) o;
-
-        if (endPositionColumn != that.endPositionColumn) return false;
-        if (flags != that.flags) return false;
-        if (metaCharacter != that.metaCharacter) return false;
-        if (numHeaderLinesToSkip != that.numHeaderLinesToSkip) return false;
-        if (sequenceColumn != that.sequenceColumn) return false;
-        if (startPositionColumn != that.startPositionColumn) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = flags;
-        result = 31 * result + sequenceColumn;
-        result = 31 * result + startPositionColumn;
-        result = 31 * result + endPositionColumn;
-        result = 31 * result + (int) metaCharacter;
-        result = 31 * result + numHeaderLinesToSkip;
-        return result;
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/index/tabix/TabixIndex.java b/src/main/java/htsjdk/tribble/index/tabix/TabixIndex.java
deleted file mode 100644
index 044cefe..0000000
--- a/src/main/java/htsjdk/tribble/index/tabix/TabixIndex.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index.tabix;
-
-import htsjdk.samtools.Bin;
-import htsjdk.samtools.BinningIndexContent;
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.LinearIndex;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.StringUtil;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-import htsjdk.tribble.util.TabixUtils;
-
-import java.io.EOFException;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.*;
-
-/**
- * This class represent a Tabix index that has been built in memory or read from a file.  It can be queried or
- * written to a file.
- */
-public class TabixIndex implements Index {
-    private static final byte[] MAGIC = {'T', 'B', 'I', 1};
-    public static final int MAGIC_NUMBER;
-
-    static {
-        final ByteBuffer bb = ByteBuffer.allocate(MAGIC.length);
-        bb.put(MAGIC);
-        bb.flip();
-        MAGIC_NUMBER = bb.order(ByteOrder.LITTLE_ENDIAN).getInt();
-    }
-
-    private final TabixFormat formatSpec;
-    private final List<String> sequenceNames;
-    private final BinningIndexContent[] indices;
-
-    /**
-     * @param formatSpec    Information about how to interpret the file being indexed.  Unused by this class other than
-     *                      written to an output file.
-     * @param sequenceNames Sequences in the file being indexed, in the order they appear in the file.
-     * @param indices       One for each element of sequenceNames
-     */
-    public TabixIndex(final TabixFormat formatSpec, final List<String> sequenceNames, final BinningIndexContent[] indices) {
-        if (sequenceNames.size() != indices.length) {
-            throw new IllegalArgumentException("sequenceNames.size() != indices.length");
-        }
-        this.formatSpec = formatSpec.clone();
-        this.sequenceNames = Collections.unmodifiableList(new ArrayList<String>(sequenceNames));
-        this.indices = indices;
-    }
-
-    /**
-     * @param inputStream This is expected to be buffered and be gzip-decompressing as appropriate.  Caller
-     *                    should close input stream after ctor returns.
-     */
-    public TabixIndex(final InputStream inputStream) throws IOException {
-        this(inputStream, false);
-    }
-
-    /**
-     * Convenient ctor that opens the file, wraps with with BGZF reader, and closes after reading index.
-     */
-    public TabixIndex(final File tabixFile) throws IOException {
-        this(new BlockCompressedInputStream(tabixFile), true);
-    }
-
-    private TabixIndex(final InputStream inputStream, final boolean closeInputStream) throws IOException {
-        final LittleEndianInputStream dis = new LittleEndianInputStream(inputStream);
-        if (dis.readInt() != MAGIC_NUMBER) {
-            throw new TribbleException(String.format("Unexpected magic number 0x%x", MAGIC_NUMBER));
-        }
-        final int numSequences = dis.readInt();
-        indices = new BinningIndexContent[numSequences];
-        formatSpec = new TabixFormat();
-        formatSpec.flags = dis.readInt();
-        formatSpec.sequenceColumn = dis.readInt();
-        formatSpec.startPositionColumn = dis.readInt();
-        formatSpec.endPositionColumn = dis.readInt();
-        formatSpec.metaCharacter = (char) dis.readInt();
-        formatSpec.numHeaderLinesToSkip = dis.readInt();
-        final int nameBlockSize = dis.readInt();
-        final byte[] nameBlock = new byte[nameBlockSize];
-        if (dis.read(nameBlock) != nameBlockSize) throw new EOFException("Premature end of file reading Tabix header");
-        final List<String> sequenceNames = new ArrayList<String>(numSequences);
-        int startPos = 0;
-        for (int i = 0; i < numSequences; ++i) {
-            int endPos = startPos;
-            while (nameBlock[endPos] != '\0') ++endPos;
-            sequenceNames.add(StringUtil.bytesToString(nameBlock, startPos, endPos - startPos));
-            startPos = endPos + 1;
-        }
-        if (startPos != nameBlockSize) {
-            throw new TribbleException("Tabix header format exception.  Sequence name block is longer than expected");
-        }
-        for (int i = 0; i < numSequences; ++i) {
-            indices[i] = loadSequence(i, dis);
-        }
-        if (closeInputStream) CloserUtil.close(dis);
-        this.sequenceNames = Collections.unmodifiableList(sequenceNames);
-    }
-
-    /**
-     * @param chr   the chromosome
-     * @param start the start position, one-based, inclusive.
-     * @param end   the end position, one-based, inclusive.
-     * @return List of regions of file that are candidates for the given query.
-     * <p/>
-     * TODO: This method has not yet been tested, since the primary task is index writing.
-     */
-    @Override
-    public List<Block> getBlocks(final String chr, final int start, final int end) {
-        final int sequenceIndex = sequenceNames.indexOf(chr);
-        if (sequenceIndex == -1 || indices[sequenceIndex] == null) {
-            return Collections.emptyList();
-        }
-        final List<Chunk> chunks = indices[sequenceIndex].getChunksOverlapping(start, end);
-        if (chunks == null) {
-            return Collections.emptyList();
-        } else {
-            final List<Block> ret = new ArrayList<>(chunks.size());
-            chunks.stream()
-                  .map(chunk -> new Block(chunk.getChunkStart(), chunk.getChunkEnd() - chunk.getChunkStart()))
-                  .forEach(ret::add);
-            return ret;
-        }
-    }
-
-    @Override
-    public boolean isCurrentVersion() {
-        return true;
-    }
-
-    @Override
-    public List<String> getSequenceNames() {
-        return sequenceNames;
-    }
-
-    @Override
-    public boolean containsChromosome(final String chr) {
-        return sequenceNames.contains(chr);
-    }
-
-    /**
-     * No arbitrary properties in Tabix
-     */
-    @Override
-    public Map<String, String> getProperties() {
-        return null;
-    }
-
-    @Override
-    public boolean equalsIgnoreProperties(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final TabixIndex that = (TabixIndex) o;
-
-        if (!formatSpec.equals(that.formatSpec)) return false;
-        if (!Arrays.equals(indices, that.indices)) return false;
-        return sequenceNames.equals(that.sequenceNames);
-
-    }
-
-    public TabixFormat getFormatSpec() {
-        return formatSpec;
-    }
-
-    /**
-     * Writes the index with BGZF.
-     *
-     * @param tabixFile Where to write the index.
-     */
-    @Override
-    public void write(final File tabixFile) throws IOException {
-        try(final LittleEndianOutputStream los = new LittleEndianOutputStream(new BlockCompressedOutputStream(tabixFile))) {
-            write(los);
-        }
-    }
-
-    /**
-     * Writes to a file with appropriate name and directory based on feature file.
-     *
-     * @param featureFile File being indexed.
-     */
-    @Override
-    public void writeBasedOnFeatureFile(final File featureFile) throws IOException {
-        if (!featureFile.isFile()) return;
-        write(new File(featureFile.getAbsolutePath() + TabixUtils.STANDARD_INDEX_EXTENSION));
-    }
-
-    /**
-     * @param los It is assumes that caller has done appropriate buffering and BlockCompressedOutputStream wrapping.
-     *            Caller should close output stream after invoking this method.
-     * @throws IOException
-     */
-    @Override
-    public void write(final LittleEndianOutputStream los) throws IOException {
-        los.writeInt(MAGIC_NUMBER);
-        los.writeInt(sequenceNames.size());
-        los.writeInt(formatSpec.flags);
-        los.writeInt(formatSpec.sequenceColumn);
-        los.writeInt(formatSpec.startPositionColumn);
-        los.writeInt(formatSpec.endPositionColumn);
-        los.writeInt(formatSpec.metaCharacter);
-        los.writeInt(formatSpec.numHeaderLinesToSkip);
-        int nameBlockSize = sequenceNames.size(); // null terminators
-        for (final String sequenceName : sequenceNames) nameBlockSize += sequenceName.length();
-        los.writeInt(nameBlockSize);
-        for (final String sequenceName : sequenceNames) {
-            los.write(StringUtil.stringToBytes(sequenceName));
-            los.write(0);
-        }
-        for (final BinningIndexContent index : indices) {
-            writeSequence(index, los);
-        }
-    }
-
-    private void writeSequence(final BinningIndexContent indexContent, final LittleEndianOutputStream los) throws IOException {
-        if (indexContent == null) {
-            los.writeInt(0);
-        } else {
-            final BinningIndexContent.BinList binList = indexContent.getBins();
-            los.writeInt(binList.numberOfNonNullBins);
-            for (final Bin bin : binList) {
-                writeBin(bin, los);
-            }
-            writeLinearIndex(indexContent.getLinearIndex(), los);
-        }
-    }
-
-    private void writeLinearIndex(final LinearIndex linearIndex, final LittleEndianOutputStream los) throws IOException {
-        if (linearIndex.getIndexStart() != 0) {
-            // This could be handled by writing zeroes, but it is not expected so just fail.
-            throw new IllegalArgumentException("Non-zero linear index start");
-        }
-        final long[] entries = linearIndex.getIndexEntries();
-        los.writeInt(entries.length);
-        for (final long entry : entries) los.writeLong(entry);
-    }
-
-    private void writeBin(final Bin bin, final LittleEndianOutputStream los) throws IOException {
-        los.writeInt(bin.getBinNumber());
-        final List<Chunk> chunkList = bin.getChunkList();
-        los.writeInt(chunkList.size());
-        for (final Chunk chunk : chunkList) {
-            los.writeLong(chunk.getChunkStart());
-            los.writeLong(chunk.getChunkEnd());
-        }
-    }
-
-    /**
-     * Although this is probably identical to BAM index reading code, code does not exist there to load directly
-     * into a BinningIndexContent object, so that is implemented here.
-     *
-     * @param referenceSequenceIndex Merely for setting in the returned object, not for seeking into the file.
-     * @param dis                    This method assumes that the current position is at the start of the reference.
-     */
-    private BinningIndexContent loadSequence(final int referenceSequenceIndex, final LittleEndianInputStream dis) throws IOException {
-        final int numBins = dis.readInt();
-        if (numBins == 0) return null;
-        int nonNullBins = 0;
-        final ArrayList<Bin> bins = new ArrayList<Bin>();
-        for (int i = 0; i < numBins; ++i) {
-            final Bin bin = loadBin(referenceSequenceIndex, dis);
-            if (bin != null) {
-                // File is not sparse, but array being produced is sparse, so grow array with nulls as appropriate
-                // so that bin number == index into array.
-                ++nonNullBins;
-                if (bins.size() > bin.getBinNumber()) {
-                    if (bins.get(bin.getBinNumber()) != null) {
-                        throw new TribbleException("Bin " + bin.getBinNumber() + " appears more than once in file");
-                    }
-                    bins.set(bin.getBinNumber(), bin);
-                } else {
-                    // Grow bins array as needed.
-                    bins.ensureCapacity(bin.getBinNumber() + 1);
-                    while (bins.size() < bin.getBinNumber()) bins.add(null);
-                    bins.add(bin);
-                }
-            }
-        }
-        final LinearIndex linearIndex = loadLinearIndex(referenceSequenceIndex, dis);
-        return new BinningIndexContent(referenceSequenceIndex,
-                new BinningIndexContent.BinList(bins.toArray(new Bin[bins.size()]), nonNullBins), linearIndex);
-    }
-
-    private LinearIndex loadLinearIndex(final int referenceSequenceIndex, final LittleEndianInputStream dis) throws IOException {
-        final int numElements = dis.readInt();
-        final long[] elements = new long[numElements];
-        for (int i = 0; i < numElements; ++i) {
-            elements[i] = dis.readLong();
-        }
-        return new LinearIndex(referenceSequenceIndex, 0, elements);
-    }
-
-    private Bin loadBin(final int referenceSequenceIndex, final LittleEndianInputStream dis) throws IOException {
-        final int binNumber = dis.readInt();
-        final Bin ret = new Bin(referenceSequenceIndex, binNumber);
-        final int numChunks = dis.readInt();
-        final List<Chunk> chunkList = new ArrayList<Chunk>(numChunks);
-        for (int i = 0; i < numChunks; ++i) {
-            chunkList.add(loadChunk(dis));
-        }
-        ret.setChunkList(chunkList);
-        return ret;
-    }
-
-    private Chunk loadChunk(final LittleEndianInputStream dis) throws IOException {
-        final long start = dis.readLong();
-        final long end = dis.readLong();
-        return new Chunk(start, end);
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final TabixIndex index = (TabixIndex) o;
-
-        if (!formatSpec.equals(index.formatSpec)) return false;
-        if (!Arrays.equals(indices, index.indices)) return false;
-        if (!sequenceNames.equals(index.sequenceNames)) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = formatSpec.hashCode();
-        result = 31 * result + sequenceNames.hashCode();
-        result = 31 * result + Arrays.hashCode(indices);
-        return result;
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/index/tabix/TabixIndexCreator.java b/src/main/java/htsjdk/tribble/index/tabix/TabixIndexCreator.java
deleted file mode 100644
index 001dabc..0000000
--- a/src/main/java/htsjdk/tribble/index/tabix/TabixIndexCreator.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index.tabix;
-
-import htsjdk.samtools.BinningIndexBuilder;
-import htsjdk.samtools.BinningIndexContent;
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexCreator;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * IndexCreator for Tabix.
- * Features are expected to be 1-based, inclusive.
- */
-public class TabixIndexCreator implements IndexCreator {
-    private final TabixFormat formatSpec;
-    private final List<BinningIndexContent> indexContents = new ArrayList<BinningIndexContent>();
-    private final List<String> sequenceNames = new ArrayList<String>();
-    // Merely a faster way to ensure that features are added in a specific sequence name order
-    private final Set<String> sequenceNamesSeen = new HashSet<String>();
-    // A sequence dictionary is not required, but if it is provided all sequences names must be present in it.
-    // It is used to determine the length of a sequence in order to optimize index memory allocation.
-    private final SAMSequenceDictionary sequenceDictionary;
-
-    private String currentSequenceName = null;
-    private BinningIndexBuilder indexBuilder = null;
-    // A feature can't be added to the index until the next feature is added because the next feature
-    // defines the location of the end of the previous feature in the output file.
-    private TabixFeature previousFeature = null;
-
-
-    /**
-     * @param sequenceDictionary is not required, but if present all features added must refer to sequences in the
-     *                           dictionary.  It is used to optimize the memory needed to build the index.
-     */
-    public TabixIndexCreator(final SAMSequenceDictionary sequenceDictionary,
-                             final TabixFormat formatSpec) {
-        this.sequenceDictionary = sequenceDictionary;
-        this.formatSpec = formatSpec.clone();
-    }
-
-    public TabixIndexCreator(final TabixFormat formatSpec) {
-        this(null, formatSpec);
-    }
-
-    @Override
-    public void addFeature(final Feature feature, final long filePosition) {
-        final String sequenceName = feature.getContig();
-        final int referenceIndex;
-        if (sequenceName.equals(currentSequenceName)) {
-            referenceIndex = sequenceNames.size() - 1;
-        } else {
-            referenceIndex = sequenceNames.size();
-            if (currentSequenceName != null && sequenceNamesSeen.contains(sequenceName)) {
-                throw new IllegalArgumentException("Sequence " + feature + " added out sequence of order");
-            }
-        }
-        final TabixFeature thisFeature = new TabixFeature(referenceIndex, feature.getStart(), feature.getEnd(), filePosition);
-        if (previousFeature != null) {
-            if (previousFeature.compareTo(thisFeature) > 0) {
-                throw new IllegalArgumentException(String.format("Features added out of order: previous (%s) > next (%s)",
-                        previousFeature, thisFeature));
-            }
-            finalizeFeature(filePosition);
-        }
-        previousFeature = thisFeature;
-        if (referenceIndex == sequenceNames.size()) {
-            advanceToReference(sequenceName);
-        }
-    }
-
-    private void finalizeFeature(final long featureEndPosition) {
-        previousFeature.featureEndFilePosition = featureEndPosition;
-        if (previousFeature.featureStartFilePosition >= previousFeature.featureEndFilePosition) {
-            throw new IllegalArgumentException(String.format("Feature start position %d >= feature end position %d",
-                    previousFeature.featureStartFilePosition, previousFeature.featureEndFilePosition));
-        }
-        indexBuilder.processFeature(previousFeature);
-    }
-
-    private void advanceToReference(final String sequenceName) {
-        if (indexBuilder != null) {
-            indexContents.add(indexBuilder.generateIndexContent());
-        }
-        // If sequence dictionary is provided, BinningIndexBuilder can reduce size of array it allocates.
-        final int sequenceLength;
-        if (sequenceDictionary != null) {
-            sequenceLength = sequenceDictionary.getSequence(sequenceName).getSequenceLength();
-        } else {
-            sequenceLength = 0;
-        }
-        indexBuilder = new BinningIndexBuilder(sequenceNames.size(), sequenceLength);
-        sequenceNames.add(sequenceName);
-        currentSequenceName = sequenceName;
-        sequenceNamesSeen.add(sequenceName);
-    }
-
-    @Override
-    public Index finalizeIndex(final long finalFilePosition) {
-        if (previousFeature != null) {
-            finalizeFeature(finalFilePosition);
-        }
-        if (indexBuilder != null) {
-            indexContents.add(indexBuilder.generateIndexContent());
-        }
-        // Make this as big as the sequence dictionary, even if there is not content for every sequence,
-        // but truncate the sequence dictionary before its end if there are sequences in the sequence dictionary without
-        // any features.
-        final BinningIndexContent[] indices = indexContents.toArray(new BinningIndexContent[sequenceNames.size()]);
-        return new TabixIndex(formatSpec, sequenceNames, indices);
-    }
-
-
-    private static class TabixFeature implements BinningIndexBuilder.FeatureToBeIndexed, Comparable<TabixFeature> {
-        private final int referenceIndex;
-        private final int start;
-        private final int end;
-        private final long featureStartFilePosition;
-        // Position after this feature in the file.
-        private long featureEndFilePosition = -1;
-
-        private TabixFeature(final int referenceIndex, final int start, final int end, final long featureStartFilePosition) {
-            this.referenceIndex = referenceIndex;
-            this.start = start;
-            this.end = end;
-            this.featureStartFilePosition = featureStartFilePosition;
-        }
-
-        @Override
-        public int getStart() {
-            return start;
-        }
-
-        @Override
-        public int getEnd() {
-            return end;
-        }
-
-        /**
-         *
-         * @return null -- Let index builder compute this.
-         */
-        @Override
-        public Integer getIndexingBin() {
-            return null;
-        }
-
-        @Override
-        public Chunk getChunk() {
-            if (featureEndFilePosition == -1) {
-                throw new IllegalStateException("End position is not set");
-            }
-            return new Chunk(featureStartFilePosition, featureEndFilePosition);
-        }
-
-        @Override
-        public int compareTo(final TabixFeature other) {
-            final int ret = this.referenceIndex - other.referenceIndex;
-            if (ret != 0) return ret;
-            return this.start - other.start;
-        }
-
-        @Override
-        public String toString() {
-            return "TabixFeature{" +
-                    "referenceIndex=" + referenceIndex +
-                    ", start=" + start +
-                    ", end=" + end +
-                    ", featureStartFilePosition=" + featureStartFilePosition +
-                    ", featureEndFilePosition=" + featureEndFilePosition +
-                    '}';
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/readers/AsciiLineReader.java b/src/main/java/htsjdk/tribble/readers/AsciiLineReader.java
deleted file mode 100644
index 8f06205..0000000
--- a/src/main/java/htsjdk/tribble/readers/AsciiLineReader.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (c) 2007-2009 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.tribble.TribbleException;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A simple class that provides {@link #readLine()} functionality around a PositionalBufferedStream
- *
- * {@link BufferedReader} and its {@link java.io.BufferedReader#readLine()} method should be used in preference to this class (when the
- * {@link htsjdk.samtools.util.LocationAware} functionality is not required) because it offers greater performance.
- * 
- * @author jrobinso
- */
-public class AsciiLineReader implements LineReader, LocationAware {
-    private static final int BUFFER_OVERFLOW_INCREASE_FACTOR = 2;
-    private static final byte LINEFEED = (byte) ('\n' & 0xff);
-    private static final byte CARRIAGE_RETURN = (byte) ('\r' & 0xff);
-
-    PositionalBufferedStream is;
-    char[] lineBuffer;
-
-    public AsciiLineReader(final InputStream is){
-        this(new PositionalBufferedStream(is));
-    }
-
-    public AsciiLineReader(final PositionalBufferedStream is) {
-        this.is = is;
-        // Allocate this only once, even though it is essentially a local variable of
-        // readLine.  This makes a huge difference in performance
-        lineBuffer = new char[10000];
-    }
-
-    /**
-     * @return The position of the InputStream
-     */
-    public long getPosition(){
-        if(is == null){
-            throw new TribbleException("getPosition() called but no default stream was provided to the class on creation");
-        }
-        return is.getPosition();
-    }
-
-    /**
-     * Read a line of text.  A line is considered to be terminated by any one
-     * of a line feed ('\n'), a carriage return ('\r'), or a carriage return
-     * followed immediately by a linefeed.
-     *
-     * @param stream the stream to read the next line from
-     * @return A String containing the contents of the line or null if the
-     *         end of the stream has been reached
-     */
-    public final String readLine(final PositionalBufferedStream stream) throws IOException{
-        int linePosition = 0;
-
-        while (true) {
-            final int b = stream.read();
-
-            if (b == -1) {
-                // eof reached.  Return the last line, or null if this is a new line
-                if (linePosition > 0) {
-                    return new String(lineBuffer, 0, linePosition);
-                } else {
-                    return null;
-                }
-            }
-
-            final char c = (char) (b & 0xFF);
-            if (c == LINEFEED || c == CARRIAGE_RETURN) {
-                if (c == CARRIAGE_RETURN && stream.peek() == LINEFEED) {
-                    stream.read(); // <= skip the trailing \n in case of \r\n termination
-                }
-
-                return new String(lineBuffer, 0, linePosition);
-            } else {
-                // Expand line buffer size if neccessary.  Reserve at least 2 characters
-                // for potential line-terminators in return string
-
-                if (linePosition > (lineBuffer.length - 3)) {
-                    final char[] temp = new char[BUFFER_OVERFLOW_INCREASE_FACTOR * lineBuffer.length];
-                    System.arraycopy(lineBuffer, 0, temp, 0, lineBuffer.length);
-                    lineBuffer = temp;
-                }
-
-                lineBuffer[linePosition++] = c;
-            }
-        }
-    }
-
-    /**
-     * Same as {@link #readLine(PositionalBufferedStream)} but uses the stream provided in the constructor
-     *
-     * @return
-     */
-    public final String readLine() throws IOException{
-        if ( is == null ){
-            throw new TribbleException("readLine() called without an explicit stream argument but no default stream was provided to the class on creation");
-        }
-        return readLine(is);
-    }
-
-    @Override
-    public void close() {
-        if ( is != null ) is.close();
-        lineBuffer = null;
-    }
-
-    public static void main(final String[] args) throws Exception {
-        final File testFile = new File(args[0]);
-        final int iterations = Integer.valueOf(args[1]);
-        final boolean includeBufferedReader = Boolean.valueOf(args[2]);
-        long t0, lineCount, dt;
-        double rate;
-
-        System.out.printf("Testing %s%n", args[0]);
-        for (int i = 0; i < iterations; i++) {
-            if ( includeBufferedReader ) {
-                final BufferedReader reader2 = new BufferedReader(new FileReader(testFile));
-                t0 = System.currentTimeMillis();
-                lineCount = 0;
-                while (reader2.readLine() != null) {
-                    lineCount++;
-                }
-                dt = System.currentTimeMillis() - t0;
-                rate = ((double) lineCount) / dt;
-                printStatus("BufferedReader", lineCount, rate, dt);
-                reader2.close();
-            }
-
-            if ( includeBufferedReader ) {
-                final LongLineBufferedReader longLineBufferedReader = new LongLineBufferedReader(new BufferedReader(new FileReader(testFile)));
-                t0 = System.currentTimeMillis();
-                lineCount = 0;
-                while (longLineBufferedReader.readLine() != null) {
-                    lineCount++;
-                }
-                dt = System.currentTimeMillis() - t0;
-                rate = ((double) lineCount) / dt;
-                printStatus("BufferedReader", lineCount, rate, dt);
-                longLineBufferedReader.close();
-            }
-            
-            final PositionalBufferedStream pbs = new PositionalBufferedStream(new FileInputStream(testFile));
-            final LineReader reader = new AsciiLineReader(pbs);
-            t0 = System.currentTimeMillis();
-            lineCount = 0;
-            while (reader.readLine() != null) {
-                lineCount++;
-            }
-            dt = System.currentTimeMillis() - t0;
-            rate = ((double) lineCount) / dt;
-            printStatus("PositionalBufferedStream", lineCount, rate, dt);
-            pbs.close();
-        }
-    }
-
-    private static final void printStatus(final String name, final long lineCount, final double rate, final long dt) {
-        System.out.printf("%30s: %d lines read.  Rate = %.2e lines per second.  DT = %d%n", name, lineCount, rate, dt);
-        System.out.flush();
-    }
-}
-
diff --git a/src/main/java/htsjdk/tribble/readers/AsciiLineReaderIterator.java b/src/main/java/htsjdk/tribble/readers/AsciiLineReaderIterator.java
deleted file mode 100644
index 5db3b91..0000000
--- a/src/main/java/htsjdk/tribble/readers/AsciiLineReaderIterator.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.AbstractIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.Tuple;
-
-import java.io.Closeable;
-import java.io.IOException;
-
-/**
- * A class that iterates over the lines and line positions in an {@link AsciiLineReader}.
- * 
- * This class is slower than other {@link LineIterator}s because it is driven by {@link AsciiLineReader}, but offers the benefit of 
- * implementing {@link htsjdk.samtools.util.LocationAware}, which is required for indexing.  If you do not require {@link htsjdk.samtools.util.LocationAware}, consider using
- * {@link LineIteratorImpl} as an alternative to this class.
- * 
- * Note an important distinction in the way this class and its inner iterator differ: in the inner iterator, the position stored with
- * a line is the position at the start of that line.  However, {@link #getPosition()} of the outer class must return the position at the
- * end of the most-recently-returned line (or the start of the underlying {@link AsciiLineReader}, if no line has been read).  The latter
- * bit of logic here is required to conform with the interface described by {@link htsjdk.samtools.util.LocationAware#getPosition()}.
- * 
- * @author mccowan
- */
-public class AsciiLineReaderIterator implements LocationAware, LineIterator, Closeable {
-    private final AsciiLineReader asciiLineReader;
-    private final TupleIterator i;
-    private Tuple<String, Long> current = null;
-
-    public AsciiLineReaderIterator(final AsciiLineReader asciiLineReader) {
-        this.asciiLineReader = asciiLineReader;
-        this.i = new TupleIterator();
-    }
-
-    @Override
-    public void close() throws IOException {
-        CloserUtil.close(asciiLineReader);
-    }
-
-    @Override
-    public boolean hasNext() {
-        return i.hasNext();
-    }
-
-    @Override
-    public String next() {
-        current = i.next();
-        return current.a;
-    }
-
-    @Override
-    public void remove() {
-        i.remove();
-    }
-
-    /**
-     * Returns the byte position at the end of the most-recently-read line (a.k.a., the beginning of the next line) from {@link #next()} in
-     * the underlying {@link AsciiLineReader}.
-     */
-    @Override
-    public long getPosition() {
-        return i.getPosition();
-    }
-
-    @Override
-    public String peek() {
-        return i.peek().a;
-    }
-
-    /**
-     * This is stored internally since it iterates over {@link htsjdk.samtools.util.Tuple}, not {@link String} (and the outer
-     * class can't do both).
-     */
-    private class TupleIterator extends AbstractIterator<Tuple<String, Long>> implements LocationAware {
-        
-        public TupleIterator() {
-            hasNext(); // Initialize the iterator, which appears to be a requirement of the parent class.  TODO: Really?
-        }
-        
-        @Override
-        protected Tuple<String, Long> advance() {
-            final String line;
-            final long position = asciiLineReader.getPosition(); // A line's position is where it starts, so get it before reading the line.
-            try {
-                line = asciiLineReader.readLine();
-            } catch (IOException e) {
-                throw new RuntimeIOException(e);
-            }
-            return line == null ? null : new Tuple<String, Long>(line, position);
-        }
-
-        /** Returns the byte position at the beginning of the next line. */
-        @Override
-        public long getPosition() {
-            final Tuple<String, Long> peek = peek();
-            // Be careful: peek will be null at the end of the stream.
-            return peek != null ? peek.b : asciiLineReader.getPosition();
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/readers/LineIterator.java b/src/main/java/htsjdk/tribble/readers/LineIterator.java
deleted file mode 100644
index f582025..0000000
--- a/src/main/java/htsjdk/tribble/readers/LineIterator.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package htsjdk.tribble.readers;
-
-import java.util.Iterator;
-
-/**
- * A very simple descriptor for line-iterables.
- * @author mccowan
- */
-public interface LineIterator extends Iterator<String> {
-    /** Peeks at the next line, without expending any elements in the underlying iterator. */
-    public String peek();
-}
diff --git a/src/main/java/htsjdk/tribble/readers/LineIteratorImpl.java b/src/main/java/htsjdk/tribble/readers/LineIteratorImpl.java
deleted file mode 100644
index be24dc7..0000000
--- a/src/main/java/htsjdk/tribble/readers/LineIteratorImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.AbstractIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.Closeable;
-import java.io.IOException;
-
-/** A simple iterator over the elements in LineReader. */
-public class LineIteratorImpl extends AbstractIterator<String> implements LineIterator, Closeable {
-    private final LineReader lineReader;
-
-    /**
-     * @param lineReader The line reader whose elements are to be iterated over.
-     */
-    public LineIteratorImpl(final LineReader lineReader) {
-        this.lineReader = lineReader;
-    }
-
-    @Override
-    protected String advance() {
-        try {
-            return lineReader.readLine();
-        } catch (IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    @Override
-    public void close() throws IOException {
-        CloserUtil.close(lineReader);
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/readers/LineReader.java b/src/main/java/htsjdk/tribble/readers/LineReader.java
deleted file mode 100644
index 969b6b5..0000000
--- a/src/main/java/htsjdk/tribble/readers/LineReader.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.readers;
-
-import java.io.Closeable;
-import java.io.IOException;
-
-/**
- * Interface for line-oriented readers.
- */
-public interface LineReader extends Closeable {
-
-    /**
-     * @return The next "line" from the source. Typically a line is a set of characters
-     * terminated by '\n', '\r', or '\r\n'. The line-terminator is not included
-     * @throws IOException
-     */
-    public String readLine() throws IOException;
-
-
-    public void close();
-}
diff --git a/src/main/java/htsjdk/tribble/readers/LineReaderUtil.java b/src/main/java/htsjdk/tribble/readers/LineReaderUtil.java
deleted file mode 100644
index 83a0545..0000000
--- a/src/main/java/htsjdk/tribble/readers/LineReaderUtil.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package htsjdk.tribble.readers;
-
-import java.io.InputStream;
-import java.io.StringReader;
-
-/**
- * A collection of factories for generating {@link LineReader}s.
- *
- * @Deprecated use {@link SynchronousLineReader} directly.
- * @author mccowan
- */
- at Deprecated
-public class LineReaderUtil {
-    @Deprecated
-    public enum LineReaderOption {
-        ASYNCHRONOUS,   //Note: the asynchronous option has no effect - this class does not provide asynchronous reading anymore
-        SYNCHRONOUS
-    }
-
-    /**
-     * Creates a line reader from the given stream.
-     * @Deprecated use <code>new SynchronousLineReader(stream);</code>
-     */
-    @Deprecated
-    public static LineReader fromBufferedStream(final InputStream stream) {
-        return new SynchronousLineReader(stream);
-    }
-
-    /**
-     * Creates a line reader from the given string reader.
-     * @Deprecated use <code>new SynchronousLineReader(stringReader);</code>
-     */
-    @Deprecated
-    public static LineReader fromStringReader(final StringReader stringReader) {
-        return new SynchronousLineReader(stringReader);
-    }
-
-    /**
-     * Creates a line reader from the given string reader.
-     * @Deprecated Asynchronous mode is not going to be supported. Use <code>new SynchronousLineReader(stringReader);</code>
-     */
-    @Deprecated
-    public static LineReader fromStringReader(final StringReader stringReader, final Object ignored) {
-        return new SynchronousLineReader(stringReader);
-    }
-
-    /**
-     * Convenience factory for composing a LineReader from an InputStream.
-     * @Deprecated Asynchronous mode is not going to be supported. Use <code>new SynchronousLineReader(bufferedStream);</code>
-     */
-    @Deprecated
-    public static LineReader fromBufferedStream(final InputStream bufferedStream, final Object ignored) {
-        return new SynchronousLineReader(bufferedStream);
-    }
-
-}
diff --git a/src/main/java/htsjdk/tribble/readers/LongLineBufferedReader.java b/src/main/java/htsjdk/tribble/readers/LongLineBufferedReader.java
deleted file mode 100644
index 5ca8e8d..0000000
--- a/src/main/java/htsjdk/tribble/readers/LongLineBufferedReader.java
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.tribble.readers;
-
-
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * A variant of {@link java.io.BufferedReader} with improved performance reading files with long lines.
- * 
- * This class is almost identical to BufferedReader, but it retains a single line buffer for accumulating characters in a line, and allows
- * its size to grow. Conversely, {@link java.io.BufferedReader} assumes each new line will be approximately 80 characters and its
- * performance suffers when that is not the case.
- * 
- * Unlike {@link java.io.BufferedReader}, this class is not thread safe.
- *
- * @author mccowan
- */
-public class LongLineBufferedReader extends Reader {
-
-    private Reader in;
-
-    private char cb[];
-    private int nChars, nextChar;
-
-    private static final int INVALIDATED = -2;
-    private static final int UNMARKED = -1;
-    private int markedChar = UNMARKED;
-    private int readAheadLimit = 0; /* Valid only when markedChar > 0 */
-
-    /**
-     * If the next character is a line feed, skip it
-     */
-    private boolean skipLF = false;
-
-    /**
-     * The skipLF flag when the mark was set
-     */
-    private boolean markedSkipLF = false;
-
-    private static final int DEFAULT_CHAR_BUFFER_SIZE = 8192;
-    private static final int DEFAULT_EXPECTED_LINE_LENGTH = 80;
-
-    private StringBuilder lineBuffer = new StringBuilder(DEFAULT_EXPECTED_LINE_LENGTH);
-
-    /**
-     * Creates a buffering character-input stream that uses an input buffer of
-     * the specified size.
-     *
-     * @param in A Reader
-     * @param sz Input-buffer size
-     * @throws IllegalArgumentException If sz is <= 0
-     */
-    public LongLineBufferedReader(Reader in, int sz) {
-        super(in);
-        if (sz <= 0)
-            throw new IllegalArgumentException("Buffer size <= 0");
-        this.in = in;
-        cb = new char[sz];
-        nextChar = nChars = 0;
-    }
-
-    /**
-     * Creates a buffering character-input stream that uses a default-sized
-     * input buffer.
-     *
-     * @param in A Reader
-     */
-    public LongLineBufferedReader(Reader in) {
-        this(in, DEFAULT_CHAR_BUFFER_SIZE);
-    }
-
-    /**
-     * Checks to make sure that the stream has not been closed
-     */
-    private void ensureOpen() throws IOException {
-        if (in == null)
-            throw new IOException("Stream closed");
-    }
-
-    /**
-     * Fills the input buffer, taking the mark into account if it is valid.
-     */
-    private void fill() throws IOException {
-        int dst;
-        if (markedChar <= UNMARKED) {
-        /* No mark */
-            dst = 0;
-        } else {
-        /* Marked */
-            int delta = nextChar - markedChar;
-            if (delta >= readAheadLimit) {
-        /* Gone past read-ahead limit: Invalidate mark */
-                markedChar = INVALIDATED;
-                readAheadLimit = 0;
-                dst = 0;
-            } else {
-                if (readAheadLimit <= cb.length) {
-		    /* Shuffle in the current buffer */
-                    System.arraycopy(cb, markedChar, cb, 0, delta);
-                    markedChar = 0;
-                    dst = delta;
-                } else {
-		    /* Reallocate buffer to accommodate read-ahead limit */
-                    char ncb[] = new char[readAheadLimit];
-                    System.arraycopy(cb, markedChar, ncb, 0, delta);
-                    cb = ncb;
-                    markedChar = 0;
-                    dst = delta;
-                }
-                nextChar = nChars = delta;
-            }
-        }
-
-        int n;
-        do {
-            n = in.read(cb, dst, cb.length - dst);
-        } while (n == 0);
-        if (n > 0) {
-            nChars = dst + n;
-            nextChar = dst;
-        }
-    }
-
-    /**
-     * Reads a single character.
-     *
-     * @return The character read, as an integer in the range
-     *         0 to 65535 (<tt>0x00-0xffff</tt>), or -1 if the
-     *         end of the stream has been reached
-     * @throws IOException If an I/O error occurs
-     */
-    public int read() throws IOException {
-        synchronized (lock) {
-            ensureOpen();
-            for (; ; ) {
-                if (nextChar >= nChars) {
-                    fill();
-                    if (nextChar >= nChars)
-                        return -1;
-                }
-                if (skipLF) {
-                    skipLF = false;
-                    if (cb[nextChar] == '\n') {
-                        nextChar++;
-                        continue;
-                    }
-                }
-                return cb[nextChar++];
-            }
-        }
-    }
-
-    /**
-     * Reads characters into a portion of an array, reading from the underlying
-     * stream if necessary.
-     */
-    private int read1(char[] cbuf, int off, int len) throws IOException {
-        if (nextChar >= nChars) {
-	    /* If the requested length is at least as large as the buffer, and
-	       if there is no mark/reset activity, and if line feeds are not
-	       being skipped, do not bother to copy the characters into the
-	       local buffer.  In this way buffered streams will cascade
-	       harmlessly. */
-            if (len >= cb.length && markedChar <= UNMARKED && !skipLF) {
-                return in.read(cbuf, off, len);
-            }
-            fill();
-        }
-        if (nextChar >= nChars) return -1;
-        if (skipLF) {
-            skipLF = false;
-            if (cb[nextChar] == '\n') {
-                nextChar++;
-                if (nextChar >= nChars)
-                    fill();
-                if (nextChar >= nChars)
-                    return -1;
-            }
-        }
-        int n = Math.min(len, nChars - nextChar);
-        System.arraycopy(cb, nextChar, cbuf, off, n);
-        nextChar += n;
-        return n;
-    }
-
-    /**
-     * Reads characters into a portion of an array.
-     * <p/>
-     * <p> This method implements the general contract of the corresponding
-     * <code>{@link Reader#read(char[], int, int) read}</code> method of the
-     * <code>{@link Reader}</code> class.  As an additional convenience, it
-     * attempts to read as many characters as possible by repeatedly invoking
-     * the <code>read</code> method of the underlying stream.  This iterated
-     * <code>read</code> continues until one of the following conditions becomes
-     * true: <ul>
-     * <p/>
-     * <li> The specified number of characters have been read,
-     * <p/>
-     * <li> The <code>read</code> method of the underlying stream returns
-     * <code>-1</code>, indicating end-of-file, or
-     * <p/>
-     * <li> The <code>ready</code> method of the underlying stream
-     * returns <code>false</code>, indicating that further input requests
-     * would block.
-     * <p/>
-     * </ul> If the first <code>read</code> on the underlying stream returns
-     * <code>-1</code> to indicate end-of-file then this method returns
-     * <code>-1</code>.  Otherwise this method returns the number of characters
-     * actually read.
-     * <p/>
-     * <p> Subclasses of this class are encouraged, but not required, to
-     * attempt to read as many characters as possible in the same fashion.
-     * <p/>
-     * <p> Ordinarily this method takes characters from this stream's character
-     * buffer, filling it from the underlying stream as necessary.  If,
-     * however, the buffer is empty, the mark is not valid, and the requested
-     * length is at least as large as the buffer, then this method will read
-     * characters directly from the underlying stream into the given array.
-     * Thus redundant <code>BufferedReaderTwo</code>s will not copy data
-     * unnecessarily.
-     *
-     * @param cbuf Destination buffer
-     * @param off  Offset at which to start storing characters
-     * @param len  Maximum number of characters to read
-     * @return The number of characters read, or -1 if the end of the
-     *         stream has been reached
-     * @throws IOException If an I/O error occurs
-     */
-    public int read(char cbuf[], int off, int len) throws IOException {
-        synchronized (lock) {
-            ensureOpen();
-            if ((off < 0) || (off > cbuf.length) || (len < 0) ||
-                    ((off + len) > cbuf.length) || ((off + len) < 0)) {
-                throw new IndexOutOfBoundsException();
-            } else if (len == 0) {
-                return 0;
-            }
-
-            int n = read1(cbuf, off, len);
-            if (n <= 0) return n;
-            while ((n < len) && in.ready()) {
-                int n1 = read1(cbuf, off + n, len - n);
-                if (n1 <= 0) break;
-                n += n1;
-            }
-            return n;
-        }
-    }
-
-    /**
-     * Reads a line of text.  A line is considered to be terminated by any one
-     * of a line feed ('\n'), a carriage return ('\r'), or a carriage return
-     * followed immediately by a linefeed.
-     *
-     * @param ignoreLF If true, the next '\n' will be skipped
-     * @return A String containing the contents of the line, not including
-     *         any line-termination characters, or null if the end of the
-     *         stream has been reached
-     * @throws IOException If an I/O error occurs
-     * @see java.io.LineNumberReader#readLine()
-     */
-    String readLine(boolean ignoreLF) throws IOException {
-        int startChar;
-        lineBuffer.setLength(0);
-        
-        synchronized (lock) {
-            ensureOpen();
-            boolean omitLF = ignoreLF || skipLF;
-
-            bufferLoop:
-            for (; ; ) {
-
-                if (nextChar >= nChars)
-                    fill();
-                if (nextChar >= nChars) { /* EOF */
-                    if (lineBuffer != null && lineBuffer.length() > 0)
-                        return lineBuffer.toString();
-                    else
-                        return null;
-                }
-                boolean eol = false;
-                char c = 0;
-                int i;
-
-                /* Skip a leftover '\n', if necessary */
-                if (omitLF && (cb[nextChar] == '\n'))
-                    nextChar++;
-                skipLF = false;
-                omitLF = false;
-
-                charLoop:
-                for (i = nextChar; i < nChars; i++) {
-                    c = cb[i];
-                    if ((c == '\n') || (c == '\r')) {
-                        eol = true;
-                        break charLoop;
-                    }
-                }
-
-                startChar = nextChar;
-                nextChar = i;
-
-                if (eol) {
-                    String str;
-                    lineBuffer.append(cb, startChar, i - startChar);
-                    str = lineBuffer.toString();
-                    nextChar++;
-                    if (c == '\r') {
-                        skipLF = true;
-                    }
-                    return str;
-                }
-
-                lineBuffer.append(cb, startChar, i - startChar);
-            }
-        }
-    }
-
-    /**
-     * Reads a line of text.  A line is considered to be terminated by any one
-     * of a line feed ('\n'), a carriage return ('\r'), or a carriage return
-     * followed immediately by a linefeed.
-     *
-     * @return A String containing the contents of the line, not including
-     *         any line-termination characters, or null if the end of the
-     *         stream has been reached
-     * @throws IOException If an I/O error occurs
-     */
-    public String readLine() throws IOException {
-        return readLine(false);
-    }
-
-    /**
-     * Skips characters.
-     *
-     * @param n The number of characters to skip
-     * @return The number of characters actually skipped
-     * @throws IllegalArgumentException If <code>n</code> is negative.
-     * @throws IOException              If an I/O error occurs
-     */
-    public long skip(long n) throws IOException {
-        if (n < 0L) {
-            throw new IllegalArgumentException("skip value is negative");
-        }
-        synchronized (lock) {
-            ensureOpen();
-            long r = n;
-            while (r > 0) {
-                if (nextChar >= nChars)
-                    fill();
-                if (nextChar >= nChars)	/* EOF */
-                    break;
-                if (skipLF) {
-                    skipLF = false;
-                    if (cb[nextChar] == '\n') {
-                        nextChar++;
-                    }
-                }
-                long d = nChars - nextChar;
-                if (r <= d) {
-                    nextChar += r;
-                    r = 0;
-                    break;
-                } else {
-                    r -= d;
-                    nextChar = nChars;
-                }
-            }
-            return n - r;
-        }
-    }
-
-    /**
-     * Tells whether this stream is ready to be read.  A buffered character
-     * stream is ready if the buffer is not empty, or if the underlying
-     * character stream is ready.
-     *
-     * @throws IOException If an I/O error occurs
-     */
-    public boolean ready() throws IOException {
-        synchronized (lock) {
-            ensureOpen();
-
-	    /* 
-	     * If newline needs to be skipped and the next char to be read
-	     * is a newline character, then just skip it right away.
-	     */
-            if (skipLF) {
-		/* Note that in.ready() will return true if and only if the next 
-		 * read on the stream will not block.
-		 */
-                if (nextChar >= nChars && in.ready()) {
-                    fill();
-                }
-                if (nextChar < nChars) {
-                    if (cb[nextChar] == '\n')
-                        nextChar++;
-                    skipLF = false;
-                }
-            }
-            return (nextChar < nChars) || in.ready();
-        }
-    }
-
-    /**
-     * Tells whether this stream supports the mark() operation, which it does.
-     */
-    public boolean markSupported() {
-        return true;
-    }
-
-    /**
-     * Marks the present position in the stream.  Subsequent calls to reset()
-     * will attempt to reposition the stream to this point.
-     *
-     * @param readAheadLimit Limit on the number of characters that may be
-     *                       read while still preserving the mark. An attempt
-     *                       to reset the stream after reading characters
-     *                       up to this limit or beyond may fail.
-     *                       A limit value larger than the size of the input
-     *                       buffer will cause a new buffer to be allocated
-     *                       whose size is no smaller than limit.
-     *                       Therefore large values should be used with care.
-     * @throws IllegalArgumentException If readAheadLimit is < 0
-     * @throws IOException              If an I/O error occurs
-     */
-    public void mark(int readAheadLimit) throws IOException {
-        if (readAheadLimit < 0) {
-            throw new IllegalArgumentException("Read-ahead limit < 0");
-        }
-        synchronized (lock) {
-            ensureOpen();
-            this.readAheadLimit = readAheadLimit;
-            markedChar = nextChar;
-            markedSkipLF = skipLF;
-        }
-    }
-
-    /**
-     * Resets the stream to the most recent mark.
-     *
-     * @throws IOException If the stream has never been marked,
-     *                     or if the mark has been invalidated
-     */
-    public void reset() throws IOException {
-        synchronized (lock) {
-            ensureOpen();
-            if (markedChar < 0)
-                throw new IOException((markedChar == INVALIDATED)
-                        ? "Mark invalid"
-                        : "Stream not marked");
-            nextChar = markedChar;
-            skipLF = markedSkipLF;
-        }
-    }
-
-    public void close() throws IOException {
-        synchronized (lock) {
-            if (in == null)
-                return;
-            in.close();
-            in = null;
-            cb = null;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/readers/Positional.java b/src/main/java/htsjdk/tribble/readers/Positional.java
deleted file mode 100644
index 50f4039..0000000
--- a/src/main/java/htsjdk/tribble/readers/Positional.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.LocationAware;
-
-import java.io.IOException;
-
-/**
- * Minimal interface for an object at support getting the current position in the stream / writer / file, as well as a handful of other
- * reader-like features.
- * 
- * @author depristo
- */
-public interface Positional extends LocationAware {
-    /**
-     * Is the stream done?  Equivalent to ! hasNext() for an iterator?
-     * @return true if the stream has reached EOF, false otherwise
-     */
-    public boolean isDone() throws IOException;
-
-    /**
-     * Skip the next nBytes in the stream.
-     * @param nBytes to skip, must be >= 0
-     * @return the number of bytes actually skippped.
-     * @throws IOException
-     */
-    public long skip(long nBytes) throws IOException;
-
-    /**
-     * Return the next byte in the first, without actually reading it from the stream.
-     *
-     * Has the same output as read()
-     *
-     * @return the next byte, or -1 if EOF encountered
-     * @throws IOException
-     */
-    public int peek() throws IOException;
-}
diff --git a/src/main/java/htsjdk/tribble/readers/PositionalBufferedStream.java b/src/main/java/htsjdk/tribble/readers/PositionalBufferedStream.java
deleted file mode 100644
index ac642df..0000000
--- a/src/main/java/htsjdk/tribble/readers/PositionalBufferedStream.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (c) 2007-2009 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.tribble.TribbleException;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-/**
- * A wrapper around an {@code InputStream} which performs it's own buffering, and keeps track of the position.
- * 
- * @author depristo
- */
-public final class PositionalBufferedStream extends InputStream implements Positional {
-    final InputStream is;
-    final byte[] buffer;
-    int nextChar;
-    int nChars;
-    long position;
-
-    public PositionalBufferedStream(final InputStream is) {
-        this(is, 512000);
-    }
-
-    public PositionalBufferedStream(final InputStream is, final int bufferSize) {
-        this.is = is;
-        buffer = new byte[bufferSize];
-        nextChar = nChars = 0;
-    }
-
-    public final long getPosition() {
-        return position;
-    }
-
-    @Override
-    public final int read() throws IOException {
-        final int c = peek();
-        if ( c >= 0 ) {
-            // update position and buffer offset if peek says we aren't yet done
-            position++;
-            nextChar++;
-        }
-        return c;
-    }
-
-    @Override
-    public final int read(final byte[] bytes, final int start, final int len) throws IOException {
-        if ( len == 0 ) // If len is zero, then no bytes are read and 0 is returned
-            return 0;
-        if (nChars < 0) // If no byte is available because the stream is at end of file, the value -1 is returned
-            return -1;
-        else {
-            int nRead = 0;
-            int remaining = len;
-
-            while ( remaining > 0 ) {
-                // Try to Refill buffer if at the end of current buffer
-                if ( nChars == nextChar )
-                    if ( fill() < 0 ) { // EOF
-                        break;
-                    }
-
-                // we copy as many bytes from the buffer as possible, up to the number of need
-                final int nCharsToCopy = Math.min(nChars - nextChar, remaining);
-                System.arraycopy(buffer, nextChar, bytes, start + nRead, nCharsToCopy);
-
-                // update nextChar (pointer into buffer) and keep track of nRead and remaining
-                nextChar  += nCharsToCopy;
-                nRead     += nCharsToCopy;
-                remaining -= nCharsToCopy;
-            }
-
-            // make sure we update our position tracker to reflect having advanced by nRead bytes
-            position += nRead;
-            
-            /** Conform to {@link InputStream#read(byte[], int, int)} contract by returning -1 if EOF and no data was read. */
-            return nRead == 0 ? -1 : nRead;
-        }
-    }
-
-    @Override
-    public final int read(final byte[] bytes) throws IOException {
-        return read(bytes, 0, bytes.length);
-    }
-
-    @Override
-    public final boolean isDone() throws IOException {
-        return nChars == -1 || peek() == -1;
-    }
-
-    @Override
-    public final int peek() throws IOException {
-        // Check for EOF
-        if (nChars < 0) {
-            return -1;
-        } else if (nextChar == nChars){
-            //Try to Refill buffer if at the end of current buffer
-            if ( fill() < 0 ){
-                return -1;
-            }
-        }
-
-        return byteToInt(buffer[nextChar]);
-    }
-
-    private final int fill() throws IOException {
-        nChars = is.read(buffer);
-        nextChar = 0;
-        return nChars;
-    }
-
-    public final long skip(final long nBytes) throws IOException {
-        long remainingToSkip = nBytes;
-
-        // because we have this buffer, that may be shorter than nBytes
-        // we loop while there are bytes to skip, filling the buffer
-        // When the buffer contains enough data that we have less than
-        // its less left to skip we increase nextChar by the remaining
-        // amount
-        while ( remainingToSkip > 0 && ! isDone() ) {
-            final long bytesLeftInBuffer = nChars - nextChar;
-            if ( remainingToSkip > bytesLeftInBuffer ) {
-                // we need to refill the buffer and continue our skipping
-                remainingToSkip -= bytesLeftInBuffer;
-                fill();
-            } else {
-                // there are enough bytes in the buffer to not read again
-                // we just push forward the pointer nextChar
-                nextChar += remainingToSkip;
-                remainingToSkip = 0;
-            }
-        }
-
-        final long actuallySkipped = nBytes - remainingToSkip;
-        position += actuallySkipped;
-        return actuallySkipped;
-    }
-
-    public final void close() {
-        try {
-            is.close();
-        } catch (IOException ex) {
-            new TribbleException("Failed to close PositionalBufferedStream", ex);
-        }
-    }
-
-    private final static int byteToInt(byte b) {
-        return b & 0xFF;
-    }
-
-    public static void main(String[] args) throws Exception {
-        final File testFile = new File(args[0]);
-        final int iterations = Integer.valueOf(args[1]);
-        final boolean includeInputStream = Boolean.valueOf(args[2]);
-        final boolean doReadFileInChunks = Boolean.valueOf(args[3]);
-
-        System.out.printf("Testing %s%n", args[0]);
-        for (int i = 0; i < iterations; i++) {
-            if ( includeInputStream ) {
-                final InputStream is = new FileInputStream(testFile);
-                if ( doReadFileInChunks )
-                    readFileInChunks("InputStream", is);
-                else
-                    readFileByLine("InputStream", is);
-                is.close();
-            }
-
-            final PositionalBufferedStream pbs = new PositionalBufferedStream(new FileInputStream(testFile));
-            if ( doReadFileInChunks )
-                readFileInChunks("PositionalBufferedStream", pbs);
-            else
-                readFileByLine("PositionalBufferedStream", pbs);
-            pbs.close();
-        }
-    }
-
-    private static void readFileByLine(final String name, final InputStream is) throws IOException {
-        final BufferedReader reader2 = new BufferedReader(new InputStreamReader(is));
-        final long t0 = System.currentTimeMillis();
-        long lineCount = 0;
-        while (reader2.readLine() != null) {
-            lineCount++;
-        }
-        final long dt = System.currentTimeMillis() - t0;
-        final double rate = ((double) lineCount) / dt;
-        printStatus(name, lineCount, rate, dt);
-        reader2.close();
-    }
-
-    private static void readFileInChunks(final String name, final InputStream is) throws IOException {
-        final long t0 = System.currentTimeMillis();
-        long chunk = 0;
-        final byte[] bytes = new byte[4096];
-        while (is.read(bytes) != -1) {
-            chunk++;
-        }
-        final long dt = System.currentTimeMillis() - t0;
-        final double rate = ((double) chunk) / dt;
-        printStatus(name, chunk, rate, dt);
-        is.close();
-    }
-
-
-    private static final void printStatus(final String name, long lineCount, double rate, long dt) {
-        System.out.printf("%30s: %d lines read.  Rate = %.2e lines per second.  DT = %d%n", name, lineCount, rate, dt);
-        System.out.flush();
-    }
-}
-
diff --git a/src/main/java/htsjdk/tribble/readers/SynchronousLineReader.java b/src/main/java/htsjdk/tribble/readers/SynchronousLineReader.java
deleted file mode 100644
index 5de8b22..0000000
--- a/src/main/java/htsjdk/tribble/readers/SynchronousLineReader.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
-/**
- * Implementation of {@link LineReader} that reads lines directly from the underlying stream or reader.
- */
-public final class SynchronousLineReader implements LineReader{
-    private final LongLineBufferedReader longLineBufferedReader;
-
-    public SynchronousLineReader(final InputStream stream){
-        this(new InputStreamReader(stream));
-    }
-
-    public SynchronousLineReader(final Reader reader){
-        this.longLineBufferedReader = new LongLineBufferedReader(reader);
-    }
-
-    @Override
-    public String readLine() {
-        try {
-            return longLineBufferedReader.readLine();
-        } catch (final IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    @Override
-    public void close() {
-        CloserUtil.close(longLineBufferedReader);
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/readers/TabixIteratorLineReader.java b/src/main/java/htsjdk/tribble/readers/TabixIteratorLineReader.java
deleted file mode 100644
index 49b6f0c..0000000
--- a/src/main/java/htsjdk/tribble/readers/TabixIteratorLineReader.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-
-/**
- * @author Jim Robinson
- * @date 2/11/12
- */
-public class TabixIteratorLineReader implements LineReader {
-
-    TabixReader.Iterator iterator;
-
-
-    public TabixIteratorLineReader(TabixReader.Iterator iterator) {
-        this.iterator = iterator;
-    }
-
-    public String readLine() {
-        try {
-            return iterator != null ? iterator.next() : null;
-        } catch (IOException e) {
-            throw new RuntimeIOException(e);
-        }
-    }
-
-    public void close() {
-        // Ignore -
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/readers/TabixReader.java b/src/main/java/htsjdk/tribble/readers/TabixReader.java
deleted file mode 100644
index 8867d07..0000000
--- a/src/main/java/htsjdk/tribble/readers/TabixReader.java
+++ /dev/null
@@ -1,526 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.seekablestream.ISeekableStreamFactory;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.tribble.util.TabixUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Heng Li <hengli at broadinstitute.org>
- */
-public class TabixReader {
-    private String mFn;
-    private String mIdxFn;
-    private BlockCompressedInputStream mFp;
-
-    private int mPreset;
-    private int mSc;
-    private int mBc;
-    private int mEc;
-    private int mMeta;
-    //private int mSkip; (not used)
-    private String[] mSeq;
-
-    private Map<String, Integer> mChr2tid;
-
-    private static int MAX_BIN = 37450;
-    //private static int TAD_MIN_CHUNK_GAP = 32768; (not used)
-    private static int TAD_LIDX_SHIFT = 14;
-
-    protected static class TPair64 implements Comparable<TPair64> {
-        long u, v;
-
-        public TPair64(final long _u, final long _v) {
-            u = _u;
-            v = _v;
-        }
-
-        public TPair64(final TPair64 p) {
-            u = p.u;
-            v = p.v;
-        }
-
-        public int compareTo(final TPair64 p) {
-            return u == p.u ? 0 : ((u < p.u) ^ (u < 0) ^ (p.u < 0)) ? -1 : 1; // unsigned 64-bit comparison
-        }
-    }
-
-    protected static class TIndex {
-        HashMap<Integer, TPair64[]> b; // binning index
-        long[] l; // linear index
-    }
-
-    protected TIndex[] mIndex;
-
-    private static class TIntv {
-        int tid, beg, end;
-    }
-
-    private static boolean less64(final long u, final long v) { // unsigned 64-bit comparison
-        return (u < v) ^ (u < 0) ^ (v < 0);
-    }
-
-    /**
-     * @param fn File name of the data file
-     */
-    public TabixReader(final String fn) throws IOException {
-        this(fn, null, SeekableStreamFactory.getInstance().getBufferedStream(SeekableStreamFactory.getInstance().getStreamFor(fn)));
-    }
-
-    /**
-     * @param fn File name of the data file
-     * @param idxFn Full path to the index file. Auto-generated if null
-     */
-    public TabixReader(final String fn, final String idxFn) throws IOException {
-        this(fn, idxFn, SeekableStreamFactory.getInstance().getBufferedStream(SeekableStreamFactory.getInstance().getStreamFor(fn)));
-    }
-
-    /**
-     * @param fn File name of the data file  (used for error messages only)
-     * @param stream Seekable stream from which the data is read
-     */
-    public TabixReader(final String fn, SeekableStream stream) throws IOException {
-        this(fn, null, stream);
-    }
-
-    /**
-     * @param fn File name of the data file  (used for error messages only)
-     * @param idxFn Full path to the index file. Auto-generated if null
-     * @param stream Seekable stream from which the data is read
-     */
-    public TabixReader(final String fn, final String idxFn, SeekableStream stream) throws IOException {
-        mFn = fn;
-        mFp = new BlockCompressedInputStream(stream);
-        if(idxFn == null){
-            mIdxFn = ParsingUtils.appendToPath(fn, TabixUtils.STANDARD_INDEX_EXTENSION);
-        } else {
-            mIdxFn = idxFn;
-        }
-        readIndex();
-    }
-
-    /** return the source (filename/URL) of that reader */
-    public String getSource()
-        {
-        return this.mFn;
-        }
-
-    private static int reg2bins(final int beg, final int _end, final int[] list) {
-        int i = 0, k, end = _end;
-        if (beg >= end) return 0;
-        if (end >= 1 << 29) end = 1 << 29;
-        --end;
-        list[i++] = 0;
-        for (k = 1 + (beg >> 26); k <= 1 + (end >> 26); ++k) list[i++] = k;
-        for (k = 9 + (beg >> 23); k <= 9 + (end >> 23); ++k) list[i++] = k;
-        for (k = 73 + (beg >> 20); k <= 73 + (end >> 20); ++k) list[i++] = k;
-        for (k = 585 + (beg >> 17); k <= 585 + (end >> 17); ++k) list[i++] = k;
-        for (k = 4681 + (beg >> 14); k <= 4681 + (end >> 14); ++k) list[i++] = k;
-        return i;
-    }
-
-    public static int readInt(final InputStream is) throws IOException {
-        byte[] buf = new byte[4];
-        is.read(buf);
-        return ByteBuffer.wrap(buf).order(ByteOrder.LITTLE_ENDIAN).getInt();
-    }
-
-    public static long readLong(final InputStream is) throws IOException {
-        byte[] buf = new byte[8];
-        is.read(buf);
-        return ByteBuffer.wrap(buf).order(ByteOrder.LITTLE_ENDIAN).getLong();
-    }
-
-    public static String readLine(final InputStream is) throws IOException {
-        StringBuffer buf = new StringBuffer();
-        int c;
-        while ((c = is.read()) >= 0 && c != '\n')
-            buf.append((char) c);
-        if (c < 0) return null;
-        return buf.toString();
-    }
-
-    /**
-     * Read the Tabix index from a file
-     *
-     * @param fp File pointer
-     */
-    private void readIndex(SeekableStream fp) throws IOException {
-        if (fp == null) return;
-        BlockCompressedInputStream is = new BlockCompressedInputStream(fp);
-        byte[] buf = new byte[4];
-
-        is.read(buf, 0, 4); // read "TBI\1"
-        mSeq = new String[readInt(is)]; // # sequences
-        mChr2tid = new HashMap<String, Integer>();
-        mPreset = readInt(is);
-        mSc = readInt(is);
-        mBc = readInt(is);
-        mEc = readInt(is);
-        mMeta = readInt(is);
-        readInt(is);//unused
-        // read sequence dictionary
-        int i, j, k, l = readInt(is);
-        buf = new byte[l];
-        is.read(buf);
-        for (i = j = k = 0; i < buf.length; ++i) {
-            if (buf[i] == 0) {
-                byte[] b = new byte[i - j];
-                System.arraycopy(buf, j, b, 0, b.length);
-                String s = new String(b);
-                mChr2tid.put(s, k);
-                mSeq[k++] = s;
-                j = i + 1;
-            }
-        }
-        // read the index
-        mIndex = new TIndex[mSeq.length];
-        for (i = 0; i < mSeq.length; ++i) {
-            // the binning index
-            int n_bin = readInt(is);
-            mIndex[i] = new TIndex();
-            mIndex[i].b = new HashMap<Integer, TPair64[]>(n_bin);
-            for (j = 0; j < n_bin; ++j) {
-                int bin = readInt(is);
-                TPair64[] chunks = new TPair64[readInt(is)];
-                for (k = 0; k < chunks.length; ++k) {
-                    long u = readLong(is);
-                    long v = readLong(is);
-                    chunks[k] = new TPair64(u, v); // in C, this is inefficient
-                }
-                mIndex[i].b.put(bin, chunks);
-            }
-            // the linear index
-            mIndex[i].l = new long[readInt(is)];
-            for (k = 0; k < mIndex[i].l.length; ++k)
-                mIndex[i].l[k] = readLong(is);
-        }
-        // close
-        is.close();
-    }
-
-    /**
-     * Read the Tabix index from the default file.
-     */
-    private void readIndex() throws IOException {
-        ISeekableStreamFactory ssf = SeekableStreamFactory.getInstance();
-        readIndex(ssf.getBufferedStream(ssf.getStreamFor(mIdxFn), 128000));
-    }
-
-    /**
-     * Read one line from the data file.
-     */
-    public String readLine() throws IOException {
-        return readLine(mFp);
-    }
-
-    /** return chromosome ID or -1 if it is unknown */
-    public int chr2tid(final String chr) {
-        Integer tid=this.mChr2tid.get(chr);
-       return tid==null?-1:tid;
-    }
-
-    /** return the chromosomes in that tabix file */
-    public Set<String> getChromosomes()
-        {
-        return Collections.unmodifiableSet(this.mChr2tid.keySet());
-        }
-
-    /**
-     * Parse a region in the format of "chr1", "chr1:100" or "chr1:100-1000"
-     *
-     * @param reg Region string
-     * @return An array where the three elements are sequence_id,
-     *         region_begin and region_end. On failure, sequence_id==-1.
-     */
-    public int[] parseReg(final String reg) { // FIXME: NOT working when the sequence name contains : or -.
-        String chr;
-        int colon, hyphen;
-        int[] ret = new int[3];
-        colon = reg.indexOf(':');
-        hyphen = reg.indexOf('-');
-        chr = colon >= 0 ? reg.substring(0, colon) : reg;
-        ret[1] = colon >= 0 ? Integer.parseInt(reg.substring(colon + 1, hyphen >= 0 ? hyphen : reg.length())) - 1 : 0;
-        ret[2] = hyphen >= 0 ? Integer.parseInt(reg.substring(hyphen + 1)) : 0x7fffffff;
-        ret[0] = this.chr2tid(chr);
-        return ret;
-    }
-
-    private TIntv getIntv(final String s) {
-        TIntv intv = new TIntv();
-        int col = 0, end = 0, beg = 0;
-        while ((end = s.indexOf('\t', beg)) >= 0 || end == -1) {
-            ++col;
-            if (col == mSc) {
-                intv.tid = chr2tid(end != -1 ? s.substring(beg, end) : s.substring(beg));
-            } else if (col == mBc) {
-                intv.beg = intv.end = Integer.parseInt(end != -1 ? s.substring(beg, end) : s.substring(beg));
-                if ((mPreset & 0x10000) != 0) ++intv.end;
-                else --intv.beg;
-                if (intv.beg < 0) intv.beg = 0;
-                if (intv.end < 1) intv.end = 1;
-            } else { // FIXME: SAM supports are not tested yet
-                if ((mPreset & 0xffff) == 0) { // generic
-                    if (col == mEc)
-                        intv.end = Integer.parseInt(end != -1 ? s.substring(beg, end) : s.substring(beg));
-                } else if ((mPreset & 0xffff) == 1) { // SAM
-                    if (col == 6) { // CIGAR
-                        int l = 0, i, j;
-                        String cigar = s.substring(beg, end);
-                        for (i = j = 0; i < cigar.length(); ++i) {
-                            if (cigar.charAt(i) > '9') {
-                                int op = cigar.charAt(i);
-                                if (op == 'M' || op == 'D' || op == 'N')
-                                    l += Integer.parseInt(cigar.substring(j, i));
-                                j = i + 1;
-                            }
-                        }
-                        intv.end = intv.beg + l;
-                    }
-                } else if ((mPreset & 0xffff) == 2) { // VCF
-                    String alt;
-                    alt = end >= 0 ? s.substring(beg, end) : s.substring(beg);
-                    if (col == 4) { // REF
-                        if (!alt.isEmpty()) intv.end = intv.beg + alt.length();
-                    } else if (col == 8) { // INFO
-                        int e_off = -1, i = alt.indexOf("END=");
-                        if (i == 0) e_off = 4;
-                        else if (i > 0) {
-                            i = alt.indexOf(";END=");
-                            if (i >= 0) e_off = i + 5;
-                        }
-                        if (e_off > 0) {
-                            i = alt.indexOf(';', e_off);
-                            intv.end = Integer.parseInt(i > e_off ? alt.substring(e_off, i) : alt.substring(e_off));
-                        }
-                    }
-                }
-            }
-            if (end == -1) break;
-            beg = end + 1;
-        }
-        return intv;
-    }
-
-    public interface Iterator
-        {
-        /** return null when there is no more data to read */
-        public String next() throws IOException;
-        }
-
-    /** iterator returned instead of null when there is no more data */
-    private static final Iterator EOF_ITERATOR=new Iterator()  {
-        @Override
-        public String next() throws IOException {
-            return null;
-            }
-        };
-
-    /** default implementation of Iterator */
-    private class IteratorImpl implements Iterator {
-        private int i;
-        //private int n_seeks;
-        private int tid, beg, end;
-        private TPair64[] off;
-        private long curr_off;
-        private boolean iseof;
-
-        private IteratorImpl(final int _tid, final int _beg, final int _end, final TPair64[] _off) {
-            i = -1;
-            //n_seeks = 0;
-            curr_off = 0;
-            iseof = false;
-            off = _off;
-            tid = _tid;
-            beg = _beg;
-            end = _end;
-        }
-
-        @Override
-        public String next() throws IOException {
-            if (iseof) return null;
-            for (; ;) {
-                if (curr_off == 0 || !less64(curr_off, off[i].v)) { // then jump to the next chunk
-                    if (i == off.length - 1) break; // no more chunks
-                    if (i >= 0) assert (curr_off == off[i].v); // otherwise bug
-                    if (i < 0 || off[i].v != off[i + 1].u) { // not adjacent chunks; then seek
-                        mFp.seek(off[i + 1].u);
-                        curr_off = mFp.getFilePointer();
-                        //++n_seeks;
-                    }
-                    ++i;
-                }
-                String s;
-                if ((s = readLine(mFp)) != null) {
-                    TIntv intv;
-                    char[] str = s.toCharArray();
-                    curr_off = mFp.getFilePointer();
-                    if (str.length == 0 || str[0] == mMeta) continue;
-                    intv = getIntv(s);
-                    if (intv.tid != tid || intv.beg >= end) break; // no need to proceed
-                    else if (intv.end > beg && intv.beg < end) return s; // overlap; return
-                } else break; // end of file
-            }
-            iseof = true;
-            return null;
-        }
-    }
-
-    /**
-     * Return
-     * @param tid Sequence id
-     * @param beg beginning of interval, genomic coords
-     * @param end end of interval, genomic coords
-     * @return an iterator over the lines within the specified interval
-     */
-    public Iterator query(final int tid, final int beg, final int end) {
-        TPair64[] off, chunks;
-        long min_off;
-        if(tid< 0 || tid>=this.mIndex.length) return EOF_ITERATOR;
-        TIndex idx = mIndex[tid];
-        int[] bins = new int[MAX_BIN];
-        int i, l, n_off, n_bins = reg2bins(beg, end, bins);
-        if (idx.l.length > 0)
-            min_off = (beg >> TAD_LIDX_SHIFT >= idx.l.length) ? idx.l[idx.l.length - 1] : idx.l[beg >> TAD_LIDX_SHIFT];
-        else min_off = 0;
-        for (i = n_off = 0; i < n_bins; ++i) {
-            if ((chunks = idx.b.get(bins[i])) != null)
-                n_off += chunks.length;
-        }
-        if (n_off == 0) return EOF_ITERATOR;
-        off = new TPair64[n_off];
-        for (i = n_off = 0; i < n_bins; ++i)
-            if ((chunks = idx.b.get(bins[i])) != null)
-                for (int j = 0; j < chunks.length; ++j)
-                    if (less64(min_off, chunks[j].v))
-                        off[n_off++] = new TPair64(chunks[j]);
-        Arrays.sort(off, 0, n_off);
-        // resolve completely contained adjacent blocks
-        for (i = 1, l = 0; i < n_off; ++i) {
-            if (less64(off[l].v, off[i].v)) {
-                ++l;
-                off[l].u = off[i].u;
-                off[l].v = off[i].v;
-            }
-        }
-        n_off = l + 1;
-        // resolve overlaps between adjacent blocks; this may happen due to the merge in indexing
-        for (i = 1; i < n_off; ++i)
-            if (!less64(off[i - 1].v, off[i].u)) off[i - 1].v = off[i].u;
-        // merge adjacent blocks
-        for (i = 1, l = 0; i < n_off; ++i) {
-            if (off[l].v >> 16 == off[i].u >> 16) off[l].v = off[i].v;
-            else {
-                ++l;
-                off[l].u = off[i].u;
-                off[l].v = off[i].v;
-            }
-        }
-        n_off = l + 1;
-        // return
-        TPair64[] ret = new TPair64[n_off];
-        for (i = 0; i < n_off; ++i) {
-            if (off[i] != null) ret[i] = new TPair64(off[i].u, off[i].v); // in C, this is inefficient
-        }
-        if (ret.length == 0 || (ret.length == 1 && ret[0] == null))
-            return EOF_ITERATOR;
-        return new TabixReader.IteratorImpl(tid, beg, end, ret);
-    }
-
-    /**
-     *
-     * @see #parseReg(String)
-     * @param reg A region string of the form acceptable by {@link #parseReg(String)}
-     * @return
-     */
-    public Iterator query(final String reg) {
-        int[] x = parseReg(reg);
-        if(x[0]<0) return EOF_ITERATOR;
-        return query(x[0], x[1], x[2]);
-    }
-
-    /**
-    *
-    * @see #parseReg(String)
-    * @param reg a chromosome
-    * @param start start interval
-    * @param end end interval
-    * @return a tabix iterator
-    */
-   public Iterator query(final String reg,int start,int end) {
-       int tid=this.chr2tid(reg);
-       if(tid==-1) return EOF_ITERATOR;
-       return query(tid, start, end);
-   }
-
-    public static void main(String[] args) {
-        if (args.length < 1) {
-            System.out.println("Usage: java -cp .:sam.jar TabixReader <in.gz> [region]");
-            System.exit(1);
-        }
-        try {
-            TabixReader tr = new TabixReader(args[0]);
-            String s;
-            if (args.length == 1) { // no region is specified; print the whole file
-                while ((s = tr.readLine()) != null)
-                    System.out.println(s);
-            } else { // a region is specified; random access
-                TabixReader.Iterator iter = tr.query(args[1]); // get the iterator
-                while ((s = iter.next()) != null)
-                    System.out.println(s);
-            }
-        } catch (IOException e) {
-        }
-    }
-
-    // ADDED BY JTR
-    public void close() {
-        if(mFp != null) {
-            try {
-                mFp.close();
-            } catch (IOException e) {
-
-            }
-        }
-    }
-
-    @Override
-    public String toString() {
-        return "TabixReader: filename:"+getSource();
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/readme.txt b/src/main/java/htsjdk/tribble/readme.txt
deleted file mode 100644
index 6ee86c3..0000000
--- a/src/main/java/htsjdk/tribble/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-Source root for tribble project -- indexed, queryable genomic file formats
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/util/FTPHelper.java b/src/main/java/htsjdk/tribble/util/FTPHelper.java
deleted file mode 100644
index c28650f..0000000
--- a/src/main/java/htsjdk/tribble/util/FTPHelper.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package htsjdk.tribble.util;
-
-import htsjdk.samtools.util.ftp.FTPClient;
-import htsjdk.samtools.util.ftp.FTPStream;
-import htsjdk.samtools.util.ftp.FTPUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * @author jacob
- * @date 2013-Apr-11
- */
-public class FTPHelper implements URLHelper {
-
-    private URL url;
-
-    public FTPHelper(URL url) {
-        if (!url.getProtocol().toLowerCase().equals("ftp")) {
-            throw new IllegalArgumentException("FTPHelper can only be used with ftp protocol, not " + url.getProtocol());
-        }
-        this.url = url;
-    }
-
-    @Override
-    public URL getUrl() {
-        return this.url;
-    }
-
-    @Override
-    public long getContentLength() throws IOException {
-        return FTPUtils.getContentLength(this.url);
-    }
-
-    @Override
-    public InputStream openInputStream() throws IOException {
-        String file = url.getPath();
-        FTPClient ftp = FTPUtils.connect(url.getHost(), url.getUserInfo(), null);
-        ftp.pasv();
-        ftp.retr(file);
-        return new FTPStream(ftp);
-    }
-
-    @Override
-    @Deprecated
-    public InputStream openInputStreamForRange(long start, long end) throws IOException {
-        throw new UnsupportedOperationException("Cannot perform range operations over FTP");
-    }
-
-    @Override
-    public boolean exists() throws IOException {
-        return FTPUtils.resourceAvailable(this.url);
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/util/HTTPHelper.java b/src/main/java/htsjdk/tribble/util/HTTPHelper.java
deleted file mode 100644
index 90e6228..0000000
--- a/src/main/java/htsjdk/tribble/util/HTTPHelper.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard.  All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.tribble.util;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.Proxy;
-import java.net.URL;
-import java.net.URLConnection;
-
-/**
- * Simple implementation of URLHelper based on the JDK URL and HttpURLConnection classes.  This
- * version optionally takes a proxy, but does not support authentication.
- *
- * @author jrobinso
- * @date Jun 28, 2011
- */
-public class HTTPHelper implements URLHelper {
-    /**
-     * Global proxy setting -- shared by all instances
-     */
-    static Proxy proxy;
-
-    private URL url;
-
-    public HTTPHelper(URL url) {
-        this.url = url;
-        proxy = null;
-
-        try {
-            URLConnection conn = openConnection();
-            conn.setDefaultUseCaches(false);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    public static synchronized void setProxy(Proxy p) {
-        proxy = p;
-    }
-
-    public URL getUrl() {
-        return url;
-    }
-
-    /**
-     * @return content length of the resource
-     * @throws IOException
-     */
-    public long getContentLength() throws IOException {
-
-        HttpURLConnection con = null;
-        try {
-            con = openConnection();
-            con.setRequestMethod("HEAD");
-            if ((con.getResponseCode() != HttpURLConnection.HTTP_OK)) {
-                System.out.println("Error (" + con.getResponseMessage() + " ) fetching content length: " + url);
-                return -1;
-            } else {
-                String contentLength = con.getHeaderField("Content-Length");
-                return contentLength == null ? -1 : Long.parseLong(contentLength);
-            }
-        } finally {
-            if (con != null) con.disconnect();
-        }
-    }
-
-
-    public InputStream openInputStream() throws IOException {
-
-        HttpURLConnection connection = openConnection();
-        return new WrapperInputStream(connection, connection.getInputStream());
-    }
-
-
-    /**
-     * Open an input stream for the requested byte range.  Its the client's responsibility to close the stream.
-     *
-     * @param start start of range in bytes
-     * @param end   end of range ni bytes
-     * @return
-     * @throws IOException
-     */
-    @Deprecated
-    public InputStream openInputStreamForRange(long start, long end) throws IOException {
-
-        HttpURLConnection connection = openConnection();
-        String byteRange = "bytes=" + start + "-" + end;
-        connection.setRequestProperty("Range", byteRange);
-        return new WrapperInputStream(connection, connection.getInputStream());
-    }
-
-    private HttpURLConnection openConnection() throws IOException {
-        HttpURLConnection connection;
-        if (proxy == null) {
-            connection = (HttpURLConnection) url.openConnection();
-        } else {
-            connection = (HttpURLConnection) url.openConnection(proxy);
-        }
-        return connection;
-    }
-
-    public boolean exists() throws IOException {
-        HttpURLConnection con = null;
-        try {
-            con = openConnection();
-            con.setRequestMethod("HEAD");
-            return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
-        } catch (IOException e) {
-            // This is what we are testing for, so its not really an exception
-            return false;
-        } finally {
-            if (con != null) con.disconnect();
-        }
-    }
-
-    class WrapperInputStream extends FilterInputStream {
-
-        HttpURLConnection connection;
-
-        protected WrapperInputStream(HttpURLConnection connection, InputStream inputStream) {
-            super(inputStream);
-            this.connection = connection;
-        }
-
-        @Override
-        public void close() throws IOException {
-            super.close();
-            connection.disconnect();
-        }
-    }
-
-
-}
diff --git a/src/main/java/htsjdk/tribble/util/LittleEndianInputStream.java b/src/main/java/htsjdk/tribble/util/LittleEndianInputStream.java
deleted file mode 100644
index 350f47c..0000000
--- a/src/main/java/htsjdk/tribble/util/LittleEndianInputStream.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
-* Adapted from example code in
-* Title: Hardcore Java
-* Title: Java I/O
-* Second Edition: May 2006
-* ISBN 10: 0-596-52750-0
-* ISBN 13: 9780596527501
-*
-* http://www.javafaq.nu/java-example-code-1078.html
-*
-*/
-package htsjdk.tribble.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.EOFException;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-
-/**
- * Input stream with methods to convert byte arrays to numeric values using "little endian" order.
- * <p/>
- * Note: This class is not thread safe => instances should not be shared amongst threads
- */
-public class LittleEndianInputStream extends FilterInputStream {
-
-    byte[] buffer;
-
-    public LittleEndianInputStream(InputStream in) {
-        super(in);
-        buffer = new byte[8];
-
-    }
-
-    /**
-     *
-     * @return the next byte of this input stream, interpreted as an unsigned 8-bit number
-     * @throws IOException
-     */
-    public byte readByte() throws IOException {
-        int ch = in.read();
-        if (ch < 0) {
-            throw new EOFException();
-        }
-        return (byte) (ch);
-    }
-
-    public short readShort() throws IOException {
-        int byte1 = in.read();
-        int byte2 = in.read();
-        if (byte2 < 0) {
-            throw new EOFException();
-        }
-
-        return (short) (((byte2 << 24) >>> 16) + ((byte1 << 24) >>> 24));
-    }
-
-
-    public int readInt() throws IOException {
-        int byte1 = in.read();
-        int byte2 = in.read();
-        int byte3 = in.read();
-        int byte4 = in.read();
-        if (byte4 < 0) {
-            throw new EOFException();
-        }
-        return (byte4 << 24)
-                + ((byte3 << 24) >>> 8)
-                + ((byte2 << 24) >>> 16)
-                + ((byte1 << 24) >>> 24);
-
-    }
-
-    /**
-     *
-     */
-
-    public long readLong() throws IOException {
-        readFully(buffer);
-        long byte1 = (long) buffer[0];
-        long byte2 = (long) buffer[1];
-        long byte3 = (long) buffer[2];
-        long byte4 = (long) buffer[3];
-        long byte5 = (long) buffer[4];
-        long byte6 = (long) buffer[5];
-        long byte7 = (long) buffer[6];
-        long byte8 = (long) buffer[7];
-        return (byte8 << 56)
-                + ((byte7 << 56) >>> 8)
-                + ((byte6 << 56) >>> 16)
-                + ((byte5 << 56) >>> 24)
-                + ((byte4 << 56) >>> 32)
-                + ((byte3 << 56) >>> 40)
-                + ((byte2 << 56) >>> 48)
-                + ((byte1 << 56) >>> 56);
-    }
-
-    public final double readDouble() throws IOException {
-        return Double.longBitsToDouble(this.readLong());
-    }
-
-    public final float readFloat() throws IOException {
-        return Float.intBitsToFloat(this.readInt());
-    }
-
-    /**
-     * Read a null terminated byte array and return result as a string
-     *
-     * @return
-     * @throws IOException
-     */
-
-    public String readString() throws IOException {
-        ByteArrayOutputStream bis = new ByteArrayOutputStream(100);
-        byte b;
-        while ((b = (byte) in.read()) != 0) {
-            if(b < 0) {
-                throw new EOFException();
-            }
-            bis.write(b);
-        }
-        return new String(bis.toByteArray());
-    }
-
-
-    /**
-     * Keep reading until the input buffer is filled.
-     */
-    private void readFully(byte b[]) throws IOException {
-        int len = b.length;
-        if (len < 0)
-            throw new IndexOutOfBoundsException();
-        int n = 0;
-        while (n < len) {
-            int count = read(b, n, len - n);
-            if (count < 0)
-                throw new EOFException();
-            n += count;
-        }
-    }
-
-
-}
diff --git a/src/main/java/htsjdk/tribble/util/LittleEndianOutputStream.java b/src/main/java/htsjdk/tribble/util/LittleEndianOutputStream.java
deleted file mode 100644
index 9bec071..0000000
--- a/src/main/java/htsjdk/tribble/util/LittleEndianOutputStream.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
-* Adapted from example code in
-* Title: Hardcore Java
-* Title: Java I/O
-* Second Edition: May 2006
-* ISBN 10: 0-596-52750-0
-* ISBN 13: 9780596527501
-*
-* http://www.javafaq.nu/java-example-code-1078.html
-* 
-*/
-
-package htsjdk.tribble.util;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-
-public final class LittleEndianOutputStream extends FilterOutputStream {
-
-    protected long written;
-
-    public LittleEndianOutputStream(OutputStream out) {
-        super(out);
-    }
-
-    public void write(int b) throws IOException {
-        out.write(b);
-        written++;
-    }
-
-    public void write(byte[] data, int offset, int length)
-            throws IOException {
-        out.write(data, offset, length);
-        written += length;
-    }
-
-    public void writeBoolean(boolean b) throws IOException {
-        if (b) this.write(1);
-        else this.write(0);
-    }
-
-    public void writeByte(int b) throws IOException {
-        out.write(b);
-        written++;
-    }
-
-    public void writeShort(int s) throws IOException {
-        out.write(s & 0xFF);
-        out.write((s >>> 8) & 0xFF);
-        written += 2;
-    }
-
-    public void writeChar(int c) throws IOException {
-        out.write(c & 0xFF);
-        out.write((c >>> 8) & 0xFF);
-        written += 2;
-    }
-
-    public void writeInt(int i) throws IOException {
-
-        out.write(i & 0xFF);
-        out.write((i >>> 8) & 0xFF);
-        out.write((i >>> 16) & 0xFF);
-        out.write((i >>> 24) & 0xFF);
-        written += 4;
-
-    }
-
-    public void writeLong(long l) throws IOException {
-
-        out.write((int) l & 0xFF);
-        out.write((int) (l >>> 8) & 0xFF);
-        out.write((int) (l >>> 16) & 0xFF);
-        out.write((int) (l >>> 24) & 0xFF);
-        out.write((int) (l >>> 32) & 0xFF);
-        out.write((int) (l >>> 40) & 0xFF);
-        out.write((int) (l >>> 48) & 0xFF);
-        out.write((int) (l >>> 56) & 0xFF);
-        written += 8;
-
-    }
-
-    public final void writeFloat(float f) throws IOException {
-        this.writeInt(Float.floatToIntBits(f));
-    }
-
-    public final void writeDouble(double d) throws IOException {
-        this.writeLong(Double.doubleToLongBits(d));
-    }
-
-    public void writeBytes(String s) throws IOException {
-        int length = s.length();
-        for (int i = 0; i < length; i++) {
-            out.write((byte) s.charAt(i));
-        }
-        written += length;
-    }
-
-    /**
-     * Srite a string as a null terminated byte array.
-     *
-     * @param s
-     * @throws IOException
-     */
-    public void writeString(String s) throws IOException {
-        writeBytes(s);
-        write((byte) 0);
-    }
-
-    public long getWrittenCount() {
-        return written;
-    }
-
-    // Method provide to enable "reseting" to a previous state.
-    public void setWrittenCount(long count) {
-        this.written = count;
-    }
-}// end LittleEndianOutputStream
diff --git a/src/main/java/htsjdk/tribble/util/MathUtils.java b/src/main/java/htsjdk/tribble/util/MathUtils.java
deleted file mode 100644
index 9b4d8ce..0000000
--- a/src/main/java/htsjdk/tribble/util/MathUtils.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.util;
-
-/**
- * a collection of functions and classes for various common calculations
- */
-public class MathUtils {
-
-    /**
-     * a class for calculating moving statistics - this class returns the
-     * mean, variance, and std dev after accumulating any number of records.
-     * taken from http://www.johndcook.com/standard_deviation.html
-     */
-    public static class RunningStat {
-        private double oldMean, newMean, oldStdDev, newStdDev;
-        private long recordCount = 0;
-
-        /**
-         * @param x the value to add to the running mean and variance
-         */
-        public void push(double x) {
-            recordCount++;
-            // See Knuth TAOCP vol 2, 3rd edition, page 232
-            if (recordCount == 1) {
-                oldMean = newMean = x;
-                oldStdDev = 0.0;
-            } else {
-                newMean = oldMean + (x - oldMean) / recordCount;
-                newStdDev = oldStdDev + (x - oldMean) * (x - newMean);
-
-                // set up for next iteration
-                oldMean = newMean;
-                oldStdDev = newStdDev;
-            }
-        }
-
-        public void clear() { recordCount = 0; }
-        public final long numDataValues() { return recordCount; }
-        public final double mean() { return (recordCount > 0) ? newMean : 0.0; }
-        public double variance() { return ((recordCount > 1) ? newStdDev / (recordCount - 1) : 0.0); }
-        public double standardDeviation() { return Math.sqrt(variance()); }
-    }
-
-}
diff --git a/src/main/java/htsjdk/tribble/util/ParsingUtils.java b/src/main/java/htsjdk/tribble/util/ParsingUtils.java
deleted file mode 100644
index 2a88ed7..0000000
--- a/src/main/java/htsjdk/tribble/util/ParsingUtils.java
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.util;
-
-import java.awt.Color;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Constructor;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-/**
- * @author jrobinso
- */
-public class ParsingUtils {
-
-    public static Map<Object, Color> colorCache = new WeakHashMap<Object, Color>(100);
-
-    // HTML 4.1 color table,  + orange and magenta
-    static Map<String, String> colorSymbols = new HashMap();
-
-    private static final Class defaultUrlHelperClass = RemoteURLHelper.class;
-    public static Class urlHelperClass = defaultUrlHelperClass;
-
-    static {
-        colorSymbols.put("white", "FFFFFF");
-        colorSymbols.put("silver", "C0C0C0");
-        colorSymbols.put("gray", "808080");
-        colorSymbols.put("black", "000000");
-        colorSymbols.put("red", "FF0000");
-        colorSymbols.put("maroon", "800000");
-        colorSymbols.put("yellow", "FFFF00");
-        colorSymbols.put("olive", "808000");
-        colorSymbols.put("lime", "00FF00");
-        colorSymbols.put("green", "008000");
-        colorSymbols.put("aqua", "00FFFF");
-        colorSymbols.put("teal", "008080");
-        colorSymbols.put("blue", "0000FF");
-        colorSymbols.put("navy", "000080");
-        colorSymbols.put("fuchsia", "FF00FF");
-        colorSymbols.put("purple", "800080");
-        colorSymbols.put("orange", "FFA500");
-        colorSymbols.put("magenta", "FF00FF");
-    }
-
-
-    public static InputStream openInputStream(String path)
-            throws IOException {
-
-        InputStream inputStream;
-
-        if (path.startsWith("http:") || path.startsWith("https:") || path.startsWith("ftp:")) {
-            inputStream = getURLHelper(new URL(path)).openInputStream();
-        } else {
-            File file = new File(path);
-            inputStream = new FileInputStream(file);
-        }
-
-        return inputStream;
-    }
-
-    //public static String join(String separator, Collection<String> strings) {
-    //    return join( separator, strings.toArray(new String[0]) );
-    //}
-
-    public static <T> String join(String separator, Collection<T> objects) {
-        if (objects.isEmpty()) {
-            return "";
-        }
-        Iterator<T> iter = objects.iterator();
-        final StringBuilder ret = new StringBuilder(iter.next().toString());
-        while (iter.hasNext()) {
-            ret.append(separator);
-            ret.append(iter.next().toString());
-        }
-
-        return ret.toString();
-    }
-
-    /**
-     * a small utility function for sorting a list
-     *
-     * @param list
-     * @param <T>
-     * @return
-     */
-    public static <T extends Comparable> List<T> sortList(Collection<T> list) {
-        ArrayList<T> ret = new ArrayList<T>();
-        ret.addAll(list);
-        Collections.sort(ret);
-        return ret;
-    }
-
-    public static <T extends Comparable<T>, V> String sortedString(Map<T, V> c) {
-        List<T> t = new ArrayList<T>(c.keySet());
-        Collections.sort(t);
-
-        List<String> pairs = new ArrayList<String>();
-        for (T k : t) {
-            pairs.add(k + "=" + c.get(k));
-        }
-
-        return "{" + ParsingUtils.join(", ", pairs.toArray(new String[pairs.size()])) + "}";
-    }
-
-    /**
-     * join an array of strings given a seperator
-     *
-     * @param separator the string to insert between each array element
-     * @param strings   the array of strings
-     * @return a string, which is the joining of all array values with the separator
-     */
-    public static String join(String separator, String[] strings) {
-        return join(separator, strings, 0, strings.length);
-    }
-
-    /**
-     * join a set of strings, using the separator provided, from index start to index stop
-     *
-     * @param separator the separator to use
-     * @param strings   the list of strings
-     * @param start     the start position (index in the list)0
-     * @param end       the end position (index in the list)
-     * @return a joined string, or "" if end - start == 0
-     */
-    public static String join(String separator, String[] strings, int start, int end) {
-        if ((end - start) == 0) {
-            return "";
-        }
-        StringBuilder ret = new StringBuilder(strings[start]);
-        for (int i = start + 1; i < end; ++i) {
-            ret.append(separator);
-            ret.append(strings[i]);
-        }
-        return ret.toString();
-    }
-
-
-    /**
-     * Split the string into tokens separated by the given delimiter. This looks
-     * suspiciously like what String.split should do. It is here because
-     * String.split has particularly poor performance for this use case in some
-     * versions of the Java SE API because of use of java.util.regex APIs
-     * (see bug report at http://bugs.java.com/view_bug.do?bug_id=6840246 for
-     * information).
-     *
-     * @param input the string to split
-     * @param delim the character that delimits tokens
-     * @return a list of the tokens
-     */
-    public static List<String> split(String input, char delim) {
-        if (input.isEmpty()) return Arrays.asList("");
-        final ArrayList<String> output = new ArrayList<String>(1+input.length()/2);
-        int from = -1, to;
-        for (to = input.indexOf(delim);
-             to >= 0;
-             from = to, to = input.indexOf(delim, from+1)) {
-            output.add(input.substring(from+1, to));
-        }
-        output.add(input.substring(from+1));
-        return output;
-    }
-
-
-    /**
-     * Split the string into tokesn separated by the given delimiter.  Profiling has
-     * revealed that the standard string.split() method typically takes > 1/2
-     * the total time when used for parsing ascii files.
-     *
-     * @param aString the string to split
-     * @param tokens  an array to hold the parsed tokens
-     * @param delim   character that delimits tokens
-     * @return the number of tokens parsed
-     */
-    public static int split(String aString, String[] tokens, char delim) {
-        return split(aString, tokens, delim, false);
-    }
-
-    /**
-     * Split the string into tokens separated by the given delimiter.  Profiling has
-     * revealed that the standard string.split() method typically takes > 1/2
-     * the total time when used for parsing ascii files.
-     *
-     * @param aString                the string to split
-     * @param tokens                 an array to hold the parsed tokens
-     * @param delim                  character that delimits tokens
-     * @param condenseTrailingTokens if true and there are more tokens than will fit in the tokens array,
-     *                               condense all trailing tokens into the last token
-     * @return the number of tokens parsed
-     */
-    public static int split(String aString, String[] tokens, char delim, boolean condenseTrailingTokens) {
-
-        int maxTokens = tokens.length;
-        int nTokens = 0;
-        int start = 0;
-        int end = aString.indexOf(delim);
-
-        if (end == 0) {
-            if (aString.length() > 1) {
-                start = 1;
-                end = aString.indexOf(delim, start);
-            } else {
-                return 0;
-            }
-        }
-
-        if (end < 0) {
-            tokens[nTokens++] = aString.substring(start);
-            return nTokens;
-        }
-
-        while ((end > 0) && (nTokens < maxTokens)) {
-            tokens[nTokens++] = aString.substring(start, end);
-            start = end + 1;
-            end = aString.indexOf(delim, start);
-        }
-
-        // condense if appropriate
-        if (condenseTrailingTokens && nTokens == maxTokens) {
-            tokens[nTokens - 1] = tokens[nTokens - 1] + delim + aString.substring(start);
-        }
-        // Add the trailing string
-        else if (nTokens < maxTokens) {
-            String trailingString = aString.substring(start);
-            tokens[nTokens++] = trailingString;
-        }
-
-        return nTokens;
-    }
-
-
-    // trim a string for the given character (i.e. not just whitespace)
-
-    public static String trim(String str, char ch) {
-        char[] array = str.toCharArray();
-        int start = 0;
-        while (start < array.length && array[start] == ch)
-            start++;
-
-        int end = array.length - 1;
-        while (end > start && array[end] == ch)
-            end--;
-
-        return str.substring(start, end + 1);
-    }
-
-
-    /**
-     * Split the string into tokens separated by tab or space(s).  This method
-     * was added so support wig and bed files, which apparently accept space delimiters.
-     * <p/>
-     * Note:  TODO REGEX expressions are not used for speed.  This should be re-evaluated with JDK 1.5 or later
-     *
-     * @param aString the string to split
-     * @param tokens  an array to hold the parsed tokens
-     * @return the number of tokens parsed
-     */
-    public static int splitWhitespace(String aString, String[] tokens) {
-
-        int maxTokens = tokens.length;
-        int nTokens = 0;
-        int start = 0;
-        int tabEnd = aString.indexOf('\t');
-        int spaceEnd = aString.indexOf(' ');
-        int end = tabEnd < 0 ? spaceEnd : spaceEnd < 0 ? tabEnd : Math.min(spaceEnd, tabEnd);
-        while ((end > 0) && (nTokens < maxTokens)) {
-            //tokens[nTokens++] = new String(aString.toCharArray(), start, end-start); //  aString.substring(start, end);
-            tokens[nTokens++] = aString.substring(start, end);
-
-            start = end + 1;
-            // Gobble up any whitespace before next token -- don't gobble tabs, consecutive tabs => empty cell
-            while (start < aString.length() && aString.charAt(start) == ' ') {
-                start++;
-            }
-
-            tabEnd = aString.indexOf('\t', start);
-            spaceEnd = aString.indexOf(' ', start);
-            end = tabEnd < 0 ? spaceEnd : spaceEnd < 0 ? tabEnd : Math.min(spaceEnd, tabEnd);
-
-        }
-
-        // Add the trailing string
-        if (nTokens < maxTokens) {
-            String trailingString = aString.substring(start);
-            tokens[nTokens++] = trailingString;
-        }
-        return nTokens;
-    }
-
-    public static <T extends Comparable<? super T>> boolean isSorted(Iterable<T> iterable) {
-        Iterator<T> iter = iterable.iterator();
-        if (!iter.hasNext())
-            return true;
-
-        T t = iter.next();
-        while (iter.hasNext()) {
-            T t2 = iter.next();
-            if (t.compareTo(t2) > 0)
-                return false;
-
-            t = t2;
-        }
-
-        return true;
-    }
-
-    /**
-     * Convert an rgb string, hex, or symbol to a color.
-     *
-     * @param string
-     * @return
-     */
-    public static Color parseColor(String string) {
-        try {
-            Color c = colorCache.get(string);
-            if (c == null) {
-                if (string.contains(",")) {
-                    String[] rgb = string.split(",");
-                    int red = Integer.parseInt(rgb[0]);
-                    int green = Integer.parseInt(rgb[1]);
-                    int blue = Integer.parseInt(rgb[2]);
-                    c = new Color(red, green, blue);
-                } else if (string.startsWith("#")) {
-                    c = hexToColor(string.substring(1));
-                } else {
-                    String hexString = colorSymbols.get(string.toLowerCase());
-                    if (hexString != null) {
-                        c = hexToColor(hexString);
-                    }
-                }
-
-                if (c == null) {
-                    c = Color.black;
-                }
-                colorCache.put(string, c);
-            }
-            return c;
-
-        } catch (NumberFormatException numberFormatException) {
-            //TODO Throw this exception?
-            return Color.black;
-        }
-    }
-
-
-    private static Color hexToColor(String string) {
-        if (string.length() == 6) {
-            int red = Integer.parseInt(string.substring(0, 2), 16);
-            int green = Integer.parseInt(string.substring(2, 4), 16);
-            int blue = Integer.parseInt(string.substring(4, 6), 16);
-            return new Color(red, green, blue);
-        } else {
-            return null;
-        }
-
-    }
-
-    public static boolean resourceExists(String resource) throws IOException{
-
-        boolean remoteFile = resource.startsWith("http://") || resource.startsWith("https://") || resource.startsWith("ftp://");
-        if (remoteFile) {
-            URL url = null;
-            try {
-                url = new URL(resource);
-            } catch (MalformedURLException e) {
-                // Malformed URLs by definition don't exist
-                return false;
-            }
-            URLHelper helper = getURLHelper(url);
-            return helper.exists();
-        } else {
-            return (new File(resource)).exists();
-        }
-    }
-
-    /**
-     * Return the registered URLHelper, constructed with the provided URL
-     * @see #registerHelperClass(Class)
-     * @param url
-     * @return
-     */
-    public static URLHelper getURLHelper(URL url) {
-        try {
-            return getURLHelper(urlHelperClass, url);
-        } catch (Exception e) {
-            return getURLHelper(defaultUrlHelperClass, url);
-        }
-    }
-
-    private static URLHelper getURLHelper(Class helperClass, URL url) {
-        try {
-            Constructor constr = helperClass.getConstructor(URL.class);
-            return (URLHelper) constr.newInstance(url);
-        } catch (Exception e) {
-            String errMsg = "Error instantiating url helper for class: " + helperClass;
-            throw new IllegalStateException(errMsg, e);
-        }
-    }
-
-    /**
-     * Register a {@code URLHelper} class to be used for URL operations. The helper
-     * may be used for both FTP and HTTP operations, so if any FTP URLs are used
-     * the {@code URLHelper} must support it.
-     *
-     * The default helper class is {@link RemoteURLHelper}, which delegates to FTP/HTTP
-     * helpers as appropriate.
-     *
-     * @see URLHelper
-     * @param helperClass Class which implements {@link URLHelper}, and have a constructor
-     *                    which takes a URL as it's only argument.
-     */
-    public static void registerHelperClass(Class helperClass) {
-        if (!URLHelper.class.isAssignableFrom(helperClass)) {
-            throw new IllegalArgumentException("helperClass must implement URLHelper");
-            //TODO check that it has 1 arg constructor of proper type
-        }
-        urlHelperClass = helperClass;
-    }
-
-    /**
-     * Add the {@code indexExtension} to the {@code filepath}, preserving
-     * query string elements if present. Intended for use where {@code filepath}
-     * is a URL. Will behave correctly on regular file paths (just add the extension
-     * to the end)
-     * @param filepath
-     * @param indexExtension
-     * @return
-     */
-    public static String appendToPath(String filepath, String indexExtension) {
-        String tabxIndex = null;
-        URL url = null;
-        try{
-            url = new URL(filepath);
-        }catch (MalformedURLException e){
-            //pass
-        }
-        if (url != null) {
-            String path = url.getPath();
-            String indexPath = path + indexExtension;
-            tabxIndex = filepath.replace(path, indexPath);
-        } else {
-            tabxIndex = filepath + indexExtension;
-        }
-        return tabxIndex;
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/util/RemoteURLHelper.java b/src/main/java/htsjdk/tribble/util/RemoteURLHelper.java
deleted file mode 100644
index 2493edb..0000000
--- a/src/main/java/htsjdk/tribble/util/RemoteURLHelper.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package htsjdk.tribble.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * Implementation of URLHelper designed for remote resources.
- * Determines appropriate helper based on protocol (ftp/http),
- * and then delegates.
- *
- * @author jacob
- * @date 2013-Apr-11
- */
-public class RemoteURLHelper implements URLHelper {
-
-    private URLHelper wrappedHelper;
-
-    public RemoteURLHelper(URL url) {
-        String protocol = url.getProtocol().toLowerCase();
-        if (protocol.startsWith("http")) {
-            this.wrappedHelper = new HTTPHelper(url);
-        } else if (protocol.startsWith("ftp")) {
-            this.wrappedHelper = new FTPHelper(url);
-        } else {
-            throw new IllegalArgumentException("Unable to create helper for url with protocol " + protocol);
-        }
-    }
-
-    @Override
-    public URL getUrl() {
-        return this.wrappedHelper.getUrl();
-    }
-
-    @Override
-    public long getContentLength() throws IOException {
-        return this.wrappedHelper.getContentLength();
-    }
-
-    @Override
-    public InputStream openInputStream() throws IOException {
-        return this.wrappedHelper.openInputStream();
-    }
-
-    @Override
-    @Deprecated
-    public InputStream openInputStreamForRange(long start, long end) throws IOException {
-        return this.wrappedHelper.openInputStreamForRange(start, end);
-    }
-
-    @Override
-    public boolean exists() throws IOException {
-        return this.wrappedHelper.exists();
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/util/TabixUtils.java b/src/main/java/htsjdk/tribble/util/TabixUtils.java
deleted file mode 100644
index aa365cd..0000000
--- a/src/main/java/htsjdk/tribble/util/TabixUtils.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.util;
-
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.readers.TabixReader;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * classes that have anything to do with tabix
- */
-public class TabixUtils {
-
-    public static final String STANDARD_INDEX_EXTENSION = ".tbi";
-
-    public static class TPair64 implements Comparable<TPair64> {
-        public long u, v;
-
-        public TPair64(final long _u, final long _v) {
-            u = _u;
-            v = _v;
-        }
-
-        public TPair64(final TPair64 p) {
-            u = p.u;
-            v = p.v;
-        }
-
-        public int compareTo(final TPair64 p) {
-            return u == p.u ? 0 : ((u < p.u) ^ (u < 0) ^ (p.u < 0)) ? -1 : 1; // unsigned 64-bit comparison
-        }
-    }
-
-    public static class TIndex {
-        public HashMap<Integer, TPair64[]> b; // binning index
-        public long[] l; // linear index
-    }
-
-
-    public static class TIntv {
-        public int tid, beg, end;
-    }
-
-
-    public static boolean less64(final long u, final long v) { // unsigned 64-bit comparison
-        return (u < v) ^ (u < 0) ^ (v < 0);
-    }
-
-    /**
-     * Generates the SAMSequenceDictionary from the given tabix index file
-     *
-     * @param tabixIndex the tabix index file
-     * @return non-null sequence dictionary
-     */
-    public static SAMSequenceDictionary getSequenceDictionary(final File tabixIndex) {
-        if (tabixIndex == null) throw new IllegalArgumentException();
-
-        try {
-            final BlockCompressedInputStream is = new BlockCompressedInputStream(tabixIndex);
-
-            // read preliminary bytes
-            byte[] buf = new byte[32];
-            is.read(buf, 0, 32);
-
-            // read sequence dictionary
-            int i, j, len = TabixReader.readInt(is);
-            buf = new byte[len];
-            is.read(buf);
-
-            final List<SAMSequenceRecord> sequences = new ArrayList<SAMSequenceRecord>();
-            for (i = j = 0; i < buf.length; ++i) {
-                if (buf[i] == 0) {
-                    byte[] b = new byte[i - j];
-                    System.arraycopy(buf, j, b, 0, b.length);
-                    sequences.add(new SAMSequenceRecord(new String(b), b.length));
-                    j = i + 1;
-                }
-            }
-            is.close();
-
-            return new SAMSequenceDictionary(sequences);
-        } catch (Exception e) {
-            throw new TribbleException("Unable to read tabix index: " + e.getMessage());
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/tribble/util/URLHelper.java b/src/main/java/htsjdk/tribble/util/URLHelper.java
deleted file mode 100644
index 9a4fdcb..0000000
--- a/src/main/java/htsjdk/tribble/util/URLHelper.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard.  All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.tribble.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * Interface defining a helper class for dealing with URL resources.  Purpose of this class is to provide the
- * flexibility to use either URLConnection or Apache HTTPClient. Also want to delegate to either HTTP or FTP
- *
- * @see HTTPHelper
- * @see FTPHelper
- * @author jrobinso
- * @date Jun 28, 2011
- */
-public interface URLHelper {
-
-    URL getUrl();
-
-    long getContentLength() throws IOException;
-
-    InputStream openInputStream() throws IOException;
-
-    /**
-     * May throw an OperationUnsupportedException
-     * @deprecated Will be removed in a future release, as is somewhat fragile
-     * and not used.
-     * @param start
-     * @param end
-     * @return
-     * @throws IOException
-     */
-    @Deprecated
-    InputStream openInputStreamForRange(long start, long end) throws IOException;
-
-    public boolean exists() throws IOException;
-
-}
diff --git a/src/main/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculation.java b/src/main/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculation.java
deleted file mode 100755
index 8cee877..0000000
--- a/src/main/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculation.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (c) 2009 The Broad Institute
- *
- * 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 AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble.util.popgen;
-
-/**
-* The Broad Institute
-* SOFTWARE COPYRIGHT NOTICE AGREEMENT
-* This software and its documentation are copyright 2004 by the
-* Broad Institute/Massachusetts Institute of Technology. All rights are reserved.
-*
-* This software is supplied without any warranty or guaranteed support whatsoever. Neither
-* the Broad Institute nor MIT can be responsible for its use, misuse, or functionality.
-*/
-
-/**
-* This class calculates a HardyWeinberg p-value given three values representing
-* the observed frequences of homozygous and heterozygous genotypes in the
-* test population.
-*
-* @author Bob Handsaker
-*/
-public final class HardyWeinbergCalculation {
-   /**
-    * This class is not instantiable.
-    */
-   private HardyWeinbergCalculation() {
-   }
-
-   /**
-    * Calculates exact two-sided hardy-weinberg p-value. Parameters
-    * are number of genotypes, number of rare alleles observed and
-    * number of heterozygotes observed.
-    *
-    * (c) 2003 Jan Wigginton, Goncalo Abecasis (goncalo at umich.edu)
-    */
-   public static double hwCalculate(int obsAA, int obsAB, int obsBB) {
-       int diplotypes = obsAA + obsAB + obsBB;
-       int rare = (obsAA * 2) + obsAB;
-       int hets = obsAB;
-
-       //make sure "rare" allele is really the rare allele
-       if (rare > diplotypes) {
-           rare = (2 * diplotypes) - rare;
-       }
-
-       //make sure numbers aren't screwy
-       if (hets > rare) {
-           return -1;
-       }
-
-       double[] tailProbs = new double[rare + 1];
-
-       for (int z = 0; z < tailProbs.length; z++) {
-           tailProbs[z] = 0;
-       }
-
-       //start at midpoint
-       //cast to long and back to int to avoid overflow at large numbers
-       int mid = (int) (((long) rare * ((2 * diplotypes) - rare)) / (2 * diplotypes));
-
-       //check to ensure that midpoint and rare alleles have same parity
-       if (((rare & 1) ^ (mid & 1)) != 0) {
-           mid++;
-       }
-
-       int het = mid;
-       int hom_r = (rare - mid) / 2;
-       int hom_c = diplotypes - het - hom_r;
-
-       //Calculate probability for each possible observed heterozygote
-       //count up to a scaling constant, to avoid underflow and overflow
-       tailProbs[mid] = 1.0;
-
-       double sum = tailProbs[mid];
-
-       for (het = mid; het > 1; het -= 2) {
-           tailProbs[het - 2] = (tailProbs[het] * het * (het - 1.0)) / (4.0 * (hom_r + 1.0) * (hom_c +
-               1.0));
-           sum += tailProbs[het - 2];
-
-           //2 fewer hets for next iteration -> add one rare and one common homozygote
-           hom_r++;
-           hom_c++;
-       }
-
-       het = mid;
-       hom_r = (rare - mid) / 2;
-       hom_c = diplotypes - het - hom_r;
-
-       for (het = mid; het <= (rare - 2); het += 2) {
-           tailProbs[het + 2] = (tailProbs[het] * 4.0 * hom_r * hom_c) / ((het + 2.0) * (het +
-               1.0));
-           sum += tailProbs[het + 2];
-
-           //2 more hets for next iteration -> subtract one rare and one common homozygote
-           hom_r--;
-           hom_c--;
-       }
-
-       for (int z = 0; z < tailProbs.length; z++) {
-           tailProbs[z] /= sum;
-       }
-
-       double top = tailProbs[hets];
-
-       for (int i = hets + 1; i <= rare; i++) {
-           top += tailProbs[i];
-       }
-
-       double otherSide = tailProbs[hets];
-
-       for (int i = hets - 1; i >= 0; i--) {
-           otherSide += tailProbs[i];
-       }
-
-       if ((top > 0.5) && (otherSide > 0.5)) {
-           return 1.0;
-       }
-
-       if (top < otherSide) {
-           return top * 2;
-       }
-
-       return otherSide * 2;
-   }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2Codec.java b/src/main/java/htsjdk/variant/bcf2/BCF2Codec.java
deleted file mode 100644
index a945764..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2Codec.java
+++ /dev/null
@@ -1,491 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.tribble.BinaryFeatureCodec;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.FeatureCodecHeader;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.readers.*;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.LazyGenotypesContext;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import htsjdk.variant.variantcontext.VariantContextUtils;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFCompoundHeaderLine;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFContigHeaderLine;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-
-import java.io.ByteArrayInputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Decode BCF2 files
- */
-public final class BCF2Codec extends BinaryFeatureCodec<VariantContext> {
-    private final static int ALLOWED_MAJOR_VERSION = 2;
-    private final static int MIN_MINOR_VERSION = 1;
-
-    private BCFVersion bcfVersion = null;
-
-    private VCFHeader header = null;
-
-    /**
-     * Maps offsets (encoded in BCF) into contig names (from header) for the CHROM field
-     */
-    private final ArrayList<String> contigNames = new ArrayList<String>();
-
-    /**
-     * Maps header string names (encoded in VCF) into strings found in the BCF header
-     *
-     * Initialized when processing the header
-     */
-    private ArrayList<String> dictionary;
-
-    /**
-     * Our decoder that reads low-level objects from the BCF2 records
-     */
-    private final BCF2Decoder decoder = new BCF2Decoder();
-
-    /**
-     * Provides some sanity checking on the header
-     */
-    private final static int MAX_HEADER_SIZE = 0x08000000;
-
-    /**
-     * Genotype field decoders that are initialized when the header is read
-     */
-    private BCF2GenotypeFieldDecoders gtFieldDecoders = null;
-
-    /**
-     * A cached array of GenotypeBuilders for efficient genotype decoding.
-     *
-     * Caching it allows us to avoid recreating this intermediate data
-     * structure each time we decode genotypes
-     */
-    private GenotypeBuilder[] builders = null;
-
-    // for error handling
-    private int recordNo = 0;
-    private int pos = 0;
-
-
-    // ----------------------------------------------------------------------
-    //
-    // Feature codec interface functions
-    //
-    // ----------------------------------------------------------------------
-
-    @Override
-    public Feature decodeLoc( final PositionalBufferedStream inputStream ) {
-        return decode(inputStream);
-    }
-
-    @Override
-    public VariantContext decode( final PositionalBufferedStream inputStream ) {
-        try {
-            recordNo++;
-            final VariantContextBuilder builder = new VariantContextBuilder();
-
-            final int sitesBlockSize = decoder.readBlockSize(inputStream);
-            final int genotypeBlockSize = decoder.readBlockSize(inputStream);
-
-            decoder.readNextBlock(sitesBlockSize, inputStream);
-            decodeSiteLoc(builder);
-            final SitesInfoForDecoding info = decodeSitesExtendedInfo(builder);
-
-            decoder.readNextBlock(genotypeBlockSize, inputStream);
-            createLazyGenotypesDecoder(info, builder);
-            return builder.fullyDecoded(true).make();
-        } catch ( IOException e ) {
-            throw new TribbleException("Failed to read BCF file", e);
-        }
-    }
-
-    @Override
-    public Class<VariantContext> getFeatureType() {
-        return VariantContext.class;
-    }
-
-    @Override
-    public FeatureCodecHeader readHeader( final PositionalBufferedStream inputStream ) {
-        try {
-            // note that this reads the magic as well, and so does double duty
-            bcfVersion = BCFVersion.readBCFVersion(inputStream);
-            if ( bcfVersion == null )
-                error("Input stream does not contain a BCF encoded file; BCF magic header info not found");
-
-            if ( bcfVersion.getMajorVersion() != ALLOWED_MAJOR_VERSION )
-                error("BCF2Codec can only process BCF2 files, this file has major version " + bcfVersion.getMajorVersion());
-            if ( bcfVersion.getMinorVersion() < MIN_MINOR_VERSION )
-                error("BCF2Codec can only process BCF2 files with minor version >= " + MIN_MINOR_VERSION + " but this file has minor version " + bcfVersion.getMinorVersion());
-
-            if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
-                System.err.println("Parsing data stream with BCF version " + bcfVersion);
-            }
-
-            final int headerSizeInBytes = BCF2Type.INT32.read(inputStream);
-
-            if ( headerSizeInBytes <= 0 || headerSizeInBytes > MAX_HEADER_SIZE) // no bigger than 8 MB
-                error("BCF2 header has invalid length: " + headerSizeInBytes + " must be >= 0 and < "+ MAX_HEADER_SIZE);
-
-            final byte[] headerBytes = new byte[headerSizeInBytes];
-            if ( inputStream.read(headerBytes) != headerSizeInBytes )
-                error("Couldn't read all of the bytes specified in the header length = " + headerSizeInBytes);
-
-            final PositionalBufferedStream bps = new PositionalBufferedStream(new ByteArrayInputStream(headerBytes));
-            final LineIterator lineIterator = new LineIteratorImpl(new SynchronousLineReader(bps));
-            final VCFCodec headerParser = new VCFCodec();
-            this.header = (VCFHeader) headerParser.readActualHeader(lineIterator);
-            bps.close();
-        } catch ( IOException e ) {
-            throw new TribbleException("I/O error while reading BCF2 header");
-        }
-
-        // create the config offsets
-        if ( ! header.getContigLines().isEmpty() ) {
-            contigNames.clear();
-            for ( final VCFContigHeaderLine contig : header.getContigLines()) {
-                if ( contig.getID() == null || contig.getID().equals("") )
-                    error("found a contig with an invalid ID " + contig);
-                contigNames.add(contig.getID());
-            }
-        } else {
-            error("Didn't find any contig lines in BCF2 file header");
-        }
-
-        // create the string dictionary
-        dictionary = parseDictionary(header);
-
-        // prepare the genotype field decoders
-        gtFieldDecoders = new BCF2GenotypeFieldDecoders(header);
-
-        // create and initialize the genotype builder array
-        final int nSamples = header.getNGenotypeSamples();
-        builders = new GenotypeBuilder[nSamples];
-        for ( int i = 0; i < nSamples; i++ ) {
-            builders[i] = new GenotypeBuilder(header.getGenotypeSamples().get(i));
-        }
-
-        // position right before next line (would be right before first real record byte at end of header)
-        return new FeatureCodecHeader(header, inputStream.getPosition());
-    }
-
-    @Override
-    public boolean canDecode( final String path ) {
-        FileInputStream fis = null;
-        try {
-            fis = new FileInputStream(path);
-            final BCFVersion version = BCFVersion.readBCFVersion(fis);
-            return version != null && version.getMajorVersion() == ALLOWED_MAJOR_VERSION;
-        } catch ( FileNotFoundException e ) {
-            return false;
-        } catch ( IOException e ) {
-            return false;
-        } finally {
-            try {
-                if ( fis != null ) fis.close();
-            } catch ( IOException e ) {
-                // do nothing
-            }
-        }
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // implicit block
-    //
-    // The first four records of BCF are inline untype encoded data of:
-    //
-    // 4 byte integer chrom offset
-    // 4 byte integer start
-    // 4 byte integer ref length
-    // 4 byte float qual
-    //
-    // --------------------------------------------------------------------------------
-
-    /**
-     * Decode the sites level data from this classes decoder
-     *
-     * @param builder
-     * @return
-     */
-    private final void decodeSiteLoc(final VariantContextBuilder builder) throws IOException {
-        final int contigOffset = decoder.decodeInt(BCF2Type.INT32);
-        final String contig = lookupContigName(contigOffset);
-        builder.chr(contig);
-
-        this.pos = decoder.decodeInt(BCF2Type.INT32) + 1; // GATK is one based, BCF2 is zero-based
-        final int refLength = decoder.decodeInt(BCF2Type.INT32);
-        builder.start((long)pos);
-        builder.stop((long)(pos + refLength - 1)); // minus one because GATK has closed intervals but BCF2 is open
-    }
-
-    /**
-     * Decode the sites level data from this classes decoder
-     *
-     * @param builder
-     * @return
-     */
-    private final SitesInfoForDecoding decodeSitesExtendedInfo(final VariantContextBuilder builder) throws IOException {
-        final Object qual = decoder.decodeSingleValue(BCF2Type.FLOAT);
-        if ( qual != null ) {
-            builder.log10PError(((Double)qual) / -10.0);
-        }
-
-        final int nAlleleInfo = decoder.decodeInt(BCF2Type.INT32);
-        final int nFormatSamples = decoder.decodeInt(BCF2Type.INT32);
-        final int nAlleles = nAlleleInfo >> 16;
-        final int nInfo = nAlleleInfo & 0x0000FFFF;
-        final int nFormatFields = nFormatSamples >> 24;
-        final int nSamples = nFormatSamples & 0x00FFFFF;
-
-        if ( header.getNGenotypeSamples() != nSamples )
-            error("Reading BCF2 files with different numbers of samples per record " +
-                    "is not currently supported.  Saw " + header.getNGenotypeSamples() +
-                    " samples in header but have a record with " + nSamples + " samples");
-
-        decodeID(builder);
-        final List<Allele> alleles = decodeAlleles(builder, pos, nAlleles);
-        decodeFilter(builder);
-        decodeInfo(builder, nInfo);
-
-        final SitesInfoForDecoding info = new SitesInfoForDecoding(nFormatFields, nSamples, alleles);
-        if ( ! info.isValid() )
-            error("Sites info is malformed: " + info);
-        return info;
-    }
-
-    protected final static class SitesInfoForDecoding {
-        final int nFormatFields;
-        final int nSamples;
-        final List<Allele> alleles;
-
-        private SitesInfoForDecoding(final int nFormatFields, final int nSamples, final List<Allele> alleles) {
-            this.nFormatFields = nFormatFields;
-            this.nSamples = nSamples;
-            this.alleles = alleles;
-        }
-
-        public boolean isValid() {
-            return nFormatFields >= 0 &&
-                    nSamples >= 0 &&
-                    alleles != null && ! alleles.isEmpty() && alleles.get(0).isReference();
-        }
-
-        @Override
-        public String toString() {
-            return String.format("nFormatFields = %d, nSamples = %d, alleles = %s", nFormatFields, nSamples, alleles);
-        }
-    }
-
-    /**
-     * Decode the id field in this BCF2 file and store it in the builder
-     * @param builder
-     */
-    private void decodeID( final VariantContextBuilder builder ) throws IOException {
-        final String id = (String)decoder.decodeTypedValue();
-
-        if ( id == null )
-            builder.noID();
-        else
-            builder.id(id);
-    }
-
-    /**
-     * Decode the alleles from this BCF2 file and put the results in builder
-     * @param builder
-     * @param pos
-     * @param nAlleles
-     * @return the alleles
-     */
-    private List<Allele> decodeAlleles( final VariantContextBuilder builder, final int pos, final int nAlleles ) throws IOException {
-        // TODO -- probably need inline decoder for efficiency here (no sense in going bytes -> string -> vector -> bytes
-        List<Allele> alleles = new ArrayList<Allele>(nAlleles);
-        String ref = null;
-
-        for ( int i = 0; i < nAlleles; i++ ) {
-            final String alleleBases = (String)decoder.decodeTypedValue();
-
-            final boolean isRef = i == 0;
-            final Allele allele = Allele.create(alleleBases, isRef);
-            if ( isRef ) ref = alleleBases;
-
-            alleles.add(allele);
-        }
-        assert ref != null;
-
-        builder.alleles(alleles);
-
-        assert !ref.isEmpty();
-
-        return alleles;
-    }
-
-    /**
-     * Decode the filter field of this BCF2 file and store the result in the builder
-     * @param builder
-     */
-    private void decodeFilter( final VariantContextBuilder builder ) throws IOException {
-        final Object value = decoder.decodeTypedValue();
-
-        if ( value == null )
-            builder.unfiltered();
-        else {
-            if ( value instanceof Integer ) {
-                // fast path for single integer result
-                final String filterString = getDictionaryString((Integer)value);
-                if ( VCFConstants.PASSES_FILTERS_v4.equals(filterString))
-                    builder.passFilters();
-                else
-                    builder.filter(filterString);
-            } else {
-                for ( final int offset : (List<Integer>)value )
-                    builder.filter(getDictionaryString(offset));
-            }
-        }
-    }
-
-    /**
-     * Loop over the info field key / value pairs in this BCF2 file and decode them into the builder
-     *
-     * @param builder
-     * @param numInfoFields
-     */
-    private void decodeInfo( final VariantContextBuilder builder, final int numInfoFields ) throws IOException {
-        if ( numInfoFields == 0 )
-            // fast path, don't bother doing any work if there are no fields
-            return;
-
-        final Map<String, Object> infoFieldEntries = new HashMap<String, Object>(numInfoFields);
-        for ( int i = 0; i < numInfoFields; i++ ) {
-            final String key = getDictionaryString();
-            Object value = decoder.decodeTypedValue();
-            final VCFCompoundHeaderLine metaData = VariantContextUtils.getMetaDataForField(header, key);
-            if ( metaData.getType() == VCFHeaderLineType.Flag ) value = true; // special case for flags
-            infoFieldEntries.put(key, value);
-        }
-
-        builder.attributes(infoFieldEntries);
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Decoding Genotypes
-    //
-    // --------------------------------------------------------------------------------
-
-    /**
-     * Create the lazy loader for the genotypes data, and store it in the builder
-     * so that the VC will be able to decode on demand the genotypes data
-     *
-     * @param siteInfo
-     * @param builder
-     */
-    private void createLazyGenotypesDecoder( final SitesInfoForDecoding siteInfo,
-                                             final VariantContextBuilder builder ) {
-        if (siteInfo.nSamples > 0) {
-            final LazyGenotypesContext.LazyParser lazyParser =
-                    new BCF2LazyGenotypesDecoder(this, siteInfo.alleles, siteInfo.nSamples, siteInfo.nFormatFields, builders);
-
-            final LazyData lazyData = new LazyData(header, siteInfo.nFormatFields, decoder.getRecordBytes());
-            final LazyGenotypesContext lazy = new LazyGenotypesContext(lazyParser, lazyData, header.getNGenotypeSamples());
-
-            // did we resort the sample names?  If so, we need to load the genotype data
-            if ( !header.samplesWereAlreadySorted() )
-                lazy.decode();
-
-            builder.genotypesNoValidation(lazy);
-        }
-    }
-
-    public static class LazyData {
-        final public VCFHeader header;
-        final public int nGenotypeFields;
-        final public byte[] bytes;
-
-        public LazyData(final VCFHeader header, final int nGenotypeFields, final byte[] bytes) {
-            this.header = header;
-            this.nGenotypeFields = nGenotypeFields;
-            this.bytes = bytes;
-        }
-    }
-
-    private final String getDictionaryString() throws IOException {
-        return getDictionaryString((Integer) decoder.decodeTypedValue());
-    }
-
-    protected final String getDictionaryString(final int offset) {
-        return dictionary.get(offset);
-    }
-
-    /**
-     * Translate the config offset as encoded in the BCF file into the actual string
-     * name of the contig from the dictionary
-     *
-     * @param contigOffset
-     * @return
-     */
-    private final String lookupContigName( final int contigOffset ) {
-        return contigNames.get(contigOffset);
-    }
-
-    private final ArrayList<String> parseDictionary(final VCFHeader header) {
-        final ArrayList<String> dict = BCF2Utils.makeDictionary(header);
-
-        // if we got here we never found a dictionary, or there are no elements in the dictionary
-        if ( dict.isEmpty() )
-            error("Dictionary header element was absent or empty");
-
-        return dict;
-    }
-
-    /**
-     * @return the VCFHeader we found in this BCF2 file
-     */
-    protected VCFHeader getHeader() {
-        return header;
-    }
-
-    protected BCF2GenotypeFieldDecoders.Decoder getGenotypeFieldDecoder(final String field) {
-        return gtFieldDecoders.getDecoder(field);
-    }
-
-    private void error(final String message) throws RuntimeException {
-        throw new TribbleException(String.format("%s, at record %d with position %d:", message, recordNo, pos));
-    }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2Decoder.java b/src/main/java/htsjdk/variant/bcf2/BCF2Decoder.java
deleted file mode 100644
index 0dd166e..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2Decoder.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.utils.GeneralUtils;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-public final class BCF2Decoder {
-    byte[] recordBytes = null;
-    ByteArrayInputStream recordStream = null;
-
-    public BCF2Decoder() {
-        // nothing to do
-    }
-
-    /**
-     * Create a new decoder ready to read BCF2 data from the byte[] recordBytes, for testing purposes
-     *
-     * @param recordBytes
-     */
-    protected BCF2Decoder(final byte[] recordBytes) {
-        setRecordBytes(recordBytes);
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // Routines to load, set, skip blocks of underlying data we are decoding
-    //
-    // ----------------------------------------------------------------------
-
-    /**
-     * Reads the next record from input stream and prepare this decoder to decode values from it
-     *
-     * @param stream
-     */
-    public void readNextBlock(final int blockSizeInBytes, final InputStream stream) {
-        if ( blockSizeInBytes < 0 ) throw new TribbleException("Invalid block size " + blockSizeInBytes);
-        setRecordBytes(readRecordBytes(blockSizeInBytes, stream));
-    }
-
-    /**
-     * Skips the next record from input stream, invalidating current block data
-     *
-     * @param stream
-     */
-    public void skipNextBlock(final int blockSizeInBytes, final InputStream stream) {
-        try {
-            final int bytesRead = (int)stream.skip(blockSizeInBytes);
-            validateReadBytes(bytesRead, 1, blockSizeInBytes);
-        } catch ( IOException e ) {
-            throw new TribbleException("I/O error while reading BCF2 file", e);
-        }
-        this.recordBytes = null;
-        this.recordStream = null;
-    }
-
-    /**
-     * Returns the byte[] for the block of data we are currently decoding
-     * @return
-     */
-    public byte[] getRecordBytes() {
-        return recordBytes;
-    }
-
-    /**
-     * The size of the current block in bytes
-     *
-     * @return
-     */
-    public int getBlockSize() {
-        return recordBytes.length;
-    }
-
-    public boolean blockIsFullyDecoded() {
-        return recordStream.available() == 0;
-    }
-
-    /**
-     * Use the recordBytes[] to read BCF2 records from now on
-     *
-     * @param recordBytes
-     */
-    public void setRecordBytes(final byte[] recordBytes) {
-        this.recordBytes = recordBytes;
-        this.recordStream = new ByteArrayInputStream(recordBytes);
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // High-level decoder
-    //
-    // ----------------------------------------------------------------------
-
-    public final Object decodeTypedValue() throws IOException {
-        final byte typeDescriptor = readTypeDescriptor();
-        return decodeTypedValue(typeDescriptor);
-    }
-
-    public final Object decodeTypedValue(final byte typeDescriptor) throws IOException {
-        final int size = decodeNumberOfElements(typeDescriptor);
-        return decodeTypedValue(typeDescriptor, size);
-    }
-
-    public final Object decodeTypedValue(final byte typeDescriptor, final int size) throws IOException {
-        if ( size == 0 ) {
-            // missing value => null in java
-            return null;
-        } else {
-            final BCF2Type type = BCF2Utils.decodeType(typeDescriptor);
-            if ( type == BCF2Type.CHAR ) { // special case string decoding for efficiency
-                return decodeLiteralString(size);
-            } else if ( size == 1 ) {
-                return decodeSingleValue(type);
-            } else {
-                final ArrayList<Object> ints = new ArrayList<Object>(size);
-                for ( int i = 0; i < size; i++ ) {
-                    final Object val = decodeSingleValue(type);
-                    if ( val == null ) continue; // auto-pruning.  We remove trailing nulls
-                    ints.add(val);
-                }
-                return ints.isEmpty() ? null : ints; // return null when all of the values are null
-            }
-        }
-    }
-
-    public final Object decodeSingleValue(final BCF2Type type) throws IOException {
-        // TODO -- decodeTypedValue should integrate this routine
-        final int value = decodeInt(type);
-
-        if ( value == type.getMissingBytes() )
-            return null;
-        else {
-            switch (type) {
-                case INT8:
-                case INT16:
-                case INT32: return value;
-                case FLOAT: return rawFloatToFloat(value);
-                case CHAR:  return value & 0xFF; // TODO -- I cannot imagine why we'd get here, as string needs to be special cased
-                default:    throw new TribbleException("BCF2 codec doesn't know how to decode type " + type );
-            }
-        }
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // Decode raw primitive data types (ints, floats, and strings)
-    //
-    // ----------------------------------------------------------------------
-
-    private final Object decodeLiteralString(final int size) {
-        assert size > 0;
-
-        // TODO -- assumes size > 0
-        final byte[] bytes = new byte[size]; // TODO -- in principle should just grab bytes from underlying array
-        try {
-            recordStream.read(bytes);
-
-            int goodLength = 0;
-            for ( ; goodLength < bytes.length ; goodLength++ )
-                if ( bytes[goodLength] == 0 ) break;
-
-            if ( goodLength == 0 )
-                return null;
-            else {
-                final String s = new String(bytes, 0, goodLength);
-                return BCF2Utils.isCollapsedString(s) ? BCF2Utils.explodeStringList(s) : s;
-            }
-        } catch ( IOException e ) {
-            throw new TribbleException("readByte failure", e);
-        }
-    }
-
-    public final int decodeNumberOfElements(final byte typeDescriptor) throws IOException {
-        if ( BCF2Utils.sizeIsOverflow(typeDescriptor) )
-            // -1 ensures we explode immediately with a bad size if the result is missing
-            return decodeInt(readTypeDescriptor(), -1);
-        else
-            // the size is inline, so just decode it
-            return BCF2Utils.decodeSize(typeDescriptor);
-    }
-
-    /**
-     * Decode an int from the stream.  If the value in the stream is missing,
-     * returns missingValue.  Requires the typeDescriptor indicate an inline
-     * single element event
-     *
-     * @param typeDescriptor
-     * @return
-     */
-    public final int decodeInt(final byte typeDescriptor, final int missingValue) throws IOException {
-        final BCF2Type type = BCF2Utils.decodeType(typeDescriptor);
-        final int i = decodeInt(type);
-        return i == type.getMissingBytes() ? missingValue : i;
-    }
-
-    public final int decodeInt(final BCF2Type type) throws IOException {
-        return type.read(recordStream);
-    }
-
-    /**
-     * Low-level reader for int[]
-     *
-     * Requires a typeDescriptor so the function knows how many elements to read,
-     * and how they are encoded.
-     *
-     * If size == 0 => result is null
-     * If size > 0 => result depends on the actual values in the stream
-     *      -- If the first element read is MISSING, result is null (all values are missing)
-     *      -- Else result = int[N] where N is the first N non-missing values decoded
-     *
-     * @param maybeDest if not null we'll not allocate space for the vector, but instead use
-     *                  the externally allocated array of ints to store values.  If the
-     *                  size of this vector is < the actual size of the elements, we'll be
-     *                  forced to use freshly allocated arrays.  Also note that padded
-     *                  int elements are still forced to do a fresh allocation as well.
-     * @return see description
-     */
-    public final int[] decodeIntArray(final int size, final BCF2Type type, int[] maybeDest) throws IOException {
-        if ( size == 0 ) {
-            return null;
-        } else {
-            if ( maybeDest != null && maybeDest.length < size )
-                maybeDest = null; // by nulling this out we ensure that we do fresh allocations as maybeDest is too small
-
-            final int val1 = decodeInt(type);
-            if ( val1 == type.getMissingBytes() ) {
-                // fast path for first element being missing
-                for ( int i = 1; i < size; i++ ) decodeInt(type);
-                return null;
-            } else {
-                // we know we will have at least 1 element, so making the int[] is worth it
-                final int[] ints = maybeDest == null ? new int[size] : maybeDest;
-                ints[0] = val1; // we already read the first one
-                for ( int i = 1; i < size; i++ ) {
-                    ints[i] = decodeInt(type);
-                    if ( ints[i] == type.getMissingBytes() ) {
-                        // read the rest of the missing values, dropping them
-                        for ( int j = i + 1; j < size; j++ ) decodeInt(type);
-                        // deal with auto-pruning by returning an int[] containing
-                        // only the non-MISSING values.  We do this by copying the first
-                        // i elements, as i itself is missing
-                        return Arrays.copyOf(ints, i);
-                    }
-                }
-                return ints; // all of the elements were non-MISSING
-            }
-        }
-    }
-
-    public final int[] decodeIntArray(final byte typeDescriptor, final int size) throws IOException {
-        final BCF2Type type = BCF2Utils.decodeType(typeDescriptor);
-        return decodeIntArray(size, type, null);
-    }
-
-    private double rawFloatToFloat(final int rawFloat) {
-        return (double)Float.intBitsToFloat(rawFloat);
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // Utility functions
-    //
-    // ----------------------------------------------------------------------
-
-    /**
-     * Read the size of the next block from inputStream
-     *
-     * @param inputStream
-     * @return
-     */
-    public final int readBlockSize(final InputStream inputStream) throws IOException {
-        return BCF2Type.INT32.read(inputStream);
-    }
-
-    /**
-     * Read all bytes for a BCF record block into a byte[], and return it
-     *
-     * Is smart about reading from the stream multiple times to fill the buffer, if necessary
-     *
-     * @param blockSizeInBytes number of bytes to read
-     * @param inputStream the stream to read from
-     * @return a non-null byte[] containing exactly blockSizeInBytes bytes from the inputStream
-     */
-    private static byte[] readRecordBytes(final int blockSizeInBytes, final InputStream inputStream) {
-        assert blockSizeInBytes >= 0;
-
-        final byte[] record = new byte[blockSizeInBytes];
-        try {
-            int bytesRead = 0;
-            int nReadAttempts = 0; // keep track of how many times we've read
-
-            // because we might not read enough bytes from the file in a single go, do it in a loop until we get EOF
-            while ( bytesRead < blockSizeInBytes ) {
-                final int read1 = inputStream.read(record, bytesRead, blockSizeInBytes - bytesRead);
-                if ( read1 == -1 )
-                    validateReadBytes(bytesRead, nReadAttempts, blockSizeInBytes);
-                else
-                    bytesRead += read1;
-            }
-
-            if ( GeneralUtils.DEBUG_MODE_ENABLED && nReadAttempts > 1 ) { // TODO -- remove me
-                System.err.println("Required multiple read attempts to actually get the entire BCF2 block, unexpected behavior");
-            }
-
-            validateReadBytes(bytesRead, nReadAttempts, blockSizeInBytes);
-        } catch ( IOException e ) {
-            throw new TribbleException("I/O error while reading BCF2 file", e);
-        }
-
-        return record;
-    }
-
-    /**
-     * Make sure we read the right number of bytes, or throw an error
-     *
-     * @param actuallyRead
-     * @param nReadAttempts
-     * @param expected
-     */
-    private static void validateReadBytes(final int actuallyRead, final int nReadAttempts, final int expected) {
-        assert expected >= 0;
-
-        if ( actuallyRead < expected ) {
-            throw new TribbleException(
-                    String.format("Failed to read next complete record: expected %d bytes but read only %d after %d iterations",
-                            expected, actuallyRead, nReadAttempts));
-        }
-    }
-
-    public final byte readTypeDescriptor() throws IOException {
-        return BCF2Utils.readByte(recordStream);
-    }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2GenotypeFieldDecoders.java b/src/main/java/htsjdk/variant/bcf2/BCF2GenotypeFieldDecoders.java
deleted file mode 100644
index 13c2716..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2GenotypeFieldDecoders.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFHeader;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * An efficient scheme for building and obtaining specialized
- * genotype field decoders.  Used by the BCFCodec to parse
- * with little overhead the fields from BCF2 encoded genotype
- * records
- *
- * @author Mark DePristo
- * @since 6/12
- */
-public class BCF2GenotypeFieldDecoders {
-    private final static boolean ENABLE_FASTPATH_GT = true;
-    private final static int MIN_SAMPLES_FOR_FASTPATH_GENOTYPES = 0; // TODO -- update to reasonable number
-
-    // initialized once per writer to allow parallel writers to work
-    private final HashMap<String, Decoder> genotypeFieldDecoder = new HashMap<String, Decoder>();
-    private final Decoder defaultDecoder = new GenericDecoder();
-
-    public BCF2GenotypeFieldDecoders(final VCFHeader header) {
-        // TODO -- fill in appropriate decoders for each FORMAT field in the header
-
-        genotypeFieldDecoder.put(VCFConstants.GENOTYPE_KEY, new GTDecoder());
-        // currently the generic decoder handles FILTER values properly, in so far as we don't tolerate multiple filter field values per genotype
-        genotypeFieldDecoder.put(VCFConstants.GENOTYPE_FILTER_KEY, new FTDecoder());
-        genotypeFieldDecoder.put(VCFConstants.DEPTH_KEY, new DPDecoder());
-        genotypeFieldDecoder.put(VCFConstants.GENOTYPE_ALLELE_DEPTHS, new ADDecoder());
-        genotypeFieldDecoder.put(VCFConstants.GENOTYPE_PL_KEY, new PLDecoder());
-        genotypeFieldDecoder.put(VCFConstants.GENOTYPE_QUALITY_KEY, new GQDecoder());
-    }
-
-    // -----------------------------------------------------------------
-    //
-    // Genotype field decoder
-    //
-    // -----------------------------------------------------------------
-
-    /**
-     * Return decoder appropriate for field, or the generic decoder if no
-     * specialized one is bound
-     * @param field the GT field to decode
-     * @return a non-null decoder
-     */
-    public Decoder getDecoder(final String field) {
-        final Decoder d = genotypeFieldDecoder.get(field);
-        return d == null ? defaultDecoder : d;
-    }
-
-    /**
-     * Decoder a field (implicit from creation) encoded as
-     * typeDescriptor in the decoder object in the GenotypeBuilders
-     * one for each sample in order.
-     *
-     * The way this works is that this decode method
-     * iterates over the builders, decoding a genotype field
-     * in BCF2 for each sample from decoder.
-     *
-     * This system allows us to easily use specialized
-     * decoders for specific genotype field values. For example,
-     * we use a special decoder to directly read the BCF2 data for
-     * the PL field into a int[] rather than the generic List of Integer
-     */
-    public interface Decoder {
-        public void decode(final List<Allele> siteAlleles,
-                           final String field,
-                           final BCF2Decoder decoder,
-                           final byte typeDescriptor,
-                           final int numElements,
-                           final GenotypeBuilder[] gbs) throws IOException;
-    }
-
-    private class GTDecoder implements Decoder {
-        @Override
-        public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
-            if ( ENABLE_FASTPATH_GT && siteAlleles.size() == 2 && numElements == 2 && gbs.length >= MIN_SAMPLES_FOR_FASTPATH_GENOTYPES )
-                fastBiallelicDiploidDecode(siteAlleles, decoder, typeDescriptor, gbs);
-            else {
-                generalDecode(siteAlleles, numElements, decoder, typeDescriptor, gbs);
-            }
-        }
-
-        /**
-         * fast path for many samples with diploid genotypes
-         *
-         * The way this would work is simple.  Create a List<Allele> diploidGenotypes[] object
-         * After decoding the offset, if that sample is diploid compute the
-         * offset into the alleles vector which is simply offset = allele0 * nAlleles + allele1
-         * if there's a value at diploidGenotypes[offset], use it, otherwise create the genotype
-         * cache it and use that
-         *
-         * Some notes.  If there are nAlleles at the site, there are implicitly actually
-         * n + 1 options including
-         */
-        @SuppressWarnings({"unchecked"})
-        private final void fastBiallelicDiploidDecode(final List<Allele> siteAlleles,
-                                                      final BCF2Decoder decoder,
-                                                      final byte typeDescriptor,
-                                                      final GenotypeBuilder[] gbs) throws IOException {
-            final BCF2Type type = BCF2Utils.decodeType(typeDescriptor);
-
-            final int nPossibleGenotypes = 3 * 3;
-            final Object allGenotypes[] = new Object[nPossibleGenotypes];
-
-            for ( final GenotypeBuilder gb : gbs ) {
-                final int a1 = decoder.decodeInt(type);
-                final int a2 = decoder.decodeInt(type);
-
-                if ( a1 == type.getMissingBytes() ) {
-                    assert a2 == type.getMissingBytes();
-                    // no called sample GT = .
-                    gb.alleles(null);
-                } else if ( a2 == type.getMissingBytes() ) {
-                    gb.alleles(Arrays.asList(getAlleleFromEncoded(siteAlleles, a1)));
-                } else {
-                    // downshift to remove phase
-                    final int offset = (a1 >> 1) * 3 + (a2 >> 1);
-                    assert offset < allGenotypes.length;
-
-                    // TODO -- how can I get rid of this cast?
-                    List<Allele> gt = (List<Allele>)allGenotypes[offset];
-                    if ( gt == null ) {
-                        final Allele allele1 = getAlleleFromEncoded(siteAlleles, a1);
-                        final Allele allele2 = getAlleleFromEncoded(siteAlleles, a2);
-                        gt = Arrays.asList(allele1, allele2);
-                        allGenotypes[offset] = gt;
-                    }
-
-                    gb.alleles(gt);
-                }
-
-                final boolean phased = (a1 & 0x01) == 1;
-                gb.phased(phased);
-            }
-        }
-
-        private final void generalDecode(final List<Allele> siteAlleles,
-                                         final int ploidy,
-                                         final BCF2Decoder decoder,
-                                         final byte typeDescriptor,
-                                         final GenotypeBuilder[] gbs) throws IOException {
-            final BCF2Type type = BCF2Utils.decodeType(typeDescriptor);
-
-            // a single cache for the encoded genotypes, since we don't actually need this vector
-            final int[] tmp = new int[ploidy];
-
-            for ( final GenotypeBuilder gb : gbs ) {
-                final int[] encoded = decoder.decodeIntArray(ploidy, type, tmp);
-                if ( encoded == null )
-                    // no called sample GT = .
-                    gb.alleles(null);
-                else {
-                    assert encoded.length > 0;
-
-                    // we have at least some alleles to decode
-                    final List<Allele> gt = new ArrayList<Allele>(encoded.length);
-
-                    // note that the auto-pruning of fields magically handles different
-                    // ploidy per sample at a site
-                    for ( final int encode : encoded )
-                        gt.add(getAlleleFromEncoded(siteAlleles, encode));
-
-                    gb.alleles(gt);
-                    final boolean phased = (encoded[0] & 0x01) == 1;
-                    gb.phased(phased);
-                }
-            }
-        }
-
-        private final Allele getAlleleFromEncoded(final List<Allele> siteAlleles, final int encode) {
-            final int offset = encode >> 1;
-            return offset == 0 ? Allele.NO_CALL : siteAlleles.get(offset - 1);
-        }
-    }
-
-    private class DPDecoder implements Decoder {
-        @Override
-        public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
-            for ( final GenotypeBuilder gb : gbs ) {
-                // the -1 is for missing
-                gb.DP(decoder.decodeInt(typeDescriptor, -1));
-            }
-        }
-    }
-
-    private class GQDecoder implements Decoder {
-        @Override
-        public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
-            for ( final GenotypeBuilder gb : gbs ) {
-                // the -1 is for missing
-                gb.GQ(decoder.decodeInt(typeDescriptor, -1));
-            }
-        }
-    }
-
-    private class ADDecoder implements Decoder {
-        @Override
-        public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
-            for ( final GenotypeBuilder gb : gbs ) {
-                gb.AD(decoder.decodeIntArray(typeDescriptor, numElements));
-            }
-        }
-    }
-
-    private class PLDecoder implements Decoder {
-        @Override
-        public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
-            for ( final GenotypeBuilder gb : gbs ) {
-                gb.PL(decoder.decodeIntArray(typeDescriptor, numElements));
-            }
-        }
-    }
-
-    private class GenericDecoder implements Decoder {
-        @Override
-        public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
-            for ( final GenotypeBuilder gb : gbs ) {
-                Object value = decoder.decodeTypedValue(typeDescriptor, numElements);
-                if ( value != null ) { // don't add missing values
-                    if ( value instanceof List && ((List)value).size() == 1) {
-                        // todo -- I really hate this, and it suggests that the code isn't completely right
-                        // the reason it's here is that it's possible to prune down a vector to a singleton
-                        // value and there we have the contract that the value comes back as an atomic value
-                        // not a vector of size 1
-                        value = ((List)value).get(0);
-                    }
-                    gb.attribute(field, value);
-                }
-            }
-        }
-    }
-
-    private class FTDecoder implements Decoder {
-        @Override
-        public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
-            for ( final GenotypeBuilder gb : gbs ) {
-                Object value = decoder.decodeTypedValue(typeDescriptor, numElements);
-                assert value == null || value instanceof String;
-                gb.filter((String)value);
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2LazyGenotypesDecoder.java b/src/main/java/htsjdk/variant/bcf2/BCF2LazyGenotypesDecoder.java
deleted file mode 100644
index aadea53..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2LazyGenotypesDecoder.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.LazyGenotypesContext;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Lazy version of genotypes decoder for BCF2 genotypes
- *
- * @author Mark DePristo
- * @since 5/12
- */
-public class BCF2LazyGenotypesDecoder implements LazyGenotypesContext.LazyParser {
-    // the essential information for us to use to decode the genotypes data
-    // initialized when this lazy decoder is created, as we know all of this from the BCF2Codec
-    // and its stored here again for code cleanliness
-    private final BCF2Codec codec;
-    private final List<Allele> siteAlleles;
-    private final int nSamples;
-    private final int nFields;
-    private final GenotypeBuilder[] builders;
-
-    BCF2LazyGenotypesDecoder(final BCF2Codec codec, final List<Allele> alleles, final int nSamples,
-                             final int nFields, final GenotypeBuilder[] builders) {
-        this.codec = codec;
-        this.siteAlleles = alleles;
-        this.nSamples = nSamples;
-        this.nFields = nFields;
-        this.builders = builders;
-    }
-
-    @Override
-    public LazyGenotypesContext.LazyData parse(final Object data) {
-        try {
-
-            // load our byte[] data into the decoder
-            final BCF2Decoder decoder = new BCF2Decoder(((BCF2Codec.LazyData)data).bytes);
-
-            for ( int i = 0; i < nSamples; i++ )
-                builders[i].reset(true);
-
-            for ( int i = 0; i < nFields; i++ ) {
-                // get the field name
-                final int offset = (Integer) decoder.decodeTypedValue();
-                final String field = codec.getDictionaryString(offset);
-
-                // the type of each element
-                final byte typeDescriptor = decoder.readTypeDescriptor();
-                final int numElements = decoder.decodeNumberOfElements(typeDescriptor);
-                final BCF2GenotypeFieldDecoders.Decoder fieldDecoder = codec.getGenotypeFieldDecoder(field);
-                try {
-                    fieldDecoder.decode(siteAlleles, field, decoder, typeDescriptor, numElements, builders);
-                } catch ( ClassCastException e ) {
-                    throw new TribbleException("BUG: expected encoding of field " + field
-                            + " inconsistent with the value observed in the decoded value");
-                }
-            }
-
-            final ArrayList<Genotype> genotypes = new ArrayList<Genotype>(nSamples);
-            for ( final GenotypeBuilder gb : builders )
-                genotypes.add(gb.make());
-
-            return new LazyGenotypesContext.LazyData(genotypes, codec.getHeader().getSampleNamesInOrder(), codec.getHeader().getSampleNameToOffset());
-        } catch ( IOException e ) {
-            throw new TribbleException("Unexpected IOException parsing already read genotypes data block", e);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2Type.java b/src/main/java/htsjdk/variant/bcf2/BCF2Type.java
deleted file mode 100644
index 11c8edf..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2Type.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.EnumSet;
-
-/**
- * BCF2 types and associated information
- *
- * @author depristo
- * @since 05/12
- */
-public enum BCF2Type {
-    // the actual values themselves
-    MISSING(0, 0, 0x00) {
-        @Override public int read(final InputStream in) throws IOException {
-            throw new IllegalArgumentException("Cannot read MISSING type");
-        }
-        @Override public void write(final int value, final OutputStream out) throws IOException {
-            throw new IllegalArgumentException("Cannot write MISSING type");
-        }
-    },
-
-    INT8 (1, 1, 0xFFFFFF80,        -127,        127) {
-        @Override
-        public int read(final InputStream in) throws IOException {
-            return BCF2Utils.readByte(in);
-        }
-
-        @Override
-        public void write(final int value, final OutputStream out) throws IOException {
-            out.write(0xFF & value);   // TODO -- do we need this operation?
-        }
-    },
-
-    INT16(2, 2, 0xFFFF8000,      -32767,      32767) {
-        @Override
-        public int read(final InputStream in) throws IOException {
-            final int b2 = BCF2Utils.readByte(in) & 0xFF;
-            final int b1 = BCF2Utils.readByte(in) & 0xFF;
-            return (short)((b1 << 8) | b2);
-        }
-
-        @Override
-        public void write(final int value, final OutputStream out) throws IOException {
-            // TODO -- optimization -- should we put this in a local buffer?
-            out.write((0x00FF & value));
-            out.write((0xFF00 & value) >> 8);
-        }
-    },
-
-    INT32(3, 4, 0x80000000, -2147483647, 2147483647) {
-        @Override
-        public int read(final InputStream in) throws IOException {
-            final int b4 = BCF2Utils.readByte(in) & 0xFF;
-            final int b3 = BCF2Utils.readByte(in) & 0xFF;
-            final int b2 = BCF2Utils.readByte(in) & 0xFF;
-            final int b1 = BCF2Utils.readByte(in) & 0xFF;
-            return (int)(b1 << 24 | b2 << 16 | b3 << 8 | b4);
-        }
-
-        @Override
-        public void write(final int value, final OutputStream out) throws IOException {
-            out.write((0x000000FF & value));
-            out.write((0x0000FF00 & value) >> 8);
-            out.write((0x00FF0000 & value) >> 16);
-            out.write((0xFF000000 & value) >> 24);
-        }
-    },
-
-    FLOAT(5, 4, 0x7F800001) {
-        @Override
-        public int read(final InputStream in) throws IOException {
-            return INT32.read(in);
-        }
-
-        @Override
-        public void write(final int value, final OutputStream out) throws IOException {
-            INT32.write(value, out);
-        }
-    },
-
-    CHAR (7, 1, 0x00000000) {
-        @Override
-        public int read(final InputStream in) throws IOException {
-            return INT8.read(in);
-        }
-
-        @Override
-        public void write(final int value, final OutputStream out) throws IOException {
-            INT8.write(value, out);
-        }
-    };
-
-    private final int id;
-    private final Object missingJavaValue;
-    private final int missingBytes;
-    private final int sizeInBytes;
-    private final long minValue, maxValue;
-
-    BCF2Type(final int id, final int sizeInBytes, final int missingBytes) {
-        this(id, sizeInBytes, missingBytes, 0, 0);
-    }
-
-    BCF2Type(final int id, final int sizeInBytes, final int missingBytes, final long minValue, final long maxValue) {
-        this.id = id;
-        this.sizeInBytes = sizeInBytes;
-        this.missingJavaValue = null;
-        this.missingBytes = missingBytes;
-        this.minValue = minValue;
-        this.maxValue = maxValue;
-    }
-
-    /**
-     * How many bytes are used to represent this type on disk?
-     * @return
-     */
-    public int getSizeInBytes() {
-        return sizeInBytes;
-    }
-
-    /**
-     * The ID according to the BCF2 specification
-     * @return
-     */
-    public int getID() { return id; }
-
-    /**
-     * Can we encode value v in this type, according to its declared range.
-     *
-     * Only makes sense for integer values
-     *
-     * @param v
-     * @return
-     */
-    public final boolean withinRange(final long v) { return v >= minValue && v <= maxValue; }
-
-    /**
-     * Return the java object (aka null) that is used to represent a missing value for this
-     * type in Java
-     *
-     * @return
-     */
-    public Object getMissingJavaValue() { return missingJavaValue; }
-
-    /**
-     * The bytes (encoded as an int) that are used to represent a missing value
-     * for this type in BCF2
-     *
-     * @return
-     */
-    public int getMissingBytes() { return missingBytes; }
-
-    /**
-     * An enum set of the types that might represent Integer values
-     */
-    private final static EnumSet<BCF2Type> INTEGERS = EnumSet.of(INT8, INT16, INT32);
-
-    /**
-     * @return true if this BCF2Type corresponds to the magic "MISSING" type (0x00)
-     */
-    public boolean isMissingType() {
-        return this == MISSING;
-    }
-
-    public boolean isIntegerType() {
-        return INTEGERS.contains(this);
-    }
-
-    /**
-     * Read a value from in stream of this BCF2 type as an int [32 bit] collection of bits
-     *
-     * For intX and char values this is just the int / byte value of the underlying data represented as a 32 bit int
-     * For a char the result must be converted to a char by (char)(byte)(0x0F & value)
-     * For doubles it's necessary to convert subsequently this value to a double via Double.bitsToDouble()
-     *
-     * @param in
-     * @return
-     * @throws IOException
-     */
-    public int read(final InputStream in) throws IOException {
-        throw new IllegalArgumentException("Not implemented");
-    }
-
-    public void write(final int value, final OutputStream out) throws IOException {
-        throw new IllegalArgumentException("Not implemented");
-    }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2Utils.java b/src/main/java/htsjdk/variant/bcf2/BCF2Utils.java
deleted file mode 100644
index f2fb1a8..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2Utils.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLine;
-import htsjdk.variant.vcf.VCFIDHeaderLine;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Common utilities for working with BCF2 files
- *
- * Includes convenience methods for encoding, decoding BCF2 type descriptors (size + type)
- *
- * @author depristo
- * @since 5/12
- */
-public final class BCF2Utils {
-    public static final int MAX_ALLELES_IN_GENOTYPES = 127;
-
-    public static final int OVERFLOW_ELEMENT_MARKER = 15;
-    public static final int MAX_INLINE_ELEMENTS = 14;
-
-    public final static BCF2Type[] INTEGER_TYPES_BY_SIZE = new BCF2Type[]{BCF2Type.INT8, BCF2Type.INT16, BCF2Type.INT32};
-    public final static BCF2Type[] ID_TO_ENUM;
-
-    static {
-        int maxID = -1;
-        for ( BCF2Type v : BCF2Type.values() ) maxID = Math.max(v.getID(), maxID);
-        ID_TO_ENUM = new BCF2Type[maxID+1];
-        for ( BCF2Type v : BCF2Type.values() ) ID_TO_ENUM[v.getID()] = v;
-    }
-
-    private BCF2Utils() {}
-
-    /**
-     * Create a strings dictionary from the VCF header
-     *
-     * The dictionary is an ordered list of common VCF identifers (FILTER, INFO, and FORMAT)
-     * fields.
-     *
-     * Note that its critical that the list be dedupped and sorted in a consistent manner each time,
-     * as the BCF2 offsets are encoded relative to this dictionary, and if it isn't determined exactly
-     * the same way as in the header each time it's very bad
-     *
-     * @param header the VCFHeader from which to build the dictionary
-     * @return a non-null dictionary of elements, may be empty
-     */
-    public static ArrayList<String> makeDictionary(final VCFHeader header) {
-        final Set<String> seen = new HashSet<String>();
-        final ArrayList<String> dict = new ArrayList<String>();
-
-        // special case the special PASS field which doesn't show up in the FILTER field definitions
-        seen.add(VCFConstants.PASSES_FILTERS_v4);
-        dict.add(VCFConstants.PASSES_FILTERS_v4);
-
-        // set up the strings dictionary
-        for ( VCFHeaderLine line : header.getMetaDataInInputOrder() ) {
-            if ( line.shouldBeAddedToDictionary() ) {
-                final VCFIDHeaderLine idLine = (VCFIDHeaderLine)line;
-                if ( ! seen.contains(idLine.getID())) {
-                    dict.add(idLine.getID());
-                    seen.add(idLine.getID());
-                }
-            }
-        }
-
-        return dict;
-    }
-
-    public static byte encodeTypeDescriptor(final int nElements, final BCF2Type type ) {
-        return (byte)((0x0F & nElements) << 4 | (type.getID() & 0x0F));
-    }
-
-    public static int decodeSize(final byte typeDescriptor) {
-        return (0xF0 & typeDescriptor) >> 4;
-    }
-
-    public static int decodeTypeID(final byte typeDescriptor) {
-        return typeDescriptor & 0x0F;
-    }
-
-    public static BCF2Type decodeType(final byte typeDescriptor) {
-        return ID_TO_ENUM[decodeTypeID(typeDescriptor)];
-    }
-
-    public static boolean sizeIsOverflow(final byte typeDescriptor) {
-        return decodeSize(typeDescriptor) == OVERFLOW_ELEMENT_MARKER;
-    }
-
-    public static byte readByte(final InputStream stream) throws IOException {
-        return (byte)(stream.read() & 0xFF);
-    }
-
-    /**
-     * Collapse multiple strings into a comma separated list
-     *
-     * ["s1", "s2", "s3"] => ",s1,s2,s3"
-     *
-     * @param strings size > 1 list of strings
-     * @return
-     */
-    public static String collapseStringList(final List<String> strings) {
-        if ( strings.isEmpty() ) return "";
-        else if ( strings.size() == 1 ) return strings.get(0);
-        else {
-            final StringBuilder b = new StringBuilder();
-            for ( final String s : strings ) {
-                if ( s != null ) {
-                    assert s.indexOf(",") == -1; // no commas in individual strings
-                    b.append(',').append(s);
-                }
-            }
-            return b.toString();
-        }
-    }
-
-    /**
-     * Inverse operation of collapseStringList.
-     *
-     * ",s1,s2,s3" => ["s1", "s2", "s3"]
-     *
-     *
-     * @param collapsed
-     * @return
-     */
-    public static List<String> explodeStringList(final String collapsed) {
-        assert isCollapsedString(collapsed);
-        final String[] exploded = collapsed.substring(1).split(",");
-        return Arrays.asList(exploded);
-    }
-
-    public static boolean isCollapsedString(final String s) {
-        return !s.isEmpty() && s.charAt(0) == ',';
-    }
-
-    /**
-     * Returns a good name for a shadow BCF file for vcfFile.
-     *
-     * foo.vcf => foo.bcf
-     * foo.xxx => foo.xxx.bcf
-     *
-     * If the resulting BCF file cannot be written, return null.  Happens
-     * when vcfFile = /dev/null for example
-     *
-     * @param vcfFile
-     * @return the BCF
-     */
-    public static final File shadowBCF(final File vcfFile) {
-        final String path = vcfFile.getAbsolutePath();
-        if ( path.contains(".vcf") )
-            return new File(path.replace(".vcf", ".bcf"));
-        else {
-            final File bcf = new File( path + ".bcf" );
-            if ( bcf.canRead() )
-                return bcf;
-            else {
-                try {
-                    // this is the only way to robustly decide if we could actually write to BCF
-                    final FileOutputStream o = new FileOutputStream(bcf);
-                    o.close();
-                    bcf.delete();
-                    return bcf;
-                } catch ( FileNotFoundException e ) {
-                    return null;
-                } catch ( IOException e ) {
-                    return null;
-                }
-            }
-        }
-    }
-
-    public static BCF2Type determineIntegerType(final int value) {
-        for ( final BCF2Type potentialType : INTEGER_TYPES_BY_SIZE) {
-            if ( potentialType.withinRange(value) )
-                return potentialType;
-        }
-
-        throw new TribbleException("Integer cannot be encoded in allowable range of even INT32: " + value);
-    }
-
-    public static BCF2Type determineIntegerType(final int[] values) {
-        // find the min and max values in the array
-        int max = 0, min = 0;
-        for ( final int v : values ) {
-            if ( v > max ) max = v;
-            if ( v < min ) min = v;
-        }
-
-        final BCF2Type maxType = determineIntegerType(max);
-        final BCF2Type minType = determineIntegerType(min);
-
-        // INT8 < INT16 < INT32 so this returns the larger of the two
-        return maxType.compareTo(minType) >= 0 ? maxType : minType;
-    }
-
-    /**
-     * Returns the maximum BCF2 integer size of t1 and t2
-     *
-     * For example, if t1 == INT8 and t2 == INT16 returns INT16
-     *
-     * @param t1
-     * @param t2
-     * @return
-     */
-    public static BCF2Type maxIntegerType(final BCF2Type t1, final BCF2Type t2) {
-        switch ( t1 ) {
-            case INT8: return t2;
-            case INT16: return t2 == BCF2Type.INT32 ? t2 : t1;
-            case INT32: return t1;
-            default: throw new TribbleException("BUG: unexpected BCF2Type " + t1);
-        }
-    }
-
-    public static BCF2Type determineIntegerType(final List<Integer> values) {
-        BCF2Type maxType = BCF2Type.INT8;
-        for ( final int value : values ) {
-            final BCF2Type type1 = determineIntegerType(value);
-            switch ( type1 ) {
-                case INT8: break;
-                case INT16: maxType = BCF2Type.INT16; break;
-                case INT32: return BCF2Type.INT32; // fast path for largest possible value
-                default: throw new TribbleException("Unexpected integer type " + type1 );
-            }
-        }
-        return maxType;
-    }
-
-    /**
-     * Helper function that takes an object and returns a list representation
-     * of it:
-     *
-     * o == null => []
-     * o is a list => o
-     * else => [o]
-     *
-     * @param c  the class of the object
-     * @param o  the object to convert to a Java List
-     * @return
-     */
-    public static <T> List<T> toList(final Class<T> c, final Object o) {
-        if ( o == null ) return Collections.emptyList();
-        else if ( o instanceof List ) return (List<T>)o;
-        else if ( o.getClass().isArray() ) {
-            final int arraySize = Array.getLength(o);
-            final List<T> list = new ArrayList<T>(arraySize);
-            for (int i=0; i<arraySize; i++)
-                list.add((T)Array.get(o, i));
-            return list;
-        }
-        else return Collections.singletonList((T)o);
-    }
-
-    /**
-     * Are the elements and their order in the output and input headers consistent so that
-     * we can write out the raw genotypes block without decoding and recoding it?
-     *
-     * If the order of INFO, FILTER, or contrig elements in the output header is different than
-     * in the input header we must decode the blocks using the input header and then recode them
-     * based on the new output order.
-     *
-     * If they are consistent, we can simply pass through the raw genotypes block bytes, which is
-     * a *huge* performance win for large blocks.
-     *
-     * Many common operations on BCF2 files (merging them for -nt, selecting a subset of records, etc)
-     * don't modify the ordering of the header fields and so can safely pass through the genotypes
-     * undecoded.  Some operations -- those at add filters or info fields -- can change the ordering
-     * of the header fields and so produce invalid BCF2 files if the genotypes aren't decoded
-     */
-    public static boolean headerLinesAreOrderedConsistently(final VCFHeader outputHeader, final VCFHeader genotypesBlockHeader) {
-        // first, we have to have the same samples in the same order
-        if ( ! nullAsEmpty(outputHeader.getSampleNamesInOrder()).equals(nullAsEmpty(genotypesBlockHeader.getSampleNamesInOrder())) )
-            return false;
-
-        final Iterator<? extends VCFIDHeaderLine> outputLinesIt = outputHeader.getIDHeaderLines().iterator();
-        final Iterator<? extends VCFIDHeaderLine> inputLinesIt = genotypesBlockHeader.getIDHeaderLines().iterator();
-
-        while ( inputLinesIt.hasNext() ) {
-            if ( ! outputLinesIt.hasNext() ) // missing lines in output
-                return false;
-
-            final VCFIDHeaderLine outputLine = outputLinesIt.next();
-            final VCFIDHeaderLine inputLine = inputLinesIt.next();
-
-            if ( ! inputLine.getClass().equals(outputLine.getClass()) || ! inputLine.getID().equals(outputLine.getID()) )
-                return false;
-        }
-
-        return true;
-    }
-
-    private static <T> List<T> nullAsEmpty(List<T> l) {
-        if ( l == null )
-            return Collections.emptyList();
-        else
-            return l;
-    }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCFVersion.java b/src/main/java/htsjdk/variant/bcf2/BCFVersion.java
deleted file mode 100644
index 7605d03..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCFVersion.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-
-/**
- * Simple holder for BCF version information
- *
- * User: depristo
- * Date: 8/2/12
- * Time: 2:16 PM
- */
-public class BCFVersion {
-    /**
-     * BCF2 begins with the MAGIC info BCF_M_m where M is the major version (currently 2)
-     * and m is the minor version, currently 1
-     */
-    public static final byte[] MAGIC_HEADER_START = "BCF".getBytes();
-
-    final int majorVersion;
-    final int minorVersion;
-
-    public BCFVersion(int majorVersion, int minorVersion) {
-        this.majorVersion = majorVersion;
-        this.minorVersion = minorVersion;
-    }
-
-    /**
-     * @return the major version number of this BCF file
-     */
-    public int getMajorVersion() {
-        return majorVersion;
-    }
-
-    /**
-     * @return the minor version number of this BCF file
-     */
-    public int getMinorVersion() {
-        return minorVersion;
-    }
-
-    /**
-     * Return a new BCFVersion object describing the major and minor version of the BCF file in stream
-     *
-     * Note that stream must be at the very start of the file.
-     *
-     * @param stream
-     * @return a BCFVersion object, or null if stream doesn't contain a BCF file
-     * @throws IOException
-     */
-    public static BCFVersion readBCFVersion(final InputStream stream) throws IOException {
-        final byte[] magicBytes = new byte[MAGIC_HEADER_START.length];
-        stream.read(magicBytes);
-        if ( Arrays.equals(magicBytes, MAGIC_HEADER_START) ) {
-            // we're a BCF file
-            final int majorByte = stream.read();
-            final int minorByte = stream.read();
-            return new BCFVersion( majorByte, minorByte );
-        } else
-            return null;
-    }
-
-    /**
-     * Write out the BCF magic information indicating this is a BCF file with corresponding major and minor versions
-     * @param out
-     * @throws IOException
-     */
-    public void write(final OutputStream out) throws IOException {
-        out.write(MAGIC_HEADER_START);
-        out.write(getMajorVersion() & 0xFF);
-        out.write(getMinorVersion() & 0xFF);
-    }
-
-    @Override
-    public String toString() {
-        return String.format("BCF%d.%d", getMajorVersion(), getMinorVersion());
-    }
-}
diff --git a/src/main/java/htsjdk/variant/example/PrintVariantsExample.java b/src/main/java/htsjdk/variant/example/PrintVariantsExample.java
deleted file mode 100755
index 4471cea..0000000
--- a/src/main/java/htsjdk/variant/example/PrintVariantsExample.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- */
-package htsjdk.variant.example;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.ProgressLogger;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.readers.LineIterator;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.writer.Options;
-import htsjdk.variant.variantcontext.writer.VariantContextWriter;
-import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFHeader;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.util.Arrays;
-import java.util.stream.Collectors;
-
-/**
- * This is a example program showing how to use Feature readers and (optionally) writers.
- * It's also useful for measuring time.
- * An example invocation is:
- * java -cp dist/htsjdk-2.1.1.jar htsjdk.variant.example.PrintVariantsExample in.vcf out.vcf
- * <p>
- * Arguments:
- * - the first argument is the input file (VCF)
- * - the second argument is optional and is the name of the output file (nothing gets written if this argument is missing)
- */
-public final class PrintVariantsExample {
-    private PrintVariantsExample() {
-    }
-
-    private static final Log log = Log.getInstance(PrintVariantsExample.class);
-
-    public static void main(final String[] args) throws IOException {
-        if (args.length < 1) {
-            System.out.println("Usage: " + PrintVariantsExample.class.getCanonicalName() + " inFile [outFile]");
-            System.exit(1);
-        }
-        final File inputFile = new File(args[0]);
-        final File outputFile = args.length >= 2 ? new File(args[1]) : null;
-
-        final long start = System.currentTimeMillis();
-
-        log.info("Start with args:" + Arrays.toString(args));
-        printConfigurationInfo();
-
-        try(final VariantContextWriter writer = outputFile == null ? null : new VariantContextWriterBuilder().setOutputFile(outputFile).setOutputFileType(VariantContextWriterBuilder.OutputType.VCF).unsetOption(Options.INDEX_ON_THE_FLY).build();
-            final AbstractFeatureReader<VariantContext, LineIterator> reader = AbstractFeatureReader.getFeatureReader(inputFile.getAbsolutePath(), new VCFCodec(), false)){
-
-            log.info(reader.getClass().getSimpleName() + " hasIndex " + reader.hasIndex());
-            if (writer != null){
-                log.info(writer.getClass().getSimpleName());
-                writer.writeHeader((VCFHeader) reader.getHeader());
-            }
-
-            final ProgressLogger pl = new ProgressLogger(log, 1000000);
-            for (final VariantContext vc : reader.iterator()) {
-                if (writer != null){
-                    writer.add(vc);
-                }
-                pl.record(vc.getContig(), vc.getStart());
-            }
-        }
-
-        final long end = System.currentTimeMillis();
-        log.info(String.format("Done. Elapsed time %.3f seconds", (end - start) / 1000.0));
-    }
-
-    private static void printConfigurationInfo() throws IOException {
-        log.info("Executing as " +
-                System.getProperty("user.name") + '@' + InetAddress.getLocalHost().getHostName() +
-                " on " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") +
-                ' ' + System.getProperty("os.arch") + "; " + System.getProperty("java.vm.name") +
-                ' ' + System.getProperty("java.runtime.version"));
-
-        log.info(Defaults.allDefaults().entrySet().stream().map(e -> e.getKey() + ':' + e.getValue()).collect(Collectors.<String>joining(" ")));
-    }
-}
diff --git a/src/main/java/htsjdk/variant/utils/GeneralUtils.java b/src/main/java/htsjdk/variant/utils/GeneralUtils.java
deleted file mode 100644
index 56230ed..0000000
--- a/src/main/java/htsjdk/variant/utils/GeneralUtils.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.utils;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Constants and utility methods used throughout the VCF/BCF/VariantContext classes
- */
-public class GeneralUtils {
-
-    /**
-     * Setting this to true causes the VCF/BCF/VariantContext classes to emit debugging information
-     * to standard error
-     */
-    public static final boolean DEBUG_MODE_ENABLED = false;
-
-    /**
-     * The smallest log10 value we'll emit from normalizeFromLog10 and other functions
-     * where the real-space value is 0.0.
-     */
-    public final static double LOG10_P_OF_ZERO = -1000000.0;
-
-    /**
-     * Returns a string of the form elt1.toString() [sep elt2.toString() ... sep elt.toString()] for a collection of
-     * elti objects (note there's no actual space between sep and the elti elements).  Returns
-     * "" if collection is empty.  If collection contains just elt, then returns elt.toString()
-     *
-     * @param separator the string to use to separate objects
-     * @param objects a collection of objects.  the element order is defined by the iterator over objects
-     * @param <T> the type of the objects
-     * @return a non-null string
-     */
-    public static <T> String join(final String separator, final Collection<T> objects) {
-        if (objects.isEmpty()) { // fast path for empty collection
-            return "";
-        } else {
-            final Iterator<T> iter = objects.iterator();
-            final T first = iter.next();
-
-            if ( ! iter.hasNext() ) // fast path for singleton collections
-                return first.toString();
-            else { // full path for 2+ collection that actually need a join
-                final StringBuilder ret = new StringBuilder(first.toString());
-                while(iter.hasNext()) {
-                    ret.append(separator);
-                    ret.append(iter.next().toString());
-                }
-                return ret.toString();
-            }
-        }
-    }
-
-    /**
-     * normalizes the log10-based array.  ASSUMES THAT ALL ARRAY ENTRIES ARE <= 0 (<= 1 IN REAL-SPACE).
-     *
-     * @param array the array to be normalized
-     * @return a newly allocated array corresponding the normalized values in array
-     */
-    public static double[] normalizeFromLog10(double[] array) {
-        return normalizeFromLog10(array, false);
-    }
-
-    /**
-     * normalizes the log10-based array.  ASSUMES THAT ALL ARRAY ENTRIES ARE <= 0 (<= 1 IN REAL-SPACE).
-     *
-     * @param array             the array to be normalized
-     * @param takeLog10OfOutput if true, the output will be transformed back into log10 units
-     * @return a newly allocated array corresponding the normalized values in array, maybe log10 transformed
-     */
-    public static double[] normalizeFromLog10(double[] array, boolean takeLog10OfOutput) {
-        return normalizeFromLog10(array, takeLog10OfOutput, false);
-    }
-
-    /**
-     * See #normalizeFromLog10 but with the additional option to use an approximation that keeps the calculation always in log-space
-     *
-     * @param array
-     * @param takeLog10OfOutput
-     * @param keepInLogSpace
-     *
-     * @return
-     */
-    public static double[] normalizeFromLog10(double[] array, boolean takeLog10OfOutput, boolean keepInLogSpace) {
-        // for precision purposes, we need to add (or really subtract, since they're
-        // all negative) the largest value; also, we need to convert to normal-space.
-        double maxValue = arrayMax(array);
-
-        // we may decide to just normalize in log space without converting to linear space
-        if (keepInLogSpace) {
-            for (int i = 0; i < array.length; i++) {
-                array[i] -= maxValue;
-            }
-            return array;
-        }
-
-        // default case: go to linear space
-        double[] normalized = new double[array.length];
-
-        for (int i = 0; i < array.length; i++)
-            normalized[i] = Math.pow(10, array[i] - maxValue);
-
-        // normalize
-        double sum = 0.0;
-        for (int i = 0; i < array.length; i++)
-            sum += normalized[i];
-        for (int i = 0; i < array.length; i++) {
-            double x = normalized[i] / sum;
-            if (takeLog10OfOutput) {
-                x = Math.log10(x);
-                if ( x < LOG10_P_OF_ZERO || Double.isInfinite(x) )
-                    x = array[i] - maxValue;
-            }
-
-            normalized[i] = x;
-        }
-
-        return normalized;
-    }
-
-    public static double arrayMax(final double[] array) {
-        return array[maxElementIndex(array, array.length)];
-    }
-
-    public static int maxElementIndex(final double[] array) {
-        return maxElementIndex(array, array.length);
-    }
-
-    public static int maxElementIndex(final double[] array, final int endIndex) {
-        if (array == null || array.length == 0)
-            throw new IllegalArgumentException("Array cannot be null!");
-
-        int maxI = 0;
-        for (int i = 1; i < endIndex; i++) {
-            if (array[i] > array[maxI])
-                maxI = i;
-        }
-
-        return maxI;
-    }
-
-    public static <T> List<T> cons(final T elt, final List<T> l) {
-        List<T> l2 = new ArrayList<T>();
-        l2.add(elt);
-        if (l != null) l2.addAll(l);
-        return l2;
-    }
-
-    /**
-     * Make all combinations of N size of objects
-     *
-     * if objects = [A, B, C]
-     * if N = 1 => [[A], [B], [C]]
-     * if N = 2 => [[A, A], [B, A], [C, A], [A, B], [B, B], [C, B], [A, C], [B, C], [C, C]]
-     *
-     * @param objects
-     * @param n
-     * @param <T>
-     * @param withReplacement if false, the resulting permutations will only contain unique objects from objects
-     * @return
-     */
-    public static <T> List<List<T>> makePermutations(final List<T> objects, final int n, final boolean withReplacement) {
-        final List<List<T>> combinations = new ArrayList<List<T>>();
-
-        if ( n <= 0 )
-            ;
-        else if ( n == 1 ) {
-            for ( final T o : objects )
-                combinations.add(Collections.singletonList(o));
-        } else {
-            final List<List<T>> sub = makePermutations(objects, n - 1, withReplacement);
-            for ( List<T> subI : sub ) {
-                for ( final T a : objects ) {
-                    if ( withReplacement || ! subI.contains(a) )
-                        combinations.add(cons(a, subI));
-                }
-            }
-        }
-
-        return combinations;
-    }
-
-    /**
-     * Compares double values for equality (within 1e-6), or inequality.
-     *
-     * @param a the first double value
-     * @param b the second double value
-     * @return -1 if a is greater than b, 0 if a is equal to be within 1e-6, 1 if b is greater than a.
-     */
-    public static byte compareDoubles(double a, double b) {
-        return compareDoubles(a, b, 1e-6);
-    }
-
-    /**
-     * Compares double values for equality (within epsilon), or inequality.
-     *
-     * @param a       the first double value
-     * @param b       the second double value
-     * @param epsilon the precision within which two double values will be considered equal
-     * @return -1 if a is greater than b, 0 if a is equal to be within epsilon, 1 if b is greater than a.
-     */
-    public static byte compareDoubles(double a, double b, double epsilon) {
-        if (Math.abs(a - b) < epsilon) {
-            return 0;
-        }
-        if (a > b) {
-            return -1;
-        }
-        return 1;
-    }
-
-    static public final <T> List<T> reverse(final List<T> l) {
-        final List<T> newL = new ArrayList<T>(l);
-        Collections.reverse(newL);
-        return newL;
-    }
-}
-
-
diff --git a/src/main/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractor.java b/src/main/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractor.java
deleted file mode 100644
index 8de9d4e..0000000
--- a/src/main/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractor.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.utils;
-
-import htsjdk.samtools.BamFileIoUtils;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMTextHeaderCodec;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.reference.ReferenceSequenceFileFactory;
-import htsjdk.samtools.util.BufferedLineReader;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.CollectionUtil;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.IntervalList;
-import htsjdk.variant.vcf.VCFFileReader;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.util.Arrays;
-import java.util.Collection;
-
-/**
- * Tiny class for automatically loading a SAMSequenceDictionary given a file
- * @author farjoun on 2/25/2014
- */
-public class SAMSequenceDictionaryExtractor {
-
-    enum TYPE {
-        FASTA(ReferenceSequenceFileFactory.FASTA_EXTENSIONS) {
-            @Override
-            SAMSequenceDictionary extractDictionary(final File reference) {
-                final SAMSequenceDictionary dict = ReferenceSequenceFileFactory.getReferenceSequenceFile(reference).getSequenceDictionary();
-                if (dict == null)
-                    throw new SAMException("Could not find dictionary next to reference file " + reference.getAbsoluteFile());
-                return dict;
-            }
-        },
-        DICTIONARY(IOUtil.DICT_FILE_EXTENSION) {
-            @Override
-            SAMSequenceDictionary extractDictionary(final File dictionary) {
-                BufferedLineReader bufferedLineReader = null;
-                try {
-                    bufferedLineReader = new BufferedLineReader(new FileInputStream(dictionary));
-                    final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
-                    final SAMFileHeader header = codec.decode(bufferedLineReader, dictionary.toString());
-                    return header.getSequenceDictionary();
-                } catch (final FileNotFoundException e) {
-                    throw new SAMException("Could not open sequence dictionary file: " + dictionary, e);
-                } finally {
-                    CloserUtil.close(bufferedLineReader);
-                }
-            }
-        },
-        SAM(IOUtil.SAM_FILE_EXTENSION, BamFileIoUtils.BAM_FILE_EXTENSION) {
-            @Override
-            SAMSequenceDictionary extractDictionary(final File sam) {
-                return SamReaderFactory.makeDefault().getFileHeader(sam).getSequenceDictionary();
-            }
-        },
-        VCF(IOUtil.VCF_EXTENSIONS) {
-            @Override
-            SAMSequenceDictionary extractDictionary(final File vcf) {
-                VCFFileReader vcfFileReader = null;
-                try {
-                    vcfFileReader = new VCFFileReader(vcf, false);
-                    return vcfFileReader.getFileHeader().getSequenceDictionary();
-                } finally {
-                    CloserUtil.close(vcfFileReader);
-                }
-            }
-        },
-        INTERVAL_LIST(IOUtil.INTERVAL_LIST_FILE_EXTENSION) {
-            @Override
-            SAMSequenceDictionary extractDictionary(final File intervalList) {
-                return IntervalList.fromFile(intervalList).getHeader().getSequenceDictionary();
-            }
-        };
-
-        final Collection<String> applicableExtensions;
-
-        TYPE(final String... s) {
-            applicableExtensions = CollectionUtil.makeSet(s);
-        }
-
-        TYPE(final Collection<String> extensions) {
-            applicableExtensions = extensions;
-        }
-
-        abstract SAMSequenceDictionary extractDictionary(final File file);
-
-        static TYPE forFile(final File dictionaryExtractable) {
-            for (final TYPE type : TYPE.values()) {
-                for (final String s : type.applicableExtensions) {
-                    if (dictionaryExtractable.getName().endsWith(s)) {
-                        return type;
-                    }
-                }
-            }
-            throw new SAMException("Cannot figure out type of file " + dictionaryExtractable.getAbsolutePath() + " from extension. Current implementation understands the following types: " + Arrays.toString(TYPE.values()));
-        }
-
-        @Override
-        public String toString() {
-            return super.toString() + ": " + applicableExtensions.toString();
-        }
-    }
-
-    public static SAMSequenceDictionary extractDictionary(final File file) {
-        return TYPE.forFile(file).extractDictionary(file);
-    }
-
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/Allele.java b/src/main/java/htsjdk/variant/variantcontext/Allele.java
deleted file mode 100644
index 44fc6aa..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/Allele.java
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.samtools.util.StringUtil;
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collection;
-
-/**
- * Immutable representation of an allele.
- *<p>
- * Types of alleles:
- *</p>
- *<pre>
- Ref: a t C g a // C is the reference base
-    : a t G g a // C base is a G in some individuals
-    : a t - g a // C base is deleted w.r.t. the reference
-    : a t CAg a // A base is inserted w.r.t. the reference sequence
- </pre>
- *<p> In these cases, where are the alleles?</p>
- *<ul>
- * <li>SNP polymorphism of C/G  -> { C , G } -> C is the reference allele</li>
- * <li>1 base deletion of C     -> { tC , t } -> C is the reference allele and we include the preceding reference base (null alleles are not allowed)</li>
- * <li>1 base insertion of A    -> { C ; CA } -> C is the reference allele (because null alleles are not allowed)</li>
- *</ul>
- *<p>
- * Suppose I see a the following in the population:
- *</p>
- *<pre>
- Ref: a t C g a // C is the reference base
-    : a t G g a // C base is a G in some individuals
-    : a t - g a // C base is deleted w.r.t. the reference
- </pre>
- * <p>
- * How do I represent this?  There are three segregating alleles:
- * </p>
- *<blockquote>
- *  { C , G , - }
- *</blockquote>
- *<p>and these are represented as:</p>
- *<blockquote>
- *  { tC, tG, t }
- *</blockquote>
- *<p>
- * Now suppose I have this more complex example:
- </p>
- <pre>
- Ref: a t C g a // C is the reference base
-    : a t - g a
-    : a t - - a
-    : a t CAg a
- </pre>
- * <p>
- * There are actually four segregating alleles:
- * </p>
- *<blockquote>
- *   { Cg , -g, --, and CAg } over bases 2-4
- *</blockquote>
- *<p>   represented as:</p>
- *<blockquote>
- *   { tCg, tg, t, tCAg }
- *</blockquote>
- *<p>
- * Critically, it should be possible to apply an allele to a reference sequence to create the
- * correct haplotype sequence:</p>
- *<blockquote>
- * Allele + reference => haplotype
- *</blockquote>
- *<p>
- * For convenience, we are going to create Alleles where the GenomeLoc of the allele is stored outside of the
- * Allele object itself.  So there's an idea of an A/C polymorphism independent of it's surrounding context.
- *
- * Given list of alleles it's possible to determine the "type" of the variation
- </p>
- <pre>
-      A / C @ loc => SNP
-      - / A => INDEL
- </pre>
- * <p>
- * If you know where allele is the reference, you can determine whether the variant is an insertion or deletion.
- * </p>
- * <p>
- * Alelle also supports is concept of a NO_CALL allele.  This Allele represents a haplotype that couldn't be
- * determined. This is usually represented by a '.' allele.
- * </p>
- * <p>
- * Note that Alleles store all bases as bytes, in **UPPER CASE**.  So 'atc' == 'ATC' from the perspective of an
- * Allele.
- * </p>
- * @author ebanks, depristo
- */
-public class Allele implements Comparable<Allele>, Serializable {
-    public static final long serialVersionUID = 1L;
-
-    private static final byte[] EMPTY_ALLELE_BASES = new byte[0];
-
-    private boolean isRef = false;
-    private boolean isNoCall = false;
-    private boolean isSymbolic = false;
-
-    private byte[] bases = null;
-
-    /** A generic static NO_CALL allele for use */
-    public final static String NO_CALL_STRING = ".";
-
-    /** A generic static SPAN_DEL allele for use */
-    public final static String SPAN_DEL_STRING = "*";
-
-    // no public way to create an allele
-    protected Allele(final byte[] bases, final boolean isRef) {
-        // null alleles are no longer allowed
-        if ( wouldBeNullAllele(bases) ) {
-            throw new IllegalArgumentException("Null alleles are not supported");
-        }
-
-        // no-calls are represented as no bases
-        if ( wouldBeNoCallAllele(bases) ) {
-            this.bases = EMPTY_ALLELE_BASES;
-            isNoCall = true;
-            if ( isRef ) throw new IllegalArgumentException("Cannot tag a NoCall allele as the reference allele");
-            return;
-        }
-
-        if ( wouldBeSymbolicAllele(bases) ) {
-            isSymbolic = true;
-            if ( isRef ) throw new IllegalArgumentException("Cannot tag a symbolic allele as the reference allele");
-        }
-        else {
-            StringUtil.toUpperCase(bases);
-        }
-
-        this.isRef = isRef;
-        this.bases = bases;
-
-        if ( ! acceptableAlleleBases(bases, isRef) )
-            throw new IllegalArgumentException("Unexpected base in allele bases \'" + new String(bases)+"\'");
-    }
-
-    protected Allele(final String bases, final boolean isRef) {
-        this(bases.getBytes(), isRef);
-    }
-
-    /**
-     * Creates a new allele based on the provided one.  Ref state will be copied unless ignoreRefState is true
-     * (in which case the returned allele will be non-Ref).
-     *
-     * This method is efficient because it can skip the validation of the bases (since the original allele was already validated)
-     *
-     * @param allele  the allele from which to copy the bases
-     * @param ignoreRefState  should we ignore the reference state of the input allele and use the default ref state?
-     */
-    protected Allele(final Allele allele, final boolean ignoreRefState) {
-        this.bases = allele.bases;
-        this.isRef = ignoreRefState ? false : allele.isRef;
-        this.isNoCall = allele.isNoCall;
-        this.isSymbolic = allele.isSymbolic;
-    }
-
-
-    private final static Allele REF_A = new Allele("A", true);
-    private final static Allele ALT_A = new Allele("A", false);
-    private final static Allele REF_C = new Allele("C", true);
-    private final static Allele ALT_C = new Allele("C", false);
-    private final static Allele REF_G = new Allele("G", true);
-    private final static Allele ALT_G = new Allele("G", false);
-    private final static Allele REF_T = new Allele("T", true);
-    private final static Allele ALT_T = new Allele("T", false);
-    private final static Allele REF_N = new Allele("N", true);
-    private final static Allele ALT_N = new Allele("N", false);
-    public final static Allele SPAN_DEL = new Allele(SPAN_DEL_STRING, false);
-    public final static Allele NO_CALL = new Allele(NO_CALL_STRING, false);
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // creation routines
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * Create a new Allele that includes bases and if tagged as the reference allele if isRef == true.  If bases
-     * == '-', a Null allele is created.  If bases ==  '.', a no call Allele is created. If bases ==  '*', a spanning deletions Allele is created.
-     *
-     * @param bases the DNA sequence of this variation, '-', '.', or '*'
-     * @param isRef should we make this a reference allele?
-     * @throws IllegalArgumentException if bases contains illegal characters or is otherwise malformated
-     */
-    public static Allele create(final byte[] bases, final boolean isRef) {
-        if ( bases == null )
-            throw new IllegalArgumentException("create: the Allele base string cannot be null; use new Allele() or new Allele(\"\") to create a Null allele");
-
-        if ( bases.length == 1 ) {
-            // optimization to return a static constant Allele for each single base object
-            switch (bases[0]) {
-                case '.':
-                    if ( isRef ) throw new IllegalArgumentException("Cannot tag a NoCall allele as the reference allele");
-                    return NO_CALL;
-                case '*':
-                    if ( isRef ) throw new IllegalArgumentException("Cannot tag a spanning deletions allele as the reference allele");
-                    return SPAN_DEL;
-                case 'A': case 'a' : return isRef ? REF_A : ALT_A;
-                case 'C': case 'c' : return isRef ? REF_C : ALT_C;
-                case 'G': case 'g' : return isRef ? REF_G : ALT_G;
-                case 'T': case 't' : return isRef ? REF_T : ALT_T;
-                case 'N': case 'n' : return isRef ? REF_N : ALT_N;
-                default: throw new IllegalArgumentException("Illegal base [" + (char)bases[0] + "] seen in the allele");
-            }
-        } else {
-            return new Allele(bases, isRef);
-        }
-    }
-
-    public static Allele create(final byte base, final boolean isRef) {
-        return create( new byte[]{ base }, isRef);
-    }
-
-    public static Allele create(final byte base) {
-        return create( base, false );
-    }
-
-    public static Allele extend(final Allele left, final byte[] right) {
-        if (left.isSymbolic())
-            throw new IllegalArgumentException("Cannot extend a symbolic allele");
-        byte[] bases = new byte[left.length() + right.length];
-        System.arraycopy(left.getBases(), 0, bases, 0, left.length());
-        System.arraycopy(right, 0, bases, left.length(), right.length);
-
-        return create(bases, left.isReference());
-    }
-
-    /**
-     * @param bases  bases representing an allele
-     * @return true if the bases represent the null allele
-     */
-    public static boolean wouldBeNullAllele(final byte[] bases) {
-        return (bases.length == 1 && bases[0] == htsjdk.variant.vcf.VCFConstants.NULL_ALLELE) || bases.length == 0;
-    }
-
-    /**
-     * @param bases bases representing an allele
-     * @return true if the bases represent the SPAN_DEL allele
-     */
-    public static boolean wouldBeStarAllele(final byte[] bases) {
-        return bases.length == 1 && bases[0] == htsjdk.variant.vcf.VCFConstants.SPANNING_DELETION_ALLELE;
-    }
-
-    /**
-     * @param bases  bases representing an allele
-     * @return true if the bases represent the NO_CALL allele
-     */
-    public static boolean wouldBeNoCallAllele(final byte[] bases) {
-        return bases.length == 1 && bases[0] == htsjdk.variant.vcf.VCFConstants.NO_CALL_ALLELE;
-    }
-
-    /**
-     * @param bases  bases representing an allele
-     * @return true if the bases represent a symbolic allele
-     */
-    public static boolean wouldBeSymbolicAllele(final byte[] bases) {
-    	if ( bases.length <= 1 )
-            return false;
-        else {
-            final String strBases = new String(bases);
-            return (bases[0] == '<' || bases[bases.length-1] == '>') || // symbolic or large insertion
-            		(bases[0] == '.' || bases[bases.length-1] == '.') || // single breakend
-                    (strBases.contains("[") || strBases.contains("]")); // mated breakend
-        }
-    }
-
-    /**
-     * @param bases  bases representing a reference allele
-     * @return true if the bases represent the well formatted allele
-     */
-    public static boolean acceptableAlleleBases(final String bases) {
-        return acceptableAlleleBases(bases.getBytes(), true);
-    }
-
-    /**
-     * @param bases bases representing an allele
-     * @param isReferenceAllele is a reference allele
-     * @return true if the bases represent the well formatted allele
-     */
-    public static boolean acceptableAlleleBases(final String bases, boolean isReferenceAllele) {
-        return acceptableAlleleBases(bases.getBytes(), isReferenceAllele);
-    }
-
-    /**
-     * @param bases  bases representing a reference allele
-     * @return true if the bases represent the well formatted allele
-     */
-    public static boolean acceptableAlleleBases(final byte[] bases) {
-        return acceptableAlleleBases(bases, true);
-    }
-
-    /**
-     *
-     * @param bases bases representing an allele
-     * @param isReferenceAllele true if a reference allele
-     * @return true if the bases represent the well formatted allele
-     */
-    public static boolean acceptableAlleleBases(final byte[] bases, final boolean isReferenceAllele) {
-        if ( wouldBeNullAllele(bases) )
-            return false;
-
-        if ( wouldBeNoCallAllele(bases) || wouldBeSymbolicAllele(bases) )
-            return true;
-
-        if ( wouldBeStarAllele(bases) )
-            return !isReferenceAllele;
-
-        for (byte base :  bases ) {
-            switch (base) {
-                case 'A': case 'C': case 'G': case 'T':  case 'a': case 'c': case 'g': case 't': case 'N' : case 'n' :
-                    break;
-                default:
-                    return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * @see #Allele(byte[], boolean)
-     *
-     * @param bases  bases representing an allele
-     * @param isRef  is this the reference allele?
-     */
-    public static Allele create(final String bases, final boolean isRef) {
-        return create(bases.getBytes(), isRef);
-    }
-
-
-    /**
-     * Creates a non-Ref allele.  @see Allele(byte[], boolean) for full information
-     *
-     * @param bases  bases representing an allele
-     */
-    public static Allele create(final String bases) {
-        return create(bases, false);
-    }
-
-    /**
-     * Creates a non-Ref allele.  @see Allele(byte[], boolean) for full information
-     *
-     * @param bases  bases representing an allele
-     */
-    public static Allele create(final byte[] bases) {
-        return create(bases, false);
-    }
-
-    /**
-     * Creates a new allele based on the provided one.  Ref state will be copied unless ignoreRefState is true
-     * (in which case the returned allele will be non-Ref).
-     *
-     * This method is efficient because it can skip the validation of the bases (since the original allele was already validated)
-     *
-     * @param allele  the allele from which to copy the bases
-     * @param ignoreRefState  should we ignore the reference state of the input allele and use the default ref state?
-     */
-    public static Allele create(final Allele allele, final boolean ignoreRefState) {
-        return new Allele(allele, ignoreRefState);
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // accessor routines
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    // Returns true if this is the NO_CALL allele
-    public boolean isNoCall()           { return isNoCall; }
-    // Returns true if this is not the NO_CALL allele
-    public boolean isCalled()           { return ! isNoCall(); }
-
-    // Returns true if this Allele is the reference allele
-    public boolean isReference()        { return isRef; }
-    // Returns true if this Allele is not the reference allele
-    public boolean isNonReference()     { return ! isReference(); }
-
-    // Returns true if this Allele is symbolic (i.e. no well-defined base sequence)
-    public boolean isSymbolic()         { return isSymbolic; }
-
-    // Returns a nice string representation of this object
-    public String toString() {
-        return ( isNoCall() ? NO_CALL_STRING : getDisplayString() ) + (isReference() ? "*" : "");
-    }
-
-    /**
-     * Return the DNA bases segregating in this allele.  Note this isn't reference polarized,
-     * so the Null allele is represented by a vector of length 0
-     *
-     * @return the segregating bases
-     */
-    public byte[] getBases() { return isSymbolic ? EMPTY_ALLELE_BASES : bases; }
-
-    /**
-     * Return the DNA bases segregating in this allele in String format.
-     * This is useful, because toString() adds a '*' to reference alleles and getBases() returns garbage when you call toString() on it.
-     *
-     * @return the segregating bases
-     */
-    public String getBaseString() { return isNoCall() ? NO_CALL_STRING : new String(getBases()); }
-
-    /**
-     * Return the printed representation of this allele.
-     * Same as getBaseString(), except for symbolic alleles.
-     * For symbolic alleles, the base string is empty while the display string contains <TAG>.
-     *
-     * @return the allele string representation
-     */
-    public String getDisplayString() { return new String(bases); }
-
-    /**
-     * Same as #getDisplayString() but returns the result as byte[].
-     *
-     * Slightly faster then getDisplayString()
-     *
-     * @return the allele string representation
-     */
-    public byte[] getDisplayBases() { return bases; }
-
-    /**
-     * @param other  the other allele
-     *
-     * @return true if these alleles are equal
-     */
-    public boolean equals(Object other) {
-        return ( ! (other instanceof Allele) ? false : equals((Allele)other, false) );
-    }
-
-    /**
-     * @return hash code
-     */
-    public int hashCode() {
-        int hash = 1;
-        for (int i = 0; i < bases.length; i++)
-            hash += (i+1) * bases[i];
-        return hash;
-    }
-
-    /**
-     * Returns true if this and other are equal.  If ignoreRefState is true, then doesn't require both alleles has the
-     * same ref tag
-     *
-     * @param other            allele to compare to
-     * @param ignoreRefState   if true, ignore ref state in comparison
-     * @return true if this and other are equal
-     */
-    public boolean equals(final Allele other, final boolean ignoreRefState) {
-        return this == other || (isRef == other.isRef || ignoreRefState) && isNoCall == other.isNoCall && (bases == other.bases || Arrays.equals(bases, other.bases));
-    }
-
-    /**
-     * @param test  bases to test against
-     *
-     * @return  true if this Allele contains the same bases as test, regardless of its reference status; handles Null and NO_CALL alleles
-     */
-    public boolean basesMatch(final byte[] test) { return !isSymbolic && (bases == test || Arrays.equals(bases, test)); }
-
-    /**
-     * @param test  bases to test against
-     *
-     * @return  true if this Allele contains the same bases as test, regardless of its reference status; handles Null and NO_CALL alleles
-     */
-    public boolean basesMatch(final String test) { return basesMatch(test.toUpperCase().getBytes()); }
-
-    /**
-     * @param test  allele to test against
-     *
-     * @return  true if this Allele contains the same bases as test, regardless of its reference status; handles Null and NO_CALL alleles
-     */
-    public boolean basesMatch(final Allele test) { return basesMatch(test.getBases()); }
-
-    /**
-     * @return the length of this allele.  Null and NO_CALL alleles have 0 length.
-     */
-    public int length() {
-        return isSymbolic ? 0 : bases.length;
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // useful static functions
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    public static Allele getMatchingAllele(final Collection<Allele> allAlleles, final byte[] alleleBases) {
-        for ( Allele a : allAlleles ) {
-            if ( a.basesMatch(alleleBases) ) {
-                return a;
-            }
-        }
-
-        if ( wouldBeNoCallAllele(alleleBases) )
-            return NO_CALL;
-        else
-            return null;    // couldn't find anything
-    }
-
-    public int compareTo(final Allele other) {
-        if ( isReference() && other.isNonReference() )
-            return -1;
-        else if ( isNonReference() && other.isReference() ) 
-            return 1;
-        else
-            return getBaseString().compareTo(other.getBaseString()); // todo -- potential performance issue
-    }
-
-    public static boolean oneIsPrefixOfOther(final Allele a1, final Allele a2) {
-        if ( a2.length() >= a1.length() )
-            return firstIsPrefixOfSecond(a1, a2);
-        else
-            return firstIsPrefixOfSecond(a2, a1);
-    }
-
-    private static boolean firstIsPrefixOfSecond(final Allele a1, final Allele a2) {
-        String a1String = a1.getBaseString();
-        return a2.getBaseString().substring(0, a1String.length()).equals(a1String);
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/CommonInfo.java b/src/main/java/htsjdk/variant/variantcontext/CommonInfo.java
deleted file mode 100644
index e2f9083..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/CommonInfo.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-
-/**
- * Common utility routines for VariantContext and Genotype
- *
- * @author depristo
- */
-public final class CommonInfo implements Serializable {
-    public static final long serialVersionUID = 1L;
-
-    public static final double NO_LOG10_PERROR = 1.0;
-
-    private static Set<String> NO_FILTERS = Collections.emptySet();
-    private static Map<String, Object> NO_ATTRIBUTES = Collections.unmodifiableMap(new HashMap<String, Object>());
-
-    private double log10PError = NO_LOG10_PERROR;
-    private String name = null;
-    private Set<String> filters = null;
-    private Map<String, Object> attributes = NO_ATTRIBUTES;
-
-    public CommonInfo(String name, double log10PError, Set<String> filters, Map<String, Object> attributes) {
-        this.name = name;
-        setLog10PError(log10PError);
-        this.filters = filters;
-        if ( attributes != null && ! attributes.isEmpty() ) {
-            this.attributes = attributes;
-        }
-    }
-
-    /**
-     * @return the name
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Sets the name
-     *
-     * @param name    the name associated with this information
-     */
-    public void setName(String name) {
-        if ( name == null ) throw new IllegalArgumentException("Name cannot be null " + this);
-        this.name = name;
-    }
-
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // Filter
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    public Set<String> getFiltersMaybeNull() {
-        return filters;
-    }
-
-    public Set<String> getFilters() {
-        return filters == null ? NO_FILTERS : Collections.unmodifiableSet(filters);
-    }
-
-    public boolean filtersWereApplied() {
-        return filters != null;
-    }
-
-    public boolean isFiltered() {
-        return filters == null ? false : !filters.isEmpty();
-    }
-
-    public boolean isNotFiltered() {
-        return ! isFiltered();
-    }
-
-    public void addFilter(String filter) {
-        if ( filters == null ) // immutable -> mutable
-            filters = new HashSet<String>();
-
-        if ( filter == null ) throw new IllegalArgumentException("BUG: Attempting to add null filter " + this);
-        if ( getFilters().contains(filter) ) throw new IllegalArgumentException("BUG: Attempting to add duplicate filter " + filter + " at " + this);
-        filters.add(filter);
-    }
-
-    public void addFilters(Collection<String> filters) {
-        if ( filters == null ) throw new IllegalArgumentException("BUG: Attempting to add null filters at" + this);
-        for ( String f : filters )
-            addFilter(f);
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // Working with log error rates
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    public boolean hasLog10PError() {
-        return getLog10PError() != NO_LOG10_PERROR;
-    }
-
-    /**
-     * @return the -1 * log10-based error estimate
-     */
-    public double getLog10PError() { return log10PError; }
-
-    /**
-     * Floating-point arithmetic allows signed zeros such as +0.0 and -0.0.
-     * Adding the constant 0.0 to the result ensures that the returned value is never -0.0
-     * since (-0.0) + 0.0 = 0.0.
-     *
-     * When this is set to '0.0', the resulting VCF would be 0 instead of -0.
-     *
-     * @return double - Phred scaled quality score
-     */
-    public double getPhredScaledQual() { return (getLog10PError() * -10) + 0.0; }
-
-    public void setLog10PError(double log10PError) {
-        if ( log10PError > 0 && log10PError != NO_LOG10_PERROR)
-            throw new IllegalArgumentException("BUG: log10PError cannot be > 0 : " + this.log10PError);
-        if ( Double.isInfinite(this.log10PError) )
-            throw new IllegalArgumentException("BUG: log10PError should not be Infinity");
-        if ( Double.isNaN(this.log10PError) )
-            throw new IllegalArgumentException("BUG: log10PError should not be NaN");
-        this.log10PError = log10PError;
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // Working with attributes
-    //
-    // ---------------------------------------------------------------------------------------------------------
-    public void clearAttributes() {
-        attributes = new HashMap<String, Object>();
-    }
-
-    /**
-     * @return the attribute map
-     */
-    public Map<String, Object> getAttributes() {
-        return Collections.unmodifiableMap(attributes);
-    }
-
-    // todo -- define common attributes as enum
-
-    public void setAttributes(Map<String, ?> map) {
-        clearAttributes();
-        putAttributes(map);
-    }
-
-    public void putAttribute(String key, Object value) {
-        putAttribute(key, value, false);
-    }
-
-    public void putAttribute(String key, Object value, boolean allowOverwrites) {
-        if ( ! allowOverwrites && hasAttribute(key) )
-            throw new IllegalStateException("Attempting to overwrite key->value binding: key = " + key + " this = " + this);
-
-        if ( attributes == NO_ATTRIBUTES ) // immutable -> mutable
-            attributes = new HashMap<String, Object>();
-
-        attributes.put(key, value);
-    }
-
-    public void removeAttribute(String key) {
-        if ( attributes == NO_ATTRIBUTES ) // immutable -> mutable
-            attributes = new HashMap<String, Object>();
-        attributes.remove(key);
-    }
-
-    public void putAttributes(Map<String, ?> map) {
-        if ( map != null ) {
-            // for efficiency, we can skip the validation if the map is empty
-            if (attributes.isEmpty()) {
-                if ( attributes == NO_ATTRIBUTES ) // immutable -> mutable
-                    attributes = new HashMap<String, Object>();
-                attributes.putAll(map);
-            } else {
-                for ( Map.Entry<String, ?> elt : map.entrySet() ) {
-                    putAttribute(elt.getKey(), elt.getValue(), false);
-                }
-            }
-        }
-    }
-
-    public boolean hasAttribute(String key) {
-        return attributes.containsKey(key);
-    }
-
-    public int getNumAttributes() {
-        return attributes.size();
-    }
-
-    /**
-     * @param key    the attribute key
-     *
-     * @return the attribute value for the given key (or null if not set)
-     */
-    public Object getAttribute(String key) {
-        return attributes.get(key);
-    }
-
-    public Object getAttribute(String key, Object defaultValue) {
-        if ( hasAttribute(key) )
-            return attributes.get(key);
-        else
-            return defaultValue;
-    }
-
-    /**
-     * Gets the attributes from a key as a list.
-     *
-     * Note: int[] and double[] arrays are boxed.
-     *
-     * @return empty list if the key was not found; {@link Collections#singletonList(Object)} if
-     * there is only one value; a list containing the values if the value is a {@link List} or array.
-     */
-    @SuppressWarnings("unchecked")
-    public List<Object> getAttributeAsList(String key) {
-        Object o = getAttribute(key);
-        if ( o == null ) return Collections.emptyList();
-        if ( o instanceof List ) return (List<Object>)o;
-        if ( o.getClass().isArray() ) {
-            if (o instanceof int[]) {
-                return Arrays.stream((int[])o).boxed().collect(Collectors.toList());
-            } else if (o instanceof double[]) {
-                return Arrays.stream((double[])o).boxed().collect(Collectors.toList());
-            }
-            return Arrays.asList((Object[])o);
-        }
-        return Collections.singletonList(o);
-    }
-
-    private <T> List<T> getAttributeAsList(String key, Function<Object, T> transformer) {
-        return getAttributeAsList(key).stream().map(transformer).collect(Collectors.toList());
-    }
-
-    public List<String> getAttributeAsStringList(String key, String defaultValue) {
-        return getAttributeAsList(key, x -> (x == null) ? defaultValue : String.valueOf(x));
-    }
-
-    public List<Integer> getAttributeAsIntList(String key, Integer defaultValue) {
-        return getAttributeAsList(key, x -> {
-            if (x == null || x == VCFConstants.MISSING_VALUE_v4) {
-                return defaultValue;
-            } else if (x instanceof Number) {
-                return ((Number) x).intValue();
-            } else {
-                return Integer.valueOf((String)x); // throws an exception if this isn't a string
-            }
-        });
-    }
-
-    public List<Double> getAttributeAsDoubleList(String key, Double defaultValue) {
-        return getAttributeAsList(key, x -> {
-            if (x == null || x == VCFConstants.MISSING_VALUE_v4) {
-                return defaultValue;
-            } else if (x instanceof Number) {
-                return ((Number) x).doubleValue();
-            } else {
-                return Double.valueOf((String)x); // throws an exception if this isn't a string
-            }
-        });
-    }
-
-    public String getAttributeAsString(String key, String defaultValue) {
-        Object x = getAttribute(key);
-        if ( x == null ) return defaultValue;
-        if ( x instanceof String ) return (String)x;
-        return String.valueOf(x); // throws an exception if this isn't a string
-    }
-
-    public int getAttributeAsInt(String key, int defaultValue) {
-        Object x = getAttribute(key);
-        if ( x == null || x == VCFConstants.MISSING_VALUE_v4 ) return defaultValue;
-        if ( x instanceof Integer ) return (Integer)x;
-        return Integer.valueOf((String)x); // throws an exception if this isn't a string
-    }
-
-    public double getAttributeAsDouble(String key, double defaultValue) {
-        Object x = getAttribute(key);
-        if ( x == null ) return defaultValue;
-        if ( x instanceof Double ) return (Double)x;
-        if ( x instanceof Integer ) return (Integer)x;
-        return Double.valueOf((String)x); // throws an exception if this isn't a string
-    }
-
-    public boolean getAttributeAsBoolean(String key, boolean defaultValue) {
-        Object x = getAttribute(key);
-        if ( x == null ) return defaultValue;
-        if ( x instanceof Boolean ) return (Boolean)x;
-        return Boolean.valueOf((String)x); // throws an exception if this isn't a string
-    }
-
-//    public String getAttributeAsString(String key)      { return (String.valueOf(getExtendedAttribute(key))); } // **NOTE**: will turn a null Object into the String "null"
-//    public int getAttributeAsInt(String key)            { Object x = getExtendedAttribute(key); return x instanceof Integer ? (Integer)x : Integer.valueOf((String)x); }
-//    public double getAttributeAsDouble(String key)      { Object x = getExtendedAttribute(key); return x instanceof Double ? (Double)x : Double.valueOf((String)x); }
-//    public boolean getAttributeAsBoolean(String key)      { Object x = getExtendedAttribute(key); return x instanceof Boolean ? (Boolean)x : Boolean.valueOf((String)x); }
-//    public Integer getAttributeAsIntegerNoException(String key)  { try {return getAttributeAsInt(key);} catch (Exception e) {return null;} }
-//    public Double getAttributeAsDoubleNoException(String key)    { try {return getAttributeAsDouble(key);} catch (Exception e) {return null;} }
-//    public String getAttributeAsStringNoException(String key)    { if (getExtendedAttribute(key) == null) return null; return getAttributeAsString(key); }
-//    public Boolean getAttributeAsBooleanNoException(String key)  { try {return getAttributeAsBoolean(key);} catch (Exception e) {return null;} }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/FastGenotype.java b/src/main/java/htsjdk/variant/variantcontext/FastGenotype.java
deleted file mode 100644
index 665e672..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/FastGenotype.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * This class encompasses all the basic information about a genotype.
- *
- * For the sake of performance, it does not make a copy of the Collections/arrays it's constructed from, and so
- * subsequent changes to those Collections/arrays will be reflected in the FastGenotype object
- *
- * A genotype has several key fields
- *
- * <ul>
- * <li> a sample name, must be a non-null string</li>
- * <li> an ordered list of alleles, intrepreted as the genotype of the sample,
- *    each allele for each chromosome given in order.  If alleles = [a*, t]
- *    then the sample is a/t, with a (the reference from the *) the first
- *    chromosome and t on the second chromosome</li>
- * <li> an <code>isPhased</code> marker indicating where the alleles are phased with respect to some global
- *    coordinate system.  See VCF4.1 spec for a detailed discussion</li>
- * <li> Inline, optimized <code>int</code>s and <code>int[]</code> values for:
- * <ul>
- *      <li> GQ: the phred-scaled genotype quality, or <code>-1</code> if it's missing</li>
- *      <li> DP: the count of reads at this locus for this sample, or <code>-1</code> if missing</li>
- *      <li> AD: an array of counts of reads at this locus, one for each Allele at the site,
- *             that is, for each allele in the surrounding <code>VariantContext</code>.  <code>null</code> if missing.</li>
- *      <li> PL: phred-scaled genotype likelihoods in standard VCF4.1 order for
- *             all combinations of the alleles in the surrounding <code>VariantContext</code>, given
- *             the ploidy of the sample (from the alleles vector).  <code>null</code> if missing.</li>
- * </ul>
- * </li>
- *
- * <li> A general map from String keys to -> Object values for all other attributes in
- *    this genotype.  Note that this map should not contain duplicate values for the
- *    standard bindings for GQ, DP, AD, and PL.  Genotype filters can be put into
- *    this genotype, but it isn't respected by the GATK in analyses</li>
- *</ul>
- *
- * <p>The only way to build a <code>Genotype</code> object is with a <code>GenotypeBuilder</code>, which permits values
- * to be set in any order, which means that <code>GenotypeBuilder</code> may at some in the chain of
- * sets pass through invalid states that are not permitted in a fully formed immutable
- * <code>Genotype</code>.</p>
- *
- * <p>Note this is a simplified, refactored Genotype object based on the original
- * generic (and slow) implementation from the original VariantContext + Genotype
- * codebase.</p>
- *
- * @author Mark DePristo
- * @since 05/12
- */
-public final class FastGenotype extends Genotype {
-    private final List<Allele> alleles;
-    private final boolean isPhased;
-    private final int GQ;
-    private final int DP;
-    private final int[] AD;
-    private final int[] PL;
-    private final Map<String, Object> extendedAttributes;
-
-    /**
-     * The only way to make one of these, for use by GenotypeBuilder only
-     *
-     * @param sampleName
-     * @param alleles
-     * @param isPhased
-     * @param GQ
-     * @param DP
-     * @param AD
-     * @param PL
-     * @param extendedAttributes
-     */
-    protected FastGenotype(final String sampleName,
-                           final List<Allele> alleles,
-                           final boolean isPhased,
-                           final int GQ,
-                           final int DP,
-                           final int[] AD,
-                           final int[] PL,
-                           final String filters,
-                           final Map<String, Object> extendedAttributes) {
-        super(sampleName, filters);
-        this.alleles = alleles;
-        this.isPhased = isPhased;
-        this.GQ = GQ;
-        this.DP = DP;
-        this.AD = AD;
-        this.PL = PL;
-        this.extendedAttributes = extendedAttributes;
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // Implmenting the abstract methods
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    @Override public List<Allele> getAlleles() {
-        return alleles;
-    }
-
-    @Override public Allele getAllele(int i) {
-        return alleles.get(i);
-    }
-
-    @Override public boolean isPhased() {
-        return isPhased;
-    }
-
-    @Override public int getDP() {
-        return DP;
-    }
-
-    @Override public int[] getAD() {
-        return AD;
-    }
-
-    @Override public int getGQ()  {
-        return GQ;
-    }
-
-    @Override public int[] getPL() {
-        return PL;
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    // 
-    // get routines for extended attributes
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    public Map<String, Object> getExtendedAttributes() {
-        return extendedAttributes;
-    }
-
-    /**
-     * Is values a valid AD or PL field
-     * @param values
-     * @return
-     */
-    private static boolean validADorPLField(final int[] values) {
-        if ( values != null )
-            for ( int v : values )
-                if ( v < 0 )
-                    return false;
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/variantcontext/Genotype.java b/src/main/java/htsjdk/variant/variantcontext/Genotype.java
deleted file mode 100644
index 8d781a0..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/Genotype.java
+++ /dev/null
@@ -1,670 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-
-/**
- * This class encompasses all the basic information about a genotype.  It is immutable.
- *
- * @author Mark DePristo
- */
-public abstract class Genotype implements Comparable<Genotype>, Serializable {
-    public static final long serialVersionUID = 1L;
-
-    /**
-     * A list of genotype field keys corresponding to values we
-     * manage inline in the Genotype object.  They must not appear in the
-     * extended attributes map
-     */
-    public final static Collection<String> PRIMARY_KEYS = Arrays.asList(
-            VCFConstants.GENOTYPE_FILTER_KEY,
-            VCFConstants.GENOTYPE_KEY,
-            VCFConstants.GENOTYPE_QUALITY_KEY,
-            VCFConstants.DEPTH_KEY,
-            VCFConstants.GENOTYPE_ALLELE_DEPTHS,
-            VCFConstants.GENOTYPE_PL_KEY);
-
-    public final static String PHASED_ALLELE_SEPARATOR = "|";
-    public final static String UNPHASED_ALLELE_SEPARATOR = "/";
-
-    private final String sampleName;
-    private GenotypeType type = null;
-    private final String filters;
-
-    protected Genotype(final String sampleName, final String filters) {
-        this.sampleName = sampleName;
-        this.filters = filters == null || filters.isEmpty() ? null : filters;
-    }
-
-    /**
-     * @return the alleles for this genotype.  Cannot be null.  May be empty
-     */
-    public abstract List<Allele> getAlleles();
-
-    /**
-     * Returns how many times allele appears in this genotype object?
-     *
-     * @param allele
-     * @return a value >= 0 indicating how many times the allele occurred in this sample's genotype
-     */
-    public int countAllele(final Allele allele) {
-        int c = 0;
-        for ( final Allele a : getAlleles() )
-            if ( a.equals(allele) )
-                c++;
-
-        return c;
-    }
-
-    /**
-     * Get the ith allele in this genotype
-     *
-     * @param i the ith allele, must be < the ploidy, starting with 0
-     * @return the allele at position i, which cannot be null
-     */
-    public abstract Allele getAllele(int i);
-
-    /**
-     * Are the alleles phased w.r.t. the global phasing system?
-     *
-     * @return true if yes
-     */
-    public abstract boolean isPhased();
-
-    /**
-     * What is the ploidy of this sample?
-     *
-     * @return the ploidy of this genotype.  0 if the site is no-called.
-     */
-    public int getPloidy() {
-        return getAlleles().size();
-    }
-
-    /**
-     * @return the sequencing depth of this sample, or -1 if this value is missing
-     */
-    public abstract int getDP();
-
-    /**
-     * @return the count of reads, one for each allele in the surrounding Variant context,
-     *      matching the corresponding allele, or null if this value is missing.  MUST
-     *      NOT BE MODIFIED!
-     */
-    public abstract int[] getAD();
-
-    /**
-     * Returns the name associated with this sample.
-     *
-     * @return a non-null String
-     */
-    public String getSampleName() {
-        return sampleName;
-    }
-
-    /**
-     * Returns a phred-scaled quality score, or -1 if none is available
-     * @return
-     */
-    public abstract int getGQ();
-
-    /**
-     * Does the PL field have a value?
-     * @return true if there's a PL field value
-     */
-    public boolean hasPL() {
-        return getPL() != null;
-    }
-
-    /**
-     * Does the AD field have a value?
-     * @return true if there's a AD field value
-     */
-    public boolean hasAD() {
-        return getAD() != null;
-    }
-
-    /**
-     * Does the GQ field have a value?
-     * @return true if there's a GQ field value
-     */
-    public boolean hasGQ() {
-        return getGQ() != -1;
-    }
-
-    /**
-     * Does the DP field have a value?
-     * @return true if there's a DP field value
-     */
-    public boolean hasDP() {
-        return getDP() != -1;
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // The type of this genotype
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * @return the high-level type of this sample's genotype
-     */
-    public GenotypeType getType() {
-        if ( type == null ) {
-            type = determineType();
-        }
-        return type;
-    }
-
-    /**
-     * Internal code to determine the type of the genotype from the alleles vector
-     * @return the type
-     */
-    protected GenotypeType determineType() {
-        // TODO -- this code is slow and could be optimized for the diploid case
-        final List<Allele> alleles = getAlleles();
-        if ( alleles.isEmpty() )
-            return GenotypeType.UNAVAILABLE;
-
-        boolean sawNoCall = false, sawMultipleAlleles = false;
-        Allele observedAllele = null;
-
-        for ( final Allele allele : alleles ) {
-            if ( allele.isNoCall() )
-                sawNoCall = true;
-            else if ( observedAllele == null )
-                observedAllele = allele;
-            else if ( !allele.equals(observedAllele) )
-                sawMultipleAlleles = true;
-        }
-
-        if ( sawNoCall ) {
-            if ( observedAllele == null )
-                return GenotypeType.NO_CALL;
-            return GenotypeType.MIXED;
-        }
-
-        if ( observedAllele == null )
-            throw new IllegalStateException("BUG: there are no alleles present in this genotype but the alleles list is not null");
-
-        return sawMultipleAlleles ? GenotypeType.HET : observedAllele.isReference() ? GenotypeType.HOM_REF : GenotypeType.HOM_VAR;
-    }
-
-    /**
-     * @return true if all observed alleles are the same (regardless of whether they are ref or alt); if any alleles are no-calls, this method will return false.
-     */
-    public boolean isHom()    { return isHomRef() || isHomVar(); }
-
-    /**
-     * @return true if all observed alleles are ref; if any alleles are no-calls, this method will return false.
-     */
-    public boolean isHomRef() { return getType() == GenotypeType.HOM_REF; }
-
-    /**
-     * @return true if all observed alleles are alt; if any alleles are no-calls, this method will return false.
-     */
-    public boolean isHomVar() { return getType() == GenotypeType.HOM_VAR; }
-
-    /**
-     * @return true if we're het (observed alleles differ); if the ploidy is less than 2 or if any alleles are no-calls, this method will return false.
-     */
-    public boolean isHet() { return getType() == GenotypeType.HET; }
-
-    /**
-     * @return true if we're het (observed alleles differ) and neither allele is reference; if the ploidy is less than 2 or if any alleles are no-calls, this method will return false.
-     */
-    public boolean isHetNonRef() { return (getType() == GenotypeType.HET && getAllele(0).isNonReference() && getAllele(1).isNonReference()); }
-
-    /**
-     * @return true if this genotype is not actually a genotype but a "no call" (e.g. './.' in VCF); if any alleles are not no-calls (even if some are), this method will return false.
-     */
-    public boolean isNoCall() { return getType() == GenotypeType.NO_CALL; }
-
-    /**
-     * @return true if this genotype is comprised of any alleles that are not no-calls (even if some are).
-     */
-    public boolean isCalled() { return getType() != GenotypeType.NO_CALL && getType() != GenotypeType.UNAVAILABLE; }
-
-    /**
-     * @return true if this genotype is comprised of both calls and no-calls.
-     */
-    public boolean isMixed() { return getType() == GenotypeType.MIXED; }
-
-    /**
-     * @return true if the type of this genotype is set.
-     */
-    public boolean isAvailable() { return getType() != GenotypeType.UNAVAILABLE; }
-
-    // ------------------------------------------------------------------------------
-    //
-    // methods for getting genotype likelihoods for a genotype object, if present
-    //
-    // ------------------------------------------------------------------------------
-
-    /**
-     * @return Returns true if this Genotype has PL field values
-     */
-    public boolean hasLikelihoods() {
-        return getPL() != null;
-    }
-
-    /**
-     * Convenience function that returns a string representation of the PL field of this
-     * genotype, or . if none is available.
-     *
-     * @return a non-null String representation for the PL of this sample
-     */
-    public String getLikelihoodsString() {
-        return hasLikelihoods() ? getLikelihoods().toString() : VCFConstants.MISSING_VALUE_v4;
-    }
-
-    /**
-     * Returns the GenotypesLikelihoods data associated with this Genotype, or null if missing
-     * @return null or a GenotypesLikelihood object for this sample's PL field
-     */
-    public GenotypeLikelihoods getLikelihoods() {
-        return hasLikelihoods() ? GenotypeLikelihoods.fromPLs(getPL()) : null;
-    }
-
-    /**
-     * Are all likelihoods for this sample non-informative?
-     *
-     * Returns true if all PLs are 0 => 0,0,0 => true
-     * 0,0,0,0,0,0 => true
-     * 0,10,100 => false
-     *
-     * @return true if all samples PLs are equal and == 0
-     */
-    public boolean isNonInformative() {
-        if ( getPL() == null )
-            return true;
-        else {
-            for ( final int PL : getPL() ) {
-                if ( PL != 0 )
-                    return false;
-            }
-
-            return true;
-        }
-    }
-
-    /**
-     * Unsafe low-level accessor the PL field itself, may be null.
-     *
-     * @return a pointer to the underlying PL data.  MUST NOT BE MODIFIED!
-     */
-    public abstract int[] getPL();
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // Many different string representations
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * Return a VCF-like string representation for the alleles of this genotype.
-     *
-     * Does not append the reference * marker on the alleles.
-     *
-     * @return a string representing the genotypes, or null if the type is unavailable.
-     */
-    public String getGenotypeString() {
-        return getGenotypeString(true);
-    }
-
-    /**
-     * Return a VCF-like string representation for the alleles of this genotype.
-     *
-     * If ignoreRefState is true, will not append the reference * marker on the alleles.
-     *
-     * @return a string representing the genotypes, or null if the type is unavailable.
-     */
-    public String getGenotypeString(boolean ignoreRefState) {
-        if ( getPloidy() == 0 )
-            return "NA";
-
-        // Notes:
-        // 1. Make sure to use the appropriate separator depending on whether the genotype is phased
-        final String separator = isPhased() ? PHASED_ALLELE_SEPARATOR : UNPHASED_ALLELE_SEPARATOR;
-        // 2. If ignoreRefState is true, then we want just the bases of the Alleles (ignoring the '*' indicating a ref Allele)
-        if (ignoreRefState) {
-          return ParsingUtils.join(separator, getAlleleStrings());
-        }
-        // 3. So that everything is deterministic with regards to integration tests, we sort Alleles (when the genotype isn't phased, of course)
-        List<Allele> alleles = isPhased() ? getAlleles() : ParsingUtils.sortList(getAlleles());
-        return ParsingUtils.join(separator, alleles);
-    }
-
-    /**
-     * Utility that returns a list of allele strings corresponding to the alleles in this sample
-     * @return
-     */
-    protected List<String> getAlleleStrings() {
-        final List<String> al = new ArrayList<String>(getPloidy());
-        for ( Allele a : getAlleles() )
-            al.add(a.getBaseString());
-
-        return al;
-    }
-
-    public String toString() {
-        return String.format("[%s %s%s%s%s%s%s%s]",
-                getSampleName(),
-                getGenotypeString(false),
-                toStringIfExists(VCFConstants.GENOTYPE_QUALITY_KEY, getGQ()),
-                toStringIfExists(VCFConstants.DEPTH_KEY, getDP()),
-                toStringIfExists(VCFConstants.GENOTYPE_ALLELE_DEPTHS, getAD()),
-                toStringIfExists(VCFConstants.GENOTYPE_PL_KEY, getPL()),
-                toStringIfExists(VCFConstants.GENOTYPE_FILTER_KEY, getFilters()),
-                sortedString(getExtendedAttributes()));
-    }
-
-    public String toBriefString() {
-        return String.format("%s:Q%d", getGenotypeString(false), getGQ());
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // Comparison operations
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * comparable genotypes -> compareTo on the sample names
-     * @param genotype
-     * @return
-     */
-    @Override
-    public int compareTo(final Genotype genotype) {
-        return getSampleName().compareTo(genotype.getSampleName());
-    }
-
-    public boolean sameGenotype(final Genotype other) {
-        return sameGenotype(other, true);
-    }
-
-    public boolean sameGenotype(final Genotype other, boolean ignorePhase) {
-        if (getPloidy() != other.getPloidy())
-            return false; // gotta have the same number of allele to be equal
-
-        // By default, compare the elements in the lists of alleles, element-by-element
-        Collection<Allele> thisAlleles = this.getAlleles();
-        Collection<Allele> otherAlleles = other.getAlleles();
-
-        if (ignorePhase) { // do not care about order, only identity of Alleles
-            thisAlleles = new TreeSet<Allele>(thisAlleles);   //implemented Allele.compareTo()
-            otherAlleles = new TreeSet<Allele>(otherAlleles);
-        }
-
-        return thisAlleles.equals(otherAlleles);
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // get routines for extended attributes
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * Returns the extended attributes for this object
-     * @return is never null, but is often isEmpty()
-     */
-    public abstract Map<String, Object> getExtendedAttributes();
-
-    /**
-     * Is key associated with a value (even a null one) in the extended attributes?
-     *
-     * Note this will not return true for the inline attributes DP, GQ, AD, or PL
-     *
-     * @param key a non-null string key to check for an association
-     * @return true if key has a value in the extendedAttributes
-     */
-    public boolean hasExtendedAttribute(final String key) {
-        return getExtendedAttributes().containsKey(key);
-    }
-
-    /**
-     * Get the extended attribute value associated with key, if possible
-     *
-     * @param key a non-null string key to fetch a value for
-     * @param defaultValue the value to return if key isn't in the extended attributes
-     * @return a value (potentially) null associated with key, or defaultValue if no association exists
-     */
-    public Object getExtendedAttribute(final String key, final Object defaultValue) {
-        return hasExtendedAttribute(key) ? getExtendedAttributes().get(key) : defaultValue;
-    }
-
-    /**
-     * Same as #getExtendedAttribute with a null default
-     *
-     * @param key
-     * @return
-     */
-    public Object getExtendedAttribute(final String key) {
-        return getExtendedAttribute(key, null);
-    }
-
-    /**
-     * Returns the filter string associated with this Genotype.
-     *
-     * @return If this result == null, then the genotype is considered PASSing filters
-     *   If the result != null, then the genotype has failed filtering for the reason(s)
-     *   specified in result.  To be reference compliant multiple filter field
-     *   string values can be encoded with a ; separator.
-     */
-    public final String getFilters() {
-        return filters;
-    }
-
-    /**
-     * Is this genotype filtered or not?
-     *
-     * @return returns false if getFilters() == null
-     */
-    public final boolean isFiltered() {
-        return getFilters() != null;
-    }
-
-    @Deprecated public boolean hasLog10PError() { return hasGQ(); }
-    @Deprecated public double getLog10PError() { return getGQ() / -10.0; }
-    @Deprecated public int getPhredScaledQual() { return getGQ(); }
-
-    @Deprecated
-    public String getAttributeAsString(String key, String defaultValue) {
-        Object x = getExtendedAttribute(key);
-        if ( x == null ) return defaultValue;
-        if ( x instanceof String ) return (String)x;
-        return String.valueOf(x); // throws an exception if this isn't a string
-    }
-
-    @Deprecated
-    public int getAttributeAsInt(String key, int defaultValue) {
-        Object x = getExtendedAttribute(key);
-        if ( x == null || x == VCFConstants.MISSING_VALUE_v4 ) return defaultValue;
-        if ( x instanceof Integer ) return (Integer)x;
-        return Integer.valueOf((String)x); // throws an exception if this isn't a string
-    }
-
-    @Deprecated
-    public double getAttributeAsDouble(String key, double defaultValue) {
-        Object x = getExtendedAttribute(key);
-        if ( x == null ) return defaultValue;
-        if ( x instanceof Double ) return (Double)x;
-        return Double.valueOf((String)x); // throws an exception if this isn't a string
-    }
-
-    /**
-     * A totally generic getter, that allows you to get specific keys that correspond
-     * to even inline values (GQ, for example).  Can be very expensive.  Additionally,
-     * all <code>int[]</code> are converted inline into <code>List<Integer></code> for convenience.
-     *
-     * @param key
-     * @return
-     */
-    public Object getAnyAttribute(final String key) {
-        if (key.equals(VCFConstants.GENOTYPE_KEY)) {
-            return getAlleles();
-        } else if (key.equals(VCFConstants.GENOTYPE_QUALITY_KEY)) {
-            return getGQ();
-        } else if (key.equals(VCFConstants.GENOTYPE_ALLELE_DEPTHS)) {
-            if (hasAD()) {
-                final List<Integer> intList = new ArrayList<Integer>(getAD().length);
-                for(int i : getAD()) intList.add(i);
-                return intList;
-            }
-            return Collections.EMPTY_LIST;
-        } else if (key.equals(VCFConstants.GENOTYPE_PL_KEY)) {
-            if (hasPL()) {
-                final List<Integer> intList = new ArrayList<Integer>(getPL().length);
-                for(int i : getPL()) intList.add(i);
-                return intList;
-            }
-            return Collections.EMPTY_LIST;
-        } else if (key.equals(VCFConstants.DEPTH_KEY)) {
-            return getDP();
-        } else if (key.equals(VCFConstants.GENOTYPE_FILTER_KEY)) {
-            return getFilters();
-        } else {
-            return getExtendedAttribute(key);
-        }
-    }
-
-    public boolean hasAnyAttribute(final String key) {
-        if (key.equals(VCFConstants.GENOTYPE_KEY)) {
-            return isAvailable();
-        } else if (key.equals(VCFConstants.GENOTYPE_QUALITY_KEY)) {
-            return hasGQ();
-        } else if (key.equals(VCFConstants.GENOTYPE_ALLELE_DEPTHS)) {
-            return hasAD();
-        } else if (key.equals(VCFConstants.GENOTYPE_PL_KEY)) {
-            return hasPL();
-        } else if (key.equals(VCFConstants.DEPTH_KEY)) {
-            return hasDP();
-        } else if (key.equals(VCFConstants.GENOTYPE_FILTER_KEY)) {
-            return true;  //always available
-        } else {
-            return hasExtendedAttribute(key);
-        }
-    }
-
-    // TODO -- add getAttributesAsX interface here
-
-    // ------------------------------------------------------------------------------
-    //
-    // private utilities
-    //
-    // ------------------------------------------------------------------------------
-
-    /**
-     * a utility method for generating sorted strings from a map key set.
-     * @param c the map
-     * @param <T> the key type
-     * @param <V> the value type
-     * @return a sting, enclosed in {}, with comma seperated key value pairs in order of the keys
-     */
-    protected static <T extends Comparable<T>, V> String sortedString(Map<T, V> c) {
-
-        // NOTE -- THIS IS COPIED FROM GATK UTILS TO ALLOW US TO KEEP A SEPARATION BETWEEN THE GATK AND VCF CODECS
-        final List<T> t = new ArrayList<T>(c.keySet());
-        Collections.sort(t);
-
-        final List<String> pairs = new ArrayList<String>();
-        for (final T k : t) {
-            pairs.add(k + "=" + c.get(k));
-        }
-
-        return pairs.isEmpty() ? "" : " {" + ParsingUtils.join(", ", pairs.toArray(new String[pairs.size()])) + "}";
-    }
-
-    /**
-     * Returns a display name for field name with value v if this isn't -1.  Otherwise returns ""
-     * @param name of the field ("AD")
-     * @param v the value of the field, or -1 if missing
-     * @return a non-null string for display if the field is not missing
-     */
-    protected final static String toStringIfExists(final String name, final int v) {
-        return v == -1 ? "" : " " + name + " " + v;
-    }
-
-    /**
-     * Returns a display name for field name with String value v if this isn't null.  Otherwise returns ""
-     * @param name of the field ("FT")
-     * @param v the value of the field, or null if missing
-     * @return a non-null string for display if the field is not missing
-     */
-    protected final static String toStringIfExists(final String name, final String v) {
-        return v == null ? "" : " " + name + " " + v;
-    }
-
-    /**
-     * Returns a display name for field name with values vs if this isn't null.  Otherwise returns ""
-     * @param name of the field ("AD")
-     * @param vs the value of the field, or null if missing
-     * @return a non-null string for display if the field is not missing
-     */
-    protected final static String toStringIfExists(final String name, final int[] vs) {
-        if ( vs == null )
-            return "";
-        else {
-            StringBuilder b = new StringBuilder();
-            b.append(' ').append(name).append(' ');
-            for ( int i = 0; i < vs.length; i++ ) {
-                if ( i != 0 ) b.append(',');
-                b.append(vs[i]);
-            }
-            return b.toString();
-        }
-    }
-
-    /**
-     * Does the attribute map have a mapping involving a forbidden key (i.e.,
-     * one that's managed inline by this Genotypes object?
-     *
-     * @param attributes the extended attributes key
-     * @return
-     */
-    protected final static boolean hasForbiddenKey(final Map<String, Object> attributes) {
-        for ( final String forbidden : PRIMARY_KEYS)
-            if ( attributes.containsKey(forbidden) )
-                return true;
-        return false;
-    }
-
-    protected final static boolean isForbiddenKey(final String key) {
-        return PRIMARY_KEYS.contains(key);
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/GenotypeBuilder.java b/src/main/java/htsjdk/variant/variantcontext/GenotypeBuilder.java
deleted file mode 100644
index 483e1c6..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/GenotypeBuilder.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A builder class for genotypes
- *
- * Provides convenience setter methods for all of the Genotype field
- * values.  Setter methods can be used in any order, allowing you to
- * pass through states that wouldn't be allowed in the highly regulated
- * immutable Genotype class.
- *
- * All fields default to meaningful MISSING values.
- *
- * Call make() to actually create the corresponding Genotype object from
- * this builder.  Can be called multiple times to create independent copies,
- * or with intervening sets to conveniently make similar Genotypes with
- * slight modifications.
- *
- * Re-using the same GenotypeBuilder to build multiple Genotype objects via calls
- * to make() is dangerous, since reference types in the builder (eg., Collections/arrays)
- * don't get copied when making each Genotype. To safely re-use the same builder object
- * multiple times, use makeWithShallowCopy() instead of make().
- *
- * @author Mark DePristo
- * @since 06/12
- */
-public final class GenotypeBuilder {
-    private static final List<Allele> HAPLOID_NO_CALL = Arrays.asList(Allele.NO_CALL);
-    private static final List<Allele> DIPLOID_NO_CALL = Arrays.asList(Allele.NO_CALL, Allele.NO_CALL);
-
-    private String sampleName = null;
-    private List<Allele> alleles = Collections.emptyList();
-
-    private boolean isPhased = false;
-    private int GQ = -1;
-    private int DP = -1;
-    private int[] AD = null;
-    private int[] PL = null;
-    private Map<String, Object> extendedAttributes = null;
-    private String filters = null;
-    private int initialAttributeMapSize = 5;
-
-    private final static Map<String, Object> NO_ATTRIBUTES =
-            Collections.unmodifiableMap(new HashMap<String, Object>(0));
-
-    // -----------------------------------------------------------------
-    //
-    // Factory methods
-    //
-    // -----------------------------------------------------------------
-
-    public static Genotype create(final String sampleName, final List<Allele> alleles) {
-        return new GenotypeBuilder(sampleName, alleles).make();
-    }
-
-    public static Genotype create(final String sampleName,
-                                        final List<Allele> alleles,
-                                        final Map<String, Object> attributes) {
-        return new GenotypeBuilder(sampleName, alleles).attributes(attributes).make();
-    }
-
-    protected static Genotype create(final String sampleName,
-                                           final List<Allele> alleles,
-                                           final double[] gls) {
-        return new GenotypeBuilder(sampleName, alleles).PL(gls).make();
-    }
-
-    /**
-     * Create a new Genotype object for a sample that's missing from the VC (i.e., in
-     * the output header).  Defaults to a diploid no call genotype ./.
-     *
-     * @param sampleName the name of this sample
-     * @return an initialized Genotype with sampleName that's a diploid ./. no call genotype
-     */
-    public static Genotype createMissing(final String sampleName, final int ploidy) {
-        final GenotypeBuilder builder = new GenotypeBuilder(sampleName);
-        switch ( ploidy ) {
-            case 1:  builder.alleles(HAPLOID_NO_CALL); break;
-            case 2:  builder.alleles(DIPLOID_NO_CALL); break;
-            default: builder.alleles(Collections.nCopies(ploidy, Allele.NO_CALL)); break;
-        }
-        return builder.make();
-    }
-
-    /**
-     * Create a empty builder.  Both a sampleName and alleles must be provided
-     * before trying to make a Genotype from this builder.
-     */
-    public GenotypeBuilder() {}
-
-    /**
-     * Create a builder using sampleName.  Alleles must be provided
-     * before trying to make a Genotype from this builder.
-     * @param sampleName
-     */
-    public GenotypeBuilder(final String sampleName) {
-        name(sampleName);
-    }
-
-    /**
-     * Make a builder using sampleName and alleles for starting values
-     * @param sampleName
-     * @param alleles
-     */
-    public GenotypeBuilder(final String sampleName, final List<Allele> alleles) {
-        name(sampleName);
-        alleles(alleles);
-    }
-
-    /**
-     * Create a new builder starting with the values in Genotype g
-     * @param g
-     */
-    public GenotypeBuilder(final Genotype g) {
-        copy(g);
-    }
-
-    /**
-     * Copy all of the values for this builder from Genotype g
-     * @param g
-     * @return
-     */
-    public GenotypeBuilder copy(final Genotype g) {
-        name(g.getSampleName());
-        alleles(g.getAlleles());
-        phased(g.isPhased());
-        GQ(g.getGQ());
-        DP(g.getDP());
-        AD(g.getAD());
-        PL(g.getPL());
-        filter(g.getFilters());
-        attributes(g.getExtendedAttributes());
-        return this;
-    }
-
-    /**
-     * Reset all of the builder attributes to their defaults.  After this
-     * function you must provide sampleName and alleles before trying to
-     * make more Genotypes.
-     */
-    public final void reset(final boolean keepSampleName) {
-        if ( ! keepSampleName ) sampleName = null;
-        alleles = Collections.emptyList();
-        isPhased = false;
-        GQ = -1;
-        DP = -1;
-        AD = null;
-        PL = null;
-        filters = null;
-        extendedAttributes = null;
-    }
-
-    /**
-     * Create a new Genotype object using the values set in this builder.
-     *
-     * After creation the values in this builder can be modified and more Genotypes
-     * created, althrough the contents of array values like PL should never be modified
-     * inline as they are not copied for efficiency reasons.
-     *
-     * Note: if attributes are added via this builder after a call to make(), the new Genotype will
-     * be modified. Use {@link #makeWithShallowCopy} to safely re-use the same builder object
-     * multiple times.
-     *
-     * @return a newly minted Genotype object with values provided from this builder
-     */
-    public Genotype make() {
-        final Map<String, Object> ea = (extendedAttributes == null) ? NO_ATTRIBUTES : extendedAttributes;
-        return new FastGenotype(sampleName, alleles, isPhased, GQ, DP, AD, PL, filters, ea);
-    }
-
-    /**
-     * Create a new Genotype object using the values set in this builder, and perform a
-     * shallow copy of reference types to allow safer re-use of this builder
-     *
-     * After creation the values in this builder can be modified and more Genotypes
-     * created.
-     *
-     * @return a newly minted Genotype object with values provided from this builder
-     */
-    public Genotype makeWithShallowCopy() {
-        final Map<String, Object> ea = (extendedAttributes == null) ? NO_ATTRIBUTES : new HashMap<>(extendedAttributes);
-        final List<Allele> al = new ArrayList<>(alleles);
-        final int[] copyAD = (AD == null) ? null : Arrays.copyOf(AD, AD.length);
-        final int[] copyPL = (PL == null) ? null : Arrays.copyOf(PL, PL.length);
-        return new FastGenotype(sampleName, al, isPhased, GQ, DP, copyAD, copyPL, filters, ea);
-    }
-
-    /**
-     * Set this genotype's name
-     * @param sampleName
-     * @return
-     */
-    public GenotypeBuilder name(final String sampleName) {
-        this.sampleName = sampleName;
-        return this;
-    }
-
-    /**
-     * Set this genotype's alleles
-     * @param alleles
-     * @return
-     */
-    public GenotypeBuilder alleles(final List<Allele> alleles) {
-        if ( alleles == null )
-            this.alleles = Collections.emptyList();
-        else
-            this.alleles = alleles;
-        return this;
-    }
-
-    /**
-     * Is this genotype phased?
-     * @param phased
-     * @return
-     */
-    public GenotypeBuilder phased(final boolean phased) {
-        isPhased = phased;
-        return this;
-    }
-
-    public GenotypeBuilder GQ(final int GQ) {
-        this.GQ = GQ;
-        return this;
-    }
-
-    /**  Set the GQ with a log10PError value
-     *
-     * @param pLog10Error
-     * @return
-     */
-    public GenotypeBuilder log10PError(final double pLog10Error) {
-        if ( pLog10Error == CommonInfo.NO_LOG10_PERROR )
-            return noGQ();
-        else
-            return GQ((int)Math.round(pLog10Error * -10));
-    }
-
-    /**
-     * This genotype has no GQ value
-     * @return
-     */
-    public GenotypeBuilder noGQ() { GQ = -1; return this; }
-
-    /**
-     * This genotype has no AD value
-     * @return
-     */
-    public GenotypeBuilder noAD() { AD = null; return this; }
-
-    /**
-     * This genotype has no DP value
-     * @return
-     */
-    public GenotypeBuilder noDP() { DP = -1; return this; }
-
-    /**
-     * This genotype has no PL value
-     * @return
-     */
-    public GenotypeBuilder noPL() { PL = null; return this; }
-
-    /**
-     * This genotype has this DP value
-     * @return
-     */
-    public GenotypeBuilder DP(final int DP) {
-        this.DP = DP;
-        return this;
-    }
-
-    /**
-     * This genotype has this AD value
-     * @return
-     */
-    public GenotypeBuilder AD(final int[] AD) {
-        this.AD = AD;
-        return this;
-    }
-
-    /**
-     * This genotype has this PL value, as int[].  FAST
-     * @return
-     */
-    public GenotypeBuilder PL(final int[] PL) {
-        this.PL = PL;
-        return this;
-    }
-
-    /**
-     * This genotype has this PL value, converted from double[]. SLOW
-     * @return
-     */
-    public GenotypeBuilder PL(final double[] GLs) {
-        this.PL = GenotypeLikelihoods.fromLog10Likelihoods(GLs).getAsPLs();
-        return this;
-    }
-
-    /**
-     * This genotype has these attributes. Attributes are added to previous ones.
-     *
-     * Cannot contain inline attributes (DP, AD, GQ, PL). Note: this is not checked
-     * @return
-     */
-    public GenotypeBuilder attributes(final Map<String, Object> attributes) {
-        for ( Map.Entry<String, Object> pair : attributes.entrySet() )
-            attribute(pair.getKey(), pair.getValue());
-        return this;
-    }
-
-    /**
-     * Tells this builder to remove all extended attributes
-     *
-     * @return
-     */
-    public GenotypeBuilder noAttributes() {
-        this.extendedAttributes = null;
-        return this;
-    }
-
-    /**
-     * This genotype has this attribute key / value pair.
-     *
-     * Cannot contain inline attributes (DP, AD, GQ, PL). Note: this is not checked
-     * @return
-     */
-    public GenotypeBuilder attribute(final String key, final Object value) {
-        if ( extendedAttributes == null )
-            extendedAttributes = new HashMap<String, Object>(initialAttributeMapSize);
-        extendedAttributes.put(key, value);
-        return this;
-    }
-
-    /**
-     * Tells this builder to make a Genotype object that has had filters applied,
-     * which may be empty (passes) or have some value indicating the reasons
-     * why it's been filtered.
-     *
-     * @param filters non-null list of filters.  empty list => PASS
-     * @return this builder
-     */
-    public GenotypeBuilder filters(final List<String> filters) {
-        if ( filters.isEmpty() )
-            return filter(null);
-        else if ( filters.size() == 1 )
-            return filter(filters.get(0));
-        else
-            return filter(ParsingUtils.join(";", ParsingUtils.sortList(filters)));
-    }
-
-    /**
-     * varargs version of #filters
-     * @param filters
-     * @return
-     */
-    public GenotypeBuilder filters(final String ... filters) {
-        return filters(Arrays.asList(filters));
-    }
-
-    /**
-     * Most efficient version of setting filters -- just set the filters string to filters
-     *
-     * @param filter if filters == null or filters.equals("PASS") => genotype is PASS
-     * @return
-     */
-    public GenotypeBuilder filter(final String filter) {
-        this.filters = VCFConstants.PASSES_FILTERS_v4.equals(filter) ? null : filter;
-        return this;
-    }
-
-    /**
-     * This genotype is unfiltered
-     *
-     * @return
-     */
-    public GenotypeBuilder unfiltered() {
-        return filter(null);
-    }
-
-    /**
-     * Tell's this builder that we have at most these number of attributes
-     * @return
-     */
-    public GenotypeBuilder maxAttributes(final int i) {
-        initialAttributeMapSize = i;
-        return this;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/variantcontext/GenotypeJEXLContext.java b/src/main/java/htsjdk/variant/variantcontext/GenotypeJEXLContext.java
deleted file mode 100644
index 8d2cd10..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/GenotypeJEXLContext.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package htsjdk.variant.variantcontext;
-
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- *
- * @author bbimber
- *
- * implements the JEXL context for Genotype; this saves us from
- * having to generate a JEXL context lookup map everytime we want to evaluate an expression.
- *
- */
-public class GenotypeJEXLContext extends VariantJEXLContext {
-    private Genotype g;
-
-    private interface AttributeGetter {
-        public Object get(Genotype g);
-    }
-
-    private static Map<String, AttributeGetter> attributes = new HashMap<String, AttributeGetter>();
-
-    static {
-        attributes.put("g", (Genotype g) -> g);
-        attributes.put(VCFConstants.GENOTYPE_KEY, Genotype::getGenotypeString);
-
-        attributes.put("isHom", (Genotype g) -> g.isHom() ? true_string : false_string);
-        attributes.put("isHomRef", (Genotype g) -> g.isHomRef() ? true_string : false_string);
-        attributes.put("isHet", (Genotype g) -> g.isHet() ? true_string : false_string);
-        attributes.put("isHomVar", (Genotype g) -> g.isHomVar() ? true_string : false_string);
-        attributes.put("isCalled", (Genotype g) -> g.isCalled() ? true_string : false_string);
-        attributes.put("isNoCall", (Genotype g) -> g.isNoCall() ? true_string : false_string);
-        attributes.put("isMixed", (Genotype g) -> g.isMixed() ? true_string : false_string);
-        attributes.put("isAvailable", (Genotype g) -> g.isAvailable() ? true_string : false_string);
-        attributes.put("isPassFT", (Genotype g) -> g.isFiltered() ? false_string : true_string);
-        attributes.put(VCFConstants.GENOTYPE_FILTER_KEY, (Genotype g) -> g.isFiltered()?  g.getFilters() : VCFConstants.PASSES_FILTERS_v4);
-        attributes.put(VCFConstants.GENOTYPE_QUALITY_KEY, Genotype::getGQ);
-    }
-
-    public GenotypeJEXLContext(VariantContext vc, Genotype g) {
-        super(vc);
-        this.g = g;
-    }
-
-    @Override
-    public Object get(String name) {
-        //should matching genotype attributes always supersede vc?
-        if ( attributes.containsKey(name) ) { // dynamic resolution of name -> value via map
-            return attributes.get(name).get(g);
-        } else if ( g.hasAnyAttribute(name) ) {
-            return g.getAnyAttribute(name);
-        } else if ( g.getFilters() != null && g.getFilters().contains(name) ) {
-            return true_string;
-        } else
-            return super.get(name);
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/GenotypeLikelihoods.java b/src/main/java/htsjdk/variant/variantcontext/GenotypeLikelihoods.java
deleted file mode 100644
index ee3e08d..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/GenotypeLikelihoods.java
+++ /dev/null
@@ -1,578 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-import java.util.HashMap;
-
-public class GenotypeLikelihoods {
-    private final static int NUM_LIKELIHOODS_CACHE_N_ALLELES = 5;
-    private final static int NUM_LIKELIHOODS_CACHE_PLOIDY = 10;
-    // caches likelihoods up to 5 alleles and up to 10 ploidy
-    private final static int[][] numLikelihoodCache = new int[NUM_LIKELIHOODS_CACHE_N_ALLELES][NUM_LIKELIHOODS_CACHE_PLOIDY];
-
-    public final static int MAX_PL = Integer.MAX_VALUE;
-
-    //
-    // There are two objects here because we are lazy in creating both representations
-    // for this object: a vector of log10 Probs and the PL phred-scaled string.  Supports
-    // having one set during initializating, and dynamic creation of the other, if needed
-    //
-    private double[] log10Likelihoods = null;
-    private String likelihoodsAsString_PLs = null;
-
-    /**
-     * initialize num likelihoods cache
-     */
-    static {
-        // must be done before PLIndexToAlleleIndex
-        for ( int numAlleles = 1; numAlleles < NUM_LIKELIHOODS_CACHE_N_ALLELES; numAlleles++ ) {
-            for ( int ploidy = 1; ploidy < NUM_LIKELIHOODS_CACHE_PLOIDY; ploidy++ ) {
-                numLikelihoodCache[numAlleles][ploidy] = calcNumLikelihoods(numAlleles, ploidy);
-            }
-        }
-    }
-
-    /**
-     * The maximum number of diploid alternate alleles that we can represent as genotype likelihoods
-     */
-    public final static int MAX_DIPLOID_ALT_ALLELES_THAT_CAN_BE_GENOTYPED = 50;
-
-    /**
-     * A cache of the PL index to the 2 alleles it represents over all possible numbers of alternate alleles
-     */
-    private final static GenotypeLikelihoodsAllelePair[] diploidPLIndexToAlleleIndex = calculateDiploidPLcache(MAX_DIPLOID_ALT_ALLELES_THAT_CAN_BE_GENOTYPED);
-
-    /**
-     * A cache of PL index to a list of alleles for any ploidy.
-     * For example, for a ploidy of 3, the allele lists for each PL index is:
-     * {0,0,0}, {0,0,1}, {0,1,1}, {1,1,1}, {0,0,2}, {0,1,2}, {1,1,2}, {0,2,2}, {1,2,2}, {2,2,2}
-     */
-    protected final static Map<Integer, List<List<Integer>>> anyploidPloidyToPLIndexToAlleleIndices = new HashMap<Integer, List<List<Integer>>>();
-
-    public final static GenotypeLikelihoods fromPLField(String PLs) {
-        return new GenotypeLikelihoods(PLs);
-    }
-
-    @Deprecated
-    public final static GenotypeLikelihoods fromGLField(String GLs) {
-        return new GenotypeLikelihoods(parseDeprecatedGLString(GLs));
-    }
-
-    public final static GenotypeLikelihoods fromLog10Likelihoods(double[] log10Likelihoods) {
-        return new GenotypeLikelihoods(log10Likelihoods);
-    }
-
-    public final static GenotypeLikelihoods fromPLs(final int[] pls) {
-        return new GenotypeLikelihoods(PLsToGLs(pls));
-    }
-
-    //
-    // You must use the factory methods now
-    //
-    private GenotypeLikelihoods(String asString) {
-        likelihoodsAsString_PLs = asString;
-    }
-
-    private GenotypeLikelihoods(double[] asVector) {
-        log10Likelihoods = asVector;
-    }
-
-    /**
-     * The genotypes likelihoods in -10log10(x) vector format.  pr{AA} = x, this
-     * vector returns math.log10(x) for each of the genotypes.  Can return null if the
-     * genotype likelihoods are "missing".
-     *
-     * @return genotypes likelihoods in negative log10 vector format
-     */
-    public double[] getAsVector() {
-        // assumes one of the likelihoods vector or the string isn't null
-        if ( log10Likelihoods == null ) {
-            // make sure we create the GL string if it doesn't already exist
-            log10Likelihoods = parsePLsIntoLikelihoods(likelihoodsAsString_PLs);
-        }
-
-        return log10Likelihoods;
-    }
-
-    public int[] getAsPLs() {
-        final double[] GLs = getAsVector();
-        return GLs == null ? null : GLsToPLs(GLs);
-    }
-
-    public String toString() {
-        return getAsString();
-    }
-
-    public String getAsString() {
-        if ( likelihoodsAsString_PLs == null ) {
-            // todo -- should we accept null log10Likelihoods and set PLs as MISSING?
-            if ( log10Likelihoods == null )
-                throw new TribbleException("BUG: Attempted to get likelihoods as strings and neither the vector nor the string is set!");
-            likelihoodsAsString_PLs = convertLikelihoodsToPLString(log10Likelihoods);
-        }
-
-        return likelihoodsAsString_PLs;
-    }
-
-    @Override public boolean equals(Object aThat) {
-        //check for self-comparison
-        if ( this == aThat ) return true;
-
-        if ( !(aThat instanceof GenotypeLikelihoods) ) return false;
-        GenotypeLikelihoods that = (GenotypeLikelihoods)aThat;
-
-        // now a proper field-by-field evaluation can be made.
-        // GLs are considered equal if the corresponding PLs are equal
-        return Arrays.equals(getAsPLs(), that.getAsPLs());
-    }
-
-    //Return genotype likelihoods as an EnumMap with Genotypes as keys and likelihoods as values
-    //Returns null in case of missing likelihoods
-    public EnumMap<GenotypeType,Double> getAsMap(boolean normalizeFromLog10){
-        //Make sure that the log10likelihoods are set
-        double[] likelihoods = normalizeFromLog10 ? GeneralUtils.normalizeFromLog10(getAsVector()) : getAsVector();
-        if(likelihoods == null)
-            return null;
-        EnumMap<GenotypeType,Double> likelihoodsMap = new EnumMap<GenotypeType, Double>(GenotypeType.class);
-        likelihoodsMap.put(GenotypeType.HOM_REF,likelihoods[GenotypeType.HOM_REF.ordinal()-1]);
-        likelihoodsMap.put(GenotypeType.HET,likelihoods[GenotypeType.HET.ordinal()-1]);
-        likelihoodsMap.put(GenotypeType.HOM_VAR, likelihoods[GenotypeType.HOM_VAR.ordinal() - 1]);
-        return likelihoodsMap;
-    }
-
-    //Return the neg log10 Genotype Quality (GQ) for the given genotype
-    //Returns Double.NEGATIVE_INFINITY in case of missing genotype
-
-    /**
-     * This is really dangerous and returns completely wrong results for genotypes from a multi-allelic context.
-     * Use <code>getLog10GQ(Genotype,VariantContext)</code>
-     *  or <code>getLog10GQ(Genotype,List<Allele>)</code> in place of it.
-     *
-     * If you <strong>know</strong> you're biallelic, use <code>getGQLog10FromLikelihoods</code> directly.
-     * @param genotype - actually a genotype type (no call, hom ref, het, hom var)
-     * @return an unsafe quantity that could be negative. In the bi-allelic case, the GQ resulting from best minus next best (if the type is the best).
-     */
-    @Deprecated
-    public double getLog10GQ(GenotypeType genotype){
-        return getGQLog10FromLikelihoods(genotype.ordinal() - 1 /* NO_CALL IS FIRST */, getAsVector());
-    }
-
-    private double getLog10GQ(List<Allele> genotypeAlleles,List<Allele> contextAlleles) {
-        int allele1Index = contextAlleles.indexOf(genotypeAlleles.get(0));
-        int allele2Index = contextAlleles.indexOf(genotypeAlleles.get(1));
-        int plIndex = calculatePLindex(allele1Index,allele2Index);
-        return getGQLog10FromLikelihoods(plIndex,getAsVector());
-    }
-
-    public double getLog10GQ(Genotype genotype, List<Allele> vcAlleles ) {
-        return getLog10GQ(genotype.getAlleles(),vcAlleles);
-    }
-
-    public double getLog10GQ(Genotype genotype, VariantContext context) {
-        return getLog10GQ(genotype,context.getAlleles());
-    }
-
-    public static double getGQLog10FromLikelihoods(int iOfChoosenGenotype, double[] likelihoods){
-        if(likelihoods == null)
-            return Double.NEGATIVE_INFINITY;
-
-        double qual = Double.NEGATIVE_INFINITY;
-        for (int i=0; i < likelihoods.length; i++) {
-            if (i==iOfChoosenGenotype)
-                continue;
-            if (likelihoods[i] >= qual)
-                qual = likelihoods[i];
-        }
-
-        // qual contains now max(likelihoods[k]) for all k != bestGTguess
-        qual = likelihoods[iOfChoosenGenotype] - qual;
-
-        if (qual < 0) {
-            // QUAL can be negative if the chosen genotype is not the most likely one individually.
-            // In this case, we compute the actual genotype probability and QUAL is the likelihood of it not being the chosen one
-            double[] normalized = GeneralUtils.normalizeFromLog10(likelihoods);
-            double chosenGenotype = normalized[iOfChoosenGenotype];
-            return Math.log10(1.0 - chosenGenotype);
-        } else {
-            // invert the size, as this is the probability of making an error
-            return -1 * qual;
-        }
-    }
-
-    private final static double[] parsePLsIntoLikelihoods(String likelihoodsAsString_PLs) {
-        if ( !likelihoodsAsString_PLs.equals(VCFConstants.MISSING_VALUE_v4) ) {
-            String[] strings = likelihoodsAsString_PLs.split(",");
-            double[] likelihoodsAsVector = new double[strings.length];
-            try {
-                for ( int i = 0; i < strings.length; i++ ) {
-                    likelihoodsAsVector[i] = Integer.parseInt(strings[i]) / -10.0;
-                }
-            } catch (NumberFormatException e) {
-                throw new TribbleException("The GL/PL tag contains non-integer values: " + likelihoodsAsString_PLs);
-            }
-            return likelihoodsAsVector;
-        } else
-            return null;
-    }
-
-    /**
-     * Back-compatibility function to read old style GL formatted genotype likelihoods in VCF format
-     * @param GLString
-     * @return
-     */
-    private final static double[] parseDeprecatedGLString(String GLString) {
-        if ( !GLString.equals(VCFConstants.MISSING_VALUE_v4) ) {
-            String[] strings = GLString.split(",");
-            double[] likelihoodsAsVector = new double[strings.length];
-            for ( int i = 0; i < strings.length; i++ ) {
-                likelihoodsAsVector[i] = Double.parseDouble(strings[i]);
-            }
-            return likelihoodsAsVector;
-        }
-
-        return null;
-    }
-
-    private final static String convertLikelihoodsToPLString(final double[] GLs) {
-        if ( GLs == null )
-            return VCFConstants.MISSING_VALUE_v4;
-
-        final StringBuilder s = new StringBuilder();
-        boolean first = true;
-        for ( final int pl : GLsToPLs(GLs) ) {
-            if ( ! first )
-                s.append(',');
-            else
-                first = false;
-
-            s.append(pl);
-        }
-
-        return s.toString();
-    }
-
-    private final static int[] GLsToPLs(final double[] GLs) {
-        final int[] pls = new int[GLs.length];
-        final double adjust = maxPL(GLs);
-
-        for ( int i = 0; i < GLs.length; i++ ) {
-            pls[i] = (int)Math.round(Math.min(-10 * (GLs[i] - adjust), MAX_PL));
-        }
-
-        return pls;
-    }
-
-    private final static double maxPL(final double[] GLs) {
-        double adjust = Double.NEGATIVE_INFINITY;
-        for ( double l : GLs ) adjust = Math.max(adjust, l);
-        return adjust;
-    }
-
-    private final static double[] PLsToGLs(final int pls[]) {
-        double[] likelihoodsAsVector = new double[pls.length];
-        for ( int i = 0; i < pls.length; i++ ) {
-            likelihoodsAsVector[i] = pls[i] / -10.0;
-        }
-        return likelihoodsAsVector;
-    }
-
-    // -------------------------------------------------------------------------------------
-    //
-    // Static conversion utilities, going from GL/PL index to allele index and vice versa.
-    //
-    // -------------------------------------------------------------------------------------
-
-    /*
-    * Class representing the 2 alleles (or rather their indexes into VariantContext.getAllele()) corresponding to a specific PL index.
-    * Note that the reference allele is always index=0.
-    */
-    public static class GenotypeLikelihoodsAllelePair {
-        public final int alleleIndex1, alleleIndex2;
-
-        public GenotypeLikelihoodsAllelePair(final int alleleIndex1, final int alleleIndex2) {
-            this.alleleIndex1 = alleleIndex1;
-            this.alleleIndex2 = alleleIndex2;
-        }
-    }
-
-    /**
-     * Calculate the cache of diploid alleles for each PL index
-     *
-     * @param altAlleles   number of alternate alleles
-     * @return cache of diploid alleles for each PL index
-     */
-    private static GenotypeLikelihoodsAllelePair[] calculateDiploidPLcache(final int altAlleles) {
-        final int numLikelihoods = numLikelihoods(1 + altAlleles, 2);
-        final GenotypeLikelihoodsAllelePair[] cache = new GenotypeLikelihoodsAllelePair[numLikelihoods];
-
-        // for all possible combinations of 2 alleles
-        for ( int allele1 = 0; allele1 <= altAlleles; allele1++ ) {
-            for ( int allele2 = allele1; allele2 <= altAlleles; allele2++ ) {
-                cache[calculatePLindex(allele1, allele2)] = new GenotypeLikelihoodsAllelePair(allele1, allele2);
-            }
-        }
-
-        // a bit of sanity checking
-        for ( int i = 0; i < cache.length; i++ ) {
-            if ( cache[i] == null )
-                throw new IllegalStateException("BUG: cache entry " + i + " is unexpected null");
-        }
-
-        return cache;
-    }
-
-
-    /**
-     * Calculate the alleles for each PL index for a ploidy.
-     * Creates the ordering for all possible combinations of ploidy alleles. Computed recursively and the
-     * result is stored in a cache.
-     *
-     * The implementation is described in The Variant Call Format Specification VCF 4.3, Section 1.6.2 Genotype fields
-     * The likelihoods are ordered for ploidy P and N alternate alleles as follows:
-     * for aP = 0...N
-     *  for aP-1 = 0...aP
-     *      ...
-     *      for a1 = 0...a2
-     *          a1,a2..aP
-     *
-     * This is implemented recursively:
-     *
-     * PLIndexToAlleleIndices(N, P, suffix=empty):
-     *      for a in 0...N
-     *          if (P == 1) accum += (a + suffix)  // have all the alleles for a PL index
-     *          if (P > 1) PLIndexToAlleleIndices(a, P-1, a + suffix )
-     *
-     * @param altAlleles     Number of alternate alleles
-     * @param ploidy         Number of chromosomes in set
-     * @param anyploidPLIndexToAlleleIndices PL index to the alleles of general ploidy over all possible alternate alleles
-     * @param genotype       An entry of ploidy alleles
-     */
-    private static void calculatePLIndexToAlleleIndices(final int altAlleles, final int ploidy, final List<List<Integer>> anyploidPLIndexToAlleleIndices,
-                                                   final List<Integer> genotype) {
-        for (int a=0; a <= altAlleles; a++) {
-            final List<Integer> gt = new ArrayList<Integer>(Arrays.asList(a));
-            gt.addAll(genotype);
-            if ( ploidy == 1 ) {// have all ploidy alleles for a PL index
-                anyploidPLIndexToAlleleIndices.add(gt);
-            } else if ( ploidy > 1 ) {
-                calculatePLIndexToAlleleIndices(a, ploidy - 1, anyploidPLIndexToAlleleIndices, gt);
-            }
-        }
-    }
-
-    /**
-     * Calculate the cache of allele indices for each PL index for a ploidy.
-     * Calculation in @see #calculatePLIndexToAlleleIndices
-     *
-     * @param altAlleles Number of alternate alleles
-     * @param ploidy    Number of chromosomes in set
-     * @return PL index to the alleles of general ploidy over all possible alternate alleles
-     * @return The alleles for each PL index for a ploidy
-     */
-    protected static List<List<Integer>> calculateAnyploidPLcache(final int altAlleles, final int ploidy) {
-        List<List<Integer>> anyploidPLIndexToAlleleIndices = new ArrayList<List<Integer>>();
-        calculatePLIndexToAlleleIndices(altAlleles, ploidy, anyploidPLIndexToAlleleIndices, new ArrayList<Integer>());
-        return anyploidPLIndexToAlleleIndices;
-    }
-
-    // -------------------------------------------------------------------------------------
-    //
-    // num likelihoods given number of alleles and ploidy
-    //
-    // -------------------------------------------------------------------------------------
-
-    /**
-     * Actually does the computation in @see #numLikelihoods
-     *
-     * @param numAlleles    number of alleles
-     * @param ploidy        number of chromosomes
-     * @return  number of likelihoods
-     */
-    private static final int calcNumLikelihoods(final int numAlleles, final int ploidy) {
-        if (numAlleles == 1)
-            return 1;
-        else if (ploidy == 1)
-            return numAlleles;
-        else {
-            int acc =0;
-            for (int k=0; k <= ploidy; k++ )
-                acc += calcNumLikelihoods(numAlleles - 1, ploidy - k);
-            return acc;
-        }
-    }
-
-    /**
-     * Compute how many likelihood elements are associated with the given number of alleles
-     * Equivalent to asking in how many ways N non-negative integers can add up to P is S(N,P)
-     * where P = ploidy (number of chromosomes) and N = total # of alleles.
-     * Each chromosome can be in one single state (0,...,N-1) and there are P of them.
-     * Naive solution would be to store N*P likelihoods, but this is not necessary because we can't distinguish chromosome states, but rather
-     * only total number of alt allele counts in all chromosomes.
-     *
-     * For example, S(3,2) = 6: For alleles A,B,C, on a diploid organism we have six possible genotypes:
-     * AA,AB,BB,AC,BC,CC.
-     * Another way of expressing is with vector (#of A alleles, # of B alleles, # of C alleles)
-     * which is then, for ordering above, (2,0,0), (1,1,0), (0,2,0), (1,1,0), (0,1,1), (0,0,2)
-     * In general, for P=2 (regular biallelic), then S(N,2) = N*(N+1)/2
-     *
-     * Note this method caches the value for most common num Allele / ploidy combinations for efficiency
-     *
-     * Recursive implementation:
-     *   S(N,P) = sum_{k=0}^P S(N-1,P-k)
-     *  because if we have N integers, we can condition 1 integer to be = k, and then N-1 integers have to sum to P-K
-     * With initial conditions
-     *   S(N,1) = N  (only way to have N integers add up to 1 is all-zeros except one element with a one. There are N of these vectors)
-     *   S(1,P) = 1 (only way to have 1 integer add to P is with that integer P itself).
-     *
-     *   @param  numAlleles      Number of alleles (including ref)
-     *   @param  ploidy          Ploidy, or number of chromosomes in set
-     *   @return    Number of likelihood elements we need to hold.
-     */
-    public static int numLikelihoods(final int numAlleles, final int ploidy) {
-        if ( numAlleles < NUM_LIKELIHOODS_CACHE_N_ALLELES
-                && ploidy < NUM_LIKELIHOODS_CACHE_PLOIDY )
-            return numLikelihoodCache[numAlleles][ploidy];
-        else {
-            // have to calculate on the fly
-            return calcNumLikelihoods(numAlleles, ploidy);
-        }
-    }
-
-    // As per the VCF spec: "the ordering of genotypes for the likelihoods is given by: F(j/k) = (k*(k+1)/2)+j.
-    // In other words, for biallelic sites the ordering is: AA,AB,BB; for triallelic sites the ordering is: AA,AB,BB,AC,BC,CC, etc."
-    // Assumes that allele1Index < allele2Index
-    public static int calculatePLindex(final int allele1Index, final int allele2Index) {
-        return (allele2Index * (allele2Index+1) / 2) + allele1Index;
-    }
-
-
-    /**
-     * Get the diploid allele index pair for the given PL index
-     *
-     * @param PLindex   the PL index
-     * @return the diploid allele index pair
-     * @throws IllegalStateException if PLindex is negative value or greater than the cache computed by @see #calculateDiploidPLcache
-     */
-    public static GenotypeLikelihoodsAllelePair getAllelePair(final int PLindex) {
-        // check the index, make sure that we've cached enough data
-        if ( PLindex < 0 || PLindex >= diploidPLIndexToAlleleIndex.length ) {
-            final String msg = "The PL index " + PLindex + " cannot be " + (PLindex < 0 ? " negative" : " more than " + (diploidPLIndexToAlleleIndex.length - 1));
-            throw new IllegalStateException(msg);
-        }
-
-        return diploidPLIndexToAlleleIndex[PLindex];
-    }
-
-    /**
-     * Initialize cache of allele anyploid indices
-     * If initialized multiple times with the same ploidy, the alternate alleles from the last initialization will be used
-     *
-     * @param altAlleles number of alternate alleles
-     * @param ploidy    number of chromosomes
-     * @throws IllegalArgumentException if altAlleles or ploidy &lt= 0
-     */
-    public static synchronized void initializeAnyploidPLIndexToAlleleIndices(final int altAlleles, final int ploidy) {
-        if ( altAlleles <= 0 )
-            throw new IllegalArgumentException("Must have at least one alternate allele, not " + altAlleles );
-
-        if ( ploidy <= 0 )
-            throw new IllegalArgumentException("Ploidy must be at least 1, not " + ploidy);
-
-        // create the allele indices for each PL index for a ploidy
-        anyploidPloidyToPLIndexToAlleleIndices.put(ploidy, calculateAnyploidPLcache(altAlleles, ploidy));
-    }
-
-    /**
-     * Get the allele ploidy indices for the given PL index
-     * Must use the same ploidy as @see #initializeAnyploidPLIndexToAlleleIndices
-     *
-     * @param PLindex   the PL index
-     * @param ploidy    number of chromosomes
-     * @return the ploidy allele indices
-     * @throws IllegalStateException if @see #anyploidPloidyToPLIndexToAlleleIndices does not contain the requested ploidy or PL index
-     */
-    public static synchronized List<Integer> getAlleles(final int PLindex, final int ploidy) {
-        if ( ploidy == 2 ) { // diploid
-            final GenotypeLikelihoodsAllelePair pair = getAllelePair(PLindex);
-            return Arrays.asList(pair.alleleIndex1, pair.alleleIndex2);
-        } else { // non-diploid
-            if (!anyploidPloidyToPLIndexToAlleleIndices.containsKey(ploidy))
-                throw new IllegalStateException("Must initialize the cache of allele anyploid indices for ploidy " + ploidy);
-
-            if (PLindex < 0 || PLindex >= anyploidPloidyToPLIndexToAlleleIndices.get(ploidy).size()) {
-                final String msg = "The PL index " + PLindex + " does not exist for " + ploidy + " ploidy, " +
-                        (PLindex < 0 ? "cannot have a negative value." : "initialized the cache of allele anyploid indices with the incorrect number of alternate alleles.");
-                throw new IllegalStateException(msg);
-            }
-
-            return anyploidPloidyToPLIndexToAlleleIndices.get(ploidy).get(PLindex);
-        }
-    }
-
-    // An index conversion from the deprecated PL ordering to the new VCF-based ordering for up to 3 alternate alleles
-    protected static final int[] PLindexConversion = new int[]{0, 1, 3, 6, 2, 4, 7, 5, 8, 9};
-
-    /**
-     * get the allele index pair for the given PL using the deprecated PL ordering:
-     *    AA,AB,AC,AD,BB,BC,BD,CC,CD,DD instead of AA,AB,BB,AC,BC,CC,AD,BD,CD,DD.
-     * Although it's painful to keep this conversion around, our DiploidSNPGenotypeLikelihoods class uses the deprecated
-     *    ordering and I know with certainty that external users have built code on top of it; changing it now would
-     *    cause a whole lot of heartache for our collaborators, so for now at least there's a standard conversion method.
-     * This method assumes at most 3 alternate alleles.
-     *
-     * @param PLindex   the PL index
-     * @return the allele index pair
-     */
-    @Deprecated
-    public static GenotypeLikelihoodsAllelePair getAllelePairUsingDeprecatedOrdering(final int PLindex) {
-        return getAllelePair(PLindexConversion[PLindex]);
-    }
-
-    /**
-     * get the PL indexes (AA, AB, BB) for the given allele pair; assumes allele1Index <= allele2Index.
-     *
-     * @param allele1Index    the index in VariantContext.getAllele() of the first allele
-     * @param allele2Index    the index in VariantContext.getAllele() of the second allele
-     * @return the PL indexes
-     */
-    public static int[] getPLIndecesOfAlleles(final int allele1Index, final int allele2Index) {
-
-        final int[] indexes = new int[3];
-        indexes[0] = calculatePLindex(allele1Index, allele1Index);
-        indexes[1] = calculatePLindex(allele1Index, allele2Index);
-        indexes[2] = calculatePLindex(allele2Index, allele2Index);
-        return indexes;
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/GenotypeType.java b/src/main/java/htsjdk/variant/variantcontext/GenotypeType.java
deleted file mode 100644
index d549d97..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/GenotypeType.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-/**
- * Summary types for Genotype objects
- *
- * @author Your Name
- * @since Date created
- */
-public enum GenotypeType {
-    /** The sample is no-called (all alleles are NO_CALL */
-    NO_CALL,
-    /** The sample is homozygous reference */
-    HOM_REF,
-    /** The sample is heterozygous, with at least one ref and at least one one alt in any order */
-    HET,
-    /** All alleles are non-reference */
-    HOM_VAR,
-    /** There is no allele data availble for this sample (alleles.isEmpty) */
-    UNAVAILABLE,
-    /** Some chromosomes are NO_CALL and others are called */
-    MIXED  // no-call and call in the same genotype
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/GenotypesContext.java b/src/main/java/htsjdk/variant/variantcontext/GenotypesContext.java
deleted file mode 100644
index c146875..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/GenotypesContext.java
+++ /dev/null
@@ -1,719 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Represents an ordered collection of Genotype objects
- */
-public class GenotypesContext implements List<Genotype>, Serializable {
-    public static final long serialVersionUID = 1L;
-
-    /**
-     * static constant value for an empty GenotypesContext.  Useful since so many VariantContexts have no genotypes
-     */
-    public final static GenotypesContext NO_GENOTYPES =
-            new GenotypesContext(new ArrayList<Genotype>(0), new HashMap<String, Integer>(0), Collections.<String>emptyList()).immutable();
-
-    /**
-     *sampleNamesInOrder a list of sample names, one for each genotype in genotypes, sorted in alphabetical order
-     */
-    protected List<String> sampleNamesInOrder = null;
-
-    /**
-     * a map optimized for efficient lookup.  Each genotype in genotypes must have its
-     * sample name in sampleNameToOffset, with a corresponding integer value that indicates the offset of that
-     * genotype in the vector of genotypes
-     */
-    protected Map<String, Integer> sampleNameToOffset = null;
-
-    /**
-     * An ArrayList of genotypes contained in this context
-     *
-     * WARNING: TO ENABLE THE LAZY VERSION OF THIS CLASS, NO METHODS SHOULD DIRECTLY
-     * ACCESS THIS VARIABLE.  USE getGenotypes() INSTEAD.
-     *
-     */
-    protected ArrayList<Genotype> notToBeDirectlyAccessedGenotypes;
-
-    /**
-     * Cached value of the maximum ploidy observed among all samples
-     */
-    private int maxPloidy = -1;
-
-    /** Are we allowing users to modify the list? */
-    private boolean immutable = false;
-
-    /**
-     * Custom serialization routine. Needed to ensure that we decode any lazily-decoded data
-     * before serialization.
-     *
-     * @param out stream to which to serialize this object
-     */
-    private void writeObject(ObjectOutputStream out) throws IOException {
-        // If we're a LazyGenotypesContext, decode the genotype data before serialization.
-        //
-        // Ugly, but we can't do this in LazyGenotypesContext.writeObject(), since
-        // by the time that's called we'll already have serialized the superclass
-        // data in GenotypesContext, and we need to make sure that we decode any lazy
-        // data BEFORE serializing the fields in GenotypesContext.
-        if ( getClass() == LazyGenotypesContext.class ) {
-            ((LazyGenotypesContext)this).decode();
-        }
-
-        out.defaultWriteObject();
-    }
-
-    // ---------------------------------------------------------------------------
-    //
-    // private constructors -- you have to use static create methods to make these classes
-    //
-    // ---------------------------------------------------------------------------
-
-    /**
-     * Create an empty GenotypeContext
-     */
-    protected GenotypesContext() {
-        this(10);
-    }
-
-    /**
-     * Create an empty GenotypeContext, with initial capacity for n elements
-     */
-    protected GenotypesContext(final int n) {
-        this(new ArrayList<Genotype>(n));
-    }
-
-    /**
-     * Create an GenotypeContext containing genotypes
-     */
-    protected GenotypesContext(final ArrayList<Genotype> genotypes) {
-        this.notToBeDirectlyAccessedGenotypes = genotypes;
-        this.sampleNameToOffset = null;
-    }
-
-    /**
-     * Create a fully resolved GenotypeContext containing genotypes, sample lookup table,
-     * and sorted sample names
-     *
-     * @param genotypes our genotypes in arbitrary
-     * @param sampleNameToOffset map optimized for efficient lookup.  Each genotype in genotypes must have its
-     * sample name in sampleNameToOffset, with a corresponding integer value that indicates the offset of that
-     * genotype in the vector of genotypes
-     * @param sampleNamesInOrder a list of sample names, one for each genotype in genotypes, sorted in alphabetical
-     * order.
-     */
-    protected GenotypesContext(final ArrayList<Genotype> genotypes,
-                             final Map<String, Integer> sampleNameToOffset,
-                             final List<String> sampleNamesInOrder) {
-        this.notToBeDirectlyAccessedGenotypes = genotypes;
-        this.sampleNameToOffset = sampleNameToOffset;
-        this.sampleNamesInOrder = sampleNamesInOrder;
-    }
-
-    // ---------------------------------------------------------------------------
-    //
-    // public static factory methods
-    //
-    // ---------------------------------------------------------------------------
-
-    /**
-     * Basic creation routine
-     * @return an empty, mutable GenotypeContext
-     */
-    public static final GenotypesContext create() {
-        return new GenotypesContext();
-    }
-
-    /**
-     * Basic creation routine
-     * @return an empty, mutable GenotypeContext with initial capacity for nGenotypes
-     */
-    public static final GenotypesContext create(final int nGenotypes) {
-        return new GenotypesContext(nGenotypes);
-    }
-
-    /**
-     * Create a fully resolved GenotypeContext containing genotypes, sample lookup table,
-     * and sorted sample names
-     *
-     * @param genotypes our genotypes in arbitrary
-     * @param sampleNameToOffset map optimized for efficient lookup.  Each genotype in genotypes must have its
-     * sample name in sampleNameToOffset, with a corresponding integer value that indicates the offset of that
-     * genotype in the vector of genotypes
-     * @param sampleNamesInOrder a list of sample names, one for each genotype in genotypes, sorted in alphabetical
-     * order.
-     * @return an mutable GenotypeContext containing genotypes with already present lookup data
-     */
-    public static final GenotypesContext create(final ArrayList<Genotype> genotypes,
-                                                final Map<String, Integer> sampleNameToOffset,
-                                                final List<String> sampleNamesInOrder) {
-        return new GenotypesContext(genotypes, sampleNameToOffset, sampleNamesInOrder);
-    }
-
-    /**
-     * Create a fully resolved GenotypeContext containing genotypes
-     *
-     * @param genotypes our genotypes in arbitrary
-     * @return an mutable GenotypeContext containing genotypes
-     */
-    public static final GenotypesContext create(final ArrayList<Genotype> genotypes) {
-        return genotypes == null ? NO_GENOTYPES : new GenotypesContext(genotypes);
-    }
-
-    /**
-     * Create a fully resolved GenotypeContext containing genotypes
-     *
-     * @param genotypes our genotypes in arbitrary
-     * @return an mutable GenotypeContext containing genotypes
-     */
-    public static final GenotypesContext create(final Genotype... genotypes) {
-        return create(new ArrayList<Genotype>(Arrays.asList(genotypes)));
-    }
-
-    /**
-     * Create a freshly allocated GenotypeContext containing the genotypes in toCopy
-     *
-     * @param toCopy the GenotypesContext to copy
-     * @return an mutable GenotypeContext containing genotypes
-     */
-    public static final GenotypesContext copy(final GenotypesContext toCopy) {
-        return create(new ArrayList<Genotype>(toCopy.getGenotypes()));
-    }
-
-    /**
-     * Create a GenotypesContext containing the genotypes in iteration order contained
-     * in toCopy
-     *
-     * @param toCopy the collection of genotypes
-     * @return an mutable GenotypeContext containing genotypes
-     */
-    public static final GenotypesContext copy(final Collection<Genotype> toCopy) {
-        return toCopy == null ? NO_GENOTYPES : create(new ArrayList<Genotype>(toCopy));
-    }
-
-    // ---------------------------------------------------------------------------
-    //
-    // Mutability methods
-    //
-    // ---------------------------------------------------------------------------
-
-    public final GenotypesContext immutable() {
-        immutable = true;
-        return this;
-    }
-
-    public boolean isMutable() {
-        return ! immutable;
-    }
-
-    public final void checkImmutability() {
-        if ( immutable )
-            throw new IllegalAccessError("GenotypeMap is currently immutable, but a mutator method was invoked on it");
-    }
-
-    // ---------------------------------------------------------------------------
-    //
-    // caches
-    //
-    // ---------------------------------------------------------------------------
-
-    protected void invalidateSampleNameMap() {
-        sampleNameToOffset = null;
-    }
-
-    protected void invalidateSampleOrdering() {
-        sampleNamesInOrder = null;
-    }
-
-    protected void ensureSampleOrdering() {
-        if ( sampleNamesInOrder == null ) {
-            sampleNamesInOrder = new ArrayList<String>(size());
-
-            for ( int i = 0; i < size(); i++ ) {
-                sampleNamesInOrder.add(getGenotypes().get(i).getSampleName());
-            }
-            Collections.sort(sampleNamesInOrder);
-        }
-    }
-
-    protected void ensureSampleNameMap() {
-        if ( sampleNameToOffset == null ) {
-            sampleNameToOffset = new HashMap<String, Integer>(size());
-
-            for ( int i = 0; i < size(); i++ ) {
-                sampleNameToOffset.put(getGenotypes().get(i).getSampleName(), i);
-            }
-        }
-    }
-
-    // ---------------------------------------------------------------------------
-    //
-    // Lazy methods
-    //
-    // ---------------------------------------------------------------------------
-
-    public boolean isLazyWithData() {
-        return this instanceof LazyGenotypesContext &&
-                ((LazyGenotypesContext)this).getUnparsedGenotypeData() != null;
-    }
-
-    // ---------------------------------------------------------------------------
-    //
-    // Map methods
-    //
-    // ---------------------------------------------------------------------------
-
-    protected ArrayList<Genotype> getGenotypes() {
-        return notToBeDirectlyAccessedGenotypes;
-    }
-
-    @Override
-    public void clear() {
-        checkImmutability();
-        invalidateSampleNameMap();
-        invalidateSampleOrdering();
-        getGenotypes().clear();
-    }
-
-    @Override
-    public int size() {
-        return getGenotypes().size();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return getGenotypes().isEmpty();
-    }
-
-    /**
-     * Adds a single genotype to this context.
-     *
-     * There are many constraints on this input, and important
-     * impacts on the performance of other functions provided by this
-     * context.
-     *
-     * First, the sample name of genotype must be unique within this
-     * context.  However, this is not enforced in the code itself, through
-     * you will invalid the contract on this context if you add duplicate
-     * samples and are running with CoFoJa enabled.
-     *
-     * Second, adding genotype also updates the sample name -> index map,
-     * so add() followed by containsSample and related function is an efficient
-     * series of operations.
-     *
-     * Third, adding the genotype invalidates the sorted list of sample names, to
-     * add() followed by any of the SampleNamesInOrder operations is inefficient, as
-     * each SampleNamesInOrder must rebuild the sorted list of sample names at
-     * an O(n log n) cost.
-     *
-     * @param genotype
-     * @return
-     */
-    @Override
-    public boolean add(final Genotype genotype) {
-        checkImmutability();
-        invalidateSampleOrdering();
-
-        if ( sampleNameToOffset != null ) {
-            // update the name map by adding entries
-            sampleNameToOffset.put(genotype.getSampleName(), size());
-        }
-
-        return getGenotypes().add(genotype);
-    }
-
-    @Override
-    public void add(final int i, final Genotype genotype) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Adds all of the genotypes to this context
-     *
-     * See {@link #add(Genotype)} for important information about this functions
-     * constraints and performance costs
-     *
-     * @param genotypes
-     * @return
-     */
-    @Override
-    public boolean addAll(final Collection<? extends Genotype> genotypes) {
-        checkImmutability();
-        invalidateSampleOrdering();
-
-        if ( sampleNameToOffset != null ) {
-            // update the name map by adding entries
-            int pos = size();
-            for ( final Genotype g : genotypes ) {
-                sampleNameToOffset.put(g.getSampleName(), pos++);
-            }
-        }
-
-        return getGenotypes().addAll(genotypes);
-    }
-
-    @Override
-    public boolean addAll(final int i, final Collection<? extends Genotype> genotypes) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public boolean contains(final Object o) {
-        return getGenotypes().contains(o);
-    }
-
-    @Override
-    public boolean containsAll(final Collection<?> objects) {
-        return getGenotypes().containsAll(objects);
-    }
-
-    private boolean containsAny(final Collection<? extends Genotype> genotypes) {
-        for ( final Genotype g : genotypes ) {
-            if ( contains(g) ) return true;
-        }
-        return false;
-    }
-
-    @Override
-    public Genotype get(final int i) {
-        return getGenotypes().get(i);
-    }
-
-    /**
-     * What is the max ploidy among all samples?  Returns defaultPloidy if no genotypes are present
-     *
-     * @param defaultPloidy the default ploidy, if all samples are no-called
-     * @return
-     */
-    public int getMaxPloidy(final int defaultPloidy) {
-        if ( defaultPloidy < 0 ) throw new IllegalArgumentException("defaultPloidy must be greater than or equal to 0");
-
-        if ( maxPloidy == -1 ) {
-            maxPloidy = 0; // necessary in the case where there are no genotypes
-            for ( final Genotype g : getGenotypes() ) {
-                maxPloidy = Math.max(g.getPloidy(), maxPloidy);
-            }
-
-            // everything is no called so we return the default ploidy
-            if ( maxPloidy == 0 ) maxPloidy = defaultPloidy;
-        }
-
-        return maxPloidy;
-    }
-
-    /**
-     * Gets sample associated with this sampleName, or null if none is found
-     *
-     * @param sampleName
-     * @return
-     */
-    public Genotype get(final String sampleName) {
-        Integer offset = getSampleI(sampleName);
-        return offset == null ? null : getGenotypes().get(offset);
-    }
-
-    private Integer getSampleI(final String sampleName) {
-        ensureSampleNameMap();
-        return sampleNameToOffset.get(sampleName);
-    }
-
-    @Override
-    public int indexOf(final Object o) {
-        return getGenotypes().indexOf(o);
-    }
-
-    @Override
-    public Iterator<Genotype> iterator() {
-        return getGenotypes().iterator();
-    }
-
-    @Override
-    public int lastIndexOf(final Object o) {
-        return getGenotypes().lastIndexOf(o);
-    }
-
-    @Override
-    public ListIterator<Genotype> listIterator() {
-        // todo -- must be immutable
-        throw new UnsupportedOperationException();
-//        return genotypes.listIterator();
-    }
-
-    @Override
-    public ListIterator<Genotype> listIterator(final int i) {
-        // todo -- must be immutable
-        throw new UnsupportedOperationException();
-//        return genotypes.listIterator(i);
-    }
-
-    /**
-     * Note that remove requires us to invalidate our sample -> index
-     * cache.  The loop:
-     *
-     * GenotypesContext gc = ...
-     * for ( sample in samples )
-     *   if ( gc.containsSample(sample) )
-     *     gc.remove(sample)
-     *
-     * is extremely inefficient, as each call to remove invalidates the cache
-     * and containsSample requires us to rebuild it, an O(n) operation.
-     *
-     * If you must remove many samples from the GC, use either removeAll or retainAll
-     * to avoid this O(n * m) operation.
-     *
-     * @param i
-     * @return
-     */
-    @Override
-    public Genotype remove(final int i) {
-        checkImmutability();
-        invalidateSampleNameMap();
-        invalidateSampleOrdering();
-        return getGenotypes().remove(i);
-    }
-
-    /**
-     * See for important warning {@link #remove(int)}
-     * @param o
-     * @return
-     */
-    @Override
-    public boolean remove(final Object o) {
-        checkImmutability();
-        invalidateSampleNameMap();
-        invalidateSampleOrdering();
-        return getGenotypes().remove(o);
-    }
-
-    @Override
-    public boolean removeAll(final Collection<?> objects) {
-        checkImmutability();
-        invalidateSampleNameMap();
-        invalidateSampleOrdering();
-        return getGenotypes().removeAll(objects);
-    }
-
-    @Override
-    public boolean retainAll(final Collection<?> objects) {
-        checkImmutability();
-        invalidateSampleNameMap();
-        invalidateSampleOrdering();
-        return getGenotypes().retainAll(objects);
-    }
-
-    @Override
-    public Genotype set(final int i, final Genotype genotype) {
-        checkImmutability();
-        final Genotype prev = getGenotypes().set(i, genotype);
-
-        invalidateSampleOrdering();
-        if ( sampleNameToOffset != null ) {
-            // update the name map by removing the old entry and replacing it with the new one
-            sampleNameToOffset.remove(prev.getSampleName());
-            sampleNameToOffset.put(genotype.getSampleName(), i);
-        }
-
-        return prev;
-    }
-
-    /**
-     * Replaces the genotype in this context -- note for efficiency
-     * reasons we do not add the genotype if it's not present.  The
-     * return value will be null indicating this happened.
-     *
-     * Note this operation is preserves the map cache Sample -> Offset but
-     * invalidates the sorted list of samples.  Using replace within a loop
-     * containing any of the SampleNameInOrder operation requires an O(n log n)
-     * resorting after each replace operation.
-     *
-     * @param genotype a non null genotype to bind in this context
-     * @return null if genotype was not added, otherwise returns the previous genotype
-     */
-    public Genotype replace(final Genotype genotype) {
-        checkImmutability();
-        Integer offset = getSampleI(genotype.getSampleName());
-        if ( offset == null )
-            return null;
-        else
-            return set(offset, genotype);
-    }
-
-    @Override
-    public List<Genotype> subList(final int i, final int i1) {
-        return getGenotypes().subList(i, i1);
-    }
-
-    @Override
-    public Object[] toArray() {
-        return getGenotypes().toArray();
-    }
-
-    @Override
-    public <T> T[] toArray(final T[] ts) {
-        return getGenotypes().toArray(ts);
-    }
-
-    /**
-     * Iterate over the Genotypes in this context in the order specified by sampleNamesInOrder
-     *
-     * @param sampleNamesInOrder a Iterable of String, containing exactly one entry for each Genotype sample name in
-     * this context
-     * @return a Iterable over the genotypes in this context.
-     */
-    public Iterable<Genotype> iterateInSampleNameOrder(final Iterable<String> sampleNamesInOrder) {
-        return new Iterable<Genotype>() {
-            @Override
-            public Iterator<Genotype> iterator() {
-                return new InOrderIterator(sampleNamesInOrder.iterator());
-            }
-        };
-    }
-
-    /**
-     * Iterate over the Genotypes in this context in their sample name order (A, B, C)
-     * regardless of the underlying order in the vector of genotypes
-     * @return a Iterable over the genotypes in this context.
-     */
-    public Iterable<Genotype> iterateInSampleNameOrder() {
-        return iterateInSampleNameOrder(getSampleNamesOrderedByName());
-    }
-
-    private final class InOrderIterator implements Iterator<Genotype> {
-        final Iterator<String> sampleNamesInOrder;
-
-        private InOrderIterator(final Iterator<String> sampleNamesInOrder) {
-            this.sampleNamesInOrder = sampleNamesInOrder;
-        }
-
-        @Override
-        public boolean hasNext() {
-            return sampleNamesInOrder.hasNext();
-        }
-
-        @Override
-        public Genotype next() {
-            return get(sampleNamesInOrder.next());
-        }
-
-        @Override
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-    }
-
-    /**
-     * @return The set of sample names for all genotypes in this context, in arbitrary order
-     */
-    public Set<String> getSampleNames() {
-        ensureSampleNameMap();
-        return sampleNameToOffset.keySet();
-    }
-
-    /**
-     * @return The set of sample names for all genotypes in this context, in their natural ordering (A, B, C)
-     */
-    public List<String> getSampleNamesOrderedByName() {
-        ensureSampleOrdering();
-        return sampleNamesInOrder;
-    }
-
-    public boolean containsSample(final String sample) {
-        ensureSampleNameMap();
-        return sampleNameToOffset.containsKey(sample);
-    }
-
-    public boolean containsSamples(final Collection<String> samples) {
-        return getSampleNames().containsAll(samples);
-    }
-
-    /**
-     * Return a freshly allocated subcontext of this context containing only the samples
-     * listed in samples.  Note that samples can contain names not in this context, they
-     * will just be ignored.
-     *
-     * @param samples
-     * @return
-     */
-    public GenotypesContext subsetToSamples( final Set<String> samples ) {
-        final int nSamples = samples.size();
-
-        if ( nSamples == 0 )
-            return NO_GENOTYPES;
-        else { // nGenotypes < nSamples
-            final GenotypesContext subset = create(samples.size());
-            for ( final String sample : samples ) {
-                final Genotype g = get(sample);
-                if ( g != null )
-                    subset.add(g);
-            }
-            return subset;
-        }
-    }
-
-    @Override
-    public String toString() {
-        final List<String> gS = new ArrayList<String>();
-        for ( final Genotype g : this.iterateInSampleNameOrder() )
-            gS.add(g.toString());
-        return "[" + join(",", gS) + "]";
-    }
-
-    // copied from Utils
-    private static <T> String join(final String separator, final Collection<T> objects) {
-        if (objects.isEmpty()) { // fast path for empty collection
-            return "";
-        } else {
-            final Iterator<T> iter = objects.iterator();
-            final T first = iter.next();
-
-            if ( ! iter.hasNext() ) // fast path for singleton collections
-                return first.toString();
-            else { // full path for 2+ collection that actually need a join
-                final StringBuilder ret = new StringBuilder(first.toString());
-                while(iter.hasNext()) {
-                    ret.append(separator);
-                    ret.append(iter.next().toString());
-                }
-                return ret.toString();
-            }
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/JEXLMap.java b/src/main/java/htsjdk/variant/variantcontext/JEXLMap.java
deleted file mode 100644
index 33ec595..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/JEXLMap.java
+++ /dev/null
@@ -1,228 +0,0 @@
-package htsjdk.variant.variantcontext;
-
-import htsjdk.variant.variantcontext.VariantContextUtils.JexlVCMatchExp;
-import org.apache.commons.jexl2.JexlContext;
-import org.apache.commons.jexl2.JexlException;
-import org.apache.commons.jexl2.MapContext;
-
-import java.util.*;
-
-/**
- * This is an implementation of a Map of {@link JexlVCMatchExp} to true or false values.
- * It lazily initializes each value as requested to save as much processing time as possible.
- */
-
-class JEXLMap implements Map<JexlVCMatchExp, Boolean> {
-    /**
-     * If a JEXL expression contains values that are not available in the given context, the default behavior is to
-     * treat that expression as a miss match.
-     */
-    public static final JexlMissingValueTreatment DEFAULT_MISSING_VALUE_TREATMENT = JexlMissingValueTreatment.TREAT_AS_MISMATCH;
-
-    // our variant context and/or Genotype
-    private final VariantContext vc;
-    private final Genotype g;
-
-    private final JexlMissingValueTreatment howToTreatMissingValues;
-
-    /**
-     * our mapping from {@link JexlVCMatchExp} to {@link Boolean}s, which will be set to {@code NULL}
-     * for previously un-cached {@link JexlVCMatchExp}.
-     */
-    private final Map<JexlVCMatchExp,Boolean> jexl;
-
-    // our context
-    private JexlContext jContext = null;
-
-    /**
-     * Construct a new JEXLMap which can evaluate expressions against a specific genotype and variant context
-     * @param jexlCollection collection of expressions to be evaluated
-     * @param vc VariantContext to evaluate expressions against
-     * @param g genotype to evaluate expressions against, may be null
-     * @param howToTreatMissingValues how missing values in vc and g should be treated
-     */
-    public JEXLMap(final Collection<JexlVCMatchExp> jexlCollection, final VariantContext vc, final Genotype g, final JexlMissingValueTreatment howToTreatMissingValues) {
-        this.jexl = initializeMap(jexlCollection);
-        this.vc = vc;
-        this.g = g;
-        this.howToTreatMissingValues = howToTreatMissingValues;
-    }
-
-
-    /**
-     * Construct a new JEXLMap which can evaluate expressions against a specific genotype and variant context
-     * @param jexlCollection collection of expressions to be evaluated
-     * @param vc VariantContext to evaluate expressions against
-     * @param g genotype to evaluate expressions against, may be null
-     *
-     * missing values are treated as false
-     */
-    public JEXLMap(final Collection<JexlVCMatchExp> jexlCollection, final VariantContext vc, final Genotype g) {
-        this(jexlCollection, vc, g, DEFAULT_MISSING_VALUE_TREATMENT);
-    }
-
-    /**
-     * Construct a new JEXLMap which can evaluate expressions against a specific VariantContext
-     * @param jexlCollection collection of expressions to be evaluated
-     * @param vc VariantContext to evaluate expressions against
-     *
-     * missing values are treated as non matches (false)
-     */
-    public JEXLMap(final Collection<JexlVCMatchExp> jexlCollection, final VariantContext vc) {
-        this(jexlCollection, vc, null, DEFAULT_MISSING_VALUE_TREATMENT);
-    }
-
-    /**
-     * Note: due to laziness, this accessor actually modifies the instance by possibly forcing evaluation of an Jexl expression.
-     *
-     * @throws IllegalArgumentException when {@code key} is {@code null} or
-     *                                  when any of the JexlVCMatchExp (i.e. keys) contains invalid Jexl expressions.
-     */
-    public Boolean get(Object key) {
-        if (key == null) {
-            throw new IllegalArgumentException("Query key is null");
-        }
-
-        // if we've already determined the value, return it
-        final Boolean value = jexl.get(key);
-        if (jexl.containsKey(key) && value != null) {
-            return value;
-        }
-
-        // otherwise cast the expression and try again
-        final JexlVCMatchExp exp = (JexlVCMatchExp) key;
-        final boolean matches = evaluateExpression(exp);
-        jexl.put(exp, matches);
-        return matches;
-    }
-
-    /**
-     * do we contain the specified key
-     * @param o the key
-     * @return true if we have a value for that key
-     */
-    public boolean containsKey(Object o) { return jexl.containsKey(o); }
-
-    public Set<JexlVCMatchExp> keySet() {
-        return jexl.keySet();
-    }
-
-    /**
-     * Get all the values of the map, i.e. the {@link Boolean} values.
-     * This is an expensive call, since it evaluates all keys that haven't been evaluated yet.
-     * This is fine if you truly want all the keys, but if you only want a portion, or  know
-     * the keys you want, you would be better off using get() to get them by name.
-     *
-     * Note: due to laziness, this accessor actually modifies the instance by possibly forcing evaluation of an Jexl expression.
-     *
-     * @return a collection of boolean values, representing the results of all the variants evaluated
-     *
-     * @throws IllegalArgumentException when any of the JexlVCMatchExp (i.e. keys) contains invalid Jexl expressions.
-     */
-    public Collection<Boolean> values() {
-        for (final JexlVCMatchExp exp : jexl.keySet()) {
-            jexl.computeIfAbsent(exp, k -> evaluateExpression(exp));
-        }
-        return jexl.values();
-    }
-
-    /**
-     * @return the number of keys, i.e. {@link JexlVCMatchExp}'s held by this mapping.
-     */
-    public int size() {
-        return jexl.size();
-    }
-
-    public boolean isEmpty() { return this.jexl.isEmpty(); }
-
-    public Boolean put(JexlVCMatchExp jexlVCMatchExp, Boolean aBoolean) {
-        return jexl.put(jexlVCMatchExp, aBoolean);
-    }
-
-    public void putAll(Map<? extends JexlVCMatchExp, ? extends Boolean> map) {
-        jexl.putAll(map);
-    }
-
-    /**
-     * Initializes a map and give all keys with null values indicating that they have not yet been evaluated.
-     * The actual value will be computed only when the key is requested via {@link #get(Object)} or {@link #values()}.
-     *
-     * @return an initialized map of jexlExpression -> null
-     */
-    private static Map<JexlVCMatchExp,Boolean> initializeMap(final Collection<JexlVCMatchExp> jexlCollection) {
-        final Map<JexlVCMatchExp,Boolean> jexlMap = new HashMap<>(jexlCollection.size());
-        for (final JexlVCMatchExp exp: jexlCollection) {
-            jexlMap.put(exp, null);
-        }
-
-        return jexlMap;
-    }
-
-    /**
-     * Evaluates a {@link JexlVCMatchExp}'s expression, given the current context (and setup the context if it's {@code null}).
-     *
-     * @param exp the {@link JexlVCMatchExp} to evaluate
-     * @return true if the expression matched the context
-     * @throws IllegalArgumentException when {@code exp} is {@code null}, or
-     *                                  when the Jexl expression in {@code exp} fails to evaluate the JexlContext
-     *                                  constructed with the input VC or genotype.
-     */
-    private boolean evaluateExpression(final JexlVCMatchExp exp) {
-        // if the context is null, we need to create it to evaluate the JEXL expression
-        if (this.jContext == null) {
-            jContext = createContext();
-        }
-
-        try {
-            //TODO figure out of this can ever evaluate to null or if that isn't actually possible
-            final Boolean value = (Boolean) exp.exp.evaluate(jContext);
-            return value == null ? howToTreatMissingValues.getMissingValueOrExplode() : value;
-        } catch (final JexlException.Variable e) {
-            //this occurs when the jexl expression contained a literal that didn't match anything in the given context
-            return howToTreatMissingValues.getMissingValueOrExplode();
-        } catch (final JexlException e) {
-            // todo - might be better if no exception is caught here but let's user decide how to deal with them; note this will propagate to get() and values()
-            throw new IllegalArgumentException(String.format("Invalid JEXL expression detected for %s", exp.name), e);
-        }
-    }
-
-    /**
-     * Create a new JexlContext
-     * This code is where new JEXL context variables should get added.
-     * @return a new jexl context initialized appropriately
-     */
-    private JexlContext createContext() {
-        if (vc == null) {
-            return new MapContext(Collections.emptyMap());
-        } else if (g == null) {
-            return new VariantJEXLContext(vc);
-        } else {
-            return new GenotypeJEXLContext(vc, g);
-        }
-    }
-
-    // //////////////////////////////////////////////////////////////////////////////////////
-    // The Following are unsupported at the moment (date: 2016/08/18)
-    // //////////////////////////////////////////////////////////////////////////////////////
-
-    // this doesn't make much sense to implement, boolean doesn't offer too much variety to deal
-    // with evaluating every key in the internal map.
-    public boolean containsValue(Object o) {
-        throw new UnsupportedOperationException("containsValue() not supported on a JEXLMap");
-    }
-
-    // this doesn't make much sense
-    public Boolean remove(Object o) {
-        throw new UnsupportedOperationException("remove() not supported on a JEXLMap");
-    }
-
-
-    public Set<Entry<JexlVCMatchExp, Boolean>> entrySet() {
-        throw new UnsupportedOperationException("entrySet() not supported on a JEXLMap");
-    }
-
-    // nope
-    public void clear() {
-        throw new UnsupportedOperationException("clear() not supported on a JEXLMap");
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/JexlMissingValueTreatment.java b/src/main/java/htsjdk/variant/variantcontext/JexlMissingValueTreatment.java
deleted file mode 100644
index 204cc3f..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/JexlMissingValueTreatment.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package htsjdk.variant.variantcontext;
-
-import java.util.function.Supplier;
-
-/**
- * How to treat values that appear in a jexl expression but are missing in the context it's applied to
- */
-public enum JexlMissingValueTreatment {
-    /**
-     * Treat expressions with a missing value as a mismatch and evaluate to false
-     */
-    TREAT_AS_MISMATCH(() -> false),
-
-    /**
-     * Treat expressions with a missing value as a match and evaluate to true
-     */
-    TREAT_AS_MATCH(() -> true),
-
-    /**
-     * Treat expressions with a missing value as an error and throw an {@link IllegalArgumentException}
-     */
-    THROW(() -> {throw new IllegalArgumentException("Jexl Expression couldn't be evaluated because there was a missing value.");});
-
-    private final Supplier<Boolean> resultSupplier;
-
-    JexlMissingValueTreatment(final Supplier<Boolean> resultSupplier){
-        this.resultSupplier = resultSupplier;
-    }
-
-    /**
-     * get the missing value that corresponds to this option or throw an exception
-     * @return the value that should be used in case of a missing value
-     * @throws IllegalArgumentException if this should be treated as an error
-     */
-    boolean getMissingValueOrExplode(){
-        return resultSupplier.get();
-    }
-
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/LazyGenotypesContext.java b/src/main/java/htsjdk/variant/variantcontext/LazyGenotypesContext.java
deleted file mode 100644
index f5781cf..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/LazyGenotypesContext.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Lazy-loading GenotypesContext.  A lazy-loading context has access to the
- * VCFParser and a unparsed string of genotype data.  If the user attempts to manipulate
- * the genotypes contained in this context, we decode the data and become a full blown
- * GenotypesContext.  However, if the user never does this we are spared a lot of expense
- * decoding the genotypes unnecessarily.
- */
-public class LazyGenotypesContext extends GenotypesContext {
-
-    /**
-     * The LazyParser we'll use to decode unparsedGenotypeData if necessary.
-     *
-     * Transient because it would be extremely expensive to serialize. Instead, we fully decode
-     * all LazyGenotypesContexts before serializing them.
-     */
-    private transient LazyParser parser;
-
-    /**
-     * Lazily-parsed raw genotype data.
-     *
-     * Transient because since we always fully decode the genotype data before serializing it,
-     * there is never any case where we need to serialize unparsed genotype data.
-     */
-    private transient Object unparsedGenotypeData;
-
-    /**
-     * nUnparsedGenotypes the number of genotypes contained in the unparsedGenotypes data
-     * (known already in the parser).  Useful for isEmpty and size() optimizations
-     */
-    private int nUnparsedGenotypes;
-
-    /**
-     * True if we've already decoded the values in unparsedGenotypeData
-     */
-    private boolean loaded = false;
-
-    /**
-     * Custom de-serialization routine to ensure that all LazyGenotypesContexts we de-serialize
-     * are fully decoded. Throws an IllegalStateException if that is not the case.
-     *
-     * Necessary because the LazyParser required to decode the lazy context is transient.
-     *
-     * Note that the custom writeObject() companion to this method is implemented
-     * in the superclass (GenotypesContext), since decoding lazy data writes to superclass
-     * fields.
-     *
-     * @param in stream from which to de-serialize the LazyGenotypesContext
-     */
-    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        in.defaultReadObject();
-
-        if ( ! loaded || unparsedGenotypeData != null ) {
-            throw new IllegalStateException("Deserialized LazyGenotypesContext is not fully decoded, but is required to have been fully decoded before serialization");
-        }
-    }
-
-    private final static ArrayList<Genotype> EMPTY = new ArrayList<Genotype>(0);
-
-    /**
-     * Simple lazy parser interface.  Provide an object implementing this
-     * interface to LazyGenotypesContext, and it's parse method will be called
-     * when the use of the lazy context requires the underlying genotypes data
-     * be parsed into Genotype objects.  The data argument is the data provided
-     * to the LazyGenotypesContext holding encoded genotypes data
-     */
-    public interface LazyParser {
-        public LazyData parse(Object data);
-    }
-
-    /**
-     * Returns the data used in the full GenotypesContext constructor
-     *
-     * {@link GenotypesContext#GenotypesContext(java.util.ArrayList, java.util.Map, java.util.List)}
-     */
-    public static class LazyData {
-        final ArrayList<Genotype> genotypes;
-        final Map<String, Integer> sampleNameToOffset;
-        final List<String> sampleNamesInOrder;
-
-        public LazyData(final ArrayList<Genotype> genotypes,
-                        final List<String> sampleNamesInOrder,
-                        final Map<String, Integer> sampleNameToOffset) {
-            this.genotypes = genotypes;
-            this.sampleNamesInOrder = sampleNamesInOrder;
-            this.sampleNameToOffset = sampleNameToOffset;
-        }
-    }
-
-    /**
-     * Creates a new lazy loading genotypes context using the LazyParser to create
-     * genotypes data on demand.
-     *
-     * @param parser the parser to be used to load on-demand genotypes data
-     * @param unparsedGenotypeData the encoded genotypes data that we will decode if necessary
-     * @param nUnparsedGenotypes the number of genotypes that will be produced if / when we actually decode the genotypes data
-     */
-    public LazyGenotypesContext(final LazyParser parser, final Object unparsedGenotypeData, final int nUnparsedGenotypes) {
-        super(EMPTY);
-        this.parser = parser;
-        this.unparsedGenotypeData = unparsedGenotypeData;
-        this.nUnparsedGenotypes = nUnparsedGenotypes;
-    }
-
-    /**
-     * Overrides the genotypes accessor.  If we haven't already, decode the genotypes data
-     * and store the decoded results in the appropriate variables.  Otherwise we just
-     * returned the decoded result directly.  Note some care needs to be taken here as
-     * the value in notToBeDirectlyAccessedGenotypes may diverge from what would be produced
-     * by decode, if after the first decode the genotypes themselves are replaced
-     * @return
-     */
-    @Override
-    protected ArrayList<Genotype> getGenotypes() {
-        decode();
-        return notToBeDirectlyAccessedGenotypes;
-    }
-
-    /**
-     * Force us to decode the genotypes, if not already done
-     */
-    public void decode() {
-        if ( ! loaded ) {
-            //System.out.printf("Loading genotypes... %s:%d%n", contig, start);
-            LazyData parsed = parser.parse(unparsedGenotypeData);
-            notToBeDirectlyAccessedGenotypes = parsed.genotypes;
-            sampleNamesInOrder = parsed.sampleNamesInOrder;
-            sampleNameToOffset = parsed.sampleNameToOffset;
-            loaded = true;
-            unparsedGenotypeData = null; // don't hold the unparsed data any longer
-            nUnparsedGenotypes = 0;
-
-            // warning -- this path allows us to create a VariantContext that doesn't run validateGenotypes()
-            // That said, it's not such an important routine -- it's just checking that the genotypes
-            // are well formed w.r.t. the alleles list, but this will be enforced within the VCFCodec
-        }
-    }
-
-    /**
-     * Overrides the ensure* functionality.  If the data hasn't been loaded
-     * yet and we want to build the cache, just decode it and we're done.  If we've
-     * already decoded the data, though, go through the super class
-     */
-    @Override
-    protected synchronized void ensureSampleNameMap() {
-        if ( ! loaded ) {
-            decode(); // will load up all of the necessary data
-        } else {
-            super.ensureSampleNameMap();
-        }
-    }
-
-    @Override
-    protected synchronized void ensureSampleOrdering() {
-        if ( ! loaded ) {
-            decode(); // will load up all of the necessary data
-        } else {
-            super.ensureSampleOrdering();
-        }
-    }
-
-    @Override
-    protected void invalidateSampleNameMap() {
-        // if the cache is invalidated, and we haven't loaded our data yet, do so
-        if ( ! loaded ) decode();
-        super.invalidateSampleNameMap();
-    }
-
-    @Override
-    protected void invalidateSampleOrdering() {
-        // if the cache is invalidated, and we haven't loaded our data yet, do so
-        if ( ! loaded ) decode();
-        super.invalidateSampleOrdering();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        // optimization -- we know the number of samples in the unparsed data, so use it here to
-        // avoid parsing just to know if the genotypes context is empty
-        return loaded ? super.isEmpty() : nUnparsedGenotypes == 0;
-    }
-
-    @Override
-    public int size() {
-        // optimization -- we know the number of samples in the unparsed data, so use it here to
-        // avoid parsing just to know the size of the context
-        return loaded ? super.size() : nUnparsedGenotypes;
-    }
-
-    public Object getUnparsedGenotypeData() {
-        return unparsedGenotypeData;
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/StructuralVariantType.java b/src/main/java/htsjdk/variant/variantcontext/StructuralVariantType.java
deleted file mode 100644
index 36b517a..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/StructuralVariantType.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext;
-
-/**
- * Type of Structural Variant as defined in the VCF spec 4.2
- *
- */
-public enum StructuralVariantType {
-    /** Deletion relative to the reference */
-    DEL,
-    /** Insertion of novel sequence relative to the reference */
-    INS,
-    /** Region of elevated copy number relative to the reference */
-    DUP,
-    /** Inversion of reference sequence */
-    INV,
-    /** Copy number variable region */
-    CNV,
-    /** breakend structural variation. VCF Specification : <cite>An arbitrary rearrangement
-     *  event can be summarized as a set of novel adjacencies.
-     *  Each adjacency ties together two breakends.</cite>
-     */
-    BND
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantContext.java b/src/main/java/htsjdk/variant/variantcontext/VariantContext.java
deleted file mode 100644
index 55825fb..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/VariantContext.java
+++ /dev/null
@@ -1,1734 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.vcf.VCFCompoundHeaderLine;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLineCount;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-
-import java.io.Serializable;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * 
- * <h3> High-level overview </h3>
- *
- * The VariantContext object is a single general class system for representing genetic variation data composed of:
- * <ul>
- * <li>Allele: representing single genetic haplotypes (A, T, ATC, -) (note that null alleles are used here for illustration; see the Allele class for how to represent indels)</li>
- * <li>Genotype: an assignment of alleles for each chromosome of a single named sample at a particular locus</li>
- * <li>VariantContext: an abstract class holding all segregating alleles at a locus as well as genotypes
- *    for multiple individuals containing alleles at that locus</li>
- * </ul>
- * <p>
- * The class system works by defining segregating alleles, creating a variant context representing the segregating
- * information at a locus, and potentially creating and associating genotypes with individuals in the context.
- *</p>
- *<p>
- * All of the classes are highly validating -- call <code>validate()</code> if you modify them -- so you can rely on the
- * self-consistency of the data once you have a <code>VariantContext</code> in hand.  The system has a rich set of assessor
- * and manipulator routines, as well as more complex static support routines in <code>VariantContextUtils</code>.
- *</p>
- *<p>
- * The <code>VariantContext</code> (and <code>Genotype</code>) objects are attributed (supporting addition of arbitrary key/value pairs) and
- * filtered (can represent a variation that is viewed as suspect).
- *</p>
- *<p>
- *<code>VariantContext</code>s are dynamically typed, so whether a <code>VariantContext</code> is a SNP, Indel, or NoVariant depends
- * on the properties of the alleles in the context.  See the detailed documentation on the <code>Type</code> parameter below.
- *</p>
- *<p>
- * It's also easy to create subcontexts based on selected genotypes.
- *</p>
- * <h3>Working with Variant Contexts</h3>
- * By default, VariantContexts are immutable.  In order to access (in the rare circumstances where you need them)
- * setter routines, you need to create <code>MutableVariantContext</code>s and <code>MutableGenotype</code>s.
- *
- * <h3>Some example data </h3>
- *<pre>
- * Allele A, Aref, T, Tref;
- * Allele del, delRef, ATC, ATCref;
- *</pre>
- *<p>
- * A [ref] / T at 10
- *</p>
- *<pre> 
- * GenomeLoc snpLoc = GenomeLocParser.createGenomeLoc("chr1", 10, 10);
- *</pre>
- *<p>
- * A / ATC [ref] from 20-23
- *</p>
- *<pre>
- * GenomeLoc delLoc = GenomeLocParser.createGenomeLoc("chr1", 20, 22);
- *</pre>
- *<p>
- *  // A [ref] / ATC immediately after 20
- *  </p>
- *  <pre>
- * GenomeLoc insLoc = GenomeLocParser.createGenomeLoc("chr1", 20, 20);
- *</pre>
- * <h3> Alleles </h3>
- *
- * See the documentation in the <code>Allele</code> class itself
- *
- * <h4>What are they?</h4>
- *
- * <p>Alleles can be either reference or non-reference</p>
- *
- * <p>Examples of alleles used here:</p>
- *<pre>
- *   A = new Allele("A");
- *   Aref = new Allele("A", true);
- *   T = new Allele("T");
- *   ATC = new Allele("ATC");
- *</pre>
- * <h3> Creating variant contexts </h3>
- *
- * <h4> By hand </h4>
- *
- * Here's an example of a A/T polymorphism with the A being reference:
- *
- * <pre>
- * VariantContext vc = new VariantContext(name, snpLoc, Arrays.asList(Aref, T));
- * </pre>
- *
- * If you want to create a non-variant site, just put in a single reference allele
- *
- * <pre>
- * VariantContext vc = new VariantContext(name, snpLoc, Arrays.asList(Aref));
- * </pre>
- *
- * A deletion is just as easy:
- *
- * <pre>
- * VariantContext vc = new VariantContext(name, delLoc, Arrays.asList(ATCref, del));
- * </pre>
- *
- * The only thing that distinguishes between an insertion and deletion is which is the reference allele.
- * An insertion has a reference allele that is smaller than the non-reference allele, and vice versa for deletions.
- *
- * <pre>
- * VariantContext vc = new VariantContext("name", insLoc, Arrays.asList(delRef, ATC));
- * </pre>
- *
- * <h4> Converting rods and other data structures to <code>VariantContext</code>s </h4>
- *
- * You can convert many common types into VariantContexts using the general function:
- *
- * <pre>
- * VariantContextAdaptors.convertToVariantContext(name, myObject)
- * </pre>
- *
- * dbSNP and VCFs, for example, can be passed in as <code>myObject</code> and a <code>VariantContext</code> corresponding to that
- * object will be returned.  A <code>null</code> return value indicates that the type isn't yet supported.  This is the best
- * and easiest way to create contexts using RODs.
- *
- *
- * <h3> Working with genotypes </h3>
- *
- * <pre>
- * List<Allele> alleles = Arrays.asList(Aref, T);
- * Genotype g1 = new Genotype(Arrays.asList(Aref, Aref), "g1", 10);
- * Genotype g2 = new Genotype(Arrays.asList(Aref, T), "g2", 10);
- * Genotype g3 = new Genotype(Arrays.asList(T, T), "g3", 10);
- * VariantContext vc = new VariantContext(snpLoc, alleles, Arrays.asList(g1, g2, g3));
- * </pre>
- *
- * At this point we have 3 genotypes in our context, g1-g3.
- *
- * You can assess a good deal of information about the genotypes through the <code>VariantContext</code>:
- *
- * <pre>
- * vc.hasGenotypes()
- * vc.isMonomorphicInSamples()
- * vc.isPolymorphicInSamples()
- * vc.getSamples().size()
- *
- * vc.getGenotypes()
- * vc.getGenotypes().get("g1")
- * vc.hasGenotype("g1")
- *
- * vc.getCalledChrCount()
- * vc.getCalledChrCount(Aref)
- * vc.getCalledChrCount(T)
- * </pre>
- *
- * <h3> NO_CALL alleles </h3>
- *
- * The system allows one to create <code>Genotype</code>s carrying special NO_CALL alleles that aren't present in the
- * set of context alleles and that represent undetermined alleles in a genotype:
- *<pre>
- * Genotype g4 = new Genotype(Arrays.asList(Allele.NO_CALL, Allele.NO_CALL), "NO_DATA_FOR_SAMPLE", 10);
- *</pre>
- *
- * <h3> subcontexts </h3>
- * It's also very easy get subcontext based only the data in a subset of the genotypes:
- *
- * <pre>
- * VariantContext vc12 = vc.subContextFromGenotypes(Arrays.asList(g1,g2));
- * VariantContext vc1 = vc.subContextFromGenotypes(Arrays.asList(g1));
- * </pre>
- *
- * <!-- comment by jdenvir: not sure what this tag is supposed to do:-->
- * <!-- <s3> -->
- *     <h3>Fully decoding.</h3>  
- *     Currently <code>VariantContext</code>s support some fields, particularly those
- *     stored as generic attributes, to be of any type.  For example, a field AB might
- *     be naturally a floating point number, 0.51, but when it's read into a VC its
- *     not decoded into the Java presentation but left as a string "0.51".  A fully
- *     decoded <code>VariantContext</code> is one where all values have been converted to their
- *     corresponding Java object types, based on the types declared in a <code>VCFHeader</code>.
- *
- *     The <code>fullyDecode(...)</code> method takes a header object and creates a new fully decoded <code>VariantContext</code>
- *     where all fields are converted to their true java representation.  The <code>VCBuilder</code>
- *     can be told that all fields are fully decoded, in which case no work is done when
- *     asking for a fully decoded version of the VC.
- * <!-- </s3> -->
- *
- * @author depristo
- */
-public class VariantContext implements Feature, Serializable {
-    public static final long serialVersionUID = 1L;
-
-    private final static boolean WARN_ABOUT_BAD_END = true;
-    private final static int MAX_ALLELE_SIZE_FOR_NON_SV = 150;
-    private boolean fullyDecoded = false;
-    protected CommonInfo commonInfo = null;
-    public final static double NO_LOG10_PERROR = CommonInfo.NO_LOG10_PERROR;
-
-    public final static Set<String> PASSES_FILTERS = Collections.unmodifiableSet(new LinkedHashSet<String>());
-
-    /** The location of this VariantContext */
-    final protected String contig;
-    final protected long start;
-    final protected long stop;
-    private final String ID;
-
-    /** The type (cached for performance reasons) of this context */
-    protected Type type = null;
-
-    /** A set of the alleles segregating in this context */
-    final protected List<Allele> alleles;
-
-    /** A mapping from sampleName -> genotype objects for all genotypes associated with this context */
-    protected GenotypesContext genotypes = null;
-
-    /** Counts for each of the possible Genotype types in this context */
-    protected int[] genotypeCounts = null;
-
-    public final static GenotypesContext NO_GENOTYPES = GenotypesContext.NO_GENOTYPES;
-
-    // a fast cached access point to the ref / alt alleles for biallelic case
-    private Allele REF = null;
-
-    // set to the alt allele when biallelic, otherwise == null
-    private Allele ALT = null;
-
-    /* cached monomorphic value: null -> not yet computed, False, True */
-    private Boolean monomorphic = null;
-
-    /*
-* Determine which genotype fields are in use in the genotypes in VC
-* @return an ordered list of genotype fields in use in VC.  If vc has genotypes this will always include GT first
-*/
-    public List<String> calcVCFGenotypeKeys(final VCFHeader header) {
-        final Set<String> keys = new HashSet<>();
-
-        boolean sawGoodGT = false;
-        boolean sawGoodQual = false;
-        boolean sawGenotypeFilter = false;
-        boolean sawDP = false;
-        boolean sawAD = false;
-        boolean sawPL = false;
-        for (final Genotype g : this.getGenotypes()) {
-            keys.addAll(g.getExtendedAttributes().keySet());
-            if ( g.isAvailable() ) sawGoodGT = true;
-            if ( g.hasGQ() ) sawGoodQual = true;
-            if ( g.hasDP() ) sawDP = true;
-            if ( g.hasAD() ) sawAD = true;
-            if ( g.hasPL() ) sawPL = true;
-            if (g.isFiltered()) sawGenotypeFilter = true;
-        }
-
-        if ( sawGoodQual ) keys.add(VCFConstants.GENOTYPE_QUALITY_KEY);
-        if ( sawDP ) keys.add(VCFConstants.DEPTH_KEY);
-        if ( sawAD ) keys.add(VCFConstants.GENOTYPE_ALLELE_DEPTHS);
-        if ( sawPL ) keys.add(VCFConstants.GENOTYPE_PL_KEY);
-        if ( sawGenotypeFilter ) keys.add(VCFConstants.GENOTYPE_FILTER_KEY);
-
-        List<String> sortedList = ParsingUtils.sortList(new ArrayList<>(keys));
-
-        // make sure the GT is first
-        if (sawGoodGT) {
-            final List<String> newList = new ArrayList<>(sortedList.size() + 1);
-            newList.add(VCFConstants.GENOTYPE_KEY);
-            newList.addAll(sortedList);
-            sortedList = newList;
-        }
-
-        if (sortedList.isEmpty() && header.hasGenotypingData()) {
-            // this needs to be done in case all samples are no-calls
-            return Collections.singletonList(VCFConstants.GENOTYPE_KEY);
-        } else {
-            return sortedList;
-        }
-    }
-
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // validation mode
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    public enum Validation {
-        ALLELES,
-        GENOTYPES
-    }
-
-    private final static EnumSet<Validation> NO_VALIDATION = EnumSet.noneOf(Validation.class);
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // constructors: see VariantContextBuilder
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * Copy constructor
-     *
-     * @param other the VariantContext to copy
-     */
-    protected VariantContext(VariantContext other) {
-        this(other.getSource(), other.getID(), other.getContig(), other.getStart(), other.getEnd(),
-                other.getAlleles(), other.getGenotypes(), other.getLog10PError(),
-                other.getFiltersMaybeNull(),
-                other.getAttributes(),
-                other.fullyDecoded, NO_VALIDATION);
-    }
-
-    /**
-     * the actual constructor.  Private access only
-     *
-     * @param source          source
-     * @param contig          the contig
-     * @param start           the start base (one based)
-     * @param stop            the stop reference base (one based)
-     * @param alleles         alleles
-     * @param genotypes       genotypes map
-     * @param log10PError  qual
-     * @param filters         filters: use null for unfiltered and empty set for passes filters
-     * @param attributes      attributes
-     * @param validationToPerform     set of validation steps to take
-     */
-    protected VariantContext(final String source,
-                             final String ID,
-                             final String contig,
-                             final long start,
-                             final long stop,
-                             final Collection<Allele> alleles,
-                             final GenotypesContext genotypes,
-                             final double log10PError,
-                             final Set<String> filters,
-                             final Map<String, Object> attributes,
-                             final boolean fullyDecoded,
-                             final EnumSet<Validation> validationToPerform ) {
-        if ( contig == null ) { throw new IllegalArgumentException("Contig cannot be null"); }
-        this.contig = contig;
-        this.start = start;
-        this.stop = stop;
-
-        // intern for efficiency.  equals calls will generate NPE if ID is inappropriately passed in as null
-        if ( ID == null || ID.equals("") ) throw new IllegalArgumentException("ID field cannot be the null or the empty string");
-        this.ID = ID.equals(VCFConstants.EMPTY_ID_FIELD) ? VCFConstants.EMPTY_ID_FIELD : ID;
-
-        this.commonInfo = new CommonInfo(source, log10PError, filters, attributes);
-
-        if ( alleles == null ) { throw new IllegalArgumentException("Alleles cannot be null"); }
-
-        // we need to make this a LinkedHashSet in case the user prefers a given ordering of alleles
-        this.alleles = makeAlleles(alleles);
-
-        if ( genotypes == null || genotypes == NO_GENOTYPES ) {
-            this.genotypes = NO_GENOTYPES;
-        } else {
-            this.genotypes = genotypes.immutable();
-        }
-
-        // cache the REF and ALT alleles
-        int nAlleles = alleles.size();
-        for ( Allele a : alleles ) {
-            if ( a.isReference() ) {
-                REF = a;
-            } else if ( nAlleles == 2 ) { // only cache ALT when biallelic
-                ALT = a;
-            }
-        }
-
-        this.fullyDecoded = fullyDecoded;
-
-        if ( ! validationToPerform.isEmpty() ) {
-            validate(validationToPerform);
-        }
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // Selectors
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * This method subsets down to a set of samples.
-     *
-     * At the same time returns the alleles to just those in use by the samples,
-     * if rederiveAllelesFromGenotypes is true, otherwise the full set of alleles
-     * in this VC is returned as the set of alleles in the subContext, even if
-     * some of those alleles aren't in the samples
-     *
-     * WARNING: BE CAREFUL WITH rederiveAllelesFromGenotypes UNLESS YOU KNOW WHAT YOU ARE DOING
-     *
-     * @param sampleNames    the sample names
-     * @param rederiveAllelesFromGenotypes if true, returns the alleles to just those in use by the samples, true should be default
-     * @return new VariantContext subsetting to just the given samples
-     */
-    public VariantContext subContextFromSamples(Set<String> sampleNames, final boolean rederiveAllelesFromGenotypes ) {
-        if ( sampleNames.containsAll(getSampleNames()) && ! rederiveAllelesFromGenotypes ) {
-            return this; // fast path when you don't have any work to do
-        } else {
-            VariantContextBuilder builder = new VariantContextBuilder(this);
-            GenotypesContext newGenotypes = genotypes.subsetToSamples(sampleNames);
-
-            if ( rederiveAllelesFromGenotypes ) {
-                Set<Allele> allelesFromGenotypes = allelesOfGenotypes(newGenotypes);
-
-                // ensure original order of genotypes
-                List<Allele> rederivedAlleles = new ArrayList<>(allelesFromGenotypes.size());
-                for (Allele allele : alleles)
-                    if (allelesFromGenotypes.contains(allele))
-                        rederivedAlleles.add(allele);
-
-                builder.alleles(rederivedAlleles);
-            }
-            else {
-                builder.alleles(alleles);
-            }
-
-            return builder.genotypes(newGenotypes).make();
-        }
-    }
-
-    /**
-     * @see #subContextFromSamples(java.util.Set, boolean) with rederiveAllelesFromGenotypes = true
-     *
-     * @param sampleNames
-     * @return
-     */
-    public VariantContext subContextFromSamples(final Set<String> sampleNames) {
-        return subContextFromSamples(sampleNames, true);
-    }
-
-    public VariantContext subContextFromSample(String sampleName) {
-        return subContextFromSamples(Collections.singleton(sampleName));
-    }
-
-    /**
-     * helper routine for subcontext
-     * @param genotypes genotypes
-     * @return allele set
-     */
-    private final Set<Allele> allelesOfGenotypes(Collection<Genotype> genotypes) {
-        final Set<Allele> alleles = new HashSet<>();
-
-        boolean addedref = false;
-        for ( final Genotype g : genotypes ) {
-            for ( final Allele a : g.getAlleles() ) {
-                addedref = addedref || a.isReference();
-                if ( a.isCalled() )
-                    alleles.add(a);
-            }
-        }
-        if ( ! addedref ) alleles.add(getReference());
-
-        return alleles;
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // type operations
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * @see <a href="http://www.ncbi.nlm.nih.gov/bookshelf/br.fcgi?book=handbook&part=ch5&rendertype=table&id=ch5.ch5_t3">NCBI Handbook</a>
-     *
-     * <h3>Format:</h3>
-     * <ul>
-     * <li><strong>dbSNP variation class</strong></li>
-     * <li>Rules for assigning allele classes</li>
-     * <li>Sample allele definition</li>
-     * </ul>
-     * <h3>Supported Types</h3>
-     * <ul>
-     * <li><strong>Single Nucleotide Polymorphisms (SNPs)a</strong></li>
-     * <li>Strictly defined as single base substitutions involving A, T, C, or G.</li>
-     * <li>A/T</li>
-     * </ul>
-     * <br>
-     * <ul>
-     * <li><strong>Deletion/Insertion Polymorphisms (DIPs)</strong></li>
-     * <li>Designated using the full sequence of the insertion as one allele, and either a fully
-     *   defined string for the variant allele or a '-' character to specify the deleted allele.
-     *   This class will be assigned to a variation if the variation alleles are of different lengths or
-     *   if one of the alleles is deleted ('-').</li>
-     * <li>T/-/CCTA/G</li>
-     * </ul>
-     * <br>
-     * <ul>
-     * <li><strong>No-variation</strong></li>
-     * <li>Reports may be submitted for segments of sequence that are assayed and determined to be invariant
-     *   in the sample.</li>
-     * <li>(NoVariation)</li>
-     * </ul>
-     * <br>
-     * <ul>
-     * <li><strong>Mixed</strong></li>
-     * <li>Mix of other classes</li>
-     * </ul>
-     * 
-     * Also supports NO_VARIATION type, used to indicate that the site isn't polymorphic in the population
-     *
-     *
-     * <h3>Not currently supported:</h3>
-     *
-     * <ul>
-     * <li><strong>Heterozygous sequence</strong></li>
-     * <li>The term heterozygous is used to specify a region detected by certain methods that do not
-     * resolve the polymorphism into a specific sequence motif. In these cases, a unique flanking
-     * sequence must be provided to define a sequence context for the variation.</li>
-     * <li>(heterozygous)</li>
-     * </ul>
-     * <br>
-     * <ul>
-     * <li><strong>Microsatellite or short tandem repeat (STR)</strong></li>
-     * <li>Alleles are designated by providing the repeat motif and the copy number for each allele.
-     * Expansion of the allele repeat motif designated in dbSNP into full-length sequence will
-     * be only an approximation of the true genomic sequence because many microsatellite markers are
-     * not fully sequenced and are resolved as size variants only.</li>
-     * <li>(CAC)8/9/10/11</li>
-     * </ul>
-     * <br>
-     * <ul>
-     * <li><strong>Named variant</strong></li>
-     * <li>Applies to insertion/deletion polymorphisms of longer sequence features, such as retroposon
-     * dimorphism for Alu or line elements. These variations frequently include a deletion '-' indicator
-     * for the absent allele.</li>
-     * <li>(alu) / -</li>
-     * </ul>
-     * <br>
-     * <ul>
-     * <li><strong>Multi-Nucleotide Polymorphism (MNP)</strong></li>
-     * <li>Assigned to variations that are multi-base variations of a single, common length</li>
-     * <li>GGA/AGT</li>
-     * </ul>
-     */
-    public enum Type {
-        NO_VARIATION,
-        SNP,
-        MNP,    // a multi-nucleotide polymorphism
-        INDEL,
-        SYMBOLIC,
-        MIXED,
-    }
-
-    /**
-     * Determines (if necessary) and returns the type of this variation by examining the alleles it contains.
-     *
-     * @return the type of this VariantContext
-     **/
-    public Type getType() {
-        if ( type == null )
-            determineType();
-
-        return type;
-    }
-
-    /**
-     * convenience method for SNPs
-     *
-     * @return true if this is a SNP, false otherwise
-     */
-    public boolean isSNP() { return getType() == Type.SNP; }
-
-
-    /**
-     * convenience method for variants
-     *
-     * @return true if this is a variant allele, false if it's reference
-     */
-    public boolean isVariant() { return getType() != Type.NO_VARIATION; }
-
-    /**
-     * convenience method for point events
-     *
-     * @return true if this is a SNP or ref site, false if it's an indel or mixed event
-     */
-    public boolean isPointEvent() { return isSNP() || !isVariant(); }
-
-    /**
-     * convenience method for indels
-     *
-     * @return true if this is an indel, false otherwise
-     */
-    public boolean isIndel() { return getType() == Type.INDEL; }
-
-    /**
-     * @return true if the alleles indicate a simple insertion (i.e., the reference allele is Null)
-     */
-    public boolean isSimpleInsertion() {
-        // can't just call !isSimpleDeletion() because of complex indels
-        return isSimpleIndel() && getReference().length() == 1;
-    }
-
-    /**
-     * @return true if the alleles indicate a simple deletion (i.e., a single alt allele that is Null)
-     */
-    public boolean isSimpleDeletion() {
-        // can't just call !isSimpleInsertion() because of complex indels
-        return isSimpleIndel() && getAlternateAllele(0).length() == 1;
-    }
-
-    /**
-     * @return true if the alleles indicate a simple indel, false otherwise.
-     */
-    public boolean isSimpleIndel() {
-        return getType() == Type.INDEL                   // allelic lengths differ
-                && isBiallelic()                         // exactly 2 alleles
-                && getReference().length() > 0           // ref is not null or symbolic
-                && getAlternateAllele(0).length() > 0    // alt is not null or symbolic
-                && getReference().getBases()[0] == getAlternateAllele(0).getBases()[0]    // leading bases match for both alleles
-                && (getReference().length() == 1 || getAlternateAllele(0).length() == 1);
-    }
-
-    /**
-     * @return true if the alleles indicate neither a simple deletion nor a simple insertion
-     */
-    public boolean isComplexIndel() {
-        return isIndel() && !isSimpleDeletion() && !isSimpleInsertion();
-    }
-
-    public boolean isSymbolic() {
-        return getType() == Type.SYMBOLIC;
-    }
-
-    public boolean isStructuralIndel() {
-        if ( getType() == Type.INDEL ) {
-            List<Integer> sizes = getIndelLengths();
-            if ( sizes != null ) {
-                for ( Integer length : sizes ) {
-                    if ( length > MAX_ALLELE_SIZE_FOR_NON_SV ) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     *
-     * @return true if the variant is symbolic or a large indel
-     */
-    public boolean isSymbolicOrSV() {
-        return isSymbolic() || isStructuralIndel();
-    }
-
-    public boolean isMNP() {
-        return getType() == Type.MNP;
-    }
-
-    /**
-     * convenience method for indels
-     *
-     * @return true if this is an mixed variation, false otherwise
-     */
-    public boolean isMixed() { return getType() == Type.MIXED; }
-
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // Generic accessors
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    public boolean hasID() {
-        return getID() != VCFConstants.EMPTY_ID_FIELD;
-    }
-
-    public boolean emptyID() {
-        return ! hasID();
-    }
-
-    public String getID() {
-        return ID;
-    }
-
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // get routines to access context info fields
-    //
-    // ---------------------------------------------------------------------------------------------------------
-    public String getSource()                   { return commonInfo.getName(); }
-    public Set<String> getFiltersMaybeNull()    { return commonInfo.getFiltersMaybeNull(); }
-    public Set<String> getFilters()             { return commonInfo.getFilters(); }
-    public boolean isFiltered()                 { return commonInfo.isFiltered(); }
-    public boolean isNotFiltered()              { return commonInfo.isNotFiltered(); }
-    public boolean filtersWereApplied()         { return commonInfo.filtersWereApplied(); }
-    public boolean hasLog10PError()             { return commonInfo.hasLog10PError(); }
-    public double getLog10PError()              { return commonInfo.getLog10PError(); }
-    public double getPhredScaledQual()          { return commonInfo.getPhredScaledQual(); }
-
-    public Map<String, Object>  getAttributes() { return commonInfo.getAttributes(); }
-    public boolean hasAttribute(String key)     { return commonInfo.hasAttribute(key); }
-    public Object getAttribute(String key)      { return commonInfo.getAttribute(key); }
-
-    public Object getAttribute(String key, Object defaultValue) {
-        return commonInfo.getAttribute(key, defaultValue);
-    }
-
-    public String getAttributeAsString(String key, String defaultValue)   { return commonInfo.getAttributeAsString(key, defaultValue); }
-    public int getAttributeAsInt(String key, int defaultValue)            { return commonInfo.getAttributeAsInt(key, defaultValue); }
-    public double getAttributeAsDouble(String key, double  defaultValue)  { return commonInfo.getAttributeAsDouble(key, defaultValue); }
-    public boolean getAttributeAsBoolean(String key, boolean  defaultValue)  { return commonInfo.getAttributeAsBoolean(key, defaultValue); }
-    /** returns the value as an empty list if the key was not found,
-        as a java.util.List if the value is a List or an Array,
-        as a Collections.singletonList if there is only one value */
-    public List<Object> getAttributeAsList(String key)  { return commonInfo.getAttributeAsList(key); }
-    public List<String> getAttributeAsStringList(String key, String defaultValue) { return commonInfo.getAttributeAsStringList(key, defaultValue); }
-    public List<Integer> getAttributeAsIntList(String key, int defaultValue) { return commonInfo.getAttributeAsIntList(key, defaultValue); }
-    public List<Double> getAttributeAsDoubleList(String key, double defaultValue) { return commonInfo.getAttributeAsDoubleList(key, defaultValue); }
-    public CommonInfo getCommonInfo() {
-        return commonInfo;
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // Working with alleles
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * @return the reference allele for this context
-     */
-    public Allele getReference() {
-        Allele ref = REF;
-        if ( ref == null )
-            throw new IllegalStateException("BUG: no reference allele found at " + this);
-        return ref;
-    }
-
-
-    /**
-     * @return true if the context is strictly bi-allelic
-     */
-    public boolean isBiallelic() {
-        return getNAlleles() == 2;
-    }
-
-    /**
-     * @return The number of segregating alleles in this context
-     */
-    public int getNAlleles() {
-        return alleles.size();
-    }
-
-    /**
-     * Returns the maximum ploidy of all samples in this VC, or default if there are no genotypes
-     *
-     * This function is caching, so it's only expensive on the first call
-     *
-     * @param defaultPloidy the default ploidy, if all samples are no-called
-     * @return default, or the max ploidy
-     */
-    public int getMaxPloidy(final int defaultPloidy) {
-        return genotypes.getMaxPloidy(defaultPloidy);
-    }
-
-    /**
-     * @return The allele sharing the same bases as this String.  A convenience method; better to use byte[]
-     */
-    public Allele getAllele(String allele) {
-        return getAllele(allele.getBytes());
-    }
-
-    /**
-     * @return The allele sharing the same bases as this byte[], or null if no such allele is present.
-     */
-    public Allele getAllele(byte[] allele) {
-        return Allele.getMatchingAllele(getAlleles(), allele);
-    }
-
-    /**
-     * @return True if this context contains Allele allele, or false otherwise
-     */
-    public boolean hasAllele(final Allele allele) {
-        return hasAllele(allele, false, true);
-    }
-
-    public boolean hasAllele(final Allele allele, final boolean ignoreRefState) {
-        return hasAllele(allele, ignoreRefState, true);
-    }
-
-    public boolean hasAlternateAllele(final Allele allele) {
-        return hasAllele(allele, false, false);
-    }
-
-    public boolean hasAlternateAllele(final Allele allele, final boolean ignoreRefState) {
-        return hasAllele(allele, ignoreRefState, false);
-    }
-
-    private boolean hasAllele(final Allele allele, final boolean ignoreRefState, final boolean considerRefAllele) {
-        if ( (considerRefAllele && allele == REF) || allele == ALT ) // optimization for cached cases
-            return true;
-
-        final List<Allele> allelesToConsider = considerRefAllele ? getAlleles() : getAlternateAlleles();
-        for ( Allele a : allelesToConsider ) {
-            if ( a.equals(allele, ignoreRefState) )
-                return true;
-        }
-
-        return false;
-    }
-
-
-    /**
-     * Gets the alleles.  This method should return all of the alleles present at the location,
-     * including the reference allele.  There are no constraints imposed on the ordering of alleles
-     * in the set. If the reference is not an allele in this context it will not be included.
-     *
-     * @return the set of alleles
-     */
-    public List<Allele> getAlleles() { return alleles; }
-
-    /**
-     * Gets the alternate alleles.  This method should return all the alleles present at the location,
-     * NOT including the reference allele.  There are no constraints imposed on the ordering of alleles
-     * in the set.
-     *
-     * @return the set of alternate alleles
-     */
-    public List<Allele> getAlternateAlleles() {
-        return alleles.subList(1, alleles.size());
-    }
-
-    /**
-     * Gets the sizes of the alternate alleles if they are insertion/deletion events, and returns a list of their sizes
-     *
-     * @return a list of indel lengths ( null if not of type indel or mixed )
-     */
-    public List<Integer> getIndelLengths() {
-        if ( getType() != Type.INDEL && getType() != Type.MIXED ) {
-            return null;
-        }
-
-        List<Integer> lengths = new ArrayList<>();
-        for ( Allele a : getAlternateAlleles() ) {
-            lengths.add(a.length() - getReference().length());
-        }
-
-        return lengths;
-    }
-
-    /**
-     * @param i -- the ith allele (from 0 to n - 2 for a context with n alleles including a reference allele)
-     * @return the ith non-reference allele in this context
-     * @throws IllegalArgumentException if i is invalid
-     */
-    public Allele getAlternateAllele(int i) {
-        return alleles.get(i+1);
-    }
-
-    /**
-     * @param  other  VariantContext whose alleles to compare against
-     * @return true if this VariantContext has the same alleles (both ref and alts) as other,
-     *         regardless of ordering. Otherwise returns false.
-     */
-    public boolean hasSameAllelesAs ( final VariantContext other ) {
-        return hasSameAlternateAllelesAs(other) && other.getReference().equals(getReference(), false);
-    }
-
-    /**
-     * @param  other  VariantContext whose alternate alleles to compare against
-     * @return true if this VariantContext has the same alternate alleles as other,
-     *         regardless of ordering. Otherwise returns false.
-     */
-    public boolean hasSameAlternateAllelesAs ( final VariantContext other ) {
-        List<Allele> thisAlternateAlleles = getAlternateAlleles();
-        List<Allele> otherAlternateAlleles = other.getAlternateAlleles();
-
-        if ( thisAlternateAlleles.size() != otherAlternateAlleles.size() ) {
-            return false;
-        }
-
-        for ( Allele allele : thisAlternateAlleles ) {
-            if ( ! otherAlternateAlleles.contains(allele) ) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // Working with genotypes
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * @return the number of samples in the context
-     */
-    public int getNSamples() {
-        return genotypes.size();
-    }
-
-    /**
-     * @return true if the context has associated genotypes
-     */
-    public boolean hasGenotypes() {
-        return ! genotypes.isEmpty();
-    }
-
-    public boolean hasGenotypes(Collection<String> sampleNames) {
-        return genotypes.containsSamples(sampleNames);
-    }
-
-    /**
-     * @return set of all Genotypes associated with this context
-     */
-    public GenotypesContext getGenotypes() {
-        return genotypes;
-    }
-
-    public Iterable<Genotype> getGenotypesOrderedByName() {
-        return genotypes.iterateInSampleNameOrder();
-    }
-
-    public Iterable<Genotype> getGenotypesOrderedBy(Iterable<String> sampleOrdering) {
-        return genotypes.iterateInSampleNameOrder(sampleOrdering);
-    }
-
-    /**
-     * Returns a map from sampleName -> Genotype for the genotype associated with sampleName.  Returns a map
-     * for consistency with the multi-get function.
-     *
-     * @param sampleName   the sample name
-     * @return mapping from sample name to genotype
-     * @throws IllegalArgumentException if sampleName isn't bound to a genotype
-     */
-    public GenotypesContext getGenotypes(String sampleName) {
-        return getGenotypes(Collections.singleton(sampleName));
-    }
-
-    /**
-     * Returns a map from sampleName -> Genotype for each sampleName in sampleNames.  Returns a map
-     * for consistency with the multi-get function.
-     *
-     * For testing convenience only
-     *
-     * @param sampleNames a unique list of sample names
-     * @return subsetting genotypes context
-     * @throws IllegalArgumentException if sampleName isn't bound to a genotype
-     */
-    protected GenotypesContext getGenotypes(Collection<String> sampleNames) {
-        return getGenotypes().subsetToSamples(new HashSet<>(sampleNames));
-    }
-
-    public GenotypesContext getGenotypes(Set<String> sampleNames) {
-        return getGenotypes().subsetToSamples(sampleNames);
-    }
-
-
-    /**
-     * @return the set of all sample names in this context, not ordered
-     */
-    public Set<String> getSampleNames() {
-        return getGenotypes().getSampleNames();
-    }
-
-    public List<String> getSampleNamesOrderedByName() {
-        return getGenotypes().getSampleNamesOrderedByName();
-    }
-
-    /**
-     * @param sample  the sample name
-     *
-     * @return the Genotype associated with the given sample in this context or null if the sample is not in this context
-     */
-    public Genotype getGenotype(String sample) {
-        return getGenotypes().get(sample);
-    }
-
-    public boolean hasGenotype(String sample) {
-        return getGenotypes().containsSample(sample);
-    }
-
-    /**
-     * @param ith the sample index
-     *
-     * @return the ith genotype in this context or null if there aren't that many genotypes
-     */
-    public Genotype getGenotype(int ith) {
-        return genotypes.size() > ith ? genotypes.get(ith) : null;
-    }
-
-    /**
-     * Returns the number of chromosomes carrying any allele in the genotypes (i.e., excluding NO_CALLS)
-     *
-     * @return chromosome count
-     */
-    public int getCalledChrCount() {
-        final Set<String> noSamples = Collections.emptySet();
-        return  getCalledChrCount(noSamples);
-    }
-
-    /**
-     * Returns the number of chromosomes carrying any allele in the genotypes (i.e., excluding NO_CALLS)
-     *
-     * @param sampleIds IDs of samples to take into account. If empty then all samples are included.
-     * @return chromosome count
-     */
-    public int getCalledChrCount(Set<String> sampleIds) {
-        int n = 0;
-        GenotypesContext genotypes = sampleIds.isEmpty() ? getGenotypes() : getGenotypes(sampleIds);
-
-        for ( final Genotype g : genotypes) {
-            for ( final Allele a : g.getAlleles() )
-                n += a.isNoCall() ? 0 : 1;
-        }
-
-        return n;
-    }
-
-    /**
-     * Returns the number of chromosomes carrying allele A in the genotypes
-     *
-     * @param a allele
-     * @return chromosome count
-     */
-    public int getCalledChrCount(Allele a) {
-        return getCalledChrCount(a, new HashSet<>(0));
-    }
-
-    /**
-     * Returns the number of chromosomes carrying allele A in the genotypes
-     *
-     * @param a allele
-     * @param sampleIds - IDs of samples to take into account. If empty then all samples are included.
-     * @return chromosome count
-     */
-    public int getCalledChrCount(Allele a, Set<String> sampleIds) {
-        int n = 0;
-        GenotypesContext genotypes = sampleIds.isEmpty() ? getGenotypes() : getGenotypes(sampleIds);
-
-        for ( final Genotype g : genotypes ) {
-            n += g.countAllele(a);
-        }
-
-        return n;
-    }
-
-    /**
-     * Genotype-specific functions -- are the genotypes monomorphic w.r.t. to the alleles segregating at this
-     * site?  That is, is the number of alternate alleles among all fo the genotype == 0?
-     *
-     * @return true if it's monomorphic
-     */
-    public boolean isMonomorphicInSamples() {
-        if ( monomorphic == null )
-            monomorphic = ! isVariant() || (hasGenotypes() && getCalledChrCount(getReference()) == getCalledChrCount());
-        return monomorphic;
-    }
-
-    /**
-     * Genotype-specific functions -- are the genotypes polymorphic w.r.t. to the alleles segregating at this
-     * site?  That is, is the number of alternate alleles among all fo the genotype > 0?
-     *
-     * @return true if it's polymorphic
-     */
-    public boolean isPolymorphicInSamples() {
-        return ! isMonomorphicInSamples();
-    }
-
-    private void calculateGenotypeCounts() {
-        if ( genotypeCounts == null ) {
-            genotypeCounts = new int[GenotypeType.values().length];
-
-            for ( final Genotype g : getGenotypes() ) {
-                genotypeCounts[g.getType().ordinal()]++;
-            }
-        }
-    }
-
-    /**
-     * Genotype-specific functions -- how many no-calls are there in the genotypes?
-     *
-     * @return number of no calls
-     */
-    public int getNoCallCount() {
-        calculateGenotypeCounts();
-        return genotypeCounts[GenotypeType.NO_CALL.ordinal()];
-    }
-
-    /**
-     * Genotype-specific functions -- how many hom ref calls are there in the genotypes?
-     *
-     * @return number of hom ref calls
-     */
-    public int getHomRefCount() {
-        calculateGenotypeCounts();
-        return genotypeCounts[GenotypeType.HOM_REF.ordinal()];
-    }
-
-    /**
-     * Genotype-specific functions -- how many het calls are there in the genotypes?
-     *
-     * @return number of het calls
-     */
-    public int getHetCount() {
-        calculateGenotypeCounts();
-        return genotypeCounts[GenotypeType.HET.ordinal()];
-    }
-
-    /**
-     * Genotype-specific functions -- how many hom var calls are there in the genotypes?
-     *
-     * @return number of hom var calls
-     */
-    public int getHomVarCount() {
-        calculateGenotypeCounts();
-        return genotypeCounts[GenotypeType.HOM_VAR.ordinal()];
-    }
-
-    /**
-     * Genotype-specific functions -- how many mixed calls are there in the genotypes?
-     *
-     * @return number of mixed calls
-     */
-    public int getMixedCount() {
-        calculateGenotypeCounts();
-        return genotypeCounts[GenotypeType.MIXED.ordinal()];
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // validation: extra-strict validation routines for paranoid users
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * Run all extra-strict validation tests on a Variant Context object
-     *
-     * @param reportedReference   the reported reference allele
-     * @param observedReference     the observed reference allele
-     * @param rsIDs               the true dbSNP IDs
-     */
-    public void extraStrictValidation(final Allele reportedReference, final Allele observedReference, final Set<String> rsIDs) {
-        // validate the reference
-        validateReferenceBases(reportedReference, observedReference);
-
-        // validate the RS IDs
-        validateRSIDs(rsIDs);
-
-        // validate the alternate alleles
-        validateAlternateAlleles();
-
-        // validate the AN and AC fields
-        validateChromosomeCounts();
-
-        // TODO: implement me
-        //checkReferenceTrack();
-    }
-
-    public void validateReferenceBases(final Allele reportedReference, final Allele observedReference) {
-        if ( reportedReference != null && !reportedReference.basesMatch(observedReference) ) {
-            throw new TribbleException.InternalCodecException(String.format("the REF allele is incorrect for the record at position %s:%d, fasta says %s vs. VCF says %s", getContig(), getStart(), observedReference.getBaseString(), reportedReference.getBaseString()));
-        }
-    }
-
-    public void validateRSIDs(Set<String> rsIDs) {
-        if ( rsIDs != null && hasID() ) {
-            for ( String id : getID().split(VCFConstants.ID_FIELD_SEPARATOR) ) {
-                if ( id.startsWith("rs") && !rsIDs.contains(id) )
-                    throw new TribbleException.InternalCodecException(String.format("the rsID %s for the record at position %s:%d is not in dbSNP", id, getContig(), getStart()));
-            }
-        }
-    }
-
-    public void validateAlternateAlleles() {
-        if ( !hasGenotypes() )
-            return;
-
-        // maintain a list of non-symbolic alleles expected in the REF and ALT fields of the record
-        // (we exclude symbolic alleles because it's commonly expected that they don't show up in the genotypes, e.g. with GATK gVCFs)
-        final List<Allele> reportedAlleles = new ArrayList<Allele>();
-        for ( final Allele allele : getAlleles() ) {
-            if ( !allele.isSymbolic() )
-                reportedAlleles.add(allele);
-        }
-
-        // maintain a list of non-symbolic alleles observed in the genotypes
-        final Set<Allele> observedAlleles = new HashSet<>();
-        observedAlleles.add(getReference());
-        for ( final Genotype g : getGenotypes() ) {
-            if ( g.isCalled() ) {
-                for ( final Allele allele : g.getAlleles() ) {
-                    if ( !allele.isSymbolic() )
-                        observedAlleles.add(allele);
-                }
-            }
-        }
-        if ( observedAlleles.contains(Allele.NO_CALL) )
-            observedAlleles.remove(Allele.NO_CALL);
-
-        if ( reportedAlleles.size() != observedAlleles.size() )
-            throw new TribbleException.InternalCodecException(String.format("one or more of the ALT allele(s) for the record at position %s:%d are not observed at all in the sample genotypes", getContig(), getStart()));
-
-        int originalSize = reportedAlleles.size();
-        // take the intersection and see if things change
-        observedAlleles.retainAll(reportedAlleles);
-        if ( observedAlleles.size() != originalSize )
-            throw new TribbleException.InternalCodecException(String.format("one or more of the ALT allele(s) for the record at position %s:%d are not observed at all in the sample genotypes", getContig(), getStart()));
-    }
-
-    private void validateAttributeIsExpectedSize(final String attributeKey, final int numAlternateAlleles ) {
-        final List<Object> actualValues = getAttributeAsList(attributeKey);
-        if (!actualValues.isEmpty()) {
-            // always have at least one actual value
-            final int expectedValuesSize = numAlternateAlleles > 0 ? numAlternateAlleles : 1;
-            if (actualValues.size() != expectedValuesSize) {
-                throw new TribbleException.InternalCodecException(String.format("the %s tag has the incorrect number of records at position %s:%d, %d vs. %d", attributeKey, getContig(), getStart(), actualValues.size(), expectedValuesSize));
-            }
-        }
-    }
-
-    public void validateChromosomeCounts() {
-        final int numberOfAlternateAlleles = alleles.size() - 1;
-        validateAttributeIsExpectedSize(VCFConstants.ALLELE_COUNT_KEY, numberOfAlternateAlleles);
-        validateAttributeIsExpectedSize(VCFConstants.ALLELE_FREQUENCY_KEY, numberOfAlternateAlleles);
-
-        if ( !hasGenotypes() )
-            return;
-
-        // AN
-        if ( hasAttribute(VCFConstants.ALLELE_NUMBER_KEY) ) {
-            final int reportedAN = Integer.valueOf(getAttribute(VCFConstants.ALLELE_NUMBER_KEY).toString());
-            final int observedAN = getCalledChrCount();
-            if ( reportedAN != observedAN )
-                throw new TribbleException.InternalCodecException(String.format("the Allele Number (AN) tag is incorrect for the record at position %s:%d, %d vs. %d", getContig(), getStart(), reportedAN, observedAN));
-        }
-
-        // AC
-        if ( hasAttribute(VCFConstants.ALLELE_COUNT_KEY) ) {
-            final ArrayList<Integer> observedACs = new ArrayList<>();
-
-            // if there are alternate alleles, record the relevant tags
-            if ( numberOfAlternateAlleles > 0 ) {
-                for ( Allele allele : getAlternateAlleles() ) {
-                    observedACs.add(getCalledChrCount(allele));
-                }
-            }
-            else { // otherwise, set them to 0
-                observedACs.add(0);
-            }
-
-            final List<Object> reportedACs = getAttributeAsList(VCFConstants.ALLELE_COUNT_KEY);
-
-            for (int i = 0; i < observedACs.size(); i++) {
-                // need to cast to int to make sure we don't have an issue below with object equals (earlier bug) - EB
-                final int reportedAC = Integer.valueOf(reportedACs.get(i).toString());
-                if ( reportedAC != observedACs.get(i) )
-                    throw new TribbleException.InternalCodecException(String.format("the Allele Count (AC) tag is incorrect for the record at position %s:%d, %s vs. %d", getContig(), getStart(), reportedAC, observedACs.get(i)));
-            }
-        }
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // validation: the normal validation routines are called automatically upon creation of the VC
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    private boolean validate(final EnumSet<Validation> validationToPerform) {
-        validateStop();
-        for (final Validation val : validationToPerform ) {
-            switch (val) {
-                case ALLELES: validateAlleles(); break;
-                case GENOTYPES: validateGenotypes(); break;
-                default: throw new IllegalArgumentException("Unexpected validation mode " + val);
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Check that getEnd() == END from the info field, if it's present
-     */
-    private void validateStop() {
-        if ( hasAttribute(VCFConstants.END_KEY) ) {
-            final int end = getAttributeAsInt(VCFConstants.END_KEY, -1);
-            assert end != -1;
-            if ( end != getEnd() ) {
-                final String message = "Badly formed variant context at location " + getContig() + ":"
-                        + getStart() + "; getEnd() was " + getEnd()
-                        + " but this VariantContext contains an END key with value " + end;
-                if ( GeneralUtils.DEBUG_MODE_ENABLED && WARN_ABOUT_BAD_END ) {
-                    System.err.println(message);
-                }
-                else {
-                    throw new TribbleException(message);
-                }
-            }
-        } else {
-            final long length = (stop - start) + 1;
-            if ( ! hasSymbolicAlleles() && length != getReference().length() ) {
-                throw new IllegalStateException("BUG: GenomeLoc " + contig + ":" + start + "-" + stop + " has a size == " + length + " but the variation reference allele has length " + getReference().length() + " this = " + this);
-            }
-        }
-    }
-
-    private void validateAlleles() {
-
-        boolean alreadySeenRef = false;
-
-        for ( final Allele allele : alleles ) {
-            // make sure there's only one reference allele
-            if ( allele.isReference() ) {
-                if ( alreadySeenRef ) throw new IllegalArgumentException("BUG: Received two reference tagged alleles in VariantContext " + alleles + " this=" + this);
-                alreadySeenRef = true;
-            }
-
-            if ( allele.isNoCall() ) {
-                throw new IllegalArgumentException("BUG: Cannot add a no call allele to a variant context " + alleles + " this=" + this);
-            }
-        }
-
-        // make sure there's one reference allele
-        if ( ! alreadySeenRef )
-            throw new IllegalArgumentException("No reference allele found in VariantContext");
-    }
-
-    private void validateGenotypes() {
-        if ( this.genotypes == null ) throw new IllegalStateException("Genotypes is null");
-
-        for ( final Genotype g : this.genotypes ) {
-            if ( g.isAvailable() ) {
-                for ( Allele gAllele : g.getAlleles() ) {
-                    if ( ! hasAllele(gAllele) && gAllele.isCalled() )
-                        throw new IllegalStateException("Allele in genotype " + gAllele + " not in the variant context " + alleles);
-                }
-            }
-        }
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // utility routines
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    private void determineType() {
-        if ( type == null ) {
-            switch ( getNAlleles() ) {
-                case 0:
-                    throw new IllegalStateException("Unexpected error: requested type of VariantContext with no alleles!" + this);
-                case 1:
-                    // note that this doesn't require a reference allele.  You can be monomorphic independent of having a
-                    // reference allele
-                    type = Type.NO_VARIATION;
-                    break;
-                default:
-                    determinePolymorphicType();
-            }
-        }
-    }
-
-    private void determinePolymorphicType() {
-        type = null;
-
-        // do a pairwise comparison of all alleles against the reference allele
-        for ( Allele allele : alleles ) {
-            if ( allele == REF )
-                continue;
-
-            // find the type of this allele relative to the reference
-            Type biallelicType = typeOfBiallelicVariant(REF, allele);
-
-            // for the first alternate allele, set the type to be that one
-            if ( type == null ) {
-                type = biallelicType;
-            }
-            // if the type of this allele is different from that of a previous one, assign it the MIXED type and quit
-            else if ( biallelicType != type ) {
-                type = Type.MIXED;
-                return;
-            }
-        }
-    }
-
-    private static Type typeOfBiallelicVariant(Allele ref, Allele allele) {
-        if ( ref.isSymbolic() )
-            throw new IllegalStateException("Unexpected error: encountered a record with a symbolic reference allele");
-
-        if ( allele.isSymbolic() )
-            return Type.SYMBOLIC;
-
-        if ( ref.length() == allele.length() ) {
-            if ( allele.length() == 1 )
-                return Type.SNP;
-            else
-                return Type.MNP;
-        }
-
-        // Important note: previously we were checking that one allele is the prefix of the other.  However, that's not an
-        // appropriate check as can be seen from the following example:
-        // REF = CTTA and ALT = C,CT,CA
-        // This should be assigned the INDEL type but was being marked as a MIXED type because of the prefix check.
-        // In truth, it should be absolutely impossible to return a MIXED type from this method because it simply
-        // performs a pairwise comparison of a single alternate allele against the reference allele (whereas the MIXED type
-        // is reserved for cases of multiple alternate alleles of different types).  Therefore, if we've reached this point
-        // in the code (so we're not a SNP, MNP, or symbolic allele), we absolutely must be an INDEL.
-
-        return Type.INDEL;
-
-        // old incorrect logic:
-        // if (oneIsPrefixOfOther(ref, allele))
-        //     return Type.INDEL;
-        // else
-        //     return Type.MIXED;
-    }
-
-    public String toString() {
-        // Note: passing genotypes to String.format() will implicitly decode the genotypes
-        // This may not be desirable, so don't decode by default
-
-        return genotypes.isLazyWithData() ? toStringUnparsedGenotypes() : toStringDecodeGenotypes();
-    }
-
-    public String toStringDecodeGenotypes() {
-        return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s GT=%s",
-                getSource(), contig + ":" + (start - stop == 0 ? start : start + "-" + stop),
-                hasLog10PError() ? String.format("%.2f", getPhredScaledQual()) : ".",
-                this.getType(),
-                ParsingUtils.sortList(this.getAlleles()),
-                ParsingUtils.sortedString(this.getAttributes()),
-                this.getGenotypes());
-    }
-
-    private String toStringUnparsedGenotypes() {
-        return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s GT=%s",
-                getSource(), contig + ":" + (start - stop == 0 ? start : start + "-" + stop),
-                hasLog10PError() ? String.format("%.2f", getPhredScaledQual()) : ".",
-                this.getType(),
-                ParsingUtils.sortList(this.getAlleles()),
-                ParsingUtils.sortedString(this.getAttributes()),
-                ((LazyGenotypesContext)this.genotypes).getUnparsedGenotypeData());
-    }
-
-    public String toStringWithoutGenotypes() {
-        return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s",
-                getSource(), contig + ":" + (start - stop == 0 ? start : start + "-" + stop),
-                hasLog10PError() ? String.format("%.2f", getPhredScaledQual()) : ".",
-                this.getType(),
-                ParsingUtils.sortList(this.getAlleles()),
-                ParsingUtils.sortedString(this.getAttributes()));
-    }
-
-    // protected basic manipulation routines
-    private static List<Allele> makeAlleles(Collection<Allele> alleles) {
-        final List<Allele> alleleList = new ArrayList<>(alleles.size());
-
-        boolean sawRef = false;
-        for ( final Allele a : alleles ) {
-            for ( final Allele b : alleleList ) {
-                if ( a.equals(b, true) )
-                    throw new IllegalArgumentException("Duplicate allele added to VariantContext: " + a);
-            }
-
-            // deal with the case where the first allele isn't the reference
-            if ( a.isReference() ) {
-                if ( sawRef )
-                    throw new IllegalArgumentException("Alleles for a VariantContext must contain at most one reference allele: " + alleles);
-                alleleList.add(0, a);
-                sawRef = true;
-            }
-            else
-                alleleList.add(a);
-        }
-
-        if ( alleleList.isEmpty() )
-            throw new IllegalArgumentException("Cannot create a VariantContext with an empty allele list");
-
-        if ( alleleList.get(0).isNonReference() )
-            throw new IllegalArgumentException("Alleles for a VariantContext must contain at least one reference allele: " + alleles);
-
-        return alleleList;
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // Fully decode
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    /**
-     * Return a VC equivalent to this one but where all fields are fully decoded
-     *
-     * See VariantContext document about fully decoded
-     *
-     * @param header containing types about all fields in this VC
-     * @return a fully decoded version of this VC
-     */
-    public VariantContext fullyDecode(final VCFHeader header, final boolean lenientDecoding) {
-        if ( isFullyDecoded() )
-            return this;
-        else {
-            // TODO -- warning this is potentially very expensive as it creates copies over and over
-            final VariantContextBuilder builder = new VariantContextBuilder(this);
-            fullyDecodeInfo(builder, header, lenientDecoding);
-            fullyDecodeGenotypes(builder, header);
-            builder.fullyDecoded(true);
-            return builder.make();
-        }
-    }
-
-    /**
-     * See VariantContext document about fully decoded
-     * @return true if this is a fully decoded VC
-     */
-    public boolean isFullyDecoded() {
-        return fullyDecoded;
-    }
-
-    private final void fullyDecodeInfo(final VariantContextBuilder builder, final VCFHeader header, final boolean lenientDecoding) {
-        builder.attributes(fullyDecodeAttributes(getAttributes(), header, lenientDecoding));
-    }
-
-    private final Map<String, Object> fullyDecodeAttributes(final Map<String, Object> attributes,
-                                                            final VCFHeader header,
-                                                            final boolean lenientDecoding) {
-        final Map<String, Object> newAttributes = new HashMap<>(10);
-
-        for ( final Map.Entry<String, Object> attr : attributes.entrySet() ) {
-            final String field = attr.getKey();
-
-            if ( field.equals(VCFConstants.GENOTYPE_FILTER_KEY) )
-                continue; // gross, FT is part of the extended attributes
-
-            final VCFCompoundHeaderLine format = VariantContextUtils.getMetaDataForField(header, field);
-            final Object decoded = decodeValue(field, attr.getValue(), format);
-
-            if ( decoded != null &&
-                    ! lenientDecoding
-                    && format.getCountType() != VCFHeaderLineCount.UNBOUNDED
-                    && format.getType() != VCFHeaderLineType.Flag ) { // we expect exactly the right number of elements
-                final int obsSize = decoded instanceof List ? ((List) decoded).size() : 1;
-                final int expSize = format.getCount(this);
-                if ( obsSize != expSize ) {
-                    throw new TribbleException.InvalidHeader("Discordant field size detected for field " +
-                            field + " at " + getContig() + ":" + getStart() + ".  Field had " + obsSize + " values " +
-                            "but the header says this should have " + expSize + " values based on header record " +
-                            format);
-                }
-            }
-            newAttributes.put(field, decoded);
-        }
-
-        return newAttributes;
-    }
-
-    private final Object decodeValue(final String field, final Object value, final VCFCompoundHeaderLine format) {
-        if ( value instanceof String ) {
-            if ( field.equals(VCFConstants.GENOTYPE_PL_KEY) )
-                return GenotypeLikelihoods.fromPLField((String)value);
-
-            final String string = (String)value;
-            if ( string.indexOf(',') != -1 ) {
-                final String[] splits = string.split(",");
-                final List<Object> values = new ArrayList<>(splits.length);
-                for ( int i = 0; i < splits.length; i++ )
-                    values.add(decodeOne(field, splits[i], format));
-                return values;
-            } else {
-                return decodeOne(field, string, format);
-            }
-        } else if ( value instanceof List && (((List) value).get(0)) instanceof String ) {
-            final List<String> asList = (List<String>)value;
-            final List<Object> values = new ArrayList<>(asList.size());
-            for ( final String s : asList )
-                values.add(decodeOne(field, s, format));
-            return values;
-        } else {
-            return value;
-        }
-
-        // allowMissingValuesComparedToHeader
-    }
-
-    private final Object decodeOne(final String field, final String string, final VCFCompoundHeaderLine format) {
-        try {
-            if ( string.equals(VCFConstants.MISSING_VALUE_v4) )
-                return null;
-            else {
-                switch ( format.getType() ) {
-                    case Character: return string;
-                    case Flag:
-                        final boolean b = Boolean.valueOf(string) || string.equals("1");
-                        if ( b == false )
-                            throw new TribbleException("VariantContext FLAG fields " + field + " cannot contain false values"
-                                    + " as seen at " + getContig() + ":" + getStart());
-                        return b;
-                    case String:    return string;
-                    case Integer:   return Integer.valueOf(string);
-                    case Float:     return Double.valueOf(string);
-                    default: throw new TribbleException("Unexpected type for field" + field);
-                }
-            }
-        } catch (NumberFormatException e) {
-            throw new TribbleException("Could not decode field " + field + " with value " + string + " of declared type " + format.getType());
-        }
-    }
-
-    private final void fullyDecodeGenotypes(final VariantContextBuilder builder, final VCFHeader header) {
-        final GenotypesContext gc = new GenotypesContext();
-        for ( final Genotype g : getGenotypes() ) {
-            gc.add(fullyDecodeGenotypes(g, header));
-        }
-        builder.genotypesNoValidation(gc);
-    }
-
-    private final Genotype fullyDecodeGenotypes(final Genotype g, final VCFHeader header) {
-        final Map<String, Object> map = fullyDecodeAttributes(g.getExtendedAttributes(), header, true);
-        return new GenotypeBuilder(g).attributes(map).make();
-    }
-
-    // ---------------------------------------------------------------------------------------------------------
-    //
-    // tribble integration routines -- not for public consumption
-    //
-    // ---------------------------------------------------------------------------------------------------------
-
-    @Override
-    public String getContig() {
-        return contig;
-    }
-
-    /**
-     * @return 1-based inclusive start position of the Variant
-     * INDEL events usually start on the first unaltered reference base before the INDEL
-     * 
-     * <strong>Warning:</strong> be aware that the start position of the VariantContext is defined in terms of the start position specified in the
-     * underlying vcf file, VariantContexts representing the same biological event may have different start positions depending on the
-     * specifics of the vcf file they are derived from
-     */
-    public int getStart() {
-        return (int)start;
-    }
-
-    /**
-     * @return 1-based closed end position of the Variant
-     * If the END info field is specified that value is returned, otherwise the end is the start + reference allele length - 1.
-     * For VariantContexts with a single alternate allele, if that allele is an insertion, the end position will be on the reference base
-     * before the insertion event.  If the single alt allele is a deletion, the end will be on the final deleted reference base.
-     */
-    public int getEnd() {
-        return (int)stop;
-    }
-
-    public boolean hasSymbolicAlleles() {
-        return hasSymbolicAlleles(getAlleles());
-    }
-
-    public static boolean hasSymbolicAlleles( final List<Allele> alleles ) {
-        return alleles.stream().anyMatch(Allele::isSymbolic);
-    }
-
-    public Allele getAltAlleleWithHighestAlleleCount() {
-        // optimization: for bi-allelic sites, just return the only alt allele
-        if ( isBiallelic() )
-            return getAlternateAllele(0);
-
-        return getAlternateAlleles().stream()
-                .max(Comparator.comparing(this::getCalledChrCount))
-                .orElse(null);
-    }
-
-    /**
-     * Lookup the index of allele in this variant context
-     *
-     * @param allele the allele whose index we want to get
-     * @return the index of the allele into getAlleles(), or -1 if it cannot be found
-     */
-    public int getAlleleIndex(final Allele allele) {
-        return getAlleles().indexOf(allele);
-    }
-
-    /**
-     * Return the allele index #getAlleleIndex for each allele in alleles
-     *
-     * @param alleles the alleles we want to look up
-     * @return a list of indices for each allele, in order
-     */
-    public List<Integer> getAlleleIndices(final Collection<Allele> alleles) {
-        return alleles.stream()
-                .map(this::getAlleleIndex)
-                .collect(Collectors.toCollection(() -> new ArrayList<>(alleles.size())));
-    }
-
-    public int[] getGLIndecesOfAlternateAllele(Allele targetAllele) {
-        final int index = getAlleleIndex(targetAllele);
-        if ( index == -1 ) throw new IllegalArgumentException("Allele " + targetAllele + " not in this VariantContex " + this);
-        return GenotypeLikelihoods.getPLIndecesOfAlleles(0, index);
-    }
-    
-    /** 
-     * Search for the INFO=SVTYPE and return the type of Structural Variant 
-     * @return the StructuralVariantType of null if there is no property SVTYPE 
-     * */
-    public StructuralVariantType getStructuralVariantType() {
-        final String svType = this.getAttributeAsString(VCFConstants.SVTYPE, null);
-        return svType == null ? null : StructuralVariantType.valueOf(svType);
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantContextBuilder.java b/src/main/java/htsjdk/variant/variantcontext/VariantContextBuilder.java
deleted file mode 100644
index 33844db..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/VariantContextBuilder.java
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * <p>Builder class for <code>VariantContext</code>.</p>
- *
- * <p>Some basic assumptions here:</p>
- * <ol>
- * <li> data isn't protectively copied.  If you provide an attribute map to
- * the build, and modify it later, the builder will see this and so will any
- * resulting variant contexts.  It's best not to modify collections provided
- * to a builder.</li>
- *
- * <li> the system uses the standard builder model, allowing the simple construction idiom:
- *<blockquote>
- *   <code>builder.source("a").genotypes(gc).id("x").make()</code> => <code>VariantContext</code>
- *</blockquote></li>
- *<li>The best way to copy a VariantContext is:
- *<blockquote>
- *   <code>new VariantContextBuilder(vc).make()</code> => a copy of VC
- *</blockquote>
- * <li> validation of arguments is done at the during the final <code>make()</code> call, so a
- * <code>VariantContextBuilder</code> can exist in an inconsistent state as long as those issues
- * are resolved before the call to <code>make()</code> is issued.
- *</ol>
- * @author depristo
- */
-public class VariantContextBuilder {
-    // required fields
-    private boolean fullyDecoded = false;
-    private String source = null;
-    private String contig = null;
-    private long start = -1;
-    private long stop = -1;
-    private Collection<Allele> alleles = null;
-
-    // optional -> these are set to the appropriate default value
-    private String ID = VCFConstants.EMPTY_ID_FIELD;
-    private GenotypesContext genotypes = GenotypesContext.NO_GENOTYPES;
-    private double log10PError = VariantContext.NO_LOG10_PERROR;
-    private Set<String> filters = null;
-    private Map<String, Object> attributes = null;
-    private boolean attributesCanBeModified = false;
-
-    /** enum of what must be validated */
-    final private EnumSet<VariantContext.Validation> toValidate = EnumSet.noneOf(VariantContext.Validation.class);
-
-    /**
-     * Create an empty VariantContextBuilder where all values adopt their default values.  Note that
-     * source, chr, start, stop, and alleles must eventually be filled in, or the resulting VariantContext
-     * will throw an error.
-     */
-    public VariantContextBuilder() {}
-
-    /**
-     * Create an empty VariantContextBuilder where all values adopt their default values, but the bare min.
-     * of info (source, chr, start, stop, and alleles) have been provided to start.
-     */
-    public VariantContextBuilder(final String source, final String contig, final long start, final long stop, final Collection<Allele> alleles) {
-        this.source = source;
-        this.contig = contig;
-        this.start = start;
-        this.stop = stop;
-        this.alleles = alleles;
-        this.attributes = Collections.emptyMap(); // immutable
-        toValidate.add(VariantContext.Validation.ALLELES);
-    }
-
-    /**
-     * Returns a new builder based on parent -- the new VC will have all fields initialized
-     * to their corresponding values in parent.  This is the best way to create a derived VariantContext
-     *
-     * @param parent  Cannot be null
-     */
-    public VariantContextBuilder(final VariantContext parent) {
-        if ( parent == null ) throw new IllegalArgumentException("BUG: VariantContextBuilder parent argument cannot be null in VariantContextBuilder");
-        this.alleles = parent.getAlleles();
-        this.attributes = parent.getAttributes();
-        this.attributesCanBeModified = false;
-        this.contig = parent.getContig();
-        this.filters = parent.getFiltersMaybeNull();
-        this.genotypes = parent.getGenotypes();
-        this.ID = parent.getID();
-        this.log10PError = parent.getLog10PError();
-        this.source = parent.getSource();
-        this.start = parent.getStart();
-        this.stop = parent.getEnd();
-        this.fullyDecoded = parent.isFullyDecoded();
-    }
-
-    public VariantContextBuilder(final VariantContextBuilder parent) {
-        if ( parent == null ) throw new IllegalArgumentException("BUG: VariantContext parent argument cannot be null in VariantContextBuilder");
-        this.alleles = parent.alleles;
-        this.attributesCanBeModified = false;
-        this.contig = parent.contig;
-        this.genotypes = parent.genotypes;
-        this.ID = parent.ID;
-        this.log10PError = parent.log10PError;
-        this.source = parent.source;
-        this.start = parent.start;
-        this.stop = parent.stop;
-        this.fullyDecoded = parent.fullyDecoded;
-
-        this.attributes(parent.attributes);
-        this.filters(parent.filters);
-    }
-
-    public VariantContextBuilder copy() {
-        return new VariantContextBuilder(this);
-    }
-
-    /**
-     * Tells this builder to use this collection of alleles for the resulting VariantContext
-     *
-     * @param alleles
-     * @return this builder
-     */
-    public VariantContextBuilder alleles(final Collection<Allele> alleles) {
-        this.alleles = alleles;
-        toValidate.add(VariantContext.Validation.ALLELES);
-        return this;
-    }
-
-    public VariantContextBuilder alleles(final List<String> alleleStrings) {
-        final List<Allele> alleles = new ArrayList<Allele>(alleleStrings.size());
-
-        for ( int i = 0; i < alleleStrings.size(); i++ ) {
-            alleles.add(Allele.create(alleleStrings.get(i), i == 0));
-        }
-
-        return alleles(alleles);
-    }
-
-    public VariantContextBuilder alleles(final String ... alleleStrings) {
-        return alleles(Arrays.asList(alleleStrings));
-    }
-
-    public List<Allele> getAlleles() {
-        return new ArrayList<Allele>(alleles);
-    }
-
-    /**
-     * Tells this builder to use this map of attributes for the resulting <code>VariantContext</code>. The
-     * contents of the Map are copied to a new Map to ensure that modifications to the provided Map post-invocation
-     * don't affect the VariantContext and also to ensure additional attributes can be added in case the provided
-     * map doesn't support changes (e.g. UnmodifiableMap).
-     *
-     * Attributes can be <code>null</code> -> meaning there are no attributes.  After
-     * calling this routine the builder assumes it can modify the attributes
-     * object here, if subsequent calls are made to set attribute values
-     *
-     * Value for each attribute must be of a type that implements {@link Serializable} or else
-     * serialization will fail.
-     *
-     * @param attributes a Map of attributes to replace any existing attributes with
-     */
-    public VariantContextBuilder attributes(final Map<String, ?> attributes) {
-        this.attributes = new HashMap<>();
-        if (attributes != null) this.attributes.putAll(attributes);
-        this.attributesCanBeModified = true;
-        return this;
-    }
-
-    /**
-     * Puts the key -> value mapping into this builder's attributes
-     *
-     * @param key key for the attribute
-     * @param value value for the attribute (must be of a type that implements {@link Serializable} or else serialization will fail)
-     */
-    public VariantContextBuilder attribute(final String key, final Object value) {
-        makeAttributesModifiable();
-        attributes.put(key, value);
-        return this;
-    }
-
-    /**
-     * Removes key if present in the attributes
-     *
-     * @param key  key to remove
-     * @return
-     */
-    public VariantContextBuilder rmAttribute(final String key) {
-        makeAttributesModifiable();
-        attributes.remove(key);
-        return this;
-    }
-
-    /**
-     * Removes list of keys if present in the attributes
-     *
-     * @param keys  list of keys to remove
-     * @return
-     */
-    public VariantContextBuilder rmAttributes(final List<String> keys) {
-        makeAttributesModifiable();
-        for ( final String key : keys )
-            attributes.remove(key);
-        return this;
-    }
-
-    /**
-     * Makes the attributes field modifiable.  In many cases attributes is just a pointer to an immutable
-     * collection, so methods that want to add / remove records require the attributes to be copied to a
-     */
-    private void makeAttributesModifiable() {
-        if ( ! attributesCanBeModified ) {
-            this.attributesCanBeModified = true;
-            if (attributes == null) {
-            	this.attributes = new HashMap<String, Object>();
-            } else {
-            	this.attributes = new HashMap<String, Object>(attributes);
-            }
-        }
-    }
-
-    /**
-     * This builder's filters are set to this value
-     *
-     * filters can be <code>null</code> -> meaning there are no filters
-     * @param filters
-     */
-    public VariantContextBuilder filters(final Set<String> filters) {
-        this.filters = filters;
-        return this;
-    }
-
-    /**
-     * {@link #filters}
-     *
-     * @param filters
-     * @return
-     */
-    public VariantContextBuilder filters(final String ... filters) {
-        filters(new LinkedHashSet<String>(Arrays.asList(filters)));
-        return this;
-    }
-
-    public VariantContextBuilder filter(final String filter) {
-        if ( this.filters == null ) this.filters = new LinkedHashSet<String>(1);
-        this.filters.add(filter);
-        return this;
-    }
-
-    /**
-     * Tells this builder that the resulting VariantContext should have PASS filters
-     *
-     * @return
-     */
-    public VariantContextBuilder passFilters() {
-        return filters(VariantContext.PASSES_FILTERS);
-    }
-
-    /**
-     * Tells this builder that the resulting VariantContext be unfiltered
-     *
-     * @return
-     */
-    public VariantContextBuilder unfiltered() {
-        this.filters = null;
-        return this;
-    }
-
-    /**
-     * Tells this builder that the resulting <code>VariantContext</code> should use this genotype's <code>GenotypeContext</code>.
-     *
-     * Note that genotypes can be <code>null</code> -> meaning there are no genotypes
-     *
-     * @param genotypes
-     */
-    public VariantContextBuilder genotypes(final GenotypesContext genotypes) {
-        this.genotypes = genotypes;
-        if ( genotypes != null )
-            toValidate.add(VariantContext.Validation.GENOTYPES);
-        return this;
-    }
-
-    public VariantContextBuilder genotypesNoValidation(final GenotypesContext genotypes) {
-        this.genotypes = genotypes;
-        return this;
-    }
-
-    /**
-     * Tells this builder that the resulting <code>VariantContext</code> should use a <code>GenotypeContext</code> containing genotypes
-     *
-     * Note that genotypes can be <code>null</code>, meaning there are no genotypes
-     *
-     * @param genotypes
-     */
-    public VariantContextBuilder genotypes(final Collection<Genotype> genotypes) {
-        return genotypes(GenotypesContext.copy(genotypes));
-    }
-
-    /**
-     * Tells this builder that the resulting <code>VariantContext</code> should use a <code>GenotypeContext</code> containing genotypes
-     * @param genotypes
-     */
-    public VariantContextBuilder genotypes(final Genotype ... genotypes) {
-        return genotypes(GenotypesContext.copy(Arrays.asList(genotypes)));
-    }
-
-    /**
-     * Tells this builder that the resulting VariantContext should not contain any GenotypeContext
-     */
-    public VariantContextBuilder noGenotypes() {
-        this.genotypes = null;
-        return this;
-    }
-
-    /**
-     * Tells us that the resulting VariantContext should have ID
-     * @param ID
-     * @return
-     */
-    public VariantContextBuilder id(final String ID) {
-        this.ID = ID;
-        return this;
-    }
-
-    /**
-     * Tells us that the resulting VariantContext should not have an ID
-     * @return
-     */
-    public VariantContextBuilder noID() {
-        return id(VCFConstants.EMPTY_ID_FIELD);
-    }
-
-    /**
-     * Tells us that the resulting VariantContext should have log10PError
-     * @param log10PError
-     * @return
-     */
-    public VariantContextBuilder log10PError(final double log10PError) {
-        this.log10PError = log10PError;
-        return this;
-    }
-
-    /**
-     * Tells us that the resulting VariantContext should have source field set to source
-     * @param source
-     * @return
-     */
-    public VariantContextBuilder source(final String source) {
-        this.source = source;
-        return this;
-    }
-
-    /**
-     * Tells us that the resulting VariantContext should have the specified location
-     * @param contig
-     * @param start
-     * @param stop
-     * @return
-     */
-    public VariantContextBuilder loc(final String contig, final long start, final long stop) {
-        this.contig = contig;
-        this.start = start;
-        this.stop = stop;
-        toValidate.add(VariantContext.Validation.ALLELES);
-        return this;
-    }
-
-    /**
-     * Tells us that the resulting VariantContext should have the specified contig chr
-     * @param contig
-     * @return
-     */
-    public VariantContextBuilder chr(final String contig) {
-        this.contig = contig;
-        return this;
-    }
-
-    /**
-     * Tells us that the resulting VariantContext should have the specified contig start
-     * @param start
-     * @return
-     */
-    public VariantContextBuilder start(final long start) {
-        this.start = start;
-        toValidate.add(VariantContext.Validation.ALLELES);
-        return this;
-    }
-
-    /**
-     * Tells us that the resulting VariantContext should have the specified contig stop
-     * @param stop
-     * @return
-     */
-    public VariantContextBuilder stop(final long stop) {
-        this.stop = stop;
-        return this;
-    }
-
-    /**
-     * @see #computeEndFromAlleles(java.util.List, int, int) with endForSymbolicAlleles == -1
-     */
-    public VariantContextBuilder computeEndFromAlleles(final List<Allele> alleles, final int start) {
-        return computeEndFromAlleles(alleles, start, -1);
-    }
-
-    /**
-     * Compute the end position for this VariantContext from the alleles themselves
-     *
-     * assigns this builder the stop position computed.
-     *
-     * @param alleles the list of alleles to consider.  The reference allele must be the first one
-     * @param start the known start position of this event
-     * @param endForSymbolicAlleles the end position to use if any of the alleles is symbolic.  Can be -1
-     *                              if no is expected but will throw an error if one is found
-     * @return this builder
-     */
-    public VariantContextBuilder computeEndFromAlleles(final List<Allele> alleles, final int start, final int endForSymbolicAlleles) {
-        stop(VariantContextUtils.computeEndFromAlleles(alleles, start, endForSymbolicAlleles));
-        return this;
-    }
-
-    /**
-     * @return true if this builder contains fully decoded data
-     *
-     * See VariantContext for more information
-     */
-    public boolean isFullyDecoded() {
-        return fullyDecoded;
-    }
-
-    /**
-     * Sets this builder's fully decoded state to true.
-     *
-     * A fully decoded builder indicates that all fields are represented by their
-     * proper java objects (e.g., Integer(10) not "10").
-     *
-     * See VariantContext for more information
-     *
-     * @param isFullyDecoded
-     */
-    public VariantContextBuilder fullyDecoded(boolean isFullyDecoded) {
-        this.fullyDecoded = isFullyDecoded;
-        return this;
-    }
-
-    /**
-     * Takes all of the builder data provided up to this point, and instantiates
-     * a freshly allocated VariantContext with all of the builder data.  This
-     * VariantContext is validated as appropriate and if not failing QC (and
-     * throwing an exception) is returned.
-     *
-     * Note that this function can be called multiple times to create multiple
-     * VariantContexts from the same builder.
-     */
-    public VariantContext make() {
-        return make(false);
-    }
-
-    public VariantContext make(final boolean leaveModifyableAsIs) {
-        if(!leaveModifyableAsIs) attributesCanBeModified = false;
-
-        return new VariantContext(source, ID, contig, start, stop, alleles,
-                genotypes, log10PError, filters, attributes,
-                fullyDecoded, toValidate);
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantContextComparator.java b/src/main/java/htsjdk/variant/variantcontext/VariantContextComparator.java
deleted file mode 100644
index d4e288f..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/VariantContextComparator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package htsjdk.variant.variantcontext;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.variant.vcf.VCFContigHeaderLine;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A Comparator that orders VariantContexts by the ordering of the contigs/chromosomes in the List
- * provided at construction time, then by start position with each contig/chromosome.
- */
-public class VariantContextComparator implements Comparator<VariantContext>, Serializable {
-	private static final long serialVersionUID = 1L;
-
-	public static List<String> getSequenceNameList(final SAMSequenceDictionary dictionary) {
-		final List<String> list = new ArrayList<String>();
-		for (final SAMSequenceRecord record : dictionary.getSequences()) {
-			list.add(record.getSequenceName());
-		}
-		return list;
-	}
-
-	// For fast lookup of the contig's index in the contig list
-	private final Map<String, Integer> contigIndexLookup;
-
-	public VariantContextComparator(final List<String> contigs) {
-		if (contigs.isEmpty()) throw new IllegalArgumentException("One or more contigs must be in the contig list.");
-
-		final Map<String, Integer> protoContigIndexLookup = new HashMap<String, Integer>();
-		int index = 0;
-		for (final String contig : contigs) {
-			protoContigIndexLookup.put(contig, index++);
-		}
-
-		if (protoContigIndexLookup.size() != contigs.size()) {
-			throw new IllegalArgumentException("There are duplicate contigs/chromosomes in the input contig list.");
-		}
-
-		this.contigIndexLookup = Collections.unmodifiableMap(protoContigIndexLookup);
-	}
-
-	/**
-	 * Creates a VariantContextComparator from the given VCF contig header lines. The header lines'
-	 * index values are used to order the contigs. Throws IllegalArgumentException if there are dupe
-	 *
-	 */
-	public VariantContextComparator(final Collection<VCFContigHeaderLine> headerLines) {
-		if (headerLines.isEmpty()) throw new IllegalArgumentException("One or more header lines must be in the header line collection.");
-
-		final Map<String, Integer> protoContigIndexLookup = new HashMap<String, Integer>();
-		for (final VCFContigHeaderLine headerLine : headerLines) {
-			protoContigIndexLookup.put(headerLine.getID(), headerLine.getContigIndex());
-		}
-
-		if (protoContigIndexLookup.size() != headerLines.size()) {
-			throw new IllegalArgumentException("There are duplicate contigs/chromosomes in the input header line collection.");
-		}
-
-		final Set<Integer> protoIndexValues = new HashSet<Integer>(protoContigIndexLookup.values());
-		if (protoIndexValues.size() != headerLines.size()) {
-			throw new IllegalArgumentException("One or more contigs share the same index number.");
-		}
-
-		this.contigIndexLookup = Collections.unmodifiableMap(protoContigIndexLookup);
-	}
-
-    public VariantContextComparator(final SAMSequenceDictionary dictionary) {
-	    this(getSequenceNameList(dictionary));
-    }
-
-	@Override
-	public int compare(final VariantContext firstVariantContext, final VariantContext secondVariantContext) {
-		// Will throw NullPointerException -- happily -- if either of the chromosomes/contigs aren't
-		// present. This error checking should already have been done in the constructor but it's left
-		// in as defence anyway.
-		final int contigCompare =
-				this.contigIndexLookup.get(firstVariantContext.getContig()) - this.contigIndexLookup.get(secondVariantContext.getContig());
-		return contigCompare != 0
-				? contigCompare
-				: firstVariantContext.getStart() - secondVariantContext.getStart();
-	}
-
-	/**
-	 * Returns true if the given header lines are from a file sorted according to this VariantContextComparator.
-	 * For sorting to work properly, the contig in each header line must have the same index.
-	 */
-	public boolean isCompatible(final Collection<VCFContigHeaderLine> headerLines) {
-		for (final VCFContigHeaderLine headerLine : headerLines) {
-			final Integer existingIndex = this.contigIndexLookup.get(headerLine.getID());
-			if (existingIndex == null || headerLine.getContigIndex() != existingIndex.intValue()) return false;
-		}
-
-		return true;
-	}
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantContextUtils.java b/src/main/java/htsjdk/variant/variantcontext/VariantContextUtils.java
deleted file mode 100644
index face55b..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/VariantContextUtils.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.samtools.util.Lazy;
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.vcf.VCFCompoundHeaderLine;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLineCount;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-import htsjdk.variant.vcf.VCFInfoHeaderLine;
-import org.apache.commons.jexl2.Expression;
-import org.apache.commons.jexl2.JexlEngine;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class VariantContextUtils {
-    private static Set<String> MISSING_KEYS_WARNED_ABOUT = new HashSet<String>();
-
-    /** Use a {@link Lazy} {@link JexlEngine} instance to avoid class-loading issues. (Applications that access this class are otherwise
-     * forced to build a {@link JexlEngine} instance, which depends on some apache logging libraries that mightn't be packaged.) */
-    final public static Lazy<JexlEngine> engine = new Lazy<JexlEngine>(new Lazy.LazyInitializer<JexlEngine>() {
-        @Override
-        public JexlEngine make() {
-            final JexlEngine jexl = new JexlEngine();
-            jexl.setSilent(false); // will throw errors now for selects that don't evaluate properly
-            jexl.setLenient(false);
-            jexl.setDebug(false);
-            return jexl;
-        }
-    });
-    private final static boolean ASSUME_MISSING_FIELDS_ARE_STRINGS = false;
-    
-    /**
-     * Computes the alternate allele frequency at the provided {@link VariantContext} by dividing its "AN" by its "AC".
-     * @param vc The variant whose alternate allele frequency is computed
-     * @return The alternate allele frequency in [0, 1]
-     * @throws AssertionError When either annotation is missing, or when the compuated frequency is outside the expected range
-     */
-    public static double calculateAltAlleleFrequency(final VariantContext vc) {
-        if (!vc.hasAttribute(VCFConstants.ALLELE_NUMBER_KEY) || !vc.hasAttribute(VCFConstants.ALLELE_COUNT_KEY))
-            throw new AssertionError(String.format(
-                    "Cannot compute the provided variant's alt allele frequency because it does not have both %s and %s annotations: %s",
-                    VCFConstants.ALLELE_NUMBER_KEY,
-                    VCFConstants.ALLELE_COUNT_KEY,
-                    vc));
-        final double altAlleleCount = vc.getAttributeAsInt(VCFConstants.ALLELE_COUNT_KEY, 0);
-        final double totalCount = vc.getAttributeAsInt(VCFConstants.ALLELE_NUMBER_KEY, 0);
-        final double aaf = altAlleleCount / totalCount;
-        if (aaf > 1 || aaf < 0)
-            throw new AssertionError(String.format("Expected a minor allele frequency in the range [0, 1], but got %s. vc=%s", aaf, vc));
-        return aaf;
-    }
-    
-    /**
-     * Update the attributes of the attributes map given the VariantContext to reflect the
-     * proper chromosome-based VCF tags
-     *
-     * @param vc          the VariantContext
-     * @param attributes  the attributes map to populate; must not be null; may contain old values
-     * @param removeStaleValues should we remove stale values from the mapping?
-     * @return the attributes map provided as input, returned for programming convenience
-     */
-    public static Map<String, Object> calculateChromosomeCounts(VariantContext vc, Map<String, Object> attributes, boolean removeStaleValues) {
-        return calculateChromosomeCounts(vc, attributes,  removeStaleValues, new HashSet<String>(0));
-    }
-
-    /**
-     * Update the attributes of the attributes map given the VariantContext to reflect the
-     * proper chromosome-based VCF tags
-     *
-     * @param vc          the VariantContext
-     * @param attributes  the attributes map to populate; must not be null; may contain old values
-     * @param removeStaleValues should we remove stale values from the mapping?
-     * @param founderIds - Set of founders Ids to take into account. AF and FC will be calculated over the founders.
-     *                  If empty or null, counts are generated for all samples as unrelated individuals
-     * @return the attributes map provided as input, returned for programming convenience
-     */
-    public static Map<String, Object> calculateChromosomeCounts(VariantContext vc, Map<String, Object> attributes, boolean removeStaleValues, final Set<String> founderIds) {
-        final int AN = vc.getCalledChrCount();
-
-        // if everyone is a no-call, remove the old attributes if requested
-        if ( AN == 0 && removeStaleValues ) {
-            if ( attributes.containsKey(VCFConstants.ALLELE_COUNT_KEY) )
-                attributes.remove(VCFConstants.ALLELE_COUNT_KEY);
-            if ( attributes.containsKey(VCFConstants.ALLELE_FREQUENCY_KEY) )
-                attributes.remove(VCFConstants.ALLELE_FREQUENCY_KEY);
-            if ( attributes.containsKey(VCFConstants.ALLELE_NUMBER_KEY) )
-                attributes.remove(VCFConstants.ALLELE_NUMBER_KEY);
-            return attributes;
-        }
-
-        if ( vc.hasGenotypes() ) {
-            attributes.put(VCFConstants.ALLELE_NUMBER_KEY, AN);
-
-            // if there are alternate alleles, record the relevant tags
-            if (!vc.getAlternateAlleles().isEmpty()) {
-                ArrayList<Double> alleleFreqs = new ArrayList<Double>();
-                ArrayList<Integer> alleleCounts = new ArrayList<Integer>();
-                ArrayList<Integer> foundersAlleleCounts = new ArrayList<Integer>();
-                double totalFoundersChromosomes = (double)vc.getCalledChrCount(founderIds);
-                int foundersAltChromosomes;
-                for ( Allele allele : vc.getAlternateAlleles() ) {
-                    foundersAltChromosomes = vc.getCalledChrCount(allele,founderIds);
-                    alleleCounts.add(vc.getCalledChrCount(allele));
-                    foundersAlleleCounts.add(foundersAltChromosomes);
-                    if ( AN == 0 ) {
-                        alleleFreqs.add(0.0);
-                    } else {
-                        final Double freq = (double)foundersAltChromosomes / totalFoundersChromosomes;
-                        alleleFreqs.add(freq);
-                    }
-                }
-
-                attributes.put(VCFConstants.ALLELE_COUNT_KEY, alleleCounts.size() == 1 ? alleleCounts.get(0) : alleleCounts);
-                attributes.put(VCFConstants.ALLELE_FREQUENCY_KEY, alleleFreqs.size() == 1 ? alleleFreqs.get(0) : alleleFreqs);
-            } else {
-                // if there's no alt AC and AF shouldn't be present
-                attributes.remove(VCFConstants.ALLELE_COUNT_KEY);
-                attributes.remove(VCFConstants.ALLELE_FREQUENCY_KEY);
-            }
-        }
-
-        return attributes;
-    }
-
-    /**
-     * Update the attributes of the attributes map in the VariantContextBuilder to reflect the proper
-     * chromosome-based VCF tags based on the current VC produced by builder.make()
-     *
-     * @param builder     the VariantContextBuilder we are updating
-     * @param removeStaleValues should we remove stale values from the mapping?
-     */
-    public static void calculateChromosomeCounts(VariantContextBuilder builder, boolean removeStaleValues) {
-        VariantContext vc = builder.make();
-        builder.attributes(calculateChromosomeCounts(vc, new HashMap<>(vc.getAttributes()), removeStaleValues, new HashSet<>(0)));
-    }
-
-    /**
-     * Update the attributes of the attributes map in the VariantContextBuilder to reflect the proper
-     * chromosome-based VCF tags based on the current VC produced by builder.make()
-     *
-     * @param builder     the VariantContextBuilder we are updating
-     * @param founderIds - Set of founders to take into account. AF and FC will be calculated over the founders only.
-     *                   If empty or null, counts are generated for all samples as unrelated individuals
-     * @param removeStaleValues should we remove stale values from the mapping?
-     */
-    public static void calculateChromosomeCounts(VariantContextBuilder builder, boolean removeStaleValues, final Set<String> founderIds) {
-        VariantContext vc = builder.make();
-        builder.attributes(calculateChromosomeCounts(vc, new HashMap<>(vc.getAttributes()), removeStaleValues, founderIds));
-    }
-
-    public final static VCFCompoundHeaderLine getMetaDataForField(final VCFHeader header, final String field) {
-        VCFCompoundHeaderLine metaData = header.getFormatHeaderLine(field);
-        if ( metaData == null ) metaData = header.getInfoHeaderLine(field);
-        if ( metaData == null ) {
-            if ( ASSUME_MISSING_FIELDS_ARE_STRINGS ) {
-                if ( ! MISSING_KEYS_WARNED_ABOUT.contains(field) ) {
-                    MISSING_KEYS_WARNED_ABOUT.add(field);
-                    if ( GeneralUtils.DEBUG_MODE_ENABLED )
-                        System.err.println("Field " + field + " missing from VCF header, assuming it is an unbounded string type");
-                }
-                return new VCFInfoHeaderLine(field, VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "Auto-generated string header for " + field);
-            }
-            else
-                throw new TribbleException("Fully decoding VariantContext requires header line for all fields, but none was found for " + field);
-        }
-        return metaData;
-    }
-
-    /**
-     * A simple but common wrapper for matching {@link VariantContext} objects using JEXL expressions
-     */
-    public static class JexlVCMatchExp {
-        public String name;
-        public Expression exp;
-
-        /**
-         * Create a new matcher expression with name and JEXL expression exp
-         * @param name name
-         * @param exp  expression
-         * @throws IllegalArgumentException if either argument is {@code null}
-         */
-        public JexlVCMatchExp(String name, Expression exp) {
-            if (name == null) { throw new IllegalArgumentException("Cannot create JexlVCMatchExp with null name."); }
-            if (exp  == null) { throw new IllegalArgumentException("Cannot create JexlVCMatchExp with null expression."); }
-
-            this.name = name;
-            this.exp = exp;
-        }
-    }
-
-    /**
-     * Method for creating JexlVCMatchExp from input walker arguments names and exps.  These two arrays contain
-     * the name associated with each JEXL expression. initializeMatchExps will parse each expression and return
-     * a list of JexlVCMatchExp, in order, that correspond to the names and exps.  These are suitable input to
-     * match() below.
-     *
-     * @param names names
-     * @param exps  expressions
-     * @return list of matches
-     */
-    public static List<JexlVCMatchExp> initializeMatchExps(String[] names, String[] exps) {
-        if ( names == null || exps == null )
-            throw new IllegalArgumentException("BUG: neither names nor exps can be null: names " + Arrays.toString(names) + " exps=" + Arrays.toString(exps) );
-
-        if ( names.length != exps.length )
-            throw new IllegalArgumentException("Inconsistent number of provided filter names and expressions: names=" + Arrays.toString(names) + " exps=" + Arrays.toString(exps));
-
-        Map<String, String> map = new HashMap<String, String>();
-        for ( int i = 0; i < names.length; i++ ) { map.put(names[i], exps[i]); }
-
-        return VariantContextUtils.initializeMatchExps(map);
-    }
-
-    /**
-     * Method for creating JexlVCMatchExp from input walker arguments names and exps.  These two lists contain
-     * the name associated with each JEXL expression. initializeMatchExps will parse each expression and return
-     * a list of JexlVCMatchExp, in order, that correspond to the names and exps.  These are suitable input to
-     * match() below.
-     *
-     * @param names names
-     * @param exps  expressions
-     * @return list of matches
-     */
-    public static List<JexlVCMatchExp> initializeMatchExps(List<String> names, List<String> exps) {
-        String[] nameArray = new String[names.size()];
-        String[] expArray = new String[exps.size()];
-        return initializeMatchExps(names.toArray(nameArray), exps.toArray(expArray));
-    }
-
-    /**
-     * Method for creating JexlVCMatchExp from input walker arguments mapping from names to exps.  These two arrays contain
-     * the name associated with each JEXL expression. initializeMatchExps will parse each expression and return
-     * a list of JexlVCMatchExp, in order, that correspond to the names and exps.  These are suitable input to
-     * match() below.
-     *
-     * @param names_and_exps mapping of names to expressions
-     * @return list of matches
-     */
-    public static List<JexlVCMatchExp> initializeMatchExps(Map<String, String> names_and_exps) {
-        List<JexlVCMatchExp> exps = new ArrayList<>();
-
-        for ( Map.Entry<String, String> elt : names_and_exps.entrySet() ) {
-            String name = elt.getKey();
-            String expStr = elt.getValue();
-
-            if ( name == null || expStr == null ) throw new IllegalArgumentException("Cannot create null expressions : " + name +  " " + expStr);
-            try {
-                Expression exp = engine.get().createExpression(expStr);
-                exps.add(new JexlVCMatchExp(name, exp));
-            } catch (Exception e) {
-                throw new IllegalArgumentException("Argument " + name + "has a bad value. Invalid expression used (" + expStr + "). Please see the JEXL docs for correct syntax.") ;
-            }
-        }
-
-        return exps;
-    }
-
-    /**
-     * Returns true if {@code exp} match {@code vc}.
-     * See {@link #match(VariantContext, Collection)} for full docs.
-     * @param vc    variant context
-     * @param exp   expression
-     * @return      true if there is a match
-     */
-    public static boolean match(VariantContext vc, JexlVCMatchExp exp) {
-        return match(vc, Collections.singletonList(exp)).get(exp);
-    }
-
-    /**
-     * Matches each {@link JexlVCMatchExp} exp against the data contained in {@code vc},
-     * and returns a map from these expressions to {@code true} (if they matched) or {@code false} (if they didn't).
-     * This the best way to apply JEXL expressions to {@link VariantContext} records.
-     * Use the various {@code initializeMatchExps()}'s to create the list of {@link JexlVCMatchExp} expressions.
-     *
-     * Expressions that contain literals not available in the VariantContext or Genotype will be treated as not matching
-     * @param vc    variant context
-     * @param exps  expressions
-     * @return      true if there is a match
-     */
-    public static Map<JexlVCMatchExp, Boolean> match(VariantContext vc, Collection<JexlVCMatchExp> exps) {
-        return new JEXLMap(exps,vc);
-    }
-
-    /**
-     * Returns true if {@code exp} match {@code vc}, {@code g}.
-     * See {@link #match(VariantContext, Genotype, Collection)} for full docs.
-     * @param vc    variant context
-     * @param g     genotype
-     * @param exp   expression
-     * @return      true if there is a match
-     */
-    public static boolean match(VariantContext vc, Genotype g, JexlVCMatchExp exp) {
-        return match(vc, g, Collections.singletonList(exp), JEXLMap.DEFAULT_MISSING_VALUE_TREATMENT).get(exp);
-    }
-
-    /**
-     * Returns true if {@code exp} match {@code vc}, {@code g}.
-     * See {@link #match(VariantContext, Genotype, Collection)} for full docs.
-     * @param vc    variant context
-     * @param g     genotype
-     * @param exp   expression
-     * @param howToTreatMissingValues what to do if the jexl expression contains literals that aren't in the context
-     * @return      true if there is a match
-     */
-    public static boolean match(VariantContext vc, Genotype g, JexlVCMatchExp exp, JexlMissingValueTreatment howToTreatMissingValues) {
-        return match(vc, g, Collections.singletonList(exp), howToTreatMissingValues).get(exp);
-    }
-
-    /**
-     * Matches each {@link JexlVCMatchExp} exp against the data contained in {@code vc}, {@code g},
-     * and returns a map from these expressions to {@code true} (if they matched) or {@code false} (if they didn't).
-     * This the best way to apply JEXL expressions to {@link VariantContext} records.
-     * Use the various {@code initializeMatchExps()}'s to create the list of {@link JexlVCMatchExp} expressions.
-     *
-     * Expressions that contain literals not available in the VariantContext or Genotype will be treated as not matching
-     * @param vc    variant context
-     * @param g     genotype
-     * @param exps  expressions
-     * @return      true if there is a match
-     */
-    public static Map<JexlVCMatchExp, Boolean> match(VariantContext vc, Genotype g, Collection<JexlVCMatchExp> exps) {
-        return match(vc, g, exps, JEXLMap.DEFAULT_MISSING_VALUE_TREATMENT);
-    }
-
-    /**
-     * Matches each {@link JexlVCMatchExp} exp against the data contained in {@code vc}, {@code g},
-     * and returns a map from these expressions to {@code true} (if they matched) or {@code false} (if they didn't).
-     * This the best way to apply JEXL expressions to {@link VariantContext} records.
-     * Use the various {@code initializeMatchExps()}'s to create the list of {@link JexlVCMatchExp} expressions.
-     *
-     * @param vc    variant context
-     * @param g     genotype
-     * @param exps  expressions
-     * @param howToTreatMissingValues what to do if the jexl expression contains literals that aren't in the context
-     * @return      true if there is a match
-     */
-    public static Map<JexlVCMatchExp, Boolean> match(VariantContext vc, Genotype g, Collection<JexlVCMatchExp> exps, JexlMissingValueTreatment howToTreatMissingValues) {
-        return new JEXLMap(exps, vc, g, howToTreatMissingValues);
-    }
-
-    /**
-     * Answers if the provided variant is transitional (otherwise, it's transversional).
-     * Transitions:
-     * A->G
-     * G->A
-     * C->T
-     * T->C
-     * <p/>
-     * Transversions:
-     * A->C
-     * A->T
-     * C->A
-     * C->G
-     * G->C
-     * G->T
-     * T->A
-     * T->G
-     *
-     * @param vc a biallelic polymorphic SNP
-     * @return true if a transition and false if transversion
-     * @throws IllegalArgumentException if vc is monomorphic, not a SNP or not bi-allelic.
-
-          */
-    static public boolean isTransition(final VariantContext vc) throws IllegalArgumentException {
-        final byte refAllele = vc.getReference().getBases()[0];
-        final Collection<Allele> altAlleles = vc.getAlternateAlleles();
-
-        if(vc.getType() == VariantContext.Type.NO_VARIATION) {
-            throw new IllegalArgumentException("Variant context is monomorphic: " + vc.toString());
-        }
-
-        if(vc.getType() != VariantContext.Type.SNP) {
-            throw new IllegalArgumentException("Variant context is not a SNP: " + vc.toString());
-        }
-
-        if(altAlleles.size() != 1 ) {
-            throw new IllegalArgumentException("Expected exactly 1 alternative Allele. Found: " + altAlleles.size());
-        }
-
-        final Byte altAllele = altAlleles.iterator().next().getBases()[0];
-
-        return (refAllele == 'A' && altAllele == 'G')
-                || (refAllele == 'G' && altAllele == 'A')
-                || (refAllele == 'C' && altAllele == 'T')
-                || (refAllele == 'T' && altAllele == 'C');
-    }
-
-    /**
-     * Returns a newly allocated VC that is the same as VC, but without genotypes
-     * @param vc  variant context
-     * @return  new VC without genotypes
-     */
-    public static VariantContext sitesOnlyVariantContext(VariantContext vc) {
-        return new VariantContextBuilder(vc).noGenotypes().make();
-    }
-
-    /**
-     * Returns a newly allocated list of VC, where each VC is the same as the input VCs, but without genotypes
-     * @param vcs  collection of VCs
-     * @return new VCs without genotypes
-     */
-    public static Collection<VariantContext> sitesOnlyVariantContexts(Collection<VariantContext> vcs) {
-        List<VariantContext> r = new ArrayList<VariantContext>();
-        for ( VariantContext vc : vcs )
-            r.add(sitesOnlyVariantContext(vc));
-        return r;
-    }
-
-    public static int getSize( VariantContext vc ) {
-        return vc.getEnd() - vc.getStart() + 1;
-    }
-
-    public static Set<String> genotypeNames(final Collection<Genotype> genotypes) {
-        final Set<String> names = new HashSet<String>(genotypes.size());
-        for ( final Genotype g : genotypes )
-            names.add(g.getSampleName());
-        return names;
-    }
-
-    /**
-     * Compute the end position for this VariantContext from the alleles themselves
-     *
-     * In the trivial case this is a single BP event and end = start (open intervals)
-     * In general the end is start + ref length - 1, handling the case where ref length == 0
-     * However, if alleles contains a symbolic allele then we use endForSymbolicAllele in all cases
-     *
-     * @param alleles the list of alleles to consider.  The reference allele must be the first one
-     * @param start the known start position of this event
-     * @param endForSymbolicAlleles the end position to use if any of the alleles is symbolic.  Can be -1
-     *                              if no is expected but will throw an error if one is found
-     * @return this builder
-     */
-    public static int computeEndFromAlleles(final List<Allele> alleles, final int start, final int endForSymbolicAlleles) {
-        final Allele ref = alleles.get(0);
-
-        if ( ref.isNonReference() )
-            throw new IllegalStateException("computeEndFromAlleles requires first allele to be reference");
-
-        if ( VariantContext.hasSymbolicAlleles(alleles) ) {
-            if ( endForSymbolicAlleles == -1 )
-                throw new IllegalStateException("computeEndFromAlleles found a symbolic allele but endForSymbolicAlleles was provided");
-            return endForSymbolicAlleles;
-        } else {
-            return start + Math.max(ref.length() - 1, 0);
-        }
-    }
-
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantJEXLContext.java b/src/main/java/htsjdk/variant/variantcontext/VariantJEXLContext.java
deleted file mode 100644
index 34cde33..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/VariantJEXLContext.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import org.apache.commons.jexl2.JexlContext;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- *
- * @author aaron
- * @author depristo
- *
- * Class VariantJEXLContext
- *
- * implements the JEXL context for VariantContext; this saves us from
- * having to generate a JEXL context lookup map everytime we want to evaluate an expression.
- *
- * This is package protected, only classes in variantcontext should have access to it.
- *
- */
-
-class VariantJEXLContext implements JexlContext {
-    // our stored variant context
-    private VariantContext vc;
-
-    static final String true_string = "1";
-    static final String false_string = "0";
-
-    private interface AttributeGetter {
-        public Object get(VariantContext vc);
-    }
-
-    private static Map<String, AttributeGetter> attributes = new HashMap<String, AttributeGetter>();
-
-    static {
-        attributes.put("vc", (VariantContext vc) -> vc);
-        attributes.put("CHROM", VariantContext::getContig);
-        attributes.put("POS", VariantContext::getStart);
-        attributes.put("TYPE", (VariantContext vc) -> vc.getType().toString());
-        attributes.put("QUAL", (VariantContext vc) -> -10 * vc.getLog10PError());
-        attributes.put("ALLELES", VariantContext::getAlleles);
-        attributes.put("N_ALLELES", VariantContext::getNAlleles);
-        attributes.put("FILTER", (VariantContext vc) -> vc.isFiltered() ? true_string : false_string);
-
-        attributes.put("homRefCount", VariantContext::getHomRefCount);
-        attributes.put("hetCount", VariantContext::getHetCount);
-        attributes.put("homVarCount", VariantContext::getHomVarCount);
-    }
-
-    public VariantJEXLContext(VariantContext vc) {
-        this.vc = vc;
-    }
-
-    public Object get(String name) {
-        Object result = null;
-        if ( attributes.containsKey(name) ) { // dynamic resolution of name -> value via map
-            result = attributes.get(name).get(vc);
-        } else if ( vc.hasAttribute(name)) {
-            result = vc.getAttribute(name);
-        } else if ( vc.getFilters().contains(name) ) {
-            result = true_string;
-        }
-
-        return result;
-    }
-
-    public boolean has(String name) {
-        return get(name) != null;
-    }
-
-    /**
-     * @throws UnsupportedOperationException
-     */
-    public void	set(String name, Object value) {
-        throw new UnsupportedOperationException("remove() not supported on a VariantJEXLContext");
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/CompoundFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/CompoundFilter.java
deleted file mode 100644
index 9a3724a..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/CompoundFilter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.util.ArrayList;
-
-/**
- * A Predicate on VariantContexts that returns true when either all its sub-predicates are true, or none are false.
- *
- * @author Yossi Farjoun
- */
-public class CompoundFilter extends ArrayList<VariantContextFilter> implements VariantContextFilter {
-
-    final boolean requireAll;
-
-    /**
-     * A constructor that will determine if this compound filter will require that *all* the included filters pass
-     * or *some* of them pass (depending on the requireAll parameter in the constructor).
-     *
-     * @param requireAll a boolean parameter determining whether this filter requires all its elements to pass (true) for
-     * it to pass, or only one (false). If there are no variantfilters it will return true.
-     */
-    public CompoundFilter(final boolean requireAll) {
-        super();
-        this.requireAll = requireAll;
-    }
-
-    /**
-     * @param variantContext the record to examine against the sub-filters
-     * @return true if variantContext either passes all the filters (when requireAll==true)
-     * or doesn't fail any of the filters (when requireAll==false)
-     */
-    @Override
-    public boolean test(final VariantContext variantContext) {
-
-        if (requireAll) {
-            for (final VariantContextFilter filter : this) {
-                if (!filter.test(variantContext)) return false;
-            }
-
-            return true;
-        } else {
-            for (final VariantContextFilter filter : this) {
-                if (filter.test(variantContext)) return true;
-            }
-
-            return isEmpty();
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/FilteringIterator.java b/src/main/java/htsjdk/variant/variantcontext/filter/FilteringIterator.java
deleted file mode 100644
index 04609a8..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/FilteringIterator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.util.Iterator;
-
-/**
- * A filtering iterator for VariantContexts that takes a base iterator and a VariantContextFilter.
- *
- * The iterator returns all the variantcontexts for which the filter's function "test" returns true (and only those)
- *
- * @author Yossi Farjoun
- *
- * use {@link FilteringVariantContextIterator} instead
- */
-
- at Deprecated
-public class FilteringIterator extends FilteringVariantContextIterator{
-    public FilteringIterator(final Iterator<VariantContext> iterator, final VariantContextFilter filter) {
-        super(iterator, filter);
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIterator.java b/src/main/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIterator.java
deleted file mode 100644
index e61d9a5..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIterator.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * A filtering iterator for VariantContexts that takes a base iterator and a VariantContextFilter.
- *
- * The iterator returns all the variantcontexts for which the filter's function "test" returns true (and only those)
- *
- * @author Yossi Farjoun
- */
-public class FilteringVariantContextIterator implements CloseableIterator<VariantContext>, Iterable<VariantContext>{
-    private final Iterator<VariantContext> iterator;
-    private final VariantContextFilter filter;
-    private VariantContext next = null;
-
-    /**
-     * Constructor of an iterator based on the provided iterator and predicate. The resulting
-     * records will be all those VariantContexts from iterator for which filter.test( . ) is true
-     *
-     * @param iterator the backing iterator
-     * @param filter   the filter
-     */
-    public FilteringVariantContextIterator(final Iterator<VariantContext> iterator, final VariantContextFilter filter) {
-        this.iterator = iterator;
-        this.filter = filter;
-        next = getNextVC();
-    }
-
-    @Override
-    public void close() {
-        CloserUtil.close(iterator);
-    }
-
-    /**
-     * Returns true if the iteration has more elements.
-     *
-     * @return true if the iteration has more elements.  Otherwise returns false.
-     */
-    @Override
-    public boolean hasNext() {
-        return next != null;
-    }
-
-    /**
-     * Returns the next element in the iteration.
-     *
-     * @return the next element in the iteration
-     * @throws NoSuchElementException if there are no more elements to return
-     *
-     */
-    @Override
-    public VariantContext next() throws NoSuchElementException {
-        if (next == null) {
-            throw new NoSuchElementException("Iterator has no more elements.");
-        }
-        final VariantContext result = next;
-        next = getNextVC();
-        return result;
-    }
-
-    /**
-     * Required method for Iterator API.
-     *
-     * @throws UnsupportedOperationException since it is unsupported here.
-     */
-    @Override
-    public void remove() {
-        throw new UnsupportedOperationException("Remove() not supported by FilteringVariantContextIterator");
-    }
-
-    /**
-     * Gets the next record from the underlying iterator that passes the filter
-     *
-     * @return VariantContext the next filter-passing record
-     */
-    private VariantContext getNextVC() {
-
-        while (iterator.hasNext()) {
-            final VariantContext record = iterator.next();
-
-            if (filter.test(record)) {
-                return record;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * function to satisfy the Iterable interface
-     *
-     * @return itself since the class inherits from Iterator
-     */
-    @Override
-    public Iterator<VariantContext> iterator() {
-        return this;
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilter.java
deleted file mode 100644
index 862dcce..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * A Predicate on VariantContexts that returns true at sites that are either unfiltered, or passing (as variants).
- *
- * @author Yossi Farjoun
- */
-public class GenotypeQualityFilter implements VariantContextFilter {
-
-    final private String sample;
-    final private int gqThreshold;
-
-    /**
-     * Constructor for a filter that will keep VC for which the
-     * genotype quality (GQ) of sample passes a threshold. If sample is null, the first genotype in the
-     * variant context will be used.
-     *
-     * @param gqThreshold the smallest value of GQ that this filter will pass
-     * @param sample the name of the sample in the variant context whose genotype should be examined.
-     */
-    public GenotypeQualityFilter(final int gqThreshold, final String sample ) {
-        this.sample = sample;
-        this.gqThreshold = gqThreshold;
-    }
-
-    /**
-     * Constructor as above that doesn't take a sample, instead it will look at the first genotype of the variant context.
-     * @param gqThreshold the smallest value of GQ that this filter will pass
-     */
-    public GenotypeQualityFilter(final int gqThreshold) {
-        this(  gqThreshold, null);
-    }
-
-    /**
-     * @return true if variantContext is to be kept, otherwise false
-     * Assumes that this.sample is a sample in the variantContext, if not null,
-     * otherwise looks for the first genotype (and assumes it exists).
-     * @param variantContext the record to examine for GQ
-     */
-    @Override
-    public boolean test(final VariantContext variantContext) {
-        final Genotype gt = (sample == null) ? variantContext.getGenotype(0) : variantContext.getGenotype(sample);
-
-        if (gt == null) {
-            throw new IllegalArgumentException((sample == null) ?
-                    "Cannot find any genotypes in VariantContext: " + variantContext :
-                    "Cannot find sample requested: " + sample);
-        }
-
-        return gt.getGQ() >= gqThreshold;
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilter.java
deleted file mode 100644
index 0675b25..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * A Predicate on VariantContexts that either returns true at heterozygous sites (invertible to false).
- * if optional "sample" argument to constructor is given, the genotype of that sample will be examined,
- * otherwise first genotype will be used.
- *
- * Missing sample, or no genotype will result in an exception being thrown.
- *
- * @author Yossi Farjoun
- */
-public class HeterozygosityFilter implements VariantContextFilter {
-
-    final private String sample;
-    final private boolean keepHets;
-
-    /**
-     * Constructor for a filter that will keep (or remove, if keepHets is false) VC for which the
-     * genotype of sample is heterozygous. If sample is null, the first genotype in the
-     * variant context will be used.
-     *
-     * @param keepHets determine whether to keep the het sites (true) or filter them out (false)
-     * @param sample the name of the sample in the variant context whose genotype should be examined.
-     */
-    public HeterozygosityFilter(final boolean keepHets, final String sample) {
-        this.keepHets = keepHets;
-        this.sample = sample;
-    }
-
-    /**
-     * Constructor as above that doesn't take a sample, instead it will look at the first genotype of the variant context.
-     * @param keepHets if true, the heterozygous variant contexts will pass the filter, otherwise they will fail.
-     */
-    public HeterozygosityFilter(final boolean keepHets) {
-        this(keepHets, null);
-    }
-
-    /**
-     * @return true if variantContext is to be kept, otherwise false
-     * Assumes that this.sample is a sample in the variantContext, if not null,
-     * otherwise looks for the first genotype (and assumes it exists).
-     * @param variantContext the record to examine for heterozygosity
-     */
-    @Override
-    public boolean test(final VariantContext variantContext) {
-        final Genotype gt = (sample == null) ? variantContext.getGenotype(0) : variantContext.getGenotype(sample);
-
-        if (gt == null) {
-            throw new IllegalArgumentException((sample == null) ?
-                    "Cannot find any genotypes in VariantContext: " + variantContext :
-                    "Cannot find sample requested: " + sample);
-        }
-
-        //XOR operator to reverse behaviour if keepHets is true.
-        return gt.isHet() ^ !keepHets;
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilter.java
deleted file mode 100644
index bf8fa8e..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilter.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.Reader;
-
-import htsjdk.samtools.filter.AbstractJavascriptFilter;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-/**
- * javascript based variant filter The script puts the following variables in
- * the script context:
- *
- * - 'header' a htsjdk.variant.vcf.VCFHeader 
- * - 'variant' a htsjdk.variant.variantcontext.VariantContext
- * 
- * @author Pierre Lindenbaum PhD Institut du Thorax - INSERM - Nantes - France
- */
-public class JavascriptVariantFilter extends AbstractJavascriptFilter<VCFHeader, VariantContext>
-        implements VariantContextFilter {
-	/**
-	 * constructor using a javascript File
-	 * 
-	 * @param scriptFile
-	 *            the javascript file to be compiled
-	 * @param header
-	 *            the SAMHeader
-	 */
-	public JavascriptVariantFilter(final File scriptFile, final VCFHeader header) throws IOException {
-		super(scriptFile, header);
-	}
-
-	/**
-     * constructor using a Reader
-     * 
-     * @param scriptReader
-     *            the reader for the script to be compiled. Will be closed
-     * @param header
-     *            the SAMHeader
-     */
-    public JavascriptVariantFilter(final Reader scriptReader, final VCFHeader header) throws IOException {
-        super(scriptReader, header);
-    }
-    
-	/**
-	 * constructor using a javascript expression
-	 * 
-	 * @param scriptExpression
-	 *            the javascript expression to be compiled
-	 * @param header
-	 *            the SAMHeader
-	 */
-	public JavascriptVariantFilter(final String scriptExpression, final VCFHeader header) {
-		super(scriptExpression, header);
-	}
-
-	/**
-	 * Determines whether a VariantContext matches this filter
-	 *
-	 * @param record
-	 *            the VariantContext to evaluate
-	 * @return true if accept(record) returned true
-	 */
-	@Override
-	public boolean test(final VariantContext record) {
-		return accept(record);
-	}
-
-	@Override
-	public String getRecordKey() {
-		return "variant";
-	}
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/PassingVariantFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/PassingVariantFilter.java
deleted file mode 100644
index f24678f..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/PassingVariantFilter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * A Predicate on VariantContexts that returns true at sites that are either unfiltered, or passing (as variants).
- *
- * @author Yossi Farjoun
- */
-public class PassingVariantFilter implements VariantContextFilter {
-
-    /**
-     * @return true if variantContext is a SNP
-     * @param variantContext the record to examine for being a SNP
-     */
-    @Override
-    public boolean test(final VariantContext variantContext) {
-        return variantContext.isNotFiltered();
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/SnpFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/SnpFilter.java
deleted file mode 100644
index 4d8b17b..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/SnpFilter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * A Predicate on VariantContexts that  returns true at sites that are SNPs
- *
- * @author Yossi Farjoun
- */
-public class SnpFilter implements VariantContextFilter {
-
-    /**
-     * @return true if variantContext is a SNP
-     * @param variantContext the record to examine for being a SNP
-     */
-    @Override
-    public boolean test(final VariantContext variantContext) {
-        return variantContext.isSNP();
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/VariantContextFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/VariantContextFilter.java
deleted file mode 100644
index 451dc63..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/VariantContextFilter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- *
- * API for filtering VariantContexts
- *
- * @author Yossi Farjoun
- *
- */
-public interface VariantContextFilter {
-    /**
-     * Determines whether a VariantContext matches this filter
-     *
-     * @param record the VariantContext to evaluate
-     * @return true if the VariantContext matches the filter, otherwise false
-     */
-    boolean test(VariantContext record);
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/AsyncVariantContextWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/AsyncVariantContextWriter.java
deleted file mode 100644
index 4604316..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/AsyncVariantContextWriter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.util.AbstractAsyncWriter;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-/**
- * AsyncVariantContextWriter that can be wrapped around an underlying AsyncVariantContextWriter to provide asynchronous output. Records
- * added are placed into a queue, the queue is then drained into the underlying VariantContextWriter by a thread owned
- * by the instance.
- *
- * Exceptions experienced by the writer thread will be emitted back to the caller in subsequent calls to either
- * add() or close().
- *
- * @author George Grant
- */
-public class AsyncVariantContextWriter extends AbstractAsyncWriter<VariantContext> implements VariantContextWriter {
-    private final VariantContextWriter underlyingWriter;
-
-    /**
-     * Creates a new AsyncVariantContextWriter wrapping the provided VariantContextWriter.
-     */
-    public AsyncVariantContextWriter(final VariantContextWriter out) {
-        this(out, DEFAULT_QUEUE_SIZE);
-    }
-
-    /**
-     * Creates an AsyncVariantContextWriter wrapping the provided VariantContextWriter and using the specified
-     * queue size for buffer VariantContexts.
-     */
-    public AsyncVariantContextWriter(final VariantContextWriter out, final int queueSize) {
-        super(queueSize);
-        this.underlyingWriter = out;
-    }
-
-    @Override protected void synchronouslyWrite(final VariantContext item) { this.underlyingWriter.add(item); }
-
-    @Override protected void synchronouslyClose() { this.underlyingWriter.close();  }
-
-    @Override protected final String getThreadNamePrefix() { return "VariantContextWriterThread-"; }
-
-    public void add(final VariantContext vc) {
-        write(vc);
-    }
-
-    public void writeHeader(final VCFHeader header) {
-        this.underlyingWriter.writeHeader(header);
-    }
-    
-    @Override
-    public boolean checkError() {
-        return false;
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Encoder.java b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Encoder.java
deleted file mode 100644
index 495cd93..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Encoder.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.bcf2.BCF2Type;
-import htsjdk.variant.bcf2.BCF2Utils;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * See #BCFWriter for documentation on this classes role in encoding BCF2 files
- *
- * @author Mark DePristo
- * @since 06/12
- */
-public final class BCF2Encoder {
-    // TODO -- increase default size?
-    public static final int WRITE_BUFFER_INITIAL_SIZE = 16384;
-    private ByteArrayOutputStream encodeStream = new ByteArrayOutputStream(WRITE_BUFFER_INITIAL_SIZE);
-
-    // --------------------------------------------------------------------------------
-    //
-    // Functions to return the data being encoded here
-    //
-    // --------------------------------------------------------------------------------
-
-    public byte[] getRecordBytes() {
-        byte[] bytes = encodeStream.toByteArray();
-        encodeStream.reset();
-        return bytes;
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Writing typed values (have type byte)
-    //
-    // --------------------------------------------------------------------------------
-
-    public final void encodeTypedMissing(final BCF2Type type) throws IOException {
-        encodeType(0, type);
-    }
-
-    public final void encodeTyped(final Object value, final BCF2Type type) throws IOException {
-        if ( value == null )
-            encodeTypedMissing(type);
-        else {
-            switch ( type ) {
-                case INT8:
-                case INT16:
-                case INT32: encodeTypedInt((Integer)value, type); break;
-                case FLOAT: encodeTypedFloat((Double) value); break;
-                case CHAR:  encodeTypedString((String) value); break;
-                default:    throw new IllegalArgumentException("Illegal type encountered " + type);
-            }
-        }
-    }
-
-    public final void encodeTypedInt(final int v) throws IOException {
-        final BCF2Type type = BCF2Utils.determineIntegerType(v);
-        encodeTypedInt(v, type);
-    }
-
-    public final void encodeTypedInt(final int v, final BCF2Type type) throws IOException {
-        encodeType(1, type);
-        encodeRawInt(v, type);
-    }
-
-    public final void encodeTypedString(final String s) throws IOException {
-        encodeTypedString(s.getBytes());
-    }
-
-    public final void encodeTypedString(final byte[] s) throws IOException {
-        if ( s == null )
-            encodeType(0, BCF2Type.CHAR);
-        else {
-            encodeType(s.length, BCF2Type.CHAR);
-            for ( int i = 0; i < s.length; i++ ) {
-                encodeRawChar(s[i]);
-            }
-        }
-    }
-
-    public final void encodeTypedFloat(final double d) throws IOException {
-        encodeType(1, BCF2Type.FLOAT);
-        encodeRawFloat(d);
-    }
-
-    public final void encodeTyped(List<? extends Object> v, final BCF2Type type) throws IOException {
-        if ( type == BCF2Type.CHAR && !v.isEmpty()) {
-            final String s = BCF2Utils.collapseStringList((List<String>) v);
-            v = stringToBytes(s);
-        }
-
-        encodeType(v.size(), type);
-        encodeRawValues(v, type);
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Writing raw values (don't have a type byte)
-    //
-    // --------------------------------------------------------------------------------
-
-    public final <T extends Object> void encodeRawValues(final Collection<T> v, final BCF2Type type) throws IOException {
-        for ( final T v1 : v ) {
-            encodeRawValue(v1, type);
-        }
-    }
-
-    public final <T extends Object> void encodeRawValue(final T value, final BCF2Type type) throws IOException {
-        try {
-            if ( value == type.getMissingJavaValue() )
-                encodeRawMissingValue(type);
-            else {
-                switch (type) {
-                    case INT8:
-                    case INT16:
-                    case INT32: encodeRawBytes((Integer) value, type); break;
-                    case FLOAT: encodeRawFloat((Double) value); break;
-                    case CHAR:  encodeRawChar((Byte) value); break;
-                    default:    throw new IllegalArgumentException("Illegal type encountered " + type);
-                }
-            }
-        } catch ( ClassCastException e ) {
-            throw new ClassCastException("BUG: invalid type cast to " + type + " from " + value);
-        }
-    }
-
-    public final void encodeRawMissingValue(final BCF2Type type) throws IOException {
-        encodeRawBytes(type.getMissingBytes(), type);
-    }
-
-    public final void encodeRawMissingValues(final int size, final BCF2Type type) throws IOException {
-        for ( int i = 0; i < size; i++ )
-            encodeRawMissingValue(type);
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // low-level encoders
-    //
-    // --------------------------------------------------------------------------------
-
-    public final void encodeRawChar(final byte c) throws IOException {
-        encodeStream.write(c);
-    }
-
-    public final void encodeRawFloat(final double value) throws IOException {
-        encodeRawBytes(Float.floatToIntBits((float) value), BCF2Type.FLOAT);
-    }
-
-    public final void encodeType(final int size, final BCF2Type type) throws IOException {
-        if ( size <= BCF2Utils.MAX_INLINE_ELEMENTS ) {
-            final int typeByte = BCF2Utils.encodeTypeDescriptor(size, type);
-            encodeStream.write(typeByte);
-        } else {
-            final int typeByte = BCF2Utils.encodeTypeDescriptor(BCF2Utils.OVERFLOW_ELEMENT_MARKER, type);
-            encodeStream.write(typeByte);
-            // write in the overflow size
-            encodeTypedInt(size);
-        }
-    }
-
-    public final void encodeRawInt(final int value, final BCF2Type type) throws IOException {
-        type.write(value, encodeStream);
-    }
-
-    public final void encodeRawBytes(final int value, final BCF2Type type) throws IOException {
-        type.write(value, encodeStream);
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // utility functions
-    //
-    // --------------------------------------------------------------------------------
-
-    public void encodeRawString(final String s, final int sizeToWrite) throws IOException {
-        final byte[] bytes = s.getBytes();
-        for ( int i = 0; i < sizeToWrite; i++ )
-            if ( i < bytes.length )
-                encodeRawChar(bytes[i]);
-            else
-                encodeRawMissingValue(BCF2Type.CHAR);
-    }
-
-    /**
-     * Totally generic encoder that examines o, determines the best way to encode it, and encodes it
-     *
-     * This method is incredibly slow, but it's only used for UnitTests so it doesn't matter
-     *
-     * @param o
-     * @return
-     */
-    public final BCF2Type encode(final Object o) throws IOException {
-        if ( o == null ) throw new IllegalArgumentException("Generic encode cannot deal with null values");
-
-        if ( o instanceof List ) {
-            final BCF2Type type = determineBCFType(((List) o).get(0));
-            encodeTyped((List) o, type);
-            return type;
-        } else {
-            final BCF2Type type = determineBCFType(o);
-            encodeTyped(o, type);
-            return type;
-        }
-    }
-
-    private final BCF2Type determineBCFType(final Object arg) {
-        final Object toType = arg instanceof List ? ((List)arg).get(0) : arg;
-
-        if ( toType instanceof Integer )
-            return BCF2Utils.determineIntegerType((Integer) toType);
-        else if ( toType instanceof String )
-            return BCF2Type.CHAR;
-        else if ( toType instanceof Double )
-            return BCF2Type.FLOAT;
-        else
-            throw new IllegalArgumentException("No native encoding for Object of type " + arg.getClass().getSimpleName());
-    }
-
-    private final List<Byte> stringToBytes(final String v) throws IOException {
-        if ( v == null || v.equals("") )
-            return Collections.emptyList();
-        else {
-            // TODO -- this needs to be optimized away for efficiency
-            final byte[] bytes = v.getBytes();
-            final List<Byte> l = new ArrayList<Byte>(bytes.length);
-            for ( int i = 0; i < bytes.length; i++) l.add(bytes[i]);
-            return l;
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldEncoder.java b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldEncoder.java
deleted file mode 100644
index 7d1f0de..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldEncoder.java
+++ /dev/null
@@ -1,455 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.bcf2.BCF2Type;
-import htsjdk.variant.bcf2.BCF2Utils;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFCompoundHeaderLine;
-import htsjdk.variant.vcf.VCFHeaderLineCount;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * See #BCFWriter for documentation on this classes role in encoding BCF2 files
- *
- * @author Mark DePristo
- * @since 06/12
- */
-public abstract class BCF2FieldEncoder {
-    /**
-     * The header line describing the field we will encode values of
-     */
-    final VCFCompoundHeaderLine headerLine;
-
-    /**
-     * The BCF2 type we'll use to encoder this field, if it can be determined statically.
-     * If not, this variable must be null
-     */
-    final BCF2Type staticType;
-
-    /**
-     * The integer offset into the strings map of the BCF2 file corresponding to this
-     * field.
-     */
-    final int dictionaryOffset;
-
-    /**
-     * The integer type we use to encode our dictionary offset in the BCF2 file
-     */
-    final BCF2Type dictionaryOffsetType;
-
-    // ----------------------------------------------------------------------
-    //
-    // Constructor
-    //
-    // ----------------------------------------------------------------------
-
-    private BCF2FieldEncoder(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict, final BCF2Type staticType) {
-        this.headerLine = headerLine;
-        this.staticType = staticType;
-
-        final Integer offset = dict.get(getField());
-        if ( offset == null ) throw new IllegalStateException("Format error: could not find string " + getField() + " in header as required by BCF");
-        this.dictionaryOffset = offset;
-        dictionaryOffsetType = BCF2Utils.determineIntegerType(offset);
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // Basic accessors
-    //
-    // ----------------------------------------------------------------------
-
-    public final String getField() { return headerLine.getID(); }
-
-    /**
-     * Write the field key (dictionary offset and type) into the BCF2Encoder stream
-     *
-     * @param encoder where we write our dictionary offset
-     * @throws IOException
-     */
-    public final void writeFieldKey(final BCF2Encoder encoder) throws IOException {
-        encoder.encodeTypedInt(dictionaryOffset, dictionaryOffsetType);
-    }
-
-    @Override
-    public String toString() {
-        return "BCF2FieldEncoder for " + getField() + " with count " + getCountType() + " encoded with " + getClass().getSimpleName();
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // methods to determine the number of encoded elements
-    //
-    // ----------------------------------------------------------------------
-
-    protected final VCFHeaderLineCount getCountType() {
-        return headerLine.getCountType();
-    }
-
-    /**
-     * @return True if this field has a constant, fixed number of elements (such as 1 for an atomic integer)
-     */
-    public boolean hasConstantNumElements() {
-        return getCountType() == VCFHeaderLineCount.INTEGER;
-    }
-
-    /**
-     * @return True if the only way to determine how many elements this field contains is by
-     * inspecting the actual value directly, such as when the number of elements
-     * is a variable length list per site or per genotype.
-     */
-    public boolean hasValueDeterminedNumElements() {
-        return getCountType() == VCFHeaderLineCount.UNBOUNDED;
-    }
-
-    /**
-     * @return True if this field has a non-fixed number of elements that depends only on the properties
-     * of the current VariantContext, such as one value per Allele or per genotype configuration.
-     */
-    public boolean hasContextDeterminedNumElements() {
-        return ! hasConstantNumElements() && ! hasValueDeterminedNumElements();
-    }
-
-    /**
-     * @return the number of elements, assuming this field has a constant number of elements.
-     */
-    public int numElements() {
-        return headerLine.getCount();
-    }
-
-    /**
-     * @return the number of elements by looking at the actual value provided
-     */
-    public int numElements(final Object value) {
-        return numElementsFromValue(value);
-    }
-
-    /**
-     * @return the number of elements, assuming this field has context-determined number of elements.
-     */
-    public int numElements(final VariantContext vc) {
-        return headerLine.getCount(vc);
-    }
-
-    /**
-     * A convenience access for the number of elements.
-     * @param vc
-     * @param value
-     * @return the number of encoded elements, either from the fixed number
-     * it has, from the VC, or from the value itself.
-     */
-    public final int numElements(final VariantContext vc, final Object value) {
-        if ( hasConstantNumElements() ) return numElements();
-        else if ( hasContextDeterminedNumElements() ) return numElements(vc);
-        else return numElements(value);
-    }
-
-    /**
-     * Given a value, return the number of elements we will encode for it.
-     *
-     * Assumes the value is encoded as a List
-     *
-     * @param value
-     * @return the number of elements we will encode for {@param value}.
-     */
-    protected int numElementsFromValue(final Object value) {
-        if ( value == null ) return 0;
-        else if ( value instanceof List ) return ((List) value).size();
-        else return 1;
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // methods to determine the BCF2 type of the encoded values
-    //
-    // ----------------------------------------------------------------------
-
-    /**
-     * Is the BCF2 type of this field static, or does it have to be determine from
-     * the actual field value itself?
-     * @return true if the field is static
-     */
-    public final boolean isStaticallyTyped() { return ! isDynamicallyTyped(); }
-
-    /**
-     * Is the BCF2 type of this field static, or does it have to be determine from
-     * the actual field value itself?
-     * @return true if the field is not static
-     */
-    public final boolean isDynamicallyTyped() { return staticType == null; }
-
-    /**
-     * Get the BCF2 type for this field, either from the static type of the
-     * field itself or by inspecting the value itself.
-     *
-     * @return the BCF2 type for this field
-     */
-    public final BCF2Type getType(final Object value) {
-        return isDynamicallyTyped() ? getDynamicType(value) : getStaticType();
-    }
-
-    public final BCF2Type getStaticType() {
-        return staticType;
-    }
-
-    public BCF2Type getDynamicType(final Object value) {
-        throw new IllegalStateException("BUG: cannot get dynamic type for statically typed BCF2 field " + getField());
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // methods to encode values, including the key abstract method
-    //
-    // ----------------------------------------------------------------------
-
-    /**
-     * Key abstract method that should encode a value of the given type into the encoder.
-     *
-     * Value will be of a type appropriate to the underlying encoder.  If the genotype field is represented as
-     * an int[], this will be value, and the encoder needs to handle encoding all of the values in the int[].
-     *
-     * The argument should be used, not the getType() method in the superclass as an outer loop might have
-     * decided a more general type (int16) to use, even through this encoder could have been done with int8.
-     *
-     * If minValues > 0, then encodeValue must write in at least minValues items from value.  If value is atomic,
-     * this means that minValues - 1 MISSING values should be added to the encoder.  If minValues is a collection
-     * type (int[]) then minValues - values.length should be added.  This argument is intended to handle padding
-     * of values in genotype fields.
-     *
-     * @param encoder
-     * @param value
-     * @param type
-     * @param minValues
-     * @throws IOException
-     */
-    public abstract void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException;
-
-    // ----------------------------------------------------------------------
-    //
-    // Subclass to encode Strings
-    //
-    // ----------------------------------------------------------------------
-
-    public static class StringOrCharacter extends BCF2FieldEncoder {
-        public StringOrCharacter(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
-            super(headerLine, dict, BCF2Type.CHAR);
-        }
-
-        @Override
-        public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
-            final String s = javaStringToBCF2String(value);
-            encoder.encodeRawString(s, Math.max(s.length(), minValues));
-        }
-
-        //
-        // Regardless of what the header says, BCF2 strings and characters are always encoded
-        // as arrays of CHAR type, which has a variable number of elements depending on the
-        // exact string being encoded
-        //
-        @Override public boolean hasConstantNumElements()          { return false; }
-        @Override public boolean hasContextDeterminedNumElements() { return false; }
-        @Override public boolean hasValueDeterminedNumElements()   { return true; }
-        @Override protected int numElementsFromValue(final Object value) {
-            return value == null ? 0 : javaStringToBCF2String(value).length();
-        }
-
-        /**
-         * Recode the incoming object to a String, compacting it into a
-         * BCF2 string if the value is a list.
-         *
-         * @param value a String or List<String> to encode, or null
-         * @return a non-null string to encode
-         */
-        private String javaStringToBCF2String(final Object value) {
-            if ( value == null )
-                return "";
-            else if (value instanceof List) {
-                final List<String> l = (List<String>)value;
-                return BCF2Utils.collapseStringList(l);
-            } else if ( value.getClass().isArray() ) {
-                final List<String> l = new ArrayList<String>();
-                Collections.addAll(l, (String[])value);
-                return BCF2Utils.collapseStringList(l);
-            } else
-                return (String)value;
-        }
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // Subclass to encode FLAG
-    //
-    // ----------------------------------------------------------------------
-
-    public static class Flag extends BCF2FieldEncoder {
-        public Flag(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
-            super(headerLine, dict, BCF2Type.INT8);
-            if ( ! headerLine.isFixedCount() || headerLine.getCount() != 0 )
-                throw new IllegalStateException("Flag encoder only supports atomic flags for field " + getField());
-        }
-
-        @Override
-        public int numElements() {
-            return 1; // the header says 0 but we will write 1 value
-        }
-
-        @Override
-        public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
-            encoder.encodeRawBytes(1, getStaticType());
-        }
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // Subclass to encode FLOAT
-    //
-    // ----------------------------------------------------------------------
-
-    public static class Float extends BCF2FieldEncoder {
-        final boolean isAtomic;
-
-        public Float(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
-            super(headerLine, dict, BCF2Type.FLOAT);
-            isAtomic = hasConstantNumElements() && numElements() == 1;
-        }
-
-        @Override
-        public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
-            int count = 0;
-            // TODO -- can be restructured to avoid toList operation
-            if ( isAtomic ) {
-                // fast path for fields with 1 fixed float value
-                if ( value != null ) {
-                    encoder.encodeRawFloat((Double)value);
-                    count++;
-                }
-            } else {
-                // handle generic case
-                final List<Double> doubles = BCF2Utils.toList(Double.class, value);
-                for ( final Double d : doubles ) {
-                    if ( d != null ) { // necessary because .,. => [null, null] in VC
-                        encoder.encodeRawFloat(d);
-                        count++;
-                    }
-                }
-            }
-            for ( ; count < minValues; count++ ) encoder.encodeRawMissingValue(type);
-        }
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // Subclass to encode int[]
-    //
-    // ----------------------------------------------------------------------
-
-    public static class IntArray extends BCF2FieldEncoder {
-        public IntArray(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
-            super(headerLine, dict, null);
-        }
-
-        @Override
-        protected int numElementsFromValue(final Object value) {
-            return value == null ? 0 : ((int[])value).length;
-        }
-
-        @Override
-        public BCF2Type getDynamicType(final Object value) {
-            return value == null ? BCF2Type.INT8 : BCF2Utils.determineIntegerType((int[])value);
-        }
-
-        @Override
-        public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
-            int count = 0;
-            if ( value != null ) {
-                for ( final int i : (int[])value ) {
-                    encoder.encodeRawInt(i, type);
-                    count++;
-                }
-            }
-            for ( ; count < minValues; count++ ) encoder.encodeRawMissingValue(type);
-        }
-    }
-
-    // ----------------------------------------------------------------------
-    //
-    // Subclass to encode List<Integer>
-    //
-    // ----------------------------------------------------------------------
-
-    /**
-     * Specialized int encoder for atomic (non-list) integers
-     */
-    public static class AtomicInt extends BCF2FieldEncoder {
-        public AtomicInt(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
-            super(headerLine, dict, null);
-        }
-
-        @Override
-        public BCF2Type getDynamicType(final Object value) {
-            return value == null ? BCF2Type.INT8 : BCF2Utils.determineIntegerType((Integer)value);
-        }
-
-        @Override
-        public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
-            int count = 0;
-            if ( value != null ) {
-                encoder.encodeRawInt((Integer)value, type);
-                count++;
-            }
-            for ( ; count < minValues; count++ ) encoder.encodeRawMissingValue(type);
-        }
-    }
-
-    public static class GenericInts extends BCF2FieldEncoder {
-        public GenericInts(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
-            super(headerLine, dict, null);
-        }
-
-        @Override
-        public BCF2Type getDynamicType(final Object value) {
-            return value == null ? BCF2Type.INT8 : BCF2Utils.determineIntegerType(BCF2Utils.toList(Integer.class, value));
-        }
-
-        @Override
-        public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
-            int count = 0;
-            for ( final Integer i : BCF2Utils.toList(Integer.class, value) ) {
-                if ( i != null ) { // necessary because .,. => [null, null] in VC
-                    encoder.encodeRawInt(i, type);
-                    count++;
-                }
-            }
-            for ( ; count < minValues; count++ ) encoder.encodeRawMissingValue(type);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriter.java
deleted file mode 100644
index f9dd458..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriter.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.bcf2.BCF2Type;
-import htsjdk.variant.bcf2.BCF2Utils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * See #BCFWriter for documentation on this classes role in encoding BCF2 files
- *
- * @author Mark DePristo
- * @since 06/12
- */
-public abstract class BCF2FieldWriter {
-    private final VCFHeader header;
-    private final BCF2FieldEncoder fieldEncoder;
-
-    protected BCF2FieldWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
-        this.header = header;
-        this.fieldEncoder = fieldEncoder;
-    }
-
-    protected VCFHeader getHeader() { return header; }
-    protected BCF2FieldEncoder getFieldEncoder() {
-        return fieldEncoder;
-    }
-    protected String getField() { return getFieldEncoder().getField(); }
-
-    public void start(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
-        fieldEncoder.writeFieldKey(encoder);
-    }
-
-    public void done(final BCF2Encoder encoder, final VariantContext vc) throws IOException { } // TODO -- overload done so that we null out values and test for correctness
-
-    @Override
-    public String toString() {
-        return "BCF2FieldWriter " + getClass().getSimpleName() + " with encoder " + getFieldEncoder();
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Sites writers
-    //
-    // --------------------------------------------------------------------------------
-
-    public static abstract class SiteWriter extends BCF2FieldWriter {
-        protected SiteWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
-            super(header, fieldEncoder);
-        }
-
-        public abstract void site(final BCF2Encoder encoder, final VariantContext vc) throws IOException;
-    }
-
-    public static class GenericSiteWriter extends SiteWriter {
-        public GenericSiteWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
-            super(header, fieldEncoder);
-        }
-
-        @Override
-        public void site(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
-            final Object rawValue = vc.getAttribute(getField(), null);
-            final BCF2Type type = getFieldEncoder().getType(rawValue);
-            if ( rawValue == null ) {
-                // the value is missing, just write in null
-                encoder.encodeType(0, type);
-            } else {
-                final int valueCount = getFieldEncoder().numElements(vc, rawValue);
-                encoder.encodeType(valueCount, type);
-                getFieldEncoder().encodeValue(encoder, rawValue, type, valueCount);
-            }
-        }
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Genotypes writers
-    //
-    // --------------------------------------------------------------------------------
-
-    public static abstract class GenotypesWriter extends BCF2FieldWriter {
-        int nValuesPerGenotype = -1;
-        BCF2Type encodingType = null;
-
-        protected GenotypesWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
-            super(header, fieldEncoder);
-
-            if ( fieldEncoder.hasConstantNumElements() ) {
-                nValuesPerGenotype = getFieldEncoder().numElements();
-            }
-        }
-
-        @Override
-        public void start(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
-            // writes the key information
-            super.start(encoder, vc);
-
-            // only update if we need to
-            if ( ! getFieldEncoder().hasConstantNumElements() ) {
-                if ( getFieldEncoder().hasContextDeterminedNumElements() )
-                    // we are cheap -- just depends on genotype of allele counts
-                    nValuesPerGenotype = getFieldEncoder().numElements(vc);
-                else
-                    // we have to go fishing through the values themselves (expensive)
-                    nValuesPerGenotype = computeMaxSizeOfGenotypeFieldFromValues(vc);
-            }
-
-            encoder.encodeType(nValuesPerGenotype, encodingType);
-        }
-
-        public void addGenotype(final BCF2Encoder encoder, final VariantContext vc, final Genotype g) throws IOException {
-            final Object fieldValue = g.getExtendedAttribute(getField(), null);
-            getFieldEncoder().encodeValue(encoder, fieldValue, encodingType, nValuesPerGenotype);
-        }
-
-        protected int numElements(final VariantContext vc, final Genotype g) {
-            return getFieldEncoder().numElements(vc, g.getExtendedAttribute(getField()));
-        }
-
-        private final int computeMaxSizeOfGenotypeFieldFromValues(final VariantContext vc) {
-            int size = -1;
-
-            for ( final Genotype g : vc.getGenotypes() ) {
-                size = Math.max(size, numElements(vc, g));
-            }
-
-            return size;
-        }
-    }
-
-    public static class StaticallyTypeGenotypesWriter extends GenotypesWriter {
-        public StaticallyTypeGenotypesWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
-            super(header, fieldEncoder);
-            encodingType = getFieldEncoder().getStaticType();
-        }
-    }
-
-    public static class IntegerTypeGenotypesWriter extends GenotypesWriter {
-        public IntegerTypeGenotypesWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
-            super(header, fieldEncoder);
-        }
-
-        @Override
-        public void start(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
-            // the only value that is dynamic are integers
-            final List<Integer> values = new ArrayList<Integer>(vc.getNSamples());
-            for ( final Genotype g : vc.getGenotypes() ) {
-                for ( final Integer i : BCF2Utils.toList(Integer.class, g.getExtendedAttribute(getField(), null)) ) {
-                    if ( i != null ) values.add(i);
-                }
-            }
-
-            encodingType = BCF2Utils.determineIntegerType(values);
-            super.start(encoder, vc);
-        }
-    }
-
-    public static class IGFGenotypesWriter extends GenotypesWriter {
-        final IntGenotypeFieldAccessors.Accessor ige;
-
-        public IGFGenotypesWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder, final IntGenotypeFieldAccessors.Accessor ige) {
-            super(header, fieldEncoder);
-            this.ige = ige;
-
-            if ( ! (fieldEncoder instanceof BCF2FieldEncoder.IntArray) )
-                throw new IllegalArgumentException("BUG: IntGenotypesWriter requires IntArray encoder for field " + getField());
-        }
-
-        @Override
-        public void start(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
-            // TODO
-            // TODO this piece of code consumes like 10% of the runtime alone because fo the vc.getGenotypes() iteration
-            // TODO
-            encodingType = BCF2Type.INT8;
-            for ( final Genotype g : vc.getGenotypes() ) {
-                final int[] pls = ige.getValues(g);
-                final BCF2Type plsType = getFieldEncoder().getType(pls);
-                encodingType = BCF2Utils.maxIntegerType(encodingType, plsType);
-                if ( encodingType == BCF2Type.INT32 )
-                    break; // stop early
-            }
-
-            super.start(encoder, vc);
-        }
-
-        @Override
-        public void addGenotype(final BCF2Encoder encoder, final VariantContext vc, final Genotype g) throws IOException {
-            getFieldEncoder().encodeValue(encoder, ige.getValues(g), encodingType, nValuesPerGenotype);
-        }
-
-        @Override
-        protected int numElements(final VariantContext vc, final Genotype g) {
-            return ige.getSize(g);
-        }
-    }
-
-    public static class FTGenotypesWriter extends StaticallyTypeGenotypesWriter {
-        public FTGenotypesWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
-            super(header, fieldEncoder);
-        }
-
-        public void addGenotype(final BCF2Encoder encoder, final VariantContext vc, final Genotype g) throws IOException {
-            final String fieldValue = g.getFilters();
-            getFieldEncoder().encodeValue(encoder, fieldValue, encodingType, nValuesPerGenotype);
-        }
-
-        @Override
-        protected int numElements(final VariantContext vc, final Genotype g) {
-            return getFieldEncoder().numElements(vc, g.getFilters());
-        }
-    }
-
-    public static class GTWriter extends GenotypesWriter {
-        final Map<Allele, Integer> alleleMapForTriPlus = new HashMap<Allele, Integer>(5);
-        Allele ref, alt1;
-
-        public GTWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
-            super(header, fieldEncoder);
-        }
-
-        @Override
-        public void start(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
-            if ( vc.getNAlleles() > BCF2Utils.MAX_ALLELES_IN_GENOTYPES )
-                throw new IllegalStateException("Current BCF2 encoder cannot handle sites " +
-                        "with > " + BCF2Utils.MAX_ALLELES_IN_GENOTYPES + " alleles, but you have "
-                        + vc.getNAlleles() + " at " + vc.getContig() + ":" + vc.getStart());
-
-            encodingType = BCF2Type.INT8;
-            buildAlleleMap(vc);
-            nValuesPerGenotype = vc.getMaxPloidy(2);
-
-            super.start(encoder, vc);
-        }
-
-        @Override
-        public void addGenotype(final BCF2Encoder encoder, final VariantContext vc, final Genotype g) throws IOException {
-            final int samplePloidy = g.getPloidy();
-            for ( int i = 0; i < nValuesPerGenotype; i++ ) {
-                if ( i < samplePloidy ) {
-                    // we encode the actual allele
-                    final Allele a = g.getAllele(i);
-                    final int offset = getAlleleOffset(a);
-                    final int encoded = ((offset+1) << 1) | (g.isPhased() ? 0x01 : 0x00);
-                    encoder.encodeRawBytes(encoded, encodingType);
-                } else {
-                    // we need to pad with missing as we have ploidy < max for this sample
-                    encoder.encodeRawBytes(encodingType.getMissingBytes(), encodingType);
-                }
-            }
-        }
-
-        /**
-         * Fast path code to determine the offset.
-         *
-         * Inline tests for == against ref (most common, first test)
-         * == alt1 (second most common, second test)
-         * == NO_CALL (third)
-         * and finally in the map from allele => offset for all alt 2+ alleles
-         *
-         * @param a the allele whose offset we wish to determine
-         * @return the offset (from 0) of the allele in the list of variant context alleles (-1 means NO_CALL)
-         */
-        private final int getAlleleOffset(final Allele a) {
-            if ( a == ref ) return 0;
-            else if ( a == alt1 ) return 1;
-            else if ( a == Allele.NO_CALL ) return -1;
-            else {
-                final Integer o = alleleMapForTriPlus.get(a);
-                if ( o == null ) throw new IllegalStateException("BUG: Couldn't find allele offset for allele " + a);
-                return o;
-            }
-        }
-
-        private final void buildAlleleMap(final VariantContext vc) {
-            // these are fast path options to determine the offsets for
-            final int nAlleles = vc.getNAlleles();
-            ref = vc.getReference();
-            alt1 = nAlleles > 1 ? vc.getAlternateAllele(0) : null;
-
-            if ( nAlleles > 2 ) {
-                // for multi-allelics we need to clear the map, and add additional looks
-                alleleMapForTriPlus.clear();
-                final List<Allele> alleles = vc.getAlleles();
-                for ( int i = 2; i < alleles.size(); i++ ) {
-                    alleleMapForTriPlus.put(alleles.get(i), i);
-                }
-            }
-        }
-    }
-}
-
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriterManager.java b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriterManager.java
deleted file mode 100644
index 20f9ce6..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriterManager.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.vcf.VCFCompoundHeaderLine;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFFormatHeaderLine;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-import htsjdk.variant.vcf.VCFInfoHeaderLine;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * See #BCFWriter for documentation on this classes role in encoding BCF2 files
- *
- * @author Mark DePristo
- * @since 06/12
- */
-public class BCF2FieldWriterManager {
-    final Map<String, BCF2FieldWriter.SiteWriter> siteWriters = new HashMap<String, BCF2FieldWriter.SiteWriter>();
-    final Map<String, BCF2FieldWriter.GenotypesWriter> genotypesWriters = new HashMap<String, BCF2FieldWriter.GenotypesWriter>();
-    final IntGenotypeFieldAccessors intGenotypeFieldAccessors = new IntGenotypeFieldAccessors();
-
-    public BCF2FieldWriterManager() { }
-
-    /**
-     * Setup the FieldWriters appropriate to each INFO and FORMAT in the VCF header
-     *
-     * Must be called before any of the getter methods will work
-     *
-     * @param header a VCFHeader containing description for every INFO and FORMAT field we'll attempt to write out to BCF
-     * @param encoder the encoder we are going to use to write out the BCF2 data
-     * @param stringDictionary a map from VCFHeader strings to their offsets for encoding
-     */
-    public void setup(final VCFHeader header, final BCF2Encoder encoder, final Map<String, Integer> stringDictionary) {
-        for (final VCFInfoHeaderLine line : header.getInfoHeaderLines()) {
-            final String field = line.getID();
-            final BCF2FieldWriter.SiteWriter writer = createInfoWriter(header, line, encoder, stringDictionary);
-            add(siteWriters, field, writer);
-        }
-
-        for (final VCFFormatHeaderLine line : header.getFormatHeaderLines()) {
-            final String field = line.getID();
-            final BCF2FieldWriter.GenotypesWriter writer = createGenotypesWriter(header, line, encoder, stringDictionary);
-            add(genotypesWriters, field, writer);
-        }
-    }
-
-    private final <T> void add(final Map<String, T> map, final String field, final T writer) {
-        if ( map.containsKey(field) )
-            throw new IllegalStateException("BUG: field " + field + " already seen in VCFHeader while building BCF2 field encoders");
-        map.put(field, writer);
-    }
-
-    // -----------------------------------------------------------------
-    //
-    // Master routine to look at the header, a specific line, and
-    // build an appropriate SiteWriter for that header element
-    //
-    // -----------------------------------------------------------------
-
-    private BCF2FieldWriter.SiteWriter createInfoWriter(final VCFHeader header,
-                                                        final VCFInfoHeaderLine line,
-                                                        final BCF2Encoder encoder,
-                                                        final Map<String, Integer> dict) {
-        return new BCF2FieldWriter.GenericSiteWriter(header, createFieldEncoder(line, encoder, dict, false));
-    }
-
-    private BCF2FieldEncoder createFieldEncoder(final VCFCompoundHeaderLine line,
-                                                final BCF2Encoder encoder,
-                                                final Map<String, Integer> dict,
-                                                final boolean createGenotypesEncoders ) {
-
-        if ( createGenotypesEncoders && intGenotypeFieldAccessors.getAccessor(line.getID()) != null ) {
-            if ( GeneralUtils.DEBUG_MODE_ENABLED && line.getType() != VCFHeaderLineType.Integer )
-                System.err.println("Warning: field " + line.getID() + " expected to encode an integer but saw " + line.getType() + " for record " + line);
-            return new BCF2FieldEncoder.IntArray(line, dict);
-        } else if ( createGenotypesEncoders && line.getID().equals(VCFConstants.GENOTYPE_KEY) ) {
-            return new BCF2FieldEncoder.GenericInts(line, dict);
-        } else {
-            switch ( line.getType() ) {
-                case Character:
-                case String:
-                    return new BCF2FieldEncoder.StringOrCharacter(line, dict);
-                case Flag:
-                    return new BCF2FieldEncoder.Flag(line, dict);
-                case Float:
-                    return new BCF2FieldEncoder.Float(line, dict);
-                case Integer:
-                    if ( line.isFixedCount() && line.getCount() == 1 )
-                        return new BCF2FieldEncoder.AtomicInt(line, dict);
-                    else
-                        return new BCF2FieldEncoder.GenericInts(line, dict);
-                default:
-                    throw new IllegalArgumentException("Unexpected type for field " + line.getID());
-            }
-        }
-    }
-
-    // -----------------------------------------------------------------
-    //
-    // Master routine to look at the header, a specific line, and
-    // build an appropriate Genotypes for that header element
-    //
-    // -----------------------------------------------------------------
-
-    private BCF2FieldWriter.GenotypesWriter createGenotypesWriter(final VCFHeader header,
-                                                                  final VCFFormatHeaderLine line,
-                                                                  final BCF2Encoder encoder,
-                                                                  final Map<String, Integer> dict) {
-        final String field = line.getID();
-        final BCF2FieldEncoder fieldEncoder = createFieldEncoder(line, encoder, dict, true);
-
-        if ( field.equals(VCFConstants.GENOTYPE_KEY) ) {
-            return new BCF2FieldWriter.GTWriter(header, fieldEncoder);
-        } else if ( line.getID().equals(VCFConstants.GENOTYPE_FILTER_KEY) ) {
-            return new BCF2FieldWriter.FTGenotypesWriter(header, fieldEncoder);
-        } else if ( intGenotypeFieldAccessors.getAccessor(field) != null ) {
-            return new BCF2FieldWriter.IGFGenotypesWriter(header, fieldEncoder, intGenotypeFieldAccessors.getAccessor(field));
-        } else if ( line.getType() == VCFHeaderLineType.Integer ) {
-            return new BCF2FieldWriter.IntegerTypeGenotypesWriter(header, fieldEncoder);
-        } else {
-            return new BCF2FieldWriter.StaticallyTypeGenotypesWriter(header, fieldEncoder);
-        }
-    }
-
-    // -----------------------------------------------------------------
-    //
-    // Accessors to get site / genotype writers
-    //
-    // -----------------------------------------------------------------
-
-    /**
-     * Get a site writer specialized to encode values for site info field
-     * @param field key found in the VCF header INFO records
-     * @return non-null writer if one can be found, or null if none exists for field
-     */
-    public BCF2FieldWriter.SiteWriter getSiteFieldWriter(final String field) {
-        return getWriter(field, siteWriters);
-    }
-
-    /**
-     * Get a genotypes writer specialized to encode values for genotypes field
-     * @param field key found in the VCF header FORMAT records
-     * @return non-null writer if one can be found, or null if none exists for field
-     */
-    public BCF2FieldWriter.GenotypesWriter getGenotypeFieldWriter(final String field) {
-        return getWriter(field, genotypesWriters);
-    }
-
-    public <T> T getWriter(final String key, final Map<String, T> map) {
-        return map.get(key);
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Writer.java b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Writer.java
deleted file mode 100644
index 8c16aac..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Writer.java
+++ /dev/null
@@ -1,443 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.index.IndexCreator;
-import htsjdk.variant.bcf2.BCF2Codec;
-import htsjdk.variant.bcf2.BCF2Type;
-import htsjdk.variant.bcf2.BCF2Utils;
-import htsjdk.variant.bcf2.BCFVersion;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.LazyGenotypesContext;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFContigHeaderLine;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFUtils;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * VariantContextWriter that emits BCF2 binary encoding
- *
- * Overall structure of this writer is complex for efficiency reasons
- *
- * -- The BCF2Writer manages the low-level BCF2 encoder, the mappings
- * from contigs and strings to offsets, the VCF header, and holds the
- * lower-level encoders that map from VC and Genotype fields to their
- * specific encoders.  This class also writes out the standard BCF2 fields
- * like POS, contig, the size of info and genotype data, QUAL, etc.  It
- * has loops over the INFO and GENOTYPES to encode each individual datum
- * with the generic field encoders, but the actual encoding work is
- * done with by the FieldWriters classes themselves
- *
- * -- BCF2FieldWriter are specialized classes for writing out SITE and
- * genotype information for specific SITE/GENOTYPE fields (like AC for
- * sites and GQ for genotypes).  These are objects in themselves because
- * the manage all of the complexity of relating the types in the VCF header
- * with the proper encoding in BCF as well as the type representing this
- * in java.  Relating all three of these pieces of information together
- * is the main complexity challenge in the encoder.  The piece of code
- * that determines which FieldWriters to associate with each SITE and
- * GENOTYPE field is the BCF2FieldWriterManager.  These FieldWriters
- * are specialized for specific combinations of encoders (see below)
- * and contexts (genotypes) for efficiency, so they smartly manage
- * the writing of PLs (encoded as int[]) directly into the lowest
- * level BCFEncoder.
- *
- * -- At the third level is the BCF2FieldEncoder, relatively simple
- * pieces of code that handle the task of determining the right
- * BCF2 type for specific field values, as well as reporting back
- * information such as the number of elements used to encode it
- * (simple for atomic values like Integer but complex for PLs
- * or lists of strings)
- *
- * -- At the lowest level is the BCF2Encoder itself.  This provides
- * just the limited encoding methods specified by the BCF2 specification.  This encoder
- * doesn't do anything but make it possible to conveniently write out valid low-level
- * BCF2 constructs.
- *
- * @author Mark DePristo
- * @since 06/12
- */
-class BCF2Writer extends IndexingVariantContextWriter {
-    public static final int MAJOR_VERSION = 2;
-    public static final int MINOR_VERSION = 1;
-
-    final private static boolean ALLOW_MISSING_CONTIG_LINES = false;
-
-    private final OutputStream outputStream;      // Note: do not flush until completely done writing, to avoid issues with eventual BGZF support
-    private VCFHeader header;
-    private final Map<String, Integer> contigDictionary = new HashMap<String, Integer>();
-    private final Map<String, Integer> stringDictionaryMap = new LinkedHashMap<String, Integer>();
-    private final boolean doNotWriteGenotypes;
-    private String[] sampleNames = null;
-
-    private final BCF2Encoder encoder = new BCF2Encoder(); // initialized after the header arrives
-    final BCF2FieldWriterManager fieldManager = new BCF2FieldWriterManager();
-
-    /**
-     * cached results for whether we can write out raw genotypes data.
-     */
-    private VCFHeader lastVCFHeaderOfUnparsedGenotypes = null;
-    private boolean canPassOnUnparsedGenotypeDataForLastVCFHeader = false;
-
-    public BCF2Writer(final File location, final OutputStream output, final SAMSequenceDictionary refDict,
-                      final boolean enableOnTheFlyIndexing, final boolean doNotWriteGenotypes) {
-        super(writerName(location, output), location, output, refDict, enableOnTheFlyIndexing);
-        this.outputStream = getOutputStream();
-        this.doNotWriteGenotypes = doNotWriteGenotypes;
-    }
-
-    public BCF2Writer(final File location, final OutputStream output, final SAMSequenceDictionary refDict,
-                      final IndexCreator indexCreator,
-                      final boolean enableOnTheFlyIndexing, final boolean doNotWriteGenotypes) {
-        super(writerName(location, output), location, output, refDict, enableOnTheFlyIndexing, indexCreator);
-        this.outputStream = getOutputStream();
-        this.doNotWriteGenotypes = doNotWriteGenotypes;
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Interface functions
-    //
-    // --------------------------------------------------------------------------------
-
-    @Override
-    public void writeHeader(VCFHeader header) {
-        // make sure the header is sorted correctly
-        header = new VCFHeader(header.getMetaDataInSortedOrder(), header.getGenotypeSamples());
-
-        // create the config offsets map
-        if ( header.getContigLines().isEmpty() ) {
-            if ( ALLOW_MISSING_CONTIG_LINES ) {
-                if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
-                    System.err.println("No contig dictionary found in header, falling back to reference sequence dictionary");
-                }
-                createContigDictionary(VCFUtils.makeContigHeaderLines(getRefDict(), null));
-            } else {
-                throw new IllegalStateException("Cannot write BCF2 file with missing contig lines");
-            }
-        } else {
-            createContigDictionary(header.getContigLines());
-        }
-
-        // set up the map from dictionary string values -> offset
-        final ArrayList<String> dict = BCF2Utils.makeDictionary(header);
-        for ( int i = 0; i < dict.size(); i++ ) {
-            stringDictionaryMap.put(dict.get(i), i);
-        }
-
-        sampleNames = header.getGenotypeSamples().toArray(new String[header.getNGenotypeSamples()]);
-
-        // setup the field encodings
-        fieldManager.setup(header, encoder, stringDictionaryMap);
-
-        try {
-            // write out the header into a byte stream, get its length, and write everything to the file
-            final ByteArrayOutputStream capture = new ByteArrayOutputStream();
-            final OutputStreamWriter writer = new OutputStreamWriter(capture);
-            this.header = VCFWriter.writeHeader(header, writer, doNotWriteGenotypes, VCFWriter.getVersionLine(), "BCF2 stream");
-            writer.append('\0'); // the header is null terminated by a byte
-            writer.close();
-
-            final byte[] headerBytes = capture.toByteArray();
-            new BCFVersion(MAJOR_VERSION, MINOR_VERSION).write(outputStream);
-            BCF2Type.INT32.write(headerBytes.length, outputStream);
-            outputStream.write(headerBytes);
-        } catch (IOException e) {
-            throw new RuntimeIOException("BCF2 stream: Got IOException while trying to write BCF2 header", e);
-        }
-    }
-
-    @Override
-    public void add( VariantContext vc ) {
-        if ( doNotWriteGenotypes )
-            vc = new VariantContextBuilder(vc).noGenotypes().make();
-        vc = vc.fullyDecode(header, false);
-
-        super.add(vc); // allow on the fly indexing
-
-        try {
-            final byte[] infoBlock = buildSitesData(vc);
-            final byte[] genotypesBlock = buildSamplesData(vc);
-
-            // write the two blocks to disk
-            writeBlock(infoBlock, genotypesBlock);
-        }
-        catch ( IOException e ) {
-            throw new RuntimeIOException("Error writing record to BCF2 file: " + vc.toString(), e);
-        }
-    }
-
-    @Override
-    public void close() {
-        try {
-            outputStream.flush();
-        }
-        catch ( IOException e ) {
-            throw new RuntimeIOException("Failed to flush BCF2 file");
-        }
-        super.close();
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // implicit block
-    //
-    // The first four records of BCF are inline untype encoded data of:
-    //
-    // 4 byte integer chrom offset
-    // 4 byte integer start
-    // 4 byte integer ref length
-    // 4 byte float qual
-    //
-    // --------------------------------------------------------------------------------
-    private byte[] buildSitesData( VariantContext vc ) throws IOException {
-        final int contigIndex = contigDictionary.get(vc.getContig());
-        if ( contigIndex == -1 )
-            throw new IllegalStateException(String.format("Contig %s not found in sequence dictionary from reference", vc.getContig()));
-
-        // note use of encodeRawValue to not insert the typing byte
-        encoder.encodeRawValue(contigIndex, BCF2Type.INT32);
-
-        // pos.  GATK is 1 based, BCF2 is 0 based
-        encoder.encodeRawValue(vc.getStart() - 1, BCF2Type.INT32);
-
-        // ref length.  GATK is closed, but BCF2 is open so the ref length is GATK end - GATK start + 1
-        // for example, a SNP is in GATK at 1:10-10, which has ref length 10 - 10 + 1 = 1
-        encoder.encodeRawValue(vc.getEnd() - vc.getStart() + 1, BCF2Type.INT32);
-
-        // qual
-        if ( vc.hasLog10PError() )
-            encoder.encodeRawFloat((float) vc.getPhredScaledQual());
-        else
-            encoder.encodeRawMissingValue(BCF2Type.FLOAT);
-
-        // info fields
-        final int nAlleles = vc.getNAlleles();
-        final int nInfo = vc.getAttributes().size();
-        final int nGenotypeFormatFields = getNGenotypeFormatFields(vc);
-        final int nSamples = header.getNGenotypeSamples();
-
-        encoder.encodeRawInt((nAlleles << 16) | (nInfo & 0x0000FFFF), BCF2Type.INT32);
-        encoder.encodeRawInt((nGenotypeFormatFields << 24) | (nSamples & 0x00FFFFF), BCF2Type.INT32);
-
-        buildID(vc);
-        buildAlleles(vc);
-        buildFilter(vc);
-        buildInfo(vc);
-
-        return encoder.getRecordBytes();
-    }
-
-
-    /**
-     * Can we safely write on the raw (undecoded) genotypes of an input VC?
-     *
-     * The cache depends on the undecoded lazy data header == lastVCFHeaderOfUnparsedGenotypes, in
-     * which case we return the previous result.  If it's not cached, we use the BCF2Util to
-     * compare the VC header with our header (expensive) and cache it.
-     *
-     * @param lazyData
-     * @return
-     */
-    private boolean canSafelyWriteRawGenotypesBytes(final BCF2Codec.LazyData lazyData) {
-        if ( lazyData.header != lastVCFHeaderOfUnparsedGenotypes ) {
-            // result is already cached
-            canPassOnUnparsedGenotypeDataForLastVCFHeader = BCF2Utils.headerLinesAreOrderedConsistently(this.header,lazyData.header);
-            lastVCFHeaderOfUnparsedGenotypes = lazyData.header;
-        }
-
-        return canPassOnUnparsedGenotypeDataForLastVCFHeader;
-    }
-
-    private BCF2Codec.LazyData getLazyData(final VariantContext vc) {
-        if ( vc.getGenotypes().isLazyWithData() ) {
-            final LazyGenotypesContext lgc = (LazyGenotypesContext)vc.getGenotypes();
-
-            if ( lgc.getUnparsedGenotypeData() instanceof BCF2Codec.LazyData &&
-                    canSafelyWriteRawGenotypesBytes((BCF2Codec.LazyData) lgc.getUnparsedGenotypeData())) {
-                return (BCF2Codec.LazyData)lgc.getUnparsedGenotypeData();
-            } else {
-                lgc.decode(); // WARNING -- required to avoid keeping around bad lazy data for too long
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Try to get the nGenotypeFields as efficiently as possible.
-     *
-     * If this is a lazy BCF2 object just grab the field count from there,
-     * otherwise do the whole counting by types test in the actual data
-     *
-     * @param vc
-     * @return
-     */
-    private int getNGenotypeFormatFields(final VariantContext vc) {
-        final BCF2Codec.LazyData lazyData = getLazyData(vc);
-        return lazyData != null ? lazyData.nGenotypeFields : vc.calcVCFGenotypeKeys(header).size();
-    }
-
-    private void buildID( VariantContext vc ) throws IOException {
-        encoder.encodeTypedString(vc.getID());
-    }
-
-    private void buildAlleles( VariantContext vc ) throws IOException {
-        for ( Allele allele : vc.getAlleles() ) {
-            final byte[] s = allele.getDisplayBases();
-            if ( s == null )
-                throw new IllegalStateException("BUG: BCF2Writer encountered null padded allele" + allele);
-            encoder.encodeTypedString(s);
-        }
-    }
-
-    private void buildFilter( VariantContext vc ) throws IOException {
-        if ( vc.isFiltered() ) {
-            encodeStringsByRef(vc.getFilters());
-        } else if ( vc.filtersWereApplied() ) {
-            encodeStringsByRef(Collections.singleton(VCFConstants.PASSES_FILTERS_v4));
-        } else {
-            encoder.encodeTypedMissing(BCF2Type.INT8);
-        }
-    }
-
-    private void buildInfo( VariantContext vc ) throws IOException {
-        for ( Map.Entry<String, Object> infoFieldEntry : vc.getAttributes().entrySet() ) {
-            final String field = infoFieldEntry.getKey();
-            final BCF2FieldWriter.SiteWriter writer = fieldManager.getSiteFieldWriter(field);
-            if ( writer == null ) errorUnexpectedFieldToWrite(vc, field, "INFO");
-            writer.start(encoder, vc);
-            writer.site(encoder, vc);
-            writer.done(encoder, vc);
-        }
-    }
-
-    private byte[] buildSamplesData(final VariantContext vc) throws IOException {
-        final BCF2Codec.LazyData lazyData = getLazyData(vc);  // has critical side effects
-        if ( lazyData != null ) {
-            // we never decoded any data from this BCF file, so just pass it back
-            return lazyData.bytes;
-        }
-
-        // we have to do work to convert the VC into a BCF2 byte stream
-        final List<String> genotypeFields = vc.calcVCFGenotypeKeys(header);
-        for ( final String field : genotypeFields ) {
-            final BCF2FieldWriter.GenotypesWriter writer = fieldManager.getGenotypeFieldWriter(field);
-            if ( writer == null ) errorUnexpectedFieldToWrite(vc, field, "FORMAT");
-
-            assert writer != null;
-
-            writer.start(encoder, vc);
-            for ( final String name : sampleNames ) {
-                Genotype g = vc.getGenotype(name);
-                if ( g == null ) g = GenotypeBuilder.createMissing(name, writer.nValuesPerGenotype);
-                writer.addGenotype(encoder, vc, g);
-            }
-            writer.done(encoder, vc);
-        }
-        return encoder.getRecordBytes();
-    }
-
-    /**
-     * Throws a meaningful error message when a field (INFO or FORMAT) is found when writing out a file
-     * but there's no header line for it.
-     *
-     * @param vc
-     * @param field
-     * @param fieldType
-     */
-    private void errorUnexpectedFieldToWrite(final VariantContext vc, final String field, final String fieldType) {
-        throw new IllegalStateException("Found field " + field + " in the " + fieldType + " fields of VariantContext at " +
-                vc.getContig() + ":" + vc.getStart() + " from " + vc.getSource() + " but this hasn't been defined in the VCFHeader");
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Low-level block encoding
-    //
-    // --------------------------------------------------------------------------------
-
-    /**
-     * Write the data in the encoder to the outputstream as a length encoded
-     * block of data.  After this call the encoder stream will be ready to
-     * start a new data block
-     *
-     * @throws IOException
-     */
-    private void writeBlock(final byte[] infoBlock, final byte[] genotypesBlock) throws IOException {
-        BCF2Type.INT32.write(infoBlock.length, outputStream);
-        BCF2Type.INT32.write(genotypesBlock.length, outputStream);
-        outputStream.write(infoBlock);
-        outputStream.write(genotypesBlock);
-    }
-
-    private BCF2Type encodeStringsByRef(final Collection<String> strings) throws IOException {
-        final List<Integer> offsets = new ArrayList<Integer>(strings.size());
-
-        // iterate over strings until we find one that needs 16 bits, and break
-        for ( final String string : strings ) {
-            final Integer got = stringDictionaryMap.get(string);
-            if ( got == null ) throw new IllegalStateException("Format error: could not find string " + string + " in header as required by BCF");
-            final int offset = got;
-            offsets.add(offset);
-        }
-
-        final BCF2Type type = BCF2Utils.determineIntegerType(offsets);
-        encoder.encodeTyped(offsets, type);
-        return type;
-    }
-
-    /**
-     * Create the contigDictionary from the contigLines extracted from the VCF header
-     *
-     * @param contigLines
-     */
-    private void createContigDictionary(final Collection<VCFContigHeaderLine> contigLines) {
-        int offset = 0;
-        for ( VCFContigHeaderLine contig : contigLines )
-            contigDictionary.put(contig.getID(), offset++);
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/IndexingVariantContextWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/IndexingVariantContextWriter.java
deleted file mode 100644
index 6a77f6b..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/IndexingVariantContextWriter.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.index.DynamicIndexCreator;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexCreator;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.samtools.util.PositionalOutputStream;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintStream;
-
-/**
- * this class writes VCF files
- */
-abstract class IndexingVariantContextWriter implements VariantContextWriter {
-    private final String name;
-    private final File location;
-    private final SAMSequenceDictionary refDict;
-
-    private OutputStream outputStream;
-    private LocationAware locationSource = null;
-    private IndexCreator indexer = null;
-
-    private IndexingVariantContextWriter(final String name, final File location, final OutputStream output, final SAMSequenceDictionary refDict) {
-        this.name = name;
-        this.location = location;
-        this.outputStream = output;
-        this.refDict = refDict;
-    }
-
-    /**
-     * Create a VariantContextWriter with an associated index using the default index creator
-     *
-     * @param name  the name of this writer (i.e. the file name or stream)
-     * @param location  the path to the output file
-     * @param output    the output stream to write to
-     * @param refDict   the reference dictionary
-     * @param enableOnTheFlyIndexing    is OTF indexing enabled?
-     */
-    protected IndexingVariantContextWriter(final String name, final File location, final OutputStream output, final SAMSequenceDictionary refDict,
-                                           final boolean enableOnTheFlyIndexing) {
-        this(name, location, output, refDict);
-
-        if ( enableOnTheFlyIndexing ) {
-            initIndexingWriter(new DynamicIndexCreator(location, IndexFactory.IndexBalanceApproach.FOR_SEEK_TIME));
-        }
-    }
-
-    /**
-     * Create a VariantContextWriter with an associated index using a custom index creator
-     *
-     * @param name  the name of this writer (i.e. the file name or stream)
-     * @param location  the path to the output file
-     * @param output    the output stream to write to
-     * @param refDict   the reference dictionary
-     * @param enableOnTheFlyIndexing    is OTF indexing enabled?
-     * @param idxCreator    the custom index creator.  NOTE: must be initialized
-     */
-    protected IndexingVariantContextWriter(final String name, final File location, final OutputStream output, final SAMSequenceDictionary refDict,
-                                           final boolean enableOnTheFlyIndexing, final IndexCreator idxCreator) {
-        this(name, location, output, refDict);
-
-        if ( enableOnTheFlyIndexing ) {
-            // TODO: Handle non-Tribble IndexCreators
-            initIndexingWriter(idxCreator);
-        }
-    }
-
-    private void initIndexingWriter(final IndexCreator idxCreator) {
-        indexer = idxCreator;
-        if (outputStream instanceof LocationAware) {
-            locationSource = (LocationAware)outputStream;
-        } else {
-            final PositionalOutputStream positionalOutputStream = new PositionalOutputStream(outputStream);
-            locationSource = positionalOutputStream;
-            outputStream = positionalOutputStream;
-        }
-    }
-    
-    /** return true is the underlying stream is a PrintStream and 
-     * its checkError returned true. Used to stop linux pipelines 
-     */
-    @Override
-    public boolean checkError() {
-        return (getOutputStream() instanceof PrintStream) && 
-                PrintStream.class.cast(getOutputStream()).checkError();
-    }
-    
-    public OutputStream getOutputStream() {
-        return outputStream;
-    }
-
-    public String getStreamName() {
-        return name;
-    }
-
-    public abstract void writeHeader(VCFHeader header);
-
-    /**
-     * attempt to close the VCF file
-     */
-    public void close() {
-        try {
-            // close the underlying output stream
-            outputStream.close();
-
-            // close the index stream (keep it separate to help debugging efforts)
-            if (indexer != null) {
-                indexer.setIndexSequenceDictionary(refDict);
-                final Index index = indexer.finalizeIndex(locationSource.getPosition());
-                index.writeBasedOnFeatureFile(location);
-            }
-
-
-        } catch (final IOException e) {
-            throw new RuntimeIOException("Unable to close index for " + getStreamName(), e);
-        }
-    }
-
-    /**
-     * @return the reference sequence dictionary used for the variant contexts being written
-     */
-    public SAMSequenceDictionary getRefDict() {
-        return refDict;
-    }
-
-    /**
-     * add a record to the file
-     *
-     * @param vc      the Variant Context object
-     */
-    public void add(final VariantContext vc) {
-        // if we are doing on the fly indexing, add the record ***before*** we write any bytes
-        if ( indexer != null )
-            indexer.addFeature(vc, locationSource.getPosition());
-    }
-
-    /**
-     * Returns a reasonable "name" for this writer, to display to the user if something goes wrong
-     *
-     * @param location
-     * @param stream
-     * @return
-     */
-    protected static final String writerName(final File location, final OutputStream stream) {
-        return location == null ? stream.toString() : location.getAbsolutePath();
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/IntGenotypeFieldAccessors.java b/src/main/java/htsjdk/variant/variantcontext/writer/IntGenotypeFieldAccessors.java
deleted file mode 100644
index 1934d8d..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/IntGenotypeFieldAccessors.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.util.HashMap;
-
-/**
- * A convenient way to provide a single view on the many int and int[] field values we work with,
- * for writing out the values.  This class makes writing out the inline AD, GQ, PL, DP fields
- * easy and fast
- *
- * @author Mark DePristo
- * @since 6/12
- */
-public class IntGenotypeFieldAccessors {
-    // initialized once per writer to allow parallel writers to work
-    private final HashMap<String, Accessor> intGenotypeFieldEncoders = new HashMap<String, Accessor>();
-
-    public IntGenotypeFieldAccessors() {
-        intGenotypeFieldEncoders.put(VCFConstants.DEPTH_KEY, new IntGenotypeFieldAccessors.DPAccessor());
-        intGenotypeFieldEncoders.put(VCFConstants.GENOTYPE_ALLELE_DEPTHS, new IntGenotypeFieldAccessors.ADAccessor());
-        intGenotypeFieldEncoders.put(VCFConstants.GENOTYPE_PL_KEY, new IntGenotypeFieldAccessors.PLAccessor());
-        intGenotypeFieldEncoders.put(VCFConstants.GENOTYPE_QUALITY_KEY, new IntGenotypeFieldAccessors.GQAccessor());
-    }
-
-    /**
-     * Return an accessor for field, or null if none exists
-     * @param field
-     * @return
-     */
-    public Accessor getAccessor(final String field) {
-        return intGenotypeFieldEncoders.get(field);
-    }
-
-    public static abstract class Accessor {
-        public abstract int[] getValues(final Genotype g);
-
-        public final int getSize(final Genotype g) {
-            final int[] v = getValues(g);
-            return v == null ? 0 : v.length;
-        }
-    }
-
-    private static abstract class AtomicAccessor extends Accessor {
-        private final int[] singleton = new int[1];
-
-        @Override
-        public int[] getValues(final Genotype g) {
-            singleton[0] = getValue(g);
-            return singleton[0] == -1 ? null : singleton;
-        }
-
-        public abstract int getValue(final Genotype g);
-    }
-
-    public static class GQAccessor extends AtomicAccessor {
-        @Override public int getValue(final Genotype g) { return Math.min(g.getGQ(), VCFConstants.MAX_GENOTYPE_QUAL); }
-    }
-
-    public static class DPAccessor extends AtomicAccessor {
-        @Override public int getValue(final Genotype g) { return g.getDP(); }
-    }
-
-    public static class ADAccessor extends Accessor {
-        @Override public int[] getValues(final Genotype g) { return g.getAD(); }
-    }
-
-    public static class PLAccessor extends Accessor {
-        @Override public int[] getValues(final Genotype g) { return g.getPL(); }
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/Options.java b/src/main/java/htsjdk/variant/variantcontext/writer/Options.java
deleted file mode 100644
index 50db1e9..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/Options.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-/**
- * Available writer options for VariantContextWriters
- *
- * @author Mark DePristo
- * @since 5/12
- */
-public enum Options {
-    INDEX_ON_THE_FLY,
-    DO_NOT_WRITE_GENOTYPES,
-    ALLOW_MISSING_FIELDS_IN_HEADER,
-    FORCE_BCF,
-    USE_ASYNC_IO,            // Turn on or off the use of asynchronous IO for writing output VCF files.
-    WRITE_FULL_FORMAT_FIELD  // Write the complete format field, even if trailing missing values could be trimmed?
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriter.java
deleted file mode 100644
index 2185482..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriter.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * this class writes VCF files, allowing records to be passed in unsorted (up to a certain genomic distance away)
- */
-public class SortingVariantContextWriter extends SortingVariantContextWriterBase {
-
-    // the maximum START distance between records that we'll cache
-    private int maxCachingStartDistance;
-
-    /**
-     * create a local-sorting VCF writer, given an inner VCF writer to write to
-     *
-     * @param innerWriter        the VCFWriter to write to
-     * @param maxCachingStartDistance the maximum start distance between records that we'll cache
-     * @param takeOwnershipOfInner Should this Writer close innerWriter when it's done with it
-     */
-    public SortingVariantContextWriter(VariantContextWriter innerWriter, int maxCachingStartDistance, boolean takeOwnershipOfInner) {
-        super(innerWriter, takeOwnershipOfInner);
-        this.maxCachingStartDistance = maxCachingStartDistance;
-    }
-
-    public SortingVariantContextWriter(VariantContextWriter innerWriter, int maxCachingStartDistance) {
-        this(innerWriter, maxCachingStartDistance, false); // by default, don't own inner
-    }
-
-    protected void noteCurrentRecord(VariantContext vc) {
-        super.noteCurrentRecord(vc); // first, check for errors
-
-        // then, update mostUpstreamWritableLoc:
-        int mostUpstreamWritableIndex = vc.getStart() - maxCachingStartDistance;
-        this.mostUpstreamWritableLoc = Math.max(BEFORE_MOST_UPSTREAM_LOC, mostUpstreamWritableIndex);
-    }
-    
-    @Override
-    public boolean checkError() {
-        return false;
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriterBase.java b/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriterBase.java
deleted file mode 100644
index 690a781..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriterBase.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-import java.io.Serializable;
-import java.util.Comparator;
-import java.util.Queue;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.concurrent.PriorityBlockingQueue;
-
-/**
- * This class writes VCF files, allowing records to be passed in unsorted.
- * It also enforces that it is never passed records of the same chromosome with any other chromosome in between them.
- */
-abstract class SortingVariantContextWriterBase implements VariantContextWriter {
-
-    // The VCFWriter to which to actually write the sorted VCF records
-    private final VariantContextWriter innerWriter;
-
-    // the current queue of un-emitted records
-    private final Queue<VCFRecord> queue;
-
-    // The locus until which we are permitted to write out (inclusive)
-    protected Integer mostUpstreamWritableLoc;
-    protected static final int BEFORE_MOST_UPSTREAM_LOC = 0; // No real locus index is <= 0
-
-    // The set of chromosomes already passed over and to which it is forbidden to return
-    private final Set<String> finishedChromosomes;
-
-    // Should we call innerWriter.close() in close()
-    private final boolean takeOwnershipOfInner;
-
-    // --------------------------------------------------------------------------------
-    //
-    // Constructors
-    //
-    // --------------------------------------------------------------------------------
-
-    /**
-     * create a local-sorting VCF writer, given an inner VCF writer to write to
-     *
-     * @param innerWriter        the VCFWriter to write to
-     * @param takeOwnershipOfInner Should this Writer close innerWriter when it's done with it
-     */
-    public SortingVariantContextWriterBase(VariantContextWriter innerWriter, boolean takeOwnershipOfInner) {
-        this.innerWriter = innerWriter;
-        this.finishedChromosomes = new TreeSet<String>();
-        this.takeOwnershipOfInner = takeOwnershipOfInner;
-
-        // has to be PriorityBlockingQueue to be thread-safe
-        this.queue = new PriorityBlockingQueue<VCFRecord>(50, new VariantContextComparator());
-
-        this.mostUpstreamWritableLoc = BEFORE_MOST_UPSTREAM_LOC;
-    }
-
-    public SortingVariantContextWriterBase(VariantContextWriter innerWriter) {
-        this(innerWriter, false); // by default, don't own inner
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // public interface functions
-    //
-    // --------------------------------------------------------------------------------
-
-    @Override
-    public void writeHeader(VCFHeader header) {
-        innerWriter.writeHeader(header);
-    }
-
-    /**
-     * attempt to close the VCF file; we need to flush the queue first
-     */
-    @Override
-    public void close() {
-        stopWaitingToSort();
-
-        if (takeOwnershipOfInner)
-            innerWriter.close();
-    }
-
-
-    /**
-     * add a record to the file
-     *
-     * @param vc      the Variant Context object
-     */
-    @Override
-    public synchronized void add(VariantContext vc) {
-        /* Note that the code below does not prevent the successive add()-ing of: (chr1, 10), (chr20, 200), (chr15, 100)
-           since there is no implicit ordering of chromosomes:
-         */
-        VCFRecord firstRec = queue.peek();
-        if (firstRec != null && !vc.getContig().equals(firstRec.vc.getContig())) { // if we hit a new contig, flush the queue
-            if (finishedChromosomes.contains(vc.getContig()))
-                throw new IllegalArgumentException("Added a record at " + vc.getContig() + ":" + vc.getStart() + ", but already finished with chromosome" + vc.getContig());
-
-            finishedChromosomes.add(firstRec.vc.getContig());
-            stopWaitingToSort();
-        }
-
-        noteCurrentRecord(vc); // possibly overwritten
-
-        queue.add(new VCFRecord(vc));
-        emitSafeRecords();
-    }
-
-    /**
-     * Gets a string representation of this object.
-     * @return a string representation of this object
-     */
-    @Override
-    public String toString() {
-        return getClass().getName();
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // protected interface functions for subclasses to use
-    //
-    // --------------------------------------------------------------------------------
-
-    private synchronized void stopWaitingToSort() {
-        emitRecords(true);
-        mostUpstreamWritableLoc = BEFORE_MOST_UPSTREAM_LOC;
-    }
-
-    protected synchronized void emitSafeRecords() {
-        emitRecords(false);
-    }
-
-    protected void noteCurrentRecord(VariantContext vc) {
-        // did the user break the contract by giving a record too late?
-        if (mostUpstreamWritableLoc != null && vc.getStart() < mostUpstreamWritableLoc) // went too far back, since may have already written anything that is <= mostUpstreamWritableLoc
-            throw new IllegalArgumentException("Permitted to write any record upstream of position " + mostUpstreamWritableLoc + ", but a record at " + vc.getContig() + ":" + vc.getStart() + " was just added.");
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // private implementation functions
-    //
-    // --------------------------------------------------------------------------------
-
-    private synchronized void emitRecords(boolean emitUnsafe) {
-        while (!queue.isEmpty()) {
-            VCFRecord firstRec = queue.peek();
-
-            // No need to wait, waiting for nothing, or before what we're waiting for:
-            if (emitUnsafe || mostUpstreamWritableLoc == null || firstRec.vc.getStart() <= mostUpstreamWritableLoc) {
-                queue.poll();
-                innerWriter.add(firstRec.vc);
-            }
-            else {
-                break;
-            }
-        }
-    }
-
-    private static class VariantContextComparator implements Comparator<VCFRecord>, Serializable {
-        private static final long serialVersionUID = 1L;
-
-        public int compare(VCFRecord r1, VCFRecord r2) {
-            return r1.vc.getStart() - r2.vc.getStart();
-        }
-    }
-
-    private static class VCFRecord {
-        public VariantContext vc;
-
-        public VCFRecord(VariantContext vc) {
-            this.vc = vc;
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java
deleted file mode 100644
index 71aef13..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.index.IndexCreator;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFEncoder;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLine;
-import htsjdk.variant.vcf.VCFHeaderVersion;
-
-import java.io.BufferedWriter;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-
-/**
- * this class writes VCF files
- */
-class VCFWriter extends IndexingVariantContextWriter {
-
-    private static final String VERSION_LINE =
-            VCFHeader.METADATA_INDICATOR + VCFHeaderVersion.VCF4_2.getFormatString() + "=" + VCFHeaderVersion.VCF4_2.getVersionString();
-
-	// Initialized when the header is written to the output stream
-	private VCFEncoder vcfEncoder = null;
-
-	// the VCF header we're storing
-	protected VCFHeader mHeader = null;
-
-	private final boolean allowMissingFieldsInHeader;
-
-	// should we write genotypes or just sites?
-	private final boolean doNotWriteGenotypes;
-
-    // should we always output a complete format record, even if we could drop trailing fields?
-    private final boolean writeFullFormatField;
-
-    /*
-     * The VCF writer uses an internal Writer, based by the ByteArrayOutputStream lineBuffer,
-     * to temp. buffer the header and per-site output before flushing the per line output
-     * in one go to the super.getOutputStream.  This results in high-performance, proper encoding,
-     * and allows us to avoid flushing explicitly the output stream getOutputStream, which
-     * allows us to properly compress vcfs in gz format without breaking indexing on the fly
-     * for uncompressed streams.
-     */
-    private static final int INITIAL_BUFFER_SIZE = 1024 * 16;
-    private final ByteArrayOutputStream lineBuffer = new ByteArrayOutputStream(INITIAL_BUFFER_SIZE);
-    /* Wrapping in a {@link BufferedWriter} avoids frequent conversions with individual writes to OutputStreamWriter. */
-    private final Writer writer = new BufferedWriter(new OutputStreamWriter(lineBuffer, VCFEncoder.VCF_CHARSET));
-
-    public VCFWriter(final File location, final OutputStream output, final SAMSequenceDictionary refDict,
-                     final boolean enableOnTheFlyIndexing,
-                     final boolean doNotWriteGenotypes, final boolean allowMissingFieldsInHeader,
-                     final boolean writeFullFormatField) {
-        super(writerName(location, output), location, output, refDict, enableOnTheFlyIndexing);
-        this.doNotWriteGenotypes = doNotWriteGenotypes;
-        this.allowMissingFieldsInHeader = allowMissingFieldsInHeader;
-        this.writeFullFormatField = writeFullFormatField;
-    }
-
-    public VCFWriter(final File location, final OutputStream output, final SAMSequenceDictionary refDict,
-                     final IndexCreator indexCreator, final boolean enableOnTheFlyIndexing,
-                     final boolean doNotWriteGenotypes, final boolean allowMissingFieldsInHeader,
-                     final boolean writeFullFormatField) {
-        super(writerName(location, output), location, output, refDict, enableOnTheFlyIndexing, indexCreator);
-        this.doNotWriteGenotypes = doNotWriteGenotypes;
-        this.allowMissingFieldsInHeader = allowMissingFieldsInHeader;
-        this.writeFullFormatField = writeFullFormatField;
-    }
-    // --------------------------------------------------------------------------------
-    //
-    // VCFWriter interface functions
-    //
-    // --------------------------------------------------------------------------------
-
-    /*
-     * Write String s to the internal buffered writer.
-     *
-     * writeAndResetBuffer() must be called to actually write the data to the true output stream.
-     *
-     * @param s the string to write
-     * @throws IOException
-     */
-    private void write(final String s) throws IOException {
-        writer.write(s);
-    }
-
-    /*
-     * Actually write the line buffer contents to the destination output stream. After calling this function
-     * the line buffer is reset so the contents of the buffer can be reused
-     */
-    private void writeAndResetBuffer() throws IOException {
-        writer.flush();
-        getOutputStream().write(lineBuffer.toByteArray());
-        lineBuffer.reset();
-    }
-
-    @Override
-    public void writeHeader(final VCFHeader header) {
-        // note we need to update the mHeader object after this call because they header
-        // may have genotypes trimmed out of it, if doNotWriteGenotypes is true
-        try {
-            this.mHeader = writeHeader(header, writer, doNotWriteGenotypes, getVersionLine(), getStreamName());
-            this.vcfEncoder = new VCFEncoder(this.mHeader, this.allowMissingFieldsInHeader, this.writeFullFormatField);
-            writeAndResetBuffer();
-
-        } catch ( IOException e ) {
-            throw new RuntimeIOException("Couldn't write file " + getStreamName(), e);
-        }
-    }
-
-    public static String getVersionLine() {
-        return VERSION_LINE;
-    }
-
-    public static VCFHeader writeHeader(VCFHeader header,
-                                        final Writer writer,
-                                        final boolean doNotWriteGenotypes,
-                                        final String versionLine,
-                                        final String streamNameForError) {
-        header = doNotWriteGenotypes ? new VCFHeader(header.getMetaDataInSortedOrder()) : header;
-        
-        try {
-            // the file format field needs to be written first
-            writer.write(versionLine + "\n");
-
-            for (final VCFHeaderLine line : header.getMetaDataInSortedOrder() ) {
-                if ( VCFHeaderVersion.isFormatString(line.getKey()) )
-                    continue;
-
-                writer.write(VCFHeader.METADATA_INDICATOR);
-                writer.write(line.toString());
-                writer.write("\n");
-            }
-
-            // write out the column line
-            writer.write(VCFHeader.HEADER_INDICATOR);
-            boolean isFirst = true;
-            for (final VCFHeader.HEADER_FIELDS field : header.getHeaderFields() ) {
-                if ( isFirst )
-                    isFirst = false; // don't write out a field separator
-                else
-                    writer.write(VCFConstants.FIELD_SEPARATOR);
-                writer.write(field.toString());
-            }
-
-            if ( header.hasGenotypingData() ) {
-                writer.write(VCFConstants.FIELD_SEPARATOR);
-                writer.write("FORMAT");
-                for (final String sample : header.getGenotypeSamples() ) {
-                    writer.write(VCFConstants.FIELD_SEPARATOR);
-                    writer.write(sample);
-                }
-            }
-
-            writer.write("\n");
-            writer.flush();  // necessary so that writing to an output stream will work
-        }
-        catch (IOException e) {
-            throw new RuntimeIOException("IOException writing the VCF header to " + streamNameForError, e);
-        }
-
-        return header;
-    }
-
-    /**
-     * attempt to close the VCF file
-     */
-    @Override
-    public void close() {
-        // try to close the vcf stream
-        try {
-            // TODO -- would it be useful to null out the line buffer so we don't have it around unnecessarily?
-            writer.close();
-        } catch (IOException e) {
-            throw new RuntimeIOException("Unable to close " + getStreamName(), e);
-        }
-
-        super.close();
-    }
-
-    /**
-     * Add a record to the file
-     */
-    @Override
-    public void add(final VariantContext context) {
-        try {
-            super.add(context);
-
-            if (this.doNotWriteGenotypes) write(this.vcfEncoder.encode(new VariantContextBuilder(context).noGenotypes().make()));
-            else write(this.vcfEncoder.encode(context));
-            write("\n");
-
-            writeAndResetBuffer();
-
-        } catch (IOException e) {
-            throw new RuntimeIOException("Unable to write the VCF object to " + getStreamName(), e);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriter.java
deleted file mode 100644
index 187ff17..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import java.io.Closeable;
-
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-/**
- * this class writes VCF files
- */
-public interface VariantContextWriter extends Closeable {
-
-    public void writeHeader(VCFHeader header);
-
-    /**
-     * attempt to close the VCF file
-     */
-    public void close();
-
-    /**
-     * @return true if the underlying stream is a java.io.PrintStream  and its checkError returned true, used for pipelines
-     */
-    public boolean checkError();
-    
-    public void add(VariantContext vc);
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java
deleted file mode 100644
index 56c8b8b..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java
+++ /dev/null
@@ -1,537 +0,0 @@
-/*
-* Copyright (c) 2014 The Broad Institute
-*
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Md5CalculatingOutputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.index.IndexCreator;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.index.tabix.TabixIndexCreator;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.util.EnumSet;
-
-/*
- * Created with IntelliJ IDEA.
- * User: thibault
- * Date: 3/7/14
- * Time: 2:07 PM
- */
-/**
- * @author thibault
- * 
- * <p>
- * Provides methods for creating <code>VariantContextWriter</code>s using the Builder pattern.
- * Replaces <code>VariantContextWriterFactory</code>.
- * </p>
- * <p>
- * The caller must choose an output file or an output stream for the <code>VariantContextWriter</code> to write to.
- * When a file is chosen, the output stream is created implicitly based on Defaults and options passed to the builder.
- * When a stream is chosen, it is passed unchanged to the <code>VariantContextWriter</code>.
- * </p>
- * <p>
- * Example: Create a series of files with buffering and indexing on the fly.
- * Determine the appropriate file type based on filename.
- * </p>
-
-   <pre>
-   VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
-       .setReferenceDictionary(refDict)
-       .setOption(Options.INDEX_ON_THE_FLY)
-       .setBuffer(8192);
- 
-   VariantContextWriter sample1_writer = builder
-       .setOutputFile("sample1.vcf")
-       .build();
-   VariantContextWriter sample2_writer = builder
-       .setOutputFile("sample2.bcf")
-       .build();
-   VariantContextWriter sample3_writer = builder
-       .setOutputFile("sample3.vcf.bgzf")
-       .build();
-   </pre>
-   
-   <p>
- * Example: Explicitly turn off buffering and explicitly set the file type
- * </p>
- * 
- * <pre>
-   VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
-       .setReferenceDictionary(refDict)
-       .setOption(Options.INDEX_ON_THE_FLY)
-       .unsetBuffering();
- 
-   VariantContextWriter sample1_writer = builder
-       .setOutputFile("sample1.custom_extension")
-       .setOutputFileType(OutputType.VCF)
-       .build();
-   VariantContextWriter sample2_writer = builder
-       .setOutputFile("sample2.custom_extension")
-       .setOutputFileType(OutputType.BLOCK_COMPRESSED_VCF)
-       .build();
-   </pre>
- */
-public class VariantContextWriterBuilder {
-    public static final EnumSet<Options> DEFAULT_OPTIONS = EnumSet.of(Options.INDEX_ON_THE_FLY);
-    public static final EnumSet<Options> NO_OPTIONS = EnumSet.noneOf(Options.class);
-
-    public enum OutputType {
-        UNSPECIFIED,
-        VCF,
-        BCF,
-        BLOCK_COMPRESSED_VCF,
-        VCF_STREAM,
-        BCF_STREAM
-    }
-
-    public static final EnumSet<OutputType> FILE_TYPES = EnumSet.of(OutputType.VCF, OutputType.BCF, OutputType.BLOCK_COMPRESSED_VCF);
-    public static final EnumSet<OutputType> STREAM_TYPES = EnumSet.of(OutputType.VCF_STREAM, OutputType.BCF_STREAM);
-
-    private SAMSequenceDictionary refDict = null;
-    private OutputType outType = OutputType.UNSPECIFIED;
-    private File outFile = null;
-    private OutputStream outStream = null;
-    private IndexCreator idxCreator = null;
-    private int bufferSize = Defaults.BUFFER_SIZE;
-    private boolean createMD5 = Defaults.CREATE_MD5;
-    protected EnumSet<Options> options = DEFAULT_OPTIONS.clone();
-
-    /**
-     * Default constructor.  Adds <code>USE_ASYNC_IO</code> to the Options if it is present in Defaults.
-     */
-    public VariantContextWriterBuilder() {
-        if (Defaults.USE_ASYNC_IO_WRITE_FOR_TRIBBLE) {
-            options.add(Options.USE_ASYNC_IO);
-        }
-    }
-
-    /**
-     * Set the reference dictionary to be used by <code>VariantContextWriter</code>s created by this builder.
-     *
-     * @param refDict the reference dictionary
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setReferenceDictionary(final SAMSequenceDictionary refDict) {
-        this.refDict = refDict;
-        return this;
-    }
-
-    /**
-     * Set the output file for the next <code>VariantContextWriter</code> created by this builder.
-     * Determines file type implicitly from the filename.
-     *
-     * @param outFile the file the <code>VariantContextWriter</code> will write to
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setOutputFile(final File outFile) {
-        this.outFile = outFile;
-        this.outStream = null;
-        this.outType = determineOutputTypeFromFile(outFile);
-        return this;
-    }
-
-    /**
-     * Set the output file for the next <code>VariantContextWriter</code> created by this builder.
-     * Determines file type implicitly from the filename.
-     *
-     * @param outFile the file the <code>VariantContextWriter</code> will write to
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setOutputFile(final String outFile) {
-        return setOutputFile(new File(outFile));
-    }
-
-    /**
-     * Set the output file type for the next <code>VariantContextWriter</code> created by this builder.
-     *
-     * @param outType the type of file the <code>VariantContextWriter</code> will write to
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setOutputFileType(final OutputType outType) {
-        if (!FILE_TYPES.contains(outType))
-            throw new IllegalArgumentException("Must choose a file type, not other output types.");
-
-        if (this.outFile == null || this.outStream != null)
-            throw new IllegalArgumentException("Cannot set a file type if the output is not to a file.");
-
-        this.outType = outType;
-        return this;
-    }
-
-    /**
-     * Set the output VCF stream for the next <code>VariantContextWriter</code> created by this builder.
-     * If buffered writing is desired, caller must provide some kind of buffered <code>OutputStream</code>.
-     *
-     * @param outStream the output stream to write to
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setOutputVCFStream(final OutputStream outStream) {
-        this.outStream = outStream;
-        this.outFile = null;
-        this.outType = OutputType.VCF_STREAM;
-        return this;
-    }
-
-    /**
-     * Set the output BCF stream for the next <code>VariantContextWriter</code> created by this builder.
-     * If buffered writing is desired, caller must provide some kind of buffered <code>OutputStream</code>.
-     *
-     * @param outStream the output stream to write to
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setOutputBCFStream(final OutputStream outStream) {
-        this.outStream = outStream;
-        this.outFile = null;
-        this.outType = OutputType.BCF_STREAM;
-        return this;
-    }
-
-    /**
-     * Set the output stream (VCF, by default) for the next <code>VariantContextWriter</code> created by this builder.
-     * If buffered writing is desired, caller must provide some kind of buffered <code>OutputStream</code>.
-     *
-     * @param outStream the output stream to write to
-     * @return this VariantContextWriterBuilder
-     */
-    public VariantContextWriterBuilder setOutputStream(final OutputStream outStream) {
-        return setOutputVCFStream(outStream);
-    }
-
-    /**
-     * Set an IndexCreator for the next <code>VariantContextWriter</code> created by this builder.
-     *
-     * @param idxCreator the <code>IndexCreator</code> to use
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setIndexCreator(final IndexCreator idxCreator) {
-        this.idxCreator = idxCreator;
-        return this;
-    }
-
-    /**
-     * Do not pass an <code>IndexCreator</code> to the next <code>VariantContextWriter</code> created by this builder.
-     *
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder clearIndexCreator() {
-        this.idxCreator = null;
-        return this;
-    }
-
-    /**
-     * Set a buffer size for the file output stream passed to the next <code>VariantContextWriter</code> created by this builder.
-     * Set to 0 for no buffering.
-     * Does not affect OutputStreams passed directly to <code>VariantContextWriterBuilder</code>.
-     *
-     * @param bufferSize the buffer size to use
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setBuffer(final int bufferSize) {
-        this.bufferSize = bufferSize;
-        return this;
-    }
-
-    /**
-     * Do not use buffering in the next <code>VariantContextWriter</code> created by this builder.
-     * Does not affect <code>OutputStream</code>s passed directly to <code>VariantContextWriterBuilder</code>.
-     *
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder unsetBuffering() {
-        this.bufferSize = 0;
-        return this;
-    }
-
-    /**
-     * Choose whether to also create an MD5 digest file for the next <code>VariantContextWriter</code> created by this builder.
-     *
-     * @param createMD5 boolean, <code>true</code> to create an MD5 digest
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setCreateMD5(final boolean createMD5) {
-        this.createMD5 = createMD5;
-        return this;
-    }
-
-    /**
-     * Create an MD5 digest file for the next <code>VariantContextWriter</code> created by this builder.
-     *
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setCreateMD5() {
-        return setCreateMD5(true);
-    }
-
-    /**
-     * Don't create an MD5 digest file for the next <code>VariantContextWriter</code> created by this builder.
-     *
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder unsetCreateMD5() {
-        return setCreateMD5(false);
-    }
-
-    /**
-     * Replace the set of <code>Options</code> for the <code>VariantContextWriterBuilder</code> with a new set.
-     *
-     * @param options the complete set of options to use
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setOptions(final EnumSet<Options> options) {
-        this.options = options;
-        return this;
-    }
-
-    /**
-     * Add one option to the set of <code>Options</code> for the <code>VariantContextWriterBuilder</code>, if it's not already present.
-     *
-     * @param option the option to set
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder setOption(final Options option) {
-        this.options.add(option);
-        return this;
-    }
-
-    /**
-     * Remove one option from the set of <code>Options</code> for the <code>VariantContextWriterBuilder</code>, if it's present.
-     *
-     * @param option the option to unset
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder unsetOption(final Options option) {
-        this.options.remove(option);
-        return this;
-    }
-
-    /**
-     * Set or unset option depending on the boolean given
-     * @param option the option to modify
-     * @param setIt true to set the option, false to unset it.
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public VariantContextWriterBuilder modifyOption(final Options option, final boolean setIt) {
-        return (setIt) ? this.setOption(option) : this.unsetOption(option);
-    }
-
-    /**
-     * Add one option to the set of default <code>Options</code> that will be used as the initial set of options
-     * for all VariantContextWriterBuilders created after this call.
-     *
-     * @param option the option to set
-     */
-    public static void setDefaultOption(final Options option) {
-        VariantContextWriterBuilder.DEFAULT_OPTIONS.add(option);
-    }
-
-    /**
-     * Remove an option from the set of default <code>Options</code> that will be used as the initial set of options
-     * for all VariantContextWriterBuilders created after this call.
-     *
-     * @param option the option to unset
-     * @return this <code>VariantContextWriterBuilder</code>
-     */
-    public static void unsetDefaultOption(final Options option) {
-        VariantContextWriterBuilder.DEFAULT_OPTIONS.remove(option);
-    }
-
-    /**
-     * Remove all options from the set of <code>Options</code> for the <code>VariantContextWriterBuilder</code>.
-     *
-     * @return this VariantContextWriterBuilder
-     */
-    public VariantContextWriterBuilder clearOptions() {
-        this.options = NO_OPTIONS.clone();
-        return this;
-    }
-
-    /**
-     * Used for testing; tests if the option is set
-     * @param option the option to test
-     * @return true if the option is set, false otherwise.
-     */
-    boolean isOptionSet(final Options option) {
-        return this.options.contains(option);
-    }
-
-    /**
-     * Validate and build the <code>VariantContextWriter</code>.
-     *
-     * @return the <code>VariantContextWriter</code> as specified by previous method calls
-     * @throws RuntimeIOException if the writer is configured to write to a file, and the corresponding path does not exist.
-     * @throws IllegalArgumentException if no output file or stream is specified.
-     * @throws IllegalArgumentException if <code>Options.INDEX_ON_THE_FLY</code> is specified and no reference dictionary is provided.
-     * @throws IllegalArgumentException if <code>Options.INDEX_ON_THE_FLY</code> is specified and a stream output is specified.
-     */
-    public VariantContextWriter build() {
-        VariantContextWriter writer = null;
-
-        // don't allow FORCE_BCF to modify the outType state
-        OutputType typeToBuild = this.outType;
-
-        if (this.options.contains(Options.FORCE_BCF)) {
-            if (FILE_TYPES.contains(this.outType))
-                typeToBuild = OutputType.BCF;
-            else if (STREAM_TYPES.contains(this.outType))
-                typeToBuild = OutputType.BCF_STREAM;
-        }
-
-        OutputStream outStreamFromFile = this.outStream;
-        if (FILE_TYPES.contains(this.outType)) {
-            try {
-                outStreamFromFile = IOUtil.maybeBufferOutputStream(new FileOutputStream(outFile), bufferSize);
-            } catch (final FileNotFoundException e) {
-                throw new RuntimeIOException("File not found: " + outFile, e);
-            }
-
-            if (createMD5)
-                outStreamFromFile = new Md5CalculatingOutputStream(outStreamFromFile, new File(outFile.getAbsolutePath() + ".md5"));
-        }
-
-        switch (typeToBuild) {
-            case UNSPECIFIED:
-                throw new IllegalArgumentException("Must specify file or stream output type.");
-            case VCF:
-                if ((refDict == null) && (options.contains(Options.INDEX_ON_THE_FLY)))
-                    throw new IllegalArgumentException("A reference dictionary is required for creating Tribble indices on the fly");
-
-                writer = createVCFWriter(outFile, outStreamFromFile);
-                break;
-            case BLOCK_COMPRESSED_VCF:
-                if (refDict == null)
-                    idxCreator = new TabixIndexCreator(TabixFormat.VCF);
-                else
-                    idxCreator = new TabixIndexCreator(refDict, TabixFormat.VCF);
-
-                writer = createVCFWriter(outFile, new BlockCompressedOutputStream(outStreamFromFile, outFile));
-                break;
-            case BCF:
-                if ((refDict == null) && (options.contains(Options.INDEX_ON_THE_FLY)))
-                    throw new IllegalArgumentException("A reference dictionary is required for creating Tribble indices on the fly");
-
-                writer = createBCFWriter(outFile, outStreamFromFile);
-                break;
-            case VCF_STREAM:
-                if (options.contains(Options.INDEX_ON_THE_FLY))
-                    throw new IllegalArgumentException("VCF index creation not supported for stream output.");
-
-                writer = createVCFWriter(null, outStream);
-                break;
-            case BCF_STREAM:
-                if (options.contains(Options.INDEX_ON_THE_FLY))
-                    throw new IllegalArgumentException("BCF index creation not supported for stream output.");
-
-                writer = createBCFWriter(null, outStream);
-                break;
-        }
-
-        if (this.options.contains(Options.USE_ASYNC_IO))
-            writer = new AsyncVariantContextWriter(writer, AsyncVariantContextWriter.DEFAULT_QUEUE_SIZE);
-
-        return writer;
-     }
-
-    /**
-     * Attempts to determine the type of file/data to write based on the File path being
-     * written to. Will attempt to determine using the logical filename; if that fails it will
-     * attempt to resolve any symlinks and try again.  If that fails, and the output file exists
-     * but is neither a file or directory then VCF_STREAM is returned.
-     */
-    protected static OutputType determineOutputTypeFromFile(final File f) {
-        if (isBCF(f)) {
-            return OutputType.BCF;
-        } else if (isCompressedVCF(f)) {
-            return OutputType.BLOCK_COMPRESSED_VCF;
-        } else if (isVCF(f)) {
-            return OutputType.VCF;
-        }
-        else {
-            // See if we have a special file (device, named pipe, etc.)
-            final File canonical = new File(IOUtil.getFullCanonicalPath(f));
-            if (!canonical.equals(f)) {
-                return determineOutputTypeFromFile(canonical);
-            }
-            else if (f.exists() && !f.isFile() && !f.isDirectory()) {
-                return OutputType.VCF_STREAM;
-            } else {
-                return OutputType.UNSPECIFIED;
-            }
-        }
-    }
-
-    private static boolean isVCF(final File outFile) {
-        return outFile != null && outFile.getName().endsWith(".vcf");
-    }
-
-    private static boolean isBCF(final File outFile) {
-        return outFile != null && outFile.getName().endsWith(".bcf");
-    }
-
-    private static boolean isCompressedVCF(final File outFile) {
-        if (outFile == null)
-            return false;
-
-        return AbstractFeatureReader.hasBlockCompressedExtension(outFile);
-    }
-
-    private VariantContextWriter createVCFWriter(final File writerFile, final OutputStream writerStream) {
-        if (idxCreator == null) {
-            return new VCFWriter(writerFile, writerStream, refDict,
-                    options.contains(Options.INDEX_ON_THE_FLY),
-                    options.contains(Options.DO_NOT_WRITE_GENOTYPES),
-                    options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
-                    options.contains(Options.WRITE_FULL_FORMAT_FIELD));
-        }
-        else {
-            return new VCFWriter(writerFile, writerStream, refDict, idxCreator,
-                    options.contains(Options.INDEX_ON_THE_FLY),
-                    options.contains(Options.DO_NOT_WRITE_GENOTYPES),
-                    options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
-                    options.contains(Options.WRITE_FULL_FORMAT_FIELD));
-        }
-    }
-
-    private VariantContextWriter createBCFWriter(final File writerFile, final OutputStream writerStream) {
-        if (idxCreator == null) {
-            return new BCF2Writer(writerFile, writerStream, refDict,
-                    options.contains(Options.INDEX_ON_THE_FLY),
-                    options.contains(Options.DO_NOT_WRITE_GENOTYPES));
-        }
-        else {
-            return new BCF2Writer(writerFile, writerStream, refDict, idxCreator,
-                    options.contains(Options.INDEX_ON_THE_FLY),
-                    options.contains(Options.DO_NOT_WRITE_GENOTYPES));
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterFactory.java b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterFactory.java
deleted file mode 100644
index e1e0026..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterFactory.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.index.IndexCreator;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.index.tabix.TabixIndexCreator;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.util.EnumSet;
-
-/**
- * Factory methods to create VariantContext writers
- *
- * @author depristo
- * @since 5/12
- *
- * @deprecated Replaced by {@link VariantContextWriterBuilder}
- */
- at Deprecated
-public class VariantContextWriterFactory {
-
-    public static final EnumSet<Options> DEFAULT_OPTIONS = EnumSet.of(Options.INDEX_ON_THE_FLY);
-    public static final EnumSet<Options> NO_OPTIONS = EnumSet.noneOf(Options.class);
-
-    static {
-        if (Defaults.USE_ASYNC_IO_WRITE_FOR_TRIBBLE) {
-            DEFAULT_OPTIONS.add(Options.USE_ASYNC_IO);
-        }
-    }
-
-    private VariantContextWriterFactory() {}
-
-    public static VariantContextWriter create(final File location, final SAMSequenceDictionary refDict) {
-        return create(location, openOutputStream(location), refDict, DEFAULT_OPTIONS);
-    }
-
-    public static VariantContextWriter create(final File location, final SAMSequenceDictionary refDict, final EnumSet<Options> options) {
-        return create(location, openOutputStream(location), refDict, options);
-    }
-
-    /**
-     * @param output If buffered writing is desired, caller must provide some kind of buffered OutputStream.
-     */
-    public static VariantContextWriter create(final File location,
-                                              final OutputStream output,
-                                              final SAMSequenceDictionary refDict) {
-        return create(location, output, refDict, DEFAULT_OPTIONS);
-    }
-
-    /**
-     * @param output If buffered writing is desired, caller must provide some kind of buffered OutputStream.
-     */
-    public static VariantContextWriter create(final OutputStream output,
-                                              final SAMSequenceDictionary refDict,
-                                              final EnumSet<Options> options) {
-        return create(null, output, refDict, options);
-    }
-
-    /**
-     * @param location Note that this parameter is used to producing intelligent log messages, and for naming the index,
-     *                 but does not control where the file is written
-     * @param output This is where the BCF is actually written. If buffered writing is desired, caller must provide
-     *               some kind of buffered OutputStream.
-     */
-    public static VariantContextWriter createBcf2(final File location,
-                                                  final OutputStream output,
-                                                  final SAMSequenceDictionary refDict,
-                                                  final EnumSet<Options> options) {
-        return maybeWrapWithAsyncWriter(new BCF2Writer(location, output, refDict,
-                options.contains(Options.INDEX_ON_THE_FLY),
-                options.contains(Options.DO_NOT_WRITE_GENOTYPES)), options);
-    }
-
-    /**
-     * @param location Note that this parameter is used to producing intelligent log messages, and for naming the index,
-     *                 but does not control where the file is written
-     * @param output This is where the BCF is actually written.  If buffered writing is desired, caller must provide
-     *               some kind of buffered OutputStream.
-     */
-    public static VariantContextWriter createBcf2(final File location,
-                                                  final OutputStream output,
-                                                  final SAMSequenceDictionary refDict,
-                                                  final IndexCreator indexCreator,
-                                                  final EnumSet<Options> options) {
-        return maybeWrapWithAsyncWriter(new BCF2Writer(location, output, refDict, indexCreator,
-                options.contains(Options.INDEX_ON_THE_FLY),
-                options.contains(Options.DO_NOT_WRITE_GENOTYPES)), options);
-    }
-
-    /**
-     * @param location Note that this parameter is used to producing intelligent log messages, and for naming the index,
-     *                 but does not control where the file is written
-     * @param output This is where the VCF is actually written. If buffered writing is desired, caller must provide
-     *               some kind of buffered OutputStream.
-     */
-    public static VariantContextWriter createVcf(final File location,
-                                                 final OutputStream output,
-                                                 final SAMSequenceDictionary refDict,
-                                                 final EnumSet<Options> options) {
-        return maybeWrapWithAsyncWriter(new VCFWriter(location, output, refDict,
-                options.contains(Options.INDEX_ON_THE_FLY),
-                options.contains(Options.DO_NOT_WRITE_GENOTYPES),
-                options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
-                options.contains(Options.WRITE_FULL_FORMAT_FIELD)), options);
-    }
-
-    /**
-     * @param location Note that this parameter is used to producing intelligent log messages, and for naming the index,
-     *                 but does not control where the file is written
-     * @param output This is where the VCF is actually written.  If buffered writing is desired, caller must provide
-     *               some kind of buffered OutputStream.
-     */
-    public static VariantContextWriter createVcf(final File location,
-                                                 final OutputStream output,
-                                                 final SAMSequenceDictionary refDict,
-                                                 final IndexCreator indexCreator,
-                                                 final EnumSet<Options> options) {
-        return maybeWrapWithAsyncWriter(new VCFWriter(location, output, refDict, indexCreator,
-                options.contains(Options.INDEX_ON_THE_FLY),
-                options.contains(Options.DO_NOT_WRITE_GENOTYPES),
-                options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
-                options.contains(Options.WRITE_FULL_FORMAT_FIELD)), options);
-    }
-
-    /**
-     * @param location Note that this parameter is used to producing intelligent log messages,
-     *                 but does not control where the file is written
-     * @param output This is where the VCF is actually written.  If buffered writing is desired, caller must provide
-     *               some kind of buffered OutputStream.
-     */
-    public static VariantContextWriter createBlockCompressedVcf(final File location,
-                                                                final OutputStream output,
-                                                                final SAMSequenceDictionary refDict,
-                                                                final EnumSet<Options> options) {
-        final TabixIndexCreator indexCreator;
-        if (options.contains(Options.INDEX_ON_THE_FLY)) {
-            indexCreator = new TabixIndexCreator(refDict, TabixFormat.VCF);
-        } else {
-            indexCreator = null;
-        }
-        return maybeWrapWithAsyncWriter(new VCFWriter(location, BlockCompressedOutputStream.maybeBgzfWrapOutputStream(location, output),
-                refDict, indexCreator,
-                options.contains(Options.INDEX_ON_THE_FLY),
-                options.contains(Options.DO_NOT_WRITE_GENOTYPES),
-                options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
-                options.contains(Options.WRITE_FULL_FORMAT_FIELD)), options);
-    }
-
-    /**
-     * @param location Note that this parameter is used to producing intelligent log messages,
-     *                 but does not control where the file is written
-     * @param output This is where the VCF is actually written. If buffered writing is desired, caller must provide
-     *               some kind of buffered OutputStream.
-     */
-    public static VariantContextWriter createBlockCompressedVcf(final File location,
-                                                                final OutputStream output,
-                                                                final SAMSequenceDictionary refDict,
-                                                                final IndexCreator indexCreator,
-                                                                final EnumSet<Options> options) {
-        return maybeWrapWithAsyncWriter(new VCFWriter(location, BlockCompressedOutputStream.maybeBgzfWrapOutputStream(location, output),
-                refDict, indexCreator,
-                options.contains(Options.INDEX_ON_THE_FLY),
-                options.contains(Options.DO_NOT_WRITE_GENOTYPES),
-                options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
-                options.contains(Options.WRITE_FULL_FORMAT_FIELD)), options);
-    }
-
-    public static VariantContextWriter create(final File location,
-        final OutputStream output,
-        final SAMSequenceDictionary refDict,
-        final EnumSet<Options> options) {
-
-        if (isBCFOutput(location, options)) {
-            return createBcf2(location, output, refDict, options);
-        } else if (isCompressedVcf(location)) {
-            return createBlockCompressedVcf(location, output, refDict, options);
-        } else {
-            return createVcf(location, output, refDict, options);
-        }
-    }
-
-    /**
-     * @param output If buffered writing is desired, caller must provide some kind of buffered OutputStream.
-     */
-    public static VariantContextWriter create(final File location,
-                                              final OutputStream output,
-                                              final SAMSequenceDictionary refDict,
-                                              final IndexCreator indexCreator,
-                                              final EnumSet<Options> options) {
-
-        if (isBCFOutput(location, options)) {
-            return createBcf2(location, output, refDict, indexCreator, options);
-        } else if (isCompressedVcf(location)) {
-            return createBlockCompressedVcf(location, output, refDict, indexCreator, options);
-        } else {
-            return createVcf(location, output, refDict, indexCreator, options);
-        }
-    }
-
-    private static VariantContextWriter maybeWrapWithAsyncWriter(final VariantContextWriter writer,
-                                                                 final EnumSet<Options> options) {
-        if (options.contains(Options.USE_ASYNC_IO)) {
-            return new AsyncVariantContextWriter(writer, AsyncVariantContextWriter.DEFAULT_QUEUE_SIZE);
-        }
-        else return writer;
-    }
-
-    /**
-     * Should we output a BCF file based solely on the name of the file at location?
-     *
-     * @param location
-     * @return
-     */
-    public static boolean isBCFOutput(final File location) {
-        return isBCFOutput(location, EnumSet.noneOf(Options.class));
-    }
-
-    public static boolean isBCFOutput(final File location, final EnumSet<Options> options) {
-        return options.contains(Options.FORCE_BCF) || (location != null && location.getName().contains(".bcf"));
-    }
-
-    public static boolean isCompressedVcf(final File location) {
-        if (location == null)
-            return false;
-
-        return AbstractFeatureReader.hasBlockCompressedExtension(location);
-    }
-
-    public static VariantContextWriter sortOnTheFly(final VariantContextWriter innerWriter, final int maxCachingStartDistance) {
-        return sortOnTheFly(innerWriter, maxCachingStartDistance, false);
-    }
-
-    public static VariantContextWriter sortOnTheFly(final VariantContextWriter innerWriter, final int maxCachingStartDistance, final boolean takeOwnershipOfInner) {
-        return new SortingVariantContextWriter(innerWriter, maxCachingStartDistance, takeOwnershipOfInner);
-    }
-
-    /**
-     * Returns a output stream writing to location, or throws an exception if this fails
-     * @param location
-     * @return
-     */
-    protected static OutputStream openOutputStream(final File location) {
-        try {
-            return IOUtil.maybeBufferOutputStream(new FileOutputStream(location));
-        } catch (final FileNotFoundException e) {
-            throw new RuntimeIOException(location + ": Unable to create VCF writer", e);
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java b/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java
deleted file mode 100644
index 16857b4..0000000
--- a/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java
+++ /dev/null
@@ -1,791 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.tribble.AsciiFeatureCodec;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.NameAwareCodec;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.GenotypeLikelihoods;
-import htsjdk.variant.variantcontext.LazyGenotypesContext;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.zip.GZIPInputStream;
-
-
-public abstract class AbstractVCFCodec extends AsciiFeatureCodec<VariantContext> implements NameAwareCodec {
-    public final static int MAX_ALLELE_SIZE_BEFORE_WARNING = (int)Math.pow(2, 20);
-
-    protected final static int NUM_STANDARD_FIELDS = 8;  // INFO is the 8th column
-
-    // we have to store the list of strings that make up the header until they're needed
-    protected VCFHeader header = null;
-    protected VCFHeaderVersion version = null;
-
-    // a mapping of the allele
-    protected Map<String, List<Allele>> alleleMap = new HashMap<String, List<Allele>>(3);
-    
-    // for performance testing purposes
-    public static boolean validate = true;
-
-    // a key optimization -- we need a per thread string parts array, so we don't allocate a big array over and over
-    // todo: make this thread safe?
-    protected String[] parts = null;
-    protected String[] genotypeParts = null;
-    protected final String[] locParts = new String[6];
-
-    // for performance we cache the hashmap of filter encodings for quick lookup
-    protected HashMap<String,List<String>> filterHash = new HashMap<String,List<String>>();
-
-    // we store a name to give to each of the variant contexts we emit
-    protected String name = "Unknown";
-
-    protected int lineNo = 0;
-
-    protected Map<String, String> stringCache = new HashMap<String, String>();
-
-    protected boolean warnedAboutNoEqualsForNonFlag = false;
-
-    /**
-     * If true, then we'll magically fix up VCF headers on the fly when we read them in
-     */
-    protected boolean doOnTheFlyModifications = true;
-
-    /**
-     * If non-null, we will replace the sample name read from the VCF header with this sample name. This feature works
-     * only for single-sample VCFs.
-     */
-    protected String remappedSampleName = null;
-
-    protected AbstractVCFCodec() {
-        super(VariantContext.class);
-    }
-
-    /**
-     * Creates a LazyParser for a LazyGenotypesContext to use to decode
-     * our genotypes only when necessary.  We do this instead of eagarly
-     * decoding the genotypes just to turn around and reencode in the frequent
-     * case where we don't actually want to manipulate the genotypes
-     */
-    class LazyVCFGenotypesParser implements LazyGenotypesContext.LazyParser {
-        final List<Allele> alleles;
-        final String contig;
-        final int start;
-
-        LazyVCFGenotypesParser(final List<Allele> alleles, final String contig, final int start) {
-            this.alleles = alleles;
-            this.contig = contig;
-            this.start = start;
-        }
-
-        @Override
-        public LazyGenotypesContext.LazyData parse(final Object data) {
-            //System.out.printf("Loading genotypes... %s:%d%n", contig, start);
-            return createGenotypeMap((String) data, alleles, contig, start);
-        }
-    }
-
-    /**
-     * parse the filter string, first checking to see if we already have parsed it in a previous attempt
-     * @param filterString the string to parse
-     * @return a set of the filters applied
-     */
-    protected abstract List<String> parseFilters(String filterString);
-
-    /**
-     * create a VCF header from a set of header record lines
-     *
-     * @param headerStrings a list of strings that represent all the ## and # entries
-     * @return a VCFHeader object
-     */
-    protected VCFHeader parseHeaderFromLines( final List<String> headerStrings, final VCFHeaderVersion version ) {
-        this.version = version;
-
-        Set<VCFHeaderLine> metaData = new LinkedHashSet<VCFHeaderLine>();
-        Set<String> sampleNames = new LinkedHashSet<String>();
-        int contigCounter = 0;
-        // iterate over all the passed in strings
-        for ( String str : headerStrings ) {
-            if ( !str.startsWith(VCFHeader.METADATA_INDICATOR) ) {
-                String[] strings = str.substring(1).split(VCFConstants.FIELD_SEPARATOR);
-                if ( strings.length < VCFHeader.HEADER_FIELDS.values().length )
-                    throw new TribbleException.InvalidHeader("there are not enough columns present in the header line: " + str);
-
-                int arrayIndex = 0;
-                for (VCFHeader.HEADER_FIELDS field : VCFHeader.HEADER_FIELDS.values()) {
-                    try {
-                        if (field != VCFHeader.HEADER_FIELDS.valueOf(strings[arrayIndex]))
-                            throw new TribbleException.InvalidHeader("we were expecting column name '" + field + "' but we saw '" + strings[arrayIndex] + "'");
-                    } catch (IllegalArgumentException e) {
-                        throw new TribbleException.InvalidHeader("unknown column name '" + strings[arrayIndex] + "'; it does not match a legal column header name.");
-                    }
-                    arrayIndex++;
-                }
-
-                boolean sawFormatTag = false;
-                if ( arrayIndex < strings.length ) {
-                    if ( !strings[arrayIndex].equals("FORMAT") )
-                        throw new TribbleException.InvalidHeader("we were expecting column name 'FORMAT' but we saw '" + strings[arrayIndex] + "'");
-                    sawFormatTag = true;
-                    arrayIndex++;
-                }
-
-                while ( arrayIndex < strings.length )
-                    sampleNames.add(strings[arrayIndex++]);
-
-                if ( sawFormatTag && sampleNames.isEmpty())
-                    throw new TribbleException.InvalidHeader("The FORMAT field was provided but there is no genotype/sample data");
-
-                // If we're performing sample name remapping and there is exactly one sample specified in the header, replace
-                // it with the remappedSampleName. Throw an error if there are 0 or multiple samples and remapping was requested
-                // for this file.
-                if ( remappedSampleName != null ) {
-                    // We currently only support on-the-fly sample name remapping for single-sample VCFs
-                    if ( sampleNames.isEmpty() || sampleNames.size() > 1 ) {
-                        throw new TribbleException(String.format("Cannot remap sample name to %s because %s samples are specified in the VCF header, and on-the-fly sample name remapping is only supported for single-sample VCFs",
-                                                                 remappedSampleName, sampleNames.isEmpty() ? "no" : "multiple"));
-                    }
-
-                    sampleNames.clear();
-                    sampleNames.add(remappedSampleName);
-                }
-
-            } else {
-                if ( str.startsWith(VCFConstants.INFO_HEADER_START) ) {
-                    final VCFInfoHeaderLine info = new VCFInfoHeaderLine(str.substring(7), version);
-                    metaData.add(info);
-                } else if ( str.startsWith(VCFConstants.FILTER_HEADER_START) ) {
-                    final VCFFilterHeaderLine filter = new VCFFilterHeaderLine(str.substring(9), version);
-                    metaData.add(filter);
-                } else if ( str.startsWith(VCFConstants.FORMAT_HEADER_START) ) {
-                    final VCFFormatHeaderLine format = new VCFFormatHeaderLine(str.substring(9), version);
-                    metaData.add(format);
-                } else if ( str.startsWith(VCFConstants.CONTIG_HEADER_START) ) {
-                    final VCFContigHeaderLine contig = new VCFContigHeaderLine(str.substring(9), version, VCFConstants.CONTIG_HEADER_START.substring(2), contigCounter++);
-                    metaData.add(contig);
-                } else if ( str.startsWith(VCFConstants.ALT_HEADER_START) ) {
-                    final VCFSimpleHeaderLine alt = new VCFSimpleHeaderLine(str.substring(6), version, VCFConstants.ALT_HEADER_START.substring(2), Arrays.asList("ID", "Description"));
-                    metaData.add(alt);
-                } else {
-                    int equals = str.indexOf('=');
-                    if ( equals != -1 )
-                        metaData.add(new VCFHeaderLine(str.substring(2, equals), str.substring(equals+1)));
-                }
-            }
-        }
-
-        this.header = new VCFHeader(metaData, sampleNames);
-        if ( doOnTheFlyModifications )
-            this.header = VCFStandardHeaderLines.repairStandardHeaderLines(this.header);
-        return this.header;
-    }
-
-	/**
-	 * Explicitly set the VCFHeader on this codec. This will overwrite the header read from the file
-	 * and the version state stored in this instance; conversely, reading the header from a file will
-	 * overwrite whatever is set here. The returned header may not be identical to the header argument
-	 * since the header lines may be "repaired" (i.e., rewritten) if doOnTheFlyModifications is set.
-	 */
-	public VCFHeader setVCFHeader(final VCFHeader header, final VCFHeaderVersion version) {
-		this.version = version;
-
-		if (this.doOnTheFlyModifications) this.header = VCFStandardHeaderLines.repairStandardHeaderLines(header);
-		else this.header = header;
-
-		return this.header;
-	}
-
-    /**
-     * the fast decode function
-     * @param line the line of text for the record
-     * @return a feature, (not guaranteed complete) that has the correct start and stop
-     */
-    public Feature decodeLoc(String line) {
-        return decodeLine(line, false);
-    }
-
-    /**
-     * decode the line into a feature (VariantContext)
-     * @param line the line
-     * @return a VariantContext
-     */
-    public VariantContext decode(String line) {
-        return decodeLine(line, true);
-    }
-
-    private VariantContext decodeLine(final String line, final boolean includeGenotypes) {
-        // the same line reader is not used for parsing the header and parsing lines, if we see a #, we've seen a header line
-        if (line.startsWith(VCFHeader.HEADER_INDICATOR)) return null;
-
-        // our header cannot be null, we need the genotype sample names and counts
-        if (header == null) throw new TribbleException("VCF Header cannot be null when decoding a record");
-
-        if (parts == null)
-            parts = new String[Math.min(header.getColumnCount(), NUM_STANDARD_FIELDS+1)];
-
-        final int nParts = ParsingUtils.split(line, parts, VCFConstants.FIELD_SEPARATOR_CHAR, true);
-
-        // if we have don't have a header, or we have a header with no genotyping data check that we
-        // have eight columns.  Otherwise check that we have nine (normal columns + genotyping data)
-        if (( (header == null || !header.hasGenotypingData()) && nParts != NUM_STANDARD_FIELDS) ||
-                (header != null && header.hasGenotypingData() && nParts != (NUM_STANDARD_FIELDS + 1)) )
-            throw new TribbleException("Line " + lineNo + ": there aren't enough columns for line " + line + " (we expected " + (header == null ? NUM_STANDARD_FIELDS : NUM_STANDARD_FIELDS + 1) +
-                    " tokens, and saw " + nParts + " )");
-
-        return parseVCFLine(parts, includeGenotypes);
-    }
-
-    /**
-     * parse out the VCF line
-     *
-     * @param parts the parts split up
-     * @return a variant context object
-     */
-    private VariantContext parseVCFLine(final String[] parts, final boolean includeGenotypes) {
-        VariantContextBuilder builder = new VariantContextBuilder();
-        builder.source(getName());
-
-        // increment the line count
-        // TODO -- because of the way the engine utilizes Tribble, we can parse a line multiple times (especially when
-        // TODO --   the first record is far along the contig) and the line counter can get out of sync
-        lineNo++;
-
-        // parse out the required fields
-        final String chr = getCachedString(parts[0]);
-        builder.chr(chr);
-        int pos = -1;
-        try {
-            pos = Integer.valueOf(parts[1]);
-        } catch (NumberFormatException e) {
-            generateException(parts[1] + " is not a valid start position in the VCF format");
-        }
-        builder.start(pos);
-
-        if ( parts[2].isEmpty() )
-            generateException("The VCF specification requires a valid ID field");
-        else if ( parts[2].equals(VCFConstants.EMPTY_ID_FIELD) )
-            builder.noID();
-        else
-            builder.id(parts[2]);
-
-        final String ref = getCachedString(parts[3].toUpperCase());
-        final String alts = getCachedString(parts[4]);
-        builder.log10PError(parseQual(parts[5]));
-
-        final List<String> filters = parseFilters(getCachedString(parts[6]));
-        if ( filters != null ) builder.filters(new HashSet<String>(filters));
-        final Map<String, Object> attrs = parseInfo(parts[7]);
-        builder.attributes(attrs);
-
-        if ( attrs.containsKey(VCFConstants.END_KEY) ) {
-            // update stop with the end key if provided
-            try {
-                builder.stop(Integer.valueOf(attrs.get(VCFConstants.END_KEY).toString()));
-            } catch (Exception e) {
-                generateException("the END value in the INFO field is not valid");
-            }
-        } else {
-            builder.stop(pos + ref.length() - 1);
-        }
-
-        // get our alleles, filters, and setup an attribute map
-        final List<Allele> alleles = parseAlleles(ref, alts, lineNo);
-        builder.alleles(alleles);
-
-        // do we have genotyping data
-        if (parts.length > NUM_STANDARD_FIELDS && includeGenotypes) {
-            final LazyGenotypesContext.LazyParser lazyParser = new LazyVCFGenotypesParser(alleles, chr, pos);
-            final int nGenotypes = header.getNGenotypeSamples();
-            LazyGenotypesContext lazy = new LazyGenotypesContext(lazyParser, parts[8], nGenotypes);
-
-            // did we resort the sample names?  If so, we need to load the genotype data
-            if ( !header.samplesWereAlreadySorted() )
-                lazy.decode();
-
-            builder.genotypesNoValidation(lazy);
-        }
-
-        VariantContext vc = null;
-        try {
-            vc = builder.make();
-        } catch (Exception e) {
-            generateException(e.getMessage());
-        }
-
-        return vc;
-    }
-
-    /**
-     * get the name of this codec
-     * @return our set name
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * set the name of this codec
-     * @param name new name
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    /**
-     * Return a cached copy of the supplied string.
-     *
-     * @param str string
-     * @return interned string
-     */
-    protected String getCachedString(String str) {
-        String internedString = stringCache.get(str);
-        if ( internedString == null ) {
-            internedString = new String(str);
-            stringCache.put(internedString, internedString);
-        }
-        return internedString;
-    }
-
-    /**
-     * parse out the info fields
-     * @param infoField the fields
-     * @return a mapping of keys to objects
-     */
-    private Map<String, Object> parseInfo(String infoField) {
-        Map<String, Object> attributes = new HashMap<String, Object>();
-
-        if ( infoField.isEmpty() )
-            generateException("The VCF specification requires a valid (non-zero length) info field");
-
-        if ( !infoField.equals(VCFConstants.EMPTY_INFO_FIELD) ) {
-            if ( infoField.indexOf('\t') != -1 || infoField.indexOf(' ') != -1 )
-                generateException("The VCF specification does not allow for whitespace in the INFO field. Offending field value was \"" + infoField + "\"");
-
-            List<String> infoFields = ParsingUtils.split(infoField, VCFConstants.INFO_FIELD_SEPARATOR_CHAR);
-            for (int i = 0; i < infoFields.size(); i++) {
-                String key;
-                Object value;
-
-                int eqI = infoFields.get(i).indexOf("=");
-                if ( eqI != -1 ) {
-                    key = infoFields.get(i).substring(0, eqI);
-                    String valueString = infoFields.get(i).substring(eqI + 1);
-
-                    // split on the INFO field separator
-                    List<String> infoValueSplit = ParsingUtils.split(valueString, VCFConstants.INFO_FIELD_ARRAY_SEPARATOR_CHAR);
-                    if ( infoValueSplit.size() == 1 ) {
-                        value = infoValueSplit.get(0);
-                        final VCFInfoHeaderLine headerLine = header.getInfoHeaderLine(key);
-                        if ( headerLine != null && headerLine.getType() == VCFHeaderLineType.Flag && value.equals("0") ) {
-                            // deal with the case where a flag field has =0, such as DB=0, by skipping the add
-                            continue;
-                        }
-                    } else {
-                        value = infoValueSplit;
-                    }
-                } else {
-                    key = infoFields.get(i);
-                    final VCFInfoHeaderLine headerLine = header.getInfoHeaderLine(key);
-                    if ( headerLine != null && headerLine.getType() != VCFHeaderLineType.Flag ) {
-                        if ( GeneralUtils.DEBUG_MODE_ENABLED && ! warnedAboutNoEqualsForNonFlag ) {
-                            System.err.println("Found info key " + key + " without a = value, but the header says the field is of type "
-                                               + headerLine.getType() + " but this construct is only value for FLAG type fields");
-                            warnedAboutNoEqualsForNonFlag = true;
-                        }
-
-                        value = VCFConstants.MISSING_VALUE_v4;
-                    } else {
-                        value = true;
-                    }
-                }
-
-                // this line ensures that key/value pairs that look like key=; are parsed correctly as MISSING
-                if ( "".equals(value) ) value = VCFConstants.MISSING_VALUE_v4;
-
-                attributes.put(key, value);
-            }
-        }
-
-        return attributes;
-    }
-
-    /**
-     * create a an allele from an index and an array of alleles
-     * @param index the index
-     * @param alleles the alleles
-     * @return an Allele
-     */
-    protected static Allele oneAllele(String index, List<Allele> alleles) {
-        if ( index.equals(VCFConstants.EMPTY_ALLELE) )
-            return Allele.NO_CALL;
-        final int i;
-        try {
-            i = Integer.valueOf(index);
-        } catch ( NumberFormatException e ) {
-            throw new TribbleException.InternalCodecException("The following invalid GT allele index was encountered in the file: " + index);
-        }
-        if ( i >= alleles.size() )
-            throw new TribbleException.InternalCodecException("The allele with index " + index + " is not defined in the REF/ALT columns in the record");
-        return alleles.get(i);
-    }
-
-
-    /**
-     * parse genotype alleles from the genotype string
-     * @param GT         GT string
-     * @param alleles    list of possible alleles
-     * @param cache      cache of alleles for GT
-     * @return the allele list for the GT string
-     */
-    protected static List<Allele> parseGenotypeAlleles(String GT, List<Allele> alleles, Map<String, List<Allele>> cache) {
-        // cache results [since they are immutable] and return a single object for each genotype
-        List<Allele> GTAlleles = cache.get(GT);
-
-        if ( GTAlleles == null ) {
-            StringTokenizer st = new StringTokenizer(GT, VCFConstants.PHASING_TOKENS);
-            GTAlleles = new ArrayList<Allele>(st.countTokens());
-            while ( st.hasMoreTokens() ) {
-                String genotype = st.nextToken();
-                GTAlleles.add(oneAllele(genotype, alleles));
-            }
-            cache.put(GT, GTAlleles);
-        }
-
-        return GTAlleles;
-    }
-
-    /**
-     * parse out the qual value
-     * @param qualString the quality string
-     * @return return a double
-     */
-    protected static Double parseQual(String qualString) {
-        // if we're the VCF 4 missing char, return immediately
-        if ( qualString.equals(VCFConstants.MISSING_VALUE_v4))
-            return VariantContext.NO_LOG10_PERROR;
-
-        Double val = Double.valueOf(qualString);
-
-        // check to see if they encoded the missing qual score in VCF 3 style, with either the -1 or -1.0.  check for val < 0 to save some CPU cycles
-        if ((val < 0) && (Math.abs(val - VCFConstants.MISSING_QUALITY_v3_DOUBLE) < VCFConstants.VCF_ENCODING_EPSILON))
-            return VariantContext.NO_LOG10_PERROR;
-
-        // scale and return the value
-        return val / -10.0;
-    }
-
-    /**
-     * parse out the alleles
-     * @param ref the reference base
-     * @param alts a string of alternates to break into alleles
-     * @param lineNo  the line number for this record
-     * @return a list of alleles, and a pair of the shortest and longest sequence
-     */
-    protected static List<Allele> parseAlleles(String ref, String alts, int lineNo) {
-        List<Allele> alleles = new ArrayList<Allele>(2); // we are almost always biallelic
-        // ref
-        checkAllele(ref, true, lineNo);
-        Allele refAllele = Allele.create(ref, true);
-        alleles.add(refAllele);
-
-        if ( alts.indexOf(',') == -1 ) // only 1 alternatives, don't call string split
-            parseSingleAltAllele(alleles, alts, lineNo);
-        else
-            for ( String alt : alts.split(",") )
-                parseSingleAltAllele(alleles, alt, lineNo);
-
-        return alleles;
-    }
-
-    /**
-     * check to make sure the allele is an acceptable allele
-     * @param allele the allele to check
-     * @param isRef are we the reference allele?
-     * @param lineNo  the line number for this record
-     */
-    private static void checkAllele(String allele, boolean isRef, int lineNo) {
-        if ( allele == null || allele.isEmpty() )
-            generateException(generateExceptionTextForBadAlleleBases(""), lineNo);
-
-        if ( GeneralUtils.DEBUG_MODE_ENABLED && MAX_ALLELE_SIZE_BEFORE_WARNING != -1 && allele.length() > MAX_ALLELE_SIZE_BEFORE_WARNING ) {
-            System.err.println(String.format("Allele detected with length %d exceeding max size %d at approximately line %d, likely resulting in degraded VCF processing performance", allele.length(), MAX_ALLELE_SIZE_BEFORE_WARNING, lineNo));
-        }
-
-        if ( isSymbolicAllele(allele) ) {
-            if ( isRef ) {
-                generateException("Symbolic alleles not allowed as reference allele: " + allele, lineNo);
-            }
-        } else {
-            // check for VCF3 insertions or deletions
-            if ( (allele.charAt(0) == VCFConstants.DELETION_ALLELE_v3) || (allele.charAt(0) == VCFConstants.INSERTION_ALLELE_v3) )
-                generateException("Insertions/Deletions are not supported when reading 3.x VCF's. Please" +
-                        " convert your file to VCF4 using VCFTools, available at http://vcftools.sourceforge.net/index.html", lineNo);
-
-            if (!Allele.acceptableAlleleBases(allele, isRef))
-                generateException(generateExceptionTextForBadAlleleBases(allele), lineNo);
-
-            if ( isRef && allele.equals(VCFConstants.EMPTY_ALLELE) )
-                generateException("The reference allele cannot be missing", lineNo);
-        }
-    }
-
-    /**
-     * Generates the exception text for the case where the allele string contains unacceptable bases.
-     *
-     * @param allele   non-null allele string
-     * @return non-null exception text string
-     */
-    private static String generateExceptionTextForBadAlleleBases(final String allele) {
-        if ( allele.isEmpty() )
-            return "empty alleles are not permitted in VCF records";
-        if ( allele.contains("[") || allele.contains("]") || allele.contains(":") || allele.contains(".") )
-            return "VCF support for complex rearrangements with breakends has not yet been implemented";
-        return "unparsable vcf record with allele " + allele;
-    }
-
-    /**
-     * return true if this is a symbolic allele (e.g. <SOMETAG>) or
-     * structural variation breakend (with [ or ]), otherwise false
-     * @param allele the allele to check
-     * @return true if the allele is a symbolic allele, otherwise false
-     */
-    private static boolean isSymbolicAllele(String allele) {
-        return (allele != null && allele.length() > 2 &&
-                ((allele.startsWith("<") && allele.endsWith(">")) ||
-                        (allele.contains("[") || allele.contains("]"))));
-    }
-
-    /**
-     * parse a single allele, given the allele list
-     * @param alleles the alleles available
-     * @param alt the allele to parse
-     * @param lineNo  the line number for this record
-     */
-    private static void parseSingleAltAllele(List<Allele> alleles, String alt, int lineNo) {
-        checkAllele(alt, false, lineNo);
-
-        Allele allele = Allele.create(alt, false);
-        if ( ! allele.isNoCall() )
-            alleles.add(allele);
-    }
-
-    public static boolean canDecodeFile(final String potentialInput, final String MAGIC_HEADER_LINE) {
-        try {
-            //isVCFStream closes the stream that's passed in
-            return isVCFStream(new FileInputStream(potentialInput), MAGIC_HEADER_LINE) ||
-                    isVCFStream(new GZIPInputStream(new FileInputStream(potentialInput)), MAGIC_HEADER_LINE) ||
-                    isVCFStream(new BlockCompressedInputStream(new FileInputStream(potentialInput)), MAGIC_HEADER_LINE);
-        } catch ( FileNotFoundException e ) {
-            return false;
-        } catch ( IOException e ) {
-            return false;
-        }
-    }
-
-    private static boolean isVCFStream(final InputStream stream, final String MAGIC_HEADER_LINE) {
-        try {
-            byte[] buff = new byte[MAGIC_HEADER_LINE.length()];
-            int nread = stream.read(buff, 0, MAGIC_HEADER_LINE.length());
-            boolean eq = Arrays.equals(buff, MAGIC_HEADER_LINE.getBytes());
-            return eq;
-        } catch ( IOException e ) {
-            return false;
-        } catch ( RuntimeException e ) {
-            return false;
-        } finally {
-            try { stream.close(); } catch ( IOException e ) {}
-        }
-    }
-
-
-    /**
-     * create a genotype map
-     *
-     * @param str the string
-     * @param alleles the list of alleles
-     * @return a mapping of sample name to genotype object
-     */
-    public LazyGenotypesContext.LazyData createGenotypeMap(final String str,
-                                                              final List<Allele> alleles,
-                                                              final String chr,
-                                                              final int pos) {
-        if (genotypeParts == null)
-            genotypeParts = new String[header.getColumnCount() - NUM_STANDARD_FIELDS];
-
-        int nParts = ParsingUtils.split(str, genotypeParts, VCFConstants.FIELD_SEPARATOR_CHAR);
-        if ( nParts != genotypeParts.length )
-            generateException("there are " + (nParts-1) + " genotypes while the header requires that " + (genotypeParts.length-1) + " genotypes be present for all records at " + chr + ":" + pos, lineNo);
-
-        ArrayList<Genotype> genotypes = new ArrayList<Genotype>(nParts);
-
-        // get the format keys
-        List<String> genotypeKeys = ParsingUtils.split(genotypeParts[0], VCFConstants.GENOTYPE_FIELD_SEPARATOR_CHAR);
-
-        // cycle through the sample names
-        Iterator<String> sampleNameIterator = header.getGenotypeSamples().iterator();
-
-        // clear out our allele mapping
-        alleleMap.clear();
-
-        // cycle through the genotype strings
-        for (int genotypeOffset = 1; genotypeOffset < nParts; genotypeOffset++) {
-            List<String> genotypeValues = ParsingUtils.split(genotypeParts[genotypeOffset], VCFConstants.GENOTYPE_FIELD_SEPARATOR_CHAR);
-
-            final String sampleName = sampleNameIterator.next();
-            final GenotypeBuilder gb = new GenotypeBuilder(sampleName);
-
-            // check to see if the value list is longer than the key list, which is a problem
-            if (genotypeKeys.size() < genotypeValues.size())
-                generateException("There are too many keys for the sample " + sampleName + ", keys = " + parts[8] + ", values = " + parts[genotypeOffset]);
-
-            int genotypeAlleleLocation = -1;
-            if (!genotypeKeys.isEmpty()) {
-                gb.maxAttributes(genotypeKeys.size() - 1);
-
-                for (int i = 0; i < genotypeKeys.size(); i++) {
-                    final String gtKey = genotypeKeys.get(i);
-                    boolean missing = i >= genotypeValues.size();
-
-                    // todo -- all of these on the fly parsing of the missing value should be static constants
-                    if (gtKey.equals(VCFConstants.GENOTYPE_KEY)) {
-                        genotypeAlleleLocation = i;
-                    } else if ( missing ) {
-                        // if its truly missing (there no provided value) skip adding it to the attributes
-                    } else if (gtKey.equals(VCFConstants.GENOTYPE_FILTER_KEY)) {
-                        final List<String> filters = parseFilters(getCachedString(genotypeValues.get(i)));
-                        if ( filters != null ) gb.filters(filters);
-                    } else if ( genotypeValues.get(i).equals(VCFConstants.MISSING_VALUE_v4) ) {
-                        // don't add missing values to the map
-                    } else {
-                        if (gtKey.equals(VCFConstants.GENOTYPE_QUALITY_KEY)) {
-                            if ( genotypeValues.get(i).equals(VCFConstants.MISSING_GENOTYPE_QUALITY_v3) )
-                                gb.noGQ();
-                            else
-                                gb.GQ((int)Math.round(Double.valueOf(genotypeValues.get(i))));
-                        } else if (gtKey.equals(VCFConstants.GENOTYPE_ALLELE_DEPTHS)) {
-                            gb.AD(decodeInts(genotypeValues.get(i)));
-                        } else if (gtKey.equals(VCFConstants.GENOTYPE_PL_KEY)) {
-                            gb.PL(decodeInts(genotypeValues.get(i)));
-                        } else if (gtKey.equals(VCFConstants.GENOTYPE_LIKELIHOODS_KEY)) {
-                            gb.PL(GenotypeLikelihoods.fromGLField(genotypeValues.get(i)).getAsPLs());
-                        } else if (gtKey.equals(VCFConstants.DEPTH_KEY)) {
-                            gb.DP(Integer.valueOf(genotypeValues.get(i)));
-                        } else {
-                            gb.attribute(gtKey, genotypeValues.get(i));
-                        }
-                    }
-                }
-            }
-
-            // check to make sure we found a genotype field if our version is less than 4.1 file
-            if ( ! version.isAtLeastAsRecentAs(VCFHeaderVersion.VCF4_1) && genotypeAlleleLocation == -1 )
-                generateException("Unable to find the GT field for the record; the GT field is required before VCF4.1");
-            if ( genotypeAlleleLocation > 0 )
-                generateException("Saw GT field at position " + genotypeAlleleLocation + ", but it must be at the first position for genotypes when present");
-
-            final List<Allele> GTalleles = (genotypeAlleleLocation == -1 ? new ArrayList<Allele>(0) : parseGenotypeAlleles(genotypeValues.get(genotypeAlleleLocation), alleles, alleleMap));
-            gb.alleles(GTalleles);
-            gb.phased(genotypeAlleleLocation != -1 && genotypeValues.get(genotypeAlleleLocation).indexOf(VCFConstants.PHASED) != -1);
-
-            // add it to the list
-            try {
-                genotypes.add(gb.make());
-            } catch (TribbleException e) {
-                throw new TribbleException.InternalCodecException(e.getMessage() + ", at position " + chr+":"+pos);
-            }
-        }
-
-        return new LazyGenotypesContext.LazyData(genotypes, header.getSampleNamesInOrder(), header.getSampleNameToOffset());
-    }
-
-    private static final int[] decodeInts(final String string) {
-        List<String> split = ParsingUtils.split(string, ',');
-        int [] values = new int[split.size()];
-        try {
-            for (int i = 0; i < values.length; i++) {
-                values[i] = Integer.parseInt(split.get(i));
-            }
-        } catch (final NumberFormatException e) {
-            return null;
-        }
-        return values;
-    }
-
-    /**
-     * Forces all VCFCodecs to not perform any on the fly modifications to the VCF header
-     * of VCF records.  Useful primarily for raw comparisons such as when comparing
-     * raw VCF records
-     */
-    public final void disableOnTheFlyModifications() {
-        doOnTheFlyModifications = false;
-    }
-
-    /**
-     * Replaces the sample name read from the VCF header with the remappedSampleName. Works
-     * only for single-sample VCFs -- attempting to perform sample name remapping for multi-sample
-     * VCFs will produce an Exception.
-     *
-     * @param remappedSampleName replacement sample name for the sample specified in the VCF header
-     */
-    public void setRemappedSampleName( final String remappedSampleName ) {
-        this.remappedSampleName = remappedSampleName;
-    }
-
-    protected void generateException(String message) {
-        throw new TribbleException(String.format("The provided VCF file is malformed at approximately line number %d: %s", lineNo, message));
-    }
-
-    protected static void generateException(String message, int lineNo) {
-        throw new TribbleException(String.format("The provided VCF file is malformed at approximately line number %d: %s", lineNo, message));
-    }
-
-    @Override
-    public TabixFormat getTabixFormat() {
-        return TabixFormat.VCF;
-    }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCF3Codec.java b/src/main/java/htsjdk/variant/vcf/VCF3Codec.java
deleted file mode 100644
index 5f4f48e..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCF3Codec.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.readers.LineIterator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-
-/**
- * A feature codec for the VCF3 specification, to read older VCF files.  VCF3 has been
- * depreciated in favor of VCF4 (See VCF codec for the latest information)
- *
- * <p>
- * Reads historical VCF3 encoded files (1000 Genomes Pilot results, for example)
- * </p>
- *
- * <p>
- * See also: @see <a href="http://vcftools.sourceforge.net/specs.html">VCF specification</a><br>
- * See also: @see <a href="http://www.ncbi.nlm.nih.gov/pubmed/21653522">VCF spec. publication</a>
- * </p>
- *
- * @author Mark DePristo
- * @since 2010
- */
-public class VCF3Codec extends AbstractVCFCodec {
-    public final static String VCF3_MAGIC_HEADER = "##fileformat=VCFv3";
-
-    /**
-     * @param reader the line reader to take header lines from
-     * @return the number of header lines
-     */
-    public Object readActualHeader(final LineIterator reader) {
-        final List<String> headerStrings = new ArrayList<String>();
-
-        VCFHeaderVersion version = null;
-        boolean foundHeaderVersion = false;
-        while (reader.hasNext()) {
-            lineNo++;
-            final String line = reader.peek();
-            if (line.startsWith(VCFHeader.METADATA_INDICATOR)) {
-                final String[] lineFields = line.substring(2).split("=");
-                if (lineFields.length == 2 && VCFHeaderVersion.isFormatString(lineFields[0]) ) {
-                    if ( !VCFHeaderVersion.isVersionString(lineFields[1]) )
-                        throw new TribbleException.InvalidHeader(lineFields[1] + " is not a supported version");
-                    foundHeaderVersion = true;
-                    version = VCFHeaderVersion.toHeaderVersion(lineFields[1]);
-                    if ( version != VCFHeaderVersion.VCF3_3 && version != VCFHeaderVersion.VCF3_2 )
-                        throw new TribbleException.InvalidHeader("This codec is strictly for VCFv3 and does not support " + lineFields[1]);
-                }
-                headerStrings.add(reader.next());
-            }
-            else if (line.startsWith(VCFHeader.HEADER_INDICATOR)) {
-                if (!foundHeaderVersion) {
-                    throw new TribbleException.InvalidHeader("We never saw a header line specifying VCF version");
-                }
-                headerStrings.add(reader.next());
-                return super.parseHeaderFromLines(headerStrings, version);
-            }
-            else {
-                throw new TribbleException.InvalidHeader("We never saw the required CHROM header line (starting with one #) for the input VCF file");
-            }
-
-        }
-        throw new TribbleException.InvalidHeader("We never saw the required CHROM header line (starting with one #) for the input VCF file");
-    }
-
-
-    /**
-     * parse the filter string, first checking to see if we already have parsed it in a previous attempt
-     * @param filterString the string to parse
-     * @return a set of the filters applied
-     */
-    protected List<String> parseFilters(String filterString) {
-
-        // null for unfiltered
-        if ( filterString.equals(VCFConstants.UNFILTERED) )
-            return null;
-
-        // empty set for passes filters
-        List<String> fFields = new ArrayList<String>();
-
-        if ( filterString.equals(VCFConstants.PASSES_FILTERS_v3) )
-            return new ArrayList<String>(fFields);
-
-        if (filterString.isEmpty())
-            generateException("The VCF specification requires a valid filter status");
-
-        // do we have the filter string cached?
-        if ( filterHash.containsKey(filterString) )
-            return new ArrayList<String>(filterHash.get(filterString));
-
-        // otherwise we have to parse and cache the value
-        if ( filterString.indexOf(VCFConstants.FILTER_CODE_SEPARATOR) == -1 )
-            fFields.add(filterString);
-        else
-            fFields.addAll(Arrays.asList(filterString.split(VCFConstants.FILTER_CODE_SEPARATOR)));
-
-        filterHash.put(filterString, fFields);
-
-        return fFields;
-    }
-
-    @Override
-    public boolean canDecode(final String potentialInput) {
-        return canDecodeFile(potentialInput, VCF3_MAGIC_HEADER);
-    }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFCodec.java b/src/main/java/htsjdk/variant/vcf/VCFCodec.java
deleted file mode 100644
index 89d6881..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFCodec.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.readers.LineIterator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * A feature codec for the VCF 4 specification
- *
- * <p>
- * VCF is a text file format (most likely stored in a compressed manner). It contains meta-information lines, a
- * header line, and then data lines each containing information about a position in the genome.
- * </p>
- * <p>One of the main uses of next-generation sequencing is to discover variation amongst large populations
- * of related samples. Recently the format for storing next-generation read alignments has been
- * standardised by the SAM/BAM file format specification. This has significantly improved the
- * interoperability of next-generation tools for alignment, visualisation, and variant calling.
- * We propose the Variant Call Format (VCF) as a standarised format for storing the most prevalent
- * types of sequence variation, including SNPs, indels and larger structural variants, together
- * with rich annotations. VCF is usually stored in a compressed manner and can be indexed for
- * fast data retrieval of variants from a range of positions on the reference genome.
- * The format was developed for the 1000 Genomes Project, and has also been adopted by other projects
- * such as UK10K, dbSNP, or the NHLBI Exome Project. VCFtools is a software suite that implements
- * various utilities for processing VCF files, including validation, merging and comparing,
- * and also provides a general Perl and Python API.
- * The VCF specification and VCFtools are available from http://vcftools.sourceforge.net.</p>
- *
- * <p>
- * See also: @see <a href="http://vcftools.sourceforge.net/specs.html">VCF specification</a><br>
- * See also: @see <a href="http://www.ncbi.nlm.nih.gov/pubmed/21653522">VCF spec. publication</a>
- * </p>
- *
- * <h2>File format example</h2>
- * <pre>
- *     ##fileformat=VCFv4.0
- *     #CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  NA12878
- *     chr1    109     .       A       T       0       PASS  AC=1    GT:AD:DP:GL:GQ  0/1:610,327:308:-316.30,-95.47,-803.03:99
- *     chr1    147     .       C       A       0       PASS  AC=1    GT:AD:DP:GL:GQ  0/1:294,49:118:-57.87,-34.96,-338.46:99
- * </pre>
- *
- * @author Mark DePristo
- * @since 2010
- */
-public class VCFCodec extends AbstractVCFCodec {
-    // Our aim is to read in the records and convert to VariantContext as quickly as possible, relying on VariantContext to do the validation of any contradictory (or malformed) record parameters.
-    public final static String VCF4_MAGIC_HEADER = "##fileformat=VCFv4";
-
-    /**
-     * Reads all of the header from the provided iterator, but no reads no further.
-     * @param lineIterator the line reader to take header lines from
-     * @return The parsed header
-     */
-    @Override
-    public Object readActualHeader(final LineIterator lineIterator) {
-        final List<String> headerStrings = new ArrayList<String>();
-
-        String line;
-        boolean foundHeaderVersion = false;
-        while (lineIterator.hasNext()) {
-            line = lineIterator.peek();
-            lineNo++;
-            if (line.startsWith(VCFHeader.METADATA_INDICATOR)) {
-                final String[] lineFields = line.substring(2).split("=");
-                if (lineFields.length == 2 && VCFHeaderVersion.isFormatString(lineFields[0]) ) {
-                    if ( !VCFHeaderVersion.isVersionString(lineFields[1]) )
-                        throw new TribbleException.InvalidHeader(lineFields[1] + " is not a supported version");
-                    foundHeaderVersion = true;
-                    version = VCFHeaderVersion.toHeaderVersion(lineFields[1]);
-                    if ( ! version.isAtLeastAsRecentAs(VCFHeaderVersion.VCF4_0) )
-                        throw new TribbleException.InvalidHeader("This codec is strictly for VCFv4; please use the VCF3 codec for " + lineFields[1]);
-                    if ( version != VCFHeaderVersion.VCF4_0 && version != VCFHeaderVersion.VCF4_1 && version != VCFHeaderVersion.VCF4_2 )
-                        throw new TribbleException.InvalidHeader("This codec is strictly for VCFv4 and does not support " + lineFields[1]);
-                }
-                headerStrings.add(lineIterator.next());
-            }
-            else if (line.startsWith(VCFHeader.HEADER_INDICATOR)) {
-                if (!foundHeaderVersion) {
-                    throw new TribbleException.InvalidHeader("We never saw a header line specifying VCF version");
-                }
-                headerStrings.add(lineIterator.next());
-                super.parseHeaderFromLines(headerStrings, version);
-                return this.header;
-            }
-            else {
-                throw new TribbleException.InvalidHeader("We never saw the required CHROM header line (starting with one #) for the input VCF file");
-            }
-
-        }
-        throw new TribbleException.InvalidHeader("We never saw the required CHROM header line (starting with one #) for the input VCF file");
-    }
-
-    /**
-     * parse the filter string, first checking to see if we already have parsed it in a previous attempt
-     *
-     * @param filterString the string to parse
-     * @return a set of the filters applied or null if filters were not applied to the record (e.g. as per the missing value in a VCF)
-     */
-    protected List<String> parseFilters(final String filterString) {
-        // null for unfiltered
-        if ( filterString.equals(VCFConstants.UNFILTERED) )
-            return null;
-
-        if ( filterString.equals(VCFConstants.PASSES_FILTERS_v4) )
-            return Collections.emptyList();
-        if ( filterString.equals(VCFConstants.PASSES_FILTERS_v3) )
-            generateException(VCFConstants.PASSES_FILTERS_v3 + " is an invalid filter name in vcf4", lineNo);
-        if (filterString.isEmpty())
-            generateException("The VCF specification requires a valid filter status: filter was " + filterString, lineNo);
-
-        // do we have the filter string cached?
-        if ( filterHash.containsKey(filterString) )
-            return filterHash.get(filterString);
-
-        // empty set for passes filters
-        final List<String> fFields = new LinkedList<String>();
-        // otherwise we have to parse and cache the value
-        if ( !filterString.contains(VCFConstants.FILTER_CODE_SEPARATOR) )
-            fFields.add(filterString);
-        else
-            fFields.addAll(Arrays.asList(filterString.split(VCFConstants.FILTER_CODE_SEPARATOR)));
-
-        filterHash.put(filterString, Collections.unmodifiableList(fFields));
-
-        return fFields;
-    }
-
-    @Override
-    public boolean canDecode(final String potentialInput) {
-        return canDecodeFile(potentialInput, VCF4_MAGIC_HEADER);
-    }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFCompoundHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFCompoundHeaderLine.java
deleted file mode 100644
index 48e0cdf..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFCompoundHeaderLine.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.GenotypeLikelihoods;
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * a base class for compound header lines, which include info lines and format lines (so far)
- */
-public abstract class VCFCompoundHeaderLine extends VCFHeaderLine implements VCFIDHeaderLine {
-
-    public enum SupportedHeaderLineType {
-        INFO(true), FORMAT(false);
-
-        public final boolean allowFlagValues;
-        SupportedHeaderLineType(boolean flagValues) {
-            allowFlagValues = flagValues;
-        }
-    }
-
-    // the field types
-    private String name;
-    private int count = -1;
-    private VCFHeaderLineCount countType;
-    private String description;
-    private VCFHeaderLineType type;
-
-    // access methods
-    public String getID() { return name; }
-    public String getDescription() { return description; }
-    public VCFHeaderLineType getType() { return type; }
-    public VCFHeaderLineCount getCountType() { return countType; }
-    public boolean isFixedCount() { return countType == VCFHeaderLineCount.INTEGER; }
-    public int getCount() {
-        if (!isFixedCount())
-            throw new TribbleException("Asking for header line count when type is not an integer");
-        return count;
-    }
-
-    /**
-     * Get the number of values expected for this header field, given the properties of VariantContext vc
-     *
-     * If the count is a fixed count, return that.  For example, a field with size of 1 in the header returns 1
-     * If the count is of type A, return vc.getNAlleles - 1
-     * If the count is of type R, return vc.getNAlleles
-     * If the count is of type G, return the expected number of genotypes given the number of alleles in VC and the
-     *   max ploidy among all samples.  Note that if the max ploidy of the VC is 0 (there's no GT information
-     *   at all, then implicitly assume diploid samples when computing G values.
-     * If the count is UNBOUNDED return -1
-     *
-     * @param vc
-     * @return
-     */
-    public int getCount(final VariantContext vc) {
-        switch (countType) {
-            case INTEGER:
-                return count;
-            case UNBOUNDED:
-                return -1;
-            case A:
-                return vc.getNAlleles() - 1;
-            case R:
-                return vc.getNAlleles();
-            case G:
-                final int ploidy = vc.getMaxPloidy(2);
-                return GenotypeLikelihoods.numLikelihoods(vc.getNAlleles(), ploidy);
-            default:
-                throw new TribbleException("Unknown count type: " + countType);
-        }
-    }
-
-    public void setNumberToUnbounded() {
-        countType = VCFHeaderLineCount.UNBOUNDED;
-        count = -1;
-    }
-
-    // our type of line, i.e. format, info, etc
-    private final SupportedHeaderLineType lineType;
-
-    /**
-     * create a VCF format header line
-     *
-     * @param name         the name for this header line
-     * @param count        the count for this header line
-     * @param type         the type for this header line
-     * @param description  the description for this header line
-     * @param lineType     the header line type
-     */
-    protected VCFCompoundHeaderLine(String name, int count, VCFHeaderLineType type, String description, SupportedHeaderLineType lineType) {
-        super(lineType.toString(), "");
-        this.name = name;
-        this.countType = VCFHeaderLineCount.INTEGER;
-        this.count = count;
-        this.type = type;
-        this.description = description;
-        this.lineType = lineType;
-        validate();
-    }
-
-    /**
-     * create a VCF format header line
-     *
-     * @param name         the name for this header line
-     * @param count        the count type for this header line
-     * @param type         the type for this header line
-     * @param description  the description for this header line
-     * @param lineType     the header line type
-     */
-    protected VCFCompoundHeaderLine(String name, VCFHeaderLineCount count, VCFHeaderLineType type, String description, SupportedHeaderLineType lineType) {
-        super(lineType.toString(), "");
-        this.name = name;
-        this.countType = count;
-        this.type = type;
-        this.description = description;
-        this.lineType = lineType;
-        validate();
-    }
-
-    /**
-     * create a VCF format header line
-     *
-     * @param line   the header line
-     * @param version      the VCF header version
-     * @param lineType     the header line type
-     *
-     */
-    protected VCFCompoundHeaderLine(String line, VCFHeaderVersion version, SupportedHeaderLineType lineType) {
-        super(lineType.toString(), "");
-
-        final ArrayList<String> expectedTags = new ArrayList(Arrays.asList("ID", "Number", "Type", "Description"));
-        if (version.isAtLeastAsRecentAs(VCFHeaderVersion.VCF4_2))
-            expectedTags.add("Version");
-        final Map<String, String> mapping = VCFHeaderLineTranslator.parseLine(version, line, expectedTags);
-        name = mapping.get("ID");
-        count = -1;
-        final String numberStr = mapping.get("Number");
-        if (numberStr.equals(VCFConstants.PER_ALTERNATE_COUNT)) {
-            countType = VCFHeaderLineCount.A;
-        } else if (numberStr.equals(VCFConstants.PER_ALLELE_COUNT)) {
-            countType = VCFHeaderLineCount.R;
-        } else if (numberStr.equals(VCFConstants.PER_GENOTYPE_COUNT)) {
-            countType = VCFHeaderLineCount.G;
-        } else if ((version.isAtLeastAsRecentAs(VCFHeaderVersion.VCF4_0) && numberStr.equals(VCFConstants.UNBOUNDED_ENCODING_v4)) ||
-                (!version.isAtLeastAsRecentAs(VCFHeaderVersion.VCF4_0) && numberStr.equals(VCFConstants.UNBOUNDED_ENCODING_v3))) {
-            countType = VCFHeaderLineCount.UNBOUNDED;
-        } else {
-            countType = VCFHeaderLineCount.INTEGER;
-            count = Integer.valueOf(numberStr);
-
-        }
-
-        if (count < 0 && countType == VCFHeaderLineCount.INTEGER)
-            throw new TribbleException.InvalidHeader("Count < 0 for fixed size VCF header field " + name);
-
-        try {
-            type = VCFHeaderLineType.valueOf(mapping.get("Type"));
-        } catch (Exception e) {
-            throw new TribbleException(mapping.get("Type") + " is not a valid type in the VCF specification (note that types are case-sensitive)");
-        }
-        if (type == VCFHeaderLineType.Flag && !allowFlagValues())
-            throw new IllegalArgumentException("Flag is an unsupported type for this kind of field");
-
-        description = mapping.get("Description");
-        if (description == null && ALLOW_UNBOUND_DESCRIPTIONS) // handle the case where there's no description provided
-            description = UNBOUND_DESCRIPTION;
-
-        this.lineType = lineType;
-
-        validate();
-    }
-
-    private void validate() {
-        if (name == null || type == null || description == null || lineType == null)
-            throw new IllegalArgumentException(String.format("Invalid VCFCompoundHeaderLine: key=%s name=%s type=%s desc=%s lineType=%s",
-                    super.getKey(), name, type, description, lineType));
-        if (name.contains("<") || name.contains(">"))
-            throw new IllegalArgumentException("VCFHeaderLine: ID cannot contain angle brackets");
-        if (name.contains("="))
-            throw new IllegalArgumentException("VCFHeaderLine: ID cannot contain an equals sign");
-
-        if (type == VCFHeaderLineType.Flag && count != 0) {
-            count = 0;
-            if (GeneralUtils.DEBUG_MODE_ENABLED) {
-                System.err.println("FLAG fields must have a count value of 0, but saw " + count + " for header line " + getID() + ". Changing it to 0 inside the code");
-            }
-        }
-    }
-
-    /**
-     * make a string representation of this header line
-     * @return a string representation
-     */
-    protected String toStringEncoding() {
-        Map<String, Object> map = new LinkedHashMap<String, Object>();
-        map.put("ID", name);
-        Object number;
-        switch (countType) {
-            case A:
-                number = VCFConstants.PER_ALTERNATE_COUNT;
-                break;
-            case R:
-                number = VCFConstants.PER_ALLELE_COUNT;
-                break;
-            case G:
-                number = VCFConstants.PER_GENOTYPE_COUNT;
-                break;
-            case UNBOUNDED:
-                number = VCFConstants.UNBOUNDED_ENCODING_v4;
-                break;
-            case INTEGER:
-            default:
-                number = count;
-        }
-        map.put("Number", number);
-        map.put("Type", type);
-        map.put("Description", description);
-        return lineType.toString() + "=" + VCFHeaderLine.toStringEncoding(map);
-    }
-
-    /**
-     * returns true if we're equal to another compound header line
-     * @param o a compound header line
-     * @return true if equal
-     */
-    @Override
-    public boolean equals(final Object o) {
-        if ( this == o ) {
-            return true;
-        }
-        if ( o == null || getClass() != o.getClass() || ! super.equals(o) ) {
-            return false;
-        }
-
-        final VCFCompoundHeaderLine that = (VCFCompoundHeaderLine) o;
-        return equalsExcludingDescription(that) &&
-               description.equals(that.description);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + name.hashCode();
-        result = 31 * result + count;
-        result = 31 * result + (countType != null ? countType.hashCode() : 0);  // only nullable field according to validate()
-        result = 31 * result + description.hashCode();
-        result = 31 * result + type.hashCode();
-        result = 31 * result + lineType.hashCode();
-        return result;
-    }
-
-    public boolean equalsExcludingDescription(VCFCompoundHeaderLine other) {
-        return count == other.count &&
-                countType == other.countType &&
-                type == other.type &&
-                lineType == other.lineType &&
-                name.equals(other.name);
-    }
-
-    public boolean sameLineTypeAndName(VCFCompoundHeaderLine other) {
-        return lineType == other.lineType &&
-                name.equals(other.name);
-    }
-
-    /**
-     * do we allow flag (boolean) values? (i.e. booleans where you don't have specify the value, AQ means AQ=true)
-     * @return true if we do, false otherwise
-     */
-    abstract boolean allowFlagValues();
-
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFConstants.java b/src/main/java/htsjdk/variant/vcf/VCFConstants.java
deleted file mode 100644
index 6a52d1d..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFConstants.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import java.util.Locale;
-
-public final class VCFConstants {
-    public static final Locale VCF_LOCALE = Locale.US;
-
-    // reserved INFO/FORMAT field keys
-    public static final String ANCESTRAL_ALLELE_KEY = "AA";
-    public static final String ALLELE_COUNT_KEY = "AC";
-    public static final String ALLELE_FREQUENCY_KEY = "AF";
-    public static final String ALLELE_NUMBER_KEY = "AN";
-    public static final String RMS_BASE_QUALITY_KEY = "BQ";
-    public static final String CIGAR_KEY = "CIGAR";
-    public static final String DBSNP_KEY = "DB";
-    public static final String DEPTH_KEY = "DP";
-    public static final String END_KEY = "END";
-
-    public static final String GENOTYPE_FILTER_KEY = "FT";
-    public static final String GENOTYPE_KEY = "GT";
-    public static final String GENOTYPE_POSTERIORS_KEY = "GP";
-    public static final String GENOTYPE_QUALITY_KEY = "GQ";
-    public static final String GENOTYPE_ALLELE_DEPTHS = "AD"; //AD isn't reserved, but is specifically handled by VariantContext
-    public static final String GENOTYPE_PL_KEY = "PL";   // phred-scaled genotype likelihoods
-    public static final String EXPECTED_ALLELE_COUNT_KEY = "EC";
-    @Deprecated public static final String GENOTYPE_LIKELIHOODS_KEY = "GL";         // log10 scaled genotype likelihoods
-
-    public static final String HAPMAP2_KEY = "H2";
-    public static final String HAPMAP3_KEY = "H3";
-    public static final String HAPLOTYPE_QUALITY_KEY = "HQ";
-    public static final String RMS_MAPPING_QUALITY_KEY = "MQ";
-    public static final String MAPPING_QUALITY_ZERO_KEY = "MQ0";
-    public static final String SAMPLE_NUMBER_KEY = "NS";
-    public static final String PHASE_QUALITY_KEY = "PQ";
-    public static final String PHASE_SET_KEY = "PS";
-    public static final String OLD_DEPTH_KEY = "RD";
-    public static final String STRAND_BIAS_KEY = "SB";
-    public static final String SOMATIC_KEY = "SOMATIC";
-    public static final String VALIDATED_KEY = "VALIDATED";
-    public static final String THOUSAND_GENOMES_KEY = "1000G";
-    
-    // reserved INFO for structural variants
-    /** INFO Type of structural variant */
-    public static final String SVTYPE = "SVTYPE";    
-
-    // separators
-    public static final String FORMAT_FIELD_SEPARATOR = ":";
-    public static final String GENOTYPE_FIELD_SEPARATOR = ":";
-    public static final char   GENOTYPE_FIELD_SEPARATOR_CHAR = ':';
-    public static final String FIELD_SEPARATOR = "\t";
-    public static final char   FIELD_SEPARATOR_CHAR = '\t';
-    public static final String FILTER_CODE_SEPARATOR = ";";
-    public static final String INFO_FIELD_ARRAY_SEPARATOR = ",";
-    public static final char INFO_FIELD_ARRAY_SEPARATOR_CHAR = ',';
-    public static final String ID_FIELD_SEPARATOR = ";";
-    public static final String INFO_FIELD_SEPARATOR = ";";
-    public static final char INFO_FIELD_SEPARATOR_CHAR = ';';
-    public static final String UNPHASED = "/";
-    public static final String PHASED = "|";
-    public static final String PHASED_SWITCH_PROB_v3 = "\\";
-    public static final String PHASING_TOKENS = "/|\\";
-
-    // header lines
-    public static final String FILTER_HEADER_START = "##FILTER";
-    public static final String FORMAT_HEADER_START = "##FORMAT";
-    public static final String INFO_HEADER_START = "##INFO";
-    public static final String ALT_HEADER_START = "##ALT";
-    public static final String CONTIG_HEADER_KEY = "contig";
-    public static final String CONTIG_HEADER_START = "##" + CONTIG_HEADER_KEY;
-
-    // old indel alleles
-    public static final char DELETION_ALLELE_v3 = 'D';
-    public static final char INSERTION_ALLELE_v3 = 'I';
-
-    // special alleles
-    public static final char SPANNING_DELETION_ALLELE = '*';
-    public static final char NO_CALL_ALLELE = '.';
-    public static final char NULL_ALLELE = '-';
-
-
-    // missing/default values
-    public static final String UNFILTERED = ".";
-    public static final String PASSES_FILTERS_v3 = "0";
-    public static final String PASSES_FILTERS_v4 = "PASS";
-    public static final String EMPTY_ID_FIELD = ".";
-    public static final String EMPTY_INFO_FIELD = ".";
-    public static final String EMPTY_ALTERNATE_ALLELE_FIELD = ".";
-    public static final String MISSING_VALUE_v4 = ".";
-    public static final String MISSING_QUALITY_v3 = "-1";
-    public static final Double MISSING_QUALITY_v3_DOUBLE = Double.valueOf(MISSING_QUALITY_v3);
-
-    public static final String MISSING_GENOTYPE_QUALITY_v3 = "-1";
-    public static final String MISSING_HAPLOTYPE_QUALITY_v3 = "-1";
-    public static final String MISSING_DEPTH_v3 = "-1";
-    public static final String UNBOUNDED_ENCODING_v4 = ".";
-    public static final String UNBOUNDED_ENCODING_v3 = "-1";
-    public static final String PER_ALTERNATE_COUNT = "A";
-    public static final String PER_ALLELE_COUNT = "R";
-    public static final String PER_GENOTYPE_COUNT = "G";
-    public static final String EMPTY_ALLELE = ".";
-    public static final String EMPTY_GENOTYPE = "./.";
-    public static final int MAX_GENOTYPE_QUAL = 99;
-
-    public static final Double VCF_ENCODING_EPSILON = 0.00005; // when we consider fields equal(), used in the Qual compare
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFContigHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFContigHeaderLine.java
deleted file mode 100644
index 12e400c..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFContigHeaderLine.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.tribble.TribbleException;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * A special class representing a contig VCF header line.  Knows the true contig order and sorts on that
- *
- * Note: this class has a natural ordering that is inconsistent with equals()
- *
- * @author mdepristo
- */
-public class VCFContigHeaderLine extends VCFSimpleHeaderLine {
-    final Integer contigIndex;
-
-    /**
-     * create a VCF contig header line
-     *
-     * @param line      the header line
-     * @param version   the vcf header version
-     * @param key            the key for this header line
-     */
-    public VCFContigHeaderLine(final String line, final VCFHeaderVersion version, final String key, final int contigIndex) {
-        super(line, version, key, null);
-	    if (contigIndex < 0) throw new TribbleException("The contig index is less than zero.");
-        this.contigIndex = contigIndex;
-    }
-
-    public VCFContigHeaderLine(final Map<String, String> mapping, final int contigIndex) {
-        super(VCFHeader.CONTIG_KEY, mapping);
-	    if (contigIndex < 0) throw new TribbleException("The contig index is less than zero.");
-        this.contigIndex = contigIndex;
-    }
-
-	VCFContigHeaderLine(final SAMSequenceRecord sequenceRecord, final String assembly) {
-        // Using LinkedHashMap to preserve order of keys in contig line (ID, length, assembly)
-        super(VCFHeader.CONTIG_KEY, new LinkedHashMap<String, String>() {{
-			// Now inside an init block in an anon HashMap subclass
-			this.put("ID", sequenceRecord.getSequenceName());
-			this.put("length", Integer.toString(sequenceRecord.getSequenceLength()));
-			if ( assembly != null ) this.put("assembly", assembly);
-		}});
-		this.contigIndex = sequenceRecord.getSequenceIndex();
-	}
-
-    public Integer getContigIndex() {
-        return contigIndex;
-    }
-
-	public SAMSequenceRecord getSAMSequenceRecord() {
-		final String lengthString = this.getGenericFieldValue("length");
-		if (lengthString == null) throw new TribbleException("Contig " + this.getID() + " does not have a length field.");
-		final SAMSequenceRecord record = new SAMSequenceRecord(this.getID(), Integer.valueOf(lengthString));
-        record.setAssembly(this.getGenericFieldValue("assembly"));
-		record.setSequenceIndex(this.contigIndex);
-		return record;
-	}
-
-    @Override
-    public boolean equals(final Object o) {
-        if ( this == o ) {
-            return true;
-        }
-        if ( o == null || getClass() != o.getClass() || ! super.equals(o) ) {
-            return false;
-        }
-
-        final VCFContigHeaderLine that = (VCFContigHeaderLine) o;
-        return contigIndex.equals(that.contigIndex);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + contigIndex.hashCode();
-        return result;
-    }
-
-    /**
-     * IT IS CRITICAL THAT THIS BE OVERRIDDEN SO WE SORT THE CONTIGS IN THE CORRECT ORDER
-     */
-    @Override
-    public int compareTo(final Object other) {
-        if ( other instanceof VCFContigHeaderLine )
-            return contigIndex.compareTo(((VCFContigHeaderLine) other).contigIndex);
-        else {
-            return super.compareTo(other);
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/vcf/VCFEncoder.java b/src/main/java/htsjdk/variant/vcf/VCFEncoder.java
deleted file mode 100644
index a909066..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFEncoder.java
+++ /dev/null
@@ -1,382 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.GenotypesContext;
-import htsjdk.variant.variantcontext.LazyGenotypesContext;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.writer.IntGenotypeFieldAccessors;
-
-import java.lang.reflect.Array;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-/**
- * Functions specific to encoding VCF records.
- */
-public class VCFEncoder {
-
-	/**
-	 * The encoding used for VCF files: ISO-8859-1
-	 */
-	public static final Charset VCF_CHARSET = Charset.forName("ISO-8859-1");
-	private static final String QUAL_FORMAT_STRING = "%.2f";
-	private static final String QUAL_FORMAT_EXTENSION_TO_TRIM = ".00";
-
-	private final IntGenotypeFieldAccessors GENOTYPE_FIELD_ACCESSORS = new IntGenotypeFieldAccessors();
-
-	private VCFHeader header;
-
-	private boolean allowMissingFieldsInHeader = false;
-
-	private boolean outputTrailingFormatFields = false;
-
-	/**
-	 * Prepare a VCFEncoder that will encode records appropriate to the given VCF header, optionally
-	 * allowing missing fields in the header.
-	 */
-	public VCFEncoder(final VCFHeader header, final boolean allowMissingFieldsInHeader, final boolean outputTrailingFormatFields) {
-		if (header == null) throw new NullPointerException("The VCF header must not be null.");
-		this.header = header;
-		this.allowMissingFieldsInHeader = allowMissingFieldsInHeader;
-		this.outputTrailingFormatFields = outputTrailingFormatFields;
-	}
-
-	/**
-	 * Please see the notes in the default constructor
-	 */
-	@Deprecated
-	public void setVCFHeader(final VCFHeader header) {
-		this.header = header;
-	}
-
-	/**
-	 * Please see the notes in the default constructor
-	 */
-	@Deprecated
-	public void setAllowMissingFieldsInHeader(final boolean allow) {
-		this.allowMissingFieldsInHeader = allow;
-	}
-
-	public String encode(final VariantContext context) {
-		if (this.header == null) {
-			throw new NullPointerException("The header field must be set on the VCFEncoder before encoding records.");
-		}
-
-		final StringBuilder stringBuilder = new StringBuilder();
-
-		// CHROM
-		stringBuilder.append(context.getContig()).append(VCFConstants.FIELD_SEPARATOR)
-				// POS
-				.append(String.valueOf(context.getStart())).append(VCFConstants.FIELD_SEPARATOR)
-				// ID
-				.append(context.getID()).append(VCFConstants.FIELD_SEPARATOR)
-				// REF
-				.append(context.getReference().getDisplayString()).append(VCFConstants.FIELD_SEPARATOR);
-
-		// ALT
-		if ( context.isVariant() ) {
-			Allele altAllele = context.getAlternateAllele(0);
-			String alt = altAllele.getDisplayString();
-			stringBuilder.append(alt);
-
-			for (int i = 1; i < context.getAlternateAlleles().size(); i++) {
-				altAllele = context.getAlternateAllele(i);
-				alt = altAllele.getDisplayString();
-				stringBuilder.append(',');
-				stringBuilder.append(alt);
-			}
-		} else {
-			stringBuilder.append(VCFConstants.EMPTY_ALTERNATE_ALLELE_FIELD);
-		}
-
-		stringBuilder.append(VCFConstants.FIELD_SEPARATOR);
-
-		// QUAL
-		if ( ! context.hasLog10PError()) stringBuilder.append(VCFConstants.MISSING_VALUE_v4);
-		else stringBuilder.append(formatQualValue(context.getPhredScaledQual()));
-		stringBuilder.append(VCFConstants.FIELD_SEPARATOR)
-				// FILTER
-				.append(getFilterString(context)).append(VCFConstants.FIELD_SEPARATOR);
-
-		// INFO
-		final Map<String, String> infoFields = new TreeMap<String, String>();
-		for (final Map.Entry<String, Object> field : context.getAttributes().entrySet() ) {
-			if ( ! this.header.hasInfoLine(field.getKey())) fieldIsMissingFromHeaderError(context, field.getKey(), "INFO");
-
-			final String outputValue = formatVCFField(field.getValue());
-			if (outputValue != null) infoFields.put(field.getKey(), outputValue);
-		}
-		writeInfoString(infoFields, stringBuilder);
-
-		// FORMAT
-		final GenotypesContext gc = context.getGenotypes();
-		if (gc.isLazyWithData() && ((LazyGenotypesContext) gc).getUnparsedGenotypeData() instanceof String) {
-			stringBuilder.append(VCFConstants.FIELD_SEPARATOR);
-			stringBuilder.append(((LazyGenotypesContext) gc).getUnparsedGenotypeData().toString());
-		} else {
-			final List<String> genotypeAttributeKeys = context.calcVCFGenotypeKeys(this.header);
-			if ( ! genotypeAttributeKeys.isEmpty()) {
-				for (final String format : genotypeAttributeKeys)
-					if ( ! this.header.hasFormatLine(format))
-						fieldIsMissingFromHeaderError(context, format, "FORMAT");
-
-				final String genotypeFormatString = ParsingUtils.join(VCFConstants.GENOTYPE_FIELD_SEPARATOR, genotypeAttributeKeys);
-
-				stringBuilder.append(VCFConstants.FIELD_SEPARATOR);
-				stringBuilder.append(genotypeFormatString);
-
-				final Map<Allele, String> alleleStrings = buildAlleleStrings(context);
-				addGenotypeData(context, alleleStrings, genotypeAttributeKeys, stringBuilder);
-			}
-		}
-
-		return stringBuilder.toString();
-	}
-
-	VCFHeader getVCFHeader() {
-		return this.header;
-	}
-
-	boolean getAllowMissingFieldsInHeader() {
-		return this.allowMissingFieldsInHeader;
-	}
-
-	private String getFilterString(final VariantContext vc) {
-		if (vc.isFiltered()) {
-			for (final String filter : vc.getFilters()) {
-				if ( ! this.header.hasFilterLine(filter)) fieldIsMissingFromHeaderError(vc, filter, "FILTER");
-			}
-
-			return ParsingUtils.join(";", ParsingUtils.sortList(vc.getFilters()));
-		}
-		else if (vc.filtersWereApplied()) return VCFConstants.PASSES_FILTERS_v4;
-		else return VCFConstants.UNFILTERED;
-	}
-
-	private String formatQualValue(final double qual) {
-		String s = String.format(QUAL_FORMAT_STRING, qual);
-		if ( s.endsWith(QUAL_FORMAT_EXTENSION_TO_TRIM) )
-			s = s.substring(0, s.length() - QUAL_FORMAT_EXTENSION_TO_TRIM.length());
-		return s;
-	}
-
-	private void fieldIsMissingFromHeaderError(final VariantContext vc, final String id, final String field) {
-		if ( ! allowMissingFieldsInHeader)
-			throw new IllegalStateException("Key " + id + " found in VariantContext field " + field
-					+ " at " + vc.getContig() + ":" + vc.getStart()
-					+ " but this key isn't defined in the VCFHeader.  We require all VCFs to have"
-					+ " complete VCF headers by default.");
-	}
-
-	String formatVCFField(final Object val) {
-		final String result;
-		if ( val == null )
-			result = VCFConstants.MISSING_VALUE_v4;
-		else if ( val instanceof Double )
-			result = formatVCFDouble((Double) val);
-		else if ( val instanceof Boolean )
-			result = (Boolean)val ? "" : null; // empty string for true, null for false
-		else if ( val instanceof List ) {
-			result = formatVCFField(((List)val).toArray());
-		} else if ( val.getClass().isArray() ) {
-			final int length = Array.getLength(val);
-			if ( length == 0 )
-				return formatVCFField(null);
-			final StringBuilder sb = new StringBuilder(formatVCFField(Array.get(val, 0)));
-			for ( int i = 1; i < length; i++) {
-				sb.append(',');
-				sb.append(formatVCFField(Array.get(val, i)));
-			}
-			result = sb.toString();
-		} else
-			result = val.toString();
-
-		return result;
-	}
-
-	/**
-	 * Takes a double value and pretty prints it to a String for display
-	 *
-	 * Large doubles => gets %.2f style formatting
-	 * Doubles < 1 / 10 but > 1/100 => get %.3f style formatting
-	 * Double < 1/100 => %.3e formatting
-	 * @param d
-	 * @return
-	 */
-	public static String formatVCFDouble(final double d) {
-		final String format;
-		if ( d < 1 ) {
-			if ( d < 0.01 ) {
-				if ( Math.abs(d) >= 1e-20 )
-					format = "%.3e";
-				else {
-					// return a zero format
-					return "0.00";
-				}
-			} else {
-				format = "%.3f";
-			}
-		} else {
-			format = "%.2f";
-		}
-
-		return String.format(format, d);
-	}
-
-	static int countOccurrences(final char c, final String s) {
-		int count = 0;
-		for (int i = 0; i < s.length(); i++) {
-			count += s.charAt(i) == c ? 1 : 0;
-		}
-		return count;
-	}
-
-	static boolean isMissingValue(final String s) {
-		// we need to deal with the case that it's a list of missing values
-		return (countOccurrences(VCFConstants.MISSING_VALUE_v4.charAt(0), s) + countOccurrences(',', s) == s.length());
-	}
-
-	/*
-	 * Add the genotype data
-	 */
-	public void addGenotypeData(final VariantContext vc, final Map<Allele, String> alleleMap, final List<String> genotypeFormatKeys, final StringBuilder builder) {
-		final int ploidy = vc.getMaxPloidy(2);
-
-		for (final String sample : this.header.getGenotypeSamples()) {
-			builder.append(VCFConstants.FIELD_SEPARATOR);
-
-			Genotype g = vc.getGenotype(sample);
-			if (g == null) g = GenotypeBuilder.createMissing(sample, ploidy);
-
-			final List<String> attrs = new ArrayList<String>(genotypeFormatKeys.size());
-			for (final String field : genotypeFormatKeys) {
-				if (field.equals(VCFConstants.GENOTYPE_KEY)) {
-					if ( ! g.isAvailable()) {
-						throw new IllegalStateException("GTs cannot be missing for some samples if they are available for others in the record");
-					}
-
-					writeAllele(g.getAllele(0), alleleMap, builder);
-					for (int i = 1; i < g.getPloidy(); i++) {
-						builder.append(g.isPhased() ? VCFConstants.PHASED : VCFConstants.UNPHASED);
-						writeAllele(g.getAllele(i), alleleMap, builder);
-					}
-					continue;
-
-				} else {
-					final String outputValue;
-					if ( field.equals(VCFConstants.GENOTYPE_FILTER_KEY ) ) {
-						outputValue = g.isFiltered() ? g.getFilters() : VCFConstants.PASSES_FILTERS_v4;
-					} else {
-						final IntGenotypeFieldAccessors.Accessor accessor = GENOTYPE_FIELD_ACCESSORS.getAccessor(field);
-						if ( accessor != null ) {
-							final int[] intValues = accessor.getValues(g);
-							if ( intValues == null )
-								outputValue = VCFConstants.MISSING_VALUE_v4;
-							else if ( intValues.length == 1 ) // fast path
-								outputValue = Integer.toString(intValues[0]);
-							else {
-								final StringBuilder sb = new StringBuilder();
-								sb.append(intValues[0]);
-								for ( int i = 1; i < intValues.length; i++) {
-									sb.append(',');
-									sb.append(intValues[i]);
-								}
-								outputValue = sb.toString();
-							}
-						} else {
-							Object val = g.hasExtendedAttribute(field) ? g.getExtendedAttribute(field) : VCFConstants.MISSING_VALUE_v4;
-
-							final VCFFormatHeaderLine metaData = this.header.getFormatHeaderLine(field);
-							if ( metaData != null ) {
-								final int numInFormatField = metaData.getCount(vc);
-								if ( numInFormatField > 1 && val.equals(VCFConstants.MISSING_VALUE_v4) ) {
-									// If we have a missing field but multiple values are expected, we need to construct a new string with all fields.
-									// For example, if Number=2, the string has to be ".,."
-									final StringBuilder sb = new StringBuilder(VCFConstants.MISSING_VALUE_v4);
-									for ( int i = 1; i < numInFormatField; i++ ) {
-										sb.append(',');
-										sb.append(VCFConstants.MISSING_VALUE_v4);
-									}
-									val = sb.toString();
-								}
-							}
-
-							// assume that if key is absent, then the given string encoding suffices
-							outputValue = formatVCFField(val);
-						}
-					}
-
-					if ( outputValue != null )
-						attrs.add(outputValue);
-				}
-			}
-
-			// strip off trailing missing values
-			if (!outputTrailingFormatFields) {
-				for (int i = attrs.size() - 1; i >= 0; i--) {
-					if (isMissingValue(attrs.get(i))) attrs.remove(i);
-					else break;
-				}
-			}
-
-			for (int i = 0; i < attrs.size(); i++) {
-				if ( i > 0 || genotypeFormatKeys.contains(VCFConstants.GENOTYPE_KEY)) {
-					builder.append(VCFConstants.GENOTYPE_FIELD_SEPARATOR);
-				}
-				builder.append(attrs.get(i));
-			}
-		}
-	}
-
-	/*
-	 * Create the info string; assumes that no values are null
-	 */
-	private void writeInfoString(final Map<String, String> infoFields, final StringBuilder builder) {
-		if ( infoFields.isEmpty() ) {
-			builder.append(VCFConstants.EMPTY_INFO_FIELD);
-			return;
-		}
-
-		boolean isFirst = true;
-		for (final Map.Entry<String, String> entry : infoFields.entrySet()) {
-			if (isFirst) isFirst = false;
-			else builder.append(VCFConstants.INFO_FIELD_SEPARATOR);
-
-			builder.append(entry.getKey());
-
-			if ( ! entry.getValue().equals("")) {
-				final VCFInfoHeaderLine metaData = this.header.getInfoHeaderLine(entry.getKey());
-				if ( metaData == null || metaData.getCountType() != VCFHeaderLineCount.INTEGER || metaData.getCount() != 0 ) {
-					builder.append('=');
-					builder.append(entry.getValue());
-				}
-			}
-		}
-	}
-
-	public Map<Allele, String> buildAlleleStrings(final VariantContext vc) {
-		final Map<Allele, String> alleleMap = new HashMap<Allele, String>(vc.getAlleles().size()+1);
-		alleleMap.put(Allele.NO_CALL, VCFConstants.EMPTY_ALLELE); // convenience for lookup
-
-		final List<Allele> alleles = vc.getAlleles();
-		for ( int i = 0; i < alleles.size(); i++ ) {
-			alleleMap.put(alleles.get(i), String.valueOf(i));
-		}
-
-		return alleleMap;
-	}
-
-	private void writeAllele(final Allele allele, final Map<Allele, String> alleleMap, final StringBuilder builder) {
-		final String encoding = alleleMap.get(allele);
-		if ( encoding == null )
-			throw new RuntimeException("Allele " + allele + " is not an allele in the variant context");
-		builder.append(encoding);
-	}
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFFileReader.java b/src/main/java/htsjdk/variant/vcf/VCFFileReader.java
deleted file mode 100644
index 9024f34..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFFileReader.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.IntervalList;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.bcf2.BCF2Codec;
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.io.Closeable;
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Simplified interface for reading from VCF/BCF files.
- */
-public class VCFFileReader implements Closeable, Iterable<VariantContext> {
-
-	private final FeatureReader<VariantContext> reader;
-
-	/**
-	 * Returns true if the given file appears to be a BCF file.
-	 */
-	public static boolean isBCF(final File file) {
-		return file.getAbsolutePath().endsWith(".bcf");
-	}
-
-	/**
-	 * Returns the SAMSequenceDictionary from the provided VCF file.
-	 */
-	public static SAMSequenceDictionary getSequenceDictionary(final File file) {
-		final SAMSequenceDictionary dict = new VCFFileReader(file, false).getFileHeader().getSequenceDictionary();
-		CloserUtil.close(file);
-		return dict;
-	}
-
-    /** Constructs a VCFFileReader that requires the index to be present. */
-	public VCFFileReader(final File file) {
-		this(file, true);
-	}
-
-    /** Constructs a VCFFileReader with a specified index. */
-    public VCFFileReader(final File file, final File indexFile) {
-        this(file, indexFile, true);
-    }
-
-    /** Allows construction of a VCFFileReader that will or will not assert the presence of an index as desired. */
-	public VCFFileReader(final File file, final boolean requireIndex) {
-	  // Note how we deal with type safety here, just casting to (FeatureCodec)
-	  // in the call to getFeatureReader is not enough for Java 8.
-      FeatureCodec<VariantContext, ?> codec = isBCF(file) ? new BCF2Codec() : new VCFCodec();
-      this.reader = AbstractFeatureReader.getFeatureReader(
-                      file.getAbsolutePath(),
-                      codec,
-                      requireIndex);
-	}
-
-    /** Allows construction of a VCFFileReader with a specified index file. */
-    public VCFFileReader(final File file, final File indexFile, final boolean requireIndex) {
-      // Note how we deal with type safety here, just casting to (FeatureCodec)
-      // in the call to getFeatureReader is not enough for Java 8.
-      FeatureCodec<VariantContext, ?> codec = isBCF(file) ? new BCF2Codec() : new VCFCodec();
-      this.reader = AbstractFeatureReader.getFeatureReader(
-                      file.getAbsolutePath(),
-                      indexFile.getAbsolutePath(),
-                      codec,
-                      requireIndex);
-    }
-
-    /**
-     * Parse a VCF file and convert to an IntervalList The name field of the IntervalList is taken from the ID field of the variant, if it exists. if not,
-     * creates a name of the format interval-n where n is a running number that increments only on un-named intervals
-     * @param file
-     * @return
-     */
-    public static IntervalList fromVcf(final File file){
-        return fromVcf(file, false);
-    }
-
-    public static IntervalList fromVcf(final File file, final boolean includeFiltered){
-        final VCFFileReader vcfFileReader = new VCFFileReader(file, false);
-        final IntervalList intervalList = fromVcf(vcfFileReader, includeFiltered);
-        vcfFileReader.close();
-        return intervalList;
-    }
-
-    /**
-     * Converts a vcf to an IntervalList. The name field of the IntervalList is taken from the ID field of the variant, if it exists. If not,
-     * creates a name of the format interval-n where n is a running number that increments only on un-named intervals
-     * Will use a "END" tag in the info field as the end of the interval (if exists).
-     * @param vcf the vcfReader to be used for the conversion
-     * @return an IntervalList constructed from input vcf
-     */
-
-    public static IntervalList fromVcf(final VCFFileReader vcf){
-        return fromVcf(vcf,false);
-    }
-    public static IntervalList fromVcf(final VCFFileReader vcf, final boolean includeFiltered){
-
-        //grab the dictionary from the VCF and use it in the IntervalList
-        final SAMSequenceDictionary dict = vcf.getFileHeader().getSequenceDictionary();
-        final SAMFileHeader samFileHeader = new SAMFileHeader();
-        samFileHeader.setSequenceDictionary(dict);
-        final IntervalList list = new IntervalList(samFileHeader);
-
-        int intervals=0;
-        for(final VariantContext vc : vcf){
-            if(includeFiltered || !vc.isFiltered()){
-                String name = vc.getID();
-                final Integer intervalEnd=vc.getCommonInfo().getAttributeAsInt("END",vc.getEnd());
-                if(".".equals(name) || name == null)
-                    name = "interval-" + (++intervals);
-                list.add(new Interval(vc.getContig(), vc.getStart(), intervalEnd, false, name));
-            }
-        }
-
-        return list;
-    }
-
-    /** Returns the VCFHeader associated with this VCF/BCF file. */
-	public VCFHeader getFileHeader() {
-		return (VCFHeader) reader.getHeader();
-	}
-
-    /** Returns an iterator over all records in this VCF/BCF file. */
-	public CloseableIterator<VariantContext> iterator() {
-		try { return reader.iterator(); }
-        catch (final IOException ioe) {
-			throw new TribbleException("Could not create an iterator from a feature reader.", ioe);
-		}
-	}
-
-    /** Queries for records within the region specified. */
-    public CloseableIterator<VariantContext> query(final String chrom, final int start, final int end) {
-        try { return reader.query(chrom, start, end); }
-        catch (final IOException ioe) {
-            throw new TribbleException("Could not create an iterator from a feature reader.", ioe);
-        }
-    }
-
-	public void close() {
-		try { this.reader.close(); }
-        catch (final IOException ioe) {
-			throw new TribbleException("Could not close a variant context feature reader.", ioe);
-		}
-	}
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFFilterHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFFilterHeaderLine.java
deleted file mode 100644
index 5130963..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFFilterHeaderLine.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import java.util.Arrays;
-
-/**
- * @author ebanks
- * 
- * A class representing a key=value entry for FILTER fields in the VCF header
- */
-public class VCFFilterHeaderLine extends VCFSimpleHeaderLine  {
-    
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * create a VCF filter header line
-     *
-     * @param name         the name for this header line
-     * @param description  the description for this header line
-     */
-    public VCFFilterHeaderLine(final String name, final String description) {
-        super("FILTER", name, description);
-    }
-
-    /**
-     * Convenience constructor for FILTER whose description is the name
-     * @param name
-     */
-    public VCFFilterHeaderLine(final String name) {
-        super("FILTER", name, name);
-    }
-
-    /**
-     * create a VCF info header line
-     *
-     * @param line      the header line
-     * @param version   the vcf header version
-     */
-    public VCFFilterHeaderLine(final String line, final VCFHeaderVersion version) {
-        super(line, version, "FILTER", Arrays.asList("ID", "Description"));
-    }
-
-    @Override
-    public boolean shouldBeAddedToDictionary() {
-        return true;
-    }
-    
-    /**
-     * get the "Description" field
-     * @return the "Description" field
-     */
-    public String getDescription() {
-        return getGenericFieldValue("Description");
-    }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFFormatHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFFormatHeaderLine.java
deleted file mode 100644
index 74f4d5e..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFFormatHeaderLine.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-
-/**
- * @author ebanks
- *         <p>
- *         Class VCFFormatHeaderLine
- *         </p>
- *         <p>
- *         A class representing a key=value entry for genotype FORMAT fields in the VCF header</p>
- */
-public class VCFFormatHeaderLine extends VCFCompoundHeaderLine {
-
-    public VCFFormatHeaderLine(String name, int count, VCFHeaderLineType type, String description) {
-        super(name, count, type, description, SupportedHeaderLineType.FORMAT);
-        if (type == VCFHeaderLineType.Flag)
-            throw new IllegalArgumentException("Flag is an unsupported type for format fields");
-    }
-
-    public VCFFormatHeaderLine(String name, VCFHeaderLineCount count, VCFHeaderLineType type, String description) {
-        super(name, count, type, description, SupportedHeaderLineType.FORMAT);
-    }
-
-    public VCFFormatHeaderLine(String line, VCFHeaderVersion version) {
-        super(line, version, SupportedHeaderLineType.FORMAT);
-    }
-
-    // format fields do not allow flag values (that wouldn't make much sense, how would you encode this in the genotype).
-    @Override
-    boolean allowFlagValues() {
-        return false;
-    }
-
-    @Override
-    public boolean shouldBeAddedToDictionary() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeader.java b/src/main/java/htsjdk/variant/vcf/VCFHeader.java
deleted file mode 100644
index 30dce37..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeader.java
+++ /dev/null
@@ -1,574 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.VariantContextComparator;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-
-/**
- * A class to represent a VCF header
- *
- * @author aaron
- * NOTE: This class stores header lines in lots of places. The original author noted that this should
- * be cleaned up at some point in the future (jgentry - 5/2013)
- */
-public class VCFHeader implements Serializable {
-    public static final long serialVersionUID = 1L;
-
-    // the mandatory header fields
-    public enum HEADER_FIELDS {
-        CHROM, POS, ID, REF, ALT, QUAL, FILTER, INFO
-    }
-
-    // the associated meta data
-    private final Set<VCFHeaderLine> mMetaData = new LinkedHashSet<VCFHeaderLine>();
-    private final Map<String, VCFInfoHeaderLine> mInfoMetaData = new LinkedHashMap<String, VCFInfoHeaderLine>();
-    private final Map<String, VCFFormatHeaderLine> mFormatMetaData = new LinkedHashMap<String, VCFFormatHeaderLine>();
-    private final Map<String, VCFFilterHeaderLine> mFilterMetaData = new LinkedHashMap<String, VCFFilterHeaderLine>();
-    private final Map<String, VCFHeaderLine> mOtherMetaData = new LinkedHashMap<String, VCFHeaderLine>();
-    private final List<VCFContigHeaderLine> contigMetaData = new ArrayList<VCFContigHeaderLine>();
-
-    // the list of auxillary tags
-    private final List<String> mGenotypeSampleNames = new ArrayList<String>();
-
-    // the character string that indicates meta data
-    public static final String METADATA_INDICATOR = "##";
-
-    // the header string indicator
-    public static final String HEADER_INDICATOR = "#";
-
-    public static final String SOURCE_KEY = "source";
-    public static final String REFERENCE_KEY = "reference";
-    public static final String CONTIG_KEY = "contig";
-    public static final String INTERVALS_KEY = "intervals";
-    public static final String EXCLUDE_INTERVALS_KEY = "excludeIntervals";
-    public static final String INTERVAL_MERGING_KEY = "interval_merging";
-    public static final String INTERVAL_SET_RULE_KEY = "interval_set_rule";
-    public static final String INTERVAL_PADDING_KEY = "interval_padding";
-
-    // were the input samples sorted originally (or are we sorting them)?
-    private boolean samplesWereAlreadySorted = true;
-
-    // cache for efficient conversion of VCF -> VariantContext
-    private ArrayList<String> sampleNamesInOrder = null;
-    private HashMap<String, Integer> sampleNameToOffset = null;
-
-    private boolean writeEngineHeaders = true;
-    private boolean writeCommandLine = true;
-
-    /**
-     * Create an empty VCF header with no header lines and no samples
-     */
-    public VCFHeader() {
-        this(Collections.<VCFHeaderLine>emptySet(), Collections.<String>emptySet());
-    }
-
-    /**
-     * create a VCF header, given a list of meta data and auxiliary tags
-     *
-     * @param metaData     the meta data associated with this header
-     */
-    public VCFHeader(final Set<VCFHeaderLine> metaData) {
-        mMetaData.addAll(metaData);
-        removeVCFVersionLines(mMetaData);
-        createLookupEntriesForAllHeaderLines();
-        checkForDeprecatedGenotypeLikelihoodsKey();
-    }
-
-    /**
-     * Creates a deep copy of the given VCFHeader, duplicating all its metadata and
-     * sample names.
-     */
-    public VCFHeader(final VCFHeader toCopy) {
-        this(toCopy.mMetaData, toCopy.mGenotypeSampleNames);
-    }
-
-    /**
-     * create a VCF header, given a list of meta data and auxillary tags
-     *
-     * @param metaData            the meta data associated with this header
-     * @param genotypeSampleNames the sample names
-     */
-    public VCFHeader(final Set<VCFHeaderLine> metaData, final Set<String> genotypeSampleNames) {
-        this(metaData, new ArrayList<String>(genotypeSampleNames));
-    }
-
-    public VCFHeader(final Set<VCFHeaderLine> metaData, final List<String> genotypeSampleNames) {
-        this(metaData);
-
-        if ( genotypeSampleNames.size() != new HashSet<String>(genotypeSampleNames).size() )
-            throw new TribbleException.InvalidHeader("BUG: VCF header has duplicate sample names");
-
-        mGenotypeSampleNames.addAll(genotypeSampleNames);
-        samplesWereAlreadySorted = ParsingUtils.isSorted(genotypeSampleNames);
-        buildVCFReaderMaps(genotypeSampleNames);
-    }
-
-    /**
-     * Tell this VCF header to use pre-calculated sample name ordering and the
-     * sample name -> offset map.  This assumes that all VariantContext created
-     * using this header (i.e., read by the VCFCodec) will have genotypes
-     * occurring in the same order
-     *
-     * @param genotypeSampleNamesInAppearenceOrder genotype sample names, must iterator in order of appearance
-     */
-    private void buildVCFReaderMaps(final Collection<String> genotypeSampleNamesInAppearenceOrder) {
-        sampleNamesInOrder = new ArrayList<String>(genotypeSampleNamesInAppearenceOrder.size());
-        sampleNameToOffset = new HashMap<String, Integer>(genotypeSampleNamesInAppearenceOrder.size());
-
-        int i = 0;
-        for (final String name : genotypeSampleNamesInAppearenceOrder) {
-            sampleNamesInOrder.add(name);
-            sampleNameToOffset.put(name, i++);
-        }
-        Collections.sort(sampleNamesInOrder);
-    }
-
-
-    /**
-     * Adds a new line to the VCFHeader. If there is an existing header line of the
-     * same type with the same key, the new line is not added and the existing line
-     * is preserved.
-     *
-     * @param headerLine header line to attempt to add
-     */
-    public void addMetaDataLine(final VCFHeaderLine headerLine) {
-        // Try to create a lookup entry for the new line. If this succeeds (because there was
-        // no line of this type with the same key), add the line to our master list of header
-        // lines in mMetaData.
-        if ( addMetadataLineLookupEntry(headerLine) ) {
-            mMetaData.add(headerLine);
-            checkForDeprecatedGenotypeLikelihoodsKey();
-        }
-    }
-
-    /**
-     * @return all of the VCF header lines of the ##contig form in order, or an empty list if none were present
-     */
-    public List<VCFContigHeaderLine> getContigLines() {
-        return Collections.unmodifiableList(contigMetaData);
-    }
-
-    /**
-     * Returns the contigs in this VCF file as a SAMSequenceDictionary. Returns null if contigs lines are
-     * not present in the header. Throws SAMException if one or more contig lines do not have length
-     * information.
-     */
-    public SAMSequenceDictionary getSequenceDictionary() {
-        final List<VCFContigHeaderLine> contigHeaderLines = this.getContigLines();
-        if (contigHeaderLines.isEmpty()) return null;
-
-        final List<SAMSequenceRecord> sequenceRecords = new ArrayList<SAMSequenceRecord>(contigHeaderLines.size());
-        for (final VCFContigHeaderLine contigHeaderLine : contigHeaderLines) {
-            sequenceRecords.add(contigHeaderLine.getSAMSequenceRecord());
-        }
-
-        return new SAMSequenceDictionary(sequenceRecords);
-    }
-
-    /**
-     * Completely replaces the contig records in this header with those in the given SAMSequenceDictionary.
-     */
-    public void setSequenceDictionary(final SAMSequenceDictionary dictionary) {
-        this.contigMetaData.clear();
-
-        // Also need to remove contig record lines from mMetaData
-        final List<VCFHeaderLine> toRemove = new ArrayList<VCFHeaderLine>();
-        for (final VCFHeaderLine line : mMetaData) {
-            if (line instanceof VCFContigHeaderLine) {
-                toRemove.add(line);
-            }
-        }
-        mMetaData.removeAll(toRemove);
-        for (final SAMSequenceRecord record : dictionary.getSequences()) {
-            contigMetaData.add(new VCFContigHeaderLine(record, record.getAssembly()));
-        }
-
-        this.mMetaData.addAll(contigMetaData);
-    }
-
-    public VariantContextComparator getVCFRecordComparator() {
-        return new VariantContextComparator(this.getContigLines());
-    }
-
-    /**
-     * @return all of the VCF FILTER lines in their original file order, or an empty list if none were present
-     */
-    public List<VCFFilterHeaderLine> getFilterLines() {
-        final List<VCFFilterHeaderLine> filters = new ArrayList<VCFFilterHeaderLine>();
-        for (final VCFHeaderLine line : mMetaData) {
-            if ( line instanceof VCFFilterHeaderLine )  {
-                filters.add((VCFFilterHeaderLine)line);
-            }
-        }
-        return filters;
-    }
-
-    /**
-     * @return all of the VCF FILTER lines in their original file order, or an empty list if none were present
-     */
-    public List<VCFIDHeaderLine> getIDHeaderLines() {
-        final List<VCFIDHeaderLine> filters = new ArrayList<VCFIDHeaderLine>();
-        for (final VCFHeaderLine line : mMetaData) {
-            if (line instanceof VCFIDHeaderLine)  {
-                filters.add((VCFIDHeaderLine)line);
-            }
-        }
-        return filters;
-    }
-
-    /**
-     * Remove all lines with a VCF version tag from the provided set of header lines
-     */
-    private void removeVCFVersionLines( final Set<VCFHeaderLine> headerLines ) {
-        final List<VCFHeaderLine> toRemove = new ArrayList<VCFHeaderLine>();
-        for (final VCFHeaderLine line : headerLines) {
-            if (VCFHeaderVersion.isFormatString(line.getKey())) {
-                toRemove.add(line);
-            }
-        }
-        headerLines.removeAll(toRemove);
-    }
-
-    /**
-     * Creates lookup table entries for all header lines in mMetaData.
-     */
-    private void createLookupEntriesForAllHeaderLines() {
-        for (final VCFHeaderLine line : mMetaData) {
-            addMetadataLineLookupEntry(line);
-        }
-    }
-
-    /**
-     * Add a single header line to the appropriate type-specific lookup table (but NOT to the master
-     * list of lines in mMetaData -- this must be done separately if desired).
-     *
-     * If a header line is present that has the same key as an existing line, it will not be added.  A warning
-     * will be shown if this occurs when GeneralUtils.DEBUG_MODE_ENABLED is true, otherwise this will occur
-     * silently.
-     *
-     * @param line header line to attempt to add to its type-specific lookup table
-     * @return true if the line was added to the appropriate lookup table, false if there was an existing
-     *         line with the same key and the new line was not added
-     */
-    private boolean addMetadataLineLookupEntry(final VCFHeaderLine line) {
-        if ( line instanceof VCFInfoHeaderLine )  {
-            final VCFInfoHeaderLine infoLine = (VCFInfoHeaderLine)line;
-            return addMetaDataLineMapLookupEntry(mInfoMetaData, infoLine.getID(), infoLine);
-        } else if ( line instanceof VCFFormatHeaderLine ) {
-            final VCFFormatHeaderLine formatLine = (VCFFormatHeaderLine)line;
-            return addMetaDataLineMapLookupEntry(mFormatMetaData, formatLine.getID(), formatLine);
-        } else if ( line instanceof VCFFilterHeaderLine ) {
-            final VCFFilterHeaderLine filterLine = (VCFFilterHeaderLine)line;
-            return addMetaDataLineMapLookupEntry(mFilterMetaData, filterLine.getID(), filterLine);
-        } else if ( line instanceof VCFContigHeaderLine ) {
-            return addContigMetaDataLineLookupEntry((VCFContigHeaderLine) line);
-        } else {
-            return addMetaDataLineMapLookupEntry(mOtherMetaData, line.getKey(), line);
-        }
-    }
-
-    /**
-     * Add a contig header line to the lookup list for contig lines (contigMetaData). If there's
-     * already a contig line with the same ID, does not add the line.
-     *
-     * Note: does not add the contig line to the master list of header lines in mMetaData --
-     *       this must be done separately if desired.
-     *
-     * @param line contig header line to add
-     * @return true if line was added to the list of contig lines, otherwise false
-     */
-    private boolean addContigMetaDataLineLookupEntry(final VCFContigHeaderLine line) {
-        for (VCFContigHeaderLine vcfContigHeaderLine : contigMetaData) {
-            // if we are trying to add a contig for the same ID
-            if (vcfContigHeaderLine.getID().equals(line.getID())) {
-                if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
-                    System.err.println("Found duplicate VCF contig header lines for " + line.getID() + "; keeping the first only" );
-                }
-                // do not add this contig if it exists
-                return false;
-            }
-        }
-
-        contigMetaData.add(line);
-        return true;
-    }
-
-    /**
-     * Add a header line to the provided map at a given key.  If the key already exists, it will not be replaced.
-     * If it does already exist and GeneralUtils.DEBUG_MODE_ENABLED is true, it will issue warnings about duplicates,
-     * otherwise it will silently leave the existing key/line pair as is.
-     *
-     * Note: does not add the header line to the master list of header lines in mMetaData --
-     *       this must be done separately if desired.
-     *
-     * @param map a map from each key to the associated VCFHeaderLine
-     * @param key the key to insert this line at
-     * @param line the line to insert at this key
-     * @param <T> a type of vcf header line that extends VCFHeaderLine
-     * @return true if the line was added to the map, false if it was not added because there's already a line with that key
-     */
-    private <T extends VCFHeaderLine> boolean addMetaDataLineMapLookupEntry(final Map<String, T> map, final String key, final T line) {
-        if ( map.containsKey(key) ) {
-            if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
-                System.err.println("Found duplicate VCF header lines for " + key + "; keeping the first only" );
-            }
-            return false;
-        }
-
-        map.put(key, line);
-        return true;
-    }
-
-    /**
-     * Check for the presence of a format line with the deprecated key {@link VCFConstants#GENOTYPE_LIKELIHOODS_KEY}.
-     * If one is present, and there isn't a format line with the key {@link VCFConstants#GENOTYPE_PL_KEY}, adds
-     * a new format line with the key {@link VCFConstants#GENOTYPE_PL_KEY}.
-     */
-    private void checkForDeprecatedGenotypeLikelihoodsKey() {
-        if ( hasFormatLine(VCFConstants.GENOTYPE_LIKELIHOODS_KEY) && ! hasFormatLine(VCFConstants.GENOTYPE_PL_KEY) ) {
-            if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
-                System.err.println("Found " + VCFConstants.GENOTYPE_LIKELIHOODS_KEY + " format, but no "
-                        + VCFConstants.GENOTYPE_PL_KEY + " field.  We now only manage PL fields internally"
-                        + " automatically adding a corresponding PL field to your VCF header");
-            }
-            addMetaDataLine(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_PL_KEY, VCFHeaderLineCount.G, VCFHeaderLineType.Integer, "Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification"));
-        }
-    }
-
-    /**
-     * get the header fields in order they're presented in the input file (which is now required to be
-     * the order presented in the spec).
-     *
-     * @return a set of the header fields, in order
-     */
-    public Set<HEADER_FIELDS> getHeaderFields() {
-        return new LinkedHashSet<HEADER_FIELDS>(Arrays.asList(HEADER_FIELDS.values()));
-    }
-
-    /**
-     * get the meta data, associated with this header, in sorted order
-     *
-     * @return a set of the meta data
-     */
-    public Set<VCFHeaderLine> getMetaDataInInputOrder() {
-        return makeGetMetaDataSet(mMetaData);
-    }
-
-    public Set<VCFHeaderLine> getMetaDataInSortedOrder() {
-        return makeGetMetaDataSet(new TreeSet<VCFHeaderLine>(mMetaData));
-    }
-
-    private static Set<VCFHeaderLine> makeGetMetaDataSet(final Set<VCFHeaderLine> headerLinesInSomeOrder) {
-        final Set<VCFHeaderLine> lines = new LinkedHashSet<VCFHeaderLine>();
-        lines.add(new VCFHeaderLine(VCFHeaderVersion.VCF4_2.getFormatString(), VCFHeaderVersion.VCF4_2.getVersionString()));
-        lines.addAll(headerLinesInSomeOrder);
-        return Collections.unmodifiableSet(lines);
-    }
-
-    /**
-     * Get the VCFHeaderLine whose key equals key.  Returns null if no such line exists
-     * @param key
-     * @return
-     */
-    public VCFHeaderLine getMetaDataLine(final String key) {
-        for (final VCFHeaderLine line: mMetaData) {
-            if ( line.getKey().equals(key) )
-                return line;
-        }
-
-        return null;
-    }
-
-    /**
-     * get the genotyping sample names
-     *
-     * @return a list of the genotype column names, which may be empty if hasGenotypingData() returns false
-     */
-    public List<String> getGenotypeSamples() {
-        return mGenotypeSampleNames;
-    }
-
-    public int getNGenotypeSamples() {
-        return mGenotypeSampleNames.size();
-    }
-
-    /**
-     * do we have genotyping data?
-     *
-     * @return true if we have genotyping columns, false otherwise
-     */
-    public boolean hasGenotypingData() {
-        return getNGenotypeSamples() > 0;
-    }
-
-    /**
-     * were the input samples sorted originally?
-     *
-     * @return true if the input samples were sorted originally, false otherwise
-     */
-    public boolean samplesWereAlreadySorted() {
-        return samplesWereAlreadySorted;
-    }
-
-    /** @return the column count */
-    public int getColumnCount() {
-        return HEADER_FIELDS.values().length + (hasGenotypingData() ? mGenotypeSampleNames.size() + 1 : 0);
-    }
-
-    /**
-     * Returns the INFO HeaderLines in their original ordering
-     */
-    public Collection<VCFInfoHeaderLine> getInfoHeaderLines() {
-        return mInfoMetaData.values();
-    }
-
-    /**
-     * Returns the FORMAT HeaderLines in their original ordering
-     */
-    public Collection<VCFFormatHeaderLine> getFormatHeaderLines() {
-        return mFormatMetaData.values();
-    }
-
-    /**
-     * @param id the header key name
-     * @return the meta data line, or null if there is none
-     */
-    public VCFInfoHeaderLine getInfoHeaderLine(final String id) {
-        return mInfoMetaData.get(id);
-    }
-
-    /**
-     * @param id    the header key name
-     * @return the meta data line, or null if there is none
-     */
-    public VCFFormatHeaderLine getFormatHeaderLine(final String id) {
-        return mFormatMetaData.get(id);
-    }
-
-    /**
-     * @param id    the header key name
-     * @return the meta data line, or null if there is none
-     */
-    public VCFFilterHeaderLine getFilterHeaderLine(final String id) {
-        return mFilterMetaData.get(id);
-    }
-
-    public boolean hasInfoLine(final String id) {
-        return getInfoHeaderLine(id) != null;
-    }
-
-    public boolean hasFormatLine(final String id) {
-        return getFormatHeaderLine(id) != null;
-    }
-
-    public boolean hasFilterLine(final String id) {
-        return getFilterHeaderLine(id) != null;
-    }
-
-    /**
-     * @param key    the header key name
-     * @return the meta data line, or null if there is none
-     */
-    public VCFHeaderLine getOtherHeaderLine(final String key) {
-        return mOtherMetaData.get(key);
-    }
-
-    /**
-     * Returns the other HeaderLines in their original ordering
-     */
-    public Collection<VCFHeaderLine> getOtherHeaderLines() {
-        return mOtherMetaData.values();
-    }
-
-    /**
-     * If true additional engine headers will be written to the VCF, otherwise only the walker headers will be output.
-     * @return true if additional engine headers will be written to the VCF
-     */
-    public boolean isWriteEngineHeaders() {
-        return writeEngineHeaders;
-    }
-
-    /**
-     * If true additional engine headers will be written to the VCF, otherwise only the walker headers will be output.
-     * @param writeEngineHeaders true if additional engine headers will be written to the VCF
-     */
-    public void setWriteEngineHeaders(final boolean writeEngineHeaders) {
-        this.writeEngineHeaders = writeEngineHeaders;
-    }
-
-    /**
-     * If true, and isWriteEngineHeaders also returns true, the command line will be written to the VCF.
-     * @return true if the command line will be written to the VCF
-     */
-    public boolean isWriteCommandLine() {
-        return writeCommandLine;
-    }
-
-    /**
-     * If true, and isWriteEngineHeaders also returns true, the command line will be written to the VCF.
-     * @param writeCommandLine true if the command line will be written to the VCF
-     */
-    public void setWriteCommandLine(final boolean writeCommandLine) {
-        this.writeCommandLine = writeCommandLine;
-    }
-
-    public ArrayList<String> getSampleNamesInOrder() {
-        return sampleNamesInOrder;
-    }
-
-    public HashMap<String, Integer> getSampleNameToOffset() {
-        return sampleNameToOffset;
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder b = new StringBuilder();
-        b.append("[VCFHeader:");
-        for ( final VCFHeaderLine line : mMetaData )
-            b.append("\n\t").append(line);
-        return b.append("\n]").toString();
-    }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFHeaderLine.java
deleted file mode 100644
index c4c1e3b..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeaderLine.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-
-import java.io.Serializable;
-import java.util.Map;
-
-
-/**
- * @author ebanks
- *         <p>
- *         Class VCFHeaderLine
- *         </p>
- *         <p>
- *         A class representing a key=value entry in the VCF header
- *         </p>
- */
-public class VCFHeaderLine implements Comparable, Serializable {
-    public static final long serialVersionUID = 1L;
-
-    protected static final boolean ALLOW_UNBOUND_DESCRIPTIONS = true;
-    protected static final String UNBOUND_DESCRIPTION = "Not provided in original VCF header";
-
-    private String mKey = null;
-    private String mValue = null;
-
-    /**
-     * create a VCF header line
-     *
-     * @param key     the key for this header line
-     * @param value   the value for this header line
-     */
-    public VCFHeaderLine(String key, String value) {
-        if ( key == null )
-            throw new IllegalArgumentException("VCFHeaderLine: key cannot be null");
-        if ( key.contains("<") || key.contains(">") )
-            throw new IllegalArgumentException("VCFHeaderLine: key cannot contain angle brackets");
-        if ( key.contains("=") )
-            throw new IllegalArgumentException("VCFHeaderLine: key cannot contain an equals sign");
-        mKey = key;
-        mValue = value;
-    }
-
-    /**
-     * Get the key
-     *
-     * @return the key
-     */
-    public String getKey() {
-        return mKey;
-    }
-
-    /**
-     * Get the value
-     *
-     * @return the value
-     */
-    public String getValue() {
-        return mValue;
-    }
-
-    /**
-     * By default the header lines won't be added to the dictionary, unless this method will be override (for example in FORMAT, INFO or FILTER header lines)
-     *
-     * @return false
-     */
-    public boolean shouldBeAddedToDictionary() {
-        return false;
-    }
-
-    public String toString() {
-        return toStringEncoding();
-    }
-
-    /**
-     * Should be overloaded in sub classes to do subclass specific
-     *
-     * @return the string encoding
-     */
-    protected String toStringEncoding() {
-        return mKey + "=" + mValue;
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if ( this == o ) {
-            return true;
-        }
-        if ( o == null || getClass() != o.getClass() ) {
-            return false;
-        }
-
-        final VCFHeaderLine that = (VCFHeaderLine) o;
-        return mKey.equals(that.mKey) &&                                             // key not nullable
-               (mValue != null ? mValue.equals(that.mValue) : that.mValue == null);  // value is nullable
-    }
-
-    @Override
-    public int hashCode() {
-        int result = mKey.hashCode();
-        result = 31 * result + (mValue != null ? mValue.hashCode() : 0);
-        return result;
-    }
-
-    public int compareTo(Object other) {
-        return toString().compareTo(other.toString());
-    }
-
-    /**
-     * @param line    the line
-     * @return true if the line is a VCF meta data line, or false if it is not
-     */
-    public static boolean isHeaderLine(String line) {
-        return line != null && !line.isEmpty() && VCFHeader.HEADER_INDICATOR.equals(line.substring(0,1));
-    }
-
-    /**
-     * create a string of a mapping pair for the target VCF version
-     * @param keyValues a mapping of the key->value pairs to output
-     * @return a string, correctly formatted
-     */
-    public static String toStringEncoding(Map<String, ? extends Object> keyValues) {
-        StringBuilder builder = new StringBuilder();
-        builder.append('<');
-        boolean start = true;
-        for (Map.Entry<String,?> entry : keyValues.entrySet()) {
-            if (start) start = false;
-            else builder.append(',');
-
-            if ( entry.getValue() == null ) throw new TribbleException.InternalCodecException("Header problem: unbound value at " + entry + " from " + keyValues);
-
-            builder.append(entry.getKey());
-            builder.append('=');
-            builder.append(entry.getValue().toString().contains(",") ||
-                           entry.getValue().toString().contains(" ") ||
-                           entry.getKey().equals("Description") ? "\""+ escapeQuotes(entry.getValue().toString()) + "\"" : entry.getValue());
-        }
-        builder.append('>');
-        return builder.toString();
-    }
-
-    private static String escapeQuotes(final String value) {
-        // java escaping in a string literal makes this harder to read than it should be
-        // without string literal escaping and quoting the regex would be: replaceAll( ([^\])" , $1\" )
-        // ie replace: something that's not a backslash ([^\]) followed by a double quote
-        // with: the thing that wasn't a backslash ($1), followed by a backslash, followed by a double quote
-        return value.replaceAll("([^\\\\])\"", "$1\\\\\"");
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineCount.java b/src/main/java/htsjdk/variant/vcf/VCFHeaderLineCount.java
deleted file mode 100644
index 080153a..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineCount.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-/**
- * the count encodings we use for fields in VCF header lines
- */
-public enum VCFHeaderLineCount {
-    INTEGER, A, R, G, UNBOUNDED;
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineTranslator.java b/src/main/java/htsjdk/variant/vcf/VCFHeaderLineTranslator.java
deleted file mode 100644
index 071d815..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineTranslator.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A class for translating between vcf header versions
- */
-public class VCFHeaderLineTranslator {
-    private static Map<VCFHeaderVersion,VCFLineParser> mapping;
-
-    static {
-        mapping = new HashMap<VCFHeaderVersion,VCFLineParser>();
-        mapping.put(VCFHeaderVersion.VCF4_0,new VCF4Parser());
-        mapping.put(VCFHeaderVersion.VCF4_1,new VCF4Parser());
-        mapping.put(VCFHeaderVersion.VCF4_2,new VCF4Parser());
-        mapping.put(VCFHeaderVersion.VCF3_3,new VCF3Parser());
-        mapping.put(VCFHeaderVersion.VCF3_2,new VCF3Parser());
-    }
-
-    public static Map<String,String> parseLine(VCFHeaderVersion version, String valueLine, List<String> expectedTagOrder) {
-        return mapping.get(version).parseLine(valueLine,expectedTagOrder);
-    }
-}
-
-
-interface VCFLineParser {
-    public Map<String,String> parseLine(String valueLine, List<String> expectedTagOrder);
-}
-
-
-/**
- * a class that handles the to and from disk for VCF 4 lines
- */
-class VCF4Parser implements VCFLineParser {
-    /**
-     * parse a VCF4 line
-     * @param valueLine the line
-     * @return a mapping of the tags parsed out
-     */
-    public Map<String, String> parseLine(String valueLine, List<String> expectedTagOrder) {
-        // our return map
-        Map<String, String> ret = new LinkedHashMap<String, String>();
-
-        // a builder to store up characters as we go
-        StringBuilder builder = new StringBuilder();
-
-        // store the key when we're parsing out the values
-        String key = "";
-
-        // where are we in the stream of characters?
-        int index = 0;
-
-        // are we inside a quotation? we don't special case ',' then
-        boolean inQuote = false;
-
-        // if we are in a quote and we see a backslash followed by quote, treat it as an escaped quote
-        boolean escape = false;
-
-        // a little switch machine to parse out the tags. Regex ended up being really complicated and ugly [yes, but this machine is getting ugly now... MAD]
-        for (char c: valueLine.toCharArray()) {
-            if ( c == '\"') {
-                if (escape) {
-                    builder.append(c);
-                    escape = false;
-                } else {
-                    inQuote = !inQuote;
-                }
-            } else if ( inQuote ) {
-                if (escape) {
-                    // in VCF 4.2 spec the only valid characters to escape are double quote and backslash; otherwise copy the backslash through
-                    if (c == '\\') {
-                        builder.append(c);
-                    } else {
-                        builder.append('\\');
-                        builder.append(c);
-                    }
-                    escape = false;
-                } else if (c != '\\') {
-                    builder.append(c);
-                } else {
-                    escape = true;
-                }
-            } else {
-                escape = false;
-                switch (c) {
-                    case ('<') : if (index == 0) break; // if we see a open bracket at the beginning, ignore it
-                    case ('>') : if (index == valueLine.length()-1) ret.put(key,builder.toString().trim()); break; // if we see a close bracket, and we're at the end, add an entry to our list
-                    case ('=') : key = builder.toString().trim(); builder = new StringBuilder(); break; // at an equals, copy the key and reset the builder
-                    case (',') : ret.put(key,builder.toString().trim()); builder = new StringBuilder(); break; // drop the current key value to the return map
-                    default: builder.append(c); // otherwise simply append to the current string
-                }
-            }
-            
-            index++;
-        }
-
-        if (inQuote) {
-            throw new TribbleException.InvalidHeader("Unclosed quote in header line value " + valueLine);
-        }
-
-        // validate the tags against the expected list
-        index = 0;
-        if ( expectedTagOrder != null ) {
-            if ( ret.size() > expectedTagOrder.size() )
-                throw new TribbleException.InvalidHeader("unexpected tag count " + ret.size() + " in line " + valueLine);
-            for ( String str : ret.keySet() ) {
-                if ( !expectedTagOrder.get(index).equals(str) )
-                    throw new TribbleException.InvalidHeader("Unexpected tag " + str + " in line " + valueLine);
-                index++;
-            }
-        }
-        return ret;
-    }
-}
-
-class VCF3Parser implements VCFLineParser {
-
-    public Map<String, String> parseLine(String valueLine, List<String> expectedTagOrder) {
-        // our return map
-        Map<String, String> ret = new LinkedHashMap<String, String>();
-
-        // a builder to store up characters as we go
-        StringBuilder builder = new StringBuilder();
-
-        // where are we in the stream of characters?
-        int index = 0;
-        // where in the expected tag order are we?
-        int tagIndex = 0;
-
-        // are we inside a quotation? we don't special case ',' then
-        boolean inQuote = false;
-
-        // a little switch machine to parse out the tags. Regex ended up being really complicated and ugly
-        for (char c: valueLine.toCharArray()) {
-            switch (c) {
-                case ('\"') : inQuote = !inQuote; break; // a quote means we ignore ',' in our strings, keep track of it
-                case (',') : if (!inQuote) { ret.put(expectedTagOrder.get(tagIndex++),builder.toString()); builder = new StringBuilder(); break; } // drop the current key value to the return map
-                default: builder.append(c); // otherwise simply append to the current string
-            }
-            index++;
-        }
-        ret.put(expectedTagOrder.get(tagIndex++),builder.toString());
-        
-        // validate the tags against the expected list
-        index = 0;
-        if (tagIndex != expectedTagOrder.size()) throw new IllegalArgumentException("Unexpected tag count " + tagIndex + ", we expected " + expectedTagOrder.size());
-        for (String str : ret.keySet()){
-            if (!expectedTagOrder.get(index).equals(str)) throw new IllegalArgumentException("Unexpected tag " + str + " in string " + valueLine);
-            index++;
-        }
-        return ret;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineType.java b/src/main/java/htsjdk/variant/vcf/VCFHeaderLineType.java
deleted file mode 100644
index 785449d..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-/**
- * the type encodings we use for fields in VCF header lines
- */
-public enum VCFHeaderLineType {
-    Integer, Float, String, Character, Flag;
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeaderVersion.java b/src/main/java/htsjdk/variant/vcf/VCFHeaderVersion.java
deleted file mode 100644
index b45d423..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeaderVersion.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-
-/**
- * information that identifies each header version
- */
-public enum VCFHeaderVersion {
-    VCF3_2("VCRv3.2","format"),
-    VCF3_3("VCFv3.3","fileformat"),
-    VCF4_0("VCFv4.0","fileformat"),
-    VCF4_1("VCFv4.1","fileformat"),
-    VCF4_2("VCFv4.2","fileformat");
-
-    private final String versionString;
-    private final String formatString;
-
-    /**
-     * create the enum, privately, using:
-     * @param vString the version string
-     * @param fString the format string
-     */
-    VCFHeaderVersion(String vString, String fString) {
-        this.versionString = vString;
-        this.formatString = fString;
-    }
-
-    /**
-     * get the header version
-     * @param version the version string
-     * @return a VCFHeaderVersion object
-     */
-    public static VCFHeaderVersion toHeaderVersion(String version) {
-        version = clean(version);
-        for (VCFHeaderVersion hv : VCFHeaderVersion.values())
-            if (hv.versionString.equals(version))
-                    return hv;
-        return null;
-    }
-
-    /**
-     * are we a valid version string of some type
-     * @param version the version string
-     * @return true if we're valid of some type, false otherwise
-     */
-    public static boolean isVersionString(String version){
-        return toHeaderVersion(version) != null;
-    }
-
-    /**
-     * are we a valid format string for some type
-     * @param format the format string
-     * @return true if we're valid of some type, false otherwise
-     */
-    public static boolean isFormatString(String format){
-        format = clean(format);
-        for (VCFHeaderVersion hv : VCFHeaderVersion.values())
-            if (hv.formatString.equals(format))
-                return true;
-        return false;
-    }
-
-    public static VCFHeaderVersion getHeaderVersion(String versionLine) {
-        String[] lineFields = versionLine.split("=");
-        if ( lineFields.length != 2 || !isFormatString(lineFields[0].substring(2)) )
-            throw new TribbleException.InvalidHeader(versionLine + " is not a valid VCF version line");
-
-        if ( !isVersionString(lineFields[1]) )
-            throw new TribbleException.InvalidHeader(lineFields[1] + " is not a supported version");
-
-        return toHeaderVersion(lineFields[1]);
-    }
-
-    /**
-     * Utility function to clean up a VCF header string
-     * 
-     * @param s string
-     * @return  trimmed version of s
-     */
-    private static String clean(String s) {
-        return s.trim();
-    }
-
-    /**
-     * Determines whether this version is at least as recent as a given version
-     *
-     * @param target   the target version to compare against
-     * @return true if this version is at least as recent as the target version, false otherwise
-     */
-    public boolean isAtLeastAsRecentAs(final VCFHeaderVersion target) {
-        switch (target) {
-            case VCF4_2:
-                return this == VCF4_2;
-            case VCF4_1:
-                return this == VCF4_1 || this == VCF4_2;
-            case VCF4_0:
-                return this != VCF3_2 && this != VCF3_3;
-            case VCF3_3:
-                return this != VCF3_2;
-            case VCF3_2:
-            default:
-                return true;
-        }
-    }
-
-    public String getVersionString() {
-        return versionString;
-    }
-
-    public String getFormatString() {
-        return formatString;
-    }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFIDHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFIDHeaderLine.java
deleted file mode 100644
index 246f89e..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFIDHeaderLine.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-/** an interface for ID-based header lines **/
-public interface VCFIDHeaderLine {
-    String getID();
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFInfoHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFInfoHeaderLine.java
deleted file mode 100644
index afa1f81..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFInfoHeaderLine.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-
-/**
- * @author ebanks
- *         <p>
- *         Class VCFInfoHeaderLine
- *         </p>
- *         <p>
- *         A class representing a key=value entry for INFO fields in the VCF header
- *         </p>
- */
-public class VCFInfoHeaderLine extends VCFCompoundHeaderLine {
-    public VCFInfoHeaderLine(String name, int count, VCFHeaderLineType type, String description) {
-        super(name, count, type, description, SupportedHeaderLineType.INFO);
-    }
-
-    public VCFInfoHeaderLine(String name, VCFHeaderLineCount count, VCFHeaderLineType type, String description) {
-        super(name, count, type, description, SupportedHeaderLineType.INFO);
-    }
-
-    public VCFInfoHeaderLine(String line, VCFHeaderVersion version) {
-        super(line, version, SupportedHeaderLineType.INFO);
-    }
-
-    // info fields allow flag values
-    @Override
-    boolean allowFlagValues() {
-        return true;
-    }
-
-    @Override
-    public boolean shouldBeAddedToDictionary() {
-        return true;
-    }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFRecordCodec.java b/src/main/java/htsjdk/variant/vcf/VCFRecordCodec.java
deleted file mode 100644
index 8fe9b67..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFRecordCodec.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.SortingCollection;
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.PrintStream;
-
-/**
- * Writes VariantContext instances to an OutputStream without headers or metadata. For use
- * with SortingCollection ONLY.
- */
-public class VCFRecordCodec implements SortingCollection.Codec<VariantContext> {
-	private final VCFCodec vcfDecoder = new VCFCodec();
-	private final VCFEncoder vcfEncoder;
-	private PrintStream outputStream = null;
-	private BufferedReader inputReader = null;
-
-	public VCFRecordCodec(final VCFHeader header) {
-		this(header, false);
-    }
-
-	public VCFRecordCodec(final VCFHeader header, final boolean allowMissingFieldsInHeader) {
-		this.vcfEncoder = new VCFEncoder(header, allowMissingFieldsInHeader, false);
-		// Explicitly set the version because it's not available in the header itself.
-		this.vcfDecoder.setVCFHeader(header, VCFHeaderVersion.VCF4_2);
-	}
-
-	@Override
-	public void setOutputStream(final OutputStream stream) {
-		this.outputStream = new PrintStream(stream);
-	}
-
-	@Override
-	public void setInputStream(final InputStream stream) {
-		this.inputReader = new BufferedReader(new InputStreamReader(stream));
-	}
-
-	@Override
-	public void encode(final VariantContext context) {
-		this.outputStream.println(this.vcfEncoder.encode(context));
-	}
-
-	@Override
-	public VariantContext decode() {
-		try {
-			final String line;
-			return ((line = inputReader.readLine()) != null) ? this.vcfDecoder.decode(line) : null;
-		} catch (final IOException ioe) {
-			throw new RuntimeIOException("Could not decode/read a VCF record for a sorting collection: " + ioe.getMessage(), ioe);
-		}
-	}
-
-	@Override
-	public VCFRecordCodec clone() {
-		return new VCFRecordCodec(this.vcfEncoder.getVCFHeader(), this.vcfEncoder.getAllowMissingFieldsInHeader());
-	}
-}
-
diff --git a/src/main/java/htsjdk/variant/vcf/VCFSimpleHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFSimpleHeaderLine.java
deleted file mode 100644
index a5da687..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFSimpleHeaderLine.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-
-/**
- * @author ebanks
- * 
- * A class representing a key=value entry for simple VCF header types
- */
-public class VCFSimpleHeaderLine extends VCFHeaderLine implements VCFIDHeaderLine {
-
-    private String name;
-    private Map<String, String> genericFields = new LinkedHashMap<String, String>();
-
-    /**
-     * create a VCF filter header line
-     *
-     * @param key            the key for this header line
-     * @param name           the name for this header line
-     * @param description    description for this header line
-     */
-    public VCFSimpleHeaderLine(String key, String name, String description) {
-        super(key, "");
-        Map<String, String> map = new LinkedHashMap<String, String>(1);
-        map.put("Description", description);
-        initialize(name, map);
-    }
-
-    /**
-     * create a VCF info header line
-     *
-     * @param line      the header line
-     * @param version   the vcf header version
-     * @param key            the key for this header line
-     * @param expectedTagOrdering the tag ordering expected for this header line
-     */
-    public VCFSimpleHeaderLine(final String line, final VCFHeaderVersion version, final String key, final List<String> expectedTagOrdering) {
-        this(key, VCFHeaderLineTranslator.parseLine(version, line, expectedTagOrdering));
-    }
-
-    public VCFSimpleHeaderLine(final String key, final Map<String, String> mapping) {
-        super(key, "");
-        name = mapping.get("ID");
-        initialize(name, mapping);
-    }
-
-	/**
-	 * Returns the String value associated with the given key. Returns null if there is no value. Key
-	 * must not be null.
-	 */
-	String getGenericFieldValue(final String key) {
-		return this.genericFields.get(key);
-	}
-
-    protected void initialize(String name, Map<String, String> genericFields) {
-        if ( name == null || genericFields == null || genericFields.isEmpty() )
-            throw new IllegalArgumentException(String.format("Invalid VCFSimpleHeaderLine: key=%s name=%s", super.getKey(), name));
-        if ( name.contains("<") || name.contains(">") )
-            throw new IllegalArgumentException("VCFHeaderLine: ID cannot contain angle brackets");
-        if ( name.contains("=") )
-            throw new IllegalArgumentException("VCFHeaderLine: ID cannot contain an equals sign");
-
-        this.name = name;
-        this.genericFields.putAll(genericFields);
-    }
-
-    protected String toStringEncoding() {
-        Map<String, Object> map = new LinkedHashMap<String, Object>();
-        map.put("ID", name);
-        map.putAll(genericFields);
-        return getKey() + "=" + VCFHeaderLine.toStringEncoding(map);
-    }
-
-    @Override
-    public boolean equals( final Object o ) {
-        if ( this == o ) {
-            return true;
-        }
-        if ( o == null || getClass() != o.getClass() || ! super.equals(o) ) {
-            return false;
-        }
-
-        final VCFSimpleHeaderLine that = (VCFSimpleHeaderLine) o;
-        return name.equals(that.name) &&
-               genericFields.equals(that.genericFields);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + name.hashCode();
-        result = 31 * result + genericFields.hashCode();
-        return result;
-    }
-
-    public String getID() {
-        return name;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/vcf/VCFStandardHeaderLines.java b/src/main/java/htsjdk/variant/vcf/VCFStandardHeaderLines.java
deleted file mode 100644
index de2817c..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFStandardHeaderLines.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.utils.GeneralUtils;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Manages header lines for standard VCF <pre>INFO</pre> and <pre>FORMAT</pre> fields.
- *
- * Provides simple mechanisms for
- *  1) registering standard lines,
- *  2) looking them up, and
- *  3) adding them to headers.
- *
- * @author Mark DePristo
- * @since 6/12
- */
-public class VCFStandardHeaderLines {
-    /**
-     * Enabling this causes us to repair header lines even if only their descriptions differ.
-     */
-    private final static boolean REPAIR_BAD_DESCRIPTIONS = false;
-    private static Standards<VCFFormatHeaderLine> formatStandards = new Standards<VCFFormatHeaderLine>();
-    private static Standards<VCFInfoHeaderLine> infoStandards = new Standards<VCFInfoHeaderLine>();
-
-    /**
-     * Walks over the VCF header and repairs the standard VCF header lines in it, returning a freshly
-     * allocated {@link VCFHeader} with standard VCF header lines repaired as necessary.
-     */
-    public static VCFHeader repairStandardHeaderLines(final VCFHeader header) {
-        final Set<VCFHeaderLine> newLines = new LinkedHashSet<VCFHeaderLine>(header.getMetaDataInInputOrder().size());
-        for ( VCFHeaderLine line : header.getMetaDataInInputOrder() ) {
-            if ( line instanceof VCFFormatHeaderLine ) {
-                line = formatStandards.repair((VCFFormatHeaderLine) line);
-            } else if ( line instanceof VCFInfoHeaderLine) {
-                line = infoStandards.repair((VCFInfoHeaderLine) line);
-            }
-
-            newLines.add(line);
-        }
-
-        return new VCFHeader(newLines, header.getGenotypeSamples());
-    }
-
-    /**
-     * Adds header lines for each of the format fields in IDs to header, returning the set of
-     * {@code IDs} without standard descriptions, unless {@code throwErrorForMissing} is true, in which
-     * case this situation results in a {@link TribbleException}
-     */
-    public static Set<String> addStandardFormatLines(final Set<VCFHeaderLine> headerLines, final boolean throwErrorForMissing, final Collection<String> IDs) {
-        return formatStandards.addToHeader(headerLines, IDs, throwErrorForMissing);
-    }
-
-    /**
-     * @see #addStandardFormatLines(java.util.Set, boolean, java.util.Collection)
-     */
-    public static Set<String> addStandardFormatLines(final Set<VCFHeaderLine> headerLines, final boolean throwErrorForMissing, final String ... IDs) {
-        return addStandardFormatLines(headerLines, throwErrorForMissing, Arrays.asList(IDs));
-    }
-
-    /**
-     * Returns the standard format line for {@code ID}.
-     * If none exists, return null or throw an exception, depending on {@code throwErrorForMissing}.
-     */
-    public static VCFFormatHeaderLine getFormatLine(final String ID, final boolean throwErrorForMissing) {
-        return formatStandards.get(ID, throwErrorForMissing);
-    }
-
-    /**
-     * Returns the standard format line for {@code ID}.
-     * If none exists, throw an {@link TribbleException}
-     */
-    public static VCFFormatHeaderLine getFormatLine(final String ID) {
-        return formatStandards.get(ID, true);
-    }
-
-    /**
-     * Adds header lines for each of the info fields in {@code IDs} to header, returning the set of
-     * IDs without standard descriptions, unless {@code throwErrorForMissing} is true, in which
-     * case this situation results in a {@link TribbleException}.
-     */
-    public static Set<String> addStandardInfoLines(final Set<VCFHeaderLine> headerLines, final boolean throwErrorForMissing, final Collection<String> IDs) {
-        return infoStandards.addToHeader(headerLines, IDs, throwErrorForMissing);
-    }
-
-    /**
-     * @see #addStandardFormatLines(java.util.Set, boolean, java.util.Collection)
-     */
-    public static Set<String> addStandardInfoLines(final Set<VCFHeaderLine> headerLines, final boolean throwErrorForMissing, final String ... IDs) {
-        return addStandardInfoLines(headerLines, throwErrorForMissing, Arrays.asList(IDs));
-    }
-
-    /**
-     * Returns the standard info line for {@code ID}.
-     * If none exists, return {@code null} or throw a {@link TribbleException}, depending on {@code throwErrorForMissing}.
-     */
-    public static VCFInfoHeaderLine getInfoLine(final String ID, final boolean throwErrorForMissing) {
-        return infoStandards.get(ID, throwErrorForMissing);
-    }
-
-    /**
-     * Returns the standard info line for {@code ID}.
-     * If none exists throw a {@link TribbleException}.
-     */
-    public static VCFInfoHeaderLine getInfoLine(final String ID) {
-        return getInfoLine(ID, true);
-    }
-
-
-    private static void registerStandard(final VCFInfoHeaderLine line) {
-        infoStandards.add(line);
-    }
-
-    private static void registerStandard(final VCFFormatHeaderLine line) {
-        formatStandards.add(line);
-    }
-
-    //
-    // VCF header line constants
-    //
-    static {
-        // FORMAT lines
-        registerStandard(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_KEY,           1,                            VCFHeaderLineType.String,  "Genotype"));
-        registerStandard(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_QUALITY_KEY,   1,                            VCFHeaderLineType.Integer, "Genotype Quality"));
-        registerStandard(new VCFFormatHeaderLine(VCFConstants.DEPTH_KEY,              1,                            VCFHeaderLineType.Integer, "Approximate read depth (reads with MQ=255 or with bad mates are filtered)"));
-        registerStandard(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_PL_KEY,        VCFHeaderLineCount.G,         VCFHeaderLineType.Integer, "Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification"));
-        registerStandard(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_ALLELE_DEPTHS, VCFHeaderLineCount.R,         VCFHeaderLineType.Integer, "Allelic depths for the ref and alt alleles in the order listed"));
-        registerStandard(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_FILTER_KEY,    VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String,  "Genotype-level filter"));
-        registerStandard(new VCFFormatHeaderLine(VCFConstants.PHASE_QUALITY_KEY,      1,                            VCFHeaderLineType.Float,   "Read-backed phasing quality"));
-
-        // INFO lines
-        registerStandard(new VCFInfoHeaderLine(VCFConstants.END_KEY,                  1,                    VCFHeaderLineType.Integer, "Stop position of the interval"));
-        registerStandard(new VCFInfoHeaderLine(VCFConstants.DBSNP_KEY,                0,                    VCFHeaderLineType.Flag,    "dbSNP Membership"));
-        registerStandard(new VCFInfoHeaderLine(VCFConstants.DEPTH_KEY,                1,                    VCFHeaderLineType.Integer, "Approximate read depth; some reads may have been filtered"));
-        registerStandard(new VCFInfoHeaderLine(VCFConstants.STRAND_BIAS_KEY,          1,                    VCFHeaderLineType.Float,   "Strand Bias"));
-        registerStandard(new VCFInfoHeaderLine(VCFConstants.ALLELE_FREQUENCY_KEY,     VCFHeaderLineCount.A, VCFHeaderLineType.Float,   "Allele Frequency, for each ALT allele, in the same order as listed"));
-        registerStandard(new VCFInfoHeaderLine(VCFConstants.ALLELE_COUNT_KEY,         VCFHeaderLineCount.A, VCFHeaderLineType.Integer, "Allele count in genotypes, for each ALT allele, in the same order as listed"));
-        registerStandard(new VCFInfoHeaderLine(VCFConstants.ALLELE_NUMBER_KEY,        1,                    VCFHeaderLineType.Integer, "Total number of alleles in called genotypes"));
-        registerStandard(new VCFInfoHeaderLine(VCFConstants.MAPPING_QUALITY_ZERO_KEY, 1,                    VCFHeaderLineType.Integer, "Total Mapping Quality Zero Reads"));
-        registerStandard(new VCFInfoHeaderLine(VCFConstants.RMS_MAPPING_QUALITY_KEY,  1,                    VCFHeaderLineType.Float,   "RMS Mapping Quality"));
-        registerStandard(new VCFInfoHeaderLine(VCFConstants.SOMATIC_KEY,              0,                    VCFHeaderLineType.Flag,    "Somatic event"));
-    }
-
-    private static class Standards<T extends VCFCompoundHeaderLine> {
-        private final Map<String, T> standards = new HashMap<String, T>();
-
-        public T repair(final T line) {
-            final T standard = get(line.getID(), false);
-            if ( standard != null ) {
-                final boolean badCountType = line.getCountType() != standard.getCountType();
-                final boolean badCount     = line.isFixedCount() && ! badCountType && line.getCount() != standard.getCount();
-                final boolean badType      = line.getType() != standard.getType();
-                final boolean badDesc      = ! line.getDescription().equals(standard.getDescription());
-                final boolean needsRepair  = badCountType || badCount || badType || (REPAIR_BAD_DESCRIPTIONS && badDesc);
-
-                if ( needsRepair ) {
-                    if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
-                        System.err.println("Repairing standard header line for field " + line.getID() + " because"
-                                           + (badCountType ? " -- count types disagree; header has " + line.getCountType() + " but standard is " + standard.getCountType() : "")
-                                           + (badType ? " -- type disagree; header has " + line.getType() + " but standard is " + standard.getType() : "")
-                                           + (badCount ? " -- counts disagree; header has " + line.getCount() + " but standard is " + standard.getCount() : "")
-                                           + (badDesc ? " -- descriptions disagree; header has '" + line.getDescription() + "' but standard is '" + standard.getDescription() + "'": ""));
-                    }
-                    return standard;
-                } else {
-                    return line;
-                }
-            } else {
-                return line;
-            }
-        }
-
-        public Set<String> addToHeader(final Set<VCFHeaderLine> headerLines, final Collection<String> IDs, final boolean throwErrorForMissing) {
-            final Set<String> missing = new HashSet<String>();
-            for ( final String ID : IDs ) {
-                final T line = get(ID, throwErrorForMissing);
-                if ( line == null )
-                    missing.add(ID);
-                else
-                    headerLines.add(line);
-            }
-
-            return missing;
-        }
-
-        public void add(final T line) {
-            if ( standards.containsKey(line.getID()) ) {
-                throw new TribbleException("Attempting to add multiple standard header lines for ID " + line.getID());
-            }
-            standards.put(line.getID(), line);
-        }
-
-        public T get(final String ID, final boolean throwErrorForMissing) {
-            final T x = standards.get(ID);
-            if ( throwErrorForMissing && x == null ) {
-                throw new TribbleException("Couldn't find a standard VCF header line for field " + ID);
-            }
-            return x;
-        }
-    }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFUtils.java b/src/main/java/htsjdk/variant/vcf/VCFUtils.java
deleted file mode 100644
index c8eceea..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFUtils.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.variant.utils.GeneralUtils;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-public class VCFUtils {
-
-    public static Set<VCFHeaderLine> smartMergeHeaders(final Collection<VCFHeader> headers, final boolean emitWarnings) throws IllegalStateException {
-        // We need to maintain the order of the VCFHeaderLines, otherwise they will be scrambled in the returned Set.
-        // This will cause problems for VCFHeader.getSequenceDictionary and anything else that implicitly relies on the line ordering.
-        final TreeMap<String, VCFHeaderLine> map = new TreeMap<String, VCFHeaderLine>(); // from KEY.NAME -> line
-        final HeaderConflictWarner conflictWarner = new HeaderConflictWarner(emitWarnings);
-
-        // todo -- needs to remove all version headers from sources and add its own VCF version line
-        for ( final VCFHeader source : headers ) {
-            //System.out.printf("Merging in header %s%n", source);
-            for ( final VCFHeaderLine line : source.getMetaDataInSortedOrder()) {
-
-                String key = line.getKey();
-                if ( line instanceof VCFIDHeaderLine )
-                    key = key + "-" + ((VCFIDHeaderLine)line).getID();
-
-                if ( map.containsKey(key) ) {
-                    final VCFHeaderLine other = map.get(key);
-                    if ( line.equals(other) ) {
-                        // continue;
-                    } else if ( ! line.getClass().equals(other.getClass()) ) {
-                        throw new IllegalStateException("Incompatible header types: " + line + " " + other );
-                    } else if ( line instanceof VCFFilterHeaderLine ) {
-                        final String lineName = ((VCFFilterHeaderLine) line).getID();
-                        final String otherName = ((VCFFilterHeaderLine) other).getID();
-                        if ( ! lineName.equals(otherName) )
-                            throw new IllegalStateException("Incompatible header types: " + line + " " + other );
-                    } else if ( line instanceof VCFCompoundHeaderLine ) {
-                        final VCFCompoundHeaderLine compLine = (VCFCompoundHeaderLine)line;
-                        final VCFCompoundHeaderLine compOther = (VCFCompoundHeaderLine)other;
-
-                        // if the names are the same, but the values are different, we need to quit
-                        if (! (compLine).equalsExcludingDescription(compOther) ) {
-                            if ( compLine.getType().equals(compOther.getType()) ) {
-                                // The Number entry is an Integer that describes the number of values that can be
-                                // included with the INFO field. For example, if the INFO field contains a single
-                                // number, then this value should be 1. However, if the INFO field describes a pair
-                                // of numbers, then this value should be 2 and so on. If the number of possible
-                                // values varies, is unknown, or is unbounded, then this value should be '.'.
-                                conflictWarner.warn(line, "Promoting header field Number to . due to number differences in header lines: " + line + " " + other);
-                                compOther.setNumberToUnbounded();
-                            } else if ( compLine.getType() == VCFHeaderLineType.Integer && compOther.getType() == VCFHeaderLineType.Float ) {
-                                // promote key to Float
-                                conflictWarner.warn(line, "Promoting Integer to Float in header: " + compOther);
-                                map.put(key, compOther);
-                            } else if ( compLine.getType() == VCFHeaderLineType.Float && compOther.getType() == VCFHeaderLineType.Integer ) {
-                                // promote key to Float
-                                conflictWarner.warn(line, "Promoting Integer to Float in header: " + compOther);
-                            } else {
-                                throw new IllegalStateException("Incompatible header types, collision between these two types: " + line + " " + other );
-                            }
-                        }
-                        if ( ! compLine.getDescription().equals(compOther.getDescription()) )
-                            conflictWarner.warn(line, "Allowing unequal description fields through: keeping " + compOther + " excluding " + compLine);
-                    } else {
-                        // we are not equal, but we're not anything special either
-                        conflictWarner.warn(line, "Ignoring header line already in map: this header line = " + line + " already present header = " + other);
-                    }
-                } else {
-                    map.put(key, line);
-                    //System.out.printf("Adding header line %s%n", line);
-                }
-            }
-        }
-        // returning a LinkedHashSet so that ordering will be preserved. Ensures the contig lines do not get scrambled.
-        return new LinkedHashSet<VCFHeaderLine>(map.values());
-    }
-
-    /**
-     * Add / replace the contig header lines in the VCFHeader with the in the reference file and master reference dictionary
-     *
-     * @param oldHeader the header to update
-     * @param referenceFile the file path to the reference sequence used to generate this vcf
-     * @param refDict the SAM formatted reference sequence dictionary
-     */
-    public static VCFHeader withUpdatedContigs(final VCFHeader oldHeader, final File referenceFile, final SAMSequenceDictionary refDict) {
-        return new VCFHeader(withUpdatedContigsAsLines(oldHeader.getMetaDataInInputOrder(), referenceFile, refDict), oldHeader.getGenotypeSamples());
-    }
-
-    public static Set<VCFHeaderLine> withUpdatedContigsAsLines(final Set<VCFHeaderLine> oldLines, final File referenceFile, final SAMSequenceDictionary refDict) {
-        return withUpdatedContigsAsLines(oldLines, referenceFile, refDict, false);
-    }
-
-    public static Set<VCFHeaderLine> withUpdatedContigsAsLines(final Set<VCFHeaderLine> oldLines, final File referenceFile, final SAMSequenceDictionary refDict, final boolean referenceNameOnly) {
-        final Set<VCFHeaderLine> lines = new LinkedHashSet<VCFHeaderLine>(oldLines.size());
-
-        for ( final VCFHeaderLine line : oldLines ) {
-            if ( line instanceof VCFContigHeaderLine )
-                continue; // skip old contig lines
-            if ( line.getKey().equals(VCFHeader.REFERENCE_KEY) )
-                continue; // skip the old reference key
-            lines.add(line);
-        }
-
-        for ( final VCFHeaderLine contigLine : makeContigHeaderLines(refDict, referenceFile) )
-            lines.add(contigLine);
-
-        final String referenceValue;
-        if (referenceFile != null) {
-            if (referenceNameOnly) {
-                final int extensionStart = referenceFile.getName().lastIndexOf('.');
-                referenceValue = extensionStart == -1 ? referenceFile.getName() : referenceFile.getName().substring(0, extensionStart);
-            }
-            else {
-                referenceValue = "file://" + referenceFile.getAbsolutePath();
-            }
-            lines.add(new VCFHeaderLine(VCFHeader.REFERENCE_KEY, referenceValue));
-        }
-        return lines;
-    }
-
-    /**
-     * Create VCFHeaderLines for each refDict entry, and optionally the assembly if referenceFile != null
-     * @param refDict reference dictionary
-     * @param referenceFile for assembly name.  May be null
-     * @return list of vcf contig header lines
-     */
-    public static List<VCFContigHeaderLine> makeContigHeaderLines(final SAMSequenceDictionary refDict,
-                                                                  final File referenceFile) {
-        final List<VCFContigHeaderLine> lines = new ArrayList<VCFContigHeaderLine>();
-        final String assembly = referenceFile != null ? getReferenceAssembly(referenceFile.getName()) : null;
-        for ( final SAMSequenceRecord contig : refDict.getSequences() )
-            lines.add(makeContigHeaderLine(contig, assembly));
-        return lines;
-    }
-
-    private static VCFContigHeaderLine makeContigHeaderLine(final SAMSequenceRecord contig, final String assembly) {
-        final Map<String, String> map = new LinkedHashMap<String, String>(3);
-        map.put("ID", contig.getSequenceName());
-        map.put("length", String.valueOf(contig.getSequenceLength()));
-        if ( assembly != null ) map.put("assembly", assembly);
-        return new VCFContigHeaderLine(map, contig.getSequenceIndex());
-    }
-
-    private static String getReferenceAssembly(final String refPath) {
-        // This doesn't need to be perfect as it's not a required VCF header line, but we might as well give it a shot
-        String assembly = null;
-        if (refPath.contains("b37") || refPath.contains("v37"))
-            assembly = "b37";
-        else if (refPath.contains("b36"))
-            assembly = "b36";
-        else if (refPath.contains("hg18"))
-            assembly = "hg18";
-        else if (refPath.contains("hg19"))
-            assembly = "hg19";
-        return assembly;
-    }
-
-    /** Only displays a warning if warnings are enabled and an identical warning hasn't been already issued */
-    private static final class HeaderConflictWarner {
-        boolean emitWarnings;
-        Set<String> alreadyIssued = new HashSet<String>();
-
-        private HeaderConflictWarner( final boolean emitWarnings ) {
-            this.emitWarnings = emitWarnings;
-        }
-
-        public void warn(final VCFHeaderLine line, final String msg) {
-            if ( GeneralUtils.DEBUG_MODE_ENABLED && emitWarnings && ! alreadyIssued.contains(line.getKey()) ) {
-                alreadyIssued.add(line.getKey());
-                System.err.println(msg);
-            }
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/cram/io/ExternalCompressionTest.java b/src/test/java/htsjdk/cram/io/ExternalCompressionTest.java
deleted file mode 100644
index 09f6e49..0000000
--- a/src/test/java/htsjdk/cram/io/ExternalCompressionTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import org.apache.commons.compress.utils.IOUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.file.Files;
-
-public class ExternalCompressionTest {
-    public static final File BZIP2_FILE = new File("src/test/resources/htsjdk/samtools/cram/io/bzip2-test.bz2");
-    public static final byte [] TEST_BYTES = "This is a simple string to test BZip2".getBytes();
-
-    @Test
-    public void testBZip2Decompression() throws IOException {
-        final byte [] input = Files.readAllBytes(BZIP2_FILE.toPath());
-        final byte [] output = ExternalCompression.unbzip2(input);
-        Assert.assertEquals(output, "BZip2 worked".getBytes());
-    }
-
-    @Test
-    public void testBZip2Roundtrip() throws IOException {
-        final byte [] compressed = ExternalCompression.bzip2(TEST_BYTES);
-        final byte [] restored = ExternalCompression.unbzip2(compressed);
-        Assert.assertEquals(TEST_BYTES, restored);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/AbstractBAMFileIndexTest.java b/src/test/java/htsjdk/samtools/AbstractBAMFileIndexTest.java
deleted file mode 100644
index 74c2dd7..0000000
--- a/src/test/java/htsjdk/samtools/AbstractBAMFileIndexTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-public class AbstractBAMFileIndexTest {
-
-    /**
-     * @see <a href="https://github.com/samtools/htsjdk/issues/73">https://github.com/samtools/htsjdk/issues/73</a>
-     */
-    @Test
-    public static void avoidDataExhaustionTest() {
-        final AbstractBAMFileIndex.IndexStreamBuffer buffer = new AbstractBAMFileIndex.IndexStreamBuffer(new SeekableStream() {
-            @Override
-            public long length() {
-                return 0;
-            }
-
-            @Override
-            public long position() throws IOException {
-                return 0;
-            }
-
-            @Override
-            public void seek(final long position) throws IOException {
-
-            }
-
-            @Override
-            public int read(final byte[] buffer, final int offset, final int length) throws IOException {
-                return 2; // This is the important line; pretend we feed 2 bytes at a time, which is fewer than any downstream calls ultimately request
-            }
-
-            @Override
-            public void close() throws IOException {
-
-            }
-
-            @Override
-            public boolean eof() throws IOException {
-                return false;
-            }
-
-            @Override
-            public String getSource() {
-                return null;
-            }
-
-            @Override
-            public int read() throws IOException {
-                return 0;
-            }
-        });
-
-        // Ensure these throw no exceptions
-        buffer.readLong();
-        buffer.readInteger();
-        buffer.readBytes(new byte[10000]);
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/BAMCigarOverflowTest.java b/src/test/java/htsjdk/samtools/BAMCigarOverflowTest.java
deleted file mode 100644
index dd630f9..0000000
--- a/src/test/java/htsjdk/samtools/BAMCigarOverflowTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.annotations.Test;
-import static org.testng.Assert.assertEquals;
-
-import java.io.File;
-
-/**
- * Test the fix of a bug reported by s-andrews in which the use of an arithmetic rather than a logical right shift in BinaryCigarCodec.binaryCigarToCigarElement()
- * causes an overflow in the CIGAR when reading a BAM file for a read that spans a very large intron.
- */
-public class BAMCigarOverflowTest {
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
-    @Test
-    public void testCigarOverflow() throws Exception {
-        final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.LENIENT).open(new File(TEST_DATA_DIR, "BAMCigarOverflowTest/CigarOverflowTest.bam"));
-
-        //Load the single read from the BAM file.
-        final SAMRecord testBAMRecord = reader.iterator().next();
-        CloserUtil.close(reader);
-
-        //The BAM file that exposed the bug triggered a SAM validation error because the bin field of the BAM record did not equal the computed value. Here we test for this error.
-        //Cast to int to avoid an ambiguity in the assertEquals() call between assertEquals(int,int) and assertEquals(Object,Object).
-        assertEquals(testBAMRecord.computeIndexingBin(), (int) testBAMRecord.getIndexingBin());
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/BAMFileIndexTest.java b/src/test/java/htsjdk/samtools/BAMFileIndexTest.java
deleted file mode 100755
index 170bc47..0000000
--- a/src/test/java/htsjdk/samtools/BAMFileIndexTest.java
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.StopWatch;
-import htsjdk.samtools.util.StringUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Test BAM file indexing.
- */
-public class BAMFileIndexTest {
-    private final File BAM_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
-    private final boolean mVerbose = false;
-
-    @Test
-    public void testGetSearchBins()
-            throws Exception {
-        final DiskBasedBAMFileIndex bfi = new DiskBasedBAMFileIndex(new File(BAM_FILE.getPath() + ".bai"),
-                null);    // todo can null be replaced with a Sequence dictionary for the BAM_FILE?
-        final long[] bins = bfi.getSpanOverlapping(1, 0, 0).toCoordinateArray();
-        /***
-         if (bins == null) {
-         System.out.println("Search bins: " + bins);
-         return;
-         }
-         System.out.println("Search bins:");
-         for (int i = 0; i < bins.length; i++) {
-         System.out.println(" " + Long.toHexString(bins[i]));
-         }
-         ***/
-        assertNotNull(bins);
-        assertEquals(bins.length, 2);
-    }
-
-    @Test
-    public void testSpecificQueries()
-            throws Exception {
-        assertEquals(runQueryTest(BAM_FILE, "chrM", 10400, 10600, true), 1);
-        assertEquals(runQueryTest(BAM_FILE, "chrM", 10400, 10600, false), 2);
-    }
-
-    @Test(groups = {"slow"})
-    public void testRandomQueries()
-            throws Exception {
-        runRandomTest(BAM_FILE, 1000, new Random());
-    }
-
-    @Test
-    public void testWholeChromosomes() {
-        checkChromosome("chrM", 23);
-        checkChromosome("chr1", 885);
-        checkChromosome("chr2", 837);
-        /***
-         checkChromosome("chr3", 683);
-         checkChromosome("chr4", 633);
-         checkChromosome("chr5", 611);
-         checkChromosome("chr6", 585);
-         checkChromosome("chr7", 521);
-         checkChromosome("chr8", 507);
-         checkChromosome("chr9", 388);
-         checkChromosome("chr10", 477);
-         checkChromosome("chr11", 467);
-         checkChromosome("chr12", 459);
-         checkChromosome("chr13", 327);
-         checkChromosome("chr14", 310);
-         checkChromosome("chr15", 280);
-         checkChromosome("chr16", 278);
-         checkChromosome("chr17", 269);
-         checkChromosome("chr18", 265);
-         checkChromosome("chr19", 178);
-         checkChromosome("chr20", 228);
-         checkChromosome("chr21", 123);
-         checkChromosome("chr22", 121);
-         checkChromosome("chrX", 237);
-         checkChromosome("chrY", 29);
-         ***/
-    }
-
-    @Test
-    public void testQueryUnmapped() {
-        final StopWatch linearScan = new StopWatch();
-        final StopWatch queryUnmapped = new StopWatch();
-        int unmappedCountFromLinearScan = 0;
-        final File bamFile = BAM_FILE;
-        final SamReader reader = SamReaderFactory.makeDefault().open(bamFile);
-        linearScan.start();
-        CloseableIterator<SAMRecord> it = reader.iterator();
-        int mappedCount = 0;
-        while (it.hasNext()) {
-            final SAMRecord rec = it.next();
-            if (rec.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                unmappedCountFromLinearScan = 1;
-                break;
-            }
-            ++mappedCount;
-        }
-        linearScan.stop();
-        System.out.println("Found start of unmapped reads.  Num mapped reads: " + mappedCount);
-        System.out.println("Time so far: " + linearScan.getElapsedTimeSecs());
-        linearScan.start();
-
-        while (it.hasNext()) {
-            final SAMRecord rec = it.next();
-            Assert.assertEquals(rec.getReferenceIndex().intValue(), SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-            ++unmappedCountFromLinearScan;
-        }
-        it.close();
-        linearScan.stop();
-        queryUnmapped.start();
-        it = reader.queryUnmapped();
-        int unmappedCountFromQueryUnmapped = 0;
-        while (it.hasNext()) {
-            final SAMRecord rec = it.next();
-            Assert.assertEquals(rec.getReferenceIndex().intValue(), SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-            ++unmappedCountFromQueryUnmapped;
-        }
-        it.close();
-        queryUnmapped.stop();
-        System.out.println("Linear scan total time: " + linearScan.getElapsedTimeSecs());
-        System.out.println("queryUnmapped time: " + queryUnmapped.getElapsedTimeSecs());
-        System.out.println("Number of unmapped reads:" + unmappedCountFromQueryUnmapped);
-        Assert.assertEquals(unmappedCountFromQueryUnmapped, unmappedCountFromLinearScan);
-        CloserUtil.close(reader);
-    }
-
-    @Test
-    public void testQueryAlignmentStart() {
-        final SamReader reader = SamReaderFactory.makeDefault().open(BAM_FILE);
-        CloseableIterator<SAMRecord> it = reader.queryAlignmentStart("chr1", 202160268);
-        Assert.assertEquals(countElements(it), 2);
-        it.close();
-        it = reader.queryAlignmentStart("chr1", 201595153);
-        Assert.assertEquals(countElements(it), 1);
-        it.close();
-        // There are records that overlap this position, but none that start here
-        it = reader.queryAlignmentStart("chrM", 10400);
-        Assert.assertEquals(countElements(it), 0);
-        it.close();
-        // One past the last chr1 record
-        it = reader.queryAlignmentStart("chr1", 246817509);
-        Assert.assertEquals(countElements(it), 0);
-        it.close();
-        CloserUtil.close(reader);
-    }
-
-    @Test
-    public void testQueryMate() {
-        final SamReader reader = SamReaderFactory.makeDefault().open(BAM_FILE);
-
-        // Both ends mapped
-        SAMRecord rec = getSingleRecordStartingAt(reader, "chrM", 1687);
-        SAMRecord mate = reader.queryMate(rec);
-        assertMate(rec, mate);
-        SAMRecord originalRec = reader.queryMate(mate);
-        Assert.assertEquals(originalRec, rec);
-
-        // One end mapped
-        rec = getSingleRecordStartingAt(reader, "chr11", 48720338);
-        mate = reader.queryMate(rec);
-        assertMate(rec, mate);
-        originalRec = reader.queryMate(mate);
-        Assert.assertEquals(originalRec, rec);
-
-        // Both ends mapped
-        final CloseableIterator<SAMRecord> it = reader.queryUnmapped();
-        rec = null;
-        while (it.hasNext()) {
-            final SAMRecord next = it.next();
-            if (next.getReadName().equals("2615")) {
-                rec = next;
-                break;
-            }
-        }
-        it.close();
-        Assert.assertNotNull(rec);
-        mate = reader.queryMate(rec);
-        assertMate(rec, mate);
-        originalRec = reader.queryMate(mate);
-        Assert.assertEquals(originalRec, rec);
-        CloserUtil.close(reader);
-    }
-
-    private void assertMate(final SAMRecord rec, final SAMRecord mate) {
-        Assert.assertNotNull(mate);
-        Assert.assertEquals(mate.getReadName(), rec.getReadName());
-        Assert.assertEquals(mate.getReferenceIndex(), rec.getMateReferenceIndex());
-        if (SAMUtils.getMateCigarString(rec) != null) {
-            Assert.assertEquals(mate.getCigarString(), SAMUtils.getMateCigarString(rec));
-        }
-        Assert.assertEquals(mate.getAlignmentStart(), rec.getMateAlignmentStart());
-        Assert.assertFalse(mate.getFirstOfPairFlag() == rec.getFirstOfPairFlag());
-    }
-
-    /**
-     * Compare the results of a multi-interval query versus the union of the results from each interval done
-     * separately.
-     */
-    @Test(dataProvider = "testMultiIntervalQueryDataProvider")
-    public void testMultiIntervalQuery(final boolean contained) {
-        final List<String> referenceNames = getReferenceNames(BAM_FILE);
-
-        final QueryInterval[] intervals = generateRandomIntervals(referenceNames.size(), 1000, new Random());
-        final Set<SAMRecord> multiIntervalRecords = new HashSet<SAMRecord>();
-        final Set<SAMRecord> singleIntervalRecords = new HashSet<SAMRecord>();
-        final SamReader reader = SamReaderFactory.makeDefault().open(BAM_FILE);
-        for (final QueryInterval interval : intervals) {
-            consumeAll(singleIntervalRecords, reader.query(referenceNames.get(interval.referenceIndex), interval.start, interval.end, contained));
-        }
-
-        final QueryInterval[] optimizedIntervals = QueryInterval.optimizeIntervals(intervals);
-        consumeAll(multiIntervalRecords, reader.query(optimizedIntervals, contained));
-        final Iterator<SAMRecord> singleIntervalRecordIterator = singleIntervalRecords.iterator();
-        boolean failed = false;
-        while (singleIntervalRecordIterator.hasNext()) {
-            final SAMRecord record = singleIntervalRecordIterator.next();
-            if (!multiIntervalRecords.remove(record)) {
-                System.out.println("SingleIntervalQuery found " + record + " but MultiIntervalQuery did not");
-                failed = true;
-            }
-        }
-        for (final SAMRecord record : multiIntervalRecords) {
-            System.out.println("MultiIntervalQuery found " + record + " but SingleIntervalQuery did not");
-            failed = true;
-        }
-        Assert.assertFalse(failed);
-        CloserUtil.close(reader);
-    }
-
-    @DataProvider(name = "testMultiIntervalQueryDataProvider")
-    private Object[][] testMultiIntervalQueryDataProvider() {
-        return new Object[][]{{true}, {false}};
-    }
-
-    @Test
-    public void testUnmappedMateWithCoordinate() throws Exception {
-        // TODO: Use SAMRecordSetBuilder when it is able to create a pair with one end unmapped
-        final String samText = "@HD\tVN:1.0\tSO:coordinate\n" +
-                "@SQ\tSN:chr1\tLN:101\n" +
-                "@SQ\tSN:chr2\tLN:101\n" +
-                "@SQ\tSN:chr3\tLN:101\n" +
-                "@SQ\tSN:chr4\tLN:101\n" +
-                "@SQ\tSN:chr5\tLN:101\n" +
-                "@SQ\tSN:chr6\tLN:101\n" +
-                "@SQ\tSN:chr7\tLN:404\n" +
-                "@SQ\tSN:chr8\tLN:202\n" +
-                "@RG\tID:0\tSM:Hi,Mom!\n" +
-                "@PG\tID:1\tPN:Hey!\tVN:2.0\n" +
-                "one_end_mapped\t73\tchr7\t100\t255\t101M\t*\t0\t0\tCAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN\t)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&\tRG:Z:0\n" +
-                "one_end_mapped\t133\tchr7\t100\t0\t*\t=\t100\t0\tNCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA\t&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1\tRG:Z:0\n";
-        final ByteArrayInputStream bis = new ByteArrayInputStream(StringUtil.stringToBytes(samText));
-        final File bamFile = File.createTempFile("BAMFileIndexTest.", BamFileIoUtils.BAM_FILE_EXTENSION);
-        bamFile.deleteOnExit();
-        final SamReader textReader = SamReaderFactory.makeDefault().open(SamInputResource.of(bis));
-        SAMFileWriterFactory samFileWriterFactory = new SAMFileWriterFactory();
-        samFileWriterFactory.setCreateIndex(true);
-        final SAMFileWriter writer = samFileWriterFactory.makeBAMWriter(textReader.getFileHeader(), true, bamFile);
-        for (final SAMRecord rec : textReader) {
-            writer.addAlignment(rec);
-        }
-        writer.close();
-        final SamReader bamReader = SamReaderFactory.makeDefault().open(bamFile);
-        SamFiles.findIndex(bamFile).deleteOnExit();
-        Assert.assertEquals(countElements(bamReader.queryContained("chr7", 100, 100)), 1);
-        Assert.assertEquals(countElements(bamReader.queryOverlapping("chr7", 100, 100)), 2);
-        bamReader.close();
-        textReader.close();
-    }
-
-    private <E> void consumeAll(final Collection<E> collection, final CloseableIterator<E> iterator) {
-        while (iterator.hasNext()) {
-            collection.add(iterator.next());
-        }
-        iterator.close();
-    }
-
-    private SAMRecord getSingleRecordStartingAt(final SamReader reader, final String sequence, final int alignmentStart) {
-        final CloseableIterator<SAMRecord> it = reader.queryAlignmentStart(sequence, alignmentStart);
-        Assert.assertTrue(it.hasNext());
-        final SAMRecord rec = it.next();
-        Assert.assertNotNull(rec);
-        Assert.assertFalse(it.hasNext());
-        it.close();
-        return rec;
-    }
-
-    private int countElements(final CloseableIterator<SAMRecord> it) {
-        int num;
-        for (num = 0; it.hasNext(); ++num, it.next()) {
-        }
-        it.close();
-        return num;
-    }
-
-    private void checkChromosome(final String name, final int expectedCount) {
-        int count = runQueryTest(BAM_FILE, name, 0, 0, true);
-        assertEquals(count, expectedCount);
-        count = runQueryTest(BAM_FILE, name, 0, 0, false);
-        assertEquals(count, expectedCount);
-    }
-
-    private void runRandomTest(final File bamFile, final int count, final Random generator) {
-        final List<String> referenceNames = getReferenceNames(bamFile);
-        final QueryInterval[] intervals = generateRandomIntervals(referenceNames.size(), count, generator);
-        for (final QueryInterval interval : intervals) {
-            final String refName = referenceNames.get(interval.referenceIndex);
-            final int startPos = interval.start;
-            final int endPos = interval.end;
-            System.out.println("Testing query " + refName + ":" + startPos + "-" + endPos + " ...");
-            try {
-                runQueryTest(bamFile, refName, startPos, endPos, true);
-                runQueryTest(bamFile, refName, startPos, endPos, false);
-            } catch (final Throwable exc) {
-                String message = "Query test failed: " + refName + ":" + startPos + "-" + endPos;
-                message += ": " + exc.getMessage();
-                throw new RuntimeException(message, exc);
-            }
-        }
-    }
-
-    private QueryInterval[] generateRandomIntervals(final int numReferences, final int count, final Random generator) {
-        final QueryInterval[] intervals = new QueryInterval[count];
-        final int maxCoordinate = 10000000;
-        for (int i = 0; i < count; i++) {
-            final int referenceIndex = generator.nextInt(numReferences);
-            final int coord1 = generator.nextInt(maxCoordinate + 1);
-            final int coord2 = generator.nextInt(maxCoordinate + 1);
-            final int startPos = Math.min(coord1, coord2);
-            final int endPos = Math.max(coord1, coord2);
-            intervals[i] = new QueryInterval(referenceIndex, startPos, endPos);
-        }
-
-        return intervals;
-    }
-
-    private List<String> getReferenceNames(final File bamFile) {
-        final SamReader reader = SamReaderFactory.makeDefault().open(bamFile);
-        final List<String> result = new ArrayList<String>();
-        final List<SAMSequenceRecord> seqRecords = reader.getFileHeader().getSequenceDictionary().getSequences();
-        for (final SAMSequenceRecord seqRecord : seqRecords) {
-            if (seqRecord.getSequenceName() != null) {
-                result.add(seqRecord.getSequenceName());
-            }
-        }
-        CloserUtil.close(reader);
-        return result;
-    }
-
-    private int runQueryTest(final File bamFile, final String sequence, final int startPos, final int endPos, final boolean contained) {
-        verbose("Testing query " + sequence + ":" + startPos + "-" + endPos + " ...");
-        final SamReader reader1 = SamReaderFactory.makeDefault().open(bamFile);
-        final SamReader reader2 = SamReaderFactory.makeDefault().open(bamFile);
-        final Iterator<SAMRecord> iter1 = reader1.query(sequence, startPos, endPos, contained);
-        final Iterator<SAMRecord> iter2 = reader2.iterator();
-        // Compare ordered iterators.
-        // Confirm that iter1 is a subset of iter2 that properly filters.
-        SAMRecord record1 = null;
-        SAMRecord record2 = null;
-        int count1 = 0;
-        int count2 = 0;
-        int beforeCount = 0;
-        int afterCount = 0;
-        while (true) {
-            if (record1 == null && iter1.hasNext()) {
-                record1 = iter1.next();
-                count1++;
-            }
-            if (record2 == null && iter2.hasNext()) {
-                record2 = iter2.next();
-                count2++;
-            }
-            // System.out.println("Iteration:");
-            // System.out.println(" Record1 = " + ((record1 == null) ? "null" : record1.format()));
-            // System.out.println(" Record2 = " + ((record2 == null) ? "null" : record2.format()));
-            if (record1 == null && record2 == null) {
-                break;
-            }
-            if (record1 == null) {
-                checkPassesFilter(false, record2, sequence, startPos, endPos, contained);
-                record2 = null;
-                afterCount++;
-                continue;
-            }
-            assertNotNull(record2);
-            final int ordering = compareCoordinates(record1, record2);
-            if (ordering > 0) {
-                checkPassesFilter(false, record2, sequence, startPos, endPos, contained);
-                record2 = null;
-                beforeCount++;
-                continue;
-            }
-            assertTrue(ordering == 0);
-            checkPassesFilter(true, record1, sequence, startPos, endPos, contained);
-            checkPassesFilter(true, record2, sequence, startPos, endPos, contained);
-            assertEquals(record1.getReadName(), record2.getReadName());
-            assertEquals(record1.getReadString(), record2.getReadString());
-            record1 = null;
-            record2 = null;
-        }
-        CloserUtil.close(reader1);
-        CloserUtil.close(reader2);
-        verbose("Checked " + count1 + " records against " + count2 + " records.");
-        verbose("Found " + (count2 - beforeCount - afterCount) + " records matching.");
-        verbose("Found " + beforeCount + " records before.");
-        verbose("Found " + afterCount + " records after.");
-        return count1;
-    }
-
-    private void checkPassesFilter(final boolean expected, final SAMRecord record, final String sequence, final int startPos, final int endPos, final boolean contained) {
-        final boolean passes = passesFilter(record, sequence, startPos, endPos, contained);
-        if (passes != expected) {
-            System.out.println("Error: Record erroneously " +
-                    (passes ? "passed" : "failed") +
-                    " filter.");
-            System.out.println(" Record: " + record.getSAMString());
-            System.out.println(" Filter: " + sequence + ":" +
-                    startPos + "-" + endPos +
-                    " (" + (contained ? "contained" : "overlapping") + ")");
-            assertEquals(passes, expected);
-        }
-    }
-
-    private boolean passesFilter(final SAMRecord record, final String sequence, final int startPos, final int endPos, final boolean contained) {
-        if (record == null) {
-            return false;
-        }
-        if (!safeEquals(record.getReferenceName(), sequence)) {
-            return false;
-        }
-        final int alignmentStart = record.getAlignmentStart();
-        int alignmentEnd = record.getAlignmentEnd();
-        if (alignmentStart <= 0) {
-            assertTrue(record.getReadUnmappedFlag());
-            return false;
-        }
-        if (alignmentEnd <= 0) {
-            // For indexing-only records, treat as single base alignment.
-            assertTrue(record.getReadUnmappedFlag());
-            alignmentEnd = alignmentStart;
-        }
-        if (contained) {
-            if (startPos != 0 && alignmentStart < startPos) {
-                return false;
-            }
-            if (endPos != 0 && alignmentEnd > endPos) {
-                return false;
-            }
-        } else {
-            if (startPos != 0 && alignmentEnd < startPos) {
-                return false;
-            }
-            if (endPos != 0 && alignmentStart > endPos) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private int compareCoordinates(final SAMRecord record1, final SAMRecord record2) {
-        final int seqIndex1 = record1.getReferenceIndex();
-        final int seqIndex2 = record2.getReferenceIndex();
-        if (seqIndex1 == -1) {
-            return ((seqIndex2 == -1) ? 0 : -1);
-        } else if (seqIndex2 == -1) {
-            return 1;
-        }
-        int result = seqIndex1 - seqIndex2;
-        if (result != 0) {
-            return result;
-        }
-        result = record1.getAlignmentStart() - record2.getAlignmentStart();
-        return result;
-    }
-
-    private boolean safeEquals(final Object o1, final Object o2) {
-        if (o1 == o2) {
-            return true;
-        } else if (o1 == null || o2 == null) {
-            return false;
-        } else {
-            return o1.equals(o2);
-        }
-    }
-
-    private void verbose(final String text) {
-        if (mVerbose) {
-            System.out.println("# " + text);
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/BAMFileWriterTest.java b/src/test/java/htsjdk/samtools/BAMFileWriterTest.java
deleted file mode 100644
index a8944d0..0000000
--- a/src/test/java/htsjdk/samtools/BAMFileWriterTest.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Test that BAM writing doesn't blow up.  For presorted writing, the resulting BAM file is read and contents are
- * compared with the original SAM file.
- */
-public class BAMFileWriterTest {
-
-    private SAMRecordSetBuilder getRecordSetBuilder(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder) {
-        final SAMRecordSetBuilder ret = new SAMRecordSetBuilder(sortForMe, sortOrder);
-        ret.addPair("readB", 20, 200, 300);
-        ret.addPair("readA", 20, 100, 150);
-        ret.addFrag("readC", 20, 140, true);
-        ret.addFrag("readD", 20, 140, false);
-        return ret;
-    }
-
-    /**
-     * Parse some SAM text into a SAM object, then write as BAM.  If SAM text was presorted, then the BAM file can
-     * be read and compared with the SAM object.
-     *
-     * @param samRecordSetBuilder source of input {@link SamReader} to be written and compared with
-     * @param sortOrder           How the BAM should be written
-     * @param presorted           If true, samText is in the order specified by sortOrder
-     */
-    private void testHelper(final SAMRecordSetBuilder samRecordSetBuilder, final SAMFileHeader.SortOrder sortOrder, final boolean presorted) throws Exception {
-        final SamReader samReader = samRecordSetBuilder.getSamReader();
-        final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION);
-        bamFile.deleteOnExit();
-        samReader.getFileHeader().setSortOrder(sortOrder);
-        final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(samReader.getFileHeader(), presorted, bamFile);
-        CloseableIterator<SAMRecord> it = samReader.iterator();
-        while (it.hasNext()) {
-            bamWriter.addAlignment(it.next());
-        }
-        bamWriter.close();
-        it.close();
-        samReader.close();
-
-        if (presorted) { // If SAM text input was presorted, then we can compare SAM object to BAM object
-            verifyBAMFile(samRecordSetBuilder, bamFile);
-        }
-    }
-
-    private void verifyBAMFile(final SAMRecordSetBuilder samRecordSetBuilder, final File bamFile) {
-
-        final SamReader bamReader = SamReaderFactory.makeDefault().open(bamFile);
-        final SamReader samReader = samRecordSetBuilder.getSamReader();
-        samReader.getFileHeader().setSortOrder(bamReader.getFileHeader().getSortOrder());
-        Assert.assertEquals(bamReader.getFileHeader(), samReader.getFileHeader());
-        final CloseableIterator<SAMRecord> it = samReader.iterator();
-        final CloseableIterator<SAMRecord> bamIt = bamReader.iterator();
-        while (it.hasNext()) {
-            Assert.assertTrue(bamIt.hasNext());
-            final SAMRecord samRecord = it.next();
-            final SAMRecord bamRecord = bamIt.next();
-
-            // SAMRecords don't have this set, so stuff it in there
-            samRecord.setIndexingBin(bamRecord.getIndexingBin());
-
-            // Force reference index attributes to be populated
-            samRecord.getReferenceIndex();
-            bamRecord.getReferenceIndex();
-            samRecord.getMateReferenceIndex();
-            bamRecord.getMateReferenceIndex();
-
-            Assert.assertEquals(bamRecord, samRecord);
-        }
-        Assert.assertFalse(bamIt.hasNext());
-        CloserUtil.close(samReader);
-    }
-
-    @DataProvider(name = "test1")
-    public Object[][] createTestData() {
-        return new Object[][]{
-                {"coordinate sorted", getRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted), SAMFileHeader.SortOrder.coordinate, false},
-                {"query sorted", getRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted), SAMFileHeader.SortOrder.queryname, false},
-                {"unsorted", getRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted), SAMFileHeader.SortOrder.unsorted, false},
-                {"coordinate presorted", getRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate), SAMFileHeader.SortOrder.coordinate, true},
-                {"query presorted", getRecordSetBuilder(true, SAMFileHeader.SortOrder.queryname), SAMFileHeader.SortOrder.queryname, true},
-        };
-    }
-
-    @Test(dataProvider = "test1")
-    public void testPositive(final String testName, final SAMRecordSetBuilder samRecordSetBuilder, final SAMFileHeader.SortOrder order, final boolean presorted) throws Exception {
-
-        testHelper(samRecordSetBuilder, order, presorted);
-    }
-
-    @Test(dataProvider = "test1")
-    public void testNullRecordHeaders(final String testName, final SAMRecordSetBuilder samRecordSetBuilder, final SAMFileHeader.SortOrder order, final boolean presorted) throws Exception {
-
-        // test that BAMFileWriter can write records that have a null header
-        final SAMFileHeader samHeader = samRecordSetBuilder.getHeader();
-        for (SAMRecord rec : samRecordSetBuilder.getRecords()) {
-            rec.setHeader(null);
-        }
-
-        // make sure the records can actually be written out
-        final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION);
-        bamFile.deleteOnExit();
-        samHeader.setSortOrder(order);
-        final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(samHeader, presorted, bamFile);
-        for (final SAMRecord rec : samRecordSetBuilder.getRecords()) {
-            bamWriter.addAlignment(rec);
-        }
-        bamWriter.close();
-
-        if (presorted) {
-            verifyBAMFile(samRecordSetBuilder, bamFile);
-        }
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullRecordsMismatchedHeader() throws Exception {
-
-        final SAMRecordSetBuilder samRecordSetBuilder = getRecordSetBuilder(true, SAMFileHeader.SortOrder.queryname);
-        for (final SAMRecord rec : samRecordSetBuilder.getRecords()) {
-            rec.setHeader(null);
-        }
-
-        // create a fake header to make sure the records cannot  be written using an invalid
-        // sequence dictionary and unresolvable references
-        final SAMFileHeader fakeHeader = new SAMFileHeader();
-        fakeHeader.setSortOrder(SAMFileHeader.SortOrder.queryname);
-        final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION);
-        bamFile.deleteOnExit();
-
-        try (final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(fakeHeader, false, bamFile);) {
-            for (SAMRecord rec : samRecordSetBuilder.getRecords()) {
-                bamWriter.addAlignment(rec);
-            }
-        }
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testRecordsMismatchedHeader() throws Exception {
-
-        final SAMRecordSetBuilder samRecordSetBuilder = getRecordSetBuilder(true, SAMFileHeader.SortOrder.queryname);
-
-        // create a fake header to make sure the records cannot  be written using an invalid
-        // sequence dictionary and unresolvable references
-        final SAMFileHeader fakeHeader = new SAMFileHeader();
-        fakeHeader.setSortOrder(SAMFileHeader.SortOrder.queryname);
-        final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION);
-        bamFile.deleteOnExit();
-
-        try (final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(fakeHeader, false, bamFile);) {
-            for (SAMRecord rec : samRecordSetBuilder.getRecords()) {
-                bamWriter.addAlignment(rec);
-            }
-        }
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNegativePresorted() throws Exception {
-
-        testHelper(getRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate), SAMFileHeader.SortOrder.queryname, true);
-        Assert.fail("Exception should be thrown");
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/BAMIndexWriterTest.java b/src/test/java/htsjdk/samtools/BAMIndexWriterTest.java
deleted file mode 100644
index 09f9236..0000000
--- a/src/test/java/htsjdk/samtools/BAMIndexWriterTest.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.IOUtil;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Test BAM file index creation
- */
-public class BAMIndexWriterTest {
-    // Two input files for basic test
-    private final String BAM_FILE_LOCATION = "src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam";
-    private final String BAI_FILE_LOCATION = "src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai";
-    private final File BAM_FILE = new File(BAM_FILE_LOCATION);
-    private final File BAI_FILE = new File(BAI_FILE_LOCATION);
-
-    private final boolean mVerbose = true;
-
-    @Test(enabled = true)
-    public void testWriteText() throws Exception {
-        // Compare the text form of the c-generated bai file and a java-generated one
-        final File cBaiTxtFile = File.createTempFile("cBai.", ".bai.txt");
-        BAMIndexer.createAndWriteIndex(BAI_FILE, cBaiTxtFile, true);
-        verbose("Wrote textual C BAM Index file " + cBaiTxtFile);
-
-        final File javaBaiFile = File.createTempFile("javaBai.", "java.bai");
-        final File javaBaiTxtFile = new File(javaBaiFile.getAbsolutePath() + ".txt");
-        final SamReader bam = SamReaderFactory.makeDefault().enable(SamReaderFactory.Option.INCLUDE_SOURCE_IN_RECORDS).open(BAM_FILE);
-        BAMIndexer.createIndex(bam, javaBaiFile);
-        verbose("Wrote binary Java BAM Index file " + javaBaiFile);
-
-        // now, turn the bai file into text
-        BAMIndexer.createAndWriteIndex(javaBaiFile, javaBaiTxtFile, true);
-        // and compare them
-        verbose("diff " + javaBaiTxtFile + " " + cBaiTxtFile);
-        IOUtil.assertFilesEqual(javaBaiTxtFile, cBaiTxtFile);
-        cBaiTxtFile.deleteOnExit();
-        javaBaiFile.deleteOnExit();
-        javaBaiTxtFile.deleteOnExit();
-        CloserUtil.close(bam);
-    }
-
-    @Test(enabled = true)
-    public void testWriteBinary() throws Exception {
-        // Compare java-generated bai file with c-generated and sorted bai file
-        final File javaBaiFile = File.createTempFile("javaBai.", ".bai");
-        final SamReader bam = SamReaderFactory.makeDefault().enable(SamReaderFactory.Option.INCLUDE_SOURCE_IN_RECORDS).open(BAM_FILE);
-        BAMIndexer.createIndex(bam, javaBaiFile);
-        verbose("Wrote binary java BAM Index file " + javaBaiFile);
-
-        final File cRegeneratedBaiFile = File.createTempFile("cBai.", ".bai");
-        BAMIndexer.createAndWriteIndex(BAI_FILE, cRegeneratedBaiFile, false);
-        verbose("Wrote sorted C binary BAM Index file " + cRegeneratedBaiFile);
-
-        // Binary compare of javaBaiFile and cRegeneratedBaiFile should be the same
-        verbose("diff " + javaBaiFile + " " + cRegeneratedBaiFile);
-        IOUtil.assertFilesEqual(javaBaiFile, cRegeneratedBaiFile);
-        javaBaiFile.deleteOnExit();
-        cRegeneratedBaiFile.deleteOnExit();
-        CloserUtil.close(bam);
-    }
-
-    @Test(enabled = false, dataProvider = "linearIndexTestData")
-    /** Test linear index at specific references and windows */
-    public void testLinearIndex(String testName, String filepath, int problemReference, int problemWindowStart, int problemWindowEnd, int expectedCount) {
-        final SamReader sfr = SamReaderFactory.makeDefault().open(new File(filepath));
-        for (int problemWindow = problemWindowStart; problemWindow <= problemWindowEnd; problemWindow++) {
-            int count = countAlignmentsInWindow(problemReference, problemWindow, sfr, expectedCount);
-            if (expectedCount != -1)
-                assertEquals(expectedCount, count);
-        }
-        CloserUtil.close(sfr);
-    }
-
-    @DataProvider(name = "linearIndexTestData")
-    public Object[][] getLinearIndexTestData() {
-        // Add data here for test cases, reference, and windows where linear index needs testing
-        return new Object[][]{
-                new Object[]{"index_test", BAM_FILE_LOCATION, 1, 29, 66, -1},  // 29-66
-                new Object[]{"index_test", BAM_FILE_LOCATION, 1, 68, 118, -1},  // 29-66
-
-        };
-    }
-
-    private int countAlignmentsInWindow(int reference, int window, SamReader reader, int expectedCount) {
-        final int SIXTEEN_K = 1 << 14;       // 1 << LinearIndex.BAM_LIDX_SHIFT
-        final int start = window >> 14;             // window * SIXTEEN_K;
-        final int stop = ((window + 1) >> 14) - 1; // (window + 1 * SIXTEEN_K) - 1;
-
-        final String chr = reader.getFileHeader().getSequence(reference).getSequenceName();
-
-        // get records for the entire linear index window
-        SAMRecordIterator iter = reader.queryOverlapping(chr, start, stop);
-        SAMRecord rec;
-        int count = 0;
-        while (iter.hasNext()) {
-            rec = iter.next();
-            count++;
-            if (expectedCount == -1)
-                System.err.println(rec.getReadName());
-        }
-        iter.close();
-        return count;
-    }
-
-
-    @Test(enabled = false, dataProvider = "indexComparisonData")
-    /** Test linear index at all references and windows, comparing with existing index */
-    public void compareLinearIndex(String testName, String bamFile, String bamIndexFile) throws IOException {
-        // compare index generated from bamFile with existing bamIndex file
-        // by testing all the references' windows and comparing the counts
-
-        // 1. generate bai file
-        // 2. count its references
-        // 3. count bamIndex references comparing counts
-
-        // 1. generate bai file
-        File bam = new File(bamFile);
-        assertTrue(bam.exists(), testName + " input bam file doesn't exist: " + bamFile);
-
-        File indexFile1 = createIndexFile(bam);
-        assertTrue(indexFile1.exists(), testName + " generated bam file's index doesn't exist: " + indexFile1);
-
-        // 2. count its references
-        File indexFile2 = new File(bamIndexFile);
-        assertTrue(indexFile2.exists(), testName + " input index file doesn't exist: " + indexFile2);
-
-        final CachingBAMFileIndex existingIndex1 = new CachingBAMFileIndex(indexFile1, null); // todo null sequence dictionary?
-        final CachingBAMFileIndex existingIndex2 = new CachingBAMFileIndex(indexFile2, null);
-        final int n_ref = existingIndex1.getNumberOfReferences();
-        assertEquals(n_ref, existingIndex2.getNumberOfReferences());
-
-        final SamReader reader1 = SamReaderFactory.makeDefault().disable(SamReaderFactory.Option.EAGERLY_DECODE).open(bam);
-
-        final SamReader reader2 = SamReaderFactory.makeDefault().disable(SamReaderFactory.Option.EAGERLY_DECODE).open(bam);
-
-        System.out.println("Comparing " + n_ref + " references in " + indexFile1 + " and " + indexFile2);
-
-        for (int i = 0; i < n_ref; i++) {
-            final BAMIndexContent content1 = existingIndex1.getQueryResults(i);
-            final BAMIndexContent content2 = existingIndex2.getQueryResults(i);
-            if (content1 == null) {
-                assertTrue(content2 == null, "No content for 1st bam index, but content for second at reference" + i);
-                continue;
-            }
-            int[] counts1 = new int[LinearIndex.MAX_LINEAR_INDEX_SIZE];
-            int[] counts2 = new int[LinearIndex.MAX_LINEAR_INDEX_SIZE];
-            LinearIndex li1 = content1.getLinearIndex();
-            LinearIndex li2 = content2.getLinearIndex();
-            // todo not li1 and li2 sizes may differ. Implies 0's in the smaller index windows
-            // 3. count bamIndex references comparing counts
-            int baiSize = Math.max(li1.size(), li2.size());
-            for (int win = 0; win < baiSize; win++) {
-                counts1[win] = countAlignmentsInWindow(i, win, reader1, 0);
-                counts2[win] = countAlignmentsInWindow(i, win, reader2, counts1[win]);
-                assertEquals(counts2[win], counts1[win], "Counts don't match for reference " + i +
-                        " window " + win);
-            }
-        }
-
-        indexFile1.deleteOnExit();
-
-    }
-
-    @DataProvider(name = "indexComparisonData")
-    public Object[][] getIndexComparisonData() {
-        // enter bam file and alternate index file to be tested against generated bam index
-        return new Object[][]{
-                new Object[]{"index_test", BAM_FILE_LOCATION, BAI_FILE_LOCATION},
-        };
-    }
-
-    @Test(expectedExceptions = SAMException.class)
-    public void testRequireCoordinateSortOrder() {
-        SAMFileHeader header = new SAMFileHeader();
-        header.setSortOrder(SAMFileHeader.SortOrder.queryname);
-
-        new BAMIndexer(new ByteArrayOutputStream(), header);
-    }
-
-    /** generates the index file using the latest java index generating code */
-    private File createIndexFile(File bamFile) throws IOException {
-        final File bamIndexFile = File.createTempFile("Bai.", ".bai");
-        final SamReader bam = SamReaderFactory.makeDefault().open(bamFile);
-        BAMIndexer.createIndex(bam, bamIndexFile);
-        verbose("Wrote BAM Index file " + bamIndexFile);
-        bam.close();
-        return bamIndexFile;
-    }
-
-    private void verbose(final String text) {
-        if (mVerbose) {
-            System.out.println("#BAMIndexWriterTest " + text);
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/BAMIteratorTest.java b/src/test/java/htsjdk/samtools/BAMIteratorTest.java
deleted file mode 100644
index 5fa9e7d..0000000
--- a/src/test/java/htsjdk/samtools/BAMIteratorTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class BAMIteratorTest {
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
-    @Test(dataProvider = "dataProvider")
-    public void testIterateEmptyBam(final String bam) throws Exception {
-        final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, bam));
-        int numRecords = 0;
-        for (final SAMRecord rec : reader) {
-            ++numRecords;
-        }
-        Assert.assertEquals(numRecords, 0);
-        CloserUtil.close(reader);
-    }
-
-    @Test(dataProvider = "dataProvider")
-    public void testQueryUnmappedEmptyBam(final String bam) throws Exception {
-        final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, bam));
-        final CloseableIterator<SAMRecord> it = reader.queryUnmapped();
-        int numRecords = 0;
-        while (it.hasNext()) {
-            it.next();
-            ++numRecords;
-        }
-        Assert.assertEquals(numRecords, 0);
-        CloserUtil.close(reader);
-    }
-
-    @DataProvider(name = "dataProvider")
-    public Object[][] bams() {
-        return new Object[][]{
-                {"empty.bam"},
-                {"empty_no_empty_gzip_block.bam"}
-        };
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilterTest.java b/src/test/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilterTest.java
deleted file mode 100644
index 7c0bb1f..0000000
--- a/src/test/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilterTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.Random;
-
-public class BAMQueryMultipleIntervalsIteratorFilterTest {
-
-    private final byte[] BASES = {'A', 'C', 'G', 'T'};
-    private final Random random = new Random();
-
-    @DataProvider(name="compareIntervalToRecord")
-    public Object[][] compareIntervalToRecord() {
-        return new Object[][] {
-                { new QueryInterval(0, 20, 20), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
-                { new QueryInterval(0, 20, 22), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
-                { new QueryInterval(1, 10, 22), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
-                { new QueryInterval(1, 0, 22), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
-                { new QueryInterval(1, -1, 22), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
-                { new QueryInterval(1, 1, 22), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
-
-                { new QueryInterval(0, 0, 4), 0, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
-                { new QueryInterval(0, 0, 5), 0, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
-                { new QueryInterval(0, 0, -1), 1, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
-                { new QueryInterval(0, 1, 0), 1, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
-                { new QueryInterval(0, 1, -1), 1, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
-                { new QueryInterval(0, 0, 0), 1, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
-                { new QueryInterval(0, 9, 9), 0, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
-                { new QueryInterval(0, 1, 4), 0, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
-                { new QueryInterval(0, 1, 4), 1, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
-
-                { new QueryInterval(0, 0, 0), 0, 10, 5, BAMIteratorFilter.IntervalComparison.CONTAINED },
-                { new QueryInterval(0, 1, -1), 0, 1, 100, BAMIteratorFilter.IntervalComparison.CONTAINED },
-                { new QueryInterval(0, 1, 0), 0, 1, 100, BAMIteratorFilter.IntervalComparison.CONTAINED },
-                { new QueryInterval(0, 1, 0), 0, 10, 5, BAMIteratorFilter.IntervalComparison.CONTAINED },
-                { new QueryInterval(0, 1, -1), 0, 10, 5, BAMIteratorFilter.IntervalComparison.CONTAINED },
-                { new QueryInterval(0, 10, 15), 0, 10, 5, BAMIteratorFilter.IntervalComparison.CONTAINED },
-                { new QueryInterval(0, 10, 0), 0, 10, 5, BAMIteratorFilter.IntervalComparison.CONTAINED },
-
-                { new QueryInterval(0, 10, 11), 0, 10, 5, BAMIteratorFilter.IntervalComparison.OVERLAPPING },
-                { new QueryInterval(0, 1, 10), 0, 9, 5, BAMIteratorFilter.IntervalComparison.OVERLAPPING },
-                { new QueryInterval(0, 0, 10), 0, 9, 5, BAMIteratorFilter.IntervalComparison.OVERLAPPING },
-                { new QueryInterval(0, 1, 10), 0, 9, 5, BAMIteratorFilter.IntervalComparison.OVERLAPPING },
-                { new QueryInterval(0, 1, 5), 0, 5, 10, BAMIteratorFilter.IntervalComparison.OVERLAPPING },
-        };
-    }
-
-    @Test(dataProvider = "compareIntervalToRecord")
-    public void testCompareIntervalToRecord(
-            final QueryInterval query,
-            final int refIndex,
-            final int start,
-            final int length,
-            final BAMIteratorFilter.IntervalComparison expectedState)
-    {
-        SAMRecord samRec = getSAMRecord(refIndex, start, length);
-        Assert.assertEquals(BAMQueryMultipleIntervalsIteratorFilter.compareIntervalToRecord(query, samRec), expectedState);
-    }
-
-    @DataProvider(name="compareToFilter")
-    public Object[][] compareToFilter() {
-        return new Object[][] {
-                { new QueryInterval[] { new QueryInterval(0, 10, 11), new QueryInterval(1, 1, 10) },
-                        0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
-                { new QueryInterval[] { new QueryInterval(0, 10, 11), new QueryInterval(1, 5, 10) },
-                        1, 1, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
-                { new QueryInterval[] { new QueryInterval(0, 20, 20), new QueryInterval(0, 10, 5) },
-                        0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
-                { new QueryInterval[] { new QueryInterval(0, 20, 22), new QueryInterval(0, 10, 5) },
-                        0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
-                { new QueryInterval[] { new QueryInterval(1, 10, 22), new QueryInterval(0, 10, 5) },
-                        0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
-                { new QueryInterval[] { new QueryInterval(1, 0, 22), new QueryInterval(0, 10, 5) },
-                        0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
-                { new QueryInterval[] { new QueryInterval(1, -1, 22), new QueryInterval(0, 10, 5) },
-                        0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
-                { new QueryInterval[] { new QueryInterval(0, 10, 5), new QueryInterval(1, 1, 22) },
-                        0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
-                { new QueryInterval[] { new QueryInterval(0, 1, -1), new QueryInterval(1, 5, 10) },
-                        1, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION},
-
-                { new QueryInterval[] { new QueryInterval(0, 1, 4), new QueryInterval(0, 10, 5) },
-                        0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.STOP_ITERATION },
-                { new QueryInterval[] { new QueryInterval(0, 0, 5), new QueryInterval(0, 10, 5) },
-                        0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.STOP_ITERATION },
-                { new QueryInterval[] { new QueryInterval(0, 0, 5), new QueryInterval(0, 5, 5) },
-                        0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.STOP_ITERATION},
-                { new QueryInterval[] { new QueryInterval(0, 0, 5), new QueryInterval(1, 5, 5) },
-                        1, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.STOP_ITERATION},
-
-                { new QueryInterval[] { new QueryInterval(1, 10, 5), new QueryInterval(1, 10, 10) },
-                        1, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION},
-                { new QueryInterval[] { new QueryInterval(1, 10, 5), new QueryInterval(1, 10, 10) },
-                        1, 10, 5, false, BAMIteratorFilter.FilteringIteratorState.MATCHES_FILTER},
-
-                { new QueryInterval[] { new QueryInterval(0, 0, -1), new QueryInterval(1, 10, 5) },
-                        0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.MATCHES_FILTER },
-                { new QueryInterval[] { new QueryInterval(0, 1, -1), new QueryInterval(1, 5, -1) },
-                        1, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.MATCHES_FILTER},
-        };
-    }
-
-    @Test(dataProvider = "compareToFilter")
-    public void testCompareToFilter(
-            final QueryInterval[] query,
-            final int refIndex,
-            final int start,
-            final int length,
-            final boolean contained,
-            final BAMIteratorFilter.FilteringIteratorState expectedState)
-    {
-        SAMRecord samRec = getSAMRecord(refIndex, start, length);
-        BAMQueryMultipleIntervalsIteratorFilter it = new BAMQueryMultipleIntervalsIteratorFilter(query, contained);
-        Assert.assertEquals(it.compareToFilter(samRec), expectedState);
-    }
-
-    /**
-     * Fills in bases for the given record to length.
-     */
-    private SAMRecord getSAMRecord(final int refIndex, final int start, final int length) {
-        final byte[] bases = new byte[length];
-
-        SAMFileHeader samHeader = new SAMFileHeader();
-        samHeader.setSequenceDictionary(
-            new SAMSequenceDictionary(
-                Arrays.asList(
-                    new SAMSequenceRecord("chr1", 200),
-                    new SAMSequenceRecord("chr2", 200))
-            )
-        );
-        SAMRecord samRec = new SAMRecord(samHeader);
-        for (int i = 0; i < length; ++i) {
-            bases[i] = BASES[random.nextInt(BASES.length)];
-        }
-        samRec.setReadBases(bases);
-        samRec.setReferenceIndex(refIndex);
-        samRec.setAlignmentStart(start);
-        samRec.setCigarString(length + "M");
-
-        return samRec;
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/BAMRemoteFileTest.java b/src/test/java/htsjdk/samtools/BAMRemoteFileTest.java
deleted file mode 100644
index 4b686cf..0000000
--- a/src/test/java/htsjdk/samtools/BAMRemoteFileTest.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.TestUtil;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Random;
-
-import static org.testng.Assert.*;
-
-/**
- * Test BAM file indexing.
- */
-public class BAMRemoteFileTest {
-    private final File BAM_INDEX_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai");
-    private final File BAM_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
-    private final String BAM_URL_STRING = TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam";
-    private final URL bamURL;
-
-    private final boolean mVerbose = false;
-
-    public BAMRemoteFileTest() throws Exception {
-        bamURL = new URL(BAM_URL_STRING);
-    }
-
-
-    @Test
-    void testRemoteLocal()
-            throws Exception {
-        runLocalRemoteTest(bamURL, BAM_FILE, "chrM", 10400, 10600, false);
-    }
-
-    @Test
-    public void testSpecificQueries()
-            throws Exception {
-        assertEquals(runQueryTest(bamURL, "chrM", 10400, 10600, true), 1);
-        assertEquals(runQueryTest(bamURL, "chrM", 10400, 10600, false), 2);
-    }
-
-    @Test(enabled = true)
-    public void testRandomQueries()
-            throws Exception {
-        runRandomTest(bamURL, 20, new Random());
-    }
-
-    @Test
-    public void testWholeChromosomes() {
-        checkChromosome("chrM", 23);
-        checkChromosome("chr1", 885);
-        checkChromosome("chr2", 837);
-        /***
-         checkChromosome("chr3", 683);
-         checkChromosome("chr4", 633);
-         checkChromosome("chr5", 611);
-         checkChromosome("chr6", 585);
-         checkChromosome("chr7", 521);
-         checkChromosome("chr8", 507);
-         checkChromosome("chr9", 388);
-         checkChromosome("chr10", 477);
-         checkChromosome("chr11", 467);
-         checkChromosome("chr12", 459);
-         checkChromosome("chr13", 327);
-         checkChromosome("chr14", 310);
-         checkChromosome("chr15", 280);
-         checkChromosome("chr16", 278);
-         checkChromosome("chr17", 269);
-         checkChromosome("chr18", 265);
-         checkChromosome("chr19", 178);
-         checkChromosome("chr20", 228);
-         checkChromosome("chr21", 123);
-         checkChromosome("chr22", 121);
-         checkChromosome("chrX", 237);
-         checkChromosome("chrY", 29);
-         ***/
-    }
-
-
-    private void checkChromosome(final String name, final int expectedCount) {
-        int count = runQueryTest(bamURL, name, 0, 0, true);
-        assertEquals(count, expectedCount);
-        count = runQueryTest(bamURL, name, 0, 0, false);
-        assertEquals(count, expectedCount);
-    }
-
-    private void runRandomTest(final URL bamFile, final int count, final Random generator) throws IOException {
-        final int maxCoordinate = 10000000;
-        final List<String> referenceNames = getReferenceNames(bamFile);
-        for (int i = 0; i < count; i++) {
-            final String refName = referenceNames.get(generator.nextInt(referenceNames.size()));
-            final int coord1 = generator.nextInt(maxCoordinate + 1);
-            final int coord2 = generator.nextInt(maxCoordinate + 1);
-            final int startPos = Math.min(coord1, coord2);
-            final int endPos = Math.max(coord1, coord2);
-            System.out.println("Testing query " + refName + ":" + startPos + "-" + endPos + " ...");
-            try {
-                runQueryTest(bamFile, refName, startPos, endPos, true);
-                runQueryTest(bamFile, refName, startPos, endPos, false);
-            } catch (Throwable exc) {
-                String message = "Query test failed: " + refName + ":" + startPos + "-" + endPos;
-                message += ": " + exc.getMessage();
-                throw new RuntimeException(message, exc);
-            }
-        }
-    }
-
-    private List<String> getReferenceNames(final URL bamFile) throws IOException {
-
-
-        final SamReader reader = SamReaderFactory.makeDefault().open(SamInputResource.of(bamFile.openStream()));
-
-        final List<String> result = new ArrayList<String>();
-        final List<SAMSequenceRecord> seqRecords = reader.getFileHeader().getSequenceDictionary().getSequences();
-        for (final SAMSequenceRecord seqRecord : seqRecords) {
-            if (seqRecord.getSequenceName() != null) {
-                result.add(seqRecord.getSequenceName());
-            }
-        }
-        reader.close();
-        return result;
-    }
-
-    private void runLocalRemoteTest(final URL bamURL, final File bamFile, final String sequence, final int startPos, final int endPos, final boolean contained) {
-        verbose("Testing query " + sequence + ":" + startPos + "-" + endPos + " ...");
-        final SamReader reader1 = SamReaderFactory.makeDefault()
-                .disable(SamReaderFactory.Option.EAGERLY_DECODE)
-                .open(SamInputResource.of(bamFile).index(BAM_INDEX_FILE));
-        final SamReader reader2 = SamReaderFactory.makeDefault()
-                .disable(SamReaderFactory.Option.EAGERLY_DECODE)
-                .open(SamInputResource.of(bamURL).index(BAM_INDEX_FILE));
-        final Iterator<SAMRecord> iter1 = reader1.query(sequence, startPos, endPos, contained);
-        final Iterator<SAMRecord> iter2 = reader2.query(sequence, startPos, endPos, contained);
-
-        final List<SAMRecord> records1 = new ArrayList<SAMRecord>();
-        final List<SAMRecord> records2 = new ArrayList<SAMRecord>();
-
-        while (iter1.hasNext()) {
-            records1.add(iter1.next());
-        }
-        while (iter2.hasNext()) {
-            records2.add(iter2.next());
-        }
-
-        assertTrue(records1.size() > 0);
-        assertEquals(records1.size(), records2.size());
-        for (int i = 0; i < records1.size(); i++) {
-            //System.out.println(records1.get(i).format());
-            assertEquals(records1.get(i).getSAMString(), records2.get(i).getSAMString());
-        }
-
-
-    }
-
-    private int runQueryTest(final URL bamURL, final String sequence, final int startPos, final int endPos, final boolean contained) {
-        verbose("Testing query " + sequence + ":" + startPos + "-" + endPos + " ...");
-        final SamReader reader1 = SamReaderFactory.makeDefault()
-                .disable(SamReaderFactory.Option.EAGERLY_DECODE)
-                .open(SamInputResource.of(bamURL).index(BAM_INDEX_FILE));
-        final SamReader reader2 = SamReaderFactory.makeDefault()
-                .disable(SamReaderFactory.Option.EAGERLY_DECODE)
-                .open(SamInputResource.of(bamURL).index(BAM_INDEX_FILE));
-        final Iterator<SAMRecord> iter1 = reader1.query(sequence, startPos, endPos, contained);
-        final Iterator<SAMRecord> iter2 = reader2.iterator();
-        // Compare ordered iterators.
-        // Confirm that iter1 is a subset of iter2 that properly filters.
-        SAMRecord record1 = null;
-        SAMRecord record2 = null;
-        int count1 = 0;
-        int count2 = 0;
-        int beforeCount = 0;
-        int afterCount = 0;
-        while (true) {
-            if (record1 == null && iter1.hasNext()) {
-                record1 = iter1.next();
-                count1++;
-            }
-            if (record2 == null && iter2.hasNext()) {
-                record2 = iter2.next();
-                count2++;
-            }
-            // System.out.println("Iteration:");
-            // System.out.println(" Record1 = " + ((record1 == null) ? "null" : record1.format()));
-            // System.out.println(" Record2 = " + ((record2 == null) ? "null" : record2.format()));
-            if (record1 == null && record2 == null) {
-                break;
-            }
-            if (record1 == null) {
-                checkPassesFilter(false, record2, sequence, startPos, endPos, contained);
-                record2 = null;
-                afterCount++;
-                continue;
-            }
-            assertNotNull(record2);
-            final int ordering = compareCoordinates(record1, record2);
-            if (ordering > 0) {
-                checkPassesFilter(false, record2, sequence, startPos, endPos, contained);
-                record2 = null;
-                beforeCount++;
-                continue;
-            }
-            assertTrue(ordering == 0);
-            checkPassesFilter(true, record1, sequence, startPos, endPos, contained);
-            checkPassesFilter(true, record2, sequence, startPos, endPos, contained);
-            assertEquals(record1.getReadName(), record2.getReadName());
-            assertEquals(record1.getReadString(), record2.getReadString());
-            record1 = null;
-            record2 = null;
-        }
-        CloserUtil.close(reader1);
-        CloserUtil.close(reader2);
-        verbose("Checked " + count1 + " records against " + count2 + " records.");
-        verbose("Found " + (count2 - beforeCount - afterCount) + " records matching.");
-        verbose("Found " + beforeCount + " records before.");
-        verbose("Found " + afterCount + " records after.");
-        return count1;
-    }
-
-    private void checkPassesFilter(final boolean expected, final SAMRecord record, final String sequence, final int startPos, final int endPos, final boolean contained) {
-        final boolean passes = passesFilter(record, sequence, startPos, endPos, contained);
-        if (passes != expected) {
-            System.out.println("Error: Record erroneously " +
-                    (passes ? "passed" : "failed") +
-                    " filter.");
-            System.out.println(" Record: " + record.getSAMString());
-            System.out.println(" Filter: " + sequence + ":" +
-                    startPos + "-" + endPos +
-                    " (" + (contained ? "contained" : "overlapping") + ")");
-            assertEquals(passes, expected);
-        }
-    }
-
-    private boolean passesFilter(final SAMRecord record, final String sequence, final int startPos, final int endPos, final boolean contained) {
-        if (record == null) {
-            return false;
-        }
-        if (!safeEquals(record.getReferenceName(), sequence)) {
-            return false;
-        }
-        final int alignmentStart = record.getAlignmentStart();
-        int alignmentEnd = record.getAlignmentEnd();
-        if (alignmentStart <= 0) {
-            assertTrue(record.getReadUnmappedFlag());
-            return false;
-        }
-        if (alignmentEnd <= 0) {
-            // For indexing-only records, treat as single base alignment.
-            assertTrue(record.getReadUnmappedFlag());
-            alignmentEnd = alignmentStart;
-        }
-        if (contained) {
-            if (startPos != 0 && alignmentStart < startPos) {
-                return false;
-            }
-            if (endPos != 0 && alignmentEnd > endPos) {
-                return false;
-            }
-        } else {
-            if (startPos != 0 && alignmentEnd < startPos) {
-                return false;
-            }
-            if (endPos != 0 && alignmentStart > endPos) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private int compareCoordinates(final SAMRecord record1, final SAMRecord record2) {
-        final int seqIndex1 = record1.getReferenceIndex();
-        final int seqIndex2 = record2.getReferenceIndex();
-        if (seqIndex1 == -1) {
-            return ((seqIndex2 == -1) ? 0 : -1);
-        } else if (seqIndex2 == -1) {
-            return 1;
-        }
-        int result = seqIndex1 - seqIndex2;
-        if (result != 0) {
-            return result;
-        }
-        result = record1.getAlignmentStart() - record2.getAlignmentStart();
-        return result;
-    }
-
-    private boolean safeEquals(final Object o1, final Object o2) {
-        if (o1 == o2) {
-            return true;
-        } else if (o1 == null || o2 == null) {
-            return false;
-        } else {
-            return o1.equals(o2);
-        }
-    }
-
-    private void verbose(final String text) {
-        if (mVerbose) {
-            System.out.println("# " + text);
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/BinTest.java b/src/test/java/htsjdk/samtools/BinTest.java
deleted file mode 100644
index 271a411..0000000
--- a/src/test/java/htsjdk/samtools/BinTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Collections;
-
-public class BinTest {
-    @Test
-    public void testEmptyBin() {
-        // Construct a new empty bin and ensure that the bin list is empty, not null.
-        Bin bin = new Bin(1,4681);
-        Assert.assertEquals(bin.getChunkList(),Collections.<Chunk>emptyList(),"getChunkList() in an empty bin should return an empty list.");
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMBAIIndexerTest.java b/src/test/java/htsjdk/samtools/CRAMBAIIndexerTest.java
deleted file mode 100644
index 6f3b954..0000000
--- a/src/test/java/htsjdk/samtools/CRAMBAIIndexerTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.ContainerFactory;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.seekablestream.SeekableMemoryStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Created by vadim on 12/01/2016.
- */
-public class CRAMBAIIndexerTest {
-
-    private static CramCompressionRecord createRecord(int recordIndex, int seqId, int start) {
-        byte[] bases = "AAAAA".getBytes();
-        int readLength = bases.length;
-
-        final CramCompressionRecord record = new CramCompressionRecord();
-        record.setSegmentUnmapped(false);
-        record.setMultiFragment(false);
-        record.sequenceId = seqId;
-        record.alignmentStart =start;
-        record.readBases = record.qualityScores = bases;
-        record.readName = Integer.toString(recordIndex);
-        record.readLength = readLength;
-        record.readFeatures = Collections.emptyList();
-
-        return record;
-    }
-    @Test
-    public void test_processMultiContainer() throws IOException, IllegalAccessException {
-        SAMFileHeader samFileHeader = new SAMFileHeader();
-        samFileHeader.addSequence(new SAMSequenceRecord("1", 10));
-        samFileHeader.addSequence(new SAMSequenceRecord("2", 10));
-        samFileHeader.addSequence(new SAMSequenceRecord("3", 10));
-        ByteArrayOutputStream indexBAOS = new ByteArrayOutputStream();
-        CRAMBAIIndexer indexer = new CRAMBAIIndexer(indexBAOS, samFileHeader);
-        int recordsPerContainer = 3;
-        ContainerFactory containerFactory = new ContainerFactory(samFileHeader, recordsPerContainer);
-        List<CramCompressionRecord> records = new ArrayList<>();
-        records.add(createRecord(0, 0, 1));
-        records.add(createRecord(1, 1, 2));
-        records.add(createRecord(2, 1, 3));
-
-        final Container container1 = containerFactory.buildContainer(records);
-        Assert.assertNotNull(container1);
-        Assert.assertEquals(container1.nofRecords, records.size());
-        Assert.assertEquals(container1.sequenceId, Slice.MULTI_REFERENCE);
-
-        indexer.processContainer(container1, ValidationStringency.STRICT);
-
-        records.clear();
-        records.add(createRecord(3, 1, 3));
-        records.add(createRecord(4, 2, 3));
-        records.add(createRecord(5, 2, 4));
-        final Container  container2 = containerFactory.buildContainer(records);
-        Assert.assertNotNull(container2);
-        Assert.assertEquals(container2.nofRecords, records.size());
-        Assert.assertEquals(container2.sequenceId, Slice.MULTI_REFERENCE);
-
-        indexer.processContainer(container2, ValidationStringency.STRICT);
-
-        indexer.finish();
-
-        BAMIndex index = new CachingBAMFileIndex(new SeekableMemoryStream(indexBAOS.toByteArray(), null), samFileHeader.getSequenceDictionary());
-        final BAMIndexMetaData metaData_0 = index.getMetaData(0);
-        Assert.assertNotNull(metaData_0);
-        Assert.assertEquals(metaData_0.getAlignedRecordCount(), 1);
-
-        final BAMIndexMetaData metaData_1 = index.getMetaData(1);
-        Assert.assertNotNull(metaData_1);
-        Assert.assertEquals(metaData_1.getAlignedRecordCount(), 3);
-
-        final BAMIndexMetaData metaData_2 = index.getMetaData(2);
-        Assert.assertNotNull(metaData_2);
-        Assert.assertEquals(metaData_2.getAlignedRecordCount(), 2);
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMCRAIIndexerTest.java b/src/test/java/htsjdk/samtools/CRAMCRAIIndexerTest.java
deleted file mode 100644
index 11d2f3c..0000000
--- a/src/test/java/htsjdk/samtools/CRAMCRAIIndexerTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIEntry;
-import htsjdk.samtools.cram.build.CramContainerIterator;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.FakeReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.ByteArraySeekableStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.*;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Companion to CRAMBAIIndexerTest, for testing CRAI indices created on cram
- * streams;
- */
-public class CRAMCRAIIndexerTest {
-
-    @Test
-    public void testCRAIIndexerFromContainer() throws IOException {
-        final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/test2.cram");
-        final File refFile = new File("src/test/resources/htsjdk/samtools/cram/test2.fa");
-        ReferenceSource refSource = new ReferenceSource(refFile);
-        CRAMFileReader reader = new CRAMFileReader(
-                CRAMFile,
-                null,
-                refSource,
-                ValidationStringency.STRICT);
-        SAMFileHeader samHeader = reader.getFileHeader();
-        Iterator<SAMRecord> it = reader.getIterator();
-        while(it.hasNext()) {
-            SAMRecord samRec = it.next();
-        }
-
-        reader.close();
-
-        FileInputStream fis = new FileInputStream(CRAMFile);
-        CramContainerIterator cit = new CramContainerIterator(fis);
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-
-        CRAMCRAIIndexer craiIndexer = new CRAMCRAIIndexer(bos, samHeader);
-        while (cit.hasNext()) {
-            craiIndexer.processContainer(cit.next());
-        }
-        craiIndexer.finish();
-        bos.close();
-
-        List<CRAIEntry> craiEntries = CRAMCRAIIndexer.readIndex(new ByteArrayInputStream(bos.toByteArray())).getCRAIEntries();
-        Assert.assertEquals(craiEntries.size(), 1);
-    }
-
-    @Test
-    public void testCRAIIndexerFromStream() throws IOException {
-        final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/test2.cram");
-        final File refFile = new File("src/test/resources/htsjdk/samtools/cram/test2.fa");
-        ReferenceSource refSource = new ReferenceSource(refFile);
-
-        // get the header to use
-        CRAMFileReader reader = new CRAMFileReader(
-                CRAMFile,
-                null,
-                refSource,
-                ValidationStringency.STRICT);
-        SAMFileHeader samHeader = reader.getFileHeader();
-        reader.close();
-
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        CRAMCRAIIndexer craiIndexer = new CRAMCRAIIndexer(bos, samHeader);
-        craiIndexer.writeIndex(new SeekableFileStream(CRAMFile), bos);
-
-        List<CRAIEntry> craiEntries = CRAMCRAIIndexer.readIndex(new ByteArrayInputStream(bos.toByteArray())).getCRAIEntries();
-        Assert.assertEquals(craiEntries.size(), 1);
-    }
-
-    @Test
-    public void testMultiRefContainer() throws IOException, IllegalAccessException {
-        SAMFileHeader samFileHeader = new SAMFileHeader();
-        samFileHeader.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-        
-        samFileHeader.addSequence(new SAMSequenceRecord("1", 10));
-        samFileHeader.addSequence(new SAMSequenceRecord("2", 10));
-        samFileHeader.addSequence(new SAMSequenceRecord("3", 10));
-
-        ReferenceSource source = new ReferenceSource(new FakeReferenceSequenceFile(samFileHeader.getSequenceDictionary().getSequences()));
-
-        ByteArrayOutputStream cramBAOS = new ByteArrayOutputStream();
-        ByteArrayOutputStream indexBAOS = new ByteArrayOutputStream();
-
-        // force the containers to be small to ensure there are 2
-        int originalDefaultSize = CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE;
-        CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = 3;
-
-        try {
-            CRAMContainerStreamWriter containerWriter = new CRAMContainerStreamWriter(cramBAOS, indexBAOS, source, samFileHeader, "test");
-            containerWriter.writeHeader(samFileHeader);
-
-            containerWriter.writeAlignment(createSAMRecord(samFileHeader, 0, 0, 1));
-            containerWriter.writeAlignment(createSAMRecord(samFileHeader, 1, 1, 2));
-            containerWriter.writeAlignment(createSAMRecord(samFileHeader, 2, 1, 3));
-
-            containerWriter.writeAlignment(createSAMRecord(samFileHeader, 3, 1, 3));
-            containerWriter.writeAlignment(createSAMRecord(samFileHeader, 4, 2, 3));
-            containerWriter.writeAlignment(createSAMRecord(samFileHeader, 5, 2, 4));
-
-            containerWriter.finish(true);
-        }
-        finally {
-            // failing to reset this can cause unrelated tests to fail if this test fails
-            CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = originalDefaultSize;
-        }
-
-        // These tests all fail due to https://github.com/samtools/htsjdk/issues/531
-        // (metadata is incorrect after .crai->.bai conversion)
-        //SeekableStream baiStream = CRAIIndex.openCraiFileAsBaiStream(
-        //        new ByteArrayInputStream(indexBAOS.toByteArray()), samFileHeader.getSequenceDictionary());
-        //BAMIndex index = new CachingBAMFileIndex(baiStream, samFileHeader.getSequenceDictionary());
-        //final BAMIndexMetaData metaData_0 = index.getMetaData(0);
-        //Assert.assertNotNull(metaData_0);
-        //Assert.assertEquals(metaData_0.getAlignedRecordCount(), 1);
-        //final BAMIndexMetaData metaData_1 = index.getMetaData(1);
-        //Assert.assertNotNull(metaData_1);
-        //Assert.assertEquals(metaData_1.getAlignedRecordCount(), 3);
-        //final BAMIndexMetaData metaData_2 = index.getMetaData(2);
-        //Assert.assertNotNull(metaData_2);
-        //Assert.assertEquals(metaData_2.getAlignedRecordCount(), 2);
-
-        // NOTE: this test uses the default index format created by CRAMContainerStreamWriter
-        // which is currently .bai; when the
-        CRAMFileReader cramReader = new CRAMFileReader(
-                new ByteArraySeekableStream(cramBAOS.toByteArray()),
-                new ByteArraySeekableStream(indexBAOS.toByteArray()),
-                source,
-                ValidationStringency.DEFAULT_STRINGENCY
-        );
-        Assert.assertTrue(cramReader.hasIndex());
-
-        Iterator<SAMRecord> it = cramReader.query(new QueryInterval[]{new QueryInterval(0, 0, 5)}, false);
-        long count = getIteratorCount(it);
-        Assert.assertEquals(count, 1);
-
-        it = cramReader.query(new QueryInterval[]{new QueryInterval(1, 0, 5)}, false);
-        count = getIteratorCount(it);
-        Assert.assertEquals(count, 3);
-
-        it = cramReader.query(new QueryInterval[]{new QueryInterval(2, 0, 5)}, false);
-        count = getIteratorCount(it);
-        Assert.assertEquals(count, 2);
-    }
-
-    private static SAMRecord createSAMRecord(SAMFileHeader header, int recordIndex, int seqId, int start) {
-        byte[] bases = "AAAAA".getBytes();
-
-        final SAMRecord record = new SAMRecord(header);
-        record.setReferenceIndex(seqId);
-        record.setAlignmentStart(start);
-        record.setReadBases(bases);
-        record.setBaseQualities(bases);
-        record.setReadName(Integer.toString(recordIndex));
-
-        return record;
-    }
-
-    @Test(expectedExceptions = SAMException.class)
-    public void testRequireCoordinateSortOrder() {
-        SAMFileHeader header = new SAMFileHeader();
-        header.setSortOrder(SAMFileHeader.SortOrder.queryname);
-
-        new CRAMCRAIIndexer(new ByteArrayOutputStream(), header);
-    }
-
-    private long getIteratorCount(Iterator<SAMRecord> it) {
-        long count = 0;
-        while (it.hasNext()) {
-            count++;
-            it.next();
-        }
-        return count;
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/CRAMComplianceTest.java b/src/test/java/htsjdk/samtools/CRAMComplianceTest.java
deleted file mode 100644
index 81cd2f9..0000000
--- a/src/test/java/htsjdk/samtools/CRAMComplianceTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by vadim on 28/04/2015.
- */
-public class CRAMComplianceTest {
-
-    @DataProvider(name = "test1")
-    public Object[][] createData1() {
-        return new Object[][]{
-                {"auxf#values"},
-                {"c1#bounds"},
-                {"c1#clip"},
-                {"c1#noseq"},
-                {"c1#pad1"},
-                {"c1#pad2"},
-                {"c1#pad3"},
-                {"c1#unknown"},
-                {"ce#1"},
-                {"ce#2"},
-                {"ce#5b"},
-                {"ce#5"},
-                {"ce#large_seq"},
-                {"ce#supp"},
-                {"ce#tag_depadded"},
-                {"ce#tag_padded"},
-                {"ce#unmap1"},
-                {"ce#unmap2"},
-                {"ce#unmap"},
-                {"xx#blank"},
-                {"xx#large_aux2"},
-                {"xx#large_aux"},
-                {"xx#minimal"},
-                {"xx#pair"},
-                {"xx#rg"},
-                {"xx#triplet"},
-                {"xx#unsorted"},
-        };
-    }
-
-
-    @BeforeTest
-    public void beforeTest() {
-        Log.setGlobalLogLevel(Log.LogLevel.ERROR);
-    }
-
-    private static class TestCase {
-        File bamFile;
-        File refFile;
-        File cramFile_21;
-        File cramFile_30;
-
-        public TestCase(File root, String name) {
-            bamFile = new File(root, name + ".sam");
-            refFile = new File(root, name.split("#")[0] + ".fa");
-            cramFile_21 = new File(root, name + ".2.1.cram");
-            cramFile_30 = new File(root, name + ".3.0.cram");
-        }
-    }
-
-    @Test(dataProvider = "test1")
-    public void test(String name) throws IOException {
-        TestCase t = new TestCase(new File("src/test/resources/htsjdk/samtools/cram/"), name);
-
-        ReferenceSource source = new ReferenceSource(t.refFile);
-        SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(t.bamFile);
-
-        final SAMRecordIterator samRecordIterator = reader.iterator();
-        List<SAMRecord> samRecords = new ArrayList<SAMRecord>();
-        while (samRecordIterator.hasNext())
-            samRecords.add(samRecordIterator.next());
-        SAMFileHeader samFileHeader = reader.getFileHeader();
-        reader.close();
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        CRAMFileWriter cramFileWriter = new CRAMFileWriter(baos, source, samFileHeader, name);
-        for (SAMRecord samRecord : samRecords) {
-            cramFileWriter.addAlignment(samRecord);
-        }
-        cramFileWriter.close();
-
-
-        CRAMFileReader cramFileReader = new CRAMFileReader(new ByteArrayInputStream(baos.toByteArray()), (SeekableStream)null, source, ValidationStringency.SILENT);
-        SAMRecordIterator cramFileReaderIterator = cramFileReader.getIterator();
-        for (SAMRecord samRecord : samRecords) {
-            Assert.assertTrue(cramFileReaderIterator.hasNext());
-            SAMRecord restored = cramFileReaderIterator.next();
-            Assert.assertNotNull(restored);
-            assertSameRecords(CramVersions.DEFAULT_CRAM_VERSION.major, samRecord, restored);
-        }
-        Assert.assertFalse(cramFileReaderIterator.hasNext());
-
-        //v2.1 test
-        cramFileReader = new CRAMFileReader(new FileInputStream(t.cramFile_21), (SeekableStream)null, source, ValidationStringency.SILENT);
-        cramFileReaderIterator = cramFileReader.getIterator();
-        for (SAMRecord samRecord : samRecords) {
-            Assert.assertTrue(cramFileReaderIterator.hasNext());
-            SAMRecord restored = cramFileReaderIterator.next();
-            Assert.assertNotNull(restored);
-            assertSameRecords(CramVersions.CRAM_v2_1.major, samRecord, restored);
-        }
-        Assert.assertFalse(cramFileReaderIterator.hasNext());
-
-        //v3.0 test
-        cramFileReader = new CRAMFileReader(new FileInputStream(t.cramFile_30), (SeekableStream)null, source, ValidationStringency.SILENT);
-        cramFileReaderIterator = cramFileReader.getIterator();
-        for (SAMRecord samRecord : samRecords) {
-            Assert.assertTrue(cramFileReaderIterator.hasNext());
-            SAMRecord restored = cramFileReaderIterator.next();
-            Assert.assertNotNull(restored);
-            assertSameRecords(CramVersions.CRAM_v3.major, samRecord, restored);
-        }
-        Assert.assertFalse(cramFileReaderIterator.hasNext());
-    }
-
-    private void assertSameRecords(int majorVersion, SAMRecord record1, SAMRecord record2) {
-        Assert.assertEquals(record2.getFlags(), record1.getFlags());
-        Assert.assertEquals(record2.getReadName(), record1.getReadName());
-        Assert.assertEquals(record2.getReferenceName(), record1.getReferenceName());
-        Assert.assertEquals(record2.getAlignmentStart(), record1.getAlignmentStart());
-
-        /**
-         * Known issue: CRAM v2.1 doesn't handle reads with missing bases correctly. This
-         * causes '*' bases to arise when reading CRAM. Skipping the base comparison asserts.
-         */
-        if (record1.getReadBases() != SAMRecord.NULL_SEQUENCE || majorVersion >= CramVersions.CRAM_v3.major) {
-            Assert.assertEquals(record2.getReadBases(), record1.getReadBases());
-        }
-
-        Assert.assertEquals(record2.getBaseQualities(), record1.getBaseQualities());
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMContainerStreamWriterTest.java b/src/test/java/htsjdk/samtools/CRAMContainerStreamWriterTest.java
deleted file mode 100644
index b26f4b0..0000000
--- a/src/test/java/htsjdk/samtools/CRAMContainerStreamWriterTest.java
+++ /dev/null
@@ -1,184 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.SeekableMemoryStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.Log.LogLevel;
-import htsjdk.samtools.util.RuntimeIOException;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-public class CRAMContainerStreamWriterTest {
-
-    @BeforeClass
-    public void initClass() {
-        Log.setGlobalLogLevel(LogLevel.ERROR);
-    }
-
-    private List<SAMRecord> createRecords(int count) {
-        final List<SAMRecord> list = new ArrayList<SAMRecord>(count);
-        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-        if (builder.getHeader().getReadGroups().isEmpty()) {
-            throw new IllegalStateException("Read group expected in the header");
-        }
-
-        int posInRef = 1;
-        for (int i = 0; i < count / 2; i++) {
-            builder.addPair(Integer.toString(i), i % 2, posInRef += 1, posInRef += 3);
-        }
-        list.addAll(builder.getRecords());
-
-        Collections.sort(list, new SAMRecordCoordinateComparator());
-
-        return list;
-    }
-
-    private SAMFileHeader createSAMHeader(SAMFileHeader.SortOrder sortOrder) {
-        final SAMFileHeader header = new SAMFileHeader();
-        header.setSortOrder(sortOrder);
-        header.addSequence(new SAMSequenceRecord("chr1", 123));
-        header.addSequence(new SAMSequenceRecord("chr2", 123));
-        SAMReadGroupRecord readGroupRecord = new SAMReadGroupRecord("1");
-        header.addReadGroup(readGroupRecord);
-        return header;
-    }
-
-    private ReferenceSource createReferenceSource() {
-        final byte[] refBases = new byte[1024 * 1024];
-        Arrays.fill(refBases, (byte) 'A');
-        InMemoryReferenceSequenceFile rsf = new InMemoryReferenceSequenceFile();
-        rsf.add("chr1", refBases);
-        rsf.add("chr2", refBases);
-        return new ReferenceSource(rsf);
-    }
-
-    private void doTest(final List<SAMRecord> samRecords, final ByteArrayOutputStream outStream, final OutputStream indexStream) {
-        final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
-        final ReferenceSource refSource = createReferenceSource();
-
-        final CRAMContainerStreamWriter containerStream = new CRAMContainerStreamWriter(outStream, indexStream, refSource, header, "test");
-        containerStream.writeHeader(header);
-
-        for (SAMRecord record : samRecords) {
-            containerStream.writeAlignment(record);
-        }
-        containerStream.finish(true); // finish and issue EOF
-
-        // read all the records back in
-        final CRAMFileReader cReader = new CRAMFileReader(null, new ByteArrayInputStream(outStream.toByteArray()), refSource);
-        final SAMRecordIterator iterator = cReader.getIterator();
-        int count = 0;
-        while (iterator.hasNext()) {
-            SAMRecord actualRecord = iterator.next();
-            count++;
-        }
-        Assert.assertEquals(count, samRecords.size());
-    }
-
-    @Test(description = "Test CRAMContainerStream no index")
-    public void testCRAMContainerStreamNoIndex() {
-        final List<SAMRecord> samRecords = createRecords(100);
-        final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-        doTest(samRecords, outStream, null);
-    }
-
-    @Test(description = "Test CRAMContainerStream aggregating multiple partitions")
-    public void testCRAMContainerAggregatePartitions() throws IOException {
-        final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
-        final ReferenceSource refSource = createReferenceSource();
-
-        // create a bunch of records and write them out to separate streams in groups
-        final int nRecs = 100;
-        final int recsPerPartition = 20;
-        final int nPartitions = nRecs/recsPerPartition;
-
-        final List<SAMRecord> samRecords = createRecords(nRecs);
-        final ArrayList<ByteArrayOutputStream> byteStreamArray = new ArrayList<>(nPartitions);
-
-        for (int partition = 0, recNum = 0; partition < nPartitions; partition++) {
-            byteStreamArray.add(partition, new ByteArrayOutputStream());
-            final CRAMContainerStreamWriter containerStream =
-                    new CRAMContainerStreamWriter(byteStreamArray.get(partition), null, refSource, header, "test");
-
-            // don't write a header for the intermediate streams
-            for (int i = 0; i <  recsPerPartition; i++) {
-                containerStream.writeAlignment(samRecords.get(recNum++));
-            }
-            containerStream.finish(false); // finish but don't issue EOF container
-        }
-
-        // now create the final aggregate file by concatenating the individual streams, but this
-        // time with a CRAM and SAM header at the front and an EOF container at the end
-        final ByteArrayOutputStream aggregateStream = new ByteArrayOutputStream();
-        final CRAMContainerStreamWriter aggregateContainerStreamWriter = new CRAMContainerStreamWriter(aggregateStream, null, refSource, header, "test");
-        aggregateContainerStreamWriter .writeHeader(header); // write out one CRAM and SAM header
-        for (int j = 0; j < nPartitions; j++) {
-            byteStreamArray.get(j).writeTo(aggregateStream);
-        }
-        aggregateContainerStreamWriter.finish(true);// write out the EOF container
-
-        // now iterate through all the records in the aggregate file
-        final CRAMFileReader cReader = new CRAMFileReader(null, new ByteArrayInputStream(aggregateStream.toByteArray()), refSource);
-        final SAMRecordIterator iterator = cReader.getIterator();
-        int count = 0;
-        while (iterator.hasNext()) {
-            Assert.assertEquals(iterator.next().toString(), samRecords.get(count).toString());
-            count++;
-        }
-        Assert.assertEquals(count, nRecs);
-    }
-
-    @Test(description = "Test CRAMContainerStream with index")
-    public void testCRAMContainerStreamWithIndex() throws IOException {
-        final List<SAMRecord> samRecords = createRecords(100);
-        final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-        final ByteArrayOutputStream indexStream = new ByteArrayOutputStream();
-        doTest(samRecords, outStream, indexStream);
-        outStream.close();
-        indexStream.close();
-
-        // write the file out
-        final File cramTempFile = File.createTempFile("cramContainerStreamTest", ".cram");
-        cramTempFile.deleteOnExit();
-        final OutputStream cramFileStream = new FileOutputStream(cramTempFile);
-        cramFileStream.write(outStream.toByteArray());
-        cramFileStream.close();
-
-        // write the index out
-        final File indexTempFile = File.createTempFile("cramContainerStreamTest", ".bai");
-        indexTempFile.deleteOnExit();
-        OutputStream indexFileStream = new FileOutputStream(indexTempFile);
-        indexFileStream.write(indexStream.toByteArray());
-        indexFileStream.close();
-
-        final ReferenceSource refSource = createReferenceSource();
-        final CRAMFileReader reader = new CRAMFileReader(
-                cramTempFile,
-                indexTempFile,
-                refSource,
-                ValidationStringency.SILENT);
-        final CloseableIterator<SAMRecord> iterator = reader.query(new QueryInterval[]{new QueryInterval(1, 10, 10)}, false);
-        int count = 0;
-        while (iterator.hasNext()) {
-            SAMRecord actualRecord = iterator.next();
-            count++;
-        }
-        Assert.assertEquals(count, 2);
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMEdgeCasesTest.java b/src/test/java/htsjdk/samtools/CRAMEdgeCasesTest.java
deleted file mode 100644
index e77e0e8..0000000
--- a/src/test/java/htsjdk/samtools/CRAMEdgeCasesTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Iterator;
-
-/**
- * A collection of CRAM test based on round trip comparison of SAMRecord before and after CRAM compression.
- */
-public class CRAMEdgeCasesTest {
-
-    @BeforeTest
-    public void beforeTest() {
-        Log.setGlobalLogLevel(Log.LogLevel.ERROR);
-    }
-
-    @Test
-    public void testUnsorted() throws IOException {
-        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
-        builder.addFrag("1", 0, 2, false);
-        builder.addFrag("1", 0, 1, false);
-        final Collection<SAMRecord> records = builder.getRecords();
-
-        testRecords(records, records.iterator().next().getReadBases());
-    }
-
-    // int test for CRAMException
-    // testing for a contig found in the reads but not in the reference
-    @Test(expectedExceptions = CRAMException.class)
-    public void testContigNotFoundInRef() throws IOException {
-        boolean sawException = false;
-        final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram");
-        final File refFile = new File("src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa");
-        final ReferenceSource refSource = new ReferenceSource(refFile);
-        final CRAMIterator iterator = new CRAMIterator(new FileInputStream(CRAMFile), refSource, ValidationStringency.STRICT);
-        while (iterator.hasNext()) {
-            iterator.next();
-        }
-    }
-
-    @Test
-    public void testBizilionTags() throws IOException {
-        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-        builder.addFrag("1", 0, 1, false);
-        SAMRecord record = builder.getRecords().iterator().next();
-        for (int i = 0; i < 1000; i++) {
-            char b1 = (char) ('A' + i / 26);
-            char b2 = (char) ('A' + i % 26);
-            String tag = new String(new char[]{b1, b2});
-            if ("RG".equals(tag)) {
-                continue;
-            }
-            record.setAttribute(tag, i);
-        }
-
-        record.setAlignmentStart(1);
-        testSingleRecord(record, record.getReadBases());
-    }
-
-    @Test
-    public void testNullsAndBeyondRef() throws IOException {
-        testSingleRecord("A".getBytes(), "!".getBytes(), "A".getBytes());
-        testSingleRecord("A".getBytes(), SAMRecord.NULL_QUALS, "A".getBytes());
-        testSingleRecord(SAMRecord.NULL_SEQUENCE, SAMRecord.NULL_QUALS, "A".getBytes());
-        testSingleRecord("AAA".getBytes(), "!!!".getBytes(), "A".getBytes());
-    }
-
-    private void testRecords(Collection<SAMRecord> records, byte[] ref) throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        InMemoryReferenceSequenceFile refFile = new InMemoryReferenceSequenceFile();
-        refFile.add("chr1", ref);
-        ReferenceSource source = new ReferenceSource(refFile);
-        final SAMFileHeader header = records.iterator().next().getHeader();
-        CRAMFileWriter cramFileWriter = new CRAMFileWriter(baos, source, header, "whatever");
-
-        Iterator<SAMRecord> it = records.iterator();
-        while (it.hasNext()) {
-            SAMRecord record = it.next();
-            cramFileWriter.addAlignment(record);
-        }
-        cramFileWriter.close();
-
-        CRAMFileReader cramFileReader = new CRAMFileReader(new ByteArrayInputStream(baos.toByteArray()), (SeekableStream) null, source, ValidationStringency.SILENT);
-        final SAMRecordIterator iterator = cramFileReader.getIterator();
-        Assert.assertTrue(iterator.hasNext());
-
-        it = records.iterator();
-        while (it.hasNext()) {
-            SAMRecord record = it.next();
-            SAMRecord s2 = iterator.next();
-            Assert.assertNotNull(s2);
-            Assert.assertEquals(record.getFlags(), s2.getFlags());
-            Assert.assertEquals(record.getReadName(), s2.getReadName());
-            Assert.assertEquals(record.getReferenceName(), s2.getReferenceName());
-            Assert.assertEquals(record.getAlignmentStart(), s2.getAlignmentStart());
-            Assert.assertEquals(record.getReadBases(), s2.getReadBases());
-            Assert.assertEquals(record.getBaseQualities(), s2.getBaseQualities());
-        }
-        Assert.assertFalse(iterator.hasNext());
-    }
-
-    private void testSingleRecord(SAMRecord record, byte[] ref) throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        InMemoryReferenceSequenceFile refFile = new InMemoryReferenceSequenceFile();
-        refFile.add("chr1", ref);
-        ReferenceSource source = new ReferenceSource(refFile);
-        CRAMFileWriter cramFileWriter = new CRAMFileWriter(baos, source, record.getHeader(), "whatever");
-        cramFileWriter.addAlignment(record);
-        cramFileWriter.close();
-
-        CRAMFileReader cramFileReader = new CRAMFileReader(new ByteArrayInputStream(baos.toByteArray()), (SeekableStream) null, source, ValidationStringency.SILENT);
-        final SAMRecordIterator iterator = cramFileReader.getIterator();
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord s2 = iterator.next();
-        Assert.assertNotNull(s2);
-        Assert.assertFalse(iterator.hasNext());
-
-        Assert.assertEquals(record.getFlags(), s2.getFlags());
-        Assert.assertEquals(record.getReadName(), s2.getReadName());
-        Assert.assertEquals(record.getReferenceName(), s2.getReferenceName());
-        Assert.assertEquals(record.getAlignmentStart(), s2.getAlignmentStart());
-        Assert.assertEquals(record.getReadBases(), s2.getReadBases());
-        Assert.assertEquals(record.getBaseQualities(), s2.getBaseQualities());
-    }
-
-    private void testSingleRecord(byte[] bases, byte[] scores, byte[] ref) throws IOException {
-        SAMFileHeader header = new SAMFileHeader();
-        header.addReadGroup(new SAMReadGroupRecord("1"));
-        header.addSequence(new SAMSequenceRecord("chr1", ref.length));
-        SAMRecord s = new SAMRecord(header);
-        s.setReadBases(bases);
-        s.setBaseQualities(scores);
-        s.setFlags(0);
-        s.setAlignmentStart(1);
-        s.setReferenceName("chr1");
-        s.setReadName("1");
-        if (bases == SAMRecord.NULL_SEQUENCE) {
-            s.setCigarString("10M");
-        } else {
-            s.setCigarString(s.getReadLength() + "M");
-        }
-
-        testSingleRecord(s, ref);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMFileBAIIndexTest.java b/src/test/java/htsjdk/samtools/CRAMFileBAIIndexTest.java
deleted file mode 100644
index eba2b4c..0000000
--- a/src/test/java/htsjdk/samtools/CRAMFileBAIIndexTest.java
+++ /dev/null
@@ -1,301 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.ContainerParser;
-import htsjdk.samtools.cram.build.CramContainerIterator;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.reference.FakeReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.ByteArraySeekableStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Map;
-import java.util.TreeSet;
-
-/**
- * A collection of tests for CRAM BAI index write/read that use BAMFileIndexTest/index_test.bam file as the source of the test data.
- * The test will create a BAI index of the cram file before hand.
- * The scan* tests check that for every records in the BAM file the query returns the same records from the CRAM file.
- * Created by Vadim on 14/03/2015.
- */
-public class CRAMFileBAIIndexTest {
-    private final File BAM_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
-    private File cramFile;
-    private File indexFile;
-    private byte[] cramBytes;
-    private byte[] baiBytes;
-    private ReferenceSource source;
-    private int nofUnmappedReads = 279 ;
-    private int nofMappedReads = 9721;
-    private int nofReads = 10000 ;
-    private int nofReadsPerContainer = 1000 ;
-
-
-    // Mixes testing queryAlignmentStart with each CRAMFileReaderConstructor
-    // Separate into individual tests
-    @Test
-    public void testConstructors () throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(cramFile, indexFile, source, ValidationStringency.SILENT);
-        CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500);
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord record = iterator.next();
-
-        Assert.assertEquals(record.getReferenceName(), "chrM");
-        Assert.assertTrue(record.getAlignmentStart() >= 1500);
-        reader.close();
-
-        reader = new CRAMFileReader(new SeekableFileStream(cramFile), indexFile, source, ValidationStringency.SILENT);
-        iterator = reader.queryAlignmentStart("chrM", 1500);
-        Assert.assertTrue(iterator.hasNext());
-        record = iterator.next();
-
-        Assert.assertEquals(record.getReferenceName(), "chrM");
-        Assert.assertTrue(record.getAlignmentStart() >= 1500);
-        reader.close();
-
-        reader = new CRAMFileReader(new SeekableFileStream(cramFile), new SeekableFileStream(indexFile), source, ValidationStringency.SILENT);
-        iterator = reader.queryAlignmentStart("chrM", 1500);
-        Assert.assertTrue(iterator.hasNext());
-        record = iterator.next();
-
-        Assert.assertEquals(record.getReferenceName(), "chrM");
-        Assert.assertTrue(record.getAlignmentStart() >= 1500);
-        reader.close();
-
-        reader = new CRAMFileReader(new SeekableFileStream(cramFile), (File)null, source, ValidationStringency.SILENT);
-        try {
-            reader.queryAlignmentStart("chrM", 1500);
-            Assert.fail("Expecting query to fail when there is no index");
-        } catch (SAMException e) {
-        }
-        reader.close();
-
-        reader = new CRAMFileReader(new SeekableFileStream(cramFile), (SeekableFileStream)null, source, ValidationStringency.SILENT);
-        try {
-            reader.queryAlignmentStart("chrM", 1500);
-            Assert.fail("Expecting query to fail when there is no index");
-        } catch (SAMException e) {
-        }
-        reader.close();
-    }
-
-    // this test is the same as the ones above in testConstructors
-    @Test
-    public void test_chrM_1500_location() throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(cramFile, indexFile, source);
-        reader.setValidationStringency(ValidationStringency.SILENT);
-        CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500);
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord record = iterator.next();
-
-        Assert.assertEquals(record.getReferenceName(), "chrM");
-        Assert.assertTrue(record.getAlignmentStart() >= 1500);
-    }
-
-    @Test
-    public void scanMappedReads() throws IOException {
-        SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE);
-        SAMRecordIterator samRecordIterator = samReader.iterator();
-        CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT);
-        reader.setValidationStringency(ValidationStringency.SILENT);
-
-        int counter = 0;
-        while (samRecordIterator.hasNext()) {
-            SAMRecord samRecord = samRecordIterator.next();
-            if (samRecord.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) break;
-            // test only 1st and 2nd in every 100 to speed the test up:
-            if (counter++ %100 > 1) continue;
-            String s1 = samRecord.getSAMString();
-
-            CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart(samRecord.getReferenceName(), samRecord.getAlignmentStart());
-            Assert.assertTrue(iterator.hasNext(), counter + ": " + s1);
-            SAMRecord cramRecord = iterator.next();
-
-            String s2 = cramRecord.getSAMString();
-
-            Assert.assertEquals(samRecord.getReferenceName(), cramRecord.getReferenceName(), s1 + s2);
-            // default 'overlap' is true, so test records intersect the query:
-            Assert.assertTrue(CoordMath.overlaps(cramRecord.getAlignmentStart(), cramRecord.getAlignmentEnd(), samRecord.getAlignmentStart(), samRecord.getAlignmentEnd()), s1 + s2);
-        }
-        samRecordIterator.close();
-        reader.close();
-
-        Assert.assertEquals(counter, nofMappedReads);
-    }
-
-    @Test
-    public void testNoStringencyConstructor() throws IOException {
-        final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram");
-        final File refFile = new File("src/test/resources/htsjdk/samtools/cram/auxf.fa");
-        ReferenceSource refSource = new ReferenceSource(refFile);
-
-        long start = 0;
-        long end = CRAMFile.length();
-        long[] boundaries = new long[] {start << 16, (end - 1) << 16};
-        final CRAMIterator iterator = new CRAMIterator(new SeekableFileStream(CRAMFile), refSource, boundaries);
-        long count = 0;
-        while (iterator.hasNext()) {
-            count++;
-            iterator.next();
-        }
-        Assert.assertEquals(count, 2);
-    }
-
-    @Test
-    public void testIteratorFromFileSpan_WholeFile() throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT);
-        reader.setValidationStringency(ValidationStringency.SILENT);
-
-        final SAMFileSpan allContainers = reader.getFilePointerSpanningReads();
-        final CloseableIterator<SAMRecord> iterator = reader.getIterator(allContainers);
-        Assert.assertTrue(iterator.hasNext());
-        int counter = 0;
-        while (iterator.hasNext()) {
-            iterator.next();
-            counter++;
-        }
-        Assert.assertEquals(counter, nofReads);
-    }
-
-    @Test
-    public void testIteratorFromFileSpan_SecondContainer() throws IOException, IllegalAccessException {
-        CramContainerIterator it = new CramContainerIterator(new ByteArrayInputStream(cramBytes));
-        it.hasNext();
-        it.next();
-        it.hasNext();
-        Container secondContainer = it.next();
-        Assert.assertNotNull(secondContainer);
-        final Map<Integer, AlignmentSpan> references = new ContainerParser(it.getCramHeader().getSamFileHeader()).getReferences(secondContainer, ValidationStringency.STRICT);
-        it.close();
-        int refId = new TreeSet<Integer>(references.keySet()).iterator().next();
-        final AlignmentSpan alignmentSpan = references.get(refId);
-
-        CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT);
-        reader.setValidationStringency(ValidationStringency.SILENT);
-
-        final BAMIndex index = reader.getIndex();
-        final SAMFileSpan spanOfSecondContainer = index.getSpanOverlapping(refId, alignmentSpan.getStart(), alignmentSpan.getStart()+ alignmentSpan.getSpan());
-        Assert.assertNotNull(spanOfSecondContainer);
-        Assert.assertFalse(spanOfSecondContainer.isEmpty());
-        Assert.assertTrue(spanOfSecondContainer instanceof BAMFileSpan);
-
-        final CloseableIterator<SAMRecord> iterator = reader.getIterator(spanOfSecondContainer);
-        Assert.assertTrue(iterator.hasNext());
-        int counter = 0;
-        boolean matchFound = false;
-        while (iterator.hasNext()) {
-            final SAMRecord record = iterator.next();
-            if (record.getReferenceIndex().intValue() == refId) {
-                boolean overlaps = CoordMath.overlaps(record.getAlignmentStart(), record.getAlignmentEnd(), alignmentSpan.getStart(), alignmentSpan.getStart()+ alignmentSpan.getSpan());
-                if (overlaps) matchFound = true;
-            }
-            counter++;
-        }
-        Assert.assertTrue(matchFound);
-        Assert.assertTrue(counter <= CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE);
-    }
-
-    @Test
-    public void testQueryInterval() throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT);
-        QueryInterval[] query = new QueryInterval[]{new QueryInterval(0, 1519, 1520), new QueryInterval(1, 470535, 470536)};
-        final CloseableIterator<SAMRecord> iterator = reader.query(query, false);
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord r1 = iterator.next();
-        Assert.assertEquals(r1.getReadName(), "3968040");
-
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord r2 = iterator.next();
-        Assert.assertEquals(r2.getReadName(), "140419");
-
-        Assert.assertFalse(iterator.hasNext());
-        iterator.close();
-        reader.close();
-    }
-
-    @Test
-    public void scanAllUnmappedReads() throws IOException {
-        SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE);
-        CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT);
-        reader.setValidationStringency(ValidationStringency.SILENT);
-        int counter = 0;
-
-        SAMRecordIterator unmappedSamIterator = samReader.queryUnmapped();
-        CloseableIterator<SAMRecord> unmappedCramIterator = reader.queryUnmapped();
-        while (unmappedSamIterator.hasNext()) {
-            Assert.assertTrue(unmappedCramIterator.hasNext());
-            SAMRecord r1 = unmappedSamIterator.next();
-            SAMRecord r2 = unmappedCramIterator.next();
-            Assert.assertEquals(r1.getReadName(), r2.getReadName());
-            Assert.assertEquals(r1.getBaseQualityString(), r2.getBaseQualityString());
-
-            counter++;
-        }
-        Assert.assertFalse(unmappedCramIterator.hasNext());
-        Assert.assertEquals(counter, nofUnmappedReads);
-
-        reader.close();
-    }
-
-    @BeforeTest
-    public void prepare() throws IOException {
-        Log.setGlobalLogLevel(Log.LogLevel.ERROR);
-        source = new ReferenceSource(new FakeReferenceSequenceFile(SamReaderFactory.makeDefault().getFileHeader(BAM_FILE).getSequenceDictionary().getSequences()));
-        cramBytes = cramFromBAM(BAM_FILE, source);
-        cramFile = File.createTempFile(BAM_FILE.getName(), ".cram") ;
-        cramFile.deleteOnExit();
-        indexFile = new File (cramFile.getAbsolutePath() + ".bai");
-        indexFile.deleteOnExit();
-        FileOutputStream fos = new FileOutputStream(cramFile);
-        fos.write(cramBytes);
-        fos.close();
-
-        CRAMBAIIndexer.createIndex(new SeekableFileStream(cramFile), indexFile, null, ValidationStringency.STRICT);
-        baiBytes = readFile(indexFile);
-    }
-
-    private static byte[] readFile(File file) throws FileNotFoundException {
-        FileInputStream fis = new FileInputStream(file);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        IOUtil.copyStream(fis, baos);
-        return baos.toByteArray();
-    }
-
-    private byte[] cramFromBAM(File bamFile, ReferenceSource source) throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final SamReader reader = SamReaderFactory.makeDefault().open(bamFile);
-        final SAMRecordIterator iterator = reader.iterator();
-        // to reduce granularity let's use this hacky approach:
-        int previousValue = CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE ;
-        CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = nofReadsPerContainer;
-        try {
-            CRAMFileWriter writer = new CRAMFileWriter(baos, source, reader.getFileHeader(), bamFile.getName());
-            while (iterator.hasNext()) {
-                SAMRecord record = iterator.next();
-                writer.addAlignment(record);
-            }
-            writer.close();
-        }
-        finally {
-            // failing to reset this can cause unrelated tests to fail if this test fails
-            CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = previousValue;
-        }
-        return baos.toByteArray();
-    }
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMFileCRAIIndexTest.java b/src/test/java/htsjdk/samtools/CRAMFileCRAIIndexTest.java
deleted file mode 100644
index 9084a0f..0000000
--- a/src/test/java/htsjdk/samtools/CRAMFileCRAIIndexTest.java
+++ /dev/null
@@ -1,368 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.ContainerParser;
-import htsjdk.samtools.cram.build.CramContainerIterator;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.reference.FakeReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.ByteArraySeekableStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.*;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeSet;
-
-/**
- * Companion tests for the ones in CRAMFileBAIIndexTest, but run against a .bai
- * that has been converted from a .crai.
- *
- * A collection of tests for CRAM CRAI index write/read that use BAMFileIndexTest/index_test.bam
- * file as the source of the test data. The scan* tests check that for every records in the
- * CRAM file the query returns the same records from the CRAM file.
- */
-public class CRAMFileCRAIIndexTest {
-    private final File BAM_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
-
-    private final int nofReads = 10000 ;
-    private final int nofReadsPerContainer = 1000 ;
-    private final int nofUnmappedReads = 279 ;
-    private final int nofMappedReads = 9721;
-
-    private File tmpCramFile;
-    private File tmpCraiFile;
-    private byte[] cramBytes;
-    private byte[] craiBytes;
-    private ReferenceSource source;
-
-    @Test
-    public void testFileFileConstructor () throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(
-                tmpCramFile,
-                tmpCraiFile,
-                source,
-                ValidationStringency.STRICT);
-        CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500);
-
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord record = iterator.next();
-        Assert.assertEquals(record.getReferenceName(), "chrM");
-        Assert.assertTrue(record.getAlignmentStart() >= 1500);
-        reader.close();
-    }
-
-    @Test
-    public void testStreamFileConstructor () throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(
-                new SeekableFileStream(tmpCramFile),
-                tmpCraiFile,
-                source,
-                ValidationStringency.STRICT);
-        CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500);
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord record = iterator.next();
-
-        Assert.assertEquals(record.getReferenceName(), "chrM");
-        Assert.assertTrue(record.getAlignmentStart() >= 1500);
-        reader.close();
-    }
-
-    @Test
-    public void testStreamStreamConstructor() throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(
-                new SeekableFileStream(tmpCramFile),
-                new SeekableFileStream(tmpCraiFile),
-                source,
-                ValidationStringency.STRICT);
-        CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500);
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord record = iterator.next();
-
-        Assert.assertEquals(record.getReferenceName(), "chrM");
-        Assert.assertTrue(record.getAlignmentStart() >= 1500);
-        reader.close();
-    }
-
-    @Test(expectedExceptions = SAMException.class)
-    public void testFileFileConstructorNoIndex () throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(
-                new SeekableFileStream(tmpCramFile),
-                (File) null,
-                source,
-                ValidationStringency.STRICT);
-        try {
-            reader.queryAlignmentStart("chrM", 1500);
-        }
-        finally {
-            reader.close();
-        }
-    }
-
-    @Test(expectedExceptions = SAMException.class)
-    public void testStreamStreamConstructorNoIndex () throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(
-                new SeekableFileStream(tmpCramFile),
-                (SeekableFileStream) null,
-                source,
-                ValidationStringency.STRICT);
-        try {
-            reader.queryAlignmentStart("chrM", 1500);
-        }
-        finally {
-            reader.close();
-        }
-    }
-
-    @Test
-    public void testMappedReads() throws IOException {
-
-        try (SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE);
-             SAMRecordIterator samRecordIterator = samReader.iterator())
-        {
-            Assert.assertEquals(samReader.getFileHeader().getSortOrder(), SAMFileHeader.SortOrder.coordinate);
-            CRAMFileReader cramReader = new CRAMFileReader(
-                    new ByteArraySeekableStream(cramBytes),
-                    new ByteArraySeekableStream(craiBytes),
-                    source,
-                    ValidationStringency.STRICT);
-
-            int counter = 0;
-            while (samRecordIterator.hasNext()) {
-                SAMRecord samRecord = samRecordIterator.next();
-                if (samRecord.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
-                    break;
-                }
-                if (counter++ % 100 > 1) { // test only 1st and 2nd in every 100 to speed the test up:
-                    continue;
-                }
-                String sam1 = samRecord.getSAMString();
-
-                CloseableIterator<SAMRecord> iterator = cramReader.queryAlignmentStart(
-                        samRecord.getReferenceName(),
-                        samRecord.getAlignmentStart());
-
-                Assert.assertTrue(iterator.hasNext(), counter + ": " + sam1);
-                SAMRecord cramRecord = iterator.next();
-                String sam2 = cramRecord.getSAMString();
-                Assert.assertEquals(samRecord.getReferenceName(), cramRecord.getReferenceName(), sam1 + sam2);
-
-                // default 'overlap' is true, so test records intersect the query:
-                Assert.assertTrue(CoordMath.overlaps(
-                        cramRecord.getAlignmentStart(),
-                        cramRecord.getAlignmentEnd(),
-                        samRecord.getAlignmentStart(),
-                        samRecord.getAlignmentEnd()),
-                        sam1 + sam2);
-            }
-            Assert.assertEquals(counter, nofMappedReads);
-            cramReader.close();
-        }
-    }
-
-    @Test
-    public void testQueryUnmapped() throws IOException {
-        try (final SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE);
-             final SAMRecordIterator unmappedSamIterator = samReader.queryUnmapped())
-        {
-            CRAMFileReader reader = new CRAMFileReader(
-                    new ByteArraySeekableStream(cramBytes),
-                    new ByteArraySeekableStream(craiBytes),
-                    source,
-                    ValidationStringency.STRICT);
-            int counter = 0;
-            CloseableIterator<SAMRecord> unmappedCramIterator = reader.queryUnmapped();
-
-            while (unmappedSamIterator.hasNext()) {
-                Assert.assertTrue(unmappedCramIterator.hasNext());
-                SAMRecord r1 = unmappedSamIterator.next();
-                SAMRecord r2 = unmappedCramIterator.next();
-                Assert.assertEquals(r1.getReadName(), r2.getReadName());
-                Assert.assertEquals(r1.getBaseQualityString(), r2.getBaseQualityString());
-                counter++;
-            }
-
-            Assert.assertFalse(unmappedCramIterator.hasNext());
-            Assert.assertEquals(counter, nofUnmappedReads);
-        }
-    }
-
-    @Test
-    public void testIteratorConstructor() throws IOException {
-        final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram");
-        final File refFile = new File("src/test/resources/htsjdk/samtools/cram/auxf.fa");
-        ReferenceSource refSource = new ReferenceSource(refFile);
-
-        long[] boundaries = new long[] {0, (CRAMFile.length() - 1) << 16};
-        final CRAMIterator iterator = new CRAMIterator(
-                new SeekableFileStream(CRAMFile),
-                refSource, boundaries,
-                ValidationStringency.STRICT);
-        long count = getIteratorCount(iterator);
-        Assert.assertEquals(count, 2);
-    }
-
-    @Test
-    public void testNoStringencyIteratorConstructor() throws IOException {
-        final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram");
-        final File refFile = new File("src/test/resources/htsjdk/samtools/cram/auxf.fa");
-        ReferenceSource refSource = new ReferenceSource(refFile);
-
-        long[] boundaries = new long[] {0, (CRAMFile.length() - 1) << 16};
-        final CRAMIterator iterator = new CRAMIterator(new SeekableFileStream(CRAMFile), refSource, boundaries);
-
-        long count = getIteratorCount(iterator);
-        Assert.assertEquals(count, 2);
-    }
-
-    @Test
-    public void testIteratorWholeFileSpan() throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(
-                new ByteArraySeekableStream(cramBytes),
-                new ByteArraySeekableStream(craiBytes),
-                source,
-                ValidationStringency.STRICT);
-
-        final SAMFileSpan allContainers = reader.getFilePointerSpanningReads();
-        final CloseableIterator<SAMRecord> iterator = reader.getIterator(allContainers);
-        Assert.assertTrue(iterator.hasNext());
-        long count = getIteratorCount(iterator);
-        Assert.assertEquals(count, nofReads);
-    }
-
-    @Test
-    public void testIteratorSecondContainerSpan() throws IOException, IllegalAccessException {
-        CramContainerIterator it = new CramContainerIterator(new ByteArrayInputStream(cramBytes));
-        it.hasNext();
-        it.next();
-        it.hasNext();
-        Container secondContainer = it.next();
-        Assert.assertNotNull(secondContainer);
-        final Map<Integer, AlignmentSpan> references =
-                new ContainerParser(it.getCramHeader().getSamFileHeader()).getReferences(secondContainer, ValidationStringency.STRICT);
-        it.close();
-
-        int refId = new TreeSet<>(references.keySet()).iterator().next();
-        final AlignmentSpan alignmentSpan = references.get(refId);
-
-        CRAMFileReader reader = new CRAMFileReader(
-                new ByteArraySeekableStream(cramBytes),
-                new ByteArraySeekableStream(craiBytes),
-                source,
-                ValidationStringency.STRICT);
-
-        final BAMIndex index = reader.getIndex();
-        final SAMFileSpan spanOfSecondContainer = index.getSpanOverlapping(refId, alignmentSpan.getStart(), alignmentSpan.getStart()+ alignmentSpan.getSpan());
-        Assert.assertNotNull(spanOfSecondContainer);
-        Assert.assertFalse(spanOfSecondContainer.isEmpty());
-        Assert.assertTrue(spanOfSecondContainer instanceof BAMFileSpan);
-
-        final CloseableIterator<SAMRecord> iterator = reader.getIterator(spanOfSecondContainer);
-        Assert.assertTrue(iterator.hasNext());
-        int counter = 0;
-        boolean matchFound = false;
-        while (iterator.hasNext()) {
-            final SAMRecord record = iterator.next();
-            if (record.getReferenceIndex().intValue() == refId) {
-                boolean overlaps = CoordMath.overlaps(record.getAlignmentStart(), record.getAlignmentEnd(), alignmentSpan.getStart(), alignmentSpan.getStart()+ alignmentSpan.getSpan());
-                if (overlaps) matchFound = true;
-            }
-            counter++;
-        }
-        Assert.assertTrue(matchFound);
-        Assert.assertTrue(counter <= CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE);
-    }
-
-    @Test
-    public void testQueryInterval() throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(
-                new ByteArraySeekableStream(cramBytes),
-                new ByteArraySeekableStream(craiBytes),
-                source,
-                ValidationStringency.STRICT);
-        QueryInterval[] query = new QueryInterval[]{new QueryInterval(0, 1519, 1520), new QueryInterval(1, 470535, 470536)};
-        final CloseableIterator<SAMRecord> iterator = reader.query(query, false);
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord r1 = iterator.next();
-        Assert.assertEquals(r1.getReadName(), "3968040");
-
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord r2 = iterator.next();
-        Assert.assertEquals(r2.getReadName(), "140419");
-
-        Assert.assertFalse(iterator.hasNext());
-        iterator.close();
-        reader.close();
-    }
-
-    @BeforeTest
-    public void prepare() throws IOException {
-        Log.setGlobalLogLevel(Log.LogLevel.ERROR);
-        source = new ReferenceSource(new FakeReferenceSequenceFile(
-                SamReaderFactory.makeDefault().getFileHeader(BAM_FILE).getSequenceDictionary().getSequences()));
-
-        tmpCramFile = File.createTempFile(BAM_FILE.getName(), ".cram") ;
-        tmpCramFile.deleteOnExit();
-        tmpCraiFile = new File (tmpCramFile.getAbsolutePath() + ".crai");
-        tmpCraiFile.deleteOnExit();
-        cramBytes = cramFromBAM(BAM_FILE, source);
-
-        FileOutputStream fos = new FileOutputStream(tmpCramFile);
-        fos.write(cramBytes);
-        fos.close();
-
-        FileOutputStream fios = new FileOutputStream(tmpCraiFile);
-        CRAMCRAIIndexer.writeIndex(new SeekableFileStream(tmpCramFile), fios);
-        craiBytes = readFile(tmpCraiFile);
-    }
-
-    private static byte[] readFile(File file) throws FileNotFoundException {
-        FileInputStream fis = new FileInputStream(file);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        IOUtil.copyStream(fis, baos);
-        return baos.toByteArray();
-    }
-
-    private byte[] cramFromBAM(File bamFile, ReferenceSource source) throws IOException {
-
-        int previousValue = CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE;
-        CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = nofReadsPerContainer;
-
-        try (final SamReader reader = SamReaderFactory.makeDefault().open(bamFile);
-             final SAMRecordIterator iterator = reader.iterator();
-             final ByteArrayOutputStream baos = new ByteArrayOutputStream())
-        {
-            CRAMFileWriter writer = new CRAMFileWriter(
-                    baos,
-                    source,
-                    reader.getFileHeader(),
-                    bamFile.getName());
-            while (iterator.hasNext()) {
-                SAMRecord record = iterator.next();
-                writer.addAlignment(record);
-            }
-            writer.close();
-            return baos.toByteArray();
-        }
-        finally {
-            // failing to reset this can cause unrelated tests to fail if this test fails
-            CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = previousValue;
-        }
-    }
-
-    private long getIteratorCount(Iterator<SAMRecord> it) {
-        long count = 0;
-        while (it.hasNext()) {
-            count++;
-            it.next();
-        }
-        return count;
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMFileReaderTest.java b/src/test/java/htsjdk/samtools/CRAMFileReaderTest.java
deleted file mode 100644
index 3fcb3bd..0000000
--- a/src/test/java/htsjdk/samtools/CRAMFileReaderTest.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-
-/**
- * Additional tests for CRAMFileReader are in CRAMFileIndexTest
- */
-public class CRAMFileReaderTest {
-
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-    private static final File CRAM_WITH_CRAI = new File(TEST_DATA_DIR, "cram_with_crai_index.cram");
-    private static final File CRAM_WITHOUT_CRAI = new File(TEST_DATA_DIR, "cram_query_sorted.cram");
-    private static final ReferenceSource REFERENCE = createReferenceSource();
-    private static final File INDEX_FILE = new File(TEST_DATA_DIR, "cram_with_crai_index.cram.crai");
-
-
-    @BeforeClass
-    public void initClass() {
-        Log.setGlobalLogLevel(Log.LogLevel.ERROR);
-    }
-
-    private static ReferenceSource createReferenceSource() {
-        byte[] refBases = new byte[10 * 10];
-        Arrays.fill(refBases, (byte) 'A');
-        InMemoryReferenceSequenceFile rsf = new InMemoryReferenceSequenceFile();
-        rsf.add("chr1", refBases);
-        return new ReferenceSource(rsf);
-    }
-
-    // constructor 1: CRAMFileReader(final File cramFile, final InputStream inputStream)
-
-    @Test(description = "Test CRAMReader 1 reference required", expectedExceptions = IllegalStateException.class)
-    public void testCRAMReader1_ReferenceRequired() {
-        InputStream bis = null;
-        // assumes that reference_fasta property is not set and the download service is not enabled
-        new CRAMFileReader(CRAM_WITH_CRAI, bis);
-    }
-
-    // constructor 2: CRAMFileReader(final File cramFile, final InputStream inputStream, final ReferenceSource referenceSource)
-
-    @Test(description = "Test CRAMReader 2 reference required", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMReader2ReferenceRequired() {
-        InputStream bis =  null;
-        new CRAMFileReader(CRAM_WITH_CRAI, bis, null);
-    }
-
-    @Test(description = "Test CRAMReader 2 input required", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMReader2_InputRequired() {
-        File file = null;
-        InputStream bis =  null;
-        new CRAMFileReader(file, bis, createReferenceSource());
-    }
-
-    @Test
-    public void testCRAMReader2_ShouldAutomaticallyFindCRAMIndex() {
-        InputStream inputStream = null;
-        CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, inputStream, REFERENCE);
-        reader.getIndex();
-        Assert.assertTrue(reader.hasIndex(), "Can't find CRAM existing index.");
-    }
-
-    @Test(expectedExceptions = SAMException.class)
-    public void testCRAMReader2_WithoutCRAMIndex() {
-        InputStream inputStream = null;
-        CRAMFileReader reader = new CRAMFileReader(CRAM_WITHOUT_CRAI, inputStream, REFERENCE);
-        reader.getIndex();
-    }
-
-    // constructor 3: CRAMFileReader(final File cramFile, final File indexFile, final ReferenceSource referenceSource)
-
-    @Test(description = "Test CRAMReader 3 reference required", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMReader3_RequiredReference() {
-        File indexFile = null;
-        ReferenceSource refSource = null;
-        new CRAMFileReader(CRAM_WITH_CRAI, indexFile, refSource);
-    }
-
-    @Test(description = "Test CRAMReader 3 input required", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMReader3_InputRequired() {
-        File inputFile = null;
-        File indexFile = null;
-        ReferenceSource refSource = null;
-        new CRAMFileReader(inputFile, indexFile, refSource);
-    }
-
-    @Test
-    public void testCRAMReader3_ShouldAutomaticallyFindCRAMIndex() {
-        File indexFile = null;
-        CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, indexFile, REFERENCE);
-        reader.getIndex();
-        Assert.assertTrue(reader.hasIndex(), "Can't find existing CRAM index.");
-    }
-
-    @Test
-    public void testCRAMReader3_ShouldUseCRAMIndex() {
-        CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, INDEX_FILE, REFERENCE);
-        reader.getIndex();
-        Assert.assertTrue(reader.hasIndex(), "Can't find existing CRAM index.");
-    }
-
-    @Test(expectedExceptions = SAMException.class)
-    public void testCRAMReader3_WithoutCRAMIndex() {
-        File indexFile = null;
-        CRAMFileReader reader = new CRAMFileReader(CRAM_WITHOUT_CRAI, indexFile, REFERENCE);
-        reader.getIndex();
-    }
-
-    // constructor 4: CRAMFileReader(final File cramFile, final ReferenceSource referenceSource)
-
-    @Test(description = "Test CRAMReader 4 reference required", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMReader4_ReferenceRequired() {
-        ReferenceSource refSource = null;
-        new CRAMFileReader(CRAM_WITH_CRAI, refSource);
-    }
-
-    @Test(description = "Test CRAMReader 4 input required", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMReader4_InputRequired() {
-        File inputFile = null;
-        new CRAMFileReader(inputFile, createReferenceSource());
-    }
-
-    @Test
-    public void testCRAMReader4_ShouldAutomaticallyFindCRAMIndex() {
-        CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, REFERENCE);
-        reader.getIndex();
-        Assert.assertTrue(reader.hasIndex(), "Can't find existing CRAM index.");
-    }
-
-    @Test(expectedExceptions = SAMException.class)
-    public void testCRAMReader4_WithoutCRAMIndex() {
-        CRAMFileReader reader = new CRAMFileReader(CRAM_WITHOUT_CRAI, REFERENCE);
-        reader.getIndex();
-    }
-
-    // constructor 5: CRAMFileReader(final InputStream inputStream, final SeekableStream indexInputStream,
-    //          final ReferenceSource referenceSource, final ValidationStringency validationStringency)
-    @Test(description = "Test CRAMReader 5 reference required", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMReader5_ReferenceRequired() throws IOException {
-        InputStream bis = new ByteArrayInputStream(new byte[0]);
-        SeekableFileStream sfs = null;
-        ReferenceSource refSource = null;
-        new CRAMFileReader(bis, sfs, refSource, ValidationStringency.STRICT);
-    }
-
-    @Test(description = "Test CRAMReader 5 input required", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMReader5_InputRequired() throws IOException {
-        InputStream bis = null;
-        SeekableFileStream sfs = null;
-        new CRAMFileReader(bis, sfs, createReferenceSource(), ValidationStringency.STRICT);
-    }
-
-    // constructor 6: CRAMFileReader(final InputStream stream, final File indexFile, final ReferenceSource referenceSource,
-    //                final ValidationStringency validationStringency)
-    @Test(description = "Test CRAMReader 6 reference required", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMReader6_ReferenceRequired() throws IOException {
-        InputStream bis = new ByteArrayInputStream(new byte[0]);
-        File file = null;
-        ReferenceSource refSource = null;
-        new CRAMFileReader(bis, file, refSource, ValidationStringency.STRICT);
-    }
-
-    @Test(description = "Test CRAMReader 6 input required", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMReader6_InputRequired() throws IOException {
-        InputStream bis = null;
-        File file = null;
-        new CRAMFileReader(bis, file, createReferenceSource(), ValidationStringency.STRICT);
-    }
-
-    // constructor 7: CRAMFileReader(final File cramFile, final File indexFile, final ReferenceSource referenceSource,
-    //                final ValidationStringency validationStringency)
-    @Test(description = "Test CRAMReader 7 reference required", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMReader7_ReferenceRequired() throws IOException {
-        ReferenceSource refSource = null;
-        new CRAMFileReader(CRAM_WITH_CRAI, CRAM_WITH_CRAI, refSource, ValidationStringency.STRICT);
-    }
-
-    @Test
-    public void testCRAMReader7_ShouldAutomaticallyFindCRAMIndex()throws IOException {
-        File indexFile = null;
-        CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, indexFile, REFERENCE, ValidationStringency.STRICT);
-        Assert.assertTrue(reader.hasIndex(), "Can't find existing CRAM index.");
-    }
-
-    @Test
-    public void testCRAMReader7_ShouldUseCRAMIndex() throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, INDEX_FILE, REFERENCE, ValidationStringency.STRICT);
-        Assert.assertTrue(reader.hasIndex(), "Can't find existing CRAM index.");
-    }
-
-    @Test(expectedExceptions = SAMException.class)
-    public void testCRAMReader7_WithoutCRAMIndex() throws IOException {
-        File indexFile = null;
-        CRAMFileReader reader = new CRAMFileReader(CRAM_WITHOUT_CRAI, indexFile, REFERENCE, ValidationStringency.STRICT);
-        reader.getIndex();
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMFileWriterTest.java b/src/test/java/htsjdk/samtools/CRAMFileWriterTest.java
deleted file mode 100644
index c495528..0000000
--- a/src/test/java/htsjdk/samtools/CRAMFileWriterTest.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.Log.LogLevel;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-public class CRAMFileWriterTest {
-
-    @BeforeClass
-    public void initClass() {
-        Log.setGlobalLogLevel(LogLevel.ERROR);
-    }
-
-    @Test(description = "Test for lossy CRAM compression invariants.")
-    public void lossyCramInvariantsTest() {
-        doTest(createRecords(1000));
-    }
-
-    @Test(description = "Tests a writing records with null SAMFileHeaders")
-    public void writeRecordsWithNullHeader() throws Exception {
-
-        final List<SAMRecord> samRecs = createRecords(50);
-        for (SAMRecord rec : samRecs) {
-            rec.setHeader(null);
-        }
-        doTest(samRecs);
-    }
-
-    @Test(description = "Tests a unmapped record with sequence and quality fields")
-    public void unmappedWithSequenceAndQualityField() throws Exception {
-        unmappedSequenceAndQualityFieldHelper(true);
-    }
-
-    @Test(description = "Tests a unmapped record with no sequence or quality fields")
-    public void unmappedWithNoSequenceAndQualityField() throws Exception {
-        unmappedSequenceAndQualityFieldHelper(false);
-    }
-
-    private void unmappedSequenceAndQualityFieldHelper(boolean unmappedHasBasesAndQualities) throws Exception {
-        List<SAMRecord> list = new ArrayList<SAMRecord>(2);
-        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-        if (builder.getHeader().getReadGroups().isEmpty()) {
-            throw new Exception("Read group expected in the header");
-        }
-
-        builder.setUnmappedHasBasesAndQualities(unmappedHasBasesAndQualities);
-
-        builder.addUnmappedFragment("test1");
-        builder.addUnmappedPair("test2");
-
-        list.addAll(builder.getRecords());
-
-        Collections.sort(list, new SAMRecordCoordinateComparator());
-
-        doTest(list);
-    }
-
-    private List<SAMRecord> createRecords(int count) {
-        List<SAMRecord> list = new ArrayList<SAMRecord>(count);
-        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-        if (builder.getHeader().getReadGroups().isEmpty()) {
-            throw new IllegalStateException("Read group expected in the header");
-        }
-
-        int posInRef = 1;
-        for (int i = 0; i < count / 2; i++) {
-            builder.addPair(Integer.toString(i), 0, posInRef += 1,
-                    posInRef += 3);
-        }
-        list.addAll(builder.getRecords());
-
-        Collections.sort(list, new SAMRecordCoordinateComparator());
-
-        return list;
-    }
-
-    private SAMFileHeader createSAMHeader(SAMFileHeader.SortOrder sortOrder) {
-        final SAMFileHeader header = new SAMFileHeader();
-        header.setSortOrder(sortOrder);
-        header.addSequence(new SAMSequenceRecord("chr1", 123));
-        SAMReadGroupRecord readGroupRecord = new SAMReadGroupRecord("1");
-        header.addReadGroup(readGroupRecord);
-        return header;
-    }
-
-    private ReferenceSource createReferenceSource() {
-        byte[] refBases = new byte[1024 * 1024];
-        Arrays.fill(refBases, (byte) 'A');
-        InMemoryReferenceSequenceFile rsf = new InMemoryReferenceSequenceFile();
-        rsf.add("chr1", refBases);
-        return new ReferenceSource(rsf);
-    }
-
-    private void writeRecordsToCRAM(CRAMFileWriter writer, List<SAMRecord> samRecords) {
-        for (SAMRecord record : samRecords) {
-            writer.addAlignment(record);
-        }
-        writer.close();
-    }
-
-    private void validateRecords(final List<SAMRecord> expectedRecords, ByteArrayInputStream is, ReferenceSource referenceSource) {
-        CRAMFileReader cReader = new CRAMFileReader(null, is, referenceSource);
-
-        SAMRecordIterator iterator2 = cReader.getIterator();
-        int index = 0;
-        while (iterator2.hasNext()) {
-            SAMRecord actualRecord = iterator2.next();
-            SAMRecord expectedRecord = expectedRecords.get(index++);
-
-            Assert.assertEquals(actualRecord.getReadName(), expectedRecord.getReadName());
-            Assert.assertEquals(actualRecord.getFlags(), expectedRecord.getFlags());
-            Assert.assertEquals(actualRecord.getAlignmentStart(), expectedRecord.getAlignmentStart());
-            Assert.assertEquals(actualRecord.getAlignmentEnd(), expectedRecord.getAlignmentEnd());
-            Assert.assertEquals(actualRecord.getReferenceName(), expectedRecord.getReferenceName());
-            Assert.assertEquals(actualRecord.getMateAlignmentStart(),
-                    expectedRecord.getMateAlignmentStart());
-            Assert.assertEquals(actualRecord.getMateReferenceName(),
-                    expectedRecord.getMateReferenceName());
-            Assert.assertEquals(actualRecord.getReadBases(), expectedRecord.getReadBases());
-            Assert.assertEquals(actualRecord.getBaseQualities(), expectedRecord.getBaseQualities());
-        }
-        cReader.close();
-    }
-
-    private void doTest(final List<SAMRecord> samRecords) {
-        final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
-        final ReferenceSource refSource = createReferenceSource();
-        final ByteArrayOutputStream os = new ByteArrayOutputStream();
-
-        CRAMFileWriter writer = new CRAMFileWriter(os, refSource, header, null);
-        writeRecordsToCRAM(writer, samRecords);
-
-        validateRecords(samRecords, new ByteArrayInputStream(os.toByteArray()), refSource);
-    }
-
-    @Test(description = "Test CRAMWriter constructor with index stream")
-    public void testCRAMWriterWithIndex() {
-        final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
-        final ReferenceSource refSource = createReferenceSource();
-        final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-        final ByteArrayOutputStream indexStream = new ByteArrayOutputStream();
-
-        final List<SAMRecord> samRecords = createRecords(100);
-        CRAMFileWriter writer = new CRAMFileWriter(outStream, indexStream, refSource, header, null);
-
-        writeRecordsToCRAM(writer, samRecords);
-        validateRecords(samRecords, new ByteArrayInputStream(outStream.toByteArray()), refSource);
-        Assert.assertTrue(indexStream.size() != 0);
-    }
-
-    @Test(description = "Test CRAMWriter constructor with presorted==false")
-    public void testCRAMWriterNotPresorted() {
-        final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
-        final ReferenceSource refSource = createReferenceSource();
-        final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-        final ByteArrayOutputStream indexStream = new ByteArrayOutputStream();
-
-        CRAMFileWriter writer = new CRAMFileWriter(outStream, indexStream, false, refSource, header, null);
-
-        // force records to not be coordinate sorted to ensure we're relying on presorted=false
-        final List<SAMRecord> samRecords = createRecords(100);
-        Collections.sort(samRecords, new SAMRecordCoordinateComparator().reversed());
-
-        writeRecordsToCRAM(writer, samRecords);
-
-        // for validation, restore the sort order of the expected records so they match the order of the written records
-        Collections.sort(samRecords, new SAMRecordCoordinateComparator());
-        validateRecords(samRecords, new ByteArrayInputStream(outStream.toByteArray()), refSource);
-        Assert.assertTrue(indexStream.size() != 0);
-    }
-
-    @Test(description = "Test CRAMWriter constructor reference required 1", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMWriterConstructorRequiredReference_1() {
-        final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
-        final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-        new CRAMFileWriter(outStream, null, header, null);
-    }
-
-    @Test(description = "Test CRAMWriter constructor reference required 2", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMWriterConstructorRequiredReference_2() {
-        final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
-        final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-        new CRAMFileWriter(outStream, null, null, header, null);
-    }
-
-    @Test(description = "Test CRAMWriter constructor reference required 3", expectedExceptions = IllegalArgumentException.class)
-    public void testCRAMWriterConstructorRequiredReference_3() {
-        final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
-        final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-        new CRAMFileWriter(outStream, null, true, null, header, null);
-    }
-
-    @Test
-    public void test_roundtrip_tlen_preserved() throws IOException {
-        SamReader reader = SamReaderFactory.make().open(new File("src/test/resources/htsjdk/samtools/cram_tlen_reads.sorted.sam"));
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final ReferenceSource source = new ReferenceSource(new File("src/test/resources/htsjdk/samtools/cram_tlen.fasta"));
-        CRAMFileWriter writer = new CRAMFileWriter(baos, source, reader.getFileHeader(), "test.cram");
-        SAMRecordIterator iterator = reader.iterator();
-        List<SAMRecord> records = new ArrayList<SAMRecord>();
-        while (iterator.hasNext()) {
-            final SAMRecord record = iterator.next();
-            writer.addAlignment(record);
-            records.add(record);
-        }
-        writer.close();
-
-        CRAMFileReader cramReader = new CRAMFileReader(new ByteArrayInputStream(baos.toByteArray()), (File) null, source, ValidationStringency.STRICT);
-        iterator = cramReader.getIterator();
-        int i = 0;
-        while (iterator.hasNext()) {
-            SAMRecord record1 = iterator.next();
-            SAMRecord record2 = records.get(i++);
-            Assert.assertEquals(record1.getInferredInsertSize(), record2.getInferredInsertSize(), record1.getReadName());
-        }
-        Assert.assertEquals(records.size(), i);
-    }
-
-    @Test
-    public void testCRAMQuerySort() throws IOException {
-        final File input = new File("src/test/resources/htsjdk/samtools/cram_query_sorted.cram");
-        final File reference = new File("src/test/resources/htsjdk/samtools/cram_query_sorted.fasta");
-        final File outputFile = File.createTempFile("tmp.", ".cram");
-
-        try (final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(input);
-             final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(reader.getFileHeader().clone(), false, outputFile, reference)) {
-            for (SAMRecord rec : reader) {
-                writer.addAlignment(rec);
-            }
-        }
-
-        try (final SamReader outReader = SamReaderFactory.makeDefault().referenceSequence(reference).open(outputFile)) {
-            String prevName = null;
-            for (final SAMRecord rec : outReader) {
-                if (prevName == null) {
-                    prevName = rec.getReadName();
-                    continue;
-                }
-                // test if the read names are sorted alphabetically:
-                Assert.assertTrue(rec.getReadName().compareTo(prevName) >= 0);
-            }
-        }
-
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMFileWriterWithIndexTest.java b/src/test/java/htsjdk/samtools/CRAMFileWriterWithIndexTest.java
deleted file mode 100644
index b7e3eab..0000000
--- a/src/test/java/htsjdk/samtools/CRAMFileWriterWithIndexTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.ByteArraySeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-
-/**
- * Created by vadim on 23/03/2015.
- */
-public class CRAMFileWriterWithIndexTest {
-    private byte[] cramBytes;
-    private byte[] indexBytes;
-    private InMemoryReferenceSequenceFile rsf;
-    private ReferenceSource source;
-    private SAMFileHeader header;
-
-    @Test
-    public void test() throws IOException {
-        CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(indexBytes), source, ValidationStringency.SILENT);
-        for (SAMSequenceRecord sequenceRecord : reader.getFileHeader().getSequenceDictionary().getSequences()) {
-            final CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart(sequenceRecord.getSequenceName(), 1);
-            Assert.assertNotNull(iterator);
-            Assert.assertTrue(iterator.hasNext());
-            SAMRecord record = iterator.next();
-            Assert.assertEquals(record.getReferenceName(), sequenceRecord.getSequenceName());
-            Assert.assertEquals(record.getAlignmentStart(), 1);
-        }
-    }
-
-    private static class TabuRegionInputStream extends SeekableStream {
-        private SeekableStream delegate;
-        private List<Chunk> tabuChunks;
-
-        public TabuRegionInputStream(List<Chunk> tabuChunks, SeekableStream delegate) {
-            this.tabuChunks = tabuChunks;
-            this.delegate = delegate;
-        }
-
-        private boolean isTabu(long position) {
-
-            for (Chunk chunk : tabuChunks) {
-                if ((chunk.getChunkStart() >> 16) < position && position < (chunk.getChunkEnd() >> 16)) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        @Override
-        public long length() {
-            return delegate.length();
-        }
-
-        @Override
-        public long position() throws IOException {
-            return delegate.position();
-        }
-
-        @Override
-        public void seek(long position) throws IOException {
-            if (isTabu(position)) {
-                throw new TabuError();
-            }
-            delegate.seek(position);
-        }
-
-        @Override
-        public int read() throws IOException {
-            if (isTabu(position())) throw new TabuError();
-            return delegate.read();
-        }
-
-        @Override
-        public int read(byte[] buffer, int offset, int length) throws IOException {
-            for (long pos = position(); pos < position() + length; pos++)
-                if (isTabu(pos)) {
-                    throw new TabuError();
-                }
-            return delegate.read(buffer, offset, length);
-        }
-
-        @Override
-        public void close() throws IOException {
-            delegate.close();
-        }
-
-        @Override
-        public boolean eof() throws IOException {
-            return delegate.eof();
-        }
-
-        @Override
-        public String getSource() {
-            return delegate.getSource();
-        }
-    }
-
-    private static class TabuError extends RuntimeException {
-
-    }
-
-    /**
-     * This is to check that the indexing actually works and not just skips records. The approach is to forbid reading of the first
-     * container and try accessing reads from the first and the second containers. The first attempt should fail but the second should succeed.
-     *
-     * @throws IOException
-     */
-    @Test
-    public void testUnnecessaryIO() throws IOException {
-        final SeekableStream baiStream = SamIndexes.asBaiSeekableStreamOrNull(new ByteArraySeekableStream(indexBytes), header.getSequenceDictionary());
-
-        BAMIndex index = new CachingBAMFileIndex(baiStream, header.getSequenceDictionary());
-        int refID = 0;
-        long start = index.getSpanOverlapping(refID, 1, Integer.MAX_VALUE).getFirstOffset();
-        long end = index.getSpanOverlapping(refID + 1, 1, Integer.MAX_VALUE).getFirstOffset();
-        TabuRegionInputStream tabuIS = new TabuRegionInputStream(Arrays.asList(new Chunk[]{new Chunk(start, end)}), new ByteArraySeekableStream(cramBytes));
-
-        CRAMFileReader reader = new CRAMFileReader(tabuIS, new ByteArraySeekableStream(indexBytes), source, ValidationStringency.SILENT);
-        try {
-            // the attempt to read 1st container, which will happen when the iterator is initialized, must throw
-            CloseableIterator<SAMRecord> it = reader.queryAlignmentStart(header.getSequence(refID).getSequenceName(), 1);
-            Assert.fail();
-        } catch (TabuError e) {
-
-        }
-
-        // reading after the 1st container should be ok:
-        refID = 2;
-        final CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart(header.getSequence(refID).getSequenceName(), 1);
-        Assert.assertNotNull(iterator);
-        Assert.assertTrue(iterator.hasNext());
-    }
-
-    @BeforeTest
-    public void beforeTest() throws Exception {
-        Log.setGlobalLogLevel(Log.LogLevel.ERROR);
-
-        header = new SAMFileHeader();
-        header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-        SAMReadGroupRecord readGroupRecord = new SAMReadGroupRecord("1");
-
-        rsf = new InMemoryReferenceSequenceFile();
-        int nofSequencesInDictionary = 3;
-        int sequenceLength = 1024 * 1024;
-        for (int i = 0; i < nofSequencesInDictionary; i++)
-            addRandomSequence(header, sequenceLength, rsf);
-
-        source = new ReferenceSource(rsf);
-
-        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.coordinate);
-        builder.setHeader(header);
-        builder.setReadGroup(readGroupRecord);
-        header.addReadGroup(readGroupRecord);
-
-        ByteArrayOutputStream os = new ByteArrayOutputStream();
-        ByteArrayOutputStream indexOS = new ByteArrayOutputStream();
-        CRAMFileWriter writer = new CRAMFileWriter(os, indexOS, source, header, null);
-
-        int readPairsPerSequence = CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE;
-
-        for (SAMSequenceRecord sequenceRecord : header.getSequenceDictionary().getSequences()) {
-            int alignmentStart = 1;
-            for (int i = 0; i < readPairsPerSequence / 2; i++) {
-                builder.addPair(Integer.toString(i), sequenceRecord.getSequenceIndex(), alignmentStart, alignmentStart + 2);
-                alignmentStart++;
-            }
-        }
-
-        List<SAMRecord> list = new ArrayList<SAMRecord>(readPairsPerSequence);
-        list.addAll(builder.getRecords());
-        Collections.sort(list, new SAMRecordCoordinateComparator());
-
-        for (SAMRecord record : list)
-            writer.addAlignment(record);
-
-        list.clear();
-        writer.close();
-        cramBytes = os.toByteArray();
-        indexBytes = indexOS.toByteArray();
-    }
-
-    private static void addRandomSequence(SAMFileHeader header, int length, InMemoryReferenceSequenceFile rsf) {
-        String name = String.valueOf(header.getSequenceDictionary().size() + 1);
-        header.addSequence(new SAMSequenceRecord(name, length));
-        byte[] refBases = new byte[length];
-        Random random = new Random();
-        byte[] alphabet = "ACGTN".getBytes();
-        for (int i = 0; i < refBases.length; i++)
-            refBases[i] = alphabet[random.nextInt(alphabet.length)];
-
-        rsf.add(name, refBases);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMIndexQueryTest.java b/src/test/java/htsjdk/samtools/CRAMIndexQueryTest.java
deleted file mode 100644
index df94310..0000000
--- a/src/test/java/htsjdk/samtools/CRAMIndexQueryTest.java
+++ /dev/null
@@ -1,708 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.util.CloseableIterator;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.StandardCopyOption;
-import java.util.function.Function;
-
-/**
- * Test index query calls against a *SamReader* on a CRAM File, which will use
- * whatever index format (.bai or .crai converted to .bai) is available for the
- * target file.
- */
-public class CRAMIndexQueryTest {
-
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/cram");
-
-    private static final File cramQueryWithBAI = new File(TEST_DATA_DIR, "cramQueryWithBAI.cram");
-    private static final File cramQueryWithCRAI = new File(TEST_DATA_DIR, "cramQueryWithCRAI.cram");
-    private static File cramQueryWithLocalCRAI = null; // generated  by @BeforeClass from cramQueryWithCRAI
-    private static final File cramQueryReference = new File(TEST_DATA_DIR, "human_g1k_v37.20.21.10M-10M200k.fasta");
-
-    private static final File cramQueryReadsWithBAI = new File(TEST_DATA_DIR, "cramQueryTest.cram");
-    private static File cramQueryReadsWithLocalCRAI = null; // generated  by @BeforeClass from cramQueryReadsWithBAI
-
-    private static final File cramQueryTestEmptyWithBAI = new File(TEST_DATA_DIR, "cramQueryTestEmpty.cram");
-    private static File cramQueryTestEmptyWithLocalCRAI = null; // generated  by @BeforeClass from cramQueryTestEmptyWithBAI
-    private static final File cramQueryReadsReference = new File(TEST_DATA_DIR,"../hg19mini.fasta");
-
-
-    // htsjdk currently generates .bai index files instead of .crai due to https://github.com/samtools/htsjdk/issues/531;
-    // however we still want to test the htsjdk CRAI creation code. In order to run these index query tests against CRAI
-    // files generated by htsjdk, we copy the checked-in test files into new CRAMs  and then manually generate .CRAI files
-    // to run to use as additional test cases
-    @BeforeClass
-    public void createLocallyGeneratedCRAIFiles() throws IOException {
-        cramQueryWithLocalCRAI = File.createTempFile("cramQueryWithLocalCRAI.", ".cram");
-        cramQueryWithLocalCRAI.deleteOnExit();
-        File tempCRAIOut = new File(cramQueryWithLocalCRAI.getAbsolutePath() + ".crai");
-        tempCRAIOut.deleteOnExit();
-        createLocalCRAMAndCRAI(
-                cramQueryWithCRAI,
-                cramQueryReference,
-                cramQueryWithLocalCRAI,
-                tempCRAIOut
-        );
-
-        cramQueryReadsWithLocalCRAI = File.createTempFile("cramQueryReadsWithLocalCRAI.", ".cram");
-        tempCRAIOut = new File(cramQueryReadsWithLocalCRAI.getAbsolutePath() + ".crai");
-        tempCRAIOut.deleteOnExit();
-        cramQueryReadsWithLocalCRAI.deleteOnExit();
-        createLocalCRAMAndCRAI(
-                cramQueryReadsWithBAI,
-                cramQueryReadsReference,
-                cramQueryReadsWithLocalCRAI,
-                tempCRAIOut
-        );
-
-        cramQueryTestEmptyWithLocalCRAI = File.createTempFile("cramQueryTestEmptyWithLocalCRAI.", ".cram");
-        tempCRAIOut = new File(cramQueryTestEmptyWithLocalCRAI.getAbsolutePath() +".crai");
-        tempCRAIOut.deleteOnExit();
-        cramQueryTestEmptyWithLocalCRAI.deleteOnExit();
-        createLocalCRAMAndCRAI(
-                cramQueryTestEmptyWithBAI,
-                cramQueryReference,
-                cramQueryTestEmptyWithLocalCRAI,
-                tempCRAIOut
-        );
-    }
-
-    private void createLocalCRAMAndCRAI(
-            final File inputCRAM,
-            final File reference,
-            final File outputCRAM,
-            final File outputCRAI) throws IOException
-    {
-        Files.copy(inputCRAM.toPath(), outputCRAM.toPath(), StandardCopyOption.REPLACE_EXISTING);
-
-        SAMFileHeader samHeader = null;
-        try (SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(inputCRAM)) {
-            samHeader = reader.getFileHeader();
-        }
-        try (FileOutputStream bos = new FileOutputStream(outputCRAI)) {
-            CRAMCRAIIndexer craiIndexer = new CRAMCRAIIndexer(bos, samHeader);
-            craiIndexer.writeIndex(new SeekableFileStream(outputCRAM), bos);
-        }
-    }
-
-    @DataProvider(name = "singleIntervalOverlapping")
-    public Object[][] singleIntervalOverlapping() {
-        return new Object[][] {
-            {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 100009, 100009), new String[]{"a", "b", "c"}},
-            {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 100009, 100009), new String[]{"a", "b", "c"}},
-            {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 100009, 100009), new String[]{"a", "b", "c"}},
-
-            {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 100009, 100011), new String[]{"a", "b", "c", "d", "e"}},
-            {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 100009, 100011), new String[]{"a", "b", "c", "d", "e"}},
-            {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 100009, 100011), new String[]{"a", "b", "c", "d", "e"}},
-
-            // interval with 1 start
-            {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 1, 100010), new String[]{"a", "b", "c", "d"}},
-            {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 1, 100010), new String[]{"a", "b", "c", "d"}},
-            {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 1, 100010), new String[]{"a", "b", "c", "d"}},
-
-            // interval with 0 end
-            {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 100015, 0), new String[]{"a", "b", "c", "d", "e", "f"}},
-            {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 100015, 0), new String[]{"a", "b", "c", "d", "e", "f"}},
-            {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 100015, 0), new String[]{"a", "b", "c", "d", "e", "f"}},
-
-            // interval with 1 start and 0 end
-            {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f",  "f"}},
-            {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f",  "f"}},
-            {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f",  "f"}},
-
-            //totally empty cram file
-            {cramQueryTestEmptyWithBAI, cramQueryReadsReference, new QueryInterval(0, 1, 0), new String[]{}},
-            {cramQueryTestEmptyWithLocalCRAI, cramQueryReadsReference, new QueryInterval(0, 1, 0), new String[]{}},
-        };
-    }
-
-    @Test(dataProvider="singleIntervalOverlapping")
-    public void testQueryOverlappingSingleInterval(
-        final File cramFileName,
-        final File referenceFileName,
-        final QueryInterval interval,
-        final String[] expectedNames) throws IOException
-    {
-        doQueryTest(
-                reader -> reader.queryOverlapping(new QueryInterval[]{interval}),
-                cramFileName,
-                referenceFileName,
-                expectedNames
-        );
-    }
-
-    @Test(dataProvider="singleIntervalOverlapping")
-    public void testQueryOverlappingSequence(
-        final File cramFileName,
-        final File referenceFileName,
-        final QueryInterval interval,
-        final String[] expectedNames) throws IOException
-    {
-        doQueryTest(
-            reader -> reader.queryOverlapping(
-                reader.getFileHeader().getSequence(interval.referenceIndex).getSequenceName(),
-                interval.start,
-                interval.end
-            ),
-            cramFileName,
-            referenceFileName,
-            expectedNames
-        );
-    }
-
-    @Test(dataProvider="singleIntervalOverlapping")
-    public void testQuerySingleIntervalContainedFalse(
-        final File cramFileName,
-        final File referenceFileName,
-        final QueryInterval interval,
-        final String[] expectedNames) throws IOException
-    {
-        doQueryTest(
-            reader -> reader.query(new QueryInterval[]{interval}, false),
-            cramFileName,
-            referenceFileName,
-            expectedNames
-        );
-    }
-
-    @Test(dataProvider="singleIntervalOverlapping")
-    public void testQuerySequenceContainedFalse(
-        final File cramFileName,
-        final File referenceFileName,
-        final QueryInterval interval,
-        final String[] expectedNames) throws IOException
-    {
-        doQueryTest(
-            reader -> reader.query(
-                reader.getFileHeader().getSequence(interval.referenceIndex).getSequenceName(),
-                interval.start,
-                interval.end,
-                false
-            ),
-            cramFileName,
-            referenceFileName,
-            expectedNames
-        );
-    }
-
-    @DataProvider(name = "singleIntervalContained")
-    public Object[][] singleIntervalContained() {
-        return new Object[][] {
-            {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 100013, 100070), new String[]{"f", "f",}},
-            {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 100013, 100070), new String[]{"f", "f",}},
-            {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 100013, 100070), new String[]{"f", "f"}},
-
-            // interval with 1 start
-            {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 1, 100100), new String[]{"e", "f", "f"}},
-            {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 1, 100100), new String[]{"e", "f", "f"}},
-            {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 1, 100100), new String[]{"e", "f", "f"}},
-
-            // interval with 0 end
-            {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 100010, 0), new String[]{"d", "e", "f", "f",}},
-            {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 100010, 0), new String[]{"d", "e", "f", "f",}},
-            {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 100010, 0), new String[]{"d", "e", "f", "f",}},
-
-            // interval with 1 start and 0 end
-            {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f",  "f"}},
-            {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f",  "f"}},
-            {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f",  "f"}},
-
-            //totally empty cram file
-            {cramQueryTestEmptyWithBAI, cramQueryReadsReference, new QueryInterval(0, 1, 0), new String[]{}},
-            {cramQueryTestEmptyWithLocalCRAI, cramQueryReadsReference, new QueryInterval(0, 1, 0), new String[]{}},
-        };
-    }
-
-    @Test(dataProvider="singleIntervalContained")
-    public void testQueryContainedSingleInterval(
-        final File cramFileName,
-        final File referenceFileName,
-        final QueryInterval interval,
-        final String[] expectedNames) throws IOException
-    {
-        doQueryTest(
-            reader -> reader.queryContained(new QueryInterval[]{interval}),
-            cramFileName,
-            referenceFileName,
-            expectedNames
-        );
-    }
-
-    @Test(dataProvider="singleIntervalContained")
-    public void testQueryContainedSequence(
-        final File cramFileName,
-        final File referenceFileName,
-        final QueryInterval interval,
-        final String[] expectedNames) throws IOException
-    {
-        doQueryTest(
-            reader -> reader.queryContained(
-                reader.getFileHeader().getSequence(interval.referenceIndex).getSequenceName(),
-                interval.start,
-                interval.end
-            ),
-            cramFileName,
-            referenceFileName,
-            expectedNames
-        );
-    }
-
-    @Test(dataProvider="singleIntervalContained")
-    public void testQuerySingleIntervalContainedTrue(
-            final File cramFileName,
-            final File referenceFileName,
-            final QueryInterval interval,
-            final String[] expectedNames) throws IOException
-    {
-        doQueryTest(
-            reader -> reader.query(new QueryInterval[]{interval}, true),
-            cramFileName,
-            referenceFileName,
-            expectedNames
-        );
-    }
-
-    @Test(dataProvider="singleIntervalContained")
-    public void testQuerySequenceContainedTrue(
-            final File cramFileName,
-            final File referenceFileName,
-            final QueryInterval interval,
-            final String[] expectedNames) throws IOException
-    {
-        doQueryTest(
-            reader -> reader.query(
-                reader.getFileHeader().getSequence(interval.referenceIndex).getSequenceName(),
-                interval.start,
-                interval.end,
-                true
-            ),
-            cramFileName,
-            referenceFileName,
-            expectedNames
-        );
-    }
-
-    @DataProvider(name = "multipleIntervalOverlapping")
-    public Object[][] multipleIntervalOverlapping() {
-        return new Object[][]{
-            {cramQueryWithCRAI, cramQueryReference,
-                    new QueryInterval[]{new QueryInterval(0, 100010, 100010), new QueryInterval(0, 100011, 100011)},
-                    new String[]{"a", "b", "c", "d", "e"}},
-            {cramQueryWithLocalCRAI, cramQueryReference,
-                    new QueryInterval[]{new QueryInterval(0, 100010, 100010), new QueryInterval(0, 100011, 100011)},
-                    new String[]{"a", "b", "c", "d", "e"}},
-            {cramQueryWithBAI, cramQueryReference,
-                    new QueryInterval[]{new QueryInterval(0, 100010, 100010), new QueryInterval(0, 100011, 100011)},
-                    new String[]{"a", "b", "c", "d", "e"}},
-            // no matching reads
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 300, 310), new QueryInterval(1, 300, 310)},
-                    new String[]{}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 300, 310), new QueryInterval(1, 300, 310)},
-                    new String[]{}},
-            // matching reads from first interval only
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 205, 206), new QueryInterval(3, 300, 301)},
-                    new String[]{"a", "b"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 205, 206), new QueryInterval(3, 300, 301)},
-                    new String[]{"a", "b"}},
-            // matching reads from last interval only
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(3, 700, 701)},
-                    new String[]{"k"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(3, 700, 701)},
-                    new String[]{"k"}},
-            //matching reads from each interval
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 205, 206), new QueryInterval(3, 700, 701)},
-                    new String[]{"a", "b", "k"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 205, 206), new QueryInterval(3, 700, 701)},
-                    new String[]{"a", "b", "k"}},
-            //matching reads from each interval - 4 intervals
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{
-                            new QueryInterval(0, 200, 201), new QueryInterval(1, 500, 501),
-                            new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 701)},
-                    new String[]{"a", "f", "i", "k"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{
-                            new QueryInterval(0, 200, 201), new QueryInterval(1, 500, 501),
-                            new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 701)},
-                    new String[]{"a", "f", "i", "k"}},
-            // first read is before the first interval
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 701)},
-                    new String[]{"i", "k"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 701)},
-                    new String[]{"i", "k"}},
-            // first interval is before the first read
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 201)},
-                    new String[]{"a"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 201)},
-                    new String[]{"a"}},
-            // intervals in reverse order
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 201)},
-                    new String[]{"a"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 201)},
-                    new String[]{"a"}},
-        };
-    }
-
-    @Test(dataProvider="multipleIntervalOverlapping")
-    public void testQueryOverlappingMultipleIntervals(
-            final File cramFileName,
-            final File referenceFileName,
-            final QueryInterval[] intervals,
-            final String[] expectedNames) throws IOException
-    {
-        QueryInterval[] optimizedIntervals = QueryInterval.optimizeIntervals(intervals);
-        Assert.assertTrue(optimizedIntervals.length > 1);
-
-        doQueryTest(
-                reader -> reader.queryOverlapping(optimizedIntervals),
-                cramFileName,
-                referenceFileName,
-                expectedNames
-        );
-    }
-
-    @DataProvider(name = "otherMultipleIntervals")
-    public Object[][] otherMultipleIntervals() {
-        return new Object[][]{
-            // accept an empty QueryIntervalArray
-            {cramQueryWithBAI, cramQueryReference,
-                    new QueryInterval[]{},
-                    new String[]{}},
-            // intervals overlapping - optimized to a single interval
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 1000, 1030), new QueryInterval(0, 1020, 1076)},
-                    new String[]{"d"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 1000, 1030), new QueryInterval(0, 1020, 1076)},
-                    new String[]{"d"}}
-        };
-    }
-
-    // these are tested separately because we want the normal multi-interval test to
-    // assert that the interval list size is > 1 post-optimization to ensure we're
-    // using more than one interval; these tests optimize down to 0 or 1 interval
-    @Test(dataProvider="otherMultipleIntervals")
-    public void testOtherMultipleIntervals(
-            final File cramFileName,
-            final File referenceFileName,
-            final QueryInterval[] intervals,
-            final String[] expectedNames) throws IOException
-    {
-        QueryInterval[] optimizedIntervals = QueryInterval.optimizeIntervals(intervals);
-        doQueryTest(
-                reader -> reader.queryContained(optimizedIntervals),
-                cramFileName,
-                referenceFileName,
-                expectedNames
-        );
-        doQueryTest(
-                reader -> reader.queryOverlapping(optimizedIntervals),
-                cramFileName,
-                referenceFileName,
-                expectedNames
-        );
-    }
-
-    @DataProvider(name = "multipleIntervalContained")
-    public Object[][] multipleIntervalContained() {
-        return new Object[][]{
-            {cramQueryWithCRAI, cramQueryReference,
-                    new QueryInterval[]{new QueryInterval(0, 100008, 100008), new QueryInterval(0, 100013, 0)},
-                    new String[]{"f", "f"}},
-            {cramQueryWithLocalCRAI, cramQueryReference,
-                    new QueryInterval[]{new QueryInterval(0, 100008, 100008), new QueryInterval(0, 100013, 0)},
-                    new String[]{"f", "f"}},
-            {cramQueryWithBAI, cramQueryReference,
-                    new QueryInterval[]{new QueryInterval(0, 100008, 100008), new QueryInterval(0, 100013, 0)},
-                    new String[]{"f", "f"}},
-            // no matching reads
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 300, 310), new QueryInterval(1, 300, 310)},
-                    new String[]{}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 300, 310), new QueryInterval(1, 300, 310)},
-                    new String[]{}},
-            // matching reads from first interval only
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 205, 305), new QueryInterval(3, 300, 301)},
-                    new String[]{"b", "c"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 205, 305), new QueryInterval(3, 300, 301)},
-                    new String[]{"b", "c"}},
-            // matching reads from last interval only
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(3, 700, 776)},
-                    new String[]{"k"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(3, 700, 776)},
-                    new String[]{"k"}},
-            //matching reads from each interval
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 200, 281), new QueryInterval(3, 700, 776)},
-                    new String[]{"a", "b", "k"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 200, 281), new QueryInterval(3, 700, 776)},
-                    new String[]{"a", "b", "k"}},
-            //matching reads from each interval - 4 intervals
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{
-                            new QueryInterval(0, 200, 281), new QueryInterval(1, 500, 576),
-                            new QueryInterval(2, 300, 376), new QueryInterval(3, 700, 776)},
-                    new String[]{"a", "b", "f", "i", "k"}},
-                {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{
-                            new QueryInterval(0, 200, 281), new QueryInterval(1, 500, 576),
-                            new QueryInterval(2, 300, 376), new QueryInterval(3, 700, 776)},
-                    new String[]{"a", "b", "f", "i", "k"}},
-            // first read is before the first interval
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 776)},
-                    new String[]{"k"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 776)},
-                    new String[]{"k"}},
-            // first interval is before the first read
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 276)},
-                    new String[]{"a"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 276)},
-                    new String[]{"a"}},
-            // intervals in reverse order
-            {cramQueryReadsWithBAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 200, 276), new QueryInterval(0, 100, 101)},
-                    new String[]{"a"}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
-                    new QueryInterval[]{new QueryInterval(0, 200, 276), new QueryInterval(0, 100, 101)},
-                    new String[]{"a"}},
-        };
-    }
-
-    @Test(dataProvider="multipleIntervalContained")
-    public void testQueryContainedMultipleIntervals(
-            final File cramFileName,
-            final File referenceFileName,
-            final QueryInterval[] intervals,
-            final String[] expectedNames) throws IOException
-    {
-        QueryInterval[] optimizedIntervals = QueryInterval.optimizeIntervals(intervals);
-        Assert.assertTrue(optimizedIntervals.length > 1);
-        doQueryTest(
-                reader -> reader.queryContained(optimizedIntervals),
-                cramFileName,
-                referenceFileName,
-                expectedNames
-        );
-    }
-
-    @DataProvider(name = "unmappedQueries")
-    public Object[][] unmappedQueries() {
-        return new Object[][] {
-            {cramQueryWithCRAI, cramQueryReference, new String[]{"g", "h", "h", "i", "i"}},
-            {cramQueryWithLocalCRAI, cramQueryReference, new String[]{"g", "h", "h", "i", "i"}},
-            {cramQueryWithBAI, cramQueryReference, new String[]{"g", "h", "h", "i", "i"}},
-            //no unmapped reads
-            {cramQueryReadsWithBAI, cramQueryReadsReference, new String[]{}},
-            {cramQueryReadsWithLocalCRAI, cramQueryReadsReference, new String[]{}}
-        };
-    }
-
-    @Test(dataProvider="unmappedQueries")
-    public void testQueryUnmapped(
-            final File cramFileName,
-            final File referenceFileName,
-            final String[] expectedNames) throws IOException
-    {
-        doQueryTest(
-                reader -> reader.queryUnmapped(),
-                cramFileName,
-                referenceFileName,
-                expectedNames
-        );
-    }
-
-    @DataProvider(name = "mateQueries")
-    public Object[][] mateQueries() {
-        return new Object[][] {
-                {cramQueryWithCRAI, cramQueryReference, "f"},
-                {cramQueryWithLocalCRAI, cramQueryReference, "f"},
-                {cramQueryWithBAI, cramQueryReference, "f"}
-        };
-    }
-
-    @Test(dataProvider="mateQueries")
-    public void testQueryMate(
-        final File cramFileName,
-        final File referenceFileName,
-        final String expectedName) throws IOException
-    {
-        SamReaderFactory factory = SamReaderFactory.makeDefault();
-        if (referenceFileName != null) {
-            factory = factory.referenceSequence(referenceFileName);
-        }
-        SAMRecord firstRecord = null;
-        SAMRecord secondRecord = null;
-        try (final SamReader reader = factory.open(cramFileName)) {
-            final CloseableIterator<SAMRecord> it = reader.queryAlignmentStart("20", 100013);
-            Assert.assertTrue(it.hasNext());
-            firstRecord = it.next();
-            Assert.assertTrue(it.hasNext());
-            secondRecord = it.next();
-            Assert.assertFalse(it.hasNext());
-        }
-
-        // get the mate for the first record
-        try (final SamReader reader = factory.open(cramFileName)) {
-            final SAMRecord samRecord = reader.queryMate(firstRecord);
-            Assert.assertEquals(samRecord, secondRecord);
-        }
-
-        // now query the mate's mate to ensure we get symmetric results
-        try (final SamReader reader = factory.open(cramFileName)) {
-            final SAMRecord samRecord = reader.queryMate(secondRecord);
-            Assert.assertEquals(samRecord, firstRecord);
-        }
-    }
-
-    private void doQueryTest(
-        final Function<SamReader, CloseableIterator <SAMRecord>> getIterator,
-        final File cramFileName,
-        final File referenceFileName,
-        final String[] expectedNames) throws IOException
-    {
-        SamReaderFactory factory = SamReaderFactory.makeDefault();
-        if (referenceFileName != null) {
-            factory = factory.referenceSequence(referenceFileName);
-        }
-        try (final SamReader reader = factory.open(cramFileName);
-             final CloseableIterator<SAMRecord> it = getIterator.apply(reader)) {
-            int count = 0;
-            while (it.hasNext()) {
-                SAMRecord samRec = it.next();
-                Assert.assertTrue(count < expectedNames.length);
-                Assert.assertEquals(samRec.getReadName(), expectedNames[count]);
-                count++;
-            }
-            Assert.assertEquals(count, expectedNames.length);
-        }
-    }
-
-
-    @DataProvider(name = "iteratorStateTests")
-    public Object[][] iteratorStateQueries() {
-        return new Object[][] {
-                {cramQueryWithCRAI, cramQueryReference},
-                {cramQueryWithLocalCRAI, cramQueryReference},
-                {cramQueryWithBAI, cramQueryReference}
-        };
-    }
-
-    // The current CRAMFileReader implementation allows multiple iterators to exist on a
-    // CRAM reader at the same time, but they're not properly isolated from each other. When
-    // CRAMFileReader is changed to support the SamReader contract of one-iterator-at-a-time
-    // (https://github.com/samtools/htsjdk/issues/563), these can be re-enabled.
-    //
-    @Test(dataProvider="iteratorStateTests", expectedExceptions=SAMException.class, enabled=false)
-    public void testIteratorState(
-            final File cramFileName,
-            final File referenceFileName,
-            final int expectedCount) throws IOException
-    {
-        SamReaderFactory factory = SamReaderFactory.makeDefault();
-        if (referenceFileName != null) {
-            factory = factory.referenceSequence(referenceFileName);
-        }
-
-        try (final SamReader reader = factory.open(cramFileName)) {
-            final CloseableIterator<SAMRecord> origIt = reader.iterator();
-
-            // opening the second iterator should throw
-            final CloseableIterator<SAMRecord> overlapIt = reader.queryOverlapping("20", 100013, 100070);
-        }
-    }
-
-    @DataProvider(name = "unmappedSliceTest")
-    public Object[][] unmappedMultiSliceTest() {
-        return new Object[][] {
-            // the main test feature of these files is that they have several mapped reads followed by
-            // some number of unmapped reads, each created with seqs_per_slice = 100 to force the unmapped
-            // reads to be distributed over multiple slices (at least for large numbers of unmapped reads)
-            // tests the fix to https://github.com/samtools/htsjdk/issues/562
-            {new File(TEST_DATA_DIR, "NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram"),
-                    new File(TEST_DATA_DIR, "human_g1k_v37.20.21.1-100.fasta"), 0},
-            {new File(TEST_DATA_DIR, "NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram"),
-                    new File(TEST_DATA_DIR, "human_g1k_v37.20.21.1-100.fasta"), 1},
-            {new File(TEST_DATA_DIR, "NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram"),
-                    new File(TEST_DATA_DIR, "human_g1k_v37.20.21.1-100.fasta"), 500},
-        };
-    }
-
-    @Test(dataProvider = "unmappedSliceTest")
-    private void testUnmappedMultiSlice(
-            final File cramFileName,
-            final File referenceFileName,
-            final int expectedCount) throws IOException
-    {
-        SamReaderFactory factory = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
-        factory = factory.referenceSequence(referenceFileName);
-
-        int count = 0;
-        try (final SamReader reader = factory.open(cramFileName);
-             final CloseableIterator<SAMRecord> it = reader.queryUnmapped())
-        {
-            while (it.hasNext()) {
-                it.next();
-                count++;
-            }
-        }
-        Assert.assertEquals(count, expectedCount);
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/ChunkTest.java b/src/test/java/htsjdk/samtools/ChunkTest.java
deleted file mode 100644
index d2bc157..0000000
--- a/src/test/java/htsjdk/samtools/ChunkTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class ChunkTest {
-    @Test
-    public void testOverlaps() {
-        // Test completely disjoint offsets.
-        Assert.assertFalse(new Chunk(1,5).overlaps(new Chunk(11,15)),"Test found overlap in non-overlapping offsets");
-        Assert.assertFalse(new Chunk(11,15).overlaps(new Chunk(1,5)),"Test found overlap in non-overlapping offsets");
-
-        // Test adjacent offsets
-        Assert.assertFalse(new Chunk(1,5).overlaps(new Chunk(6,10)),"Test found overlap in adjacent offsets");
-        Assert.assertFalse(new Chunk(6,10).overlaps(new Chunk(1,5)),"Test found overlap in adjacent offsets");
-
-        // Test overlapping offsets
-        Assert.assertTrue(new Chunk(1,5).overlaps(new Chunk(2,6)),"Test returned incorrect value for overlapping offsets");
-        Assert.assertTrue(new Chunk(2,6).overlaps(new Chunk(1,5)),"Test returned incorrect value for overlapping offsets");
-        Assert.assertTrue(new Chunk(1,5).overlaps(new Chunk(2,6)),"Test returned incorrect value for overlapping offsets");
-
-        // Completely disjoint and adjacent blocks
-        Assert.assertFalse(new Chunk(1<<16,2<<16).overlaps(new Chunk(3<<16,4<<16)),"Test found overlap in non-overlapping blocks");
-        Assert.assertFalse(new Chunk(1<<16,2<<16).overlaps(new Chunk(2<<16,3<<16)),"test found overlap in adjacent blocks");
-
-        // True overlaps in the same block
-        Assert.assertTrue(new Chunk(1<<16,2<<16).overlaps(new Chunk(1<<16,2<<16)),"Test failed to find overlap in completely overlapping chunks");
-        Assert.assertTrue(new Chunk(1<<16,2<<16).overlaps(new Chunk(1<<16,1<<16|0xFF00)),"Test failed to find overlap in chunks with head overlapping");
-        Assert.assertTrue(new Chunk(1<<16,2<<16).overlaps(new Chunk(1<<16|0xFF00,2<<16)),"Test failed to find overlap in overlapping chunks");
-        Assert.assertTrue(new Chunk(1<<16,2<<16).overlaps(new Chunk(1<<16|0xFEFF,1<<16|0xFF00)),"Test failed to find overlap in contained chunk");
-        Assert.assertTrue(new Chunk(1<<16|0xFEFF,1<<16|0xFF00).overlaps(new Chunk(1<<16,2<<16)),"Test failed to find overlap in enclosing chunk");
-        Assert.assertTrue(new Chunk(1<<16,1<<16|0xFF00).overlaps(new Chunk(1<<16|0xFEFF,2<<16)),"Test failed to find tail->head overlap");
-        Assert.assertTrue(new Chunk(1<<16|0xFEFF,2<<16).overlaps(new Chunk(1<<16,1<<16|0xFF00)),"Test failed to find head->tail overlap");
-
-        // Test overlaps spanning blocks
-        Assert.assertTrue(new Chunk(1<<16,2<<16).overlaps(new Chunk(1<<16|0xFF00,2<<16|0xFF00)),"Test failed to find overlap spanning blocks");
-    }
-
-    @Test
-    public void testAdjacency() {
-        // Test offset adjacency
-        Assert.assertTrue(new Chunk(1,5).isAdjacentTo(new Chunk(5,9)),"Offsets which should be adjacent are not");
-        Assert.assertTrue(new Chunk(5,9).isAdjacentTo(new Chunk(1,5)),"Offsets which should be adjacent are not");
-
-        // Test block adjacency
-        Assert.assertTrue(new Chunk(1<<16,2<<16).isAdjacentTo(new Chunk(2<<16,3<<16)),"Blocks which should be adjacent are not");
-
-        // Test offset-block adjacency
-        Assert.assertTrue(new Chunk(1<<16,2<<16|0xFF00).isAdjacentTo(new Chunk(2<<16|0xFF00,3<<16)),"Block-offsets which should be adjacent are not");
-
-        // Discontiguous and overlapping blocks
-        Assert.assertFalse(new Chunk(1,5).isAdjacentTo(new Chunk(11,15)),"Disjoint block should not be adjacent");
-        Assert.assertFalse(new Chunk(1,5).isAdjacentTo(new Chunk(2,3)),"Contained offset should not be adjacent");
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/CigarCodecTest.java b/src/test/java/htsjdk/samtools/CigarCodecTest.java
deleted file mode 100644
index 8275a94..0000000
--- a/src/test/java/htsjdk/samtools/CigarCodecTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-
-public class CigarCodecTest {
-
-
-    @Test
-    public void testDefault() {
-        final Cigar emptyCigar = new Cigar();
-        Assert.assertEquals(emptyCigar, BinaryCigarCodec.decode(new int[0]));
-        final int[] binaryCigar = BinaryCigarCodec.encode(emptyCigar);
-        Assert.assertEquals(0, binaryCigar.length);
-        Assert.assertEquals(emptyCigar, TextCigarCodec.decode(SAMRecord.NO_ALIGNMENT_CIGAR));
-        Assert.assertEquals(TextCigarCodec.encode(emptyCigar), SAMRecord.NO_ALIGNMENT_CIGAR);
-    }
-
-    private static class Cigarette {
-        final int length;
-        final char op;
-
-        private Cigarette(final int length, final char op) {
-            this.length = length;
-            this.op = op;
-        }
-
-        int getBinaryOp() {
-            switch (op) {
-                case 'M': return 0;
-                case 'I': return 1;
-                case 'D': return 2;
-                case 'N': return 3;
-                case 'S': return 4;
-                case 'H': return 5;
-                case 'P': return 6;
-                case '=': return 7;
-                case 'X' : return 8;
-                default: Assert.assertTrue(false);
-            }
-            return -1;
-        }
-    }
-
-    private String makeTextCigar(final Cigarette[] cigarettes) {
-        final StringBuilder sb = new StringBuilder();
-        for (final Cigarette c : cigarettes) {
-            sb.append(Integer.toString(c.length));
-            sb.append(c.op);
-        }
-        return sb.toString();
-    }
-
-    private int[] makeBinaryCigar(final Cigarette[] cigarettes) {
-        final int[] ret = new int[cigarettes.length];
-        for (int i = 0; i < cigarettes.length; ++i) {
-            ret[i] = cigarettes[i].length << 4 | cigarettes[i].getBinaryOp();
-        }
-        return ret;
-    }
-
-    @Test
-    public void testSimple() {
-        final Cigarette[] cigarettes = {
-                new Cigarette(100, 'M'),
-                new Cigarette(200, 'I'),
-                new Cigarette(50, 'D'),
-                new Cigarette(21, 'N'),
-                new Cigarette(12, 'S'),
-                new Cigarette(99, 'H'),
-                new Cigarette(20, 'P'),
-                new Cigarette(2, '='),
-                new Cigarette(2, 'X')
-        };
-        final String textCigar = makeTextCigar(cigarettes);
-        final int[] binaryCigar = makeBinaryCigar(cigarettes);
-        final Cigar fromText = TextCigarCodec.decode(textCigar);
-        final Cigar fromBinary = BinaryCigarCodec.decode(binaryCigar);
-        Assert.assertEquals(fromText, fromBinary);
-        final String anotherTextCigar = TextCigarCodec.encode(fromBinary);
-        final int[] anotherBinaryCigar = BinaryCigarCodec.encode(fromText);
-        Assert.assertEquals(anotherTextCigar, textCigar);
-        Assert.assertTrue(Arrays.equals(anotherBinaryCigar, binaryCigar));
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/CigarTest.java b/src/test/java/htsjdk/samtools/CigarTest.java
deleted file mode 100644
index acdc224..0000000
--- a/src/test/java/htsjdk/samtools/CigarTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class CigarTest {
-
-    @DataProvider(name = "positiveTestsData")
-    public Object[][] testPositive() {
-        return new Object[][]{
-                {""},
-                {"2M1P4M1P2D1P6D"},
-                {"10M5N1I12M"},
-                {"10M1I5N1I12M"},
-                {"9M1D5N1I12M"},
-
-                // I followed by D and vice versa is now allowed.
-                {"1M1I1D1M"},
-                {"1M1D1I1M"},
-
-                // Soft-clip inside of hard-clip now allowed.
-                {"29M1S15H"},
-        };
-    }
-
-    @Test(dataProvider = "positiveTestsData")
-    public void testPositive(final String cigar) {
-        Assert.assertNull(TextCigarCodec.decode(cigar).isValid(null, -1));
-    }
-
-    @DataProvider(name = "negativeTestsData")
-    public Object[][] negativeTestsData() {
-
-        return new Object[][]{
-                // Cannot have two consecutive insertions (of the same type)
-                {"1M1D1D1M", SAMValidationError.Type.ADJACENT_INDEL_IN_CIGAR},
-                {"1M1I1I1M", SAMValidationError.Type.ADJACENT_INDEL_IN_CIGAR},
-
-                // Soft clip must be at end of read or inside of hard clip
-                {"1M1D1S1M",   SAMValidationError.Type.INVALID_CIGAR},
-                {"1M1D1S1M1H", SAMValidationError.Type.INVALID_CIGAR},
-                {"1M1D1S1S",   SAMValidationError.Type.INVALID_CIGAR},
-                {"1M1D1S1S1H", SAMValidationError.Type.INVALID_CIGAR},
-                {"1H1S1S1M1D", SAMValidationError.Type.INVALID_CIGAR},
-                {"1S1S1M1D",   SAMValidationError.Type.INVALID_CIGAR},
-
-                // Soft clip must be at end of read or inside of hard clip, but there must be something left
-                {"1S1S", SAMValidationError.Type.INVALID_CIGAR},
-                {"1H1S", SAMValidationError.Type.INVALID_CIGAR},
-                {"1S1H", SAMValidationError.Type.INVALID_CIGAR},
-                {"1H1H", SAMValidationError.Type.INVALID_CIGAR},
-        };
-/*
-        // Zero length for an element not allowed. TODO: not sure why this is commented out
-       {"100M0D10M1D10M", SAMValidationError.Type.INVALID_CIGAR}
-*/
-    }
-
-    @Test(dataProvider = "negativeTestsData")
-    public void testNegative(final String cigar, final SAMValidationError.Type type) {
-        final List<SAMValidationError> errors = TextCigarCodec.decode(cigar).isValid(null, -1);
-        Assert.assertEquals(errors.size(), 1, String.format("Got %d error, expected exactly one error.", errors.size()));
-        Assert.assertEquals(errors.get(0).getType(), type);
-    }
-    
-    @Test
-    public void testMakeCigarFromOperators() {
-        final List<CigarOperator> cigarOperators = Arrays.asList(
-                CigarOperator.S,
-                CigarOperator.M,
-                CigarOperator.M,
-                CigarOperator.M,
-                CigarOperator.I,
-                CigarOperator.M,
-                CigarOperator.D,
-                CigarOperator.M
-                );
-        final Cigar cigar = Cigar.fromCigarOperators(cigarOperators);
-        Assert.assertFalse(cigar.isEmpty());
-        Assert.assertEquals(cigar.numCigarElements(), 6);
-        Assert.assertEquals(cigar.toString(),"1S3M1I1M1D1M");
-        Assert.assertFalse(cigar.containsOperator(CigarOperator.N));
-        Assert.assertTrue(cigar.containsOperator(CigarOperator.D));
-        Assert.assertTrue(cigar.isLeftClipped());
-        Assert.assertFalse(cigar.isRightClipped());
-        Assert.assertTrue(cigar.isClipped());
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/DownsamplingIteratorTests.java b/src/test/java/htsjdk/samtools/DownsamplingIteratorTests.java
deleted file mode 100644
index e84ee2e..0000000
--- a/src/test/java/htsjdk/samtools/DownsamplingIteratorTests.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.DownsamplingIteratorFactory.Strategy;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Random;
-
-/**
- * Tests for the downsampling iterator class.
- * @author Tim Fennell
- */
-public class DownsamplingIteratorTests {
-    final int NUM_TEMPLATES = 50000;
-    final EnumMap<Strategy, Double> ACCURACY = new EnumMap<Strategy,Double>(Strategy.class){{
-        put(Strategy.HighAccuracy, 0.001);
-        put(Strategy.Chained, 0.005);
-        put(Strategy.ConstantMemory, 0.01);
-    }};
-
-    private static Random getRandom(){
-        //this test is probably too strict in it's tolerances
-        //not every random seed works, 10000 for example is rejected
-        return new Random(10001);
-    }
-
-    @Test
-    public void testBasicFunction() {
-        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-        final Random r = getRandom();
-        for (int i=0; i<NUM_TEMPLATES; ++i) {
-            builder.addPair("pair" + r.nextInt(), r.nextInt(24), r.nextInt(1000000), r.nextInt(1000000));
-        }
-        final Collection<SAMRecord> recs = builder.getRecords();
-
-        runTests("testBasicFunction", recs);
-    }
-
-    private void runTests(final String name, final Collection<SAMRecord> recs) {
-        for (final DownsamplingIteratorFactory.Strategy strategy : DownsamplingIteratorFactory.Strategy.values()) {
-            final double accuracy = ACCURACY.get(strategy);
-
-            for (final double p : new double[]{0, 0.01, 0.1, 0.5, 0.9, 1}) {
-                final DownsamplingIterator iterator = DownsamplingIteratorFactory.make(recs.iterator(), strategy, p, accuracy, 42);
-                final List<SAMRecord> out = new ArrayList<SAMRecord>();
-                while (iterator.hasNext()) out.add(iterator.next());
-
-                final String testcase = name + ": strategy=" + strategy.name() + ", p=" + p + ", accuracy=" + accuracy;
-
-                final double readFraction = iterator.getAcceptedFraction();
-                Assert.assertEquals(out.size(), iterator.getAcceptedCount(), "Mismatched sizes with " + testcase);
-                Assert.assertTrue(readFraction > p - accuracy && readFraction < p + accuracy, "Read fraction " + readFraction + " out of bounds in " + testcase);
-            }
-        }
-    }
-
-    @Test
-    public void testMixOfPairsAndFrags() {
-        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-        final Random r = getRandom();
-        for (int i=0; i<NUM_TEMPLATES; ++i) {
-            builder.addFrag("frag" + r.nextInt(), r.nextInt(24), r.nextInt(1000000), false);
-            builder.addPair("pair" + r.nextInt(), r.nextInt(24), r.nextInt(1000000), r.nextInt(1000000));
-        }
-
-        final Collection<SAMRecord> recs = builder.getRecords();
-        runTests("testMixOfPairsAndFrags", recs);
-    }
-
-    @Test
-    public void testSecondaryAlignments() {
-        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-        final Random r = getRandom();
-        for (int i=0; i<NUM_TEMPLATES; ++i) {
-            final int x = r.nextInt();
-            builder.addPair("pair" + x, r.nextInt(24), r.nextInt(1000000), r.nextInt(1000000));
-            builder.addPair("pair" + x, r.nextInt(24), r.nextInt(24), r.nextInt(1000000), r.nextInt(1000000), false, false, "50M", "50M", false, true, true, true, 20);
-        }
-
-        final Collection<SAMRecord> recs = builder.getRecords();
-        runTests("testSecondaryAlignments", recs);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/DuplicateSetIteratorTest.java b/src/test/java/htsjdk/samtools/DuplicateSetIteratorTest.java
deleted file mode 100644
index 5952953..0000000
--- a/src/test/java/htsjdk/samtools/DuplicateSetIteratorTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class DuplicateSetIteratorTest {
-    protected final static int DEFAULT_BASE_QUALITY = 10;
-
-    private SAMRecordSetBuilder getSAMRecordSetBuilder() {
-        return new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
-    }
-
-    @Test
-    public void testSupplementalReads() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addFrag("READ0", 1, 1, false);
-        records.addFrag("READ1", 1, 1, false);
-
-        //secondary alignment
-        records.addFrag("SECN0", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, true);
-        records.addFrag("SECN1", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, true);
-
-        //unmapped
-        records.addFrag("UNMP0", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY);
-        records.addFrag("UNMP1", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY);
-
-        //supplemental
-        records.addFrag("SUPP0", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, false, true);
-        records.addFrag("SUPP1", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, false, true);
-
-        //supplemental secondary
-        records.addFrag("SUSE0", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, true, true);
-        records.addFrag("SUSE1", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, true, true);
-
-        //unmapped secondary
-        records.addFrag("UNSE0", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, true);
-        records.addFrag("UNSE1", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, true);
-
-        //unmapped supplemental
-        records.addFrag("UNSU0", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, false, true);
-        records.addFrag("UNSU1", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, false, true);
-
-        //unmapped supplemental secondary
-        records.addFrag("UNSS0", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, true, true);
-        records.addFrag("UNSS1", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, true, true);
-
-        Map<String, DuplicateSet> allSets = new HashMap<String, DuplicateSet>();
-
-        DuplicateSetIterator duplicateSetIterator = new DuplicateSetIterator(records.iterator(), getSAMRecordSetBuilder().getHeader(), false);
-        while (duplicateSetIterator.hasNext()) {
-            DuplicateSet set = duplicateSetIterator.next();
-            allSets.put(set.getRepresentative().getReadName(), set);
-        }
-
-        //we expect 15 duplicate sets one for the initial two reads and one for each of the additional 14 reads.
-        Assert.assertEquals(allSets.size(), 15, "Wrong number of duplicate sets.");
-        Assert.assertEquals(allSets.get("READ0").size(), 2, "Should be two reads in the READ0 duplicate set, but there are not.");
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/GenomicIndexUtilTest.java b/src/test/java/htsjdk/samtools/GenomicIndexUtilTest.java
deleted file mode 100644
index 8f5569c..0000000
--- a/src/test/java/htsjdk/samtools/GenomicIndexUtilTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Tests for GenomicIndexUtil.
- */
-public class GenomicIndexUtilTest {
-
-    @Test(dataProvider = "testRegionToBinDataProvider")
-    public void testRegionToBin(final int beg, final int end, final int bin) {
-        Assert.assertEquals(GenomicIndexUtil.regionToBin(beg, end), bin);
-    }
-
-    @DataProvider(name = "testRegionToBinDataProvider")
-    public Object[][] testRegionToBinDataProvider() {
-        return new Object[][] {
-                {0, 0, 0},
-                {1, 1, 4681},
-                {0, 1<<14, 4681},
-                {0, (1<<14)+1, 585},
-                
-                {1<<14, 1<<14, 585},
-                {(1<<14)+1, (1<<14)+1, 4682},
-                {1<<14, 1<<17, 585},
-                {1<<14, (1<<17)+1, 73},
-
-                {1<<17, 1<<17, 73},
-                {(1<<17)+1, (1<<17)+1, 4689},
-                {1<<17, 1<<20, 73},
-                {1<<17, (1<<20)+1, 9},
-
-                {1<<20, 1<<20, 9},
-                {(1<<20)+1, (1<<20)+1, 4745},
-                {1<<20, 1<<23, 9},
-                {1<<20, (1<<23)+1, 1},
-
-                {1<<23, 1<<23, 1},
-                {(1<<23)+1, (1<<23)+1, 5193},
-                {1<<23, 1<<26, 1},
-                {1<<23, (1<<26)+1, 0},
-
-                {1<<26, 1<<26, 0},
-                {(1<<26)+1, (1<<26)+1, 8777},
-                {1<<26, 1<<26+1, 2}
-        };
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/MergingSamRecordIteratorGroupCollisionTest.java b/src/test/java/htsjdk/samtools/MergingSamRecordIteratorGroupCollisionTest.java
deleted file mode 100644
index 18c10c7..0000000
--- a/src/test/java/htsjdk/samtools/MergingSamRecordIteratorGroupCollisionTest.java
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Tests for MultiIterator relating to group collision.
- *
- * @author Dave Tefft, Andre Mesarovic
- */
-public class MergingSamRecordIteratorGroupCollisionTest {
-
-    private GroupAdapter padapter = new ProgramGroupAdapter();
-    private GroupAdapter radapter = new ReadGroupAdapter();
-
-    @DataProvider(name = "adapters")
-    public Object[][] adapters() {
-        return new Object[][]{
-                {new ProgramGroupAdapter()},
-                {new ReadGroupAdapter()}
-        };
-    }
-
-
-    /** Test for groups with same ID and same attributes */
-    @Test(dataProvider = "adapters")
-    public void testSameIdsSameAttrs(GroupAdapter adapter) {
-        boolean addReadGroup = addReadGroup(adapter);
-
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
-        final AbstractSAMHeaderRecord group0 = adapter.newGroup("0");
-        adapter.setAttribute(group0, "Hi Mom!");
-        adapter.setBuilderGroup(builder1, group0);
-        builder1.addFrag("read1", 20, 28833, addReadGroup);
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
-        final AbstractSAMHeaderRecord group1 = adapter.newGroup("0");
-        adapter.setAttribute(group1, "Hi Mom!");
-        adapter.setBuilderGroup(builder2, group1);
-        builder2.addFrag("read2", 19, 28833, addReadGroup);
-
-        final List<SamReader> readers = new ArrayList<SamReader>();
-        readers.add(builder1.getSamReader());
-        readers.add(builder2.getSamReader());
-
-        final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-        headers.add(readers.get(0).getFileHeader());
-        headers.add(readers.get(1).getFileHeader());
-
-        final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
-        final List<? extends AbstractSAMHeaderRecord> outputGroups = adapter.getGroups(headerMerger.getMergedHeader());
-        Assert.assertEquals(outputGroups.size(), 1);
-
-        Assert.assertTrue(adapter.equivalent(outputGroups.get(0), group0));
-
-        assertRecords(headerMerger, readers, adapter, addReadGroup, "0", "0");
-        CloserUtil.close(readers);
-    }
-
-    /** Test for groups with same ID but different attributes */
-    // @Test(dataProvider = "adapters")
-    public void testSameIdsDifferentAttrs(GroupAdapter adapter) {
-        boolean addReadGroup = addReadGroup(adapter);
-
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
-        final AbstractSAMHeaderRecord group0 = adapter.newGroup("0");
-        adapter.setAttribute(group0, "Hi Mom!");
-        adapter.setBuilderGroup(builder1, group0);
-        builder1.addFrag("read1", 20, 28833, addReadGroup);
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
-        final AbstractSAMHeaderRecord group1 = adapter.newGroup("0");
-        adapter.setAttribute(group1, "Hi Dad!");
-        adapter.setBuilderGroup(builder2, group1);
-        builder2.addFrag("read2", 19, 28833, addReadGroup);
-
-        final List<SamReader> readers = new ArrayList<SamReader>();
-        readers.add(builder1.getSamReader());
-        readers.add(builder2.getSamReader());
-
-        final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-        headers.add(readers.get(0).getFileHeader());
-        headers.add(readers.get(1).getFileHeader());
-
-        final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
-        final List<? extends AbstractSAMHeaderRecord> outputGroups = adapter.getGroups(headerMerger.getMergedHeader());
-        Assert.assertEquals(outputGroups.size(), 2);
-        Assert.assertTrue(adapter.equivalent(outputGroups.get(0), group0));
-        Assert.assertTrue(adapter.equivalent(outputGroups.get(1), group1));
-
-        assertRecords(headerMerger, readers, adapter, addReadGroup, "0", "0.1");
-        CloserUtil.close(readers);
-    }
-
-
-    /** Test for groups with different ID and same attributes */
-    // @Test(dataProvider = "adapters")
-    public void testDifferentIdsSameAttrs(GroupAdapter adapter) {
-        boolean addReadGroup = addReadGroup(adapter);
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
-        final AbstractSAMHeaderRecord group0 = adapter.newGroup("0");
-        adapter.setAttribute(group0, "Hi Mom!");
-        adapter.setBuilderGroup(builder1, group0);
-        builder1.addFrag("read1", 20, 28833, addReadGroup);
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
-        final AbstractSAMHeaderRecord group1 = adapter.newGroup("55");
-        adapter.setAttribute(group1, "Hi Mom!");
-        adapter.setBuilderGroup(builder2, group1);
-        builder2.addFrag("read2", 19, 28833, addReadGroup);
-
-        final List<SamReader> readers = new ArrayList<SamReader>();
-        readers.add(builder1.getSamReader());
-        readers.add(builder2.getSamReader());
-
-        final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-        headers.add(readers.get(0).getFileHeader());
-        headers.add(readers.get(1).getFileHeader());
-
-        final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
-        final List<? extends AbstractSAMHeaderRecord> outputGroups = adapter.getGroups(headerMerger.getMergedHeader());
-        Assert.assertEquals(outputGroups.size(), 2);
-        Assert.assertTrue(adapter.equivalent(outputGroups.get(0), group0));
-        Assert.assertTrue(adapter.equivalent(outputGroups.get(1), group1));
-
-        assertRecords(headerMerger, readers, adapter, addReadGroup, "0", "55");
-        CloserUtil.close(readers);
-    }
-
-
-    /** Test for groups with different ID and different attributes */
-    @Test(dataProvider = "adapters")
-    public void testDifferentIdsDifferentAttrs(GroupAdapter adapter) {
-        boolean addReadGroup = addReadGroup(adapter);
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
-        final AbstractSAMHeaderRecord group0 = adapter.newGroup("0");
-        adapter.setAttribute(group0, "Hi Mom!");
-        adapter.setBuilderGroup(builder1, group0);
-        builder1.addFrag("read1", 20, 28833, addReadGroup);
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
-        final AbstractSAMHeaderRecord group1 = adapter.newGroup("55");
-        adapter.setAttribute(group1, "Hi Dad!");
-        adapter.setBuilderGroup(builder2, group1);
-        builder2.addFrag("read2", 19, 28833, addReadGroup);
-
-        final List<SamReader> readers = new ArrayList<SamReader>();
-        readers.add(builder1.getSamReader());
-        readers.add(builder2.getSamReader());
-
-        final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-        headers.add(readers.get(0).getFileHeader());
-        headers.add(readers.get(1).getFileHeader());
-
-        final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
-        final List<? extends AbstractSAMHeaderRecord> outputGroups = adapter.getGroups(headerMerger.getMergedHeader());
-        Assert.assertEquals(outputGroups.size(), 2);
-        Assert.assertTrue(adapter.equivalent(outputGroups.get(0), group0));
-        Assert.assertTrue(adapter.equivalent(outputGroups.get(1), group1));
-
-        assertRecords(headerMerger, readers, adapter, addReadGroup, "0", "55");
-        CloserUtil.close(readers);
-    }
-
-    @Test(dataProvider = "adapters")
-    public void differentIds(GroupAdapter adapter) throws Exception {
-        final String[] groupIds = {"group1", "group2"};
-        final List<? extends AbstractSAMHeaderRecord> groups = adapter.createGroups(groupIds);
-        Assert.assertEquals(groups.size(), 2);
-        int i = 0;
-        for (final AbstractSAMHeaderRecord g : groups) {
-            Assert.assertEquals(groupIds[i], adapter.getGroupId(g));
-            i++;
-        }
-    }
-
-    @Test(dataProvider = "adapters")
-    public void sameIds(GroupAdapter adapter) throws Exception {
-        final String[] groupIds = {"group1", "group1"};
-
-        final List<? extends AbstractSAMHeaderRecord> groups = adapter.createGroups(groupIds);
-        Assert.assertEquals(groups.size(), 1);
-        AbstractSAMHeaderRecord group = groups.get(0);
-        Assert.assertEquals(adapter.getGroupId(group), "group1");
-    }
-
-    /**
-     * List of program groups from the input files are merged, and renumbered, and SAMRecords
-     * with PG tags get assigned the updated PG ID.
-     * Original ProgramRecord-specific test.
-     */
-    @Test
-    public void testMergingProgramGroups() {
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
-        final SAMProgramRecord program1 = new SAMProgramRecord("0");
-        program1.setCommandLine("Hi, Mom!");
-        builder1.setProgramRecord(program1);
-        builder1.addFrag("read1", 20, 28833, false);
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
-        final SAMProgramRecord program2 = new SAMProgramRecord("0");
-        program2.setCommandLine("Hi, Dad!");
-        program2.setProgramVersion("123");
-        builder2.setProgramRecord(program2);
-        builder2.addFrag("read2", 19, 28833, false);
-        // No PG tag on this record
-        builder2.setProgramRecord(null);
-        builder2.addFrag("read3", 19, 28833, false);
-
-        final List<SamReader> readers = new ArrayList<SamReader>();
-        readers.add(builder1.getSamReader());
-        readers.add(builder2.getSamReader());
-
-        final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-        headers.add(readers.get(0).getFileHeader());
-        headers.add(readers.get(1).getFileHeader());
-
-        final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
-
-        final List<SAMProgramRecord> outputProgramGroups = headerMerger.getMergedHeader().getProgramRecords();
-        Assert.assertEquals(outputProgramGroups.size(), 2);
-        Assert.assertTrue(outputProgramGroups.get(0).equivalent(program1));
-        Assert.assertTrue(outputProgramGroups.get(1).equivalent(program2));
-
-        final MergingSamRecordIterator iterator = new MergingSamRecordIterator(headerMerger, readers, false);
-        SAMRecord samRecord = iterator.next();
-        Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), "0");
-        samRecord = iterator.next();
-        Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), "0.1");
-        samRecord = iterator.next();
-        Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), null);
-        Assert.assertFalse(iterator.hasNext());
-        CloserUtil.close(readers);
-    }
-
-    private void assertRecords(SamFileHeaderMerger headerMerger, Collection<SamReader> readers,
-                               GroupAdapter adapter, boolean addReadGroup, String... attrs) {
-        final MergingSamRecordIterator iterator = new MergingSamRecordIterator(headerMerger, readers, addReadGroup);
-        for (int j = 0; j < attrs.length; j++) {
-            SAMRecord samRecord = iterator.next();
-            Assert.assertEquals(samRecord.getAttribute(adapter.getTagName()), attrs[j]);
-        }
-        Assert.assertFalse(iterator.hasNext());
-    }
-
-    private boolean addReadGroup(GroupAdapter adapter) {
-        return adapter instanceof ProgramGroupAdapter;
-    }
-
-    /**
-     * List of program groups from the input files are merged, and renumbered, and SAMRecords
-     * with PG tags get assigned the updated PG ID.
-     * Original ProgramRecord-specific test.
-     */
-    @Test
-    public void testMergingProgramGroupsWithThreeReaders() {
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
-        final SAMProgramRecord program1 = new SAMProgramRecord("0");
-        program1.setCommandLine("Hi, Mom!");
-        program1.setProgramVersion("123");
-        builder1.setProgramRecord(program1);
-        builder1.addFrag("read1", 20, 28833, false);
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
-        final SAMProgramRecord program2 = new SAMProgramRecord("0");
-        program2.setCommandLine("Hi, Mom!");
-        program2.setProgramVersion("123");
-        builder2.setProgramRecord(program2);
-        builder2.addFrag("read2", 19, 28833, false);
-
-
-        final SAMRecordSetBuilder builder3 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
-        final SAMProgramRecord program3 = new SAMProgramRecord("0");
-        program3.setCommandLine("Hi, Dad!");
-        builder3.setProgramRecord(program3);
-        builder3.addFrag("read3", 19, 28833, false);
-
-
-        final List<SamReader> readers = new ArrayList<SamReader>();
-        readers.add(builder1.getSamReader());
-        readers.add(builder2.getSamReader());
-        readers.add(builder3.getSamReader());
-
-        final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-        headers.add(readers.get(0).getFileHeader());
-        headers.add(readers.get(1).getFileHeader());
-        headers.add(readers.get(2).getFileHeader());
-
-        final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
-        final List<SAMProgramRecord> outputProgramGroups = headerMerger.getMergedHeader().getProgramRecords();
-        Assert.assertEquals(outputProgramGroups.size(), 2);
-        Assert.assertTrue(outputProgramGroups.get(0).equivalent(program1));
-        Assert.assertTrue(outputProgramGroups.get(1).equivalent(program3));
-
-
-        final MergingSamRecordIterator iterator = new MergingSamRecordIterator(headerMerger, readers, false);
-        SAMRecord samRecord = iterator.next();
-        Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), "0");
-        samRecord = iterator.next();
-        Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), "0");
-        samRecord = iterator.next();
-        Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), "0.1");
-        Assert.assertFalse(iterator.hasNext());
-        CloserUtil.close(readers);
-    }
-
-    /**
-     * List of program groups from the input files are merged, and renumbered, and SAMRecords
-     * with PG tags get assigned the updated PG ID.
-     * Original ProgramRecord-specific test.
-     */
-    @Test
-    public void testMergingMultipleReadGroups() {
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, false);
-        builder1.setReadGroup(createSAMReadGroupRecord("a0"));
-        builder1.setReadGroup(createSAMReadGroupRecord("a1"));
-        builder1.setReadGroup(createSAMReadGroupRecord("a2"));
-        builder1.addFrag("read1", 20, 28833, false);
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, false);
-        builder2.setReadGroup(createSAMReadGroupRecord("0"));
-        builder2.setReadGroup(createSAMReadGroupRecord("a1"));      //collision 1
-        builder2.setReadGroup(createSAMReadGroupRecord("a2"));      //collision 2
-        builder2.setReadGroup(createSAMReadGroupRecord("a1.1"));    //doesn't collide
-        builder2.setReadGroup(createSAMReadGroupRecord("a2.1"));    //doesn't collide
-        builder2.setReadGroup(createSAMReadGroupRecord("a2.4.9"));  //doesn't collide
-        builder2.setReadGroup(createSAMReadGroupRecord("a2.4"));    //collision
-        builder2.addFrag("read1", 20, 28833, false);
-
-        final List<SamReader> readers = new ArrayList<SamReader>();
-        readers.add(builder1.getSamReader());
-        readers.add(builder2.getSamReader());
-
-        final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-        headers.add(readers.get(0).getFileHeader());
-        headers.add(readers.get(1).getFileHeader());
-
-        final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
-
-        final List<? extends AbstractSAMHeaderRecord> outputGroups = headerMerger.getMergedHeader().getReadGroups();
-        // "0, a0, a1, a1.1, a1.3, a2, a2.1, a2.6
-        //the merged read groups are sorted in order
-        Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(0)).getReadGroupId(), "0"); //0
-        Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(1)).getReadGroupId(), "a0"); //1
-        Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(2)).getReadGroupId(), "a1"); //2
-        Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(3)).getReadGroupId(), "a1.1"); //3
-        Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(4)).getReadGroupId(), "a1.2"); //4
-        Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(5)).getReadGroupId(), "a2");  //5
-        Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(6)).getReadGroupId(), "a2.1");
-        Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(7)).getReadGroupId(), "a2.4");
-        Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(8)).getReadGroupId(), "a2.4.9");
-        Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(9)).getReadGroupId(), "a2.4.A");
-        Assert.assertEquals(outputGroups.size(), 10);
-        CloserUtil.close(readers);
-    }
-
-    private SAMReadGroupRecord createSAMReadGroupRecord(String id) {
-        SAMReadGroupRecord readGroupRecord = new SAMReadGroupRecord(id);
-        readGroupRecord.setAttribute(SAMTag.SM.name(), Double.toString(Math.random()));
-        return readGroupRecord;
-    }
-
-    /** Captures commonality between ProgramRecord and ReadGroup for having one set of tests */
-    abstract class GroupAdapter {
-
-        /** Gets the group's group ID */
-        abstract String getGroupId(AbstractSAMHeaderRecord group);
-
-        /** Gets the groups from header */
-        abstract List<? extends AbstractSAMHeaderRecord> getGroups(SAMFileHeader header);
-
-        /** Gets the group's 'name' tag */
-        abstract String getTagName();
-
-        /** Creates groups for specified IDs */
-        abstract List<? extends AbstractSAMHeaderRecord> createGroups(final String[] groupIds);
-
-        /** Sets a group-specific attribute - for CL for ProgramRecord CL, for PU for ReadGroup */
-        abstract void setAttribute(AbstractSAMHeaderRecord group, String value);
-
-        /** Creates a new group */
-        abstract AbstractSAMHeaderRecord newGroup(String groupId);
-
-        /** Sets the group for the builder */
-        abstract void setBuilderGroup(SAMRecordSetBuilder builder, AbstractSAMHeaderRecord group);
-
-        /** Attributes equivalent */
-        abstract boolean equivalent(AbstractSAMHeaderRecord group1, AbstractSAMHeaderRecord group2);
-
-        SamReader newFileReader() {
-            final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-            builder.addFrag("read_28833_29006_6945", 20, 28833, false); // ok
-            return builder.getSamReader();
-        }
-    }
-
-    class ProgramGroupAdapter extends GroupAdapter {
-        String getGroupId(AbstractSAMHeaderRecord group) {
-            return ((SAMProgramRecord) group).getProgramGroupId();
-        }
-
-        List<? extends AbstractSAMHeaderRecord> getGroups(SAMFileHeader header) {
-            return header.getProgramRecords();
-        }
-
-        String getTagName() {
-            return SAMTag.PG.toString();
-        }
-
-        List<? extends AbstractSAMHeaderRecord> createGroups(final String[] groupIds) {
-            final List<SamReader> readers = new ArrayList<SamReader>();
-            for (final String groupId : groupIds) {
-                final SamReader samReader = newFileReader();
-                final List<SAMProgramRecord> records = new ArrayList<SAMProgramRecord>();
-                final SAMProgramRecord record = new SAMProgramRecord(groupId);
-                records.add(record);
-                samReader.getFileHeader().setProgramRecords(records);
-                readers.add(samReader);
-            }
-
-            final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-            for (final SamReader reader : readers) {
-                headers.add(reader.getFileHeader());
-            }
-            CloserUtil.close(readers);
-
-            final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headers, false);
-            return fileHeaderMerger.getMergedHeader().getProgramRecords();
-        }
-
-        void setAttribute(AbstractSAMHeaderRecord group, String value) {
-            ((SAMProgramRecord) group).setCommandLine(value);
-        }
-
-        AbstractSAMHeaderRecord newGroup(String id) {
-            return new SAMProgramRecord(id);
-        }
-
-        void setBuilderGroup(SAMRecordSetBuilder builder, AbstractSAMHeaderRecord group) {
-            builder.setProgramRecord((SAMProgramRecord) group);
-        }
-
-        boolean equivalent(AbstractSAMHeaderRecord group1, AbstractSAMHeaderRecord group2) {
-            return ((SAMProgramRecord) group1).equivalent((SAMProgramRecord) group2);
-        }
-    }
-
-    class ReadGroupAdapter extends GroupAdapter {
-        String getGroupId(AbstractSAMHeaderRecord group) {
-            return ((SAMReadGroupRecord) group).getReadGroupId();
-        }
-
-        List<? extends AbstractSAMHeaderRecord> getGroups(SAMFileHeader header) {
-            return header.getReadGroups();
-        }
-
-        String getTagName() {
-            return SAMTag.RG.toString();
-        }
-
-        List<? extends AbstractSAMHeaderRecord> createGroups(final String[] groupIds) {
-            final List<SamReader> readers = new ArrayList<SamReader>();
-
-            for (final String groupId : groupIds) {
-                final SamReader samReader = newFileReader();
-                final List<SAMReadGroupRecord> records = new ArrayList<SAMReadGroupRecord>();
-                final SAMReadGroupRecord record = new SAMReadGroupRecord(groupId);
-                records.add(record);
-                samReader.getFileHeader().setReadGroups(records);
-                readers.add(samReader);
-            }
-            final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-            for (final SamReader reader : readers) {
-                headers.add(reader.getFileHeader());
-            }
-            CloserUtil.close(readers);
-            final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headers, false);
-            return fileHeaderMerger.getMergedHeader().getReadGroups();
-        }
-
-        void setAttribute(AbstractSAMHeaderRecord group, String value) {
-            ((SAMReadGroupRecord) group).setPlatformUnit(value);
-        }
-
-        AbstractSAMHeaderRecord newGroup(String id) {
-            SAMReadGroupRecord group = new SAMReadGroupRecord(id);
-            group.setAttribute(SAMTag.SM.name(), id);
-            return group;
-        }
-
-        void setBuilderGroup(SAMRecordSetBuilder builder, AbstractSAMHeaderRecord group) {
-            builder.setReadGroup((SAMReadGroupRecord) group);
-        }
-
-        boolean equivalent(AbstractSAMHeaderRecord group1, AbstractSAMHeaderRecord group2) {
-            return ((SAMReadGroupRecord) group1).equivalent((SAMReadGroupRecord) group2);
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/MergingSamRecordIteratorTest.java b/src/test/java/htsjdk/samtools/MergingSamRecordIteratorTest.java
deleted file mode 100644
index 885321b..0000000
--- a/src/test/java/htsjdk/samtools/MergingSamRecordIteratorTest.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.SequenceUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Tests for MultiIterator
- *
- * @author Dave Tefft
- */
-public class MergingSamRecordIteratorTest {
-
-    @Test
-    public void testVanillaCoordinateMultiIterator() throws Exception {
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder();
-        builder1.addFrag("read_28833_29006_6945", 20, 28833, false); // ok
-        builder1.addFrag("read_28701_28881_323b", 22, 28834, false); // ok
-
-        final SamReader samReader = builder1.getSamReader();
-        samReader.getFileHeader().setSortOrder(SAMFileHeader.SortOrder.coordinate);
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder();
-        builder2.addFrag("read_28833_29006_6945", 20, 30000, false); // ok
-        builder2.addFrag("read_28701_28881_323b", 22, 28835, false); // ok
-        builder2.addFrag("read_28701_28881_323c", 22, 28835, false); // ok
-
-        final SamReader samReader2 = builder2.getSamReader();
-        samReader2.getFileHeader().setSortOrder(SAMFileHeader.SortOrder.coordinate);
-
-
-        final List<SamReader> readerList = new ArrayList<SamReader>();
-        readerList.add(samReader);
-        readerList.add(samReader2);
-
-        final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
-        headerList.add(samReader.getFileHeader());
-        headerList.add(samReader2.getFileHeader());
-
-        final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headerList, false);
-
-        final MergingSamRecordIterator iterator = new MergingSamRecordIterator(fileHeaderMerger, readerList, false);
-
-
-        int i = 0;
-
-        // This is the correct order for start bases.  The first two are on chr20, the next three on chr22
-        final int[] startBasesInOrder = {28833, 30000, 28834, 28835, 28835};
-
-        while (iterator.hasNext()) {
-            final SAMRecord rec = iterator.next();
-            System.out.println(rec.getSAMString());
-            Assert.assertEquals(rec.getAlignmentStart(), startBasesInOrder[i]);
-            i++;
-        }
-        samReader.close();
-        samReader2.close();
-    }
-
-    @Test
-    public void testVanillaReadOrderMultiIterator() throws Exception {
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
-        builder1.addFrag("a", 20, 28833, false); // ok
-        builder1.addFrag("e", 19, 28834, false); // ok
-
-        final SamReader samReader = builder1.getSamReader();
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
-        builder2.addFrag("b", 20, 30000, false); // ok
-        builder2.addFrag("c", 22, 28835, false); // ok
-        builder2.addFrag("d", 20, 28835, false); // ok
-
-        final SamReader samReader2 = builder2.getSamReader();
-
-
-        final List<SamReader> readerList = new ArrayList<SamReader>();
-        readerList.add(samReader);
-        readerList.add(samReader2);
-
-        final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
-        headerList.add(samReader.getFileHeader());
-        headerList.add(samReader2.getFileHeader());
-
-        final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headerList, false);
-
-        final MergingSamRecordIterator iterator = new MergingSamRecordIterator(fileHeaderMerger, readerList, false);
-
-
-        int i = 0;
-
-        // This is the correct order for start bases.  The first two are on chr20, the next three on chr22
-        final String[] orderedReadNames = {"a", "b", "c", "d", "e"};
-
-        while (iterator.hasNext()) {
-            final SAMRecord rec = iterator.next();
-            System.out.println(rec.getReadName());
-            Assert.assertEquals(rec.getReadName(), orderedReadNames[i]);
-            i++;
-        }
-        samReader.close();
-        samReader2.close();
-    }
-
-    @Test
-    public void testVanillaUnsortedMultiIterator() throws Exception {
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
-        builder1.addFrag("b", 20, 28833, false); // ok
-        builder1.addFrag("a", 19, 28834, false); // ok
-
-        final SamReader samReader = builder1.getSamReader();
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
-        builder2.addFrag("d", 20, 30000, false); // ok
-        builder2.addFrag("e", 22, 28835, false); // ok
-        builder2.addFrag("c", 20, 28835, false); // ok
-
-        final SamReader samReader2 = builder2.getSamReader();
-
-
-        final List<SamReader> readerList = new ArrayList<SamReader>();
-        readerList.add(samReader);
-        readerList.add(samReader2);
-
-        final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
-        headerList.add(samReader.getFileHeader());
-        headerList.add(samReader2.getFileHeader());
-
-        final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.unsorted, headerList, false);
-
-        final MergingSamRecordIterator iterator = new MergingSamRecordIterator(fileHeaderMerger, readerList, false);
-
-
-        int i = 0;
-
-        // With unsorted option there is no garantee that order of the names to come back from the iterator
-        final String[] readNames = {"b", "a", "d", "e", "c"};
-
-        while (iterator.hasNext()) {
-            final SAMRecord rec = iterator.next();
-            System.out.println(rec.getReadName());
-            i++;
-        }
-        Assert.assertEquals(i, readNames.length);
-        samReader.close();
-        samReader2.close();
-    }
-
-    @Test(expectedExceptions = SequenceUtil.SequenceListsDifferException.class)
-    public void testConflictingHeaders() throws Exception {
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder();
-        builder1.addFrag("read_28833_29006_6945", 20, 28833, false); // ok
-        builder1.addFrag("read_28701_28881_323b", 22, 28834, false); // ok
-
-        final SamReader samReader = builder1.getSamReader();
-        samReader.getFileHeader().setSortOrder(SAMFileHeader.SortOrder.coordinate);
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder();
-        builder2.addFrag("read_28833_29006_6945", 20, 30000, false); // ok
-        builder2.addFrag("read_28701_28881_323b", 22, 28835, false); // ok
-        builder2.addFrag("read_28701_28881_323c", 22, 28835, false); // ok
-
-        final SamReader samReader2 = builder2.getSamReader();
-        samReader2.getFileHeader().setSortOrder(SAMFileHeader.SortOrder.coordinate);
-
-        //Change one of the header so they are no longer compatible
-        final SAMSequenceRecord sRec = new SAMSequenceRecord("BADSEQ", 0);
-        samReader2.getFileHeader().addSequence(sRec);
-
-
-        final List<SamReader> readerList = new ArrayList<SamReader>();
-        readerList.add(samReader);
-        readerList.add(samReader2);
-
-        final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
-        headerList.add(samReader.getFileHeader());
-        headerList.add(samReader2.getFileHeader());
-
-        final SamFileHeaderMerger samFileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headerList, false);
-
-        new MergingSamRecordIterator(samFileHeaderMerger, readerList, false);
-        Assert.fail("This method should throw exception before getting to this point");
-    }
-
-
-    @Test(expectedExceptions = SAMException.class)
-    public void filesNotSortedCorrectly() throws Exception {
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.coordinate);
-        builder1.addFrag("read_28833_29006_6945", 20, 28833, false); // ok
-        builder1.addFrag("read_28701_28881_323b", 22, 28834, false); // ok
-
-        final SamReader samReader = builder1.getSamReader();
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
-
-        final SamReader samReader2 = builder2.getSamReader();
-
-        builder2.addFrag("read_28701_28881_323b", 22, 28835, false); // ok
-        builder2.addFrag("read_28833_29006_6945", 20, 30000, false); // ok
-        builder2.addFrag("read_28701_28881_323c", 22, 28835, false); // ok
-
-        final List<SamReader> readerList = new ArrayList<SamReader>();
-        readerList.add(samReader);
-        readerList.add(samReader2);
-
-        final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
-        headerList.add(samReader.getFileHeader());
-        headerList.add(samReader2.getFileHeader());
-
-        final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headerList, false);
-
-        new MergingSamRecordIterator(fileHeaderMerger, readerList, false);
-        Assert.fail("This method should throw exception before getting to this point");
-    }
-
-    @Test
-    public void testHeaderCommentMerge() throws Exception {
-        final String[] comments1 = {"@CO\tHi, Mom!", "@CO\tHi, Dad!"};
-        final String[] comments2 = {"@CO\tHello, World!", "@CO\tGoodbye, Cruel World!"};
-        final Set<String> bothComments = new HashSet<String>();
-        bothComments.addAll(Arrays.asList(comments1));
-        bothComments.addAll(Arrays.asList(comments2));
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.coordinate);
-        SAMFileHeader header = builder1.getHeader();
-        for (final String comment : comments1) {
-            header.addComment(comment);
-        }
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.coordinate);
-        header = builder2.getHeader();
-        for (final String comment : comments2) {
-            header.addComment(comment);
-        }
-        final SamFileHeaderMerger merger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate,
-                Arrays.asList(builder1.getSamReader().getFileHeader(), builder2.getSamReader().getFileHeader()), false);
-        final List<String> mergedComments = merger.getMergedHeader().getComments();
-        Assert.assertEquals(mergedComments.size(), bothComments.size());
-        for (final String comment : mergedComments) {
-            Assert.assertTrue(bothComments.contains(comment));
-        }
-        builder1.getSamReader().close();
-        builder2.getSamReader().close();
-    }
-
-    @Test
-    public void testReferenceIndexMapping() throws Exception {
-        // Create two SamReaders with sequence dictionaries such that a merging iterator with merged
-        // headers will require remapping a record's reference index to the merged dictionary
-        final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder();
-        SAMSequenceRecord fakeSequenceRec = new SAMSequenceRecord("FAKE_CONTIG_A", 0);
-        builder1.getHeader().addSequence(fakeSequenceRec);
-
-        final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder();
-        fakeSequenceRec = new SAMSequenceRecord("FAKE_CONTIG_B", 0);
-        builder2.getHeader().addSequence(fakeSequenceRec);
-
-        // create a record with a reference index that will need to be remapped after merging
-        SAMRecord recRequiresMapping = new SAMRecord(builder2.getHeader());
-        recRequiresMapping.setReadName("fakeread");
-        recRequiresMapping.setReferenceName("FAKE_CONTIG_B");
-        builder2.addRecord(recRequiresMapping);
-        // cache the original reference index
-        int originalRefIndex = recRequiresMapping.getReferenceIndex();
-        Assert.assertTrue(25 == originalRefIndex);
-
-        // get a merging iterator with a merged header
-        final SamReader samReader1 = builder1.getSamReader();
-        final SamReader samReader2 = builder2.getSamReader();
-        final List<SamReader> readerList = new ArrayList<SamReader>();
-        readerList.add(samReader1);
-        readerList.add(samReader2);
-        final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
-        headerList.add(samReader1.getFileHeader());
-        headerList.add(samReader2.getFileHeader());
-        final SamFileHeaderMerger samFileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headerList, true);
-        final MergingSamRecordIterator iterator = new MergingSamRecordIterator(samFileHeaderMerger, readerList, false);
-
-        Assert.assertTrue(iterator.hasNext());
-        final SAMRecord rec = iterator.next();
-        Assert.assertTrue(26  == rec.getReferenceIndex());
-
-        samReader1.close();
-        samReader2.close();
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/ProgramRecordChainingTest.java b/src/test/java/htsjdk/samtools/ProgramRecordChainingTest.java
deleted file mode 100644
index cd470c4..0000000
--- a/src/test/java/htsjdk/samtools/ProgramRecordChainingTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Test for SequenceUtil.chainProgramRecord
- */
-public class ProgramRecordChainingTest {
-
-    @Test
-    public void testChainProgramRecord() {
-        SAMFileHeader header = new SAMFileHeader();
-        SAMProgramRecord first = header.createProgramRecord();
-        SAMUtils.chainSAMProgramRecord(header, first);
-        Assert.assertEquals(header.getProgramRecords().size(), 1);
-        Assert.assertNull(first.getPreviousProgramGroupId());
-
-        SAMProgramRecord second = header.createProgramRecord();
-        SAMUtils.chainSAMProgramRecord(header, second);
-        Assert.assertEquals(header.getProgramRecords().size(), 2);
-        Assert.assertNull(first.getPreviousProgramGroupId());
-        Assert.assertEquals(second.getPreviousProgramGroupId(), first.getProgramGroupId());
-
-        SAMProgramRecord third = new SAMProgramRecord("3");
-        SAMUtils.chainSAMProgramRecord(header, third);
-        header.addProgramRecord(third);
-        Assert.assertEquals(header.getProgramRecords().size(), 3);
-        Assert.assertNull(first.getPreviousProgramGroupId());
-        Assert.assertEquals(second.getPreviousProgramGroupId(), first.getProgramGroupId());
-        Assert.assertEquals(third.getPreviousProgramGroupId(), second.getProgramGroupId());
-
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMBinaryTagAndValueUnitTest.java b/src/test/java/htsjdk/samtools/SAMBinaryTagAndValueUnitTest.java
deleted file mode 100644
index f5f7a5c..0000000
--- a/src/test/java/htsjdk/samtools/SAMBinaryTagAndValueUnitTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class SAMBinaryTagAndValueUnitTest {
-
-    @DataProvider(name="allowedAttributeTypes")
-    public Object[][] allowedTypes() {
-        return  new Object[][] {
-                {new String("a string")},
-                {new Byte((byte) 7)},
-                {new Short((short) 8)},
-                {new Integer(0)},
-                {new Character('C')},
-                {new Float(0.1F)},
-                // unsigned longs
-                {new Long(0)},
-                {new Long(BinaryCodec.MAX_UINT)},
-                // signed longs
-                {new Long(-1L)},
-                {new Long(Integer.MAX_VALUE)},
-                {new Long(Integer.MIN_VALUE)},
-                // array values
-                {new byte[]{0, 1, 2}},
-                {new short[]{3, 4, 5}},
-                {new int[]{6, 7, 8}},
-                {new float[]{0.1F, 0.2F}},
-        };
-    }
-
-    @Test(dataProvider="allowedAttributeTypes")
-    public void test_isAllowedAttribute(final Object value) {
-        Assert.assertTrue(SAMBinaryTagAndValue.isAllowedAttributeValue(value));
-    }
-
-    @Test(dataProvider="allowedAttributeTypes")
-    public void test_isAllowedConstructor(final Object value) {
-        Assert.assertNotNull(new SAMBinaryTagAndValue(SAMTagUtil.getSingleton().makeBinaryTag("UI"), value));
-    }
-
-    @DataProvider(name="notAllowedAttributeTypes")
-    public Object[][] notAllowedTypes() {
-        return  new Object[][] {
-                {new Long(BinaryCodec.MAX_UINT + 1L)},
-                {new Long(Integer.MIN_VALUE - 1L)},
-                {new Double(0.3F)},
-                {new Object()},
-                {new Object[]{}},
-                {new Integer[]{}}
-        };
-    }
-
-    @Test(dataProvider="notAllowedAttributeTypes")
-    public void test_isNotAllowedAttribute(final Object value) {
-        Assert.assertFalse(SAMBinaryTagAndValue.isAllowedAttributeValue(value));
-    }
-
-    @Test(dataProvider="notAllowedAttributeTypes", expectedExceptions=IllegalArgumentException.class)
-    public void test_isNotAllowedConstructor(final Object value) {
-        new SAMBinaryTagAndValue(SAMTagUtil.getSingleton().makeBinaryTag("ZZ"), value);
-    }
-
-    @DataProvider(name="allowedUnsignedArrayTypes")
-    public Object[][] allowedUnsignedArrayTypes() {
-        return  new Object[][] {
-                {new byte[]{0, 1, 2}},
-                {new short[]{3, 4, 5}},
-                {new int[]{6, 7, 8}},
-        };
-    }
-
-    @Test(dataProvider="allowedUnsignedArrayTypes")
-    public void test_isAllowedUnsignedArrayAttribute(final Object value) {
-        final short binaryTag = SAMTagUtil.getSingleton().makeBinaryTag("UI");
-        Assert.assertNotNull(new SAMBinaryTagAndUnsignedArrayValue(binaryTag, value));
-    }
-
-    @DataProvider(name="notAllowedUnsignedArrayTypes")
-    public Object[][] notAllowedUnsignedArrayTypes() {
-        return  new Object[][] {
-                {new float[]{0.1F, 0.2F}},
-                {new Object[]{}}
-        };
-    }
-
-    @Test(dataProvider="notAllowedUnsignedArrayTypes", expectedExceptions=IllegalArgumentException.class)
-    public void test_isNotAllowedUnsignedArrayAttribute(final Object value) {
-        final short binaryTag = SAMTagUtil.getSingleton().makeBinaryTag("UI");
-        new SAMBinaryTagAndUnsignedArrayValue(binaryTag, value);
-    }
-
-    @DataProvider(name="hashCopyEquals")
-    public Object[][] hashCopyEquals() {
-        final short tag = SAMTagUtil.getSingleton().makeBinaryTag("UI");
-        return new Object[][] {
-                {new SAMBinaryTagAndValue(tag, new String("a string")), new SAMBinaryTagAndValue(tag, new String("a string")), true, true},
-                {new SAMBinaryTagAndValue(tag, new String("a string")), new SAMBinaryTagAndValue(tag, new String("different string")), false, false},
-
-                {new SAMBinaryTagAndValue(tag, new Byte((byte) 0)), new SAMBinaryTagAndValue(tag, new Byte((byte) 0)), true, true},
-                {new SAMBinaryTagAndValue(tag, new Byte((byte) 0)), new SAMBinaryTagAndValue(tag, new Byte((byte) 1)), false, false},
-
-                {new SAMBinaryTagAndValue(tag, new Short((short) 0)), new SAMBinaryTagAndValue(tag, new Short((short) 0)), true, true},
-                {new SAMBinaryTagAndValue(tag, new Short((short) 0)), new SAMBinaryTagAndValue(tag, new Short((short) 1)), false, false},
-
-                {new SAMBinaryTagAndValue(tag, new Integer(0)), new SAMBinaryTagAndValue(tag, new Integer(0)), true, true},
-                {new SAMBinaryTagAndValue(tag, new Integer(0)), new SAMBinaryTagAndValue(tag, new Integer(0)), true, true},
-
-                {new SAMBinaryTagAndValue(tag, new Character('C')), new SAMBinaryTagAndValue(tag, new Character('C')), true, true},
-                {new SAMBinaryTagAndValue(tag, new Character('C')), new SAMBinaryTagAndValue(tag, new Character('D')), false, false},
-
-                {new SAMBinaryTagAndValue(tag,new Float(0.1F)), new SAMBinaryTagAndValue(tag, new Float(0.1F)), true, true},
-                {new SAMBinaryTagAndValue(tag, new Float(0.1F)), new SAMBinaryTagAndValue(tag, new Float(0.2F)), false, false},
-
-                {new SAMBinaryTagAndValue(tag,new Long(37L)), new SAMBinaryTagAndValue(tag, new Long(37L)), true, true},
-                {new SAMBinaryTagAndValue(tag, new Long(37L)), new SAMBinaryTagAndValue(tag, new Long(38L)), false, false},
-
-                {new SAMBinaryTagAndValue(tag,new Long(BinaryCodec.MAX_UINT)), new SAMBinaryTagAndValue(tag, new Long(BinaryCodec.MAX_UINT)), true, true},
-                {new SAMBinaryTagAndValue(tag, new Long(BinaryCodec.MAX_UINT)), new SAMBinaryTagAndValue(tag, new Long(BinaryCodec.MAX_UINT-1)), false, false},
-
-                // arrays
-
-                {new SAMBinaryTagAndUnsignedArrayValue(tag, new byte[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new byte[]{0, 1, 2}), true, true},
-                {new SAMBinaryTagAndUnsignedArrayValue(tag, new byte[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new byte[]{3, 4, 5}), false, false},
-
-                {new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{0, 1, 2}), true, true},
-                {new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{3, 4, 5}), false, false},
-
-                {new SAMBinaryTagAndUnsignedArrayValue(tag, new int[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new int[]{0, 1, 2}), true, true},
-                {new SAMBinaryTagAndUnsignedArrayValue(tag, new int[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new int[]{3, 4, 5}), false, false},
-
-                // mix signed array and unsigned array; hashCodes are equal but objects are not
-                {new SAMBinaryTagAndValue(tag, new short[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{0, 1, 2}), true, false},
-
-                // mix signed array and unsigned array; hashCodes and objects are not equal
-                {new SAMBinaryTagAndValue(tag, new short[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{1, 1, 3}), false, false},
-        };
-    }
-
-    @Test(dataProvider="hashCopyEquals")
-    public void testHashAndEquals(
-            final SAMBinaryTagAndValue v1,
-            final SAMBinaryTagAndValue v2,
-            final boolean hashEquals,
-            final boolean isEquals)
-    {
-        Assert.assertEquals(hashEquals, v1.hashCode() == v2.hashCode());
-
-        Assert.assertEquals(isEquals, v1.equals(v2));
-        Assert.assertEquals(isEquals, v2.equals(v1));
-    }
-
-    @Test(dataProvider="hashCopyEquals")
-    public void testCopy(
-            final SAMBinaryTagAndValue v1,
-            final SAMBinaryTagAndValue v2,
-            final boolean unused_hashEquals,
-            final boolean isEquals)
-    {
-        Assert.assertTrue(v1.equals(v1.copy()));
-        Assert.assertTrue(v2.equals(v2.copy()));
-
-        Assert.assertEquals(isEquals, v1.equals(v2.copy()));
-        Assert.assertEquals(isEquals, v2.equals(v1.copy()));
-    }
-
-    @Test(dataProvider="hashCopyEquals")
-    public void testDeepCopy(
-            final SAMBinaryTagAndValue v1,
-            final SAMBinaryTagAndValue v2,
-            final boolean unused_hashEquals,
-            final boolean isEquals)
-    {
-        Assert.assertTrue(v1.equals(v1.deepCopy()));
-        Assert.assertTrue(v2.equals(v2.deepCopy()));
-
-        Assert.assertEquals(isEquals, v1.equals(v2.deepCopy()));
-        Assert.assertEquals(isEquals, v2.equals(v1.deepCopy()));
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SAMCloneTest.java b/src/test/java/htsjdk/samtools/SAMCloneTest.java
deleted file mode 100644
index 8fdfb3b..0000000
--- a/src/test/java/htsjdk/samtools/SAMCloneTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class SAMCloneTest {
-    private SAMRecordSetBuilder getSAMReader(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder) {
-        final SAMRecordSetBuilder ret = new SAMRecordSetBuilder(sortForMe, sortOrder);
-        ret.addPair("readB", 20, 200, 300);
-        ret.addPair("readA", 20, 100, 150);
-        ret.addFrag("readC", 20, 140, true);
-        ret.addFrag("readD", 20, 140, false);
-        return ret;
-    }
-
-    @Test
-    public void testBasic() throws Exception {
-        final SAMRecordSetBuilder recordSetBuilder = getSAMReader(true, SAMFileHeader.SortOrder.coordinate);
-        SamReader inputSAM = recordSetBuilder.getSamReader();
-        for (final SAMRecord samRecord : inputSAM) {
-            SAMRecord newRecord = (SAMRecord) samRecord.clone();
-            Assert.assertEquals(newRecord, samRecord);
-        }
-        inputSAM.close();
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java b/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java
deleted file mode 100644
index dc7a6f3..0000000
--- a/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.util.IOUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.*;
-
-public class SAMFileWriterFactoryTest {
-
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
-    /** PIC-442Confirm that writing to a special file does not cause exception when writing additional files. */
-    @Test(groups={"unix"})
-    public void specialFileWriterTest() {
-        createSmallBam(new File("/dev/null"));
-    }
-
-    @Test()
-    public void ordinaryFileWriterTest() throws Exception {
-        final File outputFile = File.createTempFile("tmp.", BamFileIoUtils.BAM_FILE_EXTENSION);
-        outputFile.delete();
-        outputFile.deleteOnExit();
-        createSmallBam(outputFile);
-        final File indexFile = SamFiles.findIndex(outputFile);
-        indexFile.deleteOnExit();
-        final File md5File = new File(outputFile.getParent(), outputFile.getName() + ".md5");
-        md5File.deleteOnExit();
-        Assert.assertTrue(outputFile.length() > 0);
-        Assert.assertTrue(indexFile.length() > 0);
-        Assert.assertTrue(md5File.length() > 0);
-    }
-
-    @Test(description="create a BAM in memory,  should start with GZipInputStream.GZIP_MAGIC")
-    public void inMemoryBam()  throws Exception  {
-    	ByteArrayOutputStream os=new ByteArrayOutputStream();
-    	createSmallBamToOutputStream(os,true);
-    	os.flush();
-    	os.close();
-    	byte blob[]=os.toByteArray();
-        Assert.assertTrue(blob.length > 2);
-        int head = ((int) blob[0] & 0xff) | ((blob[1] << 8 ) & 0xff00 );
-        Assert.assertTrue(java.util.zip.GZIPInputStream.GZIP_MAGIC == head);
-    }
-
-    @Test(description="create a SAM in memory,  should start with '@HD'")
-    public void inMemorySam()  throws Exception  {
-    	ByteArrayOutputStream os=new ByteArrayOutputStream();
-    	createSmallBamToOutputStream(os,false);
-    	os.flush();
-    	os.close();
-    	String sam=new String(os.toByteArray());
-        Assert.assertFalse(sam.isEmpty());
-        Assert.assertTrue(sam.startsWith("@HD\t"),"SAM: bad prefix");
-    }
-
-    @Test(description="Read and then write SAM to verify header attribute ordering does not change depending on JVM version")
-    public void samRoundTrip()  throws Exception  {
-        final File input = new File(TEST_DATA_DIR, "roundtrip.sam");
-
-        final SamReader reader = SamReaderFactory.makeDefault().open(input);
-        final File outputFile = File.createTempFile("roundtrip-out", ".sam");
-        outputFile.delete();
-        outputFile.deleteOnExit();
-        FileOutputStream os = new FileOutputStream(outputFile);
-        final SAMFileWriterFactory factory = new SAMFileWriterFactory();
-        final SAMFileWriter writer = factory.makeSAMWriter(reader.getFileHeader(), false, os);
-        for (SAMRecord rec : reader) {
-            writer.addAlignment(rec);
-        }
-        writer.close();
-        os.close();
-
-        InputStream is = new FileInputStream(input);
-        String originalsam = IOUtil.readFully(is);
-        is.close();
-
-        is = new FileInputStream(outputFile);
-        String writtensam = IOUtil.readFully(is);
-        is.close();
-
-        Assert.assertEquals(writtensam, originalsam);
-    }
-
-    @Test(description="Write SAM records with null SAMFileHeader")
-    public void samNullHeaderRoundTrip()  throws Exception  {
-        final File input = new File(TEST_DATA_DIR, "roundtrip.sam");
-
-        final SamReader reader = SamReaderFactory.makeDefault().open(input);
-        final File outputFile = File.createTempFile("nullheader-out", ".sam");
-        outputFile.delete();
-        outputFile.deleteOnExit();
-        FileOutputStream os = new FileOutputStream(outputFile);
-        final SAMFileWriterFactory factory = new SAMFileWriterFactory();
-        final SAMFileWriter writer = factory.makeSAMWriter(reader.getFileHeader(), false, os);
-        for (SAMRecord rec : reader) {
-            rec.setHeader(null);
-            writer.addAlignment(rec);
-        }
-        writer.close();
-        os.close();
-
-        InputStream is = new FileInputStream(input);
-        String originalsam = IOUtil.readFully(is);
-        is.close();
-
-        is = new FileInputStream(outputFile);
-        String writtensam = IOUtil.readFully(is);
-        is.close();
-
-        Assert.assertEquals(writtensam, originalsam);
-    }
-
-    private void createSmallBam(final File outputFile) {
-        final SAMFileWriterFactory factory = new SAMFileWriterFactory();
-        factory.setCreateIndex(true);
-        factory.setCreateMd5File(true);
-        final SAMFileHeader header = new SAMFileHeader();
-        // index only created if coordinate sorted
-        header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-        header.addSequence(new SAMSequenceRecord("chr1", 123));
-        final SAMFileWriter writer = factory.makeBAMWriter(header, false, outputFile);
-        fillSmallBam(writer);
-        writer.close();
-    }
-
-
-   private void createSmallBamToOutputStream(final OutputStream outputStream,boolean binary) {
-        final SAMFileWriterFactory factory = new SAMFileWriterFactory();
-        factory.setCreateIndex(false);
-        factory.setCreateMd5File(false);
-        final SAMFileHeader header = new SAMFileHeader();
-        // index only created if coordinate sorted
-        header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-        header.addSequence(new SAMSequenceRecord("chr1", 123));
-        final SAMFileWriter writer = (binary?
-        			factory.makeBAMWriter(header, false, outputStream):
-        			factory.makeSAMWriter(header, false, outputStream)
-        			);
-        fillSmallBam(writer);
-        writer.close();
-    }
-   
-   private int fillSmallBam(SAMFileWriter writer) {
-       final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-       builder.addUnmappedFragment("HiMom!");
-       int numRecs = builder.getRecords().size();
-       for (final SAMRecord rec: builder.getRecords()) {
-           writer.addAlignment(rec);
-       }
-       return numRecs;
-    }
-
-    private File prepareOutputFile(String extension) throws IOException {
-        final File outputFile = File.createTempFile("tmp.", extension);
-        outputFile.delete();
-        outputFile.deleteOnExit();
-        return outputFile;
-    }
-
-    //  Create a writer factory that creates and index and md5 file and set the header to coord sorted
-    private SAMFileWriterFactory createWriterFactoryWithOptions(SAMFileHeader header) {
-        final SAMFileWriterFactory factory = new SAMFileWriterFactory();
-        factory.setCreateIndex(true);
-        factory.setCreateMd5File(true);
-        // index only created if coordinate sorted
-        header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-        header.addSequence(new SAMSequenceRecord("chr1", 123));
-        header.addReadGroup(new SAMReadGroupRecord("1"));
-        return factory;
-    }
-
-    private void verifyWriterOutput(File outputFile, ReferenceSource refSource, int nRecs, boolean verifySupplementalFiles) {
-        if (verifySupplementalFiles) {
-            final File indexFile = SamFiles.findIndex(outputFile);
-            indexFile.deleteOnExit();
-            final File md5File = new File(outputFile.getParent(), outputFile.getName() + ".md5");
-            md5File.deleteOnExit();
-            Assert.assertTrue(indexFile.length() > 0);
-            Assert.assertTrue(md5File.length() > 0);
-        }
-
-        SamReaderFactory factory =  SamReaderFactory.makeDefault().validationStringency(ValidationStringency.LENIENT);
-        if (refSource != null) {
-            factory.referenceSource(refSource);
-        }
-        SamReader reader = factory.open(outputFile);
-        SAMRecordIterator it = reader.iterator();
-        int count = 0;
-        for (; it.hasNext(); it.next()) {
-            count++;
-        }
-
-        Assert.assertTrue(count == nRecs);
-    }
-
-    @DataProvider(name="bamOrCramWriter")
-    public Object[][] bamOrCramWriter() {
-        return new Object[][] {
-                { BamFileIoUtils.BAM_FILE_EXTENSION, },
-                { CramIO.CRAM_FILE_EXTENSION }
-        };
-    }
-
-    @Test(dataProvider="bamOrCramWriter")
-    public void testMakeWriter(String extension) throws Exception {
-        final File outputFile = prepareOutputFile(extension);
-        final SAMFileHeader header = new SAMFileHeader();
-        final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header);
-        final File referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta");
-
-        final SAMFileWriter samWriter = factory.makeWriter(header, false, outputFile, referenceFile);
-        int nRecs = fillSmallBam(samWriter);
-        samWriter.close();
-
-        verifyWriterOutput(outputFile, new ReferenceSource(referenceFile), nRecs, true);
-    }
-
-    @Test
-    public void testMakeCRAMWriterWithOptions() throws Exception {
-        final File outputFile = prepareOutputFile(CramIO.CRAM_FILE_EXTENSION);
-        final SAMFileHeader header = new SAMFileHeader();
-        final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header);
-        final File referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta");
-
-        final SAMFileWriter samWriter = factory.makeCRAMWriter(header, false, outputFile, referenceFile);
-        int nRecs = fillSmallBam(samWriter);
-        samWriter.close();
-
-        verifyWriterOutput(outputFile, new ReferenceSource(referenceFile), nRecs, true);
-    }
-
-    @Test
-    public void testMakeCRAMWriterIgnoresOptions() throws Exception {
-        final File outputFile = prepareOutputFile(CramIO.CRAM_FILE_EXTENSION);
-        final SAMFileHeader header = new SAMFileHeader();
-        final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header);
-        final File referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta");
-
-        // Note: does not honor factory settings for CREATE_MD5 or CREATE_INDEX.
-        final SAMFileWriter samWriter = factory.makeCRAMWriter(header, new FileOutputStream(outputFile), referenceFile);
-        int nRecs = fillSmallBam(samWriter);
-        samWriter.close();
-
-        verifyWriterOutput(outputFile, new ReferenceSource(referenceFile), nRecs, false);
-    }
-
-    @Test
-    public void testMakeCRAMWriterPresortedDefault() throws Exception {
-        final File outputFile = prepareOutputFile(CramIO.CRAM_FILE_EXTENSION);
-        final SAMFileHeader header = new SAMFileHeader();
-        final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header);
-        final File referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta");
-
-        // Defaults to preSorted==true
-        final SAMFileWriter samWriter = factory.makeCRAMWriter(header, outputFile, referenceFile);
-        int nRecs = fillSmallBam(samWriter);
-        samWriter.close();
-
-        verifyWriterOutput(outputFile, new ReferenceSource(referenceFile), nRecs, true);
-    }
-
-    @Test
-    public void testAsync() throws IOException {
-        final SAMFileWriterFactory builder = new SAMFileWriterFactory();
-
-        final File outputFile = prepareOutputFile(BamFileIoUtils.BAM_FILE_EXTENSION);
-        final SAMFileHeader header = new SAMFileHeader();
-        final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header);
-        final File referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta");
-
-        SAMFileWriter writer = builder.makeWriter(header, false, outputFile, referenceFile);
-        Assert.assertEquals(writer instanceof AsyncSAMFileWriter, Defaults.USE_ASYNC_IO_WRITE_FOR_SAMTOOLS, "testAsync default");
-
-        writer = builder.setUseAsyncIo(true).makeWriter(header, false, outputFile, referenceFile);
-        Assert.assertTrue(writer instanceof AsyncSAMFileWriter, "testAsync option=set");
-
-        writer = builder.setUseAsyncIo(false).makeWriter(header, false, outputFile, referenceFile);
-        Assert.assertFalse(writer instanceof AsyncSAMFileWriter, "testAsync option=unset");
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMFlagTest.java b/src/test/java/htsjdk/samtools/SAMFlagTest.java
deleted file mode 100644
index 7b5a553..0000000
--- a/src/test/java/htsjdk/samtools/SAMFlagTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * The MIT License
- *
- * Author: Pierre Lindenbaum PhD @yokofakun
- *  Institut du Thorax - Nantes - France
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class SAMFlagTest {
-    @Test
-    public void testFlags() {
-        Assert.assertTrue(SAMFlag.getFlags(83).contains(SAMFlag.READ_PAIRED));
-        Assert.assertTrue(SAMFlag.getFlags(83).contains(SAMFlag.PROPER_PAIR));
-        Assert.assertTrue(SAMFlag.getFlags(83).contains(SAMFlag.READ_REVERSE_STRAND));
-        Assert.assertTrue(SAMFlag.getFlags(83).contains(SAMFlag.FIRST_OF_PAIR));
-        Assert.assertFalse(SAMFlag.getFlags(83).contains(SAMFlag.READ_UNMAPPED));
-        Assert.assertFalse(SAMFlag.getFlags(83).contains(SAMFlag.MATE_UNMAPPED));
-        Assert.assertTrue(SAMFlag.getFlags(0).isEmpty());
-        Assert.assertEquals(SAMFlag.getFlags(4095).size(),12);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMIntegerTagTest.java b/src/test/java/htsjdk/samtools/SAMIntegerTagTest.java
deleted file mode 100644
index 133062a..0000000
--- a/src/test/java/htsjdk/samtools/SAMIntegerTagTest.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Confirm that integer tag types are stored and retrieved properly.
- *
- * @author alecw at broadinstitute.org
- */
-public class SAMIntegerTagTest {
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/SAMIntegerTagTest");
-
-    private static final String BYTE_TAG = "BY";
-    private static final String SHORT_TAG = "SH";
-    private static final String INTEGER_TAG = "IN";
-    private static final String UNSIGNED_INTEGER_TAG = "UI";
-    private static final String STRING_TAG = "ST";
-
-    private static final long TOO_LARGE_UNSIGNED_INT_VALUE = BinaryCodec.MAX_UINT + 1L;
-
-    enum FORMAT {SAM, BAM, CRAM}
-
-    @Test
-    public void testBAM() throws Exception {
-        final SAMRecord rec = writeAndReadSamRecord("bam");
-        Assert.assertTrue(rec.getAttribute(BYTE_TAG) instanceof Integer);
-        Assert.assertEquals(((Number) rec.getAttribute(BYTE_TAG)).intValue(), 1);
-        Assert.assertTrue(rec.getAttribute(SHORT_TAG) instanceof Integer);
-        Assert.assertEquals(((Number) rec.getAttribute(SHORT_TAG)).intValue(), 1);
-        Assert.assertTrue(rec.getAttribute(INTEGER_TAG) instanceof Integer);
-        Assert.assertEquals(((Number) rec.getAttribute(INTEGER_TAG)).intValue(), 1);
-    }
-
-    @Test
-    public void testSAM() throws Exception {
-        final SAMRecord rec = writeAndReadSamRecord("sam");
-        Assert.assertTrue(rec.getAttribute(BYTE_TAG) instanceof Integer);
-        Assert.assertEquals(((Number) rec.getAttribute(BYTE_TAG)).intValue(), 1);
-        Assert.assertTrue(rec.getAttribute(SHORT_TAG) instanceof Integer);
-        Assert.assertEquals(((Number) rec.getAttribute(SHORT_TAG)).intValue(), 1);
-        Assert.assertTrue(rec.getAttribute(INTEGER_TAG) instanceof Integer);
-        Assert.assertEquals(((Number) rec.getAttribute(INTEGER_TAG)).intValue(), 1);
-    }
-
-    @Test
-    public void testUnsignedIntegerSAM() throws Exception {
-        final SAMRecord rec = createSamRecord();
-        final long val = 1l + Integer.MAX_VALUE;
-        rec.setAttribute(UNSIGNED_INTEGER_TAG, val);
-        final Object roundTripValue = rec.getAttribute(UNSIGNED_INTEGER_TAG);
-        Assert.assertTrue(roundTripValue instanceof Long);
-        Assert.assertEquals(((Long)roundTripValue).longValue(), val);
-    }
-
-    @Test
-    public void testGetTypedAttributeMethods() throws Exception {
-        final SAMRecord rec = writeAndReadSamRecord("bam");
-        Assert.assertEquals(rec.getByteAttribute(INTEGER_TAG).intValue(), 1);
-        Assert.assertEquals(rec.getShortAttribute(INTEGER_TAG).intValue(), 1);
-        Assert.assertEquals(rec.getIntegerAttribute(INTEGER_TAG).intValue(), 1);
-    }
-
-
-    @DataProvider
-    public Object[][] formatsAndValues(){
-        return new Object[][]{
-                new Object[]{"sam","Hello World!"},
-                new Object[]{"bam","Hello World!"},
-                new Object[]{"cram","Hello World!"},
-                new Object[]{"cram",""},
-                new Object[]{"bam",""},
-                new Object[]{"sam",""},
-        };
-    }
-    /**
-     * Should be able to write empty and non-empty strings
-     */
-    @Test(dataProvider = "formatsAndValues")
-    public void testWriteAndReadStrings(final String format,final String value) throws Exception {
-        final SAMRecord rec = createSamRecord();
-        rec.setAttribute(STRING_TAG, value);
-        writeAndReadSamRecord(format, rec);
-        Assert.assertEquals(rec.getStringAttribute(STRING_TAG),value);
-    }
-
-
-    @DataProvider
-    public Object[][] formatsAndValues2(){
-        return new Object[][]{
-                new Object[]{"sam",'a'},
-                new Object[]{"bam",'a'},
-                new Object[]{"cram",'a'},
-                new Object[]{"cram",null},
-                new Object[]{"bam",null},
-                new Object[]{"sam",null},
-        };
-    }
-    /**
-     * Should be able to write empty and non-empty strings
-     */
-    @Test(dataProvider = "formatsAndValues2")
-    public void testWriteAndReadCharacters(final String format,final Character value) throws Exception {
-        final SAMRecord rec = createSamRecord();
-        rec.setAttribute(STRING_TAG, value);
-        writeAndReadSamRecord(format, rec);
-        Assert.assertEquals(rec.getCharacterAttribute(STRING_TAG),value);
-    }
-
-    /**
-     * Should be an exception if a typed attribute call is made for the wrong type.
-     */
-    @Test(expectedExceptions = RuntimeException.class)
-    public void testGetTypedAttributeForWrongType() throws Exception {
-        final SAMRecord rec = createSamRecord();
-        rec.setAttribute(STRING_TAG, "Hello, World!");
-        writeAndReadSamRecord("bam", rec);
-        rec.getIntegerAttribute(STRING_TAG);
-        Assert.fail("Exception should have been thrown.");
-    }
-
-    /**
-     * Should be an exception if a typed attribute call is made for a value that cannot
-     * be coerced into the correct type.
-     * This test is a little lame because a RuntimeException could be thrown for some other reason.
-     */
-    @Test(expectedExceptions = RuntimeException.class)
-    public void testGetTypedAttributeOverflow() throws Exception {
-        final SAMRecord rec = createSamRecord();
-        rec.setAttribute(INTEGER_TAG, Integer.MAX_VALUE);
-        writeAndReadSamRecord("bam", rec);
-        rec.getShortAttribute(INTEGER_TAG);
-        Assert.fail("Exception should have been thrown.");
-    }
-
-    /**
-     * Should be an exception if a typed attribute call is made for a value that cannot
-     * be coerced into the correct type.
-     * This test is a little lame because a RuntimeException could be thrown for some other reason.
-     */
-    @Test(expectedExceptions = RuntimeException.class)
-    public void testGetTypedAttributeUnerflow() throws Exception {
-        final SAMRecord rec = createSamRecord();
-        rec.setAttribute(INTEGER_TAG, Integer.MIN_VALUE);
-        writeAndReadSamRecord("bam", rec);
-        rec.getShortAttribute(INTEGER_TAG);
-        Assert.fail("Exception should have been thrown.");
-    }
-
-    /**
-     * Create a SAMRecord with integer tags of various sizes, write to a file, and read it back.
-     *
-     * @param format "sam" or "bam".
-     * @return The record after having being read from file.
-     */
-    private SAMRecord writeAndReadSamRecord(final String format) throws IOException {
-        SAMRecord rec = createSamRecord();
-        rec.setAttribute(BYTE_TAG, (byte) 1);
-        rec.setAttribute(SHORT_TAG, (short) 1);
-        rec.setAttribute(INTEGER_TAG, 1);
-        rec = writeAndReadSamRecord(format, rec);
-        return rec;
-    }
-
-    /**
-     * Write a SAMRecord to a SAM file in the given format, and read it back.
-     *
-     * @param format "sam" or "bam".
-     * @param rec    The record to write.
-     * @return The same record, after having being written and read back.
-     */
-    private SAMRecord writeAndReadSamRecord(final String format, SAMRecord rec) throws IOException {
-        final File bamFile = File.createTempFile("htsjdk-writeAndReadSamRecord.", "." + format);
-        final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(rec.getHeader(), false, bamFile);
-        bamWriter.addAlignment(rec);
-        bamWriter.close();
-        final SamReader reader = SamReaderFactory.makeDefault().open(bamFile);
-        rec = reader.iterator().next();
-        reader.close();
-        bamFile.delete();
-        return rec;
-    }
-
-    private SAMRecord createSamRecord() {
-        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
-        builder.addFrag("readA", 20, 140, false);
-        return builder.iterator().next();
-    }
-
-    private static SamInputResource createSamForIntAttr(long value) {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        PrintStream ps = new PrintStream(baos);
-        ps.println("@HD\tVN:1.0");
-        ps.print("1\t4\t*\t0\t0\t*\t*\t0\t0\tA\t<\tUI:i:");
-        ps.println(value);
-        ps.close();
-
-        return new SamInputResource(new InputStreamInputResource(new ByteArrayInputStream(baos.toByteArray())));
-    }
-
-    @Test
-    public void testGoodSamStrict() throws IOException {
-        final SamReaderFactory factory = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.STRICT);
-
-        Assert.assertEquals(0, ((Number) factory.open(createSamForIntAttr(0)).iterator().next().getAttribute("UI")).intValue());
-        Assert.assertEquals(-1, ((Number) factory.open(createSamForIntAttr(-1)).iterator().next().getAttribute("UI")).intValue());
-        Assert.assertEquals(Integer.MIN_VALUE, ((Number) factory.open(createSamForIntAttr(Integer.MIN_VALUE)).iterator().next().getAttribute("UI")).intValue());
-        Assert.assertEquals(Integer.MAX_VALUE, ((Number) factory.open(createSamForIntAttr(Integer.MAX_VALUE)).iterator().next().getAttribute("UI")).intValue());
-        Assert.assertEquals(1L + (long) Integer.MAX_VALUE, ((Number) factory.open(createSamForIntAttr(1L + (long) Integer.MAX_VALUE)).iterator().next().getAttribute("UI")).longValue());
-        Assert.assertEquals(BinaryCodec.MAX_UINT, ((Number) factory.open(createSamForIntAttr(BinaryCodec.MAX_UINT)).iterator().next().getAttribute("UI")).longValue());
-    }
-
-    @Test(expectedExceptions = SAMException.class)
-    public void testBadSamStrict() throws IOException {
-        final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.STRICT).open(createSamForIntAttr(BinaryCodec.MAX_UINT + 1L));
-        reader.iterator().next();
-    }
-
-    @Test
-    public void testBadSamSilent() throws IOException {
-        final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(createSamForIntAttr(BinaryCodec.MAX_UINT + 1L));
-        reader.iterator().next();
-    }
-
-    @DataProvider(name = "legalIntegerAttributesFiles")
-    public Object[][] getLegalIntegerAttributesFiles() {
-        return new Object[][] {
-                { new File(TEST_DATA_DIR, "variousAttributes.sam") },
-                { new File(TEST_DATA_DIR, "variousAttributes.bam") }
-        };
-    }
-
-    @Test(dataProvider = "legalIntegerAttributesFiles")
-    public void testLegalIntegerAttributesFilesStrict( final File inputFile ) {
-        final SamReader reader = SamReaderFactory.makeDefault()
-                .enable(SamReaderFactory.Option.EAGERLY_DECODE)
-                .validationStringency(ValidationStringency.STRICT)
-                .open(inputFile);
-
-        final SAMRecord rec = reader.iterator().next();
-        final Map<String, Number> expectedTags = new HashMap<String, Number>();
-        expectedTags.put("SB", -128);
-        expectedTags.put("UB", 129);
-        expectedTags.put("SS", 32767);
-        expectedTags.put("US", 65535);
-        expectedTags.put("SI", 2147483647);
-        expectedTags.put("I2", -2147483647);
-        expectedTags.put("UI", 4294967295L);
-        for (final Map.Entry<String, Number> entry : expectedTags.entrySet()) {
-            final Object value = rec.getAttribute(entry.getKey());
-            Assert.assertTrue(((Number) value).longValue() == entry.getValue().longValue());
-        }
-        CloserUtil.close(reader);
-    }
-
-    @DataProvider(name = "valid_set")
-    public static Object[][] valid_set() {
-        List<Object[]> params = new ArrayList<Object[]>();
-        for (FORMAT format:FORMAT.values()) {
-            for (ValidationStringency stringency:ValidationStringency.values()) {
-                params.add(new Object[]{0, format, stringency});
-                params.add(new Object[]{1, format, stringency});
-                params.add(new Object[]{-1, format, stringency});
-                params.add(new Object[]{Integer.MIN_VALUE, format, stringency});
-                params.add(new Object[]{Integer.MAX_VALUE, format, stringency});
-
-                params.add(new Object[]{1L, format, stringency});
-                params.add(new Object[]{-1L, format, stringency});
-                params.add(new Object[]{(long)Integer.MAX_VALUE+1L, format, stringency});
-                params.add(new Object[]{BinaryCodec.MAX_UINT, format, stringency});
-            }
-        }
-
-        return params.toArray(new Object[3][params.size()]);
-    }
-
-    @DataProvider(name = "invalid_set")
-    public static Object[][] invalid_set() {
-        List<Object[]> params = new ArrayList<Object[]>();
-        for (FORMAT format:FORMAT.values()) {
-            for (ValidationStringency stringency:ValidationStringency.values()) {
-                params.add(new Object[]{(long)Integer.MIN_VALUE -1L, format, stringency});
-                params.add(new Object[]{TOO_LARGE_UNSIGNED_INT_VALUE, format, stringency});
-            }
-        }
-
-        return params.toArray(new Object[3][params.size()]);
-    }
-
-    @Test(dataProvider = "valid_set")
-    public void testValidIntegerAttributeRoundtrip(final long value, final FORMAT format, ValidationStringency validationStringency) throws IOException {
-        testRoundtripIntegerAttribute(value, format, validationStringency);
-    }
-
-    @Test(dataProvider = "invalid_set", expectedExceptions = RuntimeException.class)
-    public void testInvalidIntegerAttributeRoundtrip(final long value, final FORMAT format, ValidationStringency validationStringency) throws IOException {
-        testRoundtripIntegerAttribute(value, format, validationStringency);
-    }
-
-    private void testRoundtripIntegerAttribute(final Number value, final FORMAT format, ValidationStringency validationStringency) throws IOException {
-        final SAMFileHeader header = new SAMFileHeader();
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-        final SAMFileWriter w;
-        switch (format) {
-            case SAM:
-                w = new SAMFileWriterFactory().makeSAMWriter(header, false, baos);
-                break;
-            case BAM:
-                w = new SAMFileWriterFactory().makeBAMWriter(header, false, baos);
-                break;
-            case CRAM:
-                w = new SAMFileWriterFactory().makeCRAMWriter(header, baos, null);
-                break;
-            default:
-                throw new RuntimeException("Unknown format: " + format);
-        }
-
-        final SAMRecord record = new SAMRecord(header);
-        record.setAttribute("UI", value);
-        record.setReadName("1");
-        record.setReadUnmappedFlag(true);
-        record.setReadBases("A".getBytes());
-        record.setBaseQualityString("!");
-        Assert.assertEquals(value, record.getAttribute("UI"));
-
-        w.addAlignment(record);
-        w.close();
-
-        final SamReader reader = SamReaderFactory.make().validationStringency(validationStringency).referenceSource(new ReferenceSource((File)null)).
-                open(SamInputResource.of(new ByteArrayInputStream(baos.toByteArray())));
-        final SAMRecordIterator iterator = reader.iterator();
-        Assert.assertTrue(iterator.hasNext());
-        final SAMRecord record2 = iterator.next();
-        final Number returnedValue = (Number) record2.getAttribute("UI");
-        Assert.assertEquals(value.longValue(), returnedValue.longValue());
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMRecordDuplicateComparatorTest.java b/src/test/java/htsjdk/samtools/SAMRecordDuplicateComparatorTest.java
deleted file mode 100644
index cb50925..0000000
--- a/src/test/java/htsjdk/samtools/SAMRecordDuplicateComparatorTest.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * The tests listed here are not exhaustive, and duplicate some of the work found in Picard's MarkDuplicates test classes.
- *
- * @author nhomer
- */
-public class SAMRecordDuplicateComparatorTest {
-    
-    private final static SAMRecordDuplicateComparator comparator = new SAMRecordDuplicateComparator();
-
-    protected final static int DEFAULT_BASE_QUALITY = 10;
-
-    private SAMRecordSetBuilder getSAMRecordSetBuilder() {
-        return  new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
-    }
-    
-    private boolean matchesExpected(final int expected, final int actual) {
-        if (expected < 0) return (actual < 0);
-        else if (0 == expected) return (0 == actual);
-        else return (0 < actual);
-    }
-
-    private void assertEquals(List<Integer> expectedValues, final SAMRecordSetBuilder records, boolean fullCompare) {
-        SAMRecord previous = null, current;
-        
-        Assert.assertEquals(expectedValues.size() + 1, records.size());
-
-        Iterator<SAMRecord> iterator = records.getRecords().iterator();
-        Iterator<Integer> integerIterator = expectedValues.iterator();
-        while (iterator.hasNext()) {
-            current = iterator.next();
-
-            if (null != previous) {
-                if (fullCompare) {
-                    Assert.assertTrue(matchesExpected(integerIterator.next(), comparator.compare(previous, current)));
-                }
-                else {
-                    Assert.assertTrue(matchesExpected(integerIterator.next(), comparator.duplicateSetCompare(previous, current)));
-                }
-            }
-
-            previous = current;
-        }
-    }
-    
-    private void assertEquals(int expected, final SAMRecordSetBuilder records, boolean fullCompare) {
-        assertEquals(Collections.singletonList(expected), records, fullCompare);
-    }
-
-    /***
-     * Tests for comparing duplicate sets only, fragment reads.
-     */
-    @Test
-    public void testFragmentsSamePositive() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-        
-        records.addFrag("READ0", 1, 1, false);
-        records.addFrag("READ1", 1, 1, false);
-
-        assertEquals(0, records, false);
-    }
-
-    @Test
-    public void testFragmentsSameNegative() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addFrag("READ0", 1, 1, true);
-        records.addFrag("READ1", 1, 1, true);
-
-        assertEquals(0, records, false);
-    }
-
-    @Test
-    public void testFragmentsDifferentStrand() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addFrag("READ0", 1, 1, false);
-        records.addFrag("READ1", 1, 1, true);
-
-        assertEquals(-1, records, false);
-    }
-
-    @Test
-    public void testFragmentsDifferentContig() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addFrag("READ0", 1, 1, false);
-        records.addFrag("READ1", 2, 1, false);
-    
-        assertEquals(-1, records, false);
-    }
-
-    @Test
-    public void testFragmentsDifferentStart() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addFrag("READ0", 1, 1, false);
-        records.addFrag("READ1", 1, 2, false);
-
-        assertEquals(-1, records, false);
-    }
-    
-    @Test
-    public void testFragmentsDifferentCigar() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addFrag("READ0", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY);
-        records.addFrag("READ1", 1, 1, false, false, "51M", null, DEFAULT_BASE_QUALITY);
-
-        assertEquals(0, records, false);
-    }
-
-    @Test
-    public void testFragmentsOneUnmapped() {
-
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addFrag("READ0", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY);
-        records.addFrag("READ1", 1, 1, false, true, null, null, DEFAULT_BASE_QUALITY);
-
-        assertEquals(-1, records, false);
-    }
-
-    @Test
-    public void testFragmentsOppositeStrandsLessThan() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addFrag("READ1", 1, 100, false, false, "50M", null, DEFAULT_BASE_QUALITY);
-        records.addFrag("READ0", 1, 51, true, false, "50M", null, DEFAULT_BASE_QUALITY);
-
-        assertEquals(-1, records, false);
-    }
-
-    @Test
-    public void testFragmentsOppositeStrandsGreaterThan() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addFrag("READ0", 1, 50, true, false, "50M", null, DEFAULT_BASE_QUALITY);
-        records.addFrag("READ1", 1, 101, false, false, "50M", null, DEFAULT_BASE_QUALITY);
-        
-        assertEquals(-1, records, false);
-    }
-
-    @Test
-    public void testFragmentsWithSoftClipping() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addFrag("READ0", 1, 55, false, false, "5S50M", null, DEFAULT_BASE_QUALITY);
-        records.addFrag("READ1", 1, 60, false, false, "10S50M", null, DEFAULT_BASE_QUALITY);
-        
-        assertEquals(0, records, false);
-    }
-
-    @Test
-    public void testFragmentsReverseStrandWithSoftClipping() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addFrag("READ0", 1, 55, true, false, "50M10S", null, DEFAULT_BASE_QUALITY);
-        records.addFrag("READ1", 1, 60, true, false, "50M5S", null, DEFAULT_BASE_QUALITY);
-        
-        assertEquals(0, records, false);
-    }
-
-    /*
-    @Test
-    public void testPairedSamePositions() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addPair("READ0", 1, 55, 55);
-        records.addPair("READ1", 1, 55, 55);
-
-        assertEquals(0, records, false);
-    }
-    */
-
-    @Test
-    public void testPairedFirstEndDifferent() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addPair("READ0", 1, 55, 55);
-        records.addPair("READ1", 2, 55, 55);
-
-        assertEquals(Arrays.asList(-1,-1,-1), records, false);
-    }
-
-    @Test(expectedExceptions=IllegalArgumentException.class)
-    public void testNullHeaders() {
-        final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
-        records.addPair("READ0", 1, 55, 55);
-        records.addPair("READ1", 2, 55, 55);
-        Collection<SAMRecord> recs = records.getRecords();
-        for (SAMRecord rec : recs) {
-            rec.setHeader(null);
-        }
-
-        assertEquals(Arrays.asList(-1, -1, -1), records, false);
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java b/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java
deleted file mode 100644
index 951ecee..0000000
--- a/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java
+++ /dev/null
@@ -1,1041 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.TestUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.*;
-import java.util.Arrays;
-import java.util.List;
-
-public class SAMRecordUnitTest {
-
-    @DataProvider(name = "serializationTestData")
-    public Object[][] getSerializationTestData() {
-        return new Object[][] {
-                { new File("src/test/resources/htsjdk/samtools/serialization_test.sam") },
-                { new File("src/test/resources/htsjdk/samtools/serialization_test.bam") }
-        };
-    }
-
-    @Test(dataProvider = "serializationTestData")
-    public void testSAMRecordSerialization( final File inputFile ) throws Exception {
-        final SamReader reader = SamReaderFactory.makeDefault().open(inputFile);
-        final SAMRecord initialSAMRecord = reader.iterator().next();
-        reader.close();
-
-        final SAMRecord deserializedSAMRecord = TestUtil.serializeAndDeserialize(initialSAMRecord);
-
-        Assert.assertEquals(deserializedSAMRecord, initialSAMRecord, "Deserialized SAMRecord not equal to original SAMRecord");
-    }
-
-    @DataProvider
-    public Object [][] offsetAtReferenceData() {
-        return new Object[][]{
-                {"3S9M",   7, 10, false},
-                {"3S9M",   0,  0, false},
-                {"3S9M",  -1,  0, false},
-                {"3S9M",  13,  0, false},
-                {"4M1D6M", 4,  4, false},
-                {"4M1D6M", 4,  4, true},
-                {"4M1D6M", 5,  0, false},
-                {"4M1D6M", 5,  4, true},
-                {"4M1I6M", 5,  6, false},
-                {"4M1I6M", 11, 0, false},
-        };
-    }
-
-    @Test(dataProvider = "offsetAtReferenceData")
-    public void testOffsetAtReference(String cigar, int posInReference, int expectedPosInRead, boolean returnLastBaseIfDeleted) {
-
-            SAMRecord sam = new SAMRecordSetBuilder().addFrag("test", 0, 1, false, false, cigar, null, 2);
-            Assert.assertEquals(SAMRecord.getReadPositionAtReferencePosition(sam, posInReference, returnLastBaseIfDeleted), expectedPosInRead);
-    }
-
-    @DataProvider
-    public Object [][] referenceAtReadData() {
-        return new Object[][]{
-                {"3S9M", 7, 10},
-                {"3S9M", 0, 0},
-                {"3S9M", 0, 13},
-                {"4M1D6M", 4, 4},
-                {"4M1D6M", 6, 5},
-                {"4M1I6M", 0, 5},
-                {"4M1I6M", 5, 6},
-        };
-    }
-
-    @Test(dataProvider = "referenceAtReadData")
-    public void testOffsetAtRead(String cigar, int expectedReferencePos, int posInRead) {
-
-            SAMRecord sam = new SAMRecordSetBuilder().addFrag("test", 0, 1, false, false, cigar, null, 2);
-            Assert.assertEquals(sam.getReferencePositionAtReadPosition(posInRead), expectedReferencePos);
-    }
-
-    @DataProvider(name = "deepCopyTestData")
-    public Object [][] deepCopyTestData() {
-        return new Object[][]{
-                { new SAMRecordSetBuilder().addFrag("test", 0, 1, false, false, "3S9M", null, 2) },
-                { new SAMRecordSetBuilder().addFrag("test", 0, 1, false, false, "4M1I6M", null, 2) }
-        };
-    }
-
-    @Test(dataProvider = "deepCopyTestData")
-    public void testDeepCopyBasic(final SAMRecord sam) {
-        testDeepCopy(sam);
-    }
-
-    @Test(dataProvider = "deepCopyTestData")
-    public void testDeepCopyCigar(SAMRecord sam) {
-        sam.setCigar(sam.getCigar());
-        final SAMRecord deepCopy = sam.deepCopy();
-        Assert.assertTrue(sam.equals(deepCopy));
-    }
-
-    @Test(dataProvider = "deepCopyTestData")
-    public void testDeepCopyGetCigarString(SAMRecord sam) {
-        sam.setCigarString(sam.getCigarString());
-        final SAMRecord deepCopy = sam.deepCopy();
-        Assert.assertTrue(sam.equals(deepCopy));
-    }
-
-    @Test(dataProvider = "deepCopyTestData")
-    public void testDeepCopyGetCigar(final SAMRecord sam)
-    {
-        testDeepCopy(sam);
-        sam.setCigarString(sam.getCigarString());
-        sam.getCigar(); // force cigar elements to be resolved for equals
-        testDeepCopy(sam);
-    }
-
-    @Test(dataProvider = "deepCopyTestData")
-    public void testDeepCopyMutate(final SAMRecord sam) {
-        final byte[] initialBaseQualityCopy = Arrays.copyOf(sam.getBaseQualities(), sam.getBaseQualities().length);
-        final int initialStart = sam.getAlignmentStart();
-
-        final SAMRecord deepCopy = testDeepCopy(sam);
-        Assert.assertTrue(Arrays.equals(sam.getBaseQualities(), deepCopy.getBaseQualities()));
-        Assert.assertTrue(sam.getAlignmentStart() == deepCopy.getAlignmentStart());
-
-        // mutate copy and make sure original remains unchanged
-        final byte[] copyBaseQuals = deepCopy.getBaseQualities();
-        for (int i = 0; i < copyBaseQuals.length; i++) {
-            copyBaseQuals[i]++;
-        }
-        deepCopy.setBaseQualities(copyBaseQuals);
-        deepCopy.setAlignmentStart(initialStart + 1);
-        Assert.assertTrue(Arrays.equals(sam.getBaseQualities(), initialBaseQualityCopy));
-        Assert.assertTrue(sam.getAlignmentStart() == initialStart);
-    }
-
-    @Test(dataProvider = "deepCopyTestData")
-    public void testDeepByteAttributes( final SAMRecord sam ) throws Exception {
-        SAMRecord deepCopy = testDeepCopy(sam);
-
-        final byte bytes[] = { -2, -1, 0, 1, 2 };
-        sam.setAttribute("BY", bytes);
-        deepCopy = sam.deepCopy();
-        Assert.assertEquals(sam, deepCopy);
-
-        // validate reference inequality and content equality
-        final byte samBytes[] = sam.getByteArrayAttribute("BY");
-        final byte copyBytes[] = deepCopy.getByteArrayAttribute("BY");
-        Assert.assertFalse(copyBytes == samBytes);
-        Assert.assertTrue(Arrays.equals(copyBytes, samBytes));
-
-        // validate mutation independence
-        final byte testByte = -1;
-        Assert.assertTrue(samBytes[2] != testByte);  // ensure initial test condition
-        Assert.assertTrue(copyBytes[2] != testByte); // ensure initial test condition
-        samBytes[2] = testByte;                      // mutate original
-        Assert.assertTrue(samBytes[2] == testByte);
-        Assert.assertTrue(copyBytes[2] != testByte);
-        sam.setAttribute("BY", samBytes);
-        Assert.assertTrue(sam.getByteArrayAttribute("BY")[2] != deepCopy.getByteArrayAttribute("BY")[2]);
-
-        // now unsigned...
-        sam.setUnsignedArrayAttribute("BY", bytes);
-        deepCopy = sam.deepCopy();
-        Assert.assertEquals(sam, deepCopy);
-        final byte samUBytes[] = sam.getUnsignedByteArrayAttribute("BY");
-        final byte copyUBytes[] = deepCopy.getUnsignedByteArrayAttribute("BY");
-        Assert.assertFalse(copyUBytes == bytes);
-        Assert.assertTrue(Arrays.equals(copyUBytes, samUBytes));
-
-        // validate mutation independence
-        final byte uByte = 1;
-        Assert.assertTrue(samUBytes[2] != uByte); //  ensure initial test condition
-        Assert.assertTrue(samUBytes[2] != uByte); //  ensure initial test condition
-        samUBytes[2] = uByte;  // mutate original
-        Assert.assertTrue(samUBytes[2] == uByte);
-        Assert.assertTrue(copyUBytes[2] != uByte);
-        sam.setUnsignedArrayAttribute("BY", samBytes);
-        Assert.assertTrue(sam.getUnsignedByteArrayAttribute("BY")[2] != deepCopy.getUnsignedByteArrayAttribute("BY")[2]);
-    }
-
-    @Test(dataProvider = "deepCopyTestData")
-    public void testDeepShortAttributes( final SAMRecord sam ) throws Exception {
-        SAMRecord deepCopy = testDeepCopy(sam);
-
-        final short shorts[] = { -20, -10, 0, 10, 20 };
-        sam.setAttribute("SH", shorts);
-        deepCopy = sam.deepCopy();
-        Assert.assertEquals(sam, deepCopy);
-
-        // validate reference inequality, content equality
-        final short samShorts[] = sam.getSignedShortArrayAttribute("SH");
-        final short copyShorts[] = deepCopy.getSignedShortArrayAttribute("SH");
-        Assert.assertFalse(copyShorts == samShorts);
-        Assert.assertTrue(Arrays.equals(copyShorts, samShorts));
-
-        // validate mutation independence
-        final short testShort = -1;
-        Assert.assertTrue(samShorts[2] != testShort); //  ensure initial test condition
-        Assert.assertTrue(samShorts[2] != testShort); //  ensure initial test condition
-        samShorts[2] = testShort;  // mutate original
-        Assert.assertTrue(samShorts[2] == testShort);
-        Assert.assertTrue(copyShorts[2] != testShort);
-        sam.setAttribute("SH", samShorts);
-        Assert.assertTrue(sam.getSignedShortArrayAttribute("SH")[2] != deepCopy.getSignedShortArrayAttribute("SH")[2]);
-
-        // now unsigned...
-        sam.setUnsignedArrayAttribute("SH", shorts);
-        deepCopy = sam.deepCopy();
-        Assert.assertEquals(sam, deepCopy);
-
-        final short samUShorts[] = sam.getUnsignedShortArrayAttribute("SH");
-        final short copyUShorts[] = deepCopy.getUnsignedShortArrayAttribute("SH");
-        Assert.assertFalse(copyUShorts == shorts);
-        Assert.assertTrue(Arrays.equals(copyUShorts, samUShorts));
-
-        // validate mutation independence
-        final byte uShort = 1;
-        Assert.assertTrue(samUShorts[2] != uShort); //  ensure initial test condition
-        Assert.assertTrue(samUShorts[2] != uShort); //  ensure initial test condition
-        samUShorts[2] = uShort;  // mutate original
-        Assert.assertTrue(samUShorts[2] == uShort);
-        Assert.assertTrue(copyUShorts[2] != uShort);
-        sam.setUnsignedArrayAttribute("SH", samShorts);
-        Assert.assertTrue(sam.getUnsignedShortArrayAttribute("SH")[2] != deepCopy.getUnsignedShortArrayAttribute("SH")[2]);
-    }
-
-    @Test(dataProvider = "deepCopyTestData")
-    public void testDeepIntAttributes( final SAMRecord sam ) throws Exception {
-        SAMRecord deepCopy = testDeepCopy(sam);
-
-        final int ints[] = { -200, -100, 0, 100, 200 };
-        sam.setAttribute("IN", ints);
-        deepCopy = sam.deepCopy();
-        Assert.assertEquals(sam, deepCopy);
-
-        // validate reference inequality and content equality
-        final  int samInts[] = sam.getSignedIntArrayAttribute("IN");
-        final  int copyInts[] = deepCopy.getSignedIntArrayAttribute("IN");
-        Assert.assertFalse(copyInts == ints);
-        Assert.assertTrue(Arrays.equals(copyInts, samInts));
-
-        // validate mutation independence
-        final short testInt = -1;
-        Assert.assertTrue(samInts[2] != testInt); //  ensure initial test condition
-        Assert.assertTrue(samInts[2] != testInt); //  ensure initial test condition
-        samInts[2] = testInt;  // mutate original
-        Assert.assertTrue(samInts[2] == testInt);
-        Assert.assertTrue(copyInts[2] != testInt);
-        sam.setAttribute("IN", samInts);
-        Assert.assertTrue(sam.getSignedIntArrayAttribute("IN")[2] != deepCopy.getSignedIntArrayAttribute("IN")[2]);
-
-        // now unsigned...
-        sam.setUnsignedArrayAttribute("IN", ints);
-        deepCopy = sam.deepCopy();
-        Assert.assertEquals(sam, deepCopy);
-
-        final int samUInts[] = sam.getUnsignedIntArrayAttribute("IN");
-        final int copyUInts[] = deepCopy.getUnsignedIntArrayAttribute("IN");
-        Assert.assertFalse(copyUInts == ints);
-        Assert.assertTrue(Arrays.equals(copyUInts, samUInts));
-
-        // validate mutation independence
-        byte uInt = 1;
-        Assert.assertTrue(samUInts[2] != uInt); //  ensure initial test condition
-        Assert.assertTrue(samUInts[2] != uInt); //  ensure initial test condition
-        samInts[2] = uInt;  // mutate original
-        Assert.assertTrue(samUInts[2] == uInt);
-        Assert.assertTrue(copyUInts[2] != uInt);
-        sam.setUnsignedArrayAttribute("IN", samInts);
-        Assert.assertTrue(sam.getUnsignedIntArrayAttribute("IN")[2] != deepCopy.getUnsignedIntArrayAttribute("IN")[2]);
-    }
-
-    @Test(dataProvider = "deepCopyTestData")
-    public void testDeepFloatAttributes( final SAMRecord sam ) throws Exception {
-        SAMRecord deepCopy = testDeepCopy(sam);
-
-        final float floats[] = { -2.4f, -1.2f, 0, 2.3f, 4.6f };
-        sam.setAttribute("FL", floats);
-        deepCopy = sam.deepCopy();
-        Assert.assertEquals(sam, deepCopy);
-
-        // validate reference inequality and content equality
-        final float samFloats[] = sam.getFloatArrayAttribute("FL");
-        final float copyFloats[] = deepCopy.getFloatArrayAttribute("FL");
-        Assert.assertFalse(copyFloats == floats);
-        Assert.assertFalse(copyFloats == samFloats);
-        Assert.assertTrue(Arrays.equals(copyFloats, samFloats));
-
-        // validate mutation independence
-        final float testFloat = -1.0f;
-        Assert.assertTrue(samFloats[2] != testFloat); //  ensure initial test condition
-        Assert.assertTrue(samFloats[2] != testFloat); //  ensure initial test condition
-        samFloats[2] = testFloat;  // mutate original
-        Assert.assertTrue(samFloats[2] == testFloat);
-        Assert.assertTrue(copyFloats[2] != testFloat);
-        sam.setAttribute("FL", samFloats);
-        Assert.assertTrue(sam.getFloatArrayAttribute("FL")[2] != deepCopy.getFloatArrayAttribute("FL")[2]);
-    }
-
-    private SAMRecord testDeepCopy(SAMRecord sam) {
-        final SAMRecord deepCopy = sam.deepCopy();
-        Assert.assertTrue(sam.equals(deepCopy));
-        return deepCopy;
-    }
-
-    @Test
-    public void test_getUnsignedIntegerAttribute_valid() {
-        final String stringTag = "UI";
-        final short binaryTag = SAMTagUtil.getSingleton().makeBinaryTag(stringTag);
-        SAMFileHeader header = new SAMFileHeader();
-        SAMRecord record = new SAMRecord(header);
-        Assert.assertNull(record.getUnsignedIntegerAttribute(stringTag));
-        Assert.assertNull(record.getUnsignedIntegerAttribute(binaryTag));
-
-        record.setAttribute("UI", (long) 0L);
-        Assert.assertEquals(new Long(0L), record.getUnsignedIntegerAttribute(stringTag));
-        Assert.assertEquals(new Long(0L), record.getUnsignedIntegerAttribute(binaryTag));
-
-        record.setAttribute("UI", BinaryCodec.MAX_UINT);
-        Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute(stringTag));
-        Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute(binaryTag));
-
-        final SAMBinaryTagAndValue tv_zero = new SAMBinaryTagAndValue(binaryTag, 0L);
-        record = new SAMRecord(header){
-            {
-                setAttributes(tv_zero);
-            }
-        };
-        Assert.assertEquals(new Long(0L), record.getUnsignedIntegerAttribute(stringTag));
-        Assert.assertEquals(new Long(0L), record.getUnsignedIntegerAttribute(binaryTag));
-
-        final SAMBinaryTagAndValue tv_max = new SAMBinaryTagAndValue(binaryTag, BinaryCodec.MAX_UINT);
-        record = new SAMRecord(header){
-            {
-                setAttributes(tv_max);
-            }
-        };
-        Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute(stringTag));
-        Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute(binaryTag));
-    }
-
-    /**
-     * This is an alternative to test_getUnsignedIntegerAttribute_valid().
-     * This is required for testing invalid (out of range) unsigned integer value.
-     */
-    @Test
-    public void test_getUnsignedIntegerAttribute_valid_alternative() {
-        final short tag = SAMTagUtil.getSingleton().makeBinaryTag("UI");
-        SAMFileHeader header = new SAMFileHeader();
-        SAMRecord record;
-
-        record = new SAMRecord(header);
-        record.setAttribute("UI", 0L);
-        Assert.assertEquals(new Long(0L), record.getUnsignedIntegerAttribute(tag));
-
-        record = new SAMRecord(header);
-        record.setAttribute("UI", BinaryCodec.MAX_UINT);
-        Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute("UI"));
-    }
-
-    @Test(expectedExceptions = SAMException.class)
-    public void test_getUnsignedIntegerAttribute_negative() {
-        SAMFileHeader header = new SAMFileHeader();
-        SAMRecord record = new SAMRecord(header);
-        record.setAttribute("UI", -1L);
-        record.getUnsignedIntegerAttribute("UI");
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test_setUnsignedIntegerAttributeTooLarge() {
-        SAMFileHeader header = new SAMFileHeader();
-        SAMRecord record = new SAMRecord(header);
-        record.setAttribute("UI", BinaryCodec.MAX_UINT + 1);
-    }
-
-    // NOTE: SAMRecord.asAllowedAttribute is deprecated, as it has been moved into
-    // SAMBinaryTagAndValue, but we'll leave this test here until the code is removed.
-    @Test
-    public void test_isAllowedAttributeDataType() {
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Byte((byte) 0)));
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Short((short) 0)));
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Integer(0)));
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue("a string"));
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Character('C')));
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Float(0.1F)));
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new byte[]{0}));
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new short[]{0}));
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new int[]{0}));
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new float[]{0.1F}));
-
-        // unsigned integers:
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Long(0)));
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Long(BinaryCodec.MAX_UINT)));
-        Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Long(-1L)));
-        Assert.assertFalse(SAMRecord.isAllowedAttributeValue(new Long(BinaryCodec.MAX_UINT + 1L)));
-        Assert.assertFalse(SAMRecord.isAllowedAttributeValue(new Long(Integer.MIN_VALUE - 1L)));
-    }
-
-    @Test()
-    public void test_setAttribute_empty_string() {
-        final SAMFileHeader header = new SAMFileHeader();
-        final SAMRecord record = new SAMRecord(header);
-        Assert.assertNull(record.getStringAttribute(SAMTag.MD.name()));
-        record.setAttribute(SAMTag.MD.name(), "");
-        Assert.assertNotNull(record.getStringAttribute(SAMTag.MD.name()));
-        Assert.assertEquals(record.getStringAttribute(SAMTag.MD.name()),"");
-        record.setAttribute(SAMTag.MD.name(), null);
-        Assert.assertNull(record.getStringAttribute(SAMTag.MD.name()));
-    }
-
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test_setAttribute_unsigned_int_negative() {
-        SAMFileHeader header = new SAMFileHeader();
-        SAMRecord record = null;
-        record = new SAMRecord(header);
-        Assert.assertNull(record.getUnsignedIntegerAttribute("UI"));
-        record.setAttribute("UI", (long) Integer.MIN_VALUE - 1L);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test_setAttribute_unsigned_int_tooLarge() {
-        SAMFileHeader header = new SAMFileHeader();
-        SAMRecord record = new SAMRecord(header);
-        Assert.assertNull(record.getUnsignedIntegerAttribute("UI"));
-        record.setAttribute("UI", (long) BinaryCodec.MAX_UINT + 1L);
-    }
-
-    @Test
-    public void test_setAttribute_null_removes_tag() {
-        final short tag = SAMTagUtil.getSingleton().makeBinaryTag("UI");
-        SAMFileHeader header = new SAMFileHeader();
-        SAMRecord record = new SAMRecord(header);
-        Assert.assertNull(record.getUnsignedIntegerAttribute(tag));
-
-        record.setAttribute(tag, BinaryCodec.MAX_UINT);
-        Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute(tag));
-
-        record.setAttribute(tag, null);
-        Assert.assertNull(record.getUnsignedIntegerAttribute(tag));
-    }
-
-    private SAMRecord createTestRecordHelper() {
-        return new SAMRecordSetBuilder().addFrag("test", 0, 1, false, false, "3S9M", null, 2);
-    }
-
-    @Test
-    public void testReferenceName() {
-        SAMRecord sam = createTestRecordHelper();
-
-        // NO_ALIGNMENT_NAME
-        sam.setReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME);
-        Assert.assertTrue(sam.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-        Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-
-        // valid reference name
-        sam = createTestRecordHelper();
-        sam.setReferenceName("chr4");
-        Assert.assertTrue(sam.getReferenceName().equals("chr4"));
-        Assert.assertTrue(sam.getReferenceIndex().equals(3));
-
-        // invalid reference name sets name but leaves ref index invalid
-        sam = createTestRecordHelper();
-        sam.setReferenceName("unresolvableName");
-        Assert.assertTrue(sam.getReferenceName().equals("unresolvableName"));
-        Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-    }
-
-    @Test
-    public void testReferenceIndex() {
-        // NO_ALIGNMENT_REFERENCE
-        SAMRecord sam = createTestRecordHelper();
-        sam.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-        Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-        Assert.assertTrue(sam.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-
-        // valid reference
-        sam = createTestRecordHelper();
-        sam.setReferenceIndex(3);
-        Assert.assertTrue(sam.getReferenceIndex().equals(3));
-        Assert.assertTrue(sam.getReferenceName().equals("chr4"));
-    }
-
-    @Test(expectedExceptions=IllegalArgumentException.class)
-    public void testInvalidReferenceIndex() {
-        // unresolvable reference
-        final SAMRecord sam = createTestRecordHelper();
-        sam.setReferenceIndex(9999);
-    }
-
-    @Test
-    public void testMateReferenceName() {
-        // NO_ALIGNMENT_NAME
-        SAMRecord sam = createTestRecordHelper();
-        sam.setMateReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME);
-        Assert.assertTrue(sam.getMateReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-        Assert.assertTrue(sam.getMateReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-
-        // valid reference
-        sam = createTestRecordHelper();
-        sam.setMateReferenceName("chr4");
-        Assert.assertTrue(sam.getMateReferenceName().equals("chr4"));
-        Assert.assertTrue(sam.getMateReferenceIndex().equals(3));
-
-        // unresolvable reference
-        sam = createTestRecordHelper();
-        sam.setMateReferenceName("unresolvableName");
-        Assert.assertTrue(sam.getMateReferenceName().equals("unresolvableName"));
-        Assert.assertTrue(sam.getMateReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-    }
-
-    @Test
-    public void testMateReferenceIndex() {
-        // NO_ALIGNMENT_REFERENCE
-        SAMRecord sam = createTestRecordHelper();
-        sam.setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-        Assert.assertTrue(sam.getMateReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-        Assert.assertTrue(sam.getMateReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-
-        // valid reference
-        sam = createTestRecordHelper();
-        sam.setMateReferenceIndex(3);
-        Assert.assertTrue(sam.getMateReferenceIndex().equals(3));
-        Assert.assertTrue(sam.getMateReferenceName().equals("chr4"));
-    }
-
-    @Test(expectedExceptions=IllegalArgumentException.class)
-    public void testInvalidMateReferenceIndex() {
-        // unresolvable reference
-        final SAMRecord sam = createTestRecordHelper();
-        sam.setMateReferenceIndex(9999);
-    }
-
-    @Test
-    public void testRecordValidation() {
-        final SAMRecord sam = createTestRecordHelper();
-        List<SAMValidationError> validationErrors = sam.isValid(false);
-        Assert.assertTrue(validationErrors == null);
-    }
-
-    @Test
-    public void testInvalidAlignmentStartValidation() {
-        final SAMRecord sam = createTestRecordHelper();
-        sam.setAlignmentStart(0);
-        List<SAMValidationError> validationErrors = sam.isValid(false);
-        Assert.assertTrue(validationErrors != null && validationErrors.size() == 1);
-    }
-
-    // ----------------- NULL header tests ---------------------
-
-    @Test
-    public void testNullHeaderReferenceName() {
-        final SAMRecord sam = createTestRecordHelper();
-        final SAMFileHeader samHeader = sam.getHeader();
-        Assert.assertTrue(null != samHeader);
-        final String originalRefName = sam.getReferenceName();
-
-        // setting header to null retains the previously assigned ref name
-        sam.setHeader(null);
-        Assert.assertTrue(originalRefName.equals(sam.getReferenceName()));
-
-        // null header allows reference name to be set to NO_ALIGNMENT_REFERENCE_NAME
-        sam.setReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME);
-        Assert.assertTrue(sam.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-        Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-
-        // null header allows reference name to be reset to a valid namw
-        sam.setReferenceName(originalRefName);
-        Assert.assertTrue(sam.getReferenceName().equals(originalRefName));
-    }
-
-    @Test
-    public void testNullHeaderReferenceIndex() {
-        SAMRecord sam = createTestRecordHelper();
-        final SAMFileHeader samHeader = sam.getHeader();
-        int originalRefIndex = sam.getReferenceIndex();
-        Assert.assertTrue(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX != originalRefIndex);
-
-        // setting header to null resets the reference index to null
-        sam.setHeader(null);
-        Assert.assertTrue(null == sam.mReferenceIndex);
-        // restoring the header to restores the reference index back to the original
-        sam.setHeader(samHeader);
-        Assert.assertTrue(sam.getReferenceIndex().equals(originalRefIndex));
-
-        // setting the header to null allows setting the reference index to NO_ALIGNMENT_REFERENCE_INDEX
-        sam.setHeader(null);
-        sam.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-        Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-        Assert.assertTrue(sam.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-
-        // force the internal SAMRecord reference index value to (null) initial state
-        sam = new SAMRecord(null);
-        Assert.assertTrue(null == sam.mReferenceIndex);
-        Assert.assertTrue(sam.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-
-        // an unresolvable reference name doesn't throw
-        final String unresolvableRefName = "unresolvable";
-        sam.setReferenceName(unresolvableRefName);
-        // now force the SAMRecord to try to resolve the unresolvable name
-        sam.setHeader(samHeader);
-        Assert.assertTrue(null == sam.mReferenceIndex);
-        Assert.assertTrue(sam.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-    }
-
-    @Test(expectedExceptions=IllegalStateException.class)
-    public void testNullHeaderSetReferenceIndex() {
-        final SAMRecord sam = createTestRecordHelper();
-        sam.setHeader(null);
-        // setReferenceIndex with null header throws
-        sam.setReferenceIndex(3);
-    }
-
-    @Test(expectedExceptions=IllegalStateException.class)
-    public void testNullHeaderGetReferenceIndex() {
-        final SAMRecord sam = createTestRecordHelper();
-        sam.setHeader(null);
-        // getReferenceIndex with null header throws
-        sam.getReferenceIndex();
-    }
-
-    @Test(expectedExceptions=IllegalStateException.class)
-    public void testNullHeaderForceIndexResolutionFailure() {
-        // force the internal SAMRecord reference index value to null initial state
-        final SAMRecord sam = new SAMRecord(null);
-        sam.setReferenceName("unresolvable");
-        sam.getReferenceIndex();
-    }
-
-    @Test
-    public void testNullHeaderMateReferenceName() {
-        final SAMRecord sam = createTestRecordHelper();
-        final SAMFileHeader samHeader = sam.getHeader();
-        Assert.assertTrue(null != samHeader);
-        final String originalMateRefName = sam.getMateReferenceName();
-
-        // setting header to null retains the previously assigned mate ref name
-        sam.setHeader(null);
-        Assert.assertTrue(originalMateRefName.equals(sam.getMateReferenceName()));
-
-        // null header allows mate reference name to be set to NO_ALIGNMENT_REFERENCE_NAME
-        sam.setMateReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME);
-        Assert.assertTrue(sam.getMateReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-        Assert.assertTrue(sam.getMateReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-
-        // null header allows reference name to be reset to a valid namw
-        sam.setMateReferenceName(originalMateRefName);
-        Assert.assertTrue(sam.getMateReferenceName().equals(originalMateRefName));
-    }
-
-    @Test
-    public void testNullHeaderMateReferenceIndex() {
-        SAMRecord sam = createTestRecordHelper();
-        final SAMFileHeader samHeader = sam.getHeader();
-        sam.setMateReferenceName("chr1");
-        int originalMateRefIndex = sam.getMateReferenceIndex();
-        Assert.assertTrue(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX != originalMateRefIndex);
-
-        // setting header to null resets the mate reference index to null
-        sam.setHeader(null);
-        Assert.assertTrue(null == sam.mMateReferenceIndex);
-        // restoring the header to restores the reference index back to the original
-        sam.setHeader(samHeader);
-        Assert.assertTrue(sam.getMateReferenceIndex().equals(originalMateRefIndex));
-
-        // setting the header to null allows setting the mate reference index to NO_ALIGNMENT_REFERENCE_INDEX
-        sam.setHeader(null);
-        sam.setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-        Assert.assertTrue(sam.getMateReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-        Assert.assertTrue(sam.getMateReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-
-        // force the internal SAMRecord mate reference index value to (null) initial state
-        sam = new SAMRecord(null);
-        Assert.assertTrue(null == sam.mMateReferenceIndex);
-        Assert.assertTrue(sam.getMateReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-
-        // an unresolvable mate reference name doesn't throw
-        final String unresolvableRefName = "unresolvable";
-        sam.setMateReferenceName(unresolvableRefName);
-        // now force the SAMRecord to try to resolve the unresolvable mate reference name
-        sam.setHeader(samHeader);
-        Assert.assertTrue(null == sam.mMateReferenceIndex);
-        Assert.assertTrue(sam.getMateReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-    }
-
-    @Test(expectedExceptions=IllegalStateException.class)
-    public void testNullHeaderSetMateReferenceIndex() {
-        final SAMRecord sam = createTestRecordHelper();
-        sam.setHeader(null);
-        sam.setMateReferenceIndex(3);
-    }
-
-    @Test(expectedExceptions=IllegalStateException.class)
-    public void testNullHeaderGetMateReferenceIndex() {
-        final SAMRecord sam = createTestRecordHelper();
-        sam.setMateReferenceName("chr1");
-        sam.setHeader(null);
-        // getMateReferenceIndex with null header throws
-        sam.getMateReferenceIndex();
-    }
-
-    @Test(expectedExceptions=IllegalStateException.class)
-    public void testNullHeaderForceMateIndexResolutionFailure() {
-        // force the internal SAMRecord reference index value to null initial state
-        final SAMRecord sam = new SAMRecord(null);
-        sam.setMateReferenceName("unresolvable");
-        sam.getMateReferenceIndex();
-    }
-
-    @Test
-    public void testNullHeaderGetReadGroup() {
-        final SAMRecord sam = createTestRecordHelper();
-        Assert.assertTrue(null != sam.getHeader());
-
-        Assert.assertTrue(null != sam.getReadGroup() && sam.getReadGroup().getId().equals("1"));
-        sam.setHeader(null);
-        Assert.assertNull(sam.getReadGroup());
-    }
-
-    @Test(dataProvider = "serializationTestData")
-    public void testNullHeaderSerialization(final File inputFile) throws Exception {
-        final SamReader reader = SamReaderFactory.makeDefault().open(inputFile);
-        final SAMRecord initialSAMRecord = reader.iterator().next();
-        reader.close();
-
-        initialSAMRecord.setHeader(null);
-        final SAMRecord deserializedSAMRecord = TestUtil.serializeAndDeserialize(initialSAMRecord);
-        Assert.assertEquals(deserializedSAMRecord, initialSAMRecord, "Deserialized SAMRecord not equal to original SAMRecord");
-    }
-
-
-    @Test
-    public void testValidateNonsenseCigar(){
-        // Create nonsense record
-        SAMRecord rec = createTestRecordHelper();
-        rec.setCigarString("nonsense");
-
-        //The default validationStringency of a sam record is SILENT.
-        rec.setValidationStringency(ValidationStringency.STRICT);
-        // Validate record
-        List<SAMValidationError> err = rec.validateCigar(-1);
-
-        Assert.assertNotNull(err);
-        Assert.assertEquals(err.size(), 1);
-        Assert.assertEquals(err.get(0).getType(), SAMValidationError.Type.INVALID_CIGAR);
-    }
-
-    @Test
-    public void testNullHeaderRecordValidation() {
-        final SAMRecord sam = createTestRecordHelper();
-        sam.setHeader(null);
-        List<SAMValidationError> validationErrors = sam.isValid(false);
-        Assert.assertTrue(validationErrors == null);
-    }
-
-    @Test
-    private void testNullHeaderDeepCopy() {
-        SAMRecord sam = createTestRecordHelper();
-        sam.setHeader(null);
-        final SAMRecord deepCopy = sam.deepCopy();
-
-        Assert.assertTrue(sam.equals(deepCopy));
-    }
-
-    private void testNullHeaderCigar(SAMRecord rec) {
-        Cigar origCigar = rec.getCigar();
-        Assert.assertNotNull(origCigar);
-        String originalCigarString = rec.getCigarString();
-
-        // set the cigar to null and then reset the cigar string in order to force getCigar to decode it
-        rec.setCigar(null);
-        Assert.assertNull(rec.getCigar());
-        rec.setCigarString(originalCigarString);
-        rec.setValidationStringency(ValidationStringency.STRICT);
-        rec.setHeader(null);
-        Assert.assertTrue(rec.getValidationStringency() == ValidationStringency.STRICT);
-
-        // force getCigar to decode the cigar string, validate that SAMRecord doesn't try to validate the cigar
-        Cigar cig = rec.getCigar();
-        Assert.assertNotNull(cig);
-        String cigString = TextCigarCodec.encode(cig);
-        Assert.assertEquals(cigString, originalCigarString);
-    }
-
-    @Test
-    private void testNullHeadGetCigarSAM() {
-        SAMRecord sam = createTestRecordHelper();
-        testNullHeaderCigar(sam);
-    }
-
-    @Test
-    private void testNullHeadGetCigarBAM() {
-        SAMRecord sam = createTestRecordHelper();
-        SAMRecordFactory factory = new DefaultSAMRecordFactory();
-        BAMRecord bamRec = factory.createBAMRecord(
-                sam.getHeader(),
-                sam.getReferenceIndex(),
-                sam.getAlignmentStart(),
-                (short) sam.getReadNameLength(),
-                (short) sam.getMappingQuality(),
-                0,
-                sam.getCigarLength(),
-                sam.getFlags(),
-                sam.getReadLength(),
-                sam.getMateReferenceIndex(),
-                sam.getMateAlignmentStart(),
-                0, null);
-
-        bamRec.setCigarString(sam.getCigarString());
-
-        testNullHeaderCigar(bamRec);
-    }
-
-    @Test
-    public void testSetHeaderStrictValid() {
-        SAMRecord sam = createTestRecordHelper();
-        final SAMFileHeader samHeader = sam.getHeader();
-        Integer originalRefIndex = sam.getReferenceIndex();
-        Assert.assertTrue(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX != originalRefIndex);
-
-        // force re-resolution of the reference name
-        sam.setHeaderStrict(samHeader);
-        Assert.assertEquals(sam.getReferenceIndex(), originalRefIndex);
-    }
-
-    @Test
-    public void testSetHeaderStrictValidHeaderless() {
-        SAMRecord sam = createTestRecordHelper();
-        final SAMFileHeader samHeader = sam.getHeader();
-        Integer originalRefIndex = sam.getReferenceIndex();
-        Assert.assertTrue(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX != originalRefIndex);
-
-        sam.setHeader(null);
-        // force re-resolution of the reference name
-        sam.setHeaderStrict(samHeader);
-        Assert.assertEquals(sam.getReferenceIndex(), originalRefIndex);
-    }
-
-    @Test
-    public void testSetHeaderStrictValidNewHeader() {
-        final SAMRecord sam = createTestRecordHelper();
-        final String origSequenceName = sam.getContig();
-
-        final SAMFileHeader origSamHeader = sam.getHeader();
-        final int origSequenceLength = origSamHeader.getSequence(origSequenceName).getSequenceLength();
-        final SAMFileHeader newHeader = new SAMFileHeader();
-        newHeader.addSequence(new SAMSequenceRecord(origSequenceName, origSequenceLength));
-
-        // force re-resolution of the reference name against the new header
-        sam.setHeaderStrict(newHeader);
-        Assert.assertEquals(sam.getReferenceIndex(), new Integer(0));
-    }
-
-    @Test(expectedExceptions=IllegalArgumentException.class)
-    public void testSetHeaderStrictInvalidReference() {
-        SAMRecord sam = createTestRecordHelper();
-        final SAMFileHeader samHeader = sam.getHeader();
-
-        sam.setReferenceName("unresolvable");
-        Assert.assertEquals(new Integer(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX), sam.getReferenceIndex());
-
-        // throw on force re-resolution of the unresolvable reference name
-        sam.setHeaderStrict(samHeader);
-    }
-
-    @Test(expectedExceptions=IllegalArgumentException.class)
-    public void testSetHeaderStrictInvalidMateReference() {
-        SAMRecord sam = createTestRecordHelper();
-        final SAMFileHeader samHeader = sam.getHeader();
-
-        sam.setMateReferenceName("unresolvable");
-        Assert.assertEquals(new Integer(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX), sam.getMateReferenceIndex());
-
-        // throw on force re-resolution of the unresolvable mate reference name
-        sam.setHeaderStrict(samHeader);
-    }
-
-    @Test
-    public void testSetHeaderStrictNull() {
-        SAMRecord sam = createTestRecordHelper();
-        Assert.assertNotNull(sam.getHeader());
-        sam.setHeaderStrict(null);
-        Assert.assertNull(sam.getHeader());
-        Assert.assertNull(sam.mReferenceIndex);
-    }
-
-    // resolveIndexFromName
-
-    @Test
-    public void testResolveIndexResolvable() {
-        final SAMRecord sam = createTestRecordHelper();
-        final SAMFileHeader samHeader = sam.getHeader();
-        final String contigName = sam.getContig();
-        Assert.assertEquals(SAMRecord.resolveIndexFromName(contigName, samHeader, true), new Integer(samHeader.getSequenceIndex(contigName)));
-    }
-
-    @Test(expectedExceptions=IllegalStateException.class)
-    public void testResolveIndexUnresolvableNullHeader() {
-        SAMRecord.resolveIndexFromName("unresolvable", null, false);
-    }
-
-    @Test(expectedExceptions=IllegalArgumentException.class)
-    public void testResolveIndexUnresolvableStrict() {
-        final SAMFileHeader samHeader = new SAMFileHeader();
-        SAMRecord.resolveIndexFromName("unresolvable", samHeader, true);
-    }
-
-    @Test
-    public void testResolveIndexUnresolvableNotStrict() {
-        final SAMFileHeader samHeader = new SAMFileHeader();
-        Assert.assertEquals(SAMRecord.resolveIndexFromName("unresolvable", samHeader, false), null);
-    }
-
-    @Test
-    public void testResolveIndexNoAlignment() {
-        final SAMFileHeader samHeader = new SAMFileHeader();
-        Assert.assertEquals(SAMRecord.resolveIndexFromName(
-                SAMRecord.NO_ALIGNMENT_REFERENCE_NAME, samHeader, true), new Integer(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-    }
-
-    @Test(expectedExceptions=IllegalStateException.class)
-    public void testResolveIndexNullHeader() {
-        SAMRecord.resolveIndexFromName("unresolvable", null, true);
-    }
-
-    // resolveNameFromIndex
-
-    @Test
-    public void testResolveNameResolvable() {
-        final SAMRecord sam = createTestRecordHelper();
-        final SAMFileHeader samHeader = sam.getHeader();
-        final String contigName = sam.getContig();
-        final Integer contigIndex = samHeader.getSequenceIndex(contigName);
-        Assert.assertEquals(SAMRecord.resolveNameFromIndex(contigIndex, samHeader), contigName);
-    }
-
-    @Test(expectedExceptions=IllegalArgumentException.class)
-    public void testResolveNameUnresolvable() {
-        final SAMFileHeader samHeader = new SAMFileHeader();
-        SAMRecord.resolveNameFromIndex(99, samHeader);
-    }
-
-    @Test
-    public void testResolveNameNoAlignment() {
-        final SAMFileHeader samHeader = new SAMFileHeader();
-        Assert.assertEquals(SAMRecord.resolveNameFromIndex(
-                SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, samHeader), SAMRecord.NO_ALIGNMENT_REFERENCE_NAME);
-    }
-
-    @Test(expectedExceptions=IllegalStateException.class)
-    public void testResolveNameNullHeader() {
-        SAMRecord.resolveNameFromIndex(1, null);
-    }
-
-    @Test
-    public void testReverseComplement() {
-        final SAMRecord rec = createTestSamRec();
-
-        rec.reverseComplement(Arrays.asList("Y1"), Arrays.asList("X1", "X2", "X3", "X4", "X5"), false);
-        Assert.assertEquals(rec.getReadString(), "GTGTGTGTGT");
-        Assert.assertEquals(rec.getBaseQualityString(), "IIIIIHHHHH");
-        Assert.assertEquals(rec.getByteArrayAttribute("X1"), new byte[] {5,4,3,2,1});
-        Assert.assertEquals(rec.getSignedShortArrayAttribute("X2"), new short[] {5,4,3,2,1});
-        Assert.assertEquals(rec.getSignedIntArrayAttribute("X3"), new int[] {5,4,3,2,1});
-        Assert.assertEquals(rec.getFloatArrayAttribute("X4"), new float[] {5.0f,4.0f,3.0f,2.0f,1.0f});
-        Assert.assertEquals(rec.getStringAttribute("Y1"), "GTTTTCTTTT");
-    }
-
-    /**
-     * Note that since strings are immutable the Y1 attribute, which is a String, is not reversed in the original even
-     * if an in-place reverse complement occurred. The bases and qualities are byte[] so they are reversed if in-place
-     * is true.
-     */
-    @DataProvider
-    public Object [][] reverseComplementData() {
-        return new Object[][]{
-                {false, "ACACACACAC", "HHHHHIIIII", "AAAAGAAAAC", new byte[] {1,2,3,4,5}, new short[] {1,2,3,4,5}, new int[] {1,2,3,4,5}, new float[] {1,2,3,4,5}},
-                {true, "GTGTGTGTGT", "IIIIIHHHHH", "AAAAGAAAAC", new byte[] {5,4,3,2,1}, new short[] {5,4,3,2,1}, new int[] {5,4,3,2,1}, new float[] {5,4,3,2,1}},
-        };
-    }
-
-    @Test(dataProvider = "reverseComplementData")
-    public void testSafeReverseComplement(boolean inplace, String bases, String quals, String y1, byte[] x1, short[] x2, int[] x3, float[] x4) throws CloneNotSupportedException {
-        final SAMRecord original = createTestSamRec();
-        final SAMRecord cloneOfOriginal = (SAMRecord) original.clone();
-        //Runs a copy (rather than in-place) reverseComplement
-        cloneOfOriginal.reverseComplement(Arrays.asList("Y1"), Arrays.asList("X1", "X2", "X3", "X4", "X5"), inplace);
-
-        Assert.assertEquals(original.getReadString(), bases);
-        Assert.assertEquals(original.getBaseQualityString(), quals);
-        Assert.assertEquals(original.getByteArrayAttribute("X1"), x1);
-        Assert.assertEquals(original.getSignedShortArrayAttribute("X2"), x2);
-        Assert.assertEquals(original.getSignedIntArrayAttribute("X3"), x3);
-        Assert.assertEquals(original.getFloatArrayAttribute("X4"), x4);
-        Assert.assertEquals(original.getStringAttribute("Y1"), y1);
-
-        Assert.assertEquals(cloneOfOriginal.getReadString(), "GTGTGTGTGT");
-        Assert.assertEquals(cloneOfOriginal.getBaseQualityString(), "IIIIIHHHHH");
-        Assert.assertEquals(cloneOfOriginal.getByteArrayAttribute("X1"), new byte[] {5,4,3,2,1});
-        Assert.assertEquals(cloneOfOriginal.getSignedShortArrayAttribute("X2"), new short[] {5,4,3,2,1});
-        Assert.assertEquals(cloneOfOriginal.getSignedIntArrayAttribute("X3"), new int[] {5,4,3,2,1});
-        Assert.assertEquals(cloneOfOriginal.getFloatArrayAttribute("X4"), new float[] {5.0f,4.0f,3.0f,2.0f,1.0f});
-        Assert.assertEquals(cloneOfOriginal.getStringAttribute("Y1"), "GTTTTCTTTT");
-
-    }
-
-    public SAMRecord createTestSamRec() {
-        final SAMFileHeader header = new SAMFileHeader();
-        final SAMRecord rec = new SAMRecord(header);
-        rec.setReadString("ACACACACAC");
-        rec.setBaseQualityString("HHHHHIIIII");
-        rec.setAttribute("X1", new byte[] {1,2,3,4,5});
-        rec.setAttribute("X2", new short[] {1,2,3,4,5});
-        rec.setAttribute("X3", new int[] {1,2,3,4,5});
-        rec.setAttribute("X4", new float[] {1.0f,2.0f,3.0f,4.0f,5.0f});
-        rec.setAttribute("Y1", "AAAAGAAAAC");
-
-        return(rec);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMSequenceDictionaryCodecTest.java b/src/test/java/htsjdk/samtools/SAMSequenceDictionaryCodecTest.java
deleted file mode 100644
index 32de1cd..0000000
--- a/src/test/java/htsjdk/samtools/SAMSequenceDictionaryCodecTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 20016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.LineReader;
-import htsjdk.samtools.util.StringLineReader;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import javax.sound.sampled.Line;
-import java.io.BufferedWriter;
-import java.io.StringWriter;
-import java.util.List;
-import java.util.Random;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Pavel_Silin at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-public class SAMSequenceDictionaryCodecTest {
-
-    private static final Random random = new Random();
-    private SAMSequenceDictionary dictionary;
-    private StringWriter writer;
-    private SAMSequenceDictionaryCodec codec;
-    private BufferedWriter bufferedWriter;
-
-    @BeforeMethod
-    public void setUp() throws Exception {
-        String[] seqs = new String[]{"chr1", "chr2", "chr12", "chr16", "chrX"};
-        dictionary = new SAMSequenceDictionary();
-        for (String seq : seqs) {
-            dictionary.addSequence(new SAMSequenceRecord(seq, random.nextInt(10_000_000)));
-        }
-        writer = new StringWriter();
-        bufferedWriter = new BufferedWriter(writer);
-        codec = new SAMSequenceDictionaryCodec(bufferedWriter);
-    }
-
-    @Test
-    public void testEncodeDecodeDictionary() throws Exception {
-        LineReader readerOne = null;
-        LineReader readerTwo = null;
-        try {
-            codec.encode(dictionary);
-            bufferedWriter.close();
-            readerOne = new StringLineReader(writer.toString());
-            SAMSequenceDictionary actual = codec.decode(readerOne, null);
-            assertEquals(actual, dictionary);
-
-            readerTwo = new StringLineReader(writer.toString());
-
-            String line = readerTwo.readLine();
-            assertTrue(line.startsWith("@HD"));
-
-            line = readerTwo.readLine();
-            while (line != null) {
-                assertTrue(line.startsWith("@SQ"));
-                line = readerTwo.readLine();
-            }
-        } finally {
-            assert readerOne != null;
-            assert readerTwo != null;
-            readerOne.close();
-            readerTwo.close();
-        }
-    }
-
-    @Test
-    public void testEncodeDecodeListOfSeqs() throws Exception {
-        LineReader readerOne = null;
-        LineReader readerTwo = null;
-
-        try {
-            List<SAMSequenceRecord> sequences = dictionary.getSequences();
-            codec.encodeHeaderLine(false);
-            sequences.forEach(codec::encodeSequenceRecord);
-            bufferedWriter.close();
-            readerOne = new StringLineReader(writer.toString());
-            SAMSequenceDictionary actual = codec.decode(readerOne, null);
-            assertEquals(actual, dictionary);
-            readerTwo = new StringLineReader(writer.toString());
-
-            String line = readerTwo.readLine();
-            assertTrue(line.startsWith("@HD"));
-
-            line = readerTwo.readLine();
-            while (line != null) {
-                assertTrue(line.startsWith("@SQ"));
-                line = readerTwo.readLine();
-            }
-        } finally {
-            assert readerOne != null;
-            assert readerTwo != null;
-            readerOne.close();
-            readerTwo.close();
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMSequenceDictionaryTest.java b/src/test/java/htsjdk/samtools/SAMSequenceDictionaryTest.java
deleted file mode 100644
index 0b1a507..0000000
--- a/src/test/java/htsjdk/samtools/SAMSequenceDictionaryTest.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * The MIT License
- *
- * Date: 2015
- * Author: Pierre Lindenbaum @yokofakun
- *     Institut du Thorax , Nantes, France
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-
-public class SAMSequenceDictionaryTest {
-    @Test
-    public void testAliases() {
-        final SAMSequenceRecord ssr1 = new SAMSequenceRecord("1", 1);
-        final SAMSequenceRecord ssr2 = new SAMSequenceRecord("2", 1);
-
-        final SAMSequenceDictionary dict = new SAMSequenceDictionary(
-                Arrays.asList(ssr1, ssr2));
-        Assert.assertEquals(dict.size(), 2);
-        dict.addSequenceAlias("1", "chr1");
-        dict.addSequenceAlias("1", "01");
-        dict.addSequenceAlias("1", "1");
-        dict.addSequenceAlias("01", "chr01");
-        Assert.assertEquals(dict.size(), 2);
-        Assert.assertNotNull(dict.getSequence("chr1"));
-        Assert.assertNull(dict.getSequence("chr2"));
-    }
-
-    /**
-     * should be saved as XML
-     * 
-     * <pre>
-     * <?xml version="1.0" encoding="UTF-8" standalone="yes"?><References><Reference assembly="as" md5="68b329da9893e34099c7d8ad5cb9c940" index="0" length="1" species="sp">1</Reference><Reference index="1" length="1">2</Reference></References>
-     * </pre>
-     * 
-     * @throws JAXBException
-     */
-    @Test
-    public void testXmlSeralization() throws JAXBException {
-        // create dict
-        final SAMSequenceRecord ssr1 = new SAMSequenceRecord("1", 1);
-        ssr1.setMd5("68b329da9893e34099c7d8ad5cb9c940");
-        ssr1.setAssembly("as");
-        ssr1.setSpecies("sp");
-        final SAMSequenceRecord ssr2 = new SAMSequenceRecord("2", 1);
-        final StringWriter xmlWriter = new StringWriter();
-        final SAMSequenceDictionary dict1 = new SAMSequenceDictionary(
-                Arrays.asList(ssr1, ssr2));
-        // create jaxb context
-        JAXBContext jaxbContext = JAXBContext
-                .newInstance(SAMSequenceDictionary.class);
-        // save to XML
-        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
-        jaxbMarshaller.marshal(dict1, xmlWriter);
-        // reload XML
-        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
-        final SAMSequenceDictionary dict2 = (SAMSequenceDictionary) jaxbUnmarshaller
-                .unmarshal(new StringReader(xmlWriter.toString()));
-        Assert.assertEquals(dict1, dict2);
-    }
-
-    @DataProvider(name="testMergeDictionariesData")
-    public Object[][] testMergeDictionariesData(){
-
-        final SAMSequenceRecord rec1, rec2, rec3, rec4, rec5;
-        rec1 = new SAMSequenceRecord("chr1", 100);
-        rec2 = new SAMSequenceRecord("chr1", 101);
-        rec2.setMd5("dummy");
-        rec3 = new SAMSequenceRecord("chr1", SAMSequenceRecord.UNKNOWN_SEQUENCE_LENGTH);
-        rec3.setMd5("dummy2");
-
-        rec4 = new SAMSequenceRecord("chr1", 100);
-        rec4.setAttribute(SAMSequenceRecord.URI_TAG,"file://some/file/name.ok");
-
-        rec5 = new SAMSequenceRecord("chr2", 200);
-        rec4.setAttribute(SAMSequenceRecord.URI_TAG,"file://some/file/name.ok");
-
-        return new Object[][]{
-                new Object[]{rec1, rec1, true},
-                new Object[]{rec2, rec2, true},
-                new Object[]{rec3, rec3, true},
-                new Object[]{rec4, rec4, true},
-                new Object[]{rec1, rec2, false},//since 100 != 101 in Length
-                new Object[]{rec1, rec3, true},
-                new Object[]{rec1, rec4, true},
-                new Object[]{rec2, rec3, false}, // since MD5 is not equal
-                new Object[]{rec2, rec4, false}, //length differs
-                new Object[]{rec3, rec4, true},
-                new Object[]{rec4, rec5, false}, // different name
-        };
-    }
-
-    @Test(dataProvider = "testMergeDictionariesData", expectedExceptions = IllegalArgumentException.class)
-    public void testMergeDictionaries(final SAMSequenceRecord rec1, final SAMSequenceRecord rec2, boolean canMerge) throws Exception {
-        final SAMSequenceDictionary dict1 = new SAMSequenceDictionary(Collections.singletonList(rec1));
-        final SAMSequenceDictionary dict2 = new SAMSequenceDictionary(Collections.singletonList(rec2));
-
-        try {
-            SAMSequenceDictionary.mergeDictionaries(dict1, dict2, SAMSequenceDictionary.DEFAULT_DICTIONARY_EQUAL_TAG);
-        } catch (final IllegalArgumentException e) {
-            if (canMerge) {
-                throw new Exception("Expected to be able to merge dictionaries, but wasn't:" , e);
-            } else {
-                throw e;
-            }
-        }
-        if (canMerge){
-            throw new IllegalArgumentException("Expected to be able to merge dictionaries, and was indeed able to do so.");
-        } else {
-            throw new Exception("Expected to not be able to merge dictionaries, but was able");
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMTextReaderTest.java b/src/test/java/htsjdk/samtools/SAMTextReaderTest.java
deleted file mode 100644
index c80924b..0000000
--- a/src/test/java/htsjdk/samtools/SAMTextReaderTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-
-public class SAMTextReaderTest {
-    // Simple input, spot check that parsed correctly, and make sure nothing blows up.
-    @Test
-    public void testBasic() throws Exception {
-        final String seq1 = "AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG";
-        final String seq2 = "ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA";
-        final String qual1 = "<<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<<";
-        final String qual2 = "<<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<<";
-        final String fileFormatVersion = "1.0";
-        final String sequence = "chr20";
-        final int sequenceLength = 62435964;
-        final String charTag = "XC";
-        final char charValue = 'q';
-        final String intTag = "XI";
-        final int intValue = 12345;
-        final String floatTag = "XF";
-        final float floatValue = 1.2345f;
-        final String stringTag = "XS";
-        final String stringValue = "Hi,Mom!";
-        final String samExample = "@HD\tVN:" + fileFormatVersion + "\t" + charTag + ":" + charValue + "\n" +
-                "@SQ\tSN:" + sequence + "\tAS:HG18\tLN:" + sequenceLength + "\t" + intTag + ":" + intValue + "\n" +
-                "@RG\tID:L1\tPU:SC_1_10\tLB:SC_1\tSM:NA12891" + "\t" + floatTag + ":" + floatValue + "\n" +
-                "@RG\tID:L2\tPU:SC_2_12\tLB:SC_2\tSM:NA12891\n" +
-                "@PG\tID:0\tVN:1.0\tCL:yo baby\t" + stringTag + ":" + stringValue + "\n" +
-                "@PG\tID:2\tVN:1.1\tCL:whassup? ? ? ?\n" +
-                "read_28833_29006_6945\t99\tchr20\t28833\t20\t10M1D25M\t=\t28993\t195\t" +
-                seq1.toLowerCase() + "\t" + qual1 + "\t" +
-                "MF:i:130\tNm:i:1\tH0:i:0\tH1:i:0\tRG:Z:L1\n" +
-                "read_28701_28881_323b\t147\tchr20\t28834\t30\t35M\t=\t28701\t-168\t" +
-                seq2 + "\t" + qual2 + "\t" +
-                "MF:i:18\tNm:i:0\tH0:i:1\tH1:i:0\tRG:Z:L2\n";
-
-        final String[] samResults =
-                {"read_28833_29006_6945\t99\tchr20\t28833\t20\t10M1D25M\t=\t28993\t195\t" + seq1 + "\t" + qual1 +
-                        "\tH0:i:0\tH1:i:0\tMF:i:130\tRG:Z:L1\tNm:i:1\n",
-                        "read_28701_28881_323b\t147\tchr20\t28834\t30\t35M\t=\t28701\t-168\t" + seq2 + "\t" + qual2 +
-                                "\tH0:i:1\tH1:i:0\tMF:i:18\tRG:Z:L2\tNm:i:0\n"
-                };
-
-        final SamReader samReader = createSamFileReader(samExample);
-        final SAMFileHeader fileHeader = samReader.getFileHeader();
-
-        Assert.assertEquals(fileHeader.getVersion(), fileFormatVersion);
-        Assert.assertEquals(fileHeader.getAttribute(charTag), Character.toString(charValue));
-        final SAMSequenceRecord sequenceRecord = fileHeader.getSequence(sequence);
-        Assert.assertNotNull(sequenceRecord);
-        Assert.assertEquals(sequenceRecord.getSequenceLength(), sequenceLength);
-        Assert.assertEquals(sequenceRecord.getAttribute(intTag), Integer.toString(intValue));
-        Assert.assertEquals(fileHeader.getReadGroup("L1").getAttribute(floatTag), Float.toString(floatValue));
-        Assert.assertEquals(fileHeader.getProgramRecord("0").getAttribute(stringTag), stringValue);
-
-        final CloseableIterator<SAMRecord> iterator = samReader.iterator();
-        int i = 0;
-        while (iterator.hasNext()) {
-            final SAMRecord rec = iterator.next();
-            Assert.assertEquals(rec.getSAMString(), samResults[i++]);
-        }
-        iterator.close();
-        iterator.close();
-        samReader.close();
-    }
-
-    private SamReader createSamFileReader(final String samExample) {
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(samExample.getBytes());
-        return SamReaderFactory.makeDefault().open(SamInputResource.of(inputStream));
-    }
-
-    @Test
-    public void testUnmapped() {
-        final String alignmentFromKris =
-                "0\t4\t*\t0\t0\t*\t*\t0\t0\tGCCTCGTAGTGCGCCATCAGTCTATCGATGTCGTTG\t44\"44===;;;;;;;;;::::88844\"4\"\"\"\"\"\"\"\"\n";
-        final SamReader samReader = createSamFileReader(alignmentFromKris);
-        final CloseableIterator<SAMRecord> iterator = samReader.iterator();
-        while (iterator.hasNext()) {
-            iterator.next();
-        }
-        iterator.close();
-        CloserUtil.close(samReader);
-    }
-
-    /**
-     * Colon separates fields of a text tag, but colon is also valid in a tag value, so assert that works properly.
-     */
-    @Test
-    public void testTagWithColon() {
-        // Create a SAMRecord with a String tag containing a colon
-        final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-        samBuilder.addUnmappedFragment("Hi,Mom!");
-        final SAMRecord rec = samBuilder.iterator().next();
-        final String valueWithColons = "A:B::C:::";
-        rec.setAttribute(SAMTag.CQ.name(), valueWithColons);
-        // Write the record as SAM Text
-        final ByteArrayOutputStream os = new ByteArrayOutputStream();
-        final SAMFileWriter textWriter = new SAMFileWriterFactory().makeSAMWriter(samBuilder.getHeader(),
-                true, os);
-        textWriter.addAlignment(rec);
-        textWriter.close();
-
-        final SamReader reader = SamReaderFactory.makeDefault().open(SamInputResource.of(new ByteArrayInputStream(os.toByteArray())));
-        final SAMRecord recFromText = reader.iterator().next();
-        Assert.assertEquals(recFromText.getAttribute(SAMTag.CQ.name()), valueWithColons);
-        CloserUtil.close(reader);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMTextWriterTest.java b/src/test/java/htsjdk/samtools/SAMTextWriterTest.java
deleted file mode 100644
index 123ab6b..0000000
--- a/src/test/java/htsjdk/samtools/SAMTextWriterTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-public class SAMTextWriterTest {
-
-    private SAMRecordSetBuilder getSAMReader(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder) {
-        final SAMRecordSetBuilder ret = new SAMRecordSetBuilder(sortForMe, sortOrder);
-        ret.addPair("readB", 20, 200, 300);
-        ret.addPair("readA", 20, 100, 150);
-        ret.addFrag("readC", 20, 140, true);
-        ret.addFrag("readD", 20, 140, false);
-        return ret;
-    }
-
-    @Test
-    public void testNullHeader() throws Exception {
-        final SAMRecordSetBuilder recordSetBuilder = getSAMReader(true, SAMFileHeader.SortOrder.coordinate);
-        for (final SAMRecord rec : recordSetBuilder.getRecords()) {
-            rec.setHeader(null);
-        }
-        doTest(recordSetBuilder);
-    }
-
-    @Test
-    public void testBasic() throws Exception {
-        doTest(SamFlagField.DECIMAL);
-    }
-
-    @Test
-    public void testBasicHexFlag() throws Exception {
-        doTest(SamFlagField.HEXADECIMAL);
-    }
-
-    @Test
-    public void testBasicOctalFlag() throws Exception {
-        doTest(SamFlagField.OCTAL);
-    }
-
-    @Test
-    public void testBasicStringFlag() throws Exception {
-        doTest(SamFlagField.STRING);
-    }
-
-    private void doTest(final SAMRecordSetBuilder recordSetBuilder) throws Exception {
-        doTest(recordSetBuilder, SamFlagField.DECIMAL);
-    }
-
-    private void doTest(final SamFlagField samFlagField) throws Exception {
-        doTest(getSAMReader(true, SAMFileHeader.SortOrder.coordinate), samFlagField);
-    }
-
-    private void doTest(final SAMRecordSetBuilder recordSetBuilder, final SamFlagField samFlagField) throws Exception {
-        SamReader inputSAM = recordSetBuilder.getSamReader();
-        final File samFile = File.createTempFile("tmp.", ".sam");
-        samFile.deleteOnExit();
-        final Map<String, Object> tagMap = new HashMap<String, Object>();
-        tagMap.put("XC", new Character('q'));
-        tagMap.put("XI", 12345);
-        tagMap.put("XF", 1.2345f);
-        tagMap.put("XS", "Hi,Mom!");
-        for (final Map.Entry<String, Object> entry : tagMap.entrySet()) {
-            inputSAM.getFileHeader().setAttribute(entry.getKey(), entry.getValue().toString());
-        }
-        final SAMFileWriter samWriter = new SAMFileWriterFactory().setSamFlagFieldOutput(samFlagField).makeSAMWriter(inputSAM.getFileHeader(), false, samFile);
-        for (final SAMRecord samRecord : inputSAM) {
-            samWriter.addAlignment(samRecord);
-        }
-        samWriter.close();
-
-        // Read it back in and confirm that it matches the input
-        inputSAM = recordSetBuilder.getSamReader();
-        // Stuff in the attributes again since this has been created again.
-        for (final Map.Entry<String, Object> entry : tagMap.entrySet()) {
-            inputSAM.getFileHeader().setAttribute(entry.getKey(), entry.getValue().toString());
-        }
-
-        final SamReader newSAM = SamReaderFactory.makeDefault().open(samFile);
-        Assert.assertEquals(newSAM.getFileHeader(), inputSAM.getFileHeader());
-        final Iterator<SAMRecord> inputIt = inputSAM.iterator();
-        final Iterator<SAMRecord> newSAMIt = newSAM.iterator();
-        while (inputIt.hasNext()) {
-            Assert.assertTrue(newSAMIt.hasNext());
-            final SAMRecord inputSAMRecord = inputIt.next();
-            final SAMRecord newSAMRecord = newSAMIt.next();
-
-            // Force reference index attributes to be populated
-            inputSAMRecord.getReferenceIndex();
-            newSAMRecord.getReferenceIndex();
-            inputSAMRecord.getMateReferenceIndex();
-            newSAMRecord.getMateReferenceIndex();
-
-            // Force these to be equal
-            newSAMRecord.setIndexingBin(inputSAMRecord.getIndexingBin());
-
-            Assert.assertEquals(newSAMRecord, inputSAMRecord);
-        }
-        Assert.assertFalse(newSAMIt.hasNext());
-        inputSAM.close();
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMUtilsTest.java b/src/test/java/htsjdk/samtools/SAMUtilsTest.java
deleted file mode 100644
index 3be7e39..0000000
--- a/src/test/java/htsjdk/samtools/SAMUtilsTest.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-public class SAMUtilsTest {
-    @Test
-    public void testCompareMapqs() {
-        Assert.assertEquals(SAMUtils.compareMapqs(0, 0), 0);
-        Assert.assertEquals(SAMUtils.compareMapqs(255, 255), 0);
-        Assert.assertEquals(SAMUtils.compareMapqs(1, 1), 0);
-        Assert.assertTrue(SAMUtils.compareMapqs(0, 255) < 0);
-        Assert.assertTrue(SAMUtils.compareMapqs(0, 1) < 0);
-        Assert.assertTrue(SAMUtils.compareMapqs(255, 1) < 0);
-        Assert.assertTrue(SAMUtils.compareMapqs(1, 2) < 0);
-
-        Assert.assertTrue(SAMUtils.compareMapqs(255, 0) > 0);
-        Assert.assertTrue(SAMUtils.compareMapqs(1, 0) > 0);
-        Assert.assertTrue(SAMUtils.compareMapqs(1, 255) > 0);
-        Assert.assertTrue(SAMUtils.compareMapqs(2, 1) > 0);
-    }
-
-    @Test
-    public void testSimpleClippingOfRecord() {
-        // setup the record
-        final SAMFileHeader header = new SAMFileHeader();
-        header.addSequence(new SAMSequenceRecord("1", 1000));
-        final SAMRecord record = new SAMRecord(header);
-        record.setReadPairedFlag(true);
-        record.setCigar(TextCigarCodec.decode("10M"));
-        record.setReferenceIndex(0);
-        record.setAlignmentStart(1);
-        record.setMateReferenceIndex(0);
-        record.setMateAlignmentStart(6); // should overlap 5M
-        record.setReadBases("AAAAAAAAAA".getBytes());
-
-        final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record);
-        Assert.assertEquals(numToClip, 5);
-
-        SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK
-
-        Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("5M5S")));
-    }
-
-    @Test
-    public void testClippingOfRecordWithSoftClipBasesAtTheEnd() {
-        /**
-         * Tests that if we need to clip a read with soft-clipping at the end, it does the right thing.
-         */
-
-        // setup the record
-        final SAMFileHeader header = new SAMFileHeader();
-        header.addSequence(new SAMSequenceRecord("1", 1000));
-        final SAMRecord record = new SAMRecord(header);
-        record.setReadPairedFlag(true);
-        record.setCigar(TextCigarCodec.decode("5M5S"));
-        record.setReferenceIndex(0);
-        record.setAlignmentStart(1);
-        record.setMateReferenceIndex(0);
-        record.setMateAlignmentStart(5); // should overlap 1M5S
-        record.setReadBases("AAAAAAAAAA".getBytes());
-
-        final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record);
-        Assert.assertEquals(numToClip, 1);
-
-        SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK
-
-        Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("4M6S")));
-    }
-
-    @Test
-    public void testClippingOfRecordWithInsertion() {
-        /**
-         * Tests that if we need to clip a read with an insertion that overlaps
-         */
-
-        // setup the record
-        final SAMFileHeader header = new SAMFileHeader();
-        header.addSequence(new SAMSequenceRecord("1", 1000));
-        final SAMRecord record = new SAMRecord(header);
-        record.setReadPairedFlag(true);
-        record.setCigar(TextCigarCodec.decode("5M1I5M"));
-        record.setReferenceIndex(0);
-        record.setAlignmentStart(1);
-        record.setMateReferenceIndex(0);
-        record.setMateAlignmentStart(5); // should overlap the 1M1I5M
-        record.setReadBases("AAAAAAAAAAA".getBytes());
-
-
-        final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record);
-        Assert.assertEquals(numToClip, 7);
-
-        SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK
-
-        Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("4M7S")));
-
-    }
-
-    @Test
-    public void testClippingOfRecordWithDeletion() {
-        /**
-         * Tests that if we need to clip a read with an deletion that overlaps
-         */
-
-        // setup the record
-        final SAMFileHeader header = new SAMFileHeader();
-        header.addSequence(new SAMSequenceRecord("1", 1000));
-        final SAMRecord record = new SAMRecord(header);
-        record.setReadPairedFlag(true);
-        record.setCigar(TextCigarCodec.decode("5M1D5M"));
-        record.setReferenceIndex(0);
-        record.setAlignmentStart(1);
-        record.setMateReferenceIndex(0);
-        record.setMateAlignmentStart(5); // should overlap the 1M1D5M
-        record.setReadBases("AAAAAAAAAA".getBytes());
-
-        final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record);
-        Assert.assertEquals(numToClip, 6);
-
-        SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK
-        Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("4M6S")));
-
-    }
-
-    @Test
-    public void testClippingOfRecordWithMateAtSamePosition() {
-        /**
-         * Tests that we clip the first end of a pair if we have perfect overlap of a pair
-         */
-
-        // setup the record
-        final SAMFileHeader header = new SAMFileHeader();
-        header.addSequence(new SAMSequenceRecord("1", 1000));
-        final SAMRecord record = new SAMRecord(header);
-        record.setReadPairedFlag(true);
-        record.setFirstOfPairFlag(true);
-        record.setCigar(TextCigarCodec.decode("10M"));
-        record.setReferenceIndex(0);
-        record.setAlignmentStart(1);
-        record.setMateReferenceIndex(0);
-        record.setMateAlignmentStart(1);
-        record.setReadBases("AAAAAAAAAA".getBytes());
-
-        Assert.assertEquals(SAMUtils.getNumOverlappingAlignedBasesToClip(record), 0);
-
-        // now make it the second end
-        record.setFirstOfPairFlag(false);
-        record.setSecondOfPairFlag(true);
-        Assert.assertEquals(SAMUtils.getNumOverlappingAlignedBasesToClip(record), 10);
-    }
-
-    @Test
-    public void testOtherCanonicalAlignments() {
-        // setup the record
-        final SAMFileHeader header = new SAMFileHeader();
-        header.addSequence(new SAMSequenceRecord("1", 1000));
-        header.addSequence(new SAMSequenceRecord("2", 1000));
-        final SAMRecord record = new SAMRecord(header);
-        record.setReadPairedFlag(true);
-        record.setFirstOfPairFlag(true);
-        record.setCigar(TextCigarCodec.decode("10M"));
-        record.setReferenceIndex(0);
-        record.setAlignmentStart(1);
-        record.setMateReferenceIndex(0);
-        record.setMateAlignmentStart(1);
-        record.setReadPairedFlag(true);
-        record.setSupplementaryAlignmentFlag(true);//spec says first 'SA' record will be the primary record
-
-        record.setMateReferenceIndex(0);
-        record.setMateAlignmentStart(100);
-        record.setInferredInsertSize(99);
-
-        record.setReadBases("AAAAAAAAAA".getBytes());
-        record.setBaseQualities("##########".getBytes());
-        // check no alignments if no SA tag */
-        Assert.assertEquals(SAMUtils.getOtherCanonicalAlignments(record).size(),0);
-
-
-        record.setAttribute(SAMTagUtil.getSingleton().SA,
-                "2,500,+,3S2=1X2=2S,60,1;" +
-                "1,191,-,8M2S,60,*;");
-
-        // extract suppl alignments
-        final List<SAMRecord> suppl = SAMUtils.getOtherCanonicalAlignments(record);
-        Assert.assertNotNull(suppl);
-        Assert.assertEquals(suppl.size(), 2);
-
-        for(final SAMRecord other: suppl) {
-            Assert.assertFalse(other.getReadUnmappedFlag());
-            Assert.assertTrue(other.getReadPairedFlag());
-            Assert.assertFalse(other.getMateUnmappedFlag());
-            Assert.assertEquals(other.getMateAlignmentStart(),record.getMateAlignmentStart());
-            Assert.assertEquals(other.getMateReferenceName(),record.getMateReferenceName());
-
-            Assert.assertEquals(other.getReadName(),record.getReadName());
-            if( other.getReadNegativeStrandFlag()==record.getReadNegativeStrandFlag()) {
-                Assert.assertEquals(other.getReadString(),record.getReadString());
-                Assert.assertEquals(other.getBaseQualityString(),record.getBaseQualityString());
-                }
-        }
-
-        SAMRecord other = suppl.get(0);
-        Assert.assertFalse(other.getSupplementaryAlignmentFlag());//1st of suppl and 'record' is supplementary
-        Assert.assertEquals(other.getReferenceName(),"2");
-        Assert.assertEquals(other.getAlignmentStart(),500);
-        Assert.assertFalse(other.getReadNegativeStrandFlag());
-        Assert.assertEquals(other.getMappingQuality(), 60);
-        Assert.assertEquals(other.getAttribute(SAMTagUtil.getSingleton().NM),1);
-        Assert.assertEquals(other.getCigarString(),"3S2=1X2=2S");
-        Assert.assertEquals(other.getInferredInsertSize(),0);
-
-
-        other = suppl.get(1);
-        Assert.assertTrue(other.getSupplementaryAlignmentFlag());
-        Assert.assertEquals(other.getReferenceName(),"1");
-        Assert.assertEquals(other.getAlignmentStart(),191);
-        Assert.assertTrue(other.getReadNegativeStrandFlag());
-        Assert.assertEquals(other.getMappingQuality(), 60);
-        Assert.assertEquals(other.getAttribute(SAMTagUtil.getSingleton().NM),null);
-        Assert.assertEquals(other.getCigarString(),"8M2S");
-        Assert.assertEquals(other.getInferredInsertSize(),-91);//100(mate) - 191(other)
-
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SamFileHeaderMergerTest.java b/src/test/java/htsjdk/samtools/SamFileHeaderMergerTest.java
deleted file mode 100644
index 6e4fd75..0000000
--- a/src/test/java/htsjdk/samtools/SamFileHeaderMergerTest.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- **/
-
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.SequenceUtil;
-import htsjdk.samtools.util.StringUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import static org.testng.Assert.assertEquals;
-
-
-/**
- * @author aaron
- * @version 1.0
- * @date May 20, 2009
- * <p/>
- * Class SamFileHeaderMergerTest
- * <p/>
- * Tests the ability of the SamFileHeaderMerger class to merge sequence dictionaries.
- */
-public class SamFileHeaderMergerTest {
-
-    private static File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
-    /** tests that if we've set the merging to false, we get a SAMException for bam's with different dictionaries. */
-    @Test(expectedExceptions = SequenceUtil.SequenceListsDifferException.class)
-    public void testMergedException() {
-        File INPUT[] = {new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/Chromosome1to10.bam"),
-                new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/Chromosome5to9.bam")};
-        final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-        for (final File inFile : INPUT) {
-            IOUtil.assertFileIsReadable(inFile);
-            headers.add(SamReaderFactory.makeDefault().getFileHeader(inFile));
-        }
-        new SamFileHeaderMerger(SAMFileHeader.SortOrder.unsorted, headers, false);
-    }
-
-    /** Tests that we can successfully merge two files with */
-    @Test
-    public void testMerging() {
-        File INPUT[] = {new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/Chromosome1to10.bam"),
-                new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/Chromosome5to9.bam")};
-        final List<SamReader> readers = new ArrayList<SamReader>();
-        final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-        for (final File inFile : INPUT) {
-            IOUtil.assertFileIsReadable(inFile);
-            // We are now checking for zero-length reads, so suppress complaint about that.
-            final SamReader in = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(inFile);
-
-            readers.add(in);
-            headers.add(in.getFileHeader());
-        }
-        final MergingSamRecordIterator iterator;
-        final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.unsorted, headers, true);
-        iterator = new MergingSamRecordIterator(headerMerger, readers, false);
-        headerMerger.getMergedHeader();
-
-        // count the total reads, and record read counts for each sequence
-        Map<Integer, Integer> seqCounts = new HashMap<Integer, Integer>();
-        int totalCount = 0;
-
-        while (iterator.hasNext()) {
-            SAMRecord r = iterator.next();
-            if (seqCounts.containsKey(r.getReferenceIndex())) {
-                seqCounts.put(r.getReferenceIndex(), seqCounts.get(r.getReferenceIndex()) + 1);
-            } else {
-                seqCounts.put(r.getReferenceIndex(), 1);
-            }
-            ++totalCount;
-        }
-        assertEquals(totalCount, 1500);
-        for (Integer i : seqCounts.keySet()) {
-            if (i < 4 || i > 8) {
-                // seqeunce 5 - 9 should have 200 reads (indices 4 - 8)
-                assertEquals(seqCounts.get(i).intValue(), 100);
-            } else {
-                // the others should have 100
-                assertEquals(seqCounts.get(i).intValue(), 200);
-            }
-        }
-        CloserUtil.close(readers);
-    }
-
-    private static final String sq1 = "@SQ\tSN:chr1\tLN:1000\n";
-    private static final String sq2 = "@SQ\tSN:chr2\tLN:1000\n";
-    private static final String sq3 = "@SQ\tSN:chr3\tLN:1000\n";
-    private static final String sq4 = "@SQ\tSN:chr4\tLN:1000\n";
-    private static final String sq5 = "@SQ\tSN:chr5\tLN:1000\n";
-
-    @Test
-    public void testSequenceDictionaryMerge() {
-        final String sd1 = sq1 + sq2 + sq5;
-        final String sd2 = sq2 + sq3 + sq4;
-        SamReader reader1 = SamReaderFactory.makeDefault().open(SamInputResource.of(new ByteArrayInputStream(StringUtil.stringToBytes(sd1))));
-        SamReader reader2 = SamReaderFactory.makeDefault().open(SamInputResource.of(new ByteArrayInputStream(StringUtil.stringToBytes(sd2))));
-        final List<SAMFileHeader> inputHeaders = Arrays.asList(reader1.getFileHeader(), reader2.getFileHeader());
-        SamFileHeaderMerger merger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, inputHeaders, true);
-        final SAMFileHeader mergedHeader = merger.getMergedHeader();
-        for (final SAMFileHeader inputHeader : inputHeaders) {
-            int prevTargetIndex = -1;
-            for (final SAMSequenceRecord sequenceRecord : inputHeader.getSequenceDictionary().getSequences()) {
-                final int targetIndex = mergedHeader.getSequenceIndex(sequenceRecord.getSequenceName());
-                Assert.assertNotSame(targetIndex, -1);
-                Assert.assertTrue(prevTargetIndex < targetIndex);
-                prevTargetIndex = targetIndex;
-            }
-        }
-        CloserUtil.close(reader1);
-        CloserUtil.close(reader2);
-    }
-
-    @Test(dataProvider = "data")
-    public void testProgramGroupAndReadGroupMerge(File inputFiles[], File expectedOutputFile) throws IOException {
-
-        BufferedReader reader = new BufferedReader(new FileReader(expectedOutputFile));
-
-        String line;
-        String expected_output = "";
-        while ((line = reader.readLine()) != null) {
-            expected_output += line + "\n";
-        }
-
-        final List<SamReader> readers = new ArrayList<SamReader>();
-        final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
-        for (final File inFile : inputFiles) {
-            IOUtil.assertFileIsReadable(inFile);
-
-            // We are now checking for zero-length reads, so suppress complaint about that.
-            final SamReader in = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(inFile);
-            readers.add(in);
-            headers.add(in.getFileHeader());
-        }
-        final MergingSamRecordIterator iterator;
-
-        final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headers, true);
-        iterator = new MergingSamRecordIterator(headerMerger, readers, false);
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        SAMFileWriter writer = new SAMFileWriterFactory().makeSAMWriter(headerMerger.getMergedHeader(), true, baos);
-        while (iterator.hasNext()) {
-            writer.addAlignment(iterator.next());
-        }
-        writer.close();
-
-        String actual_output = StringUtil.bytesToString(baos.toByteArray());
-
-        List<String> actual = Arrays.asList(actual_output.split("\\n"));
-        List<String> expected = Arrays.asList(expected_output.split("\\n"));
-        for (int i = 0; i < expected.size(); i++) {
-            if (expected.get(i).startsWith("@")) {
-                Assert.assertTrue(headersEquivalent(actual.get(i), expected.get(i)));
-            } else {
-                List<String> expectedSamParts = Arrays.asList(expected.get(i).split("\\s*"));
-                List<String> actualSamParts = Arrays.asList(actual.get(i).split("\\s*"));
-                for (String exp : expectedSamParts) {
-                    Assert.assertTrue(actualSamParts.contains(exp));
-                }
-                for (String act : actualSamParts) {
-                    Assert.assertTrue(expectedSamParts.contains(act));
-                }
-            }
-        }
-        CloserUtil.close(readers);
-    }
-
-    private static final boolean headersEquivalent(String a, String b) {
-        if (a.length() != b.length()) return false;
-        List<String> remaining = new LinkedList<String>(Arrays.asList(a.split("\\t")));
-        for (final String item : b.split("\\t")) {
-            if (!remaining.remove(item)) return false;
-        }
-        return remaining.isEmpty(); 
-    }
-
-    @DataProvider(name = "data")
-    private Object[][] getProgramGroupAndReadGroupMergeData() {
-
-        return new Object[][]{
-                {
-
-                        new File[]{
-                                new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case1/chr11sub_file1.sam"),
-                                new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case1/chr11sub_file2.sam")},
-                        new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case1/expected_output.sam")
-                }, {
-                new File[]{
-                        new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case2/chr11sub_file1.sam"),
-                        new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case2/chr11sub_file2.sam"),
-                        new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case2/chr11sub_file3.sam"),
-                        new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case2/chr11sub_file4.sam")},
-                new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case2/expected_output.sam")
-        }
-        };
-    }
-
-    @Test(expectedExceptions = {SAMException.class})
-    public void testUnmergeableSequenceDictionary() {
-        final String sd1 = sq1 + sq2 + sq5;
-        final String sd2 = sq2 + sq3 + sq4 + sq1;
-        final SamReader reader1 = SamReaderFactory.makeDefault().open(SamInputResource.of(new ByteArrayInputStream(StringUtil.stringToBytes(sd1))));
-        final SamReader reader2 = SamReaderFactory.makeDefault().open(SamInputResource.of(new ByteArrayInputStream(StringUtil.stringToBytes(sd2))));
-        final List<SAMFileHeader> inputHeaders = Arrays.asList(reader1.getFileHeader(), reader2.getFileHeader());
-        new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, inputHeaders, true);
-        CloserUtil.close(reader1);
-        CloserUtil.close(reader2);
-    }
-
-    @DataProvider(name = "fourDigitBase36StrPositiveData")
-    public Object[][] positiveFourDigitBase36StrData() {
-        return new Object[][]{
-                {0, "0"},
-                {15, "F"},
-                {36, "10"},
-                {1200000, "PPXC"},
-                {36 * 36 * 36 * 36 - 2, "ZZZY"},
-                {36 * 36 * 36 * 36 - 1, "ZZZZ"},
-        };
-    }
-
-    @Test(dataProvider = "fourDigitBase36StrPositiveData")
-    public void fourDigitBase36StrPositiveTest(final int toConvert, final String expectedValue) {
-        final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, new ArrayList<SAMFileHeader>(), true);
-        Assert.assertEquals(expectedValue, headerMerger.positiveFourDigitBase36Str(toConvert));
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SamFilesTest.java b/src/test/java/htsjdk/samtools/SamFilesTest.java
deleted file mode 100644
index 443a4d1..0000000
--- a/src/test/java/htsjdk/samtools/SamFilesTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package htsjdk.samtools;
-
-import java.nio.file.Path;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Test valid combinations of bam/cram vs bai/crai files.
- * Created by vadim on 10/08/2015.
- */
-public class SamFilesTest {
-    private static final String TEST_DATA = "src/test/resources/htsjdk/samtools/BAMFileIndexTest/";
-    private static final File BAM_FILE = new File(TEST_DATA + "index_test.bam");
-
-    @DataProvider(name = "FindIndexParams")
-    public static Object[][] paramsFindIndexForSuffixes() {
-        return new Object[][]{
-                // no index available sanity checks:
-                {".tmp", null, null},
-                {".bam", null, null},
-                {".cram", null, null},
-
-                // legit cases for BAM files:
-                {".bam", ".bai", ".bai"},
-                {".bam", ".bam.bai", ".bam.bai"},
-
-                // legit cases for CRAM files:
-                {".cram", ".cram.bai", ".cram.bai"},
-                {".cram", ".cram.crai", ".cram.crai"},
-
-                // special prohibited cases:
-                {".bam", ".crai", null},
-                {".tmp", ".crai", null},
-        };
-    }
-
-    @Test(dataProvider = "FindIndexParams")
-    public void testFindIndexForSuffixes(final String dataFileSuffix, final String indexFileSuffix, final String expectIndexSuffix) throws IOException {
-        final File dataFile = File.createTempFile("test", dataFileSuffix);
-        dataFile.deleteOnExit();
-        Assert.assertNull(SamFiles.findIndex(dataFile));
-        Assert.assertNull(SamFiles.findIndex(dataFile.toPath()));
-
-        File indexFile = null;
-        if (indexFileSuffix != null) {
-            indexFile = new File(dataFile.getAbsolutePath().replaceFirst("\\.\\S+$", indexFileSuffix));
-            indexFile.createNewFile();
-            indexFile.deleteOnExit();
-        }
-
-        final File foundIndexFile = SamFiles.findIndex(dataFile);
-        if (expectIndexSuffix == null) {
-            Assert.assertNull(foundIndexFile);
-        } else {
-            Assert.assertNotNull(foundIndexFile);
-            Assert.assertTrue(foundIndexFile.getName().endsWith(expectIndexSuffix));
-        }
-
-        final Path foundIndexPath = SamFiles.findIndex(dataFile.toPath());
-        if (expectIndexSuffix == null) {
-            Assert.assertNull(foundIndexPath);
-        } else {
-            Assert.assertNotNull(foundIndexPath);
-            Assert.assertTrue(foundIndexPath.getFileName().toString().endsWith(expectIndexSuffix));
-        }
-    }
-
-    @DataProvider(name = "filesAndIndicies")
-    public Object[][] getFilesAndIndicies() throws IOException {
-
-        final File REAL_INDEX_FILE = new File(BAM_FILE + ".bai"); //test regular file
-        final File SYMLINKED_BAM_WITH_SYMLINKED_INDEX = new File(TEST_DATA, "symlink_with_index.bam");
-
-        return new Object[][]{
-                {BAM_FILE, REAL_INDEX_FILE},
-                {SYMLINKED_BAM_WITH_SYMLINKED_INDEX, new File(SYMLINKED_BAM_WITH_SYMLINKED_INDEX + ".bai")},
-                {new File(TEST_DATA, "symlink_without_linked_index.bam"), REAL_INDEX_FILE.getCanonicalFile()},
-                {new File(TEST_DATA, "FileThatDoesntExist"), null}
-        };
-    }
-
-    @Test(dataProvider ="filesAndIndicies")
-    public void testIndexSymlinking(File bam, File expected_index) {
-        Assert.assertEquals(SamFiles.findIndex(bam), expected_index);
-        Assert.assertEquals(SamFiles.findIndex(bam.toPath()), expected_index == null ? null : expected_index.toPath());
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SamFlagFieldTest.java b/src/test/java/htsjdk/samtools/SamFlagFieldTest.java
deleted file mode 100644
index f09e636..0000000
--- a/src/test/java/htsjdk/samtools/SamFlagFieldTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * @author nhomer
- */
-public class SamFlagFieldTest {
-
-    @Test
-    public void testAllFlags() {
-        int flagAsInteger = 0;
-        for (final SAMFlag samFlag : SAMFlag.values()) {
-            flagAsInteger |= samFlag.flag;
-        }
-        final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
-        Assert.assertEquals(flagAsString, "urURpP12sSxd");
-        Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
-    }
-
-    @Test
-    public void testAllFlagsReverseOrder() {
-        int flagAsInteger = 0;
-        for (final SAMFlag samFlag : SAMFlag.values()) {
-            flagAsInteger |= samFlag.flag;
-        }
-        final String flagAsString = new StringBuilder("urURpP12sSxd").reverse().toString();
-
-        Assert.assertEquals(flagAsInteger, SamFlagField.STRING.parse(flagAsString));
-        Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
-    }
-
-    @Test
-    public void testForwardStrandFlags() {
-        final int flagAsInteger = SamFlagField.STRING.parse("f");
-        final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
-        Assert.assertEquals(flagAsString, "mf");
-        Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
-    }
-
-    @Test
-    public void testPairedForwardStrandFlags() {
-        final int flagAsInteger = SamFlagField.STRING.parse("mfMFp");
-        final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
-        Assert.assertEquals(flagAsString, "mfMFp");
-        Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
-    }
-
-    @Test
-    public void testMappedFlags() {
-        final int flagAsInteger = SamFlagField.STRING.parse("m");
-        final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
-        Assert.assertEquals(flagAsString, "mf");
-        Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
-    }
-
-    @Test
-    public void testPairedMappedFlags() {
-        final int flagAsInteger = SamFlagField.STRING.parse("pmM");
-        final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
-        Assert.assertEquals(flagAsString, "mfMFp");
-        Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
-    }
-
-    @Test
-    public void testMateMappedNotOnFragmentFlags() {
-        final int flagAsInteger = SAMFlag.MATE_UNMAPPED.flag;
-        final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
-        Assert.assertEquals(flagAsString, "mfU");
-        Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
-    }
-
-    @Test
-    public void testMateMappedOnlyOnPairsFlags() {
-        final int flagAsInteger = SAMFlag.MATE_UNMAPPED.flag | SAMFlag.READ_PAIRED.flag;
-        final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
-        Assert.assertEquals(flagAsString, "mfUFp");
-        Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
-    }
-
-    @Test
-    public void testMateForwardStrandNotOnFragmentFlags() {
-        final int flagAsInteger = 0;
-        final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
-        Assert.assertEquals(flagAsString, "mf");
-        Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
-    }
-
-    @Test
-    public void testMateForwardStrandOnlyOnPairsFlags() {
-        final int flagAsInteger = SAMFlag.READ_PAIRED.flag;
-        final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
-        Assert.assertEquals(flagAsString, "mfMFp");
-        Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
-    }
-
-    @Test
-    public void testFlagTypesParsing() {
-        Assert.assertEquals(SamFlagField.of("0"), SamFlagField.DECIMAL);
-        Assert.assertEquals(SamFlagField.of("1234"), SamFlagField.DECIMAL);
-        Assert.assertEquals(SamFlagField.of("0xDOESNOTMATTER"), SamFlagField.HEXADECIMAL);
-        Assert.assertEquals(SamFlagField.of("0x"), SamFlagField.HEXADECIMAL);
-        Assert.assertEquals(SamFlagField.of("0[^x]DOESNOTMATTER"), SamFlagField.OCTAL);
-        Assert.assertEquals(SamFlagField.of("0a"), SamFlagField.OCTAL);
-        Assert.assertEquals(SamFlagField.of("DOESNOTMATTER"), SamFlagField.STRING);
-    }
-
-    @Test
-    public void testFlagTypesFormatting() {
-
-        Assert.assertEquals(SamFlagField.DECIMAL.format(1), "1");
-        Assert.assertEquals(SamFlagField.DECIMAL.format(124), "124");
-
-        Assert.assertEquals(SamFlagField.HEXADECIMAL.format(1), "0x1");
-        Assert.assertEquals(SamFlagField.HEXADECIMAL.format(9), "0x9");
-        Assert.assertEquals(SamFlagField.HEXADECIMAL.format(10), "0xa");
-        Assert.assertEquals(SamFlagField.HEXADECIMAL.format(16), "0x10");
-
-        Assert.assertEquals(SamFlagField.OCTAL.format(1), "01");
-        Assert.assertEquals(SamFlagField.OCTAL.format(124), "0174");
-
-        Assert.assertEquals(SamFlagField.STRING.format(337), "mrMFp1s");
-    }
-    
-    @Test(expectedExceptions = SAMFormatException.class)
-    public void testIllegalStringFlagCharacter(){
-        SamFlagField.STRING.parse("HELLO WORLD");
-    }
-
-    @Test(expectedExceptions = SAMFormatException.class)
-    public void testIllegalHexadecimalFlagCharacter(){
-        SamFlagField.HEXADECIMAL.parse("HELLO WORLD");
-    }
-
-    @Test(expectedExceptions = SAMFormatException.class)
-    public void testIllegalStringFlagCharacterExclamation(){
-        SamFlagField.STRING.parse("pmMr!F1s");
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/SamHeaderRecordComparatorTest.java b/src/test/java/htsjdk/samtools/SamHeaderRecordComparatorTest.java
deleted file mode 100644
index c11be38..0000000
--- a/src/test/java/htsjdk/samtools/SamHeaderRecordComparatorTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * The MIT License
- * <p/>
- * Copyright (c) 2014 The Broad Institute
- * <p/>
- * 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:
- * <p/>
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * <p/>
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class SamHeaderRecordComparatorTest {
-
-	@DataProvider(name="UsualSuspects")
-	public Object[][] createData() {
-		final SAMReadGroupRecord left = new SAMReadGroupRecord("left");
-		left.setPlatformUnit("left.1");
-		left.setLibrary("library");
-
-		final SAMReadGroupRecord right = new SAMReadGroupRecord("right");
-		right.setPlatformUnit("right.1");
-		right.setLibrary("library");
-		right.setDescription("description");
-
-		return new Object[][] {{ left, right }};
-	}
-
-	@Test(dataProvider="UsualSuspects")
-	public void testEqualRecords(final SAMReadGroupRecord left, final SAMReadGroupRecord right) {
-		final SAMHeaderRecordComparator<SAMReadGroupRecord> comparator = new SAMHeaderRecordComparator<SAMReadGroupRecord>(SAMReadGroupRecord.PLATFORM_UNIT_TAG);
-		Assert.assertEquals(0, comparator.compare(left, left)); // see what I did there?
-	}
-
-	@Test(dataProvider="UsualSuspects")
-	public void testUnequalRecords(final SAMReadGroupRecord left, final SAMReadGroupRecord right) {
-		final SAMHeaderRecordComparator<SAMReadGroupRecord> comparator = new SAMHeaderRecordComparator<SAMReadGroupRecord>(SAMReadGroupRecord.PLATFORM_UNIT_TAG);
-		Assert.assertTrue(comparator.compare(left, right) < 0);
-		Assert.assertTrue(comparator.compare(right, left) > 0);
-	}
-
-	@Test(dataProvider="UsualSuspects")
-	public void testNullAttributes(final SAMReadGroupRecord left, final SAMReadGroupRecord right) {
-		final SAMHeaderRecordComparator<SAMReadGroupRecord> comparator = new SAMHeaderRecordComparator<SAMReadGroupRecord>(SAMReadGroupRecord.FLOW_ORDER_TAG);
-		Assert.assertEquals(0, comparator.compare(left, right)); // neither record has this attribute
-	}
-
-	@Test(dataProvider="UsualSuspects")
-	public void testOneNullAttribute(final SAMReadGroupRecord left, final SAMReadGroupRecord right) {
-		final SAMHeaderRecordComparator<SAMReadGroupRecord> comparator = new SAMHeaderRecordComparator<SAMReadGroupRecord>(SAMReadGroupRecord.DESCRIPTION_TAG);
-		Assert.assertTrue(comparator.compare(left, right) < 0);
-		Assert.assertTrue(comparator.compare(right, left) > 0);
-	}
-}
diff --git a/src/test/java/htsjdk/samtools/SamIndexesTest.java b/src/test/java/htsjdk/samtools/SamIndexesTest.java
deleted file mode 100644
index d13001f..0000000
--- a/src/test/java/htsjdk/samtools/SamIndexesTest.java
+++ /dev/null
@@ -1,193 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIEntry;
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableMemoryStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.IOUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.zip.GZIPOutputStream;
-
-public class SamIndexesTest {
-
-    @Test
-    public void testEmptyBai() throws IOException {
-        final File baiFile = File.createTempFile("test", ".bai");
-        baiFile.deleteOnExit();
-        final FileOutputStream fos = new FileOutputStream(baiFile);
-        fos.write(SamIndexes.BAI.magic);
-        fos.close();
-
-
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        baos.write(SamIndexes.BAI.magic);
-        baos.close();
-
-        final InputStream inputStream = SamIndexes.asBaiStreamOrNull(new ByteArrayInputStream(baos.toByteArray()), null);
-        for (final byte b : SamIndexes.BAI.magic) {
-            Assert.assertEquals(inputStream.read(), 0xFF & b);
-        }
-    }
-
-    @Test(expectedExceptions = NullPointerException.class)
-    public void testCraiRequiresDictionary() throws IOException {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final GZIPOutputStream gos = new GZIPOutputStream(baos);
-        gos.close();
-
-        SamIndexes.asBaiStreamOrNull(new ByteArrayInputStream(baos.toByteArray()), null);
-    }
-
-    @Test
-    public void testEmptyCraiReadAsBai() throws IOException {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final GZIPOutputStream gos = new GZIPOutputStream(baos);
-        gos.close();
-
-        final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
-        dictionary.addSequence(new SAMSequenceRecord("1", 100));
-        final InputStream inputStream = SamIndexes.asBaiStreamOrNull(new ByteArrayInputStream(baos.toByteArray()), dictionary);
-        for (final byte b : SamIndexes.BAI.magic) {
-            Assert.assertEquals(inputStream.read(), 0xFF & b);
-        }
-    }
-
-    @Test
-    public void testCraiInMemory() throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-        SAMFileHeader header = new SAMFileHeader();
-        header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-        CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(baos, header);
-        final CRAIEntry entry = new CRAIEntry();
-        entry.sequenceId = 0;
-        entry.alignmentStart = 1;
-        entry.alignmentSpan = 2;
-        entry.sliceOffset = 3;
-        entry.sliceSize = 4;
-        entry.containerStartOffset = 5;
-        indexer.addEntry(entry);
-        indexer.finish();
-        baos.close();
-
-        final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
-        dictionary.addSequence(new SAMSequenceRecord("1", 100));
-
-        final InputStream baiStream = SamIndexes.asBaiStreamOrNull(new ByteArrayInputStream(baos.toByteArray()), dictionary);
-        Assert.assertNotNull(baiStream);
-
-        baos = new ByteArrayOutputStream();
-        IOUtil.copyStream(baiStream, baos);
-        final CachingBAMFileIndex bamIndex = new CachingBAMFileIndex(new SeekableMemoryStream(baos.toByteArray(), null), dictionary);
-        final BAMFileSpan span = bamIndex.getSpanOverlapping(entry.sequenceId, entry.alignmentStart, entry.alignmentStart);
-        Assert.assertNotNull(span);
-        final long[] coordinateArray = span.toCoordinateArray();
-        Assert.assertEquals(coordinateArray.length, 2);
-        Assert.assertEquals(coordinateArray[0] >> 16, entry.containerStartOffset);
-        Assert.assertEquals(coordinateArray[1] & 0xFFFF, 1);
-    }
-
-    @Test
-    public void testCraiFromFile() throws IOException {
-        final File file = File.createTempFile("test", ".crai");
-        file.deleteOnExit();
-        final FileOutputStream fos = new FileOutputStream(file);
-
-        SAMFileHeader header = new SAMFileHeader();
-        header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-        CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(fos, header);
-        final CRAIEntry entry = new CRAIEntry();
-        entry.sequenceId = 0;
-        entry.alignmentStart = 1;
-        entry.alignmentSpan = 2;
-        entry.sliceOffset = 3;
-        entry.sliceSize = 4;
-        entry.containerStartOffset = 5;
-        indexer.addEntry(entry);
-        indexer.finish();
-        fos.close();
-
-        final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
-        dictionary.addSequence(new SAMSequenceRecord("1", 100));
-
-        final SeekableStream baiStream = SamIndexes.asBaiSeekableStreamOrNull(new SeekableFileStream(file), dictionary);
-        Assert.assertNotNull(baiStream);
-
-        final CachingBAMFileIndex bamIndex = new CachingBAMFileIndex(baiStream, dictionary);
-        final BAMFileSpan span = bamIndex.getSpanOverlapping(entry.sequenceId, entry.alignmentStart, entry.alignmentStart);
-        Assert.assertNotNull(span);
-        final long[] coordinateArray = span.toCoordinateArray();
-        Assert.assertEquals(coordinateArray.length, 2);
-        Assert.assertEquals(coordinateArray[0] >> 16, entry.containerStartOffset);
-        Assert.assertEquals(coordinateArray[1] & 0xFFFF, 1);
-    }
-
-    @Test(expectedExceptions = NullPointerException.class)
-    public void testOpenIndexFileAsBaiOrNull_NPE() throws IOException {
-        final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
-        dictionary.addSequence(new SAMSequenceRecord("1", 100));
-        Assert.assertNull(SamIndexes.openIndexFileAsBaiOrNull(null, dictionary));
-    }
-
-    @Test
-    public void testOpenIndexFileAsBaiOrNull_ReturnsNull() throws IOException {
-        final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
-        dictionary.addSequence(new SAMSequenceRecord("1", 100));
-        File file = File.createTempFile("test", ".notbai");
-        file.deleteOnExit();
-        Assert.assertNull(SamIndexes.openIndexFileAsBaiOrNull(file, dictionary));
-        file.delete();
-
-        file = File.createTempFile("test", ".notcrai");
-        file.deleteOnExit();
-        Assert.assertNull(SamIndexes.openIndexFileAsBaiOrNull(file, dictionary));
-        file.delete();
-    }
-
-    @Test
-    public void testOpenIndexUrlAsBaiOrNull() throws IOException {
-        final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
-        dictionary.addSequence(new SAMSequenceRecord("1", 100));
-
-        final File file = File.createTempFile("test", ".crai");
-        file.deleteOnExit();
-        final FileOutputStream fos = new FileOutputStream(file);
-        SAMFileHeader header = new SAMFileHeader();
-        header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-        CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(fos, header);
-        final CRAIEntry entry = new CRAIEntry();
-        entry.sequenceId = 0;
-        entry.alignmentStart = 1;
-        entry.alignmentSpan = 2;
-        entry.sliceOffset = 3;
-        entry.sliceSize = 4;
-        entry.containerStartOffset = 5;
-        indexer.addEntry(entry);
-        indexer.finish();
-        fos.close();
-
-        final InputStream baiStream = SamIndexes.openIndexUrlAsBaiOrNull(file.toURI().toURL(), dictionary);
-        Assert.assertNotNull(baiStream);
-
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        IOUtil.copyStream(baiStream, baos);
-        final CachingBAMFileIndex bamIndex = new CachingBAMFileIndex(new SeekableMemoryStream(baos.toByteArray(), null), dictionary);
-        final BAMFileSpan span = bamIndex.getSpanOverlapping(entry.sequenceId, entry.alignmentStart, entry.alignmentStart);
-        Assert.assertNotNull(span);
-        final long[] coordinateArray = span.toCoordinateArray();
-        Assert.assertEquals(coordinateArray.length, 2);
-        Assert.assertEquals(coordinateArray[0] >> 16, entry.containerStartOffset);
-        Assert.assertEquals(coordinateArray[1] & 0xFFFF, 1);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SamPairUtilTest.java b/src/test/java/htsjdk/samtools/SamPairUtilTest.java
deleted file mode 100644
index 80841c9..0000000
--- a/src/test/java/htsjdk/samtools/SamPairUtilTest.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.SamPairUtil.SetMateInfoIterator;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class SamPairUtilTest {
-
-    @Test(dataProvider = "testGetPairOrientation")
-    public void testGetPairOrientation(final String testName,
-                                       final int read1Start, final int read1Length, final boolean read1Reverse,
-                                       final int read2Start, final int read2Length, final boolean read2Reverse,
-                                       final SamPairUtil.PairOrientation expectedOrientation) {
-        final SAMFileHeader header = new SAMFileHeader();
-        header.addSequence(new SAMSequenceRecord("chr1", 100000000));
-        final SAMRecord rec1 = makeSamRecord(header, read1Start, read1Length, read1Reverse, true);
-        final SAMRecord rec2 = makeSamRecord(header, read2Start, read2Length, read2Reverse, false);
-        SamPairUtil.setMateInfo(rec1, rec2, true);
-        Assert.assertEquals(SamPairUtil.getPairOrientation(rec1), expectedOrientation, testName + " first end");
-        Assert.assertEquals(SamPairUtil.getPairOrientation(rec2), expectedOrientation, testName + " second end");
-    }
-
-    @Test(dataProvider = "testSetMateInfoMateCigar")
-    public void testSetMateInfoMateCigar(final String testName,
-                                         final int read1Start, final boolean read1Reverse, final String read1Cigar,
-                                         final int read2Start, final boolean read2Reverse, final String read2Cigar) {
-        final SAMFileHeader header = new SAMFileHeader();
-        header.addSequence(new SAMSequenceRecord("chr1", 100000000));
-        final SAMRecord rec1 = makeSamRecord2(header, read1Start, read1Reverse, read1Cigar, true);
-        final SAMRecord rec2 = makeSamRecord2(header, read2Start, read2Reverse, read2Cigar, false);
-        SamPairUtil.setMateInfo(rec1, rec2, true);
-        Assert.assertEquals(SAMUtils.getMateCigarString(rec1), rec2.getCigarString(), testName + " first end");
-        Assert.assertEquals(SAMUtils.getMateCigarString(rec2), rec1.getCigarString(), testName + " second end");
-    }
-
-    private void testSetMateInfoMateCigarOnSupplementalsAddRecord(final List<SAMRecord> records, final List<String> mateCigarList, final SAMRecord record, final String mateCigar) {
-        records.add(record);
-        mateCigarList.add(mateCigar);
-    }
-
-    @Test(dataProvider = "testSetMateInfoMateCigarOnSupplementals")
-    public void testSetMateInfoMateCigarOnSupplementals(final String testName,
-                                                        final int read1Start, final boolean read1Reverse, final String read1Cigar,
-                                                        final int read1SupplementalStart, final boolean read1SupplementalReverse, final String read1SupplementalCigar,
-                                                        final int read2Start, final boolean read2Reverse, final String read2Cigar,
-                                                        final int read2SupplementalStart, final boolean read2SupplementalReverse, final String read2SupplementalCigar
-    ) {
-        final SAMFileHeader header = new SAMFileHeader();
-        header.addSequence(new SAMSequenceRecord("chr1", 100000000));
-
-        final List<SAMRecord> records = new ArrayList<SAMRecord>();
-        final List<String> mateCigarList = new ArrayList<String>();
-        final SAMRecord rec;
-
-
-        int numIterations = 10;
-        boolean isPaired = (0 < read1Start && 0 < read2Start);
-        for (int i = 0; i < numIterations; i++) {
-            final String readName = "READ" + i;
-            testSetMateInfoMateCigarOnSupplementalsAddRecord(records, mateCigarList, makeSamRecord3(header, read1Start, read1Reverse, read1Cigar, true, readName, isPaired, false), read2Cigar);
-            if (0 < read1SupplementalStart) {
-                testSetMateInfoMateCigarOnSupplementalsAddRecord(records, mateCigarList, makeSamRecord3(header, read1SupplementalStart, read1SupplementalReverse, read1SupplementalCigar, true, readName, isPaired, true), read2Cigar);
-            }
-            if (0 < read2Start) {
-                testSetMateInfoMateCigarOnSupplementalsAddRecord(records, mateCigarList, makeSamRecord3(header, read2Start, read2Reverse, read2Cigar, false, readName, isPaired, false), read1Cigar);
-            }
-            if (0 < read2SupplementalStart) {
-                testSetMateInfoMateCigarOnSupplementalsAddRecord(records, mateCigarList, makeSamRecord3(header, read2SupplementalStart, read2SupplementalReverse, read2SupplementalCigar, false, readName, isPaired, true), read1Cigar);
-            }
-        }
-
-        // Count the number of mate cigars we expect to add
-        int expectedNumberOfMateCigarsAdded = 0;
-        for (final String mateCigar : mateCigarList) {
-            if (null != mateCigar) expectedNumberOfMateCigarsAdded++;
-        }
-
-        int i = 0;
-        SetMateInfoIterator iterator = new SetMateInfoIterator(records.iterator(), true);
-        while (iterator.hasNext()) {
-            final SAMRecord record = iterator.next();
-            final Cigar mateCigar = SAMUtils.getMateCigar(record);
-            final String mateCigarString = (null == mateCigar) ? null : mateCigar.toString();
-            Assert.assertEquals(mateCigarString, mateCigarList.get(i), testName);
-            i++;
-        }
-
-        Assert.assertEquals(expectedNumberOfMateCigarsAdded, iterator.getNumMateCigarsAdded(), testName);
-
-        iterator.close();
-    }
-
-    private SAMRecord makeSamRecord(final SAMFileHeader header, final int alignmentStart, final int readLength,
-                                    final boolean reverse, final boolean firstOfPair) {
-        final SAMRecord rec = new SAMRecord(header);
-        rec.setReferenceIndex(0);
-        final StringBuilder sb = new StringBuilder();
-        final byte[] quals = new byte[readLength];
-        for (int i = 0; i < readLength; ++i) {
-            sb.append("A");
-            quals[i] = 20;
-        }
-        rec.setReadString(sb.toString());
-        rec.setBaseQualities(quals);
-        rec.setAlignmentStart(alignmentStart);
-        rec.setCigarString(readLength + "M");
-        rec.setReadPairedFlag(true);
-        rec.setReadNegativeStrandFlag(reverse);
-        if (firstOfPair) rec.setFirstOfPairFlag(true);
-        else rec.setSecondOfPairFlag(true);
-        return rec;
-    }
-
-    private SAMRecord makeSamRecord2(final SAMFileHeader header, final int alignmentStart, boolean reverse,
-                                     String cigarString, final boolean firstOfPair) {
-        return makeSamRecord3(header, alignmentStart, reverse, cigarString, firstOfPair, null, true, false);
-    }
-
-    private SAMRecord makeSamRecord3(final SAMFileHeader header, final int alignmentStart, boolean reverse,
-                                     String cigarString, final boolean firstOfPair, final String name, final boolean isPaired, final boolean isSupplemental) {
-        final SAMRecord rec = new SAMRecord(header);
-        final StringBuilder sb = new StringBuilder();
-        final Cigar cigar = TextCigarCodec.decode(cigarString);
-        final int readLength = cigar.getReadLength();
-        rec.setReferenceIndex(0);
-        final byte[] quals = new byte[readLength];
-        for (int i = 0; i < readLength; ++i) {
-            sb.append("A");
-            quals[i] = 20;
-        }
-        rec.setReadString(sb.toString());
-        rec.setBaseQualities(quals);
-        rec.setAlignmentStart(alignmentStart);
-        rec.setCigar(cigar);
-        rec.setReadNegativeStrandFlag(reverse);
-        if (isPaired) {
-            rec.setReadPairedFlag(true);
-            if (firstOfPair) rec.setFirstOfPairFlag(true);
-            else rec.setSecondOfPairFlag(true);
-        }
-        if (null != name) rec.setReadName(name);
-        rec.setSupplementaryAlignmentFlag(isSupplemental);
-        return rec;
-    }
-
-    @DataProvider(name = "testGetPairOrientation")
-    public Object[][] testGetPairOrientationDataProvider() {
-        /**
-         * @param testName
-         * @param read1Start
-         * @param read1Length
-         * @param read1Reverse
-         * @param read2Start
-         * @param read2Length
-         * @param read2Reverse
-         * @param expectedOrientation
-         */
-        return new Object[][]{
-                {"normal innie", 1, 100, false, 500, 100, true, SamPairUtil.PairOrientation.FR},
-                {"overlapping innie", 1, 100, false, 50, 100, true, SamPairUtil.PairOrientation.FR},
-                {"second end enclosed innie", 1, 100, false, 50, 50, true, SamPairUtil.PairOrientation.FR},
-                {"first end enclosed innie", 1, 50, false, 1, 100, true, SamPairUtil.PairOrientation.FR},
-                {"completely overlapping innie", 1, 100, false, 1, 100, true, SamPairUtil.PairOrientation.FR},
-                {"normal outie", 1, 100, true, 500, 100, false, SamPairUtil.PairOrientation.RF},
-                {"nojump outie", 1, 100, true, 101, 100, false, SamPairUtil.PairOrientation.RF},
-                {"forward tandem", 1, 100, true, 500, 100, true, SamPairUtil.PairOrientation.TANDEM},
-                {"reverse tandem", 1, 100, false, 500, 100, false, SamPairUtil.PairOrientation.TANDEM},
-                {"overlapping forward tandem", 1, 100, true, 50, 100, true, SamPairUtil.PairOrientation.TANDEM},
-                {"overlapping reverse tandem", 1, 100, false, 50, 100, false, SamPairUtil.PairOrientation.TANDEM},
-                {"second end enclosed forward tandem", 1, 100, true, 50, 50, true, SamPairUtil.PairOrientation.TANDEM},
-                {"second end enclosed reverse tandem", 1, 100, false, 50, 50, false, SamPairUtil.PairOrientation.TANDEM},
-                {"first end enclosed forward tandem", 1, 50, true, 1, 100, true, SamPairUtil.PairOrientation.TANDEM},
-                {"first end enclosed reverse tandem", 1, 50, false, 1, 100, false, SamPairUtil.PairOrientation.TANDEM},
-        };
-    }
-
-    @DataProvider(name = "testSetMateInfoMateCigar")
-    public Object[][] testSetMateInfoMateCigarDataProvider() {
-        /**
-         * @param testName
-         * @param read1Start
-         * @param read1Reverse
-         * @param read1Cigar
-         * @param read2Start
-         * @param read2Reverse
-         * @param read2Cigar
-         */
-        return new Object[][]{
-                {"50M/50M", 1, false, "50M", 500, true, "50M"},
-                {"50M/25M5I20M", 1, false, "50M", 500, true, "25M5I20M"},
-                {"25M5I20M/50M", 1, false, "25M5I20M", 500, true, "50M"},
-                {"50M/25M5D20M", 1, false, "50M", 500, true, "25M5D20M"},
-                {"25M5D20M/50M", 1, false, "25M5D20M", 500, true, "50M"},
-        };
-    }
-
-    @DataProvider(name = "testSetMateInfoMateCigarOnSupplementals")
-    public Object[][] testSetMateInfoMateCigarOnSupplementalsDataProvider() {
-        /**
-         * @param testName
-         * @param read1Start
-         * @param read1Reverse
-         * @param read1Cigar
-         * @param read1SupplementalStart
-         * @param read1SupplementalReverse
-         * @param read1SupplementalCigar
-         * @param read2Start
-         * @param read2Reverse
-         * @param read2Cigar
-         * @param read2SupplementalStart
-         * @param read2SupplementalReverse
-         * @param read2SupplementalCigar
-         * */
-        return new Object[][]{
-                {"fragment", 1, false, "50M", -1, false, null, -1, false, null, -1, false, null},
-                {"fragment with supplemental", 1, false, "50M", 10, false, "50M", -1, false, null, -1, false, null},
-                {"pair", 1, false, "50M", -1, false, null, 1, false, "20M", -1, false, null},
-                {"pair first supplemental", 1, false, "50M", 10, false, "50M", 1, false, "20M", -1, false, null},
-                {"pair second supplemental", 1, false, "50M", -1, false, null, 1, false, "20M", 10, false, "50M"},
-                {"pair both supplemental", 1, false, "50M", 10, false, "50M", 1, false, "20M", 10, false, "50M"}
-        };
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java b/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java
deleted file mode 100644
index 31ad5c2..0000000
--- a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java
+++ /dev/null
@@ -1,468 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.seekablestream.ISeekableStreamFactory;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableHTTPStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import htsjdk.samtools.util.*;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-public class SamReaderFactoryTest {
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
-    private static final Log LOG = Log.getInstance(SamReaderFactoryTest.class);
-
-    @Test(dataProvider = "variousFormatReaderTestCases")
-    public void variousFormatReaderTest(final String inputFile) throws IOException {
-        final File input = new File(TEST_DATA_DIR, inputFile);
-        final SamReader reader = SamReaderFactory.makeDefault().open(input);
-        for (final SAMRecord ignored : reader) {
-        }
-        reader.close();
-    }
-
-    private int countRecordsInQueryInterval(final SamReader reader, final QueryInterval query) {
-        final SAMRecordIterator iter = reader.queryOverlapping(new QueryInterval[] { query });
-        int count = 0;
-        while (iter.hasNext()) {
-            iter.next();
-            count++;
-        }
-        iter.close();
-        return count;
-    }
-
-    private int countRecords(final SamReader reader) {
-        int count = 0;
-        try (final SAMRecordIterator iter = reader.iterator()) {
-            while (iter.hasNext()) {
-                iter.next();
-                count++;
-            }
-        }
-        return count;
-    }
-
-    // See https://github.com/samtools/htsjdk/issues/76
-    @Test(dataProvider = "queryIntervalIssue76TestCases")
-    public void queryIntervalIssue76(final String sequenceName, final int start, final int end, final int expectedCount) throws IOException {
-        final File input = new File(TEST_DATA_DIR, "issue76.bam");
-        final SamReader reader = SamReaderFactory.makeDefault().open(input);
-        final QueryInterval interval = new QueryInterval(reader.getFileHeader().getSequence(sequenceName).getSequenceIndex(), start, end);
-        Assert.assertEquals(countRecordsInQueryInterval(reader, interval), expectedCount);
-        reader.close();
-    }
-
-    @DataProvider(name = "queryIntervalIssue76TestCases")
-    public Object[][] queryIntervalIssue76TestCases() {
-        return new Object[][]{
-                {"1", 11966, 11966, 2},
-                {"1", 11966, 11967, 2},
-                {"1", 11967, 11967, 1}
-        };
-    }
-
-    @DataProvider(name = "variousFormatReaderTestCases")
-    public Object[][] variousFormatReaderTestCases() {
-        return new Object[][]{
-                {"block_compressed.sam.gz"},
-                {"uncompressed.sam"},
-                {"compressed.sam.gz"},
-                {"compressed.bam"},
-                {"unsorted.sam"}
-        };
-    }
-
-    // Tests for the SAMRecordFactory usage
-    class SAMRecordFactoryTester extends DefaultSAMRecordFactory {
-        int samRecordsCreated;
-        int bamRecordsCreated;
-
-        public SAMRecord createSAMRecord(final SAMFileHeader header) {
-            ++samRecordsCreated;
-            return super.createSAMRecord(header);
-        }
-
-        public BAMRecord createBAMRecord(final SAMFileHeader header, final int referenceSequenceIndex, final int alignmentStart, final short readNameLength, final short mappingQuality, final int indexingBin, final int cigarLen, final int flags, final int readLen, final int mateReferenceSequenceIndex, final int mateAlignmentStart, final int insertSize, final byte[] variableLengthBlock) {
-            ++bamRecordsCreated;
-            return super.createBAMRecord(header, referenceSequenceIndex, alignmentStart, readNameLength, mappingQuality, indexingBin, cigarLen, flags, readLen, mateReferenceSequenceIndex, mateAlignmentStart, insertSize, variableLengthBlock);
-        }
-    }
-
-    @Test(dataProvider = "variousFormatReaderTestCases")
-    public void samRecordFactoryTest(final String inputFile) throws IOException {
-        final File input = new File(TEST_DATA_DIR, inputFile);
-
-        final SAMRecordFactoryTester recordFactory = new SAMRecordFactoryTester();
-        final SamReaderFactory readerFactory = SamReaderFactory.makeDefault().samRecordFactory(recordFactory);
-        final SamReader reader = readerFactory.open(input);
-
-        int i = 0;
-        for (final SAMRecord ignored : reader) {
-            ++i;
-        }
-        reader.close();
-
-        Assert.assertTrue(i > 0);
-        if (inputFile.endsWith(".sam") || inputFile.endsWith(".sam.gz")) Assert.assertEquals(recordFactory.samRecordsCreated, i);
-        else if (inputFile.endsWith(".bam")) Assert.assertEquals(recordFactory.bamRecordsCreated, i);
-    }
-
-    @Test(expectedExceptions=IllegalStateException.class)
-    public void samRecordFactoryNullHeaderBAMTest() {
-        final SAMRecordFactory recordFactory = new DefaultSAMRecordFactory();
-        recordFactory.createBAMRecord(
-                null, // null header
-                0,
-                0,
-                (short) 0,
-                (short) 0,
-                0,
-                0,
-                0,
-                0,
-                0,
-                0,
-                0,
-                null);
-    }
-
-
-    /**
-     * Unit tests for asserting all permutations of data and index sources read the same records and header.
-     */
-    final File localBam = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
-    final File localBamIndex = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai");
-
-    final URL bamUrl, bamIndexUrl;
-
-    {
-        try {
-            bamUrl = new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam");
-            bamIndexUrl = new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam.bai");
-        } catch (final MalformedURLException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @DataProvider
-    public Object[][] composeAllPermutationsOfSamInputResource() {
-        final List<SamInputResource> sources = new ArrayList<SamInputResource>();
-        for (final InputResource.Type dataType : InputResource.Type.values()) {
-            if (dataType.equals(InputResource.Type.SRA_ACCESSION))
-                continue;
-
-            sources.add(new SamInputResource(composeInputResourceForType(dataType, false)));
-            for (final InputResource.Type indexType : InputResource.Type.values()) {
-                if (indexType.equals(InputResource.Type.SRA_ACCESSION))
-                    continue;
-
-                sources.add(new SamInputResource(
-                        composeInputResourceForType(dataType, false),
-                        composeInputResourceForType(indexType, true)
-                ));
-            }
-        }
-        final Object[][] data = new Object[sources.size()][];
-        for (final SamInputResource source : sources) {
-            data[sources.indexOf(source)] = new Object[]{source};
-        }
-
-        return data;
-    }
-
-    private InputResource composeInputResourceForType(final InputResource.Type type, final boolean forIndex) {
-        final File f = forIndex ? localBamIndex : localBam;
-        final URL url = forIndex ? bamIndexUrl : bamUrl;
-        switch (type) {
-            case FILE:
-                return new FileInputResource(f);
-            case PATH:
-                return new PathInputResource(f.toPath());
-            case URL:
-                return new UrlInputResource(url);
-            case SEEKABLE_STREAM:
-                return new SeekableStreamInputResource(new SeekableHTTPStream(url));
-            case INPUT_STREAM:
-                try {
-                    return new InputStreamInputResource(new FileInputStream(f));
-                } catch (final FileNotFoundException e) {
-                    throw new RuntimeIOException(e);
-                }
-            default:
-                throw new IllegalStateException();
-        }
-    }
-
-    final Set<SAMFileHeader> observedHeaders = new HashSet<SAMFileHeader>();
-    final Set<List<SAMRecord>> observedRecordOrdering = new HashSet<List<SAMRecord>>();
-
-    @Test(dataProvider = "composeAllPermutationsOfSamInputResource")
-    public void exhaustInputResourcePermutation(final SamInputResource resource) throws IOException {
-        final SamReader reader = SamReaderFactory.makeDefault().open(resource);
-        LOG.info(String.format("Reading from %s ...", resource));
-        final List<SAMRecord> slurped = Iterables.slurp(reader);
-        final SAMFileHeader fileHeader = reader.getFileHeader();
-        reader.hasIndex();
-        reader.indexing().hasBrowseableIndex();
-        reader.close();
-        
-        /* Ensure all tests have read the same records in the same order or, if this is the first test, set it as the template. */
-        observedHeaders.add(fileHeader);
-        observedRecordOrdering.add(slurped);
-        Assert.assertEquals(observedHeaders.size(), 1, "read different headers than other testcases");
-        Assert.assertEquals(observedRecordOrdering.size(), 1, "read different records than other testcases");
-    }
-
-    @Test
-    public void openPath() throws IOException {
-        final Path path = localBam.toPath();
-        final List<SAMRecord> records;
-        final SAMFileHeader fileHeader;
-        try (final SamReader reader = SamReaderFactory.makeDefault().open(path)) {
-            LOG.info(String.format("Reading from %s ...", path));
-            records = Iterables.slurp(reader);
-            fileHeader = reader.getFileHeader();
-            reader.close();
-        }
-
-        try (final SamReader fileReader = SamReaderFactory.makeDefault().open(localBam)) {
-            final List<SAMRecord> expectedRecords = Iterables.slurp(fileReader);
-            final SAMFileHeader expectedFileHeader = fileReader.getFileHeader();
-            Assert.assertEquals(records, expectedRecords);
-            Assert.assertEquals(fileHeader, expectedFileHeader);
-        }
-    }
-
-
-    final Set<List<SAMRecord>> observedRecordOrdering1 = new HashSet<List<SAMRecord>>();
-    final Set<List<SAMRecord>> observedRecordOrdering3 = new HashSet<List<SAMRecord>>();
-    final Set<List<SAMRecord>> observedRecordOrdering20 = new HashSet<List<SAMRecord>>();
-
-    @Test(dataProvider = "composeAllPermutationsOfSamInputResource")
-    public void queryInputResourcePermutation(final SamInputResource resource) throws IOException {
-        final SamReader reader = SamReaderFactory.makeDefault().open(resource);
-        LOG.info(String.format("Query from %s ...", resource));
-        if (reader.hasIndex()) {
-            final StopWatch stopWatch = new StopWatch();
-            stopWatch.start();
-            final SAMRecordIterator q1 = reader.query("chr1", 500000, 100000000, true);
-            observedRecordOrdering1.add(Iterables.slurp(q1));
-            q1.close();
-            final SAMRecordIterator q20 = reader.query("chr20", 1, 1000000, true);
-            observedRecordOrdering20.add(Iterables.slurp(q20));
-            q20.close();
-            final SAMRecordIterator q3 = reader.query("chr3", 1, 10000000, true);
-            observedRecordOrdering3.add(Iterables.slurp(q3));
-            q3.close();
-            stopWatch.stop();
-            LOG.info(String.format("Finished queries in %sms", stopWatch.getElapsedTime()));
-
-            Assert.assertEquals(observedRecordOrdering1.size(), 1, "read different records for chromosome 1");
-            Assert.assertEquals(observedRecordOrdering20.size(), 1, "read different records for chromosome 20");
-            Assert.assertEquals(observedRecordOrdering3.size(), 1, "read different records for chromosome 3");
-        } else if (resource.indexMaybe() != null) {
-            LOG.warn("Resource has an index source, but is not indexed: " + resource);
-        } else {
-            LOG.info("Skipping query operation: no index.");
-        }
-        reader.close();
-    }
-
-
-    /**
-     * A path that pretends it's not based upon a file.  This helps in cases where we want to test branches
-     * that apply to non-file based paths without actually having to use non-file based resources (like cloud urls)
-     */
-    private static class NeverFilePathInputResource extends PathInputResource {
-        public NeverFilePathInputResource(Path pathResource) {
-            super(pathResource);
-        }
-
-        @Override
-        public File asFile() {
-            return null;
-        }
-    }
-
-    @Test
-    public void checkHasIndexForStreamingPathBamWithFileIndex() throws IOException {
-        InputResource bam = new NeverFilePathInputResource(localBam.toPath());
-        InputResource index = new FileInputResource(localBamIndex);
-
-        // ensure that the index is being used, not checked in queryInputResourcePermutation
-        try (final SamReader reader = SamReaderFactory.makeDefault().open(new SamInputResource(bam, index))) {
-            Assert.assertTrue(reader.hasIndex());
-        }
-    }
-
-    @Test
-    public void queryStreamingPathBamWithFileIndex() throws IOException {
-        InputResource bam = new NeverFilePathInputResource(localBam.toPath());
-        InputResource index = new FileInputResource(localBamIndex);
-
-        final SamInputResource resource = new SamInputResource(bam, index);
-        queryInputResourcePermutation(new SamInputResource(bam, index));
-    }
-
-    @Test
-    public void customReaderFactoryTest() throws IOException {
-        try {
-          CustomReaderFactory.setInstance(new CustomReaderFactory(
-              "https://www.googleapis.com/genomics/v1beta/reads/," +
-              "htsjdk.samtools.SamReaderFactoryTest$TestReaderFactory"));
-          final SamReader reader = SamReaderFactory.makeDefault().open(
-              SamInputResource.of(
-              "https://www.googleapis.com/genomics/v1beta/reads/?uncompressed.sam"));
-          int i = 0;
-          for (@SuppressWarnings("unused") final SAMRecord ignored : reader) {
-              ++i;
-          }
-          reader.close();
-  
-          Assert.assertTrue(i > 0);
-        } finally {
-          CustomReaderFactory.resetToDefaultInstance();
-        }
-    }
-    
-    public static class TestReaderFactory implements CustomReaderFactory.ICustomReaderFactory {
-      @Override
-      public SamReader open(URL url) {
-        final File file = new File(TEST_DATA_DIR, url.getQuery());
-        LOG.info("Opening customr reader for " + file.toString());
-        return SamReaderFactory.makeDefault().open(file);
-      }
-    }
-    
-    @Test
-    public void inputResourceFromStringTest() throws IOException {
-      Assert.assertEquals(SamInputResource.of("http://test.url").data().type(),
-          InputResource.Type.URL);
-      Assert.assertEquals(SamInputResource.of("https://test.url").data().type(),
-          InputResource.Type.URL);
-      Assert.assertEquals(SamInputResource.of("ftp://test.url").data().type(),
-          InputResource.Type.URL);
-      Assert.assertEquals(SamInputResource.of("/a/b/c").data().type(),
-          InputResource.Type.FILE);
-    }
-
-    @Test
-    public void testCRAMReaderFromURL() throws IOException {
-        // get a CRAM reader with an index from a URL-backed resource
-        getCRAMReaderFromInputResource(
-                (cramURL, indexURL) -> { return SamInputResource.of(cramURL).index(indexURL);},
-                true,
-                3);
-    }
-
-    @Test
-    public void testCRAMReaderFromURLStream() throws IOException {
-        // get a CRAM reader with an index from a stream-backed resource created from a URL
-        getCRAMReaderFromInputResource(
-                (cramURL, indexURL) -> {
-                    try {
-                        ISeekableStreamFactory streamFactory = SeekableStreamFactory.getInstance();
-                        return SamInputResource
-                                .of(streamFactory.getStreamFor(cramURL))
-                                .index(streamFactory.getStreamFor(indexURL));
-                    }
-                    catch (IOException e) {
-                        throw new RuntimeIOException(e);
-                    }
-                },
-                true,
-                3);
-    }
-
-    @Test
-    public void testCRAMReaderFromURLNoIndexFile() throws IOException {
-        // get just a CRAM reader (no index) from an URL-backed resource
-        getCRAMReaderFromInputResource(
-                (cramURL, indexURL) -> { return SamInputResource.of(cramURL); },
-            false,
-            11);
-    }
-
-    @Test(expectedExceptions=RuntimeIOException.class)
-    public void testCRAMReaderFromURLBadIndexFile() throws IOException {
-        // deliberately specify a bad index file to ensure we get an IOException
-        getCRAMReaderFromInputResource(
-                (cramURL, indexURL) -> { return SamInputResource.of(cramURL).index(new File("nonexistent.bai")); },
-            true,
-            3);
-    }
-
-    private void getCRAMReaderFromInputResource(
-            final BiFunction<URL, URL, SamInputResource> getInputResource,
-            final boolean hasIndex,
-            final int expectedCount) throws IOException {
-        final String cramFilePath = new File(TEST_DATA_DIR, "cram_with_bai_index.cram").getAbsolutePath();
-        final String cramIndexPath = new File(TEST_DATA_DIR, "cram_with_bai_index.cram.bai").getAbsolutePath();
-        final URL cramURL = new URL("file://" + cramFilePath);
-        final URL indexURL = new URL("file://" + cramIndexPath);
-
-        final SamReaderFactory factory = SamReaderFactory.makeDefault()
-                .referenceSource(new ReferenceSource(new File(TEST_DATA_DIR, "hg19mini.fasta")))
-                .validationStringency(ValidationStringency.SILENT);
-        final SamReader reader = factory.open(getInputResource.apply(cramURL, indexURL));
-
-        int count = hasIndex ?
-            countRecordsInQueryInterval(reader, new QueryInterval(1, 10, 1000)) :
-            countRecords(reader);
-        Assert.assertEquals(count, expectedCount);
-    }
-
-    @Test
-    public void testSamReaderFromSeekableStream() throws IOException {
-        // even though a SAM isn't indexable, make sure we can open one
-        // using a seekable stream
-        final File samFile = new File(TEST_DATA_DIR, "unsorted.sam");
-        final SamReaderFactory factory = SamReaderFactory.makeDefault()
-                .validationStringency(ValidationStringency.SILENT);
-        final SamReader reader = factory.open(
-                SamInputResource.of(new SeekableFileStream(samFile)));
-        Assert.assertEquals(countRecords(reader), 10);
-    }
-
-
-    @Test
-    public void testSamReaderFromURL() throws IOException {
-        final String samFilePath = new File(TEST_DATA_DIR, "unsorted.sam").getAbsolutePath();
-        final URL samURL = new URL("file://" + samFilePath);
-        final SamReaderFactory factory = SamReaderFactory.makeDefault()
-                .validationStringency(ValidationStringency.SILENT);
-        final SamReader reader = factory.open(SamInputResource.of(samURL));
-        Assert.assertEquals(countRecords(reader), 10);
-    }
-
-    @Test(expectedExceptions=SAMFormatException.class)
-    public void testSamReaderFromMalformedSeekableStream() throws IOException {
-        // use a bogus (.bai file) to force SamReaderFactory to fall through to the
-        // fallback code that assumes a SAM File when it can't determine the
-        // format of the input, to ensure that it results in a SAMFormatException
-        final File samFile = new File(TEST_DATA_DIR, "cram_with_bai_index.cram.bai");
-        final SamReaderFactory factory = SamReaderFactory.makeDefault()
-                .validationStringency(ValidationStringency.SILENT);
-        final SamReader reader = factory.open(
-                SamInputResource.of(new SeekableFileStream(samFile)));
-        countRecords(reader);
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SamReaderSortTest.java b/src/test/java/htsjdk/samtools/SamReaderSortTest.java
deleted file mode 100755
index 584410f..0000000
--- a/src/test/java/htsjdk/samtools/SamReaderSortTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package htsjdk.samtools;
-
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Tests for the implementation of {@link SAMRecordIterator} in {@link SamReader}
- *
- * @author ktibbett at broadinstitute.org
- */
-public class SamReaderSortTest {
-
-    public static final String COORDINATE_SORTED_FILE = "src/test/resources/htsjdk/samtools/coordinate_sorted.sam";
-    public static final String QUERYNAME_SORTED_FILE = "src/test/resources/htsjdk/samtools/queryname_sorted.sam";
-    public static final String QUERYNAME_SORTED_NO_HEADER_SORT = "src/test/resources/htsjdk/samtools/unsorted.sam";
-
-    @Test(expectedExceptions = IllegalStateException.class)
-    public void testSortsDisagree() throws Exception {
-        SAMRecordIterator it = SamReaderFactory.makeDefault().open(new File(COORDINATE_SORTED_FILE)).iterator();
-        try {
-            it.assertSorted(SAMFileHeader.SortOrder.queryname);
-            while (it.hasNext()) {
-                it.next();
-            }
-            Assert.fail("Queryname assertion should have failed on coordinate sorted file but didn't");
-        } finally {
-            it.close();
-        }
-    }
-
-    @Test(dataProvider = "validSorts")
-    public void testSortAssertionValid(String file, SAMFileHeader.SortOrder order) {
-        SAMRecordIterator it = SamReaderFactory.makeDefault().open(new File(file)).iterator();
-        try {
-            it.assertSorted(order);
-            while (it.hasNext()) {
-                it.next();
-            }
-        } finally {
-            it.close();
-        }
-    }
-
-    @DataProvider(name = "validSorts")
-    public Object[][] getValidSorts() {
-        return new Object[][]{
-                {COORDINATE_SORTED_FILE, SAMFileHeader.SortOrder.coordinate},
-                {QUERYNAME_SORTED_FILE, SAMFileHeader.SortOrder.queryname},
-                {QUERYNAME_SORTED_NO_HEADER_SORT, SAMFileHeader.SortOrder.queryname},
-                {COORDINATE_SORTED_FILE, SAMFileHeader.SortOrder.unsorted}
-        };
-    }
-
-
-    @Test(dataProvider = "invalidSorts", expectedExceptions = IllegalStateException.class)
-    public void testSortAssertionFails(String file, SAMFileHeader.SortOrder order) throws Exception {
-        SAMRecordIterator it = SamReaderFactory.makeDefault().open(new File(file)).iterator();
-        try {
-            it.assertSorted(order);
-            while (it.hasNext()) {
-                it.next();
-            }
-            Assert.fail("Iterated successfully over " + file + " with invalid sort assertion: " + order.name());
-        } finally {
-            it.close();
-        }
-    }
-
-    @DataProvider(name = "invalidSorts")
-    public Object[][] getInvalidSorts() {
-        return new Object[][]{
-                {QUERYNAME_SORTED_NO_HEADER_SORT, SAMFileHeader.SortOrder.coordinate}
-        };
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/SamReaderTest.java b/src/test/java/htsjdk/samtools/SamReaderTest.java
deleted file mode 100644
index 093dffb..0000000
--- a/src/test/java/htsjdk/samtools/SamReaderTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-public class SamReaderTest {
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
-    @Test(dataProvider = "variousFormatReaderTestCases")
-    public void variousFormatReaderTest(final String inputFile) {
-        final File input = new File(TEST_DATA_DIR, inputFile);
-        final SamReader reader = SamReaderFactory.makeDefault().open(input);
-        for (final SAMRecord rec : reader) {
-        }
-        CloserUtil.close(reader);
-    }
-
-    @DataProvider(name = "variousFormatReaderTestCases")
-    public Object[][] variousFormatReaderTestCases() {
-        final Object[][] scenarios = new Object[][]{
-                {"block_compressed.sam.gz"},
-                {"uncompressed.sam"},
-                {"compressed.sam.gz"},
-                {"compressed.bam"},
-        };
-        return scenarios;
-    }
-
-    // tests for CRAM indexing
-
-    @Test(dataProvider = "SmallCRAMTest")
-    public void CRAMIndexTest(final String inputFile, final String referenceFile, QueryInterval queryInterval, String expectedReadName) {
-        final File input = new File(TEST_DATA_DIR, inputFile);
-        final File reference = new File(TEST_DATA_DIR, referenceFile);
-        final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(input);
-        Assert.assertTrue(reader.hasIndex());
-
-        final CloseableIterator<SAMRecord> iterator = reader.query(new QueryInterval[]{queryInterval}, false);
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord r1 = iterator.next();
-        Assert.assertEquals(r1.getReadName(), expectedReadName);
-
-        CloserUtil.close(reader);
-    }
-
-    @DataProvider(name = "SmallCRAMTest")
-    public Object[][] CRAMIndexTestData() {
-        final Object[][] testFiles = new Object[][]{
-                {"cram/test.cram", "cram/auxf.fa", new QueryInterval(0, 12, 13), "Jim"},
-                {"cram_with_bai_index.cram", "hg19mini.fasta", new QueryInterval(3, 700, 0), "k"},
-                {"cram_with_crai_index.cram", "hg19mini.fasta", new QueryInterval(2, 350, 0), "i"},
-        };
-        return testFiles;
-    }
-
-    @Test(dataProvider = "NoIndexCRAMTest")
-    public void CRAMNoIndexTest(final String inputFile, final String referenceFile) {
-        final File input = new File(TEST_DATA_DIR, inputFile);
-        final File reference = new File(TEST_DATA_DIR, referenceFile);
-        final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(input);
-        Assert.assertFalse(reader.hasIndex());
-        CloserUtil.close(reader);
-    }
-
-    @DataProvider(name = "NoIndexCRAMTest")
-    public Object[][] CRAMNoIndexTestData() {
-        final Object[][] testFiles = new Object[][]{
-                {"cram/test2.cram", "cram/auxf.fa"},
-        };
-        return testFiles;
-    }
-
-    // Tests for the SAMRecordFactory usage
-    class SAMRecordFactoryTester extends DefaultSAMRecordFactory {
-        int samRecordsCreated;
-        int bamRecordsCreated;
-
-        public SAMRecord createSAMRecord(final SAMFileHeader header) {
-            ++samRecordsCreated;
-            return super.createSAMRecord(header);
-        }
-
-        public BAMRecord createBAMRecord(final SAMFileHeader header, final int referenceSequenceIndex, final int alignmentStart, final short readNameLength, final short mappingQuality, final int indexingBin, final int cigarLen, final int flags, final int readLen, final int mateReferenceSequenceIndex, final int mateAlignmentStart, final int insertSize, final byte[] variableLengthBlock) {
-            ++bamRecordsCreated;
-            return super.createBAMRecord(header, referenceSequenceIndex, alignmentStart, readNameLength, mappingQuality, indexingBin, cigarLen, flags, readLen, mateReferenceSequenceIndex, mateAlignmentStart, insertSize, variableLengthBlock);
-        }
-    }
-
-    @Test(dataProvider = "variousFormatReaderTestCases")
-    public void samRecordFactoryTest(final String inputFile) {
-        final File input = new File(TEST_DATA_DIR, inputFile);
-        final SAMRecordFactoryTester factory = new SAMRecordFactoryTester();
-        final SamReader reader = SamReaderFactory.makeDefault().samRecordFactory(factory).open(input);
-
-        int i = 0;
-        for (final SAMRecord rec : reader) {
-            ++i;
-        }
-        CloserUtil.close(reader);
-
-        Assert.assertTrue(i > 0);
-        if (inputFile.endsWith(".sam") || inputFile.endsWith(".sam.gz")) Assert.assertEquals(factory.samRecordsCreated, i);
-        else if (inputFile.endsWith(".bam")) Assert.assertEquals(factory.bamRecordsCreated, i);
-    }
-
-    @Test(dataProvider = "cramTestCases", expectedExceptions=IllegalStateException.class)
-    public void testReferenceRequiredForCRAM(final String inputFile, final String ignoredReferenceFile) {
-        final File input = new File(TEST_DATA_DIR, inputFile);
-        final SamReader reader = SamReaderFactory.makeDefault().open(input);
-        for (final SAMRecord rec : reader) {
-        }
-        CloserUtil.close(reader);
-    }
-
-    @DataProvider(name = "cramTestCases")
-    public Object[][] cramTestPositiveCases() {
-        final Object[][] scenarios = new Object[][]{
-                {"cram_with_bai_index.cram", "hg19mini.fasta"},
-                {"cram_with_crai_index.cram", "hg19mini.fasta"},
-        };
-        return scenarios;
-    }
-
-    @Test(dataProvider = "cramTestCases")
-    public void testIterateCRAMWithIndex(final String inputFile, final String referenceFile) {
-        final File input = new File(TEST_DATA_DIR, inputFile);
-        final File reference = new File(TEST_DATA_DIR, referenceFile);
-        final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(input);
-        for (final SAMRecord rec : reader) {
-        }
-        CloserUtil.close(reader);
-    }
-
-    @Test
-    public void samRecordFactoryNullHeaderTest() {
-        final SAMRecordFactory factory = new DefaultSAMRecordFactory();
-        final SAMRecord samRec = factory.createSAMRecord(null);
-        Assert.assertTrue(samRec.getHeader() == null);
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SamSpecIntTest.java b/src/test/java/htsjdk/samtools/SamSpecIntTest.java
deleted file mode 100644
index 8305065..0000000
--- a/src/test/java/htsjdk/samtools/SamSpecIntTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class SamSpecIntTest {
-    private static final File SAM_INPUT = new File("src/test/resources/htsjdk/samtools/inttest.sam");
-    private static final File BAM_INPUT = new File("src/test/resources/htsjdk/samtools/inttest.bam");
-
-    @Test
-    public void testSamIntegers() throws IOException {
-        final List<String> errorMessages = new ArrayList<String>();
-        final SamReader samReader = SamReaderFactory.makeDefault().open(SAM_INPUT);
-        final File bamOutput = File.createTempFile("test", ".bam");
-        final File samOutput = File.createTempFile("test", ".sam");
-        final SAMFileWriter samWriter = new SAMFileWriterFactory().makeWriter(samReader.getFileHeader(), true, samOutput, null);
-        final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeWriter(samReader.getFileHeader(), true, bamOutput, null);
-
-        final SAMRecordIterator iterator = samReader.iterator();
-        while (iterator.hasNext()) {
-            try {
-                final SAMRecord rec = iterator.next();
-                samWriter.addAlignment(rec);
-                bamWriter.addAlignment(rec);
-            } catch (final Throwable e) {
-                System.out.println(e.getMessage());
-                errorMessages.add(e.getMessage());
-            }
-        }
-
-        CloserUtil.close(samReader);
-        samWriter.close();
-        bamWriter.close();
-        Assert.assertEquals(errorMessages.size(), 0);
-        bamOutput.deleteOnExit();
-        samOutput.deleteOnExit();
-    }
-
-    @Test
-    public void testBamIntegers() throws IOException {
-        final List<String> errorMessages = new ArrayList<String>();
-        final SamReader bamReader = SamReaderFactory.makeDefault().open(BAM_INPUT);
-        final File bamOutput = File.createTempFile("test", ".bam");
-        final File samOutput = File.createTempFile("test", ".sam");
-        final SAMFileWriter samWriter = new SAMFileWriterFactory().makeWriter(bamReader.getFileHeader(), true, samOutput, null);
-        final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeWriter(bamReader.getFileHeader(), true, bamOutput, null);
-        final SAMRecordIterator iterator = bamReader.iterator();
-        while (iterator.hasNext()) {
-            try {
-                final SAMRecord rec = iterator.next();
-                samWriter.addAlignment(rec);
-                bamWriter.addAlignment(rec);
-            } catch (final Throwable e) {
-                System.out.println(e.getMessage());
-                errorMessages.add(e.getMessage());
-            }
-        }
-
-        CloserUtil.close(bamReader);
-        samWriter.close();
-        bamWriter.close();
-        Assert.assertEquals(errorMessages.size(), 0);
-        bamOutput.deleteOnExit();
-        samOutput.deleteOnExit();
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SamStreamsTest.java b/src/test/java/htsjdk/samtools/SamStreamsTest.java
deleted file mode 100644
index c92d6db..0000000
--- a/src/test/java/htsjdk/samtools/SamStreamsTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.*;
-import java.net.URL;
-
-public class SamStreamsTest {
-
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
-    @Test(dataProvider = "makeData")
-    public void testDataFormat(final String inputFile, final boolean isGzippedSAMFile, final boolean isBAMFile, final boolean isCRAMFile) throws Exception {
-        final File input = new File(TEST_DATA_DIR, inputFile);
-        try(final InputStream fis = new BufferedInputStream(new FileInputStream(input))) { //must be buffered or the isGzippedSAMFile will blow up
-            Assert.assertEquals(SamStreams.isGzippedSAMFile(fis), isGzippedSAMFile, "isGzippedSAMFile:" + inputFile);
-            Assert.assertEquals(SamStreams.isBAMFile(fis), isBAMFile,   "isBAMFile:" + inputFile);
-            Assert.assertEquals(SamStreams.isCRAMFile(fis), isCRAMFile, "isCRAMFile:" + inputFile);
-        }
-    }
-
-    @DataProvider(name = "makeData")
-    public Object[][] makeData() {
-        final Object[][] scenarios = new Object[][]{
-                //isGzippedSAMFile isBAMFile isCRAMFile
-                {"block_compressed.sam.gz", true,  false, false},
-                {"uncompressed.sam",        false, false, false},
-                {"compressed.sam.gz",       true,  false, false},
-                {"compressed.bam",          true,  true,  false}, //this is slightly weird (responding true to isGzippedSAMFile)
-                {"cram_query_sorted.cram",  false, false, true},
-        };
-        return scenarios;
-    }
-
-    @DataProvider(name = "sourceLikeCram")
-    public Object[][] sourceLikeCramData() {
-        return new Object[][] {
-                {"cram_with_bai_index.cram", true, true },
-                {"compressed.bam", true, false },
-                {"unsorted.sam", true, false },
-                // fails due to https://github.com/samtools/htsjdk/issues/618
-                //{"ftp://ftp.broadinstitute.org/dummy.cram", false, true}
-                {"http://www.broadinstitute.org/dummy.cram", false, true},
-                {"https://www.broadinstitute.org/dummy.cram", false, true},
-                {"http://www.broadinstitute.org/dummy.cram?alt=media", false, true},
-                {"http://www.broadinstitute.org/test?file=my.cram", false, true},
-                {"http://www.broadinstitute.org/test?foo=bar,file=my.cram", false, true},
-                {"http://www.broadinstitute.org/test?file=my.bam", false, false}
-        };
-    }
-
-    @Test(dataProvider = "sourceLikeCram")
-    public void sourceLikeCram(
-            final String resourceName,
-            final boolean isFile,
-            final boolean expected) throws IOException
-    {
-        SeekableStream strm = isFile ?
-            new SeekableFileStream(new File(TEST_DATA_DIR, resourceName)) :
-            SeekableStreamFactory.getInstance().getStreamFor(new URL(resourceName));
-        Assert.assertEquals(SamStreams.sourceLikeCram(strm), expected);
-    }
-
-
-    @DataProvider(name = "sourceLikeBam")
-    public Object[][] sourceLikeBamData() {
-        return new Object[][] {
-                {"cram_with_bai_index.cram", true, false },
-                {"compressed.bam", true, true },
-                {"unsorted.sam", true, false },
-                // fails due to a combination of https://github.com/samtools/htsjdk/issues/619 and
-                // https://github.com/samtools/htsjdk/issues/618
-                //{"ftp://ftp.broadinstitute.org/dummy.cram", false, false},
-                {"ftp://ftp.broadinstitute.org/dummy.bam", false, true},
-                {"http://www.broadinstitute.org/dummy.bam", false, true},
-                {"https://www.broadinstitute.org/dummy.bam", false, true},
-                {"http://www.broadinstitute.org/dummy.bam?alt=media", false, true},
-                {"http://www.broadinstitute.org/test?file=my.bam", false, true},
-                {"http://www.broadinstitute.org/test?foo=bar,file=my.bam", false, true},
-                {"http://www.broadinstitute.org/test?file=my.cram", false, false}
-        };
-    }
-
-    @Test(dataProvider = "sourceLikeBam")
-    public void sourceLikeBam(
-            final String resourceName,
-            final boolean isFile,
-            final boolean expected) throws IOException
-    {
-        SeekableStream strm = isFile ?
-                new SeekableFileStream(new File(TEST_DATA_DIR, resourceName)) :
-                SeekableStreamFactory.getInstance().getStreamFor(new URL(resourceName));
-        Assert.assertEquals(SamStreams.sourceLikeBam(strm), expected);
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/SequenceNameTruncationAndValidationTest.java b/src/test/java/htsjdk/samtools/SequenceNameTruncationAndValidationTest.java
deleted file mode 100644
index 2c3a95c..0000000
--- a/src/test/java/htsjdk/samtools/SequenceNameTruncationAndValidationTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Test new functionality that truncates sequence names at first whitespace in order to deal
- * with older BAMs that had spaces in sequence names.
- *
- * @author alecw at broadinstitute.org
- */
-public class SequenceNameTruncationAndValidationTest {
-    private static File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
-    @Test(expectedExceptions = {SAMException.class}, dataProvider = "badSequenceNames")
-    public void testSequenceRecordThrowsWhenInvalid(final String sequenceName) {
-        new SAMSequenceRecord(sequenceName, 123);
-        Assert.fail("Should not reach here.");
-    }
-
-    @DataProvider(name = "badSequenceNames")
-    public Object[][] badSequenceNames() {
-        return new Object[][]{
-                {" "},
-                {"\t"},
-                {"\n"},
-                {"="},
-                {"Hi, Mom!"}
-        };
-    }
-
-    @Test(dataProvider = "goodSequenceNames")
-    public void testSequenceRecordPositiveTest(final String sequenceName) {
-        new SAMSequenceRecord(sequenceName, 123);
-    }
-
-    @DataProvider(name = "goodSequenceNames")
-    public Object[][] goodSequenceNames() {
-        return new Object[][]{
-                {"Hi, at Mom!"}
-        };
-    }
-
-    @Test(dataProvider = "samFilesWithSpaceInSequenceName")
-    public void testSamSequenceTruncation(final String filename) {
-        final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, filename));
-        for (final SAMSequenceRecord sequence : reader.getFileHeader().getSequenceDictionary().getSequences()) {
-            Assert.assertFalse(sequence.getSequenceName().contains(" "), sequence.getSequenceName());
-        }
-        for (final SAMRecord rec : reader) {
-            Assert.assertFalse(rec.getReferenceName().contains(" "));
-        }
-        CloserUtil.close(reader);
-    }
-
-    @DataProvider(name = "samFilesWithSpaceInSequenceName")
-    public Object[][] samFilesWithSpaceInSequenceName() {
-        return new Object[][]{
-                {"sequenceWithSpace.sam"},
-                {"sequenceWithSpace.bam"}
-        };
-    }
-
-    @Test(expectedExceptions = {SAMFormatException.class})
-    public void testBadRname() {
-        final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, "readWithBadRname.sam"));
-        for (final SAMRecord rec : reader) {
-        }
-        Assert.fail("Should not reach here.");
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/ValidateSamFileTest.java b/src/test/java/htsjdk/samtools/ValidateSamFileTest.java
deleted file mode 100644
index 4ce0b7a..0000000
--- a/src/test/java/htsjdk/samtools/ValidateSamFileTest.java
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009-2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.BamIndexValidator.IndexValidationStringency;
-import htsjdk.samtools.metrics.MetricBase;
-import htsjdk.samtools.metrics.MetricsFile;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.Histogram;
-import htsjdk.samtools.util.StringUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.nio.channels.FileChannel;
-import java.nio.file.StandardOpenOption;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.LineNumberReader;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-
-/**
- * Tests almost all error conditions detected by the sam file validator. The
- * conditions not tested are proactively prevented by sam generation code.
- *
- * @author Doug Voet
- */
-public class ValidateSamFileTest {
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/ValidateSamFileTest");
-    private static final int TERMINATION_GZIP_BLOCK_SIZE = 28;
-    private static final int RANDOM_NUMBER_TRUNC_BYTE = 128;
-
-    @Test
-    public void testValidSamFile() throws Exception {
-        final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(new File(TEST_DATA_DIR, "valid.sam"));
-        final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertTrue(results.isEmpty());
-    }
-
-    @Test
-    public void testSamFileVersion1pt5() throws Exception {
-        final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(new File(TEST_DATA_DIR, "test_samfile_version_1pt5.bam"));
-        final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertTrue(results.isEmpty());
-    }
-
-    @Test
-    public void testSortOrder() throws IOException {
-        Histogram<String> results = executeValidation(SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
-                .open(new File(TEST_DATA_DIR, "invalid_coord_sort_order.sam")), null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertEquals(results.get(SAMValidationError.Type.RECORD_OUT_OF_ORDER.getHistogramString()).getValue(), 1.0);
-        results = executeValidation(SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
-                .open(new File(TEST_DATA_DIR, "invalid_queryname_sort_order.sam")), null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertEquals(results.get(SAMValidationError.Type.RECORD_OUT_OF_ORDER.getHistogramString()).getValue(), 5.0);
-    }
-
-    @Test
-    public void testVerbose() throws IOException {
-        final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
-        for (int i = 0; i < 20; i++) {
-            samBuilder.addFrag(String.valueOf(i), 1, i, false);
-        }
-        for (final SAMRecord record : samBuilder) {
-            record.setProperPairFlag(true);
-        }
-
-        final StringWriter results = new StringWriter();
-        final SamFileValidator validator = new SamFileValidator(new PrintWriter(results), 8000);
-        validator.setVerbose(true, 10);
-        validator.validateSamFileVerbose(samBuilder.getSamReader(), null);
-
-        final int lineCount = results.toString().split("\n").length;
-        Assert.assertEquals(lineCount, 11);
-    }
-
-    @Test
-    public void testUnpairedRecords() throws IOException {
-        final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
-        for (int i = 0; i < 6; i++) {
-            samBuilder.addFrag(String.valueOf(i), i, i, false);
-        }
-        final Iterator<SAMRecord> records = samBuilder.iterator();
-        records.next().setProperPairFlag(true);
-        records.next().setMateUnmappedFlag(true);
-        records.next().setMateNegativeStrandFlag(true);
-        records.next().setFirstOfPairFlag(true);
-        records.next().setSecondOfPairFlag(true);
-        records.next().setMateReferenceIndex(1);
-
-        final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
-
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_PROPER_PAIR.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_MATE_UNMAPPED.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_MATE_NEG_STRAND.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_FIRST_OF_PAIR.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_SECOND_OF_PAIR.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_MATE_REF_INDEX.getHistogramString()).getValue(), 1.0);
-    }
-
-    @Test
-    public void testPairedRecords() throws IOException {
-        final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
-        for (int i = 0; i < 5; i++) {
-            samBuilder.addPair(String.valueOf(i), i, i, i + 100);
-        }
-        final Iterator<SAMRecord> records = samBuilder.iterator();
-        records.next().setMateReferenceName("*");
-        records.next().setMateAlignmentStart(Integer.MAX_VALUE);
-        records.next().setMateAlignmentStart(records.next().getAlignmentStart() + 1);
-        records.next().setMateNegativeStrandFlag(!records.next().getReadNegativeStrandFlag());
-        records.next().setMateReferenceIndex(records.next().getReferenceIndex() + 1);
-        records.next().setMateUnmappedFlag(!records.next().getReadUnmappedFlag());
-
-
-        final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
-
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_ALIGNMENT_START.getHistogramString()).getValue(), 3.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_MATE_UNMAPPED.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.MISMATCH_FLAG_MATE_NEG_STRAND.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.MISMATCH_FLAG_MATE_UNMAPPED.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.MISMATCH_MATE_ALIGNMENT_START.getHistogramString()).getValue(), 2.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.MISMATCH_MATE_REF_INDEX.getHistogramString()).getValue(), 2.0);
-    }
-
-    @Test(dataProvider = "missingMateTestCases")
-    public void testMissingMate(final SAMFileHeader.SortOrder sortOrder) throws IOException {
-        final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder(true, sortOrder);
-
-        samBuilder.addPair(String.valueOf(1), 1, 1, 101);
-        final Iterator<SAMRecord> records = samBuilder.iterator();
-        records.next();
-        records.remove();
-        final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
-
-        Assert.assertEquals(results.get(SAMValidationError.Type.MATE_NOT_FOUND.getHistogramString()).getValue(), 1.0);
-    }
-
-    @DataProvider(name = "missingMateTestCases")
-    public Object[][] missingMateTestCases() {
-        return new Object[][]{
-                {SAMFileHeader.SortOrder.coordinate},
-                {SAMFileHeader.SortOrder.queryname},
-                {SAMFileHeader.SortOrder.unsorted},
-        };
-    }
-
-    @Test
-    public void testUnmappedRecords() throws IOException {
-        final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
-        for (int i = 0; i < 4; i++) {
-            samBuilder.addUnmappedFragment(String.valueOf(i));
-        }
-        final Iterator<SAMRecord> records = samBuilder.iterator();
-        records.next().setReadNegativeStrandFlag(true);
-        records.next().setNotPrimaryAlignmentFlag(true);
-        records.next().setMappingQuality(10);
-        records.next().setCigarString("36M");
-
-        final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
-
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_NOT_PRIM_ALIGNMENT.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_MAPPING_QUALITY.getHistogramString()).getValue(), 1.0);
-    }
-
-    @Test
-    public void testMappedRecords() throws IOException {
-        final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
-        for (int i = 0; i < 2; i++) {
-            samBuilder.addFrag(String.valueOf(i), i, i, false);
-        }
-        final Iterator<SAMRecord> records = samBuilder.iterator();
-        records.next().setCigarString("25M3S25M");
-        records.next().setReferenceName("*");
-
-        final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
-
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_CIGAR.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_READ_UNMAPPED.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.MISSING_TAG_NM.getHistogramString()).getValue(), 1.0);
-    }
-
-    @Test
-    public void testNmFlagValidation() throws IOException {
-        final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
-        for (int i = 0; i < 3; i++) {
-            samBuilder.addFrag(String.valueOf(i), i, i + 1, false);
-        }
-        final Iterator<SAMRecord> records = samBuilder.iterator();
-        records.next().setAttribute(ReservedTagConstants.NM, 4);
-
-        // PIC-215: Confirm correct NM value when there is an insertion and a deletion.
-        final SAMRecord recordWithInsert = records.next();
-        final byte[] sequence = recordWithInsert.getReadBases();
-        Arrays.fill(sequence, (byte) 'A');
-        recordWithInsert.setReadBases(sequence);
-        recordWithInsert.setCigarString("1D" + Integer.toString(sequence.length - 1) + "M1I");
-        recordWithInsert.setAttribute(ReservedTagConstants.NM, 2);
-
-        final Histogram<String> results = executeValidation(samBuilder.getSamReader(), new ReferenceSequenceFile() {
-            private int index = 0;
-
-            public SAMSequenceDictionary getSequenceDictionary() {
-                return null;
-            }
-
-            public ReferenceSequence nextSequence() {
-                final byte[] bases = new byte[10000];
-                Arrays.fill(bases, (byte) 'A');
-                return new ReferenceSequence("foo", index++, bases);
-            }
-
-            public void reset() {
-                this.index = 0;
-            }
-
-            public boolean isIndexed() { return false; }
-
-            public ReferenceSequence getSequence(final String contig) {
-                throw new UnsupportedOperationException();
-            }
-
-            public ReferenceSequence getSubsequenceAt(final String contig, final long start, final long stop) {
-                throw new UnsupportedOperationException();
-            }
-
-            @Override
-            public void close() throws IOException {
-                //no-op
-            }
-        }, IndexValidationStringency.EXHAUSTIVE);
-
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_TAG_NM.getHistogramString()).getValue(), 1.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.MISSING_TAG_NM.getHistogramString()).getValue(), 1.0);
-    }
-
-    @Test(dataProvider = "testMateCigarScenarios")
-    public void testMateCigarScenarios(final String scenario, final String inputFile, final SAMValidationError.Type expectedError)
-            throws Exception {
-        final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, inputFile));
-        final Histogram<String> results = executeValidation(reader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertNotNull(results.get(expectedError.getHistogramString()));
-        Assert.assertEquals(results.get(expectedError.getHistogramString()).getValue(), 1.0);
-    }
-
-
-    @DataProvider(name = "testMateCigarScenarios")
-    public Object[][] testMateCigarScenarios() {
-        return new Object[][]{
-                {"invalid mate cigar", "invalid_mate_cigar_string.sam", SAMValidationError.Type.MISMATCH_MATE_CIGAR_STRING},
-                {"inappropriate mate cigar", "inappropriate_mate_cigar_string.sam", SAMValidationError.Type.MATE_CIGAR_STRING_INVALID_PRESENCE}
-        };
-    }
-
-    @Test(dataProvider = "testTruncatedScenarios")
-    public void testTruncated(final String scenario, final String inputFile, final SAMValidationError.Type expectedError)
-            throws Exception {
-        final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(new File(TEST_DATA_DIR, inputFile));
-        final Histogram<String> results = executeValidation(reader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertNotNull(results.get(expectedError.getHistogramString()));
-        Assert.assertEquals(results.get(expectedError.getHistogramString()).getValue(), 1.0);
-    }
-
-    @DataProvider(name = "testTruncatedScenarios")
-    public Object[][] testTruncatedScenarios() {
-        return new Object[][]{
-                {"truncated bam", "truncated.bam", SAMValidationError.Type.TRUNCATED_FILE},
-                {"truncated quals", "truncated_quals.sam", SAMValidationError.Type.MISMATCH_READ_LENGTH_AND_QUALS_LENGTH},
-                // TODO: Because validation is turned off when parsing, this error is not detectable currently by validator.
-                //{"truncated tag", "truncated_tag.sam", SAMValidationError.Type.TRUNCATED_FILE},
-                // TODO: Currently, this is not considered an error.  Should it be?
-                //{"hanging tab", "hanging_tab.sam", SAMValidationError.Type.TRUNCATED_FILE},
-        };
-    }
-
-    @Test(expectedExceptions = SAMException.class, dataProvider = "testFatalParsingErrors")
-    public void testFatalParsingErrors(final String scenario, final String inputFile) throws Exception {
-        final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, inputFile));
-        executeValidation(reader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.fail("Exception should have been thrown.");
-    }
-
-    @DataProvider(name = "testFatalParsingErrors")
-    public Object[][] testFatalParsingErrorScenarios() {
-        return new Object[][]{
-                {"missing fields", "missing_fields.sam"},
-                {"zero length read", "zero_length_read.sam"}
-        };
-    }
-
-    @Test
-    public void testHeaderVersionValidation() throws Exception {
-        final String header = "@HD	VN:Hi,Mom!	SO:queryname";
-        final InputStream strm = new ByteArrayInputStream(StringUtil.stringToBytes(header));
-        final SamReader samReader = SamReaderFactory.makeDefault().open(SamInputResource.of(strm));
-        final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_VERSION_NUMBER.getHistogramString()).getValue(), 1.0);
-    }
-
-    @Test(enabled = false, description = "File is actually valid for Standard quality scores so this test fails with an NPE.")
-    public void testQualityFormatValidation() throws Exception {
-        final SamReader samReader = SamReaderFactory.makeDefault().open(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/illumina-as-standard.bam"));
-        final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        final Histogram.Bin<String> bin = results.get(SAMValidationError.Type.INVALID_QUALITY_FORMAT.getHistogramString());
-        final double value = bin.getValue();
-        Assert.assertEquals(value, 1.0);
-    }
-
-    @Test
-    public void testCigarOffEndOfReferenceValidation() throws Exception {
-        final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-        samBuilder.addFrag(String.valueOf(0), 0, 1, false);
-        final int contigLength = samBuilder.getHeader().getSequence(0).getSequenceLength();
-        // Should hang off the end.
-        samBuilder.addFrag(String.valueOf(1), 0, contigLength - 1, false);
-        final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertNotNull(results.get(SAMValidationError.Type.CIGAR_MAPS_OFF_REFERENCE.getHistogramString()));
-        Assert.assertEquals(results.get(SAMValidationError.Type.CIGAR_MAPS_OFF_REFERENCE.getHistogramString()).getValue(), 1.0);
-    }
-
-    @Test(expectedExceptions = SAMFormatException.class)
-    public void testConflictingTags() throws Exception {
-        final String header = "@HD	VN:1.0	SO:queryname	SO:coordinate";
-        final InputStream strm = new ByteArrayInputStream(StringUtil.stringToBytes(header));
-        final SamReader reader = SamReaderFactory.makeDefault().open(SamInputResource.of(strm));
-        Assert.fail("Exception should have been thrown.");
-    }
-
-    @Test
-    public void testRedundantTags() throws Exception {
-        final String header = "@HD	VN:1.0	SO:coordinate	SO:coordinate";
-        final InputStream strm = new ByteArrayInputStream(StringUtil.stringToBytes(header));
-        final SamReader samReader = SamReaderFactory.makeDefault().open(SamInputResource.of(strm));
-        Assert.assertEquals(SAMFileHeader.SortOrder.coordinate, samReader.getFileHeader().getSortOrder());
-        CloserUtil.close(samReader);
-    }
-
-    @Test
-    public void testHeaderValidation() throws Exception {
-        final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
-                .open(new File(TEST_DATA_DIR, "buggyHeader.sam"));
-        final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertEquals(results.get(SAMValidationError.Type.UNRECOGNIZED_HEADER_TYPE.getHistogramString()).getValue(), 3.0);
-        Assert.assertEquals(results.get(SAMValidationError.Type.HEADER_TAG_MULTIPLY_DEFINED.getHistogramString()).getValue(), 1.0);
-    }
-
-    @Test
-    public void testPlatformMissing() throws Exception {
-        final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
-                .open((new File(TEST_DATA_DIR, "missing_platform_unit.sam")));
-        final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertEquals(results.get(SAMValidationError.Type.MISSING_PLATFORM_VALUE.getHistogramString()).getValue(), 1.0);
-    }
-    
-    @Test
-    public void testPlatformInvalid() throws Exception {
-        final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
-                .open((new File(TEST_DATA_DIR, "invalid_platform_unit.sam")));
-        final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_PLATFORM_VALUE.getHistogramString()).getValue(), 1.0);
-    }
-
-    @Test
-    public void testDuplicateRGIDs() throws Exception {
-        final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
-                .open((new File(TEST_DATA_DIR, "duplicate_rg.sam")));
-        final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertEquals(results.get(SAMValidationError.Type.DUPLICATE_READ_GROUP_ID.getHistogramString()).getValue(), 1.0);
-    }
-
-    @Test
-    public void testIndexFileValidation() throws Exception {
-        final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
-                .enable(SamReaderFactory.Option.CACHE_FILE_BASED_INDEXES).open((new File(TEST_DATA_DIR, "bad_index.bam")));
-
-        Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_INDEX_FILE_POINTER.getHistogramString()).getValue(), 1.0);
-
-        results = executeValidation(samReader, null, IndexValidationStringency.LESS_EXHAUSTIVE);
-        Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_INDEX_FILE_POINTER.getHistogramString()).getValue(), 1.0);
-
-    }
-
-    private void testHeaderVersion(final String version, final boolean expectValid) throws Exception {
-        final File samFile = File.createTempFile("validateHeader.", ".sam");
-        samFile.deleteOnExit();
-        final PrintWriter pw = new PrintWriter(samFile);
-        pw.println("@HD\tVN:" + version);
-        pw.close();
-        final SamReader reader = SamReaderFactory.makeDefault().open(samFile);
-        final Histogram<String> results = executeValidation(reader, null, IndexValidationStringency.EXHAUSTIVE);
-        if (expectValid) Assert.assertNull(results.get(SAMValidationError.Type.INVALID_VERSION_NUMBER.getHistogramString()));
-        else {
-            Assert.assertNotNull(results.get(SAMValidationError.Type.INVALID_VERSION_NUMBER.getHistogramString()));
-            Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_VERSION_NUMBER.getHistogramString()).getValue(), 1.0);
-        }
-    }
-
-    @Test
-    public void testHeaderVersions() throws Exception {
-        // Test the acceptable versions
-        for (final String version : SAMFileHeader.ACCEPTABLE_VERSIONS) {
-            testHeaderVersion(version, true);
-        }
-
-        // Test an unacceptable version
-        testHeaderVersion("1.6", false);
-    }
-
-    @Test(enabled = false)
-    public void duplicateReads() throws Exception {
-        final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(new File(TEST_DATA_DIR, "duplicated_reads.sam"));
-        final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertFalse(results.isEmpty());
-        Assert.assertEquals(results.get(SAMValidationError.Type.MATES_ARE_SAME_END.getHistogramString()).getValue(), 2.0);
-    }
-
-    @Test
-    public void duplicateReadsOutOfOrder() throws Exception {
-        final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(new File(TEST_DATA_DIR, "duplicated_reads_out_of_order.sam"));
-        final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertFalse(results.isEmpty());
-        Assert.assertEquals(results.get(SAMValidationError.Type.MATES_ARE_SAME_END.getHistogramString()).getValue(), 2.0);
-    }
-
-
-    @DataProvider(name = "TagCorrectlyProcessData")
-    public Object[][] tagCorrectlyProcessData() throws IOException {
-        final String E2TagCorrectlyProcessTestData =
-                "@HD\tVN:1.0\tSO:unsorted\n" +
-                        "@SQ\tSN:chr1\tLN:101\n" +
-                        "@RG\tID:0\tSM:Hi,Mom!\n" +
-                        "E\t147\tchr1\t15\t255\t10M\t=\t2\t-30\tCAACAGAAGC\t)'.*.+2,))\tE2:Z:CAA";
-
-        final String U2TagCorrectlyProcessTestData =
-                "@HD\tVN:1.0\tSO:unsorted\n" +
-                        "@SQ\tSN:chr1\tLN:101\n" +
-                        "@RG\tID:0\tSM:Hi,Mom!\n" +
-                        "E\t147\tchr1\t15\t255\t10M\t=\t2\t-30\tCAACAGAAGC\t)'.*.+2,))\tU2:Z:CAA";
-
-        return new Object[][]{
-                {E2TagCorrectlyProcessTestData.getBytes(), SAMValidationError.Type.E2_BASE_EQUALS_PRIMARY_BASE},
-                {E2TagCorrectlyProcessTestData.getBytes(), SAMValidationError.Type.MISMATCH_READ_LENGTH_AND_E2_LENGTH},
-                {U2TagCorrectlyProcessTestData.getBytes(), SAMValidationError.Type.MISMATCH_READ_LENGTH_AND_U2_LENGTH}
-        };
-    }
-
-    @Test(dataProvider = "TagCorrectlyProcessData")
-    public void tagCorrectlyProcessTest(byte[] bytesFromFile,
-                                        SAMValidationError.Type errorType) throws Exception {
-        final SamReader samReader = SamReaderFactory
-                .makeDefault()
-                .validationStringency(ValidationStringency.SILENT)
-                .open(
-                        SamInputResource.of(
-                                new ByteArrayInputStream(bytesFromFile)
-                        )
-                );
-        final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
-        Assert.assertEquals(results.get(errorType.getHistogramString()).getValue(), 1.0);
-    }
-
-    @DataProvider(name = "validateBamFileTerminationData")
-    public Object[][] validateBamFileTerminationData() throws IOException {
-        return new Object[][]{
-                {getBrokenFile(TERMINATION_GZIP_BLOCK_SIZE), SAMValidationError.Type.BAM_FILE_MISSING_TERMINATOR_BLOCK},
-                {getBrokenFile(RANDOM_NUMBER_TRUNC_BYTE), SAMValidationError.Type.TRUNCATED_FILE}
-        };
-    }
-
-    @Test(dataProvider = "validateBamFileTerminationData")
-    public void validateBamFileTerminationTest(File file, SAMValidationError.Type errorType) throws IOException {
-        final SamFileValidator samFileValidator = new SamFileValidator(new PrintWriter(System.out), 8000);
-        samFileValidator.validateBamFileTermination(file);
-        Assert.assertEquals(samFileValidator.getErrorsByType().get(errorType).getValue(), 1.0);
-    }
-
-    private Histogram<String> executeValidation(final SamReader samReader, final ReferenceSequenceFile reference,
-                                                final IndexValidationStringency stringency) throws IOException {
-        return executeValidationWithErrorIgnoring(samReader, reference, stringency, Collections.EMPTY_LIST);
-    }
-
-    private Histogram<String> executeValidationWithErrorIgnoring(final SamReader samReader, final ReferenceSequenceFile reference,
-                                                                 final IndexValidationStringency stringency, Collection<SAMValidationError.Type> ignoringError) throws IOException {
-        final File outFile = File.createTempFile("validation", ".txt");
-        outFile.deleteOnExit();
-
-        final PrintWriter out = new PrintWriter(outFile);
-        final SamFileValidator samFileValidator = new SamFileValidator(out, 8000);
-        samFileValidator.setIndexValidationStringency(stringency).setErrorsToIgnore(ignoringError);
-        samFileValidator.validateSamFileSummary(samReader, reference);
-
-        final LineNumberReader reader = new LineNumberReader(new FileReader(outFile));
-        if (reader.readLine().equals("No errors found")) {
-            return new Histogram<>();
-        }
-        final MetricsFile<MetricBase, String> outputFile = new MetricsFile<>();
-        outputFile.read(new FileReader(outFile));
-        Assert.assertNotNull(outputFile.getHistogram());
-        return outputFile.getHistogram();
-    }
-
-    private File getBrokenFile(int truncByte) throws IOException {
-        final FileChannel stream = FileChannel.open(new File(TEST_DATA_DIR + "/test_samfile_version_1pt5.bam").toPath());
-        final File breakingFile = File.createTempFile("trunc", ".bam");
-        breakingFile.deleteOnExit();
-        FileChannel.open(breakingFile.toPath(), StandardOpenOption.WRITE).transferFrom(stream, 0, stream.size() - truncByte);
-        return breakingFile;
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/CRAIEntryTest.java b/src/test/java/htsjdk/samtools/cram/CRAIEntryTest.java
deleted file mode 100644
index 6cf4934..0000000
--- a/src/test/java/htsjdk/samtools/cram/CRAIEntryTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.Slice;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Created by vadim on 25/08/2015.
- */
-public class CRAIEntryTest {
-
-    @Test
-    public void testFromContainer() {
-        final Container container = new Container();
-        final Slice slice = new Slice();
-        slice.sequenceId = 1;
-        slice.alignmentStart = 2;
-        slice.alignmentSpan = 3;
-        slice.containerOffset = 4;
-        container.landmarks = new int[]{5};
-        container.slices = new Slice[]{slice};
-
-        final List<CRAIEntry> entries = CRAIEntry.fromContainer(container);
-        Assert.assertNotNull(entries);
-        Assert.assertEquals(entries.size(), 1);
-        final CRAIEntry entry = entries.get(0);
-
-        Assert.assertEquals(entry.sequenceId, slice.sequenceId);
-        Assert.assertEquals(entry.alignmentStart, slice.alignmentStart);
-        Assert.assertEquals(entry.alignmentSpan, slice.alignmentSpan);
-        Assert.assertEquals(entry.containerStartOffset, slice.containerOffset);
-    }
-
-    @Test
-    public void testFromCraiLine() {
-        int counter = 1;
-        final int sequenceId = counter++;
-        final int alignmentStart = counter++;
-        final int alignmentSpan = counter++;
-        final int containerOffset = Integer.MAX_VALUE + counter++;
-        final int sliceOffset = counter++;
-        final int sliceSise = counter++;
-
-        final String line = String.format("%d\t%d\t%d\t%d\t%d\t%d", sequenceId, alignmentStart, alignmentSpan, containerOffset, sliceOffset, sliceSise);
-        final CRAIEntry entry = new CRAIEntry(line);
-        Assert.assertNotNull(entry);
-        Assert.assertEquals(entry.sequenceId, sequenceId);
-        Assert.assertEquals(entry.alignmentStart, alignmentStart);
-        Assert.assertEquals(entry.alignmentSpan, alignmentSpan);
-        Assert.assertEquals(entry.containerStartOffset, containerOffset);
-    }
-
-    @Test
-    public void testIntersetcsZeroSpan() {
-        Assert.assertFalse(CRAIEntry.intersect(newEntry(1, 1), newEntry(1, 0)));
-    }
-
-    @Test
-    public void testIntersetcsSame() {
-        Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 1), newEntry(1, 1)));
-    }
-
-    @Test
-    public void testIntersetcsIncluded() {
-        Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 2), newEntry(1, 1)));
-        Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 2), newEntry(2, 1)));
-
-        // is symmetrical?
-        Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 1), newEntry(1, 2)));
-        Assert.assertTrue(CRAIEntry.intersect(newEntry(2, 1), newEntry(1, 2)));
-    }
-
-    @Test
-    public void testIntersetcsOvertlaping() {
-        Assert.assertFalse(CRAIEntry.intersect(newEntry(1, 2), newEntry(0, 1)));
-        Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 2), newEntry(0, 2)));
-        Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 2), newEntry(2, 1)));
-        Assert.assertFalse(CRAIEntry.intersect(newEntry(1, 2), newEntry(3, 1)));
-    }
-
-    @Test
-    public void testIntersetcsAnotherSequence() {
-        Assert.assertTrue(CRAIEntry.intersect(newEntry(10, 1, 2), newEntry(10, 2, 1)));
-        Assert.assertFalse(CRAIEntry.intersect(newEntry(10, 1, 2), newEntry(11, 2, 1)));
-    }
-
-    @Test
-    public void testCompareTo () {
-        final List<CRAIEntry> list = new ArrayList<CRAIEntry>(2);
-        CRAIEntry e1;
-        CRAIEntry e2;
-
-        e1 = new CRAIEntry();
-        e1.sequenceId = 100;
-        e2 = new CRAIEntry();
-        e2.sequenceId = 200;
-        list.add(e2);
-        list.add(e1);
-        Assert.assertTrue(list.get(1).sequenceId < list.get(0).sequenceId);
-        Collections.sort(list);
-        Assert.assertTrue(list.get(0).sequenceId < list.get(1).sequenceId);
-
-        list.clear();
-        e1 = new CRAIEntry();
-        e1.alignmentStart = 100;
-        e2 = new CRAIEntry();
-        e2.alignmentStart = 200;
-        list.add(e2);
-        list.add(e1);
-        Assert.assertTrue(list.get(1).alignmentStart < list.get(0).alignmentStart);
-        Collections.sort(list);
-        Assert.assertTrue(list.get(0).alignmentStart < list.get(1).alignmentStart);
-
-        list.clear();
-        e1 = new CRAIEntry();
-        e1.containerStartOffset = 100;
-        e2 = new CRAIEntry();
-        e2.containerStartOffset = 200;
-        list.add(e2);
-        list.add(e1);
-        Assert.assertTrue(list.get(1).containerStartOffset < list.get(0).containerStartOffset);
-        Collections.sort(list);
-        Assert.assertTrue(list.get(0).containerStartOffset < list.get(1).containerStartOffset);
-    }
-
-    private static CRAIEntry newEntry(final int start, final int span) {
-        return newEntry(1, start, span);
-    }
-
-    private static CRAIEntry newEntry(final int seqId, final int start, final int span) {
-        final CRAIEntry e1 = new CRAIEntry();
-        e1.sequenceId = seqId;
-        e1.alignmentStart = start;
-        e1.alignmentSpan = span;
-        return e1;
-    }
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/cram/CRAIIndexTest.java b/src/test/java/htsjdk/samtools/cram/CRAIIndexTest.java
deleted file mode 100644
index 7ebdb75..0000000
--- a/src/test/java/htsjdk/samtools/cram/CRAIIndexTest.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.BAMFileSpan;
-import htsjdk.samtools.CRAMCRAIIndexer;
-import htsjdk.samtools.DiskBasedBAMFileIndex;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.seekablestream.SeekableBufferedStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.BiFunction;
-import java.util.zip.GZIPOutputStream;
-
-/**
- * Created by vadim on 25/08/2015.
- */
-public class CRAIIndexTest {
-
-    @Test
-    public void testFind() throws IOException, CloneNotSupportedException {
-        final List<CRAIEntry> index = new ArrayList<CRAIEntry>();
-
-        final int sequenceId = 1;
-        CRAIEntry e = new CRAIEntry();
-        e.sequenceId = sequenceId;
-        e.alignmentStart = 1;
-        e.alignmentSpan = 1;
-        e.containerStartOffset = 1;
-        e.sliceOffset = 1;
-        e.sliceSize = 0;
-        index.add(e);
-
-        e = e.clone();
-        e.alignmentStart = 2;
-        e.containerStartOffset = 2;
-        index.add(e);
-
-        e = e.clone();
-        e.alignmentStart = 3;
-        e.containerStartOffset = 3;
-        index.add(e);
-
-        Assert.assertFalse(allFoundEntriesIntersectQueryInFind(index, sequenceId, 1, 0));
-
-        Assert.assertTrue(allFoundEntriesIntersectQueryInFind(index, sequenceId, 1, 1));
-        Assert.assertTrue(allFoundEntriesIntersectQueryInFind(index, sequenceId, 1, 2));
-        Assert.assertTrue(allFoundEntriesIntersectQueryInFind(index, sequenceId, 2, 1));
-        Assert.assertTrue(allFoundEntriesIntersectQueryInFind(index, sequenceId, 1, 3));
-
-        final int nonExistentSequenceId = 2;
-        Assert.assertFalse(allFoundEntriesIntersectQueryInFind(index, nonExistentSequenceId, 2, 1));
-        // a query starting beyond all entries:
-        Assert.assertFalse(allFoundEntriesIntersectQueryInFind(index, sequenceId, 4, 1));
-    }
-
-    private boolean allFoundEntriesIntersectQueryInFind(final List<CRAIEntry> index, final int sequenceId, final int start, final int span) {
-        int foundCount = 0;
-        for (final CRAIEntry found : CRAIIndex.find(index, sequenceId, start, span)) {
-            foundCount++;
-            Assert.assertEquals(found.sequenceId, sequenceId);
-            boolean intersects = false;
-            for (int pos = Math.min(found.alignmentStart, start); pos <= Math.max(found.alignmentStart + found.alignmentSpan, start + span); pos++) {
-                if (pos >= found.alignmentStart && pos >= start &&
-                        pos <= found.alignmentStart + found.alignmentSpan && pos <= start + span) {
-                    intersects = true;
-                    break;
-                }
-            }
-            if (!intersects) {
-                return false;
-            }
-        }
-        return foundCount > 0;
-    }
-
-    @Test(expectedExceptions = NullPointerException.class)
-    public void testCraiRequiresDictionary() throws IOException {
-        try (final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-             final GZIPOutputStream gos = new GZIPOutputStream(baos);
-             final BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
-            CRAIIndex.openCraiFileAsBaiStream(bis, null);
-        }
-    }
-
-    @Test
-    public void testCraiInMemory() throws IOException {
-        doCRAITest(this::getBaiStreamFromMemory);
-    }
-
-    @Test
-    public void testCraiFromFile() throws IOException {
-        doCRAITest(this::getBaiStreamFromFile);
-    }
-
-    private void doCRAITest(BiFunction<SAMSequenceDictionary, List<CRAIEntry>, SeekableStream> getBaiStreamForIndex) throws IOException {
-        final ArrayList<CRAIEntry> index = new ArrayList<CRAIEntry>();
-        final CRAIEntry entry = new CRAIEntry();
-        entry.sequenceId = 0;
-        entry.alignmentStart = 1;
-        entry.alignmentSpan = 2;
-        entry.sliceOffset = 3;
-        entry.sliceSize = 4;
-        entry.containerStartOffset = 5;
-        index.add(entry);
-
-        final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
-        dictionary.addSequence(new SAMSequenceRecord("1", 100));
-
-        final SeekableStream baiStream = getBaiStreamForIndex.apply(dictionary, index);
-
-        final DiskBasedBAMFileIndex bamIndex = new DiskBasedBAMFileIndex(baiStream, dictionary);
-        final BAMFileSpan span = bamIndex.getSpanOverlapping(entry.sequenceId, entry.alignmentStart, entry.alignmentStart);
-        Assert.assertNotNull(span);
-        final long[] coordinateArray = span.toCoordinateArray();
-        Assert.assertEquals(coordinateArray.length, 2);
-        Assert.assertEquals(coordinateArray[0] >> 16, entry.containerStartOffset);
-        Assert.assertEquals(coordinateArray[1] & 0xFFFF, 1);
-    }
-
-    public SeekableStream getBaiStreamFromMemory(SAMSequenceDictionary dictionary, final List<CRAIEntry> index) {
-        try {
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            SAMFileHeader samHeader = new SAMFileHeader();
-            samHeader.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-            CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(baos, samHeader);
-            for (CRAIEntry entry: index) {
-                indexer.addEntry(entry);
-            }
-            indexer.finish();
-            final SeekableStream baiStream = CRAIIndex.openCraiFileAsBaiStream(new ByteArrayInputStream(baos.toByteArray()), dictionary);
-            Assert.assertNotNull(baiStream);
-            return baiStream;
-        }
-        catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private SeekableStream getBaiStreamFromFile(SAMSequenceDictionary dictionary, final List<CRAIEntry> index) {
-        try {
-            final File file = File.createTempFile("test", ".crai");
-            file.deleteOnExit();
-            final FileOutputStream fos = new FileOutputStream(file);
-            SAMFileHeader samHeader = new SAMFileHeader();
-            samHeader.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-            CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(fos, samHeader);
-            for (CRAIEntry entry: index) {
-                indexer.addEntry(entry);
-            }
-            indexer.finish();
-            final SeekableStream baiStream = CRAIIndex.openCraiFileAsBaiStream(new SeekableBufferedStream(new SeekableFileStream(file)), dictionary);
-            Assert.assertNotNull(baiStream);
-            return baiStream;
-        }
-        catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Test
-    public void testGetLeftmost() throws CloneNotSupportedException {
-        final List<CRAIEntry> index = new ArrayList<CRAIEntry>();
-        Assert.assertNull(CRAIIndex.getLeftmost(index));
-
-        final CRAIEntry e1 = new CRAIEntry();
-        e1.sequenceId = 1;
-        e1.alignmentStart = 2;
-        e1.alignmentSpan = 3;
-        e1.containerStartOffset = 4;
-        e1.sliceOffset = 5;
-        e1.sliceSize = 6;
-        index.add(e1);
-        // trivial case of single entry in index:
-        Assert.assertEquals(e1, CRAIIndex.getLeftmost(index));
-
-        final CRAIEntry e2 = e1.clone();
-        e2.alignmentStart = e1.alignmentStart + 1;
-        index.add(e2);
-        Assert.assertEquals(e1, CRAIIndex.getLeftmost(index));
-    }
-
-    @Test
-    public void testFindLastAlignedEntry() {
-        final List<CRAIEntry> index = new ArrayList<CRAIEntry>();
-        Assert.assertEquals(-1, CRAIIndex.findLastAlignedEntry(index));
-
-        // Scan all allowed combinations of 10 mapped/unmapped entries and assert the found last aligned entry:
-        final int indexSize = 10;
-        for (int lastAligned = 0; lastAligned < indexSize; lastAligned++) {
-            index.clear();
-            for (int i = 0; i < indexSize; i++) {
-                final CRAIEntry e = new CRAIEntry();
-
-                e.sequenceId = (i <= lastAligned ? 0 : -1);
-                e.alignmentStart = i;
-                index.add(e);
-            }
-            // check expectations are correct before calling findLastAlignedEntry method:
-            Assert.assertTrue(index.get(lastAligned).sequenceId != -1);
-            if (lastAligned < index.size() - 1) {
-                Assert.assertTrue(index.get(lastAligned + 1).sequenceId == -1);
-            }
-            // assert the the found value matches the expectation:
-            Assert.assertEquals(CRAIIndex.findLastAlignedEntry(index), lastAligned);
-        }
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/cram/LosslessRoundTripTest.java b/src/test/java/htsjdk/samtools/cram/LosslessRoundTripTest.java
deleted file mode 100644
index 67cd483..0000000
--- a/src/test/java/htsjdk/samtools/cram/LosslessRoundTripTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.CRAMFileReader;
-import htsjdk.samtools.CRAMFileWriter;
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMReadGroupRecord;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Created by vadim on 19/02/2016.
- */
-public class LosslessRoundTripTest {
-    @Test
-    public void test_MD_NM() throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        InMemoryReferenceSequenceFile rsf = new InMemoryReferenceSequenceFile();
-        rsf.add("1", "AAA".getBytes());
-        ReferenceSource source = new ReferenceSource(rsf);
-
-        SAMFileHeader samFileHeader = new SAMFileHeader();
-        samFileHeader.addSequence(new SAMSequenceRecord("1", 3));
-        samFileHeader.addReadGroup(new SAMReadGroupRecord("some read group"));
-
-        CRAMFileWriter w = new CRAMFileWriter(baos, source, samFileHeader, null);
-        SAMRecord record = new SAMRecord(samFileHeader);
-        record.setReadName("name");
-        record.setAlignmentStart(1);
-        record.setReferenceIndex(0);
-        record.setCigarString("3M");
-        record.setReadUnmappedFlag(false);
-        record.setReadBases("AAC".getBytes());
-        record.setBaseQualities("!!!".getBytes());
-
-        record.setAttribute("RG", "some read group");
-        // setting some bizzar values to provoke test failure if the values are auto-restored while reading CRAM:
-        record.setAttribute("MD", "nonsense");
-        record.setAttribute("NM", 123);
-        w.addAlignment(record);
-        w.close();
-
-        byte[] cramBytes = baos.toByteArray();
-        InputStream cramInputStream = new ByteArrayInputStream(cramBytes);
-        CRAMFileReader reader = new CRAMFileReader(cramInputStream, (File) null, source, ValidationStringency.STRICT);
-        final SAMRecordIterator iterator = reader.getIterator();
-        Assert.assertTrue(iterator.hasNext());
-        SAMRecord record2 = iterator.next();
-        Assert.assertNotNull(record2);
-
-        Assert.assertEquals(record2, record);
-        reader.close();
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/VersionTest.java b/src/test/java/htsjdk/samtools/cram/VersionTest.java
deleted file mode 100644
index 0602eb3..0000000
--- a/src/test/java/htsjdk/samtools/cram/VersionTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.CRAMFileWriter;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.io.CramInt;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.cram.structure.Block;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.seekablestream.SeekableMemoryStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.zip.CRC32;
-
-/**
- * Created by vadim on 18/02/2016.
- */
-public class VersionTest {
-    /**
-     * The test purpose is to ensure that a CRAM written by {@link CRAMFileWriter} adheres to CRAM3 specs expectations:
-     * 1. version 3.+, via both actual byte comparison and CramIO API
-     * 2. EOF container
-     * 3. trailing 4 bytes of a container bytes are a valid crc32 of previous bytes in the container
-     * 3. trailing 4 bytes of a block bytes are a valid crc32 of previous bytes in the block
-     * @throws IOException
-     */
-    @Test
-    public void test_V3() throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ReferenceSource source = new ReferenceSource((File) null);
-        SAMFileHeader samFileHeader = new SAMFileHeader();
-        Version version = CramVersions.CRAM_v3;
-        CRAMFileWriter w = new CRAMFileWriter(baos, source, samFileHeader, null);
-        SAMRecord record = new SAMRecord(samFileHeader);
-        record.setReadName("name");
-        record.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
-        record.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-        record.setReadUnmappedFlag(true);
-        record.setReadBases("AAA".getBytes());
-        record.setBaseQualities("!!!".getBytes());
-        w.addAlignment(record);
-        w.close();
-
-        byte[] cramBytes = baos.toByteArray();
-
-        SeekableStream cramSeekableStream = new SeekableMemoryStream(cramBytes, null);
-        CramHeader cramHeader = CramIO.readCramHeader(cramSeekableStream);
-        Assert.assertEquals(version, cramHeader.getVersion());
-
-        // read whole container:
-        long containerStart = cramSeekableStream.position();
-        Container container = ContainerIO.readContainer(version, cramSeekableStream);
-        Assert.assertNotNull(container);
-
-        // ensure EOF follows:
-        Container eof = ContainerIO.readContainer(version, cramSeekableStream);
-        Assert.assertNotNull(eof);
-        Assert.assertTrue(eof.isEOF());
-
-        // TODO: ensure there is nothing left in the stream.
-
-        // position stream at the start of the 1st container:
-        cramSeekableStream.seek(containerStart);
-        // read only container header:
-        ContainerIO.readContainerHeader(version.major, cramSeekableStream);
-
-        // read the following 4 bytes of CRC32:
-        int crcByteSize = 4;
-        cramSeekableStream.seek(cramSeekableStream.position() - crcByteSize);
-        byte[] crcBytes = InputStreamUtils.readFully(cramSeekableStream, crcByteSize);
-        long firstBlockStart = cramSeekableStream.position();
-
-        // rewind to 1st container start:
-        cramSeekableStream.seek(containerStart);
-        // read container header bytes:
-        byte[] containerHeaderBytes = InputStreamUtils.readFully(cramSeekableStream, (int) (firstBlockStart - containerStart) - crcByteSize);
-
-        // test that checksum matches:
-        CRC32 digester = new CRC32();
-        digester.update(containerHeaderBytes);
-        Assert.assertEquals(container.checksum, (int) digester.getValue());
-        Assert.assertEquals(CramInt.int32(crcBytes), container.checksum);
-
-        // test block's crc:
-        cramSeekableStream.seek(firstBlockStart);
-        Block.readFromInputStream(version.major, cramSeekableStream);
-        long blockByteSyze = cramSeekableStream.position() - firstBlockStart - crcByteSize;
-        cramSeekableStream.seek(firstBlockStart);
-        final byte[] blockBytes = InputStreamUtils.readFully(cramSeekableStream, (int) blockByteSyze);
-        crcBytes = InputStreamUtils.readFully(cramSeekableStream, crcByteSize);
-        digester = new CRC32();
-        digester.update(blockBytes);
-        Assert.assertEquals(CramInt.int32(crcBytes), (int) digester.getValue());
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/build/CompressionHeaderFactoryTest.java b/src/test/java/htsjdk/samtools/cram/build/CompressionHeaderFactoryTest.java
deleted file mode 100644
index a3d91cd..0000000
--- a/src/test/java/htsjdk/samtools/cram/build/CompressionHeaderFactoryTest.java
+++ /dev/null
@@ -1,208 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.ReadTag;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by vadim on 07/01/2016.
- */
-public class CompressionHeaderFactoryTest {
-    @Test
-    public void testAllEncodingsPresent() {
-        final CompressionHeader header = new CompressionHeaderFactory().build(new ArrayList<>(), new SubstitutionMatrix(new long[256][256]), true);
-        for (final EncodingKey key : EncodingKey.values()) {
-            switch (key) {
-                // skip test marks and unused series:
-                case TV_TestMark:
-                case TM_TestMark:
-                case BB_bases:
-                case QQ_scores:
-                    Assert.assertFalse(header.encodingMap.containsKey(key), "Unexpected encoding key found: " + key.name());
-                    continue;
-            }
-            Assert.assertTrue(header.encodingMap.containsKey(key), "Encoding key not found: " + key.name());
-            Assert.assertNotNull(header.encodingMap.get(key));
-            Assert.assertFalse(header.encodingMap.get(key).id == EncodingID.NULL);
-        }
-    }
-
-    @Test
-    public void testAP_delta() {
-        boolean sorted = true;
-        CompressionHeader header = new CompressionHeaderFactory().build(new ArrayList<>(), new SubstitutionMatrix(new long[256][256]), sorted);
-        Assert.assertEquals(header.APDelta, sorted);
-
-        sorted = false;
-        header = new CompressionHeaderFactory().build(new ArrayList<>(), new SubstitutionMatrix(new long[256][256]), sorted);
-        Assert.assertEquals(header.APDelta, sorted);
-    }
-
-    @Test
-    public void testGetDataForTag() {
-        final CompressionHeaderFactory factory = new CompressionHeaderFactory();
-        final List<CramCompressionRecord> records = new ArrayList<>();
-        final CramCompressionRecord record = new CramCompressionRecord();
-        final int tagID = ReadTag.name3BytesToInt("ACi".getBytes());
-        final byte[] data = new byte[]{1, 2, 3, 4};
-        final ReadTag tag = new ReadTag(tagID, data, ValidationStringency.STRICT);
-        record.tags = new ReadTag[]{tag};
-        records.add(record);
-
-        final byte[] dataForTag = factory.getDataForTag(records, tagID);
-        Assert.assertEquals(dataForTag, data);
-    }
-
-    @Test
-    public void test_buildFrequencies() {
-        final CramCompressionRecord record = new CramCompressionRecord();
-        final Substitution s = new Substitution();
-        s.setPosition(1);
-        final byte refBase = 'A';
-        final byte readBase = 'C';
-
-        s.setBase(readBase);
-        s.setReferenceBase(refBase);
-        s.setCode((byte) 1);
-        record.readFeatures = new ArrayList<>();
-        record.readFeatures.add(s);
-        record.readLength = 2;
-
-        final List<CramCompressionRecord> records = new ArrayList<>();
-        records.add(record);
-
-        final long[][] frequencies = CompressionHeaderFactory.buildFrequencies(records);
-        for (int i = 0; i < frequencies.length; i++) {
-            for (int j = 0; j < frequencies[i].length; j++) {
-                if (i != refBase && j != readBase) {
-                    Assert.assertEquals(frequencies[i][j], 0);
-                }
-            }
-
-        }
-        Assert.assertEquals(frequencies[refBase][readBase], 1);
-    }
-
-    @Test
-    public void test_getBestExternalCompressor() {
-        try {
-            Assert.assertNotNull(CompressionHeaderFactory.getBestExternalCompressor(null));
-            Assert.fail("NPE expected for null data");
-        } catch (final NullPointerException e) {
-
-        }
-        Assert.assertNotNull(CompressionHeaderFactory.getBestExternalCompressor("".getBytes()));
-        Assert.assertNotNull(CompressionHeaderFactory.getBestExternalCompressor("qwe".getBytes()));
-    }
-
-    @Test
-    public void test_geByteSizeRangeOfTagValues() {
-        final List<CramCompressionRecord> records = new ArrayList<>();
-        final int tagID = ReadTag.name3BytesToInt("ACi".getBytes());
-        // test empty list:
-        CompressionHeaderFactory.ByteSizeRange range = CompressionHeaderFactory.geByteSizeRangeOfTagValues(records, tagID);
-        Assert.assertNotNull(range);
-        Assert.assertEquals(range.min, Integer.MAX_VALUE);
-        Assert.assertEquals(range.max, Integer.MIN_VALUE);
-
-        // test single record with a single tag:
-        final CramCompressionRecord record = new CramCompressionRecord();
-        final byte[] data = new byte[]{1, 2, 3, 4};
-        final ReadTag tag = new ReadTag(tagID, data, ValidationStringency.STRICT);
-        record.tags = new ReadTag[]{tag};
-        records.add(record);
-
-        range = CompressionHeaderFactory.geByteSizeRangeOfTagValues(records, tagID);
-        Assert.assertNotNull(range);
-        Assert.assertEquals(range.min, 4);
-        Assert.assertEquals(range.max, 4);
-    }
-
-    @Test
-    public void test_getTagType() {
-        Assert.assertEquals(CompressionHeaderFactory.getTagType(ReadTag.name3BytesToInt("ACi".getBytes())), 'i');
-    }
-
-    @Test
-    public void test_getUnusedByte() {
-        final byte[] data = new byte[256];
-        for (int i = 0; i < data.length; i++) {
-            data[i] = (byte) i;
-        }
-
-        int unusedByte = CompressionHeaderFactory.getUnusedByte(data);
-        Assert.assertEquals(unusedByte, -1);
-
-        data[5] = 0;
-        unusedByte = CompressionHeaderFactory.getUnusedByte(data);
-        Assert.assertEquals(unusedByte, 5);
-        data[5] = 5;
-
-        data[150] = 0;
-        unusedByte = CompressionHeaderFactory.getUnusedByte(data);
-        Assert.assertEquals(unusedByte, 150);
-    }
-
-    @Test
-    public void test_updateSubstitutionCodes() {
-        final CramCompressionRecord record = new CramCompressionRecord();
-        final Substitution s = new Substitution();
-        s.setPosition(1);
-        final byte refBase = 'A';
-        final byte readBase = 'C';
-
-        s.setBase(readBase);
-        s.setReferenceBase(refBase);
-        record.readFeatures = new ArrayList<>();
-        record.readFeatures.add(s);
-        record.readLength = 2;
-
-        final List<CramCompressionRecord> records = new ArrayList<>();
-        records.add(record);
-
-        final long[][] frequencies = new long[256][256];
-        frequencies[refBase][readBase] = 1;
-        SubstitutionMatrix matrix = new SubstitutionMatrix(frequencies);
-
-        Assert.assertTrue(s.getCode() == -1);
-        CompressionHeaderFactory.updateSubstitutionCodes(records, matrix);
-        Assert.assertFalse(s.getCode() == -1);
-        Assert.assertEquals(s.getCode(), matrix.code(refBase, readBase));
-    }
-
-    @Test
-    public void test_getTagValueByteSize() {
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'i', 1), 4);
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'I', 1), 4);
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'c', (byte) 1), 1);
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'C', -(byte) 1), 1);
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 's', (short) 1), 2);
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'S', -(short) 1), 2);
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'A', 1), 1);
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'f', 1f), 4);
-
-        // string values are null-terminated:
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'Z', "blah-blah"), "blah-blah".length() + 1);
-
-        // byte length of an array tag value is: element type (1 byte) + nof bytes (4 bytes) + nof elements * byte size of element
-        int elementTypeLength = 1;
-        int arraySizeByteLength = 4;
-        int arraySize = 3;
-        int byteElementSize = 1;
-        int int_float_long_elementSize = 4;
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'B', new byte[]{0, 1, 2}), elementTypeLength + arraySizeByteLength + arraySize * byteElementSize);
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'B', new int[]{0, 1, 2}), elementTypeLength + arraySizeByteLength + arraySize * int_float_long_elementSize);
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'B', new float[]{0, 1, 2}), elementTypeLength + arraySizeByteLength + arraySize * int_float_long_elementSize);
-        Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'B', new long[]{0, 1, 2}), elementTypeLength + arraySizeByteLength + arraySize * int_float_long_elementSize);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/build/ContainerFactoryTest.java b/src/test/java/htsjdk/samtools/cram/build/ContainerFactoryTest.java
deleted file mode 100644
index cb004a7..0000000
--- a/src/test/java/htsjdk/samtools/cram/build/ContainerFactoryTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Created by vadim on 15/12/2015.
- */
-public class ContainerFactoryTest {
-
-    @Test
-    public void testUnmapped() throws IOException, IllegalAccessException {
-        SAMFileHeader header = new SAMFileHeader();
-
-        int recordsPerContainer = 10;
-        ContainerFactory factory = new ContainerFactory(header, recordsPerContainer);
-
-        List<CramCompressionRecord> records = new ArrayList<>();
-        for (int i = 0; i < recordsPerContainer; i++) {
-            final CramCompressionRecord record = new CramCompressionRecord();
-            record.setSegmentUnmapped(true);
-            record.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-            record.alignmentStart = SAMRecord.NO_ALIGNMENT_START;
-            record.readBases = record.qualityScores = "ACGTN".getBytes();
-            record.readName = Integer.toString(i);
-
-            records.add(record);
-        }
-
-        final Container container = factory.buildContainer(records);
-        Assert.assertNotNull(container);
-        Assert.assertEquals(container.nofRecords, records.size());
-
-        assertContainerAlignmentBoundaries(container, SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, Slice.NO_ALIGNMENT_START, Slice.NO_ALIGNMENT_SPAN);
-    }
-
-    @Test
-    public void testMapped() throws IOException, IllegalAccessException {
-        InMemoryReferenceSequenceFile refFile = new InMemoryReferenceSequenceFile();
-        String refName = "1";
-        String refString = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
-        refFile.add(refName, refString.getBytes());
-        ReferenceSource source = new ReferenceSource(refFile);
-        SAMFileHeader header = new SAMFileHeader();
-        header.addSequence(new SAMSequenceRecord(refName, refString.length()));
-        int sequenceId = header.getSequenceIndex(refName);
-
-        int recordsPerContainer = 10;
-        byte[] bases = "AAAAA".getBytes();
-        int readLength = bases.length;
-        int alignmentStartOffset = 3;
-        ContainerFactory factory = new ContainerFactory(header, recordsPerContainer);
-
-        List<CramCompressionRecord> records = new ArrayList<>();
-        int span = 0;
-        for (int i = 0; i < recordsPerContainer; i++) {
-            final CramCompressionRecord record = new CramCompressionRecord();
-            record.setSegmentUnmapped(false);
-            record.sequenceId = sequenceId;
-            record.alignmentStart = alignmentStartOffset + i;
-            record.readBases = record.qualityScores = bases;
-            record.readName = Integer.toString(i);
-            record.readLength = readLength;
-            record.readFeatures = Collections.emptyList();
-
-            records.add(record);
-            span = record.alignmentStart + readLength - alignmentStartOffset;
-        }
-
-        final Container container = factory.buildContainer(records);
-        Assert.assertNotNull(container);
-        Assert.assertEquals(container.nofRecords, records.size());
-
-        assertContainerAlignmentBoundaries(container, sequenceId, alignmentStartOffset, span);
-    }
-
-    @Test
-    public void testMultiref() throws IOException, IllegalAccessException {
-        SAMFileHeader header = new SAMFileHeader();
-        header.addSequence(new SAMSequenceRecord("1", 100));
-        header.addSequence(new SAMSequenceRecord("2", 200));
-
-        int recordsPerContainer = 10;
-        byte[] bases = "AAAAA".getBytes();
-        int readLength = bases.length;
-        int alignmentStartOffset = 3;
-        ContainerFactory factory = new ContainerFactory(header, recordsPerContainer);
-
-        List<CramCompressionRecord> records = new ArrayList<>();
-        for (int i = 0; i < recordsPerContainer; i++) {
-            final CramCompressionRecord record = new CramCompressionRecord();
-            record.setSegmentUnmapped(false);
-            record.sequenceId = i % 2;
-            record.alignmentStart = alignmentStartOffset + i;
-            record.readBases = record.qualityScores = bases;
-            record.readName = Integer.toString(i);
-            record.readLength = readLength;
-            record.readFeatures = Collections.emptyList();
-
-            records.add(record);
-        }
-
-        final Container container = factory.buildContainer(records);
-        Assert.assertNotNull(container);
-        Assert.assertEquals(container.nofRecords, records.size());
-
-        assertContainerAlignmentBoundaries(container, Slice.MULTI_REFERENCE, Slice.NO_ALIGNMENT_START, Slice.NO_ALIGNMENT_SPAN);
-    }
-
-
-    private void assertContainerAlignmentBoundaries(Container container, int sequenceId, int alignmentStart, int alignmentSpan) {
-        Assert.assertEquals(container.sequenceId, sequenceId);
-        Assert.assertEquals(container.alignmentStart, alignmentStart);
-        Assert.assertEquals(container.alignmentSpan, alignmentSpan);
-
-        if (sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX || sequenceId == Slice.MULTI_REFERENCE) {
-            Assert.assertEquals(container.alignmentStart, Slice.NO_ALIGNMENT_START);
-            Assert.assertEquals(container.alignmentSpan, Slice.NO_ALIGNMENT_SPAN);
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/build/ContainerParserTest.java b/src/test/java/htsjdk/samtools/cram/build/ContainerParserTest.java
deleted file mode 100644
index fe25ce6..0000000
--- a/src/test/java/htsjdk/samtools/cram/build/ContainerParserTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Created by vadim on 11/01/2016.
- */
-public class ContainerParserTest {
-
-    @Test
-    public void testEOF() throws IOException, IllegalAccessException {
-        ContainerParser parser = new ContainerParser(new SAMFileHeader());
-        ByteArrayOutputStream v2_baos = new ByteArrayOutputStream();
-        Version version = CramVersions.CRAM_v2_1;
-        CramIO.issueEOF(version, v2_baos);
-        Container container = ContainerIO.readContainer(version, new ByteArrayInputStream(v2_baos.toByteArray()));
-        Assert.assertTrue(container.isEOF());
-        Assert.assertTrue(parser.getRecords(container, null, ValidationStringency.STRICT).isEmpty());
-
-        ByteArrayOutputStream v3_baos = new ByteArrayOutputStream();
-        version = CramVersions.CRAM_v3;
-        CramIO.issueEOF(version, v3_baos);
-        container = ContainerIO.readContainer(version, new ByteArrayInputStream(v3_baos.toByteArray()));
-        Assert.assertTrue(container.isEOF());
-        Assert.assertTrue(parser.getRecords(container, null, ValidationStringency.STRICT).isEmpty());
-    }
-
-    @Test
-    public void testSingleRefContainer() throws IOException, IllegalAccessException {
-        SAMFileHeader samFileHeader = new SAMFileHeader();
-        ContainerFactory factory = new ContainerFactory(samFileHeader, 10);
-        List<CramCompressionRecord> records = new ArrayList<>();
-        for (int i=0; i<10; i++) {
-            CramCompressionRecord record = new CramCompressionRecord();
-            record.readBases="AAA".getBytes();
-            record.qualityScores="!!!".getBytes();
-            record.setSegmentUnmapped(false);
-            record.readName=""+i;
-            record.sequenceId=0;
-            record.setLastSegment(true);
-            record.readFeatures = Collections.emptyList();
-
-            records.add(record);
-        }
-
-        Container container = factory.buildContainer(records);
-        Assert.assertEquals(container.nofRecords, 10);
-        Assert.assertEquals(container.sequenceId, 0);
-
-        ContainerParser parser = new ContainerParser(samFileHeader);
-        final Map<Integer, AlignmentSpan> referenceSet = parser.getReferences(container, ValidationStringency.STRICT);
-        Assert.assertNotNull(referenceSet);
-        Assert.assertEquals(referenceSet.size(), 1);
-        Assert.assertTrue(referenceSet.containsKey(0));
-    }
-
-    @Test
-    public void testUnmappedContainer() throws IOException, IllegalAccessException {
-        SAMFileHeader samFileHeader = new SAMFileHeader();
-        ContainerFactory factory = new ContainerFactory(samFileHeader, 10);
-        List<CramCompressionRecord> records = new ArrayList<>();
-        for (int i=0; i<10; i++) {
-            CramCompressionRecord record = new CramCompressionRecord();
-            record.readBases="AAA".getBytes();
-            record.qualityScores="!!!".getBytes();
-            record.setSegmentUnmapped(true);
-            record.readName=""+i;
-            record.sequenceId= SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-            record.setLastSegment(true);
-
-            records.add(record);
-        }
-
-        Container container = factory.buildContainer(records);
-        Assert.assertEquals(container.nofRecords, 10);
-        Assert.assertEquals(container.sequenceId, SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-
-        ContainerParser parser = new ContainerParser(samFileHeader);
-        final Map<Integer, AlignmentSpan> referenceSet = parser.getReferences(container, ValidationStringency.STRICT);
-        Assert.assertNotNull(referenceSet);
-        Assert.assertEquals(referenceSet.size(), 1);
-        Assert.assertTrue(referenceSet.containsKey(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-
-    }
-
-    @Test
-    public void testMappedAndUnmappedContainer() throws IOException, IllegalAccessException {
-        SAMFileHeader samFileHeader = new SAMFileHeader();
-        ContainerFactory factory = new ContainerFactory(samFileHeader, 10);
-        List<CramCompressionRecord> records = new ArrayList<>();
-        for (int i=0; i<10; i++) {
-            CramCompressionRecord record = new CramCompressionRecord();
-            record.readBases="AAA".getBytes();
-            record.qualityScores="!!!".getBytes();
-            record.readName=""+i;
-            record.alignmentStart=i+1;
-
-            record.setMultiFragment(false);
-            if (i%2==0) {
-                record.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-                record.setSegmentUnmapped(true);
-            } else {
-                record.sequenceId=0;
-                record.readFeatures = Collections.emptyList();
-                record.setSegmentUnmapped(false);
-            }
-            records.add(record);
-        }
-
-
-
-        Container container = factory.buildContainer(records);
-        Assert.assertEquals(container.nofRecords, 10);
-        Assert.assertEquals(container.sequenceId, Slice.MULTI_REFERENCE);
-
-        ContainerParser parser = new ContainerParser(samFileHeader);
-        final Map<Integer, AlignmentSpan> referenceSet = parser.getReferences(container, ValidationStringency.STRICT);
-        Assert.assertNotNull(referenceSet);
-        Assert.assertEquals(referenceSet.size(), 2);
-        Assert.assertTrue(referenceSet.containsKey(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-        Assert.assertTrue(referenceSet.containsKey(0));
-    }
-
-    @Test
-    public void testMultirefContainer() throws IOException, IllegalAccessException {
-        SAMFileHeader samFileHeader = new SAMFileHeader();
-        ContainerFactory factory = new ContainerFactory(samFileHeader, 10);
-        List<CramCompressionRecord> records = new ArrayList<>();
-        for (int i=0; i<10; i++) {
-            CramCompressionRecord record = new CramCompressionRecord();
-            record.readBases="AAA".getBytes();
-            record.qualityScores="!!!".getBytes();
-            record.readName=""+i;
-            record.alignmentStart=i+1;
-            record.readLength = 3;
-
-            record.setMultiFragment(false);
-            if (i < 9) {
-                record.sequenceId=i;
-                record.readFeatures = Collections.emptyList();
-                record.setSegmentUnmapped(false);
-            } else {
-                record.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-                record.setSegmentUnmapped(true);
-            }
-            records.add(record);
-        }
-
-        Container container = factory.buildContainer(records);
-        Assert.assertEquals(container.nofRecords, 10);
-        Assert.assertEquals(container.sequenceId, Slice.MULTI_REFERENCE);
-
-        ContainerParser parser = new ContainerParser(samFileHeader);
-        final Map<Integer, AlignmentSpan> referenceSet = parser.getReferences(container, ValidationStringency.STRICT);
-        Assert.assertNotNull(referenceSet);
-        Assert.assertEquals(referenceSet.size(), 10);
-        Assert.assertTrue(referenceSet.containsKey(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-        for (int i=0; i<9; i++) {
-            Assert.assertTrue(referenceSet.containsKey(i));
-            AlignmentSpan span = referenceSet.get(i);
-            Assert.assertEquals(span.getCount(), 1);
-            Assert.assertEquals(span.getStart(), i+1);
-            Assert.assertEquals(span.getSpan(), 3);
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/build/CramIOTest.java b/src/test/java/htsjdk/samtools/cram/build/CramIOTest.java
deleted file mode 100644
index 1035f24..0000000
--- a/src/test/java/htsjdk/samtools/cram/build/CramIOTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.structure.CramHeader;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-/**
- * Created by vadim on 25/08/2015.
- */
-public class CramIOTest {
-    @Test
-    public void testCheckHeaderAndEOF_v2() throws IOException {
-        final String id = "testid";
-
-        final CramHeader cramHeader = new CramHeader(CramVersions.CRAM_v2_1, id, new SAMFileHeader());
-        final File file = File.createTempFile("test", ".cram");
-        file.deleteOnExit();
-        final FileOutputStream fos = new FileOutputStream(file);
-        CramIO.writeCramHeader(cramHeader, fos);
-        CramIO.issueEOF(cramHeader.getVersion(), fos);
-        fos.close();
-
-        Assert.assertTrue(CramIO.checkHeaderAndEOF(file));
-        file.delete();
-    }
-
-    @Test
-    public void testCheckHeaderAndEOF_v3() throws IOException {
-        final String id = "testid";
-
-        final CramHeader cramHeader = new CramHeader(CramVersions.CRAM_v3, id, new SAMFileHeader());
-        final File file = File.createTempFile("test", ".cram");
-        file.deleteOnExit();
-        final FileOutputStream fos = new FileOutputStream(file);
-        CramIO.writeCramHeader(cramHeader, fos);
-        CramIO.issueEOF(cramHeader.getVersion(), fos);
-        fos.close();
-
-        Assert.assertTrue(CramIO.checkHeaderAndEOF(file));
-        file.delete();
-    }
-
-    @Test
-    public void testReplaceCramHeader() throws IOException {
-        final String id = "testid";
-
-        final CramHeader cramHeader = new CramHeader(CramVersions.CRAM_v3, id, new SAMFileHeader());
-        Assert.assertTrue(cramHeader.getSamFileHeader().getSequenceDictionary().isEmpty());
-        final File file = File.createTempFile("test", ".cram");
-        file.deleteOnExit();
-        final FileOutputStream fos = new FileOutputStream(file);
-        CramIO.writeCramHeader(cramHeader, fos);
-        CramIO.issueEOF(cramHeader.getVersion(), fos);
-        fos.close();
-        final long length = file.length();
-
-        final SAMFileHeader samFileHeader = new SAMFileHeader();
-        final SAMSequenceRecord sequenceRecord = new SAMSequenceRecord("1", 123);
-        samFileHeader.addSequence(sequenceRecord);
-        final String id2 = "testid2";
-        final CramHeader cramHeader2 = new CramHeader(CramVersions.CRAM_v3, id2, samFileHeader);
-        final boolean replaced = CramIO.replaceCramHeader(file, cramHeader2);
-        Assert.assertTrue(replaced);
-        Assert.assertEquals(file.length(), length);
-        Assert.assertTrue(CramIO.checkHeaderAndEOF(file));
-
-        final CramHeader cramHeader3 = CramIO.readCramHeader(new FileInputStream(file));
-        Assert.assertEquals(cramHeader3.getVersion(), CramVersions.CRAM_v3);
-        Assert.assertFalse(cramHeader3.getSamFileHeader().getSequenceDictionary().isEmpty());
-        Assert.assertNotNull(cramHeader3.getSamFileHeader().getSequenceDictionary().getSequence(0));
-        Assert.assertEquals(cramHeader3.getSamFileHeader().getSequence(sequenceRecord.getSequenceName()).getSequenceLength(), sequenceRecord.getSequenceLength());
-        file.delete();
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanTest.java b/src/test/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanTest.java
deleted file mode 100644
index f2ca2f2..0000000
--- a/src/test/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.io.DefaultBitInputStream;
-import htsjdk.samtools.cram.io.DefaultBitOutputStream;
-import htsjdk.samtools.cram.structure.ReadTag;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-/**
- * Created by vadim on 22/04/2015.
- */
-public class HuffmanTest {
-    @Test
-    public void testHuffmanIntHelper() throws IOException {
-        int size = 1000000;
-
-        HuffmanParamsCalculator cal = new HuffmanParamsCalculator();
-        cal.add(ReadTag.nameType3BytesToInt("OQ", 'Z'), size);
-        cal.add(ReadTag.nameType3BytesToInt("X0", 'C'), size);
-        cal.add(ReadTag.nameType3BytesToInt("X0", 'c'), size);
-        cal.add(ReadTag.nameType3BytesToInt("X0", 's'), size);
-        cal.add(ReadTag.nameType3BytesToInt("X1", 'C'), size);
-        cal.add(ReadTag.nameType3BytesToInt("X1", 'c'), size);
-        cal.add(ReadTag.nameType3BytesToInt("X1", 's'), size);
-        cal.add(ReadTag.nameType3BytesToInt("XA", 'Z'), size);
-        cal.add(ReadTag.nameType3BytesToInt("XC", 'c'), size);
-        cal.add(ReadTag.nameType3BytesToInt("XT", 'A'), size);
-        cal.add(ReadTag.nameType3BytesToInt("OP", 'i'), size);
-        cal.add(ReadTag.nameType3BytesToInt("OC", 'Z'), size);
-        cal.add(ReadTag.nameType3BytesToInt("BQ", 'Z'), size);
-        cal.add(ReadTag.nameType3BytesToInt("AM", 'c'), size);
-
-        cal.calculate();
-
-        HuffmanIntHelper helper = new HuffmanIntHelper(cal.values(), cal.bitLens());
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        DefaultBitOutputStream bos = new DefaultBitOutputStream(baos);
-
-        for (int i = 0; i < size; i++) {
-            for (int b : cal.values()) {
-                helper.write(bos, b);
-            }
-        }
-
-        bos.close();
-        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-        DefaultBitInputStream bis = new DefaultBitInputStream(bais);
-
-        int counter = 0;
-        for (int i = 0; i < size; i++) {
-            for (int b : cal.values()) {
-                int v = helper.read(bis);
-                if (v != b) {
-                    Assert.fail("Mismatch: " + v + " vs " + b + " at " + counter);
-                }
-
-                counter++;
-            }
-        }
-    }
-
-    @Test
-    public void testHuffmanByteHelper() throws IOException {
-        int size = 1000000;
-
-        long time5 = System.nanoTime();
-        HuffmanParamsCalculator cal = new HuffmanParamsCalculator();
-        for (byte i = 33; i < 33 + 15; i++) {
-            cal.add(i);
-        }
-        cal.calculate();
-
-        HuffmanByteHelper helper = new HuffmanByteHelper(cal.valuesAsBytes(), cal.bitLens());
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        DefaultBitOutputStream bos = new DefaultBitOutputStream(baos);
-
-        for (int i = 0; i < size; i++) {
-            for (byte b : cal.valuesAsBytes()) {
-                helper.write(bos, b);
-            }
-        }
-
-        bos.close();
-
-        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-        DefaultBitInputStream bis = new DefaultBitInputStream(bais);
-
-        int counter = 0;
-        for (int i = 0; i < size; i++) {
-            for (int b : cal.values()) {
-                int v = helper.read(bis);
-                if (v != b) {
-                    Assert.fail("Mismatch: " + v + " vs " + b + " at " + counter);
-                }
-
-                counter++;
-            }
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/encoding/rans/RansTest.java b/src/test/java/htsjdk/samtools/cram/encoding/rans/RansTest.java
deleted file mode 100644
index ca84686..0000000
--- a/src/test/java/htsjdk/samtools/cram/encoding/rans/RansTest.java
+++ /dev/null
@@ -1,228 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Random;
-
-/**
- * Created by vadim on 22/04/2015.
- */
-public class RansTest {
-    @Test
-    public void testEmpty() {
-        roundTrip(new byte[0]);
-    }
-
-    @Test
-    public void testOneByte() {
-        roundTrip(new byte[] { 0 });
-    }
-
-    @Test
-    public void testTwoByte() {
-        roundTrip(new byte[] { 0, 1 });
-    }
-
-    @Test
-    public void testThreeByte() {
-        roundTrip(new byte[] { 0, 1, 2 });
-    }
-
-    @Test
-    public void testFourBytes() {
-        roundTrip(new byte[] { 0, 1, 2, 3 });
-    }
-
-    @Test
-    public void testByteRange() {
-        byte[] data = new byte[256];
-        for (int i = 0; i < data.length; i++)
-            data[i] = (byte) i;
-        roundTrip(data);
-    }
-
-    @Test
-    public void testZeroBytes() {
-        roundTrip(new byte[1000]);
-    }
-
-    @Test
-    public void testUniBytes() {
-        byte[] data = new byte[1000];
-        Arrays.fill(data, (byte) 1);
-        roundTrip(data);
-    }
-
-    @Test
-    public void testZeroOneStretches() {
-        byte[] data = new byte[1000];
-        Arrays.fill(data, data.length / 2, data.length, (byte) 1);
-        roundTrip(data);
-    }
-
-    @Test
-    public void testByteMin() {
-        byte[] data = new byte[1000];
-        Arrays.fill(data, Byte.MIN_VALUE);
-        roundTrip(data);
-    }
-
-    @Test
-    public void testByteMax() {
-        byte[] data = new byte[1000];
-        Arrays.fill(data, Byte.MAX_VALUE);
-        roundTrip(data);
-    }
-
-    @Test
-    public void test1000_0dot1() {
-        roundTrip(randomBytes_GD(1000, 0.1));
-    }
-
-    @Test
-    public void test1000_0dot01() {
-        roundTrip(randomBytes_GD(1000, 0.01));
-    }
-
-    @Test
-    public void testSizeRange_tiny() {
-        for (int i = 0; i < 20; i++) {
-            byte[] data = randomBytes_GD(100, 0.1);
-            ByteBuffer in = ByteBuffer.wrap(data);
-            for (int size = 1; size < data.length; size++) {
-                in.position(0);
-                in.limit(size);
-                try {
-                    roundTrip(in);
-                } catch (AssertionError e) {
-                    System.err.printf("Failed at size %d and data %s\n", size,
-                            Arrays.toString(data));
-                    throw e;
-                }
-            }
-        }
-    }
-
-    @Test
-    public void testSizeRange_small() {
-        byte[] data = randomBytes_GD(1000, 0.01);
-        ByteBuffer in = ByteBuffer.wrap(data);
-        for (int size = 4; size < data.length; size++) {
-            in.position(0);
-            in.limit(size);
-            roundTrip(in);
-        }
-    }
-
-    @Test
-    public void testLargeSize() {
-        int size = 100 * 1000 + 3;
-        byte[] data = randomBytes_GD(size, 0.01);
-        ByteBuffer in = ByteBuffer.wrap(data);
-        for (int limit = size - 4; limit < size; limit++) {
-            in.position(0);
-            in.limit(limit);
-            roundTrip(in);
-        }
-    }
-
-    @Test
-    public void testXLSize() {
-        int size = 10 * 1000 * 1000 + 1;
-        roundTrip(randomBytes_GD(size, 0.01));
-    }
-
-    @Test
-    public void testBuffersMeetBoundaryExpectations() {
-        int size = 1001;
-        ByteBuffer raw = ByteBuffer.wrap(randomBytes_GD(size, 0.01));
-        for (RANS.ORDER order : RANS.ORDER.values()) {
-            ByteBuffer compressed = RANS.compress(raw, order, null);
-            Assert.assertFalse(raw.hasRemaining());
-            Assert.assertEquals(raw.limit(), size);
-
-            Assert.assertEquals(compressed.position(), 0);
-            Assert.assertTrue(compressed.limit() > 10);
-            Assert.assertEquals(compressed.get(), (byte) order.ordinal());
-            Assert.assertEquals(compressed.getInt(), compressed.limit() - 1 - 4 - 4);
-            Assert.assertEquals(compressed.getInt(), size);
-            compressed.rewind();
-
-            ByteBuffer uncompressed = RANS.uncompress(compressed, null);
-            Assert.assertFalse(compressed.hasRemaining());
-            Assert.assertEquals(uncompressed.limit(), size);
-            Assert.assertEquals(uncompressed.position(), 0);
-
-            raw.rewind();
-        }
-    }
-
-    @Test
-    public void testRansHeader() {
-        byte[] data = randomBytes_GD(1000, 0.01);
-        ByteBuffer compressed = RANS.compress(ByteBuffer.wrap(data),
-                RANS.ORDER.ZERO, null);
-        Assert.assertEquals(compressed.get(), (byte) 0);
-        Assert.assertEquals(compressed.getInt(), compressed.limit() - 9);
-        Assert.assertEquals(compressed.getInt(), data.length);
-    }
-
-    private static void roundTrip(ByteBuffer data) {
-        for (RANS.ORDER order : RANS.ORDER.values()) {
-            roundTrip(data, order);
-            data.rewind();
-        }
-    }
-
-    private static void roundTrip(byte[] data) {
-        for (RANS.ORDER order : RANS.ORDER.values())
-            roundTrip(data, order);
-    }
-
-    private static void roundTrip(ByteBuffer data, RANS.ORDER order) {
-        ByteBuffer compressed = RANS.compress(data, order, null);
-        ByteBuffer uncompressed = RANS.uncompress(compressed, null);
-        data.rewind();
-        while (data.hasRemaining()) {
-            if (!uncompressed.hasRemaining())
-                Assert.fail("Premature end of uncompressed data.");
-            Assert.assertEquals(uncompressed.get(), data.get());
-        }
-        Assert.assertFalse(uncompressed.hasRemaining());
-    }
-
-    private static void roundTrip(byte[] data, RANS.ORDER order) {
-        roundTrip(ByteBuffer.wrap(data), order);
-    }
-
-    private Random random = new Random();
-
-    private byte[] randomBytes_GD(int size, double p) {
-        byte[] data = new byte[size];
-        randomBytes_GD(data, p);
-        return data;
-    }
-
-    private void randomBytes_GD(byte[] data, double p) {
-        for (int i = 0; i < data.length; i++)
-            data[i] = randomByteGeometricDistribution(p);
-    }
-
-    /**
-     * A crude implementation of RNG for sampling geometric distribution. The
-     * value returned is offset by -1 to include zero. For testing purposes
-     * only, no refunds!
-     *
-     * @param p
-     *            the probability of success
-     * @return an almost random byte value.
-     */
-    private byte randomByteGeometricDistribution(double p) {
-        double rand = random.nextDouble();
-        double g = Math.ceil(Math.log(1 - rand) / Math.log(1 - p)) - 1;
-        return (byte) g;
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/io/ITF8Test.java b/src/test/java/htsjdk/samtools/cram/io/ITF8Test.java
deleted file mode 100644
index 5d95d2c..0000000
--- a/src/test/java/htsjdk/samtools/cram/io/ITF8Test.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import htsjdk.samtools.util.Tuple;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Created by vadim on 03/02/2015.
- */
-public class ITF8Test {
-
-    private ExposedByteArrayOutputStream testBAOS;
-    private ByteArrayInputStream testBAIS;
-
-    @BeforeClass
-    public void initialize() {
-        testBAOS = new ExposedByteArrayOutputStream();
-        testBAIS = new ByteArrayInputStream(testBAOS.getBuffer());
-    }
-
-    @BeforeMethod
-    public void reset() {
-        testBAOS.reset();
-        testBAIS.reset();
-    }
-
-
-    @DataProvider(name = "testITF8")
-    public static Object[][] testValues() {
-        List<Integer> list = new ArrayList<Integer>() ;
-
-        // basics:
-        list.add(0);
-        list.add(1);
-        list.add(127);
-        list.add(128);
-        list.add(255);
-        list.add(256);
-        list.add(-1);
-
-        // scan with bits:
-        for (int i = 0; i <= 32; i++) {
-            list.add((1 << i) - 2);
-            list.add((1 << i) - 1);
-            list.add(1 << i);
-            list.add((1 << i) + 1);
-            list.add((1 << i) + 1);
-        }
-
-        // special cases:
-        list.add(Integer.MAX_VALUE) ;
-        list.add(Integer.MIN_VALUE);
-        list.add(268435456);
-
-        Object[][] params = new Object[list.size()][] ;
-        for (int i=0; i<params.length; i++)
-            params[i] = new Object[]{list.get(i)} ;
-        return params;
-    }
-
-    @Test(dataProvider = "testITF8")
-    public void testITF8(int value) throws IOException {
-        int len = ITF8.writeUnsignedITF8(value, testBAOS);
-        Assert.assertTrue(len <= (8 * 9));
-
-        long result = ITF8.readUnsignedITF8(testBAIS);
-        Assert.assertEquals(value, result);
-    }
-
-    @DataProvider(name = "predefined")
-    public static Object[][] predefinedProvider() {
-        List<Tuple<Integer, byte[]>> list = new ArrayList<Tuple<Integer, byte[]>>() ;
-        list.add(new Tuple<Integer, byte[]>(4542278, new byte[]{(byte) (0xFF & 224), 69, 79, 70})) ;
-        list.add(new Tuple<Integer, byte[]>(16384, new byte[]{-64, 64, 0})) ;
-        list.add(new Tuple<Integer, byte[]>(192, new byte[]{-128, -64})) ;
-        list.add(new Tuple<Integer, byte[]>(-4757, new byte[]{-1, -1, -2, -42, 107})) ;
-
-        Object[][] params = new Object[list.size()][] ;
-        for (int i=0; i<params.length; i++)
-            params[i] = new Object[]{list.get(i).a, list.get(i).b} ;
-        return params;
-    }
-
-    @Test(dataProvider = "predefined")
-    public void testPredefined (int value, byte[] itf8) {
-        final byte[] bytes = ITF8.writeUnsignedITF8(value);
-        Assert.assertEquals(itf8, bytes);
-
-        int n = ITF8.readUnsignedITF8(itf8);
-        Assert.assertEquals(value, n);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/io/LTF8Test.java b/src/test/java/htsjdk/samtools/cram/io/LTF8Test.java
deleted file mode 100644
index 5103797..0000000
--- a/src/test/java/htsjdk/samtools/cram/io/LTF8Test.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by vadim on 03/02/2015.
- */
-public class LTF8Test {
-
-    private ExposedByteArrayOutputStream ltf8TestBAOS;
-    private ByteArrayInputStream ltf8TestBAIS;
-
-    @BeforeClass
-    public void initialize() {
-        ltf8TestBAOS = new ExposedByteArrayOutputStream();
-        ltf8TestBAIS = new ByteArrayInputStream(ltf8TestBAOS.getBuffer());
-    }
-
-    @BeforeMethod
-    public void reset() {
-        ltf8TestBAOS.reset();
-        ltf8TestBAIS.reset();
-    }
-
-
-    @DataProvider(name = "testLTF8")
-    public static Object[][] testValues() {
-        List<Long> list = new ArrayList<Long>() ;
-
-        // basics:
-        list.add(0L);
-        list.add(0L);
-        list.add(1L);
-        list.add(127L);
-        list.add(128L);
-        list.add(255L);
-        list.add(256L);
-
-        // scan with bits:
-        for (int i = 0; i <= 64; i++) {
-            list.add((1L << i) - 2);
-            list.add((1L << i) - 1);
-            list.add(1L << i);
-            list.add((1L << i) + 1);
-            list.add((1L << i) + 1);
-        }
-
-        // special cases:
-        list.add(1125899906842622L) ;
-        list.add(1125899906842622L);
-        list.add(562949953421312L);
-        list.add(4294967296L);
-        list.add(268435456L);
-        list.add(2147483648L);
-        list.add(-1L);
-
-        Object[][] params = new Object[list.size()][] ;
-        for (int i=0; i<params.length; i++)
-            params[i] = new Object[]{list.get(i)} ;
-        return params;
-    }
-
-    @Test(dataProvider = "testLTF8")
-    public void testLTF8(long value) throws IOException {
-        int len = LTF8.writeUnsignedLTF8(value, ltf8TestBAOS);
-        Assert.assertTrue(len <= (8 * 9));
-
-        long result = LTF8.readUnsignedLTF8(ltf8TestBAIS);
-        Assert.assertEquals(value, result);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/lossy/QualityScorePreservationTest.java b/src/test/java/htsjdk/samtools/cram/lossy/QualityScorePreservationTest.java
deleted file mode 100644
index 34b4676..0000000
--- a/src/test/java/htsjdk/samtools/cram/lossy/QualityScorePreservationTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package htsjdk.samtools.cram.lossy;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SamInputResource;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.cram.build.CramNormalizer;
-import htsjdk.samtools.cram.build.Sam2CramRecordFactory;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.ref.ReferenceTracks;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-public class QualityScorePreservationTest {
-
-    @Test
-    public void test1() {
-        QualityScorePreservation p = new QualityScorePreservation("m999_8");
-        List<PreservationPolicy> policies = p.getPreservationPolicies();
-
-        assertNotNull(p);
-        assertEquals(policies.size(), 1);
-
-        PreservationPolicy policy0 = policies.get(0);
-        assertEquals(policy0.readCategory.type,
-                ReadCategoryType.LOWER_MAPPING_SCORE);
-
-        assertEquals(policy0.readCategory.param, 999);
-
-        if (policy0.baseCategories != null)
-            assertEquals(policy0.baseCategories.isEmpty(), true);
-
-        QualityScoreTreatment treatment = policy0.treatment;
-        assertNotNull(treatment);
-
-        assertEquals(treatment.type, QualityScoreTreatmentType.BIN);
-        assertEquals(treatment.param, 8);
-    }
-
-    @Test
-    public void test2() {
-        QualityScorePreservation p = new QualityScorePreservation("R8-N40");
-        List<PreservationPolicy> policies = p.getPreservationPolicies();
-
-        assertNotNull(p);
-        assertEquals(policies.size(), 2);
-
-        {
-            PreservationPolicy policy0 = policies.get(0);
-            assertNull(policy0.readCategory);
-
-            List<BaseCategory> baseCategories = policy0.baseCategories;
-            assertNotNull(baseCategories);
-            assertEquals(baseCategories.size(), 1);
-
-            BaseCategory c0 = baseCategories.get(0);
-            assertEquals(c0.type, BaseCategoryType.MATCH);
-            assertEquals(c0.param, -1);
-
-            QualityScoreTreatment treatment = policy0.treatment;
-            assertNotNull(treatment);
-
-            assertEquals(treatment.type, QualityScoreTreatmentType.BIN);
-            assertEquals(treatment.param, 8);
-        }
-
-        {
-            PreservationPolicy policy1 = policies.get(1);
-            assertNull(policy1.readCategory);
-
-            List<BaseCategory> baseCategories = policy1.baseCategories;
-            assertNotNull(baseCategories);
-            assertEquals(baseCategories.size(), 1);
-
-            BaseCategory c0 = baseCategories.get(0);
-            assertEquals(c0.type, BaseCategoryType.MISMATCH);
-            assertEquals(c0.param, -1);
-
-            QualityScoreTreatment treatment = policy1.treatment;
-            assertNotNull(treatment);
-
-            assertEquals(treatment.type, QualityScoreTreatmentType.PRESERVE);
-            assertEquals(treatment.param, 40);
-        }
-    }
-
-    private SAMFileHeader samFileHeader = new SAMFileHeader();
-
-    private SAMRecord buildSAMRecord(String seqName, String line) {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            baos.write("@HD\tVN:1.0\tGO:none SO:coordinate\n".getBytes());
-            baos.write(("@SQ\tSN:" + seqName + "\tLN:247249719\n").getBytes());
-            baos.write(line.replaceAll("\\s+", "\t").getBytes());
-            baos.close();
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-
-        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-        SamReader reader = SamReaderFactory.makeDefault().open(SamInputResource.of(bais));
-        try {
-            return reader.iterator().next();
-        } finally {
-            CloserUtil.close(reader);
-        }
-    }
-
-    @Test
-    public void test3() {
-        String line1 = "98573 0 20 1 10 40M * 0 0 AAAAAAAAAA !!!!!!!!!!";
-        String seqName = "20";
-
-        byte[] ref = new byte[40];
-        Arrays.fill(ref, (byte) 'A');
-        SAMRecord record = buildSAMRecord(seqName, line1);
-        byte[] b1 = new byte[40];
-        Arrays.fill(b1, (byte) 'A');
-        byte[] s1 = new byte[40];
-        for (int i = 0; i < s1.length; i++)
-            s1[i] = 0;
-
-        record.setReadBases(b1);
-        record.setBaseQualities(s1);
-
-        QualityScorePreservation p = new QualityScorePreservation("R8-*40");
-        byte[] scores = compressScores(record, ref, p);
-        assertEquals(record.getBaseQualities(), scores);
-
-        Arrays.fill(record.getReadBases(), (byte)'C') ;
-        scores = compressScores(record, ref, p);
-        assertEquals(record.getBaseQualities(), scores);
-        for (int i=0; i<scores.length; i++) {
-            Assert.assertEquals(scores[i], Binning.ILLUMINA_BINNING_MATRIX[record.getBaseQualities()[i]]);
-        }
-    }
-
-    private byte[] compressScores (SAMRecord record, byte[] ref, QualityScorePreservation p) {
-        ReferenceTracks tracks = new ReferenceTracks(0, record.getReferenceName(), ref);
-
-        Sam2CramRecordFactory f = new Sam2CramRecordFactory(ref, record.getHeader(), CramVersions.CRAM_v3);
-        CramCompressionRecord cramRecord = f.createCramRecord(record);
-
-        p.addQualityScores(record, cramRecord, tracks);
-        if (!cramRecord.isForcePreserveQualityScores()) {
-            CramNormalizer.restoreQualityScores((byte) 30, Collections.singletonList(cramRecord));
-        }
-        return cramRecord.qualityScores;
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/ref/EnaRefServiceTest.java b/src/test/java/htsjdk/samtools/cram/ref/EnaRefServiceTest.java
deleted file mode 100644
index 852a513..0000000
--- a/src/test/java/htsjdk/samtools/cram/ref/EnaRefServiceTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package htsjdk.samtools.cram.ref;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-public class EnaRefServiceTest {
-
-    @Test
-    public void test() throws IOException, EnaRefService.GaveUpException {
-        Assert.assertNotNull(new EnaRefService().getSequence("57151e6196306db5d9f33133572a5482"));
-        Assert.assertNotNull(new EnaRefService().getSequence("0000088cbcebe818eb431d58c908c698"));
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/structure/CramCompressionRecordTest.java b/src/test/java/htsjdk/samtools/cram/structure/CramCompressionRecordTest.java
deleted file mode 100644
index 03360bd..0000000
--- a/src/test/java/htsjdk/samtools/cram/structure/CramCompressionRecordTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-
-/**
- * Created by vadim on 28/09/2015.
- */
-public class CramCompressionRecordTest {
-    @Test
-    public void test_getAlignmentEnd() {
-        CramCompressionRecord r = new CramCompressionRecord();
-        r.alignmentStart = 1;
-        r.setSegmentUnmapped(true);
-        Assert.assertEquals(r.getAlignmentEnd(), SAMRecord.NO_ALIGNMENT_START);
-
-        r = new CramCompressionRecord();
-        int readLength = 100;
-        r.alignmentStart = 1;
-        r.readLength = readLength;
-        r.setSegmentUnmapped(false);
-        Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1);
-
-        r = new CramCompressionRecord();
-        r.alignmentStart = 1;
-        r.readLength = readLength;
-        r.setSegmentUnmapped(false);
-        r.readFeatures = new ArrayList<ReadFeature>();
-        String softClip = "AAA";
-        r.readFeatures.add(new SoftClip(1, softClip.getBytes()));
-        Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 - softClip.length());
-
-        r = new CramCompressionRecord();
-        r.alignmentStart = 1;
-        r.readLength = readLength;
-        r.setSegmentUnmapped(false);
-        r.readFeatures = new ArrayList<ReadFeature>();
-        int deletionLength = 5;
-        r.readFeatures.add(new Deletion(1, deletionLength));
-        Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 + deletionLength);
-
-        r = new CramCompressionRecord();
-        r.alignmentStart = 1;
-        r.readLength = readLength;
-        r.setSegmentUnmapped(false);
-        r.readFeatures = new ArrayList<ReadFeature>();
-        String insertion = "CCCCCCCCCC";
-        r.readFeatures.add(new Insertion(1, insertion.getBytes()));
-        Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 - insertion.length());
-
-
-        r = new CramCompressionRecord();
-        r.alignmentStart = 1;
-        r.readLength = readLength;
-        r.setSegmentUnmapped(false);
-        r.readFeatures = new ArrayList<ReadFeature>();
-        r.readFeatures.add(new InsertBase(1, (byte) 'A'));
-        Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 - 1);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/structure/ReadTagTest.java b/src/test/java/htsjdk/samtools/cram/structure/ReadTagTest.java
deleted file mode 100644
index 3ed0b40..0000000
--- a/src/test/java/htsjdk/samtools/cram/structure/ReadTagTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.ValidationStringency;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class ReadTagTest {
-
-    @Test
-    public void test () {
-        SAMFileHeader h = new SAMFileHeader();
-        SAMRecord r = new SAMRecord(h);
-        r.setAttribute("OQ", "A:SOME:RANDOM:NONSENSE".getBytes());
-        r.setAttribute("XA", 1333123);
-        r.setAttribute("XB", (byte) 31);
-        r.setAttribute("XB", 'Q');
-        r.setAttribute("XC", "A STRING");
-
-        int intValue = 1123123123;
-        byte[] data = ReadTag.writeSingleValue((byte) 'i', intValue, false);
-        ByteBuffer byteBuffer = ByteBuffer.wrap(data);
-        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-        Object value = ReadTag.readSingleValue((byte) 'i', byteBuffer, ValidationStringency.DEFAULT_STRINGENCY);
-        Assert.assertEquals (((Integer) value).intValue(), intValue);
-
-        String sValue = "value";
-        data = ReadTag.writeSingleValue((byte) 'Z', sValue, false);
-        byteBuffer = ByteBuffer.wrap(data);
-        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-        value = ReadTag.readSingleValue((byte) 'Z', byteBuffer, ValidationStringency.DEFAULT_STRINGENCY);
-        Assert.assertEquals(sValue, value);
-
-        byte[] baValue = "value".getBytes();
-        data = ReadTag.writeSingleValue((byte) 'B', baValue, false);
-        byteBuffer = ByteBuffer.wrap(data);
-        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-        value = ReadTag.readSingleValue((byte) 'B', byteBuffer, ValidationStringency.DEFAULT_STRINGENCY);
-        Assert.assertEquals((byte[]) value, baValue);
-    }
-
-    @Test
-    public void testUnsignedInt() {
-        long intValue = Integer.MAX_VALUE+1L;
-        byte[] data = ReadTag.writeSingleValue((byte) 'I', intValue, false);
-        ByteBuffer byteBuffer = ByteBuffer.wrap(data);
-        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-        Object value = ReadTag.readSingleValue((byte) 'I', byteBuffer, ValidationStringency.SILENT);
-        Assert.assertTrue(value instanceof Long);
-        long lValue = (Long)value;
-        Assert.assertEquals (lValue & 0xFFFFFFFF, intValue);
-    }
-
-    @Test
-    public void testParallelReadTag() throws Exception {
-        // NOTE: testng 5.5 (circa 2007) doesn't support parallel data providers, but modern versions do.
-        // For now, roll our own.
-        final Object[][] allArgs = getParallelReadTagData();
-        final long timeout = 1000L * 5; // just in case
-        final List<Thread> threads = new ArrayList<Thread>(allArgs.length);
-        final Map<Object[], Exception> results = Collections.synchronizedMap(new HashMap<Object[], Exception>());
-        for (final Object[] argLine: allArgs) {
-            threads.add(new Thread() {
-                @Override
-                public void run() {
-                    try {
-                        testParallelReadTag((Byte)argLine[0], argLine[1]);
-                    } catch (final Exception e) {
-                        Assert.assertNull(results.put(argLine, e));
-                    }
-                }
-            });
-        }
-        for (final Thread thread: threads) {
-            thread.start();
-        }
-        for (final Thread thread: threads) {
-            thread.join(timeout);
-        }
-        for (final Map.Entry<Object[], Exception> result: results.entrySet()) {
-            // Will fail only on the first, for now, but a debugger will be able to see all the results.
-            Assert.fail("failed: " + Arrays.toString(result.getKey()), result.getValue());
-        }
-    }
-
-    //@Test(dataProvider = "parallelReadTagData")
-    public void testParallelReadTag(final byte tagType, final Object originalValue) {
-        // refactored from ReadTag.main()
-        final byte[] data = ReadTag.writeSingleValue(tagType, originalValue, false);
-        final ByteBuffer byteBuffer = ByteBuffer.wrap(data);
-        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-        final Object readValue = ReadTag.readSingleValue(tagType, byteBuffer, ValidationStringency.DEFAULT_STRINGENCY);
-        Assert.assertEquals(readValue, originalValue);
-    }
-
-    //@DataProvider(name = "parallelReadTagData", parallel = true)
-    public Object[][] getParallelReadTagData() {
-        final int testCount = 10;
-        final Object[][] testData = new Object[testCount][];
-        for (int i = 0; i < testCount; i++) {
-            testData[i] = new Object[]{(byte)'Z', "test" + i};
-        }
-        return testData;
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/structure/SliceTests.java b/src/test/java/htsjdk/samtools/cram/structure/SliceTests.java
deleted file mode 100644
index c52dccb..0000000
--- a/src/test/java/htsjdk/samtools/cram/structure/SliceTests.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.CRAMFileReader;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.util.SequenceUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-
-/**
- * Created by vadim on 07/12/2015.
- */
-public class SliceTests {
-    @Test
-    public void testUnmappedValidateRef() {
-        Slice slice = new Slice();
-        slice.alignmentStart= SAMRecord.NO_ALIGNMENT_START;
-        slice.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-
-        Assert.assertTrue(slice.validateRefMD5(null));
-        Assert.assertTrue(slice.validateRefMD5(new byte[0]));
-        Assert.assertTrue(slice.validateRefMD5(new byte[1024]));
-    }
-
-    @Test
-    public void test_validateRef() {
-        byte[] ref = "AAAAA".getBytes();
-        final byte[] md5 = SequenceUtil.calculateMD5(ref, 0, Math.min(5, ref.length));
-        Slice slice = new Slice();
-        slice.sequenceId=0;
-        slice.alignmentSpan=5;
-        slice.alignmentStart=1;
-        slice.setRefMD5(ref);
-
-        Assert.assertEquals(slice.refMD5, md5);
-        Assert.assertTrue(slice.validateRefMD5(ref));
-    }
-
-    @Test(expectedExceptions= CRAMException.class)
-    public void testFailsMD5Check() throws IOException {
-        // auxf.alteredForMD5test.fa has been altered slightly from the original reference
-        // to cause the CRAM md5 check to fail
-        final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram");
-        final File refFile = new File("src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa");
-        ReferenceSource refSource = new ReferenceSource(refFile);
-        CRAMFileReader reader = null;
-        try {
-            reader = new CRAMFileReader(
-                    CRAMFile,
-                    null,
-                    refSource,
-                    ValidationStringency.STRICT);
-            Iterator<SAMRecord> it = reader.getIterator();
-            while (it.hasNext()) {
-                it.next();
-            }
-        } finally {
-            if (reader != null) {
-                reader.close();
-            }
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/structure/SubstitutionMatrixTest.java b/src/test/java/htsjdk/samtools/cram/structure/SubstitutionMatrixTest.java
deleted file mode 100644
index 31e7708..0000000
--- a/src/test/java/htsjdk/samtools/cram/structure/SubstitutionMatrixTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package htsjdk.samtools.cram.structure;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeGroups;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Parameters;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-
-/**
- * Created by Vadim on 12/03/2015.
- */
-public class SubstitutionMatrixTest {
-
-    SubstitutionMatrix m;
-    long[][] freqs;
-
-    @BeforeGroups(groups = "matrix2code")
-    public void m() {
-        m = new SubstitutionMatrix(new byte[]{27, (byte) 228, 27, 27, 27});
-    }
-
-    @BeforeGroups(groups = "freqs2matrix")
-    public void b() {
-        freqs = new long[255][255];
-        for (int r = 0; r < SubstitutionMatrix.BASES.length; r++) {
-            for (int b = 0; b < SubstitutionMatrix.BASES.length; b++) {
-                if (r == b)
-                    continue;
-                freqs[SubstitutionMatrix.BASES[r]][SubstitutionMatrix.BASES[b]] = b;
-            }
-        }
-        m = new SubstitutionMatrix(freqs);
-    }
-
-
-    @Test(dataProvider = "matrix2code", groups = "matrix2code")
-    public void testMatrix2code(char refBase, char base, int code) {
-        if (refBase == base)
-            return;
-        Assert.assertEquals(m.code((byte) refBase, (byte) base), code);
-        Assert.assertEquals(m.base((byte) refBase, (byte) code), base);
-    }
-
-    @Test(dataProvider = "freqs2matrix", groups = "freqs2matrix")
-    public void testFreqs2matrix(char refBase, char base, int code) {
-        if (refBase == base)
-            return;
-        Assert.assertEquals(m.code((byte) refBase, (byte) base), code);
-        Assert.assertEquals(m.base((byte) refBase, (byte) code), base);
-    }
-
-    @DataProvider(name = "matrix2code")
-    public Object[][] provider1() {
-        return new Object[][]{
-                {'A', 'C', 0},
-                {'A', 'G', 1},
-                {'A', 'T', 2},
-                {'A', 'N', 3},
-                {'C', 'A', 3},
-                {'C', 'G', 2},
-                {'C', 'T', 1},
-                {'C', 'N', 0},
-                {'G', 'A', 0},
-                {'G', 'C', 1},
-                {'G', 'T', 2},
-                {'G', 'N', 3},
-                {'T', 'A', 0},
-                {'T', 'C', 1},
-                {'T', 'G', 2},
-                {'T', 'N', 3},
-                {'N', 'A', 0},
-                {'N', 'C', 1},
-                {'N', 'G', 2},
-                {'N', 'T', 3},
-        };
-    }
-
-    @DataProvider(name = "freqs2matrix")
-    public Object[][] provider2() {
-        return new Object[][]{
-                {'A', 'C', 3},
-                {'A', 'G', 2},
-                {'A', 'T', 1},
-                {'A', 'N', 0},
-                {'C', 'A', 3},
-                {'C', 'G', 2},
-                {'C', 'T', 1},
-                {'C', 'N', 0},
-                {'G', 'A', 3},
-                {'G', 'C', 2},
-                {'G', 'T', 1},
-                {'G', 'N', 0},
-                {'T', 'A', 3},
-                {'T', 'C', 2},
-                {'T', 'G', 1},
-                {'T', 'N', 0},
-                {'N', 'A', 3},
-                {'N', 'C', 2},
-                {'N', 'G', 1},
-                {'N', 'T', 0},
-        };
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/fastq/FastqRecordTest.java b/src/test/java/htsjdk/samtools/fastq/FastqRecordTest.java
deleted file mode 100644
index f6f238e..0000000
--- a/src/test/java/htsjdk/samtools/fastq/FastqRecordTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package htsjdk.samtools.fastq;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public final class FastqRecordTest {
-
-    @Test
-    public void testBasic() {
-        final String seqHeaderPrefix = "FAKE0003 Original version has Solexa scores from 62 to -5 inclusive (in that order)";
-        final String seqLine = "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT";
-        final String qualHeaderPrefix = "";
-        final String qualLine = ";<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
-        final FastqRecord fastqRecord = new FastqRecord(seqHeaderPrefix, seqLine, qualHeaderPrefix, qualLine);
-
-        Assert.assertNull(fastqRecord.getBaseQualityHeader());
-
-        Assert.assertEquals(fastqRecord.getReadHeader(), seqHeaderPrefix);
-        Assert.assertEquals(fastqRecord.getBaseQualityString(), qualLine);
-        Assert.assertEquals(fastqRecord.getReadString(), seqLine);
-        Assert.assertNotNull(fastqRecord.toString());//just check not nullness
-        Assert.assertNotEquals(fastqRecord, null);
-        Assert.assertFalse(fastqRecord.equals(null));
-        Assert.assertNotEquals(null, fastqRecord);
-        Assert.assertEquals(fastqRecord, fastqRecord);
-        Assert.assertNotEquals(fastqRecord, "fred");
-        Assert.assertNotEquals("fred", fastqRecord);
-        Assert.assertEquals(fastqRecord.length(), seqLine.length());
-        Assert.assertEquals(fastqRecord.getBaseQualityString().length(), fastqRecord.getReadString().length());
-        Assert.assertEquals(fastqRecord.getReadString().length(), fastqRecord.length());
-    }
-
-    @Test
-    public void testBasicEmptyHeaderPrefix() {
-        final String seqHeaderPrefix = "";
-        final String seqLine = "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT";
-        final String qualHeaderPrefix = "";
-        final String qualLine = ";<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
-        final FastqRecord fastqRecord = new FastqRecord(seqHeaderPrefix, seqLine, qualHeaderPrefix, qualLine);
-        Assert.assertNull(fastqRecord.getReadHeader());
-        Assert.assertNull(fastqRecord.getBaseQualityHeader());
-    }
-
-    @Test
-    public void testCopy() {
-        final String seqHeaderPrefix = "FAKE0003 Original version has Solexa scores from 62 to -5 inclusive (in that order)";
-        final String seqLine = "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT";
-        final String qualHeaderPrefix = "";
-        final String qualLine = ";<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
-        final FastqRecord fastqRecord = new FastqRecord(seqHeaderPrefix, seqLine, qualHeaderPrefix, qualLine);
-        final FastqRecord fastqRecordCopy = new FastqRecord(fastqRecord);
-
-        Assert.assertEquals(fastqRecord, fastqRecordCopy);
-        Assert.assertNotSame(fastqRecord, fastqRecordCopy);
-        Assert.assertSame(fastqRecord.getReadString(), fastqRecordCopy.getReadString());
-        Assert.assertSame(fastqRecord.getBaseQualityString(), fastqRecordCopy.getBaseQualityString());
-        Assert.assertSame(fastqRecord.getBaseQualityHeader(), fastqRecordCopy.getBaseQualityHeader());
-    }
-
-    @Test
-    public void testNullSeq() {
-        final String seqHeaderPrefix = "header";
-        final String seqLine = null;
-        final String qualHeaderPrefix = "";
-        final String qualLine = ";<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
-        new FastqRecord(seqHeaderPrefix, seqLine, qualHeaderPrefix, qualLine);
-        //Note: this does not blow up now but it will once we enforce non null seqLine
-    }
-
-    @Test
-    public void testEqualsWithNullHeader() {
-        final String seqLine = "GATTACA";
-        final String qualHeaderPrefix = "";
-        final String qualLine = "ABCDEFG";
-        final FastqRecord fastqRecord1 = new FastqRecord("", seqLine, qualHeaderPrefix, qualLine);
-        final FastqRecord fastqRecord2 = new FastqRecord("header", seqLine, qualHeaderPrefix, qualLine);
-        Assert.assertNotEquals(fastqRecord1, fastqRecord2);
-        Assert.assertNotEquals(fastqRecord2, fastqRecord1);
-
-        Assert.assertNotEquals(fastqRecord1.hashCode(), fastqRecord2.hashCode());
-        Assert.assertNotEquals(fastqRecord2.hashCode(), fastqRecord1.hashCode());
-        Assert.assertEquals(fastqRecord1.hashCode(), fastqRecord1.hashCode());
-        Assert.assertEquals(fastqRecord2.hashCode(), fastqRecord2.hashCode());
-    }
-
-    @Test
-    public void testEqualsWithNullSeqLine() {
-        final String seqLine = "GATTACA";
-        final String qualHeaderPrefix = "";
-        final String qualLine = "ABCDEFG";
-        final FastqRecord fastqRecord1 = new FastqRecord("", null, qualHeaderPrefix, qualLine);
-        final FastqRecord fastqRecord2 = new FastqRecord("header", seqLine, qualHeaderPrefix, qualLine);
-        Assert.assertNotEquals(fastqRecord1, fastqRecord2);
-        Assert.assertNotEquals(fastqRecord2, fastqRecord1);
-    }
-
-    @Test
-    public void testEqualsWithNullQualLine() {
-        final String seqLine = "GATTACA";
-        final String qualHeaderPrefix = "";
-        final String qualLine = "ABCDEFG";
-        final FastqRecord fastqRecord1 = new FastqRecord("", seqLine, qualHeaderPrefix, null);
-        final FastqRecord fastqRecord2 = new FastqRecord("header", seqLine, qualHeaderPrefix, qualLine);
-        Assert.assertNotEquals(fastqRecord1, fastqRecord2);
-        Assert.assertNotEquals(fastqRecord2, fastqRecord1);
-    }
-
-    @Test
-    public void testEqualsWithNullBaseQualityHeader() {
-        final String seqHeaderPrefix = "header";
-        final String seqLine = "GATTACA";
-        final String qualLine = "ABCDEFG";
-        final FastqRecord fastqRecord1 = new FastqRecord(seqHeaderPrefix, seqLine, null, qualLine);
-        final FastqRecord fastqRecord2 = new FastqRecord(seqHeaderPrefix, seqLine, "qualHeaderPrefix", qualLine);
-        Assert.assertNotEquals(fastqRecord1, fastqRecord2);
-        Assert.assertNotEquals(fastqRecord2, fastqRecord1);
-
-        Assert.assertNotEquals(fastqRecord1.hashCode(), fastqRecord2.hashCode());
-        Assert.assertNotEquals(fastqRecord2.hashCode(), fastqRecord1.hashCode());
-        Assert.assertEquals(fastqRecord1.hashCode(), fastqRecord1.hashCode());
-        Assert.assertEquals(fastqRecord2.hashCode(), fastqRecord2.hashCode());
-    }
-
-    @Test
-    public void testNullQual() {
-        final String seqHeaderPrefix = "header";
-        final String seqLine = "GATTACA";
-        new FastqRecord(seqHeaderPrefix, seqLine, "qualHeaderPrefix", null);
-        //Note: this does not blow up now but it will once we enforce non null quals
-    }
-
-    @Test
-    public void testNullString() {
-        final String seqHeaderPrefix = "header";
-        final String qualLine = "GATTACA";
-        new FastqRecord(seqHeaderPrefix, null, "qualHeaderPrefix", qualLine);
-        //Note: this does not blow up now but it will once we enforce non null seqLine
-    }
-
-    @Test
-    public void testEmptyQual() {
-        final String seqHeaderPrefix = "header";
-        final String seqLine = "GATTACA";
-        new FastqRecord(seqHeaderPrefix, seqLine, "qualHeaderPrefix", "");
-        //Note: this does not blow up now but it will once we enforce non empty quals
-    }
-
-    @Test
-    public void testEmptyString() {
-        final String seqHeaderPrefix = "header";
-        final String qualLine = "GATTACA";
-        new FastqRecord(seqHeaderPrefix, "", "qualHeaderPrefix", qualLine);
-        //Note: this does not blow up now but it will once we enforce non empty seqLine
-    }
-
-    @Test
-    public void testNotEqualQuals() {
-        final String seqLine1 = "GATTACA";
-        final String qualLine1 = "ABCDEFG";
-
-        final String seqLine2 = seqLine1;
-        final String qualLine2 = seqLine2.replace('A', 'X');
-
-        final FastqRecord fastqRecord1 = new FastqRecord("header", seqLine1, "qualHeaderPrefix", qualLine1);
-        final FastqRecord fastqRecord2 = new FastqRecord("header", seqLine2, "qualHeaderPrefix", qualLine2);
-        Assert.assertNotEquals(fastqRecord1, fastqRecord2);
-        Assert.assertNotEquals(fastqRecord2, fastqRecord1);
-
-        Assert.assertEquals(fastqRecord1.getReadString(), fastqRecord2.getReadString());
-        Assert.assertNotEquals(fastqRecord1.getBaseQualityString(), fastqRecord2.getBaseQualityString());
-
-        Assert.assertNotEquals(fastqRecord1.hashCode(), fastqRecord2.hashCode());
-        Assert.assertNotEquals(fastqRecord2.hashCode(), fastqRecord1.hashCode());
-    }
-
-    @Test
-    public void testNotEqualStrings() {
-        final String seqLine1 = "GATTACA";
-        final String qualLine1 = "ABCDEFG";
-
-        final String seqLine2 = seqLine1.replace('A', 'X');
-        final String qualLine2 = qualLine1;
-
-        final FastqRecord fastqRecord1 = new FastqRecord("header", seqLine1, "qualHeaderPrefix", qualLine1);
-        final FastqRecord fastqRecord2 = new FastqRecord("header", seqLine2, "qualHeaderPrefix", qualLine2);
-        Assert.assertNotEquals(fastqRecord1, fastqRecord2);
-        Assert.assertNotEquals(fastqRecord2, fastqRecord1);
-
-        Assert.assertNotEquals(fastqRecord1.getReadString(), fastqRecord2.getReadString());
-        Assert.assertEquals(fastqRecord1.getBaseQualityString(), fastqRecord2.getBaseQualityString());
-
-        Assert.assertNotEquals(fastqRecord1.hashCode(), fastqRecord2.hashCode());
-        Assert.assertNotEquals(fastqRecord2.hashCode(), fastqRecord1.hashCode());
-    }
-
-    @Test
-    public void testNotEqualLengths() {
-        final String seqLine1 = "GATTACA";
-        final String qualLine1 = seqLine1 + "X";
-
-        new FastqRecord("header", seqLine1, "qualHeaderPrefix", qualLine1);
-        //Note: this does not blow up now but it will once we enforce that seqLine and qualLine be the same length
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/fastq/FastqWriterTest.java b/src/test/java/htsjdk/samtools/fastq/FastqWriterTest.java
deleted file mode 100644
index eba5c5b..0000000
--- a/src/test/java/htsjdk/samtools/fastq/FastqWriterTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * The MIT License
- *
- * Pierre Lindenbaum PhD
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.fastq;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import htsjdk.samtools.util.TestUtil;
-
-import java.io.File;
-import java.util.ArrayList;
-
-/**
- * test fastq
- */
-public class FastqWriterTest {
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest");
-
-    @DataProvider(name = "fastqsource")
-    public Object[][] createTestData() {
-        return new Object[][]{
-                {"solexa_full_range_as_solexa.fastq"},
-                {"5k-30BB2AAXX.3.aligned.sam.fastq"}
-        };
-    }
-
-    @Test(dataProvider = "fastqsource")
-    public void testReadReadWriteFastq(final String basename) throws Exception {
-        final File tmpFile = File.createTempFile("test.", ".fastq");
-        tmpFile.deleteOnExit();
-        final FastqReader fastqReader = new FastqReader(new File(TEST_DATA_DIR,basename));
-        final FastqWriterFactory writerFactory = new FastqWriterFactory();
-        final FastqWriter fastqWriter = writerFactory.newWriter(tmpFile);
-        for(final FastqRecord rec: fastqReader) fastqWriter.write(rec);
-        fastqWriter.close();
-        fastqReader.close();
-    }
-    
-    @Test(dataProvider = "fastqsource")
-    public void testFastqSerialize(final String basename) throws Exception {
-        //write 
-        final ArrayList<FastqRecord> records = new ArrayList<>();
-        final FastqReader fastqReader = new FastqReader(new File(TEST_DATA_DIR,basename));
-        for(final FastqRecord rec: fastqReader) {
-            records.add(rec);
-            if(records.size()>100) break;
-        }
-        fastqReader.close();
-        Assert.assertEquals(TestUtil.serializeAndDeserialize(records),records);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/FailsVendorReadQualityFilterTest.java b/src/test/java/htsjdk/samtools/filter/FailsVendorReadQualityFilterTest.java
deleted file mode 100644
index cb2cb05..0000000
--- a/src/test/java/htsjdk/samtools/filter/FailsVendorReadQualityFilterTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class FailsVendorReadQualityFilterTest {
-
-    private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-    private final FailsVendorReadQualityFilter filter = new FailsVendorReadQualityFilter();
-
-    /**
-     * Basic positive and negative tests for the FailsReadQualityFilter
-     *
-     * @param readQualityFlag   The read quality flag to be tested
-     * @param expectedResult    The expected result (true is the sequence should match the filter, otherwise false)
-     */
-    @Test(dataProvider="data")
-    public void testFailsReadQualityFilter(final String testName, final boolean readQualityFlag,
-                                           final boolean expectedResult) {
-        builder.addUnmappedFragment("testfrag");
-        final SAMRecord record = builder.iterator().next();
-        record.setReadFailsVendorQualityCheckFlag(readQualityFlag);
-        Assert.assertEquals(filter.filterOut(record), expectedResult, testName);
-    }
-
-
-    /**
-     * Data for various sequences which may or may not match the filter.
-     */
-    @DataProvider(name = "data")
-    private Object[][] getFailsReadQualityTestData()
-    {
-        return new Object[][]{
-            {"Failed read, should be filtered out", true, true},
-            {"Passing read, should not be filtered out", false, false},
-        };
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/filter/InsertSizeFilterTest.java b/src/test/java/htsjdk/samtools/filter/InsertSizeFilterTest.java
deleted file mode 100644
index fc4937d..0000000
--- a/src/test/java/htsjdk/samtools/filter/InsertSizeFilterTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class InsertSizeFilterTest {
-    private static final int READ_LENGTH = 20;
-    private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-
-    @BeforeTest
-    public void setUp() {
-        builder.setReadLength(READ_LENGTH);
-        builder.addFrag("mapped_unpaired", 1, 1, false);
-        builder.addUnmappedPair("unmapped_paired"); // insert size = 0
-        builder.addPair("mapped_paired_short", 1, 1, 31); // insert size = 50
-        builder.addPair("mapped_paired_long", 1, 1, 81); // insert size = 100
-        builder.addPair("mapped_paired_long_flipped", 1, 81, 1); // insert size = 100
-    }
-
-    @Test(dataProvider = "data")
-    public void testInsertSizeFilter(final int minInsertSize, final int maxInsertSize, final int expectedPassingRecords) {
-        final InsertSizeFilter filter = new InsertSizeFilter(minInsertSize, maxInsertSize);
-        int actualPassingRecords = 0;
-        for (final SAMRecord rec : builder) {
-            if (!filter.filterOut(rec)) actualPassingRecords++;
-        }
-        Assert.assertEquals(actualPassingRecords, expectedPassingRecords);
-    }
-
-    @DataProvider(name = "data")
-    private Object[][] testData() {
-        return new Object[][]{
-                {0, 0, 2},
-                {50, 50, 2},
-                {50, 100, 6},
-                {0, Integer.MAX_VALUE, 8}
-        };
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/IntervalKeepPairFilterTest.java b/src/test/java/htsjdk/samtools/filter/IntervalKeepPairFilterTest.java
deleted file mode 100644
index 3d30255..0000000
--- a/src/test/java/htsjdk/samtools/filter/IntervalKeepPairFilterTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecordSetBuilder;
-import htsjdk.samtools.util.CollectionUtil;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-import htsjdk.samtools.util.Interval;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.stream.StreamSupport;
-
-public class IntervalKeepPairFilterTest {
-    private static final int READ_LENGTH = 151;
-    private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-
-    @BeforeTest
-    public void setUp() {
-        builder.setReadLength(READ_LENGTH);
-        // Will be kept when an interval overlaps chromosome 1 in the first 151
-        // bases.
-        builder.addPair("mapped_pair_chr1", 0, 1, 151);
-        // Will be kept when an interval overlaps chromsome 2 in the first 151
-        // bases.
-        builder.addPair("mapped_pair_chr2", 1, 1, 151);
-        // The first read should pass and second should not, but both will
-        // be kept in first test.
-        builder.addPair("one_of_pair", 0, 1, 1000);
-        // The second read is unmapped, but both should be kept in an
-        // interval test where the interval includes chromosome four, where
-        // read one will overlap.
-        builder.addPair("second_mate_unmapped", 3, -1, 1, 1000, false, true,
-                "151M", null, false, false, false, false, -1);
-        // The first read is unmapped but both should be kept in an
-        // interval test where the interval includes chromosome four, where
-        // read two will overlap.
-        builder.addPair("first_mate_unmapped", -1, 3, 1000, 1, true, false,
-                null, "151M", false, false, false, false, -1);
-        // This pair will overlap any interval that includes chromosome 1:1000
-        builder.addPair("prove_one_of_pair", 0, 1000, 1000);
-        // These reads are unmapped and will not map to any intervals, so they
-        // are never kept. This is tested below.
-        builder.addPair("both_unmapped", -1, -1, 1, 1, true, true, null, null,
-                false, false, false, false, -1);
-        // Secondary alignments are never kept by the interval filter.
-        builder.addFrag("mapped_pair_chr1", 0, 1, false, false, "151M", null, -1, true, false);
-        // Supplementary alignment are never kept by the interval filter.
-        builder.addFrag("mapped_pair_chr1", 0, 1, false, false, "151M", null, -1, false, true);
-    }
-
-    @Test(dataProvider = "testData")
-    public void testIntervalPairFilter(final List<Interval> intervals, final long expectedPassingRecords) {
-        final IntervalKeepPairFilter filter = new IntervalKeepPairFilter(intervals);
-
-        long actualPassingRecords = StreamSupport.stream(builder.spliterator(), false)
-                .filter(rec -> !filter.filterOut(rec))
-                .count();
-
-        Assert.assertEquals(actualPassingRecords, expectedPassingRecords);
-    }
-
-    @Test
-    public void testUnmappedPair() {
-        final List<Interval> intervalList = new ArrayList<>();
-
-        final Interval interval1 = new Interval("chr1", 1, 999);
-        final Interval interval2 = new Interval("chr3", 1, 2);
-        final Interval interval3 = new Interval("chr2", 1, 2);
-        final Interval interval4 = new Interval("chr4", 1, 2);
-
-        intervalList.addAll(CollectionUtil.makeList(interval1, interval2, interval3, interval4));
-
-        final IntervalKeepPairFilter filter = new IntervalKeepPairFilter(intervalList);
-
-        boolean unmappedPassed = StreamSupport.stream(builder.spliterator(), false)
-                .filter(rec -> !filter.filterOut(rec))
-                .anyMatch(rec -> rec.getReadName().equals("both_unmapped"));
-
-        Assert.assertFalse(unmappedPassed);
-    }
-
-    @Test
-    public void testNotPrimaryReads() {
-        final List<Interval> intervalList = new ArrayList<>();
-        final Interval interval1 = new Interval("chr1", 1, 999);
-        intervalList.add(interval1);
-
-        final IntervalKeepPairFilter filter = new IntervalKeepPairFilter(intervalList);
-
-        boolean notPrimary = StreamSupport.stream(builder.spliterator(), false)
-                .filter(rec -> !filter.filterOut(rec))
-                .anyMatch(rec -> rec.getNotPrimaryAlignmentFlag() || rec.getSupplementaryAlignmentFlag());
-
-        Assert.assertFalse(notPrimary);
-    }
-
-    @DataProvider(name = "testData")
-    private Object[][] testData() {
-        Interval interval = new Interval("chr1", 1, 999);
-        final List<Interval> intervalList_twoPair = new ArrayList<>();
-        intervalList_twoPair.add(interval);
-
-        interval = new Interval("chr3", 1, 2);
-        final List<Interval> intervalList_noMatch = new ArrayList<>();
-        intervalList_noMatch.add(interval);
-
-        interval = new Interval("chr2", 1, 2);
-        final List<Interval> intervalList_onePair = new ArrayList<>();
-        intervalList_onePair.add(interval);
-
-        interval = new Interval("chr4", 1, 2);
-        final List<Interval> intervalList_unmapped = new ArrayList<>();
-        intervalList_unmapped.add(interval);
-
-        return new Object[][]{
-                {intervalList_twoPair, 4},
-                {intervalList_noMatch, 0},
-                {intervalList_onePair, 2},
-                {intervalList_unmapped, 4}
-        };
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/JavascriptSamRecordFilterTest.java b/src/test/java/htsjdk/samtools/filter/JavascriptSamRecordFilterTest.java
deleted file mode 100644
index 7835576..0000000
--- a/src/test/java/htsjdk/samtools/filter/JavascriptSamRecordFilterTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.util.CloserUtil;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * @author Pierre Lindenbaum PhD Institut du Thorax - INSERM - Nantes - France
- */
-
-public class JavascriptSamRecordFilterTest {
-    final File testDir = new File("./src/test/resources/htsjdk/samtools");
-
-    @DataProvider
-    public Object[][] jsData() {
-        return new Object[][] { { "unsorted.sam", "samFilter01.js", 8 }, { "unsorted.sam", "samFilter02.js", 10 }, };
-    }
-
-    @Test(dataProvider = "jsData")
-    public void testJavascriptFilters(final String samFile, final String javascriptFile, final int expectCount) {
-        final SamReaderFactory srf = SamReaderFactory.makeDefault();
-        final SamReader samReader = srf.open(new File(testDir, samFile));
-        final JavascriptSamRecordFilter filter;
-        try {
-            filter = new JavascriptSamRecordFilter(new File(testDir, javascriptFile),
-                    samReader.getFileHeader());    
-        } catch (IOException err) {
-            Assert.fail("Cannot read script",err);
-            return;
-        }
-        final SAMRecordIterator iter = samReader.iterator();
-        int count = 0;
-        while (iter.hasNext()) {
-            if (filter.filterOut(iter.next())) {
-                continue;
-            }
-            ++count;
-        }
-        iter.close();
-        CloserUtil.close(samReader);
-        Assert.assertEquals(count, expectCount, "Expected number of reads " + expectCount + " but got " + count);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/MappingQualityFilterTest.java b/src/test/java/htsjdk/samtools/filter/MappingQualityFilterTest.java
deleted file mode 100644
index 2bffcd6..0000000
--- a/src/test/java/htsjdk/samtools/filter/MappingQualityFilterTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class MappingQualityFilterTest {
-    private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-
-    @BeforeTest
-    public void setUp() {
-        // note the side effects...
-        builder.addFrag("zeroMQ", 1, 1, false).setMappingQuality(0);
-        builder.addFrag("lowMQ", 1, 1, false).setMappingQuality(10);
-        builder.addFrag("highMQ", 1, 1, false).setMappingQuality(30);
-    }
-
-    @Test(dataProvider = "data")
-    public void testMappingQualityFilter(final int minMappingQuality, final int expectedPassingRecords) {
-        final MappingQualityFilter filter = new MappingQualityFilter(minMappingQuality);
-        int actualPassingRecords = 0;
-        for (final SAMRecord rec : builder) {
-            if (!filter.filterOut(rec)) actualPassingRecords++;
-        }
-        Assert.assertEquals(actualPassingRecords, expectedPassingRecords);
-    }
-
-    @DataProvider(name = "data")
-    private Object[][] testData() {
-        return new Object[][]{
-                {0, 3},
-                {10, 2},
-                {30, 1}
-        };
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/OverclippedReadFilterTest.java b/src/test/java/htsjdk/samtools/filter/OverclippedReadFilterTest.java
deleted file mode 100644
index bff8491..0000000
--- a/src/test/java/htsjdk/samtools/filter/OverclippedReadFilterTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class OverclippedReadFilterTest {
-    private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-    private final int unclippedBasesThreshold = 30;
-
-    private SAMRecord buildFrag(final String name, final String cigarString) {
-        // for this test, all we care about is the CIGAR
-        return builder.addFrag(name, 0, 1, false, false, cigarString, null, 30);
-    }
-
-    @Test(dataProvider = "data")
-    public void testOverclippedReadFilter(final String name, final String cigar, final boolean filterSingleEndClips, final boolean shouldFail) {
-        final OverclippedReadFilter filter = new OverclippedReadFilter(unclippedBasesThreshold, filterSingleEndClips);
-        final SAMRecord rec = buildFrag(name, cigar);
-        Assert.assertEquals(filter.filterOut(rec), shouldFail);
-    }
-
-    @DataProvider(name = "data")
-    private Object[][] testData() {
-        return new Object[][]{
-                {"foo", "1S10M1S", false, true},
-                {"foo", "1S10X1S", false, true},
-                {"foo", "1H1S10M1S1H", false, true},
-                {"foo", "1S40M1S", false, false},
-                {"foo", "1S40X1S", false, false},
-                {"foo", "1H10M1S", false, false},
-                {"foo", "1S10M1H", false, false},
-                {"foo", "10M1S", false, false},
-                {"foo", "1S10M", false, false},
-                {"foo", "10M1S", true, true},
-                {"foo", "1S10M", true, true},
-                {"foo", "1S10M10D10M1S", false, true},
-                {"foo", "1S1M40I1S", false, false},
-                {"foo", "1S10I1S", false, true},
-                {"foo", "1S40I1S", false, false},
-                {"foo", "1S40I1S", true, false},
-                {"foo", "25S40I25M", true, false},
-                {"foo", "25S25M", true, true},
-                {"foo", "25S25X", true, true},
-                {"foo", "25S25H", true, true},
-                {"foo", "25S25H", false, false},
-                {"foo", "25S25M25S", false, true},
-                {"foo", "25M25S", true, true},
-                {"foo", "25S25M", true, true},
-                {"foo", "25S35S", true, true},
-                {"foo", "25S35M25S", true, false},
-                {"foo", "35M25S", true, false},
-                {"foo", "25S35M", true, false}
-        };
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/SolexaNoiseFilterTest.java b/src/test/java/htsjdk/samtools/filter/SolexaNoiseFilterTest.java
deleted file mode 100644
index 96fa324..0000000
--- a/src/test/java/htsjdk/samtools/filter/SolexaNoiseFilterTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Basic test for the SolexaNoiseFilter
- */
-public class SolexaNoiseFilterTest {
-
-    private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-    private final SolexaNoiseFilter filter = new SolexaNoiseFilter();
-
-    /**
-     * Basic positive and negative tests for the PolyANoiseFilter
-     *
-     * @param sequence          The sequence to be tested
-     * @param expectedResult    The expected result (true is the sequence should match the filter, otherwise false)
-     */
-    @Test(dataProvider="data")
-    public void testSolexaNoiseFilter(final String testName, final String sequence, final boolean expectedResult) {
-        builder.addUnmappedFragment("testfrag");
-        final SAMRecord record = builder.iterator().next();
-        record.setReadString(sequence);
-        Assert.assertEquals(filter.filterOut(record), expectedResult, testName);
-    }
-
-
-    /**
-     * Data for various sequences which may or may not match the filter.
-     */
-    @DataProvider(name = "data")
-    private Object[][] getSolexaNoiseTestData()
-    {
-        return new Object[][]{
-            {"36-base read all a's filter out", "AAAAAaaaaaAAAAAAAAAAAAAAAAAAAAaaaaaa", true},
-            {"36-base read with n, filter out", "AAAAAaaaaaAAAAAAAAAAAAAAAAAAAAaaaaan", true}, 
-            {"51-base read, final base mismatch", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT", false},
-            {"51-base read, middle base mismatch", "aaaaaaaaaaaaaaaaaaaaaaaaaaTaaaaaaaaaaaaaaaaaaaaaaaa", false},
-            {"76-base read, a's and n's, filter out",
-                    "aaaaaaaaaaaaaaaaaNNaaaaaaaaaaaaaaaaaaaaaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", true},
-            {"76-base doesn't match",
-                    "NNNATAAAnnnnnnnnnnTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT", false},
-        };
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/filter/TagFilterTest.java b/src/test/java/htsjdk/samtools/filter/TagFilterTest.java
deleted file mode 100644
index 6e0c702..0000000
--- a/src/test/java/htsjdk/samtools/filter/TagFilterTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.ReservedTagConstants;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Tests for the TagFilter class
- */
-public class TagFilterTest {
-    private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-
-
-    /**
-     * Basic positive and negative tests for the TagFilter
-     *
-     * @param tag               The tag to be tested
-     * @param validValues       The values the filter should test for
-     * @param testValue         The value to test for in the record
-     * @param expectedResult    The expected result (true is the sequence should match the filter, otherwise false)
-     */
-    @Test(dataProvider="data")
-    public void testTagFilter(final String testName, final String tag, final List<Object> validValues,
-                              final Object testValue, final boolean expectedResult) {
-        final TagFilter filter = new TagFilter(tag, validValues);
-        builder.addUnmappedFragment("testfrag");
-        final SAMRecord record = builder.iterator().next();
-        if (testValue != null) {
-            record.setAttribute(tag, testValue);
-        }
-        Assert.assertEquals(filter.filterOut(record), expectedResult, testName);
-    }
-
-
-    /**
-     * Data for various sequences which may or may not match the filter.
-     */
-    @DataProvider(name = "data")
-    private Object[][] getTagFilterTestData()
-    {
-        return new Object[][]{
-            {"Basic positive test", ReservedTagConstants.XN, Arrays.asList(1), 1, true},
-            {"Multi-value positive test", ReservedTagConstants.XN, Arrays.asList(1,2,3), 1, true},
-            {"Incorrect value negative test", ReservedTagConstants.XN, Arrays.asList(1), 2, false},
-            {"Null value negative test", ReservedTagConstants.XN, Arrays.asList(1), null, false} 
-        };
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/liftover/LiftOverTest.java b/src/test/java/htsjdk/samtools/liftover/LiftOverTest.java
deleted file mode 100644
index 8e9f92e..0000000
--- a/src/test/java/htsjdk/samtools/liftover/LiftOverTest.java
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.liftover;
-
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.OverlapDetector;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.PrintWriter;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class LiftOverTest {
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/liftover");
-    private static final File CHAIN_FILE = new File(TEST_DATA_DIR, "hg18ToHg19.over.chain");
-
-    private LiftOver liftOver;
-    Map<String, Set<String>> contigMap;
-
-    @BeforeClass
-    public void initLiftOver() {
-        liftOver = new LiftOver(CHAIN_FILE);
-        contigMap = liftOver.getContigMap();
-    }
-
-    @Test(dataProvider = "testIntervals")
-    public void testBasic(final Interval in, final Interval expected) {
-        final Interval out = liftOver.liftOver(in);
-        Assert.assertEquals(out, expected);
-
-    }
-
-    @DataProvider(name = "testIntervals")
-    public Object[][] makeTestIntervals() {
-        return new Object[][] {
-                {new Interval("chr3", 50911035, 50911051), null},
-                {new Interval("chr1", 16776377, 16776452),    new Interval("chr1", 16903790, 16903865)},
-                {new Interval("chr2", 30575990, 30576065),    new Interval("chr2", 30722486, 30722561)},
-                {new Interval("chr3", 12157217, 12157292),    new Interval("chr3", 12182217, 12182292)},
-                {new Interval("chr4", 12503121, 12503196),    new Interval("chr4", 12894023, 12894098)},
-                {new Interval("chr5", 13970930, 13971005),    new Interval("chr5", 13917930, 13918005)},
-                {new Interval("chr6", 13838774, 13838849),    new Interval("chr6", 13730795, 13730870)},
-                {new Interval("chr7", 23978336, 23978411),    new Interval("chr7", 24011811, 24011886)},
-                {new Interval("chr8", 13337368, 13337443),    new Interval("chr8", 13292997, 13293072)},
-                {new Interval("chr9", 35059282, 35059357),    new Interval("chr9", 35069282, 35069357)},
-                {new Interval("chr10", 7893794, 7893869),     new Interval("chr10", 7853788, 7853863)},
-                {new Interval("chr11", 17365784, 17365859),   new Interval("chr11", 17409208, 17409283)},
-                {new Interval("chr12", 4530193, 4530268),     new Interval("chr12", 4659932, 4660007)},
-                {new Interval("chr13", 29398707, 29398782),   new Interval("chr13", 30500707, 30500782)},
-                {new Interval("chr14", 22955252, 22955327),   new Interval("chr14", 23885412, 23885487)},
-                {new Interval("chr15", 27477379, 27477454),   new Interval("chr15", 29690087, 29690162)},
-                {new Interval("chr16", 13016380, 13016455),   new Interval("chr16", 13108879, 13108954)},
-                {new Interval("chr17", 28318218, 28318293),   new Interval("chr17", 31294105, 31294180)},
-                {new Interval("chr18", 42778225, 42778300),   new Interval("chr18", 44524227, 44524302)},
-                {new Interval("chr19", 8340119, 8340194),     new Interval("chr19", 8434119, 8434194)},
-                {new Interval("chr20", 39749226, 39749301),   new Interval("chr20", 40315812, 40315887)},
-                {new Interval("chr21", 20945136, 20945211),   new Interval("chr21", 22023265, 22023340)},
-                {new Interval("chr22", 32307031, 32307106),   new Interval("chr22", 33977031, 33977106)},
-                {new Interval("chrX", 34252958, 34253033) ,   new Interval("chrX", 34343037, 34343112)},
-                // Sampling from /seq/references/HybSelOligos/whole_exome_refseq_coding/whole_exome_refseq_coding.targets.interval_list
-                {new Interval("chr1", 58952, 59873),	new Interval("chr1", 69089, 70010)},
-                {new Interval("chr1", 7733844, 7734041),	new Interval("chr1", 7811257, 7811454)},
-                {new Interval("chr1", 16261179, 16261276),	new Interval("chr1", 16388592, 16388689)},
-                {new Interval("chr1", 23634929, 23635110),	new Interval("chr1", 23762342, 23762523)},
-                {new Interval("chr1", 31910910, 31911030),	new Interval("chr1", 32138323, 32138443)},
-                {new Interval("chr1", 39686851, 39687024),	new Interval("chr1", 39914264, 39914437)},
-                {new Interval("chr1", 46434068, 46434185),	new Interval("chr1", 46661481, 46661598)},
-                {new Interval("chr1", 60102890, 60102928),	new Interval("chr1", 60330302, 60330340)},
-                {new Interval("chr1", 84734151, 84734336),	new Interval("chr1", 84961563, 84961748)},
-                {new Interval("chr1", 100529545, 100529650),	new Interval("chr1", 100756957, 100757062)},
-                {new Interval("chr1", 114771320, 114771441),	new Interval("chr1", 114969797, 114969918)},
-                {new Interval("chr1", 148564831, 148564965),	new Interval("chr1", 150298207, 150298341)},
-                {new Interval("chr1", 153293008, 153293090),	new Interval("chr1", 155026384, 155026466)},
-                {new Interval("chr1", 158167550, 158167677),	new Interval("chr1", 159900926, 159901053)},
-                {new Interval("chr1", 169444555, 169444718),	new Interval("chr1", 171177931, 171178094)},
-                {new Interval("chr1", 183535970, 183536100),	new Interval("chr1", 185269347, 185269477)},
-                {new Interval("chr1", 201411300, 201411508),	new Interval("chr1", 203144677, 203144885)},
-                {new Interval("chr1", 212862043, 212862249),	new Interval("chr1", 214795420, 214795626)},
-                {new Interval("chr1", 228992499, 228992560),	new Interval("chr1", 230925876, 230925937)},
-                {new Interval("chr1", 246268191, 246269133),	new Interval("chr1", 248201568, 248202510)},
-                {new Interval("chr2", 25027765, 25027929),	new Interval("chr2", 25174261, 25174425)},
-                {new Interval("chr2", 32572109, 32572240),	new Interval("chr2", 32718605, 32718736)},
-                {new Interval("chr2", 53988959, 53989061),	new Interval("chr2", 54135455, 54135557)},
-                {new Interval("chr2", 71749748, 71749847),	new Interval("chr2", 71896240, 71896339)},
-                {new Interval("chr2", 96059879, 96060011),	new Interval("chr2", 96696152, 96696284)},
-                {new Interval("chr2", 109923614, 109923763),	new Interval("chr2", 110566325, 110566474)},
-                {new Interval("chr2", 130655571, 130655646),	new Interval("chr2", 130939101, 130939176)},
-                {new Interval("chr2", 159228028, 159228205),	new Interval("chr2", 159519782, 159519959)},
-                {new Interval("chr2", 172639236, 172639282),	new Interval("chr2", 172930990, 172931036)},
-                {new Interval("chr2", 189558634, 189558751),	new Interval("chr2", 189850389, 189850506)},
-                {new Interval("chr2", 203547300, 203547466),	new Interval("chr2", 203839055, 203839221)},
-                {new Interval("chr2", 219578985, 219579191),	new Interval("chr2", 219870741, 219870947)},
-                {new Interval("chr2", 232982284, 232982404),	new Interval("chr2", 233274040, 233274160)},
-                {new Interval("chr3", 3114819, 3114976),	new Interval("chr3", 3139819, 3139976)},
-                {new Interval("chr3", 16333337, 16333745),	new Interval("chr3", 16358333, 16358741)},
-                {new Interval("chr3", 40183652, 40183736),	new Interval("chr3", 40208648, 40208732)},
-                {new Interval("chr3", 48601077, 48601227),	new Interval("chr3", 48626073, 48626223)},
-                {new Interval("chr3", 52287255, 52287419),	new Interval("chr3", 52312215, 52312379)},
-                {new Interval("chr3", 63979313, 63979425),	new Interval("chr3", 64004273, 64004385)},
-                {new Interval("chr3", 110234255, 110234364),	new Interval("chr3", 108751565, 108751674)},
-                {new Interval("chr3", 126088466, 126088539),	new Interval("chr3", 124605776, 124605849)},
-                {new Interval("chr3", 137600279, 137600363),	new Interval("chr3", 136117589, 136117673)},
-                {new Interval("chr3", 159845116, 159845200),	new Interval("chr3", 158362422, 158362506)},
-                {new Interval("chr3", 185387877, 185387927),	new Interval("chr3", 183905183, 183905233)},
-                {new Interval("chr3", 199065658, 199065715),	new Interval("chr3", 197581261, 197581318)},
-                {new Interval("chr4", 10152742, 10152765),	new Interval("chr4", 10543644, 10543667)},
-                {new Interval("chr4", 47243396, 47243638),	new Interval("chr4", 47548639, 47548881)},
-                {new Interval("chr4", 72632227, 72632303),	new Interval("chr4", 72413363, 72413439)},
-                {new Interval("chr4", 88942682, 88942736),	new Interval("chr4", 88723658, 88723712)},
-                {new Interval("chr4", 114381088, 114381190),	new Interval("chr4", 114161639, 114161741)},
-                {new Interval("chr4", 151338602, 151338707),	new Interval("chr4", 151119152, 151119257)},
-                {new Interval("chr4", 184429225, 184429390),	new Interval("chr4", 184192231, 184192396)},
-                {new Interval("chr5", 14804176, 14804350),	new Interval("chr5", 14751176, 14751350)},
-                {new Interval("chr5", 43687596, 43687745),	new Interval("chr5", 43651839, 43651988)},
-                {new Interval("chr5", 71651730, 71651806),	new Interval("chr5", 71615974, 71616050)},
-                {new Interval("chr5", 95017504, 95017771),	new Interval("chr5", 94991748, 94992015)},
-                {new Interval("chr5", 128984208, 128984352),	new Interval("chr5", 128956309, 128956453)},
-                {new Interval("chr5", 140033038, 140033159),	new Interval("chr5", 140052854, 140052975)},
-                {new Interval("chr5", 153045976, 153046084),	new Interval("chr5", 153065783, 153065891)},
-                {new Interval("chr5", 176255669, 176255768),	new Interval("chr5", 176323063, 176323162)},
-                {new Interval("chr6", 10810586, 10810710),	new Interval("chr6", 10702600, 10702724)},
-                {new Interval("chr6", 30666289, 30666459),	new Interval("chr6", 30558310, 30558480)},
-                {new Interval("chr6", 33082591, 33082598),	new Interval("chr6", 32974613, 32974620)},
-                {new Interval("chr6", 39940185, 39940263),	new Interval("chr6", 39832207, 39832285)},
-                {new Interval("chr6", 50789726, 50789768),	new Interval("chr6", 50681767, 50681809)},
-                {new Interval("chr6", 79721666, 79721720),	new Interval("chr6", 79664947, 79665001)},
-                {new Interval("chr6", 108336822, 108336934),	new Interval("chr6", 108230129, 108230241)},
-                {new Interval("chr6", 131240935, 131241085),	new Interval("chr6", 131199242, 131199392)},
-                {new Interval("chr6", 151799272, 151799384),	new Interval("chr6", 151757579, 151757691)},
-                {new Interval("chr6", 169897302, 169897445),	new Interval("chr6", 170155377, 170155520)},
-                {new Interval("chr7", 17341792, 17341937),	new Interval("chr7", 17375267, 17375412)},
-                {new Interval("chr7", 38875269, 38875380),	new Interval("chr7", 38908744, 38908855)},
-                {new Interval("chr7", 72563000, 72563120),	new Interval("chr7", 72925064, 72925184)},
-                {new Interval("chr7", 89839403, 89839480),	new Interval("chr7", 90001467, 90001544)},
-                {new Interval("chr7", 100063781, 100063867),	new Interval("chr7", 100225845, 100225931)},
-                {new Interval("chr7", 111889559, 111889671),	new Interval("chr7", 112102323, 112102435)},
-                {new Interval("chr7", 133900771, 133900840),	new Interval("chr7", 134250231, 134250300)},
-                {new Interval("chr7", 149124615, 149124769),	new Interval("chr7", 149493682, 149493836)},
-                {new Interval("chr8", 9647462, 9647548),	new Interval("chr8", 9610052, 9610138)},
-                {new Interval("chr8", 27203588, 27203614),	new Interval("chr8", 27147671, 27147697)},
-                {new Interval("chr8", 43171970, 43172044),	new Interval("chr8", 43052813, 43052887)},
-                {new Interval("chr8", 76088775, 76088894),	new Interval("chr8", 75926220, 75926339)},
-                {new Interval("chr8", 103641854, 103642290),	new Interval("chr8", 103572678, 103573114)},
-                {new Interval("chr8", 133913660, 133913828),	new Interval("chr8", 133844478, 133844646)},
-                {new Interval("chr8", 145697031, 145697164),	new Interval("chr8", 145726223, 145726356)},
-                {new Interval("chr9", 26985517, 26985849),	new Interval("chr9", 26995517, 26995849)},
-                {new Interval("chr9", 68496721, 68496793),	new Interval("chr9", 69206901, 69206973)},
-                {new Interval("chr9", 94051959, 94052046),	new Interval("chr9", 95012138, 95012225)},
-                {new Interval("chr9", 110750285, 110750337),	new Interval("chr9", 111710464, 111710516)},
-                {new Interval("chr9", 124416836, 124417782),	new Interval("chr9", 125377015, 125377961)},
-                {new Interval("chr9", 130939690, 130939794),	new Interval("chr9", 131899869, 131899973)},
-                {new Interval("chr9", 138395593, 138395667),	new Interval("chr9", 139275772, 139275846)},
-                {new Interval("chr10", 6048112, 6048310),	new Interval("chr10", 6008106, 6008304)},
-                {new Interval("chr10", 26599573, 26599693),	new Interval("chr10", 26559567, 26559687)},
-                {new Interval("chr10", 51507890, 51507920),	new Interval("chr10", 51837884, 51837914)},
-                {new Interval("chr10", 74343070, 74343234),	new Interval("chr10", 74673064, 74673228)},
-                {new Interval("chr10", 93604764, 93604865),	new Interval("chr10", 93614784, 93614885)},
-                {new Interval("chr10", 101985412, 101985513),	new Interval("chr10", 101995422, 101995523)},
-                {new Interval("chr10", 115325644, 115325755),	new Interval("chr10", 115335654, 115335765)},
-                {new Interval("chr10", 129062310, 129062470),	new Interval("chr10", 129172320, 129172480)},
-                {new Interval("chr11", 1904274, 1904289),	new Interval("chr11", 1947698, 1947713)},
-                {new Interval("chr11", 11928485, 11928607),	new Interval("chr11", 11971909, 11972031)},
-                {new Interval("chr11", 33326642, 33326942),	new Interval("chr11", 33370066, 33370366)},
-                {new Interval("chr11", 55554469, 55555445),	new Interval("chr11", 55797893, 55798869)},
-                {new Interval("chr11", 62505888, 62506060),	new Interval("chr11", 62749312, 62749484)},
-                {new Interval("chr11", 65488560, 65488619),	new Interval("chr11", 65731984, 65732043)},
-                {new Interval("chr11", 71618353, 71618446),	new Interval("chr11", 71940705, 71940798)},
-                {new Interval("chr11", 89174516, 89174750),	new Interval("chr11", 89534868, 89535102)},
-                {new Interval("chr11", 111349955, 111350190),	new Interval("chr11", 111844745, 111844980)},
-                {new Interval("chr11", 120195672, 120195841),	new Interval("chr11", 120690462, 120690631)},
-                {new Interval("chr12", 1089617, 1089776),	new Interval("chr12", 1219356, 1219515)},
-                {new Interval("chr12", 8894021, 8894139),	new Interval("chr12", 9002754, 9002872)},
-                {new Interval("chr12", 26455518, 26455614),	new Interval("chr12", 26564251, 26564347)},
-                {new Interval("chr12", 46663731, 46663788),	new Interval("chr12", 48377464, 48377521)},
-                {new Interval("chr12", 51502394, 51502432),	new Interval("chr12", 53216127, 53216165)},
-                {new Interval("chr12", 55603883, 55604103),	new Interval("chr12", 57317616, 57317836)},
-                {new Interval("chr12", 69218200, 69218280),	new Interval("chr12", 70931933, 70932013)},
-                {new Interval("chr12", 97543837, 97544677),	new Interval("chr12", 99019706, 99020546)},
-                {new Interval("chr12", 108438951, 108439074),	new Interval("chr12", 109954568, 109954691)},
-                {new Interval("chr12", 119021215, 119021343),	new Interval("chr12", 120536832, 120536960)},
-                {new Interval("chr12", 127849755, 127849917),	new Interval("chr12", 129283802, 129283964)},
-                {new Interval("chr13", 28900978, 28901035),	new Interval("chr13", 30002978, 30003035)},
-                {new Interval("chr13", 48646570, 48646698),	new Interval("chr13", 49748569, 49748697)},
-                {new Interval("chr13", 98989699, 98989814),	new Interval("chr13", 100191698, 100191813)},
-                {new Interval("chr14", 20929460, 20929643),	new Interval("chr14", 21859620, 21859803)},
-                {new Interval("chr14", 33338689, 33340068),	new Interval("chr14", 34268938, 34270317)},
-                {new Interval("chr14", 55217155, 55217163),	new Interval("chr14", 56147402, 56147410)},
-                {new Interval("chr14", 71260115, 71260358),	new Interval("chr14", 72190362, 72190605)},
-                {new Interval("chr14", 89806293, 89806451),	new Interval("chr14", 90736540, 90736698)},
-                {new Interval("chr14", 102548185, 102548280),	new Interval("chr14", 103478432, 103478527)},
-                {new Interval("chr15", 31917122, 31918453),	new Interval("chr15", 34129830, 34131161)},
-                {new Interval("chr15", 40481129, 40481302),	new Interval("chr15", 42693837, 42694010)},
-                {new Interval("chr15", 48649374, 48649484),	new Interval("chr15", 50862082, 50862192)},
-                {new Interval("chr15", 61768839, 61768953),	new Interval("chr15", 63981786, 63981900)},
-                {new Interval("chr15", 72115399, 72115456),	new Interval("chr15", 74328346, 74328403)},
-                {new Interval("chr15", 83031858, 83032011),	new Interval("chr15", 85230854, 85231007)},
-                {new Interval("chr16", 79709, 79902),	new Interval("chr16", 139709, 139902)},
-                {new Interval("chr16", 2285590, 2285744),	new Interval("chr16", 2345589, 2345743)},
-                {new Interval("chr16", 14872977, 14873044),	new Interval("chr16", 14965476, 14965543)},
-                {new Interval("chr16", 23611004, 23611155),	new Interval("chr16", 23703503, 23703654)},
-                {new Interval("chr16", 31004784, 31005007),	new Interval("chr16", 31097283, 31097506)},
-                {new Interval("chr16", 55745701, 55745922),	new Interval("chr16", 57188200, 57188421)},
-                {new Interval("chr16", 66647766, 66647830),	new Interval("chr16", 68090265, 68090329)},
-                {new Interval("chr16", 79224415, 79224636),	new Interval("chr16", 80666914, 80667135)},
-                {new Interval("chr17", 1320663, 1320735),	new Interval("chr17", 1373913, 1373985)},
-                {new Interval("chr17", 5304981, 5305155),	new Interval("chr17", 5364257, 5364431)},
-                {new Interval("chr17", 8588568, 8588654),	new Interval("chr17", 8647843, 8647929)},
-                {new Interval("chr17", 18192362, 18192481),	new Interval("chr17", 18251637, 18251756)},
-                {new Interval("chr17", 26514328, 26514522),	new Interval("chr17", 29490202, 29490396)},
-                {new Interval("chr17", 35069238, 35069334),	new Interval("chr17", 37815712, 37815808)},
-                {new Interval("chr17", 38377148, 38377241),	new Interval("chr17", 41123622, 41123715)},
-                {new Interval("chr17", 44472316, 44472454),	new Interval("chr17", 47117317, 47117455)},
-                {new Interval("chr17", 55482984, 55483122),	new Interval("chr17", 58128202, 58128340)},
-                {new Interval("chr17", 64595087, 64595211),	new Interval("chr17", 67083492, 67083616)},
-                {new Interval("chr17", 72814816, 72814876),	new Interval("chr17", 75303221, 75303281)},
-                {new Interval("chr17", 78167687, 78167812),	new Interval("chr17", 80574398, 80574523)},
-                {new Interval("chr18", 19653801, 19653961),	new Interval("chr18", 21399803, 21399963)},
-                {new Interval("chr18", 46766985, 46767455),	new Interval("chr18", 48512987, 48513457)},
-                {new Interval("chr19", 822924, 823120),	new Interval("chr19", 871924, 872120)},
-                {new Interval("chr19", 4200223, 4200327),	new Interval("chr19", 4249223, 4249327)},
-                {new Interval("chr19", 8094666, 8094894),	new Interval("chr19", 8188666, 8188894)},
-                {new Interval("chr19", 11657040, 11657607),	new Interval("chr19", 11796040, 11796607)},
-                {new Interval("chr19", 16298665, 16298844),	new Interval("chr19", 16437665, 16437844)},
-                {new Interval("chr19", 19650533, 19650597),	new Interval("chr19", 19789533, 19789597)},
-                {new Interval("chr19", 42008351, 42008363),	new Interval("chr19", 37316511, 37316523)},
-                {new Interval("chr19", 46446486, 46446567),	new Interval("chr19", 41754646, 41754727)},
-                {new Interval("chr19", 51212087, 51212169),	new Interval("chr19", 46520247, 46520329)},
-                {new Interval("chr19", 55052042, 55052201),	new Interval("chr19", 50360230, 50360389)},
-                {new Interval("chr19", 60200495, 60200669),	new Interval("chr19", 55508683, 55508857)},
-                {new Interval("chr20", 3244380, 3244434),	new Interval("chr20", 3296380, 3296434)},
-                {new Interval("chr20", 25145282, 25145374),	new Interval("chr20", 25197282, 25197374)},
-                {new Interval("chr20", 35182714, 35182855),	new Interval("chr20", 35749300, 35749441)},
-                {new Interval("chr20", 46797751, 46797826),	new Interval("chr20", 47364344, 47364419)},
-                {new Interval("chr20", 61546454, 61546633),	new Interval("chr20", 62076010, 62076189)},
-                {new Interval("chr21", 36666540, 36666701),	new Interval("chr21", 37744670, 37744831)},
-                {new Interval("chr21", 46450176, 46450285),	new Interval("chr21", 47625748, 47625857)},
-                {new Interval("chr22", 22890366, 22890533),	new Interval("chr22", 24560366, 24560533)},
-                {new Interval("chr22", 32487356, 32487465),	new Interval("chr22", 34157356, 34157465)},
-                {new Interval("chr22", 40469028, 40469146),	new Interval("chr22", 42139082, 42139200)},
-                {new Interval("chr22", 49365651, 49365713),	new Interval("chr22", 51018785, 51018847)},
-                {new Interval("chrX", 24135748, 24135895),	new Interval("chrX", 24225827, 24225974)},
-                {new Interval("chrX", 48708293, 48708459),	new Interval("chrX", 48823349, 48823515)},
-                {new Interval("chrX", 69406673, 69406721),	new Interval("chrX", 69489948, 69489996)},
-                {new Interval("chrX", 101459444, 101459531),	new Interval("chrX", 101572788, 101572875)},
-                {new Interval("chrX", 128442357, 128442474),	new Interval("chrX", 128614676, 128614793)},
-                {new Interval("chrX", 152701873, 152701902),	new Interval("chrX", 153048679, 153048708)},
-                {new Interval("chrY", 2715028, 2715646),	new Interval("chrY", 2655028, 2655646)},
-                {new Interval("chrY", 26179988, 26180064),	new Interval("chrY", 27770600, 27770676)},
-                // Some intervals that are flipped in the new genome
-                {new Interval("chr1", 2479704, 2479833, false, "target_549"),        new Interval("chr1", 2494585, 2494714, true, "target_549")},
-                {new Interval("chr1", 2480081, 2480116, false, "target_550"),        new Interval("chr1", 2494302, 2494337, true, "target_550")},
-                {new Interval("chr1", 2481162, 2481308, false, "target_551"),        new Interval("chr1", 2493110, 2493256, true, "target_551")},
-                {new Interval("chr1", 2482263, 2482357, false, "target_552"),        new Interval("chr1", 2492061, 2492155, true, "target_552")},
-                {new Interval("chr1", 2482999, 2483158, false, "target_553"),        new Interval("chr1", 2491260, 2491419, true, "target_553")},
-                {new Interval("chr1", 2484509, 2484638, false, "target_554"),        new Interval("chr1", 2489780, 2489909, true, "target_554")},
-                {new Interval("chr1", 2485143, 2485255, false, "target_555"),        new Interval("chr1", 2489163, 2489275, true, "target_555")},
-                {new Interval("chr1", 2486244, 2486316, false, "target_556"),        new Interval("chr1", 2488102, 2488174, true, "target_556")},
-                {new Interval("chr2", 110735471, 110735558, false, "target_101982"), new Interval("chr2", 110585640, 110585727, true, "target_101982")},
-                {new Interval("chr2", 110735648, 110735831, false, "target_101983"), new Interval("chr2", 110585367, 110585550, true, "target_101983")},
-                {new Interval("chr2", 110736772, 110736922, false, "target_101984"), new Interval("chr2", 110584276, 110584426, true, "target_101984")},
-                {new Interval("chr2", 110737181, 110737322, false, "target_101985"), new Interval("chr2", 110583876, 110584017, true, "target_101985")},
-                {new Interval("chr2", 110737585, 110737747, false, "target_101986"), new Interval("chr2", 110583451, 110583613, true, "target_101986")},
-                {new Interval("chr2", 110738666, 110738793, false, "target_101987"), new Interval("chr2", 110582405, 110582532, true, "target_101987")},
-                {new Interval("chr2", 110738957, 110739136, false, "target_101988"), new Interval("chr2", 110582062, 110582241, true, "target_101988")},
-                {new Interval("chr2", 110739216, 110739401, false, "target_101989"), new Interval("chr2", 110581797, 110581982, true, "target_101989")},
-                {new Interval("chr2", 110741555, 110741768, false, "target_101990"), new Interval("chr2", 110579480, 110579693, true, "target_101990")},
-                {new Interval("chr2", 110743887, 110743978, false, "target_101991"), new Interval("chr2", 110577271, 110577362, true, "target_101991")},
-                {new Interval("chr2", 110750021, 110750220, false, "target_101992"), new Interval("chr2", 110571035, 110571234, true, "target_101992")},
-                {new Interval("chr2", 110754786, 110754935, false, "target_101993"), new Interval("chr2", 110566325, 110566474, true, "target_101993")},
-                {new Interval("chr2", 110755277, 110755511, false, "target_101994"), new Interval("chr2", 110565749, 110565983, true, "target_101994")},
-                {new Interval("chr2", 110759547, 110759703, false, "target_101995"), new Interval("chr2", 110561554, 110561710, true, "target_101995")},
-                {new Interval("chr2", 110760135, 110760250, false, "target_101996"), new Interval("chr2", 110561007, 110561122, true, "target_101996")},
-                {new Interval("chr2", 110761828, 110761899, false, "target_101997"), new Interval("chr2", 110559358, 110559429, true, "target_101997")},
-                {new Interval("chr2", 110769521, 110769596, false, "target_101998"), new Interval("chr2", 110552041, 110552116, true, "target_101998")},
-                {new Interval("chr2", 111012182, 111012298, false, "target_101999"), new Interval("chr2", 108484181, 108484297, true, "target_101999")},
-                {new Interval("chr13", 113547048, 113547139, false, "target_51005"), new Interval("chr13", 114566804, 114566895, true, "target_51005")},
-                {new Interval("chr13", 113547227, 113547397, false, "target_51006"), new Interval("chr13", 114566546, 114566716, true, "target_51006")},
-                {new Interval("chr13", 113562918, 113562946, false, "target_51007"), new Interval("chr13", 114550997, 114551025, true, "target_51007")},
-                {new Interval("chr13", 113564379, 113564445, false, "target_51008"), new Interval("chr13", 114549498, 114549564, true, "target_51008")},
-                {new Interval("chr13", 113571118, 113571244, false, "target_51009"), new Interval("chr13", 114542699, 114542825, true, "target_51009")},
-                {new Interval("chr13", 113572777, 113572903, false, "target_51010"), new Interval("chr13", 114541040, 114541166, true, "target_51010")},
-                {new Interval("chr13", 113575333, 113575459, false, "target_51011"), new Interval("chr13", 114538484, 114538610, true, "target_51011")},
-                {new Interval("chr13", 113576296, 113576421, false, "target_51012"), new Interval("chr13", 114537522, 114537647, true, "target_51012")},
-                {new Interval("chr13", 113578216, 113578338, false, "target_51013"), new Interval("chr13", 114535605, 114535727, true, "target_51013")},
-                {new Interval("chr13", 113578480, 113578673, false, "target_51014"), new Interval("chr13", 114535270, 114535463, true, "target_51014")},
-                {new Interval("chr13", 113582257, 113582425, false, "target_51015"), new Interval("chr13", 114531518, 114531686, true, "target_51015")},
-                {new Interval("chr13", 113583804, 113583976, false, "target_51016"), new Interval("chr13", 114529967, 114530139, true, "target_51016")},
-                {new Interval("chr13", 113587418, 113587597, false, "target_51017"), new Interval("chr13", 114526346, 114526525, true, "target_51017")},
-                {new Interval("chr13", 113588782, 113589014, false, "target_51018"), new Interval("chr13", 114524929, 114525161, true, "target_51018")},
-                {new Interval("chr13", 113589950, 113590108, false, "target_51019"), new Interval("chr13", 114523835, 114523993, true, "target_51019")},
-                {new Interval("chr13", 113599065, 113599236, false, "target_51020"), new Interval("chr13", 114514707, 114514878, true, "target_51020")},
-                {new Interval("chr13", 113605940, 113606087, false, "target_51021"), new Interval("chr13", 114507856, 114508003, true, "target_51021")},
-                {new Interval("chr13", 113609156, 113609319, false, "target_51022"), new Interval("chr13", 114504624, 114504787, true, "target_51022")},
-                {new Interval("chr13", 113610056, 113610145, false, "target_51023"), new Interval("chr13", 114503798, 114503887, true, "target_51023")},
-                {new Interval("chr13", 113611549, 113611633, false, "target_51024"), new Interval("chr13", 114502310, 114502394, true, "target_51024")},
-                {new Interval("chr13", 113615731, 113615824, false, "target_51025"), new Interval("chr13", 114498119, 114498212, true, "target_51025")},
-                {new Interval("chr13", 113641808, 113641874, false, "target_51026"), new Interval("chr13", 114472069, 114472135, true, "target_51026")},
-                {new Interval("chr13", 113644711, 113644857, false, "target_51027"), new Interval("chr13", 114469086, 114469232, true, "target_51027")},
-                {new Interval("chr13", 113651799, 113651848, false, "target_51028"), new Interval("chr13", 114462241, 114462290, true, "target_51028")},
-                {new Interval("chr17", 33541604, 33542176, false, "target_76102"),   new Interval("chr17", 36294030, 36294602, true, "target_76102")},
-                {new Interval("chr17", 33543154, 33543310, false, "target_76103"),   new Interval("chr17", 36292896, 36293052, true, "target_76103")},
-                {new Interval("chr17", 33543677, 33543780, false, "target_76104"),   new Interval("chr17", 36292426, 36292529, true, "target_76104")},
-                {new Interval("chr17", 33544240, 33544309, false, "target_76105"),   new Interval("chr17", 36291897, 36291966, true, "target_76105")},
-                {new Interval("chr17", 33544690, 33544788, false, "target_76106"),   new Interval("chr17", 36291418, 36291516, true, "target_76106")},
-                {new Interval("chr17", 33545498, 33545622, false, "target_76107"),   new Interval("chr17", 36290584, 36290708, true, "target_76107")},
-                {new Interval("chr17", 33547465, 33547578, false, "target_76109"),   new Interval("chr17", 36288629, 36288742, true, "target_76109")},
-                {new Interval("chr17", 33547904, 33548015, false, "target_76110"),   new Interval("chr17", 36288192, 36288303, true, "target_76110")},
-                {new Interval("chr17", 33548455, 33548539, false, "target_76111"),   new Interval("chr17", 36287668, 36287752, true, "target_76111")},
-                {new Interval("chr17", 33549018, 33549061, false, "target_76112"),   new Interval("chr17", 36287146, 36287189, true, "target_76112")},
-                {new Interval("chr17", 33550341, 33550430, false, "target_76113"),   new Interval("chr17", 36285777, 36285866, true, "target_76113")},
-                {new Interval("chr17", 33550589, 33550664, false, "target_76114"),   new Interval("chr17", 36285543, 36285618, true, "target_76114")},
-                {new Interval("chrX", 148575967, 148576994, false, "target_184692"), new Interval("chrX", 148797411, 148798438, true, "target_184692")},
-                {new Interval("chrX", 148577066, 148577143, false, "target_184693"), new Interval("chrX", 148797262, 148797339, true, "target_184693")},
-                {new Interval("chrX", 148578167, 148578266, false, "target_184694"), new Interval("chrX", 148796139, 148796238, true, "target_184694")},
-                {new Interval("chrX", 148579488, 148579587, false, "target_184695"), new Interval("chrX", 148794818, 148794917, true, "target_184695")},
-                {new Interval("chrX", 148603758, 148603770, false, "target_184696"), new Interval("chrX", 148770634, 148770646, true, "target_184696")},
-                // Some that don't map in hg19
-                {new Interval("chr2", 111013693, 111013832), null},
-                {new Interval("chr3", 14174511, 14175398), null},
-                {new Interval("chr3", 50911035, 50911051), null},
-                {new Interval("chr6", 32071709, 32071869), null},
-                {new Interval("chr6", 32072183, 32072358), null},
-                {new Interval("chr6", 32104446, 32104606), null},
-                {new Interval("chr6", 32104920, 32105095), null},
-                {new Interval("chr7", 101995561, 101995739), null},
-                {new Interval("chr7", 142178782, 142178825), null},
-                {new Interval("chr7", 142179850, 142180013), null},
-                {new Interval("chr7", 142181067, 142181324), null},
-                {new Interval("chr7", 142181720, 142181860), null},
-                {new Interval("chr7", 142182157, 142182313), null},
-                {new Interval("chr15", 19335778, 19336302), null},
-                {new Interval("chr17", 33364376, 33364428), null},
-                {new Interval("chr17", 33546162, 33546214), null},
-                {new Interval("chr17", 33706667, 33706736), null},
-                {new Interval("chr17", 59772721, 59772781), null},
-                {new Interval("chr17", 59779355, 59779421), null},
-                {new Interval("chr17", 59781483, 59781540), null},
-                {new Interval("chr17", 59783488, 59783565), null},
-                {new Interval("chr17", 59784584, 59784615), null},
-                {new Interval("chr17", 59786025, 59786136), null},
-                {new Interval("chr17", 59787203, 59787494), null},
-                {new Interval("chr17", 59791235, 59791514), null},
-                {new Interval("chr17", 59794247, 59794502), null},
-                {new Interval("chr17", 59801884, 59802193), null},
-                {new Interval("chr17", 59804685, 59804982), null},
-                {new Interval("chr17", 59817352, 59817382), null},
-                {new Interval("chr17", 59817465, 59817532), null},
-                {new Interval("chr17", 59875754, 59875812), null},
-                {new Interval("chr17", 59875899, 59875944), null},
-                {new Interval("chr17", 59879183, 59879456), null},
-                {new Interval("chr17", 59883988, 59884276), null},
-                {new Interval("chr17", 59887398, 59887512), null},
-                {new Interval("chrX", 48774611, 48775058), null},
-
-        };
-    }
-
-    @Test(dataProvider = "failingIntervals")
-    public void testDiagnosticLiftover(final Interval fromInterval) {
-        final List<LiftOver.PartialLiftover> partials = liftOver.diagnosticLiftover(fromInterval);
-        System.out.println("Diagnosing " + fromInterval + " (len " + fromInterval.length() + ")");
-        for (final LiftOver.PartialLiftover partial : partials) {
-            System.out.println(partial);
-        }
-    }
-
-    @DataProvider(name = "failingIntervals")
-    public Object[][] makeFailingIntervals() {
-        return new Object[][] {
-                {new Interval("chr3", 50911035, 50911051)},
-                {new Interval("chr2", 111013693, 111013832)},
-                {new Interval("chr3", 14174511, 14175398)},
-                {new Interval("chr3", 50911035, 50911051)},
-                {new Interval("chr6", 32071709, 32071869)},
-                {new Interval("chr6", 32072183, 32072358)},
-                {new Interval("chr6", 32104446, 32104606)},
-                {new Interval("chr6", 32104920, 32105095)},
-                {new Interval("chr7", 101995561, 101995739)},
-                {new Interval("chr7", 142178782, 142178825)},
-                {new Interval("chr7", 142179850, 142180013)},
-                {new Interval("chr7", 142181067, 142181324)},
-                {new Interval("chr7", 142181720, 142181860)},
-                {new Interval("chr7", 142182157, 142182313)},
-                {new Interval("chr15", 19335778, 19336302)},
-                {new Interval("chr17", 33364376, 33364428)},
-                {new Interval("chr17", 33546162, 33546214)},
-                {new Interval("chr17", 33706667, 33706736)},
-                {new Interval("chr17", 59772721, 59772781)},
-                {new Interval("chr17", 59779355, 59779421)},
-                {new Interval("chr17", 59781483, 59781540)},
-                {new Interval("chr17", 59783488, 59783565)},
-                {new Interval("chr17", 59784584, 59784615)},
-                {new Interval("chr17", 59786025, 59786136)},
-                {new Interval("chr17", 59787203, 59787494)},
-                {new Interval("chr17", 59791235, 59791514)},
-                {new Interval("chr17", 59794247, 59794502)},
-                {new Interval("chr17", 59801884, 59802193)},
-                {new Interval("chr17", 59804685, 59804982)},
-                {new Interval("chr17", 59817352, 59817382)},
-                {new Interval("chr17", 59817465, 59817532)},
-                {new Interval("chr17", 59875754, 59875812)},
-                {new Interval("chr17", 59875899, 59875944)},
-                {new Interval("chr17", 59879183, 59879456)},
-                {new Interval("chr17", 59883988, 59884276)},
-                {new Interval("chr17", 59887398, 59887512)},
-                {new Interval("chrX", 48774611, 48775058)},
-
-        };
-    }
-
-    @Test
-    public void testWriteChain() throws Exception {
-        final OverlapDetector<Chain> chains = Chain.loadChains(CHAIN_FILE);
-        File outFile = File.createTempFile("test.", ".chain");
-        outFile.deleteOnExit();
-        PrintWriter pw = new PrintWriter(outFile);
-        final Map<Integer, Chain> originalChainMap = new TreeMap<Integer, Chain>();
-        for (final Chain chain : chains.getAll()) {
-            chain.write(pw);
-            originalChainMap.put(chain.id, chain);
-        }
-        pw.close();
-
-        final OverlapDetector<Chain> newChains = Chain.loadChains(outFile);
-        final Map<Integer, Chain> newChainMap = new TreeMap<Integer, Chain>();
-        for (final Chain chain : newChains.getAll()) {
-            newChainMap.put(chain.id, chain);
-        }
-        Assert.assertEquals(newChainMap, originalChainMap);
-    }
-
-    @Test(dataProvider = "testIntervals")
-    public void testGetContigMap(final Interval in, final Interval expected) {
-        if (expected != null) {
-            Assert.assertTrue(contigMap.get(in.getContig()).contains(expected.getContig()));
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/metrics/MetricBaseTest.java b/src/test/java/htsjdk/samtools/metrics/MetricBaseTest.java
deleted file mode 100644
index cbbbbc3..0000000
--- a/src/test/java/htsjdk/samtools/metrics/MetricBaseTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package htsjdk.samtools.metrics;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class MetricBaseTest {
-
-    private static class TestMetric extends MetricBase{
-        public Object anyObject;
-
-        public TestMetric(final Object anyObject) {
-            this.anyObject = anyObject;
-        }
-    }
-
-    @Test
-    public void testHashCodeWithNull(){
-        TestMetric metric = new TestMetric(null);
-        metric.hashCode(); //test that it can get a hashcode without crashing
-    }
-
-    @DataProvider(name = "equalityTest")
-    public Object[][] equalityTestProvider(){
-        return new Object[][]{
-                {null,null, true},
-                {null, 1, false},
-                {1, null, false},
-                {1, 1, true},
-                {"Hi", "Hi", true},
-                {"Hi", "There", false},
-                {"1","1.0000000000000000001d", false},
-                {"1", 1.0000000000000000001d, true}, /* Object fields are saved using instance of which performs rounding, but loaded as a string*/
-                {1.00000000000000001d, 1.0000000002918d, true}, /* precision limit is set by {@link FormatUtil#DECIMAL_DIGITS_TO_PRINT}, if that changes this test may fail */
-                {1.0000, 1.0001, false},
-                {1.0, 1.0, true},
-                {1, 2, false}
-        };
-    }
-
-    @Test(dataProvider = "equalityTest")
-    public void testEqualsNull(Object a, Object b, boolean shouldBeEqual){
-        TestMetric metricA = new TestMetric(a);
-        TestMetric metricB = new TestMetric(b);
-        Assert.assertEquals(metricA.equals(metricB), shouldBeEqual);
-
-        //check that hashcodes are the same if they're equal
-        if(shouldBeEqual) {
-            Assert.assertEquals(metricA.hashCode(), metricB.hashCode());
-        }
-    }
-
-
-    public class A extends MetricBase {
-        public int a = 1;
-    }
-    public class B extends A{
-        public int b = 1;
-    }
-
-    @Test
-    public void testSubclassEquality(){
-        final A a = new A();
-        final B b = new B();
-        Assert.assertFalse(a.equals(b));
-        Assert.assertFalse(b.equals(a));
-    }
-
-    @Test void testSelfEquality(){
-        final A a = new A();
-        final B b = new B();
-        Assert.assertTrue(a.equals(a));
-        Assert.assertTrue(b.equals(b));
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/metrics/MetricsFileTest.java b/src/test/java/htsjdk/samtools/metrics/MetricsFileTest.java
deleted file mode 100644
index 228d87d..0000000
--- a/src/test/java/htsjdk/samtools/metrics/MetricsFileTest.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.FormatUtil;
-import htsjdk.samtools.util.Histogram;
-import htsjdk.samtools.util.TestUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * Tests for the various classes in the metrics package.  Constructs a MetricsFile,
- * populates it with various items and then ensure that it can be written to disk
- * and read back without altering any values.
- *
- * @author Tim Fennell
- */
-public class MetricsFileTest {
-    public enum TestEnum {One, Two, Three}
-
-    public static class TestMetric extends MetricBase implements Cloneable, Serializable {
-        private static final long serialVersionUID = 1l;
-
-        public String    STRING_PROP;
-        public Date      DATE_PROP;
-        public Short     SHORT_PROP;
-        public Integer   INTEGER_PROP;
-        public Long      LONG_PROP;
-        public Float     FLOAT_PROP;
-        public Double    DOUBLE_PROP;
-        public TestEnum  ENUM_PROP;
-        public Boolean   BOOLEAN_PROP;
-        public Character CHARACTER_PROP;
-        public short     SHORT_PRIMITIVE;
-        public int       INT_PRIMITIVE;
-        public long      LONG_PRIMITIVE;
-        public float     FLOAT_PRIMITIVE;
-        public double    DOUBLE_PRIMITIVE;
-        public boolean   BOOLEAN_PRIMITIVE;
-        public char      CHAR_PRIMITIVE;
-
-        @Override
-        public TestMetric clone()  {
-            try { return (TestMetric) super.clone(); }
-            catch (CloneNotSupportedException cnse) { throw new SAMException("That's Unpossible!"); }
-        }
-    }
-
-    public static class FloatingPointMetric extends MetricBase{
-        public double DOUBLE_PRIMITIVE;
-        public Double DOUBLE_PROP;
-        public float  FLOAT_PRIMITIVE;
-        public Float FLOAT_PROP;
-    }
-
-    @Test
-    public void testFloatingPointEquality() throws IOException {
-        MetricsFile<FloatingPointMetric,Integer> file = new MetricsFile<FloatingPointMetric,Integer>();
-
-        FloatingPointMetric metric = new FloatingPointMetric();
-        metric.DOUBLE_PRIMITIVE = .0000000000000000001d;
-        metric.DOUBLE_PROP = .0000000000000000001d;
-        metric.FLOAT_PRIMITIVE = .0000000000000000001f;
-        metric.FLOAT_PROP = .0000000000000000001f;
-        file.addMetric(metric);
-
-        MetricsFile<FloatingPointMetric,Integer> file2 = writeThenReadBack(file);
-        Assert.assertEquals(file, file2);
-
-
-
-    }
-
-    @Test
-    public void testWriteMetricsFile() throws IOException, ClassNotFoundException {
-        MetricsFile<TestMetric,Integer> file = new MetricsFile<TestMetric,Integer>();
-        TestMetric metric = new TestMetric();
-        metric.STRING_PROP       = "Hello World";
-        metric.DATE_PROP         = new FormatUtil().parseDate("2008-12-31");
-        metric.SHORT_PROP        = 123;
-        metric.INTEGER_PROP      = null;
-        metric.LONG_PROP         = Long.MAX_VALUE;
-        metric.FLOAT_PROP        = 456.789f;
-        metric.DOUBLE_PROP       = 0.713487;
-        metric.ENUM_PROP         = TestEnum.Two;
-        metric.BOOLEAN_PROP      = false;
-        metric.CHARACTER_PROP    = 'A';
-        metric.SHORT_PRIMITIVE   = 123;
-        metric.INT_PRIMITIVE     = 919834781;
-        metric.LONG_PRIMITIVE    = Long.MAX_VALUE - Integer.MAX_VALUE;
-        metric.FLOAT_PRIMITIVE   = 0.55694f;
-        metric.DOUBLE_PRIMITIVE  = 0.229233;
-        metric.BOOLEAN_PRIMITIVE = true;
-        metric.CHAR_PRIMITIVE    = 'B';
-        file.addMetric(metric);
-
-        MetricsFile<TestMetric,Integer> file2 = writeThenReadBack(file);
-        Assert.assertEquals(file, file2);
-
-        // Now add some headers and run the test again
-        StringHeader stringHeader = new StringHeader();
-        stringHeader.setValue("Hello, I'm a String Header!");
-        file.addHeader(stringHeader);
-
-        VersionHeader version = new VersionHeader();
-        version.setVersionedItem("MetricsFileTest");
-        version.setVersionString("1.0");
-        file.addHeader(version);
-
-        version = new VersionHeader();
-        version.setVersionedItem("Nada");
-        version.setVersionString("0.0alpha1");
-        file.addHeader(version);
-
-        file2 = writeThenReadBack(file);
-        Assert.assertEquals(file, file2);
-
-        // Now add a Histogram and make sure it still works
-        Histogram<Integer> histo = new Histogram<Integer>();
-        histo.setBinLabel("small_number");
-        histo.setValueLabel("big_number");
-        histo.increment(1, 101);
-        histo.increment(2, 202);
-        histo.increment(3, 4000);
-        histo.increment(5, 123981);
-        histo.increment(1000, 10981982);
-        file.setHistogram(histo);
-
-        file2 = writeThenReadBack(file);
-        Assert.assertEquals(file, file2);
-
-        // And lastly add some more metrics rows to the file
-        TestMetric metric2 = metric.clone();
-        metric2.ENUM_PROP = TestEnum.One;
-        metric2.FLOAT_PROP = 0.998f;
-        metric2.STRING_PROP = "Wheeeee!";
-        file.addMetric(metric2);
-
-        metric2 = metric.clone();
-        metric2.ENUM_PROP = TestEnum.Three;
-        metric2.DOUBLE_PRIMITIVE = 1.299d;
-        file.addMetric(metric2);
-
-        file2 = writeThenReadBack(file);
-        Assert.assertEquals(file, file2);
-
-        //Test that we can serialize and deserialize this whole thing
-        MetricsFile<TestMetric, Integer> file3 = TestUtil.serializeAndDeserialize(file);
-
-        Assert.assertEquals(file, file3);
-    }
-
-    @Test
-    public void areMetricsFilesEqualTest(){
-        final File TEST_DIR = new File("src/test/resources/htsjdk/samtools/metrics/");
-        final File file1 = new File(TEST_DIR,"metricsOne.metrics");
-        final File file2 = new File(TEST_DIR,"metricsOneCopy.metrics");
-        final File fileModifiedHist = new File(TEST_DIR,"metricsOneModifiedHistogram.metrics");
-        final File fileModifiedMet = new File(TEST_DIR,"metricsOneModifiedMetrics.metrics");
-
-        Assert.assertTrue(MetricsFile.areMetricsEqual(file1, file2));
-        Assert.assertTrue(MetricsFile.areMetricsEqual(file1, fileModifiedHist));
-
-        Assert.assertFalse(MetricsFile.areMetricsAndHistogramsEqual(file1, fileModifiedHist));
-        Assert.assertFalse(MetricsFile.areMetricsEqual(file1, fileModifiedMet));
-        Assert.assertFalse(MetricsFile.areMetricsAndHistogramsEqual(file1, fileModifiedMet));
-    }
-
-    /** Helper method to persist metrics to file and read them back again. */
-    private <METRIC extends MetricBase> MetricsFile<METRIC, Integer> writeThenReadBack(MetricsFile<METRIC,Integer> in) throws IOException {
-        File f = File.createTempFile("test", ".metrics");
-        f.deleteOnExit();
-        FileWriter out = new FileWriter(f);
-        in.write(out);
-
-        MetricsFile<METRIC,Integer> retval = new MetricsFile<METRIC,Integer>();
-        retval.read(new FileReader(f));
-        return retval;
-    }
-
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/metrics/StringHeaderTest.java b/src/test/java/htsjdk/samtools/metrics/StringHeaderTest.java
deleted file mode 100644
index 32f1322..0000000
--- a/src/test/java/htsjdk/samtools/metrics/StringHeaderTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package htsjdk.samtools.metrics;
-
-
-import htsjdk.samtools.util.TestUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-public class StringHeaderTest {
-
-    @Test
-    public void testStringHeaderSerialization() throws IOException, ClassNotFoundException {
-        final Header header = new StringHeader("some value");
-        final Header deserializedHeader = TestUtil.serializeAndDeserialize(header);
-        Assert.assertEquals(deserializedHeader, header);
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/metrics/VersionHeaderTest.java b/src/test/java/htsjdk/samtools/metrics/VersionHeaderTest.java
deleted file mode 100644
index 576f8d1..0000000
--- a/src/test/java/htsjdk/samtools/metrics/VersionHeaderTest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.util.TestUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-
-public class VersionHeaderTest {
-
-    @Test
-    public void testSerializeVersionHeader() throws IOException, ClassNotFoundException {
-        final VersionHeader versionHeader = new VersionHeader();
-        versionHeader.setVersionedItem("SomeThing");
-        versionHeader.setVersionString("1.0.1");
-        final VersionHeader deserialized = TestUtil.serializeAndDeserialize(versionHeader);
-        Assert.assertEquals(deserialized, versionHeader);
-
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/reference/FakeReferenceSequenceFile.java b/src/test/java/htsjdk/samtools/reference/FakeReferenceSequenceFile.java
deleted file mode 100644
index a42a555..0000000
--- a/src/test/java/htsjdk/samtools/reference/FakeReferenceSequenceFile.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Created by vadim on 17/03/2015.
- */
-public class FakeReferenceSequenceFile implements
-        ReferenceSequenceFile {
-    Map<String, SAMSequenceRecord> map = new HashMap<String, SAMSequenceRecord>();
-    List<String> index= new ArrayList<String>() ;
-    int current = 0;
-
-    public FakeReferenceSequenceFile(List<SAMSequenceRecord> sequences) {
-        for (SAMSequenceRecord s:sequences) {
-            map.put(s.getSequenceName(), s) ;
-            index.add(s.getSequenceName()) ;
-        }
-    }
-
-    private static ReferenceSequence buildReferenceSequence (SAMSequenceRecord samSequenceRecord) {
-        byte[] bases = new byte[samSequenceRecord.getSequenceLength()] ;
-        Arrays.fill(bases, (byte)'N');
-        return new ReferenceSequence(samSequenceRecord.getSequenceName(), samSequenceRecord.getSequenceIndex(), bases) ;
-    }
-
-    @Override
-    public void reset() {
-        current = 0;
-    }
-
-    @Override
-    public ReferenceSequence nextSequence() {
-        if (current >= index.size()) return null;
-        return buildReferenceSequence(map.get(index.get(current++)));
-    }
-
-    @Override
-    public boolean isIndexed() {
-        return true;
-    }
-
-    @Override
-    public ReferenceSequence getSubsequenceAt(final String contig, final long start,
-                                              final long stop) {
-        byte[] bases = new byte[(int) (stop-start+1)] ;
-        Arrays.fill(bases, (byte)'N');
-        return new ReferenceSequence(contig, bases.length, bases) ;
-    }
-
-    @Override
-    public SAMSequenceDictionary getSequenceDictionary() {
-        return null;
-    }
-
-    @Override
-    public ReferenceSequence getSequence(final String contig) {
-        return buildReferenceSequence(map.get(contig));
-    }
-
-    @Override
-    public void close() throws IOException {
-        map.clear();
-        index.clear();
-        current = 0;
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/reference/FastaSequenceFileTest.java b/src/test/java/htsjdk/samtools/reference/FastaSequenceFileTest.java
deleted file mode 100644
index 87927f6..0000000
--- a/src/test/java/htsjdk/samtools/reference/FastaSequenceFileTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.util.StringUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.PrintWriter;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class FastaSequenceFileTest {
-    @Test
-    public void testTrailingWhitespace() throws Exception {
-        final File fasta = File.createTempFile("test", ".fasta");
-        fasta.deleteOnExit();
-        final PrintWriter writer = new PrintWriter(fasta);
-        final String chr1 = "chr1";
-        writer.println(">" + chr1);
-        final String sequence = "ACGTACGT";
-        writer.println(sequence);
-        writer.println(sequence + " \t");
-        writer.close();
-        final FastaSequenceFile fastaReader = new FastaSequenceFile(fasta, true);
-        final ReferenceSequence referenceSequence = fastaReader.nextSequence();
-        Assert.assertEquals(referenceSequence.getName(), chr1);
-        Assert.assertEquals(StringUtil.bytesToString(referenceSequence.getBases()), sequence + sequence);
-    }
-
-    @Test
-    public void testIntermediateWhitespace() throws Exception {
-        final File fasta = File.createTempFile("test", ".fasta");
-        fasta.deleteOnExit();
-        final PrintWriter writer = new PrintWriter(fasta);
-        final String chr1 = "chr1";
-        writer.println(">" + chr1 + " extra stuff after sequence name");
-        final String sequence = "ACGTACGT";
-        writer.println(sequence + "  ");
-        writer.println(sequence + " \t");
-        writer.println(sequence);
-        writer.close();
-        final FastaSequenceFile fastaReader = new FastaSequenceFile(fasta, true);
-        final ReferenceSequence referenceSequence = fastaReader.nextSequence();
-        Assert.assertEquals(referenceSequence.getName(), chr1);
-        Assert.assertEquals(StringUtil.bytesToString(referenceSequence.getBases()), sequence + sequence + sequence);
-    }
-
-    // There was a bug when reading a fasta with trailing whitespace, only when a sequence dictionary exists.
-    @Test
-    public void testTrailingWhitespaceWithPreexistingSequenceDictionary() throws Exception {
-        final File fasta = new File("src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta");
-        final FastaSequenceFile fastaReader = new FastaSequenceFile(fasta, true);
-        ReferenceSequence referenceSequence = fastaReader.nextSequence();
-        Assert.assertEquals(referenceSequence.getName(), "chr1");
-        Assert.assertEquals(StringUtil.bytesToString(referenceSequence.getBases()), "ACGTACGT");
-        referenceSequence = fastaReader.nextSequence();
-        Assert.assertEquals(referenceSequence.getName(), "chr2");
-        Assert.assertEquals(StringUtil.bytesToString(referenceSequence.getBases()), "TCGATCGA");
-
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/reference/FastaSequenceIndexTest.java b/src/test/java/htsjdk/samtools/reference/FastaSequenceIndexTest.java
deleted file mode 100644
index bfef121..0000000
--- a/src/test/java/htsjdk/samtools/reference/FastaSequenceIndexTest.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.Iterator;
-
-/**
- * Test the fasta sequence index reader.
- */
-public class FastaSequenceIndexTest {
-    private static File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/reference");
-
-    @DataProvider(name="homosapiens")
-    public Object[][] provideHomoSapiens() throws FileNotFoundException {
-        final File sequenceIndexFile = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.fasta.fai");
-        return new Object[][] { new Object[]
-            { new FastaSequenceIndex(sequenceIndexFile) },
-            { new FastaSequenceIndex(sequenceIndexFile.toPath()) } };
-    }
-
-    @DataProvider(name="specialcharacters")
-    public Object[][] provideSpecialCharacters() throws FileNotFoundException {
-        final File sequenceIndexFile = new File(TEST_DATA_DIR,"testing.fai");
-        return new Object[][] { new Object[]
-            { new FastaSequenceIndex(sequenceIndexFile) },
-            { new FastaSequenceIndex(sequenceIndexFile.toPath()) } };
-    }
-
-    @Test(dataProvider="homosapiens")
-    public void testInitialContig(FastaSequenceIndex sequenceIndex) {
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chrM"),"Contig chrM is not present");
-        FastaSequenceIndexEntry entry = sequenceIndex.getIndexEntry("chrM");
-        Assert.assertEquals(entry.getContig(),"chrM","Contig chrM name is incorrect");
-        Assert.assertEquals(entry.getLocation(),6L,"Contig chrM location is incorrect");
-        Assert.assertEquals(entry.getSize(),16571L,"Contig chrM size is incorrect");
-        Assert.assertEquals(entry.getBasesPerLine(),50,"Contig chrM bases per line is incorrect");
-        Assert.assertEquals(entry.getBytesPerLine(),51,"Contig chrM bytes per line is incorrect");
-
-    }
-
-    @Test(dataProvider="homosapiens")
-    public void testMiddleContig(FastaSequenceIndex sequenceIndex) {
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr8"),"Contig chr8 is not present");
-        FastaSequenceIndexEntry entry = sequenceIndex.getIndexEntry("chr8");
-        Assert.assertEquals(entry.getContig(),"chr8","Contig chr8 name is incorrect");
-        Assert.assertEquals(entry.getLocation(),1419403101L,"Contig chr8 location is incorrect");
-        Assert.assertEquals(entry.getSize(),146274826L,"Contig chr8 size is incorrect");
-        Assert.assertEquals(entry.getBasesPerLine(),50,"Contig chr8 bases per line is incorrect");
-        Assert.assertEquals(entry.getBytesPerLine(),51,"Contig chr8 bytes per line is incorrect");
-    }
-
-    @Test(dataProvider="homosapiens")
-    public void testLastContig(FastaSequenceIndex sequenceIndex) {
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chrX_random"),"Contig chrX_random is not present");
-        FastaSequenceIndexEntry entry = sequenceIndex.getIndexEntry("chrX_random");
-        Assert.assertEquals(entry.getContig(),"chrX_random","Contig chrX_random name is incorrect");
-        Assert.assertEquals(entry.getLocation(),3156698441L,"Contig chrX_random location is incorrect");
-        Assert.assertEquals(entry.getSize(),1719168L,"Contig chrX_random size is incorrect");
-        Assert.assertEquals(entry.getBasesPerLine(),50,"Contig chrX_random bases per line is incorrect");
-        Assert.assertEquals(entry.getBytesPerLine(),51,"Contig chrX_random bytes per line is incorrect");
-    }
-
-    @Test(dataProvider="homosapiens")
-    public void testAllContigsPresent(FastaSequenceIndex sequenceIndex) {
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chrM"),"Contig chrM is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr1"),"Contig chr1 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr2"),"Contig chr2 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr3"),"Contig chr3 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr4"),"Contig chr4 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr5"),"Contig chr5 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr6"),"Contig chr6 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr7"),"Contig chr7 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr8"),"Contig chr8 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr9"),"Contig chr9 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr10"),"Contig chr10 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr11"),"Contig chr11 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr12"),"Contig chr12 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr13"),"Contig chr13 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr14"),"Contig chr14 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr15"),"Contig chr15 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr16"),"Contig chr16 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr17"),"Contig chr17 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr18"),"Contig chr18 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr19"),"Contig chr19 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr20"),"Contig chr20 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr21"),"Contig chr21 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr22"),"Contig chr22 is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chrX"),"Contig chrX is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chrY"),"Contig chrY is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr1_random"),"Contig chr1_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr2_random"),"Contig chr2_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr3_random"),"Contig chr3_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr4_random"),"Contig chr4_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr5_random"),"Contig chr5_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr6_random"),"Contig chr6_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr7_random"),"Contig chr7_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr8_random"),"Contig chr8_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr9_random"),"Contig chr9_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr10_random"),"Contig chr10_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr11_random"),"Contig chr11_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr13_random"),"Contig chr13_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr15_random"),"Contig chr15_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr16_random"),"Contig chr16_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr17_random"),"Contig chr17_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr18_random"),"Contig chr18_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr19_random"),"Contig chr19_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr21_random"),"Contig chr21_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chr22_random"),"Contig chr22_random is not present");
-        Assert.assertTrue(sequenceIndex.hasIndexEntry("chrX_random"),"Contig chrX_random is not present");
-    }
-
-    @Test(dataProvider="homosapiens")
-    public void testHasInvalidEntry(FastaSequenceIndex sequenceIndex) {
-        Assert.assertFalse(sequenceIndex.hasIndexEntry("invalid"),"Found an invalid entry");
-    }
-
-    @Test(dataProvider="homosapiens",expectedExceptions=SAMException.class)
-    public void testGetInvalidEntry(FastaSequenceIndex sequenceIndex) {
-        sequenceIndex.getIndexEntry("invalid");
-    }
-
-    @Test(dataProvider="homosapiens")
-    public void testIteration(FastaSequenceIndex sequenceIndex) {
-        Iterator<FastaSequenceIndexEntry> sequenceIndexEntries = sequenceIndex.iterator();
-
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chrM","Contig chrM is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr1","Contig chr1 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr2","Contig chr2 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr3","Contig chr3 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr4","Contig chr4 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr5","Contig chr5 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr6","Contig chr6 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr7","Contig chr7 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr8","Contig chr8 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr9","Contig chr9 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr10","Contig chr10 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr11","Contig chr11 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr12","Contig chr12 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr13","Contig chr13 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr14","Contig chr14 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr15","Contig chr15 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr16","Contig chr16 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr17","Contig chr17 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr18","Contig chr18 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr19","Contig chr19 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr20","Contig chr20 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr21","Contig chr21 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr22","Contig chr22 is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chrX","Contig chrX is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chrY","Contig chrY is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr1_random","Contig chr1_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr2_random","Contig chr2_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr3_random","Contig chr3_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr4_random","Contig chr4_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr5_random","Contig chr5_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr6_random","Contig chr6_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr7_random","Contig chr7_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr8_random","Contig chr8_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr9_random","Contig chr9_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr10_random","Contig chr10_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr11_random","Contig chr11_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr13_random","Contig chr13_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr15_random","Contig chr15_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr16_random","Contig chr16_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr17_random","Contig chr17_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr18_random","Contig chr18_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr19_random","Contig chr19_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr21_random","Contig chr21_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr22_random","Contig chr22_random is not present");
-        Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chrX_random","Contig chrX_random is not present");
-        Assert.assertFalse(sequenceIndexEntries.hasNext(),"Iterator still has more entries");
-    }
-
-    @Test(dataProvider="specialcharacters")
-    public void testSpecialCharacters(FastaSequenceIndex specialCharactersIndex) {
-        /* file contents:
-        chrM	16571	6	50	51
-        chr1;boat	247249719	16915	50	51
-        chr2:money	242951149	252211635	50	51
-        chr3::;	199501827	500021813	50	51
-        ;;;;;;  1234            1234            1234    1234
-        file:gi|17981852|ref|NC_001807.4|    16571   2911876801      70      71
-        */
-        Iterator<FastaSequenceIndexEntry> sequenceIndexEntries = specialCharactersIndex.iterator();
-        FastaSequenceIndexEntry ent = sequenceIndexEntries.next();
-        Assert.assertEquals(ent.getContig(),"chrM","Contig chrM is not present");
-        Assert.assertEquals(ent.getSize(),16571,"Contig chrM size is not correct");
-        Assert.assertEquals(ent.getLocation(),6,"Contig chrM location is not correct");
-        Assert.assertEquals(ent.getBasesPerLine(),50,"Contig chrM bases per line is not correct");
-        Assert.assertEquals(ent.getBytesPerLine(),51,"Contig chrM bytes per line is not correct");
-
-        ent = sequenceIndexEntries.next();
-        Assert.assertEquals(ent.getContig(),"chr1;boat","Contig chr1;boat is not present");
-        Assert.assertEquals(ent.getSize(),247249719,"Contig chr1;boat size is not correct");
-        Assert.assertEquals(ent.getLocation(),16915,"Contig chr1;boat location is not correct");
-        Assert.assertEquals(ent.getBasesPerLine(),50,"Contig chr1;boat bases per line is not correct");
-        Assert.assertEquals(ent.getBytesPerLine(),51,"Contig chr1;boat bytes per line is not correct");
-
-        ent = sequenceIndexEntries.next();
-        Assert.assertEquals(ent.getContig(),"chr2:money","Contig chr2:money is not present");
-        Assert.assertEquals(ent.getSize(),242951149,"Contig chr2:money size is not correct");
-        Assert.assertEquals(ent.getLocation(),252211635,"Contig chr2:money location is not correct");
-        Assert.assertEquals(ent.getBasesPerLine(),50,"Contig chr2:money bases per line is not correct");
-        Assert.assertEquals(ent.getBytesPerLine(),51,"Contig chr2:money bytes per line is not correct");
-
-        ent = sequenceIndexEntries.next();
-        Assert.assertEquals(ent.getContig(),"chr3::;","Contig chr3::; is not present");
-        Assert.assertEquals(ent.getSize(),199501827,"Contig chr3::; size is not correct");
-        Assert.assertEquals(ent.getLocation(),500021813,"Contig chrM location is not correct");
-        Assert.assertEquals(ent.getBasesPerLine(),50,"Contig chr3::; bases per line is not correct");
-        Assert.assertEquals(ent.getBytesPerLine(),51,"Contig chr3::; bytes per line is not correct");
-
-        ent = sequenceIndexEntries.next();
-        Assert.assertEquals(ent.getContig(),";;;;;;;;","Contig ;;;;;;;; is not present");
-        Assert.assertEquals(ent.getSize(),123,"Contig ;;;;;;;; size is not correct");
-        Assert.assertEquals(ent.getLocation(),234,"Contig ;;;;;;;; location is not correct");
-        Assert.assertEquals(ent.getBasesPerLine(),456,"Contig ;;;;;;;; bases per line is not correct");
-        Assert.assertEquals(ent.getBytesPerLine(),789,"Contig ;;;;;;;; bytes per line is not correct");
-
-        ent = sequenceIndexEntries.next();
-        Assert.assertEquals(ent.getContig(),"file:gi|17981852|ref|NC_001807.4|","Contig file:gi|17981852|ref|NC_001807.4| is not present");
-        Assert.assertEquals(ent.getSize(),16571,"Contig file:gi|17981852|ref|NC_001807.4| size is not correct");
-        Assert.assertEquals(ent.getLocation(),2911876801L,"Contig file:gi|17981852|ref|NC_001807.4| location is not correct");
-        Assert.assertEquals(ent.getBasesPerLine(),70,"Contig file:gi|17981852|ref|NC_001807.4| bases per line is not correct");
-        Assert.assertEquals(ent.getBytesPerLine(),71,"Contig file:gi|17981852|ref|NC_001807.4| bytes per line is not correct");
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/reference/InMemoryReferenceSequenceFile.java b/src/test/java/htsjdk/samtools/reference/InMemoryReferenceSequenceFile.java
deleted file mode 100644
index ce15f59..0000000
--- a/src/test/java/htsjdk/samtools/reference/InMemoryReferenceSequenceFile.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class InMemoryReferenceSequenceFile implements
-        ReferenceSequenceFile {
-    Map<String, ReferenceSequence> map = new HashMap<String, ReferenceSequence>();
-    List<String> index;
-    int current = 0;
-
-    public void add(final String name, final byte[] bases) {
-        final ReferenceSequence sequence = new ReferenceSequence(name,
-                map.size(), bases);
-        map.put(sequence.getName(), sequence);
-    }
-
-    @Override
-    public void reset() {
-        current = 0;
-    }
-
-    @Override
-    public ReferenceSequence nextSequence() {
-        if (current >= index.size()) return null;
-        return map.get(index.get(current++));
-    }
-
-    @Override
-    public boolean isIndexed() {
-        return true;
-    }
-
-    @Override
-    public ReferenceSequence getSubsequenceAt(final String contig, final long start,
-                                              final long stop) {
-        final ReferenceSequence sequence = getSequence(contig);
-        if (sequence == null) return null;
-        final byte[] bases = new byte[(int) (stop - start) + 1];
-        System.arraycopy(sequence.getBases(), (int) start - 1, bases, 0,
-                bases.length);
-        return new ReferenceSequence(contig, sequence.getContigIndex(),
-                bases);
-    }
-
-    @Override
-    public SAMSequenceDictionary getSequenceDictionary() {
-        return null;
-    }
-
-    @Override
-    public ReferenceSequence getSequence(final String contig) {
-        return map.get(contig);
-    }
-
-    @Override
-    public void close() throws IOException {
-        map.clear();
-        index.clear();
-        current = 0;
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/reference/IndexedFastaSequenceFileTest.java b/src/test/java/htsjdk/samtools/reference/IndexedFastaSequenceFileTest.java
deleted file mode 100644
index 086b3be..0000000
--- a/src/test/java/htsjdk/samtools/reference/IndexedFastaSequenceFileTest.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.StringUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-
-/**
- * Test the indexed fasta sequence file reader.
- */
-public class IndexedFastaSequenceFileTest{
-    private static File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/reference");
-    private static File SEQUENCE_FILE = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.trimmed.fasta");
-    private static File SEQUENCE_FILE_NODICT = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.trimmed.nodict.fasta");
-
-    private final String firstBasesOfChrM = "GATCACAGGTCTATCACCCT";
-    private final String extendedBasesOfChrM = "GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCAT" +
-                                               "TTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTG" +
-                                               "GAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATT";
-    private final String lastBasesOfChr20 = "ttgtctgatgctcatattgt";
-    private final int CHR20_LENGTH = 1000000;
-
-    @DataProvider(name="homosapiens")
-    public Object[][] provideSequenceFile() throws FileNotFoundException {
-        return new Object[][] { new Object[]
-                { new IndexedFastaSequenceFile(SEQUENCE_FILE) },
-                { new IndexedFastaSequenceFile(SEQUENCE_FILE_NODICT) },
-                { new IndexedFastaSequenceFile(SEQUENCE_FILE.toPath()) },
-                { new IndexedFastaSequenceFile(SEQUENCE_FILE_NODICT.toPath()) }};
-    }
-
-    @DataProvider(name="comparative")
-    public Object[][] provideOriginalAndNewReaders() throws FileNotFoundException {
-        return new Object[][] {
-                new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile(SEQUENCE_FILE),
-                                               new IndexedFastaSequenceFile(SEQUENCE_FILE) },
-                new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile(SEQUENCE_FILE, true),
-                                               new IndexedFastaSequenceFile(SEQUENCE_FILE) },
-                new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile(SEQUENCE_FILE.toPath()),
-                                               new IndexedFastaSequenceFile(SEQUENCE_FILE.toPath()) },
-                new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile(SEQUENCE_FILE.toPath(), true),
-                                               new IndexedFastaSequenceFile(SEQUENCE_FILE.toPath()) },};
-    }
-
-    @Test(dataProvider="homosapiens")
-    public void testOpenFile(IndexedFastaSequenceFile sequenceFile) {
-        long startTime = System.currentTimeMillis();
-        Assert.assertNotNull(sequenceFile);
-        long endTime = System.currentTimeMillis();
-        CloserUtil.close(sequenceFile);
-
-        System.err.printf("testOpenFile runtime: %dms%n", (endTime - startTime)) ;
-    }
-
-    @Test(dataProvider="homosapiens")
-    public void testFirstSequence(IndexedFastaSequenceFile sequenceFile) {
-        long startTime = System.currentTimeMillis();
-        ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chrM",1,firstBasesOfChrM.length());
-        long endTime = System.currentTimeMillis();
-
-        Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
-        Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
-        Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),firstBasesOfChrM,"First n bases of chrM are incorrect");
-
-        CloserUtil.close(sequenceFile);
-
-        System.err.printf("testFirstSequence runtime: %dms%n", (endTime - startTime)) ;
-    }
-
-    @Test(dataProvider="homosapiens")
-    public void testFirstSequenceExtended(IndexedFastaSequenceFile sequenceFile) {
-        long startTime = System.currentTimeMillis();
-        ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chrM",1,extendedBasesOfChrM.length());
-        long endTime = System.currentTimeMillis();
-
-        Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
-        Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
-        Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),extendedBasesOfChrM,"First n bases of chrM are incorrect");
-
-        CloserUtil.close(sequenceFile);
-
-        System.err.printf("testFirstSequenceExtended runtime: %dms%n", (endTime - startTime)) ;
-    }
-
-    @Test(dataProvider="homosapiens")
-    public void testReadStartingInCenterOfFirstLine(IndexedFastaSequenceFile sequenceFile) {
-        final int bytesToChopOff = 5;
-        String truncated = extendedBasesOfChrM.substring(bytesToChopOff);
-
-        long startTime = System.currentTimeMillis();
-        ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chrM",
-                                                                   bytesToChopOff + 1,
-                                                                   bytesToChopOff + truncated.length());
-        long endTime = System.currentTimeMillis();
-
-        Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
-        Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
-        Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),truncated,"First n bases of chrM are incorrect");
-
-        CloserUtil.close(sequenceFile);
-
-        System.err.printf("testReadStartingInCenterOfFirstLine runtime: %dms%n", (endTime - startTime)) ;
-    }
-
-    @Test(dataProvider="homosapiens")
-    public void testReadStartingInCenterOfMiddleLine(IndexedFastaSequenceFile sequenceFile) {
-        final int bytesToChopOff = 120;
-        String truncated = extendedBasesOfChrM.substring(bytesToChopOff);
-
-        long startTime = System.currentTimeMillis();
-        ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chrM",
-                                                                   bytesToChopOff + 1,
-                                                                   bytesToChopOff + truncated.length());
-        long endTime = System.currentTimeMillis();
-
-        Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
-        Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
-        Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),truncated,"First n bases of chrM are incorrect");
-
-        CloserUtil.close(sequenceFile);
-
-        System.err.printf("testReadStartingInCenterOfMiddleLine runtime: %dms%n", (endTime - startTime)) ;
-    }
-
-    @Test(dataProvider="comparative")
-    public void testFirstCompleteContigRead(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) {
-        ReferenceSequence expectedSequence = originalSequenceFile.nextSequence();
-
-        long startTime = System.currentTimeMillis();
-        ReferenceSequence sequence = sequenceFile.getSequence("chrM");
-        long endTime = System.currentTimeMillis();
-
-        Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
-        Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
-        Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),StringUtil.bytesToString(expectedSequence.getBases()),"chrM is incorrect");
-
-        CloserUtil.close(originalSequenceFile);
-        CloserUtil.close(sequenceFile);
-
-        System.err.printf("testFirstCompleteContigRead runtime: %dms%n", (endTime - startTime)) ;
-    }
-
-    @Test(dataProvider="homosapiens",expectedExceptions=SAMException.class)
-    public void testReadThroughEndOfContig(IndexedFastaSequenceFile sequenceFile) {
-        long startTime = System.currentTimeMillis();
-        try {
-            sequenceFile.getSubsequenceAt("chrM",16500,16600);
-        }
-        finally {
-            long endTime = System.currentTimeMillis();
-
-            CloserUtil.close(sequenceFile);
-
-            System.err.printf("testReadThroughEndOfContig runtime: %dms%n", (endTime - startTime)) ;
-        }
-    }
-
-    @Test(dataProvider="homosapiens",expectedExceptions=SAMException.class)
-    public void testReadPastEndOfContig(IndexedFastaSequenceFile sequenceFile) {
-         long startTime = System.currentTimeMillis();
-         try {
-             sequenceFile.getSubsequenceAt("chrM",16800,16900);
-         }
-         finally {
-             long endTime = System.currentTimeMillis();
-
-             CloserUtil.close(sequenceFile);
-
-             System.err.printf("testReadPastEndOfContig runtime: %dms%n", (endTime - startTime)) ;
-         }
-     }
-
-    @Test(dataProvider="comparative")
-    public void testLastCompleteContigRead(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) {
-        ReferenceSequence expectedSequence = originalSequenceFile.nextSequence();
-        while( !expectedSequence.getName().equals("chr20") )
-            expectedSequence = originalSequenceFile.nextSequence();
-
-        long startTime = System.currentTimeMillis();
-        ReferenceSequence sequence = sequenceFile.getSequence("chr20");
-        long endTime = System.currentTimeMillis();
-
-        Assert.assertEquals(sequence.getName(),"chr20","Sequence contig is not correct");
-        Assert.assertEquals(sequence.getContigIndex(),1,"Sequence contig index is not correct");
-        Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),StringUtil.bytesToString(expectedSequence.getBases()),"chrX_random is incorrect");
-
-        CloserUtil.close(originalSequenceFile);
-        CloserUtil.close(sequenceFile);
-
-        System.err.printf("testLastCompleteContigRead runtime: %dms%n", (endTime - startTime)) ;
-    }
-
-
-    @Test(dataProvider="homosapiens")
-    public void testLastOfChr20(IndexedFastaSequenceFile sequenceFile) {
-        long startTime = System.currentTimeMillis();
-        ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chr20",
-                                                                   CHR20_LENGTH - lastBasesOfChr20.length()+1,
-                                                                   CHR20_LENGTH);
-        long endTime = System.currentTimeMillis();
-
-        Assert.assertEquals(sequence.getName(),"chr20","Sequence contig is not correct");
-        Assert.assertEquals(sequence.getContigIndex(),1,"Sequence contig index is not correct");
-        Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),lastBasesOfChr20,"First n bases of chr1 are incorrect");
-
-        CloserUtil.close(sequenceFile);
-
-        System.err.printf("testFirstOfChr1 runtime: %dms%n", (endTime - startTime)) ;
-    }
-
-    @Test(dataProvider="comparative")
-    public void testFirstElementOfIterator(ReferenceSequenceFile originalSequenceFile,IndexedFastaSequenceFile sequenceFile) {
-        ReferenceSequence expectedSequence = originalSequenceFile.nextSequence();
-
-        long startTime = System.currentTimeMillis();
-        ReferenceSequence sequence = sequenceFile.nextSequence();
-        long endTime = System.currentTimeMillis();
-
-        Assert.assertEquals(sequence.getName(), "chrM","Sequence contig is not correct");
-        Assert.assertEquals(sequence.getContigIndex(), 0,"Sequence contig index is not correct");
-        Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),StringUtil.bytesToString(expectedSequence.getBases()),"chrM is incorrect");
-
-        CloserUtil.close(originalSequenceFile);
-        CloserUtil.close(sequenceFile);
-
-        System.err.printf("testFirstElementOfIterator runtime: %dms%n", (endTime - startTime)) ;
-    }
-
-    @Test(dataProvider="comparative")
-    public void testNextElementOfIterator(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) {
-        // Skip past the first one and load the second one.
-        originalSequenceFile.nextSequence();
-        ReferenceSequence expectedSequence = originalSequenceFile.nextSequence();
-
-        long startTime = System.currentTimeMillis();
-        sequenceFile.nextSequence();
-        ReferenceSequence sequence = sequenceFile.nextSequence();
-        long endTime = System.currentTimeMillis();
-
-        Assert.assertEquals(sequence.getName(),"chr20","Sequence contig is not correct");
-        Assert.assertEquals(sequence.getContigIndex(),1,"Sequence contig index is not correct");
-        Assert.assertEquals(sequence.length(),expectedSequence.length(),"Sequence size is not correct");
-        Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),StringUtil.bytesToString(expectedSequence.getBases()),"chr1 is incorrect");
-
-        CloserUtil.close(originalSequenceFile);
-        CloserUtil.close(sequenceFile);
-
-        System.err.printf("testNextElementOfIterator runtime: %dms%n", (endTime - startTime)) ;
-    }
-
-    @Test(dataProvider="comparative")
-    public void testReset(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) {
-        // Skip past the first one and load the second one.
-        ReferenceSequence expectedSequence = originalSequenceFile.nextSequence();
-
-        long startTime = System.currentTimeMillis();
-        sequenceFile.nextSequence();
-        sequenceFile.nextSequence();
-        sequenceFile.reset();
-        ReferenceSequence sequence = sequenceFile.nextSequence();
-        long endTime = System.currentTimeMillis();
-
-        Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
-        Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
-        Assert.assertEquals(sequence.length(),expectedSequence.length(), "Sequence size is not correct");
-        Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),StringUtil.bytesToString(expectedSequence.getBases()),"chrM is incorrect");
-
-        CloserUtil.close(originalSequenceFile);
-        CloserUtil.close(sequenceFile);
-
-        System.err.printf("testReset runtime: %dms%n", (endTime - startTime)) ;
-    }
-
-    @Test(expectedExceptions = FileNotFoundException.class)
-    public void testMissingFile() throws Exception {
-        new IndexedFastaSequenceFile(new File(TEST_DATA_DIR, "non-existent.fasta"));
-        Assert.fail("FileNotFoundException should have been thrown");
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileFactoryTests.java b/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileFactoryTests.java
deleted file mode 100644
index 6eeae7b..0000000
--- a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileFactoryTests.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package htsjdk.samtools.reference;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Simple tests for the reference sequence file factory
- */
-public class ReferenceSequenceFileFactoryTests {
-    public static final File hg18 = new File("src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta");
-
-    @Test public void testPositivePath() {
-        final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18);
-        Assert.assertTrue(f instanceof AbstractFastaSequenceFile);
-    }
-
-    @Test public void testGetIndexedReader() {
-        final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18, true, true);
-        Assert.assertTrue(f instanceof IndexedFastaSequenceFile, "Got non-indexed reader when expecting indexed reader.");
-    }
-
-    @Test public void testGetNonIndexedReader1() {
-        final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18, false, true);
-        Assert.assertTrue(f instanceof FastaSequenceFile, "Got indexed reader when truncating at whitespace! FAI must truncate.");
-    }
-
-    @Test public void testGetNonIndexedReader2() {
-        final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18, true, false);
-        Assert.assertTrue(f instanceof FastaSequenceFile, "Got indexed reader when requesting non-indexed reader.");
-    }
-
-    @Test public void testDefaultToIndexed() {
-        final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18, true);
-        Assert.assertTrue(f instanceof IndexedFastaSequenceFile, "Got non-indexed reader by default.");
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileWalkerTest.java b/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileWalkerTest.java
deleted file mode 100644
index fa746d6..0000000
--- a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileWalkerTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Created by farjoun on 2/14/14.
- */
-public class ReferenceSequenceFileWalkerTest {
-
-
-    @DataProvider(name = "TestReference")
-    public Object[][] TestReference() {
-        return new Object[][]{
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 0, 1},
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 1, 1},
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 0, 0},
-        };
-    }
-
-
-    @Test(dataProvider = "TestReference")
-    public void testGet(final String fileName, final int index1, final int index2) throws SAMException {
-        final File refFile = new File(fileName);
-        final ReferenceSequenceFileWalker refWalker = new ReferenceSequenceFileWalker(refFile);
-
-        ReferenceSequence sequence = refWalker.get(index1);
-        Assert.assertEquals(sequence.getContigIndex(), index1);
-
-        sequence = refWalker.get(index2);
-        Assert.assertEquals(sequence.getContigIndex(), index2);
-        CloserUtil.close(refWalker);
-    }
-
-
-    @DataProvider(name = "TestFailReference")
-    public Object[][] TestFailReference() {
-        return new Object[][]{
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta", 1,3},  //fail because out of bounds
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta", 2,3},  //fail because out of bounds
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta", 1,0},  //fail because not allowed to look back
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta", -1,0},  //fail because out of bounds
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", -1, 0},  //fail because out of bounds
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 1, -1},    //fail because out of bounds
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 2,3},  //fail because out of bounds
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 1,3},  //fail because out of bounds
-                new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 1, 0} // fasta is indexed, but not allowed to look back
-        };
-    }
-
-
-    @Test(expectedExceptions = {SAMException.class}, dataProvider = "TestFailReference")
-    public void testFailGet(final String fileName, final int index1, final int index2) throws SAMException {
-        final File refFile = new File(fileName);
-        final ReferenceSequenceFileWalker refWalker = new ReferenceSequenceFileWalker(refFile);
-
-        try {
-            refWalker.get(index1);
-
-            refWalker.get(index2);
-        }
-        finally {
-            CloserUtil.close(refWalker);
-        }
-    }
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceTests.java b/src/test/java/htsjdk/samtools/reference/ReferenceSequenceTests.java
deleted file mode 100644
index 797b0b3..0000000
--- a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceTests.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.util.Random;
-
-/**
- * Tests for the reading of reference sequences in various formats.
- *
- * @author Tim Fennell
- */
-public class ReferenceSequenceTests {
-    private static final byte[] BASES = "acgtACGTN".getBytes();
-    private final Random random = new Random();
-
-    @Test(dataProvider="fastaTestParameters")
-    public void testSingleShortSequence(int chroms, int basesPerChrom) throws Exception {
-        File f = makeRandomReference(chroms, basesPerChrom);
-        ReferenceSequenceFile ref = ReferenceSequenceFileFactory.getReferenceSequenceFile(f);
-
-        for (int i=1; i<=chroms; ++i) {
-            ReferenceSequence seq = ref.nextSequence();
-            Assert.assertNotNull(seq);
-            Assert.assertEquals(seq.length(), basesPerChrom);
-            Assert.assertEquals(seq.getName(), "chr" + i);
-            Assert.assertEquals(seq.getContigIndex(), i-1);
-        }
-
-        Assert.assertNull(ref.nextSequence());
-    }
-
-    @DataProvider
-    Object[][] fastaTestParameters() {
-        return new Object[][] {
-                new Object[] { 1,     60},
-                new Object[] { 2,     60},
-                new Object[] {10,     60},
-                new Object[] { 1,   1000},
-                new Object[] { 2,   1000},
-                new Object[] {10,   1000},
-                new Object[] { 1, 250000},
-                new Object[] { 2, 250000},
-                new Object[] {10, 250000}
-        };
-    }
-
-
-    /** Utility method to write a random reference sequence of specified length. */
-    private File makeRandomReference(int chroms, int basesPerChrom) throws Exception {
-        File file = File.createTempFile("reference.", ".fasta");
-        file.deleteOnExit();
-        BufferedWriter out = new BufferedWriter(new FileWriter(file));
-
-        for (int i=1; i<=chroms; ++i) {
-            out.write("> chr" + i);
-            out.newLine();
-
-            for (int j=1; j<=basesPerChrom; ++j) {
-                out.write(BASES[random.nextInt(BASES.length)]);
-
-                if (j % 80 == 0 || j == basesPerChrom) out.newLine();
-            }
-        }
-
-        out.flush();
-        out.close();
-        return file;
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java
deleted file mode 100644
index 9720218..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-
-import static org.testng.Assert.assertEquals;
-
-public class SeekableBufferedStreamTest {
-
-//    private final File BAM_INDEX_FILE = new File("testdata/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai");
-    private final File BAM_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
-    private final String BAM_URL_STRING = "http://broadinstitute.github.io/picard/testdata/index_test.bam";
-    private static File TestFile = new File("src/test/resources/htsjdk/samtools/seekablestream/megabyteZeros.dat");
-
-    /**
-     * Test reading across a buffer boundary (buffer size is 512000).   The test first reads a range of
-     * bytes using an unbuffered stream file stream,  then compares this to results from a buffered http stream.
-     *
-     * @throws IOException
-     */
-    @Test
-    public void testRandomRead() throws IOException {
-
-        int startPosition = 500000;
-        int length = 50000;
-
-        byte[] buffer1 = new byte[length];
-        SeekableStream unBufferedStream = new SeekableFileStream(BAM_FILE);
-        unBufferedStream.seek(startPosition);
-        int bytesRead = unBufferedStream.read(buffer1, 0, length);
-        assertEquals(length, bytesRead);
-
-        byte[] buffer2 = new byte[length];
-        SeekableStream bufferedStream = new SeekableBufferedStream(new SeekableHTTPStream(new URL(BAM_URL_STRING)));
-        bufferedStream.seek(startPosition);
-        bytesRead = bufferedStream.read(buffer2, 0, length);
-        assertEquals(length, bytesRead);
-
-        assertEquals(buffer1, buffer2);
-    }
-
-    /**
-     * Test an attempt to read past the end of the file.  The test file is 594,149 bytes in length.  The test
-     * attempts to read a 1000 byte block starting at position 594000.  A correct result would return 149 bytes.
-     *
-     * @throws IOException
-     */
-    @Test
-    public void testEOF() throws IOException {
-
-        int remainder = 149;
-        long fileLength = BAM_FILE.length();
-        long startPosition = fileLength - remainder;
-        int length = 1000;
-
-
-        byte[] buffer = new byte[length];
-        SeekableStream bufferedStream = new SeekableBufferedStream(new SeekableHTTPStream(new URL(BAM_URL_STRING)));
-        bufferedStream.seek(startPosition);
-        int bytesRead = bufferedStream.read(buffer, 0, length);
-        assertEquals(remainder, bytesRead);
-
-        // Subsequent reads should return -1
-        bytesRead = bufferedStream.read(buffer, 0, length);
-        assertEquals(-1, bytesRead);
-    }
-
-    @Test
-    public void testSkip() throws IOException {
-        final int[] BUFFER_SIZES = new int[]{8, 96, 1024, 8*1024, 16*1024, 96*1024, 48*1024};
-
-        for (final int bufferSize : BUFFER_SIZES) {
-            final SeekableBufferedStream in1 = new SeekableBufferedStream(new SeekableFileStream(BAM_FILE), bufferSize);
-            final SeekableBufferedStream in2 = new SeekableBufferedStream(new SeekableFileStream(BAM_FILE), bufferSize);
-
-            final int SIZE = 10000;
-            final byte[] bytes1 = new byte[SIZE];
-            final byte[] bytes2 = new byte[SIZE];
-
-            reallyRead(bytes1, in1);
-            reallyRead(bytes1, in1);
-            in1.skip(bytes1.length);
-            reallyRead(bytes1, in1);
-
-            reallyRead(bytes2, in2);
-            reallyRead(bytes2, in2);
-            in2.seek(bytes2.length * 3);
-            reallyRead(bytes2, in2);
-
-            in1.close();
-            in2.close();
-
-            Assert.assertEquals(bytes1, bytes2, "Error at buffer size " + bufferSize);
-        }
-    }
-
-    private int reallyRead(final byte[] bytes, final SeekableBufferedStream in) throws IOException {
-        int read = 0, total = 0;
-        do {
-            read = in.read(bytes, total, bytes.length-total);
-            total += read;
-        } while (total != bytes.length && read > 0);
-
-        return total;
-    }
-
-
-    @Test
-    public void testDivisableReads()throws IOException{
-
-        testReadsLength(1);
-        testReadsLength(2);
-        testReadsLength(4);
-        testReadsLength(5);
-        testReadsLength(10);
-        testReadsLength(20);
-        testReadsLength(50);
-        testReadsLength(100);
-
-    }
-
-    private void testReadsLength(final int length) throws IOException {
-
-        final int BUFFERED_STREAM_BUFFER_SIZE = 100;
-        final byte buffer[]=new byte[BUFFERED_STREAM_BUFFER_SIZE*10];
-        final SeekableFileStream fileStream = new SeekableFileStream(TestFile);
-        final SeekableBufferedStream  bufferedStream = new SeekableBufferedStream(fileStream,BUFFERED_STREAM_BUFFER_SIZE);
-
-        for( int i=0; i<10*BUFFERED_STREAM_BUFFER_SIZE/length ; ++i ){
-            assertEquals(bufferedStream.read(buffer, 0, length), length);
-        }
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableFTPStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableFTPStreamTest.java
deleted file mode 100644
index 966c18e..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekableFTPStreamTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * @author Jim Robinson
- * @since 10/3/11
- */
-public class SeekableFTPStreamTest {
-
-
-    static String urlString = "ftp://ftp.broadinstitute.org/pub/igv/TEST/test.txt";
-    static long fileSize = 27;
-    static byte[] expectedBytes = "abcdefghijklmnopqrstuvwxyz\n".getBytes();
-    SeekableFTPStream stream;
-
-    @BeforeMethod
-    public void setUp() throws IOException {
-        stream = new SeekableFTPStream(new URL(urlString));
-
-    }
-
-    @AfterMethod
-    public void tearDown() throws IOException {
-        stream.close();
-    }
-
-    @Test
-    public void testLength() throws Exception {
-        long length = stream.length();
-        Assert.assertEquals(fileSize, length);
-    }
-
-
-    /**
-     * Test a buffered read.  The buffer is much large than the file size,  assert that the desired # of bytes are read
-     *
-     * @throws Exception
-     */
-    @Test
-    public void testBufferedRead() throws Exception {
-
-        byte[] buffer = new byte[64000];
-        int nRead = stream.read(buffer);
-        Assert.assertEquals(fileSize, nRead);
-
-    }
-
-    /**
-     * Test requesting a range that extends beyond the end of the file
-     */
-
-    @Test
-    public void testRange() throws Exception {
-        stream.seek(20);
-        byte[] buffer = new byte[64000];
-        int nRead = stream.read(buffer);
-        Assert.assertEquals(fileSize - 20, nRead);
-
-    }
-
-    /**
-     * Test requesting a range that begins beyond the end of the file
-     */
-
-    @Test
-    public void testBadRange() throws Exception {
-        stream.seek(30);
-        byte[] buffer = new byte[64000];
-        int nRead = stream.read(buffer);
-        Assert.assertEquals(-1, nRead);
-    }
-
-
-}
-
-
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableFileStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableFileStreamTest.java
deleted file mode 100644
index 35e1545..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekableFileStreamTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.util.BufferedLineReader;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Created by IntelliJ IDEA.
- * User: jrobinso
- * Date: Dec 20, 2009
- * Time: 11:13:19 AM
- * To change this template use File | Settings | File Templates.
- */
-public class SeekableFileStreamTest {
-
-    @Test
-    public void testSeek() throws Exception {
-        String expectedLine = "ccccccccc";
-        File testFile = new File("src/test/resources/htsjdk/samtools/seekablestream/seekTest.txt");
-        SeekableFileStream is = new SeekableFileStream(testFile);
-        is.seek(20);
-        BufferedLineReader reader = new BufferedLineReader(is);
-        String nextLine = reader.readLine();
-        Assert.assertEquals(expectedLine, nextLine);
-        reader.close();
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableMemoryStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableMemoryStreamTest.java
deleted file mode 100644
index 09ad92d..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekableMemoryStreamTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.EOFException;
-import java.io.IOException;
-
-public class SeekableMemoryStreamTest {
-
-    @Test
-    public void test_getSource() {
-        String source = "source";
-        SeekableMemoryStream stream = new SeekableMemoryStream("qwe".getBytes(), source);
-        Assert.assertEquals(stream.getSource(), source);
-    }
-
-    @Test
-    public void test_EOF() throws IOException {
-        SeekableMemoryStream stream = new SeekableMemoryStream(new byte[]{}, null);
-        Assert.assertTrue(stream.eof());
-        Assert.assertEquals(stream.read(), -1);
-        Assert.assertTrue(stream.eof());
-    }
-
-    @Test
-    public void test_read_byte() throws IOException {
-        byte[] data = new byte[1024];
-        for (int i = 0; i < data.length; i++) {
-            data[i] = (byte) i;
-        }
-        SeekableMemoryStream stream = new SeekableMemoryStream(data, null);
-
-        for (int i = 0; i < data.length; i++) {
-            byte expectedByteValue = (byte) i;
-            Assert.assertEquals((byte) stream.read(), expectedByteValue);
-        }
-    }
-
-    @Test
-    public void test_read_into_array() throws IOException {
-        byte[] data = new byte[1024];
-        for (int i = 0; i < data.length; i++) {
-            data[i] = (byte) i;
-        }
-        SeekableMemoryStream stream = new SeekableMemoryStream(data, null);
-
-        byte[] copy = new byte[data.length];
-
-        int length = data.length;
-        int numberOfBytesReadSoFar = 0, maxBytesPerRead = 11;
-        while (numberOfBytesReadSoFar < length) {
-            final int count = stream.read(copy, numberOfBytesReadSoFar, Math.min(maxBytesPerRead, length - numberOfBytesReadSoFar));
-            if (count < 0) {
-                throw new EOFException();
-            }
-            numberOfBytesReadSoFar += count;
-        }
-
-        Assert.assertEquals(copy, data);
-    }
-
-    @Test(expectedExceptions = IOException.class)
-    public void test_reset() throws IOException {
-        SeekableMemoryStream stream = new SeekableMemoryStream("qwe".getBytes(), null);
-        stream.mark(3);
-        stream.reset();
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekablePathStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekablePathStreamTest.java
deleted file mode 100644
index 067f5be..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekablePathStreamTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class SeekablePathStreamTest {
-
-    @Test
-    public void testRead() throws Exception {
-        Path testPath = new File("src/test/resources/htsjdk/samtools/seekablestream/seekTest.txt").toPath();
-        SeekablePathStream is = new SeekablePathStream(testPath);
-        Assert.assertEquals(is.position(), 0);
-        Assert.assertEquals(is.read(), (int) 'a');
-        Assert.assertEquals(is.position(), 1);
-        is.seek(20);
-        Assert.assertEquals(is.position(), 20);
-        byte[] buf = new byte[2];
-        Assert.assertEquals(is.read(buf, 0, buf.length), 2);
-        Assert.assertEquals(buf, new byte[] { (byte) 'c', (byte) 'c' });
-        Assert.assertEquals(is.skip(8), 8);
-        Assert.assertEquals(is.position(), 30);
-        Assert.assertEquals(is.length(), Files.size(testPath));
-        is.close();
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamFactoryTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamFactoryTest.java
deleted file mode 100644
index 5eb0af6..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamFactoryTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.util.TestUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-
-public class SeekableStreamFactoryTest {
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
-    @Test
-    public void testIsFilePath() throws Exception {
-        Assert.assertEquals(SeekableStreamFactory.isFilePath("x"), true);
-        Assert.assertEquals(SeekableStreamFactory.isFilePath(""), true);
-        Assert.assertEquals(SeekableStreamFactory.isFilePath("http://broadinstitute.org"), false);
-        Assert.assertEquals(SeekableStreamFactory.isFilePath("https://broadinstitute.org"), false);
-        Assert.assertEquals(SeekableStreamFactory.isFilePath("ftp://broadinstitute.org"), false);
-    }
-
-    @DataProvider(name="getStreamForData")
-    public Object[][] getStreamForData() throws Exception {
-        return new Object[][] {
-                { new File(TEST_DATA_DIR, "BAMFileIndexTest/index_test.bam").getAbsolutePath(),
-                        new File(TEST_DATA_DIR, "BAMFileIndexTest/index_test.bam").getAbsolutePath() },
-                { new File(TEST_DATA_DIR, "cram_with_bai_index.cram").getAbsolutePath(),
-                        new File(TEST_DATA_DIR, "cram_with_bai_index.cram").getAbsolutePath() },
-                { new URL("file://" + new File(TEST_DATA_DIR, "cram_with_bai_index.cram").getAbsolutePath()).toExternalForm(),
-                        new File(TEST_DATA_DIR, "cram_with_bai_index.cram").getAbsolutePath() },
-                { new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam").toExternalForm(),
-                        new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam").toExternalForm() },
-                { new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam.bai").toExternalForm(),
-                       new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam.bai").toExternalForm() }
-        };
-    }
-
-    @Test(dataProvider = "getStreamForData")
-    public void testGetStreamFor(final String path, final String expectedPath) throws IOException {
-        Assert.assertEquals(SeekableStreamFactory.getInstance().getStreamFor(path).getSource(), expectedPath);
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/sra/AbstractSRATest.java b/src/test/java/htsjdk/samtools/sra/AbstractSRATest.java
deleted file mode 100644
index 297b892..0000000
--- a/src/test/java/htsjdk/samtools/sra/AbstractSRATest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordIterator;
-import org.testng.Assert;
-import org.testng.SkipException;
-import org.testng.annotations.BeforeGroups;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.lang.reflect.Method;
-import java.util.NoSuchElementException;
-
- at Test(groups = "sra")
-public abstract class AbstractSRATest {
-    private static boolean canResolveNetworkAccession = false;
-    private static String checkAccession = "SRR000123";
-
-    @BeforeGroups(groups = "sra")
-    public final void checkIfCanResolve() {
-        if (SRAAccession.checkIfInitialized() != null) {
-            return;
-        }
-        canResolveNetworkAccession = SRAAccession.isValid(checkAccession);
-    }
-
-    @BeforeMethod
-    public final void assertSRAIsSupported() {
-        if(SRAAccession.checkIfInitialized() != null){
-            throw new SkipException("Skipping SRA Test because SRA native code is unavailable.");
-        }
-    }
-
-    @BeforeMethod
-    public final void skipIfCantResolve(Method method, Object[] params) {
-        String accession = null;
-
-        if (params.length > 0) {
-            Object firstParam = params[0];
-            if (firstParam instanceof String) {
-                accession = (String)firstParam;
-            } else if (firstParam instanceof SRAAccession) {
-                accession = firstParam.toString();
-            }
-        }
-
-        if (accession != null &&
-                accession.matches(SRAAccession.REMOTE_ACCESSION_PATTERN) && !canResolveNetworkAccession) {
-            throw new SkipException("Skipping network SRA Test because cannot resolve remote SRA accession '" +
-                    checkAccession + "'.");
-        }
-    }
-
-    /**
-     * Exhaust the iterator and check that it produce the expected number of mapped and unmapped reads.
-     * Also checks that the hasNext() agrees with the actual results of next() for the given iterator.
-     * @param expectedNumMapped expected number of mapped reads, specify -1 to skip this check
-     * @param expectedNumUnmapped expected number of unmapped reads, specify -1 to skip this check
-     */
-    static void assertCorrectCountsOfMappedAndUnmappedRecords(SAMRecordIterator samRecordIterator,
-                                                                        int expectedNumMapped, int expectedNumUnmapped) {
-        int numMapped = 0, numUnmapped = 0;
-        while (true) {
-            boolean hasRecord = samRecordIterator.hasNext();
-            SAMRecord record;
-            try {
-                record = samRecordIterator.next();
-                Assert.assertNotNull(record);
-                Assert.assertTrue(hasRecord); // exception is not thrown if we came to this point
-            } catch (final NoSuchElementException e) {
-                Assert.assertFalse(hasRecord);
-                break;
-            }
-
-            if (record.getReadUnmappedFlag()) {
-                numUnmapped++;
-            } else {
-                numMapped++;
-            }
-        }
-
-        if (expectedNumMapped != -1) {
-            Assert.assertEquals(numMapped, expectedNumMapped);
-        }
-        if (expectedNumUnmapped != -1) {
-            Assert.assertEquals(numUnmapped, expectedNumUnmapped);
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRAAccessionTest.java b/src/test/java/htsjdk/samtools/sra/SRAAccessionTest.java
deleted file mode 100644
index 4b89b7e..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRAAccessionTest.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package htsjdk.samtools.sra;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Tests for SRAAccession logic
- */
-public class SRAAccessionTest extends AbstractSRATest {
-
-    @DataProvider(name = "isValidAccData")
-    private Object[][] getIsValidAccData() {
-        return new Object[][] {
-            { "SRR000123", true },
-            { "DRR010511", true },
-            { "src/test/resources/htsjdk/samtools/sra/test_archive.sra", true },
-            { "src/test/resources/htsjdk/samtools/compressed.bam", false },
-            { "src/test/resources/htsjdk/samtools/uncompressed.sam", false },
-        };
-    }
-
-    @Test(dataProvider = "isValidAccData")
-    public void testIsValidAcc(String accession, boolean isValid) {
-        Assert.assertEquals(isValid, SRAAccession.isValid(accession));
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRAIndexTest.java b/src/test/java/htsjdk/samtools/sra/SRAIndexTest.java
deleted file mode 100644
index 0cdfc69..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRAIndexTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*===========================================================================
-*
-*                            PUBLIC DOMAIN NOTICE
-*               National Center for Biotechnology Information
-*
-*  This software/database is a "United States Government Work" under the
-*  terms of the United States Copyright Act.  It was written as part of
-*  the author's official duties as a United States Government employee and
-*  thus cannot be copyrighted.  This software/database is freely available
-*  to the public for use. The National Library of Medicine and the U.S.
-*  Government have not placed any restriction on its use or reproduction.
-*
-*  Although all reasonable efforts have been taken to ensure the accuracy
-*  and reliability of the software and data, the NLM and the U.S.
-*  Government do not and cannot warrant the performance or results that
-*  may be obtained by using this software or data. The NLM and the U.S.
-*  Government disclaim all warranties, express or implied, including
-*  warranties of performance, merchantability or fitness for any particular
-*  purpose.
-*
-*  Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.BAMFileSpan;
-import htsjdk.samtools.Bin;
-import htsjdk.samtools.GenomicIndexUtil;
-import htsjdk.samtools.SRAFileReader;
-import htsjdk.samtools.SRAIndex;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * Unit tests for SRAIndex
- *
- * Created by andrii.nikitiuk on 10/28/15.
- */
-public class SRAIndexTest extends AbstractSRATest {
-    private static final SRAAccession DEFAULT_ACCESSION = new SRAAccession("SRR2096940");
-    private static final int LAST_BIN_LEVEL = GenomicIndexUtil.LEVEL_STARTS.length - 1;
-    private static final int SRA_BIN_OFFSET = GenomicIndexUtil.LEVEL_STARTS[LAST_BIN_LEVEL];
-
-    @Test
-    public void testLevelSize() {
-        final SRAIndex index = getIndex(DEFAULT_ACCESSION);
-        Assert.assertEquals(index.getLevelSize(0), GenomicIndexUtil.LEVEL_STARTS[1] - GenomicIndexUtil.LEVEL_STARTS[0]);
-
-        Assert.assertEquals(index.getLevelSize(LAST_BIN_LEVEL), GenomicIndexUtil.MAX_BINS - GenomicIndexUtil.LEVEL_STARTS[LAST_BIN_LEVEL] - 1);
-    }
-
-    @Test
-    public void testLevelForBin() {
-        final SRAIndex index = getIndex(DEFAULT_ACCESSION);
-        final Bin bin = new Bin(0, SRA_BIN_OFFSET);
-        Assert.assertEquals(index.getLevelForBin(bin), LAST_BIN_LEVEL);
-    }
-
-    @DataProvider(name = "testBinLocuses")
-    private Object[][] createDataForBinLocuses() {
-        return new Object[][] {
-                {DEFAULT_ACCESSION, 0, 0, 1, SRAIndex.SRA_BIN_SIZE},
-                {DEFAULT_ACCESSION, 0, 1, SRAIndex.SRA_BIN_SIZE + 1, SRAIndex.SRA_BIN_SIZE * 2}
-        };
-    }
-
-    @Test(dataProvider = "testBinLocuses")
-    public void testBinLocuses(SRAAccession acc, int reference, int binIndex, int firstLocus, int lastLocus) {
-        final SRAIndex index = getIndex(acc);
-        final Bin bin = new Bin(reference, SRA_BIN_OFFSET + binIndex);
-
-        Assert.assertEquals(index.getFirstLocusInBin(bin), firstLocus);
-        Assert.assertEquals(index.getLastLocusInBin(bin), lastLocus);
-    }
-
-    @DataProvider(name = "testBinOverlappings")
-    private Object[][] createDataForBinOverlappings() {
-        return new Object[][] {
-                {DEFAULT_ACCESSION, 0, 1, SRAIndex.SRA_BIN_SIZE, new HashSet<>(Arrays.asList(0))},
-                {DEFAULT_ACCESSION, 0, SRAIndex.SRA_BIN_SIZE + 1, SRAIndex.SRA_BIN_SIZE * 2, new HashSet<>(Arrays.asList(1))},
-                {DEFAULT_ACCESSION, 0, SRAIndex.SRA_BIN_SIZE + 1, SRAIndex.SRA_BIN_SIZE * 3, new HashSet<>(Arrays.asList(1, 2))},
-                {DEFAULT_ACCESSION, 0, SRAIndex.SRA_BIN_SIZE * 2, SRAIndex.SRA_BIN_SIZE * 2 + 1, new HashSet<>(Arrays.asList(1, 2))}
-        };
-    }
-
-
-    @Test(dataProvider = "testBinOverlappings")
-    public void testBinOverlappings(SRAAccession acc, int reference, int firstLocus, int lastLocus, Set<Integer> binNumbers) {
-        final SRAIndex index = getIndex(acc);
-        final Iterator<Bin> binIterator = index.getBinsOverlapping(reference, firstLocus, lastLocus).iterator();
-        final Set<Integer> binNumbersFromIndex = new HashSet<>();
-        while (binIterator.hasNext()) {
-            final Bin bin = binIterator.next();
-            binNumbersFromIndex.add(bin.getBinNumber() - SRA_BIN_OFFSET);
-        }
-
-        Assert.assertEquals(binNumbers, binNumbersFromIndex);
-    }
-
-    @DataProvider(name = "testSpanOverlappings")
-    private Object[][] createDataForSpanOverlappings() {
-        return new Object[][] {
-                {DEFAULT_ACCESSION, 0, 1, SRAIndex.SRA_BIN_SIZE, new long[] {0, SRAIndex.SRA_CHUNK_SIZE} },
-                {DEFAULT_ACCESSION, 0, SRAIndex.SRA_BIN_SIZE * 2, SRAIndex.SRA_BIN_SIZE * 2 + 1, new long[]{0, SRAIndex.SRA_CHUNK_SIZE} },
-                {DEFAULT_ACCESSION, 0, SRAIndex.SRA_CHUNK_SIZE, SRAIndex.SRA_CHUNK_SIZE + 1, new long[]{0, SRAIndex.SRA_CHUNK_SIZE, SRAIndex.SRA_CHUNK_SIZE, SRAIndex.SRA_CHUNK_SIZE * 2} },
-        };
-    }
-
-    @Test(dataProvider = "testSpanOverlappings")
-    public void testSpanOverlappings(SRAAccession acc, int reference, int firstLocus, int lastLocus, long[] spanCoordinates) {
-        final SRAIndex index = getIndex(acc);
-        final BAMFileSpan span = index.getSpanOverlapping(reference, firstLocus, lastLocus);
-
-        long[] coordinatesFromIndex = span.toCoordinateArray();
-
-        Assert.assertTrue(Arrays.equals(coordinatesFromIndex, spanCoordinates),
-                "Coordinates mismatch. Expected: " + Arrays.toString(spanCoordinates) +
-                " but was : " + Arrays.toString(coordinatesFromIndex));
-    }
-
-    private SRAIndex getIndex(SRAAccession acc) {
-        final SRAFileReader reader = new SRAFileReader(acc);
-        return (SRAIndex) reader.getIndex();
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRALazyRecordTest.java b/src/test/java/htsjdk/samtools/sra/SRALazyRecordTest.java
deleted file mode 100644
index 36ef346..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRALazyRecordTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SRAFileReader;
-import htsjdk.samtools.util.TestUtil;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Tests for SRA extension of SAMRecord objects which load fields on demand
- */
-public class SRALazyRecordTest extends AbstractSRATest {
-    private static final SRAAccession DEFAULT_ACCESSION = new SRAAccession("SRR2096940");
-
-    @DataProvider(name = "serializationTestData")
-    private Object[][] getSerializationTestData() {
-        return new Object[][] {
-                { DEFAULT_ACCESSION }
-        };
-    }
-
-    @Test(dataProvider = "serializationTestData")
-    public void testSerialization(final SRAAccession accession) throws Exception {
-        final SRAFileReader reader = new SRAFileReader(accession);
-        final SAMRecord initialSAMRecord = reader.getIterator().next();
-        reader.close();
-
-        final SAMRecord deserializedSAMRecord = TestUtil.serializeAndDeserialize(initialSAMRecord);
-
-        Assert.assertEquals(deserializedSAMRecord, initialSAMRecord, "Deserialized SAMRecord not equal to original SAMRecord");
-    }
-
-    @Test
-    public void testCloneAndEquals() throws Exception {
-        final SRAFileReader reader = new SRAFileReader(DEFAULT_ACCESSION);
-        final SAMRecord record = reader.getIterator().next();
-        reader.close();
-
-        final SAMRecord newRecord = (SAMRecord)record.clone();
-        Assert.assertFalse(record == newRecord);
-        Assert.assertNotSame(record, newRecord);
-        Assert.assertEquals(record, newRecord);
-        Assert.assertEquals(newRecord, record);
-
-        newRecord.setAlignmentStart(record.getAlignmentStart() + 100);
-        Assert.assertFalse(record.equals(newRecord));
-        Assert.assertFalse(newRecord.equals(record));
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRAQueryTest.java b/src/test/java/htsjdk/samtools/sra/SRAQueryTest.java
deleted file mode 100644
index 575b3dd..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRAQueryTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SamInputResource;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.ValidationStringency;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class SRAQueryTest extends AbstractSRATest {
-
-    @DataProvider(name = "testUnmappedCounts")
-    private Object[][] createDataForUnmappedCounts() {
-        return new Object[][] {
-                {"SRR2096940", 498}
-        };
-    }
-
-    @Test(dataProvider = "testUnmappedCounts")
-    public void testUnmappedCounts(String acc, int expectedNumUnmapped) {
-        SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
-                SamInputResource.of(new SRAAccession(acc))
-        );
-
-        final SAMRecordIterator samRecordIterator = reader.queryUnmapped();
-
-        assertCorrectCountsOfMappedAndUnmappedRecords(samRecordIterator, 0, expectedNumUnmapped);
-    }
-
-    @DataProvider(name = "testReferenceAlignedCounts")
-    private Object[][] createDataForReferenceAlignedCounts() {
-        return new Object[][] {
-                {"SRR2096940", "CM000681.1", 0, 10591},
-                {"SRR2096940", "CM000681.1", 55627015, 10591},
-                {"SRR2096940", "CM000681.1", 55627016, 0},
-        };
-    }
-
-    @Test(dataProvider = "testReferenceAlignedCounts")
-    public void testReferenceAlignedCounts(String acc, String reference, int referenceStart, int expectedNumMapped) {
-        SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
-                SamInputResource.of(new SRAAccession(acc))
-        );
-
-        final SAMRecordIterator samRecordIterator = reader.queryAlignmentStart(reference, referenceStart);
-
-        assertCorrectCountsOfMappedAndUnmappedRecords(samRecordIterator, expectedNumMapped, 0);
-    }
-
-    @DataProvider(name = "testQueryCounts")
-    private Object[][] createDataForQueryCounts() {
-        return new Object[][] {
-                {"SRR2096940", "CM000681.1", 0, 59128983, true, 10591, 0},
-                {"SRR2096940", "CM000681.1", 55627015, 59128983, true, 10591, 0},
-                {"SRR2096940", "CM000681.1", 55627016, 59128983, true, 0, 0},
-                {"SRR2096940", "CM000681.1", 55627016, 59128983, false, 10591, -1},
-        };
-    }
-
-    @Test(dataProvider = "testQueryCounts")
-    public void testQueryCounts(String acc, String reference, int referenceStart, int referenceEnd, boolean contained, int expectedNumMapped, int expectedNumUnmapped) {
-        SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
-                SamInputResource.of(new SRAAccession(acc))
-        );
-
-        final SAMRecordIterator samRecordIterator = reader.query(reference, referenceStart, referenceEnd, contained);
-
-        assertCorrectCountsOfMappedAndUnmappedRecords(samRecordIterator, expectedNumMapped, expectedNumUnmapped);
-    }
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRAReferenceTest.java b/src/test/java/htsjdk/samtools/sra/SRAReferenceTest.java
deleted file mode 100644
index dd2b374..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRAReferenceTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class SRAReferenceTest extends AbstractSRATest {
-    @DataProvider(name = "testReference")
-    private Object[][] createDataForReference() {
-        return new Object[][] {
-                {"SRR2096940", "CM000681.1", 95001, 95050, "AGATGATTCAGTCTCACCAAGAACACTGAAAGTCACATGGCTACCAGCAT"},
-        };
-    }
-
-    @Test(dataProvider = "testReference")
-    public void testReference(String acc, String refContig, int refStart, int refStop, String refBases) {
-        final ReferenceSequenceFile refSeqFile = new SRAIndexedSequenceFile(new SRAAccession(acc));
-        final ReferenceSequence refSeq = refSeqFile.getSubsequenceAt(refContig, refStart, refStop);
-        Assert.assertEquals(new String(refSeq.getBases()), refBases);
-    }
-
-    class TestReferenceMtData {
-        String refContig;
-        int refStart;
-        int refStop;
-        String refBases;
-
-        TestReferenceMtData(String refContig, int refStart, int refStop, String refBases) {
-            this.refContig = refContig;
-            this.refStart = refStart;
-            this.refStop = refStop;
-            this.refBases = refBases;
-        }
-
-        @Override
-        public String toString() {
-            return refContig + ":" + refStart + "-" + refStop + " = " + refBases;
-        }
-    }
-
-    @DataProvider(name = "testReferenceMt")
-    private Object[][] createDataForReferenceMt() {
-        return new Object[][] {
-                {
-                    "SRR353866", Arrays.asList(
-                        new TestReferenceMtData("AAAB01001871.1", 1, 50, "TGACGCGCATGAATGGATTAACGAGATTCCCTCTGTCCCTATCTACTATC"),
-                        new TestReferenceMtData("AAAB01001871.1", 901, 950, "ACCAAGCGTACGATTGTTCACCCTTTCAAGGGAACGTGAGCTGGGTTTAG"),
-                        new TestReferenceMtData("AAAB01008987.1", 1, 50, "TTTTGGACGATGTTTTTGGTGAACAGAAAACGAGCTCAATCATCCAGAGC"),
-                        new TestReferenceMtData("AAAB01008859.1", 1, 50, "CAAAACGATGCCACAGATCAGAAGTTAATTAACGCACATTCTCCACCCAC")
-                    )
-                },
-        };
-    }
-
-    @Test(dataProvider = "testReferenceMt")
-    public void testReferenceMt(String acc, List<TestReferenceMtData> parallelTests) throws Exception {
-        final ReferenceSequenceFile refSeqFile = new SRAIndexedSequenceFile(new SRAAccession(acc));
-        final long timeout = 1000L * 5; // just in case
-        final List<Thread> threads = new ArrayList<Thread>(parallelTests.size());
-        final Map<TestReferenceMtData, Exception> runErrors = Collections.synchronizedMap(new HashMap<TestReferenceMtData, Exception>());
-        for (final TestReferenceMtData testData: parallelTests) {
-            threads.add(new Thread() {
-                @Override
-                public void run() {
-                    try {
-                        final ReferenceSequence refSeq = refSeqFile.getSubsequenceAt(testData.refContig,
-                                testData.refStart, testData.refStop);
-                        Assert.assertEquals(new String(refSeq.getBases()), testData.refBases);
-                    } catch (final Exception e) {
-                        Assert.assertNull(runErrors.put(testData, e));
-                    }
-                }
-            });
-        }
-        for (final Thread thread: threads) {
-            thread.start();
-        }
-        for (final Thread thread: threads) {
-            thread.join(timeout);
-        }
-        for (final Map.Entry<TestReferenceMtData, Exception> result: runErrors.entrySet()) {
-            // Will fail only on the first, but a debugger will be able to see all the results.
-            Assert.fail("failed: " + result.getKey(), result.getValue());
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRATest.java b/src/test/java/htsjdk/samtools/sra/SRATest.java
deleted file mode 100644
index c106bfc..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRATest.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*===========================================================================
-*
-*                            PUBLIC DOMAIN NOTICE
-*               National Center for Biotechnology Information
-*
-*  This software/database is a "United States Government Work" under the
-*  terms of the United States Copyright Act.  It was written as part of
-*  the author's official duties as a United States Government employee and
-*  thus cannot be copyrighted.  This software/database is freely available
-*  to the public for use. The National Library of Medicine and the U.S.
-*  Government have not placed any restriction on its use or reproduction.
-*
-*  Although all reasonable efforts have been taken to ensure the accuracy
-*  and reliability of the software and data, the NLM and the U.S.
-*  Government do not and cannot warrant the performance or results that
-*  may be obtained by using this software or data. The NLM and the U.S.
-*  Government disclaim all warranties, express or implied, including
-*  warranties of performance, merchantability or fitness for any particular
-*  purpose.
-*
-*  Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.BAMFileSpan;
-import htsjdk.samtools.BrowseableBAMIndex;
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMReadGroupRecord;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SAMUtils;
-import htsjdk.samtools.SAMValidationError;
-import htsjdk.samtools.SamInputResource;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.ValidationStringency;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Integration tests for SRA functionality
- *
- * Created by andrii.nikitiuk on 8/24/15.
- */
-public class SRATest extends AbstractSRATest {
-
-    @DataProvider(name = "testCounts")
-    private Object[][] createDataForCounts() {
-        return new Object[][] {
-            {"SRR2096940", 10591, 498},
-            {"SRR000123", 0, 4583}
-        };
-    }
-
-    @Test(dataProvider = "testCounts")
-    public void testCounts(String acc, int expectedNumMapped, int expectedNumUnmapped) {
-        SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
-                SamInputResource.of(new SRAAccession(acc))
-        );
-
-        final SAMRecordIterator samRecordIterator = reader.iterator();
-
-        assertCorrectCountsOfMappedAndUnmappedRecords(samRecordIterator, expectedNumMapped, expectedNumUnmapped);
-    }
-
-    @DataProvider(name = "testCountsBySpan")
-    private Object[][] createDataForCountsBySpan() {
-        return new Object[][] {
-            {"SRR2096940", Arrays.asList(new Chunk(0, 59128983), new Chunk(59128983, 59141089)), 10591, 498},
-            {"SRR2096940", Arrays.asList(new Chunk(0, 29128983), new Chunk(29128983, 59141089)), 10591, 498},
-            {"SRR2096940", Arrays.asList(new Chunk(0, 59134983), new Chunk(59134983, 59141089)), 10591, 498},
-            {"SRR2096940", Arrays.asList(new Chunk(0, 59130000)),                                10591, 0},
-            {"SRR2096940", Arrays.asList(new Chunk(0, 59140889)),                                10591, 298}
-        };
-    }
-
-    @Test(dataProvider = "testCountsBySpan")
-    public void testCountsBySpan(String acc, List<Chunk> chunks, int expectedNumMapped, int expectedNumUnmapped) {
-        SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
-                SamInputResource.of(new SRAAccession(acc))
-        );
-
-        final SAMRecordIterator samRecordIterator = ((SamReader.Indexing) reader).iterator(new BAMFileSpan(chunks));
-
-        assertCorrectCountsOfMappedAndUnmappedRecords(samRecordIterator, expectedNumMapped, expectedNumUnmapped);
-    }
-
-    @DataProvider(name = "testGroups")
-    private Object[][] createDataForGroups() {
-        return new Object[][] {
-            {"SRR1035115", new TreeSet<>(Arrays.asList("15656144_B09YG", "15656144_B09MR"))},
-            {"SRR2096940", new TreeSet<>(Arrays.asList("SRR2096940"))}
-        };
-    }
-
-    @Test(dataProvider = "testGroups")
-    public void testGroups(String acc, Set<String> groups) {
-        SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
-                SamInputResource.of(new SRAAccession(acc))
-        );
-
-        final SAMRecordIterator samRecordIterator = reader.iterator();
-
-        SAMFileHeader header = reader.getFileHeader();
-        Set<String> headerGroups = new TreeSet<>();
-        for (SAMReadGroupRecord group : header.getReadGroups()) {
-            Assert.assertEquals(group.getReadGroupId(), group.getId());
-            headerGroups.add(group.getReadGroupId());
-        }
-
-        Assert.assertEquals(groups, headerGroups);
-
-        Set<String> foundGroups = new TreeSet<>();
-
-        for (int i = 0; i < 10000; i++) {
-            if (!samRecordIterator.hasNext()) {
-                break;
-            }
-            SAMRecord record = samRecordIterator.next();
-            String groupName = (String)record.getAttribute("RG");
-
-            foundGroups.add(groupName);
-        }
-
-        // please note that some groups may be introduced after 10k records, which is not an error
-        Assert.assertEquals(groups, foundGroups);
-    }
-
-    @DataProvider(name = "testReferences")
-    private Object[][] createDataForReferences() {
-        return new Object[][] {
-            // primary alignment only
-            {"SRR353866", 9,
-                    Arrays.asList(
-                            "AAAB01001871.1", "AAAB01002233.1", "AAAB01004056.1", "AAAB01006027.1",
-                            "AAAB01008846.1", "AAAB01008859.1", "AAAB01008960.1", "AAAB01008982.1",
-                            "AAAB01008987.1"
-                    ),
-                    Arrays.asList(
-                            1115, 1034, 1301, 1007,
-                            11308833, 12516315, 23099915, 1015562,
-                            16222597
-                    )},
-        };
-    }
-
-    @Test(dataProvider = "testReferences")
-    public void testReferences(String acc, int numberFirstReferenceFound, List<String> references, List<Integer> refLengths) {
-        SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
-                SamInputResource.of(new SRAAccession(acc))
-        );
-
-        final SAMRecordIterator samRecordIterator = reader.iterator();
-
-        SAMFileHeader header = reader.getFileHeader();
-        Set<String> headerRefNames = new TreeSet<>();
-
-        for (SAMSequenceRecord ref : header.getSequenceDictionary().getSequences()) {
-            String refName = ref.getSequenceName();
-
-            int refIndex = references.indexOf(refName);
-            Assert.assertTrue(refIndex != -1, "Unexpected reference: " + refName);
-
-            Assert.assertEquals(refLengths.get(refIndex), (Integer) ref.getSequenceLength(), "Reference length is incorrect");
-
-            headerRefNames.add(refName);
-        }
-
-        Assert.assertEquals(new TreeSet<>(references), headerRefNames);
-
-        Set<String> foundRefNames = new TreeSet<>();
-        for (int i = 0; i < 10000; i++) {
-            if (!samRecordIterator.hasNext()) {
-                break;
-            }
-            SAMRecord record = samRecordIterator.next();
-
-            if (record.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)) {
-                continue;
-            }
-
-            String refName = record.getReferenceName();
-            Assert.assertNotNull(refName);
-
-            foundRefNames.add(refName);
-        }
-
-        Assert.assertEquals(new TreeSet<>(references.subList(0, numberFirstReferenceFound)), foundRefNames);
-    }
-
-    @DataProvider(name = "testRows")
-    private Object[][] createDataForRowsTest() {
-        return new Object[][] {
-            // primary alignment only
-            {"SRR2127895", 1, 83, "SRR2127895.R.1",
-                    "CGTGCGCGTGACCCATCAGATGCTGTTCAATCAGTGGCAAATGCGGAACGGTTTCTGCGGGTTGCCGATATTCTGGAGAGTAATGCCAGGCAGGGGCAGGT",
-                    "DDBDDDDDBCABC at CCDDDC?99CCA:CDCDDDDDDDECDDDFFFHHHEGIJIIGIJIHIGJIJJJJJJJIIJIIHIGJIJJJIJJIHFFBHHFFFDFBBB",
-                    366, "29S72M", "gi|152968582|ref|NC_009648.1|", 147, true, false, false},
-
-            // small SRA archive
-            {"SRR2096940", 1, 16, "SRR2096940.R.3",
-                    "GTGTGTCACCAGATAAGGAATCTGCCTAACAGGAGGTGTGGGTTAGACCCAATATCAGGAGACCAGGAAGGAGGAGGCCTAAGGATGGGGCTTTTCTGTCACCAATCCTGTCCCTAGTGGCCCCACTGTGGGGTGGAGGGGACAGATAAAAGTACCCAGAACCAGAG",
-                    "AAAABFFFFFFFGGGGGGGGIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIGGGGGFGFFDFFFFFC",
-                    55627016, "167M", "CM000681.1", 42, false, false, false},
-
-            {"SRR2096940", 10591, 4, "SRR2096940.R.10592",
-                    "CTCTGGTTCTGGGTACTTTTATCTGTCCCCTCCACCCCACAGTGGCGAGCCAGATTCCTTATCTGGTGACACAC",
-                    "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII",
-                    -1, null, null, -1, false, false, false},
-
-            // primary and secondary alignments
-            {"SRR833251", 81, 393, "SRR833251.R.51",
-                    "ATGCAAATCCGAATGGGCTATTTGTGGGTACTTGGGCAGGTAAGTAGCTGGCAATCTTGGTCGGTAAACCAATACCCAAGTTCACATAGGCACCATCGGGA",
-                    "CCCFFFFFHHHHHIJJJIJJJJJIIJJJGIJIJIIJIJJJDGIGIIJIJIHIJJJJJJGIGHIHEDFFFFDDEEEDDDDDCDEEDDDDDDDDDDDDDBBDB",
-                    1787186, "38M63S", "gi|169794206|ref|NC_010410.1|", 11, true, true, true},
-
-            // local SRA file
-            {"src/test/resources/htsjdk/samtools/sra/test_archive.sra", 1, 99, "test_archive.R.2",
-                    "TGTCGATGCTGAAAGTGTCTGCGGTGAACCACTTCATGCACAGCGCACACTGCAGCTCCACTTCACCCAGCTGACGGCCGTTCTCATCGTCTCCAGAGCCCGTCTGAGCGTCCGCTGCTTCAGAACTGTCCCCGGCTGTATCCTGAAGAC",
-                    "BBAABBBFAFFFGGGGGGGGGGGGEEFHHHHGHHHHHFHHGHFDGGGGGHHGHHHHHHHHHHHHFHHHGHHHHHHGGGGGGGHGGHHHHHHHHHGHHHHHGGGGHGHHHGGGGGGGGGHHHHEHHHHHHHHHHGCGGGHHHHHHGBFFGF",
-                    2811570, "150M", "NC_007121.5", 60, true, false, false}
-        };
-    }
-
-    @Test(dataProvider = "testRows")
-    public void testRows(String acc, int recordIndex, int flags, String readName, String bases, String quals, int refStart, String cigar,
-                         String refName, int mapQ, boolean hasMate, boolean isSecondOfPair, boolean isSecondaryAlignment) {
-        SAMRecord record = getRecordByIndex(acc, recordIndex, false);
-
-        checkSAMRecord(record, flags, readName, bases, quals, refStart, cigar, refName, mapQ, hasMate, isSecondOfPair, isSecondaryAlignment);
-    }
-
-    @Test(dataProvider = "testRows")
-    public void testRowsAfterIteratorDetach(String acc, int recordIndex, int flags, String readName, String bases, String quals,
-                                            int refStart, String cigar, String refName, int mapQ, boolean hasMate,
-                                            boolean isSecondOfPair, boolean isSecondaryAlignment) {
-        SAMRecord record = getRecordByIndex(acc, recordIndex, true);
-
-        checkSAMRecord(record, flags, readName, bases, quals, refStart, cigar, refName, mapQ, hasMate, isSecondOfPair, isSecondaryAlignment);
-    }
-
-    @Test(dataProvider = "testRows")
-    public void testRowsOverrideValues(String acc, int recordIndex, int flags, String readName, String bases, String quals,
-                                       int refStart, String cigar, String refName, int mapQ, boolean hasMate,
-                                       boolean isSecondOfPair, boolean isSecondaryAlignment) {
-        SAMRecord record = getRecordByIndex(acc, recordIndex, true);
-        SAMFileHeader header = record.getHeader();
-
-        record.setFlags(0);
-        record.setReadUnmappedFlag(refStart == -1);
-        record.setReadBases("C".getBytes());
-        record.setBaseQualities(SAMUtils.fastqToPhred("A"));
-        if (refStart == -1) {
-            checkSAMRecord(record, 4, readName, "C", "A", refStart, "1M", refName, mapQ, false, false, false);
-        } else {
-            int sequenceIndex = header.getSequenceIndex(refName);
-            Assert.assertFalse(sequenceIndex == -1);
-
-            if (sequenceIndex == 0) {
-                if (header.getSequenceDictionary().getSequences().size() > 1) {
-                    sequenceIndex++;
-                }
-            } else {
-                sequenceIndex--;
-            }
-
-            refName = header.getSequence(sequenceIndex).getSequenceName();
-
-            record.setAlignmentStart(refStart - 100);
-            record.setCigarString("1M");
-            record.setMappingQuality(mapQ - 1);
-            record.setReferenceIndex(sequenceIndex);
-
-            checkSAMRecord(record, 0, readName, "C", "A", refStart - 100, "1M", refName, mapQ - 1, false, false, false);
-        }
-    }
-
-    @Test(dataProvider = "testRows")
-    public void testRowsBySpan(String acc, int recordIndex, int flags, String readName, String bases, String quals,
-                                            int refStart, String cigar, String refName, int mapQ, boolean hasMate,
-                                            boolean isSecondOfPair, boolean isSecondaryAlignment) {
-        SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
-                SamInputResource.of(new SRAAccession(acc))
-        );
-
-        SAMFileHeader header = reader.getFileHeader();
-
-        Chunk chunk;
-        if (refStart != -1) {
-            long refOffset = 0;
-            int refIndex = header.getSequenceDictionary().getSequence(refName).getSequenceIndex();
-            for (SAMSequenceRecord sequenceRecord : header.getSequenceDictionary().getSequences()) {
-                if (sequenceRecord.getSequenceIndex() <  refIndex) {
-                    refOffset += sequenceRecord.getSequenceLength();
-                }
-            }
-
-            chunk = new Chunk(refOffset + refStart - 1, refOffset + refStart);
-        } else {
-            long totalRefLength = header.getSequenceDictionary().getReferenceLength();
-            long totalRecordRange = ((BAMFileSpan)reader.indexing().getFilePointerSpanningReads()).toCoordinateArray()[1];
-            chunk = new Chunk(totalRefLength, totalRecordRange);
-        }
-
-        final SAMRecordIterator samRecordIterator = ((SamReader.Indexing) reader).iterator(new BAMFileSpan(chunk));
-
-        SAMRecord record = null;
-        while (samRecordIterator.hasNext()) {
-            SAMRecord currentRecord = samRecordIterator.next();
-            if (currentRecord.getReadName().equals(readName)) {
-                record = currentRecord;
-                break;
-            }
-        }
-
-        checkSAMRecord(record, flags, readName, bases, quals, refStart, cigar, refName, mapQ, hasMate, isSecondOfPair, isSecondaryAlignment);
-    }
-
-    @Test(dataProvider = "testRows")
-    public void testRowsByIndex(String acc, int recordIndex, int flags, String readName, String bases, String quals,
-                                int refStart, String cigar, String refName, int mapQ, boolean hasMate,
-                                boolean isSecondOfPair, boolean isSecondaryAlignment) {
-        SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
-                SamInputResource.of(new SRAAccession(acc))
-        );
-
-        Assert.assertTrue(reader.hasIndex());
-        Assert.assertTrue(reader.indexing().hasBrowseableIndex());
-
-        SAMFileHeader header = reader.getFileHeader();
-        BrowseableBAMIndex index = reader.indexing().getBrowseableIndex();
-
-        BAMFileSpan span;
-        if (refStart != -1) {
-            int refIndex = header.getSequenceDictionary().getSequence(refName).getSequenceIndex();
-            span = index.getSpanOverlapping(refIndex, refStart, refStart + 1);
-        } else {
-            long chunkStart = index.getStartOfLastLinearBin();
-            long totalRecordRange = ((BAMFileSpan) reader.indexing().getFilePointerSpanningReads()).toCoordinateArray()[1];
-            span = new BAMFileSpan(new Chunk(chunkStart, totalRecordRange));
-        }
-
-        final SAMRecordIterator samRecordIterator = ((SamReader.Indexing) reader).iterator(span);
-
-        SAMRecord record = null;
-        while (samRecordIterator.hasNext()) {
-            SAMRecord currentRecord = samRecordIterator.next();
-            if (refStart != -1 && currentRecord.getAlignmentStart() + currentRecord.getReadLength() < refStart) {
-                continue;
-            }
-
-            if (currentRecord.getReadName().equals(readName)
-                    && currentRecord.getNotPrimaryAlignmentFlag() == isSecondaryAlignment
-                    && (!hasMate || currentRecord.getSecondOfPairFlag() == isSecondOfPair)) {
-                record = currentRecord;
-                break;
-            }
-        }
-
-        checkSAMRecord(record, flags, readName, bases, quals, refStart, cigar, refName, mapQ, hasMate, isSecondOfPair, isSecondaryAlignment);
-    }
-
-    private SAMRecord getRecordByIndex(String acc, int recordIndex, boolean detach) {
-        SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
-                SamInputResource.of(new SRAAccession(acc))
-        );
-
-        final SAMRecordIterator samRecordIterator = reader.iterator();
-
-        while (recordIndex != 0) {
-            Assert.assertTrue(samRecordIterator.hasNext(), "Record set is too small");
-
-            samRecordIterator.next();
-            recordIndex--;
-        }
-        Assert.assertTrue(samRecordIterator.hasNext(), "Record set is too small");
-
-        SAMRecord record = samRecordIterator.next();
-
-        if (detach) {
-            samRecordIterator.next();
-        }
-
-        return record;
-    }
-
-    private void checkSAMRecord(SAMRecord record, int flags, String readName, String bases, String quals,
-                                int refStart, String cigar, String refName, int mapQ, boolean hasMate,
-                                boolean isSecondOfPair, boolean isSecondaryAlignment) {
-
-        Assert.assertNotNull(record, "Record with read id: " + readName + " was not found by span created from index");
-
-        List<SAMValidationError> validationErrors = record.isValid();
-        Assert.assertNull(validationErrors, "SRA Lazy record is invalid. List of errors: " +
-                (validationErrors != null ? validationErrors.toString() : ""));
-
-        Assert.assertEquals(record.getReadName(), readName);
-        Assert.assertEquals(new String(record.getReadBases()), bases);
-        Assert.assertEquals(record.getBaseQualityString(), quals);
-        Assert.assertEquals(record.getReadPairedFlag(), hasMate);
-        Assert.assertEquals(record.getFlags(), flags);
-        Assert.assertEquals(record.getNotPrimaryAlignmentFlag(), isSecondaryAlignment);
-        if (hasMate) {
-            Assert.assertEquals(record.getSecondOfPairFlag(), isSecondOfPair);
-        }
-        if (refStart == -1) {
-            Assert.assertEquals(record.getReadUnmappedFlag(), true);
-            Assert.assertEquals(record.getAlignmentStart(), 0);
-            Assert.assertEquals(record.getCigarString(), "*");
-            Assert.assertEquals(record.getReferenceName(), "*");
-            Assert.assertEquals(record.getMappingQuality(), 0);
-        } else {
-            Assert.assertEquals(record.getReadUnmappedFlag(), false);
-            Assert.assertEquals(record.getAlignmentStart(), refStart);
-            Assert.assertEquals(record.getCigarString(), cigar);
-            Assert.assertEquals(record.getReferenceName(), refName);
-            Assert.assertEquals(record.getMappingQuality(), mapQ);
-        }
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/AbstractLocusInfoTest.java b/src/test/java/htsjdk/samtools/util/AbstractLocusInfoTest.java
deleted file mode 100644
index a21c743..0000000
--- a/src/test/java/htsjdk/samtools/util/AbstractLocusInfoTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-
-public class AbstractLocusInfoTest {
-    private final byte[] qualities = {30, 50, 50, 60, 60, 70, 70, 70, 80, 90, 30, 50, 50, 60, 60, 70, 70, 70, 80, 90};
-    private byte[] bases = {'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'T', 'C', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'T', 'C'};
-    private EdgingRecordAndOffset typedRecordAndOffset;
-    private EdgingRecordAndOffset typedRecordAndOffsetEnd;
-    private SAMSequenceRecord sequence = new SAMSequenceRecord("chrM", 100);
-
-    @BeforeTest
-    public void setUp() {
-        SAMRecord record = new SAMRecord(new SAMFileHeader());
-        record.setReadName("testRecord");
-        record.setReadBases(bases);
-        record.setBaseQualities(qualities);
-        typedRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 10, 10, 10);
-        typedRecordAndOffsetEnd = EdgingRecordAndOffset.createEndRecord(typedRecordAndOffset);
-    }
-
-    @Test
-    public void testConstructor() {
-        AbstractLocusInfo<EdgingRecordAndOffset> info = new AbstractLocusInfo<>(sequence, 1);
-        assertEquals("chrM", info.getSequenceName());
-        assertEquals(0, info.getRecordAndOffsets().size());
-        assertEquals(100, info.getSequenceLength());
-        assertEquals(1, info.getPosition());
-    }
-
-    @Test
-    public void testAdd() {
-        AbstractLocusInfo<EdgingRecordAndOffset> info = new AbstractLocusInfo<>(sequence, 10);
-        info.add(typedRecordAndOffset);
-        info.add(typedRecordAndOffsetEnd);
-        assertEquals(2, info.getRecordAndOffsets().size());
-        assertEquals(typedRecordAndOffset, info.getRecordAndOffsets().get(0));
-        assertEquals(typedRecordAndOffsetEnd, info.getRecordAndOffsets().get(1));
-        assertEquals(10, info.getPosition());
-        assertEquals('A', info.getRecordAndOffsets().get(0).getReadBase());
-        assertEquals('A', info.getRecordAndOffsets().get(1).getReadBase());
-        assertEquals(30, info.getRecordAndOffsets().get(0).getBaseQuality());
-        assertEquals(30, info.getRecordAndOffsets().get(1).getBaseQuality());
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/AbstractLocusIteratorTestTemplate.java b/src/test/java/htsjdk/samtools/util/AbstractLocusIteratorTestTemplate.java
deleted file mode 100644
index 0c08436..0000000
--- a/src/test/java/htsjdk/samtools/util/AbstractLocusIteratorTestTemplate.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-
-/**
- * Common template for testing classes, that extend AbstractLocusIterator.
- * 
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- * 
- */
-public abstract class AbstractLocusIteratorTestTemplate {
-
-    /** Coverage for tests with the same reads */
-    final static int coverage = 2;
-
-    /** the read length for the tests */
-    final static int readLength = 36;
-
-    final static SAMFileHeader header = new SAMFileHeader();
-
-    static {
-        header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-        SAMSequenceDictionary dict = new SAMSequenceDictionary();
-        dict.addSequence(new SAMSequenceRecord("chrM", 100000));
-        header.setSequenceDictionary(dict);
-    }
-
-    /** Get the record builder for the tests with the default parameters that are needed */
-    static SAMRecordSetBuilder getRecordBuilder() {
-        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-        builder.setHeader(header);
-        builder.setReadLength(readLength);
-        return builder;
-    }
-
-    public abstract void testBasicIterator();
-    public abstract void testEmitUncoveredLoci();
-    public abstract void testSimpleGappedAlignment();
-    public abstract void testOverlappingGappedAlignmentsWithoutIndels();
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/util/AbstractRecordAndOffsetTest.java b/src/test/java/htsjdk/samtools/util/AbstractRecordAndOffsetTest.java
deleted file mode 100644
index 568c84c..0000000
--- a/src/test/java/htsjdk/samtools/util/AbstractRecordAndOffsetTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-
-/**
- * 
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- *
- */
-
-public class AbstractRecordAndOffsetTest {
-
-    private final byte[] qualities = {30, 40, 50, 60, 70, 80 ,90, 70, 80, 90};
-    private byte[] bases = {'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'T', 'C'};
-    SAMRecord record;
-
-    @BeforeTest
-    public void setUp(){
-        record = new SAMRecord(new SAMFileHeader());
-        record.setReadName("testRecord");
-        record.setReadBases(bases);
-        record.setBaseQualities(qualities);
-    }
-
-    @Test
-    public void testConstructor(){
-        AbstractRecordAndOffset abstractRecordAndOffset = new AbstractRecordAndOffset(record, 0, 10, 3);
-        assertArrayEquals(qualities, abstractRecordAndOffset.getBaseQualities());
-        assertArrayEquals(bases, abstractRecordAndOffset.getRecord().getReadBases());
-        assertEquals('A', abstractRecordAndOffset.getReadBase());
-        assertEquals(30, abstractRecordAndOffset.getBaseQuality());
-        assertEquals(0, abstractRecordAndOffset.getOffset());
-        assertEquals(-1, abstractRecordAndOffset.getRefPos());
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/AsyncBufferedIteratorTest.java b/src/test/java/htsjdk/samtools/util/AsyncBufferedIteratorTest.java
deleted file mode 100644
index 817c60e..0000000
--- a/src/test/java/htsjdk/samtools/util/AsyncBufferedIteratorTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Daniel Cameron
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class AsyncBufferedIteratorTest {
-    private static class TestCloseableIterator implements CloseableIterator<Integer> {
-        private int[] results;
-        private volatile int offset = 0;
-        public volatile boolean isClosed = false;
-        public TestCloseableIterator(int[] results) {
-            this.results = results;
-        }
-        @Override
-        public void close() {
-            isClosed = true;
-        }
-        @Override
-        public boolean hasNext() {
-            return offset < results.length;
-        }
-        @Override
-        public Integer next() {
-            return results[offset++];
-        }
-        public int consumed() {
-            return offset;
-        }
-    }
-    @Test
-    public void testWrapUnderlying() {
-        AsyncBufferedIterator<Integer> abi = new AsyncBufferedIterator<Integer>(new TestCloseableIterator(new int[] { 0, 1, 2, 3}), 1, 1);
-        for (int i = 0; i < 4; i++) {
-            Assert.assertEquals(i, (int)abi.next());
-        }
-        abi.close();
-    }
-    @Test
-    public void testClose() {
-        TestCloseableIterator tci = new TestCloseableIterator(new int[] { 0, 1, 2, 3});
-        AsyncBufferedIterator<Integer> abi = new AsyncBufferedIterator<Integer>(tci, 1, 1);
-        abi.close();
-        Assert.assertTrue(tci.isClosed);
-    }
-    /**
-     * Background thread should block when buffers are full
-     */
-    @Test
-    public void testBackgroundBlocks() throws InterruptedException {
-        TestCloseableIterator it = new TestCloseableIterator(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
-        AsyncBufferedIterator<Integer> abi = new AsyncBufferedIterator<Integer>(it, 3, 2, "testBackgroundBlocks");
-        Assert.assertNotNull(getThreadWithName("testBackgroundBlocks"));
-        Thread.sleep(10); // how do we write this test and not be subject to race conditions?
-        // should have read 9 records: 2*3 in the buffers, and another 3 read but
-        // blocking waiting to be added 
-        Assert.assertEquals(it.consumed(), 9);
-        abi.close();
-    }
-    @Test
-    public void testBackgroundThreadCompletes() throws InterruptedException {
-        TestCloseableIterator it = new TestCloseableIterator(new int[] { 0, 1, 2, 3, 4, 5 });
-        AsyncBufferedIterator<Integer> abi = new AsyncBufferedIterator<Integer>(it, 3, 2, "testBackgroundThreadCompletes");
-        Assert.assertNotNull(getThreadWithName("testBackgroundThreadCompletes"));
-        // both buffers should be full
-        // clear out one buffer so the background thread can write the end of stream indicator
-        // and complete
-        abi.next();
-        
-        // how do we write this test and not be subject to a race condition
-        // since we're waiting for a background thread we have no access?
-        Thread t;
-        for (int i = 0; i < 64; i++) {
-            Thread.sleep(1);
-            t = getThreadWithName("testBackgroundThreadCompletes");
-            if (t == null || !t.isAlive()) break;
-        }
-        t = getThreadWithName("testBackgroundThreadCompletes");
-        Assert.assertTrue(t == null || !t.isAlive());
-        abi.close();
-    }
-    private static Thread getThreadWithName(String name) {
-        Thread[] allthreads = new Thread[Thread.activeCount() + 16];
-        int threadCount = Thread.enumerate(allthreads);
-        for (int i = 0; i < threadCount; i++) {
-            String threadName = allthreads[i].getName(); 
-            if (name.equals(threadName)) {
-                return allthreads[i];
-            }
-        }
-        return null;
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/AsyncWriterTest.java b/src/test/java/htsjdk/samtools/util/AsyncWriterTest.java
deleted file mode 100644
index c807cef..0000000
--- a/src/test/java/htsjdk/samtools/util/AsyncWriterTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Len Trigg
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class AsyncWriterTest {
-    private static class MyException extends RuntimeException {
-        final Integer item;
-        public MyException(Integer item) {
-            this.item = item;
-        }
-    }
-    private static class TestAsyncWriter extends AbstractAsyncWriter<Integer> {
-        protected TestAsyncWriter() {
-            super(1); // Queue size of 1 to give us more control over the order of events
-        }
-
-        @Override
-        protected String getThreadNamePrefix() {
-            return "TestAsyncWriter";
-        }
-
-        @Override
-        protected void synchronouslyWrite(Integer item) {
-            throw new MyException(item);
-        }
-
-        @Override
-        protected void synchronouslyClose() {
-            // Nothing
-        }
-    }
-    @Test
-    public void testNoSelfSuppression() {
-        try (TestAsyncWriter t = new TestAsyncWriter()) {
-            try {
-                t.write(1); // Will trigger exception in writing thread
-                t.write(2); // Will block if the above write has not been executed, but may not trigger checkAndRethrow()
-                t.write(3); // Will trigger checkAndRethrow() if not already done by the above write
-                Assert.fail("Expected exception");
-            } catch (MyException e) {
-                // Pre-bug fix, this was a "Self-suppression not permitted" exception from Java, rather than MyException
-                Assert.assertEquals(1, e.item.intValue());
-            }
-            // Verify that attempts to write after exception will fail
-            try {
-                t.write(4);
-                Assert.fail("Expected exception");
-            } catch (RuntimeIOException e) {
-                // Expected
-            }
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/BinaryCodecTest.java b/src/test/java/htsjdk/samtools/util/BinaryCodecTest.java
deleted file mode 100644
index 91e1147..0000000
--- a/src/test/java/htsjdk/samtools/util/BinaryCodecTest.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-
-/*
-  * The Broad Institute
-  * SOFTWARE COPYRIGHT NOTICE AGREEMENT
-  * This software and its documentation are copyright Jan 9, 2009 by the
-  * Broad Institute/Massachusetts Institute of Technology. All rights are reserved.
-  *
-  * This software is supplied without any warranty or guaranteed support whatsoever. Neither
-  * the Broad Institute nor MIT can be responsible for its use, misuse, or functionality.
-  */
-
-public class BinaryCodecTest {
-	public final static String TEST_BASENAME = "htsjdk-BinaryCodecTest";
-
-    @Test
-    public void testReadAndWrite() throws IOException {
-        final byte[] value = new byte[2];
-        value[0] = 1;
-        value[1] = 2;
-        //Writing to file
-        final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
-        outputFile.deleteOnExit();
-        final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
-        final BinaryCodec codec = new BinaryCodec(stream);
-        codec.writeBytes(value);
-        codec.close();
-
-        //Reading from file
-        final byte[] valuesTwo = new byte[2];
-        valuesTwo[0] = 1;
-        valuesTwo[1] = 2;
-
-        final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
-        final BinaryCodec readCodec = new BinaryCodec(instream);
-        final byte[] bytesFromBinaryFile = new byte[2];
-        readCodec.readBytes(bytesFromBinaryFile);
-        Assert.assertEquals(valuesTwo, bytesFromBinaryFile);
-        readCodec.close();
-        outputFile.delete();
-    }
-
-    @Test
-    public void testReadAndWriteString() throws IOException {
-        final String value = "Test String to Write";
-
-        //Writing to file
-        final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
-        outputFile.deleteOnExit();
-        final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
-        final BinaryCodec codec = new BinaryCodec(stream);
-        codec.writeString(value, true, false);
-        codec.close();
-
-        //Reading from file
-        final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
-        final BinaryCodec readCodec = new BinaryCodec(instream);
-        final int stringLength = readCodec.readInt();
-        Assert.assertEquals(value.length(), stringLength);
-        final String s = readCodec.readString(stringLength);
-        Assert.assertEquals(value, s);
-        readCodec.close();
-    }
-
-    @Test
-    public void testReadAndWriteInt() throws IOException {
-        final int value = 42;
-
-        //Writing to file
-        final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
-        outputFile.deleteOnExit();
-        final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
-        final BinaryCodec codec = new BinaryCodec(stream);
-        codec.writeInt(value);
-        codec.close();
-
-        //Reading from file
-        final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
-        final BinaryCodec readCodec = new BinaryCodec(instream);
-        Assert.assertEquals(value, readCodec.readInt());
-        readCodec.close();
-    }
-
-    @Test
-    public void testReadAndWriteDouble() throws IOException {
-        final double value = 54.4;
-
-        final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
-        outputFile.deleteOnExit();
-        final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
-        final BinaryCodec codec = new BinaryCodec(stream);
-        codec.writeDouble(value);
-        codec.close();
-
-        //Reading from file
-        final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
-        final BinaryCodec readCodec = new BinaryCodec(instream);
-        Assert.assertEquals(value, readCodec.readDouble());
-        readCodec.close();
-    }
-
-    @Test
-    public void testReadAndWriteLong() throws IOException {
-        final long value = 42;
-
-        final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
-        outputFile.deleteOnExit();
-        final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
-        final BinaryCodec codec = new BinaryCodec(stream);
-        codec.writeLong(value);
-        codec.close();
-
-        //Reading from file
-        final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
-        final BinaryCodec readCodec = new BinaryCodec(instream);
-        Assert.assertEquals(value, readCodec.readLong());
-        readCodec.close();
-
-    }
-
-    @Test
-    public void testReadAndWriteFloat()  throws IOException{
-        final float value = 42.5F;
-
-        final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
-        outputFile.deleteOnExit();
-        final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
-        final BinaryCodec codec = new BinaryCodec(stream);
-        codec.writeFloat(value);
-        codec.close();
-
-        //Reading from file
-        final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
-        final BinaryCodec readCodec = new BinaryCodec(instream);
-        Assert.assertEquals(value, readCodec.readFloat());
-        readCodec.close();
-    }
-
-    @Test
-    public void testReadAndWriteBoolean()  throws IOException{
-
-        boolean values[] = {true, false};
-
-        for (boolean value : values) {
-            final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
-            outputFile.deleteOnExit();
-            final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
-            final BinaryCodec codec = new BinaryCodec(stream);
-            codec.writeBoolean(value);
-            codec.close();
-
-            //Reading from file
-            final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
-            final BinaryCodec readCodec = new BinaryCodec(instream);
-            Assert.assertEquals(value, readCodec.readBoolean());
-            readCodec.close();
-        }
-    }
-
-    @Test
-    public void testReadAndWriteMutlitpleData()  throws IOException{
-        final float fValue = 42.5F;
-        final String sValue = "TestString";
-
-        final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
-        outputFile.deleteOnExit();
-        final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
-        final BinaryCodec codec = new BinaryCodec(stream);
-        codec.writeFloat(fValue);
-        codec.writeString(sValue, true, false);
-        codec.close();
-
-        //Reading from file
-        final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
-        final BinaryCodec readCodec = new BinaryCodec(instream);
-        Assert.assertEquals(fValue, readCodec.readFloat());
-        final int stringLength = readCodec.readInt();
-        Assert.assertEquals(sValue, readCodec.readString(stringLength));
-        readCodec.close();
-    }
-
-    @Test
-    public void readPastEndOfFile() throws IOException{
-        final long startTime = System.currentTimeMillis();
-        int i = 0;
-
-        final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
-        outputFile.deleteOnExit();
-        final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
-        final BinaryCodec codec = new BinaryCodec(stream);
-        while (i<100){
-            codec.writeInt(i);
-            i++;
-        }
-        codec.close();
-
-        final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
-        final BinaryCodec readCodec = new BinaryCodec(instream);
-
-        System.out.println((System.currentTimeMillis() - startTime) + "ms to write");
-        int z = 0;
-        boolean reachedStatement = false;
-        while (z<1000) {
-            try {
-                Assert.assertEquals(z, readCodec.readInt());
-            } catch (Exception e) {
-               Assert.assertEquals(RuntimeEOFException.class, e.getClass());
-                reachedStatement = true;
-            }
-            z++;
-        }
-
-        Assert.assertTrue(reachedStatement);
-        readCodec.close();
-    }
-
-    @Test
-    public void timeTest() throws IOException{
-        final long startTime = System.currentTimeMillis();
-        int i = 0;
-
-        final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
-        outputFile.deleteOnExit();
-        final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
-        final BinaryCodec codec = new BinaryCodec(stream);
-        while (i<100){
-            codec.writeInt(i);
-            i++;
-        }
-        codec.close();
-
-        final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
-        final BinaryCodec readCodec = new BinaryCodec(instream);
-
-        System.out.println((System.currentTimeMillis() - startTime) + "ms to write");
-        int z = 0;
-        boolean reachedStatement = false;
-        while (z<1000) {
-            try {
-                Assert.assertEquals(z, readCodec.readInt());
-            } catch (Exception e) {
-               Assert.assertEquals(RuntimeEOFException.class, e.getClass());
-                reachedStatement = true;
-            }
-            z++;
-        }
-
-        Assert.assertTrue(reachedStatement);
-        readCodec.close();
-    }
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/BlockCompressedFilePointerUtilTest.java b/src/test/java/htsjdk/samtools/util/BlockCompressedFilePointerUtilTest.java
deleted file mode 100644
index 850b4bf..0000000
--- a/src/test/java/htsjdk/samtools/util/BlockCompressedFilePointerUtilTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class BlockCompressedFilePointerUtilTest
-{
-    @Test
-    public void basicTest() 
-    {
-        List<Long> pointers = new ArrayList<Long>();
-        pointers.add(makeFilePointer(0, 0));
-        pointers.add(makeFilePointer(0, BlockCompressedFilePointerUtil.MAX_OFFSET));
-        final long BIG_BLOCK_ADDRESS = 1L << 46;
-        pointers.add(makeFilePointer(BIG_BLOCK_ADDRESS-1, 0));
-        pointers.add(makeFilePointer(BIG_BLOCK_ADDRESS-1, BlockCompressedFilePointerUtil.MAX_OFFSET));
-        pointers.add(makeFilePointer(BIG_BLOCK_ADDRESS, 0));
-        pointers.add(makeFilePointer(BIG_BLOCK_ADDRESS, BlockCompressedFilePointerUtil.MAX_OFFSET));
-        pointers.add(makeFilePointer(BlockCompressedFilePointerUtil.MAX_BLOCK_ADDRESS, 0));
-        pointers.add(makeFilePointer(BlockCompressedFilePointerUtil.MAX_BLOCK_ADDRESS, BlockCompressedFilePointerUtil.MAX_OFFSET));
-        for (int i = 0; i < pointers.size() - 1; ++i) {
-            for (int j = i+1; j < pointers.size(); ++j) {
-                Assert.assertTrue(BlockCompressedFilePointerUtil.compare(pointers.get(i), pointers.get(j)) < 0,
-                        BlockCompressedFilePointerUtil.asString(pointers.get(i)) + " should be < " +
-                                BlockCompressedFilePointerUtil.asString(pointers.get(j)));
-                Assert.assertTrue(BlockCompressedFilePointerUtil.compare(pointers.get(j), pointers.get(i)) > 0,
-                        BlockCompressedFilePointerUtil.asString(pointers.get(j)) + " should be > " +
-                                BlockCompressedFilePointerUtil.asString(pointers.get(i)));
-            }
-        }
-        
-    }
-
-    /**
-     * Create the virtual file pointer, and also assert that is can be converted back into the input parameters.
-     * @param blockAddress
-     * @param blockOffset
-     * @return block compressed file pointer
-     */
-    private long makeFilePointer(long blockAddress, int blockOffset)
-    {
-        final long ret = BlockCompressedFilePointerUtil.makeFilePointer(blockAddress, blockOffset);
-        Assert.assertEquals(BlockCompressedFilePointerUtil.getBlockAddress(ret), blockAddress);
-        Assert.assertEquals(BlockCompressedFilePointerUtil.getBlockOffset(ret), blockOffset);
-        Assert.assertEquals(BlockCompressedFilePointerUtil.compare(ret, ret), 0);
-        return ret;
-    }
-
-    @Test(dataProvider = "badInputs", expectedExceptions = IllegalArgumentException.class)
-    public void negativeTests(long blockAddress, int blockOffset) {
-        BlockCompressedFilePointerUtil.makeFilePointer(blockAddress, blockOffset);
-        Assert.assertFalse(true, "Should not get here.");
-    }
-
-    @DataProvider(name="badInputs")
-    public Object[][]  badInputs() {
-        return new Object[][]{
-                {-1L, 0},
-                {0L, -1},
-                {BlockCompressedFilePointerUtil.MAX_BLOCK_ADDRESS+1, 0},
-                {0L, BlockCompressedFilePointerUtil.MAX_OFFSET+1}
-        };
-    }
-}
-
-/******************************************************************/
-/**************************[END OF BlockCompressedFilePointerUtilTest.java]*************************/
-/******************************************************************/
diff --git a/src/test/java/htsjdk/samtools/util/BlockCompressedOutputStreamTest.java b/src/test/java/htsjdk/samtools/util/BlockCompressedOutputStreamTest.java
deleted file mode 100644
index 8a0d97f..0000000
--- a/src/test/java/htsjdk/samtools/util/BlockCompressedOutputStreamTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.FileTruncatedException;
-import htsjdk.samtools.util.zip.DeflaterFactory;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.zip.Deflater;
-
-public class BlockCompressedOutputStreamTest {
-
-    private static final String HTSJDK_TRIBBLE_RESOURCES = "src/test/resources/htsjdk/tribble/";
-
-    @Test
-    public void testBasic() throws Exception {
-        final File f = File.createTempFile("BCOST.", ".gz");
-        f.deleteOnExit();
-        final List<String> linesWritten = new ArrayList<>();
-        System.out.println("Creating file " + f);
-        final BlockCompressedOutputStream bcos = new BlockCompressedOutputStream(f);
-        String s = "Hi, Mom!\n";
-        bcos.write(s.getBytes());
-        linesWritten.add(s);
-        s = "Hi, Dad!\n";
-        bcos.write(s.getBytes());
-        linesWritten.add(s);
-        bcos.flush();
-        final StringBuilder sb = new StringBuilder(BlockCompressedStreamConstants.DEFAULT_UNCOMPRESSED_BLOCK_SIZE * 2);
-        s = "1234567890123456789012345678901234567890123456789012345678901234567890\n";
-        while (sb.length() <= BlockCompressedStreamConstants.DEFAULT_UNCOMPRESSED_BLOCK_SIZE) {
-            sb.append(s);
-            linesWritten.add(s);
-        }
-        bcos.write(sb.toString().getBytes());
-        bcos.close();
-        final BlockCompressedInputStream bcis = new BlockCompressedInputStream(f);
-        final BufferedReader reader = new BufferedReader(new InputStreamReader(bcis));
-        String line;
-        for(int i = 0; (line = reader.readLine()) != null; ++i) {
-            Assert.assertEquals(line + "\n", linesWritten.get(i));
-        }
-        bcis.close();
-        final BlockCompressedInputStream bcis2 = new BlockCompressedInputStream(f);
-        int available = bcis2.available();
-        Assert.assertFalse(bcis2.endOfBlock(), "Should not be at end of block");
-        Assert.assertTrue(available > 0);
-        byte[] buffer = new byte[available];
-        Assert.assertEquals(bcis2.read(buffer), available, "Should read to end of block");
-        Assert.assertTrue(bcis2.endOfBlock(), "Should be at end of block");
-        bcis2.close();
-    }
-
-    @DataProvider(name = "seekReadExceptionsData")
-    private Object[][] seekReadExceptionsData()
-    {
-        return new Object[][]{
-                {HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.truncated.gz", FileTruncatedException.class,
-                        BlockCompressedInputStream.PREMATURE_END_MSG + System.getProperty("user.dir") + "/" +
-                                HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.truncated.gz", true, false, 0},
-                {HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.truncated.hdr.gz", IOException.class,
-                        BlockCompressedInputStream.INCORRECT_HEADER_SIZE_MSG + System.getProperty("user.dir") + "/" +
-                                HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.truncated.hdr.gz", true, false, 0},
-                {HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.gz", IOException.class,
-                        BlockCompressedInputStream.CANNOT_SEEK_STREAM_MSG, false, true, 0},
-                {HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.gz", IOException.class,
-                        BlockCompressedInputStream.INVALID_FILE_PTR_MSG + 1000 + " for " + System.getProperty("user.dir") + "/" +
-                                HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.gz", true, true, 1000 }
-        };
-    }
-
-    @Test(dataProvider = "seekReadExceptionsData")
-    public void testSeekReadExceptions(final String filePath, final Class c, final String msg, final boolean isFile, final boolean isSeek, final int pos) throws Exception {
-
-        final BlockCompressedInputStream bcis = isFile ?
-                new BlockCompressedInputStream(new File(filePath)) :
-                new BlockCompressedInputStream(new FileInputStream(filePath));
-        boolean haveException = false;
-        try {
-            if ( isSeek ) {
-                bcis.seek(pos);
-            } else {
-                final BufferedReader reader = new BufferedReader(new InputStreamReader(bcis));
-                reader.readLine();
-            }
-        } catch (final Exception e) {
-            if ( e.getClass().equals(c) ) {
-                haveException = true;
-                Assert.assertEquals(e.getMessage(), msg);
-            }
-        }
-
-        if ( !haveException ) {
-            Assert.fail("Expected " + c.getSimpleName());
-        }
-    }
-
-    @Test public void testOverflow() throws Exception {
-        final File f = File.createTempFile("BCOST.", ".gz");
-        f.deleteOnExit();
-        final List<String> linesWritten = new ArrayList<>();
-        System.out.println("Creating file " + f);
-        final BlockCompressedOutputStream bcos = new BlockCompressedOutputStream(f);
-        Random r = new Random(15555);
-        final int INPUT_SIZE = 64 * 1024;
-        byte[] input = new byte[INPUT_SIZE];
-        r.nextBytes(input);
-        bcos.write(input);
-        bcos.close();
-
-        final BlockCompressedInputStream bcis = new BlockCompressedInputStream(f);
-        byte[] output = new byte[INPUT_SIZE];
-        int len;
-        int i = 0;
-        while ((len = bcis.read(output, 0, output.length)) != -1) {
-            for (int j = 0; j < len; j++) {
-               Assert.assertEquals(output[j], input[i++]);
-            }
-        }
-        Assert.assertEquals(i, INPUT_SIZE);
-        bcis.close();
-    }
-
-    // PIC-393 exception closing BGZF stream opened to /dev/null
-    // I don't think this will work on Windows, because /dev/null doesn't work
-    @Test(groups = "broken")
-    public void testDevNull() throws Exception {
-        final BlockCompressedOutputStream bcos = new BlockCompressedOutputStream("/dev/null");
-        bcos.write("Hi, Mom!".getBytes());
-        bcos.close();
-    }
-
-    @Test
-    public void testCustomDeflater() throws Exception {
-        final File f = File.createTempFile("testCustomDeflater.", ".gz");
-        f.deleteOnExit();
-        System.out.println("Creating file " + f);
-
-        final int[] deflateCalls = {0}; //Note: using and array is a HACK to fool the compiler
-
-        class MyDeflater extends Deflater{
-            MyDeflater(int level, boolean nowrap){
-                super(level, nowrap);
-            }
-            @Override
-            public int deflate(byte[] b, int off, int len) {
-                deflateCalls[0]++;
-                return super.deflate(b, off, len);
-            }
-
-        }
-        final DeflaterFactory myDeflaterFactory= new DeflaterFactory(){
-            public Deflater makeDeflater(final int compressionLevel, final boolean nowrap) {
-                return new MyDeflater(compressionLevel, nowrap);
-            }
-        };
-        final List<String> linesWritten = new ArrayList<>();
-        final BlockCompressedOutputStream bcos = new BlockCompressedOutputStream(f, 5, myDeflaterFactory);
-        String s = "Hi, Mom!\n";
-        bcos.write(s.getBytes()); //Call 1
-        linesWritten.add(s);
-        s = "Hi, Dad!\n";
-        bcos.write(s.getBytes()); //Call 2
-        linesWritten.add(s);
-        bcos.flush();
-        final StringBuilder sb = new StringBuilder(BlockCompressedStreamConstants.DEFAULT_UNCOMPRESSED_BLOCK_SIZE * 2);
-        s = "1234567890123456789012345678901234567890123456789012345678901234567890\n";
-        while (sb.length() <= BlockCompressedStreamConstants.DEFAULT_UNCOMPRESSED_BLOCK_SIZE) {
-            sb.append(s);
-            linesWritten.add(s);
-        }
-        bcos.write(sb.toString().getBytes()); //Call 3
-        bcos.close();
-        final BlockCompressedInputStream bcis = new BlockCompressedInputStream(f);
-        final BufferedReader reader = new BufferedReader(new InputStreamReader(bcis));
-        String line;
-        for(int i = 0; (line = reader.readLine()) != null; ++i) {
-            Assert.assertEquals(line + "\n", linesWritten.get(i));
-        }
-        bcis.close();
-        Assert.assertEquals(deflateCalls[0], 3, "deflate calls");
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/BlockCompressedTerminatorTest.java b/src/test/java/htsjdk/samtools/util/BlockCompressedTerminatorTest.java
deleted file mode 100644
index 5b58372..0000000
--- a/src/test/java/htsjdk/samtools/util/BlockCompressedTerminatorTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class BlockCompressedTerminatorTest {
-    private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/util");
-
-    @Test
-    public void testFileWithTerminator() throws Exception {
-        final File tmpCompressedFile = File.createTempFile("test.", ".bgzf");
-        tmpCompressedFile.deleteOnExit();
-        final BlockCompressedOutputStream os = new BlockCompressedOutputStream(tmpCompressedFile);
-        os.write("Hi, Mom!\n".getBytes());
-        os.close();
-        Assert.assertEquals(BlockCompressedInputStream.checkTermination(tmpCompressedFile),
-                BlockCompressedInputStream.FileTermination.HAS_TERMINATOR_BLOCK);
-    }
-
-    @Test
-    public void testValidFileWithoutTerminator() throws Exception {
-        Assert.assertEquals(BlockCompressedInputStream.checkTermination(new File(TEST_DATA_DIR, "no_bgzf_terminator.bam")),
-                BlockCompressedInputStream.FileTermination.HAS_HEALTHY_LAST_BLOCK);
-    }
-
-    @Test
-    public void testDefectiveFile() throws Exception {
-        Assert.assertEquals(BlockCompressedInputStream.checkTermination(new File(TEST_DATA_DIR, "defective_bgzf.bam")),
-                BlockCompressedInputStream.FileTermination.DEFECTIVE);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/CigarUtilTest.java b/src/test/java/htsjdk/samtools/util/CigarUtilTest.java
deleted file mode 100644
index 0aca395..0000000
--- a/src/test/java/htsjdk/samtools/util/CigarUtilTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.TextCigarCodec;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Basic positive tests for testing cigar string clipping
- *
- * @author Martha Borkan  mborkan at broadinstitute.org
- */
-public class CigarUtilTest {
-
-   @Test(dataProvider="clipData")
-    public void basicTest(final String testName, final int start, final String inputCigar, final boolean negativeStrand,
-                          final int clipPosition,
-                          final String expectedCigar, final int expectedAdjustedStart) throws IOException {
-      List<CigarElement> cigar =  TextCigarCodec.decode(inputCigar).getCigarElements();
-      if (negativeStrand){
-          List<CigarElement> copiedList = new ArrayList<CigarElement>(cigar);
-          Collections.reverse(copiedList);
-          cigar = copiedList;
-      }
-      List<CigarElement> result = CigarUtil.softClipEndOfRead(clipPosition, cigar);
-       Cigar newCigar = new Cigar(result);
-       Cigar oldCigar = new Cigar(cigar);
-       if (negativeStrand){
-           Collections.reverse(result);
-           newCigar = new Cigar(result);
-           int oldLength = oldCigar.getReferenceLength();
-           int newLength = newCigar.getReferenceLength();
-           int sizeChange = oldLength - newLength;
-           //Assert.assertEquals(sizeChange, numClippedBases + adjustment, testName + " sizeChange == numClippedBases");
-           Assert.assertEquals(start + sizeChange, expectedAdjustedStart, sizeChange + " " +  testName);
-           Assert.assertTrue(sizeChange >= 0, "sizeChange >= 0. " + sizeChange);
-      }
-       Assert.assertEquals (TextCigarCodec.encode(newCigar), expectedCigar, testName);
-       Assert.assertEquals(newCigar.getReadLength(), oldCigar.getReadLength());
-       Assert.assertNull(newCigar.isValid(testName, -1));
-    }
-
-    @DataProvider(name = "clipData")
-    private Object[][] getCigarClippingTestData() {
-        // numClippedBases = (readLength - clipPosition) +1
-        return new Object[][]{
-            {"Test 1:simple + strand", 100, "50M", false, 43, "42M8S", 100},
-            {"Test 1s:+ strand already clipped", 100, "42M8S", false, 43, "42M8S", 100},
-            {"Test 2:simple - strand", 100, "50M", true, 41, "10S40M", 110},
-            {"Test 3:boundary + strand", 100, "42M3D8M", false, 43, "42M8S", 100},
-            {"Test 3s:boundary + strand", 100, "42M3D8S", false, 43, "42M8S", 100},
-            {"Test 3x:stutter + strand", 100, "42M2D1D8M", false, 43, "42M8S", 100},
-            {"Test 3y:stutter + strand", 100, "42M1D2D8M", false, 43, "42M8S", 100},
-            {"Test 3a:boundary + strand", 100, "42M1D8M", false, 43, "42M8S", 100},
-            {"Test 4:boundary - strand", 98, "10M2D40M", true, 41, "10S40M", 110},
-            {"Test 5:deletion + strand", 100, "44M1D6M", false, 43, "42M8S", 110},
-            {"Test 6:deletion - strand", 98, "6M2D44M", true, 41, "10S40M", 110},
-
-            {"Test 7:insertion + strand", 100, "42M3I5M", false, 43, "42M8S", 100},
-            {"Test 8:insertion - strand", 102, "8M2I40M", true, 41, "10S40M", 110},
-            {"Test 9:insertion within + strand", 100, "44M2I4M", false, 43, "42M8S", 100},
-            {"Test 9x:insertion stutter within + strand", 100, "44M2I2I2M", false, 43, "42M8S", 100},
-            {"Test 10:insertion within - strand", 100, "3M3I44M", true, 41, "10S40M", 107},
-            {"Test 11:insertion straddling + strand", 100, "40M4I6M", false, 43, "40M10S", 100},
-            {"Test 11s:insertion straddling + strand", 100, "40M4I6S", false, 43, "40M10S", 100},
-            {"Test 11a:insertion straddling + strand", 100, "40M2I8M", false, 43, "40M10S", 100},
-            {"Test 12:insertion straddling - strand", 104, "4M4I42M", true, 41, "10S40M", 110},
-            {"Test 12a:insertion straddling - strand", 102, "8M2I40M", true, 41, "10S40M", 110},
-
-            {"Test 13:deletion before clip + strand", 100, "10M5D35M", false, 38, "10M5D27M8S", 100},
-            {"Test 14:deletion before clip - strand", 100, "35M5D10M", true, 36, "10S25M5D10M", 110},
-            {"Test 15:insertion before clip + strand", 100, "10M5I35M", false, 43, "10M5I27M8S", 100},
-            {"Test 16:insertion before clip - strand", 100, "16M5I29M", true, 41, "10S6M5I29M", 110},
-
-            {"Test 17:second, earlier clip", 100, "48M2S", false, 43, "42M8S", 100},
-            {"Test 17s:second, earlier clip", 100, "2S48M", true, 43, "8S42M", 106},
-            {"Test 18:second, later clip", 100, "42M8S", false, 48, "42M8S", 100},
-            {"Test 18s:second, later clip", 100, "8S42M", true, 48, "8S42M", 100},
-        };
-    }
-
-    @Test(dataProvider="addData")
-     public void addingSoftClippedBasesTest(final String testName, final String cigar, final boolean negativeStrand,
-                           final int threePrimeEnd, final int fivePrimeEnd, final String expectedCigar) throws IOException {
-
-        Assert.assertEquals(CigarUtil.addSoftClippedBasesToEndsOfCigar(TextCigarCodec.decode(cigar), negativeStrand,
-                threePrimeEnd, fivePrimeEnd).toString(), expectedCigar, testName);
-     }
-
-     @DataProvider(name = "addData")
-     private Object[][] getCigarAddingTestData() {
-         // numClippedBases = (readLength - clipPosition) +1
-         return new Object[][]{
-                 {"Add to 5' end only, +", "36M", false, 0, 5, "5S36M"},
-                 {"Add to 5' end only, -", "30M1I5M", true, 0, 5, "30M1I5M5S"},
-                 {"Add to 3' end only, +", "26M", false, 3, 0, "26M3S"},
-                 {"Add to 3' end only, -", "19M3D7M", true, 3, 0, "3S19M3D7M"},
-                 {"Add to 5' end already soft-clipped, +", "6S20M", false, 0, 5, "11S20M"},
-                 {"Add to 5' end already soft-clipped, -", "28M4S", true, 0, 5, "28M9S"},
-                 {"Add to 3' end already soft-clipped, +", "15M5I10M2S", false, 7, 0, "15M5I10M9S"},
-                 {"Add to 3' end already soft-clipped, -", "2S34M", true, 6, 0, "8S34M"},
-                 {"Add to 5' and 3' ends, no merging, +", "36M", false, 15, 30, "30S36M15S"},
-                 {"Add to 5' and 3' ends, no merging, -", "36M", true, 15, 30, "15S36M30S"},
-                 {"Add to 5' and 3' ends, merging 5' end, +", "5S31M", false, 15, 30, "35S31M15S"},
-                 {"Add to 5' and 3' ends, merging 5' end, -", "31M5S", true, 15, 30, "15S31M35S"},
-                 {"Add to 5' and 3' ends, merging 3' end, +", "20M6S", false, 10, 12, "12S20M16S"},
-                 {"Add to 5' and 3' ends, merging 3' end, -", "6S25M", true, 10, 12, "16S25M12S"},
-                 {"Add to 5' and 3' ends, merging both ends, +", "3S31M2S", false, 10, 15, "18S31M12S"},
-                 {"Add to 5' and 3' ends, merging both ends, -", "2S26M8S", true, 10, 12, "12S26M20S"}
-         };
-     }
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/CloseableIteratorTest.java b/src/test/java/htsjdk/samtools/util/CloseableIteratorTest.java
deleted file mode 100644
index b96d1f6..0000000
--- a/src/test/java/htsjdk/samtools/util/CloseableIteratorTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class CloseableIteratorTest {
-    @Test
-    public void testToList() {
-        final List<Integer> expected = Arrays.asList(1,2,3,4,5);
-        final PeekableIterator<Integer> peeky = new PeekableIterator<>(expected.iterator());
-        final List<Integer> actual = peeky.toList();
-
-        Assert.assertEquals(actual, expected);
-        Assert.assertEquals(peeky.toList(), new ArrayList<>()); // Should be empty the second time
-    }
-
-    @Test
-    public void testToStream() {
-        final List<Integer> inputs = Arrays.asList(1,2,3,4,5);
-        final PeekableIterator<Integer> peeky = new PeekableIterator<>(inputs.iterator());
-        final List<Integer> expected = inputs.stream().map(i -> i*2).collect(Collectors.toList());
-        final List<Integer> actual   = peeky.stream().map(i -> i*2).collect(Collectors.toList());
-
-        Assert.assertEquals(actual, expected);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/CodeUtilTest.java b/src/test/java/htsjdk/samtools/util/CodeUtilTest.java
deleted file mode 100644
index e8b9957..0000000
--- a/src/test/java/htsjdk/samtools/util/CodeUtilTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class CodeUtilTest {
-
-    @Test
-    public void getOrElseTest() {
-        final String notNull = "Not null!";
-        Assert.assertEquals(CodeUtil.getOrElse(notNull, null), notNull);
-        Assert.assertEquals(CodeUtil.getOrElse(null, notNull), notNull);
-        Assert.assertEquals((Object) CodeUtil.getOrElse(null, null), (Object) null);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/ComparableTupleTest.java b/src/test/java/htsjdk/samtools/util/ComparableTupleTest.java
deleted file mode 100644
index 7e8b082..0000000
--- a/src/test/java/htsjdk/samtools/util/ComparableTupleTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.variant.variantcontext.Allele;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Created by farjoun on 1/28/16.
- */
-public class ComparableTupleTest {
-
-    private enum Tenum {
-        Hi,
-        Bye,
-        Ciao
-    }
-
-    private Allele A = Allele.create("A", false);
-    private Allele Aref = Allele.create("A", true);
-    private Allele G = Allele.create("G", false);
-
-    @DataProvider(name = "testComparableTupleData")
-    public Object[][] testComparableTupleData() {
-        return new Object[][]{
-                new Object[]{new ComparableTuple<>(1, 2), new ComparableTuple<>(1, 1), 2 - 1},
-                new Object[]{new ComparableTuple<>(1, 2), new ComparableTuple<>(2, 2), 1 - 2},
-                new Object[]{new ComparableTuple<>(1, 2), new ComparableTuple<>(1, 2), 0},
-
-                new Object[]{new ComparableTuple<>(1, "hi"), new ComparableTuple<>(1, "bye"), "hi".compareTo("bye")},
-                new Object[]{new ComparableTuple<>(1, "hi"), new ComparableTuple<>(2, "bye"), 1 - 2},
-                new Object[]{new ComparableTuple<>(1, "hi"), new ComparableTuple<>(1, "hi"), 0},
-
-                new Object[]{new ComparableTuple<>(A, Tenum.Hi), new ComparableTuple<>(Aref, Tenum.Bye), A.compareTo(Aref)},
-                new Object[]{new ComparableTuple<>(Aref, Tenum.Hi), new ComparableTuple<>(Aref, Tenum.Bye), Tenum.Hi.compareTo(Tenum.Bye)},
-                new Object[]{new ComparableTuple<>(Aref, Tenum.Hi), new ComparableTuple<>(Aref, Tenum.Hi), 0},
-                new Object[]{new ComparableTuple<>(Aref, Tenum.Hi), new ComparableTuple<>(G, Tenum.Ciao), Aref.compareTo(G)},
-                new Object[]{new ComparableTuple<>(A, Tenum.Ciao), new ComparableTuple<>(G, Tenum.Hi), A.compareTo(G)}
-        };
-    }
-
-    @Test(dataProvider = "testComparableTupleData")
-    public <T extends Comparable<T>, R extends Comparable<R>> void testComparableTuple(final ComparableTuple<T,R> lhs, final ComparableTuple<T,R> rhs, final int result) {
-        Assert.assertEquals(lhs.compareTo(rhs), result);
-    }
-
-
-    @DataProvider(name = "testComparableTupleNullData")
-    public Object[][] testComparableTupleNullData() {
-        return new Object[][]{
-                new Object[]{null, 2},
-                new Object[]{null, null},
-                new Object[]{"string", null}
-        };
-    }
-
-    @Test(dataProvider = "testComparableTupleNullData", expectedExceptions = IllegalArgumentException.class)
-    public void testComparableTupleNullData(String left, Integer right) {
-        new ComparableTuple<>(left, right);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/CoordSpanInputSteamTest.java b/src/test/java/htsjdk/samtools/util/CoordSpanInputSteamTest.java
deleted file mode 100644
index 1b90882..0000000
--- a/src/test/java/htsjdk/samtools/util/CoordSpanInputSteamTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.seekablestream.ByteArraySeekableStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.EOFException;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Random;
-
-/**
- * Created by vadim on 25/03/2015.
- */
-public class CoordSpanInputSteamTest {
-
-    @Test
-    public void test_first_3_bytes() throws IOException {
-        byte[] data = new byte[1024 * 1024];
-        new Random().nextBytes(data);
-
-        long[] coords = new long[]{0, 1, 1, 2, 2, 3};
-
-        CoordSpanInputSteam csis = new CoordSpanInputSteam(new ByteArraySeekableStream(data), coords);
-
-        Assert.assertEquals(csis.read(), 0xFF & data[0]);
-        Assert.assertEquals(csis.read(), 0xFF & data[1]);
-        Assert.assertEquals(csis.read(), 0xFF & data[2]);
-
-        Assert.assertEquals(csis.read(), -1);
-    }
-
-    @Test
-    public void test_3_ranges_byte_single_read() throws IOException {
-        byte[] data = new byte[1024 * 1024];
-        new Random().nextBytes(data);
-
-        long[] coords = new long[]{0, 100, 10, 20, 100, 200, data.length - 1, Long.MAX_VALUE};
-
-        CoordSpanInputSteam csis = new CoordSpanInputSteam(new ByteArraySeekableStream(data), coords);
-
-        for (int i = 0; i < coords.length; i += 2) {
-            for (int c = (int) coords[i]; c < coords[i + 1]; c++) {
-                int read = csis.read();
-                if (c >= data.length) {
-                    Assert.assertEquals(read, -1);
-                    break;
-                } else
-                    Assert.assertEquals(read, 0xFF & data[c], String.format("At %d: read=%d, data=%d\n", c, read, data[c]));
-            }
-        }
-    }
-
-    @Test
-    public void test_range_read() throws IOException {
-        byte[] data = new byte[1024 * 1024];
-        new Random().nextBytes(data);
-
-        long[] coords = new long[]{0, 100, 10, 20, 100, 200, data.length - 1, Long.MAX_VALUE};
-
-        CoordSpanInputSteam csis = new CoordSpanInputSteam(new ByteArraySeekableStream(data), coords);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-        for (int i = 0; i < coords.length; i += 2) {
-            for (int c = (int) coords[i]; c < coords[i + 1]; c++) {
-                int read = csis.read();
-                if (read == -1) break;
-                baos.write(data[c]);
-            }
-        }
-        byte[] contiguous = baos.toByteArray();
-        ByteArrayInputStream bais = new ByteArrayInputStream(contiguous);
-        csis = new CoordSpanInputSteam(new ByteArraySeekableStream(data), coords);
-
-        byte[] buf1 = new byte[100];
-        byte[] buf2 = new byte[100];
-        DataInputStream dis1 = new DataInputStream(csis);
-        DataInputStream dis2 = new DataInputStream(bais);
-
-        Arrays.fill(buf1, (byte) 0);
-        Arrays.fill(buf2, (byte) 0);
-        dis1.readFully(buf1, 0, 10);
-        dis2.readFully(buf2, 0, 10);
-        Assert.assertEquals(buf1, buf2);
-
-        int len = 11;
-        while (true) {
-            try {
-                dis1.readFully(buf1, 0, len);
-            } catch (EOFException e) {
-                break;
-            }
-            dis2.readFully(buf2, 0, len);
-            Assert.assertEquals(buf1, buf2);
-        }
-        try {
-            dis2.readFully(buf2, 0, len);
-        } catch (EOFException e) {
-
-        }
-        Assert.assertEquals(dis1.read(), -1);
-        Assert.assertEquals(dis2.read(), -1);
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/DiskBackedQueueTest.java b/src/test/java/htsjdk/samtools/util/DiskBackedQueueTest.java
deleted file mode 100644
index 88b05e2..0000000
--- a/src/test/java/htsjdk/samtools/util/DiskBackedQueueTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.AfterTest;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Collections;
-
-public class DiskBackedQueueTest extends SortingCollectionTest {
-    @DataProvider(name = "diskBackedQueueProvider")
-    public Object[][] createDBQTestData() {
-        return new Object[][] {
-                {"empty", 0, 100},
-                {"singleton", 1, 100},
-                {"no ram records", 10, 0},
-                {"less than threshold", 100, 200},
-                {"threshold minus 1", 99, 100},
-                {"greater than threshold", 550, 100},
-                {"threshold multiple", 600, 100},
-                {"threshold multiple plus one", 101, 100},
-                {"exactly threshold", 100, 100},
-        };
-    }
-
-    @BeforeMethod void setup() { resetTmpDir(); }
-    @AfterMethod void tearDown() { resetTmpDir(); }
-
-    /**
-     * Generate some strings, put into SortingCollection, confirm that the right number of
-     * Strings come out, and in the right order.
-     * @param numStringsToGenerate
-     * @param maxRecordsInRam
-     */
-    @Test(dataProvider = "diskBackedQueueProvider")
-    public void testPositive(final String testName, final int numStringsToGenerate, final int maxRecordsInRam) {
-        final String[] strings = new String[numStringsToGenerate];
-        int numStringsGenerated = 0;
-        final DiskBackedQueue<String> diskBackedQueue = makeDiskBackedQueue(maxRecordsInRam);
-        for (final String s : new RandomStringGenerator(numStringsToGenerate)) {
-            diskBackedQueue.add(s);
-            strings[numStringsGenerated++] = s;
-        }
-        Assert.assertEquals(tmpDirIsEmpty(), numStringsToGenerate <= maxRecordsInRam);
-        assertQueueEqualsList(strings, diskBackedQueue);
-        Assert.assertEquals(diskBackedQueue.canAdd(), numStringsToGenerate <= maxRecordsInRam);
-        Assert.assertEquals(diskBackedQueue.size(), 0);
-        Assert.assertTrue(diskBackedQueue.isEmpty());
-        Assert.assertEquals(diskBackedQueue.poll(), null);
-        diskBackedQueue.clear();
-        Assert.assertTrue(diskBackedQueue.canAdd());
-    }
-
-    private void assertQueueEqualsList(final String[] strings, final DiskBackedQueue<String> diskBackedQueue) {
-        int i = 0;
-        while (!diskBackedQueue.isEmpty()) {
-            final String s = diskBackedQueue.poll();
-            Assert.assertEquals(s, strings[i]);
-            i++;
-        }
-        Assert.assertEquals(i, strings.length);
-    }
-
-    private DiskBackedQueue<String> makeDiskBackedQueue(final int maxRecordsInRam) {
-        return DiskBackedQueue.newInstance(new StringCodec(), maxRecordsInRam, Collections.singletonList(tmpDir()));
-    }
-
-    @Test
-    public void testReadOnlyQueueJustBeforeReadingFromDisk() {
-        final DiskBackedQueue<String> queue = makeDiskBackedQueue(2);
-        queue.add("foo");
-        queue.add("bar");
-        queue.add("baz");
-        Assert.assertEquals("foo", queue.poll());
-        Assert.assertEquals("bar", queue.poll());
-
-        // Spilled-to-disk records have not been read yet, but one has been loaded into headRecord, so the queue is
-        // closed for enqueue-ing.
-        Assert.assertFalse(queue.canAdd());
-        Assert.assertEquals("baz", queue.poll());
-
-        Assert.assertEquals(queue.size(), 0);
-        Assert.assertTrue(queue.isEmpty());
-        Assert.assertEquals(queue.poll(), null);
-        queue.clear();
-        Assert.assertTrue(queue.canAdd());
-    }
-
-    /** See: https://github.com/broadinstitute/picard/issues/327 */
-    @Test(expectedExceptions = IllegalStateException.class)
-    public void testPathologyIssue327() {
-
-        final DiskBackedQueue<String> queue = makeDiskBackedQueue(2);
-
-        // testing a particular order of adding to the queue, setting the result state, and emitting.
-        queue.add("0");
-        queue.add("1");
-        queue.add("2"); // spills to disk
-        Assert.assertEquals(queue.poll(), "0"); // gets from ram, so now there is space in ram, but a record on disk
-        queue.add("3"); // adds, but we assumed we added all records before removing them
-        Assert.assertEquals(queue.poll(), "1");
-        Assert.assertEquals(queue.poll(), "2");
-        Assert.assertEquals(queue.poll(), "3");
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/EdgeReadIteratorTest.java b/src/test/java/htsjdk/samtools/util/EdgeReadIteratorTest.java
deleted file mode 100644
index a5459c6..0000000
--- a/src/test/java/htsjdk/samtools/util/EdgeReadIteratorTest.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecordSetBuilder;
-import htsjdk.samtools.SamReader;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.InputStreamReader;
-import java.util.Arrays;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Tests check that for each alignment block of processed reads, iterator returns a <code>EdgingRecordAndOffset</code>
- * with type <code>BEGIN</code> for the reference position of read start and a <code>EdgingRecordAndOffset</code> with
- * type <code>END</code> for the reference position + 1 of read end.
- */
-public class EdgeReadIteratorTest extends AbstractLocusIteratorTestTemplate {
-
-    @Override
-    @Test
-    public void testBasicIterator() {
-        final EdgeReadIterator sli = new EdgeReadIterator(createSamFileReader());
-        int pos = 1;
-        for (final AbstractLocusInfo<EdgingRecordAndOffset> li : sli) {
-            if (pos == 1 || pos == 37) {
-                assertEquals(pos++, li.getPosition());
-                assertEquals(2, li.getRecordAndOffsets().size());
-            } else {
-                assertEquals(pos++, li.getPosition());
-                assertEquals(0, li.getRecordAndOffsets().size());
-            }
-        }
-
-    }
-
-    /**
-     * Since EdgeReadIterator does not support emitting uncovered loci, this test just check that
-     * iterator return correctly aligned objects for start and end of a read.
-     */
-    @Override
-    @Test
-    public void testEmitUncoveredLoci() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "36M", null, 10);
-        }
-        final int coveredEnd = CoordMath.getEnd(startPosition, readLength) +1;
-        final EdgeReadIterator sli = new EdgeReadIterator(builder.getSamReader());
-
-        int pos = 1;
-        final int coveredStart = 165;
-        for (final AbstractLocusInfo li : sli) {
-            Assert.assertEquals(li.getPosition(), pos++);
-            final int expectedReads;
-            if (li.getPosition() == coveredStart || li.getPosition() == coveredEnd) {
-                expectedReads = 2;
-            } else {
-                expectedReads = 0;
-            }
-            Assert.assertEquals(li.getRecordAndOffsets().size(), expectedReads);
-        }
-        Assert.assertEquals(pos, 100001);
-    }
-
-    /**
-     * Try all CIGAR operands (except H and P) and confirm that loci produced by SamLocusIterator are as expected.
-     */
-    @Override
-    @Test
-    public void testSimpleGappedAlignment() {final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "3S3M3N3M3D3M3I1N18M3S", null, 10);
-        }
-        final EdgeReadIterator sli = new EdgeReadIterator(builder.getSamReader());
-        while (sli.hasNext()) {
-            AbstractLocusInfo<EdgingRecordAndOffset> info = sli.next();
-            int pos = info.getPosition();
-            if (pos == startPosition || pos == startPosition + 6 || pos == startPosition + 12 || pos == startPosition + 16) {
-                assertEquals(EdgingRecordAndOffset.Type.BEGIN, info.getRecordAndOffsets().get(0).getType());
-                assertEquals(EdgingRecordAndOffset.Type.BEGIN, info.getRecordAndOffsets().get(1).getType());
-            } else if (pos == startPosition + 3 || pos == startPosition + 9 || pos == startPosition + 15 || pos == startPosition + 34) {
-                assertEquals(EdgingRecordAndOffset.Type.END, info.getRecordAndOffsets().get(0).getType());
-                assertEquals(EdgingRecordAndOffset.Type.END, info.getRecordAndOffsets().get(1).getType());
-            }
-        }
-    }
-
-    /**
-     * Test two reads that overlap because one has a deletion in the middle of it.
-     */
-    @Override
-    @Test
-    public void testOverlappingGappedAlignmentsWithoutIndels() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 1;
-        // Were it not for the gap, these two reads would not overlap
-
-        builder.addFrag("record1", 0, startPosition, true, false, "18M10D18M", null, 10);
-        builder.addFrag("record2", 0, 41, true, false, "36M", null, 10);
-
-        final EdgeReadIterator sli = new EdgeReadIterator(builder.getSamReader());
-        // 5 base overlap btw the two reads
-        final int numBasesCovered = 81;
-        final int[] expectedReferencePositions = new int[numBasesCovered];
-        final int[] expectedDepths = new int[numBasesCovered];
-        final int[][] expectedReadOffsets = new int[numBasesCovered][];
-        List<Integer> start = Arrays.asList(0, 28, 40);
-        List<Integer> end = Arrays.asList(19, 47, 77);
-
-        int i;
-        // First 18 bases are from the first read
-        expectedDepths[0] = 1;
-        expectedReferencePositions[0] = 1;
-        expectedReadOffsets[0] = new int[]{0};
-
-        for (i = 1; i < 18; ++i) {
-            fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
-        }
-        expectedDepths[i] = 1;
-        expectedReferencePositions[i] = 19;
-        expectedReadOffsets[i++] = new int[]{0};
-
-        for (; i < 28; ++i) {
-            fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
-        }
-
-        // Gap of 10, then 13 bases from the first read
-        expectedDepths[i] = 1;
-        expectedReferencePositions[i] = 29;
-        expectedReadOffsets[i++] = new int[]{18};
-
-        for (; i < 40; ++i) {
-            fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
-        }
-
-        expectedDepths[i] = 1;
-        expectedReferencePositions[i] = 41;
-        expectedReadOffsets[i++] = new int[]{0};
-
-        for (; i < 46; ++i) {
-            fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
-        }
-
-        expectedDepths[i] = 1;
-        expectedReferencePositions[i] = 47;
-        expectedReadOffsets[i++] = new int[]{18};
-
-        // Last 5 bases of first read overlap first 5 bases of second read
-        for (; i < 76; ++i) {
-            fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
-        }
-
-        expectedDepths[i] = 1;
-        expectedReferencePositions[i] = 77;
-        expectedReadOffsets[i++] = new int[]{0};
-
-        // Last 31 bases of 2nd read
-
-        for (; i <= 80; ++i) {
-            fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
-        }
-
-        i = 0;
-        for (final AbstractLocusInfo<EdgingRecordAndOffset> li : sli) {
-            Assert.assertEquals(li.getRecordAndOffsets().size(), expectedDepths[i]);
-            Assert.assertEquals(li.getPosition(), expectedReferencePositions[i]);
-            Assert.assertEquals(li.getRecordAndOffsets().size(), expectedReadOffsets[i].length);
-            for (int j = 0; j < expectedReadOffsets[i].length; ++j) {
-                Assert.assertEquals(li.getRecordAndOffsets().get(j).getOffset(), expectedReadOffsets[i][j]);
-                if (start.contains(li.getPosition() - 1)) {
-                    Assert.assertEquals(li.getRecordAndOffsets().get(j).getType(), EdgingRecordAndOffset.Type.BEGIN);
-                }
-                if (end.contains(li.getPosition() - 1)) {
-                    Assert.assertEquals(li.getRecordAndOffsets().get(j).getType(), EdgingRecordAndOffset.Type.END);
-                }
-            }
-            ++i;
-            if (i == 80) {
-                break;
-            }
-        }
-    }
-
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void testSetQualityCutOff() {
-        final EdgeReadIterator sli = new EdgeReadIterator(createSamFileReader());
-
-        sli.setQualityScoreCutoff(10);
-    }
-
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void testSetMaxReadsToAccumulatePerLocus() {
-        final EdgeReadIterator sli = new EdgeReadIterator(createSamFileReader());
-
-        sli.setMaxReadsToAccumulatePerLocus(100);
-    }
-
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void testSetEmitUncoveredLoci() {
-        final EdgeReadIterator sli = new EdgeReadIterator(createSamFileReader());
-
-        sli.setEmitUncoveredLoci(false);
-    }
-
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void testSetIncludeIndels() {
-        final EdgeReadIterator sli = new EdgeReadIterator(createSamFileReader());
-
-        sli.setIncludeIndels(true);
-    }
-
-    /**
-     * Tests that reads, that don't intersect given interval list, are excluded from iterator
-     */
-    @Test
-    public void testNotIntersectingInterval() {
-        SamReader samReader = createSamFileReader();
-
-        IntervalList intervals = createIntervalList("@HD\tSO:coordinate\tVN:1.0\n" +
-                "@SQ\tSN:chrM\tLN:100\n" +
-                "chrM\t50\t60\t+\ttest");
-        EdgeReadIterator iterator = new EdgeReadIterator(samReader, intervals);
-        int locusPosition = 50;
-        while (iterator.hasNext()) {
-            AbstractLocusInfo<EdgingRecordAndOffset> next = iterator.next();
-            assertEquals(locusPosition++, next.getPosition());
-            assertEquals(0, next.getRecordAndOffsets().size());
-        }
-        assertEquals(61, locusPosition);
-    }
-
-    /**
-     * Tests that for reads, that intersect given interval list read start is shifted to the start of the interval and
-     * length is adjusted to the end of the interval.
-     */
-    @Test
-    public void testIntersectingInterval() {
-        SamReader samReader = createSamFileReader();
-        IntervalList intervals = createIntervalList("@HD\tSO:coordinate\tVN:1.0\n" +
-                "@SQ\tSN:chrM\tLN:100\n" +
-                "chrM\t5\t15\t+\ttest");
-        EdgeReadIterator iterator = new EdgeReadIterator(samReader, intervals);
-        int locusPosition = 5;
-        while (iterator.hasNext()) {
-            AbstractLocusInfo<EdgingRecordAndOffset> next = iterator.next();
-            int position = next.getPosition();
-            assertEquals(locusPosition++, position);
-            if (position == 5) {
-                assertEquals(2, next.getRecordAndOffsets().size());
-                for (EdgingRecordAndOffset record : next.getRecordAndOffsets()) {
-                    assertEquals(11, record.getLength());
-                }
-            } else {
-                assertEquals(0, next.getRecordAndOffsets().size());
-            }
-        }
-        assertEquals(16, locusPosition);
-    }
-
-    /**
-     * Test for mixed reads: intersecting and not the interval
-     */
-    @Test
-    public void testIntersectingAndNotInterval() {
-
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 40;
-        // Were it not for the gap, these two reads would not overlap
-        builder.addFrag("record2", 0, startPosition, true, false, "36M", null, 10);
-
-        IntervalList intervals = createIntervalList("@HD\tSO:coordinate\tVN:1.0\n" +
-                "@SQ\tSN:chrM\tLN:100\n" +
-                "chrM\t40\t80\t+\ttest");
-
-        EdgeReadIterator iterator = new EdgeReadIterator(builder.getSamReader(), intervals);
-        int locusPosition = 40;
-        while (iterator.hasNext()) {
-            AbstractLocusInfo<EdgingRecordAndOffset> next = iterator.next();
-            int position = next.getPosition();
-            assertEquals(locusPosition++, position);
-            if (position == 40) {
-                assertEquals(1, next.getRecordAndOffsets().size());
-                for (EdgingRecordAndOffset record : next.getRecordAndOffsets()) {
-                    assertEquals(36, record.getLength());
-                    assertEquals(EdgingRecordAndOffset.Type.BEGIN, record.getType());
-                }
-            } else if (position == 76) {
-                assertEquals(1, next.getRecordAndOffsets().size());
-                for (EdgingRecordAndOffset record : next.getRecordAndOffsets()) {
-                    assertEquals(36, record.getLength());
-                    assertEquals(EdgingRecordAndOffset.Type.END, record.getType());
-                }
-            } else {
-                assertEquals(0, next.getRecordAndOffsets().size());
-            }
-        }
-        assertEquals(81, locusPosition);
-    }
-
-
-    /**
-     * Test for intersecting interval for read with a deletion in the middle
-     */
-    @Test
-    public void testIntersectingIntervalWithComplicatedCigar() {
-
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 1;
-        // Were it not for the gap, these two reads would not overlap
-        builder.addFrag("record", 0, startPosition, true, false, "10M3D26M", null, 10);
-
-        IntervalList intervals = createIntervalList("@HD\tSO:coordinate\tVN:1.0\n" +
-                "@SQ\tSN:chrM\tLN:100\n" +
-                "chrM\t5\t20\t+\ttest");
-
-        EdgeReadIterator iterator = new EdgeReadIterator(builder.getSamReader(), intervals);
-        int locusPosition = 5;
-        int[] expectedLength = new int[]{6, 7};
-        int i = 0;
-        while (iterator.hasNext()) {
-            AbstractLocusInfo<EdgingRecordAndOffset> next = iterator.next();
-            int position = next.getPosition();
-            assertEquals(locusPosition++, position);
-            if (position == 5 || position == 14) {
-                assertEquals(1, next.getRecordAndOffsets().size());
-                for (EdgingRecordAndOffset record : next.getRecordAndOffsets()) {
-                    assertEquals(expectedLength[i], record.getLength());
-                    assertEquals(EdgingRecordAndOffset.Type.BEGIN, record.getType());
-                }
-            } else if (position == 11) {
-                assertEquals(1, next.getRecordAndOffsets().size());
-                for (EdgingRecordAndOffset record : next.getRecordAndOffsets()) {
-                    assertEquals(expectedLength[i], record.getLength());
-                    assertEquals(EdgingRecordAndOffset.Type.END, record.getType());
-                }
-                i++;
-            } else {
-                assertEquals(0, next.getRecordAndOffsets().size());
-            }
-        }
-        assertEquals(21, locusPosition);
-    }
-
-
-    private void fillEmptyLocus(int[] expectedReferencePositions, int[] expectedDepths, int[][] expectedReadOffsets, int i) {
-        expectedReferencePositions[i] = i + 1;
-        expectedDepths[i] = 0;
-        expectedReadOffsets[i] = new int[]{};
-    }
-
-    private SamReader createSamFileReader() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 1;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "36M", null, 10);
-        }
-        return builder.getSamReader();
-    }
-
-
-    private IntervalList createIntervalList(String s) {
-        return IntervalList.fromReader(new BufferedReader(new InputStreamReader(new ByteArrayInputStream(s.getBytes()))));
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/EdgingRecordAndOffsetTest.java b/src/test/java/htsjdk/samtools/util/EdgingRecordAndOffsetTest.java
deleted file mode 100644
index a4f6478..0000000
--- a/src/test/java/htsjdk/samtools/util/EdgingRecordAndOffsetTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-
-/**
- * 
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- *
- */
-
-public class EdgingRecordAndOffsetTest {
-    private final byte[] qualities = {30, 50, 50, 60, 60, 70 ,70, 70, 80, 90};
-    private final byte[] bases = {'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'T', 'C'};
-    private SAMRecord record;
-
-    @BeforeTest
-    public void setUp(){
-        record = new SAMRecord(new SAMFileHeader());
-        record.setReadName("testRecord");
-        record.setReadBases(bases);
-        record.setBaseQualities(qualities);
-    }
-
-    @Test
-    public void testConstructor(){
-        EdgingRecordAndOffset typedRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 0, 10, 3);
-        assertArrayEquals(qualities, typedRecordAndOffset.getBaseQualities());
-        assertArrayEquals(bases, typedRecordAndOffset.getRecord().getReadBases());
-        assertEquals('A', typedRecordAndOffset.getReadBase());
-        assertEquals(0, typedRecordAndOffset.getOffset());
-        assertEquals(3, typedRecordAndOffset.getRefPos());
-        assertEquals(EdgingRecordAndOffset.Type.BEGIN, typedRecordAndOffset.getType());
-    }
-
-    @Test
-    public void  testGetSetStart(){
-        EdgingRecordAndOffset typedRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 0, 10, 3);
-        EdgingRecordAndOffset typedRecordAndOffsetEnd = EdgingRecordAndOffset.createEndRecord(typedRecordAndOffset);
-        assertEquals(typedRecordAndOffset, typedRecordAndOffsetEnd.getStart());
-        assertEquals(EdgingRecordAndOffset.Type.END, typedRecordAndOffsetEnd.getType());
-    }
-
-    @Test
-    public void testNotEqualsTypedRecords(){
-        EdgingRecordAndOffset typedRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 0, 10, 3);
-        EdgingRecordAndOffset secondEdgingRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 5, 10, 3);
-        assertNotSame(typedRecordAndOffset.getBaseQuality(), secondEdgingRecordAndOffset.getBaseQuality());
-        assertArrayEquals(typedRecordAndOffset.getBaseQualities(), secondEdgingRecordAndOffset.getBaseQualities());
-    }
-
-    @Test
-    public void testGetOffset(){
-        EdgingRecordAndOffset secondEdgingRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 5, 10, 3);
-        assertEquals(70, secondEdgingRecordAndOffset.getBaseQuality());
-        assertEquals('C', secondEdgingRecordAndOffset.getReadBase());
-    }
-
-    @Test
-    public void testGetQualityAtPosition(){
-        EdgingRecordAndOffset secondEdgingRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 0, 10, 1);
-        assertEquals(50, secondEdgingRecordAndOffset.getBaseQuality(2));
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/HistogramTest.java b/src/test/java/htsjdk/samtools/util/HistogramTest.java
deleted file mode 100644
index 62b1441..0000000
--- a/src/test/java/htsjdk/samtools/util/HistogramTest.java
+++ /dev/null
@@ -1,366 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashSet;
-
-import static java.lang.Math.abs;
-import static java.lang.StrictMath.pow;
-
-public class HistogramTest {
-
-    @Test(dataProvider = "histogramData")
-    public void testHistogramFunctions(final int[] values, final double mean, final double stdev, final Integer trimByWidth) {
-        final Histogram<Integer> histo = new Histogram<>();
-        for (int value : values) {
-            histo.increment(value);
-        }
-
-        if (trimByWidth != null) histo.trimByWidth(trimByWidth);
-        final double m = histo.getMean();
-        final double sd = histo.getStandardDeviation();
-
-        Assert.assertEquals(round(mean), round(m), "Means are not equal");
-        Assert.assertEquals(round(stdev), round(sd), "Stdevs are not equal");
-    }
-
-    @DataProvider(name = "histogramData")
-    public Object[][] histogramData() {
-        return new Object[][] {
-            new Object[] {new int[] {1,2,3,4,5,6,7,8,9,10} , 5.5d, 3.027650d, null },
-            new Object[] {new int[] {1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9}, 6.333333d, 2.236068d, null  },
-            new Object[] {new int[] {-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15}, 5d, 6.204837d, null  },
-                new Object[] {new int[] {1,2,3,4,5,6,7,8,9,10, 11, 11, 12, 100, 1000} , 5.5d, 3.027650d, 10 },
-                new Object[] {new int[] {1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9, 20, 20, 21, 25, 25}, 6.333333d, 2.236068d, 11  },
-                new Object[] {new int[] {-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 101, 102, 103, 200, 2000}, 5d, 6.204837d, 20  }
-        };
-    }
-
-    @Test
-    public void testGeometricMean() {
-        final int[] is = {4,4,4,4,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-        Assert.assertTrue(abs(histo.getGeometricMean() - 6.216797) < 0.00001);
-    }
-
-    @Test
-    public void testGetSum() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.getSum(), (double)(2*4+3*5), 0.000001);
-    }
-
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void testGetSumBlowup() {
-        final String[] is = {"foo", "foo", "bar"};
-        final Histogram<String> histo = new Histogram<>();
-        for (final String i : is) histo.increment(i);
-        histo.getSum();//blow up
-    }
-
-    @Test
-    public void testGetSumOfValues() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.getSumOfValues(), (double)(2+3), 0.000001);
-    }
-
-    @Test
-    public void testGetMeanBinSize() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.getMeanBinSize(), (2+3)/2.0, 0.000001);
-    }
-
-    @Test
-    public void testGetStandardDeviationBinSize() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-        final double std = Math.sqrt((pow(2.0-2.5, 2)+pow(3.0-2.5, 2.0))); //sample variance so dividing by 1
-        Assert.assertEquals(histo.getStandardDeviationBinSize(histo.getMeanBinSize()), std, 0.000001);
-    }
-
-    @Test
-    public void testGetKeySet() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-
-        Assert.assertEquals(histo.keySet(), new HashSet<>(Arrays.asList(4,5)));
-    }
-
-    @Test
-    public void testLabelsAndComparator() {
-        final String[] is = {"a", "B", "a"};
-        final Histogram<String> histo = new Histogram<>("FOO", "BAR", String.CASE_INSENSITIVE_ORDER);
-        for (final String i : is) histo.increment(i);
-        Assert.assertEquals(histo.get("a").getValue(), 2.0);
-        Assert.assertEquals(histo.get("B").getValue(), 1.0);
-        Assert.assertEquals(histo.get("a").getId(), "a");
-        Assert.assertEquals(histo.get("B").getId(), "B");
-    }
-
-
-    @Test
-    public void testPrefillBins() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo = new Histogram<>();
-        Assert.assertEquals(histo.get(4), null);
-        Assert.assertEquals(histo.get(5), null);
-        histo.prefillBins(4);
-        Assert.assertEquals(histo.get(4).getValue(),0.0);
-        Assert.assertEquals(histo.get(5), null);
-
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.get(4).getValue(),2.0);
-        Assert.assertEquals(histo.get(5).getValue(),3.0);
-    }
-
-    @Test
-    public void testLabels() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo = new Histogram<>("FOO", "BAR");
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.getBinLabel(),"FOO");
-        Assert.assertEquals(histo.getValueLabel(),"BAR");
-    }
-
-    @Test
-    public void testCopyCtor() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo1 = new Histogram<>();
-        for (final int i : is) histo1.increment(i);
-
-        final Histogram<Integer> histo2 = new Histogram<>(histo1);
-        Assert.assertEquals(histo1, histo2);
-        Assert.assertEquals(histo2, histo1);
-    }
-
-    @Test
-    public void testGet() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-
-        Assert.assertEquals(histo.get(4).getValue(), 2.0);
-        Assert.assertEquals(histo.get(5).getValue(), 3.0);
-        Assert.assertEquals(histo.get(6), null);
-    }
-
-    @Test
-    public void testAddHistogram() {
-        final int[] is1 = {4,4,5,5,5};
-        final Histogram<Integer> histo1 = new Histogram<>();
-        Assert.assertTrue(histo1.isEmpty());
-        for (final int i : is1) histo1.increment(i);
-
-        Assert.assertFalse(histo1.isEmpty());
-
-        final int[] is2 = {5,5, 6,6,6,6};
-        final Histogram<Integer> histo2 = new Histogram<>();
-        for (final int i : is2) histo2.increment(i);
-
-        Assert.assertEquals(histo1.get(4).getValue(), 2.0);
-        Assert.assertEquals(histo1.get(5).getValue(), 3.0);
-        Assert.assertEquals(histo1.get(6), null);
-
-        histo1.addHistogram(histo2);
-
-        Assert.assertEquals(histo1.get(4).getValue(), 2.0);
-        Assert.assertEquals(histo1.get(5).getValue(), 5.0);
-        Assert.assertEquals(histo1.get(6).getValue(), 4.0);
-    }
-
-    @Test
-    public void testGetCumulativeProbability() {
-        final int[] is = {4,4,5,5,5,6,6,6,6};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.getCumulativeProbability(2.0), 0.0);
-        Assert.assertEquals(histo.getCumulativeProbability(4.0), 2.0/9);
-        Assert.assertEquals(histo.getCumulativeProbability(5.0), 5.0/9);
-        Assert.assertEquals(histo.getCumulativeProbability(6.0), 9.0/9);
-    }
-
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void testGetCumulativeProbabilityBlowup() {
-        final String[] is = {"foo"};
-        final Histogram<String> histo = new Histogram<>();
-        for (final String i : is) histo.increment(i);
-        histo.getCumulativeProbability(2.0);
-    }
-
-    @Test
-    public void testPercentile() {
-        final int[] is = {4,4,5,5,5,6,6,6,6};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.getPercentile(0.01), 4.0);
-        Assert.assertEquals(histo.getPercentile(2.0/9), 4.0);
-        Assert.assertEquals(histo.getPercentile(5.0/9), 5.0);
-        Assert.assertEquals(histo.getPercentile(0.99999), 6.0);
-    }
-
-    @Test
-    public void testGetMinMax() {
-        final int[] is = {4,4,5,5,5,6,6,6,6};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.getMin(), 4.0);
-        Assert.assertEquals(histo.getMax(), 6.0);
-    }
-
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void testGetMinBlowup() {
-        final String[] is = {"foo", "bar", "bar"};
-        final Histogram<String> histo = new Histogram<>();
-        for (final String i : is) histo.increment(i);
-        histo.getMin();//blow up
-    }
-
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void testGetMaxBlowup() {
-        final String[] is = {"foo", "bar", "bar"};
-        final Histogram<String> histo = new Histogram<>();
-        for (final String i : is) histo.increment(i);
-        histo.getMax();//blow up
-    }
-
-    @Test
-    public void testGetMedianBinSize() {
-        final int[] is = {4,4,5,5,5,6,6,6,6};
-        final Histogram<Integer> histo = new Histogram<>();
-        Assert.assertEquals(histo.getMedianBinSize(), 0, 0.000001); //empty
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.getMedianBinSize(), 3, 0.000001); //three fives
-    }
-
-    @Test
-    public void testGetMedianBinSize_Even() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo = new Histogram<>();
-        Assert.assertEquals(histo.getMedianBinSize(), 0, 0.000001); //empty
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.getMedianBinSize(), (2+3)/2.0, 0.000001); //even split
-    }
-
-    @Test
-    public void testSize() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.size(), 2); //2 unique values
-    }
-
-
-    @Test
-    public void testMode() {
-        final int[] is = {4,4,5,5,5,6};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-        Assert.assertEquals(histo.getMode(), 5.0);
-    }
-
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void testModeBlowup() {
-        final String[] is = {"foo"};
-        final Histogram<String> histo = new Histogram<>();
-        for (final String i : is) histo.increment(i);
-        histo.getMode();//blowup
-    }
-
-    @Test
-    public void testComparator() {
-        final int[] is = {4,4,5,5,5};
-        final Histogram<Integer> histo1 = new Histogram<>();
-        for (final int i : is) histo1.increment(i);
-        Assert.assertNull(histo1.comparator());
-
-        final Histogram<Integer> histo2 = new Histogram<>(Comparator.comparingInt(Integer::intValue));
-        Comparator<Integer> comp = (Comparator<Integer>) histo2.comparator();
-        Assert.assertNotNull(comp);
-        Assert.assertEquals(comp.compare(4,5), -1);
-    }
-
-    @Test
-    public void testEquals() {
-        final int[] is = {4,4,4,4,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8};
-        final Histogram<Integer> histo1 = new Histogram<>();
-        final Histogram<Integer> histo2 = new Histogram<>();
-        for (final int i : is) histo1.increment(i);
-        for (final int i : is) histo2.increment(i);
-        Assert.assertEquals(histo1, histo1);
-        Assert.assertEquals(histo2, histo1);
-        Assert.assertEquals(histo1, histo2);
-
-        Assert.assertEquals(histo1.hashCode(), histo2.hashCode());
-
-        Assert.assertNotEquals(null, histo1);
-        Assert.assertNotEquals(histo1, null);
-
-        histo2.increment(4);//make them not equal
-        Assert.assertEquals(histo1, histo1);
-        Assert.assertNotEquals(histo2, histo1);
-        Assert.assertNotEquals(histo1, histo2);
-        Assert.assertNotEquals(histo1.hashCode(), histo2.hashCode());
-
-
-    }
-
-    @Test(dataProvider = "medianTestData")
-    public void testMedian(final int [] values, final double median) {
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : values) histo.increment(i);
-        Assert.assertEquals(histo.getMedian(), median);
-    }
-
-    @DataProvider(name = "medianTestData")
-    public Object[][] medianTestData() {
-        return new Object[][] {
-                new Object[] {new int[] {} , 0d},
-                new Object[] {new int[] {999} , 999d},
-                new Object[] {new int[] {1,2,3,4,5,6} , 3.5d},
-                new Object[] {new int[] {5,5,5,5,5,6,6} , 5d},
-                new Object[] {new int[] {5,5,5,5,5,6,6,6,6,6} , 5.5d},
-        };
-    }
-
-    @Test
-    public void testMad() {
-        final int[] is = {4,4,4,4,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8};
-        final Histogram<Integer> histo = new Histogram<>();
-        for (final int i : is) histo.increment(i);
-
-        Assert.assertEquals(7d, histo.getMedian());
-        Assert.assertEquals(1d, histo.getMedianAbsoluteDeviation());
-        Assert.assertTrue(abs(histo.estimateSdViaMad() - 1.4826) < 0.0001);
-    }
-
-
-    @Test(dataProvider = "histogramData") //this data provider has several extra variables that we don't make use of here
-    public void testSerializeHistogram(final int[] values, final double mean, final double stdev, final Integer trimByWidth) throws IOException, ClassNotFoundException {
-        final Histogram<Integer> histo = new Histogram<>();
-        for (int value : values) {
-            histo.increment(value);
-        }
-
-        Histogram<Integer> deserializedHistogram = TestUtil.serializeAndDeserialize(histo);
-        Assert.assertEquals(deserializedHistogram, histo);
-    }
-
-    private double round(final double in) {
-        long l = (long) (in * 10000);
-        return l / 10000d;
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/IntervalListTest.java b/src/test/java/htsjdk/samtools/util/IntervalListTest.java
deleted file mode 100644
index 6c5fcd4..0000000
--- a/src/test/java/htsjdk/samtools/util/IntervalListTest.java
+++ /dev/null
@@ -1,520 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.variant.vcf.VCFFileReader;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * Tests the IntervalList class
- */
-public class IntervalListTest {
-
-    final SAMFileHeader fileHeader;
-    final IntervalList list1, list2, list3;
-
-    public IntervalListTest() {
-        fileHeader = IntervalList.fromFile(new File("src/test/resources/htsjdk/samtools/intervallist/IntervalListchr123_empty.interval_list")).getHeader();
-        fileHeader.setSortOrder(SAMFileHeader.SortOrder.unsorted);
-
-        list1 = new IntervalList(fileHeader);
-        list2 = new IntervalList(fileHeader);
-        list3 = new IntervalList(fileHeader);
-
-        list1.add(new Interval("1", 1, 100));     //de-facto: 1:1-200 1:202-300     2:100-150 2:200-300
-        list1.add(new Interval("1", 101, 200));
-        list1.add(new Interval("1", 202, 300));
-        list1.add(new Interval("2", 200, 300));
-        list1.add(new Interval("2", 100, 150));
-
-        list2.add(new Interval("1", 50, 150));   //de-facto 1:50-150 1:301-500      2:1-150 2:250-270 2:290-400
-        list2.add(new Interval("1", 301, 500));
-        list2.add(new Interval("2", 1, 150));
-        list2.add(new Interval("2", 250, 270));
-        list2.add(new Interval("2", 290, 400));
-
-        list3.add(new Interval("1", 25, 400));    //de-facto 1:25-400                2:200-600                            3:50-470
-        list3.add(new Interval("2", 200, 600));
-        list3.add(new Interval("3", 50, 470));
-    }
-
-    @DataProvider(name = "intersectData")
-    public Object[][] intersectData() {
-        final IntervalList intersect123 = new IntervalList(fileHeader);
-        final IntervalList intersect12 = new IntervalList(fileHeader);
-        final IntervalList intersect13 = new IntervalList(fileHeader);
-        final IntervalList intersect23 = new IntervalList(fileHeader);
-
-        intersect123.add(new Interval("1", 50, 150));
-        intersect123.add(new Interval("2", 250, 270));
-        intersect123.add(new Interval("2", 290, 300));
-
-        intersect12.add(new Interval("1", 50, 150));
-        intersect12.add(new Interval("2", 100, 150));
-        intersect12.add(new Interval("2", 250, 270));
-        intersect12.add(new Interval("2", 290, 300));
-
-        intersect13.add(new Interval("1", 25, 200));
-        intersect13.add(new Interval("1", 202, 300));
-        intersect13.add(new Interval("2", 200, 300));
-
-        intersect23.add(new Interval("1", 50, 150));
-        intersect23.add(new Interval("1", 301, 400));
-        intersect23.add(new Interval("2", 250, 270));
-        intersect23.add(new Interval("2", 290, 400));
-
-        return new Object[][]{
-                new Object[]{Arrays.asList(list1, list2, list3), intersect123},
-                new Object[]{Arrays.asList(list1, list2), intersect12},
-                new Object[]{Arrays.asList(list2, list1), intersect12},
-                new Object[]{Arrays.asList(list2, list3), intersect23},
-                new Object[]{Arrays.asList(list3, list2), intersect23},
-                new Object[]{Arrays.asList(list1, list3), intersect13},
-                new Object[]{Arrays.asList(list3, list1), intersect13}
-        };
-    }
-
-    @Test(dataProvider = "intersectData")
-    public void testIntersectIntervalLists(final List<IntervalList> lists, final IntervalList list) {
-        Assert.assertEquals(
-                CollectionUtil.makeCollection(IntervalList.intersection(lists).iterator()),
-                CollectionUtil.makeCollection(list.iterator()));
-    }
-
-    @DataProvider(name = "mergeData")
-    public Object[][] mergeData() {
-        final IntervalList merge123 = new IntervalList(fileHeader);
-        final IntervalList merge12 = new IntervalList(fileHeader);
-        final IntervalList merge23 = new IntervalList(fileHeader);
-        final IntervalList merge13 = new IntervalList(fileHeader);
-
-        merge123.add(new Interval("1", 1, 100));     //de-facto: 1:1-200 1:202-300     2:100-150 2:200-300
-        merge123.add(new Interval("1", 101, 200));
-        merge123.add(new Interval("1", 202, 300));
-        merge123.add(new Interval("2", 200, 300));
-        merge123.add(new Interval("2", 100, 150));
-
-        merge123.add(new Interval("1", 50, 150));   //de-facto 1:50-150 1:301-500      2:1-150 2:250-270 2:290-400
-        merge123.add(new Interval("1", 301, 500));
-        merge123.add(new Interval("2", 1, 150));
-        merge123.add(new Interval("2", 250, 270));
-        merge123.add(new Interval("2", 290, 400));
-
-        merge123.add(new Interval("1", 25, 400));    //de-facto 1:25-400                2:200-600                            3:50-470
-        merge123.add(new Interval("2", 200, 600));
-        merge123.add(new Interval("3", 50, 470));
-
-        merge12.add(new Interval("1", 1, 100));     //de-facto: 1:1-200 1:202-300     2:100-150 2:200-300
-        merge12.add(new Interval("1", 101, 200));
-        merge12.add(new Interval("1", 202, 300));
-        merge12.add(new Interval("2", 200, 300));
-        merge12.add(new Interval("2", 100, 150));
-
-        merge12.add(new Interval("1", 50, 150));   //de-facto 1:50-150 1:301-500      2:1-150 2:250-270 2:290-400
-        merge12.add(new Interval("1", 301, 500));
-        merge12.add(new Interval("2", 1, 150));
-        merge12.add(new Interval("2", 250, 270));
-        merge12.add(new Interval("2", 290, 400));
-
-        merge23.add(new Interval("1", 50, 150));   //de-facto 1:50-150 1:301-500      2:1-150 2:250-270 2:290-400
-        merge23.add(new Interval("1", 301, 500));
-        merge23.add(new Interval("2", 1, 150));
-        merge23.add(new Interval("2", 250, 270));
-        merge23.add(new Interval("2", 290, 400));
-
-        merge23.add(new Interval("1", 25, 400));    //de-facto 1:25-400                2:200-600                            3:50-470
-        merge23.add(new Interval("2", 200, 600));
-        merge23.add(new Interval("3", 50, 470));
-
-        merge13.add(new Interval("1", 1, 100));     //de-facto: 1:1-200 1:202-300     2:100-150 2:200-300
-        merge13.add(new Interval("1", 101, 200));
-        merge13.add(new Interval("1", 202, 300));
-        merge13.add(new Interval("2", 200, 300));
-        merge13.add(new Interval("2", 100, 150));
-
-        merge13.add(new Interval("1", 25, 400));    //de-facto 1:25-400                2:200-600                            3:50-470
-        merge13.add(new Interval("2", 200, 600));
-        merge13.add(new Interval("3", 50, 470));
-
-        return new Object[][]{
-                new Object[]{Arrays.asList(list1, list2, list3), merge123},
-                new Object[]{Arrays.asList(list1, list2), merge12},
-                new Object[]{Arrays.asList(list2, list3), merge23},
-                new Object[]{Arrays.asList(list1, list3), merge13}
-        };
-    }
-
-    @Test(dataProvider = "mergeData")
-    public void testMergeIntervalLists(final List<IntervalList> lists, final IntervalList list) {
-        Assert.assertEquals(
-                CollectionUtil.makeCollection(IntervalList.concatenate(lists).iterator()),
-                CollectionUtil.makeCollection(list.iterator()));
-    }
-
-    @DataProvider(name = "unionData")
-    public Object[][] unionData() {
-        final IntervalList union123 = new IntervalList(fileHeader);
-        final IntervalList union12 = new IntervalList(fileHeader);
-        final IntervalList union13 = new IntervalList(fileHeader);
-        final IntervalList union23 = new IntervalList(fileHeader);
-
-        union123.add(new Interval("1", 1, 500));
-        union123.add(new Interval("2", 1, 150));
-        union123.add(new Interval("2", 200, 600));
-        union123.add(new Interval("3", 50, 470));
-
-        union12.add(new Interval("1", 1, 200));
-        union12.add(new Interval("1", 202, 500));
-        union12.add(new Interval("2", 1, 150));
-        union12.add(new Interval("2", 200, 400));
-
-        union23.add(new Interval("1", 25, 500));
-        union23.add(new Interval("2", 1, 150));
-        union23.add(new Interval("2", 200, 600));
-        union23.add(new Interval("3", 50, 470));
-
-        union13.add(new Interval("1", 1, 400));
-        union13.add(new Interval("2", 100, 150));
-        union13.add(new Interval("2", 200, 600));
-        union13.add(new Interval("3", 50, 470));
-
-        return new Object[][]{
-                new Object[]{Arrays.asList(list1, list2, list3), union123},
-                new Object[]{Arrays.asList(list1, list2), union12},
-                new Object[]{Arrays.asList(list1, list2), union12},
-                new Object[]{Arrays.asList(list2, list3), union23},
-                new Object[]{Arrays.asList(list2, list3), union23},
-                new Object[]{Arrays.asList(list1, list3), union13},
-                new Object[]{Arrays.asList(list1, list3), union13}
-        };
-    }
-
-    @Test(dataProvider = "unionData", enabled = true)
-    public void testUnionIntervalLists(final List<IntervalList> lists, final IntervalList list) {
-        Assert.assertEquals(
-                CollectionUtil.makeCollection(IntervalList.union(lists).iterator()),
-                CollectionUtil.makeCollection(list.iterator()));
-    }
-
-    @DataProvider(name = "invertData")
-    public Object[][] invertData() {
-        final IntervalList invert1 = new IntervalList(fileHeader);
-        final IntervalList invert2 = new IntervalList(fileHeader);
-        final IntervalList invert3 = new IntervalList(fileHeader);
-
-        final IntervalList full = new IntervalList(fileHeader);
-        final IntervalList fullChopped = new IntervalList(fileHeader);
-        final IntervalList empty = new IntervalList(fileHeader);
-
-        invert1.add(new Interval("1", 201, 201));
-        invert1.add(new Interval("1", 301, fileHeader.getSequence("1").getSequenceLength()));
-        invert1.add(new Interval("2", 1, 99));
-        invert1.add(new Interval("2", 151, 199));
-        invert1.add(new Interval("2", 301, fileHeader.getSequence("2").getSequenceLength()));
-        invert1.add(new Interval("3", 1, fileHeader.getSequence("3").getSequenceLength()));
-
-        invert2.add(new Interval("1", 1, 49));
-        invert2.add(new Interval("1", 151, 300));
-        invert2.add(new Interval("1", 501, fileHeader.getSequence("1").getSequenceLength()));
-        invert2.add(new Interval("2", 151, 249));
-        invert2.add(new Interval("2", 271, 289));
-        invert2.add(new Interval("2", 401, fileHeader.getSequence("2").getSequenceLength()));
-        invert2.add(new Interval("3", 1, fileHeader.getSequence("3").getSequenceLength()));
-
-        invert3.add(new Interval("1", 1, 24));
-        invert3.add(new Interval("1", 401, fileHeader.getSequence("1").getSequenceLength()));
-        invert3.add(new Interval("2", 1, 199));
-        invert3.add(new Interval("2", 601, fileHeader.getSequence("2").getSequenceLength()));
-        invert3.add(new Interval("3", 1, 49));
-        invert3.add(new Interval("3", 471, fileHeader.getSequence("3").getSequenceLength()));
-
-        for (final SAMSequenceRecord samSequenceRecord : fileHeader.getSequenceDictionary().getSequences()) {
-            full.add(new Interval(samSequenceRecord.getSequenceName(), 1, samSequenceRecord.getSequenceLength()));
-
-            fullChopped.add(new Interval(samSequenceRecord.getSequenceName(), 1, samSequenceRecord.getSequenceLength() / 2));
-            fullChopped.add(new Interval(samSequenceRecord.getSequenceName(), samSequenceRecord.getSequenceLength() / 2 + 1, samSequenceRecord.getSequenceLength()));
-        }
-
-        return new Object[][]{
-                new Object[]{list1, invert1},
-                new Object[]{list2, invert2},
-                new Object[]{list3, invert3},
-                new Object[]{full, empty},
-                new Object[]{empty, full},
-                new Object[]{fullChopped, empty}
-        };
-    }
-
-    @Test(dataProvider = "invertData")
-    public void testInvertSquared(final IntervalList list, @SuppressWarnings("UnusedParameters") final IntervalList ignored) throws Exception {
-        final IntervalList inverseSquared = IntervalList.invert(IntervalList.invert(list));
-        final IntervalList originalClone = new IntervalList(list.getHeader());
-
-        for (final Interval interval : list) {
-            originalClone.add(interval);
-        }
-
-        Assert.assertEquals(
-                CollectionUtil.makeCollection(inverseSquared.iterator()),
-                CollectionUtil.makeCollection(originalClone.uniqued().iterator()));
-    }
-
-    @Test(dataProvider = "invertData")
-    public void testInvert(final IntervalList list, final IntervalList inverse) throws Exception {
-        Assert.assertEquals(
-                CollectionUtil.makeCollection(IntervalList.invert(list).iterator()),
-                CollectionUtil.makeCollection(inverse.iterator()));
-    }
-
-    @DataProvider(name = "subtractSingletonData")
-    public Object[][] subtractSingletonData() {
-        final IntervalList subtract1_from_2 = new IntervalList(fileHeader);
-        final IntervalList subtract2_from_3 = new IntervalList(fileHeader);
-        final IntervalList subtract1_from_3 = new IntervalList(fileHeader);
-        final IntervalList subtract3_from_1 = new IntervalList(fileHeader);
-
-        subtract1_from_2.add(new Interval("1", 301, 500));
-        subtract1_from_2.add(new Interval("2", 1, 99));
-        subtract1_from_2.add(new Interval("2", 301, 400));
-
-        subtract2_from_3.add(new Interval("1", 25, 49));
-        subtract2_from_3.add(new Interval("1", 151, 300));
-        subtract2_from_3.add(new Interval("2", 200, 249));
-        subtract2_from_3.add(new Interval("2", 271, 289));
-        subtract2_from_3.add(new Interval("2", 401, 600));
-        subtract2_from_3.add(new Interval("3", 50, 470));
-
-        subtract1_from_3.add(new Interval("1", 201, 201));
-        subtract1_from_3.add(new Interval("1", 301, 400));
-        subtract1_from_3.add(new Interval("2", 301, 600));
-        subtract1_from_3.add(new Interval("3", 50, 470));
-
-        subtract3_from_1.add(new Interval("1", 1, 49));    //de-facto 1:25-400                2:200-600                            3:50-470
-        subtract3_from_1.add(new Interval("2", 100, 150));
-
-        return new Object[][]{
-                new Object[]{list2, list1, subtract1_from_2},
-                new Object[]{list3, list2, subtract2_from_3},
-                new Object[]{list3, list1, subtract1_from_3},
-        };
-    }
-
-    @DataProvider(name = "subtractData")
-    public Object[][] subtractData() {
-        final IntervalList subtract12_from_3 = new IntervalList(fileHeader);
-
-        subtract12_from_3.add(new Interval("1", 201, 201));
-        subtract12_from_3.add(new Interval("2", 401, 600));
-        subtract12_from_3.add(new Interval("3", 50, 470));
-
-        return new Object[][]{
-                new Object[]{CollectionUtil.makeList(list3), CollectionUtil.makeList(list1, list2), subtract12_from_3},
-        };
-    }
-
-    @Test(dataProvider = "subtractData")
-    public void testSubtractIntervalLists(final List<IntervalList> fromLists, final List<IntervalList> whatLists, final IntervalList list) {
-        Assert.assertEquals(
-                CollectionUtil.makeCollection(IntervalList.subtract(fromLists, whatLists).iterator()),
-                CollectionUtil.makeCollection(list.iterator()));
-    }
-
-    @Test(dataProvider = "subtractSingletonData")
-    public void testSubtractSingletonIntervalLists(final IntervalList fromLists, final IntervalList whatLists, final IntervalList list) {
-        Assert.assertEquals(
-                CollectionUtil.makeCollection(IntervalList.subtract(fromLists, whatLists).iterator()),
-                CollectionUtil.makeCollection(list.iterator()));
-    }
-
-    @Test(dataProvider = "subtractSingletonData")
-    public void testSubtractSingletonasListIntervalList(final IntervalList fromLists, final IntervalList whatLists, final IntervalList list) {
-        Assert.assertEquals(
-                CollectionUtil.makeCollection(IntervalList.subtract(Collections.singletonList(fromLists), Collections.singletonList(whatLists)).iterator()),
-                CollectionUtil.makeCollection(list.iterator()));
-    }
-
-    @DataProvider(name = "VCFCompData")
-    public Object[][] VCFCompData() {
-        return new Object[][]{
-                new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTest.vcf", "src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list", false},
-                new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTest.vcf", "src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverse.interval_list", true},
-                new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManual.vcf", "src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManualComp.interval_list", false},
-                new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManual.vcf", "src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverseManual.interval_list", true}
-        };
-    }
-
-    @Test(dataProvider = "VCFCompData")
-    public void testFromVCF(final String vcf, final String compInterval, final boolean invertVCF) {
-
-        final File vcfFile = new File(vcf);
-        final File compIntervalFile = new File(compInterval);
-
-        final IntervalList compList = IntervalList.fromFile(compIntervalFile);
-        final IntervalList list = invertVCF ? IntervalList.invert(VCFFileReader.fromVcf(vcfFile)) : VCFFileReader.fromVcf(vcfFile);
-
-        compList.getHeader().getSequenceDictionary().assertSameDictionary(list.getHeader().getSequenceDictionary());
-
-        final Collection<Interval> intervals = CollectionUtil.makeCollection(list.iterator());
-        final Collection<Interval> compIntervals = CollectionUtil.makeCollection(compList.iterator());
-
-        //assert that the intervals correspond
-        Assert.assertEquals(intervals, compIntervals);
-
-        final List<String> intervalNames = new LinkedList<String>();
-        final List<String> compIntervalNames = new LinkedList<String>();
-
-        for (final Interval interval : intervals) {
-            intervalNames.add(interval.getName());
-        }
-        for (final Interval interval : compIntervals) {
-            compIntervalNames.add(interval.getName());
-        }
-        //assert that the names match
-        Assert.assertEquals(intervalNames, compIntervalNames);
-    }
-
-    @DataProvider
-    public Object[][] testFromSequenceData() {
-        return new Object[][]{
-                new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list", "1", 249250621},
-                new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list", "2", 243199373},
-                new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list", "3", 198022430},
-        };
-    }
-
-    @Test(dataProvider = "testFromSequenceData")
-    public void testFromSequenceName(final String intervalList, final String referenceName, final Integer length) {
-
-        final IntervalList intervals = IntervalList.fromFile(new File(intervalList));
-        final IntervalList test = IntervalList.fromName(intervals.getHeader(), referenceName);
-        Assert.assertEquals(test.getIntervals(), CollectionUtil.makeList(new Interval(referenceName, 1, length)));
-    }
-
-    @Test
-    public void testMerges() {
-        final SortedSet<Interval> intervals = new TreeSet<Interval>() {{
-            add(new Interval("1", 500, 600, false, "foo"));
-            add(new Interval("1", 550, 650, false, "bar"));
-            add(new Interval("1", 625, 699, false, "splat"));
-        }};
-
-        Interval out = IntervalList.merge(intervals, false);
-        Assert.assertEquals(out.getStart(), 500);
-        Assert.assertEquals(out.getEnd(), 699);
-
-        intervals.add(new Interval("1", 626, 629, false, "whee"));
-        out = IntervalList.merge(intervals, false);
-        Assert.assertEquals(out.getStart(), 500);
-        Assert.assertEquals(out.getEnd(), 699);
-    }
-
-    @Test
-    public void testBreakAtBands() {
-        final List<Interval> intervals = new ArrayList<Interval>() {{
-            add(new Interval("A", 1, 99, false, "foo"));
-            add(new Interval("A", 98, 99, true, "psyduck"));
-            add(new Interval("1", 500, 600, false, "foo")); // -> 2
-            add(new Interval("1", 550, 650, false, "bar")); // -> 2
-            add(new Interval("1", 625, 699, false, "splat"));
-            add(new Interval("2", 99, 201, false, "geodude")); // -> 3
-            add(new Interval("3", 100, 99, false, "charizard"));  // Empty Interval
-            add(new Interval("3", 101, 100, false, "golduck"));   // Empty Interval
-        }};
-
-        final List<Interval> brokenIntervals = IntervalList.breakIntervalsAtBandMultiples(intervals, 100);
-
-        Assert.assertEquals(brokenIntervals.size(), 12);
-        Assert.assertEquals(brokenIntervals.get(0), new Interval("A", 1, 99, false, "foo"));
-
-        Assert.assertEquals(brokenIntervals.get(1), new Interval("A", 98, 99, true, "psyduck"));
-
-        Assert.assertEquals(brokenIntervals.get(2), new Interval("1", 500, 599, false, "foo.1"));
-        Assert.assertEquals(brokenIntervals.get(3), new Interval("1", 600, 600, false, "foo.2"));
-
-        Assert.assertEquals(brokenIntervals.get(4), new Interval("1", 550, 599, false, "bar.1"));
-        Assert.assertEquals(brokenIntervals.get(5), new Interval("1", 600, 650, false, "bar.2"));
-
-        Assert.assertEquals(brokenIntervals.get(6), new Interval("1", 625, 699, false, "splat"));
-
-        Assert.assertEquals(brokenIntervals.get(7), new Interval("2", 99, 99, false, "geodude.1"));
-        Assert.assertEquals(brokenIntervals.get(8), new Interval("2", 100, 199, false, "geodude.2"));
-        Assert.assertEquals(brokenIntervals.get(9), new Interval("2", 200, 201, false, "geodude.3"));
-
-        Assert.assertEquals(brokenIntervals.get(10), new Interval("3", 100, 99, false, "charizard"));
-        Assert.assertEquals(brokenIntervals.get(11), new Interval("3", 101, 100, false, "golduck"));
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void TestFailAdd() {
-        IntervalList test = new IntervalList(this.fileHeader);
-        test.add(new Interval("blarg", 1, 1));
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void TestFailAddAll() {
-        IntervalList test = new IntervalList(this.fileHeader);
-        test.addall(CollectionUtil.makeList(new Interval("blarg", 1, 1), new Interval("bloorg", 1, 1)));
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void changeHeader() {
-        SAMFileHeader clonedHeader = fileHeader.clone();
-        clonedHeader.addSequence(new SAMSequenceRecord("4", 1000));
-        IntervalList usingClone1 = new IntervalList(clonedHeader);
-        usingClone1.add(new Interval("4", 1, 100));
-        IntervalList usingClone2 = new IntervalList(clonedHeader);
-        usingClone2.add(new Interval("4", 10, 20));
-
-
-        IntervalList expected = new IntervalList(clonedHeader);
-        expected.add(new Interval("4", 1, 9));
-        expected.add(new Interval("4", 21, 100));
-
-        //pull rug from underneath (one call will change all the headers, since there's actually only one)
-        usingClone1.getHeader().setSequenceDictionary(fileHeader.getSequenceDictionary());
-
-        //now interval lists are in "illegal state" since they contain contigs that are not in the header.
-        //this next step should fail
-        IntervalList.subtract(usingClone1, usingClone2);
-
-        Assert.assertTrue(false);
-
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/IntervalTreeMapTest.java b/src/test/java/htsjdk/samtools/util/IntervalTreeMapTest.java
deleted file mode 100644
index 2e725ff..0000000
--- a/src/test/java/htsjdk/samtools/util/IntervalTreeMapTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Iterator;
-
-public class IntervalTreeMapTest {
-    @Test
-    public void testBasic() {
-        IntervalTreeMap<Interval> m=new IntervalTreeMap<Interval>();
-
-        Interval chr1Interval = new Interval("chr1", 10,100);
-        m.put(chr1Interval, chr1Interval);
-        Interval chr2Interval = new Interval("chr2", 1,200);
-        m.put(chr2Interval, chr2Interval);
-        
-        
-        Assert.assertTrue(m.containsContained(new Interval("chr1", 9,101)));
-        Assert.assertTrue(m.containsOverlapping(new Interval("chr1", 50,150)));
-        Assert.assertFalse(m.containsOverlapping(new Interval("chr3", 1,100)));
-        Assert.assertFalse(m.containsOverlapping(new Interval("chr1", 101,150)));
-        Assert.assertFalse(m.containsContained(new Interval("chr1", 11,101)));
-        Assert.assertFalse(m.isEmpty());
-        Assert.assertTrue(m.size()==2);
-        
-        final Iterator<Interval> iterator = m.keySet().iterator();
-        Assert.assertEquals(iterator.next(), chr1Interval);
-        Assert.assertEquals(iterator.next(), chr2Interval);
-        Assert.assertFalse(iterator.hasNext());
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/IntervalTreeTest.java b/src/test/java/htsjdk/samtools/util/IntervalTreeTest.java
deleted file mode 100644
index 50d84c0..0000000
--- a/src/test/java/htsjdk/samtools/util/IntervalTreeTest.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Iterator;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class IntervalTreeTest {
-    @Test
-    public void testNoMatches()
-    {
-        // Test empty tree
-        final IntervalTree<String> intervalTree = new IntervalTree<String>();
-        Iterator<IntervalTree.Node<String>> results = intervalTree.overlappers(1, 500);
-        Assert.assertEquals(countElements(results), 0, "Testing with no left-hand set failed.");
-
-        // Test no matches at all
-        intervalTree.put(1, 400, "foo");
-        intervalTree.put(600, 800, "foo2");
-        results = intervalTree.overlappers(450, 599);
-        Assert.assertEquals(countElements(results), 0, "Testing with no overlaps at all.");
-
-    }
-
-    private int countElements(final Iterator<IntervalTree.Node<String>> it) {
-        int ret = 0;
-        while (it.hasNext()) {
-            ++ret;
-            it.next();
-        }
-        return ret;
-    }
-
-    @Test
-    public void testMatches()
-    {
-        final IntervalTree<String> intervalTree = new IntervalTree<String>();
-        intervalTree.put(1, 10, "foo1");
-        intervalTree.put(2, 9, "foo2");
-        intervalTree.put(3, 8, "foo3");
-        intervalTree.put(4, 7, "foo4");
-        intervalTree.put(5, 6, "foo5");
-        intervalTree.put(1, 9, "foo6");
-
-        // Single match
-        Assert.assertEquals(countElements(intervalTree.overlappers(10, 10)), 1, "Test single overlap");
-        Assert.assertTrue(iteratorContains(intervalTree.overlappers(10, 10), "foo1"), "Test single overlap for correct overlapee");
-
-        // Multiple matches
-        Assert.assertEquals(countElements(intervalTree.overlappers(7, 8)), 5, "Test multiple overlap");
-        Assert.assertTrue(iteratorContains(intervalTree.overlappers(7, 8), "foo1"), "Test multiple overlap for correct overlapees");
-        Assert.assertTrue(iteratorContains(intervalTree.overlappers(7, 8), "foo2"), "Test multiple overlap for correct overlapees");
-        Assert.assertTrue(iteratorContains(intervalTree.overlappers(7, 8), "foo3"), "Test multiple overlap for correct overlapees");
-        Assert.assertTrue(iteratorContains(intervalTree.overlappers(7, 8), "foo4"), "Test multiple overlap for correct overlapees");
-        Assert.assertTrue(iteratorContains(intervalTree.overlappers(7, 8), "foo6"), "Test multiple overlap for correct overlapees");
-        Assert.assertTrue(!iteratorContains(intervalTree.overlappers(7, 8), "foo5"), "Test multiple overlap for correct overlapees");
-    }
-
-    private boolean iteratorContains(final Iterator<IntervalTree.Node<String>> nodeIterator, final String s) {
-        while (nodeIterator.hasNext()) {
-            if (nodeIterator.next().getValue().equals(s)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Test
-    public void testNearEnds()
-    {
-        final IntervalTree<String> intervalTree = new IntervalTree<String>();
-        intervalTree.put(10, 20, "foo");
-        Assert.assertEquals(countElements(intervalTree.overlappers(10, 10)), 1, "Test overlap (no buffers) at near end exactly");
-        Assert.assertEquals(countElements(intervalTree.overlappers(9, 10)), 1, "Test overlap (no buffers) at near end exactly");
-        Assert.assertEquals(countElements(intervalTree.overlappers(9, 9)), 0, "Test just before overlap (no buffers)");
-        Assert.assertEquals(countElements(intervalTree.overlappers(20, 20)), 1, "Test overlap (no buffers) at far end exactly");
-        Assert.assertEquals(countElements(intervalTree.overlappers(20, 21)), 1, "Test overlap (no buffers) at far end exactly");
-        Assert.assertEquals(countElements(intervalTree.overlappers(21, 21)), 0, "Test just beyond overlap (no buffers)");
-    }
-
-    @Test
-    public void performanceTest()
-    {
-        final IntervalTree<String> intervalTree = new IntervalTree<String>();
-        final long start = System.currentTimeMillis();
-        for (int i = 1; i <= 50000; i++)  intervalTree.put(i, i, "frob");
-        System.out.println("Time to construct a tree with 50000 nodes: " + (System.currentTimeMillis() - start) + " milliseconds" );
-
-        final long end   = System.currentTimeMillis() + 10000;
-        int count = 0;
-        while (System.currentTimeMillis() < end) {
-            intervalTree.overlappers(17000, 17099);
-            ++count;
-        }
-        System.out.println("Queried for the same 100-length mapping " + count + " times in 10 seconds.");
-    }
-
-    @Test
-    public void testHandlingOfDuplicateMappings()
-    {
-        final IntervalTree<String> intervalTree = new IntervalTree<String>();
-        intervalTree.put(1, 10, "foo1");
-        // This call replaces foo1 with foo2
-        Assert.assertEquals(intervalTree.put(1, 10, "foo2"), "foo1");
-        intervalTree.put(2, 8, "foo3");
-
-        Assert.assertEquals(countElements(intervalTree.overlappers(3, 5)), 2);
-        Assert.assertFalse(iteratorContains(intervalTree.overlappers(3, 5), "foo1"));
-        Assert.assertTrue(iteratorContains(intervalTree.overlappers(3, 5), "foo2"));
-        Assert.assertTrue(iteratorContains(intervalTree.overlappers(3, 5), "foo3"));
-    }
-
-    /**
-     * Test of PIC-123
-     */
-    @Test
-    public void testRemove() {
-        int[][] adds = {
-                {46129744, 46129978},
-                {46393843, 46394077},
-                {46260491, 46260725},
-                {46402360, 46402594},
-                {46369255, 46369464},
-                {46293772, 46293981},
-                {46357687, 46357896},
-                {46431752, 46431961},
-                {46429997, 46430206},
-                {46404026, 46404192},
-                {46390511, 46390677},
-                {46090593, 46090759},
-                {46045352, 46045518},
-                {46297633, 46297799},
-                {46124297, 46124463},
-                {46395291, 46395504},
-                {46439072, 46439240},
-                {46400792, 46400959},
-                {46178616, 46178851},
-                {46129747, 46129982},
-                {46396546, 46396781},
-                {46112353, 46112588},
-                {46432996, 46433231},
-                {46399109, 46399344},
-                {46372058, 46372292},
-                {46386826, 46387060},
-                {46381795, 46382029},
-                {46179789, 46180023},
-                {46394409, 46394643},
-                {46376176, 46376429},
-                {46389943, 46390177},
-                {46433654, 46433888},
-                {46379440, 46379674},
-                {46391117, 46391351},
-        };
-        IntervalTree<String> intervalTree = new IntervalTree<String>();
-        for (int[] add : adds) {
-            intervalTree.put(add[0], add[1], "frob");
-        }
-        Assert.assertEquals(intervalTree.remove(46402360, 46402594), "frob");
-        intervalTree.checkMaxEnds();
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/IoUtilTest.java b/src/test/java/htsjdk/samtools/util/IoUtilTest.java
deleted file mode 100644
index 0e4cd7a..0000000
--- a/src/test/java/htsjdk/samtools/util/IoUtilTest.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.StringWriter;
-import java.util.Arrays;
-import java.util.List;
-
-public class IoUtilTest {
-
-    private static final File SLURP_TEST_FILE = new File("src/test/resources/htsjdk/samtools/io/slurptest.txt");
-    private static final File EMPTY_FILE = new File("src/test/resources/htsjdk/samtools/io/empty.txt");
-    private static final File FIVE_SPACES_THEN_A_NEWLINE_THEN_FIVE_SPACES_FILE = new File("src/test/resources/htsjdk/samtools/io/5newline5.txt");
-    private static final List<String> SLURP_TEST_LINES = Arrays.asList("bacon   and rice   ", "for breakfast  ", "wont you join me");
-    private static final String SLURP_TEST_LINE_SEPARATOR = "\n";
-    private static final String TEST_FILE_PREFIX = "htsjdk-IOUtilTest";
-    private static final String TEST_FILE_EXTENSIONS[] = {".txt", ".txt.gz"};
-    private static final String TEST_STRING = "bar!";
-    private File existingTempFile;
-    private String systemTempDir;
-
-    @BeforeClass
-    public void setUp() throws IOException {
-        existingTempFile = File.createTempFile("FiletypeTest.", ".tmp");
-        existingTempFile.deleteOnExit();
-        systemTempDir = System.getProperty("java.io.tmpdir");
-        final File tmpDir = new File(systemTempDir);
-        if (!tmpDir.isDirectory()) tmpDir.mkdir();
-        if (!tmpDir.isDirectory())
-            throw new RuntimeException("java.io.tmpdir (" + systemTempDir + ") is not a directory");
-    }
-
-    @Test
-    public void testFileReadingAndWriting() throws IOException {
-        String randomizedTestString = TEST_STRING + System.currentTimeMillis();
-        for (String ext : TEST_FILE_EXTENSIONS) {
-            File f = File.createTempFile(TEST_FILE_PREFIX, ext);
-            f.deleteOnExit();
-
-            OutputStream os = IOUtil.openFileForWriting(f);
-            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os));
-            writer.write(randomizedTestString);
-            writer.close();
-
-            InputStream is = IOUtil.openFileForReading(f);
-            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
-            String line = reader.readLine();
-            Assert.assertEquals(randomizedTestString, line);
-        }
-    }
-
-    @Test(groups = {"unix"})
-    public void testGetCanonicalPath() throws IOException {
-        String tmpPath = System.getProperty("java.io.tmpdir");
-        String userName = System.getProperty("user.name");
-
-        if (tmpPath.endsWith(userName)) {
-            tmpPath = tmpPath.substring(0, tmpPath.length() - userName.length());
-        }
-
-        File tmpDir = new File(tmpPath, userName);
-        tmpDir.mkdir();
-        File actual = new File(tmpDir, "actual.txt");
-        ProcessExecutor.execute(new String[]{"touch", actual.getAbsolutePath()});
-        File symlink = new File(tmpDir, "symlink.txt");
-        ProcessExecutor.execute(new String[]{"ln", "-s", actual.getAbsolutePath(), symlink.getAbsolutePath()});
-        File lnDir = new File(tmpDir, "symLinkDir");
-        ProcessExecutor.execute(new String[]{"ln", "-s", tmpDir.getAbsolutePath(), lnDir.getAbsolutePath()});
-        File lnToActual = new File(lnDir, "actual.txt");
-        File lnToSymlink = new File(lnDir, "symlink.txt");
-
-
-        File files[] = {actual, symlink, lnToActual, lnToSymlink};
-        for (File f : files) {
-            Assert.assertEquals(IOUtil.getFullCanonicalPath(f), actual.getCanonicalPath());
-        }
-
-        actual.delete();
-        symlink.delete();
-        lnToActual.delete();
-        lnToSymlink.delete();
-        lnDir.delete();
-        tmpDir.delete();
-    }
-
-    @Test
-    public void testUtfWriting() throws IOException {
-        final String utf8 = new StringWriter().append((char) 168).append((char) 197).toString();
-        for (String ext : TEST_FILE_EXTENSIONS) {
-            final File f = File.createTempFile(TEST_FILE_PREFIX, ext);
-            f.deleteOnExit();
-
-            final BufferedWriter writer = IOUtil.openFileForBufferedUtf8Writing(f);
-            writer.write(utf8);
-            CloserUtil.close(writer);
-
-            final BufferedReader reader = IOUtil.openFileForBufferedUtf8Reading(f);
-            final String line = reader.readLine();
-            Assert.assertEquals(utf8, line, f.getAbsolutePath());
-
-            CloserUtil.close(reader);
-
-        }
-    }
-
-    @Test
-    public void slurpLinesTest() throws FileNotFoundException {
-        Assert.assertEquals(IOUtil.slurpLines(SLURP_TEST_FILE), SLURP_TEST_LINES);
-    }
-
-    @Test
-    public void slurpWhitespaceOnlyFileTest() throws FileNotFoundException {
-        Assert.assertEquals(IOUtil.slurp(FIVE_SPACES_THEN_A_NEWLINE_THEN_FIVE_SPACES_FILE), "     \n     ");
-    }
-
-    @Test
-    public void slurpEmptyFileTest() throws FileNotFoundException {
-        Assert.assertEquals(IOUtil.slurp(EMPTY_FILE), "");
-    }
-
-    @Test
-    public void slurpTest() throws FileNotFoundException {
-        Assert.assertEquals(IOUtil.slurp(SLURP_TEST_FILE), CollectionUtil.join(SLURP_TEST_LINES, SLURP_TEST_LINE_SEPARATOR));
-    }
-
-    @Test(dataProvider = "fileTypeTestCases")
-    public void testFileType(final String path, boolean expectedIsRegularFile) {
-        final File file = new File(path);
-        Assert.assertEquals(IOUtil.isRegularPath(file), expectedIsRegularFile);
-    }
-
-    @Test(dataProvider = "unixFileTypeTestCases", groups = {"unix"})
-    public void testFileTypeUnix(final String path, boolean expectedIsRegularFile) {
-        final File file = new File(path);
-        Assert.assertEquals(IOUtil.isRegularPath(file), expectedIsRegularFile);
-    }
-
-    @DataProvider(name = "fileTypeTestCases")
-    private Object[][] fileTypeTestCases() {
-        return new Object[][]{
-                {existingTempFile.getAbsolutePath(), Boolean.TRUE},
-                {systemTempDir, Boolean.FALSE}
-
-        };
-    }
-
-    @DataProvider(name = "unixFileTypeTestCases")
-    private Object[][] unixFileTypeTestCases() {
-        return new Object[][]{
-                {"/dev/null", Boolean.FALSE},
-                {"/dev/stdout", Boolean.FALSE},
-                {"/non/existent/file", Boolean.TRUE},
-        };
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/Iso8601DateTest.java b/src/test/java/htsjdk/samtools/util/Iso8601DateTest.java
deleted file mode 100644
index ce0ae08..0000000
--- a/src/test/java/htsjdk/samtools/util/Iso8601DateTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Date;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class Iso8601DateTest {
-    @Test
-    public void testBasic() {
-        final String dateStr = "2008-12-15";
-        Iso8601Date first = new Iso8601Date(dateStr);
-        String firstFormatted = first.toString();
-        Iso8601Date second = new Iso8601Date(firstFormatted);
-        Assert.assertEquals(first, second);
-        String secondFormatted = second.toString();
-        Assert.assertEquals(firstFormatted, secondFormatted);
-    }
-
-    @Test
-    public void testMillisecondTruncation() {
-        // Create a Date with milliseconds
-        final Date now = new Date();
-        if (now.getTime() % 1000 == 0) {
-            now.setTime(now.getTime() + 3);
-        }
-        Iso8601Date isoDate = new Iso8601Date(now);
-        Assert.assertEquals(isoDate.getTime() % 1000, 0);
-        Assert.assertEquals(isoDate.getTime() / 1000, now.getTime() / 1000);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/IupacTest.java b/src/test/java/htsjdk/samtools/util/IupacTest.java
deleted file mode 100644
index 64b78c0..0000000
--- a/src/test/java/htsjdk/samtools/util/IupacTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2011 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.BamFileIoUtils;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMFileWriter;
-import htsjdk.samtools.SAMFileWriterFactory;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.Arrays;
-
-public class IupacTest {
-    @Test(dataProvider = "basicDataProvider")
-    public void basic(final String tempFileExtension) throws Exception {
-        final File outputFile = File.createTempFile("iupacTest.", tempFileExtension);
-        outputFile.deleteOnExit();
-        final SAMFileWriter writer = new SAMFileWriterFactory().makeSAMOrBAMWriter(new SAMFileHeader(), false, outputFile);
-        final String bases1 = "=ACMGRSVTWYHKDBNA";
-        final String bases2 = "A=ACMGRSVTWYHKDBN"; // Test both high-order and low-order base encoding.
-        final byte[] quals = new byte[bases1.length()];
-        Arrays.fill(quals, (byte) 20);
-        final String[] reads = {bases1, bases1.toLowerCase(), bases2, bases2.toLowerCase()};
-        for (int i = 0; i < reads.length; ++i) {
-            final SAMRecord rec = new SAMRecord(writer.getFileHeader());
-            rec.setReadName("read" + i);
-            rec.setReadUnmappedFlag(true);
-            rec.setReadString(reads[i]);
-            rec.setBaseQualities(quals);
-            writer.addAlignment(rec);
-        }
-        writer.close();
-        final SamReader reader = SamReaderFactory.makeDefault().open(outputFile);
-        final SAMRecordIterator it = reader.iterator();
-        for (int i = 0; i < reads.length; ++i) {
-            final SAMRecord rec = it.next();
-            Assert.assertEquals(rec.getReadString(), reads[i].toUpperCase());
-        }
-        reader.close();
-    }
-
-    @DataProvider(name = "basicDataProvider")
-    public Object[][] basicDataProvider() {
-        return new Object[][]{
-                {BamFileIoUtils.BAM_FILE_EXTENSION},
-                {".sam"}
-        };
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/MergingIteratorTest.java b/src/test/java/htsjdk/samtools/util/MergingIteratorTest.java
deleted file mode 100644
index d36bb6d..0000000
--- a/src/test/java/htsjdk/samtools/util/MergingIteratorTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2012 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Queue;
-
-public class MergingIteratorTest {
-
-	private static class QueueBackedIterator<T> implements CloseableIterator<T> {
-
-		private final Iterator<T> backing;
-		QueueBackedIterator(final Queue<T> queue) {
-			this.backing = queue.iterator();
-		}
-
-		@Override
-		public void close() {
-			// no-op
-		}
-
-		@Override
-		public boolean hasNext() {
-			return backing.hasNext();
-		}
-
-		@Override
-		public T next() {
-			return backing.next();
-		}
-
-		@Override
-		public void remove() {
-			backing.remove();
-		}
-	}
-
-	private static final Comparator<Integer> INTEGER_COMPARATOR = new Comparator<Integer>() {
-		@Override
-		public int compare(Integer integer, Integer integer2) {
-			return integer - integer2;
-		}
-	};
-
-	@Test
-	public void testOrderingAndCompleteness() {
-		final Queue<Integer> queueOne = new LinkedList<Integer>();
-		queueOne.add(1);
-		queueOne.add(3);
-		queueOne.add(5);
-
-		final Queue<Integer> queueTwo = new LinkedList<Integer>();
-		queueTwo.add(2);
-		queueTwo.add(4);
-		queueTwo.add(6);
-
-		final Queue<Integer> queueThree = new LinkedList<Integer>();
-		queueThree.add(0);
-		queueThree.add(1);
-
-		final Collection<CloseableIterator<Integer>> iterators = new ArrayList<CloseableIterator<Integer>>(3);
-		Collections.addAll(
-				iterators,
-				new QueueBackedIterator<Integer>(queueOne),
-				new QueueBackedIterator<Integer>(queueTwo),
-				new QueueBackedIterator<Integer>(queueThree));
-
-		final MergingIterator<Integer> mergingIterator = new MergingIterator<Integer>(
-				INTEGER_COMPARATOR,
-				iterators);
-
-		int count = 0;
-		int last = -1;
-		while (mergingIterator.hasNext()) {
-			final Integer integer = mergingIterator.next();
-			count++;
-			if (integer == 1) Assert.assertTrue(integer >= last);
-			else Assert.assertTrue(integer > last);
-			last = integer;
-		}
-
-		Assert.assertEquals(queueOne.size() + queueTwo.size() + queueThree.size(), count);
-	}
-
-	@Test
-	public void testIteratorsOfUnevenLength() {
-		final Queue<Integer> queueOne = new LinkedList<Integer>();
-		queueOne.add(1);
-		queueOne.add(3);
-		queueOne.add(5);
-		queueOne.add(7);
-		queueOne.add(9);
-		queueOne.add(11);
-		queueOne.add(13);
-
-		final Queue<Integer> queueTwo = new LinkedList<Integer>();
-		queueTwo.add(2);
-
-		final Collection<CloseableIterator<Integer>> iterators = new ArrayList<CloseableIterator<Integer>>(3);
-		Collections.addAll(
-				iterators,
-				new QueueBackedIterator<Integer>(queueOne),
-				new QueueBackedIterator<Integer>(queueTwo));
-
-		final MergingIterator<Integer> mergingIterator = new MergingIterator<Integer>(
-				INTEGER_COMPARATOR,
-				iterators);
-
-		int count = 0;
-		int last = -1;
-		while (mergingIterator.hasNext()) {
-			final Integer integer = mergingIterator.next();
-			count++;
-			Assert.assertTrue(integer > last);
-			last = integer;
-		}
-
-		Assert.assertEquals(queueOne.size() + queueTwo.size(), count);
-	}
-
-	@Test(expectedExceptions = IllegalStateException.class)
-	public void testOutOfOrderIterators() {
-		final Queue<Integer> queueOne = new LinkedList<Integer>();
-		queueOne.add(1);
-		queueOne.add(3);
-
-		final Queue<Integer> queueTwo = new LinkedList<Integer>();
-		queueTwo.add(4);
-		queueTwo.add(2);
-
-		final Collection<CloseableIterator<Integer>> iterators = new ArrayList<CloseableIterator<Integer>>(3);
-		Collections.addAll(
-				iterators,
-				new QueueBackedIterator<Integer>(queueOne),
-				new QueueBackedIterator<Integer>(queueTwo));
-
-		final MergingIterator<Integer> mergingIterator = new MergingIterator<Integer>(
-				INTEGER_COMPARATOR,
-				iterators);
-
-		Assert.assertEquals(mergingIterator.next().intValue(), 1);
-		Assert.assertEquals(mergingIterator.next().intValue(), 3);
-		Assert.assertEquals(mergingIterator.next().intValue(), 4);
-		mergingIterator.next(); // fails, because the next element would be "2"
-	}
-}
diff --git a/src/test/java/htsjdk/samtools/util/OverlapDetectorTest.java b/src/test/java/htsjdk/samtools/util/OverlapDetectorTest.java
deleted file mode 100644
index ecde965..0000000
--- a/src/test/java/htsjdk/samtools/util/OverlapDetectorTest.java
+++ /dev/null
@@ -1,240 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.*;
-
-public class OverlapDetectorTest {
-
-    @DataProvider(name="intervalsMultipleContigs")
-    public Object[][] intervalsMultipleContigs(){
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1", 10, 100),
-                new Interval("2", 200, 300)
-        );
-        final List<Locatable> empty = new ArrayList<>();
-        final List<Locatable> contig1 = Arrays.asList(
-                new Interval("1",  10, 100)
-        );
-        final List<Locatable> contig2 = Arrays.asList(
-                new Interval("2", 200, 300)
-        );
-
-        // returns input, query range, expected SimpleIntervals
-        return new Object[][] {
-                // we already test elsewhere that it works within a contig, so here we just have to make sure that
-                // it picks the correct contig and can deal with not-yet-mentioned contigs.
-                new Object[] {input, new Interval("1", 100, 200), contig1},
-                new Object[] {input, new Interval("1", 1, 5), empty},
-                new Object[] {input, new Interval("2", 100, 200), contig2},
-                new Object[] {input, new Interval("3", 100, 200), empty},
-        };
-    }
-
-    @Test(dataProvider = "intervalsMultipleContigs")
-    public void testOverlap(final List<Locatable> input, final Locatable query, final Collection<Locatable> expected) throws Exception {
-        final OverlapDetector<Locatable> targetDetector = new OverlapDetector<>(0, 0);
-        targetDetector.addAll(input, input);
-
-        final Collection<Locatable> actual = targetDetector.getOverlaps(query);
-        Assert.assertEquals(actual, expected);
-    }
-
-    @DataProvider(name="intervalsSameContig")
-    public Object[][] intervalsSameContig(){
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1",10,100)
-        );
-        final List<Locatable> empty = new ArrayList<>();
-        final List<Locatable> manyOverlapping = Arrays.asList(
-                new Interval("1",10,100),
-                // special case: multiple intervals starting at the same place
-                new Interval("1",20,50),
-                new Interval("1",20,51),
-                new Interval("1",20,52)
-        );
-        final List<Locatable> mixInput = Arrays.asList(
-                // ends before query interval
-                new Interval("1",10,20),
-                // ends in query interval
-                new Interval("1",10,60),
-                // equal to query interval
-                new Interval("1",30,50),
-                // covered by query interval
-                new Interval("1",40,42),
-                // ends after query interval
-                new Interval("1",45,60),
-                // starts after query interval
-                new Interval("1",60,100)
-        );
-        final List<Locatable> mixExpected = Arrays.asList(
-                // ends in query interval
-                new Interval("1",10,60),
-                // equal to query interval
-                new Interval("1",30,50),
-                // covered by query interval
-                new Interval("1",40,42),
-                // ends after query interval
-                new Interval("1",45,60)
-        );
-        // returns input single SimpleInterval, query range, expected SimpleInterval
-        return new Object[][] {
-                // single-point boundary cases
-                new Object[] {input, new Interval("1", 10, 10), input},
-                new Object[] {input, new Interval("1", 100, 100), input},
-                new Object[] {input, new Interval("1", 9, 9), empty},
-                new Object[] {input, new Interval("1", 11, 11), input},
-                new Object[] {input, new Interval("1", 99, 99), input},
-                new Object[] {input, new Interval("1", 101, 101), empty},
-                // different contig
-                new Object[] {input, new Interval("2", 10, 100), empty},
-                // empty list boundary case
-                new Object[] {empty, new Interval("1", 101, 101), empty},
-                // input exactly matches the query interval
-                new Object[] {input, new Interval("1", 10, 100), input},
-                // multiple intervals in the same place (potential edge case for indexing)
-                new Object[] {manyOverlapping, new Interval("1", 20, 20), manyOverlapping},
-                // input with multiple intervals
-                new Object[] {mixInput, new Interval("1",30,50), mixExpected},
-                // input with multiple intervals , non overlapping query
-                new Object[] {mixInput, new Interval("1",300,500), empty},
-        };
-    }
-
-    @Test(dataProvider = "intervalsSameContig")
-    public void testOverlap(final List<Locatable> input, final Interval query, final List<Locatable> expected) throws Exception {
-        final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
-
-        final Set<Locatable> actual = targetDetector.getOverlaps(query);
-        Assert.assertEquals(actual, new HashSet<>(expected));
-
-        Assert.assertEquals(targetDetector.overlapsAny(query), !expected.isEmpty());
-
-        Assert.assertEquals(new HashSet<>(targetDetector.getAll()), new HashSet<>(input));
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testOverlapsNullArg() throws Exception {
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1",10,100)
-        );
-        final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
-        targetDetector.overlapsAny(null);
-    }
-
-    @Test
-    public void testNoOverlapsAny() throws Exception {
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1",10,110)
-        );
-        final OverlapDetector<Locatable> trimmedTargetDetector = new OverlapDetector(20,20);
-        trimmedTargetDetector.addAll(input, input);
-        Assert.assertFalse(trimmedTargetDetector.overlapsAny( new Interval("1",50,85)));//no overlap because of trim
-        Assert.assertTrue(trimmedTargetDetector.getOverlaps( new Interval("1",50,85)).isEmpty());//no overlap because of trim
-
-        final OverlapDetector<Locatable> untrimmedTargetDetector = new OverlapDetector(0,0);
-        untrimmedTargetDetector.addAll(input, input);
-        Assert.assertTrue(untrimmedTargetDetector.overlapsAny( new Interval("1",50,85)));//overlaps - no trim
-    }
-
-    @Test
-    public void testLotsOfTinyIntervals() throws Exception {
-        final List<Locatable> input = new ArrayList<>();
-        final int n = 1000000;
-        for (int i = 0; i < n; i++) {
-            input.add(new Interval("1", 3*i+1, 3*i+2)); //1:1-2, 1:4-5, 1:7-8
-        }
-        final OverlapDetector<Locatable> detector = OverlapDetector.create(input);
-        final Set<Locatable> overlapping = detector.getOverlaps(new Interval("1", 1, 3 * n + 2));
-        Assert.assertEquals(new HashSet<>(input), overlapping);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testAddAllDifferentSizes() throws Exception {
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1",10,100)
-        );
-        final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
-
-        final List<Locatable> input1Interval = Arrays.asList(
-                new Interval("1",11,101)
-        );
-
-        final List<Locatable> input2Intervals = Arrays.asList(
-                new Interval("1",20,200),
-                new Interval("1",20,200)
-        );
-        targetDetector.addAll(input1Interval, input2Intervals);
-
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullObjectAddLHS() throws Exception {
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1",10,100)
-        );
-        final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
-        targetDetector.addLhs(null, new Interval("2",10,100));
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullIntervalAddLHS() throws Exception {
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1",10,100)
-        );
-        final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
-        targetDetector.addLhs(new Interval("2",10,100), null);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullObjectsAddAll() throws Exception {
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1",10,100)
-        );
-        final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
-        targetDetector.addAll(null, Arrays.asList(new Interval("2",10,100)));
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullIntervalsAddAll() throws Exception {
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1",10,100)
-        );
-        final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
-        targetDetector.addAll(Arrays.asList(new Interval("2",10,100)), null);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testDifferentSizesAddAll() throws Exception {
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1",10,100)
-        );
-        final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
-        final List<Locatable> l1 = Arrays.asList(new Interval("2", 10, 100));
-        final List<Locatable> l2 = Arrays.asList(new Interval("2", 10, 100), new Interval("3", 10, 100));
-        targetDetector.addAll(l1, l2);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullArgGetOverlaps() throws Exception {
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1",10,100)
-        );
-        final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
-        targetDetector.getOverlaps(null);
-    }
-
-    @Test
-    public void testAddTwice() throws Exception {
-        final List<Locatable> input = Arrays.asList(
-                new Interval("1",10,100),
-                new Interval("1",10,100)
-        );
-        final OverlapDetector<Locatable> detector = OverlapDetector.create(input);
-        final Set<Locatable> overlaps = detector.getOverlaps(new Interval("1", 50, 200));
-        Assert.assertEquals(overlaps.size(), 1);
-        Assert.assertEquals(overlaps, Collections.singleton(new Interval("1",10,100)));
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/PositionalOutputStreamTest.java b/src/test/java/htsjdk/samtools/util/PositionalOutputStreamTest.java
deleted file mode 100644
index 49de11d..0000000
--- a/src/test/java/htsjdk/samtools/util/PositionalOutputStreamTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 Daniel Gómez-Sánchez
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * @author Daniel Gomez-Sanchez (magicDGS)
- */
-public class PositionalOutputStreamTest {
-
-    @Test
-    public void basicPositionTest() throws Exception {
-        // wrapped null output stream to check
-        final PositionalOutputStream wrapped = new PositionalOutputStream(new OutputStream() {
-            @Override
-            public void write(int b) throws IOException {}
-        });
-        int position = 0;
-        // check that we start at position 0
-        Assert.assertEquals(wrapped.getPosition(), position);
-        // check that write one int just add one
-        wrapped.write(100);
-        Assert.assertEquals(wrapped.getPosition(), ++position);
-        // check that write a byte array adds its length
-        final byte[] bytes = new byte[]{1, 3, 5, 7};
-        wrapped.write(bytes);
-        position += bytes.length;
-        Assert.assertEquals(wrapped.getPosition(), position);
-        // check that write just some bytes from an array adds its length
-        wrapped.write(bytes, 2, 2);
-        position += 2;
-        Assert.assertEquals(wrapped.getPosition(), position);
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/util/QualityEncodingDetectorTest.java b/src/test/java/htsjdk/samtools/util/QualityEncodingDetectorTest.java
deleted file mode 100644
index 9e014d7..0000000
--- a/src/test/java/htsjdk/samtools/util/QualityEncodingDetectorTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.fastq.FastqReader;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-
-public class QualityEncodingDetectorTest {
-
-    private static class Testcase {
-        private final File f;
-        private final FastqQualityFormat q;
-
-        Testcase(final File file, final FastqQualityFormat qualityFormat) {
-            this.f = file;
-            this.q = qualityFormat;
-        }
-    }
-
-    final static List<Testcase> FASTQ_TESTCASES = Arrays.asList(
-            // Need to use full-range quality here, as Solexa and Illumina are near indistinguishable
-            new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa_full_range_as_solexa.fastq"), FastqQualityFormat.Solexa),
-            new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/s_1_sequence.txt"), FastqQualityFormat.Illumina),
-            new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/5k-30BB2AAXX.3.aligned.sam.fastq"), FastqQualityFormat.Standard)
-    );
-    final static List<Testcase> BAM_TESTCASES = Arrays.asList(
-            new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/unmapped.sam"), FastqQualityFormat.Standard),
-            new Testcase(new File("./src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam"), FastqQualityFormat.Standard),
-            new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa-as-standard.bam"), FastqQualityFormat.Solexa),
-            new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/illumina-as-standard.bam"), FastqQualityFormat.Illumina)
-
-    );
-
-    Object[][] renderObjectArrayArray(final List<Testcase> testcaseList) {
-        final Object[][] data = new Object[testcaseList.size()][];
-        for (int i = 0; i < data.length; i++) {
-            final Testcase testcase = testcaseList.get(i);
-            data[i] = new Object[]{testcase.f, testcase.q};
-        }
-        return data;
-    }
-
-    @DataProvider(name = "BAM_TESTCASES")
-    Object[][] bamTestcases() {
-        return renderObjectArrayArray(BAM_TESTCASES);
-    }
-
-    @DataProvider(name = "FASTQ_TESTCASES")
-    Object[][] fastqTestcases() {
-        return renderObjectArrayArray(FASTQ_TESTCASES);
-    }
-
-    @Test(dataProvider = "FASTQ_TESTCASES", groups = {"unix"})
-    public void testFastqQualityInference(final File input, final FastqQualityFormat expectedQualityFormat) {
-        final FastqReader reader = new FastqReader(input);
-        Assert.assertEquals(QualityEncodingDetector.detect(reader), expectedQualityFormat);
-        reader.close();
-    }
-
-    @Test(dataProvider = "BAM_TESTCASES", groups = {"unix"})
-    public void testBamQualityInference(final File input, final FastqQualityFormat expectedQualityFormat) {
-        final SamReader reader = SamReaderFactory.makeDefault().open(input);
-        Assert.assertEquals(QualityEncodingDetector.detect(reader), expectedQualityFormat);
-    }
-
-    @Test
-    public void testSmallBamForDetectorFailure() {
-        final SAMRecordSetBuilder samRecordSetBuilder = createSmallUnmappedSam();
-        Assert.assertNotSame(QualityEncodingDetector.detect(samRecordSetBuilder.getSamReader(),
-                null), FastqQualityFormat.Standard);
-    }
-
-    @Test
-    public void testSmallBamWithExpectedQuality() {
-        final SAMRecordSetBuilder samRecordSetBuilder = createSmallUnmappedSam();
-        Assert.assertEquals(QualityEncodingDetector.detect(samRecordSetBuilder.getSamReader(),
-                FastqQualityFormat.Standard), FastqQualityFormat.Standard);
-    }
-
-    @Test(expectedExceptions = SAMException.class)
-    public void testQualitySanity() {
-        final SAMRecordSetBuilder samRecordSetBuilder = createSmallUnmappedSam();
-        QualityEncodingDetector.detect(samRecordSetBuilder.getSamReader(),
-                FastqQualityFormat.Illumina);
-    }
-
-    private SAMRecordSetBuilder createSmallUnmappedSam() {
-        final SAMRecordSetBuilder samRecordSetBuilder = new SAMRecordSetBuilder();
-        samRecordSetBuilder.setReadLength(25);
-        samRecordSetBuilder.addFrag("READ0", -1, -1, false, true, null, "@@@FFFFFHHHHHJIJIIJIIJJJJ", -1);
-        samRecordSetBuilder.addFrag("READ1", -1, -1, false, true, null, "@@@FFFFFHHHHHJIJIIJIIJJJJ", -1);
-        samRecordSetBuilder.addFrag("READ2", -1, -1, false, true, null, "@CCFDFEDHHHFFHIIII at GH<FFH", -1);
-        samRecordSetBuilder.addFrag("READ3", -1, -1, false, true, null, "@@?DFFDFHFFHDHIIHIIEIIJGG", -1);
-        samRecordSetBuilder.addFrag("READ4", -1, -1, false, true, null, "@CCFFDDFHHHHHIIJJHFJJJJJH", -1);
-        samRecordSetBuilder.addFrag("READ5", -1, -1, false, true, null, "BCCFFFFFHHHHHJJJJJIJJJJJJ", -1);
-        samRecordSetBuilder.addFrag("READ6", -1, -1, false, true, null, "@@CDFFFFHHHFHHIJJJJJJJIJJ", -1);
-        samRecordSetBuilder.addFrag("READ7", -1, -1, false, true, null, "CCCFFFFFHHHHHJJJJIJJJJHII", -1);
-        samRecordSetBuilder.addFrag("READ8", -1, -1, false, true, null, "CCCFFFFFHHHHHJJJJJJJJJJJJ", -1);
-        return samRecordSetBuilder;
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/RelativeIso8601DateTest.java b/src/test/java/htsjdk/samtools/util/RelativeIso8601DateTest.java
deleted file mode 100644
index e4e9ef9..0000000
--- a/src/test/java/htsjdk/samtools/util/RelativeIso8601DateTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
-/** @author mccowan */
-
-public class RelativeIso8601DateTest {
-
-    // 1 second resolution is ISO date
-    private final static double DELTA_FOR_TIME = 1000;
-
-    @Test
-    public void testLazyInstance() {
-        final RelativeIso8601Date lazy = RelativeIso8601Date.generateLazyNowInstance();
-        Assert.assertEquals(lazy.toString(), RelativeIso8601Date.LAZY_NOW_LABEL);
-        Assert.assertEquals(lazy.toString(), RelativeIso8601Date.LAZY_NOW_LABEL);
-        Assert.assertEquals(lazy.toString(), RelativeIso8601Date.LAZY_NOW_LABEL);
-        Assert.assertEquals(lazy.getTime(), new Iso8601Date(new Date(System.currentTimeMillis())).getTime(), DELTA_FOR_TIME);
-        // Assert no exception thrown; this should be valid, because toString should now return an iso-looking date.
-        new Iso8601Date(lazy.toString());
-    }
-
-    @Test
-    public void testNonLazyInstance() {
-        final long time = new Iso8601Date(new Date(System.currentTimeMillis())).getTime(); // ISO strips off milliseconds
-
-        // Test both constructor methods
-        final List<RelativeIso8601Date> testDates = Arrays.<RelativeIso8601Date>asList(
-                new RelativeIso8601Date(new Date(time)),
-                new RelativeIso8601Date(new Iso8601Date(new Date(time)).toString())
-        );
-
-        for (final RelativeIso8601Date nonLazy : testDates) {
-            Assert.assertFalse(nonLazy.toString().equals(RelativeIso8601Date.LAZY_NOW_LABEL));
-            Assert.assertEquals((double) nonLazy.getTime(), (double) time, DELTA_FOR_TIME);
-            // Assert no exception thrown; this should be valid, because toString return an iso-looking date.
-            new RelativeIso8601Date(nonLazy.toString());
-        }
-    }
-
-    @Test
-    public void equalityTest() {
-        final String s = new Iso8601Date(new Date(12345)).toString();
-        final Iso8601Date iso8601Date = new Iso8601Date(s);
-        final RelativeIso8601Date relativeIso8601Date = new RelativeIso8601Date(s);
-        Assert.assertEquals(relativeIso8601Date.getTime(), iso8601Date.getTime(), DELTA_FOR_TIME);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/SamLocusIteratorTest.java b/src/test/java/htsjdk/samtools/util/SamLocusIteratorTest.java
deleted file mode 100644
index 262b7c9..0000000
--- a/src/test/java/htsjdk/samtools/util/SamLocusIteratorTest.java
+++ /dev/null
@@ -1,673 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author alecw at broadinstitute.org
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-public class SamLocusIteratorTest extends AbstractLocusIteratorTestTemplate {
-
-    /** Create the SamLocusIterator with the builder*/
-    private SamLocusIterator createSamLocusIterator(final SAMRecordSetBuilder builder) {
-        final SamLocusIterator ret = new SamLocusIterator(builder.getSamReader());
-        ret.setEmitUncoveredLoci(false);
-        return ret;
-    }
-
-    /**
-     * Test a simple with only matches, with both including or not indels
-     */
-    @Override
-    @Test
-    public void testBasicIterator() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "36M", null, 10);
-        }
-        // test both for include indels and do not include indels
-        for (final boolean incIndels : new boolean[] {false, true}) {
-            final SamLocusIterator sli = createSamLocusIterator(builder);
-            sli.setIncludeIndels(incIndels);
-            // make sure we accumulated depth for each position
-            int pos = startPosition;
-            for (final SamLocusIterator.LocusInfo li : sli) {
-                Assert.assertEquals(li.getPosition(), pos++);
-                Assert.assertEquals(li.getRecordAndPositions().size(), coverage);
-                Assert.assertEquals(li.size(), coverage);
-                // make sure that we are not accumulating indels
-                Assert.assertEquals(li.getDeletedInRecord().size(), 0);
-                Assert.assertEquals(li.getInsertedInRecord().size(), 0);
-            }
-        }
-    }
-
-    @Test
-    public void testMissingQualityString() {
-
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-
-            builder.addFrag("record" + i, 0, startPosition, true, false, "36M", "*", 0);
-        }
-        final SamLocusIterator sli = createSamLocusIterator(builder);
-
-        // make sure we accumulated depth of 2 for each position
-        int pos = 165;
-        for (final SamLocusIterator.LocusInfo li : sli) {
-            Assert.assertEquals(li.getPosition(), pos++);
-            Assert.assertEquals(li.getRecordAndPositions().size(), 2);
-            Assert.assertEquals(li.size(), 2);
-        }
-    }
-
-    /**
-     * Test the emit uncovered loci, with both including or not indels
-     */
-    @Override
-    @Test
-    public void testEmitUncoveredLoci() {
-
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "36M", null, 10);
-        }
-
-        final int coveredEnd = CoordMath.getEnd(startPosition, readLength);
-
-        // test both for include indels and do not include indels
-        for (final boolean incIndels : new boolean[] {false, true}) {
-            final SamLocusIterator sli = createSamLocusIterator(builder);
-            sli.setEmitUncoveredLoci(true);
-            sli.setIncludeIndels(incIndels);
-            // make sure we accumulated depth of 2 for each position
-            int pos = 1;
-            for (final SamLocusIterator.LocusInfo li : sli) {
-                Assert.assertEquals(li.getPosition(), pos++);
-                final int expectedReads;
-                if (li.getPosition() >= startPosition && li.getPosition() <= coveredEnd) {
-                    expectedReads = coverage;
-                } else {
-                    expectedReads = 0;
-                }
-                Assert.assertEquals(li.getRecordAndPositions().size(), expectedReads);
-                Assert.assertEquals(li.size(), expectedReads);
-                // make sure that we are not accumulating indels
-                Assert.assertEquals(li.getDeletedInRecord().size(), 0);
-                Assert.assertEquals(li.getInsertedInRecord().size(), 0);
-            }
-            Assert.assertEquals(pos, header.getSequence(0).getSequenceLength() + 1);
-        }
-    }
-
-    /**
-     * Test the quality filter, with both including or not indels
-     */
-    @Test
-    public void testQualityFilter() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            final String qualityString;
-            // half of the reads have a different quality
-            if (i % 2 == 0) {
-                qualityString = null;
-            } else {
-                qualityString = "+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*";
-            }
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "36M", qualityString, 10);
-        }
-
-        // test both for include indels and do not include indels
-        for (final boolean incIndels : new boolean[] {false, true}) {
-            final SamLocusIterator sli = createSamLocusIterator(builder);
-            sli.setQualityScoreCutoff(10);
-            sli.setIncludeIndels(incIndels);
-            // make sure we accumulated depth coverage for even positions, coverage/2 for odd positions
-            int pos = startPosition;
-            for (final SamLocusIterator.LocusInfo li : sli) {
-                Assert.assertEquals(li.getRecordAndPositions().size(), (pos % 2 == 0) ? coverage / 2 : coverage);
-                Assert.assertEquals(li.size(), (pos % 2 == 0) ? coverage / 2 : coverage);
-                Assert.assertEquals(li.getPosition(), pos++);
-                // make sure that we are not accumulating indels
-                Assert.assertEquals(li.getDeletedInRecord().size(), 0);
-                Assert.assertEquals(li.getInsertedInRecord().size(), 0);
-            }
-        }
-    }
-
-    /**
-     * Test a simple deletion, with both including or not indels
-     */
-    @Test
-    public void testSimpleDeletion() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "18M10D18M", null, 10);
-        }
-        final int deletionStart = 183;
-        final int deletionEnd = 192;
-        // test both for include indels and do not include indels
-        for (final boolean incIndels : new boolean[] {false, true}) {
-            final SamLocusIterator sli = createSamLocusIterator(builder);
-            sli.setIncludeIndels(incIndels);
-            // make sure we accumulated depth for each position
-            int pos = startPosition;
-            for (final SamLocusIterator.LocusInfo li : sli) {
-                boolean isDeletedPosition = (pos >= deletionStart && pos <= deletionEnd);
-                if (!incIndels && isDeletedPosition) {
-                    pos = deletionEnd + 1;
-                    isDeletedPosition = false;
-                }
-                Assert.assertEquals(li.getPosition(), pos++);
-                if (isDeletedPosition) {
-                    // make sure there are no reads without indels
-                    Assert.assertEquals(li.getRecordAndPositions().size(), 0);
-                    Assert.assertEquals(li.size(), coverage); // should include deletions
-
-                    // make sure that we are accumulating indels
-                    Assert.assertEquals(li.getDeletedInRecord().size(), coverage);
-                    Assert.assertEquals(li.getInsertedInRecord().size(), 0);
-                } else {
-                    // make sure we are accumulating normal coverage
-                    Assert.assertEquals(li.getRecordAndPositions().size(), coverage);
-                    Assert.assertEquals(li.size(), coverage);
-
-                    // make sure that we are not accumulating indels
-                    Assert.assertEquals(li.getDeletedInRecord().size(), 0);
-                    Assert.assertEquals(li.getInsertedInRecord().size(), 0);
-                }
-            }
-        }
-    }
-
-    /**
-     * Test a simple insertion, with both including or not indels
-     */
-    @Test
-    public void testSimpleInsertion() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "30M3I3M", null, 10);
-        }
-        final int insStart = 194;
-        // test both for include indels and do not include indels
-        for (final boolean incIndels : new boolean[] {false, true}) {
-            final SamLocusIterator sli = createSamLocusIterator(builder);
-            sli.setIncludeIndels(incIndels);
-            // make sure we accumulated depth for each position
-            int pos = startPosition;
-            for (final SamLocusIterator.LocusInfo li : sli) {
-                Assert.assertEquals(li.getPosition(), pos++);
-                // make sure we are accumulating normal coverage
-                Assert.assertEquals(li.getRecordAndPositions().size(), coverage);
-                Assert.assertEquals(li.size(), coverage);
-
-                // make sure that we are not accumulating deletions
-                Assert.assertEquals(li.getDeletedInRecord().size(), 0);
-                if (incIndels && li.getPosition() == insStart) {
-                    Assert.assertEquals(li.getInsertedInRecord().size(), coverage);
-                } else {
-                    Assert.assertEquals(li.getInsertedInRecord().size(), 0);
-                }
-            }
-        }
-    }
-
-    /**
-     * Test an insertion at the start of the read, with both including or not indels
-     */
-    @Test
-    public void testStartWithInsertion() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "3I33M", null, 10);
-        }
-
-        // test both for include indels and do not include indels
-        for (final boolean incIndels : new boolean[] {false, true}) {
-            final SamLocusIterator sli = createSamLocusIterator(builder);
-            sli.setIncludeIndels(incIndels);
-            // make sure we accumulated depth for each position
-            int pos = (incIndels) ? startPosition - 1 : startPosition;
-            boolean indelPosition = incIndels;
-            for (final SamLocusIterator.LocusInfo li : sli) {
-                Assert.assertEquals(li.getPosition(), pos);
-                // accumulation of coverage
-                Assert.assertEquals(li.getRecordAndPositions().size(), (indelPosition) ? 0 : coverage);
-                Assert.assertEquals(li.size(), (indelPosition) ? 0 : coverage);
-
-                // no accumulation of deletions
-                Assert.assertEquals(li.getDeletedInRecord().size(), 0);
-                // accumulation of insertion
-                Assert.assertEquals(li.getInsertedInRecord().size(), (indelPosition) ? coverage : 0);
-                // check offsets of the insertion
-                if (indelPosition) {
-                    Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 0);
-                    Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 0);
-                    indelPosition = false;
-                }
-                pos++;
-            }
-        }
-    }
-
-    /**
-     * Test an insertion at the start of a soft-clipped read, with both including or not indels
-     */
-    @Test
-    public void testStartWithSoftClipAndInsertion() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "1S3I32M", null, 10);
-        }
-
-        // test both for include indels and do not include indels
-        for (final boolean incIndels : new boolean[] {false, true}) {
-            final SamLocusIterator sli = createSamLocusIterator(builder);
-            sli.setIncludeIndels(incIndels);
-            // make sure we accumulated depth for each position
-            int pos = (incIndels) ? startPosition - 1 : startPosition;
-            boolean indelPosition = incIndels;
-            for (final SamLocusIterator.LocusInfo li : sli) {
-                Assert.assertEquals(li.getPosition(), pos);
-                // accumulation of coverage
-                Assert.assertEquals(li.getRecordAndPositions().size(), (indelPosition) ? 0 : coverage);
-                Assert.assertEquals(li.size(), (indelPosition) ? 0 : coverage);
-                // no accumulation of deletions
-                Assert.assertEquals(li.getDeletedInRecord().size(), 0);
-                // accumulation of insertion
-                Assert.assertEquals(li.getInsertedInRecord().size(), (indelPosition) ? coverage : 0);
-                // check offsets of the insertion
-                if (indelPosition) {
-                    Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 1);
-                    Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 1);
-                    indelPosition = false;
-                }
-                pos++;
-            }
-        }
-    }
-
-    /**
-     * Test an insertion after N in CIGAR
-     */
-    @Test
-    public void testNBeforeInsertion() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "2M4N3I27M", null, 10);
-        }
-        final int startN = 167;
-        final int endN = 170;
-
-        // test both for include indels and do not include indels
-        for (final boolean incIndels : new boolean[] {false, true}) {
-            final SamLocusIterator sli = createSamLocusIterator(builder);
-            sli.setIncludeIndels(incIndels);
-            // make sure we accumulated depth for each position
-            int pos = startPosition;
-            for (final SamLocusIterator.LocusInfo li : sli) {
-                // skipping Ns
-                if (pos >= startN && pos <= endN) {
-                    pos = (incIndels) ? endN : endN + 1;
-                }
-                Assert.assertEquals(li.getPosition(), pos);
-                // accumulation of coverage
-                Assert.assertEquals(li.getRecordAndPositions().size(), (pos == endN) ? 0 : coverage);
-                Assert.assertEquals(li.size(), (pos == endN) ? 0 : coverage);
-                // no accumulation of deletions
-                Assert.assertEquals(li.getDeletedInRecord().size(), 0);
-                // accumulation of insertion
-                Assert.assertEquals(li.getInsertedInRecord().size(), (pos == endN) ? coverage : 0);
-                // check offsets of the insertion
-                if (pos == endN) {
-                    Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 2);
-                    Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 2);
-                }
-                pos++;
-            }
-        }
-    }
-
-    /**
-     * Test a deletion after N in CIGAR
-     */
-    @Test
-    public void testNBeforeDeletion() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "2M4N4D5M", null, 10);
-        }
-        final int startN = 167;
-        final int endN = 170;
-        final int startDel = 171;
-        final int endDel = 174;
-
-        // test both for include indels and do not include indels
-        for (final boolean incIndels : new boolean[] {false, true}) {
-            final SamLocusIterator sli = createSamLocusIterator(builder);
-            sli.setIncludeIndels(incIndels);
-            // make sure we accumulated depth for each position
-            int pos = startPosition;
-            for (final SamLocusIterator.LocusInfo li : sli) {
-                if (pos >= startN && pos <= endN) {
-                    if (incIndels) {
-                        // skipping Ns
-                        pos = endN + 1;
-                    } else {
-                        // skip deletions
-                        pos = endDel + 1;
-                    }
-                }
-                final boolean insideDeletion = incIndels && (pos >= startDel && pos <= endDel);
-                Assert.assertEquals(li.getPosition(), pos);
-                // accumulation of coverage
-                Assert.assertEquals(li.getRecordAndPositions().size(), (insideDeletion) ? 0 : coverage);
-                Assert.assertEquals(li.size(), coverage); // either will be all deletions, or all non-deletions, but always of size `coverage`.
-                // accumulation of deletions
-                Assert.assertEquals(li.getDeletedInRecord().size(), (insideDeletion) ? coverage : 0);
-                // no accumulation of insertion
-                Assert.assertEquals(li.getInsertedInRecord().size(), 0);
-                // check offsets of the insertion
-                if (pos == endN) {
-                    Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 2);
-                    Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 2);
-                }
-                pos++;
-            }
-        }
-    }
-
-    /**
-     * Try all CIGAR operands (except H and P) and confirm that loci produced by SamLocusIterator are as expected,
-     * with both including or not indels
-     */
-    @Override
-    @Test
-    public void testSimpleGappedAlignment() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        for (int i = 0; i < coverage; i++) {
-            // add a negative-strand fragment mapped on chrM with base quality of 10
-            builder.addFrag("record" + i, 0, startPosition, true, false, "3S3M3N3M3D3M3I18M3S", null, 10);
-        }
-
-        // make sure we accumulated depth of 2 for each position
-        final int[] expectedPositions = new int[]{
-                // 3S
-                165, 166, 167, // 3M
-                // 3N
-                171, 172, 173, // 3M
-                174, 175, 176, // 3D
-                177, 178, 179, // 3M
-                // 3I
-                180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197}; // 18M
-
-        final int[] expectedReadOffsets = new int[]{
-                // 3S
-                3, 4, 5, // 3M
-                // 3N
-                6, 7, 8, // 3M
-                8, 8, 8, // 3D previous 0-based offset
-                9, 10, 11, // 3M
-                // 3I
-                15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 // 3M
-        };
-
-        // to check the range of the insertion
-        final int firstDelBase = 174;
-        final int lastDelBase = 176;
-
-        final int expectedInsertionPosition = 179; // previous reference base
-        final int expectedInsertionOffset = 12; // first read base in the insertion
-
-        // test both for include indels and do not include indels
-        for (final boolean incIndels : new boolean[] {false, true}) {
-            final SamLocusIterator sli = createSamLocusIterator(builder);
-            sli.setIncludeIndels(incIndels);
-
-            int i = 0;
-            for (final SamLocusIterator.LocusInfo li : sli) {
-                // check if it is in the deletion range
-                boolean inDelRange = (expectedPositions[i] >= firstDelBase && expectedPositions[i] <= lastDelBase);
-                // if we are not including indels, the expected position index change if it is in an deletion range
-                if (!incIndels && inDelRange) {
-                    i += 3;
-                    inDelRange = false; // set to false to do not check the range of deletions
-                }
-                // check if the LocusInfo is the expected
-                Assert.assertEquals(li.getPosition(), expectedPositions[i]);
-                // check the insertions
-                if (incIndels && li.getPosition() == expectedInsertionPosition) {
-                    // check the accumulated coverage
-                    Assert.assertEquals(li.getInsertedInRecord().size(), coverage);
-                    // check the record offset
-                    Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), expectedInsertionOffset);
-                    Assert.assertEquals(li.getInsertedInRecord().get(1).getOffset(), expectedInsertionOffset);
-                } else {
-                    Assert.assertEquals(li.getInsertedInRecord().size(), 0);
-                }
-                // check the range of deletions
-                if (inDelRange) {
-                    // check the coverage for insertion and normal records
-                    Assert.assertEquals(li.getDeletedInRecord().size(), coverage);
-                    Assert.assertEquals(li.getRecordAndPositions().size(), 0);
-                    Assert.assertEquals(li.size(), coverage); // includes deletions
-                    // check the offset for the deletion
-                    Assert.assertEquals(li.getDeletedInRecord().get(0).getOffset(), expectedReadOffsets[i]);
-                    Assert.assertEquals(li.getDeletedInRecord().get(1).getOffset(), expectedReadOffsets[i]);
-                } else {
-                    // if it is not a deletion, perform the same test as before
-                    Assert.assertEquals(li.getRecordAndPositions().size(), coverage);
-                    Assert.assertEquals(li.size(), coverage);
-                    // Assert.assertEquals(li.getDeletedInRecord().size(), 0);
-                    Assert.assertEquals(li.getRecordAndPositions().get(0).getOffset(), expectedReadOffsets[i]);
-                    Assert.assertEquals(li.getRecordAndPositions().get(1).getOffset(), expectedReadOffsets[i]);
-                }
-                ++i;
-            }
-        }
-
-
-    }
-
-    /**
-     * Test two reads that overlap because one has a deletion in the middle of it, without tracking indels
-     */
-    @Override
-    @Test
-    public void testOverlappingGappedAlignmentsWithoutIndels() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        // Were it not for the gap, these two reads would not overlap
-        builder.addFrag("record1", 0, startPosition, true, false, "18M10D18M", null, 10);
-        builder.addFrag("record2", 0, 206, true, false, "36M", null, 10);
-
-        final SamLocusIterator sli = createSamLocusIterator(builder);
-
-        // 5 base overlap btw the two reads
-        final int numBasesCovered = 36 + 36 - 5;
-        final int[] expectedReferencePositions = new int[numBasesCovered];
-        final int[] expectedDepths = new int[numBasesCovered];
-        final int[][] expectedReadOffsets = new int[numBasesCovered][];
-
-        int i;
-        // First 18 bases are from the first read
-        for (i = 0; i < 18; ++i) {
-            expectedReferencePositions[i] = startPosition + i;
-            expectedDepths[i] = 1;
-            expectedReadOffsets[i] = new int[]{i};
-        }
-        // Gap of 10, then 13 bases from the first read
-        for (; i < 36 - 5; ++i) {
-            expectedReferencePositions[i] = startPosition + 10 + i;
-            expectedDepths[i] = 1;
-            expectedReadOffsets[i] = new int[]{i};
-        }
-        // Last 5 bases of first read overlap first 5 bases of second read
-        for (; i < 36; ++i) {
-            expectedReferencePositions[i] = startPosition + 10 + i;
-            expectedDepths[i] = 2;
-            expectedReadOffsets[i] = new int[]{i, i - 31};
-
-        }
-        // Last 31 bases of 2nd read
-        for (; i < 36 + 36 - 5; ++i) {
-            expectedReferencePositions[i] = startPosition + 10 + i;
-            expectedDepths[i] = 1;
-            expectedReadOffsets[i] = new int[]{i - 31};
-        }
-
-        i = 0;
-        for (final SamLocusIterator.LocusInfo li : sli) {
-            Assert.assertEquals(li.getRecordAndPositions().size(), expectedDepths[i]);
-            Assert.assertEquals(li.size(), expectedDepths[i]);
-            Assert.assertEquals(li.getPosition(), expectedReferencePositions[i]);
-            Assert.assertEquals(li.getRecordAndPositions().size(), expectedReadOffsets[i].length);
-            for (int j = 0; j < expectedReadOffsets[i].length; ++j) {
-                Assert.assertEquals(li.getRecordAndPositions().get(j).getOffset(), expectedReadOffsets[i][j]);
-            }
-            // make sure that we are not accumulating indels
-            Assert.assertEquals(li.getDeletedInRecord().size(), 0);
-            Assert.assertEquals(li.getInsertedInRecord().size(), 0);
-            ++i;
-        }
-    }
-
-    /**
-     * Test two reads that overlap because one has a deletion in the middle of it, tracking indels
-     */
-    @Test
-    public void testOverlappingGappedAlignmentsWithIndels() {
-        final SAMRecordSetBuilder builder = getRecordBuilder();
-        // add records up to coverage for the test in that position
-        final int startPosition = 165;
-        // Were it not for the gap, these two reads would not overlap
-        builder.addFrag("record1", 0, startPosition, true, false, "18M10D18M", null, 10);
-        builder.addFrag("record2", 0, 206, true, false, "36M", null, 10);
-
-        final SamLocusIterator sli = createSamLocusIterator(builder);
-        sli.setIncludeIndels(true);
-
-        // 46 for the gapped alignment, and 5 base overlap btw the two reads
-        final int numBasesCovered = 46 + 36 - 5;
-        final int[] expectedReferencePositions = new int[numBasesCovered];
-        final int[] expectedDepths = new int[numBasesCovered];
-        final int[] expectedDelDepths = new int[numBasesCovered];
-        final int[][] expectedReadOffsets = new int[numBasesCovered][];
-        final int expectedDelOffset = 17; // previous 0-based offset
-
-        int i;
-        // First 18 bases are from the first read
-        for (i = 0; i < 18; ++i) {
-            expectedReferencePositions[i] = startPosition + i;
-            expectedDepths[i] = 1;
-            expectedDelDepths[i] = 0;
-            expectedReadOffsets[i] = new int[]{i};
-        }
-        // Gap of 10
-        for (; i < 18 + 10; ++i) {
-            expectedReferencePositions[i] = startPosition + i;
-            expectedDepths[i] = 0;
-            expectedDelDepths[i] = 1;
-            expectedReadOffsets[i] = new int[0];
-        }
-        // the next bases for the first read (without the 5 overlapping)
-        for (; i < 46 - 5; ++i) {
-            expectedReferencePositions[i] = startPosition + i;
-            expectedDepths[i] = 1;
-            expectedDelDepths[i] = 0;
-            expectedReadOffsets[i] = new int[]{i - 10};
-        }
-        // last 5 bases of the first read overlap first 5 bases of second read
-        for (; i < 46; ++i) {
-            expectedReferencePositions[i] = startPosition + i;
-            expectedDepths[i] = 2;
-            expectedDelDepths[i] = 0;
-            expectedReadOffsets[i] = new int[]{i - 10, i + 10 - 46 - 5};
-        }
-        // Last 31 bases of 2nd read
-        for (; i < numBasesCovered; ++i) {
-            expectedReferencePositions[i] = startPosition + i;
-            expectedDepths[i] = 1;
-            expectedDelDepths[i] = 0;
-            expectedReadOffsets[i] = new int[]{i + 10 - 46 - 5};
-        }
-        i = 0;
-        for (final SamLocusIterator.LocusInfo li : sli) {
-            // checking the same as without indels
-            Assert.assertEquals(li.getRecordAndPositions().size(), expectedDepths[i]);
-            Assert.assertEquals(li.size(), expectedDepths[i] + expectedDelDepths[i]); // include deletions
-            Assert.assertEquals(li.getPosition(), expectedReferencePositions[i]);
-            Assert.assertEquals(li.getRecordAndPositions().size(), expectedReadOffsets[i].length);
-            for (int j = 0; j < expectedReadOffsets[i].length; ++j) {
-                Assert.assertEquals(li.getRecordAndPositions().get(j).getOffset(), expectedReadOffsets[i][j]);
-            }
-            // check the deletions
-            Assert.assertEquals(li.getDeletedInRecord().size(), expectedDelDepths[i]);
-            if (expectedDelDepths[i] != 0) {
-                Assert.assertEquals(li.getDeletedInRecord().get(0).getOffset(), expectedDelOffset);
-            }
-            // checking that insertions are not accumulating
-            Assert.assertEquals(li.getInsertedInRecord().size(), 0);
-            ++i;
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/util/SequenceUtilTest.java b/src/test/java/htsjdk/samtools/util/SequenceUtilTest.java
deleted file mode 100644
index 008cca5..0000000
--- a/src/test/java/htsjdk/samtools/util/SequenceUtilTest.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.*;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import htsjdk.samtools.reference.ReferenceSequenceFileFactory;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class SequenceUtilTest {
-    private static final String HEADER = "@HD\tVN:1.0\tSO:unsorted\n";
-    private static final String SEQUENCE_NAME=
-        "@SQ\tSN:phix174.seq\tLN:5386\tUR:/seq/references/PhiX174/v0/PhiX174.fasta\tAS:PhiX174\tM5:3332ed720ac7eaa9b3655c06f6b9e196";
-
-    @Test
-    public void testExactMatch() {
-        final SAMSequenceDictionary sd1 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
-                "3332ed720ac7eaa9b3655c06f6b9e196");
-        final SAMSequenceDictionary sd2 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
-                "3332ed720ac7eaa9b3655c06f6b9e196");
-        SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2);
-    }
-
-    @DataProvider
-    public Object[][] compatibleNonEqualLists(){
-        final String s = HEADER +
-                String.format("@SQ\tSN:phix174.seq\tLN:%d\tUR:%s\tAS:PhiX174\tM5:%s\n", 5386, "/seq/references/PhiX174/v0/PhiX174.fasta", "3332ed720ac7eaa9b3655c06f6b9e196")+
-                String.format("@SQ\tSN:phix175.seq\tLN:%d\tUR:%s\tAS:HiMom\tM5:%s\n", 5385, "/seq/references/PhiX174/v0/HiMom.fasta", "deadbeed");
-
-        return new Object[][]{ {makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
-                "3332ed720ac7eaa9b3655c06f6b9e196"),
-                new SAMTextHeaderCodec().decode(new StringLineReader(s), null).getSequenceDictionary()}};
-    }
-
-    @Test(dataProvider = "compatibleNonEqualLists")
-    public void testCompatible(SAMSequenceDictionary sd1, SAMSequenceDictionary sd2) {
-         SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2, true);
-    }
-
-    @Test(dataProvider = "compatibleNonEqualLists",expectedExceptions = SequenceUtil.SequenceListsDifferException.class)
-    public void testinCompatible(SAMSequenceDictionary sd1, SAMSequenceDictionary sd2) {
-        SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2, false);
-    }
-
-    @Test(expectedExceptions = SequenceUtil.SequenceListsDifferException.class)
-    public void testMismatch() {
-        final SAMSequenceDictionary sd1 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
-                "3332ed720ac7eaa9b3655c06f6b9e196");
-        final SAMSequenceDictionary sd2 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
-                "deadbeef");
-        SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2);
-        Assert.fail();
-    }
-
-    @Test
-    public void testFileColonDifference() {
-        final SAMSequenceDictionary sd1 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
-                "3332ed720ac7eaa9b3655c06f6b9e196");
-        final SAMSequenceDictionary sd2 = makeSequenceDictionary(5386, "file:/seq/references/PhiX174/v0/PhiX174.fasta",
-                "3332ed720ac7eaa9b3655c06f6b9e196");
-        SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2);
-    }
-
-    @Test
-    public void testURDifferent() {
-        final SAMSequenceDictionary sd1 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
-                "3332ed720ac7eaa9b3655c06f6b9e196");
-        final SAMSequenceDictionary sd2 = makeSequenceDictionary(5386, "file:/seq/references/PhiX174/v1/PhiX174.fasta",
-                "3332ed720ac7eaa9b3655c06f6b9e196");
-        SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2);
-    }
-
-    private SAMSequenceDictionary makeSequenceDictionary(final int length, final String ur, final String m5) {
-        final String s = HEADER +
-                String.format("@SQ\tSN:phix174.seq\tLN:%d\tUR:%s\tAS:PhiX174\tM5:%s\n", length, ur, m5);
-        return new SAMTextHeaderCodec().decode(new StringLineReader(s), null).getSequenceDictionary();
-    }
-
-    @Test(dataProvider = "makeReferenceFromAlignment")
-    public void testMakeReferenceFromAlignment(final String seq, final String cigar, final String md,
-                                               boolean includeReferenceBasesForDeletions,
-                                               final String expectedReference) {
-        final SAMRecord rec = new SAMRecord(null);
-        rec.setReadName("test");
-        rec.setReadString(seq);
-        rec.setCigarString(cigar);
-        rec.setAttribute(SAMTag.MD.name(), md);
-        final byte[] refBases = SequenceUtil.makeReferenceFromAlignment(rec, includeReferenceBasesForDeletions);
-        Assert.assertEquals(StringUtil.bytesToString(refBases), expectedReference);
-    }
-
-    @DataProvider(name = "makeReferenceFromAlignment")
-    public Object[][] testMakeReferenceFromAlignmentDataProvider() {
-        return new Object[][] {
-               {"ACGTACGTACGT", "12M2H", "4GAAA4", true, "ACGTGAAAACGT"},
-                {"ACGTACGTACGT", "2H12M", "12", false, "ACGTACGTACGT"},
-                {"ACGTACGTACGT", "4M4I4M2H", "8", false, "ACGT----ACGT"},
-                {"ACGTACGTACGT", "2S4M2I4M2S", "8", false, "00GTAC--ACGT00"},
-                {"ACGTACGTACGT", "6M2D6M2H", "4GA^TT0TG4", true, "ACGTGATTTGACGT"},
-                {"ACGTACGTACGT", "6M2D6M2H", "4GA^TT0TG4", false, "ACGTGATGACGT"},
-                // When CIGAR has N, MD will not have skipped bases.
-                {"ACGTACGTACGT", "6M2N6M2H", "4GA0TG4", true, "ACGTGANNTGACGT"},
-                {"ACGTACGTACGT", "6M2N6M2H", "4GA0TG4", false, "ACGTGATGACGT"},
-                {"ACGTACGTACGT", "6M2N6M2H", "4GATG4", true, "ACGTGANNTGACGT"},
-                {"ACGTACGTACGT", "6M2N6M2H", "4GATG4", false, "ACGTGATGACGT"},
-        };
-    }
-
-    @Test(dataProvider = "mismatchCountsDataProvider")
-    public void testCountMismatches(final String readString, final String cigar, final String reference,
-                                    final int expectedMismatchesExact, final int expectedMismatchesAmbiguous) {
-        final SAMRecord rec = new SAMRecord(null);
-        rec.setReadName("test");
-        rec.setReadString(readString);
-        rec.setCigarString(cigar);
-
-        final byte[] refBases = StringUtil.stringToBytes(reference);
-
-        final int nExact = SequenceUtil.countMismatches(rec, refBases, -1, false, false);
-        Assert.assertEquals(nExact, expectedMismatchesExact);
-
-        final int nAmbiguous = SequenceUtil.countMismatches(rec, refBases, -1, false, true);
-        Assert.assertEquals(nAmbiguous, expectedMismatchesAmbiguous);
-    }
-
-    @DataProvider(name="mismatchCountsDataProvider")
-    public Object[][] testMakeMismatchCountsDataProvider() {
-        // note: R=A|G
-        return new Object[][] {
-                {"A", "1M", "A", 0, 0},
-                {"A", "1M", "R", 1, 0},
-                {"G", "1M", "R", 1, 0},
-                {"C", "1M", "R", 1, 1},
-                {"T", "1M", "R", 1, 1},
-                {"N", "1M", "R", 1, 1},
-                {"R", "1M", "A", 1, 1},
-                {"R", "1M", "C", 1, 1},
-                {"R", "1M", "G", 1, 1},
-                {"R", "1M", "T", 1, 1},
-                {"R", "1M", "N", 1, 0},
-                {"R", "1M", "R", 0, 0},
-                {"N", "1M", "N", 0, 0}
-        };
-    }
-
-    @Test(dataProvider = "countInsertedAndDeletedBasesTestCases")
-    public void testCountInsertedAndDeletedBases(final String cigarString, final int insertedBases, final int deletedBases) {
-        final Cigar cigar = TextCigarCodec.decode(cigarString);
-        Assert.assertEquals(SequenceUtil.countInsertedBases(cigar), insertedBases);
-        Assert.assertEquals(SequenceUtil.countDeletedBases(cigar), deletedBases);
-    }
-
-    @DataProvider(name = "countInsertedAndDeletedBasesTestCases")
-    public Object[][] countInsertedAndDeletedBasesTestCases() {
-        return new Object[][] {
-                {"2H2S32M", 0, 0},
-                {"2H2S32M12I2M2I3M", 14, 0},
-                {"32M2D10M", 0, 2},
-                {"32M2D10M3D1M", 0, 5},
-                {"2H2S32M12I2M3D1M2I3M2D1M", 14, 5}
-        };
-    }
-
-    @DataProvider(name = "testKmerGenerationTestCases")
-    public Object[][] testKmerGenerationTestCases() {
-        return new Object[][] {
-                {0, new String[]{""}},
-                {1, new String[]{"A","C","G","T"}},
-                {2, new String[]{"AA","AC","AG","AT","CA","CC","CG","CT","GA","GC","GG","GT","TA","TC","TG","TT"}}
-        };
-    }
-
-    @Test(dataProvider = "testKmerGenerationTestCases")
-    public void testKmerGeneration(final int length, final String[] expectedKmers) {
-        final Set<String> actualSet = new HashSet<String>();
-        for (final byte[] kmer : SequenceUtil.generateAllKmers(length)) {
-            actualSet.add(StringUtil.bytesToString(kmer));
-        }
-        final Set<String> expectedSet = new HashSet<String>(Arrays.asList(expectedKmers));
-        Assert.assertTrue(actualSet.equals(expectedSet));
-    }
-
-    @DataProvider(name = "testBisulfiteConversionDataProvider")
-    public Object[][] testBisulfiteConversionDataProvider() {
-        // C ref -> T read on the positive strand, and G ref -> A read on the negative strand
-        return new Object[][] {
-                {'C', 'T', false, false},
-                {'C', 'A', false, false},
-                {'C', 'C', false, false},
-                {'T', 'C', true, false},
-                {'G', 'T', false, false},
-                {'G', 'A', false, false},
-                {'G', 'G', false, false},
-                {'A', 'G', false, true}
-        };
-    }
-
-    @Test(dataProvider = "testBisulfiteConversionDataProvider")
-    public void testBisulfiteConversion(final char readBase, final char refBase, final boolean posStrandExpected, final boolean negStrandExpected) {
-        final boolean posStrand = SequenceUtil.isBisulfiteConverted((byte) readBase, (byte) refBase, false);
-        Assert.assertEquals(posStrand, posStrandExpected);
-        final boolean negStrand = SequenceUtil.isBisulfiteConverted((byte) readBase, (byte) refBase, true);
-        Assert.assertEquals(negStrand, negStrandExpected);
-    }
-
-    @Test(dataProvider = "basesEqualDataProvider")
-    public void testBasesEqual(final char base1, final char base2,
-                               final boolean expectedB1EqualsB2,
-                               final boolean expectedB1ReadMatchesB2Ref,
-                               final boolean expectedB2ReadMatchesB1Ref) {
-
-        final char[] base1UcLc = new char[] { toUpperCase(base1), toLowerCase(base1) };
-        final char[] base2UcLc = new char[] { toUpperCase(base2), toLowerCase(base2) };
-        // Test over all permutations - uc vs uc, uc vs lc, lc vs uc, lc vs lc
-        for (char theBase1 : base1UcLc) {
-            for (char theBase2 : base2UcLc) {
-                // for equality, order should not matter
-                final boolean b1EqualsB2 = SequenceUtil.basesEqual((byte) theBase1, (byte) theBase2);
-                Assert.assertEquals(b1EqualsB2, expectedB1EqualsB2, "basesEqual test failed for '" + theBase1 + "' vs. '" + theBase2 + "'");
-                final boolean b2EqualsB1 = SequenceUtil.basesEqual((byte) theBase2, (byte) theBase1);
-                Assert.assertEquals(b2EqualsB1, expectedB1EqualsB2, "basesEqual test failed for '" + theBase1 + "' vs. '" + theBase2 + "'");
-
-                // for ambiguous read/ref matching, the order does matter
-                final boolean b1ReadMatchesB2Ref = SequenceUtil.readBaseMatchesRefBaseWithAmbiguity((byte) theBase1, (byte) theBase2);
-                Assert.assertEquals(b1ReadMatchesB2Ref, expectedB1ReadMatchesB2Ref, "readBaseMatchesRefBaseWithAmbiguity test failed for '" + theBase1 + "' vs. '" + theBase2 + "'");
-                final boolean b2ReadMatchesB1Ref = SequenceUtil.readBaseMatchesRefBaseWithAmbiguity((byte) theBase2, (byte) theBase1);
-                Assert.assertEquals(b2ReadMatchesB1Ref, expectedB2ReadMatchesB1Ref, "readBaseMatchesRefBaseWithAmbiguity test failed for '" + theBase1 + "' vs. '" + theBase2 + "'");
-            }
-        }
-    }
-
-    /*
-     * For reference:
-     * M = A|C
-     * R = A|G
-     * W = A|T
-     * S = C|G
-     * Y = C|T
-     * K = G|T
-     * V = A|C|G
-     * H = A|C|T
-     * D = A|G|T
-     * B = C|G|T
-     * N = A|C|G|T
-     */
-    @DataProvider(name="basesEqualDataProvider")
-    public Object[][] testBasesEqualDataProvider() {
-        return new Object[][] {
-                {'A', 'A', true, true, true},
-                {'A', 'C', false, false, false},
-                {'A', 'G', false, false, false},
-                {'A', 'T', false, false, false},
-                {'A', 'M', false, true, false},
-                {'A', 'R', false, true, false},
-                {'A', 'W', false, true, false},
-                {'A', 'S', false, false, false},
-                {'A', 'Y', false, false, false},
-                {'A', 'K', false, false, false},
-                {'A', 'V', false, true, false},
-                {'A', 'H', false, true, false},
-                {'A', 'D', false, true, false},
-                {'A', 'B', false, false, false},
-                {'A', 'N', false, true, false},
-                {'C', 'C', true, true, true},
-                {'C', 'G', false, false, false},
-                {'C', 'T', false, false, false},
-                {'C', 'M', false, true, false},
-                {'C', 'R', false, false, false},
-                {'C', 'W', false, false, false},
-                {'C', 'S', false, true, false},
-                {'C', 'Y', false, true, false},
-                {'C', 'K', false, false, false},
-                {'C', 'V', false, true, false},
-                {'C', 'H', false, true, false},
-                {'C', 'D', false, false, false},
-                {'C', 'N', false, true, false},
-                {'G', 'G', true, true, true},
-                {'G', 'T', false, false, false},
-                {'G', 'M', false, false, false},
-                {'G', 'R', false, true, false},
-                {'G', 'W', false, false, false},
-                {'G', 'S', false, true, false},
-                {'G', 'Y', false, false, false},
-                {'G', 'K', false, true, false},
-                {'G', 'V', false, true, false},
-                {'G', 'H', false, false, false},
-                {'G', 'N', false, true, false},
-                {'T', 'T', true, true, true},
-                {'T', 'W', false, true, false},
-                {'T', 'Y', false, true, false},
-                {'T', 'V', false, false, false},
-                {'M', 'T', false, false, false},
-                {'M', 'M', true, true, true},
-                {'M', 'R', false, false, false},
-                {'M', 'W', false, false, false},
-                {'M', 'S', false, false, false},
-                {'M', 'Y', false, false, false},
-                {'M', 'V', false, true, false},
-                {'M', 'N', false, true, false},
-                {'R', 'T', false, false, false},
-                {'R', 'R', true, true, true},
-                {'R', 'W', false, false, false},
-                {'R', 'S', false, false, false},
-                {'R', 'Y', false, false, false},
-                {'R', 'V', false, true, false},
-                {'W', 'W', true, true, true},
-                {'W', 'Y', false, false, false},
-                {'S', 'T', false, false, false},
-                {'S', 'W', false, false, false},
-                {'S', 'S', true, true, true},
-                {'S', 'Y', false, false, false},
-                {'S', 'V', false, true, false},
-                {'Y', 'Y', true, true, true},
-                {'K', 'T', false, false, true},
-                {'K', 'M', false, false, false},
-                {'K', 'R', false, false, false},
-                {'K', 'W', false, false, false},
-                {'K', 'S', false, false, false},
-                {'K', 'Y', false, false, false},
-                {'K', 'K', true, true, true},
-                {'K', 'V', false, false, false},
-                {'K', 'N', false, true, false},
-                {'V', 'W', false, false, false},
-                {'V', 'Y', false, false, false},
-                {'V', 'V', true, true, true},
-                {'H', 'T', false, false, true},
-                {'H', 'M', false, false, true},
-                {'H', 'R', false, false, false},
-                {'H', 'W', false, false, true},
-                {'H', 'S', false, false, false},
-                {'H', 'Y', false, false, true},
-                {'H', 'K', false, false, false},
-                {'H', 'V', false, false, false},
-                {'H', 'H', true, true, true},
-                {'H', 'N', false, true, false},
-                {'D', 'G', false, false, true},
-                {'D', 'T', false, false, true},
-                {'D', 'M', false, false, false},
-                {'D', 'R', false, false, true},
-                {'D', 'W', false, false, true},
-                {'D', 'S', false, false, false},
-                {'D', 'Y', false, false, false},
-                {'D', 'K', false, false, true},
-                {'D', 'V', false, false, false},
-                {'D', 'H', false, false, false},
-                {'D', 'D', true, true, true},
-                {'D', 'N', false, true, false},
-                {'B', 'C', false, false, true},
-                {'B', 'G', false, false, true},
-                {'B', 'T', false, false, true},
-                {'B', 'M', false, false, false},
-                {'B', 'R', false, false, false},
-                {'B', 'W', false, false, false},
-                {'B', 'S', false, false, true},
-                {'B', 'Y', false, false, true},
-                {'B', 'K', false, false, true},
-                {'B', 'V', false, false, false},
-                {'B', 'H', false, false, false},
-                {'B', 'D', false, false, false},
-                {'B', 'B', true, true, true},
-                {'B', 'N', false, true, false},
-                {'N', 'T', false, false, true},
-                {'N', 'R', false, false, true},
-                {'N', 'W', false, false, true},
-                {'N', 'S', false, false, true},
-                {'N', 'Y', false, false, true},
-                {'N', 'V', false, false, true},
-                {'N', 'N', true, true, true}
-        };
-    }
-
-    private char toUpperCase(final char base) {
-        return base > 90 ? (char) (base - 32) : base;
-    }
-
-    private char toLowerCase(final char base) {
-        return (char) (toUpperCase(base) + 32);
-    }
-
-    @Test(dataProvider = "testGetSamReadNameFromFastqHeader")
-    public void testGetSamReadNameFromFastqHeader(final String fastqHeader,
-                                                  final String expectedSamReadName) {
-        Assert.assertEquals(SequenceUtil.getSamReadNameFromFastqHeader(fastqHeader), expectedSamReadName);
-    }
-
-    @DataProvider(name = "testGetSamReadNameFromFastqHeader")
-    public Object[][] testGetSamReadNameFromFastqHeaderTestCases() {
-        return new Object[][] {
-                {"Simple:Name",          "Simple:Name"},
-                {"Simple:Name",          "Simple:Name"},
-                {"Name/1",               "Name"},
-                {"Name/2",               "Name"},
-                {"Name/3",               "Name/3"},
-                {"Simple:Name Blank",    "Simple:Name"},
-                {"Simple:Name Blank /1", "Simple:Name"},
-                {"Name/1/2",             "Name"}
-        };
-    }
-
-    @Test
-    public void testCalculateNmTag() {
-        final File TEST_DIR = new File("src/test/resources/htsjdk/samtools/SequenceUtil");
-        final File referenceFile = new File(TEST_DIR, "reference_with_lower_and_uppercase.fasta");
-        final File samFile = new File(TEST_DIR, "upper_and_lowercase_read.sam");
-
-        SamReader reader = SamReaderFactory.makeDefault().open(samFile);
-        ReferenceSequenceFile ref = ReferenceSequenceFileFactory.getReferenceSequenceFile(referenceFile);
-
-        reader.iterator().stream().forEach(r -> {
-            Integer nm = SequenceUtil.calculateSamNmTag(r, ref.getSequence(r.getContig()).getBases());
-            String md = r.getStringAttribute(SAMTag.MD.name());
-            Assert.assertEquals(r.getIntegerAttribute(SAMTag.NM.name()), nm, "problem with NM in read \'" + r.getReadName() + "\':");
-            SequenceUtil.calculateMdAndNmTags(r, ref.getSequence(r.getContig()).getBases(), true, true);
-
-            Assert.assertEquals(r.getIntegerAttribute(SAMTag.NM.name()), nm, "problem with NM in read \'" + r.getReadName() + "\':");
-            if (md != null) {
-                Assert.assertEquals(r.getStringAttribute(SAMTag.MD.name()), md, "problem with MD in read \'" + r.getReadName() + "\':");
-            }
-        });
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/SolexaQualityConverterTest.java b/src/test/java/htsjdk/samtools/util/SolexaQualityConverterTest.java
deleted file mode 100644
index 09cc829..0000000
--- a/src/test/java/htsjdk/samtools/util/SolexaQualityConverterTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-
-public class SolexaQualityConverterTest {
-    //declared as a staic variable because we reuse it in IlluminaUtilTest
-    public static Object[][] SOLEXA_QUALS_TO_PHRED_SCORE = new Object[][] {
-                new Object[]{new byte[]{}, new byte[]{}},
-                new Object[]{iToB(new int[]{120}), iToB(new int[]{56})},
-                new Object[]{iToB(new int[]{64, 65, 120, 121}), iToB(new int[]{3, 4, 56, 57})},
-                new Object[]{iToB(new int[]{0, 1, 63}), iToB(new int[]{0, 0, 0})}
-    };
-
-    public static Object[][] SOLEXA_QUALS_TO_PHRED_SCORE_1_3 = new Object[][] {
-                new Object[]{new byte[]{}, new byte[]{}},
-                new Object[]{iToB(new int[]{120}), iToB(new int[]{56})},
-                new Object[]{iToB(new int[]{64, 65, 120, 121, 156, 157}), iToB(new int[]{0, 1, 56, 57, 92, 93})},
-                new Object[]{iToB(new int[]{0, 1, 63}), iToB(new int[]{-64, -63, -1})}
-    };
-
-    public static Object[][] INVALID_SOLEXA_QUALS = new Object[][] {
-                new Object[]{iToB(new int[]{-1}), iToB(new int[]{-65})},
-                new Object[]{iToB(new int[]{-1, -2}), iToB(new int[]{-65, -66})}
-    };
-
-    private static final byte [] iToB(int [] intVals) {
-        byte [] byteVals = new byte[intVals.length];
-        for(int i = 0; i < byteVals.length; i++) {
-            byteVals[i] = (byte) intVals[i];
-        }
-        return byteVals;
-    }
-
-    @DataProvider(name="solexaQualsToPhredScore")
-    public Object[][] solexaQualsToPhredScore() {return SOLEXA_QUALS_TO_PHRED_SCORE;}
-
-    @DataProvider(name="solexaQualsToPhredScore_1_3")
-    public Object[][] solexaQualsToPhredScore_1_3() {return SOLEXA_QUALS_TO_PHRED_SCORE_1_3;}
-
-    @DataProvider(name="invalidSolexaQuals")
-    public Object[][] invalidSolexaQuals() {return INVALID_SOLEXA_QUALS;}
-
-    @Test(dataProvider="solexaQualsToPhredScore")
-    public void solexaQualsToPhredScoreTestArray(byte [] solexaQuals, byte [] phredScores) {
-       byte [] qualsToPhred = Arrays.copyOf(solexaQuals, solexaQuals.length);
-
-       SolexaQualityConverter.getSingleton().convertSolexaQualityCharsToPhredBinary(qualsToPhred);
-       Assert.assertEquals(phredScores, qualsToPhred);
-    }
-
-    @Test(dataProvider="solexaQualsToPhredScore_1_3")
-    public void solexaQualsToPhredScoreTestArray_1_3(byte [] solexaQuals, byte [] phredScores) {
-       byte [] qualsToPhred = Arrays.copyOf(solexaQuals, solexaQuals.length);
-
-       SolexaQualityConverter.getSingleton().convertSolexa_1_3_QualityCharsToPhredBinary(qualsToPhred);
-       Assert.assertEquals(phredScores, qualsToPhred);
-    }
-
-    @Test(dataProvider="invalidSolexaQuals")
-    public void invalidSolexaQualsTestArray(byte [] solexaQuals,  byte [] phredScores) {
-       byte [] qualsToPhred = Arrays.copyOf(solexaQuals, solexaQuals.length);
-
-       SolexaQualityConverter.getSingleton().convertSolexa_1_3_QualityCharsToPhredBinary(qualsToPhred);
-       Assert.assertEquals(phredScores, qualsToPhred);
-    }
-
-    @Test(dataProvider="solexaQualsToPhredScore")
-    public void solexaCharToPhredBinaryTest(final byte [] solexaQuals, byte [] phredScores) {
-       final SolexaQualityConverter solexaConverter = SolexaQualityConverter.getSingleton();
-       for(int i = 0; i < solexaQuals.length; i++) {
-           Assert.assertEquals(phredScores[i], solexaConverter.solexaCharToPhredBinary(solexaQuals[i]));
-       }
-    }
-
-    @Test(dataProvider="invalidSolexaQuals", expectedExceptions = IndexOutOfBoundsException.class)
-    public void invalidSolexaCharToPhredBinaryTest(final byte [] solexaQuals,  byte [] phredScores) {
-       final SolexaQualityConverter solexaConverter = SolexaQualityConverter.getSingleton();
-       for(int i = 0; i < solexaQuals.length; i++) {
-           solexaConverter.solexaCharToPhredBinary(solexaQuals[i]);
-       }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/SortingCollectionTest.java b/src/test/java/htsjdk/samtools/util/SortingCollectionTest.java
deleted file mode 100644
index 1ec928d..0000000
--- a/src/test/java/htsjdk/samtools/util/SortingCollectionTest.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.AfterTest;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.Random;
-
-public class SortingCollectionTest {
-    // Create a separate directory for files so it is possible to confirm that the directory is emptied
-    protected File tmpDir() {
-        return new File(System.getProperty("java.io.tmpdir") + "/" + System.getProperty("user.name"), getClass().getSimpleName());
-    }
-    
-    @BeforeMethod void setup() { resetTmpDir(); }
-    @AfterMethod void tearDown() { resetTmpDir(); }
-
-    /** Deletes and re-creates the temporary directory. */
-    void resetTmpDir() {
-        System.err.println("Resetting tmpdir");
-        IOUtil.deleteDirectoryTree(tmpDir());
-        if (!tmpDir().mkdirs()) throw new IllegalStateException("Could not create tmpdir: " + tmpDir().getAbsolutePath());
-
-    }
-
-    protected boolean tmpDirIsEmpty() {
-        return tmpDir().listFiles().length == 0;
-    }
-
-    @DataProvider(name = "test1")
-    public Object[][] createTestData() {
-        return new Object[][] {
-                {"empty", 0, 100},
-                {"singleton", 1, 100},
-                {"less than threshold", 100, 200},
-                {"threshold minus 1", 99, 100},
-                {"greater than threshold", 550, 100},
-                {"threshold multiple", 600, 100},
-                {"threshold multiple plus one", 101, 100},
-                {"exactly threshold", 100, 100},
-        };
-    }
-
-    /**
-     * Generate some strings, put into SortingCollection, confirm that the right number of
-     * Strings come out, and in the right order.
-     * @param numStringsToGenerate
-     * @param maxRecordsInRam
-     */
-    @Test(dataProvider = "test1")
-    public void testPositive(final String testName, final int numStringsToGenerate, final int maxRecordsInRam) {
-        final String[] strings = new String[numStringsToGenerate];
-        int numStringsGenerated = 0;
-        final SortingCollection<String> sortingCollection = makeSortingCollection(maxRecordsInRam);
-        for (final String s : new RandomStringGenerator(numStringsToGenerate)) {
-            sortingCollection.add(s);
-            strings[numStringsGenerated++] = s;
-        }
-        Arrays.sort(strings, new StringComparator());
-
-        Assert.assertEquals(tmpDirIsEmpty(), numStringsToGenerate <= maxRecordsInRam);
-        sortingCollection.setDestructiveIteration(false);
-        assertIteratorEqualsList(strings, sortingCollection.iterator());
-        assertIteratorEqualsList(strings, sortingCollection.iterator());
-        
-        sortingCollection.cleanup();
-        Assert.assertEquals(tmpDir().list().length, 0);
-    }
-
-    private void assertIteratorEqualsList(final String[] strings, final Iterator<String> sortingCollection) {
-        int i = 0;
-        while (sortingCollection.hasNext()) {
-            final String s = sortingCollection.next();
-            Assert.assertEquals(s, strings[i++]);
-        }
-        Assert.assertEquals(i, strings.length);
-    }
-
-    private SortingCollection<String> makeSortingCollection(final int maxRecordsInRam) {
-        return SortingCollection.newInstance(String.class, new StringCodec(), new StringComparator(), maxRecordsInRam, tmpDir());
-    }
-
-    /**
-     * Generate pseudo-random Strings for testing
-     */
-    static class RandomStringGenerator implements Iterable<String>, Iterator<String> {
-        Random random = new Random(0);
-        int numElementsToGenerate;
-        int numElementsGenerated = 0;
-
-        /**
-         * @param numElementsToGenerate Iteration ends after this many have been generated.
-         */
-        RandomStringGenerator(final int numElementsToGenerate) {
-            this.numElementsToGenerate = numElementsToGenerate;
-        }
-
-        public Iterator<String> iterator() {
-            return this;
-        }
-
-        public boolean hasNext() {
-            return numElementsGenerated < numElementsToGenerate;
-        }
-
-        public String next() {
-            ++numElementsGenerated;
-            return Integer.toString(random.nextInt());
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-    }
-
-    static class StringComparator implements Comparator<String> {
-
-        public int compare(final String s, final String s1) {
-            return s.compareTo(s1);
-        }
-    }
-
-    static class StringCodec implements SortingCollection.Codec<String> {
-        ByteBuffer byteBuffer = ByteBuffer.allocate(4);
-        OutputStream os;
-        InputStream is;
-
-        public SortingCollection.Codec<String> clone() {
-            return new StringCodec();
-        }
-
-        /**
-         * Where to write encoded output
-         *
-         * @param os
-         */
-        public void setOutputStream(final OutputStream os) {
-            this.os = os;
-        }
-
-        /**
-         * Where to read encoded input from
-         *
-         * @param is
-         */
-        public void setInputStream(final InputStream is) {
-            this.is = is;
-        }
-
-        /**
-         * Write object to file
-         *
-         * @param val what to write
-         */
-        public void encode(final String val) {
-            try {
-                byteBuffer.clear();
-                byteBuffer.putInt(val.length());
-                os.write(byteBuffer.array());
-                os.write(val.getBytes());
-            } catch (IOException e) {
-                throw new RuntimeIOException(e);
-            }
-        }
-
-        /**
-         * Read the next record from the input stream and convert into a java object.
-         *
-         * @return null if no more records.  Should throw exception if EOF is encountered in the middle of
-         *         a record.
-         */
-        public String decode() {
-            try {
-                byteBuffer.clear();
-                int bytesRead = is.read(byteBuffer.array());
-                if (bytesRead == -1) {
-                    return null;
-                }
-                if (bytesRead != 4) {
-                    throw new RuntimeException("Unexpected EOF in middle of record");
-                }
-                byteBuffer.limit(4);
-                final int length = byteBuffer.getInt();
-                final byte[] buf = new byte[length];
-                bytesRead = is.read(buf);
-                if (bytesRead != length) {
-                    throw new RuntimeException("Unexpected EOF in middle of record");
-                }
-                return new String(buf);
-            } catch (IOException e) {
-                throw new RuntimeIOException(e);
-            }
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/SortingLongCollectionTest.java b/src/test/java/htsjdk/samtools/util/SortingLongCollectionTest.java
deleted file mode 100644
index 4817ef5..0000000
--- a/src/test/java/htsjdk/samtools/util/SortingLongCollectionTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterTest;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Random;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class SortingLongCollectionTest {
-    // Create a separate directory for files so it is possible to confirm that the directory is emptied
-    private final File tmpDir = new File(System.getProperty("java.io.tmpdir") + "/" + System.getProperty("user.name"),
-            "SortingCollectionTest");
-
-    @BeforeTest
-    void setup() {
-        // Clear out any existing files if the directory exists
-        if (tmpDir.exists()) {
-            for (final File f : tmpDir.listFiles()) {
-                f.delete();
-            }
-        }
-        tmpDir.mkdir();
-    }
-
-    @AfterTest
-    void tearDown() {
-        if (!tmpDir.exists()) {
-            // I don't know why it wouldn't exist, but sometimes it doesn't, and it causes the unit test
-            // to fail.  AW 20-May-2009
-            return;
-        }
-        for (final File f : tmpDir.listFiles()) {
-            f.delete();
-        }
-        tmpDir.delete();
-    }
-
-    private boolean tmpDirIsEmpty() {
-        return tmpDir.listFiles().length == 0;
-    }
-
-    @DataProvider(name = "test1")
-    public Object[][] createTestData() {
-        return new Object[][]{
-                {"empty", 0, 100},
-                {"less than threshold", 100, 200},
-                {"greater than threshold", 550, 100},
-                {"threshold multiple", 600, 100},
-                {"threshold multiple plus one", 101, 100},
-                {"exactly threshold", 100, 100},
-        };
-    }
-
-    /**
-     * Generate some values, put into SortingLongCollection, confirm that the right number of
-     * values come out, and in the right order.
-     *
-     * @param numValuesToGenerate
-     * @param maxValuesInRam
-     */
-    @Test(dataProvider = "test1")
-    public void testPositive(final String testName, final int numValuesToGenerate, final int maxValuesInRam) {
-        final long[] values = new long[numValuesToGenerate];
-        int numStringsGenerated = 0;
-        final SortingLongCollection sortingCollection = new SortingLongCollection(maxValuesInRam, tmpDir);
-        final Random valueGenerator = new Random(123);
-        for (int i = 0; i < numValuesToGenerate; ++i) {
-            final long value = valueGenerator.nextLong();
-            sortingCollection.add(value);
-            values[numStringsGenerated++] = value;
-        }
-        Arrays.sort(values);
-
-        Assert.assertEquals(tmpDirIsEmpty(), numValuesToGenerate <= maxValuesInRam);
-        assertIteratorEqualsList(values, sortingCollection);
-
-        sortingCollection.cleanup();
-        Assert.assertTrue(tmpDirIsEmpty());
-    }
-
-    private void assertIteratorEqualsList(final long[] values, final SortingLongCollection sortingCollection) {
-        int i = 0;
-        sortingCollection.doneAddingStartIteration();
-        while (sortingCollection.hasNext()) {
-            Assert.assertEquals(sortingCollection.next(), values[i++], "values failed.  i: " + (i - 1) + "; values[i]" + values[i - 1]);
-        }
-        Assert.assertEquals(i, values.length);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/StringLineReaderTest.java b/src/test/java/htsjdk/samtools/util/StringLineReaderTest.java
deleted file mode 100644
index 9919f89..0000000
--- a/src/test/java/htsjdk/samtools/util/StringLineReaderTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class StringLineReaderTest {
-
-    private static final String[] TERMINATORS = {"\r", "\n", "\r\n"};
-    private static final boolean[] LAST_LINE_TERMINATED = {false, true};
-
-    enum EmptyLineState {
-        FIRST_LINE, LAST_LINE, MIDDLE_LINE, COMPLETELY_EMPTY
-    }
-
-    /**
-     * Test a bunch of combinations instead of writing a method for each.
-     */
-    @Test
-    public void testBasic() {
-        for (final String terminator : TERMINATORS) {
-            for (final boolean lastLineTerminated : LAST_LINE_TERMINATED) {
-                for (final EmptyLineState emptyLineState : EmptyLineState.values()) {
-                    if (emptyLineState == EmptyLineState.COMPLETELY_EMPTY) {
-                        emptyTestHelper(terminator, lastLineTerminated);
-                    } else {
-                        testHelper(terminator, lastLineTerminated, emptyLineState);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * various test cases where there is no input, except perhaps a line terminator
-     * @param terminator what the terminator should be in the input
-     * @param lastLineTerminated does the input have a terminator
-     */
-    private void emptyTestHelper(final String terminator, final boolean lastLineTerminated) {
-        final String input;
-        if (lastLineTerminated) {
-            input = terminator;
-        } else {
-            input = "";
-        }
-        final StringLineReader slr = new StringLineReader(input);
-        final String output = slr.readLine();
-        if (lastLineTerminated) {
-            Assert.assertEquals(output, "");
-        }
-        Assert.assertNull(slr.readLine());
-    }
-
-    /**
-     * Test a variety of test cases in which there is more than one line.
-     * @param terminator to use in the input
-     * @param lastLineTerminated should the input end with a terminator
-     * @param emptyLineState where in the input should an empty line be.
-     */
-    private void testHelper(final String terminator, final boolean lastLineTerminated, final EmptyLineState emptyLineState) {
-        final String[] lines = new String[3];
-        if (emptyLineState == EmptyLineState.FIRST_LINE) {
-            lines[0] = "";
-            lines[1] = "Hi, Mom!";
-            lines[2] = "Hi, Dad?";
-        } else if (emptyLineState == EmptyLineState.LAST_LINE) {
-            lines[0] = "Hi, Dad?";
-            lines[1] = "Hi, Mom!";
-            lines[2] = "";
-        } else  if (emptyLineState == EmptyLineState.MIDDLE_LINE) {
-            lines[0] = "Hi, Dad?";
-            lines[1] = "";
-            lines[2] = "Hi, Mom!";
-        }
-        String input = StringUtil.join(terminator, lines);
-        if (lastLineTerminated) {
-            input = input.concat(terminator);
-        }
-        final StringLineReader slr = new StringLineReader(input);
-        for (int i = 0; i < lines.length - 1; ++i) {
-            final String s = slr.readLine();
-            String expected = lines[i];
-            Assert.assertEquals(s, expected);
-        }
-
-        // Last line may need to be handled specially
-        String s = slr.readLine();
-        if (!lastLineTerminated && emptyLineState == EmptyLineState.LAST_LINE) {
-            Assert.assertNull(s);
-        } else {
-            String expected = lines[lines.length - 1];
-            Assert.assertEquals(s, expected);
-        }
-        s = slr.readLine();
-        Assert.assertNull(s);
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/StringUtilTest.java b/src/test/java/htsjdk/samtools/util/StringUtilTest.java
deleted file mode 100644
index dbb2a07..0000000
--- a/src/test/java/htsjdk/samtools/util/StringUtilTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class StringUtilTest {
-    @Test(dataProvider = "provider")
-    public void testSplit(final String input, final String[] expectedResult, final boolean concatenateExcess) {
-        String[] ret = new String[expectedResult.length];
-        int tokensExpected;
-        for (tokensExpected = 0; tokensExpected < expectedResult.length && expectedResult[tokensExpected] != null;
-             ++tokensExpected) {
-        }
-        final int tokensFound;
-        if (concatenateExcess) {
-            tokensFound = StringUtil.splitConcatenateExcessTokens(input, ret, ':');
-        } else {
-           tokensFound = StringUtil.split(input, ret, ':');
-        }
-        Assert.assertEquals(tokensFound, tokensExpected);
-        Assert.assertEquals(ret, expectedResult);
-    }
-
-    @DataProvider(name="provider")
-    public Object[][] splitScenarios() {
-        return new Object[][] {
-                {"A:BB:C", new String[]{"A", "BB", "C"}, false},
-                {"A:BB:C", new String[]{"A", "BB", "C"}, true},
-                {"A:BB", new String[]{"A", "BB", null}, false},
-                {"A:BB", new String[]{"A", "BB", null}, true},
-                {"A:BB:", new String[]{"A", "BB", null}, false},
-                {"A:BB:", new String[]{"A", "BB", null}, true},
-                {"A:BB:C:DDD", new String[]{"A", "BB", "C"}, false},
-                {"A:BB:C:DDD", new String[]{"A", "BB", "C:DDD"}, true},
-                {"A:", new String[]{"A", null, null}, false},
-                {"A:", new String[]{"A", null, null}, true},
-                {"A", new String[]{"A", null, null}, false},
-                {"A", new String[]{"A", null, null}, true},
-                {"A:BB:C", new String[]{"A", "BB", "C"}, false},
-                {"A:BB:C:", new String[]{"A", "BB", "C:"}, true}, 
-        };
-    }
-
-    @DataProvider(name="withinHammingDistanceProvider")
-    public Object[][] isWithinHammingDistanceProvider() {
-        return new Object[][] {
-                {"ATAC", "GCAT", 3, true},
-                {"ATAC", "GCAT", 2, false},
-                {"ATAC", "GCAT", 1, false},
-                {"ATAC", "GCAT", 0, false}
-        };
-    }
-
-    @Test(dataProvider = "withinHammingDistanceProvider")
-    public void testIsWithinHammingDistance(final String s1, final String s2, final int maxHammingDistance, final boolean expectedResult) {
-        Assert.assertEquals(StringUtil.isWithinHammingDistance(s1, s2, maxHammingDistance), expectedResult);
-    }
-
-    @DataProvider(name="withinHammingDistanceExceptionProvider")
-    public Object[][] isWithinHammingDistanceException() {
-        return new Object[][] {
-                {"ATAC", "GCT" , 3},
-                {"ATAC", "AT"  , 2},
-                {"ATAC", "T"   , 1},
-                {""    , "GCAT", 0}
-        };
-    }
-
-    @Test(dataProvider = "withinHammingDistanceExceptionProvider", expectedExceptions = IllegalArgumentException.class)
-    public void testIsWithinHammingDistanceExceptions(final String s1, final String s2, final int maxHammingDistance) {
-        StringUtil.isWithinHammingDistance(s1, s2, maxHammingDistance);
-    }
-
-    @Test(dataProvider = "withinHammingDistanceExceptionProvider", expectedExceptions = IllegalArgumentException.class)
-    public void testHammingDistanceExceptions(final String s1, final String s2, final int maxHammingDistance) {
-        StringUtil.hammingDistance(s1, s2);
-    }
-
-    @DataProvider(name="hammingDistanceProvider")
-    public Object[][] hammingDistance() {
-        return new Object[][] {
-                {"ATAC" , "GCAT" , 3},
-                {"ATAGC", "ATAGC", 0},
-                {"ATAC" , "atac" , 4}, // Hamming distance is case sensitive.
-                {""     , ""     , 0}, // Two empty strings should have Hamming distance of 0.
-                {"nAGTN", "nAGTN", 0} // Ensure that matching Ns are not counted as mismatches.
-        };
-    }
-
-    @Test(dataProvider = "hammingDistanceProvider")
-    public void testHammingDistance(final String s1, final String s2, final int expectedResult) {
-        Assert.assertEquals(StringUtil.hammingDistance(s1, s2), expectedResult);
-    }
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/TrimmingUtilTest.java b/src/test/java/htsjdk/samtools/util/TrimmingUtilTest.java
deleted file mode 100644
index 12cffc6..0000000
--- a/src/test/java/htsjdk/samtools/util/TrimmingUtilTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Tim Fennell
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Tests for a simple phred-style quality trimming algorithm.
- */
-public class TrimmingUtilTest {
-    @Test
-    public void testEasyCases() {
-        Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(30,30,30,30,30, 2, 2, 2, 2, 2), 15), 5);
-        Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(30,30,30,30,30,30,30,30,30,30), 15), 10);
-        Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(12,12,12,12,12,12,12,12,12,12), 15), 0);
-    }
-
-    @Test
-    public void testBoundaryCasesForTrimQual() {
-        Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(12,12,12,12,12,12,12,12,12,12), 11), 10);
-        Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(12,12,12,12,12,12,12,12,12,12), 12), 10);
-        Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(12,12,12,12,12,12,12,12,12,12), 13), 0);
-    }
-
-    @Test
-    public void testLowQualityWithOccasionalHighQuality() {
-        Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(30,30,30, 2, 5, 2, 3,20, 2, 6), 15), 3);
-    }
-
-    @Test
-    public void testAlternatingHighAndLowQuality() {
-        Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(30, 2,30, 2,30, 2,30, 2,30, 2), 15), 9);
-    }
-    @Test
-    public void testEmptyQuals() {
-        Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(), 15), 0);
-    }
-
-    /** Makes a byte[] from a variable length argument list of ints. */
-    byte[] byteArray(final int... ints) {
-        final byte[] bytes = new byte[ints.length];
-        for (int i=0; i<bytes.length; ++i) {
-            bytes[i] = (byte) ints[i];
-        }
-
-        return bytes;
-    }
-}
diff --git a/src/test/java/htsjdk/samtools/util/TupleTest.java b/src/test/java/htsjdk/samtools/util/TupleTest.java
deleted file mode 100644
index bed4550..0000000
--- a/src/test/java/htsjdk/samtools/util/TupleTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Created by farjoun on 1/29/16.
- */
-public class TupleTest {
-
-    @Test
-    public void testEquals() throws Exception {
-        Assert.assertEquals(new Tuple<>(1, "hi"), new Tuple<>(1, "hi"));
-
-        Assert.assertEquals(new Tuple<>(1, null), new Tuple<>(1, null));
-        Assert.assertEquals(new Tuple<>(null, "hi"), new Tuple<>(null, "hi"));
-        Assert.assertEquals(new Tuple<>(null, null), new Tuple<>(null, null));
-
-
-        Assert.assertNotSame(new Tuple<Integer, Integer>(1, null), new Tuple<Integer, String>(1, null));
-        Assert.assertNotSame(new Tuple<Integer, String>(null, "hi"), new Tuple<String, String>(null, "hi"));
-        Assert.assertNotSame(new Tuple<Integer, Integer>(null, null), new Tuple<Integer, String>(null, null));
-
-
-        Assert.assertNotSame(new Tuple<>(1, "hi"), new Tuple<>(1, "bye"));
-        Assert.assertNotSame(new Tuple<>(2, "hi"), new Tuple<>(1, "hi"));
-        Assert.assertNotSame(new Tuple<>(2, "hi"), new Tuple<>(1, null));
-        Assert.assertNotSame(new Tuple<>(2, "hi"), new Tuple<>(null, "hi"));
-
-    }
-
-    @Test
-    public void testHashCode() throws Exception {
-        Assert.assertEquals(new Tuple<>(1, "hi").hashCode(), new Tuple<>(1, "hi").hashCode());
-
-        Assert.assertEquals(new Tuple<>(1, null).hashCode(), new Tuple<>(1, null).hashCode());
-        Assert.assertEquals(new Tuple<>(null, "hi").hashCode(), new Tuple<>(null, "hi").hashCode());
-        Assert.assertEquals(new Tuple<>(null, null).hashCode(), new Tuple<>(null, null).hashCode());
-
-        //even though these are of different types, the value is null and so I have to make these equal...
-        Assert.assertEquals(new Tuple<Integer, Integer>(1, null).hashCode(), new Tuple<Integer, String>(1, null).hashCode());
-        Assert.assertEquals(new Tuple<Integer, String>(null, "hi").hashCode(), new Tuple<String, String>(null, "hi").hashCode());
-        Assert.assertEquals(new Tuple<Integer, Integer>(null, null).hashCode(), new Tuple<Integer, String>(null, null).hashCode());
-
-        Assert.assertNotSame(new Tuple<>(1, "hi").hashCode(), new Tuple<>(1, "bye").hashCode());
-        Assert.assertNotSame(new Tuple<>(2, "hi").hashCode(), new Tuple<>(1, "hi").hashCode());
-        Assert.assertNotSame(new Tuple<>(2, "hi").hashCode(), new Tuple<>(1, null).hashCode());
-        Assert.assertNotSame(new Tuple<>(2, "hi").hashCode(), new Tuple<>(null, "hi").hashCode());
-
-    }
-
-    @Test
-    public void testToString() throws Exception {
-        Assert.assertEquals(new Tuple<>(1, 2).toString(), "[1, 2]");
-        Assert.assertEquals(new Tuple<>(1, "hi!").toString(), "[1, hi!]");
-        Assert.assertEquals(new Tuple<>(1, new Tuple<>(2, 3)).toString(), "[1, [2, 3]]");
-
-        Assert.assertEquals(new Tuple<>(1, null).toString(), "[1, null]");
-        Assert.assertEquals(new Tuple<>(null, null).toString(), "[null, null]");
-
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/tribble/AbstractFeatureReaderTest.java b/src/test/java/htsjdk/tribble/AbstractFeatureReaderTest.java
deleted file mode 100644
index 6d65e9d..0000000
--- a/src/test/java/htsjdk/tribble/AbstractFeatureReaderTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.TestUtil;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.bed.BEDFeature;
-import htsjdk.tribble.readers.LineIterator;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFCodec;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import static org.testng.Assert.*;
-
-/**
- * @author jacob
- * @date 2013-Apr-10
- */
-public class AbstractFeatureReaderTest {
-
-    final static String HTTP_INDEXED_VCF_PATH = TestUtil.BASE_URL_FOR_HTTP_TESTS + "ex2.vcf";
-    final static String LOCAL_MIRROR_HTTP_INDEXED_VCF_PATH = VariantBaseTest.variantTestDataRoot + "ex2.vcf";
-
-    /**
-     * Asserts readability and correctness of VCF over HTTP.  The VCF is indexed and requires and index.
-     */
-    @Test
-    public void testVcfOverHTTP() throws IOException {
-        final VCFCodec codec = new VCFCodec();
-        final AbstractFeatureReader<VariantContext, LineIterator> featureReaderHttp =
-                AbstractFeatureReader.getFeatureReader(HTTP_INDEXED_VCF_PATH, codec, true); // Require an index to
-        final AbstractFeatureReader<VariantContext, LineIterator> featureReaderLocal =
-                AbstractFeatureReader.getFeatureReader(LOCAL_MIRROR_HTTP_INDEXED_VCF_PATH, codec, false);
-        final CloseableTribbleIterator<VariantContext> localIterator = featureReaderLocal.iterator();
-        for (final Feature feat : featureReaderHttp.iterator()) {
-            assertEquals(feat.toString(), localIterator.next().toString());
-        }
-        assertFalse(localIterator.hasNext());
-    }
-
-    @Test
-    public void testLoadBEDFTP() throws Exception {
-        final String path = "ftp://ftp.broadinstitute.org/distribution/igv/TEST/cpgIslands with spaces.hg18.bed";
-        final BEDCodec codec = new BEDCodec();
-        final AbstractFeatureReader<BEDFeature, LineIterator> bfs = AbstractFeatureReader.getFeatureReader(path, codec, false);
-        for (final Feature feat : bfs.iterator()) {
-            assertNotNull(feat);
-        }
-    }
-
-    @DataProvider(name = "blockCompressedExtensionExtensionStrings")
-    public Object[][] createBlockCompressedExtensionStrings() {
-        return new Object[][] {
-                { "testzip.gz", true },
-                { "test.gzip", true },
-                { "test.bgz", true },
-                { "test.bgzf", true },
-                { "test.bzip2", false }
-        };
-    }
-
-    @Test(enabled = true, dataProvider = "blockCompressedExtensionExtensionStrings")
-    public void testBlockCompressionExtensionString(final String testString, final boolean expected) {
-        Assert.assertEquals(AbstractFeatureReader.hasBlockCompressedExtension(testString), expected);
-    }
-
-    @Test(enabled = true, dataProvider = "blockCompressedExtensionExtensionStrings")
-    public void testBlockCompressionExtensionFile(final String testString, final boolean expected) {
-        Assert.assertEquals(AbstractFeatureReader.hasBlockCompressedExtension(new File(testString)), expected);
-    }
-
-    @DataProvider(name = "blockCompressedExtensionExtensionURIStrings")
-    public Object[][] createBlockCompressedExtensionURIs() {
-        return new Object[][]{
-                {"testzip.gz", true},
-                {"test.gzip", true},
-                {"test.bgz", true},
-                {"test.bgzf", true},
-                {"test", false},
-                {"test.bzip2", false},
-
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gz", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gzip", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgz", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgzf", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bzip2", false},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877", false},
-
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gz?alt=media", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gzip?alt=media", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgz?alt=media", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgzf?alt=media", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bzip2?alt=media", false},
-
-                {"ftp://ftp.broadinstitute.org/distribution/igv/TEST/cpgIslands.hg18.gz", true},
-                {"ftp://ftp.broadinstitute.org/distribution/igv/TEST/cpgIslands.hg18.bed", false}
-        };
-    }
-
-    @Test(enabled = true, dataProvider = "blockCompressedExtensionExtensionURIStrings")
-    public void testBlockCompressionExtension(final String testURIString, final boolean expected) throws URISyntaxException {
-        URI testURI = URI.create(testURIString);
-        Assert.assertEquals(AbstractFeatureReader.hasBlockCompressedExtension(testURI), expected);
-    }
-
-}
diff --git a/src/test/java/htsjdk/tribble/BinaryFeaturesTest.java b/src/test/java/htsjdk/tribble/BinaryFeaturesTest.java
deleted file mode 100644
index eff8939..0000000
--- a/src/test/java/htsjdk/tribble/BinaryFeaturesTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.example.ExampleBinaryCodec;
-import htsjdk.tribble.readers.LineIterator;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.List;
-
-
-public class BinaryFeaturesTest {
-    @DataProvider(name = "BinaryFeatureSources")
-    public Object[][] createData1() {
-        return new Object[][] {
-                { new File(TestUtils.DATA_DIR + "test.bed"),  new BEDCodec() },
-                { new File(TestUtils.DATA_DIR + "bed/Unigene.sample.bed"),  new BEDCodec() },
-                { new File(TestUtils.DATA_DIR + "bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19_fixed.bed"),  new BEDCodec() },
-        };
-    }
-
-    @Test(enabled = true, dataProvider = "BinaryFeatureSources")
-    public void testBinaryCodec(final File source, final FeatureCodec<Feature, LineIterator> codec) throws IOException {
-        final File tmpFile = File.createTempFile("testBinaryCodec", ".binary.bed");
-        ExampleBinaryCodec.convertToBinaryTest(source, tmpFile, codec);
-        tmpFile.deleteOnExit();
-
-        final FeatureReader<Feature> originalReader = AbstractFeatureReader.getFeatureReader(source.getAbsolutePath(), codec, false);
-        final FeatureReader<Feature> binaryReader = AbstractFeatureReader.getFeatureReader(tmpFile.getAbsolutePath(), new ExampleBinaryCodec(), false);
-
-        // make sure the header is what we expect
-        final List<String> header = (List<String>) binaryReader.getHeader();
-        Assert.assertEquals(header.size(), 1, "We expect exactly one header line");
-        Assert.assertEquals(header.get(0), ExampleBinaryCodec.HEADER_LINE, "Failed to read binary header line");
-
-        final Iterator<Feature> oit = originalReader.iterator();
-        final Iterator<Feature> bit = binaryReader.iterator();
-        while ( oit.hasNext() ) {
-            final Feature of = oit.next();
-
-            Assert.assertTrue(bit.hasNext(), "Original iterator has items, but there's no items left in binary iterator");
-            final Feature bf = bit.next();
-
-            Assert.assertEquals(bf.getContig(), of.getContig(), "Chr not equal between original and binary encoding");
-            Assert.assertEquals(bf.getStart(), of.getStart(), "Start not equal between original and binary encoding");
-            Assert.assertEquals(bf.getEnd(), of.getEnd(), "End not equal between original and binary encoding");
-        }
-        Assert.assertTrue(! bit.hasNext(), "Original iterator is done, but there's still some data in binary iterator");
-
-        originalReader.close();
-        binaryReader.close();
-    }
-
-    @Test(expectedExceptions = TribbleException.class)
-    public void testGetTabixFormatThrowsException() {
-        new ExampleBinaryCodec().getTabixFormat();
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/FeatureReaderTest.java b/src/test/java/htsjdk/tribble/FeatureReaderTest.java
deleted file mode 100644
index d62693c..0000000
--- a/src/test/java/htsjdk/tribble/FeatureReaderTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.example.ExampleBinaryCodec;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.util.ParsingUtils;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-
-public class FeatureReaderTest {
-    private final static File asciiBedFile = new File(TestUtils.DATA_DIR + "test.bed");
-    private File binaryBedFile;
-    private final static File tabixBedFile = new File(TestUtils.DATA_DIR + "test.tabix.bed.gz");
-
-    @BeforeClass
-    public void setup() throws IOException {
-        binaryBedFile = File.createTempFile("htsjdk-test.featurereader", ".bed");
-        binaryBedFile.deleteOnExit();
-        ExampleBinaryCodec.convertToBinaryTest(asciiBedFile, binaryBedFile, new BEDCodec());
-    }
-
-    @AfterClass
-    public void tearDown() throws Exception {
-        binaryBedFile.delete();
-    }
-
-    @DataProvider(name = "indexProvider")
-    public Object[][] createData1() {
-        return new Object[][]{
-                {asciiBedFile, IndexFactory.IndexType.LINEAR, new BEDCodec()},
-                {asciiBedFile, IndexFactory.IndexType.INTERVAL_TREE, new BEDCodec()},
-                {tabixBedFile, IndexFactory.IndexType.TABIX, new BEDCodec()},
-                {binaryBedFile, IndexFactory.IndexType.LINEAR, new ExampleBinaryCodec()},
-                {binaryBedFile, IndexFactory.IndexType.INTERVAL_TREE, new ExampleBinaryCodec()},
-        };
-    }
-
-    @Test(dataProvider = "indexProvider")
-    public void testBedQuery(final File featureFile, final IndexFactory.IndexType indexType, final FeatureCodec<Feature, LocationAware> codec) throws IOException {
-        final AbstractFeatureReader<Feature, ?> reader = getReader(featureFile, indexType, codec);
-
-        // Query
-        testQuery(reader, "chr1", 1, 500, 3);
-        testQuery(reader, "chr1", 1, 200, 1);
-        testQuery(reader, "chr1", 1, 201, 2);
-        testQuery(reader, "chr1", 500, 600, 0);
-        testQuery(reader, "chr1", 100000, 100010, 1);
-        testQuery(reader, "chr1", 100000, 100000, 0);
-        testQuery(reader, "chr1", 100001, 100001, 1);
-        testQuery(reader, "chr1", 100005, 100006, 1);
-        testQuery(reader, "chr1", 100009, 100011, 1);
-        testQuery(reader, "chr1", 100010, 100010, 1);
-        testQuery(reader, "chr1", 100011, 100011, 0);
-        testQuery(reader, "chr2", 1, 100, 2);
-        testQuery(reader, "chr2", 1, 10, 1);
-        testQuery(reader, "chr2", 15, 16, 0);
-        testQuery(reader, "chr3", 1, 201, 0);
-
-        // Close reader
-        reader.close();
-    }
-
-    @Test(dataProvider = "indexProvider")
-    public void testLargeNumberOfQueries(final File featureFile, final IndexFactory.IndexType indexType, final FeatureCodec<Feature, LocationAware> codec) throws IOException {
-        final AbstractFeatureReader<Feature, LocationAware> reader = getReader(featureFile, indexType, codec);
-        for (int i = 0; i < 2000; i++) {
-            for (final int start : Arrays.asList(500, 200, 201, 600, 100000)) {
-                for (final String chr : Arrays.asList("chr1", "chr2", "chr3")) {
-                    CloseableTribbleIterator<Feature> iter = null;
-                    try {
-                        iter = reader.query(chr, start, start + 1);
-                        Assert.assertNotNull(iter, "Failed to create non-null iterator");
-                    } finally {
-                        CloserUtil.close(iter);
-                    }
-                }
-            }
-        }
-
-        // Close reader
-        reader.close();
-    }
-
-    private void testQuery(final AbstractFeatureReader<Feature, ?> reader, final String chr, final int start, final int stop, final int expectedNumRecords) throws IOException {
-        final Iterator<Feature> iter = reader.query(chr, start, stop);
-        int count = 0;
-        while (iter.hasNext()) {
-            final Feature f = iter.next();
-            Assert.assertTrue(f.getEnd() >= start && f.getStart() <= stop);
-            count++;
-        }
-        Assert.assertEquals(count, expectedNumRecords);
-    }
-
-    @Test(dataProvider = "indexProvider")
-    public void testBedNames(final File featureFile, final IndexFactory.IndexType indexType, final FeatureCodec<Feature, LocationAware> codec) throws IOException {
-        final AbstractFeatureReader<Feature, ?> reader = getReader(featureFile, indexType, codec);
-        final String[] expectedSequences = {"chr1", "chr2"};
-
-        final List<String> seqNames = reader.getSequenceNames();
-        Assert.assertEquals(seqNames.size(), expectedSequences.length,
-                "Expected sequences " + ParsingUtils.join(",", expectedSequences) + " but saw " + ParsingUtils.join(",", seqNames));
-
-        for (final String s : expectedSequences) {
-            Assert.assertTrue(seqNames.contains(s));
-        }
-    }
-
-    private static <FEATURE extends Feature, SOURCE extends LocationAware> AbstractFeatureReader<FEATURE, SOURCE> getReader(final File featureFile,
-                                                                                                                            final IndexFactory.IndexType indexType,
-                                                                                                                            final FeatureCodec<FEATURE, SOURCE> codec)
-            throws IOException {
-        if (indexType.canCreate()) {
-            // for types we can create make a new index each time
-            final File idxFile = Tribble.indexFile(featureFile);
-
-            // delete an already existing index
-            if (idxFile.exists()) {
-                idxFile.delete();
-            }
-            final Index idx = IndexFactory.createIndex(featureFile, codec, indexType);
-            idx.write(idxFile);
-
-            idxFile.deleteOnExit();
-        } // else  let's just hope the index exists, and if so use it
-
-        return AbstractFeatureReader.getFeatureReader(featureFile.getAbsolutePath(), codec);
-    }
-
-    @Test
-    public void testReadingBeyondIntSizedBlock() throws IOException {
-        final Block block = new Block(0, ((long) Integer.MAX_VALUE) * 2);
-        final SeekableFileStream stream = new SeekableFileStream(new File("/dev/zero"));
-        final TribbleIndexedFeatureReader.BlockStreamWrapper blockStreamWrapper = new TribbleIndexedFeatureReader.BlockStreamWrapper(stream, block);
-        final int chunkSize = 100000; // 10 Mb
-        final int chunksToRead = (int) Math.ceil(block.getSize() / (chunkSize * 1.0));
-
-        final byte[] bytes = new byte[chunkSize];
-        long totalRead = 0;
-        for (int chunk = 0; chunk < chunksToRead; chunk++) {
-            //System.out.println("Reading chunk " + chunk + " of " + chunkSize + " total read " + totalRead);
-            final int nRead = blockStreamWrapper.read(bytes);
-            Assert.assertTrue(nRead != -1, "Prematurely got EOF after " + totalRead + " bytes");
-            totalRead += nRead;
-        }
-
-        // /dev/zero doesn't advance file stream on Linux, so reading never terminates
-        // Therefore, we only require a minimum number of bytes
-        Assert.assertTrue(totalRead >= block.getSize(), "Failed to read all bytes from a block with size > 2B = " + block.getSize());
-
-    }
-}
-
diff --git a/src/test/java/htsjdk/tribble/TestUtils.java b/src/test/java/htsjdk/tribble/TestUtils.java
deleted file mode 100644
index f686d25..0000000
--- a/src/test/java/htsjdk/tribble/TestUtils.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/** 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.tribble;
-
-
-/**
- * User: jacob
- * Date: 2012-Dec-13
- */
-public class TestUtils {
-    public static String DATA_DIR = "src/test/resources/htsjdk/tribble/";
-}
diff --git a/src/test/java/htsjdk/tribble/TribbleIndexFeatureReaderTest.java b/src/test/java/htsjdk/tribble/TribbleIndexFeatureReaderTest.java
deleted file mode 100644
index afdd827..0000000
--- a/src/test/java/htsjdk/tribble/TribbleIndexFeatureReaderTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.tribble.readers.LineIterator;
-import htsjdk.tribble.TestUtils;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFCodec;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-
-import static org.testng.Assert.assertEquals;
-
-
-public class TribbleIndexFeatureReaderTest {
-
-    @DataProvider(name = "extensionURIStrings")
-    public Object[][] createBlockCompressedExtensionURIs() {
-        return new Object[][]{
-                {"testzip.gz", true},
-                {"testzip.GZ", true},
-                {"testzip.gZ", true},
-                {"testzip.Gz", true},
-
-                {"test", false},
-                {"test.gzip", false},
-                {"test.bgz", false},
-                {"test.bgzf", false},
-                {"test.bzip2", false},
-
-                {"file://testzip.gz", true},
-                {"file://apath/testzip.gz", true},
-
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gz", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.GZ", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gzip", false},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgz", false},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgzf", false},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bzip2", false},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877", false},
-
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gz?alt=media", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.GZ?alt=media", true},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gzip?alt=media", false},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgz?alt=media", false},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgzf?alt=media", false},
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bzip2?alt=media", false},
-
-                {"ftp://ftp.broadinstitute.org/distribution/igv/TEST/cpgIslands.hg18.gz", true},
-                {"ftp://ftp.broadinstitute.org/distribution/igv/TEST/cpgIslands.hg18.bed", false},
-
-                {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gz", true},
-        };
-    }
-
-    @Test(enabled = true, dataProvider = "extensionURIStrings")
-    public void testGZExtension(final String testString, final boolean expected) throws URISyntaxException {
-        Assert.assertEquals(TribbleIndexedFeatureReader.isGZIPPath(testString), expected);
-    }
-
-    @DataProvider(name = "featureFileStrings")
-    public Object[][] createFeatureFileStrings() {
-        return new Object[][]{
-                {TestUtils.DATA_DIR + "test.vcf", 5},
-                {TestUtils.DATA_DIR + "test.vcf.gz", 5},
-                {TestUtils.DATA_DIR + "test.vcf.bgz", 5},
-                {TestUtils.DATA_DIR + "test with spaces.vcf", 5}
-        };
-    }
-
-    @Test(dataProvider = "featureFileStrings")
-    public void testIndexedGZIPVCF(final String testPath, final int expectedCount) throws IOException {
-        final VCFCodec codec = new VCFCodec();
-        try (final TribbleIndexedFeatureReader<VariantContext, LineIterator> featureReader =
-                new TribbleIndexedFeatureReader(testPath, codec, false)) {
-            final CloseableTribbleIterator<VariantContext> localIterator = featureReader.iterator();
-            int count = 0;
-            for (final Feature feat : featureReader.iterator()) {
-                localIterator.next();
-                count++;
-            }
-            Assert.assertEquals(count, expectedCount);
-        }
-    }
-
-}
diff --git a/src/test/java/htsjdk/tribble/TribbleTest.java b/src/test/java/htsjdk/tribble/TribbleTest.java
deleted file mode 100644
index e8366c4..0000000
--- a/src/test/java/htsjdk/tribble/TribbleTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.tribble.util.TabixUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-
-public class TribbleTest {
-
-    @Test
-    public void testStandardIndex() {
-
-	final String vcf = "foo.vcf";
-	final String expectedIndex = vcf + Tribble.STANDARD_INDEX_EXTENSION;
-
-	Assert.assertEquals(Tribble.indexFile(vcf), expectedIndex);
-	Assert.assertEquals(Tribble.indexFile(new File(vcf).getAbsolutePath()), new File(expectedIndex).getAbsolutePath());
-    }
-
-    @Test
-    public void testTabixIndex() {
-
-	final String vcf = "foo.vcf.gz";
-	final String expectedIndex = vcf + TabixUtils.STANDARD_INDEX_EXTENSION;
-
-	Assert.assertEquals(Tribble.tabixIndexFile(vcf), expectedIndex);
-	Assert.assertEquals(Tribble.tabixIndexFile(new File(vcf).getAbsolutePath()), new File(expectedIndex).getAbsolutePath());
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/bed/BEDCodecTest.java b/src/test/java/htsjdk/tribble/bed/BEDCodecTest.java
deleted file mode 100644
index dbf23a0..0000000
--- a/src/test/java/htsjdk/tribble/bed/BEDCodecTest.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (c) 2010, The Broad Institute
- *
- * 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 AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble.bed;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.annotation.Strand;
-import htsjdk.tribble.bed.FullBEDFeature.Exon;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.index.linear.LinearIndex;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.awt.*;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.List;
-
-public class BEDCodecTest {
-
-    @Test
-    public void testSimpleDecode() {
-        BEDCodec codec = new BEDCodec();
-
-        BEDFeature feature;
-
-        feature = codec.decode("chr1 1");
-        Assert.assertEquals(feature.getContig(), "chr1");
-        Assert.assertEquals(feature.getStart(), 2);
-        Assert.assertEquals(feature.getEnd(), 2);
-
-        feature = codec.decode("chr1 1 2");
-        Assert.assertEquals(feature.getContig(), "chr1");
-        Assert.assertEquals(feature.getStart(), 2);
-        Assert.assertEquals(feature.getEnd(), 2);
-
-        feature = codec.decode("chr1 1 3");
-        Assert.assertEquals(feature.getContig(), "chr1");
-        Assert.assertEquals(feature.getStart(), 2);
-        Assert.assertEquals(feature.getEnd(), 3);
-    }
-
-    @Test
-    public void testFullDecode() {
-        BEDCodec codec = new BEDCodec();
-
-        FullBEDFeature feature;
-        List<Exon> exons;
-
-        // Borrowed samples from Example: on http://genome.ucsc.edu/FAQ/FAQformat#format1
-
-        feature = (FullBEDFeature) codec.decode("chr22 1000 5000 cloneA 960 + 1000 5000 0 2 567,488, 0,3512");
-        Assert.assertEquals(feature.getContig(), "chr22");
-        Assert.assertEquals(feature.getStart(), 1001);
-        Assert.assertEquals(feature.getEnd(), 5000);
-        Assert.assertEquals(feature.getName(), "cloneA");
-        Assert.assertEquals(feature.getScore(), 960f);
-        Assert.assertEquals(feature.getStrand(), Strand.POSITIVE);
-        Assert.assertEquals(feature.getColor(), new Color(0));
-
-        exons = feature.getExons();
-        Assert.assertEquals(exons.size(), 2);
-
-        Assert.assertEquals(exons.get(0).getNumber(), 1);
-        Assert.assertEquals(exons.get(0).start, 1001);
-        Assert.assertEquals(exons.get(0).end, 1567);
-        Assert.assertEquals(exons.get(0).getCdStart(), 1001);
-        Assert.assertEquals(exons.get(0).getCdEnd(), 1567);
-        Assert.assertEquals(exons.get(0).getCodingLength(), 567);
-
-        Assert.assertEquals(exons.get(1).getNumber(), 2);
-        Assert.assertEquals(exons.get(1).start, 4513);
-        Assert.assertEquals(exons.get(1).end, 5000);
-        Assert.assertEquals(exons.get(1).getCdStart(), 4513);
-        Assert.assertEquals(exons.get(1).getCdEnd(), 5000);
-        Assert.assertEquals(exons.get(1).getCodingLength(), 488);
-
-        feature = (FullBEDFeature) codec.decode("chr22 2000 6000 cloneB 900 - 2000 6000 0 2 433,399, 0,3601");
-        Assert.assertEquals(feature.getContig(), "chr22");
-        Assert.assertEquals(feature.getStart(), 2001);
-        Assert.assertEquals(feature.getEnd(), 6000);
-        Assert.assertEquals(feature.getName(), "cloneB");
-        Assert.assertEquals(feature.getScore(), 900f);
-        Assert.assertEquals(feature.getStrand(), Strand.NEGATIVE);
-        Assert.assertEquals(feature.getColor(), new Color(0));
-
-        exons = feature.getExons();
-        Assert.assertEquals(exons.size(), 2);
-
-        Assert.assertEquals(exons.get(0).getNumber(), 2);
-        Assert.assertEquals(exons.get(0).start, 2001);
-        Assert.assertEquals(exons.get(0).end, 2433);
-        Assert.assertEquals(exons.get(0).getCdStart(), 2001);
-        Assert.assertEquals(exons.get(0).getCdEnd(), 2433);
-        Assert.assertEquals(exons.get(0).getCodingLength(), 433);
-
-        Assert.assertEquals(exons.get(1).getNumber(), 1);
-        Assert.assertEquals(exons.get(1).start, 5602);
-        Assert.assertEquals(exons.get(1).end, 6000);
-        Assert.assertEquals(exons.get(1).getCdStart(), 5602);
-        Assert.assertEquals(exons.get(1).getCdEnd(), 6000);
-        Assert.assertEquals(exons.get(1).getCodingLength(), 399);
-    }
-
-    @Test
-    public void testDecodeBEDFile_good() throws Exception {
-        String filepath = TestUtils.DATA_DIR + "bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19_fixed.bed";
-        int expected_lines = 34;
-        /*
-        Line 0:
-        1	25592413	25657872
-        Line 3:
-        1	152555536	152587611
-        Line 28:
-        14	73996607	74025282
-        Remember tribble increments numbers by 1
-         */
-
-        BEDCodec codec = new BEDCodec();
-
-        AbstractFeatureReader reader = AbstractFeatureReader.getFeatureReader(filepath, codec, false);
-
-        Iterable<Feature> iter = reader.iterator();
-        int count = 0;
-        for (Feature feat : iter) {
-            Assert.assertTrue(feat.getContig().length() > 0);
-            Assert.assertTrue(feat.getEnd() >= feat.getStart());
-
-            if (count == 0) {
-                Assert.assertEquals("1", feat.getContig());
-                Assert.assertEquals(25592413 + 1, feat.getStart());
-                Assert.assertEquals(25657872, feat.getEnd());
-            }
-
-            if (count == 3) {
-                Assert.assertEquals("1", feat.getContig());
-                Assert.assertEquals(152555536 + 1, feat.getStart());
-                Assert.assertEquals(152587611, feat.getEnd());
-            }
-
-            if (count == 28) {
-                Assert.assertEquals("14", feat.getContig());
-                Assert.assertEquals(73996607 + 1, feat.getStart());
-                Assert.assertEquals(74025282, feat.getEnd());
-            }
-
-            count += 1;
-        }
-
-        Assert.assertEquals(expected_lines, count);
-
-        reader.close();
-
-    }
-
-    /**
-     * Test reading a BED file which is malformed.
-     *
-     * @throws Exception
-     */
-    @Test(expectedExceptions = RuntimeException.class)
-    public void testDecodeBEDFile_bad() throws Exception {
-        //This file has an extra tab in the second to last line
-        String filepath = TestUtils.DATA_DIR + "bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19.bed";
-        //The iterator implementation next() actually performs a get / read_next. The bad line is number 32,
-        //so we actually will only get 31 lines before reading that line.
-        int expected_count = 31;
-        BEDCodec codec = new BEDCodec();
-
-        AbstractFeatureReader reader = AbstractFeatureReader.getFeatureReader(filepath, codec, false);
-
-        Iterable<Feature> iter = reader.iterator();
-        int count = 0;
-        for (Feature feat : iter) {
-            count += 1;
-        }
-        reader.close();
-    }
-
-    private void createIndex(File testFile, File idxFile) throws IOException {
-        // Create an index if missing
-        if (idxFile.exists()) {
-            idxFile.delete();
-        }
-        LinearIndex idx = (LinearIndex) IndexFactory.createLinearIndex(testFile, new BEDCodec());
-
-        LittleEndianOutputStream stream = null;
-        try {
-            stream = new LittleEndianOutputStream(new BufferedOutputStream(new FileOutputStream(idxFile)));
-            idx.write(stream);
-        } finally {
-            if (stream != null) {
-                stream.close();
-            }
-        }
-    }
-
-    @Test
-    public void testGetTabixFormat() {
-        Assert.assertEquals(new BEDCodec().getTabixFormat(), TabixFormat.BED);
-    }
-
-    @Test
-    public void testCanDecode() {
-        final BEDCodec codec = new BEDCodec();
-        final String pattern = "filename.%s%s";
-        for(final String bcExt: AbstractFeatureReader.BLOCK_COMPRESSED_EXTENSIONS) {
-            Assert.assertTrue(codec.canDecode(String.format(pattern, "bed", bcExt)));
-            Assert.assertFalse(codec.canDecode(String.format(pattern, "vcf", bcExt)));
-            Assert.assertFalse(codec.canDecode(String.format(pattern, "bed.gzip", bcExt)));
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/gelitext/GeliTextTest.java b/src/test/java/htsjdk/tribble/gelitext/GeliTextTest.java
deleted file mode 100644
index c670bf1..0000000
--- a/src/test/java/htsjdk/tribble/gelitext/GeliTextTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package htsjdk.tribble.gelitext;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-
-
-/**
- * @author aaron
- *         <p/>
- *         Class GeliTextTest
- *         <p/>
- *         test out the geli text source codec and feature
- */
- at Deprecated
-public class GeliTextTest {
-    public static final File testFile = new File(TestUtils.DATA_DIR + "testGeliText.txt");
-    public static Index index;
-    private FeatureReader<GeliTextFeature> source;
-
-    // setup a new source before each class
-
-    @BeforeSuite
-    public void beforeTest() {
-        index = IndexFactory.createLinearIndex(testFile, new GeliTextCodec());
-        source = AbstractFeatureReader.getFeatureReader(testFile.getAbsolutePath(), new GeliTextCodec(), index);
-    }
-
-    @Test
-    public void testReadAllLines() {
-        // Query
-        try {
-            Iterator<GeliTextFeature> iter = source.query("22", 14438070, 14592250);
-            int count = 0;
-            while (iter.hasNext()) {
-                GeliTextFeature feat = iter.next();
-                count++;
-            }
-            Assert.assertEquals(count, 50);
-        } catch (IOException e) {
-            Assert.fail("failed to generate iterator from feature source");
-        }
-    }
-
-    @Test
-    public void testGetSubRegion() {
-        // Query
-        try {
-            Iterator<GeliTextFeature> iter = source.query("22", 14438070, 14539060); // should be the first 41 records
-            int count = 0;
-            while (iter.hasNext()) {
-                GeliTextFeature feat = iter.next();
-                count++;
-            }
-            Assert.assertEquals(count, 41);
-        } catch (IOException e) {
-            Assert.fail("failed to generate iterator from feature source");
-        }
-    }
-
-    @Test
-    public void testFirstRecord() {
-        // Query
-        try {
-            Iterator<GeliTextFeature> iter = source.query("22", 14438070, 14592250);
-            int count = 0;
-
-            GeliTextFeature feat = iter.next();
-            // check the first records contents
-            // 22 14438070 A   0 0     GG      33.2618 33.2618 0       0       0       0     0 0       0       33.2618 0       0
-            Assert.assertTrue("22".equals(feat.getContig()));
-            Assert.assertEquals(feat.getStart(), 14438070);
-            Assert.assertEquals('A', feat.getRefBase());
-            Assert.assertEquals(feat.getDepthOfCoverage(), 0.0, 0.0001);
-            Assert.assertEquals(feat.getMaximumMappingQual(), 0.0, 0.0001);
-            Assert.assertTrue(DiploidGenotype.GG.equals(feat.getGenotype()));
-            Assert.assertEquals(feat.getDepthOfCoverage(), 0.0, 0.0001);
-            Assert.assertEquals(feat.getLODBestToReference(), 33.2618, 0.0001);
-            Assert.assertEquals(feat.getLODBestToNext(), 33.2618, 0.0001);
-            for (int x = 0; x < feat.getLikelihoods().length; x++) {
-                if (x == DiploidGenotype.GG.ordinal())
-                    Assert.assertEquals(feat.getLikelihoods()[x], 33.2618, 0.0001);
-                else
-                    Assert.assertEquals(feat.getLikelihoods()[x], 0, 0.0001);
-            }
-
-        } catch (IOException e) {
-            Assert.fail("failed to generate iterator from feature source");
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/index/IndexFactoryTest.java b/src/test/java/htsjdk/tribble/index/IndexFactoryTest.java
deleted file mode 100644
index 016049f..0000000
--- a/src/test/java/htsjdk/tribble/index/IndexFactoryTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.index.linear.LinearIndex;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.index.tabix.TabixIndex;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFFileReader;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.List;
-
-/**
- * User: jacob
- * Date: 2012-Aug-23
- */
-public class IndexFactoryTest {
-
-    final File sortedBedFile = new File(TestUtils.DATA_DIR + "bed/Unigene.sample.bed");
-    final File unsortedBedFile = new File(TestUtils.DATA_DIR + "bed/unsorted.bed");
-    final File discontinuousFile = new File(TestUtils.DATA_DIR + "bed/disconcontigs.bed");
-    final BEDCodec bedCodec = new BEDCodec();
-
-    @Test
-    public void testCreateLinearIndex() throws Exception {
-        Index index = IndexFactory.createLinearIndex(sortedBedFile, bedCodec);
-        String chr = "chr2";
-
-        Assert.assertTrue(index.getSequenceNames().contains(chr));
-        Assert.assertTrue(index.containsChromosome(chr));
-        Assert.assertEquals(1, index.getSequenceNames().size());
-        List<Block> blocks = index.getBlocks(chr, 1, 50);
-        Assert.assertEquals(1, blocks.size());
-
-        Block block = blocks.get(0);
-        Assert.assertEquals(78, block.getSize());
-    }
-
-    @Test(expectedExceptions = TribbleException.MalformedFeatureFile.class, dataProvider = "indexFactoryProvider")
-    public void testCreateIndexUnsorted(IndexFactory.IndexType type) throws Exception{
-        Index index = IndexFactory.createIndex(unsortedBedFile, bedCodec, type);
-    }
-
-    @Test(expectedExceptions = TribbleException.MalformedFeatureFile.class, dataProvider = "indexFactoryProvider")
-    public void testCreateIndexDiscontinuousContigs(IndexFactory.IndexType type) throws Exception{
-        Index index = IndexFactory.createIndex(discontinuousFile, bedCodec, type);
-    }
-
-    @DataProvider(name = "indexFactoryProvider")
-    public Object[][] getIndexFactoryTypes(){
-        return new Object[][] {
-                new Object[] { IndexFactory.IndexType.LINEAR },
-                new Object[] { IndexFactory.IndexType.INTERVAL_TREE }
-        };
-    }
-
-    @Test
-    public void testCreateTabixIndexOnBlockCompressed() {
-        // index a VCF
-        final File inputFileVcf = new File("src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf");
-        final VCFFileReader readerVcf = new VCFFileReader(inputFileVcf, false);
-        final SAMSequenceDictionary vcfDict = readerVcf.getFileHeader().getSequenceDictionary();
-        final TabixIndex tabixIndexVcf =
-                IndexFactory.createTabixIndex(inputFileVcf, new VCFCodec(), TabixFormat.VCF,
-                vcfDict);
-
-        // index the same bgzipped VCF
-        final File inputFileVcfGz = new File("src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz");
-        final VCFFileReader readerVcfGz = new VCFFileReader(inputFileVcfGz, false);
-        final TabixIndex tabixIndexVcfGz =
-                IndexFactory.createTabixIndex(inputFileVcfGz, new VCFCodec(), TabixFormat.VCF,
-                        readerVcfGz.getFileHeader().getSequenceDictionary());
-
-        // assert that each sequence in the header that represents some VCF row ended up in the index
-        // for both the VCF and bgzipped VCF
-        for (SAMSequenceRecord samSequenceRecord : vcfDict.getSequences()) {
-            Assert.assertTrue(
-                    tabixIndexVcf.containsChromosome(samSequenceRecord.getSequenceName()),
-                    "Tabix indexed VCF does not contain sequence: " + samSequenceRecord.getSequenceName());
-
-            Assert.assertTrue(
-                    tabixIndexVcfGz.containsChromosome(samSequenceRecord.getSequenceName()),
-                    "Tabix indexed (bgzipped) VCF does not contain sequence: " + samSequenceRecord.getSequenceName());
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/index/IndexTest.java b/src/test/java/htsjdk/tribble/index/IndexTest.java
deleted file mode 100644
index aa179a9..0000000
--- a/src/test/java/htsjdk/tribble/index/IndexTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package htsjdk.tribble.index;
-
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.index.linear.LinearIndex;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.index.tabix.TabixIndex;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-import htsjdk.tribble.util.TabixUtils;
-import htsjdk.variant.vcf.VCFCodec;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class IndexTest {
-    private final static String CHR = "1";
-    private final static File MassiveIndexFile = new File(TestUtils.DATA_DIR + "Tb.vcf.idx");
-
-    @DataProvider(name = "StartProvider")
-    public Object[][] makeStartProvider() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-
-//        for ( int mid = 0; mid <= end; mid += 1000000 ) {
-//            tests.add(new Object[]{0, mid, mid+1000000, end});
-//        }
-
-        tests.add(new Object[]{1226943, 1226943, 1226943, 2000000});
-
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "StartProvider")
-    public void testMassiveQuery(final int start, final int mid, final int mid2, final int end) throws IOException {
-        LinearIndex index = (LinearIndex)IndexFactory.loadIndex(MassiveIndexFile.getAbsolutePath());
-
-        final List<Block> leftBlocks = index.getBlocks(CHR, start, mid);
-        final List<Block> rightBlocks = index.getBlocks(CHR, mid2, end); // gap must be big to avoid overlaps
-        final List<Block> allBlocks = index.getBlocks(CHR, start, end);
-
-        final long leftSize = leftBlocks.isEmpty() ? 0 : leftBlocks.get(0).getSize();
-        final long rightSize = rightBlocks.isEmpty() ? 0 : rightBlocks.get(0).getSize();
-        final long allSize = allBlocks.isEmpty() ? 0 : allBlocks.get(0).getSize();
-
-        Assert.assertTrue(leftSize >= 0, "Expected leftSize to be positive " + leftSize);
-        Assert.assertTrue(rightSize >= 0, "Expected rightSize to be positive " + rightSize);
-        Assert.assertTrue(allSize >= 0, "Expected allSize to be positive " + allSize);
-
-        Assert.assertTrue(allSize >= Math.max(leftSize,rightSize), "Expected size of joint query " + allSize + " to be at least >= max of left " + leftSize + " and right queries " + rightSize);
-    }
-
-
-    @DataProvider(name = "writeIndexData")
-    public Object[][] writeIndexData() {
-        return new Object[][]{
-                {new File("src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf"), IndexFactory.IndexType.LINEAR, new VCFCodec()},
-                {new File("src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz"), IndexFactory.IndexType.TABIX, new VCFCodec()},
-                {new File("src/test/resources/htsjdk/tribble/test.bed"), IndexFactory.IndexType.LINEAR, new BEDCodec()}
-        };
-    }
-
-    private final static OutputStream nullOutputStrem = new OutputStream() {
-        @Override
-        public void write(int b) throws IOException { }
-    };
-
-    @Test(dataProvider = "writeIndexData")
-    public void testWriteIndex(final File inputFile, final IndexFactory.IndexType type, final  FeatureCodec codec) throws Exception {
-        // temp index file for this test
-        final File tempIndex = File.createTempFile("index", (type == IndexFactory.IndexType.TABIX) ? TabixUtils.STANDARD_INDEX_EXTENSION : Tribble.STANDARD_INDEX_EXTENSION);
-        tempIndex.delete();
-        tempIndex.deleteOnExit();
-        // create the index
-        final Index index = IndexFactory.createIndex(inputFile, codec, type);
-        Assert.assertFalse(tempIndex.exists());
-        // write the index to a file
-        index.write(tempIndex);
-        Assert.assertTrue(tempIndex.exists());
-        // load the generated index
-        final Index loadedIndex = IndexFactory.loadIndex(tempIndex.getAbsolutePath());
-        // tess that the sequences and properties are the same
-        Assert.assertEquals(loadedIndex.getSequenceNames(), index.getSequenceNames());
-        Assert.assertEquals(loadedIndex.getProperties(), index.getProperties());
-        // test that write to a stream does not blows ip
-        index.write(new LittleEndianOutputStream(nullOutputStrem));
-    }
-
-}
diff --git a/src/test/java/htsjdk/tribble/index/interval/IntervalTreeTest.java b/src/test/java/htsjdk/tribble/index/interval/IntervalTreeTest.java
deleted file mode 100644
index ca47089..0000000
--- a/src/test/java/htsjdk/tribble/index/interval/IntervalTreeTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.interval;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.CloseableTribbleIterator;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.bed.BEDFeature;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * User: jrobinso
- * Date: Mar 24, 2010
- */
-public class IntervalTreeTest {
-
-    static IntervalTree tree;
-
-    @BeforeClass
-    public static void setupTree() {
-        tree = new IntervalTree();
-        tree.insert(new Interval(0, 3, null));
-        tree.insert(new Interval(5, 8, null));
-        tree.insert(new Interval(6, 10, null));
-        tree.insert(new Interval(8, 9, null));
-        tree.insert(new Interval(15, 23, null));
-        tree.insert(new Interval(16, 21, null));
-        tree.insert(new Interval(17, 19, null));
-        tree.insert(new Interval(19, 20, null));
-        tree.insert(new Interval(25, 30, null));
-        tree.insert(new Interval(26, 27, null));
-    }
-
-    @Test
-    public void testSearch() {
-
-        final Interval queryInterval = new Interval(1, 2);
-        List<Interval> intervals = tree.findOverlapping(queryInterval);
-        Assert.assertNotNull(intervals);
-
-        for (Interval iv : intervals) {
-            Assert.assertTrue(queryInterval.overlaps(iv));
-        }
-    }
-
-    @Test
-    public void testBed() throws Exception {
-        String bedFile = TestUtils.DATA_DIR + "/index/chrY_Y4_small.bed";
-        tree = new IntervalTree();
-        Assert.assertTrue(tree.isValid());
-
-        BufferedReader br = new BufferedReader(new FileReader(bedFile));
-        String nextLine = "";
-        while ((nextLine = br.readLine()) != null) {
-            if (!(nextLine.startsWith("#") || nextLine.startsWith("track"))) {
-                String[] tokens = nextLine.split("\t");
-                if (tokens.length > 2) {
-                    int start = Integer.parseInt(tokens[1]);
-                    int end = Integer.parseInt(tokens[2]);
-                    tree.insert(new Interval(start, end));
-                }
-
-            }
-        }
-
-//        List iv = (List) tree.findOverlapping(new Interval(2770226, 2770300));
-        Interval searchInterval = new Interval(2782632, 2782732);
-        List<Interval> iv = tree.findOverlapping(searchInterval);
-        for (Interval i : iv) {
-            Assert.assertTrue(i.overlaps(searchInterval));
-        }
-
-        br.close();
-
-    }
-
-    @Test
-    /**
-     *
-     * chr2	1	200000000	LONG_FEATURE
-     * ...
-     * chr2	179098961	179380395	Hs.134602
-     * chr2	179209546	179287210	Hs.620337
-     * chr2	179266309	179266748	Hs.609465
-     * chr2	179296428	179300012	Hs.623987
-     * chr2	179302952	179303488	Hs.594545
-
-     */
-    public void testOverlappingFeatures() throws Exception {
-        //chr2:179,222,066-179,262,059<- CONTAINS TTN
-
-        Set<String> names = new HashSet<String>(Arrays.asList("Hs.134602", "Hs.620337", "Hs.609465", "Hs.623987",
-                "Hs.594545", "LONG_FEATURE"));
-
-        String bedFile = TestUtils.DATA_DIR + "/bed/Unigene.sample.bed";
-        String chr = "chr2";
-        int start = 179266309;
-        int end = 179303488 ;
-        int expectedCount = 6;
-
-
-        // Interval tree index
-        int batchSize = 1;
-        Index idx = IndexFactory.createIntervalIndex(new File(bedFile), new BEDCodec(), batchSize);
-
-        FeatureReader<BEDFeature> bfr = AbstractFeatureReader.getFeatureReader(bedFile, new BEDCodec(), idx);
-        CloseableTribbleIterator<BEDFeature>iter = bfr.query(chr, start, end);
-        int countInterval = 0;
-        while (iter.hasNext()) {
-            BEDFeature feature = iter.next();
-            Assert.assertTrue(feature.getEnd() >= start && feature.getStart() <= end);
-            Assert.assertTrue(names.contains(feature.getName()));
-            countInterval++;
-        }
-
-        Assert.assertEquals(countInterval, expectedCount);
-
-
-    }
-
-
-}
-
diff --git a/src/test/java/htsjdk/tribble/index/linear/LinearIndexTest.java b/src/test/java/htsjdk/tribble/index/linear/LinearIndexTest.java
deleted file mode 100644
index 09f920e..0000000
--- a/src/test/java/htsjdk/tribble/index/linear/LinearIndexTest.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (c) 2009-2010 by The Broad Institute, Inc.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.linear;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.CloseableTribbleIterator;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.bed.BEDFeature;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class LinearIndexTest {
-    private static final File RANDOM_FILE = new File("notMeaningful");
-
-    private final static Block CHR1_B1 = new Block(1, 10);
-    private final static Block CHR1_B2 = new Block(10, 20);
-    private final static Block CHR1_B3 = new Block(20, 30);
-    private final static Block CHR2_B1 = new Block(1, 100);
-    private final static Block CHR2_B2 = new Block(100, 200);
-
-    private LinearIndex idx;
-
-    @BeforeTest
-    public void setup() {
-        idx = createTestIndex();
-    }
-
-    // chr1 (0, 10]
-    // chr1 (10, 20]
-    // chr1 (20, 30]
-    // chr2 (0, 100]
-    // chr2 (100, 200]
-    private static LinearIndex createTestIndex() {
-        final LinearIndex.ChrIndex chr1 = new LinearIndex.ChrIndex("chr1", 10);
-        chr1.addBlock(CHR1_B1);
-        chr1.addBlock(CHR1_B2);
-        chr1.addBlock(CHR1_B3);
-        chr1.updateLongestFeature(1);
-
-        final LinearIndex.ChrIndex chr2 = new LinearIndex.ChrIndex("chr2", 100);
-        chr2.addBlock(CHR2_B1);
-        chr2.addBlock(CHR2_B2);
-        chr2.updateLongestFeature(50);
-
-        final List<LinearIndex.ChrIndex> indices = Arrays.asList(chr1, chr2);
-        return new LinearIndex(indices, RANDOM_FILE);
-    }
-
-    @Test()
-    public void testBasicFeatures() {
-        Assert.assertEquals(idx.getChrIndexClass(), LinearIndex.ChrIndex.class);
-        Assert.assertEquals(idx.getType(), LinearIndex.INDEX_TYPE);
-        Assert.assertFalse(idx.hasFileSize());
-        Assert.assertFalse(idx.hasTimestamp());
-        Assert.assertFalse(idx.hasMD5());
-        Assert.assertTrue(idx.isCurrentVersion());
-
-        Assert.assertNotNull(idx.getSequenceNames());
-        Assert.assertEquals(idx.getSequenceNames().size(), 2);
-        Assert.assertTrue(idx.getSequenceNames().contains("chr1"));
-        Assert.assertTrue(idx.getSequenceNames().contains("chr2"));
-        Assert.assertTrue(idx.containsChromosome("chr1"));
-        Assert.assertTrue(idx.containsChromosome("chr2"));
-        Assert.assertFalse(idx.containsChromosome("chr3"));
-
-        Assert.assertEquals(idx.getIndexedFile(), new File(RANDOM_FILE.getAbsolutePath()));
-
-        Assert.assertNotNull(idx.getBlocks("chr1"));
-        Assert.assertEquals(idx.getBlocks("chr1").size(), 3);
-
-        Assert.assertNotNull(idx.getBlocks("chr2"));
-        Assert.assertEquals(idx.getBlocks("chr2").size(), 2);
-    }
-
-    @Test()
-    public void testEquals() {
-        final LinearIndex idx2 = createTestIndex();
-
-        Assert.assertEquals(idx, idx, "Identical indices are equal");
-        Assert.assertTrue(idx.equalsIgnoreProperties(idx), "Identical indices are equalIgnoreTimeStamp");
-        Assert.assertTrue(idx.equalsIgnoreProperties(idx2), "Indices constructed the same are equalIgnoreTimeStamp");
-
-        idx2.setTS(123456789);
-        Assert.assertNotSame(idx, idx2, "Indices with different timestamps are not the same");
-        Assert.assertTrue(idx.equalsIgnoreProperties(idx2), "Indices with different timestamps are equalIgnoreTimeStamp");
-    }
-
-
-    // chr1 (0, 10]
-    // chr1 (10, 20]
-    // chr1 (20, 30]
-    // chr2 (0, 100]
-    // chr2 (100, 200]
-    //@Test()
-    // TODO -- this is not a useful test as written -- the linear index always returns a single block since by
-    // TODO -- definition they are contiguous and can be collapsed to a single block.
-    public void testBasicQuery() {
-        testQuery("chr1", 1, 1, CHR1_B1);
-        testQuery("chr1", 1, 2, CHR1_B1);
-        testQuery("chr1", 1, 9, CHR1_B1);
-        testQuery("chr1", 10, 10, CHR1_B1);
-
-        testQuery("chr1", 10, 11, CHR1_B1, CHR1_B2);
-        testQuery("chr1", 11, 11, CHR1_B2);
-        testQuery("chr1", 11, 12, CHR1_B2);
-        testQuery("chr1", 11, 19, CHR1_B2);
-
-        testQuery("chr1", 10, 19, CHR1_B1, CHR1_B2);
-        testQuery("chr1", 10, 21, CHR1_B1, CHR1_B2, CHR1_B3);
-        testQuery("chr1", 25, 30, CHR1_B3);
-        testQuery("chr1", 35, 40);
-
-        testQuery("chr2", 1, 1, CHR2_B1);
-        testQuery("chr2", 100, 100, CHR2_B1);
-        testQuery("chr2", 125, 125, CHR2_B1, CHR2_B2); // because of the 50 bp events
-        testQuery("chr2", 151, 151, CHR2_B2); // because of the 50 bp events
-        testQuery("chr2", 249, 249, CHR2_B2); // because of the 50 bp events
-        testQuery("chr2", 251, 251); // just escaping the 50 bp longest event
-    }
-
-    private final void testQuery(final String chr, final int start, final int stop, final Block... expectedBlocksArray) {
-        final List<Block> qBlocks = idx.getBlocks(chr, start, stop);
-        final List<Block> eBlocks = Arrays.asList(expectedBlocksArray);
-
-        Assert.assertEquals(qBlocks.size(), eBlocks.size(),
-                String.format("Query %s:%d-%d returned %d blocks but we only expected %d.", chr, start, stop, qBlocks.size(), eBlocks.size()));
-        for (int i = 0; i < qBlocks.size(); i++)
-            Assert.assertEquals(qBlocks.get(i), eBlocks.get(i));
-    }
-
-    File fakeBed = new File(TestUtils.DATA_DIR + "fakeBed.bed");
-
-    @Test
-    public void oneEntryFirstChr() {
-        final BEDCodec code = new BEDCodec();
-        final Index index = IndexFactory.createLinearIndex(fakeBed, code);
-        final AbstractFeatureReader reader = AbstractFeatureReader.getFeatureReader(fakeBed.getAbsolutePath(), code, index);
-
-        try {
-            final CloseableTribbleIterator it = reader.iterator();
-            int count = 0;
-            while (it.hasNext()) {
-                it.next();
-                count++;
-            }
-            Assert.assertEquals(51, count);
-        } catch (final IOException e) {
-            Assert.fail("Unable to get iterator due to " + e.getMessage());
-        }
-    }
-
-
-    @Test
-    /**
-     *
-     * chr2	1	200000000	LONG_FEATURE
-     * ...
-     * chr2	179098961	179380395	Hs.134602
-     * chr2	179209546	179287210	Hs.620337
-     * chr2	179266309	179266748	Hs.609465
-     * chr2	179296428	179300012	Hs.623987
-     * chr2	179302952	179303488	Hs.594545
-
-     */
-    public void testOverlappingFeatures() throws Exception {
-        //chr2:179,222,066-179,262,059<- CONTAINS TTN
-
-        final Set<String> names = new HashSet<String>(Arrays.asList("Hs.134602", "Hs.620337", "Hs.609465", "Hs.623987",
-                "Hs.594545", "LONG_FEATURE"));
-
-        final String bedFile = TestUtils.DATA_DIR + "bed/Unigene.sample.bed";
-        final String chr = "chr2";
-        final int start = 179266309;
-        final int end = 179303488;
-        final int expectedCount = 6;
-
-
-        // Linear binned index
-        LinearIndex.enableAdaptiveIndexing = false;
-        final int binSize = 1000;
-        Index idx = IndexFactory.createLinearIndex(new File(bedFile), new BEDCodec(), binSize);
-
-        FeatureReader<BEDFeature> bfr = AbstractFeatureReader.getFeatureReader(bedFile, new BEDCodec(), idx);
-        CloseableTribbleIterator<BEDFeature> iter = bfr.query(chr, start, end);
-        int countInterval = 0;
-        while (iter.hasNext()) {
-            final BEDFeature feature = iter.next();
-            Assert.assertTrue(feature.getEnd() >= start && feature.getStart() <= end);
-            Assert.assertTrue(names.contains(feature.getName()));
-            countInterval++;
-        }
-
-        Assert.assertEquals(countInterval, expectedCount);
-
-        //Repeat with adaptive indexing
-        LinearIndex.enableAdaptiveIndexing = true;
-        idx = IndexFactory.createLinearIndex(new File(bedFile), new BEDCodec(), binSize);
-
-        bfr = AbstractFeatureReader.getFeatureReader(bedFile, new BEDCodec(), idx);
-        iter = bfr.query(chr, start, end);
-        countInterval = 0;
-        while (iter.hasNext()) {
-            final BEDFeature feature = iter.next();
-            Assert.assertTrue(feature.getEnd() >= start && feature.getStart() <= end);
-            Assert.assertTrue(names.contains(feature.getName()));
-            countInterval++;
-        }
-
-        Assert.assertEquals(countInterval, expectedCount);
-
-
-    }
-
-}
diff --git a/src/test/java/htsjdk/tribble/index/tabix/TabixIndexTest.java b/src/test/java/htsjdk/tribble/index/tabix/TabixIndexTest.java
deleted file mode 100644
index 6981b87..0000000
--- a/src/test/java/htsjdk/tribble/index/tabix/TabixIndexTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index.tabix;
-
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-import htsjdk.tribble.util.TabixUtils;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.writer.VariantContextWriter;
-import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFFileReader;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-
-public class TabixIndexTest {
-    private static final File SMALL_TABIX_FILE = new File("src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz.tbi");
-    private static final File BIGGER_TABIX_FILE = new File("src/test/resources/htsjdk/tribble/tabix/bigger.vcf.gz.tbi");
-
-    /**
-     * Read an existing index from disk, write it to a temp file, read that in, and assert that both in-memory
-     * representations are identical.  Disk representations may not be identical due to arbitrary bin order and
-     * compression differences.
-     */
-    @Test(dataProvider = "readWriteTestDataProvider")
-    public void readWriteTest(final File tabixFile) throws Exception {
-        final TabixIndex index = new TabixIndex(tabixFile);
-        final File indexFile = File.createTempFile("TabixIndexTest.", TabixUtils.STANDARD_INDEX_EXTENSION);
-        indexFile.deleteOnExit();
-        final LittleEndianOutputStream los = new LittleEndianOutputStream(new BlockCompressedOutputStream(indexFile));
-        index.write(los);
-        los.close();
-        final TabixIndex index2 = new TabixIndex(indexFile);
-        Assert.assertEquals(index, index2);
-        // Unfortunately, can't do byte comparison of original file and temp file, because 1) different compression
-        // levels; and more importantly, arbitrary order of bins in bin list.
-    }
-
-    @DataProvider(name = "readWriteTestDataProvider")
-    public Object[][] readWriteTestDataProvider() {
-        return new Object[][]{
-                {SMALL_TABIX_FILE},
-                {BIGGER_TABIX_FILE}
-        };
-    }
-
-    @Test
-    public void testQueryProvidedItemsAmount() throws IOException {
-        final String VCF = "src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf";
-        // Note that we store only compressed files
-        final File plainTextVcfInputFile = new File(VCF);
-        plainTextVcfInputFile.deleteOnExit();
-        final File plainTextVcfIndexFile = new File(VCF + ".tbi");
-        plainTextVcfIndexFile.deleteOnExit();
-        final File compressedVcfInputFile = new File(VCF + ".gz");
-        final File compressedTbiIndexFile = new File(VCF + ".gz.tbi");
-        final VCFFileReader compressedVcfReader = new VCFFileReader(compressedVcfInputFile, compressedTbiIndexFile);
-
-        //create plain text VCF without "index on the fly" option
-        final VariantContextWriter plainTextVcfWriter = new VariantContextWriterBuilder()
-                .setOptions(VariantContextWriterBuilder.NO_OPTIONS)
-                .setOutputFile(VCF)
-                .build();
-        plainTextVcfWriter.writeHeader(compressedVcfReader.getFileHeader());
-        for (VariantContext vc : compressedVcfReader) {
-            if (vc != null) plainTextVcfWriter.add(vc);
-        }
-        plainTextVcfWriter.close();
-
-        IndexFactory.createTabixIndex(plainTextVcfInputFile,
-                new VCFCodec(),
-                TabixFormat.VCF,
-                new VCFFileReader(plainTextVcfInputFile, false).getFileHeader().getSequenceDictionary()
-        ) // create TabixIndex straight from plaintext VCF
-                .write(plainTextVcfIndexFile); // write it
-
-        final VCFFileReader plainTextVcfReader = new VCFFileReader(plainTextVcfInputFile, plainTextVcfIndexFile);
-        // Now we have both plaintext and compressed VCFs with provided TabixIndex-es and could test their "queryability"
-
-        // magic numbers chosen from just looking in provided VCF file
-        try {
-            // just somewhere in middle of chromosome
-            Assert.assertEquals(42, countIteratedElements(compressedVcfReader.query("1", 868379 - 1, 1006891 + 1)));
-            Assert.assertEquals(42, countIteratedElements(plainTextVcfReader.query("1", 868379 - 1, 1006891 + 1)));
-            // chromosome start
-            Assert.assertEquals(13, countIteratedElements(compressedVcfReader.query("1", 1, 836463 + 1)));
-            Assert.assertEquals(13, countIteratedElements(plainTextVcfReader.query("1", 1, 836463 + 1)));
-            // chromosome end
-            Assert.assertEquals(36, countIteratedElements(compressedVcfReader.query("1", 76690833 - 1, 76837502 + 11111111)));
-            Assert.assertEquals(36, countIteratedElements(plainTextVcfReader.query("1", 76690833 - 1, 76837502 + 11111111)));
-            // where's no one feature in the middle of chromosome
-            Assert.assertEquals(0, countIteratedElements(compressedVcfReader.query("1", 36606472 + 1, 36623523 - 1)));
-            Assert.assertEquals(0, countIteratedElements(plainTextVcfReader.query("1", 36606472 + 1, 36623523 - 1)));
-            // before chromosome
-            Assert.assertEquals(0, countIteratedElements(compressedVcfReader.query("1", 1, 10)));
-            Assert.assertEquals(0, countIteratedElements(plainTextVcfReader.query("1", 1, 10)));
-            // after chromosome
-            Assert.assertEquals(0, countIteratedElements(compressedVcfReader.query("1", 76837502 * 15, 76837502 * 16)));
-            Assert.assertEquals(0, countIteratedElements(plainTextVcfReader.query("1", 76837502 * 15, 76837502 * 16)));
-        } catch (NullPointerException e) {
-            Assert.fail("Exception caught on querying: ", e);
-            // before fix exception was thrown from 'TabixIndex.getBlocks()' on 'chunks.size()' while 'chunks == null' for plain files
-        } finally {
-            plainTextVcfReader.close();
-            compressedVcfReader.close();
-        }
-    }
-
-    private static int countIteratedElements(Iterator iterator) {
-        int counter = 0;
-        while (iterator.hasNext()) {
-            iterator.next();
-            counter++;
-        }
-        return counter;
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/AsciiLineReaderTest.java b/src/test/java/htsjdk/tribble/readers/AsciiLineReaderTest.java
deleted file mode 100644
index 822f6cf..0000000
--- a/src/test/java/htsjdk/tribble/readers/AsciiLineReaderTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.tribble.TestUtils;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.FileInputStream;
-import java.io.InputStream;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * User: jacob
- * Date: 2012/05/09
- */
-public class AsciiLineReaderTest {
-    @BeforeMethod
-    public void setUp() throws Exception {
-
-    }
-
-    @AfterMethod
-    public void tearDown() throws Exception {
-
-    }
-
-    /**
-     * Test that we read the correct number of lines
-     * from a file
-     * @throws Exception
-     */
-    @Test
-    public void testReadLines() throws Exception {
-        String filePath = TestUtils.DATA_DIR + "gwas/smallp.gwas";
-        InputStream is = new FileInputStream(filePath);
-        AsciiLineReader reader = new AsciiLineReader(is);
-        int actualLines = 0;
-        int expectedNumber = 20;
-        String nextLine = "";
-
-        while((nextLine = reader.readLine()) != null && actualLines < (expectedNumber + 5)){
-            actualLines++;
-            //This particular test file has no empty lines
-            assertTrue(nextLine.length() > 0);
-        }
-
-        assertEquals(expectedNumber, actualLines);
-
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/LongLineBufferedReaderTest.java b/src/test/java/htsjdk/tribble/readers/LongLineBufferedReaderTest.java
deleted file mode 100644
index 6c4c946..0000000
--- a/src/test/java/htsjdk/tribble/readers/LongLineBufferedReaderTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.tribble.TestUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-
-/**
- * @author mccowan
- */
-public class LongLineBufferedReaderTest {
-
-    /**
-     * Test that we read the correct number of lines
-     * from a file
-     * @throws Exception
-     */
-    @Test
-    public void testReadLines() throws Exception {
-        String filePath = TestUtils.DATA_DIR + "large.txt";
-        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
-        LongLineBufferedReader testReader = new LongLineBufferedReader(new InputStreamReader(new FileInputStream(filePath)));
-        String line;
-        while((line = reader.readLine()) != null){
-            Assert.assertEquals(testReader.readLine(), line);
-        }
-        Assert.assertNull(testReader.readLine());
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/PositionalBufferedStreamTest.java b/src/test/java/htsjdk/tribble/readers/PositionalBufferedStreamTest.java
deleted file mode 100644
index 3dd7cf3..0000000
--- a/src/test/java/htsjdk/tribble/readers/PositionalBufferedStreamTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.tribble.TestUtils;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-
-/**
- * User: jacob
- * Date: 2012/05/09
- */
-public class PositionalBufferedStreamTest {
-
-    InputStream FileIs;
-    long expectedBytes;
-
-
-    @BeforeMethod
-    public void setUp() throws Exception {
-        File fi =  new File(TestUtils.DATA_DIR + "test.bed");
-        FileIs = new FileInputStream(fi);
-        expectedBytes = fi.length();
-    }
-
-    @AfterMethod
-    public void tearDown() throws Exception {
-        if(FileIs != null){
-            FileIs.close();
-            FileIs = null;
-        }
-    }
-
-    @Test
-    public void testPeek() throws Exception{
-        int trials = 10;
-        PositionalBufferedStream is = new PositionalBufferedStream(FileIs);
-        int bb = is.peek();
-        for(int ii=0; ii < trials; ii++){
-            Assert.assertEquals(is.peek(), bb);
-            Assert.assertEquals(is.getPosition(), 0);
-        }
-
-        while((bb = is.peek()) >= 0){
-            Assert.assertEquals(is.read(), bb);
-        }
-    }
-
-    @Test
-    public void testIsDone() throws Exception{
-        PositionalBufferedStream is = new PositionalBufferedStream(FileIs);
-        while(!is.isDone()){
-            is.read();
-        }
-        Assert.assertTrue(is.isDone());
-        Assert.assertEquals(is.getPosition(), expectedBytes);
-    }
-
-    @Test
-    public void testReadCorrectNumberBytes() throws Exception{
-        int[] bufSizes= new int[]{5, 20, 60, 120, 131, 150, 200, 1000, 10000, 20000, 512000, 2 << 20};
-        for(Integer bufSize: bufSizes){
-            setUp();
-            tstReadCorrectNumberBytes(bufSize);
-            tearDown();
-        }
-    }
-
-    public void tstReadCorrectNumberBytes(int bufferSize) throws Exception{
-        InputStream is = new PositionalBufferedStream(FileIs, bufferSize);
-        long count = 0;
-        while(is.read() >= 0){
-            count++;
-        }
-
-        Assert.assertEquals(count, expectedBytes);
-    }
-
-    @DataProvider(name = "ReadBytesTestData")
-    public Object[][] createReadBytesTestData() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-
-        for ( int byteReadSize : Arrays.asList(5, 10, 100, 255) )
-            for ( int bufSize : Arrays.asList(1, 10, 100, 1000) )
-                tests.add( new Object[]{ (Integer)byteReadSize, (Integer)bufSize });
-
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "ReadBytesTestData")
-    public void testReadBytes(final int byteReadSize, final int bufsize) throws Exception {
-        final byte[] bytes = new byte[255];
-        for ( int i = 0; i < bytes.length; i++ ) bytes[i] = (byte)i;
-        final ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-
-        final byte[] readBytes = new byte[byteReadSize];
-        final PositionalBufferedStream pbs = new PositionalBufferedStream(bais, bufsize);
-
-        int i = 0;
-        while ( i < 255 ) {
-            final int expectedBytesToRead = Math.min(255 - i, readBytes.length);
-            final int nBytesRead = pbs.read(readBytes);
-            Assert.assertEquals(nBytesRead, expectedBytesToRead, "Didn't read as many bytes as expected from PBS");
-
-            for ( int j = 0; j < nBytesRead; j++ )
-                Assert.assertEquals(readBytes[j], bytes[i+j], "Bytes read not those expected");
-
-            i += nBytesRead;
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/ReaderTest.java b/src/test/java/htsjdk/tribble/readers/ReaderTest.java
deleted file mode 100644
index d700e04..0000000
--- a/src/test/java/htsjdk/tribble/readers/ReaderTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package htsjdk.tribble.readers;
-
-
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Tests for streams and readers
- */
-public class ReaderTest {
-    @BeforeClass
-    public void setup() throws IOException {
-    }
-
-    @AfterClass
-    public void teardown() throws Exception {
-
-    }
-
-    @Test
-    public void testMultipleLines() throws IOException {
-        testStream("line 1\nline2\n");
-    }
-
-    @Test
-    public void testSingleLine() throws IOException {
-        testStream("line 1\n");
-    }
-
-    @Test
-    public void testEmpty() throws IOException {
-        testStream("");
-    }
-
-
-    @Test
-    public void testLotsOfLines() throws IOException {
-        final StringBuilder b = new StringBuilder();
-        for ( int i = 0; i < 10000; i++ ) {
-            b.append("line " + i + "\n");
-        }
-        testStream(b.toString());
-    }
-
-    @Test
-    public void testMassiveLines() throws IOException {
-        final StringBuilder b = new StringBuilder();
-        for ( int i = 0; i < 10; i++ ) {
-            for ( int j = 0; j < 1000000; j++) {
-                b.append(i + "." + j);
-            }
-            b.append("\n");
-        }
-        testStream(b.toString());
-    }
-
-    @Test
-    public void testSkip() throws IOException {
-        for ( int skipSizeBase : Arrays.asList(0, 10, 100, 1000, 10000, 1000000)) {
-            for ( int skipSizeAdd = 0; skipSizeAdd < 10; skipSizeAdd ++ ) {
-                final int skipSize = skipSizeBase + skipSizeAdd;
-                final byte[] bytes = new byte[skipSize+2];
-                Arrays.fill(bytes, 0, skipSize, (byte)0);
-                bytes[skipSize] = 1;
-                bytes[skipSize+1] = 2;
-
-                final InputStream is = new ByteArrayInputStream(bytes);
-                final PositionalBufferedStream pbs = new PositionalBufferedStream(is);
-                pbs.skip(skipSize);
-
-                // first value is 1
-                Assert.assertTrue(! pbs.isDone());
-                Assert.assertEquals(pbs.getPosition(), skipSize);
-                Assert.assertEquals(pbs.peek(), 1);
-                Assert.assertEquals(pbs.read(), 1);
-
-                Assert.assertTrue(! pbs.isDone());
-                Assert.assertEquals(pbs.getPosition(), skipSize + 1);
-                Assert.assertEquals(pbs.peek(), 2);
-                Assert.assertEquals(pbs.read(), 2);
-
-                Assert.assertTrue(pbs.isDone());
-            }
-        }
-    }
-
-    private void testStream(final String s) throws IOException {
-        testStream(s.getBytes());
-        testLineReader(s);
-    }
-
-    private void testStream(final byte[] bytes) throws IOException {
-        final InputStream is = new ByteArrayInputStream(bytes);
-        final PositionalBufferedStream pbs = new PositionalBufferedStream(is);
-
-        int bytePos = 0;
-        while ( ! pbs.isDone() ) {
-            Assert.assertTrue(bytePos < bytes.length);
-
-            // test position
-            Assert.assertEquals(pbs.getPosition(), bytePos);
-
-            // test peek
-            final byte atPos = bytes[bytePos];
-            Assert.assertEquals(toByte(pbs.peek()), atPos);
-            // test position
-            Assert.assertEquals(pbs.getPosition(), bytePos);
-
-            // test read
-            Assert.assertEquals(toByte(pbs.read()), atPos);
-            bytePos++;
-            // test position
-            Assert.assertEquals(pbs.getPosition(), bytePos);
-
-            // test repeek
-            if ( bytePos < bytes.length ) {
-                Assert.assertEquals(toByte(pbs.peek()), bytes[bytePos]);
-                // test position
-                Assert.assertEquals(pbs.getPosition(), bytePos);
-            }
-        }
-
-        Assert.assertEquals(bytePos, bytes.length);
-        pbs.close();
-    }
-
-    private void testLineReader(final String lines) throws IOException {
-        // read all of the lines into the
-        final BufferedReader br = new BufferedReader(new StringReader(lines));
-        final List<String> eachLine = new ArrayList<String>();
-        while (true) {
-            final String line = br.readLine();
-            if ( line == null ) break;
-            eachLine.add(line);
-        }
-
-        final byte[] bytes = lines.getBytes();
-        final InputStream is = new ByteArrayInputStream(bytes);
-        final PositionalBufferedStream pbs = new PositionalBufferedStream(is);
-        final LineReader alr = new AsciiLineReader(pbs); // AsciiLineReader must be used here because it does not read ahead.
-
-        int bytePos = 0, linePos = 0;
-        /** 
-         * TODO: Requires revision: we're calling readLine() here, but making assumptions about how the underlying input stream operates.
-         * Specifically, these tests assume the underlying stream only advances exactly the required number of characters to find the
-         * newline, which is not true for most buffered readers.
-         */
-        while ( ! pbs.isDone() ) {
-            Assert.assertTrue(bytePos < bytes.length);
-
-            // test position
-            Assert.assertEquals(pbs.getPosition(), bytePos);
-
-            // test read
-            final String readLine = alr.readLine();
-            Assert.assertEquals(readLine, eachLine.get(linePos));
-            linePos++;
-
-            bytePos += readLine.length() + 1; // 1 for the terminator
-            // test position
-            Assert.assertEquals(pbs.getPosition(), bytePos);
-        }
-
-        Assert.assertEquals(linePos, eachLine.size());
-        Assert.assertEquals(bytePos, bytes.length);
-        pbs.close();
-    }
-
-    private final byte toByte(int i) {
-        return (byte)(i & 0xFF);
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/SynchronousLineReaderUnitTest.java b/src/test/java/htsjdk/tribble/readers/SynchronousLineReaderUnitTest.java
deleted file mode 100644
index fbb5d18..0000000
--- a/src/test/java/htsjdk/tribble/readers/SynchronousLineReaderUnitTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.tribble.TestUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-
-/**
- * @author mccowan
- */
-public class SynchronousLineReaderUnitTest {
-    @Test
-    public void testLineReaderIterator_streamConstructor() throws Exception {
-        final File filePath = new File(TestUtils.DATA_DIR + "gwas/smallp.gwas");
-        final LineIterator lineIterator = new LineIteratorImpl(new SynchronousLineReader(new PositionalBufferedStream(new FileInputStream(filePath))));
-        final BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
-
-        while (lineIterator.hasNext()) {
-            Assert.assertEquals(lineIterator.next(), br.readLine());
-        }
-        Assert.assertNull(br.readLine());
-    }
-
-    @Test
-    public void testLineReaderIterator_readerConstructor() throws Exception {
-        final File filePath = new File(TestUtils.DATA_DIR + "gwas/smallp.gwas");
-        final LineIterator lineIterator = new LineIteratorImpl(new SynchronousLineReader(new InputStreamReader(new PositionalBufferedStream(new FileInputStream(filePath)))));
-        final BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
-
-        while (lineIterator.hasNext()) {
-            Assert.assertEquals(lineIterator.next(), br.readLine());
-        }
-        Assert.assertNull(br.readLine());
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/TabixReaderTest.java b/src/test/java/htsjdk/tribble/readers/TabixReaderTest.java
deleted file mode 100644
index d7b36df..0000000
--- a/src/test/java/htsjdk/tribble/readers/TabixReaderTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package htsjdk.tribble.readers;
-
-
-import htsjdk.samtools.util.TestUtil;
-import htsjdk.tribble.TestUtils;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import static org.testng.AssertJUnit.assertTrue;
-
-
-/**
- * Created by IntelliJ IDEA.
- * User: jrobinso
- * Date: Jul 6, 2010
- * Time: 8:57:40 PM
- * To change this template use File | Settings | File Templates.
- */
-public class TabixReaderTest {
-
-    static String tabixFile = TestUtils.DATA_DIR + "tabix/trioDup.vcf.gz";
-    static TabixReader tabixReader;
-    static List<String> sequenceNames;
-
-    @BeforeClass
-    public void setup() throws IOException {
-        tabixReader = new TabixReader(tabixFile);
-        sequenceNames = new ArrayList<String>(tabixReader.getChromosomes());
-    }
-
-    @AfterClass
-    public void teardown() throws Exception {
-        tabixReader.close();
-    }
-
-    @Test
-    public void testSequenceNames() {
-        String[] expectedSeqNames = new String[24];
-        for (int i = 1; i < 24; i++) {
-            expectedSeqNames[i - 1] = String.valueOf(i);
-        }
-        expectedSeqNames[22] = "X";
-        expectedSeqNames[23] = "Y";
-        Assert.assertEquals(expectedSeqNames.length, sequenceNames.size());
-
-        for (String s : expectedSeqNames) {
-            Assert.assertTrue(sequenceNames.contains(s));
-        }
-
-
-    }
-    
-    @Test
-    public void testSequenceSet() {
-        Set<String> chroms= tabixReader.getChromosomes();
-        Assert.assertFalse(chroms.isEmpty());
-        Assert.assertTrue(chroms.contains("1"));
-        Assert.assertFalse(chroms.contains("MT"));
-        
-    }
-
-
-    @Test
-    public void testIterators() throws IOException {
-        TabixReader.Iterator iter=tabixReader.query("1", 1, 400);
-        Assert.assertNotNull(iter);
-        Assert.assertNotNull(iter.next());
-        Assert.assertNull(iter.next());
-        
-        iter=tabixReader.query("UN", 1, 100);
-        Assert.assertNotNull(iter);
-        Assert.assertNull(iter.next());
-        
-        iter=tabixReader.query("UN:1-100");
-        Assert.assertNotNull(iter);
-        Assert.assertNull(iter.next());
-       
-        
-        iter=tabixReader.query("1:10-1");
-        Assert.assertNotNull(iter);
-        Assert.assertNull(iter.next());
- 
-        iter=tabixReader.query(999999,9,9);
-        Assert.assertNotNull(iter);
-        Assert.assertNull(iter.next());
-        
-        iter=tabixReader.query("1",Integer.MAX_VALUE-1,Integer.MAX_VALUE);
-        Assert.assertNotNull(iter);
-        Assert.assertNull(iter.next());
-        
-        final int pos_snp_in_vcf_chr1=327;
-        
-        iter=tabixReader.query("1",pos_snp_in_vcf_chr1,pos_snp_in_vcf_chr1);
-        Assert.assertNotNull(iter);
-        Assert.assertNotNull(iter);
-        Assert.assertNull(iter.next());
-
-        iter=tabixReader.query("1",pos_snp_in_vcf_chr1-1,pos_snp_in_vcf_chr1-1);
-        Assert.assertNotNull(iter);
-        Assert.assertNull(iter.next());
-
-        iter=tabixReader.query("1",pos_snp_in_vcf_chr1+1,pos_snp_in_vcf_chr1+1);
-        Assert.assertNotNull(iter);
-        Assert.assertNull(iter.next());
-
-    }
-    
-    
-    
-    /**
-     * Test reading a local tabix file
-     *
-     * @throws java.io.IOException
-     */
-    @Test
-    public void testLocalQuery() throws IOException {
-
-         TabixIteratorLineReader lineReader = new TabixIteratorLineReader(
-                tabixReader.query(tabixReader.chr2tid("4"), 320, 330));
-
-        int nRecords = 0;
-        String nextLine;
-        while ((nextLine = lineReader.readLine()) != null) {
-            assertTrue(nextLine.startsWith("4"));
-            nRecords++;
-        }
-        assertTrue(nRecords > 0);
-
-
-    }
-
-    /**
-     * Test reading a tabix file over http
-     *
-     * @throws java.io.IOException
-     */
-    @Test
-    public void testRemoteQuery() throws IOException {
-        String tabixFile = TestUtil.BASE_URL_FOR_HTTP_TESTS +"igvdata/tabix/trioDup.vcf.gz";
-
-        TabixReader tabixReader = new TabixReader(tabixFile);
-
-        TabixIteratorLineReader lineReader = new TabixIteratorLineReader(
-                tabixReader.query(tabixReader.chr2tid("4"), 320, 330));
-
-        int nRecords = 0;
-        String nextLine;
-        while ((nextLine = lineReader.readLine()) != null) {
-            assertTrue(nextLine.startsWith("4"));
-            nRecords++;
-        }
-        assertTrue(nRecords > 0);
-
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/util/ParsingUtilsTest.java b/src/test/java/htsjdk/tribble/util/ParsingUtilsTest.java
deleted file mode 100644
index 1c3ad1f..0000000
--- a/src/test/java/htsjdk/tribble/util/ParsingUtilsTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package htsjdk.tribble.util;
-
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-
-/**
- * Parsing utils tests
- */
-public class ParsingUtilsTest {
-
-    static final String AVAILABLE_FTP_URL = "ftp://ftp.broadinstitute.org/pub/igv/TEST/test.txt";
-    static final String UNAVAILABLE_FTP_URL = "ftp://www.example.com/file.txt";
-
-    static final String AVAILABLE_HTTP_URL = "https://www.google.com";
-    static final String UNAVAILABLE_HTTP_URL = "http://www.unknownhostwhichshouldntexist.com";
-
-    @Test
-    public void testSplit1() {
-        String[] tokens = new String[10];
-        String blankColumnLine = "a\tb\t\td";
-        int nTokens = ParsingUtils.split(blankColumnLine, tokens, '\t');
-        Assert.assertEquals(nTokens,4);
-        Assert.assertEquals(tokens[0],"a");
-        Assert.assertEquals(tokens[1],"b");
-        Assert.assertEquals(tokens[2],"");
-        Assert.assertEquals(tokens[3],"d");
-    }
-
-    @Test
-    public void testSplit2() {
-        String[] tokens = new String[10];
-        String blankColumnLine = "a\tb\t\td\t";
-        int nTokens = ParsingUtils.split(blankColumnLine, tokens, '\t');
-        Assert.assertEquals(nTokens,5);
-        Assert.assertEquals(tokens[0],"a");
-        Assert.assertEquals(tokens[1],"b");
-        Assert.assertEquals(tokens[2],"");
-        Assert.assertEquals(tokens[3],"d");
-        Assert.assertEquals(tokens[4],"");
-    }
-
-    @Test
-    public void testSplitWhitespace1() {
-        String[] tokens = new String[10];
-        String blankColumnLine = "a b\t\td";
-        int nTokens = ParsingUtils.splitWhitespace(blankColumnLine, tokens);
-        Assert.assertEquals(nTokens,4);
-        Assert.assertEquals(tokens[0],"a");
-        Assert.assertEquals(tokens[1],"b");
-        Assert.assertEquals(tokens[2],"");
-        Assert.assertEquals(tokens[3],"d");
-    }
-
-    @Test
-    public void testSplitWhitespace2() {
-        String[] tokens = new String[10];
-        String blankColumnLine = "a b\t\td\t";
-        int nTokens = ParsingUtils.splitWhitespace(blankColumnLine, tokens);
-        Assert.assertEquals(nTokens,5);
-        Assert.assertEquals(tokens[0],"a");
-        Assert.assertEquals(tokens[1],"b");
-        Assert.assertEquals(tokens[2],"");
-        Assert.assertEquals(tokens[3],"d");
-    }
-
-    /**
-     * Tests that the string "joined", when split by "delim" using ParsingUtils.split(String, char),
-     * <ol>
-     * <li>Ends up with the expected number of items</li>
-     * <li>Ends up with the expected items</li>
-     * <li>Ends up with the same items as when the split is performed using String.split</li>
-     * <li>When re-joined (using ParsingUtils.join(String, Collection>String<) ) results in
-     *    the original string</li>
-     * </ol>
-     *
-     * @param joined
-     * @param delim
-     * @param expectedItems
-     */
-    private void testSplitJoinRoundtrip(String joined, char delim, List<String> expectedItems) {
-        List<String> split = ParsingUtils.split(joined, delim);
-        Assert.assertEquals(split.size(), expectedItems.size());
-        Assert.assertEquals(joined.split(Character.toString(delim), -1), split.toArray());
-        Assert.assertEquals(joined, ParsingUtils.join(Character.toString(delim), split));
-    }
-
-    @Test
-    public void testSplitJoinEmptyItem() {
-        testSplitJoinRoundtrip("a\tb\t\td", '\t', Arrays.asList("a", "b", "", "d"));
-    }
-
-    @Test
-    public void testSplitJoinEmptyAtEnd() {
-        testSplitJoinRoundtrip("a\tb\t\td\t", '\t', Arrays.asList("a", "b", "", "d", ""));
-    }
-
-    @Test
-    public void testSplitJoinEmpty() {
-        testSplitJoinRoundtrip("", '\t', Arrays.asList(""));
-    }
-
-    @Test
-    public void testSplitJoinSingleItem() {
-        testSplitJoinRoundtrip("a", '\t', Arrays.asList("a"));
-    }
-
-    @Test
-    public void testSplitJoinEmptyFirst() {
-        testSplitJoinRoundtrip("\ta\tb", '\t', Arrays.asList("", "a", "b"));
-    }
-
-    @Test
-    public void testFTPDoesExist() throws IOException{
-        tstExists(AVAILABLE_FTP_URL, true);
-    }
-
-    @Test
-    public void testFTPNotExist() throws IOException{
-        tstExists(UNAVAILABLE_FTP_URL, false);
-    }
-
-    @Test
-    public void testHTTPDoesExist() throws IOException{
-        tstExists(AVAILABLE_HTTP_URL, true);
-    }
-
-    @Test
-    public void testHTTPNotExist() throws IOException{
-        tstExists(UNAVAILABLE_HTTP_URL, false);
-    }
-
-    private void tstExists(String path, boolean expectExists) throws IOException{
-        boolean exists = ParsingUtils.resourceExists(path);
-        Assert.assertEquals(exists, expectExists);
-    }
-
-    @Test
-    public void testFTPOpenInputStream() throws IOException{
-        tstStream(AVAILABLE_FTP_URL);
-    }
-
-    @Test
-    public void testHTTPOpenInputStream() throws IOException{
-        tstStream(AVAILABLE_HTTP_URL);
-    }
-
-    private void tstStream(String path) throws IOException{
-        InputStream is = ParsingUtils.openInputStream(path);
-        Assert.assertNotNull(is, "InputStream is null for " + path);
-        int b = is.read();
-        Assert.assertNotSame(b, -1);
-    }
-
-
-}
diff --git a/src/test/java/htsjdk/tribble/util/ftp/FTPClientTest.java b/src/test/java/htsjdk/tribble/util/ftp/FTPClientTest.java
deleted file mode 100644
index 3979b08..0000000
--- a/src/test/java/htsjdk/tribble/util/ftp/FTPClientTest.java
+++ /dev/null
@@ -1,247 +0,0 @@
-package htsjdk.tribble.util.ftp;
-
-import htsjdk.samtools.util.ftp.FTPClient;
-import htsjdk.samtools.util.ftp.FTPReply;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.UnknownHostException;
-
-/**
-* @author Jim Robinson
-* @since 10/3/11
-*/
-public class FTPClientTest {
-
-    static String host = "ftp.broadinstitute.org";
-    static String file = "/pub/igv/TEST/test.txt";
-    static int fileSize = 27;
-    static byte[] expectedBytes = "abcdefghijklmnopqrstuvwxyz\n".getBytes();
-    FTPClient client;
-
-    @BeforeMethod
-    public void setUp() throws IOException {
-        client = new FTPClient();
-        FTPReply reply = client.connect(host);
-        Assert.assertTrue(reply.isSuccess(), "connect");
-    }
-
-    @AfterMethod
-    public void tearDown() {
-        System.out.println("Disconnecting");
-        client.disconnect();
-    }
-
-    @Test
-    public void testLogin() throws Exception {
-
-    }
-
-    @Test
-    public void testPasv() throws Exception {
-        try {
-            FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
-            Assert.assertTrue(reply.isSuccess(), "login");
-
-            reply = client.pasv();
-            Assert.assertTrue(reply.isSuccess(), "pasv");
-        } finally {
-            client.closeDataStream();
-        }
-    }
-
-    @Test
-    public void testSize() throws Exception {
-
-        FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
-        Assert.assertTrue(reply.isSuccess());
-
-        reply = client.binary();
-        Assert.assertTrue(reply.isSuccess(), "binary");
-
-        reply = client.size(file);
-        String val = reply.getReplyString();
-        int size = Integer.parseInt(val);
-        Assert.assertEquals(fileSize, size, "size");
-    }
-
-    @Test
-    public void testDownload() throws Exception {
-        try {
-            FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
-            Assert.assertTrue(reply.isSuccess(), "login");
-
-            reply = client.binary();
-            Assert.assertTrue(reply.isSuccess(), "binary");
-
-            reply = client.pasv();
-            Assert.assertTrue(reply.isSuccess(), "pasv");
-
-            reply = client.retr(file);
-            Assert.assertEquals(reply.getCode(), 150, "retr");
-
-            InputStream is = client.getDataStream();
-            int idx = 0;
-            int b;
-            while ((b = is.read()) >= 0) {
-                Assert.assertEquals(expectedBytes[idx], (byte) b,"reading from stream");
-                idx++;
-            }
-
-        } finally {
-            client.closeDataStream();
-            FTPReply reply = client.retr(file);
-            System.out.println(reply.getCode());
-            Assert.assertTrue(reply.isSuccess(), "close");
-        }
-    }
-
-    @Test
-    public void testRest() throws Exception {
-        try {
-            FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
-            Assert.assertTrue(reply.isSuccess(), "login");
-
-            reply = client.binary();
-            Assert.assertTrue(reply.isSuccess(), "binary");
-
-            reply = client.pasv();
-            Assert.assertTrue(reply.isSuccess(), "pasv");
-
-            final int restPosition = 5;
-            client.setRestPosition(restPosition);
-
-            reply = client.retr(file);
-            Assert.assertEquals(reply.getCode(), 150, "retr");
-
-            InputStream is = client.getDataStream();
-            int idx = restPosition;
-            int b;
-            while ((b = is.read()) >= 0) {
-                Assert.assertEquals(expectedBytes[idx], (byte) b, "reading from stream");
-                idx++;
-            }
-
-        } finally {
-            client.closeDataStream();
-            FTPReply reply = client.retr(file);
-            System.out.println(reply.getCode());
-            Assert.assertTrue(reply.isSuccess(), "close");
-        }
-    }
-
-    /**
-     * Test accessing a non-existent file
-     */
-    @Test
-    public void testNonExistentFile() throws Exception {
-
-        String host = "ftp.broadinstitute.org";
-        String file = "/pub/igv/TEST/fileDoesntExist.txt";
-        FTPClient client = new FTPClient();
-
-        FTPReply reply = client.connect(host);
-        Assert.assertTrue(reply.isSuccess(), "connect");
-
-        reply = client.login("anonymous", "igv at broadinstitute.org");
-        Assert.assertTrue(reply.isSuccess(), "login");
-
-        reply = client.binary();
-        Assert.assertTrue(reply.isSuccess(), "binary");
-
-        reply = client.executeCommand("size " + file);
-        Assert.assertEquals(550, reply.getCode(), "size");
-
-        client.disconnect();
-    }
-
-    /**
-     * Test accessing a non-existent server
-     */
-    @Test
-    public void testNonExistentServer() throws Exception {
-
-        String host = "ftp.noSuchServer.org";
-        String file = "/pub/igv/TEST/fileDoesntExist.txt";
-        FTPClient client = new FTPClient();
-
-        FTPReply reply = null;
-        try {
-            reply = client.connect(host);
-        } catch (UnknownHostException e) {
-            // This is expected
-        }
-
-        client.disconnect();
-    }
-
-    @Test
-    public void testMultiplePasv() throws Exception {
-
-        try {
-            FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
-            Assert.assertTrue(reply.isSuccess(), "login");
-
-            reply = client.pasv();
-            Assert.assertTrue(reply.isSuccess(), "pasv 1");
-            client.closeDataStream();
-
-            reply = client.pasv();
-            Assert.assertTrue(reply.isSuccess(), "pasv 2");
-            client.closeDataStream();
-        }
-        finally {
-
-        }
-    }
-
-    @Test
-    public void testMultipleRest() throws Exception {
-        FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
-        Assert.assertTrue(reply.isSuccess(), "login");
-
-        reply = client.binary();
-        Assert.assertTrue(reply.isSuccess(), "binary");
-
-        restRetr(5, 10);
-        restRetr(2, 10);
-        restRetr(15, 10);
-    }
-
-    private void restRetr(int restPosition, int length) throws IOException {
-
-        try {
-
-            if (client.getDataStream() == null) {
-                FTPReply reply = client.pasv();
-                Assert.assertTrue(reply.isSuccess(), "pasv");
-            }
-
-            client.setRestPosition(restPosition);
-
-            FTPReply reply = client.retr(file);
-            //assertTrue(reply.getCode() == 150);
-
-            InputStream is = client.getDataStream();
-
-            byte[] buffer = new byte[length];
-            is.read(buffer);
-
-            for (int i = 0; i < length; i++) {
-                System.out.print((char) buffer[i]);
-                Assert.assertEquals(expectedBytes[i + restPosition], buffer[i], "reading from stream");
-            }
-            System.out.println();
-        }
-
-        finally {
-            client.closeDataStream();
-            FTPReply reply = client.getReply();  // <== MUST READ THE REPLY
-            System.out.println(reply.getReplyString());
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/util/ftp/FTPUtilsTest.java b/src/test/java/htsjdk/tribble/util/ftp/FTPUtilsTest.java
deleted file mode 100644
index a5f3b0e..0000000
--- a/src/test/java/htsjdk/tribble/util/ftp/FTPUtilsTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package htsjdk.tribble.util.ftp;
-
-import htsjdk.samtools.util.ftp.FTPUtils;
-import org.testng.annotations.Test;
-
-import java.net.URL;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
-* @author Jim Robinson
-* @since 10/4/11
-*/
-public class FTPUtilsTest {
-
-    @Test
-    public void testResourceAvailable() throws Exception {
-
-        URL goodUrl = new URL("ftp://ftp.broadinstitute.org/pub/igv/TEST/test.txt");
-        assertTrue(FTPUtils.resourceAvailable(goodUrl));
-
-        URL nonExistentURL = new URL("ftp://ftp.broadinstitute.org/pub/igv/TEST/doesntExist");
-        assertFalse(FTPUtils.resourceAvailable(nonExistentURL));
-
-        URL nonExistentServer = new URL("ftp://noSuchServer/pub/igv/TEST/doesntExist");
-        assertFalse(FTPUtils.resourceAvailable(nonExistentServer));
-
-
-    }
-}
diff --git a/src/test/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculationTest.java b/src/test/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculationTest.java
deleted file mode 100644
index fcf1bea..0000000
--- a/src/test/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculationTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package htsjdk.tribble.util.popgen;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Created by farjoun on 7/18/14.
- */
-public class HardyWeinbergCalculationTest {
-
-    @DataProvider
-    public Object[][] testHwCalculateData() {
-        return new Object[][] {
-                new Object[] {generateHWTrio(100, 0.01), 1.0},
-                new Object[] {generateHWTrio(100, 0.1), 1.0},
-                new Object[] {generateHWTrio(1000, 0.1), 1.0},
-                new Object[] {generateHWTrio(1000, 0.01), 1.0},
-                new Object[] {generateHWTrio(1000, 0.001), 1.0},
-                new Object[] {generateHWTrio(10000, 0.1), 1.0},
-                new Object[] {generateHWTrio(10000, 0.01), 1.0},
-                new Object[] {generateHWTrio(10000, 0.001), 1.0},
-                new Object[] {generateHWTrio(100000, 0.1), 1.0},
-                new Object[] {generateHWTrio(100000, 0.01), 1.0},
-                new Object[] {generateHWTrio(100000, 0.001), 1.0},
-
-        };
-    }
-
-    private int[] generateHWTrio(final int total, final double p) {
-        return new int[] {
-                (int) Math.round(total * p * p),
-                (int) Math.round(total * 2 * p * (1 - p)),
-                (int) Math.round(total * (1 - p) * (1 - p))};
-    }
-
-    @Test(dataProvider = "testHwCalculateData")
-    public void testHwCalculate(final int[] genotypeCounts, final double expectedHWS) throws Exception {
-        Assert.assertEquals(HardyWeinbergCalculation.hwCalculate(genotypeCounts[0], genotypeCounts[1], genotypeCounts[2]), expectedHWS);
-    }
-}
diff --git a/src/test/java/htsjdk/variant/PrintVariantsExampleTest.java b/src/test/java/htsjdk/variant/PrintVariantsExampleTest.java
deleted file mode 100644
index c82f2db..0000000
--- a/src/test/java/htsjdk/variant/PrintVariantsExampleTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant;
-
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.variant.example.PrintVariantsExample;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.List;
-import java.util.OptionalInt;
-import java.util.stream.IntStream;
-
-public class PrintVariantsExampleTest {
-    @Test
-    public void testExampleWriteFile() throws IOException {
-        final File tempFile = File.createTempFile("example", ".vcf");
-        tempFile.deleteOnExit();
-        File f1 = new File("src/test/resources/htsjdk/variant/ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf");
-        final String[] args = {
-                f1.getAbsolutePath(),
-                tempFile.getAbsolutePath()
-        };
-        Assert.assertEquals(tempFile.length(), 0);
-        PrintVariantsExample.main(args);
-        Assert.assertNotEquals(tempFile.length(), 0);
-
-        assertFilesEqualSkipHeaders(tempFile, f1);
-    }
-
-    private void assertFilesEqualSkipHeaders(File tempFile, File f1) throws FileNotFoundException {
-        final List<String> lines1 = IOUtil.slurpLines(f1);
-        final List<String> lines2 = IOUtil.slurpLines(tempFile);
-        final int firstNonComment1 = IntStream.range(0, lines1.size()).filter(i -> !lines1.get(i).startsWith("#")).findFirst().getAsInt();
-        final int firstNonComment2 = IntStream.range(0, lines2.size()).filter(i -> !lines2.get(i).startsWith("#")).findFirst().getAsInt();
-        Assert.assertEquals(lines1.subList(firstNonComment1, lines1.size()), lines2.subList(firstNonComment2,lines2.size()));
-    }
-}
diff --git a/src/test/java/htsjdk/variant/VariantBaseTest.java b/src/test/java/htsjdk/variant/VariantBaseTest.java
deleted file mode 100644
index 87345a0..0000000
--- a/src/test/java/htsjdk/variant/VariantBaseTest.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFConstants;
-import org.testng.Assert;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Base class for test classes within org.broadinstitute.variant
- */
-public class VariantBaseTest {
-
-    public static final String variantTestDataRoot = new File("src/test/resources/htsjdk/variant/").getAbsolutePath() + "/";
-
-    /**
-     * Creates a temp file that will be deleted on exit after tests are complete.
-     * @param name Prefix of the file.
-     * @param extension Extension to concat to the end of the file.
-     * @return A file in the temporary directory starting with name, ending with extension, which will be deleted after the program exits.
-     */
-    public static File createTempFile(String name, String extension) {
-        try {
-            File file = File.createTempFile(name, extension);
-            file.deleteOnExit();
-            return file;
-        } catch (IOException ex) {
-            throw new RuntimeException("Cannot create temp file: " + ex.getMessage(), ex);
-        }
-    }
-
-    private static final double DEFAULT_FLOAT_TOLERANCE = 1e-1;
-
-    public static final void assertEqualsDoubleSmart(final Object actual, final Double expected) {
-        Assert.assertTrue(actual instanceof Double, "Not a double");
-        assertEqualsDoubleSmart((double)(Double)actual, (double)expected);
-    }
-
-    public static final void assertEqualsDoubleSmart(final Object actual, final Double expected, final double tolerance) {
-        Assert.assertTrue(actual instanceof Double, "Not a double");
-        assertEqualsDoubleSmart((double)(Double)actual, (double)expected, tolerance);
-    }
-
-    public static final void assertEqualsDoubleSmart(final double actual, final double expected) {
-        assertEqualsDoubleSmart(actual, expected, DEFAULT_FLOAT_TOLERANCE);
-    }
-
-    public static final <T> void assertEqualsSet(final Set<T> actual, final Set<T> expected, final String info) {
-        final Set<T> actualSet = new HashSet<T>(actual);
-        final Set<T> expectedSet = new HashSet<T>(expected);
-        Assert.assertTrue(actualSet.equals(expectedSet), info); // note this is necessary due to testng bug for set comps
-    }
-
-    public static void assertEqualsDoubleSmart(final double actual, final double expected, final double tolerance) {
-        assertEqualsDoubleSmart(actual, expected, tolerance, null);
-    }
-
-    public static void assertEqualsDoubleSmart(final double actual, final double expected, final double tolerance, final String message) {
-        if ( Double.isNaN(expected) ) // NaN == NaN => false unfortunately
-            Assert.assertTrue(Double.isNaN(actual), "expected is nan, actual is not");
-        else if ( Double.isInfinite(expected) ) // NaN == NaN => false unfortunately
-            Assert.assertTrue(Double.isInfinite(actual), "expected is infinite, actual is not");
-        else {
-            final double delta = Math.abs(actual - expected);
-            final double ratio = Math.abs(actual / expected - 1.0);
-            Assert.assertTrue(delta < tolerance || ratio < tolerance, "expected = " + expected + " actual = " + actual
-                    + " not within tolerance " + tolerance
-                    + (message == null ? "" : "message: " + message));
-        }
-    }
-
-    public static SAMSequenceDictionary createArtificialSequenceDictionary() {
-        final int[] contigLengths = { 249250621, 243199373, 198022430, 191154276, 180915260, 171115067, 159138663, 146364022,
-                                      141213431, 135534747, 135006516, 133851895, 115169878, 107349540, 102531392, 90354753,
-                                      81195210, 78077248, 59128983, 63025520, 48129895, 51304566, 155270560, 59373566, 16569 };
-        List<SAMSequenceRecord> contigs = new ArrayList<SAMSequenceRecord>();
-
-        for ( int contig = 1; contig <= 22; contig++ ) {
-            contigs.add(new SAMSequenceRecord(Integer.toString(contig), contigLengths[contig - 1]));
-        }
-
-        int position = 22;
-        for ( String contigName : Arrays.asList("X", "Y", "MT") ) {
-            contigs.add(new SAMSequenceRecord(contigName, contigLengths[position]));
-            position++;
-        }
-
-        return new SAMSequenceDictionary(contigs);
-    }
-
-    /**
-     * Asserts that the two provided VariantContext objects are equal.
-     *
-     * @param actual actual VariantContext object
-     * @param expected expected VariantContext to compare against
-     */
-    public static void assertVariantContextsAreEqual( final VariantContext actual, final VariantContext expected ) {
-        Assert.assertNotNull(actual, "VariantContext expected not null");
-        Assert.assertEquals(actual.getContig(), expected.getContig(), "chr");
-        Assert.assertEquals(actual.getStart(), expected.getStart(), "start");
-        Assert.assertEquals(actual.getEnd(), expected.getEnd(), "end");
-        Assert.assertEquals(actual.getID(), expected.getID(), "id");
-        Assert.assertEquals(actual.getAlleles(), expected.getAlleles(), "alleles for " + expected + " vs " + actual);
-
-        assertAttributesEquals(actual.getAttributes(), expected.getAttributes());
-        Assert.assertEquals(actual.filtersWereApplied(), expected.filtersWereApplied(), "filtersWereApplied");
-        Assert.assertEquals(actual.isFiltered(), expected.isFiltered(), "isFiltered");
-        assertEqualsSet(actual.getFilters(), expected.getFilters(), "filters");
-        assertEqualsDoubleSmart(actual.getPhredScaledQual(), expected.getPhredScaledQual());
-
-        Assert.assertEquals(actual.hasGenotypes(), expected.hasGenotypes(), "hasGenotypes");
-        if ( expected.hasGenotypes() ) {
-            assertEqualsSet(actual.getSampleNames(), expected.getSampleNames(), "sample names set");
-            Assert.assertEquals(actual.getSampleNamesOrderedByName(), expected.getSampleNamesOrderedByName(), "sample names");
-            final Set<String> samples = expected.getSampleNames();
-            for ( final String sample : samples ) {
-                assertGenotypesAreEqual(actual.getGenotype(sample), expected.getGenotype(sample));
-            }
-        }
-    }
-
-    /**
-     * Asserts that the two provided Genotype objects are equal.
-     *
-     * @param actual actual Genotype object
-     * @param expected expected Genotype object to compare against
-     */
-    public static void assertGenotypesAreEqual(final Genotype actual, final Genotype expected) {
-        Assert.assertEquals(actual.getSampleName(), expected.getSampleName(), "Genotype names");
-        Assert.assertEquals(actual.getAlleles(), expected.getAlleles(), "Genotype alleles");
-        Assert.assertEquals(actual.getGenotypeString(), expected.getGenotypeString(), "Genotype string");
-        Assert.assertEquals(actual.getType(), expected.getType(), "Genotype type");
-
-        // filters are the same
-        Assert.assertEquals(actual.getFilters(), expected.getFilters(), "Genotype fields");
-        Assert.assertEquals(actual.isFiltered(), expected.isFiltered(), "Genotype isFiltered");
-
-        // inline attributes
-        Assert.assertEquals(actual.getDP(), expected.getDP(), "Genotype dp");
-        Assert.assertTrue(Arrays.equals(actual.getAD(), expected.getAD()));
-        Assert.assertEquals(actual.getGQ(), expected.getGQ(), "Genotype gq");
-        Assert.assertEquals(actual.hasPL(), expected.hasPL(), "Genotype hasPL");
-        Assert.assertEquals(actual.hasAD(), expected.hasAD(), "Genotype hasAD");
-        Assert.assertEquals(actual.hasGQ(), expected.hasGQ(), "Genotype hasGQ");
-        Assert.assertEquals(actual.hasDP(), expected.hasDP(), "Genotype hasDP");
-
-        Assert.assertEquals(actual.hasLikelihoods(), expected.hasLikelihoods(), "Genotype haslikelihoods");
-        Assert.assertEquals(actual.getLikelihoodsString(), expected.getLikelihoodsString(), "Genotype getlikelihoodsString");
-        Assert.assertEquals(actual.getLikelihoods(), expected.getLikelihoods(), "Genotype getLikelihoods");
-        Assert.assertTrue(Arrays.equals(actual.getPL(), expected.getPL()));
-
-        Assert.assertEquals(actual.getGQ(), expected.getGQ(), "Genotype phredScaledQual");
-        assertAttributesEquals(actual.getExtendedAttributes(), expected.getExtendedAttributes());
-        Assert.assertEquals(actual.isPhased(), expected.isPhased(), "Genotype isPhased");
-        Assert.assertEquals(actual.getPloidy(), expected.getPloidy(), "Genotype getPloidy");
-    }
-
-    /**
-     * Asserts that the two sets of attribute mappings are equal. Ignores null-valued attributes in
-     * "actual" that are not present in "expected" while performing the comparison.
-     *
-     * @param actual actual mapping of attributes
-     * @param expected expected mapping of attributes
-     */
-    private static void assertAttributesEquals(final Map<String, Object> actual, Map<String, Object> expected) {
-        final Set<String> expectedKeys = new HashSet<String>(expected.keySet());
-
-        for ( final Map.Entry<String, Object> act : actual.entrySet() ) {
-            final Object actualValue = act.getValue();
-            if ( expected.containsKey(act.getKey()) && expected.get(act.getKey()) != null ) {
-                final Object expectedValue = expected.get(act.getKey());
-                if ( expectedValue instanceof List ) {
-                    final List<Object> expectedList = (List<Object>)expectedValue;
-                    Assert.assertTrue(actualValue instanceof List, act.getKey() + " should be a list but isn't");
-                    final List<Object> actualList = (List<Object>)actualValue;
-                    Assert.assertEquals(actualList.size(), expectedList.size(), act.getKey() + " size");
-                    for ( int i = 0; i < expectedList.size(); i++ ) {
-                        assertAttributeEquals(act.getKey(), actualList.get(i), expectedList.get(i));
-                    }
-                }
-                else {
-                    assertAttributeEquals(act.getKey(), actualValue, expectedValue);
-                }
-            }
-            else {
-                // it's ok to have a binding in x -> null that's absent in y
-                Assert.assertNull(actualValue, act.getKey() + " present in one but not in the other");
-            }
-            expectedKeys.remove(act.getKey());
-        }
-
-        // now expectedKeys contains only the keys found in expected but not in actual,
-        // and they must all be null
-        for ( final String missingExpected : expectedKeys ) {
-            final Object value = expected.get(missingExpected);
-            Assert.assertTrue(isMissingAttribute(value), "Attribute " + missingExpected + " missing in one but not in other" );
-        }
-    }
-
-    /**
-     * Asserts that the two provided attribute values are equal. If the values are Doubles, uses a
-     * more lenient comparision with a tolerance of 1e-2.
-     *
-     * @param key key for the attribute values
-     * @param actual actual attribute value
-     * @param expected expected attribute value against which to compare
-     */
-    private static void assertAttributeEquals(final String key, final Object actual, final Object expected) {
-        if ( expected instanceof Double ) {
-            // must be very tolerant because doubles are being rounded to 2 sig figs
-            assertEqualsDoubleSmart(actual, (Double) expected, 1e-2);
-        }
-        else {
-            Assert.assertEquals(actual, expected, "Attribute " + key);
-        }
-    }
-
-    /**
-     * Determines whether the provided attribute value is missing according to the VCF spec.
-     * An attribute value is missing if it's null, is equal to {@link VCFConstants#MISSING_VALUE_v4},
-     * or if it's a List that is either empty or contains only null values.
-     *
-     * @param value attribute value to test
-     * @return true if value is a missing VCF attribute value, otherwise false
-     */
-    private static boolean isMissingAttribute(final Object value) {
-        if ( value == null || value.equals(VCFConstants.MISSING_VALUE_v4) ) {
-            return true;
-        }
-        else if ( value instanceof List ) {
-            // handles the case where all elements are null or the list is empty
-            for ( final Object elt : (List)value) {
-                if (elt != null) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        return false;
-    }
-
-}
diff --git a/src/test/java/htsjdk/variant/bcf2/BCF2EncoderDecoderUnitTest.java b/src/test/java/htsjdk/variant/bcf2/BCF2EncoderDecoderUnitTest.java
deleted file mode 100644
index 5122a42..0000000
--- a/src/test/java/htsjdk/variant/bcf2/BCF2EncoderDecoderUnitTest.java
+++ /dev/null
@@ -1,587 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-// the imports for unit testing.
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.writer.BCF2Encoder;
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-
-public class BCF2EncoderDecoderUnitTest extends VariantBaseTest {
-    private final double FLOAT_TOLERANCE = 1e-6;
-    final List<BCF2TypedValue> primitives = new ArrayList<BCF2TypedValue>();
-    final List<BCF2TypedValue> basicTypes = new ArrayList<BCF2TypedValue>();
-    final List<BCF2TypedValue> forCombinations = new ArrayList<BCF2TypedValue>();
-
-    @BeforeSuite
-    public void before() {
-        basicTypes.add(new BCF2TypedValue(1, BCF2Type.INT8));
-        basicTypes.add(new BCF2TypedValue(1000, BCF2Type.INT16));
-        basicTypes.add(new BCF2TypedValue(1000000, BCF2Type.INT32));
-        basicTypes.add(new BCF2TypedValue(1.2345e6, BCF2Type.FLOAT));
-        basicTypes.add(new BCF2TypedValue("A", BCF2Type.CHAR));
-
-        // small ints
-        primitives.add(new BCF2TypedValue(0, BCF2Type.INT8));
-        primitives.add(new BCF2TypedValue(10, BCF2Type.INT8));
-        primitives.add(new BCF2TypedValue(-1, BCF2Type.INT8));
-        primitives.add(new BCF2TypedValue(100, BCF2Type.INT8));
-        primitives.add(new BCF2TypedValue(-100, BCF2Type.INT8));
-        primitives.add(new BCF2TypedValue(-127, BCF2Type.INT8));    // last value in range
-        primitives.add(new BCF2TypedValue( 127, BCF2Type.INT8));    // last value in range
-
-        // medium ints
-        primitives.add(new BCF2TypedValue(-1000, BCF2Type.INT16));
-        primitives.add(new BCF2TypedValue(1000, BCF2Type.INT16));
-        primitives.add(new BCF2TypedValue(-128, BCF2Type.INT16));    // first value in range
-        primitives.add(new BCF2TypedValue( 128, BCF2Type.INT16));    // first value in range
-        primitives.add(new BCF2TypedValue(-32767, BCF2Type.INT16)); // last value in range
-        primitives.add(new BCF2TypedValue( 32767, BCF2Type.INT16)); // last value in range
-
-        // larger ints
-        primitives.add(new BCF2TypedValue(-32768, BCF2Type.INT32)); // first value in range
-        primitives.add(new BCF2TypedValue( 32768, BCF2Type.INT32)); // first value in range
-        primitives.add(new BCF2TypedValue(-100000, BCF2Type.INT32));
-        primitives.add(new BCF2TypedValue(100000, BCF2Type.INT32));
-        primitives.add(new BCF2TypedValue(-2147483647, BCF2Type.INT32));
-        primitives.add(new BCF2TypedValue(2147483647, BCF2Type.INT32));
-
-        // floats
-        primitives.add(new BCF2TypedValue(0.0, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(-0.0, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(1.0, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(-1.0, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(1.1, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(-1.1, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(5.0 / 3.0, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(-5.0 / 3.0, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(1.23e3, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(1.23e6, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(1.23e9, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(1.23e12, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(1.23e15, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(-1.23e3, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(-1.23e6, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(-1.23e9, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(-1.23e12, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(-1.23e15, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(Float.MIN_VALUE, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(Float.MAX_VALUE, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(Double.NEGATIVE_INFINITY, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(Double.POSITIVE_INFINITY, BCF2Type.FLOAT));
-        primitives.add(new BCF2TypedValue(Double.NaN, BCF2Type.FLOAT));
-
-        // strings
-        //primitives.add(new BCF2TypedValue("", BCFType.CHAR)); <- will be null (which is right)
-        primitives.add(new BCF2TypedValue("S", BCF2Type.CHAR));
-        primitives.add(new BCF2TypedValue("S2", BCF2Type.CHAR));
-        primitives.add(new BCF2TypedValue("12345678910", BCF2Type.CHAR));
-        primitives.add(new BCF2TypedValue("ABCDEFGHIJKLMNOPQRSTUVWXYZ", BCF2Type.CHAR));
-        primitives.add(new BCF2TypedValue("ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ", BCF2Type.CHAR));
-
-        // missing values
-        for ( BCF2Type type : BCF2Type.values() ) {
-            primitives.add(new BCF2TypedValue(null, type));
-        }
-
-        forCombinations.add(new BCF2TypedValue(10, BCF2Type.INT8));
-        forCombinations.add(new BCF2TypedValue(100, BCF2Type.INT8));
-        forCombinations.add(new BCF2TypedValue(-100, BCF2Type.INT8));
-        forCombinations.add(new BCF2TypedValue(-128, BCF2Type.INT16));    // first value in range
-        forCombinations.add(new BCF2TypedValue( 128, BCF2Type.INT16));    // first value in range
-        forCombinations.add(new BCF2TypedValue(-100000, BCF2Type.INT32));
-        forCombinations.add(new BCF2TypedValue(100000, BCF2Type.INT32));
-        forCombinations.add(new BCF2TypedValue(0.0, BCF2Type.FLOAT));
-        forCombinations.add(new BCF2TypedValue(1.23e6, BCF2Type.FLOAT));
-        forCombinations.add(new BCF2TypedValue(-1.23e6, BCF2Type.FLOAT));
-        forCombinations.add(new BCF2TypedValue("S", BCF2Type.CHAR));
-        forCombinations.add(new BCF2TypedValue("ABCDEFGHIJKLMNOPQRSTUVWXYZ", BCF2Type.CHAR));
-        forCombinations.add(new BCF2TypedValue("ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ", BCF2Type.CHAR));
-
-        // missing values
-        for ( BCF2Type type : BCF2Type.values() ) {
-            forCombinations.add(new BCF2TypedValue(null, type));
-        }
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // merge case Provider
-    //
-    // --------------------------------------------------------------------------------
-
-    private class BCF2TypedValue {
-        final BCF2Type type;
-        final Object value;
-
-        private BCF2TypedValue(final int value, final BCF2Type type) {
-            this(new Integer(value), type);
-        }
-
-        private BCF2TypedValue(final double value, final BCF2Type type) {
-            this(new Double(value), type);
-        }
-
-        private BCF2TypedValue(final Object value, final BCF2Type type) {
-            this.type = type;
-            this.value = value;
-        }
-
-        public boolean isMissing() { return value == null; }
-
-        @Override
-        public String toString() {
-            return String.format("%s of %s", value, type);
-        }
-    }
-
-    // -----------------------------------------------------------------
-    //
-    // Test encoding of basic types
-    //
-    // -----------------------------------------------------------------
-
-    @DataProvider(name = "BCF2EncodingTestProviderBasicTypes")
-    public Object[][] BCF2EncodingTestProviderBasicTypes() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-        for ( BCF2TypedValue tv : basicTypes )
-            tests.add(new Object[]{Arrays.asList(tv)});
-        return tests.toArray(new Object[][]{});
-    }
-
-    private interface EncodeMe {
-        public void encode(final BCF2Encoder encoder, final BCF2TypedValue tv) throws IOException;
-    }
-
-
-    @Test(dataProvider = "BCF2EncodingTestProviderBasicTypes")
-    public void testBCF2BasicTypesWithStaticCalls(final List<BCF2TypedValue> toEncode) throws IOException {
-        testBCF2BasicTypesWithEncodeMe(toEncode,
-                new EncodeMe() {
-                    @Override
-                    public void encode(final BCF2Encoder encoder, final BCF2TypedValue tv) throws IOException {
-                        switch ( tv.type ) {
-                            case INT8:
-                            case INT16:
-                            case INT32:
-                                encoder.encodeTypedInt((Integer)tv.value, tv.type);
-                                break;
-                            case FLOAT:
-                                encoder.encodeTypedFloat((Double)tv.value);
-                                break;
-                            case CHAR:
-                                encoder.encodeTypedString((String)tv.value);
-                                break;
-                        }
-                    }
-                });
-    }
-
-    @Test(dataProvider = "BCF2EncodingTestProviderBasicTypes")
-    public void testBCF2BasicTypesWithObjectType(final List<BCF2TypedValue> toEncode) throws IOException {
-        testBCF2BasicTypesWithEncodeMe(toEncode,
-                new EncodeMe() {
-                    @Override
-                    public void encode(final BCF2Encoder encoder, final BCF2TypedValue tv) throws IOException {
-                        encoder.encodeTyped(tv.value, tv.type);
-                    }
-                });
-    }
-
-    @Test(dataProvider = "BCF2EncodingTestProviderBasicTypes")
-    public void testBCF2BasicTypesWithObjectNoType(final List<BCF2TypedValue> toEncode) throws IOException {
-        testBCF2BasicTypesWithEncodeMe(toEncode,
-                new EncodeMe() {
-                    @Override
-                    public void encode(final BCF2Encoder encoder, final BCF2TypedValue tv) throws IOException {
-                        encoder.encode(tv.value);
-                    }
-                });
-    }
-
-    public void testBCF2BasicTypesWithEncodeMe(final List<BCF2TypedValue> toEncode, final EncodeMe func) throws IOException {
-        for ( final BCF2TypedValue tv : toEncode ) {
-            BCF2Encoder encoder = new BCF2Encoder();
-            func.encode(encoder, tv);
-
-            BCF2Decoder decoder = new BCF2Decoder(encoder.getRecordBytes());
-            final Object decoded = decoder.decodeTypedValue();
-
-            Assert.assertNotNull(decoded);
-            Assert.assertFalse(decoded instanceof List);
-            myAssertEquals(tv, decoded);
-        }
-    }
-
-    @Test(dataProvider = "BCF2EncodingTestProviderBasicTypes")
-    public void testBCF2EncodingVectors(final List<BCF2TypedValue> toEncode) throws IOException {
-        for ( final BCF2TypedValue tv : toEncode ) {
-            for ( final int length : Arrays.asList(2, 5, 10, 15, 20, 25) ) {
-                BCF2Encoder encoder = new BCF2Encoder();
-                List<Object> expected = Collections.nCopies(length, tv.value);
-                encoder.encodeTyped(expected, tv.type);
-
-                BCF2Decoder decoder = new BCF2Decoder(encoder.getRecordBytes());
-                final Object decoded = decoder.decodeTypedValue();
-
-                Assert.assertTrue(decoded instanceof List);
-                final List<Object> decodedList = (List<Object>)decoded;
-                Assert.assertEquals(decodedList.size(), expected.size());
-                for ( Object decodedValue : decodedList )
-                    myAssertEquals(tv, decodedValue);
-            }
-        }
-    }
-
-    @DataProvider(name = "BCF2EncodingTestProviderSingletons")
-    public Object[][] BCF2EncodingTestProviderSingletons() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-        for ( BCF2TypedValue tv : primitives )
-            tests.add(new Object[]{Arrays.asList(tv)});
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "BCF2EncodingTestProviderSingletons")
-    public void testBCF2EncodingSingletons(final List<BCF2TypedValue> toEncode) throws IOException {
-        final byte[] record = encodeRecord(toEncode);
-        decodeRecord(toEncode, record);
-    }
-
-    // -----------------------------------------------------------------
-    //
-    // Test encoding of vectors
-    //
-    // -----------------------------------------------------------------
-
-    @DataProvider(name = "BCF2EncodingTestProviderSequences")
-    public Object[][] BCF2EncodingTestProviderSequences() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-        for ( BCF2TypedValue tv1 : forCombinations )
-            for ( BCF2TypedValue tv2 : forCombinations )
-                for ( BCF2TypedValue tv3 : forCombinations )
-                    tests.add(new Object[]{Arrays.asList(tv1, tv2, tv3)});
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "BCF2EncodingTestProviderBasicTypes")
-    public void testBCF2EncodingVectorsWithMissing(final List<BCF2TypedValue> toEncode) throws IOException {
-        for ( final BCF2TypedValue tv : toEncode ) {
-            if ( tv.type != BCF2Type.CHAR ) {
-                for ( final int length : Arrays.asList(2, 5, 10, 15, 20, 25) ) {
-                    final byte td = BCF2Utils.encodeTypeDescriptor(1, tv.type);
-
-                    final BCF2Encoder encoder = new BCF2Encoder();
-                    for ( int i = 0; i < length; i++ ) {
-                        encoder.encodeRawValue(i % 2 == 0 ? null : tv.value, tv.type);
-                    }
-
-                    final BCF2Decoder decoder = new BCF2Decoder(encoder.getRecordBytes());
-
-                    for ( int i = 0; i < length; i++ ) {
-                        final Object decoded = decoder.decodeTypedValue(td);
-                        myAssertEquals(i % 2 == 0 ? new BCF2TypedValue(null, tv.type) : tv, decoded);
-                    }
-                }
-            }
-        }
-    }
-
-    @Test(dataProvider = "BCF2EncodingTestProviderSequences", dependsOnMethods = "testBCF2EncodingSingletons")
-    public void testBCF2EncodingTestProviderSequences(final List<BCF2TypedValue> toEncode) throws IOException {
-        final byte[] record = encodeRecord(toEncode);
-        decodeRecord(toEncode, record);
-    }
-
-    // -----------------------------------------------------------------
-    //
-    // Test strings and lists of strings
-    //
-    // -----------------------------------------------------------------
-
-    @DataProvider(name = "ListOfStrings")
-    public Object[][] listOfStringsProvider() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-        tests.add(new Object[]{Arrays.asList("s1", "s2"), ",s1,s2"});
-        tests.add(new Object[]{Arrays.asList("s1", "s2", "s3"), ",s1,s2,s3"});
-        tests.add(new Object[]{Arrays.asList("s1", "s2", "s3", "s4"), ",s1,s2,s3,s4"});
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "ListOfStrings")
-    public void testEncodingListOfString(List<String> strings, String expected) throws IOException {
-        final String collapsed = BCF2Utils.collapseStringList(strings);
-        Assert.assertEquals(collapsed, expected);
-        Assert.assertEquals(BCF2Utils.explodeStringList(collapsed), strings);
-    }
-
-    // -----------------------------------------------------------------
-    //
-    // Tests to determine the best type of arrays of integers
-    //
-    // -----------------------------------------------------------------
-
-    @DataProvider(name = "BestIntTypeTests")
-    public Object[][] BestIntTypeTests() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-        tests.add(new Object[]{Arrays.asList(1), BCF2Type.INT8});
-        tests.add(new Object[]{Arrays.asList(1, 10), BCF2Type.INT8});
-        tests.add(new Object[]{Arrays.asList(1, 10, 100), BCF2Type.INT8});
-        tests.add(new Object[]{Arrays.asList(1, -1), BCF2Type.INT8});
-        tests.add(new Object[]{Arrays.asList(1, 1000), BCF2Type.INT16});
-        tests.add(new Object[]{Arrays.asList(1, 1000, 10), BCF2Type.INT16});
-        tests.add(new Object[]{Arrays.asList(1, 1000, 100), BCF2Type.INT16});
-        tests.add(new Object[]{Arrays.asList(1000), BCF2Type.INT16});
-        tests.add(new Object[]{Arrays.asList(100000), BCF2Type.INT32});
-        tests.add(new Object[]{Arrays.asList(100000, 10), BCF2Type.INT32});
-        tests.add(new Object[]{Arrays.asList(100000, 100), BCF2Type.INT32});
-        tests.add(new Object[]{Arrays.asList(100000, 1, -10), BCF2Type.INT32});
-        tests.add(new Object[]{Arrays.asList(-100000, 1, -10), BCF2Type.INT32});
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "BestIntTypeTests")
-    public void determineBestEncoding(final List<Integer> ints, final BCF2Type expectedType) throws IOException {
-        BCF2Encoder encoder = new BCF2Encoder();
-        Assert.assertEquals(BCF2Utils.determineIntegerType(ints), expectedType);
-        Assert.assertEquals(BCF2Utils.determineIntegerType(toPrimitive(ints.toArray(new Integer[0]))), expectedType);
-    }
-
-    private static int[] toPrimitive ( final Integer[] array ) {
-        if ( array == null ) {
-            return null;
-        }
-        else if ( array.length == 0 ) {
-            return new int[0];
-        }
-
-        final int[] result = new int[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = array[i].intValue();
-        }
-        return result;
-    }
-
-    // -----------------------------------------------------------------
-    //
-    // Tests managing and skipping multiple blocks
-    //
-    // -----------------------------------------------------------------
-
-    @Test(dataProvider = "BCF2EncodingTestProviderSequences", dependsOnMethods = "testBCF2EncodingTestProviderSequences")
-    public void testReadAndSkipWithMultipleBlocks(final List<BCF2TypedValue> block) throws IOException {
-        testReadAndSkipWithMultipleBlocks(block, forCombinations);
-        testReadAndSkipWithMultipleBlocks(forCombinations, block);
-    }
-
-    public void testReadAndSkipWithMultipleBlocks(final List<BCF2TypedValue> block1, final List<BCF2TypedValue> block2) throws IOException {
-        final byte[] record1 = encodeRecord(block1);
-        final byte[] record2 = encodeRecord(block2);
-
-        // each record is individually good
-        decodeRecord(block1, record1);
-        decodeRecord(block2, record2);
-
-        BCF2Decoder decoder = new BCF2Decoder();
-
-        // test setting
-        decoder.setRecordBytes(record1);
-        decodeRecord(block1, decoder);
-        decoder.setRecordBytes(record2);
-        decodeRecord(block2, decoder);
-
-        // test combining the streams
-        final byte[] combined = combineRecords(record1, record2);
-        final List<BCF2TypedValue> combinedObjects = new ArrayList<BCF2TypedValue>(block1);
-        combinedObjects.addAll(block2);
-
-        // the combined bytes is the same as the combined objects
-        InputStream stream = new ByteArrayInputStream(combined);
-        decoder.readNextBlock(record1.length, stream);
-        decodeRecord(block1, decoder);
-        decoder.readNextBlock(record2.length, stream);
-        decodeRecord(block2, decoder);
-
-        // skipping the first block allows us to read the second block directly
-        stream = new ByteArrayInputStream(combined);
-        decoder.skipNextBlock(record1.length, stream);
-        decoder.readNextBlock(record2.length, stream);
-        decodeRecord(block2, decoder);
-    }
-
-    // -----------------------------------------------------------------
-    //
-    // Test encoding / decoding arrays of ints
-    //
-    // This checks that we can encode and decode correctly with the
-    // low-level decodeIntArray function arrays of values.  This
-    // has to be pretty comprehensive as decodeIntArray is a highly optimized
-    // piece of code with lots of edge cases.  The values we are encoding
-    // don't really matter -- just that the values come back as expected.
-    //
-    // -----------------------------------------------------------------
-
-    @DataProvider(name = "IntArrays")
-    public Object[][] makeIntArrays() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-
-        for ( int nValues : Arrays.asList(0, 1, 2, 5, 10, 100) ) {
-            for ( int nPad : Arrays.asList(0, 1, 2, 5, 10, 100) ) {
-                int nElements = nValues + nPad;
-
-                List<Integer> values = new ArrayList<Integer>(nElements);
-
-                // add nValues from 0 to nValues - 1
-                for ( int i = 0; i < nValues; i++ )
-                    values.add(i);
-
-                // add nPad nulls
-                for ( int i = 0; i < nPad; i++ )
-                    values.add(null);
-
-                tests.add(new Object[]{values});
-            }
-        }
-
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "IntArrays")
-    public void testIntArrays(final List<Integer> ints) throws IOException {
-        final BCF2Encoder encoder = new BCF2Encoder();
-        encoder.encodeTyped(ints, BCF2Type.INT16);
-
-        final BCF2Decoder decoder = new BCF2Decoder(encoder.getRecordBytes());
-
-        final byte typeDescriptor = decoder.readTypeDescriptor();
-
-        // read the int[] with the low-level version
-        final int size = decoder.decodeNumberOfElements(typeDescriptor);
-        final int[] decoded = decoder.decodeIntArray(typeDescriptor, size);
-
-        if ( isMissing(ints) ) {
-            // we expect that the result is null in this case
-            Assert.assertNull(decoded, "Encoded all missing values -- expected null");
-        } else {
-            // we expect at least some values to come back
-            Assert.assertTrue(decoded.length > 0, "Must have at least 1 element for non-null encoded data");
-
-            // check corresponding values
-            for ( int i = 0; i < ints.size(); i++ ) {
-                final Integer expected = ints.get(i);
-
-                if ( expected == null ) {
-                    Assert.assertTrue(decoded.length <= i, "we expect decoded to be truncated for missing values");
-                } else {
-                    Assert.assertTrue(decoded.length > i, "we expected at least " + i + " values in decoded array");
-                    Assert.assertEquals(decoded[i], (int)expected);
-                }
-            }
-        }
-    }
-
-    // -----------------------------------------------------------------
-    //
-    // Helper routines
-    //
-    // -----------------------------------------------------------------
-
-    private final byte[] combineRecords(final byte[] record1, final byte[] record2) throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        baos.write(record1);
-        baos.write(record2);
-        return baos.toByteArray();
-    }
-
-    private final byte[] encodeRecord(final List<BCF2TypedValue> toEncode) throws IOException {
-        BCF2Encoder encoder = new BCF2Encoder();
-
-        for ( final BCF2TypedValue tv : toEncode ) {
-            if ( tv.isMissing() )
-                encoder.encodeTypedMissing(tv.type);
-            else {
-                final BCF2Type encodedType = encoder.encode(tv.value);
-                if ( tv.type != null ) // only if we have an expectation
-                    Assert.assertEquals(encodedType, tv.type);
-            }
-        }
-
-        // check output
-        final byte[] record = encoder.getRecordBytes();
-        Assert.assertNotNull(record);
-        Assert.assertTrue(record.length > 0);
-        return record;
-    }
-
-    private final void decodeRecord(final List<BCF2TypedValue> toEncode, final byte[] record) throws IOException {
-        decodeRecord(toEncode, new BCF2Decoder(record));
-    }
-
-    private final void decodeRecord(final List<BCF2TypedValue> toEncode, final BCF2Decoder decoder) throws IOException {
-        for ( final BCF2TypedValue tv : toEncode ) {
-            Assert.assertFalse(decoder.blockIsFullyDecoded());
-            final Object decoded = decoder.decodeTypedValue();
-
-            myAssertEquals(tv, decoded);
-        }
-
-        Assert.assertTrue(decoder.blockIsFullyDecoded());
-    }
-
-    private final void myAssertEquals(final BCF2TypedValue tv, final Object decoded) {
-        if ( tv.value == null ) { // special needs for instanceof double
-            Assert.assertEquals(decoded, tv.value);
-        } else if ( tv.type == BCF2Type.FLOAT ) { // need tolerance for floats, and they aren't null
-            Assert.assertTrue(decoded instanceof Double);
-
-            final double valueFloat = (Double)tv.value;
-            final double decodedFloat = (Double)decoded;
-
-            VariantBaseTest.assertEqualsDoubleSmart(decodedFloat, valueFloat, FLOAT_TOLERANCE);
-        } else
-            Assert.assertEquals(decoded, tv.value);
-    }
-
-    private final boolean isMissing(final List<Integer> values) {
-        if ( values != null )
-            for ( Integer value : values )
-                if ( value != null )
-                    return false;
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/bcf2/BCF2UtilsUnitTest.java b/src/test/java/htsjdk/variant/bcf2/BCF2UtilsUnitTest.java
deleted file mode 100644
index 91804c4..0000000
--- a/src/test/java/htsjdk/variant/bcf2/BCF2UtilsUnitTest.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.vcf.VCFContigHeaderLine;
-import htsjdk.variant.vcf.VCFFilterHeaderLine;
-import htsjdk.variant.vcf.VCFFormatHeaderLine;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLine;
-import htsjdk.variant.vcf.VCFHeaderLineCount;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-import htsjdk.variant.vcf.VCFIDHeaderLine;
-import htsjdk.variant.vcf.VCFInfoHeaderLine;
-import htsjdk.variant.vcf.VCFSimpleHeaderLine;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-/**
- * Tests for BCF2Utils
- */
-public final class BCF2UtilsUnitTest extends VariantBaseTest {
-    @DataProvider(name = "CollapseExpandTest")
-    public Object[][] makeCollapseExpandTest() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-        tests.add(new Object[]{Arrays.asList("A"), "A", false});
-        tests.add(new Object[]{Arrays.asList("A", "B"), ",A,B", true});
-        tests.add(new Object[]{Arrays.asList("AB"), "AB", false});
-        tests.add(new Object[]{Arrays.asList("AB", "C"), ",AB,C", true});
-        tests.add(new Object[]{Arrays.asList(), "", false});
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "CollapseExpandTest")
-    public void testCollapseExpandTest(final List<String> in, final String expectedCollapsed, final boolean isCollapsed) {
-        final String actualCollapsed = BCF2Utils.collapseStringList(in);
-        Assert.assertEquals(actualCollapsed, expectedCollapsed);
-        Assert.assertEquals(BCF2Utils.isCollapsedString(actualCollapsed), isCollapsed);
-        if ( isCollapsed )
-            Assert.assertEquals(BCF2Utils.explodeStringList(actualCollapsed), in);
-    }
-
-    @Test
-    public void testCreateDictionary() {
-        final List<VCFHeaderLine> inputLines = new ArrayList<VCFHeaderLine>();
-        int counter = 0;
-        inputLines.add(new VCFFilterHeaderLine(String.valueOf(counter++)));
-        inputLines.add(new VCFFilterHeaderLine(String.valueOf(counter++)));
-        inputLines.add(new VCFContigHeaderLine(Collections.singletonMap("ID", String.valueOf(counter++)), counter));
-        inputLines.add(new VCFContigHeaderLine(Collections.singletonMap("ID", String.valueOf(counter++)), counter));
-        inputLines.add(new VCFInfoHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
-        inputLines.add(new VCFInfoHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
-        inputLines.add(new VCFHeaderLine("x", "misc"));
-        inputLines.add(new VCFHeaderLine("y", "misc"));
-        inputLines.add(new VCFSimpleHeaderLine("GATKCommandLine","z","misc"));
-        inputLines.add(new VCFFormatHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
-        inputLines.add(new VCFFormatHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
-        final int inputLineCounter = counter;
-        final VCFHeader inputHeader = new VCFHeader(new LinkedHashSet<VCFHeaderLine>(inputLines));
-        final ArrayList<String> dict = BCF2Utils.makeDictionary(inputHeader);
-        final int dict_size = dict.size();
-        Assert.assertEquals(7,dict_size);
-    }
-
-    /**
-     * Wrapper class for HeaderOrderTestProvider test cases to prevent TestNG from calling toString()
-     * on the VCFHeaders and spamming the log output.
-     */
-    private static class HeaderOrderTestCase {
-        public final VCFHeader inputHeader;
-        public final VCFHeader testHeader;
-        public final boolean expectedConsistent;
-
-        public HeaderOrderTestCase( final VCFHeader inputHeader, final VCFHeader testHeader, final boolean expectedConsistent ) {
-            this.inputHeader = inputHeader;
-            this.testHeader = testHeader;
-            this.expectedConsistent = expectedConsistent;
-        }
-    }
-
-    @DataProvider(name = "HeaderOrderTestProvider")
-    public Object[][] makeHeaderOrderTestProvider() {
-        final List<VCFHeaderLine> inputLines = new ArrayList<VCFHeaderLine>();
-        final List<VCFHeaderLine> extraLines = new ArrayList<VCFHeaderLine>();
-
-        int counter = 0;
-        inputLines.add(new VCFFilterHeaderLine(String.valueOf(counter++)));
-        inputLines.add(new VCFFilterHeaderLine(String.valueOf(counter++)));
-        inputLines.add(new VCFContigHeaderLine(Collections.singletonMap("ID", String.valueOf(counter++)), counter));
-        inputLines.add(new VCFContigHeaderLine(Collections.singletonMap("ID", String.valueOf(counter++)), counter));
-        inputLines.add(new VCFInfoHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
-        inputLines.add(new VCFInfoHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
-        inputLines.add(new VCFFormatHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
-        inputLines.add(new VCFFormatHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
-        final int inputLineCounter = counter;
-        final VCFHeader inputHeader = new VCFHeader(new LinkedHashSet<VCFHeaderLine>(inputLines));
-
-        extraLines.add(new VCFFilterHeaderLine(String.valueOf(counter++)));
-        extraLines.add(new VCFContigHeaderLine(Collections.singletonMap("ID", String.valueOf(counter++)), counter));
-        extraLines.add(new VCFInfoHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
-        extraLines.add(new VCFFormatHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
-        extraLines.add(new VCFHeaderLine("x", "misc"));
-        extraLines.add(new VCFHeaderLine("y", "misc"));
-
-        List<Object[]> tests = new ArrayList<Object[]>();
-        for ( final int extrasToTake : Arrays.asList(0, 1, 2, 3) ) {
-            final List<VCFHeaderLine> empty = Collections.emptyList();
-            final List<List<VCFHeaderLine>> permutations = extrasToTake == 0
-                    ? Collections.singletonList(empty)
-                    : GeneralUtils.makePermutations(extraLines, extrasToTake, false);
-            for ( final List<VCFHeaderLine> permutation : permutations ) {
-                for ( int i = -1; i < inputLines.size(); i++ ) {
-                    final List<VCFHeaderLine> allLines = new ArrayList<VCFHeaderLine>(inputLines);
-                    if ( i >= 0 )
-                        allLines.remove(i);
-                    allLines.addAll(permutation);
-                    final VCFHeader testHeader = new VCFHeader(new LinkedHashSet<VCFHeaderLine>(allLines));
-                    final boolean expectedConsistent = expectedConsistent(testHeader, inputLineCounter);
-                    tests.add(new Object[]{new HeaderOrderTestCase(inputHeader, testHeader, expectedConsistent)});
-                }
-            }
-        }
-
-        // sample name tests
-        final List<List<String>> sampleNameTests = Arrays.asList(
-                new ArrayList<String>(),
-                Arrays.asList("A"),
-                Arrays.asList("A", "B"),
-                Arrays.asList("A", "B", "C"));
-        for ( final List<String> inSamples : sampleNameTests ) {
-            for ( final List<String> testSamples : sampleNameTests ) {
-                final VCFHeader inputHeaderWithSamples = new VCFHeader(inputHeader.getMetaDataInInputOrder(), inSamples);
-
-                final List<List<String>> permutations = testSamples.isEmpty()
-                        ? Collections.singletonList(testSamples)
-                        : GeneralUtils.makePermutations(testSamples, testSamples.size(), false);
-                for ( final List<String> testSamplesPermutation : permutations ) {
-                    final VCFHeader testHeaderWithSamples = new VCFHeader(inputHeader.getMetaDataInInputOrder(), testSamplesPermutation);
-                    final boolean expectedConsistent = testSamples.equals(inSamples);
-                    tests.add(new Object[]{new HeaderOrderTestCase(inputHeaderWithSamples, testHeaderWithSamples, expectedConsistent)});
-                }
-            }
-        }
-
-        return tests.toArray(new Object[][]{});
-    }
-
-    private static boolean expectedConsistent(final VCFHeader combinationHeader, final int minCounterForInputLines) {
-        final List<Integer> ids = new ArrayList<Integer>();
-        for ( final VCFHeaderLine line : combinationHeader.getMetaDataInInputOrder() ) {
-            if ( line instanceof VCFIDHeaderLine) {
-                ids.add(Integer.valueOf(((VCFIDHeaderLine) line).getID()));
-            }
-        }
-
-        // as long as the start contains all of the ids up to minCounterForInputLines in order
-        for ( int i = 0; i < minCounterForInputLines; i++ )
-            if ( i >= ids.size() || ids.get(i) != i )
-                return false;
-
-        return true;
-    }
-
-    //
-    // Test to make sure that we detect correctly the case where we can preserve the genotypes data in a BCF2
-    // even when the header file is slightly different
-    //
-    @Test(dataProvider = "HeaderOrderTestProvider")
-    public void testHeaderOrder( final HeaderOrderTestCase testCase ) {
-        final boolean actualOrderConsistency = BCF2Utils.headerLinesAreOrderedConsistently(testCase.testHeader, testCase.inputHeader);
-        Assert.assertEquals(actualOrderConsistency, testCase.expectedConsistent);
-    }
-
-
-    private void assertListsAreEquivalent(final List<?> a, final List<?> b) {
-        Assert.assertEquals(a.size(), b.size());
-        for (int i=0; i<a.size(); i++)
-            Assert.assertEquals(a.get(i), b.get(i));
-    }
-
-    @DataProvider(name = "toListTestProvider")
-    public Object[][] makeToListTest() {
-        final List<Object[]> tests = new ArrayList<Object[]>();
-        tests.add(new Object[]{Object.class, null, Collections.emptyList()});
-        tests.add(new Object[]{Integer.class, 1, Arrays.asList(1)});
-        tests.add(new Object[]{Integer.class, new int[]{1, 2, 3}, Arrays.asList(1, 2, 3)});
-        tests.add(new Object[]{String.class, Arrays.asList("X", "Y"), Arrays.asList("X", "Y")});
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "toListTestProvider")
-    public void testToList(final Class<?> cls, final Object input, final List<Object> expectedOutput) {
-        assertListsAreEquivalent(BCF2Utils.toList(cls, input), expectedOutput);
-    }
-
-
-}
diff --git a/src/test/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractorTest.java b/src/test/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractorTest.java
deleted file mode 100644
index 9fb13e8..0000000
--- a/src/test/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractorTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.utils;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.SequenceUtil;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-import org.testng.Assert;
-
-import java.io.File;
-
-/**
- * @author farjoun on 4/9/14.
- */
-public class SAMSequenceDictionaryExtractorTest {
-    String path = "src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/";
-
-    @DataProvider(name = "testExtractDictionaries")
-    public Object[][] dictionaries() {
-        return new Object[][]{
-                new Object[]{"test1_comp.interval_list", "test1.dict"},
-                new Object[]{"test1.vcf", "test1.dict"},
-                new Object[]{"test1.dict", "test1.dict"},
-                new Object[]{"empty.interval_list", "test1.dict"},
-                new Object[]{"Homo_sapiens_assembly18.trimmed.fasta", "Homo_sapiens_assembly18.trimmed.dict"},
-                new Object[]{"test2_comp.interval_list", "Homo_sapiens_assembly18.trimmed.dict"},
-                new Object[]{"ScreenSamReads.100.input.sam", "test3_comp.interval_list"},
-                new Object[]{"ScreenSamReads.100.input.sam", "test4_comp.interval_list"},
-        };
-    }
-
-    @Test(dataProvider = "testExtractDictionaries")
-    public void testExtractDictionary(final String dictSource, final String dictExpected) throws Exception {
-        final File dictSourceFile = new File(path, dictSource);
-        final File dictExpectedFile = new File(path, dictExpected);
-        final SAMSequenceDictionary dict1 = SAMSequenceDictionaryExtractor.extractDictionary(dictSourceFile);
-        final SAMSequenceDictionary dict2 = SAMSequenceDictionaryExtractor.extractDictionary(dictExpectedFile);
-
-        Assert.assertTrue(SequenceUtil.areSequenceDictionariesEqual(dict1,
-                dict2));
-        Assert.assertTrue(dict1.md5().equals(dict2.md5()));
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/AlleleUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/AlleleUnitTest.java
deleted file mode 100644
index c2aa79f..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/AlleleUnitTest.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-// the imports for unit testing.
-
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.Allele;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-//    public Allele(byte[] bases, boolean isRef) {
-//    public Allele(boolean isRef) {
-//    public Allele(String bases, boolean isRef) {
-//    public boolean isReference()        { return isRef; }
-//    public boolean isNonReference()     { return ! isReference(); }
-//    public byte[] getBases() { return bases; }
-//    public boolean equals(Allele other) {
-//    public int length() {
-
-/**
- * Basic unit test for RecalData
- */
-public class AlleleUnitTest extends VariantBaseTest {
-    Allele ARef, A, T, ATIns, ATCIns, NoCall, SpandDel;
-    
-    @BeforeSuite
-    public void before() {
-        A = Allele.create("A");
-        ARef = Allele.create("A", true);
-        T = Allele.create("T");
-
-        ATIns = Allele.create("AT");
-        ATCIns = Allele.create("ATC");
-
-        NoCall = Allele.create(Allele.NO_CALL_STRING);
-
-        SpandDel = Allele.create(Allele.SPAN_DEL_STRING);
-    }
-
-    @Test
-    public void testCreatingSNPAlleles() {
-        Assert.assertTrue(A.isNonReference());
-        Assert.assertFalse(A.isReference());
-        Assert.assertTrue(A.basesMatch("A"));
-        Assert.assertEquals(A.length(), 1);
-
-        Assert.assertTrue(ARef.isReference());
-        Assert.assertFalse(ARef.isNonReference());
-        Assert.assertTrue(ARef.basesMatch("A"));
-        Assert.assertFalse(ARef.basesMatch("T"));
-
-        Assert.assertTrue(T.isNonReference());
-        Assert.assertFalse(T.isReference());
-        Assert.assertTrue(T.basesMatch("T"));
-        Assert.assertFalse(T.basesMatch("A"));
-    }
-
-    @Test
-    public void testCreatingNoCallAlleles() {
-        Assert.assertTrue(NoCall.isNonReference());
-        Assert.assertFalse(NoCall.isReference());
-        Assert.assertFalse(NoCall.basesMatch(Allele.NO_CALL_STRING));
-        Assert.assertEquals(NoCall.length(), 0);
-        Assert.assertTrue(NoCall.isNoCall());
-        Assert.assertFalse(NoCall.isCalled());
-    }
-
-    @Test
-    public void testCreatingSpanningDeletionAlleles() {
-        Assert.assertTrue(SpandDel.isNonReference());
-        Assert.assertFalse(SpandDel.isReference());
-        Assert.assertTrue(SpandDel.basesMatch(Allele.SPAN_DEL_STRING));
-        Assert.assertEquals(SpandDel.length(), 1);
-    }
-
-    @Test
-    public void testCreatingIndelAlleles() {
-        Assert.assertEquals(ATIns.length(), 2);
-        Assert.assertEquals(ATCIns.length(), 3);
-        Assert.assertEquals(ATIns.getBases(), "AT".getBytes());
-        Assert.assertEquals(ATCIns.getBases(), "ATC".getBytes());
-    }
-
-
-    @Test
-    public void testConstructors1() {
-        Allele a1 = Allele.create("A");
-        Allele a2 = Allele.create("A".getBytes());
-        Allele a3 = Allele.create("A");
-        Allele a4 = Allele.create("A", true);
-
-        Assert.assertTrue(a1.equals(a2));
-        Assert.assertTrue(a1.equals(a3));
-        Assert.assertFalse(a1.equals(a4));
-    }
-
-    @Test
-    public void testInsConstructors() {
-        Allele a1 = Allele.create("AC");
-        Allele a2 = Allele.create("AC".getBytes());
-        Allele a3 = Allele.create("AC");
-        Allele a4 = Allele.create("AC", true);
-
-        Assert.assertTrue(a1.equals(a2));
-        Assert.assertTrue(a1.equals(a3));
-        Assert.assertFalse(a1.equals(a4));
-    }
-    
-    @Test
-    public void testVCF42Breakend() {
-        Allele a;
-        
-        a = Allele.create("A.");
-        Assert.assertTrue(a.isSymbolic());
-        Assert.assertEquals("A.", a.getDisplayString());
-        
-        a = Allele.create(".A");
-        Assert.assertTrue(a.isSymbolic());
-        Assert.assertEquals(".A", a.getDisplayString());
-        
-        Assert.assertTrue(Allele.create("AA.").isSymbolic());
-        Assert.assertTrue(Allele.create(".AA").isSymbolic());
-    }
-    
-    @Test
-    public void testBreakpoint() {
-        Allele a = Allele.create("A[chr1:1[");
-
-        Assert.assertTrue(a.isSymbolic());
-        Assert.assertEquals("A[chr1:1[", a.getDisplayString());
-        
-        Assert.assertTrue(Allele.create("]chr1:1]A").isSymbolic());
-        Assert.assertTrue(Allele.create("[chr1:1[A").isSymbolic());
-        Assert.assertTrue(Allele.create("A]chr1:1]").isSymbolic());
-    }
-    
-    @Test
-    public void testBreakpointSymbolicBreakend() {
-        Assert.assertTrue(Allele.create("A[<contig>:1[").isSymbolic());
-        Assert.assertTrue(Allele.create("A]<contig>:1]").isSymbolic());
-        Assert.assertTrue(Allele.create("]<contig>:1]A").isSymbolic());
-        Assert.assertTrue(Allele.create("[<contig>:1[A").isSymbolic());        
-    }
-    
-    @Test
-    public void testInsSymbolicShorthand() {
-        Assert.assertTrue(Allele.create("A<ctg1>").isSymbolic());
-        Assert.assertTrue(Allele.create("<ctg1>A").isSymbolic());
-    }
-    
-    @Test
-    public void testTelomericBreakend() {
-        Assert.assertTrue(Allele.create(".[1:10]").isSymbolic());
-        Assert.assertTrue(Allele.create("[1:10].").isSymbolic());
-    }
-    
-    @Test
-    public void testSymbolic() {
-        Allele a = Allele.create("<SYMBOLIC>");
-
-        Assert.assertTrue(a.isSymbolic());
-        Assert.assertEquals("<SYMBOLIC>", a.getDisplayString());
-    }
-
-    @Test
-    public void testEquals() {
-        Assert.assertTrue(ARef.basesMatch(A));
-        Assert.assertFalse(ARef.equals(A));
-        Assert.assertFalse(ARef.equals(ATIns));
-        Assert.assertFalse(ARef.equals(ATCIns));
-
-        Assert.assertTrue(T.basesMatch(T));
-        Assert.assertFalse(T.basesMatch(A));
-        Assert.assertFalse(T.equals(A));
-
-        Assert.assertTrue(ATIns.equals(ATIns));
-        Assert.assertFalse(ATIns.equals(ATCIns));
-        Assert.assertTrue(ATIns.basesMatch("AT"));
-        Assert.assertFalse(ATIns.basesMatch("A"));
-        Assert.assertFalse(ATIns.basesMatch("ATC"));
-
-        Assert.assertTrue(ATIns.basesMatch("AT"));
-        Assert.assertFalse(ATIns.basesMatch("ATC"));
-    }
-
-    @Test (expectedExceptions = IllegalArgumentException.class)
-    public void testBadConstructorArgs1() {
-        byte[] foo = null;
-        Allele.create(foo);
-    }
-
-    @Test (expectedExceptions = IllegalArgumentException.class)
-    public void testBadConstructorArgs2() {
-        Allele.create("x");
-    }
-
-    @Test (expectedExceptions = IllegalArgumentException.class)
-    public void testBadConstructorArgs3() {
-        Allele.create("--");
-    }
-
-    @Test (expectedExceptions = IllegalArgumentException.class)
-    public void testBadConstructorArgs4() {
-        Allele.create("-A");
-    }
-
-    @Test (expectedExceptions = IllegalArgumentException.class)
-    public void testBadConstructorArgs5() {
-        Allele.create("A A");
-    }
-    
-    @Test (expectedExceptions = IllegalArgumentException.class)
-    public void testBadConstructorArgs6() {
-        Allele.create("<symbolic>", true); // symbolic cannot be ref allele
-    }
-
-    @Test (expectedExceptions = IllegalArgumentException.class)
-    public void testBadNoCallAllelel() {
-        Allele.create(Allele.NO_CALL_STRING, true); // no call cannot be ref allele
-    }
-
-    @Test (expectedExceptions = IllegalArgumentException.class)
-    public void testBadSpanningDeletionAllelel() {
-        Allele.create(Allele.SPAN_DEL_STRING, true); // spanning deletion cannot be ref allele
-    }
-
-    @Test
-    public void testExtend() {
-        Assert.assertEquals("AT", Allele.extend(Allele.create("A"), "T".getBytes()).toString());
-        Assert.assertEquals("ATA", Allele.extend(Allele.create("A"), "TA".getBytes()).toString());
-        Assert.assertEquals("A", Allele.extend(Allele.NO_CALL, "A".getBytes()).toString());
-        Assert.assertEquals("ATCGA", Allele.extend(Allele.create("AT"), "CGA".getBytes()).toString());
-        Assert.assertEquals("ATCGA", Allele.extend(Allele.create("ATC"), "GA".getBytes()).toString());
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/GenotypeBuilderTest.java b/src/test/java/htsjdk/variant/variantcontext/GenotypeBuilderTest.java
deleted file mode 100644
index 5e3f0b9..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/GenotypeBuilderTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
-* Copyright (c) 2016 The Broad Institute
-*
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.variant.VariantBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class GenotypeBuilderTest extends VariantBaseTest {
-
-    @Test
-    public void testMakeWithShallowCopy() {
-        final GenotypeBuilder gb = new GenotypeBuilder("test");
-        final List<Allele> alleles = new ArrayList<>(
-                Arrays.asList(Allele.create("A", true), Allele.create("T")));
-        final int[] ad = new int[]{1,5};
-        final int[] pl = new int[]{1,6};
-        final int[] first = new int[]{1, 2};
-        final int[] second = new int[]{3, 4};
-        final Genotype firstG = gb.alleles(alleles).attribute("first", first).makeWithShallowCopy();
-        final Genotype secondG = gb.AD(ad).PL(pl).attribute("second", second).makeWithShallowCopy();
-        // both genotypes have the first field
-        Assert.assertEquals(first, firstG.getExtendedAttribute("first"));
-        Assert.assertEquals(first, secondG.getExtendedAttribute("first"));
-        // both genotypes have the the alleles
-        Assert.assertEquals(alleles, firstG.getAlleles());
-        Assert.assertEquals(alleles, secondG.getAlleles());
-        // only the second genotype should have the AD field
-        Assert.assertNull(firstG.getAD());
-        Assert.assertEquals(ad, secondG.getAD());
-        // only the second genotype should have the PL field
-        Assert.assertNull(firstG.getPL());
-        Assert.assertEquals(pl, secondG.getPL());
-        // only the second genotype should have the second field
-        Assert.assertNull(firstG.getExtendedAttribute("second"));
-        Assert.assertEquals(second, secondG.getExtendedAttribute("second"));
-        // modification of alleles does not change the genotypes
-        alleles.add(Allele.create("C"));
-        Assert.assertNotEquals(alleles, firstG.getAlleles());
-        Assert.assertNotEquals(alleles, secondG.getAlleles());
-        // modification of ad or pl does not change the genotypes
-        ad[0] = 0;
-        pl[0] = 10;
-        Assert.assertNotEquals(ad, secondG.getAD());
-        Assert.assertNotEquals(pl, secondG.getPL());
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/GenotypeLikelihoodsUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/GenotypeLikelihoodsUnitTest.java
deleted file mode 100644
index a7c2bb6..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/GenotypeLikelihoodsUnitTest.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-// the imports for unit testing.
-
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.utils.GeneralUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-
-/**
- * Basic unit test for Genotype likelihoods objects
- */
-public class GenotypeLikelihoodsUnitTest extends VariantBaseTest {
-    double [] v = new double[]{-10.5, -1.25, -5.11};
-    final static String vGLString = "-10.50,-1.25,-5.11";
-    final static String vPLString = "93,0,39";
-    double[] triAllelic = new double[]{-4.2,-2.0,-3.0,-1.6,0.0,-4.0}; //AA,AB,AC,BB,BC,CC
-
-    @BeforeMethod
-    public void initializeAnyploidPLIndexToAlleleIndices() {
-        GenotypeLikelihoods.anyploidPloidyToPLIndexToAlleleIndices.clear();
-        GenotypeLikelihoods.initializeAnyploidPLIndexToAlleleIndices(1, 1);
-        GenotypeLikelihoods.initializeAnyploidPLIndexToAlleleIndices(2, 2);
-        GenotypeLikelihoods.initializeAnyploidPLIndexToAlleleIndices(2, 3);
-    }
-
-    @Test
-    public void testFromVector2() {
-        GenotypeLikelihoods gl = GenotypeLikelihoods.fromLog10Likelihoods(v);
-        assertDoubleArraysAreEqual(gl.getAsVector(), v);
-        Assert.assertEquals(gl.getAsString(), vPLString);
-    }
-
-    @Test
-    public void testFromString1() {
-        GenotypeLikelihoods gl = GenotypeLikelihoods.fromPLField(vPLString);
-        assertDoubleArraysAreEqual(gl.getAsVector(), new double[]{-9.3, 0, -3.9});
-        Assert.assertEquals(gl.getAsString(), vPLString);
-    }
-
-    @Test
-    public void testFromString2() {
-        GenotypeLikelihoods gl = GenotypeLikelihoods.fromGLField(vGLString);
-        assertDoubleArraysAreEqual(gl.getAsVector(), v);
-        Assert.assertEquals(gl.getAsString(), vPLString);
-    }
-
-    @Test (expectedExceptions = TribbleException.class)
-    public void testErrorBadFormat() {
-        GenotypeLikelihoods gl = GenotypeLikelihoods.fromPLField("adf,b,c");
-        gl.getAsVector();
-    }
-
-    @Test
-    public void testGetAsMap(){
-        GenotypeLikelihoods gl = GenotypeLikelihoods.fromLog10Likelihoods(v);
-        //Log scale
-        EnumMap<GenotypeType,Double> glMap = gl.getAsMap(false);
-        Assert.assertEquals(v[GenotypeType.HOM_REF.ordinal()-1],glMap.get(GenotypeType.HOM_REF));
-        Assert.assertEquals(v[GenotypeType.HET.ordinal()-1],glMap.get(GenotypeType.HET));
-        Assert.assertEquals(v[GenotypeType.HOM_VAR.ordinal()-1],glMap.get(GenotypeType.HOM_VAR));
-
-        //Linear scale
-        glMap = gl.getAsMap(true);
-        double [] vl = GeneralUtils.normalizeFromLog10(v);
-        Assert.assertEquals(vl[GenotypeType.HOM_REF.ordinal()-1],glMap.get(GenotypeType.HOM_REF));
-        Assert.assertEquals(vl[GenotypeType.HET.ordinal()-1],glMap.get(GenotypeType.HET));
-        Assert.assertEquals(vl[GenotypeType.HOM_VAR.ordinal()-1],glMap.get(GenotypeType.HOM_VAR));
-
-        //Test missing likelihoods
-        gl = GenotypeLikelihoods.fromPLField(".");
-        glMap = gl.getAsMap(false);
-        Assert.assertNull(glMap);
-
-    }
-
-    @Test
-    public void testCalculateNumLikelihoods() {    
-        
-        for (int nAlleles=2; nAlleles<=5; nAlleles++)
-            // simplest case: diploid
-            Assert.assertEquals(GenotypeLikelihoods.numLikelihoods(nAlleles, 2), nAlleles*(nAlleles+1)/2);
-
-        // some special cases: ploidy = 20, #alleles = 4
-        Assert.assertEquals(GenotypeLikelihoods.numLikelihoods(4, 20), 1771);
-    }
-    
-    @Test
-    public void testGetLog10GQ(){
-        GenotypeLikelihoods gl = GenotypeLikelihoods.fromPLField(vPLString);
-
-        //GQ for the best guess genotype
-        Assert.assertEquals(gl.getLog10GQ(GenotypeType.HET),-3.9);
-
-        double[] test = GeneralUtils.normalizeFromLog10(gl.getAsVector());
-
-        //GQ for the other genotypes
-        Assert.assertEquals(gl.getLog10GQ(GenotypeType.HOM_REF), Math.log10(1.0 - test[GenotypeType.HOM_REF.ordinal()-1]));
-        Assert.assertEquals(gl.getLog10GQ(GenotypeType.HOM_VAR), Math.log10(1.0 - test[GenotypeType.HOM_VAR.ordinal()-1]));
-
-       //Test missing likelihoods
-        gl = GenotypeLikelihoods.fromPLField(".");
-        Assert.assertEquals(gl.getLog10GQ(GenotypeType.HOM_REF),Double.NEGATIVE_INFINITY);
-        Assert.assertEquals(gl.getLog10GQ(GenotypeType.HET),Double.NEGATIVE_INFINITY);
-        Assert.assertEquals(gl.getLog10GQ(GenotypeType.HOM_VAR),Double.NEGATIVE_INFINITY);
-
-    }
-
-    @Test
-    public void testgetQualFromLikelihoods() {
-        double[] likelihoods = new double[]{-1, 0, -2};
-        // qual values we expect for each possible "best" genotype
-        double[] expectedQuals = new double[]{-0.04100161, -1, -0.003930294};
-
-        for ( int i = 0; i < likelihoods.length; i++ ) {
-            Assert.assertEquals(GenotypeLikelihoods.getGQLog10FromLikelihoods(i, likelihoods), expectedQuals[i], 1e-6,
-                    "GQ value for genotype " + i + " was not calculated correctly");
-        }
-    }
-
-    // this test is completely broken, the method is wrong.
-    public void testGetQualFromLikelihoodsMultiAllelicBroken() {
-        GenotypeLikelihoods gl = GenotypeLikelihoods.fromLog10Likelihoods(triAllelic);
-        double actualGQ = gl.getLog10GQ(GenotypeType.HET);
-        double expectedGQ = 1.6;
-        Assert.assertEquals(actualGQ,expectedGQ);
-    }
-
-    public void testGetQualFromLikelihoodsMultiAllelic() {
-        GenotypeLikelihoods gl = GenotypeLikelihoods.fromLog10Likelihoods(triAllelic);
-        Allele ref = Allele.create((byte)'A',true);
-        Allele alt1 = Allele.create((byte)'C');
-        Allele alt2 = Allele.create((byte)'T');
-        List<Allele> allAlleles = Arrays.asList(ref,alt1,alt2);
-        List<Allele> gtAlleles = Arrays.asList(alt1,alt2);
-        GenotypeBuilder gtBuilder = new GenotypeBuilder();
-        gtBuilder.alleles(gtAlleles);
-        double actualGQ = gl.getLog10GQ(gtBuilder.make(),allAlleles);
-        double expectedGQ = 1.6;
-        Assert.assertEquals(actualGQ,expectedGQ);
-    }
-
-    private void assertDoubleArraysAreEqual(double[] v1, double[] v2) {
-        Assert.assertEquals(v1.length, v2.length);
-        for ( int i = 0; i < v1.length; i++ ) {
-            Assert.assertEquals(v1[i], v2[i], 1e-6);
-        }
-    }
-
-    @Test
-    public void testCalculatePLindex(){
-        int counter = 0;
-        for ( int i = 0; i <= 3; i++ ) {
-            for ( int j = i; j <= 3; j++ ) {
-                Assert.assertEquals(GenotypeLikelihoods.calculatePLindex(i, j), GenotypeLikelihoods.PLindexConversion[counter++], "PL index of alleles " + i + "," + j + " was not calculated correctly");
-            }
-        }
-    }
-
-    @DataProvider
-    public Object[][] testGetAllelePairData() {
-        return new Object[][]{
-                {0, 0, 0},
-                {1, 0, 1},
-                {2, 1, 1},
-                {3, 0, 2},
-                {4, 1, 2},
-                {5, 2, 2},
-                {6, 0, 3},
-                {7, 1, 3},
-                {8, 2, 3},
-                {9, 3, 3}
-        };
-    }
-
-    @Test(dataProvider = "testGetAllelePairData")
-    public void testGetAllelePair(final int PLindex, final int allele1, final int allele2) {
-        Assert.assertEquals(GenotypeLikelihoods.getAllelePair(PLindex).alleleIndex1, allele1, "allele index " + allele1 + " from PL index " + PLindex + " was not calculated correctly");
-        Assert.assertEquals(GenotypeLikelihoods.getAllelePair(PLindex).alleleIndex2, allele2, "allele index " + allele2 + " from PL index " + PLindex + " was not calculated correctly");
-    }
-
-    @DataProvider
-    public Object[][] testCalculateAnyploidPLcacheData() {
-        return new Object[][]{
-                {
-                        1, 1,
-                        Arrays.asList(Arrays.asList(0),
-                                Arrays.asList(1)
-                        )
-                },
-                {
-                        2, 2,
-                        Arrays.asList(Arrays.asList(0, 0),
-                                Arrays.asList(0, 1),
-                                Arrays.asList(1, 1),
-                                Arrays.asList(0, 2),
-                                Arrays.asList(1, 2),
-                                Arrays.asList(2, 2)
-                        )
-                },
-                {
-                        2, 3,
-                        Arrays.asList(Arrays.asList(0, 0, 0),
-                                Arrays.asList(0, 0, 1),
-                                Arrays.asList(0, 1, 1),
-                                Arrays.asList(1, 1, 1),
-                                Arrays.asList(0, 0, 2),
-                                Arrays.asList(0, 1, 2),
-                                Arrays.asList(1, 1, 2),
-                                Arrays.asList(0, 2, 2),
-                                Arrays.asList(1, 2, 2),
-                                Arrays.asList(2, 2, 2)
-                        )
-                },
-                {
-                        2, -1,
-                        Arrays.asList(Arrays.asList())
-                },
-                {
-                        -1, 2,
-                        Arrays.asList(Arrays.asList())
-                }
-        };
-    }
-
-    @Test(dataProvider = "testCalculateAnyploidPLcacheData")
-    public void testCalculateAnyploidPLcache(final int altAlleles, final int ploidy, final List<List<Integer>> expected) {
-        List<List<Integer>> anyploidPLIndexToAlleleIndices = GenotypeLikelihoods.calculateAnyploidPLcache(altAlleles, ploidy);
-        for ( int i=0; i < anyploidPLIndexToAlleleIndices.size(); i++ )
-            Assert.assertEquals(anyploidPLIndexToAlleleIndices.get(i), expected.get(i));
-    }
-
-    @Test(dataProvider = "testCalculateAnyploidPLcacheData")
-    public void testInitializeAnyploidPLIndexToAlleleIndices(final int altAlleles, final int ploidy, final List<List<Integer>> expected) {
-        if ( altAlleles >= 1 && ploidy >= 1 ) { // Bypass test with bad data
-            Map<Integer, List<List<Integer>>> expectedMap = new HashMap<Integer, List<List<Integer>>>();
-            expectedMap.put(ploidy, expected);
-            for (Map.Entry<Integer, List<List<Integer>>> entry : GenotypeLikelihoods.anyploidPloidyToPLIndexToAlleleIndices.entrySet()) {
-                if (expectedMap.containsKey(entry.getKey()))
-                    Assert.assertEquals(entry.getValue(), expectedMap.get(entry.getKey()));
-            }
-        }
-    }
-
-    @DataProvider
-    public Object[][] testInitializeAnyploidPLIndexToAlleleIndiceseBadData() {
-        return new Object[][]{
-                { 2, -1 },
-                { -1, 2 }
-        };
-    }
-
-    @Test(dataProvider = "testInitializeAnyploidPLIndexToAlleleIndiceseBadData", expectedExceptions = IllegalArgumentException.class)
-    public void testInitializeAnyploidPLIndexToAlleleIndicesBadData(final int altAlleles, final int ploidy) {
-        GenotypeLikelihoods.initializeAnyploidPLIndexToAlleleIndices(altAlleles, ploidy);
-    }
-
-    @DataProvider
-    public Object[][] testGetAllelesData() {
-        return new Object[][]{
-                {0, 2, 3, Arrays.asList(0,0,0)},
-                {1, 2, 3, Arrays.asList(0,0,1)},
-                {2, 2, 3, Arrays.asList(0,1,1)},
-                {3, 2, 3, Arrays.asList(1,1,1)},
-                {4, 2, 3, Arrays.asList(0,0,2)},
-                {5, 2, 3, Arrays.asList(0,1,2)},
-                {6, 2, 3, Arrays.asList(1,1,2)},
-                {7, 2, 3, Arrays.asList(0,2,2)},
-                {8, 2, 3, Arrays.asList(1,2,2)},
-                {9, 2, 3, Arrays.asList(2,2,2)},
-                {1, 2, 1, Arrays.asList(1)}
-        };
-    }
-
-    @Test(dataProvider = "testGetAllelesData")
-    public void testGetAlleles(final int PLindex, final int altAlleles, final int ploidy, final List<Integer> expected ) {
-        Assert.assertEquals(GenotypeLikelihoods.getAlleles(PLindex, ploidy), expected);
-    }
-
-    @DataProvider
-    public Object[][] testGetAllelesIndexOutOfBoundsData() {
-        return new Object[][]{
-                {-1, 3},  // PL index too small, non-diploid
-                {10, 3},  // PL index too large, non-diploid
-                {-1, 2},  // PL index too small, diploid
-                {GenotypeLikelihoods.numLikelihoods(GenotypeLikelihoods.MAX_DIPLOID_ALT_ALLELES_THAT_CAN_BE_GENOTYPED+1,2), 2} // PL index too large, diploid
-        };
-    }
-
-    @Test(dataProvider = "testGetAllelesIndexOutOfBoundsData", expectedExceptions = IllegalStateException.class)
-    public void testGetAllelesOutOfBounds(final int PLindex, final int ploidy) {
-        final List<Integer> alleles = GenotypeLikelihoods.getAlleles(PLindex, ploidy);
-    }
-
-    @Test(expectedExceptions = IllegalStateException.class)
-    public void testGetAllelesUnitialized() {
-        GenotypeLikelihoods.anyploidPloidyToPLIndexToAlleleIndices.clear();
-        final List<Integer> alleles = GenotypeLikelihoods.getAlleles(0, 3);
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/GenotypeUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/GenotypeUnitTest.java
deleted file mode 100644
index a447a0b..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/GenotypeUnitTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-// the imports for unit testing.
-
-
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.vcf.VCFConstants;
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-
-public class GenotypeUnitTest extends VariantBaseTest {
-    Allele A, Aref, T;
-
-    @BeforeSuite
-    public void before() {
-        A = Allele.create("A");
-        Aref = Allele.create("A", true);
-        T = Allele.create("T");
-    }
-
-    private static final GenotypeBuilder makeGB() {
-        return new GenotypeBuilder("misc");
-    }
-
-    @Test
-    public void testFilters() {
-        Assert.assertFalse(makeGB().make().isFiltered(), "by default Genotypes must be PASS");
-        Assert.assertNull(makeGB().make().getFilters(), "by default Genotypes must be PASS => getFilters() == null");
-        Assert.assertFalse(makeGB().filter(null).make().isFiltered(), "setting filter == null => Genotypes must be PASS");
-        Assert.assertNull(makeGB().filter(null).make().getFilters(), "Genotypes PASS => getFilters == null");
-        Assert.assertFalse(makeGB().filter("PASS").make().isFiltered(), "setting filter == PASS => Genotypes must be PASS");
-        Assert.assertNull(makeGB().filter("PASS").make().getFilters(), "Genotypes PASS => getFilters == null");
-        Assert.assertTrue(makeGB().filter("x").make().isFiltered(), "setting filter != null => Genotypes must be PASS");
-        Assert.assertEquals(makeGB().filter("x").make().getFilters(), "x", "Should get back the expected filter string");
-        Assert.assertEquals(makeGB().filters("x", "y").make().getFilters(), "x;y", "Multiple filter field values should be joined with ;");
-        Assert.assertEquals(makeGB().filters("x", "y", "z").make().getFilters(), "x;y;z", "Multiple filter field values should be joined with ;");
-        Assert.assertTrue(makeGB().filters("x", "y", "z").make().isFiltered(), "Multiple filter values should be filtered");
-        Assert.assertEquals(makeGB().filter("x;y;z").make().getFilters(), "x;y;z", "Multiple filter field values should be joined with ;");
-        Assert.assertEquals(makeGB().filter("x;y;z").make().getAnyAttribute(VCFConstants.GENOTYPE_FILTER_KEY), "x;y;z", "getAnyAttribute(GENOTYPE_FILTER_KEY) should return the filter");
-        Assert.assertTrue(makeGB().filter("x;y;z").make().hasAnyAttribute(VCFConstants.GENOTYPE_FILTER_KEY), "hasAnyAttribute(GENOTYPE_FILTER_KEY) should return true");
-        Assert.assertTrue(makeGB().make().hasAnyAttribute(VCFConstants.GENOTYPE_FILTER_KEY), "hasAnyAttribute(GENOTYPE_FILTER_KEY) should return true");
-        Assert.assertFalse(makeGB().filter("").make().isFiltered(), "empty filters should count as unfiltered");
-        Assert.assertEquals(makeGB().filter("").make().getFilters(), null, "empty filter string should result in null filters");
-    }
-
-//    public Genotype(String sampleName, List<Allele> alleles, double negLog10PError, Set<String> filters, Map<String, ?> attributes, boolean isPhased) {
-//    public Genotype(String sampleName, List<Allele> alleles, double negLog10PError, Set<String> filters, Map<String, ?> attributes, boolean isPhased, double[] log10Likelihoods) {
-//    public Genotype(String sampleName, List<Allele> alleles, double negLog10PError, double[] log10Likelihoods)
-//    public Genotype(String sampleName, List<Allele> alleles, double negLog10PError)
-//    public Genotype(String sampleName, List<Allele> alleles)
-//    public List<Allele> getAlleles()
-//    public List<Allele> getAlleles(Allele allele)
-//    public Allele getAllele(int i)
-//    public boolean isPhased()
-//    public int getPloidy()
-//    public Type getType()
-//    public boolean isHom()
-//    public boolean isHomRef()
-//    public boolean isHomVar()
-//    public boolean isHet()
-//    public boolean isNoCall()
-//    public boolean isCalled()
-//    public boolean isAvailable()
-//    public boolean hasLikelihoods()
-//    public GenotypeLikelihoods getLikelihoods()
-//    public boolean sameGenotype(Genotype other)
-//    public boolean sameGenotype(Genotype other, boolean ignorePhase)
-//    public String getSampleName()
-//    public boolean hasLog10PError()
-//    public double getLog10PError()
-//    public double getPhredScaledQual()
-//    public boolean hasExtendedAttribute(String key)
-//    public Object getExtendedAttribute(String key)
-//    public Object getExtendedAttribute(String key, Object defaultValue)
-//    public String getAttributeAsString(String key, String defaultValue)
-//    public int getAttributeAsInt(String key, int defaultValue)
-//    public double getAttributeAsDouble(String key, double  defaultValue)
-//    public boolean getAttributeAsBoolean(String key, boolean  defaultValue)
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/GenotypesContextUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/GenotypesContextUnitTest.java
deleted file mode 100644
index 0f30753..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/GenotypesContextUnitTest.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-// the imports for unit testing.
-
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.utils.GeneralUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-
-public class GenotypesContextUnitTest extends VariantBaseTest {
-    Allele Aref, C, T;
-    Genotype AA, AT, TT, AC, CT, CC, MISSING;
-    List<Genotype> allGenotypes;
-
-    @BeforeSuite
-    public void before() {
-        C = Allele.create("C");
-        Aref = Allele.create("A", true);
-        T = Allele.create("T");
-        AA = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
-        AT = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
-        TT = GenotypeBuilder.create("TT", Arrays.asList(T, T));
-        AC = GenotypeBuilder.create("AC", Arrays.asList(Aref, C));
-        CT = GenotypeBuilder.create("CT", Arrays.asList(C, T));
-        CC = GenotypeBuilder.create("CC", Arrays.asList(C, C));
-        MISSING = GenotypeBuilder.create("MISSING", Arrays.asList(C, C));
-
-        allGenotypes = Arrays.asList(AA, AT, TT, AC, CT, CC);
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Provider
-    //
-    // --------------------------------------------------------------------------------
-
-    private interface ContextMaker {
-        public GenotypesContext make(List<Genotype> initialSamples);
-    }
-
-    private ContextMaker baseMaker = new ContextMaker() {
-        @Override
-        public GenotypesContext make(final List<Genotype> initialSamples) {
-            return GenotypesContext.copy(initialSamples);
-        }
-
-        @Override
-        public String toString() {
-            return "GenotypesContext";
-        }
-    };
-
-    private final class lazyMaker implements LazyGenotypesContext.LazyParser, ContextMaker {
-        @Override
-        public LazyGenotypesContext.LazyData parse(final Object data) {
-            GenotypesContext gc = GenotypesContext.copy((List<Genotype>)data);
-            gc.ensureSampleNameMap();
-            gc.ensureSampleOrdering();
-            return new LazyGenotypesContext.LazyData(gc.notToBeDirectlyAccessedGenotypes, gc.sampleNamesInOrder, gc.sampleNameToOffset);
-        }
-
-        @Override
-        public GenotypesContext make(final List<Genotype> initialSamples) {
-            return new LazyGenotypesContext(this, initialSamples, initialSamples.size());
-        }
-
-        @Override
-        public String toString() {
-            return "LazyGenotypesContext";
-        }
-    }
-
-    private Collection<ContextMaker> allMakers = Arrays.asList(baseMaker, new lazyMaker());
-
-    private class GenotypesContextProvider {
-        String name;
-        ContextMaker maker;
-        final List<Genotype> initialSamples;
-
-        private GenotypesContextProvider(ContextMaker maker, List<Genotype> initialSamples) {
-            this.name = String.format("%s with %d samples", maker.toString(), initialSamples.size());
-            this.maker = maker;
-            this.initialSamples = initialSamples;
-        }
-
-        public GenotypesContext makeContext() {
-            return maker.make(initialSamples);
-        }
-    }
-
-    @DataProvider(name = "GenotypesContextProvider")
-    public Object[][] MakeSampleNamesTest() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-
-        for ( ContextMaker maker : allMakers ) {
-            for ( int i = 0; i < allGenotypes.size(); i++ ) {
-                List<Genotype> samples = allGenotypes.subList(0, i);
-                // sorted
-                tests.add(new Object[]{new GenotypesContextProvider(maker, samples)});
-                // unsorted
-                tests.add(new Object[]{new GenotypesContextProvider(maker, GeneralUtils.reverse(samples))});
-            }
-        }
-
-        return tests.toArray(new Object[][]{});
-    }
-
-    private final static void testIterable(Iterable<Genotype> genotypeIterable, Set<String> expectedNames) {
-        int count = 0;
-        for ( final Genotype g : genotypeIterable ) {
-            Assert.assertTrue(expectedNames.contains(g.getSampleName()));
-            count++;
-        }
-        Assert.assertEquals(count, expectedNames.size(), "Iterable returned unexpected number of genotypes");
-    }
-
-    @Test(dataProvider = "GenotypesContextProvider")
-    public void testInitialSamplesAreAsExpected(GenotypesContextProvider cfg) {
-        testGenotypesContextContainsExpectedSamples(cfg.makeContext(), cfg.initialSamples);
-    }
-
-    private final void testGenotypesContextContainsExpectedSamples(GenotypesContext gc, List<Genotype> expectedSamples) {
-        Assert.assertEquals(gc.isEmpty(), expectedSamples.isEmpty());
-        Assert.assertEquals(gc.size(), expectedSamples.size());
-
-        // get(index) is doing the right thing
-        for ( int i = 0; i < expectedSamples.size(); i++ ) {
-            Assert.assertEquals(gc.get(i), expectedSamples.get(i));
-        }
-        Assert.assertFalse(gc.containsSample(MISSING.getSampleName()));
-
-        // we can fetch samples by name
-        final Set<String> genotypeNames = VariantContextUtils.genotypeNames(expectedSamples);
-        for ( final String name : genotypeNames ) {
-            Assert.assertTrue(gc.containsSample(name));
-        }
-        Assert.assertFalse(gc.containsSample(MISSING.getSampleName()));
-
-        // all of the iterators are working
-        testIterable(gc.iterateInSampleNameOrder(), genotypeNames);
-        testIterable(gc, genotypeNames);
-        testIterable(gc.iterateInSampleNameOrder(genotypeNames), genotypeNames);
-        if ( ! genotypeNames.isEmpty() ) {
-            Set<String> first = Collections.singleton(genotypeNames.iterator().next());
-            testIterable(gc.iterateInSampleNameOrder(first), first);
-        }
-
-        // misc. utils are working as expected
-        assertEqualsSet(gc.getSampleNames(), genotypeNames, "gc sample names vs. expected sample names");
-        Assert.assertTrue(ParsingUtils.isSorted(gc.getSampleNamesOrderedByName()));
-        Assert.assertTrue(ParsingUtils.isSorted(gc.iterateInSampleNameOrder()));
-        Assert.assertTrue(gc.containsSamples(genotypeNames));
-
-        final Set<String> withMissing = new HashSet<String>(Arrays.asList(MISSING.getSampleName()));
-        withMissing.addAll(genotypeNames);
-        Assert.assertFalse(gc.containsSamples(withMissing));
-    }
-
-    @Test(enabled = true, dataProvider = "GenotypesContextProvider")
-    public void testImmutable(GenotypesContextProvider cfg) {
-        GenotypesContext gc = cfg.makeContext();
-        Assert.assertEquals(gc.isMutable(), true);
-        gc.immutable();
-        Assert.assertEquals(gc.isMutable(), false);
-    }
-
-    @Test(enabled = true, dataProvider = "GenotypesContextProvider", expectedExceptions = Throwable.class )
-    public void testImmutableCall1(GenotypesContextProvider cfg) {
-        GenotypesContext gc = cfg.makeContext();
-        gc.immutable();
-        gc.add(MISSING);
-    }
-
-    @Test(enabled = true, dataProvider = "GenotypesContextProvider")
-    public void testClear(GenotypesContextProvider cfg) {
-        GenotypesContext gc = cfg.makeContext();
-        gc.clear();
-        testGenotypesContextContainsExpectedSamples(gc, Collections.<Genotype>emptyList());
-    }
-
-    private static final List<Genotype> with(List<Genotype> genotypes, Genotype ... add) {
-        List<Genotype> l = new ArrayList<Genotype>(genotypes);
-        l.addAll(Arrays.asList(add));
-        return l;
-    }
-
-    private static final List<Genotype> without(List<Genotype> genotypes, Genotype ... remove) {
-        List<Genotype> l = new ArrayList<Genotype>(genotypes);
-        l.removeAll(Arrays.asList(remove));
-        return l;
-    }
-
-    @Test(enabled = true, dataProvider = "GenotypesContextProvider")
-    public void testAdds(GenotypesContextProvider cfg) {
-        Genotype add1 = GenotypeBuilder.create("add1", Arrays.asList(Aref, Aref));
-        Genotype add2 = GenotypeBuilder.create("add2", Arrays.asList(Aref, Aref));
-
-        GenotypesContext gc = cfg.makeContext();
-        gc.add(add1);
-        testGenotypesContextContainsExpectedSamples(gc, with(cfg.initialSamples, add1));
-
-        gc = cfg.makeContext();
-        gc.add(add1);
-        gc.add(add2);
-        testGenotypesContextContainsExpectedSamples(gc, with(cfg.initialSamples, add1, add2));
-
-        gc = cfg.makeContext();
-        gc.addAll(Arrays.asList(add1, add2));
-        testGenotypesContextContainsExpectedSamples(gc, with(cfg.initialSamples, add1, add2));
-    }
-
-    @Test(enabled = true, dataProvider = "GenotypesContextProvider")
-    public void testRemoves(GenotypesContextProvider cfg) {
-        Genotype rm1 = AA;
-        Genotype rm2 = AC;
-
-        GenotypesContext gc = cfg.makeContext();
-        if (gc.size() > 1) {
-            Genotype rm = gc.get(0);
-            gc.remove(rm);
-            testGenotypesContextContainsExpectedSamples(gc, without(cfg.initialSamples, rm));
-        }
-
-        gc = cfg.makeContext();
-        gc.remove(rm1);
-        testGenotypesContextContainsExpectedSamples(gc, without(cfg.initialSamples, rm1));
-
-        gc = cfg.makeContext();
-        gc.remove(rm1);
-        gc.remove(rm2);
-        testGenotypesContextContainsExpectedSamples(gc, without(cfg.initialSamples, rm1, rm2));
-
-        gc = cfg.makeContext();
-        gc.removeAll(Arrays.asList(rm1, rm2));
-        testGenotypesContextContainsExpectedSamples(gc, without(cfg.initialSamples, rm1, rm2));
-
-        gc = cfg.makeContext();
-        HashSet<Genotype> expected = new HashSet<Genotype>();
-        if ( gc.contains(rm1) ) expected.add(rm1);
-        if ( gc.contains(rm2) ) expected.add(rm2);
-        gc.retainAll(Arrays.asList(rm1, rm2));
-
-        // ensure that the two lists are the same
-        assertEqualsSet(new HashSet<Genotype>(gc.getGenotypes()), expected, "gc genotypes vs. expected");
-        // because the list order can change, we use the gc's list itself
-        testGenotypesContextContainsExpectedSamples(gc, gc.getGenotypes());
-    }
-
-    @Test(enabled = true, dataProvider = "GenotypesContextProvider")
-    public void testSet(GenotypesContextProvider cfg) {
-        Genotype set = GenotypeBuilder.create("replace", Arrays.asList(Aref, Aref));
-        int n = cfg.makeContext().size();
-        for ( int i = 0; i < n; i++ ) {
-            GenotypesContext gc = cfg.makeContext();
-            Genotype setted = gc.set(i, set);
-            Assert.assertNotNull(setted);
-            ArrayList<Genotype> l = new ArrayList<Genotype>(cfg.initialSamples);
-            l.set(i, set);
-            testGenotypesContextContainsExpectedSamples(gc, l);
-        }
-    }
-
-    @Test(enabled = true, dataProvider = "GenotypesContextProvider")
-    public void testReplace(GenotypesContextProvider cfg) {
-        int n = cfg.makeContext().size();
-        for ( int i = 0; i < n; i++ ) {
-            GenotypesContext gc = cfg.makeContext();
-            Genotype toReplace = gc.get(i);
-            Genotype replacement = GenotypeBuilder.create(toReplace.getSampleName(), Arrays.asList(Aref, Aref));
-            gc.replace(replacement);
-            ArrayList<Genotype> l = new ArrayList<Genotype>(cfg.initialSamples);
-            l.set(i, replacement);
-            Assert.assertEquals(replacement, gc.get(i));
-            testGenotypesContextContainsExpectedSamples(gc, l);
-        }
-    }
-
-    // subset to samples tested in VariantContextUnitTest
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/VariantContextBuilderTest.java b/src/test/java/htsjdk/variant/variantcontext/VariantContextBuilderTest.java
deleted file mode 100644
index f400028..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/VariantContextBuilderTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package htsjdk.variant.variantcontext;
-
-import htsjdk.variant.VariantBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-
-public class VariantContextBuilderTest extends VariantBaseTest {
-    Allele Aref, C;
-
-    String snpLoc = "chr1";
-    String snpSource = "test";
-    long snpLocStart = 10;
-    long snpLocStop = 10;
-
-    @BeforeTest
-    public void before() {
-
-        C = Allele.create("C");
-        Aref = Allele.create("A", true);
-    }
-
-    @DataProvider(name = "trueFalse")
-    public Object[][] testAttributesWorksTest() {
-        return new Object[][]{{true}, {false}};
-    }
-
-    @Test(dataProvider = "trueFalse")
-    public void testAttributeResettingWorks(final boolean leaveModifyableAsIs) {
-        final VariantContextBuilder root1 = new VariantContextBuilder(snpSource, snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, C));
-        final VariantContextBuilder root2 = new VariantContextBuilder(snpSource, snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, C));
-
-        final VariantContext result1 = root1.attribute("AC", 1).make(leaveModifyableAsIs);
-
-        //this is a red-herring and should not change anything, however, if leaveModifyableAsIs is true, it does change result1.
-        final VariantContext ignored = root1.attribute("AC", 2).make(leaveModifyableAsIs);
-
-        final VariantContext result2 = root2.attribute("AC", 1).make(leaveModifyableAsIs);
-
-        if (leaveModifyableAsIs) {
-            Assert.assertNotSame(result1.getAttribute("AC"), result2.getAttribute("AC"));
-        } else {
-            Assert.assertEquals(result1.getAttribute("AC"), result2.getAttribute("AC"));
-        }
-    }
-
-    @Test()
-    public void testAttributeResettingWorks() {
-        final VariantContextBuilder root1 = new VariantContextBuilder(snpSource, snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, C));
-        final VariantContextBuilder root2 = new VariantContextBuilder(snpSource, snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, C));
-
-        final VariantContext result1 = root1.attribute("AC", 1).make();
-
-        //this is a red-herring and should not change anything.
-        final VariantContext ignored = root1.attribute("AC", 2).make();
-
-        final VariantContext result2 = root2.attribute("AC", 1).make();
-
-       Assert.assertEquals(result1.getAttribute("AC"), result2.getAttribute("AC"));
-
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/VariantContextTestProvider.java b/src/test/java/htsjdk/variant/variantcontext/VariantContextTestProvider.java
deleted file mode 100644
index 613dec5..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/VariantContextTestProvider.java
+++ /dev/null
@@ -1,1014 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.tribble.FeatureCodecHeader;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.readers.*;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.bcf2.BCF2Codec;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.writer.Options;
-import htsjdk.variant.variantcontext.writer.VariantContextWriter;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFContigHeaderLine;
-import htsjdk.variant.vcf.VCFFilterHeaderLine;
-import htsjdk.variant.vcf.VCFFormatHeaderLine;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLine;
-import htsjdk.variant.vcf.VCFHeaderLineCount;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-import htsjdk.variant.vcf.VCFInfoHeaderLine;
-
-import org.testng.Assert;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Routines for generating all sorts of VCs for testing
- *
- * @author Your Name
- * @since Date created
- */
-public class VariantContextTestProvider {
-    final private static boolean ENABLE_GENOTYPE_TESTS = true;
-    final private static boolean ENABLE_A_AND_G_TESTS = true;
-    final private static boolean ENABLE_VARARRAY_TESTS = true;
-    final private static boolean ENABLE_PLOIDY_TESTS = true;
-    final private static boolean ENABLE_PL_TESTS = true;
-    final private static boolean ENABLE_SYMBOLIC_ALLELE_TESTS = true;
-    final private static boolean ENABLE_SOURCE_VCF_TESTS = true;
-    final private static boolean ENABLE_VARIABLE_LENGTH_GENOTYPE_STRING_TESTS = true;
-    final private static List<Integer> TWENTY_INTS = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
-
-    private static VCFHeader syntheticHeader;
-    final static List<VariantContextTestData> TEST_DATAs = new ArrayList<VariantContextTestData>();
-    private static VariantContext ROOT;
-
-    private final static List<File> testSourceVCFs = new ArrayList<File>();
-    static {
-        testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf"));
-        testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "ex2.vcf"));
-        testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "dbsnp_135.b37.1000.vcf"));
-        if ( ENABLE_SYMBOLIC_ALLELE_TESTS ) {
-            testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "diagnosis_targets_testfile.vcf"));
-            testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "VQSR.mixedTest.recal"));
-            testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "breakpoint.vcf"));
-        }
-    }
-
-    public static class VariantContextContainer {
-        private VCFHeader header;
-        private Iterable<VariantContext> vcs;
-
-        public VariantContextContainer( VCFHeader header, Iterable<VariantContext> vcs ) {
-            this.header = header;
-            this.vcs = vcs;
-        }
-
-        public VCFHeader getHeader() {
-            return header;
-        }
-
-        public Iterable<VariantContext> getVCs() {
-            return vcs;
-        }
-    }
-
-    public abstract static class VariantContextIOTest<CODECTYPE> {
-        public String toString() {
-            return "VariantContextIOTest:" + getExtension();
-        }
-        public abstract String getExtension();
-        public abstract CODECTYPE makeCodec();
-        public abstract VariantContextWriter makeWriter(final File outputFile, final EnumSet<Options> baseOptions);
-
-        public abstract VariantContextContainer readAllVCs(final File input) throws IOException;
-        
-        public List<VariantContext> preprocess(final VCFHeader header, List<VariantContext> vcsBeforeIO) {
-            return vcsBeforeIO;
-        }
-
-        public List<VariantContext> postprocess(final VCFHeader header, List<VariantContext> vcsAfterIO) {
-            return vcsAfterIO;
-        }
-    }
-
-    public static class VariantContextTestData {
-        public final VCFHeader header;
-        public List<VariantContext> vcs;
-
-        public VariantContextTestData(final VCFHeader header, final VariantContextBuilder builder) {
-            this(header, Collections.singletonList(builder.fullyDecoded(true).make()));
-        }
-
-        public VariantContextTestData(final VCFHeader header, final List<VariantContext> vcs) {
-            final Set<String> samples = new HashSet<String>();
-            for ( final VariantContext vc : vcs )
-                if ( vc.hasGenotypes() )
-                    samples.addAll(vc.getSampleNames());
-            this.header = samples.isEmpty() ? header : new VCFHeader(header.getMetaDataInSortedOrder(), samples);
-            this.vcs = vcs;
-        }
-
-        public boolean hasGenotypes() {
-            return vcs.get(0).hasGenotypes();
-        }
-
-        public String toString() {
-            StringBuilder b = new StringBuilder();
-            b.append("VariantContextTestData: [");
-            final VariantContext vc = vcs.get(0);
-            final VariantContextBuilder builder = new VariantContextBuilder(vc);
-            builder.noGenotypes();
-            b.append(builder.make().toString());
-            if ( vc.getNSamples() < 5 ) {
-                for ( final Genotype g : vc.getGenotypes() )
-                    b.append(g.toString());
-            } else {
-                b.append(" nGenotypes = ").append(vc.getNSamples());
-            }
-
-            if ( vcs.size() > 1 ) b.append(" ----- with another ").append(vcs.size() - 1).append(" VariantContext records");
-            b.append("]");
-            return b.toString();
-        }
-    }
-
-    private final static VariantContextBuilder builder() {
-        return new VariantContextBuilder(ROOT);
-    }
-
-    private final static void add(VariantContextBuilder builder) {
-        TEST_DATAs.add(new VariantContextTestData(syntheticHeader, builder));
-    }
-
-    public static void initializeTests() throws IOException {
-        createSyntheticHeader();
-        makeSyntheticTests();
-        makeEmpiricalTests();
-    }
-
-    private static void makeEmpiricalTests() throws IOException {
-        if ( ENABLE_SOURCE_VCF_TESTS ) {
-            for ( final File file : testSourceVCFs ) {
-                VCFCodec codec = new VCFCodec();
-                VariantContextContainer x = readAllVCs( file, codec );
-                List<VariantContext> fullyDecoded = new ArrayList<VariantContext>();
-
-                for ( final VariantContext raw : x.getVCs() ) {
-                    if ( raw != null )
-                        fullyDecoded.add(raw.fullyDecode(x.getHeader(), false));
-                }
-
-                TEST_DATAs.add(new VariantContextTestData(x.getHeader(), fullyDecoded));
-            }
-        }
-    }
-
-    private final static void addHeaderLine(final Set<VCFHeaderLine> metaData, final String id, final int count, final VCFHeaderLineType type) {
-        metaData.add(new VCFInfoHeaderLine(id, count, type, "x"));
-        if ( type != VCFHeaderLineType.Flag )
-            metaData.add(new VCFFormatHeaderLine(id, count, type, "x"));
-    }
-
-    private final static void addHeaderLine(final Set<VCFHeaderLine> metaData, final String id, final VCFHeaderLineCount count, final VCFHeaderLineType type) {
-        metaData.add(new VCFInfoHeaderLine(id, count, type, "x"));
-        if ( type != VCFHeaderLineType.Flag )
-            metaData.add(new VCFFormatHeaderLine(id, count, type, "x"));
-    }
-
-    private static void createSyntheticHeader() {
-        Set<VCFHeaderLine> metaData = new TreeSet<VCFHeaderLine>();
-
-        addHeaderLine(metaData, "STRING1", 1, VCFHeaderLineType.String);
-        addHeaderLine(metaData, "END", 1, VCFHeaderLineType.Integer);
-        addHeaderLine(metaData, "STRING3", 3, VCFHeaderLineType.String);
-        addHeaderLine(metaData, "STRING20", 20, VCFHeaderLineType.String);
-        addHeaderLine(metaData, "VAR.INFO.STRING", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String);
-
-        addHeaderLine(metaData, "GT", 1, VCFHeaderLineType.String);
-        addHeaderLine(metaData, "GQ", 1, VCFHeaderLineType.Integer);
-        addHeaderLine(metaData, "ADA", VCFHeaderLineCount.A, VCFHeaderLineType.Integer);
-        addHeaderLine(metaData, "PL", VCFHeaderLineCount.G, VCFHeaderLineType.Integer);
-        addHeaderLine(metaData, "GS", 2, VCFHeaderLineType.String);
-        addHeaderLine(metaData, "GV", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String);
-        addHeaderLine(metaData, "FT", 1, VCFHeaderLineType.String);
-
-        // prep the header
-        metaData.add(new VCFContigHeaderLine(Collections.singletonMap("ID", "1"), 0));
-
-        metaData.add(new VCFFilterHeaderLine("FILTER1"));
-        metaData.add(new VCFFilterHeaderLine("FILTER2"));
-
-        addHeaderLine(metaData, "INT1", 1, VCFHeaderLineType.Integer);
-        addHeaderLine(metaData, "INT3", 3, VCFHeaderLineType.Integer);
-        addHeaderLine(metaData, "INT20", 20, VCFHeaderLineType.Integer);
-        addHeaderLine(metaData, "INT.VAR", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer);
-        addHeaderLine(metaData, "FLOAT1", 1, VCFHeaderLineType.Float);
-        addHeaderLine(metaData, "FLOAT3", 3, VCFHeaderLineType.Float);
-        addHeaderLine(metaData, "FLAG", 0, VCFHeaderLineType.Flag);
-
-        syntheticHeader = new VCFHeader(metaData);
-    }
-
-
-    private static void makeSyntheticTests() {
-        VariantContextBuilder rootBuilder = new VariantContextBuilder();
-        rootBuilder.source("test");
-        rootBuilder.loc("1", 10, 10);
-        rootBuilder.alleles("A", "C");
-        rootBuilder.unfiltered();
-        ROOT = rootBuilder.make();
-
-        add(builder());
-        add(builder().alleles("A"));
-        add(builder().alleles("A", "C", "T"));
-        add(builder().alleles("A", "AC"));
-        add(builder().alleles("A", "ACAGT"));
-        add(builder().loc("1", 10, 11).alleles("AC", "A"));
-        add(builder().loc("1", 10, 13).alleles("ACGT", "A"));
-
-        // make sure filters work
-        add(builder().unfiltered());
-        add(builder().passFilters());
-        add(builder().filters("FILTER1"));
-        add(builder().filters("FILTER1", "FILTER2"));
-
-        add(builder().log10PError(VariantContext.NO_LOG10_PERROR));
-        add(builder().log10PError(-1));
-        add(builder().log10PError(-1.234e6));
-
-        add(builder().noID());
-        add(builder().id("rsID12345"));
-
-
-        add(builder().attribute("INT1", 1));
-        add(builder().attribute("INT1", 100));
-        add(builder().attribute("INT1", 1000));
-        add(builder().attribute("INT1", 100000));
-        add(builder().attribute("INT1", null));
-        add(builder().attribute("INT3", Arrays.asList(1, 2, 3)));
-        add(builder().attribute("INT3", Arrays.asList(1000, 2000, 3000)));
-        add(builder().attribute("INT3", Arrays.asList(100000, 200000, 300000)));
-        add(builder().attribute("INT3", null));
-        add(builder().attribute("INT20", TWENTY_INTS));
-
-        add(builder().attribute("FLOAT1", 1.0));
-        add(builder().attribute("FLOAT1", 100.0));
-        add(builder().attribute("FLOAT1", 1000.0));
-        add(builder().attribute("FLOAT1", 100000.0));
-        add(builder().attribute("FLOAT1", null));
-        add(builder().attribute("FLOAT3", Arrays.asList(1.0, 2.0, 3.0)));
-        add(builder().attribute("FLOAT3", Arrays.asList(1000.0, 2000.0, 3000.0)));
-        add(builder().attribute("FLOAT3", Arrays.asList(100000.0, 200000.0, 300000.0)));
-        add(builder().attribute("FLOAT3", null));
-
-        add(builder().attribute("FLAG", true));
-        //add(builder().attribute("FLAG", false)); // NOTE -- VCF doesn't allow false flags
-
-        add(builder().attribute("STRING1", "s1"));
-        add(builder().attribute("STRING1", null));
-        add(builder().attribute("STRING3", Arrays.asList("s1", "s2", "s3")));
-        add(builder().attribute("STRING3", null));
-        add(builder().attribute("STRING20", Arrays.asList("s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20")));
-
-        add(builder().attribute("VAR.INFO.STRING", "s1"));
-        add(builder().attribute("VAR.INFO.STRING", Arrays.asList("s1", "s2")));
-        add(builder().attribute("VAR.INFO.STRING", Arrays.asList("s1", "s2", "s3")));
-        add(builder().attribute("VAR.INFO.STRING", null));
-
-        if ( ENABLE_GENOTYPE_TESTS ) {
-            addGenotypesToTestData();
-            addComplexGenotypesTest();
-        }
-
-        if ( ENABLE_A_AND_G_TESTS )
-            addGenotypesAndGTests();
-
-        if ( ENABLE_SYMBOLIC_ALLELE_TESTS )
-            addSymbolicAlleleTests();
-    }
-
-    private static void addSymbolicAlleleTests() {
-        // two tests to ensure that the end is computed correctly when there's (and not) an END field present
-        add(builder().alleles("N", "<VQSR>").start(10).stop(11).attribute("END", 11));
-        add(builder().alleles("N", "<VQSR>").start(10).stop(10));
-    }
-
-    private static void addGenotypesToTestData() {
-        final ArrayList<VariantContext> sites = new ArrayList<VariantContext>();
-
-        sites.add(builder().alleles("A").make());
-        sites.add(builder().alleles("A", "C", "T").make());
-        sites.add(builder().alleles("A", "AC").make());
-        sites.add(builder().alleles("A", "ACAGT").make());
-
-        for ( VariantContext site : sites ) {
-            addGenotypes(site);
-        }
-    }
-
-    private static void addGenotypeTests( final VariantContext site, Genotype ... genotypes ) {
-        // for each sites VC, we are going to add create two root genotypes.
-        // The first is the primary, and will be added to each new test
-        // The second is variable.  In some tests it's absent (testing 1 genotype), in others it is duplicated
-        // 1 once, 10, 100, or 1000 times to test scaling
-
-        final VariantContextBuilder builder = new VariantContextBuilder(site);
-
-        // add a single context
-        builder.genotypes(genotypes[0]);
-        add(builder);
-
-        if ( genotypes.length > 1 ) {
-            // add all
-            add(builder.genotypes(Arrays.asList(genotypes)));
-
-            // add all with the last replicated 10x and 100x times
-            for ( int nCopiesOfLast : Arrays.asList(10, 100, 1000) ) {
-                final GenotypesContext gc = new GenotypesContext();
-                final Genotype last = genotypes[genotypes.length-1];
-                for ( int i = 0; i < genotypes.length - 1; i++ )
-                    gc.add(genotypes[i]);
-                for ( int i = 0; i < nCopiesOfLast; i++ )
-                    gc.add(new GenotypeBuilder(last).name("copy" + i).make());
-                add(builder.genotypes(gc));
-            }
-        }
-    }
-
-    private static void addGenotypes( final VariantContext site) {
-        // test ref/ref
-        final Allele ref = site.getReference();
-        final Allele alt1 = site.getNAlleles() > 1 ? site.getAlternateAllele(0) : null;
-        final Genotype homRef = GenotypeBuilder.create("homRef", Arrays.asList(ref, ref));
-        addGenotypeTests(site, homRef);
-
-        if ( alt1 != null ) {
-            final Genotype het = GenotypeBuilder.create("het", Arrays.asList(ref, alt1));
-            final Genotype homVar = GenotypeBuilder.create("homVar", Arrays.asList(alt1, alt1));
-            addGenotypeTests(site, homRef, het);
-            addGenotypeTests(site, homRef, het, homVar);
-
-            // test no GT at all
-            addGenotypeTests(site, new GenotypeBuilder("noGT", new ArrayList<Allele>(0)).attribute("INT1", 10).make());
-
-            final List<Allele> noCall = Arrays.asList(Allele.NO_CALL, Allele.NO_CALL);
-
-            // ploidy
-            if ( ENABLE_PLOIDY_TESTS ) {
-                addGenotypeTests(site,
-                        GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
-                        GenotypeBuilder.create("hap", Arrays.asList(ref)));
-
-                addGenotypeTests(site,
-                        GenotypeBuilder.create("noCall", noCall),
-                        GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
-                        GenotypeBuilder.create("hap", Arrays.asList(ref)));
-
-                addGenotypeTests(site,
-                        GenotypeBuilder.create("noCall",  noCall),
-                        GenotypeBuilder.create("noCall2", noCall),
-                        GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
-                        GenotypeBuilder.create("hap", Arrays.asList(ref)));
-
-                addGenotypeTests(site,
-                        GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
-                        GenotypeBuilder.create("tet", Arrays.asList(ref, alt1, alt1)));
-
-                addGenotypeTests(site,
-                        GenotypeBuilder.create("noCall", noCall),
-                        GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
-                        GenotypeBuilder.create("tet", Arrays.asList(ref, alt1, alt1)));
-
-                addGenotypeTests(site,
-                        GenotypeBuilder.create("noCall", noCall),
-                        GenotypeBuilder.create("noCall2", noCall),
-                        GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
-                        GenotypeBuilder.create("tet", Arrays.asList(ref, alt1, alt1)));
-
-                addGenotypeTests(site,
-                        GenotypeBuilder.create("nocall", noCall),
-                        GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
-                        GenotypeBuilder.create("tet", Arrays.asList(ref, alt1, alt1)));
-            }
-
-
-            //
-            //
-            // TESTING PHASE
-            //
-            //
-            final Genotype gUnphased = new GenotypeBuilder("gUnphased", Arrays.asList(ref, alt1)).make();
-            final Genotype gPhased = new GenotypeBuilder("gPhased", Arrays.asList(ref, alt1)).phased(true).make();
-            final Genotype gPhased2 = new GenotypeBuilder("gPhased2", Arrays.asList(alt1, alt1)).phased(true).make();
-            final Genotype gPhased3 = new GenotypeBuilder("gPhased3", Arrays.asList(ref, ref)).phased(true).make();
-            final Genotype haploidNoPhase = new GenotypeBuilder("haploidNoPhase", Arrays.asList(ref)).make();
-            addGenotypeTests(site, gUnphased, gPhased);
-            addGenotypeTests(site, gUnphased, gPhased2);
-            addGenotypeTests(site, gUnphased, gPhased3);
-            addGenotypeTests(site, gPhased, gPhased2);
-            addGenotypeTests(site, gPhased, gPhased3);
-            addGenotypeTests(site, gPhased2, gPhased3);
-            addGenotypeTests(site, haploidNoPhase, gPhased);
-            addGenotypeTests(site, haploidNoPhase, gPhased2);
-            addGenotypeTests(site, haploidNoPhase, gPhased3);
-            addGenotypeTests(site, haploidNoPhase, gPhased, gPhased2);
-            addGenotypeTests(site, haploidNoPhase, gPhased, gPhased3);
-            addGenotypeTests(site, haploidNoPhase, gPhased2, gPhased3);
-            addGenotypeTests(site, haploidNoPhase, gPhased, gPhased2, gPhased3);
-
-            final Genotype gUnphasedTet = new GenotypeBuilder("gUnphasedTet", Arrays.asList(ref, alt1, ref, alt1)).make();
-            final Genotype gPhasedTet = new GenotypeBuilder("gPhasedTet", Arrays.asList(ref, alt1, alt1, alt1)).phased(true).make();
-            addGenotypeTests(site, gUnphasedTet, gPhasedTet);
-        }
-
-        if ( ENABLE_PL_TESTS ) {
-            if ( site.getNAlleles() == 2 ) {
-                // testing PLs
-                addGenotypeTests(site,
-                        GenotypeBuilder.create("g1", Arrays.asList(ref, ref), new double[]{0, -1, -2}),
-                        GenotypeBuilder.create("g2", Arrays.asList(ref, ref), new double[]{0, -2, -3}));
-
-                addGenotypeTests(site,
-                        GenotypeBuilder.create("g1", Arrays.asList(ref, ref), new double[]{-1, 0, -2}),
-                        GenotypeBuilder.create("g2", Arrays.asList(ref, ref), new double[]{0, -2, -3}));
-
-                addGenotypeTests(site,
-                        GenotypeBuilder.create("g1", Arrays.asList(ref, ref), new double[]{-1, 0, -2}),
-                        GenotypeBuilder.create("g2", Arrays.asList(ref, ref), new double[]{0, -2000, -1000}));
-
-                addGenotypeTests(site, // missing PLs
-                        GenotypeBuilder.create("g1", Arrays.asList(ref, ref), new double[]{-1, 0, -2}),
-                        GenotypeBuilder.create("g2", Arrays.asList(ref, ref)));
-            }
-            else if ( site.getNAlleles() == 3 ) {
-                // testing PLs
-                addGenotypeTests(site,
-                        GenotypeBuilder.create("g1", Arrays.asList(ref, ref), new double[]{0, -1, -2, -3, -4, -5}),
-                        GenotypeBuilder.create("g2", Arrays.asList(ref, ref), new double[]{0, -2, -3, -4, -5, -6}));
-            }
-        }
-
-        // test attributes
-        addGenotypeTests(site,
-                attr("g1", ref, "INT1", 1),
-                attr("g2", ref, "INT1", 2));
-        addGenotypeTests(site,
-                attr("g1", ref, "INT1", 1),
-                attr("g2", ref, "INT1"));
-        addGenotypeTests(site,
-                attr("g1", ref, "INT3", 1, 2, 3),
-                attr("g2", ref, "INT3", 4, 5, 6));
-        addGenotypeTests(site,
-                attr("g1", ref, "INT3", 1, 2, 3),
-                attr("g2", ref, "INT3"));
-
-        addGenotypeTests(site,
-                attr("g1", ref, "INT20", TWENTY_INTS),
-                attr("g2", ref, "INT20", TWENTY_INTS));
-
-
-        if (ENABLE_VARARRAY_TESTS) {
-            addGenotypeTests(site,
-                    attr("g1", ref, "INT.VAR", 1, 2, 3),
-                    attr("g2", ref, "INT.VAR", 4, 5),
-                    attr("g3", ref, "INT.VAR", 6));
-            addGenotypeTests(site,
-                    attr("g1", ref, "INT.VAR", 1, 2, 3),
-                    attr("g2", ref, "INT.VAR"),
-                    attr("g3", ref, "INT.VAR", 5));
-        }
-
-        addGenotypeTests(site,
-                attr("g1", ref, "FLOAT1", 1.0),
-                attr("g2", ref, "FLOAT1", 2.0));
-        addGenotypeTests(site,
-                attr("g1", ref, "FLOAT1", 1.0),
-                attr("g2", ref, "FLOAT1"));
-        addGenotypeTests(site,
-                attr("g1", ref, "FLOAT3", 1.0, 2.0, 3.0),
-                attr("g2", ref, "FLOAT3", 4.0, 5.0, 6.0));
-        addGenotypeTests(site,
-                attr("g1", ref, "FLOAT3", 1.0, 2.0, 3.0),
-                attr("g2", ref, "FLOAT3"));
-
-        if (ENABLE_VARIABLE_LENGTH_GENOTYPE_STRING_TESTS) {
-            //
-            //
-            // TESTING MULTIPLE SIZED LISTS IN THE GENOTYPE FIELD
-            //
-            //
-            addGenotypeTests(site,
-                    attr("g1", ref, "GS", Arrays.asList("S1", "S2")),
-                    attr("g2", ref, "GS", Arrays.asList("S3", "S4")));
-
-            addGenotypeTests(site, // g1 is missing the string, and g2 is missing FLOAT1
-                    attr("g1", ref, "FLOAT1", 1.0),
-                    attr("g2", ref, "GS", Arrays.asList("S3", "S4")));
-
-            // variable sized lists
-            addGenotypeTests(site,
-                    attr("g1", ref, "GV", "S1"),
-                    attr("g2", ref, "GV", Arrays.asList("S3", "S4")));
-
-            addGenotypeTests(site,
-                    attr("g1", ref, "GV", Arrays.asList("S1", "S2")),
-                    attr("g2", ref, "GV", Arrays.asList("S3", "S4", "S5")));
-
-            addGenotypeTests(site, // missing value in varlist of string
-                    attr("g1", ref, "FLOAT1", 1.0),
-                    attr("g2", ref, "GV", Arrays.asList("S3", "S4", "S5")));
-        }
-
-        //
-        //
-        // TESTING GENOTYPE FILTERS
-        //
-        //
-        addGenotypeTests(site,
-                new GenotypeBuilder("g1-x", Arrays.asList(ref, ref)).filters("X").make(),
-                new GenotypeBuilder("g2-x", Arrays.asList(ref, ref)).filters("X").make());
-        addGenotypeTests(site,
-                new GenotypeBuilder("g1-unft", Arrays.asList(ref, ref)).unfiltered().make(),
-                new GenotypeBuilder("g2-x", Arrays.asList(ref, ref)).filters("X").make());
-        addGenotypeTests(site,
-                new GenotypeBuilder("g1-unft", Arrays.asList(ref, ref)).unfiltered().make(),
-                new GenotypeBuilder("g2-xy", Arrays.asList(ref, ref)).filters("X", "Y").make());
-        addGenotypeTests(site,
-                new GenotypeBuilder("g1-unft", Arrays.asList(ref, ref)).unfiltered().make(),
-                new GenotypeBuilder("g2-x", Arrays.asList(ref, ref)).filters("X").make(),
-                new GenotypeBuilder("g3-xy", Arrays.asList(ref, ref)).filters("X", "Y").make());
-    }
-
-    private static void addGenotypesAndGTests() {
-//        for ( final int ploidy : Arrays.asList(2)) {
-        for ( final int ploidy : Arrays.asList(1, 2, 3, 4, 5)) {
-            final List<List<String>> alleleCombinations =
-                    Arrays.asList(
-                            Arrays.asList("A"),
-                            Arrays.asList("A", "C"),
-                            Arrays.asList("A", "C", "G"),
-                            Arrays.asList("A", "C", "G", "T"));
-
-            for ( final List<String> alleles : alleleCombinations ) {
-                final VariantContextBuilder vcb = builder().alleles(alleles);
-                final VariantContext site = vcb.make();
-                final int nAlleles = site.getNAlleles();
-                final Allele ref = site.getReference();
-
-                // base genotype is ref/.../ref up to ploidy
-                final List<Allele> baseGenotype = new ArrayList<Allele>(ploidy);
-                for ( int i = 0; i < ploidy; i++) baseGenotype.add(ref);
-                final int nPLs = GenotypeLikelihoods.numLikelihoods(nAlleles, ploidy);
-
-                // ada is 0, 1, ..., nAlleles - 1
-                final List<Integer> ada = new ArrayList<Integer>(nAlleles);
-                for ( int i = 0; i < nAlleles - 1; i++ ) ada.add(i);
-
-                // pl is 0, 1, ..., up to nPLs (complex calc of nAlleles and ploidy)
-                final int[] pl = new int[nPLs];
-                for ( int i = 0; i < pl.length; i++ ) pl[i] = i;
-
-                final GenotypeBuilder gb = new GenotypeBuilder("ADA_PL_SAMPLE");
-                gb.alleles(baseGenotype);
-                gb.PL(pl);
-                gb.attribute("ADA", nAlleles == 2 ? ada.get(0) : ada);
-                vcb.genotypes(gb.make());
-
-                add(vcb);
-            }
-        }
-    }
-
-    private static Genotype attr(final String name, final Allele ref, final String key, final Object ... value) {
-        if ( value.length == 0 )
-            return GenotypeBuilder.create(name, Arrays.asList(ref, ref));
-        else {
-            final Object toAdd = value.length == 1 ? value[0] : Arrays.asList(value);
-            return new GenotypeBuilder(name, Arrays.asList(ref, ref)).attribute(key, toAdd).make();
-        }
-    }
-
-    public static List<VariantContextTestData> generateSiteTests() {
-        return TEST_DATAs;
-    }
-
-    public static void testReaderWriterWithMissingGenotypes(final VariantContextIOTest tester, final VariantContextTestData data) throws IOException {
-        final int nSamples = data.header.getNGenotypeSamples();
-        if ( nSamples > 2 ) {
-            for ( final VariantContext vc : data.vcs )
-                if ( vc.isSymbolic() )
-                    // cannot handle symbolic alleles because they may be weird non-call VCFs
-                    return;
-
-            final File tmpFile = File.createTempFile("testReaderWriter", tester.getExtension());
-            tmpFile.deleteOnExit();
-            Tribble.indexFile(tmpFile).deleteOnExit();
-
-            // write expected to disk
-            final EnumSet<Options> options = EnumSet.of(Options.INDEX_ON_THE_FLY);
-            final VariantContextWriter writer = tester.makeWriter(tmpFile, options);
-
-            final Set<String> samplesInVCF = new HashSet<String>(data.header.getGenotypeSamples());
-            final List<String> missingSamples = Arrays.asList("MISSING1", "MISSING2");
-            final List<String> allSamples = new ArrayList<String>(missingSamples);
-            allSamples.addAll(samplesInVCF);
-
-            final VCFHeader header = new VCFHeader(data.header.getMetaDataInInputOrder(), allSamples);
-            writeVCsToFile(writer, header, data.vcs);
-
-            // ensure writing of expected == actual
-            final VariantContextContainer p = tester.readAllVCs(tmpFile);
-            final Iterable<VariantContext> actual = p.getVCs();
-
-            int i = 0;
-            for ( final VariantContext readVC : actual ) {
-                if ( readVC == null ) continue; // sometimes we read null records...
-                final VariantContext expected = data.vcs.get(i++);
-                for ( final Genotype g : readVC.getGenotypes() ) {
-                    Assert.assertTrue(allSamples.contains(g.getSampleName()));
-                    if ( samplesInVCF.contains(g.getSampleName()) ) {
-                        assertEquals(g, expected.getGenotype(g.getSampleName()));
-                    } else {
-                        // missing
-                        Assert.assertTrue(g.isNoCall());
-                    }
-                }
-            }
-
-        }
-    }
-
-    public static void testReaderWriter(final VariantContextIOTest tester, final VariantContextTestData data) throws IOException {
-        testReaderWriter(tester, data.header, data.vcs, data.vcs, true);
-    }
-
-    public static void testReaderWriter(final VariantContextIOTest tester,
-                                        final VCFHeader header,
-                                        final List<VariantContext> expected,
-                                        final Iterable<VariantContext> vcs,
-                                        final boolean recurse) throws IOException {
-        final File tmpFile = File.createTempFile("testReaderWriter", tester.getExtension());
-        tmpFile.deleteOnExit();
-        Tribble.indexFile(tmpFile).deleteOnExit();
-
-        // write expected to disk
-        final EnumSet<Options> options = EnumSet.of(Options.INDEX_ON_THE_FLY);
-        final VariantContextWriter writer = tester.makeWriter(tmpFile, options);
-        writeVCsToFile(writer, header, vcs);
-
-        // ensure writing of expected == actual
-        final VariantContextContainer p = tester.readAllVCs(tmpFile);
-        final Iterable<VariantContext> actual = p.getVCs();
-        assertEquals(actual, expected);
-
-        if ( recurse ) {
-            // if we are doing a recursive test, grab a fresh iterator over the written values
-            final Iterable<VariantContext> read = tester.readAllVCs(tmpFile).getVCs();
-            testReaderWriter(tester, p.getHeader(), expected, read, false);
-        }
-    }
-
-    private static void writeVCsToFile(final VariantContextWriter writer, final VCFHeader header, final Iterable<VariantContext> vcs) {
-        // write
-        writer.writeHeader(header);
-        for ( VariantContext vc : vcs )
-            if (vc != null)
-                writer.add(vc);
-        writer.close();
-    }
-
-    public static abstract class VCIterable<SOURCE> implements Iterable<VariantContext>, Iterator<VariantContext> {
-        final FeatureCodec<VariantContext, SOURCE> codec;
-        final VCFHeader header;
-
-        public VCIterable(final FeatureCodec<VariantContext, SOURCE> codec, final VCFHeader header) {
-            this.codec = codec;
-            this.header = header;
-        }
-
-        @Override
-        public Iterator<VariantContext> iterator() {
-            return this;
-        }
-
-        @Override
-        public abstract boolean hasNext();
-
-        public abstract SOURCE nextSource();
-        
-        @Override
-        public VariantContext next() {
-            try {
-                final VariantContext vc = codec.decode(nextSource());
-                return vc == null ? null : vc.fullyDecode(header, false);
-            } catch ( IOException e ) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        @Override
-        public void remove() { }
-    }
-
-    public static VariantContextContainer readAllVCs(final File input, final BCF2Codec codec) throws IOException {
-        PositionalBufferedStream headerPbs = new PositionalBufferedStream(new FileInputStream(input));
-        FeatureCodecHeader header = codec.readHeader(headerPbs);
-        headerPbs.close();
-
-        final PositionalBufferedStream pbs = new PositionalBufferedStream(new FileInputStream(input));
-        pbs.skip(header.getHeaderEnd());
-
-        final VCFHeader vcfHeader = (VCFHeader)header.getHeaderValue();
-        return new VariantContextTestProvider.VariantContextContainer(vcfHeader, new VariantContextTestProvider.VCIterable(codec, vcfHeader) {
-            @Override
-            public boolean hasNext() {
-                try {
-                    return !pbs.isDone();
-                } catch (IOException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-
-            @Override
-            public Object nextSource() {
-                return pbs;
-            }
-        });
-    }
-
-    public static VariantContextContainer readAllVCs(final File input, final VCFCodec codec) throws FileNotFoundException {
-        final LineIterator lineIterator = new LineIteratorImpl(new SynchronousLineReader(new BufferedInputStream(new FileInputStream(input))));
-        final VCFHeader vcfHeader = (VCFHeader) codec.readActualHeader(lineIterator);
-        return new VariantContextTestProvider.VariantContextContainer(vcfHeader, new VariantContextTestProvider.VCIterable<LineIterator>(codec, vcfHeader) {
-            @Override
-            public boolean hasNext() {
-                return lineIterator.hasNext();
-            }
-
-            @Override
-            public LineIterator nextSource() {
-                return lineIterator;
-            }
-        });
-    }
-    
-    public static void assertVCFandBCFFilesAreTheSame(final File vcfFile, final File bcfFile) throws IOException {
-        final VariantContextContainer vcfData = readAllVCs(vcfFile, new VCFCodec());
-        final VariantContextContainer bcfData = readAllVCs(bcfFile, new BCF2Codec());
-        assertEquals(bcfData.getHeader(), vcfData.getHeader());
-        assertEquals(bcfData.getVCs(), vcfData.getVCs());
-    }
-
-    public static void assertEquals(final Iterable<VariantContext> actual, final Iterable<VariantContext> expected) {
-        final Iterator<VariantContext> actualIT = actual.iterator();
-        final Iterator<VariantContext> expectedIT = expected.iterator();
-
-        while ( expectedIT.hasNext() ) {
-            final VariantContext expectedVC = expectedIT.next();
-            if ( expectedVC == null )
-                continue;
-
-            VariantContext actualVC;
-            do {
-                Assert.assertTrue(actualIT.hasNext(), "Too few records found in actual");
-                actualVC = actualIT.next();
-            } while ( actualIT.hasNext() && actualVC == null );
-
-            if ( actualVC == null )
-                Assert.fail("Too few records in actual");
-
-            assertEquals(actualVC, expectedVC);
-        }
-        Assert.assertTrue(! actualIT.hasNext(), "Too many records found in actual");
-    }
-
-    /**
-     * Assert that two variant contexts are actually equal
-     * @param actual
-     * @param expected
-     */
-    public static void assertEquals( final VariantContext actual, final VariantContext expected ) {
-        Assert.assertNotNull(actual, "VariantContext expected not null");
-        Assert.assertEquals(actual.getContig(), expected.getContig(), "chr");
-        Assert.assertEquals(actual.getStart(), expected.getStart(), "start");
-        Assert.assertEquals(actual.getEnd(), expected.getEnd(), "end");
-        Assert.assertEquals(actual.getID(), expected.getID(), "id");
-        Assert.assertEquals(actual.getAlleles(), expected.getAlleles(), "alleles for " + expected + " vs " + actual);
-
-        assertAttributesEquals(actual.getAttributes(), expected.getAttributes());
-        Assert.assertEquals(actual.filtersWereApplied(), expected.filtersWereApplied(), "filtersWereApplied");
-        Assert.assertEquals(actual.isFiltered(), expected.isFiltered(), "isFiltered");
-        VariantBaseTest.assertEqualsSet(actual.getFilters(), expected.getFilters(), "filters");
-        VariantBaseTest.assertEqualsDoubleSmart(actual.getPhredScaledQual(), expected.getPhredScaledQual());
-
-        Assert.assertEquals(actual.hasGenotypes(), expected.hasGenotypes(), "hasGenotypes");
-        if ( expected.hasGenotypes() ) {
-            VariantBaseTest.assertEqualsSet(actual.getSampleNames(), expected.getSampleNames(), "sample names set");
-            Assert.assertEquals(actual.getSampleNamesOrderedByName(), expected.getSampleNamesOrderedByName(), "sample names");
-            final Set<String> samples = expected.getSampleNames();
-            for ( final String sample : samples ) {
-                assertEquals(actual.getGenotype(sample), expected.getGenotype(sample));
-            }
-        }
-    }
-
-    public static void assertEquals(final Genotype actual, final Genotype expected) {
-        Assert.assertEquals(actual.getSampleName(), expected.getSampleName(), "Genotype names");
-        Assert.assertEquals(actual.getAlleles(), expected.getAlleles(), "Genotype alleles");
-        Assert.assertEquals(actual.getGenotypeString(), expected.getGenotypeString(), "Genotype string");
-        Assert.assertEquals(actual.getType(), expected.getType(), "Genotype type");
-
-        // filters are the same
-        Assert.assertEquals(actual.getFilters(), expected.getFilters(), "Genotype fields");
-        Assert.assertEquals(actual.isFiltered(), expected.isFiltered(), "Genotype isFiltered");
-
-        // inline attributes
-        Assert.assertEquals(actual.getDP(), expected.getDP(), "Genotype dp");
-        Assert.assertTrue(Arrays.equals(actual.getAD(), expected.getAD()));
-        Assert.assertEquals(actual.getGQ(), expected.getGQ(), "Genotype gq");
-        Assert.assertEquals(actual.hasPL(), expected.hasPL(), "Genotype hasPL");
-        Assert.assertEquals(actual.hasAD(), expected.hasAD(), "Genotype hasAD");
-        Assert.assertEquals(actual.hasGQ(), expected.hasGQ(), "Genotype hasGQ");
-        Assert.assertEquals(actual.hasDP(), expected.hasDP(), "Genotype hasDP");
-
-        Assert.assertEquals(actual.hasLikelihoods(), expected.hasLikelihoods(), "Genotype haslikelihoods");
-        Assert.assertEquals(actual.getLikelihoodsString(), expected.getLikelihoodsString(), "Genotype getlikelihoodsString");
-        Assert.assertEquals(actual.getLikelihoods(), expected.getLikelihoods(), "Genotype getLikelihoods");
-        Assert.assertTrue(Arrays.equals(actual.getPL(), expected.getPL()));
-
-        Assert.assertEquals(actual.getGQ(), expected.getGQ(), "Genotype phredScaledQual");
-        assertAttributesEquals(actual.getExtendedAttributes(), expected.getExtendedAttributes());
-        Assert.assertEquals(actual.isPhased(), expected.isPhased(), "Genotype isPhased");
-        Assert.assertEquals(actual.getPloidy(), expected.getPloidy(), "Genotype getPloidy");
-    }
-
-    private static void assertAttributesEquals(final Map<String, Object> actual, Map<String, Object> expected) {
-        final Set<String> expectedKeys = new HashSet<String>(expected.keySet());
-
-        for ( final Map.Entry<String, Object> act : actual.entrySet() ) {
-            final Object actualValue = act.getValue();
-            if ( expected.containsKey(act.getKey()) && expected.get(act.getKey()) != null ) {
-                final Object expectedValue = expected.get(act.getKey());
-                if ( expectedValue instanceof List ) {
-                    final List<Object> expectedList = (List<Object>)expectedValue;
-                    Assert.assertTrue(actualValue instanceof List, act.getKey() + " should be a list but isn't");
-                    final List<Object> actualList = (List<Object>)actualValue;
-                    Assert.assertEquals(actualList.size(), expectedList.size(), act.getKey() + " size");
-                    for ( int i = 0; i < expectedList.size(); i++ )
-                        assertAttributeEquals(act.getKey(), actualList.get(i), expectedList.get(i));
-                } else
-                    assertAttributeEquals(act.getKey(), actualValue, expectedValue);
-            } else {
-                // it's ok to have a binding in x -> null that's absent in y
-                Assert.assertNull(actualValue, act.getKey() + " present in one but not in the other");
-            }
-            expectedKeys.remove(act.getKey());
-        }
-
-        // now expectedKeys contains only the keys found in expected but not in actual,
-        // and they must all be null
-        for ( final String missingExpected : expectedKeys ) {
-            final Object value = expected.get(missingExpected);
-            Assert.assertTrue(isMissing(value), "Attribute " + missingExpected + " missing in one but not in other" );
-        }
-    }
-
-    private static final boolean isMissing(final Object value) {
-        if ( value == null ) return true;
-        else if ( value.equals(VCFConstants.MISSING_VALUE_v4) ) return true;
-        else if ( value instanceof List ) {
-            // handles the case where all elements are null or the list is empty
-            for ( final Object elt : (List)value)
-                if ( elt != null )
-                    return false;
-            return true;
-        } else
-            return false;
-    }
-
-    private static void assertAttributeEquals(final String key, final Object actual, final Object expected) {
-        if ( expected instanceof Double ) {
-            // must be very tolerant because doubles are being rounded to 2 sig figs
-            VariantBaseTest.assertEqualsDoubleSmart(actual, (Double)expected, 1e-2);
-        } else
-            Assert.assertEquals(actual, expected, "Attribute " + key);
-    }
-
-    public static void addComplexGenotypesTest() {
-        final List<Allele> allAlleles = Arrays.asList(
-                Allele.create("A", true),
-                Allele.create("C", false),
-                Allele.create("G", false));
-
-        for ( int nAlleles : Arrays.asList(2, 3) ) {
-            for ( int highestPloidy : Arrays.asList(1, 2, 3) ) {
-                // site alleles
-                final List<Allele> siteAlleles = allAlleles.subList(0, nAlleles);
-
-                // possible alleles for genotypes
-                final List<Allele> possibleGenotypeAlleles = new ArrayList<Allele>(siteAlleles);
-                possibleGenotypeAlleles.add(Allele.NO_CALL);
-
-                // there are n^ploidy possible genotypes
-                final List<List<Allele>> possibleGenotypes = makeAllGenotypes(possibleGenotypeAlleles, highestPloidy);
-                final int nPossibleGenotypes = possibleGenotypes.size();
-
-                VariantContextBuilder vb = new VariantContextBuilder("unittest", "1", 1, 1, siteAlleles);
-
-                // first test -- create n copies of each genotype
-                for ( int i = 0; i < nPossibleGenotypes; i++ ) {
-                    final List<Genotype> samples = new ArrayList<Genotype>(3);
-                    samples.add(GenotypeBuilder.create("sample" + i, possibleGenotypes.get(i)));
-                    add(vb.genotypes(samples));
-                }
-
-                // second test -- create one sample with each genotype
-                {
-                    final List<Genotype> samples = new ArrayList<Genotype>(nPossibleGenotypes);
-                    for ( int i = 0; i < nPossibleGenotypes; i++ ) {
-                        samples.add(GenotypeBuilder.create("sample" + i, possibleGenotypes.get(i)));
-                    }
-                    add(vb.genotypes(samples));
-                }
-
-                // test mixed ploidy
-                for ( int i = 0; i < nPossibleGenotypes; i++ ) {
-                    for ( int ploidy = 1; ploidy < highestPloidy; ploidy++ ) {
-                        final List<Genotype> samples = new ArrayList<Genotype>(highestPloidy);
-                        final List<Allele> genotype = possibleGenotypes.get(i).subList(0, ploidy);
-                        samples.add(GenotypeBuilder.create("sample" + i, genotype));
-                        add(vb.genotypes(samples));
-                    }
-                }
-            }
-        }
-    }
-
-    private static List<List<Allele>> makeAllGenotypes(final List<Allele> alleles, final int highestPloidy) {
-        return GeneralUtils.makePermutations(alleles, highestPloidy, true);
-    }
-
-    public static void assertEquals(final VCFHeader actual, final VCFHeader expected) {
-        Assert.assertEquals(actual.getMetaDataInSortedOrder().size(), expected.getMetaDataInSortedOrder().size(), "No VCF header lines");
-
-        // for some reason set.equals() is returning false but all paired elements are .equals().  Perhaps compare to is busted?
-        //Assert.assertEquals(actual.getMetaDataInInputOrder(), expected.getMetaDataInInputOrder());
-        final List<VCFHeaderLine> actualLines = new ArrayList<VCFHeaderLine>(actual.getMetaDataInSortedOrder());
-        final List<VCFHeaderLine> expectedLines = new ArrayList<VCFHeaderLine>(expected.getMetaDataInSortedOrder());
-        for ( int i = 0; i < actualLines.size(); i++ ) {
-            Assert.assertEquals(actualLines.get(i), expectedLines.get(i), "VCF header lines");
-        }
-    }
-
-    public static void main( String argv[] ) {
-        final File variants1 = new File(argv[0]);
-        final File variants2 = new File(argv[1]);
-        try {
-            VariantContextTestProvider.assertVCFandBCFFilesAreTheSame(variants1, variants2);
-        } catch ( IOException e ) {
-            throw new RuntimeException(e);
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/VariantContextUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/VariantContextUnitTest.java
deleted file mode 100644
index 14056f8..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/VariantContextUnitTest.java
+++ /dev/null
@@ -1,1621 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-
-// the imports for unit testing.
-
-import htsjdk.samtools.util.TestUtil;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.bcf2.BCF2Codec;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFFileReader;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-import java.io.File;
-import java.util.*;
-
-
-public class VariantContextUnitTest extends VariantBaseTest {
-    Allele A, Aref, C, T, Tref;
-    Allele del, delRef, ATC, ATCref;
-
-    // A [ref] / T at 10
-    String snpLoc = "chr1";
-    int snpLocStart = 10;
-    int snpLocStop = 10;
-
-    // - / ATC [ref] from 20-22
-    String delLoc = "chr1";
-    int delLocStart = 20;
-    int delLocStop = 22;
-
-    // - [ref] / ATC from 20-20
-    String insLoc = "chr1";
-    int insLocStart = 20;
-    int insLocStop = 20;
-
-    VariantContextBuilder basicBuilder, snpBuilder, insBuilder;
-
-    @BeforeSuite
-    public void before() {
-        del = Allele.create("A");
-        delRef = Allele.create("A", true);
-
-        A = Allele.create("A");
-        C = Allele.create("C");
-        Aref = Allele.create("A", true);
-        T = Allele.create("T");
-        Tref = Allele.create("T", true);
-
-        ATC = Allele.create("ATC");
-        ATCref = Allele.create("ATC", true);
-    }
-
-    @BeforeMethod
-    public void beforeTest() {
-        basicBuilder = new VariantContextBuilder("test", snpLoc,snpLocStart, snpLocStop, Arrays.asList(Aref, T));
-        snpBuilder = new VariantContextBuilder("test", snpLoc,snpLocStart, snpLocStop, Arrays.asList(Aref, T));
-        insBuilder = new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(delRef, ATC));
-    }
-
-    @Test
-    public void testDetermineTypes() {
-        Allele ACref = Allele.create("AC", true);
-        Allele AC = Allele.create("AC");
-        Allele AT = Allele.create("AT");
-        Allele C = Allele.create("C");
-        Allele CAT = Allele.create("CAT");
-        Allele TAref = Allele.create("TA", true);
-        Allele TA = Allele.create("TA");
-        Allele TC = Allele.create("TC");
-        Allele symbolic = Allele.create("<FOO>");
-
-        // test REF
-        List<Allele> alleles = Arrays.asList(Tref);
-        VariantContext vc = snpBuilder.alleles(alleles).stop(snpLocStop).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.NO_VARIATION);
-
-        // test SNPs
-        alleles = Arrays.asList(Tref, A);
-        vc = snpBuilder.alleles(alleles).stop(snpLocStop).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.SNP);
-
-        alleles = Arrays.asList(Tref, A, C);
-        vc = snpBuilder.alleles(alleles).stop(snpLocStop).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.SNP);
-
-        // test MNPs
-        alleles = Arrays.asList(ACref, TA);
-        vc = snpBuilder.alleles(alleles).stop(snpLocStop+1).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.MNP);
-
-        alleles = Arrays.asList(ATCref, CAT, Allele.create("GGG"));
-        vc = basicBuilder.alleles(alleles).stop(snpLocStop+2).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.MNP);
-
-        // test INDELs
-        alleles = Arrays.asList(Aref, ATC);
-        vc = basicBuilder.alleles(alleles).stop(snpLocStop).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-
-        alleles = Arrays.asList(ATCref, A);
-        vc = basicBuilder.alleles(alleles).stop(snpLocStop+2).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-
-        alleles = Arrays.asList(Tref, TA, TC);
-        vc = basicBuilder.alleles(alleles).stop(snpLocStop).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-
-        alleles = Arrays.asList(ATCref, A, AC);
-        vc = basicBuilder.alleles(alleles).stop(snpLocStop+2).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-
-        alleles = Arrays.asList(ATCref, A, Allele.create("ATCTC"));
-        vc = basicBuilder.alleles(alleles).stop(snpLocStop+2).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-
-        // test MIXED
-        alleles = Arrays.asList(TAref, T, TC);
-        vc = basicBuilder.alleles(alleles).stop(snpLocStop+1).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.MIXED);
-
-        alleles = Arrays.asList(TAref, T, AC);
-        vc = basicBuilder.alleles(alleles).stop(snpLocStop+1).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.MIXED);
-
-        alleles = Arrays.asList(ACref, ATC, AT);
-        vc = basicBuilder.alleles(alleles).stop(snpLocStop+1).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.MIXED);
-
-        alleles = Arrays.asList(Aref, T, symbolic);
-        vc = basicBuilder.alleles(alleles).stop(snpLocStop).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.MIXED);
-
-        // test SYMBOLIC
-        alleles = Arrays.asList(Tref, symbolic);
-        vc = basicBuilder.alleles(alleles).stop(snpLocStop).make();
-        Assert.assertEquals(vc.getType(), VariantContext.Type.SYMBOLIC);
-    }
-
-    @Test
-    public void testMultipleSNPAlleleOrdering() {
-        final List<Allele> allelesNaturalOrder = Arrays.asList(Aref, C, T);
-        final List<Allele> allelesUnnaturalOrder = Arrays.asList(Aref, T, C);
-        VariantContext naturalVC = snpBuilder.alleles(allelesNaturalOrder).make();
-        VariantContext unnaturalVC = snpBuilder.alleles(allelesUnnaturalOrder).make();
-        Assert.assertEquals(new ArrayList<Allele>(naturalVC.getAlleles()), allelesNaturalOrder);
-        Assert.assertEquals(new ArrayList<Allele>(unnaturalVC.getAlleles()), allelesUnnaturalOrder);
-    }
-
-    @Test
-    public void testCreatingSNPVariantContext() {
-
-        List<Allele> alleles = Arrays.asList(Aref, T);
-        VariantContext vc = snpBuilder.alleles(alleles).make();
-
-        Assert.assertEquals(vc.getContig(), snpLoc);
-        Assert.assertEquals(vc.getStart(), snpLocStart);
-        Assert.assertEquals(vc.getEnd(), snpLocStop);
-        Assert.assertEquals(vc.getType(), VariantContext.Type.SNP);
-        Assert.assertTrue(vc.isSNP());
-        Assert.assertFalse(vc.isIndel());
-        Assert.assertFalse(vc.isSimpleInsertion());
-        Assert.assertFalse(vc.isSimpleDeletion());
-        Assert.assertFalse(vc.isSimpleIndel());
-        Assert.assertFalse(vc.isMixed());
-        Assert.assertTrue(vc.isBiallelic());
-        Assert.assertEquals(vc.getNAlleles(), 2);
-
-        Assert.assertEquals(vc.getReference(), Aref);
-        Assert.assertEquals(vc.getAlleles().size(), 2);
-        Assert.assertEquals(vc.getAlternateAlleles().size(), 1);
-        Assert.assertEquals(vc.getAlternateAllele(0), T);
-
-        Assert.assertFalse(vc.hasGenotypes());
-
-        Assert.assertEquals(vc.getSampleNames().size(), 0);
-    }
-
-    @Test
-    public void testCreatingRefVariantContext() {
-        List<Allele> alleles = Arrays.asList(Aref);
-        VariantContext vc = snpBuilder.alleles(alleles).make();
-
-        Assert.assertEquals(vc.getContig(), snpLoc);
-        Assert.assertEquals(vc.getStart(), snpLocStart);
-        Assert.assertEquals(vc.getEnd(), snpLocStop);
-        Assert.assertEquals(VariantContext.Type.NO_VARIATION, vc.getType());
-        Assert.assertFalse(vc.isSNP());
-        Assert.assertFalse(vc.isIndel());
-        Assert.assertFalse(vc.isSimpleInsertion());
-        Assert.assertFalse(vc.isSimpleDeletion());
-        Assert.assertFalse(vc.isSimpleIndel());
-        Assert.assertFalse(vc.isMixed());
-        Assert.assertFalse(vc.isBiallelic());
-        Assert.assertEquals(vc.getNAlleles(), 1);
-
-        Assert.assertEquals(vc.getReference(), Aref);
-        Assert.assertEquals(vc.getAlleles().size(), 1);
-        Assert.assertEquals(vc.getAlternateAlleles().size(), 0);
-        //Assert.assertEquals(vc.getAlternateAllele(0), T);
-
-        Assert.assertFalse(vc.hasGenotypes());
-        Assert.assertEquals(vc.getSampleNames().size(), 0);
-    }
-
-    @Test
-    public void testCreatingDeletionVariantContext() {
-        List<Allele> alleles = Arrays.asList(ATCref, del);
-        VariantContext vc = new VariantContextBuilder("test", delLoc, delLocStart, delLocStop, alleles).make();
-
-        Assert.assertEquals(vc.getContig(), delLoc);
-        Assert.assertEquals(vc.getStart(), delLocStart);
-        Assert.assertEquals(vc.getEnd(), delLocStop);
-        Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-        Assert.assertFalse(vc.isSNP());
-        Assert.assertTrue(vc.isIndel());
-        Assert.assertFalse(vc.isSimpleInsertion());
-        Assert.assertTrue(vc.isSimpleDeletion());
-        Assert.assertTrue(vc.isSimpleIndel());
-        Assert.assertFalse(vc.isMixed());
-        Assert.assertTrue(vc.isBiallelic());
-        Assert.assertEquals(vc.getNAlleles(), 2);
-
-        Assert.assertEquals(vc.getReference(), ATCref);
-        Assert.assertEquals(vc.getAlleles().size(), 2);
-        Assert.assertEquals(vc.getAlternateAlleles().size(), 1);
-        Assert.assertEquals(vc.getAlternateAllele(0), del);
-
-        Assert.assertFalse(vc.hasGenotypes());
-
-        Assert.assertEquals(vc.getSampleNames().size(), 0);
-    }
-
-    @Test
-    public void testCreatingComplexSubstitutionVariantContext() {
-        List<Allele> alleles = Arrays.asList(Tref, ATC);
-        VariantContext vc = new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, alleles).make();
-
-        Assert.assertEquals(vc.getContig(), insLoc);
-        Assert.assertEquals(vc.getStart(), insLocStart);
-        Assert.assertEquals(vc.getEnd(), insLocStop);
-        Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-        Assert.assertFalse(vc.isSNP());
-        Assert.assertTrue(vc.isIndel());
-        Assert.assertFalse(vc.isSimpleInsertion());
-        Assert.assertFalse(vc.isSimpleDeletion());
-        Assert.assertFalse(vc.isSimpleIndel());
-        Assert.assertFalse(vc.isMixed());
-        Assert.assertTrue(vc.isBiallelic());
-        Assert.assertEquals(vc.getNAlleles(), 2);
-
-        Assert.assertEquals(vc.getReference(), Tref);
-        Assert.assertEquals(vc.getAlleles().size(), 2);
-        Assert.assertEquals(vc.getAlternateAlleles().size(), 1);
-        Assert.assertEquals(vc.getAlternateAllele(0), ATC);
-
-        Assert.assertFalse(vc.hasGenotypes());
-
-        Assert.assertEquals(vc.getSampleNames().size(), 0);
-    }
-
-    @Test
-    public void testMatchingAlleles() {
-        List<Allele> alleles = Arrays.asList(ATCref, del);
-        VariantContext vc = new VariantContextBuilder("test", delLoc, delLocStart, delLocStop, alleles).make();
-        VariantContext vc2 = new VariantContextBuilder("test2", delLoc, delLocStart+12, delLocStop+12, alleles).make();
-
-        Assert.assertTrue(vc.hasSameAllelesAs(vc2));
-        Assert.assertTrue(vc.hasSameAlternateAllelesAs(vc2));
-    }
-
-    @Test
-    public void testCreatingInsertionVariantContext() {
-        List<Allele> alleles = Arrays.asList(delRef, ATC);
-        VariantContext vc = insBuilder.alleles(alleles).make();
-
-        Assert.assertEquals(vc.getContig(), insLoc);
-        Assert.assertEquals(vc.getStart(), insLocStart);
-        Assert.assertEquals(vc.getEnd(), insLocStop);
-        Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-        Assert.assertFalse(vc.isSNP());
-        Assert.assertTrue(vc.isIndel());
-        Assert.assertTrue(vc.isSimpleInsertion());
-        Assert.assertFalse(vc.isSimpleDeletion());
-        Assert.assertTrue(vc.isSimpleIndel());
-        Assert.assertFalse(vc.isMixed());
-        Assert.assertTrue(vc.isBiallelic());
-        Assert.assertEquals(vc.getNAlleles(), 2);
-
-        Assert.assertEquals(vc.getReference(), delRef);
-        Assert.assertEquals(vc.getAlleles().size(), 2);
-        Assert.assertEquals(vc.getAlternateAlleles().size(), 1);
-        Assert.assertEquals(vc.getAlternateAllele(0), ATC);
-        Assert.assertFalse(vc.hasGenotypes());
-
-        Assert.assertEquals(vc.getSampleNames().size(), 0);
-    }
-
-    @Test
-    public void testCreatingPartiallyCalledGenotype() {
-        List<Allele> alleles = Arrays.asList(Aref, C);
-        Genotype g = GenotypeBuilder.create("foo", Arrays.asList(C, Allele.NO_CALL));
-        VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g).make();
-
-        Assert.assertTrue(vc.isSNP());
-        Assert.assertEquals(vc.getNAlleles(), 2);
-        Assert.assertTrue(vc.hasGenotypes());
-        Assert.assertFalse(vc.isMonomorphicInSamples());
-        Assert.assertTrue(vc.isPolymorphicInSamples());
-        Assert.assertEquals(vc.getGenotype("foo"), g);
-        Assert.assertEquals(vc.getCalledChrCount(), 1); // we only have 1 called chromosomes, we exclude the NO_CALL one isn't called
-        Assert.assertEquals(vc.getCalledChrCount(Aref), 0);
-        Assert.assertEquals(vc.getCalledChrCount(C), 1);
-        Assert.assertFalse(vc.getGenotype("foo").isHet());
-        Assert.assertFalse(vc.getGenotype("foo").isHom());
-        Assert.assertFalse(vc.getGenotype("foo").isNoCall());
-        Assert.assertFalse(vc.getGenotype("foo").isHom());
-        Assert.assertTrue(vc.getGenotype("foo").isMixed());
-        Assert.assertEquals(vc.getGenotype("foo").getType(), GenotypeType.MIXED);
-    }
-
-    @Test (expectedExceptions = Exception.class)
-    public void testBadConstructorArgs1() {
-        new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(delRef, ATCref)).make();
-    }
-
-    @Test (expectedExceptions = Exception.class)
-    public void testBadConstructorArgs2() {
-        new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(delRef, del)).make();
-    }
-
-    @Test (expectedExceptions = Exception.class)
-    public void testBadConstructorArgs3() {
-        new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(del)).make();
-    }
-
-    @Test (expectedExceptions = Throwable.class)
-    public void testBadConstructorArgs4() {
-        new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Collections.<Allele>emptyList()).make();
-    }
-
-    @Test (expectedExceptions = Exception.class)
-    public void testBadConstructorArgsDuplicateAlleles1() {
-        new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(Aref, T, T)).make();
-    }
-
-    @Test (expectedExceptions = Exception.class)
-    public void testBadConstructorArgsDuplicateAlleles2() {
-        new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(Aref, A)).make();
-    }
-
-    @Test (expectedExceptions = Throwable.class)
-    public void testBadLoc1() {
-        List<Allele> alleles = Arrays.asList(Aref, T, del);
-        new VariantContextBuilder("test", delLoc, delLocStart, delLocStop, alleles).make();
-    }
-
-    @Test (expectedExceptions = Throwable.class)
-    public void testBadID1() {
-        new VariantContextBuilder("test", delLoc, delLocStart, delLocStop, Arrays.asList(Aref, T)).id(null).make();
-    }
-
-    @Test (expectedExceptions = Exception.class)
-    public void testBadID2() {
-        new VariantContextBuilder("test", delLoc, delLocStart, delLocStop, Arrays.asList(Aref, T)).id("").make();
-    }
-
-    @Test (expectedExceptions = Throwable.class)
-    public void testBadPError() {
-        new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(delRef, ATCref)).log10PError(0.5).make();
-    }
-
-    @Test
-    public void testAccessingSimpleSNPGenotypes() {
-        List<Allele> alleles = Arrays.asList(Aref, T);
-
-        Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
-        Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
-        Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
-
-        VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, alleles)
-                .genotypes(g1, g2, g3).make();
-
-        Assert.assertTrue(vc.hasGenotypes());
-        Assert.assertFalse(vc.isMonomorphicInSamples());
-        Assert.assertTrue(vc.isPolymorphicInSamples());
-        Assert.assertEquals(vc.getSampleNames().size(), 3);
-
-        Assert.assertEquals(vc.getGenotypes().size(), 3);
-        Assert.assertEquals(vc.getGenotypes().get("AA"), g1);
-        Assert.assertEquals(vc.getGenotype("AA"), g1);
-        Assert.assertEquals(vc.getGenotypes().get("AT"), g2);
-        Assert.assertEquals(vc.getGenotype("AT"), g2);
-        Assert.assertEquals(vc.getGenotypes().get("TT"), g3);
-        Assert.assertEquals(vc.getGenotype("TT"), g3);
-
-        Assert.assertTrue(vc.hasGenotype("AA"));
-        Assert.assertTrue(vc.hasGenotype("AT"));
-        Assert.assertTrue(vc.hasGenotype("TT"));
-        Assert.assertFalse(vc.hasGenotype("foo"));
-        Assert.assertFalse(vc.hasGenotype("TTT"));
-        Assert.assertFalse(vc.hasGenotype("at"));
-        Assert.assertFalse(vc.hasGenotype("tt"));
-
-        Assert.assertEquals(vc.getCalledChrCount(), 6);
-        Assert.assertEquals(vc.getCalledChrCount(Aref), 3);
-        Assert.assertEquals(vc.getCalledChrCount(T), 3);
-    }
-
-    @Test
-    public void testAccessingCompleteGenotypes() {
-        List<Allele> alleles = Arrays.asList(Aref, T, ATC);
-
-        Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
-        Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
-        Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
-        Genotype g4 = GenotypeBuilder.create("Td", Arrays.asList(T, ATC));
-        Genotype g5 = GenotypeBuilder.create("dd", Arrays.asList(ATC, ATC));
-        Genotype g6 = GenotypeBuilder.create("..", Arrays.asList(Allele.NO_CALL, Allele.NO_CALL));
-
-        VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, alleles)
-                .genotypes(g1, g2, g3, g4, g5, g6).make();
-
-        Assert.assertTrue(vc.hasGenotypes());
-        Assert.assertFalse(vc.isMonomorphicInSamples());
-        Assert.assertTrue(vc.isPolymorphicInSamples());
-        Assert.assertEquals(vc.getGenotypes().size(), 6);
-
-        Assert.assertEquals(3, vc.getGenotypes(Arrays.asList("AA", "Td", "dd")).size());
-
-        Assert.assertEquals(10, vc.getCalledChrCount());
-        Assert.assertEquals(3, vc.getCalledChrCount(Aref));
-        Assert.assertEquals(4, vc.getCalledChrCount(T));
-        Assert.assertEquals(3, vc.getCalledChrCount(ATC));
-        Assert.assertEquals(2, vc.getCalledChrCount(Allele.NO_CALL));
-
-        Assert.assertEquals(T, vc.getAltAlleleWithHighestAlleleCount());
-    }
-
-    @Test
-    public void testAccessingRefGenotypes() {
-        List<Allele> alleles1 = Arrays.asList(Aref, T);
-        List<Allele> alleles2 = Arrays.asList(Aref);
-        List<Allele> alleles3 = Arrays.asList(Aref, T);
-        for ( List<Allele> alleles : Arrays.asList(alleles1, alleles2, alleles3)) {
-            Genotype g1 = GenotypeBuilder.create("AA1", Arrays.asList(Aref, Aref));
-            Genotype g2 = GenotypeBuilder.create("AA2", Arrays.asList(Aref, Aref));
-            Genotype g3 = GenotypeBuilder.create("..", Arrays.asList(Allele.NO_CALL, Allele.NO_CALL));
-            VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, alleles)
-                    .genotypes(g1, g2, g3).make();
-
-            Assert.assertTrue(vc.hasGenotypes());
-            Assert.assertTrue(vc.isMonomorphicInSamples());
-            Assert.assertFalse(vc.isPolymorphicInSamples());
-            Assert.assertEquals(vc.getGenotypes().size(), 3);
-
-            Assert.assertEquals(4, vc.getCalledChrCount());
-            Assert.assertEquals(4, vc.getCalledChrCount(Aref));
-            Assert.assertEquals(0, vc.getCalledChrCount(T));
-            Assert.assertEquals(2, vc.getCalledChrCount(Allele.NO_CALL));
-
-            //bi allelic, only one alt allele
-            Allele expected;
-            if (alleles.size()>1) {
-                expected = alleles.get(1);
-            } else {
-                expected = null;
-            }
-
-            Assert.assertEquals( vc.getAltAlleleWithHighestAlleleCount(), expected);
-        }
-    }
-
-    @Test
-    public void testFilters() {
-        List<Allele> alleles = Arrays.asList(Aref, T);
-        Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
-        Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
-
-        VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1, g2).make();
-
-        Assert.assertTrue(vc.isNotFiltered());
-        Assert.assertFalse(vc.isFiltered());
-        Assert.assertEquals(0, vc.getFilters().size());
-        Assert.assertFalse(vc.filtersWereApplied());
-        Assert.assertNull(vc.getFiltersMaybeNull());
-
-        vc = new VariantContextBuilder(vc).filters("BAD_SNP_BAD!").make();
-
-        Assert.assertFalse(vc.isNotFiltered());
-        Assert.assertTrue(vc.isFiltered());
-        Assert.assertEquals(1, vc.getFilters().size());
-        Assert.assertTrue(vc.filtersWereApplied());
-        Assert.assertNotNull(vc.getFiltersMaybeNull());
-
-        Set<String> filters = new HashSet<String>(Arrays.asList("BAD_SNP_BAD!", "REALLY_BAD_SNP", "CHRIST_THIS_IS_TERRIBLE"));
-        vc = new VariantContextBuilder(vc).filters(filters).make();
-
-        Assert.assertFalse(vc.isNotFiltered());
-        Assert.assertTrue(vc.isFiltered());
-        Assert.assertEquals(3, vc.getFilters().size());
-        Assert.assertTrue(vc.filtersWereApplied());
-        Assert.assertNotNull(vc.getFiltersMaybeNull());
-    }
-
-    @Test
-    public void testGetGenotypeCounts() {
-        List<Allele> alleles = Arrays.asList(Aref, T);
-        Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
-        Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
-        Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
-        Genotype g4 = GenotypeBuilder.create("A.", Arrays.asList(Aref, Allele.NO_CALL));
-        Genotype g5 = GenotypeBuilder.create("..", Arrays.asList(Allele.NO_CALL, Allele.NO_CALL));
-
-        // we need to create a new VariantContext each time
-        VariantContext vc = new VariantContextBuilder("foo", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
-        Assert.assertEquals(1, vc.getHetCount());
-        vc = new VariantContextBuilder("foo", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
-        Assert.assertEquals(1, vc.getHomRefCount());
-        vc = new VariantContextBuilder("foo", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
-        Assert.assertEquals(1, vc.getHomVarCount());
-        vc = new VariantContextBuilder("foo", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
-        Assert.assertEquals(1, vc.getMixedCount());
-        vc = new VariantContextBuilder("foo", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
-        Assert.assertEquals(1, vc.getNoCallCount());
-    }
-
-    @Test
-    public void testVCFfromGenotypes() {
-        List<Allele> alleles = Arrays.asList(Aref, C, T);
-        Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
-        Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
-        Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
-        Genotype g4 = GenotypeBuilder.create("..", Arrays.asList(Allele.NO_CALL, Allele.NO_CALL));
-        Genotype g5 = GenotypeBuilder.create("AC", Arrays.asList(Aref, C));
-        VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
-
-        VariantContext vc12 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g1.getSampleName(), g2.getSampleName())), true);
-        VariantContext vc1 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g1.getSampleName())), true);
-        VariantContext vc23 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g2.getSampleName(), g3.getSampleName())), true);
-        VariantContext vc4 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g4.getSampleName())), true);
-        VariantContext vc14 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g1.getSampleName(), g4.getSampleName())), true);
-        VariantContext vc125 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g1.getSampleName(), g2.getSampleName(), g5.getSampleName())), true);
-
-        Assert.assertTrue(vc12.isPolymorphicInSamples());
-        Assert.assertTrue(vc23.isPolymorphicInSamples());
-        Assert.assertTrue(vc1.isMonomorphicInSamples());
-        Assert.assertTrue(vc4.isMonomorphicInSamples());
-        Assert.assertTrue(vc14.isMonomorphicInSamples());
-        Assert.assertTrue(vc125.isPolymorphicInSamples());
-
-        Assert.assertTrue(vc12.isSNP());
-        Assert.assertTrue(vc12.isVariant());
-        Assert.assertTrue(vc12.isBiallelic());
-
-        Assert.assertFalse(vc1.isSNP());
-        Assert.assertFalse(vc1.isVariant());
-        Assert.assertFalse(vc1.isBiallelic());
-
-        Assert.assertTrue(vc23.isSNP());
-        Assert.assertTrue(vc23.isVariant());
-        Assert.assertTrue(vc23.isBiallelic());
-
-        Assert.assertFalse(vc4.isSNP());
-        Assert.assertFalse(vc4.isVariant());
-        Assert.assertFalse(vc4.isBiallelic());
-
-        Assert.assertFalse(vc14.isSNP());
-        Assert.assertFalse(vc14.isVariant());
-        Assert.assertFalse(vc14.isBiallelic());
-
-        Assert.assertTrue(vc125.isSNP());
-        Assert.assertTrue(vc125.isVariant());
-        Assert.assertFalse(vc125.isBiallelic());
-
-        Assert.assertEquals(3, vc12.getCalledChrCount(Aref));
-        Assert.assertEquals(1, vc23.getCalledChrCount(Aref));
-        Assert.assertEquals(2, vc1.getCalledChrCount(Aref));
-        Assert.assertEquals(0, vc4.getCalledChrCount(Aref));
-        Assert.assertEquals(2, vc14.getCalledChrCount(Aref));
-        Assert.assertEquals(4, vc125.getCalledChrCount(Aref));
-    }
-
-    @Test
-    public void testMonomorphicVariant() {
-        Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
-        Genotype g2 = GenotypeBuilder.create("BB", Arrays.asList(Aref, Allele.NO_CALL));
-        Genotype g3 = GenotypeBuilder.create("CC", Arrays.asList(Allele.NO_CALL,Allele.NO_CALL));
-        GenotypesContext gc = GenotypesContext.create(g1, g2, g3);
-        VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Collections.singletonList(Aref)).genotypes(gc).make();
-
-        Assert.assertEquals(vc.getType(), VariantContext.Type.NO_VARIATION);
-        Assert.assertNull(vc.getAltAlleleWithHighestAlleleCount());
-        Assert.assertEquals(vc.getCalledChrCount(Aref), 3);
-
-    }
-
-
-    public void testGetGenotypeMethods() {
-        Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
-        Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
-        Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
-        GenotypesContext gc = GenotypesContext.create(g1, g2, g3);
-        VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T)).genotypes(gc).make();
-
-        Assert.assertEquals(vc.getGenotype("AA"), g1);
-        Assert.assertEquals(vc.getGenotype("AT"), g2);
-        Assert.assertEquals(vc.getGenotype("TT"), g3);
-        Assert.assertEquals(vc.getGenotype("CC"), null);
-
-        Assert.assertEquals(vc.getGenotypes(), gc);
-        Assert.assertEquals(vc.getGenotypes(Arrays.asList("AA", "AT")), Arrays.asList(g1, g2));
-        Assert.assertEquals(vc.getGenotypes(Arrays.asList("AA", "TT")), Arrays.asList(g1, g3));
-        Assert.assertEquals(vc.getGenotypes(Arrays.asList("AA", "AT", "TT")), Arrays.asList(g1, g2, g3));
-        Assert.assertEquals(vc.getGenotypes(Arrays.asList("AA", "AT", "CC")), Arrays.asList(g1, g2));
-
-        Assert.assertEquals(vc.getGenotype(0), g1);
-        Assert.assertEquals(vc.getGenotype(1), g2);
-        Assert.assertEquals(vc.getGenotype(2), g3);
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Test allele merging
-    //
-    // --------------------------------------------------------------------------------
-
-    private class GetAllelesTest {
-        List<Allele> alleles;
-        String name;
-
-        private GetAllelesTest(String name, Allele... arg) {
-            this.name = name;
-            this.alleles = Arrays.asList(arg);
-        }
-
-        public String toString() {
-            return String.format("%s input=%s", name, alleles);
-        }
-    }
-
-    @DataProvider(name = "getAlleles")
-    public Object[][] mergeAllelesData() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-
-        tests.add(new Object[]{new GetAllelesTest("A*",   Aref)});
-        tests.add(new Object[]{new GetAllelesTest("A*/C", Aref, C)});
-        tests.add(new Object[]{new GetAllelesTest("A*/C/T", Aref, C, T)});
-        tests.add(new Object[]{new GetAllelesTest("A*/T/C", Aref, T, C)});
-        tests.add(new Object[]{new GetAllelesTest("A*/C/T/ATC", Aref, C, T, ATC)});
-        tests.add(new Object[]{new GetAllelesTest("A*/T/C/ATC", Aref, T, C, ATC)});
-        tests.add(new Object[]{new GetAllelesTest("A*/ATC/T/C", Aref, ATC, T, C)});
-
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "getAlleles")
-    public void testMergeAlleles(GetAllelesTest cfg) {
-        final List<Allele> altAlleles = cfg.alleles.subList(1, cfg.alleles.size());
-        final VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, cfg.alleles).make();
-
-        Assert.assertEquals(vc.getAlleles(), cfg.alleles, "VC alleles not the same as input alleles");
-        Assert.assertEquals(vc.getNAlleles(), cfg.alleles.size(), "VC getNAlleles not the same as input alleles size");
-        Assert.assertEquals(vc.getAlternateAlleles(), altAlleles, "VC alt alleles not the same as input alt alleles");
-
-
-        for ( int i = 0; i < cfg.alleles.size(); i++ ) {
-            final Allele inputAllele = cfg.alleles.get(i);
-
-            Assert.assertTrue(vc.hasAllele(inputAllele));
-            if ( inputAllele.isReference() ) {
-                final Allele nonRefVersion = Allele.create(inputAllele.getBases(), false);
-                Assert.assertTrue(vc.hasAllele(nonRefVersion, true));
-                Assert.assertFalse(vc.hasAllele(nonRefVersion, false));
-            }
-
-            Assert.assertEquals(inputAllele, vc.getAllele(inputAllele.getBaseString()));
-            Assert.assertEquals(inputAllele, vc.getAllele(inputAllele.getBases()));
-
-            if ( i > 0 ) { // it's an alt allele
-                Assert.assertEquals(inputAllele, vc.getAlternateAllele(i-1));
-            }
-        }
-
-        final Allele missingAllele = Allele.create("AACCGGTT"); // does not exist
-        Assert.assertNull(vc.getAllele(missingAllele.getBases()));
-        Assert.assertFalse(vc.hasAllele(missingAllele));
-        Assert.assertFalse(vc.hasAllele(missingAllele, true));
-    }
-
-    private class SitesAndGenotypesVC {
-        VariantContext vc, copy;
-        String name;
-
-        private SitesAndGenotypesVC(String name, VariantContext original) {
-            this.name = name;
-            this.vc = original;
-            this.copy = new VariantContextBuilder(original).make();
-        }
-
-        public String toString() {
-            return String.format("%s input=%s", name, vc);
-        }
-    }
-
-    @DataProvider(name = "SitesAndGenotypesVC")
-    public Object[][] MakeSitesAndGenotypesVCs() {
-        Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
-        Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
-        Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
-
-        VariantContext sites = new VariantContextBuilder("sites", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T)).make();
-        VariantContext genotypes = new VariantContextBuilder(sites).source("genotypes").genotypes(g1, g2, g3).make();
-
-        List<Object[]> tests = new ArrayList<Object[]>();
-
-        tests.add(new Object[]{new SitesAndGenotypesVC("sites", sites)});
-        tests.add(new Object[]{new SitesAndGenotypesVC("genotypes", genotypes)});
-
-        return tests.toArray(new Object[][]{});
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Test modifying routines
-    //
-    // --------------------------------------------------------------------------------
-    @Test(dataProvider = "SitesAndGenotypesVC")
-    public void runModifyVCTests(SitesAndGenotypesVC cfg) {
-        VariantContext modified = new VariantContextBuilder(cfg.vc).loc("chr2", 123, 123).make();
-        Assert.assertEquals(modified.getContig(), "chr2");
-        Assert.assertEquals(modified.getStart(), 123);
-        Assert.assertEquals(modified.getEnd(), 123);
-
-        modified = new VariantContextBuilder(cfg.vc).id("newID").make();
-        Assert.assertEquals(modified.getID(), "newID");
-
-        Set<String> newFilters = Collections.singleton("newFilter");
-        modified = new VariantContextBuilder(cfg.vc).filters(newFilters).make();
-        Assert.assertEquals(modified.getFilters(), newFilters);
-
-        // test the behavior when the builder's attribute object is null
-        modified = new VariantContextBuilder(modified).attributes(null).make();
-        Assert.assertTrue(modified.getAttributes().isEmpty());
-        modified = new VariantContextBuilder(modified).attributes(null).rmAttribute("AC").make();
-        Assert.assertTrue(modified.getAttributes().isEmpty());
-        modified = new VariantContextBuilder(modified).attributes(null).attribute("AC", 1).make();
-        Assert.assertEquals(modified.getAttribute("AC"), 1);
-
-        // test the behavior when the builder's attribute object is not initialized
-        modified = new VariantContextBuilder(modified.getSource(), modified.getContig(), modified.getStart(), modified.getEnd(), modified.getAlleles()).attribute("AC", 1).make();
-
-        // test normal attribute modification
-        modified = new VariantContextBuilder(cfg.vc).attribute("AC", 1).make();
-        Assert.assertEquals(modified.getAttribute("AC"), 1);
-        modified = new VariantContextBuilder(modified).attribute("AC", 2).make();
-        Assert.assertEquals(modified.getAttribute("AC"), 2);
-
-        Genotype g1 = GenotypeBuilder.create("AA2", Arrays.asList(Aref, Aref));
-        Genotype g2 = GenotypeBuilder.create("AT2", Arrays.asList(Aref, T));
-        Genotype g3 = GenotypeBuilder.create("TT2", Arrays.asList(T, T));
-        GenotypesContext gc = GenotypesContext.create(g1,g2,g3);
-        modified = new VariantContextBuilder(cfg.vc).genotypes(gc).make();
-        Assert.assertEquals(modified.getGenotypes(), gc);
-        modified = new VariantContextBuilder(cfg.vc).noGenotypes().make();
-        Assert.assertTrue(modified.getGenotypes().isEmpty());
-
-        // test that original hasn't changed
-        Assert.assertEquals(cfg.vc.getContig(), cfg.copy.getContig());
-        Assert.assertEquals(cfg.vc.getStart(), cfg.copy.getStart());
-        Assert.assertEquals(cfg.vc.getEnd(), cfg.copy.getEnd());
-        Assert.assertEquals(cfg.vc.getAlleles(), cfg.copy.getAlleles());
-        Assert.assertEquals(cfg.vc.getAttributes(), cfg.copy.getAttributes());
-        Assert.assertEquals(cfg.vc.getID(), cfg.copy.getID());
-        Assert.assertEquals(cfg.vc.getGenotypes(), cfg.copy.getGenotypes());
-        Assert.assertEquals(cfg.vc.getLog10PError(), cfg.copy.getLog10PError());
-        Assert.assertEquals(cfg.vc.getFilters(), cfg.copy.getFilters());
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Test subcontext
-    //
-    // --------------------------------------------------------------------------------
-    private class SubContextTest {
-        Set<String> samples;
-        boolean updateAlleles;
-
-        private SubContextTest(Collection<String> samples, boolean updateAlleles) {
-            this.samples = new HashSet<String>(samples);
-            this.updateAlleles = updateAlleles;
-        }
-
-        public String toString() {
-            return String.format("%s samples=%s updateAlleles=%b", "SubContextTest", samples, updateAlleles);
-        }
-    }
-
-    @DataProvider(name = "SubContextTest")
-    public Object[][] MakeSubContextTest() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-
-        for ( boolean updateAlleles : Arrays.asList(true, false)) {
-            tests.add(new Object[]{new SubContextTest(Collections.<String>emptySet(), updateAlleles)});
-            tests.add(new Object[]{new SubContextTest(Collections.singleton("MISSING"), updateAlleles)});
-            tests.add(new Object[]{new SubContextTest(Collections.singleton("AA"), updateAlleles)});
-            tests.add(new Object[]{new SubContextTest(Collections.singleton("AT"), updateAlleles)});
-            tests.add(new Object[]{new SubContextTest(Collections.singleton("TT"), updateAlleles)});
-            tests.add(new Object[]{new SubContextTest(Arrays.asList("AA", "AT"), updateAlleles)});
-            tests.add(new Object[]{new SubContextTest(Arrays.asList("AA", "AT", "TT"), updateAlleles)});
-            tests.add(new Object[]{new SubContextTest(Arrays.asList("AA", "AT", "MISSING"), updateAlleles)});
-            tests.add(new Object[]{new SubContextTest(Arrays.asList("AA", "AT", "TT", "MISSING"), updateAlleles)});
-            tests.add(new Object[]{new SubContextTest(Arrays.asList("AA", "AT", "AC"), updateAlleles)});
-        }
-
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "SubContextTest")
-    public void runSubContextTest(SubContextTest cfg) {
-        Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
-        Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
-        Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
-        Genotype g4 = GenotypeBuilder.create("AC", Arrays.asList(Aref, C));
-
-        GenotypesContext gc = GenotypesContext.create(g1, g2, g3, g4);
-        VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, C, T)).genotypes(gc).make();
-        VariantContext sub = vc.subContextFromSamples(cfg.samples, cfg.updateAlleles);
-
-        // unchanged attributes should be the same
-        Assert.assertEquals(sub.getContig(), vc.getContig());
-        Assert.assertEquals(sub.getStart(), vc.getStart());
-        Assert.assertEquals(sub.getEnd(), vc.getEnd());
-        Assert.assertEquals(sub.getLog10PError(), vc.getLog10PError());
-        Assert.assertEquals(sub.getFilters(), vc.getFilters());
-        Assert.assertEquals(sub.getID(), vc.getID());
-        Assert.assertEquals(sub.getAttributes(), vc.getAttributes());
-
-        Set<Genotype> expectedGenotypes = new HashSet<Genotype>();
-        if ( cfg.samples.contains(g1.getSampleName()) ) expectedGenotypes.add(g1);
-        if ( cfg.samples.contains(g2.getSampleName()) ) expectedGenotypes.add(g2);
-        if ( cfg.samples.contains(g3.getSampleName()) ) expectedGenotypes.add(g3);
-        if ( cfg.samples.contains(g4.getSampleName()) ) expectedGenotypes.add(g4);
-        GenotypesContext expectedGC = GenotypesContext.copy(expectedGenotypes);
-
-        // these values depend on the results of sub
-        if ( cfg.updateAlleles ) {
-            // do the work to see what alleles should be here, and which not
-            List<Allele> expectedAlleles = new ArrayList<Allele>();
-            expectedAlleles.add(Aref);
-
-            Set<Allele> genotypeAlleles = new HashSet<Allele>();
-            for ( final Genotype g : expectedGC )
-                genotypeAlleles.addAll(g.getAlleles());
-            genotypeAlleles.remove(Aref);
-
-            // ensure original allele order
-            for (Allele allele: vc.getAlleles())
-                if (genotypeAlleles.contains(allele))
-                    expectedAlleles.add(allele);
-
-            Assert.assertEquals(sub.getAlleles(), expectedAlleles);
-        } else {
-            // not updating alleles -- should be the same
-            Assert.assertEquals(sub.getAlleles(), vc.getAlleles());
-        }
-
-        // same sample names => success
-        Assert.assertTrue(sub.getGenotypes().getSampleNames().equals(expectedGC.getSampleNames()));
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Test sample name functions
-    //
-    // --------------------------------------------------------------------------------
-    private class SampleNamesTest {
-        List<String> sampleNames;
-        List<String> sampleNamesInOrder;
-
-        private SampleNamesTest(List<String> sampleNames, List<String> sampleNamesInOrder) {
-            this.sampleNamesInOrder = sampleNamesInOrder;
-            this.sampleNames = sampleNames;
-        }
-
-        public String toString() {
-            return String.format("%s samples=%s order=%s", "SampleNamesTest", sampleNames, sampleNamesInOrder);
-        }
-    }
-
-    @DataProvider(name = "SampleNamesTest")
-    public Object[][] MakeSampleNamesTest() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-
-        tests.add(new Object[]{new SampleNamesTest(Arrays.asList("1"), Arrays.asList("1"))});
-        tests.add(new Object[]{new SampleNamesTest(Arrays.asList("2", "1"), Arrays.asList("1", "2"))});
-        tests.add(new Object[]{new SampleNamesTest(Arrays.asList("1", "2"), Arrays.asList("1", "2"))});
-        tests.add(new Object[]{new SampleNamesTest(Arrays.asList("1", "2", "3"), Arrays.asList("1", "2", "3"))});
-        tests.add(new Object[]{new SampleNamesTest(Arrays.asList("2", "1", "3"), Arrays.asList("1", "2", "3"))});
-        tests.add(new Object[]{new SampleNamesTest(Arrays.asList("2", "3", "1"), Arrays.asList("1", "2", "3"))});
-        tests.add(new Object[]{new SampleNamesTest(Arrays.asList("3", "1", "2"), Arrays.asList("1", "2", "3"))});
-        tests.add(new Object[]{new SampleNamesTest(Arrays.asList("3", "2", "1"), Arrays.asList("1", "2", "3"))});
-        tests.add(new Object[]{new SampleNamesTest(Arrays.asList("NA2", "NA1"), Arrays.asList("NA1", "NA2"))});
-
-        return tests.toArray(new Object[][]{});
-    }
-
-    private final static void assertGenotypesAreInOrder(Iterable<Genotype> gIt, List<String> names) {
-        int i = 0;
-        for ( final Genotype g : gIt ) {
-            Assert.assertEquals(g.getSampleName(), names.get(i), "Unexpected genotype ordering");
-            i++;
-        }
-    }
-
-
-    @Test(dataProvider = "SampleNamesTest")
-    public void runSampleNamesTest(SampleNamesTest cfg) {
-        GenotypesContext gc = GenotypesContext.create(cfg.sampleNames.size());
-        for ( final String name : cfg.sampleNames ) {
-            gc.add(GenotypeBuilder.create(name, Arrays.asList(Aref, T)));
-        }
-
-        VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T)).genotypes(gc).make();
-
-        // same sample names => success
-        Assert.assertTrue(vc.getSampleNames().equals(new HashSet<String>(cfg.sampleNames)), "vc.getSampleNames() = " + vc.getSampleNames());
-        Assert.assertEquals(vc.getSampleNamesOrderedByName(), cfg.sampleNamesInOrder, "vc.getSampleNamesOrderedByName() = " + vc.getSampleNamesOrderedByName());
-
-        assertGenotypesAreInOrder(vc.getGenotypesOrderedByName(), cfg.sampleNamesInOrder);
-        assertGenotypesAreInOrder(vc.getGenotypesOrderedBy(cfg.sampleNames), cfg.sampleNames);
-    }
-
-    @Test
-    public void testGenotypeCounting() {
-        Genotype noCall = GenotypeBuilder.create("nocall", Arrays.asList(Allele.NO_CALL));
-        Genotype mixed  = GenotypeBuilder.create("mixed", Arrays.asList(Aref, Allele.NO_CALL));
-        Genotype homRef = GenotypeBuilder.create("homRef", Arrays.asList(Aref, Aref));
-        Genotype het    = GenotypeBuilder.create("het", Arrays.asList(Aref, T));
-        Genotype homVar = GenotypeBuilder.create("homVar", Arrays.asList(T, T));
-
-        List<Genotype> allGenotypes = Arrays.asList(noCall, mixed, homRef, het, homVar);
-        final int nCycles = allGenotypes.size() * 10;
-
-        for ( int i = 0; i < nCycles; i++ ) {
-            int nNoCall = 0, nNoCallAlleles = 0, nA = 0, nT = 0, nMixed = 0, nHomRef = 0, nHet = 0, nHomVar = 0;
-            int nSamples = 0;
-            GenotypesContext gc = GenotypesContext.create();
-            for ( int j = 0; j < i; j++ ) {
-                nSamples++;
-                Genotype g = allGenotypes.get(j % allGenotypes.size());
-                final String name = String.format("%s_%d%d", g.getSampleName(), i, j);
-                gc.add(GenotypeBuilder.create(name, g.getAlleles()));
-                switch ( g.getType() ) {
-                    case NO_CALL: nNoCall++; nNoCallAlleles++; break;
-                    case HOM_REF: nA += 2; nHomRef++; break;
-                    case HET: nA++; nT++; nHet++; break;
-                    case HOM_VAR: nT += 2; nHomVar++; break;
-                    case MIXED: nA++; nNoCallAlleles++; nMixed++; break;
-                    default: throw new RuntimeException("Unexpected genotype type " + g.getType());
-                }
-
-            }
-
-            VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T)).genotypes(gc).make();
-            Assert.assertEquals(vc.getNSamples(), nSamples);
-            if ( nSamples > 0 ) {
-                Assert.assertEquals(vc.isPolymorphicInSamples(), nT > 0);
-                Assert.assertEquals(vc.isMonomorphicInSamples(), nT == 0);
-            }
-            Assert.assertEquals(vc.getCalledChrCount(), nA + nT);
-
-            Assert.assertEquals(vc.getCalledChrCount(Allele.NO_CALL), nNoCallAlleles);
-            Assert.assertEquals(vc.getCalledChrCount(Aref), nA);
-            Assert.assertEquals(vc.getCalledChrCount(T), nT);
-
-            Assert.assertEquals(vc.getNoCallCount(), nNoCall);
-            Assert.assertEquals(vc.getHomRefCount(), nHomRef);
-            Assert.assertEquals(vc.getHetCount(), nHet);
-            Assert.assertEquals(vc.getHomVarCount(), nHomVar);
-            Assert.assertEquals(vc.getMixedCount(), nMixed);
-        }
-    }
-    @Test
-    public void testSetAttribute() {
-    	VariantContextBuilder builder = new VariantContextBuilder();
-    	builder.attribute("Test", "value");
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Test validation methods
-    //
-    // --------------------------------------------------------------------------------
-
-    // create a VariantContext object for various alleles and genotypes to test against
-    private VariantContext createTestVariantContext(final List<Allele> alleles, final Map<String, Object> attributes, final Genotype... genotypes) {
-        final EnumSet<VariantContext.Validation> toValidate = EnumSet.noneOf(VariantContext.Validation.class);
-        final Set<String> filters = null;
-        final boolean fullyDecoded = false;
-
-        // no genotypes needs to use GenotypesContext.NO_GENOTYPES,
-        // otherwise we build up a GenotypesContext from the passed genotypes
-        final GenotypesContext gc;
-        if (genotypes == null || genotypes.length == 0) {
-            gc = GenotypesContext.NO_GENOTYPES;
-        } else {
-            gc = new GenotypesContext();
-            for (final Genotype genotype : genotypes) {
-                gc.add(genotype);
-            }
-        }
-        // most of the fields are not important to the tests, we just need alleles and gc set properly
-        return new VariantContext("genotypes", VCFConstants.EMPTY_ID_FIELD, snpLoc, snpLocStart, snpLocStop, alleles,
-                gc, VariantContext.NO_LOG10_PERROR, filters, attributes,
-                fullyDecoded, toValidate);
-    }
-
-    // validateReferenceBases: PASS conditions
-    @DataProvider
-    public Object[][] testValidateReferencesBasesDataProvider() {
-        final VariantContext vc = createValidateReferencesContext(Arrays.asList(Aref, T));
-        return new Object[][]{
-                // null ref will pass validation
-                {vc, null, A},
-                // A vs A-ref will pass validation
-                {vc, Aref, A}
-        };
-    }
-    @Test(dataProvider = "testValidateReferencesBasesDataProvider")
-    public void testValidateReferenceBases(final VariantContext vc, final Allele allele1, final Allele allele2) {
-        // validateReferenceBases throws exceptions if it fails, so no Asserts here...
-        vc.validateReferenceBases(allele1, allele2);
-    }
-    // validateReferenceBases: FAIL conditions
-    @DataProvider
-    public Object[][] testValidateReferencesBasesFailureDataProvider() {
-        final VariantContext vc = createValidateReferencesContext(Arrays.asList(Aref, T));
-
-        final Allele symbolicAllele = Allele.create("<A>");
-
-        return new Object[][]{
-                // T vs A-ref will NOT pass validation
-                {vc, Aref, T},
-                // symbolic alleles will NOT pass validation
-                {vc, Aref, symbolicAllele}
-        };
-    }
-    @Test(dataProvider = "testValidateReferencesBasesFailureDataProvider", expectedExceptions = TribbleException.class)
-    public void testValidateReferenceBasesFailure(final VariantContext vc, final Allele allele1, final Allele allele2) {
-        // validateReferenceBases throws exceptions if it fails, so no Asserts here...
-        vc.validateReferenceBases(allele1, allele2);
-    }
-    private VariantContext createValidateReferencesContext(final List<Allele> alleles) {
-        return createTestVariantContext(alleles, null);
-    }
-
-
-    // validateRSIDs: PASS conditions
-    @DataProvider
-    public Object[][] testValidateRSIDsDataProvider() {
-        final VariantContext vcNoId = createTestVariantContextRsIds(VCFConstants.EMPTY_ID_FIELD);
-        final VariantContext vcNonRs = createTestVariantContextRsIds("abc456");
-        final VariantContext vc = createTestVariantContextRsIds("rs123");
-        final VariantContext vcMultipleRs = createTestVariantContextRsIds("rs123;rs456;rs789");
-
-        return new Object[][]{
-                // no ID will pass validation
-                {vcNoId, makeRsIDsSet("rs123")},
-                // non-rs ID will pass validation
-                {vcNonRs, makeRsIDsSet("rs123")},
-                // matching ID will pass validation
-                {vc, makeRsIDsSet("rs123")},
-                // null rsIDs to check will pass validation
-                {vc, null},
-                // context with multiple rsIDs that are contained within the rsID list will pass
-                {vcMultipleRs, makeRsIDsSet("rs123", "rs321", "rs456", "rs654", "rs789")}
-        };
-    }
-    @Test(dataProvider = "testValidateRSIDsDataProvider")
-    public void testValidateRSIDs(final VariantContext vc, final Set<String> rsIDs) {
-        // validateRSIDs throws exceptions if it fails, so no Asserts here...
-        vc.validateRSIDs(rsIDs);
-    }
-    // validateRSIDs: FAIL conditions
-    @DataProvider
-    public Object[][] testValidateRSIDsFailureDataProvider() {
-        final VariantContext vc = createTestVariantContextRsIds("rs123");
-        final VariantContext vcMultipleRs = createTestVariantContextRsIds("rs123;rs456;rs789");
-
-        return new Object[][]{
-                // mismatching ID will fail validation
-                {vc, makeRsIDsSet("rs123456")},
-                // null rsIDs to check will pass validation
-                {vcMultipleRs, makeRsIDsSet("rs456")}
-        };
-    }
-    @Test(dataProvider = "testValidateRSIDsFailureDataProvider", expectedExceptions = TribbleException.class)
-    public void testValidateRSIDsFailure(final VariantContext vc, final Set<String> rsIDs) {
-        // validateRSIDs throws exceptions if it fails, so no Asserts here...
-        vc.validateRSIDs(rsIDs);
-    }
-    // create a VariantContext appropriate for testing rsIDs
-    private VariantContext createTestVariantContextRsIds(final String rsId) {
-        final EnumSet<VariantContext.Validation> toValidate = EnumSet.noneOf(VariantContext.Validation.class);
-        final Set<String> filters = null;
-        final Map<String, Object> attributes = null;
-        final boolean fullyDecoded = false;
-
-        return new VariantContext("genotypes", rsId, snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T),
-                GenotypesContext.NO_GENOTYPES, VariantContext.NO_LOG10_PERROR, filters, attributes,
-                fullyDecoded, toValidate);
-    }
-    private Set<String> makeRsIDsSet(final String... rsIds) {
-        return new HashSet<String>(Arrays.asList(rsIds));
-    }
-
-
-    // validateAlternateAlleles: PASS conditions
-    @DataProvider
-    public Object[][] testValidateAlternateAllelesDataProvider() {
-        final Genotype homVarT = GenotypeBuilder.create("homVarT", Arrays.asList(T, T));
-
-        // no genotypes passes validateAlternateAlleles
-        final VariantContext vcNoGenotypes =
-                // A-ref/T with no GT
-                createValidateAlternateAllelesContext(Arrays.asList(Aref, T));
-
-        // genotypes that match ALTs will pass
-        final VariantContext vcHasGenotypes =
-                // A-ref/T vs T/T
-                createValidateAlternateAllelesContext(Arrays.asList(Aref, T), homVarT);
-
-        return new Object[][]{
-                {vcNoGenotypes},
-                {vcHasGenotypes}
-        };
-    }
-    @Test(dataProvider = "testValidateAlternateAllelesDataProvider")
-    public void testValidateAlternateAlleles(final VariantContext vc) {
-        // validateAlternateAlleles throws exceptions if it fails, so no Asserts here...
-        vc.validateAlternateAlleles();
-    }
-    // validateAlternateAlleles: FAIL conditions
-    @DataProvider
-    public Object[][] testValidateAlternateAllelesFailureDataProvider() {
-        final Genotype homRef = GenotypeBuilder.create("homRef", Arrays.asList(Aref, Aref));
-        final Genotype homVarA = GenotypeBuilder.create("homVarA", Arrays.asList(A, A));
-
-        // alts not observed in the genotypes will fail validation
-        // this is the throw in VariantContext from: if ( reportedAlleles.size() != observedAlleles.size() )
-        final VariantContext vcHasAltNotObservedInGT =
-                // A-ref/T vs A-ref/A-ref
-                createValidateAlternateAllelesContext(Arrays.asList(Aref, T), homRef);
-
-        // alts not observed in the genotypes will fail validation
-        // but this time it is the second throw in VariantContext after: observedAlleles.retainAll(reportedAlleles);
-        final VariantContext vcHasAltNotObservedInGTIntersection =
-                // A-ref/T vs A/A
-                createValidateAlternateAllelesContext(Arrays.asList(Aref, T), homVarA);
-
-        return new Object[][]{
-                {vcHasAltNotObservedInGT},
-                {vcHasAltNotObservedInGTIntersection}
-        };
-    }
-    @Test(dataProvider = "testValidateAlternateAllelesFailureDataProvider", expectedExceptions = TribbleException.class)
-    public void testValidateAlternateAllelesFailure(final VariantContext vc) {
-        // validateAlternateAlleles throws exceptions if it fails, so no Asserts here...
-        vc.validateAlternateAlleles();
-    }
-    private VariantContext createValidateAlternateAllelesContext(final List<Allele> alleles, final Genotype... genotypes) {
-        return createTestVariantContext(alleles, null, genotypes);
-    }
-
-
-
-    // validateChromosomeCounts: PASS conditions
-    @DataProvider
-    public Object[][] testValidateChromosomeCountsDataProvider() {
-        final Genotype homRef = GenotypeBuilder.create("homRef", Arrays.asList(Aref, Aref));
-        final Genotype homVarT = GenotypeBuilder.create("homVarT", Arrays.asList(T, T));
-        final Genotype hetVarTC = GenotypeBuilder.create("hetVarTC", Arrays.asList(T, C));
-        final Genotype homRefNoCall = GenotypeBuilder.create("homRefNoCall", Arrays.asList(Aref, Allele.NO_CALL));
-
-
-        // no genotypes passes validateChromosomeCounts
-        final VariantContext vcNoGenotypes =
-                // A-ref/T with no GT
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T), null);
-
-        /** AN : total number of alleles in called genotypes **/
-        // with AN set and hom-ref, we expect AN to be 2 for Aref/Aref
-        final Map<String, Object> attributesAN = new HashMap<String, Object>();
-        attributesAN.put(VCFConstants.ALLELE_NUMBER_KEY, "2");
-        final VariantContext vcANSet =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesAN, homRef);
-
-        // with AN set, one no-call (no-calls get ignored by getCalledChrCount() in VariantContext)
-        // we expect AN to be 1 for Aref/no-call
-        final Map<String, Object> attributesANNoCall = new HashMap<String, Object>();
-        attributesANNoCall.put(VCFConstants.ALLELE_NUMBER_KEY, "1");
-        final VariantContext vcANSetNoCall =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesANNoCall, homRefNoCall);
-
-
-        /** AC : allele count in genotypes, for each ALT allele, in the same order as listed **/
-        // with AC set, and T/T, we expect AC to be 2 (for 2 counts of ALT T)
-        final Map<String, Object> attributesAC = new HashMap<String, Object>();
-        attributesAC.put(VCFConstants.ALLELE_COUNT_KEY, "2");
-        final VariantContext vcACSet =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T), attributesAC, homVarT);
-
-        // with AC set and no ALT (GT is 0/0), we expect AC count to be 0
-        final Map<String, Object> attributesACNoAlts = new HashMap<String, Object>();
-        attributesACNoAlts.put(VCFConstants.ALLELE_COUNT_KEY, "0");
-        final VariantContext vcACSetNoAlts =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesACNoAlts, homRef);
-
-        // with AC set, and two different ALTs (T and C), with GT of 1/2, we expect a count of 1 for each.
-        // With two ALTs, a list is expected, so we set the attribute as a list of 1,1
-        final Map<String, Object> attributesACTwoAlts = new HashMap<String, Object>();
-        attributesACTwoAlts.put(VCFConstants.ALLELE_COUNT_KEY, Arrays.asList("1", "1"));
-        final VariantContext vcACSetTwoAlts =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACTwoAlts, hetVarTC);
-
-        // with AC set, and two different ALTs (T and C), with no GT, we expect a 2 count values.
-        final Map<String, Object> attributesACNoGtTwoAlts = new HashMap<String, Object>();
-        attributesACNoGtTwoAlts.put(VCFConstants.ALLELE_COUNT_KEY, Arrays.asList("1", "1"));
-        final VariantContext vcACNoGtSetTwoAlts =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACNoGtTwoAlts, null);
-
-        // with AF set, and two different ALTs (T and C), with GT of 1/2, we expect two frequncy values.
-        // With two ALTs, a list is expected, so we set the attribute as a list of 0.5,0.5
-        final Map<String, Object> attributesAFTwoAlts = new HashMap<String, Object>();
-        attributesAFTwoAlts.put(VCFConstants.ALLELE_FREQUENCY_KEY, Arrays.asList("0.5", "0.5"));
-        final VariantContext vcAFSetTwoAlts =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesAFTwoAlts, hetVarTC);
-
-        // with AF set, and two different ALTs (T and C), with no GT, we expect two frequency values.
-        final Map<String, Object> attributesAFNoGtTwoAlts = new HashMap<String, Object>();
-        attributesAFNoGtTwoAlts.put(VCFConstants.ALLELE_FREQUENCY_KEY, Arrays.asList("0.5", "0.5"));
-        final VariantContext vcAFNoGtSetTwoAlts =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesAFNoGtTwoAlts, null);
-
-        return new Object[][]{
-                {vcNoGenotypes},
-                {vcANSet},
-                {vcANSetNoCall},
-                {vcACSet},
-                {vcACSetNoAlts},
-                {vcACNoGtSetTwoAlts},
-                {vcAFSetTwoAlts},
-                {vcAFNoGtSetTwoAlts}
-        };
-    }
-    @Test(dataProvider = "testValidateChromosomeCountsDataProvider")
-    public void testValidateChromosomeCounts(final VariantContext vc) {
-        // validateChromosomeCounts throws exceptions if it fails, so no Asserts here...
-        vc.validateChromosomeCounts();
-    }
-    // validateChromosomeCounts: FAIL conditions
-    @DataProvider
-    public Object[][] testValidateChromosomeCountsFailureDataProvider() {
-        final Genotype homRef = GenotypeBuilder.create("homRef", Arrays.asList(Aref, Aref));
-        final Genotype hetVarTC = GenotypeBuilder.create("hetVarTC", Arrays.asList(T, C));
-        final Genotype homRefNoCall = GenotypeBuilder.create("homRefNoCall", Arrays.asList(Aref, Allele.NO_CALL));
-
-        /** AN : total number of alleles in called genotypes **/
-        // with AN set and hom-ref, we expect AN to be 2 for Aref/Aref, so 3 will fail
-        final Map<String, Object> attributesAN = new HashMap<String, Object>();
-        attributesAN.put(VCFConstants.ALLELE_NUMBER_KEY, "3");
-        final VariantContext vcANSet =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesAN, homRef);
-
-        // with AN set, one no-call (no-calls get ignored by getCalledChrCount() in VariantContext)
-        // we expect AN to be 1 for Aref/no-call, so 2 will fail
-        final Map<String, Object> attributesANNoCall = new HashMap<String, Object>();
-        attributesANNoCall.put(VCFConstants.ALLELE_NUMBER_KEY, "2");
-        final VariantContext vcANSetNoCall =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesANNoCall, homRefNoCall);
-
-        /** AC : allele count in genotypes, for each ALT allele, in the same order as listed **/
-        // with AC set but no ALTs, we expect a count of 0, so the wrong count will fail here
-        final Map<String, Object> attributesACWrongCount = new HashMap<String, Object>();
-        attributesACWrongCount.put(VCFConstants.ALLELE_COUNT_KEY, "2");
-        final VariantContext vcACWrongCount =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesACWrongCount, homRef);
-
-        // with AC set, two ALTs, but AC is not a list with count for each ALT
-        final Map<String, Object> attributesACTwoAlts = new HashMap<String, Object>();
-        attributesACTwoAlts.put(VCFConstants.ALLELE_COUNT_KEY, "1");
-        final VariantContext vcACSetTwoAlts =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACTwoAlts, hetVarTC);
-
-        // with AC set, two ALTs, and a list is correctly used, but wrong counts (we expect counts to be 1,1)
-        final Map<String, Object> attributesACTwoAltsWrongCount = new HashMap<String, Object>();
-        attributesACTwoAltsWrongCount.put(VCFConstants.ALLELE_COUNT_KEY, Arrays.asList("1", "2"));
-        final VariantContext vcACSetTwoAltsWrongCount =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACTwoAltsWrongCount, hetVarTC);
-
-        // with AC set, two ALTs, but only count for one ALT (we expect two items in the list: 1,1)
-        final Map<String, Object> attributesACTwoAltsOneAltCount = new HashMap<String, Object>();
-        attributesACTwoAltsOneAltCount.put(VCFConstants.ALLELE_COUNT_KEY, Arrays.asList("1"));
-        final VariantContext vcACSetTwoAltsOneAltCount =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACTwoAltsOneAltCount, hetVarTC);
-
-        // with AC set, no GT, two ALTs, but only count for one ALT (we expect two items in the list: 1,1)
-        final Map<String, Object> attributesACNoGtTwoAltsOneAltCount = new HashMap<String, Object>();
-        attributesACNoGtTwoAltsOneAltCount.put(VCFConstants.ALLELE_COUNT_KEY, Arrays.asList("1"));
-        final VariantContext vcACNoGtSetTwoAltsOneAltCount =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACNoGtTwoAltsOneAltCount, null);
-
-        // with AF set, two ALTs, but only frequency for one ALT (we expect two items in the list
-        final Map<String, Object> attributesAFTwoAltsWrongFreq = new HashMap<String, Object>();
-        attributesAFTwoAltsWrongFreq.put(VCFConstants.ALLELE_FREQUENCY_KEY, Arrays.asList("0.5"));
-        final VariantContext vcAFSetTwoAltsWrongFreq =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesAFTwoAltsWrongFreq, hetVarTC);
-
-        // with AF set, no GT, two ALTs, but only frequency for one ALT (we expect two items in the list
-        final Map<String, Object> attributesAFNoGtTwoAltsWrongCount = new HashMap<String, Object>();
-        attributesAFNoGtTwoAltsWrongCount.put(VCFConstants.ALLELE_FREQUENCY_KEY, Arrays.asList("0.5"));
-        final VariantContext vcAFNoGtSetTwoAltsWrongFreq =
-                createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesAFNoGtTwoAltsWrongCount, null);
-
-        return new Object[][]{
-                {vcANSet},
-                {vcANSetNoCall},
-                {vcACWrongCount},
-                {vcACSetTwoAlts},
-                {vcACSetTwoAltsWrongCount},
-                {vcACSetTwoAltsOneAltCount},
-                {vcACNoGtSetTwoAltsOneAltCount},
-                {vcAFSetTwoAltsWrongFreq},
-                {vcAFNoGtSetTwoAltsWrongFreq}
-        };
-    }
-    @Test(dataProvider = "testValidateChromosomeCountsFailureDataProvider", expectedExceptions = TribbleException.class)
-    public void testValidateChromosomeCountsFailure(final VariantContext vc) {
-        // validateChromosomeCounts throws exceptions if it fails, so no Asserts here...
-        vc.validateChromosomeCounts();
-    }
-    private VariantContext createValidateChromosomeCountsContext(final List<Allele> alleles, final Map<String, Object> attributes, final Genotype... genotypes) {
-        return createTestVariantContext(alleles, attributes, genotypes);
-    }
-
-
-    // the extraStrictValidation method calls the other validation methods
-    @DataProvider
-    public Object[][] testExtraStrictValidationDataProvider() {
-        // get the data providers for each of the passing tests of the individual methods
-        final Object[][] passingValidateReferenceBasesData = testValidateReferencesBasesDataProvider();
-        final Object[][] passingValidateRSIDsData = testValidateRSIDsDataProvider();
-        final Object[][] passingValidateAlternateAllelesData = testValidateAlternateAllelesDataProvider();
-        final Object[][] passingValidateChromosomeCountsData = testValidateChromosomeCountsDataProvider();
-
-        // the total number of tests we will run here is the sum of each of the test cases
-        final int numDataPoints =
-                passingValidateReferenceBasesData.length +
-                        passingValidateRSIDsData.length +
-                        passingValidateAlternateAllelesData.length +
-                        passingValidateChromosomeCountsData.length;
-
-        // create the data provider structure for this extra strict test
-        final Object[][] extraStrictData = new Object[numDataPoints][];
-
-        int testNum = 0;
-        for (final Object[] testRefBases : passingValidateReferenceBasesData) {
-            final VariantContext vc = (VariantContext) testRefBases[0];
-            final Allele refAllele = (Allele) testRefBases[1];
-            final Allele allele = (Allele) testRefBases[2];
-
-            // for this test, rsIds does not matter, so we hold it constant
-            extraStrictData[testNum++] = new Object[]{vc, refAllele, allele, null};
-        }
-
-        for (final Object[] testRsIDs : passingValidateRSIDsData) {
-            final VariantContext vc = (VariantContext) testRsIDs[0];
-            final Set<String> rsIDs = (Set<String>) testRsIDs[1];
-
-            // for this test, reportedReference and observedReference does not matter,
-            // so we hold it constant
-            extraStrictData[testNum++] = new Object[]{vc, Tref, T, rsIDs};
-        }
-
-        for (final Object[] testAlternateAlleles : passingValidateAlternateAllelesData) {
-            final VariantContext vc = (VariantContext) testAlternateAlleles[0];
-
-            // for this test, only VariantContext is used, so we hold
-            // reportedReference, observedReference and rsIds constant
-            extraStrictData[testNum++] = new Object[]{vc, Tref, T, null};
-        }
-
-        for (final Object[] testChromomeCounts : passingValidateChromosomeCountsData) {
-            final VariantContext vc = (VariantContext) testChromomeCounts[0];
-
-            // for this test, only VariantContext is used, so we hold
-            // reportedReference, observedReference and rsIds constant
-            extraStrictData[testNum++] = new Object[]{vc, Tref, T, null};
-        }
-
-        return extraStrictData;
-    }
-
-    @DataProvider(name = "serializationTestData")
-    public Object[][] getSerializationTestData() {
-        return new Object[][] {
-                { new File("src/test/resources/htsjdk/variant/HiSeq.10000.vcf"), new VCFCodec() },
-                { new File("src/test/resources/htsjdk/variant/serialization_test.bcf"), new BCF2Codec() }
-        };
-    }
-
-    @Test(dataProvider = "serializationTestData")
-    public void testSerialization( final File testFile, final FeatureCodec<VariantContext, ?> codec ) throws Exception {
-        final AbstractFeatureReader<VariantContext, ?> featureReader = AbstractFeatureReader.getFeatureReader(testFile.getAbsolutePath(), codec, false);
-        final VariantContext initialVC = featureReader.iterator().next();
-
-        final VariantContext vcDeserialized = TestUtil.serializeAndDeserialize(initialVC);
-
-        assertVariantContextsAreEqual(vcDeserialized, initialVC);
-    }
-
-    @Test(dataProvider = "testExtraStrictValidationDataProvider")
-    public void testExtraStrictValidation(final VariantContext vc, final Allele reportedReference, final Allele observedReference, final Set<String> rsIDs) {
-        // extraStrictValidation throws exceptions if it fails, so no Asserts here...
-        vc.extraStrictValidation(reportedReference, observedReference, rsIDs);
-    }
-    @DataProvider
-    public Object[][] testExtraStrictValidationFailureDataProvider() {
-        // get the data providers for each of the failure tests of the individual methods
-        final Object[][] failingValidateReferenceBasesData = testValidateReferencesBasesFailureDataProvider();
-        final Object[][] failingValidateRSIDsData = testValidateRSIDsFailureDataProvider();
-        final Object[][] failingValidateAlternateAllelesData = testValidateAlternateAllelesFailureDataProvider();
-        final Object[][] failingValidateChromosomeCountsData = testValidateChromosomeCountsFailureDataProvider();
-
-        // the total number of tests we will run here is the sum of each of the test cases
-        final int numDataPoints =
-                failingValidateReferenceBasesData.length +
-                        failingValidateRSIDsData.length +
-                        failingValidateAlternateAllelesData.length +
-                        failingValidateChromosomeCountsData.length;
-
-        // create the data provider structure for this extra strict test
-        final Object[][] extraStrictData = new Object[numDataPoints][];
-
-        int testNum = 0;
-        for (final Object[] testRefBases : failingValidateReferenceBasesData) {
-            final VariantContext vc = (VariantContext) testRefBases[0];
-            final Allele refAllele = (Allele) testRefBases[1];
-            final Allele allele = (Allele) testRefBases[2];
-
-            // for this test, rsIds does not matter, so we hold it constant
-            extraStrictData[testNum++] = new Object[]{vc, refAllele, allele, null};
-        }
-
-        for (final Object[] testRsIDs : failingValidateRSIDsData) {
-            final VariantContext vc = (VariantContext) testRsIDs[0];
-            final Set<String> rsIDs = (Set<String>) testRsIDs[1];
-
-            // for this test, reportedReference and observedReference does not matter,
-            // so we hold it constant
-            extraStrictData[testNum++] = new Object[]{vc, Tref, T, rsIDs};
-        }
-
-        for (final Object[] testAlternateAlleles : failingValidateAlternateAllelesData) {
-            final VariantContext vc = (VariantContext) testAlternateAlleles[0];
-
-            // for this test, only VariantContext is used, so we hold
-            // reportedReference, observedReference and rsIds constant
-            extraStrictData[testNum++] = new Object[]{vc, Tref, T, null};
-        }
-
-        for (final Object[] testChromomeCounts : failingValidateChromosomeCountsData) {
-            final VariantContext vc = (VariantContext) testChromomeCounts[0];
-
-            // for this test, only VariantContext is used, so we hold
-            // reportedReference, observedReference and rsIds constant
-            extraStrictData[testNum++] = new Object[]{vc, Tref, T, null};
-        }
-
-        return extraStrictData;
-    }
-    @Test(dataProvider = "testExtraStrictValidationFailureDataProvider", expectedExceptions = TribbleException.class)
-    public void testExtraStrictValidationFailure(final VariantContext vc, final Allele reportedReference, final Allele observedReference, final Set<String> rsIDs) {
-        // extraStrictValidation throws exceptions if it fails, so no Asserts here...
-        vc.extraStrictValidation(reportedReference, observedReference, rsIDs);
-    }
-    
-    
-    @DataProvider(name = "structuralVariationsTestData")
-    public Object[][] getStructuralVariationsTestData() {
-        return new Object[][] {
-         {new File("src/test/resources/htsjdk/variant/structuralvariants.vcf")}
-        };
-    }
-    
-    @Test(dataProvider = "structuralVariationsTestData")
-    public void testExtractStructuralVariationsData(final File vcfFile) {
-        VCFFileReader reader = null;
-        CloseableIterator<VariantContext> iter = null;
-        try {
-            reader = new VCFFileReader(vcfFile , false );
-            iter = reader.iterator();
-            while(iter.hasNext()) {
-                final VariantContext ctx = iter.next();
-                final StructuralVariantType st = ctx.getStructuralVariantType();
-                Assert.assertNotNull(st);
-            }
-        } finally {
-            CloserUtil.close(iter);
-            CloserUtil.close(reader);
-        }
-    }
-
-    @Test
-    public void testGetAttributeAsIntList() {
-        final VariantContext context = basicBuilder
-                .attribute("Empty", new int[0])
-                .attribute("DefaultIntegerList", new int[5])
-                .attribute("ListWithMissing", new Object[]{1, null, null})
-                .attribute("IntegerList", new int[]{0, 1, 2, 3})
-                .attribute("DoubleList", new double[]{1.8, 1.6, 2.1})
-                .attribute("StringList", new String[]{"1", "2"})
-                .attribute("NotNumeric", new String[]{"A", "B"})
-                .make();
-        // test an empty value
-        Assert.assertTrue(context.getAttributeAsIntList("Empty", 5).isEmpty());
-        // test as integer
-        Assert.assertEquals(context.getAttributeAsIntList("DefaultIntegerList", 5), Arrays.asList(0, 0, 0, 0, 0));
-        Assert.assertEquals(context.getAttributeAsIntList("ListWithMissing", 5), Arrays.asList(1, 5, 5));
-        Assert.assertEquals(context.getAttributeAsIntList("IntegerList", 5), Arrays.asList(0, 1, 2, 3));
-        Assert.assertEquals(context.getAttributeAsIntList("DoubleList", 5), Arrays.asList(1, 1, 2));
-        Assert.assertEquals(context.getAttributeAsIntList("StringList", 5), Arrays.asList(1, 2));
-        Assert.assertThrows(() -> context.getAttributeAsIntList("NotNumeric", 5));
-        // test the case of a missing key
-        Assert.assertTrue(context.getAttributeAsIntList("MissingList", 5).isEmpty());
-    }
-
-    @Test
-    public void testGetAttributeAsDoubleList() {
-        final VariantContext context = basicBuilder
-                .attribute("Empty", new int[0])
-                .attribute("DefaultIntegerList", new int[5])
-                .attribute("ListWithMissing", new Object[]{1, null, null})
-                .attribute("IntegerList", new int[]{0, 1, 2, 3})
-                .attribute("DoubleList", new double[]{1.8, 1.6, 2.1})
-                .attribute("StringList", new String[]{"1", "2"})
-                .attribute("NotNumeric", new String[]{"A", "B"})
-                .make();
-        // test an empty value
-        Assert.assertTrue(context.getAttributeAsDoubleList("Empty", 5).isEmpty());
-        // test as double
-        Assert.assertEquals(context.getAttributeAsDoubleList("DefaultIntegerList", 5), Arrays.asList(0d, 0d, 0d, 0d, 0d));
-        Assert.assertEquals(context.getAttributeAsDoubleList("ListWithMissing", 5), Arrays.asList(1d, 5d, 5d));
-        Assert.assertEquals(context.getAttributeAsDoubleList("IntegerList", 5), Arrays.asList(0d, 1d, 2d, 3d));
-        Assert.assertEquals(context.getAttributeAsDoubleList("DoubleList", 5), Arrays.asList(1.8, 1.6, 2.1));
-        Assert.assertEquals(context.getAttributeAsDoubleList("StringList", 5), Arrays.asList(1d, 2d));
-        Assert.assertThrows(() -> context.getAttributeAsDoubleList("NotNumeric", 5));
-        // test the case of a missing key
-        Assert.assertTrue(context.getAttributeAsDoubleList("MissingList", 5).isEmpty());
-    }
-
-    @Test
-    public void testGetAttributeAsStringList() {
-        final VariantContext context = basicBuilder
-                .attribute("Empty", new int[0])
-                .attribute("DefaultIntegerList", new int[5])
-                .attribute("ListWithMissing", new Object[]{1, null, null})
-                .attribute("IntegerList", new int[]{0, 1, 2, 3})
-                .attribute("DoubleList", new double[]{1.8, 1.6, 2.1})
-                .attribute("StringList", new String[]{"1", "2"})
-                .attribute("NotNumeric", new String[]{"A", "B"})
-                .make();
-        // test an empty value
-        Assert.assertTrue(context.getAttributeAsStringList("Empty", "empty").isEmpty());
-        // test as string
-        Assert.assertEquals(context.getAttributeAsStringList("DefaultIntegerList", "empty"), Arrays.asList("0", "0", "0", "0", "0"));
-        Assert.assertEquals(context.getAttributeAsStringList("ListWithMissing", "empty"), Arrays.asList("1", "empty", "empty"));
-        Assert.assertEquals(context.getAttributeAsStringList("IntegerList", "empty"), Arrays.asList("0", "1", "2", "3"));
-        Assert.assertEquals(context.getAttributeAsStringList("DoubleList", "empty"), Arrays.asList("1.8", "1.6", "2.1"));
-        Assert.assertEquals(context.getAttributeAsStringList("StringList", "empty"), Arrays.asList("1", "2"));
-        Assert.assertEquals(context.getAttributeAsStringList("NotNumeric", "empty"), Arrays.asList("A", "B"));
-        // test the case of a missing key
-        Assert.assertTrue(context.getAttributeAsStringList("MissingList", "empty").isEmpty());
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/VariantJEXLContextUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/VariantJEXLContextUnitTest.java
deleted file mode 100644
index 78bf565..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/VariantJEXLContextUnitTest.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.tribble.SimpleFeature;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.VariantContextUtils.JexlVCMatchExp;
-
-import htsjdk.variant.vcf.VCFConstants;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.*;
-
-
-/**
- * 
- * @author aaron
- * @author bimber
- * @author hyq
- *
- *
- * Test out parts of the VariantJEXLContext and GenotypeJEXLContext
- */
-public class VariantJEXLContextUnitTest extends VariantBaseTest {
-
-    private static final VariantContextUtils.JexlVCMatchExp exp
-            = new VariantContextUtils.JexlVCMatchExp("name", VariantContextUtils.engine.get().createExpression("QUAL > 500.0"));
-
-    private static final JexlVCMatchExp missingValueExpression = new VariantContextUtils.JexlVCMatchExp(
-            "Zis10", VariantContextUtils.engine.get().createExpression("Z==10"));
-
-
-    // SNP alleles: A[ref]/T[alt] at chr1:10. One (crappy) sample, one (bare minimum) VC.
-    private static final SimpleFeature eventLoc = new SimpleFeature("chr1", 10, 10);
-    private static final Allele Aref = Allele.create("A", true);
-    private static final Allele Talt = Allele.create("T");
-    private static final Genotype gt = new GenotypeBuilder("DummySample", Arrays.asList(Aref, Talt))
-                                            .phased(false)
-                                            .DP(2)
-                                            .noGQ()
-                                            .noAD()
-                                            .noPL()
-                                            .filter("lowDP")
-                                            .attribute("WA", "whatEver")
-                                            .make();
-    private static final VariantContext vc = new VariantContextBuilder("test", eventLoc.getContig(), eventLoc.getStart(), eventLoc.getEnd(), Arrays.asList(Aref, Talt))
-                                                .genotypes(gt)
-                                                .noID()
-                                                .filter("q10")
-                                                .attribute("attr", "notEmpty")
-                                                .make();
-
-    //////////////////////// testing JEXLMap ////////////////////////
-    @Test
-    public void testGetValue() {
-        final Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap = getJEXLMap();
-
-        // make sure the context has a value
-        Assert.assertTrue(!jexlMap.isEmpty());
-        Assert.assertEquals(jexlMap.size(), 1);
-
-        // eval our known expression
-        Assert.assertTrue(!jexlMap.get(exp));
-    }
-
-    @Test(dataProvider = "getMissingValueTestData")
-    public void testMissingBehaviorThroughMatch(VariantContext vc, JexlMissingValueTreatment missingValueTreatment, boolean expected, Class<? extends Exception> expectedException){
-        if(expectedException == null) {
-            Assert.assertEquals(VariantContextUtils.match(vc, null, missingValueExpression, missingValueTreatment), expected);
-        } else {
-            Assert.assertThrows(expectedException, () -> VariantContextUtils.match(vc, null, missingValueExpression, missingValueTreatment));
-        }
-    }
-
-    @Test(dataProvider = "getMissingValueTestData")
-    public void testMissingBehavior(VariantContext vc, JexlMissingValueTreatment missingValueTreatment, boolean expected, Class<? extends Exception> expectedException){
-        final JEXLMap jexlMap = new JEXLMap(Collections.singletonList(missingValueExpression), vc, null, missingValueTreatment);
-        if(expectedException == null) {
-            Assert.assertEquals((boolean) jexlMap.get(missingValueExpression), expected);
-        } else {
-            Assert.assertThrows(expectedException, () -> jexlMap.get(missingValueExpression));
-        }
-    }
-
-    @DataProvider
-    public Object[][] getMissingValueTestData(){
-        final List<Allele> alleles = Arrays.asList(Aref, Talt);
-        VariantContextBuilder vcb = new VariantContextBuilder("test", "chr1", 10, 10, alleles);
-        VariantContext noZ = vcb.make();
-        VariantContext hasZ = vcb.attribute("Z", 0).make();
-
-        return new Object[][]{
-                {noZ, JEXLMap.DEFAULT_MISSING_VALUE_TREATMENT, false, null},
-                {hasZ, JEXLMap.DEFAULT_MISSING_VALUE_TREATMENT, false, null}, //the value isn't missing but the expression is false
-                {noZ, JexlMissingValueTreatment.TREAT_AS_MATCH, true, null},
-                {hasZ, JexlMissingValueTreatment.TREAT_AS_MATCH, false, null}, //the value isn't missing but the expression is false
-                {noZ, JexlMissingValueTreatment.TREAT_AS_MISMATCH, false, null},
-                {hasZ, JexlMissingValueTreatment.TREAT_AS_MISMATCH, false, null},
-                {noZ, JexlMissingValueTreatment.THROW, false, IllegalArgumentException.class},
-                {hasZ, JexlMissingValueTreatment.THROW, false, null}
-        };
-    }
-
-    // Testing the new 'FT' and 'isPassFT' expressions in the JEXL map
-    @Test
-    public void testJEXLGenotypeFilters() {
-    	
-    	final JexlVCMatchExp passFlag = new VariantContextUtils.JexlVCMatchExp(
-    			"passFlag", VariantContextUtils.engine.get().createExpression("isPassFT==1"));
-    	final JexlVCMatchExp passFT = new VariantContextUtils.JexlVCMatchExp(
-    			"FTPASS", VariantContextUtils.engine.get().createExpression("FT==\"PASS\""));
-    	final JexlVCMatchExp failFT = new VariantContextUtils.JexlVCMatchExp(
-    			"FTBadCall", VariantContextUtils.engine.get().createExpression("FT==\"BadCall\""));
-        final JexlVCMatchExp AD1 = new VariantContextUtils.JexlVCMatchExp(
-                "AD1", VariantContextUtils.engine.get().createExpression("g.hasAD() && g.getAD().0==1"));
-        final JexlVCMatchExp AD2 = new VariantContextUtils.JexlVCMatchExp(
-                "AD2", VariantContextUtils.engine.get().createExpression("g.hasAD() && g.getAD().1==2"));
-
-    	final List<JexlVCMatchExp> jexlTests = Arrays.asList(passFlag, passFT, failFT, AD1, AD2);
-
-    	final List<Allele> alleles = Arrays.asList(Aref, Talt);
-    	final VariantContextBuilder vcb = new VariantContextBuilder("test", "chr1", 10, 10, alleles);
-        final VariantContext vcPass = vcb.filters("PASS").make();
-        final VariantContext vcFail = vcb.filters("BadVariant").make();
-        final GenotypeBuilder gb = new GenotypeBuilder("SAMPLE", alleles);
-
-        final Genotype genoNull = gb.make();
-        final Genotype genoPass = gb.filters("PASS").AD(new int[]{1,2}).DP(3).make();
-        final Genotype genoFail = gb.filters("BadCall").AD(null).DP(0).make();
-
-        Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap;
-
-        // Create the JEXL Maps using the combinations above of vc* and geno*
-        jexlMap = new JEXLMap(jexlTests, vcPass, genoPass);
-        // make sure the context has a value
-        Assert.assertTrue(!jexlMap.isEmpty());
-        Assert.assertEquals(jexlMap.size(), 5);
-        Assert.assertTrue(jexlMap.get(passFlag));
-        Assert.assertTrue(jexlMap.get(passFT));
-        Assert.assertFalse(jexlMap.get(failFT));
-        Assert.assertTrue(jexlMap.get(AD1));
-        Assert.assertTrue(jexlMap.get(AD2));
-
-        jexlMap = new JEXLMap(jexlTests, vcPass, genoFail);
-        // make sure the context has a value
-        Assert.assertTrue(!jexlMap.isEmpty());
-        Assert.assertEquals(jexlMap.size(), 5);
-        Assert.assertFalse(jexlMap.get(passFlag));
-        Assert.assertFalse(jexlMap.get(passFT));
-        Assert.assertTrue(jexlMap.get(failFT));
-        Assert.assertFalse(jexlMap.get(AD1));
-        Assert.assertFalse(jexlMap.get(AD2));
-
-        // Null genotype filter is equivalent to explicit "FT==PASS"
-        jexlMap = new JEXLMap(jexlTests, vcPass, genoNull);
-        // make sure the context has a value
-        Assert.assertTrue(!jexlMap.isEmpty());
-        Assert.assertEquals(jexlMap.size(), 5);
-        Assert.assertTrue(jexlMap.get(passFlag));
-        Assert.assertTrue(jexlMap.get(passFT));
-        Assert.assertFalse(jexlMap.get(failFT));
-        Assert.assertFalse(jexlMap.get(AD1));
-        Assert.assertFalse(jexlMap.get(AD2));
-        
-        // Variant-level filters should have no effect here
-        jexlMap = new JEXLMap(jexlTests, vcFail, genoPass);
-        // make sure the context has a value
-        Assert.assertTrue(!jexlMap.isEmpty());
-        Assert.assertEquals(jexlMap.size(), 5);
-        Assert.assertTrue(jexlMap.get(passFlag));
-        Assert.assertTrue(jexlMap.get(passFT));
-        Assert.assertFalse(jexlMap.get(failFT));
-        
-        jexlMap = new JEXLMap(jexlTests, vcFail, genoFail);
-        // make sure the context has a value
-        Assert.assertTrue(!jexlMap.isEmpty());
-        Assert.assertEquals(jexlMap.size(), 5);
-        Assert.assertFalse(jexlMap.get(passFlag));
-        Assert.assertFalse(jexlMap.get(passFT));
-        Assert.assertTrue(jexlMap.get(failFT));
-        
-        jexlMap = new JEXLMap(jexlTests, vcFail, genoNull);
-        // make sure the context has a value
-        Assert.assertTrue(!jexlMap.isEmpty());
-        Assert.assertEquals(jexlMap.size(), 5);
-        Assert.assertTrue(jexlMap.get(passFlag));
-        Assert.assertTrue(jexlMap.get(passFT));
-        Assert.assertFalse(jexlMap.get(failFT));
-    }
-
-    @Test(expectedExceptions=UnsupportedOperationException.class)
-    public void testContainsValue() {
-        final Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap = getJEXLMap();
-
-        jexlMap.containsValue(exp);
-    }
-
-    @Test(expectedExceptions=UnsupportedOperationException.class)
-    public void testRemove() {
-        final Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap = getJEXLMap();
-
-        jexlMap.remove(exp);
-    }
-
-    @Test(expectedExceptions=UnsupportedOperationException.class)
-    public void testEntrySet() {
-        final Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap = getJEXLMap();
-
-        jexlMap.entrySet();
-    }
-
-    @Test(expectedExceptions=UnsupportedOperationException.class)
-    public void testClear() {
-        final Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap = getJEXLMap();
-
-        jexlMap.clear();
-    }
-
-    /**
-     * @return a JEXLMap for use by actual tests
-     */
-    private JEXLMap getJEXLMap() {
-        return new JEXLMap(Collections.singletonList(exp), vc);
-    }
-
-    //////////////////////// testing GenotypeJEXLContext and its base VariantJEXLContext ////////////////////////
-
-    /**
-     * Test the various if-else cases in {@link GenotypeJEXLContext#get(String)} and {@link VariantJEXLContext#get(String)}
-     * {@link GenotypeJEXLContext#has(String)} is not tested because it simply checks if get() will return null.
-     */
-    @Test
-    public void testVariantJEXLContextGetMethod() {
-
-        final VariantJEXLContext jEXLContext = getJEXLContext();
-
-        // This is not tested because there's no simple test for equality for VariantContext,
-        // except exhaustive attributes testing, which is what happening below.
-//        Assert.assertEquals(jEXLContext.get("vc"), new VariantContextBuilder("test", "chr1", 10, 10, Arrays.asList(Aref, Talt)).make());
-
-        // GenotypeJEXLContext
-        Assert.assertTrue( ((Genotype) jEXLContext.get("g")).sameGenotype(gt, false));
-        Assert.assertEquals(jEXLContext.get("isHom"), VariantJEXLContext.false_string);
-        Assert.assertEquals(jEXLContext.get("isHomRef"), VariantJEXLContext.false_string);
-        Assert.assertEquals(jEXLContext.get("isHomVar"), VariantJEXLContext.false_string);
-        Assert.assertEquals(jEXLContext.get("isHet"), VariantJEXLContext.true_string);
-        Assert.assertEquals(jEXLContext.get("isCalled"), VariantJEXLContext.true_string);
-        Assert.assertEquals(jEXLContext.get("isNoCall"), VariantJEXLContext.false_string);
-        Assert.assertEquals(jEXLContext.get("isMixed"), VariantJEXLContext.false_string);
-        Assert.assertEquals(jEXLContext.get("isAvailable"), VariantJEXLContext.true_string);
-        Assert.assertEquals(jEXLContext.get("isPassFT"), VariantJEXLContext.false_string);
-        Assert.assertEquals(jEXLContext.get(VCFConstants.GENOTYPE_KEY), gt.getGenotypeString());
-        Assert.assertEquals(jEXLContext.get(VCFConstants.GENOTYPE_FILTER_KEY),"lowDP");
-        Assert.assertEquals(jEXLContext.get(VCFConstants.GENOTYPE_QUALITY_KEY),Integer.valueOf(VCFConstants.MISSING_GENOTYPE_QUALITY_v3));
-        Assert.assertEquals(jEXLContext.get("WA"),"whatEver"); // hasAnyAttribute->getAnyAttribute
-        Assert.assertEquals(jEXLContext.get("lowDP"),VariantJEXLContext.true_string); // getFilters()!=null
-
-        // VariantJEXLContext
-        Assert.assertEquals(jEXLContext.get("CHROM"), eventLoc.getContig());
-        Assert.assertEquals(jEXLContext.get("POS"), eventLoc.getStart());
-        Assert.assertEquals(jEXLContext.get("TYPE"), VariantContext.Type.SNP.name());
-        Assert.assertEquals(jEXLContext.get("QUAL"), -10.0); // because of noGQ() when building the genotype
-        Assert.assertEquals(jEXLContext.get("ALLELES"), vc.getAlleles());
-        Assert.assertEquals(jEXLContext.get("N_ALLELES"), vc.getNAlleles());
-        Assert.assertEquals(jEXLContext.get("FILTER"), VariantJEXLContext.true_string);
-        Assert.assertEquals(jEXLContext.get("homRefCount"), 0);
-        Assert.assertEquals(jEXLContext.get("homVarCount"), 0);
-        Assert.assertEquals(jEXLContext.get("hetCount"), 1);
-        Assert.assertEquals(jEXLContext.get("attr"), "notEmpty"); // hasAnyAttribute->getAnyAttribute
-        Assert.assertEquals(jEXLContext.get("q10"), VariantJEXLContext.true_string); // getFilters()!=null
-
-        // all if-else fall through
-        Assert.assertNull(jEXLContext.get("mustBeNull"));
-    }
-
-    @Test(expectedExceptions=UnsupportedOperationException.class)
-    public void testVariantJEXLContextSetMethodException(){
-        getJEXLContext().set("noMatterWhat", "willBlowup");
-    }
-
-    /**
-     * @return a GenotypeJEXLContext for use by actual tests
-     */
-    private VariantJEXLContext getJEXLContext(){
-        return new GenotypeJEXLContext(vc, gt);
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/AllFailFilter.java b/src/test/java/htsjdk/variant/variantcontext/filter/AllFailFilter.java
deleted file mode 100644
index d62e146..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/AllFailFilter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- *  A trivial filter (always false) that can be used in testing
- *
- *  @author Yossi Farjoun
- */
-public class AllFailFilter implements VariantContextFilter {
-
-    /* @return false so that all VCs are filtered out. */
-    @Override
-    public boolean test(final VariantContext record) {
-
-        return false;
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/AllPassFilter.java b/src/test/java/htsjdk/variant/variantcontext/filter/AllPassFilter.java
deleted file mode 100644
index b29aa51..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/AllPassFilter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- *  A trivial filter (always true) that can be used in testing
- *
- *  @author Yossi Farjoun
- */
-public class AllPassFilter implements VariantContextFilter {
-
-    /* @return true so that all VCs are kept. */
-    @Override
-    public boolean test(final VariantContext record) {
-
-        return true;
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/CompoundFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/CompoundFilterTest.java
deleted file mode 100644
index 0a49853..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/CompoundFilterTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Created by farjoun on 9/9/15.
- */
-public class CompoundFilterTest {
-
-    static AllPassFilter pass = new AllPassFilter();
-    static AllFailFilter fail = new AllFailFilter();
-
-    static Allele refA = Allele.create("A", true);
-    static Allele G = Allele.create("G", false);
-
-    static VariantContext vc = new VariantContextBuilder("dummy", "chr1", 1, 1, Arrays.asList(refA, G)).make();
-
-    @DataProvider
-    Iterator<Object[]> testCompoundFilterProvider() {
-        final List<Object[]> filters = new ArrayList<Object[]>(10);
-
-        // requireAll = TRUE
-        { // all pass
-            final CompoundFilter compoundFilter = new CompoundFilter(true);
-            compoundFilter.add(pass);
-            compoundFilter.add(pass);
-            compoundFilter.add(pass);
-            filters.add(new Object[]{compoundFilter, true});
-        }
-        { // one fail
-            final CompoundFilter compoundFilter = new CompoundFilter(true);
-            compoundFilter.add(pass);
-            compoundFilter.add(fail);
-            compoundFilter.add(pass);
-            filters.add(new Object[]{compoundFilter, false});
-        }
-        { // empty
-            final CompoundFilter compoundFilter = new CompoundFilter(true);
-            filters.add(new Object[]{compoundFilter, true});
-        }
-
-        //requireAll = FALSE
-        { // all fail
-            final CompoundFilter compoundFilter = new CompoundFilter(false);
-            compoundFilter.add(fail);
-            compoundFilter.add(fail);
-            compoundFilter.add(fail);
-            filters.add(new Object[]{compoundFilter, false});
-        }
-        { // one fail
-            final CompoundFilter compoundFilter = new CompoundFilter(false);
-            compoundFilter.add(pass);
-            compoundFilter.add(fail);
-            compoundFilter.add(pass);
-            filters.add(new Object[]{compoundFilter, true});
-        }
-        { // empty
-            final CompoundFilter compoundFilter = new CompoundFilter(false);
-            filters.add(new Object[]{compoundFilter, true});
-        }
-        return filters.iterator();
-    }
-
-    @Test(dataProvider = "testCompoundFilterProvider")
-    public void testCompoundFilter(final VariantContextFilter filter, final boolean shouldPass) {
-        Assert.assertEquals(filter.test(vc), shouldPass, filter.toString());
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIteratorTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIteratorTest.java
deleted file mode 100644
index d8decfd..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIteratorTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFFileReader;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Tests for testing the (VariantContext)FilteringVariantContextIterator, and the HeterozygosityFilter
- */
-
-public class FilteringVariantContextIteratorTest {
-    final File testDir = new File("src/test/resources/htsjdk/variant");
-
-    @DataProvider
-    public Object [][] filteringIteratorData() {
-        return new Object[][] {
-                {new HeterozygosityFilter(true, "NA00001"), 2},
-                {new HeterozygosityFilter(false, "NA00001"), 3},
-                {new HeterozygosityFilter(true, null), 2},
-                {new HeterozygosityFilter(false, null), 3},
-                {new AllPassFilter(), 5},
-                {new HeterozygosityFilter(true, "NA00002"), 4},
-                {new HeterozygosityFilter(false, "NA00002"), 1},
-        };
-    }
-
-    @Test(dataProvider = "filteringIteratorData")
-    public void testFilteringIterator(final VariantContextFilter filter, final int expectedCount) {
-
-        final File vcf = new File(testDir,"ex2.vcf");
-        final VCFFileReader vcfReader = new VCFFileReader(vcf, false);
-        final FilteringVariantContextIterator filteringIterator = new FilteringVariantContextIterator(vcfReader.iterator(), filter);
-        int count = 0;
-
-        for(final VariantContext vc : filteringIterator) {
-            count++;
-        }
-
-        Assert.assertEquals(count, expectedCount);
-    }
-
-    @DataProvider
-    public Object [][] badSampleData() {
-        return new Object[][] {
-                {"ex2.vcf", "DOES_NOT_EXIST"},
-                {"breakpoint.vcf", null},
-        };
-    }
-
-    @Test(dataProvider = "badSampleData", expectedExceptions = IllegalArgumentException.class)
-    public void testMissingSample(final String file, final String sample) {
-
-        final File vcf = new File(testDir, file);
-        final VCFFileReader vcfReader = new VCFFileReader(vcf, false);
-        final HeterozygosityFilter heterozygosityFilter = new HeterozygosityFilter(true, sample);
-
-        new FilteringVariantContextIterator(vcfReader.iterator(), heterozygosityFilter).next();
-    }
-}
-
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilterTest.java
deleted file mode 100644
index 809133f..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilterTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-public class GenotypeQualityFilterTest {
-
-    Allele refA = Allele.create("A", true);
-    Allele G = Allele.create("G", false);
-
-    @DataProvider
-    public Iterator<Object[]> genotypeProvider() {
-
-        final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Arrays.asList(refA, G));
-        final GenotypeBuilder gt_builder = new GenotypeBuilder("test").alleles(Arrays.asList(refA, G));
-        final List<Object[]> variants = new ArrayList<Object[]>(10);
-
-        //without gq
-        variants.add(new Object[]{vc_builder.genotypes(gt_builder.make()).make(), null, false});
-        variants.add(new Object[]{vc_builder.genotypes(gt_builder.make()).make(), "test", false});
-
-        //without sample
-        variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ( 1).make()).make(), null, false});
-        variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ(10).make()).make(), null, true});
-        variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ(20).make()).make(), null, true});
-
-        //with sample
-        variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ( 1).make()).make(), "test", false});
-        variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ(10).make()).make(), "test", true});
-        variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ(20).make()).make(), "test", true});
-
-        return variants.iterator();
-    }
-
-    @Test(dataProvider = "genotypeProvider")
-    public void testHetFilter(final VariantContext vc, final String sample, final boolean shouldPass) {
-        final GenotypeQualityFilter gqFilter = getFilter(sample);
-
-        Assert.assertEquals(gqFilter.test(vc), shouldPass, vc.toString());
-    }
-
-    @DataProvider(name = "badSamplesProvider")
-    public Iterator<Object[]> badSamplesProvider() {
-
-        final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Arrays.asList(refA, G));
-        final GenotypeBuilder gt_builder = new GenotypeBuilder();
-        final List<Object[]> hets = new ArrayList<Object[]>(10);
-
-        hets.add(new Object[]{vc_builder.make(), null});
-        hets.add(new Object[]{vc_builder.genotypes(Arrays.asList(gt_builder.name("test1").make(), gt_builder.name("test2").make())).make(), "notNull"});
-        hets.add(new Object[]{vc_builder.genotypes(Collections.singleton(gt_builder.name("This").make())).make(), "That"});
-
-        return hets.iterator();
-    }
-
-    @Test(dataProvider = "badSamplesProvider", expectedExceptions = IllegalArgumentException.class)
-    public void testbadSample(final VariantContext vc, final String sample) {
-        final GenotypeQualityFilter gqFilter = getFilter(sample);
-
-        //should fail
-        gqFilter.test(vc);
-    }
-
-    private GenotypeQualityFilter getFilter(String sample){
-        if (sample == null) {
-            return new GenotypeQualityFilter(10);
-        } else {
-            return new GenotypeQualityFilter(10, sample);
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilterTest.java
deleted file mode 100644
index b4cd3a8..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilterTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-public class HeterozygosityFilterTest {
-
-    Allele refA = Allele.create("A", true);
-    Allele G = Allele.create("G", false);
-
-    @DataProvider(name = "Hets")
-    public Iterator<Object[]> hetsProvider() {
-
-        final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Arrays.asList(refA, G));
-        final GenotypeBuilder gt_builder = new GenotypeBuilder("test");
-        final List<Object[]> hets = new ArrayList<Object[]>(10);
-
-        hets.add(new Object[]{vc_builder.genotypes(gt_builder.alleles(Arrays.asList(refA, G)).make()).make(), null, true});
-        hets.add(new Object[]{vc_builder.genotypes(gt_builder.alleles(Arrays.asList(refA, G)).make()).make(), "test", true});
-
-        //non-variant
-        hets.add(new Object[]{vc_builder.genotypes(gt_builder.alleles(Collections.singletonList(refA)).make()).make(), "test", false});
-        hets.add(new Object[]{vc_builder.genotypes(gt_builder.alleles(Collections.singletonList(refA)).make()).make(), null, false});
-
-        return hets.iterator();
-    }
-
-    @Test(dataProvider = "Hets")
-    public void testHetFilter(final VariantContext vc, final String sample, final boolean shouldPass) {
-        final HeterozygosityFilter hf = getFilter(shouldPass, sample);
-
-        Assert.assertTrue(hf.test(vc));
-    }
-
-    @DataProvider(name = "badSamplesProvider")
-    public Iterator<Object[]> badSamplesProvider() {
-
-        final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Arrays.asList(refA, G));
-        final GenotypeBuilder gt_builder = new GenotypeBuilder();
-        final List<Object[]> hets = new ArrayList<Object[]>(10);
-
-        hets.add(new Object[]{vc_builder.make(), null});
-        hets.add(new Object[]{vc_builder.genotypes(Arrays.asList(gt_builder.name("test1").make(), gt_builder.name("test2").make())).make(), "notNull"});
-        hets.add(new Object[]{vc_builder.genotypes(Collections.singleton(gt_builder.name("This").make())).make(), "That"});
-
-        return hets.iterator();
-    }
-
-    @Test(dataProvider = "badSamplesProvider", expectedExceptions = IllegalArgumentException.class)
-    public void testbadSample(final VariantContext vc, final String sample) {
-        final HeterozygosityFilter hf = getFilter(true, sample);
-
-        //should fail
-        hf.test(vc);
-    }
-
-    @DataProvider(name = "variantsProvider")
-    public Object[][] variantsProvider() {
-
-        final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Arrays.asList(refA, G));
-        final GenotypeBuilder gt_builder = new GenotypeBuilder("test");
-        final List<VariantContext> vcs = new ArrayList<VariantContext>(10);
-
-        //hets:
-        vcs.add(vc_builder.genotypes(gt_builder.alleles(Arrays.asList(refA, G)).make()).make());
-        vcs.add(vc_builder.loc("chr1", 10, 10).genotypes(gt_builder.alleles(Arrays.asList(refA, G)).make()).make());
-
-        //non-variant:
-        vcs.add(vc_builder.loc("chr1", 20, 20).genotypes(gt_builder.alleles(Collections.singletonList(refA)).make()).make());
-        vcs.add(vc_builder.loc("chr1", 30, 30).genotypes(gt_builder.alleles(Collections.singletonList(refA)).make()).make());
-
-        return new Object[][]{new Object[]{vcs.iterator(), new int[]{1, 10}}};
-    }
-
-    @Test(dataProvider = "variantsProvider")
-    public void testFilteringIterator(final Iterator<VariantContext> vcs, final int[] passingPositions) {
-        final Iterator<VariantContext> filteringIterator = new FilteringVariantContextIterator(vcs, new HeterozygosityFilter(true, "test"));
-
-        int i = 0;
-        while (filteringIterator.hasNext()) {
-            final VariantContext vc = filteringIterator.next();
-            Assert.assertTrue(i < passingPositions.length);
-            Assert.assertEquals(vc.getStart(), passingPositions[i++]);
-        }
-    }
-
-    private HeterozygosityFilter getFilter(final boolean shouldPass, String sample) {
-        if (sample == null) {
-            return new HeterozygosityFilter(shouldPass);
-        } else {
-            return new HeterozygosityFilter(shouldPass, sample);
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilterTest.java
deleted file mode 100644
index 3993b79..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilterTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.vcf.VCFFileReader;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * @author Pierre Lindenbaum PhD Institut du Thorax - INSERM - Nantes - France
- */
-
-public class JavascriptVariantFilterTest {
-    final File testDir = new File("src/test/resources/htsjdk/variant");
-
-    @DataProvider
-    public Object[][] jsData() {
-        return new Object[][] {
-                { "ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf", "variantFilter01.js",61 },
-                { "ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf", "variantFilter02.js",38 }, };
-    }
-
-    @Test(dataProvider = "jsData")
-    public void testJavascriptFilters(final String vcfFile, final String javascriptFile, final int expectCount) {
-        final File vcfInput = new File(testDir, vcfFile);
-        final File jsInput = new File(testDir, javascriptFile);
-        final VCFFileReader vcfReader = new VCFFileReader(vcfInput, false);
-        final JavascriptVariantFilter filter;
-        try {
-            filter = new JavascriptVariantFilter(jsInput, vcfReader.getFileHeader());
-        } catch (IOException err) {
-            Assert.fail("cannot read script "+jsInput, err);
-            vcfReader.close();
-            return;
-        }
-        final FilteringVariantContextIterator iter = new FilteringVariantContextIterator(vcfReader.iterator(), filter);
-        int count = 0;
-        while (iter.hasNext()) {
-            iter.next();
-            ++count;
-        }
-        iter.close();
-        vcfReader.close();
-        Assert.assertEquals(count, expectCount, "Expected number of variants " + expectCount + " but got " + count);
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/PassingVariantFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/PassingVariantFilterTest.java
deleted file mode 100644
index 3cbb60c..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/PassingVariantFilterTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Created by farjoun on 9/10/15.
- */
-public class PassingVariantFilterTest {
-    Allele refA = Allele.create("A", true);
-    Allele G = Allele.create("G", false);
-
-    @DataProvider()
-    public Iterator<Object[]> variantProvider() {
-
-        final VariantContextBuilder vc_builder = new VariantContextBuilder("test", "chr1", 1, 1, Arrays.asList(refA, G));
-        final List<Object[]> variants = new ArrayList<Object[]>(10);
-
-        // unfiltered
-        variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G)).make(), true});
-        // passing
-        variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G)).passFilters().make(), true});
-
-        // failing
-        variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G)).filters(Collections.singleton("FILTER")).make(), false});
-
-        return variants.iterator();
-    }
-
-    @Test(dataProvider = "variantProvider")
-    public void testPassingVariantFilter(final VariantContext vc, final boolean shouldPass) {
-        final PassingVariantFilter passingVariantFilter = new PassingVariantFilter();
-
-        Assert.assertEquals(passingVariantFilter.test(vc), shouldPass, vc.toString());
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/SnpFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/SnpFilterTest.java
deleted file mode 100644
index 74f1bb5..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/SnpFilterTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Created by farjoun on 9/9/15.
- */
-public class SnpFilterTest {
-    Allele refA = Allele.create("A", true);
-    Allele refAG = Allele.create("AG", true);
-
-    Allele G = Allele.create("G", false);
-    Allele T = Allele.create("T", false);
-    Allele AG = Allele.create("AG", false);
-    Allele AT = Allele.create("AT", false);
-    Allele star = Allele.create("<*>", false);
-
-
-    @DataProvider()
-    public Iterator<Object[]> variantProvider() {
-
-        final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Collections.<Allele>emptyList());
-        final List<Object[]> variants = new ArrayList<Object[]>(10);
-
-        variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G))         .make(), true});    // SNP
-        variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G, T))      .make(), true});    // SNP
-
-        variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, AG))         .make(), false}); // INDEL
-        variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G, AG))      .make(), false}); // MIXED
-        variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, star))       .make(), false}); // SYMBOLIC
-        variants.add(new Object[]{vc_builder.stop(2).alleles(Arrays.asList(refAG, T)) .make(), false}); // INDEL
-        variants.add(new Object[]{vc_builder.stop(2).alleles(Arrays.asList(refAG, AT)).make(), false}); // MNP
-
-        return variants.iterator();
-    }
-
-    @Test(dataProvider = "variantProvider")
-    public void testSnpFilter(final VariantContext vc, final boolean shouldPass) {
-        final SnpFilter snpFilter = new SnpFilter();
-
-        Assert.assertEquals(snpFilter.test(vc), shouldPass, vc.toString());
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/writer/TabixOnTheFlyIndexCreationTest.java b/src/test/java/htsjdk/variant/variantcontext/writer/TabixOnTheFlyIndexCreationTest.java
deleted file mode 100644
index 2fd1520..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/writer/TabixOnTheFlyIndexCreationTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * 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
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.CloseableTribbleIterator;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.index.tabix.TabixIndex;
-import htsjdk.tribble.util.TabixUtils;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCF3Codec;
-import htsjdk.variant.vcf.VCFHeader;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.EnumSet;
-
-public class TabixOnTheFlyIndexCreationTest {
-    private static final File SMALL_VCF = new File("src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz");
-    @Test
-    public void simpleTest() throws Exception {
-        final VCF3Codec codec = new VCF3Codec();
-        final FeatureReader<VariantContext> reader = AbstractFeatureReader.getFeatureReader(SMALL_VCF.getAbsolutePath(), codec, false);
-        final VCFHeader headerFromFile = (VCFHeader)reader.getHeader();
-        final File vcf = File.createTempFile("TabixOnTheFlyIndexCreationTest.", ".vcf.gz");
-        final File tabix = new File(vcf.getAbsolutePath() + TabixUtils.STANDARD_INDEX_EXTENSION);
-        vcf.deleteOnExit();
-        tabix.deleteOnExit();
-        final VariantContextWriter vcfWriter = new VariantContextWriterBuilder()
-                .setOutputFile(vcf)
-                .setReferenceDictionary(headerFromFile.getSequenceDictionary())
-                .setOptions(EnumSet.of(Options.INDEX_ON_THE_FLY, Options.ALLOW_MISSING_FIELDS_IN_HEADER))
-                .build();
-        vcfWriter.writeHeader(headerFromFile);
-        final CloseableTribbleIterator<VariantContext> it = reader.iterator();
-        while (it.hasNext()) {
-            vcfWriter.add(it.next());
-        }
-        it.close();
-        vcfWriter.close();
-
-        // Hard to validate, so just confirm that index can be read.
-        new TabixIndex(tabix);
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/writer/VCFWriterUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/writer/VCFWriterUnitTest.java
deleted file mode 100644
index eaf2f95..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/writer/VCFWriterUnitTest.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.TestUtil;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.util.TabixUtils;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.GenotypesContext;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFFileReader;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLine;
-import htsjdk.variant.vcf.VCFHeaderVersion;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * @author aaron
- *         <p/>
- *         Class VCFWriterUnitTest
- *         <p/>
- *         This class tests out the ability of the VCF writer to correctly write VCF files
- */
-public class VCFWriterUnitTest extends VariantBaseTest {
-    private Set<VCFHeaderLine> metaData;
-    private Set<String> additionalColumns;
-    private File tempDir;
-
-    @BeforeClass
-    private void createTemporaryDirectory() {
-        tempDir = TestUtil.getTempDirectory("VCFWriter", "StaleIndex");
-    }
-
-    @AfterClass
-    private void deleteTemporaryDirectory() {
-        for (File f : tempDir.listFiles()) {
-            f.delete();
-        }
-        tempDir.delete();
-    }
-
-    /** test, using the writer and reader, that we can output and input a VCF file without problems */
-    @Test(dataProvider = "vcfExtensionsDataProvider")
-    public void testBasicWriteAndRead(final String extension) throws IOException {
-        final File fakeVCFFile = File.createTempFile("testBasicWriteAndRead.", extension);
-        fakeVCFFile.deleteOnExit();
-        if (".vcf.gz".equals(extension)) {
-            new File(fakeVCFFile.getAbsolutePath() + ".tbi").deleteOnExit();
-        } else {
-            Tribble.indexFile(fakeVCFFile).deleteOnExit();
-        }
-        metaData = new HashSet<VCFHeaderLine>();
-        additionalColumns = new HashSet<String>();
-        final SAMSequenceDictionary sequenceDict = createArtificialSequenceDictionary();
-        final VCFHeader header = createFakeHeader(metaData, additionalColumns, sequenceDict);
-        final VariantContextWriter writer = new VariantContextWriterBuilder()
-                .setOutputFile(fakeVCFFile)
-                .setReferenceDictionary(sequenceDict)
-                .setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER, Options.INDEX_ON_THE_FLY))
-                .build();
-        writer.writeHeader(header);
-        writer.add(createVC(header));
-        writer.add(createVC(header));
-        writer.close();
-        final VCFCodec codec = new VCFCodec();
-        final FeatureReader<VariantContext> reader = AbstractFeatureReader.getFeatureReader(fakeVCFFile.getAbsolutePath(), codec, false);
-        final VCFHeader headerFromFile = (VCFHeader)reader.getHeader();
-
-        int counter = 0;
-
-        // validate what we're reading in
-        validateHeader(headerFromFile, sequenceDict);
-        
-        try {
-            final Iterator<VariantContext> it = reader.iterator();
-            while(it.hasNext()) {
-                it.next();
-                counter++;
-            }
-            Assert.assertEquals(counter, 2);
-        }
-        catch (final IOException e ) {
-            throw new RuntimeException(e.getMessage());
-        }
-
-    }
-
-    /**
-     * create a fake header of known quantity
-     * @param metaData           the header lines
-     * @param additionalColumns  the additional column names
-     * @return a fake VCF header
-     */
-    public static VCFHeader createFakeHeader(final Set<VCFHeaderLine> metaData, final Set<String> additionalColumns,
-                                             final SAMSequenceDictionary sequenceDict) {
-        metaData.add(new VCFHeaderLine(VCFHeaderVersion.VCF4_0.getFormatString(), VCFHeaderVersion.VCF4_0.getVersionString()));
-        metaData.add(new VCFHeaderLine("two", "2"));
-        additionalColumns.add("extra1");
-        additionalColumns.add("extra2");
-        final VCFHeader ret = new VCFHeader(metaData, additionalColumns);
-        ret.setSequenceDictionary(sequenceDict);
-        return ret;
-    }
-
-    /**
-     * create a fake VCF record
-     * @param header the VCF header
-     * @return a VCFRecord
-     */
-    private VariantContext createVC(final VCFHeader header) {
-
-       return createVCGeneral(header,"1",1);
-    }
-
-    private VariantContext createVCGeneral(final VCFHeader header, final String chrom, final int position) {
-        final List<Allele> alleles = new ArrayList<Allele>();
-        final Map<String, Object> attributes = new HashMap<String,Object>();
-        final GenotypesContext genotypes = GenotypesContext.create(header.getGenotypeSamples().size());
-
-        alleles.add(Allele.create("A",true));
-        alleles.add(Allele.create("ACC",false));
-
-        attributes.put("DP","50");
-        for (final String name : header.getGenotypeSamples()) {
-            final Genotype gt = new GenotypeBuilder(name,alleles.subList(1,2)).GQ(0).attribute("BB", "1").phased(true).make();
-            genotypes.add(gt);
-        }
-        return new VariantContextBuilder("RANDOM", chrom, position, position, alleles)
-                .genotypes(genotypes).attributes(attributes).make();
-    }
-
-
-    /**
-     * validate a VCF header
-     * @param header the header to validate
-     */
-    public void validateHeader(final VCFHeader header, final SAMSequenceDictionary sequenceDictionary) {
-        // check the fields
-        int index = 0;
-        for (final VCFHeader.HEADER_FIELDS field : header.getHeaderFields()) {
-            Assert.assertEquals(VCFHeader.HEADER_FIELDS.values()[index], field);
-            index++;
-        }
-        Assert.assertEquals(header.getMetaDataInSortedOrder().size(), metaData.size() + sequenceDictionary.size());
-        index = 0;
-        for (final String key : header.getGenotypeSamples()) {
-            Assert.assertTrue(additionalColumns.contains(key));
-            index++;
-        }
-        Assert.assertEquals(index, additionalColumns.size());
-    }
-
-    @Test(dataProvider = "vcfExtensionsDataProvider")
-    public void TestWritingLargeVCF(final String extension) throws FileNotFoundException, InterruptedException {
-
-        final Set<VCFHeaderLine> metaData = new HashSet<VCFHeaderLine>();
-        final Set<String> Columns = new HashSet<String>();
-        for (int i = 0; i < 123; i++) {
-
-            Columns.add(String.format("SAMPLE_%d", i));
-        }
-
-        final SAMSequenceDictionary dict = createArtificialSequenceDictionary();
-        final VCFHeader header = createFakeHeader(metaData,Columns, dict);
-
-        final File vcf = new File(tempDir, "test" + extension);
-        final String indexExtension;
-        if (extension.equals(".vcf.gz")) {
-            indexExtension = TabixUtils.STANDARD_INDEX_EXTENSION;
-        } else {
-            indexExtension = Tribble.STANDARD_INDEX_EXTENSION;
-        }
-        final File vcfIndex = new File(vcf.getAbsolutePath() + indexExtension);
-        vcfIndex.deleteOnExit();
-
-        for(int count=1;count<2; count++){
-            final VariantContextWriter writer =  new VariantContextWriterBuilder()
-                    .setOutputFile(vcf)
-                    .setReferenceDictionary(dict)
-                    .setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER, Options.INDEX_ON_THE_FLY))
-                    .build();
-            writer.writeHeader(header);
-
-            for (int i = 1; i < 17 ; i++) { // write 17 chromosomes
-                for (int j = 1; j < 10; j++) { //10 records each
-                    writer.add(createVCGeneral(header, String.format("%d", i), j * 100));
-                }
-            }
-            writer.close();
-
-            Assert.assertTrue(vcf.lastModified() <= vcfIndex.lastModified());
-        }
-    }
-
-    @DataProvider(name = "vcfExtensionsDataProvider")
-    public Object[][]vcfExtensionsDataProvider() {
-        return new Object[][] {
-                // TODO: BCF doesn't work because header is not properly constructed.
-                // {".bcf"},
-                {".vcf"},
-                {".vcf.gz"}
-        };
-    }
-
-
-    /**
-     * A test to ensure that if we add a line to a VCFHeader it will persist through
-     * a round-trip write/read cycle via VariantContextWriter/VCFFileReader
-     */
-    @Test
-    public void testModifyHeader() {
-        final File originalVCF = new File("src/test/resources/htsjdk/variant/HiSeq.10000.vcf");
-        final VCFFileReader reader = new VCFFileReader(originalVCF, false);
-        final VCFHeader header = reader.getFileHeader();
-        reader.close();
-
-        header.addMetaDataLine(new VCFHeaderLine("FOOBAR", "foovalue"));
-
-        final File outputVCF = createTempFile("testModifyHeader", ".vcf");
-        final VariantContextWriter writer = new VariantContextWriterBuilder().setOutputFile(outputVCF).setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER)).build();
-        writer.writeHeader(header);
-        writer.close();
-
-        final VCFFileReader roundtripReader = new VCFFileReader(outputVCF, false);
-        final VCFHeader roundtripHeader = roundtripReader.getFileHeader();
-        roundtripReader.close();
-
-        Assert.assertNotNull(roundtripHeader.getOtherHeaderLine("FOOBAR"), "Could not find FOOBAR header line after a write/read cycle");
-        Assert.assertEquals(roundtripHeader.getOtherHeaderLine("FOOBAR").getValue(), "foovalue", "Wrong value for FOOBAR header line after a write/read cycle");
-    }
-}
-
diff --git a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java
deleted file mode 100644
index 179c4cb..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
-* Copyright (c) 2014 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.util.TabixUtils;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder.OutputType;
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-import java.io.*;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-
-public class VariantContextWriterBuilderUnitTest extends VariantBaseTest {
-	private static final String TEST_BASENAME = "htsjdk-test.VariantContextWriterBuilderUnitTest";
-    private SAMSequenceDictionary dictionary;
-
-    private File vcf;
-    private File vcfIdx;
-    private File vcfMD5;
-    private File bcf;
-    private File bcfIdx;
-    private File unknown;
-
-    private List<File> blockCompressedVCFs;
-    private List<File> blockCompressedIndices;
-
-    @BeforeSuite
-    public void before() throws IOException {
-        dictionary = createArtificialSequenceDictionary();
-        vcf = File.createTempFile(TEST_BASENAME, ".vcf");
-        vcf.deleteOnExit();
-        vcfIdx = Tribble.indexFile(vcf);
-        vcfIdx.deleteOnExit();
-        vcfMD5 = new File(vcf.getAbsolutePath() + ".md5");
-        vcfMD5.deleteOnExit();
-        bcf = File.createTempFile(TEST_BASENAME, ".bcf");
-        bcf.deleteOnExit();
-        bcfIdx = Tribble.indexFile(bcf);
-        bcfIdx.deleteOnExit();
-        unknown = File.createTempFile(TEST_BASENAME, ".unknown");
-        unknown.deleteOnExit();
-
-        blockCompressedVCFs = new ArrayList<File>();
-        blockCompressedIndices = new ArrayList<File>();
-        for (final String extension : AbstractFeatureReader.BLOCK_COMPRESSED_EXTENSIONS) {
-            final File blockCompressed = File.createTempFile(TEST_BASENAME, ".vcf" + extension);
-            blockCompressed.deleteOnExit();
-            blockCompressedVCFs.add(blockCompressed);
-
-            final File index = new File(blockCompressed.getAbsolutePath() + TabixUtils.STANDARD_INDEX_EXTENSION);
-            index.deleteOnExit();
-            blockCompressedIndices.add(index);
-        }
-    }
-
-    @Test
-    public void testSetOutputFile() throws IOException {
-        final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary);
-
-        VariantContextWriter writer = builder.setOutputFile(vcf.getAbsolutePath()).build();
-        Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFile VCF String");
-        Assert.assertFalse(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFile VCF String was compressed");
-
-        writer = builder.setOutputFile(vcf).build();
-        Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFile VCF File");
-        Assert.assertFalse(((VCFWriter)writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFile VCF File was compressed");
-
-        for (final String extension : AbstractFeatureReader.BLOCK_COMPRESSED_EXTENSIONS) {
-            final File file = File.createTempFile(TEST_BASENAME + ".setoutput", extension);
-            file.deleteOnExit();
-            final String filename = file.getAbsolutePath();
-
-            writer = builder.setOutputFile(filename).build();
-            Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFile " + extension + " String");
-            Assert.assertTrue(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFile " + extension + " String was not compressed");
-
-            writer = builder.setOutputFile(file).build();
-            Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFile " + extension + " File");
-            Assert.assertTrue(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFile " + extension + " File was not compressed");
-        }
-
-        writer = builder.setOutputFile(bcf).build();
-        Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFile BCF String");
-
-        writer = builder.setOutputFile(bcf.getAbsolutePath()).build();
-        Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFile BCF File");
-    }
-
-    @Test
-    public void testDetermineOutputType() {
-        Assert.assertEquals(OutputType.VCF, VariantContextWriterBuilder.determineOutputTypeFromFile(this.vcf));
-        Assert.assertEquals(OutputType.BCF, VariantContextWriterBuilder.determineOutputTypeFromFile(this.bcf));
-        Assert.assertEquals(OutputType.VCF_STREAM, VariantContextWriterBuilder.determineOutputTypeFromFile(new File("/dev/stdout")));
-        for (final File f: this.blockCompressedVCFs) {
-            Assert.assertEquals(OutputType.BLOCK_COMPRESSED_VCF, VariantContextWriterBuilder.determineOutputTypeFromFile(f));
-        }
-
-        // Test symlinking
-        try {
-            final Path link = Files.createTempFile("foo.", ".tmp");
-            Files.deleteIfExists(link);
-            Files.createSymbolicLink(link, this.vcf.toPath());
-            link.toFile().deleteOnExit();
-            Assert.assertEquals(OutputType.VCF, VariantContextWriterBuilder.determineOutputTypeFromFile(link.toFile()));
-            link.toFile().delete();
-        }
-        catch (final IOException ioe) {
-            throw new RuntimeIOException(ioe);
-        }
-    }
-
-    @Test
-    public void testSetOutputFileType() {
-        final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary)
-                .setOutputFile(unknown);
-
-        VariantContextWriter writer = builder.setOutputFileType(VariantContextWriterBuilder.OutputType.VCF).build();
-        Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFileType VCF");
-        Assert.assertFalse(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFileType VCF was compressed");
-
-        writer = builder.setOption(Options.FORCE_BCF).build();
-        Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFileType FORCE_BCF set -> expected BCF, was VCF");
-
-        // test that FORCE_BCF remains in effect, overriding the explicit setting of VCF
-        writer = builder.setOutputFileType(VariantContextWriterBuilder.OutputType.VCF).build();
-        Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFileType FORCE_BCF set 2 -> expected BCF, was VCF");
-
-        writer = builder.unsetOption(Options.FORCE_BCF).build();
-        Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFileType FORCE_BCF unset -> expected VCF, was BCF");
-        Assert.assertFalse(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFileType FORCE_BCF unset was compressed");
-
-        writer = builder.setOutputFileType(VariantContextWriterBuilder.OutputType.BLOCK_COMPRESSED_VCF).build();
-        Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFile BLOCK_COMPRESSED_VCF");
-        Assert.assertTrue(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFileType BLOCK_COMPRESSED_VCF was not compressed");
-
-        writer = builder.setOutputFileType(VariantContextWriterBuilder.OutputType.BCF).build();
-        Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFileType BCF");
-    }
-
-    @Test
-    public void testSetOutputStream() {
-        final OutputStream stream = new ByteArrayOutputStream();
-
-        final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary)
-                .unsetOption(Options.INDEX_ON_THE_FLY)
-                .setOutputStream(stream);
-
-        VariantContextWriter writer = builder.build();
-        Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputStream default");
-
-        writer = builder.setOption(Options.FORCE_BCF).build();
-        Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputStream FORCE_BCF set -> expected BCF stream, was VCF stream");
-
-        // test that FORCE_BCF remains in effect, overriding the explicit setting of VCF
-        writer = builder.setOutputVCFStream(stream).build();
-        Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputStream FORCE_BCF set 2 -> expected BCF stream, was VCF stream");
-
-        writer = builder.unsetOption(Options.FORCE_BCF).build();
-        Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputStream FORCE_BCF unset -> expected VCF stream, was BCF stream");
-
-        writer = builder.setOutputBCFStream(stream).build();
-        Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputStream BCF");
-
-        writer = builder.setOutputVCFStream(stream).build();
-        Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputStream VCF");
-    }
-
-    @Test
-    public void testAsync() {
-        final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary)
-                .setOutputFile(vcf);
-
-        VariantContextWriter writer = builder.build();
-        Assert.assertEquals(writer instanceof AsyncVariantContextWriter, Defaults.USE_ASYNC_IO_WRITE_FOR_TRIBBLE, "testAsync default");
-
-        writer = builder.setOption(Options.USE_ASYNC_IO).build();
-        Assert.assertTrue(writer instanceof AsyncVariantContextWriter, "testAsync option=set");
-
-        writer = builder.unsetOption(Options.USE_ASYNC_IO).build();
-        Assert.assertFalse(writer instanceof AsyncVariantContextWriter, "testAsync option=unset");
-    }
-
-    @Test
-    public void testBuffering() {
-        final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary)
-                .setOutputFile(vcf)
-                .unsetOption(Options.INDEX_ON_THE_FLY);     // so the potential BufferedOutputStream is not wrapped in a PositionalOutputStream
-
-        VariantContextWriter writer = builder.build();
-        Assert.assertTrue(((VCFWriter) writer).getOutputStream() instanceof BufferedOutputStream, "testBuffering was not buffered by default");
-
-        writer = builder.unsetBuffering().build();
-        Assert.assertFalse(((VCFWriter) writer).getOutputStream() instanceof BufferedOutputStream, "testBuffering was buffered when unset");
-
-        writer = builder.setBuffer(8192).build();
-        Assert.assertTrue(((VCFWriter) writer).getOutputStream() instanceof BufferedOutputStream, "testBuffering was not buffered when set");
-    }
-
-    @Test
-    public void testMD5() {
-        final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary)
-                .setOutputFile(vcf);
-
-        VariantContextWriter writer = builder.build();
-        writer.close();
-        Assert.assertEquals(vcfMD5.exists(), Defaults.CREATE_MD5, "MD5 default setting not respected");
-
-        if (vcfMD5.exists())
-            vcfMD5.delete();
-
-        writer = builder.setCreateMD5().build();
-        writer.close();
-        Assert.assertTrue(vcfMD5.exists(), "MD5 not created when requested");
-        vcfMD5.delete();
-
-        writer = builder.unsetCreateMD5().build();
-        writer.close();
-        Assert.assertFalse(vcfMD5.exists(), "MD5 created when not requested");
-
-        writer = builder.setCreateMD5(false).build();
-        writer.close();
-        Assert.assertFalse(vcfMD5.exists(), "MD5 created when not requested via boolean parameter");
-
-        writer = builder.setCreateMD5(true).build();
-        writer.close();
-        Assert.assertTrue(vcfMD5.exists(), "MD5 not created when requested via boolean parameter");
-        vcfMD5.delete();
-
-        for (final File blockCompressed : blockCompressedVCFs) {
-            final File md5 = new File(blockCompressed + ".md5");
-            if (md5.exists())
-                md5.delete();
-            md5.deleteOnExit();
-            writer = builder.setOutputFile(blockCompressed).build();
-            writer.close();
-            Assert.assertTrue(md5.exists(), "MD5 digest not created for " + blockCompressed);
-        }
-    }
-
-    @Test
-    public void testIndexingOnTheFly() {
-        final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary)
-                .setOption(Options.INDEX_ON_THE_FLY);
-
-        if (vcfIdx.exists())
-            vcfIdx.delete();
-        VariantContextWriter writer = builder.setOutputFile(vcf).build();
-        writer.close();
-        Assert.assertTrue(vcfIdx.exists(), String.format("VCF index not created for %s / %s", vcf, vcfIdx));
-
-        if (bcfIdx.exists())
-            bcfIdx.delete();
-        writer = builder.setOutputFile(bcf).build();
-        writer.close();
-        Assert.assertTrue(bcfIdx.exists(), String.format("BCF index not created for %s / %s", bcf, bcfIdx));
-
-        for (int i = 0; i < blockCompressedVCFs.size(); i++) {
-            final File blockCompressed = blockCompressedVCFs.get(i);
-            final File index = blockCompressedIndices.get(i);
-            if (index.exists())
-                index.delete();
-            writer = builder.setOutputFile(blockCompressed).setReferenceDictionary(dictionary).build();
-            writer.close();
-            Assert.assertTrue(index.exists(), String.format("Block-compressed index not created for %s / %s", blockCompressed, index));
-
-            // Tabix does not require a reference dictionary.
-            // Tribble does: see tests testRefDictRequiredForVCFIndexOnTheFly / testRefDictRequiredForBCFIndexOnTheFly
-
-            index.delete();
-            writer = builder.setReferenceDictionary(null).build();
-            writer.close();
-            Assert.assertTrue(index.exists(), String.format("Block-compressed index not created for %s / %s", blockCompressed, index));
-        }
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testInvalidImplicitFileType() {
-        new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary)
-                .setOutputFile("test.bam")
-                .build();
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testSetInvalidFileType() {
-        new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary)
-                .setOutputFile("test.bam")
-                .setOutputFileType(VariantContextWriterBuilder.OutputType.VCF_STREAM)
-                .build();
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testInvalidSetFileTypeForStream() {
-        new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary)
-                .setOutputStream(new ByteArrayOutputStream())
-                .setOutputFileType(VariantContextWriterBuilder.OutputType.VCF)
-                .build();
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testUnsupportedIndexOnTheFlyForStreaming() {
-        new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary)
-                .setOutputStream(new ByteArrayOutputStream())
-                .setOption(Options.INDEX_ON_THE_FLY)
-                .build();
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testUnsupportedDefaultIndexOnTheFlyForStreaming() {
-        new VariantContextWriterBuilder()
-                .setReferenceDictionary(dictionary)
-                .setOutputStream(new ByteArrayOutputStream())
-                .build();
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testRefDictRequiredForVCFIndexOnTheFly() {
-        new VariantContextWriterBuilder()
-                .setOutputFile(vcf)
-                .setOption(Options.INDEX_ON_THE_FLY)
-                .build();
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testRefDictRequiredForBCFIndexOnTheFly() {
-        new VariantContextWriterBuilder()
-                .setOutputFile(bcf)
-                .setOption(Options.INDEX_ON_THE_FLY)
-                .build();
-    }
-
-    @Test
-    public void testClearOptions() {
-        // Verify that clearOptions doesn't have a side effect of carrying previously set options
-        // forward to subsequent builders
-        VariantContextWriterBuilder vcwb = new VariantContextWriterBuilder();
-        vcwb.clearOptions().setOption(Options.INDEX_ON_THE_FLY);
-        final VariantContextWriterBuilder builder = new VariantContextWriterBuilder().clearOptions();
-        Assert.assertTrue(builder.options.isEmpty());
-    }
-
-    @Test
-    public void testModifyOption() {
-        final VariantContextWriterBuilder builder = new VariantContextWriterBuilder().clearOptions();
-        for (final Options option : Options.values()) {
-            Assert.assertFalse(builder.isOptionSet(option)); // shouldn't be set
-            builder.modifyOption(option, false);
-            Assert.assertFalse(builder.isOptionSet(option)); // still shouldn't be set
-            builder.modifyOption(option, true);
-            Assert.assertTrue(builder.isOptionSet(option)); // now is set
-            builder.modifyOption(option, false);
-            Assert.assertFalse(builder.isOptionSet(option)); // has been unset
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWritersUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWritersUnitTest.java
deleted file mode 100644
index 3782965..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWritersUnitTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-
-// the imports for unit testing.
-
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.bcf2.BCF2Codec;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextTestProvider;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFHeader;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.List;
-
-
-public class VariantContextWritersUnitTest extends VariantBaseTest {
-    private SAMSequenceDictionary dictionary;
-
-    @BeforeSuite
-    public void before() throws IOException {
-        dictionary = createArtificialSequenceDictionary();
-        VariantContextTestProvider.initializeTests();
-    }
-
-    @DataProvider(name = "VariantContextTest_SingleContexts")
-    public Object[][] SiteVCsTest() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-        for ( VariantContextTestProvider.VariantContextTestData testData : VariantContextTestProvider.generateSiteTests() )
-            tests.add(new Object[]{testData});
-        return tests.toArray(new Object[][]{});
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Test BCF2 reader / writer
-    //
-    // --------------------------------------------------------------------------------
-
-    @Test(dataProvider = "VariantContextTest_SingleContexts")
-    public void testBCF2WriterReader(final VariantContextTestProvider.VariantContextTestData testData) throws IOException {
-        VariantContextTestProvider.testReaderWriter(new BCFIOTester(), testData);
-    }
-
-    @Test(dataProvider = "VariantContextTest_SingleContexts")
-    public void testBCF2WriterReaderMissingGenotypes(final VariantContextTestProvider.VariantContextTestData testData) throws IOException {
-        VariantContextTestProvider.testReaderWriterWithMissingGenotypes(new BCFIOTester(), testData);
-    }
-
-    private class BCFIOTester extends VariantContextTestProvider.VariantContextIOTest<BCF2Codec> {
-        @Override
-        public String getExtension() {
-            return ".bcf";
-        }
-
-        @Override
-        public BCF2Codec makeCodec() {
-            return new BCF2Codec();
-        }
-
-        @Override
-        public VariantContextWriter makeWriter(final File file, final EnumSet<Options> baseOptions) {
-            return new VariantContextWriterBuilder()
-                    .setOutputFile(file)
-                    .setReferenceDictionary(dictionary)
-                    .setOptions(baseOptions)
-                    .build();
-        }
-
-        @Override
-        public VariantContextTestProvider.VariantContextContainer readAllVCs(File input) throws IOException {
-            final BCF2Codec codec = this.makeCodec();
-            return VariantContextTestProvider.readAllVCs(input, codec);
-        }
-    }
-
-    // --------------------------------------------------------------------------------
-    //
-    // Test VCF reader / writer
-    //
-    // --------------------------------------------------------------------------------
-
-    @Test(enabled = true, dataProvider = "VariantContextTest_SingleContexts")
-    public void testVCF4WriterReader(final VariantContextTestProvider.VariantContextTestData testData) throws IOException {
-        VariantContextTestProvider.testReaderWriter(new VCFIOTester(), testData);
-    }
-
-    @Test(enabled = true, dataProvider = "VariantContextTest_SingleContexts")
-    public void testVCF4WriterReaderMissingGenotypes(final VariantContextTestProvider.VariantContextTestData testData) throws IOException {
-        VariantContextTestProvider.testReaderWriterWithMissingGenotypes(new VCFIOTester(), testData);
-    }
-
-    private class VCFIOTester extends VariantContextTestProvider.VariantContextIOTest<VCFCodec> {
-        @Override
-        public String getExtension() {
-            return ".vcf";
-        }
-
-        @Override
-        public List<VariantContext> postprocess(final VCFHeader header, final List<VariantContext> vcsAfterIO) {
-            final List<VariantContext> fullyDecoded = new ArrayList<VariantContext>(vcsAfterIO.size());
-
-            for ( final VariantContext withStrings : vcsAfterIO )
-                fullyDecoded.add(withStrings.fullyDecode(header, false));
-
-            return fullyDecoded;
-        }
-
-        @Override
-        public VCFCodec makeCodec() {
-            return new VCFCodec();
-        }
-
-        @Override
-        public VariantContextWriter makeWriter(final File file, final EnumSet<Options> baseOptions) {
-            return new VariantContextWriterBuilder()
-                    .setOutputFile(file)
-                    .setReferenceDictionary(dictionary)
-                    .setOptions(baseOptions)
-                    .build();
-        }
-
-        @Override
-        public VariantContextTestProvider.VariantContextContainer readAllVCs(File input) throws FileNotFoundException {
-            final VCFCodec codec = this.makeCodec();
-            return VariantContextTestProvider.readAllVCs(input, codec);
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/vcf/AbstractVCFCodecTest.java b/src/test/java/htsjdk/variant/vcf/AbstractVCFCodecTest.java
deleted file mode 100644
index 9f81547..0000000
--- a/src/test/java/htsjdk/variant/vcf/AbstractVCFCodecTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.VariantContext;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.List;
-
-
-
-public class AbstractVCFCodecTest extends VariantBaseTest {
-
-	@Test
-	public void shouldPreserveSymbolicAlleleCase() {
-		VCFFileReader reader = new VCFFileReader(new File(VariantBaseTest.variantTestDataRoot + "breakpoint.vcf"), false);
-		VariantContext variant = reader.iterator().next();
-		reader.close();
-		
-		// VCF v4.1 s1.4.5
-		// Tools processing VCF files are not required to preserve case in the allele String, except for IDs, which are case sensitive.
-		Assert.assertTrue(variant.getAlternateAllele(0).getDisplayString().contains("chr12"));
-	}
-
-	@Test
-	public void TestSpanDelParseAlleles(){
-		List<Allele> list = VCF3Codec.parseAlleles("A", Allele.SPAN_DEL_STRING, 0);
-	}
-
-	@Test(expectedExceptions = TribbleException.class)
-	public void TestSpanDelParseAllelesException(){
-		List<Allele> list1 = VCF3Codec.parseAlleles(Allele.SPAN_DEL_STRING, "A", 0);
-	}
-
-	@DataProvider(name="thingsToTryToDecode")
-	public Object[][] getThingsToTryToDecode(){
-		return new Object[][] {
-				{"src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf", true},
-				{"src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz", true},
-				{"src/test/resources/htsjdk/tribble/nonexistant.garbage", false},
-				{"src/test/resources/htsjdk/tribble/testIntervalList.list", false}
-		};
-	}
-
-	@Test(dataProvider = "thingsToTryToDecode")
-	public void testCanDecodeFile(String potentialInput, boolean canDecode) {
-		Assert.assertEquals(AbstractVCFCodec.canDecodeFile(potentialInput, VCFCodec.VCF4_MAGIC_HEADER), canDecode);
-	}
-
-	@Test
-	public void testGetTabixFormat() {
-		Assert.assertEquals(new VCFCodec().getTabixFormat(), TabixFormat.VCF);
-		Assert.assertEquals(new VCF3Codec().getTabixFormat(), TabixFormat.VCF);
-	}
-}
diff --git a/src/test/java/htsjdk/variant/vcf/IndexFactoryUnitTest.java b/src/test/java/htsjdk/variant/vcf/IndexFactoryUnitTest.java
deleted file mode 100644
index 9d084f3..0000000
--- a/src/test/java/htsjdk/variant/vcf/IndexFactoryUnitTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.CloseableTribbleIterator;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.writer.Options;
-import htsjdk.variant.variantcontext.writer.VariantContextWriter;
-import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.EnumSet;
-
-/**
- * tests out the various functions in the index factory class
- */
-public class IndexFactoryUnitTest extends VariantBaseTest {
-
-    File inputFile = new File(variantTestDataRoot + "HiSeq.10000.vcf");
-    File outputFile = createTempFile("onTheFlyOutputTest", ".vcf");
-    File outputFileIndex = Tribble.indexFile(outputFile);
-
-    private SAMSequenceDictionary dict;
-
-    @BeforeTest
-    public void setup() {
-        dict = createArtificialSequenceDictionary();
-    }
-
-    //
-    // test out scoring the indexes
-    //
-    @Test
-    public void testOnTheFlyIndexing1() throws IOException {
-        final Index indexFromInputFile = IndexFactory.createDynamicIndex(inputFile, new VCFCodec());
-        if ( outputFileIndex.exists() ) {
-            System.err.println("Deleting " + outputFileIndex);
-            outputFileIndex.delete();
-        }
-
-        for ( int maxRecords : Arrays.asList(0, 1, 10, 100, 1000, -1)) {
-            final AbstractFeatureReader source = AbstractFeatureReader.getFeatureReader(inputFile.getAbsolutePath(), new VCFCodec(), indexFromInputFile);
-
-            int counter = 0;
-            VariantContextWriter writer = new VariantContextWriterBuilder()
-                    .setOutputFile(outputFile)
-                    .setReferenceDictionary(dict)
-                    .setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER))
-                    .build();
-            writer.writeHeader((VCFHeader)source.getHeader());
-            CloseableTribbleIterator<VariantContext> it = source.iterator();
-            while (it.hasNext() && (counter++ < maxRecords || maxRecords == -1) ) {
-                VariantContext vc = it.next();
-                writer.add(vc);
-            }
-            writer.close();
-
-            // test that the input index is the same as the one created from the identical input file
-            // test that the dynamic index is the same as the output index, which is equal to the input index
-            //WalkerTest.assertOnDiskIndexEqualToNewlyCreatedIndex(outputFileIndex, "unittest", outputFile);
-        }
-    }
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFCompoundHeaderLineUnitTest.java b/src/test/java/htsjdk/variant/vcf/VCFCompoundHeaderLineUnitTest.java
deleted file mode 100644
index fe19fc5..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFCompoundHeaderLineUnitTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.variant.VariantBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-
-/**
- * User: ebanks
- * Date: Apr 2, 2014
- */
-public class VCFCompoundHeaderLineUnitTest extends VariantBaseTest {
-
-    @Test
-    public void supportsVersionFields() {
-	final String line = "<ID=FOO,Number=1,Type=Float,Description=\"foo\",Version=3>";
-	final VCFCompoundHeaderLine headerline = new VCFInfoHeaderLine(line, VCFHeaderVersion.VCF4_2);
-	// if we don't support version fields then we should fail before we ever get here
-	Assert.assertTrue(true);
-    }
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFEncoderTest.java b/src/test/java/htsjdk/variant/vcf/VCFEncoderTest.java
deleted file mode 100644
index 2c4ff0f..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFEncoderTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-public class VCFEncoderTest {
-
-	@DataProvider(name = "VCFWriterDoubleFormatTestData")
-	public Object[][] makeVCFWriterDoubleFormatTestData() {
-		final List<Object[]> tests = new ArrayList<Object[]>();
-		tests.add(new Object[]{1.0, "1.00"});
-		tests.add(new Object[]{10.1, "10.10"});
-		tests.add(new Object[]{10.01, "10.01"});
-		tests.add(new Object[]{10.012, "10.01"});
-		tests.add(new Object[]{10.015, "10.02"});
-		tests.add(new Object[]{0.0, "0.00"});
-		tests.add(new Object[]{0.5, "0.500"});
-		tests.add(new Object[]{0.55, "0.550"});
-		tests.add(new Object[]{0.555, "0.555"});
-		tests.add(new Object[]{0.5555, "0.556"});
-		tests.add(new Object[]{0.1, "0.100"});
-		tests.add(new Object[]{0.050, "0.050"});
-		tests.add(new Object[]{0.010, "0.010"});
-		tests.add(new Object[]{0.012, "0.012"});
-		tests.add(new Object[]{0.0012, "1.200e-03"});
-		tests.add(new Object[]{1.2e-4, "1.200e-04"});
-		tests.add(new Object[]{1.21e-4, "1.210e-04"});
-		tests.add(new Object[]{1.212e-5, "1.212e-05"});
-		tests.add(new Object[]{1.2123e-6, "1.212e-06"});
-		tests.add(new Object[]{Double.POSITIVE_INFINITY, "Infinity"});
-		tests.add(new Object[]{Double.NEGATIVE_INFINITY, "-Infinity"});
-		tests.add(new Object[]{Double.NaN, "NaN"});
-		return tests.toArray(new Object[][]{});
-	}
-
-	@Test(dataProvider = "VCFWriterDoubleFormatTestData")
-	public void testVCFWriterDoubleFormatTestData(final double d, final String expected) {
-		Assert.assertEquals(VCFEncoder.formatVCFDouble(d), expected, "Failed to pretty print double in VCFWriter");
-	}
-
-    @DataProvider(name = "MissingFormatTestData")
-    public Object[][] makeMissingFormatTestData() {
-        final VCFHeader header = createSyntheticHeader(Arrays.asList("Sample1"));
-
-        final VCFEncoder dropMissing = new VCFEncoder(header, false, false);
-        final VCFEncoder keepMissing = new VCFEncoder(header, false, true);
-        final VariantContextBuilder baseVC = new VariantContextBuilder().chr("1").start(1).stop(1).noID().passFilters().log10PError(1).alleles("A", "C");
-        final GenotypeBuilder baseGT = new GenotypeBuilder("Sample1").alleles(Arrays.asList(Allele.NO_CALL, Allele.NO_CALL));
-        final Map<Allele, String> alleleMap = new HashMap<Allele, String>(3);
-        final List<String> formatKeys = Arrays.asList("GT", "AA", "BB");
-        alleleMap.put(Allele.NO_CALL, VCFConstants.EMPTY_ALLELE);
-        alleleMap.put(Allele.create("A", true), "0");
-        alleleMap.put(Allele.create("C", false), "1");
-
-        final List<Object[]> tests = new ArrayList<Object[]>();
-
-        VariantContext vc = baseVC.genotypes(baseGT.attribute("AA", "a").make()).make();
-        tests.add(new Object[]{dropMissing, vc, "./.:a", alleleMap, formatKeys});
-        tests.add(new Object[]{keepMissing, vc, "./.:a:.", alleleMap, formatKeys});
-        baseGT.noAttributes();
-
-        vc = baseVC.genotypes(baseGT.attribute("AA", "a").attribute("BB", 2).make()).make();
-        tests.add(new Object[]{dropMissing, vc, "./.:a:2", alleleMap, formatKeys});
-        tests.add(new Object[]{keepMissing, vc, "./.:a:2", alleleMap, formatKeys});
-        baseGT.noAttributes();
-
-        vc = baseVC.genotypes(baseGT.make()).make();
-        tests.add(new Object[]{dropMissing, vc, "./.", alleleMap, formatKeys});
-        tests.add(new Object[]{keepMissing, vc, "./.:.:.", alleleMap, formatKeys});
-        baseGT.noAttributes();
-
-        vc = baseVC.genotypes(baseGT.attribute("BB", 2).make()).make();
-        tests.add(new Object[]{dropMissing, vc, "./.:.:2", alleleMap, formatKeys});
-        tests.add(new Object[]{keepMissing, vc, "./.:.:2", alleleMap, formatKeys});
-        baseGT.noAttributes();
-
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "MissingFormatTestData")
-    public void testMissingFormatFields(final VCFEncoder encoder, final VariantContext vc, final String expectedLastColumn, final Map<Allele, String> alleleMap, final List<String> genotypeFormatKeys) {
-        final StringBuilder sb = new StringBuilder();
-        final String[] columns = new String[5];
-
-        encoder.addGenotypeData(vc, alleleMap, genotypeFormatKeys, sb);
-        final int nCol = ParsingUtils.split(sb.toString(), columns, VCFConstants.FIELD_SEPARATOR_CHAR);
-        Assert.assertEquals(columns[nCol-1], expectedLastColumn, "Format fields don't handle missing data in the expected way");
-    }
-
-    private Set<VCFHeaderLine> createSyntheticMetadata() {
-        final Set<VCFHeaderLine> metaData = new TreeSet<VCFHeaderLine>();
-
-        metaData.add(new VCFContigHeaderLine(Collections.singletonMap("ID", "1"), 0));
-
-        metaData.add(new VCFFormatHeaderLine("GT", 1, VCFHeaderLineType.String, "x"));
-        metaData.add(new VCFFormatHeaderLine("AA", 1, VCFHeaderLineType.String, "aa"));
-        metaData.add(new VCFFormatHeaderLine("BB", 1, VCFHeaderLineType.Integer, "bb"));
-        return metaData;
-    }
-
-    private VCFHeader createSyntheticHeader() {
-        return new VCFHeader(createSyntheticMetadata());
-    }
-
-    private VCFHeader createSyntheticHeader(final List<String> samples) {
-        return new VCFHeader(createSyntheticMetadata(), samples);
-    }
-
-
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFHeaderLineTranslatorUnitTest.java b/src/test/java/htsjdk/variant/vcf/VCFHeaderLineTranslatorUnitTest.java
deleted file mode 100644
index 88a8cce..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFHeaderLineTranslatorUnitTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.VariantBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Map;
-
-public class VCFHeaderLineTranslatorUnitTest extends VariantBaseTest {
-
-    @Test
-    public void testParseVCF4HeaderLine() {
-        // the following tests exercise the escaping of quotes and backslashes in VCF header lines
-
-        // test a case with no escapes
-        final Map<String,String> values = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=SnpCluster,Description=\"SNPs found in clusters\">", null);
-        Assert.assertEquals(values.size(), 2);
-        Assert.assertEquals(values.get("ID"), "SnpCluster");
-        Assert.assertEquals(values.get("Description"), "SNPs found in clusters");
-
-        // test escaped quotes
-        final Map<String,String> values2 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION != \\\"NA\\\" || ANNOTATION <= 0.01\">", null);
-        Assert.assertEquals(values2.size(), 2);
-        Assert.assertEquals(values2.get("ID"), "ANNOTATION");
-        Assert.assertEquals(values2.get("Description"), "ANNOTATION != \"NA\" || ANNOTATION <= 0.01");
-
-        // test escaped quotes and an escaped backslash
-        final Map<String,String> values3 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION \\\\= \\\"NA\\\" || ANNOTATION <= 0.01\">", null);
-        Assert.assertEquals(values3.size(), 2);
-        Assert.assertEquals(values3.get("ID"), "ANNOTATION");
-        Assert.assertEquals(values3.get("Description"), "ANNOTATION \\= \"NA\" || ANNOTATION <= 0.01");
-
-        // test a header line with two value tags, one with an escaped backslash and two escaped quotes, one with an escaped quote
-        final Map<String,String> values4 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION \\\\= \\\"NA\\\" || ANNOTATION <= 0.01\", Description2=\"foo\\\"bar\">", null);
-        Assert.assertEquals(values4.size(), 3);
-        Assert.assertEquals(values4.get("ID"), "ANNOTATION");
-        Assert.assertEquals(values4.get("Description"), "ANNOTATION \\= \"NA\" || ANNOTATION <= 0.01");
-        Assert.assertEquals(values4.get("Description2"), "foo\"bar");
-
-        // test a line with a backslash that appears before something other than a quote or backslash
-        final Map<String,String> values5 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION \\n with a newline in it\">", null);
-        Assert.assertEquals(values5.size(), 2);
-        Assert.assertEquals(values5.get("ID"), "ANNOTATION");
-        Assert.assertEquals(values5.get("Description"), "ANNOTATION \\n with a newline in it");
-
-        // test with an unclosed quote
-        try {
-            final Map<String, String> values6 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION \\n with a newline in it>", null);
-            Assert.fail("Should have thrown a TribbleException for having an unclosed quote in the description line");
-        } catch (TribbleException.InvalidHeader e) {
-        }
-
-        // test with an escaped quote at the end
-        try {
-            final Map<String, String> values7 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION \\n with a newline in it\\\">", null);
-            Assert.fail("Should have thrown a TribbleException for having an unclosed quote in the description line");
-        } catch (TribbleException.InvalidHeader e) {
-        }
-
-    }
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFHeaderLineUnitTest.java b/src/test/java/htsjdk/variant/vcf/VCFHeaderLineUnitTest.java
deleted file mode 100644
index 02cde53..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFHeaderLineUnitTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.variant.VariantBaseTest;
-import org.testng.annotations.Test;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-public class VCFHeaderLineUnitTest extends VariantBaseTest {
-
-    @Test
-    public void testEncodeVCFHeaderLineWithUnescapedQuotes() {
-
-        final Map<String, String> attributes = new LinkedHashMap<>();
-        attributes.put("ID", "VariantFiltration");
-        attributes.put("CommandLineOptions", "filterName=[ANNOTATION] filterExpression=[ANNOTATION == \"NA\" || ANNOTATION <= 2.0]");
-
-        final String encodedAttributes = VCFHeaderLine.toStringEncoding(attributes);
-        assertNotNull(encodedAttributes);
-
-        final String expectedEncoding = "<ID=VariantFiltration,CommandLineOptions=\"filterName=[ANNOTATION] filterExpression=[ANNOTATION == \\\"NA\\\" || ANNOTATION <= 2.0]\">";
-        assertEquals(encodedAttributes, expectedEncoding);
-    }
-
-
-    @Test
-    public void testEncodeVCFHeaderLineWithEscapedQuotes() {
-
-        final Map<String, String> attributes = new LinkedHashMap<>();
-        attributes.put("ID", "VariantFiltration");
-        attributes.put("CommandLineOptions", "filterName=[ANNOTATION] filterExpression=[ANNOTATION == \\\"NA\\\" || ANNOTATION <= 2.0]");
-
-        final String encodedAttributes = VCFHeaderLine.toStringEncoding(attributes);
-        assertNotNull(encodedAttributes);
-
-        final String expectedEncoding = "<ID=VariantFiltration,CommandLineOptions=\"filterName=[ANNOTATION] filterExpression=[ANNOTATION == \\\"NA\\\" || ANNOTATION <= 2.0]\">";
-        assertEquals(encodedAttributes, expectedEncoding);
-    }
-
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFHeaderUnitTest.java b/src/test/java/htsjdk/variant/vcf/VCFHeaderUnitTest.java
deleted file mode 100644
index e9135cc..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFHeaderUnitTest.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.TestUtil;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.readers.*;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.writer.Options;
-import htsjdk.variant.variantcontext.writer.VariantContextWriter;
-import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.io.StringReader;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Created by IntelliJ IDEA.
- * User: aaron
- * Date: Jun 30, 2010
- * Time: 3:32:08 PM
- * To change this template use File | Settings | File Templates.
- */
-public class VCFHeaderUnitTest extends VariantBaseTest {
-
-    private File tempDir;
-
-    private VCFHeader createHeader(String headerStr) {
-        VCFCodec codec = new VCFCodec();
-        VCFHeader header = (VCFHeader) codec.readActualHeader(new LineIteratorImpl(new SynchronousLineReader(
-                new StringReader(headerStr))));
-        Assert.assertEquals(header.getMetaDataInInputOrder().size(), VCF4headerStringCount);
-        return header;
-    }
-
-    @BeforeClass
-    private void createTemporaryDirectory() {
-        tempDir = TestUtil.getTempDirectory("VCFHeader", "VCFHeaderTest");
-    }
-
-    @AfterClass
-    private void deleteTemporaryDirectory() {
-        for (File f : tempDir.listFiles()) {
-            f.delete();
-        }
-        tempDir.delete();
-    }
-
-    @Test
-    public void testVCF4ToVCF4() {
-        VCFHeader header = createHeader(VCF4headerStrings);
-        checkMD5ofHeaderFile(header, "91c33dadb92e01ea349bd4bcdd02d6be");
-    }
-
-    @Test
-    public void testVCF4ToVCF4_alternate() {
-        VCFHeader header = createHeader(VCF4headerStrings_with_negativeOne);
-        checkMD5ofHeaderFile(header, "39318d9713897d55be5ee32a2119853f");
-    }
-
-    @Test
-    public void testVCFHeaderSampleRenamingSingleSampleVCF() throws Exception {
-        final VCFCodec codec = new VCFCodec();
-        codec.setRemappedSampleName("FOOSAMPLE");
-        final AsciiLineReaderIterator vcfIterator = new AsciiLineReaderIterator(new AsciiLineReader(new FileInputStream(variantTestDataRoot + "HiSeq.10000.vcf")));
-        final VCFHeader header = (VCFHeader) codec.readHeader(vcfIterator).getHeaderValue();
-
-        Assert.assertEquals(header.getNGenotypeSamples(), 1, "Wrong number of samples in remapped header");
-        Assert.assertEquals(header.getGenotypeSamples().get(0), "FOOSAMPLE", "Sample name in remapped header has incorrect value");
-
-        int recordCount = 0;
-        while (vcfIterator.hasNext() && recordCount < 10) {
-            recordCount++;
-            final VariantContext vcfRecord = codec.decode(vcfIterator.next());
-
-            Assert.assertEquals(vcfRecord.getSampleNames().size(), 1, "Wrong number of samples in vcf record after remapping");
-            Assert.assertEquals(vcfRecord.getSampleNames().iterator().next(), "FOOSAMPLE", "Wrong sample in vcf record after remapping");
-        }
-    }
-
-    @Test
-    public void testVCFHeaderDictionaryMerging() {
-        VCFHeader headerOne = new VCFFileReader(new File(variantTestDataRoot + "dbsnp_135.b37.1000.vcf"), false).getFileHeader();
-        VCFHeader headerTwo = new VCFHeader(headerOne); // deep copy
-        final List<String> sampleList = new ArrayList<String>();
-        sampleList.addAll(headerOne.getSampleNamesInOrder());
-
-        // Check that the two dictionaries start out the same
-        headerOne.getSequenceDictionary().assertSameDictionary(headerTwo.getSequenceDictionary());
-
-        // Run the merge command
-        final VCFHeader mergedHeader = new VCFHeader(VCFUtils.smartMergeHeaders(Arrays.asList(headerOne, headerTwo), false), sampleList);
-
-        // Check that the mergedHeader's sequence dictionary matches the first two
-        mergedHeader.getSequenceDictionary().assertSameDictionary(headerOne.getSequenceDictionary());
-    }
-
-    @Test(expectedExceptions = TribbleException.class)
-    public void testVCFHeaderSampleRenamingMultiSampleVCF() throws Exception {
-        final VCFCodec codec = new VCFCodec();
-        codec.setRemappedSampleName("FOOSAMPLE");
-        final AsciiLineReaderIterator vcfIterator = new AsciiLineReaderIterator(new AsciiLineReader(new FileInputStream(variantTestDataRoot + "ex2.vcf")));
-        final VCFHeader header = (VCFHeader) codec.readHeader(vcfIterator).getHeaderValue();
-    }
-
-    @Test(expectedExceptions = TribbleException.class)
-    public void testVCFHeaderSampleRenamingSitesOnlyVCF() throws Exception {
-        final VCFCodec codec = new VCFCodec();
-        codec.setRemappedSampleName("FOOSAMPLE");
-        final AsciiLineReaderIterator vcfIterator = new AsciiLineReaderIterator(new AsciiLineReader(new FileInputStream(variantTestDataRoot + "dbsnp_135.b37.1000.vcf")));
-        final VCFHeader header = (VCFHeader) codec.readHeader(vcfIterator).getHeaderValue();
-    }
-
-    private VCFHeader getHiSeqVCFHeader() {
-        final File vcf = new File("src/test/resources/htsjdk/variant/HiSeq.10000.vcf");
-        final VCFFileReader reader = new VCFFileReader(vcf, false);
-        final VCFHeader header = reader.getFileHeader();
-        reader.close();
-        return header;
-    }
-
-    @Test
-    public void testVCFHeaderAddInfoLine() {
-        final VCFHeader header = getHiSeqVCFHeader();
-        final VCFInfoHeaderLine infoLine = new VCFInfoHeaderLine("TestInfoLine", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "test info line");
-        header.addMetaDataLine(infoLine);
-
-        Assert.assertTrue(header.getInfoHeaderLines().contains(infoLine), "TestInfoLine not found in info header lines");
-        Assert.assertTrue(header.getMetaDataInInputOrder().contains(infoLine), "TestInfoLine not found in set of all header lines");
-        Assert.assertNotNull(header.getInfoHeaderLine("TestInfoLine"), "Lookup for TestInfoLine by key failed");
-
-        Assert.assertFalse(header.getFormatHeaderLines().contains(infoLine), "TestInfoLine present in format header lines");
-        Assert.assertFalse(header.getFilterLines().contains(infoLine), "TestInfoLine present in filter header lines");
-        Assert.assertFalse(header.getContigLines().contains(infoLine), "TestInfoLine present in contig header lines");
-        Assert.assertFalse(header.getOtherHeaderLines().contains(infoLine), "TestInfoLine present in other header lines");
-    }
-
-    @Test
-    public void testVCFHeaderAddFormatLine() {
-        final VCFHeader header = getHiSeqVCFHeader();
-        final VCFFormatHeaderLine formatLine = new VCFFormatHeaderLine("TestFormatLine", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "test format line");
-        header.addMetaDataLine(formatLine);
-
-        Assert.assertTrue(header.getFormatHeaderLines().contains(formatLine), "TestFormatLine not found in format header lines");
-        Assert.assertTrue(header.getMetaDataInInputOrder().contains(formatLine), "TestFormatLine not found in set of all header lines");
-        Assert.assertNotNull(header.getFormatHeaderLine("TestFormatLine"), "Lookup for TestFormatLine by key failed");
-
-        Assert.assertFalse(header.getInfoHeaderLines().contains(formatLine), "TestFormatLine present in info header lines");
-        Assert.assertFalse(header.getFilterLines().contains(formatLine), "TestFormatLine present in filter header lines");
-        Assert.assertFalse(header.getContigLines().contains(formatLine), "TestFormatLine present in contig header lines");
-        Assert.assertFalse(header.getOtherHeaderLines().contains(formatLine), "TestFormatLine present in other header lines");
-    }
-
-    @Test
-    public void testVCFHeaderAddFilterLine() {
-        final VCFHeader header = getHiSeqVCFHeader();
-        final String filterDesc = "TestFilterLine Description";
-        final VCFFilterHeaderLine filterLine = new VCFFilterHeaderLine("TestFilterLine",filterDesc);
-        Assert.assertEquals(filterDesc,filterLine.getDescription());
-        header.addMetaDataLine(filterLine);
-
-        Assert.assertTrue(header.getFilterLines().contains(filterLine), "TestFilterLine not found in filter header lines");
-        Assert.assertTrue(header.getMetaDataInInputOrder().contains(filterLine), "TestFilterLine not found in set of all header lines");
-        Assert.assertNotNull(header.getFilterHeaderLine("TestFilterLine"), "Lookup for TestFilterLine by key failed");
-
-        Assert.assertFalse(header.getInfoHeaderLines().contains(filterLine), "TestFilterLine present in info header lines");
-        Assert.assertFalse(header.getFormatHeaderLines().contains(filterLine), "TestFilterLine present in format header lines");
-        Assert.assertFalse(header.getContigLines().contains(filterLine), "TestFilterLine present in contig header lines");
-        Assert.assertFalse(header.getOtherHeaderLines().contains(filterLine), "TestFilterLine present in other header lines");
-    }
-
-    @Test
-    public void testVCFHeaderAddContigLine() {
-        final VCFHeader header = getHiSeqVCFHeader();
-        final VCFContigHeaderLine contigLine = new VCFContigHeaderLine("<ID=chr1,length=1234567890,assembly=FAKE,md5=f126cdf8a6e0c7f379d618ff66beb2da,species=\"Homo sapiens\">", VCFHeaderVersion.VCF4_0, "chr1", 0);
-        header.addMetaDataLine(contigLine);
-
-        Assert.assertTrue(header.getContigLines().contains(contigLine), "Test contig line not found in contig header lines");
-        Assert.assertTrue(header.getMetaDataInInputOrder().contains(contigLine), "Test contig line not found in set of all header lines");
-
-        Assert.assertFalse(header.getInfoHeaderLines().contains(contigLine), "Test contig line present in info header lines");
-        Assert.assertFalse(header.getFormatHeaderLines().contains(contigLine), "Test contig line present in format header lines");
-        Assert.assertFalse(header.getFilterLines().contains(contigLine), "Test contig line present in filter header lines");
-        Assert.assertFalse(header.getOtherHeaderLines().contains(contigLine), "Test contig line present in other header lines");
-    }
-
-    @Test
-    public void testVCFHeaderAddOtherLine() {
-        final VCFHeader header = getHiSeqVCFHeader();
-        final VCFHeaderLine otherLine = new VCFHeaderLine("TestOtherLine", "val");
-        header.addMetaDataLine(otherLine);
-
-        Assert.assertTrue(header.getOtherHeaderLines().contains(otherLine), "TestOtherLine not found in other header lines");
-        Assert.assertTrue(header.getMetaDataInInputOrder().contains(otherLine), "TestOtherLine not found in set of all header lines");
-        Assert.assertNotNull(header.getOtherHeaderLine("TestOtherLine"), "Lookup for TestOtherLine by key failed");
-
-        Assert.assertFalse(header.getInfoHeaderLines().contains(otherLine), "TestOtherLine present in info header lines");
-        Assert.assertFalse(header.getFormatHeaderLines().contains(otherLine), "TestOtherLine present in format header lines");
-        Assert.assertFalse(header.getContigLines().contains(otherLine), "TestOtherLine present in contig header lines");
-        Assert.assertFalse(header.getFilterLines().contains(otherLine), "TestOtherLine present in filter header lines");
-    }
-
-    @Test
-    public void testVCFHeaderAddMetaDataLineDoesNotDuplicateContigs() {
-        File input = new File("src/test/resources/htsjdk/variant/ex2.vcf");
-
-        VCFFileReader reader = new VCFFileReader(input, false);
-        VCFHeader header = reader.getFileHeader();
-
-        final int numContigLinesBefore = header.getContigLines().size();
-
-        VCFInfoHeaderLine newInfoField = new VCFInfoHeaderLine("test", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "test info field");
-        header.addMetaDataLine(newInfoField);
-
-        // getting the sequence dictionary was failing due to duplicating contigs in issue #214,
-        // we expect this to not throw an exception
-        header.getSequenceDictionary();
-
-        final int numContigLinesAfter = header.getContigLines().size();
-        // assert that we have the same number of contig lines before and after
-        Assert.assertEquals(numContigLinesBefore, numContigLinesAfter);
-    }
-
-    @Test
-    public void testVCFHeaderAddDuplicateContigLine() {
-        File input = new File("src/test/resources/htsjdk/variant/ex2.vcf");
-
-        VCFFileReader reader = new VCFFileReader(input, false);
-        VCFHeader header = reader.getFileHeader();
-
-
-        final int numContigLinesBefore = header.getContigLines().size();
-        // try to readd the first contig line
-        header.addMetaDataLine(header.getContigLines().get(0));
-        final int numContigLinesAfter = header.getContigLines().size();
-
-        // assert that we have the same number of contig lines before and after
-        Assert.assertEquals(numContigLinesBefore, numContigLinesAfter);
-    }
-
-    @Test
-    public void testVCFHeaderAddDuplicateHeaderLine() {
-        File input = new File("src/test/resources/htsjdk/variant/ex2.vcf");
-
-        VCFFileReader reader = new VCFFileReader(input, false);
-        VCFHeader header = reader.getFileHeader();
-
-        VCFHeaderLine newHeaderLine = new VCFHeaderLine("key", "value");
-        // add this new header line
-        header.addMetaDataLine(newHeaderLine);
-
-        final int numHeaderLinesBefore = header.getOtherHeaderLines().size();
-        // readd the same header line
-        header.addMetaDataLine(newHeaderLine);
-        final int numHeaderLinesAfter = header.getOtherHeaderLines().size();
-
-        // assert that we have the same number of other header lines before and after
-        Assert.assertEquals(numHeaderLinesBefore, numHeaderLinesAfter);
-    }
-
-    @Test
-    public void testVCFHeaderSerialization() throws Exception {
-        final VCFFileReader reader = new VCFFileReader(new File("src/test/resources/htsjdk/variant/HiSeq.10000.vcf"), false);
-        final VCFHeader originalHeader = reader.getFileHeader();
-        reader.close();
-
-        final VCFHeader deserializedHeader = TestUtil.serializeAndDeserialize(originalHeader);
-
-        Assert.assertEquals(deserializedHeader.getMetaDataInInputOrder(), originalHeader.getMetaDataInInputOrder(), "Header metadata does not match before/after serialization");
-        Assert.assertEquals(deserializedHeader.getContigLines(), originalHeader.getContigLines(), "Contig header lines do not match before/after serialization");
-        Assert.assertEquals(deserializedHeader.getFilterLines(), originalHeader.getFilterLines(), "Filter header lines do not match before/after serialization");
-        Assert.assertEquals(deserializedHeader.getFormatHeaderLines(), originalHeader.getFormatHeaderLines(), "Format header lines do not match before/after serialization");
-        Assert.assertEquals(deserializedHeader.getIDHeaderLines(), originalHeader.getIDHeaderLines(), "ID header lines do not match before/after serialization");
-        Assert.assertEquals(deserializedHeader.getInfoHeaderLines(), originalHeader.getInfoHeaderLines(), "Info header lines do not match before/after serialization");
-        Assert.assertEquals(deserializedHeader.getOtherHeaderLines(), originalHeader.getOtherHeaderLines(), "Other header lines do not match before/after serialization");
-        Assert.assertEquals(deserializedHeader.getGenotypeSamples(), originalHeader.getGenotypeSamples(), "Genotype samples not the same before/after serialization");
-        Assert.assertEquals(deserializedHeader.samplesWereAlreadySorted(), originalHeader.samplesWereAlreadySorted(), "Sortedness of samples not the same before/after serialization");
-        Assert.assertEquals(deserializedHeader.getSampleNamesInOrder(), originalHeader.getSampleNamesInOrder(), "Sorted list of sample names in header not the same before/after serialization");
-        Assert.assertEquals(deserializedHeader.getSampleNameToOffset(), originalHeader.getSampleNameToOffset(), "Sample name to offset map not the same before/after serialization");
-        Assert.assertEquals(deserializedHeader.toString(), originalHeader.toString(), "String representation of header not the same before/after serialization");
-    }
-
-    @Test
-    public void testVCFHeaderQuoteEscaping() throws Exception {
-        // this test ensures that the end-to-end process of quote escaping is stable when headers are
-        // read and re-written; ie that quotes that are already escaped won't be re-escaped. It does
-        // this by reading a test file, adding a header line with an unescaped quote, writing out a copy
-        // of the file, reading it back in and writing a second copy, and finally reading back the second
-        // copy and comparing it to the first.
-
-        // read an existing VCF
-        final VCFFileReader originalFileReader = new VCFFileReader(new File("src/test/resources/htsjdk/variant/VCF4HeaderTest.vcf"), false);
-        final VCFHeader originalHeader = originalFileReader.getFileHeader();
-
-        // add a header line with quotes to the header
-        final Map<String, String> attributes = new LinkedHashMap<>();
-        attributes.put("ID", "VariantFiltration");
-        attributes.put("CommandLineOptions", "filterName=[ANNOTATION] filterExpression=[ANNOTATION == \"NA\" || ANNOTATION <= 2.0]");
-        final VCFSimpleHeaderLine addedHeaderLine = new VCFSimpleHeaderLine("GATKCommandLine.Test", attributes);
-        originalHeader.addMetaDataLine(addedHeaderLine);
-
-        final VCFFilterHeaderLine originalCopyAnnotationLine1 = originalHeader.getFilterHeaderLine("ANNOTATION");
-        Assert.assertNotNull(originalCopyAnnotationLine1);
-        Assert.assertEquals(originalCopyAnnotationLine1.getGenericFieldValue("Description"), "ANNOTATION != \"NA\" || ANNOTATION <= 0.01", originalCopyAnnotationLine1.toString());
-
-        final VCFFilterHeaderLine originalCopyAnnotationLine2 = originalHeader.getFilterHeaderLine("ANNOTATION2");
-        Assert.assertNotNull(originalCopyAnnotationLine2);
-        Assert.assertEquals(originalCopyAnnotationLine2.getGenericFieldValue("Description"), "ANNOTATION with quote \" that is unmatched but escaped");
-
-        final VCFInfoHeaderLine originalEscapingQuoteInfoLine = originalHeader.getInfoHeaderLine("EscapingQuote");
-        Assert.assertNotNull(originalEscapingQuoteInfoLine);
-        Assert.assertEquals(originalEscapingQuoteInfoLine.getDescription(), "This description has an escaped \" quote in it");
-
-        final VCFInfoHeaderLine originalEscapingBackslashInfoLine = originalHeader.getInfoHeaderLine("EscapingBackslash");
-        Assert.assertNotNull(originalEscapingBackslashInfoLine);
-        Assert.assertEquals(originalEscapingBackslashInfoLine.getDescription(), "This description has an escaped \\ backslash in it");
-
-        final VCFInfoHeaderLine originalEscapingNonQuoteOrBackslashInfoLine = originalHeader.getInfoHeaderLine("EscapingNonQuoteOrBackslash");
-        Assert.assertNotNull(originalEscapingNonQuoteOrBackslashInfoLine);
-        Assert.assertEquals(originalEscapingNonQuoteOrBackslashInfoLine.getDescription(), "This other value has a \\n newline in it");
-
-        // write the file out into a new copy
-        final File firstCopyVCFFile = File.createTempFile("testEscapeHeaderQuotes1.", ".vcf");
-        firstCopyVCFFile.deleteOnExit();
-
-        final VariantContextWriter firstCopyWriter = new VariantContextWriterBuilder()
-                .setOutputFile(firstCopyVCFFile)
-                .setReferenceDictionary(createArtificialSequenceDictionary())
-                .setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER, Options.INDEX_ON_THE_FLY))
-                .build();
-        firstCopyWriter.writeHeader(originalHeader);
-        final CloseableIterator<VariantContext> firstCopyVariantIterator = originalFileReader.iterator();
-        while (firstCopyVariantIterator.hasNext()) {
-            VariantContext variantContext = firstCopyVariantIterator.next();
-            firstCopyWriter.add(variantContext);
-        }
-        originalFileReader.close();
-        firstCopyWriter.close();
-
-        // read the copied file back in
-        final VCFFileReader firstCopyReader = new VCFFileReader(firstCopyVCFFile, false);
-        final VCFHeader firstCopyHeader = firstCopyReader.getFileHeader();
-        final VCFHeaderLine firstCopyNewHeaderLine = firstCopyHeader.getOtherHeaderLine("GATKCommandLine.Test");
-        Assert.assertNotNull(firstCopyNewHeaderLine);
-
-        final VCFFilterHeaderLine firstCopyAnnotationLine1 = firstCopyHeader.getFilterHeaderLine("ANNOTATION");
-        Assert.assertNotNull(firstCopyAnnotationLine1);
-        Assert.assertEquals(firstCopyAnnotationLine1.getGenericFieldValue("Description"), "ANNOTATION != \"NA\" || ANNOTATION <= 0.01");
-
-        final VCFFilterHeaderLine firstCopyAnnotationLine2 = firstCopyHeader.getFilterHeaderLine("ANNOTATION2");
-        Assert.assertNotNull(firstCopyAnnotationLine2);
-
-        final VCFInfoHeaderLine firstCopyEscapingQuoteInfoLine = firstCopyHeader.getInfoHeaderLine("EscapingQuote");
-        Assert.assertNotNull(firstCopyEscapingQuoteInfoLine);
-        Assert.assertEquals(firstCopyEscapingQuoteInfoLine.getDescription(), "This description has an escaped \" quote in it");
-
-        final VCFInfoHeaderLine firstCopyEscapingBackslashInfoLine = firstCopyHeader.getInfoHeaderLine("EscapingBackslash");
-        Assert.assertNotNull(firstCopyEscapingBackslashInfoLine);
-        Assert.assertEquals(firstCopyEscapingBackslashInfoLine.getDescription(), "This description has an escaped \\ backslash in it");
-
-        final VCFInfoHeaderLine firstCopyEscapingNonQuoteOrBackslashInfoLine = firstCopyHeader.getInfoHeaderLine("EscapingNonQuoteOrBackslash");
-        Assert.assertNotNull(firstCopyEscapingNonQuoteOrBackslashInfoLine);
-        Assert.assertEquals(firstCopyEscapingNonQuoteOrBackslashInfoLine.getDescription(), "This other value has a \\n newline in it");
-
-
-        // write one more copy to make sure things don't get double escaped
-        final File secondCopyVCFFile = File.createTempFile("testEscapeHeaderQuotes2.", ".vcf");
-        secondCopyVCFFile.deleteOnExit();
-        final VariantContextWriter secondCopyWriter = new VariantContextWriterBuilder()
-                .setOutputFile(secondCopyVCFFile)
-                .setReferenceDictionary(createArtificialSequenceDictionary())
-                .setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER, Options.INDEX_ON_THE_FLY))
-                .build();
-        secondCopyWriter.writeHeader(firstCopyHeader);
-        final CloseableIterator<VariantContext> secondCopyVariantIterator = firstCopyReader.iterator();
-        while (secondCopyVariantIterator.hasNext()) {
-            VariantContext variantContext = secondCopyVariantIterator.next();
-            secondCopyWriter.add(variantContext);
-        }
-        secondCopyWriter.close();
-
-        // read the second copy back in and verify that the two files have the same header line
-        final VCFFileReader secondCopyReader = new VCFFileReader(secondCopyVCFFile, false);
-        final VCFHeader secondCopyHeader = secondCopyReader.getFileHeader();
-
-        final VCFHeaderLine secondCopyNewHeaderLine = secondCopyHeader.getOtherHeaderLine("GATKCommandLine.Test");
-        Assert.assertNotNull(secondCopyNewHeaderLine);
-
-        final VCFFilterHeaderLine secondCopyAnnotationLine1 = secondCopyHeader.getFilterHeaderLine("ANNOTATION");
-        Assert.assertNotNull(secondCopyAnnotationLine1);
-
-        final VCFFilterHeaderLine secondCopyAnnotationLine2 = secondCopyHeader.getFilterHeaderLine("ANNOTATION2");
-        Assert.assertNotNull(secondCopyAnnotationLine2);
-
-        Assert.assertEquals(firstCopyNewHeaderLine, secondCopyNewHeaderLine);
-        Assert.assertEquals(firstCopyNewHeaderLine.toStringEncoding(), "GATKCommandLine.Test=<ID=VariantFiltration,CommandLineOptions=\"filterName=[ANNOTATION] filterExpression=[ANNOTATION == \\\"NA\\\" || ANNOTATION <= 2.0]\">");
-        Assert.assertEquals(secondCopyNewHeaderLine.toStringEncoding(), "GATKCommandLine.Test=<ID=VariantFiltration,CommandLineOptions=\"filterName=[ANNOTATION] filterExpression=[ANNOTATION == \\\"NA\\\" || ANNOTATION <= 2.0]\">");
-
-        Assert.assertEquals(firstCopyAnnotationLine1, secondCopyAnnotationLine1);
-        Assert.assertEquals(secondCopyAnnotationLine1.getGenericFieldValue("Description"), "ANNOTATION != \"NA\" || ANNOTATION <= 0.01");
-        Assert.assertEquals(firstCopyAnnotationLine2, secondCopyAnnotationLine2);
-        Assert.assertEquals(secondCopyAnnotationLine2.getGenericFieldValue("Description"), "ANNOTATION with quote \" that is unmatched but escaped");
-
-        final VCFInfoHeaderLine secondCopyEscapingQuoteInfoLine = secondCopyHeader.getInfoHeaderLine("EscapingQuote");
-        Assert.assertNotNull(secondCopyEscapingQuoteInfoLine);
-        Assert.assertEquals(secondCopyEscapingQuoteInfoLine.getDescription(), "This description has an escaped \" quote in it");
-
-        final VCFInfoHeaderLine secondCopyEscapingBackslashInfoLine = secondCopyHeader.getInfoHeaderLine("EscapingBackslash");
-        Assert.assertNotNull(secondCopyEscapingBackslashInfoLine);
-        Assert.assertEquals(secondCopyEscapingBackslashInfoLine.getDescription(), "This description has an escaped \\ backslash in it");
-
-        final VCFInfoHeaderLine secondCopyEscapingNonQuoteOrBackslashInfoLine = secondCopyHeader.getInfoHeaderLine("EscapingNonQuoteOrBackslash");
-        Assert.assertNotNull(secondCopyEscapingNonQuoteOrBackslashInfoLine);
-        Assert.assertEquals(secondCopyEscapingNonQuoteOrBackslashInfoLine.getDescription(), "This other value has a \\n newline in it");
-
-        firstCopyReader.close();
-        secondCopyReader.close();
-
-    }
-
-    /**
-     * a little utility function for all tests to md5sum a file
-     * Shameless taken from:
-     * <p/>
-     * http://www.javalobby.org/java/forums/t84420.html
-     *
-     * @param file the file
-     * @return a string
-     */
-    private static String md5SumFile(File file) {
-        MessageDigest digest;
-        try {
-            digest = MessageDigest.getInstance("MD5");
-        } catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException("Unable to find MD5 digest");
-        }
-        InputStream is;
-        try {
-            is = new FileInputStream(file);
-        } catch (FileNotFoundException e) {
-            throw new RuntimeException("Unable to open file " + file);
-        }
-        byte[] buffer = new byte[8192];
-        int read;
-        try {
-            while ((read = is.read(buffer)) > 0) {
-                digest.update(buffer, 0, read);
-            }
-            byte[] md5sum = digest.digest();
-            BigInteger bigInt = new BigInteger(1, md5sum);
-            return bigInt.toString(16);
-
-        } catch (IOException e) {
-            throw new RuntimeException("Unable to process file for MD5", e);
-        } finally {
-            try {
-                is.close();
-            } catch (IOException e) {
-                throw new RuntimeException("Unable to close input stream for MD5 calculation", e);
-            }
-        }
-    }
-
-    private void checkMD5ofHeaderFile(VCFHeader header, String md5sum) {
-        File myTempFile = null;
-        PrintWriter pw = null;
-        try {
-            myTempFile = File.createTempFile("VCFHeader", "vcf");
-            myTempFile.deleteOnExit();
-            pw = new PrintWriter(myTempFile);
-        } catch (IOException e) {
-            Assert.fail("Unable to make a temp file!");
-        }
-        for (VCFHeaderLine line : header.getMetaDataInSortedOrder())
-            pw.println(line);
-        pw.close();
-        Assert.assertEquals(md5SumFile(myTempFile), md5sum);
-    }
-
-    public static int VCF4headerStringCount = 16;
-
-    public static String VCF4headerStrings =
-            "##fileformat=VCFv4.2\n" +
-                    "##filedate=2010-06-21\n" +
-                    "##reference=NCBI36\n" +
-                    "##INFO=<ID=GC, Number=0, Type=Flag, Description=\"Overlap with Gencode CCDS coding sequence\">\n" +
-                    "##INFO=<ID=DP, Number=1, Type=Integer, Description=\"Total number of reads in haplotype window\">\n" +
-                    "##INFO=<ID=AF, Number=A, Type=Float, Description=\"Dindel estimated population allele frequency\">\n" +
-                    "##INFO=<ID=CA, Number=1, Type=String, Description=\"Pilot 1 callability mask\">\n" +
-                    "##INFO=<ID=HP, Number=1, Type=Integer, Description=\"Reference homopolymer tract length\">\n" +
-                    "##INFO=<ID=NS, Number=1, Type=Integer, Description=\"Number of samples with data\">\n" +
-                    "##INFO=<ID=DB, Number=0, Type=Flag, Description=\"dbSNP membership build 129 - type match and indel sequence length match within 25 bp\">\n" +
-                    "##INFO=<ID=NR, Number=1, Type=Integer, Description=\"Number of reads covering non-ref variant on reverse strand\">\n" +
-                    "##INFO=<ID=NF, Number=1, Type=Integer, Description=\"Number of reads covering non-ref variant on forward strand\">\n" +
-                    "##FILTER=<ID=NoQCALL, Description=\"Variant called by Dindel but not confirmed by QCALL\">\n" +
-                    "##FORMAT=<ID=GT, Number=1, Type=String, Description=\"Genotype\">\n" +
-                    "##FORMAT=<ID=HQ, Number=2, Type=Integer, Description=\"Haplotype quality\">\n" +
-                    "##FORMAT=<ID=GQ, Number=1, Type=Integer, Description=\"Genotype quality\">\n" +
-                    "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n";
-
-
-    public static String VCF4headerStrings_with_negativeOne =
-            "##fileformat=VCFv4.2\n" +
-                    "##filedate=2010-06-21\n" +
-                    "##reference=NCBI36\n" +
-                    "##INFO=<ID=GC, Number=0, Type=Flag, Description=\"Overlap with Gencode CCDS coding sequence\">\n" +
-                    "##INFO=<ID=YY, Number=., Type=Integer, Description=\"Some weird value that has lots of parameters\">\n" +
-                    "##INFO=<ID=AF, Number=A, Type=Float, Description=\"Dindel estimated population allele frequency\">\n" +
-                    "##INFO=<ID=CA, Number=1, Type=String, Description=\"Pilot 1 callability mask\">\n" +
-                    "##INFO=<ID=HP, Number=1, Type=Integer, Description=\"Reference homopolymer tract length\">\n" +
-                    "##INFO=<ID=NS, Number=1, Type=Integer, Description=\"Number of samples with data\">\n" +
-                    "##INFO=<ID=DB, Number=0, Type=Flag, Description=\"dbSNP membership build 129 - type match and indel sequence length match within 25 bp\">\n" +
-                    "##INFO=<ID=NR, Number=1, Type=Integer, Description=\"Number of reads covering non-ref variant on reverse strand\">\n" +
-                    "##INFO=<ID=NF, Number=1, Type=Integer, Description=\"Number of reads covering non-ref variant on forward strand\">\n" +
-                    "##FILTER=<ID=NoQCALL, Description=\"Variant called by Dindel but not confirmed by QCALL\">\n" +
-                    "##FORMAT=<ID=GT, Number=1, Type=String, Description=\"Genotype\">\n" +
-                    "##FORMAT=<ID=HQ, Number=2, Type=Integer, Description=\"Haplotype quality\">\n" +
-                    "##FORMAT=<ID=TT, Number=., Type=Integer, Description=\"Lots of TTs\">\n" +
-                    "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n";
-
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFStandardHeaderLinesUnitTest.java b/src/test/java/htsjdk/variant/vcf/VCFStandardHeaderLinesUnitTest.java
deleted file mode 100644
index f72cd87..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFStandardHeaderLinesUnitTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-* 
-* 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 AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.variant.VariantBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Created by IntelliJ IDEA.
- * User: aaron
- * Date: Jun 30, 2010
- * Time: 3:32:08 PM
- * To change this template use File | Settings | File Templates.
- */
-public class VCFStandardHeaderLinesUnitTest extends VariantBaseTest {
-    @DataProvider(name = "getStandardLines")
-    public Object[][] makeGetStandardLines() {
-        List<Object[]> tests = new ArrayList<Object[]>();
-
-        // info
-        tests.add(new Object[]{"AC", "info", true});
-        tests.add(new Object[]{"AN", "info", true});
-        tests.add(new Object[]{"AF", "info", true});
-        tests.add(new Object[]{"DP", "info", true});
-        tests.add(new Object[]{"DB", "info", true});
-        tests.add(new Object[]{"END", "info", true});
-        tests.add(new Object[]{"SB", "info", true});
-        tests.add(new Object[]{"MQ", "info", true});
-        tests.add(new Object[]{"MQ0", "info", true});
-        tests.add(new Object[]{"SOMATIC", "info", true});
-
-        // format
-        tests.add(new Object[]{"GT", "format", true});
-        tests.add(new Object[]{"GQ", "format", true});
-        tests.add(new Object[]{"DP", "format", true});
-        tests.add(new Object[]{"AD", "format", true});
-        tests.add(new Object[]{"PL", "format", true});
-        tests.add(new Object[]{"FT", "format", true});
-        tests.add(new Object[]{"PQ", "format", true});
-
-        tests.add(new Object[]{"NOT_STANDARD", "info", false});
-        tests.add(new Object[]{"NOT_STANDARD", "format", false});
-
-        return tests.toArray(new Object[][]{});
-    }
-
-
-    @Test(dataProvider = "getStandardLines")
-    public void getStandardLines(final String key, final String type, final boolean expectedToBeStandard) {
-        VCFCompoundHeaderLine line = null;
-        if ( type.equals("info") )
-            line = VCFStandardHeaderLines.getInfoLine(key, false);
-        else if ( type.equals("format") )
-            line = VCFStandardHeaderLines.getFormatLine(key, false);
-        else
-            throw new IllegalArgumentException("Unexpected type in getStandardLines " + type);
-
-        if ( expectedToBeStandard ) {
-            Assert.assertNotNull(line);
-            Assert.assertEquals(line.getID(), key);
-            Assert.assertTrue(deeperTest(line));
-        } else {
-            Assert.assertNull(line);
-        }
-    }
-
-    private boolean deeperTest(final VCFCompoundHeaderLine line){
-
-        final String id = line.getID();
-        if(id.equals(VCFConstants.GENOTYPE_KEY))
-            return line.getType().equals(VCFHeaderLineType.String) && line.getCount()==1 ;
-        else if(id.equals(VCFConstants.GENOTYPE_QUALITY_KEY))
-            return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
-        else if(id.equals(VCFConstants.DEPTH_KEY))
-            return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
-        else if(id.equals(VCFConstants.GENOTYPE_PL_KEY))
-            return line.getType().equals(VCFHeaderLineType.Integer) && line.getCountType().equals(VCFHeaderLineCount.G);
-        else if(id.equals(VCFConstants.GENOTYPE_ALLELE_DEPTHS))
-            return line.getType().equals(VCFHeaderLineType.Integer) && line.getCountType().equals(VCFHeaderLineCount.R);
-        else if(id.equals(VCFConstants.GENOTYPE_FILTER_KEY))
-            return line.getType().equals(VCFHeaderLineType.String) && line.getCountType().equals(VCFHeaderLineCount.UNBOUNDED);
-        else if(id.equals(VCFConstants.PHASE_QUALITY_KEY))
-            return line.getType().equals(VCFHeaderLineType.Float) && line.getCount()==1;
-        else if(id.equals(VCFConstants.END_KEY))
-            return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
-        else if(id.equals(VCFConstants.DBSNP_KEY))
-            return line.getType().equals(VCFHeaderLineType.Flag) && line.getCount()==0;
-        else if(id.equals(VCFConstants.DEPTH_KEY))
-            return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
-        else if(id.equals(VCFConstants.STRAND_BIAS_KEY))
-            return line.getType().equals(VCFHeaderLineType.Float) && line.getCount()==1;
-        else if(id.equals(VCFConstants.ALLELE_FREQUENCY_KEY))
-            return line.getType().equals(VCFHeaderLineType.Float) && line.getCountType().equals(VCFHeaderLineCount.A);
-        else if(id.equals(VCFConstants.ALLELE_COUNT_KEY))
-            return line.getType().equals(VCFHeaderLineType.Integer) && line.getCountType().equals(VCFHeaderLineCount.A);
-        else if(id.equals(VCFConstants.ALLELE_NUMBER_KEY))
-            return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
-        else if(id.equals(VCFConstants.MAPPING_QUALITY_ZERO_KEY))
-            return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
-        else if(id.equals(VCFConstants.RMS_MAPPING_QUALITY_KEY))
-            return line.getType().equals(VCFHeaderLineType.Float) && line.getCount()==1;
-        else if(id.equals(VCFConstants.SOMATIC_KEY))
-            return line.getType().equals(VCFHeaderLineType.Flag) && line.getCount()==0;
-        else
-            throw new IllegalArgumentException("Unexpected id : " + id);
-    }
-
-    private class RepairHeaderTest {
-        final VCFCompoundHeaderLine original, expectedResult;
-
-        private RepairHeaderTest(final VCFCompoundHeaderLine original) {
-            this(original, original);
-        }
-
-        private RepairHeaderTest(final VCFCompoundHeaderLine original, final VCFCompoundHeaderLine expectedResult) {
-            this.original = original;
-            this.expectedResult = expectedResult;
-        }
-
-        public String toString() {
-            return "RepairHeaderTest: Original: " + original.toStringEncoding() + "  Expected: " + expectedResult.toStringEncoding();
-        }
-    }
-
-    @DataProvider(name = "RepairHeaderTest")
-    public Object[][] makeRepairHeaderTest() {
-        final VCFInfoHeaderLine standardAC = VCFStandardHeaderLines.getInfoLine("AC");
-        final VCFInfoHeaderLine goodAC = new VCFInfoHeaderLine("AC", VCFHeaderLineCount.A, VCFHeaderLineType.Integer, "x");
-
-        final VCFFormatHeaderLine standardGT = VCFStandardHeaderLines.getFormatLine("GT");
-        final VCFFormatHeaderLine goodGT = new VCFFormatHeaderLine("GT", 1, VCFHeaderLineType.String, "x");
-
-        List<Object[]> tests = new ArrayList<Object[]>();
-
-        tests.add(new Object[]{new RepairHeaderTest( standardGT, standardGT)});
-        tests.add(new Object[]{new RepairHeaderTest( goodGT, goodGT )});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", 2, VCFHeaderLineType.String, "x"), standardGT)});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", 1, VCFHeaderLineType.Integer, "x"), standardGT)});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", 1, VCFHeaderLineType.Float, "x"), standardGT)});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Float, "x"), standardGT)});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", VCFHeaderLineCount.G, VCFHeaderLineType.String, "x"), standardGT)});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", VCFHeaderLineCount.A, VCFHeaderLineType.String, "x"), standardGT)});
-
-        tests.add(new Object[]{new RepairHeaderTest( standardAC, standardAC)});
-        tests.add(new Object[]{new RepairHeaderTest( goodAC, goodAC )});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", 1, VCFHeaderLineType.Integer, "x"), standardAC)});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", VCFHeaderLineCount.G, VCFHeaderLineType.Integer, "x"), standardAC)});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"), standardAC)});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", 1, VCFHeaderLineType.Float, "x"), standardAC)});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", 1, VCFHeaderLineType.String, "x"), standardAC)});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", 0, VCFHeaderLineType.Flag, "x"), standardAC)});
-
-        tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("NON_STANDARD_INFO", 1, VCFHeaderLineType.String, "x"))});
-        tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("NON_STANDARD_FORMAT", 1, VCFHeaderLineType.String, "x"))});
-
-        return tests.toArray(new Object[][]{});
-    }
-
-    @Test(dataProvider = "RepairHeaderTest")
-    public void testRepairHeaderTest(final RepairHeaderTest cfg) {
-        final VCFHeader toRepair = new VCFHeader(Collections.singleton((VCFHeaderLine)cfg.original));
-        final VCFHeader repaired = VCFStandardHeaderLines.repairStandardHeaderLines(toRepair);
-
-        VCFCompoundHeaderLine repairedLine = (VCFCompoundHeaderLine)repaired.getFormatHeaderLine(cfg.original.getID());
-        if ( repairedLine == null ) repairedLine = (VCFCompoundHeaderLine)repaired.getInfoHeaderLine(cfg.original.getID());
-
-        Assert.assertNotNull(repairedLine, "Repaired header didn't contain the expected line");
-        Assert.assertEquals(repairedLine.getID(), cfg.expectedResult.getID());
-        Assert.assertEquals(repairedLine.getType(), cfg.expectedResult.getType());
-        Assert.assertEquals(repairedLine.getCountType(), cfg.expectedResult.getCountType());
-        if ( repairedLine.getCountType() == VCFHeaderLineCount.INTEGER ) {
-            Assert.assertEquals(repairedLine.getCount(), cfg.expectedResult.getCount());
-        }
-    }
-}
diff --git a/src/test/resources/htsjdk/samtools/BAMCigarOverflowTest/CigarOverflowTest.bam b/src/test/resources/htsjdk/samtools/BAMCigarOverflowTest/CigarOverflowTest.bam
deleted file mode 100755
index 5a926af..0000000
Binary files a/src/test/resources/htsjdk/samtools/BAMCigarOverflowTest/CigarOverflowTest.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam b/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam
deleted file mode 100644
index 8aa4751..0000000
Binary files a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai b/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai
deleted file mode 100644
index 49b423e..0000000
Binary files a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam b/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam
deleted file mode 120000
index 53313ae..0000000
--- a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam
+++ /dev/null
@@ -1 +0,0 @@
-index_test.bam
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam.bai b/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam.bai
deleted file mode 120000
index 0f95610..0000000
--- a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam.bai
+++ /dev/null
@@ -1 +0,0 @@
-index_test.bam.bai
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_without_linked_index.bam b/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_without_linked_index.bam
deleted file mode 120000
index 53313ae..0000000
--- a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_without_linked_index.bam
+++ /dev/null
@@ -1 +0,0 @@
-index_test.bam
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.bam b/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.bam
deleted file mode 100755
index ab0e1a2..0000000
Binary files a/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.sam b/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.sam
deleted file mode 100644
index a1349e9..0000000
--- a/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at HD	VN:1.0
- at SQ	SN:chr20	AS:HG18	LN:62435964
-read_28833_29006_6945	99	chr20	28833	20	10M1D25M	=	28993	195	AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG	<<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<<	MF:i:130	Nm:i:1	H0:i:0	H1:i:0	SB:i:-128	UB:i:129	SS:i:32767	US:i:65535	SI:i:2147483647	I2:i:-2147483647	UI:i:4294967295
-
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome1to10.bam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome1to10.bam
deleted file mode 100755
index 671814e..0000000
Binary files a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome1to10.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome5to9.bam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome5to9.bam
deleted file mode 100755
index d32ab86..0000000
Binary files a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome5to9.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file1.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file1.sam
deleted file mode 100644
index a6963c2..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file1.sam
+++ /dev/null
@@ -1,5 +0,0 @@
- at HD	VN:1.0	GO:none	SO:coordinate
- at SQ	SN:chrM	LN:16571	AS:HG18	UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta	M5:d2ed829b8a1628d16cbeee88e88e39eb	SP:Homo sapiens
- at RG	ID:1	SM:sample1	PL:ILLUMINA
- at PG	ID:1	PN:something
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file2.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file2.sam
deleted file mode 100644
index 17a41ab..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file2.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD	VN:1.0	GO:none	SO:coordinate
- at SQ	SN:chrM	LN:16571	AS:HG18	UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta	M5:d2ed829b8a1628d16cbeee88e88e39eb	SP:Homo sapiens
- at RG	ID:1	SM:sample1	PL:ILLUMINA
- at PG	ID:1	PN:A
- at PG	ID:1.1	PN:B
- at PG	ID:2	PN:C	PP:1
- at PG	ID:2.1	PN:D	PP:1.1
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/expected_output.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/expected_output.sam
deleted file mode 100644
index c43a2e9..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/expected_output.sam
+++ /dev/null
@@ -1,13 +0,0 @@
- at HD	VN:1.5	GO:none	SO:coordinate
- at SQ	SN:chrM	LN:16571	AS:HG18	UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta	M5:d2ed829b8a1628d16cbeee88e88e39eb	SP:Homo sapiens
- at RG	ID:1	PL:ILLUMINA	SM:sample1
- at PG	ID:1	PN:something
- at PG	ID:1.1	PN:A
- at PG	ID:1.1.2	PN:B
- at PG	ID:2	PN:C	PP:1.1
- at PG	ID:2.1	PN:D	PP:1.1.2
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file1.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file1.sam
deleted file mode 100644
index a2575f0..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file1.sam
+++ /dev/null
@@ -1,9 +0,0 @@
- at HD	VN:1.0	GO:none	SO:coordinate
- at SQ	SN:chrM	LN:16571	AS:HG18	UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta	M5:d2ed829b8a1628d16cbeee88e88e39eb	SP:Homo sapiens
- at RG	ID:1	SM:sample1	PL:ILLUMINA
- at PG	ID:1	PN:A
- at PG	ID:2	PN:B	PP:1
- at PG	ID:3	PN:C	PP:1
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	147	chrM	50678	0	101M	=	50418	-360	TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT	:99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9	RG:Z:1	E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC	OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCCCC [...]
-6194MAAXX100108:2:55:19789:20399:BI	73	chrM	50921	0	101M	=	50921	0	CAACCAGAAACCAGGCTGGGCGCTANAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAAAGCTTACTGTCTAGAGGGCGAGGTACAAANNNNNN	97:>?A>>BB>@B@?@CA5@?5=C@############################################################################	RG:Z:1	E2:Z:ACCAAGTGGGAAGTTAGTTAAAAGGTCATTTTTTTTTTTTTTTTTTTGTTGTTTTGTTTTTTTCCCCAAAATACCATATTTTTTAAGATATTTTTTTTTGT	OQ:Z:C>CCCC@@C@@CC@?CCC2@?8<??############################################################################	 [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file2.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file2.sam
deleted file mode 100644
index 5e6e7ea..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file2.sam
+++ /dev/null
@@ -1,7 +0,0 @@
- at HD	VN:1.0	GO:none	SO:coordinate
- at SQ	SN:chrM	LN:16571	AS:HG18	UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta	M5:d2ed829b8a1628d16cbeee88e88e39eb	SP:Homo sapiens
- at RG	ID:1	SM:sample1	PL:ILLUMINA
- at PG	ID:1	PN:A
- at PG	ID:2	PN:B	PP:1
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	147	chrM	50678	0	101M	=	50418	-360	TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT	:99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9	RG:Z:1	E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC	OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCCCC [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file3.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file3.sam
deleted file mode 100644
index 6bda955..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file3.sam
+++ /dev/null
@@ -1,9 +0,0 @@
- at HD	VN:1.0	GO:none	SO:coordinate
- at SQ	SN:chrM	LN:16571	AS:HG18	UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta	M5:d2ed829b8a1628d16cbeee88e88e39eb	SP:Homo sapiens
- at RG	ID:1	SM:sample2	PL:ILLUMINA
- at PG	ID:1	PN:X
- at PG	ID:2	PN:B	PP:1
- at PG	ID:3	PN:Y	PP:2
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	147	chrM	50678	0	101M	=	50418	-360	TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT	:99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9	RG:Z:1	E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC	OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCCCC [...]
-6194MAAXX100108:2:55:19789:20399:BI	73	chrM	50921	0	101M	=	50921	0	CAACCAGAAACCAGGCTGGGCGCTANAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAAAGCTTACTGTCTAGAGGGCGAGGTACAAANNNNNN	97:>?A>>BB>@B@?@CA5@?5=C@############################################################################	RG:Z:1	E2:Z:ACCAAGTGGGAAGTTAGTTAAAAGGTCATTTTTTTTTTTTTTTTTTTGTTGTTTTGTTTTTTTCCCCAAAATACCATATTTTTTAAGATATTTTTTTTTGT	OQ:Z:C>CCCC@@C@@CC@?CCC2@?8<??############################################################################	 [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file4.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file4.sam
deleted file mode 100644
index d0c43d7..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file4.sam
+++ /dev/null
@@ -1,5 +0,0 @@
- at HD	VN:1.0	GO:none	SO:coordinate
- at SQ	SN:chrM	LN:16571	AS:HG18	UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta	M5:d2ed829b8a1628d16cbeee88e88e39eb	SP:Homo sapiens
- at RG	ID:1.1	SM:sample3	PL:ILLUMINA
- at PG	ID:2	PN:B
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1.1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@ [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/expected_output.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/expected_output.sam
deleted file mode 100644
index 6755f30..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/expected_output.sam
+++ /dev/null
@@ -1,21 +0,0 @@
- at HD	VN:1.5	GO:none	SO:coordinate
- at SQ	SN:chrM	LN:16571	AS:HG18	UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta	M5:d2ed829b8a1628d16cbeee88e88e39eb	SP:Homo sapiens
- at RG	ID:1	PL:ILLUMINA	SM:sample1
- at RG	ID:1.1	PL:ILLUMINA	SM:sample2
- at RG	ID:1.1.2	PL:ILLUMINA	SM:sample3
- at PG	ID:1	PN:A
- at PG	ID:1.1	PN:X
- at PG	ID:2	PN:B
- at PG	ID:2.3	PN:B	PP:1
- at PG	ID:2.4	PN:B	PP:1.1
- at PG	ID:3	PN:C	PP:1
- at PG	ID:3.6	PN:Y	PP:2.4
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1.1.1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACC [...]
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI	99	chrM	50418	0	101M	=	50678	360	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1.1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@ [...]
-6194MAAXX100108:2:55:3087:12679:BI	147	chrM	50678	0	101M	=	50418	-360	TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT	:99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9	RG:Z:1	E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC	OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCCCC [...]
-6194MAAXX100108:2:55:3087:12679:BI	147	chrM	50678	0	101M	=	50418	-360	TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT	:99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9	RG:Z:1.1	E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC	OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCC [...]
-6194MAAXX100108:2:55:3087:12679:BI	147	chrM	50678	0	101M	=	50418	-360	TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT	:99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9	RG:Z:1	E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC	OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCCCC [...]
-6194MAAXX100108:2:55:19789:20399:BI	73	chrM	50921	0	101M	=	50921	0	CAACCAGAAACCAGGCTGGGCGCTANAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAAAGCTTACTGTCTAGAGGGCGAGGTACAAANNNNNN	97:>?A>>BB>@B@?@CA5@?5=C@############################################################################	RG:Z:1.1	E2:Z:ACCAAGTGGGAAGTTAGTTAAAAGGTCATTTTTTTTTTTTTTTTTTTGTTGTTTTGTTTTTTTCCCCAAAATACCATATTTTTTAAGATATTTTTTTTTGT	OQ:Z:C>CCCC@@C@@CC@?CCC2@?8<??########################################################################### [...]
-6194MAAXX100108:2:55:19789:20399:BI	73	chrM	50921	0	101M	=	50921	0	CAACCAGAAACCAGGCTGGGCGCTANAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAAAGCTTACTGTCTAGAGGGCGAGGTACAAANNNNNN	97:>?A>>BB>@B@?@CA5@?5=C@############################################################################	RG:Z:1	E2:Z:ACCAAGTGGGAAGTTAGTTAAAAGGTCATTTTTTTTTTTTTTTTTTTGTTGTTTTGTTTTTTTCCCCAAAATACCATATTTTTTAAGATATTTTTTTTTGT	OQ:Z:C>CCCC@@C@@CC@?CCC2@?8<??############################################################################	 [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/1.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/1.sam
deleted file mode 100644
index f4f16f8..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/1.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD	VN:1.0	GO:none	SO:unsorted
- at SQ	SN:chrM	LN:16571	AS:HG18	UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG	ID:1	SM:sample1	PL:ILLUMINA
- at PG	ID:1	PN:A
- at PG	ID:1.1	PN:B
- at PG	ID:2	PN:C	PP:1
- at PG	ID:2.1	PN:D	PP:1.1
-A	0	chrM	100	0	101M	*	0	0	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C	PG:Z:1	NM:i:0	UQ:i:0
-F	0	chrM	600	0	101M	*	0	0	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C	PG:Z:1.1	NM:i:0	UQ:i:0
-E	0	chrM	500	0	101M	*	0	0	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C	PG:Z:2	NM:i:0	UQ:i:0
-D	0	chrM	400	0	101M	*	0	0	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C	PG:Z:2.1	NM:i:0	UQ:i:0
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/2.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/2.sam
deleted file mode 100644
index 70991a7..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/2.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD	VN:1.0	GO:none	SO:unsorted
- at SQ	SN:chrM	LN:16571	AS:HG18	UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG	ID:1	SM:sample1	PL:ILLUMINA
- at PG	ID:1	PN:A
- at PG	ID:1.1	PN:B
- at PG	ID:2	PN:C	PP:1
- at PG	ID:2.1	PN:D	PP:1.1
-H	0	chrM	800	0	101M	*	0	0	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C	PG:Z:1	NM:i:0	UQ:i:0
-B	0	chrM	200	0	101M	*	0	0	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C	PG:Z:1.1	NM:i:0	UQ:i:0
-C	0	chrM	300	0	101M	*	0	0	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C	PG:Z:2	NM:i:0	UQ:i:0
-G	0	chrM	700	0	101M	*	0	0	TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG	9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9<	RG:Z:1	E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT	OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C	PG:Z:2.1	NM:i:0	UQ:i:0
diff --git a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.dict b/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.dict
deleted file mode 100644
index db5b251..0000000
--- a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD	VN:1.5	SO:unsorted
- at SQ	SN:chr1	LN:16	M5:56b74a652b3ed2f610263b8bb423167c	UR:file:src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
- at SQ	SN:chr2	LN:16	M5:b835d2c026aa66c52a05838dcc0b59d4	UR:file:src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
diff --git a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta b/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
deleted file mode 100644
index 0b446ca..0000000
--- a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
+++ /dev/null
@@ -1,4 +0,0 @@
->chr1
-ACGTACGTacgtacgt
->chr2
-TCGATCGAtcgatcga
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta.fai b/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta.fai
deleted file mode 100644
index 9314c8f..0000000
--- a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-chr1	16	6	16	17
-chr2	16	29	16	16
diff --git a/src/test/resources/htsjdk/samtools/SequenceUtil/upper_and_lowercase_read.sam b/src/test/resources/htsjdk/samtools/SequenceUtil/upper_and_lowercase_read.sam
deleted file mode 100644
index 82efe85..0000000
--- a/src/test/resources/htsjdk/samtools/SequenceUtil/upper_and_lowercase_read.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at HD	VN:1.5	SO:coordinate
- at SQ	SN:chr1	LN:16	M5:56b74a652b3ed2f610263b8bb423167c	UR:file:src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
- at SQ	SN:chr2	LN:16	M5:b835d2c026aa66c52a05838dcc0b59d4	UR:file:src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
- at CO	chr1 value is                           ACGTACGTacgtacgt
- at CO	chr2 value is                           TCGATCGAtcgatcga
-read1	0	chr1	1	0	16M	*	0	0	AcGtAcGTaCGtAcGt	AAAAAAAAAAAAAAAA	NM:i:0
-read2	0	chr1	1	0	16M	*	0	0	AcGtAcGTaCGtAcGt	AAAAAAAAAAAAAAAA	NM:i:0
-read3	0	chr2	1	0	16M	*	0	0	AcGtAcGTaCGtAcGt	AAAAAAAAAAAAAAAA	NM:i:8	MD:Z:0T2A0T2A0t2a0t2a0
-read4	0	chr2	1	0	8M	*	0	0	TCGATCGA	AAAAAAAA	NM:i:0
-read5	0	chr2	1	0	4M1D2M1S	*	0	0	TCGACGAA	AAAAAAAA	NM:i:1	MD:Z:4^T2
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bai b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bai
deleted file mode 100644
index bf4bc62..0000000
Binary files a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bam
deleted file mode 100644
index 8aa4751..0000000
Binary files a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/buggyHeader.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/buggyHeader.sam
deleted file mode 100755
index 5d2b1b4..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/buggyHeader.sam
+++ /dev/null
@@ -1,30 +0,0 @@
- at HD VN:1.0  SO:coordinate
- at SQ	SN:chr1	SN:chr123	LN:247249719	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:9ebc6df9496613f373e73396d5b3b6b6 SP:Homo sapiens
- at SQ	SN:chr2	LN:242951149	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:b12c7373e3882120332983be99aeb18d SP:Homo sapiens
- at SQ	SN:chr3	LN:199501827	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:4e390df72c70f259b074be639d8f9578 SP:Homo sapiens
- at SQ	SN:chr4	LN:191273063	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:cf37020337904229dca8401907b626c2 SP:Homo sapiens
- at SQ	SN:chr5	LN:180857866	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:031c851664e31b2c17337fd6f9004858 SP:Homo sapiens
- at SQ	SN:chr6	LN:170899992	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:bfe8005c536131276d448ead33f1b583 SP:Homo sapiens
- at SQ	SN:chr7	LN:158821424	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:74239c5ceee3b28f0038123d958114cb SP:Homo sapiens
- at SQ	SN:chr8	LN:146274826	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:1eb00fe1ce26ce6701d2cd75c35b5ccb SP:Homo sapiens
- at SQ	SN:chr9	LN:140273252	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:ea244473e525dde0393d353ef94f974b SP:Homo sapiens
- at SQ	SN:chr10	LN:135374737	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:4ca41bf2d7d33578d2cd7ee9411e1533 SP:Homo sapiens
- at SQ	SN:chr11	LN:134452384	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:425ba5eb6c95b60bafbf2874493a56c3 SP:Homo sapiens
- at SQ	SN:chr12	LN:132349534	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:d17d70060c56b4578fa570117bf19716 SP:Homo sapiens
- at SQ	SN:chr13	LN:114142980	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:c4f3084a20380a373bbbdb9ae30da587 SP:Homo sapiens
- at SQ	SN:chr14	LN:106368585	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:c1ff5d44683831e9c7c1db23f93fbb45 SP:Homo sapiens
- at SQ	SN:chr15	LN:100338915	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:5cd9622c459fe0a276b27f6ac06116d8 SP:Homo sapiens
- at SQ	SN:chr16	LN:88827254	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:3e81884229e8dc6b7f258169ec8da246 SP:Homo sapiens
- at SQ	SN:chr17	LN:78774742	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:2a5c95ed99c5298bb107f313c7044588 SP:Homo sapiens
- at SQ	SN:chr18	LN:76117153	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:3d11df432bcdc1407835d5ef2ce62634 SP:Homo sapiens
- at SQ	SN:chr19	LN:63811651	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:2f1a59077cfad51df907ac25723bff28 SP:Homo sapiens
- at SQ	SN:chr20	LN:62435964	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:f126cdf8a6e0c7f379d618ff66beb2da SP:Homo sapiens
- at SQ	SN:chr21	LN:46944323	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:f1b74b7f9f4cdbaeb6832ee86cb426c6 SP:Homo sapiens
- at SQ	SN:chr22	LN:49691432	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:2041e6a0c914b48dd537922cca63acb8 SP:Homo sapiens
- at SQ	SN:chrX	LN:154913754	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:d7e626c80ad172a4d7c95aadb94d9040 SP:Homo sapiens
- at SQ	SN:chrY	LN:57772954	UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta	M5:62f69d0e82a12af74bad85e2e4a8bd91 SP:Homo sapiens
- at RG     ID:A    PL:solid        PU:083_20090618_2_SL_notag      LB:ANG_TCGA-OVA.09.T_000sA      DT:2009-06-18T19:00:00-0500     SM:TCGA-09-0364-01A-02W-0370-010     CN:Baylor
- at RG     ID:B    PL:solid        PU:083_20090618_2_SL_detag      LB:ANG_TCGA-OVA.09.T_000sA      DT:2009-06-18T19:00:00-0500     SM:TCGA-09-0364-01A-02W-0370-010     CN:Baylor
- at PG	ID:0	VN:4.0r2.0 CL:/data/bucket2/corona_lite_v4.0r2.0 -t 50 or 30 -z 10 -e 6:50 or 3:30
- at CO	Hi, Mom!
-1003_834_22	0	chr1	7330	255	50M	*	0	0	CCCAGGCCTCCCGAGCCGAGCCATCCGTCACCCCCTGGCTCCTGGCCGCT	@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>9@@@?9<@@(((!	RG:Z:0	CS:Z:T20012030220032230322301320312110000210322021030332	CQ:Z:499;=,4988	MD:Z:23C23TA1
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicate_rg.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicate_rg.sam
deleted file mode 100644
index 1ec8faa..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicate_rg.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD	VN:1.5	SO:coordinate
- at SQ	SN:chr1	LN:101	UR:merger.fasta	M5:bd01f7e11515bb6beda8f7257902aa67
- at SQ	SN:chr2	LN:101	UR:merger.fasta	M5:31c33e2155b3de5e2554b693c475b310
- at SQ	SN:chr3	LN:101	UR:merger.fasta	M5:631593c6dd2048ae88dcce2bd505d295
- at SQ	SN:chr4	LN:101	UR:merger.fasta	M5:c60cb92f1ee5b78053c92bdbfa19abf1
- at SQ	SN:chr5	LN:101	UR:merger.fasta	M5:07ebc213c7611db0eacbb1590c3e9bda
- at SQ	SN:chr6	LN:101	UR:merger.fasta	M5:7be2f5e7ee39e60a6c3b5b6a41178c6d
- at SQ	SN:chr7	LN:404	UR:merger.fasta	M5:da488fc432cdaf2c20c96da473a7b630
- at SQ	SN:chr8	LN:202	UR:merger.fasta	M5:d339678efce576d5546e88b49a487b63
- at RG	ID:H7U2W.1	PU:H7U2WADXX140408.1.AAGTAGAG	LB:Solexa-1	PI:0	DT:2014-04-08T00:00:00-0400	SM:K-562	CN:BI
- at RG	ID:H7U2W.1	PU:H7U2WADXX140408.1.AAGTAGAG	LB:Solexa-2	PI:0	DT:2014-04-08T00:00:00-0400	SM:K-562	CN:BI
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads.sam
deleted file mode 100644
index e9e003c..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads.sam
+++ /dev/null
@@ -1,17 +0,0 @@
- at HD	VN:1.0	SO:coordinate
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at SQ	SN:chr4	LN:101
- at SQ	SN:chr5	LN:101
- at SQ	SN:chr6	LN:101
- at SQ	SN:chr7	LN:404
- at SQ	SN:chr8	LN:202
- at RG	ID:0	SM:Hi,Mom!	LB:my-library	PL:ILLUMINA
- at RG	ID:1	SM:Hi,Mom!	LB:my-library	PL:ILLUMINA
- at RG	ID:2	SM:Hi,Mom!	LB:my-library	PL:Illumina
- at PG	ID:1	PN:Hey!	VN:2.0
-duplicate_read	77	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0	PG:Z:1	NM:i:0	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read	141	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:1	PG:Z:1	NM:i:3	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read	77	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0	PG:Z:1	NM:i:0	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read	141	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:1	PG:Z:1	NM:i:3	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads_out_of_order.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads_out_of_order.sam
deleted file mode 100644
index 23094dc..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads_out_of_order.sam
+++ /dev/null
@@ -1,17 +0,0 @@
- at HD	VN:1.0	SO:coordinate
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at SQ	SN:chr4	LN:101
- at SQ	SN:chr5	LN:101
- at SQ	SN:chr6	LN:101
- at SQ	SN:chr7	LN:404
- at SQ	SN:chr8	LN:202
- at RG	ID:0	SM:Hi,Mom!	LB:my-library	PL:ILLUMINA
- at RG	ID:1	SM:Hi,Mom!	LB:my-library	PL:ILLUMINA
- at RG	ID:2	SM:Hi,Mom!	LB:my-library	PL:Illumina
- at PG	ID:1	PN:Hey!	VN:2.0
-duplicate_read	77	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0	PG:Z:1	NM:i:0	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read	77	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:1	PG:Z:1	NM:i:3	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read	141	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0	PG:Z:1	NM:i:0	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read	141	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:1	PG:Z:1	NM:i:3	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/hanging_tab.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/hanging_tab.sam
deleted file mode 100644
index a4a4331..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/hanging_tab.sam
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at RG	ID:0	PL:illumina	PU:300TDAAXX090429.8	LB:Solexa-3536	DT:Wed Apr 29 00:00:00 EDT 2009	SM:CLONED Phi-X Control	CN:broad
-300TDAAXX090429:8:100:0:1001#0	589	*	0	0	*	*	0	0	NNNNNNNNNNNNNNNNNNNNNNNNN	#########################	XN:i:1	RG:Z:0	
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/inappropriate_mate_cigar_string.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/inappropriate_mate_cigar_string.sam
deleted file mode 100644
index 167ed36..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/inappropriate_mate_cigar_string.sam
+++ /dev/null
@@ -1,13 +0,0 @@
- at HD	VN:1.5	SO:coordinate
- at SQ	SN:chr1	LN:101	UR:merger.fasta	M5:bd01f7e11515bb6beda8f7257902aa67
- at SQ	SN:chr2	LN:101	UR:merger.fasta	M5:31c33e2155b3de5e2554b693c475b310
- at SQ	SN:chr3	LN:101	UR:merger.fasta	M5:631593c6dd2048ae88dcce2bd505d295
- at SQ	SN:chr4	LN:101	UR:merger.fasta	M5:c60cb92f1ee5b78053c92bdbfa19abf1
- at SQ	SN:chr5	LN:101	UR:merger.fasta	M5:07ebc213c7611db0eacbb1590c3e9bda
- at SQ	SN:chr6	LN:101	UR:merger.fasta	M5:7be2f5e7ee39e60a6c3b5b6a41178c6d
- at SQ	SN:chr7	LN:404	UR:merger.fasta	M5:da488fc432cdaf2c20c96da473a7b630
- at SQ	SN:chr8	LN:202	UR:merger.fasta	M5:d339678efce576d5546e88b49a487b63
- at RG	ID:0	SM:Hi,Mom!
- at PG	ID:0	PN:myAligner	VN:1.0	CL:align!
-pair_read	73	chr7	3	9	6M	=	3	0	CAACAG	)'.*.+	MC:Z:*	PG:Z:0	RG:Z:0	NM:i:4	UQ:i:33
-pair_read	133	chr7	3	0	*	=	3	0	NCGCGG	&/1544	MC:Z:6M	PG:Z:0	RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_coord_sort_order.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_coord_sort_order.sam
deleted file mode 100644
index 7f22b9a..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_coord_sort_order.sam
+++ /dev/null
@@ -1,27 +0,0 @@
- at HD	VN:1.0	SO:coordinate
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at SQ	SN:chr4	LN:101
- at SQ	SN:chr5	LN:101
- at SQ	SN:chr6	LN:101
- at SQ	SN:chr7	LN:202
- at SQ	SN:chr8	LN:202
-SL-XAV:1:1:0:764#0/1	89	chr1	1	255	101M	*	0	0	TTCATGCTGANGCNCTCTTACGATCGTACAGATGCAAATATTAACANNCNTTNAAGNNCANNNNNNNNNCAATACAATANTAGAGTACGTNAACACTCCAN	&/,&-.1/6/&&)&).)/,&0768)&/.,/874,&.4137572)&/&&,&1-&.0/&&*,&&&&&&&&&&18775799,&16:8775-56256/69::;0&	RG:Z:0	XN:i:1
-SL-XAV:1:1:0:1668#0/2	153	chr2	1	255	101M	*	0	0	CATCTCTACANGCGCGTCCTACCAGACGCGCTTCCGATCTGAGAGCATACTTTTCATTGGATTCCAGCACAACTCCATTTTTGATCCACTNGACACCTTTN	(/,'-/'0////(1'&&1&&&&'2''-6/,/3-33653.6:1'.86/-++32.-4864653/5/583/346423203+28888644446688456/4880&	RG:Z:0	XN:i:1
-SL-XAV:1:1:0:1914#0/2	153	chr3	1	255	101M	*	0	0	CGTATGCGCTNTTTATGTCGCCCACAGTGCCTAGTATAGCCCCTGCTAATAAAAAGAGATGAATACGTTTACTTAAAAAACTGAAACTAGNAATGTGCAAN	(0,7&&*/*0*,)10/).-*&.&*/6669.&-337599;3,&,6/.,5::999987893+387020775777547999::668997448:::9;999::0&	RG:Z:0
-SL-XAV:1:1:0:1639#0/2	153	chr1	1	255	101M	*	0	0	CGTGATACCANCTCATGTTCACAGCCAAAGCCTGAAGCTGTCTATTATATTTCTCAACCATAAACTTTTGCCTCAGGCATCCGCAGAATGNTTTGCAGCCN	'.&.&&'.0+01'2(1'(''-)','+0041/.+032;:867115/5267-.0/)-5.&-26200224,,0+0/0275/5605688::646875568882*&	RG:Z:0
-SL-XAV:1:1:0:68#0/2	137	chr5	1	255	101M	*	0	0	NTCTCATTTANAAATGGTTATAAAAACATTTATGCTGAAAAGGTGAAGTTCATTAATGAACAGGCTGACTGTCTCACTATCGCGTTCGCANGACGTTATCT	&1<<999;;;;<<<87579:556972789977444.'.023.&,7621/54.49.)/53055-22--''+(.'-))6-168/(3&&0(<).))*&&&&&'0	RG:Z:0
-SL-XAV:1:1:0:700#0/2	137	chr6	1	255	101M	*	0	0	NAATTGTTCTNAGTTTCTCGGTTTATGTGCTCTTCCAGGTGGGTAACACAATAATGGCCTTCCAGATCGTAAGAGCGACGTGTGTTGCACNAGTGTCGATC	&0::887::::6/646::838388811/679:87640&./2+/-4/28:3,536/4''&&.78/(/554/./02*)*',-(57()&.6(6:(0601'/(,*	RG:Z:0
-SL-XAV:1:1:0:1721#0/1	83	chr7	1	255	101M	=	102	40	CAACAGAAGGNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCGAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0
-SL-XAV:1:1:0:1721#0/2	163	chr7	102	255	101M	=	1	-40	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0
-SL-XAV:1:1:0:105#0/2	147	chr8	1	255	101M	=	102	79	CACATCGTGANTCTTACAATCTGCGGTTTCAGATGTGGAGCGATGTGTGAGAGATTGAGCAACTGATCTGAAAAGCAGACACAGCTATTCNTAAGATGACN	/))3--/&*()&)&&+'++.'-&,(.))'4,)&'&&,')8,&&*'.&*0'225/&)3-8//)*,5-*).7851453583.3568526:863688:::85.&	RG:Z:0
-SL-XAV:1:1:0:105#0/1	99	chr8	102	255	101M	=	1	-79	NCAGGTTCAANTGTGCAGCCCNTTTTGAGAGATNNNNNNNNTGNNCTGNAANANNGACACAGCTATTCCTAAGATGACAAGATCAGANAANAAGTCAAGCA	&06665578::41.*/7577/&/77403-324.&&&&&&&&/.&&..&&.0&&&&',:9:/-/(55002020+3'12+2/&.2-&//&),&*&&&&&&&51	RG:Z:0
-SL-XAV:1:1:0:1300#0/1	77	*	0	0	*	*	0	0	NAAACACAAGNNANAGTCTTANCNGCTATTCCNNNNNNNNNCTNNNCTNAGNANNACATACAACAGTATCCACACAAGTGTACTCGTNCANACATGTGAAC	&*5535)*-,,&.&.*-1)*,&'&)&1&&.,)&&&&&&&&&)0&&&0'&&&&.&&*2'/4''0/**&)&,'-&*,&,&&&.0.&)&&&**&,.&&&')&&)	RG:Z:0
-SL-XAV:1:1:0:1300#0/2	141	*	0	0	*	*	0	0	NGATCATGGANGACTCTCCCCATCCCCCGCTCCAGCGCTCAGTTATATGCCTAGCCTCGGACACGTCACCAACATCTCACGCACTCTGCANAGTCTCTCAC	&&'+''3*&-/)/1'26/*-2-/542-*&-&/'/*/&-'&)-')&.'-/&&2+122*'&+,(/-&)((,/-,,.'2(2'+)/&/&-66-&&/16&)&*&'3	RG:Z:0
-SL-XAV:1:1:0:1639#0/1	101	*	0	0	*	chr1	1	0	NCCCTCTCAGNNTNTCTGCCANANCCTTAAGCNNNNNNNNNTANNNCTNAANCNNAAACTTTTGCCTCAGGCATCCGCAGAATGTTTNTCNGCCTATATCG	&1::::::64/&/&0:3.280&/&087881,/&&&&&&&&&..&&&..&,,&-&&,265341-)/5680&-.5552-25/322/42/&)&&).421&-&-/	RG:Z:0
-SL-XAV:1:1:0:1668#0/1	101	*	0	0	*	chr2	1	0	NATAGCATACNNTNCATTGGANTNCAGCACAANNNNNNNNNTGNNNCANTNNANNCCTTTGAGATCGGAAGAGCGGTTCAGCAGGAANNCNCAGACCGATC	&1988998890&0&.8863//&.&.0-2875.&&&&&&&&&.)&&&..&.&&.&&.5782-2+262)&-0-0510*.332-2.-,0*&&*&'.&-2-)0.,	RG:Z:0
-SL-XAV:1:1:0:1914#0/1	101	*	0	0	*	chr3	1	0	NTTTTTCTCCNNCNGTGCCTANTNTAGCCCCTNNNNNNNNNAANNNATNANNANNTTTACTTAAAAAACTGAAACTAGTAATGTGCANNANATCGNAAGAG	&0::::<<;90&/&.244760&,&.414798/&&&&&&&&&00&&&0.&/&&-&&.4475687363504.&.557/.*)65.&/*./&&.&.+*)&..).&	RG:Z:0
-SL-XAV:1:1:0:68#0/1	581	*	0	0	*	chr4	1	0	NAATATTCATNNGNTCAGCCTNTNCATTAATTNNNNNNNNNTTNNNATNATNANNTTTTTTATAACCATTTATAAATGAGAGAGATCNTANCACAATATCA	&0<<:::::</&&&.73'290&.&0;:::90&&&&&&&&&&..&&&0)&0-&0&&&.743799995253348597921.,.'050.*&.0&)*)&&&&*).	RG:Z:0
-SL-XAV:1:1:0:700#0/1	581	*	0	0	*	chr5	1	0	NGAAGCCCATNNTNGTGTTACNCNCCTGGAAGNNNNNNNNNACNNNGANACNTNNAACAATTCAGATCGGAAGAGCGGTTCAGCAGANNTNCCGAGACCGA	&.88888:88/&0&,03189.&/&.8/))12/&&&&&&&&&./&&&&.&1.&)&&/35962/6432-3&),0&/2+0,),61&-6,&&&'&/,.0&...)0	RG:Z:0
-SL-XAV:1:1:0:764#0/2	165	*	0	0	*	chr6	1	0	NACAGATGCANATATTAACAGGCTTTAAAGGACAGATGGACTGCAATACAATAATAGAGTACGTCAACACTCCACAGATCGCTAGAGCATNACATCGGTGT	&/:5358::9999::99998255::7275,,/5567-'+387537857:54-4.51'31059547320;73/720+22.4(6.;((.;(;8()(''&&2&&	RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_mate_cigar_string.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_mate_cigar_string.sam
deleted file mode 100644
index a7e33b7..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_mate_cigar_string.sam
+++ /dev/null
@@ -1,19 +0,0 @@
- at HD	VN:1.5	SO:coordinate
- at SQ	SN:chr1	LN:101	UR:merger.fasta	M5:bd01f7e11515bb6beda8f7257902aa67
- at SQ	SN:chr2	LN:101	UR:merger.fasta	M5:31c33e2155b3de5e2554b693c475b310
- at SQ	SN:chr3	LN:101	UR:merger.fasta	M5:631593c6dd2048ae88dcce2bd505d295
- at SQ	SN:chr4	LN:101	UR:merger.fasta	M5:c60cb92f1ee5b78053c92bdbfa19abf1
- at SQ	SN:chr5	LN:101	UR:merger.fasta	M5:07ebc213c7611db0eacbb1590c3e9bda
- at SQ	SN:chr6	LN:101	UR:merger.fasta	M5:7be2f5e7ee39e60a6c3b5b6a41178c6d
- at SQ	SN:chr7	LN:404	UR:merger.fasta	M5:da488fc432cdaf2c20c96da473a7b630
- at SQ	SN:chr8	LN:202	UR:merger.fasta	M5:d339678efce576d5546e88b49a487b63
- at RG	ID:0	SM:Hi,Mom!
- at PG	ID:0	PN:myAligner	VN:1.0	CL:align!
-pair_both_hit	65	chr7	1	100	101M	=	120	120	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	MC:Z:99M	PG:Z:0	RG:Z:0	NM:i:21	MQ:i:100	UQ:i:144
-pair_both_multihit	321	chr7	1	100	101M	=	120	120	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	MC:Z:101M	PG:Z:0	RG:Z:0	HI:i:0	NM:i:21	MQ:i:100	UQ:i:144
-pair_both_multihit	321	chr7	10	100	101M	=	130	121	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	MC:Z:101M	PG:Z:0	RG:Z:0	HI:i:1	NM:i:83	MQ:i:100	UQ:i:865
-pair_both_hit	129	chr7	120	100	101M	=	1	-120	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	MC:Z:101M	PG:Z:0	RG:Z:0	NM:i:73	MQ:i:100	UQ:i:944
-pair_both_multihit	385	chr7	120	100	101M	=	1	-120	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	MC:Z:101M	PG:Z:0	RG:Z:0	HI:i:0	NM:i:73	MQ:i:100	UQ:i:944
-pair_both_multihit	385	chr7	130	100	101M	=	10	-121	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	MC:Z:101M	PG:Z:0	RG:Z:0	HI:i:1	NM:i:84	MQ:i:100	UQ:i:1072
-pair_both_multihit	65	chr8	1	100	101M	=	101	101	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	MC:Z:101M	PG:Z:0	RG:Z:0	HI:i:2	NM:i:86	MQ:i:100	UQ:i:940
-pair_both_multihit	129	chr8	101	100	101M	=	1	-101	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	MC:Z:101M	PG:Z:0	RG:Z:0	HI:i:2	NM:i:81	MQ:i:100	UQ:i:1042
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_platform_unit.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_platform_unit.sam
deleted file mode 100644
index c594c8f..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_platform_unit.sam
+++ /dev/null
@@ -1,21 +0,0 @@
- at HD	VN:1.0	SO:coordinate
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at SQ	SN:chr4	LN:101
- at SQ	SN:chr5	LN:101
- at SQ	SN:chr6	LN:101
- at SQ	SN:chr7	LN:404
- at SQ	SN:chr8	LN:202
- at RG	ID:0	SM:Hi,Mom!	LB:my-library	PL:TRICORDER
- at RG	ID:1	SM:Hi,Mom!	LB:my-library	PL:ILLUMINA
- at RG	ID:2	SM:Hi,Mom!	LB:my-library	PL:ILLUMINA
- at PG	ID:1	PN:Hey!	VN:2.0
-both_reads_align_clip_marked	1107	chr7	1	255	101M	=	302	201	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0	PG:Z:1	NM:i:0	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_present_only_first_aligns	89	chr7	1	255	101M	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:1	PG:Z:1	NM:i:3	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-read_2_too_many_gaps	83	chr7	1	255	101M	=	302	201	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:2	PG:Z:1	NM:i:8	MQ:i:255	XT:Z:foo2	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_adapter	147	chr7	16	255	101M	=	21	-96	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:1	PG:Z:1	NM:i:1	MQ:i:255	XT:Z:foo2	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_adapter	99	chr7	21	255	101M	=	16	96	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:1	PG:Z:1	NM:i:1	MQ:i:255	XT:Z:foo2	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_marked	163	chr7	302	255	101M	=	1	-201	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0	PG:Z:1	NM:i:5	MQ:i:255	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-read_2_too_many_gaps	163	chr7	302	255	10M1D10M5I76M	=	1	-201	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:2	PG:Z:1	NM:i:6	MQ:i:255	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_present_only_first_aligns	165	*	0	0	*	chr7	1	0	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:1	PG:Z:1	
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_queryname_sort_order.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_queryname_sort_order.sam
deleted file mode 100644
index 553ec81..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_queryname_sort_order.sam
+++ /dev/null
@@ -1,27 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at SQ	SN:chr4	LN:101
- at SQ	SN:chr5	LN:101
- at SQ	SN:chr6	LN:101
- at SQ	SN:chr7	LN:202
- at SQ	SN:chr8	LN:202
-SL-XAV:1:1:0:764#0/1	89	chr1	1	255	101M	*	0	0	TTCATGCTGANGCNCTCTTACGATCGTACAGATGCAAATATTAACANNCNTTNAAGNNCANNNNNNNNNCAATACAATANTAGAGTACGTNAACACTCCAN	&/,&-.1/6/&&)&).)/,&0768)&/.,/874,&.4137572)&/&&,&1-&.0/&&*,&&&&&&&&&&18775799,&16:8775-56256/69::;0&	RG:Z:0	XN:i:1
-SL-XAV:1:1:0:1668#0/2	153	chr2	1	255	101M	*	0	0	CATCTCTACANGCGCGTCCTACCAGACGCGCTTCCGATCTGAGAGCATACTTTTCATTGGATTCCAGCACAACTCCATTTTTGATCCACTNGACACCTTTN	(/,'-/'0////(1'&&1&&&&'2''-6/,/3-33653.6:1'.86/-++32.-4864653/5/583/346423203+28888644446688456/4880&	RG:Z:0	XN:i:1
-SL-XAV:1:1:0:1914#0/2	153	chr3	1	255	101M	*	0	0	CGTATGCGCTNTTTATGTCGCCCACAGTGCCTAGTATAGCCCCTGCTAATAAAAAGAGATGAATACGTTTACTTAAAAAACTGAAACTAGNAATGTGCAAN	(0,7&&*/*0*,)10/).-*&.&*/6669.&-337599;3,&,6/.,5::999987893+387020775777547999::668997448:::9;999::0&	RG:Z:0
-SL-XAV:1:1:0:1639#0/2	153	chr4	1	255	101M	*	0	0	CGTGATACCANCTCATGTTCACAGCCAAAGCCTGAAGCTGTCTATTATATTTCTCAACCATAAACTTTTGCCTCAGGCATCCGCAGAATGNTTTGCAGCCN	'.&.&&'.0+01'2(1'(''-)','+0041/.+032;:867115/5267-.0/)-5.&-26200224,,0+0/0275/5605688::646875568882*&	RG:Z:0
-SL-XAV:1:1:0:68#0/2	137	chr5	1	255	101M	*	0	0	NTCTCATTTANAAATGGTTATAAAAACATTTATGCTGAAAAGGTGAAGTTCATTAATGAACAGGCTGACTGTCTCACTATCGCGTTCGCANGACGTTATCT	&1<<999;;;;<<<87579:556972789977444.'.023.&,7621/54.49.)/53055-22--''+(.'-))6-168/(3&&0(<).))*&&&&&'0	RG:Z:0
-SL-XAV:1:1:0:700#0/2	137	chr6	1	255	101M	*	0	0	NAATTGTTCTNAGTTTCTCGGTTTATGTGCTCTTCCAGGTGGGTAACACAATAATGGCCTTCCAGATCGTAAGAGCGACGTGTGTTGCACNAGTGTCGATC	&0::887::::6/646::838388811/679:87640&./2+/-4/28:3,536/4''&&.78/(/554/./02*)*',-(57()&.6(6:(0601'/(,*	RG:Z:0
-SL-XAV:1:1:0:1721#0/1	83	chr7	1	255	101M	=	102	40	CAACAGAAGGNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCGAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0
-SL-XAV:1:1:0:1721#0/2	163	chr7	102	255	101M	=	1	-40	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0
-SL-XAV:1:1:0:105#0/2	147	chr8	1	255	101M	=	102	79	CACATCGTGANTCTTACAATCTGCGGTTTCAGATGTGGAGCGATGTGTGAGAGATTGAGCAACTGATCTGAAAAGCAGACACAGCTATTCNTAAGATGACN	/))3--/&*()&)&&+'++.'-&,(.))'4,)&'&&,')8,&&*'.&*0'225/&)3-8//)*,5-*).7851453583.3568526:863688:::85.&	RG:Z:0
-SL-XAV:1:1:0:105#0/1	99	chr8	102	255	101M	=	1	-79	NCAGGTTCAANTGTGCAGCCCNTTTTGAGAGATNNNNNNNNTGNNCTGNAANANNGACACAGCTATTCCTAAGATGACAAGATCAGANAANAAGTCAAGCA	&06665578::41.*/7577/&/77403-324.&&&&&&&&/.&&..&&.0&&&&',:9:/-/(55002020+3'12+2/&.2-&//&),&*&&&&&&&51	RG:Z:0
-SL-XAV:1:1:0:1300#0/1	77	*	0	0	*	*	0	0	NAAACACAAGNNANAGTCTTANCNGCTATTCCNNNNNNNNNCTNNNCTNAGNANNACATACAACAGTATCCACACAAGTGTACTCGTNCANACATGTGAAC	&*5535)*-,,&.&.*-1)*,&'&)&1&&.,)&&&&&&&&&)0&&&0'&&&&.&&*2'/4''0/**&)&,'-&*,&,&&&.0.&)&&&**&,.&&&')&&)	RG:Z:0
-SL-XAV:1:1:0:1300#0/2	141	*	0	0	*	*	0	0	NGATCATGGANGACTCTCCCCATCCCCCGCTCCAGCGCTCAGTTATATGCCTAGCCTCGGACACGTCACCAACATCTCACGCACTCTGCANAGTCTCTCAC	&&'+''3*&-/)/1'26/*-2-/542-*&-&/'/*/&-'&)-')&.'-/&&2+122*'&+,(/-&)((,/-,,.'2(2'+)/&/&-66-&&/16&)&*&'3	RG:Z:0
-SL-XAV:1:1:0:1639#0/1	101	*	0	0	*	chr1	1	0	NCCCTCTCAGNNTNTCTGCCANANCCTTAAGCNNNNNNNNNTANNNCTNAANCNNAAACTTTTGCCTCAGGCATCCGCAGAATGTTTNTCNGCCTATATCG	&1::::::64/&/&0:3.280&/&087881,/&&&&&&&&&..&&&..&,,&-&&,265341-)/5680&-.5552-25/322/42/&)&&).421&-&-/	RG:Z:0
-SL-XAV:1:1:0:1668#0/1	101	*	0	0	*	chr2	1	0	NATAGCATACNNTNCATTGGANTNCAGCACAANNNNNNNNNTGNNNCANTNNANNCCTTTGAGATCGGAAGAGCGGTTCAGCAGGAANNCNCAGACCGATC	&1988998890&0&.8863//&.&.0-2875.&&&&&&&&&.)&&&..&.&&.&&.5782-2+262)&-0-0510*.332-2.-,0*&&*&'.&-2-)0.,	RG:Z:0
-SL-XAV:1:1:0:1914#0/1	101	*	0	0	*	chr3	1	0	NTTTTTCTCCNNCNGTGCCTANTNTAGCCCCTNNNNNNNNNAANNNATNANNANNTTTACTTAAAAAACTGAAACTAGTAATGTGCANNANATCGNAAGAG	&0::::<<;90&/&.244760&,&.414798/&&&&&&&&&00&&&0.&/&&-&&.4475687363504.&.557/.*)65.&/*./&&.&.+*)&..).&	RG:Z:0
-SL-XAV:1:1:0:68#0/1	581	*	0	0	*	chr4	1	0	NAATATTCATNNGNTCAGCCTNTNCATTAATTNNNNNNNNNTTNNNATNATNANNTTTTTTATAACCATTTATAAATGAGAGAGATCNTANCACAATATCA	&0<<:::::</&&&.73'290&.&0;:::90&&&&&&&&&&..&&&0)&0-&0&&&.743799995253348597921.,.'050.*&.0&)*)&&&&*).	RG:Z:0
-SL-XAV:1:1:0:700#0/1	581	*	0	0	*	chr5	1	0	NGAAGCCCATNNTNGTGTTACNCNCCTGGAAGNNNNNNNNNACNNNGANACNTNNAACAATTCAGATCGGAAGAGCGGTTCAGCAGANNTNCCGAGACCGA	&.88888:88/&0&,03189.&/&.8/))12/&&&&&&&&&./&&&&.&1.&)&&/35962/6432-3&),0&/2+0,),61&-6,&&&'&/,.0&...)0	RG:Z:0
-SL-XAV:1:1:0:764#0/2	165	*	0	0	*	chr6	1	0	NACAGATGCANATATTAACAGGCTTTAAAGGACAGATGGACTGCAATACAATAATAGAGTACGTCAACACTCCACAGATCGCTAGAGCATNACATCGGTGT	&/:5358::9999::99998255::7275,,/5567-'+387537857:54-4.51'31059547320;73/720+22.4(6.;((.;(;8()(''&&2&&	RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_no_oqs.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_no_oqs.sam
deleted file mode 100755
index efe2be2..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_no_oqs.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at SQ	SN:REF	LN:1000
-A	99	REF	100	50	10M	=	200	100	CAACAGAAGC	)'.*.+2,))	MC:Z:5M1I4M
-A	147	REF	200	50	5M1I4M	=	100	-100	CAACAGAAGC	)'.*.+2,))	MC:Z:10M
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_oqs.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_oqs.sam
deleted file mode 100755
index 3782ad7..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_oqs.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at SQ	SN:REF	LN:1000
-A	99	REF	100	50	10M	=	200	100	CAACAGAAGC	)'.*.+2,))	MC:Z:5M1I4M	OQ:Z:IIIIIIIIII
-A	147	REF	200	50	5M1I4M	=	100	-100	CAACAGAAGC	)'.*.+2,))	MC:Z:10M	OQ:Z:IIIIIIIIII
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_fields.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_fields.sam
deleted file mode 100644
index a9c0bbf..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_fields.sam
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at RG	ID:0	PL:illumina	PU:300TDAAXX090429.8	LB:Solexa-3536	DT:Wed Apr 29 00:00:00 EDT 2009	SM:CLONED Phi-X Control	CN:broad
-300TDAAXX090429:8:100:0:1001#0	589	*	0	0	*	*	0
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_platform_unit.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_platform_unit.sam
deleted file mode 100644
index c0fabd8..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_platform_unit.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at HD	VN:1.5	SO:coordinate
- at SQ	SN:chr1	LN:101	UR:merger.fasta	M5:bd01f7e11515bb6beda8f7257902aa67
- at SQ	SN:chr2	LN:101	UR:merger.fasta	M5:31c33e2155b3de5e2554b693c475b310
- at SQ	SN:chr3	LN:101	UR:merger.fasta	M5:631593c6dd2048ae88dcce2bd505d295
- at SQ	SN:chr4	LN:101	UR:merger.fasta	M5:c60cb92f1ee5b78053c92bdbfa19abf1
- at SQ	SN:chr5	LN:101	UR:merger.fasta	M5:07ebc213c7611db0eacbb1590c3e9bda
- at SQ	SN:chr6	LN:101	UR:merger.fasta	M5:7be2f5e7ee39e60a6c3b5b6a41178c6d
- at SQ	SN:chr7	LN:404	UR:merger.fasta	M5:da488fc432cdaf2c20c96da473a7b630
- at SQ	SN:chr8	LN:202	UR:merger.fasta	M5:d339678efce576d5546e88b49a487b63
- at RG	ID:H7U2W.1	PU:H7U2WADXX140408.1.AAGTAGAG	LB:Solexa-219641	PI:0	DT:2014-04-08T00:00:00-0400	SM:K-562	CN:BI
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/test_samfile_version_1pt5.bam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/test_samfile_version_1pt5.bam
deleted file mode 100644
index e8d2a70..0000000
Binary files a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/test_samfile_version_1pt5.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated.bam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated.bam
deleted file mode 100644
index bcef65a..0000000
Binary files a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_quals.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_quals.sam
deleted file mode 100644
index 34bd776..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_quals.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at RG	ID:0	PL:illumina	PU:300TDAAXX090429.8	LB:Solexa-3536	DT:Wed Apr 29 00:00:00 EDT 2009	SM:CLONED Phi-X Control	CN:broad
-300TDAAXX090429:8:100:0:1001#0	589	*	0	0	*	*	0	0	NNNNNNNNNNNNNNNNNNNNNNNNN	#########################	XN:i:1	RG:Z:0	SQ:H:07CCCBC186CA85D087CFC5D1D4CACCD6D3D1D0CDD30CD0D2D5
-300TDAAXX090429:8:100:0:1001#0	653	*	0	0	*	*	0	0	NNNNNNNNNNNNNNNNNNNNNNNNN	######################
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_tag.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_tag.sam
deleted file mode 100644
index ef4def1..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_tag.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at RG	ID:0	PL:illumina	PU:300TDAAXX090429.8	LB:Solexa-3536	DT:Wed Apr 29 00:00:00 EDT 2009	SM:CLONED Phi-X Control	CN:broad
-300TDAAXX090429:8:100:0:1001#0	589	*	0	0	*	*	0	0	NNNNNNNNNNNNNNNNNNNNNNNNN	#########################	XN:i:1	RG:Z:0	SQ:H:07CCCBC186CA85D087CFC5D1D4CACCD6D3D1D0CDD30CD0D2D5
-300TDAAXX090429:8:100:0:1001#0	653	*	0	0	*	*	0	0	NNNNNNNNNNNNNNNNNNNNNNNNN	#########################	XN:i:
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/valid.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/valid.sam
deleted file mode 100644
index 15ffe09..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/valid.sam
+++ /dev/null
@@ -1,21 +0,0 @@
- at HD	VN:1.0	SO:coordinate
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at SQ	SN:chr4	LN:101
- at SQ	SN:chr5	LN:101
- at SQ	SN:chr6	LN:101
- at SQ	SN:chr7	LN:404
- at SQ	SN:chr8	LN:202
- at RG	ID:0	SM:Hi,Mom!	LB:my-library	PL:ILLUMINA
- at RG	ID:1	SM:Hi,Mom!	LB:my-library	PL:ILLUMINA
- at RG	ID:2	SM:Hi,Mom!	LB:my-library	PL:Illumina
- at PG	ID:1	PN:Hey!	VN:2.0
-both_reads_align_clip_marked	1107	chr7	1	255	101M	=	302	201	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0	PG:Z:1	NM:i:0	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_present_only_first_aligns	89	chr7	1	255	101M	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:1	PG:Z:1	NM:i:3	MQ:i:255	XT:Z:foo	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-read_2_too_many_gaps	83	chr7	1	255	101M	=	302	201	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:2	PG:Z:1	NM:i:8	MQ:i:255	XT:Z:foo2	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_adapter	147	chr7	16	255	101M	=	21	-96	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:1	PG:Z:1	NM:i:1	MQ:i:255	XT:Z:foo2	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_adapter	99	chr7	21	255	101M	=	16	96	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:1	PG:Z:1	NM:i:1	MQ:i:255	XT:Z:foo2	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_marked	163	chr7	302	255	101M	=	1	-201	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0	PG:Z:1	NM:i:5	MQ:i:255	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-read_2_too_many_gaps	163	chr7	302	255	10M1D10M5I76M	=	1	-201	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:2	PG:Z:1	NM:i:6	MQ:i:255	OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_present_only_first_aligns	165	*	0	0	*	chr7	1	0	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:1	PG:Z:1	
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/zero_length_read.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/zero_length_read.sam
deleted file mode 100644
index 50d2fe4..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/zero_length_read.sam
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at RG	ID:0	PL:illumina	PU:300TDAAXX090429.8	LB:Solexa-3536	DT:Wed Apr 29 00:00:00 EDT 2009	SM:CLONED Phi-X Control	CN:broad
-300TDAAXX090429:8:100:0:1001#0	589	*	0	0	*	*	0	0	
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/block_compressed.sam.gz b/src/test/resources/htsjdk/samtools/block_compressed.sam.gz
deleted file mode 100644
index d948382..0000000
Binary files a/src/test/resources/htsjdk/samtools/block_compressed.sam.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/compressed.bam b/src/test/resources/htsjdk/samtools/compressed.bam
deleted file mode 100644
index 9d20ade..0000000
Binary files a/src/test/resources/htsjdk/samtools/compressed.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/compressed.sam.gz b/src/test/resources/htsjdk/samtools/compressed.sam.gz
deleted file mode 100644
index bf84cd8..0000000
Binary files a/src/test/resources/htsjdk/samtools/compressed.sam.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/coordinate_sorted.sam b/src/test/resources/htsjdk/samtools/coordinate_sorted.sam
deleted file mode 100755
index 00942a9..0000000
--- a/src/test/resources/htsjdk/samtools/coordinate_sorted.sam
+++ /dev/null
@@ -1,15 +0,0 @@
- at HD	VN:1.0	SO:coordinate
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at RG	ID:0	SM:Hi,Mom!
-B	99	chr1	1	255	10M	=	26	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-E	99	chr1	2	255	10M	=	15	30	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-E	147	chr1	15	255	10M	=	2	-30	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-B	147	chr1	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-A	73	chr2	1	255	10M	*	0	0	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-C	99	chr2	1	255	10M	=	26	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-C	147	chr2	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-D	99	chr3	1	255	10M	=	25	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-D	147	chr3	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-A	133	*	0	0	*	chr2	1	0	CAACAGAAGC	)'.*.+2,))	RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram
deleted file mode 100644
index 59f11d2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram.bai b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram.bai
deleted file mode 100644
index fcb31fc..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.dict b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.dict
deleted file mode 100644
index 7f41717..0000000
--- a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.dict
+++ /dev/null
@@ -1,2 +0,0 @@
- at HD	VN:1.4	SO:unsorted
- at SQ	SN:Shelly	LN:20	M5:7ddd8a4b4f2c1dec43476a738b1a9b72	UR:file:/Users/edwardk/Documents/htsjdk/testdata/htsjdk/samtools/cram/auxf.fa
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa
deleted file mode 100644
index 63e0c92..0000000
--- a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->Shelly
-GCTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa.fai b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa.fai
deleted file mode 100644
index 3deea7f..0000000
--- a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-Shelly	20	8	20	21
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fasta b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fasta
deleted file mode 100644
index 11d25dd..0000000
--- a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fasta
+++ /dev/null
@@ -1,2 +0,0 @@
->Sheila
-GCTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram
deleted file mode 100644
index 96ca860..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram.crai b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram.crai
deleted file mode 100644
index 1ca5df2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram.crai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram
deleted file mode 100644
index 4c74ab9..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram.crai b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram.crai
deleted file mode 100644
index 3fee0e2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram.crai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram
deleted file mode 100644
index fbfbbf7..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram.crai b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram.crai
deleted file mode 100644
index b50f3ce..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram.crai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf#values.2.1.cram b/src/test/resources/htsjdk/samtools/cram/auxf#values.2.1.cram
deleted file mode 100644
index bf81b01..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/auxf#values.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram b/src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram
deleted file mode 100644
index f4d35b6..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf#values.sam b/src/test/resources/htsjdk/samtools/cram/auxf#values.sam
deleted file mode 100644
index 4e0902f..0000000
--- a/src/test/resources/htsjdk/samtools/cram/auxf#values.sam
+++ /dev/null
@@ -1,5 +0,0 @@
- at HD	VN:1.4	SO:unsorted
- at SQ	SN:Sheila	LN:20
- at RG	ID:ID	SM:foo
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	RG:Z:ID	A!:A:!	Ac:A:c	AC:A:C	I0:i:0	I1:i:1	I2:i:127	I3:i:128	I4:i:255	I5:i:256	I6:i:32767	I7:i:32768	I8:i:65535	I9:i:65536	IA:i:2147483647	i1:i:-1	i2:i:-127	i3:i:-128	i4:i:-255	i5:i:-256	i6:i:-32767	i7:i:-32768	i8:i:-65535	i9:i:-65536	iA:i:-2147483647	iB:i:-2147483648	F0:f:-1	F1:f:0	F2:f:1	F3:f:9.9e-19	F4:f:-9.9e-19	F5:f:9.9e+19	F6:f:-9.9e+19	H0:H:AA	H1:H:dead00beef	Z0:Z:space space
-Jim	16	Sheila	11	11	10M	*	0	0	AAAAAAAAAA	*	BC:B:C,0,127,128,255	Bc:B:c,-128,-127,0,127	BS:B:S,0,32767,32768,65535	Bs:B:s,-32768,-32767,0,32767	BI:B:I,0,2147483647,2147483648,4294967295	Bi:B:i,-2147483648,-2147483647,0,2147483647
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa b/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa
deleted file mode 100644
index 1089240..0000000
--- a/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->Sheila
-CTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa.fai b/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa.fai
deleted file mode 100644
index 5709288..0000000
--- a/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-Sheila	19	8	19	20
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf.fa b/src/test/resources/htsjdk/samtools/cram/auxf.fa
deleted file mode 100644
index 11d25dd..0000000
--- a/src/test/resources/htsjdk/samtools/cram/auxf.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->Sheila
-GCTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf.fa.fai b/src/test/resources/htsjdk/samtools/cram/auxf.fa.fai
deleted file mode 100644
index f3cdedb..0000000
--- a/src/test/resources/htsjdk/samtools/cram/auxf.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-Sheila	20	8	20	21
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#bounds.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#bounds.2.1.cram
deleted file mode 100644
index ee44c86..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#bounds.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#bounds.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#bounds.3.0.cram
deleted file mode 100644
index cc96487..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#bounds.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#bounds.sam b/src/test/resources/htsjdk/samtools/cram/c1#bounds.sam
deleted file mode 100644
index 181dbe0..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#bounds.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at SQ	SN:c1	LN:10
-s0	0	c1	1	0	10M	*	0	0	AACCGCGGTT	**********
-s1	0	c1	2	0	10M	*	0	0	ACCGCGGTTC	**********
-s2	0	c1	3	0	10M	*	0	0	CCGCGGTTCG	**********
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#clip.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#clip.2.1.cram
deleted file mode 100644
index 66d010c..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#clip.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#clip.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#clip.3.0.cram
deleted file mode 100644
index 0a4bc16..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#clip.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#clip.sam b/src/test/resources/htsjdk/samtools/cram/c1#clip.sam
deleted file mode 100644
index fd073f0..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#clip.sam
+++ /dev/null
@@ -1,8 +0,0 @@
- at SQ	SN:c1	LN:10
-s0a	0	c1	1	0	10M	*	0	0	AACCGCGGTT	**********
-s0A	0	c1	1	0	3M4N3M	*	0	0	AACGTT	******
-s0b	0	c1	2	0	1S8M1S	*	0	0	AACCGCGGTT	**********
-s0B	0	c1	2	0	1H8M1H	*	0	0	ACCGCGGT	********
-s0c	0	c1	3	0	2S6M2S	*	0	0	AACCGCGGTT	**********
-s0c	0	c1	3	0	2S3M2I3M2S	*	0	0	AACCGNNCGGTT	************
-s0C	0	c1	3	0	2H6M2H	*	0	0	CCGCGG	******
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#noseq.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#noseq.2.1.cram
deleted file mode 100644
index 6e8aefb..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#noseq.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#noseq.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#noseq.3.0.cram
deleted file mode 100644
index 7db8639..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#noseq.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#noseq.sam b/src/test/resources/htsjdk/samtools/cram/c1#noseq.sam
deleted file mode 100644
index fda58c2..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#noseq.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at SQ	SN:c1	LN:10
-sq1	0	c1	1	0	10M	*	0	0	AACCGCGGTT	**********	MD:Z:10	NM:i:0
-sQ1	0	c1	1	0	10M	*	0	0	AACCGCGGTT	*	MD:Z:10	NM:i:0
-SQ1	0	c1	1	0	10M	*	0	0	*	*	MD:Z:10	NM:i:0
-sq2	0	c1	1	0	4M1D5M	*	0	0	AACCCGGTT	*********	MD:Z:4^G5	NM:i:1
-sQ2	0	c1	1	0	4M1D5M	*	0	0	AACCCGGTT	*	MD:Z:4^G5	NM:i:1
-SQ2	0	c1	1	0	4M1D5M	*	0	0	*	*	MD:Z:4^G5	NM:i:1
-sq3	4	c1	1	0	*	*	0	0	AACCCGGTT	*********
-sQ3	4	c1	1	0	*	*	0	0	AACCCGGTT	*
-SQ3	4	c1	1	0	*	*	0	0	*	*
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad1.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad1.2.1.cram
deleted file mode 100644
index 4fe23b6..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad1.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad1.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad1.3.0.cram
deleted file mode 100644
index cfcf220..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad1.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad1.sam b/src/test/resources/htsjdk/samtools/cram/c1#pad1.sam
deleted file mode 100644
index 54f7a11..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#pad1.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at SQ	SN:c1	LN:10
-s0a	0	c1	1	0	10M	*	0	0	AACCGCGGTT	*
-s0b	0	c1	1	0	10M	*	0	0	AACCGCGGTT	*
-s0c	0	c1	1	0	10M	*	0	0	AACCGCGGTT	*
-s1	0	c1	1	0	5M6I5M	*	0	0	AACCGGTTAACCGGTT	*
-s2	0	c1	1	0	5M1P4I1P5M	*	0	0	AACCGTTAACGGTT	*
-s3	0	c1	1	0	5M3I3P5M	*	0	0	AACCGGTTCGGTT	*
-s4	0	c1	1	0	5M3P3I5M	*	0	0	AACCGAACCGGTT	*
-s5	0	c1	1	0	4M1D2P2I2P1D4M	*	0	0	AACCTAGGTT	*
-s6	0	c1	1	0	2M3D6I3D2M	*	0	0	AAGTTAACTT	*
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad2.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad2.2.1.cram
deleted file mode 100644
index 5b8a3a2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad2.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad2.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad2.3.0.cram
deleted file mode 100644
index 3fbc8f3..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad2.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad2.sam b/src/test/resources/htsjdk/samtools/cram/c1#pad2.sam
deleted file mode 100644
index 66da374..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#pad2.sam
+++ /dev/null
@@ -1,14 +0,0 @@
- at SQ	SN:c1	LN:10
-s0a	0	c1	1	0	10M	*	0	0	AACCGCGGTT	*
-s0b	0	c1	1	0	10M	*	0	0	AACCGCGGTT	*
-s0c	0	c1	1	0	10M	*	0	0	AACCGCGGTT	*
-s0d	0	c1	1	0	10M	*	0	0	AACCGCGGTT	*
-s1	0	c1	1	0	5M6I5M	*	0	0	AACCGGTTAACCGGTT	*
-s2	0	c1	1	0	5M1P4I1P5M	*	0	0	AACCGTTAACGGTT	*
-s3	0	c1	1	0	5M3I3P5M	*	0	0	AACCGGTTCGGTT	*
-s4	0	c1	1	0	5M3P3I5M	*	0	0	AACCGAACCGGTT	*
-s5	0	c1	1	0	4M1D2P2I2P1D4M	*	0	0	AACCTAGGTT	*
-s6	0	c1	1	0	2M3D6I3D2M	*	0	0	AAGTTAACTT	*
-s7	0	c1	1	0	4M2D4M	*	0	0	AACCGGTT	*
-s8	0	c1	1	0	5D2P2I2P5D	*	0	0	TA	*
-s9	0	c1	5	0	1M2P2I2P	*	0	0	GTA	*
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad3.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad3.2.1.cram
deleted file mode 100644
index 6690038..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad3.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad3.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad3.3.0.cram
deleted file mode 100644
index c48ac8b..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad3.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad3.sam b/src/test/resources/htsjdk/samtools/cram/c1#pad3.sam
deleted file mode 100644
index c77da85..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#pad3.sam
+++ /dev/null
@@ -1,14 +0,0 @@
- at SQ	SN:c1	LN:10
- at RG	ID:p.sam	SM:unknown	LB:p.sam
-s0a	0	c1	6	0	5I6P5M	*	0	0	AACCGCGGTT	*	RG:Z:p.sam
-s0b	0	c1	6	0	5I6P5M	*	0	0	AACCGCGGTT	*	RG:Z:p.sam
-s0c	0	c1	6	0	5I6P5M	*	0	0	AACCGCGGTT	*	RG:Z:p.sam
-s0d	0	c1	6	0	5I6P5M	*	0	0	AACCGCGGTT	*	RG:Z:p.sam
-s1	0	c1	6	0	11I5M	*	0	0	AACCGGTTAACCGGTT	*	RG:Z:p.sam
-s2	0	c1	6	0	5I1P4I1P5M	*	0	0	AACCGTTAACGGTT	*	RG:Z:p.sam
-s3	0	c1	6	0	8I3P5M	*	0	0	AACCGGTTCGGTT	*	RG:Z:p.sam
-s4	0	c1	6	0	5I3P3I5M	*	0	0	AACCGAACCGGTT	*	RG:Z:p.sam
-s5	0	c1	6	0	4I3P2I2P1D4M	*	0	0	AACCTAGGTT	*	RG:Z:p.sam
-s6	0	c1	6	0	2I3P6I3D2M	*	0	0	AAGTTAACTT	*	RG:Z:p.sam
-s7	0	c1	6	0	4I7P1D4M	*	0	0	AACCGGTT	*	RG:Z:p.sam
-s8	0	c1	6	0	7P2I2P	*	0	0	TA	!!	RG:Z:p.sam
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#unknown.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#unknown.2.1.cram
deleted file mode 100644
index c6fdcca..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#unknown.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#unknown.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#unknown.3.0.cram
deleted file mode 100644
index a90e703..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#unknown.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#unknown.sam b/src/test/resources/htsjdk/samtools/cram/c1#unknown.sam
deleted file mode 100644
index 1f1616a..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#unknown.sam
+++ /dev/null
@@ -1,9 +0,0 @@
- at SQ	SN:c1	LN:10
- at CO	Tests permuations of seq / qual being present or "*" in mapped
- at CO	and unmapped forms.  Also tests MD/NM tag generation.
-_sqm	0	c1	1	0	2M1I4M1D3M	*	0	0	AACCCTCGTT	IIIIIIIIII	MD:Z:4G1^G3	NM:i:3
-_sm	0	c1	1	0	2M1I4M1D3M	*	0	0	AACCCTCGTT	*	MD:Z:4G1^G3	NM:i:3
-_m	0	c1	1	0	2M1I4M1D3M	*	0	0	*	*	MD:Z:4G1^G3	NM:i:3
-_squ	4	c1	1	0	*	*	0	0	AACCCTCGTT	IIIIIIIIII
-_su	4	c1	1	0	*	*	0	0	AACCCTCGTT	*
-_u	4	c1	1	0	*	*	0	0	*	*
diff --git a/src/test/resources/htsjdk/samtools/cram/c1.fa b/src/test/resources/htsjdk/samtools/cram/c1.fa
deleted file mode 100644
index 12c54c9..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->c1
-AACCGCGGTT
diff --git a/src/test/resources/htsjdk/samtools/cram/c1.fa.fai b/src/test/resources/htsjdk/samtools/cram/c1.fa.fai
deleted file mode 100644
index fc35bec..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-c1	10	4	10	11
diff --git a/src/test/resources/htsjdk/samtools/cram/c2#pad.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c2#pad.2.1.cram
deleted file mode 100644
index 12ce718..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c2#pad.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c2#pad.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c2#pad.3.0.cram
deleted file mode 100644
index e069a6b..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c2#pad.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#1.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#1.2.1.cram
deleted file mode 100644
index 6931cdd..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#1.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#1.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#1.3.0.cram
deleted file mode 100644
index 4b55413..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#1.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#1.sam b/src/test/resources/htsjdk/samtools/cram/ce#1.sam
deleted file mode 100644
index 4376deb..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#1.sam
+++ /dev/null
@@ -1,2 +0,0 @@
- at SQ	SN:CHROMOSOME_I	LN:1009800
-SRR065390.14978392	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	AS:i:-18	XS:i:-18	YT:Z:UU
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#2.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#2.2.1.cram
deleted file mode 100644
index 6c74ef5..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#2.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#2.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#2.3.0.cram
deleted file mode 100644
index 21ff68e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#2.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#2.sam b/src/test/resources/htsjdk/samtools/cram/ce#2.sam
deleted file mode 100644
index 8a4eead..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#2.sam
+++ /dev/null
@@ -1,3 +0,0 @@
- at SQ	SN:CHROMOSOME_I	LN:1009800
-SRR065390.14978392	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	XS:i:-18	AS:i:-18	YT:Z:UU
-SRR065390.921023	16	CHROMOSOME_I	3	12	100M	*	0	0	CTAAGCCTAAATCTAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	###############################################???88:;98768700000<>:BBA?BBAB?BBBBBBBB>B>BB::;?:00000	XG:i:0	XM:i:3	XN:i:0	XO:i:0	AS:i:-6	XS:i:-13	YT:Z:UU
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#5.2.1.cram
deleted file mode 100644
index bb075f7..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#5.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#5.3.0.cram
deleted file mode 100644
index 2a2f292..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#5.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5.sam b/src/test/resources/htsjdk/samtools/cram/ce#5.sam
deleted file mode 100644
index 0535065..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#5.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at SQ	SN:CHROMOSOME_I	LN:1009800
- at SQ	SN:CHROMOSOME_II	LN:5000
- at SQ	SN:CHROMOSOME_III	LN:5000
- at SQ	SN:CHROMOSOME_IV	LN:5000
- at SQ	SN:CHROMOSOME_V	LN:5000
-I	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	XS:i:-18	AS:i:-18	YT:Z:UU
-II.14978392	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	XS:i:-18	AS:i:-18	YT:Z:UU
-III	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	XS:i:-18	AS:i:-18	YT:Z:UU
-IV	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	XS:i:-18	AS:i:-18	YT:Z:UU
-V	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	XS:i:-18	AS:i:-18	YT:Z:UU
-VI	2048	CHROMOSOME_I	2	1	27M100000D73M	*	0	0	ACTAAGCCTAAGCCTAAGCCTAAGCCAATTATCGATTTCTGAAAAAATTATCGAATTTTCTAGAAATTTTGCAAATTTTTTCATAAAATTATCGATTTTA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5b.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#5b.2.1.cram
deleted file mode 100644
index 313f76d..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#5b.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5b.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#5b.3.0.cram
deleted file mode 100644
index cda2aff..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#5b.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5b.sam b/src/test/resources/htsjdk/samtools/cram/ce#5b.sam
deleted file mode 100644
index f778394..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#5b.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at SQ	SN:CHROMOSOME_I	LN:1009800
- at SQ	SN:CHROMOSOME_II	LN:5000
- at SQ	SN:CHROMOSOME_III	LN:5000
- at SQ	SN:CHROMOSOME_IV	LN:5000
- at SQ	SN:CHROMOSOME_V	LN:5000
-I	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	XS:i:-18	AS:i:-18	YT:Z:UU
-II.14978392	16	CHROMOSOME_II	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	XS:i:-18	AS:i:-18	YT:Z:UU
-III	16	CHROMOSOME_III	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	XS:i:-18	AS:i:-18	YT:Z:UU
-IV	16	CHROMOSOME_IV	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	XS:i:-18	AS:i:-18	YT:Z:UU
-V	16	CHROMOSOME_V	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	XS:i:-18	AS:i:-18	YT:Z:UU
-VI	0	CHROMOSOME_V	10	1	7S20M1D23M10I30M10S	*	0	0	AGCCTAAGCCTAAGCCTAAGCCTAAGCTAAGCCTAAGCCTAAGCCTAAGCTTTTTTTTTTCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	*
-VI	256	CHROMOSOME_V	10	1	7S20M1D23M10I30M10S	*	0	0	*	*
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#large_seq.2.1.cram
deleted file mode 100644
index 0041c19..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#large_seq.3.0.cram
deleted file mode 100644
index 472234e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.sam b/src/test/resources/htsjdk/samtools/cram/ce#large_seq.sam
deleted file mode 100644
index 7df381d..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.sam
+++ /dev/null
@@ -1,3 +0,0 @@
- at SQ	SN:CHROMOSOME_I	LN:1009800
-S1	0	CHROMOSOME_I	1	255	36M4I33M2D18M4I13M3I5M2I7M1I8M4I30M1D20M5D25M4D63M1D31M2I13M4I83M3I36M4D77M2D8M2D5M2D14M2I5M4D1M1D27M5I3M4D47M2D5M4D7M1I70M3D42M4I59M5I2M2I13M4D3M5D6M4I5M4I58M1I10M3I57M1I15M5D57M4I10M1I19M4D9M3I27M4D11M3I9M4I21M4I62M4I51M1I8M3D23M1I5M4I24M2D1M5I4M4D14M3D63M5I1M2I20M4D10M5D7M2D22M4I22M2I9M3I46M5I1M4D12M5D8M3D17M5D149M1D20M1D61M1I14M2I38M4D9M4I62M1I8M1I55M3D62M4I8M4I50M5D19M3D11M2I53M4D7M2D32M2D57M3I48M2D11M4D15M1I23M2D16M5I7M1I3M1D27M5D4M1I18M1D79M5D1M5D8M5D20M1D2 [...]
-V	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#supp.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#supp.2.1.cram
deleted file mode 100644
index 1215d49..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#supp.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#supp.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#supp.3.0.cram
deleted file mode 100644
index 5f8aae5..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#supp.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#supp.sam b/src/test/resources/htsjdk/samtools/cram/ce#supp.sam
deleted file mode 100644
index 666e774..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#supp.sam
+++ /dev/null
@@ -1,6 +0,0 @@
- at SQ	SN:CHROMOSOME_I	LN:1009800
- at CO	Test supplementary reads, for CRAM
-supp	99	CHROMOSOME_I	100	1	50M50S	*	0	0	TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC	*
-supp	2147	CHROMOSOME_I	200	1	50H50M	*	0	0	CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC	*
-supp	2195	CHROMOSOME_I	500	1	50M50H	*	0	0	TTTTAGTGAAGCTTCTAGATATTTGGCGGGTACCTCTAATTTTGCCTGCC	*
-supp	147	CHROMOSOME_I	600	1	50S50M	*	0	0	TTTTAGTGAAGCTTCTAGATATTTGGCGGGTACCTCTAATTTTGCCTGCCAGCCTAATACTAAGCCTAAGCCTAAGACTAAGCCTAATACTAAGCCTAAG	*
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.2.1.cram
deleted file mode 100644
index b340b0e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.3.0.cram
deleted file mode 100644
index cffd9b6..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.sam b/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.sam
deleted file mode 100644
index 2026dd7..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD	VN:1.4	SO:coordinate
- at RG	ID:UNKNOWN	SM:unknown	LB:UNKNOWN
- at SQ	SN:CHROMOSOME_I	LN:1009800
-I	16	CHROMOSOME_I	2	1	100M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	PT:Z:27;28;+;STOP;Note=tag1
-II.14978392	16	CHROMOSOME_I	2	1	100M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	PT:Z:27;27;+;PRIM;Note=tag2|28;28;+;OLIG;Note=tag3
-III	0	CHROMOSOME_I	2	1	27M1I73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	###########################"##@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	PT:Z:1;1;+;COMM|101;101;+;COMM
-IV	16	CHROMOSOME_I	2	1	100M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-V	0	CHROMOSOME_I	2	1	100M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-*	768	CHROMOSOME_I	2	255	1M	*	0	0	*	*	CT:Z:+;STOP
-*	768	CHROMOSOME_I	28	255	2M	*	0	0	*	*	CT:Z:+;COMM;Note=consensus%0Amulti%09line%0Atag%0A!"#$%25^&*()_+<>?:@~{}%7C%0A1234567890-=[]'%3B#,./\
-*	768	CHROMOSOME_I	101	255	1M	*	0	0	*	*	CT:Z:+;STOP
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.2.1.cram
deleted file mode 100644
index e49f4d1..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.3.0.cram
deleted file mode 100644
index e036ddd..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.sam b/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.sam
deleted file mode 100644
index 47a57c2..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD	VN:1.4	SO:coordinate
- at RG	ID:UNKNOWN	SM:unknown	LB:UNKNOWN
- at SQ	SN:CHROMOSOME_I	LN:1009800
-I	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	PT:Z:27;29;+;STOP;Note=tag1
-II.14978392	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	PT:Z:27;27;+;PRIM;Note=tag2|29;29;+;OLIG;Note=tag3
-III	0	CHROMOSOME_I	2	1	101M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	###########################"##@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	PT:Z:1;1;+;COMM|101;101;+;COMM
-IV	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-V	0	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-*	768	CHROMOSOME_I	2	255	1M	*	0	0	*	*	CT:Z:+;STOP
-*	768	CHROMOSOME_I	28	255	3M	*	0	0	*	*	CT:Z:+;COMM;Note=consensus%0Amulti%09line%0Atag%0A!"#$%25^&*()_+<>?:@~{}%7C%0A1234567890-=[]'%3B#,./\
-*	768	CHROMOSOME_I	102	255	1M	*	0	0	*	*	CT:Z:+;STOP
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap.2.1.cram
deleted file mode 100644
index e08f9a2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap.3.0.cram
deleted file mode 100644
index 5ddcbf1..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap.sam b/src/test/resources/htsjdk/samtools/cram/ce#unmap.sam
deleted file mode 100644
index fec218c..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#unmap.sam
+++ /dev/null
@@ -1,6 +0,0 @@
-I	4	*	0	1	*	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-II	4	*	0	1	*	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-III	4	*	0	1	*	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-IV	4	*	0	1	*	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-V	4	*	0	1	*	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-VI	4	*	0	1	*	*	0	0	ACTAAGCCTAAGCCTAAGCCTAAGCCAATTATCGATTTCTGAAAAAATTATCGAATTTTCTAGAAATTTTGCAAATTTTTTCATAAAATTATCGATTTTA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap1.2.1.cram
deleted file mode 100644
index 30f4aac..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap1.3.0.cram
deleted file mode 100644
index cab813b..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.sam b/src/test/resources/htsjdk/samtools/cram/ce#unmap1.sam
deleted file mode 100644
index e1e464e..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.sam
+++ /dev/null
@@ -1,20 +0,0 @@
- at HD	VN:1.0	SO:unsorted
- at SQ	SN:CHROMOSOME_I	LN:1009800
- at SQ	SN:CHROMOSOME_II	LN:5000
- at SQ	SN:CHROMOSOME_III	LN:5000
- at SQ	SN:CHROMOSOME_IV	LN:5000
- at SQ	SN:CHROMOSOME_V	LN:5000
- at SQ	SN:CHROMOSOME_X	LN:5000
- at SQ	SN:CHROMOSOME_MtDNA	LN:5000
- at RG	ID:UNKNOWN	SM:UNKNOWN
- at PG	ID:bowtie2	PN:bowtie2	VN:2.0.0-beta5
-SRR065390.33808391	4	*	0	0	*	*	0	0	GATCGCACTGAAAATCTGGATATAGAACGTGTGCAAATGATTGTCTCTACCGTTCCGTAAAAATTATTGCTAATTAGCAATGATTTTAAGCTAATTAGTT	CCCCCCCCCCCCCCCCCCCACCCCCACCCCCCCCCCCCB;CCCAACCCCCCCCCCCCCD=B9BCABCBCB>BBBC at B<<@BA;BCC?B>A<<@(?:4==4	YT:Z:UU
-SRR065390.33808433	4	*	0	0	*	*	0	0	NCATCTTCTGCAGGCGCGGTCGGCACCGTGTATTCGTTACGTTCCACGCCGATGATATTAGACACCAGCACGGTGTGATGCGCAGTCACCGCACGACCCG	!###################################################################################################	YT:Z:UU
-SRR065390.33808462	4	*	0	0	*	*	0	0	NGTTTGAGCGCAATGACTTGACGATGACCGGTGATTACAGTAACCAGCATATTGTGCCGATGAAGCAGGCTGTCGCTCCGCAATTTGAAGAGGGACACGA	!###################################################################################################	YT:Z:UU
-SRR065390.33808468	4	*	0	0	*	*	0	0	NGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTTTATTTTACTCTCTGTGGCTTTATCGATTATTTTTTTCTCCTTGGCTTTCCTCTTTATTTTT	!))))))''&585555AAAAA6AA############################################################################	YT:Z:UU
-SRR065390.33808471	4	*	0	0	*	*	0	0	NCGTCTTCTGCGGTTTCTATGATAGAGCAATTCTGTGGCGGATATTAAGATAACGGGTATCTGTTCTTTAATGATGCCGCAAAAAATGGAAAGTTAAGAA	!###################################################################################################	YT:Z:UU
-SRR065390.33808489	4	*	0	0	*	*	0	0	NGGAAATTCTGCGGTATCGAGAGATATTTGCCTTTAATTACCCCATAGCCGATTAACATCCCGGCACTATTAATCATTTCAATATTATCAATCACAAAGT	!###################################################################################################	YT:Z:UU
-SRR065390.33808504	4	*	0	0	*	*	0	0	NTGGAACACCATGCCCACTTTCGCACGCAGCAGGGCGATATCCTGAGAGTTGGTCAGGATGTTGTCGCCATCAAGCAGAATTTCACCTTCCGCACGCTGC	!###################################################################################################	YT:Z:UU
-SRR065390.33808511	4	*	0	0	*	*	0	0	NCAGAAATATATTGAACTTTTGAAACATGTCCCAACTTTTTTTTTTTTTAGAACACGTTGGCTGGTTTTTCAAGTTTTGAATACTTTTTAGGTTTTTTTG	!***()(+++AAAAAAAAAA:78:8318::AAAAAAAAAAAA##########################################################	YT:Z:UU
-SRR065390.33808521	4	*	0	0	*	*	0	0	NTGTCAATACATTGTAAGGATTTCCCATTATGTCAATACATAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAGACCGATTTCGTATGTCGTGTTTCTTT	!###################################################################################################	YT:Z:UU
-SRR065390.33808523	4	*	0	0	*	*	0	0	NTACTTCTTACAAGATTTTTATCGCTACTTGAAAAAAATTCATCAACATAATCGCCATGACTATCTGCACCGTGAGTATGATAAGCAGCAACTCTATCTG	!***+--,')AAAA778577A72AA50888AAAAAAA72A88858AAAA77AAAAAA7AAAAAAAAA8AA##############################	YT:Z:UU
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap2.2.1.cram
deleted file mode 100644
index bc5bf5b..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap2.3.0.cram
deleted file mode 100644
index 03c638a..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.sam b/src/test/resources/htsjdk/samtools/cram/ce#unmap2.sam
deleted file mode 100644
index d002a34..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.sam
+++ /dev/null
@@ -1,29 +0,0 @@
- at HD	VN:1.0	SO:unsorted
- at SQ	SN:CHROMOSOME_I	LN:1009800
- at SQ	SN:CHROMOSOME_II	LN:5000
- at SQ	SN:CHROMOSOME_III	LN:5000
- at SQ	SN:CHROMOSOME_IV	LN:5000
- at SQ	SN:CHROMOSOME_V	LN:5000
- at SQ	SN:CHROMOSOME_X	LN:5000
- at SQ	SN:CHROMOSOME_MtDNA	LN:5000
- at RG	ID:UNKNOWN	SM:UNKNOWN
- at PG	ID:bowtie2	PN:bowtie2	VN:2.0.0-beta5
-SRR065390.14978392	16	CHROMOSOME_I	2	1	27M1D73M	*	0	0	CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:1	XM:i:5	XN:i:0	XO:i:1	AS:i:-18	XS:i:-18	YT:Z:UU
-SRR065390.921023	16	CHROMOSOME_I	3	12	100M	*	0	0	CTAAGCCTAAATCTAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	###############################################???88:;98768700000<>:BBA?BBAB?BBBBBBBB>B>BB::;?:00000	XG:i:0	XM:i:3	XN:i:0	XO:i:0	AS:i:-6	XS:i:-13	YT:Z:UU
-SRR065390.1871511	16	CHROMOSOME_I	3	1	100M	*	0	0	CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	<?@<@A8>0:BB@>B<=B@???@=8 at B>BB at CA@DACDCBBCCCA at CCCCACCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:0	XM:i:0	XN:i:0	XO:i:0	AS:i:0	XS:i:0	YT:Z:UU
-SRR065390.3743423	16	CHROMOSOME_I	3	1	100M	*	0	0	CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	##################?6@:7<=@3=@ABAAB>BDBBABADABDDDBDDBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:0	XM:i:0	XN:i:0	XO:i:0	AS:i:0	XS:i:0	YT:Z:UU
-SRR065390.4251890	16	CHROMOSOME_I	3	1	100M	*	0	0	CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	###########@BB=BCBBC?B>B;>B@@ADBBB at DBBBBDCCBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:0	XM:i:0	XN:i:0	XO:i:0	AS:i:0	XS:i:0	YT:Z:UU
-SRR065390.5238868	16	CHROMOSOME_I	3	1	100M	*	0	0	CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	@,=@@D8D;?BBB>;?BBB==BB at D;>D>BBB>BBDDB<DABADCACDCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:0	XM:i:0	XN:i:0	XO:i:0	AS:i:0	XS:i:0	YT:Z:UU
-SRR065390.6023338	0	CHROMOSOME_I	3	1	100M	*	0	0	CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAAGCTAC	CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC at CCDDDBCCABB=DABBA?################	XG:i:0	XM:i:3	XN:i:0	XO:i:0	AS:i:-6	XS:i:-6	YT:Z:UU
-SRR065390.6815812	16	CHROMOSOME_I	3	1	100M	*	0	0	CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	###############?@.@?B;B0B=;<DADB@@BDDBBDDBCBCBD at CCDCCCCCCCDCCCCCCCCACCCCCCCCCCBCCCCCCDCCCCCCCCCCCBCC	XG:i:0	XM:i:0	XN:i:0	XO:i:0	AS:i:0	XS:i:0	YT:Z:UU
-SRR065390.6905811	16	CHROMOSOME_I	3	1	100M	*	0	0	CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	#######################BB@>A<BC>@@BCCB@=BACBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC	XG:i:0	XM:i:0	XN:i:0	XO:i:0	AS:i:0	XS:i:0	YT:Z:UU
-SRR065390.8289592	16	CHROMOSOME_I	3	1	100M	*	0	0	CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA	###############################A?@C9@@BC=AABDD at A@DC at CB=@BA?6 at CCAAC@+CCCCCCCCCCCCCCC at CCCCCCCCCCCCCCCC	XG:i:0	XM:i:0	XN:i:0	XO:i:0	AS:i:0	XS:i:0	YT:Z:UU
-SRR065390.33808391	4	*	0	0	*	*	0	0	GATCGCACTGAAAATCTGGATATAGAACGTGTGCAAATGATTGTCTCTACCGTTCCGTAAAAATTATTGCTAATTAGCAATGATTTTAAGCTAATTAGTT	CCCCCCCCCCCCCCCCCCCACCCCCACCCCCCCCCCCCB;CCCAACCCCCCCCCCCCCD=B9BCABCBCB>BBBC at B<<@BA;BCC?B>A<<@(?:4==4	YT:Z:UU
-SRR065390.33808433	4	*	0	0	*	*	0	0	NCATCTTCTGCAGGCGCGGTCGGCACCGTGTATTCGTTACGTTCCACGCCGATGATATTAGACACCAGCACGGTGTGATGCGCAGTCACCGCACGACCCG	!###################################################################################################	YT:Z:UU
-SRR065390.33808462	4	*	0	0	*	*	0	0	NGTTTGAGCGCAATGACTTGACGATGACCGGTGATTACAGTAACCAGCATATTGTGCCGATGAAGCAGGCTGTCGCTCCGCAATTTGAAGAGGGACACGA	!###################################################################################################	YT:Z:UU
-SRR065390.33808468	4	*	0	0	*	*	0	0	NGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTTTATTTTACTCTCTGTGGCTTTATCGATTATTTTTTTCTCCTTGGCTTTCCTCTTTATTTTT	!))))))''&585555AAAAA6AA############################################################################	YT:Z:UU
-SRR065390.33808471	4	*	0	0	*	*	0	0	NCGTCTTCTGCGGTTTCTATGATAGAGCAATTCTGTGGCGGATATTAAGATAACGGGTATCTGTTCTTTAATGATGCCGCAAAAAATGGAAAGTTAAGAA	!###################################################################################################	YT:Z:UU
-SRR065390.33808489	4	*	0	0	*	*	0	0	NGGAAATTCTGCGGTATCGAGAGATATTTGCCTTTAATTACCCCATAGCCGATTAACATCCCGGCACTATTAATCATTTCAATATTATCAATCACAAAGT	!###################################################################################################	YT:Z:UU
-SRR065390.33808504	4	*	0	0	*	*	0	0	NTGGAACACCATGCCCACTTTCGCACGCAGCAGGGCGATATCCTGAGAGTTGGTCAGGATGTTGTCGCCATCAAGCAGAATTTCACCTTCCGCACGCTGC	!###################################################################################################	YT:Z:UU
-SRR065390.33808511	4	*	0	0	*	*	0	0	NCAGAAATATATTGAACTTTTGAAACATGTCCCAACTTTTTTTTTTTTTAGAACACGTTGGCTGGTTTTTCAAGTTTTGAATACTTTTTAGGTTTTTTTG	!***()(+++AAAAAAAAAA:78:8318::AAAAAAAAAAAA##########################################################	YT:Z:UU
-SRR065390.33808521	4	*	0	0	*	*	0	0	NTGTCAATACATTGTAAGGATTTCCCATTATGTCAATACATAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAGACCGATTTCGTATGTCGTGTTTCTTT	!###################################################################################################	YT:Z:UU
diff --git a/src/test/resources/htsjdk/samtools/cram/ce.fa b/src/test/resources/htsjdk/samtools/cram/ce.fa
deleted file mode 100644
index ac19897..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce.fa
+++ /dev/null
@@ -1,20803 +0,0 @@
->CHROMOSOME_I
-GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAAAAATTGAGATAAGAAAA
-CATTTTACTTTTTCAAAATTGTTTTCATGCTAAATTCAAAACGTTTTTTT
-TTTAGTGAAGCTTCTAGATATTTGGCGGGTACCTCTAATTTTGCCTGCCT
-GCCAACCTATATGCTCCTGTGTTTAGGCCTAATACTAAGCCTAAGCCTAA
-GCCTAATACTAAGCCTAAGCCTAAGACTAAGCCTAATACTAAGCCTAAGC
-CTAAGACTAAGCCTAAGACTAAGCCTAAGACTAAGCCTAATACTAAGCCT
-AAGCCTAAGACTAAGCCTAAGCCTAATACTAAGCCTAAGCCTAAGACTAA
-GCCTAATACTAAGCCTAAGCCTAAGACTAAGCCTAAGACTAAGCCTAAGA
-CTAAGCCTAATACTAAGCCTAAGCCTAAGACTAAGCCTAAGCCTAAAAGA
-ATATGGTAGCTACAGAAACGGTAGTACACTCTTCTGAAAATACAAAAAAT
-TTGCAATTTTTATAGCTAGGGCACTTTTTGTCTGCCCAAATATAGGCAAC
-CAAAAATAATTGCCAAGTTTTTAATGATTTGTTGCATATTGAAAAAAACA
-TTTTTCGGGTTTTTTGAAATGAATATCGTAGCTACAGAAACGGTTGTGCA
-CTCATCTGAAAGTTTGTTTTTCTTGTTTTCTTGCACTTTGTGCAGAATTC
-TTGATTCTTGATTCTTGCAGAAATTTGCAAGAAAATTCGCAAGAAATTTG
-TATTAAAAACTGTTCAAAATTTTTGGAAATTAGTTTAAAAATCTCACATT
-TTTTTTAGAAAAATTATTTTTAAGAATTTTTCATTTTAGGAATATTGTTA
-TTTCAGAAAATAGCTAAATGTGATTTCTGTAATTTTGCCTGCCAAATTCG
-TGAAATGCAATAAAAATCTAATATCCCTCATCAGTGCGATTTCCGAATCA
-GTATATTTTTACGTAATAGCTTCTTTGACATCAATAAGTATTTGCCTATA
-TGACTTTAGACTTGAAATTGGCTATTAATGCCAATTTCATGATATCTAGC
-CACTTTAGTATAATTGTTTTTAGTTTTTGGCAAAACTATTGTCTAAACAG
-ATATTCGTGTTTTCAAGAAATTTTTCATGGTTTTTCTTGGTCTTTTCTTG
-GTATTTTTTTGACAAAAATTTTTGTTTCTTGATTCTTGCAAAAATTTTTC
-CGTTTGACGGCCTTGATGTGCACTACCTTCGCTTAAATACTACATTTTCT
-GAAAATGTTATAATAGTGTTCATTGTTTCATACAAATACTTATTTAATAG
-TATTTCTGGTTATATAATTTGTATAAAAAGTGGTTGACATAACAAGGCTG
-ACGAAACTTTGTGATGGCTGAAAATATTTTCCTAGCTTTATTGATTTTTA
-TTTATACGTGTTTGAATAACTTGGCCAAATCGCCGAGAAGGAATAGAATA
-CTGGACGACATTGTACATATTTTCCAAAAAATCAGAAAGTAGATGACGGG
-ACCAATTCTTTCTGTCAGGTTTTACAACCGCCCAGTGCGTCTACGTCACA
-TGTTGTATAAATGGTTGTAAACAATATGCGGAAACAATCAAATGCATTCC
-CATAAGGCATAATATAGAGGCTACAGGCAATGAGTATCGCTCTTTGCTTT
-GTTTAAAGGGGGAGTAGAGTTTGTGGGGAAATATATGTTTCTGACTCTAA
-TTTTGCCCCTGATACCGAATATCGATGTGAAAAAATTTAAAAAAATTTCC
-CTGATTTTATATTAATTTTTAAAATCCGAAAATCCATTGGATGCCTATAT
-GTGAGTTTTTAAACGCAAAATTTTCCCGGCAGAGACGCCCCGCCCACGAA
-ACCGTGCCGCACGTGTGGGTTTACGAGCTGAATATTTTCCTTCTATTTTT
-ATTTGATTTTATACCGATTTTCGTCGATTTTTCTCATTTTTTCTCTTTTT
-TTTGGTGTTTTTTATTGAAAATTTTGTGATTTTCGTAAATTTATTCCTAT
-TTATTAATAAAAACAAAAACAATTCCATTAAATATCCCATTTTCAGCGCA
-AAATCGACTGGAGACTAGGAAAATCGTCTGGAGATAGAACGGATCAACAA
-GATTATTATTATATCATTAATAATATTTATCAATTTTCTTCTGAGAGTCT
-CATTGAGACTCTTATTTACGCCAAGAAATAAATTTAACATTAAAATTGTT
-CATTTTTGAAAAAAAAATAATTAAAAAAACACATTTTTTGGAAAAAAAAA
-TAAATAAAAAAAATTGTCCTCGAGGATCCTCCGGAGCGCGTCGAATCAAT
-GTTTCCGGAACTCTGAAAATTAAATGTTTGTATGATTGTAGAACCCTTTC
-GCTATTGAGATTTGATAACTTTTAAGTAATAAAATTTTCGCAGTAAGACA
-TTAAAACATTTCACAATTAAGCTGGTTCTGAACTGTGTGAAGTATATTGA
-AAAAAACTAACTGATACAAAAATATAATTTTATGATAGTTTTCTGGATGT
-CCCAATATAAACGATGTCAATTCTGCGACATGCTACAGTCATCCACGAAA
-GTAACCCGAATACCGACAAAAGAAGAGGAACGCCAACTTTGGATAGACGC
-TCTAGGGGCTGATTTTGGTCGGAAAATAGTCGGGAAAAAATAGAGGACAT
-TACAGATGAGGATGAGGATGAAGATAGAAATTTGCCGACAACTTCGTCAT
-GCCGCTGATTTTTTTGATGTTCTACGCTTAAATTTTCAGCGAACGAACTA
-TTTTTTATATTTTGATTGTTTTTAAATAATATTTGCCATAAGAAATTCTC
-ACTTTTCCAGGAAACGTCGTTTCGCCGCGATTTTCCTCGTCTCCAGTCGA
-TTTTGCGCTGAAAATGGGATATTTAATGGAATTGTTTTTGTTTTTATTAA
-TAAATAGGAATAAATTTACGAAAATCACAAAATTTTCAATAAAAAACACC
-AAAAAAAAAGAGAAAAAATGAGAAAAATCGACGAAAATCGGTATAAAATC
-AAATAAAAATAGAAGGAAAATATTCAGCTCGTAAACCCGCAAGTGCGGCA
-CGGTTTCGTGGGCGGGGCGTCTCTGGCGGGAAAATTTTGCGTTTGAAAAC
-TCACATATAGGCATCCAATGGATTTTCGGATTTTCAAAATTAATATAAAA
-TCAGGGAAATTTTTTTAAATTTTGTCACATCGATATTCGGTATCAGGGGC
-AAAATTAGAGTCAGAAACATATATTTCCCCACAAACTCTACTCCCCCTTT
-AACAACCACCCGAGGATATATTCGACAAACGATCTATCTACTAGGAATAA
-CTCGATTATTGACATATTATAGACTTCTTTTAGTATTTGTAAAATAGAGG
-ATCAGACCCAAAATTCAGCCCGCGAAGGCATGACGTCAGCGCGAGGCAGT
-AGTTTCCAGAAGAACTCTGTCGTCTACCTTAATGCCTCAAATGCGAACCC
-GCTTCGGCCATCCTTCTCGCTCAGAGAATGGATTAGAGTTCTCATCAACT
-CCTCTGTCTAATTTTCAACTGCGGCGGTTGGCGACCGGTATTACCGCGGC
-GACCGACACCTCCCGGGTTCCGTCGATCGCTGTCTGTTGTGTGCGCCGCG
-ACTCCGCCCACCGGTGGTAACTTTTTGTGGGGGAATCTTTGTTTTTGGTC
-ATTTTTCAGCGCTTTTCAGCGATTATTGACCAATTTTGAATAAAATTTTC
-AACAGAATATCATCTAAAATATTGCTTAACATTTATTTAACAGAAATAAC
-GTGAGCACGCATGTAAAACATGAAATTTTCGGGAAAATTGCAATTAAACG
-AATAAAAATCGATATTTAAATCAATTATTGGTGAATCCGGTGTGTTGAGG
-CTTCAATGCATACATTTTTACTGGATAAATCTCCTTTGGGAATCCGGTTT
-GCAGTGCTTTCGAGACCATGTCCAGTTGAGAATCGGCGAACGCTTTAAGA
-AGCTCGGGCTGAATAATGAATTGTTTTAAAAAATGTTTAGTAAAAAATTG
-TTTTCGTGCAAATTGTCTTCGATATTATCCAAACGTGACGTTTTGCGATT
-TTCGCGCTAAAATTACAGTAAGTGGGGTCTCGACACGACAATTTTTGTGA
-AATACAAACGGGCGTGTGTCTTTAAGAAGTACTGTAGTTTAAAAACTTCA
-TTTCTGTGGAATTTTCATATATTTTTCATAGTTTTTCTCTTTAAATAAAT
-CACTTTTCAACAAAAAACTATGAGACAATAGTTTGAAATTACAGTATTCT
-TTAAAGGTGCACGCCTGCTCGAATTTCGCAAAAACGTGTCGTGTCGAGAC
-CCCAATTACAGTATTTTTGACCCGAATATCGCGAAATTTCGAGTCTGGGT
-GAAAACATTGAAATTTTTGGCAAAATAAAAGAAATATGTCCTTTTTCAGA
-ATATATTTTCTAAATTTCGAGACGAAACAACAATTTTAAATGAATTTTAA
-TTTTAAATATTAAATATTTCGGAATTTGGCGTTTTTTATGCATGTCGATT
-CACTAACGATTTTGTACTACACGTGGGCAAGTTTATACAGTTTTTGGCTA
-AAATTTGTGAATTTGAACCGTTTTTCGGCGAATATTTGAAAAATTGGCAA
-AACTGGTTCAAAAACAAAAATTTTTTAAACTGTACAAACTGTCCAAAAAT
-TCGTCGTAAATCGACACACCCTTCTCATTTTTTCAAAATTTTAATTGTTT
-TCGAATGTTTTTTTTGCAGAATAATTTGTAAAATGAGCCTTTTGTGAATT
-TTTTTTAATTTCAAAGTTTTTATTATTTTTTCTCAAACCAGCACCTCTGT
-TCTCGTCCAACTATGATCATCATCGTCGAATAACCGTTTCTCGTGATTTG
-TCACATTATCCTTGAGCACAATACATCCACCAGGTTTCAGTCCTTTCTGA
-AAATGAAAATTAATTTTAAAAAAATTGAATTATTTTAAATGAAACAGTTT
-TCAGAGATTTCTCAACTTTTGAGTCCACCACCAGGCCTGCACGTTTTTCG
-GGTTTTATCTTTTAAAAAACTGAAAAATCGAAAAATTTCAATTTCTGTTT
-TGTGGTCAAAATTGTAATTACAGGTAAGCAAATAGTTTAATTTTAAAATT
-GAAAATTAGGGAAATGACCGGACATAAGTTTAAAAACCCGATTTTTTCAA
-TAAAAAGGAAAATTGAAAATTTAATAAAACAGGTTGTAAATCAAGGAGAT
-CGTATTGATTGAAAAAAAATCCGAATGTTCCGGATTTTTCAGTGGTTTTT
-TTTGAAAGAAAATCGAAAAAGTAAATGTTTTTAATTTTTAAATTTAAATT
-TTTAATCGGAAAAAATGTACGAAATTGACTTTTTAATGTGAAAAATTGTT
-GTTTTAAAAAAAAATTTTAACCGATACAGATTTTCTAGACTCAGTTTTTT
-CGGTTGAATATTGTTTTTTACTATTTTTTCATTACAGAAAGAATCCAATT
-TTATTTCGCTTAAAAAATAACCGGAGCATCGAAAATATTTTTTTTTCTGT
-TTTACTCAAAGCATTTCAATTACCTAGAATTTTGTTTAAAAACTACATGC
-TTTATTTATGAACGTAATAAATAAGACCCCCTCTTATTTATAAACTTTCA
-ACATATTTTCAGTTTTCAGTGCTATCTAGTGCTTACCGCACATCTTTTAA
-AGAAATCAACCAAATCCTCATCAACCAAATGCCCTGAAACCCATTGAATC
-CATATCAAATCATAACGTCGTTCGGGCGGTGCAAACGTCTGCAGTCCTTC
-GACGAATTTATCTCCAATTCGTGGATGTTTTCCAATATATTGATCACTTT
-TCGTGATCAACTCCTCGACGACGTCTTCCATATCAACTTTCGAGAAGAAT
-GGCATTAAGAGATGCTTTGTAACACGTCCGATACCCGCTCCGCAGTCCAG
-TGCATAGTCAAAGTAGCCGAATAGATTCTGGAAAATATTTATAAAATTCA
-AAGTTGGCCCAGGGGTGACCGGCAATTTCAAGCAAATCGGCAAATTGTCA
-ATTTTCTGAATTTGCCGAAAATTTGACAAAAACGACAATTTGCCGGTTCG
-CCGAATTTACCTTTTTTAAATTTAATTTTCAATTCAGGCAAACTGACGAT
-TTTCCGTTTGCCGGATATCAATTTGCAGGAATTTCTCAAAGGAATTTTTA
-TTAAGACGGAAACACAGTGCTTTTTTGAATTTTTTTTCCCGTTTTCTTCA
-GATATTTTTATAGAATTTACTGACTTTTCAGAATAGATGTAGGACAATTT
-TGTTGTTTTAAAAATTGAAATTCTGAAATTTCCAACAAAAAAACATGTGC
-AAACCCACAAGTTGGCAAAAATATTTTGCATTTGCCGTTTTTCCCGTTTG
-CCGAAAAGTCTAATTTCGGTAATTGGGCCATTTTTCGAAATTTTGAGCCA
-CATAAAAAACTTTGAACCATTTTTGAGAAGTATTATTACGACATTCGTTT
-ATTTGAGCACAATTTGGGCCTATACTTTCAAAATCGGGGTTTGAAAACCC
-CTATATGTTCGACCGAATGTTAATCTCATAAAAATTTGATGAAAATAAAA
-TTTTCTACGGCTCATAAACGTATAGCCCCCGTCAGTCTCAAAATTTATAC
-GATAGACACTTTTTGGCGTTTATCGCCTATATTCCGTCAAAAACCATTAT
-TCATCATTCTTTCAATGTTGTTTTTTTTAAGGCTAAAAAACTTTCATGCA
-AATTTGTTAGCCGTGTCGTGGTTTATACGAAAATTTCAGAATTTATAAAA
-TAAAGGAAAACGAAAATGTTTCTATATACCCTATTTATGTTCTCTGATTC
-CGAATACCAATGTGAAAAATTCAAAAAAAATTCCCTGATTTTATATAAAT
-TTTTGTAAGCGACAAAAATTGTCGTTTGAATTTCACACTTGGTTACAAAA
-ATTTATGAAAATGAGGAAAATTTGTTTTAATTTTTTCACATTGATATTCG
-GAATCAGGAAAATAAATAGGGTCTATAGAAAAATTCCGAACCTTCACTCC
-TTCTCTGAGTATAATAAATTTAAAATAAATACAGAAAATTTCAGTTCAGA
-CCTCATTAAATTTGGGTATATTTCTAGGATCCGAGTTTTTACACCAGATT
-TACAAACTTTTAGCCTTTCACCGCCTTTTTATGCGCATTTCCCATCAGTC
-AACTCCAAAAAAATCGCAACTTTTGCCTCATATTTCAAGAATATTCCCCT
-TTCTCTCCCCATTGAAAGTCATTTTCGAAACAAGCGGAAGATTCGTCATA
-TGTGGTAATGTGTGGCGTGCGTTGGCAAACAACAAGAAAGAATCATTCTC
-TGAAAACAAAAAGCGTTTTGGGTGCCAAAGTAATATTGAAAATCTGCCGT
-GTTTTCTCATTTTCCATCAAAAGAAAATGAGAAAAAAGTTTCGGCGTTTT
-ATTTGATTTCCGGGAAAGAAGACTCGGAAAAAGATTTAATTGAATTTTTC
-ATAGCAAACCTATATTGCAACAACTTTCTAAAAGGTCAGAAATTGCCGCG
-TAGCCTAGAAAATTGGAAAACTCTTCCAGCTGGTATTATTTCAGACATGG
-TGCATCGAAAATTCGAAAATTACAGAAATTAACATTTTGGAGCATCTGCC
-AGAAAATTGAGATTACAGTACCCCACTTCTGCCGAGAAATTCGAGGTGGA
-AGAGGTCTTACAAAATTTTCGGTCACGTGAAAATGGGAAGCGTTCAGGCT
-CCACACGACGGAATTCACCTAGTTTTCAGGTGAGAAGATATCGTACGAGG
-AGAATTGACCTCCAAATCCTGATCGTGACTACAGGTCGTCGTTCGGAGCT
-GTGGAAGAGTTTTGAAAATCTTCGACCATGAGAGAAATAGACAGGACGAC
-CAAACATTTTCAGTGGAAGAGCTTTTCCTAGGCCATCAGGATGCTATTTC
-GACAGAGCTGAGTTATCCTCAAGTCGTTACGAGGTGTGGAAAAGTTTTCC
-AAAATCCCCGACCAGGTAGAAAATGAGCACACCGATTAAGTTTCTCCAGT
-GGTAGAGTTTTTTCTAGGCCATCATTATGCTATCTAGAAAAAAGCTTCGG
-CCATGGGGTTTTTAGGCCGTCTATTTATTTCTCATAACTTTCTCAGAAAT
-TCGTCTATTTCTCAGAACCCCCCAATGATAAGTTTTTTGCAAAAAAAGTT
-CTGCTTTGCTCATCAGCCGTAATCAGGTGACCTCATTAGGCCTACCCAAA
-CACAGATTTGTCATTATTTTTCAGACAAAAAACACGAAAAAAATCTTCAC
-GCATGGGGTGATAACCTGATTTTAAATCTTACTGTGCCGGCTGGCGCGGC
-GAGCTTCGATCACTGAGCCGAAAGATTATGAAAACTATGGGAATGACGGC
-GTAGCCTAGAAATCGTCCAGGCAGAGATTCTGTCTAATTTTCGAGCATAT
-ATCTCCCAGTTTTGTTATTAATTTAAGTAAACTCAAACCTAGAAACAAGT
-AAAACGGGAGGGGGGGGGGGAATATCAGAAAATTAAATCTTGCGACACTT
-TTCCATTGATACTTTCAAGGTAATGCCCAGAGGTGTGCGGCAAATTTTGA
-AACTTGCGCATGCCGCCTTTTTTTTTTTCTAGAAAACAGTCAGAATTTTT
-TGTCGAATTTGTTGAAAATTCGCTAATATACTGTGAGTTTAGAAAAAATA
-ACGAAAAAACTCGGAAAAGGAGGAAGAGATCTGAAATATGTAGATTTTTT
-TAGAAAAGACCAGAAATTACTGAAAAATTGGCATTTTTCGTCGAAACCCC
-AATATACTAAATTATTCGGATTTTTAGAAAATTTTCAAATTCACCATACA
-GTGCATTTTTTCCTACTTCTACGACTTTAAAGGGGGGAGCATTTATGCGG
-AAGGGTCTTGCCGCGCATTTAGTCATCATTTTTAGCAGTTTCTGTGTAAA
-ATTCGCGTAGATCACATGAAGATCACAAAATATTTATCCCATATTTCGTA
-TTTCTGTTGCTTTTTCACAAATTAATTGTGATCTACGCGTGATCTCCGCG
-AATTTTGAGCAGACTTTGTTAAAAATGATGACTATGTGCACGGCAAGACC
-CTTCCGCATAAATGCGCCCCCCTTTAAAGTCGTAGAAGTGGAAAAAAAAT
-GCACTGTAGCAAAAAATCGAACATTTCTGTTCGATTTTTGAATTTCTCGA
-AATTTTTTAAAATAATTTTTAAAATAACATTTTTATTTTATTTCGAAAAC
-TACCGATTTTAGAAAAATTCTAAAATTTCGATTTTTTTTGTTGATTTTTC
-GATTTTTAAAATAAAATTTCATAATTTTTTAAACCGATCTTTCTTGCTTT
-TCCTGAAAAATCGATGATTTCTATACCTTTTTCTTCAGTCCTTCAATAAA
-TCGTTTCGACGCCGATATGTCGGGCGCGTGAAGCGCTTCGAATCCGCCGA
-GCATTCCGTTGACGTCCTGGCTCGCGCGGCTCCAGTATTCCTCCGCCTGA
-AAGAGAATAGTTGAAAACATTGTTTTGAGACTTAAAAATTTTTTTTTTAG
-TTTTTTTCAAAAATTCTTACATGTTATAGAGTTTTTTTTTCAAATTTTCA
-GCTTTTTTCAGAAAAACTTAGTATTTTCGATAATTTTAAATAAAAAAGTT
-TTTTTTCAAAAAATGTTTCGGTTTTTTTTTTAATTTTTGGTCTAAAATTC
-TCCGCAAAAGATTTGCGTGCTGGCCGAACTTTTTGATTTTGTACCTTTTC
-ATAAACATCTTCACCATTGTGAATTCTAGAAGATGATGAAGAGCTCATTT
-TTGATGTTGTGACAGCTGCTCCGAGCAATCTGGAGACTTTTGTGACGAAA
-AGACGAGAGGTCACGGATATGATGATGATACTGGAAATGAGATATTTATA
-TTTACTAGTTCATCGGGAAAATTATTACGAGAAAGATAAACAGACATGTG
-CGTTTTTTTAATGGAAGAGAAACACAAGAAAAATCTGGAAAACTAGGCCA
-CGGCTATCAGTGTCGATTTACGGCATACGGTCTCGACACGACTATTTTTG
-TTAAATGTGAAGGTATGCACCTTTAAAGAGTACTGTAGTTTGTAACTCTC
-ATTGCTGCAACATATTTGACGCTCAGCGAAAACTACAGCAATTCTTCAAA
-AGACTACTGTAGCCTTTGTGTTGACTTACGGGCTCGATTCTCGAAACGAA
-TTTCTGCTCGAATTGTGACAGCCATATTCAATTTGGTATAGTCTTTTCGT
-ATTTTTTGCCATTTTTCTGTTTTCTTCTAATATTTAATCTATTATTAAAT
-TATGTCCGTAACTCCCTCCAAAATTAGAACTGCGACCGAACAGAGATTCG
-TTCCGCCCCATATTCCGGCCAATCAGATCGAGTAGGCGGAGTTCGAAGTC
-GCTGATTGGTTTGAAAAGTCGCGGAAATTTGCAAGTTTTAAGGTAGCGAA
-AACTGATGACTATTGTAGCGCGCTTGTGTCGATTTACGGAATCTCGATTT
-TCAGGAATGAATTTTTAATTACATTTTTTCGCTCAATTAATATTCTAAAT
-AAATAAATAAATGATTTGAATTAATTTAATTTCATTCGAGCCCGTAGATC
-GACACATGTGCTACAGTAATCATTAGTTTTCGCTACGAGATATTTTGCGC
-GTAAAATATTTTCCCGTAATAACTCTACTCCGACAAACATTACGACCTCC
-ATGGAGGCCTCCAGGTATAGGTGAGACTCTTGTATTTCCAATTCAGAGAC
-AATGCGTCACTGGAAGAGAAAACGAAGCGGAAAAAAAAACACGGAAACCC
-AAAAATAGTGTTTGCCCCGCTCTATTCTTCTCCAATAATTTCTGTGTCTA
-ATTTTGAAAGACTCCACCTGTGTATGCCTTCTCGACATAAACCCCCCCCC
-CCCCCCCTATCTTACATGGTACTGATAACACTTTCAGTCTTTCACACTTT
-TGGCGCGCAACGCCGCTCTTTTTTCGCGGCGAGCTGATGACGTCATCAAT
-TTTTCATCGCTTTTGATTATCTTCAATGTTCTAGAAGGGCACATAGGTCA
-TCCTTATTTTTTCCTTCTCTTTCTCGTGACGGCCCTTGTTGCGCATGCCC
-GCCCCCTAGAGCAGGGCGTGGCCTGAACGGCGGCTCCGAGAGCTACTCAT
-TCTTGCCGCGTCACCCTCCAGCGCCACCCAAACTTCTTCGGTTCTAGAGA
-TCGAGAAGAACGTATGATTTTTTAAAATTATAATTGTTTCTTTCGAAAAA
-AAAAATTTCATTTACAGTAAGCCAAACATACACAATCAACATGAAACTCG
-TAATTCTGCTATCTTTTGTTGCGACAGTTGCGGTTTTTGGTGAGTTTATG
-CTTTAGATAATACTTTTCCGCCAAAAATACAGTTGCCGGTCTCGGTATGG
-CAATATTTTTGTTAAATTCGAAAAGCAGTGAGTAATGTAGTTTCGAATTT
-TCGTTTCTGCTTAATTTTCATCAATTCATCGTTTTTCTCACGACTTCTTC
-TTTATGAAAAATCAATGAAAATTCTGACTAGGTCAGCTTAGGGGTGAGGT
-ACCTAGAGACGCCACATATGCCAAACGGAAGCTGAGATCATTGGCTACAA
-GAATATGCTTTCAAATTCTGCAACGGACCTCTGGGAGTCTGGAAATTCTT
-GTCTGAAATTATGCTTTTGAATGCTCGAAAGTGGTAAGAATTTAGAATTT
-ATTACAGAAAAACGTTTAATTAATAAAATTAGTTTTATACTTGAAACAAG
-TACTGTATGCACTGTATCAAAACACATTTTCATCTTTTCTAGGTATTCAA
-CTTCACGTTTTTCTGTAATAAATTCTAAATTCTTACCACTTTCGAGCATT
-CAAAAGCATAATTTCAGACAAGAATTTCCAGACTCCCAGAGGTCCGTTGC
-AGAATTTGAAAGCATATTCTTGTAGCCAATGATCTCAGCTTCCGTTTGGC
-ATATGTGGCGTCTCTAGGTACCTCACCCCTAAGCTGACCATTCCCTAGTG
-AGCAAACAAAATTTTGAAATTACAGTACTATTTAAAGGCACATTGATTTT
-TTGGGTCAAGCAAAAATTTGTCGTGTCGAGACCGGCTACGGTATTTTCGC
-GAAAAATCGCAAAATCTTGCGGCTGGGATATACTTGTGCGAAATACTTTT
-TGCATTAATTTTGAGCAAAATTATTTTTTTTAGACTTTTTGAAATCCAAA
-TTTTTTGGATTGCGAAAAAAACCTGTGTCCGGTTGTTTCATTAGGCCAAC
-AAAGTTCCTGGAACACTGATGAAAACCATGATAGAGGCGGAGCATAATAT
-CGATTTTTCGTACTTTCCTGTATTTCTTCTTCTATATGGCCGAGTAGAAC
-AGGATTAGGGGTAAAGTCAAAATTTTTCTCATATGGATATCATATGGATA
-TCAAAATTTTTCTCATATGGATATGGAGAAAATTTTTCTCATATGGACTT
-TGAAAGTTGAATCACTTGACATCTGGGAAATTAGTATTCCAGGCGTAAGT
-CGGATCTGTTAGAAACGGAATACTTATAGGCTTCGTGAATTAGGTAGACT
-TTCAATTAATCTGATCCATGGGAGTCAGACGCGGTTTCCAGGCCTGACGC
-CTGCCTCCAACTTGCCCGCCTCACGCCGGTCTCTCGCCTCATTTCTGCAC
-TGTGACGAGACAGACGAAGGTCGCCTTCTGGCGCCCGCATGGAAATCCTA
-CGAATATGTCAGCTTCTGATGGGACTCCGTAAATCGACACACAGGGGTAC
-CTCAGACATTTCCCTCCCCCTTACAAATTGTTAGGACAAGGAGGGGGAAT
-TCATCTCCACTCGAGACACACATATGTTGTCGTCAGTGAAGTGTAAAGAT
-CTAAACGATTGCGTGTATGAAAAAGCACTCTATGATCACCTTTTTCATCT
-TCCTACACCCTTTTTAGGTGTGGTGCCCATCGAGCACTCACGCCAGGCAG
-GGAGAGCACCGGTCCCTGACTAATGGGATTCGAATGTTTTAGACCGGAAA
-TAGGAGCGATGAAAGAGCATAGAAATGATCATTTGGAAATCACGTTTAAT
-TAGGTTACGGCGAAAATTTGCAAAAAAGAGCAGGAAACTTGGCTCAAATC
-CTTCGAAATATAACAACTAGGACTTCCATGTAGGCGTTAAAGCGCCCTGT
-CTCTCACCCCAATCCGTACCTTAAGCTGAAACAAACGTGAACTTTTTTCA
-TTTCTTAAAGGAGTATCGTCAATGGGAAAATTGTTTTAAAATGTAGTATT
-TGTACTTCAACTTCCAATTATTGCAAAAGAAAAACGGAAAAAATCCGTTA
-ACATTCAGCATTTTAAGTCGAAGAAATCTTTAAAATTTAACTAGAGAAAT
-CCTAGGCCACGACGCTCATTCGAATTTTAATTTGTTTTGATATTGTATTT
-TGAAAAAAAAACTTAATACAATTCCTTCTTCCCAGTTTTCTATAACTTTT
-TGAGAAAAAAACGAATTAAATTCCGAAAAAACTACATTTAAATCAATATT
-TTGTTTACGAATATGGCCTAGAAATCGCGTGGTGGCCTAGGATTCATTTG
-CGCGCGAAATTCAAATTCCGTCACTTTCGTCGATTTCAACGGCTAAATGC
-TGAATGTCAACGGATTTTTCCCGTTTTTCTTTTGCAATAATTAGAAGTTT
-GAGTACAAATACTACATTTTAAAACAATTTTATTTTTGGTATTTTGACGA
-AAAATTGATTTATTGGTTTTTTTGGTTGTTTGGGACCAAAAAATCCAAAA
-AAAATGTTTGGCGTGTCTAGTTTCGACTCGAGACTATTCTGTATTAAAAA
-TACATTAAAACATGTATTTTAACACAGTTGTGACGTCATAAATGTATTTT
-GATACATTTTGCAACATTACTTAAATAACCCCATTAAAAATTAACCTAAG
-CATCAAAAATTTTTTGGTTTTTTTGGTTTTTCGAAAATTTCAATTTTTTT
-TGTTTTTTGGTTTTTTTTGGTTTTTCAAAAACTTCAATTTTTTGTTTTTT
-GGTCCAACATTTTTTTTTGGTCTCAGCTCTGCTGCCTACCCTAGAAGAAC
-TAATAGCGCTTCAAAAACTGATGAAAACGTTCAAATTTGTCGAAATATTA
-CGAAAATTTGAAAAGTTGGCTCAAATCTAGATTGAATCGGCCGATTTTCC
-ACAAGTTTCCAAGTTTCCACAAGTCGCCACATATCCCGAGAAAAATCGAT
-TCAAATTGTTTGAAAATTGGAATACTGCGAATTTTGAACCAAATTTCCCT
-GGCTTCTCTGTTGAAATACTTGAAAATACCGCGAAGCAAACAAAAAATCT
-AATTATTACGTGAACACAAAATTCTGAAAATGCGTATATATTGCGCAACA
-TATTTGACGCGCAAAATATCTCGTAGCGAAAACTACATTAATTCTTTAAA
-TGACACGCTGTATGTGGTGATTTACGGGCTCAAAAAATTATTTTCGAAAA
-TCAAGCCCGTAAATCCACACGTAGTAATTATATAAAGAATTACTGTAGTT
-TTCGCTACGAGATATTTTGCGCGCCAAGTATGTTGCGCAATACGCAACCC
-CATATGTTGATATATACTGATGTGAGGATAAAAAACAACACAACTTTCAG
-CGGCTCCATCGGCTCCGGCAGGTCTCGAGGAGAAGCTGCGTGCTCTTCAG
-GAGCAACTGTACAGTCTGGAGAAAGAGAACGGAGTTGATGTGAAGCAAAA
-GGAGCAACCAGCAGCAGCCGACACATTCCTTGGATTTGTTCCACAGAAGA
-GAATGGTCGCGTGGCAGCCGATGAAGCGGTCGATGATCAATGAGGATTCT
-AGAGCTCCATGTAAGTTAGTGGTGGTGGCCGGAAAAGAGAAAACTCGGCC
-AAGCTGCTCGGAGTTTTTGAATTTTTGATAATCCGAAATAAAAATTGATT
-GCTCGAAAAGGAACAATCTTTTGGAAAAAAACGAATTTTGTCATTTTTTT
-CAGCAAAAATTGATTTTCGAATTTTTCCAATAAAAAATCGATAATTTCTC
-CCCGTGCAGTGGAAAACAAACAATATTTTTTTGTTGATCGTTCTCTTCCA
-AACCCGGAATAGGTACACACATTCCTGCGTCATCCCATTCTCTTATCACA
-CTTTTTTTTCGAAAATAAAAGTGTAGAGACGGAAAAGTGAGAAAGGAGTC
-AATTTTATGCGAAATTTTGCATGATAATACACTCAAATTAAAAAAACTGC
-GTGGCGTGCACTGCAGAAAACCTCATATTTAGGCCCCGCCTTTTTCTCGT
-CCACTCACGGAGAAAAGGCAAAAATTTGGGGACCAACCAATATCAGGCCG
-CCGACATCCTACGGGTTCCGCGCGCCGCTATGTTTAACTCGCTGTGGGTG
-TGGCGAGCTGTCTCCGCCCGCTGCGAGTTAAACATAGCGGCGCGCGGAAC
-CCGTAGGAAGTCGGCGGCCTGATATTGTTGGTCCCCAAATTTTTTCCTTT
-TCTCCGTGAGTGGACGAGAAAAAGGCGGGGCCTAATTATGAGGTTTTCTG
-CAGTACACGCCACGCAGTTTTTTTATTTTGAGTGTATAGGTCTCGATTCT
-CGAAAGTATGACAGTTATTTAAATGATGAACTCGTGATGACTGTTAAATT
-TTTGGAAATTTCGGGGGAATTATATCGATTTTTCGATAAATTTACAGGAA
-AAAAGTCCAAAATCTAGGTATTCCATGGTAGGCAGGCGCGATTTCTTGAC
-GCCTGCCTGGAATCTGTCCGCCTCACACCAAAAAATGTCAATCATTTTGC
-TGAAAACCAAATTAAGAAATGAAAAAGTGCACTTAGAGATGATGACGGAG
-GTCGCCTTAAGGTCAGACAGGTTAAAAAACCGATTTTAGTTGAGTTTTCC
-CGAAATTTTCTGAACAACCGAATTAGAAATATGCTGCTTGTCATTTTTGA
-GTAAAAATTAACGAAAACTTCGACCAAAACCACGAAAAAAATGAAGAAAA
-TAAAGATTTTTCGAGAAAATAACAACAAAATCCAGCAAATAGTGAAAAAT
-AGTTTTATCCGAGAAAAAGTAGTTTAGACGCTATGAACTCTCGAAAATCA
-GATTTTTTCAATCTAAAAGCCATAAAATTATCGATTTTTTAAAAATTCTC
-ACTGAAAACCGGCGAATTTCAGTGCTCCACGCAATCGAAGCCCGCTTGGC
-CGAAGTGTTGAGAGCCGGAGAACGCCTCGGAGTCAACCCGGAGGAAGTTT
-TGGCGGATCTTCGTGCTCGTAATCAATTCCAATAAATATTCTTTGCCCTA
-AATACTTTAAATTATCCATCTGACAACTAAAATTTCGGTTCTTCTTGGCT
-TCTTCTATTTGTGAAATGGTTTATTTTCCCCCGAACTCTCAAAAGGTTTA
-AATATTGTTCGATTACCCCTTTTTATCAATTATTTTCTTCAATTTCTTAT
-TTATCATTATTTTTCTAAACGAAGACGGATGTGATTTTAAATTATGTTAA
-TGGACTATTTTACAAACTGAATAAATTCAGCATGTTGGCAGGTTTTTTCA
-GTAGTTTTTGAGTGAAAATAGAGGTAAAAAGACAGAAAATCAATAAAAAA
-TGAAAACAAAACTATGAAAAATGGTTGAAAATCGAGCAAAAATCGTTCAA
-AAAAAAATAAATTCAAAAAATAATTGCGTCGAGAAACGCGTCAGTAGCCG
-CTCTCTGCGTCTCTCACCCTTCAGCACGCGGAGAGAGCCACGAGAAATGC
-GCAAAGGCTAAATTCGGCGCGGAAAATCATTTTTCAAAATAAATTCGACG
-AGAAAATCAATACTTAAGTAATTATCGATTTTCAGCTCGTTCAAAAAATT
-TTCAGAAACGTTTTAGTCGTTTAAAGGTTTTTTTAAAATTAAAATCGTCG
-GAAGTAAAAAAATAGCGCGGATGGAAATCTACGGAGTGCGGAGCGAACAA
-ACGCGCGGTAATTCAAATGGGTAGAATAGTCAAAATTGAAAATTAGCCAG
-CATCGACCGATTTTTTTAAAACTTAATGGATTTTTTCGTTTTTCTTTTGT
-GGTATTTCGGCATTTAGGATTAGATAGCACATTTTAAAGTAAAATTCCCA
-TCCAAGCTACTCCACCTTCTCCAGACTGTACAGTTAAACCAATTTGAAAA
-GTGTATTGTATCCCGTTTTTTTTTCTGAACAATTTTGAAAATTTTTCGTT
-TATCCAGGATACGATAATCATGATTCAAATTCGTTAACAAAAAATGAATA
-TATGAGAGCGATTAAAGCATTTGTGTCGGAAAATATGGGTTAAATGGGGA
-GAAGGGGGCGGACATTTGGATGGGGTACAAAAAAATATGCAAAAAATGGG
-CTAAAAACAATATTTTCAAATTATGCCCGACAAAGGTTCAAAAGTCAATA
-TATAGAAATGAGAACATGAGTATTATGCCACGTGGCGGGAAAAATATGTG
-GAATGTAATACGATGAGATCCTTGTGAATACAAAGCTTGTGACGACGTGG
-CCGAGAAGAACTTTTTAAGCCAACGAGAAAAAAGGGGTTCAAGGCCGAAA
-TTTTTTTTGGGCCACCTATTAAGTTAAATTGAAAATTTAAAAAAAACACA
-GCGGATCCAATTATTTGCCGAGTTTTGACTTGAGCTCGGCGCGATACGTG
-TCGATTGACTGAAAATATTGTTTTTTTTTATTTCCGAATAAAAAATGGTG
-AGTACCTCCAAAATTAGCTTTTCATTGTCCATATAGAACTTTTTGATTTG
-TTCCACAGTTTTTGTGGCCATCAACTCGGCGATCAACTCGAAATTGTCCT
-TGTACCAGTGGAAACCTGAAGGAATTTCGGATGTTTTTGCTTAATCATAA
-TCATAATAATCTTAATCATAAGACTTGGAAAATGCGAAATTTTTCGAGAA
-TATTCAATTTATCTTCAGATTTTATTGCAACAAATCGATTTTCAACATAA
-AATTAATTTTTCCAACTTTTTTTCCCAATTTATGAGAGTTTAAAGATTGT
-TTTAAAGCAAACCGCCAACTTTACATAAAAAATTAAAATATTGTGAAAAA
-AATGATGAAATTTAGCAGATTTTCTGATAAAAAATTGAATTTTTTTGGAT
-TCGCGCTTCAATTTCACATTGTTCTTTTAGAAAAGTCGAAATTTTATATT
-TCCAATTTTCAGATTTAAAAAAATTTAAAAAGGAATGAACTTTTCCAAAG
-AAAAACTGAATATAACCAGAAATTGTGATTTTTCAGCATTTTTTTTTAGG
-TTTGAATTTTTTTTTCATGATTAATCACGTGAAAAGTCAATTTTACCGCA
-AAACATTTAAAAAATCAAGATTTTTCAATTTTCTCTGAATTCCTGCAGAT
-TTTTCGATGAAAAATTGAATTTTCCTTGGAATTTATATTTTTCGGGTATT
-TAAAGTTTCGGATATTAAAAAAAATTTTCAATTTTCTCTGAAGTTATCGA
-TAAAAATTATTTTCTGCAAAAAATCTACTTTTTTTCGTTGAATATTCCGG
-AAAAAAAATCAGAATTTCAAGGCACATTTCCTTTTCTAATCTAATTCGAA
-TAATTCAATATTCTTTTAAAAATTCGGGGTAGAAAAGGAATTGTACCAAT
-TTTTATTTTTAAAAGTTAATTTTTCTAATTTTCAAAATTTTCTTGAATTT
-TCGAATTACAGATTTTCAAAAAAATTTTTTTTGTTTTTTTTTCTCGAAAA
-TTTGAAATCCATACATCTAATAGCATTCTTCTTTTCCTCAGGACTCCAAC
-CATAATTTATCCTGACTTTTCCAGATCGATTGCCATTTGTTGCAGTAGTA
-TCTAGTTCAGGAGTAAATCTCTCGAATCTTCCCTTCAACGCCATCATATC
-TTTCTTCCAATTTGCAATTTCTCCTTTTGGTACACGGCTGTATGTCATTG
-TTGCACGGAACATTTGTTGACGGGCTTCTTCATTCAGAATTCTGGAAAAA
-TTGATGTTGTGCGATTTTTTTTGGTTAAAAAAAACAATTTTCGTAAGTTT
-AATTAACTAATATTTTAAAAAATCTCTCATTTTCTGAGGCACCACGGATT
-CAAGATCTGGTGGGATTCCGGATCTGGCACCGTGCCAACGCATTAAATGC
-AATTTTTCTGAAAAAAGGGCAACGAAGATCCGATTTAAAAAAATTTTTCA
-ATTATTTTTCAAAATTTTCACTAACTATAAGAAATTAGAGATTTTTCACA
-AAAATTCCAGTTTTCTGTTAGAATTTGAAAAAAAAATTGAATTTTTCCTA
-AAAAATTTGTAATTTTCCGATATTTCAAGCTGTCAAAACCTAAAATCTGA
-AAACTGAATTTTTAAAGGAAAAATTTTGAGCATTCTTATCAAAAAATTGT
-TTCAACTTTTTCTCAAAATGTTTCAACCTTTTTCTTTCTAAATTCTGAAA
-AGCATATCTCAGCTTTTGCTAAACTATTTTTTTCCTCAATTTTTGAGAAA
-ATTAAAATATAATATATAATATAGTAAATATTGCTTATTTTCTAATAATT
-TTTGGTATTTCTATTCTTTCGTTTTTTTTTTCAAAAATTCCAAATAGTTT
-TAAATGTTCATATTATTTTTTTTGACGAAAATAAATTTTAATTTTAAACC
-GGAAAATTGTTTCGTAACTTTTTTTTTCAAAAAATTTGAATTTTCGACAT
-GAAAGATGTAAAGTGTAATTTAAAAATAATAGTGCAGGTATTTTCAGTTT
-ACAGCAAAAGTCAGTTTAAAAAATTTCGACTGGTTTTCAAAATGAGTTTC
-CTTATTTTTTACACGTAGAACTTTTTTTATTTTCCGATTTTTTTTGTTGC
-GCAGAAATTTTTTTTCCGCAAAATCAGGAAAAATTCAGAAAAAGACAGTC
-AAAAAATTGTAGATACAATTTTTTGACTGTCTTTTTCTGAATTTTTCCTG
-ATTTTGCGGAAAAAAAAATTTATTTTTTCATGAATAAAAATCGAATACCC
-ATCCAATTCCACAAACTTACTCGTTCTCCTCCATACATTTCGTTTGTTTA
-ACTCTCCAAACAAGTGGAACACACATATGATGTTTTCTCTTGATATTATC
-AATTAATGCCAGTGCAGCCGGTGTATCGAAGCACCGTGTCATTCTGCACG
-TATTCTCATCGATTGGATCAGCTTCAATCGATTGCTCCACAATGTAGGGG
-CCTGATGGTTTACGGAGAAGGCAGTCGTCTGGAGAAAAATAGAATAGAAT
-AATGATTTTTAGGTTATTTTACGTTTAAAAATCTAATTTTTAAGACGCGT
-AAACGTTGAGCTCATTTATAAAAATTCGGCAAACCGGCAATTTGCCGAAA
-AATTTCGGAAAATTGTCGGTTTGCACATTTTTTCTTGAAATTTCAGAACT
-TCGATTTCAAACGGCAAAATTGTATACATCCTATCAAAACATCAATCTTG
-AAAAGCCAGTAAACTCTATGAAAATGTCTAAAGAAAAGAAAACGGTAAAA
-AAATACAGTTTTAAATGTTTCCGTCTTATTAATAACAAAATTCGACAATT
-TGCCGGAATTGAAATTTTTTTTTCTCCAATTTCCGAAAAAAACCCACCGA
-CCACCATAATATCATCGTCTTCTTCTTTTTCTTTTCCAATTCCAAGCCGT
-TTGATCGCTTTTCCGTTGGCTGGCTCCATGAGCTCAAGATATCCGTATAC
-ATAAATTTTCATGTCTGAAAGAAAATTCAAATTTCTTCTGGAATCAGTTA
-TTCGAAACTAACATTCTGGACATAAAACTCGTTGCCGTCGTTTTGTCAGT
-GCACGGAGGCTTGCCGGACGTGGAACACGCATCAAACGGAAATAAAGGAT
-ACACGGTTTACATTCGTGACGCGACATTACACGATTTAGCTTAAAATTGT
-GAAATTAATTTTTTTTAATAGCTCTTTATTTTTTTGAAAATTTCTCCCAT
-GCTTTTTCCATTTTTTCAACGAGTTTCCTTATTTTTTGTCCATTTACTGT
-AAGTTTTTTTTGAGAATTTTTTTTTGTTAATTTAACATTTTATTAGCTCA
-AAACATTTATTAGCAAAAATTTTATTAGCAAAAAAATTTTTTAATTTTTT
-TAAATTAGCTCAAAATTCTCGAAATTTTAAATTTTTAGGGTAAACAATAT
-AAAACTTAGGGAGTTTTGAGCTATAAAATGATAAATTGATTTTAAAAAGG
-ATGAAAAACTTATTTTAAAAAACCGACAAAAATCGACAAAAATGAAGGGA
-ACAGGCAGCAGCTTAGCCCCATGCTTAGCCAGCAGCCCCGTAGCAACCCA
-GTATCAATAATATCCCGTGCCAATTTTCATAAAACTGAATATAAATTGGG
-TTGATGTTGCTAAAGGGCTGCGAAAAACTGACCTGGGATGAAGCTGGGCT
-GCAAGGGGCTGCGAAGTGCTGCGAGGGCAAAGCGCTACAGTGCTAAAAGG
-GGGCTGAGCCCAGACCCTCAGGAAAAAACTCATACTCGCAGCCCTTCGCA
-GCCCACATTTGCGCTCTGATCGCGTGCTATCCGCGCGCACAGAATTTCGA
-AAGTATTTTCCAAATTCGGAATGCGCGCGGAGCAGACGCAATTAGAGCGC
-GGATCTGGCACGTAAGGAAGAAGTGTGACTGGAGCACGAACCAGTAATCT
-AGTCGCGCCCCGTCCGCGCTCCAGGAGGAGCGATTTGCCGAGCAGTTCAG
-CCCTTCGCAGCCCTTTAGCAACAACCAAATTTATACAGTTTTATGAAAAT
-TGGAACGGGATATTATTGATACGCCTAAGCAGCCCTATTAAATAGTGATG
-AGGGCGTAAATGAAATTCGCCATTTCCAGCTAAAATATAAATTTTTTGAA
-TTTTTTAACATTGATATTCGGAATGGATTCAGCAGAAAATTTGAAGTCAT
-TTGAAAATATTTTCCAGATTTCGGTACTCCACTTTTAAAATTGAATAAAA
-CTGTAGTCTTTATTCAATGTTTCTTCAAAATTTAAAAAGTAGAATATAAC
-TGTGAGAAAATTTCCAAAATTGTCAAAATTTCAAATAGCTGAAATATTTC
-ACGGCCCGGCGGGGGGTACATGGATGAGAATTCTCTACCGTATTCCAATT
-TGGCTGACTGCGTGCTCAACGTTGAATACTCAGTGTAAACTTTCGTACAC
-CGTTGCGTACTGCACAGCGCGCATTTTAATTGACGACATTTAGCAAAAAT
-TGAACATAAGATTTTTCGGAATTATGAAGCTCAATTTTCACAAAAATAAT
-GAGTTTTTTGTAGAATTTATGAAAAAACGTGAATATATAGATTTTTTGTT
-CATGATATTCAAGAAAAAGCGATTTTTAGTTCTTCACAGAGGAATCCTCT
-CGCATTTCACTTGCTCATGATGTTTTTTGCTCCACTTTAGGACGATAAAA
-ATGCGAATTGTTGATAAAATGAATGAATAATATAAAAAGTGCAAATATGA
-CTTCAGCAAGTGTTAAATCCCAAATTTTTCCTGCGATTTTCTGCTAGATT
-CCTGGTTTTGAGTAAACAGTCTGATATATTCATGATTATAATGATAACAA
-TAACGAACATAATAATAAAAATGGAGAGCACAGAGAAACAACAAATTGCA
-AAAACAGCAACTGATATCAGAATTAACGACGACCACGGAAACCGCCTCGG
-TCTCCACCTCGCCCACCACGGAAGCCACCACCTCTGTCGCGTCCTCTGAA
-TCCTCCTCGATCTCCACCGAATCCACCTCTAAATCCTCCATCGCGGTCTT
-CTGATCTACCACGGAAGCCTCCACCTCCACCAGGATCTGTTGAAAGTCCT
-CTGAAGCCTCCTCGATCGCCACCTCCACGGAAGCCACCACGATCCGCGGA
-TTTTCCTCTATAGCCTTCGAGGCTTCAGTTGTACCCCATTCTTCGTTGGC
-ACGCTTCAGATCTCTACAAAAAAAACAAATTAGAAGCATTCAATTATCGA
-AATGTGTACCTATCCCGATTTATCGCAATCTGTCTATTCTTCTCCTTCTG
-ATTCTCAACTTCTTTAACTTGTCCAGTAGCGGCAGCTTGCTTACGAGCAG
-CATTTTCCCGAATCGCCTTCACCTCTGCCTCCTCAGCATCCTGTTGCTCC
-TTGACAATCGTAAGTCTTCGAATGACACGTTGCTCACTCTCCTGCTCACG
-ACGCTTTTTCATCTGCTTCTTCTTGTTTATAGTCACCGCATTATGCTTGT
-GATAGAGAACCTCTCCCTCATCGATTTCTTCTTCAATTTTGACGAGTTCC
-AGGGTCAGTCGGGTCCGATCTCACGAAGACGGACGTTGCTATTCTGGCCA
-ATTCCGCAGTCACGTCCTTCATAAATGTCTTGTGGAAGTTCTTCTTGCTG
-AGGGGGCTGCTGAAACCAATGTCGGCATGATGAGAGTTCCGGTCTTCTGA
-ATCCATTTCCTGCGTGGGCTGTGGCGACGAGCTGCACGTCTGAAAATCAA
-GTTTTTGTAATTTTTGGGCGCATGATATGGAGCTGAATCATTCGATTTTA
-GAATCAGCATGCTTTTATTCATATTTTAGGATCTTTTTAAAAAATCTGGA
-CCAACAGTTTTCGAAAAAATTTAATTTTTGTTCAGAAATGTGAATATTCA
-CTAAATCGAAAAAAATAATTGCAAAATCCGTCAGCTGAACATTCAAAACT
-TATCAATTTGAAATCAGCATATTTCAGTGTATAATTAAAAAAGTTTCAAA
-AATTCTGAGACCAATTTTTATTGAGAAAAATAATTTTTCGCTCGAATTAT
-TGAATTTTCACTAAATGCAAAAAACAGTAAACTTGGGCCCATGCTACAAG
-CCTGAATCTTTCAAATTAAGAACCAGCATGATTTTTTCAATATTCTAGGA
-CGTTTAAAAAAAATCTGGACCAACAGTTTTTGAGGAACGTAATTTTTTAT
-ACAAAAATGTTCTGATTTTTCACTAAACTCAAAAAAATAGTCAAGTTGGG
-CCCATGCTGTACACCTAAATCATTAAAATTCAGAACCGCCATGTATTTTT
-TCTTACCAAAGGCTCTTTAAAAAAAATCTGGACCAACAGTTTTTGAGATA
-TTTAGAAAAACAACTCACTTTTCGACGTTTTTCGCCTTTTCGTGGCTCAC
-CCGGTTGATTTTTGCGGCGATTTGTGGTCTTTCGCTGAAAATATTATTTT
-TATTTCAATTATTAACGAAGAAAACAAGAAAAAACGACGAGAAAACATCA
-AAAAAACGCGAAAAAACATCGAAAAACCACCGCAACCTCATGAACAAAAA
-AAAAGCATTGCAGCCGCGGGACTAGTTTTCGCAACTTTCTAGGCCATGTC
-CCGTTCGCCGTGCCGTGTATTTGTTTAATTCCCTTTTTGGAAAAAGTCAA
-CATATTTTTCTAACAAATCGTTTTTCTATTAATTTTTTTCTAAAACTCAC
-AATCAACAGATCACTTTTTGCATTGCAATTCTCACAATATCCCGACGGAA
-CCCTCTCCAAATGATTGACCTCTTTGAATAGTTCATCATAAGTGTCGGTT
-TCATTCAAATGCACATTAATCATTGTTTTATAGTTTTGCACTTTTTTCGT
-GTTGTAATAGTATTGGATAATGGAAGAAAGCGAGCGTTGGGGCATCTGCA
-AAAAATAATGAAATTTATTTTCTTTTTATGATTAAATTAAATTTTCAAAA
-ATTCCCTTTTTTTGACATATGCACTTACAGCCGCATGAATCTTCTTGAAC
-CGTTTTCCGAAATGAAAGAAGCAAGTGGAGAAAAGACTAATTTCTTCTGC
-CGTCCAATCATCATGAATTTCTTTTCTTCTCATCGCTTGAACCATCGCAG
-CGTCGAAATCATTTGACTGTTTGTTCAGAATGAACAGAGCCTGTAAAAGC
-AGTTAGTTTTTTTTTCAAATTCAAAGTACATTTCCGAAAAATAAAAAAAA
-GGCTTGATTTTTTAAAATCTCGAATTTTTATTATGGTCAATTGTTATTTT
-TTCCAGAGAAAAACTCATTTTCTCCCAATTTTCAGACGTTTCTCTCTAAA
-TTTGGTGTTTTTCCAATCGTACCCTATCTATAGGTAATTGATATCGTCCA
-GTAGCTTCTGAAATGTATTCTGTAAGCCGATTCTCGTTCATTTCGTCTGG
-AAACGCCCAAATTTGTTGATCTCTGCACGGTTCTTTTTCCAATTGCTCTG
-CAGTTGGCTGTATAATCGCCTGATATTCGGTTCCCACGTGGATTAGATTG
-TCGACGTTGGAAAGTGGATTTGCTGGAAGAAATTGGGAATTTTTCAAGGT
-TTTAAGTGGATTTTCAAGCTATTTATAAAAGCATGAAAAAGCTCAGAAAT
-GACTATAAAACCTTTTTTTACGTCGTATTTTTTTCAATGAAATTACCTAC
-TTTTAATTAATTGTTCGGCTTAAAACCAGAAAATTGTTTCATATCGATTT
-TCCCGGTGAAAATCGAAGGAATCGTCGCATTCTCAAAGTTTTTTCACCGA
-TTTGTTTCAATTTTAGCACAACTAAATGGAAAAATCACAAAAATTCCATT
-ACAGCCGATTTTCGTGAATTTTCCTACATTTCGAACTAAAAATTGTCCTT
-TCTTCTGTTTAAACCGGAAATTCTCTTTTGAAAAACCAATGAAAATTTGA
-ATTTTCTGGGCTTTTCTTCGGAAAATTATTCTCGAAATTTATCAATCGAT
-CCTTGGGCTTTTTTTGTTCCGCAGAGGCTGGCGGAGTTTACAAGCGTACG
-AAGTGGTTCAACTTTTATATAAAGCTTTATAAATGGGACATAGATGAATA
-TTTCGAATGCTAAATGCAAAAAGAATCAGTAAAAAAGCGCGCAGCCCCGT
-CCTTCTCTGACGAAAAACGCCGTTTAAGGATCGATTGCTAAATTTTGGCA
-GTAGTTAGAAGTGTCAAAATTTCTGCCGGAGAGTCGTCAAATTTCACTGA
-AACGTAACCCGGTAATTTCCACAATTAATGGTCGATTTTTCGCAAAAAGT
-GGTATGTTTGTCAGGATTTATTAGAAATTGTGGCTGTCCAGATTTTAAAG
-AGTATTTTTGGGCAAAAATGTCGAATTTTCTCTGAAAAAGTTCGATTTTT
-ATCGAAAATTCAGATTTTTTAGATAGTTTTCATCGATTTTCCCAGTTTTC
-AGCCTGAGAACTTTACTAACAGAAAGATGTGTCATGAGCACCACTTTCAT
-GATGCTCACGAGCTTCAGCTTCTTCATCTTCGTCCTCTTCATCCTCCAAA
-TCTTCATCCTCATCGCCCATTGATTCCCCAGACGTTGTTTCGCGTTTTCT
-CATGGATCTTATAGGACGAGCCATCTGAAGTTTCAATTTTAGCTTTTAAA
-TTCAATTTTACCGCTTAAAAATCGATAATTCTCCCGTACTCTGCTGGTTT
-CTTCTTCTTGTTCCGCCTGCTCCTCTGGATCATCTTCCTCCATTGGCTCC
-GGCGATGCATTCAACATATTCAAGCCTTCGTCTGAAATATCTGGCCAATT
-TATAGAAAAACCGACAAAATAATAAGCCTCACTTTCTTTTCGAGAGGCGT
-CTTCGTCAGATGACGTGTACGAATCCATTTTCTGGAATTTGAGGATTTTT
-GAATGTTTTTAAACAAACTTTATAGAGAAAACATTCGAAACACTAGAAGT
-TATGTTGAAACACGAGAAAATTTTTTAAAAATCCATGAGAAAAACAGTTT
-TGAAAAATCTGTTTTTGGAGGCTCTCCGGATTTTGAGGAATCGTCACCCC
-GGAGACGCAGATTCTCCGGTAATTTTTCATTCATATTTGAGTTTAAGAAC
-AAAACAGTTTAAAAAAATGTTTTTAGTATTTGAATGAAACTTATAATGTA
-TTTTTTCTTCCATTAAAACTTAAAAAAAACTACAAAATTATTATGAATCA
-AATTTGAAACCGTGAATCAATCTCCGCGGAAGGGCGAGTCTATACTGCTG
-CAAGCGCACTCTATCGCAAATGTACAATTGGCGGTTTTTCAAACAGGAAT
-TAATCGGATTCTCGTAGTTTATTTTGGATTTCTTTTTTCGGGAACATATT
-GGTGTTTTTGCGTTCAATATTCAAATTTAGAGGAAAACTGCTTCAAATAT
-TTAGGTAAACTCTTGAAACCGCTGAAAATAGGCAAAAATAATTATTTTTG
-TATTTTTTAGGCTACTTTCTATACTTTTGCGTAAATACTATAGTTTTTCT
-ATAAAACACCCATTAAAATTATTTTTATAAAATGATTTTTCCAATAAAAA
-TAAAATGCGCAAAATGATTCTTTTCCAGAATCCTATATGCGCCTTTAAAA
-TCTCTCGGATTACTGTAGTTTCAAAGAAATTATCCTTTATATTTTTAATT
-TTAAATTTTTTCCTGAATGTCAAATATTAGGGGAAAAATTATAATAATAT
-GTGCTTTATTCATATGAGTGTAGAATTAGTGAAAAAGAAAAAAAACATGT
-ATGGACTGTAAAATTGGAATTTTAGCGAGAAAATAAAAATAATATGCAGA
-AAAAATTAAAATTTTCAGGAAAAAAGTCAGTAAAGCCATCAAAAACTACT
-CGATTTTGAAGGAAATCAGCAAGAAAAATTAGAAAAAAGTATTTTTAAGT
-TGGAAAACCCCTGCTTGAATTTGTACACTAAATTGGGCATAAAAGCGTAC
-AAATTCGCAAAAACCGGTAAAAATCTGGGGATCGTGATGGATGGAGTGTT
-TTGTGAAAAAATGCAGCGAAAAATTGAGTAGACAATTTCAAAAATGTCGA
-TTTTTGAAATTTGTGACGAAAAAATTGAACAAAAACTGTTTTTTTTTGGA
-ATTTTCAACAAGAAGTTTTATAAATTTTTTTGTTTAAAATTTTGAATATT
-ATATGAGTTTGGTTTCACTTAACAGAACAATTCGAACAAAAGTATTCTAG
-AAAGGAAATGTGCGCTCCAGCACACTATTTGCCCGTGGAGCGCACTTGTG
-TGCACGAACGCTAGCGAGAATGTGTGGTAGAAAGGGAGGGAATAGGAAAT
-ATTAACAAAATTGGGCAAAATATGTAAGATTCGGAGAAAGAATTGGAGAA
-AAATATGTATTTCGAGCTCCGCGAGCTGATCAATCCAAAGGCTTTCTCCA
-TCCTTTTTTCGAGAGGCACATTGCATTATAGTTACACACAGCACGTGTAT
-AATGGAACATTGAAGCCTGGAAACGAGCCATCGCTACCATCATTACCACG
-TGGATCTGAAAAAATTAAAGTTTGATGATTCGAAAATTTTCTGGAAAAGT
-TATGATTGTGAGATAAATTGAATTCTTTGAAAAATCAAAATTCAAAAGCT
-TGTAGAAAATTTTATATATTTTTTTAAGCGTATTTTTTCCGTATACATTT
-CCAAATTTTTTTGTTACCCAATTTTAAAGATTTTCTTGAATTTTAAAATT
-TCTTTCAGTAAAAACTTTTTTTCAACTTTTTGATTTTTTTTCCGCATTTT
-TTAAAATTTTATTCAGAATTATTAGATTCTTTTGAATTTAACGAATTTTT
-TTCGCTAAAAAATTGTTCGATTTTTCCCGAATTAAGAAAAATATTATTTG
-GTTTTTGAATTATTTTCCTGATTTTTTTCGATTAATAAATTTGTAAAAAC
-AATTTTTTTTCTAATTTTTGGTTTTGATGATTGTGTTTTTTTTCTGAACT
-TTACAGTTTTCAAAGTTTACACCGAACTTCCACATTAAAAAATTCTGATA
-CAAAAAAGTATTCACATGATTTTTAAAATTTAAATATTTTTCAAAAAAAA
-TAATATTTAAACTGTGTTTTTTTCGGAATTTTTTTTCGATTTTTTCCGAG
-TTTTTTTTGGAATTTTTTCCTTTCTGCTCCAAAAATATTCAAATTCAATG
-TTGTGTAGAAATTTTATTCAAAAAAAGTGTTCAACTTCTGAGTCTAAACC
-TTTTCCGAATCCTTAAATCCTGGCAGAGCTCTCGTGAATTCAGTTGTCAA
-TTTATGTGGATAGCAAGCTGCCAGTTTAATGAAAGTTTTAGTTCCTTTGT
-CAAGTACTCGATTAATTTTCGAATAATCATAATCATCGACTCGAACACCA
-TATAATCCTTGAGTATAGTTCCAAATTGCTTCACGGAATGCAGCAGTGTC
-AATTTCATTCTGATTCACGGCGGCTGGTGGTTCTCCGTCTCCAGATGCAT
-GGGATGAGCCGGATGGCCTGAAAAATTAATTTTTTGGAATTATTATATTT
-TTCTGTTTTTGAAATTTCATGCATCTCGAATATTTTAACAAAATTACCAA
-ATTCAACTAGATTTCTTACAACTTTCACTGTGTCGATTTACGGGTTCGTT
-ATACGAATTGAATTTGTTTATCGATAGAATATTAAAATTTAGCTAAAATT
-GAGAAGAATATAAGAAGAAATTAATTTTTTTAATTTCAAAAATCGAGCCA
-GTAAATCGACACGAGCGATCGACACAGTAGTCATTTAAAGACCAGTTTCC
-GCCACGAAATATTTCGCGCTTCAAACATGTTGCGTAGTACGTATTCTCAA
-AATTGTGCGTTCACGTATAATATTTATGCGAATTTTTGGTCTACTTTGTT
-AGAGAAATCATCACTAACATATTGCCAGTAAGAGTCCGAATATGATCGAA
-CATTCGATCAAGCCGTGACGTCAGTGTATCCGTATACTCATTCATCGTAT
-TATAAACATGATCCCATCCAAATTCTTCAACTCGGAATGGCGGAATATCC
-TTTTCAGGTCGCTTTCTAAAATCAATATATCCAAATGTTCGATGATGCGA
-GTAAATTGGATAATTACACGGCGGCTCTTTTTCCATAATATCTTCTCCAT
-TTTCATCGATATTTGCAAGAAGAAGTACAGGCGAGTAGTTTTTCCGATTG
-GAACTATATGTTGCTGCAGGAGCACTAATTAATGATTCAATAGTTTCAGT
-AGTCATTGCACACATCTTCGCTGGTGGCCTAGTTTGTCCTTTTTCCGTCT
-TTTTCAGCTCACTGATCAAATATTCGACTTCAGTTGGCCGACGATCTGGG
-ACTTTTCGGAAATAGGCCGACATTCTCGCCTCCCAATAGTCGAGATCATC
-GATATTAAGGAAATCAATCTCATCTTGTGTCAAATCAACACGACGTTCCA
-ATCCAATACAGCATATAACTGTGCACATTGCGTGAGTCATTGACATTATT
-CCGACGGCGTGGTGGAGAGAGCAAACCGAGAAAAACGCAGGACCACCGTC
-TGGCGTGCGGCGAGCGAAGAGCACCTGGAAATTTTCAAATTCTTGAGAAA
-AACCTAACATCGTTGTTATACGTTCGTTCTCTTGGCATTGGAGTTGGCAG
-AATTTGTTTTGAAAAAACGTTGTTTTTTTTTTGAAAGAACATTTTTTTAT
-TACGGGACCATGAGATCATGAGAATTCCTATTTACTGGCGCGAAAATATT
-GGCAGGCCACGGCAACGAGAGAGCATATGGCAAAGAGAGACGCATCTTAT
-TTTGTCTTGTAATTTTTTTTTAAAATAATTTACAATCCCTTTTCAACTAT
-CGTGATTGTAAAATATTACAAATTTCAGAATTTCGCTACCAAATTATTAC
-TGGAAAACTAAACTCTGAGAATGCGCATTGAGCAACATATTTGACGCGCA
-AAGCATCTCGTAGCGAAAACTACAGTTATTCTTTAAATGACTACTGTAGC
-GCTTGTGTCGATTTACGGGTTCGGTTTTTGAAATAATTTTCTTTTCGAGA
-AGTGACAGTGATATTCCATTTTCCTTCTTTTCTTCCTATTATTTTATCAT
-TATTTGCTTAATTTTAATATTCAATTCATAACTAAATTACTTTAATTCAT
-TTCGAGTAGACATTCAAAGAATTCCGGTAGTTTTCGCTTCGAGATATTTT
-GCGCGTGAAATATGTTGTGAAATACGCATTCTTAGAATATGGTGTTCCCG
-TAATATTCAGAAAAGAAAAGATTTCCAAGAACTTTCTGAAGATTTCAATA
-TTTGCAAAATCAGAAACCAGTTCTGAATATTCTTTATTTTTAGAAATTTT
-TCAAGGTTTTCTAAATAACTTTTCTAAATAACCTACCGTATTTCTTCTAT
-TAATATGGCTGCAATACTATTTTTCGATGGTCTTCCCGCTTGCAATACTA
-TTAGGGAGTGCAAGTCTAATAGGGAGTGCCATACTATTCTTCAGAAAATT
-TTTCTGTGTTGGGGCTTACTAGATTCTACTTGAAAAAACTCCAATTTTAT
-TTGGAAGTATAGAAAATTTGATTGAAATTGCAACAAAAAGGTACAATAAC
-TTCAATCTCTAAAAATTTTGTTATAAACTGTTGCAAAATAGGCAAAAAAT
-GTTATTAAAATTTTAAAATTAGTAAGGAGTGTTTGCAACAAAAAAAAGTA
-GGTGCAAGACTATTAGGGAGTGCAACACTAATAGGGAGTGCAATACTAAT
-TTTCGGAAGGTCTCCGAGGGGCAATACTAATAGGGAGTGCAAATCTAATA
-GGGAGGCCATATTAATAGAAGATATACGGTATATATAGCTTTGAAAAATC
-GGAAAATGCCTAATTTTTACTTTTTGAGGTTTGAAAATCTCTAAAAATTC
-AATAAAATTTCAAATTACCGCTAGATTTTTCCAATGAATCATCCATGGTC
-TATGACAGAGCATTCGATTCAAATAATCCAATTTTCGAAATTTCATGTAT
-GACCAATCAATGCCCAACAACCACATTTGTTGTCCACCCTTTTCCAGAAA
-TTTGCGACGATGATGATCCATAAGTGATAGGCATCTGTGACGTGATGCAG
-CCATTAGTGCAAGATAATGACGAGCCGAAGCTGGTAGATCACTTATATCA
-ACGAACATATGGCCATAACTTCCTGTCATATGAACATGTAGAGTTGGGTG
-TTTACATGTGAAACGGAATAATCTGGAAACGTGAGGGAAATTAGTTCGAG
-ACGGGGAGGGGCAGGTTGGCGGTGCCAACCGACAGCCGAACATTGGGGTT
-TCTCAGCTGGTAGCGCCAGCCGACAGTCTACTGCAGTACTGCAGATAAAT
-TTTCGTCGGCTGTCGGCTGGTGAAAATTTTCATGAAAATCAATAATTTTA
-AAGAAATTGTTGCAAATTTTTCCCAAACTTGACCAAATTTGTTGGCTGGC
-TGTACCAGCCGACACCCGAAATTTAGAACATTGATTAGAGGCTGCTTGGC
-AGAAATAATTTTAAATTCAGAAATTCAATTCGTTTTCAAAAAATATTTTT
-TAAAACTTTACCGATCAACTTCTGGAATCGGATCAAAATTGAGCCAATCC
-ATGGCTTTTCGTCTTTTAGTTGTAGTGTGCATTGTGTAGATCTTTTTATA
-TTGCTGCGAGGTGAGTAAATGAAGAATTTTCGCGACCCGTTTCTGAAAAA
-ACTCAGTTTTCTAAGGAAATTTTGAAAATAAATTCGAGAAAAAGAAACTG
-AGTCAGCAAAAGAAAATTGGAAATGTCTGTCTGGAAATATTCGAATATTA
-TATTCAAAAGTTTTCAAAAAAACAACGAAATTACAAGCAATTGTGATCAG
-AAACCGCGGAAGGAACTGGACGAAAAAAATTATCTTTGAGACGAATCTCT
-TTGCATCTTTGTGATCTAAAAGATTAATAAAGGTTGTCATCACATTTTTC
-GAGATTTGGGAATGTGATAAGGGTGAAAAATGGAGATTAATTGTGGTAAA
-ATGAGGAAAAACCTAATTTTTGGTGAGAAAATTGTGGAAAAACTATAAAA
-GAATCTTTATGGAGTTTAAAACTCAAGTTTTTCACGCTTTTCCGCACTGT
-GCGGAACGTTTTTTGAGAGAATTTGGCCGAATTCGGTGATTAAAAAAATA
-ATTTCAAAACTTTGCGCCTCAATTGTGATGTATTACCGTACTCTGTTGCC
-ATTCCACCAAAATTTCCTTCATTGTTTTGCCATTTTTCTGCATAATAACT
-GTTCTGGGTTTTTTTGCTTCATGTGCCCAAATGTACGAATTTCCCTAAAA
-ATTATACCTATTTTTTCAAAATTTTTAATCGCTAGAATTTTTTTTTCTGC
-ATTTTCTTTAAAAAAAGAGATTTCTCGCAAGTAGAAGGAGAAAAAATGTG
-TGGCTATACTTCTTCTTAAAGAATGCACGACTAGCCATAGCTCAAGCCCC
-CTCTGGAACGTTCCATCTTCCTCCCATTTTCCCACGTTCAAGAATCATCA
-GCTTCTTCTCCCTCAGCTTCTCTTCTTCTAAAACCACAACTAGACAAATG
-TTCTTGTTTTCCACCCTATTTTTCACATAAAACCGCCGAGAAACCCGCTA
-TCACAGACTCAATGCGCACCGGAGGGGCTCTTTGTGTGTGTGTACTGATC
-TCTGCGTTATATTCGAACACCGGCGCACACTCGGATTGAACCAGAGGGGG
-GGGGGGAGGGGGGGGGGGGGGTGAAAAAAGAGAAATACTCTGAAATTCCA
-TAAAATCTAGAAGAAGAAAGAAAACAAAGGAAAAATTGGACATTCCGAAG
-TCAGGCTAAAAAATCTCATAAAACAAAATCTATTCGATTTGTGACCATTT
-TCATCTATCTCTCTCAAAACCCGAATAAACAAAGCCTCCCGTCCCCAAAG
-TGTGCTCTCATGCTCTTCTGGAGCCTTCTAGACTGTCTGTAGAGCCTAGA
-GACAGCGGAATTGCACTGAAGTGATGGAGAGACGTAGAGAAAACGCCTGA
-AGAAAAAAACGAACACTTTGGTGGAGGAGGAGATGGCTTCCCTCCAAATA
-AACAACAATTTCTATCGTTTCTCTGTGATTGTGTTCTCTTCTATGTATAC
-TGTTACGATATTGAACAGGAAATTAAATTGAGCACTCTGAATACATAATA
-CACAATAAATAAATACAAAAACTATAGTTTCAGCACAAAAAATTCGAAAA
-AAAAACGATTTTTTTTGTCCGAGAGGAGTATATGGCCTAGAAAAAGAAAA
-CTCGGCCACTCTGATGCAATAAATTTAAAAAATTATGGCCGAATTTTAGA
-TTTCTCAGGCCAATTTGATACGTTTCTCGAAAAGCCATAAATTAGTCGGT
-TTTTCACGGGCTTCTTGCCTTCCTCATTGCATTTTTCGCGCTCCATTGGC
-AATCTCCTGCTGGACAACGCGTGGGAAATCGTGTGCCCCACACGGGCAAA
-TACATTTTGTTTTACAAAGAAAACCGTGCCGCGACGCGACACGCAACGAG
-CCGTAAATCTACCCCAGATATGGCCGAGCTCAAATGGCCTAACCTGTCAA
-AATCTTCCACTTCAAAATATGAGGGAAGCCAGAAGCGCGTGTTGTTTCTG
-AAAAAAAAACCCGCCTAAAGTTGATTTAAATTATCGTTTTTTTGGAAATA
-ATAAAATCGATGAATTTGTAGATTTTGATAAATTTCCGATAAAAAAAAAA
-TTTTAAAAGAGGAAAAAAAATGTTTCTTCGCCCTTTAGTACCAAAAATAC
-GCCCAACTAACCAAATCGTTCTTTCAATCTTTTTTAAATGTTTGTGCGTC
-TATAATTGTCGCTTCAGAAAACTACACAAAACACACACACACACAAGGAG
-AAGAAAAGAAAAAACGTGTTCCATGACCTGCCACTGGGATCGATCTGTAA
-AAGAATTGGGGAAAATTGAGGTAAACTGGTTTTTTATCGGGAAGATTTTT
-TCGGAAGGATTGAGATGAAAGTTCGAAAGGTAATTGGCAAAGTTGAAAAT
-TGAAAAATTCGAAAAAAATCTCAATTCTCTGCTGTAACCCCCAATTTTGC
-GTCATGGCCTAGAGTATGCAGCGTGGCCTAGAAATTCCTAACGTGGCCTA
-AAAGATCACGGCGGTACCTATGATTTTCTAGCGTGACCTAGAATATACCA
-GACCTAGAATTTGATAGCGTAGAATTTCCCAGTATATCCTAGCAGTCTTA
-AGTGACAGTTTCTCAGTACGTCCAAGAATTCGTCAGCATGACCTAGGATG
-TTAAAGCGTGGCCTACAAATTTTCAGAGTCTTCTAGGATATTCCAGTCTA
-AAAATTTTCAGTGAGGCCTGAAATCATCGCGTGTCCTAGAATGTCTAATA
-ATTGCAAAAAAAAGATTTGAAAACTAGTATTTACCCTAAAATTGCATTTT
-GAGCATTATTTTTAATCTAGTTTTAAGGAAAAAATCAGAAAAAATAAACA
-TTTTTTGATTAAATCTTCCGATCTACAGATAGAAAGTGTGCAAGAAAGAA
-TGCAACATTGTGCTCGGTGGAGCAAGAAGATAAAAGAAAGAGAAAGAAGG
-TCCCCCACCCCTCCAGTGGTCGAAACAATGATAAATTGGACAAACGGAGG
-ACCAAGGGGCCGGGCAGACACAAGAGAGAGAGTACGTGAACTGAGGAGGG
-TGTGCAGGGAAAAATGGGATGGGGGCAAATCTAGTTCAAAGATGAGACAC
-TTTTCAGGATCTTTGATTCTGAGAAAAATTTTGAACAAAAAGAATACTTC
-AATAATTTAATGGCACATAGAAATATTTTCAGATTGTTCTTCAAAAGAAA
-AATATTTTTATGCCCGGAAAATTTATTTATTGCATTTCTTCCAAAACAGT
-GGCCGGTCTCGACACGACAAATTTTTGTTAAATGCGAAGAGGTGTGCGCC
-TTTAAAGAGTACTGTAATTTCAAACTTTCGTTTTAATATTTACTTGTGGG
-AAAACATTAATGCTTAACGAAAAATTACAGTACTCTTTAAAAGCGCACAT
-CTTTTCGCATGTGACAAACATTTTCGCGTCTCGGTGACAACTTTTAAGTT
-AAAGGCACATAGAACTTTTCTGAAGAATTTTATTTATTTTTCTGAAAGTT
-AATTGCTACAGTATCCTTTTTCAAGTCGCACCGAGAGCCAAACTGTAGCA
-AATCATCAAAAAAAAGTCGACAAAACGTGCCGAAATCAGTAAACTTGAGA
-GCTTTAAAACTCTATTATCAGTTCTTCGCCAACAAAAAAAAAGAGTACCG
-TATCAAAAACGAACTTCGACTTTTTTGGCTCTCCTGCATACGGACATGAT
-TCTGATTGACAGTTTTCATGTTTTTTTTTGGGAGTTTTATTTATTGTGCA
-TTTAAAAAATCGTATAGTTTGATGCGTGGCCTAGAATTTGCCAGTGTGAG
-CATTAACTCTCCACGGTAGCCAAGAAATTTTCTACGGTGGCCTAAAAACT
-GCCAGTGTAGCCTAAAATATTTTATTGTGGCCTAAATTTTCCAATGGTCT
-GTTTTTTTTATAGTTGCCTAGAATTTCTTTTCGTGACCTAGAAGCGTACA
-GAGTGGTGGCCTAGAAAACGATTCATGGCAGAGTTTTGAAAAAAAAACGA
-AATTTCGAGAAACAAGCGAACAAAAATCGTCTGTCGAAAGAGTATTTCGA
-ATGCTGGGGATGCAAATCAGCAAATCATTCAAAAAAAACTTTTGTGATAA
-GAAATCAAACTGATAAGCCAGTGTCAAAGTCTCGAGGATTAAAAATAGCA
-TTTCAGGTCGGGGTACGGTAGGGTTTTTGTAGAAATTAATGCAAAATTTC
-AGTGGGAAACGAGTTCGTGGCCTAGAAAAATCATGTCTGAAAAATTGCAA
-ATGCGCTCCCCCGAAATGGTTAAAAATTTTCAATTGATAGCCTATTTGAA
-GTGGCGGCCTAGAATATCAAATAATGGCCTAGAACTCAAATTGGCGGCCT
-AGAAATCAAACTAATGACCTAGATTAGGGCATCTTGTAGGCAGCTTAGAT
-CACCTATTATAGGCAGGTGTAGGTAAAATTGTAGACAAATGTAAGTTTCT
-TTGAAGATAGGCGTAGGTTCCTTTGCAGGCATACATAGATCATTTATTAG
-GCAGATGTAGGCCTGATTGTAGGTACAGTGCCGGCCAAAAATATATCCTA
-TTTTTGACTTTTGATAAATTTACAAATTTTCCAAACGAGCACAACTTTAA
-AACTAGAAATGTTATCGAAAAAAGTTCAACTCATGTATGTATTGCCCATA
-ATTACGTCTACTCGTATTCAATTGTTTGTTGTTTACTAGTGTCACGACAA
-CAAATACAGCGGCCGACATCTCGTAAGCCCGTTTTTGACAACGTTTACTG
-ATTCGGCCGTATCTCGAAAACTAATTTTTTTCTGAAAATGTTGTTAAAGT
-GAAATAGTTTTCATGTTATTTGTTATCATTTGTGTTTATTCACTTTGTTC
-TGAAAAATCCAGTAAAAAAGTTATGGGAGTGCAAACTTGTCGCTCACTGC
-CACTCACCCGCTACAATCAAAAATCAGGTTACTTATAGTTAGTTCTAATT
-TTTTTTTTGTAGAGCATTTTTTAGAAATAACACATGTAAAATCACAATGA
-AGCTATATTCAAACACGATATCAAGATTCAGGAAAAAATTCATTGTTTGC
-GAGAAATGTTCAAGGCGTGGCCAAACACTATTCAAGTTTAATCTCTCATA
-ACTCTTTTTCTGGATTTTTCAGAACAAAGTGAATAGACATAAATGATGAC
-AAGTAGTATGAAAACTATTTCACTTTAACAACACCTCGAAAAAAAAATCG
-CTCTCGAGATACGGCCGAATCAGTAAACGTTGTCAAAAACGGGCTCACGA
-GATGTCGGCCGCTGTATTTTTTGTCGTGGCACTGGTAAAAAACTTAAAAA
-ATTGAATACAAGTAGACGCAATTATGGGCAATACTTCATCAGTTAAACTT
-TTTTCGATAACATTTCTAGTTTTAAAGTTTTGCTCGTTTGGAAAAGTTGT
-AAAGTTATCAAAAATCGAAAATGGCATATGTTTTTGGCCGGCCCTGTAGG
-TTAAATATTTTCGTTATCAGGTGTAGGCATGAATCGCCATGTAGGCGGGC
-GTAGGTATCTTCTAGGTAGGCGTAGGTTACCTGAGTCAAATTATAGGCAG
-ACGTAAGTAATCATAAAAATTGACACTTTGTGGGCAGGCGTAGGTCACCT
-TTTAGACAATCATAGTTAGCTTTCTAAGTAGGGTTAGGACACCTATTATA
-GGCAGGTTTAATTCCTCTTATATGTGTGCGTAGAACACGTTATAGTCAGG
-TGTAGGTCACTTTGTAGGCAAGTCTAGGTTCTTCTTTCGGCAGGCGAAGG
-TCATCTTCTGAGCAAGTTAAGGTTCGCCTTGTAGGTCGGTGTAGGTTGCC
-TCGTAGGCAGACTAAGTTACCTTCTGGGCATGCCTAGATTGACTAGTAGG
-CAGGTGTTGGCACCAAGGGTGTCAGTGTCCCGTAAAAATTACAAAAACGG
-GACAACGGGATGTCCCGTTCCCGTGAAAATTTTAAAAACGGGACAACGGG
-ACGTCCCGTTCCCACGAAAACACCCAAAAAACGGGACAACGGGACATCCC
-GTTCCCGTGAAAACGCTCAAAAACGGGACAAAAGACGTCCCGTTCCCGTA
-AAAATGACAAAAACGGGACACCGGGACGTCCCGTTCCCGTGATAATTTTG
-AAAACGGGACAACGGGACGTCCCGTTCCCGTGAAAACACCCAAAAAACAC
-CCAAAAAAACGGGACAACGGGACAAACGGGACACGGGACTTGACACCCTT
-GGTTGGCACCACTGAAGAATGCTGAAACCGACTTTTTTTTCAAAAATGTC
-CTGCTCAACGAGCCGAATGCATTTTGGTCGGATTATATTGGCACACCTTT
-TTGCCCCCGAGAGAATCATTGAACAAAATCTCATGCACTTTCAATTTCAT
-TTTTCATTTCATCAAATAAAAAGATTCGGGAGGATTTGATATATATTGGA
-AAAATAAATGAATGGGGGATTTGTATGGTGGGGGAAAAGTGCACACCCGG
-AAATGAGCAGTAGGATTTTGAGCAGGAAATTGAAGGAGCTGGAGCAGGAG
-AGCAGCTACAGTAACCACCCCTTCACAGCAAAACACATGGCTCATAAAAT
-TGAATATTTGAAGTGAACTACTAGTGATAAGCGGTGAAACGGGGTATGTG
-GCACTAATTTTTTTTTCTTCAAAAAACCCATTTCTTATCACTTGTGTGCA
-GAAGCATTATGGAGACAGGCAGGAGGCAAGTGGTGGTCTAAAAATTAGAA
-AAGTTCGGCCACAGCTTGCCCGATAGGAGCACACGGGCATACTGTTTCAA
-CAAAAATTCGAAAAAATTGGAAAATCCCGGAATTTTGATTCCGCGGAATC
-CGACGATTAAAGAAATTCTCGCGTTTCTGATTTCACGGAAATCGGTATTC
-TCGAAATTTGGTTTCTGCGGTGTCTATTGTTTTGGAAATGTTGTGTTCAT
-GTTTTATGAAGAACAATATAATATTATGTATAATAGATATTATATATTAT
-ATATAATAGAATAATTTTAGTAAAAACCCCACAAAACTTCGAAAATAGAA
-GAAATTCTCGCGTGTCTCCAAAATTACAAAAAAATCAGTTTTTTTCCTTT
-ATTTTATATTACACAGGATATTTATATCAATTCAGCAAAAAAACGGGCGG
-GACAGAAAATTAAGAAATTTGCGAATATTCGTTCCCACGGAAGTAAATTT
-CCCCGAATTAGAAAAAATTCGAATTTTTACTGGATTTGTCTCAAGCTTTT
-GAATCTAGAAACATTTTCTAGTAAAATCTCTTTAAAAAATTTTTTACACC
-AAAAAACTTTTTAGGCCCTGAATTCTGCGAATTAAAAAATTCCGCAAGAG
-ACCACACAAAATCGAGAGACTTAGTTAGACAAGTAGAGGGAAAAATAAGA
-GGCAACAAATCATCGAAAGTTTTTTTCTGCAGAGAGAATGGGGGAGAAGT
-TGCGGCGCTGAAAGAGAGAGAAAGAGAGAGAGAGACAGAGAGGGTGAGAG
-ATATAACAGAAAACCAGGATAGTGCGGAGGAAGAGAAGAAAAAAGTGTTA
-GAAATATTTGTCCGTCGACGCCTTCTTCGTCTTCTTCGTCGCCTTCATAA
-ATGAAACTATGCATTTTCCTCAGATATTGCCTTACTATTAAATGGGGCCC
-GGGCTAAAGGGTGTGGCCGGCCGATCCAAAACGGTGGCCTAGAAAAATAT
-CGGCGGTGGCCGATATCAAATAAAAAAAACATCGATAGTTATGAGACCAT
-AATTTTTAGTTTTTCAGATTTTGAGTCACTTTTCTGATTTTTATCCCAAA
-AATAGAGCTCTTTGCTGTTTTTCTGCAGAATCAGCAGGTGGCAACTTGGT
-TTTCGGAATTTGTGCTATTCTTAGAAATTCCCGACACAGCATCGAGTTTT
-ACTGGAGAACACGTAGCGAGCACAGAAAAAGGAAGGAAAGACAAGAATTG
-GCTCGGCGAGCAACCAGAAAAGCAGCAAGAAAAAACTGACCGAGCAAAGA
-ACAGCGCGATGGGGCTCATATATATCTAAAAATGGATGGATGGAGAGATG
-AGAGACAGCAGCAGTATTCGGTCAAATGAAGACAAGCCAATTTCGAAGCT
-TATTTGGTATTCATGCGTGTCTTTTTTTTTCTTGCAAGAAAAACTGATCA
-TTAGCAGAAAATTCAAAAAATATTGGTTGTCCGAGAGGAGTACAGAAATT
-AAAAAAAATCGTCCGAAAGGAGTACAAAATTCAAAATGTCTATTATCCAA
-GAGAAGTACAAAATTCAAAAGTGTATATTGTCCGAGAGGAGTACAAGATC
-CAAAATATGAATTGTCCGAGAGGAGTAAAAATTCAAACCACAAAAATCCG
-AATTTGCCAAGAAAGGGGCGGAGCCTGATTCGAGTGGAGTGTCGTTGCAA
-AACGCAAAACTTCAAAAACATACGGTTTTCAAAATCTACCTCGCCGACCT
-ACCGTAACCCTCTAAAATTTCTAGGATCAAATATCATCGCAAGAAAAGTG
-TTCGTTCGAAACGAAAAATATTTCTGACGCCTCATCAATCATCATATCAG
-TAACAAAAACCTGAGAGAGACGGAAACAAAGAAATATATTTTGAACCGAA
-CAGGGATCCTGCAACAAATCACGTAATGGACAAAATGCGCCCTATTGCTA
-AATATGCAGCAAGACGCAATTGCATTCTTCTGCCAGAATATCGATTTTTA
-TACGTACTTATAGTGATAAAAAAAATGCTGAATTATCGATTTTTAATTCC
-CCGGAAAAATGTGCGACAGAGCGTGTTTGCATTTTTTTTTTCGAATTTTC
-GTGCAGAAAAACCCGTAAGCATCGATTTTTCTCAGTAAAAATTTCTCGCG
-CCAAAATTGTTTCTATTTTTTTCGGGAAAAATCGAAAATCTCCAAAACTT
-CGGTGGAGCGCACTTTCTGGACCACAATTTTTGAAGGGAAACATCACTTT
-CTGCGGTTTTCAATAAACGAACAAACATCAACAAGAAACGAGAGAGAGTT
-TTTGTTGACTTTCAAGAAAAAAATGGATATCGAATTTCTGTGCTCCATTT
-CCCTCTCCGGGAAATGGCGCGGGGAACGTGCAAACAATGCGAGTATGTCT
-AATGGCTCTCACGTAGATCGAGAAAGTGGAAAATTTGCTAGTATAGACAG
-TTTAAGGAGGCTCTTTTATTCTATTGGGGAACCGATTTGTTTATGTCTTG
-CCGTGGAGCGTAGTTACTGTAATTTTTTTGCAAACGTGCTCCATCGAACA
-GTAAAAAAATCAGTATGCATACTAGTATGTACCTTTAAATAGCTGTAACA
-CGAATTGCCTGTGAAAATAAAAATCTCGGCAAGTTCTCTCCATCGGATCA
-ATGTAGGGAATTTTGCTGTTTATAATGCAAACTCGCTCTAATAAACTACA
-ATTTTCGATCGGTATTTCATGCATTTCGACTGATTTTCGTTATTTTTTAT
-GTACGCTCTCTATTGAAACACGGGGCCCGAGAAAATATCCAAAATCTAGA
-GAGGTTGTATTGCTTAGGCTTAGCCGAAAACCTGTAAAGATTTTTTAAAA
-ATTGTTCAGCCTGCGATGGACGACTTTTTGTAAAACTTGGCCACCAACTT
-TTTTACGGTGCGGCTACATCGCATTTGGGTGACCTTTAATGTGTTCAGGG
-TGTCTAAACATGCACCCAAAAGAGAGTGTCATTTTTAACGCGAAACAGCA
-TCAATCCAAACGGGGCGACAAAAAATGAGAGAGAGAGAGAGAGCGGGCGC
-AATCTAATGTTTTATCAAGTGTCTCTTCTTCTCCTCCGACCTCGTTTGCA
-TCCCCCTAATTCATCATTCGTCGGTTTGTAATACAGAGAGAGGGACATAG
-TGAGTGAGAGGGAAAATTGAGGAGATTCAGAGAGTTAGAAAGAGAGAGTG
-AGAGGGAACTTCAACTTTTTTTTTCAAAAGTTTTGGTCGATGATTTTGAC
-ATTTGATAAAACTGAATGAGAGATGATGCTTAGATAAATGAAAATTGATG
-AGATGATATTTATAAATGCACTTGCGATGTTGTTTTACGTGCAAATTGCT
-GATTAGTCGAGAAGTTGTGATTTTCGTGTCGGGAATATTTCACTAGGAAC
-GCCCTTGCGCCTTTAAAATGTAAAGTAGCATAATTTATTTTCAGAAAATT
-TAAGCGTTGGAAAAATAAGTAGTGCGCAACATATTTGACTCCCAAAATGT
-TTTGTAGCGAAAACTACAGTAACTCTTTAAACGAATACTGTGGTTCTGGT
-GTCGAGTTACGGGCTGCCAAAATTCGAAAGTAAATTCATTTATAATCGAA
-CCCGTAAATCGACACAAGCGCTGCAGAAGTCATTCGAAGAATTACTGTTG
-TTTTCGCTACTAGATATTTTGCGCGTCAAACATGTTGCGCAGTACACATT
-CTCAGAATTTTGTGTTCCCGTGATATAACAATTCATTTTTCTGTCTATAA
-CCTCTTTCAATTATAAGAAACCATTTGCAGCGAAACACAAAAAATTTAGC
-CGATTTCTATTTCACCTATAAAATTCGCGTCAAATGGCCCGCGCTGTCAA
-GACAGTCATAAAACCAAATGTTATGCAAATGGCGTAAAATTCAACAGTGC
-CCGCCCGCATGGTCATTGATCGTTTAAGAAGAATGGAGGAGGGTGCGGGG
-AGCATCATTTCCTGAAATGAGCCCAGAAGCGAGAGATTAGAGAATTAGAG
-AAATGAGAGATCAATGAGGAGAGGGTGAAAGGTATGAACAATGAATAAGA
-AAGGGATGGAAATGATCACAGATGGAAATAGATGGAATAATGAAGTGCAT
-CGATGCACCATTTCAGATTTTTCGGGCTTTTCGCAGATAATTGAGGAATT
-ACATTTTTCGGGCTCCATCGATAATACCCTGCCGGACAACGCGTTGGAAA
-GTGTGTGTACTCCACACGGGCAAATACCTTTAGTTTTACAATGAAACCCG
-AGCCGCGACCCGACACGCAACGCGCCGTAAATCGACCCCAGCCGTGGCCG
-AACCAAAATGGCCTAATTCGTCAAACTTTTACATTCCAAAATATCAGGGA
-AACCAGAAGTGCGCGTTTCCTGTTGTCCGAAAAAAGATTACAACAAAAAA
-GAAGAAATGGAGCATTTGCGCTCCATCACACTCTCAGACAATTTCATTTT
-CCACATCCTATATATATTTTGGTTTTTCTGTCGTATTTTGTTTTAATTTA
-TTGGTATTTCGTTCAAAAATAATTATTTTGACTGTATTTTTGGTTGCATA
-CATGTAGAACTGCTGTTTTTTAAGATATTCTGCCCATTCAAGTTTTTCAG
-TGTAAAATTGATATATTTCATTCCAACTGAAAATGAGATCGAAACGATGG
-AAAACCTCGGATATTACTGATTATGGAAAGAAGAGAAAAGAATCGGAAAG
-TTGTGGATCAAGTTCACCGATTCTCGAAACACAGTCATCTGGCGGTGCGG
-AACTTGACGAAGTTACTGAGGATGAATATTCTAGTAATTCGAGCAGTAAT
-GAAACTAGCGACGAAGAGGAAAACTCAGAAGTACCAAATGTCTTATCTAT
-AACAGAAAGAGGTAAGAATTGCGTCTTCTAGTGATCATACTTTTCGCCAG
-ATTCCCTAATGTAATATATTTTGTTGTAGAGAAAAGTTGGCAAAAGTTAA
-CGGAAAACGATTTGGGACGAATTCGTTTCATCTTGAAGTACACTAGCAAT
-ACTAAAAAATGCGTGAACGAGTATTTTCAATATAATCATGGGCAAAACAA
-TGAAATTATGAAAAGTCTATTATTGGATACCGATGGAACTATGACTGCAA
-AGGCTTGTTCGGAATGTGCCTACGATTTGAATCAGTAAGTTACTCTCTCG
-ATTTATTCCCAAAATTAATATGTGCTTCAGGTGCCACTGCAAAAAACCGC
-TTCGCTTCATCAATGCTCCGTGTGGTTGGTTTGCTATTCAAAACTATAAA
-TAGTTCACTGTTTCCGTTCAGAGGTCATCAACCAAGTTCTTCATGTTGAA
-AATGCGGAGCCCACCAGGATCAACCATGTAATCGCAACACTCTTCCGGAA
-TCACATTGGCGAGATTTTGTTGGTCCACTCTATTTCTGTGCGAGAACTGT
-GATAAAACTAGTATTTTCAGCACAAAGGCTCGAACTGCGGAAGCTCGCGC
-ATCTGAAGAAGCTCAAATCAGGATTCAAATCCAAGACAACTCGAACGCAT
-TCCAAAGATCGTATCATAACGATCCACAACCTTCATCAGCCGAAGAACAT
-GAGGAAGATATCGTGGTGGATGGCTGAGTACGGAGCTCAAATGCCTTAAG
-GCGAAACAATTGGTTTTTTAATTTGCTGGTTATCATGTTAGATTTTGAAC
-GTGTTAGGTCTTTCAATTGTTTTTTTTTTTCGAAATGTTGTTGTTCTAAT
-AAATTTGTTTTATTTAATCAAACGTTTTTTAGTCTACTACGGGCGTGAAG
-CCAGATATCAGTGGTATCTTCTTATCAGAAGCTGAATCATTTCCGGTTGA
-CAATGTTTGAAGGACATAAGAAAGGCTGTGTTACTGATTTCGACCATTGA
-TTTGTTTATATATGGATATGTTCCACTGCCTTTTGGAAAGGCAGTATTCC
-CGGTATATATGGGCCTAATACGGAATCTAAAATAACCTGACACAAACCTG
-ACGTTGACCTGTTGCCGGCCCGCGGCGGCTTAGTGTCAACTTGACAGCGG
-GTCGCGATTTCACCTGCCAGTTGTTCTCCATTCAGCAGCCAGCGACCTGC
-TGGCAGGTTGCCACTAACCTGACGCGGTTTACCTGTGTTATCGGCGCGTG
-CATAGCTTAGTGGTTTCAGGAAATGATGCTAGTAATCAGAAGATCGGGGT
-TCGGGAAACGGCAGGGGCTTGAAGGTTAGGTTCTATGAAGCAGGGCGAAG
-GGTTGACAAGGAGAGGCAATAAGCAAGTAGTAGGGGTTCTCTAGAAAACA
-TTTTTGTCTTTAATATGCGTTTCCTACTGATTTATTATTGATATTTGGAT
-CCCCTTTTCTAGAAAAAAAAATCAGAATCAGCAGAAAAATTTGAGAAAAA
-GTCATAGCAAATCAGAGTTGGTCAGAGTAAATCAGAGCTAGTCATAGTAA
-ATCATAGCTAGTCAGAGAATATCAGAGTTAATCAGGGTAATAAGTAGACC
-TAGTCATAGTAAATCAGAGCTAGGCATAGTAAAGCGTGGTTACTCCGAGT
-AAAACCACACTTGCACCGAACTGCGGTTAGTGTGCTTTACCATTATGTAA
-CTCCGCTTTTTACTCTGAGTTAGTATGATATGGTTTGTCTGAGCTGTGGT
-TGGGCTTCGCGGGAAACTTGAATAATTCGAGACAAAATCTAATTTTAGCG
-AATTTTCTTTAATTTCTTTGAGGTTTCTACGACAGAACTCGAAAAATTTC
-GGGTTTTAATGTTTACACATTTTATTTAAAATTGAATAATCAACTGCGGG
-ACTCCTCGAAAATCACATGCTCATTTAAATTTTGAAGTTCAAACCTCAAA
-AAACGCGCAAAAACCAAATTCAGCTAGGATATCAAATTTATGATTGAAAT
-CTATATTTTGATGCGGTGTTTCTGAAGTTTTCGCGATAAAATCCGAATAA
-TAATTCCACGTACCGTATATTCTCTATCTAATTTCCAGGTCATTTTTTAA
-TGCAGCACTATTAGAGACTGTCGTACTACTGGAGACTGCAGCATTAATTT
-TCGAACGGCTACTGTCAATTATAGATCACTAGTATTTAGTCACAAAAGCT
-AATTTTTTAAGCAGAAATTCATAAAAATGTTTTCAATATTGCGAACTTTT
-GTAACAAAAAGACCCAGTAATTCAATTACTTTCGTAAATTATCAAAAAAT
-CATCAAAAATATACAAAAAAATACCAAAAAATATTGAAACTTTCAAGTGA
-CTCTTTCAATAGAAAATGGGGTGCAGCACTAATAGAGACTGCTGCACTAT
-TTTTCGGACCCTTTTTGAATGCAGCACTATTAGAGACTGCAGTATTTACT
-ACTGGAGATGCAGCACTAATAGAGAATATACGGTATATACGTAATATATT
-CTTGCAGAAAAAAGTACGATTATCAATGAAAAATAGCTGATAAGAGGCTT
-TTGTTTGAACTAACAGACGGAACGACTCCGGTTTAGTTCAAAAAATTCTA
-AAAACACGTTGTGTCAGGCTGTCTCATTGCGGTTTGATCTACGAAAAATG
-CGGGAATATTTTTCCAGAAAAATTGTGACGTCAGCACGCTCTTAACCATG
-CGAAACGAGATGAGATGTCTGCGTCTCTTTTCCCGCATTTTTCGAAGATC
-AAAACGAATGGGACTTTCTGACTCCACGTGTAAAAAGGGGTTACGACGGA
-CCCTGGCCTAGAAATTAGGCGTGAAAATTCTCGGGCACTGGATGTAGTGA
-ACGCCCGCGATGAAAAATTGGGGGAAAATTAGGCTTTCTTTGCGAGAAAG
-ATTAATTAAAAATGTTTTCCTTTGTCGAAAATAATTTTTAAAAAACACAC
-CACGTGTATTCAGCTCGACCAACGCCTCGAAAATTTTCAAAAAAGGCGGG
-AAAAATTAGTTGAATTCGCCAAGAGGAATTTCACCGCAGCGCGTGCAAAA
-ATTTCAGCATTTGCGCGTGACGGTGTTTGCACAAATTACACCGAATGGTC
-GAGCTGAAAACACGTGCACACTTTTAAATAAAACTAGAAAATAAATCCCA
-GGCCTGCAAATATTGCACACAAAACCGTAATCCCCTTCGCGCTAAACAAC
-ACGCGCAACGATGCTCCGCTTGGGGACAAGGAAAAATTAATTTAACTCGG
-GATTTTCATTAAAAAATTAGGTTTTTAGTTAATTTTTCGATGTTTTCACT
-GCGAAAAAGTGTTAAAATAACGATTTTTCAACCTATTTTCAATTAATCCG
-TGCAAAAAATCGTGTATTTCTCGAGTTTTGAAAGAAATTTATGAAAATCG
-GCATTTTTAATAATGGTTTTTCAAATAAAAATATAATTTTTCGGTGCAGA
-AAAGTCGTTGCTCGTACAGTTTTTTTAAAGCATTTTCACATCAAAATCCT
-CCATTTTTCCAGTAAATCGATATGGAGTGCGACGAGACAAAGCTGAGCGA
-CGGCGCAAGCGGCTGGGTGCCGAGTATCCCGACAGATATCGATTCAAAAG
-ACACACCGTTGCTCGATATATCTTCTCAGGCGATTTGGGCGCTTTCCAGT
-TGTAAAAGCGGTAAATTTTCCGACTTTCAAGGGAGAAAAGTGTAGAAAAA
-TCGAAATTACTTCTTAAAAATCTCGTAAAAATCGAATTCTTTCAGGATTC
-GGCATCGACGAGCTCCTATCCGACAGTGTTGAGAAATATTGGCAAAGCGA
-TGGCCCGCAGCCGCACACGATTCTTCTAGAATTCCAGAAAAAGACCGACG
-TGGCTATGATGATGTTCTATTTGGATTTTAAAAACGACGAGTCTTATACA
-CCGTCAAAGTTAGCATTTTTGGCTTTTTCAAACGAAAAAATACAATGAAA
-CACTGAATATCTAGTTTTTTTCTCAATTTTTGCCTAAAAAACGGCGATTT
-TTCACTAGCTTTTCAATTAAAATTTGAACAAAAAGTTTTTTAAAGGAAAA
-ACATGAATTTCTAGCTTTTTCAGAGGTTTTCTATTAAAAAATAGAGATTT
-TTGTGATATCTGACTGAAAAATTACCAAACTGTCGATTTTTTTAAACTAT
-TTTTCACTTAAAATCTGCAATTTTTTTTTTCGAGGAAACATGTGAATTTC
-AAGCTTTTTCAGAGATTTTCTATGAAAAAGGTTCGTGCCGAGACCCATGT
-GCTTTTAAACTTCAGAATTTTCCCAATTTTGAAATTAAAAAGAGAATGAA
-AATTGATTTTCATGGAAAAATGCGTTTTTGGCCCAAAACCTCCAAAAAGT
-ACAAATATAGGTCGACTTTCAACTGTTTTAGATCAATTTTTTTGCAGAAT
-TCAAGTAAAAATGGGTTCATCTCACCAGGATATATTTTTCCGTCAAACAC
-AAACATTCAACGAGCCCCAGGGATGGACATTTATCGATTTACGCGACAAA
-AATGGGAAACCGAATCGCGTTTTTTGGCTTCAAGTACAAGTTATTCAGAA
-TCATCAAAATGGGAGAGATACTCATATAAGGTAGAGGAATTGAGAATTTC
-AGAACGAAAATTGCCGAAAAAATGAAATTTTAGCGAATTTGAGTCGGAAA
-TTTCGAAATTTGATTGATTTTAAGCAAATTTCCAACTAAAATCTTGAAAA
-TTTGATCTTTTTAGATAAATTTTTTTTTAATTTTGTGCTTTTCAAAAAAC
-CTCAAAAAACAATTAAAAATTGAAGTAAAATTAATTTTTCAACAATTTTT
-GAAAGGCCGAATTTTTGATTGAAAATTTTCACAATTTGTCCATTTTGTGG
-TGGGGCTTATTCCGAAAAATCGTTGTTTTTTTTTTCAAAAAAGTTATAAA
-AACTTTAAAATTGCCATGTAAAATATGTTTATTCTCAGACCTCGTAGGCA
-CGAAGCAGGCGTAGGTCGCCTCGCAATAAATTTGAAAATCTCAAGAAAAA
-TCAATAAATTTGTGATTAATCAAAAAAATTTAATTTCCTGGTCCCAGCAC
-GAATGCTATTTTTCGAAAAAAAAAAAGAGGCGAGCCTAATATAGACCACG
-CCCACAAAATGGGCAAAAGTTTGATTTTTCAAAAAATCGAAACAAAAATT
-TTTCCAATTTTGTGAGATTTTAAAATTTCCGGTTTTTGGAAAATCGAAAA
-AAAATTTCTCGTTTTTTAATTTTCAAAAAAAATTGTGCCTAAAATTCAAA
-AAAAAAATCAATACTTTCTCAAAATTTCCAGAAAACAGTCCATTTTCCAG
-GCACGTTCGAGTCCTTGGACCCCAGCGATCTCGTGTCTCCACAACGAATC
-GAATATTCACCGGAGAACCACACGGACCGATTCCCGATAAAAATATCACT
-AATTTCGACGACGAGGATTTTGCCAATTTTATCGATCACTCACTTGTTCA
-CTTATCACTTCGTTAAATTTACCTCCAGTGATTCCAGATAATGAGCCAGT
-TTTGCATTGAAATTTAGTGCCAAAATATAGAAAATCGCATGATTTAACAT
-AAAATAGCGTTTCGAATTGAAACAATGGAAAAAAAGTGCTATGATGATTT
-TTTAACACTTTTAATTGTTCCAATTTGAAGTAAAATCTATTTTCAGATAA
-ATCAACTGATTTTCTATATTCTGCCACTAAAGCTTAAAAACTTGCCCTGC
-TGTCCTAACCTTCAAATTGTTCCCTGCAAATTTTATTATTCTTGTTTCAT
-ATTTTTGCGATTGCTTCGCGAGACCCAAACTCACACATTTACCTGTAAAA
-TATAATCGAATAATTATTTATATATTTTCTGTAAATTTCCTTAGTATACT
-ATAAATTTTCTGATCTCTCTTCAAAAATCGCTAGAAAAAATAAACAAATG
-TCGGTTTAAAAATTCCTGGTAATTTACCTTCTATAGAAAATTTTTCGAAA
-AAAAAACCGAAGAAATTCAGATGGAAATTCCCGATCCCGAACTGCCGGGA
-ATACCGATTGATCCGCAAGATTTGGAGATTCTAGACACGCCCACACGGTT
-TTACGAGAAGCTTTTAGTGCGTTTTTCGTGTCGGGACCCGGAAATTTGAC
-ATTTTTGGCGCGCGGCTTGTTAGACTCCAAACCTTTTCAAAGATTTTTTT
-TTCGAATTAAATAACATTCGTGCTTGGGCCCGGAAATTGAATTTTTGATT
-TGAAAACAATTTTTTTTGAGTCCAAAATTTTCAAAGTTTGTCCATTTTTG
-GCGCGTGGCCTAGTAGGATCCGCCCCTTCTAAATTTTTTTTGAGCAAGTT
-TTCTGAAGCATTGATTTCAAAAATTTTTTTTGGAAATTTCTGGTTTATTT
-TTCCGGTTTTTTTCCGAGTTGCTGTTTAAGTTTGGAGAAATTCCAGAATT
-TGTCAATTTTTGGGGCGTGGCTTTTTCAGTAAGCACAGTTTTTTTTTTTT
-GAAAAATTGAAATTTTCGCGGTGCGGTTCAAGAAAAACCACAAAAACTCA
-ATGATTTTTTAACGAAAATTTCAAATTTCTTGCAAGACCTACTGCAATTT
-CGATTTTTAGAAACTTTTTGAAAAAAATCCGAATTTTCTGATTTAGCCCC
-GCCCCAAAAATGGAAAGATTTCCGAAAATTCGAACCAAAAGTTCGCAAAA
-ACTTGAATTTCTCTCACACAGATTGACGCGCTAATTTGAATTTTTCCAAA
-AATAAGCCCCGCCCCAAAAATGGACAAATTTTAAAAATTTTGAACCAAAT
-AAATTCAATTTTTTTTCGCTTTTTTCCGTTTTCGAACAAAAAATTCTAAA
-AATATATGGTTCTAGGCGGGGCTCAGGCACCCATCTACCTACTTAAAAAT
-GCGTTAAATTTCAGGAATTAACTGCATCAACCGAACGGCGTCTCGCATTG
-TGTAGTCTGTATTTGGGCGAAGGAGATCTCGAAAAAAATCTGATCGCTGC
-GATCCGAGAAAGATCCGAAAAATCCGAGATTGAAGTGACGATTCTGTTGG
-ATTTTTTGCGCGGAACACGGACCAATTCAAGCGGCGAAAGTAGTGTAACA
-GTGCTGAAACCTATTTCGGAAAAGTCAAAAGTTGGTTTTTTTTGCAAAAA
-AAAATCGATAAATCGATAAAAACCGACAATTTTGAGAATTTTCATTTCAA
-ATTTGAGTCCCACATGCGCCTTTAAATATGGTGTACTGTAGTTTTAGCTC
-GAATGTTGAATTTCAAAAATTGAGAATAAAGAAATGTCGTGACGAGACCC
-ACAAATGTTTTGAAAAAAATTTTCAATTTCAAAAAAATGTAAAAAATTGG
-GAATTTCCCTCCAAAAGTTAAATTGGTTTAGTCACAAACTTTGAAATTTT
-GAAATAAAATTTTTTTCGGCTAAAAATAAGTATTTTTTAAAAACTATTTT
-GAAGAAAAAAAGTTAGGTCTCGCCACGATGTATCTTGTATATGTGTATCT
-AAATTGCCATGTCGTGACGAGACCCTCTCATATTTTACACTGCAACTTTT
-TCCTCACGAGGGACGAGGAAAAGTGGTTTCTAGGCCATGGCCGAGGGGCC
-GACAAGTTTCATCGGCCATTTATCTTGCTTTGTTTTCCGCCTGTTTTCTT
-TCGTTTTTCACAGCTTTTTCCCATTTTTTCTTATTAAAACTGATAAATAA
-ATATTTTTGCAGATGCCAAAACGATTTTCAAGTAAAAAAATCATGTATTC
-AGTGGGCAAGCAGCGGTGAAAGTGGGCATTGTAATATGATGGATTACGGG
-AATACAAAACCTAAACTTTTTCTGAAACATGATACATATGATGCTTAAAT
-GCTGAGACTACCTGATTTTCATAACGAGACCGCTGAAAAAGTTTTGAGGT
-TTTCAAAATTCAACTTTTTGTGCGAAAATCTCGACTTTTTCACCGAAAAA
-GTTGAATTTTGGAAACCTCAAAACTTTTTCAGCGGTCTTGATATGAAAAT
-CAGGTAGCTTCAGCATCTAAGCAGCATATGTATCATGTTAAAGAAAAAGT
-TTAGGTTTTGTATTCCTGTAATCCATCATATTACATTGCCCACTTTCACC
-GCTGCTTGCCCACTGAATACATAATTTTTTCACTTGGAAATTGTTTTAGC
-ATCTGCAAAAAATATTTATTTATCAGTTTTATTAAGAAAAAACGAAAAAA
-ATCAGTGAAAAACGAAAGAAGACAGGCGGAAAACAATACAAGATAAATGG
-CCGCTGAAACTTATCGGCCCCTCGGCCATGGCCTAGAAATCACTTTTCCT
-CGTCCCTCGTGAGGAAAAAGTTGCAGTGATTTTGCTCAAATAAAAAAATC
-CCCCAAAAACCGATAATTTCACCATTTATCAGATATATCTCTTCCACACA
-CCGGAGCTTAGTGGCTTAGTAAAACGAGTTCTTCCACAGCGAGCCGACGA
-GATTATCGGTCTCCAGCACATGAAATTATACATTTTTGATGACAATGTAT
-TGATTAGTGGGTTAGTTTTTTGTTTGCATGGGTCAGACTACAAACTACAA
-AAAGCCTAATTTCAGAGCAAATTTGTCGGATTCTTATTTTACTAATCGAA
-CGGATCGATATTTTCTATTCAGAAATTGCAAACCATTGGCAGATTTCTTC
-CACGAAATTATCAATGTTGTTGGTGAGTTGGCGATTGCGCTCCACCGCAC
-ACACTGTTCAATGGGGCTCGCTTGAACTGATAATTTTTTCTAAAAAATTA
-CAAAAATTGTTTTAATTTGCCTTCAAAAAACCATCAGTTAATTAAAATTT
-TCTAAGCAAAAAATTATATACTTTCTAAAAAAATTGAATTTCCCGCGAAA
-ATAATTTTTTCTGAGAAAATTTGAATTTTTCACCAAAATATTTTTTTCAA
-CATTTTTTACCACAAAATGAGGCGGGGCCTCGGTATACACGCTCAAAAAA
-TCAAAAAATACTTGTAAATTTGACTACCAGCTATTTTTTTTTCGAAAAAA
-AAATCGAAAAGTAGGCCAGTTTTCGAAAAATTCTCGACAAAAATTCCGAA
-AAATGGGGCGGAGACCTGTGCGGTATTCGGCATTCGGCATATGCCGATGC
-CGGTTTTTGGAGCCCGTCATATGCCGTTATGCCGATTTGAAAATTCACGG
-CATATGCCGAAAATGCCGTTATGCCGAAAAATCCCGAATGCCGCACAAGT
-CTGGGCGGGACTTCAAAAACCACGCCCACAACAGAGAACAAAAATTTGGA
-GTGATGGTTTGCAATTCCCTCGCGCACTTTTTCTTGTTTTTTTTCAAAAA
-GATGAAAAAGCGCTCTACTGTACACGTTTTTTTTCGAATATTTTCATTAA
-AAATCCAATTTTCAGCCGACTCGAGCTTCATTGTCGAAAATGAGCAACTG
-GTGCCGAGCCCAAAATGTGATGTGCACCCATATTTAGGTAATCTGAAAGG
-ATGGGTAACCTGAAATTTTTCCAAAAAAATTTTTTTTAAGGCTCCGCTCA
-TCTCTACCGAGAAATGCTCAAAACACGTGTGAATCGAGTTATCGAAAAAT
-ACAAAGAATCGCGAAAAACGTCGTCGAATTGCATGTCTGCTGACACGTGG
-ATTTACCCCGTTTTACAAATGGGGCTTTTGGGAATTCATCAGGAGTTTGA
-ATTTTTGCAAAAACTTTTCTCACTGAAAAATCCGGAGCTCAAAATGACGA
-TGGCTTCGGGATATTTCAATTTTATTCGAGATTATGAGGAATCGATTCTG
-AAAGAAGGAGATTATCATTTGGATATTCTTACAGCTTCTCCTTTTGTAAG
-ATTTTTTTTGAGGGAAAAATATCTGAAATAAGTTCAAAAATTTCAAAATT
-GAATTTTTTCGAAATTTTTGTAGGAAATTTTGGTTAAAAAAAGTTTTCTC
-GAGAAATTTGAATTTCCCGCCAAATTTTTTCTGTGAAAATTTGATTTTCC
-CCTCAAACATGTTTTCTCATAAAATTTGAATTTCCCGTCAAAATGTTTCT
-GAGGAAGTTTGATTTTCTCATCAAAATTTTTCAAAATTTCCAGGCGAACG
-GATTCTTCGAATCAAATGGCTTCTCGAAATATATTCCACCACTATATTCC
-AACATTTCTGATCAATTTCTTCGAAAACGAGAAATCAACGGCCGATTGAA
-TGTAAAAATGTTCGAATATCGAAGAGAAGAATGGACATTTCATGCAAAAG
-GTCTTTGGGCAGAACATAATAATCAATTAATGACATTAATTGGCTCATCA
-AATTACGGTTATCGATCGGTTCATCGAGATCTTGAAGCTCAAGTGATGGT
-TGTTACAAGAAATCCGACACTTATCGATCGATTGAAAGATGAGAAAAATC
-TATTATTCGAATATTCATCGATACTTGACATGGCTGCACTTCAACAACCG
-GAACATCATATTCCACCATTAGTTCGAGTTATTTCACGTCTTATTCGGAG
-TTTTTTGTAGACGTTTTCCAATTTTTTATAGCGGAATAATAAGGTTTTTG
-ACTTTAATAAATCTTTGTAGATTTCAGTTTTTTTGAAATGCAACATTTTG
-CCGAATTAGGCCATTTGACAATTTTTGGTCGTGTCACGGCGCGGTTTGCA
-GTAGAAAACTAAATGTATTTTGATTTGTTTTTTCGAAATATCCGAAAAAC
-AACAAAAAAATCTGTTTTTTGTTGAAAAAAATGTTGCGAATTTCAGAAAA
-CGGCACTTTTCCGATTTCTGCCCCCTAGGGCTGTTATGAGGGACGTCCCC
-TATTGGGGGGCGGGGACGATCATTTGTCCCCCCATGGGGGACGGGGGCTC
-GTCCCCGTCCCCACGTCGGGGGACGGGGAGCGCCCCTTGTCCCCGATGGA
-ACGAAAAGTCGTCCCCTTTTAATTTTTGATTTATTTTAGATTTTCACTTC
-ATTTATTACCGGTACAGAGAGTGTAGATAGTTAGAGAGTGCCAGACATCC
-GGGACCCAATGGAGCGGGGCGCGCGGAAGAGACGATTAGTGTCGATTTAC
-GAAATTTTCCTCGTTGTCATCATTTCGTAAATCGACACAAATCGTCTCTT
-CCGCTTGGGTCCCGGATGTCTGGCACTCTAACTATCTACACTCTCTGTAC
-CGATAATAAAATATTTTTACGTGAATCTCGTTTCCACTAAGATGTGCGGG
-TGGATACCGTGGATATTCCACACAAAAAACGTGTCGCTTTAATAATTATG
-AAGCAAAATACAAACGCACATTCTTCACATTGGGTAAAGGGGGCGCGCTC
-CCCCTTTACCCGGGCGCCCCTTTTCGGGGGGGGGGGGGGGGCGTATTACG
-GGAGGTTTTTTGAAAAATAATTTTTGAAATTTGTCAACTGTCGACAGCTG
-TCGTTCAATTAATGTTTTTTTTTCAAATCTCCATACAAAAATGTTCATAG
-TAAATTCTTTATCAATATTGGGGTCCCTCACAAAGTTCAAGTTTTCTTCT
-CACTCTTCACGGCCGCCTTCGATTTTTTCTTAAGACCTTCATTTGCATCA
-AAATACATTCGACAAATTTGAGTCACATAAGCATCATCATGTGCGTTTGC
-CTGCAAATGTTAACAAAGTACCAGGCGGATGCCAAGCTTTCACGTCTTCA
-TGTCTACGTAGAAAATGCAGTCATGAAGTAGGCACGCAGACAGACAGGCA
-AGTACATAATCAGGCAATAAATGGGCAAGTAGGCAAAGCAGGCATGAAAT
-AGGCGCTTAGGCACGTGGGTAGGCAGGTATGAGACATAGGCAAACATGCA
-GGCAGGTATGAAAAGCGAGAAAAGGCAGGTGAGCATGATGAAGGCACATA
-GGCAGGTAGGCAAGGAAGCTCCTAGACAGGTACAAAATAGATGTGCGCAA
-AGTAGGCATGTGCAAAGAAACTAAGCTCGTCGCCAGGCATGAGGTAAGCG
-CATAGGCTTGCAAGTAGGCGAGTAAACACGCGGGCATCGAATAGGCAATT
-AGGCAGGTATTTTTGTGCTCCATTTGGAAACACACTTACTGGATAGAAAA
-GAGTGAGAGTCGTGTAAAATGCAAATGCCAAATAAATTGGATCCGGTGCA
-GCACATTTTCTCTTTGATCTCGTTTGTTCAATCAGACTCCGATAATTGAT
-TTCTCCAGTTTCACTTGTATTGATCGCTTGGAAGAGGCTCTCGATGACTG
-AAAAATGCTCAGAAATTTCGGATATGTTCTCGATTTTCAGTGAATTTTTC
-CTGAGAAAAAGCTAAAAACTCACGAACAAACGCTGCCGATCGTCCACCAC
-CAGTATTGCATACGACAAAAACCGGTCTCTCGCTGTCTGTCACTAGTTTC
-AACAAATACCTAATCTCCTCGGCATCTTTCGGTCCCATATGCTCCGGCCA
-TCCGGTATACTGGTAATGAGTCACCTCTTGAGTACGCTTCTTTCTGGAAA
-AAAGTTTGTTGCAGGCTACCTTTTATGCCTGCATGGAAAAAAATAGTAGG
-CGGACAGGCGTGAGGAAGGTTAGAATATTGATGAGAAAAATTGAAAACAA
-TCATTTCAAAAAGCAAAGAATTGACCGGTTATTATTAAAAAATAAAAATT
-TTTATCCGGACAATCCGATGCAGATGTGAGTGCCTGCCTACCGGCGTGCC
-ACCGCGCCTATTTCATGCCTGCGTGCCTATACTTACCCAAATGTTAGCAA
-CAATTGTCTAGTCTTCAACAAAGGCTTCGAGATACTCTTCGTGCAAGTGA
-TTGTTAAGTCCGCCAAAATTAGTTTTTCGTCGAGTTCAGTGGGAAAGTAC
-CTATCACAGTTCACCTTATTAGCTCCAATAAAGTGATCTGAAAAATAAAT
-GGATTAAAAACGGAGGGTGGCTTGATAGACAGGCAGGCAGGACTACTGCC
-CTGTGTAGGCCGTCTTGTAGACAAGCAGACAGGAGTGGGTCACCATGTAG
-GCAGACGGGAGGGTGTAGGTTGTCTAGTGGGCAGGCAGGCGTAGGCTGCT
-GCCAAGCAGATATAGGCTCACCTATTTCCGCGAAATCGCACAACATCACA
-ATTGTGCTTGGTTTATTCAGCTTCACTGACTCCCAAAATGCGGCAATCGC
-CAAAATATCGGAGCTTTTCTTATCAACAGGCAACTGCGGAGCAGGCATCA
-ACACAAACTTCAAGCCGTTATCCAATTCAACAACATGTGATGATTCTCCC
-TGGCTGAAAATGAAGATTTTTTGGTAGGTACCCATAATTTTGCCTACCTG
-TCTACCTATGTGCGCTTGAGTTAAAGGTTAAACCTAAGCCTATGCCTAAA
-CCTGAGCCTAAGCTGAAGCCTAAGCTTAAGGTTAAGTGTAAGCGTAAGCG
-TAAACCTAAGCAATATGTAGAGGCGAAAGGTAGGCAGGCAGGCGTAACAG
-TCTTACCCATTCTTTTTCGAAGACTCATATGACACCGGATCACATTGACA
-GTGATTACCTCCCTGTAAGCCGCAAAACTGGGCAAAATCGTCTCCCGTAA
-TTTCTAGGTTATTTGGAACATTCTCAAATACTGAAGTACAATTTCTTTTT
-CTAGTAACGAAATCCGAAATTTGCGTGTTGAATGTCTTGAGGAAGTTTGA
-AAAACGTGTCTCATTCACATCCACACGACTGATCATCTGATTTGGCGGGT
-ACAGTTTCTCTTTTTCTTCCGAGTCGAGTATTTTGTAGCCGTTCGGGGTT
-AAGCAAAAGTAAGCAATTATTGCACAAATTATGACAATGACGATCAGAGC
-CAAAATTACATATTGTCCGTGTGTTCTGGGATTTTGGAAATTTTTAGTGA
-AGCTTCTAGGCTTTAGCTTATGCTTAGGCATAGGCTTAGGCTTCGGCTTA
-GGATTAGGCCTAAACACAGGAGCATATAGGTTGGCAGGCAGGCAAAATTA
-GAGGTACCCGCCAAATATCTAGAAGCTTCACTAAAAAAAAAACGTTTTGA
-ATTTAGCATGAAAACAATTTTGAAAAAGTAAAATGTTTTCTTATCTCAAT
-TTTTTCCTTGATTTTATATTGTAATTAAAAATAATAATTTGAATTTTCAG
-CTCGATTTAGATAGAGTTGTGCTAGATTTCAAGAAGAAATTGAGAATTTT
-CGTAAAAAATATTTTTAACGCGAAAAAATTTTTAAAGCTTTAATCCAAAT
-TGTTCAAAAAAGTTTGGAGTAAAAAATTTGGAATTTTTTTGATTTTCACC
-CGAAAACCTTTCTTTAGAATGTCTGCCTCTTGCCTCCATCCGCGCCTTAT
-GCTCAATCCGCGCCTTATGATTTTTCTCCGGGAACTTGAGACGATTTGGT
-TGTTGGGAGAAGAAGTGCGGAATGTGGAGCGTTTGTTGAGAAAAGATAAA
-ATTTGGAATTTTTTTGATTTTCACCCGAAAACCTTTCTTTAGAATGTCTG
-CCTCTTGCCTCAATCCGCCTTATGATTTTTCTCCGGGAACTTGAGACGAT
-TTGGTTGTTGGGAGAAGAAGTGCGGAATGTGGAGCGTTTGTTGAGAAAAG
-ATAGATTTTCTACTATTTCTCAATTATTCAATACTATCGAACGACTTGAT
-GTCCAGTCTTTGAATGTTCTTGTCGAGGAGGCGAAGGTTATTGGTAAGTG
-TATGCGTGGCTTTCCGATGAATTACCAACGGCACGGAAAGCCTGAGTGTA
-CCCTTTCGATTTCATCTTCGGAAAGTGTGCTAAGCGTAGGCGCGTTAAGC
-TAATTTTTCCTGGTAAATCCGCAATTCTTGAAGATCGAACCAATAGGGAA
-CACTGTGGCACCACGTGCAACTTCAGGGGTAGGCGGCAAACACAACGGAA
-ATTTATCGATTTGCCCAATTTGCCAGAAATTTCGGTTTCCGAAATTTTGT
-CGATGCATTAAGGGTTTGATAATAAAATCGAGTTTGGGAATTAGCGTTTT
-TCAAAAATTGTCGAATACCTTCAGAATTTTGGTTTCCGAAAGTTTGTCTA
-AAAATGCAGGGGTAGGCGGCAACTGCCGTTTGGCATATTTATTTTTGGCG
-AATTCACCAAATTCCCGTGAAACATGCGTGAACTTTCTTCTCGTTTCTTA
-ATTAGTTTTTCATCAAATTGATAAAAATGAGAAAATTATAAATTTGTAAA
-TTCACTTCAAAATGCAGGCGGGCAGGTTTCAGTCAAGCCCTGAAACCGCG
-CCTGTCTACCATGGAAGCCCTACTTTCAAATAAGATCAACTCACTGTGGT
-GGTGGACCATTCTTTTCAGAATTTCCAAGATCTGGCGGTGGGAGAATTGC
-AGTCGGCAGAGGCTTGAATAAATTTGAAAAAAACAAGTCAAGAGCAGCAA
-GAGCCTTTTTCGGTTCATCAAGTCTGTTTTGAAAACTTGAAAACTCCAGT
-CCACCATCATCCAAGCTCTTCAGAGCATCCTGAACTTCACCGAGCGACTT
-CTTATTGCCAACATCCTTCACAAGTTCTACCAGTTTTTCCAACGATTTTT
-CCAAGCCCATAAGACCACCAAGATTAGCCCAATCAACCTTCTTAGCTTCC
-GTGAAAACATAACCATAGTCTACAAATTTTGTGGAATCAGACTTTTTAAT
-TCCACTCTTCCATGCATCTAGCTGAACAAACATCACATCCAAAGATGCTC
-CAAGCGCCACCAGCTTCTCCAGATTATCCTTATCGTCCTGTGCCAAAGTG
-GCTCCACTCGCTGCCAACTCTCGTTGCACAATTTGTGCATGGTTCTTGAT
-AATATCCACATTTGCTCTTTCTCGGAGCACGTCCTCCAGTCGAGCAATTT
-CTTGTGCCGCTGGGCCAATGGAATTAGTGTGTTCAGCGGCGTTTGGAAAC
-TGGGATGTTTTATCCGAAGCAAATTTGCGGCGCTTGCTAAAGTACAGCGC
-CAGAGATTTCAGACCACTATTGAGGCTTGAAACTGAGATCAGAGCATCTT
-CGACGGCAGTGACTATCGGCGGGAATTTTTGATCTGCTCGGAACGAATTC
-AAATCTGACAGGTTCTTTTGAATTTTGTCCAATTCTTTGTTGGATTGAAG
-ACAGCTCAGTACGTCGAGAAATTGAGCAATATCAGATCGAGAGTCATTGA
-TTTTTTCAATAGCACGTTTTTCTAGTGTTTTCAAAAGATTCGGATTCAAG
-AAAGTAGCGTTTGCCGTCATTCTACTCATGGTCAGCGACAAGCCGGTCAT
-TTTTTTCACTCCATTAAAGCATGGCTCAGCGGTTGTCCAATTGCTATTGT
-TCATATCCTTGCAAACAGTGAGCACTTCTGCGTGTCCTGATTTGCTTTCA
-ACAAGTTGATTCATCACACTTTTCAATATCGATTTCGATTGTTCCAATTC
-GGTGTCAATGTTCGATGCAATTTTAGATAGTTCCTCCAGATTCGTGAAGT
-CGGGGGCGGTAGTTAGAGTAGATTTGGCGCATTGGGCTGAAAGTTTATTT
-TTATTTTCGTTTTTTTGAGTTTGAACTTTTGTGGACAACCGACAGATTGG
-CTCAAACTAAAAGGACTCTAAAATATACAAATTTTGGAACTCAAATCAAT
-TTCGCAAATATTACTTTTTTCTACGGAGCTTTGATCAGGGTGGGGTGGCA
-AACGATTTTTTTCCAGCAAACGGTAAATCGGCAAACCGGCATTTTGCCGA
-TTTTCCAAAATGGCCGAAAATTTTTGAATCCCTCCCTCTAAACACTTCCG
-GCAAATTGTTATCCAGCAAACTACAATTCGGCAAATTGCCTGAATTAAAA
-ATTTCCGCCCAATCGGCAAATTGCAGTAACTGCAAATTTCCGATAAATTT
-GGAGAAACCGGCAAATCGCCGAAAATTTTTGGTAACTGGAAAAAATTTCA
-AAAGGCACTGTACCCGTGCTTCCGTTTTTTAAAAAATGCTTCTAAACAGT
-TCCGGCATATTGATATCCGGCAAACGGCAAATCAGCAGTTTGGCTAAAAT
-AAAAATATCCGGCGAATCAGCAAATTGCTGGAATTAAAAAGTTCCTCCAA
-ATCGGCAAAACCGGGAATTTGGTGAATTCGCCAAAAATAAATATGCCAAA
-CGGCAGTTGCCGCCTACCCCTGCATTTTTAGACAAACTTTCGGAAACCAA
-AATTCTGAAGGTATTCGACAATTTTTGAAAAACGCTAATTCCCAAACTCG
-ATTTTATTATCAAACACTTAATGCATCGACAAAATTTCGGAAACCGAAAT
-TTCTGGCAAATTGGGCAAATCGATAAATTTCCGTTGTGTTTGCCGCCTAC
-CCCTGAAGTTGCACGTGGTGCCACAGTGTTCCCTATTGGTTCGATCTTCA
-AGAATTGCGGATTTACCAGGAAAAATTAGCTTAACGCGCCTACGCTTAGC
-ACACTTTCCGAAGATGAAATCGAAAGGGTACACTCAGGCTTTCCGTGCCG
-TTGGTAATTCATCGGAAAGCCACGCATACACTTACCAATAACCTTCGCCT
-CATCGACAAGAACATTCAAAGACTGGATATCAAGTCGTTCGATAGTATTG
-AATAATTGAGAAATAGTAGAAAATCTATCTTTTCTCAACAAACGCTCCAC
-ATTCCGCACTTCTTCTCCCAACAACCAAATCGTCTCAAGTTCCCGGAGAA
-AAATCATGTGATCAGTAGTTTCTCGGGCCCAAGCGTCGGTTGCCAATTGA
-GAGTTTAGTGCTCCAATATCAATTGCTCCATTCGGTAGACCAACTGTGTA
-CTTCTTGGTTCGCAGGGACTGCCCGATGGATTCGATGGTTTGAAGATGGA
-TCTTCGATTCTTGATTTGGAAATGCATTCCGGATAGATGCCATGTGTTCT
-TCTAGCTTTCTTAGTCCCCGATTGATGTCTACAATCTTGAAGGATGAAAT
-AAAGTTCATCACATCACGAACTTTTGGCCATAATACAAAGAAAGAAGCAG
-CAGAATTATTGTTTTTGAAGCCATGCAACGTAATCTTCGGATTCTCCACT
-ATGTTCAAAAAATCTTGGGATTTTTTCAACAAATCGTTTAACGCAGAATG
-GGATTTGGGAATATCGGTGAAACTAGTGAACGCTTCAATCTCTGTGTACG
-AGTTGCTCCATACTGATAGCTTTTCGGAAAGGGTTGTAACTGATGAAAAA
-CTGTCTGTAATGTCTTTCATGTCTGCCTTGAAATTAGTCTCGTCTGGCCA
-CTTCTTGAGATCTCCAATATCATGAGCCACGTGGACAACACTTTTGACAG
-TTGTGAAGAATTGATCTGCCTCAACATCGTCGCCGATATTCGATTGTAGT
-TCTATAAAGGTATAGTTTTTGGGGGCAAAAAACGAAAGTGGTTCAAAATT
-TTGGAACAAAATGCCTATTTTTAGATAGCTAAAATCTAAAATTTTGCAAT
-GCTGACAAGTTGTGAAAATTTGAAATTTTAACAGAAAATAGGCTTTTTCC
-TAAACTTTGAATCACCTTACTTTTTTTTTGAAATTTTCGAAACTTTTCGG
-TTATTTCCAAAAAAAAGCCGCAAATACTCTATCAGGGGTAGGCGGGAATT
-GCAGTTCGGCAAATGTATTTTCTGCAAATTCGGCAAATCGGGATGTGTAC
-AATTTTGTCGTCTCTGGCAGTTTACCGACTTGCCCATTTACCGAAAATTT
-TAATTCCGGCAAATTGTCCATACTCTATTACTACCATAGGCCCTTATATA
-ATCTTTTTCCGCCCACCCCTGTACTCTATTACCACCTAATCTGTTACTAC
-AGTGGATTTTTTGAAACCAAAATTTCAGCTTTTGAATTTTATATTCGTAG
-TGAAAAGATATTCGTAGTGAAAAGTTGAAACCTGGAAAACATAGTTGCAT
-AATTGCATCGTAATATGTAAAAATAGGTCTTCCATGGTAGATAGGCGCGG
-TTTCAGGGCCTGCCTGGAACCTGCCTGCCCTATGTGAACGAGTAGACTGT
-AGTTTTAAAAAACAAAAAAAGGTATTTGCCTAACAAAAAACATACTCAAA
-TATTTGAATGTTTGCAACCAAACCTTTAAGCGCTATCAGTTTAGATTCCA
-GCGAACTGTAGTCAATTGCATTCAGTTGATCCATTGAGAAATCGTATTTG
-AACAAATCCAAAGTTAAATTCATTGATGGAATGGTTCCTTTTGTCAATTC
-TTGTTGTAGGTACATTGCATTGATCAATCGTGAGGCGAATTGTAATCGCT
-CAACGGCAGTTATCAAGTTGTCATCTGCAACTTTTATGAATGATTTTTTT
-AAAAAGTTATTTGTTGTCATTTTTCTTTTATTAATTATTACGTATATTAT
-ACGTATCATGCGAGTTTAGCTTTCCAACCCCCCGCGAACTCTTTTTACTT
-TTTTTTTTTTTAACTTTTGTCTTTTTTGTCCTTTCTTGGCTATTTTTTTT
-ATGAGAATTGACCCGAATTTGACTTTTTTCGGATTTTTAGGAATTTCTAG
-GAATTTTTCTTTTTTGTCAAAGCGAGCTAACGCTCGCCACTGACGCCAAG
-CCTAACATAAGACTTAACCTAAGTCTTAGCCTAAGCCTTACAAGGAAAGT
-CTTTGAAGGGGCCTGTAGATTTGGGTTTCTCATGTTGATATTCCGATAGA
-AGAGTGTTAGTTTTGATCTCTCCAAAAAATTTAGCTGCCCAAGCCAAGTT
-TCAGCAAAGTAATGACATTTTGAAATTTCAGTTAAAAACACCATTGAAAT
-ACACTGTCTTACAGTGCTATCCACACAAATATCAGCTTGCGTGAACACCG
-AAAATGTGACGCCCACCACAATAGGCTGAAGACAGTGGATTTCAATGGTG
-TTTTTAACTGAAATTTCAAAATGTCATAACTTTGCTGAAACTTGACTTGG
-GCAGCTAAATTGTTTGGAGAGATCAAAACTAACACTCTTCTATCGGAATA
-TCAACATGAGAACCCCAAATCTACGGGCCGCTTTAAAGACTTCCCTTGTT
-AGCCTAAGCCTATGCAAGACACGCAAAATATACATTAACATATATATACA
-ACAAATACAACGTAAAAATTGTTTTTCTGTAATTCGACTGACAAACCTTT
-AGCTTCACGTTTGGAACGTGGATCTAATGACATCACATTAAAGAAACTGG
-ATTCTTCTGGAACAAAATATATTGAAATTAAAGCTCTGAAACAGTCAAGA
-AACCTTCGAAAGTATCCGAATTGACAACACGATTAACCGTTATAATTATC
-AAAACGATTATTATTTTGATTCCTGGAAGACAGAAGAAATTCGGAACGAA
-AATAAAAATCAACCTACTCATTGCAAAGTATTATGAAACTTCCCTTTGAT
-CGACGGTTTTTGAATCAATTAATGATTGGAAGTGTGAATTCTGAGAGAAG
-GAGTGTTGGAATTTTTATTTATTTTATAACGAAAAGGTCACGGTTTCTGT
-AATTTTAATTTCTATGAAAGTTTTAGGGACTCACAGAATGTCAAACACTA
-GATGGCCGAAGAAAATTTGACATAAGCAGCGAAATTTGACCTTTCAAAAA
-AAAATTAATATTACGTGAAATCTTTTTTTTTCCAATGGAATTGAATTTTT
-GGCTGATACATGAGGGAATGTGTTTCAAGCTGTAATTTCAGTAAAACTGT
-ACAAGAAAAAACGTTCAATATTTTTACCTTTGCTTATAACTCCTCTACAA
-AATTTTTTCGGACAAAAAAATAAAACAAGCATGGAGATTACAGGTGAATT
-TCGAATCCTCATCTTCATTTTTCAGACTGAAAATCCAAGAAAAGTAGCCC
-GAACTTTTTTCTGAAAAAGTTCCTATATACTCATCAAACATTCATAAACA
-GTATTTAAACAAAAAATCCCGAGATAACACTTTTGTCTTCAAGATATTCA
-GGTTGAAAACTAATGTCCTGAAACTTGGATTTTGGGTCCTTAAGAAGATA
-AAACAGATAATTAGCTTTTACGTTAATACCCGCAATCATTTGCAAATTAG
-AGCAAAATTAAATTGAAACTTTTTTTTGGATTTAAACATTTTTTGGAGCC
-GAAATACAAGTTTCAGGACACTAGTTTTCAACCTGAATATCTTGAAGACA
-AAAGTGTTATCTTGGGATTTTTTGTTTAAATACTGTTTATGAATGTTTGA
-TGAGTATTTAGGAACTTTTTCAGAAAAAAGTTCGGGCTACTTTTCTCGGA
-ATTTCAGTCTGAAAATGTATGATTTTTTAATTCAAAATTTGAGGGAATGT
-CGTTCATTGTGGCTCGAGGTCAATGGATAAATGGCTAAGACTAAAACATC
-ATTGATCGAAGAATGATTTTTTATTCATAAAAACTATATATTTGACCTGA
-AATCATTGTTTTTTGTCACTATAACCCATTGGAATGAGCTGTAGAAATTA
-ATTAAATTTAGAAATGATTTTACCGATACGTGGCAATGTTTAATACATTA
-GTTTTCTGGCCGAAGATTTGTATGTTTTCCCGAGAAAGTGAAGCGACAGC
-TTAAAAGCGCATCGCCTTTAGTGAGAGGCAGGTCTCGACGCGACGACATC
-TTTCCTCGCGCGCAGCGGCGAGATTTCGTCATTCTACGTGTTGGTAAAGA
-AAAAGGACGTGATTTTATCGATTTGCATCGATTTTTTTTGGATTTTTCTT
-TGTTTTTATTGTATTTTTATCGAATTTTTAGTAGTTTTAAGGTTTTTTAT
-CGATTTTCCTTGATTCCGTTGCGTTTTTAAGCGTTTTTCTCGTTCGTAAT
-GATAAAAAGGGGGTTATTTCTCCGTTTTCCAAGAGTTATCTGCGCGTATG
-CCAGATTTTGCAGGAGGAATCATCAAAATTCTCAGTTTTTGGCATGTAAT
-CCTTACGAAGAGTACTTTCTGAGGCTCAATGGCTTTTTCCCCCGCTGTTA
-GGTGCTTCAGTAAGTGTTCTACTCCTTTCAGGGGTTCCTTCTCTCGTCTA
-GGAGATTAAATATGTTCGCATTTGTTTCTTCCCTCTCTCTTACGCGCTCT
-TTCCAGCATTGTTAGTTTATCCACGCTCTTTTCCTCTGTAATTTTTCGTT
-TATCACTTTCTCTAATTTTTCGGTTTCCGGTTCGTGCACTCGCGCACCCT
-CTCCCTATTTTACTCTATCTCTCACTATCTCTCACATCTATCTCTATCTC
-TCACAAGCTATTTTGGTATTTTGCGCGTTAAGAAGTCATGTTTTGATGGA
-CCGTGTCCAAAGGAAGAATATTTTCGTCGAGTGAAAGGTATGTAACTTCG
-TGTGAAGTCGACTCCATGAGTCTTGTGAATATTCCGATAACGTTTTATCG
-AGATGTATTATCGGGCGGCCCGAATTTTATGTATGTTTTTCATTGTGGTT
-ACCATGTAACGGGAGTTCACATCGCAGAAAGAGCAATTCTTTATCGCGAA
-AGTACGATTTCAGGCCCCGGAAGGCTTTCTTATCAGTTTAATGCGACATC
-TTTCGTCGGGTGAGATATATTGTCTTGCGTTTCTATCGCATTTCATTGGA
-CCGGTCGAGCCAGGTCTGAGTGTTTATGAGTACGAGTCGACTCCGTGAGT
-CTCAATGATTTTCCGTTTTCAGGCGGTTTTCAAGGTTTCCCGTTCTTGGT
-TTCTGCTTCATCTTCTACTACCGTTTTAAGTAGGATTGGCTCAAGTCTAC
-GGAAGAGTAGAGCAAGCCTACGAAGAAGGTCTTCGAAAGAGTAGCGCAAG
-TTTACGGAGGATTCACGCAGGTCTACGGAAGAGTGGAGCAGGTATACGTT
-AGAGTGGCACTAGACCATACTGGGAGTCCGATTTCCAATTGGATTCTCGA
-AAAACCTTGTACCTGCACAAATAACCAGACGAGCCGATATATCTACCTTA
-CCGAGCTCCGGGTTAATCGTCGTCAAGTATTTCAGGATGAAGCGTATAAG
-GCGATGATTTTCTTTAGCTATGCCGCGCGTTTTGCAATTGCATAGCTGTG
-TATTCCGTGTAGACTTTATCGCTCACTTGTTCGATTTTCAGGACATCCGG
-TTCGACCTTTTTTCTTTCTCCCGCTATCGACGACGCAGATCACGTATGAG
-TTGCTTTTATATACGGCGATCGATTGGTCCGGTATACGTAAAATTAGCTC
-TATATTTTATCGCTTTCGTTGCTCACGCGATTCCCAGGTATTTTAATGTC
-GAATCATATTCCGTCACCTACCACTACGTAGGAGATATGCAGGGCTATGT
-GAGAATAACTCAGGTTTCGTAAGAGTTTCTCAAGACTAGGGAGGATATTC
-GCAGGTTGTTGAGTAATTTGTTTTTCCAATTAGCTATTCTCCTTGTCAGG
-ACTTATTCAGGTGTGAGTCGAAGTAGCCCGAGACGTTTGGCCCTAGTATG
-GATACTTCACGACAGTTTCAGACAGATTGTGGTCCGCCTTTAATGGGAAT
-TATTTCTACTGCACAGGTTCATAGCTGACTTAGCCGAATGAGCCCCTTCG
-ACGTCGCAATTTGGCGGTTAGCACACTTCCAGGAAGACATAGACGAATCA
-CAGTTTCAGAATTCCTATACACTTCAGTAACTACGGAGTAAGGCGATCAG
-TTCCTTGCCGCATTTATATGTTCATCTTAACTTTATTTTATATTAGCTCA
-CGGCTTTCATTGGAAACTACAGATAACTGAGCCAAATGCTTCGCCTTTTT
-GTCACTTTTTCCCAGTTCACTCAAGCCCAGAGTAGATGTAGTTTGAGGTT
-ATCTACTTCTCGTTTCCATGTGCGGATACTAGCAGAGTTTCTCCTGTTAT
-AACTGAGAGTCATTTCACACACAATACGGTTTATCTGTCGGCAGTTTCTT
-CTCACAAGGTTTTCGCTATAGATGAATATCTGGTATAGGGGTGAAGAATC
-TGTAATTATTAAACGCCTCAAGCTTATAGCCGTGACTGACAGTTATAGCC
-CCCGGCTTTGCTGGTTCTACCCTATACCACACAAAACCCAAACCAATAAA
-CCCATAATACTATATAATTCGTGTTGTCTTATTAGAGCGTAACTTGATCA
-GGGAAAACGAATTCTCGGGGAGCGAAGCGATCCGAGAATTGTATGTTTTC
-CCGAGAAAGTGAAGCGACAGCTTAAAGGCGCATCGCCTTTAGTGAGAGGC
-AGGTCTCGACGCGACGACATCTTTCCTCGCGCGCAGCGGCGAGATTTCGT
-CATTCTACGTGTTGGTTTCCCCCCTCCCGCCCCACACACATATTATTCCA
-AAGTGCGAGACACATATGCTATGATTTCCCTTCCGGAGAAAAATCGAATT
-ATTATGAAAATATTAAGTTTAAACCGTAAGTCGTTTATTTTCAGGAGGTG
-AGTTTTATTTTTCCTTCATTGTCGCCTGAGTGGGCAGTCGGTGTCTATCT
-GCAACATTCGCAGCTCGACCCTTGTGCTTGTTTTGGCGGTAGCAGGAAAC
-TTATGGGTTTTTTCACAGTTTCGGGAGAGATATTTACAGGCTCTGGTTCA
-GGGAACCAGATTCAGAGTTTAATAATGATATATCTTTACAGGAAAATTGT
-GGTTAGAGTTTCATGGCAGCTTCAGATCCCCTGATGATCAACAGTTCAAT
-CCACGGAAACACGGACGAAATGAGTGGTCCACCGAGCAACAATGTGGAAC
-GAGACGATTCCAGGTTTTCCATGCCCCCTAACATCGATGATGGTCTTATG
-GTAAAGTTCTTCCAATCAAGCGGTGTTCGTGTTTTGGATAAACTTCTTCG
-ATAAGTAATACTTGACTAAAAAATATCGAGAATTAAAGTCACAATTAAAA
-TTTACAAAATATTTTGTTCCAGATTATGAATTTTCGAAGATTAGACTATT
-CACGGCCACGTAGCGTTTGACATGTTGTGGGACTGAATTTCTACAAAAAC
-GTGAACTCACGTAGACTGTCTCTTGAATAATTTGAATGAAACAGATGTGA
-GCTCCGGAATAGGCTTAGGCTTAGGCTTAGGCGGGGCTGGGAGGAGAAAA
-AAATTGCGGAATTTGCCGTTTGAAGAGCTCGGCGAGTTTGCCGAGTTTGG
-CAAATTTTAAATTTTGCCGTACACACTACAAATTGGACAAAAAATCGAAA
-TATCAAAAATAACAAATTGTTCTGAGTTTGATCAGTTCGGTAAGAAAATT
-TTGAAAAAAGTGATTTGCAGAATTTGCCAAGCTCGCCTTTGTCTTTGGTC
-AATTTAGCACCATATGAGTGATTATTATCAATTTTCCCACTGTCGCTACT
-TCACATTTAAAAAGTAGTCATCAATTGCCGAAACAACTTCCTTCCAGCTT
-AAACTTTTTTCTTAGCCTCATCGGGACCCTTTCCTAATCCCTTCTTAACC
-TCATTCTTCCCATCTTCCAAAATTTCCATCCTTCTTCTTCTTCTTCTTCC
-CACTACGACCATCTTTGTCGTATAGCACCTTTCTCGCGAGAGTGTGTGGA
-AACAATTTGCGAAAAACGGCTCCCGATCCCCCCATTCGTTTTGGCGAAAT
-CAATAGACACAAAAATGTTCAAACAAATCTCCCCTTCTCGTTTATCCCCC
-TGTTGCACAATATCCTTTTCTCACAAAAAAACCTTTGCTCTTCAATTTTC
-GGAATCATCTTTTTGCGCTTTGTCGTGTTACTGTGAAAGGCGGAGTACTG
-AAATATGGAAAATATTTTTAAATGACTCCCTGATTCCGAATATCTATGTG
-AGAAAGTTCAAAAAATTTTCCCTCATTTTATATTTCAGCTTGAAATCGTG
-ACTTTCATTGTGCACTAATGAGATTTCGATTTCGAAGTTTTTTTGAAATG
-TGTTTTCAAGGTCAATTTTCAAGGTCAATTTATTATTTTACTATCGAAAA
-ACTAAAAAAATTTCAATGAGTAAAGTAAGTAAGTAAGCATTTCGTAAATA
-TACAAAAATCTCGTAAATCGACACATAGCGTCTCTGGCGCGAAAATTCGA
-AATCTCATGGGTGCACAAATGAAATGCGAGATTTCAAACTCAAATGTAAA
-ATAAGGGAAATTTTTTTGAATTTTGTCACATAGATATTCGGAATCAGGGG
-CAAATTTGAAGTCAATTAAAAATATTTTTCAGATTTCGTGGTACTCTAGT
-CTAAAACTAAAACTAAAACTAAACTAAAGTTAAATTAATATTAAATTACC
-ATGAATCTAATTTTTGTTTTTTAAAGTTTCCTGCAAAAATTCCAAGATCT
-CAGTTTGCCGAAGTCTAAATAACGACAACTCTGAACTTTTGTCCCGAAAG
-AAATCGAACACCGGTGTATACTAATAAGATCCCTCGAAGCTCGGTATACA
-AAAGGATCATGAAAAAGGGGTGTCTCACCTTGCGCATAATACCTTCTGTC
-TTTCCCCCTTCACCAGAAAGATTTCCTTCTTATATTTGTTCGTTTCGTTC
-CTGCACACTCTCCATCTCTTCTAACCCCCTCCTCATTCAGAATACTCTCT
-CATCTCACAACGCTTCTGTCTACCTGCCTGCGTCTCCTCGGTACCATATA
-CTATCTTGTAGCTGCCACTTACCAACAGACTTGCCTCTTGGAGGTCTCTC
-TCTCTTTTCCACCAAATCACCTTGTTCTTCCGACTTGTTCTCTCTTATCG
-AACTGACTTTTCGTGTCTGCGGGCCTTTCACATTATTTTCCAATTTTATT
-CGAATTTTATGTGCCCACTGCTTGCTAGGTTTATTGAGTGCCGCATTAAT
-TTTATTGATTAAAAAAAAAGCCACTTGTAACAATTTTTATGAAATTTGTT
-TGCATATTTATTTAACAGTAGCGAAATTGTTTTAAAATTCGTACTGTGTG
-AGAAATTTGCACTTTCGAAGTGTTTAAAACATTCTATTACGGGATCACAA
-GATTATGAGAATGCTTATTGCGCAACATTTTTGACGCGCAAAATATCTAG
-TAGCGAAAACTACAGTAATTCTTCAAATGACTACTGTAGCGCTTGTGTCG
-ATACTGGCTCGATTTTTTAAATGATTTTTTTTCGAATAGTGACGTCGATA
-TTCCATTTTGCTTTCTTTTTCGTATTATAATTTTATTCATTTCGAGAATC
-GAGCCCATAAATCGACACAAACACTACAGTAGTCATTTAAAGAATTACTG
-TTATTTTCGCTACGAGATATTTAGCGCGTCAAGATTTTTCCTTACGGAAA
-TACAAACTTCTTGGCGAAAATTTCACGAAAATTCAAATTTCCCGCTTAGA
-ATTTCCCGAATTTTTCGAATTTCCTGCCAAATAAAAACTAGTTTAAATAT
-TTAAAAAAAAGCTTAGAATTCTTAGAATGCGTATTGCGCAGCATATTTGA
-CGCCCAAAGTATCTCATAGCGAAAACACAGTAATTCTTGAAATGACTACT
-GTAGCGCTTTTGTCGATTTACGGGCTCGATTTTTGAAATAAATTTTTTAA
-AATCTTTTCGAATCAAGCCCGTGAATCGACACAAGCTCTACAGTAGTTAT
-TCAAAAAGTAGTTTTGGCTTCGATCGAGATATTTTGTGTGTCAAATATAT
-TCCCGTAAAACAAAATACCGTCTAAAGATATAAAATTTAACGCCTATTAC
-ACCCCAAAACCCGCCGGAAAATCCAGAAAAATTATATAAATTCGCAGTCA
-CTTCTCAAAAATAACCTGAATAGTTGACCGCGTAATTCGACCCGTTTCCC
-TACGACTGACCACACCCCGATTCTCTCGAATTACCCGCGACAAGCTTAAG
-CATCTTTCTTCATTCCCACACTTTTCGTAAACTTCTGAGAGACAAAACAA
-TAATATTTCTTTCTCAAATCAATAATGCCTATATTCTCCGCATCCCGTAG
-CCGATCCCATCACCGTAATTCTAGAAATCCCACGAAATTTTCCAATTTCT
-CTATTGAAAAGGTCTCTCTTTTATATTACCCAGGCGCAAAATTTCGTGCA
-AAAATACAATCGACGGTCTCGACGCGATAATTTTTGCTAAATTCCAAAAA
-TGTGTGCGCCTTTAAAGATTATTGTAAATAGCTTCAAACTTTCACCGATA
-TTTTTAAAAATTGATTTTTCTATGTTTTCCGTTTAATATATATTTATTTA
-TTTAAAAATTAAGTTGAAATTGAGAAATCGATGAAAATCGAAAATTACAT
-TACTCTTTAAAGGCGTACATGTCGTTTCGAGACCGGGTACAGTATTTTCG
-ACTGCGATTTTGGTTTTTAAAAAAACCTAACCAATAGAATTTCCAGCGCT
-CACACTCATTGGGTGGAAGCAGCAGCAGTCCGACGAGCTCTTTTTCGTCA
-AACGACGAATTCGACGATCGTCAGAACAAAAAGTGAGTCATCAGTTTTGT
-TTGAACAGCAGGTGTGAAATTTATTGTGAAATTTAAAATGGGAAATCCGA
-AAAAACACACCTTGTGTGATCTAAGATCCAAAAAAAATAGAACAATCGAT
-AATTTTCGGGTAATTTTAAAGTTATTTTTAGCGAAATAAACAATGCATTT
-TTGAGGGATTGGTTTTCAGTCATTTTCGATTAAAAAATTCAATGTTGAGC
-TGAAAATATCGATTTTTACCAGAAAATTGATAATTTTCGAGCTCAATACC
-ACAATTTTAATGTTTAAATCGCTTTGAAACCTCATAAAATCTCCCGCACC
-TCCAGTTTTTGTAGTTTTCCGCCTAAAATGTCGGAAATTCAACAGAATAC
-TCATTTTCCTAGCGAAATCTATTAGTTTATAATAAATTTGATCGTTTTCT
-GCTTAAAATTCCCTGAAACTTCTGAAAAAAAACCGATTAATCAGCTGAAA
-TTCGCTTAAAACTAATTTCGTGCCGGGACCACGGCCTTTTAAATCGGTAT
-GCGCTTTTAGTTTTGTACCGTATCTATTTTAGTTTTTAAAGTAAAAAATG
-AAATTTTCAGCAAGTTTTGGCGTCAAAGAAATGTATCGAACGCAGAAATT
-GAACGAATAATCGAGGATTTCATAGCGAATGGTATTTTAAGTGAGTTTTA
-TTCGATAAAATCGACGAAAAACCAGAAATAAACAGTTAATTTCCAGAAAT
-GAGCAACGGGAACAGCTACAATCACCATCACCAATTCCCGATGAGCATTC
-CAATATCGTGCTCGTCACACTCAATTCAATCACAATCACGAATGAACACT
-CTGAACGCGAATAGGGATCTCCTGTCTCCCGGCAACGACGTAATTGTCAC
-CAGAACCGTGTCACCGTCGTTTTATTCGCATGGAATGCCGGCCCGGGATA
-ATGTTTTTCGAAAAGACGATCATGTCAGGATATTGGGGAATACAACGGTA
-TGAAAATCTGCTTTTCATCGAAAAAAATTGGAATTTTCAGGACCCAGCGT
-GGTATCGAGCCCGTAATGCGAATCAGGAGGAGGGTCTGGTTCATGCAGAT
-TGTGTAGTGAGAATAAAGTTGGTTTTTCTGATCAATTTCTGTGAATAACC
-CCGATTCCCATGAAAATAGGATTTTCAGCAGAAACTCCAGGCAAATTGAG
-TTTTTGATGCGAATAATGGATTAAAAAAGATAAAAATCCATGAAAATTTA
-ATTTTTTACATCAAAAATCCATAAAAATCGGATTTTTGAGCGGATTAGAT
-TACTTTGCCGAAAATTCATTTAGAAAAAAACAATTCTTGCGCGCAATTGC
-GCAAAAAATTCAGAAAAATGAAACATAAAAGTTAAAAAAATTATTTTTAA
-ATATTTTTGAGCTGAAAATAAAAGAAAATTCGGATTTTGTGGCCAAAAAT
-TCAAGAATATTCCATGAAAATTAGTTTTTGTTTGCAAAAATCCGAACAAA
-AATTAATTCTTTTTTTCGCTAAAAATTGAGAAAATGGTTTTAACACAAAA
-ATCCACAAAAAATTGATTTTTAGGCCACAAAATCTATGAAAATTCTGATT
-TTCTGGAAAAAAATTAAGAAAATTCAAATTTTTTGTTCAAAAACTTTTTT
-CAAAAGCATTTCAAGAAAATTTGATTTTTCATCAAAAAAATTAATAAATT
-TTAGCGGGCAAGCCTACGACAATGGAATTGTAAGAATGAGAGCTAGCGGA
-TGTGACGTGGCTCCGGGAGCAGCTTCAACAACCTCCAGCACATCATCACA
-TCATTCAACTGCAGCAAACCATCAGCCATGGTTTCATTCAATGATTAGCA
-GAGAAAATACTGAAAAGTAATATTGAAAATGTTGGAAAAATCTGGAAAAA
-TGCGTCATTATCTCGGTTTTCAGTCGGTTTCCAGTTTTATGAAAAAAACG
-TCACTAAAAACGACATATTTCTTTAAAAACGTAAACATCGGAAATTGTTT
-GCATGAAAAATGTCGCGATTTTCTAGAAAATTTTAAAATTTAAAGAAAAA
-TGTTGAAAATAGATTTTTTCTGAATTTTTTGAATTTTATTAGAAAATAGA
-GAAAACATCATGTTTTTCAACGTTTTTCGCCTGAAACGCTGGAAAATGCA
-GAAAATGGTTTTTTTAGTGGAAAATAAAAATATTTTTTAAAAAAACGAGA
-ATTTTTTTTTCGTCGAAAGTTCCAACAAAAATTACATGTTTTACAAAACA
-TGTAATTTTTGTTGGAACGTCTTTTTTTTCTGAATTTTTCTTTGATTTTG
-TTAACTTTCTGAATTTCAATTCAAATCGGCAAAATTGTACGCGTCTTTTG
-AATGTTCCCACATCTATTTTGTAACGAATACGGGAAAAAATATTTCAAAA
-AGGCACATTTTTCAAGTGTTTCCGCCTTATAAAAAATTGCCACTTCCGGC
-AAATTGATATCCGACATACGGCAAATCGGCGAACTGACAAATTGCCGGAA
-TCGAAAGATTCCGGCAAACCGACAACCCTCCGATTTGCCGGTGTCAGAAA
-ATTGAAAAGTGTAGAAAAATGACGTCACAACTAAATTATAATACATGTCA
-TTTCTTAATGTATTTTAATACAGTTTTGACGTCATTTTTCTCCACTTTTC
-ATTTTTCCGGCACTACTTGAATAACCCTGTATACCACTTTTAAAAATCAT
-GTTTTACAAATTTGTAAACTCCAGATTACTCCGCGGCAAACCGGACGGAA
-CCTTCCTAGTACGTGAATCCACAAATTTCCCCGGCGACTTCACACTATGT
-ATGTCGTTTCACGGAAAAGTCGAACACTATCGCATCGAACAGACGTCCGG
-CGGACAGCTGACCTGTGACAAGGAAGAATACTTTTCCAATTTGACACAGT
-TGGTCTCGGTGAGTCATTTCGGGGCTGTAGAGACAGGAAAAGGGGGAGGA
-ATGGGTAATGAACCGGTATTCGTTAGAATGAGACAGGTGAAGATAACAGT
-TATGATTTTATATTGTGAAGAGTTGTATTATAAAAAAGGTTGGTAGAGAT
-TTGAATATTTGGGAGAAAGAGAAAATGAGGGGAAAATTGTTAAAATTCGG
-ATTTAAGTTTGAAAAGTCACAAAAATGTTATATAAATATTTATATTTATT
-GGATATAACTAATTAAGATTTTATATAGCAATACTTTAAATAATATGAAT
-ATTGTTAAATATTGATATAATATCATATCAATCTTCATTTAATGGCTAAT
-TGTAATTTCCAATTTTCCAGCACTACAAACGTGACGCGGACGGTCTCTGC
-CATCGCCTGGTAACTCCGATTATTTGTGAAACAGCGACATTTTCATCAAA
-CGGATCATCGTCATTTGGTTCATCGTCGACAGTTGATTTGGAAGATCGAA
-CATCAGTATTTCGACACGCGGGTCTAGTTATTTCATCGAACGATATTGAT
-GTTGGTGATACAATTGGACACGGAGAATTTGGAGATGTTCGATTGGGAAC
-TTATAAGAATCGAAAAGTCGCGTTAAAAGTGTCGAAAAGGCATGGAAATG
-GAATGTTGGACTCATTGCTGGATGAAGCCAAGTTTATGGTGTAAGTTATC
-AAATTATTGAGAAGAAAATAATTTTGGCAAAGCCCAAAACAATGCGTGTT
-GAACAAAGTCATATTAAAAATATATTTATGTTTCAAAAATGTTATAATTC
-AATTTATTTTTAATTTCGAAAATCTATAATAACAACTTTTCCAAGTTTTT
-AGTTATGAGTACCCCGAAATCTGAAAAATATTTTCAATTGACTCCAAATT
-TGCCCCTGATTCCGAAAATCTAAGTGAAAAATTCGAAACCTGATGGGCGC
-ACAAATTATTTGTACAATTTAAACACTTTTTAATTAAGATTAAAAATTTC
-CCCAATTTTTTTGAAAATATTCATTAATTTCTATTTTATGTTAATAATTG
-TTTCAGTTTATAACGCTTAGTTTCAAAATTTTCAATTTTCCTGATTGATG
-ACTGATAACTAATGGCAGCAAATAAATCTGAAAAATTCCGAATTTTGCAG
-AGGTCTCTCGCATCCAAATCTAGTGACACTTGTCGGTGTTGTACTGGATG
-ATGTGAATGTCTACATGATAACTGAATATATGGCAAATGGTAATTTAATC
-GATTTACTCCGATCTCGAGGAAGGCATGCGTTGGAGAGGAGGCAGTTGAT
-GATGTTTGCGATGTAAGAAAAAGTTGACAAATAAAAAAATTGGAATTTAA
-CATTCAAATTAGATTGTTCAAAAATTGTTGACATTTCTGCATTTTTATAA
-CCGAAAAATCGAAATTTCATTTTTTCCGCCTGAGTAATAGTAACTCACCA
-CGAAAAGGGTTACTGTAGCAGTGCTTTTAGCTGTCTCTGGTTTAGAAATT
-TACGATTTGCCGGTCTGTCTGAAACCCGATTTTTTCTAGATTTTAAACAA
-TTTTCTAGTATCCTGTTGAATTAATTCCAAAAACATTTTTTGCTAAATTT
-TTGTTCTCCGTTTGTCAAAAAGCCGACTTTTTAAAAACACTGCAAAATTT
-CTCTCTAAGTTTTTTAAAAAATGTTTGCCCTTGAAATCAATGCAGTTTTT
-TTTTTAAATTTTATTTTGGAGTTTTTTCGAACAAAAATTTATTTCTTCGT
-CTATTCGTACCGAAACACCAAAAAATCCACTTTTTTTCGAAATTTTTTTT
-TTCAAACAACAACCCTGATTTCAAGGGTAAACATTTTTTAAAAAATTTGA
-AAAAAATATTGTAAAATCGGTTTTAGTTTTTAAAAAAAGTCGTTTAAATT
-TGTTGCACAATTAAAAAAAAATTTAGAGAAAAATCTTGCAATGCTTCAGG
-CACACAGCTGAAAATGCTAATACAGTACTGCTTTTCGTGGTTGGACCCAG
-CCGTGGTTACTGTACCTCCGGCAAAGTGGAAAATTCGATTTTTTTTTGTT
-AGAAAATTTGAAAATGTCAAAGATCTGATTTGAATGTTTCAATTTTTTGT
-GACAGCTGTTCTTGAAATCCAAATTTTCAACTTTTTTTCCATTTTCAGGG
-ATATTTGCCAAGGAATGTGTTATCTGGAATCAAAACAGATTGTTCATCGA
-GACTTGGCCGCTCGAAATGTCCTACTCGACGATGATTTAGTAGCGAAAGT
-TTCGGATTTTGGATTAGCGAAAAAAGCAAACAGCCAGTCACATGATTCGG
-CTTCTGGCAAATTTCCGATTAAATGGACGGCACCTGAAGCGCTTAGACAT
-AGTGTAAGTTTGGTTGAAAAATTGAAAAAAATTGAGAAATTTTTACAGAA
-TTTATTCTTTCAAAATTAATTTCATAAAAAGAAACAAAATCATTTCAATT
-TAAATTGGAATTTCGTATTCTTAAATTTTTAATTTAAAAAAATCGATATT
-TTTTAAATTTAACAAAATTTGAAAAAAGAAATCCGAAAATCCGCCGGAAA
-ATGCCTCAAAAATCTGCACTTTTTTTGAATTTTTGCCCAAATTTCTAGAA
-TTTTCCCTTACTTCATTTTCTTTCATAGCTTGAATATCAAAAATGGGAAA
-ATCTTGAAAAAAAATCCCAAAAAAATAAAAAACGAAAAAATCGATTTTCA
-AAAGTTTATTTTTTAAAAATTTTTGTGATTTTTTTCTGATAAAAATAGTT
-TGAAACTAGAATTTTTAGAAAATATCCAAATTTTCTAATAGTTCGCTGAA
-AAATGACTCAAAAATCACCAAAAAATATTGAATTTTCGCATAAATTTTTC
-AAAAATGGAATTTTTTTCATTAAAAATTAAGAATTTTTGCAATTTTCCCA
-AATTTTTTTTAGCAATTCACCACAAAATCCGATGTTTGGTCATTCGGCAT
-TCTTCTTTGGGAAATTTTTTCATTCGGACGAGTACCGTACCCAAGAATTG
-TGAGTTTTCAGACAACATTTTTTTAATTAAAAAAATTTCTCGTGTTTTTT
-CATATTATTCCTCGCTAGCTGTTGTTTTTATTTCTTGGTTGGGATCATTT
-CTTTTAAGGCTCCACGGAAAGGGAATCTGCGCGAGAATGAGATCTACGAA
-AATGAGCGACGATGCTAGGATGAAACGCGCGTTGTTTAGCATGTTTTTGA
-GACTTTTCAAAAATAGAGTTTTTAACCTTTTTCGTAGATCCTCTTCTCGT
-AGATTCCTTTTTCGTGGGTCCTCTTCCTATATTTTCGGCTTGGCCGAGTT
-TTCTCCCGGCCACGATCATCACTATTTTATTGATTTTTGTCATGATTTTC
-AGGGAGCCGATGGTCGTTCGGTATGTGTATATTGCATTTTTTCGTTAGGT
-TCTATTTTTTTCAAATTCTATCCACTTCTATTATACAATACATCTCACTA
-TCTTTTCCCCTGCCTGAAATTTTTGAAAAAAAATGAAGAAATTTTAATTT
-TAAACTTTTTCCAAAATTTTCCAAAAAAAAAAGTTTTTTATCAATTTTTT
-CAATAGCTCGAATTCTGAAAATGAAAAATGATGATAGAAATTGTTTTAAA
-AAAATGATTTTTTTTGTTGCAAAATTTAATTTTTAAATCGAAATACAACG
-TTTTTTTCAAAAAAAAAACACCTTATTCGAGACAAAAATAAGTTTCTTTT
-TTTTTCAAAATTGAACATTTGGATTTTCTGGAAAATTGAATAATTAAAAA
-AGATTAAATGTTCGAAAAAAAGAGAAATATATATTTATTGGCTTATTTGG
-AAAAATCAAAAAATAGTAAGAAAAAAATCAAAATTGTTCGATTTTTTATT
-TTTGTTTTGTTTCCGAAGATGTCCTTGTGGTATATAGTATTTTGGGTCCC
-ACCACGAAAATCGCCGTGCGCCTTTAAATTCGGCCGACCACGTCTCGCCT
-AAGTCCAGTCCCCCACTAATGTCAAAAAAAATTTTTTTTCGCAAAACCTG
-AATTTTGAAATCTTTTTTCCAAAAAAAAAAACGTTTTTTATTTAATTTTA
-AAAGAAAAAATTGGAAAAAAGTATTATTTTTTCTAATTTTGAACTTTTTA
-AAAAAATTATTACACATTATCTGGATTTTCAAAATTTTCCATATTCGATG
-TTAAAAATTATAAACATTTTTCAGAAAGGAACACCGAAATTTTTTTTAGA
-AAAAAGTCAAATTTGGAGCGAAAATTATGTTTTTCAACAATTTTTCAACA
-ATAATTTTGTTCAATTTTTTTTTTGGATCCAAAAAAATCTGTGTGTTTTT
-GTGTGATTTCCGGCACCCAACTCCCCAGAATTTCCCTCAAAAACTCTATT
-TTTTTCTCTGCTACCTCTTCTCAATCTTCTAATTAATTCTATGTTTTTTC
-ACTATTTTTTATTATTTTTTCACCCCTTTCAGAGCTCATTTAGAGCCCAA
-AAATAACCATCAGAAACACAAAAAAAACAACTTTTTTTTTCTTTTTGAAT
-TAATTTTTTCAGCCTATCCAAGACGTTGTGAGATATATTGAGAAGGGATA
-TCGAATGGAAGCACCTGAAGGATGTCCACCGGAAATTTTCAAGGTTATGA
-ATGAAACATGGGCTCTATCGGCACAAGATCGACCGTCTTTTGGACAGGTA
-GATTTTTTAAGGGAAATTTTTTAGAATTTTAAGACGAAAATCTGAAAAAA
-AAACCTACAATTATGGCAATTTTTGTGATGAAAATCTACAAAATTGAATT
-TTTTTTCGAAAACCTGATAGAAAAAAGAATAAAAATTAATTTGAAAAATG
-CCGTAAATTGACCAAAAATATGGAATTTTTACCAAAATTTCAGGGGTTTT
-TCAGATTTTACCAGAGTTTCTGCCTTATAAATTAAAAATTTCAAAGAGAA
-ATATCTTTTTAAAATCAGCATTTTTAGCAATTTTTGTGATGAAAATTGTT
-TAAAAATTGCCAAAAATGGGAATGTTTGAAGAAAATTCAGAAAAATCTAA
-ATTTTGGGCAATTTTTGCAATAAAATTGAAAGATTCGGAAAATAATAAAT
-TTTTCGAAATCCTGAAAAAATTTCACAATTTTTGCGAAAAGAATTGTAGA
-AAATTCGAAATTTTATTATTAAAAATATTGAAAAAAACAAAAAATTTCAA
-AAATCCGCCGAAAATGGCTTAAAAATCTAAAAGAAAAGATTTTTTGCATT
-AAATTTTATTGCATTAGTATTTGCGAAAAACAAACCCGAAAATTCACTCT
-AAAATTACAAAAATTTCAATTTTCTGAAGCTGCGTCCACAAAATGGCTTT
-AAAAATCATTTTCATGTACAATGTCAAAATTTTAAAAAAAGTGAAATTTT
-GTTCAGAAGTTACTATAATAAAGGTTTTTTGCTTTCCGGTCATTTTTTTG
-AATTTTGGAACATTAACCGAAAAAAAAATTCCGCATTTTTACCCTGAAAA
-ATGCGAAAATGTTTGAATTTTTTGAAAATTCCACTTAAATTTTTTATATT
-TTCAGGTCTTGCAACGATTGACAACCATCCGAAATACAGTATGACATCGG
-CGCACATCTCGAAACTTCCAGAAATCCATCGAATTTTCTAGTCCATATGA
-TGTTTCTGTTTTTTTTTCGCTGTTTTTTACACAAATTTTGTCATATTTTA
-TTGTAATTTCCCCCACACATTTTTAGGCATCGTTATTATATATTTTCTAA
-TCCGCTGCCGCGCATTTCGGGAGATCCTGGAATTTAAAGGCACAGCGGTG
-TTTTTGGATGGGTCCCACCGCGAAAATTATTATGCGCCTTTGAAATTTTT
-TTTTCGATATTCCTAAAAATCACAAAAAACATTTTTTTTTCTAAATTAGA
-GAAGTTTTAGCCTTTCTTTCGAAAAGTCGATTTTTTTGGTTTAAATTTTT
-CTCGATTTGAAAAAAATTTCAATTTTTAGTGAAATCAAAGAAAAAACATC
-AAGAAACTTCTATTCGAAAGAATTTTTTAAAATTGTATTTTCCGAAATAA
-TTTTCTCTGTTGGGTCTCACCACGAAAATCGTCATGCACCTTTAAATTTC
-CTTGCCCACACCTCTCCGAACGGCCGATACCCAATCTACGGTTTCTTCAA
-TTTTCCTCTGCATTTTTCATCGATTTTTAAAAATTTTTATCGAATATTTT
-CACGTTTAAAATTATTAATTTGCAACGAATTTCCCTCAACAAAAAATGCT
-CAAAACTCCGCCCCTTTATTGGCATAATTTTTGCCGCCACGGAAAATGCA
-ATAAATTTTATATTACTTTTCACCGATTTTTTAAGATTATTTTTAGAACT
-TTTAGTTTTTGTATGTGTGTGTGCTCGTAGTTTATCGGCAAGAAATTATT
-GTTTTTTTTTCTTAATTTTTAATAAGGGAACATTTTTTAAAGAGATTTTC
-AGAAAATCGGTAAAGATTTAAGATGCTCTGAATATGTCCAACTTCACAAG
-CTTCGTAGATTACGCGGAAAAGGTGATTTTGAATGTTGAATGTGCAAGTG
-CGCCCTATGGATAAATGGAGCAGCGTGGCAATTCGAAAAAATTTAAATAA
-AAACGTATTACTCGAAAGTTCACAGAGTTTTTCACCAAAAAATTGAAAAT
-TCGCTGAAAAAGTCGCGGGACATTCCATTTTTATTTTTCGGGAAGAAATT
-CGAGAATTGACTGAAAAAAGCGCGTCTTTATTCCAGAAATTTTAGCGGAA
-AATTCCAGATTTTTTTATTTAAAAAGACTCAAAACATGAAAAAAATATTC
-TGGAGAAATCAAAAATTGATTGAAAAGTTTCAGTTTTAGGCTAAAATTTT
-TTTGCGAAAAATTCATTTAGTTTTTGTTGGTAAAGTTCCGATTTTTCTGC
-AAAATTTGAATTTCTTTCTGAAAAAGTGCGTTTTTTTTTTCAAAAAATTC
-TTAAAATCGGAAATTTTTCGCCCCGAAACTGAACCGAAAAATTCGAAAAA
-TGAAGCGCGGTCAATTTTTGAATTTTGGCATTGAAAATATTCTGAAAAAT
-TCAAAAATTGACGGAAAAGCTCAAAGTTTTTCACAATATAATCGATATTT
-TCTCATTTTTCAATGTAAAAATCGATAGTTTCAGCCGCACGTCGCAGCAA
-CAAGCCAGACACCAATACCGCCGTCACCGTTGAACGAAAAACGGCCAATT
-CCACTGTTTCCAAGTGAATTTATCGATTTTTCTGTAGAAAAATCTGAAAA
-TTTCTGAATTTTCAGACGAAATCAGCAGCTCTTCGTGCGATGACGTCTCG
-TTTTCCATGCAATTCGGAGAATCTGAGCAGGGACATGTTATATGTACAAA
-AGTTCGACTTCGATTCTATCCTGCCGTGGTGAAAGAGGTTCGAAATTCAA
-AAAAAAAAGAAAACAATATTACTATACATTCGTAAAAATTAAATTTCAGT
-TTAAAGGCGCATCTCACATTTAAATATGCATTATTATTCATTAGTGTCGA
-CCCAGATTGAAAGCGCATGCAAATTTTGAACTTTAAAACTGGAAAAAAAA
-TTTTATTACACATTCGTGTAACATGAATATTCAGTTTAAAGGCGCGTGCT
-AGTTTTAAACTTCAAAAATTAAAAAAATATATATATATTCGTGAAAAAAT
-GTTCTTTTTAAAAGCTCTTTAAAAGTTTAAAAATGATTATTATACGTTTC
-TCAAAATTTTCAAAAATCAGGTCAAATGCACTTAGAATATTGGAAAATAT
-GAAGAAAAATCTTTATACATTCCTGAAAAAATACGCATGGTCCAAAAGTC
-GACAAATCGTGGCCCAATATTTTCTATTTTTTCAGAGAAATCTTCCGCAA
-AGGTCGAAATTTTTCGACGATTTCTACGATGTTCCGCTCACTGCGATCGC
-CAGAATTGAGGTGGCCATTGTGAAAGGTGAAAAATATTTTTACTTCAAAA
-AATTATTATATTAAATTTACACATACACATTCGTGAAAAAATTTTGCCGG
-TAAAAATAATGAAAAATATATACAGAAAAATACGGAAAATTTGGATGAAA
-AATATTTTTTGGTGACAATTAGAATATTACCCGCAAACAAAATTCAAATG
-AATTTTTTCAGTTTTTGAAAATCTAAACAAATTTCAAAATGTTATTATAG
-ATTCGTGAAAAATTAAAACTCAGTTTAAAGGCGCATTTCATATTCAAATG
-AGAATTATTAAACATCTTAAAGACATAAACAAAAAAAATGAAATCTGAAG
-AAGAAAAATTATACATTCGTGAAAGTTGGGAACAAAATTTTGTAATTTGA
-GTGCTTGACATCAGTTTAATAAAAAATTTTGAAACCAAGAATTTTCGAAA
-AAAAATCACGTATACCTAAAAACTTGTAGTTTTTTAAAGTTAGTAAACTA
-TTTTCTCTCAAAAATTCAAAAATATTCCAGGTAACAGTAAAGGAAAAGCG
-GACAAATTTCAACGCCTCGAGACAAGCCTATCAACAATGGAAACAGTATC
-AATAATTCGTCTAATATTAAAAGATGTCAGAGTTGTTACAATTGACTTGA
-GAAGATCTCAAAATGCAAATATATTGGCTAATCAAATACTCTACTTCTCG
-AAAAGTGGACCAATCGAAAAAATGACTCAAGTTGGAGCTGCTATGGAGGA
-GCGCGGTGTGAAGGCGAAAAGTAGGCATTGGATAATTAGTATTGGGGGTT
-GGGAGGGGAGGGAGGAAAGTTCGAGAAAATCGGAATATCTTATAAATATT
-AGGCCGTTTGATTAATAAATCGACACATCAAGTAAATAAATTTTGAAACA
-AATTAAAAATTTTAAACGTTTCGATTGATATATGTGTATCAATTTTTTAA
-AAGATGTATATTAGTAACAAACAAGAAATTTTTTATTCAATAAAAATATA
-CTACGGGAGCACTAAATTTTTAGAATGCGTATTGCACAACATATTGGACC
-AGATATCTCGTAGCGAAAACTACAGTAATTCTTTAAATGACTGGTGTCGA
-TTTACGGGCTCTTTTTTCATTTCTCCGTATTATTTTCTCTTTTTTGCTTA
-ATTTTAATATTCTATCTATAACTAAAAAATTAATTCATTTCGAAAATCTA
-GCCCGTAAATCGACACAAGCGCTACAGTAGTCATTTAAAGGATTACTGTA
-ATTTCGCTACGCGATACTTTGTGCGTCAAATATATTGTGCATTACGCATT
-TTCAGAATTTTGTATTCTCGTAAAATTTTCGAAAAAGTAAATCTTTTAAA
-AAACTTTTTATTAAATGAATAAAAACGCATTTTTTGGAGAATCGGATAAA
-AATAATTTATTTAAGTTTTGAAATTTTAATATTTTGAAAAAAAAACATTT
-TAATTGGAAAAAAATATGAAACTTTCTTTTGTAAATATGGTTTTTACAAA
-ATTCCCGAATGTCCAATATACAAACTTATCATTTTCCAGCAGCATTCAAT
-AGCTACGAAGCATGGCGTTCGGAACTCCAAAGGTGCCAGCAGAAGACGGA
-TTCAACGTCTGTCTGGAAAATTGTAGCACTTAACAAAGAAGGCTTCAACT
-ATGCGGCTCAGGGGTGCGATTTTTGGAAAAAAAAACTGGATTTCCGATTA
-AAAATATGTATAGTGTATGTATTTTTCAAATTTCCAGCTACCCTGTGTAC
-GTAGTAGTGAGCAACTTCTTGGATCGTGTGGACATTGAACGACAACTACA
-ACACTACAAACAAGGACGATTTCCGATTTGGGTGTGGTCTCGGGCGAACG
-GACACTCGGCGTTATTCGTTTCGGCGGATCACGAGAACAATATCGCGATG
-CCGGCGATTTTGGCGAAGTTAGTACATTATATTTTAAATTTGTAAAATGT
-TATTTTCTTCCAGAATGCAAGAAAGTATCACCCGTTGCCATCCGAATAAC
-GAGAAGCCGCATGTTATAAAATTGGACGTCGATTTTGTGTCGAATGTTGG
-AAAAGCTTTTGATAATCTTCTATCGCTTTGTGCAATTGGTGAGGGAGAGC
-ATTTCATATTTAAAAAAAAAATTATTCGCCGTATTTTCAGCTGTTTTATT
-TTCCATTATTTTCCATATAATATGCATTTTCCCAGACTCCTACGAGCAAT
-ACGTTACACTGCAAAACGGTTGGAATACGAAACTCTCGAGAACCGGATGG
-CTTCATCTCGTCAAGCTGTGCCTTCAGACTACCTATCAGACGATTCAATG
-GATTGTTGATAGAGATCGATCGGTTATTTTACAGGGTACTATCAATTTAG
-GTTTTATTCAGAGAGAGAGAGATAGCAATTTTCAAAATATTTACAAACGA
-GTTAGTCATTTACATCCACAATCGACTGATCAGAATCTGATTCGTGGCCG
-TTTTCCTCCGCCAGAACTTTAGGAACTTGCACCGAACTACTTGCTGCTTG
-ATCCTCCCCCTCCAGAGGATCTTCTCCAGATGGGATACAACTTTTGATGA
-AGCTGATCATCGGATCCTCCTCTCCATCATCCGAACTAGTTTGTCTGAGA
-AGAATATCAACCAGTGTCTGCATTAAATCACCGGGTTCCGTTCTTGCTCG
-TCGAGTACTCAAATTGTGTCGGCACATGAATTTGTCCAACCATCCGCGGG
-ATGCCTGAATGATAAAGGTGGAGTAGCGTCGAATAGTTATTTTTTATGTT
-TTTCATATACTCGTTTGCATTAAAGTAACGGCTCTCCTACCTTGAAATCC
-GAGTTCTGACTGATTTTCTTTGCCGTTTCACCGATGATTCTTCTGGTGAC
-TCGTTGTTTCTCCTTACGCTGATCGTGAACCCATTTAATCAATTCCTTAT
-CAACGTCGTCATACTTTAAAGGTCTTCCACCTCCCGAAAGTCGCTTTGTT
-GCAGTTGAGCCGTTGTCTTCTCTGAAAGTGTTATTTGCCAAAAGGCAGCA
-AGTCGAAAATTTTTCAAAAAGAAAATTTGAAATCGAACAGAGAATTTATG
-TTATGCCCGTATTTCAAAATATAGGAATAGTTGAAATGACTTCTTTTGAT
-AGGATTAATTATAAGCCTAGAAAAAATCATAGTATTTGGAATAAAAGGTC
-CATAAAAGGTTCTCAATTGATAGGGCTTGCATGTAGGCGTTAAACCCTGC
-CTTTAAGGCGACCTCCGCTTGCCTCTCGGTTACGCCTTACGTTGTGCTAA
-AACATAATCAATCTTTTTTTTTTTAATTTCTATTTTGATTTTCATCAAAT
-TGAGAGAAATGAGAAAATTAGAAATTTGTAAATTCACATAGGCGGGTTTC
-AAGCAGGACCCTGACACCGCGCATGCCTAACATGAAAGTCCTAGCCCTGG
-ACTATTTTTTTGAACACAAAAATATGTCCGAAGTGGCAAAACTTACAACT
-GCTTCTCGATTTCAGCTTTCTGGGCGATCCACTGTTGAATGTTTTGCCTA
-TTCACATTCAAATCCTTTGCTGCTTTCGATATATTCTTATGTTCAAGGGC
-ATAATTTATGGCATGCAGTTTGAACTTCAAGTCATACGTTCTTTTTCGAG
-TTTTTACAGGCACTTCTGTAGGGATTTCGCTCATTGGTTTTCTCTGAAAA
-ATAAGTATATAACAAGCAAAGTCTTAACTAGTCAGCAAGTTATTGGAAAT
-AAAACATGTGAGAAAAGCGAACGAAGGGGCAAGACTAATGGAGACAGCAA
-ATTGGCACACACGCAGAGAGACATGGCTAATAGAGTGTGCAAGACTATTA
-GAGGGTAGAGGCAGTGAGACGAATTTCCGACTGGTCAGAATGTAAAGGGG
-GTGCAAGGCTAATAGGAGGAGACAAGACAAATAGAAAAACTACATTATTA
-TATGAAAAGAGAGTAAGACTGAATACGTGTATGGGCACCCCACATATTTG
-TATGTAAGTAGTTATGTAAATGACTTTTTGGAATTGAAAAGAAAATACCA
-AGAAATGGAAAAAACCTCCGGTCAATCGTAAAAAAATTATGAAAGAAGTT
-CGATCTACTCGGCTACGATTTACAGTTTCCCTTACTGATTTCTACTAAAA
-TGCATTAATCTTGAGTTTATCTCTAACAAATTGATGGTACTTTTGAATGG
-TTATAACACCGGATATTTTGCAGAAGACGAAGGATCAGATATGTCGATTA
-TTGTGGCCAGCCTCACGCAAATGTGCTGTGATCCATTTTACAGAACAACT
-ACGGGTGAGTTTATTAAATGTTTTTTCTGTACTAAAAATGGGGTTTAAAA
-AACTAATTTTAATTTAGTTCTCTCCTTGTATTAATTTCCAAAATTTTCCG
-AAATTTTTTTTTCAATTTAAAAATCAATTTCAGGTCTTCAACAACTCATC
-GAAAAAATGTGGATTGCCCTTGGCCACCCATTTGGTGAACGGCTACTCGG
-AAGAACCGACGATGATCCATCGAGACGTGGAAAACCACAGAATAAAATGA
-GAACTGACGTCATGCCGACGTGGTTGCTCTTCTTGGATTGTGTTTCACAG
-CTACATCGAATATATACATTTGAGTAGGTTTGGTAAAAAAAATGTTTTCC
-CCCGCAAAAAAATGTTTTCCTCAAAAAATTTGAATTTCCCACCCAAAATT
-TTTCTCAAAAATTTTTTTAAAAATTAATTTTAAAATTGTTTTCTCAAAAA
-ATTTGAATCTCCCGGATTTAAAAATTCCAAAAATTCGTCTATCAATAAAT
-TTTATATTGTTTTCGAATTTCGAATCATAAAAATTAGTTTCAAGTTAACA
-CACCTTTTTTTTCAAATAATTTTTTTAAAAAATAATTTTAAAAACAATTA
-ATTTTTTTCCTATTTCCAGATTCACATTCTCTCCACACGTTCTCATTGCA
-CTATGGGATCTTTCATTAACTGGAATGGTTCCATCAATGGCTTGTAATAA
-TCTGGAAGAGCAATTACTCGCAAAAGTCGGCGGTGGACCATTCCCATTGG
-ATCGATATTTTGAGAAAAGCTACTCGAAATTATTTGGAAATATTTGGCAC
-GACGCAGTGCTTTTTATGGAATCTATTAAGAAAAGTTGGTGCTTTTTAAG
-AAAAAAATTTTATATCGATTGTTCTTTTCTTTTTGATTTCAGCTACTTTT
-TCACCTCGGTCAGCAACATTTTTTTGCAACATTTTGGACGTGGCCGCGAA
-AAAAAAATTGGTGGCCGAGTTTTCTTTTTTTTCACTGCCATTAATTTCCG
-AGAGGAAAATCTAGGAATTAAAATTTTTTCGAAAGTATACAATGTTGACC
-GAGAAAAAATCGGTGGCCGAATTTTCTCTTTCTTCTCTGCCACGTTATTT
-TAGTAAAAAATTAGAAAAAAAAACACAAAATGTTGTTCAAATTTTGGAAA
-AAGTCTGTAAAAACAACAAAAAATTGATGGCCGAGTTTTTTTTCCATTTT
-CGCGGCCACGTGACAAGCAGTGATTTCTCAAATGTTTTCAGGAAAAAAAA
-ACAGGCGGAATTCAGATAATTCTACGAAAACTATTTTTGTTTCTGGAAAA
-AAGTCAAAACTTGAAAATCGGTGGTCGAGTGTTCTCTTTTTTTGCGGCCT
-TATCTCGATTTTTCCAGATCAACCAGTGTGTGCTCACTCGAAATTCCTTC
-AATGTGAATTTATTCGGCCACCGACGTCGTTTTGCGATATTCAACTGTGG
-TCCGAGTGCTATCTTCGATGGATTCCTCCGGCAAACGGGAAAAATTCGGG
-AAAACTCGGCGAAGAACTCTCGCTGGACGAGAAAATGATCGAAATGGCCA
-AAAAATGGAACAGTTCCGAGTGGAAAATGCATTTGGACCTACCGGAAGAG
-GTGACCAAACTTTTCGGATTTATAGGCTCTAAACATATTTTTACTTTCAA
-TTCTTAAATTTTTAGTATTCATCTGCATATCCTTACTCGATTCCGGAGAT
-TTCCCGCCCAATAATGGATTTAAATGATTTTGATATGATCCGGCCGGATG
-ATTTCGACGCAATGTCCATGAATTCATCCATCAACTCATATTCGTTCGTT
-AATACGGTAGGGATACTTATTAGCTCGGAAAATAAATTACGACATATTTT
-GTCTCGAATTTTTTATAGGTGACTTATAATAGACATTTAGTGTCTAGGCA
-CACATAAAAGTTAGATCTTTTTCAGCTATCGTTTCGATACTTTCACACAA
-AAGTAGGTTTTTTTTCGCAACTTTGTAAATTGAAAAATCAATAGGTCGGC
-AAATAATTGTTGGCGTATTTTGTCAATTCACGATATTTATCAAAAATTTT
-ATATGTGACTTCTGGTAGAAATTTATTATGGTTGGCAATAAGTACTGAGT
-CAAAATTCATATAACTTGTTTTGTTGCTTATCGATTTTTTTTAATTGCCG
-GAGTTCATGTTATTAACTATGGGCTTTCATCTGAAAGTAGTCACAAAACA
-TTTTAAAAACTCGAAGTGATCCAAGTCGAAACAACTTTTTCAAGGTTTAC
-GCCCTCTTATTTTTTCTCTTATTTTCAGCATTGATATGAGTTTATGTACG
-GATCAAGAGTGTCGGTTTTTCGATTTTTGTATAAAATCGAAATTTTTTTT
-TTGATTTTTCGATTTTCCCTGAAAAACACACAATTGAAAAATGTCACTCT
-TGGTACGGATATTGCTAAATCTATTATACAATGTGAGAATCCAATAAAAG
-TTTTATATTTTATTTTTGCAGCCAGTTCGTAACAACACGACAACAGAATC
-AATATTCGATCATTCGACACTTGAGAAACGAAATCGTCGAGCAGCTGCCA
-CAATTGGCTCCGAATCGCCAGTTATTCAAATGAGACCAAAAGAGCAAATT
-GTCGGATATTCGAAATATGCATTTGATGATTCATTATCACCAAGACCACA
-TTCCCGAACTGTTGAGACGCCTATTTTAAAGAATGTACGGGATTTTTGGA
-AAATTTAAAATTTGGAAAATGAAAAATTCAAACAAAACAATTTTTTCGCT
-TTCAAATTTCATAAAAATTTATGTTAAAAATAGTTTTTAATTGAATTTTT
-AAAAAATTCTTACTGAAAACTTTCGAAATAATTAAAAAAAAAAACCAAAC
-TATATTTGTTTTTTTATTATTGAAAAAGTTAAAAAAAATGTTTTTTTTTG
-ATAATTTTACACTGCTCGCCTTCAAAATTTGATGAAAATCTTAATACTAG
-ATTTTTTTAATTTTTCATTTAAGACTTTTCGAAAAATTCGAAAGTTCAAA
-AAAAAAAATCCAAAAAAAATTTCACTCAAATCAATCGCCTTCAAAATTTG
-ATAAAAACTCGATGAAAATTTTGTGGAATTAAAATGTTTAATTTATCATT
-CTGAGGCACCACGTTTTCAAGATCTGGTGGGATTCCGGATCTACATTCTT
-CATTTCAGCGCAAAATCCCTAAATCCGGAATTCCACCGAATCTTGAAACC
-GTGGTGCCTCATCATTCTACCTTTAAAAACTCGAAATTATAAAAAATTCT
-GCAAAACTCTAAAAAAATTTGATTTTCGATTTTCGAAAATTTATCTTTTT
-TTGTATTTAACATTCAATAAAATATTGATGAAAAAATTTCTAGAATCATA
-TTTTTAAATTTTGCTTTACAAAATTTTTTAAAAATCTACAATCGTTCACT
-TTCTTGCCTTCAAAATTTGAATGAAGAAAAAATTTCAAAAACTTTAAGAA
-TTAAATTTAAAATGTGCTCAAAAAATTCTTTAAAAATATGCGTTTCCCTA
-ATAATTTCCATGTTTCAGTCCCCATCGCCCTCCTACACCCCATTTCACCC
-GACGCCCGTTCACCGGAGCAACACCGTCCGTGCCGACAATCGCCCAATTC
-CCCCGCCCCGGCCGCAGGGCCTAGGAACACTGACCCCATCACGCCCCGAG
-ATAAGAGCTCATCGAGATGATATAGAGAGCCCTACTATTCGGGTCACAAG
-ATTTTGAAGAAAAAGTTATACTTTTATTTTAATTTCCGCTCAAAATCGGA
-ATTTTCTATAAATATGCCCCTTTAAATTGAGCTACAGTAGTCACGTCGAA
-AAATTTTCAATTTTTTTGAATTTTTTGAATTTTTTCATCCAGTTATAAAA
-AAAAGCTTGCCCCTCAGCTCTACCCCATTTTTCTTTCATTTGTCACCTAC
-TTCCTTCATATATGCCCGGTTAATTATGTATTTTTTGATGCTTTTTTAGT
-CCCGCCACGGTTTTTTTCATTTCGAAAAGTCGATCGATTATCGATTTTTT
-CGAAAATTTGGAAAATTTGGAGAAAATCTAAATATTATCGATTTTAAGCT
-AAAATTTTAAGATTTTATTTTTTCAAATAAAATTTTGGAAATGTTTTTTT
-GAAAAAAAAAGTGCAAAAAACACTCAAGGGAAAATTTTTAAAAAATTGGA
-AAAAATCTTGAAAGTTTGTCGATTTTTCAGTGTGCATTTTGGAGTTATCG
-GTTTTCTTTCCGAATTTTCATCAAATTTATTTTTGATCTACCAAAAAATC
-TCTAAAACCCCGTGGCGGGAACCTACTTCACTTTTATTCTGCATAATTAG
-ACAAAAATGTGATTATTTTCTCATTTCAAAACTTGTTACATATTTTGTGT
-TGTGATACATATGTCTAAATTTTTACGGACTGAAAAAATACTTTTTTCTT
-AATGTTTTTGAAATTTTCATTATTGGTGGCGTCATCCATGTCTATTTGAT
-TTTCCAGACCCCCCCCCCCCCCTCTAAAATGAAAAGAACAAGACGATTGA
-CAGCTAGCATGTGCGACGATCAAAGTACCGATTTGATTCAGTTGAAGGGA
-CACGAGAACGCGAAAAAGTCGGAAGCCCATCTGAAAGTGCTGGAATACAT
-TGGCAAACGCTATGAAATTCGAATGACCGACGGGCGGTACATACGTGGCA
-CGATGATCGCCACTGACAAGGACGCTAATATGGTTTTCAACAAGGTAAAA
-ATTTGATGAAAATTTGGTCCAAAAGCTCATAGTTTCAAATATTTTTCCTT
-AAAATTATGCGCCGCAGGCAAAACAACATTCCGCCTTTTTCTATTGCTGG
-CTTAGTTTTCGCAATTTTCTCGGCTACCAGGCTACTGCAAAAATGATCGA
-TCCGTGAATTGTGCAAACATCTGAGTTACACAGAGAGTGGGGCGGAGCGG
-AACATCGCAACACTGCCGCATGGTTTTTCCACAACTTTTTTTTTCAAGAA
-AGTTTCGATTGTACTTGTTTTTTCTCTTTTTTGTATAAAAATGGTATTCA
-TTCTAAATAATTCACATATGCTAAATTGCATATAAAAACATGGAATATCC
-TCTCAAATTAAGAGTCTTAATCTTATTAGAATTAAATTGGATATCATTTT
-CATTCGAAAAGAAAGAGAAAGAAACAAGTAAAATCGAAACTTTTTTGAAA
-AAAATGCTTGATTTTATTTCATTTTCGTTGTTTTTTTTTCAGTATTTAAC
-TTTTGAACGATCGATTATTTATAAGGTTTGCGGTTAAAAACGATGAATTT
-CGTGTTTTTCTTTTCTGGATTCAAATGACAAGTTTTAACCAATTCGAATG
-TCAAACACGGAAAAATAAGCGAAAATAACAAAAAATCGTGTATTGTAACC
-AAAAAGTTCTCCACGAGTAGTACACTAGAGCCGACGCGCCGCAGGTTTGC
-AAAACAACGCCCACCCCGTTTTCTGCGCGGCACTACACAATTTTCTATCT
-CACGAATAAATATTTCAGAAAAGGCAGGATTTTGTCTGAAAATCATGAAA
-AATCAAGTTTTTTTCAGGTTTCCAACGCTGAAATGGTTGGAATTAGGGTT
-TGTTACCAAAAATCGTATAATATTAAAATCCCAGTGCTTCTCTGTCTTTC
-AGCAATTTCTTTTAATTTCCAGGCAGACGAGCGATGGGACAAAGATCCAC
-AATTGAAAGGAGTCCGATTTCTAGGGCAAGCGATGATCTCGAAAAAGCAC
-GTGGAATCGATGCACGCGTTGCCGGACCCTAAAGAAACTGAAATTTGATC
-CAGTTTTCTTATTTTCTCTAATTTATCCCATCCTTTTCTTGTCAAGATTA
-ATATAAATTAATTTTTATCGAAGCGATTTTTGTTCATCTCATCCAAATAT
-GAAAAAACATTCGAAAAAAAATCGCAGGCTTCACTTGGAACCGCGCGCCA
-TCAGTTGAAAATGCTGAATATGTACAAAGACTGGAAAATATTAAATTTTT
-ATGTTTAAAATTTCACGTTTTTCGTGTTTTCCACAAAAAAGCAATGCATT
-GTCGTTTTTCAAAAAACACTCATGGTAAACGAAGTCCCCGTGGAGTACAC
-GACAATGTCGCATCGAGACCCAAACTGGGAAACGCCTGCGCCTTTAATTT
-TAGGAGTTTAATTTTCGAATTTCGAGTTATTTTTTTCTCAAGTCTTTTTG
-CGACTTTTTTTTGAATATTTTATTACTTGTAGCGCTGAAATATGACAGTT
-ATTATAGCGTCACACTGGGGACCTCAATCAAAACAGGTATTTTTCAAAAT
-TTCGCCGTAAAATCTAATAACCAATTTTGAGATGTTGCCACCCGAGCCCC
-CACGGATAATTCTGAGAGAAGTTCCGGTCCAGAATAACCAGAAAGAGCAT
-CCACCGGTTCAGGAGATCAAAACCGTGTCCAGCAAGTCGAAGGAACATCG
-CGTCAGTTCGAGCCGGAAAATTCCGGATCACTTCGACGTGGGCCCACGGT
-TCTACATGAATGTCCCCGCAGATGGCTCAGAAGTGTTCGAGGACGACGAA
-AAAGACGTCGAGAACGAGTGTTGGGCGGTGATCGAAAGAATAGGAAGCGA
-GGATGACAAGTTCGAGGCCTCTGAGCTTGTCGAGTACCGCGATCACGATT
-GGTACATCGCTTTGGCGATTAATAAGGAGAAAACGCCGGATAAGGCGAAT
-TATCAAGTAGGAATTACGAAAAAAATTTTGATTTTCAATCTCATTTTTTA
-AATTTCAGCACCTACTCTACAGCTATCGAGGCGGAATCCAACGCATAATT
-CTCACGCCTCAACAGACGGATTCGATCGACAAAACGCCGCTAGTGAAGTA
-CAAAATCATCGGAGACGGTCTGTACGAAGTGCTTCCGATTCACTCGTCCC
-TTCCTCAAACTGGTCTAATCAGTCCCAAATATCGTTACAACAAAGGCGTC
-GAGCTTCGGATTTTCGGGATAGTGAATTGGATTGATTTTGTGTTGGACGA
-CGATCATCAGACGCACAGGACGATGGTTTGGACAGATGCGGTCGGACCGA
-TCTATCTGAGTGCCGCGGATCGAGCCAATATTCGACGGAAGCTGCTGCTG
-ACCGAGATGCAGATTTTCGCGCCGTTGCGAATGTGCCATATTACTGTCAA
-GGCGGAATTTAACTTGTTAGTTAAAAAAAACGCGTAAAAAGAATAATAGT
-TCCAAATTTTCAGCTCGATTCCCGATGGTTCCCCGATTCAATGGACCATA
-TCATCGTTCCAGCCACTCATCGAAGAATCAGAGAAGGATCCGAATATTGG
-GCGCAATTTATGGCCAGCGAGAGTGCTCAGATTCGATGATTTAGTCGTTA
-CAAAGAAGGTGCTTAATCATTTTAATATTAAATTTTAACAGCATTTATAA
-TTATTTATCTATTTCCAGACACCGAACGGCTACTGGCTGAAGTCTCAAAG
-ATTGGAGGGTCACGTTAATGTGTTCGCCGGTGCAAATCAAATCGGAATCA
-TTGAGTCGGCGGGTGAAAAATACGCGACGAAGGGAAGCATGATGGCGTTC
-GTGGTTCCGTGCTATCAGAACAGCACGTTTGCATATTTCGAAGCACTTAT
-CGCCGGACCCCCGCGAGTCGTGATGATTATTACCGAAGGACGCTTTCTGA
-ATTATTGCCCGAAGACGTGGCCACCGTCTGTTCGGAAAATGCGTGATCAG
-TATCAGAAAGAGCACGTTGTAAGCACAATTTTCCAGAGAAAAAGGCTTTC
-GATAAATTTTCTTATTTTCAGCTGAAATCCGAAGTCCGAAGTTCACCAAT
-CTGCATGAAACAGCCGGATTATTGCCTCAAATCACTACGAGGATTCAGCG
-AGTGCCCATTTTGATCACTCAAAGTTTTATATATTTCTGTATTTCTTCTG
-CCTTATTTTAAAAAGTATTTTCCCGTTTTTTTTCTTTTGTTCAATTTTCC
-CTTTTTCTTTACTTGTTATGTCCTATGTTTCATGCTAAATTAACGTATAT
-TTTTAATTAGCAATTAAAAAACTTTCTGATTAACTGCCAGTTTTTGAGAA
-GAACCAGAAGATGGAACGCAGGCGAGTTTCTGAAACGGAAAGGGTTTGAA
-ATTTTTATCAATCAAACAAACTCGCAATTTTATCAAAAACCATGCCGTCG
-TTGCAAGTTTGAAAAAACCACATATATTTGCAACATTGATAGAATATCAT
-TGGATCGTATGGATCCGCCATGGCCAGACCATCATATTGACATGTACCGT
-TTAATGGGTTCGGTACCGCTGAAAAGTTGTTGGTCTCGCAGCGAAGTACT
-ACAGTAATCGGGAAAAAGCGCTGTTTATTATCGATTTTTCAATTAAAAAT
-CAATAAACTCGCCGCGAGATCCAAACCTCAACTTACGATAGCTTTTTGTA
-GGAGTCGATTGTCCATCGACAAGGAAGCCAGCAACTAGGAAAATTTTGAT
-AGGGAGAAGCATTGAAATTTAATTGTTTTTGGGGGTTTCGTTTGGTTTTT
-ATAGGAATTTTTGAGCTGTAAGAAAACAAAGCAACATTTATTTCAATTAA
-AACCGGAAAATATGAGTCATTATGGGGGGTTTTCAACCGTACGGAATTTG
-ACAAATTTGAAACTACCATAAAATGGTTAGTTTTGTAGTTAGAGAACTCA
-AAATTGATTTTCTAAGACAAAAAAATTGCCCTTTTTCAGAATATAGTAGG
-TTTGTATAATTTCCAAAAAATTATTTTTCTTGCCCAAAAAAAAAAGGACA
-GTCATTAGATGGCTGAAAAAAAAGTGGGCAAAAATAAAAAGTGTCTAATT
-TTGTTGAAAACGGGTAATTAATATATGCAGAATTCAGAAAATCTAGGTTT
-AACCCATCAAAAACCATTAAAAAGTGGCAAAATTTGGCAATTTTTGCAAA
-AACTCACAATTTTGAAACTCCTCTAAATTGGTTCAATTTGTAGCTAGAGA
-ACTTAAAATTGGTCTCCAAGCCCTAAAAAATTGTCCTTTTTCAAAATATA
-ATAGTTTTAAACGTTTTTAGAAAATTTATTTTTCTTGCCCAAAAAAAAGG
-ACAGTCATTAGATGGCTGAAAAAAATTGGGCAAAAATAAAAACTTGTCTA
-ATTTTGTTGAAAACGGGTAATTCATATATGCAGAATTCAGAAAATCTAGG
-TTTAACCCATCAAAAACCATTAAAAATCTAAAATGATTAATTTTCTAGTT
-AAAGGATTCAAAATTGATCTTCGAACACTAAAAAGTTGTCAAGTATCCAA
-AAAAAGTGGTTCAATTTAAAAAAAATTGGTCAGGGAAAATTATCGATTTT
-TTCGCCGCTTCGCAACTTGGACGAATTTTTCTTTCGCTGCACAAAAATCA
-ATAATTATTGATTTTTTTTCTAAAACAGAAAAATAGATATTTGCACTTTT
-CTGAAAAATCGATATTAAACGGAAATTCGCAAAAATCGATGGTCACTAAT
-TTTTTTGCAAAACCCCAGTAAAAAATCGCTTTTTTCGCCGCATTTCCTAA
-CTTTTTCTATGCCACCACTATTGATTTTTTTTCCAGAAATCTTGGAGCTT
-CCCAAACCCGCTCATCAGCCCGCGTGCTTCATCAATCATTCCGTTGAGAA
-CTATGAATTTTTCGAATGAAAATTAAAAAGAGGGGGATTTATTAGACTGA
-AAAAGTGTTTTTGTGCCACGTGGCGGCGGCCGAATTCTCCTGGACGGGAA
-TTTCTAGGCCATGCTTGGGGGAGATGAGGAGATGGGGGTCAACTTCAAAT
-GTGTGTAACAAAATAGAAAAAAAACTATAAAAGGTAAGAGGAGATCAAAG
-GTCACGCCACTAGGGCTTGAAAAATGAATGCCTGCCTACAAATAGACATG
-TAGGAATGTAGGCAGGCAGACAAAAAGTGGGTGAACAACGAGAAAAGGCA
-CGTAAAAAGGGGTAAAGGTTAGAGAAAAAGAAAAAAAAAGCTCACAGAGC
-ACATTAAAAATGGAAAAAAACGAGATCATTGGATATTCTGCTGCCGTTGA
-TCATCGTCATCATGAATGATCAGCTGATTGGGGTCGACTATCACATCATC
-TGGGTTCACGAGAGCATCTTCTTCGAGCAGCTCATGCGGAGGATGATCGT
-CGTGATGATTTGGCTCTTCCACAACCACTTGTTCGAGGACATCTGGAATT
-TATAGAATTAAAAAATACATTTTTTAGACAAGAAATCGACAAATTTCTGT
-GTTTATTTCTATTTTTCAGATAATTCCACACAATTAGATAGTTATTGAGT
-TTTCTTTCTATAAATTTCAAAAAAAAAAACGATAATTATTGATTTTTTTT
-TAAATCAAAAACTTCACAAAACTCAATAATTATATATTTTTCGTCCTCAT
-TCTCTTTCGGTTTTGTGTGTGTGTGAGTTTTTTTGAAAAACGCAAAATTT
-TCTGTGATATTTCTATTTTTTAACCTGACATGGGCAGTTTTTGAAAAAAT
-TTTGCAATATTTTCGGTGTTCTTTCTCAGAAAAACTCGAAAAATTGCAAA
-ATAAATGTAAAATTTATCAAAAATTACACATTTTCGGTCAACCTTTTGCT
-CAGAGAAACTAGAAAAAAAATTTCAATTTTTTTGGAAACCTGCCAAAAAA
-TGAAGTTTCAGTGAAACATTTTTTTTATCTTTTTTCGAAAATTTAATACA
-TTTTTTTGCAATTTTTTAATATCAATCCGTTCTCACATTTTTTGGTAAAA
-ATATGAGGAAAATGAATACATTTTGGATTTTTTCAGAAAATCTGTTTACC
-ATTAATCTGCTTCTCCCCAGTATAAACTTTAGGCTCATTCTCGTGCACTT
-CTTCTTCCAAATTAACATCATCACCAACTGTCCCAATAACTTCTTCCTCG
-ACAATTTCCTCAACAATTGCTCCATCAGGAGCCATATGCAAATGCATTTC
-TCCATTATCCATTTCTTCTCCAGCCATTATTTCGACTCCAAACGTGTGAT
-TCACTATTTGCAAGAGACGATGTTCGCTTTTTTCGAAGAGCATTTTGAAG
-AGCAAATCGAATGTCTCGTTGTCGGTTGCTGAGCCAAATGAGTTCTTGGC
-AATACGGAAGAGAGCCTCGTTTCGACTTGTTCCACGCGCCATTCCAGATT
-GTGATAGAGGCTGGAAATATTACTATTTCAGATTTTTAGATTAAATGTGG
-AGCTGGGAAATTCGAGTTTTCGACGAAAAAATAGCCTTTCAAAAGATTAT
-TTTCAGATATGTTTAAAAAAATTCCGTTGAAAACGACGAAATTAGATAAA
-AATTGGATTTTCAGCACATACACGGGCGTTTGATTACGTGGCCGTGAAAA
-CGGAGAAACTCGGCCACGTAGAAACAAAACCGAAAATTGCAGAAAATCCA
-GGAATTTTTTTTAATGACTCCGAAATTTCCCCGATTCCGAATAATATATA
-TGAATGAATATATACTTCTGAAAAATTTCAAAACCTTTGCTCACCAAGCC
-ACTACTCTGCTGCCCAAAATTTTTAGGCTCCTGATATTTCGCCTTTCTAT
-ACGGCAGCTGAATCTGTTGCTGGGATGATGATGGTTGCTGAATCTCTTCG
-GTATGTGAAACCTGAAGCTCTCGCTCGTCGAGCATCTCCTCAAGATGCAC
-ATTTTTCTTTCTGGATCCTCCTTCTGAAGCTTCTGCTGAAGCTCCAGCCG
-TGTCAGTCGTCCAATCATCCACAAAATCACCCGCCGCCGCCGAAACAATC
-ATCTCATTCTTCAACTCGTACGGATCATGATCATCTTCAGCATCCCGAAT
-ACCATCAGTCGCCGCCATAATCTCACGACGTCGTACATAATAGAGCATCT
-TCGTGTTCACCTGAATCCCATACTTCTCCAAAATCACTTTAGCCACCTCG
-GCAGGTGTCATTCTCGCGAGCAGCCGGAGCACATCCTCCCGAATGTGTGG
-TGGAAGACGTTGAAGTGAGTATTCTTGAGCGGAGCTCATCGTGCTCACGT
-TAACCGGAGCCGGCATCTCGCCGGGCTCAGTGTACCAGTAAATGATCATT
-GCGTTGCCGATTTGATGGCCATTCTTCAACACGTACGTCACCTTCTTGCG
-AAGACGTGGACAACGTGGAAGGGTGGCTGTGTAGACGTGAAGCTGGAATT
-CGATGAGATCCGAACGATGGGATGATGGTGTCTTCCAGATGCGTAGTTGA
-CCTTCTCGATTCAGTGCGAGCGCTTGTTTCGCAGATTTTGGACGTTTTGT
-GATGCCGTCTGAAAAACAGAAAAAAAATTAAGTTTGGAGCATCTTGAATT
-TGCCTTTTTTACTTTCGGAACGTCCCACTTTTGCTGATTTTTCGTGTTTT
-TTTTTCTGGAATTTTGGAATTACAGGGAATATCTCTCCAAACCAATTACA
-GGGAATATCTCTCCAAACTGGCCGTCGCAGGAAGACTTCACTTTTAAATT
-GTTTTACCTGTAGGCACAAAAGCAAAAGAGGAGAGCCTACATCTTTGTAT
-CTTCGATAAATTCGTTAAAAGTTCTTTTGTCTTTATTCATTTTTCAAATT
-ATTTTCCAATGTTTTAAAAACATTTTTTCTAAACTTTACAGTAATTTGGG
-CTATTTTCACTATTTTTCAACTTTTTGACGCGTTTTTAATTCTTCATTTC
-AACCTCATTTTGTCCAAACTTTCTCAAATTTCCACATAATATGGCCGATT
-TTCATGAAATTTTCATAATTTACACCAATATATTCAATTTTTAACCTCAT
-TTTTTTCACAGAAATTCCCAACATTTTCACATATTTTTCATGACAAATTT
-GAATTATTTCAATGTTTTCCAAACTTACGAGGATTGGTGCTAGTATTCTC
-TGACCACGGAACCAGTCCATCACACGTCAAATTTCTTGCATCAACCTCGA
-GCCCATCAATAAAGAAAACGAATGCGGCTTTGCCAGTTGTGGCTGGCGGA
-AGGGCCGGTACTCGATTGTTGAGGCATCCGAGGGACTCACTGCAAAAAAA
-TCATCGTTTTTTCTAGAAATGGATCGATGTTTGTGTAACTTTATCGATTT
-GCTAGAATATTATCGATTATTCCGAAAAAAAATTTTAAAACAACAACTGT
-ATTTCTATTTTTATTTTTTTAAAGATAGACTTCCAGATCATATTTTTTTT
-GAAAATTTATTTAAAAAATTATCGATTTCTCTAGGAAAAATATCGGCTAT
-TCTCGAAACTTGTGGATTTCCCTAGAGATTTATCGATTTCTGAAAAAATT
-ATCGAATTTTCTAGAAATTTTGCAAATTTTTTCATAAAATTATCGATTTT
-TCTGAAATATATCGACTTTTCGCCCAAAAAGTACGTACATCAATGAAGGC
-TTATTGACAAGAAAGTGTAATTGTCGATTCCTATCATTCCAGAACTCCAT
-ATCCAACAGCTGAAGATACAAACTACCATCATCGGCGGCTTGTGCTGGCA
-CAGCAAACGGGCATTCTTTCTCGCATTCCGACATATCCGACACATCATTA
-TCGATATCATGTATCTGCGTTGGCTGGAAAAATGGATCCTACACGCGTTG
-AGCACACACTTTGTGAGCTCTGCGAGAGCTCAATGAGAACCTACCGGTCG
-TTTTGTGGCTCGTTTCGCGAATCGTTTCAAATATCCGCCATGCATTCGTG
-GTAGCTCGCCTTCCTGATTATAGTCGTACATGATGAGCGCATGGCTCACC
-ACGAGCCGTGATTCGGTTTCCATCATGTAATAGATTTTTTTGCGTAGTCG
-TGGCTCGCGTGGATTGATGGAATACAGGAATACCAAGTGGAATGGGCACG
-TTTTGTAGTCCATGTTGTCTTTGGTCTGTGAGGGGTTTTGGATATTATTA
-CGGGAGGCATAAAATTCTGAGAATGCGTATTGCACAGCATATAGACCAGA
-TCCGTAAATCAACACAAGCCCTACAGTAGTTATTTAATAAATTACTGTAG
-TTTTTGCTGCGAGATATTTTGCGCGTCAAATGTGTTGCGAAATACGAATT
-CTCAGAATTTTTTGTTCCTAAGAACAGCTCGTCAATTTTTTTTTCAGTTT
-TTCAGGGTTATTCAAAAAAAACCTGTTTTTAAAGCTTCTAGGTCTCATAT
-TTAAAAAGTTTTGAGAATTTAATACATTTTTTTTAATAGAAATTTGGCAA
-TTTTTTCATCACCTCATCGTCGATTATTCTTTTTGAAAAATTTTCGATTT
-TTATGGGAATATATTTATTTTCCAAGAAGATTAACTTTTTTTCAAGAAAT
-CTGAAAATTTATCAATTTTTCAAAAGAAATTAATGAATTTTATCAAAAAA
-AGAATAACTTTTCCAGAAAATATTTTTTTTTCTTAAAAATTAAAAAAAAA
-TTGTTAAATCGCTTTTTGTGTCAATTTTTCAAAAAAAAAAAAGAGGCATC
-GAGAATATCCCATTTTTTTCGAAAAAAATTTTTTGGTTATTTTTCTTTTT
-TTAGATAAAATGTATATACTTTTTTAAAAATGTTTTTTCACCAACAAATT
-TTGATATTAAAAAGTTGGAATTTTATGACTAAATTATGGAAAACTTTTTC
-GATTTTTAGAAAATCGGAAAATTTTGAAAGTGGGCGTCGTCAAAAAATTT
-AATTTTTTAAGAAATTATAGAAAATATGCTGATTTTGGTATTTTTGGAGA
-GCGTCGATTTCCATCGGATTTTTTTGGTTGTTTTCCCTGGGATCCATGTA
-ACACCTGAAACTGTGATCCCAGCTCATCACAAATCACTCCGACTTTGCGA
-ACTTTCGTCCGATAGCACGTCGGATTCTGTGCATTTCCATTATGAGACCA
-TGGCGAGAAGTCGTCACGATTGATGTCGTGTGGAAAGATGGCTGTCCCGG
-CGACGAAGAATGCGTACGCACGAGAATTACGAACAATTGGTGGGTGTCCC
-GGCTTCGCGTAGTTCAGCAGACCACGTTCTTCGCTGGAAAAATGATGATT
-ATATCGAAACATTCGAGGAAAATGGATAGAAAAAACGAAAAATTCAATTT
-TTATCAAAGTTCGTTTATGTTGATGAAAACATTATTACGGGAACACAAAA
-TTCTGAGAATGCGTATTGTGCAAAGTATCTCGTAGCGAAAACTACAGTTA
-TTCTTCAAATGACTACTGTACCTATTGTGTCGATTTACGGAAATAATTTA
-TAAATCGATAAAACAGTAGTTATTTTTAGAATTACTGTAGTCCTCGCCAC
-GAGATATTTTGCGCGTCAAATATGATGCACAATACGCATTCTCCAAATTT
-TGTGTTCCGTAATAAAAAATAAAGTTGTTAGATGAATATTCAGGGTCTCA
-ACAAAATTTAATCTGTGTTTTCAGTTTTCATGTTTTTAGAGTGGAAAACG
-TTTTTTTTTCAGAAAACAGTCAGAAATGTAGATTTTGTTCCATATTTCAA
-AAAATCATTTAAAAAATATAGAACATTTTTTTGAAAAATCAAATTTCTCC
-AGAGTGTAGTACGCCATTAAAGGTCTCGTCACGATTTTGTTTGTTTTCAA
-TTTTTAAGTTTTTGAAGTAGAAAATTATTTTTTTTAGGAAAATTTTTCGT
-CGATTTCGTTGAAAATTCGCTAATAAACGGGGATTAAAAAAAACGAAATT
-TTCCAATTTTTCGAAAAAAAAAATCGAAAAATTCCTCCCAAACTTACACA
-ACATTGGTATTAGCAATCCACTCCAACACGGCCTCAAACGTGCTGGCGAC
-CCTCTTATGTCGAACAGTCAAGTAGATATGTCCCGTTTCCAATTGCCGGG
-GATTCTCAAAATAGGGCGCCGGGTTCTCCTGCTGAGTAAGCGGATCATCG
-TCAAACTCCAAATCGTAGCCATTGTTGAGCACATCCTCTTGAGACATATC
-CAACAAATCATCGTCTAGCAGATGTCCCTGAGCGTCTTGAGCAATCGAAA
-CATCTTGCATTAGCTGATGTTGCTGCTGCTGGTGCTGATCGTGTTGAAGC
-TGGATCTGATCTAGGGAATCATTGTGATGTCCGATGACTTCTTCTTCCAC
-AACTTCCAAATCTTCTACATCTATAAATTGTTCTTCATCATTCGGTGCAG
-CAGATGATGTAGATGGATCTTGTGATGTATCAATCTTCTTCTGATCGTCG
-ATCCATTTCGATCCTCCAACACCTCGTCCAGGTGTTCCAGGTGGTTTAAC
-ATACGGACACGGAACCGGACCATCTCTCACATATTCATAGATATAACACA
-CATTTCCGATCGTAATCGTATTGTTGCGTTGAATATAAATGAGACGCTTC
-CGAAGACGGGGACATCTCGCCAGGACGGACATTGTTTCGACGAGACACAA
-CTGTGACGAGTGCCAGCCGCCAGCCGTGTCTTTTGCCATTTGGAACTGGC
-CGTTGTCGTCTTGGACGATGGCTCGGCGAGTTGAGCGGACGCGGGGTGAC
-GGACCTTCCGAGGCAGCTGAAATTAATGAAACTACGGCACTCTGTACATC
-TCCGGAGGCACCACGTTTTCAAGATCTACCAAAACAAGATCTACTATTTG
-GAGATCTACGAAAACAAAATCTACGTTTTCAAGAAATGGTACCATGCTAA
-TTGCAGTTTTCGCAGTTTTCTCGAAGAACAACAAATCAACAATGTTGACC
-GCCCAGTGTGCTCCGATGTCGCGTGTTGTTTAGCGTTTAGAAAAATCTTT
-TTTGAAAGAAAAACTTCAGGAGAACGATAAACAACGCACGATGAGTAATA
-TGGAAGAATTTTTGTTTCGTTTTTCTTTGAGAAAACTGCGAAAAAGTGCT
-AGATCCTGAAAACGTATATCTTGTTTTGGTAGATCTTATTTTCGTAGATC
-TTGTTTTTGAACAGATCTCGAAAACGTGATGCCTCAATCTTCTGCAGTTG
-CCGAATTTTCACATTTTTAAACCTTAAAACATATTTTTTCTAAAACTTTT
-CCAAAAATCGATTTCTTCGTTTTCACGATTTTTTTCAGAGAAAATATAGA
-AAATCGAAAATTTGTAAATTTTCGATTGAAAAAATGGAAAAATTACAGGA
-AATTATTGAAGATTTAAACTTGTTTCTAAACAATCGAAAATTATCGTTTT
-TTTTCTTTTGGAAATTTTTTTTTGGATTTTTCCCAAAATGGTGGTTTTTG
-AAATCAAAAAGCGTTAAAAACAAATTTCTTTTAAAATTACCGGAAATTAT
-TTTAGAAAATTTCCGAAAAGTCAATAAATTAAAAAATCGAACAAGAGAAA
-GAGTTATTAAATTAAACAAAAACAATTTCACAAAAGTCGATAACTATTGA
-TTTTTCATCAGAATTTCCTAAAAGTCGATATTTTTAAACCTTCTGATAAA
-TTCTTTTTTTGTTAAAAAAAACTTTCGATTGATTAGAAACACGTTTAAAT
-CTTTAATAACTTCCTGTAATTTTTCCTTTTTTTAATCGAAAATTTACAAT
-TTTAATTTATTCTTTTAAAAAAATCAAAAAACGAAGAAATTGTTCGTTTT
-TTCTGGAAAAATTAATTCTTCGGCTCGAAATTTCGATGATTTCTTTTTAG
-AAAAAAATATATGTAAAAAATTATACAATTTCAAATAAAACACTGTTTTT
-TTTCTTTTGATATTGAAAATAGTAGAAATTTTTCAATAAAAATTCCAATT
-GTTCACTCAAAATTTCAAATTTTCGACAAAAAAACTTACGATTAACAGTC
-CACGGTGACAGTCCATCGCCAGTATGATTAATCTGATTTGCAACAAAATT
-CGCCGGCACAAAGTACACAAAAACGCCGGTTGTCGGAATAAGTGGCGGTA
-GGTACGGTGTTCGGCGATTCAAACAATTCGATTGGCTCAGCAGCTCGGGC
-TCATTCACCAAATATCGGAGGAGAAGCTTCTTGTTGTGTGCCCAACCGAG
-TTTTGCAAGTTTTACGCGAAGAAACATTCCACCACGTGGTCCTTCCACTA
-TCTCGTCTTCGAACTGGGAATTTTTTTTTGATGAATTTGAGAAAAATAGT
-TTAAATCTTTATATTTCAGTTTGAAATCGCCGAATTTCAGTTGTGCACCT
-TCGTGTATATTTACGATATGTTTAATCTTTTTCGGATGCTGATTTCCGAT
-CTTTAACGGTTTTCCTTCATTTTCGTCGGTTTTTTTTGGATATGTGTTTT
-TGAGGTCAATTAATGAACCATTTTATTATCAGAAAACTAGCAAAATGTTC
-AATACTCGACAGAAAATCCATATGCTATATGCTTTTCTCGACTGAAAACC
-GGAAATGTTGCTAGTTTTTGATAATAAAATGTTAAATTAACACATTTTCA
-AAAAAAAAACACTTCTACAAAAACCGACGAAAATTAAAGAAAATCGTTGA
-AAAAACGAAAATCAACACCCGATAAAGATTAAGCATTTCGTAAATATACA
-CGAATTTGGTAAATCGACACATGGCATCTCTAGCGCGAAAATTCGAAATT
-CGTAATTTCCAGCTGAAATATTAAATCAGGGAATTTTTCTGAATATTTCA
-CTTAGATATTCGGAATCAGGGAAAAATTTGGAGTTCTTATAAAAAAATTT
-ACTAAGCAAAGTTTTAGCAATTTAGGTTCTAATAGGCTTTACAAATATCA
-AAAAGTCCCGATTTTTCAAGGATCTATATATATTTTTAGAACCACAGATT
-TTTTGCTGTTTTTCAGCATTCTCGGAAGACCATACCGGTGTGGATCCGGG
-ATCATCCAGATCTAACGAGACGTGCGGATCAGTTGGATCGACCATCGCAT
-GTCTTAAATAGTCGTTTCCGTGCGGAAGATTTACGATTGGTGGAATTTCA
-CCGGGACACGTGTAGTCGTAGAGAATGAGCACGTTTCCATAGATTTGGCC
-ATCGCGGGAGAGGTAGAAAATCTGGAAAAAATTTTTTGAATAGATTTTTT
-CGCCTTTTCTGAAGGATTTTTTTTGAAATTTGAAGGAAGACGGGTTTTTG
-CTTGCATAGACTCAAAATAAACCCTTTAGAAAATTTTTACGTTGGCTCAA
-AATATCGAGAATAAAAACCAATTTTTTTCTAAAATTTCGAAAAAATGGGC
-ATAACGGCGGAAAATGTATTTTTATTTGATTATTGTACCTTTTTCAGTTC
-ATTTTGGAGCATTTTTGGCCCATAGGCTTAAAATTAACCTTAAACATTTA
-AAAAACGTGAAATAAGATATCAAAAAGCCATTATGGCCACTATGACCTAA
-AAAAAATATTTAAAAAAAAACAACTTTTTTTTGAATATTCAAATTTTCTG
-AAACTGATAATAAACCTTTTTTCTCAATCTTAACAGTCTCGGCAGCCACG
-CGCTGTACTCGGTGAGATGAAGTTCGGCGATACGTGGATCTCCTTTGACC
-GATTGGAGCCGTCCGTTGAGACGAGCAACCGGATGACGTCGGACATTCGG
-TTTGATGACTGGATCGTTGAAGTGTTGCTCGCCGCCAGTAGAGCTCCATG
-GCTTCAGATCGTCATTCGAGACGTCTTTTATCGACATGATTTTGGAGCCG
-TCCACGTAGAATGCGAAACAGGCTTTGTGTGGAACAAGTGGTGGGAGACG
-GGGTGGTTTGTCGAGAAGCCAACCTCCTTCGCGACTAAAAATGGGGACCG
-TTGATTTTTGTTTTTTTTTTCTGACCGATTTTTCGGACAATAGCTTGAAA
-TTTTGACAATTTTCTTTATTTTTAGAAGATATTTTTTTCTTATATTTTTT
-TTTCTCTAAAAACTATAGTAAAAAATAGTTCAATTTTTTGTGGTTCTGGC
-GAAAAATGTATTTTTTCGAAAAAAATTTTTTTTTTTCAAAACAAGATATT
-TAGATTTATCACTGAAAATTGCTAATTTCCAGTGCGAAAAATGACTTTTT
-CTGGCTATTTCTGCCTGATTTTTGATATAAATTCCAATTTTCACAATAAA
-ATTGCTGAAATTTTCTCCTTTTTTCACTGTCTCCGTACATCATTGCAATT
-TCGGTCTCGTTGGTGAGCAGCTCAATTATTCGTTCCTTTCTGAGAAGGTA
-GGCCAGGCAGCCTGATATCACTGTGGCGTAGCAATCACCGTTTTCCGTCA
-TTTCAACTTCATCTTCGAACTGCAAAAATTATAGAATTGAAAAAAAAAAA
-CGATAAAATCCGACTTTCTCGATGATTTTTATGATTTTTAACTGAAAAAT
-TGATTTTTCGGCATTTTCTGAAGGATTTTGATTAAAATTTGAAGGTTTTT
-TTTTCTCCCGTAGGCTCAAAAAACGCCCTTTTTATGGCGGCTCAAAGGCA
-AATTTTAAGTAATAATCGAATAAAAAATCATAAATTTACGACCCCTACGG
-CACGGGAAATTGGAGACTTCAGCTAAAACTAACCGTTGATTTTGAATATT
-TTGAGCCAAATTTGGCCAAATAGGCATTAAATGCACTCCAGATGACTAAA
-AACACGTGAAAAAAGCTATTAAAATTAGGTAAATAAGACAAAAACAGAAA
-AAAAAGAACTTGAAGCGAAACTGGAGCCCATTTTTGGAGACAATTCTCAT
-TACAAAATTGGTTTTTTGGGCACATTTTTTAGTCTTTCTAGTTATTTCGA
-ACATTTTCCGAAGAATTCCCATAAAACTTTGAAGCTTTTCCATGTAAGCC
-CCTACCAATTTCACGTGGTACTGCCTTTCAGCAAGAGCTTTACTGATAAC
-TCGTTCTCCTTGAACTCGGAACATTTTCGACGGTGTCGCCGCCGCCGGAT
-TTATAATTTTCATCGCCTTCTTCTCCTTATCCCCATCGTCGATAGACCCA
-TCGGTATCCATTGGCTTGCGTGTTCGGACACGTCGCTGTTTGCTGGGCCT
-GGAAAATTTCGATTTTAAAGATTTTTTAAATAAAAAATCCCCCACAAATT
-CATTTCCAAATCCGGTGGTTGCCCATCCATAAACCCGTCGTCCTCCTCCT
-CATCATCACCGAACGGGTCCATTTGTATGCGATCCTCGTCTCGATATCGG
-GAAAGGTTCAGAATTGGCGGCTCATCCTCTACGATGACCTCCGTCTCTGC
-GTGGAGCATCGAGTCGTCGCCGGCGAAGATGGGCTCTCCGAGCTCTCCGG
-CGGTGAGCTCCTCCAAATGTGGCGCTGGCTTTCTCTTTTTCGCGTTTCGA
-ACCGTACTTTCCTCCGTCCTGGAGCGTTTTGGAGCTGCGATCGAGCTTGT
-TGATGCAGAGGCGAGCGCTTCTTCCTTTGGGATGCCCAACTCGTAGTCTT
-CATTGTTGTAGAGCACGGATTTCCGAGCATTTCGACGTGGACGAGATTTT
-GTGGCTGGATCCTGGGGCTCTGCGGCAGGCTCTGGATTTTGCTGGGGCTC
-TTCGGCCGGCTCTGGATTTTGCTGGGGCTCTGTTGGATTTTGCACAAGCT
-CTTGATCAACTTCTTCCTGATTTTCTGCCAATTCTCCCGAATTTTCAGGA
-TTCTCGGACATTTTTCTGCAATTTAATAATTGAAAATAAGAATAATTAAC
-GGGGTGGAAAATTAAAAATTAAACAAGCATTAAAATAAATTTGAAAAAGT
-CCTGATTTGTAGTCCGCAACGCACGCACGCAAGCATACACCAGAACAACT
-AAGAGAGACGGGAGGAGAGATGGAGAATTTGAAAGAGACGGCGAGGCGAC
-GAGAGAGCCGGAGGATTGAGGAAGGACAAACACACAGATGTGGGGTCTTG
-CAGCGCTTTCTCTGCGTCTCTTTTTTCGACATTTTTCAATGGGAAATTTT
-TTTTTGGAGTTTTTCTTTTTTTTTATCGGAAAACTTCAAAAAATTCAAAT
-GGAAACGCTGTACGGACAATGCATAGAATAACACGCAAAAATGCACATTT
-TTAGGCCTTAGGTTACTGTAGTGGTCTCGGCGCGAAAATGCGGATTTTCA
-TTTTGAATTCAAAATAAAAAAACTGGACGTGATTTGGTACAAGCGTTTAG
-TGAAAATGTTTCACAAAATAGGAGATCAATTAGATATATTTATTTATTCA
-TGGAAAATGACTATTTGGAAAAAAATTGCGAAATAAATAAAACTCGATTA
-AAAACAATGTGCATATGTCTTCGTTGCTTTCTTGGCGAGGGTTTCTCGGT
-ATCGAGTTCTACAAGAGACACACATTACGAATAACCAAAATAGTTTAGGT
-AATATACACATTGGGTGGGGGTGGGCCAGAATAATATTGAATAAGGGTGA
-AGAAAAAATATTCAAAATACGTCGCTGAAGTTGGCATACAATCTTGAGTC
-GGATAAATGGTAAGAAAGCAGCACCACTCAACTCAGATCACAATCTTCTG
-AAGAAAAAGGGACGAATGTATAGGTTCGGAGGGGGGGGAGGGGGAAGGGG
-TGGGGATGGAGGCAATTACAAATAAATCTGAAAGAAAGTTACAAATACTA
-CACACCAAAACGGTGAAGACTTGCAAACGCAGTGCTTGCAAGAATTCGAT
-AAAACTCGCGGATGTTAAGAGCGAATCATTTGGATTTCGGGGGCAGTAAA
-TTAAATGGACAAGGCATTTCGAAAAATACACACGTTAGACTGAAAAAAAA
-AAACACGATGTGATTTATGGGATGCAACACTGCTTCTTTGGTGGGTCGGA
-CGCTGGCGAAGGAATGATTGTACCACTGCCACCGCCATATCCTTGTCTGT
-CAGTTCCTACATGCTTGTTGGATACTGATTTGTAGATTTCCGTCAGGATA
-TTAGTGAAAGCTGCTTCAACGTTGGTGCTGTCGAGGGCAGATGTTTCTGA
-AAAAAAAAAATATATAAACGCAATAGATTAGTTTAACTTACCAATAAACG
-ACAATTGATTTCTTTCGGCGTAGATCTTGGCCTCGTCTGTTGGAACTGCA
-CGCAAATGGCGCAAGTCGCTCTTGTTTCCGACCAACATAATCACAATGTT
-CTGATCGGCGTGATCACGAAGCTCCTTCAACCATCGCTCAACATTCTCGT
-ACGTCACATGCTTAGCGATGTCGTAGACTAGGAGAGCTCCGACAGCCCCA
-CGATAGTAAGCGGATGTGATGGCACGGTAACGTTCCTGTCCAGCAGTATC
-CCAAATTTGAGCCTTCACTGTCTTGCCTTCTACCTACAAAAATAATAATT
-TGAATCATAAGTGTATTCTAATGAAGTTCCTCACCGAGATGCTTCTCGTG
-GCAAACTCGACTCCGATTGTTGATTTTGATTCCAAGTTGAACTCATTTCT
-TGTGAAACGAGACAGGAGATTCGACTTTCCGACGCCTGAGTCTCCAATCA
-GAACAACTGAAACAATTTTTCGTTTGGGAATTGAAAAATGAAAAACAAAA
-TTACCCTTGAACAAGTAGTCGTATTCATCGTCACGAGAGCCCATCTTTAC
-TGCTGAGCTGTAAAATGATAAAGCTTGTTTGAAAGTTGTGTATATATTGG
-GACGATTGTAAAAAAGAAAAAGGGCATTGGTCACATGATTCATCAGCCGG
-GCGCAATGTTTTGTTGTAAAATCGATATTAAAAGAACGAGACACTGTTTT
-ATCGGCGGAGAATATTTTTATGTTCTGTTCCCGACACAAACGCGGAGTCA
-GGAACCGGTTGTCTATCTCGACGGGGATTGAAAAAATATAAGTGAACTTG
-ATTTAAGAATGATTCAAAGTATATGGAGTTGGGAGTTTTATATTGAATTT
-TATCAATATATGAGGGTGGTTAGTCAGAAGAAAAATGTGAAAATGTATAT
-AGAAGTGTGTTATGAAAGAGTATTTGAGGCTTATCATACCCGAAAAAGGG
-AAGGTGAGCGGCCGAACTTTGTTTGTCGACACGATTTCGAAATAGTTGAA
-CAGGATATTTTTAACAAGGGAAAGCTTTCTCTGGGTGTTCTTTTTTGATA
-ATTTCAGCTAAAAATTGAAAAAAATAATTAGTTTTATGGCTGTGAACATC
-CAGAATAAGCTTTTCCGAACGCGAAATGCGTGTGAAACCCATAAAATCGA
-ACGTAAAACAGGTCAGGCGCACCGGCGCAGCCACGTCGGTCTGAGGGTAC
-GCGACGCTAGCCGCAGCGCAAGCCTCCTCGGGTCTCGGCACGACAACTAC
-CGTACCCCTTTCGCAGCGGCGCAACGGAATCTCAATTTTACATTTTTTTC
-TTTTTGGCCTAACGAATTTTTCCGTTTTTTCAGAGCATTTTTCATTGATT
-TTCTTAAATTTTCATCAGAATAAATTTTAGAACTAATTTCCCGTAATTCT
-GATACGCGTTTTTTATAGTTTTCGTGAAGAAAATGCTGAACATTCGAAAA
-ATACTGAAATAATTTAGTTTTGAAAACTTGCTCCTCTGTTTCAATATCTT
-ATAATTTTCTTTTCTGATTAATATTTTGATTTTCCAGGTAATCAATCGCC
-TATAATGGCTCCAACGTAAGTTTTCTTTATAAATTTATATTAGATTGAAA
-TTTACTTTTAGGCCTGACTTTCAAATACTTCAATTTTGATATTAATTCTT
-GGTTTTTCAGAAAGAAAGTGCCACAGGTTCCAGAAACTGTGCTCAAGCGC
-AGAAAGCAGAGAGCCGATGCCCGCACCAAGGCTGCTCAACACAAGGTGAC
-CGTCGCCGCTGTAAGTTTATTTAACTGTCAGAAAACAGAAAATGCTCTTC
-AAAAGCACTGGTTTTAGGATCCACTATTATCCAAGCCAGCCGTCAAAACT
-GAGCTATAAGAATTATCTTGTTTTTGGGTGAGGTGTATTCAATTCAGAAT
-GCGTCTCAATAACACGATGACAATTCGAAATTTTAAAGTTTAAATTTTCT
-TTTAGGTGTTTGAAAATTAATTTGAACTAATCCTGCATTAAAAATAAAAT
-TTTTTACAGAAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGCTGA
-GAAATACGTCCAGGAGTACAGAAACGCCCAAAAGGAAGGACTCAGACTCA
-AGCGCGAGGCTGAGGCCAAGGGAGACTTCTACGTTCCAGCTGAGCACAAG
-GTCGCCTTCGTCGTCAGAATTCGCGGTATCAACCAGCTTCATCCAAAGCC
-AAGAAAGGTGAAATTGTGTTAATGAGTTTTTTAATAACCATTCTTTGTTT
-TCAGGCTCTCCAGATCCTCCGTCTTCGTCAGATCAACAACGGAGTGTTCG
-TCAAGCTGAACAAGGCTACTCTTCCACTTCTCCGTATCATCGAGCCATAC
-GTAGCTTGGGGTTATCCAAACAACAAGACCATCCACGATCTCCTCTACAA
-GCGCGGATACGCCAAGGTTGACGGAAACCGTGTCCCAATCACCGACAACA
-CCATCGTCGAGCAGAGCCTCGGTAATTTGAAAACTTATGCTTTTTAATTC
-TTATTTAATTGTTTTCAGGAAAGTTCAACATCATCTGTCTTGAGGATTTG
-GCCCACGAGATCGCCACCGTCGGACCACACTTCAAGGAGGCCACCAACTT
-CTTGTGGCCCTTCAAGCTCAACAACCCAACTGGAGGATGGACCAAGAAGA
-CCAACCACTTCGTTGAAGGAGGAGACTTCGGAAACAGAGAAGATCAAATC
-AACAACCTTCTCCGAAAAATGGTCTAACTTGTTTGTTGTTCATACCTTCC
-TTCCGGATAAATCGTTATTGTTTGACGTTGTTTAATTATGTGCATAAATA
-ATCATGAAACGTGATCGTCTTGGCTCGACTCATCTCGCATTTCATGAAGC
-GTCTCATCATTCAGATGAATCGTAAAACCGCTTTGCTGACTACTCTCCCG
-AGAACAGTCACTGTTCCCTACTATGCTCCATCCTGTTTATTTCTAGAAAC
-TTTTCTTCGGAGCAAGCTAATTCCCTATGAAGTGAGAGCATTTAGGTTAA
-TAAACATAGTCCAGATTTAAATCCAGACAACGCAATGTTCTCTCTACAAT
-GTACTCCCTCGTGAGCACCTATACCCATTGATTGATGTCGATGGGTATTT
-CTTCAAAAATTTGATGGAAGGACTTGATTATCTGCTCGCCAAATATGGAA
-AAGTTGGCTTAAAACTAGAATTTTAGAAAAAGCTTAAATATTCTTCCAGT
-CTCTGGACTCGGGCCTGACTCCAAAAGAGCGAGCACAGGCTCTCGCATTG
-AGCGCTTTGCTCGACGAGCTTACTTGGATGCTCGCCTACTCGCGAGGCCA
-AGATTTCACGTGGCTCCGCGATGATCGTAAGATTATCGAAGACTTCGGGC
-TTGTTCAGCTCTATTTTTGGAGGAATTGGATTGTACCGCAGATGCAGAAA
-CGGGTAGATTATTGATATTTTATGGAAAAATCGATAAAATATTGATTTTT
-TACTGAAAAAATTGATCAAAAATCGATTTTTTTTTCCTCGGAAAATCTGT
-AAATTAGTAGTTTTTTGTTGAAACAATCGATAAAATTCTGGTTTTTCAGA
-AGCAAAATCGATATATTAGGCCAAAATCACCAAAAATTATCAATTTTCCT
-ATAAAATTTACCATTTTTGGCTAGATTATCGATTTTTAAGGCAAGAAAGT
-CGATATTTCACAATTTTTTATTGATTTTTTTGGCTTTCCAGCGCGCAAAC
-TGTGCCAAGATCTAAATTTTCCGAAATTTTCATTTCAGACACGCCGCCGA
-GTGCGAGGCTACGGAATATCCGGAAAATCGGCGAGAAAGGAGGTCGCCTG
-CCGAACTGAAGCAATGTTGGAGGCATTGGCCTCACTTTTGGCCTCGAATA
-AATACTTTTTCGATGTCAATGAACCGTCTTGGGTAGGTGGCAGCCAAAAA
-ACTCGGCCAAAACTCGGCCTTTCAGCTCGACTGCAAGGCGTTCGCCGTGC
-TGGCTCAATTCAAATATACACCACTGCAGAACGAGGCCCGCGTAAAACAA
-TTCATGAAGGACCGAACTCCAAATTTGGTGGGTGGCCTTGAGTTTTCTAG
-GCCACGAGATTTGAAAAATTCTATAATTAGGGCATGTGGTTTCAGATGAC
-ATTTGTGACGCGCATGAAAGAGGAATTCTGGTCGGATTGGTGCACCACGT
-CGGAGGATTGAATTTCGTGGAAAATGCTAATTTGTTTAATGTAATATGAT
-TTTGCTTCGTAGATTTTAACCTATGCTCGAATAAAATTTATATTCTAATT
-TTAAAAAAATTTCAAAACAAAAAATTTCTTACGTGACAATTAAAGGGTAT
-TACAATATGGGCATAAAAAATGTATTCCCTAATTTTCGAACTTGTTCAGT
-CTTGGTTGCCCAGGTAATTTTTTTGCAGTTCTTGTTTGGGACTCGGAGCG
-ATTTTGCGCAGATGCATCATATTTGACGCGCAGAGTTTTAATTGAGGTTT
-GAGCTTGAATTGAGTTTGAATTGAATTTTAATTAAATAAAGCGAATTCTA
-GAATAAAATGATGTGTTTATTGCGAAATAGATCGTGAACCTACAAAACAA
-CAGACTTTACGCGCAAATTTCCGAAATTTTCCAGAAAAACCAGTCAGAAT
-TTCAAATGATACTTGTTCCTCTTCTATTTCTTCTCCCAATTTTGTTGTGC
-GGTGGGAAAAAGAAAAAAGCGAACAAAAATGTGAAAGAGGCGTCGAAAGT
-GAACTCACTGGTTCCACCGTCGACCTCTACGGACCCGCTGAAGACTAAAG
-AGAAGGAGATGAAAAAAGAAGAAGCTCCGGGAGCACCAGACGCCCCGACT
-AAGCCGAAAAGTCCTCCGAAACCAGTGGTCCAGGACACGAAACTTGCTGA
-AGTGCTGCCTGAAAGTGAGAAGGAAGACGAAATGAAGAATGGTATTCAGT
-TGCCGAATCCGCCGAAAAATTTGGTGGGTCTCACGGCGATTTGAGTGTTT
-TATCGATTTTCTATGAAATAATTGATTTTTTCTAAAATTATTGAGATCTA
-GATTTGCGAGTTTTCTGAATTTTCTAATATATCGATTTTTCAGAAATGCG
-AAAGTGAAATTGCTCCAAAGGAAAAGCCGGCGGCTGACGAAAAGAAGGAC
-GAGAAAAAAGATGAAAGCAAGAAGGATAAGAAGGAAGAGAAAAAGGAGGA
-GAAAAAAAAGGAAAATGACGAAATTATGTGAAAAATTCGATAAATTGGTT
-CTTGAAGATTATTGATTTTTCATTGTCGATTTTTCAGAATTCCTCGAAAT
-TTATTTGCGCGTCATATATGGTGCATTGAGTCCATAGAGACTTCAAAGTT
-CACGCGCAAATGCAGACATTTTTGCACGCGCTGCGGTGAAATTCCTCTTG
-GCGAATTCAAATATTTTTTCCCGCCTTTTTTGAAAATTTTCGAGGCGTTG
-GTCGAGCTGAATACACGTGAAGTTTAGACTGAATGTCAAATCACAAATAC
-ATCACATTTGACGCGCAAAAAATTCGTTTTGAAAATTTGCGCGTCAAATA
-GGGTGCATTGAGTACGCGGAGCCAATACATCACACTTGCTTTTCGTGGAA
-AATGGAGCGAAATTTGATTTTTTGATTTAAATATTACGGGAACAGAAAAT
-TCTGAGAATGCGTATTGTGCAACATAATTGACGCGCAAAATATCTCGTAG
-CGAAAACTACAGTAATTCTTTAAATGACTACAGTAGCGCTTGTGTCGATT
-TACGGGCTTGATTTTTTTTCCATTTTCTTCAGTTTTTCTGACATTATTGT
-GTTTTATTTTAATATTTTTACCGATTAATAAATGATTTCCGTAAATCGAC
-ACAAACGCTACAGTAGTCATTTAAAGAATTACTGTAGTTTTCGCTGCGAG
-ATATTTTGCGCGTCAAATATGTTGTGCAATACGCATTCTCAGAATTTTGT
-GGCCACGTAATATTTGCGTTAAATAAAAATCAAAAAATTAAAAAAAAAAA
-AACATTTCAGAAATTTTCAAAAATTTTTTGAAAAATTGACGCACAAAGTC
-TCCTGTTTCCCTTTTCCCCAAAGTTTTAAACTAATAAAACTTTTTTAATT
-GTCGAATCCGACCAGTTATTTAATACGAGACAAAACGGAAACAAAGATTC
-CAATTTCCGATTACGGTCAGCTCAACACTTTCGCTCAAGGAATTCTCTAC
-GCTTAGATTTTGATCTTAATGGAAAACTGGTAGAACTTGGTATAAAACTA
-TCCAAAAAACTGGCAGAAAGAGTAGTCTTTCCGAAGAAATGAAGTCCCTA
-ATCGAGGAAGATGACTTGGAAGTCGGCAGATTCCGCCGCAACGCGTTTTC
-CGCCGTCGCCCTCTCCACCTCCTGTATTCTGGCGATTGTGGTGTTAACAC
-CAATTGCCTATCAGGCAATTCAGAGAATTCACTCAAATTTGCTTAACGAT
-GCCCATTTTTGTCAGGTAATTTTTTTAAAAAATTTAGAAATTTTGATTTG
-GAAATATTCAAATAAAAAAAAAGTTTTTCGAAATTTATTTTCAATCGTTT
-GAGATTTTGACATACATTCCAAAAATTCCTACTCTTCGCAATTTTTTAGT
-CAACTCAAACTCAAAACCTTAAAAAAAAACCGCAAACCTGTCATGGCGCA
-TCGATGTTATCCCTACGCTAAATGTTCTGTTTTCGAAGGTTACTTTTTTC
-CAATTTTTATCACCAAGGAAAATGTATACACAAAAATATATAGAATTTGA
-CGTGCAAATTGGCAAAAAACTAAACTTGCGCGTAAAATCACTGCATTGCC
-TCTGCGGACTCAACACACCAGATTTGAAATTTCAGGAACTTATCGATTTT
-TGTAAAATTTTGCAGCATGGCGCATCGATTAAATATTAAAAAAAAATTGA
-AAATTATCGATTTTTTTGAACACGAACAATTTGTGGAAAATATGAAATAA
-AAAAAAACATGGTGCATCGAAAAACTTACAGGCTCGAAACCGTGACCTCT
-GGACAGAAACAATGAAGATGGCTCGGAGCCGCGGCCGGGACGAGGAGCTC
-GTGGCCCGAACCAAGCGAGCGGTTAAAGGCACATGGCTCTTCGGACAGTA
-TATTCCAGACCGATCAAGCAGAAATCGACGACAGCAATACGCCGAGGCCG
-CTGGCGGAGGCGGTGGAGCACCACATGCCGAGTGTAGACGGGGTCCACCG
-GGACCACCGGGTGATGGTAGGTTTTTAGATTTGCGAGGCAATTGTGGTGT
-ATTGGTTTAATTTTACAGACGGGGTCGACGGAACGGACGGAAAAGACGGT
-GCACCTGGAACCGATGGAAAAGACGGTCAGGTACCACAAGGACCAGCCGA
-CGGAGGTTATCAAGAGGGACCATCTGATGCAGTTGAAGCATGCACACGTG
-AATGCCCACCAGGACCGCCTGGACCAACTGGAGCGCCCGGAGACAAAGGA
-TCTCGAGGCTACCCTGGAGAATCTGGAGAGCCAGGCACCCCGGGAAGCGC
-CGGACCGAAAGGAAATGCTGGACCGTAAGTGGAACTAAAGAATCGATAGT
-TTTCGGTAAAAAATCAATCATTTTAGGAAAAAAATCGATAATTTTCATTT
-TCATTTTTCTCCATTAAATTATGTTAACTTTCTAGAGCTGGACCACCAGG
-ACCACCCGGATATCCAGGACGTCCTGGAGAAACCGGAGATCACGGAAAGA
-CGATCGCCGGAGAGGCGCCACCTGGACCACCAGGACGACAAGGAGAAATG
-GGTCCACAAGGACCACCGGGACCACCAGGGCCACGTGGAAAGGACGGAGC
-CGGTGGAGAGAAGGGTGCTCCGGGAGATCAAGGTAATCCGGGACCATATG
-GAAAACCTGGGCAACCGGGAGCTCCAGGACCCGATGGCTCTGCTGGTGAG
-AAGGGAGGATGCGATCATTGCCCACCGCCAAGAACTCCACCTGGTTATTA
-AAGATTCTTCGATTGATATTTTATTTTATTTTCATGACGTTATTCATTTT
-GTCATTCGGTTTTCTTTTGTTGCAATATGATAATAAATCAGATTCTCTTG
-CCAGTAGTTCCAAGTGCCCCAACATATTTTTGAGTCCTTTATGTAGATCC
-CTCTCCTCGAAAGCTGGATGATTTAATAAATCTTTCAGAAAAATCGAAAA
-TTTTAGAAAAAAAAACATCAAAATTTTTGACAAACTGCATAATCAGTCAA
-TATTCTAAAAAAAAATACGATCGCACAAAAATAAACAACGACGCAACGAC
-ACTCCGCGGTTACTAAGCTCCGCCCACGATTTCATTTGCACTGCGTTGAG
-TCGGCCGTATTGTTATTCAAACATGAATGAATATACTGGTGAAGTTTAAA
-AAATTGGGTGTTTAGTTTTGAAGAAAATAATTTTTTTGGAATTTTGAATA
-AAGCACAATTGGCAGCTGAAACTGGACTTTCAGACAAATTTTGAACGGTG
-GTTGTTGATGCTTTGAGTTTATATTGTTATTCAAACATGTATGAACTTGT
-AAAGTGCTTGTAAAACTTGTAAGTTGCTTGTTCGCTCATTCTGAAATAAA
-ATTTAAATTAAATAAAAGTTCACGTGATACAAAAAAGCCAACTTATTGAT
-TGAAATCGATAAAATCGATAAGAAATTCATTCATTTAATAGTTTTTAACA
-AACAACAAATGCGATCAAAAAGTTCGGAAGGTGATTTACAACCAGAGGAC
-ACCCAATCCAGAGAAGATAAAGAGACGACTGCTACGTATAGTGAGGATAC
-AAAGCCAGGTAAATACAGTAGTCCTACCTTAAAATTACAGTAACCCAGCT
-GACTAAATATCATAATAAAACTTGCAAAAAAATGATGTAAAATCTTAGTT
-TTTAGTCTTTTGAACTGGTAGAAACTGTGTTAGCGCCACTTTTTGACTCT
-AAATAGAAAAATTTCCCATTTTAAAAGAGTTGTATTATGATACACTGCGT
-GGCGTGTAAAATACCAAAAAATAAGCGCGGTTTTTTTTTTCGTAAAATCA
-CAGGGAAAAATCCGAAATCGGAACTCCAATCAGCCGCCAACATCCCACGG
-GCCCAATAACTTCTGGGTTTTGTTTCAACAATCTCATTTACTCCAATTCC
-AGAAACCCAAAAGGAGAGAAACGCGGCACTGGACAATCTTGCCAAGACCC
-CAATCCAGTTAGTCGTCCAACCAACTCCTCTCACACCAGCCATCACGCCA
-TGCGAAGCACCACCACCACCACCTCCACCAAAACCCTCTAGCGATAATAA
-CAACTCGAAACGATTGAAAGTGAAAGATCAACTGATTGAAGTGCCCAGCG
-ATGAAGTAGGCCGAGTTGAGAATAATATAGACAATTTCCCGTTCTATCAT
-GGATTCATGGGAAGGAACGAGTGTGAGGCGATGTTGAGCAATCATGGAGA
-CTTTTTGATTCGAATGACGGAAATTGGGAAGAGGGTCGCCTATGTGATTA
-GTATCAAGTGGAAGTATCAAAATATTCATGTTCTAGTGAAACGGACCAAG
-ACGGTGAGAGTTGTTTGGTATTATCATTTAGTTTCGTTTCAAATCAGACC
-GAGATACATACAAATATTGAAGTTCAAATTTAGAACATGTTGCATCGCAA
-TGTGTTCATTGTGCTCCCTGAAGCATTATGCGGACATCACGAATTACATA
-AATTATTTTAACCAATGGTGGGCGGCAAATTGACAAATTGCCGATTTGCC
-GAATTTGCCAAAAATTTTCGGAAAATTGTATTTTTGCACATTTTTTTTAA
-ATTTCAAAATTTCAAATTTTATCGGCAAAATTGTATGCATCCTATGAATA
-TTTCTACATCTGTTTCGAAAAGTAAGCAAATTATATGAAAATATCTAAAG
-AAAAGGGGAAAAAATTCGAAAAGGCACAGTTTTCAGTGTTTCCGTCTTAC
-AAAAAAAACCTCGAAAAACTTTCGGCAAATAAGCAAACCGGCAAATTGCC
-GGAAATTATAGTTTCAGGCAAATCGGCAAACCGGCTATTTGCCGAATTTG
-CCGAACGGCAGTAGCCTCTCACCCCTGATTTGAACATGGTGCATTGCATC
-ACCGCTCCTCGACTTGGAAAGTTTATATCGGTAGATATTTGCAGCAGATG
-TAATTTACTGATATTTTCAGAAAAAGCTCTACTGGACCAAAAAGTACGCC
-TTCAAATCCATCTGTGAGCTTATTGCCTATCACAAGCGAAATCACAAGCC
-GATTTATGAGGGCATGACGTTGATCTGTGGCCTGGCACGACATGGATGGC
-AGCTGAACAACGAGCAGGTCACATTGAATAAGAAGTTGGGAGAGGGACAG
-TTTGGAGAAGTGCACAAAGGATCGCTGAAGACATCTGTATTTGCAGCCCC
-GGTCACTGTTGCCGTGAAGACCTTGCACCAGAACCATCTATCCGCCAATG
-AGAAGATCTTGTTCCTAAGAGAGGCCAATGTGATGCTCACCCTGTCTCAT
-GTAAGCTACCTGTTTCAAGTTGAACTAAACTAAAATTAATTTCAGCCAAA
-TGTGATAAAATTCTACGGAGTATGCACCATGAAGGAGCCCATCATGATTG
-TCATGGAGTTTTGCGACGGGAAATCCCTGGAGGACGCTCTACTCTCCAAG
-GAAGAAAAAGTGTCAGCTGAGGACAAGATTCTCTACCTTTTCCACGCCGC
-CTGCGGTATTGATTATTTGCACGGAAAGCAGGTTATTCACAGGGATATTG
-CGGCGAGAAATTGTTTGTTGAATTCCAAAAAGATCGTGAGTTTGTTTTTC
-AAAAATTTCTGAATCTATGTGAATGAAAAAATAAATTTCAGCTGAAAATC
-TCCGACTTTGGATTGTCGGTCAAAGGAGTTGCTATAAAGGAGCGAAAGGG
-AGGATGTCTGCCGGTCAAGTACATGGCTCCGGAGACATTGAAGAAGGGGT
-TGTACAGTACTGCCTCTGATATTTATAGGTGAGCCTACGAGCATACATAG
-ACATTGGTAGTGGCGTCAGCGGTGGCCTAGAAACCTTATCCGCGTCTGAA
-GGTTAATCAACCTCACACAAGTCTCTATGATTTCCAGCTACGGCGCTCTA
-ATGTACGAAGTCTACACGGACGGAAAGACGCCATTCGAAACGTGCGGGCT
-ACGTGGAAATGAGCTCCGAAAAGCGATCATCGGGAAGAGAATCAGCTTGG
-CCGTTGAGGTAGAGCTACCAGTGTTCATTGCCAACATTTTCGAGCAAAGC
-AGGCAGTACGAGACCGAAGATCGCATAAGCTCCAAGCAAATTATTCAGAT
-TTTTAAGGAGGTTTGTGAAGCATTTTATCGGTTTTTTGTTCAAAAAATTA
-GTAATTTTCCAGGAAGTCGGATTCCATGAAATTGAGACAAGTGGGATACT
-GCATAAGCTTGTCAATTCTCTTCCGAGAATTCACAATAAGGAAAGAAAAC
-CCGCGGCGGTGGCAGTGTAATAAATATCTGAAAATCCCCCCACCCCTGAA
-AATATTTGACTGTATTTTTTAAATCAAACACACAACGCACACAAACAGAC
-AGACAGAAAGCCTAAGTACACAGAGAAAATGTTTGAGGTGAGGTGCGAAA
-GGGAGGAGGCTAGAACACCTACTTTACGCCAACAAGTTATGACTTTTTGG
-AATTCAAAATGTCGTTTTTTGCTAGTTCACTGCTTACCTACAAACCTTCC
-TACCTTGTCTGCCTACCTTCCTTCCTATTCTCTTATTGCAAGATCTTTTG
-AATTTTTCTGAAACGTCTGTCTACTTCTGCGTCATTTGCAAACAGGCTGT
-TCTCAGTTTTAGGGGGTGGCAGCACCCACAAAAAAACATTGGAACAGAAA
-TCAGTCGGAGTGATCTACTAGATTAGATAAACATTAGATATCAGTTTGGA
-AAAGTTAAACATTATTAACTCACAATGGATTTTCTTATTGTGTTTCTTGA
-TATAAAGCGTTGAGCGGTATTGATACCATTACAATGCACTAAGCTAAAGG
-CTGTCAGAGCCGAATGAAAAACATGATACATCGAGCATGCGGCAATTGGC
-GTTCGGAAAATCGGCAAATTAAGATTTGCCGGAAATGTTTTGAGGGATTT
-TTTATAAGATTTAAATGTGCCTTTTTGAAATTGTGTCCCGTTTTCTTTAG
-ATATTTTTATAGGATTCGCTCACTTTTCAAAATAGACGTAGGAGAATTCA
-TAGGATGCATACACTTTTGCCGATTGAAATTTAAATTCTGAAATTTCCAA
-TAAAAGTGCATCACCACAATTTGCCGACTTTTGGCAATTGCCGTTTCTCC
-GGCAAATTCGACAAACCGGCAATTTGCCGATTTGTCGATTTGCCAGAAAT
-TTTCAATTCCGGCAATTTTTCGATTTGCCAATTTGCCGAGAATTTCAATT
-CCGTCAATTTGCCATATTGCCGGAAAAAATCGTTTGCCGCCCATCCCTGG
-TTCGAACTCCTAGAATGGTAGAATATGAGTATACTAAAAATAATTTGAAC
-AGAACTGGAACTGGAAGAAAAATTTTTTACCGACGTCTTCTGAGAAAATT
-TCGTGAAAATTGAGTTTTTATCACTTTCTGACTCACAATAAAAAAAATTT
-CCAAAATTTTTTGAATAGTTCTCGATCGTTTCCAAACTGGTCTTCCGACA
-TTCAGGTGCGTGATTGGTAAATATGAGGGAACTGCCATAATCAAATGAAA
-AACACGGTGTATCGTCTGAGAAAACCTTAAACTGTTCCGTTTTAGTAATT
-GGACAAGGATCTGCTGAATCTCGCTACTATAGCAACCGACATCTTGCGGG
-TCCAAAAAAGATTGATCTTGAAAATTTGATCCAAGTTTATTTAATCGCCG
-CCACACACACACTCACAAAAAAATCAATCAAATCACCCATATCAGTTGCG
-CGATTTCTAGTTTCTAGGCGCGAAAATCAAAAGGAGGAGAAGAAGCATTT
-CCGCATTACTCGTGTGTGTGCCGTTTCCGTTTATTTGTCCCTCAGGCTCC
-CCTCTCTGTTTTTTTTGTTTGCGAAAACTGTCTCTCTCTCTCTCTCTCCA
-TCACTTTTCTGTTGCGGAATAGAGGGAGAGAGAGAGAATTTCGGAGGGAA
-AAATACCTGAAATGTGATCCTCTCTCTGTATGTCATTGACTGTTGCGCGA
-GAGCCTTTTCCCGCGCGCGCGAGCCTCCCACCTACCCGTCGACGAGCCTA
-TTTTCTTGTCGGCGGTGCCATTCGGCAATACACGTCCCTCTCTCTTCTTG
-CTCTAGAAACATTCGGATTTTGATTTTTTGATTTTTCATGGTGGATCTGT
-AGGCTTTTTTAGGCCATCTTGGACTTTGTGGTGGCCTAATATATGGTGTA
-TTTTCCAATTTATCATATTTGCTTTAGTATTGTCCGACTTGTAGGCAAAT
-TGCACCATTTTAAGCCAAGTAATAAAGCTTTGAAGTTTGGCTGCCTAGGT
-TTTTCTAGCCACCAAACAATTTTTTTGTTTTCACAGCACACTTTTTTAAA
-GACTGTCATAAGTTTTCAAAATTCTTTGAAAAATTTTACACCGAATTTTG
-AGATCTTTAAGTTTGGTGGCCTAAATTTTTCAAAATTTTCTATGCCACCA
-GACTGAAACGTCCTAACTCTATTTGAATTATCTTTGAAACTATGAAAACT
-ACAAGTTCGACTAAATATGGCTTATCCAATTAAACTCGATTGGTGGCCTA
-GAAAACCAATTTCGATTTATTTCATTTTCTAGGCCACCAATAATCTTGTT
-CGAAAATTACTTTTATTTAATTACAGTGGAGTTTGGAATACTTACTGCCA
-TGGGCTGTAAGATGTTGCTCGCCTAACTTTTTCTATGCCAGCAACCAAAA
-AGTGGTGTTGGTGGCCGACAAACCCAAACTTGGACAATTGCATTTTCTAG
-GCCATCATTTTTTTTAAACTAATCGTTGTTGGTTTAGTCTACTGTAAAAA
-ATCAAATCGATAAGAACATTGGGAGCCAAGCTTTGGAGTTGGTGGCCTAG
-ATTTTTCTAGGTCACTAACTTGAAATGTCTGTAACTCTAAAAAATAATTT
-AGAGATATATAACAGAATTAGTAGGCTAATTTTAGGATGAGAAACTATTT
-AAACAATTGGTGGACTAGAAACTGAATTTTGAAATTTCTAGGCCACCAAT
-TCCAAATAAGCCTATTTCACTCCTGAATTGAGATAAAACGCTGAAATTTT
-GGACATATTAGAATACGCTATATTTGAAAAAATGGAATTGGTGACCTAGA
-AAATATTTTTTTGAAATTTCTGCTCCACCAATTTCAATTATAGCATAACT
-CATTTCATAGTTGTAGGACGGTGATTGAAATTTAGGATAGACAGATTTTA
-AACCAAAACAGATTGATGGCCCTTGAAATTTCTAGGCCACCTCTCCAGAA
-AAAAATCTGAAAATTGTTTTTATTTCTAATTCATTTTCTTCGTCCGTTTT
-TCATCTCTCGAGGATCTTATCCCCTTGTCTTACGTCTCCCACCCGCTGCT
-ATTTGGGCGACCTTCATAACTGTGAAAATTCTCACCATTCTCCCTCTCTC
-GTTTTTGCCCCCCCCCCCCGGTCTCCTATCATTGTTCAAGTACACCTGTT
-GTCCCATAACATCTGCCAACCAATTTTTTCCAATTTTGCCACAATTTTTA
-TTCAAAAAAGTGCATTGCAGCGGCAGGCATGCCTCACTCGTACACACACT
-TGAGCATACAGGAAAAGCGAAAAAATCAGTGATTGTTTGGATTCCTGGCT
-CTTTCTAGGAAAAAAACTCTTCCATTTTTGTAGTGCACATCAAAATGATC
-AAGCTGGTTAATTTTCAAGTGACTCCCAAAAAAATAACTGAGAAAGTTGC
-GTTTTAAAGTTTCTAGGCCATTGTGGGATTTCTAGGTAGGTTTTTGAAAA
-TAGAAGACAGTCTTGCACTAAAGTTTTGATTAGGCTGTTAAATGATTTTT
-GTCAGTACGTTTTTTGGAACTTCGATTTTTGCCAAAAATTCCTTTTTTAG
-TTTTTGTTTCAGTTTTTTGCAAATTTTTATTTCTTCCATATCTTACAACA
-TTTAGAAGGTCTCAAAGTCTCTGATAGCCAAGAATTGACTCTAATGACGT
-TATGAGCTCCGAGACTATTTTAACCTTTTTCCCTTTTAAGCATAAAATAT
-ATAAATATCAAAAATTTAATACAAAAACTTCTCGTTTCGAAACGTTTCGA
-AATCCTCCAGTTAAAAAAAAATTAGATTACGGCATCGGAAAAATTGCGAA
-ACTTTTGAATCTGAGGGATTTTCAATAGAGGGTCCCGCCAGGAATTTGAG
-TTTTTAACAGTACCCTTTCCATCGTCCTTCCCGAAGCCCATTACATCATC
-ATTAATTTTGCGACCTTTCTAAAAGCGGTCATGGGGGGGGGGACATGTGT
-TTGTTGCATATACAGGGACCCCCCGCCACAACCACCGCAACTAGAGATAA
-AGATCTGCTGCACACAGACAGCTGGCACATGGATGGACAGAATGTCTCCT
-TAATTTTACCGCCTATTTCATAATAATAAAAGTAGAACGGGGGGCAGAAA
-AGAGAATGATTGCGAAACCACCTGCTTGGCTGTCAGCGCATAAACTTTTC
-GGAAATTTTGGGTCCCACCACGCTTTTTTCGGTAACAAATTTTGAGATTT
-CTCGATACACCATGATGTCTTTTGGTGGAATTTTGGGTTATCATGGCTAA
-TACAAAGCTTTAACGTGCCTTGAACTTTCGCAATTTGAACTTTTGGCCTT
-TACTTAAAAATTTCGATGGGGCTCTATAAGCCATGTGGTTTCGAACTTTT
-CCTGAAAATTTAGATTTTTGTTCATGCACCATGTTGTTTTTTTTTTGGAA
-TAATTGAGGAATTCCTTACTTTTAAAGTAAAAAGTTTGGTGAGATCCATG
-TGTTTTCATATTATTCAGTTGGTAAATTATACAGATTATTGACTGAAGGT
-TAATTTTTTGTTGGGAAAATAAAAATCGCCAAAATCAATAAAATCGTATT
-TAGAAGTAGGGTTTCCATATAGGCGGTAAAAGGCTTGTCTGCCTGACAAT
-AAGACGACCGCCGCTCGCCTCAATCCGCGGCGGAGGCAGGCAGGGTTCAG
-GTAGGCACTGAAACCGCGCCTGCTTACCATGATGTTCCGTTCTTGTCGAT
-GCACCATGATAATTTTGGGTTACATTTTGAGCCTTTTCGAAAAATTAATG
-GTGGAAAATTTCAAGCTGAATTTTAATATTTATTTTTTTAACCGTATTGT
-GGGACATGCAAATGTCTTTCATTTTGTGTCCCTTCACTCTAACGTCTTCA
-GAATTTTCGAACTTCTCGATGCACCATAATGCTGTTTGGCGATAACTTTA
-GAGTAAGAATGGTAGCGATTTTTGCGATGCACCATGACGTTTTTATCGAT
-TTTCAGAAAAAAAATCACTCCGAGACCCAAATAGTTTCATTCTCGACGCA
-CTATAACGTTTTCGAAGTAAATTTCAAAATTGCTTCTCGGAAAAGTTTTT
-TGAGACCTACATGCACCTTTAATCTTCTTTGGAAACTTTGGAATTTCCGC
-CGAATACTCTCATTTCAGTTGTTCTCGATGCACCATGATGGTATTTTTTT
-CAAATTACTTTTTTTTGATTTTTCCATGAGAGGACCAATATCTGTCTTTA
-TAACGGCGCATTCTGTAACCAAATTTTGAAATTCCACGACATTCTGCTCT
-CATCGATTCAACATGATAATTTTAAAATGAAATTTAGCGATTTTTCGGGA
-AAAAAACAGTTTCGAGATTTTCTAGTTATTGGACACTCTGCACCTTGCTT
-ATTTGGAAATTACATTTTAAACCGACAACCCTTCAAAAACTGCTTTTCGT
-CGATGCACTATGAGTGCATAATTTTGTGTAAATCGTGGTGGGCCTCTAAA
-AAAACCGAAAAAAAAAACGTATAAAACGCAAACAAATTGTTTTTGTTGTA
-ATGTTGACACCAACAGATTCGGCGTGGAATATACGGAAGATCGGATTTCC
-AAAAAAACAACCGCTCTCCTGTTTTCGACGTTCCGCCGCTTTTTATGGGA
-GAAGTAGTATGTACCTTTAAGGGTACTGTAGCCCCTTGAATATTGGCCTA
-AAAGTGAAACTAGTGTTGCCAAAAAAAAACGAGATGACCAGTTTCAATAT
-GTCATTTACATCTACACATTTCTAAAATCTCATTTTAAATTCCATTGTTT
-TCTCGTTTCTTCTGTCCCAAAGTACCGTATCCTCATCCTTCTACCACCTT
-AATTTGCATTTCTTCTTCCTTATTCACTCTTCTTCCCCTGGACGAAAAAT
-GTTGCACGACAACAACAAAAGAGACCCGCCCCCCACCATCGGTTTCTCTG
-AACCTCTAACTGTCCCCGCCCCCTTTTGGGAGCCCACTGTCTTTTCTTTT
-TTTCTTTGGTCGCTGATTATGACGGATCGTTTTTGTCGTTTTTGTATTAC
-AGGAATACAAATTTCCCAAAACGCGTATTGCACAACATATTTGACGTGCA
-AAATATCTAGTAGCGAAAACTATAGTAACTCTTTAAATGACTTTTGTAGC
-ACTGATGCCGATTTAATTAAATTATTTATTAACAGATAAAATATTAAAAG
-AAAACACGACAATTCAAAAAAATTCATTTCGTAAATCGAGCCCGTAAATC
-GACACAAGCGCTACAGTAGTCATTTAAAGAATTACTGTTTTTTCGCTACG
-AGATATTTTGTGCGTCAAATATGTTGCGCAATACGCATTCTTATAATTTT
-GTGTACCCGTAGTATATTTTTGTCTCTCTGATTTCCATTGCAATTTTTTA
-ATTCCATATTTTTTTGGTGACAAATTTCTCCGCTTATCAATTTTTTTTTC
-AACCACATAATTATTAACCCCAAAACATCGCAGATTTTCAGGTAAAATGC
-CAGTCGTGAGCGTTAGACCTTTTTCTATGAGAAATGGTGAGCAATTTTTT
-TGAAGTTTTTTTTTGAAATTTTTAATTTTTCCAGAAGGCTTCTCAAACGG
-GCATAACACGTGGAACGACGCCGAATTTTGGAAACCGTGAGTTTTCGGCA
-AATAAGCTAACAGTCTAAGAAACACGAAAAAAAATCCAATTTTCTTTTCA
-AAATTCGTGATTTTCGGATGATTTTTGAACTTTTTGATTAATGTTCCCAC
-TGAAAATCCTCCAAATCTCTAAAAATCCGCTTCTAAAAAAGCCTCAAATG
-GCCTTGCGAGAATAGACGGAATGTTCAAGGATGACTGGTATAAAATCGGC
-AAACGTGTTGCCATTCAAACAGAATATCTCGAAATTTCGCCTTCCTTTTT
-TTTAAGTGGGTCGGATATTTAACATACAGAAGAGAATAGGGAGAGAAAAG
-AGGGAAAAGAGGGGAAAAGTCTTCTTGGAAACAACCTCGAACCGCAATTA
-AGTTTTTGCCTCACCCTTCAATTTTCGTGAGAAAGTTAAAAATCCAAATT
-TTTTTCTCCTTTTTTAAAAAAAGATTTCCTCCTCAAAAATTCAAAGGATC
-GAATTTTTTGTTACACGCCTGCCTCCTTTTTATTACCCTTGTTCTTGATC
-GCAACCTCTTTTCTAGATTACTTGAAAAAATGCGCTATTTTTTTTCCTTT
-TTCAACAGAGTCAATTTCAAAGGTGCTGTGGAAAAAGTTTCGGTTTTTTT
-TTGCAAAAATAATCGAAATTTGTTCGTTTATACTGCTTAAAAAATGACCA
-AAATTTCAAGTAATTCATTCGAAAAATCGATTTTTTTGAAATATACAAAA
-ATTTTCAATTTTTCATATCTGAAAACACAATTTTTTCGATTTTTCATTTT
-TCTTGGAAAAAACACAAAAAAAAACTGTATTTAATTTCCCACTTAATACT
-ACGATATCCAAGCCCCGCCTCCGCGTATTGTACGTGAACACGGCGGCCCA
-AAATTACACACTATCTCACACACGTTAAATGAGTGATACCGTACTCTCTC
-TGTTTTTTCTTTCATTTTTTCGGCGCCGAAAATTTTCAATTTTTGGTGGT
-TCTTTTGGCGGGATTTTTCGGATTTTTGTCGCGTTCACACACACACACCA
-GTTGGTGTTGCCTGTCGTCACCCACCCGCCCCACTCTTTGTCCGTGTACT
-GCTTTGCCATTTGTGCGCGCGTACCGCTGCCCGTCTGTCTTTCTCATCAT
-ATGCGCCTCGTTTTGTCGCTTTTTCTCCATTTGCCCTTCCTACATGGGTA
-CCTGCGGTTTTCATCGAAAATATCCTTAAAAATTCCGAAAAACCTCTATT
-TTTCGATTTTTGAATCGATTTTCGCCCAAACATAACCATTTTTCAGAATG
-AAGGAAGAACAAATCGCCTATAAATTGCCAGGGGCTTGGTATTACGAGGA
-GGACACTGCCTCGTGCTCTCCAGTCAGCGATCCGGAGGATATTGCGCAGT
-TTCTCAACTACAGAACGTCGATAGGCGTGCAAAATGTCACAGAGTCCGTG
-GAAGTTCCGACGTCGGAGCATGTCGCCGAGATTGTTGGTCGTCAAGGTAA
-AAATTGCCTTTTTAGTCAAATCTACAGTTTCCACAAATTTTCAGGCTGCA
-AAATTAAGGCACTGCGCGCCAAGACCAACACCTACATCAAGACACCGGTT
-CGCGGAGAAGATCCAATTTTCGTGGTCACCGGACGCCTGGAGGACGTGAA
-CGAGGCGAAACGAGAGATCGACTGCGCCGCCGAGCACTTCACACAGATCC
-GTGCGTCGAGAAGACATACACAAGGTAGGTGACCGTAGGCAGCCGGTTCC
-TGAGCGCCTTGTTCAGTTGTTCCAGGAGCCCATGCACCTGGACAGATCAC
-GAGCTATGTCAGAGTTCCGTTAAGAGTTGTCGGACTCGTCGTCGGACCGA
-AAGGAGCGACTATCAAGCGAATTCAACAGGACACCCACACGTACATCATT
-ACGCCGAGCCGAGAAAGGGAGCCCGTTTTTGAGGTAATTTTGTTGGAGAG
-CATAGAGTTTTGGAGCAAAATTCTCAGCAATTTCATGCTTTTTAACAAAA
-ACAGAGAAGTTTCTAGTTTCGGCTTAGAAAATACTGAAAATCGGCTTTTC
-CATGGCATATATCGTGCTGAAAATCTACTTTTGACTGAAAAATTCAAGTT
-TATGACTAAGAAAAGTTAGATAATTAGACCATGCTATTATTTCATAATAT
-TGGTCCAATTTTTGTTGCTTTGCTGAAAATTAACAAAATTTAAAAATCGG
-CGGGGTTTCTGAAATATTTCTGTATAAAAACCGATTTCAACTCCAATTTT
-CCTCGATTTTTACATATAAGTAATCTAGAAAAATTGTAAAATGGGGAGAA
-TTCATAAGAAAATCGGCTGTTTTGTAGCAAAGTTTGTAAATATATCATTC
-TGAAAGTCTCAGCGATAACCGTGATTCTAGAAAACCTCATCAGGATTTGA
-TTTCTGCGACACACTTCTCTCGAGTTTTACATAGAAGTTGTTCATTACAA
-ATTTCTATTTTTAAGGTCCCCATTACCATTGTCAATCTTTCATTCCGATT
-ATTTGTTTTTCCTCGTCACTGCAAGAAGGGGAGCCTAATGCCTAGACAGA
-GACAGAAAACACATGTGTGTTTGTAAGTGTCTGGTGTGATATACCCAATT
-CTTTTCGGCCGTCTCTTGTTTTCTTCCTGACACCGAGTTTCGAGCGATTT
-TCGAGGTCGTACAGTTGTGAATTGGCTGCCACTGCTGTGGCAAACAAACA
-AAAACAATCAAACTTGTGCGGAATTGATATTCTAAAGAGAATAAAGAGCA
-ACCATGGGCGCCGAAACGAGCAGCGGAAGGGCTTGTGACCTCTTGGTGTG
-AATTTTAAACGGTTTCCTTCCATCCGAAATGCTAAAAATTCCTCGGGAGC
-CGTTTAGGGTCTTCACTGAGAGATGATGATTAGAATCTTTTAATTTGGTA
-GAATTCCCCCCGCGGGACCGATTAATGTTGCATGTCGTCTTCTTCTTCTT
-GGCAGCAAAATATCATTGTTGATGAGATATCTCAGTTTGATGCTCAATGA
-CGCCTTGAGAAACATCCAGCACACAGTAGATTAGTCGAATTACCGATGGA
-TGGGGCCGCCCGGGTTTTTGGAGCCAAGAGTCACGCGATGGGGAGTCCAC
-ATACACACGCACCAACTCTTTCATTCCATCTAACAGGGTAGTAGGGTGAA
-GAAAAGGGGGGGGATCGCGATGACAAAGAGACTCAATTAATTAAATGACC
-GGGGCGGGCGCCAAATTGCACATATGCTTGGTTTTATTGCACCGTTGGCT
-CAGGGAGAGCAACATTTTGTGGCAGCACCAGGGGTACTTCAAAATGACGA
-ACAAAGGTCGTTGTTGTTTCTATAGGAAGGCTTCCGAACTTTTGAACAGT
-AATCAGATCATATTAGGGTTATGTAATTGACGGTTTTGACCGTATGTGTC
-TATAGATGCGTGTGTGTGTGTGTGTGTGGCGACATAAATTACCGTATCCG
-CATGGCCTTTTTCCTCCTTCCTCACAATGGTAATTATCATCCCCCACTAC
-TCTGGGTCGCCGGACGAACTGTGAATGTGTTGACAGTGCGGGCCCACTAG
-TACATGACATCTTGCCCCGGTGCGGTGCGCTCATCGTTATTCCTCCCAAT
-TTAGTTGTCCGTTTGACACAAATGCCTCCGGTACCCTGGACGAGACAAGG
-AGGTGATGGATTTGCCAGGCGGGGAAGGAATTACATGATGTTTGGGAGAA
-TATGAGGGAAAGGTACAGAAGCTTCACCTCGGATATTATATGCGTTCTAA
-AAAGACCAATTGTCGTTTTTGTTCGTGGCTCAAATGAATAATTGGTATGG
-AAATATAGAAAAATGTCCGACTAGTTTGGTAATAGAATTGTTTCGTTTTG
-AACATTTCAAAAATACCTCAAATAGTGCACTTGAGATCTTTGTTGAATTT
-TCAAAGGTTTTATTTTCAGATAAATTGAGCATTTTCCATACTTATAAAAT
-CAATTTTTGGTTCAAAAACTTCTAATTTTCTCACCGAAAAAGTTCTCACA
-AGACAGTGACAGAGGTCGCGTGTCGTTTTGATATCCATCTCGATAATCAG
-AGATTGTGATCTATGCCTCAATGACACAGTTCCGCGAAGGAGTCCGAGAA
-AAACGTACAAAATTGGGGAAAAATATTGGAAATAACATTTATTGAAAAAT
-TAAAAAAAAAACATAAACTATTTAAATTCACAAAAATTCGGAAGCATATT
-TCCTATAATGAAAACAAAAAATTCTGAAAATGTGTACTGCACAACATATT
-TGACGCGCATAATCTCTTGTAGCAAAAACTACAGTAATTCATAAAATTGA
-CTACTGTAGCGCTTGTTTTGAGTTACGTGCTCTACGAAATGAATTTAAAT
-AATTTATCGATGGAAAAATAATTTTAAGCAGAAAATGAGAAAATAATATG
-AAGAAACAAAAAGAAATTCGAGTTACGTGCTCTAAGAAATGAATTTAAAA
-AATTTATCGATGGAAAAATATTTTTAAGAAGAAAATGAGAAAATAATATG
-AAGAAACGAAAAGAAATTCATTCGAAAATCGAGCGCGTAAATCCAGAGCT
-ACAGTAATCAGTGAAAGAATTACTGTAGTTTTCGCTACTAGATATTTAGT
-GCGTCAAATATGTTGCGCAATACACATTTCTGGAATTTTGTGTTTCCGTA
-ATAAAATAAGTTTTTTGCGAGAACTACAAAAATATAACTATTTCTATTCC
-AGGTGACCGGCCTCCCACATAACGTCGAGGCTGCCCGCAAGGAGATCGAG
-ACGCACATCTTCCAGCGAACCGGAAATCTTCCAGAAACCGACAATGACTT
-TGCCGGACAGTTGGCCGGTGTCTCGTTGATGGTGCAGAAGCAGCAACAGG
-CTCAACAACAAATGCAGGAGGCTCAGCAACAATCGATGTTCTATCGAAGA
-GCATTCGGCAACAGTAATCCGTTCAATCAGAAGGAGATGTCGTCGTCGCC
-ATTCGGAATGGAGAGCTCGTTGGGATTGGACGCGTTGCTCCGCAGTTTCC
-CATCGATGCGTAGTTCGTTGACTCCGGAATCTCTTTCCGGTACTGGACTG
-TCTTCTCGTCCATCGTTGGGAGGAGGACAATCGGCGAAACAAGATCTGCC
-AACCTACGACTACTGGGGAACCAACAACTCGCTTAATGATATTATGGAGA
-ACGGTAAGCTTTTTTTGCGAATTTTAATAAGAATTTTAAATGACAAATAA
-GGATTTTTCAGAAATTCTCAGCCGCAAGTACGATGCCCTGTCCGCATGGT
-CGTCGATGGGATTGGAGAAACGCGAGGAATCCCCAACCAATGGGTATATA
-TTTTTGAAGGAATTTTATAAATTTTTGAAATAAAACTAAAAATTGCAATT
-TTCCTTCAAAGTTCTAAATTTTTGAAAGAAAATTTGATTTTCCGCTAAAA
-AATTTAAAAAAAAAACAAGTTTTCGTGTTTTCCACTCGGAACCTGACGGC
-TTCTTATCAATTTTTTAAATAAAAAATAACGTTTCTAAAACTCAGAATGT
-TTAAAAAATTTCACATTAAAAAATTATTTTTCCGAAATCTTGAACCTATC
-CGTTTTTGAAAATAAAAAAGAGTAAAATCGTAGTTTTCTCTATAAAAATT
-ATAATTTTCATTTGAAATTCAAAAATTTTTAAATAAAATTGGATTTTGTC
-CGTCAGAAATCTATAAAAAGAAAATTTTTTTTGAACAATAAAAGAAAAAT
-TGTAATTTTCTTTTGAACTTCAAAAAAATATGTTTTTTTTCACATGCAAA
-AAATTGATTTTTTCAAAACCTCGTTTTTGAGAGAAAAAGGTGAAATTCCA
-ATTTTAAGAGGTAAAGTTAAATTTATTTATTTTATGAGAAAAACTTGAAA
-TTTAAAGGAAAATTACTGAAATTTACAATTTATCATACATATTTTTTAAT
-TTCGACATATCTCGAAATATCAAGTCGTAAATTTTTTCCACAAAAGTGTG
-ATATTCTCTTTAAAAACTAGAAAATTTCAATTGTAAATTTATGAAAAATC
-AAATTTTTTGCAGGCTCATGTCCTCCCTCAAAGGAACATCCGCCGGCTTC
-GGTCTTCTCAGCACAATCTGGTCTGGCGGAAACATGAATCTGAGCCCAGG
-ATCGTTGGCTTCAGCATCTGCCTCGCCGACTTCATCGACCTGCGATCACA
-ACGATCATACTCTCGTGCCGATCAATGGATAAGCTGTGGATCCATTCATC
-ATTCCATTACTATCGTGTAGACTCTCATCTAGCAAAAACCCATCCTCAAC
-GAGTTCCAAATTCATCTTTCCATTCTTTAAAAGACTCTTTTTCCCATTTT
-CTACTTTGTTCATCGGTGTACGAGTCCCTCCATTCCCATTTTCTCACCTC
-TTTACTACATTACTAGAACACACAAAAATCACCATCATTCTCACCCCAAA
-ATCCTAGACAAAAAAAACGAAAAAAATCACATATATTTATATATAACTAT
-TATTATTTGTTATTCATATTTTTGAAATATCTATATTATATATATTTATA
-TATGTAACCCATGCAGTCCCCCAATATATATTCCTACAGTAGGTTTTTTT
-GGAAAATCTGTAACTTTCTCTATTATTCTTTTTTGCATTATGATAGGACG
-ACCAACTCATGTTTTAAACAAAAATTATATATATTATAAGGATTTCCTCT
-TTTCTCTCTATCTCTCACCTAGTGTTTAACTCCCAATTTTCCCCCTCTCT
-ACTACGCACAACTAACGGAGAATTGAGAGGCCTTTTATATTTATAGCACC
-TCTTTATAATTAAAAACTCGAGTGATCCCCACCTCACCCATCAAATTTAT
-CGTATTTTGTAAAAGTTCTGATATATTCCACAGATTTTGGTGTATGTGAA
-TGAAGCGATTCGTGTCGTCTCTCCATATTCTGGTATCCATAGCAACTCCC
-CGAGCTTTTGGCTCACTCGCGCACGCCCTATACTATACCTTTACTATTAT
-TAAATGCACTCAACAAATCCTATCCTGCGTCAATTGGCCGATCAATTGTC
-CGAATTGCCACAATATGCACCATTGCGGGTAATAATAGCACAATAGTTGA
-ATATATTAATAATTCAAAAATATTTATTATATTTTGAGGTGTCCCATTGT
-TTCAGACATATATCCGCGCGACGATAAGTGCCACGTTGGGGGAAACGCCA
-AAGAAAACGAGTAGGGATTTGACGTATAGAGGTGAAATTTTTAGAAAATT
-TGAAATTTTCTGAAAAAAAAAGGATTTTTCTTTTATGAAAAATGCTCTTT
-TCGCCAAAAAAATCACAATTTTCGACTTAAAAACTTCAAAATTTTTTCAG
-GAACACACAATTCAAAATACAAAATATCTCGTAGCAAAAACTACAGTAAT
-TCTTTAAATGACTACTGTAGAGCTTGTGTCGATTTACGGGCTCAATTTTA
-AAATTAGATAAAAATGAGAAAATAAAGACACGAAGAAACGAATGAAAGTG
-TAATATCGAAAATATTCGAAAATAAATAAATTTCAAAAATCGAGTCCGTA
-AATCGACACAAGAGCTACAGTAGTCATTTAAAGAATTACTGTAGTTTTCG
-TTACAAGATATTTTGCGCGTCAAATATATTGTGCAATATGCATTTTCAGA
-ATTTTGTGTTTCCGTAATAGGTAAAATGTCAGAAAATCAAGGATTCAGTG
-CAACCCCGCGTTCTACGGGTATTTTGGCCACGGCCACTTTTTGCAAAACT
-GCAAAATAGGCGTTGTTATTTCATTTTCTGAAAAAAACATTGAAAATTAT
-TATCGAGAAAGTACGATCTGACAAATTTCTCATAATTTATTTTTGATCTA
-CCTGTTGAACTTTACTCCGCCCCCAATCTTGTTGCCGTTGTTATTTTGTT
-GTAGCTGTCTTGTCGAAGGACGGGGAGGAGCCTAGTCAACAAGGTAGATA
-AAAAATATATTATGAGAAATTTGTGCGATCGTATTTTTTCGATTATATAT
-ATATATATATCTTCATGTAATTCTCATGAAATCTTGAAAAAAAACGCGAC
-ACATGGTATTACCACGCCCACTTTTTATAATTTGAGCGCGTGCAATTTTT
-TGTCGATAACATAGTTTCTATTTAAACAAAAAACATCGTGCGCCCACATT
-GAAGAAAATCCTATAATTGGGCGTGGCCTTAACTCTGAAAATTTACAGAA
-CGTGTCACCCATAGCATGATTGCCGATTGGCTCGAGCAGAATGGATATCC
-AATATCATCTCAAGTCTTGAAAACAGAAATGTCTGGAAACTACATGGAGA
-GTGCAGAAAAACACGTGGAAAATGGGGAAAAAATCGATAATCTATTGCGA
-AGTCAGCTGAAAATCGATATTCGCGATGGCACCGGTGACGATTTTGAACG
-AAAATCGATAAAATCGATTGGCGCCGGCCGCCCGTTTGCAAAAATTAATA
-TGGTCGATAAACAGCGAGCACCGTTGAAAATTACACCGCTTAGTGATGAG
-GAATTTCGAAAAACGATGCGGAAACGGATGGAAATGGAGAGGGAACGAGT
-GAGTTGCGTTAAATAATTTTTTTTTGAAATATTTAACAAAAGTCGACAAG
-GCGATTTTTTAAAATCGATGTTTCGCGACTTTTATTCAAAAGAAAAATTT
-CAATGCCCTAAATCACTCAAATGATGATTAAAAAAGTATTTGCGCGCGCG
-CGTAAAATTTAGTGCCAGCGTATGACACTATGTGGTGCAAACTTCACTCC
-GGGTCCGACACTTTTTGGATTTTGCGCATCGCTATAAAGATTTCAGATCG
-CGGCGTGAGAGCGGCGTTTGCGGCGCCGACATGAGAGTCCTACTTTCCTA
-CTTTTCTTGGCAAAAAAATCGATCGATTTTTCAGCTCGCACGTCTATCCA
-ACCAGGCAGAAGACGATTCCGACGATTCATCGTCCTCCTCCGACTCTTCC
-ACGTCATCCGCGTCGTCATCTTCCGAGGAGAAGTTGACTTTTTCGGATAT
-CTTGGGGAAACCCACAGCAGCTGGCGCGGAGAAAATGATCGAACTAAGCC
-AAATTCCCAACGCATGGGGTCCGTCAAAATCCGCGTTAGTCACTGATGAC
-GTGGCAAGCACTTCTGACCCACTTCCGGCGATTTTCAACGCACATCTTCC
-GCCGCTCTCCATGGGACGACCACCGCTGACAAAAAGCGCGAAAAGTCGGG
-AAATCGACGCCATTTTCGGCTCGGATAACGTGGATTATGATTTAGAGGAT
-TTCGAGCAGGATGGCGTGGCGAAGAAAAAGTCTATACTGCCTATGGAGAA
-AAAGAAGGAGGAAGCGAAACCAAAGGAACAGGAGCTAGTGGAGCCGTTGG
-TCTTGTCAGAAGGTAACTTTGAACTTGCACCATGCAAAAATTTCGAAAAA
-TTATGCACGTGGTCACTGGCTGTCCTTTTGCATAAGCTTGAAGCAAACGC
-GCCTCATTGAGAATTCACGTTTGCGCCAACTCTCGCTATCCATTGGGCGT
-GAGAGACGCAGATACTACTTTTTTCTCTGAACGTGAAAAACGCAAAGAAT
-AACCGTTTTGCCGTCTGCATCTCTTCTTTCACACGCTATTTTGGCTGTGG
-ACGAGGAATTCTCCTCTTCCAGGATTTTCTAGGCCATTTTCTCATATTTC
-TCAAGTTTTCTCGTCCGCGAGAAAACGTGAATTTTGAGACAGCCAGCGAG
-CACGTGATTATGCAACTCTCCTAAAAATCGATCATTGTTCCTGTAGCTTA
-TAATTTTAAAGGCGCATATTCCGCTTGCGGAGCAAAAGTAAAAAAAAAAC
-ATGCCTCTACATACAAATCGATGAATTTCCTGAAAAATCAATAATAAAAA
-ATTTTCAGGAGAATCAATCGACGAGCTTGAAGATTTCGACACCGGTCTAC
-TATCTTCCGGAGGATCCGATTATTCTTTTTAAAATTTTCTTCTTTTAAAA
-AATTTCTTTTGAAATAAATAAATTCTCACCTAGGAATTTCAACAATTCAA
-CTTGAAAAAAGTTCGCGCAAACTACGAACAAATGTGTGTCGAGCGGGCGG
-AGCCACTGAGAAAGAGGAGCAAAATGTACACAAAACCATATTTGAGTGTA
-ATTTTTCAAAGTTTGGCGCCGATTTTCTGTGAGAGATGAGTTTTCTCAAT
-TTATATTTGGTTATTTTTATTTTAGTTCTTACTGGTAAATTTCTGGGTAA
-GTCCTGATGACTTTGAAAACGAAAAAAACTCTTTCATTGATGCTAGTGCG
-ATTGCTAGGAAAGCAACTTTTCAGTTACCAAGAAAAAGTCCAAGGCCATA
-GGGATTAGCTGCGTGGCATAACAACTCATCCATCCTCGCAGATGCAAATC
-CGCTCTATTGGCAAATAACATGGAAGAGTATAAACATTTTCTCTTCCACA
-CGGAAACCTAGTCCCCTTGGGGAGCGGTAGTGCCCACAACCCCGCATGTT
-TACCAAACTACACAGACAGCGCTATTGTCTGCAAGTGGCAAAAAATGGCC
-GCCGAAAATTTTTACAATGTAAATAATTTTCAAAGTGTTACTATTTGCAC
-CTTTTTGGCAAAAATTCCATAAGTAAGAAATTTGATGGAAGAGATGCGAG
-GTGCGGGGAGTCTGAAAATGGCTGCATGGCCTGTATGTGACCTGTGTATG
-TGGCCTAAAGGTCTAGTTACCCCTAGAAATCAAAGTTCAGTTCAGCAAAG
-AGACTTTATTTTCAGCACTCCAACAAGAGGCAGAAACTCAACGGTACGAC
-GGATGGTACAACAACCTGGCGAACAGTGAATGGGGTTCTGCTGGTAGGTT
-TTTTTGGAAGAGAAATGACGTCACACTGACCTACTCCTTCAGGAAGTCGG
-CTGCATAGAGATGCACGTTCCTACTACTCAGACGGTGTATATTCAGTGAA
-TAACTCACTTCCGTCCGCCCGTGAACTCTCCGATATACTATTTAAAGGAG
-AGTCCGGTATTCCTAATACAAGAGGATGCACCACTTTATTGGCATTTTTC
-AGTTTGTATTTTTTTAATACTTATAGTAGCCAATGTTTGTAGGTCAAGTA
-GTTGCTTATGAAATAATGCAATCAAATGGAGTATCCTGTCCACTAGAGAC
-ACTTAAAATTCAAGTACCCCTATGTGATAATGTATTTGATAACGAATGCG
-AGGGGAAAACTACAATCCCATTTTACCGTGCAAAATACGACAAAGCAACT
-GGAAATGGTCTTAACTCGCCTCGAGAACAAATCAATGAACGGACTTCATG
-GATTGATGGATCATTCATCTATGGTACCACCCAGCCATGGGTGTCCGCAT
-TAAGATCTTTTAAACAAGGACGGTTAGCTGAAGGTGTACCTGGATATCCA
-CCACTTAACAACCCACATATTCCATTGAATAACCCCGCTCCGCCACAAGT
-ACATCGATTGATGAGTCCAGATAGATTATTTAGTGAGTTCATTGTTCTAT
-AGAAAAGTATAAATATTTAAAATTGAAGTGTTGGGAGACTCGCGTGTGAA
-TGAGAATCCTGGTCTTCTTTCATTTGGTCTGATCCTCTTCCGTTGGCATA
-ACTACAATGCAAATCAAATCTATCGAGAACATCCTGACTGGACAGACGAG
-CAAATCTTCCAGGCAGCACGTCGTTTGGTGATTGCATCTATGCAGAAGAT
-TATTGCATATGACTTTGTTCCAGGACTTCTAGGTTACTCAACTATCATTT
-AATAGCTTAAACTCAGTGTTTCTTTTAAGGTGAAGACGTTCGTTTGTCAA
-ACTACACCAAATACATGCCACATGTTCCACCTGGAATCTCGCATGCTTTT
-GGAGCAGCCGCCTTCAGGTTCCCTCACTCAATTGTGCCACCAGCAATGCT
-TCTGAGAAAACGAGGAAATAAATGTGAATTCCGGACGGAAGTTGGTGGAT
-ATCCTGCATTGAGATTGTGCCAGAATTGGTGGAATGCACAGGATATTGTG
-AAGGAGTACAGTGTGGATGAGATTATTCTTGGTTAGTTCATACTTGAGTG
-GTTATATAATAAAGATTGTAATTTCAGGAATGGCAAGCCAGATAGCTGAA
-CGAGATGATAACATAGTAGTCGAAGATCTTCGTGATTACATCTTCGGACC
-AATGCATTTCTCTCGTTTGGATGTTGTTGCTTCATCAATAATGAGAGGAA
-GGGACAATGGAGTACCACCGTATAATGAATTGAGAAGAACATTCGGACTT
-GCACCAAAGACATGGGAGACAATGAATGAAGATTTCTACAAGAAGCATAC
-TGCAAAAGTGGAAAAGTTGAAAGAGTTGTATGGAGGCAATATTTTATATC
-TGGATGCTTATGTTGGAGGGTAAGCGTTTTTTATAAATTAAGTTAGAGAT
-CCTCCAATATACCCTCATAACATATTGTATCAGTTTACTTCATCAATAAT
-TCAGCTTGAACCATTTAGAATGCTGGAAGGAGGTGAAAATGGGCCTGGAG
-AGATGTTCAAAGAAATCATAAAGGATCAGTTCACCCGTATTCGAGATGGA
-GATCGATTCTGGTTTGAGAATAAACTAAATAGATTATTCACTGATGAAGA
-AGTTCAAATGATTCATAGTATTACACTTCGTGATATTATCAAAGCAACAA
-CCGATATCGATGAGACGATGCTTCAGAAGGATGTGAGTTTATTGTAAACA
-CCCGTTGGTGATGATCGAGTAAGTTAATAGCATGTTTCATTCCAGTCATT
-GATTGATATTTTGTCATGAATTGTTATATAACAATATATGTATGTATTAT
-ATTACTCATGTCTCAATATTGCATTTAATTTCCAGGTATTTTTCTTCAAA
-GAAGGTGATCCATGCCCCCAGCCGTTCCAAGTGAATACCATTGGACTTGA
-GCCTTGTGCTCCACTTATTCAATCCACCTACTGGGATGATAACGATACTA
-CTTATATCTACACTCTAATTGGTTTGGCGTGTATTCCTTTAAGTCAGTCT
-TTATTTCAATCTAAATGACTACCGATAGAGACTCAGCGATTATAGAGTTG
-ATCAAGCTAAGAACTTTCAGTTTGCTATAGTATCGGTCATTATATGGTTG
-AACGACGTATCCGAATAGGTCATAACAGTGCTTGTGACAGCTTGACTACT
-GACTTTTCAACAGAAAGTCCCAAAGTTAATGTCTACAAAGTGAATGGTTC
-GTTATTTTTTCATACTTGATTTTTATTTAAATTATACGGTGAATCTGTTA
-CAGCTTTGGAATGGCTTCAAGAAGAGTACATACGGCAAGTTCGGATAGAA
-ATAGAGAATACCACGTTGACAGTGAAGAAGCCACGTGGTGGAATCCTTCG
-AAAAATTCGTTTTGAAACTGGACAGAAGATTGAGGTATTCCACTCTATAC
-CGAATCCATCAGCAATGCACGGACCATTTGTACTTTTGTCTCAAAAGAAT
-AATCATCATTTGGTGATAAGATTGTCGTCTGATAGAGATTTATCTAAATT
-TTTGGATCAAATTAGACAGGCGGCTAGTGGAATCAATGCAGAGGTTATCA
-TAAAGGATGAGGAGAATTCTGTGAGTTTACTTCAAGAAATACGTCGAATC
-TGGAAATTATTTCAGATTCTCTTGTCCCAAGCAATCACAAAAGAACGCCG
-TCAAGACCGACTGGACCTGTTCTTCCGTGAAGCCTACGCAAAAGCATTCA
-ATGATAGTGAACTTCAAGATTCGGAAACTTCATTTGACTCATCGAATGAT
-GATATATTAAATGAGACAATATCTCGTGAGGAATTGGCAAGTGCAATGGG
-AATGAAAGCTAATAATGAGTTTGTGAAGAGAATGTTCGCGATGACTGCAA
-AACATAATGAGGATTCGCTCAGTTTCAATGAGTTTTTGACAGTATTGAGG
-GAGTTTGTTAATGGTGAGTATGATTTACTAAAGTTCTGATCACAAAAACT
-ACACGTGAATGAATGTTCCAGTCCGTTTTACACTAGGTTCGGTAAATATG
-TATAATGTTATAGTGACTGTTACATGTTGAAGCAGTAGTCTTCTTTTCTT
-TGAATGGCAACAAAAAGGCTCCCTCATTATTTAAGCTGTATTTCACTGCG
-AATAACGGCTTAATGTGCTATTTAAACATTCGGGTCTATTAGTCTTTTAG
-TATATTGTCGCGCATACTAAGGCTCGCTTTAATAATCAGTTTGAAACGCG
-AATTTGATGGTGTTAAATACGATTTTAATTTGGGAATTGTTCACAATTAG
-ATGCTATCTTGACTAATAATAATTAAATACAGAAACAAAAAACTTTTAAT
-GGACAAAAATCACTCCGAAACTACCCAAATCGGCATTAGGTTAATGTCTT
-TGATTACTCACCTTCTTTCCTAATTTCCAGCTCCTCAAAAGCAAAAACTG
-CAAACTCTATTCAAAATGTGTGATTTGGAGGGAAAGAACAAGGTACTCCG
-AAAGGATCTCGCAGAACTCGTCAAGTCCCTCAATCAAACCGCCGGAGTTC
-ACATTACCGAAAGTGTGCAGCTTCGATTATTCAATGACGTGCTGCACAAG
-TCTGGTATACATCCCTGTTTAGTATGCCAAGTATTATAAGAAGTTTCAGG
-AGTAAGTGACGATGCGGAGTACTTGACTTGTAATAATTTCGACGCATTGT
-TCTCGGAGATCTCTGACGTCCAGCCGATCGGTCTGCCATTTAATAGGAAG
-AATTATAACTCACATATCAAGGAGTATGTTGTTGAATTCAAATCCGCAAG
-TAAATACAAACTTCAGGCCATCATGCCACACCTCATTCCCAATAGTGGAC
-CACTCTACTCCTGCTCCACTTTCTCTGATTCAGAGAATTTGTGCATTCCT
-GGAAACCTATCGCCAACACGTCTTCATCATCTTCTGCTTTGTCGCCATTA
-ACATTGTCCTTTTTTTCGAACTTTTCTGGCGTAAGTTTACTGTTTAGTTC
-GGTTTTCAAAAGCAATATTCAATTAAGATTCCCGCTACCTAAACGAAGAT
-CGAGACCTCCGTCGGGTGATGGGTGCCGGGATCGCTATCACTCTCTCTTC
-TGCGGGAGCCTTGTCATTTTGCATGGCGTTGATATTGCTCACAGTTTGTA
-GAAATATTATAACACTGCTTCGAGAGACAGTTATTGCGCAGTATATTCCA
-TTTGACTCGGCTATCGCGTTCCATAAGGTAAGAGCCTCTCTCTTGGCCTA
-GCGCTGTAAATAAAACTGCCAAATTTTTAAACTCCATCAATTTCAGATCG
-TCGCATTATTCACCCTATTCTGGTCTACCCTTCACACCATCGGCCATTGT
-GTTAACTTTTATCACGTTGGAACTCAAAGCGACCGTGGACTTGCTTGTCT
-CTTCCAGGAAACATTTTTCGGGTAAGCCCCACCTACTCGGTAGATCTCTC
-AGTAGATTGAACGTTGGCTTGCTTTCAGATCTGACGTCGTGCCTACCCTA
-AGCTATTGGTTCTATGGAACAATTACTGGGTTGACGGGAATTGGATTAGT
-TATTGTTATGAGTATCATTTATGTGTTCGCATTGCCAAAGTTCACTAGAA
-GAGCATATCACGCGTTCCGGCTGACTCATCTTTTGAATATTGGGTTTTAT
-GCACTCACTATTCTTCACGGACTTCCTTCACTTTTTGGGGTAAGGCTTAA
-TTTAATTTGATTCATTTACGCTCTTTTTACGCTCTTGACGTCAATATTTG
-TTACAGTCTCCCAAATTTGGCTACTACGTTGTTGGACCCATTGTCCTTTT
-TGTAATCGATCGTATAATTGGGTTGATGCAATATTACAAGTCGTTGGATA
-TTGCCCATGCAGAAATCCTTCCATCAGATATTATATACATCGAGTACCGT
-CGTCCAAGAGAATTTGAATATAAATCAGGACAATGGATTACTGTATCATC
-ACCATCTATATCATGTACCTTTAATGAATCTCACGCATTCTCGATTGCCT
-CAAGTCCACAGGATGAGAATATGAAGTTGTATATAAAAGCAGTTGGACCA
-TGGACATGGAAGTTGAGAAGTGAATTGATAAGATCATTGAATACAGGGTC
-ACCATTCCCATTAATTCATATGAAAGGACCATATGGTGATGGTAATCAGG
-AATGGATGAATTATGAAGTTGCAATAATGGTTGGAGCAGGAATCGGAGTG
-ACTCCATATGCATCCACGCTTGTTGATCTTGTACAAAAAACATCAAGTGA
-CTCGTTTCATAGAGTTCGATGTCGTAAAGTATATTTCCTATGGGTGTGTT
-CGAGTCACAAGAACTTTGAATGGTTTGTGGATATGCTGAAAAATGTTGAA
-AATCAAGCAAAGCCGGGAATCCTGGAGACACACATATTCGTCACTCAGAT
-GTTCCATAAGTTTGATTTAAGAACTACTATGCTTGTGAGTTTTTTATGCG
-TTTTTGGTTTTTTAGTGGTATAACTCTAAAACTAAATGTTTGGAGAAAAA
-GGCTTAACTAATAAAATGTTGCTCATAACTTTTTCTATGCAATAAAATAT
-GTTTCAAAATTTCATCCGAGATCTCACAAGTCCAAATTTGATTATTTTTC
-TTAAAACGAGTATATTTCAAGACCGAAAAGTTTTCTTGAAAAAATGGTAT
-ATTTTTTGCACATAATCATTTTTTCATAAAGTGCTCTGCAAATCAGAAAT
-TAAAGTTCGAACAGTCTTATAGTTAGTACCGTGACATTTATTGTAACTTA
-AAAAAAAAAATTACGCGACATAGAAACGCTCGATTATCTGAAAAACCAAA
-TTGGATTTTGATTCTAGTTAATTTATTTTCAAAAATAAACATATTTTGTG
-ATAATTGTAAACTAAAAACTATACCTGAATATTTTTATAAATTTTATGTG
-GTTTTTGGTTTCAGGATTAAAACAATGGTAAAATACTACCCTAACGGCTT
-ACCCAAGGCTCAGAAAATTGTAGTTAGTCTCAACAAATTAATACATATCA
-TTTCTTATTTGCAGTACATTTGCGAGAAGCACTTCCGTGCCACCAACTCA
-GGCATATCAATGTTCACTGGCCTACACGCTAAGAATCATTTCGGACGGCC
-CAACTTCAAAGCTTTCTTCCAATTTATTCAGAGTGAACATAAGGAGGTTA
-GTTTCATGGTTTTAACCTCTAAATAAAGCAAATTTGCAGCAATCCGAAAT
-TGGAGTGTTCAGTTGTGGACCTGTAAACTTAAATGAAAGTATAGCTGAAG
-GATGTGCAGATGCCAATCGACAACGAGATGCTCCGTCATTTGCACACCGC
-TTTGAAACTTTCTAATCTTTCTACTGTTACTTACTATGAAAATCATAAAA
-ATTAAGACGCTTCATGAATAAAACATTGAGAAAAAAAACCTGAAATAAAG
-AATTTTCACATTTGTCCAGGTAGTATATATCCCCAATACAAACATTTTGA
-GACGCGAACCTTCCCAAATAATCATCAGACATTGTTCTGTAATTAGGCAA
-AAAACCAGCCCCCTAGCCTCCTCCCTCACCACAAATAAAACCAATTCCCC
-CATTTCCCCCCAGTTCATTCACCAACAATGAGTTTGTTCAAAGTATACAC
-CTCGTTTTCTTTGTTTTTCTCCGTTCTATTCCTTCTCGTCGCTTTTATTG
-TGATCTATGACATTTTCGATGAAATTCGCGAATTTCAAGAAGTAATCGAA
-AAAGATGCCAGGAAGTTTGAGGTAAGGCAATATGTGGTGCAGCAATAATT
-TCCGCATTTTTCGTAGATCATACCGTTATGGGACAGTCTGACACCACGTG
-ATAAAATAGTATACTAAGTATTACAAGCAAGGTTGAAACGAAAATGAAAT
-TTCGTTTTCGAAAACGAAAACGAGAATTTTCGTTTTAAACGCGAAAAACG
-AAAACGAAAACGAAAATATCAGTTTTGTCCAATTTAATTGGTAAAATATA
-GATTTCATGAAATATTAGGTCCATTTTCGAATCAATAATAAACAAACAAT
-AGTTTTATTACAAAAAAAACAATAAAAATTAAATAAAGCAAAAGAACAAT
-AACAATAACACTTGCTGAACAACTATTCCATTAATCTAAACCAATTTTAA
-AGCCTAAAACTTTTTGATTTTGCTGTAAGAACACAGACTTGCTCAACGAC
-TTTGTAGACATCTTTCTTCTCAGCTTTGTAGAAACGCGGCCAGCTCCTGA
-AAAAACTCGTTCCGATTCAGCAGATGAAGCTGGAGTTGTCAGATATCTGT
-TCGCTATTTGAGAAAGCAATGGAAACTTAGATCGATTGAGCGGATTTTGC
-CAAAAAACAGCGGGGTCTGATTTTCTATTGTTATCGGTATCGTAGAAAAC
-TTCAACTTCTGCACTAGCACAGAGCATGGAATCTACAGGCGCTTTGTCTT
-TTCTTTTTCTGATCTTGGAATGCTTTTTCTCGTAAGCTTCAAACAGGTCG
-TCTATTCCCTCAAGAGTTTCATTTTCTGGCTCATCGACTGCTTCTTCCTC
-TTCTTTTGATAATCCTTGAGCTAAGCTCAAAACAAGCTCTTTTCCGTCAC
-AATATTTTCTTTTGTATCGTGGGTCAATGTTTGATGCAACAATCAGTTTG
-AATGTCACCAGTCGGTGCCCGCGCCGTAGGTGCGGTCAACGGCTGGTATG
-TATATAAAATATATTAGATTGAAAATATAACATTGAAAAAAAAAAACAAA
-CATTGAAACACAATAAAAATCAAAATATAGACGCTCTTTATTCTTGAATA
-AAAATAAGAATTACGAATTGTTCACTGGGAGTCAGCTTATTTCTTGTACA
-AAATAATGATTTTGACCAGTGTCAGCTCAAAAAAAATACGTTGACAGAGA
-GAGGTGGCATTTTCGTTTTTTCGAAAATTTTCGAAAACGAAAACGAAAAA
-ATCATTTTCGCCAAAAACCCGAAAATAACGAAAAAACGAAAATTCGAAAA
-CGAAAAAGTGACAAGCCTGATTACAAGGTCGGTATTTCATAATATGAATA
-TTGTAGAGAAAGGTTACTAGCGATGATTCCAAAAAAATTTAGATTCATCA
-GAGATGTACACCCAAATACCCAAGGCATAGGCCCTAATTATTGATTAGTC
-ACAACTTCTTACTTCCAACAAGCTTTTCCTATTTTTCCAGTTCTACTCCA
-CCGCCGCCTCACGTTCAATTGCCGGTCTCGACAAGCGGAGCCTATTCGGA
-GGAGCTGTTTCTTTTTAGTTGTATATACATCTATTCAAAATTAAAAGTCA
-TTGTTGTTGTTACCCATAAAACAGTGAATGAAAAAAAATGAAGTCTAGAC
-AGAAAATGTAAAGCTGGCACAGAATACTCAAAGAAGCATAAAATATGTAT
-AATAATGATGATATAGGGAAGGTTAGAACGTTTCAAAGCGATGTGCAAAT
-GAAGGAGCATCTCGTTGTCGGTTGGCATCTGCACATCCTTCAGCTATACT
-TTCATTCAAGTTTACAGGTCCACAACTGAACACTCCGATTTTGGATTGCT
-GCAAATTTGCTTTATTTAGAGGTTAAAAAGCATTTAACTAACCTCCTTAT
-GTTCACTCTGAATAAATTGGAAGAAAGCTTTGAAGTTGGGCCGTCCGAAA
-TGGTTCTTAGCGTGGAGACCAGTAAACATTGAAATTCCTGAGTTGGTGGC
-ACGGAAGTGCTTCTCGCAAATGTACTGCAAATAAGATGTTAAAGTTTAAA
-AGCTTCAGACCTTAAGATGCCACTGCGTTTAAATGCGTCCGCTTTAATCA
-GTTTATAACCAAACCTGACGTTTGATTTTGAAAATTATCTTCAATAAACT
-CACAAGCATAGTAGTTCTCAAATCAAACTTGTGGAACGTCTGAGTGACAA
-AGATATGTGTCTCCAAAATTCCCGACCTTGCTTGGTCTTCCACGTTCTTG
-AGCACATCCACAAACCATTCATAGTTCTTGTGAGTTGAGCACACCCATAG
-GAAATATACTTTACGGCAACGAACTCTGTGAAATGAGTCACTTGATGTTC
-GTTGTACAAGATCAACAAGTGTCGATGCATATGGAGTCACTCCGATTCCT
-GCTCCAACCATTATTGCAACTTCATAATCCATCCATTCTTGGTTACCATC
-ACCATATGGTCCTTTCATATGGATTAATGGAAATGGCGATCCTGTATTCA
-ATGATCTTATCAATTCGCTTCTCAACTTCCATGTCCATGGTCCAACTGCT
-TTTATATACAACTTCATATTCTCATCCTGTGGACTTGAGGCAATCGAGAA
-TGCGTGAGATTCATTAAAGGTACATGATATTGATGGTGATGATACAGTAA
-CCCATTGTCCTGATTTATATTTAAACTCTCTTGGACGACGGTACTCGATG
-TATATAATATCTGATGGAAGGATTTCTGCGTTTACAATTTCTAATTTTTT
-GTAATATTGCATCAAACCAATTATGCGATCAATTACAAATAACACGATGG
-GACCAACAACGTAGTAGCCAAATTTGGGAGACTGTAACAAATATTGAAGA
-AACTTCTTGAACCGAACAGTGGCAAAAACTCACATCCAACAACTTTGGAA
-GCCCATGAAGAAGAGTAAGTGCGTAAAAGGCAATATTGAGAAGATGTGTG
-AGCCGGAATGCGTGATAAGCTCTCTTAATGAAACATGGTAACGCGAAAAC
-ATAAATGATGCACATGACAGCGACCAATGCAATTCCTGTCAGACCTGTAA
-TTGTGCTGAAGAACCAGTAACTGATTGAAGGAAGGAAGTTGGATCTGAAA
-GTTATTTGATGAAAGTTGTTGACAGTCTTGAGGGAGTTTGTTAATGGTGC
-GTATTCTAGTAAGATTGAATGCAAAAATGAATTCAAGTAAAGTATTACCC
-AAAGAATGCTTCCTGAAAGAGACAAGCAAGACCTTCTTGACTTTGAGTTC
-CAACGTGATAGAAATTGACACAATGTCCAACGGTGTGAAGAGTGGCCCAG
-AAAGCCGCAAAGAGCGCAACGATCTAGAAATGTTCAGTTATTATAGAGTT
-TTTGATACTGGCGGTCATAATAAACAATACTTTGTCCGAAATATTAGTTT
-TCCCATTGTTTATCATAGTTTATTTTTTTATTCAAAAATCTGCCCTCTCT
-ACAGAACACTTATATGTAAAGTAGACTTAAAAACATCTGAGTTTTTTGAG
-CAACAAGAGACCCACACTCGTTCTAAAAAGAAATATATCTGGAGCACAGG
-AAAATCTAAACTTAGGAGACACTTTTTTGTCAACAGAACACTACACACAA
-TGAAGCAACACTGATCTAATGTTACCTTATCCTCACTTCTATTCATCATT
-TATTCTTGCCTTTTATACATCGATATTTGTGTTTTTTGCTTCTTCTCCAA
-TGTAGCCATTATTTTTTTTCTCATCTCTTTTTATTTTTGTTCCATTTTTA
-TTTATGTAACCACTTGTGATGGTTTGTATCTATTAATGTGTGTTTTTTTT
-CTACCTCACGATATCTTACTATCGTAATAAATTTAAAAAAATTAAACACT
-TACAAGTTTAGGATAACATCGCTATATCATAAGTTCACATCTGGCTGAGA
-AACACCATGTTCGATGCAAAGATCTTTCCTTTCATGCTTGTATTCTATTT
-TAAAAAATCTTTTCAAAACATTGGGTATGCACAGTACAGTTATCCTACTT
-GCATTAAACCTCCGCATTACTGTACAGATAATAAAATAACAAGTTTTCCC
-TTATATCTGAACATGCTAAATATTTTTAAAAACAACTGATTTGACAAAAT
-TTACTAATGCAATAATAATATTTAAAAAATGTGTTACACGCTGCCCTAAC
-GTTTCTCACCTTGTGGAACGCAATAGCCGAGTCAAATGGAATATACTGCG
-CAATGACTGTCTCTCGAAGAAGTGTGATTATGTTTCTACAAACTGTCAGC
-AATATCAACGCCATGCAAAATGACAAGGCTCCCGCGGCACCACGAGTAAT
-AGCGATTCCAGCTCCCATTACTCGTCGGAGATCCCTGTTTTCCGCCATGT
-AACGATAATCTGAAAACTAAATTAACATGAGCTCCCAATTATATGAACTT
-ACGCCAAAACCGTTCGAAGAAAAGAACAAGATTGATGGCAACAAAGCAGA
-AGACAATGAAAACGTGTTGGCGATAGGTCTCCAAGAACGCTGAAACTTTG
-TGGATCAAAGTTAGCGGTGCTGAACTGTTGATGGATCGATCCACGACGGC
-AAATGAGTTCAGAGAAGATGTTCTAAAAGTTATAATTGTTATACAGTCAG
-AGTCCTCCTGAATACTCACTCTCCAATACTTGGCTGATAGTTCTTTCGAT
-TGAACGGCAGTCCAACTGGTTGCTTGTCAGGTATATCCGAGAACAGAGCA
-TTGAAATCGTCGTAAGTCAGGTACTTGGCATCATTGCTCACTCCTGCATA
-GTGCAACACTTCATTGAATAATCGAAGCTGCACACTTTCAGTAATGTGAA
-CTCCAGCGGTTTGATTGAGGGACTTGACGAGTTCCGCGAGATCCTTTCGG
-AGTACCTTGTTCTTTCCCTCCAAATCACACATTTTGAATAGAGTTTGCAG
-TTTTTGCTTTTGAGGAGCTGGAAATTAAAGTAGGTGGTGCATAACATTTT
-TTAAAGGCAGTGTTGGTTTTTCTACTGTTCAGTAAAAGAAAATCTACAAT
-TGACTAAATTCTCAATACTTTGATGCCATATTAGTTGTGACCTCCCTGTC
-ACACGAGAACTTTCTACAGTGCTCGCAAATTCTATAGGACTCCCCCGAAT
-AAATTCAGATTCAGAATAAATAACCTTTAGAACTTTTACTATCTCGAAAT
-ATTGCCGACCATAGGACACCGAGTTTCACCTCACGGCTAATGAACCTACA
-AAATGTTAATCGGTCGCTAATCCCGGCCTAGTTTAAATTCAGATCAGAAG
-AAATAAATTTCTTTTCGCAGGAGACTTCGGCTCTCTTGAACCAAAACCTT
-TTATATGTAGTTTTGTACGTACAAAATCAAAGACAGTTCAAAACAACTTT
-ACCGCTACTGCTGTTACACGTAATTAAGCTGCATTAAGAAATTATATTTA
-TTCAATTAGAACTTATGTTAATGGGAAACACGCCGGAACATTCTAGAACG
-TAGTCTTTGTATCACAACAAATTTATGCTGAAATACTCACCATTAACAAA
-CTCTCTCAAGACTGTCAAAAACTCATTGAAACTGAGCGAATCCTCATTAT
-GTTTTGCAGTCATCGCGAACATTCTCTTCACAAACTCATTATTCGCTTTC
-ATTCCCATTGCACTTGCCAGTTCCTCACGAGATATTGTCTCATTTAATAT
-ATCATCATTTGATGAGTCAAATGAAGTTTCCGAATCTTGAAGTTCACTAT
-CATTGAATGCTTTTGCGTAGGCTTCACGGAAGAACAGGTCCAGTCGGTCT
-TGACGGCGTTCTTTTGTGATTGCTTGGGATAAGAGAATCTGAAATAATTT
-CCAGATTCAACGTATTTCTTGAAGTAAACTCACAGAATTCTCCTCATCCT
-TTATGATAACCTCTGCATTGATTCCACTAGCCGCCTGTCTAATTTGATCC
-AAAAATTTAGATAAATCTCTATCAGACGACAATCTTATCACCAAATGATG
-ATTATTCTTTTGAGACAGAAGTACAAATGGTCCGTGCATTGCTGATGGAT
-TCGGCATAGAGTGGAATAACTCAATCTTCTGTCCAGTTTCAAAACGAATT
-TTTCGAAGGATTCCACCGCGTGGCTTCTTTACTGCCAACGTGGTGTTTTC
-TATTTCTATCCTGACCTGTCGTATGTACTCTTCTTGAAGCCATTCCAAAG
-CATTTACACCATAAATATCTCCCTTCGCGCCACAATCATCATTTGCAAAG
-TCAGTAGTTAGGCTGTCACAAGCACTGTTGTGGCCAATAGCAATGCGACG
-ATTAACCAAGTATCGGCCAATTCCATAGCAAACTGAAAGCATTTTGGTTT
-GTATGGAACTAGATGCAATAGCTCACTTAATGGCACACATGCTAATCCAA
-TTAGGGTGAAAACATAAGTGGTGTCATTATCAGTCCAATAAGTTGATTGC
-ATAAATGGAACACATGGTTCAAGTCCAGTTGTGTTCACTTGGAATGGTTG
-CGGGCACGGGTCACCTTCCTTGAAGAAGAATACCTGGAGTGATAAATACA
-TTGCAATGCGGAATTCAAAAGAACATAATAATAAACCATTAAATTTGGAA
-AGTAACTTACATCCTTCTGAAGCATTGTCTCATCGATATCGGTGGTTGCT
-TTGATAATATCTCGAAGTGTAATACTATGAATCATTTGAACTTCTTCATC
-AGTGAATAATCCATTCAATTTATTCTCAAACCAGAATCTATCTCCATCAC
-GAATACGGGTGAATTGATCCTTTATGATTTCTTTGAACAACTCTCCAGGC
-CCATTTTCACCTCCTTCCAGCATTCTAAAATAATAACGTTTGATTAACGT
-AATCCAATATATGTGCACTGAGAAAGAAACAAGTATGCGTAATTTATTCT
-GCCTAGATTTGCAAAAAAAACTACCTTGCATGGGTAACGTTTGAAATACC
-GAAGGAATTGCACTATAAAACTGAGGTGACATACAACTTCCAGAGTTTAT
-GCCTGCTACAAATTTTAGAGTTTGACCAAAAGAAGCCGTTAGAAGTTTAC
-TCGTGAGAACTTTTTAACCCTTGAGAAGATTTAGTGAATATTCAAAATTC
-CACACTTCTTAAACCAATCAGTTATGTTAAAACGAATTGATTTTCATTGT
-TTTTGCTTGAAACTCTTCGAATTCACCGCATTTTAAGTTAAGCATTCCAC
-TTTAAACCCAAAACTAACCCTCCTACATAAGCATCCAAATATAAAATATT
-GCCTCCATACAACTCTTTCAACTTCTCCACCTTTGCAGTATGCTTCTTGT
-AAAAGTCTTCATTCATTGTCTCCCATGTCTTTGGCGCAAGTCCGAATGTT
-CTTCTCAATTCATTATACGGTGGTACTCCATTGTCCCTTCCTCTCATTAT
-TGATGAAGCAACAACATCCAAACGAGAGAAATGCATTGGTCCGAAGATGT
-AATCACGAAGATCTTCAACTACTATGTTATCATCTCGTTCAGCTATCTGG
-CTTGCCATTCCTGAAATTACAACCTTTATTATATAACCACTCAAGCATGA
-ACTAACCAAGAATAATCTCATCCACACTGTACTCCTTTACAATATCCTGC
-GCATTCCACCAATTCTGGCACAATCTCAATGCAGGATATCCACCAACTTC
-CGTCCGGAATTCACATTTATTTCCTCGTTTTCTCAGAAGCATTGCTGGTG
-GCACAATTGAGTGAGGGAACCTGAAGGCGGCTGCTCCAAAAGCATGCGAG
-ATTCCAGGTGGAACATGTGGCATGTATTTGGTGTAGTTTGACAAACGAAC
-GTCTTCACCTTAAAAGAAACACTGAGTTTAAGGTATTATAATATAGTTGA
-TTAACCTAACAGCCCTGGAACAAAGTCATATGCAATAATCTTCTGCATAG
-ATGCAATCACCAAACGACGTGCTGCCTGGAAGATTTGTTCGTCTGTCCAG
-TCAGGATGTTCTCGATGGATTTGATTTGCATTGTAGTTATGCCAACGGAA
-GAGGATCAGACCAAATGAGAGAAGACCTGGATTCTCATTCACACGCGAGT
-CTCCCAACACTTCAAGTTTAAATATTTATACTTTTCTATAAAACTATGAA
-CTCACTAAATAATCTATCTGGACTCATCAATCGATGTACTTGTGGCGGAG
-CGGGGTTATTCAATGGAATATGTGGGTTGTTAAGTGGTGGATATCCAGGT
-ACACCTTCAGCCAACCGCCCTTGTTTGAAAGATCTTAATGAGGACACCCA
-TGGCTGGGTGGTACCATAGATGAATGATCCATCAATCCATGAAGTCCGTT
-CATTGATTTGTTCTCGAGGTGAGTTGAGCCCATTTCCAGTTGCTTTATCG
-TATTTGGCACGTGTAAATGGGATTTCTGTCTTTCCCTCACATTCTTTATC
-AAATACATTATCACATAGGGGTACTTGAATTTTAAGTGTCTCTAGTGGAC
-AGGATACTCCATTTGATTGCATTATTTCATAAGCAACTACTTGACCTATA
-ATTATTATTACTAATTTTTGAGGTAGAGGGCAATAAAAACGAACTGAAAA
-ATGCCAATAAAGTCGTGCATCCTCTTGTATTAGGTATACCGGACTCTCCT
-TTGAATAGTATATCGGAGAGTTCACGGGCGGACGGAAGTGAGTTATTCAC
-TGAATATACACCGTCTGAGTAGTAGGAACGTGCATCTCTATGCAGCCGAC
-TTCCTGAAGGAGTAGGTCAATGTAACGTCATTTCTCTTCCGAAAAAACCT
-ACCAGCAGAACCCCATTCACTATTCGCCAGATTGTTGTACCATCCGTCGT
-ATCTTTGAAATTCCTCATTTTGTTGGATTCCTGAAAAGATAAATGTTACG
-AGTTTTTGATTTCCAGGCCACCAAAATCTATATGATGGCCTAGGTTCCTT
-ATTGAAATTTCTAGGTCACACATGCTCCCTTCACTACATTTTCACACCGA
-TTCGTGCATTTTCTCACTGAACGCGCAAATTTCCGGTCAGTAGCGGAGCA
-GAGCAAACATTTGCCCCGCCACCCGAAACAATTATTTTCGTATCATTTTC
-GCACCTATATTTATTCTGTTTGTTTGCCTATTTTTTGTACATTTTATCCT
-TTTTCTTGTATTGGGCGACGATGGCAAGGTCAGTAAAACAGGAAATTGTT
-CCTGATAACTCGGGAATTTCAGGAATTTTTCCAAAATTGGTTGGGAAACC
-ACCACTTTGTTGAAATTCGAAAGATACACATTTTGTTATTTAGGTGTAAA
-CATGAACACTTTCTTAGGTAAACTATGTGATTTTTATGAAAAAGAACACA
-GACACCGGGTGGCACACAGAGCTTATCAGTAAACAGCTATCAGTGATTTT
-GAAATTTTGGAGGGGCAGAAATGTTGCGGACAAGGAAAATTTTTGTTTGG
-AATTTGAAGTTTTGAAATACGCAATTTGAGAATTTTTGAACATTTTTTTG
-TAATTTTTATCCCATTCATTTTTAACCTAACATTTTGAAAATCTAGCACA
-GAAAATAGTACAGACACGTTCAATTGAGCTATTCCAAAAATTATCAATAT
-AGCGCACTTGGTGTCCATCTTCCTTAACTGTTTGCAATTAGTCTCTCTTT
-ACAAGAAATCAGCTACTATTTGAACAGATCTTGAACACATTTTCAAAGAT
-CGGCTCAAGATCAAAAGCCTCTTAAACATTTAAGATAGCAGGTCCGCTCT
-GTTGACAAATTTTCCACCCGGTCCTCCGAAAGGAATTTTTTTGGTCATCC
-AACAACCTAGACCATGACGGCACCGATCATGCAATTTGCCTGCTTATAAA
-AAACGATATTTCTAGGCCACCCATTTTTAAATATTTTTTTGCCTAGTCTT
-AGCTATGTGGAATAAATTCTAGGTCAGGAGGTTTTCTAGGCCACGTAATT
-CCACTCACCTTTCCCTCCAAAAATTGAACTGAACAGTATAGCTATGTACA
-GCACATGTTTTGAGCGCATTGCTCGTGCGCCTTAGAGTTTTAGTTGACCT
-GAAAATATTTGAATATTTAGAAATTGAAATTTTGAAACGCAATGATTAAA
-ACGGTCAAAAAAGATGTTATTTATACATACGCAACATTTCAAAATTGATA
-ACAAATATTTACAGGAACACTTTTTTCCAATAATACGGTGACTAAGGGGG
-AGTTTACTGATAGTAACAAATTGGAACGGTACAGGAAGAAAATTTAAAAC
-CGGCTCTACCCATTTTAGTGCTACCAGCCGACAACCAAAAAAATCAATCA
-GCCGCACACCCTGCTTGGAATGTGACAATCACAGAGTTTTGGAATTTTCC
-TAATTTCTAAAATTTAATTTTCTAAAAACTGGGGATTTTTTCTGTAATTT
-TTTTTTAATTTTAAATTATTTTTTAGGAACATTTTTTTGAAAATAACTTT
-TGTTTGAAAAATTGTTCGCTAAAAGAGTATAAATAAGATCAGGCTTCCGA
-AAATGTTTCAAAAAATATTTTTTCACGATTCTTGCAACAAAAAAAAACAA
-ATACTGAAAAAAAAATTGTAAGAAATTTATTTTGTTGAACTTTTCAAATC
-TACATTTACAACAAAAACAGTTCTTTATAATATTTTAAAATCCAAATAGA
-TTCCCAGTAGATTTTGTTTAAATATTCGGAAAACGACCAAACTTTCATTT
-TTTGAGTTCTTAAATTAAAAAAAAAATTTTAAATTAAAATTTTTGATTTT
-CAGTCTAAAAATTTCAAAAAAGAGCTTTTAGTTCTGTAACTTTTGGAATA
-AAAATTCAAAAAAAAATTGGGGGAGCCAAAAACTAACGCCTGCTTGAAAC
-CTGCCCGCGAGAACTTGCAAATATTCAATTTTCTCATTTTTATTAATTTG
-ATGAGAAAAATTTAGAAATAAAAAAAAATTTGCATAAGGCATCGATTGAG
-GCGAAAGGCAGGCGGAGGTAATTTTAAGGCCAGGCTGGCGTTTTAACTTA
-GGCTTCCATAGACCTAATATTTTCATACTTGTTGAAATTTCAGAGGTTTG
-AAAATTGAACAATTTAGGCCCAAAACCTTTGTTCCTACAGTACTACAAAA
-ATTCTTTGAAAAATTCCGGTAATAATAATTGGAGGAGGAGGAAAAATATA
-AAATGATTCTTCGTCAGACAGAAATAAATTGGTGAAGAGAAAAAAATGAA
-TTGAGAGAAAAAGAGAAAGAAAGACGGAGAGCGTCTTCGAAAGAAGGAAT
-CCTCCTGCGCGGGATCGAAAAAATAAGCAGCAGCCGGGAGTGAGAGAGTA
-CACTGCACTAGAAAAGATGCAGAGAGATTCACAGAAAATCGGGAGAGACC
-CCCCGTATGTCGGTCGAGACTGAACACCTAAGACCTACTTCATATTTCGA
-ACCGGTTCATTTTCATTGGCATTCGTATTATTATTAGTTTTGACAGGGGC
-AGTCGTCGTAGATGCTATTGTTGTCAGTTTGACGTGATGGCCGTGTCATG
-GGAAAAATTCGGCCATCAAAAATCGGGGGGTTCCTGCCACCCTTTGTCTT
-CTATGGTCGGAGAGGCGTTTTCTAGGCTACTTATTTTGGTAGAGTAGCTG
-TTAATTAAAAATTTCATCAATTTGGTAATAATGTGGCTGCAAATCATATT
-TAAATTTTCTATACAGTCAGTGCCACCCAATTAAAAATTTTCTGGCAGTG
-CCACCCAGAAAAAAAAAATATCCTAGGCCACCAATTTTTAAGATCATTAA
-TTTTTTGGCTATCAAATTAAGTAGACCACTAAAATGTTTCGTCATTAAAA
-TTTTCTAGGCCACCAATTTTGCTTGACTACTAACCTTCTTGGCCATCACA
-ATTTCTAGGCCACTAATTTTTTTTCTAGGCCACTAATTTTCTAGGCCACT
-AACAAACTGTTCAGGCCATAAAGTTTTCTAGGTCCCTATTTTTAGGTCTT
-CAATTTTTTCAGGCCACCAAAATTCTATTCCAACATTTCTCCGTCACCAA
-AGTTTCTAAGGCCTTTAATTTTATAGACGACTTCTTAATTGTAAGTCAAA
-TTGTTTCAAAACGATTATTTTCAATACATATCAAAAACCCAAAATTTTTC
-AAAAACTTAGTAAACTAAACTAAATTTCCAATACGTGCTTCATTTTTATA
-TGTAGGCGTTTAGACACCCCAGTGGGCAGCAGTAATTGTTAATTCTTATG
-ATTATCTCATTGGTACACTTTTCTTGTTCAACTTTAATTATTTATTTTTG
-AAAAGGATTATCATTGGCATTGGCAAATAAATAAAATTGTTAGTGACGTG
-GTGATATTGGACATTTTTTGATTTTAGTTTGCTTTTTGAAATTTCAATTT
-TCGGCACTTTGAAATGTTCAAAATGTTCATTTGTATAGCAAATTATTTTA
-TTAAAATTTTTTTCAAATTTATTACATTTTCAGTGAAAATTGCACAATTT
-TTTAAAACTTTCTAAAAACTGCAAAAAAATAATTAGGTTTAAATAATCAA
-ATCAATAATTTTTTAAAGGATTAAAATAAAATTATAGTTATTACAAATTA
-TTTAAAAGATGTATACTTAAAAACTACTATTTATGTTTTGATTTTTACTC
-GAAAATCCAGAAATTTTAAGTTTTCGAGAAAACTTTTTAAATTTGTTTTT
-AAAAGAGGTTTATATAAATATAATGAACCCAAACTTGAAAGTGCGAAAAT
-GTACTTAAAAGAGTCCAAAATAAGCAAATATCATCACGAAAAGCTCCGAA
-CGTTTTTAAGTTTTTCGAAATGTTCAGTTATAGTTTTGGTAAACTGCCAA
-CTTTACGAAAAATTCGGGTTTAATTTTCAATGTTTTTATACAAATATTTA
-AAACAGAGTAATAGTATAAAATTTGTAAAAAAAAATTTTTTGGTCGGTAT
-TTAAAAATGGTGATAGGTGATAGGGCCATTTTTGACAGTAAAAAAAACTT
-TTATAATTGTTTTACATTTTACCAACATAGGAGCTGCCTTAAAAAATATC
-TAAAGGCTTGGGGTTTTGCCCTACAGTCCCAAACTACCAAATATAAATGT
-AAAATTTTTATAAAAATGTTCAAAATTTTTAATGATTAAAAAAATTTGCG
-AAACTTAATCAAAATGCCGAATAATTGTTTCATTCCCGCGATTTTTTAAT
-AATAATTTTTTTGTATAATTTTTGCATTTAGTGGCGTCATTTGTTTACAT
-GTTGTGTTTTTCGGCAATATTAATAGAGGTTTTCAGAGATTTTCTAGTTT
-TTGAAGCACATTTTGCCTTGTTCCCGTAAAGAAAACTTGATAATTGGAAA
-GAAATTTGGCAAAACGGCGAAATTGACCAAATTGACCAAAAAAGTTAACA
-AACTGTATTTAAAAATAAATTATTAAGCAAAGTAAAAACAAAGAAAACCC
-ACATAAATGTCAAAAATGACGTCACTCATTTGAGCTGAAATTCAAAAAAG
-AATTCGGTCCTTCTTTTTTTTTTTCAAAACAAATTTTTCTTAAATCATAA
-AAAACATATTATAATTTTATGACTTTTCTGACAGTTATATTTGGAATAGT
-GGGACATTTACAAGGGAAGTCGAAAAACTGAACTCCGGACTTTGACATGC
-TATAGTTATTTTTCGATAAAAGAGTGAAAATAATGATCCCTCCAAAAAAT
-TTTGCTGCCGCGGACCAGGTTCAGCAAAGTTATGACGTTTTGAAAGTGCC
-GAAAAAAATTCCTTGACCAACCCAAGCAAAAAAAAACTTTCAAATTTTCA
-AAAAAAAAATTCTGAAAGTTGATAAAAACTATTGTAACTTATTCAAAAAT
-GTGAAAAACGTATATCATGCACGTTTTTTCTCCCCACGGACAAAAAACCA
-CATTGCTTGATCAAAATATCTTGAGCAAAATTCTAAAAATTACTTTTTCT
-TGTAGATTCATTTATTGGTTTTCTTCAGAGTTATGAGCTAAAACTTGCAT
-GGCATATGTTTTTCACTGTTTTGAATAATTTACAAATATTTTTTCCTCTT
-TTCAGAATTTTTTTTTTGAAATTTTTGAAATTTTTTAAAAGGGTGTTTCA
-GCCACTTTCAAAACGTCATAACTTTGCTGAAGCTGGCCCGCGGCAGCTAA
-ATTTTTTTGGAGAGATCGTTATTTTCACTCTTTTATTGAAAAATTACTAT
-GACATGTCAAAGTCCGGAGTTCAGTTTTTCGACTTCCCTTGTTAGGGCAA
-AAAATACCCACAGACGGTACTCCGCCTAAAATCAAAAAAGTTCCAGCAAC
-TCGAGATCACTTTTTTACCATCTCAAATCGTTCGGTTTGTTGGGGGGGGG
-GGGGGGGGGGCTTAAAGAAAAACGAAAAAATGAGACACTTGTTAATTTGA
-TGGTAACAAGTGAAATGGAGAGAGAAAGAGAGTGTAAATACAAGAAGGGA
-ACAAACACTTGAAAATCAAAATTGTCGGAAGGAACTAGGGGGAGGATAAA
-ATATTGGAAATTAGGTTTAATAGGATATGTATCTAATCCCGAAGAATATT
-ATTAAAATAATCGGTTCAAAGAATCTGAAAAAATCGATAAATGCGTTGTG
-TTGTCCTACTTCCGTCCTCTACACAACGTCGTCTTCTTCTTCAGGGCGCA
-TTCTTTTGTGTAACAGTGCCCCTTTTCTCTCTTGATGCCACAAAACACTT
-TGGCAGTTACGCAATCGAAAGGCGAGGAAAGCAAAACGGGTATCAGATGA
-TGATTAAGTGAAACTGGAACTGATAAGTGAGATGGATTGAAATACAGATA
-GCCGTAAACTTTTAATAACCTAGAATTTTAGTTATTAAAGGTGTTATGTA
-TGTTTCGAAATTTGAAAAGATTTTCTCAATTTTTGAATGAATTATGTTTG
-AAGTAATTTAAAATGCCGAATGAAGGGTTTCAATTTTTGTTTTTTTAAAA
-AGATTTTTCGTCCGGCCGATTTTTCGCAAAATGTTTTTTAAAATTTGGGT
-TTATGTTCTTCTCTTTTTTCATGCCTAAGCCTAAGCTAGGCTTAGGTTTA
-GGCTTACTAATCCTAATCCGAAGCATAAGCTTAATCCTAAGCCTAAACCT
-CTCCTACTCTTTTAAGCTTAATGAATGCCCTAGCTTCATTTTTTTCATTT
-TTCGCAGGTTTTTTTCTCAAAAACTCAAAAGCGATGCTACGAACACCAAA
-AATTGGTGGTTCAAAATGTGTGTTTCTATTTTTTTCAAAATTTATTTGAC
-TATACAAACCAGCTGACAATTTTCTTCAAAATTCCGTTTTTCTTATCAAA
-AATAGTCAATTTTTCATCTAGAAACTTCAAAAAACCGTTACCGTTTCCCT
-AAGTTTTGCTATCAGTTCCGTAAATCTTGTACCTTATGTCACATGGCATT
-AGAAATATTTCAATTGAACCAATCTTGTTCGCGTGGAGTACAAGTTAAAC
-ATTTATGATATGTGGATGGGTGCAATTGCGCTCTATTGAACAAACTATGT
-ATCAACAGAACGCGTTAACATTATTTGTACAGGTGGGGAAAAACAGGAAA
-AACGACTAGGCAAAACAAAAAGTATATAAGTTTTCTTCTACACGTCTCAT
-AAAGGAAATTCAAATTTTTTAGAAAAAGAGCGGGGGGGCGCGATTGCAAA
-GGTTTAGACGGCGTTAAGATCTTTGTCGACGAGTGGTTCAGCCGCTGAGA
-ATGTGATTGCCGCCGGAATATTGTCCTTCTCGTTGATTGAGTCTTTCGAG
-AAGAGCGCCAGAATGACGGGCAGAATGAAGAGACCGTGGAGGAGACCTGG
-GAGAATTTTAAAATTTTTGAGTTTCTAGGCCACGAGTGACGTCACTATTA
-TGTCCAAGAAGATATTCTAAGGACAAATTTGATGATTGTTCACTACTTTT
-TCACTAAAAATCAGCTTGAATCGTAGAAAACAAAGAACTTTCAGAAAATT
-TCAGCGCTCACCAATAGCAACGACCAAAAAAACGGTCTTAGCAAAGCACA
-CGATTGCATAAGTTGGCACAAAAATCAACGGAAGCATGCATAGGAATGTC
-GACAGTCCGGCTTCACACATTGGCATTGCCATTTCTGCCAGACTACTGTA
-GACACGTTCTTGTGGAGTGCCACGTGCACGAAAAAAGTTGTAGGCCACGT
-GAGCGGTGTAGTCGACCGAGAATCCCGTGGCGAGAAGGACGTCCACTTGG
-ATTACCGGGTCCAGGTCGGCACCCCAAAGGGAGAGACCACCGACGAGAAC
-TGTAAAAACGATTTTAAAAAAAAGTAACTTTTTCAGATTAAATCCAAGAA
-AAAAACATAATTAAAATTTGTTTCAATGGTTTTTTAAAGTGACAATTACT
-CATTTTCAGGTTTTAAAAACTTTAACTTGAAAAAAAAAAACATTTTGAGC
-TACTTTTGAAAAAGGTTCTATTTTGAATTTCCCATCCAAACTTTTTGAAA
-AAATACAAATGATAAAAATAATTGCTTTCTTAAAAAAAAATTGTTAGCAA
-CCCTACCGTTCGCTAAAGATCGTTGTCGTTTTTTCTCAGAAAATTTAAAT
-ATCCCGCCATATATATTTTCGGAGAATTTCAATTTCTCGAAAAATTGTTT
-TCTCTGAAAATTTGAATTTTCCGCCAATAATTTTTCTCAGAAAATTTGAA
-AAAAAGGATTAAAAACATGAATTTTCCGCAAAAAATGTTTTCTCAGAGAA
-TATGAATGTCCCGCCAAATATATTTTCAGATAATTTTAAAGTCTCGCCAA
-AACGTTTTCTTCGAACATTTTAGGATTATGTGTTGAATTTGTAGAATTTT
-GATCTTGATTTAAATTTTTTCAGTTTTCAATTGAAAAAAAACTAACCATA
-ACAGATACTTGCAATAACAGATGTAATCACAGCAACTGCATTAAAATTTG
-CAATAAACACAAAACAAACGATTGCCATACAGACTACCGTAACCGCAATC
-GATCCAATTAAGTCAGTGCCAACAGTCAGGATGATACTGAGAATTGCAGA
-GTCACAGTCAAAGAGTGTAGCGTTGAATTGACTTTCTTCATGAAGAATTG
-TTCGGATATGTTGCATTGCACGTGCTCTTTCTGCCCATTCAGACATTCCT
-TTACCGAGAAGTGTCAGACGGAACGCTGTGACAATTGTTCTGAAAATTTG
-GAAATTATTCGGATTGAAATTGAAAAGTGTATAGGAATTAAGTTTGAACT
-ATTTGAGAAGTTTGTATTTTAAATTTTGCGCTAAGTTGCCTGAAAAAAAA
-CTAATTTCGAACTATATACCTACAAATATTTTTCAAAGAGCTCAATATTT
-GAATTTCGCGCCTAAAATATTTCGAAAACTTAAAATTTGCGACAAAACTA
-TTTAAACTATTTGAGAAATTTGAACTTTTAATTAACATTTGAACTTTGCG
-CCAATTTTTTTTTGGAAAATATTAAACTTTTGAAATTCTAGTTGAAAGGA
-AATTCAGAAAAATTGAGGATGTAATTTTTTTATATGAAAAACTTTTAGAT
-TCGATTTCGCGTCGAAAATTTTTGAATTGTCAAAATTTAAATTTTGACTT
-TTGCAAAAAAATGGCGGGAAAGTGAAGTTTCATTAGGAAATTCAAATTTG
-ATAGGCGTTTGACTAACTTATTATCATCTCCCATGTGATATTTTACAAGT
-GGAGGGTTCCCGATCGCATCCATCCACGTCGGAAGATTATCATAAGATGG
-GCGGTATTTTTCTCCAACCAGAGTGGATAAAATATTCATCGTCTTATCAA
-AATTCACATATTGCGGAAGAAAAATCAGACTTCGATTGTCTCCACGAATA
-CCTGGCACGTGCTCGAGCCGATCCATCATATTGTTGAAAGAGTCGTACTG
-AAAATTGAATGGCCTAGTAAGTAAAAATTAGATCATGAACTTACCTCTGC
-TTTGATCTCGATATTTGGAGGGTTGTTCACTATTACTGTAATAGGAAAGT
-AACGGTTGAAGACTGGCCTGAAAAATGATAAATGCTCAAAAAATACAACT
-TTTTTCTTTTAATAACGTAAAAAGTTTTTTAAATCGATAAAATCAATAAA
-TCGGCATTTCAACTGTAAACCAAAAATAACAATTATTGATTTTTCTTACA
-AAGACCTTAAAAATAAAAAAAAATCAATAAAAATAGCGATTATCTTTCCA
-AAAATCTGAAAATCAATTCAAATAATTTTCTTGATCTTTTATGTTAACCT
-ATAAATACCAATTATTGATTGTCTGGAAAATCAGTAAAGATTATTGATTT
-TTTTGAGAACCTAAAAATCAATAAAACCCAATAAAAAAGTAATGTTTTTT
-CAAACGCTTTTTCAAACAAATTCTTGATTTTACTTTCAAAAAACCAACTT
-AATATTCGACAACGAATCCACCAGCTTCGAATTTGATGGGAATGCCTTTG
-CAGGTTCAAAGGTCGTTTTCATGGTGACTACTCCATAAGTTGTCAACGCA
-TACATCCCAAGGAGCACCATAATGCACGCTACACGCCCCTTCACGGAGCA
-CACGAAGCTCGAGTACTTGGAGAGCCACGTGTCGGCTCGGGAAATTTTTG
-GCTCCGTCTCATTGGCGATGGATTTGTAATCTGGGTCGTTGCAGAGGAAT
-ACAATTGGAGCTAGGATCGTATAGGTGAAGATGTAGTCGAGGAGCAAGGC
-GAGCGAGGCAGTTAGGCAGAACAAGGACATCTGGAAGAAGAGTTTTATTC
-AAGCTAGCCCACGTTTTCAAAAACTGGGCTACGTGCCAAAAAAGGTTACC
-TGAGGCGTTGGCGTCAAGAATCCGATTCCAAAAGCAATAATATTGGTAAG
-TGAGGTGATTGTAATCGATGGTCCAACATCGACAATCACTTGTTCCAAAC
-GGCGAGGTCTGAAAATTGCAATTTCACGATGCTTTTACAATACCCCTACA
-GTACTTTTGCAGTTTCTCTACAGCACCCCTGTACAACTACGGTACTTTTA
-TTTATTTATATATTTGTTCATCAGGCAACAATCATAATGATACAATTACA
-ACAAGGCAGTGAACTTTTACAATACAATGCCCCACCCTCTTTTTCCGTGA
-AAACTTACGTGTCAGTAATTGCAATATGATGTTTCCATCTGTGAAGTAGA
-ATAAAAGCATCATCAACTCCAATTCCAAGTACCAAAAACGGCGTAACACA
-TTGAATAGAGAACGACGGGAAGCCCATCCAACAAATTGCTCCAAACGAGG
-CGACAGTTGCAGCCATCGGAGTGAGCAATGATGTGGCAACCAGATAGAAT
-GCCATTTTGACAGATGACAGGCGGACAATGACAATGATGACCTGAGTCAG
-AAGTAGGAAGAATCCGATTGTCATTAGAGTGGTAGCTTCAATGGCTCCTC
-GAATCATTTCACGATTTGCTACTTGGTCACTGAAGATGGTGAACTGAACG
-TGCTCGAAGGCAGAGGAGTTTTTGGAAAGTTGGAAGAGCTCGTCGATTGC
-GTCCTGGGAAAAGTATAATTAGGAAATGCCGAGTGCTTGCCAGTTTTTTT
-TATTATGTAAATTTGCTTCCCAGAATCGCGAAAATTTGATTTCCCGCAGA
-AAAGACTGAAATTTAAATTTCTACTAAAAATTGTTCAGATGTTTGTTTTT
-AGAAATTTTCTTTAAAGACAAAGATTTGAATTTCCTATTGAAAATAGGTG
-AAAATTCAAATTTACTACAAAAAAATTGAGTTTTGTTAAAAACACACTGA
-AAAATTGAACTTCCTGATTAAAATTGATTGAAAAATTAGAGGCTCCTAAA
-AAATATTGAAAACTCGAAATGTAAATTCAAATTTCCCGTCCAAAAATTGA
-CAAAAATATTTGAACTTTCTGCCAGAAACAAGTTAAAAAATCAAAGGTTC
-CTCTAATAGTAAAACTGACTCAAAATTAATTGAAAATTGATCAAAAAGCC
-GTATGAGTCTTCTAGGCTATTCTCACCTTAAACGCCAATTTTCCTTCTGG
-AGTATCAGACCTCGAAAAATACCACAGCACCAAGGATTTGGAGCTGATCC
-TCTCGGTCGGTGGTTCTGAAAGTTTCAATATTTTTTCACATTTTTCCAGA
-ACTTTTTATAGTTAAAAAAATGAAATTTTAACTGGAAAGTGGCTAAATCA
-TAAAAACTATTTTTCAACTTTTCATTTAACATTTCAAAAAAAATCTTACC
-AAAATCCGCATTACTCAAGTGAAGTCCCAGGAAAATATCCAGTCCGCTAT
-ATGGCATATCCGGATAGGTGAATACACTTGTGGTACCATTGTTTCTCCGC
-GTCAAATTCTGAAAATTGCCATGTGGTCGTTGAAGAGTTTTCTAGTCCAC
-CACCACCACCACCAAGGGTTTCGGTTTTTCGACTTTTTAGAAAATCGAAA
-AATCGAACAATTTTTGAGAAAAACTTACAAAAAGCTGATAATGTTTTTAT
-TTTAACTTTTTTCTCCATCATTCATTTTAAGAATATAGATAAATGGGATA
-AGACCGTCCAGGTTTCTGTTCAGTTTTCCCTGTTGTTAAATTCATTAAGA
-TGTTTGGTCCCCAAAAAACAATGTTTCTTTCATTTTTCGATTTTCAATTT
-TTAGATTTTTCGATTTTCACTAAAAACATCGAATAATTGAAAAAATCGAA
-AAATGACACCCTAGACCACCACCTACCGCTAACAAGTGAAAGGGGCTGTT
-CAAGTCGCAGAGTGGATCGCAATTTTTTCGTCCATCCCCATCTTGGTAGC
-CAACTGCCGCCGATAGTCGATTGTCCACAGTATAAATCTGAAATTTTTTA
-AATTCCCGCCAGAAAAGTGGGCGTGACGGAGAATCAACTTACGTCTGCCA
-GTGCGCCTTCCTGGAGAATACTGGAATTTTCGCGCTTGGCGGTAAAAATA
-CAGAATGCTCGTTCCGGATAGATGTCGAGTCCGTAGTATTCCAGCCAGAC
-ACGGGTTTCACTGAAAAATGTAAAAAAATTTATAGAAATTTCCGCAAAAA
-GCATATATTTAAAATAGGAGTTTTAAAAAAATTAACAAAATAGTTACGAA
-CGAAATTTTCATTTGCTTTAAAGTTTTCTTTTTTTTCTTATTTATTTTTG
-ATCAAATATTTATTTTGGGTTTTTTAACTTCAAGTGGAATTCCAAAAAAA
-TTCAATTTTCTTCCCAGTCAACCAAACATTGACCAAATCACAATAAGAAA
-GGGAGAAAGGGAAATCGAATTAGAAAAAGAAAAACATTGCGAAAAAACGT
-GTTATTTCTGACTGGTGGAGGAAGGAGGCTTCAAGGTCAGTAGTCACTTA
-CTATCCAGCATCTGAATCATCCGGTGAAAAGGCTTTGCGAATATCTGGCT
-CTAAACGAATGTGCACAAGTCCTGAACTGAGAACTAGGATGGATAAGATG
-CTCACTGAAAATTGTCCAACTTGAAAAATTTCGATTTTTTATGTTTATTA
-AATTTTTTCTGGTGTAAAATAGCAGAAAATGCCAAAAAAAAATGTATCAG
-ACACAACTTTTTTTCAATTTTTCAAACTTTTCGTTGCAAGACCAAACATA
-CAATAACAATTGTCGTTCGAGCGCGTTTTGCCCATGCACCCTTAACGGAG
-ATTTTCATCGACTACTCTATAGAGCGCGTTGGTGATTTTGAAAATGAATT
-TTTCTTGGAAATTTAAAACTTTTAGAAAGGGATTTTTCTATTTTTTCCAA
-AAAATTATATTGAAAAATCAATAAATTAATTATTGATTTTTCAAAACTAT
-AGTGATTCTGATTTGAAAAATGAAAAACATTGCTTTTAAAATTATCTGAA
-CTCAGTTTTCACGAAAAATCAATAAATCGGTAATCGAAAAACATTCATTT
-TTCTATTTTTCTCAATTTTTCGATGTATTTTCCAAGAAAATCGATTAATT
-TATCGATTTTTTTTCCAGAATATCTGATCGATTTTTTTATTCATCGGAAA
-AGTTCAATTATTTTATTTTTAGGAAATTGTTTTCCAAACTTATATTGGTG
-GCCAAGTTTTCCCATTTCGACGACCATAAAGTTACAAAAAACTCACAAAG
-TATCGAATAAACCGGATAGGCGGCTAACAGCCGTGCCACGACGGCACTAA
-TCACATCCCATCCCATGTGCTGAAAAACTTCGAAATTTTTTTAATATTTC
-AGAATTTAAAGCAGCATGCAAACGCGCTCCAACAAAGAAAAATGTTTTTA
-AAAAATTGAAATTCAAAACACAAGCACGTGAAGCAGAGAATGCAGAAAAC
-AAGACCACTGTCACAAAATTGTAGAAGTGAGGGAGGGAGGGCTATTGCAG
-AGGTGACCAACGGGTTTCGGTTTCCAATTTTTCGGACACGGCGCAGAGGA
-TTTGAGTCATTATTATTGTGTTTAGAGAGTGTAAGAGAATTAGAGAATTA
-GGGATAGATGGGAAACTGTACGTACTTCTGCGAAATGGTGCACTTTTAGG
-ATCGGCGGCCTAGAAATTTACATGGTGCTCTAGAAGTCTAATAGATAGCC
-TAGATCTTTTTAAGTCCAGAAAATTACTTGGTGGTCTAGAAGTTTTTTTT
-GTGACCTAGAAATGCAGTTGGTGGACTATAAATTCACTTGGTGGCCTAGA
-AATTCATTTGGTAGCCTAGAAATGTACTTGGTGGCCTAGAAATTAACCTT
-GAAGCTTAGAAGTTTGTTTGAAAGCCCAGAAATTCACTTGATTGCCTATG
-AATTCACTTGGTGGTCGAGAAATGTTCGTGAAAGCCCAGATATTTACTTG
-GTGGTCTAAAACATTTTTCAGTTCAGAAATACATTGGAAAAAATTTCGAT
-TGAGAATTATGGCGTGGGATTTCAAGTGGTGACCTAGAAATTTGTCAAGG
-GACTGAGGAATTCATTTGGCGTCTGGAAATTTTTTTGGTGACCTAGAAAT
-TTATTTGGTGACCTGAAAATTCATTTCATGACCAGTGAATTTACTTGGTG
-GTCTAAAAAGTCTCATGGTGCCGGTCTTAAAGTCTCATGTGTTGCAAAAA
-TTATACTACAATATTTAACTTTGAAATAAAAATTCAGCGGGTCTAGATTT
-GCAAGAAAAATCTGTATTTTCTCAATTTTTTTCAGGTTTTTGATTAGTTA
-AAAAAAATCGAAATGATTGTTTAGAACTGCAGAGAAAAAACAATTTTGTA
-TCTCCGGAATGCGCTATTCTGGGGAGTCAGATTTACTGGATTTTACTTTT
-TTTCCTGCAATTCCAATGCAAAATAAGGTAAAAAAATGAGAAAACTGGCG
-GAACACGGCGGTACACACAGGGGCAACTTGAATGTAAGGCAGGTGTTTAG
-TAAGTGGACCGAGGGGACGGCAAAAGCTGGTATTTTTCCTGTGTCGATGG
-GGGACAGTAGTAGCACACAAGAAACAAGTATTTTGATGATAATACGAATA
-AGAAAAAGAAAAAGGCAGCAAAAAAGTGTGTGGCAGACCACCACCGTCCA
-TCGGATTAGGGAGCGGAGGCAAACTCGCTCTACCGAACAGAGGGGTGTCC
-GTTTCCCCCAAAATCCTCTGAATGTGACGTCATTGTTGGGGCGGCGGGGC
-GGCGTCCAAAAATTAGTGATTTTTTTTTTGGTATTTTGGAAAAAAAGGAA
-AAAATCGAGAAACATTTTTTTGTGTTTTTGGGGAGTTTGTCATGTGAAAT
-TTGAAAATGTTGGGTACAATCAAAAAATTGTTTTGGTTTTTATAATTTTA
-ATAGGAATTTTTAAAAATCTGAATCGTTTTTCTTTGAAAAATCAAAAAAC
-AACAAAACATCCGCTTTTTTTAAAAATTGTTTGTTAAAAAAATAGAAATC
-GGAAAACAAAATTTTCCGATCTTCTCGAAATTCACAAACTCATAAAAAAA
-TCGAAATCCCCTTGTACCCCACCCTAGTTCACTGAAGCGCGTTTGCTTTC
-TGGCCAAAGGCATGGAGGGAGGCGGGCACCTCCCTTTTGCAAAATTGACC
-TAAATAAAGGTGATATGCCAGTGATAAGGAACGGTTTAATGATCCGAAAC
-CGCCAAAAGTGCATAGTTTCTGCGTTAAAAAAAGTGACAACTGACATCAC
-ACGGAGGCTACAAAAGGGGACTCACAAGTTTGCCGGAGAGGAATGAAAAT
-TGGAAATTTGTACGGGTAAGGGGATCAATGTTCAGTGGTGGTCGCGAGGG
-AGGACGGAGGGAAAAAGTGGAATTAGAATTGAATGGGAAATTGGTGGCAA
-AACGGTAAACACTTCTTATTATCCAAATGCATGAGGGATGGAGAAAACTG
-GAAACCTTTGCAGAATTTTGGAGGGGGTGATGAAAAGTATTGGCAACACC
-TTGGTGGCCGAGAATTTTAAATTGATGATCTGGACTAAAAATTCAGATGA
-TGGCCGAGTTTTTCATATTCGCACCAATACAAATGATGGCCTAGAAAGTT
-TGGAGCGACCTAATTTTTCAAATTTACAAATAGATCTTTAATGTTTCATC
-GACAAGGGATGTGAACTAGAAATTAAGATGGTGGCCTAGAATTATATTTA
-TGGTTCGTCAAGAGGTGGCCTAACTCTTCAAATTCACGAAATATTCTAAA
-GTTTAAATTTCCTTTAATTAGTATTGTGGACTAAAAGTCGAGATAATGAC
-CGAACTTTTCATAAGCTCTCCACATCAATTGGTGGCCTTGAAATTCCGAC
-ATGGCCGAATTTTCGTAAGTCGACCCCAGTGGTGGCCGAGCCAAAAAACA
-TAATTCCGCAAACTCTTACATTTTAATATATGAGGGAAGCCAGAAGTGCG
-TGCCACATTATTTTTACATTTTTGACTATCGTGCCAAAATTCCAAAATCC
-TCAAAAATTTGAATTTCGCGGCACAATTTCGGGTTTTGAATATCTTTTTT
-TTAGTGTGATGTAGGGCGTACTTTCCAATTTGCATAAAATAAAAAATCAA
-CAAAAAGCCATACATAATGTCAAATGGTCAGTTGCAAAGAAAACAAACCT
-GCGGTCAGGATGGCCGAACCAGAAAAATCAATTCAAGCTTTCGATTTCGC
-CCGAAAAAAATGAGGATCAGAATAAGAAGGTGTCGCCTATTAGAGATTGG
-AGGATGTTGAGAAAAAGAGAATAGTGGAGGAAAATGATGAGGTAGAACGG
-AATTGAACATGCAAATAAAATGAATGTATTGGGTAGGAGAGGGAAGGTAA
-CACTGTGTGTTCTGTGTTTGGAAAAGGATTGAAGTGGTGGACAAAAGGAC
-TCTTGGTTTAATACTACTTGCCTGTTCTGATCAGGTTCAGAGGTATTTCA
-GCAATAGCTTTTGTATTTTGCATTTTGTCTTTTTAAGTACTATTATTTAT
-CAAATCCTTTTTTGTAACTTTGAATCTGATGTCAAACTTGTGGAAAGTTT
-GAACTCGAAGAAATTGCTCAAAAAGTAAAATTTGCGCCCAATTTTTCGAA
-TTTTTTTCGTTGTTTCTTTTTAATTTCAAAACACAAATCTTCGCCAAAAC
-ATTGTTACAAAATTAACATTTTAATTTTTAAACAGCTGCTAAAGCACTAC
-AAATGTGAAATTGATGCCTAAAATTGGAGAAAAATGGAGTTTTTCAAAAA
-AAATTGAAATAAGAAAGTTTGGAAACTAAATGTCTATATATGGGGAAAAT
-GCTATTTCGAATCTCGCGTTTTTTTAAGTTGGGCATCTCCAAAATATGAA
-AAAAATACAAAAAAAAACTCCAAAAGATAATGTTGAATTTTTTCAAAACC
-CTCACCAAGAAGTATGTTTTAATAAACAAAAATTTGAATTTCTTTTCGAA
-TTTTTTTCAAAATTCGTAATATAAGATACCTGTCACACTTATTTTCAAGC
-TAACAGGAAAAAATAAATGTTGAACTTTATTTAATGATAAAAATAGTTTG
-TAGAAAATTCGTAAATTTAAAAAAATTCAAATTCTACCAAAATATATTAG
-TTTTTCACCTGGAACTAAAAACATTTGAAGAATTTTTTTTAGCTTATATA
-ACACTACAACCGCAACACATTTTTGTGAGAACATGTCTAGCCTCTGTCAA
-ACAGTTTTCCGGTATCTTCGTGTGTGTGTTTGCTAGTGTTCAATAGATCT
-TCCTGTAAAAAATCGAAAATTTCCGATTATATGCTTTTTATGTGTTTGAT
-TCTATAAGCGTTTAGATTGTTATCAGATGATTTGACATTATTCGCAACAA
-TTTTTTTAAATCCGAATGTTTTTCGAATTTCTATTTTTTATAATTTTCCA
-GACAGTTTAAGAGCAAAGTTGAAGTTATTTTTTCCTATCAAAAAATGCAG
-GAATAAATACTACCTCAATTTTTGCAAGAAAAAAAATTTACAGTAGTTTT
-TTTGCTGGAAACTAAATTCCGCAGAATTTGAAAAATACTGAAAGGGTTTT
-TTTCCTTTTTTAATTTGTACTCCCTACAGTACCCCTTATTTTTGAATTAC
-AATTTGATGTTCGTACCTAAAATTGACACTTTTTCTCTAGTATATTTCCG
-AATTCAATTCATAATTATCAGTTGAAACTAGACCCCACCAAAATCACAAA
-TTGATAAGAAAACGTAGAAAGGGGAAAGCACGTGTAGCCTACAACAATAT
-TAACTGTTTTCAATTTATTATTTTTATTTTCCAAGGGTTTTATTCTTAAT
-TCTATTCACAATTTTTCGAAAAATATTCAGCAAAAAAGTATGCTTTCTGA
-CTATATTATCAGTATAAAGTGAGTTTTTTGTGAGCATTAAAAAAATCAAT
-TTTTTGTGGCCTAGCTTTGCATTTAGTGGCCTAAAAAATTAAATGCATTT
-CTTCCACGTTTTCCGTAAAAAAGACAGTGGAAGAGTTTTTATCCGTACTT
-GGGCAGGCTTAATATTTTGTGGCCAAATTTTTCGCGTGGTGCCTAGAAAC
-TTTTTTTACGTTTTTTCTCGGAAACTTATTTTTTTCCATGGCCGTGAACG
-AGTTTTGTTTAAATTTCAGGTCGCTTTCAATATTTTGATGACTAGTTTTT
-TAAAAAATATTTTCCTGCTTTTAGTAATGCTTGGCCAAACGTCTTCACGT
-GGTCGAGCTTTTCATTTGATGCCCTAGGATTTTTAACCTGTCGTTCTCTA
-GACAATAACTACCGTGGACTCGAAAGTTCTACGCCACGTTTTAAATATTT
-GTAGCCTAGAAATCAAAGTCACTTCCCGAGTGGCCTACGTTTCCCTGAGC
-ATAACTAGTCCTCGAGAAGTCCAGTCGACCGTTACTGTCTACAAGATTAT
-CGGCAAGATAATCCGTTTCGATTTCGATGTCCACTCATTCACTAGTCGTT
-TTGTCGTCGTTGCAACAATGTGGAAATTACTAAATTTTGGCATTTTTAAA
-GATTTTTAAACACATTTTTTCTGTCGGAAACTGAGAACCGCAGTTTGTAG
-AGAAAAAAATTGCATTTACTTTCCTGATTGAAAAATCTTTGTTAGCGTTC
-TTCCCCGCTGATTTATGTACCGTTTAAGTTTCAGCTGAGAGACAGCGTGG
-GATTGGGGGAGACGCAGACAGCGAGTGAGTTTGCGTCTCCCTCTCCCTCC
-CACTCTCTCATTTGCAAGTTTTGAGTTTTCATAACTCGGAGAGTGGAGCT
-ATCGAAAAATTCAAAAAAAAAAACAAAAAATTAAAATAAAAAAATTCTAC
-AAATTTTTAGTTGCTAATTTTTTGATAGCGCTGCTAGGTTTTGAGATAAT
-GACGTTTTTAACTCTACCTCGACTTTTTGTGTGTTACCAAGTTAGTATTC
-CTCTGACAAACCGCATGACCTCACCTCATTGTAGCCTCTTTCGAAATCTG
-TAAACTTTACAACTCATGTTTCCTAGTGATATCCGCCTCCATCTCAGCTG
-TTCTCTTTCCATCTTCTCCTAACTGTTTTCGTCTATTTTAAAAATGAGAT
-TATTCGGATTTCTTACTAGTTCCGCTCAAAAACCAATAAATTTATTTTGT
-AGAGCGAAAAATTCTACACATTTTTGTAGTCAACAAGTTTTTCAATGCAC
-CTCTCCTCGCTGAGTTTTTAAGATCTATAATTTGATAGTAAAAATATTTT
-TGACAGTAGCTTTTGTTTTAGAGATAATCAGGATTTCGCAAGCCACGGAC
-TTCAGTCTAGCCTCATTTCGAAAGTTGTGAACTCTGCAAGTCATGTTGAC
-TAATAGTATCCCTCTCCAGCTGTTCTTTCTCCTCCTTCACTCAAGTGGTG
-ATCGTTTTCTCACTTCTCTCGCTTTTTCGCCCCTCTCTGTAGTGTCCAGA
-GAGTATCAGTTATGTCTCCAGGACGCCGTGTGACGTCATCGCTGACAAGC
-CGTAGCCTACAGCGCCCGGCAGAAGACCTGTTTTGACATGCCATTCGTGA
-AAAATTTAGATTAGCCCTCTCACACTCTACATGTCTCCATGTTTTTTCAC
-ACAAACTATTTTTTTGAAGAAATATCTTTAAAACTTTGCTTTGTCTATAA
-TTGATAGCATAAAAGGTCCAATTTTTTCCGTAGCTCAGCAAATGGCGTAA
-CTAAATGGTGTGAAATGTTTGATAGGGGACCGGTTTTTGGCTGAAATCTC
-AGAAAAAATGGAGCCCTGCCTGCATAGAGACCCCTTTCGACTGATGACGT
-CACAGAGTAAGGTGTCACATCACACCATTCTTATTTCTCTATTTGAGGTC
-CAATTAGACTAGGGGGTCAGCGTGCTCTCGATTCCTAGCCGATGACGTCA
-CATATTTGCCATTCACAACTTTCTAAACTTCAAACATTTTTTAATTTTTC
-CCAAATTTCAGCCGATTCCTAATGGGAGGATTCCTCTCCAAACATCACCA
-CCTCACTGCAGTCCACGATGCCACGTGTGGCCCAATAAAAGGTGTCGGAT
-ATGAGCAAGTAGGTCATAAATTGAGCTCTCACTAAGTTAAGATGAAAGAA
-AATTATTTAGGAAGACGGTTCAGTGGTGGAGGGGTTCCTTGGAATCCCGT
-ACGCCGAGCCACCAATTGGAGCCTTGCGCTTTAAGAAGCCAGTTGCTCAT
-CGGAAATGGACGGAGCCGCTGGATTGTGTTAGGTTCGGGCCAAGGAGTCC
-GCAAAATGATGAGCTACTAGGGCAGGTGAGGCGCCTAAATCAGAGCAAAA
-CTCTGTCATTTTTATAATGTTCAGTTTGTGAACACAGTCGGGAAAAGTGA
-GGAGCACTGTCTCAGCCTGAACGTATTCACTCCAAAGTGGGAGTCAAATG
-AATGGCCCGACGGCTTCCCAGTGATGGTCTTCATCCATGGCGGAGGCTTC
-GCTGTTCACTCATCCAGCAACTACGGCTGCGCTTCCATCGCACGAAACCT
-TTGCACCAAGGACGTCGTCGTCGTGACCATTAACTACCGCCTCGGCGTCC
-TTGGATTCTTCACCACCGGCGACGAAGTGTGCCGTGGAAACCTTGGACTT
-TGGGATCAGACTGCCGCACTCGAGTGGGTTCAGGAGAACATTCAAAGCTT
-CCGAGGCGACCCTGATAATGTTACAATCTTTGGCCAAAGTGCAGGTGGAG
-CATCTGTGGATCTGCTTTGCCTATCGCCGCACTCGAGGGGATTGTTCAAT
-CGGGCGATTCCGATGGCAGGGAATGGAGAATGTGATTTTGCGATGCGGAC
-TAGTGAGCAGCAGGCTCAGTTGTCGAGGGAGTTTGCGAGATACCTTGGAT
-GGGAAGGAGATGGTAAGTGATTGAAATGTCGCTTAGTCGTAAGATGTTAG
-AAATTGCATTGTCATCAGAGTTGGATTGAGTTTGTTTAAGCGTAATTTTT
-ACTAAAGCCCATCGAAGCAGTTCCGTTGGCTACTTGGCCTACCACACTCA
-GCCTGGGAGCCCGTCATAGCAAGGCTCAAGACATTTCCTATGTAGTTATT
-TCTATTGCAAATTTAATACGGTGAATTTTCCAAAAATCTTGACGTATCCG
-AATGAAAAACCAGTGCAAACTTGTTGAGTAATATCCCTAATTACTTCATT
-CCAGACAACGACAGTGAAGACCTTCTCCAATTCATCGACCAGCAACCCCT
-TTACAAGATCGAGATGGGCATAAACCCGAAAAGAGGATTCAAGCATTCCC
-AGGCTGGAAGCTTGTATTTTGTGCCAAACTTTGACGGCGACTTCTTCCCG
-AAACCACTTAACCAGCTTAGAAAAGAAGCTCCAAAGATGCAAATAATGAC
-AGGAACCACCAAGTACGAGGGTCTATTTTTCAGTGAGTTTAAACTTCTGA
-AAATTTTCTGAAAATTTTCTATTATAGTCGCCCTCGGTGCCTTATCGAAA
-AATCCGGAAGGAATTAAAAAGTTCATGGGAAGAATCTTTAAAGAATGCGA
-CTATGGAGAGCGTGCTGACGATGTGCTGCAGATGGTCTACGACTTTTATT
-TCAAGGGGGTACATCCCAAGGATCATGAGAAGAATATGCATCAGATTGTG
-AAGGTAGGTGGCATAGAGCCTACAGGGCCATCAGCCAGTGTTTCAGTTCA
-TTGGAGACTATTCTATCAACTATGGTACATACCGTCTGGCTAACATTATG
-ACGGATCTTCAACACGATGTATACTTCTATCAGTTTGACTATCATAACTC
-TGCAGGATTCGGAGTGTTCCGGTGGCTTCTTCCGTTTTTGGGTGAGTTTA
-GGCAGGATGGGTCAGATTTTCTAAGCTCTGGGCCACATGCTTTTTGGTAG
-ATCAGTTTTAGAAATTCTAAGCTAGAAATGTATGAGTATGGTAAAACTTT
-TAAATCAGATTGAAAAGAAATTTTCCAAATTATAGGACTTTGTAAAAACT
-CCGATTGCTTAGGCTACTTCATCCGTACGACCGTAACCTGTCACTAACGA
-TTCTAATAGTGTACCTTATCTGAACAGTATTGCCGAACTAATTGAAATTA
-ATCCTGAGACTCCGAGATTACCTAGCGGTCCCTATCGCTGTGGCCCAGTG
-CCCATTTGGCTCAATATCCAATTTTCAGGCTCCACACATTGCACGGAAAT
-GAGATATGTGCTCGGCAAAGGAATAATCTCGAAATTCCGACCAAATGATA
-ATGATAAGAAGATGCTTCACGTTATGACAACTTATTTTACAAATTTTGCA
-AAATATGGGTACTTTTTTTGTGAACACTTTCGAAAAAAATTAAGCTGCTT
-TCAGAAACCCTAATGGAGAAAACCAGGAGACTGGAGAATGGCAAAAGCAC
-GACTCGGCACACCCGTTCCGCCATTTCAAGATTGATCTGGACGATTCTGA
-AATGGTTGAGGACTATCAGGAACGGAGAGCCGAGCTATGGGATAAACTGA
-GAGCATTAAATGTTAGCAGGGCTCAGATGTGAAATTGCTGTTATTTTTAC
-TTGATTGATTTTACGGGTTTATAAATATTTTTGATTTGTTATATATTTAT
-TTTTTCTGAGTTACATACATACATCAAGAAACATTTCAATATCTTGCAAT
-CTAACTGAATTTTATTTTATAATCAGTTATTTTTATTAATCCTGTACTAT
-GCCAAAAAATCTAACTTGTTTGAATCAATAACTCAACTACCAATCCTTAA
-CACAAAAACCAACACGGTTCTACCCAAACGATGTATAAGCTGGCACCATT
-ATAAATTATCCGCATACTTTTTCAAACAAAGGAAAAAGTCGGAAGCTTTC
-CATACATTCAACTCTATTATACTTTCCCCTTTCCATGGATGTGCTTTTTG
-TGTGAAACCAAAACTTAACCGCCAGAAAGCTTTTTACATAATCTATAACA
-GAGGTGGGCGGCAATTGCCGTTCGGCGAACATTCTGATTTTTTGGAAATT
-TTCATTTTTGGCAAATTGCCGATCTGCCGTTTGCCGGATATCAATTTGCC
-GGAAGTGTTTAGAGGGTTCTTTTTACGACGGAAACACTTAAAACTGTGCC
-TTTTTGAAAATATTTAATTTTTATTCTTTTTTTCGGCAAATTTGCCGGTT
-TGCCCAATTTGGCAATTCGCCGGAAATTTCAATTTCGGCAGTCTGCCAAT
-TTGCCAATTTTCAGAAAAAAAATTTCGACGCCCATCCCTGATGCATACCG
-TTTTTGACTCAATTTAAATAGTACACAACCTTCCACATTAATGTAGTAAC
-GGTAAGGTTGCCTAATTTGTTTGAACTTTGAAAGCCGCGCACAGCACCTA
-CAGTAATCAATCTCCTTAAAGAGTGTTTTCGCAATACCAAACATAGGAGT
-TTGTAGAAACATGAAACCGAAGGACAACACATTTTGAAACAGGTGTCACA
-TTTATGTATCTGCACTTGATAGCTATGCAGTCAATGAAGCATAACGAGAG
-ACATGTGTTCATTCCCGAATGGAGTCAATGAGTCATAAGGTTCTTCGTTC
-TCATTTTATTATTACAGGCTTGGGTCCCACATTGATTCATATTATACTTA
-CTTTTCAATTCATTGTTTTTTTGTGATTTTTTTTCATTAGAATAGTATTA
-TAATAATATTCTTCTAATAATGACAATCGAAATAGTTGCAAGTAGAATAA
-CGATTTGTACAGTGATGCCCATAATTGTGCATGTTTATAATGTTCTAATA
-TTTCAACGCAATCATGACACAAGCTCTATAGCATCTCGTGAGTTCATTTT
-TGGTGAGGTTTCAAAAAAAAAATCCTCTTGCTCAAGAGCCATACGTTTTC
-AGTTAAAAATTTCTTTAATAAAATATAATGCTCATTTCTCGAACGTTACC
-TGTTAATGTTAACTGCGCCTACCATGTCCGTTCAATCCCACTAGTCAGTT
-ATTCTTTGCAATTAAATGATAAACTTTAATGTCTAAATCTCTTCATGGAT
-ATCTCCATCTCAACCATCCATCGTTTTTTATCAACCATCATCATTCTCGT
-GTTCTCGTTCTCGGGGTCGCCTCCGCTTCTTCATCATCATCACCACGACC
-ATTCAAATCGTTCATCTTCCTAATCGACATATTCCCGCATTAAATTTCTC
-TGTTGGGTATCAATGACTACCCAAAAACGGTCGCATTTTCTGAAAAAATG
-GGAAAATTGATTCCTAATTTATTGGTTTTGACCGGTTGTAACTAACCCCC
-ACACACTGTTTTTTGATACTACCTACGTCTATTTTCGGCTAATTTTAAGA
-AGTCAATGATTCCTAATTGTCTTTTTTGTTATTTTCTGTGAAGTGAAGTA
-TCAAGATAAAATCAGTTTGCGTCTCGCTTCGATTTTCTCATTTTTCGAAT
-GCTATTCCCCCGTAGCAATATGGTTTTGTTATTACACATTTGCACTTTTT
-TGCTACCCTCCCAATTCTGACTCACACTTGCATTCCGGAGACTGCCTGAG
-AGTTAAAACTAAACATAATTGTTATATAATAAATGTCAAAGTTTTTCGCA
-AGCTGAAAATTTTTGCCAGCTGAATTATTCCTCCTTCAAAGGAGCATAAG
-TCTAAAAATGCTAGAGTTATTGGAAAGTTGCTAATTACAAGTTATAGAGT
-TTAAAATTTTGAGTAGTTTCTCGATTTACAATTTTTGAAGCTTTATTCCT
-TGCTCAAACTCGAGCAATGAGAGGCAGTGGGGACTCCCCCACTGGGGAGG
-GGAGAACCTTGTCAACCCACTAGGGAGGGGAGAACCTTGTCAACTTTAAA
-GCCACGTCCCTCTGCAGGGAAAAGATCTATCAAAAGGTTATCAACTAACA
-AAATGTGCAAAATTATACGCTCTACATTTTTGTAGTTAACCGTTTTCTGT
-TATCACAGTTAGTTTTTGTGAAACCATCAAATCTGTAGTTTCTCCATTAT
-TATTATCACCTAACAGTATTATTATCAGCTGATAAGTATCCTTTCTTTTT
-GGATAATCCCCTTGTAAAGGAATATACCATTGTCTTCATCTCCTTTTTCT
-GTGTCTACCCTTATCTTTGGGTCGCCATCTGCCTCTCCTCCCCGCATATC
-CCCTCTTATATCTTCAGAAATTCAGGTTCCAAGGAATATTCCGAAAAATT
-TTGTTTGGAAGGTGACATGTCCGATCAATCGCTGGTCCAGAAGGTTCCAC
-TACTTGGCTCGTGTTCTCAGGTGAGTATGCGCCTTTAAACATTGAGGGTA
-CTGTATGCACCATAACGCAAAATTGCAGATTTTATAGTGGGGCAGGTTTG
-TTCTACAGATAACCGTAAAATTTTTATGTCCCTTTAAAAGAAACTCGTCC
-GAAAAATTGATAATTTACGAGGAAAACAACTTTTAAAAATGTTTTTTTAC
-TTCAAACGATGCTCTATTGTGCCGAATCGCTTGTTGTTTAGCGGCGTTTC
-TAAATATTTATTTACTTATCGAAAATCTTTTTTTTCATATTTATAACTGT
-TTAAACAAAATCGATAATATTTATTTTTTCTGAAACTATTCTGAAAATTT
-TGAATTTCCCGCCAAAAAAATTTCGGAAAATTTTGATTTTTTTTGGCATA
-TTATTTTCTGATAGAATTTGAATTTTTGGCCAAAGAAATTCTGAAAGTTT
-TGAATTTCCCGCAAAAATTGTATTTCTGAGAGAATTTGAATTTCTTGCAA
-TTTTTCTGTGAAAAAACAATTGAAAATAAACGTGGTCGCCAATACGAGAA
-AACTCGGCCACCGATTTTTTTTTCGCAAATTTTGCATTCGTTGCTGCATG
-ACTGCCAAAAATTGGCGGCCGAGTTTTTTTATTCTACAGGGTTAAATTTC
-ACAGATGGCCGAGTTTTCTCAGTTTCACGGTCACAGGCTTCTAGTTTATT
-ATATTCATCTCCGCGGCGCGCGCACCGTACTTTCTCCTTCTCTACTCTCT
-CGTTGTTCAATCCCTCTCTCGGATCCAACCAACGCCCTCTGCGATTGTGT
-CATCATCGATTTGTTATCTCAAATTCCGTTTGGCTTTTCAATAACCGTGC
-CTTATTGTCTCAGGAATTTCAAATTTCCGGTCAACAATTCGGATTATTAA
-CCATTTCGAAAAAAATCCTTTAAATTATTTTTATTATAATGAAAAACGTG
-CGATTTTTTCTCGCTGGTGGGTCCTGGCACGACTGAAACTTTTCAGCTAC
-TGTACCCAGCATTGCTTTAGAATTTAAATTTTTGCCGGCAAATTAGAACT
-GCAAGATTTTTTTGTTAGTTTTTAATTATAATTGTTTGGGAAAAATTACA
-AACTTTAAAAAAACCTACCGTACTCCCAAGTACTGCAGCCAAGAAATAAT
-TTGTTTCGTGCCAAGACCCATTTTTCCTTTAAGAACTAGAAACCTCCCTT
-GTTTACAACTGTACTTAAAATCGAATTAGTTTGTTCGCTAAACATGTTTT
-TCGCGCGAAATTTCGCTTTACTTTCGAAAAATGTTTTTCTTCATTTTCGT
-CGGCATGCGCCTTTAAACTACTGTTTTTGAAACTTTCGAATGATAGAAAA
-AATTAGAAAATATTTTTAATTTTCGCTTTCGCCGGAATATTCGAAAATTC
-GAAAAAAAAACTAAATTTCATGGATTCTCAGTTAAAATTCACGGAAATTA
-AAACTTGCGTAGCGAGACCTCAACGATCACATTACCTATGCGCCTTTAAA
-GCTACCGTAACCCTATTTTTAATTAAAAAAAAAAGAATTTCCTTTTAAAA
-TCGCCGGATTTTCTCCGTCTCTTTTCCCATCTTTTTTCATCTTCGGTACC
-AATCATATGTAGGTGAGAATATCTCTGCACCCTCCAACGAACCCAACACT
-ATATCGCTGCGCACCGTCCTTCAACGATGTCATCTTCCTCCTACTTCGAC
-CCCCTCAATTTATTTCCGATTTCCTCTGATTTATTGATCTTTTTTCCTCT
-TTTTCATCATTTCTACGTTCTATAAAGCGAGGTTTATAGCCAAATGGACT
-CATTCAAACGATTACAATCCAAAGTTTTCACGTCAGTGAGCTCACTGCGA
-AAATCTGAAGAGAATGTGAGTAAAAAGCGGCGGAAGACGTAAAACATCTG
-AAATATTTTTAAAAAAATTTGTTAAAAGCCCCACATTTTCGAGATAAATC
-TAAATTTTCAAGTTTGTAGCAGCAAATTAAGCAAAGATATATATTTCAGG
-CCGACGAGCAGACATACAACACAAAACGATGCTTCATCCACGTCAATCAC
-TTATCGATCGCGATCGCCGTCGTCGAGCTCTCGATTTTAATTTATCAGGT
-AATTTGTTTGCCTGCAACTCAGACCAACGCTTAGTCGTCTAATTAGATTT
-CAACCATATTTGATTAGAAACTGAGCAAATATAATGGGGACATAATTAAT
-AGGCTTATGGATTTTATTTGATTTGACAATATGGATTTTCTAACCAAATA
-TGGTTAAAATCTAATCCAATATGGAGCAAATCTAATCAAATATGGCTGAG
-ATCGTGCCATATTGGATTAGATTTCGACCATATTGGATTAGATTTGTTTT
-CTAATGAAATATGGAGAAAATCTAATCTAACATGGATTTCTAATCTAATA
-TGGAGCAAATATAATGCAATATGGATTTTCTAAAAAATATGGTTGAAATC
-TCGTTGAATATGGTTGAAATCTAATTAGACGACTAAGCGTTTATCTGAGA
-AACTGGAAAAACCTAAAAAAAATCTGAAAATTTTCAGTTTTGTGTGGAAA
-AAATCAATGAAAAACTCAATCCTACAGTAATTTAAAAATTCTTTTTCACT
-AAAAAAATCAGTTCCCATTGAAAAAACAAACTGAAAATCAATTATTTCAG
-CTCTCAAATGGCAGTTGGGGCAATTCGGAGCACTCGACCGTCTTCACAAT
-CGCCGCCTTGCTCTTTCTGCTCGTCATTTTTCTGCTTTTCGTCGCGATTT
-TCTACCAAATCGGAAATCTTCTCATCCCGCACATCGTCATGCAGATTCTG
-CTCGTTTTGTGCTTCCTGGGACTCACATGTGCGACGCTTTATGCGCTTTT
-CCACGGTGCCACGTTTCAGTTGCTCGTCGTGGTTACAAATCCGCAAATCG
-CCGCTGATTCCATGGTAAGTGTGGTAAAAAATGAAATTTGTTTCCTTGGG
-AAATTCCTTCTTTTTCCTCAATTTTTCCTCATTTTTTTGCTTCCAAAAAA
-AAGACCCATTTTGCGAAAAAAATTTTTTTTTTTCATTAATATATGTATTT
-TAAATTTTCCAGACAATTCTCCCGGCGCCAATGATCACAACAAACGTGGT
-TTCCGGATTCCTAGTGGGCCTTCTCGTCATTTTCGCAGTCTCCTACTTGC
-TCATCGCTGTGCTGAATGTGAGCTTTTCCCATGGCGAGACCCATGTAACT
-TTAATTTTTGCAGACCTGGTGCATGTACGTCGTCATCGATAGTTACCAGC
-TTTTGAAGAGCCAGAAACTTCAATCTCGTACTCCGTCGGTCGAGGAGTAT
-TGTGCGCCGAAGACGATTCAACTCTCACTATACCCCAATCAAATCGTTCA
-GGCCACCGATTTTTAGTCTATATTTTAGACCATTTGTTGAATTTTTCTCG
-AAAAAATCCGGTAAATTTTTGTGTATATATGTCCCGAAATTCTTCACTTT
-TATCACATGTGTCAGGCTTTAATTTTTTCATACTTTATTTTCGAATTCTG
-TACAAAAATCTTTGATATATTCTATTTATTCTTCTCAATTAATAATCACA
-CGATCCATCTTTCCACCCGTCTCGCCACCTTTGCATCACATCTCGACACT
-CGAACTTTGGTTTTCCGGTTTTTTCGTTGACTTTATTGTGTAGCTGGCAC
-ATCCATAGCGCAAACGCCTCGCGGCTTTCCACTTTTGGCGGCGATTCTTT
-CAGATCTTTTCGGAGATCTTTGGCGCAGAAATCGCAGGGATATGTCTGAA
-AAATTTAGGCGTTTTTGTGGGAATCTTGAGCTTATTAGCTAACTTTTCCT
-AGAATAGACATGAAACTTCTGGCTCGATCCTTATCCTCGTCGGTAGGCTT
-TTCCGGGTAGTAAACCGACATTGTGTGTAGCAAATTCCACGTGGATCTGC
-CTGAAATTTGAAATTTTTGGTGGAAATTTGAATTAAAAGCGAACCGAGCT
-CATCCTTGTCTACTGGACATCCGTGCAACTTCGCTCCTGTGCTCGTGCTC
-GGCGTCGTCTCGGATTCTGCAAAGAACTAAAATAATTGAGATTTTTTGCT
-CTGGAAATCTAGGGAAATCACCTTTTTTCTTTATTTTTTCAGCCATTTCT
-CTGCCTTTTTTCATCATATCCTCTACACTGACGCATGCACGACACGGCTT
-TCCATCTGGACCGATTTCCATTCTGAAATTAATTTTTAAACTTGGTTTTC
-GTTTCGTCAGTTTTAGAAGCCGTTTTAGGGCGTAAACTTATGAAACTATA
-CATAGTCTACGACAAATCTATAGAAATGCATTAAAAATAGGTCAAAAATG
-TGAGAAATTGCGCAAAAAATGATGCAAAAACGAAAAAAAATTAACTAAAA
-ACAAGAAATGCAAGTGCGCTCCACTGACACGCGTTAGAGAGCGTAGACGC
-AGAGAAATCTCGAGATGAGGGAAATCGTGGCGCGCGGGAATCAAGCTTTT
-TTGAATTGTCTTGATTTTTAAAGCCCAAAAAATAGATTTTTGGCGGATTT
-TTGGTGGATTTTCTTGCTTTGCAATGTAAAAATTAATTATTTGTTGCATC
-TAATCACTTTTAACAGAGATTTACAATTTTTTTAGTGGTCTGAACCTGGG
-AAAATCCTTCAAAAATCAATTTTCCCTACAAAAATTCGTTATTTACCGCA
-TTTTCCGCCCAGCTGATCAAAAATTCTTCTATTTTCTCAATTTATTGATA
-ACACTCGCCCACCTCAAGCATTTTATCACCTGAAACTCGTCACACTTTAC
-AATTTGTTTGCAGAAATATGCGAAAATGAGCGTTACTCAGCTAAAAAATC
-TGAAACACGCGATAGCTCAGCTTCTGGAGTGGGATGGAACGAAAACGGCG
-AGAAAGGCAAGTTTTTGGTGGAATTTATCGAAAAAACCTGATTTGTTTTT
-TTGCAGAAAATCGTCGACGAGGTGGTTCTTCTCTATCACGCTCTGGGAGC
-GGAGGCATTAAGTGAGGATAACCAGGAGATATATGATTTGTATGATTTAT
-CTGCACGTATATTCAACTTAGCTAAGAAAGTTAGTTTTTTTTTTGTTAAA
-AAGTCGTAAACAACAAGTAAATTTAAAAATAAGCATTAAAAAATATTGAG
-GCTTATGAGAGCAAAAAATTCCAGGAAATCGAAGAAGCCAACCAACAATT
-CGAAAAAGAACGAAAAAAGGGCACAAGACGAAGCGAAAAACCAGTCCCAA
-CTCCACTTTTCGAGCTATCAATACAACATTTAAAACGTTGCTGTCAGCAG
-GGAATCGATCACAATCAGGTGCCATGGATAGCATATTGTCTGAAACTACT
-GGAATTTCCAATCACAATCACCGAAAAATCGATCGAAAACGAGATTTCCA
-ACGTGCTCCTATTGAGCTCCAACGCCTCACAGCTCCATTGGGCCGAGCAT
-GCTCATTTGAGCAGCTTATGGAAATGGATTTGGAGCCGTGTCGAGACCGC
-CGATATTGGGGCACTCGCCATGAGAAATTATATGGAATTGGCGGCGAACT
-TGCTGGAAAACGTGGATTACGTGGTTTTCGAGAAGTCGCCTATTGACCTG
-ATGGCGAAAGTGATGGGAACACTGAAGAAAAGTGTGGAAATGGGAAATCC
-CAAAGAATAGTGCGTGGAAAACGAGTTCTTGAAATAATGTTCAAAAAATT
-CAAATTGGCTTGGACTTAGGCTTAAGCTTAAGCTTAGATTTAGGCTTAGG
-CATAGGCTTACAAGGGAAGTATTTCAACTTATTCCCGGACTTCAGAATGA
-AACCTATGTCATTTCGAAGAAGACTCTTTAAGTAGGTCCCTACAAAAAAT
-TTAGCGGCAGAGGAGCACTTTGACCTGGAAAAAAGTCGCTCTGAAAACTT
-TTCAGTGCATTTTTTCACGGCTTTCAAGGCCCGTAAAATGGCTCCAAATG
-CGAATTTTTGTAGATTTTTGAAGATTTCTAGGATGCTCAGGGGCCGGAGA
-GCACTCGGAATTTTTTTTGGAATTTTTTAAAATTTTCGAAAAAATCTGAA
-ATTTTTTGAATAAGTCCATGGCAAAATTTTTCAGTGAATATATATATATA
-TTTTTTTTAAATTTCAGAAAAGTTGTCAGTTATTTAAGATCAAAATTGGG
-TGTTTTTACACAATGAAAATTTTTTTGAGATTTTTCGGAACTGCAAAAAC
-CAATTTTGGAAAAAAATCGGCACCCGGAGTCGAACCCCAGTCTTAAAAAA
-TATTAATCAAACTCGCTAACCACTCGGTCATTCAACGACAATTTTTCTTG
-TAAATGAAATGGATGACAAAAAAACGTGACTCTTTGATATCTACTTAAAT
-ATATAGGGACGTGAGAAATAGCTTTGGAAAAGGAGAGGACGCAGAGAAAA
-ATTTTCAGAGCGACTTTTTTCCAGTTCAAAGTGCTCCTCTGCCGCTAAAT
-TTTTTTGTAGGGGCCTACTTAAAGGGTCTTCTTCGAAATGACATAGGTTT
-CATTCAGAAATCCGGGATTAAGTTGAAATACTTCCCTTGTTAGGCTCACT
-AGGGAATGACCAGAATAAATGGAGCGATATTCAAAAAAAATATATTGTAT
-CGGAAAGCTGGCATTCTCTACTATAAGAATATGACTGAAATTTTTGCCCG
-TTCGGGCTGGAAATCTGAAATTTTTACGTCTGAAATTCTACACTGAAATC
-AGTGCATTTCCTATGGTTAACAGTGGATTTTTGTCTCTGGCGCCAACAGA
-AGTCTCACCACAATGGTGGAAGGGCGAAAACATCGGTTCGGTGGTCGAGT
-GGTGAACGCGTTCGCCTCTTGAGCAGAAGTTTGTGGGTTCGGTTCCCATA
-CATGGTTTAACTTTTGGCCTTTTTTATACAAAATTTTCAGAACGGGAAAC
-AAGTATTTAGAACATTTTTTTGAGGGTTTTACATAATTTTTTTGCTTTTT
-AATTGAACCATAATTACCCTGGAAACTTTTCAGAAATTTTAATTTTTTTC
-GAAAATTGTCACTTTTTTCTCCACCAAACCCATGAGAAAATTTGATCGAA
-AAATTTTTTTTTGAAATTTTTTTAAAAATGCATGAAATATTTTAGAGTGT
-CACAAATAACCTATTTTTCATTATTTTCAATGACCGAATCATTGATTCTG
-ATGCCTTATCAAGACGTTTTACCAAATCGATATTGGCAAAACATCTTGTT
-TTTGAGGCTCCATATCTCTGCAGGAAAAAATCGCACTAAAAAGTGATCAA
-CTAGAAACTTGTTAAACACAATGTGATCTAAAACATTTCAGTTGAACACT
-TTTTTGTAAAAAATTTCGTTGCCGAGTTGGAACCAATTGATTTGAGCTTC
-ATTATTTTTGAATATTCTAAATAGTTAAAGATCTATATCTTGGCAACGAA
-ATTTTTTACAAAAAAGTGTTCAACTGAAAAGTTTCAGATTACATTGTGTT
-TAACAAGTTTTCAGTTAATCACTTTTTAGTGCGATTTTTTCCTGCAGAGA
-TATGGAGCCTCAAAAACAAGATGTTTTGCCAATATCGATTTGGTAAAACT
-TTATTTTAATTTTTTTTTTTCATATTATTGTTTTTATATTGGGTCAAAAC
-GTATTTGCTCTGCTAAATAGTTAGCTGGCGCTAATTTTTAATTTTATTAT
-TTTCGTATTTTGATAAATTTCACTGAAATTGTCACTTTAATAGTTTACAT
-TCTATTGGTTTTCTTTTATTCAATGTCTTTTGATATCGGAAACGTGATGT
-TTGCCTTGCATCGTCATTTTCCCAATCCCCTCCCATCAAATCCCTCGATT
-TCGAGACATGAGCAGAAGGTGGCAGATCATTTGGCAAGCATTATAAAGGA
-ATCTTATTATGGAGATACCAGTGTGGAAGAATCCGAATATTTGGTTCAAG
-AAGAATATGGCGATTGGGAGCCAGAAGTTTTTGAGGTATGTTGGTTTCGA
-CACTATTAATTGTCATTTAAAAAACCTTTCAGCCGTATGACTGTGTGTTG
-CCGGATCAAGATGATGTATTGTTCGGTGAGAAAGCTGTATCAAGGGAAGA
-GTTGGATAAAGCGATCACCTTCTACCGTAGCGGAAAAATTGGAAGTAGGC
-CGATAACGACTATGCACCATAGTTATCGCTGGATACGAACCGATGCTCAT
-ATGAACAAACTGCGCAAGTACGAGAAAGATAAAAAAGCGTTCCAAGAAAG
-CGTGCGGGTTCGTTTGGCACAGCTTACACAACGGCTTTATGAGGAGGTCA
-AGGAGAAACTTGATAATGGTAACGAACATTAATATAACAAGTTTTAATAT
-AAATATTTCAGGAGTCAATTTGCATGATTCTGATTTGATGGCTATGGCAC
-TGGAAATCAACACCCGCGAAATGAAGTTGCAAAAACAAAACGAAATGAAG
-TTGCAAAAAGCGTCACAATCCTGGATAACCCGATGGAAGCAAAGCCACAG
-GTATGTAATAAATTGCGGAGTATGTTAGATATATATATATATATATATAT
-AATTTCAGAATCGTGAGTCGGAGAGTCACCAAGTTTGTCACACGGAAGTG
-CCTGATCAATAAAGACGCTATCAAAAAAAACGCGGATGATTTTGTCAAGA
-ATGCCAGAACAGAGATCTCCAACTATCACCCGTCGATGGTCTTCAATTGT
-GACCAAACCGGAATTCAAAAGGAGCTGTATCCAGCCCGGTCTTTAGCCTT
-TATGGGCGAAAAAACAGTCGAGAGGTTGGCGCAATCGAAATCGTCGCTGA
-CCCACTCGTTTACGTTTCTCCCGATGATTTTCCTCGATGGCTCAATGGGA
-CCCAAGGCGTTTATGGTAATCGCTGAACCAAAAGGCCAGTTTCCTCCGTC
-TCGTCCAATTCCAAACTGCCCAAATTTGGAAGTGCGGGCTGGATACAAGA
-CACACATCATGACGAAGCAATTGATGTGCGATTTTTTCGAAAGTTGTGTC
-TTCATTCCGTCTGTACCGAAAAAACTGTACATCATGCTGGACAGTTGGCC
-AGCGTTCAAGGACCATACAACGATCAAGAACTTGGTTCCCAATGGTCATG
-ATGTCGTCATTCGCAACATTCCAGAGCACACAACTGGAATGATCCAACCG
-TTGGATGTCTATTGGAATGCGCCATGGAAGGTATGAATTTAAATCTTTAT
-AACTTTTTGATAGTATTTTCCAGAGCTTGATCAAGAAGTTCACAGCATAT
-GCCCTTCGAACCCAGACGGATTACGTCATCGCACAGAGGAACAACGCAAT
-TTGCATGGTATCTGTGTTGTATCACCAGATCTCGGCAGAGCACTTCCGAC
-CGTTTTTACAGCATTGTTGGAAGAAAGCTGGATACGTGGGTGCTGCGAAT
-ACTTCATCAACACCATTTTTGACTCCAGCTCAATATTGCATTGATCATGG
-TGACACAGTGATTTGCTATCACACTGGATGTAACCATCTCGGATTCATCC
-GATGCGCAAGATGCAAGATGTTTGTTTGTTTTAATCATTTTGTTGTGTCA
-AAACAACATCTTTGTTCATCTCCTTGAATAATTAATAAATTCATGATTGC
-ATTACATTCAAGTTTCGCTATGAATAAAATTGTTTATATGAGGGGATCCA
-TGGTTGTAGTGGTCCATGGTTAAGTTTAAATTTTAGGGGAAAAGATGTTG
-AATGAATCATTATGGTGTTGGTCGACACATTGATCATGCTGATATCGATC
-AGAAAAATTAAAATTTGGGCTTTTATATAGTTTCGAAAAAACACGTTTAA
-ATTTTTGAAAAACTTTACGTTAGGGTGGAATTGAACCCCAGAGTCCCACC
-ATGCTTGTCATCCACTCTATCCACTCGGCCATCTCGCTGTTGCAGGCAGT
-ACTAATTGGGGATGGTGATAAGTAAAGCACGTCAAAACGAATAATTTCAG
-ACGTAAAAATTTCAGATTTCCAGCCCGAACGGGCAAAAATTTCAGTCATA
-TTCTTATAGTAGAGAATGTCAGCTTTCCGATACAATATTTTTTTTTTGAA
-TATCGCTCCATTTATTCTGGTCATTCCCTAGTCAGGATCAGCCTCAGGCC
-TAGGCTAAGCTTAGGATTAAGGGTAGGCTTTGGCTTAGGCTTATGCTCAC
-GCTTAGGCTTCGGCTTGAGCTCAATCATACATCTTGCTTAAGCACGCAGC
-TTAACAGCAAAGCTTAAGCACACAGATTGGGCTTAGGCTCAGGCTCAGGC
-TTAGAAAAAGTCGAAAAGTTAACTAAGTCAAAAAATTTTATTGTTAAAAA
-ATTGTTTAAAAAGTATTATGATTTTAATAGAAAATTGGAAAAAAACCGAA
-AAAAAATGAACATAAATCAAAAAAAAAATTTTTTTTTAAAGAAAACTTCT
-TTTTTTTGAAAAAAATGCAATTTTAAGGTTTTTCTGAAAAAAACTGGAAA
-ATACTTTGATTTTACTGTAAAGAGAATTTTTTCTGTTTTTTTCCAAGATT
-TCAACTTATTTCTGCGAGTTTTTTTTTTCAAATTTCCTCTTATTACAGTT
-GGTGTCATTACCGAAAATTCTCGGTCGTCCACATTCTCTCATATATCGTA
-CATCGTTGGGGTCTCGAAGCGAGAGATTTCATTCTTCGTGAGATTTTCGA
-GCTCACTGGTAGTTTGTCCAACTTGATATCAGTGGCTCATAAGGATGGAG
-AACAGTCCAAGGTTTGAGTTTTTTTTTCTGAGTTTGCAAACGCGCCCTAA
-TTATAAAAATTTGGAAAATTCCACGTGGAAAATAGTTTGGCGAAAGTTTT
-TATACAAATTTTTCGTGGAAATTAATTTTTTTTCGAAATTCTCTTTTAAA
-AAATTTAAAAATGTTTTATTGGCGTATTATTTTTCTAAATTTCAGTTTTT
-CGCAGATTTCACCAATAAAATATTTTTTTGAAAAATATCGCTTCGAGACC
-CAAAAAAATAATTATGATTTCAATGAAAAATTGAAAAAAGCCAATGAAAT
-CGAGAAATTATCGAAAATAATTCGAAAATTGGAACTTTTTAAAAATTTTA
-AATTTTTTTCAAAACAAAAATAGTTTCTCAACTTTTTGCTAAACAAGAAA
-TATATTTCGTGGCGAGACCCATTTCTACTAATTTTCTTTTTCAGAAATGC
-ATAATGCGTTTGATTGATGATCTCGTGAAGCTCGCCATGATCGAAACCGT
-ACACGGCCACCGTACCATGAACGAAGTGACACGTGGAAATATTCAAAAAC
-TCGTGAAAACCGGAATCCAAGAGTCTCTGAAATCGGCGCACCGAAATTTC
-TCAAGGAGTTCGACATTTTCGATTTCCGAAGAATGCGTGAGATATCTGAC
-GAGATGGTTGTTGGCCGAACGAAGACTTGAACAGCCGTCTGCGGCTATGA
-ATGAATCGTTTGAATTGACCGGTGATAGCAGTAGTAAGAAGAAGGACGAT
-GCCACGTTTGATAGTGCGTAAATGGAATTCTACCAAAAGGAGATCTACAA
-AAAGAAAATCTACGAAAATAGGATTTGGCACGGTGCCAGATCGATCTTTT
-TTCGGCTCAAAATTGGAAAAACCTGCAATTTTTATACATTTTTGGCTTCG
-AAAATCAGGGAACTCTGCAATTTTTGGCATTTTTCGCTAAAAAATTGGAA
-AAATCTGCAATTTTTATACATTTTTGGCTCACAAACTGGAAAAACTTCCA
-ATTTTCATCTCAAAAAATCGGGAATATCCGCAATTTTCCTCACATTTTTA
-GCTTAAATAATTGAAAAAATCTGCAATATTTTACATTTTTGGCTCAAAAA
-ATCGGGGAATTTTGCAATTTTTTACATTTTAAGTTTAAAAGTGGAAAATT
-GCAAAAATCGGCATAATTTTGAACGTTTTCTTTTTTCCGGTTTTCCGTTT
-TGTTACGATTTTCGTTTTGCATGGAAAATGCTTCGATTGATACCCTTCTT
-TCGGAAACGAGTTTCTCCTGAAATAGGCGTAGTCTCAAACCATTTTATGG
-GCGTGGTCTTTCTCTTATCTTGTTTTTATAAATGTTGTTCATTAAAACAT
-TTTCAGGCCTTATCGATCTCTCCTTTGGCTCGACGATTTCCGGAAAACAT
-AAATTGAACGCGTGGAATGGTGTAATGCAAATCCTGAATGAGCTCCTAAA
-AAGTCGACGACTCGAACTTCAAGTCACTGAAAAAATCGTGACAATCCTCT
-GGGAAAAGCGAAAATCCTACACAACGGAGCCACTCCGTACTGTGTTCTGC
-TCCATTCTCTCCACAGTCGTCTGCCAGGCCGATGTTCGATTCGGTCATCG
-GAAAGTGCCGACAATCGACTCGATTCTCAAATATTCGCTGTCTCTAATGC
-CAAATGTCGCATCTCTTCCCAGTGCCGCTGCGTTGACCGAAACGATTGTC
-AGATTCAGGACAGTATCACGAGAGGGTCTCCGTAACACGTGGGATACCGT
-ATCCCGAACTAGCTCCGGCTCATTTGAAGTTGTTCGGCTGATTTCGGCGT
-TGATCTCCGTTACGGAATTTGATGAGAATTCGAGATTCGCCAACGATGAG
-AGAGTTCGGAGTTGGAGGTAAGTCACTATGCCACGTGGATGGATTTCCTT
-TAAAAAGAGTTTTTGGAAAACAAATCAGATTTTGTATATCACTTCACCTT
-TAAAGCGAAATTCTTGTTTTTTTGCAGTTTTCGAAAAGACATAATCGAAT
-GGGTATTGCTGGATCCGAATGCACATAGTCACAAATTACTCTATCAGTTG
-TGCCAGTATCATCCAACGTATTGTTATGAATCAGAAGCTTCTTCTAGTGG
-TTAGTTTATTCCGTAGGGCTTCCATGGTAGGCAGGCGCGATTTCAGGGCC
-TGACGCCTGCCTGAAACCTGCTGACCTTTCGCCTCTTTTCTCTCATTGCT
-ATCAATTTGTTGAAAATCAAATTAAGAAATTAAAAAAAAAGTTCACGTAT
-GTTTTGTCGTGGATTGAGGCGAGGGGCAGGTGGTGGTGGTCTTAAGGTCA
-GGTAGGCAGGTGTTTTCACGCCTACATTGAAGCCATAGTACCCCATATGC
-CGAAAACGCTGAAGTTTTCTCATTTTTCCAGACGACTCCCTGCTTCAAAC
-TCTGAAACTATGTAAATTAGCTTGCTCTCCAGCTCCCCCATCGGCTCCAA
-AAGCCCTCCGACCACTCGAAGCTTCAATTGAAGAGATTGTGAGATATGTG
-CATGATAAGCTCAAGAGCATTCTCGGTGAGCATCGGCTGTCGTTTTTTTG
-ATTTTTGAATTTTTAAAAACATTTTCAGCGACTGAAATCACTCTGCCTGC
-ATTTGTGCTCTGCCACGAATTTGCTCTGAAGTATCCGGATAGATCTTATG
-AGTTTAATGTTGGTTTTTTTTTCTAATTTTCGAAAAATTTAAGAAATTTT
-AGGATATAAATAGAAATTGAAGAGAATTTGAATTTTTAAAAAATTTCGAA
-TTTATGGAAATTCAGTAAAGTTTGTCGGAGTTTTTAAACGAATTTTCAGA
-ATTTGTAATAAAAACTAAATTTTCTAATTTTTTTTCCACAATTTACAACA
-TCTAAAAAACTTTTTAGAAATGAATTGTTAGAAGTTAGAATTCCTGGAAA
-TTAAAAAAAAATTTGGATTTTTTTAGAATTCTTAAAAGTTTGATATTTTC
-AAATGATATGAAGTTAACACATTTTTTAAAATATTCAAAATAAGAACATT
-TTAATTTTTTTGAAGAAATGTTCAAAAAATTAACATTTTTTGGGACTTTC
-AGAAGTTTCTTCTTTTTTTTTGCGTCTTTCAAGATTTTTTGCAATTTGCG
-TAATTTTTATTAAGGGGACAGAAAATTCTGAGAATGCGGATTGCACAACA
-TATTTGACGCGCAAAATATCTCGGAGCGAAAACTACAGTAATTCTTTAAA
-TGACTACTGCTAAAATTGAGCATAAAAATAAAAATATATCGATGTATCTT
-GGATCCCGTAAATCGACACTAGCGCGCTACAGTAGTCTTTTGAAGAATTA
-CTGTAGTTTTCGCTACGAGATATTTTGCTCGTAAAGTGTGCACGAATTCT
-TATAATATTTTGTTCTCACAAAAGTTGGTCAATTTATGGGATTCTCAAAT
-TTTCGATGTTTTTTTTTTTGAAATTTAAGATTTTTAAAACATTTTTCAAA
-AAACTGATTTTTCTCTTAAATTGAAAAGGTTTTTTTTTCAGAAAATGTAC
-AAAAAGCTCTACCAAATCATGGAAGATCAAGAAGAAGACGAGTTTCTCCA
-ATCAGCTCGCCATTTCTCAAAATGGCCTCAAAATCTGACACTACCAATAC
-AAAAACAGACAATAAATTGCATGGCTGTCTTTTTCGAAGCGAATCTTGAC
-AATCAGCTCGTCGATCTCTGTCAGTGGAGTGACCGACGAAAAGTGCTTGT
-CGAGATGCTCGCCGAGCTGGCCGCCACAAGATCTGAAATTCGAGATAAAC
-TTCAAAAATCGATGCCGTTCAACAAATTCGTCAAGGAGTGTATAATGGAG
-AATCGCGGTGATTTGTATGAAATGACAAAGAGATTTGAGAAATATTCGTT
-TTTGCTCTCGATTCGGAATTTAATTGTTACTAGGATGATTATAACGTGAG
-TGTTTGTTTTGGGGATTGCCACGAAAAACTGGAAAAACGTTTCGAAAATT
-CAAAAAATATTTCTTCAACATTAGAAAGAATTTCCATTTTTTATATAATT
-TTGGAAAGTTTTTAGATTATTTTAGATAAAAAATCATTTCGAATTTACAA
-AAAAAAATTATGAAATTTTAAAAACAAGTTTGAAAATGTATTTTTAAAAA
-ATTTAAATATTAATAAAAAATCTTGTTTGAATTATTTAAATGTTTGCTAT
-TGTGTTTTAAAAAAGCTTAAATTAAAAATTTTTTTCAACAAATGACTAAA
-TTAACAATATATAACAAAAATTCAAAAAAAATTGTTTTCGAGAAAATTTT
-TTGCTTTTTTTAAAAATAAAATTATAAAAAGAAACAGAATAAAAATCGAA
-AAAAAAACAATTATTTTGAAATTTTCAAAAAAACTAGAAAAATGTAAAAA
-TTTTGAGGAAAAAAATTCAAACATCCCAATTTTTGCAGAAACGAAGCCGC
-CCGACTCCTAGGAGATGGTGAAACAATCAGTGAAACCGATATCTTCATAA
-TCGAAAAGCGTACTCTTTCCACGTGTATTCGTAATGTGTCCGAAGGAAAA
-GAGTTGAGCGGCTACACACTGGACCCCTATACGGTAGCTGCCAACGTGCA
-CAATGTGCATTTCGATCACATAAACGTCGAAATCTATCTGGAATTGCTGA
-AAAAGTCGCCATTTTTCGCTCAGAACATTGTACGCCACTTGTTACGGCAG
-AATGGAAAAGAAGCAGAAGAAGAGACGTGGCACTTGCATGCCACTGTGCT
-GAAAATTGTGATGAAAGATGAAAAGTTGCTGGCGGTAAGGAATTTTTTTG
-GAAAAACTTGAAAAAAAAGAATTTCATCGTATTTTTAAATAATTTTTTGA
-ATGAAAAATTCGGTACTTTTCCTTTTCTACCCCGCATTAAAAAAATATTC
-AAACTATTGACTTATTCGAATTTAATTCTCACGTGAATGTTTGTATTAAT
-ACTATTTTCATTTTTAGGCTTAGAAAACAACAGTACTAAGCCTTGAAATA
-CAGAAAAAGAAAAAGAGTTCACGTTTTTATCAATGAAAATATTCCTGAAA
-AAATGCGGGGTAAAAAAGGAAAAGTACCAAAAATCAAACTTTCAAAGTTA
-ACAATACGCAAGTTTTCAAGTTAATTTTAATAATGGATTGTTTAAATCCG
-GAATTAAAAAAGTGGTTCAAATTTTATTTTATTTGACTCTATTGTGGCGA
-TTTTCATGACAATTGAAACGATTTTTGAAACTTGTATTTATTGAAAAAAA
-AGTTGAAGCAGGTCGTAATTTTAATTTGAATATTTAAAAAAAACTTATAT
-GGGTGCTTCAATTTTGCAAAACATTGCAATTAAAAAAAAAATTTTCAAAA
-TGTGGTCGGCAAATCAGAGTGTTTGAAAAAAATCCTTCTAATTGTGTTTC
-CGGAATTTTTGGGATTTTTTCTTCGAAAATAGGAATGGTTTAAATTGAGT
-TAGAAATTTTTGCAAATAAAAATCGGTTTTTTAAAATCAATTTCTTGCAA
-TCAAAAAATTGAAATTTTCAGCAAAATAATAAAGTTTTCTCTAATTTTTC
-AATTTTCAGGTATGCGTGGCCACAATTCCAAATATGGTTCGATATCTCAA
-AGTCTATCAGATTCATTTCAGTCCGAAATCCAACGCGGCGAAGTTCTTGT
-AGGTTTTGTAACTGCGAATTTCAAAATTTTGCTCGTCTAATTTGACGCCT
-GCTCTGTTTTTTTTTACGCGCAAATCTTAGAAATCGGTGACTTTTTCGTT
-TAAAAACACCATTTTTCAGTAAAATCTGAGCAATTTTCGGTTTTTGCGCG
-TCAAATATGACTAATTGAGTCAAACTTGACGCGCAAAATTTTCAAAAAAA
-AAATTCAATATTTTTCCAGACACCTCGACATGGAATCGATTTCCCACTGC
-CAATCATATTTGCGAAAACCAACAAAATCATCCAATCTGATCACGGCCGC
-CAACTTTTTGACACTTTTCGGATGTGAAAAGCGCACGTGGAAGCGCCCGA
-TTCTCAGATTTTGGAGCATTTTCAAGCAGCAACCGGCTATGTGTTGCGAG
-AAATTGCTCATTTTTGTAAGCAATGATTTTTTGATAAGAAATTTCCCAAA
-AATTTTGAATTTTTGAATTATTTTTGTTAACTTCTTATTTTTAACTCAGT
-ATTTTTGCAAACTGAAAATTTCCAATTTTTGGGCTTAAAAAATCTCCATT
-TTTCAGGCTGAAGAATGTGTCGAACTTGGCCTGAACCACCGAATCGCTTG
-TCTTTTACGCGCACTGACAACCAGTGAATTCTGCCGAAAAGCTCTATGTG
-ATGAATATCTGAAAATCGCGTTTCAGCTGACTTATCGATCGATTTTTCTG
-ATTTTAAGCAAAAATGAGTGCAGGTTGGTGGAGAAGGATATGTGGAAAAA
-CAATATTTGAAAAATAAAAAAAAAACTAATTGATTTGAATTTTCAAAAAT
-TCCAAAAAAATAAAGAATTGTATTCCAATTTTCATGAAAATGGCAACAAA
-AAACTCAAAGTTTCATTGGAAAATTTTTGAAATTACAAAAAAATTAATTT
-TTGAGTTTCAATAAAGTTTCAAAAGTTTAGTTTGAGTAGTGTTGTCAACA
-AAAATTGAATGCCTATTAGAAATAGTTGAAAAAATTGGAATTTACAAAAA
-AAAACAATTTTTAAACTAATTTCTCGAATTTCAAAAAAAAAATCTTCTAA
-TTTTTGAAATTGAACAATTTGGAAATTTTTTGAATTTTCAAGAAAAATTT
-TCAATTTTTCGAATATTCAACAGTTCCAAAAAAAAATTTGTTGGATTTTT
-TTCCAATTTTAAACAAAAAATTTTCAAATTTCCACAGATTTTTTTTTAAT
-TTTTTAAATTTCAGAAAAAAATTAATTTTCATAAAAAATTGAAAATTTCC
-ATTCTTCAAAAATAAGTTTTCACATTTTTCAGACCAGAAATTGTGGAGCT
-CTGCGATGACATGAATCTTCGGTACGATCTTCTCCAGCACCAGATCAAAC
-ATGTCGCGGCTCACCATTTGGAGCACTTTGAGCGTTTCGAAACGAAAATC
-GCATTTTCTGTTGAGAAATTTCTGAAATCTGGAATTGATGGAATCGATTT
-TGAAGATTTAGGATTAGTCGAGTTTTATAAGCAGTTGAACGAAAATTTGA
-CAGAAGACGCGATCAGGAGCAATGAGGCGAGAAGTAAGGCCGTGGAATAT
-AAATTGGTGGCCGAGTTTTTTGTAAACTATGCCACCAAACTTGGTTTCTC
-CGTTCGTGGCCACAAAAATTTTGAATTTTTTGAGCTTCTCTTATAATGTT
-TAAAAGTGATTTCCTGGCAAAAATTCATTTCTTTAATTAGAAAATTCCAA
-AAAATTTGAAAAAAAAATGTAAACTCAATAAAAAGTCTAATTGTTTCAGA
-TTTATTCTGGTTTTTATTGAATTTTCAGATTTTTTCTTCAATTTTCAGTT
-TTTTTCGACTTTTCTAATTAAAAAAAACCAATTTTTGCCAGAACAAAAAC
-CATTAAAAATCGACAGTAGTCATCCCATTGGAGTACAAAAATTTTAATGT
-CCAAATTTTCATGACGAACGAAGAAACCTAGTTTGGTGGCCTAGTTTCCG
-AAAAAACTCTGTCACCAATTTCTTTCAAAATTCAACAAAATTTTAGTAAA
-TTCCAAAAAAACGAACATATTCGGCGAAAATTATTTCAAAAGCTTCCGAA
-CAAAATCTAAAAACGTTCAGAAAGTTCTGGGTAATTTTTTAAATATTAAA
-AAAATTCAACAAAAAAAGGGGGGCAGATAGCTCAGTCGGTAGTGGTGGCC
-GCTAGCAGTCTGGAGGTCACGAGTTCAAGTCCGGCCTCACCCCCTAGGTT
-CACCCAGCCTCTATTGGGAAGTGGAGCAATCCACGACTGGATTATCGGCC
-ACAGTCCCCGGCTAGGACGTGGCTTAAATTACAGCCCAGAGGGATCACCA
-CCAGGCAGTGTACCTGAATCCCAGATCCGCAGTGCATAGCACTTGAAGAA
-CGGATCGTCCTTTAATTCTTTCAAAACTAATTTTTTACTAAAAAAAATTT
-CCAGACATCTACATCGTCGACATTCTCTCAACAATTTGGCTCCAGCTCCC
-CTCAATTCGTCCTCAAATTCTACCGATTCTCGCCCGCTTCAAGCACATTT
-CCCCAGCGTGGACTAATTTCCCACAGCCGCCTCATATTTCGACAAACGAG
-AAATCATTTCTTCAACATCTACGATTTCATCTTTATCTAAAAATGATGAA
-TATCTCGAAATCCATGACGCAAGGCGAGTATGCCACGTGTATTATGATGC
-TCCTGACGAGCTACGACTCGAGCCATTTCGTTGCGGATTTGATAGAGAAA
-AAGCAGCTGGGAAAGCTGAAATTGCAGCAGAGAAGGAATGTTTTGTGCAT
-TTTGAGCCGACTTTTGAAAGATCAAGCTGTGATGGGTGATGAAGATGAGA
-CGATTATCGATCCGATTCTTTTTAAGGCAATCACCAAAGCTTCCGCCGTT
-TTTGTACGTTTTTATACGACGGAAATCACTGAATTTCATGTTTCTATGCC
-GAAAAATTATGAGCAATTAAATATACATCACAAGAAAGAAAATAGTTGCC
-GGTTTTTGAATTTTTCTGTCATATCGGCAATTTTGGCAACTGCCACTTTT
-TGAAGTTTTTAAAAATTTGGTAAATTTGGCAATTGCCAAAATTATCTCTG
-TTTCGATTTTTTTCATCAGAATCATAATATTTTAAATTTCGCGCTAATTT
-TTTTAGCAAATGATCTTCGAAAATTTAATGTCTCGCAGTTAAAAATACAT
-CTTTGCAGGAAGACACCGCCGCGTGCATCGTACCATTTTTGTTCAAAATT
-TGTGTGGATTTCAAGGGAAAATACGATAAATGTGTGATAAATTTGCTGGG
-ATGTCTTAAGGGAGTTAATGCAGGTATGATTTTTCGTCAGAAATGACTGG
-AACGAGTTTTTCGCATCAATTCAAATTTAATGTAATGGCATTTGGCATAT
-GACATCGAATGTCGAATGCTGGGAATGCCGAATAATATATTTTGGTCGAG
-TAGGAGAATAAACTAGACAAAGTTCAAATATATTCCCAACAGGGATGGCT
-TCACCCGTGACCCGTTTCACCCGTTCACCCATTTTTACAAGGGAAGGTTC
-TGAACTCGTTATCGGACTTCGTTACGCCACTATATACATTCGATAGAGAA
-TGGTTACAGATGATCACTCCAAAAAATTTAGCTGCTTCAGAGCAGGTTCG
-ACCAAGTTACGACACTTTGAAGATGCCGAAAAAAAAAATCATTGATGCAC
-CCCCTTTGAAAAAAATTGAAAATTTTCACTGAAAATTTTTTTTTTCTGAA
-AGTTGATAAAAATAGTTGTAATCGATTTAAATAGTAAAAAACATATATTA
-TACAAGTTTTAGCCCATCACTCTCAAAAAAACCCTTAAATTAATGTACAT
-ATCTTGAGAAAAATTCCAAAAAGTAGATGTTCATGTAGATCAATTTAAGG
-GAGAATTATGAACTGAAACTTGTATGGTATGATTTTTCCATCATTTGCAA
-CTATTTGAAAACATTTTATATCAACTTTTAGAAAAAAAATTTTTTTTTGA
-ATTTTTTGGAATTTTTAAAAAGGGGTATTTTGGCACTTTCAAAATGTCGT
-AACTTGGTCGAACCTGCTCTGAAGCAGCTAAATTTTTTGGAGTGATCATC
-TGTAACTAATCTCTAACGAATGTATATAGTGGCGTAACGAAGTCCGATAA
-CGAGTTCAGGGCCTTCCCTTGTTAGGCGTTTTTACGGGTGACGGGTGACC
-CGCTCGCCCGTTTTTTTTTTCGTTTTAGTTGTTTTCACGGGTGACGGGTG
-GCTCGCTCACCTGTTTTTCACCCGTTTTTGGAAGTTTTCACGGGTTATGG
-GTGATCCTTGGTTCCCAAGAGGCAGCCAGTTTAGGTCAATAGGTCGTAAA
-TATCGTTTTGGGCCACGTTTACAACTGGGCTGTGTGCAACTAGAGGTGCA
-CTTGGGTCGAAAAGGGTCGACCCGCTCCAACTTTAGGTAGCATTTGTAGC
-GACCCCGATAAATAAAATGTCGACCCCGAATGAAAATTTTAGCAAGGAGG
-CCATGCTCGTTTAATTTCCATTTTCAAAATTATGATCGGACTATTGGTTG
-AGCTACTGTGAAATAAGCGGGTCGACCCTGCTCGACCCATGAGCACCCCT
-AGTGGCAACCATGATTTTCGGCAACTGGCAATTGCCAGAGTTGCCGAACC
-CAATAAGTTTCGGCAACCGGCAATTGCCGAAGTTGCCGAACTCTAAAAAG
-TGCAACCGGCAACTTTTGCGCAGCCCTGGTTTACAACTACCTAACGACTT
-TTGGTAGACTAGAAATAACACATGTATTCGAATTCGACATATGCCGAATG
-CCGAAAAAAGTATTGAACGACATTAGGCACAGGGATGGGCGGATACCTTT
-TCGGATAACTTCACTAAATCAATTTATCAATAAGTATTGATTTAGTTATT
-CTGGAGATACTATACTAGAATAAAGAGTACCTATTGAGCAACATTTTCAT
-ATGACAAAAACTTTTAAAATTGTACGCATTTTCCTCGACAAGACCCTGAA
-ACTCGTTATCCGATCAAAATCGGCTAACAGATAACGGACTTGCATACTTT
-TTATACGGGAAACGTGTAGAATTTTAAAAAGTTTTGTGCCATGAAAATGT
-TGCTCACCAGTTTCAATTTTGTTCTGATGCACTTTTTCCAGAATTACTAC
-ATCAGCACGTATTGATAACTTGATTTAATGAAGTTACCCGAAAAAGTATC
-CACACCCCATAATCAGCATATTTCATATGTCAAATATCAAATTTCCTGAA
-TTCCGCACACCTCTGCTCTCCATACTCCAACTAATTTTAATTGCAGAAGA
-CGAAATAGTAGTCCGCTGCCTTGCCGAATGCGTCGACTCCATTGGACTCA
-ACGTGATTGCTCGTTACGAACGCCTGAACATTGAGACTCATTCGGAATTC
-GGTGTGAAATGGTTCTTCAAATTATCCCGTCTCTTTCTGAAACATGGATT
-TACTACGCATTCCTTCGCGATTGCGAATATATTATTTGACCGACTTTCGG
-CGAGAAAACGAAATACAATGATGATAGATCGTACGAGTTTAGACCGAATT
-GACAGATCACAGGAACTTATCAATCTTTTGGTGGAGATCTATGTGGCCGA
-GGGTAACTCGGTAGCGTTGTCCTCTCTGCCACCTGCGGTACAAAATAGAC
-CGGATGTTCGGCAGGTTATGAATAAGAGTTCAAAGGAATGGTTGAAATTG
-CTGTCTTCGAATCAAATGGACTCGTGGGAGTTGACTATTGTGCAGTGGAT
-GTGGTAATTGTTTATTTTGAAATTTTTCATTAGAATAGAAAGCAGTTTTC
-TGGAAATTTTCAGGAAAACGCATTAATTTTTTACCTATTCTGCATTTCTA
-GGTTCTTCAATTTTTTGAGAAAATATATATTCCTTCGAAAAAATCACTAA
-CTTCTTTTCGGAAATTTAAAAAAGTTACAGTCGACGACTTTAAAAAATTC
-AGTTAATAAAATTAGATTTCAAAAACAAATCGAATTTTTTAATTTGTACC
-GAAATCTGGAAAATATTTTTAAATGACTCCAAATTTTTCCCTGATTCCAA
-ATATCTATGAGATAAAATTCAAAAAATAATCCCTTTTTGATCTTGAAATC
-GCCGAATTTCATTTGTGCACTCATGAGATTTCGAAGTTTCGCGCCAGAGA
-CCCCATGTGTTGATTTACGAGATTTGTGTATATTTACGAACCCCTTAACC
-TTTATCGGTTGCTGATTTCCGTTTTTCAACGAGTTTTCTTCAGTTTCGTC
-GGTTTTTGTTAAAGTTTTTGTTTAAAACATTTTCAAAAAAACTTTGACAA
-AAATGAAGGGAACTCGTTGAAAAACGGCAATCAGCATCCGATAAAGGTTA
-AGGGGTTCGTAAATATACACAAATCTCGTAAATCGACACATGGAGTCTCT
-GGCGCCAAAATTCGAAATCTCATGAGTGCACAAATGAAATTCGCGATTTT
-AAGCTGAAATAAAGAACCAGGGAAAAACATTTTTTCACATAGATGTTCGG
-AATCAGGGTCAAATTTAGAGTGAAAAACTTTTAAATTTTTAAATTTTTTC
-AGTGGCATCCAATTCAATGCAATCACCGGCGATAAATACCTGAATTCAAT
-TCTTCGTTGCAATTTCAACGAGTACACCAAAAAAATCGATTCCCCATTAA
-AATTCGTCTATTTTCAACTATTCCATCTTTCGACGAGCACTCTGGAAATC
-GAAGAAGCCATTTCTAGCATGCCGTTGGCTCCAACAATCGATCAAATGCG
-GCTTATGATTATAGCCAACGCGACGGCAAGCTTCGAGCCACAATCCGTTG
-AAGAGCACGTTGTTCGAGCTGTTCGAGAGCTCCGAGAGACGTCAAATCGG
-CGAAAATCCGGTGGAAATGTGAAGGGAATTAATGAAAAAACAACGAGAAT
-GGTGAAACTGGCCGAGATGCTCACCGAGAATAAAGCATACGATGTACGGA
-GCAAAAAATAATGGAAAATTTGAATTTATTCAATTGTCAAAAAAAAGGAA
-ATTTCCTTAATTTTTCGGTTTTTTTTTTCGGAAAAATCTGAATTTTTTCT
-ATTTTGAGCAAAAAATTTAATTGAAAATCCGGAGAAAATCGTATACTTTT
-TCTGCGAACCATTTTGTGGGCGGAGCCTAACTAGTAACACTTTTCAATTT
-CCAAACAGAAAAGTGAGAAAAAATTCCTCTTTTTCTCAAAAATCTAAAAG
-AAAAAAAAATCGGAAATTTTTGAATTTTTCGGTTTTTTCTGAATTTTTCA
-ATTTTCATTCAAAGAAGGTCGAAAACTTTTCGATTTTCCGGTTTCCTTTT
-TGAAAAAAAATATTTTAAAAATGTGTAGTTTGTAGTTTGTAGTTTTTGTA
-GTTAATGTCTTCCACATTTTTAGGCGGCAATAAACCTGCTCGACACGTGG
-GAGCACGAGTGTCTCCAATGGACATCTGTCGCTGCCGAATCAATCGATAT
-CGATTTAATTCGAATCTGCAAACAACACGTGACGTGTCGGTCGGGAGATC
-CAAGAATGGCGGACATAAATCTACGAACAATGCATCCACGTGTCCCGGTG
-ATGAGTGACCTGGCGATTGCCGAATGGTCACTCGCGTTGAGCAAGATTAC
-AATTGAATATCGGAATGATATGGAAGAGGGTATTCGGATTTTGGAATTTG
-GATGCAAACATTTACAGAATAAGGATTCTGTAGAGACGAGGTTAAAGGTA
-CATGCGGTCGGGTCTTGCAGCGAAATAATGCATTTTTAAAAATTCGAGAA
-AAAAATTGTGAATTTTGCGCGTAAAACGTGATTCAATCTCGAATTGTTCT
-ATAGATTTTTCCGACAATTCGGAAAAATGCCGGAATTGAAAATTTCCGGC
-AAATCAGCAATTTGCCGTAATTCAAAATTTCCGGTAAATCGGCACATAGC
-CAAAAATTAAAAATTTCGGCAAGTCGGCAAATTGCCGGAATTCAAAATTT
-CCGGCAAATCGCCAAATTGTCGAAATTCAAAATTTCCCGAAAATCGGCTA
-ATTGCCGGAAGTGAAAGTTTTATTGATAGAGATAAATTTAGAACTATCAC
-TAGAATTTAAATGTAAAACAACTAGGAGTTATCATGTAAAACTTGTCATT
-TGAATTTAACACTAGGAGTCCAATAGATTTTCAGATTTTAAAAAATTAAT
-ATAAATTCAGGAAATTTTTTTTGAATTTATCCACATTAATATTCGGTATC
-AGGAGCATAAATAGGATCTATTGAGATATTTTAACAAATTTCCGAACAAA
-GTTTCAAATATTTTTTTCCAATTGATAGAATGTTCCATGAAACATTACAA
-AAAAATTATTCATCAGGTTCTCCTAAAACTCCATTCCGTCTGTATTGGCC
-AACTGTCGAAACTCGAAGAATATCGCGAAACGCGTACCTACCGTATGAAG
-CAGCAGGCGGTCACCGCATTCGAACAACAAATTCAAAATTCGTGTCGAAC
-CAGTCTGGCACGTGGCAATTCGGGTGACGAATGGACGAAAAAAACGGTGC
-AACGGGTGAGAAAAGAGCATCAGTTTGAGAAGAATGATTTGGAAAAAGTG
-GATAATTCGTTGAATTCGGCGGCCCGGAAAGCTGTATCGTCGGGTTTTGA
-TGCACTTTGTGAGCAATTTTTGAAGTTTTTATTGAAAATTCAAAACTTGC
-ACAAAAGGATTTTAAATTCGATTTTTCGCGATGTTTTAGCAATAAAATTT
-TGAAAAATGACAAATTTTTGAAATAATTTCAGAAAGAGTGTAAAGTTTCA
-GAAAAAAAAATTAAAATTAAAATTTATTTTAAAACTTAAAAAAACCGACT
-TTTAGCGAATTTTTTTACGAAAAACAAAGTATTTAATTTCATAAATTAAT
-TCAAAAAAAATATCTAAAATTTTTGTGAAAAACTGTTTTATACAGTTTCA
-GAAAAATTTAAGAAAAAATTTTTTTTCAGAAAAAACCGGATTTTCTGTTA
-ATTTGAAATTATGGAAAAAAAAACCCCAAAGGGTATTACGGAACTACAAA
-ATTCTGAGAATGCGTACCGCGCAAAATTTCTCGTGGCGAAAACTACAGTA
-ATTCTTTAAATGACTACTGTAGTGTTGGTGTCGATTTACGGGCTCGATTT
-TAAAATTGAGCAAAAAATTATCACATAATACGAAGAAACGAAGGAAAATG
-AAACTAAGTTATAAAAAAATTCGAAAATCGAGATCCCGTAAATCGACACG
-AGCGCTACAGTAGTCAAAAATTAAATTAAAATTAAAGGATTACTGTAGTT
-TTCGCTACGAAATATTTTGCGCGTCAAATGTGTTGCGCAATACGCAGAGA
-TCTCAAAATTCTATGCTCCCGTAATAGATTTAGAAAAATTTTCCGAAAAT
-TTACGTCTCGAAAAAGAAAAAAAAACTGGTGTAAAAAATTACACCAGTTT
-TAATATTTACTGAAAAAAATTGGTAAAATCTAAAAATTAATCAGCTGAAA
-TTGATATGTTTTGGGATAAAAAATTTTGGCGGGAAACTCAAGTTAAAAAA
-AAAAATTTCAGTATGCATCAGCCAACTGGAAGACGACGACGAAGCGATCC
-GCGCTTCATCTCTCATAATATTTCCATTAATCGATGTGATCTACAAATAC
-GAAACGGACGTCGGAGTGATCGCCTTGCTCAAAGAGCACACCAAATCGAA
-GCTCCCGTCGAAGCTGTGGATAAGTGCCACCTCACACATTGCCTCTAAGT
-GCTTCTCCATCGAAAAATCGCAAATCACGAGACACTTATCACAGATTCTG
-TGTCATCTCATCTATGACTACCCGTATCACGTTTTGCACACAATTTTGAT
-GTATGATGACGAGAAGAACGCTTCCAAGGTGAAAGGCTTCTTGAAAACGA
-TATTTGACGCGCGAGCTGACCAACGGGATTCGTCGAAGCTTAAGGAGATT
-GTGATTACTATTCGTGAGGCTCACCAGGCTTATAGGTACATACGGCGGCT
-AAATTTTTTTTGAAATTTCGAAAAAGACGAGAAATTCGATTTCTTATCAA
-GTTTACAAAAATCTTCGCTTTTTTCTGACAATTTTAGTGTCGTGGTATCC
-AATCAACGAAAAAAATTAGGTTCTTCTGGTTATTTTTGAGCATATTCAAT
-AATTTAAGCAAATACTCTTTTACTTCTAAACTTTCATCGGCGATACGTGA
-ACAATTTCCAAAATTATATATTATCTAACGCTACAGCATATAATTTTTAC
-CAATTTTCATTCATTTTGATGGAAAAAAGCATCTAGAACATGTAATATGT
-TCAATTGTTCGATTTCAATAAAAACCGACGGCATCCTTGGTTTGAATCGA
-AAGTTTAGAACAGTTTTTTTCAGAGAAATTGCAATGCTTGACGTGAGAGG
-AAACGTTCGGATACAACGTGTTGAAATAAACGGAAAAACGATGTACCGAT
-GGCCACATGATTTGAAGATTTTCAAGTGCAAATTGCGTCAATTGCCGATT
-CCCACCATTTCGCAAAAGGTTTGTTTTTATTTTATTAAAATAATTTAATG
-AATATGTATTTGATCATACAAAAAAAAAATGTTTTCTTCTAAATTCCAGA
-TTGGTTGCCCGGGTGACTACTCGACGACTGACCTAATCACGTGGAAACGA
-TGGAAAGATGTATTCACAATTGCCGACGGAATTTCCACTCCAAAAATCTG
-GGAAATTGAGGGTAGCGATGGAAAATGGTATAAAACTGTGTGGAAGAAGG
-ACGACGTACGACAGGATGTGCTTGTTGAGCAAATGTTTGATGTTACGAAT
-AATATGTTGGAGAAGGCGATGCTTCGGACGTATAATGTTGTCCCGTTAGA
-CACTGAATGTGGAGTTATAGAGTTTTGTGGTGGAACTGTTAGCTTAAGTT
-CGTTTTTTTTTCGTTTTTGAAAAAAACCAAAATAGTATTACGATAACACA
-ATATGCTGAGAATGCGTATTGTACAACATATTTGACGAGCAAAATATCTC
-ATAGCGAAAACTACAGTAATTTTTTAAATTACTACCGTAGCGCTTGTGTC
-GATTTACGGGCTCGATTGTCGAATATTACGGGGCCATGAGATCATGAGTA
-TGCCTATTTACTGGCGCGAAAATATTGGCAGGCCGCGGCAGCGAGAGAGC
-GTGTGGCGAAGAGAGACGCAGGTCCCTTCGCTACGAGATATTTCCCGCCA
-GAAAAGTAGCATTCTCATGATCTCATGGTCCCGTAATAGTGACAGCGATA
-TTCCATTTATTTCACTTCAAAAATCGAGATGCCGTAAATCAACACAAGCG
-CTACTGTCATTTAAAGAATTACTTTAGTTTTCGCTACGAGATATTTTTCC
-CGTCAAATATGTTGTGCAATACGCATTCTCAGAAGAAAAAAGAGGGGGGC
-AGATAGCTCAGTCGGTAGTGGTGGCCGCTAGCAGTCTGGAGGTCACGAGT
-TCAAGTCCGGCCTCACCCCCTAGGTTCACCCAGCCTCTATTGGGAAGTGG
-AGCAATCCACGACTGGATTATCGGCCACAGTCCCCGGCTAGGACGTGGCT
-TAAATTACAGCCCAGAGGGATCACCACCAGGCAGTGTACCTGAATCCCAG
-ATCCGCAGTGCATAGCACTTGAAGAACGGATCGTCCTTTAATCCTTTAAT
-CCTTTAAAAATGTAAAAAAATTTCATTGCAAAAATATCAAACTATGAGAT
-TTTTTCTATTATTTTTCAGAAGAAGTTATGTGTGGTGTGACACGAGAAGG
-CGGTCTCCACCGGGAGTTCAATTCAGAAGAAGTTTCGGCGAGTAAAGTGT
-CGTCAATGATGAGACAAGTACAGACAGAGTCCACAGAGACACGACGACAA
-GTTTTTGTGGAGATTTGTCAGCAGTATTCTCCAGTTTTTAGGTAATTTTT
-CTGAAAGTTGTCGAAGTTTTTTTTTTTGAAATTCAAAAAAATTCCCAAAC
-AATTGGCCTTTTTTCAAATTTTTCCAAAAAATAAAATTACAGACACTTCT
-TCTACACCAACTTTTCGACGGCGCAGATTTGGCGGCAAAAAATCATAAAT
-TACAGGCAGAGCTTGGCCACGTGGAGTATTGGTAGGTTTCGAACTAAAAA
-TGCTAAAAAATTTTCGAAGAATTCGAACATCTCAGATTTTTTCCGAAAAA
-TAATAAAAACGTTATTTTCCAATTTTCTGAAAATAAGAATTTATTAGTTT
-CTTGCGAAATGAAGAGTCTCAAAAAATCATATTTTTTTTAAAAATCAGAT
-TTTTAAATTCTTTTTTTAAAAGTTTTATCGTGAAATTGAACGTTTATGAA
-AAATGGCGAGAAAAACTTTTTTTTCGCTTTTTCAAATAATTCTCAAAATA
-AAAATTCCAGTGTGCTACATCGTTGGCCTCGGCGATCGACACGCGTCGAA
-TATTCTATTCGATCAGAAATTGTGCACATTTGTGCATATCGATTTGGGAA
-TGATTTTGGAGTATAGTAAACGAACGTTGCCAGTTCCCGAACAAGTTCCA
-TTCCGTATAACTCGAGATGTGCTCGACCCGATTCTGATTGAAGGAATCGA
-GAATGGACAGTTGGCTGAGGAATGTACGCAGATTATGGAGAAATTGAAGG
-AAAATGGAAAGGTACGGCGGTCTGGGGAAATTTATACGAAAAGAAAATTT
-TGGACTGACAAAATTTTGGACTTGTAAAGCTATTTAAAAAATTCAAATTT
-CCCGCCAAAAATATTTTTTCAAAGAATTTGAATTTTAGCTAAATTTTTAA
-ACAAAATCTGAAGTTACCGCCAAAAGTTTTCCAAAAAAAATCGAATTTCC
-CGCCTAAAATGTTTTTCAATAAATTCAAATTCCCGCCAATTTTTTTTACA
-CAAAATTTGAATTTCGCGTCAAAAATTTTCCAAAAAATATTCAAAATTCC
-CTGAATAGTTCAATTTCCCACCAAATATCAATTTTTCTGAATAAAATTTT
-AGAATTTCTCGCCAAATTTCTTTTTCAATTTTTTCAATTTCCAAAATTTC
-CAGGTAATCCTCGGTGTCGCCTCTGCTCTACTCCGCGAAACGATGACAAA
-TTTCCGAGAAGCCGAACAGGCTGCCGGCCGCCCGTCCTACATTTCTGAAA
-TGGCCATCGGACGGCTTCGAGAAAAGCTACGGGGCACCGATGACGGTGTG
-ACGGCCCAATCGTCGAATCTTCAAATTCGGCGACTTTTACGAGAAGCTAC
-GAGTGCTGACAATTTATCGCGAATGTTCTGCGGATGGATGCCGTTTTTGT
-AGAGAAATCAGAGAAAATTTTTCTCGAAAATTAAAATTTTTACTGTATTA
-TTGTTTTCTCGTATCAATTTTTCAGAATTTGCTTTGTTATTTTATTTTAC
-GCGCAAAATAATCTTTCTAATTTAGAAATTTTAAAATTATGGAAACTTTC
-TGAAATTTCTGCAAAATTCTAGAAAATCAAAAAATTTAGTTTTCCATCCT
-AATTTTTTTTTTCGTTGATTTTCCCCAGAAAATTCAAACTTTTACTGTAT
-TATTATTTTTTCATATCATGTAATGTTTTTTGTTCAACATTTACATGTTT
-TTCCTACCTCTTCTATGATTTCCCCTTCCCCCAGGTCTCATTTTTCTTCA
-CAATTTTTAAAATTGATTCACTGTTGAATGTGTTGTCTTTTTTCTATGCG
-AATTTTATTAATTTTATGAAAAAAATTTGTAATATTTTTGTGTAAATTTT
-GAGTCTTCTTACACTACAAAGTTAACCATTTCAGAGGAGTTTCAAAATAA
-ATAGTGAATTTTTACAAAAATTAGATTTTCTGATTTCAGCGTACATGAAT
-TGCCCGTTTTCAACAAAATAAGACAACTTTTTATTTTTGCCCAATTTTTT
-TTCAGCCATCTAATGACTGTCCTTTTTTTTTGGGCAAAAATAATAAATTT
-TCTAAAAGCGTTTAAAACTATTATATTTTGAAAAAAGACCATTTTTTAGG
-GCTTGGCAATTTTAAGTTCTCTAGCTACAAATTGAACCAATTTAGAGGTT
-TCAAAATTGTGAGTTTTTGCAAAAATTGCCAAATTTTGCCACTTTTTAAT
-GGTTTTTGATGGGTTAAACCTAGATTTTCTGAATTCTGCATATATGAATT
-ACCCGTTTTTAACAAAATTAGACAACTTTTTATTTTTGCCCAATTTTTTT
-TCAATGACTGTCCTTTTTTTTTGGGCAAGAAAAATAATTTTTTGGAATTT
-TTTTCTGAAAATGTTCGAAATTTTTGAAGTTTCTCTTGAAGCACTCCGAA
-AAACCAAACGACCAGCACTACTTGCAAAGTCCGAAAATTTAAGTTTAGAA
-AAATTTTGAAGTTTTAAAAGCTCCCAAACCAGAAACTCACGATATAGAAA
-TTATTTCCAAACATTTCCGAAAATTCCAAAAAATGAAAAATCAGAACAAT
-TTCGAAATTTTTTTCAAAACACTTCTGAAAAAAACCGAAACTGCAAAAAT
-TTGAAAATGTGCTAAACTCCAAACTGTACGATTTTCCACATTTCAGAAAT
-TCCAAAATTCGTAAATCTGCCAAATCCCTTCGGCGCAATAATCCCCCGGG
-GTACCCCCCCCCCCCGCCCTAAAACCTTTTGCCTCTATTGTCTCTGGCGC
-AGAAAATTGAAATTAAAAAATGAATCGATATTTTAAACTGTTATTCGTAG
-CCATCTTCTCCGGATGTATAATCGCCTACACGAATCTATTCAATCGATCG
-TTTTTCAACGGGTACTGTAGTAATAATGCTACGTGGCAACAGTCACAAGG
-CGAAAGCGACAGTCACGTGGCAAATTCGTTGGATTTGTGTCGTGGCGATG
-GTGTGAAGCAGTGTATTCCGCCGTTGATGAGGTTCAAACAGTTGTATCGG
-GTGAGAAAGATTATCGATTTTTAACACCCGTCTCGCCAATTTTTTTCTCA
-GAAATTGGAATTCCCGTCACAAAACTTTTACAGAATGTGAATTTTCGAAG
-AAATTGGAATGACACCCAAAAATTTTCTCAGAAATCTAAATTCTCGGCAA
-AAGTTTTCTCAGAAATTTGAATTCTCGTCAAAAATTTTCTCAGAAATTTG
-AATTCCCGCCAAAATTTAAATCAGAAATTTGAGTTACCACCCTTCTCTTC
-AAGTAACAGTATTCAACAATATACAATTAAATAGCTTTTCAAATTCCTAA
-AAAGTTTGCTGGAGTTATCAATTTTTGATTCAAAACTCGCTAAACCACTT
-GCCCATGTAGAATACATAATCAATTCTGAATAGAACGCTATTTTATCCTA
-TTTTCAGACATCAAAACCGAATAGCCTAATCGCATGTGTCATTGAAAAAT
-CATTTTCGACATTTCTTACTGCTATTATGTGCTTTTTACACGATCCACAA
-ACATTTAAAGACAGCAATCGAACACTGGATTCTGATATTTTTGGAGACAG
-GTTTGCGGCAAACGAACTCCGCTGCCGACTCTCGAATTATCAATTTTGCA
-GGCTTTGTAAGGATAAAAACGAATTTACCGAGTTGAAGAAGATCGGAAGC
-TGGCAGAAAATGTCGATTTTCACTGTGGTTCGGAATCCGATCGATCGGTT
-TGTATCAGGCTTCACGGATAAATGTTTAAGAGAAAATGTCTGGAAAAAGT
-TCAAAAATCGATGCGCCGGATGTAAGACTGTGCGTTTTATTTGCTAAAAT
-CTTTTACTTAAACAATTTTTTTGGAATCTTTTATTTTCGGGAGTTTCGAA
-AGTATATTGGAGTTTTTTAGAGAAAAAAATATCAATTGAAAAAGGTTTTT
-TGAAAGGGGGTAACATTTTTCTAGGCCACTAGGCTTTGTAAGGTGGCCTA
-GAAAATAATGTAAAAATCTAGGCCATAAGGGTTTATTGCGTGATGGCCTA
-TGAAAAAGCTAGGTCGCCATAACTTTTATCAGGGTTTAGGAAAGTTAAAA
-CTTCGGGCAGCAAGTTTCGCATAATGACCTAAAACTTTCTGGAGAACTAG
-GCTATAAAAATGTTCATGATGGTTTCAAAAAGCGGAACATTCGGTGACCA
-TAATCTTCTAGAATTTTTAGGAAAACTAGGCCATTAAGGTTTCTTCCGTG
-GTCTAGAAATTCTGGAATACTAGGCTGCCAGGGTTTCTAGGCCACATAAG
-AAAGGCCTAGATACAAAAATTTCAGAACGGTCTAGAAAAGTGGATAACTA
-GGCCACCAATTTTCTCTTCGGAGTTTCAAAAATATATGATTCATGATTTA
-CTTTTTTAAGAGTTTTTTTTTTCAAAAATTCTAAACTTTTGACACTAAAA
-TGCTTCTGAATTTTTGAAAACTTTGAAAATTAAATGTTTAAAAATAATTT
-TTTGAAAATCTCTCAATTTTTTTTCTTCGAAAAGCTCAAAAAAACGATAA
-ATTTCCACATTTTGGCCAGAATTTAACATGTTTCGTCGATAAAATGTACG
-ATCGGATGCATAGATTCGCGCGGAATCCGTATAAAGGAATCGATTTCGAC
-GACAGTCACTTTTTCCCACAATCTTGGTATCGGTAAACGCGCTCTATAGA
-TAAAGTCTCAATGGAGCGCATTTGCATTTTGAAATTTGATATATTTGTCG
-TTTCAGGAGATGCGAGTTCTCGTCTCATCTTGTCAAATACCAAATTTTTC
-AATTAGACGGTGCAAATTTCACAAATCAACTTCTTGGACTGCTGTCCGAG
-CGGGGAGTTGATGAGAATGGAATTAACTTTATTAGTGAGTCTTAATCAAG
-TTTGGGTCTCACCGCGAAAACCGTAATTGATTGGGGACAATGGGACCCAA
-GAGAGCCCAATGGAGCGGAATTGCAACTCCTATGAATTTTCCAGACGGAA
-GTCTCCATCACCGGACCCCACACAGCACAATGGATTCCGTGGAACGGGCG
-GCCGTCGAGGAAACTGTTCTGAGCAGTCCGTATTTGTTGCGAAAAATAAT
-TCAAATGTATTATTTTGACTTTTTGCTATTCGGGTATAAGCTTCCTGATA
-TTCCAGTTGGAAATTAGGAAAGTTCTTTATATGTATTTAATTGTTGTTAA
-ATAGTAAAAATCGATAAATTGCTTGAATTTTGATAAATTACGGCCACGTC
-AATTTTTAGATAATTAACGGGCAAAAAAAATCTAAAATTCTTACAAATTG
-AAAAAAAAAATTTCACAAAAAATAATAACATTTAGTCTAAATGTGTTATA
-GCTTAGGCTGAGGTTTAGGCTTGGGCAGGTTATTTTTTAATTTTCAAGGT
-TTCTCATTACATACTTTATTTCCGAAATACAAAAAAGAAGTCTCACAACG
-AGTCATCAGTGCGTGTTGGTGGGTGGGGTGGGAGATTCTGGTGGCGACCT
-ACAACTCACAAACAAAGATGACAACAGGGAAAATGTACACGTGGCAATAT
-GGTGAAGCTATATGTATATATAATGAATAATGATATGTAAATTTGCATAA
-TACAGGAACAGTACGTGATTGCTGGGGCGAGTAGAAATGTGGGTTATTAT
-CTATCGATTACCATTACACATGAATTACGCTGGATTACGGTTAGAATTTT
-GTGAAAAAAAATGAGTAAAACGCTGGGGCTATAAATCTATAATTGTCGAA
-GATGCTCAACGAGCCAGGAACGAGGGGAACATTGCGTCAAACTGGGCGGT
-CAATTCCATTAATGATGGTGCAGCTTGTGCATTGATTGCTGCAGCAGTAG
-GGACTCCATGCCTCATCACCGAATCGATAATCTTCTTTCCAGATGAGAAA
-CGCTCGAGACGGGAGGCGTGTTGGAGCACACGCTGCTTCATTTTCTCGTA
-CCATCCAGAGTAGAGAAGCAGAATAGCTGGTGGAAGTTGACGTTCTCTGG
-AAAAAAACAAGATTTTCTCTAGTTGCCTTAACACTTGGATTTACAGAATT
-AGTGAATATTTAAATCAGGGTGGGCGGCAATTTTTTTTCCGGCAAATTCA
-GCAAATTGCCGATTTGCCGGAAGTTTTTAAAAGGATTTTTAAAAGACGGA
-AACACTTAAAACTGTGCCTTTTTGAAATTTTCTCCCGATTTCTTTACATA
-TTTTCATAGATTTTACTGACTTTTCAAAATAAATGTAGGAACATTTATAG
-GATGCGTACAATTTTGCCGATTAAAATTGAAACTGTGAAATTTTCAGAAA
-AAATGTGCCGAATCACAATTTGCCGAAAATTTTAGTTCCGACAATTTGCC
-GTTTGCCGGAAAAAACCGTTTTCCAAGCCACGTGGATCATTTTTTGAAGA
-AAAAAATACGGCAAATTTACAGAAACTTTAGTACCATGTGGATTTTTTAA
-GAACTATTGCCAAAGTACGTGGAATGTTCAGAAATTTTTTTGCCTTTGTG
-AAATTTTGGATTTTTCTGGATTTTCGGAAAAAAATTCAAATTTTTCTATG
-AAGACGAATTTCTGATTTTTTTAAAAATTTTTCACGAACTCAAATAATAC
-TCAGACGCGAAATTTTACGTTTTCCGATCAAAACACGGTACCCGGGGTCT
-CGAATCGACATGCAGTATTTTTCTCGCTTTGTCATAGTTTCTCGATAAAA
-ATGGATTTTTTTGAATTCAAAATCCTTAAGTTTCTACCCAGGGGAGAAAA
-AGAAGACTATAAAAATTTGAAGTTAAAGTACTCTTTAAAGGCGCCCTTTT
-TTCGAACTTAACCAAAAATTGTCGTGTCGAGGCCTGGTACCGTATTGTGG
-TGCGAAAATCATTTAAAAAATTGCGTCGATTTTTGGTTTTTTGTTATTTT
-AAAAAATGTTCAATTTTTCAAAAATAGCTTTTAGATAAAAATAATAGGTT
-TTTCCTTCTTTTTTTCCGGCTAAATAATTTTAAGAATCCATTTGCCACGT
-TTCATCACAGAAAAAAAACTAACTCTGTGCCAATCAAAGCGGCGGTGCAA
-ATCGAAATCATTTGCTGAACGACATAGTTGCCATACTGGTGGAACAGAAG
-AATATCCAACGCATCACGATTCGACTCGACATCCTTCACATATCCACTGA
-AAATCTCCTCCATCATCTCGTGAAGCAACGCGGGCGGTGCAAACAAGAAC
-GCTCCCTCGATGACGTGCGACGCATACTTGTCCTGTGACATTGAGAGCAA
-GTTACGGAGCAGGCATTTATCGATGATAGTGTCTCTGTACATTTCCATGA
-TACCCGACGATTTGATGACGTATTGGATGACGTAGTTGGCGAACTCGTTG
-GAAGACAGCCGGTAGCAATTACGGACGATACACGTCATCAGAGAATGCAA
-CAATTGAATACGGAATTTGAAACACGGGAGCTTGGGATTCTCGGCGAGTC
-TATCGATGACCTGTTGCACGAGACGACATCCATACTTGTCCTGGCACACG
-GCCATCAGTGAATCTCCTGACGAGAGGAAATGCACGAAAAAGGTCCACAT
-GTCGACTGGAAGTTGCTTGACGACACGTTGAATCACGTGGATCGAGATTT
-GATCATCCAAGAGCTCAGCACATTGCCGCCAGGTCGAATGTGCTGAGCTC
-TTGGATGAGCTGGAAGACGTTGGAATGGTCGAATTTCTGAAATTAACAAA
-TTATTGATTTATTACACCTGGAAAGGCCTAAAAAGACCAAAAATAGCCCT
-AAAAATTTCGAAGAAATGGATTAATTTTTAGCTAAAACGTAATTTTTTGC
-CAACTTTTCTGTGTCGCGATTTTTTTAAACCAAAATCGAAAAATTTCGTT
-TTTCGATATTTTGAACAAATTTCAATTTTTTCGGGAGAATATCTTAAAAC
-TTAATTATTTTCCTCTAGGAGCCATTTTGTATGTTTTTTTCATCGACAAA
-AAATTTTCGTTAATGTGTGCACCTTTAAGTAGTACTGTAACTTTAAACTT
-TCATTGCTGCGGAATTTTTTAAAATTGATTTTCAATGTTTTTCTACAGTT
-GTCGTCCAATTTCATGCAATTTAGAAAAAAACAGAAGGAAAAAGTGAAAC
-ATCGATTTTAAAAAAATTCCGGAGCAATGAAAGTTCGGAGTTACAGTACT
-CTTTGAAGGCGCACACCTTTTTTGTTTTAACAAAAATTTGTCGTGATGAG
-ACTGGGGACAGTTTTTCGGCGGAAAAATCGCAAAATTTCGGCTAATATCG
-AAGAAAAATCAATTTCCGACCGCTGCGACACTTTAGCAAAAAATTGTGAT
-TTTAGCCAAAATTCAGTTATTTTTCGGAATTCCCGTGGCGAGACGTATTT
-CTCCCACCTGCAGAGCCAACTGCACAACTCGACATGCGAATTTATCCTTG
-CACATGGCCAAAAGCCCTCCGTCGATCATTTGACGAAGCAATTCCCGCTG
-CTCGGCCGGTGTTGCGAGCTCGACGAGCTTCTGAACGATGAAATTGCCAC
-TTCGACTGTGGCAGAGCCCCACGAAGAGCGTCGTGGATTCGGTGAGCTTC
-TCGAAGACGGCTTTACGAATCTGATCTTCGGAATCCAGTGGGTAGTTGGC
-CTCCAAGAACTTTACGCCCGATGGATCGATTGCGAAATCGATGAGCTGCC
-CGTTGAACAGCACATCTTCGAGCGAAATGAAAATCGGAGCAACTGGTGGT
-GGGGTCTCATCGTCGGAAGATCCCGATCCACTGTTGAAGATGTAGCTGTC
-CGAGTCGGAGGAGGTGGTGTTGCTTCCGTGGCGGTAGGGAAGAAGCTTGA
-CCGGCGGCTTTGGATTCTGGAAATTCGAATTTTAAATTTTTATTATATTT
-TCTATTTAAATTAGAAGTTTTTATGCAATATTCTACCTTGTTCTTGTGAG
-TTTTGTTCGACAAAAGCGAGAAATCCGGGTCGAAATCGAACGACGCGCCG
-AGCATGTTGTACGAGTCTGTGCTTCTACGATTCGGGGTCATTTAGACAGA
-AATGAATGAATACAGGTTAGTAGACGCTGAAAAATTTTGGGAATTAGGAT
-TTTCAACGGAAAAAAGAGTGAAAATGAGAGGAAAACATGTAAATTTCAAC
-GAAAATCGCGAAATTACCGCGCATCAAAATTCAAAATTGAATTTTTCGCG
-GTGGCCCGGGTTACGGTGATTTTTAAAGGCGCATGGTTGTTTTGAGTAAG
-GTCTTGACGCGAAATTTAAAATTATTGAACATTTTTATTTTATTTTTACA
-TTTTTAAAGAAAAAAATGATTAAAATTCGATTTTTTAGGAGAAATTAAAC
-ATTTTCACAAAAATTGCAAGAAATCGCTCGCCAAAATTCGAAAATGAAGA
-GTTTGGCGGTGCTCATGGATTACGGTGGATTTAAAGGCACATGGCTTTTT
-TGTATTAGGTTTCACCACGAAACTTGGAGTTTTGATAGTTTGCTTCCCAT
-TTTGGGATTTATTTTTTTAATTTTCGCTCGATTTTCACACATTTTCACTC
-ATTTGCACTCAATTTTTTTGCAGAAAAATGTCAATGGATATTGTTATGAA
-GTCAGATGAGCAGCCGTTCATCTCTGCGCCTGTATGCTTTAAGTAAGCTC
-CAATTTTTGTTATTCTGGCCTAAAATTATTTTTTTGATTTCCAGAACGTT
-CGCATTTTTCGCCAAAGCATCCGCAGAGGAATGCAAACTTCTCTTCGGGC
-TCCAACGCTCGAGAAAGTTTCCAGCAGGCCACGGGGCTCTCGGAGAAGAT
-CACGGAAGACATTTACCGCCAAATTGAGTAGGTTTTTCGATTTTTTTACC
-CTTAAAAACTACTATTTTTCTATTTTCCAGCGTCTCCCACATTTCGTCGA
-TGGTCTTCAACAGAGAAATGGACGGTGGCATCGAGAGAAATCGGCTCGGC
-TCGCAAGCGATTCTGCTCGACGAGAACTCCAGGCGCCGCAATCCACAGTT
-CAAATCGATCGCGCTCCGCTCTCCGCTACGATCACATCGATCATAGAGCG
-TTGGCAAGGAAATCGCCTCATCTGATGCCTCCGACTTTTATCAAAGAGGA
-AATTATGGATGATGAGCTCGACGAGGTGAAGGAAGAAGTGGTTTCCGTTG
-GAGAAGCCGCCTTGCCCACGCCAAAAGTCGAACTGAACATGGACCATCCG
-GAAAAGGACCTGATCATCAGCATTTCCGTGTATCTCGGCTACACCCGTAC
-CCTTCAATACCACGAGATTCGCCTCGGACGTTTGATGAAGATCACGGATC
-GGCTCGAGCTCACCGGAGATCACACGCTTCGCGATCTGAAAAACGCGTTC
-TCGTGCCCCATCGATTTCTCGTTTTCCGACGATTTTAGCGAGAAAAAGCC
-GTCGTTCAAGGATATGGCGAAAAATAAGTGGCCGTCGACGATGTTCTTCA
-TTCATGACACGTTTTATATATAACTGGAAATAATTTAATATTTTTCGAAC
-AAATTTGAAAACTATAAAACCATCTTATTTTGATAAAACTCCGCCGCTGC
-TCTCTGAAGCAATGAACTGCAATCAGACATCGAAGGGATCAGCCGATCAC
-GGAACCAACCTGCCATTGAGCTTCTGAAAATTAATATATTTGATTCAATT
-TATTGTACGAAATCGTTTTTACCCATATCTGTGAGCTAGCAAGCTAGCTA
-ATCGTGATTAATTGTTGGGTATTCCTTCGCGTTCTTCAGCTTCTCCACAA
-GCAAAATTCTTGTCTGCTCATCACAAATGATGTCATCAGCATCGCTCTGA
-TCTTGAAAATCCTGAAATTATAACATTCTAGAGGGTTTCTGATGAGAATA
-GTTACCTTACAACCAACACCAAATACGTTCTTCATTATGGCATCCGGCAG
-CTTTCCATAATCGCAGAAGAAGTGCTCGGCATCACGATCGGATGCTCTAT
-TTGGGAAACGACCGATGTAGACACGAACCATGTTGAGTGGCCGAGAGAGG
-GATCATCTGAAACATTTAAATGTTAACTAAACAGGAGTTTAGAAACTTTA
-AAACAACCTAACCTCCGTGATAACGTAGTTAGCTTCTCGAGTGAGCTTCT
-TCTTCAAAATAAAACAGAATGAAACAAGAATCAAGTGGGTAAAATTGTAA
-AATGAAGTATTTCAGACATTTTCGCTAATTTTGGCAGTAAAAACCTATAA
-TTTTGGTAAAAATCGCTTGTATTCTGAAAAAAGAACTCAATATTTAATTT
-TTTATAACTGATTTTAAAGAGAAACAAACGAAATATATGAAAAAATCGAA
-AAAATCCCTGAAAAAGGCCTCCGCAATATTGATTGTTAAAGGGACACCGA
-CTGTTCATCGAATGGGTCCCGCCGCGATTGTCCATTTCGAGCGCTTTTCG
-CGATTTTTTACTACTGTAAAAAAGTGTAGGAAAATGTCGAAAAATGTCGA
-AAAATGACGTCACAAATGTATTTAAATACATGTTTTTATTGTTACTTGAA
-TAAGGCAAAATATGTATTTAAATACACTTTAATTTTCCGACATTACTTGA
-ATAACCCCATAAAAAACCCCGAAAAAATTTTTTTTTTGTGAAAATAACCA
-GAAAAATACATGTTAAAACAATTTTGTGAACAAAAAACTAAAAAATATTT
-TTTTTGCAGAGATGAATCCCACGTGAACGTCGAATTTCCACGCCGCCTCG
-TCGAACGGAATTTCAGAAGAATCGCATGTGACACGTGCAAGGAGGCGTCG
-GCTCAGTGAGTACAGAAAAATCCATGGGGATTTTTTAGAAATTCGGAATT
-GATTCGATTCAATAAAATCGATTTTTATATTAAAAAAAAGGATTTTATTG
-GTTTTTAAAAAATTTAAGAAAAAATTACAAAAAATCTATAAAATCGATTT
-TTTATTTAAAAAATTGAAACTCAATAAAAGTTCTTTCTAATTTTAGAAAA
-ATCGATTAAAAAATAATGTTTTAAAAATCAGTAAGAATCGATTAAAAATT
-CAATTTCATCGATTTTATTTATTTTAAAAAAACTTAATTTTTATGAAAAT
-CGATCATATCGGAGTCCAAAAAATAATTGGGAAAAAACTAAATTTTCAAG
-AAAATAATCGAAAAATTTTAATTTTGTTCAAATAATTGATAAAAACTCAT
-TTTTTAGGTTTTTTTTCAAAAAAAATTTGAACAAAAAACACATATTTCTC
-GAGCTTTTTTTCACAAATTGACCCGATTTAAATTAAAAATTCATAAGCTA
-AAAACCTTCTTTTTTTAACCAAAAAAAAAACGAAATTCCCAAAAATCATC
-AATTAAATCCAATTTTTTCAGCTGGATGATCGTCGACCACGACAATCTGC
-TTCCCAACTCGCCAGGCTATCTGTGCTCTTCGTGCTACAAGGAATTCTGT
-TTCGACGTGAACGGCAACAAAGTGTGCCAGTTTAAGGCCGTACCGTATTG
-CGATCGAAAGGACATTGGCGACGGACGCCAATTCTTCACCGAGCTCGATC
-TTTAGAGAGCGAAATTTAAAATTCTGTATCATTTTTTGTTGTTTTTTTTT
-ATGTTTTTCGATTTGATTGTTTAATTATCAATTTTTGGCCTGTAACTGTG
-TATTTGTTGAAATTCCAAATTTCGTTTTTTTTTTAAATAAAATTTCTGTG
-TGCAAAAAAATTTATCCAATAAATAAACGGAATATATCGATGATATGGCA
-AGTAGGGGGAAACGGACGGGAAAATGATTATTTACAGAAAGGGCGCGCAC
-CAGAGGTTTCTCGGGGGAGCCCCGAGGCGGGTGGCGGAGCTTGGCTCAAA
-ATCTGTCGGAAAAATGGGTGAAATGAGAGAAGAGGTAACCTAGAAAATGA
-GATGAGAAATTCGGAAGTTTTGGGAAAAAAAAATCAACTTTTGAACAATT
-CAATTGAAAAATCGATAATATTGATTTTTTTAAAATTCTCTAAGATCGAT
-AAATCTGGTTTGGAAAAATCAATAAAATCGAATCTTAAATATCTTTTTAA
-AAAACTATTTTCAAAAATCAATAATATCGATTTTTGAACAATTTGAAAAA
-TCGATAATGTTGATTTTTAAAATTAAATTTTATTGATTTTTTGAAAATCG
-ATTATATTGTTGATTATTGATTTAAAAATCACCAGAATCGATAAATCTGA
-TTTGGAAAAACCAATAAAATTGATTTTTACAAAAATCAGCCAATAAAATA
-GATTTTTTATAATCAAAAAAATCTATTTTTAAAACCGAAAAAATCGATAT
-TTCAAAAATTGAAAAAAATCGATAAATCAATAAATCAATACATAGGTGAG
-CTCGTCTCGTCGATTTGTGTTTTTGTGATTGGTCCCGGCTGCTTTTGAGA
-TGGCCTAGGCGTTGTTCCGTATGACATTCTGGAATTTTTTTTTGTTGGGA
-ATTTGGCACGCCCACAAAATGGACGGTGGCGGAAATTTAATTATTTTAAA
-TACCTTTCTGGATAAAAAAAATCGATTTTTCCACTTTTTCGAGTGAATCG
-AAAATTAAAAAAAACATTCAAAATTGTTTAGGGTCTCGCCACGAAAAACT
-CACAAATGCACGTTATGCGGAGTGTCGTCGGATTCCGGTGTGTTGCTACG
-GATCGTGTCGTCCATGCTCAGCTTCATCGTCGATTGACGTCGCCGTTTTG
-TGGTGATCTGAGCGAGATTTATTGATTTTTAAAGGCGCATGGCCTAGAAA
-ACACAACACTTCGGCCACGGACTTTGGCGGCCGAGTTTTCTAGGCCATGC
-TGCGGCATTTAAAGGCACATACCATGATAATGAAGATCGCCAATCCGAAA
-ATGATGACCAATGCGAAAGTGATAATTACAATCATCGATGATAAGGAATA
-TGATGAAGTTTGCGTGGAAATCGAATCGATGTACGCTTGTGACGTCATTC
-CTGGAAATTATTGATTTTTTTTTGGAAAAAAATTAATAATTACTTACCGT
-CAACAGTAACACTCAACGAGTCAATTTTGTAATCCGAAATCATAGAGTTA
-TTGCGTGAAAATGCGGCTTCCAACCTGAATGTTAAAAAAAAATCTATAAT
-ATCGATTTTTTGAAAGTTTTTCGAAAAATTGATAAAATTGACGATTGATT
-GTTTGCCCATAGAAACAGATAAAAATCGATATAACTTAATATCGATTTTT
-TTTTGTGCACCTTTAAAGAGTACTGTAACTTCAAACTTTCATTGCTGCGG
-AATTTTTTTATCGGTTTTTACAATTTTTTGTACAGTTTCCGTCCAATTTT
-ACAGAATTGAACAACAACAGAAGGAAAAGTGAAAAATCGTAAAAAATGTC
-CGCAGCAATGAAAGTTTGAAGTTACAGTACTCTTTAAAGGCGCACACCTT
-TTTTGTTTTAACAAAAATTTGTCGTGGTAAGACTGGGGACCGTTTTTTCG
-GCGGAGAAGTCGCAAAATTTCGGCTAATATCGAAGAAAAATCAATTTCCA
-ACAGCAGCGACACATAAAAATTAGCAAAAAATTGTGATTTTAGCCAAAAT
-TCAGTTATTTTTCGGAATTCCCGTGGCGAGACCCATTTCTCCCACCTGTA
-GAGCCAACTGCACAACTCGACATGCGAGTTTATCCTTGCAGATGGCCAAA
-AGCCCTCCGTCGATCATTTGACGAAGCAATTCCCGCTGCTCGGCCGGTGT
-TGCGAGCTCGACGAGCTTCTGAACGATGAAATTGCCATTTCGACTGTGGC
-AGAGCCCACGAAGAGCGTCGTGGATTCGGTGAGCTTCTCGAAGACGGCTT
-TACGAATCTGATCTTCGGAATCCAGTGGGTAGTTGGCCTCCAAGAACTTT
-ACGCCCGATGGATCGATTGCGAAATCGATGAGCTGCCCGTTGAGCAGCAC
-ATCTTGGAGCGAGATGGTGATCGGAGCCACTGGTGGTGCAGTCTCATCGT
-CGGAAGATCCAGATCCGAAGGTGTAGCTGTCAGAGTCGGAGGAGGTGGTG
-TTGCTCCCGTGGCGGTAGGGAAGAAGCTTGACCGGCGGCTTTGGGTTCTG
-GAAATTCTATATTTGAATTTGAAAATCAACAAAATTCAATATTTTACCCT
-GCTCTTGTGAGTTTTGTTCGACAAAAGCGAAAAATCCGGGTCGAAATCGA
-ATGAAACGCCGAACATGGGGGCCATTTGGACAGAAATGAATGAATACAGG
-TTAGTAGACGCTGAAAAATTGGGAATTTCAATTAATTTAGGATTTTTTAA
-CGGAAAAATAAGTGAAAATGAGAGGCAAACATGCAAATTAAAATCGCGAA
-ATTACCGCGCTTTGAAAGGGACTCCACCGATCGGAGAGACGAGGGAAGTG
-GAGAGACGCAAATCGAAGAGACGCCTTTTCAGACATTTTTTCGTGATAAT
-TTTGCATGAATTGGCAAGTAGAGCTTACACGTGATGCGAATCATTGATAA
-AAACATCAATTGTTGTTTTTAGTGTACTGAAATTCCGGCACAATAGCTCT
-CGTAAATCGACACAAAAGTCACTCCGTGGAAAAGTGGAATTTGGATAATT
-TTGTTCTTTTTTTTAAATATGATTAACGTTTTTGAAGGCTTTTGTCTCAT
-AATTCATCAAATTCAAAACCGGAATTATCCAAATTCCACTTTTCCACGGA
-GTGACTTTTGTGTCGATTTACGAGAGCTATTGTGCTGGAATTTCAGTACA
-GTAGAAACAGAAAATGTTGTTTTTATCAACGATTCGCATCATGTGTAAGC
-TCTACTTGCCAATTCATGCAAAATTATCACGAAAAATGTCTGAAAAGGCG
-TCTCTCCGATTCGCGTCTCTCCACTTCCCTCGTCTCTCCGATCGGTGGAG
-TCTCTTTTGAAATTCGAAAATAAAAAGTTTCGCAGTGCGCCCGGGTTACG
-GTGAATTTTAAAAGCGCATCACGGTTTTGAGTGAGGTCTCGACGCGAAAT
-TAGCCGTTTTTGAAGATTTGTCGTTTATTTTGGCATTTTTGAAGGAAACA
-TAAGTGAAAATAAACAATTTTAATCTTAATTGAGAGAAACTTGAACATTT
-TTACAAAAATTGCAAGAAATTGCGCGTTAAAATTCAAAAATTAGAAGTAT
-CGCGGCGCTCAAGCCGTTGATAACAAGCCGTTATAAACTTATATAACTAT
-ATAATGTAACTCGATGATTTGTTGATGTGATCTTTAAAAAGGTTGAAACT
-GCCCCAGTCGATGTCCGCGCCAGAGGCGCTGTCAGCGGCTGGTTACTTAT
-ATATAAAAAATATCGGGAAAAACGCACTTCCGTTCCATTTGTTTCTTTGT
-TTTTGTGACGTCACTGAGAATTATGGGCGGGCCCGTCTGCCTTCGTGGTA
-AGACCCATCGTGGCGAGACATATCGTGGTGATATCCTTCGTGGCGAGACC
-CATCGTGGTGAGACCCATCGTGGCGAGACCCATCGTGGTGAGACCCATCG
-TGGTAAGACCCATCGTGGCGAGACCTTTCGAAAATTTGGTGGGAATTCAA
-ATTTTCTTAGAAACATTTTTTGGTGGGAATTCAAAATTTTCAAAGAAAAA
-CTTTGGCGGGAATTCAATTTTTCAATAAATAATTTTGGCGGGAATTCAAA
-TTTTCTAAGAATAATTTTGACGGGAAATTCAAATTTGTTGAGAAACTCGA
-GTAAATGCTGGAATGTTCTAGAACCTTCCTGGAGATTGGGGAAAATTTTA
-GTATGTTCTAGAACCATCGGCGAACTTAAGAAAATTCTGGAAAGTTCTAA
-AACCTTCTAGAAAATTCGTGAAAATTCTGGATTGTTCTAGAAATTTCTAG
-AAAATTCGAGAAAACTCTGGAACGTTCTATAGAACCTTCTAGAAAATTCG
-GGAAAATTCTGGAATGTTCTAGAAAATCTTGTTTGCCAAAAGCTCTCGGA
-AGGAACCGGAAAAGTTTCTTATGATTTGAAGAACGTCTAGAAACGTTCAA
-GAAATTTAGAAGTAGTTCCAGGAAACCTGGTATTTTTAAGTTGTAACTCT
-TGAAAACTTAGTTATATAATATTCATGTTGCGTTAAAAACTTCTGGAAAA
-CTGAGAAAAACGTTCCAAGGCTTAGAAATTTTAGAATTTCATCTTAATTT
-CGAGTACGCCAGTCGGAGCACGCGCATTGTGCGAACGGCTGGTATACAAA
-CAATAGTCAGTCAATCCCATGGATCAAATTTTGAATTTTTCTAAGACTGA
-ACTGTTCCTTTGATATGCAAAATTTTATAAAATTGTCTGTTATTGAAAGA
-CATGAAACAAACTTGAATTACAGTAATTCTGTAAATTCTGAACTTACTAT
-TAGAATCCTTAGTGAGCACACTTGAAAACGAATGAAATAAGGTATGTGAG
-AATACCGTATCAATCAGATACGTCTGACACTTCCCCAAAAAAAACTATCA
-GAATATGAGTACGATATGTTATTACTAGTGTGCATCTTTCCGCGCGACCA
-TCATGGCTCAGCAGGTAAGACTTCGGCGACGCCTCGAGACGACGAGGTAG
-TTGACGACTTTTTTCATTTTTTAGGCAGCGCCCAACTCTTGTCCGAGGTC
-TACAGGCTACATGGTTTGGACGGACAGAGTATTTGCTTTATTAGTAGTAA
-CAGAAATACACATAAAATCAATTAATAAGATCCATGAAATGCAATAAAAA
-TCCAGTTTTCACCCATCTACTATGTCTCTCATTGAAGAACTTTTTCAGAT
-AGCTTTTGGTATAGAATATATTAAAATTCATTCTTCGATTTTCTGTGGAA
-TTTCTTATTTGAAAGCTTTTTCCATACCAGACAGTCACTTCTCCAAATCC
-ATCCTTGAAATTTTCTTTGGGGATATTTAAAATATCATCGAGATACCAAC
-AATCTACTGGTTTTTCACCTACAAGACGTGCTCTTGAATTGAAAATGTCT
-GGGATATCCTCTGGAATATGTTTTTCTCCTTTGTCATGCTGATAGTATAA
-GTTGAATGTGACACTTCCATTTCTCTGGCTGTTTTGTTCAGTCAATCGGA
-TTAGCTTTGCTGTGACTCTGTCCATATTGTCCGGAGTAATGAGGAGATAC
-GTTTTAGGAAGTAGAACAGTCATACTCTTGGCTGGGAAGTTTCGTTGAAC
-ATTTGCAATCACATTGTCCATTGGTGAATAATAGTCGTTTTCCAGTTGTT
-CGTTCATTTCGAGTAACATATCCTCAGAGTATTGTAAATCGATCTCCACT
-TTTTCCAGAAGAACCCTCGAAACGGGTTGGGTGTTGAATGGTACATTGAA
-TACGGCATTTGAAAAGTCTTTAGACGTTTCCAAAATGAAATCCATATTTG
-AACTAAACATAGTATTAAAATGACCACTGTAAGCTTCGAACCGGAACTCC
-AGTCTGAAATCCTTAACATTCCACTTTGAAATAAGCTGGTATAAAAAGTC
-TCTTGGGATTGAAAGGAACTCTTTTCCCAGTATTAAAACGGTGAATGTGT
-GGCATGTTACCAATGAATTGAGGAAATAATTTGCTCGAGCACCAACTACG
-TACCGCCCTAGTTGCTTTTCGTATATGGTCCGATAAAACAACCTGTAAAA
-TGTAATCTTTATAATGTTCCTGAGCATATCATGTCAAGAGTGTCTGAGTT
-TTTCATCAACAAAAACAAAATTTGATTTTTTTGTTAATTTTCTAAACAAT
-CCGATTTTTGGTTTTCCGGAAAATTGAAACATCGAAATTTTCCGTTTTTC
-AATATCCAATTATTCGATTTTCCGATTTCCTCTCAGAAGAACGAAAAAAA
-CGAGAATAAAGTTTCCATGACATTGATCGCAGTGGGCTGTTTGTTTTTGG
-GATAACTTTAAGTGAAGGAATGGAGAGACTATCTAAGTATGAAAAACACG
-AGAATTCACTCTTTTGAGAACCTGTTACAATACGTGTACTGTTATAATAG
-AAAAACTAAAGCAGTGATTCAAACATCTGTTCGACGGTGTTCATTACAAA
-TGTATCAATTTACACTCACCAGTCTTTCATTTCCAGCGCTTTGTAATGAC
-GTGGAGATATCCTGATTTGATTTATGATTTCTATTATTTTTAATTCTCCA
-AATAGCTCTTCTCCCAATATTCGCAACTCATCAATTCCAAAATTGCTCAA
-TCGAAGATATGCGAATTTCCCGAATAGTTCGTTTAATCTGTCCATAAATC
-GATCATGCTCATCAACTCCAAAATTTTCCAACATCAAATTCAAAAACTGC
-TGCGGTATCGAATTTCCACCAAAATATTGAAGTTGAATACTATGAACTAT
-ACAGTTTTTATTTCTATGAATGTCTCGACATATTTGACAACCACAGCAAA
-AATCATTTTTATATTCTTCAACGAGTCCATCTAAAAATCATGAATGTCAA
-ATCAGTAGTTCAAAAGCCATATATTTTACTCAGAATTCTGAAAAACAGGC
-GCTCATGTCAAAAATTGACTTACAATCTACTCCAATCAAGCAATCGTGTA
-TGAGATCATTGAGTATAATTCGAGCATCCACTCCGCACGAAATTTCGTTT
-TTCTTAATCGGTTCGACATAAAGCTTGTAGACTTTCACATTTACCGTATT
-TTTTAAAAATCTGAAAATAATGTTACAGCTGAGTACAAAACATTAAAAAT
-TGGTTTAATTGATTGAAATTTTCACCACTTCTCATATTGTTTCCACGATC
-ACAAAAAAGCATAAAAAACTTCAACAGACTCAGAAAACACTTTTTAAAGG
-CAAGTTTTGAACCACCTATTTTGATGAAAAATTGTCTGAAACACTTCTCA
-GATCGACTTTTCCCTAGCTCAAAGTGATCCTCTGCCGCTAGCTCTTTTTT
-AGAGTGGTCATTCGAAAGTCCGGGTTTAAGTTGAAATATTTCCCTTACCG
-GTCAAAATTCTATCAACATCAAAATAAAATTGAATTTTTTGGTAGTTAAC
-AGAGGAAGCGGCGAGCAAAAAAACCAGGTTTTGAACAATTGATTTCAACT
-TACACGAATAAGTGTTTCACCTTGTTTTTGTTTATCTCCAGTGCATTTAT
-AAGAAACGAGCAAGTGCATCGACGAAGCTGTTTTAGCGGAAGTTCAGGAT
-CTACTTGATTGTTAATGAATATTGATCTTTTTCTTCAATTTTTACAAGTT
-TTGAAACTGTGAATTTGTATTTTTCGATGCTCATTTCGAATTTTGTGCAA
-AACTTCTTCGCTGAACAATTTATTTATCAGCTGAAAAAAGAGCGAATTAA
-AGTAAAATTGAACACAATTTTGATACCTGTCTATAATTAGGGATATCAGT
-CCGCTGTATTGATTTTTTTGTTTGAAAAACTGAGTTTTTGTTTATTTGCA
-GCGGCAAATTTTTATTAATTTTTTTTGATAAAAGTTCATCAATGCCATCA
-GTGTTGTGGCACCACGGAGTGGCGGAAGACCGAACCCTTTAAGCCTCAAG
-AGGAACCGAGCAACGAAGACTATGTCAGAGGTGCAGCATGGCATCGTCTA
-TTTGTATATGTATTGGAAAGAACAGAACACAGTTTCAATAAATATGTTTA
-TTACTCCAAAGGGGAGATAATCAACAGAGGGGGAGTGGGTCGTACACAAG
-AGAGAGGGAATTGTCTGGTGTGAGAATATCACGTCCTGCCACGCGGGTCT
-TTAGTCTGAAAAGGTCGAGTGTATGAATAGTCGGGGTCTTTGCAGACTCG
-TAGAATAATGTCTTTGGTCAACTACACTTTCCAAATAAAGGGAGGGAAAG
-GTAGGAAACGTCGGCAATTAGTCTGACTGGGAGCTGTCAATAACGGGGGG
-GGGGGGGAAGAGACCAGCAAAACCGAACCAAGAGTGGGGAGGAGAGTTCC
-TTTCCTGGTGCCACCGACGCTGCAGCTCGCTCCGTATCGTCGCTCATTGA
-GTCGCCGCGCAGCCAATCGTTGCTACGGGGCGCGAGTGTAACTCTCGTTA
-GAGAGCGTGTGGGAGCAAGAGACGCAGAAATACAGTAAACTTCTGCGACT
-CCTAACTGTATGGTAAGCTTAAGAGCTGGTCTTAAAAGGTCGAATTGAAT
-GTACCCCTCGCTCGGAGAACTGCTGAAGCAGTCGAGAGCGAGACATTGTG
-AAATGGGCGATACAGCAGAGCCCAGTTCACAACTCTCCGGGGGGCGGGAC
-TTGTAGGCTGGTTCACGTAGTGAACTTAAGGTTTGAAGCCTTCCTTTGCC
-TTTCTTGGAAGAGATTGGCGGAGTGGAAGGTCGTCTGAGCTCCTGGCTTC
-TTTTCGTGAGCGTTCAGCTTCTTTTGAAGATCTAGTATTAGGTGAGCTCG
-GAGCTTCTTTTCTAAATCTTGCTTCGTCTGAGCTTAAAGCTTCTTTCCTG
-GATTTAATAAATTTTAAAGATGGAAGCATAGGTAGTGAGGGTTCAGGAAA
-GTCGGAGTCCGTCTCTTCGTCTTTTTGTGGAATTTTGTCTTTATTGTCTA
-TGTCTTCCGCTGTAACCTCAAGAGGATACAGTTGATTTAGTGATCGTTCC
-AACGTGGAGTTATTGAAACGAACTCGTGCCGATTCAATGTTTCCTTCTTT
-ACTCGGAATGAGCTCCACAATTTTGCCCAGAGGCCATGTGTGTCTTGGCA
-ACATTTCTTGTCCGACGAGAACAATGTCTCCTTGTTTAGGATCTCGAGGA
-GCATCCCTTGTATTAGTCTTTTGTCTTTCTCTCAGAAACAGGAGATATGA
-TGTCGACCAGATTTGCCACAACTTTGCAACTGTTGTTTCAACTCTGGCTA
-AGTGTCTTCTCGTGATTTGCTCTGTTGATCGAGCTGTCTTTGGAGAATAT
-TCCATCGGTTCGTCTAGATCAACTTCATTCGGTGCATCTAGCTGAACTTT
-TGGTAGTAGAAAGTCGATTGGGCGGAGAGCCGTCAGATCATTGGGATCTG
-TGTTGTCTGGTGTAAGTGGACGGTTGTTAATCATCCCTTGCACCTGTCTT
-AACGTGCTGGACAGCTCGAAGAAGGTTAACTTTTTTTTGCCAATAGTCTT
-GCGAAGTTGGTGCTTCGCAATTCCAACAATCCTCTCGTACACTCCACCTT
-GCCAAGGGGCGAATGGAGTGATGTTGTGTACCTGAATTTCGTATTTGGCT
-AAAAAGCAAATCATTGAGTTGCTTGGTGCGTAAAGTCTGATGTCTTGGTT
-GACCATTTGGTGGCCGAGTGTAAATGTTGGTGCATTGTCACAGTAGATAT
-GGGGCGGAACACCACATGCACTGGAGATTGCTCTGAGTGCGAGCAAGTAG
-TTGGCTGTAGTAGCGTCTGGAATGAGTTCTAGAATGGTAGCTCTAGTCTT
-CAGACAAGTGTAGATAAGAGCATAGGCTTTACCTAGCTTGTCATCGTCTG
-TCTTGTATTGTATTGGACCCAAATAGTCGAGTCCTACATGGTCGAATGGT
-GCAGAAGGTACAGTTCTGCAGTTTGGTAGTCGTGTGTCGTAATTGTATTT
-AAAGGGTCGTGCTTTCACCTTTTTACAGTTCACGCACTGAGCAATTGTAG
-TTCTTGCAATTTTGCGATCATTTCTGATCCAAAAGTGCAGTCTTACCGTA
-GTTGCCAAATAGTGTAATGGTAAGTGGGTATTTCGTCTGTGGACATCTTC
-CACAATTAGACACAATCAGATGTGGAACCGGATTGGGTCCCACTATCCAA
-TGATGTTTGTTTCCGTCCTCGTCTACTGGGTTACGCAATGTGTCTTGCAA
-AGTGATTAAGTAACCGTCTGTAACAACTGGAGAAGTTGTGTCAAAAAATG
-TCTGAATCAGTATGATTTTGTCTCTGTCTTTGAATTCGAGAATTCGTATT
-GTCTTGCATTGACTGAGCATAAGAACAGTTTCCTGTTATATGACTCGGTG
-ACGAGCAAATCGTGCATCTACCATTGTTGATGCAGAAGCGTTTGACTTCA
-ATCGCACCCATTGTGCACGTTTGAAGTGGATGGTCTTTTTTGCAGGGAGG
-GCACGGATCTCCATCGAGAAATTCTTGCCAATTCTCCACGAGTCTGGAGG
-TAGTATTACCCGTCTTTTGTTGAATATGCAGGTTCAGGAGGTTTTCCTTT
-AGTTTTCTGTCCCGTTGGACATCAACCAAAGTACGTCGCCAATCTTCCGC
-GCAGTTGTCTTCAAGATGTTTTTTGAGGCTTACGATTGGATCGTCAGCCC
-GTCTGGGTCGTATAAAGTTACGCGGAGTCAGCTCGGTATAGTCAGCTTGA
-TAGTCTTGCATATAGTCTTTGAGATCTTTAATTATCATGTCTTTGGATTT
-AATCGTTGAAGGTTTCTGTTTAACAGTTTCCAACAAGTCTTTAATCGTCG
-ATAGTCTATGTCTCAAGTCACCAGAAATAACAATCATTTTCTGTCTGGCC
-AGATTAGTCGTGGATCGTATGATATCTGTTAAATTCAAAATTGGCGTACC
-TGTATCCTTTGCCTTCTCGGCGACGTCCTTGAACATCTCCTCGATGATAT
-CCGGCAATGAATTGGCTTCGACCAAGTATTGAGTCAGGTCTTTGTACCAT
-TTGTGAAGATCCTTGATGTAGTCCATATGCTGCTGCTTGTCACAATCGAT
-ATTGGCGTTAAGCCAGTCGGATGAAGACTTATCTTTGTGCTTCAAGTCTT
-CAGTCTTAAGTGCGATACGCGTCAGCAACAATGCTATGGATGATGAAGTG
-GAGAATGGGGTCCTGGATTCCCTTCCCAAGCTGCCACCACCGGAGTCGGG
-ATCAAGACTTCCACCTCCAAGATGAAAAGTCATTCTTCTTTGAAAACCGA
-GAAACTTGTTATCTAAAATCAATAATTGGTTAAGAAGAAAGACAAAATGT
-TTTGAGATTAAGTAAAAGACTTAATAAGAGATTAGGAAAGAAAGATGGGG
-ATGAAGACTCAATTTGAGTGATAAGAAAAAAAGGTATTTTAATATAAGAT
-TCTACAATAGGGATTGGGAAAGGTGTGCCGTGGCCTAATATAGGTTTGGT
-GGTACAATAAATAGGGGAAGTAATGACCCAATATGGGTGGGGGGATTATT
-AAATGTTACCTAATATGGGTGAATTATTAATTATTCCTTTGGCAGAGGAA
-TGTCGGTGAGGGCTAAGAGTTCCCTGTATTGTAGGTTGATTAGTCATGTA
-GGGGACTGGTGTAGAGTAATTTGGTGTAGAGTAATTTGGTGTAGAGTAGG
-TATTTGGTGTAGAGTAGGTTTTGGTGTAGAGTAGGTTTTGGTGTAGAGTA
-ATTTGGTGTAGAGTAATTGGTGTAGAGTAGGGATGGAGGGAATTCAACAC
-CGACTGGTCGTGAATCAGATCGGCCCTGAATTGGGGTAGGGGACAATAGA
-AAGAAACTACCGTGTGGCCAACTGCCCCCAGCAGGGACCTAGTTGGGATT
-GTTTTCACTTGAACACGAAAACAATGGGGGTTGGGAAAGTTAATAGGGAC
-AAAGGAGCAAAACGAAACGTCCATTCCCGCATCGAATTGCCTCATAGGCA
-CCGCACCCAAACTCTCCTGCCGCTGCAGCAGTCAGGGAATCCGACGCTCC
-ACGCTCTCCATCGCGACTGGAGACCAAGTTCTTCTTTCTTCTTATAGTCT
-TTTTTTTCTAGTGGCGCCGGTTAATTACTCCATTGCCAACTAGCTGTCGG
-GAAGTCAGAAGTCAAATGTCCTTGCGGACGTGGAATATAACATGTTTGAA
-ATTAGGGTGGTTTAAGTTTTTTGTGAGATCCCTATGGATAAATTTTGGTT
-AATTTTTAAATTTGAAAGGTTTTAAAAGATGTACAAATAATTTTTAATGA
-TGTATAATTTTTGGAGAAGGTACTAGTTGAAAGATATAAAGAATTTTTAA
-ATTGAAAGTTAAATTAAAATTTTGAGGGGAATTGGTGTAGAAAATTAGTT
-AAAATATATTTTTGGAATTTTTGAAATTTTATAATTTTTAAGGATTTTTT
-AAATTTTTTAGGAAGTTATAAAAGGGGGTAAATAAACTAACTGTTCGATC
-GCCGCGTCCTCCAACGAGCAAATCCTCCATCCATCCAGAGTTCTTGTCTA
-CCCGTCTTGTCGTCTATTCCTCCTTTTCTTCTTGTCTCTAGCACACAGGA
-GACTGTGCACTATTGTCTTTCCGTTGCAGTCAGCGAGCTGCCAGCAACTA
-GTCGCATCGTTAATGGCACCTTTGCCACTGTATTGAATGCTGTGAGCTGT
-TTTAAGTGCTATTACACTATAGTCTGTAGAAAACAAGAAATTTTGTAATC
-GTCTTTCGTCTTTCGTCTTGAACCATATTAACAGCCGAGATTTATTAAAT
-CAAGGAACAAATAACAGCTTCAACAATGTGGTATCAGATACCGGTGAGGA
-GTGGTGAGGGGGGAATTTCAAAAAATTTAAAAGATAAAAATTTAGTGATC
-GAATATCGAGATATTCGATGGGGATTGTCCTCGTGCCAATTTCTTGGCGA
-TCCTTGGTTGGTATCGGCGTCTGACCGGCTGGTGTTGTTGCTGCTGTTGC
-TGGAGTTGTGGTGGCGGTGGTCCAAATAGTTGTGGAGCAGGAACGCGAAG
-TGGTGGTGGGAACTCCTGTGCGGCTGGTACGAGTTGTGGTGGAGGTTGCT
-CTTCGGATGGTGGTGGCGTGTGAGCATTGAATCCTCCAGAGACTTCCATC
-GCGAGGGAGATCCTGTTGATCGCTGCGTGCACCACATCTATCTTGTCGTA
-CAGAACGACGTGATCCGCGGATTGGATCCACACTTCCTGGGAGCCAGAGC
-CTTGTGGAGCCGTCGCAGTCGTCGGGCCATTTGGGTCGCGGCCGGTCTGG
-GGGGCTGGGCCCGTACTTCCTGGGAAGTTGAGAAACCAGTCTTCGAAGAA
-CTCGGATGGAGATGTGTCGTCGGTGAGCGTCGGGTCGAACGGTCTGAGAA
-GATTTTAGAAAATTAATAATAGTATATGGAAAAATTGGATAAATTTTTAG
-AATTTTGAAAGAATTGATTGAAAATGTGTATAAATTGAATTTTTTAGAGA
-AAAATGATAAAATTTTTTAGAGAAAATAATAATTTTTAGATAATTTTTAA
-ATAAAATCGAAACTTCCTTTAGTCTGGCGCTTCGTGGATGGGTAGGCTCC
-ACTCAGCTGTCAACTTACGTACTACCAATGAAGAATTGCAGGATAATGTG
-CATATTAGATGCAAAACGACGAGAAATAGCGAATAATAAGTCGGGGAAAG
-TCGAAATTGTGCTCTGGGAGCATGAGTTTGCCAAACTCACGTCCCTCGGC
-GTCTGTGGGCTCGCGAGCCGCCCTTGTGTACGATTTTAGGGGTTTTTTAA
-TTTTGAATTTTTAGAATTTTAATTATTTTTAAAGAAAGTTTGGTAGAATA
-AAGGGACGGGGGATGTTTAAATAGATGTGTACCTGTCGTCTATCAAGTCT
-TCGACTATCGAAAACGTCGAGTCGTCGAAGTTCATATTGAATCGTCTCTT
-CACGGCCCGGCGGGGGGTACATGGACGAGAATTCTCTACCGTATTCCAAT
-TTGGCTGACTGCGTGCTCAACGTTGAATACTCAGTTTAAAGTTTCGTACA
-CCGTTGCGTACTGCACAGCGCGCATTTTAATTGACGAAATTTCGCGAAAA
-TTAACAGAAGATTTTTTTCGGAATTATAGAGCTGAAATTGAAAAAAAAAC
-TATCAAATTTTCATCGAATTTGTGAAAAATCGTAAGTATGAAGATCTTTT
-CTTCACTATATTCAAGGAAAATCGATATTTCGCTTTTCACAGACGAATGA
-TGTCTCATTTTACTCGATGAAAGTTTCTGATGAGCTGTTTTTATCGATTT
-TTGAGCGATAAAAATGCGATTTGTTGATAAAATGGATCAATTATATAAAG
-AAACAACATATATTGCTCTGAGATTACTTTTTGAGAATCAATTCTTTATT
-TTTCGGTCATTTTAAATTAAGCATTAAAATAAAAATATTAGAAATCATAA
-TAAAAAAAACAGAAAATCGATATATTACTTTTTCTTCGGAATTTCACGAC
-TTTTTTGGACGAATTTTATTCTGTAAACTTTCTTCTTCGAATTTGTGTCC
-ACGTGGCTTTCAGTCGAAGAAGATTCTGCAGCACTCCTTCTTGCTTGCCC
-ACAACTTACTCGAATTTTCTAAAATTTTTAACTTATTGAAATTGTCATTT
-CACCTTTACACTCACTTCAGCTAAACTATTACTGCATTTCGGAAGTTGAT
-AGGATACTGGTGGAGCAACAAGTGGATGGCTTCTAGTGATTGGCTGGCTT
-GTCGAGCAAGTTTGTGTGATTGCCTGAAATAATTTTTGATTTCAATTTTG
-AGTTGATTTAAAGCAGTGAACCTACCACCGGGTTCGGACGAGAAAGAGCA
-TTACTCGGTAGACCACGGAATCCAATTTTCGTTGAATTGCCTCCAAATGC
-AATAGAAGTTTGTACGTTTTGTGAGAAGTCGGGCTGAAAATTTTCAAAAT
-TTGAAACTTTTCGAGAAAAATAAAAATCTCACCACAGCATTTCGAGATTT
-TGTCGATTGTGGAAGCCTTTTCCTGGAGCGAAAATTGATTTTTTTTTTCG
-CTAAATTTTTTCTTTTTTGGGCAGCCGTGACGTCCCGAATAACTGCTTTT
-GGGTCCCGAAGATCATTTTGCGAAGAAATTGGCAGAACTGTTGCATCTTT
-TGGTACGATGGAAAGACCGGGAATGGACGTGTTCTGAAATAGTTGTGTTT
-TTAAGAATGCAGAAATGTTTTTCTGTACCAAAATTACCATAGTCATGTCA
-TTCATGATGTTACGACACATGAGCTCTCTCAGAACATGGATGTAACGCCT
-TTTCTTGTCCCGGTAATTGCAAAATCTCCTCTCAAGTGCATTGAAAATCG
-CGTGGACAGATTCAACTCCTTGTTCTGTGATCCTTCCAATGTTTCTCACA
-TCTTTTGCCATTTGTGGTGCATGGTAGACCAACAAGTGCAGCTTTAAAAT
-AATTGTTTCTTCGGGAACCGCTACTTTCAAATCCTCCACAAATCCGCGAA
-TCGAATTTTGAAGTATTAAGACGTCGGAATCATTTAAAAACTTGTTTCCC
-GAAAGTGACATAATAGTTGAAAGCTTTCCCATTGCTGATTTCAATCCGAG
-CAACATTGGGCATAAATTTGGGCCAAAAATGTTGAAAGTCTCCTCTACAA
-CAGCCGGCGTTAGCAGCAATTTCAAATGGTTTCCGCAAAATGATTGGAAC
-CAAGCCTGCTTGTCCGCTCCAAACTTAGCCCAACACTGTCCCATTTTTTC
-AAGTGTTCCTTCGGGAGTACCATTCACAATTGTATCGAGCAACAATTTTT
-CCGATTGAAGTGCTTTCAGTTCAGCATGCGACTCCAATTTCATCTTTCCG
-GTGGCTCCTTGATACTTTTCTTCCGCACTTTTAATTAGGTTAACAGCGTT
-TTTTAGAGTTGCTTTTCGTGTTTTCAGGATAGGAAAAGAAGTAGTGTTAT
-CCAAAGTATCAGAATATTTCCAGAGGGGATTGAAGATATATTTGTCAAAA
-ATACCCATGATAATGTGCAGAAGAGGAATCAAATAGAACATGATCGCAAC
-GTGTGGCAGAAGTGGAGTACATCCTTTGCGAACACCCAAGTCGCCATTTT
-CACAACAAGCTTTGTAAAGATCGATTGTTCGTGGGTGGAATGTTTCATCA
-ACATTCATATCCTTGATTTTCATCCTCTCTTCAGCTCCCCGTGGATTCTG
-TGCAAAACATTTGAAGCAGAAATTGTGGGATGAATGTCCTTGGTGTCCAA
-GAATATCAGATTGAAACTTGCAATCTCCAGTTGCAATTTGCACAATTTTT
-GCGGTTTTTTGAACTCCTTTGTCCAAATATCAAATTTTCGTTAGCTTGCC
-AAGCTGCTCAAGAACGTCCGGAATGAATTTTTTCAGAGACGAATAATTGT
-CGGATCCGTCATATACTGCAATTACCATAACGTGTCTCGAAGAATTCGGT
-CGAGATACGTTTCCGATTACCAATGCCAACTTTGTGCTTCCACCTCCAGC
-GTCACCAACGACTCCAATCTTGATTACTCCTTTCGTGTATCCGTCGTCCA
-CAAATTGATTTGAATTGCATAGAAGCTCTATTCGATAGGCTAAAACTTCT
-GCAATTTTCATGCACTGCACAATGGTAATCACTTTTCCTTTATTGTCGAA
-CGAAGTGGAAACTTTGAAACTGGAGATCATTGATAACTGGATTGACAAAT
-CTCTTGTGTTCTTTACCGATGGAAGCAAATCATAGCCAATGGCATTAGTC
-AAATAGTTTTTGATTTTTTCCATCTGACTTAGAGATAATCCGCATTTTGA
-TAAAAAGTCAACGGCCTCAAAGTTTGAAAGCTTGTTTTTGTAGCTTTGAT
-TCTCTTCTGAATTCAGGAATTTTGTGAATTTTCGAATAAATTGTCCGACG
-TCATCCTCGAGGCAGATTTCGTGTTGAAGCAAGTGAAGAGCTTTGCGAAA
-TCGATTTTTGATACAACTTTTGCTTCTTAGATTCGAAATATTAACTTTAA
-AAGCTGATTTTTTAAGGTTTTCAACTTCTTCGGCGTGTCTTTGTAGACTC
-AGAACCATAGCTTTGCCACTTTTCTTCACATCTGCACAGCTTCTCACCAA
-TCGACCTTCTATACCACTGACGATCGTTCGTATATTGCATACTTCCATTT
-GCAGCGAAGAATTAGATGCTCTTATAGTGATATTTTCATGGCGGACTATT
-TGCATTTCTTCCGAAAACACCGCAAACTCATCAATCCGCTTTTGTATTTC
-TTCTGATATTTCATTTTTTTCATTTTTCAGTCGTTCGATCGTTAGTCGGA
-GCATTTTGATCTGCGGAATTTGCTCAACATTGGAGATTATTCGAACCCTC
-GGTGTACTGAACGAGTTTCGTAAAGGTGTCGGTGGAAATACGGGATTGGA
-GAATCTCAGCAAAATCATATAATATTAGTTTTGAAATATTGAAAAAAATT
-ACATTGTGAGAAAAAGTCGGAATTTCGTCACTAAAATCCATTTCCACGTC
-TCTCGTCAGAATTCCTTCATCCATATTGAAACAATTTGACGACCTGCATG
-TAGTTGCGGAGCTACTGGAAGCAATGTCGGGATGGTGGGAGTTTCGATCT
-TCTGAACTGATTTCCTGATTAGCCTGTGGCGACGAGCTGCACGTCTGAAA
-ATCACGTTTTTGAAGTTAGAACAAACTACTCCAACTTAATTAAAGTTGAC
-AAAATTGAGCTGAACGAACCTCCACTTTCGAATTGTTCAGTTCTTCCTCT
-TCAGTTTGATCTTTTGAAACTCCATTAGCACTGTTCCTTGCTCTCTGGGC
-ATTTGCTAAAAGAAGGCCTGCACAAGATTTTTCTTTTCTTTTTTGTTTGA
-AGTATACTTTTGTCATCTGGAAATATTGCATGAATATTATAAGGGAAACA
-ATTTTTAAATATCGATTTTCACGAAATTTGAAAAAATCAATAATTTGGGC
-GCATGATATTGAGCTGAATGTTTCGAATTTAGAATCAGCATGCTTTTATT
-CATATTTTAGGATCTTTTTAAAAAATCTGGACCAACAGTTTTTGAAAAAA
-AAATACTTTTCGTTCAGAAATGTACTGATTTTCCACTGATTTTCACGAAA
-TTTGAAAAAATCAATAATTTAGGCGCATGATATTGAGCTGAATGTTTTGA
-ATTTAGAATCAGCATGCTTTTATTCATATTTTAGGATCTTTTTAAAAAAT
-CTGGACCAACAGTTTTCGAAAAAATTCAATTTTTGTTCAGAAATGTGAAT
-ATTCACTAAATCGAAAAAAATAATTGCAAAATCCGTCGGCTGAACATTCA
-AAACTTATCAATTTGAAATCAGCATATTTCAGTGTATAATTAAAAAAGGT
-TTCAAAAATTCTGAGACCAATTTTTGTTGAGAAAAATAATTTTTCGTTCG
-AATTATCGATTTTTCACGAAATGCCAAAAACAGTAAACTTGGGCCCATGC
-TAAAAGCCTGAATCTTTCAAATTAAAAACCAGCATGATTTTTTCTATATT
-CTAAGACGTTTAAAAAAAATCTGGACCAACAGTTCTTGAGGAAAGTAATT
-TTTTATACAAAAATGTGCTGATTTTTCACTAAATTCAAAAAAATAATCAA
-GTTGGGCCCATGCTATACACCTAAATCATTAAAATTCAGAACCGCCATGT
-ATGTATTTTTTCATACCATAGGCTCTTTAAAAAAAATCTGGACCAACAGT
-TTTTGAGATATGTCAAAAAAAACAACTCACTTTTTGACGTTTTTCGCCTT
-TTCGCGGATGATGCGGTCGATTTTTGCGGCGATTTGTGGTCTTTCGCTGA
-AAATATTATTTTTATTTCAATTTTTAACGAAGAAAACAAGAAAAAACGAC
-GAGAAAACATCAAAAAACACGAAAAAAACGTCGAAAAACTCCCGCAACCT
-CATGAAAAAAAATAAAGCACTGCAGCCGCGGGACTAGTTTTCGCAACTTT
-CTAGGCCATGTCCCGTTCGCCGTGCCGTGTCTTGTCGTGGTGGTGTGAAG
-TGTGTTGGTGTGAAGCGTGTGAGTACGGTAGGCTGCTGCAGATGTGGTGT
-GAGCTGTAAAAAATCGAAATAATTCAAGAATTACGACGATTTTCGTATTT
-TGAGAAGAAGAAAATTTTAAATCACGAAAATTCGAGAGAAAAAATGATCA
-AATTCAGTCTCAGAAGCGAAAAATGAACTTCTTTGTCTGGAAAACAGCGG
-TTGCTCGTGAGAAAAAATGTTTAAAATTGAAGAAGATCAACAAAAACAAA
-AAAAGACACGTAAATGCAACTTGTTTTTAAAGGTCGTGGCCGCGTCGCGG
-TCGCGCCGCGTGCGCACTTTTGTAGAAGACTCCGCCCCCTTTTTTCTTGG
-CGCCGTGCCAATTTTTAGAAGGAAGAGCGTTTTTGGTTGAAATAATCGAT
-TTTCGACGAGAAAATAGACTAAATCAAGTATGGTGAATCTGATTAAAGGC
-ATATTAACTTTGTAAACTGCACAATTAACTAGAAATCGTACTATAACCGA
-ATATAGTCAAAGGGTCGCTCAGTTCCCCCGGTCTAGAGTCCCAGGTTCAT
-CTTTCGAGCTGTTTCCTGAGAAATTGTACAGGATTTGTCTGAGTCGTGAA
-CTGAACACGCTTTTCAGGTAAACGTCGTCTGGATGTCCTGGAAATCAAAT
-GTTAGTCTTTGTATCGATGGAAAACATGGTTTTCTCAAGGAAATAGTCGG
-AAAGTCGGTCGATGCACCATGTTGTGGCACCACGGAGTGGCGGAAGACCG
-AACCCTTTAAGCCTCAAGAGGAACCGAGCAACGAAGACTATGTCAGAGGT
-GCAGCATGGCATCGTCTATTTGTATATGTATTGGAAAGAACAGAACACAG
-TTTTAATAAATATGTTTATTACTCCAAAGGGGAGATAATCAACAGAGGGG
-AGTGGGTCGTACACAAGAGAGAGGGAATTGTCTGGTGTGAGAATATCACG
-TCCTGCCACGCGGGTCTTTAGTCTGAAAAGGTCGAGTGTATGAATAGTCG
-GGGTCTTTGCAGACTCGTAGAATAATGTCTTTGGTCAACTACACTTTCCA
-AATAAAGGGAGGGAAAGGTAGGAAACGTCGGCAATTAGTCTGACTGGGAG
-CTGTCAATAACGGGGGGGGGGGGGGGGGGGGAAGAGACCAGCAAAACCGA
-ACCAAGAGTGGGGAGGAGAGTTCCTTTCCTGGTGCCACCGACGCTGCAGC
-TCGCTCCGTATCGTCGCTCATTGAGTCGCCGCGCAGCCAATCGTTGCTAC
-GGGGCGCGAGTGTAACTCTCGTTAGAGAGCGTGTGGGAGCAAGAGACGCA
-GAAATACAGTAAACTTCTCCTAACTGTATGGTAAGCTTAAGAGCTGGTCT
-TAAAAGGTCGAATTGAATGTACCCCTCGCTCGGAGAACTGCTGAAGCAGT
-CGAGAGCGAGACATTGTGAAATGGGCGATACAGCAGAGCCCAGTTCACAA
-CAATCAGACTAACTGGCACTTACGTATAAATAATATTATGGGTTTCGTCG
-CTCCCCCTCCAAATGTTTTAAAAACGATTTAAAACATAATTTATACTGTT
-TTTTTTTACTACTGACCAATGAAAGTTCATGGTTGATAACATAAATCCCC
-ACATTTTCAGAAAAATGGATAAGCAGAAAAAAAGTTATTAATGAACTCAT
-AATTTTCATCGAAATTAGCCAGCTTTAGTTTCGGTGTATTACCAGAAAAC
-AAATTTAAGTGATCTTACTCTCAACTCCAACAGAGTATCTAATTGATTAG
-ACACATTTTTTACAATCTTGCTGACAATTGTGCGATTTTTGAAGATTTTG
-TCAATAAGCACGTGATCCTGAAAATAAAAAAGTGAGTAATTTTACGCTCG
-CGAAATTGTGAGCCAGTGGCTGCCTAGATTTTCAATTTGTTACATTATTT
-TGCAGCCATACGTGGACCATAATTCTGGCGACCACTTTACGGCATTATAA
-TTTTTTGAACTGCAAACAAAACATGTAAATATACATATATGTATACTAGG
-AATTCGCACTAAAGTAAATTATTGAAATTCGTCAACTTTTATTTTCATTT
-CTTATATTTTGTCTAATTTTCAACGAATTATTGAAAATGAAAATTTTTAA
-TTCACGTCAAAATTAGTGAACGCGGTGAACGGCGACGGCGAAGGCGGGCC
-GGCGTGAGGCCGGCGTGAGGCCCGCGTTTCGCGCCTCACTTAGCTGGAAA
-CCCTAAGTTTCTCCAATTAAATTACAGGTGATATACATTTTTCCTCTTTA
-GGATAAGAAAAGATCATTTCCTAAGCCTGACAATACAAAAATGTGGTTCA
-CGTTTTTATTTTTCATAACTTAAAAAAATACTATTAAAATGAGGGCATGT
-AATACACAAATACCGGCAAACGGTGTTTCAAATCAAATATTGAAGAAAAA
-ACAAACAAAATATGATGAATTCTCTTTGTTCTTACCAAAATCGAAACCAT
-CATTTAAAATTTAGCAATTTTTTACAGTTATATTTGGTAATTACGGCCCA
-TTTTCTATAATATAAAGAAACAATTGAAACTGATCCACCCTGTCCGCCGA
-CTATTGGGCATCGACAGATGGTGTTCTCAAAATACCAAAAATGGGTGGAA
-CTCTCTCACGAGCGCTCTGCAGGTGTCGTTTTCCTTTGCAAAGGACTGCC
-CTTCCATTCATTTGTGTCTCTATACAACATCTCATCTGTCATGCAAACCG
-ACATTCCCAACATACTCGAAATCCCAATTGATGTAAGTTCTTGTTTCTTA
-AACTAAAATTAGCCAACTATTTTCTAGAAATATCAATCTAGACCGAAATA
-CCTTTTACTCTTGAATGATATCAAAAGTTTAAAAATGTTTTATCTGGTAA
-ATATATTATTCAGTCAATAATAACAGAGCAATAATTTCCTATTTGTAAGA
-CGGTTTGCCAGCCCTACTGATGTAAGCTAAAGGTCCTACAAAAAATCCCT
-GAATTTTGGGTCTCCTTTGCTAACTACAAATGGTAGGCAAAAGAACATAT
-TTGTGTACAAAAAAGTATGCAAGCAAAAGAGACAGCGTAGGCAGGCAAAA
-GATTCATAAAAGAGAGATAGCCCCCGCGGTCAAATCATTCTACTAGTGGC
-TTGAAGCCTCTGTTGATGTGATAAAAGTAACATTTTATATAGCATTGTGT
-TCGATTTTTCTAACAAATAAAATGCATATCATTACTTATACAGTGCGTGC
-ATGTTCTTTATGCCACCCCCAAAGTTTTTAATCATGGCAGTTTCTGTGTA
-ATTTGGTGAGCAAAAAGTATTGAAAACCTATTCACAATGAAAAACCTAAA
-CTCAAGAAATGTTGTGATTATATCTCGAAAATTGTGAAAAATAAGACAAT
-AAATCAAAAATTGGCCGTGCAACTTCTATATGCCACCTCGGATTTTTTTA
-TGATTTCTTATGATTTTAGACTATTAACTTATTATTCAAATAAAATTCGA
-TTCAATTCGTATACATTTCAGTGCTAAATAACTATTCCTGTAACTTCTCC
-CAAAGACGATACGATGATCAAAATATGGGGATATGTTCTAGATACTAATT
-AAACATAGTATGTGAATATTGGTTCACATTGGTGGATTTTTAGCGTCGCC
-AGAGGGACATATTTGGTGTCCCCAGCCGTTTTTGGTGAAAACACTATTTC
-TCTTTTTTTTCTCGGTGCCAATCAAGTTGAGAAATTTCAGGCATGCTCTC
-GAACCTTCAGGAAAGATCGAATACTGCAGAAAACCTGTAGACTAGGAAAA
-CAACTTGGAAGTTTCTTAAAAGTTTGGAATTTTACTAGAATTTTCTGAAA
-AATTTCAGAAAAAAAGAGACTTTCAAGAAACTTCTGAAAACTTCGAGAAA
-GTTCTGGAATGTTCCAGATTTTTCTAAAAAGTAACAAATTCCGTTCAGAA
-CAATGTTTTGAATATATGCCAGAATCTTACTCAAGTAAAATAATTTTTTT
-TAAATTCTGATACTCCAAAAATATTATGAAATTTCAAAAAAAATTAAATT
-TAATAGACGTTTGCAATACTATTGAAGACCTGAAAAAATGTTAGAAATTT
-AGAAATTGTTCATTTTGAAGTATTCGAAATACTGTTCGATTATTCATGAG
-ACTGATAATGTTATCAGTTTTTTTTATTTGAAAGCTTTCTAAGAATTTCA
-TATGATTAGAACATCGAAATAGTTTTACTTTAAAGAAAAAATTGCTCCTG
-GAAAATTTTAACTGCTGAAAACTTGGTTACAGAAATTTTATGATGCTCAA
-ACACTTCCTGGAAACTGAAAAAAAAAAACGTTTCATCTGCAAAGAAAAAC
-TTAGAACAAATTTCAATAATTTACTTTAGTGCAAATTCCTAGTATACATA
-TATGTATATTTACATGTTTTGTTTGCAGTTCAAAAAATTATAATGCCGTA
-AAATGGTCGCCAGAATTATGGTCCACGTATGGCTGCAAAATAATGTAAAA
-AATTGAAAATCTAGGCAGCCACTGGCTCACAATTTCGCGAGCGTAAAATT
-ACTCACTTTTTTATTTTCAGGATCACGTGCTTATTGACAAAATCTTCAAA
-AATCGCACAATTGTCAGCAAGATTGTAAAAAATGTGTCTAATCAATTAAA
-TACTCTGTTGGAGTTGAGAGTAAGATCACTTAAATTTGTTTTCTGGTAAT
-ACACCGAAACTAAAGCTGGCTAATTTCGATGAAAATTATGAGTTCATTAA
-TAACTTTTTTTCTGCTTATCCATTTTTCTGAAAATGTGGGGATTTATGTT
-ATCAACCATGAACTTTCATTGGTCAGTAGTAAAAAAAACAGTATAAATTA
-TGTTTTAAATCGTTTTTAAAACATTTGGAGGGGGAGCGACGAAACCCATA
-ATATTATTTATACGTAAGTGCCAGTTAGTCTGATGGCATTGATGAACTTT
-TATCAAAAAAAATTAATAAAAATTTGCCGCTGCAAATAAACAAAAACTTA
-GTTTTTCAAACAAAAAAAATCAATACAGCGGACTGATATCCCTAATTATA
-GACAGGTATCAAAATTGTGTTCAATTTTACTTTAATTCGCTCTTTTTTCA
-GCTGATAAATAAATTGTTCAGCGAAGAAGTTTTGCACAAAATTCGAAATG
-AGCATCGAAAAATACAAATTCACAGTTTCAAGACTTGTAAAAATTGAAGA
-AAAAGATCAATATTCATTAACAATCAAGTAGATCCTGAACTTCCGCTAAA
-ACAGCCTCGTCGATGCACTTGCTCGTTTCTTATAAATGCACTGGAGATAA
-ACAAGAACAAGGTGAAACACTTATTCGTGTAAGTTGAAATCAATTGTTCA
-AAACCTGGTTTTTTTGCTCGCCGCTTCCTCTGTTAACTACCAAAAAATTC
-AATTTTATTTTGATGTTGATAGAATTTTGACCGGTAAGGGAAATATTTCA
-ACTTAAACCCGGACTTTCGAATGACCACTCTAAAAAAGAGCTAGCGGCAG
-AGGATCAATTTGAGCTAGGGAAAAGTCGATCTGAGAAGTGTTTCAGACAA
-TTTTTCATCAAAATAGGTGGTTCAGAACTTGCCTTTAAAAAGTGTTTTCT
-GAGTCTGTTGAAGTTTTTTATGCTTTTTTGTGATCGTGGAAACAATATGA
-GAAGTGGTGAAAATTTCAATCAATTAAACCAATTTTTAATGTTTTGTACT
-CAGCTGTAACATTATTTTCAGATTTTTAAAAAATACGGTAAATGTGAAAG
-TCTACAAGCTTTATGTCGAACCGATTAAGAAAAACGAAATTTCGTGCGGA
-GTGGATGCTCGAATTATACTCAATGATCTCATACACGATTGCTTGATTGG
-AGTAGATTGTAAGTCAATTTTTGACATGAGCGCCTGTTTTTCAGAATTCT
-GAGTAAAATATATGGCTTTTGAACTACTGATTTGACATTCATGATTTTTA
-GATGGACTCGTTGAAGAATATAAAAATGATTTTTGCTGTGGTTGTCAAAT
-ATGTCGAGACATTCATAGAAATAAAAACTGTATAGTTCATAGTATTCAAC
-TTCAATATTTTGGTGGAAATTCGATACCGCAGCAGTTTTTGAATTTGATG
-TTGGAAAATTTTGGAGTTGATGAGCATGATCGATTTATGGACAGATTAAA
-CGAACTATTCGGGAAATTCGCATATCTTCGATTGAGCAATTTTGGAATTG
-ATGAGTTGCGAATATCGGGAGAAGAGCTATTTGGAGAATTAAAAATAATA
-GAAATCATAAATCAAATCAGGATATCTCCACATCATTACAAAGCGCTGGA
-AATGAAAGACTGGTGAGTGTAAATTGATACATTTGTAATGAACACCGTCG
-AACAGATGTTTGAATCACTGCTTTAGTTTTTCTATTATAACAGTACACGT
-ATTGTAACAGGTTCTCAAAAGAGTGAATTCTCGTGTTTTTCATACTTAGA
-TAGTCTCTCCATTCCTTCACTTAAAGTTATCCCAAAAACAAACAGCCCAC
-TGCGATCAATGTCATGGAAACTTTATTCTCGTTTTTTTCGTTCTTCTGAG
-AGGAAATCGGAAAATCGAATAATTGGATATTGAAAAACGGAAAATTTCGG
-TGTTTCAATTTTCCGGAAAACCAAAAATCGGATTGTTTAGAAAATTAACA
-AAAAAATCAAATTTTGTTTTTGTTGATGAAAAACTCAGACACTCTTGACA
-TGATATGCTCAGGAACATTATAAAGATTACATTTTACAGGTTGTTTTATC
-GGACCATATACGAAAAGCAACTAGGGCGGTACGTAGTTGGTGCTCGAGCA
-AATTATTTCCTCAATTCATTGGTAACATGCCACACATTCACCGTTTTAAT
-ACTGGGAAAAGAGTTCCTTTCAATCCCAAGAGACTTTTTATACCAGCTTA
-TTTCAAAGTGGAATGTTAAGGATTTCAGACTGGAGTTCCGGTTCGAAGCT
-TACAGTGGTCATTTTAATACTATGTTTAGTTCAAATATGGATTTCATTTT
-GGAAACGTCTAAAGACTTTTCAAATGCCGTATTCAATGTACCATTCAACA
-CCCAACCCGTTTCGAGGGTTCTTCTGGAAAAAGTGGAGATCGATTTACAA
-TACTCTGAGGATATGTTACTCGAAATGAACGAACAACTGGAAAACGACTA
-TTATTCACCAATGGACAATGTGATTGCAAATGTTCAACGAAACTTCCCAG
-CCAAGAGTATGACTGTTCTACTTCCTAAAACGTATCTCCTCATTACTCCG
-GACAATATGGACAGAGTCACAGCAAAGCTAATCCGATTGACTGAACAAAA
-CAGCCAGAGAAATGGAAGTGTCACATTCAACTTATACTATCAGCATGACA
-AAGGAGAAAAACATATTCCAGAGGATATCCCAGACATTTTCAATTCAAGA
-GCACGTCTTGTAGGTGAAAAACCAGTAGATTGTTGGTATCTCGATGATAT
-TTTAAATATCCCCAAAGAAAATTTCAAGGATGGATTTGGAGAAGTGACTG
-TCTGGTATGGAAAAAGCTTTCAAATAAGAAATTCCACAGAAAATCGAAGA
-ATGAATTTTAATATATTCTATACCAAAAGCTATCTGAAAAAGTTCTTCAA
-TGAGAGACATAGTAGATGGGTGAAAACTGGATTTTTATTGCATTTCATGG
-ATCTTATTAATTGATTTTATGTGTATTTCTGTTACTACTAATAAAGCAAA
-TACTCTGTCCGTCCAAACCATGTAGCCTGTAGACCTCGGACAAGAGTTGG
-GCGCTGCCTAAAAAATGAAAAAAGTCGTCAACTACCTCGTCGTCTCGAGG
-CGTCGCCGAAGTCTTACCTGCTGAGCCATGATGGTCGCGCGGAAAGATGC
-ACACTAGTAATAACATATCGTACTCATATTCTGATAGTTTTTTTTGGGGA
-AGTGTCAGACGTATCTGATTGATACGGTATTCTCACATACCTTATTTCAT
-TCGTTTTCAAGTGTGCTCACTAAGGATTCTAATAGTAAGTTCAGAATTTA
-CAGAATTACTGTAATTCAAGTTTGTTTCATGTCTTTCAATAACAGACAAT
-TTTATAAAATTTTGCATTTCAAAGGAACAGTTCAGTCTTAGAAAAATTCA
-AAATTTGATCCATGGGATTGACTGACTATTGTTTGTATACCAGCCGTTCG
-CACAATGCGAGTGCTCCGACTGGCGTACTCGAAATTAAGATGAAATTCTA
-AAATTTCTAAGCCTTGGAACGTTTTTCTCAGTCTTCCAGAAGTTTTTAAA
-GCAACATGAATATTATATAACTAAGTTTTCAAAAGTTACAGATGTTTTCG
-GCCGAAATTAGACTATTTTGCAATATTTTGCGACTTTTTGCTGAAAAATG
-GTACCCATCAGAGATGTGCGGCATGTGCCGAACGGCATGTGCCGATGTGC
-CGAAAATTATTCCACTCGGCACATCGGCATGTGCCGACCTTTTTTGTCGG
-CACATTTCGGCACATTTCGGCATATTCGGCACTGTCTGGAATATGTACCA
-AAATTTATTTTTTAATTTTAAAAATGCAAAGAAACTTCAAAAAATTGATT
-AAAATTTTCGGAATTTATCATTTCAACTTATAGTTTACTAACTTCAATAT
-TAAGACAAATGCACTGCATTTTTTATGGGGTTATCCAACTGAATGTTCCC
-GCTTTTTCCTCCTGTTTCCCCCCTCTAGTCGCGATCCAACTGGGAGGAAA
-AATGCATTTTCCCCTCGTTTTCGCATTTTTTAGCTGCGAAATTTCAGAAC
-TGAGCTTAGGGTGGGCATTTATAGACTTTTTTTAATTTTTTTTGACCAGA
-AAAAGTTAAATTTTTATAGTTATTTTACCAATTGGACCTTAAATTTGAGC
-TATGATATCTTTGTGGTAAGCCAGAGTCATGGTGAGTGATCAACTACAGA
-GTTGTAGCAAATTTTCTGTTTAAAATTTTGTTAGTTGATCAATTCTTGGT
-ATCATAGATTTTCACAGACTAACATAGCTGTGAAACTGGACAATTTCTTA
-ATGTAAATTGCGTACACGAGATTTCTCTATTTTCCGCGTGGAGTACTAAT
-ACCAAAAATTGATCAACTAACAAAATTTTAAACAGAAACCTTGCTACAAC
-TCTGTAGTTGATCACTTACCATGACTGTGGCTCACCACAAAGATATCATA
-GCTCAAAGTTAAGGTCCAATTCATTTTAAAAAAAACTATAAAAATTTAAC
-TATTTCTGGTCAAAGAAAGCTGGAACCGCATTAAAAATTATGTTATTTTA
-GTATTTCAACAAATGTCTAACTGTGAAAATTAAAAGTAAGTTTGAAAAAA
-TTTCTTTAAAACATTTTTTGATAATTTTTTCATGTCCTGTGCAGATTTCA
-AATTTTGAAACAATACTTTTAATTCTCATATATCTCCGTTGAAAAATTTT
-TTATGACAAAGTGATCAATTACAAAGTTGTACTTTGGATTAAGAAAAAAA
-AACTTTGTAGTTGATCACTTTGTCATATAAATTTTTTCCACGGAGATATA
-CGCATCCGAAGTGAATGAGTTTTCACTATCAATTCTACTAAACCCTATGT
-TTTTGTCTGAAATCGTGTTCAGAACATCCAAACTGAAAAAAACAACAAAC
-ATTGCAAGTAATTTTTTGTTATTTATTTAAATTGATGAACTTTTTGTTTT
-TTTTAAGAAGCTATATAGTATCTTTGCAAATGTGCCGAATGTGCCGATTT
-TTTTAGGTTCGGCATGTACCGAGTGCCGAGAAAAAATTAATTCGGCACAT
-CGGCATGTGCCGATGTGCCGAAATTTCAACAAGTGCCGCACATCTCTGGT
-ACCCATCGTCTCGTCACGACAAATTTTTGTTAAATTCGAGTATGTGTGCG
-CCTTTAAAGAGTACTGTAATTTGAAACTTTCGTTCCTATGGAATTTTCTT
-TGACTTTTCACTTTTTCCTCTGGTTTTTATCCAATATTCATAGAAAAAAA
-GAGAAAATTTTTCTAAAAATCGAAAGTTTGAAGTTACAGTACTCCTTAAA
-GGCGCATAACGTTTCGGAATAAACAAAAATTTGTCGTGGCGAGACCTGAG
-TATTATTACAGGAACGCAAAATTCGGAGAATGCGTTTTACACAACATATT
-TGACGCGCAAAATATCTCGTAGCGAAAACTACAGTCATTTTTTAAATGAC
-TACTGTAGCACTGGTGTCGATTTACGGGCTAGATTTTTATTAATTTCTGA
-AAATTGAGCACCCGTAAATCGACACTACTGTAGTTATTTGAACAGGATTA
-CTGTAGTTTTTCGCTACGAGATAATTTGCGCGTCAGATATTTTGTGCAAT
-ACGCATTATAAGGGACAAGTTCTCCAGTGAATTCTTCCAATTACATTGAA
-ATCCTTCTATTTTGAATACAAATTACTCAAAAGACAAAGTGTCGATTTAG
-CCTAAACATTGCGCATGCGTAATTTCTGAATCTTGTTCGTTCTTTACATC
-TGCACACTTGGGTAAGAAGTTGGGCAGCCTATGTTTTAGAGGGAAGTCAA
-CAATGTTATTTTCGCACTTGTGGCAACAGAGTTGAAACTACGGTACTGTA
-TATGGGTACACCTTTTAAAATTTTAAACAAAAATTTGTCTTGTTGAGACC
-GGAGCACATAGATATTCTCAGTGTGTATTTGTCTAAAAACCTGCCAATAT
-TTGAAAATCTTTCAAAACTTCAATATTTTGCTCCAAAAATTAAATTTTTC
-AAATAATCTACAAAAAGAATCCAATTTGACTGAAAACCTGCTAATATTTA
-AAAATCTTTCAAATGTATAATTTTTTTGCTCCAAAAACTGATTTTTTTCA
-AATAATCACAATTTCAATTTTAATTTCGATAAAGATACACAAAAAAAAAG
-AATAGCATTTAAGGATTTCCTTGTTAAGCTTCAACAGCGTAAGGGAAGGC
-CTCGTTGGCAATCATCATGCGTGTAAGTTCGGCGGCGCTGAAAATAAATT
-TTTGATGTTTAGCTTGCATGGTATGTATTACTGATCCCTCAACTCCGCCA
-TGGTCCGACCCTGACGAAGTGGTATCTCTCCAGCATGGTGAACTCTGACG
-TGATTCCAGTGCACAAGCCTTGTTGCAGTATACGACAGCCCACAGATACC
-GCAGTAATACGGATAGGGAAGGGTATGCAGATGGTAGACGTGGCGAGCCC
-TGAATGTTGAAACTGACTTTTTGAAATGACTGGAAAAATAATTACAAGTC
-AACTTGCTGTCCGAAATTCATCATTACAAATGGAGCATTGGAATTGTTGA
-GCATCAGGAGATTCCGAATTCCGATGGGTATCTTGAGGCTCTTCCATTTC
-CTGAAAATTGTAATTTTAGACTTTTTAGATAATATTCACAAAATCTGTTT
-AGGAAAAATTAACTACTAAAGTTACAGTAAGAATTTTGCTCTGAATTTGC
-TCATAAAGGAAATTTTTTTAAGCTTGCACCCTGATTTGTTTAAATTCTTC
-AATCTTTGGATTCCTCGCAAAAAATTCAATTCAGTCTCCTGGGCGTCGAA
-TTGCGATGGAGCGCGCTTGCCGTGCGTTGGCGCAGCCACGGTGGTTCAGT
-TGTAAGATGGGTGCAAACGCGCTCCACAGAGTTTTCGATCCCCAGGAGAC
-TGTGTCCAAGTAAACTGAGTGGTAGCTTTTTTGTTCAAAAAATGTGCCCC
-GCCCATTGGAAAAGCATGACCTTGTAATCGAAAATCCTTCAAATACGATT
-TCTATTCAAATTTACGAAACTGAAAAAAAATTAATTTTACGAACACTTTG
-ACGTCCATTCGGTGAGATTCTTTCAGGTGTGAATCGTTTTCTCTTGTTAC
-GAGCATCATTTGGCTCCGGCACCGCCATCTGACCGGCCTAAAATAAGAAT
-GTTTAAAAAAATATGCATTTAGGAAGTTTAATATTCAAAACAGAAGAGAC
-ACATTCCATATGAAAACAACTTACATTCTGAACGTTTCCAACGTCCGCCG
-ATTCCTTTACACCGTATCGATCGATTAAAAAATCGATCAGCTGACCGTTG
-AGCAGTACATCCTGGAGCGAGATGGTGATCGGAGCCACCGGTGGTGCAGT
-CTCATCGTCTGAAGATCCAGATCCGAAGGCATAGCTGTCCGAGTGGATGG
-TGTTGGAGTGGTCGAATTTCTGAAAATTGACCAATTTTTGATTTTTTAGA
-CTTGAAAAGGCCTAAAAAGGACAAAACGAGCCCCAAAAATTTGAACAAAA
-GGGTTGAAATTTCATATTTTGTTAATTTTTCTGTGTCACAATTTTGATTT
-TCAATCTATCGATATTTTGAATAAATTTCAATTTTTTCGGGAAAATATTG
-CAAAATTTAGTCATTTTTCCTCAAAATAAACCAAAATTTGATTTTAAAAG
-TTTGGAGAATGAATTGTTGAACTTGGAAACACCAAAATTAGCTCTAAAAT
-TTCGAAAAAATGGGTAATTTCAACTTTCCGTATCTTTTCAGTTTGTCGGA
-ATTTTTAAAAAATTTTATTACAGAAAACCACCAATAATTAAAATCTTGAC
-TTTTTTTTTAACCCTAAAAGATTTTTTTCGAGAAAATATCTTAAAATTTA
-GTCATTTTTCTTCTTTTTAGGAGCTATTTTTATGTTTTTTACTTTTTGTT
-CCGTCAAAAACAATTTTAATTGTAAAGGTTTTTTTACGATTTTTCCAGAA
-AAACCGGTAAATGACACTATTACGGGAACAAAAAATTTGGAAAATGCGTA
-CTGCACAACATATCTGACGCACAAAATATCTTGTAGCGAAAACTACAGTA
-ATCCTTTTCAAATGGCTACTGTAGTGTCGAATTACGGGGCTCGATGTTCA
-GAAATTAATTTTTTAATCGAGCCCCGTAAATCGACACTACAGTAGCCATT
-TGAAAAGTATTACTGTAGTTTTCGCTACGAGACCCTATTTTGCGCGTCGA
-ATATGTTGTACAGTACGCATTTTCAGAATTTTGTGTTCCTGTAATAATAC
-TAAGATCTCGCCACGACAAAGCGAAAAATTTTTATCGATTTTTCAGCAAT
-TTTTCTCTTGTTTTCATAAAAATTGGGCAAAAACCGGAGGAAAAAAGTGA
-CGAATTAATAAAAATTCCATGGCAACGAAAGTTTGAAGCTACAGTACTCT
-TTAAAGAAGTGCACCTTTTTGGATTAACAAAATTTTGTCGTGACGAGACC
-CTGGATACCATTTTTCCGGCGGAAAAGTCGCAAAATTAGCGATTTTGGGA
-ATTTTTCGCGGCGAGACAACTGCACAACTCGACATGCGAGTTTATCCTTG
-CAGATGGCCAAAAGCCCTCCGTCGATCATTTGACGAAGCAATTCCCTGGT
-GTTGCGAGCTCGACGAGCTTCTGAACGATGAAATTGCCATTTCGACTGTG
-GCAGAGCCCCACGAAGAGCGTCGTGGATTTGGTGAGCTTCTCGAACACGG
-CTTTACGAATCTGATCTTCGGAATTTAGTGGATAGTTGGCCTCCAAGAAC
-CTTACCCCCGATGGATAGATTGCGAAATCGATGAGCTGCCCGTTGAGCAG
-CACATCTTCGAGCGAAATGAAAATCGGAGCCACTGGTGGTGGGGTCTCAT
-CGTCGGATGATCCCGATCCACTGTTGAGGATAAAGCTGTCCGAGTCGGAG
-GAGGTGGTGTTGCTTCCGTGGCGGTAGGGGAGAAGCTTGACCGGCGGCTT
-TGGATTCTGGAAATTCGAATTTTAAACTTTTATTATATTTTTATTTAAAT
-TAGAAATTTTTATGCAATATTTTACCTTGTTCTTGTGAGTTTTTTTCGAC
-AAAAGCGAGAAATCCGGGTCGAAATCGAACGACGCGCCGAGCATGTTGTA
-CGAATCCGTGCTTTTACGATTCGGAGTCATTTAGACAGAAAAATGAATGA
-ATATAGGTTAGTAGACGCTGAAAAATTGGGAATTTTGGATTTTTTAACGG
-AAAAACGAGTGAAAATGAGAGAAAAACATGTAAATTTCAACGAAAATCGC
-GAAATTACCGCGCATCGAAATTCAAAATTGAATTTTTCGCGGTGGCCCGG
-GTTACGGTGATTTTTAAAGGCGCATGGTTGTTTTGAGTGAGGTATTGACG
-CGAAATTTAAAATTATTGAATATTTTTTTCTTATTTTTACATTTTTGAAG
-AAAAAAATGATTAAAATTCGATTTTTTAGGGAAAATTAAACATTTTCACA
-AAAATTGCAGGAAATCACTCGCCAAAATTCAAAAATGAAGAGTTTCGTGG
-TGCGCCGGGTTACGGTGGATTTTAAAGGCGCATGGCTGTTTTGTATTAGG
-TCTCACCACGAAACTTGGAGTTTTTGATAGTTTACTTCCTATTAGGGATT
-TATTTTTTTAATTTTCGCTCGATTTTCACACATTTTCACTCATATTCACT
-CAATTTTTTGCAGAAAAAATGTCAATGGACATTGTTATGAAGTCAGATGA
-GCAGCCGTTCATCTCTGCGCCTGTATGCTTTAAGTAAGCTCCAATTTTTG
-TTATTCTGGCCTAAAATTATTTTTTTGATTTCCAGAACGTTCGCATTTTT
-CGCCAAAGCATCCGCAGAGGAATGCAAACTTCTAGCTTCGGGCTCCAACG
-CTCGAGAAAGTTTCCAGCAGGCCACGGGGCTATCGGAGAAGATCACGGAA
-GACATTTACCGCCAAATTGAGTAGGTTTTTCGATTTTTTTACCCTTAAAA
-ACTACTATTTTTCTATTTTCCAGCGTCTCCCACATTTCATCGATGGTCTT
-CAACAGAGAAATGGACGGTGGCATCGAGAGAAATCGGCTCGGCTCGCAAG
-CGATTCTGCTCGACGAGAACTCCAGGCGCCGCAATCCACAGTTCAAATCG
-ATCGCGCTCCGCTCTCTCCGCTACGATCACATCGATCATAGAGCGTTGGC
-AAGGAAATCGCCTCATCTGATGCCTCCGACTTATATCAAAGAGGAAATTA
-TGGATGATGAGCTCGACGAGGTGAAGGAAGAAGTGGTTTCCGTTGGAGAA
-GCCGCCTTGCCCACGCCAAAAGTTGAACTGAACATGGACCATCCGGAAAA
-GGACCTGATCATCAGCATTTCCGTGTATCTCGGCTACACCCGTACCCTTC
-AATACCACGAGATTCGTCTCGGACGTTTGATGAAGGTCACGGATCGGCTC
-GAGCTCACCGGAGATCACACGCTTCGCGATCTGAAAAACGCGTTCTCGTG
-CCCCATCGATTTCTCGTTTTCCGACGATTTTAGCGAGAAAAAGCCGTCGT
-TCAAGGATATGGCGAAAAATAAGTGGCCGTCGTCGATGTTCTTCATTCAT
-GACACGTTTTATATCGACTCGAACACTGGCGACAAGTTTGTGGATCCGTC
-GATGTGAGCAAGGGTGCCGGCTAAAAGTTTTTCAGTGTTTTTTGAGCGAA
-AAGGAACAATTTTTTTCTGAAAATTATTGATTTTTCGTTAGTCTTCAGAA
-AAAATGATTTTTTACGCCGCAAAATCGGGAAAAAACAAAAGAAAACTGAA
-AATTAAGACATTTTCGTTGATAAAAACGAATTTTTTGGTTTTTTTTTTCA
-GAAATATATTATTTTTTGCTTTATTTCAACAAAAAAAACCCAAATTTTCA
-GCACAATCCGAAGTTGGGCCAAAAAGTTCGACTACATCGGTCCGATGCAC
-GTGAAACAGATGTCGGAGACGAGGATCGGGGATCTCATTTGTCGGCTCGG
-TCAGCCATACGTCTACATTCATCAAGGCGTCTGCGAGCACCTCATCGTCT
-TCAATGACTTGTGCCTGAGGTACGGAAATTCTGGAAAAATCGAAAATTTT
-GATTTAAAAAAACTCAAATATTTATGTGTTCTTTTTTTTACTAAAAATTT
-TTTTCAAATTGTTTATGAAAAAAACACTAAAAAATAAGTTTTTATCAATT
-ATTTAAACAAAATTTATATTTTCCGATTATCAAAATTGTTTTTTTTTTTC
-AAATAAAATACCCCGAAAAATATATATTTTTTAATTTTTTTTTTCTATTT
-TTTGCAGAGATGAATCCCACACAAACGTCGAATTTCCACGCCGCCTCGTC
-GAACGGAATTTCAGAAGAATTGCATGTGACACGTGCAAGGAGGCGTCGGC
-GCAGTGAGTAGTAGCATTTAGAAATTCGGAATTTTTTGTGAAACCCCCGA
-AAAATATAGTTTTTATCGGAGTTCGAATTTTCGAAAAAAAAATCCAAAGA
-GAATCGATTAAGGCAAAAATCATCAATTGAATCCAATTTTTTCAGCTGGA
-TGATCGTCGACCACGACAATCTGCTTCCCAACTCGCCAGGCTATCTGTGC
-TCTTCGTGCTACAAGGAGTTCTGTTTCGACGTGAACGGCAAAAAAGTGTG
-CCAGTTTAAGGCCGTACCGTATTGCGATCGAAAGGACATTGGCGACGGAC
-GCCAGTTCTTCACCGAGCTCGATCTTTAGAGAACGAGATTTAAAAGTCTG
-TATCATTTTTTGTTGTTTTTTTTTAAATGTTTTTCGATTTGATTGTTTAA
-TTACCGATTTTTGGCCTGTAACTATATTTGTTGAAATTTCAAATTTCTTT
-TTTTTTAAATAAAATTTTTGTTTGCAAAAAAATTTATCCAATAAATAAAC
-GGAATATATCGATGATATGGCAAGTAGGGGGAAACGGACGGGAAAATGAT
-TATTTACAGAAAGGGCGCGCACCAGAGGTTTCTCGGGGGAGCCCCGAGGC
-GGGTGGCGGAGCTTGGCTCAAAATCTGTCGGAAAAATGGGTTAAATGAGA
-GAAGAGGTAACCTAGAAAATGAGATGAGAAATTCGGAAGAATTTTGAACA
-ATTTGAAAAATCGATAATGTTGAATTTTAAAATTAAATTTTATTGATTTT
-TTGAAAATCGATTATATTGTTGATTATTGATTAAAAATCACTAGAATCAA
-TAAATCTGATTTGGAAAAATCAAAAAAATCGATTTTTTATAATCATAAAA
-ATCAATTTTTAAAATCCAAAAAAATCGATATTTAAGAAATTGAAAAAAAA
-TCGATAAATCAATACATAGGTGAGCTCGTCTCGTCGATTTGTGTTTTTGT
-GATTGGTCCCGGCTGCTTTTGAGATGGTCTAGGCGTTGTTCCGTATGACA
-TTCTGGAAATTTTTTTGTGAGGCAATGACACGCCCACAAAATGGACGGTG
-GCAGAAATTTAATAATTTTAAATAATTTTCTGGATAAAAAAATCGATTTT
-TCCACTTTTTCGAGTGAATCGAAAATTTAAAAAAAACATTCAAAATTGTT
-CAGGGTCTCGCCACGAAAAACTCACAAATGCACGTTATGCGGAGCGTCGT
-CGGATTCCGGTGTGTTGCTACGGATCGTGTCGTCCATGCTCAGCTTCATC
-GTCGATTGACGTCGCCGTTTTGTGGTGATCTGAGCGAGATTTATTGATTT
-TTAAAGACGCATGGCCTAGAAAACACAACACTTCGGCCACGGACTTTGGC
-GGCCGAGTTTTCTAGGCCATGCTGCGGCATTTAAAGGCACATACCATGAT
-AATGAAGATCGCCAATCCGAAAATGATGACCAATGCGAAAGTGATGATTA
-CAATCATCAGCGATGATAAGGAATATGATGAAGTTTGCGTGGAAATAGAA
-TCGATGTACGCTTGTGACGTCATTCCTGGAAATTATTGATTTTTTTGGAA
-AAAATCAATAATTACTTACCGTCAACAGTAACACTCAACGAATCAATCTT
-GTAATCCGAAATCATAGAGTTATTGCGTGAAAATGCGGCTTCGAACCTGA
-AATGTTAAAAAAATCAATTATCGATTTTTTTGAAAGTTTTTGAAAGTTTT
-TGAAAAATTGATACAATTAACTTGATATTCCCCCGGAAAACCTATAAATC
-AATGAAAAAGTTAATATCTAAATTTTTTCCAAAAATTGAACTAAAGTCGA
-TTATCGATTATCGATTTTACTAATCATTTTTCAAAAATCTATCATATAGA
-CGATTCCTACGGAAACCCCGAACAAATCAAAAATCGATAAAATTGACTAT
-CGATATTTTTTTCTAAATTTTACTTTTTTCGATAAAAGTCGATAGCGTTG
-ATAATCGATTTTTTAGAGTTTTCCTCAAAAAATGGTAATAAAATATTTCT
-AATCGGTAAGAACTCACAAATTAACAGCCATTTGAGCATCACCAAGTGAT
-TTTTTGGTGAGCACGTCGGCTCCGACAACCACTGATCCTTTGGTCAGTGA
-CTTGATTTCAACATTCACAAAATTGTCGTCTCCCGAAATGGAATTGATGA
-ATTCTCCGATCTGGAAAAAAATCAATAATTGTTTAAAATTGATTTTTTTC
-AGATCATTTTTAAAATAACTAGTCTAAATCTATATTGAAGTCTAACTCAA
-AATTTTCCACAAAGGCTTACTATTAGGCTTAGGCTTAGGCTTAGGCTTAA
-GCTCAGGCTTAGGCTTAGGCCACGCGAGATGAAAACAAAAGAGAAAATTT
-AGTGAAAACAAGAAAAATTTCTTTTAAAAAAAAGAAAAAAAAAAAAAAAA
-AAGAGCAACAGCCATGCAATTCTTAAATATAACAGGTTCAACTACTATCT
-TCAAAAATCAGTTTAATATCGATTTTTCCCAAATGTCAATAATCCATTAT
-CCATTTTTGACTCACCGCTGGCACCAAATCTTTCGCTAATCTCTTCGCAG
-GGCCACTCTGAATATCGTTGAATTCCTCTACAAATTCCAGTGAAATAATA
-CGAAAAACTATTGGTGTTCGAATGGATTTAGCCGGAAGGAATACTTTCGA
-TGAGTTTTGAAGTGCCACCGGCACAGTTGAAATATCTTCAAAAGTCGTGG
-ATTCCTCTGATGAGGTGGAGGTGGTCTCTTCGGAGGAGGTAGTGACGTCA
-GTGGAGAGGGTTGATGGCTCGGTTTCGGCCATGGTTGTGTCCATTGTGGT
-TTCCATAGTTTTTGTAGTTTCCATTGTTGAAGAGGATTTCATTCTGAAAA
-TTTTGAAGTTTTGAATTTTTTCCTGCAATATATGAACACTTCCGAACCAG
-CAAAACTCACTAGGTAGTGTTTTAACTATACGGTGCGATCGAGTAAAAGT
-GTCATGCGATAGCTGGCATCTTAGGCTTTCAGAATCTGTAATTTGTTCCG
-GCGGAAGACCTCTGTGAGTCTGGAAATTTTCATCTGAAAATTTAGTACTG
-AAATCTGCATTTCCTATGGTTAACAGTGGATTTTTGTCTCTGGCGCCAAC
-AGAAGTCTCACCACAATGGTGGAAGGGCGAAAACATCGCTTCGAAGCTGT
-TAACCATAGGAAATGCACTGATTTCAGTACTAAATTTTCAGATGAAAATT
-TCCAGACTCACAGAGGTCTTCCGCCGGAACAAATTACAGATTCTGAAAGC
-CTAAGATGCCAGCTATCGCATGACACGTTTACTTTTACTCGATCGCACCG
-TATAGTTAAAACACTCCCTAGTCAGATATGTGCTCTACACTTTTAAATTT
-TGCAATCAAAATACTTGAATATAAAATTAAGAGATTTTTGAATTTACTAG
-GCCACCTCGAAAATTTCTAGGCCACGGCAGGTTGGTAGGGTGAAGCTGCA
-GACCCCATAAAGCTGTGAGAACGGTTTTTTTGCAAATTTTTTAAAACAAA
-CATTTGTGAAGAATCTGAATATTATCAGAACAAAAAATAATTTCGACAAA
-AAATAATAAATTTTTTTATCAATATTCAAAATTTTTAACTTCCGAAAAAA
-CTCAAAAAAAAACTCACCCAGTCGTAGTGCTCTCGACCATCTGCTTCGTA
-GTTTTCGGGATATTCGACAAAATCTTTGGCTCTTCCTCAGACATTTTCAG
-AATTGGGAATGCGGGGCTCTGATCTGTGCTCAATGAGCTATCAATAACAC
-TTCCATCCTGCTCAAAAAGTCCTTCCAGTGCACTTTGATCAAATGGTGTT
-TCTCCGTCATCTCCAGCTTCTGATGGGTCACTTACTGCGACGGTGGATTG
-GGTTGTGGTCACTGTAAAATTGGAAATTTGGAAGAGAAAAACCTCGGCCA
-TTGGTGACGTCATACTTTTCGCCACTTCTTCGACCAGCTATAATGCCACG
-CTTTTAGCAAGTTTTATTTTTGGTAAACCAAAGAGCAACCAATTTTAAAA
-CTGTGTCTCCAGGTTTACCGCCAACTTAAGGGCGTGTCCGTACAGGGTTT
-GCCCGTTTTATGGGCGTCGCTTAATAAATCATTTTTCAAGTTTTCAGTTT
-CGTGGAAAATTAGCATCCGGGAAATTGAGTCATAAGTATGACGTCAGCAG
-CCGCGCGGCTTCCCATGACGTCACTCCATGCGCTCCCCCGACGTCCCTCT
-AAGACGTCACCACCTCTCACCTGGTTTAGTGGGTCGTGTCATCTCCTTCT
-CTTTCAAAACTCGTCTATCAGCGACCTCGTCAACCTCAATCGGAAGGGAG
-CTGAACGTAATCACCTCCAAGGGAGTGGTTGGCATCATTTCAGTCGTATT
-TTCAGCGGCGAGAGTTGTTTTCTCAGTGGATTCATCCTGATCCTCCATAC
-TATCATCTTCGATTGTTGCCTGGGAGAAGTTGAACATACCGCCGTCAAGC
-GGAGTTATTGGGGAGAAGACGGACGTTTTCTGGATTGGGTTCACTTCTAG
-GGAGGTGTCGTTCGGCGAGAGTTCGATCATTTCTGTACTTGTCTCGAAGG
-TATCTGATCTGAAAGTTATGACATTTTTTTGGTGGTGGCCTGGGAGAAAA
-CTAGGCCTCCTGGCCTAGAAATCTCAAACCTCGGCCTCCAGCTCTCACTA
-GCTGACCTAGGTTTACTAAACATCGGCAAGACCTCTTTTCGACTACTCCC
-TTACAAATTTTTAACAGTTTTTCATCACACAATTTTCCGATTCTTACCCC
-TCATTCATCATTTCTTCTTTCGGAACAGCCATCATCGGCATATCATCATT
-ATCAGGCATTACGGGTGTCGTTGTGTCTTTTGCCAGCGGTTTGTCGAACA
-CATCTTCAGAATTTTCGTCTTGCGCGAAGGAAACTGAAAAAGTTAAATTA
-CATTTTTTCTAGGCCACCAGGTTTTGCATTTTGGCCTAGAAAATGAAATG
-AGAAGCTAGACCATGTGGGTTTATTGCGAGGAAAAGCTATCCCACGAAAA
-CTTTTATAAGCGTCTAGAAAAGTAGAAACCTCGGCCACCAAGTTTTGCAC
-TGTGACCTAAACAATTTTGGTAAAATAGGCCAGCAAAATTTCCATGATGG
-CCTCAGGAAAACTAGGCCATTAAGGTTTCTTCCGTTACCTAGAAATTTTG
-TAAACCTAGGTCACCAGGGTTTCTAGGCCACACAAGAAAAGCTAAAAACC
-AACATTTCAGATCGGTCTGGAAAAGTGCAAAATTAAGCCACCAGGATTTG
-CATGGTGGTAAAAAATTGGTAAACGTGAACTAGAAGTTTATCGGTCATCA
-ACTTACGTGTCGTTGAAAATGCAATGAATAGAATAAAACCAAATGGTATG
-CGCATCGCTGAAAAATTGCAAAAATTAATTTATGTTTTGGAAAATCAGAA
-ATCGGAGTGTTCATTTTTTATGGGACAAGATAAAAAGAGATGGAGAAAAT
-TTATATGATATATCAGGTCAAAATGACCTTCGGAAATTGGGAATGAAAAA
-TCAAAATTAATTCGCGTGGAACTGGTTAAGATGATCGAAGATTGAAAAAT
-TTGACAGAAATTGCAACAATACTAATGCAAAAAGTTGGTAAAATATTTTT
-TTCAGTTTTCAGAAAAATCGATAGCAAAAGTCTTTTTTTTTAAATAAAAA
-TTTCTGAAATATTTTCGCTGCGAGACCTAAGGTGACAAATTGGATTAAAA
-ATTTTATGTGCCCATTAAGAGTTTTTCTGGAAACTGAAGAGAAAGTCGAA
-AAATTAATATACCCTACTTAAATTTAAAGGCGCACGGATGAATTTCCAGA
-AAACTAAAAAAAAACATCACAAAATTTGATACTCCAAGTTTAAAGATGCA
-TGGGTAATCTTTGAATGAGAATTTTGTTTTAAATTTTTGAACTGCCATTT
-CAGATATTATGAGAACACAAAATTCTAATAATGCGTATTGCGCAACATAT
-TTTGCGCTCAAAATATCTCGTAGCGAAAACTACAGTAATTCTTTAAATAA
-CTACTGTAACGCTTGTGTCGATTTACGCGCATCAAAATGAATTAAGATCA
-TACATTTACCGACAAAATATTAAAATTAGGCAAAAAATAATACGAATAAT
-GCATTTCGTAAATCGAGCACGTAAATCGACACAAGCGCTACAGTAGTCAT
-CAAGAAAAATTACTGTACTTCTCGTTACGAGATATTTTGCGCATAAAATA
-TGCTGCGCATTACGCATTCTCAGAATTTTGTGCGCCCGTAATAACCATTT
-GTTAAATGCTTAAAAAATTCAGATTTTATTGAAAAAAATTTTTGAGCAAA
-ATTTTTCGAAAAATAAATTTCGGCAATAAAATATTATTTTTCCATCGAAA
-AAGTATCGTATGGTGTGCTTGACATAATCTTGGTAAAAAGTGGCATATTT
-TGAAAACAAAAGGGGTTACCCCCTTCCTTCAGCCCGCCCGCCCGGGAAGC
-CTGGGCATGCGCGCAAGTGATTGTTTTGTCTGTTGTTGCTTATGTATATG
-CTTATTATTTACACATTTGTGTGTGTGTGAGTGACTACACTGCACACCTC
-TTGAAACGGATTATCCGGCCGTGGTCGAGGAGGGCCGCCGAATTATGCAC
-ATTCCTATGCTATGTATTGTGAATACTTCATTTCAATAACTTTATATATA
-TACAGTTAGCACATACGATTTTTGAAAATTGGGGTTGTGGAAGAGTTTTC
-ACACAAGTGGCCTAAAGTTTTTGAGTTTACTTTAATACTTCTAAATCACG
-TGGTGTCAGGCGGTCTCAATACAATTTGATCTACAAAAAATGCCGGCATT
-TTTTCCCAGAAAAATTGTGACGTCCGCACGCTCTCAACCATAAAAAATCA
-GATGAGATCTGCGTCTCAACTCCCGCATTTTTTGAAGATCAAAGCGAAAT
-GGGACTTTCTGACTCCACGTGCTAAATGAAATGTACGTTAAAAAATTATC
-TCTGGAAATTTGGAATTGCTCGGTGGAGCGCGTTTGCCGCTTAGTAGCTG
-AACCGTGATAGCTGCGCCGTGAAGAGAAGGGAAAAGTAAGGAAGTTATCA
-AAACCAACGACGCACTAATGAAAAGGAACACAAGAAAAAGTGAAAGTGTT
-TTTTTTTGGGTTTTTGTGATTTAGTTCGTGTGTGATAAAAGTTCAAATGG
-TTCGGCAGGACAATAGGAAGGAAACTGGAATTTTATATTTCATCTCTTGT
-TAAATTTACTTTTGTAGGTGTATGATTAGGTAGTGTTAATAGAAATCGGG
-ACTCGTGGCCTATCATTTTTTTGTGGCCGAGTAAAAAAATCTTCCACATT
-CGTCAACCATACGTGTGAATTTAAAGGTAATCTATAGGATATGATATTGG
-TAAACTTTCACAGAAATCCTAAAGCTAGGTTTTGAACTATGGAGCTTTGA
-AGTTTCTAGGCCCCTTTGGGAAACATAGGCCACCAACCTGAGAAAGGTAA
-GGGGAGGGCAGGGTACATAAAATACAACTTTTTCTCTGAAGTTTTTTTTA
-ATTAAGCGAAAAAGCCGACATAAATGTTTCAGTCATGGCCTAACTTGACA
-TTGGTGGCCGATTTTTTCGAAAAACTCTTCCACGATTTAGAACATGAACT
-TGGCAAAACTTCAAACAAATCCTAGAGATAGTTTTTGAATTATGAAGCTT
-TGAAACTTCTAGACACGTTGAAAAAGTTAGACCTCTTCCACTGTCATAAA
-CTTATAAATTCACAATTCAAAAATTATAGATTTCTTTCATATGTAGAATT
-AGCCCAATTTTTAAATCCATTGCACGGCTAGATTTGAAATCATAGCAATT
-TGAAAATTCTAGGCCACGCAAAAGAAAATTCTAGTTCATGGGAGTTGAAA
-GAGAGTCTCGGAAGCTAATTTTAAAAGCACAAGATAGAGGAAAACCAAAA
-ATTTATAAATTCATAAAAATCCAGTTTTTTAGCAGCTATGTGAAAAGGAT
-TAGAATTTCAACACGGCCACCACCGCCGGAGATACAATCATTTTGGGAAT
-ATATGTCGTTTTCGCGTATTTCTCACCAAAAAAAGATTCAAATCTTTTAA
-TACGAAAAAAAGTTGGAAAAGAATTAGAAAAATGCTGAGAAATTTTTTTT
-ATGAAAGCTTAGGCTTACAATTAGGCTTAGGCTTAGGCTTAGTTATTTTT
-TCAGTGTTTTCCAAGTGCAGAAAGGAAGAAACCGACGCTTCCTGACTTTC
-TATCACACACTGAGGGGAATTTCACCCAACCCCCCCCCCCCCCTCACTTC
-CCGCTACTACTTTTACTGTACACTTTCACCGAAAAGTTATTGTGTCATCA
-CGTCATTCGCCAAAAACGAATCGAACAAGGAGAAAAAATTGATGAGAAAA
-CGCAAGTGTTTCTTCCTACACTACATAGTGTTCAACACCCCTTCATGATA
-TGGCCGCGTGAAAACTCTTCCACGACCATAAAAGAAATTTACGGAACAAT
-CTAGCAAATTTTCATAAAAATCGGTTGGAAACTATAAAAGTTACAGGGGT
-TTGAATTTTCTAGGTCATGCGGAAAAAAACTCGGCCACGCAGGTTTTTAG
-GGTTAGGGAGGCGGTGTCTTCAAAAAAAAAGAAACCTCGCACCTAATGAT
-CCATGAATCTTCAAACAGAAAATGAGGTATAATCTTAGGTGGCCGAACTT
-TTGTTTCTGAAGAAAACTCGGCCAAGACCACGAAAAACGTATTTTTTTGT
-ATCGTTAATTGAAAAACTGAAAACAAGAAGTTTCTAGGCCATGTTGATAA
-ACCTTCAGTAAAAATTTTTCCTAAGCCATTAAATTACTACTGAACTGAAA
-ACCTAGGCCACGGCTTCAAAACATAGGCCACCAAAAACTGAAAGGGGGTC
-GTAGGACCGGAACCTGCTATTATGAAGCAAAGTTTTGTGCAATAAAAGTT
-TCAGAATTTCCAAGTTTTTAAACTATTTTTTGTCTGGAAATTATAAACCT
-GAAATTTCGGGTGCGAGACAAGATGGTCAAAGAAAAATAACGAGAATTCG
-GAGGGCAAAAAAATGAGAAGAATTTCCAGGAAAACAAGTGAAAGTGAGTA
-TGACTTTGACCTATACGCGTATTGTCTTTTTTGTTTTCTTCTTCTCGAGA
-AAAGAGAAACTGTCACAGCAGTAGTAGTTCTTCGATCACCTAATTACCTT
-ATTGCCCCCTTCCAGGAAGTCACAGTTTTTTTTAGGAAATGTGTGAAAAA
-TACACATTCCGCTAGGAAAAATTGAAATTGCGGTTATTGAGTTCCCTTGC
-CACGACAACGTGGCCTAGGATACCGCCATGCTCTAGAAATCCCGCTTGTA
-GCCTAGAATTTCCCATTGTGGCCTGGAGAAGTTTAGCGGGGCCTAAGACT
-TTTAATTGTGATCTGAGAGTTTTTTCACATGGCCTAAAATGCTATACGTG
-GTCTAAAATTCCTCATTGTTGAAATTTTTAGCGCGGCTTAGGATTTTCTA
-TTATGGCACTGGATTCTCGCCGTGACCTAGAATTTCGTAATGTGGCCTGA
-AAAGTTTAAGCGTGAAAAGTTTAAGTATTTTCAATCATAGCCTGGAGATT
-TTTTACAAGAATTCCTCATTGTGGCCTTGAATTTTCTATTATGGCCTAGA
-ATTTCGCATCGTGGCCTAGAAGAAATTTGCAGAGTGGTTTTGAAATTCGG
-TTTGTGACCTAGGGTGCTATATTGTGGCCTAAATTCTTCCATCATAACGT
-ATGATTTCACATTTTGACCTGAAAATTCTTTGCGTGGTCTAAGATTTCTC
-ATTATATTCTCGAATTTAACTTCGACACGTGAGAACAATTTTGATGGCCT
-AGAAATTGCTCCCGTGACCTAGGAAGTTTCAAATTTTTAAAGTTCAAATA
-AATTTCACCAGAAATTCATCAAAATTTACAATTACGGAAAAAGAATCATA
-TTAACCACTGCAACTTTTTTCGAACGAAGGACGAGGCAAAAAGGTTTCTA
-GGCCATGGCCGAGTCCCCGACAAATTTCAGCGGCCATTTATTTTGCTTTG
-TTTTTTGCGTGTTTTCTTTCGTTTTTCACCGATTTTTTCCGTTTTTTCTT
-ATCAAAACTAATAAATAAATATTTTTTGCAGATGCTAAAACAATTTCCAA
-GTGAAAAAATTGTGAATTCAGTCGGCAAGTAGCGGTAAAAGTGGTCAATG
-TAATATGATGGATTACGGGAATAAAAAACCCAAACTTTTTCCCAAACATG
-ATACATATGCTGTTTAGAAACACGGGAAAAATCGGTGAAAAACACAAGAA
-AACAAAGCAAGTACAAAATGTCGTAAAATGCGGTGTATTGTGTGCAAACA
-CCGATTTTTCGCATTTTTTCTCGGCCCTCGTTCGAAAAAAGTTGCAGTGT
-TAACGGCGGTGGAAGAGCTTTACCTTTACAAAAGGTGGCCACAAAAAAAA
-TAGAAGAAAGGATCCAAAAAGAGCAGGGAAGAGTTTTCTCAATTTGACGG
-CCACGTGTTCTATAGAAAAAGATAAATACAATAAATACGTTTTTTGAACA
-ATTAAAAAAACAAAAAATTTCAAGAAAAATTTAGAATATTTTTTCAGTTT
-TTTTCCTGAAATTCAAATAGAATAAATGGAAGTTCAACAAAAAAAGGTGA
-CCTAAATACTTATTAATTCACCTTCTTGACCTCTCGATTCTTCAGAAAAA
-AGAATAGGCTTCTCCTCCTCCCACCTCCCAGACACTTATCTACACTTTAC
-ATCATTCCTCCCGGCCCCCGGTTTTTTCACATTTTTCAACCTTGAAAATG
-ACGAAATAAACAAGTGTTTTAGATAAATGTTTCTGTGTATGTTATCTGAA
-ATCTTGGAAGGGTGTTGCAACAGAGCCCCGCGTGTAGCGTGGCCTAGAAA
-TCCAAAAAGTCTTCTTTTAGATCTTCAGCTTTCTCAGCAAGTTAGGTCTT
-AAGTCAAAAGGACTCTCCATGACCAAGTTATAACGATTTGTAGTTTCTAG
-GCCATGGAGTACTCTCCGAAGGGGAGACATTGACCCCCTGACGCCGGATT
-TGTAGGAATTTTCACGTGTTTATGCTACTGTAAGCGAGCTATATACGTTC
-TTCAAAAATATCCGTCAAATTGTGACCACCGTTTCAGCACTTTAAAATTT
-CTAGGCCACGCTGTCGCCATAATGGAATATTTTTCTCACGAGGAATAGAA
-ATTAAAAAAAAAACTCTTCAACTGGTCGATATTTGGAAAACCAAACTAAA
-ATGTTTCAGAATTATTAAAAGCTTAATTAAAACAAACAGCCACAAAAGTT
-ACCTAAACTGATGAAATAAAGACATAGGCATACAGATTTATAAATCCTAT
-AAGCATGGGTGTGTCACAGGTAAAGATTATGGAAAGTGAGGGAAAGTAGG
-AAGATATTACTGGAAAGTTCTGGGGGAGAACGGCTGAAATCAAAATGGAT
-TCGGTTGAACGCGTCGAATCACGGAGACTCGTTTGTAGGGCTTCCAGGTA
-GATAAAAAATGTTCTGCCTGAATTGGGCCAAAACACATGAATCTTCAAAA
-ACAAATTGACACAAGAAAATACATACTACTCCAAATTTTCAAAAATCAAA
-AAATAGGCGATAGGTTTTTAGATACTAAAGTATATTGAGCAATTAAACAA
-TTCACCCCCTACAACTGGCGGGCCCGCAGGGCCTGCTAGTCAGGCAAAAA
-ATATATGGCCCACACTCCCAGCGACAAGAAAAATTAGGGGATATTAGAGA
-CATTTACTCAAAAGGAGCATTACACAAATTTTAAAAATCTCAAAGCGGGA
-AATTTTTTTAATGCGTACTGAATAAGAAATCGACGTTTAATGAAACTCAA
-TTGCTACAACCCCGTAAACCTCCTTCACGTCCAATCAATAGTGACATGAA
-TCCTTCCGACCAACGTCATAAAGATTGGAGATGACGAAATTTAAGATGTA
-CCAAGTATGCTGGTACATACAATTTCTACGTCACAACATCTTGACAGTTT
-TTTCCCTCAAAGAGAGGTGAGCCTGTAGAAGAGATACAAACGCTGCGTCC
-TATCGTGGGTTCAGTTGTGGGGAAAAATTGTAAAAACTGTATGTACCAAC
-TATGCTGATGTGCCAACTACCAACCAGCATAGTTGGTGCATCTTCAATTT
-TGCCATCTCCAATCTTTATGACGTTGGTCGGAAGGACTTTTGTCACTATT
-GATTGGAGGCTTACGGGGTTGAAACAATCGTTCATTAAAAGTCGTATTCT
-TATTCAGTACGCATTTCAAAATGTTTCCCACTTTTTTTCGGCTTGATCTA
-CGTAGATCTTTAAAAAATGCGGGAGAAGATATGCAGTGTTCTCAACTAAT
-TTCGCATAGTTAAGAACGTGCTGACGTCACTTTTTTTTTGAGCAAAACAT
-TCCGGCATTTTTTGTAGATCAATCCGTAATTGGACAGCCTGGCACCACGT
-GTAAGAACACGATGCCTCTATTTTTGCCCGGGAGTGTGGGCCTTGAAAAG
-TTGTGAGCTGTAGAAAAATGGACAACAAGCATGTTGTCAGTTAGCAGCAT
-TTTATAAGTCAAGGACAAGTACAACCGAGATAAGTGAAAAGTTTGAAAAA
-TGGAAAACTTTCAAAAAACAGCGAAGGTTCTTTGATCGATGCAAGGGCAG
-AAAGTGAATAATGCATGTTTTTGAACTTAAAACAAATTGGCTAGACTTTG
-ACTGAAACTACCTTTTATAAAAATGAAGAAAATGAACCATTACGAAAATG
-TTAAATACACCTGAAAATTGGTGTGTTTTTATTGTCGTTCTGTAATTAAA
-TTTTGAATGATCGCTCTTCTGCAAAGAACAACCACAAAAAATAATTCGAT
-ATACTCAAGTATCGACACTTATGATTTGAATGCAAACATATAACAAATTA
-AAATTAAAATACGGTCATTATATTTTAGGAAAATTATGGAAATTTTTTAG
-GCTTATGATGTTTCAAAAACTTTCAGAACTCTAGTAAAAAACATTTTATA
-TGTAATAAAACACTCAGCGACTTTAAACTTTGCAAGACAATTTGGGACAT
-AATTTTGGGACATTGTAAGAACAGTTAATTGGAAAATAAAATAGTTATTC
-GAATGATCGTTCTTCAAACAACCTTACAAACAACAACACACCTACTCTGC
-TATAATAAGAAAATTTAAAATACTACTCAAGTTGTCACTTCAAGACCGCA
-TAAGTTTATACCACTCGAACAAAAAACAGTCTTCGTTCTTTCTTTCTTGA
-AAAGAGACATAATTGAAAATGAACTAATCAGCCGCTGCCCGGGATGGAAA
-AAAGAAAAGAAATTCCTATCATCTTTTGACCTTGTTATTTTTGCAAATCA
-TGTCTGAATAATACACTTTTTGATACATATAAATCAGGCGTGGGCGACAA
-ACAATTTTTCCGGCAAATCGGCAAATTGCTGGAATTGAAATTTCCGGCAA
-ATCGGCAAATCAAAAATGTTTGAAAATAGGAGAGTAAAAAGGTGGAAGTC
-AAGTGATGGTAAGTACCTATTTTGTTTCAATCAAATTAAATTTTACACCA
-TCTCTCTTTTTTTTCCTTATTTAACAGTCTTTGGTCTGTGTTCTGATGTT
-GAAAGATAAGGGAACATGGACGAGTTGTTTTTGGGAAAAAACATTCTTTT
-TGGATTATTTTAGTAAAAGAAAAATTTAAATTTATAAGCATATTCACTAA
-ATATTTTTGTGGGAATTTGAAAAAAAAAGAAATTAAAGAAGAAACTGATA
-AAAACTAGAAAATGTATAACTGGGAGAAAAAAGTTTCCAATTTTCAGAAC
-TTTTGAAAAATTGTAGAAAATAGTTCATGCTTTCAAAGTTGTAGGAAAAA
-ATAATATGTGGCCAATTTCCGAAAGAAAAAACTCTGCCACGACCAAAACT
-CAGAACTAGACTGAAATTTCAGTTGTAGCTGACAAAACCATCCAAAAGAT
-ATTGTAGGTTACAATATCTAGGCCGTGAAAATTAGAAAACTCGAATCAGA
-TATCCTTGGCCGGAATGCGAAAAAACAAAAATTAGAGTTTTCTAGGCCAC
-AAAAACTCGTCCACGTGTGCATGAACTGTCAAGTGGTCAACGTAAAAGGT
-GTGAAACCCTTCAGAGAAAAACACTAGAAATGAGATAAAGTAGGTGAGAC
-CTCCTGTCTCTGAGAAGCAACGTTCGAAATTCTTTTCCAATTCCATCTAT
-TATTATTATTATTATTATTATTAGGACGGTATGGCGCCAGGAACTGGTTG
-TTTATACTGACCACTGCCTCTTCCCGATTAGGATTCTGAATTTCGGATTT
-CGGGAAATTGAGAATGGCAGATGGATGTAATTTCATTAATCATGTTCCTC
-AATAAGTTAAGAAACAAAAGAAGGAAGATATAGTGAATCAGTGAGGAACA
-AGAACATAGCATATATGGAATTGGCGGTGTAAGACTGGTTTACATGGTTA
-CACGGAGGGAAAAAGATTTGAAAGTATTCGTCATCTTATCTAGGTAGTTG
-AGACACTTGATTAGTCATAGTTGAAAGAACAAATGGAAGAAGTTCATATG
-CTGAAAGCATCGCTAATAACATAATATTGGTTTTAAAGGTGGAGTACGGT
-CTGTGGGTTTTTAACCTAAATGACAGAATACAGTCCCAATATACCGAATA
-TAACTGTTAAAGATTTATAAAATTTATCTAAATTTTTTATGATTTTTAAA
-AAAGTTTTTTTTTTTTTAATTTAAAAATTTATTCAAAATTCCAAAAAAAT
-ATTTTATTCAAAACTAAAAACCCAAATTTTCTGAAACTTTACCATTTTAC
-TTATTTATGTCTTAACAATAATATACACATATTAACGAAATACCCACCGT
-TCAAAATTTGACTTAATCTCCAGTTTTAACTGCCAATGAGAATTTGTTCA
-AAATTCCAATCTCACACCCAATGTTTTTCTTTGTTTTTCATTTTAAAACA
-GTTCTATCCAGTTTAAAAATTTACCAAATAAAAATGTGTCTATTCCTCTC
-ACCTCCAATCCCGTGCATGTGTTCATGTTTACCTATTGAAACGTGTGTAT
-TACTATATAATACAGAACAAATATAAAATGGCCACTCTTGCACCTCCAGC
-GGAAAGAAAGCTTTTGAGGTGTTACGAACACTGCAACACTTTCCTATTTT
-ACTAGTTTTGAGCAATTTTCTGGTCCTTTTATTTATTTTTGTTTTGTCTG
-GAACAGGAAGTTGTTTGTGTTCTGTTTGGAAAATTAATCAGTTCTACCGT
-GAGATTTTTAAGTTATTTTTTGAATGGAATTTCAATTATTATTTCATTTC
-ATTTGTTTTTTTTTCTCACCGAAATCCACTTTTTTTAGAAACAATTTTTT
-TTTCTACATTTTTTTCCGATTTTTGTCATTCAATTTTTCAACTTCTCCAT
-TTTTTCTACAAAACACCGAAAACTACAAAATACCTAAAAATTGCAAATTA
-AAAAAATTTTTAAACATTTTTGCCCAAAAAATTGTTTTTTTTTTCAGAAC
-ATCTAAAACTCACTAAAAAATATGCTCAAAAATTTTTTTGAGAACACTTA
-ATTTTTCGAAAATCTTATTTTTGCAATATTAAATCCAGAGAAATTAGAAA
-AAAAAAACGGTTTTCTACAGTACTCCTACCCTCCCTCTCCAGTACTCTTA
-AAATATTCCTACAGTGTTCTTACAGTACTCTTACACCACTCCTACACTGT
-TCTTACAGTGATCCGATACTACTTTTATAAGACTCCCACAGACTCCTACT
-ATACCTATACCTTATCACTACAGTATCCCTGCCGTACCCCCCCCCCCCCC
-CCAGTACCTATACTTGCCACTACAGTATCCTACAGTATTTCTACAGTGCT
-CCTACACTACCTCTACAGTACTCCTACAGTACCATTACCAAAAATTTGAA
-TAGAAAAGTGAAATTATGAACATTTTTTCCTGTATACCAATTTTTAAAGT
-TTTAGTTTTGTAGTTGTTTTTGACAACGAAATCAATTTCAAAGTATTTTT
-CTTTAAACAATCGTACTTTTTGCGTACTGTTCTTGCACTTTTTGGGATCT
-TTTGGACTAAAAGTGCCCCCCGAAAAAAGCGCGGAATTAAAAGAACAAAA
-ACCGGATAGACTGAGGAGGTGTCGAACGATGGAATGAAAAAAGAAACAGA
-AATTAGATTTGGTTCAGTGAATTCTGTTTCTTTTATTTGGATTTTGGTTT
-TTTGGAGTCTTGGAAAAATGTTTTATTTTTGTTCTTTCCAAGAGTCCAAA
-CGTTTTTTTCCACCAAAACTCCAAAATTTTTAAAATTTGGAAATTTGATT
-CACTGCCAAAACTTCCAGAGAAATTAAATGTTCAGTTTCCCGTAAATAAC
-AGGGTTTCGTATCAAAAACTGTGAATTTTCCCGCCACCTATGTTTTTTAA
-AAATGATTATACTCTAATTTCCCGTCAACATTTTTTTATTTTGCGAAAAA
-TGATTATTTGAACATCCCAGAAAATTTTAAAAACGTCATGAGTTTTTTGA
-AAATTCAATTTTTCGTGTTCCTGTAATAAAAACCATAGAAACTGTTGACC
-TATAACCTGCCAGACGTTCTTCCTGTCTGTTTATACCCCCATCTGCTCTG
-CACACCAGACACCCCTCCTCCTAACTACACTTTAAACTGTTACCCCCCCC
-CCCCCCGTTTACCCCTCATTTGTTTTTTTTTCTAGTGCATCCCTTCCGTG
-TAACCTGACACTTTTTCCAAGAAGCTCGCATTTCTTAGGAGGAGCAGCAA
-TTTTTCGTTACTTAATTTTCCACACAGTAGGAAAGACAAAAAGAAAACGT
-CATAGAAATTAAAAATTCTGCGTTTAATTTTTTGTTCAGTTTCTGAAACT
-CAATTTTGTGGAACCGTTTTTTTCGATCTTTGTAAAATTGAATTTTTTTG
-ATTTTTGGAAAATTTGGATTTTTGCTGGAAAGTCAATTTTTGTGAGAAAA
-GGTTTGGCGGGAAATTTAAATTTATTGAGAAAAATTTTAGCGGGAAATTA
-AATTTTTTGATAGTGAGAAAAATTCAATTGAATACCTTTTTTGTGCGAAT
-TTTTCATAATATCTGAAACTCAAAAAATCTGAAAATTAACTCGAAAAAAT
-TTTCAAATTTGATATTTTGGCAATTCAAAAATTGCTTAAAGAAAATAACG
-GAACCTCGTTTTTTTTCTTTAAAAAAAGGTTTTAGTAACTTTTCCGGTAA
-CCAAGGTTACTCTTTCCCCATCAATCTCCCAAAAGCATGCCAGAAAAAAA
-AGAGAGAGAGAGAGAGATGCGTGTATGATTGTGTCATTTGACAGTGCGCA
-ACAGACACACATAAAACAGCTGACATCTTCTCTTTTTATTTCAACTGATT
-TTTAATTTCCCTCCTTGTGTTCTCTGAGTCTCTCTCATTTATTCAGTTTC
-TCGATTTTCTTCCAAATTCATTAATATTTTAATCTATGCGTAAAGTGGAG
-GAAGATTTCTTCTACGTTTTGATTTGCAATTTCTCGGGTTTTTCAAATTA
-TGGATTTTGAAAAAAAAAATTTCTGAAATTTATTTTTGATTCATGTCAGA
-AAATGAGTCTCCTGAATTTTTTTTGGAAAATATAAAACAAATTCTGAATT
-TTTTTTACTTTTTGATGTGTAAAACAAAAAAATTGATTAGAAAAATCTTT
-ATCTATTTTTTGAACTTTTCAATTTTAAAATCAAAATTAACTTCTAAGAA
-ATAAGATTTTTTTCGGAATTTTGAAAAAAAATGTTGTTTTTTTGAGATTT
-TAGTACATTCAATTTTCGTAAAATTCGAATTCATTTTTTTATTGTGCAAA
-TGTTTTCTGACTGACTATGAGAAAAATTTCAACATTTTGAAGAACCCCCC
-CCCCCCCCCCCCCCATTATTTGGACGGAGCCTGAATACGAAATGTGAGTT
-CTCAGAGAAGGAGGTGAACAATTTGATTGATGTGCATATGGAGATGCTCA
-TTGTGCATATCAGTTTGGAGCATCTATCTCAGAGTGAGCATGACATTTAC
-TTTTACCCATTTGCGTAGGCTCCGCCATTTCACGATTTTTTTTTTCCAAT
-TTTTGAACTAGTATAAAAATTTCTGAAATTTCTGTAATTTCTGCCATCTC
-CTCATAAATTCCATTGTATTCTTTGCACTATTGTTCCACAAAAGTGCAAA
-ATTTTCGAATTCGTAATGTGTCTTTCATATATATATCCATGCACTTTTGT
-CCCTTTTCCTGAATACTAATTTGGTGTGCTCCAAGAGGAAATTTTTTTGT
-TTTGTTGAAATTACTGCTCCTTTTCGGAATTTTTTAATTTCTGAGAAAAA
-TTCAATTCCTAAATGTATAATACTAAAGTCAAAATACTAAAGTGTAATGG
-TTTGTTTTTTGTTACAGTCTTTAGTTTGTAGCTTTTGTTTTGTGTAGTTT
-TCCAACTTTTTTTTTGCCAAAATGAAGGCTGAGAAACCGAAAAAAAAAAT
-TCAAAACATAGATTGGGCTGAAGCGGTATTATTGGTTTACTGTAGCATTA
-CTGGGTTACTCTAGTTTGGCCCATGTTTGGTGTACGTTAGTAGTAACAAC
-ATTTCGTTCATTTGTTTTTTGATTTGGTAACTTCTGGTGATTAAACTTTT
-AATGTACCTAAATCTTCTGTTGCATTATTGATTTGTTGTTTTCTTCTTTT
-TAAGTTAAACATGCTCAAATTAAATTCAAATTGAGTTGAAAATGCAAAAT
-TATTATCAACTTGAATACCCAAAATTTTGGACGGTATTTCAAAAAAATTG
-ATTTCCAGCCGCTTCGACCTTCGACACAACAAACGAATGCTAACTTTCCC
-AGGATTACACAAAATAGGTCAAAATCCCCTTTTCTCAATTTTTTGCACAT
-ACATCCTCATCATCATCATTGTAATGATCGTGACCATCCGGTCTTCTATT
-ATTAAATGAGAGAAGGAAAGAGTATACATATGTGTCTTTTATATTAAACT
-AATTATATTTCGACACATTCTGCGCATATCACTACTGCACTAGAATTACA
-TTTTAAGAATAAAATGTAACCAAAAGACCAAAAAGTTGTTTGCATTTATT
-GTTATAAACAGAATAGAATGAATGTTAGGAAACGTTATTAAAACTTGCAA
-AGTGACACAATTCGGTATATCGATTTCTCTGAAATTACTTAACTTAGTAG
-GCAGAGTTTTGATACTGATACGGATTTTACTAAATTTAATTTTTGTAAAT
-CAGTATTGCTTTTATAACCTATTAAGATTTTTTTGTTCCAGCGTGCAATT
-ATTTTTAATTCTATTTAGGATTTTAATAAATAGAAAAATACGTTTTGAAT
-TATTTTTTACGTTATAATATTCAATAGTAAAGAAGCACACATCAATTCCC
-CTATTCAGTTTCCATACTTTGCCTGATAAACATGAATAGTAAAATAGACA
-CTTTCATTTATACAGACACCCCCCCCCCCTTGCTTCCGGATTAAATCCCA
-ATAAAGGGTGTGGCAATAAGGCATTGTTGCAGTTTCATTGAATTTATTAA
-TCATTTGACAGCATGAAATTACAAAACTGGAGAATTTCTAGTTTAAACTT
-TTATACAATGAAGAAATCTTCCATAGAATCAATATTAAATTATCAATAAA
-TGAGTATTTACGTTTTTCAGCAACGGTATTATTTTTATACTTACTAGTTA
-TTAAGTTAGTAGTTAGTTACATTTTTAAATGCGATGCAGTCGAAATTTTT
-TTATAGACTAGAAATTGTCTTAGTTTCCAGCCACTGACAAGTCGGCCAAA
-TTTCAAACTTTCAGTAATTTTGCGTCATTTGTTGAGCCGCCATAACTCTT
-TTTTTGAGACGTTTTCAAGAAGTTGAAATTTGGTATTTTCAGACATTTGT
-ATCTTATTTAAAATATGAGTATTCACTCCTTTTACCTGCCAGTCGGCTGC
-CTCCTTATCTCCTATTTTTCTCTAATGAGCACACACCACTATCATCATTA
-TTATTACCACCTGTTCTTAATAATAAACATTTCCCGCACTTTATTTCCAT
-TTCGATGCATTTTATAGAAAATGTTCCCCCTTTTCGAGCTTTCCAATTAG
-ATTCACCCTTTGATTGCTCTTTCTTGGACGGAAGTGTTCCCCAATTCCCC
-TTCATCTTATTACATTTTTATGCAGATTTTATTGCATTTTAGTGCGCTAG
-ATTTTTCATGGGATTTTGCTAAATAATGCAATCACGCTCTAAATAAAATT
-CTCAGTTTATATTTTAATGTTAAAACTGTGTGTAAAATTTACAAACATAG
-TGAATACATTTTTCGAATAAAAGTATGAACATTTTTCGAGGGATCTATAG
-AAAATTGCCGGCTGTTCCTAAATGCCCTTTCACTGGTCACCAAGTTCCTG
-TTCATGCAATTCAAAAGAAATGTTCAGCCCCCCGCTCAATAGTCGCCCGC
-ACCACAAAATTGAAAAGCGAACATTTTACTAGTCGAACTTTTGAATTGAA
-CATTTTTGGAGTATTTTAAAGAAATGTTTTCAAGTCCACCAAAACATATG
-CCAGGCCACAAAAATTTCAATTTTCCGCCAATTTTTTTCTCACAAAAGTT
-GAATTTTCTCGAATTTCCGATAATTTTCGATTTATTTGAAAGTTATTGAA
-ATTTATATTTTCTAAAACACTTCCACAATAACAAATTAATAGATATAATA
-AAATTTGAAATTCCCATGCCACACCTCAAAAAGTGGCTCCCTTAACTCCT
-GAGTGCTCGCGGAGCCCTACCAAACTTGGAACATTCTTTTCCCAACGGAG
-TCATGAACATATGAGCATTAAATGAGTAGACGACATGTGTATACATAGGA
-CCACCACAGCTGTTCCTTCCTTTTTATGAGAAGACATGTCATACACACAA
-TGTCTCTTCTCCTTTCCGATTGGAAAATTAAAATTATAGGAGGGGGGGGG
-GGGGGGGGCGATTCTTGACATTTCAATTACCCCCCCCCCCCCCCCACATC
-CGTTATGTTGCATTTTGGTAGGCTTGGGGCCGAATAAGTCTCCCATGCAG
-GCGTCAAAACGTCTGCGGACCTACGCCTGCCTCACGCCGCGCCTGCTGTA
-CAGGAACCCGAAAAGTGTCGAACGCGGCTAAAGAACCACTTTTCGCACTA
-TGCGGTGTAAACACAAGGTTTTGATTTGTAGTCATAGTGCATATATGATG
-CGGGAGGCTGACAGGTAGGAGGCAAGCGTTCAACCGCGCATGCCCACCAT
-GGAAGCCCTAGAGCCTAGTTTTAGATGAGTTTCAGCATTTTTGATCTACA
-AGATTTTGAAAGTTTTACAAAAAAACCAAGATTTTTTGTAATTTATGAAG
-TGATTTTTCTACATTTCATCTAGAAACCAGCAGAGTTATTTTTTGGGTAA
-TTTATCAATAGAGCGCGTTCGCGTCATGAAAACAAAATGGCGGCCGAACT
-TTGAAAATCGATGGCTGAATTTTTCGGAACAAAAGTCCGTAGCTATAAAG
-CACAGGCCTACGTTTTTTTTGCTTTTAAATGACATAGTTTTCTAAAAAAA
-AGTCTGTGGCCGAATTTTTAAATTTTGAATAGGGGCTTATTTCAAAAAAA
-ATTTGAGGCCAACCTACTCTTCTCAATTATAACTTGCCATGGCAGAACTT
-TTGAACAACTATTACAACGTTTTCAAAAAACAAGTTAAAGCATTTTTTCG
-AATAAAGGTTAAATTGGTAGCCTAGTTTTCTCAAAACAAAATACTAAAAA
-AAATATCGATGACCGAAGTTTATATTTGAAAAAATATGTGACCTAGAACT
-TTTAACTACTCTTCCAATGTCTTCTAGCTTCTGAGAAAAAGTTCGTGGCC
-TAAGTGTACCACGATGGTCTAGTTATCTCGGAAATAGCCATAGCCTAGTT
-TTCTCAAAAAAATCGGTGGTCGAGTTTCCTGTATGTAGGCATGTAGGTAT
-GTAATTTTTATCTTCCAGGTATCTATTTGTACTTCCCGGTAGCCAGGAGC
-AATACTTTTGAATTCCTTTGCTCTCCCTATTCAGCTTCTCCCCTCACACT
-CGTTTTTGGTATTCTATTGTTCTCCTCCTCTTCCCATTCTACCCCCATTT
-CATTTTCCTCTTGGAGACCCCTGTCTCTCTCTCTTTGTATTGGCTCTTTT
-ACGTCTTCTAGTAGGCTTTTCCTTAATGAACTTGTGTGTGTGTGCTTGAA
-TCATCATCGCGTTCTCTCGTTCCATTTCCCTTTTGCAATTTTCTTTTCTT
-GGAGAAATTTGGAAAGTTTTGCTCAAAATTCCTACGTACACATGCCTCAA
-AATCTGGTTGTATATGGCCTAACATTCAATTTCTAGTGCACACAATAAAA
-TTTTCCGGGAAATTCAAATTTTCTGATAATGAGGAAGGACTTTGGCGGAA
-AATTCAAATTTTAAAAAAGTAGGCGGGAAATTCGAATTTCGAATTTTCTA
-AACTTTTTGGCCGGAATTTCAAATGTTCTGAAAAATAATTTTGGAGCGAA
-ATTCATATTTTCTCAGAAAAATCTCAGAAAATTTGAATCTCCCACTAATA
-TTCTTCTCAAAAAACTGTTACGTGACCTATTTATATCTTATTTATTGGTC
-CATTTATTACGTGGCCTAAAACATTTTTTCTTTTCCCCCGTTTACAGCGA
-TCATTTGAGATGGCCTAGAAAACGCACGTTAGGCCATCAGGTTTACGGGG
-TATAGTACAACCTCTTGCAGGGGACTGAGGTTCAGAAAACTACAAATTTA
-GCTAATTCCCTACCTACTCTTGCAAATCCAATAACTAACCCAATTTCCCG
-GGGAAATTTTTATTCTTAGAAAACAACTTGTATATCTCCGCAACTACATA
-TCCCTCCTTCAAAATAATAATAATGGGAAGCTTCTGCTTCTCTACACCTT
-CTTTTGACCAAAAACTTGTTGCCAGTGCCCTATTATGTACGGTCCGTTGA
-GTTTTGTTGTTGTTCACAATAATATGTGTAATTCGCGCATCTGAAGAGGG
-GAGGTGTAAATGTTGTGTCTAACCGTTATGTTGCTGTCACCTCCAAGTGG
-TACAGGTGGCCTAGAAATTTGCGAAAACTCTTCCACGATTATATTTCTCA
-AAAAATTACTTTTCTCAGAAAATTTGATTTTCTCACCAAAATATTTCTCA
-GATAATTTGAATTCCCGCCAAAATTGTTTAAAAAAATAGAATATCTCGTC
-AAAATTTTTATCAGAAAATTTGAATTCCCCACTAAAATTTTGCCAAAACA
-TTTTATTTTCCCACTTAAAAAAGTTTTTTTTTTAATTTGAAAGTGGAAAA
-GTTTTCTAGGTCACTTATACATTACCGGTGACCGAGGTCGAATTATTCCT
-AGGCCACAAATCTCCCAAAGGGGTATTCCCACACCTAATTGACACCTCCC
-CGGGCACCTTTGAGCACTAAGTAAGGACACCCACCCCTCTCAGCTTAATA
-GCTTTTAAAGGAGCACACCAGCCATATGTTTTCTCTAATTCTCTCACTCT
-CTCTCTCGGCTTCTAAATTCAATTTCCCCCCGTCACGCCTCTCGTTACGT
-GAGGAGTGTTCAACATGTTCCCATTCCCTTATCCGATAAGTTTTTGGTAG
-GCAGGAGCTTGTACTAGTAGAGGACATTTGTCGCTTCTTGGTCTTTCGCC
-TCCATTTTCCGTAATTTATACGTGACTTAGAAAATTAGAAAAAAACGCAT
-TCCACGAGTTTGTTGGACAACTTTTTTTACGTGGCCTAGAAAAAAATGAA
-ACTCGGCCACCGACTTTTCTTTCACTTTTGTGAAGATATGATCTCATTCT
-ATAATTCTGTCGAACCGATTAGGAGGGTGGCTGAGTTTGCACTTTTGCGT
-GTTCTATACCATTTACAGAAGCTAGTCCCCCCGTCATTCTTTTTCCTGCA
-AAATGTTTTTTTTTGCCCCCGGTGTCTCATCATACAGTACAGCAGCCAAT
-ATTATTTGTTTTTTGTTTCGTCTTTTCGTCTTTTCGGAGAAAAAACGCTC
-TATTCTATGACAAGGTGACGTCATTGGACTCGTGGCCTAGAAAGTTTGGC
-AAACTCTTCCACCATTCGATTTTACAGGAGCCTCAAAGCCCCACATGGGG
-CCTAGAAATCTTGACATTTCTAAAAAACATCCATTTTGAAATTTTTCGAA
-ATTGGTGCAACCTAGCAACCTCTAGAACTTCACGTGACCTAGAAAAAACA
-AAACCTCAAAATTTCATGTGGACTAGAAACTTTTAAAAACTCTTCCATCG
-ATTTTGTTTTGTGGCGGGGACTTTTTCCAGTTTCTTTTTCACATAAAAAC
-CAAAAAAAAACAAGACGTCAAGCTGTGAAAATGATTAGTCACAAAAAGAA
-GAAAAACAGTAGTGTCGTTCCTGCCAATTTCAGAGATTCCTTCTTCGCTT
-CTCACGACACGAGGGGGGGAGGGTCTAATTGGCACCCCCCCCCCCCCCTA
-CTGAGGTGAGAAGCTTGAGTTGACTCACACGTCGCTCTTGTTTTATTCAT
-TTTTGGCACAAAGTGAAGTGTGCGAAAATTGTAGTAGTCTGTGTGTGTGT
-GTGTGTATGAGCATTTCGAATTTTAAAATACTTTTTTAATGTACCGCAGG
-CCACGTGGTAAGTTTTTTTTCATAAATATAGGATTTGTTTTCTTGTAGAA
-AAGTTTTTCGAATTTTGAAATGAAAAGGATAACTGGGAACGGAGAAAAAT
-TAAGTTTTAATTTCTAGGCCACGTACCAATGAGGATGAGAAGTCGGTTTT
-CTAGATCACAAGGTCATCTAAACTTTTAGGAAATTTAAAAAGTTTGGTGA
-TTACGAGAATTTCTAGGCCACGTCGCAATACACCGGCGCGTTGGCGTTTT
-TACACTTTCTAGACTACTAAGATTTTCCTAGGCCACGTCCCAATCAGGGC
-TGTTGCAAAAAAAAATTTTCGACCAAAAAACAAAAAACAAAAAATTTTTT
-GGTCTAACTATGGACCAAAAAACAAAAAACAAAAAAACAAAAAACAAAAA
-AAAATTCAATGTTTGATATTGAACGGGACAAAACGGAATTTTTTCATGAA
-ATATTCTGGTGATTTTTTATAAAATATTGAAAATTGAACGAACAGAAGGT
-TTTTTGTTAGCTTTTTTGCTGAATCAGTGCTGTAATTTATTTTTTGGTTG
-TTTTTGGTTTTTTTTTTGGTCTCAAAAAACCAAAAAAACCAAAAAATCAA
-TTTTTCCCAAAAATACCAAAAAAAACCAAAAAAAAACAGCCCTGGTCCCA
-ATGTACAGGTGTTGTGGTGCTTTTTGTGAGCTCTTAGGCCAGCTGGAGTT
-TTCTAGGCCACTTGTAAATCAATGGTTTTTTTTCGGTGTTCTAGGCCACC
-TGTCACGCCTAGACCATTGACCTAGAAGTTTAATGTTTTTGAATAATAAG
-TACACGTACTCTCACATACCCGCAAATGCACATATCTATCTTCATTTCGT
-GATTCTCTTCATCTCATCTTATTTTCCATTTCGGTTTACCCTTTTTTTCT
-CTATGAATATATTTTCATGTACTTGCTCTTCTTCCCTGAAAAAGATTCTT
-TTACACTTTTTTCATTTCCTTAGGCAGTTGTAAAGAACTTGTCATTAGAA
-CTTTCAGAATGACATCAGAGTAGATGGCCGAACTTTTTCTAGGCCACGGC
-TTGGGAGCCAAACATGGCTAAACATTCTAACTTCCTGGGTCATCTAGAAG
-TTTCTAGGTCTTATGGGTGAAAATTGTCAAATGACAGAATTTTCTTAAGT
-TATAGTTGAATTTCCCGCCAAACCGATTTTTTTTTGAAAAATTTAAATTT
-CCCGCCAAAAATTTTTTGAAACGTTTAAATTTTATGCCAAACTTTTTCTG
-AGAGAATTTGGTTTCGCTCCCAATTTTATTCTCTGAAAATTTTAAATTCG
-CACCAAATTTTTCGAGAGCTTTTTGAAGTTCCCGGCAAAATTTGTTTTCG
-AAAAATTAGATCCCCGTCAACTATGATAGAGAAGTTACGTCATCTGGCTA
-CCCTGGCCGAATTTTCAATATATTTCTAGGCCACATATTGACCGCTAAAT
-CATGTTGTGGAAGAGTAGTGACGTCACTTGGCGACCGCGACCATCGAGCA
-GCGTGAGGGGCGAAGTATCCCCCTTCCCAACCCTAAAGACGTCGTTCATC
-GCTCCTTTTTTGTTGTTGTAGGAGTTCCGTTTTTTTGTGTCTCGATTCGT
-TTCCTCCTGTTTGTTGTCATTTCTGAACTCATCTCTACACTTCTCTCGTC
-TTCTCTGCGTCTCTCCATCCTGCACACTATTTTTGTTTACCTCGATGATC
-TTTCTTTTTGCGTGTGTGTCACTGACGAACGAACGGCTGACACAGACTAT
-TGTTTTAGTTTTGTTGTTTAGAAGTAGTTGTAGTATTCCAATAGTTTTTC
-ACACTTTGCATTATTTCAGATGGCTCAGGACGGAGACCGCCATCACATTT
-TTGTCAGTGCTCCGCCGCCGCCGCCACCTTCCTCGTCGATTCCAGCTCCA
-TCGCAGGTAAATTTAAGGTTGCAAGCGCGCTCTAATGACCTTTTTTGTGC
-CTCCGGCTCCTCTTTGGGTTATTGCCAACGCGCTCCAATTCGAATTATTC
-TTACTTTCAGCCAAATAGACTGGAAAAGGAGCCGCTCATCGATGAGGAAA
-CTGACATGATTGACGAATCCCGAGCCACGTATTGGAAGGGATGTGAATTC
-TTGAAAGCCTCTGGGTTGTACTCGAGTAAATGTGAGTTGGTCTAGAAAAT
-TTGTAAAGCTCTTCCACGAAGTAATTAATAAGGGATACTATTGCCGACAC
-CCAGGAACACGTATACCACGGAATTCAAATTTTAATTTTTTGAAAATATT
-TTGGCGGGAATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATT
-TAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATTTAAAATTTTAAT
-TTTTTGAAAATATTTTGGCGGGAATTCAAATTTTAATTTTTTGAAAATAT
-TTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAATATTTTGACGGGAAT
-TTAAAATTTTAATTTTCTGAAAATATTTTGGCGGGAATTCAAATTTTAAT
-TTTTTGAAAATATTTTGGCGGGAATTCAAATTTTAATTTTTTGAAAATAT
-TTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAAT
-TTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATTTAAAATTTTAA
-TTTTTTGAAAATATTTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAAT
-ATTTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGA
-ATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATTCAAATTTTA
-ATTTTTTGAAAATATTTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAA
-TATTTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGG
-AATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATTTAAAATTT
-TAATTTTTTGAAAATATTTTGGCGGGAATTCAAATTTTAATTTTTTGAAA
-ATATTTTGGCGGGAATTTAAAATTTTAATTTTCTGAAAATATTTTGGCGG
-GAATTCAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATTTAAAATTT
-TAATTTTTTGAAAATATTTTGGCTGGAATTTAAAATTTCTGAGAAAAAGA
-ACCTTCGTGTCGAGACCCATCGTGGTGAGACCCTTCGTGGTGAGACCCAT
-CGTGGTGACACCCATCGTGGTGAGACCCTTCGTAGTGAGACCCTTCGTGG
-TGAGACCTTTCGTGGTGAGACCCATCGTGGTGAGACCCATCGTGGTGAGA
-CTCATCGTGGTGAGACCCTTCGTGGTGATACCCATCGTGGTGAGACCTTT
-CGTGGTGAGACCCACCGTGGTGAGACCCATCGTGGTGAGACTCATCGTGG
-TGAGACCCTTCGTGGTGAGACCCATCGTGGTGAGACCTTTCGTGGTGAGA
-CCTTTCGTGGTGAGACCCATCGTGGTGAGACCTTTCGTGGTGAGACCTTT
-CGTGGTGAGACCTTTCGTGGTGAGACCCATCGTGGTGAGACCCTTCGTGG
-TGAGACCCATCGTGGTGAGACCTTTCGTGGTGAGACCCATCGTGGTGAGA
-CCCATCGTGGTGAGACCCATCGTGGTGAGACCCATCGTGGTGAGACCCTT
-CATGGTTAGACCCATCGTGGTGAGACCCTTCGTGCTGAGACCATTCATGG
-AGAGACCCATCGTGGTGAGACCCTTCGTGGTTAGACCCATCGTGGTGAGA
-TCTTTCGTGGTGAGACCCATCGTGGTGAGACTCATCGTGGTGAGACCCTT
-CGTGGGGAGACTCTTCGTGGTGAGACCCTTCGTGGTTAGACCCATCGTGG
-TTAGACCCATCGTGGTGAGATCTTTCGTGGTGAGCCCCATCGTGGTGAGA
-CCCATCGTGGTGAGACTTTTCGTGGTGAGACCCATCGTGGTGAGACTTTT
-CGTGGTGAGACCCATCGTGGTGAGACCTTTCGTGGTGAGACCCTTCGTGG
-GGAGACTCTTCGTGTTTGATATTATATTGGCGGGAGCTAAGGAGTTGGTG
-TGGGATAATGTCAAGGTACTCTAGGGGTATTGTGGATTTGCTGTAGGGTT
-ACTGTAGTTCAGAAAAATTGACTTTGTGCTTTTGAAGAGGTATTGGCTCG
-AGAGTTAGAGAGGCGGAAGCTTCTGTGATATTTTTTACATTCCAGAATGT
-TTGAAAAAGTAAAAGTTTCCACCTGTTTTCATGTGACATTGTTAAAAGAT
-TATATGGTGTTTTATGTGTCGAACAATTTAAATTTCGCCAGTCGTTGGCC
-GCGCCGTAGGCGCGGTCAGCGGCTGGTTTTTCCAGAAAAGGAATAAGAAA
-TAAATTATTTGGAAGTTACTAGGACCCTGAATAGAATTCTAGGCCATATC
-GAAAAAGGGGATGGGTGCACGTGGGAACCTTTTTTTGGATATTTTGGAAA
-GAAGTAAGAAGTAAGAAGTAAGAAGTTGACTTAAGAAGTTGACTTTTCTA
-GAGTAAGAAGTTGACTTTTCTAGAGATCATCTCCCCTCTATTATTCTCAG
-CGTGACCTAGTTATCCGGAAAACTCTTCCACCAAAAAATGAGTGTCTCCA
-ACTGAAAAATGCGTCATAAAACACACGGAAAAGGTACTTGTGTATTACAT
-GCCCTCATTTTAATAGTAGTTTTTTAAGCCATGAAAAATAAAAACGTGAA
-CCACAATTTGTATTTTTAGGCTTAGGAAATAACATTTTCTAAGCCTAAAG
-AGGAAAATGTGTAATACACAAGTACCACGGAAAATTTTTTGAAACCTTCC
-GAATTTGAAATAATTTAACTAAAAGTTTCTAGGCCACGATGAAAATAGAA
-ACAATGATGTCCCGATTTTGCTGAAAATTTCTGTCCATAGTTATTTAGAG
-TTCTGAAAAAAAAGATTTTCGAGAAATGATTTTCTAGGCCACCAGAAAAG
-TTTCTAGGCCATTATCCCTTCTTGATCCTTTATCATTATGATTATGATAT
-TTTTTAAACGATTTTTTAGGCCACCAGAGGGAATTCTAGTCCGTGTCAAA
-AAAAAAAGAAAGGGGGTATTCTTTCCACATAAAAATCCCGTTGGCCTTTT
-CAATCAAATTTCTTCAATTTTTCGCATAAAACTTACCTCCCGCTGTGACA
-AGCCTCCTCCCGTCTCCCAGTATTCTCAATTCATTAATCATCACCCCCAA
-TGCCCTCATCAACTACAGTATCCCTGCAATCCGCGTCTGCAAATATGTGC
-CGAATATGTCATACTTCTACGTCAACGCGGTCAAATCCGCTCATCTCACC
-GTGTCGATGCTCTGGAACACTGCTCTTTGTGCATAAGGCGTGTGTTGTGG
-TGAGCTCTTTTTTTGTAAAATTCAAAATAATAATTAAAAAATTTAAAAAA
-AAACCTTTTGTGGAATTTGCAATTTTTATAAAATCGTTAAAAACCAAATT
-CAATTTATACAAATTTCCACATTTTCCAAAATAAAAAGAAATAGCCATGC
-CCACAAAATGGGCGGCGCTTTCATAGCCACGTCCATTTTGTGGGCGGAGC
-CTCGGATCAAAGTTTTTTCAAAAACTTACTATAAGTTGAACACGGATTTC
-TGGCTTCCTTCATAAATCGAAATGGCAGAGTTTGCCGAACTAGGCCATTT
-TGGGTCGGAGAGATTTTGTGTAGATTTACGGCGTGTTGCGTGTCGCGTCG
-CGGCTCGTTTTTAGTTGTAAAACTGCTGTATTTGTCCGTGTGGAGTACAC
-GATTTTTTCCACGCGCTGTCCGGCAGGCGATTGTCAATGAGGAGCGAAAA
-TTCAATGCGAAAGGCCAGAAGCCCGTGGTTGAAGTGTGGTTTCAATATTA
-CAGAAATTTTAAAGAGGAATAAACATGCCTGCCTACAAAATGGGCGGAGC
-GTTGGAGGCGTGGTCTAAGAAGTCACGCCCTTTTTTTTAAATACTTGTTC
-TGATGTACAATAGAGCGCATTTACATCAAATTAATAATTTGTTTTTCAAT
-TTTTCCAGAGATGGCTGGAAATGTCGACTCGAAAAATGGTCCCATCACCA
-CGTTGCGAACTATGCGGCTACGATTATCGACGTGGAAATATATTTCAAAT
-GAAATCTTTACATGTTCCACACGTGGATCGATCATCTTGTCTGCTCAATG
-TGCTCTTTTTGATTACCGTATTAATTATGATATTTTGTGGATATTTTACG
-ATTCAATTCATTCAGGAGAATGCACTCTTAAAACGAAGGTGGGCGAAGTT
-TTCTGGTGATGACCTAGGAAATTAGAAAACTAGGCCACCCCGCAAATGTG
-GTGGCCTAGAATACCGAAATTTGACTAAGCTATGGCCTGCGGCCTAGAAA
-AATAAAAGTAGACTGTATAAAATTCTCATCAAGCCTTTTGGAGATGAACT
-GGAAACCCAAATTTTTTGGAAGAAAATATTGACCTCCTTTAAAACGGTGG
-CCTACTTTTTCTGATGGCCTAGGATTTTAGACAAAGAAGCCACACAGCTA
-CTATCCACATAGTTTCAGGAAAAAAAATAAGAAAAATAGGCTCCGCCCAC
-ATATTCTTTTGAATTAGAATATACACGAGCCATTTATTTTGCTAAGTTTT
-GAATGTTAGCTCCGCCCACATAATGATTTGAATTTCCCGCCCATTTTTCT
-CTCAAAAATTTGAATTCCCTGCCAAATTTTTTTTTGCGAAAAACTCAATA
-CTTTCAGGCTCTTCGCGCACAGTTCGACAAACACAGCGTACACGTGGAAA
-CGGCGTGGCTATTTCAGCGGAAACGGGAATGGAGACGGGGACGGTAGTTC
-GGATGGATATTTCTCGCGTACACCTGTCTCATCACTTTTTGACATAAAAG
-TGGTCTTGTGTGCCAGCATGTTCTTGGTCTCGTTCATTTTGGCCCTTTTT
-ACACAGTATAAGTGAGTTTTTTGACACGTGGCCTGGAAAATGAGAAAACT
-CGGCCACCGATTTTTTCAGCCGAATTTTTTTAGTTTAGCGGTCACACGGG
-CTTCTGGCCATTCTCTCTGCATTTTTCGCGCTCCATTGGCATTGGCTTGC
-CGGACAACGCGTGGGAAAGTCGTGTACTCCACACGGATAAATTTGTTCAG
-TTTTACATTGAAAACCGAGCCGTGACACGCCGTAAATCTACCCCGGCCGT
-GGCCGAGTCAAAATGGCATAGTTCGGCAAATTCTTGAATTTCAAAATATG
-ATGGAAGCCTGAAGCACGTGCGGTCATAAAAATCAATAAATTATCTTTTT
-TTTCCAGAGCCGAGTCCACGATATTCCGATGTATTTTCCGATTTTTTGTG
-ATCAATAAGAATTGGATGATCAAAAACTACGATATCAAGTGAGTGGGCGG
-AGTGTAATTTCGGCGGGAAATTCAAAATTTTTCAAATTTTTCAGAAAAAT
-TTCGCGCAAAGTTCAAAAACTCAAAACTTTCGGTAAATTTCGGCGCGAAA
-TTCAAAATGTTAAAAATTTTGGGGAAATTTTGGAGGGAAAATCAATTTTA
-AAAAACGTTTGTTTGAAATTTTTTTAATTTTCAGAAATGATCCCGAAATG
-GCTCACCGCCGCGGTCTCCAGAAGTCTTCACCTGTTCCGTTAACCTTATC
-AGCTTCTGATATGTGTATCCACGTGTCATCCTAGTCAACAATTCAACGAA
-AAAAACCATTCCAGTTACAATTTCTCATTTCTTTTCACCACTTTCGGGTT
-TTTTGCAAATTAAAAAAATTTCGATTTTTTTTTTGAAATTTTAATTTTCC
-AATTTTTATTTTTATTCCACAACTCAGGTTGCTCAACAGTGCCTAAAATA
-AATTTTATTTCTTTGATTTTTTATAAATTTACAAAAAAAATACAACAAAA
-AAATAATATTACACATTCGTGAAAAACGGAAAAAAAATTCAGCCTATTTA
-CATTAAAACACGTGGAATTTGAAATTTTAGCGATATATCGATTACCCTTT
-CTCGGAAAACTCGTAATAAATGTGAAAAAGGCGAGGAAATTGGAAGAAAT
-AAATGCGGGGGTTTCTAGAAAAAAAAATTGGGAGAAAGTTTAAAGAAAAA
-TTCAAAATAATGCTCCGGTGTCATCGTGTTCCACAGTGGTTAGATTCTGG
-TATTTTGTGCATGGTGTGCTCTGAAATTTAAAAAAAAAGTAAAAAATTGA
-AAAAAAAATTTCTTAAAAATTAAAAAAAATGAACTTTTTTTTAAAATTTA
-TATTCAAAAATAAAAATGTTTGGTATACCTAATTATTCATACTTTTATCA
-ATTTTCGAGAAACTTCAATTTTTCAACTGCTAACGTATACAACTCGCGTT
-ACTCGAAAAAGACCTGGGGACTAGTTTCCCACTTGGTGGCCTAGAAATCT
-CCAGTAAAAACATCGACGACCGAGATATGAGTTTCTAGGCCTCCATATGA
-AAAAAAAACTCGGTCGGGGACTAGGTTTCCACATGATGGCCTTGATAACT
-TCAAATTTTTTGGTGACCTAGATTTTTCAAAACTTGGATTACTAGGCCAC
-TAAAAGCTTTTCGGTGGCCTAGAAACCAAAATTGCGTGAATTTTTCATAA
-TTCTATATCAAAATTGACTAAACCGAAAAGAATGCGATGCTTTTGCAATA
-TTTCAGCAGTTGGTGTATCCCACGTGGCGACGGGATTTCGGGCGACCGTG
-CCATTGATTAGAGCCAACGGAAGATATTTTGAGCATTCGGCGGTGCTCTG
-CAAAAATTTTTTTTTTGCAAAAGTTAAAGACGCATGGTGGGTCTTGATCT
-ATGAAATTTCGTGATTATTCGAAAATTTTTTGTCCTTATTGACAATTTTT
-TTATCCACAAAAAAGGCGGATGTCCTAATTGCCAAAAATGTGGGTTTCTA
-GGCCACGAAAAATAATTTTTTGCTTCAAACATCCTGCTTTTTTTCCAAAA
-TTTAGCTTTAAAAAGTCGGTGGCCGAACTTTATTAAAAGTTCAATTTCTC
-GGCCACAGAAACTTTGTTTAAGTTTTCACATTTGGATTTCTAGCCCACCA
-ATAACGTTTTTATTTCATATTTTTATAAAAATCGAATTAAAAGTAGATGA
-TGACCTAGTTTTTTTTCAATAATTTGGGTTTCTAGGCCACCAACTTTTTT
-TAAAAATTTTCTTAATTTTCCATAACCAAAAAAAAAAAACAAAATCGATG
-GCCTAACTTTTTGGCTTCCTAGGCCACCAATAACTCTTTTATTACTAATT
-TTCCTCACTCTCTGATGTCGATAAACACTTTCTTGTCTCGAATATCGCTT
-CCCACACCCATCACACTCAAATGCTCCATTCGTCTCATGAGTGAGCAAGT
-GTTGATTGAGCCCATGCTTTTGCCGGAAAGTTTTCTCGCAGTCTCGACAT
-TTATAAGGTCCATTGTTGGGCTGGGCCTCGTGAGCCGACGACGGGGCCGC
-CCGTTTTTTCGCCCTTTTCCCCGATTTTTCCGGTGAAAAAGTGTCGAAAT
-ACGCGTTATTGTCATCTAATTTTGGTACATTCGCCAACATTGCTAGATTC
-TCCTGAGCCACCTGTTGTGACGTGTGAGGAATGTGATGGTGCTGATAGAG
-GTCTGGTGGTGGCTGAAAATGGGGAATATTCCCGGCGCCGAACATTTTCA
-GAAGTTCCAGGTCGAATCGTTGTTGAGCATCCGCGTCGACTACTTGATTG
-AGGGAGACGGTGAAGTCAGTTGAGGAGGTGGATGGCAGTTTTATAGAGAA
-ATCCTGCAAAAACTCAGGTTTTTGCTAAATTTTTCAATTTATCATTGTAA
-TTTCCGAAAAATTATAGCTTAATTTTTAGATTTTTCGCTTGATTCTCAAG
-TTTTTATGCGAAAATTTAGTTTTTTGTCAATTTTTTTTTGTTTTAAATGT
-AAAACTACGGTATTTAAAGGGAGGAGCACTAATTTATGCCGATGGGTCTC
-GCAGCGAAAACATTAAATGCCTTAATTTAGCCATGCGCCTGGAAGGTTAC
-TGTAGTTTTTATTGATTGATTTTTCATTCAATTTGTGGTTTTTGAAGGTT
-TTCAACTCATTTTGAAAGGCTTTTATAGATTTTTTTTTCTGAAAATCAAA
-TTTAAATGTTAAAATAATTTTTTTTTTTTTTCACACAAAAATAACAGAAA
-TTCCGAAAAATTGCAATTTAAACAGCTCTAAAATATGAAAATTAACGCGA
-TTTTTATCATTTTTTGCTTCAAATCGCTGACTTCTGGCAAAAAAAAGGAA
-AATTCAGCAAAAATCAATTTTTCAGAAAAATTTGATTGATTTTTGGAATT
-TTTCTTACCAATCCGTCGTCTTGCCGTAAATCCTGTAGCTTCATCTCCTT
-AGCCAGCAGATTTCTTACATCTAATTGCACGTGGCAATTGCAGTTCTGAA
-AAAAAAATGTTTTTGAGATTTTTAGAAAACTTATTTTGTAAATGTTCTAG
-GTGGGTTTTCAAATTTTTTTTTAAATTTAATTAAATCAAATTCTTCTCAC
-CGTCAGTTTCTCTTTGACAAAATCGCTCAAATTCTTCTGATTTTCCTGAA
-CTTTCTCCACTTTCACGGCCAAATCCTGCTGCTCACGCAAAAATTGTTTG
-ACAAGACACGTTAGCTGGTTCACATTTGATAGATTGTCCGGGATTTTTAT
-AATCTGAAATTTGAAATTAAGGATTTTAGCGGTTTTTTCGGCAAAACGTA
-AACTTTTAACGCTGAAAACTCACATTTTTCGAACTCCGCTCCAATAATCG
-TCTAGTGAATTCTTGAATAAATCCGGTTGCTTTCATAAAATTCTGAAATT
-CCTCATTTCCAATGAATTCGCCCATTTTCCGATGGAAGAAAAACCAATGG
-AAATACGGCAATATTTGCGCACAAAATCGATGCTGAAGTGTCGTCGGACG
-CAGTGTTTCGTGTGCAGTACACGCCTACGACAAATTGCGGACTTTTTTGT
-TATGGAGAGAGTAGAATAGAGAAGAAAAAAGAAGATAAAATGGATAAAAA
-TTGCGCGTTTTTCTCGTTTTTTCTCTGAATCTCTCAATTTTTAGGTTTTC
-GATCCATATACGTCCCGAGTGGAGATGAAGCCATAAATTTTTCTCTAAAA
-ATTGTTTCTTGCCCCTCCAAATCGCTTATTCGTTTTTAAAATTATGAAAA
-AAAAATGCTAAAAATGCTTACCAAACCGCAAATTTTTAATTGGAAAATAC
-CCAATATTTTGCAATTTATAGTTTAAATTCAAGAAGGTGCCAAAATTTCT
-GCAAAATTGCATATCTTCATATAAATTGTTACATTTTTTGTAAAAACTTG
-AAAACCCTGCTTTTCACATAATAGTACTGGAATTTTTCAATTTTCAACAA
-TTTCATAATTTTTGACCAATTTTTTATTGAAATTTTCAATAAAATATTTA
-AAAGATGTGGCTTTCCAAGCAGATTTTCCAATTTTTCCGAGTTTGAGTAA
-CTAAGTTTCAACCAAAATGATGTCACAAGTCAGAAAATTTCCCTAAATTT
-CAAAACACAGGTGAATAACTATAGGATTAGAATCTGCAAAGATTGAGTCT
-GGAGATAATTTCGGACATTTTTTCGGATAGTTTACGTTTCCTGTAGTTTC
-AAATAGGCAATTTTACTTTAAAGGTTGCTAATAAAATTAAGAAAAATCCT
-TATATAGTCTCCACCCACAGATTGGCTTTTTAGATATTTTCAAAATATCT
-TGTAACGAAAACTACAGTAATCTTTAAAATTAAAATTATTACTGTATTGC
-TTTTGTCCATTTACGGGCTCGATTTACGAAATTAAATTTAATAATCTTTA
-ATCTATAGAATATTAAAATTAAGCAAAAAATGAGAAAATAATACGAAGAA
-ATGAAGGAAAATGGAATATCGGTGTAACTATCCGAAAATAAATTCATTTA
-GAAAATCGAGCCCGTAAATCGACGTTACGAAGAATTACTGTAGTTTTCGC
-TACGAGATATTTTGCGCGTCAAATATGTTGAGCAATACGCATTTTAAGAA
-TTTACTGTTATCGTAATAGTTCAAATTTTTCGAGATAATAGTCTTCCAAA
-AAACTATTGTTTAAGGTTTTATTTTTTCCGTAATCTAAATTGATTATCAC
-TAGACACTGTTCATTAATCATTCAGAACTTGTATAATCCATCTCGGTTAA
-ATTGTTGGTGAGACAAAGTGTAATCTGTTCTAGTTGGGTCACACGATCCC
-TTTTCCACTCAATCGCTTACCCACTCAACACTATAGACTAGACACTCACA
-CAGGAAATAGTATTGTTTACCTGTTTTCTTTTGGACACTGTTTATAACTT
-TTCCCTCTCCGTTTCTCTACGTTTAAATTTGTCAAAAATTAATAATTTTC
-TTACTTCCACATTCAATACTCATTTAATGACCGGTATTTGAAAATATTTT
-AATTTTTTAATCTTTAGTTATTACAGGAACAGTAAACTCTGGGAATTCGT
-ATTGCACAACATATTTGACGCGCAAAATATCACGTTAGCTGGCATAATAT
-TAGGCATATATTGTTTCTACAATCTTGTAATGTATAACTGACTAACATCT
-TTGAAATAAGTTTGTAAAACTTGTGAGTTGGAAAACATTGTGCATGGATG
-TCGTGTTTCGCGCACGCGCTAGAGTAGTCATAAAAAGATTACTGTAGTTT
-TCGCTACGAGATATTTTGCGCGTCAAATATGTTGTGCAGTATGCATTCTC
-AGAATTTTGTGTTCACGTAATAAATTAAATTGTTAAAAGATATAATAAAA
-GTTAAAAGATATAACAGATTTTTTCTCACTTCCCTAATATGTTTAATAAT
-CAATCATTTTAAATTGTGCCGAAAATTTTCCGTTTTCCAATTGTTCGGAA
-TTTTTTCGGTTTTGCTCGAAAAAACCAAAAAGCAAATTTTTATAAATTTC
-CCTGGTGTTCAAAATTTTCCCGCAATTTTTACCTATTTTATTTTCAAAAT
-ATTTATTTATTTCAGTTCCCCCAAGTCAAACCGTTCGATGTTGTAGAAAT
-GGAGATAATTCCGCTGCATTACGGAGCACAAGTTGGGATTTATGACGAGG
-ATCATGAGGTTGGTAGATTTTAATTTGTTTTTTAAATCGTGGCCTAGCAC
-ATTCTAGGCCACAGGTAGTGACGTCACTCTGAACATTTTCAATATATGTA
-AATTTTAAATTCAAACTACTTAAAACTCGGAAATCACTTTTTCCGTCAGA
-TACACAGAAATAAACTAGTTTTACCTTTTAAAAAACTAAAACCATTGAAC
-TTTTCACAAATGTTCTTTGAAACTTGAGATAATCTGCAAATCCCAAACTA
-TTAAAAACTGAAAAAGGTAGCCTAGAAAATGAAAATTTTCAATAGTTTTT
-TCAAGTTCAAAGAAAAAAAATTGAATTTTTAAATTGTTTTTTTTCGCTAC
-AAGTCAAAATTATATTATATTTATTAGTTTTTTTCAATTTAAGAACATTA
-CTAAAATTAGTGCATATTTAAAAAAAATGTTTGTTTCGGAGAAAACAACT
-ATTAGTAATTGCACTGCAATCATCAGATTAGTGAGGAATTTAGTTCTATT
-TTTTTCTTTTTTTTCTGTTTCAAAGTCGTTTTTTCATGAAAAATAGACCT
-TCGAGCTACTGGTTTTTTGAGAAATATTATTTCAATTTTCAATTTCATGA
-TGAACAACATTTTTGGTAACACATTTAATTCTAGTAGAATATTATCCACT
-TTTTCTCTAATTTTTCAAAATTTATTCCTAAGTTTTTCTGATCAATGAAG
-AACTACCTTTTTACGACAATATTGCCTTCAATTTTTTCTCTCTGAAAATT
-CGAAATTTATCTGAATCAATGGTGCCGGTTTTCTTATTTCTGAATAACGA
-AATAGATTTTTTATTTATTTTTCAACAATTCCCGGAAATTTCTCTATTGT
-TAAAAACAAATGAAGTGAAAATCGATTTTTTTACTTCGAAAGTTTAACAT
-GAAATTCGATAAATTTAATCTATGATCTTTCAAGCTCCGCGAGTTTGAGG
-CGGGATGTTGATAATTAGAGATATGCCGGGGGAGAACACTACTCTCCAAT
-TATATTTCGGTTGCTCGAGAAATATTTTTAATGATAAATACTGGATACTA
-GATTCTATAGAAAACTAATTTATTTCAATAAATTTATTATTATTCAGGAG
-AATTATATTTTCTTGCTCGAAAGAAAATAAATAATCAAAAACCGACGCAT
-TTTCCTGAATTTATAGTTATTCAGAAGAATATAGATTTTTATTTTCAAAT
-TCTGAGAATTCAGAAAACATGGCTATTTGCCGGCCTAGAAAATAGAACAA
-CTAGGCCACCGATCATTTTTGTTTTGCCGTTGTCAGGCTTCTGGCCTAAC
-TTTCTCTATCTTAAAAGATTCCCAAATTCAAACTACTGGCTTTCCAAAAC
-CTTCAAATTGTGGAATGAACTTGTGATTCCAAAGATCTGATGTCAAGAAT
-TCAGTCCATAGTTCATATACTCCAACAACACTTTTGGAATTTTAAATCTT
-CATGGTTTTCAAAAAGAATCCACCAAATTATTTAGCAACGGGGTTTTCCC
-TTCTAAACAATTGTGTGACACAAATCATAATCTCCGTCACTTTGTACAAT
-TTTTCTAGTTTTGGTGATTTCCCCTCATGAGCTCAACGCGGCGGAGTAGA
-TCTTCCATGCAGGCGTTAAAACGCCTGCCTGCCTGACTTTAAGGCGGCCT
-CCGCCTGCCTAACGCTTCAGTCCTAGTCTTGTGCTAAACCATACATGAAC
-TATTTTTCTAATTCTTAATTTGGTTCTCATAAAATTGATAAAAATTAGGA
-AAATTTGAAATCTGAAATTTCAAGTAAAAATGGGCGGCAAACTTTGTATA
-AAAAAAAAAAGAAAGCTCGGCCACCAATTTTTCAAAGTTTCTTACCGCTC
-TCTGTCTTGCCTCGGGCAAGCCCTAAAACTTTAGAAAACATCCCCGAACA
-AAAAAGTAATAAATCCTTCAAATGTGGGAGATGCCCCGTGTATATGTCAC
-CTGTCGACTCGTCGAAAACGTTTGTGCCACCCGGCTCTTTACCTCGTCTC
-CTCTTACTCATCATTTTACTGCCCCCGTTGCTTTCCGGCTAATGAGGTTC
-TTAGGGCGTAGGACGCCATTGATTTGTGCTCTTTTCAGGCAAAATTTTAG
-ATTTTATTTCTCTGATTTCACTCAATTATCAGACAATCTAAGTTTTTTGA
-CATGTTCAATGCTGGAAGCAATTTTCGATTTTTTTATCGACCATGGCCTA
-AAATTACGGGTCAATTTCCTGAAACGGACGAACATTTTTGAAAGCAAAAC
-AGTTTGTAGAGTTTCGCTAAAATTTCTGATTTTTATCGAAAAAATCGGGC
-ACACCAAACAAAAGTTCGTTTGTGTCAGGACCTTGACGGTACGCAATTTT
-CGGACAAACCACGTGTGGCTGATTCAAAAATGTCAACTAAATTGACATCT
-TGAAAACATTTTTTTCACCTGAAAACCACTAACAGTGTCAGGTTAATCCG
-ATTCAAGCGCTATTTTTATGAACTTTCCTGAAAGTTTAATTCCACACGTT
-GTGAGGGAATTTGACACATTTTTAGAAAACCTGATCTCACGGTTAATTTT
-TAAACACTTCGAGGGCCCAGAAATCCTAGTTTTTTTTCTGGTTATTCATA
-GTTTTTCTAGAATTTAATTTCACATCTACATTTCTAAACAAAACTTTTGA
-AGGTCCTTGTAATTCTTCTCTAGTTTTTTATTGTCAAATTAAGTTTTCTC
-CAAATTAGGAAGAAGCGATAATTGCGGGTTTTGTGAGGGAAGTTTGTCGT
-CGGTCCATTTGTTTTGAAATGAGAATCGGAACGATTTCCTGTCTCCCGTA
-GAAACCAATTAAACGAAAACTTTTTTTTTTCATTTCGTTCATTTTGCATG
-CTTGCTAGCCTCGTCTATTGGAATTCTTTTGTACTATGATTCTATTCTAG
-TTGTGTCTGCATTAAAAAAATCGATTTTTTTGTTGAGTATATTTATTTTT
-CAAACAAGCCGAAAAAATAGATCAAAACTGAAAATTTTATAAGAAAAATT
-TCAGTTTAAATCTAGTTTTTTTTTCAATTGGCCAACTTATAATTTATATA
-TACTCTCAAAATCAAAAAAAAATGCACATTCTATATTACCCACAAACATC
-GAAAATCCGCTATTCCCTCAATTATAAAAAATGTGAGAAAATCCTCGATT
-CTTGGTTGCTATGAGACAGATTTCAGATTTTTCACCGGATAAACAAGACG
-TTATCATTACTTTTCAGTAATGCGCGTTTATTTTTCTATTCCATTTTTCG
-AATTTTGAGATGTTGTATTATTTAGAGAGCACGAAATTCTAAGAATGCGT
-ATTGCGCAACATATTTGAGGCACAAAATATCTCACAGCGAAAACTACAGT
-AATCCTTTAAATGGCTACTGTAGCGCTTGTGTCGATTTATGTAAATCATA
-TATTCGTCGATATAATATTGAGCGAAAATTAAGAAAATAATACGAAAAGC
-GAAAAATTAATATCGAAAATCGAGATTCCGTAAATCGACACAAGCGCTAC
-AGTAGTCATGTAAAGAATTACTGTAGTTTTTGCTACGAGATATTTTGCGC
-GTCTAATATGTTGTGCAATACGCATTCTTAGAGTTTTGTGCCTCCCGTAA
-TATTATGTACAATGCGTATTTCCTCTGCATGCAAGACTAATTTCCGATTG
-GTCTGTAGAGGTGCAGTTGGCTGGCTGACTTTTAATACTTATGTTCCTTT
-AAATTTTCAAGTACGATTAGGAACCCTTTCTCTCAGAATTTCACTAGTGT
-ACCTTAATGTTTGTCTTTTGCTACCTGAGACGATCATCAAGTCTTTTCTT
-TTGTTTGTATTAGATTTCGCAGTAAAATTGTGAAAAAAATTGCAAAAAAT
-TGAGAGCAAGAGCAGAAATGTGCACTTCTCGTTGTACCACGATTTTTCGT
-TTTCCCACTAAATACCTATACGTATAGGATTATCCAAAGATGATCCCGGG
-GATCACCAGTTCTTAGTTTCCTTATCAATTTTATATTACTCGTATGCCTT
-CCTCGTTTTTTTTTCTAAAGCCATGAAAATCATAGGTATCGCCTCAGCGG
-GTCGTAGAAGGAGCACAATGTACTCGAGCTCGTCACGAAGACCGTTTCGA
-CGGCTGGTTCCGCTTAAAATGGTTAGAGAACTGGGTCTTGATGCGATCCT
-AACAAATTTTTTGAATCTCTAAATAGTCCCTATAGATCATGTAATAATAT
-AGGTTGAACGTTTTACAGAATAAAGTTTTACAATAAACTTTATAGCATGG
-GTGTGTGGCAAATTTGCCGGACTTGCCGTTTTCCGAGATCGGCAAATTTG
-CCGAGTTTGCTGCACACATGAAAAATTTTTAATTAAGATTTTGTGCAAAA
-ACTAATGTAGCCCCTGGTTTACACCTTTTTACGATATTCTGAGTACATTC
-GAAAAGGATGTTTTAAATAGATTGAATATCAAATCAAAAAAGAAAGTTGC
-ATGAGTATTATATCTAAAAACTTTTAAAGAACACATTTTCAGGCACAAGG
-CCGAACGGCAACCGACTACGCGGGTCAGGACTACGATGAATGTTATGATA
-GGTTAGTTTCTTTTTCTATTATTTCATTCAGAATATTACGAATTAATGCT
-TAAAAAATTTTCAAATTAATTTTCAAATCAACCGCCTTAGCTCCACCCAG
-CTCTCTAGATCGCAACCCGCAATAAAGCCCATAAATCAGTGGGCAGCTGC
-TGCTGCTCCGTAGTGGATCAGTCTGTCGTCTCTCCGATCAGTGCGCTCTC
-GATGATACTCTCACATTTGACCTTTCTCGCTTTTTGTAAACTATGTGCTG
-GACACGTTGAAAGTAGTATCAATTGCACTTTTCTGGGTAGTTACCGATAA
-AATTGCCCAGATGGAAGAGTTTTCCATAACAATTTCTCTTCCATTTTCAT
-CTATCAGCTCTGTGGCCCCGCTCATTAGTGTTTCTCTAGCCGATGCTGTT
-CCAGGTTCCCATGGCAATGTGTACATGTGTGCCTAAAGTGAGCCAAAATG
-CTCTTTGAATTATTCATTCATCCTATGTTTTTTATTCGTCCTCACGTGAC
-CTGCACCACACTGCGCATTAAATATTAATTGGCACTGAAGAGAGCCGCCG
-CTCGGGCAAATGTTTAAATTTTAAATTTAATTGATTTATACATATTTGAA
-AAATGAGACACTATGTTATTTTCGCCGAATTCGTTCTCTGAGCATTGCGT
-TCATATCTTTGCACCTATATGAACAATTAAAATAATTTGTGTGTCCGGTA
-ACGAAAAACCCGAAATAAGTCTTGCCTATACAGGAGTTTGTGGAAAGTTT
-TCAAAATTTTTAATGCAAACAACGAAGGAAATTGGAGACGTAATACGATC
-ACTAGCAATCTGAATTTCTACTTTCAAAACGTTTTTTTCATAAGAAACTC
-CATTATCCAAAATCCGGCCACCTTGCTAATCCTGAGTCCATAATAGGCAT
-TGCTAAGGCAAATCTAGGGCTTTTGGCCGATAAAAGACTTTTTGATAATA
-ATTTCCAAGCTTAAACCTTATTCATATTACTTTTAGTAATCCTATAAGTT
-TTGTTTGCAGTGGTTCAGAATTGCCGAACATTCCAAGTTTTTTGATAAAG
-GTTTTACATATATGTTGAGCTTAAAAAATAAACTCAAAAAAATTAACAAT
-TAGTTCATACGTTATTAATTTCAACGAGTTTTAGTGTAAATATATATGTG
-GTCCTCTATATATTTTCCGTATTATTATTATTATTGATTCGCTCCAAAGC
-TTTAATTTCAGTCTCAAGACTATACTGCTCAACTGTGTTTATAGTAGTAT
-TTTCAAACGAACAAAAAGTGACAATACAGTATACTTTAAACTAAAAAAAA
-CTTTGTCGATGAAAGTCTATCGATCAAACTAGCGAAATCCGCCCGTTTAA
-TCCGTTTTCCCGCCACCATCACTTATTGTGTTTTCATAGAGCTTTATTTG
-ACGGAATTTCCTTTCTTCTGATTTTTCATATTTAACCAAAACTTACTTGA
-AAGAATCTTAAAAGGGATTTTTACAACTCTCTGGATCAGATTTTTCGAAT
-TGTTTCATTCGCAAAAGAAGAGCGACTCACTGCTATAAATGCAACATTCA
-CCACACTATCTCCACAATTTCATCTATTAATTCATACAATGACACTACAA
-TAATCCCCACTTGCTCAGAATTTGTCTCTCCCGCGGGGGACAAATTGGAA
-TCAATCATTCTGTCGGTCGACCATTGAACCACCACCACACAATATGGTTC
-AGCGGGGGGAGGTCCAGTTTTATTGTTATTACGTATACTGCTAGGGGAAC
-CCAATTTTCGGACCCCGCGCGGAATATTCAAATTGGAAAGAGTGTGTGTG
-CAAAAACTTTGTCCATCTTGTGTCCAGCAGACCAGCCAGCAGCTTCTCAA
-TTTCCGCTTCAACTTTCTCCACTTTCCCATGGGACAAACCTTTTGTCTTT
-CTTCTGGCTTCTCCTCTTACTTCTTATTCTTCTTCGTTGCCCAAATTGTG
-CTGGAAGAACTAGAGATGCTGAAAAGAAATAGGAAAAGAGCACGAAGACA
-ATATTTATGTTTTGTTTTCCATGGTTCGCCTCGAGTATTTGATTAGGCTT
-CTCCTTGTTGTCTTCACTCGACGTCGTGTTCTCTATTTTATGTCCACTCT
-TGAATTCCTGGAGTTTTCAGTGCACGCATTTGTTGAGCTGTAAGAAAGCT
-GCAGGAGTTTCCCAGAATTTGATCGATTTACGGAGCGGAGTGTCGTACTA
-CTTATTTCCGGATTATAAAATTCTGAGAATGCGTATTGCACACCATATTT
-GACGCGCAAATTATCTCATAGCGAAAACTACAGTAATTTTTACGTTTCGA
-GAATCGAGCCCCCCTAAATCTACACAAGAGCTACAGTAGTAATTTAAAGA
-ATTACATTTCCGAACCTTTCTCATTTTTCAACAATTTTTTAACTTGCCTA
-GCGTAGCCGAAAATTAGCGGTAATCGCTTCAAGACCCAAAACAAGCCAAT
-TTCATCAAATTTCAAGTAGAATTTTGTGAAAACAACCGTCACTACCATTC
-TGATGACCCTTTACTTCGACCGCCCAGTTCGTTAAACATTTTTGAATTTT
-GTTCACCTGTCTGCCACCACATATCTTTCTTCATCAAAATTCAACGTGCT
-GCGATCATCATCTTCATCTCTGTCTCTTCATCTCGCCCAAATTCATTTCC
-GTCACTGCGTCTCGTACTGATTTTTTTTCATTTGTCTCCAATCATTTAGA
-GGCCAAAAGACCTCCTCTCAATTTTTTTCTGTCTGTCATTGACCCCTCAG
-TTGCGAACCGATTCAGAGTTTACATAAACAAGCTCGCTTTGTATATAATG
-TTGAGTGAGCGAGAGAGTGAAAGAGAGAAGACGCAGGAAGCTAAGCGTTT
-CCTTTGTTTCAAGCTCTGTCAAATTGTCAATTTTCTAGCTAGAAGATTCT
-TATGAAGTTTTGAACATTCTAGATTTAGTTTGTTACCTACAACAGGTGAA
-TTTGTCTTTCTTGTCCAGAGATAAAACTTATCGTGGCCTTTTCCGAAATA
-GTATCAGATTTCCTTTGTACAAGGGCTTTCGTGAGGCGGTAAATCGCCTG
-CCTGACTTTAAGGTGACCTCCGCCTGCCTCTCGCCTCAATACGTTATGCT
-AAAACAAACGTGAACTTTTAAAAAAATTTAATTTTCAACAAATTGATAAA
-AATTTAAAAAATTTGAAATTTACCTGCCTACCATAGAAGCCCTACCTTGT
-TCCACTATTGATGCGATTCATTCTATTACAAATCAATGTAACGAACTCCG
-AAGTTTGATAGCCCGAGGCGTTTTCCTTGTTAATTTGATATCGATTATCA
-GTTTGACCAACCAAACACCATCGATTTGGCTTGATTTTCAAGGAATTTAT
-AGAATTTCGTAGAGTTTTGGACTATGTTTTGCATTTACGTTGAATGGAGA
-GAATTATATTTGAATAATTGAATAACTTGTTAATGGTTCAAGGATTACCC
-GTTCCGAAGTCTAGAAATGCCCTGGCGATGCTCCCGTCGAGAACTGTAAC
-CGATAATCAATCAATATTGCGGGTATTAATTGGCTAATATTCATAATCCT
-GAAAAGTTATTTGAATAACGGCAAACTCCCAAGAAACATACCATTTCCGA
-GGTGTATGAGAATTTTAACAAGACCTTAGGGTACATAAGCCTATCAGTTT
-GAAAAACAATGTCGGAATTTGTGCTTCCATGGTAGACAGGCGCGGTTTCA
-GGGTCTGAAGCTTGCCTGAAGGCCAGGCAGACAGGCGTTTTAATTCCTAC
-ATGGAAGCCCTAGAATACAGCATATACGGTACCTAAGCCAATTATCAAAT
-TTTACTTTTAAAAATTCATTCCACAGGTGTTCCTGTTCTGCTGCATCATC
-GTCACACAGACACTTACACGCGCCTTTTCACTTCTCATTTCCCACTTTTT
-CTTCGTTTTTCTCGCTTTTTCTTCTTCTCGACACGAAGAAGTAGGATAGA
-TCTAGAGACGTCGAAAGCCATAATTGTTTCCGTCGGCGTCTCCACGCGCA
-CTCGTACTGTCTACAAGTGCCACACACACACTTGAAGAAAATAGAGAGAG
-GTGCAGGAGGAAAAGGAGGGGACGACTTCTGAAAGTGTCGATAACTACCT
-CCTATTTGAGTAAAGAGTGCAAGAAATATATGTGCGTGTGTGTCTAATGA
-GAGGGTCTTGGAGCGATTTTTAAGCATGTACAGGCATGAATCAGGCGGCA
-GGTTCCAGCCAGGCTCTGAAACCGCGCCTGCATACCAGGGAAACCCAACG
-ATGGTTTTTCTTTGCCCGGTTGATCCCTTTCTTGGATAGTTTTAGTCTTC
-GTCCGTTTTTCATTCATACTCTTTTTGTAACTGTTCAAAAGTCTAGTTTC
-ATATAATCAGAAATTCGAGAAAAAGGATTTTTCGAGGCTCTGAAAAAAGA
-TCCCAGAAGATTGTGTCTAATTCTAATTCTCTACAGAAAATGCCCAAATC
-GAAAATTTTTCGACAGATCCTCGTATTTCGAAATTCTGGAACATTCGGCA
-AAGCTGAAAATGTCACAACTTGCCAAAATGAACATTTTCGGCAAATCGGC
-CAATAGCTGTATTTTTCAAACTTTCGGTAAACCGGCAGTTCGCCAAAAAA
-AATTCGGCCATGGTCTAGACTCTAGAGTTGGGCGGCAGACAATTATTTCG
-GGCAAACGCAAAAATTAAAAATGGAAATTGGTGTTCGGCAAATCGACAAT
-TCGCCGGAATTGAGAGTTTCCTGCAAATTCGGCAAACCGGCAATTTGCCG
-AAGGGCAACTTCTCCGAACTGACACCCCTTCCAAAAATCCGAAATTTTTT
-TAGCTTCACCCCCTTCCCTCCCTTCTCGTTTTCTAAAAACCGGACACACC
-TCTTACAATTATTACAAACACCACTACGTACGTATTAAACGTCTCTCGTA
-ATAAGTGGGGCGCCAAAATATAATGGTTTTTGTTGTGTTTAGTTAGCCTC
-CTCCTCTCTACTTCTCCACCATCATCAAATCTACCACCACAATAACATTA
-ATTCGATCATCAACTGACTACTTTTGTCTTTCAATGTGGATTTGTAGTTG
-TTGGTTATTTGAATTCTTAACTATATATCCATCCCTATGTTGAAAATTTG
-AAATTTTTGGTAAATTTGAAAGATACCAAGTTTATGTATATTATAATATA
-TTATAAAAATTTCCGGTAAATTGATATCCTGCAAACGGCAAACCGACAAT
-TTGCCGGAATTGAAAATTTCCGGCAAACCGCAATTTGCCGATAATAAATT
-TGCCTTTATTGATTCTAGGTTTCGAAAAATTACGTGTTCCGTTTTTTTTT
-TGAATATTAAAATAGGAATATCAGAATTTTTTATTTTTTATTCTGCAACT
-TTTCAAATTATGTTCAAATTTATTATAAAACTATCGTAAGTGTGAATTTG
-CAATTAATTTTCTTATTGCTAGGTATCAGTTTTACTAGGGCTGTCATGTA
-TGTACCAAAACGCCTACCGCGCCTTCTGTCTAGTGCGGTGCGGAACCCGA
-AAAGTGTCGGAATCATCTTTCGCAGTATGTGGTGCTGAAACCAAGCCTTT
-GAGTTCTCGCCATAGTGCGGCGAGAGGCCGGCATGAGGCGGGCAGGTAGG
-AGGCAGGCTTCAGGAACTGTGTCGCGTCTGCCTCCCAATCCCAGAATACT
-TTTTTTTTCAAAAAGTTGCAATGGAAATCAGATTTTCAAACGCAACCTGT
-CTTCCTCTTGTACTCAACTTTTACTTGATGATAGTCGATAAAGGTGTGAA
-CGCGGTGAGGTGTAACCGTGTGACAATACATCATTGTATTATTCTTTTTC
-GCAAAAAAAAAACATTCTTTTGGGTATTATATTCTACCAATGTATCTTTC
-ATTTTCTCGATTGATTTTTTCTCCGGCGAAAAGAAAACAAATTGAAAAAA
-AACGTCAAAACATAAACATTTGGAAAATATAAAGGTGGATATAAAAACGG
-TTTCTTTCTTCTGGAACATTCATTTTTAACCATTTTCCTACATATTTTCA
-CGCTAAGCCGGAGCAAAACAGAGACAGTCGAGACTGTCAAAACATGTAAA
-ATATACGTTTTTTGGTATACCTATTTATTAACAGGTGCTCCCTTTTCTCT
-AAAAGTTTAAATTTGTCGCGAAAAAATGCAAGAAATGTTTTTTTTCTAAA
-AACTAAAAACTCGATCAAAAATAATAATTGGGTATTTAAATATTCCGGAA
-TCTCCATTTTCTTCCCGTTCCTGCCCTTCCATTTTTTTCTTCCTGCACTT
-ACTCGAGTATTCATCCTCTTCTACTGCTGCCATAAAAGGTCTTCCGCTTC
-ACTGAAGCCTTCTGCACAGCAGCGTATCCTCCCGCTTCATATCTCGTTGC
-TGAACTCCATATAGCTTGTTATAGCTCAGTTTTAGACGGATTTAGGTTCG
-AATTTCTGTAGGGTCTCTAGGAGTACTGTAATAAGTGATGTGTCAAAAAT
-TTGGCCTAAACTGTCATTGCTATAGATTACGGTGATAGAAATTTGAATAT
-GTATGAAATAGTGAAAAATCAGTAGACTGAGCCTTACTCAAATTCACATC
-CGTTCGAGATATTTCTGAGTTCTGAATTTCTGTTGATTGCAATTGCCGTA
-ACTTATAGCAAGGAAAGAACAATTTGAAGCCGAATTTACGGCACAAAATT
-AGTTTTGGTGCTTCTAGAGCCTATTTTATAAAATATATACTTGACACGTG
-GCTTTTCAATATCACCATCTCAAGAAATTACCACAATCGTTTCAGGTGCG
-AACAAGAGTGTGGCGAGGAGGCGTGGCGAATCGCGTGCTGCTCACGAGTC
-GGGAAGATCGCCATCCTTGTCATGTCAATCATTGTATTATATCTTATCAT
-ATCAGGTTGGTTTAAATACATATTATTCAAATTTATCTGAGTTTACACAA
-TGAATTTTCAGCATTAACGCCCTCCGAAAGCACACACAAGACGGACCTCA
-ACGAGCCGCGGCCTGGTATTAATTTAACAAGGTGAGAATGTTGGGAACAT
-ATTACTATTGTAGGAAATTGCTCGATAATTCCACACTTATTGAGTTCACA
-ATTAATTTCTACTATATTAACTGTGTTTTTGGTAAAGAAGTATCACTTTT
-TCCCCTCCCAACTCCGATAATTCGGCATTCCTAGAGTTTTAACACAATGT
-TTTACGACATACTTATGAAGAGTTGATGCAAATCGCAAAAAAAAAACAGA
-AAAATAACTATTTTATGAATAGTATCATTATCGTATGGTGTCGTCAAAAT
-GTTTTGTTGTTTTAGTTTTTTTTTACTCGAAATTTTCTGAAAACACCGAA
-TTTCATATTGAATCAAATTTCTTGATAATTTATTAGACATTTCGATTTTA
-CAGAGCCAATCAAGTACTCACCGGATTATGTGATGCCTATGAGCGAGGAG
-ACGTTTCCGGAGACTCTTGTAATCGACTTTGCTATGATCGAAACTGGCTT
-GTCACTGACTTTTACGAAGGGCACAAGACTGTGGTCATAGTGAAAGATGG
-CGGACAGATTGCTGTCTATAAAAGCACAAAACCGTTTATGGATCAATTCG
-ACGAGCCGAAAGACCATCTGACGGATGCAGAGTTCTCGGATCGAGTAGTC
-GATATGGTGAATGATGAGCTGAGACTCGGATGGCCGAAACACTATCGACG
-GCATTTAATGGAGACTGTGTGGCCGACACTGTTACGGACCAAGGGAGAAG
-CCATGTCGAAAGCGGATCGACGATCCTTGTGGGCTTTGTTAAAGCAGCCT
-GAATTCATCCTGTTCCGAGTGTTACCGTTGACACGTGTCACGCCGAAGCT
-CATTGGGACGTGTGGACATATGTATCAGACTGAGTCACTGGTGGCGTTCA
-AGATGAAAGGGTATTATACGAATTTGAAGGTGGGGATTTTTTTTTAACTT
-GATTTTAAAAAAAAAATTTTCTCAATCCAAATTTACAGGCAAAAATCTTG
-GTGCATGTCATGGGAACCCTGAAGCTCTTATACGAATTTCTCGACGAACC
-CCTTCAATGGTGTGATGTTCGATTTGATAATCTCGGGTTATCAGCAGATT
-ATCCGAAAAGGTAGGTCTGCCTGTTTTTTTATTTGATTTTTTTTTCCGAA
-AAAATCTACATTTTCAATTATTCGAAACGTAATTCGAATAAAAGTTATTA
-ATGATTTTTTAAACAAAAAAATTGATGATAATCCAACCGGAAACTCAAAT
-TTTGAAAACCCCTAAAAATCCAAATTTCTCAATTTTTCTGCAGATTCGCT
-CTAATGGACGGTGACATGGTGTACACGAAATCGAAATTGGATTCTCTCCT
-AAAAGGACGTCCGTGTGAAAGTGATAATGATTGTAAAATTGGAGACTGTG
-AGGCGAGATGCACTTCTAATATGGTGTGCTCGTCGAGGAGTAACGGGAAT
-TTGGAGGTAAGCTTGAAAGTTGAAAAAGTTTGGAAAAATTGTGAAAAATC
-AATAAAATCGGCAAAAAACGAGCTTTTTTCCAGATGGCCGAATTTTTCAT
-AGTTTGCAAAAGTTCGTCCACCTGTGAAAAATTGCTAAAAAAGCAACAGC
-ATTGATGAATATTCATAAAAAACCAATAAATTCGACAAAAACCTTTTTGA
-TTTTTCCAAAAATCGAAAATCACATTCTGATGTTCAAATTGAATTTTCAA
-AAAAAATATAGAAATTTCCTAAAAGTTTTAATTCTCAAAAAACGAACGAC
-TGACAAAAAATTTTTAAAAAAGTGAATTTTCCGAATTTTTTCTAAAGAAA
-AACTGAAAATTTGAGAATTTTCAGTCAGAAATGTGATTTTTTTTTTGATT
-GAAAGGAGTTTATTTTGTAGAATTTAACTTCCACTATCAGAAAAAAATTT
-ACCTATTTACTTTGTAATAGGAAAAAAGTTGTGAAATTGTTAGGAAAATT
-TTTTTCAACTTTACAATTTCCCGGACAGGCCTGTAGTTCCTTTTTTTCAA
-AACGTAAAAGAAAAAATTAATTAAAAAGTTCAAACTCCTAGAATTTATAC
-ATTTATTTTGCATTCTAAAAAACAAAGTTTTTCTTGATTTTTTTGTGTAA
-AAATTGAAAAAAAATCCAAATTTTGTAGGTCTTCTGCGATAAACTGGTCA
-ACAAACTGTTCGCAAATCAATGGTCCAAAAATAATAAATATTTGGTCGCA
-TGCCGGGATACAGGACGAAATATCACAACTCGACTCAACGAATTACGGTT
-AACATGGTCATGGAATCTGCCGGATGTTTAAAGGAATCTAGCTCAATTCT
-TTCTTTTTTTTTCTTCTACTCCATGTGTCAAAAAATCCCCGTGTCTTATA
-ATTTTCTGGTGCTTTTTTCCATATTTTCCTTTTTTTGTGTTCTGGCTCAT
-TTTTCCATGGCTCACAGAGCCCGAAAGCTTAGGATTTTGAAATTTTATTC
-GTTTTTTTCTCATAATTCTGTCATCATTTTTTGCTCTGCATCATCATCAT
-CATCGTCAACATCATCGCGTTTTATTATGGGTTCATGTATTATTACACTT
-TCCTCGAAAAAAAATTTTGACGAACGTGTAATATGTTTCACCTTGTCTCA
-TTTGTACCTCGTTCATTGTTACGGGTTTGAAGTTTTAAAACTCTGAATTT
-ATATGAAGAATTTTAATTTAAAAAAAAACTTTGTTTCCTTTTTTGAATTT
-TTACAGACAAATTTTTGGCTTGAAAACTGAAAAACCCTGACTAAACTTAC
-TATTTATGTGTTGGGTATCAACGTGTATTGACCCACGACGTGGCTAAGAA
-GATCGTACAACGTGAACTCTATGAACTAACTTATTTATTCCTTAGTTTAG
-TAATGTAATAAACTACTCGTCTTCTCCTCCTCGTCTCGCCTTCGAATACA
-CAACATTATGAAAAGAGTTTTTCTTAAGATAAAAAATGTTCTAAAAAATC
-GATGGCCGAGTTTCCTATTTACGCGGCCACAAGACCAGTAAAAAAGTGTT
-AACACAAGTGCGAAAACTAGAACATTTATTTTCAAATTTCACCCGATTTC
-TACAAAAAATCAACAAAAAAGTCACAAAATTTAAAATATGAACATAATAA
-TCAATATCCCGCTGGCGCTGACTCCTCCCCTTTTCGGAAATCACTGTTCG
-CATAGATTTGGCCGTCGGAAAGTCGTTCGGCGGCGGTGACAACTGTCAAA
-TTGTTCACTGCCTTCATTACGTGACCACGATCGATCAGGGATTTCACGTA
-GGCTTTCGGGAAGTTTGGCTCGTACCACGTGTAATTTGGCTAAAAAATAA
-GGAAATTGGGAAAGGTTTTGATTTTATTGATTGAAAAATATTTCATGTGA
-AAGTCGAAAATTGATTGAAAATTAAATTCAGAAGTTTTTTTTCTGAAAAT
-TATTGATTTTTATTTTTAAAAAATCAACTTTTTGACAATTATCGATTTTT
-CCAACAAAAAAAAAATCAAATTTCGCGTGTAATTCTCTACCTGTAACTGA
-TTGTGCATCCTTGGAGCATCAACAGCTTGTTTAACATCTGCTTTCAGCCA
-TAACGCATGCAGTGCAACTCCAGCAACACCCGAAATAATGGTGGATCCAC
-CGGCTCCGCCGACCGCCATAAGCTCCGCCCCTTTTGTGTTAAAGATCACT
-AATGGACTTTGACTACTCATGGGGCGTTTTCCAGGGCGAATGAAATTGGC
-GGGAGACGGTGGGAAACCGAAGAAATTCGGATGACCGGGAGTGGAAAAGT
-CGTCCATTTCGTTATTCCAGAGAATTCCCGTCGATTCGGAGGATACTAGG
-GCACCCAGGCTGGAAGAATTTGAGATGGTGGAAGAGTTTTTTTGGCGGTG
-GCCTAGAAAATGTCTTCATATCCGAAAAAGTCAAAGTGATGGCCTAGAAA
-TTTAAGTTTGTGGCCTATAAACTTGAACTGATGGCCTAAAAATTGAACGT
-CGTCCTAAAAATGTTTTTAACTGATGGCCTAGAATTGAAAGGTGATGGCC
-TCCAAATTTCAGGTGGGCGTATATAAACTTTGGTTGATGGTCTAGAAATT
-ATACACGTGGCCCAGATTATGAAATCACTTCGGTATAAAATCCAGGTGGT
-AAACAATTTACTATTAAGACTGCCTAAAATCATCCCCTGGCCTAATTAGT
-TTAAAATTTTTGGTGACGACCTCGAACTTGTTCATTTTTATCAACTGCAG
-TTGCTTGTCGACTGAGGACTAACTTCTCACTTGCTGGCCGAGTTTTCGAA
-GTTCGGCCACCAAAAATTTCCTTTAAAAAAGCCAAACTCACTATAAGTTA
-ATGGTAGACGTAACCGAAACTGCATTGCCGTCTGCATCGATAATCGATAC
-ATGAGTTGTTCCATGATCCTGCGGTGGTGCTTCAAACGATCCTCCATAGT
-AATCATCAGGATGCGTCGTGTCTGTGATCTTCGACCTAACCCAATCCGCC
-CACTCTTTTGACGTAATATTTTTGGCGATTTCCGTGGCGTTTGCCACGAA
-TTGCGGGTCGCCAAGCCAGCTTCTAGCCGCATAACTAAATTTGCTAGATT
-CCAGAAAATGATGGTATAACGTTGCGATTTCGTTGAACGACTTCATGTTA
-TATTCGAAGCCATCCATCACGTTAAGTATTGCCTGAGCCACCGCTGAGCC
-CGAGGGAGGCGGCGGGCCGCAGACTCCGCGCCCGTTTTTCAGCTTTGTGT
-AGATCACATTTTTTGAGTCGTGGACTATTGATTTGTAATTTTTAAAGTCC
-TGAAGCCGGATGATCCCACCGTTGGCTTCGAACTCTTTGGCGAGTTGCTC
-GGCGAGCCGACCTGTATAAAAGTCGGCGATGGGATCTGTGGAGTTTGCGA
-GTAGCCGGAATGTTTCTAGAAGGTTTTGGCGGGTTTTTATCTGCTCTCCT
-GGTTGGAAGACACGCTGAGTTTCGGGGTTGATGAAGTTTTTCATGGTGGG
-CTCCGCGCGGATTTGGTGCTCGTTTTGGTTGAGAGCTTTTGCAAGGGCAT
-GGGACGTTGGGTAGCCTGGAATTTTTTAGGATGGCCTAGAAACATGAACC
-GATAACATAGTTACTTATTTTGTGACCTCGAAATTTTCATGATGGCTTAG
-AAATTTTTATGATGGCCTAGAATTTTTATGGTGACCTAGAAATTTTTTGA
-TGGTCTAGAAATTTTTAGTAATGTAATAAACTACTCGTCTTCTCCTCCTG
-AAAAAATTTGGGCCCGTCTCCCTTCGTGGTGAGACCCATCGTGGCGAGAC
-CCATCGTGGCGAGACCCATCGTGACGAGACCCATCGTGACGAGGCCTATC
-GTGGTGAGACCCATCGTGGCGAGACCCTCCGTTGAGAGACCCATCGTGAT
-GAGACCCATCGTGGTGAGACACGCCGTGGTGAGACTTATTGTGATACCCA
-TCTTAACGTACACAGTAATTGGAGAAACTTTTAAACTGATTTTTACAAAA
-AGTTCAACATTTAACTTACCAAGAGCTCAATATTCCGTTGCCTCGCTTTT
-TGTTGCCCTCAGGGATTATTGTTCTGTTGCCTCCATTTCCGTTACCCCTG
-TTGTGTTGCCTTCGAGCAGCGTTGAATCCGTTGCCCCCCCCCTTTTTCGT
-TGTCCCCGGGGAATATTAAATCCGTTGCCCCCGTTATCCGTTACCCCTAG
-GGATTGTTGGCCGGTCTAAAAACGGCCACCAGAAAAGTTTTTGAGCATCA
-AAAATGTTCTACGCCGTTAGGAGTTTTTTAGGCCAACAGAAATATTCTAG
-GCTCGCAGAAAAAGTGCCCACCTTCAGCCAACAAATCAATAGTTGGTTTC
-AACAACTGTCTCCACTCGACTTTTCCACTTCCGAATCTCTCGAATTCAGT
-CCGGAGGCCGTGAAGCTCTCCGGGCACCGCAATCGCCTTCCATCCGATTC
-TCGACTGATTCCATTTGTCACGGTACATTTCCTCTGTTGCGGCGAGCGGA
-GCAATCTCCCGAGCATCGATTACCGTACACTCTTTTGTCGTTCTGGAAGA
-ATTTTAGAGGTTTCTAAGTCATTGAAAATATTTTTAGGCCACGGCAGAAG
-TTTAAAGGCCACACGCGCTTCTGGCTTTCCTCATATTTTGAAATGGAAGA
-GTTTGCCGAGTTAGCCCGTTTGGACTAGGCCACGACCGGGGTAAATTTAC
-GGAGCGTCGTGTAGACGATTGTCAATGGAGCGCGAGAAAAACGCTTTGAC
-GAAGGCCAGAAACCAGTGAGGCCACAATGTGATGTTTGCAAAAATGTTTT
-TAATGGCCTAGGAAAATCATTCTTTCTTCCAAAATTTTTCTTCTTTGTTT
-TCCTTTTCGATTATTGATTTTTAGTTGAAAAATCAATATTAATAATTATC
-TTTTTTTTTAATTATTGATGTTCCGCTCCAATTCGTGGCGAGACCAACAA
-CTCACGCATTATAAATAGTCATAAAATGTCCGCCGCCAATTCCGGCCGAA
-TGTGTATCCATTACACCGATACAGAAAAGTGCGGCGATTGCCGAATCCAC
-CGCATTTCCGCCTTTCAGCAAAATATTCCGACCGATTTCTGAGCAAATTT
-CGTTGTCGGCGGCGACGGCGGCTTTCGAATATTTTCCGAGTGGAGAAAGT
-GATGGTCCAGGCCAACGGGGTAGGCGGGCATTGTTCTGGAAACCTTGCCG
-AGTTTTATTTTTATCGGCCACGTAGCAAATCGGCCAGCCATGAACCGACT
-GCGGACTAGTTTTCACCCTCGTGGCCTAGCTTTCTAACAAACCTGCATTA
-GTAAATGAAAATACAATGAAGCGAATGCGACCGTTGAGATTAACAACGTG
-AATACGAGAACCGTTAAGCCGACCGCCGCGACTAAAGTACGGATTTTCAT
-GGGTTGCTCGGCCTCGATAAGCGGCTCAACTTCATCAAATGGTCCATATT
-CTGGCGGTAAATTATCATCGTCCGGAAACGTGTTATAGTATTGAACAGGA
-GGTGGGTTACTGCTGAAAAGTCGAGTTTTGCGCGTCAAATTTGATGTATT
-GAGTGGCATGATCACTATTATTACAAGACCGCGAAATTTTGAGAATGCGT
-ATTGCACAACATTTTTGACGCGCAGAATATCTCGTAGCGAAAACTACAGT
-AACTCTTTAAATCACTACGGTAAAGCTTGTGTCGATTTACGGGGTTTCGG
-TTTTTTCATTTTTTTTGTGTTTTTTAAAAAACAATTTATCGACTAATGAA
-TGATTTCCGTAAATCGACACAAACACTACAGTAGTCATTTAAAGAATTAT
-TGTAGTTTTTGCTACGAGATATTTTGCGCGTCGAATATGTTGCGCAATAC
-GCATTCTCAGAATTTTGTGTTGCCGTAATAATTCTGATTTAAAAATGGAA
-TTTTCAAAAATCAGAGGTTTCCCAAAAATTTGAATATTCCACAAAAAAGA
-TGAATCTGAAGAGTATTTTCAATTTTTTGAGAAAATAATCGATTTTCTGG
-ATTAAAAAATTTGAATTTATAGATTTCTAGATTCTAAAATTTGAATTTGT
-GCAATTTCAAACAAAAATGTATCGATTTTTATCGACTTTTCATAAAATTT
-AATTTAATTTTCGAAATTCCGAAAATATTGCCCGTTTTTCATATACCAAA
-AAAGTTGTATCAATTTTTTCAAAAAATTAAATTTTCATCGATAGTTGTTT
-TCAAAGCATCATGATTTTTTTGAAAGAATTTGCAAATGTGAGAACTACAG
-TACTCCCTTAAAGGCGCACGCTTGTTTTTATTTTTAAAAAATTGGTCGTT
-TCGAGACCTGGTACCGTATTTTCGCATTTGGGTAATATTTCCAGCATTAT
-AAATTTAAAAACAATGCACTTTTTAAATCTTGAATCCATATATATATTTT
-TTTCAGAAACTCATGCCGCCTCGTTTGGGTCTCGATTCGAATTTTTTTCA
-CAAACGTATAATATTTTCTCGAAAAACCCGCGAATTTTTAACATTATCGA
-TTTTTCTCTCACCTCGTCGATTGCCCTTCAGGAGTCATTATTCAGAATTG
-AGTATGAATTAAAAAATCATAGAAAAAGTCAAAGCGCTGTCAATTGGAAA
-TTTAGGACGAGAATGTCAAAATTGCAACTTTTCACGATAACGGAATTCTA
-TCGCAAAACTAGATAAGAGCTACAGTTTGCTGCGTGTAAGCGCGCTCCAA
-TGACAAACGAGAAGAGAAGAGAAGAGGGGGTAACCGCCAATAGCTCTCTT
-TATCGAGGATAGTCTTCAAGTGACAGAAGAGATATTCTGTGGTGGGAGAG
-AGTTGGGTGGAAGGGGGAACAATGAGGACTACGGAAGAATGACTTTTAGA
-TTTGGAGTATAGGAGAAAGTGGAGGTTTTGGCTGAAATTATTTTCAAAAA
-CTTTAACTGTAACAACTAACGAGTAGATTTGAAAATGAGGATAATATTCA
-ACACAACAGAAAAAAAGTCGATAGGTAACTAATAAAAATTAGAGAAAATG
-TGGCATCGGGGAGAAGTGGTGGAACAAAAGAAGAAACTGATGATGATGAT
-AGGAGGATAGCCGCGAAACAAGCGATTAACAGTGAACAAGATTCATTTCG
-GTGAAGATGGAGAAGATAACAGCAAAAAAAAAAACACAACAAAAGTCCTT
-ATTATTGCCCATTGAGAGTTTGTTGAAGGACACTGGTAAGGTGCTCGTCG
-ATTCCATCTTGCTGCGCGAATTGTGGGAACGATGCGTAGATTTGCTTCAG
-GATTGTGACAATTCTTTGCTTGGTTTGGTTGCCGCTATCGTCGTCGTTGA
-AAGCATCGTTGGCGATTGAGAGCAAGCCTGAAAAATACAAATAAAAATAA
-AATAAGTTACGGATTTTTTTAGATTAGAACTTACAAACAAGGAAGATTCT
-CGGAAGATTCTGATTTTCTGGTCCAAAAAGTGCGGCGTCTTGTTTATCAA
-ACAATTCGGCGAGACACGTGTAAATGTAGGGGCTTTCCTCGGTGTCTGAA
-TATGTTGGCAACCAGCTCAGGAACATCTCGACGACCTGGAAATAATATGG
-AACTTTTTTCTTGAAAAACTGAATTCTAAAACCAACCTTTCCGTAGGCTT
-CAGCAGGAAGTGGCACATTGCCGATGATTTTGGCAAATGCAGAAATCGCG
-TTTTCCGTGGCAACAGTGCTCTCCTCGGTGGCTCGGGCGTCCTCTCGTTG
-AATCATGGCGGCCAGTGGCTCCAAACAGCTCAAAATCTCGTTTCGGTAGT
-CGCTGATCTGGTGGTAGTTGATGGCCATAACTCCGAAACCGTAGCTCGCT
-GCTTGTCTCACTTCAGGATACTCATCTCCCAACAACTTGTACATTATTGG
-AATAAGCTTCGGGAAGCGAGTTGGCATATGTCCGACACCGAACTCGATGG
-CGTCATCGAGAAGGCACATTCCCCATTGTCTCTCGAAGTATTGTTTGGAT
-CCCTCGATGAGTTGAATGGCACAGTTGAACACGTTGATCATTCCCTCGAA
-GATAGTTCCCTTGAACTCCTTCATAAGAGAGTGAGTCAAATCAGAGATGG
-CTCCAAGGCATGAGGCCTCCAATTCCATGAAATAATCGAGCTCCTCCTTA
-GCTTCAGCATCATCGTCATCTTCATCTTCAACTGGACGATCGCTCATTCT
-CTTTCCGTAGTTTTCAAGTTGCTTGAGAAGCACCGAAATGATGAGTTGAA
-CCTCTTCCTCGGCGATTCCCTCGGTTTTCATAACCTCAATGCACGATCCG
-ATGGTCGTCATGAACGAGGCGAGAATCTCGACATCGTCCTCCTCCTCCAT
-AGAGGTCGTCAATGCCTTCAAGAACTCGCACCACAAACGACGCTTGTCAG
-CCAATCCTTGCTTCTCAACACAGGTCAACAAGCATGGCATGATTTCAGCG
-GAAGCCGTACGAACTCCGTCGTGAAGTCCGAAATCGAGATTCTTGATGGC
-GAGCTCGTAGACGTCGACGACGTATGGCATGAAAGCCTCCTTCATCTCCT
-TGGCGAACGCGACAAGCATATCGCAAGCAGTTGCCTTCTCCTCAAGACCG
-CTGGTGCGGATTCCGACAGTCTTTTCTCCTCCGATTCCGTGGTATTCAAC
-TCCTTCCTCGTTTTCGTGAACATCTTCGTCTGAAATTTATATATTTTTTT
-AACACGTAAAACTAAAAAACACTCACTGTTGAAGATATTGAAGTCTGGGC
-GGTAACGAGCGGCACGAAGAACTGGATCCATGACAACTGGGAGGAATGGT
-GCGAAATCGGCTCCAAGAATAGAGCAGAAACGAGTCCATGAGCTGATCAT
-GTAGCTGTATTGTGGATCATCGATAGCCAAATCCTTCATTCCGTCTCCGA
-GAAGGTTCAGGATCTCGATTGCAGTAGCGTGGAATTGTTCCTTTCCGACA
-GCATATCCGATGAGAGAGATGCATTCGATGGTCTTTCCTCTCAACTCCTT
-GAGCTCTCCGACGTTTTGAAGAATGTGAACGAGGTTCGGGATGAGGCGAG
-CATGATGTTCCTTGAAGAGCTCCTCGGCGGCTTCAGCGACGGAGGCGATG
-GCGGTGACGATGTTCTCAACGACAACCTGGTATCTCTTGTCTCCGAGACG
-ATTGAACACAGCGGAAAGCACATTTTCGAGTTTCTGAAGAATGAATGGAA
-GATATTGTCCAATGATGCTCTTTGGGCACTCCTCGGCAAAGTTGACAAGA
-GCCGAAGCGGCATGAGCACAGACACGTGGAACATCGGTTCTGTCAAGAGA
-CTCGAGAAGAGCTGGTATGACGGCGGCGTGGCACTTCTTCTGAAGAGTTG
-GAGCGAAGTCAGAAGACATTTGTCCGATGGCGTTGCAAGCCGCGTATTGA
-ACTCTTGGATGAGCATCATTGACGTAATTGGTGATATGAGCCATAATTTG
-CTCTATGTGTGGTTCCATAGATCTTTGGCACCCTTCACCGACGGCGGAGA
-ACGCGCGAAGAGCCGCGTGCTTCATCTTCCAGTCTTCGCTGGTCAAAAGC
-TTCTCGACAAGTGGAAGGAACACTGGGAGCATCACTTTTCCGTTGATGCA
-GCAAGCAACACGGTCGATGGCGCTTTCGGCGATGATTGGGATACTGAAAA
-ATAATTTAATTGAAGAAAAACTAAAAATTTATCCTTACTCTTCATAGTCT
-TCTTCCTCTTCGATCTCGTTGAGCCACTCATTGAGCACATCGTCATCCAT
-TTCGGTCATGCATGAAAGAAGAGTCTCGAGAATTGGTCCAAGAGCTCCTG
-GTGCGTATTTCTTGAGTCCTTTTGGTGCGGATTCCATGTACGAGCAAATA
-ACTTCGATGGCGTTCTGACGGACCATCTCGTTCTTTTCCTTGTTTCCAGC
-AATCTGAAATTTGAAAAAATGAAATTTTTAAATTGGGCCATTTAAATTAC
-TTACAGCAAGAGTGACTTGAAGAACCTGAGACATATGAGTGTTAAGGCAT
-TTTGGCAGAGAAGAGGCGAGCTCGGCGAACTCTCCGAGTGGTCCATCTGA
-ATCATCCTCGTCGCTGGTTTCATTGCAAACTTGAAGAACATTTGGAACAA
-GAGAGGTCATAAGCCTGACAACATCCTTCTCCTCATCATTATCAACAGCG
-AAAGCGATAACAGCACGGACGGCGGTGGCCTTGATTTGCAAATCCGGTGT
-AGCCATGCACTTTTCCAAGACAACTTTGAGGGTTGGAAGGAAGTGGGCCA
-GCCTGTTTCCAAAAATTATTGGGCATCCGCGAAGAATAAGCAGGGCTATG
-TAGTTTCCGGTAAGATCCTCGCTCTTCAAACAATGATCCATCAGCTCGAG
-GACTCCTCCCCATGTCATATCTCCAGAATCGTCGATGAGGTTTGAAGCGA
-TTTCAGAGATCAAATCAGCAATCTTCTTCTTAATCGAGAGTTCGGTCTCG
-TGAACTATCATCTCGAGAACTTTGGCGAGAATGCGCTGTTTGTTCTCCTC
-GTTCAGCGTTTCCCAAATCGCATCCCAGTCTCTGGCGAGAACTCGTCGCA
-GAAACACCAAAACTGTGGATCTGGCCTGAAAATCGAAAATTCATGGAATA
-TATAGGAATTTGAGTGAACTAACATCAGAATTATTCGTGTGGTGTGTGTA
-GGCCTCGAAAAGTGCAGCTACTTTGGTTGGTCCTTCAATCTTTTCATAGA
-CTTCTTCAGCTTGTTTTCGGATATCATTGTCTGCTGACTGCAGTTTTGTG
-ATGAGCTCAGTGAATTGATTGACGTCCATTGTAGGGAACCCTGAAAATCA
-GAATATGTGCTAAAAATTTCAAAATTGAGAAGGAAAAAGATGAAAGCGAG
-TCGGTTTTGCAGATAAACGCCTGGGGAATACGCGGAATCGCTGAGGAAAA
-TAGATTTTTAGTATAAAAATTGGCATTTTCAACAAAAAACCTATCGGAAA
-ATGTGAAAAATAGGCCAACAAATATTGAATTTTGGGACAAAAACGCCTCG
-AGTGCACGATTCTCAACGGAGCGCACTTGCTGCGTCACACGCACTTTAAA
-CTGTACACGGCGGGAAGTTCAAATTTTAAAAGGATTCACGTGATTTTCAC
-GACATTTACTGGTTTTTTCAGCGAGTTTTCGCAACTTTTCGGCGACAACC
-GATGATGATTTATGTTTGGAATATGATGATGGTAGCGTGTTGCGAAATAA
-AAAATCGATGGAATGAGTCAGCGAGAAACTAATATTTGCATAGAGAACTG
-TTTGCAATTTTGGCATTACATTGGCCAGTGCACTGACAAAAAAAGAAAAA
-AATAAACGGCAAAATCTCTAATACCTATTCCAGGCAACCAGTGTCTGGCG
-ACGATGGAGAGTAATTCTGAAAGAGACGCAGTTGAAAAGAGTGTGTTTTT
-CGCTTTTTTTTTCAGACAGAAGAGTAAAAAGAGTAAATACGTATCAGTAG
-TAAAAACAATGTGCGAGCTGGGAAATCAGTAATAATTAACTACTTGTGAT
-ACAAATTCCTCAAGGAATGAAGGAGAAAGTGTACTTTTTTTGAGACCCGA
-AGAACTCGGGGGATGTCCAATTGGGGGGATTACCAACTCGGGGGATTGGC
-CCCGCCCACAGAACCGTGGCTTGCAATACGCCCATTTCTGCAACTGCCGC
-ACGGTTTTAAAACTGTATTTTTCTCAATAGAGCGAGAATTAACAAGAAAA
-AATAATTTTAAAACCGTGCGGCAGTTGCAGAAATGGGCGTATTGCAAGCC
-ACGGTTCTGTGGGCGGGGCCAAACTCCCGAGTTGGTAATCCCCCCAATTG
-GACATCCCCCGAGTTCTTCGGGTCTCCTTTTTTTTAATTTTGAATTGAAA
-AATTGTCCGAAAAGTGCAAACGTAGAACATCAAAACCAGTGGAGGGGCGA
-AATTTGATAGATCGCATGTTGCAAGAATGAGCATTCTACGAGTTTCGCGC
-CATTTCTGCGTAGCGCGCACAATATTGTGCAATAAATCTCGGTATTTGCG
-TACATGCATCATATCTTACGCGCAAATCATATTGGAAATTTCCCCGAAAC
-ACGGGGAGGCAAAGCTAACGTGGCTGAAGAAATTTCTACAGTAGTCCCAT
-TTGGCTGACTGAATATTCAACGCGAATAAGTTTTGTACACTATTGCGTAC
-TTTGCGTACGCGCATTTTATTTGACGACAATTCGTCAATATCAGCTCTGG
-CTAAAAGCGCTTTTCTCATTATTTAAGCGAATAAAAGTCGAAAAAAAATG
-TTTTGTGATAGAGAATAGTAATTTAAAAAATAAAAAAGTGCATATTTTAT
-GTTTCTCATTATGTTTCCACTGATTTTCTGAGAAAAACCGAAAATTTCCT
-CTTTTTTCGATGAATTTCAGCTGAATAGTTTGTTTTTATCTAGTTTTTCT
-TCCGATTGACTGAATAACACATTTAATAACATCAATATAACGTTTAAAAC
-ATTCATTGTCTCGAAAACCAATATAAAACTCGTCAGAGAGGGATACTTAG
-TAGATATGCTGAACAAGGAAAAGAGAGAGAAGAACATTAACCGAATGGGG
-AGGGGGGAATAAGAAATCTGAACAGGAACGAAATATAAAGAACATTATTA
-GAAAGAACAAGCATGGCTTGATCTTCTTGGCAGTCGTCTCCTTATCCTAT
-CACTTCTTCTCGGCGTCCTTCTGATCATGCTACCGAGCAACGTGGCACGA
-TCGAAGAGTTTCACAACGGTTTGATACTTTCGCTCCACGAGGGGGCTCCC
-AATTCAGCGAGGGTCCTCTCACGAAGTTTAATTTTTTAAAATTAAAAAAT
-AAGTAACACCTCAAGAATTCCATCGAAGTTGTGCTCCTTTGCAATAAGAC
-GAAATTTTTTTTTACGGAATTGAACAGGATCATTGAGGTACGGCATGAAA
-ACGGCTTCCTCGTTGAACGATGTTGAAGCTCCTTCACCATTGCACCTGAA
-AATCAACTTCTAAATTTTCCAATTTAAAGAAAATCCACATACTTATCCTC
-GGAAACGAATCCAATATTCTGGTTGCTGAGTGGAATTGCTTCAAAGATTT
-TGATCAGATTTTTTTTTGAAATTTTCGATCACACATCTTGTATCCACCAA
-ATCGCCGAGTGCTTCATGAACTTCAGACTCGTGCTTTCCAACCTCTTCCA
-TGAGCTTCACTTCTTCTGCTTGGAACTTTTGATTGCCTTCGGACCGATCT
-GACTTGTAGTTTCTTCTTAAATAGTGGCTGATTGAGCAGTCGACCTTGCA
-GTCCTACCTTCTTTGGCTTCTTCTGCGGCACTTGAGCCCTTGTAAGAGCA
-CTTATTGCTGCTTAACCTTCCTTATTAATACTTCGAACAGCTTCTTCTTG
-TTCGCATCTATTTCGAATTTTGTCTTGAAATCTTCCAATGCAGCGACAAC
-GTAATATCTGGAAATTATAAAAACATTAAGAGAAAATATTTTGAAAAAAA
-ATCGAAAATTGCACTGAATTCCTAAATTTTTTATTAAAATCGAAAAAAAA
-AAATGAAATACGTGAGATTGAGTTTCGAGACTTTTTTATTCAGAATCAGC
-ATATATTTCTCCATATTTGAGTAGGTTTTCAGAAATATTGTACCATAATT
-TTTGGAAAAATGTAATTTTTAATTCGAAATTGCACTGAATTTCTCGAATT
-TTTCACTAAAATCGAGAAAATAAATATGAAATACGCGAGATTGAGGTTCA
-AGACTTTTTAATTCGGAATCAGCATATATTTTTCCATATTTGAGTAGATT
-TTCAGAAATATTGTACCATAATTTTTCGAGATATTTTGAATAATAACTTA
-CTTTTCGACGTTTTTTGCCTTTGTCCGGTTTAATCCATCGAATTTCGAAG
-CGGTTTGCGTAGATTAGCTGAAAACATTATGCTTATTCCACGTAGTAACA
-AGAAAAAACAAGAAAAAATAAGAAAAAACGAAGAAAAATAAGCATATAAG
-TCAAATTAAAAATGTTTATTCGATCAAAATTCTTAACCATAGGAGGCGGT
-GGCTAGCCGGCGCACTCTCGCGGCCACGTTAGCTTTGCCTCCCCGTGGAA
-AGGAGCCATGATATTACGGAAACACTATTTGAATTCTGAGAACGCGAAAT
-ATCTCGTAGCGAAAACTACAGTAACCCTTTAAATGACTACTGTAGCGCTG
-GTGTCGATTTACGGGTTCGATTTTTAAAATTATTTTTTTTGTTTTTTGTG
-TGCGTCATCGATTACTAAATTATAAATTATTTCCGTAAATCGACATACAA
-TCGCTACAGTATTCATTTAAAGAATTACTGTAGTTTTCGCTACGAGATAT
-TTTGCGCGTCACTCCTTCAGGCACCACATCTTACACTCAAAATCGAGGTG
-AATTTCTGTGTATTTGACAGCAAAAATGTCGTGAAAAACAATTAAATAAG
-GCAATTTGAAGAGGAAAAAACTGGGGCAGATGTGAGATAAGAAGAAGAAG
-AAGCGGGGCTTCGACAACCGTAAACTAATCAGAGATGGAAAGTGAGAAAT
-TTGAAATTTAAGACAAAAAAGTTAACAACGGGGGATTTTTTTTAGAGAGA
-AAGAGCGAGTAATCGGGCAGCAGCAGAGAAAAAAAAAGATAATAAACAAT
-TGAAAAAATATAAATATCGGGGAAATTATTGCTGAATAGACTGCAAATAG
-GTGACAATCTCGGGCGGTACAGAACGAAGTGTCTCTGGACAATTTCCGGG
-TCCACGGACAAGAACGGCCTGCGCAAAGTAGGCCTTGTGGTTGGCGATGT
-TGGCGGCGACGGGCGGTTGCTTGGGAGCGTAACTCAGACGACAGAATGGG
-TTCACAAATTCTCCCTCGGCGTTGTACATTGAAGCTTGCTCTTCTTCTGG
-TGATAGGACGGCTCGATCGGAGGCTGAAGCAGCTTCCAGCAGCATTGCCA
-CCTCGTATGACAGAATTCCGTATTGACCACTGCAAAAAAAATTTATATGA
-GAAATTGAATTTAAAATGATTTTATTTGTAATTTTGTTTTTGTTAATTGT
-CGTTAATTGTTTTTTTTTTGAGAAAAAACCGAAAAAAAAATTAAAATCTT
-CATTTTTGATTTAATTTTTTTGTTGAAAAATCGGCAGTTTTCGATTTTGT
-TTTTTTGAAAAAATAGGGAAAAGTCGGTAATTGTCGATTTTTCAAAAAAC
-TGAAAATTCCAGATTTTGTCAGGAAAAAAAACGAAGAAATCGACAAAATT
-TCAATTTTATTTTTTTAAATTTGTGTTTTTCAAATTTTTTTTTGATATGT
-GATTTTTAACTTTTCTCTGGAAAAAAACCGAAAATTTGCAATTTTTCAAT
-TTTTTCCAAAAAAATCTTTAAAAAATAGAAAATTTTCGTTTTTTTTTCTG
-AAATATTTAAAAATTGTAACTTTCTATTTTTTTTAAACCCGTATTAAAGT
-TTAAAAAAAAAATCGGAGAAAAAAAAACTGAATCGAAAATATGTGATTTT
-CAATTTCCTTTGAAAAAAATATAAAAAATCGAAAATTTTCGTTTTTCGAT
-ATTTTTTCTGGAAAAAAGCCTAAATTTTCATTACTAACACAAGCTGCTGC
-GTGACATCGGCTAGCAAATTGCCCATTCCAATGGCAATAATCCGTTTCTC
-AGGCCCCGTTGTCGTTTGTTTCAGACCTGGCAAATCAATGCATACGACCT
-TCTCGATGAGCATTCCGAACATGCCAGTCTGAATATTCTCACACGATTGA
-ACAAGATCCTGTGCACTCCGGGCGATCGTAAATCGACACAAGAACACGAT
-GAATAGCTTCATAAACTTGGGTGTCTTCGACGATTGAACTCTTCGAAACA
-TTGTATTGAGCACAAATGTCATCGCGGAACCCTCGAAGTGCTCAATCGAC
-GGAAGAATCGTCGCCGCCAACTGGAAACCGTATTGATCCAAGGTTTTCGA
-GCCCAAAAGCCGCGCCAAATGGCTCAAGATCAACCCAGAATTCTCCGAGA
-CGACTCGCTGAGCATTCACGGAAAGGATCACTTCGAGAACCGAAAGTGCC
-GCTGGAACATTCGCTGATCTCGCCCAAAGACGTTCGGATAGCAGAAACGG
-AAGGAACGGTGAGAATTGATCGATCGATGAGTTTCTAGCGATACATGAGG
-AGACGAGAACTCCCGTGATTTGGAGAGCATATGGGATGAGATCTTCCAAA
-TCCTCGCGGAAGATCACTTCGATCAGTGGAAGGAGTTGAGCATCCAGTGA
-GGCGCCGATTGTTCGGGTCTGGAACAGGAAATTCGTTAAAAAATATAAAA
-TGTTCTTAAAATTGCTATCACTTTTTTTTTGAATAAGAAAAAAAATCACA
-AAAAGGAAAACACGAAAAAGCAGACAAATGTTTCGATTTTGCAATTTTTA
-ATTTTTTTTTTTCAGAAAAAAATTATCGATTTCTTCTTTAAAAAAAGAAG
-ATTCTTTTCGATTTTTTCGGAAAAAAACATCGAAAAATTGAAAAACAAAA
-AGTTTTGATTTTTTTTTCAGTGAAAATCGTTCAATTTTTCGGGGTTTGTT
-TCGACAAAAATAATTAAAAACTAAAATTTTTCAGTTTTTAGGTTTCTTAT
-CAGAAAAATTGAATTTTTTCGATTTTCCGAAAAATTAAAAAAAGGTATAT
-TTTTTGAAAACACGAAAACGGAAAAGTGTTGGTTTTTTGTAAATTTTTGC
-GTTTTCCAGCAAAATTGCCAATTTTTCCGAAAATTTTCAGATCGAAAGTT
-AAATTATCGATGTCTATTCCAATTTCCGAGTTTCAGCGAATTTTTTTTTG
-CAGAAAAATTTCAGAAAATTTGACAAGTTATGTTCCAATTTATGAAAAAA
-AATTTGAGACCAAAGTGCGGCACGGAAAAATGGGCGGAGTTTAGAGTGGT
-ATTTTTCTCTCAAACTACTCCTTACCTTGGTGATCAACACACAAATCGTC
-TCAAACAAAAAGTGCGTGTGCACCGAATCCGCCGGATTTTTCGTCGCCGA
-CTCGACCAACTGTGCGAGCTTGACCGCAATCGCGTCCGCATGCCGAATCG
-TGTCGTCATCGAGAATCACAATGATCCTCAAAATCGCCTTGATCAGATAC
-GGCGAGTTTTGCGCTTTGGCATCCTTGTCGAACGCGGTGACAAGGTTCTG
-AAGGATCGAGGAGACTGGAAGATTTTGAGCCGAGAAGATTTTGTTGGAAT
-CAGCGAGAAGGATCTTTTCAATAGCGTAAGCTGCGTACTTGTGCAGAATC
-GGAGTATTCGAGCTGAGAAGAGCGTCCGCCGACTTGATCGCAGTCATAAG
-GTGCTCTGGAGCCAGCTGTTTCCTGAAAGTGACCGCAAACTTCAGTGCAT
-CAGCTTTAAGGATCGGAGTTTGATTGACATCGGCGTTGAGATGTGTGGCC
-ACTTGTGTGATGAAGAAGTCGTTGATGTCCACCAGCGGGTTCGTCGCCGT
-TACTCCACTCTTAGCAGTCTCCGTCTTCACCGCGATCGCCGTGATCAGCG
-AGTAGACAATGTCGATCTTGATCCAATCACCACTTCCCAGCAGGTTCTGC
-ACGATCTCCCCCAGACATGGAAGCATTTGCGCCTCGAATCTTCGGCAGAG
-ACCTCGCGCAAGATCGATGGCTCCACGGCGTCGAGTTCCTACATCGGTAC
-CCTCGATGTCTCGCTTCATATAATCCAGTGGCTCATCCTCGAACAGTTCC
-ATATCCTGTTGACGAAGCAGAAGGTTCTGAACGCACACGTTCTCGGCGAG
-AGTCTTCAGAACGCCTTCACCAGTGAAGTGTCCCTCGTAGTACTGTCGCT
-GGCTGACCATCGACAGAAATTCCAGCGCGGCGCACACCATCGTATCGTAT
-CGAGTGTCGGGGCCGGTAGACTTGAGCAGATTCCAGACGGCAAGGATGAT
-GTCGGGCACGAACTCGGAGATCTCCTCCTCGTAGCGTTGCGAGTAGAGCG
-TGAAGATCTCACAGATCTCGTGCTTAAGCTCGTCCAGAGTTGTAGGTTCT
-CCCGAGTTGGAGGTCTGCGTCGGCGCGTCGATTTGCACGAGATGCAAGAA
-GTGTGGCATCCAGTCCTTGAGATGATCCTCGAAGTATTCCGGAATCTCCT
-GTGAGCACAGAGAATGGTAGACTTTTGCAATGAGAAGTAAGACTCGGAGC
-CATTGGGCGATCTCGTCGGCTCCGAGTTGATCCTTCCGCTGTCCCACCTC
-CATCATGTTCCGTAGCAACAGAGTTAGAGGCTCTTGGGTCTGAAAAATCG
-GTTCTTTTTATTTGTAACTGAAAAATCTGGGGAGAAAACAGTTTTTCGGT
-CCAAATTCGAGACTGACATTCAGATTTCTTCAATTTTTTGGCTCAAAAAT
-TTTGAAAATTTGTCCATTTTTATAGGAAAATTATCAATTTTCGCCAAAAA
-TTCCTCATTTTTGCTTTAGTTAAAATTTTTGACTAAAAAATCATAAAATG
-TTGAATTTTTCACGATTTTTCGGAAAACAAGGCCAGCTTTAGCTAGCTTA
-AATGTCTAATTTTGGTCATTTTTTAGGGTCAAAGCGGACAAAAATTCAAC
-TTCCGACGGCTGCGACGTAAAAAAGTGGCCAAAATTGGGGATTTTAGCTG
-AAATTAGCCAAATTTTGAGCCAAAACGCAACTCACGCTCAGTAGACACTT
-CTTCAGCTCTTTCCAAAGCTCTGCTGACTTGGATTCGAATCGGAATTTGC
-GGAAAATCTGCTCCATCGACGCCAGCGAGGCCACCAGGTGATTGAGATCC
-GCTCCGTTCAGGAATTTCGACAAATATGGAACCAAATCTGGCCATTTTTC
-GGGAAAATCTCTCTGAGCGATGAGATACAGAGCATTGGACAGGATTTCCT
-GAACATTTGATTTTGTATTGAACATCGCTTCGAGAAGCATGCTTCTGAAC
-TGCTCCTCGTCTTCCTGGCCCATTTCTACCTCTGGTGCCGGGCCCTGAAA
-CAATTTAAATATAAAATTCACGCATTTATTCAAATTTTCCAACCCAATTT
-CTCTTCACAAAATTTTTCAAAGCGACAGCCGCGGCGATTCGGATCTGCGG
-AGCAATTTGTTGCTGTTCGTTGACCACCAGTTGAAGAATTTGAATGATAT
-AGCCTGGATTTGATTGCAGCGAGCGGAGCGCTTCTTCTCCACGCTTGCGA
-ATCGCAGCATCCGGCTCCAGAGTCTGCTGGAGAGCTGCTCCGATTTGCTC
-CATCTGAAAATAGGGAAAAATAGCTGTTTTGGGGGTGAAATAGGGAAGAA
-TTAGGTGAAAGGACAAAGATAGTTTAGCTTAAAACTTGAAATCTAAAATT
-TCCGGTCAAAATATTAAAGTTTTACGCAATTTTTCGCAGGCCCGCGGGGA
-ATAAACTCGCAAAAATTCGCAAAAATAAAAAAAAAATTTCAAAAGTGTGA
-AGTGTTTGCGTACAGCGCACCCGACCCGACGCGCAAATTTTTTTCATTAT
-GTTCTCTGTTTTCACTGATTTTTACTGATTTTTCCTAGTTTTCCCTTGAT
-TTTCTTCAAATTTTCCACTTTTTCAGCAAAACGTGCATAAAAAAATAAAT
-TAAAACATTTCAATTTTCAAAACTTTGCAAAATAAAGGCGTCGTTGCGTA
-CAATGCGCACGACTTGACGCGCAAACTTCCCAATTTTTATTCTTAAATTT
-TCCTGGATACCCCTGGTTTTTTCTCTGTTTCCCCCCTAATTTTTCGCATT
-TTCAGCAAACATGGGTGTTGATAAAAAGCAAAAGCAACGAAAAACCAATC
-CATTCGAGCTAAAATTCAACAAATCCAAGCATGACGTGAGTTTTTCAGAG
-TTTTGAAGAAAAAATCGATTTTCTCGCAGATTCTCGGCCGGAAAAAGGGC
-GCACAAGTTGGAGCACCGACTGCGTCACGAAAACGAGCTCACGAGCAACG
-TGAACAGACGCTAGGCGTAGAATATGACCGGAAAAATAAGATTAGCAAAA
-TTGTCGACAAACGGCTCGGCGAAAAGGACGGAAAAAGCGAGGAGGAGAAG
-GGCGCGATGAGATTCACAGAGGAAAGAGTCAAAAATTATAAAAGAGCATC
-GAAATTCAACTTGACAGATGATGGAGATGAGGAGGAAGAAGGTTTATTCC
-GAAATAAATTGAGAAAAATTTTAATAAAGTAAATTTCAGTACTTACTCAC
-AAGGGAAAAGCGCTCTCGGACATTGAAAAATACGACAAATCGATGATTTC
-CGACTCGGATGACGATGAAGAGCCGGGAAATTTGGGCTCAAATATGGTAA
-AAGTGGCTCATTTCGGTGGTGGAGAGAAGACCGCCGAGGAGCACGTCCGC
-GAAAAAATCAGCCGAGAGGATATGATTTCGAATTTGATTGCGAAAACGAA
-GCTGGCGCGTCACGAGAAGCAACAGCAGAAGGATGAGCTCGAGCTGATGA
-CAGAGTCGTTGGATTCCAAGTATCAGGCTTTGATGGGCAAAATGAAGGCT
-TCATTTAGGCCGACCGGGCGCCAGCCGCTGGAAAAAGATGATTACGACAA
-ATTGGTACGGGAAACATCCCGGTTTTCTCCAAATTTTTAAGATAAAAGAT
-AATTATAAATTTAGAGTGAAAATCGATTTTTTTCACAATTTTTTAGTGGA
-AAACCTAAAACCCAAAAAACTTGATCTGAAAATGCTAATTTTTAACCATT
-TTTGCTATGGAAATTGGAAATTTTCATTAATTTTGCTGTAAAAGTTGAAG
-AAATCCAAGTTTTAGCTTTGTAATCAGAGAAAACACTGTAAAATTATTTC
-GGAATTTGTGCAATTTGAAGTGAAAAATAAAACATTTAACTTCTTATCGC
-GAAAGAAATTGAGCTGAACTGAGAATTTTTTTGACGAAAAATCATTAAAA
-AGTCAATTTTTTTGACAAAAATTCGAGAAAAGTCGGTTTTTCTTTTGACA
-AAAATGACGAAAAAGGCAATTTTTAATTTAAAAAAATAAATTTTTCGCCG
-AAAAATAACTTTAAAAAAGTCGTTTTTTTACAAAATAAAACAATTTAAAA
-TAACTATTTTTCGACAAAAAAATTAAGAAAAAGCCAATTTTTTTGTTTAA
-AAAATGATAGAAAAAGGCTTTTTTTTTGTTTCTTCGCCTAAAAAATCAAG
-AAAAATAGGTTTTATTCCATTTTTTATCCAAAAATTATTATTTTTCCAGA
-CAATCACCTTGAAAACCGAAGCCGACGCTCGTGCCACCCCAGCAGATCGT
-AAGCTATCCGAAGAAGAAGAAGCTCTGAAAGAAAAAGAACGTCTGGAAAC
-TCTCGAGGCCGCCCGTATCTCGAAAAATAATGCATTTTTCAACGCAAAAT
-CTCATTTATCAGCCGATGCCGACGTTGATATCGATGCTGGATCGAAGGCC
-GACGCCAGAAAAGTTCAGGCGAAAAATTCGAGATTTGAGGTCAAATTTGA
-CGATGAAGGTGGCCTGATCGATGAGGATACGGTGGAAAAATCCAGGATTT
-TAAAGAAAAATCTGGATGGTTCTGATGAATCTGACGATGACGAGGATCTA
-GAAGATGAGGAAGAGGATCTGGATGATCTACTGGAAGATGAGGATGAGCT
-GGAAGAAGATTCCGATGATGAGGAAGCTCAGGAAGCCCAAAAAGTCGTCA
-AAAAAGCGAAAAAATCTGCTCCAGAACCCGCTGAAACTCTGCCATTCGTA
-TTCGAAATGCCGAAAAACTATAAAAAATTCTGTGCTCTTCTGGAAAAACA
-CTCGGAATCGATGGATTTAGTGCTGGAACGACTCGTGAAATGTCATCATC
-CGAGCCTTAAAGAAGGAAATAAGAAGCGTCTGAATAAGCTTTTCCTCTTG
-TGTTTAAGATGGTTTGATGATATGTCGAAGGAGGAATTGACAGCGGAAAG
-TGTGAAGGAAATGAATTTAGCGCAGGAAACTATGCATGCGTTGATGAAGG
-TAGCGATTGGATGGAAAAGCTGAAAAATTACCGCACTTTTTAATCTGAAA
-ATTGAAAAAATTCGAGAATTTTTGACCTAAAATTTTGAAAAATTCCCGAT
-TTTTATACCCCAAAAATTGCAAAAAAGTCCCGATTTTTTACCAAAAAATG
-TTTTAAAATCCCCGAATTTTTTACCTAAAAATTGCAAAAAAGTTTCGATA
-TTTAGACCCAAAAATTGCAAAAAAGTCCCGATATTTTTACCAAAAAATGT
-TTTATAATCCCCGAATTTTTGACCTAAAAATTGCAAAAAAGTCTCGATTT
-TTAGACCCAAAAATTGCAAAAAAGTCCCGAATTTTTTACCAAAAAATGTT
-TTAAAATCCCCGAATTTTTGACCTAAAAATTGCAAAAAAGCCGGTTTTTT
-TACAAAAAAATGTTTTAAAATCCCCGAATTTTTGACCGAAAAATTGCAAA
-AAAGTCTCGATTTTTAGACCCAAAAATTGCAAAAAAGTCCCGAATTTTTT
-ACCAAAAAATGTTTTAAAATCCCCGAATTTTTTGACCTAAAAATTGCAAT
-AAATTCCAAAAACTTTGGCCAAAAAATTAAAAAAAATACCCGAATGTTTG
-ACCCAAAAATTGCAAAAAAGCCCCGATTTTTTGAGAAAAATCATGTGAAA
-TTAAAACCTTTTTTTTTTGAAAATCAGTCTCGAAAAAAAAAAGAAAAACC
-AGGAAAATCATGAAAATTTAAGAAAAAAATCATTAAAAATAGGAAACGAT
-CATGGAAATATTTTTAAAGAAACATTATATAAAAAATCATTAAAATTTCA
-GAAAAAAAATATGGAAAATCCTGAAAATAAAGAAAATAATATTAAAAATT
-CAGATTAAAAAACGCAAAAAATTCAACAATTGAAAAAAATTTCAAATTGT
-TTTTTGCAGTTCGACATTCAATACGGAGTCCGATGTGTGCGTGCTCTAAT
-CCGTCAACACTGGAAAGGCCGCCAGGATAAACAGAAGAGTAGCCCAGTGT
-CATTTGGATTAATCTCTGCAATTCGTCTTGTTTCCGGCCTCTTCCCAGTT
-GCCGATTCCTGGCATCCTGTAGTGGTTCCGGCTCTTTTTTTGGCAACTGA
-AGCACTTTGCTCGGCGAAATGTGCCAATTTGAATGCGTTGGCTAAACAAA
-TTCAATTGGCTAATGCTATTGTTGAATATGTGTCTGAATCCAAGAGGTAA
-TACTTGGAAACGAACATTTAAATAGGCAAATTTTGAAAAAAATACTGAAA
-GCTTTGATATAAAATAGGAAAAGTAACGAAAAAAAAAGCCAAAACCACCA
-AAAATATTATTTTCAAAAGCTAACTCAAAAAATTTAAAATTCAGAATTGT
-CGCTTAAAAAAATCTATTTTTTTCGATATCGAAAAAAGATTACTATAAAA
-ATTCAAAAAAGCAATTTTTTAAAATATAACTTGATTTTTTTTTCTGAAGT
-TCATTTTTTAACAAATAATTGCATTAATTTTCCATTTTAATGTTAAAAAA
-AAGCGAATTTTTCAAAAATTGATATAAATTTTGTTTTGGCAATTTTTAGA
-TCAGAAAACATTGAAAAAATACAAAAATCCCGTTTTTTTTTAAATTAATT
-TTTTAGAAAAAATTGCAATTTTTCAAAAATCTTCCGGTCATTTCTCTATT
-TTTAAAAAATCTCTCGTCTCTTTTAAAAAAATTTAAAAAACCGAATTATC
-GAAGCGTATCAAAATTTTGAAATTAAAAAAAAAACCGAACTCCATTTTTA
-CGAAAAATCCGAAAGTTGAAAATTGTTTTCAATAAAATAAATTTCAGATA
-CGTCCCCGAGCTGGTCGCATTTGCTCGAAGTGCTCTTCTGCTTGCAGTTA
-CAGAGAAAAGTGAGAAATTCGCGACAAATGGATTCCCGATTTCCAAGCCA
-CACACGGAAATGTTATGCTTTGAGGAGAAGGTAAATTTATAAAATTTGTT
-TTTTTGAGCAAAAAATTGGTTTTTTTTTTTGGTTTTCTCTTTAAAAAAAT
-TTGCTTAAAAACGCTCAATATTTAAAAAAAAAACTGGCAAAATCGAATTT
-TATAATATAAATTAAAAATTTTGTTCAAATAAAAATGATTTTTTTTTGAA
-AATTTAGTTTTGAAAAATTTAAAATTAAATTTTAAATTTTCACAAAATTG
-CCAATGATAAAATGTTCACTTTTTCTTGTATAAAACTGCTTGAAATTTTT
-TAAAAGCAATTTTCCGAAAAATAATTTTTTAATAGATTTCTGAAAAACCG
-AAAAACCACCGATTGAAAAACGAAAATCAAGTTTTTTTCCGAATTTTCTA
-TTTTTAACAAATTAAATATCAATTTTGCACATACAAAACGGTTAAAAAAA
-AACAAAAAAAATTGCCGAGAGCCAAAAAAATTTAAGTTTCAGCGATTTTG
-AAATTTTTTTTTTAGGAAACACGGTCTCCTCGGGTGGAAACGAAGGGGGA
-GGGAGATTGCTTGCGCGTTTCACCGATGCGCCTTTCGCGTGCTGGCGCAC
-TTCTGAATATTGAATTATTTTTGCGGAAAAAATTCATTTCTTCTATGAAA
-TTTTCTTGAGAAAGCAAAGGAAAGATGATGAAATGAATTTTTAAAATAGT
-TTTCTCAGTTAAAAAGAGAATACCTTGCTGCAAAAGGTTAAATTTATTGA
-AAAATTGAGAAAATAAGAAGTTTATCTTTGTTTTCACTACATAAAGTGGG
-GAAATCTCAAAAAAATTTGAAGACAATTAAGAAATATAATTAAATATATA
-GCCTGAAAGTCAAATAAGAAATGAAGGTTTGGTCACAAACAATTTTATTT
-TTGAATTGAAGTTTTGAGAAATGATCATGTGCCAGAATCACTAAATCTGA
-GACATTCAGCCCAATTTCTTTAATTTTCTGTGATTTTATCATGGAAGTGT
-GGCTTTTTCTGTGATCTTGCCAGTTTTAACAAGTTGAAATTGGAAAATCG
-TGAAGTGGGAAACTAGCAGTGAAGCTTCCAAAAATTTCAAGCCTTACTGA
-AAGGAAAGTATTGGAAACTAAAAACGAAAGCTTAAGAAGATACCGTTTTT
-ATATATTTGAGTTTTGAAAAGCCTTAATAGGTTTTAAATACAGTTTTCTC
-AAGAATTCAAACTTGTAACGATTAAGTTGAGGCACAGAATAAGATGGTAA
-TACTAAGTTATGTTGAAAAAAGCCAAGAAAGACTGAAAACATTGCTTTCA
-ATCTGATTTTTTGTAAGTAATGTAATGTTGAAACATTATTCTTCATAGTT
-CAGCACTTTGTATGGCTTATTTGAGCCCAAACGTACAGTAGTATGTGGCA
-AGAAATAAAATATTGTGCCAACAAAATTGGAGCCGAAAAACCCATGATAA
-AATGTTTAATACGTGTATTGCTCTAATAAAATACCAAATATTAATTAGAT
-TCACTGTCTCGACTCTTTTTAATTCAGATTAATAACTTTTAGCTCCTCTT
-TTTAACGAAAAATTATAACTGGATTTCACAAAAAGAGTTCGATCTGAGTT
-CTTTCAACAGGTACATAGACGAATTATATCTTAAAATGACGAGAAAAGTT
-TGCTCTATAAACGTTATCATTGCAGGTTATGAGAAAAACAAATAAAAATT
-TAATTTTAAAAAATCCGAAAATTCAGTTGTTATTTTCAAACAGTTCGTTA
-TGCATTTCCACCGAACGGTTTCCGATAATTTTTGTTTCTCCACTTTCGGT
-TCAGTCTACTTTATAATTGTTATCATTTTGAAATAGAAAAATCGACGAAA
-AACTAATAAAAATCGAGGGAAATCACTCTTCAACGGTGAAATCTCGGTGG
-ACGCAATGAAGCTGCAGCATTTCAAAAAAATTTTAGAAGCAATTTTGGTC
-ATTTCAGCTTCAAAAAGCTTTAAAACTTAAAAAAATTAAAATTCATTTCA
-AAAAATTTGAAATTAGTCATTTAAAATATAAAAATTAGAAAAATTCTAAT
-TTTCAGCGAATTTTCAAATTTATTTTTATTTCAGAAAAATTCAAATTTTG
-GCTTTCAAAAAAGCTTACAAAATATTAATTTTTAAAAAATCTAACTTTCC
-CAATTTTTCAGTACACTGGCCCCGCACTCCAGCCAATCTCCCTGACCACA
-ATCTTCAACAATTCCCCATCCGATCCATCTCTAAAGCTTCACGTTCTTCG
-TGCTCTGCTCTCCCTCATCCAACATCTCCGTGTAATCTACTCCAACCAAA
-ATGAGACCTATTCTATCGTTTTCAAGCCATTCCTCCGGATTTTGGAATCA
-ATTCAAGCCAAAAATCTTCCAGCCGAGGTCCAGGAAGAGCTGGAGACTCT
-GTGCGCCTCAATGAAGGCTGAAATTGGAGCCAAGTGCCGTCTGGTGCACC
-TGTCGCTGGTGAAAACCGAAAAGAGCATGCTGAAAATGCTGGAACCCCGT
-TTCGAGTGGGATTTCGATCCGGAACGCCCACATCACGGACCCAAAGACGA
-GAAGAAGAAGCTGACGAAGAATCTGAGGAACGAAAGACGCGGAGCCATCA
-AGGAGCTCAGAAAGGATACGGCATTCTTGGCCAGGAAGCAATTGTCGAGT
-GTCAAGACGAAGGATCGTGCGAGAATTGCGGCCACGAAACGTGTCATGGG
-CGGTCTTATGCAGCAGCAGGGTGAATGGAATAAGGAGAAGCGTACGGCGG
-ATGTTGAGAAGAAGAAGGACAAGAAATAATTTAAATTTTCCTATTTTTTG
-TTTGTTGAAAATGACTTTATTTGGCAAAAAAAACCCCTAAATTTCAGTTT
-TTCTCGATTTGTTGAAAAATAGTCAAAAAACTGATTTCTATGTTATTTTT
-GGTCAAAATTTGCCTTTTTCAAACATTTTTTTTGCCATTTTTCCTCCATT
-TTTTGTTATTTTTTTTTTTCGTTTTGTTATGAGATATGTTTCTGTTTTGT
-TGACATTTTTTATTATTGAAAATTAAACGAGTTTTCTGAATTTTTTTGTT
-CAATTTTTTTGAAATTTTCCGTTTCACATACGTTTGTCAATATCTCGATT
-AATTTTTGAAGTTTTCCAATTGACTCGCGCATTTTCTAAAAAGTTTTTAA
-ACTTTACATTGAAAATACCCCTCTAACTCGAATATCTGATTTTATTGGAA
-TTTTGAGTTTTTTTAGGTTAAAAAATTCTTGTGCTAAAATCATCCATTAT
-AGTTCGTAAGTCAGCAAATTTTGGCTCAAACTTAGAGCGATTTCCAATTT
-ATGGAGTTTTTTGTTCAGAATTCTCGAAATTTTCTCATTTCTGGAAATTT
-TGAGTCTACGAGTCACACAGTTGTTCCGTAATTAGCTTCACTTACATCTC
-CTCAACTCTGCAAACTCTCAAACTTTCGGGAAAGGGTCTCGCCACGAAAT
-CACGGGTGGGCGGCAATTGCAGTTCGGCAAATTGCCGGTTTGCCGGAAAT
-TTTCAATCCCGGCAAAATTCCGTTTGCCGGAAGTTTTTAAACGGGATCTT
-TTATAAGACGGAAACACTTAAAACTGCCATTTTTAATTTTTTGCCCGTTT
-TCTCTAAATATTTTCATAGAATTTACTGACTTTTTAGGATAGATGTTTTC
-ATGGGATGTGCACATGTTGTTCCGGCAAATCGGTAATTGCCGAAAATTTG
-AAAAACGACAATTTGCCAAAAAAATCGTTTGCCGTTCACCCCTGTATTGT
-ACCATTTTTGGCGAAAATGCGCGTAAATTAATATGCTTGCGTGTGTAATA
-TTTCGTTCATATATTCTAAATATACGCACCTTTTGAAATATTCATAATAT
-ATGCATTTACGTACGTTCGAGAATATTTTGGGAATACACATTTATCATCA
-TTCCCACCCGTTGCCATAGTATCCTCATCCCCGCCCCGCCCCGCCCCTTT
-CTCTCATTTCCTCTTCCAAATCCTTAATGGCTCATCCGGTCATTGGAGAG
-ATATGGCAGATGTGGCGGTTTTGACGAATGTTCTGGAGAACTCGAATTTT
-ATATAACTATTAGACAATTTCGATATTAAAAACATTTATATGTAAAATTT
-TCAATTTTTTGAATTTGCTCGCCGAATTTTGACTTTCTGACAATTGTGTG
-TCGATTTACGAGGGTTATGTATATTTACGATATGTTTTTAATCATTATCG
-AATGCTGATTTCCGTTTTTCTACGAGTTGTCTTCATTTTCGTTGGTTTTT
-TTTTGTTTTTTTTTTTTGAAAGTGTATTTTTTAAGGTCAAAAAACTAGAA
-AAATATTCAGTTTTCAGTCAGGAAAACCATTTATTTGGTTTTTTCAATAT
-TAAAAAAATTATTGGGAAAAATGAATGAAACTCGTCGAAAAACGAAAATC
-ATCATTCGATAAAGATTAAATATTTCGTAAATCGACACACATGTCTCCGC
-CGCGAAAAATCGAAATTTCATAGAGGCATAAAAATTCACAATATTTTAGT
-TTTTTTATTTTTTATTTTAATCCAAATCCCTATTCATGCTTAGATTTTTA
-GGTGTTTTTCTGTAAAAAATCAAAAAATTGTATATTACTCATAAATTTTT
-CCAATTTTCTCAAACCTTGGATCTCGCCACGACATTATTAAAAAATTCCC
-GTTTTCTGCAGAAATGACGACAACGGAAGAAGCTCCCAAATCGCCGCTTT
-TCGAGGCAATCGACAAAAATGACACTGAAGCAGCGCTGGCACTGCTGAAA
-ACGAAGGAACAAGCCGCTCAACGGGATCCCAGTGGAATGAGTGTGCTGGC
-AGCTGCCGCGTATAGGTATGCACCTTTAAAGCGGCGACGGTTACTGTATC
-CTCGCAGATTGTTTAAAGGTACATACCGTAATCCGTTGAATTTCAGAGGA
-AATCTTACGTTGGTCGAGAAAGCGATTGAGCTGAAATGTGATGTGAATGA
-TAAAACCGATGGAACTCTGTACACTCCACTCATGTTTGCCGCCTTATCAG
-GTAGGGCAAAAATTTTTTAAAAAAATTTTTTGCGTCAAATTTGATGCAAA
-TTCTGGTTTTTTACCGTTGAAAAGTAAAAAAAAATTCCGAAAAAATCGAT
-TTTTATGCTAACAACAAACTTTTAAGTGAAAAATCGTGGAAAATTAGACC
-CAAATCACGTATTTTTGATCTGAAATTCAATTTAGCGAAAAGTCATCGAA
-ATTTTATGGTTTTCGCGGTGAGACCCAATATTCGCAATTTTTTTTTGCAC
-CAAATACAACACATTTGACGCGCAAATTCAAATTTTTGAAACTTTTTTCC
-GTTTTTACAATATTTTTAGGCTGAACCCCAATATTTGAAAAAAAAAAAAC
-CAATACACTATATTTTACGCGCAAATGTTAAATTTTTATTTAAAATCCTC
-GTAAAGTTCTATTTTCTTTTTTTGATCGTTTTCAAGCTCAAAAATTCAAA
-TTTCAATTCGAAATATTACCGGAACACAAAATTCTGAAAATGCGTACTGG
-TCAACATATTTGACGCGCAAAATATCTCGTAGCGAAAACTACAGTAATTC
-ATTAAATGACTACGGTAACGCTTGTGTCGATTTACGGGCTCGTTATTAAA
-AATCATTAATTTCAAAAAAATCGAGCCCGTAAATCACCACAAGCGCTACC
-GTAGTCATTTAATGAATTACTGTAGTTTTCGCTACGAGATATTTTGCGCG
-TCAAATATGCTCAATACACATTCTCAGAATTTTGCGTTAACGTATTACTA
-CTTTCTTAGTTTTTCCAAAAAAAAAATTCGAATACACCATATTTGACGCG
-CAAACTTTTTTTTTCAAAGCAAAATTGTCAAACGTTTGCAGGAAAACAGG
-ACGTATGCCGCCTGCTAATGGACTCCGGAGCCCGTATGTATTTGGTGAAT
-GGAATCGGAAAAACCGCCTCTGAACTGGCGGCATTTGTGGGTCATCACGA
-GTGTGTGGCAATTATCAATAATCATATAACAATTGATGTGATCGAAGATC
-TTTTGCGGCCAAAAGTGAATGGAAAATATGAAGGAGCTGAGGAATATCCG
-GATGAGCTGGCTGTATTTATTCATTCATTGTGTGGATCACATGAGATTCA
-TCCTGTTAAGATTATTTTTCGATTCAGTAAATATCCCGATTCGTTGAAGT
-ATAAGAAAAAGGTACATAGCTGTGTAGTTTGGAAAAAAAACGAAAAATCT
-GAAAATTTGAGAAATTTCCTTAAGCTTTTTCAAGATGCGCATTTTTGTTC
-ATTCTTATTTTCAAAAAAATCCAAAAAGTTTTTTAAAAAATTTAATAAAG
-CATTCTTTTTAATTTCAAAACAAAAAAGTTATACCAAATAAAAACTTTTA
-GTAATCAAAATTTTTCACTTTTTCTCGGTTTTTCTCATCGTTTTTCAAAT
-TTGAGATCTCTTCCTGAATTTTGCCTAAAAATTGATTTTTTCAAAATATT
-TTCAGAAATGATTCTTTCTGTGAAAAAATGTTTGAAAATGCGAAAATATT
-CGAAACTAAAAAAACTTTTATTAAAATAAATTTTTGAAATTTTTCAGAAT
-TTAAAAATTGAATCGAATTAGGTATCAGTAGTTTTCAGATCGATTTTTTC
-GAATTTCTGAATTTGTTAAAAACTAGAAATTAAAAAAAAAACTTTTGATG
-TTAAATGTTTTTCGAGATTAAAATAAACCGAAAACCCAAAAAAAATGTAA
-AAATTGTGTTCTTTTTGTTATAATAAACCAGAATTTTCTCGAAATTTTCA
-GAAGGTTCTAGAATATTTCAGAATTTTCTCGAAATTTCCAAAAGGTTCTA
-GAACATTTCAGAATTTTCTCGAAATTTTCAGAAGGTTCTAGAACATTCCA
-GAATTTTCTCGAAATTTTCAGAAGGTTCTAGAATAGTTCAGAATTTTCTC
-GAAATTTCCAAAAGGTTCTAGAACATTACATAATTTTCTCGAAATTTCCA
-GAAGGTTCTAGAACATTCCAGAATTTTCTCGAAATTTTCAGAAGGTTCTA
-GAATATTTCAGAATTTTCTCGAAATTTCCAAAAGGTTCTAGAACATTTCA
-GAATTTTCTCGAAATTTTCAGAAGGTTCTAGAATATTTCAGAATTTTCTC
-GAAATTTCCAAAAGGTTCTAGAACATTACAGAATTTTCTCGAAATTTCCA
-AAAGGTTCTAGAACATTACAGAATTTTCTCGAAATTTTCAGAAGGTTCTA
-GAATATTTCAGAATTTTCTCGAAATTTCCAAAAGGTTCTAGAACAATCCA
-GAATAATGTTTTCAAAAAATTCAAATTTGAATTCCCGCCAAAATGTTTTC
-AAAAAATTAAAATTCGAATTTCCCGCCAAAATATGTACAGTACTCCTACA
-GTACCTCTACAGTACTACTACAGTACCCCGACCATATCCCACTACTAACC
-CCAAACCTATATCTCTTCAAAAGACTAAAACACAATTTTTCCTAAACTAC
-AGTAATCCTACCGTACTCCTACAGTACTACTACAGTACCCCCACCATATC
-CCACTACTAACCCCAAACCTATATCTCTTCAAAAGACTAAAACACAATTT
-TTCCTAAACTACAGTAATCCTACCGTACTCCTACAGTACTCCTACAGTAC
-TACTACAGTACCCCGACCATATCCCACTACTAAGCCCAAACTAATATCCC
-TCCATCAGCCGAAAACGCCTTGCCTTTGTAAACTATGACGTCACTACTTA
-ACAAACGGACACTATTTTTTTATATTTTTTTTTCAAAGCAAAAACCACCC
-ATTTTCCAGATCCTCTACGTCATCGATCGTGTCTTCGAGAAACAGCTTCG
-ATGTAAGGAAAGCAATGAAATAATGTCGCTCAAGCTTTGGCTAATTCTAT
-TTTCAATGCGTGAAACCTCGAAATTCGTGGAGTCGAACAAGGAAAAGTCG
-CCAGAAGAAGCGTCTCTACAGTACGCAAAACTGATTTCCACGTGGCAAGA
-GGGCGATGAAACTAGGCGAGCACTTGACGTGATGCTGAGAAATGCGGTTG
-CTTCGTTCCCGTATAAACATTCATTACTTCATGATACTCTACAAAAAGCA
-CTGCAAAAAAGTCAAATTGGTGAACGACCAAGTGCCTATGAATACATTGT
-TCAGGCACTTTTCGGACAACGAATCGCTGCGGTCTGCCAGTTTTGCTCGG
-TTTGCGGACATCCTGGAGCCAAGAAACGGTGCACACAGTGCAAAGTATGG
-AGTTTTTAGGGTTAAAAATAATTATTTAATAATTTAATAAAGCTCGAATT
-TGGGAAATAATCAATTCCAAATTTTAAAAATATGGAAAAAATTTTATTCC
-GTTACATTTTATGAATTTTCCCACAAACTCGGCATTTGGCTCTAGCTTCT
-TGCCCAAGTTTAGCCCAAAAAATATTAACTTGAAGCTGTCTAAACTTGGG
-CAAAAGTTAGACAAAACTTTGGCAAAACTTGGATTCAAGCTTTACCAAGG
-TCTAACCCAAGTTTCACCCAACTCTTGCCAAACTTTGGCCCAAACTTTTC
-TTATTTCGTTTCAAATTTGGGCCAAAGTTTGGCAAGAGTTGGGTGAAACT
-TGGGTTAGACTTTGGTAAAGCTTGAATCCAAGTTTTGCCAAAGTCTTGCC
-TAACTTTTGCCCAAGTTTAGACAGCTTCTGATCCAAGTTAACATTTTTTG
-GGCTAAACTTGGGCAAGAAGCAAGAGCCAAATGCCGAGAAACTCGAATAA
-AAATTGAAAGTTTTCAAAATTTCAGTTCGTTTTTAATTTACAAAATTTGG
-CAGCTCTAACAATTCTTTAAAGATTCTTTAAATTAAAAAAAAGAATTATT
-AAAACTTTTTAAAAAAATTCATTCTGTAGAAAATTCCCGTAAAATACTCT
-TTGAAAATCCGGGAAAAAACTTCAAAAAACAAAAATAAATTCTAGACATT
-CTGTAAATATCGAAAAAAGAACATTTTGTCTGTAAATGTATTAGTCAAAA
-TTAATTTCTGATACTTTTTCCAATTTTTCAAAATTTTAAGTGTCGAGGTT
-CAATTTTTTTGAATTTCCTGTTTTTCCTTTATTAAAAAAAGTTTTCTATA
-ATATGCTGTATTTGAAAATTAAAAACTATATCTGAAAATATCGAGGCACA
-ACGTTTTCAAGATCTGGTGAAATTCCGGATCTACGTTTTCCGGATCTACC
-ATTTCCGGATCTACGTTTTCCGGATCTGGCACCGTGCCAACGCACAAAAC
-GCTTTTTTGTTCACTCGACGCACGTTGTTTTTTGAAAATTTCTTCTAGAA
-GAAACGCTTAACAACACGCGACGCGTAACAACGGAGCATCGTTATCACGT
-TTTTCTCCGAGAAAAATAGCGTTTTAAGAGTTGGCACGGTGCCAGATCCG
-GAAATGGTAGATCCGGAAAACGGAGATCCGGAATTCCGCCAGATCTTGAA
-AATGTGGTGCCTCAAAATATCGATTAAAGAATTTTTTCTGAAAAATATCC
-AATTTTTCAACAACAGAATAGCTAAAAAGTGAAAAAAAACTCAATTCTCA
-TTATAAATTGCAAACAATTTCCAAATTTTGATAAAATGGAAAAGAGTTTA
-AAAATTTCAGGCAACACATTTTTTAACTCTAGTAAACGTTTTTTAAATTC
-CAACAATTTTTACAGCTCGCCTACTGTTCCCAAGAATGCCAAAAATTCGA
-CTGGCCAATTCACAAAAAAGTGTGCTCATTTCTGAAAACGCGACAAGAAG
-TGTCGCCCACCGACGAGACCGCCATGTCGCTGGACGATATTCAGGCTCAA
-ATCGCCAAAATCGACGTGTAGAAGTGCCGATATTTCGATCTCAATATACT
-TTTTTTCTGGAATTTATTTATTTTTAATGTATATTTCGGCTTCATCTCAT
-TGCACGAACTTTTAATTTCATTTTCATAAATTCATTTTTGAAGTCATTCC
-TTGAACAAAAATTCACTAAAACATGCATTAAGAAATATGGAATCCAAAAA
-TTAATCTAAAAACCTTTTCAAAAAACCACTTCGTCAAAAACTGATGATGG
-AAAACTCGTTGAAAAACGGAAAGAGTATCCAATAAAGATTAAAAATTTCG
-ACATTTCGTAAATCGACACAAATCTCGTAAATCGACAAAAATGAAAAAAT
-CAGGAACCCAAGAAATTCAATATTCTCATTTGTAAAGACAACTGGTAAAA
-CATTTTCAAATCAAAAAATTATTTTTTTTGCCCTCAAAATTGATCTCCGA
-ATACTATAAAAAAGAAAACTATAAAAAGTGGCGAAAATTCGAAATTTTTT
-AACCCCTCTAAAATGGTTCATTTTAGTTGTCTAATGATACAACAAAGTAG
-ACATAGTTCTACAATATCTGATAAATACTTGAAAAGTCTAAAAACAAAAG
-TTTTTTCGTTTTTTTAACGGATTTTTAAAATCCAGAAGAACGAAAAAAAA
-TTTTTTTAAGAGAATAGAGTAAACTAATCATGTTCGAGCAAAAAAATCCG
-ACTTAGAATATGAACGGACCCAAGTGTATCATAATTATTTTAATTTCTGT
-GTATCAGAATTATTTTAGTTTCCTTAGTGTGATTCCCAAACTGCTTAAAT
-TCTAGGAAATATTTCTTTACTGGAACACTCTTAGCCACTGTACGCTGCCG
-AACGAATAATAAGAGAATACAGAACACCAATTATGCCCGAGAAAAAGATC
-CTACTCAGAATATAAACATAGTCAAATTTATCGGATGTATAAAGATTCCC
-GAAGACACTTTCCAATTACCCAAATTGTTCATATTCTAAATCAAATTCTC
-TTACTAGAACGCTCTTGGCCAATGTACGCAGCCGAACGTATCATAAGTGA
-ATACAGAACACCAATTATGCCCGAGAAAAAGATCCTACTCAGAATATAAA
-CATAGTCAAATTTATCGGATGTATAAAGATTCCCGAAGACACTTTCCAAT
-TACCCAAATTGTTCATATTCTAAATGAAATTCTTTTACTAGAACACTCTT
-GGCCAATGTACGCAGCCGAACGTATCATAAGTGAATACAGAACACCAATT
-ATGCCCGAGAAAAAGATCCTACTCAGAATATAAACATAGTTAAATTTATT
-GGATGTATAAAGATTCCCGAAGACACTTTCCAATTACCCAAATTGTTCAT
-ATTCTAAATGAAATTCTCTTACTAGAACACTCTTGGCCAATGTACGCAGC
-CGAACGTATCATAAGTGAATACAGAACACCAATTATGCCCGAGAAAAAGA
-TCCTACTCAGAATATAAACATAGTCGAATTTATCGGATGTATAAAGATTC
-CCGAAGACACTTTCCAATTACCCAAATTGTTCATATTCTAAATGAAATTC
-TCTTACTAGAACACTCTTGGCCAATGTACGCAGCCGAACGTATCATAAGT
-GAATACAGAACACCAATTATGCCCGAGAAAAAGATCCTACTCAGAATATA
-AACATAGTTAAATTTATTGGATGTATAAAGATTCCCGAAGACACTTTCCA
-ATTACCCAAATTGTTCATATTCTAAATGAAATTCTCTTACTAGAACACTC
-TTGGCCAATGTACGCAGCCGAACGTATCATAAGTGAATACAGAACACCAA
-TTATGCCCGAGAAAAAGATCCTACTCAGAATATAAACATAGTCGAATTTA
-TCGGATGTATAAAGATTCCCGAAGACACTTTCCAATTACCCAAATTGTTC
-ATATTCTAAATGAAATTCTCTTACTAGAACACTCTTGGCCAATGTACGCA
-GCCGAACGTATCATAAGTGAATACAGAACACCAATTATGCCCGAGAAAAA
-GATCCTACTCAGAATATAAACATATTCGAATTTAACGGATGTATAAAGAT
-TCCCGAAGACACTTTCCAATTACCCAAATTGTTCATATTCTAAATGAAAT
-TCTCTTACTAGAACACTCTTGGCCAATGTACGCAGCCGAACGTATCATAA
-GTGAATACAGAACACCAATTATGCCCGGGAAAAAGATCCTACTCAGAATA
-TAAACATATTCGAATTTATCGGATGTATAAAGATTCCCGAAGACACTTTC
-CAATTACCCAAATTGTTCATATTCTAAATGAAATTCTCTTACTAGAACAC
-TCTTGGCCAATGTACGCAGCCGAACGTATCATAAGTGAATACAGAACACC
-AATTATGCCCGAGAAAAAGATCCTACTCAGAATATAAACATAGTCAAATT
-TATCGGATGTATAAAGATTCCCGAAGACACTTTCCAATTACCCAAATTGT
-TCATATTCTAAATGAAATTCTCTTACTAGAACACTCTTGGCCAATGTACG
-CAGCCTAACGTATCATAAGTGAATACAGAACACCAATTATGCCCGAGAAA
-AAGATCCAACTCAGAATAAAAACATATTCGAATTTACCGGATGTATAAAG
-ATTCCCGAAGACACTTTCCAATTACCCAAATTGTTCATATTCTGAATGAA
-ATTCTCTTACTAGAACACTCTTGGCCAATGTACGCAGCCGAACGTATCAT
-AAGTGAATACAGAACACCAATTATGCCCGAGAAAAAGATCCTACTCAGAA
-TATAAACATAGTCGAATTTATCGAATGTATAAAGATTCCCGAAGACACTT
-TCCAATTACCCAAATTGTTCATATTCTAAATGAAATTCTCTTACTAGAAC
-ACTCTTGGCCAATGTACGCAGCCGAACGTATCATAAGTGAATACAGAACA
-CCAATTATGCCCGAGAAAAAGATCCTACTCAGAATATAAACATATTCGAA
-TTTAACGGATGTATAAAGATTCCCGAAGACACTTTCCAATTACCCAAATT
-GTTCATATTCTAAATGAAATTCTCTTACTAGAACACTCTTGGCCAATGTA
-CGCAGCCGAACGTATCATAAGTGAATACAGAACACCAATTATGCCCGGGA
-AAAAGATCCTACTCAGAATATAAACATATTCGAATTTATCGGATGTATAA
-AGATTCCCGAAGACACTTTCCAATTACCCAAATTGTTCATATTCTAAATG
-AAATTCTCTTACTAGAACACTCTTGGCCAATGTACGCAGCCGAACGTATC
-ATAAGTGAATACAGAACACCAATTATGCCCGAGAAAAAGATCCAACTCAG
-AATATAAACATATTCGAATTTATCGGATGTATAAAGATTCCCGAAGACAC
-TTTCCAATTACCCAAATTGTTCATATTCTAAATGAAATTCTCTTACTAGA
-ACACTCTTGGCCAATGTACGCAGCCGAACGTATCATAAGTGAATACAGAA
-CACCAATCATGATCGAGCAAAAAGATCCGATTCAGAATATAAACATATTC
-GAATTTATCGGATGTATAAAGATTCCCTATTGGGAAGTGGAGCAATCCAC
-GACTGGTTTATCGGCCACAGTCCCCGGCTAGGACATGGCTTATATTATTG
-GGCCAAGGGGAGCACCACCAGGCAGTGTACCTGACTCCCAGATCAGCAGT
-ACATAGCACTTGAAGAATGGATCGTCCTTTAATCTTTTAATCTTTTAAAA
-AGAATCGAAGGAACTCTCATCGGGTCATGTGGTTGTGGGGACAAAGAGGG
-AGGCTTACATCAATACCAAATACCTGTGGTAGATCACAATACCTGTGGTA
-GATCACACCCTATCCACAAAGAAAATCTGTGGACGTCCTCAAAGGAGGCC
-GCCCGCGCCCTTGAGCTGGCCAACAAACCCTTCGAGCTGGGTGGAGGAAT
-ACTCCAGCCGAGCGACTGAAAACGGCGGTAACGCCACGTTGTCGCACAAT
-AACAACAAAAAAGCCCGCGGGCCCCAAGAAGCTCAAGAAGCCCACGGCTT
-AATTTTCAAATCAATTACCTTACTATGAATCTCCTTTTTGCTCTACGAGT
-CGTCGTTGATGTCATCCTTCCGTCCAACCTCCGTCAAACAGTCCATCTGA
-CCATCCGTCCAACCAACATGTGGTGGAGTGTCCAACGCATCTGAAATTGA
-AAAATATTTATATCTGATTTTTTAAATGGAACCATTTACAAAAAACATAA
-ACGGAAAACGCTTAGCAAAAAAACAAACAATTAGTATTTAGAAAAACGGA
-GACAAATGCTCTCGCGATCTTATTTATATTAATTTTCCAGTCGATTGCAA
-GGCATCTGCTCCCACGGGTTTATATAAAATTGTGTAACTAATTTTAAACT
-TCTCTTGAAACCTTTCAACCAGTACTTTTCAAGAGTTTTTGGTAATTTTT
-CGATTTTTCAGAAATTTCAAAAAAACGGCGAAATTCCACTCAGAACCCTC
-ATTAATATTTCACTAGTCCAGCACACTAACCCAAAAAATTATTTTTTTTT
-TGAACTACAGTAATCCTACAAAATTGCTACAGTACTATTACGGGACCATA
-ACAAAATTTTGATAATGCGTATTGCGCAACATATATGACGCGCAGAATAT
-CTTGTAACGAAAACTACAGTAATAATTTGAATGACTACTGTAGCGTTTGT
-GTCGATTTACGGGCTCAATTTTCGTAATGTTACACGACACATTTTTTTGA
-CAAATGCAAAAAAGTGTGCGCCTTCAAATTAAAAAAAAATTTGATTTTTG
-TTGCCGGCTTTTAACACATCGAAAAAATAAAAGAAACGAAAGTTTGTAAT
-TACAGTACTCCTCTTAAACGCGAACACCTTTTCGCTTTTCAGAAAAACTT
-GCGCCGTTTCGAAACCGGGTACTATACTTTTATATTAAAATCGATTAAAA
-ATCGCGAAATTTTGCGGTGGAGCATATGTCAAATTGCAACTCGAAAAGAA
-AAAATCTGAAAATGCATGCTGTGAAAAAAAAAGCAGCAGTACTCCAAGTC
-ACCCATTGGAAAGAATGACTGAAAATTGAAAACAATTCTTCACTTTGAGC
-GAAAAAATGCCGCGTTGAATGAGAGAGGGACGAATCGAAATTTAAAAGGA
-GAAGATCAAAAAAAAATGTTTGTGGTAGGTCTGGAATCTTGCAAATTATC
-GTTTTAAAATCAATTTTTAACACTTTTATATCATAAAAATAGTTTTTCAT
-CAATCAATCGATTAAAATACCAACTCTCGAAAATTAACAGCTTTAACAGC
-GCCGTCTACTGATTTGAAATTGCAGTCGCTGCCGCTCAATTAAATGTTTT
-GCGCGTCAATTAAAATGCCTTGTACGCAGATGCGCGTCTCCTAAAAAATA
-AAAAGTTGTCCAATTTTATTGAAAACGGGTATTTAATTCATGTAAATATG
-CTGAATTTAGAAAATCTAGGTTTAACCTATCAAAAACTATAAAAAAGTGG
-CAAAAATGGGCAATTTATGGCAAAAATTCACAATTTTGAAACTCCTCTAA
-AATGGTTCATTTTATTGGTAGAAGAGGACTAAAAATTGATATCCGAACCC
-TAAAAAAATTGTCCTTTTTCAATATTCAGAAGAAAATTATGAAGTTATTT
-ACTTCCATTTTTCGATTGTACGGTAAATCAAAACTAAAGGTGGGCACGGT
-ATCTGATAAAGTTACGATCGTTCCAGGATCACGAAAATCGAATAATTACA
-CAGCCAGAGTTACATGAAACAGTGTTTGGGAAATTTAAAAATCAGTACAA
-GAAAACCTCAAAAAAAAAACAAAATTACAGGAAAAAACGGAAATTTTCAG
-TAAAAAATTATAGGGTATGTAAAATCGATAAAATATTTAAAATTCAATCG
-TATTCTCCGTTTTCGGCGTTCGGATCGTTCACTGGAAGTACGGGATGTCG
-AAGTTTGAAATTGAAGAATTCGCACCAACCGGCTGGAAGTAGATCGTGGG
-AGCTGCAAAAAATGTTCGTGGCCGCGAAAAAAATCGGTGGCCGATTTTTG
-TTTTTTCGCGGCCACGTTGTGACTAGACGGCGAAATAAAAATTTGTTTTT
-TGGTTTTTAGTGTTCAAAACTGTTGTTCTTGTTGAAAAACAATTTTTTCG
-AATTTTTTTTGTTTTTTCAACTAATTTTTTTTTCTGAAAATGCTTTTAGA
-ACAGTTCATTTTGTTTTTTTTTCAATTTTTTTCAGACACCCCTTACTCCA
-TATCATAAAGCTCGGAAAATTCGGAATCCCATCCCTGAAACTCGATGAGC
-ACCGTTCTACCGTGTACTTCTTCGACGGAGGCCGGTGATATCCAGTAGGT
-CTCGTTTTGGCCGACGGCTTCAAGGACACGACCGAACTGAAAAATATTGT
-TTTTTTTTTCAAAACCATTTTTTTTAGGAAAAAATTTTTATTGAAACGTT
-TTTTTTTTAATTTTAAAATTCCAAAAAAACGCAAAAGTGCAAAAAAACTT
-GAAAAAAATGTTCTCAATATTTTTTCCGACTCACAATCAAAGAAAATTTG
-AATCGAAAAAAATTAATTGTTTTCTTTTAAAATTTAAGGAAATTATTTTT
-CTAATTATTTCTTCCAAAAAAAAGTTTAAAAATAATAATTTTTCAAGTGT
-TTTTCAAGAGAAAATTAAAAAATTTCAAATTTCAAATTTTAATATACTTT
-TTATTTTAAAAACTTGTATAAATCTCCGAATTATATGGATTTTTTTGAAA
-AATAAAAAATTTTTTTATTGGAAAAAGAAATCTGATTTTTATAGTTTTTT
-TTTTTAATTTGAAAAATACGAATTCTATCACGGCAACTCAAAATTCTGAG
-AATGCGTACTGCCCAATATATTTGACGCGCAAAATATCTCGTAGCGAAAC
-TACAGTAATTCTTTAGATGACTACTGTAGCGCTTGTGTCGATTTACGGGT
-TCAGTTATTTAAATGACTTTATTTTTCGTATTATTTTCTTCATTTCAATT
-AATTTTAAAAATTGAGCCCATAAATCGACGGTACCGTAGTCATTTCAGGA
-ATTACTGTAGTTTTCGCTACGAGATACTTTGCGCGTCAAATATGTTGTGT
-AGTACGCATTTTCAGAATTTTGAGCTGCCGTGATAGAATTCGTATTTTTC
-AAATTAAAAAAAAACTATAAAAATCAGATTTATTTTTCCAATAAAATTCG
-TCTAATTTATAAAAAAAAATAAAAATAAAAATTGAACAACGCTGAAAAAT
-CCCAGATTTTTTTTTCTTATTTTTTGAAAAAAAAAACTTTTTTTGGAATT
-TTAAATTACATAATTTTTTTGGTTCAATCAATTTTTTGGTTAAAAAGCGT
-TTTTTTTTCCTTCAAAAAAGCACCTCAAACATGTGCCTTCTCTCCTTGCT
-CGGCAACGGCCTAAGCATCTCATCAGGAATTTTTTCCGCCTGCTTCTCCT
-TCAAATACCCTTCCCACTTGAATTTCCCGGGCTCAGTGCCTGCAAGCCGA
-TCCAGCTTGATTCCGAACTTCTCAGCATAGCCGACAGGATGCATAAAATG
-ATTATCAATATGAATTGGGAAGGATTCATCGTCCGATTCTGTCTCATCAG
-GTGAAATAATTAAAAATCCAGGCGTTTTGCATATTTTTCGAATTGTTGCG
-ACGCAAAATGACTGGCGTAGGTCGCTGAGTGGATCCAAAAGTTCAAATTT
-TTGGCCGACTTTTAATAAATTTAATTTTTCAGCTGAAATGTCAGGTTTCC
-CAGCAAAAAGTTGCTCGAAAGTGACGTCATCTTTATGATAACTTCCAGAA
-CCTTCTGCGATCCGTCTGGAATGTTCCAAATAACCTTCCGTAGCCTTAGT
-CCGTAATCCATTAATCATTGCAAATCCGACTGGAAACAGGAAGAAGCTCG
-ACTCATCCACCCAAAACTCGACGTTTTCATGCTGAACCTGCCGATCTTTG
-GCCTCTACGGAAGGAAGATCTTCGGGATAATCCTGAGCGGTGACCATGAC
-CATCAGACGGCGGCCAAGGATCCTGAGGATCCGTGCGACACGGATTTCTG
-TTGGCTCCAAGTAGTTGAGTAGCTCGACGCGTTGATTCAGCCGGAAACGA
-GATGGGCGGTGGGCAAGGTGGCGGAGTTGGTCGAAGATTTTTGGCTCAGA
-GATTCGATTTTCGTGCAGCTCGGCTTGAAATTCCTGCAGGAAAATTTTTT
-TAGGAAATGGGAAAATCAGAAGGGTTTTTTGGAGTTTTTTTTCAGTATTA
-TTTTTTTTGTTGTTTTTTTGAGGCTTTGTTAAAGTTTTTAGGTGAATTTT
-TTTTGTTGATATTTTTGGTTTGTTTAAGAATAAATCATTTTTTGAAAAAA
-ATTCGTTTTTATATTTTCGGTTTTTTGCTGGTTTAGTTAAAAGTTTTTTT
-TTCGGATTTTCAGGTTTTTTGACAAAAATTGATTTTTTTTTTGGTGTATT
-TCTTAGGTTTTCGGGTTTTTTTTTTGGTTTTTGACGAAAAATTTATTTTA
-AAAAAAACGGACTTTTTTGCAAAAAATATGGGGTTTCTTAAAAAAAAAAA
-TTTCAATTTTTTTTGTTGGATAAAATTAAAGTTTCTTTTATGGTTGATTT
-TTCGCCTTTTTTCACATTCTCCACCAGAAAAAACATGAAAAAAACCAGAA
-ATGAGTAGTTTTGAGCAATTTTCAGGCAGTTTTTCCGCTCAGAAAATAAT
-TTTGGCCGGATTTTCATGGTTTCTCACATCCAGAATCTCCTCTGTTGGCC
-GTGGTACGGGCGGTGCAGGCGTAGATCCACGTCGCCAAAATTTCGGGCAT
-TGCATCGGTTTCAGCAAGCTCAGTGGCCTGTATTGAAGCCATTTCATCGC
-TGGATCCTGCTTGAGACCGCTGAAATTTCGCGTTTTTTTTTGGAAATTTT
-GTTGAAAAATAACCTTCCAATATCGAAAATATCCTCTGAAAGCATATGAA
-ACCAGCAGGGTCTTCTATTAAGTTCCCCCACAAATTTAATTGCCACGTAG
-AAGCCGCAGACAGCAGTCACCTCGCCGAACCAGCGGATTTCTGGAGATTT
-AGTGGTTATAGAAGGATCCAGAGACGGTCGGACGACTACTTCTAGCTGAA
-AACATTAAGATTATGGCTTTAAAGTTTTTTAAAAGAAAAACCAACTCGAA
-ATCCAGGTTTTAGGTGCTGATTTAGCTTTTCCAGCGGCAAACAACCCTCC
-AGCGCCTCGACAGGTAAAAATTGAGTATTTCCATCATAATTACATCGGAG
-TTCATCTGACCATGTGAATGTTCCTTCAATTTGTGGCTTTGGAATCCGCT
-GGGCGATTTTCTCAACTGGATTTCTTCGACGATAGAATAGCCGTTCTTCG
-GTGAAATATCGGTATTCTGCTTCTTCAAGTTTGTAATTATATTGACGCTG
-AAAGTAATAAATTATGTTTTTCGATAAAAATGCTTTTAAAATTACCTTTT
-TATTCGAAAAATTCATTGATTTTAATTAAAAATCTATTTAAATTGTTTAA
-ATTAAAAAGTTCCAAGCTTCTGTAGTTATCGCGTCGAGACCCAACACACT
-AATTACCACATGCGCCTTTATATAAATTTTAAGAAAATCAACATTTTAAA
-AGATTTTTACAGTTTTTTTGTCGTTAAATTTTTCGAAAAAATGATTTAAA
-CTCACAGTAAACTTGTTTGAAACTTGAATATTAAAATTTCACAGTCAATG
-GGTTAAATTTCAAGACTTTCCCACTGATGATACGGTAGGCGCGAAGTACG
-GTAGTTTGTTTTGTTTTTTTTTATTTTGCCGCCGAGTGATTCAAATTTGA
-ATTTATATCATCCGATTTTTTGATTTTTTCCTCAATATTTCTCGATTTTT
-CAGCTTTCAGTGTGATTTTCCAAGAGCCGTAGCTCGACCAGACGACGGAG
-AGCCTGAGGCTGGTCGCCAGAAGCACTATGAAGTGTGGGTTTTTTTTAAA
-GCATAATTTGCATTAATCTTCTAATATTTTAGCCACCCCACACCGTCCAC
-GAACAAACTCCGAATCGAAGCTCGGGGCTCGCGAGCAGCTTCTCCGGGAC
-TCTATACGAGTGGGTTTAAGTTCTTAATTTCAAATTTCACTCATTTAAAA
-ATTTTATTTTTTAGCTTCAAGTAGCTTCGGAGCCGTACGTCCACATGACA
-AAGGAATCCACGTGGGACGAGGCGAAAAAACTGGCGATCAGTCTTGAAAA
-GAAGCCGGACATTGTCCGTAAAGCGATATACAATCGTCGTCGCTTCGTCA
-ATGAAAAGATAAAAAGTGCGCTGGTCAAGCGCGAAATCATCGACCCAAGA
-AGCCCGGCAATCCATGAAATAGCAGTGGCGGCGGAGGTATTTTAAAAGAA
-AATCAGACAAATTTAATATCTAATTATTCCCCATTTTCTTGCAGACAATC
-GCCATAAACGTTGTGCACTTCTTGGAGACTCATCACGCAAAAATACTCGC
-TGAAATCAAAGCGGCCGCCGCTGGAGCCGGCGCCCAGCTCCGAACTGCAT
-GAATTAATTCAAATTAATATTTTTAAACTCATTTTTCACACAAATAATCA
-TTCATGTGTCCATTTTTCACTCTCGAAACCCATATACCCTCACTCTAAAT
-ATCAATATAATGCACATTTCTCATAGTTTTAATCTGCCCTTACCAATTAA
-ATCTTACCAATTTTCCGCCATGATCCCTTTTTCCATTTTGAATAAAATTC
-GACGACGATTTTTCCATTAAAACAAGAAATATATAAATAGATTCAAAAGT
-GGCGCTTGTGTCGCTCAGCGGTCTCCTCCACTTGCACACTATCTCACCGC
-GGCCTTCCAATTACTCGTCCATTTTCCAGCTGTAAAAAGTTTATAAAAAC
-TGAAATAAATGCAATTTTCAGCAGAAAATCGCTGAAAATGCGGCAAATCG
-TCGAGCTAAAGTCACTTTTGACTTCGGAGCCAATTAAAGCCATCGAGCTC
-TTCGATAGGCTCGTTGGACAAGGTTTGAGCCGAAAATCTAAACTTTTAAG
-CTGAGATTTCTTTTAAAAATCCCTTCCAGATGCCGACACAATCACCCAAG
-AAGCCTGTGGAACCCTCGCCAACTATATCCGGCATTCCAGTGTTTTTAAG
-CGACGGCTTCTGTTCACGGAGCTCCAAAAATGCTCGTTTTTTGCGAAATT
-GTGCATTTCGTTTCAATTTCACAGCTTTGAAGACACAGTTTTTCCGCGAA
-AATTGATTTTCGAACGATTCAGCGTGTTTTGCGGTGAACTGGAAAAGGAC
-AAGCCACGTGGGTTTTCATTTATTGAAAATTGAAAAGATTTTTGCAAAAA
-ATCATAAAATTTAATGTAAAACTGAACAAAACTCGATTTTTAACCGAACC
-TTTTTGTTTTTTCCGTGAAAAAATCGGTTTTCCAAGTTTTTCGAACATTT
-TCCGAAAAAAAATTACGCAAAAAAAACGATTTTCAAGTAACAAATCCGGA
-AAAATCAAACTTAAATATTTTCGGAAAATTTCATAATTTTCTTCAAATCT
-CTGTAAAAAGTAGATTCGATTTCTGGGAAATTTGAATTTATGTCATTTCT
-TTAAAAGCGCATGCTCTTTTGTAGGGTCTCGCAACGAATTATTCAATTTA
-AACTTTGAAATTCGCGCCGAAATTTGGGTCTCGGCGCGATTTTTCGAAAA
-ATAAATGAAAAATATGTACTATTAATTTTTTCTTGAAAATTATTGATTTT
-TCAGATCACCGGCACCACGTCACCGCTGTCGGATCGAATCGTTTCTTCAA
-TTTGGGACTACTTTCCGATGGAAGCCCCGTCTCAGAACCCCGACTGGTCC
-CCGTGCCACGTGTAATTCAAATCGAGATGACAAATACACACACAATATTT
-TTGACTGCTGAAAATCAGATTTACGGCTGCGGAAAAGCTTCATCTTTTTT
-GCCGGATAAAACGGAGGAGACGGACGGTGGTTATGTGGCACTGCCCACTT
-TGGTAGAAATTCCAAAAGTTACTGGATACGTGGCAGCTGTGAAGGTGTTC
-GATGGAGGATCACAGTTTTTGATTGGCGGCAAAGTACGGTTCTAGAAAAT
-TGGTGGCCGAGTATTTTTTCGCGGCCACATGGCGATTTTCTACACGAAAA
-GTTGTGTAAAAGACAAAAAGGTGTGCGCCTTCAGGGATTACTGTAGCTGA
-AGTTTTTCATAGATTTTTTTTTTGGCTTTAAAAAAATCCTTAAAGGTGCA
-TTTTCGTGTCGAGACCTTGTTGTATTATTTTGCTAATTTTGCTTAAAAAG
-TACAGTACCAGGTCTCGACACGAATAGTTTTGATAAATGCAAAAATGTGT
-GCGCCTTTAAGGATTACTGTAGTAAAAAATAAGAATCCCTTTTGGAAAAT
-TTGATAATTTTGTGAAGAAAAATAGATAATTCTTTGAAAATGAATAATTT
-TTTGGAAAAATCTTTTTTTCTTATTTTTCTAGACGTACACCTTTATTTCA
-TTAAAAAATTGTCGCGCCGAGACCTGATACCGTATTTTTGAGCGCAAAAT
-CGTGCCGAGACCCAAATTCGTGAATTCAAATTTTCAGTGGTATTGTGTTG
-GAAAATGTTCGATTTCCGGAGAAACGCGACGAATTTCGTCGAATTGTTTT
-GTTCTGGTAGAGGAGGAAAACGAGGAGAAATTGGAGAAAATGACGAAAAA
-TATCGATTTTTACGTGGCAAATGTGCCGATTGAGGAAAGGATTGTGAAGG
-TGGATTTTTTTTTTCAAAAATTTGAAAACAAAAAAACTAAAAAAAAAAAT
-TTTAATCTTAGTTTCTAGAATTCAAGCCAGTTATAATAATTTTTAAACTA
-AAAATTGCATCTTCCGAATTTTCAAGATTTTTTTTTCTGAAAATCGTTTA
-AAAAAATATCTTGAAAAATCAAAATTTCAAAAAAAACAAAACTTGAAAAA
-AAAAACGTCTTTAGCGGTATTTTTTCTATAATTTTTCAATTTTTTTCAGC
-TTAAAAATCATAGAAAATCGTAATTTTTTGACATTTCTTCCAGGTATATC
-TAAAAATGGACCAAAACGAGATTCTGTGGGATAGAACGAGCGATTTCTCA
-GCGGAAAAGCCGATTTCCTTCATAATCAATGGATTTCCACAAATGGCAAT
-TTTCGAATCATTTCAACTTTTAAATGATGGAACTATTTATGCTGCGAGAA
-ATTCACTTTTCAAAGGAAAATTGGAGCTATGGAAGAACAAAGATGACGGG
-TTTAAAGTGAAAAGCGGGACTGTTTTGGAGCATTTTGACACGAAATATAC
-ACTTATTGCACTGATGGAAGAGGTTCCCGGTACTATTGGAACAGAGTTTT
-TCAAAGTTTCACCAGATGGGCAGAATTTGATTATGAAGGTTCATTTTGTT
-TGGAATTTGAAGGAATTCGACCTTAAAAATATAAAAAATTGCACTGATGA
-TGTTATGGATTTTTTTTTCAGAAAAAAAAAAACGAAAAATTGAATGCTAA
-ATGACAGAAAATATGCCCCTGTAACATTTTTTTTTTGAATTTTCTAAATT
-TTAAATTATTTTTTTCAGTTTTGCGCAAATCAAAGAAACGGCCGAATTAA
-ATTTGAATTCCCGCGCAAAAGAGTGACGTCATTTTTTTTTTCCCGTTTTC
-CGGATGTATTATTAGGTTTTTATTTTAAACACAGTTTGTCAATTTTTCAG
-ACATTTTTTTTTAAACTTGATAACCCGAAAAAAGTGGCCTAGAAATCGGC
-TTTACAATTTTTTTTTTAAATCGACAAACTGTGTTTCAAATTATGAAACA
-AGGAAAAAACGAAGAAAAACTTATAGCCGGAAAACGCGAAAATGTCGAAA
-ATGACGTCACTAAATTGCGCGGGAAAAAATATAGAATTTTTTTTTAATTA
-ACAGCTATATTGAATCATTAGGGCTTGTTCTCCGTCAAAAAATTTCTCGA
-AAAAATTGATTTTTCGTTTTTTTTTGGAAAATCGAAAAATTTTGTTTCTC
-AAAAAAAACAAAATTGGAATTTTTATTAAAAAATTATTTTAATCCAACAA
-AAAAAACTAAAATTTTTTGCAAAATTTAAAAATTCATAAAACATTTAAAA
-AAATTTTTTAAAAGTTATATTGGGACTGTATTCTAATACTTGGACTAAAA
-AAACCCACATTTGACAAAAAATTCAATTTAAAATGAATATTTTCAGATGG
-GCTACCAAAACGAACAGAAAACCGAGAAATTCGAATTCGAGTCTCCCAAA
-ATTCACAAAATCATCAAAAATCGTGAAGTACAATGTGATCCAGTTGATAT
-TCCGTTAGACTCGACTATTCATTTTCATCAAAATTATAATCAAGAAGTAT
-TGAAATTTCAATCGAATCGATTATTATTTCAATGGATTTATCCGAATTAT
-TTGTTTCAAAACGATGGAGATGTACATTTTTCAATTGAACAATTGGAGAC
-TGTATTTGCTGTGGATTTGGAGAATTTGGAATTGTGAGGGTTTCTTTTAT
-TAATTAAAATTTTTTTAAGTGGAAAAATTTTGGTTTTCTTTTCAGAAATT
-ATTGTAATGTTGTAACTAAATATTACGGGAACACGAAATTCTAAGAATGC
-GTATTGCACAACACATTTGACGCGCAAAATATCTCGTAGCGAAAACTACA
-GTACTTCCTTTAATGACTACTGTAGCGCTCGTGTCGTTTTACAAGCTCAA
-TTTTTTAATACTTTAAATTAAAACTTTTACTTTAAATTTTAAAAAAATTC
-GTCTTATTTTTTAATTTTTGCTTTATTCCAATATTCTGTCGATAAATAAA
-TCATTTTAATAAATTTAGAAAATTGAGCCCGTAAATCGACATGCGCTACA
-GTATCCATTTAAAGAATTACTGTAGTTTTCGCTACGAGATACTTTGCGCG
-TCAAATATGTTGCGCCGTACGCATTCTCAGAGTTTTGTGTTCCCGTAATA
-TAGAAAATTAGAAGTATGTTAAAATTTTTAAAAAGTATTTTTTTTGGACT
-TTTACCCAAAGATTTTTTTTTGCAAATTTTTAGTGAAAATTATTATTTTT
-TTCAATTCACGCTAAAATTTATTAAAAATTTAAATAATTTTAGACTGTAT
-TCTATACAATCAAAAAACAACAAACATCAATAAAATTTTCAATGAGTTTA
-AAATTTTTTTGAATTTTTTAAAACTTTTCTTCGTTGACAAAACGTTCACA
-AAACTTGAAAAAATATATTTCAAATTAATACTTAAAAATTCAAACAAAAA
-ATTTTTAAAATTTTTCAGCCCGAAATACCAACCTATATCACCAGAAGAAT
-TCGTTCCCACCGACACTTCTCCCTCCGATATCTGGTATTTAAAATCCAGT
-GAAAAATTGAAAATCCCTTGTCACAAGTACCTTCTCCTACTACATTCACG
-TCAAATTGGCGCGATGCAGAGATTTCATTCAAATTATGGGAATTTCGGCG
-ATTTTAAGGATGGTAAATCTGAAAATGAAGTGGAAATTGAAGCGAATGCT
-AGTGTTGAAACTGTGAAAAATGCGCTGAGAGGGATGATCAATATTCGAAC
-TCTTTTCAAAATTAAGACTATTGAGGTAATTGGATTTTTGGTGAAATTTG
-AAATGAAAAAATATTTATAAAAATTGAATTTTTTTTCAAATTTTTTTTTC
-AGTCACCATAAGTCAATTTTCCATTAGATAAAAATCGATACTTTTTCTAA
-ATGCGATAAAAATTGGAAATTCTATAAATTCCGGAAAAATCGATTGATTT
-CAAAAAATCGATAATTTCCGGAAAATTGATAAATTCCAGAAAATCGGTAA
-TTTCCGGAAAAATCGATAATTACCGGGAAAACCAATTAATTTCCAGAAAA
-ATCGGTAATTTCCGGAAAAATCGATTGATTAAAAAAGTCAATAATTTCCG
-GAAAATTGATAATATCTAGAAAAATCATTAAATTCAGGAAAAATCGATAA
-ATTCCAAAAAAAAATCGATAATATCCTGAAAAGTGAATAAATTCCTAAAA
-ATCGATGAATTTCATCAATTCCGGGAATATTTTTTAAATTTAAACTTTAA
-AAAATATTTTTTTAAATCTTTAATCCTTATCTATTTTATTCAAAAAAAAA
-CTGATCAAAAAAATTTTTTTTTTTCAAAAATTCAATATTTTTGCAGTTAA
-TCGAATGCATCAACTTCTACGATTATCATTTAATGGATGAAATGTTCAAT
-GATTCAATGCATATTCTAATGGAAACAATCACTGAATTCACACTTCCATT
-TCTCTACGAATTATTCTATTCGTTTGAGGAAAAAGTGTTGGAGGGACTTT
-TGCAGAGGAAATATTTGATTTCTAACTCAATTTCCAGTGTTTTACCGCCA
-AAGGAGCTTCTTGTACGGTAAGTGAGTTAAGAAATGGAAAAAAACACATT
-TTTGCTACTGTTGGAATTTTTTTTATTTCACAAATATATTTTTTTTCATT
-TTAAAGTTAAGTAGGAGTTTATCAACTTTTCTGGATTTCATCAATTTTTC
-CGAAATATTTTGATTTTCCCGGAATTTCTGTGTTTTTCAGGAAAAAAACC
-CCAGAAAACTAACAAAAAGAATTAGCAAAAATGACCTAAAAACCGTAAAA
-CTATGTATCCCAACTTGTCCACGTGTAGTACAAAAAACCGATGTGCACCA
-ACAAGAATTTTTGCAAAAGCTATTTTTCCATTCAAAACTGCGCCCCAAAC
-AGTTGAAATTTTATAGAAAATTTTCGAAATTCGCTTCTCCGAAAATAAAA
-ATCTCAGATCCGCCCATTTCTTGGCTCTTCCAGATTCGCTGAAAAACTGG
-ACACCGATTGCCGCCGACACCACACATTAAAAGTTCCGTCGAAATTCAAA
-AATCTAGAAAATCTGAGCACCTATGAGCCCGAGTACATTGTCAAATATTT
-TCTGAATCTCGACCAAGATTCGGAGGATGTGACGTGGCGATCGATACGTC
-ACGAATTCCACGACACACTTGACACGTGGCACGCGGAAGCTGTGAAGAAG
-AGAGATGAGAGACGTATGCACGGAGCAACACGGAGCAGAACGAGTAGTAT
-TCGGAAGGAGAGCTTTACGAAAATTCAAAATGTTTCGATGACGTCATCGC
-CGGTAGGAATATCGATTTTTATGTATCGAATTTACTGGAAAACTATCAAA
-AGTTTAGGAAAAATATCGATTTTCCTGAAATTTATCGATTTTCCTGAAAT
-TTATCGATTTTCCTGAAATTTATCGATTTTCCTGAAATTTATCGATTTTT
-CTGGAATTTATCGATTTTTCTGGAATTTATCGATTTTCCTGAAATTTATC
-AATTTTTCTGGAATTTATCGATTTTTCTGGAATTTATCGATTTTTCTGGA
-ATTTATCGATTTTTCTGGAATTTATCGATTTTTCTGGAATTTATCGATTT
-TTCTGGAATATATCGATTTTTCTGGAATTTATCGATTTTTCTGGAATTTA
-TCGATTTTTCTGGAATTTATCGATTTTTCTGGAATATATCGATTTTCCTG
-AAATTTATCGATTTTTCTGGAATTTATCGATTTTCCTGAAATTTATCAAT
-TTTTCTGGAATTTATCGATTTTTCTGGAATTTATCGATTTTTCTGGAATT
-TATCGATTTTTCTGGAATTTATCGATTTTTCTGGAATATATCGATTTTTC
-TGGAATTCATCGATTTTTCTGGAATTCATCGAGTTTTCCGAGATTTATCG
-ATTTTTCTGGAAATTTTACTCCCCAAAAATTTAACAATATATCGTGCCGA
-GACACGAAAAACTCTAAAAATTACAGATTCCAATCGGAGGCGGCCGCTCG
-AAACCCGAAAGTTTCTCAAAATCAATCAATAGTCCTGTCATTCAATCGCC
-ACTCTCTCCCTCACCAATCAAAGGAATGCCAAAGGTAATCGTGTCGAGAC
-CCACCACGCCACCTGCGCCTTTAAATTCCACGTTTTGTAGTCCCGCCACG
-ATAGTATTTCCAATTCACTGGACGATTTTCCTGAAATGAGCATTTCACCG
-TCCCCCTCGACACCGAAATCCTCTTCCGGTGGCGGTCGCTTCGCACCAAA
-AGGAACTCGATTTAAAAAGGATTTCGAAATTCTCGTGAAACCTTCCCAGT
-CACCACAGAATCCGTGGAAAATGGGCGGAGCTTCCGCGTCGATTCGCGAA
-GAAATTGATCCGCAGGAGATCCGATTCGACGAAGTTGTGAAGAAGGAACA
-GAAATTGCAGACTAATATACGTGCGTCACTTGAAATTTTGGAAAAATCGA
-TAATTTTCAAAAAAATCGACCTTTTTTTGGAAATTATCGATTATTCTTGA
-AAATTATCGATTATTTTAAAAAATTATCGAATTTTCTGAAAAGGATCGAT
-TTTTTCGGAAAAAGTTTCGATTTTCTCGAAAAATAACGACTTTTTTTTTG
-AAAATTATCGATTTTTAAAGAAATTATCTATTTTTTTGGAATTTATCGAT
-TTTTTTTAGGAAATTATCGATTTTTTTAAGGAAATTATCGATTTTTTTAA
-GGAAATTATCGATTTTTTTGGAATTTATCGATTTTTTTTAGGAAAAAGTT
-TCGATTTTTCTCGAAAAATAACGACTTTTTAAAAAAAATTATCGATTTTT
-AAAGAAATTATCTATTTTTTTGGAAATTATCGATTTTTTTTGAAAATCAT
-CGATTTTTAAGGAAATTATCGATTTTTTTGGAATTTATCGATTTTTTTAG
-GAAATTATCGATTTTTTTGAAATTTATCGATTTTTTTAGGAAATTATAGA
-TTTTTTCTGAAAAATTATCGATTTCTCAAAGGAAAAGTATCGATTTTTGG
-AAATTATCGATTTTTAAGGAAATTATCGATTTTTCAAAAGAAGAGTATGG
-ATTTTTTGAAACTATCCATTTTTCTTTTAATTATTGATTTTTTTCCTGAA
-AAATTATCGATTTCTCGATGGAAAAATATCGATTTTTCTGAAAATTATCG
-ATATTCTTTTGGAAATTATCGATTATTCTAAAAAAAATTATCGATTTTGC
-AGGAAATTCTCGATTTTTAAAATAAAAACAGCGATTTTTTTTTTGAAAAT
-CATCGATTTTTAGGGAAATTATCGATTTTTCTGAAAATTATCGATTATTT
-CTTCAAAATTATCGATTTTTCGAAGAAAAGTATGGATTTTTGGAAACAAT
-CTATTTTTCTTCAAATTATTGATTTTTTTACCTGAAAAATTATCGATTTT
-TCTGAAAAAATATATAATACCACACATTAATTTCAGGAACCGGATTCAAA
-AAAGTGCAGCTTCTACCACACGTGGAGACGGAAGAGCTCGCCGGAGCTCA
-AATTTTGGAGGTTTTTCGACGAGAACTTCACGATGAGGCGCTCATATGTG
-TAGGAATTTGTGATGGTTTTTTTCTCAAAAATTTGAAATTTTTCAGGTGG
-AACTGGTGATGAGCGACGATTTGGAGGTGGAAAACGAGCAGATCATCTGG
-GGAAACATGCCGGGACTTGTTCGGCGTTAAATTTTAAATTTTTGATTTTT
-TTTTTTCTTGTAACTTGCATTTTTTGTTTAATTTAGTGTTTTCGGTGTTT
-TTTGTTGAAATTTTCGGGTTTTTAATATTCAAAAATTAATTAAATTATTA
-TAAAATAAATGCATTTAGAAATGCGGTATAAATTGAAAATTTTCAAAAAC
-CATCTCCCCGAATCCAGTGGTTTAGGATGAAAATCGTGGAAATCGAGCCG
-AACGAGAGAATTCCGAGTTGCCACGTGGGTCTGAAAATTGAGTGTATTTA
-ATTTTGGAAAATTTTGGAGATCTCTTACATTTTCTCAAAAATCCATAGCT
-TTTTCCCATTTTTTTGTTGCTGGATCATTTTCAGCTCTTCGGTTATATCG
-CAGACTTTGAAGCAAGGGTCTTCCGGGAGAATTTCCTGAACATTTGAAGT
-TTTTGGGTGAAAAAAAAGCTTTTTTAAAAGATTTTTTGGTATTTTCAAAT
-AATATCGGAAATTTGCGTTTAAATTTTTTTTTTCAAAAAAGTGAATTTTT
-TCAAATTTTTCGAAAAATCGAAAAAAAAATTTTCGGGTTTCTGGAAATTT
-TAATTAAATGTGTTTATGATGATGAGAAAATATAGTTGACAAAATAATTT
-TTTCCGATTTGTCAATTTTTCAAAAAATTTGAAAACAATTTTTTCCATTT
-TTATTCCTGAACATAAAAAATTCGAAAAATTTTCGTTTTTAATAATATTT
-CGGAAAAATTTTGAATTTACCGTAGTTGTGTCATTTTTAAAGAAACTCAC
-AATATTTCTAATCGAAGTATGCATATTTTTTAAATGAATTTTTGGAAAAA
-TTTCAAACTTGTTTTTTGTTGAATTTTTCGATTTTCTTTCGTTTTTTTAA
-ACAGAACAAATTTTTCATCATCTTTTCTACAAACAAAACAAAAAAAACAA
-TTTTTGTTTTTAGAAAAGCGAGAAAAATTTCGAAAAATTATTTTAAAAGT
-TAGAAAAATATCAATTTTGAACGGAATTTTTTCAAAATTCGATTTTTTTG
-TTTATTTTTCTAATATGTTCAGTTTTTGGCCATTTTTTTTTTTAAAAAGT
-TTGCTTTCAAAAAATTTTAAATGAGAATTTAGATTTTTTAACGAGAAATG
-TTGAAATTGAGAAGAAAAAAAAAATCAATTTTAAATAGAAAAATTTTCTT
-TTTCTAACATTTTCAGTTTTCTCAAAATTCCAAAAACTCGTACATCCTCC
-TGACAAGTACAGTAATCCATTGGATCCAGATTCTCCTCTCCAACACTCGT
-TTCCCGAATTTTTTCGAACCAATTGTTCATTTTCATAAGAACCGAGCTCA
-TCGCAATCAATTTCCCGATATTTCCATCGTATTCCTCCGAAAATTGCTGA
-AGCCGATTCAAATTTCCAATATCATGCTGGTGGAGAGAATACGGAGTGTT
-CAATAGATCCGTAATTGATTTAACTTTAAAATTTGGTTTTTTCATTGTAA
-TAATCATGCTAATCGTCTTGACATGATCTGTTAAATTCTCTCGTTTCGGC
-GGAGAATATAATCGATATTCCAGTGGCACGAGGTTGTCGAGAAATCTATT
-GAAATTCTGATAAATATCGTTCCAATCACTTCGAAGCTCGTCAGTTTCGG
-CTCCAGCTCCGCTTTTGAAGCCAGTCGTTTTTAGATTGTGCTCCAGCGTG
-TCTATTGAGCTCTGAAAATTTGATTTCAAAAATTTTGAGTAACTCAGACA
-ACCCCATTTTTCATCTAATTCGAAATTAGCCACATCTTATAAGAAATTAA
-CCACATCTAATTAGAAAAAACTTTTCTAATTAGAAAGGATGCATATCTAA
-TTAGAAAAGCTGCACACCACATCTAATTAGAAGGGATGCTCGTCGAATTA
-GAAATGAGGCACATCGAATTAGAAAGGGGGCGCGTTGAATTAGAAGTTAT
-GCGCATCTAATTAGAAAGGAGGCACATATAATTAGAAACACATTGCGCAC
-CACATCTAATTAGAAGGGATGCTCGTCGAATAGTACTACCTTTTAATGTA
-TGTACTACCTTTTAATGTATGTACTACCTTTTAATGTATGTACTACCTTT
-TAATGTAAGTACTACCTTTTAATGTATGTACTACCTTTTAATGTATGTAC
-TACCTTTTAATGTATGTACTACCTTTTAATGTATGTACTACCTTTTAATG
-TATTACCTTTTGGCTCTTAATGTTGAAAATAAATCGAATCAAATTAGAAA
-CAATGCGCGTCGAATTAGAAAAAAAGCATGCCGAACTGGTGCGCGTTAGT
-TGACCCTATTTTTCTAATTAGATGAGAGGAATAGGGTTGTCTGAGTAAGA
-CTGCAAATTATCAAAATTTTTTGGTTCAATTTGTTTTTGGAGAAAAAAGT
-GAAATTTCCTGGCAATTTTCAGTATTACGTAGACGTCGAAATATGAGATT
-TTTCACCATTTCTTATGGGTCTCGCCACGCCGACAATCAATTATTGTAGT
-TCATGTCGATTTACGGCGCCACTGTTGCATTAATATTCCAAATGACAAAT
-TTGCCGCCGAGTTTAAAAAATTCAATAAAAGCCCGTAAATCGACATGAAC
-TACAGTAGTTGGTTGTCGGCGTGACGAGACCCAATTCTCATCTTTCGACG
-TCCACGTAATATAGAAATTTTTTTTTTGAAAAAATCAAACGATTTTGCCT
-CAAAAAATTCAAAACTGTAAATTCAAAAAATACCACAAAAAAAAAGCGAA
-AAAAATCGCGGAAGACAGTGGCGCCAGGCTGTCTCAATACAGTTTGATCT
-ACAAAAAATGCGGGAATTTTTTCACAGAAAAATTGTGACGTCAGCACGTT
-CTTAATCATACGAAATCAGATGAGATTTCTGCGTCTGCCATCCCGCATTT
-TTCCAAGATCAAAGTGGAACTGGGACTTTCTGAATAGGACTTTCTGATTC
-CACGTGGGAAGGATGACAAATCCAAAATTGCGATATTTCACTAATTTCAC
-TGCTTGAATTTCCTTGGAACCAATCAGCGTCTTCAAACTCCGCCCACTCC
-ATCTGATTGGTTGAAAAATGGGCGGAGCAAATCGCTGATTGGTCGCAGTT
-CTCATTTTTAGCCAAAGTTAAAAATCTCGATTTTTCAAGGTTTTTTGACC
-ACCTCCAATTCCAAGCTTCTTCCTTACCTTCAAATCGTAGAATATTGCCA
-ATTCTCTGATTGCATCGAGTCCTTCCTTCAAAACCACAACATCTTGCAAC
-TCGAACCCCGAAAGCTGATATTTCTCGTTTAACTTGAATTCTCCTAGAAT
-ATCCTTCGCACGTAGCAACTCTCCAACGATTCCTTCAGTTGGTAGAAACT
-CTTGTAGAGTGTACACTGCCTCCCAGATCTTCTCAAGATCCCCGTAATTC
-CAGACATCTTCCGAGCTAGCCACAAGAAATTGCATATGTTGGTGTTTTTC
-GTTTCGAGCAACACATTCCAATGAGGATACGAAGTTAGACTCGTTGATTT
-TTGTTAAAACGTTTATCATGCTGGCGTAGATTTCCTCGAATTTGGTTTTT
-CTTTCTTGAAATTTTTTGTATAGTTTTGAGGGTACCATACAAAAATTCTC
-GGGAAACTTTTCGATATCATCTATCATCATCGTCAGGTTATCGAAATCTA
-TATACTACAGTGTTTTTTGAAGAGTTTCCACGATATTTTGATCGGTTTGA
-TGTTTGAATGCTTCGAGAATACGCTCGTCTCCGCAACGTCTTAACGTAAT
-GCAAGGCTGTGCGGTGTGTACAAGTGTCTTGTTTAGCTCTTCAAAACCGG
-AGCGATACATAGAAATGGTTTCATGCGCAGCGTCCAGCTGCTCAGGGCTC
-TTGAAAGTTTTCAAACATTCCGAGAAGCTCTCAACAATGCTGTTGAGGTT
-ATCCTTTGGCAGATTTTCCCGAATTTGATTAACTTCTGATAGATATTTAT
-CGATATATTCGATATTTTTATGATATTTTTCCGTGTTGTTTAGGATTTTT
-TGCATCGCAAATTCGAATTCCACATAGTATTCCAAAAACTTATTCAATGG
-ATGCAGGAATTGAATTGATCCTTTGCCAGAAACGCTTTTTATCCAATAAT
-TGCTCTGCTCTTTTATGGACTCTCGAATACTTTCTTCTCGTTTAGGGAGA
-CCTAAAGCTCCACGATCAATTCGTTTTTTGAAAGAAATAATTCAAAAATA
-CCCAAAAGAAAATTGCCTGATGGCCTGGAAGAATGCGTATCCGAGGATTG
-AATACTACGAATAACGTCCCTGACCTTTCGCACCCAATTTGAAAGCCCCA
-GTGTCGTATTGGTGTCGCGAATCATTTCTAAATCACTCAACGCCGCTTCG
-AAATTGTTCAGTCTTCCCACTGACAAGAAGTCTCGAACACTTTTACTTTC
-ATTTTTCATTATAGTCGTAGCGAGTTTGAAGAGATAAAATGGATCTTGAT
-GGAGCAATGCGAATTCTTTCTTGGCTCGTTCCGGAAAGAAATTTCTGTAG
-TAGGCGCCAACCTCTTCGACCGTTTCATAGTTCCGTTCTGTACGATCTTA
-AAAGGTGGAGTACCGAAATCTGGGGAATATTTCTAAATAACTCCAAATTT
-GCTCCTGATTTCAATTATCCATGTGAAAAAATTCAAAAAATCCCTGATTT
-TGTATTTCGGCTTGAAATTGCCGAATTCCATTTGTGCACACATGCAAATT
-TTTCAAACGCGCGCCCAAAGAAATTATCATTGGAGCGCGTTTGCCTCATT
-TGATTCTCTCCGGAGCACGGTAGCACAGAAACTAGATGGATTGGTTCATG
-ATACTCAGTCTGGAAACCTATATTGGCTACTATCTCGAAAACCATCATAA
-AATCGATTTTGCGATGCAAATAAGAAATGACCGCAATGAAATTATCTATC
-TCCATTCGTGATGAATTTTCGATTTTGTACTTCCTGGCCAAGTTATGCAC
-GTTTGTTCGGTGGAGCGCGTTTTCACCCATCTAGCAACTGACACGGTGGT
-TCAGTAGCCAATATAGGTTTCCAGACTGAGTATCATGAACCAATCCATCT
-AGTTTCTGTGCTACCGTGCTGAACCACCGTGCTCCATCTACCGTATTTCT
-TCCATTAATATGGCTGCAATACTATTTTTCGATGGTCTTCCCGCTTGCAA
-TACTAATAGGGAGTGCAATACTAATTTTCAGAATATTTTTCTGCCTTTGA
-GCTTACTAGTTTTTTTCTGAAAAAGCTCGAATTTTATGTAAAAATTCAGA
-AAATTGGTTTTAATTGTAACCTATAAGTTTCAAAAATTCAATCTCGTAGA
-AATTTTTTTGAAAAATTGTTGCAAAATAGGCAAAAAATATTGTAGAAGTC
-CTGAAATTAGCGAGACGGGATTGCAATAAAAAAAAGTAAACGCAAGACTA
-TTAGGGAGTGCAAGACTAATAGGGAGTGCCATACTAATTTTCGGAAGGTC
-TCCGAGGGGCAATACTAATAGGGAGTGCAAATCTAATAGGGAGGCCATAC
-TAATAGAAGAAATACGGTATTTTTAGTTCCTTTATTTTTTCAACGAGAAA
-ATCAAATGAGGCAAACGCGCTGCAATGAAAATTTAAATTTATTTGTGCGC
-GCATTTGAAAAAACTCATTCGGACGCAAATAATATTCACGAATTTAAGCT
-GAAATATAATATCAGGGAAATTTTTTTGTTTTTTTTTCATACAGATATTC
-TGAATCAGAGGAATTTTTTTTAGTTATTTGAAAATATTTCCTAGATTTCG
-GAAATCAAAACAGCAGCTTTTGTACAACAGCTTTTTTTTAAATGTAAAAC
-TTGTTTAAAAGTCAAACCACGTCCATTTTAAAAATTAATTTTTTAACTTA
-TAAAATAAAAACATGTGGAATGCTTTTGCATGTACATTTATACAAGTTTT
-TTGAGAAAAATACATTTAAATTTGAAAAATGTGTTTACTAAAATTCTGAT
-CAATTTTTTTGTTATTATATATTAATAGCTGAACTTTACTTTAAGACAAA
-AATTCCTCTAATTAAAATCTACCTTCAAACCATTTTTTCAGTTTTTGCAA
-ATTCTCCTCGGAAATCGCAGTAGGACTGGGAGCTAGATCATTGAGTGGCG
-AGAGAAAATCACGGAAATTTTTCAGGCGATTTTTCAGGCCCCATGTTGCC
-TCCCATCCGTATTTTGGTTTCATGAGAGATTGGAGATCATGAAATAAATG
-CAAAAAAGCATCCAGCGAGGTGGTGATCTTTTTCAGTGATTCTCGCTGTA
-GTTGAAGATGTGGGAGCTTCTTAAGTAAATTTACAGCTTCTTCTCTATCC
-TTATAAACTTTAGTGTTCTTCCTTTTCCCGACAATCTCCTCGAAAGCTCT
-CTGCTCATCCCATCCGCCAATAGATTTTGTTTTGTAGAAACTTGAAATCC
-TATCAAAATCGATATCCCGATCTAATAGCTGATTCGTCAGATCCGTAGAA
-GCGATTTCGCCGCTGAGAAGCCCATCGACGATAAGATAGCAGTTAAGGAG
-CGGTGGTAGTGAGCTCATCCAGTGAATCCACAGGTTTATGGAGTCCTTTC
-CGTAGACTGAAATTATTTTTAATATTAAAGTAGAAAAAAATTATTATATA
-AACTAACTATACGCAGGAAAACTCGCATTAAGTTCCAGATTTCGATCGAA
-GAATTGTGGATGTCCAGCTGGAAATTTTTATTTAAATTTAGTAAATTTAG
-TGAAGAAATTTAATTTAAAAATACCTGTCAAGCGCTGACCCTTAATCTGC
-TCCAACATTTGAATACCTTGCCGCTCCCTTTCCGAAATTTCGAGATCTCC
-GCAGTGTTTACCCGGTAGAAAAACAAGAAGAAAGGGAATTATCGTTATAA
-TCATCGTTATCTGGAAAAAAATTAATTTTCATGGAATATATTTCAAATTT
-TCGACAACCAAACGCTGAAAATTCACATTTTTTTCAGGAAATTTGGTTGA
-AAAATCTGTTTTTCATAATATTTTGAGAAAAAAACAAGCGTAAAGGTATT
-CAAGGCGCATGCAATTCACTTAAGCCAGGGTCTCGAAGCGAACAGAAAAC
-ATACGGTATTTGAAAATATTCTTGTTTTCCGCGGAAAGTCGCAGAATTTA
-ATTTGATTTTTTTAACTTAAAAAAACAGAAAATTAACCGTTATACCTTTT
-GAGCAAAAAATTCTACAAGATAATAATTTAAAACAATTAAAAATTGAATA
-AACATTGAAAATTAAATGCTTAAATTTCAAGGCGCGTGCATCAAACTTTT
-GTTTGGGTCTCACACCGAATGTAACAAGTACGGTAAGAGTGCGCGCTTAT
-TTTCATTTTTCGAATTTGTGCGACCAGTTCTCATGTTTTTTAAACGATTT
-TTGCGGTAATTTTGGCCATTTTTTCTAGTTCCCACCGACAAATTGCATTA
-TTTCCGTATTTTCAACGAAAATTTTGTTAAAAAACCAACAAAAATTTAGA
-AAATTGCATCATTTTGCAGGGATGAATGGTCAAGCGGATCGCTGCGACCG
-AACCGCCTACGTTTCGGGTCTTCAGCCGACAATCTCCGACATAGAACTGT
-TCGAGGTGTTCAATCGTGTCGCTCACGTCGAGAAGGTCATCGTTCGCAAT
-GGAGCCGCCCGTCACGCGCTCATTGTTTTCAAGTTGGCATTTTTTTTCCA
-TTTTTCCTCATCTAAATCTCTAATTTTCCTATTTTCAGAACTGTTCAAGG
-CCTGTATCAGGTGCTCGTAAACTTTCAAGGAACAACTCTTCACGGCCGTC
-AGCTGCACATTCGTCCACTGCGAGAAAGTTCGCACGCGAACAGCGAGGCC
-ATCTCAACGATGTTCGAGAAGGTCAAACATCAGGGAAATTCCGGGAATTC
-TTCGTATCGTCAAGAGCACTCGTTCCCCGAGTACCGAAACCAGAACCCAC
-AGGCTTCATCATACCTTCCACCGAATCCACGTGGTCATCGAAACTCGACG
-GGCTGTTTCAATGGTGGCGGCGGGGGCTATGGACGCCGACGTTCCGCCGG
-TGGATACAATCAGTACAATCAGAACAAGTATCCGAACGAAACGTACCCGG
-GAATGACTCTGTTCGATAATCATCCAGTGCAGCAGTATTCGGGCTTCAAT
-CCCATCGATTTTCGCTTTGATGACTATGTGGAAGGAGCCAAAAGGTGCAA
-AATTCGCCAAATTTCGCTAAAAAATCTGAAATTTCGCCGACTTTTCCCGT
-AGCGCAGCAGTTTTTTCTTGATTTAGGCACATTTCAGGCAATTATTTTCG
-GCAAATCAATATTTTTCCACCATATATGTTCTAGAATGTTTTAGATGTAC
-TAGATTTTATTTTCAGACGAATCAAGTGATTTTCTATATTTTTACACTAT
-TTTTTGTTGAAATATGACCAGAATATGCAACAAAGTGTTCCAGCTGCTGC
-GAAAAGGAAAAATCGGCGAAATTTCGAATTTCAGTCTATTTTAATCTGTT
-TAAGCAAAAAGAAAACTAATTTTTAAAATTCAGATTCGACAACCTTGCCA
-ACCTGATTCGCTCGAGCACCCCCACGGATCCGTTCGCTAATTATCAAAAG
-TATTTTTGAATTATTTTGAAAATCAATAAATTGGTTTTTTTTTCAGACCT
-TGTGAATCCACAAGCACATCTCGTTCTCGTACGAATTCAGCAAAAGATCA
-AAAGCATGGCCCGCCAACGTGGAAAATGGAGCTGCAGATTAAGAAAGATG
-ACCACCACCACGCCGGCGGCGGAGCAGCAACCACAGGACAGAAGCTGTCC
-CCACAACAGTTTTTGGCTCAGATAGCTCAGAGACAACAATCGGAGCAAAA
-CGCGGATGAGGTGGCCAAGAAGAAGCGTCCGAACCTTTCGGTTATCAATC
-CATCGCTTTTCTATGAGCAATACCCGAGAACATCGTCGCCAGTTGTTTAT
-GCTTCAAAATCTAGTAATATTTTTTGGAGATTTTGGGAAAAAAACAAATT
-TTCTCGAAAATACGCCCGAAATAGTGTTTCACGCGAAAATTGGCGATATT
-TCAATTTTTCTGAAAAATTGCTATAATTTTTTCGATTTTCACGTGAAATT
-GCAAGTTTTTGGATATTTTTCTCGAAAAACGTCAATTCATCGATTTACGC
-AGCTAGTATACTCAGCAATTGACCATTTTTTTGCAGACAATTTGGTATTT
-TTTACTTAAAATTCTTGATTTTCGACTTCTCGTGTGCTAATCACTTTTTC
-AAATGCGCGCCCGAAGAATTTCTCATTGGAGCGTGCTTGCTTCGTGTAGA
-TTTACGAGAGCTTTCCATTTATTTAACTTCTTTCGTGCTTTTTCAGTTTT
-CCAGCGAGTTTCTGGCTCGACCCCTCGGTGTATTTTGTGCAAACACCGTC
-ACGCGCAAATGCATGCACTTTTTCAACGCGCTGCGTGAAAATTCCTCTTG
-CGATTTCAAATATTTTTTCCCGCCATTTTCCAAAATTTTCGAGAGGGGGG
-GGGTCGAGCCAGAACACCTTGGTTTTCCAGCGAGCTTCCTTCATTTACGT
-CGATTTTTTTTTTAATCTTCGTTAAAGTTCTAAAAAAAAACGACTTAAAT
-CATTTTAAATTTTCCAAAATTCGGTTTTCCTTCTGCAAAAAAAATCAATT
-TCCAGAACCATCCGGCCACTACGACGACAAAATCGCATCTCCACACGATC
-CGGCAGTTCTCGCTTACAGTCGCCTTCGTGTACCTCAATCGGCCTTCGAC
-AGTCTCTCACCAATCGACACCGACAATTGCTCATTCATCACAAAACACTT
-GGGACCAACAACCGGTGTGAAGCGTGATTTGACGAACGACGAGTTGTCGG
-ATATGATTGTATCAACTGGAAATCTCCGAATCAATCCAACCAACATCGAT
-CATCATGACGAACCGGCACCATGGTCTCCGCTGAAACGTCTTCGCGCCGA
-AAGTGGATCCCTATCAACTGCACAAGTCGCGTCGCCCGAGTTCTCACCGA
-TCAAACCAAAGACAATGGAGTTCCACGAGACTGAGGATGATGTTTTTGAA
-ACTGGACCACCACCAACCTACTTATCCGAAGGAAACGAAAACGCGGAGAA
-GAAATGTGTTGAGCAGCCGAAAATCAACTACGACGACATTAATAATAGTC
-GTCTTCCGTCGAATTCTCATTCGGCAGCACCGAATTCCGAGAAGAAGCAT
-TTCGTTTTTCCGGTACGGGGGCTTTTTTTTGAATTACCGAAAAAATTCCC
-AACTTTTTAAAGTTCAAAAAAGTCAAAATTTTTGTCCATTTTCTGGGCGT
-GACTGCTTATGCCCCGCCCCCCTTTTTCGAAGTTTCTGCTTCTCGGAAAA
-TGTATTCCCAAAGTGCCAGTTTTGAGGCCCCACGAAAAGGGAGCAGAACG
-AAAGAGGCACCACGGATTCAAGATCTGGTGCGATTCCGGATCTGGCACCG
-TGCCAACAACTTGAAAACGTGGTGCCTCTGAAAATTTGCTGCCAAGGTTG
-AAATATCGAATGCATTACCCGTAAATCGACACGAGCTACAGTAACCTGTT
-ATCCGCGTGGCGAGACCCATGCGCGTCAGATGTGGCGAAAATTATACTAA
-AACCTGTTTAACTTGCAGAAAAACTTAATTTTTTTTGTTGAAAAAATTGA
-GCCAAAAGACTCAAAAATTTCATAAAGCGAAACTTTAAAAAAATATATAA
-TTTGTTAAAAATTTCACGAAATATTTATGAATTAATTAATTTTTCCAGGA
-ATACCCAATGTGCCGTCACTCGTCAGTTCCATCGATTGCTCACTTGGTCG
-GTGATCTGTCGGACTTTTGCCCACACGCTACAGCCGACGAGAAGATGCTG
-CTCGACGAGGCGTCTTCAATCATCGAAAATACAACTCCAGCAGTGTCTAC
-TGCTCCGGCTGCTGCTCCAGGAGCTACAATGCTCCAAATATAGGAGAAGA
-TCACATATACAATAATATAATCTTATTGCATTTTCGCAATTCTCGTTCTC
-TCCACACACATACACACATCATCCCAAGTATTCCTGTGCTGAATCTCAGT
-TTGAATGATGTTTCATACCGTTTTTATCCCACTATTGCCTTATCGTTTCC
-TGTTTTATTATATTTTTCATTTTTTATATTGCCACCACCACCACCAACAC
-CACCCTCTCTATCTTTTTTTGTTCTTTTGCCTCCAGCAACATCATCACCT
-AGTTTTCTGTGAATTTTGAATTTTGTGTTCCCCCGAGTCCCCTCTGATAG
-GAATGATAGGAAAAACAATGAAAATGCGAGTTTTTTCAAAAAAAAAAATA
-CAAACTAGGAAACTATAGAAACAAAAAAAAAACATTTGAGGCGCAGTACC
-GAAATCTCTCCAAATTTGGCCCGAAAAATTCAAAAGAAAATATTTATTTT
-TCTAAATTATTATTTTTCCGCCACTCCAGCCTCATTCTCATTGGAGCGCG
-CAAAGTCATGTCGATTTACGAGATTAAGATTTTCAACGAGTTTCATCATT
-GTTATCGATTTTCGTGTAAAGTTAACTAATTTTTTTGAAAATTTTCGCAA
-AAAATTTTGGATAATAAAATGTTCAATTGGCACGAAAATGCAGATCTTCA
-GCAAAAAAACCGACAGAAATGTGTAAAACTGAATCTCGTAAATCCACATG
-GCATAACGCGCTCCAATGAGAATGTTTTTAGCGAAAAGTTTGAACAAAGG
-AATATCAAATCAGGGCCAAATTTGGAGCAATTTCTAAAATATTTTCTCAA
-TTCTTTCGGTATTCCACATTCAAACAATTATTCGGCCGTTCCCATGAGCC
-TCTGAATCTCGATGGGATCCCTTGGCACTGCAGCAGTCAACAGCTCAATC
-CCTCCAGCTTCACTAGTCGCCACGTCATCCTCGATACGGTATCCAATGCC
-ACGAAACTCTTTGACAGGCCAATCCATCGGAACATACACTCCCGGCTCAA
-TGGTAAATGGCACATTCGGTGGTAGATCAATGTCTCGGGATACTGTCGGA
-CAATCGTGAACATCCATTCCGAGATAATGACTGACGTGGTGGGGACACAG
-CTTCTCCGCCTGATGAATCATCTCCTTGTGATCCGTAGATCGAATCAGGC
-CGAGTTCGGTGAAACTTGCCGCGAGAAGTTCGTTCATTCGGCGGAACAGG
-GCGCTTAGGCGGACTTTTTCCATTGAGTGGGCGTAGGTGAGCAGTTCTTC
-GTGAACGTAGAGAAGCGCTTCGTAGAGGGATAGTTGGGCGTCTGACCAGC
-TGCAAAAACGAATTTTTTTTTGGGAAGGTTTTTTGAAACGATTTTTCAAA
-TTTCGTTCGAATTATATTAAACTTTATATAAAACGATTATCCACGGATTT
-CTGGCTTCCCTCATAAATTGGAATGGAAGAGTTTACCGAACTAGGCCATT
-TTGGCTCGGCCATATCTGGTGCCGCGTCGCGGCTCGATTTTAGTTGTAAA
-ACTAAATGCATTTGTACGTGTGGAGTACACGACTTTCCCACGCGTTGTCC
-GGCGGGCGATTGTCAATGGAGCGCAAAAAATTCACTGAGGAAGGGGAGAA
-CTCCGTGATTAGCACCGCCTATTTCTCTCACGAATCTATTTCTTCGAAAT
-CTTCTATTTTTTAAAAATCAATTCCTGAATTCTGAAATTCATTATAGCGT
-AATTTTTTGGGAATTTCACCCTGAATTCCATTTCTACGGAACAACATTTT
-TTTCTCGAATTTGTGGTGACTCAAATTAGAATTTTCAAAATCTCCAGAAA
-AAAAATCATTTTTCCTGAATTTTCTGGAGATTTTTAAAGGAATAAAGTGC
-AAAAAAGACTCTTTTTGAGGCACCACCGAAAGGAGAAAGGAGAACACAAA
-CCACGCCCATTTTTCCGTGCCGCGCGCAAGTTTTTCTGCAAATTTTTATT
-TTCAAACGAGACAGCGAAACTCCGAAATAACGCATATCGTGTTCTTTATC
-ATCAACGTGTTATTTCGGAGCTTCGTTGTCTCGTTTGAAAATAAAAATTT
-GCAGAAAAACTTGCGCGCGGCACGGAAAAAATGGGCGTGGTTTCTGTTCT
-CCTTTTTCACCTGTTCTCCTTTCGGTGGTGCCTCTTCTTTTTTTTTTCTA
-TGTTTAGCGTAATTTTTTAGCCATCTTGGAATAGCCCCGCCCATTTCTCC
-CACAAATCCATATCTACGAAATCTCGCATTCCAGAATGATTTGTGGTGTC
-TCAAACGGGAATATTCAAAATTTCTAGAAAAACCCCATTTTTCTTGAATT
-TTGGCCGAACTTCTGTAATTTCTGAAATTCTGAGAAAAATTTTCATTTGA
-GTCACCACAAATACTGGAATGCAAGATTTCGTAGAAATAGACTTGTGGGC
-GAAATCAGCAAAAAATGGGAAAACATTCAATTTTTTTTAATTTTTTGGGG
-TTTTATCACTAATTTTTAGCACTTACAATCCAGAAATCGGAAAGCAACGT
-GTCACATCTGACACATAACCATTCAAATCACACCCAGCATCCACGAGAAC
-ACATTCCCGGGGATTTAGGTCATTATTTGCGTCCAAATAGTGAATAGTGT
-TGGCACGAACACCACCGGCAATCACTGGTGGATATGCTTGCATTTCTGAT
-CCACGACGACGTCCTTCAAACTCCAAGAGCCCGCAAATCGCGTTCTCGTT
-GTGTAGATCACGTGATCCCGATATCATTGAGCTCATTGTCTGGGCTCCCA
-CGTTGCACACGTCACGCATTGAGCTCATTTCGGATGGAGATTTTATTACT
-CGGCGACGTTCGATCTGCAAGGAAAACTTGAAAATTGGCAAAAAAATAAT
-TTTTTTTTTGAAATTTTAAAACGATTTTTCGGGTGTTCAGAAAAATTTTT
-TTTAGGAAAAAATTGGAATTTTCCAAAAGTTTCAAAAAAATAATTTCTAG
-AACTTTTTCCTAAAAAAAAAATGAATATTGAAAGCTTCGAAAACAGTAAA
-AATTGGGAAAATTTTTTTACCGTTAAAAAATTTTTTTTTTTCGAAAAAAA
-AATTTTCAGTTTAAAATTTGGAGCGTTTTCAATTTTATTGATAATTGGTG
-AAACAAAATAAAAAGTAAATAAAAAATTTTTTTTTTGAAAAATTTGAAAA
-ATTAGATTAAAAATGTTTATTCTGGGATGAAAAAAACCTCCTAAAACCAT
-TTTCTGGAAAATTTAAACTTCCTATTTTGTTCAGACAATTCTTTTTTTTC
-AAGAAAAAATCAAATTTTCCACTAGAAAATCGAAAAAAATTGACCTCGTT
-TAAAAATTGGACAAAATTTGAATTTTTACTTTGAAATCCTCGAAAATCGG
-ATTTTTTTTTCAAAGCTTGAACAATTTTCTGCAAATTCTATATATCTCTA
-AACTCACAAAATGATTAATTTCCCGAACAGAATTAGCTTTAGCCTGTACA
-AACTTATAGAGTAAATCATCAGAAGTCGAATCAAAAAACACTGCAGTTCC
-CTTATCGCAAACTTTTTCCAAAGTCTGTAGAATCCGGCTAGTCGGCACAC
-ATTCCGTGAATTTTGCAGTCTTTTCCCATTCGGATTCAGTTGGTAGGGCG
-CCTTCCCATAGCTCATCATAGGCACTACGACGGTCAGCAAAAAGAATATT
-TGTTTCTTTTGAAGATTCGGATATTCCTGATTGCATTATGTAATAACAAT
-CTGGTGTGGTGATTCCGTTTAGGTATCTGCAAAAAAAAAAAATTTTTCAA
-ATTTTTTTCTGTTAAAAATTTAATTTATTTTTTTTATCAAACAATTTTGA
-ATTTTTCCCAAAAAAAATCCGAAAATTGTGAACAAATCTATTATTTTCGT
-TGAACAAAAAAAAAACAAATTCAATTTTTAAATAATTTAATTTTCGTTCA
-GAAAAAGAAATTTGTCGATTTTCGGCGGCAATGATTTTTTTTAACGAAAT
-TTTCCTGAAAAATTCAATATTTCAATAATTCCTGATTTTCTAGTTTTTTT
-TTTAAAGAAGAACATGTTAAATTTCTACTAATTTTATAACAAAAAATTTC
-GGGAAAATCTAGAATTAAAAAAAAATGTTTTCAGAAAAATTCTACTAATA
-TATTAATTTTAGCTTAAATTTCGATAATTTTAGGTTATTTTTCAATTTTT
-TTAGGGCGAAATTTTGATTTTCAAAACAAAAATATTTTCTGACAAAAAAA
-TTAATTTTCATTCTTTTTTAGATTTTTTGAAAAATTTTCAATTTTTTTCT
-GAAGAATTTGGTACTTGTGTATTACATGCCCTCATTTTTAAATTAAATTA
-AATGTTCATTAATTTCTCCATTTAAATTAAACGTGATATACATTTTCTCT
-TTTTAGGCTTAGAAATTGCTATTTTGCTACTTAAAAAATTACTATTAAAA
-TGAGGGCATGTAATACACAAGTACCAAGAATTTCAATCAATTCTTGTTTT
-TGAAATTTTTTTTGGGAAAAATTCCAATTTTCGATTGTTTCTTCGATTTT
-TTCAGAAAAAAAATTTTCTAAAATTTATTTATTTGTTTGAAAATTGGATC
-TAAAAAAATTTCTCTAGTTTTTATTTTTTTTCTGGAAAAAGCTTTTTTTA
-ACTTAAAAAGTTAATCTGTGGCCGAGTTTTCTCTCATCATTTTCACGGCC
-ACGGCCATCAAAACCGAACCTGAAATGGCTTTTCTGTCGGAACGCGTGTG
-GAACATCCGGTGCAATATATGATTTCCGTGCTCCTTTCATCACAACGACC
-ACTTGCTTTTCTGAAACTTTGAGAGGTCATGGCCTAACTTTTAAATGGTT
-TTCTAGGCCACCATGGTGATTTTATTACGGTACCGGGTCTCGACACGATG
-AATTTTGTAGAATAAATTTTTCTGAAAAATTTCGTTTTTTTTTTTAGAAA
-AATCAAATTTTCAAGAAAAATGGGAAAACATTTTTCAGGAAAAATTTAAT
-TTTATAGAGAAAAATAGAATTTTTCCTTTAAAAAAATCTGAAAATTCGGA
-TTTTTGAGAATTCTCTTTATTTGGATTTTAAAATCCAAATTTTCAAAAAA
-AAATTTAAAAATCGGAAAATTCCAAATTTTTGAGAGTAAACTCGCCTTAA
-TTTTTTTTTTCAATTAAAAAAATTAATTTTTTAAAAGAAAATTGGAATTT
-TTACCCAAAAATTGGCAATTATTCGAGTTTTCAACGGAAAAATCTGAAAA
-ATCCGAATTTTTGAAAAAAAAATCTTTAAAAATCCCAATATTCAATTAAA
-AACCGCGAAATTTCGGATTTTTGAGAAAATTTTAATTTAAAAAAGTCCTA
-TTTGTACTGCAAATCCTCATTTCCAAATGATGGCCTAACTTTTTCAGAAT
-TCTAGGCCACCAGGCCATTTCTCTGCCTCTTACCCCCAGTTTTGACCTCT
-TTTTTGAGTAAATTCATCAAATTCGTCCTTCTCATCGCATATTCCTCATT
-TGGAATTCGCGATGGCCACATTGGTAGGCTCCGCCCACTTCTGAGCATTT
-TTTTTTTGGATCTGATCTGTGTGGGAGGGAAATTCGAATTTTTTTAGAAA
-TGAATAAAACTGAAAAAAATAGATTTTTTGGGAAACAGGGAACCTGAATT
-TTCGAGAGAAAAAAGGAGGTAAAACAAAAAATTCGATTTTATATTGAGCA
-AAAATTAATAGAAAAAATAAACTTAACAATTATGAACAGAAAAACCTACT
-AAAAAAGTCTAAAAAATGAATGAAAAATTGCAAAAAAAATCTACAATCGA
-TACGAGACTCCTCCTCCAACAATGCAGTTCTCGCCGGTGATGTACCTGAA
-AAAAAGTGATTTTTTTTTGAATTTTTAGAAAACAAAATTATGAAAAAAAC
-CAAAAAATTTCCGAATAATCGAAATTTTTCGGAAGTTTTAGGTTAAAAAA
-ATTTTTTTTTGATGAAAAGTTTTTTTTCAACAATTCTGAAAACTAAAAGT
-ACCAAAAAATTTTAGTTTTTTCGATTGTTTCAATATGATAATTTTTTTTA
-AATGTTTAAAATTGTATTTTTTCAAAAAATATTATCAATTTTCCAATTTT
-ATGGTAATTTTGGATGTGAGATTTTTTTCTTCAAATTTTCGAAACGTTTC
-TCGATAAAAAAATTTTTCAACTGAAAAACTACAAAAAATCCTCTTATTTT
-GAAGAAAAATCGATATTTTCTCAAATTGTTCAGATTTTTTCTGTTTTTAC
-CAAAAGTGACCAAATTTTGAGACTTTTCGATCCAATGTTTAAAATTTTTT
-TCCCGTTTTTTCGATATTTGCGGTTTAAATTTTTTTTAAATTTTTTGATT
-CAATTTTAATAAGTTTGAGTGTTTTTCGATTTTTTGTCCAAATTTTTTCA
-AATTTTTTTCCAGAAAATTGGTAGAAGCCAAAAAGTGCGATTTTTTTCCT
-TAAAAAAGATAATTATTCAGTTTTTCGACTGTTTTCTTCTTGCTTCCAGA
-TTTTTTCTCGAATTTTTTTTATATTTGAATTGTATTTTTAAATATTATAC
-TCCTAATCGATAAAAATTAGTTTTTTTTTCAATTTAAATTGGAAAAGAAC
-GTTCTTTTTCGTAAATTTTAGTGATTTTTGATTCCAAATTTTTGGATTTT
-TTCAAAAAATTTCCCAGAAAATTTTACCTGGCTTTGGTAGAAGCCAGAAA
-TTCGATTAAATAAGCTTTTTTGGGTTTTTCGACAATTTGTCAAGTTAGGA
-ATTAAACTTTTAAAATTTTTTTCAAAAATTTTAAAAAACTAAAAGTATTT
-CTGAGAATTTTTCTGAAATTAATTATTCAGTTTTTCGACTGATTTCTGCT
-TGCTTCCAGATTTTTTCTCGAAGTTTTTATATTTGATTTTTTTAAAAAAT
-ACTCTTAATCGAAAAAAATTCATTTTTTGAATTTTTTCGGGACTTTTTTT
-TTCGAAATTTTCGTAAGTGTTAGTGTTTTTCGATTTTTGATTCTAAATTA
-TTGGATTTCTTCAAAAAATTTTTTCAGAAAATTCTACCTGGCTCTGGTAG
-AAGCCAGAAATTCGATTGAAGAAGCTTTTTTTTCGGTTTTTTGGACAATT
-TTCCAAGTTTTAGTTAGGAGTTAAACTTTTTCAAATTTTTTTTGAATTTT
-TTTCAAAAACTTTAAAAACTAAAAGTATTTCTGAGAATTTTTGAGAAAAG
-CATTTTTTTTCTCGAATATTTGAACTTTTTAAATTTTTAAAGCTTTTTAT
-TTTTAAATATCAATTCGAATATTTTACTCTTAATCAATGAAAAATCGATT
-TTTTTGATAATTTTTTTCAAAAAAAAATTCGAATTTGAAATTTTTTTCAT
-TCAGAAAAGGGAATTTGACTATTTGAAAACAATTTTTTGTTGAATTTTTC
-GTAAATTTGAGTGATTTTCGATTTTTGATTCCAAATTTTTGGATTTTTTT
-TTGACAATTTTCCAAGTTTTGGTTAGGAGTTAGATTTCTTGGAATTTTTT
-TTTGAATTTTTTTCAAAAATTTTAAAAACTAAAAGAATTTCTGAGATTTT
-TTCCTTAAAAAAGAGGAATTTTTTAGTTTTTCGACAGATTTCTGCTTGCT
-TCCAGATTTTTTCTCCAAGTTTTTATATTTAAATCTTTAAAATTTATATT
-TTTAAATAATATTTCAGATATTATACTCCTAATCGATAAAAATTCGTTTT
-TTTTTCAAATTTTAATTGAAAAAAATCGATTTTTTCGATAATTTTTTAAT
-TTTTTTAAAATTCGAATTTGAAACTTTTTCATTCAGAAAAGAGAATTTGA
-TTATTTGAAAACAATTTTTAATTTAATTTTTTAATCCTTTAAATTTTCGT
-AAATTTGAGTGTTTTTTGATTTTTGATTCCAAATTTTTGGATTTTTTTCC
-AAATTCTCCAAATTCTTATTTTTGCAGAAAATTCTACCTGGCTTTGGTAG
-AAGCCAAAAATTCGATTTAAGAAGCTTTTTTTTGGTTTTTTTTGACAATT
-TTCCAAGTTTTAGTTAGGAGTTAAACTTTTTTCAATTTTTTTTTTTGACT
-TTAAAAAAAAATTTAAAAACTAAAAGTATTTCTTAGTTTTTTCCTTAAAA
-AAGAGGAATTTTTTAGTTTTTCGACTGACTTCGTTTTTGAATTTTTAAAA
-ATTCAAAAATTGTATTTTTTAAAATTCTAATCGATAAAAATTCGTATTTC
-GATTTTTGATTTCAAATTTTTGGATTTTTTTCAAACATTTTTCCAGAAAT
-TTTTACCTGGCTCTGCTAGAAGCCGAAAAGTGAGATTTTTTTCCAAAAAA
-AGATAATTATTTAGTTTTTTTTCTCGAACGTTTTATTATTTGAACTTTAA
-AATTGTATTTTTAAATAATATTAAAAATTTAAATAATAATATAGAATTTT
-TTTGAAAATTCCTGAATTTTCTGATTAAAAAAACATTTTCTGATGCATTT
-TAGAAACTGAAATTTTTTGAAATCTTTTTGGAATTTTGGAAAATTTCGAA
-TTTGTTGATTATACTCTTAATCGATAAAAATTCGTTTTTTTCCAATTTTA
-TTTGAAAAAAATGATTTTTTCGATAATTTTTTTGATTTATTTTCGGGAAT
-TGACTATTTGAAAACAAAAACTTTAAAAAAAAATCAAACTTTTTTTTTGA
-AATTTTCGTATTTAAATTTGAGTGTTTTTCGATTTTTGATTCTAAATTTT
-TGGATTTTTTCCAAATTCTCCAAATTCTTATTTTCAGAAAATTCTACCTA
-GCTCTGGTAGAAGCCAAACATTCGATTTAAGAATCTTTTTTTTTTTTTGG
-ATTTTTTTTTGACAATTTTCCAAGTTTTGGTTAGGAGTTAGATTTCTTGG
-AATTTTTTTTTGAATTTTTTTCAAAAATTTTAAAAACTAAAAGAATTTCT
-GAGATTTTTTCCTTAAAAAAGAGGAATTTTTTAGTTTTTCGACAGATTTC
-TGCTTGCTTCCAGATTTTTTCTCCAAGTTTTTATATTTAAATCTTTAAAA
-TTTATATTTTTAAATAATATTTCAGATATTATACTCCTAATCGATAAAAA
-TTCGTTTTTTTTTTCAAATTTTAATTGAAAAAAATCGATTTTTTCGATAA
-TTTTTGAATTTTTTTTTTACAAATTCGAATTTGAAATTTTTTTCATTCAG
-AAAAGAGAATTTGATTATTTGAAAACAATTTTTAATTTAATTTTTTAATC
-CTTTAAATTTTCGTAAATTTGAGTGTTTTTTGATTTTTGATTCCAAATTT
-TTGGATTTTTTTCCAAATTCTCCAAATTCTTATTTTGCAGAAAATTCTAC
-CTGGCTTTGGTAGAAGCCAAAAATTCGACATAAGAAGCAACATCAGACGG
-TCTTCCAAGTCTTCCCAACGGAATCATCGATTCCAAGTGTTGTTTAATCT
-GACGAGCTTCTTCTCCAGAAGCATGATCCCATACAGCACCAGTTCCGTCT
-CCTTCAATCATTCCAGACACCACACTATTCACGCGGACTCCTTGTTTCGC
-GGCACTCTGAGCTACGGATTTTGTAAGTGATAGGACACTGCTAGATGCAA
-CTGAGTAGAGACCCATATCGATTGATGGAGTGAAGCCGAAACATGACGTT
-AGGTAGATGATACTGCCGTTTCTGGAAAAAATCGATTTTTTTTGGACGGG
-AAATTTTGCCTGCCTACGTGCCTACCTGCCGGCCTATTTTAGCCTATTTT
-TCATTTTTTTTTTGTTGTTCTATTTTTTTGCCGTTTTTTGGGAATTTCAT
-GATTTCTAGGGTAGGCACGACTTCATGCCTACGTGCCTATCTACCGGCCT
-AACATTTGATATTTTTTTAGAATTCCATGATTTCTAGGTAGGCAGGTAGG
-CACGAATACATGCCTGCCTACCGCCTGTTTTTTTGAAATTTTTTTGTGTG
-AAAAATTAAAATTCATGGGAATGCTTTTTTTTTCAAAATTCAATGATTTT
-TAATGCAGACCGCGCCTATCTGCCTACCGCCTATTTTTGGCATTTTTTGT
-GTGCAAAACAAAATCAAATTAGCTTTTTTCTTTTCGTTTTTCTACGATTT
-TTTCCAAATTTCAAGATTTTTCGGATAGGCACGACTTCCCACCTACTGTG
-CCTACCTACCTACCGCCTATTTTCGGCATTTTTTGTGAGCAAAAAGAGAT
-CAAATTAGCTTTTTCTCCTGTTTTCTACGATTTTTTTGGGTAGGCACGAC
-TCCATGCCTACCGTACCTACCTACCTACCTCCTATTTTCGGCATTTTTTC
-TCGTGCAAAAAATCATATTTATGAAAACACTATTATTTTTGTTTTCTGAA
-TTTTTTTTCCAAATTTTGTGATTTCTAGGGTAGGCACCGACTTCATGCCT
-ACGTGCCTACCTACCTACCGCCTATTCTCGGCATTTTTGTGAGCAAAAAA
-TTAACATTCTTGAAAATCCTTTTTTTGTTTTACTACAATTTTTTCAAGTT
-GCATGATCTCTAGGGTAGGCACGATTTCATGCCTACTTGCCTATCTACCT
-ATTTTTCCCTTTTTTCGTGGTTTAGGTAGGCAGGCATGAGTCAGGCACGA
-AAATCTAGAAACATAATTTTGATTCTATCGGTAAAATAGGCTTTCAAGAC
-AGTTTGAATTTTTCGAATTTCTACCAGCAAAAAATAATATCTGAAATTTT
-CGCGGCGAGACCCAAAAACTGACTGAGATTTGGCGAGCGTCGACATAGCG
-GCTTGCGAAAGACGGAACGGTGTTGTCAGATTGTTGGCGAAAAGCTGAAA
-TTGGTTTTTCGAGGTCAATTTTCCACGTGGAATTCAAATTTCAGCACTCT
-CGAACCTTATCAAAATCCTCGCCGGATGTCTCAATAATCTCGCCGAGCAC
-CTCATTCTGTGGTGGAACTATAATTAAAGTGTCCAGACCGCCGAGCTTCT
-CAGCCACTTTCGTGATCAGCTCCTTCCTGTGCTCGGCATTTGCCACGTCT
-AATGAGAAAGCTGTGACGTCACCTCCAACCTGAATTTATTCCCGAATTTC
-TCTTTGTCAAGTTCTGAAAATCTGCCTAAACCTTTATATTGTCCTCTGCA
-ACCTTTCCCACACTATTCGGACAGTCTGCGGCGGCGGCGACCTTGTAGCC
-GGTGAACGCGAGTCTTCTCACGACGGCTTTACCCAGTGTGGACGTTGCCC
-CGATTACAAGTGCACATGACATTACGCTGAAAGCCCGATGAGGAGGCATA
-TTTATAGATACACCTAGACATCAGGTACATTTATTTGGAAATCCGTAGAA
-AATAAAGAACATGTGAAAATAAAACAGATCATTTTATTATTTAGAGGGGA
-GAGGGAGGGGGAGCAAAGTCGCTGACTGAGAACTTTCGAAAACCGGTTAG
-TTACTCCAGTTGTACGGCTTATTCATGCCATATTTTCCAAGATTTCCACC
-ATTGTGTTGGTATTGAGAATGTTGATTCTGCTGAGCTGCCGGCTTCGATC
-CAGACATCTTGTCGTAACTCTTGCGCTCGTCATCCTGTCCGTAGAGTTGA
-CGACCTCCAGCGCTGCTTCCAACATTGGGCATCATGTTCATGAATGGAGT
-AAACTGGTGTGGAGCAGGTGAGTACTGCTGCATGAACAACGACGACAAGT
-TTGGCTGCTGCATGTAGTTCGTCGCCTGGAACCCTGGTGGTGGTCCAACA
-TTCGACGCCTGCTGTGGCTGCTGATCCCGAGAGCTTTGAGATCCGAACTT
-ATTGAAGTCCATAAGTCCATGAGTCTCTCGTTGTTGACCAGATTGCACTT
-GTTGCGCAGAAGCAGCCTGTGACAGAGGAGCAGTTGGAAGCAAGCTTGTA
-AGATCAACTCCCATTCCGTATTGCATAAGAGCAGCAGTATATTGCTCATC
-TCGAACTCCTGGCATTGGATTGTACATGTTCATGTAGTTGTTCATGTATG
-GTGCATATGGGAGTTGTTGAGTGAACATCATATGTGGATGCTGTTGTGGA
-TGTCCAGTCGGTTGTGATTGAGCTGGTGGAGTTTGTTGCTGCTGCTGCAC
-TGGCTGTTGTGGGGCTTGTTGCTGCTGCTGCTGTGGCTGGTGCTGCTGAG
-CAGATTGCTGTGTTGGAAGTGGTCCAGAATTGTTGAACTTGTTCGGCGCC
-ATCCTGTCCGTTGGTTGATATGAAGCGGACGAAGTGTCATAGGACAATCC
-TCTGTTAGATTGACCATATGACAATGGAGGTGAAGTCGATTTTAAGTTGT
-AATCGCCGTTAGGAATTGACGTCCTTTCTGGCTGAAAAATAATCGAGAAT
-TAGAATAAATCGTCTTTGCAACAAATTTAACTCACCTCAACTTGTTTCGG
-CATAATACGAGAAGAGTTAAATATATTTTCACTGGCATTTGAGATCGAGG
-CAGCGGAGGATTCAGTAGAAGGAAGCTGTGGGCTTGGAGCAGCCTCAACA
-AATCCAAATGAGTAGTCATGAATGTTCGTTGGTGCAGTTGTGCCAACAAA
-TTCCACTCCAGGATCAGGAATAATCTGGACTGGTGCTGCACTTGGAATTG
-GAGATAATCCTAGTCCTGGTGCTTCACTCAATCCTATTCCAAGATCCGTC
-TTCAGTTGAGTGGTCCATGCTTGATTTGGTTCTGGGGTGCTTTGTACATT
-TTCATCGTGATGAGTCGACACATTAGGCGTCTGCTCCTCAGCCAAAACTG
-ATGATTCACTGAAAATTAAATTTTTAATAATCTAAATACAGGGACAGAAC
-AACTTACTTTTGGAAGAAACCATCTTCTTTCTCCGGCTGATGCGAAGTTT
-CTGGCTCGAAAAATACTGGCGCTGCTGCTGGCTCTTCTTTAACTGGTGCA
-ACTGACGGAAGTGGAGGTTGTGGGGAGAGACTCCTCCTTGGCGGAGCTGC
-TGGTTGAGGATTCTGTGCCTGGTGCTTTCGGAGTGCTTCTTTGCGATGGG
-CAGCTGCTGCTACTGCAGCAAATGAGATCGGTGCCGGCGCAGAAGATGTG
-GGAACAGTGGCGGTGACGGATTCCTCTACTGGTGGTTGAACTTCGGTGAC
-TGTGGTATCCACTTTAGTCTGATTCTGAAAAAAAAACACGTTTCGTCATT
-TTCCTTCTTCAAAAAATTCTTACCTCATCAAGATCAGCAGTGAACGCATC
-TGGCTCAAGTGCTGATGATGGAGCAACAGCTCGAGAATATCCACCTCTGG
-CGCCACCTCTTCCACCTCGTCCAACATACGGTTTTTCAAATCCTCCTCGA
-GTCGAGCGTGGTGCTGCTCCTTCCTTATTATCACGGTTATCCCGATTATT
-ATCTCGGCTTTCTCTTGGAGCTCCATTGGATCGCCCGCGGCCTCCTCGAT
-CGACGAAACCGGTGCCTCCACCTGAAAAAAACATATCAATATTTGATCTA
-TTTCAATCAAGCACGAACCTCTGCCTCTTGCTACAAATCCTCTGTTGTTA
-TAACTGCCCTCTTCCGGCTTCTTCTTTTCCTTTTTGGCTCCTTTCTGTTC
-AGTCCACGAGTCAAGTTTATCTCCAGCATCCAGAATGTGATCGATTGCGC
-CGTAAAGATTGTTGTCAGTATCCAATAGCGCTATCTCAGCTTGTGCTTGT
-GTACATCCGGTGGTTTCGATAATCTGAAAATGAAAAAGACATGAGCAGTG
-AAAAAACCCCTCTTGGGAATGCGCGAACACTTTAATTAGCCCAAATGAGT
-AGGACATCTGGGTACTCTTACTCTCGCTGCACCATCTCAAGCGCGGACAC
-CTGCTTTTGTCCTTTTATTTGCCATCTGGCCCCGTCTTATCGATTCGAAA
-TTCCTATTGACACTGAAAGCGGACACTAGAGAAGTTCAAAACAACAAAGT
-CACGTGCGTCATCATGTCGGTGTGTGGCGAGCGTTCGCGTGATGCAAAGA
-TCACTATTTTCAGGAAAGCGTCATTTCCAGCTTGGAGACTTACCGTCTTG
-ATCATAAACTGTATGTCCTCCTCATTTCCGGAATTTCCTTCCAGTGTGAG
-TCGTGCAAGTCGCGCTTGATCGCTGGTAGCTTTTTTGTCGCCTTTAATAC
-CCATTCTGAAAACAAATTATAAATAAAAAGGGTCAGTCATGTGAACGCAA
-GAATGGAATGAGAATCACGAGAATACAACTATCAAAGGAAGGTTGAATGA
-AAGGAAGGTCAAATAGATGACAAAAGTAGGAAAAGAACGAAATATGGAAC
-CTTCCAGATCAAAAAAACATTATCAAAAGAAAAGCCTCGCACAGAAGACT
-CTAACGAACATGTTAGGATGAAGAAATATTTCAGCAATACATCACGTTGA
-ACTTTGGAGGATATTCTAGAGAAGAAAACCCCTACATTTTACAATAATTT
-TGAAATGGAATTCGAATGAACTGCTATACAATGGAGAATCCTATTTAGCG
-ATGATAAAGTGTAGGCTTGTTACTAGATTGAATAAAAATTTCGAAATGTA
-ACAATACATTGACTGAAAATTTGGGTATTTCAGAGTGTGATATCACAAAA
-ATCAATATTTCCACTAAACTCAAAAGTTCTTACGCTGAAAAATCATTAAA
-AAATTGAAAAATCACCGCAAGCTAGACTAGAATCGCGTTCAAATCTCGCA
-AATTCCCGCAGTTGAAAATGCGGGCGACCGCGACGCGAGCCGCAACGCAC
-CCCTCCAAACATGCGGCATGGGTCTCGCCACGACCGAAAGTACGGTCACT
-CTTGGCAGTATAAAAGGCGACCATTTTCCGCTATTTTCCGGTAAATTTTC
-AAATGAAACTGTGTTGCGGAGGGGGTTTTCCGCTAATTTTGCGGAAATTT
-AGCTATTTAATGTGAAAATGTGAATAAAACAAAAGAAAGTGGGGAGGAAT
-AGCAAGGAAACACACTGTTGAACCCTGGGAATTATCGATTTTGTATGAAC
-TCTTCTTTTATGGCGTCGAAATTATCGACACGAAAACTCAAAACCTTGTC
-ACATTTCTGAGAGAGAAATATCATTTTCAGCACACATGAGTCTTCCCAGA
-TTTCGACTCGTTCAGGGAAAGGCGATCGGCGAGCGATCAACGCCAGGAGT
-CAGCACACCAGAGCCGGTAATTGTTTTTTTTTATTTCAAAATTTCTACAA
-CAACAAAAAGAACTAACAATAATTTATTCCTTTGATTCCAGGCCCCTCCG
-CAAATAAAGCAGGAAGTCGACTACCAAGATGCTCATCAAATGGCTCCGGA
-ACCCGTGGAAGCACCCCGTAAATATTTAAAAATTTAAAAAAGTTAGAAAA
-AAAATTTGAATCCCAATTTTCAGAGGCTCAAAACCATCAAATGCAGCCGC
-CTCGTCAACCTATACAACAGCAGATGCAGCATTTTCAGTCACCATCGCCA
-ATGGCTCCACAAGGGCCGCCCGGGACTCCACAAAACTCTGCAGCGGCGGC
-CGCCGCTGCTTCAGATGACAAAAACGTGACAAAATGCGTCCGCTTTCTGA
-AAACTTTAATTAATCTGTCGAATAACGATGATCCAGAAATGCCGGACAAG
-GCCGCCCGTGTCAAAGAGCTAATTCGAGTGAGGAATTGAGCGAAAAACGC
-GATAAAAACCGGACAAATTCGGATATTTCAGGGCGTAATTTATCTGGAAA
-CGACGGCTGAAGAGTTTACACGAAATCTGCAACAAGTGCTCAAATCTCAG
-GCTCAACCGCATCTTTTACCATTCCTTCAGAATACTCTTCCGGCATTGAG
-GAATGCTGTTCGAAATGGTTCGGTTTTATGTGCAAAAAAATTAAAATCGA
-CAAAAAAAAAATCATCGAAAAACAGGAAAATTTGAGTTGAAAAGCAGCGA
-AAAACTTGAATTTAACATAAAAAATTGCAAAAAATCCGTTGAATTACATT
-TTTCAAGAAATTGTGTAGAAATTCCATGAAAAAAATTCAAAATTTCCAAA
-TTTTTTGGCTATTTCTAGTCAATTTCTTTAAAATTCCATTTTTGATAGCG
-AAAATTATCAAGTTTCTAACAATTTCAAGCTGTTTTTGGTGATTTTTTCA
-ATTTTTCGGCTTTGAAATTCCATTTTCCGGAGTATATTGTCATAATATAT
-CCGAGTTCCACAAAATTGAGCAAAAAAAATTAAAAATTTCCCTTTATTTA
-AAAATATTTTCAGCTGTCAGTAATATATGGATTTTCCGCAATTTTTCTCA
-CAATTTTGAGCAAATTCCTGATTTTCAGCCAATTTATAAGGATTTTCACC
-CATTTTCATAATTTAGGGCTATTTTCAGCTGAAAAATTGTAATTTAAAGT
-TTTTAAAATTTTTATAGATTTTCTCAAATTTCAGCTCAAAAATTCGATTT
-TCAAGCGCATTTCCAGGCAATTTATTAAGATTTTCACCAATTTTTTTAGC
-TTAAAATTTAAAATTTCCACATTTTTTGTCTATTTCCAGTAAATTTCTTT
-AAAATTCTATTTTTGAAAGCAAAAATTATCAAGTTTATCGCACTTTTTCA
-ATTTTTCCGGAGTATATTTTGGTAATTTATCCGAGTTCCACGAAATTGAG
-CAAAACAATTATTTAAAAACTTCCCTTTATTTAGAGCTATTTCCGCAAAT
-TTTCTCGCAATTTTCACGCAATTTTCATAATTCAGGGCTATTTTCAGCTG
-AAAAATTGCAATTTAAAGTTTTTAAAATGTTTATAGATTTTCTCAACATT
-CAGCTCAAAAATTCGATTTTGAGGCGCATTTCCAGGCAATTTATGAGGAT
-TTTTACCTATTTTCTAGATTAAAAATCTTTTTTTTTCCTCAATTTTGGAC
-TATTTTCCCTAATTTTCAAATTTCCAGGCACTGCATCAGTTGAAGGCGTA
-AATCCACCGCCTGGCTACGTTTTCAACAATGGAAGAACCCCAGGACCCCC
-TCAGCCACCTCCACCTCAACAACAATCCCAGCAGCAGCCACCACTAGAAA
-TGCGTCAAATTCCGAATCCGAATCAAATACCCCCACAAATGGTTCAAGGG
-GGTCCCCATATGGTATCTGTAGGCGCCCGGCCAATGATCAGGCCTATGGG
-CCCCGGCGGCCCAAGCCCAATGGGCCTACAAGGCCCCGTACGAGGGCCGA
-TGGGACATCAGATGGTCCAGATGCATCCTCCTCCCCCACCACAGCAGATT
-CAACAGCAGCACCCGGCTCCCCCTGTAGAAATGGAGGTGGAAGAGAATTT
-ACAGCCTACCGCGGCGGCCACGGCCACGAGGCAATATCCTGAAGGATCGC
-TGAAATCGTCGATTCTGAAGCCGGATGAGGTGCTGAATAGGATCACGAAA
-CGAATGATGTCATCGTGTTCGGTGGAAGAGGAGGCGCTTGTCGCGATTTC
-AGATGCTGTTGAGTCGCATTTAAGGGAACTTATTACACTGATGGCCGGAG
-TTGCAGAACATCGGGTGGAGAGTTTGAGGTATTGAGGAGAATTGATTTTG
-CTTCAAAATACGGCAGCGAAAAAAAAATTAAGCAAAAATAAGGAAATTAT
-TGAAGAAAAATCGTCTTAAAAACAATTTTACATTAAAAAAAAAGATTTTT
-AAATTTCAAAGGTTCCGAACTATTTATTAAAAAAACATCTAGATTTTGTT
-TTAAAATCCAAACAAAAAACATTGCTGAAACGCGGTAATTTTTTTTCAAA
-AAAATATAAAAATCTGAGAAATATTTTCAAAAATATCTCCAATTTTCCCC
-TGATTCCGAATATCTATTCGAAAAAATTCAAAAAAAAAATTTCCCTTTAT
-ATTTCAGCTTGAAATCGCTTTGTGCATGCACACCATGAGATTTTTCAAAT
-GCGCGCCCAGATAAATTCTCATTGGGGCGCACTTGCTTCGTGTCGATTTA
-CGGGAGCTCTTCATTTTTAAATTTCTTTTAAGCTTTTTTTTTCAGTTTTT
-CAACGAGTTTCCTTGATCTTCGTCGATTTTTTGTCATTTTTTTTCCTGAA
-ATTTTGTTTTGTGTCAATTTGAAAATTTTTTAGGTCAAAACTCCTGTGTT
-CGTCGAGATCTGACGTAAAAATATAAAATTCCGGGAGTTTTGAGATATAA
-AAAAAATATTTTAAAAATTTCAGAAAAAAAACTGACAAAAAAGCGACAAA
-ATAAAAGAAACGCGCAAAAAAAAAAAAAAAAAACTTAAAAAAGCACGAAT
-AAATTTTTTTAAAAAATGGAGAGCTGCCGTAAATCGACACGAAGCAAGCA
-TAAAAAAATGGCTTTTTTCCTAACAATTTTTTGTGAAAAATCCGAATTTT
-CCATCCTAAACACTACAAAAGATTCCAGAATTCCGGAGAACTACGTGGCA
-ATTGATGACGTCAAACGGCAACTTCGATTCCTTGAAGATTTGGATCGTCA
-AGAGGAAGAATTAAGGGAAAGTCGAGAAAAAGAGTCGCTAATTCGAATGA
-GCAAGAATAAGAATAGTGGAAAAGAGACGATTGAAAAAGCGAAAGAAATG
-CAACGACAAGATGCTGAAGCGAAAAGGAATCGAGATGCGAATGCGGCTGC
-AATTGCAGCACTTTCCAGTAATAAAACTGTCAAGAATAAGTTCGTTTTTA
-GCGTGAAATTTGCAGAAAAATTATTTTTAAAAAATAGATTTAAAAAAAAC
-AATTTCCTGACCAAGGGTGTCATTTTTCGATTTTTCGGTTTTCAAAAATT
-CGAAAAATGAAAGTTTCGTTTTTCGATTAAAAAACTGAAAAACCGACACC
-TTTGTTTCTGAGATTTGGATTTAGAAATAAGCAAAAAAAAATTATTCAGA
-AAAAATTGTTTTACAATGCTGCAAAATCGATGAAAAAATAAAATAAATCA
-ATAACTAATTTCTAAAAAATGGAAAAAAATTTCGTTTTTTTCGAATTTGT
-ATTTCACAAAAAAAAATTTTTAGAATAAAAATTTTCAATTAAAAAATTAC
-TATTTAAAATCACTGAAAAAAAATGAAAAAAATAGAAAATTCAGAAAAAT
-AGCGAAAAAAAAGTTTTTTTCCAGAAATTTCGTTAAAACGATCAAGATTT
-TAACCCTAAAATTTAGATAAAATCAATTTCTTGTGGTTCTTAATTTAAAA
-AAAAAAACAGTACTTTCCAGTAATAAAACTTTCAAGAATAAATTCGTTTT
-TAGTGCGAAATTCGCAAAAAAAATTACGAAAAAGTGAAAATAGAAGCTGA
-AAGGAAAAATGTTTAAAAAATAAGAATATTTTCGACATTAATTGGTTTTT
-ATATATATTTTTTTGTAGAAGTTTAAAAAAATTACTAAAATCACTGAAAA
-AATTGAAAAAAATTTTAAAATCTGGAAAAAAAGCAACAAAAAATTAATTT
-TTCCAGAAATTTCGTTGAACTATTCGGTATTTTAAGCCTAAAATCAAGAT
-ACAATCAATTTGAACAAAATTTGCTTTAAAAATACTAAAAATTCGAAAGA
-AATAGAAAAAAAAAGAAATTTTCGAAATTTGGATTTATTGTTAGAGAAAA
-GCTGAACACTTACAAAAAATTAATTTTTTACGTTTTGAGAAAAATTTTTG
-AAAAAAAAAATCGATTTTTAAATAATTTTTAGAATTTTTTAGAACTATAA
-TTTTTGAATTTCAGTGACTTATAATCACAGAAAAAAATGAACGAAAAACA
-AATGAACATCTTTTCGGCAAAAAAACGTATTTTAAAAAAAAATTTAAATT
-TCTAGTGACTTTGAAAAAAAAACCACATTTTCCAATAATTTCCAGGAATA
-AACTAAATTTCTTTGGAGAAATTTGAAATTTATTTCACATTTCGAAAAAA
-TTTATATAGAAATAAAAATTTATATGAAAATAAAAAATTTGCAGCTCCTT
-CCAGTAATGAAACTGTCATTTGTTGAAAATTAGTTTTTTTTTAATTTAGA
-AATTCTCTTTTCGAAAAAAAAGGTTTTTTTAAAACTTGATTAAAAATTAA
-TTCATTTTTTTCCAAAATTAGGGAAAAAATAATTTCTAAAAAATTAGACA
-AATACACTTTTTTGTTGAAAAAAACAACATTTTCCAATAATTTTCTTTTT
-TTTTAAATTGCTTCCACTAAATTCACTTTTTGAAGAAATTTTTTGAAATT
-TTTACTGAAAATTGTTGGAAAATTATTAAATGTGCATTTTTTTGCAATTT
-CCAGTTGATAAACTAATTTCGGTTCAATTTAAAATAAATTTCGAAAACCA
-ATTTCAAAAAATTCATTTTTTACAATTTGTTTTTGTTGATAAAACGAGCT
-AGTTTCTACCAAAATACCGCTTTTTTACATTGAAAATTTAAATTTCAGAT
-GGGAAAACACGGGCGCCGCAACGACAGCACCTCGTCCACGAACAGTACGT
-GTAACAACTCGTGATCTACATCTTTTAGTCAATCAGGATAGCCGATTCAC
-AGGGTAGCGATTTTTTTTGTTTAAAAAATTTTTTTAAAAAACACCGTATT
-AAACATTGATTTTTATTGGAAAAAACTGATTTAAAAATTTTTCAAAAAAC
-TTTCAAACGAATGGTAGTTTTTAATATTTTAATTTTAAAAAATTCCAATA
-AAAATCAATTTTTATACGATTTAAAAAAATTTTGAAAAGTTATCCAATTT
-TCTCCTAAAAAAACTCATTTTTTTTCCAGAACATTCATCCGTGAAAAGAT
-GTCATACGGTGGTCCGGCAGTCGATACAACTATCTGAACTAAAGAAATCT
-CATGGAAAAAGGAGCGAAAATTCTGCTTTTCTCGTTTTCTTTTTTTAAAT
-TTAATTTTATTTTTCCACAAATTAAAACAATCACTTTTTTCCAGTCAAAT
-AATAATTATTTCTCATTTTTAAACGAAATGCTAGACATAAAAAAAAGCTT
-CTTTTTCAGCTTTTCAGCCAAAAATTTCAGATTTTTCAGAAAAAATTCAA
-CAACAAAAAATTGGCAAAGTGCAAAAAAACCAGAATTAGATATTAAAAAT
-ACAGGAAAAATCGAGAAAAATGAGTTACAATTCAGAAAATTAGGCAATTT
-TTTTTTCAAAATTTCTCAAAAACACTGAAATTTCGGTATTTTTTTCTCTA
-CTTGAGCACAACCTCGTGTTGCACCAATCGAACATAGTCTTTGAGCGTCG
-GTGGAAGTGGAAGCTCATCGATTATTCGCTGATAGACACCGTCGGCACCG
-GCGATTTCCAGATTTCTACGTTGGCGAAGGTGGATGGCGCGCTGGAAAAA
-TTTCTAATTTCGAGCTGAAAACTCTTTTATGAAAGCAAAATTTCATAGTT
-TCAATTCAAAGTTCGAATTCCTCGCAAAATTTCAGTCGGAAAACCGAAAA
-CTAGAAGTTTCTTGCTCGAATTTGAAATTTCGAGGGGTACGGTATCCTCG
-AAAGTACGCAAACACCGAATTTTGTTTTTTTGAAGTTTTGGCGCCAAAAA
-TACAATACCCGGGGTCTCGACACGACAAATTTTTAAAATTTTTTTGAGTA
-CTGTAATTTCAAACAAAAAGTTTTTTTTCGAATAAACTCGAATAATACGA
-TAAAAAACATATTTTAATAAAAACCGTGGCAACGAAAGTTTGAAAGTACA
-GTACTCTCTTCAAAGGCGCACACCTTTTACGCATTTAACTTTCGTGGCGA
-GACCCCGGGGATACCGTAATTTTTGACTCAAAATTTAAACAATAAATCCG
-TTAAAATATTAAAAAATTTTTAGATATTTTTCAAAAAGACTGTCGAAAAA
-TTGTTTTTTTATAATTTTTAGAATATTAACAAACAGTTTAAAAATTCCAA
-CAAATTTTGTTTTTCATACCGAAAAGAAGAAAAATGGACAAAATAGTAAG
-CTATTTTTGTGTGTCAAAGTGTCTTATTTCGGCTTGATCTACGTAGATCT
-ACAAAAAATGCGGGAGAAGAGACTCAGAGTTCTCAACTGATTTCGCATGG
-TTAAGAACGTGCTGACGTCACATTATTTTAAGGCGAAAAAATCCCGCCTT
-TTTTTGTAGACCAAACCGTAATGGGACAGCTTGGCACCACGTGACACCCC
-CCGATTCTCACCTGTTCGTGATTTTGGCGAACTGCCATTTCTTTCAAATA
-ATCGTCTAGCGGGGGACTCGATGCTGAAAAAAAAGTTTGATTCGTTAGAG
-GAGCACAAAATTCTGAAAATGCGTATTGCACAACATATTTGACGCGCAAA
-ATATCTCGCAGCGAAAACTACAGTAATTCTTTTTAAATGACTACTGTAGC
-GCTTGTGTCGATTTACGGGCATCGATAGAATATTTTTAAAAAAGAAGAAA
-AAAGAGGGAATAATACGAAGAAAAAAAGGAAAAAAATAAATTCATTTCAG
-AAATCGAGTTCGTAAATCGACACAAGCGCTACTGTAGTCATTTAAAGAGA
-TACTGTAGTTTTCGCTACGAGATATTTTGCGCGTCAAATATGTTGTGCAA
-TACGCATTTTAAGAATTTCCAGTTTTTTCAAACCTTTAAACTTACATTTT
-CGCGGTTTTTTGGCGCTCTCGGATTTCGGGGAACGTATACGTCGGCGACG
-TGACGTGGTTGAAGCAGGGTCCGTCGAACAACATGGCTCTTCGTCTTCCG
-ATACTTGGGATTCTGTTGATGTTGACGGTGATTCCTGAGGTTCCTCTAGA
-GCATCTGAAAGCTCTTGCTCATCTTCTGATAAATCTCCATTGGGACGTTC
-AACCAGGCCGGTGGTGGAAGGATCATTGATGTTCGGAATCATTACAATCT
-CCATTCTCGGAGTATTTGGAGTTTCTGGTCGAGCTATCGAGGAAAGTATG
-CGATGATGGCGGGGTCTATCATGATTAATCGTCCATTCGAGCACATATGC
-TGGTGCTGGAAGGATTGAAAATTGTAAAAACTAAGATTTTTTGGCCAAAA
-AAATAATATTTTCTCAAAAATTTTGAAATTCTCGACAAATATTTTTTACT
-ACTGCCGGTACAGAGAATGTAGATAGTTGAAGAGACACAGACATCCCGGG
-ACCCAAGGGACGGGGCGCGGGATGTCTGTGTCTCTTCAACTACCTGCACT
-CTGTGCTGGTAATATACTTTTTCCAAAAAAAAAACCTACATTTCGGAAGT
-AAAAATGGAAAATTTCGGAGTCTACACAATTGGAAATTTTAATTTTTAAA
-AAATTAAAAATTGTTTTAATTCGGAGTTTTAGACGGAAAAAATTATTAAA
-CTCTAAAATTTTTAAAAATCGAAAAAAAACAAGTCTGAGAGTGAAAAAAA
-TTAATAAATTTTGAACTGAACATTAGATATTTCGATTTTTTTTTGAAAAT
-CATAAATGTTTTCTCGCAAAATTCGGATTTTTTTTACCTGCTCGATTTTC
-AGTAGCCGGAGCTGTATTTCTGAGATTGGCACCATCCAAATGTGCTCGGG
-GCGCTGCAAATTTGATATGAAATTTCACTAAAAAATTAGGAACTTATACA
-AATTTTCTAAAAGAAATACTAATGTTAAGATAATCGAAAGTTTGGAGTGA
-CAGAAAAAATTGTTTCAGCTTCTAGAAATATTTTAATTTAGAAAAAAACT
-TCCAGAAAATTAAAATTTTTTTTTAGAACTTTTGAACATTTTTCCTGATT
-TTTCTTTTTTTTCCATTTTTTGGAATTGCTGGGAATTTCTCTTTTTTCCT
-TCATCCCACAGCTTCGCTTCAGCCTAGGCCTAAGCCTGAGCCTGAGCCTA
-TGCATAAATCTAAGCCTAAGCCTGAGCCTAACCCTATGCCTAAAACAAAG
-CCTGGACCTAGGCCCAAGTCTAAGTCTAAGCCCACGCTCAAATTTAAATC
-GACTCAAGTAACTACTTTAAAGTTGGCAGAAATATTTGAATTCAAAAAAA
-TTTTTAACCAAAAAAAAAATAATTTAAAAGAAATTGTTTTTTTTAAATAA
-AATCAACAATTCACCTGTAAAACCTTGCATTTCTCTCCAATTCAACATTT
-CTTGAAGAACGTCAGTTCTTGTTTCATTCCATCGACGAACATGATCTGCT
-ATAGTATTTCGAATATTTTGTTCATTGTTTTCTTGTTCTCTGGGATTATT
-ATTACGACCCAAATATTGATCCATGACGTCATCCAAGTGATTACGGGTTC
-TTTGATCTGCTGGGAATATTTATAAGCACTTTTTTAATTTAAAACATATT
-TTTTAGTGATTTTTTTTCGAACTTTTGAATTTTGAATTAAAAAAAAAAAA
-ATTAAAAAGTTAAATCCTGAGGGGAGCCAAGAAGTGGGCGTGTTTTAGGA
-CATACTCTTCACTTACGCTTTGGTCTACAAAAAATGCGGAAAACTTTTGC
-CCAAAAAATGTGACGTCAGCACGTTTTTAATCATGCAAAATCATTTGAGA
-GTTCTGCGTCTCTTCTCCCGCATTTCTTGTAGATCTACGTAGATCAAGCC
-TAAATGAGACACTCTGACACCACGTGGAAAATAAAAATCGAACATTTTCA
-AAAAAATTACTCAATTGATTGTCTGCTGGAGTTAGTTGGTCGATTCTGAA
-AAATATTAAAGTACTAAAAATTTTCCTTAGCAACATAGCGCGTTTGCATC
-AAGAAAGGCGGGATTTTTCTAAGCCCGCCCTTTAATGGATCATCAATTTC
-TAGGAAAAATCGATATTTTACACTAAAAGTGATCCAAGAAAATCAATAAA
-TCGGAAAATTTTCCGATTTTCCGTGCTTTTTTGCGAAGATTTATCGAAAA
-TGATTTCCATTAGAGCACGCTTGCAATTTTTTTCACCAATAGCTTTCAAA
-TTTCTTACGGTCTTGGATCAAAAAGTTGTCGACGCCGATTCAACTCTTCG
-AATTGTTCAGCTTGATGCCTTTGAACATGATCCATATACGTATTTCCACC
-TTTCATCACCATTATTGATCCGCAAATCTGACGATTGACACGTGGATTGT
-AGGCGTGTCGGCGAATGTCGCGGCGGAGTGCCTGACGCGCCAAGTAGGTC
-AACGTGCGGGGACCACTAAAAAATCCGGGTTATTGTGATTTCGTGGTGAG
-ACCCGAAAATAGTAGAATTTCCTCGTACATCCTGTGCCTAAGCAGGTTTT
-CAGTTTTTGATGGGTTGTTACCTTCATACACCTACCTGCCTTTGTGACTG
-CCTCCCTGCCTGCCTAAATGTGTGTATGCCTACCTACAGTCTGTTTATCT
-GCCTCAACGCCTTCATACCTACTTGCCTACCTTGCTTACATACCTGCCTA
-CGCGACTACCTATCGGCCTACCGGTTGGCAAGTAGGAAGGCTAACAGGTA
-GGTAAGCTGGCAGGCCTGAAATTTGCAATTTTTGCGAAAAACCGAATTAC
-CTTTCGAAAGGCGTAGGCGTTGAGATCCGTTCCTCCTTCGGAAGCCTGAT
-CATTGGAGAAAATGTCATTCTTCCAGGGACGTCATACACAGTACGATGCT
-TGGAAACTCTTCTGTATCGGCAAACCTGAAAACCTTTAAATGTGGAGGAG
-CCAAGAACTAGACGGAGCCTGTGTAAGGAATATTGTTTCCGGAAACACGG
-ATTTTCAAATTTTAGGCTCCACCCACTCACCACGCAAAATTTCATTTTTG
-GCCCAAAAAGTAAATGTGCAGAAATTGTATTTCAAATTGTAGAAAAACCA
-AGAAATGGGTGGAGCCTGCCTGCCTGCCGGGCTCCGCCCACTTCTTGCCA
-AACCATACCCCCTGTATACGTGGCATGACGAGTTGTCCTCCAACATTCAA
-CATTCCAAGCATTCGTTTCAACAACTGAGAATCATCGGCAACGAATCCGA
-CAAAAATTCGATCATATCGATTTTGATGAGCTTCAAGAAATTTGACATCG
-GTGATGTCGCACACTTTGAGCTCCGGCCGAGCCCAGCCGACAGAGCTCGC
-TTCGGGTGTAGTTATCCATTGATCAATGCATGTTTCCGAGTAGGTGACGA
-GATTCTCGTAGAGTTCGATCCCATGATTTATACCAGTTTCACCTTAAAAA
-TAGGGTTGTCAGGCCACGCCCATTTTTAAAAAATGAATTAAAATTTTCTG
-AGAAAAAATTTCAAACTTTGGTGGGGCATTAAATTTTTTCACATAAATTT
-TTTCGGCGGTAAATTCAAATTTTTTAAAAAATTTCTTTTTTTTTTGGCGG
-GAAATGTGCCGCAAATCAGAAAAACTGAAATTTCTACAAAAAAAGTTGGT
-GGCCGAGTTTTCTCATTTTGTGGTCAGAAAACTCGGCCACCGATTTCTTT
-TGCGGCCCTGTGATTACTTAAAAAAATCGGTGGCCGAGGATTTTTATTTT
-CGCGGCCACAAGTAATGAAGATTGCACAAAATTGATAATAGGGAAAACGC
-GGCCACGAAGTCTAACATGTGCCACGTGGCCGTTAAAAAAAAGCCGGTGG
-CCGAGTTTTATTATTTTTCTAGGCCACGTAACCAGAACTCACCCAATAAA
-ATGCCAGCAATCGTACTTAAATACCCTGAACCAGTTCCAATATGAAGAAA
-CGAGTGTCCTTTACGCAAATCCAAATAATCGAATAATTTCGCATAAATAT
-CAATTGCTCCAACACGAAGTGCTCCCGGATAGAATGGACCGCCCGGTTCT
-GTGGAGGTCAACGACGGAAGACGTGTAAATTTCCGTTCACTAATCGGAAG
-AAAATCGGATCGATCGACAAGTCGAAAGGCTCGTTCGATGTTTCGACGAC
-GGATTGTGTCGTTTTTTACGAGAAAATCGATAAGATCGTCGTTTTGGCTT
-TCACTATTGCCCATTTCTGGAAAATCGATTTTTTAAAATTTTAGATTTAT
-TTATTGATTTTAAATAAATAATTAGAGAGCAGTCATGTGTTTTTCCTTGT
-ATATTTACGAGAGAAATCTCAAAAAATTATTCAAATAGGAAATTTTACGC
-CAACAATAAAATGTAGAGTGGTGTGCGCCTTTAAAAAGTACTGTAATTTC
-AAACTTTTTGGCGCAAAATTTTAGAGTAGTTTTCTTTAAATTAAAAATTC
-AAAAAAAAAACAAATCAAGATAAATACAAAAGTTTGAAATTACAGTACTC
-TTTAAAGGATCACACCATTTTGCATTTAAAAAAATTTGTCATGTCGAGAC
-CGTAATTTTAACGCAAAAAACGTGAATTTTCGCGTCTGTGTAAAAGAAGT
-TAGTTAAGGAGAAAAAACAATTGAAAAATCAACAAAAATTGAACTTTCAA
-CGGAAAATCAAAAATCGTTGCGAGTCAATAATTTTTTAGCTTTGAGGAAA
-ATAACCCTTAAACTCAAAAAACAATTAATCGACTCAACATCAAAATTTCG
-TTACAAGACCCAAATTAAAATTTTTTATTTTGGGATAATTGCTCCTAAAA
-TTAATAAATTCCAGAGAAACGAGTAAATCGTGGCGAGACCCACTAGCGTG
-TACCTTTAATTTCGAAATTATTTTGGGCTGTTCATCACGAACACACGTGT
-TGCCTAGCTACCAAATTCAAAAAACGAAAAACAAAAAAAACAGGTTTCTT
-TGAAATGAAAAATCGATAATCAGCAACGTGGCAAGATGTCTCAAATTATT
-GGAAAAAAAAAACGTTGAAATTCTCAGAAAACGGACCGTTCTGTGGCAGA
-ATTGTGAACGGCGTGCAAGGCCACGACCCGTGGAGAGCGCGTGAGAGTGC
-AGAAAAAAGGAGGCGAGAGAAAACGGCTGACCCGTGGATAGACTTTGTGG
-ATTCAGGAGACGCAGAGCGACCGTGAGAGACCCAGAAATATATGCAGAAA
-GTTAAGGCGTGCAATAGTGTTGGAAATTATAATAAATGGGTACGGTAGGT
-ATGACCTTTCGGGATCTTTGTGGGTCTCGCCGCGACGAGTTTTCAAGGTG
-CATAAGGTTTTTGCGATGGGTCTCGTCACATAATTGTAGATTAAAATTGT
-TGATTCGAGATAAATGGAAATTCGAAGCGTCTAAAACAGTTAGAACTTTT
-AGTTTACATTAGGTTGAGCTCAACTGTCCAACCCCGTCAAACTTTTTCCA
-CTTTTTTTTTACTTTTGCCTTTATGTCCTTTTCGGCCGTTTTCCTGGGGG
-TTTTTACCAGACTACGAAATATCCTAACTTGGTAAGCCTCAGCCTAAGCC
-GAAGCCTAAACCTTGGCTTTCAACTATACATACACATTTCCTCCTTTTTA
-AACGATATTAATTAATTTACAAAACACCAAAAAAATATACAAAAAATGAT
-TTGAATTTATGAGTTTCCCGCTAAATACCTACCGAGACCCAACTTTTGGC
-CGTGGAGCGCGCTTGCACTTAAACTTCAATTTTTCACATCCCCATAATAA
-CTTCCTTGTTTTAAATTGTTTTTCCCTATATTATTATTATCCTTATCACG
-AGATGCCCTTGCAAAACACATTGTAAAAATAGTATTCTCAACTGATAATA
-ATATTTTGTGTACCCCACGATAGTCCTTCTGGACCATAAAAATATTGATA
-ATTACTGATAAGCTTTCTCTGTGGTTTCTGTAGTTTTGGTGATATTTTGG
-GCAACAAATTTATATTATGGAAACACGGAATTCTGAAAATGCGTATTGCG
-CAACATATTTGACGCGCAAAATATCTCGTGGCGAAAACTACAGTAATTCT
-TTAAATGACTACTGTATCGCTTGTGTCGATTTACGGGCTTGATGTTGGAA
-ATTAATTTATTTTCGAATTGTGACAGCGATATTCAGTTTTCCTTTGTTTT
-TTTTTTTCGTATTATTTTGTTATTTTTATGCTTTCTTTTAATATTTTATC
-AATTAATGAATGATTTCCGTAAATCGACACAAGCACTACAGTAGTCATTT
-AAACAATTACTGTAGTTTTCGCTTCGAGATATTTTGCGCGTCAAATATGT
-TGTGTAATACGTAAAGAAAGTTTGAAATAATTGTTTTTAAATAATTTCTT
-ATTCATTCACTGTCAATTCTCACCGAAAAAAAAAATCCAAGTTCCTCCCG
-CCAACTTGGCACGATGCCAAAAGGTTCTCAGGCCCATTCATGTCATTCAA
-TCCATTCAAATGAACGACTTTTCGTTCAGTTTAGGCTTCTTCTTTTTCCG
-GTTTAGTACTTTTTCAAACCGAAAAAAAAAATCCCAAATTGAATGCAAAT
-GTGCTCTATTTGGAATAGACTTCACCCTATTTCGGAATTTTTTCCGATTT
-TCTGAAAATCTTTAACACTTTTCTAACTGTTGCATTAATGACATTTTTCT
-AGAAATTCTACTGCAAACGCGCTCAGTTGCGAAAGTTTTTGGGTCTCACA
-ACGATTTCGGAAGAAAAACGTTTTATTCGTTGCGAGACCCGGAAGAGCCC
-GGTGGAGCGCGTTTGCAATTTTTTTGGTTTGAAAATTTTGCGCAACGATG
-CTCCAAAATAACACCTCGCGAATTTTATCGTTTTTTTAAATTATGACTTT
-TCCGGTCCCAGAACGAATTACAAAAGCAATTTTTATGAAAAATCGTTACA
-AGACCACAAAAAAAAGCGCAATAGAGCGCGTTTGCACCTTTTTTTCTTGG
-AAAAGTCTCGTTTTTTTCTCGGTAAATTCACTGTGACATTGACCTTTCTC
-GAAAAACGAAAAGTGTAATGGAAAGTGAACAAAAGTGACAATAATCTGGT
-GAATTGCGTTTTGTTGTAATATTTTTGTATCTTCTTTTCTTTTTTTAATC
-TGCGAAAAATAGAAAAGTTTTGGAGAGAAAGTGATTTTCGACGAAATTTT
-CCTGATTTTGCTAAAATTGAACAAAAATTGTCATCATTTTCTGTGGGGTT
-TCTCAAATGTTTTCTTAAAATTTATGCGCCTTTAAATTTGGGGGATTACT
-GTAATGTTTGTATTTTTCAATTTTGTTTCGGGAACACAAAATTCTGAGAA
-TGCGTACTGCACAATATATTTGACGCGTAAAATATCTCGTAGCGAAAACT
-ACAATGGATTAAAATTTAATGAAATATCGTTATCACTATTCGAAAAGAAT
-TTCATTATGAAGCCCGTAAATCGACACAAACTCTACTGTAGTCATTTAAA
-GAATTACTGTAGTTTTCGTTACGAGATATTTTGCGCGTTGTCCCCGTAAT
-AGTTTAACTTTTACCACGTGGCCGCCAGAAGAAAAACTTCTGCTACCGGA
-TTTCATTTCCTCGGCCACAAACCCTTTTGACCCCCGAAAAAGTACATAAA
-AACAATTCCGGGGACTGGGTCTCCAATCTCTCGCCCCCACTCACTAACAA
-GGGGGACACCCTCAGAAACGAATGCCGTCTAACCGTCTGCACCCTCTCTC
-TCGTCGCTCCAAATTCTTGGATCAATGCCAACTAACACGCAGTGTCCCCC
-CTCCTCCTTCATCCACCCAAATGTTTCATCACTTCCCGGCCACCGCAGGC
-TTCTCTCTCTTTCTCTAAATCTCTCATAAACTACTGTCTCTCTCTCTCTG
-CTTCTTTTGCTCAATTGTTCTTCTTCATCACTACTATTTGCTCAATTTTC
-GTAAATATTTTATTTTAAAATATCCCTTTTTCCTCCCCCCGCCTCTCTGC
-TTCTCGCTTGACGCGCCACATACACTAAAAAAACCGGTTTTTTCTATCTC
-TCTCCGCCCGATCATTGAATAGATAGTGTGTGCTGTACATCAAATTTCCA
-TGGAAAAATCGCGCCGAAATTCCAGAAAATTCCACTTTTTCTAGAATTTT
-CAGCGATTTTTTTCGGTTTTTGAATTTAATACAAAGCGAAATTCCGTGAA
-AAATTAATTTTTCCTCAATTTTTGACGAATAAAAAATATTAGTATTGTTT
-TTTTTTCAAGAAAGTGTGATTTTTTCACAATTTTCTATGGTTTTTACGGA
-GAAAATCTTGAAATTCCACAGAAAAACTTGACAAGTCTTTGAAAATTAAT
-AAAATTTCACCGTATCTGCCGATCGTTGCAAGACACACTCCACAAAAGAA
-GTCGTGCGCCTTTAAACTGTGTACGGTAACTATATTGATTTAATTTTTTT
-TTTCGATTTTGCGTCTATTTTTCCAATTTTTCTCTGATTTCGAACGATTT
-TTTGCATTTTACCTCAAAAAAATTAATTTATTTAGATGATAAAGTGGAAA
-TTGCTGATTTTTTACAAAAAAACACTTAAAAAACGAGTTTTCTCATCAAT
-TTCAGTTGTTTCTGGCATGGCTCATTGTTTATCGACACCTGCTTGTTTTT
-CTCCTCCTCTCCCATCAATTTTATGAGTTTTTCTTCGAAATTTCTCCATT
-TTTCCCGTTCAAAAACCGCCAAAATTCGCTTTTTTTTTTCCAGAATTCGC
-CTACTATAGCACTACTAGATGTGTTAATTTGGAATTATTTTTCAAAAAGA
-AATGTATCCGGACGGGCTAACTGAAAATGAGAAGCTCAAAGTGAAGGAGC
-TGTGCACTATGGTCAATATATCCGATGAGGATGCGATTAAATTGTTAAAA
-GGTGGATAATTAAGCTGAAAAGTGGAAAAAAAAATGCATTTTTTACCTAA
-AATTTACCTAAAAATTGGACCAAAACGTCATAAAAATACTGAAAAGTCAG
-AAAATTGTCTAAAAAAACTAATTTTCGCTAAATAATTCCAGAAAACGACT
-GGGACATTGCAATTTCATCGCGAAGAGTGTCGAAACAAGAGGATAAAACA
-TTGGTTCCGGGCACTTCGAGAGGTAAATTTTTGAAAATTTTCAGAATCAA
-ACTGAAAAATAGATATATTGTGTGAAAAAATCCATTTTCGCCGTAAGAAA
-AGTGAATTTTGAGCGGTTTTTCAAATTTTAAACTGAAAAAAAAAATCAAT
-TTATCTGAAATTTTGCTCTTTTCGGCGGGTTTTTTCTCAAAATTTGATGA
-AAAAGTTCTAGAAAAACGACAAAAAAGCCTTTAAATGTACTTTTTTCTGC
-GATTTTTTATCTTAAATTTAAAATTTTGCGCGTCAAATCTGGTGTTTTGA
-CTCCGCCCACTAAATTTAAACTTTTCGTGAAAAAAAAATGTTTTTCTCCG
-ATTTTTAATTGTTAATTTAGGCAAAAAAATACAAAATTTGCCCAATTCAC
-CTATTTTTTCCAAAAAATCACAAACTTTGCGCGTAAAATCGGGTGTTTAT
-GCTCCGCCCACAAAAATTTCTTAGAATTCGATTTTCGGCGGATTTTTTCT
-CAAAATTTGATGAAAAATCTGAGAAAAACTACAAAAAATCTTTGAGCTTT
-ACTTTTTCTCTGCGATTTTTATCTAAAATTTGAAGTTTTGCGCGTCAAAT
-CTGGTGCCTTGGCTCCGCCCACAAAATTTGAAGTTTTCGTTTAAAAAAAT
-GTTTTCACCACTTTTTCGCCGCTTTTTCGCCTGAAAAATCCCAATTTTTT
-TGCAGAAGAAATCGATTTGGATCGATTATCGAGTCGTCTACGTGTTCACG
-GATTAGCCTTCTATCTTCCAGATTTTGGAGGTTTTCCTAATGAATTTCGA
-ACGTTTTTGGAGAAGGATTTGATAGAGACGCAGACACAGAAGAGACTGGA
-GGCGTCCAGTAAGTTGTTTTCTGGAAAAATTGAAAAAAAAATTGAATAAA
-AAAAATGATTTTTTTAATCGAAAAAAAAAGTTTTCAAAAATAAAATTGGA
-AAAGGTGAAAAAAATTGAACAATTAAAAAAGAGCGACAAATGAATAAAAA
-AAAACTTTTTTTTTTTCGAAAAAAAAGAAAACAAATGTTTTTTAATCGAA
-AAAATAAAAAACGAAAAAAAAAGGAAATTTTTTTTACAATTAGAAAAAAA
-AAATTAAAAATGTATTAAAAATTTTTTTTTTTGACATTTTCTTTCGCTTT
-TTAATAAGTTTTGACTAGCGGGCCCTGCGGGCCCGCCAGTTGCAGGGGGT
-GTAGGGCGAGTCCCCCAGTCGGGCGTAGGTTCTCGGCTTCGCCTCGAACC
-TGTCAGAGGATTCGCGACAATTGCAGTGAGTCAATGGGAGGAGGGGAGAC
-CCACTCATATTTTATAAAATCGAACATTTCTATTTGAATCCCGAGCACTC
-ACAAAAAAACGAAAAAGTTTGTCAGTTGGGGGAATCGAGCAAAAGAGCAA
-ATTATTCACAGCCATACGCACTAACCACTCGGCCATGCGGGAGAGACCTG
-TCACAGAAATGTAGGGAAGGAAAATTTCTGGGGGGGGGGGGGGGGGGGGG
-AGTTGTCTTTCGATTCCGTTTTATTCAATAATGACAATTTGGGGAAAGAC
-GTTTGAAAACCGTTTATCACTGATAAGTCAGCAGGAAAACAATTTTTTGA
-AATTTTTTTATAGCATTGTACTCATTATTTAATTCCCGAAAGAGAGCCGA
-AAAGTTGAAGGTGTTATCTTGTAAATTGGTTTATTTGAAGAAAAAACAAG
-TTTTGGCCTGAAAATTTTGAAAAAATAATATCTCTTGGCAGAGCATTGCT
-AATGCGACGAAACTCCAGCTTCCATTAGATAAAATCAAAAACTATGAATC
-AGAAATACATTCCGCAAAACTTTAGTGGAAAAAATGTTCAGGAGACCCAG
-GAAACCACTCCCCCCAGTACTAAATTTTTGAATTATTTTTTCTTGAAAAA
-TTTTCCCACTGAACTTTTTACAAATTTTATATGTCTCGATGCGTCTTGAT
-GAGACCTACACGTCAATTTTTGGAAAACTAAGAAAACTTGAAAACTGACC
-GAGTTATGATTGAAAAAGTAGATTAGCAAAGATGGGAAAGTGTGCAAAAT
-TTGGCACTTATTCGTCTTGCTCGGCCGACTCATAGTACTTTTTCCAATTC
-TGAGTTAAAAATCGTGTTCAGCGTACTTTTGTACGTGGGATAAAGAAAAA
-AAATATCAAAAAAGATGAAGTAGAACTTGAGATAAAGACGAAAAACTACT
-TTTTCGGAAAAAATTTTTTTTTGGCAAAATGGCATTTTTTGGCCTTTTGT
-TTTATCACAACTTTTTGCCTTTTGCACTTATGAACTCAAACTTTCTTTCA
-AAAAATCCACCTCTCTGAGTAGTATCTTGCACATAAATTTGGAACAAAAC
-CGAGCAAAACCCGAATTTTAATTCAATTAAAACATGGTTTTTTGGGGGTA
-AAAAAAGCAACAAAAAATTTTTTCAAACTGGGGAAAGCCGCCCTGAGCTC
-AGTTTTGCTCCAAACTTTGTGCAGTTTTTTGCTCCCCCGTGGGGTGAAAT
-ATTTCTAGTAAGCTGTCAAATATTACAAAATTCAGTCAAACGGCTCTGGA
-GTTATTAATGAAAACGCAGTGTGACATTTTTTCGCAAGCCAAAAAAAACG
-CGAAAAAACGCGAAAAAGGGGCGGAGTCTGTACACTCGGCATTTATTAGA
-GGCTGCTTGGCAGATTTTGAAATATCGGAAAAACTTTAAAAGTTCTTTTT
-TTTCCAGGACACCTAAACTGGTGGCATCAATTCGGCCAAAAACTCTACCC
-GCTATCAACTACTGGAGACGGAAATTGCCTTCTTCACGCCGCATCGTTAG
-GTAAATGGTTTTTCAGAGCGAAAAATCGGAAAATCGCTAAAAACTTACTA
-TTTCCACTGAAAAAATTGTAGAGATCGCTCAAAATTTCACTATTTTCTGA
-ACATTTTGATAAAAAACGACAAAACTATTTCAAAACGAGCCCCGAAAATT
-GTTTTTTTACTAAATTTTTTTTGGAGAAGTGCAAAAATTTAAATTTTTGA
-ATTAAATCTTTAAATCTTCAACAAAATTTAATCGTAAATTTTCAGGTATG
-TGGGGAGTACATGATCGTCAGCTATCACTTCGTGAAACTCTCTACGAACT
-TCTTACAAATGGCGCCAGAAAAGAAGCAATCCGACGGCGATGGAAATGGG
-TTGAGAATCATATGAATCAGGTAATTGGCGAGAGAAGAATCTGTGAAAAA
-TTTCTTAAAATTCGGTGAAAAATGATCAAAAATGAGCTGAAAACCGGTCA
-CGTAGTTGAAATCCGCGGAATATGAAATTCCCAGAGGAAACAATTTTCGT
-GGATTTCAACTTCGCGAATTTTTCTCAAAAAGCTTGAGTAAAAACTCACG
-GAGTTGAAATCCGCAGAATTCGAAATTCCCAGAGGAAACAATTTTCGTGG
-ATTTCAACTTCGCGAATTTTTCTCAAAAAGCTTGAGTAAAAACTCACGGA
-GTTGAAATCCGCGGAATTCGAAATTCCCAGAGAAAACAATTTTCGTAGAT
-TTCAACTTCGCGAATTTTTCTCAAAAAGCTTGAGTAAAAACTCACGGAGT
-TGAAATTCGCGGAATTCGAAATTCCCAGAGAAAACAATTTTCGTAGATTT
-CAACTTTTCTAGATTTTTTGCCAATTTTTTATTACATGTTACAAAAAAAC
-GGCTGTAAATACTCACGGAGTTGAAATCCGCGGAATTCGATTTTTGTAGA
-TTTCATCTTTTCCAGAATTTTCCAACAAAAAAAACCGGAAAAAATTATCC
-GACACTCCATGGAATCTAGTTTTCGGAGATTTCAACATCGAGAACTTTTT
-TCGCACATTTTTTTGCATTTTTAAAAAATTTCACCAATTTTCCAATTAAA
-ATTTTTTAAATTTCCAGAGTAACGGTCTCGCATTGACCCTCTCGGAAAAT
-GAATGCTTGAGTAAAAACTCACGGAGTTGAAATCCGCGGAATTTGAAATT
-CCCAGAGAAAACAATTTTCGTAGATTTCAACTTCGCGGAGTTTTCTGTCA
-ATTTTTTGAGATTTTTTCTCAAAAAGCTTGAGTAAATACTCACGTAGTTG
-AAATCCGCGGAATTCGAGATTCCAGGAAATTCGATTTTCGTAAATTTCAT
-CTTTCCCAGAATTTTCCAATTAAAAAAAAACGGAAAAAATTATCCGACAC
-TCCATGGAATTTAGTTTTCGGAGATTTCAACATCGAGAACTTTTCTCGTA
-GATTTTTTTGCATTTTTTAAAAATTTCACCAATTTTTCAATTAAAATTTT
-TTTAAAAAATTTTCAGAGTAACGGTCTCGCATTGACCCTGTCGGAAAATG
-AATGGGAACTCGAATGGGATGTTGTACTCGGATTATCATCTCCATTACCC
-CGTAAACAAGAGGATAATGGCTCAAATTCCACAGATCAAATCTACGAGAG
-TCTTGAGGCAATCCACGTGTTCGCGTTGGCTCATGTGCTCAAAAGACCAG
-TTGTGGTTGTATCGGATACGGTAGGGAATTTTAAAATTTTTTAATTCTTC
-AAAAATTTATTGAAGAGAACAGTAACAAAAAATTTGGTTACTTGTGAATT
-TTACAGAAATATAGAAAATTTTAATTTAAAAAAATTTCGAGATTGGTGAG
-AATCAAGGGTGTCAAGTCCCGTGTCCCGTTTGTCCCGTTGTCCCGTTTTT
-TGAGTGTTTTTACGGGAACGGGACGTCTTTTGTCCCGTTTTTGAGCGTTT
-TCACGGGAACGGGATGTCCCGTTGTCCCGTTTTTTGGGTGTTTTCGCGGG
-AACGGGACGTCCCGTTGTCCCGTTTTTAAAATTTTCACGGGAACGGGACA
-TCCCGTTGTCCCGTTTTTGTCATTTTTACGGAACATTGACACCCTTGGTG
-AGAATAAAAAATCAATAATACACATAATTTTTGGAAGAAAAATCGATTTT
-AAAAATGAAGCTTAACATTTTTTTTCGAAAGAAAAAAAGTGTAAGAAGTT
-TATCAAAAAAAAAAACATTGAAAAAAATATCTTCAAAAATGTTCAATTTT
-GTTTTAAGGTGCAACTATTACAAGAGCACACAATTCTTAGAATACGTATT
-GCGCAACCTATTTGACGCGCGAAAACTACAGTAATACTTTAATTGTCTAC
-TGTAGTGCTTGTGTCTCGATTTACGAGCTCGATTGATAGAATATTCAAAT
-AATTTATTTATCGATTTAATATTCAAATTAGGCAAAAAATGAGAAAAAAT
-ATACATGTGAAAAAATTAATTTTAAAAATAGAGCCCGTAAATCGACACAG
-TAGTCATTTAAAGGATTACTGTAGTTTTCGCTGCGAGATATTTTGCGCGT
-CAAATTTGTTGCTTAATACGCATTCTTAGAATTTTGTGTTCACATAATAC
-GGTTTTTCAAAAATTTTAAATCTTCATAAAATTCATCAATAATAACTAAA
-ACTTAATCAAAAAAAAATTTAATTTTAGTGTAGTCATCAGAAAAAGTCCA
-TCAAAAAAAGTCCATCAAAAAACCATCAAAAAAAGAAAATTGAAAAATTT
-GAATTAAAACATTTTTTTCGAATTTTTGAAAATAAAAGTGTTTGAATATT
-AAACGTAATTAAAAAAAAAGATTTTCCTTTTTTAGAAAAATCTATTCATA
-TTAGAACAGTCGATTTTATAAAAGTATCGATTTTTTTATTAATTGGATTT
-TTTGTAAAATAATAATCGATTTTGAAAATAAATTGCTTAAAATATTGTAT
-TTTTTGACAGAAAAAATGTAAAAAATTTATCAAAAATAAATAAAATTGCA
-AATAATTTTACCTACAAATTAATTGTTTATTAAATAAAGTTTAAATAAAT
-TAGAACAGGAGTAAAACGAGTTTTCAAAATTATTCTTTAAAATCTCGGGT
-TCTTTTAATTCAAAAATTCTTTTAAAAAAAACTCAATAATTACGGATTTT
-TCAAAAATTCGAAAAATTCAGAAATTCAGAATTTGGATAACATAATTCTA
-GTTGACTTCCAAAAAAATGATATGTGACTTACTTAAGGTACAACTAACAT
-TAATTTTCCAAAATTCTTATGGCTGCTTTAAAACACGCCAATGGGGTCAT
-AATGACCGAATATTATGTTTAAAAAAATCAAAAAAAATTTTCTGATTTTA
-TATGATTTTTTGAAAATTGGAAAAATCACAGTTTTAACCTAATTATTTTT
-GAATTTCTGCCAATTGGATTTGTTCGGTGCAGCGCGCTTGCATTATTTTT
-ATTTATTTATTTTATTTATTCTCGTTATTTCACTGATTTTCTTCATTTTC
-TATGTTTTTTTTTCTCGGAAAATGAAAGAAATAAACAAGACAAATGCGAA
-ATGTTTGTTAAAAAGTAATTGAAAATGCGTAAAACTGTGATATTCTGAGT
-TCCGACGACGAAGAGCCTGAAATTAGTATATTTTTCAGTTTCACTCATTT
-TCAATTACTTTTAAACAAACATTTCGCATTTTTCTTGTTTATTTCTTCCA
-TTTTCTGAAGAAAAAACATAGAAAATGAAGAAAATCAGTGAAATAACGAG
-AAAAATATATATAATTCATTAAATAAAAATAATGCAAGCGCGCTCCACCG
-AACAAATCCAATTGGCAGAAATTCAAAAATAATTAGGTGAAAACTGTGAT
-TTTTCCAATTTTCAAAAAATCATATAAAATCTAGAAAATTTTTTTGAATT
-TTTTTATCATAATATTCGGTTATTGTGGCCCCATGGGCGTGTTTTAAAAC
-AATTTCCCCACTGAGCGTAGTCCACCTTTGAAATGTTCTCAAAAAATGAA
-AAAAAAACGAGTTATAAAAATTATTTTTTAAAAATCCAATATTTTAAATT
-AATTTTTTTTTGCAGATTCTGCGAAACGCGAAAGGCGAAGAACTGTCTCC
-AGTGGCTTTTGGTGGAATATATCTTCCATTAGAATGCCCACCATCACAAT
-GTCATCGTTCACCACTTGTTTTATGCTATGATTCTGCTCATTTCTCACCA
-CTTGTACTCATGAGAACAGAGACTAACAATAAACGTAAGCAATTTTTTTT
-TTGAGAAAAAATATTTTCAAAATCATTTTTTAACTGAATTTTCAAATTTC
-CCCCCCCCGTCCCCCCCATTTTTTTCGAAAAGTGAATTGGAATTTTCCTG
-AAATTTGCACAAATTTTTTTTTGAAAATTCAAATGTTCGTCAAATAATTA
-TTTTATTCGAAAAATCGACATTTTTCCAAATTGTAATATTTTTATTCTAA
-AAATCCAAAATTTGATTTGGTAAAATTTCTGTCAACAATCAATTAAAAAT
-CCAAAATTTTCAAAAAAATTGTGATTTTATTCGGGAAATTCGAAATTTCC
-TATTTAAAATTGGATAAATCTAAAAGTTTTCGATTTTATAATTTTTAGGA
-AAACAAGTTTTCAAATTTTTTTAATTATTAAAGTTTTTTTTTGCAATTTC
-ACTAAATGAGCCAAATTTTAAAAGTGGAGCACCGAAATTTGAGACTTTGC
-TTTTTTAGACTCAAATTGGTCCAAAACTACCGAATTTTGTAATGATACAT
-TCTGAAAATTTCTCAAAAAAAAGTTATGGCTGTTTAAAGTTCGGCAAAAT
-AAGGCCCATTTTCAGCTAAAATCAAAATTTTTTCCAACTTCTAGGTGTCG
-CAACGTCTGGACCCTAATTTTTATTTATTCATCACTTTTTAATAAATATT
-GTGGCCTTTGATTGGGCGTTTAATCGTTGTTTTAAGTACATTTATGATCT
-TTGGAGTACAAATAAACGTTACATTTTGTACCCCAAAGACCATAAATGTA
-TTTAAATCAACGATTAAACGCCCAATCAAAGACCACAATATTTATTAAAA
-AGTGTTGAATAAATAAAAATTAGGTTCCAGACGTTGCGACACCTAGAAGT
-TGGAAAAAATTTTGATTTTAGCTGAAAATGGGCCTTATTTTGCCGAACTT
-TGAACAGCCATAACTTTTTTTTGAAAAATTTTCAGAACGTTTCATTACGA
-AATTCGGTAGTTTTGGGCCAGTTGGGTCTAAAACAGCAAAGTCTCAAATT
-TCGGTACTCCACCTTTAAAGAATTCATATAATTTTCTAAAACAACATATT
-CTGATTTACAGAAATACATTTAATATCAATATGAATTATTTGAAAAATCA
-AAAAATTTATATTTATTTTCAGAAATAATTCCGATAATCGATGTGAACCG
-TAACCTGCTGCCTGTCCATTTTGCAGTTGATCCAGGAGAGTCATTCGATT
-GGTCCAAATTAGAAACAAATAGTAATACACAGACAACTACTGATATGTCA
-CAAATTGATAAGCTTGCGTTGATTAGTCAATATATGGATATTATTAGGTA
-AGAAAATGAGAAAAAGGATTTTTTCAATTTTTTTTTCTAAAAAAAATATT
-CAAAATATCGTTAAAAAGCCAAAAATGTGTACGTTTTAATTTAAAAAATA
-TTAAAATTTTTTTGTCCCAAAATTAAAATATCGAAATCAAAATGTTTCCG
-ACATTTATATAGAAATTCTGGAAATTTTTTTAAAATCGAAATCATATTTT
-GAATGAAACTACAGAAAACAGCGCCAAAAAAGAAAAAAAATCGTTTTTTT
-TTTTCGAATCTTTCATTACAAATATTTGAAAAAACGATACAATTATGTTT
-CGCGAAAATTTTTTAAAAAAACTTTAAAAAATTATTAAAATCAGCTATTT
-AATCACAAATGAGAAATATATCGGAAATCTGGAAAAAATTAAAAAAATTT
-TTTGCGTATTTGTCTGAATTTATTTTACAAATACCAAAAAAAAATCAATT
-ATTGTTGGAAAAAATTGAAATACAACGGAAATCGAATTATTTTTATTTAA
-AAAGAACGAAAAAAAATCCAGAAACCATCACAAAATTATTGGAAAACGAG
-AAAGCTGATTTTTCGCTAAAGTTCAAAAAAATTTACAAAAAAAGAAAAGT
-ATTAAAATCGGTAATTTTCCCAGCTTGAAAAACTGAAAAATTCGAGTTTT
-CTAAAAAAAATTAAAAAAAAAAATCAAAATATTCCTCAATTTTGGAAAAT
-TACGGAAAAAGTAGTTTTCTTTAGCTTTCGGCCAAAATTTTATCATAAAA
-ATTTCCGGAATGCATAGTTTTAGAGAATAATTTTAAATTGAAACACTAAA
-TTTTTTAAAAAACTTTTTTTTTTGAAAATCCCGGATTTAAAAAAAAATAA
-AATTTGAATTTCATATAAATATTTTGTTAGGAAAAATAGTTTCTAAACAA
-AAATTTGAAAAAAAAAATATTTTTTTTTTCATATTCTTTGAATAAAAAAA
-ATCTGAATTTCGAAACATTTCAGATTAGACGTTCGTCGTGGCTCAATCCG
-TAGCTCGCGGAGAGTTCGAAGTGCTCACGCGCAACTTCTCACCGAATCTC
-GTGGTGAAAATGGGCAAAATTTGCCCCAAAAATCAATTAAACCAAGAGAT
-TTAAGTGCACATTCTAGTGATGAACAACCATCAAATAATGCAAAAGGAAT
-GACATTAGCATCAAGTGGAATTGGTTCTGGAAGACATGAGAAATGGAGAT
-TAATCAATGAAATTCGGTAAGCATTTTTTTTTTGGATTTTTGGCCTGGAA
-AAAATTTTTCCAACAAAAACTTGAACAGAATTTTTGAAAAAAATGTTGGA
-AAATTAAAAAAAAATTTTTTAAAGTAATCAATTTTAATTTTAAAAATTAG
-AAACTTTTCAAATAAAACATTTTTATTTTTTCAAAAATTTTGAATTTCAT
-TTTCAGAATAATCATTAATGAAAATTCAAAAAATTCAAACTACAATACTA
-CGATAACAAAAAAAAATCAGAATGCGTACTACGCAACATATTTGACGCGC
-AAAATATCTCGTAGCGAAAACTACAGTAATCCTTTAAATGACTACTGTGT
-CGATTTACGGGCCTTGTTCTATTTTTGAAATTAATTCATTTTCGAATAGT
-GACAGCCATATTACATTTTTCTTCGCTTTTTTGTATTATTTTCTCTTTTT
-TTTTGCCTAATTTGAACATTCTATCAATCGAGCCCGTAAATCGACACAAG
-CGCTATAGTAGTCATTTAATGAATTACTGTAGTTTTCGCTACGAGATATT
-TTGCGCGTCAAGTATGTTGCGTAGTACGCATTCTCAAAATTTTGTGTTCC
-CGTAATATGGTAGTTTGAATTTTTTTAATTTTCATTAATGATTATTCTGA
-AAATGAAATTCTAAAGTTTTGAATAAATAAAAATGTTAAAAAATTTTTAT
-TTGAAAAGTTCCTCATTTTTTCAAATTAAAATGGATTACTTTTAATTTCC
-AAAATTTGTTTACAAAAAATTCGTTTAAAAAAAAATTAAACTGTTAAATG
-TTAAACTTTTCAAAAAAAAAGTTCAAAATTTTTCTGTAAATTTTTAAAAT
-GATACATGTAATTTAGATTATAATTTAAAAAAAAGACAAACATTTTTTGA
-CGAAAAATATTAAAATTTTGTTAAAAAATGAAAGTTTTTAAAGCCTAAGC
-CTTAGCCTCAGCCTAAGCCCAAGCCAAAGCCCAAGCCTAAGCCTAAGTTT
-GGTACTGCAGTATTTAAAAAAAAAGTTTTTCCCCAAATTTCTTCTGTTTT
-CTTAAAATTCAAAACTGTTATTTGCAAAAAAAAATGTTTTTGCAAAATTT
-GAAATTTATTGAACTGAAAAAAATGTGAATTTTTTAATTGCCTTTGTCGC
-AGCGGCTGGAAACAATTTTTTTTTTGAAATCAATTTTAAGAATAAAAATT
-GATTATCTTGCGTTTTAAACTTGATTAGGGTATTTAAAAATCGATGGACG
-GCGAGTTTTGGTTCAAAAAAATTAAAAATCTCGCCGTCCATCGATTTTTA
-AATACCCTAATCAAGTTTAAAACGCAAAGTAATTAACTTGTATACTCGAA
-ATTTGACGATGATTTCAAAAAAAAATTGTTTCCAGCCGCTGCGACATTGA
-TAAGTTGGTCAAATTTCCGATTTTAACTAATTTTAGGCCATTTTTTGAGC
-CGTCATAACTTTTTTCTGAAAAGTTTTCAAGAAGTTTCATTATAAAATTC
-GGTGTTTTCAGACAATTTTGAGTCTAAGAAGCCAATAAAAAATTCGACTA
-CACCACCTTTAAAGCTCAAAATAACGTCCAAAAATTCAATTTCCAGAACC
-CACGTGCTTCGAACTTTTCGTATTTCCTCATCAACACGTGGCAAAGAGAA
-ACTAATCGATACGGACGATTGTATTGCAAGAATGAATTCGACGTGCGTTC
-TCGCATCGGAATTATTGCCAACTCATCACCAATACATGGACAAAATAATC
-AATGAATACATGAAAAGTGCGAAACAACGATTCCAACAGAATCAGCGAAC
-ACAATCGGATAGTCGGAAACGGATTAGTCGAAGTTTCAGTGCAAGCTCAC
-TTATGCTCACGTGTATCGGTTGTGATTCGGTACGAGACCCACTTTTTGAT
-GGAATTTCGAGAAAAAAGTTGAAAAAACGGAGAATTTGGCACAAGTAGCC
-TCAATATTTGAAAAAAAAAACCGAAAAAATGGATGAGGGGAAGCCAAAAT
-ACCAGAATTTACACCCAATTTTCAAAGTTTTATTGATTTTTTACAAAAAT
-TTTCTCAGTTTTTCAGTAAATTTGCCAGATCTGACCATTTTTTAGGAAAA
-CTGAAAATTTTCGGTGTTTTGCCAGAATAGCAACTTCCTGAAAATTTAGA
-ACTAATTAATTTTTAATTTTTTGGGGGAATCATTTATTTCCTAACAGAAT
-TTGATTTGAATTTCGAAAAAAACCGATTCTAAGCTTAAAAATTGACAAAA
-ATAGCAATGAATGTCAAAAAAATTGCTAATACATAAAAATTGTTTGAAAA
-AATACAAAAATAACAATTTTTATTTAAACTTTAAAAATTTTTCAAATTTT
-AAAAATTGAAAAAATTAAAAAATTTTTAAATTAAAATTAAAACATTTTTT
-GTTAAAATTTGAAAAAAATTCAAAAAAAAAATTTACATTAAATTTTTTTT
-TTCAGGAATTCAAGCCGGCATCTCAAGTGACAAATATCATGTGTGATCAA
-TGTTTTGCTTGGCAAAAAATGAGTGTTCTCACGTCGAATTGCGACCAATT
-TATGGGAAATTCTGGGCCACCGTGCAAAAGTTCAACACTTCCGTCATTTG
-GTAGTAATGATAGTAATCAGAATGATAAGGAAAATATTGTGGAGGTACTT
-AATGTGGTGCCTAAAGATGGAGCCAAGACACTTACCAGGTATGGTTGAAA
-TTTTGAAAAAATTAGAATTTTCAACGAAAACAGAAATTATTTTAAAAATT
-TATTTTTAATTGAAAAATAAAAATTTCTCCCAAAAAATTTTCCCAAAAAA
-AGTGTTTATGTTATTTTTGAAAATTATAATTGAATTGATTTTAAAAATTA
-CGAGAACACAAAATTTGGAGAATGCGTATTGCGCTACATATTTGACGCGC
-AAAATATCTCGTAGCGAAAACTACAGAAATTCTTTAAATGGCTACTGTAG
-CGCGCTAGTGTCGATTTACGGGCTCTATTAACGAAATGAATTAAAATCAT
-TTAGTTATCGAATAATACAAAAATCATTTCATTTCGAAAATCAAGCTCGT
-AAATCGACACAAAAGCTACAGTAGTCCTTTAAAGGATTACTGTAGTTTTC
-GATCCGAGATATTTTGCGCGTAAAATATGTTGCGCAATACGCATTCTTTG
-AATTTTGGCTTCTCGTAATATACGAAGGTTGAAAATTTCAGATTTTTAAC
-ACAAAAACTTATGAAAATAAAATTTATGAAAAGTATAAAAAGTTGAGAAA
-ACAGAAATTTTAATTTTTGCGAAATCTAGATGTCAATTTCTTCACAAAAT
-TTTTCAAAAATCGATTTTTCTTTCGAAAATTTTTTTTTGTAATTATTTTA
-AATCAAAATTTGGCGATTTTCAAAATGTTTATTTTATATTTAATTTCTAA
-AATTAATTATTTTGATTAAAAAATATATAAATTCAATTTTCAGATTGTAA
-AATGAATTTTTTTGAGTTTGCCGTTGAAAAATAGAAAACAAATTATTTTT
-AATAACTGAAATAACTGAAAATGTTGTTTGAAAAATTACATTTTTCCAAA
-AAATCGAACATTTTTGACGCGCAAAAAAATTTGTAAAAAAAAATTTTCAA
-CAGAAAAAACTGTAAAATAGGAAAAAAATTTACCTAAAAAGCGTATGTGC
-CTTTAAAATGTACAGTAACCCCAAAAAAATCGATTTTTTGCAGTATGCGA
-GCTGTGGAGGACGAAAACGGTGTGGTTCACTATTATATGGACGATGAAGT
-AGCGGATTCGTGATTCTATTATACTCATTTCTTTTTTTGAAAATATATTT
-ACTAGAGACCAGTTTTCATTTGATTTTTATCGATTTTTTTTGGATTCCAA
-ATTTTTGTTTTTTTTTTGTTGCTTTTTGTGTGTTTTTTGCCGTCTATCCT
-TCTTTCCTGCCAACGGGATTTTCTCTTCTTTTTTTTTTTTGAAAAACTCA
-ATTTTCCCGCCTAGTATTGCTTTTTTCGAGATTTTTTCTTCCATTTTTCA
-TATCCGCGCCAGCTTTTTCTCTCCCCTCCTTTTTTCACCCATATTTTCGA
-GCTTTTTTCTGTGATTTTTTTTTCACCCCCAAAATTTTTTGTACCAAAAA
-ATTGATGCTTCTTTTTTTTCTCTTTATTTCCAACAAAATGCTTGGCCAAA
-GAAATAAACTCTTTTATAATTTATCATTCAAAAAATTTGAGACCAAATTG
-AAATCCACATCCAGCAACTGCAAAGTGTCATTTGACAATGCACAAATCGC
-ATGGCACGCCCCGTTTTCGTCGATCACCCGGGAACGCGTATTCTGGGACC
-AAATGAGGAGGCGGTGGCGATCGGAGAAAATGAAGTATGGACCACATCTG
-GAAGACACACCTGATTTTACGCGCAAAAATTTAGAAATGTATCGATTTTT
-CGGTCAAAAATCAATATTTATCGATTTTCGGAGGGCACATGGGCTTCTGG
-CCTTCCTCATTGAATATTCGCGCTCCATTTACACTCGCCTGCCGGACAAC
-GCGTGGAAAAGTGTGGTGTACTCCACACGGACAAATACATCAGTTTTACA
-ACTAAAATCGAGCCGTGACGCGACACGCAACGCGCCGTAAATCTACACAA
-AATCTCTCCGACCCAAAATGGCCTAGTTCGGCAAACTCTGCCATTTCGAT
-TTATGAGGGAAGCCAGAAATCCGTGAGGGCAAAGATTGAACAATCTGAGT
-TAAATCGTTTCCATACAAAATTTTTTGAAAATTTTATTCTGAAACTGTCT
-AAAACTCGAAAAGTTATCAATTTTCTGGTTAATTTCTGAGGAAATTCAAA
-AATTGATATTTTCGAAAAAAAAAATCGGAGCCAATACACATCATTTGACG
-CGCAAATGTTGAATTTTCAAATTTACGAGAACCCACGGGATTCTGGCTTC
-CCTCATAAATCGAAATGGCAGAGTTTGCCGAACTAGGCCATTTTGTGTCG
-GAGAGATTTTGTGTAGATTTACGGCGCGTTGTGTGTCACGTCGCGGCTCG
-TTTTCAGTTGTAAAATTGATGTATTTGCCCGTGTGGAGTACACGGCACTT
-TTCCACGCGTTGTCCGGCATTTGTCAATGGAGCGCGAAAATTCAATGAGA
-AAGGCCAGAACCCCGTGAGAATCCTAAAATTCTGAGAATGCGTATTGTGC
-ATCATATCTGACGCGCAAAATATCTCAAAGCGAAAACTAGAGTAATTCAA
-TAAATCACTACTGTAGTGCTTGTGTCGATTTACGGGCTTTCGAAGAAGTT
-ACTTTTTTAGTTTCTTCGTATTATTTTTTTTCATTTTTTGTCTAATTTTA
-ATATTCTATCGATAAATGAATGGGTTTTTATTTATTTTTATTATCGAGCC
-CGTAAATCGACACCAGTGCTACAGTAGTTTTCACTACGAGATATTTTGCG
-CAATATATTTATAAAAGTTGACTAGCGGGCCCTGCGGGCCCGCCAGTTGT
-AGGGGTGTAAGGCGAGTCCCCTTGCCGGGCGTAGGTTCTCGACTTCGCCT
-CGAACCTGTTAGAGGGTTTGTGAAAATTTCAGTAGGTCAATGGGAGTCTT
-CTTGTTTTTTGAGTTCGGTTTGACCAAAAACAGATGCACCCGATGAATCA
-GTTAAAGCTGAGTTTTGATTGATTGAAGTTTGAGGAGGCTTTATATTAGG
-GGAGACGTACCCATATTTTGTATAAAATTGAGTATTTCTATTCGAATCCC
-GATTACTCACAAAAAAACAAAAAAAATTGACACTTGGTAGAATTGAACCA
-ACTACCAAAATTTCTGCAGTCATACGCACTAACCACACGGCCATGCGGGA
-GACACCTCAAACTGGGATGTAGGGAAGAAAATTTTCTGGAGGAAGTCGTC
-TTTCGATTCCGCTTTCTTCAATTATTACTATTTGGGGAAGACGTTCGAAA
-ACCGTTTATCACTGATAAGTCAGCGGAAAACCTAATTTTTGAAAATTTTA
-TCACAGGATTGTACTCATTATTGAATTCCCGAAAAGGAGACGTACAGTTG
-AGGGTTATATCTTGTACACAGACAGATGTATAGAATAAAACAAGTTTTGG
-CCTGAAAATTAAAAAAAATAATATCTCTTGGCAGAGCATTGCTAACGCGA
-CGAAACTTCATCTTCCATTAAATAAAATCAAAAACTATGAATTAAAAATA
-CATTCCGCGAAACTTTAGTGGAAAAAATGTTCAGGGGACCCAGGAAACCA
-CTCCCCCCAGTAAAAAATTTTTGAATTATTTTTTTCTTGAAAAATTTTCC
-CACTGAACTTTTTACAAATTTTATATGTCTCGATGCGTCTTGATGAGACC
-TACACGTCATTTTTTAGAAAACTAAGAAAACTTGAAAACTGACCGAGTTA
-TGATTGAAAAAGTAGATTAGCAAAGATGGGAAAGTGTGCAAAATTTGGCA
-CTTATTCGTCTTGCTCGGCCGACTCATAGTACTTTTTCCAATTCTGAGTT
-AAAAATCGTGTTCAGCGTACTTTTGTACGTGGGATAAAGAAAAAAAATAT
-CAAAAAAGATGAAGTAGAACTTGAGATAAAGACGAAAAACTACTTTTTCG
-GAAAAAAAAATTTTTTGGCAAAATGTCATTTTTTGGCCTTTTGTTTTATC
-ACAACTTTTTTCCATTTGCACTTATGAACTCAAACTTTTTTTCAAAAAAT
-CAGTCTCTCTGAGTAGTATCTTGCACATGAGTTTGAAACAAAACAGAGCA
-AAACCCAAATTTTAATTCAATTAAAACATGCTTTTTTGGGGGTAAAAAGA
-GCAACAAAAAATTTTTTCAAACTGGGGAAAGCCGTCCTGGGCTCAATTTT
-GCTCCGAACTTAGTGCCGTTTTCTGCTCCACTGTGGGGCAAAATATTTCT
-AGTAGGATTTCAAATATTAGAGCATGAAGTCACACGGTTCAGGAGTTGTG
-AATGAAAACGAAGTGGGACATTTTTTCGCAAGCCAAAAAAAACGCGAAAA
-AACGCGAAAAAGGGGCGGAGTCTGTACACTCGGCATTTATTAGAGGCTGC
-TTGGCAGAAAATTATCAATTATGTATATGTATAAGAATTATATTCGAATT
-TCACGCGTAAGTTCCAAATTTAGCAGCATAGCCGCCTGAAGTTCGAAATT
-TAAAATAAAAAAACCGAAAAGTACCTGACAGCCAACGTGGCAACAAATGG
-AATCTCATCGACAAGTCCTTCAGAATTGAATACTGCAGCATTTGACGTAT
-GATAAATGACTGCCACGAATTGATTTTCAAATAATATTTTATTGATTGAC
-GTGGCAGTTTGGTGGCTGAGCGGTTTGTAGTCCAATGTTGGTAGAGTTAA
-TAGGTAAAGACCACCCGTCTCGGTTGCCACACACGCTTCTTCGCCGCTTC
-TGGAAAATTTGGTTTTGAATTTCTAGGCCATTGGGTTAGGCTTCGTTTTT
-GAAATGGGTTAGAAATGTAGAAAATGGAAATTCTAGGCCATCAATTTTCC
-TTTTGCATGTGTGTAGGAAATTGGCTAACATTCTAGAAAATCGATAATTT
-TATAGAAAGTGAAATTTTCGCAAAATCAATAATTCGATAAAAATCGATAA
-ACTTTGATAGAATTTTGTTCATCAAAAACCGATAATGTCCGAAAAATTTC
-AGAAAATTAGATTTTTTTAACAGTCCGTTCATTTCGTGGCCTAGAAACTT
-ATTTCTAGGCCATGGAAGAGTTTTTCCAAGATTCACGGCCACACGTACAC
-TTGCATGCTAACAATTGCGACAGGCTTATTAGAAGTCGAAGATCTTCGAA
-TTTTTCGCGACAGATCCGACACTGTGAGCTTTGTCCCGCCGAGTTTTTCG
-AGTCCTGATGTTCCGATTTGCCATAAAATTATATTACCATCGTCGGAGCC
-TGATAAGAGCCCGTGACGACACATTTCTAGGCAAGTTACTGCTCCGTCGG
-TTATCTGGAATAGAGAACATTTGGAACTTGTCGATTTTCAGAAACATTTT
-ACTGTACTTTTTTATGGGCAAAACATTGTTTTTTTTAATTAAACAAAACT
-ACTGATAATTGTAAAAAGATCAATTTTTTAGTGTTTGAAGATCATTTTTG
-AGTTCTCTAGCTACAAAATAAACAATTTTAGAGGAGTTGCAAAATTGTGA
-ATTTTAAAAATAAATTGCACAATTTTGCCACTTTTTAATGGTTTTTGATG
-GATTAAACCTAGATTTTCTGAATTCAGCATACATGAATTACCGCTTTTTG
-ACAAAATTAGACAACTTTTTATTTTTGTCCAATTTTTTTCAGCCATCTAA
-TGACTGTCCTTTTTTTTGGGCAAAAAAATAAATTTCCTAAAAGCGTTCGA
-AACTACTATATTTTGAAATATTTTGAAATAGGACATTTTTTTAGGGCTCG
-GAGATCAATTTTAAGTTCTCTAGCTACAAAATGCGGAAAAAAATGTAAAA
-AAGTTTGGTACTTGTGTATTATACCCCCGCCATTTTAAAAATTAATAAAA
-TTTCCATCAATTTATTTATTTAAATTAAACGTGATACCATTTTTCCTTGT
-TAGGCTTAGGAATGGTTTTTTCCTAAGCCTGAAATTCCACACGTTTTTAT
-TTAATGAGTTAAAAAATTAACTTTTAAAATGGCGGGGGTGTAATACACAA
-GTACCAAAAGTTTCTAGGCCCCATTTGCTGGGCCACAATTTATAGGCTAC
-AGTTTCTAGGACACATTTTCCTGGGAACATTTTCTAGGCCACATTTTTTA
-GGCCACATTTTCTTAGCCAAAAATGTACTCACAAACTTAGCAACGTGGCA
-ACAATTTCAAAAAAAACCTCATACCTTCTTCTCGAAAATTATTTTATCTT
-TCGAACACATTGAGATATTTCCAGAAACGTCGCCGAGAATAAATTGGGTC
-GATGAGTAGAAAACTGCAGAAATTGCACAAACCGGTAGAGGAATCGAGAA
-GCTCTGAAATTATTCTTCATTAATTTTTTCATGCAATTTTAATCTCGGAC
-CAATCAGCGTTTTGCCACGTCTTTTTTTTTTCGAACCAATCAGAGGAGTG
-GGCGTGGCTAGATGCTGATTGGTCAGTTTCAAATTTTTTACAAAATATGA
-CCTACCGTAGAAGAAGAGCACAAAAGTGCTCTCGCCTGATGGGAACAGAA
-AGTTTCATGAGAGATACCGCCGAACAGAATTAACGTTTTTCGTGAAGAGC
-TTGAAATCATTAGAATGATATTTTCATTTCGGGTCTGAAATAATTCAATT
-TTAAAGGTACACGCCACCACCGTATCCTACTTCCACATGGTACTTCTGCA
-CAGTTTCCAGCGCAACTTTATCGAATTTGTGAAATTCCAAAAGCCTGTCG
-TAGTTCACCTTAGAATCGTCACGCACGAAATCGTAAAGGAGGTTCAGAAC
-CTAAAAGTTTGAAAAATATGTCCTAGGAAATCAAACTGTGAATTTCTAGG
-CCACATGATGGAAATTCGTATGAAAATTGCGACGAGCCCTAACATGTGGC
-CTATTAATTGTGGCCTAGAATCTGCTGCCTACAAGTTGTGGCCTAGAAAA
-AATGTTTCCTAGAAATTGTGACCATGGCCTAGAAATTTTGGCCTAAAACA
-TCCGACATAGAAATTGTATGGCCTAGAAAGTGTGGGGGCAAAAGTTTTTA
-ATTTTCAATTCGGTTTTTTTTTTCACAAAATGGAGAATTTTTTGATTTTT
-ATGTCTGAAATTGAATGGGAAACGTGGAAATATTGCTAATAACCAACCTC
-TTTGCTAATTGTAATATCCTTTTTCACATTCTCGCCGACACCATTATCCA
-CAGAATCCGTCTGAACTTCTTTATTTTCTTGAAAATTTGCCACGCATTCC
-ACGTCTTTTTTATTTGTCTCTATCGTCTGCGTCTCCGACGTCTTATACAC
-TATTTCTCCCTGAAGGCGGATAGGTTTTCTCCACGTGAACTGGAATAGTG
-TGACGTCTTCCATTATTAGCTGAAAATTTGAGTTAAAACTGCTCTATCAC
-ACTAAACACGACGACACTCGTGGCCGCGGAAATTAGAAAACTCGGCCACG
-TAACTTGGTTAAATTAATGAAAATATTATAAAAAACTTTCGAAAATTTGA
-AACATTTTAACTTTTTTTAAAAAAAAACACATGCAAATGTTCCTAAACTG
-GCTAAATAAACAACGCACATCCCCGGCGGAGCTCTGGTTTTCCATGGCAA
-CCGAGAATGCGTGCGGGCCAACGGGGAGAATGTGGAGTACGTAGAGACGC
-AGACAGTTGTATAAAAGGGGCGGCAACTTGAAAAAATAAATTTCTAGAGA
-TTAATCCGTGCAAAGTTGTTTTTAATTACCGATGACCGAGTATGTGATTT
-TTCTAGGCCACGGAACCAAATTACGGCGGAGTTCCGTTGAAAATATCGCT
-TAATTGTTTTGTTTTTTCTACCAAATTAACTGACTGAAAATCCAGTTTTT
-TTTTTCTGAAATTAGGTTCTTTCAAAAATCACCTGAGTGTTCCTTGATTT
-GTTTTCGTAACTTTTTTCTCTCCAACTATTACACTACGGGTGTTTTGACA
-ACACAATGGAAAACATGTCTGTTCAGTTTAAAGACTGACAAGAGTCTCGT
-AGTCTCTCGCGGACTAGCTTACGGCCCTTGTGGTCTAGAATATTGAAAAA
-CTTAGTTTCAGTATTGTGGCCGCGAAATTTGAAAACTCGGCCATCGATTT
-TTTTTCCCACACCATGGGGCAATATTCACTAGACCATTCATTGTAACAAA
-TATTTCAAAACTAAGAATTAAAAAAACTCCTACGCAATTTCCCCAGTCAC
-TTGGCGGCTCTCACGCTCCCTATTTCAGATGTTAACCTCATTTGAATAAA
-TTGCTTCTCCCATGTGTTTTTGGATGGGATACTCCATCTTTTTCAACCAA
-TTTTTTCTCCTTACTTTTGTTTTTAACGGCTTTTTTTCATATTTCTGATT
-GAGAATAGGTCAAGTGATGACGTAATAGAGCGCGTGGAAGAGGAGTGACG
-TCACACGTGGCCTAGGAATCTCTGCGACCACCACATGAAAAACGTTTTAT
-TTTCTAGGCATCCCTACCTACCCGTGTTTTGTCTCTATTTTGACAATTTT
-TTGCAAGTAAATTCCCGGCTGAAACAAGGTCACCGCAACACAAAATAGGT
-GAAGGGATGATCTCTTTTTTTCCAGAGTCAGTCAACATACATAAATTATG
-TGTGTCTCTTCCATTTTCCTGTCGTCAATTTGTTCACTATTCGCTTCACT
-AATTCCTGCTTTGCATTTTAATGTCCGTGCCCTCTCACTGGAACTGACAT
-TTCACACAATGTTTTTTTCGGTGGAAAAAAGTTTTCTAGATTTTGATATT
-TGCTGGAAATTTGGAAAATTTAGCGACTTGACCGTGCAAAAATTTTGGTG
-GCCGAGTTTTCTCTTTGCGCGGCCACGTTGTAATAGTTGCCAGGTGTCGC
-AAGTTTTTAAAATGACCGAGTTTTCTCTATTCACGACCAGATCTCTCATT
-ATAGCCGACTTCCGACTTGCGTAAAAGTGCGACGTGGCCGAGAAAAATTT
-CAGTGGCCGAGTTTTCACGCGAAATCACATTTTTTTAGTTTTTTGGTACG
-TGGCCTAGTTTTTTAAAACCATTGTTTATCTCCACCCAATCTAAAAAAAT
-TTCTGCGGATTTTTAAACCATGGCCGTAAAAAAAAGCCACTCTCATATAT
-TTTTTCGACACCTTTCGGTTTTAGAAATATATTTTTAAAAATAAAATAAA
-TGGCTTTGAAATCCAAATAGAAATAATTTTCCAAAAAAAGTGGAAAATTT
-TCTAGGCCACTTGAAATTTTTTCCGAGATCTTTTTTGGGAAAGGAATTTG
-TGGCCTAAAAAACAAAAACTCGGCCACTATTTTTTGACCATTTTTTCCAT
-GTGACGTCACTTGTGACTTACAATTCCTTTTCTCAATTTCTTATGAGAAA
-TCGCTTTTTTTAAGACTTTTTGTGATTTTGTTGCATTTTCTCCCAGTCGG
-AGATTACGCCACGTGGAAATAGTAAACTCGGCCACACTCTTATAATTTTT
-TGGCGTCTTTTGGGAAAAGTAACAAGTTCAAACAATGTAAATTACATAGC
-CTAGACTTAGCTGACCAAGGCTTGTTTGAAATATTTTTGTGGCCTAGAAA
-AATAAATATTCGGCCATTACTTTTTCTTCTCATTTTTGTCAGAAGACGTC
-ACTGAAAACCTAGAAATCTCTCTTCCAGGGCTGCAAATGAGTATATCCTC
-CATACCTTCGTCACCGTCAATATCGGGATCTTCCACGTCATCGACCGCGC
-CGAACATTTCATTTTGCTATACATGGACCACTAAGGTAAGCGGCCTAGAA
-AAATAGAAAGTTCGGCCAGCTCTTAAAAAATCGATTAATGATAATTTTCA
-GTTAAAAACGCGAAAAACTGCGGACGGCGAGGCGACGATTTTATCGATTT
-CTCCGAAATTCGCGACAGTCCACCAACTTATTTCGTTTCAATGGAATATT
-CGAATTCATGCCACTTCTGAAATGGTAAGGCTTGTTTTTTTTTGAGGTAG
-GCAGGCACGAAAGCGTCTGCTTGCTTTTCGAAAACACGTGGCCGCGGACT
-GAAAAACTCGGCCACCAAAAATCTGAAACTGTGAGTCGCCCTGACAGAAT
-TTTTTATTTTCTCGGCCAAACAGCAAAAGCCGACAAGTGAAGTTAAAAAG
-GGAGGAGCATTTTTTTAAATAAAAAACTAGACTCCTAATGACCTCAAAAA
-TATCATATTTTTAAATGTAAGAGTCGGCCACGTCCGCGGTCGATTTACAC
-AGTGTCGCGGCTCGGTTTTCATTAATTGAGCACTGAGAAGTTTCACTTCT
-CCAATTTCAATTTTCAGAACGAAGAAGACGAAGAAGTGGACTACGTGGCA
-GTTGACCTTTACCTGGTAGATGGTCCTGTAAATGAGGTGAACGTTATGGC
-CGAGGTGGGGGCTCTAGAGAAAACATCCACAGCAACGTTGGGAAGCCTTC
-CCGCAGGTCAGAAAGAAGCAAAGACTATAAAAATGCAAAAGGGCTCTGGT
-TGTGAGATAACGGATGCAGATCGAGAATGTGTGTCGAAGTATTTGAAAGA
-GAACGTGGAGAATATCATCAAAATCTCCATAATTATAAATATGGAGACAC
-GACTTTTCGAACCATCAACCTATTTGGATGCAATATCTCCAACTCCTCGA
-GCATCATTTCTAACGGCAAATTACAATGCGAGAGTTAACAGTAAGGTATG
-GAAAAGGCGATCACGGAAAAGGAATGGAAGAATCGAGCGAAGAGTGTTAA
-GTGATAAAGAGAAGACGAAGTATGAGAGTAAAGTACAAATGATATTGGAT
-GAGGAACGGGAGAAGCTGTGTGATAAACGAGAGATGTTGAAGGAGGATGA
-TGGTGGATCGAGAAGAGCTTCGTTGATTTCTCAGTTCAGGGAGAATCAAC
-ATGAATCTGTGTTGGATGATCATATGTTCAAGAGGGTAAGGTTTTTATTT
-TTAATGCCTAAAACTTTGAGATTGAGGCAGTTCAATAGGCTATATACATA
-TAAGTGTGGACCCAACAAGTTTGTTACATGAAGTATTTTTTCCAGATCCT
-CGTTAGCTGCTGTGAATCTTGCGAGCAACGTCGTCTATCGTTCATGTGTG
-ACAGTCGAACCGAGGATGATTCTGAAGGGGAAGATTGTGAAGACAATGAA
-GAAGATGATGGAGAAGGTGGCTCCGATGATGAGGAAGACGATGGAGAGGA
-GCCTCATTTTGAATGTGATAAGAGTGATAAGGAGCATGTCCACGATGTAG
-GTCTCCTTTAAAATATCGTCCATAAAAGCTTAATTTTTTAGATGCTAGCA
-AATCTATACTTCAACAAAGTAGTCCTTCCCGAAATGGAATATGTCGAGGA
-TTTTGTGGATTTCCTGATTGATGCGGAGCTCAATGACTTGCCAGTTCTCA
-AAAGAGCTTGTGAGAGGTATTTGTGCAGTGAGCTGAATTCGGTAGGCTTC
-TGTTCAAAAAAATATAAAAATCTAATCGAAATATTTTCTAGAAAAAAGAC
-ATTGGAACTTGTCTCCTGTTGGATTTGCTTTTCAACTCGATTGTATTCAA
-CTTGCCTGTTATGAAGTCGATGACCTTGACGGAGTTGGCGAATCGAACGC
-ACGAGTTTGTGGATGCTGACACACTTTTGGATCAGGAAGAGTTTAAGTGA
-GTAGGGTGTGCGGCAAATTTGCCGAATTTGCCGAGCACGGCAAATTTCAA
-AAAAGTAGATTTGCCGAATTAGCCGAGCTCGGCAAATTTCGAAAAACTTA
-TTCATAAACCAGCAGTGTGTAAAGAATTCAGTAGTTTTGGTGCTCCAAAA
-ACATTAAAAAATATCAAATTTTTTCGAGTTTGTCAAGCACGGCAAATTTG
-CCGAATTTGTCGTGTTCGGCAAATATTGGAAAAATAGATTTGCCGAATTT
-GCCGAGTTCGGCAAATTTTGAGATTTGCCGCACACCCCTGGTGTGCACCG
-TTAAAAATTCTTTTTTTCCAAAAATCTAAAACTTGAGGTTAATAATGTGA
-CCGAAAAACTGAAAAAAAAAAGAATTTGCCGCTGCAAAACCATAATCCGC
-CAAAAGTTTTCTTTGTTTTTTTTTCGAATTGCAGGGTTTCCGAATCTGTC
-AAAATTGGAAACACGACAGTTTGCCGAAAAAATTTAATTTTTGAGTGAAC
-TGTTGATGCGAAATTCATTAAATACGATTTCAAAAAGCTCGGTCACGTAT
-TTGTAATTTTAGAGTGGGATTAGCTATTTAAAAATTACATTTGTAATTTC
-CAGAAACCTGGATAAAAGAATGCGAACGCTTGCCGATCGGAATCTCGTGG
-AGCTCATCGAGCAATGTGTTACGTTTCGTGACCAAAAAGCAAGAGTTCGC
-GTTTTGCCGACCGCCGAATCATTTGATATTTCGTTCGACTTAACTAATCA
-ATAATATTATCGTGTTACTTTTTTCCTCTGTTTTCTTTCTCATTTTTAAA
-AATGAATGCTTTTTTCTTTTTTTTTACCCGATTTTCCACACGACTAACTC
-CAAAATCAGCCGCGCCTTTTTGTCTTTTATCCCTGCTTTTCCACACATTT
-ATCAAATAAAGAGTGCAACGAAGTGCAAAATGGGAAGTAGTAGTGCTGCA
-ATCTCATTTAGAGTACACTTTTGGAGCTCTTTTCTCCAGATATATTATAT
-GCTGTAGATGGAAACTTTTCCAGTTTATATATAATATTTTTCATTTTCCA
-TATTGCCCTTCACTGCTCATCATCCAATGGGGTGCATCTAATTACGGCAA
-AGCTTCGCGGATGGGGCGAGTAATGAGCAAAAGAGCACAAGGATGGGGCT
-CTTTTGTTCCTCATTTTCATTGCTTTTTGATTTCATTTCCTTTTCAACAT
-GTTTCCATTTTCGAAATTAATCGGCTTTTCTGACCCAGGACTCACGGGAG
-ATGAAAATTAATCTTTAAGAATTGTGCTTTGAAAAACAATATCATACACT
-TTTCAAACTTCATTTCTCCGTTGTTCCCAGTAAATTCCAAGCTGTCATCC
-ATCAACTCTCTGATAAAAAATAATCATTTGGTCCGTCCGTCGCGAAAATG
-AAGTGAAAAAAGTTAATCCCGGCATGTTGAAATACACATTTCGTCGCGTG
-GAGTATAGTTATGCTTCGATTTCTCAAGAGGATTCTTCTTTCCCCCTTTT
-CATATTTTTTCGGGCAAAGAAGAAATCTCTGTCACCCCCCGACTAAAAAA
-CGCTAAAAATTCAGCGTTCATTGTTCGGTTTTCCGTTTCAAAAAGAAAAA
-AGTGTGTCAAAAACTCAAAAAGTCACCGCCTAAAGTTAGTTAGCACCTTT
-TTCCATTGTGAAGATTTTCTTTCCTTCAATACAACTACTACAGTTTGTTT
-CCTGTGTGTCGTCCTATTGTTGTGGGTGTAATTGTTCGATAGAGCGCGCT
-TTACAAAATCTCTCGAATTAATTGAAAGTAGTGTGTTGTAGAGACCTTGA
-CTCCTTTGTCAACACTGTAATTAGGAAGGAGTACACCGCCGGGCGGGTGA
-GAACAGTTATTATAACGATAGTGGTTTGTTATTGTTTGTTATTAATAGGT
-TAGTTGTCTACTTTAAACGTTTTTTGTTTGAAAAATTTCTGTTAATTAAA
-AAATACATAATTTATAAAAATGATGAGTTTTTTTTTCAAATTTCTCAAAA
-ACCGAACCCATGGGGTTTTTTGAGAAAAAATAAGAAAATTTTTCTAGTTA
-TTCAAAAAATCTATACATTTTAATATCTGTAAATTGTAAATTTGGAAGAC
-AAAATTTTGACAATGCGTATTGAATTTGAGTTTATTTAACTTAAAGAAGA
-GAAATAGACAAATAAATAATTATATATATTGCGCAACATATTTGAATAAT
-ACATTTATTTTTCGTAATATTTATTTTGAAAAATGATTGAAAATAAAACT
-CGAAGAAAACTATATTTAAAAATGTCGGTGCTTTTTTTACATTTTTTAAA
-CGAAAAAAAATGCGAAAAAAACCAATTTTCCGAGTTTTTTCTTCAAAATA
-TTCGTCCCTGTTCATGAAAAATGTTCTCACTTATGTAAGTAGTTGTCACG
-CAATGCAGTTGTTGACCAAAAATTATTTTCCGAGTAAACCCTATAATTTC
-CAAATTCTCTTCTTCTGAAATTTTGAACTTTCCATCGGGAAAATGTCATT
-TCAACTCGAATTCACACTAATTATACATCTGTATAATTATTTAGATTCGT
-ACTTTTTCCTCCTTTTGAAAAAGTGCACAGACACCGCCGTTATCTTTACA
-ACCGTCTGGCAGGACCGGTGTTGTAGGCTTTAAATAAATATTTTTCCATA
-AATTTCTTAATTTTTAGCTGAAACGATTTTCCAACAAAAAAAAACGCACA
-TTTAAAATGGTTACCGTATTTCTTCTATCAATATGGCTGCAATACTATTT
-TTCGATGGTCTTCCCGCTTGCAATACTAATAGGGAGTGCAAGACTATTAG
-GGAGTGCAATACTAATTTTCAGAACATTTTTCTGACTGTGAGCTTACTAT
-TTTTTTTTCTGAAAAAACTCGAACCTTGTGTGAAAATTCAGAAAATTTGA
-TTGTAATTGCAACAAAAAGGTGTAATTACTTCAATTTCATAGAAATTTTT
-CCAAAAATTGTTGCACAGTAGGCAAAAAATGTTGTTAAAATCTCAAAATT
-AGTGAGGTGATTTTGTACCAAAAAAAAAGTAGACGCAAGACTATTAGGGA
-GTGCAACACTAATTGGGAGTGCAATACTAATTTTCGGAGGGTGTTCAAGG
-AGCAATACTAATAGGGAGTGCAAGTCTAATAGGGAGGTCATATTAATAGA
-AGAAATACGGTAAATTTTATATTTTTCGGTGCATTTTCATTTTAAAAACA
-ATTTGTTTGAAAATAATTATTTTTAAAAATCGTTTTCTTCAAATTTTTTG
-TAATTATAAGAAACCAAAAAACCTTTATTTAATTTTCAACAAGTGTATTT
-TCTAATTAAAACAATTATGAAAATTCACAATAAAAGTTCAGGACTGAATC
-CAAAAAAACTTTTATTTCAAAAACGAAACACCTTGTTTGCCAAAAACCTG
-GAAAAGCCTGGAAACCTGGAAAATCGAATAACATCAAATTTTGCAAATTT
-TAAGCGTTTTCTCGAAAAAGTTGACCTGAAAAAATAGGATTTTTCAGTTT
-ATTTTATAAAAAAGCGAAAAAAAGCAAATTTTTTGAGAAAAAAATTGCCT
-AAATTTTCGAAAAATCATTTTCAAAACTATTCACGATTAAAATTCGTTTA
-TCCATTTCTCCTTCAATTCTTCCAGATTCGAATGAAAACTTGCTCAGAAA
-AAATGCTAAATTTGCTCTTTTTCGTATCCACTACTACTGCTACTACTAGT
-AGAAGTTCTTCATTCGGTGGCCGGACTACTTTGAATCAAATCACATTTGT
-CGGGAAGAAGGAGGTCGTGCCTTTGCACTTCTGGTCACTCCAGAAATTGA
-AGAAATTGAGCAGCTCGAGTTTTGGAGTATTCCAGGCAACTCGGTCGTTT
-TTGAAAACCTATTCTATGAAAACTGCAAACTATGTGGCTTCATCTGGTCT
-GGCTGGAATTTTTTGTTTCAAATTTTGACCCAGTACCTTGAGAATCAACC
-AGTTTTCCACGTATGCTAAAATCCGAAAAAGTGACTCACACGAGAAAGTT
-TCAATTTCCGTGATGACGTTCGCCTGGCTCTTCAGCTCATTCTTTTGTCT
-CCAGAGCTCTGGGGAGCTGCAAATGAGTTGAGAGCAAGCACATTGCGTGA
-GCAAGATAGCTCCAAAAGATATGAAGAGAGCAGGCGGGAGATGAAATTGG
-ACGATGAAAAGTCGCCAGAAGCATAATTTTGGTGCGGCGACACCCGAATA
-ATGAGACATTTACGACTTTTTGGAACATCTTCTACGGCCAGAATGTTTCG
-TAACATTTTGGTAATTTGAGTTGTAGTTTTGAGGGGCTTTTTTCGATTTT
-TAAATTTGTATTGACTCTTATTCGCAAAAAAAGAGAACTGCTATAGCACG
-TGTAGTCAAAATGTCTTTTTGATCTTCAAAAAATGCGGGAGTTAAGACGC
-AGACATCTCATCTGATTCGCATGGCTAAGAGCGTGCTGACGTCACAATTT
-TCTGGAAAAATATTCCCGCATTTTTTGTAGATCAGGCTATGATGTGTGTG
-TTCAATGAGACAGCCTGACACGACGTGATGTAGTTCACATTTTTCGGCAG
-TTTTTTTCCTGAAAAATGTGGATTTTCGTTTTTTCTTAAGTTGTCAAATT
-ATCGAAAGCTACTAAGCTTGAGTAACTTAGGAAAAGTAGGATTTTAAATT
-GTTTTCACGGGCCTCGCAACGAAAGATCTCACTACTATCACCAGAAATCC
-AAAAAAACGAAAATATTTGTCGTGCCGAGCCCAGGCTCCGTATTTTTGAA
-GCGAAATTCCTAAACTCCCTAACCGCTGAAAATTTCTGAGTTGATTTTCC
-ATCACCTTCTATATACAGTCTTTCGACCCGAAAACGATTTGAATTCGGCT
-TTCTCCTCAAATCCTCTGTATTGCATCCTCTTTCTTAGTTGATTTATTTG
-TAGCGGATTCTTCCCCTTCCCATCCGTGGCGTTATTGTTCGGTTACGATA
-CGCTTCTTGTGAAGGTTATATGCAAACGACTACTTGCCATTCGATTCTTT
-CTCCAAAAACGGGTTATTCCATTTCCTTCAACTAAGGAGCTGTTTTTTTC
-TTGGTTTTTTGTAGAAAACCTACATTCAAAGTCGAAGTAGTGAAAGTCAA
-AAATTACCAAATTTCGCAATTTAATTTTTAATAAAATGTCGCCCGAATTA
-ACGATAAGTTAATAAGAACAAAATTCAGTTAGTCCGAGAGTCGTGATTTG
-CCGATTTAGAACAGCATTTAGCTGAAAAAAACGATTTTTTTCCAAAGTTT
-GAACTGCCACTACATTTTTCTCAAGTATTGAGAGTTTTGAATTTCCATCA
-TTTAGTTGTAACCACACTTTTCTTCCGATTCCCATAGCAAGCGAAAGTTG
-TCTTGTTTCCGAATATCTGACCTAACTTGGTTTTTTTACGACTGATGCCG
-AATTTTGAAAAGTTTATTAGAAACTTTCCACGCTCTCCCCTTTCCAACCT
-CGCAAACCCTTTTGTCTGTAGTTGGGATCTGTTGCTTTTTTGGGCAATTT
-TTTGCCAGCTTGATCTACATATCATTGCTTGATCTACATATCTTGAGCAA
-AATTCCAAAAAGTACGTTTTCTTGTAGATTAATTTGTGGGTTTTTTTTGA
-GAGTTTTGAGCTAAAACTTGCATGGCATATTTTTTTCACTGTTTTAAATC
-ATTTACAAATTATTTTTTCCTCTTTTTAGAAAAAAAAAATGTTTGTTAAA
-ATTTTGGAAAAATTTCAAAAAGGTGTTTTATCCACTTCCAAAACGTCATA
-ACTTTGCTGAAACTGGACCGGGGCAGCTAAATTTTTCGGAGTGATCATTA
-TTTTCACTCTTTTATCGAAAAATTACTATGGCATGCCAAGCCCGGGGACC
-CATTTTTTCACTTCCCTTGTAAGCCGAAGCCTTAGTCTAAGTCTAAGCCT
-ACGACTGAGCATAAGCCTCAGCCTAAGCCTAAGCGTAAGCCTCAGCCTAA
-GCCGAAGCCTAAGAATAACGGGAAACTTTTTTTGTTGCTTTTTTTTGTTT
-TTTTTCAAATGCCGAAAAATAATTGCGGCATTTGAATTATGACTTTGTTG
-TTCCTAGAGATTCTGGTTTTCAAAATAGGCAAAAATGCCATGAACCTTAA
-CGATGTTCTTTCTCCCCGCCCTTTGAACACTCTGAAGTTTCCCGCCATGT
-CAACCTTTTTTGATCGTTCGGCACGATAACGTTCTGAGTGCCGCGGTGCC
-CGTTAATTTCCATCGAATCGTTAGGTTTTCTCCTTCGATTCCTAACGATC
-AAGCCATAATTTATCCGCAAAATGGGATTTTCTCCCTTTTGTGATGATGA
-TGATGATGGCCTCCCTCTTCTCTGCGATGACAGTCGAGTGATGAATGTCT
-TCCTTCACACTTGTCCGTTTATCATTTATCACTCTGTGCTGAAAACCGGT
-CTCTCTCTTCCCCTGACCTCTTCGGCTTTGTGAAACAGTGAAAGAGAAAC
-GGAAAACAGGCGGTGTCAGATGGTTGACACGTTGATGTCGTAATCCATTT
-AGTATTAATGCTACTATGTACGCCATTTGCTATATATGCCCATATTTTCA
-ATGGCTTTGAGCACAAGCTTTCAGAATTGGCAATCAATTTCTAAAATTTT
-AAAATTTTGAAAACCAATATATGGGTGGAGCCTATTTCTTAACTGTTCCG
-TAGTTACCGAAAAAGTCGGAAAGCGCCGATTATCTAATACTTTCGAATTC
-GGCAAAACTGAAATTTCTTCAGATTTTTATGATTTTGAGAGAAAAAATTA
-TATTTCTTTGCCAAAAAACATGTATTACTTAAAATTTGTTTGTTTTATTA
-TTTGAGCTCAATAACTATCAAATTGACAAACAATTCATTGGCAAAAATGC
-CGAATATCGTAAATTTGAAAAAATCGGCAATTCCCGAATTGCTGCACACA
-TCTTGGTTTTTTGAGCTAATTAATTGAATTTTTAAGAACTTTTATTTTGG
-TAATCTAAATTTTAGTTACTGAATTCATTGCGAAAAAAATTTCTTCAGAA
-TAGGGCTTCCATGTAGGCGTCAAAAAGCTTGCCAAACCTTAAGACGACCT
-CCGCCTGCCTACCTCAATCTATGTGCTGAAACATATGCGAACTTTTTTTG
-CAATTCTTGATTTGGTTTTCATCAAATTGATAGAAATGAGAAAATTTAAA
-ATTGAAAATTTACGCACAAGTACAAAAAAGGATTCAGGCAGGCGTCAGGC
-CGTGAAACCCCGCCTGCTTACCATGGAAGCCCTACTGCAGAAAATGAGAA
-ATCTGATGTTCAAAAAAAAAAAGAAACCAGCCGTGTTTTTCCTTGAAATT
-CGAAAAGTTCCCCGATTTTCCCCTCATTTCCGGACCGTTTGTTCCCATGG
-TGGACCGGTATTTTCACCACTCCGTCAAAGGCGATTATCGGGTCTGTCTG
-TCGTCGACGACCCATCACACCAAATCGGTTGAATTGTCGCACCCCTTTTT
-TAATCGGCAATATATTTACTTTTTATTTGTAACTAAGTAGTAAACAGTAA
-TAGTTTTTGCAAGAATATGCATAACACCTTATTTCACTTGGTAAAGTAAT
-TGAACTGTTGTAATTGAGCTGAACATGATTCACCTACGAAAAAATGCCTG
-TGACCTAGGGCTTGCATGTATGCGTTAAAATGGCTGCCTGCCTGACCTGA
-AGGCAGCCTCCGCCTGCCTTTTGCCGGTTTATGCTAAAAACACGGTTTAT
-GCTACGTGAAATTATTTTTTCATTTTTAATTTGATTTTCAACTTTTGAAA
-TTTGAAAATTCACGTCAAAATGCAGAAAAGAAGGTGAGGCAGGCAGGTTT
-CAGGCAGGCGTCAGGCCCTGAATCGGCGCCTGCCTATCATGAAAACCCTA
-CTCTGAACTCGATTTCGCCCTCCAAACATCAATTTCCGTCATTCTCCTTC
-CGTCCTTTTTACCCACTTTTTTAATGAATTTGAAATGAGTAGTCGAGGGA
-AATTTAGTGAACCTACTAGAAGTCGCCACGGTTTTCAGCAGCAAATTTTT
-TAATTTCGTAGAAATATGTGCTTCTGTGTTAAAATTAATAATAGCTAAAC
-TATTGGATAATGTACTTTAAGACGTGCAATGTCACTCCATATTTTATAAA
-ATGTTGAAAATTTTGGAAGGGATCGAGGAAGTTTTGATACTTTTTAGAAA
-TCGAAAATTTTCAATTTCCGATTCCCTTCAACATTATATACCTCAACAGT
-TTAATAAGATACAAAAAATCTTCAGAGAGTCATCTGTTCGCACACAGTTT
-TACCCCTATCAAATTACAGATGTGTTGCCTTGCACATCTGTGAGAACTTC
-ACACTATTCTGCTACAACAGATTTTCGGAACAGAAGGTGTGATGTTTCTA
-CCTGACTATGAAGATTCACGTGGGCGGCAATCCAAATTTTTTGAAATTTG
-GAGATTTTCGAGTTATCCATAAAAGATTCCGTTAAAGAGAGATCACAATT
-TTTTTTGTAGATTGACAAGAAAATTACCCCAACAATACTCAAAACAATTG
-TAATTACAATTGAATTATTACTTTTCAATTCTTAATTTTTTAAGTGCTGA
-AACTTTTCTATTGACGTTAACCCCTGCAAAAATGCAAAATTGATCAACAT
-CTAGTAAATCTACTAACAAGGGAAGTCTTTGAGGGGGTCCGTAGATTTGG
-GGTTTTCATGCTAAAATTCCTACAGAAGAGTGTTAGTTATGATCTCTCCA
-AACATTTTTGCGCATTTTTAAAGTGATTTTATTCTTATTCGGGAACCTAG
-AATCATTGTCCGCACTTTTTGGAAATTTTTATTTTTTTCATTTTTGCTCA
-AAATTTCTTGATCAACTCCAAGCAAAAAAATCAAAGTTTTTCAACAAACA
-TTTTGTTAGTTGATCATTTTTCAAAATAATTTATCTCAACGAAGTTATGC
-AACTTCAAAGTTGGTTAAATATTTTGCACAAAGTTCGTGAGATGTAGATC
-ATTTCGACGGTTTACTTGCGAATAGAGAGTTAAAACTTGTGTAATGTACG
-TTTCATACATTTCTGAACAATAAAATAGCAATTTCATACATTTTTACAAA
-AATAAAAAATTTCCTATTTTTGCTTGGAGTTGATCAAGAAATTTTGAGAA
-AAAAATGAAAAAAATAAAAATTTCCAAAAAGTGCGGACAATGATTCTAGG
-TTCCCGAATAAGAATAAAATCACTTTAAAAATGCGCAAAAATGTTTGAAT
-GAGTTGTTTAAAACTTTATTCAACTTACAAAAATATTTCAAAAATAGAAG
-GAATCGAACCAAACCTTAAATATTATCAGACGCGCGCACTCCCAACTCGG
-CCACCGAGGACAATTTTCAACTCAATGTGGTGGGTGTCACATTTTCGGTG
-GTCACGCAAGCTGAGATTTGCGTGGACTGCATGGTAAGACAGTGGATTTC
-AATGGTGTTTTTAACTTTCAAAACGTCATAACTTTGCTGAAACTTGACCG
-GGGCAGCTAAATTTTTTGGAGAGATCATAACTAACACTCTTCTGTAGGAA
-TTTTAGCATGAGAACCCCAAATTTACGGACCCCCTCAAAGACTTCCCTTG
-TAAGTCAAACAAAAATTCTGTATTTTTCAGAGTACTATACATAGTATATA
-TTTCTGAAATTCTCTCAACAAAATCCTTTCCCCTTCCTCATTTTCCCACG
-TAAAGTAAAGTCAAAATACATTTTAATTACCATTAATACCTAAATGAACC
-AAACAGGTCGGTCTTGCCCTCAATTCTACCATTTAGTCTCACGGCTTTTG
-TACTTGTTCACCCACTTCCCCCATTCTATAATCCAACCACACAACTTTTG
-GCAACAAAGTGTTCAATCGAAATGGGACACTATTTGCTATTCCTATAATT
-GACAGGCTGGTGGAAGGAGGAAAGCAGCACACGACGAAAGGCATAAAACA
-ACTTGGCGTTGTGTTAATCCCACCCGTATTGCATTCTATATTAGGTCGAC
-AAACAGTTCATTCATGTCGATTTTCGATCATTTCTCAGAGTTTTGCTTCG
-AATTGTAGGTTCATGGAGTTAGCCATTCTGTCTATTTTTTCCGCTGAATT
-TTAAGATGTTTAATACTTATTTGCCACCTTTTCGACGGAATGACATGTAC
-CGGTCAAATCTTGGAATCGATCTAAGAGATGACAATTTTGAATGTATATA
-CTCAAAATGGGCTCAAATGAACGAATTTCGTAATGAATTTTTTAAAAACT
-TTTTTCAAAATTTTTTATGGTGGTTCAAAGTTTCGAAAAAATTGACCGGT
-ACATGTCATTCCGTAAAAAAAAACGCGCTTCTATCTGAAACAACAATTTT
-TTTGATAAAAACTTTCAACTACAAACTTGTTCTTTACAAAAAGATCAACA
-ATTTATTAGTTGAGCACTTTTCTGTACAAAAAATTATCCGCGCAGATATG
-ATCTACCAAAGTGAATTTGGAAAATTGGCCCGTCAATGCTTCGTTGCAGT
-GCTATTTTAGGATCTTTGAGAGCTCGCCGTGAGCTTGGCTCTGGAGATTC
-GCAGCTAAAAAGGAGTAACCGTTTCTTTAGGAGTAACCGTTTCAAGACAT
-GGGCTATCGAATGGCATAGGTCTCATATGCAAGTCCGATGGGCACCTTCT
-GACGGTTCCCTAGTCAGATAGAAGCCAAAATTTGGGCGAGGTATGCCCAT
-TGTCATTCTAACTGTCGAAAAAGTGGCCTCCGCCAAGACGTGATAACTAT
-TTCTCTCAATTACTCTGCACTCCCAATAAATCCTACACACCGTTTGAATT
-GAGTCATTCAAGTGTCAGTTGTTCAGTTTCTAGCAGTTGATACGTGTGTG
-TGTGTGGTGGTGGTCAACCAACTGTCGCCCTTTTGAACACACACACACAC
-ACATACTTTTCCTGCCATATTCCTCCCCAAGAAAGAGAGAAAAATAAGTT
-GCATCTTTTCTTTTCTATATCTCTATCCACTAACACACCCTGTTATTCGC
-ATGTTCTCTCCATTCTCCAAACAACGCAATCAGTGTCCGCCTAAATCTAC
-ATAATCGATTCAGGGGGAATTAACTGTGTAGTTTTGTAATACTTTTCCTT
-AAGGTTCTTGAAATTTTATATTTATAACCGACCGATTATGCCTAATTATA
-ATTATAATTTAGAGAATTTTTCAATTTAACAACTATTGCGATGTTTTGAA
-TTTTTGATAAAACCGGAGTATTTTTTCAAGAAATTCTGTTTAAATTAGCT
-GAAAAATTTTGATTTACTAGTTTTTGGTTTGCCTCAAAAAAAATCGGTAA
-AAATTTTTTGGGGCTTTTTTCTCAAAAAAAAAAAAAGAACGATTCAGGAG
-ATTTTTCATAACTTCGAAACTTAGTGCAAAATCTTTTACGGGGTGTCGAT
-TTTTTGATATTCGAAAAATCGGGTTATTGCTCTATTAAGAAAAATTATTT
-CCTGGACATATTTTCTGAAGAATTCCTCGTCTTTTCCCATTTTTCTACAA
-TTTTTCCTGATTTTTCATAAAATTGAAACTTTCGCTGTTCAGTTTTCCCT
-TCAAAATGAATTTTTTCGACGACGAATGTTCAGAAAGTTAACAAATAATT
-TTAAGATTTTGTCAAATTTTCACACACGTACTTTTCCACCAAAATTGACA
-AAAAACCCTAAAATTTAATTTCTAAAATTTTCAAAAAATCGTGATCCATT
-CTTCCTTATCATGTTATGTCTTGCAAGCGTTGCCTCAAAGTCATCAATCA
-GCTAGTTGTCATCAATTCAGCGATACTTAGAGATTGAAAGAATGAGTAAT
-TCATCCTTGTTTCTTCTTCATCTCCTCACTTCACTTCCAATTTTCCATCT
-GTTACCAATCAATTTGGCCTGGCGATTAGTCATCTATTTGTTCGTCAAAT
-TTGGTGCAAATTGGCTCGTGTCACTGATAAGTGGTTATTTTTTCTTTTTG
-GTTGATAAGGTTACCTGATAAGGTCATTTCCTTTTTGCGCCTTTTTTCCA
-GTAGTAATTCCTCTAATGTTCGTTTTGAAGTTACTAATCGAAGTTGTTAA
-AGTATTAGATTTTTTTAAAATCAATAGGAATGTTTTTTTAATACAGTGTT
-AACAAAATTTTATGTTTTAAAAAGTTAAAATAAATTTTAAAAAATCTCTG
-AGTTGAATTGTTAATTTTTAAAACTATAAACAGCATTGGCATTCATAAAA
-AACAAATTTCGACAAAAAATTCGTAAAAATTGCTGAAATCGCACTAAAAA
-TACTCAAAACACTGAATTTTTTGCTCATAAAATCTGGAAAATCAAGTCGT
-TTTACTTGATATTGCCATAGGAAATTACAAAAAAAAAGTGATTTTATTAA
-AGGCTGGTCAAAATTTCATATTTGAACAACGTTTTATAAAACCGCTGTCA
-GAGTAGAACAATATAGGTGTAAAATGTAGTTAAAAACTATTCTTCGATTT
-TCCTACATTTTTTTTTCTGTAAATTGAAGTTTTCTCGTAGAACAAGAAAA
-TTTAAATTTAAACCAAGTTTTTAAATTTTCAATTAAAAAAAACTACAATT
-TTCGATTTTTAATAAAACATTTTAAATCCCAATTTTTCTTTCAAACATAT
-TTTCCAATGCTGATTCTGAATCCATGAAGTCTTAACACTTCAATTTCAAC
-ATTCTGTTGCAACAAGTCGTCCCATCTGACCAATAACAAGGGCTCATCAA
-TCACTGACGAGGGCCCCCGGGCGCCGCCATCATTTTCCTCTCTTTCTCTC
-TCTCTCTCTCTCTCTCTCTCTCTCTTTGTTTCTAAAAAGAAGGAAAATGA
-GCTGCAATTTATCAAATCCACGGTCTTTTTCCCTCAAATTCTCTGCCTCT
-CTAGTCTTCTCCCTCATGGTCATTGTCGCCACATTTGTGACTCACAAAAT
-GGGCCGTATTATACAAAAATAATTAAAGTTCAATGCGTATGCGTGTGTGT
-ATTTGTTGCTGGGTGAGGGCAAATGCACATTAGCCACCCACAACAAACTT
-ACGTTTTTTTTTTTGTATTTTGCCTTTTTCTTCTTGAAGAATGGTGTCAC
-ATCACATTACGACCTTTTCTTTGTTACGGAGAAAAGAAGATTGGAGCGGA
-ACTGACTGAGGTGTGAATACTTTGTTGGTTTTTTTGGCTATACCTATTAG
-TTACCTTATTTTTGAGAAAAAAAAATTTGAAGCATGTTATTTTTCGAGTT
-GTTGGTAGGATGTTGATAATTACTGTTATCGTGATTTTCTTATTAGAAAT
-TAATTTTTATTTATTTAGTAGAATTGGGGATTTTTATTCAAATGATCCAA
-AATAATCTTTCGACACTGAAATCACGACCATTTTTGAGCCAATCAACGTT
-TTCAAACTCCGCCTACTCTGTCTGATTGGTAGGAAAAGTGGGCGGAGCAA
-ATTGCTGATTGGTTTCGAAGTTCTCGACTTAGAAATACCAGAGTTCATCA
-AAACTGAAATATTGCGTTTTTAAAGGATATATTATTATTATTATTATTTT
-CTCTCGATTTTTTTATTCTGTGGTTGCTCTGAATTTCAGATTATTCGAGA
-TAGTTTTCGATAAAGCGACAGATTGTTCAGTTTCTGAATTTTCCATAATT
-TATCCTCTAAAAGTGAAAGTCAAGGTTTCGTTCTTTGCAAAAAACTCATT
-TTTTTGAGAGTTTTCGGAATTTTGGCTCGCATCACGCTCCAATAAATTAA
-TTCAAAATTTCGGAAATTATTAACTTCTTCCATTTTATCAATACTGTGTT
-AATCTCACTTTTCTAATTTGAAACAAAAATTGAATTTTCATCGATTTCCA
-AAATACTTTACATGCTTGGCAATTGAAAATTAGTTTTGTTTTTCAAATTC
-TCAGTTTCCAGCCACTGAAAACATTGCGAGCCTCCATTGGGTCCGCTCCT
-TCCTTCCGAAACACATTTCCCAGTACTCTTTCCAATCTGGTCAACATTTG
-AAAGGCTGTTGGGGGGTCGAAAGGCAATAAACAACCGAAAAATAGTTTAT
-TCCAATGTCATCGAATCCTCCCTGGCTTCTCATATTGTTGCCAAAAATGA
-TGATGGAAATTGTTTTTCGTTTGTATACACACACATCATCCTGTGCCACA
-CCTTTTCCCCACTCTTTTTCCCGACGAGCTTTTTCATTCGGAAGGCGACA
-CAGATAGCAATTACCGACATATGGAACCAATCGTACTCTCTCCGCTGACT
-GCGACTACCTAATTAACCTTTTATTGAAAAAATGAGAGAGAGAGAGAGAG
-AGGATATGAACGGAAGAAGAAAAAGAGGCAAAGCAATTGTTTACTTGTTT
-TTCGAAACAATTCAAAATTTTGTTTGGGCTGTGCGCCTTTAAAGATGGAA
-AAAAAACGGAAATTTTCCAGCAATTCGTTAATTTTTTTGTCGGCAAATTT
-GGCAAATCGGCGAATTACCGGTTCGCCGATTTGCCAGAAATTTTCATTTT
-CGGCAACTTGCCGGTTCGCCGATTTGCCAGAATTTTTCATTTTCGGCAAT
-TTGCCGGTTTGCCGTTGCCGGAAGTGTTTAGAGGAATTGTTTATGAGACG
-GAAGCACTGTGCCTGTTTGCCAATTAAAATTGAAATTCTGAAATTTCCAA
-AAAAATGTGCACAAGCACCATTTGCCAAAAACTTTTTCAGTTGCCGGTTT
-GCCGATTCGCCGGAAAATTTAAAATCCGGCAATTTGCTAATTTGCCGGAA
-AAAATCGTCTACCGCCCACCCCTCCACCGAATTCGGAAATTTTGTAAAAA
-ATAACTTTATTTTTGGGCCAATACGATACTACTTTTCCTAAAAAGAAGCT
-GTTACAGTAATCAATGTATCATCTTTTCCATCTCGAATGGTACCTGTGTT
-TACCTTAACTGTCACATAACTGTGAAGAGTACTTGAGATGACAAGTAGTC
-TTATCAGAAAACCTCCCCGCTTACTGCTTCTCGGGTGTCGGGTTACCGTG
-TTTGCTGAACGGTTTTTCGTAGGGATTACTGTAGAGAATTGGATGAGTAG
-TTGGGATTAGGCGATTAGGGGGAAATTGGAAAACATGTCTGTGCACTCCA
-TATGTTTCTAATAAGAATCCTTGGAAATTTGCATATAACTCAAGAATGGT
-ACTGGTCCAGTTTCGTTTTGTTATCTTGATTCTTCGAAATGGTGCTCACT
-CAACTTGATTCCATCCCCAGGACGCTAGTTATTTTCGTAATCTCCGCGTT
-CGATCTCGAGCTCCTCCTCTATGGAAATGTTAATTTGTGAGGGCTATCGC
-GTCCACAGATTTATAGCGTCCGTCGTGCGGTTTCGCTGGGTTCTCGCAGC
-CACCCCCCCCCCCCCCCACTCATCAATCGCGTAAACTTTTTGTGAGCACG
-CAGCACACAATGTGCTCAGGAGGCTTCTGTCTCTTCGGAGATCCAACATG
-TGGCACCTCCTCAAAGTGTTCACTGGCCTCCTCGGCTCGGCAGTCAAATT
-TATTCATCTCTTTGGAGATTGGCTCACAATTTTTTTGATTTGAATTCAGT
-GACTATTTATCGATTTCTAGGGCTTCTATGTAGGTTGCCTGTGTGCCTGT
-CGTCTGACGTTAAGGCGGCCTCCGCCTGCCTCTCGCCTCAATCCGTGCCT
-TGTGCCAAAACATACGAATTAATTCGATTTTTATCAAATTGATAAAAATG
-AGAAAATTAAAAATTTGTAAATTCAGACAGGCCTGAGGCAGGCAGATTTC
-AGGCAGGCATCAGGCTCAGAAACCGCGCCTGTCTACCATGGAAGCCCTAC
-TGCTATGTAACGTTTGAGATATTCGGTTCAGATAAAATAAGTTGAAGTTA
-CGCGAAGAAATTCTGAATTTTGAATATTTTCCAATAGTTTCTAATAGTAT
-TTAGATGTTGTATTTAGATACTGTTGCTACAAAATTTTTAGAAAATTCCG
-TGGTAAAGTTCAAAAGACTACTCTTTCTCTGAATATTGGTTAATAATATG
-AATCCGTTCTGCTTTTTTTCCGTATTCCAATTCTTGACGACTTGATATGA
-AGCCAGCTCAAATAATAGGCCTCCCACGTAGTGTCAGGCTGTCCCAATAC
-GGTTTGATCGACAAAAAATGCTGGAGTGTTATGCCCTTCAAAATGTGACG
-TAAGCGCGCTCTTAACCATGCAAAATCAGTTGAGAACTCTGCGTCTCAAC
-TCCCGCATTTTTTGTAGATCTACGTAGATCAAGCCGAAAGGATACACTCT
-GTCACCACGTGGCCTCCTAAGGACTATTTTGCAAGGACCTAATTTTCTGA
-ACCTTCACAAATTGATCTGCACCGTTTGAGATCGATTGAAAAGTTCTAAA
-ATTTTCTGTCCTGTATACTTTTTTCTGTACATAAGTCCTACCGAAAGGGT
-CCCCCGCGGTAATAATTACCCGTCAAAACAATGTGTACTACTAGCCGAGA
-TATGAGTTGTTATTGTTGTCATAATACAACAAGATTTGGATCACCGCCCA
-ATTTTCTTGTCAAAAAGTTCCGCTTATCTCGTTTTCTGCTAATTAGAGAA
-TACTCTATGGGAATTGGTTGATCCACTCCATTAGTGAATGTTCCCCCAAT
-AACCATGGAGCTGTTAGAACAAAGACGAAAACCCGCCAGAAGACACACCT
-TCTTGAGAGCAGGTATTAGAAAAATGAATGAAAGGAATTGGGAGGGGAAC
-CCGCGGTGGCCGAGACTTCCCACTTGACCCGATTTGTGCACATACGCAAT
-ATCGATGAGGAGTGGTGGTCCATTCGATACAGTCTTGCACCATGTTTGTC
-GAAATGCTATTTGGTTGGCTGGCAGATGTTTTTGGTCCAATTTTCTTGTC
-AAATTTTGTCTTGATCTGACAGATTTTAGGATTCTTGGAATTCGACTCTT
-CACCGAAAAAATATAATTTTTCGGAGTTTGTTCAATTTTTCAGTATCCTG
-ATTGGAACATTTTAATGTTTTACAAAATTCGATTCTAAATTTTAAAGCAC
-ATTTTGACCTAGTAGGACTTTCGGAATTTTGTAGCCTTTATAAAAAATCG
-GTGGCCAAGTTTTCTATAATTTTTTTACGTTTTGAAATTGCCTTTTTATG
-AATTTTAAAATGTGGAACATTTTTTGAATGACTTAGTTTTTCAAATTCCA
-CGTAGTGTCAGAGTGTCCCATACCAGTTTAATCGACGTTGATCTACAAAA
-ATCGCGGGAACTCTGACGCAGAGCTCGCAACTGATTTTGCAGGGTTAAGA
-CTTGCTGACGGCACATTTTTTGGGAAAATTTTCCGCATTTTTTTGTAGAT
-CAAACAAATTTCATATTGCCTCGATTTGTTCGCTATAGTTGTCTAGTTTT
-GAAATCGTTGGAATTTCTTGAAATTCGAGTTCTTGAAACATTTAGGTTTT
-CACCTAGTTTTCTCTGCGTGTTTTTTGTGTTGAAAAAACGGTTCTCAGAA
-ATTTGACTGCTTTGAAAATTTCGAATTTCATCTCCAAAAAAAAGTGAACA
-ATTCGTATTTTTCTAGAATTTTTGGAAATCTCTTTAAAATGAGTTTTTCT
-GAAACATTTTAATCTTGAAATAGTCAGAGTTACGTCAAATTCTATTTTTT
-GAGGAATTTATTTTTTGTGAGAAGAAAACAACAAATCCGCAATTTTTTTC
-CGAATAATTAACCAATCCAAGATCCCCCCTCAAACCGGATGGCATTTATT
-CGGATCCCGGCAGGTGTTCGAATGAGATATGTATCCATTAACACATTGTG
-CATACACATAGACACATTGTCAACGTATGCCGTACACAACAAAACAACTG
-CGCTCGTTCGCACCTCAATCCTTTGATGTTCTCCGCCGGGGGCTCCTGTA
-AGGTCAGGAGTTTTCTAAAAATGTTGCCTTCTTCTCCGTCTTCTTCCTCT
-TCATCATCGAATATTCCAGAGGGGGGCCGACACGCTTCACTTGATTTTCG
-ATGGCAATTTGTTTGAAGAATTCAAGAATTCGAAGAATTTATTTGGAAAC
-TCACTACTCTCTTTTTTACGTTTACATCCAACTTTTGGCACTTAGGCGCC
-TCCAACTGCAACCATATGGTGCTCAATGAGCCGAGAGGGATCATCTGTGA
-ATTTGGTGTTTTTTTCTCAATTGGTTGCCTATTTGATTGGAGAGAGATTA
-ATTTGCATACAATTACCTCTATTTGGCTCAGGGGTGGACGGATATTGCCG
-TTCGGCATTTTTTGCCGACAAGTACGGCAAATCGGCAATTCGCCGATTTG
-CCGGATTGCCGGAAATCTTGATTTTCGGCAAACCGGCAAACATCAGCGTA
-CTATTTTACTATTCAAAATAAATGTAGGAACATTCATAGGATGCGTACAA
-TTTTGCCGATAAAATTTAAATTCTGAAGCTTCAAAAAAAATGTGCAAAAC
-CACAATTTGCCGAAAATTCTAGCCGATTTCAATTCCGGCAATTTTTTGCC
-GAAAAAAATTGCCGCCCACCCCTGATTTATATTCAGTCTGTTACCGATTC
-TAGTGAGGGGTTTCCAGCCTTTGCATGAATAGGTGTCTGCTACATTAATT
-GCGCAATCCACATTGATACAGAGCAACCTCAATTGTTGTTTTTTCTGTGG
-CCCGTTCTGCTCGTTACACCTATAAAAAGGTGGTCAAACAAGTCGTAAAA
-TTTGGGTCATGAGATGGTCCCTGGGTTAATTGGAGAAGTGCCGTCATTGA
-GAGAGAGAGAGCCAATTACGTATGAGGTCTGCTCTGCTCTCGGGAAGACT
-CTATAACCCTTCGTTTTTGGCGGGAGATATGAGATATTTTGCTGTAATTA
-TCGCACTTGTTTTGGGTATTCTCTTTTTGTATGATTTACCTAAAATTTTT
-GAGCAGTTGTGATTATCCTATTTTGTTTCGAGAACCTAGAAATGTTTCCT
-ATCATAGTAACCGTTTAACTCTGTGAGTATAGTTTTACTTTAAGTTGCTC
-CGTTTTTTATTTGACTAGCACAGCTTTTTTACATTGCTCCGGTTTTGGCC
-AAAGGTTTTCTGTTTTTTTTTTGCAGTTCTGACTTATTCTGGCCTGCTTT
-ACCCAGCTAAGCCTAGGCCCGGTTACAGTCCATAAGACAACATTTTTGAA
-CTCAATAATTGCCGAATTGCCAAAATGCCAAATTTTCGATTGCTGCCCGT
-CTGAGTAAGTCTGAAACAGTTTGTGTGAAATTGAGCCGGAAACTACTCGG
-AGTGATGTGGCCACTTCCCTATTTAGTTTCTCGGTTGATTTTCACACTTC
-CCGCCGAGAGCCCGAAGCATCTGCCAGCTGAACGGTTTCCGTCGTTTTTC
-ATGTCTATCGCTAAAATGTGCGCGTTACACACACATAAACATCACTTCTC
-TCATAAAGTGATGGATAATTCGAGTGGATTGCATCTGACACCACACTTCC
-GATAATCGCTTCGTCGTCTTGTCATCATCGTCGTTTTCTTCGTCTTGTTG
-TCGTCCGGTCCCCACACACACATCAAAACGGCTACTTCCGACGTGTCGGT
-GGTTTGTGTGTGTGTCAAACGGCACCACCACAAGTGGTTGCCCTCGCCCG
-TGTGCTAATTCGCATTTTGTCTTGTTAATCACGCAATAGTGATAACAATC
-GCTTCCGGACCATTGCTAATATAATATATTGGCTACCGCGGGCATGTCTT
-GGCAATAACCTTGATGTCAAGTTTTATCGTTAAAATGTGAAGCTGTATGA
-TTGCGAAAAATTTGAAGTTTTCCCATTCAAATTGTAGGCATATTTGAAAA
-ATTTCTGAAGATTTATATCTGTCGTAAGTGGAACGGTTTATTTGGTTTCT
-TGGGTCTCGTCGCGAAAAGCTTTCACTATGGTTTGAAGCACGACTGGGCG
-ACAATCGAAGTCGAAGTTCGGCAATTCGATAATTCGGCAATTATCGAGTT
-CAAGATTTTCGAAAGAAAAACTCAAAAAATAATTTTGAAATCTATTTATT
-AGTTCTGGACACGCGGAGTCAGAAAGTCCCATTTCGCTTTGATCTACGAA
-AAATGCGGGAGTTGAGACGCAGACATCTCAACTGATTTCGCATGGTTAAG
-AGTGTGCTGACGTCACAATTGTTCTGGAAAAAAATTCCCGCATTTTTTGT
-AGATCAAACCGTAATGGGATAGCCTGGACGTAGAACTCGCCAAATCGTAG
-ATATATGCATAATGAAAACTCTAGAGTTAACTCTGCCACCCTCATAAAGT
-GAGTTAGAAACATTTCTGCTCTGAGGAACTATAGAACCCCCTTTCAAGTC
-GATCGTCAGCAAATTCTAGAAAGATCTGACAGTGGCCGATTTTTTAATGT
-TTCTAGGCCACGTAAAAAAGCTGATGTCTTGTTACTTTTCAATTCGAAAA
-TCCCTTTTTTTAATTTTTCGGCAGCACCCGGTCCGAGCCAACATCTTCCT
-AAACACTTCAAAACCCCGCCCCCTTCTGCCCTCCCGGGTGTCTCCGTGTT
-GTTCAGGGTGTTGTCCACCCCCTAGACACCCAACTGACCATTCACCCGTC
-TCCTCCTCCCCCTCTACAACAACCACCACCACCTGATCCATTCCATTATA
-ATGATATTCCGCATACTTGTCATACAGAGAATACCCGGTTTGCTGCTGCC
-AAACGGTTTTCATTTATTCCATTTCTCACTCCTTGATTGTTGTCAATTCT
-TCGATTCGATGCGGCAAAACTAGCGCCAGTGGGGAAATTGCTTTAATAGT
-AAACAATTTTTTTTTAAATTTCCTATATTTTTTGTATAAGATTTTCTTTT
-TTAATTGCAAATCCCATGGGAAAGTCTCAAATTGCATAAAATTCCAATTT
-GAATTCCCTCCAAGATTTCAATGTTCGATGGAGCGCACTTGAATTATTAT
-AATTTTTATCAATGAATTTTTTTATCATCTCTGACTGATTTTTCACGATT
-TTTTGTGTAGTTTTAGAGGAAATTTACTGAAAAATCCAAGTTAAATGTAA
-ATTTCCGATTTTTATACAATTTTTGGACTACTTTCCCCGCCGCCACCGCT
-AAAAATCCCAATTTCCTGCAAGTTTTCACCTGCTCTGACTCATTTCCGCG
-AGCGCGCGCGCTCGTACTTTTTATCTTTTACTATTTATTTATCTCCTCCA
-AAAAAAAATCCCGTTAATTTTTTTTCCCTTACAATTTCTCATAATTTACT
-CATTTAGTTTGGCTTAAAAAATGCTAAATTAAATTTTTTTTTCATTTCCA
-GATCACATGACACAACGAAAATGAGGAGAAAAATGAAGTTATTCCTATTT
-TTATTATTAGTAATTAATATATGTCGGTCGGCCGCTGCTAACGGTGACGA
-ATGCCCGAAATTGTGAGTTTTTCGCTTAAAAATCAGATTTTTTTCGAATT
-TACTGTGAAAAAGCGGGGGTTTTGCCTGAATTTTCACTTAAAACTGCTTT
-TTTTTGCTAAAATCCCGAATTTTTCAGAGAAAAATAATTCAAACTCCATT
-TTTCAGCTGTAAATGTGCTCCGGATCCGGTGCAGCCGACGTCTAAACTCC
-TATTATGCGACTATTCTTCGAAAAACACGACAATTACACCTATTGCGTCG
-TCGAATTATGATCAGGTTGCTAATATTCGGTGAGGTTTTTTGATTTTTGA
-ATGAAAAATTTGAGAAATTTTTAAAAATGGGAAAAAATGTGATTTTTAAA
-TCAAGATATCGGAAAATACGAAAAAATTTCCAAGAAAATGGTGGTTTTTA
-TCGAAAAAATGTTAAAAATGCATAGAAAATTTGGATTTTCGAGTTCGAAA
-TTTTCTGAAAACAAAAAAAAAAGTTTTTTTTTACACTAAAACATTAAAAT
-TGGATTTTTTTTTCCGAAAAACATAATTTTTCAATTTCTAACAGTAAAAA
-GCTCACAAAATTCCTTGAAAATTGACAAATTTAGTATTTTTTACACGAAA
-AATGCATTAAAATTGAATTTTTAAAACAATTTAAACTTAAAATAAAATTT
-TCATTTATTCTACACGGTAAATGTATTAAAATAATTAAAACTTCGAAATT
-TTAAATTAGAAAAAATCAAATTTCCTCCTTATTCTCAATTTTTTTTTACA
-GCAAAATTTCAGTTGAATTTTCCCATAATTTTGAATTAAAAATGTGTTTT
-ATTCCAAAAAAAAACTATTTTACAACAAAAAACTAGATTTTTTCCCAATT
-TTCTATGAAAAATTTAATTTACCAATAACTTATTTTCTTTTTCCAGATCA
-CTATTCATATCTTGTGATAATAATAATTTCCAATTTCCGGATGCCTACTT
-CAAGTCGTTAACCGCGTTGCATCATCTGCGGATAGTGGTGAGTTTATTAT
-ATTATCAGCTGTTCTCTACAGAACATCTGCTTTTTGCGTGTAAATTTAGA
-GGTCAATTTTCGGAAAAATTGGAAAAATTGGCCTAAATCTCAATTTGAAG
-TAGATTTTCACGTGTTCAAAAATGTTCAAAAAATTCAATCAAAAATTCGA
-TTTTTGGAATACTTCAAAAAAATTTAATTTTCTTCGAGAAAACCGGTAAA
-TTACAAAAAAAATTCGTTGGCGATTTTTTTCTGTAGTTTTCCAGAAAAAC
-AAACGAAAATTTTAATTTTTAATTTTTAAATTTTCCAAAAAAAATTTTTA
-AAAATTCATAAATATGTCCATTTTAATTTTAAAAATATCGGAAAATATTC
-AAAAAATGAACTTTTCTATCGAAAATTTAACAAGAAAAAATTACGAAAAG
-TTCATTCAAAAAATTAAAATTCTTCTATATCTGAGGAAGGCTAACAGTAA
-TTTTTTCCCATTTTTTGACTCTTTGAGCAAATAACCGTATCACTAATTAC
-CTTAACCATCAAAAAAGAAAGGTGTGCCTGTCTTCTATTCATCCTCCTCT
-CGACACCAAATTCTTAAGAAGAGCCCCCCACTCGGATGTCTCTAATTAGG
-CACAAATGTTACGTCATTTTGTCATTTGTACGGCCACAGATGACCTCCGG
-TGTGCTTGGAGGACTGCGAGAGAGGAGGATTAAGGGGATTTTTATGTCCT
-ACAATTGATTTTTTTAGGTCAAAAGTAGGGATTTTAAGGCCAAAAATAGA
-GATTTTTTAGGTCAAAAGTAGGGATTTTAAAGCAAAAAAAAAAAATTTTC
-GGCCAAAACAGTGGTTTTTAAGGCCAAAAAATTTAATTTTTCCGTTTATG
-ACACCTAAAATTGGGGTGAAATTTTTTTTTCGGATAGAAATCTAAAATTG
-CAATTGTTAATTATTCCAACATTTTTTTTTGCATTAAACGTTATTGTAAA
-AACATTGAAAATCACTTGATTTATCCGAAAATTTCATTTATTTCAGATAA
-ATATTGTTTAATAAAAAATGTGTTAAAAAACATGGTGCATAGATATATAG
-ATAATTTTGTAGAATAATTGAAAATTGCAATTTTTAACTTCCTACCCGAG
-TAAACAGAATTTAAATCCAATTTTAGGTGTCATAAACGGAAAAATCCCAA
-TTTTTGGCCTTAAAAAATCCCAATTTTTCGGCCTAAAACTCCCTAATTTT
-GGCCTAAATCACCCTATTTTTAGCCTAAAAAAGTCCCCTGTTTTTCCATT
-TTCCCCAGGAACTCGTAGAAGAACATGTGTTAGGCGTGAAGAGGTTAAGC
-CGATTAGCCATGTAATATTCAATACTTGAGTATAGAAGGGCCAGAAGCAG
-CAGCAGCAGGGGGTGCTCCAAGAGCACCACCTCAACAGATGTATAAAGTG
-GTTTTCGAGTAGATTTGTGGTTTTGCACACGGTGGAAGAAATCTGAAATT
-TGAATTTTTTAAAGCCATTTTTGTGCTGAAAAATGTACAGAATAACCGAA
-ATTTCACCACCCTTTAAGGTACGGGAAATCTCCGGGAAAAAGGCTCAAAA
-ATTGCATAAAAATGGAGATTTTAAAGCTAAAAATAGCTATTTTAACAAGT
-TTTTTTGCAGGGATGCGAGACCACACATTTCTCTGTGAAATTGTTCGAAG
-ATTTGGCCGCTTTGAGAAGATTGGAACTCGATCAGGTACATTTTTCTTGG
-AAAATCTAGAAAATTTTGCTGAAATTGGCTCAGAAATGTCCTAAATAGTA
-GAATTTTTCATTAAAAAGCCTCTCAAAACGGCTTAAAATTAAGTAAAAAT
-CGACATTTTTTCACAGATCTCCACCGCCTCAACCTCTTTCGAAATGACCG
-AAGACGTCCTAATGCCGTTGGCTCGTCTCGAAAAGTTTTCCCTCACGAGA
-TCACGGAATATCGAGCTTCCACAGCGACTTTTGTGCTCTCTGCCGCATTT
-ACAGGTATATTTTTGGGTAATTGATAATTCGCCAAAAAGAACAGCAGCCG
-AAAACTCAAATTTTTCACGAAATTTGCCGAAAAACTAGATTTGTAAAATA
-AAAAGAATGCAAGAATTTTTAGCTTAAAAATCTCAATTTTGAACGATTTT
-TAAAGCAATTTCAGTATGAAAAATCCAGATATTTTTTGGGTAAAAATTTG
-GTGAAAACGCGTTAAAATCTGCATTTTTGAACGAAATTCGCCAAAAATCA
-AGACTTTTGTAGTGCATTTTACTGTAAAAATGTATACCTATTTTCTATTT
-TTATGCGTACTGCGCAATATATTTGACGCGCAAAATACCTCGCAGCGAAA
-ACTACTCTTCAAATGACTACTGTAGCGCTTGTGTCGATTTACGGGATCGA
-TTGATAGAATATCAAAATTAGAAATAAATGGGAAACTACTGCGAAAACAA
-AAATTTATTTCAAAAATTGAGTCCGTAAATCGACACTACAGTAGCCATCT
-AAAGAATTACTGTAGTTTTCGCTACGAGATATTTTGCGCGTCAAATGTGT
-TGCGCAGTATGCATTCCCATCTTGTTCTCTACATTCAATTACCACCACAT
-CTCACAGAGAAGGAATTAGTTGTTTATTAGTACGTGGGGGGGGGGGGGCT
-TTAAAGCTTACTACTTCTTCTTTCTTTCCACTTTCTGACGTTCAACCATC
-TGGTATTCCTGGCGGCGGGGCAATTGAAAATGAGAACAAAAGGACATCGA
-TGGAGGGAGGAGGATTGAGAGTTTGGAAATTGTGAAGAATGCGCGCGGAA
-GGAGGAGGTCAAATATCACAAGCGCCGGAAGTTGTTGTCAGCCAGAAGCA
-ATAAAGGCCTAATTATGATGATGATGAAGAACCTCCCTGAAAGAGAATAG
-CGAAAATGTGAAGTTTCCATCTCAAGGGAGCGATTTTTTAGTGATCATGG
-AGTCTTGAAGTGTGCACATAGTCTACGTGCCCCACAAGAGCCTATGCCTG
-CCTTATGCCTACTCACATGCTCACAGCCAAACTCTTTCGAAATCAGAATT
-CTACATTGTAGAATCTACAACACTGAAGTTTCTGCCATAACGTTGAAAAT
-AGGCACCTACGCCTGAATACGTGCCTGATCAACATGGATGCCATATAGTC
-CAGGCTGTATAGTCGTAAAACAGGGATTTTTTAGGCTCATGGGTTTTTGT
-CGGAAAAAATCGAACATTGAGAAAACCAGAAATTTTTCAAATTTTCGTAT
-ACTATTCCACGAATCGTTTCTCCCGTTTATCGAATCTCCACGTCGCACTG
-TAATTTTTCAAGTATCGTTAGTCCATTCGCCCGAGAAACTCCACAGTTAC
-AAATGCTTTGCAAGCATTTTCAAGAAACCATGGTTCCTGGCATGTTTTGG
-CGCATTCAATAATGCCGCTAATAATAATAATAATGCCTCCTATTATGATG
-TCGCGTTGTCATCGTTTGCTGCTGCTCCGTCAGATACTTTATGGGGTTGT
-TGTTTTCTCCCTCCGCATCAAACGACGTTCCTCTCTTCAAAATGATGATG
-GATATACATATATCTATGTTTATAGAAGAATTGAACCCCACACTTTACAT
-ATGAATAGATGGGGACCTTGTTACCTTGACTATCGGGAAGAGATTGAAGG
-TTCCAAAGACGGCTGGCTGTGGCTCATTAGGCTAAATGATGCGTGATATT
-ATTCGCTCTACGGCACCTCTATGATCCAGGAATAGCAGTCACTGTCAACA
-AGAGTCACCTCACGGCAACAATACTCCGCTAATTACGGTTTGCGGCAAAT
-CCCAGAATTTATTTGAAATTCTAACTGGGTGTTGCAGATGGGTCGAGGAA
-ATATGATAGCAATAATTATTGTTACGTGGCAATTGTAATCCGTCAGATAT
-CGTTTCGAGACCTGCTGACTCAAGAATGTGAAAATGGACAAATTTGGAAA
-ATAGGTAGCGGAAAATTTTCGCAAGTTTTGAAAATTTCGGTCATGATACG
-ATACGAACTCCTTGATTTTCACAGCCCGACAAGCCGTACGCGTACGCAAT
-TTGTCTACCGTATACCTGAACGTTCAGGCTCGTCTATCTCGAAAACAGTT
-GGTCCAGCCTTTTTGTGGGGCATATAAAAAAGGTCAGAACATAAATTCTA
-AAATTTTTTGGACCATAGCTTGTTTCGTTATCACGCGCCCAAACCTGATC
-TACACTCAAATTATCAGTAGAGCGCATTTGCATGGATGTACCACTTGCCG
-GGCCGTGATTTTGAATGGAATATTAAATTCCACGTCACTCTAGTGAATCT
-CCGCTTCTCAATATGCTTCATAATTCATCAAATTCAATTCATTTTCGGAT
-AAGCCAGTTGTAAACAGTTGTGTGTGTGTGAGTGAGCTCATCCTTCATAA
-AATGAATAGAGATAGAACACTGACACTCTCTCAAAGACAAGAGGAATTAA
-TAAATATGAGAGCTCATTAGCTGCTCTTCTCGTGACTACTAATTAGGAGG
-GTGGTACATGAAACAGTGTATGTGTAAAGGGATCCCCGCCGCCGCCGCCG
-CCAATGTCTTTCGGTGTATGGCAATATCCGAGTGGTGTTCTCATTTTGAA
-GAGAGTATTAGGATGTAACGTATCAACTGGAGAGAGATAGTTCAAAGATT
-GGGGATTTGAGATATTTTAGGTGTCGAAATGGATGAAATATAAGCATAGG
-GAGGAAATAAATAGAAAACGATATACTTAAATAGCAATAGTTATTTGAGT
-TCTTACTGTAGTTTTCGCTAAGAGATATCGCGCGTCAAATAAAATGCTCT
-ACGTACGCATTCTCATGATTTATTGTTCCCGTAATATAAACATAGCAAAC
-ATTTTTAATGTTTAAATATTCCTCAATGCTATTGAAATTCAAATTAGTAC
-AAAGAAAGCAATTTTTCGATTTTTTTAACGAGAAAACTAAGTTTTCATCA
-AAAAATATGTAGATTTTGATGAAAATAATATGACAATTTATTTAAACCTA
-TATATTTTTTTGTCCAAAACAACTTTACGAAAAAAATTTTTTTTTAAATA
-AAATTATTGGATTTTTCGTCAACTTTACGATAAATTCCGAAAAATTAACA
-ATAAATATAGGAGAAAAAAATCCGAAATTAACGAAATCCCCTGTTCCAGG
-TTCTGAATATCTCGTCAAATGAGCTTCCATCACTGCGAAGAGAGGAATCG
-TGTGTCGCTCAGCAGCTTCTGATCGTCGATTTGTCTAGAAATCGGCTCAC
-CAACATCGAGTAAGGGATTTTCCGGATATTTTATAATTTTGATCTTTAAA
-AATTTCAAAGTTTGTGAAAATGTGAAAATCTAAAAATGTGGAACAAATAT
-TGGTTTTATCTATTTAATACCCCAAAACTTTGAGATTTTTCCGTTGAAAA
-ATCGAAAATTCGAAAATTATCTCAAAAATTTCAGGCAATTCCTACGTGGC
-ATCCCGGCAATCCGGCAAATTTCGGTGGCTTACAACTCGATCGCCGAGCT
-CGATTTATCGCTGGCAACTCCATTTCTACAACAACTCGATGCTGAAGCCA
-ATCGAATCGTCGACTTGACGTCACTTCCAGGCACTGTTGTACACGTGAAT
-TTGGCTGGAAACGCGCTGAAAAGGGTGCCGGATGCGGTAGCCGAGTTGGC
-GAGTCTTGTGGCGTTAAATGTGTCGAGAAATGAGATTGAAGCCGGAAATT
-CGTCGGTTTTTTGTGGGTTTTCGGATTTTTTTTTGGAAATTTGAAATTCG
-GAAAAAATTCAATTTTTACATACAATTTTGCGTATTTTGATCATATTTGT
-TTTAAAAATCGAGAAATTTAAAAAAAATCAAATTTCGCTTATTTTCATTG
-GAGAATACATGAGAAAAATATTTTTGTTTCGAAAAAGAAAAATAGCCAAA
-ATTTAATGCTATTTTTTCGAAAAATTTCGATTTTAATTTTTGAAAAAGTA
-TTGAATAATTTCATCAAATTTGTTTTATTTTGATGAGAAAATACGTGAAA
-AATGGAAAAAAAATATGAAAATCTTTAAAACAAAAAAATAATCAGATAAT
-TATGCAATTTGGCCTGAATTTTCAAAAAAAAAACTTGGATTTTCGAAAAT
-TTCATCAAATTTTGTGTATTTTCATGCAAAAAAAGATAGGAATTTCCAAT
-TTTTGACCTTAATTGCAAAGAAAAATTCCTAAAAAATTGTAACGTTTCAA
-AATCTCGATTTTCTTCTGAAATTCTCAAAATCTTCATATTTTTCCAGCTT
-CCCCAGAACTCGAAATGCTCGACGCCTCTTACAACAAATTGGACAGTCTG
-CCCGTCGAATGGCTTCAAAAATGCGAAAAACGCATTGCTCACCTCCATTT
-GGAGCACAATTCGATTGAGCAGTTGACTGGTGGAGTGCTGGCGAATGCGA
-CTAATTTACAGACGGTTCGTAGACTTGTTTTTTTTTTTTTTTGAAAAAAA
-ACACGCTGAAAAAATCTAATAAAACCCAAAAATTTGCATTTTTGTTTAAA
-AAATATGAAAAATTGTTCAAATTCCTAGTTTTCAATATTTTCAACAAAAA
-AAAATTCTAGAGCTTCCATGGTAGGCAGGCGCGGTTTCAGGGCCTGACGC
-CGACCTTTCGCCTCTTTTTTGCATTTTTACGGGAATTTTCAAATTTCTAA
-TTTTCCCCATTTCTATCAAATTATTGAAAATCAAATTAAAAACGCGAATC
-GCGTATTGAGGCGAGAGGCACGCAGAGGTTGCCTTAAGGTCAGACAGGCA
-AGCTTTTTAACGCCTAACGTAATTTTAAAACCTGAAACATTAGAAACTTC
-CACACGTTTGTAATTTCACTGAATTTTACTGCACCTCTTCATAAATTCAA
-TGTATTTAGATAGTGTAATTTTTAAAGGTGGAGTGCCGAAATTAAAGACT
-TTGCTTTTTTAGACCAAAATTGGTCCTAAATAACCGAATTTCGTAATGAG
-ACTTTCTGAAAATTTCTCAAAAAAAAGTTATGGCGGTTCAAAGTTCGGGA
-AAATAAGGTCAATTTTCAGCTAAAATCAAAATTTTTAAAATTTTTTATTT
-ATCACTTTTTGATAAATATTGTGGTCTTTGATTAGGCGGGGCACCAATAA
-AAGTTACATTTTGTGCCCCACTGACCATGAATGTATTTAAATCAACGAAT
-AAACGCCTAATCAAAGTATTTATTAAAAAGTGATAAATATAAAATTTAAA
-AATTTTGATTTTAGCAGAAAATGGGCTTTTTTTTCTCAAACTTTGAACCG
-CCATAACTTTTTTTTTGAGAAATGTTCATTACGAAATTCGGTAGTTTTGG
-ACCAATTTTGGTCTAAAAAAGCAAAGTCTCAAACTTCGGTACTCCACCTT
-TAAAGAACAGTGTAATTTTTTTCTATTTTCCAATCAGTGCAACTCTAATA
-GCAACTCTAAACTTATTTCAATAAACTCTAGGCACAGTATTTTGAATAGG
-CGATCGCGTGACAGTTTTAACCAAACATAGTCATGATGACCTTTTGTCCT
-TACAGAATCTTCTCAAGTTCATGCACACACAGGTGTCATTTACTCTGTCA
-AGTATTGTATAAGTGTGATCCCGAGAGTATTATAAATGGTAGTTAGACCA
-CCCTTATGGTTAAGTTGTTCGTATAATTGTAGGGGTGGGGATCTTACCAC
-ATTTATACGGCCCCCCTCCTATTGTATTGTATTGTTGCCACCAGTCGTCT
-TGAGAATCTCTTTCAATCCGGGGTGACAGAAGGTGTCATATTGTCGGAAT
-GTGTAATAGGTGGGTCTCGAATGGATATCACTAACAGCTGTGAAGGGATC
-CGAGAAGGGTTTTCGGTCTTTCTAGGGGTTTAACTTTCCGCTGTCAATAT
-TATTAATCTTACAAGGAAAGGGTTTTAGTTTACCGTCAGACTTTAAAACG
-AGACATGTGTCATTTGAAAGTGTTCCATAAGTGTATGTCACTCCAAAATT
-TCAAGCGGCAAAGCTCCAGTCTCAAACCCTCTAGCATCGATCTGAAAACG
-TTTCAGTGCATTTTTCACTACTTTGAGGCAAGTAGAATTTCTCCAAAATG
-TTTTTTTTGCAAATCTTCAATGTTTTTCAGAACGTTTAAAAGAAGGAAAA
-CAATCTGGAAAATTTTTGGAAAATTTTAAATTTTTTGAAAAAAATCTGAA
-ATTTCTTGGACCTGGTGGCGTGAAGAAATGTTCAGATTTTTTTCAAAAAG
-CTTAAAAATTTTCCAAAAATCTCCCAGATTGTTTTCCTACTTTTAAATGT
-TCTGAAAAACATTGAAATTTTGCATGTTAGTACGATTTGATAATCGTGTT
-ATAATTACATTACACATACATAATAATCAATTGAAATATACAATTCTTAA
-TTATAACCTGAAATTGAGATTAGATACCTTAGACAATACAACAAATAAGA
-ATGTGATCGATTCAGCAGACCCCTATTTGTGAAAAATGCCTTCTAAATTT
-TATTTTACACTTCTCCTAGTAGATGAACAGCACCTGCCAATAATTTCATT
-GACAGCCGGATGGTTTTTGGCTCCTCTAAGACAGTATAATCCCGTCTCCC
-CCGGGGGGAAGTGGTGTCAAATTGCTTTGCGGAGCAGGTGCTTTTTTCTG
-AATCGAATTGGCTTATTGGTGACGGAAAAACCCCTAATAGAATTGATACA
-ATTTGGTTTTCAAGAGGATTTGGGGAAGGGTTTAGAGGGTAATTGAAACT
-GAGTAGATCTTCGTCTGTCGTGGAGATCAGAAGATTGAGGGAAGTACTGG
-GTTTAAGGGGGTCAAGGAGTACTGTAGCGCATTTCGAATACTACTTTAGA
-TAGTTTAGGTATTATATCAATAGGATAATATATTATCAAGTTGCACCAAA
-ATTGGAGATTCTAGTAGTGCATTTTCTTTATATGCTAGGTATGTATAAGT
-TTCTAATAAGTGTATATACCTACCATGTACCTAGGGGGAGTAGAGTTTGT
-GGGTATTTTGCTTAAATAGACTAAAACGTGTCCAAAACCACCGAATTTCA
-AAATGAGACTTCACAAAAAATTTCCAAAATTTTTTTTATGGAAAAAAGAG
-CAAAATTTAACTAAAATCCGAAATTTCGCACAGTTTTCTTTGTCACAGCC
-GCTGGATTTGAATTTTTCTGAAATTATCACCCTTTAATCCTTATTTTAAT
-AATTTATCTCGCGGAAATTCGTTGATTGAGACAACTTTTAGGCCGATAGG
-CATCCCATCTTGATCATTTTTGGATGCCTATCGGCCTAAAAGTTTTTTAA
-TTTCAGAAAAACTAAAATCCAGCTGCTGTGACAAAGAAAAGTGTGCGAAA
-TTCCAGATTTTAGCAAAATTTGACTCTTTTTTTTCTCGAAATTTTGACTC
-GCCATAAAAATTTTTGGAAATTTTTTGTGAAGTCTCATTATTAAATTCGG
-TGGTTTTGTACCAGTTTTAGTCTATTTAAGCAAAATACCCACAAACTATT
-ACACTTTACTTTAACAAGACACACAATAATTCACAAATGGTGTAGTATCA
-TGCCGGAATTTATATAGGATTGATTCTTGAAGAACGAAATTTTAAATAGA
-TTATTGCAGACTATGTAACACTATTTGTATAAACAATTAACATAGTGTAT
-TGAATAATGACTTTATTGAAATTAATACAGTTTTTGATATACCCATCTTC
-TATTAGTATATCATGCAATACTAATAGGTAATATGCAATATCACTTTAAT
-TGTTATTTCCCATGCGTCGTGTTTATACAAATGCTTTATATACTCGAATA
-GTCTATAATAATCCAATTAAACTCGAGAATCCCAATACAGAATATAGTGT
-TTACCAAAAACACTTGTGTTATTATTCTAATATACATGCACACACACACC
-CACACACAGGTTTGACACCAGTTCTACTAATATTTGCATAATACCATTGA
-GATACCTGAAGTACCCTATAGATATGCACGGGATTCGTTTCGGGCACTGC
-CACGGAAAATATTGAAAAAGTGTGGTAAATTTACGAAAAACAACAAAAAA
-AATGCGATTTTCCAGAGAAATACGAAAAAAAAGAAAAAAATATTTAGAAA
-ATTAACAACAAAAAAAAAAATTTTTTTTTATTAAATAATAAAATGTGTTC
-ATTCTGTTTTTCCCCTTTCAGTTAAACTAGGGCTTCCATGGTAGGCAGGC
-GCGATTTCAGGGCCTGCCTGAAACCTGCCTGCTTCACGCCGGCCTCAGGT
-CGCCTTAAGACGGCTGCTAAAAATTTGAAAAAAAAATTTCAAAATTTGAA
-TTTCCGCGCTTTTTTCGAATTCCTAGAACGCTTTTTTTTAATTAAAAAAA
-AATTTCAGTTGGACCTTTCATCGAATCAACTTCGAGTTTTTCGAGACGAA
-GTACTTCCGGAGAATTCGAAAATTGGAAATTTGAGACTTTCCAACAACTC
-TTTGGAGCTCCTCGAGCCGTCGAGCCTGAGCGGCTTGAAATTGGGTAATC
-TAAATTTATATGAATTTTGCAAATTCTAAAAATCCTAATTTTTTCTAGAA
-TCCCTTGATCTGAGTCATAATAAGCTGACAGAAGTGCCCGCCGCAATTGG
-AAAAGTCGAGCAGCTGAAAAAAGTGGATTTGAGCCATAATAGAATTGCGA
-AGGTTTATCAATATGTGCTCAATAAGATTAAGCAATTGCATACTGTTGAT
-TTGTCGAATAATCAGTTGCAAAGTGTGAGTTTTTTGTTGATAAAAATTTA
-AAATTTGAATTTTTTCTTTTTTTTTAATTATTAATTCTGAAAAATTCAAC
-GAAATTTCCGAAAATTACTTGAAATTTAAATTTTTATCCAGAATTTAGTC
-TATAAAAACGAAAAAATACGAATTTTCGATTAAAAAAATTAATTTATTTA
-AAAACACACTTTCGAAAAAAATTTTGAATTAAAAAAAATTTAAAGTTCCT
-TAAAAAACTATTTCCTCAATTTTTTTTCTGAAATTTCACTCTTTCATTTT
-TTAATTCATTTTTTAAGTCTATAAATACGAAAAAACACGAATTTTCGATA
-AAAACACATTTTTCAAGTTTTTAAAAATAATTTTAAATTGGAATTTTTCT
-TTAAAAAATTGTTTTTTATAAAAAAACACATTAATGCATTTTTTAAAAAA
-TAATTTCTTGAAATCTTCCAAAATCGGTTGTAATTTTAGCGAAAATAACT
-ATTTTTTCCAGTTTTTATTTAAAAAATCCCTCGAAATTTGAATTTATCCA
-GAATTTAGTCAATAAATGCGAAAAAATACGAATTTTCGATTAAAAAAATT
-AATTTATTTAAAAAACACTTTCGAAAAAAAAATTTTCAATAAAGAAACTA
-GTTCTTAAAATTTTTTTTCTGAAATTTCACTTTTTCATTTTTTAATTCAA
-AAAATTTGAATTTATCTACAATTTACTCTATAAATACGAAAAAAATACAA
-ATTTTCGATGAAAAAACACAATTTTCAAATTAATAAAAATATAATAAAAA
-ACATATTACTAAATTTTTAAAAAATAATTTCTTGCAATTTTCCAAAACCG
-GTTTTAATTTTAGCGAAAATAACGATTTTTCCAGTTTTTATTTTAAAAAT
-TCCCTTGAAATTTGAATTTCTCCAAATTTTTTCTTGAAGTTTTTAAAAGT
-TCCATCATTTTCTACTGGAACTTTCAAAAAATGTTCCTTAAAAAATCTCT
-AATTTCCGCTAATTTCTACGTAAAATTTCAGCAAAAAAACAACGACATTT
-CATGTTTTTTTGTTAAAAAAATAATTTTCTTGAAAATTTCTTTGGAATTC
-GATTTTTTTTGAGTTTTAACCCAATAAAATGTATAATTTAAAAATATAAA
-AATTCCAGATCGGCCCCTACATCTTCTCCGACAGTTCTGAACTTCATTCC
-CTGGACGTGTCGAATAATGAGATTTCACTGCTGTTCAAGGACGCTTTTGC
-GAGATGCCCAAAGCTGAGGAAAATTTCGATGAAAATGAATAAAATTAGTG
-AGTTGAAGCACGAAAAACTGCCCAAAAATTAAAATTTTGAAATTTTTGTG
-TTTAAAAACCTAGAAAATCGAGATAAAGTAGGCTTAAAGTTGCTCAAAAT
-CCGCAGATTTTTTGAAATCGATTTTGAAAAGTGCACATGGAGCTAAATCA
-GACTTCAAAATTCTCAAATTAATTGCATTTTCACTCGAAAACCTCTGAAA
-ACTGCCTTCTTCCTATATTAAATCAAATTTTCTTTCAGAATCCCTCGACG
-AAGGTCTCACAGAAGCTTCCGGCCTCCGACGTCTCGACGTATCTCATAAC
-GAGATCCTCGTGCTGAAATGGTCGGCTTTACCTGAAAACTTGGAGATTCT
-CAACGCTGATAACAATGATATCAATCTCCTGACCGCCGCCTCAATGTCCC
-CAAGCACCGCAAACTTGAAGTCCGTTTCGCTTTCCAACAACGGCATCACC
-ATAATGAATGCGGACCAGATTCCGAATTCGCTCGAGTCGCTGGACGTGTC
-GAATAATCGACTTGCAAAGCTCGGGAAGACAGCGTTGGCCGCGAAATCTC
-AGTTGAGAAGGCTCAACTTGAAGGGCAATCTGCTTACCGTAGTGGCCACC
-GAGTCGATGAAAGTCGTAGAGGCTGTGCATCCGTTGAAAGTGGAAATCTC
-GGAGAATCCTCTGATCTGTGATTGTCAGATGGGATGGATGATTGGTGGAG
-CGAAGCCAAAGGTTCTCATTCAGGACTCTGAAACCGCAAGCTGTTCCCAT
-GCCGTTGATGGGCATCAGATCCAGATTCAAAGTCTCAGCAAGAAGGATCT
-ACTGTGCCCATACAAAAGTGTATGTGAGCCGGAATGTATCTGCTGTCAAT
-ACGGAAATTGCGATTGCAAATCCGTATGCCCCGCCAATTGCCGATGCTTC
-AGAGATGATCAGTTTAATATCAACATTGTCAGATGCCACGGGAACTCATC
-AATGGTGCCCAAAAGAGAATTCGTGGTCTCCGAGCTCCCGGTCTCTGCGA
-CAGAGATCATTCTGAGCGGAGTCACCCTTCCACAGCTCCGAACTCACAGC
-TTCATCGGAAGACTTCGTCTCCAGAGGCTTCATATCAATGGAACCGGGCT
-CCGATCCATCCAACCGAAGGCTTTCCATACTCTTCCAGCACTGAAGACGC
-TGGATTTGTCGGATAACTCGTTGATCTCGCTGAGCGGGGAGGAATTTCTA
-AAGTGTGGAGAAGTCTCGCAGCTTTTCCTCAATGGAAATCGATTTTCCAC
-GCTATCCCGTGGAATCTTCGAGAAGCTTCCGAACTTGAAATATCTGACAC
-TTCATAACAACTCCCTCGAAGACATCCCTCAGGTTCTTCACTCGACGGCG
-CTCTCCAAGATCTCCCTGTCATCGAACCCCTTGAGATGCGACTGCTCGGG
-AGGATCCCAACAGCACCTTCACCATCGTCGTGACCCAAAAGCTCATCCAT
-TCTGGGAGCATAATGCGGCCGAGTGGTTCTCGTTGCATCGGCATCTTGTC
-GTTGATTTCCCCAAGGTTGAATGCTGGGAGAACGTGACGAAGGCCTTCCT
-GACGAACGATACGACAGTGCTGAGCGCCTATCCACCTAATATGGGAAATG
-ACGTCTTTGTGATGCCTATTGAAGGTTGGTTTAAAATTTTTAAAAAAACG
-CGCGTCAAATATTTTAAAGTCTTTTGTTCGAAAAATAACCATTTTACAAT
-ATGTAGGATATATCTATAACAGCTACTGTAAAAACTCCAGATGTTTGAAT
-TTTTTTAAAAATGCGACGTGGTAAATATTATATTGATTACATATTATTAT
-TACAGTGTATTTTTTTCCACTTCTACGACTTTAAAGGGGGGCGCATTTAC
-GCGCGATGGTCCCAGCATTGGTCTCGCCACGCACCCCAAAAATCAATGGG
-TGGCGCGTGTCGAGACCATCGCGCGTAAATGCGCCCCCCTTTAAAGTCGT
-AGAAGTGGAAAAAAATTCACTGTATAATTATTAGTCAAATGATACTTATT
-ATGATATTAGAAATTAAAAAATTAGGTTTGAACATTTTTTTTCCTCGATT
-TTTTTACGGTATTTCACCATGTATGCGTTATAAATACAAATATGATCCCT
-ACCTTTTTATAACTTTAAAATAACTTTTAAAAAGGAATATAATACATGCA
-CAAGCACCATAAAATTTCAACGTTTGCTTTTTCTGGTCCGAAGAATTTTT
-TCAATACGTTTACTTTATATATCACATATACAAACAATATACTGAGAATG
-CGTATTGCGCATTATATTTGACGCGCAAAATATCTCGGAGCAAAAACTAC
-AGTAGTCCTATAAATTCCTACTGTACTGCTTGTGTCGATAGAATATTAAA
-ATTGCAAAAAAAATTTAAAAAAACGAAAAAAAAACAAAGTATAAGGGAAT
-ATATAGCTATTCCAAAATAAATCAATTTCAAAAATCGAGCCCGTAAAAGA
-GAAGGACTTACTGTAGTTTTCCCTACGAGATATTTTGCGCGTCAAATATG
-TTGTGAAATACGCATTCTGAAGATGTAGTGTACTCGTAATATATATTTTT
-TAACAATTCAAACATTTCCAGAATTCCTGCGCGACTACAACTCAACAATC
-TGTGTTCCATTCTCATCTGGATTCTTTGGACAAGACCCTCAGAATAGTAT
-ACTCTTTGTAATAATAACTATATCGATTGCTGTTCTCCTCTGTGTCCTCG
-TTATTCTCGCAATTTCATTTATTCGAAAATCTCACGACGCAATCAATCAA
-CGAAGATACAAAGCATCATCTCTAAATTGTTCAACATCAGCCGGCTCGTC
-GCCTCTTCCGGTTCCGCTGTTGAGTTATCACGCATTTGTGAGCTATTCGA
-AGAAGGACGAGAAAATGGTGATTGATCAATTGTGTCGACCGCTGGAAGAT
-GAAGATTATCAGTTGTGCCTGTTGCATCGGGATGGGCCGACTTATTGCTC
-GAATTTGCACGCGATATCTGATGAACTCATAGCTCAGATGGACTCGTCGC
-AATGCTTGATTCTTGTGTTGACTAAACACTTTTTGGAGAACGAGTGGAAA
-ACGCTGCAGATTAAGGTAACAAATTCAAACTTTCAGTTTAAAATTGATAT
-ATTCGTAAAAATAAGATGTTCTTAAAAATTCTGAGAATGCGTGTTGCGCA
-AAATATCTCGTAGCAAAAGCTACTGTAATTATTTTATATGACTATTGTAC
-CGTTCAAAATTACTATCCAAATATTTGATTTTTTGTTTTAAAAAATTATT
-TGGAATTTACTCAAATATTGAAAACAATATTATCGAAATTCCAGAAAATT
-TGGTGGAAATTCCGAAAATTTCAATTTTTTCGCTAATTTTCGAGAAAAAA
-AAAATTAAAATTTGGATTATATGAAATAAATTTCCAAACATTAAATTAAA
-AATTTTTTTTTTTTGGATTTTCCAATCTCGAACCTTCAAAAATTGAATTT
-TTTTGAAATTTTTTTTCGGAAAAAGTAAAAAATGCTCGAAATATCGACAA
-AAAGTTGAAGTATTTTTTTTTGTAAAATTGGAGATTTTTGAGATAAAAAA
-TCTGAATTTTCATTCAAATCTTGAACATCAAAATCAGCAAAAAAAATTGC
-TATAAATTTATTTAAATAAGATTTAAAAAGAGTAATTCGCTATGATTTCA
-AATTTTCAAAAAAAAAAATTTTTTTTTCAAGTTTTAATTTTTGAACACTA
-TCAAAAAATTTATTTTTAAACCAAAAAAATTCCGAATTTTCTGTAAAATC
-TCAAAAAAAAAACATTCCTAGAAATTTAATCGAATATGATTTAATAATAC
-TATTTTTAAATCATATTCAATTACATTTCTAGGAATTATTTTTGCTAGAT
-TTCAAAAAGTGTATGAAAAATTAAAACTTTTTGAAAAAAAAACTGTTCTA
-AATATAATTTATAACACCAGAAATTCACTAATAACACTCCACATTTTTCC
-AGACCTCCCACCAACTATTCGCCAAAAACCGTGCAAAACGAGTGATCGCC
-GTGCTCGGCGACGGTGTGGACGCGAATCTGCTGGACGATGAGCTCGGACA
-GATTCTACGGAAGCACACGAGAATCGAGATGCGGAGCCATTTATTCTGGA
-CACTTTTGCACTCATCACTTCCATCACGACTTCCATTACCATCGAATAGT
-GGCGATGATTCGTCTCAACTATATTCGGATATCTATGGAATTGTGCCTTC
-CGATGTTGTTTAGCTTACAGTTTTCCCGTTTAGGTCACAGTTTTTAGTAT
-TTTTTTTCCTCTTCCAAATGTACGAGTTTCCATTATTCACGAGGTTTCTT
-TTTCACCCCCAATTCTTCTGTGCACAATTTGCCATTTTTTGAATTTTTAC
-AACAATACCGGTACTATATTTTTCGATTTTCTTTCTTTTTCTATGAATCT
-TGCCATCATTCTCTAATAATTGACCAGCGATTATATTTTTGATTTAATAA
-TTGAATATTCTCGTTTTTCAGTTCAAATTATTGCTTTTTTCTGTCACCAC
-AAATTCAAATTCTCGTCCTACCCTGTGTGATCTTCTGTAATATATATATA
-TTAATAATCGTCGTTTCTTCTTGTTGTCATTTGCGGATGCTTATGAAGCT
-TGTATTTTAATTTTTTGTTTTGTTTTTTTTCCTGTTTCAGCTGCAAAAAA
-TTCGGTAGAAATTCTTGAAAACACGCAAAAAATGAATAAAAAAAATAGTA
-TATTAGCTTGTTCGAGAGGAGTTCACAAGCGGGTGGCCTAACATCTCCGC
-GGCCGCCCAGTGGTGTACTCCTCTCGGGTGAAAGAATTCCCATTTTATCA
-TCAGTTTTTCGGCCTATTTTTTCAGTTTTTCTCAACTAAATAGTCAATTA
-TCTCTTAAATAATGTCGAAATTAATTTAATTTACACATTTTTCCAATAAA
-ATTCCAATTTTCGGTCATTAAATTACCCCTTTCGAATTTTGCTCTCAAAA
-ATTAAATTTTCATCGATTTTTAATTCTCAAAATTCTTGAATTTTCAGCGA
-AGATGGGCAAATTCAGCAATCAGAAGAAAAATCGTGTCAAGAACAAGGTG
-GCGGTGACAGTAAAAAAAGCGCAACGCATGAAGGCAGACGCTAAAAATGC
-CAAAAAAGACGGTGAAGTGGATGTTGAGATGAAGGAGGAGGTGGTGAGAG
-TCAGAGGACTCGCCGTATCGTCGCTGGTGAGAAAAAAAAGGAAAAACTCG
-GCGAAATTCTTGATTTTGATTTTTTTTTTCAGAAAAAATTGGCCTCCGGT
-GAGCTGCAAAACGTGCCAAAAGTGAACGAGAAGAAGATTATCCGCAAGAC
-AGAGCTTCCAGTTCGAGAGAAGTAGGATTTTCTCGATCTCTCCAAACAAA
-AAAATTGTTTTTTTCAATTTCAGCAAAAAGATCCTGGACGCTCCGACTGG
-AAAACGTGGCACCACTGCTCAATACATCACAAAAAAGAAGGCAAAGAAGA
-TGTACAAGAAGATGACACACGACGCACGCGACAAATATCGAAAAATTCAG
-GCGGAACTGGCCGGAGACGGTGAAGATGACGAGGAGGGTGAAGCCGAGGT
-GATGGAGCAGTGATTTTGGATTTTTCCGCGGCATTTTTAAAATTGTTTTT
-TTTTGTTGATTTTGTTACTGTTTTTCATTTTCCACATAAAATAATCGAAA
-ATTTATTTATCACAAAAACTTTTGCACAATTTGCTCAGCTGAGTGAGCCA
-ACTGTTTGCCACGTGTCACGATTCGATGCATCCATCCATTGGGCTCCTCG
-AGCTCCGCTTTCGGAGCCTGTAGCTGCTTTAGAATTATTGTCCAGAGCTC
-AGAAATGTTCATCGAGTACTGCGCGGAAACTTCGACGAAATTGCACTTGT
-GTACTTTGGCCAGGCAGGCTCCTTCTGGAAAAATCAATTTAAAAATCGAT
-AATTTGAAGTTCCACGTGGAGCCGCGACGCGGCACGCGTTGCATCGTTTT
-TTTTGGTTGAAAAACATGGTGCATCGAAGAATTTTCCTTTGACGATTTTA
-TACGCAATGCATCACATTTGACGAACAAAAATTCAAAATACTTTACTTTG
-CAAACGCGCTCCATTGATAAACTTATGAAAAATCGATAATGCTCAAATTT
-CACAAAATTTTCCTCCATTTGAAATTATATAATTGTTAAACAAAATTAAT
-AAAACCAAACATTACGCGCAGTTTCCGATAAATTTCGATTTTTTCAAAAT
-GCAAGCGCGCTCCATTGCTAAACCTTGAAAAACCCACCCATTTTCGACAC
-CACCGTATTCCGTTTCAAATCGATTTTATTGCCAATCAGTATAATATTGG
-CTCCGCGAGCAATTTTTCGATTCAAAAGCCGACTGAGCAGGTCTGTGGCA
-CACACGAATGATTCTCGATTGTCAACGTTGTACACTATTGCGTACATTGT
-CAGTGATGACGCGAATGGAGAATTCTGGAAAAAAACAAGAGTTTAAAGGC
-GCAGGTGGGTCTCGCCACGATCCATGTTTTTTTGCGGGAATAGTGGAAAT
-TTGGAGTTAGTAAAAAAATCAAATTTGTGTAATTTTTAATAAAATCGGTT
-CGCAAATGCGCTAGTACATCAGATTTCACGAGCAAATTTCATTTTGTGAG
-ATTTGCACCAAAGATATGGGCATTTGAACTGATTTTTTAATGGTAAACAC
-GCGAAAAAAAATACATATCCAAAAATTGAAAAAATTTTAGGTTTCACAGT
-CTCCTCGGCATCGAAAGCGCAGTAGTAGGGGTGGCGATAGGGCGCCCTGC
-TAAATTTTCTATTTTTATGGTCTTTCTTTTCGTTTTGTGCTAATGAACAA
-AAGTTAAGTTCGAAATCTGCGAAAAAAATCGTTTCAACGCTAAGAAACGA
-AGAATTGTATTTCTCAACGGTAAAAAGATTCACTCCTGCGCCAAGGTGAC
-AGCAAGTGCGCCCCAGCCCAATTCGACGCTGAAGAGACTGTGGGTTTAAA
-AATTTAGAGAAGTCGCAAATTTTTTGTTCAAGATATCAGCCTAAGCTACG
-GTTTAAAGGCGCACAAGCACGTGGTGTCAAAGTGTCCCGTTTCGGTGTGA
-TCTACCAAAAATGCGGGAATTTAGACGCAGACTTCTCAGCAGATTTCGTA
-TGGTTAAGAGTGTGCTGACGTCACATTTTTTTCTGCAACAAATTCCCGCA
-TTTTTTGTAGATCACACCAAAATGGGACTGTTTGACAGCACGTGCACAAG
-CAGATCACAAGTGGGTCTTCGAGTTATCCTCCCCAAATCCTGTCCAGTAG
-AGCGCACTTACCTCCAACGTGGCTTCCAGCAACATTTCCAACTCGATTTG
-CTCGTTATTCAACAGGAAATTCATCGTTTTCGATGAAGTGTCATCTCCCT
-CATTTGACTCATTATTGTATTGGGTGACGAGCCGCGTGGCAAATTGGTTA
-ATTGCTGACAGCAATGTTTTCTTCCCGCTATTCCTTGATCCATAGACACG
-TAGAACCACATGTTGCATTGGAACATTCGACGTTTCTTGGAATAGCCAGA
-CTTCTGGACACGTGGCTCGGCGATCTTCTGAAAATTTTTAAATTTTCAAA
-AATTTGGTTAAAAATTTCAAAGGAAAATCAATAACAAAGCTACTCCAAAA
-TTTTCAGCCTGATTGGTTGGAAAATGAGCAAGTTACAGCGCTTCAAGAAT
-TCTAGGCCACGGTCACCAGGGAGTGGTGGCGGTGACCCTCTATTTCATTT
-TTAGATTTTTTAAATGGGAAACTCGAATTTAAATGTGAAACATCTGGAAC
-ATTCCAAGAAAAATTCAAAAAAACTCTCTAAGGAGTCGATAACCCTCCCC
-CAATTCCTGAGATGTGACGTCATCAGGGGGAGCCCGTGACCTCATAGCTT
-CAAATTTGAATTTTTCAACGAAAAGTGTGAAATTAGATGTAAAATTACTA
-GGAAATTAGAAGAAAGATTAGAAAAGAAATTTCGGGGGTGTCGCTCACCA
-CCCCCCCCCCCCATTTTTATAGTGTGACGTCATAGAAAGTGGGTCCCCGC
-TACCTTCCATTTTCAAAGTTTTTTTATTTTTCCGATGATTGTATTACTGT
-ACTCACTGTAATTATGTGCAACAACTGGTTGTCCAGTGGAGCACGTTTGC
-TTATACCCATTGTCCGTCACAAATCCATTCTTAATTCCAAAACTTCGAAG
-ACTTCCCTCCGGTCGTTTTTCGACGTCTTCGATGTTGTTTTGGTGCATTT
-GTAGAGAGTATTGGTATCTGGAATATTAAGGGGAAAATGGTGAAAAAATT
-CAGAAATGTACAGGTAATCGAGAAAAAAAGTTAAAACTTTTTTTGAACTA
-AATTTTTTTTTCAAAATTTCAAAAAAAAAATTTTATTTGAAGAACTTTTT
-TATAATGTTAATTTTTCTGAAATTACTTAACTTTTTCTCTCAAAACTTGC
-TCACTGAGTTTTTAAATAGATTTCTGAAATTGTCCACGTGAAGTACACTC
-CCAATATATCAAAGGAGCGCATTTGCGAACTAATTTTATTAAAAATTTCA
-CAAATTTATTTTTTTTAATAACCTAAAATTTCCGCTATTTTATCGTATTT
-TCTAAAATAAATAAAAAATTGTCCAGGAGGAGTACATGGCCAATTTATCA
-ATAGAGCTCATATGCACACTTGTTAAAAAACAAAAAAAAAACTTATTCAC
-CTTGGCGGTGGGTACCGCTTTTTCACACGACGAGGCGAGTTTTCCGAGCT
-GAAAAATGATACTTTTGGCTGGGAAGTTTTAGAATTTTGGGGAAAATAAG
-CATTTCCGGTGAAAAAAATTGTTTTTTATTGGAATAGTTTTTAATATTCT
-AGGCCATGTCGTAAAGAATTGAGTCAAAATTTAAATTTTTGAGGTACGAG
-CTTCCAGTTCCCCCCACAATTCCCCCTATGGCCTAGAATTTCAGAAAACT
-CTACCATCGATTCAAACTCTGTTACTTTTGAGGATAAGGGGTTCCGGACG
-CCCCAAACTTCCGCCCGTGGCCTAGAACTCCCAACTTCTTCCACCGACCT
-GGACGTGGTGCTCGTACTGGCAAAATGCTCATCAACATCTGGCAGTAAAT
-TGTTCAACCGTCTTGGGGACACGGTACGCGGGGTCGACGGTAGACTTCGG
-CGACTGATCGGCGATGTAGGAAGACTTCTGAAAAAAAATCAATCAATAAA
-ACAACGACACTCTGCTCGTGAGGATCCGCCCATTCCGCTTGTTGTTTACC
-AATTTCTTTTAAAAAAATTCTACAATGCGCAAAATTAATAGAACTACCTT
-CTTATAATTTTTTTTTAACTCAAAATTTTCAAAAAAACAACGACACTCCG
-CTTGTAGACTCCGCCCACTTTCCAAAAAGGACAATTCGGAGTGTCGTTTG
-AAAAATATCCTAAAATTTGAAAAATTCATTTTTAGTCTCAAATTTTAATG
-AAAATTACGTGAAAATCTATAACAACTACGACACTTTTGGCTCCGCCCAA
-AAACGTCTTTTGGCTCCGCCCGAAAACGGGGCGGAGCCTGGCACTAATAT
-TACAGTTTTTATTTCCATAAGTGATTAAAAAATCAACAAAAAAATTATTT
-AGAAAGTATCTCAATTATTGAATGAAATTTTATAAAATCTACGACACTCC
-GCTTGGAACCCCCTCCCCCTGCCAAGAATGGGGCGGAGCCTAGAACAAAC
-GGAGTTTTTGCAAGAAAAATATTGCTTGAAATTTTAAAGACATTAATAAA
-AATCCGAGTTTTTAGAAAAAATTGGGCCAAATCGAATAATAAAAAATACG
-TTACTCCGCTAATAAAACCAGCTCATTACCAAGAAAGGGGCGGAGCGTAT
-ACAAACGGAGCGTCGTTTGAAAAAATATTTTTTGGAAAACTAAAATGTTC
-CAGCGGGAGGAAGCTTCTGCAAAGGCAATCTAATTTTTTTCCGGAAATTC
-AATTTCCTCAGGGTTCTCTCTGCAAATTTGTTCACGAAAAAACTCGTGGT
-GCTGTGCAAATGCGCTCTATTGATAATTTCATCTAGAGAGCGCAATTACA
-TCAAATTAGCAATGGAGCGTTGTTGCATACCTTCTCGTTGCAGCGGGAGA
-CGCTGGTGACGGAGGTGATAGCCGTGATGAAAATTGTTGGGGTATCGCCA
-GCGCAACTGGAAGGGAAACACGACGATTCGACATTTTTCTGTAAAAAAAT
-CCATGATAAAACTAAAATTTAAAGAAAAAATAATGTAAATAAAAGTGGGG
-AAGTGGCTAAGCGGGGACACAAATACGCGGGAAATCCGCTTATTTTTGCT
-GGATTTGACGTAAAAATCCGAATCAACTGGCACTCGACGCGTTTTCCAAC
-AAGAAAAAACTAAAATTTCATATATTGGTGGCCTAGAAAATTCGAAAACT
-GTTCAAGCTTACGTAAAGTGTGTATTTTCCATATTAGAGAATAAGATTGG
-AAGAAAAATAAAATATTGTAATTTCTAGGCCACCGCAAAACTTCTAAGTC
-ACCTATGAAATTTCTAGGCTACCGTGAAAATTCTAGGCCATCATAAAAAT
-AAAATTTATATATTTTTGTCCTGAAACTAAGTCCACTTCCGCCAGAAATA
-ATAAAAGCAACAAAAAAGACAACACAAAAAATTGAGAACTCTTAAGAACA
-AAAGAAATCCGACCCGAAATCGAATACCCCACGAAAATTTTCGGAATTTA
-GAAAGAAAAACTATTTTTAGACACTTTTTTTCCTTCAAAAGGAGGAACTT
-TGTTGCGCGGCCTAAAAAATAGAAAACTCGGCCACCGATTTGTTTGCGGC
-CACGGGACACTCCGCAGTTGCAAAGGCTACAGATGCAAATACTGGAAAAC
-TAGGTCACCAAGTGGAAACCTTGGTCATCGCGTGGAAAAAAACTTTGACA
-AAAAATTTTTGAAAATTTTATAAATTTATTCTAGGCCACCACCTGTAAAC
-CTAGGTCACCATGTGGAAGGCTAGATCACCAAGTGGAGCCTAGACCAGCA
-CATAGGCCTCTAGGCCACCACGTAGGAAATTAGGTCACCAACTGGAAAGC
-TAGGCCTCCACATGATAAATAATATTTTTTGGAATTTCGTTTTGACCAAA
-GAAACTTGTTTTTACCAAAATATTTGAAAATCGTTTTCAAGGCCGTCCGG
-TGAAAACTGTGTAAACCTAGGCCACCAAATAGAAAGTCAGGCTGCGACAT
-CTAAACTTAGGCCACCAAGTAGAAAGCTAGGCCATCAAGTAAAAACCTAG
-ACCACTATGCCAAAATAGATGCCTTCTAAAAGTTTCAGGGAAAAAATGTT
-TTTCAACAAAAATTTTTAAAATCGTGGCCGAGTGGACTTTAATAAAATTT
-ACTTTTTCAGCCACGTGGCAGAGGGATATCGGAGCATCGTTTGAATTTTC
-TAATTTCTGAAAGAAAACCGGAACACATTGCAAAAATACGAAAAATATAA
-CTGAAGCTGACATATGAAATGAGTTCTATGCTCCCCGCCGCCTATTCTTC
-TCATTTTTCTGCTTATTTTTGTCGTTGGGGGGATGCTGGTATCATATTCT
-TCGTCCCCTCTTCTTTCATTGCCAGTCTATTCAGTATTATAATTAGCGTG
-TATTCCCTATTGGATTCTGCTCCCCGTCGTTTTTTTTTCTATGCGAAAAA
-AATAGAAAATACGAGGTGAACGGGAATTTTTATGAAAACGAACGAAGAAT
-TTGAGTTTTCTAGGCCACCAAATTGAAACATAGGCCAGCAAACGGATCTC
-TAGTAAAAACCTAAACCACAATACGAAAAACTAGGCCACCAACGAAAAAT
-GGGAGATTCCGCTTGTGTGTTCAAGCATTTTGTAAAATTCTAGATTGTTT
-TAAAAACTTAATTTTTCCAGTACAAAAATCGATTTAAAAACAATAAATAT
-GTCAAACTCGTGACGTTTGTCAATAGAGCGCGTTTGCATGTCAAACAAAA
-CATATTCGGTGTAGATTTACGGGGACACTTTACAAAACAAAAAACCTTCA
-CAAGGCTCCAAATAAGAGCTAGAAAATGGAACAAATTTCCGTTTTTTTTT
-TGTTGGTGAGTGTCTTGTGAGGAGGGGACCGCCCGTGTCTCTTCCAAAAA
-CATTATTAAATTAGTGTGACGTCATCACATTGAAAAACAACAAATATAGT
-TCGAGTTTTGAAGAAAAATTTCGGAATTTTTCTGGTGAAAAAATTTCAAA
-AATTTCAATTTTTTTTTAAATCTTAAAAAATTTTTTTATATATTTTTAAA
-TTCAATGTTTGATCTGAAAACCAAATTTTCACACAAAAAATCTGGTTTTT
-GACGTCTAAATTTGCTTTTTTTCACCCAATTACGAGGTTCTCCGTGGGAA
-GGTGTGTCTAGACACTTGAACTTTTGCTTTTTTATTTTTTTTCTAATTGA
-AAATGATTAAGCTAGATATATTTTCTCTCTTTTCTTAATCAGAATTGTTT
-TTGAAGATTTTAAATTTTTACACTCCCGTGCAGCAAATGCGCTCCGATGA
-GAAGTATGGAAAATTACAACTGGAGATTTTCAAAATGTTCAATTAAATTT
-TGCGTTTTTCTTTTAAAGGTTCAAGAGTCTAGAAAACTACGAAAAGGTGC
-TGTGACCTTATCGATGACGTCATCACAATTCTTGAAAAACTGGGAAAATG
-AGACGATGTGGAAAGAGGGGATTATTTATGCTTAAATAAACTTTTTGCAC
-TAATTAATTCATATAGTTGTAGTGCTTCTTTATATTTTAAGAGAAATTGC
-AAATTTTGCACCCAAAAAAGTAGACGGCCGAGTTATGGGAAAACTCTTCC
-ACGGACACAAGACGTGGAAAACTAAAAGTTTCCGTTGTTTTTTATACGCC
-CGCATGGCACATCCCCGCCCCAACAAAATTTTCAGGTTTTCAGGGTGAAA
-ACATTTTTTCAGCTGCTGGGCGGCTTCTCGTGCAGCTGGAAATGTATTTC
-CAGACGGGTTGGAACCGGGATTTGTCATTCAATTGTTGCAATTACGCTCT
-ACCGCTAAACCTCGTTTGGACTCCACGTGGACAACACGGTGCCTTATTGT
-AAATTTCTCTTCCATCTCCATAATTTCAGAACAAACCGTCGCTTTTATTC
-TCCATAATATTATAATTTTATTTAAAAAAATCTGGAAACATTTATCGATT
-TTTGTGAAAATCTATGTGAGATTATTGACAGAAATACAAGAAAATCGATG
-CAAACATGCTCTATTGCTAAATAGTTCGTGTACTCTACGTCGACGACACG
-ATTTCAAGAGTTTTTCGTTTTTTGAACAAATCATCTGTTATTATTGCAAA
-ATTCGGTACATTACTCAAAAAAAAACAATAATTGATAAACATGTAGAAAC
-ATACATGCAAACACGCTCCGATGCAAATTATTGATTCTCCAACTTTTATT
-GTTAAGTTATCTTGAAAAAAAAACTGATAAAACGAGAAGTCCTTGGTGGT
-ATCGGTCGCCTAGAAACAGATGAAAGAATGGAAAAACAAGTATTACGGGC
-GGCTCCGTTTCGTATTATGGGGGGTGGGCCGCAGATGATCCTTTAGAATA
-AGAAAAATGTCTAGTATTTTGTGATACTTGTGAAATATAACCCTAAACTT
-AAAAAATAAATTAGGGCTCAAAAATGGTATTTTTCTAATGTAAGCCTACA
-AGCACAAAGGTATTCAATTTTTTTTCAATAGCTAAAAAATTAATTTTTAA
-ATTGTGATATCATAATACTTACACAAGTACCAATTTTGTTTTAAACGATA
-GAATATTCCATAACTTTTGGGTAGGATTTTCTGCACTCGAAAAAAACGGG
-ATTTTCAACAAAAATAGTGGACTTTTTAAAAACAACGAAAAAGTTTTGCT
-TGGGACCAAGTCTAGCAGATTACAAAAACTGATTCTTCCAGTCAAAGATT
-TTATATATCACTTAACAATTGTTTTGCCTACCTAGCAAATTCCGAAGTCA
-GAAAAGTTGAATTTCCCTCCAACAATTTTTTTTCATAGTCAGCCAATTTG
-CATTTCCCGCGAAAAAATTTACGGATTCACCACAATGGGTCTCCCACCAA
-TAAAATTAATTATTCATTTATCTTCTTAAAAGGTCACACGAGATGCCAGC
-GACACAGGGCAAGTGCGACCACTATCCCGAAAAAGACACCGACAGAACCT
-AACGAAGGCTTCCAAAAATAGCATAGAAATACAAGAGACACAGAATATCC
-CATGATGTTCTGTCACTTTCAACATCATTCTGCCTTTTTTGTTCCCTTGT
-GTATGGTGACTATAATTTGATTGTTCTGAATAATCTGATGTCTACTTGTG
-TTGTGGACCACTATTGATTTTTGCTGCTTTGGTTAATTTGAGGTAATACT
-TTAACAAATTTGTTTTAAATATCATAGTCATTTTACAAATTTCAACAGTT
-TTCCTATTAATCCGCTAAACCGCAACTAAAAATGAAAAATTAAAACTTTT
-CTCAAAACTGTATGGGAAAGTTCAGTGACGGTTATGATAATTACAACATC
-GTTAATGCAAATTTAACAGGTTTCGCAAAATTATATTCAAAAAATTTTTT
-AAATCGTTTATTACGGTAACAAGAAATGTTGAGAATGCGTATTACACAAC
-ATATTTGACGGGCAAAATATCTCAGAGCGAAAACTACAGTAACTCTTTGA
-ATGAATTCTGTAGCGTTTGTATCGATTTACGGGCTCGATTTTCGAAATTA
-ATTTATATTTGTAAAGTGAAAGCTATATTCAATTTTTCTTCGATTATTTG
-TTGTTTTGTTTTATTGTGTTTTTGTTTTATTTTAATATATTTGTCACTTT
-TCAAATAGAAATTAATATCGAAAATCGAGCCCGTAAATGGACACAAACGC
-TACAGTAGTCATTCAAAGAGTTACTGTAGTTTTCGCTCTGAGATATTTTG
-CCCGTCAAATATGTTGTGCAATACGCATTCTCAACATTTCTTGTTACCGT
-GATAAACGATTTAAAATTTTTTTTAAAACTATTTTTTTAAGTAGAACAAA
-ATTCAGAAAACAACTCGATAAAAATGTCCTAGTCATCCGATTAAAATAAT
-TTTTTGAAATAAATAATATGAAAATTAAATTTTAAATATTAAAAATGTTA
-TTGTTGCTTTAAAAAACGTTATTGGACTTTTCAAGGCGGCAAAAAAATGA
-AAATAAAAATCGATTATTTTTTGAATTGTTGACTTTTCGGTTTTTAAATG
-TTGTTGAAAAGAAACGAATTGTATATACGAATTTCAATTAAAAAGTTTAA
-AATGTTTTTTAAAATGTTTTATTTTTTTCAGATAGATCAACTGAACTTCA
-TAACTTTAAAAAGCCAGTCTGGGATGTATCTATACCACTCTATCAGACTA
-CTCTTAGCACTAATCACAATGTACGACCCCGTGAGAGATTGTTGTCTGTA
-CTGGATACTACACGAGTGGTAGAATATAAAGAAGTGTGGTGACAAGTTTG
-GGATCTGAGTCCAGTAGAAAAAAATCATTCTACCGAAACTCGAAACTATG
-AGCGACTGGTCAAAACTATGCATTTGACGACGTCTACCTGTTTTAAGTTA
-TTGGTGGTGAGTGTGCCTTTGAAGAAGTCGCTCGAGCCTCGACCTTCTCC
-GACTGGCTTGAACTGAAAGATCCTCGGGAATCATTTTTAGAATTTAGAGG
-TGGAGTACCGTCTGTGGATTTTTTTTTGCTCGAAACGATAGAATACAGCC
-CCAATATTCCGAACAGGGGTGCGCGGCAATTGCCGTGTGGCAATAGAATT
-TTCGGCAATTTCGGCAATTGCGGCAACTTAGGCAATTGCCAAAATTGCCG
-AAAATTCACAAAACCGGCAATTGCCGAAATTGCCGATTGCCGGAAATCCG
-AATTGGAAATATAAATTTGATTTTTTTTTGTAGTTTTAAGAGCTTGAACA
-TGCATTTTACTAAACAATTTTCTCTTTTTAAGCTCAAAATGGTTTAATCC
-TTTGAAGATTGACCGTTTTCTTTTAGAAAATTACTGACAGAATATTAAAA
-AACAATGTGACATTTTTCAATTTTCGATATACATTTAGGTTTGAAAATTG
-CCGAAAATGCCCTGCAATCGGAATTTCGGCGATTTCGGCAATTGCCGAAA
-TTGCCGATTGCCGGAAATTTTGAAAACCGGCAATTGCCGAAATTGCCGCG
-CACCCCTGATACCGAATATAACTGTAAAAAATGTATTAATTTTTTTGTTG
-ATTTTTTGAAAATTTTCATAAAAGTAAAGAAAGGGCCAAATTATGTTTGA
-ACTACTAGTAGTCTGTGACTTCATTTTTGGCATTTTTCCGTTTTTCAGCA
-ATAATGATTGGTTTTCTTTGTTCTCTAATTTTAAACATATTTCTTCACAA
-ATGTCTCAAAAATTAACAACTTCAGTTTAAAGTAATAAAACAAAAAAAAA
-AGAAAAATAAAGAAAAACCAGTCAGTTTTTTCAAAAATAATTCAAAAATA
-ATTCGGTCCTTATTTTTTTTTTTTTGCAAAAAAAAACAAAACAAACTCCC
-CTATAAAAATTTTCCAAAAAAAAATTGGAAGGTTTTTTTTATTTCAGCCT
-ATTTTTGGAAGTTGTCGAACTCGATCAAAACATTTTTTCATTGGTTTAAG
-TTTTATTATGCTTGAAATATTCAAATTCCAACATACCAGGCATTGAAAAA
-TCAGTTTTCGTCGCTTTTTGACTCGAAATAAAAAAAACCAAAAATTTTTG
-AAAAGTTTTATTATGATAGAGTCATTCAATTATATTCCCAGTACTTTTAA
-ATAATCAAACAATTTTTTAGAATGGCTAGTTTCAAAATCGGCGGCTTTGT
-CGTTACATATGAAAACATGCACAACAATATGAAAAATAGGTATGTCTTCA
-AAAATATTAAAAACAATATTTTTTTAATTTTACAGATGTTAGCAGTTCGA
-CGAAGCAATGCAGGAACTACAGTTATACAATCAAATTCACGCTTTTTATA
-TATTAATTTTTAAAATCATAAAAATTACAATTTTCATCAACGTTGATCAG
-CTAGACGAATGCATTAAGAAAAGGGAAAACATAGGGCTTCCCAAAACGTC
-TGCCTCGCCCGCCTTGTGGCGACCTGCGCCTGCCTCGTGCAGGCCGCGTC
-TCCAGTCAGTGCAGTGCAGAAATTTTTATTTCAAAATTGTACAAAAACAT
-GGAAAAATAGAGAAGGATAATTTTTTAGGCCTCGGAAATCAATTTTAAGT
-CCTCTAGCTACAAAATGAACCATTTTAGAGGAGTTTCAAAATTGTGAATT
-TTTACAAAAATTACCCAATTTTGCCACTTTTTAATGGTTTTTGATGGGTT
-AAACCTAGATCTTCTGGATAATTCCGCATATATGAATTACCGTATTTCCT
-ATATTAGTTTTGCATGCAAGACTAATTTTCAATTGGTCTGTAGGGGTGCA
-AGACTAATAGAGACTGCAAGACTATTAGAGGCTGCAAGACTAATTTTCGA
-ATGCTATAAAACTCCGAAACGTGACCAATTTTTGATTGTAAACTCAACTT
-GATATCGTTTAAACAACAAAAAATACATCCTTTTCCAATATTTAATCAAT
-TATTTGAACGCTTTTAATCAAAAACTCGAGTTCAATTTGCCCAGAAATGG
-GCCAATTTATTAACGTTGCAGCATCTATGCAAGATATTGCTGGACTGGAA
-AAAAGTCGGGTGCAAGACTTTTAGAGACTGCAATACTAATAGAGGCTGCA
-AGACTAATTTTCGATTTGCCCGTAGGGGTGCAAGGCTAATAGGGATGCAA
-GACTATTAGAGGAAATACGGTACCTGTTTTTGACAAAATTAGACAACTTT
-TTATTTTTGCTCAATTTTTTTTCAGCCATCTAATTACTGTCCTTTTTTTT
-TGGACAATAAAAATAAATTTTCTAAAAGCGTTTGAAACCACTATATTTTG
-CAAAAGGACAATTTTTTAGGGATTGGAGATCAATTTTATGTCCTCTAGCT
-ACAAAATAAACAATTTTAGAGGAGTGTCAAAATTGTGAATTTTTACAAAA
-ATTGCCCAATTTCGCCACTTTTTATTTTGGTGGGTTATACCTAGATTTTT
-TAAATTCAGCATATATGAATTACCCGTTTTCAACAAAATTAGACAACTTT
-TGATTTTTGCCCAATTTTTTTTTCAGCCATCTAATGACTGTTCTTTTTTT
-GGGCAAAAAAAATAAATTTTTCTGCAAACGTACAAAACCATTAGAAATTG
-AAAAAAGGCAATTTTTTAGGGTTCCGATATCAATTTTGAGTCCTCTAACT
-TCAAAAATGACTATTTTAGAAGAGTTTCAAAATTGTGATTTTTCTGCCAT
-AAATTGCCCATTTTTGCCACTTTTAATGGTTTTTGGTGGGGTATACCTAG
-ATTTTCTGAATTCTGCATATATGAATTACCGTTTTCGACAAATTTAGACA
-ACTTTTTATTTAAAAAATTAAAAAGGATTAAAGGACGATCCGTTCTTCAA
-GTGCTATGCACTGCGGATCTGGGATTCAGGTACACTGCCTGGTGGTGATC
-CCTCTGGGCTGTAATTTAAGCCACGTCCTAGCCGAGGACTGTGGCCGATA
-ATCCAGTCGTGGATTGCTCCACTTCCCAATAGAGGCAGGGTGAACCTAGG
-GGGTGAGGCCGGACTTTTATCTCGTGACCTCCAGACTGCTAGCGGCCACC
-ACTACCGACTGAGCTATCTGCCCCCCTTGGGGAAAAAAATAATTTTTTTT
-TTTTTTGGGCAAAAAAATAATTTTTTGGAAATTGTACAAACCAAATATTA
-TATATTAAAAAATATTATCCAAATATTCCAAATATTCCAAATATTCCAAA
-TATTCCAAATTCCAAATATTCCAAATATTCCAAATTTATTCCAAATATTA
-TGAAAAAGGCCATTTTGTTAGGGCTGGGAAGTTTGAATTTTTACAAATAT
-TGCCCAATTTTGCCGCTTTTTAATGGTTTTTGATGGGTTAAACCTAGATT
-TTCTGAATTCTGCATGTATAACTTACTTGTTTTCAACTAATTCAGACAAC
-TTTTTATTGTTTTTTTTTCAAATTTTTTCAGCCAATTAATGACTGTCCTT
-TTTTGGGCAATTTTTTTTTTGAAACAAAAAAAAATTAAATTAAATTGCCC
-AATTTTGCCACTTTTTAATAGTTTTTGATGGGTCCCGGAAACCTAGGAAA
-CCTAGTCCCGGAAAATCGAAAAATCGAAAAAAAATTTTTTGAAAATTTAC
-CAATGAAAAAAAAAAGACTCAATTTTCTTCCAAAATAAAAAAGTGGGCAA
-AATTTTAAATATTTTTCGAAAAAAAAACATAACTTTTCAAAAAATTTTTC
-GATTTTCCAACAAAAAAGTGAAATAAGAAGACATGCAGGTTACTGTAGCT
-GATAAAGCTTCAAGCGTACCAGGACCCGAAAACCGCCGCCCGCGTAAATC
-GACATATTTAATGTACCATCAATTTGATCCTCCTCTTCCTCCTTCTTTCA
-ATGACACCACACAACTTCCTGTTATGAAGGTCTCAATTCCCCTTCATAAC
-ATTCTTTGTAATTAATGCACCCTAAACAAACTGTGCAAACACACTTAGAC
-ACCCCCCTCCTACACGGTCTTTGGAGTTCCCCCGCTCAACTCTAATGGAC
-CTGGTAATCCCTTGCGCGGTGGGATTTTTCGGGTCTCGCCGCGATTTTTA
-TCCGAATTCCGGAATACCGGAAATGGCGTGGAAATCGATATTGCAACAAA
-GAAAACTGTTTTATTTTCAAAAATCCGCTCACTTTTTTTAAAAGTGATCT
-TTCAATCATTTTTAAAGTTTTTTTTTTTGAAAGCACGCGTTTCTGGCTTC
-CCACATATTTTGGAATGTAAGAGATTGCCGAGTTAGGCCATTTGGACTCG
-GCCACGGCCGGGGTCGATTCACGTAGCGGCTCGGTTTCTGTAGAAAACTA
-AATGTATTTGTCCGTATGGAGTACACAAGCTTTTCCAGGCGTTATCCGGC
-AGGCGATAGAAGCCGCGACGCAACACGCAACGCGCCGTAAGTCTACCCCG
-GCCGTGGCTGAGTTATGATGGCCTAACTCGGCAAACTCTTGCATTTGAAA
-ATATGAGCGAAGCCAGAAGCAGGTGAACATGGATTTCTGGCTTCCCTCAT
-AAATTGAAAAGGGAGAGTTTACCGAACTAGGCCATTTTGGCTCGGCCATA
-TCTGGGGCAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTCGTTTTTA
-GTTGTAAAACTGAATGTATTTGTCCGTGTGGAGCACACGACTTCCCCACG
-CGTTGTCCGCTAGGCAATTGTTAATGGAGCGCGAAAAATTCAATGAGGAA
-GGCCAGAACCCCGTGTGTGATTTTTGCAACTACAGCCCAAAATTTGAACG
-GGATTAATACAAATTTAATTTGAAATTTGGATTTCGCAATTCAAAATTTG
-CGAAATTAAAATTTCGAAAACCCGAATCTCATCGAAATTAAATTCCAAAG
-TTTTCATTCAAATTTCAATGAGGTCTCTATTGAGCCGAATTCCCGCGCAC
-GGGAGGTAGTGGACCCCTTTTGTATGTTTAGGGGTACAAAGACCCCCTAC
-CACCCCTTGTATATGCACAATAGAGAACACTCAAGACCCGCCCACCCTAG
-GCCCCTCATCCAAAACATATCCGAATATACCCTCTACTGTACTTTATTTA
-CTTGCTCCGTTTACCCGGGTACCAGGGTACTCCCTAAACTAACTGAATTT
-CCAAGGTGGTGGCCTAGAAAAAGCTCTTCCACTGGTTTTTTTGTGGAAAG
-AAATGATGAAGGTTCTTGTTGTTTTATTGCTTATGGTAGGTTTTTTTTGC
-CACGTGTCCGGAATTTTTAAAACTATTTTTCTATTTTTTAAAGGCCCAAA
-ACTTTGTTTTTTTTAATGTTATCGTTTTTTCGTGAAAAAAATTATTTCAG
-AAAACGGGGGTTTTAGGTTTAGGCTAAAGCGTAGGCTTAGGTTTAGGCCT
-AGGCTTAGGCTTAGGCTAAGGCTTAGGCTTAGGCGTAGGCTTAGGCATAG
-GCGTAGGCTTTAGGTTTAGGCTAAAGCGTAGGCTTAGGTTTAGGCCTAGG
-CTTAGGCTTAGGCTAAGGCTTAGGCTTAGGCGTAGGCTTAGGCGTAGGCG
-TAGGCTTAGGCCTAGGTGTAGACTTCGGCTCAAACATAAGCTCAGGGGCA
-AAAAAAGGAGAAACTCCCACAAATTCCTAAAAATCCTGAAAATTTTTTTA
-AATCTTAAAATAGTCAATTTTCAGTGGAAATCACAGTGAGCATTTTGAAA
-ATCCAATAATTTTCAGGTAAATTCGACATTTTCGTTCGGATTGGACAATG
-AAATAATCGGTGAACCAAAGTTACAATGCAATCCGGAAAGTATTACATTC
-TCCTTCAACACACGGAATCCGTTTATGTTAGTCTTGGGGTCTCGACACGA
-ATTTTTCCCGCAAAATTAGTTTTCCACGCGTGAGTACACCGCAAGTAGAG
-CGCTTATCAATAAATTATAAATTATCAATAGAGCGCACTTGCCCCCGGTG
-AATTTCAAAATTTTCAGAGGAAACGTATATATTCGTGGCTTCTACCGAAC
-ACCCGGCTGTCGTCGGCAATTCCTCGCACCGAATCAGGCTGGCGGCTCAT
-TTACGGTACGGCTCGGCGATTGCGGGATGCGGCGGTCCCGACAAATCAGT
-GGACATTCGCCACGTGGCGTCAATCAGCACATCACTTTTGTTGCGAACTT
-TCATCCGAATCTCGCGACGAAAGAGGAACGATCATTCAATATTCGATGCT
-TTTATGCGCACAGTGAATCTGTTGTCAAAGCTGATCTGGATGTCAGGTAG
-GGATGCAAATCGATAAATTCCCCGAAAATCGATACATTTTCCAAAAATCA
-ATAAATACCCAAAAAATCAAACAATTCCCAGGAAACTGGAAGAAAATTCT
-CAGAAAATCAATAAATGTATTTGTTTTGCAGCTCAATGCCGGAGGAATCG
-TTCGAACAGGGTGTGACAATCGTGCCCCAATGCACATATTCCCTTCGTGA
-AGGGACATTTGAGGGCCCAAAAGTGTCGAATACACGTGTCGGAATGACAA
-TTGTTCATCGATGGGACTGTGATACATCGGGGAACTATGGAATACTGCTA
-CGTGGATGCACCATACTCGATTCACGTGGTGTTGAATCTTTTCCATTGCT
-TGATGAGAATGGGTAAGAGTAGGGAAGTGTCGGCCGCTAGAAAAGAAAAA
-TATATCACTAGAGCACGTTTTCTAAGCATTTTTCTCAATAGAGCGCGCTT
-GCTCAATTCCCTAAAATAAATTATGGTGCATCGAAACGTGTTTACGTACT
-GATAGAGCTGTAGTACTCGAGGAAGCTGAAAAAAATAATGAAGAAAGTGA
-AAAAAATCAAAAGTGTGAACACAGCAGCCTTGTCAGATAAATTTCAAAAA
-TCTGTGCATTTGGTCGTAAGTTATGGCGCATCAAAAGTTTTTTGAAATTC
-TCAATAGAGCACATTTCAAAAAAGAGCGATTTTCGCAAAGCCCCTTTCTT
-CGTTGTTTGATTTAAAAACAATGCAATTTCGTTTATTTCGCAAATTTTTG
-AAAAATGAGTTAAATTTGCAACAGAGCGCGATTGCACACACACACACACA
-CACATCAAACGTCAGAGACCCCACTGATTTTGGAGATTAAATTACGGTAG
-ATAGAGAATCACAAGGAAAACATCACGAACTTTGTTCCGTCAATTCCCGT
-GGTGCTTGTTATCATCAGAATGCAAAATTTGAAAGTCTGAAATTAAGCCG
-TTTCCGCTAAAACGTAGCGAATCTCATTCCACCGAGTCTATTTTCGTGAG
-GTCTCCAATTTTTCAAGTCTCTGCTCGTTATGGTGCATCGAAGGGTAATT
-CAAAATTTCAAATAATTTTTAGACACTTTTCGACCAGTTTCAAATTTTTT
-TTATGGTGCATCGAAAGAATTTTGCGTAATTTTCAATAGAGCGCGATTAC
-TACTCACCTCTAAATTTCTGCAAATTCTTTTTCCAGATGCTCAGTGTCCC
-GTGACTTCCCACAAGTGGTATATCTCCCATCACTGACGTCAGCCTACATG
-GCAATCGAAGCCATCTCATTTCCTGACCAACCATCGATTTCTTTCTCGTG
-TCAAATTAAGTTGTGTGATAAGGGAAGTGATGAGTGTCGGGGTATGAGTC
-CCCCCGCGTGTACCCCATTGACACAGGTCCCCATCACGGGACAAGTACCA
-ATGCCATTTGATAATACAATTGGAAATACGTTTGGTGAGTTATTTACGGC
-CGAGAAAACCTGCAAAAATAAAAGTTCAGCCACCGAACTTTTTGACATTT
-TTGCGCAACTGTATGCCGCACAAAACTTTACGTCAGAAGTGGGCGTGTCC
-GCCTGCAGGCCCCGATGTTTTAGATGTAAAAAATTAGATGTTTTAGATGT
-AAAAAATTGAAATTTGAATACAAAAAAAAATTCGGCCACCGATTTTTTTT
-GCTTTCACGTTTTGTCAATGCATTTCCAATTTTTTTCGTGAAACGTTTTT
-GTCAGAATTGGGCGTGTCTTGTAAAGTCCCGCCCAATTTATGGGCGTGGC
-TTGTTTCGACCAAAAATACTGTTTTTTTAACTCACAAAAACAGAGCTATA
-AACTTTTTGAAAAAAACATCCCTGTCCTCTCCTTTCTCCATTCTAAAATT
-TGAATTAGATGGCCGTGAAAAACCCCGGCCGCGGTCTTCAATTACAGTGA
-AGAATTTGGCGGCAGAGCGCGTTTTCACAGTCTTTTTTTGTCGTCACTGA
-GCAAACTTCAACTGCTTCCAGCCAGAAATTTACAAGCAAATTCAAATTTT
-CAGACGGAATCCCACTGGAGCCGTGGATGAAAGAGCCCTCTCCTCCCACT
-GATGACGTGGCAAACATCACCTCAGAAGGCGAGCCAATGCCTCGGCTCAT
-CACCGAAGAGGAACAATATCAAATCGAGTCGAACCATGTTGAGGCGCGAG
-AAAAACGATTTGCTCATCGATTATTCAATATCACATCGGAAGATCTCTAT
-GTTGAGCCAACCGTCGAGCCAATGGAAGTAGAGATGCCTGGAGCACCGAG
-AGAAACTGCTCGGAGGGTGTCTGAGCCATGTGTCTCGGTTGAAACTTTCT
-ATATTTCGGCGCTTGCTGTACTTTTCGTTTTTGTCGTTTCGATTGGGATG
-GTCTGTTTCTTCGGAAGTCATATGCTTAAAAAGTTGGTTTTTTATTGATT
-TTCCTCCCACAGGGTTCTGACCTTCCTCATTGATTTTTTTGCGCTCCATT
-GACAATCGCTTGTCGGAAAACGCATGGGAAAGTCGTGTACACGGACAAAT
-ACATTTGGTTTTACAACTAAAATCGAGCCGCGCCGCAACACGCAACGCGC
-CGTAAACCTACCCCAGCTATGGCCGAGTCAAAATGGCCTAGTTCGGCAAG
-CTCTTTCATTTCAAAATATGAGGGAAGCCAGAAATCCATTTCCCCAAATT
-GCAAGATATTTGTGGCGTGGCCGAAGTTTTCTAGTTTCTCGGCCACGTTG
-TCAAAATTATTTTAAAAAATCGCTGGAAACACTAAATTTAGATATCTCCT
-GTAGATTGTGATTCGCGGAAAAATTCCATGAATCTCGTTCTCCCAGTTTT
-TTTTTTGTAAATTCAACAAATCAAATGAGCGCCAAAACCTCACAAATCTC
-ATACTCCCAAAATTTGCGTTCCTCTTTTTCTTGAGGCCTCCTCTTTTCAC
-TGTAAAATTTAAAAAACTCGTAACTTTTTCTTCAGAGCGCGATTGTACGC
-ACAGAAAGTCTTTAAAGTCTGAAAATATTTTAAAGTTCCCCAAAATCCCA
-CAAGTCTCATTCCACCGAGAGGTCATTTTCCGTGAGGTCTCTTTCTTGGG
-TCTCGACGCGAAAATACTGTAATTTTATTAATTTTTTCAGAACTCAAGAC
-TGTGAAATGCCGATTCCAGTCCCAGAAGGATATTATCTAAGCAAACACTG
-AAACTCTTGTTTAAAAGTATTCGTTTCCCATCCACGTGCCATAATTCTTG
-CATTTTCTTTTTTTTTCCCTATTTTTATTCAATTTATTTACAATTTGTTC
-AATAAATAATCAATAAATAATAATTAAAAATAACATTAAAAGTCACATTT
-TCCGAAGGAACCACGCGTGGAATGTAACGGTGCCGTTGTCGAATGGTTCC
-GGCTGAAAATTGATTAGTTATCATTGGAGCGCAATTGCATTTTTCTCGAA
-AAATCGATGTTTTCGTGTGATGCAGAATTATCGATTTTTTTTAACTTGGT
-GGCCGAGAAAATGGAAAACTCAGTCATCGACTTTTATTTACCTGGAACGA
-AAAAATTTAAAGTATGATCACGCGCTAAAGCCTCAATTATGCAAAATGCT
-TTAAAAACGGGTTTTGGAATTTTCTAGACCACTGGTGACGTCACTCCTTT
-TCCATTTATTATTCTAACTGTTTTCTAGGCCACTGATGTCGATATTTTTC
-CACTGCTGGGTTTCTAGATCGCCTGCGACGTCATTTCTCTTCCATACCCT
-GCTCTAGCGGGTTTCTAGGCCACTGGAGAAATTATTTTTCTTCCAAAAAA
-AAATCTAGGCCATTAATGACGTCATCATTTTTTCTTTTCTTTAGGATTAC
-CTCAGGTTCCTCATATTTCAGATCCATCCTCGCCAATCGTTCATTCTCAT
-GAACTTTTTCCACTTTTTCACTGCTCGTACTCTTCTCATCTACTGTATCC
-GCCACCACAACGTCCGGAGCAACAACTTGCTCATCAATATGCTGATATTC
-GGGCTCCTGGCGGTCCCAACGTGGTGTCTCTGGTGCAGTTTCATATTGAT
-TTTGCTGCTTCTCCAGGAGGTTCTGTATTGAACTGATCGCTGAGGAGGAT
-CCAACGATCGGAGGCATCGGAGGCGGCAGAGGAGCCATAGATGGAGTCTG
-AGAAGCCATCATTTGGAGTTGGGGGTAATTCCTTTGTTGGGACATCTGTG
-GGGACATTTGTGGGGACATTTGAGGGGACGGGGACATTTGGAATACCATC
-GGAGGCATTGGAGGTGGTGGGGGTGCCGGAGCCATTCGTATCATTGGAGC
-CATCACGTAAGATGGTGGAGATGGTGGGAGACTGGAATTTTTTTTTTGAA
-TTTTTTTTCATAACACGGGCTTCTGGCCTTCCTCATTGCACTTTTCGCGC
-TCCGATGATAATCGCCTGCCGGACGACGCGTGGAAAAGTGGTGTACTCCC
-CACGGACAAATACATTTAGTTTTCAACTGAAAACCGAGCCGCGACGCGAC
-ACGCTACGCTCCGTAAATGGCCTAATTTCTTTTTTTTAATCTTGAGTTAA
-AGTTTAATTTTAATTATTTCTACAGAATTGAATGGCTGGGAATGTGCCAC
-GTGGCCGAGAATTCTCCTGCGTGGCCTAGAAAATTCAAAAAAATATTTTT
-TGGTGGTTTTGATTACAAAATAAAGGATTTATACGGATAAAAACCTATTT
-TAAAAGCCGTGAAAAAAATCATATCAACCACTGCCTAAAAGATTGAAATT
-TTTATGATGGCCGAGAATTCTCAAGTGTGGCCTAGGAAAAATCAAGGCTT
-TTGAAAATTTGCTCATTTCGAAAATTAAAAAAAACAACTCAATTGATAGT
-AAATTTTAAAATTAAAAATTATTTTTCTGGTTTTTTTTTCTCAATTTTTG
-CAAAATCAAAATTATAATCAATTTTTAATCCAGAATTCGTCAAGTGGCCT
-AGAATTCTACTGCGTGGCCTAGAAAATTCCACCAAAATTTAAATTTTCCA
-AATTGTAAAAATGCTCCAAAAAGTTGAATGGTGGCCGAGGTTTTTCGTTT
-TTCACTTTTCACAGCTACGGAAAAAAACTCGGCCACCAATAGTTTTTCCT
-AGGCCATGTTTCAAATGCCCTATTTCTATGTTAATTACAGTATTTTCTAG
-ACAAGATTTTAAAAAAACTCACGAATAGCACATGGAGCTCTGACACTTGC
-TCCCACCAATACAAAATTCCGAATTTTTTACAAAAAACTGCAAAACTATA
-AGAATTTGTGGTAGAAATTGGGGCATTTACGTAATAATAATAATAGAAAA
-ATGTCCGCAAATTTTTTTTCATAAATTTCATAGGGAGGAGGTAAGCTTCA
-GCTAGAAGCCATTCAATTTTATTGGGGCGCCGAAAATCTTCGGAACACTT
-TTACAATTTATACAGTAGTGTACAACTTTTACAACTTAATAATATCTTCA
-ATACTTCCAGAATATTCTTCTTTTTCCTCCTCAATTGCCACGTCATCATC
-TTGTAATCTGGTCCATTTTGCTGGCGAGGCGTCGGCAAACAGGCAGAATA
-TAGTATTTACGAAGAGAAGTAAGCCCGCATGCGCCAGGAAACAATTACGC
-CAGTCTGTGAATCTGAAAAAAATAATCTTGTCTTTTAGGGGACCTACGCC
-TGCCTGCCTACGTCTGCCTTGCAGGGGACCTTTGCCTACCTACTTGACTA
-CCTTCAAGTGAGACCTATGCTGGTTTGCCTGCATTTTTGTCAGTGCCTTC
-TAGGCCTATGCCTACCTTACAAACTATGTAGGTCAACTGCCTGCTTTCAA
-GGTGGCCTAGGTCAGCCTACATGCTATCTACGTCTACCCCAATGTACCCT
-GTGCCTATCTACCTGCTTTTAATGCTATCTGCCTTTTCGATAGTCTTTTA
-GGGAATCTACGCCGGTCCAGCTCACATAGGTTATCTATGCCTATGCCTTC
-CTGCCTGCCTCCAAAGTGACCTACGCTTACCGTGTTTTTTTTTCTAGACC
-GTATATACCTACATGCCTGCCTTTAAGTTTACCTATGCCTGCCTGCATTC
-CTCATGCCTGCGTGCCTACATGAATACCCTAAAAACTCACGTATCATCAG
-TAACAATCATATTGACGAAAAACGGTTCGATGAATATCGTGCAAGCCCAG
-ATGTTCATGATCTGGAAGAGAAATCGTTGGCCTAAAAATTTTCTCGGCCA
-CCCCCTTACCTGCTGCATTGCGAAATAGGCGTACTGCTGGGAGTGCAACG
-TGGCACACTTGTTGAATCCCGCCGTATTGCACCCCATCACACTTTCGGCG
-CAAATCTGGAATGATGGAAGAGAATAGGAAAACTAGGCCATGGATGTATG
-TGCGCTATGTTGATAATCGGTTATTTTCAACGTGGATTATCAATTGAGCG
-CACTTGTCCCACTGGAAGAGTTTTCCTATCTAGGCCACCACCACCACCCA
-CTCACCATTATAATAATAGCCAGCAAGTGTTTTTCCTGTGGAATAAATGC
-TAGAACGATGAAAAAAACGGCGGCCACGGCCAGAGCGATTGTGTTGAAAA
-TTTTAGTTTTCAGAGTTTCTGAGATGAATCTGGAATATTGATTTTTGGTG
-GCCGTAGAGAGGAAAAACTCGGCCACTGATTTTTTTCACAATTATAAAAT
-TATTTTTCCAGGAAAAACCCCCGAAAAACTCACTTAATATAATCACTAAT
-AATTCCCGACGATAATTTCGTAAAAAATTGAAAAATAATGGGTAAGGCGG
-CCAAAAAACCGGACGAAAGTACGTCATAGTTCAAATAATTTTTCATATAT
-TGCGGATTGAATTGGGATACCAATTGAACTGTTATCAAATCTCCAAACGA
-TGCGATCCAACAAGCCCACAGGCTTAAACTTGTCAGAATATGACGGAATG
-GAAGATTTTTTGGCCGGGATACCTGCAAAACGAAAAAGTAACGGGCTTCG
-AATTTCCCCCCCCATGTTTTCAAATGGAAGAGGTGGCCGTGAATAAAGCT
-AACCTCGACCGGGGGTCGCGACTCGCGACAAACGGGAAAACTCAAAGAAA
-TTTCGTACTGTCGCTACTTTTTTTGAGTTTTCCTGTTTGTCGCAGGTCGC
-GACCCCCGGTCGAGGTTCGCTTTTTTCACGGCCACCTCTTCCATTTGAAA
-ACATGGGGGAAATTCGAAGCCCGTGAAAAGTTAGGCCATGCAATGCGATG
-TGGTGGCCGAGGTTTTGAAAACTCGGTTACTCTCATGTAAAAAATCTTGA
-AGTTGAAGCAAATTTGCGTACATGAAACCCATTTACCTTGCTAGCAGTTT
-TAGAAAAATTTGGGATTTTCTCATACTAATGAGGGAACGTCTTAATTGTC
-GACAAATTGCGTACCCCGAGGAACCCACTAATTCAGTCCTAGGTTTAGGC
-ATAGGCTAAGGCATAGGCTTAGGCGTAGGCCTAGGCTTAGGCTTAGGCTT
-ACACGTGGTGTCAGAGTGCCTCATTTCGGCTTGATCTACGTAGATCTACA
-AAAAATGCGGGGGAAGAGCCGCAGAGTTTTCTACTGATTTCGCATGGTTA
-AGAGTGTGCTGACGTCACATTTTTTGGGGCAAAAATTCCCGCATTTTTGG
-TAGATCAAACCGTAATAGCACAGCCAGGCACCACGTGCGCTTAGGCTTGG
-GCTTTCCGTAGTCCTTCGGGCGCGTTTTTCTCAAAAATGATACGTGGTAC
-AATTTCAGGTTTTTTTCCGCTCCAAAATCTAGTTATAATTTGTGTCCGGT
-AGAGCGCGTTTGCACTCACTTTCTTTCCCGATTTCCCTTCTCGAATCCTC
-TCCAATTCCTTCTCGCCAACCCAACTGTGCTCACTCGGCGAGCACTTGAA
-AAATAGGAAAAACAGCGAAAAAGTGACCAACGATACACCGGCGTGCACAT
-AGTAAACCGACGTCCATCCACCAGACGAAGAGCATAACCATCCCGAAACT
-GGCATTGTAAATATATTTGAAAGTTGTGTATTTCCGGTTAATAGGCCAAT
-GAATACTCCGTGCTCGTATGGGGTCGCCCAATTTGCTGTAATTGAGCCAG
-CGAGGGGAAATGTGGCTGAAAATGCCATTCCTTGACAAATACGGGCGGCC
-ACAAACCATCCGTAGCCAATGGTACTTGCCAACGGGATAAGGGCTGTTGA
-AACTGGAAAAATTGAGTGCAATACATCATATTTGACGCGCAATTTTAAAA
-TTTAAAAAATGGAAACGCGCTCTAATGATGCTTGGTGTACTCCTCTCGGA
-CAATAAATGTCAATAATTTTTGAAAAATCGATAATTTTTTTTTAATTTCA
-GAAAAATTCGTGAAATCTGTTTTATTTTGCGCGTAAAATATGATTCTTAA
-ATACTTAATTCAGTATTTTACGCACGTGGTATCAGAGTGTCTCATTTAGG
-CTTGATCTACGTAGATCTACAAAAAATGCGGGAGAAGAGACGCAGAGTTC
-TCAACTGATTTCGTATGGTTAAGAACGTGCTGACGTCACATATTTTCGGG
-CAAATAATTCCCGCATTTTTTGTAGATCAAACCGTGATGGGACAGCCTGA
-CACCACGTGCTTACGCGGAATTTTTCACAATTTTTTGTGCTTCATGCACC
-ATGTTTTTGTTTCGAAAAATCAGATTATTGTTTTGCGCGTCAAATTCAAC
-GCCCACTGTGCAATACACCATATTTGACGATCAATTTCAAAAATTTTGTA
-TGCTTTCGATGCATGCTTTTTGGGGTACTGTAGCTTTGAAAATACGCATG
-CACTGGATCTGACGACAAAATGCACAGTTTTTATAAAATTAGTCTATAGA
-AATTAGTCAGTTTTCTCGAAACAAATAAAAACTACAGAAAACTCGGCCAC
-CGATATTTTTTTTTTTCGCGGCCACGATTGACGTCATACCTCCCGAAATA
-ATTCCGGCGACAATGAAGACAGGTTTATGCGGCAAATGTTGAAAAGAAAT
-GGAAAATGGAATCGAGGCGGCAAGACTTCCAATAGCCACACACGATTGAA
-GAAAATTCGACTCTGATTTGGTATAGTTCACTGAAAAAATCAACTATTTT
-GGCGGCCGCCAATGGAAAAACTCGGCCACCGAATTAAAAAAAAAACCTTT
-TGAAGTTGAAGTACTATTATCATCTTGCATACAAATTTTTGTAAAATTAT
-AAGTATTCATATTTGAAAGAATCGAGGTCAAACACAGTGTGGCACATATT
-AAAATCTGCAAAAAAATCGTGAAAATTCAATTTTCCGGGGGTTTTGAGTT
-CAAAAAGTACCAGAAATCGGACAGGAACCGGCGAGTTGACCATGGTGCAT
-CAGAAACCGGAATTTTAAATAAGTAAAAAAATTTATGATGCTCGTGGTGA
-TAACGAAAAGTGCAGTGATCAATTTAAGGGAAATACTGCTGGGGGATTAA
-ACGTTGACACTGTCAACTTGATAGTGTTAATTTGATCAATGCTTTGTACT
-TGTTTTTTGCAGGAAAAATTCTTTGAAAATTGCAAGACTATAGTATAGTC
-TGAAAATTTGATGAAATCTAAAACTTTAATAAATACCGTTAATTATCATT
-ATTTTTATGAAATTTTAATATAATCTACTTAAAATTTAATTTTCTAGGCA
-TCTGTGAGCTTAAATTTTCGATTATCCCTCGCCAAATTAAAGATTTGCAG
-ACTTTTAAGCTTATAAGCTTATTTCAGTGAGAGAGAGCATTGTGAGAAGA
-GAAACGCAGACGAGGCTGGCGCGTTTCTCGTGCTCTGACGCGAGTCTCGA
-TTTGCTTGCGCATTTCTCGTGCGCGCGACGTTCATTTTATTTTTCCGATT
-TTTTTTCAGTTTTTCTGAACTTTTCTTCTTGAATTTGTGATTTTTTATTT
-ATTTTTCACGTCTTGTTGCAAAATAACTGATTTTTCACACAAAATATTCG
-AATTTTCAGGTCGGCAACATGGGATTCTTGTGGAAAACTGCAAAACTCGG
-AATTAAAGTTGGACTCGTCGCCGGCGCCGTCAAACTGTCAATCGATAACG
-ATATTTGGTCGACTAACAATGTTAAAGTATTAGTTTTCCCCCGTTTTTCC
-ACGAAAATTTTCATTTTCAGGGCAGCGAACTGTATCAAAAGCTTAAAAAG
-TACATTCTTCCCGGCACCGTCGTCTTTCCAGAGCAGGTTTTATCGATTTT
-TTCTCTGAAAATGCAATTTTTTTCTTATTTTCAGCTCCCAACAGTCGAAG
-ATGTGCAGCTGAAGGCCGGTGGAAAGTGGAACAGTGCTGTTGACTCGGTA
-GGCTGCATTTTTGAGAGGAAACACGGAAAAATTGCTGCGAAAGTTGGAAA
-AAAGTCCTGGAAAATGGAGATTTGGCGCCGAACGTTCAAGAAATTCCATA
-ATTTCAAAAATCTATCTGAAAAATTGAAAAATATAAATTTTCAGTCATTT
-TTAGTCAAATTTCAGAGCTAAACGTCGAAAAAAGTGCCTAAAACTAGGAA
-AAATATGACAAAAAGACACAAATTTTGGAGAAAATTGCTGAAAATAATGC
-AAAACACTTTTTTTCACAAAAAGCGAAATTCAAAAAAAATTCCACGTCAA
-AAATTAACCAAATGCAAGTACGCTCCATCGCACTTTTTTCCAATTTCTGA
-CTCGAAAAGTCTTAAACTTCTGGTTTTGTAGGAAAGATAATGCAAAACGC
-AATTTTTAGTCCAAAATTCAGAGAAAATTCTGAAATTGTTTTTAAAAAAA
-ATGCAAGCACACTCCATGGCACTTTTTTTTCAAAATTTCGCGTAGAAAAT
-TACAGACATTAGCAAAATTCCGACGATTTCGCTGCGAGACCAGAAATATT
-GTAGGAAATTCAAACATTATCCGAAAATAATGCAAACGCGCTCTATCGCA
-CTTTTCTCCAAGTTCCCACTCAAAAAGCATAGAAAATACCTGAAATTGCC
-GTTTTTTTTCACCGGAATTTCAAATTTACGCGATTTCGCTGCGAGACCCA
-AGCTAGTGCAGTGGAGCGCATTTCCAACAATTTCAAACTCAATTTTTTTC
-AGGTATTCACCACAATCGAGAACGTCCCATCAAGCGTGAACACAGTGGCC
-AATCGACTCATCAATAATAAATAAATTCCCCATAAAAATTATCGATTTAT
-CGATTTTCCCCCCGAATCCTCGTGTATTCCTTCGTTAGAATGTACTTTTT
-CCCTCCTCATTTTCTAGAAGTATTTGTGTGTGTGCTCTATGAAAAAATTT
-GCAATTTTTGACTTTAAACGGACGGTGCATTATATTATTTTATCAGTTCC
-CATCGTTGATCAATTTTCTCCACTGATTATCAATTCACTGATAAGCTCAC
-ACTGCCTGCCCAACTCAATTCATCGCAACTTCTTCTCCCTGCTTTTTTTT
-GCCATGAATTCGACGGTGGCTTCCCGTTTCTCATGGGGACTCATTCTGGC
-GTCGATCGATTTTTTGGCGTGCCTACTGTTCGCCTGCCTGCATGATGGAA
-CTTTCAAATTCGCGAATTTTACTTCGCAATTTGGCGATTTTTCGTTTTTT
-ACGAGGTTCGATTGATTGGTGGCCGAGTTAATTTTAGGCCACGAAAAATG
-AAAATTGAAGCCGAGTGTCATTTTCGCTGGAATTCTAATTTTCAGTGTGT
-AAAAATATAGAAAACTGCAAAAAATTTTGAATTCCCGCCAAAAACTAACG
-TTACGAGACCCAAGTACAGTGGAGCGCAGTTGCAAAAAAAAATTTTTAAT
-GATTTTTTGCAACTACGCTCCACAGTCCTTGGGTCTCACAACGTTGAAAC
-TAAAATTTTGGAATTTCTCCCATAACTTCTTATAATAACGATATTCGGTG
-GTCTCGACACGACATATTTTCATTAAATAAAACGGGTGTGCGCCTTTAAA
-GAGTACTGCAGTTTCAAACTTTAGTTGCTAAGCGTATTTTCAACAAAGCA
-ACGAAAATTTGAACTTACAGTACTCTTTAAAGGCGCACGCCCGTTTTTAT
-TAAAACAAAAACTTGTCGTGTCGAGACCGGGCACCGTAGTTTTGACGCTA
-AAAATAAGATTTATGAAAAAGCGGGTTTCCAGAAAATTTCACTTTTCAAA
-CTTTGATGAAAATTTGAAGTTTCCAGCCAAAATCGCTGCGAGACAGTGGA
-ACGAGTGCAGTAGAGCGAAATTGCTGTAAAATTTTGAAAAAAAAGTGAGA
-AATTTAAAAACACGGATTTCTGGCCTCCCCCGTAAATTGAAATGGAAGAG
-TTTGCCGAACTAGGCCACTTTGGCTCGCCCATATCTGGGGTAGATTTACG
-GCGCGTTGCGTGTCGCGACGCGATTTTAGTTGGAAAACTAAATGTTTTTG
-CCCGTGTGGAGTACACGACTTTCCCACGTGTTGTCCTCTAGGTGATTGTC
-AATGGAGCGCAAAAAATCCAATGAGGAAGGCCAGAACCCCGTGAAAAAGT
-ACGCGTTTTTGAAGCAATTCATCGAAAGAAGACAGTAAAAAAAAAGTCAA
-AAATTCAAATTTCCAATAGAAAAACCACCAAACCCAACAATTTTTCCAGC
-ACAATCGACCTATTCTTGCTGCAATTTTTCCGTTTTGCACTATGGATGGT
-GCCGGCGGCAATCCACGTGGCCAACAAGGCGGACACGTTGACAATGTGGA
-AAGAGGTCGGTGGCCGCGTGGCCTAGAAATCCCGAAAATTTCAAATTTTC
-AGCCAATTTTCTGCTCGGCACTGCTCATCTGCGCGGCGAGCCCCACAAAA
-TTGCTCCTCCTCACAGAAAAGCTGAAGCCCGATGAGTTCCTCACTTTCGG
-CGACACTGCCTTCCTTGTCTGGAATTTCATTTCCGCGATCATTTTGAACT
-CCTCGTGGACAAGATACTTCTCGCGAACTCCGTCTTCATATATAATTCTG
-GAGGATGAGGATGTAAGTGCGCTCCGCTGAGAAAATGTTTTGATCACCCC
-CACGATTTTCAGCTCGAGGTGGCTCCAAAACAAACGTTTGAGCTTATTTT
-CCGCCTGCTCCAATACTGCAAACGTGAATGGCTCTGGCATATTTCCGGAT
-TCTCGTGGCTCTTTATTTATTCGATCAGTAAGAGAATATCCATCGGGGGT
-TTTTTGTTTCGAATTTAAAAAAAAACACAAGTGGAAGAGTTTTTAAGATT
-TCTAGGCCACGCACCCACTCCAAAACCCCAATTTTCAGCCCGTATCTTCG
-TTCCCTATTACACGGGACAAGTCATCGCTACCGTGGTCGCCACAAAATCG
-TACCCAGCCCTCTCCAACGCTGTCTACATCATGACAATCATCTCGTTGGT
-GAGCGCTGTCGCCGCCGGATTCCGTGGAGGATCCTTCGAGTACGCCTACG
-CAAGGATCCAGAGGGCAATCCGCTACGATTTGTTCCACGGACTCGTGAAA
-CAGGATGTCGCTTTCTATGATGCTCACAAGACCGGAGAGGTGACTTCTCG
-TCTGGCTGCTGATTGTCAGACTATGTCGGATACAGTTGCGTTGAATGTTA
-ACGTTTTCCTCAGGTAGGTGTGGGTCCGTGACCGAAGTTCCCAGATCACA
-TGACCTAATTTTCCCAAATTCTTCCAGAAACTGCGTTATGCTCCTTGGAT
-CGATGATCTTCATGATGAAGCTTTCGTGGCGCCTCTCCCTCGTCACATTC
-ATCCTCGTCCCAATTATCTTCGTCGCCTCCAAAATCTTCGGAACATATTA
-TGATGTAAGTGCGCTCCAGCGAAAACGTTTTTCTAAAGTTTTGACCCCAA
-AATTCTGTCAAAGTGCCCCATTTTGGTTTGATCTTCGGAAAATGCGGGAG
-AAGAGGCGCAGGCTTTGCAACTGATATCACATGGTTAAGATTGTGCTGAC
-GGCACATGGAAAAATTCCCACATTTTTTTGTAGATCAAACCGCACCTGAC
-ACCACGTGAAATTTTTGACAAGTCAAGAAAAATTTCGGCAATTGTGAAAT
-AATCGAATTACCGCCGCACGTGGTGCCAGGCTGTCCCATTACGGCTTGAT
-CTACAAAAAGTGCGGGATGTTTTTGCCCAACAAATTTGACGTCAGCACGT
-TCTTAGTCATGCGAAATTAGTTGAGAACTCTGCGTCTCTTCTCCCTCATT
-TCTTGTTGTTCTACGTAGATCAAGTCGAAATGACCCACTCTGACATCACG
-TGCCGCCTCCCACCCCTGCTCCGACCAGGAATCAGCGGATCTACTTAGTC
-TCAACTTGTTTTATTTCAGCTCCTCTCCGAAAGAACACAGGACACAATTG
-CCGAGTCCAATGACGTTGCCGAGGAAGTTCTCTCCACAATGCGTACAGTC
-CGATCCTTTTCCTGCGAGAACGTCGAAGCCGATCGCTTCTACGGGAAGCT
-CACCCACACACTTGATGTCACCAGAACCAAGGCGATCGCCTATATCGGAT
-TCCTCTGGGTCTCCGAACTTTTCCAGTCGTTCATCATTGTGTCAGTCCTC
-TGGTATGGAGGCCATCTAGTGCTCACCCAGAAAATGAAGGGAGATCTTCT
-AGTGTCATTTTTGTTGTATCAAATGCAACTCGGAGATAATCTTCGTCAAA
-TGGGAGAAGTCTGGACAGGATTGATGCAATCTGTTGGAGCAAGTCGTAAA
-GTGTTCGAGTACATTGATCGAGAGCCCCAGATTCAGCACAACGGGGAGTA
-TATGCCGGAGAATGTTGTTGGAAAGATCGAGTTCAGAAATGTTCACTTCA
-GTTATCCAACTCGTTCCGATCAGCCAATCCTTAAGGATCTCTCGTTTACC
-GTTGAACCAGGAGAGACTGTCGCATTGGTTGGACCATCTGGCTCTGGAAA
-GTCTTCGTGCATTTCTTTGCTTGAGAACTTCTACGTCCCGAATGCTGGAC
-AGGTTTTGGTGGATGGAGTTCCGTTGGAAGAATTCGAGCATCATTATATT
-CATAAGAAGGTACGTTGGCGTCAATTTCGGTTCGACAAATCGTTTGCCGG
-TTTGCCGGCAATTTTAATTTTTGGCAAATTGCCGATTTGCCGGAAGTGTT
-TAGAGTGCTTTTTTATAAGACGGAAACACTTGAAACTGTGTCCGTTTTTA
-AATTTTTGTGCCGGTTGGCGATTTGCATGATATTTTCAATTCCGGCAATT
-TGCCGATTTGCCGGAAATTTTCCATTATGGCAAGTTGCCGATATGCCGGA
-AATTTTGATTTCGAAAAATTGCCGATATGCCGGAAGTTTCAATTCCGGCA
-ACTCGCCGATTTGCCGGAAATTTCAATTCCGGTAATTTGCCGATTGGCAG
-GAACAAATCGTTTGCTCGCAGTCTATTCGGATAAAAATTGCGCCAACTGT
-TCATCCGTTTGCACAGAAAAAGCATTTCCGCGCTTCGCTATTGGCCAATT
-TCAAAATAGTGGGCGTGACCAACCAATCACGGGTGTTTCTTGCTTTCCAT
-TGCTGAAACTGTGATTGGTTGGTCACGCCCAATTTTTTGAAATTGACCAA
-TTGCGAAGCGATGACTTTGGACGCAAGAAACTTCCGTTTTCTCCTTTAGC
-TGTCGATCGAGATTCTCTCCTTTAAAAACACATTGCCGATCTTTTCAAAG
-CCCCTGTTTCAAACGACACAGCTAGTAACAACAAAAAACCTCGAAAACTT
-CCAATTTTTCAGATCGCCCTTGTCGGCCAGGAGCCCGTCCTGTTCGCTCG
-TTCTGTGATGGAAAATGTCAGATACGGTGTCGAAGTGGCGGATACGGTAA
-GCACGATTAAATGCACCATGAGCCAAACAAAAAAACTTGTTCAGGAAATC
-ATTCGCTCTTGTGAAATGGCGAATGCTCACGGATTCATTATGCAAACCAC
-GTTGAAATACGAAACAAACGTCGGAGAGAAGGGAACACAAATGTCCGGTG
-GTCAGAAGCAACGTATCGCAATTGCTCGTGCTCTTGTTCGTGAGCCAGCG
-ATTCTCTTGTTGGATGAAGCCACGTCGGCGTTGGACACCGAGTCCGAACA
-TCTTGTTCAGGAAGCGATTTATAAGAATTTGGATGGAAAGAGTGTCATTT
-TGATTGCACATCGATTATCGACTGTTGAGAAGGCTGATAAGATTGTGGTT
-ATTAATAAGGTGAGTTGCAATTGCGCTCGACCGAGATTTGGTCGCAAACC
-TGACACGGGGTTCTGGCCTTCCTCATTGAAATTTCCGCGCTCTATTGACA
-ATCGCCTGCCGGACAACGCGTGGGAAAGTCGTGTACTCCACACGGACAAA
-TACATTTAGTTTTACAACTAAAATCGAACCGCGACGCGACACGCAACGCG
-CCGTAAATCTACCCCAGATATGACAGAGCCAAAATGGCCTAGTTCAGCAA
-AAACTCTTCCATTTCAATTTATGAGGGAATCCAGAAATCCGTGCGCCCGT
-GGTGTATTACTCGTGGATAACTGCTCATATTTCAGAATTGAGAATTTCGC
-TAAAAACTGTAGAATCGCGTTAAAAATGAGACCTCACCAAAACAGGATTC
-ACGAAACAAGAATTCACAGAAATAGTATTCAGTGGGCGCAGTGTGCGCAG
-TGTGCGCGGGGGTTGCGAAAGCACACTTTTCGGTCCCGCCCCCTAAATCG
-TGTTTTTCGTGAATACTGAATCTGGGAAATTTGAAAACTCGGCGAGTTTT
-TCTGTGCGGCACACCCACGTGGTGTCAGGCTGTCTCATGGCCCGACAAAG
-GGTACATCAGTGTAAATGCGCTCTACCGAACAGAACGCATAACCCACGTG
-GTGCCAGGCTGTCCCATTACGGCTTGATCTACAAAAAGTGCGGGATGTTT
-TTGCCCAACAAATTTGACGTCAGCACGTTCTTAGTCATGCGAAATCAGTT
-GAGAACTCTATGTCTCTTCTCCCGCATTTTTTGTTGATCTACGTAGATCA
-AGCCAAAATGAGACACTCTGACATCACGTGATAACCTGGTTGATACTACG
-CGTACGGCTTGCCGGGCCGTGTTTCTCATTGCGGTTTGATCTACAAAAAT
-GCGGGAATTTTTCCCCCAGGAAAGTGTGACGTCAGCACACTCAGTCTGCG
-TCTCTTCTCCCGCATTTTTCGAAGATCAAACCAAAATGAGACATTTTGAC
-ACCAACACACACACACACACACACACACACACACACACACACACACACAC
-ACACACACACACACACACACACACACACACACACACACACACATCATATT
-TGACGAGCAAAATCGGCCCCATAATTACAGGGAAGAGTCGAACAAATCGG
-AAATCACGAAACCCTACTGAAGGACACCAACGGAACCTACGCGAAGCTCG
-TTCAACGCCAAATGATGGGAGATCAGAAGCCACGTAAACGGCCGGCGGTC
-GCCAGATCGGGACCTCAGCCAGCCGCGTCAATCAACGTGGCAGGACCATC
-GCAGGGTAATGCAATGTCCCTGTTGTCGACGTCTTTCAGCCAATCTGCCA
-GTAGTGTTACTTCTCATTAATTGTTTTTTCTTCTTGTTAATTGGCAAAAT
-ATTATGATGAACTTGTTGGGTTGATTAATTTGTAAGAATAAAGTATACAA
-TTATTCATTCATTATTAAAATTTGGGCACATAGAAAAAATTGTGGAAAAA
-CTGTAAAAAATCTGCAAAAACGTGGAAATTATTCAAATCAACTCCAGGTA
-GTCGTTGTCGACATCGTCTCGCTGCCGCATCGTGTTCTGAAAATCCATTT
-TTCACTTTTTTTAAAGCAGATTCCCAGCTAACCGTCGACCGGATCGTGTT
-GTTCCATCCGCGGATTTGAGAGTAGGAGCTTACGGTGCCACGTGTCTCGT
-TGGCAGCTTGCCAATTATTCACAGACAGCCTGTACGAGTCGCTCAACAGT
-GGACCGGCGTTTAGAGTCTGAAAATATATAACGGGAACACTAAAATTTTA
-GAATGCGTATTGTGCAACACATTTGACGCGCAAAATATCCAGTAGCGAAA
-ACTACAGTAATCCTTTAAGTGACTGCTGCACGTGGTGCCCAGCAGGGCTG
-GGAATTTTTTGGTTTTTTGGTTTTTTTGGTTTTTTGGGACCAAAAATCCA
-AAAAATCAAAAAAAAAAACAAGTTACCGTGTCTAGTCTCGACTCGAGACT
-ATTCTGTATTAAAATACATCGAAACATGTATTTTAACACAGTTGTGACGT
-CATAATGTAATACATTTGGCAACATTACTTGAATAACCCCATTAAAAATC
-ACCTAAAGCATAAAACATTTTTTGGTTTTTTTTTGGTTTTTTTGGTTTTT
-CCAAAATTTCAATTTTTTTGTTTTTTGGTTTTTTTGGTTTTTCAAAAACT
-TCAAATTTTTGTTTTTTGGTTTTTTGGTCCAAAATTTTTTTTTGGTCCCA
-GCCCTGGTGCCCAGCTGTCCCATTACGGTTTGATCTACAAAAAATGCGGA
-AATTTTTTGCCCGAAAACATGTGACGTCAGCACGTTTTTAACCATGCAAA
-ATCCATGCTTCTCCCGTATTGTTTGTAGATCAACGTAGATCAAGCCGAAA
-TGAGACACACTGTGACCGCGTGCTACTGTAGTGCTCGTGTCGATTTACGG
-GATCAATTTTCGAAATGATTATACATATAATTATCGATAGAATAATAAAA
-TTAAGCAAAAAAAAATCGGAAAATAATACGAAAAAACAAAGGAAAATTGA
-AAATCGCTGTCAAAATTCGAAAAAAATTAATTTCGAAAATTGAGTTCCCG
-TAAATCGACACAAGCGCTACAGTAGTCATTTAAAAAGGATTACTGTAGTT
-TTCGCTACGAGATATTTTGCGCGTCAAATATGTTGCGCAATACGCATTCT
-CAAAATTTTGAACTCTCCGCCTCTCACAGCTGGGTCTCGTTAGGTATGGG
-GGCGGATCCTTTTCAATTGGCGGTGGAGCGCGATTGAAAAAATTTTCGAT
-TTTTTTTCGATTTTTCAGAAAAAATATCGATTTTTTCCGATTTTTCAGAA
-AAAAAATTCGATTTTTTTTTGATTTTTCACAAAAATTATCGATTTTTTAG
-ATTTTTCAGAAAAAATATCGATTTTTTTTTCAGATTTTCAGAAATTATTT
-TGATTTTTTTTTAATGTTTTGTCCCTTTTTCTGAAATTCTACCTCATAAT
-GATTGCTTCTTCCACTTCCGCCTCGCTGCCCGTAGTTCAGTGTCGAGTAA
-TTCGCATTCGATACTGTGTAAATCGACAGTGGAATAACCGGGTAGATCAT
-AATGTAGTACAATGTGGCAAAGTGGATCACTAACTGAAAATTATTGGATT
-TTTCTAATAATAAGGTGGGGAAATCCGAAATATGTGAAAAATATTTTTAA
-TAAACAAATTTTCCCCTGATTCCGAATATCTATATGAAAAAATTCAAAAA
-AAAATTTTCCAGATTTTATATTTAAGCTTGAAATCGCTTGAGCCCGCATC
-ACTATTTTCAAATGCTTGCCCAAAGAAATTTGCATTAGAGCGCGCTTGCA
-TAGTTTGATTTTCTTCATTCAAATATTGTATTTATTACCGCCAAATTCAA
-TTTTTTAACCGGTTTCATTCATTTTTGTCGAAAAAATATATTTTTCAGAA
-AAAAACCGGTGAAAAAAAACCAAAATCGACAAAAACTAATGAAGCTGGCT
-GATAAAAATTGAATTCGGCGAAAATAAATAAAATATTTAAATGAAGAAAA
-TTCTTAGGCGCAAACGAAATTCGCCATTTCAAGCTTAAATATAAAATCAG
-GGATTTTTTATTTATTTTTTTTTCACATTGATTTTCGAAATCAGGGAAAA
-ATTTGGGGTTAATTATAAATATTTCCCAGATTTCGGTAAGAAAAATATGA
-TTATTTTTTTACTAAAAAATAACCCCCACCAGTAAAGCGTAGAAAATTGA
-GATGATAAATGCGAAAATGATGAACGCGGAAGAAAAAAAGTCGGGATTCT
-TTTGGGCAGTGCTGGAGTAGTTGAAGATCGAGATGATTGTAGAATAGTAG
-GACAGGAATGAAACAATCATCTGTAATTTATTTTTTTAAAGCTTCCAGGT
-CAATACACGTGGTGTCAGAGTGTCTCATTTCGGTTTGATCTACTGTGTAG
-ATCTACAAAAAATGCGGGAGAAGAGACGCAGAGTTCTCAACTGATTTCGC
-ATGGTTAAGAACGTGCTGACGTCACATTTTACTGGGAGAAAAATTTCCGC
-ATTTTTTGTAGATCAAGCTGTGATGGGACAGCCTGGCACCATGTGGGTGC
-CGAGGGTATTGCTTTTTGGTATTTTTTGGAATTTCGAAAAAAACTTTCCG
-ATTTTTTTGAAAATAGCTCTTTTTATAGAAGAAAATAGTTTTTTCTCATC
-AACACAAATTTTAGAACAATTTTTTCGATTATCCGGAAAATTGAAAACTT
-TCGTTTTTCTATGTTCCATTTTCGATTTTATAAATTTGGGAAAACCTAAA
-ATTTCGATTTTTTTTGAAAAAAAAACGAGTATTCAATAATTTATATATTA
-TAGGCATTCTTTTTCTCTAATTTCTTCTGAAAAACATTAAAAAAAAATTT
-TTTTTTTTTTAAACCAATTTTCAGTAATTTTTTTCTGTAAAAAATACGAT
-TTTTTTCCAATAAATTTCTAGTTTTTTCTCTCTTTTCGTACATTTGGACT
-GTTTCTAATTTTTGCTTGCTTTTTTCTATATTTTTTCTGCGATTTCCTAT
-GAAAAGTACCAAAAAATCGGAAATTGTTTTTTTTTTTCGATTTTTTAGGA
-AAAAAAACGATATTTCCTATAAATGTTTTTTTCATAAGTAAATACTTTTC
-TCCTTTTCCTTTTGATCTACAATATTTCGAATTTATTTTGAAAAAAATTT
-TTTAAACGTTTTTTTCTGAAACAAAGACCCAAATTTTCAATAATTCAATA
-ATTTTTCTGGATTGTTCAACCGAAATATACACATTTTTCAATAAATTTAT
-AGTGTTCTCCTCTATTTTTGTTGATTTTTACTACTATAATTTTTTCAAAA
-TTTTCGAAAAAAAAAATTTTTTTTTTGGAAAATTTTAATTTCAATTCGAT
-TTAAAAAATATAAATGTTCATATTTTTTCATCGAAATATATATTTTTTGA
-TTTTTCAACCTTTAAATTGTTTCATTTTCTCTGAAAAAATCGGAAAAATC
-AACAGAAAAATCGAATTTTTTAAAAATATTTTCCGATTCCGACCGTAATT
-TTTATGAAAAAAAATCGGTTTTCTCGTTATTTTCTACAACAAAACCTCAA
-AAAACATGCTGGGCAACGTCAAAATCGCTCGATATCGAATCTTCAGCTCA
-GTCTCATGTTTCACCAAATACACCGCATACAGAAACATCGTGCAGCTGAT
-GAAGAAGAAAATGAGCAGATATGCACACTTTTCCACGAAAAATTCGCCCG
-AAATCATGAAACGTGGCAAATTGAGCACAATTCGATGGAGCCAATAGCAG
-GTCGATGAGCTGCAGCGGAAGCTTTCATTGGGATCTGTGCAGTACGTTGG
-AACCGATAAATGTTCCTGCATTGATCGGATACAGTAGACGAGCAGGCAAA
-TGTATTTTACAAGTGAGATATTCTGAAAATTTTTGAATTTTTTTTCCGAA
-TTTAAAATTTTAGTTTCTCGATTGTTTTGAAGTAAAAAAATTGATTTTTT
-AGAAAATTATATGTTTTGTTTAATTTATTTAAAAATCTTTAAAGGTGGAG
-TAGCGCTAGTGGGGAAATTGCTTTAAAACATGCCTATGATACCACAATGA
-CCGAATATCATGATAAAAAAATTCAAAAAAATTTTCTAAATTTTATAGGT
-TTTTTTTTGAAAATTGAAAAATCTCAGTTTTTGCCTAATTCCAATTTGAA
-TTACCGCTAATTGGATTTGTTCGGTGGAGCGCGCTTGCACGTTTTTAAAT
-TTTTTTATTTTATTTTATGTTATTTTCCACCGATTTTTAATGTTTTCGGT
-GTATTTTTGCTCGAATTTTAGAGAAAAAGTCAAGATAAATGCAAATTTTC
-AATTAAAAAGCACGCTTACAGGCGTAAAAATGACAAAGTACCGATTTTAA
-ACGATTTCCAACCTGAATTAATTAATTTCACTGATTTACGCCTGTAATCG
-TCTTTTTTAATTGAAAATTTGCATTTATCTTGGCTTTTTCTCTAAAATTC
-GAGCAAAAATACACCGAAAACATTAAAAATCGGTGGAAAATAACAAAAAA
-TAAAATAAATAAATTTAAAAACGTGCAAGCGCGCTCCATCGAACAAATCC
-AATTGGCGGTAATTCAAATAGTAATTAACAAAAACTGAGATTTTTTTCAA
-TTTTCAAAAAAATCGTATAAAATTTAGAAAATTTTTAAAAAATTTTTTTA
-TCATGATATTCGGTCATTGTGGTACCGTGTTTTAAAGCAATTTCCCCACT
-AGCGCTACTCCACCTTTAAAGTGCTAATGTAAACTTTTTGTACACGTGGT
-GTCAGAAAGTCCCATTTCGGTTTGATCTACAAAAAATGCGGGAGAAGAGA
-CGCAGATTTCTCAACTGATTTCGCATGGTTAAGAACGTGCTGACGTCACA
-TTTTTTTGGGAGAAAAATTCCCGCATTTTTTGTAGATCAAACCGTAATGG
-GACAGCCTGGCACCACGTGTTTGTACAATTACACATTATCCTGGAACTTT
-CCAGAAAATTTGAATTTCCCGCCAAAACTTATGGGTCTCATCACGATGAG
-TCACTAACCTCAAACCGATATATTTTCTAAAAACAAAAACTCAAATTTTC
-TCAAACTACAGTAATCCTACAGTAATCCTACAGTACCCCTACAGTACTAC
-TACAGTACCTTGGCATTGTCCCCCACCAATATACAACCCAATATACCTTC
-AAAAAACAAACACGTAATTTTTCCCAAACTACAGTAATCCTACAGTACTC
-CCACAGTACCCCTGCAGTACTACTACAGTACCTTTTTAGAACATTTTTCT
-GTTTTTCGATTTTTTCGCAAAAAAAATTCAGTTTTTTCAGCAAAAAAATT
-GATTTAAAAATATTTCAAGTTACTTTTTAAAAGCTTTTCAAAAGTTTTTC
-AATCCGTAAAAATAAAATTTTACGAATTCTTGTATTTTTTAAATTATCTG
-AAATTTTTTTTTCTCAAAAAAAAAACTTTTTTTTTCAAGTTTTCAATTAA
-TTTCGGCAAATTTCAAAAATTTTAGGTTTAAAAAAATTCAATTTTTATGC
-TTAACATTTTATCGACATAAAAATCATTAACAACTACGAACAATTTGTGG
-AAAACGTTTTTGGCAGTGGAGCGCACTTGCGCCTCGTATTCAAAAAGCCA
-CACAAAATGGTGAAATATTCCCAAAAATCAAATAATTGTTTCGCTACGAG
-ACCCAAAATACCGCAAAATAGTAATTTTTACCATAGTAATTTTCAAAAGT
-GGCACGTAGACCTGATGAAACGTGTCGTTCACCTCCTCCGAGCTTCTGCC
-ACGTGAGCTGGTGCTCCGGCATGGCTGATACATTTGTGAAGTTCGCTAAA
-ACAGAAAAATATTATAAATAAGCGGAAAATTTCGTGGTCTCGACACGACA
-AAAAATAATAAAAATTATTCGTGGTGAGACCCGAGTTGTTTTGGAGCAAA
-ATTCTCAAAATTGGGGTATCACGTGGTGTCAGAGAGTCCCATTTCGGTTT
-GATCTACAAAAAATGCGGGAGAAGAGATGCAGAGTTTGCTGACGTCACAT
-TAAAAAAAAATTCCCGCATTTTTTGTAGATCAAACCATAATAGGACAGCC
-TGGCACCACGTGCGGGGATTAAAACCCGCGCCGCACAGAAAAAAGGCGGA
-GTGTTATTTCGCAACACCGCGGCACGGTTTTTTGTTGATCTTTTTCAATA
-GTCTTGATATTACTTGCGATTTTTGCAAATTCAAAAAATCAACAATAAAC
-CGACCGTGCCGCAGGGTTGCAAACTCCGCCTCTTTTTCTGTGCGATGCTG
-ATTTTTTGCGAAATTCACGAATCAAAAAGCACACGTGGTGTCAGTGTCTC
-TCATTTCGGCTTGATCTACGTAGATCTACAAAAAATGCGGGAGAAGAGAC
-GCAGAGGTCTCAACTGATTTCGCATGGCGCCACACATTTTTGGACAAAAA
-ATTCCCGCATTTTTTGTAGATCAAACCATAATGGGACAGCCTGGCGGGGA
-TTAGAAACCGCGCCGCACAGAAAAAAGGCGGACCGTAGTTTCGCAACACC
-GCGGAACGGTTTTTGATATTACTTGCGATTTTTGCAAATTCAAAAAATCA
-ACAAAAAACCGTGCCGCAGGGTTGCGAATTTACGCTCCGCCTCTTTTTCT
-GTGCGATGCTGCTTTTTTTGCGAAATTCACGAAAAAAAAAAAGAAAATAA
-AAGTACATTTACCGATAAAAGTGACGATAGACCGCCGATATACATGGAGA
-GAATAGAGAGAGAAATGTGAAGTTTATTAGAAAACAATTTTGTAAAATTA
-TGATGATGATGAAGATTTGCGGAATCTGGTAATCGGTTTTAATTGCCTTT
-TCTATTATATTATATTAATCACTTGATGATGTACGGCTTTGCGCTTCCTC
-GTCCACGGTCTCCAGATGACGGAATCCACGTGGCGATACTGATCGATTGT
-GTTTTGGAGTGGTGGTGCTGCTGGTGCTGGTGGAGGGAATTGAGGTGGTT
-GCAGTGGATATTACGCTGAAAAATTGAAAGGATTGGTGGAGGAAATGAGA
-GAAATTTGAGAGCATAAATTTTTAAAAATCGAAAAAAAATTTTTTTTTGC
-TATTTTTGGGCAGAAAATGGCGAAAACGGTGTTTTTTTGGGTAAAAAATA
-ATAAAAATTTACAATTTTTTTTGACAGAAAAATGCGGAAAAGCTGTTTTT
-AGGGTTGAAAAATCAAAAAAAAAATTTTTTTTTGCTATTTTTGGGCAGAA
-AATGGCGAAAAACGGTTTTTTCAAGTTTAAAACATCAAAACAATTTTTTT
-GCAATTTTTTTACAGAAAAATGAGGATAAGCGGTTTTAAAGGTTTAAAAA
-ATTTTTTAAAATTTTTTTTGCGAATGGAAATTTTCTGAAAAATCGTGCAA
-ATGCCTAATTTGTGCAAAAATCTTATCTGGTCAATGATTTTTAAGAGAAA
-ACACCGGTTTTAGAAGGGAAAAAGGCAAAAAACTGGATTTCCAGTGAATT
-TTATACTAAAAATGGAAAAAATTCAGAAATTTTTTAAGGAAAAATCAGAA
-TTTTCGCAATTTCTACACGAAATATATAGAAATTGAGGAGAACCTCGGAT
-TTTTTGCGGAGTTTAAACAATAATTTTTCGGCTAAAATTAACGATTTTCA
-GAGAAAAAACTTAAAAAAAACAGAATTTCAGTGAATTTTACACGAAAAAC
-GTAGCAAAAAGAGGTTTTTAGGGAATTTCCAAGTCAAATTTCCGAAATTC
-TTGCGATTTCAACCCTGAAAAATAGCGAAATTGAGGAAAATCTCGGATTT
-TTGCAGATAAATAATATTTTTTCCAATGATTTCCGTCTCCAAAACACAGA
-ATAATTTACCAATTCGACGATGGTGAGGAGGGAGAGCCCAGCTCGTTGGT
-GACAGCCGTGAGATCCGAGAACAAATTGACGCTGGCTGAAAAAATGGAAT
-AAACGCTAAATTGATGATTTCCGCTATTAAAGTGCATATAGAAATACGAA
-AAAGCAAAAAAAAAAATTTTTTTTAACCTTTTCCCTGGAATCGAAGAGCA
-GTTTGCTTGCGGATTGGACGTCGAAAAGGGCCTAAAATTCTCATTTTTCG
-GCCTGAAATTCCTCGAAAAACCCACTATTATTGGTAGTCGGAGATGGCTG
-ATCGCCTCGTCGCTGGTAATATAGCACGCCTAGCCAGAATCCGTAGAGAA
-AATAAATATAGACTGCCCACACTAGGATGATGGGAAGAAACGACAATCGG
-CAGGCGTCTGGAGTGAAGAAATCAAGATTTTTCAGATTAAAAATTAAAAA
-TCTTTAAAGGTGGACTACACCCTTGTTGGGAAATGGCTTTCAAACATGCC
-TATGGTACCACAATGACCAAATATCATGATTAAAAAATTCAAAAAATTTT
-TCTAGATTTTATATGATTTTTTGAAAATCGAAAAAATCTCAGTTTTTGCC
-TAATTCCTATTTGAATTACCGCCAATTGGATTTGTTCGATGGAGCGCGCT
-TGCACGTTTTTAAATTTATTTATTTTATTTATTGTTATTTTCCACCGATT
-TTCAATGTTTTCGGTGTATTTTTGCTTGAATTTTAGAGAAAAAGTTAAAA
-TAAATGCAAATTTCCGATTAAAAAATCACTGAAAATGCGTAAAACTGAAA
-AATATGCTAGTTTCAGGTTTGTTGTCGTCGGAACTCATTATTTTACAGTT
-TTACGTATTTTTCACATTTTTAAACACTTTTTAGCAAACATTCTGCATTA
-ATCTTGCTTTTTTACTTCTCTTTCCGATAAAAATACACAACTAATGAAGA
-AAATCAGTGACATAATAATAATAATAATAATAATAATAATAATAATAATT
-TATTACGCTCGCTGGGAGACGTGAAGGAATACAGAATACAAAAGTTATCA
-TTGTTCGCTTGAACTAGAATTGGTGCAGTCGGGCAATCGTTTCCATTCCA
-TTAAAATGTTGTCCTTGTCCTTGCGTTGTCCTTGCGTAGACTCCCCCATA
-GTGGGCGAGCGATTCCCGAGTGAAAATAATCACGGAATGAAAAAATAGAA
-GAAAAATAGAATAAATTAATAAAAAAAATAATGCAAGCGCGCTCCAACGA
-ACGAGTTCAATTGGCGGTAATTCAAATAGGAATTAGGCAAAAACTTTTTC
-AGATTTTTTCAATTTTCAAAAAATCATATAAAATTTATAAATTTTTTTTG
-AAGTTTTTTAACGTGATATTTGGTCATTGTGGTACCATAGGCGTGTTTTA
-AAGCAATTTCCCCACAGGGTGTAGTCCACATTTAAAAATTAAAAATTAAA
-AATTCTACCTAACAAAATCGAAAATTTCAGATTCTCCTTGATTAAAAGCT
-TTATTATTGAGTAAAGAGTCCGCAGCGTCCACACGGAGAGCGGGTACAAG
-ATGGAAATCTGAAAATATTTAGGATTTTCAAGGGAAAATATCGATTTTTT
-TTAGCAAAATACCACAGAAATTGCGGATGGAATGAGTAGAAGAGCCGGGT
-TGACTTTCCGGGGAAAGTTTCGACGTGTGATGCTCGTCTCGGAGAGCCTC
-ATTCCCAAGAATCCGGTTGCGATGCTGAAGAAAATCGATGGAAAAAGTCT
-AAAATATCCCCTGAAACCCTACCTAAAAATCAGAAAATACGAGAAAATAT
-TGATTAAATTCCGAGCCGGCACATAATTCGGGCGGATCAGCACTCCATTG
-AAGTTTCGAAACGTTTCGCCGTTCCACTGAAGTCCATCGAAGCCGGGAAC
-GGATGGCGGCTCGAAATGCTCGTCGACACTCATTTGACTGGCCCTGTAGA
-GCCCGATGATGGCAATGGCGAGCATTCCCACTTCCACATGGAATATCAGG
-CTCTGAAAATTAAAATTTAGCTTTTAGACGGAAAAAATCGATTACTTTGA
-CATGAACTTGATCGAAAAGCCAGCGATACGGGTATTTTCGGTGCAGGCGG
-CCTGATTCCGGACGTGCTCCTCGAGATATATTGGAATTTGTCGAGCGGAT
-ACTAATATCTGCCATTTTTTCGCTGAAAAATCAGAAAAAATAAGTTTTAA
-AACAGAATTTTAATGGAAAAATAAACGGAAAAATTCGAAACTTTTTTTTC
-CGCCATTGAACACCAATGTGCCTTTAAGGTACGGTAGCTCTTCGTGGTGA
-GACCACTGCGCCGCGCATCTGATTTCTCGTGGGAAATTTGTTTCGAATCC
-TACGTTTTTTACAGATTTTTCTTTTTTTTCGTTTCGCTCATCATTTTTTT
-GTTGCAAAAAATCCAATTTTCAGACAAAAATGTCAGAACGCCAATCCAAA
-TATTTTGACTATCAAGGTATCGTCATTTCCTCCACTGGACAAGATAACCA
-AGATTCGGAGACGGACCTCGTTTATCTCATTCAAGCTCATGTACGTGAAT
-TCCCTCCGTTTTCATATTTAAAATAATAAGCTCGTTTTCAGGGAAAAGCG
-GCCCCGAAGAACATCATGTACGGTGTCTCCAAGTGCGCATTTGTTCCAAC
-AAACTTGGAGAGGAATTTCGATAATATCGAAGAGGCAAAAAATCTTGAGT
-CAGTATTTATTTGATTTGAGCCCATTTTTAATCTGTTAACACTTGAATTT
-TTAGACGTCGATCCAAAATCCCGCTAAAGTTCGGTGAAGTCATCCTATGG
-AACGAATCGGACTGTGATCACGATAAGAGGATAATCCTTCATATCAAACG
-AGAAAAACCAATTTATGAAGCGTCTTCCAGCAGAAATGGACTTATTTTGA
-AAGTCGGTGGCGTCATCCAGCCCACCTCAACGACCTCGTTCTGGACGCCA
-TTATGCACCGTCACCATGCGTATGTTTCTTCTTGATTTTCGTCTCTCTAA
-CCATATATTTATTTCAGCAGAGACAGAGGCGACCCGTGCGGAGCCAGACG
-TTTGGCTATACGCCTGGATTCGATTCGAAACTACCATGAAGAGTGGTCTA
-GATCCTTTCAATATGACTGCAACATTCGAATCGTTTGACAGTTGCGATCC
-ATCCGACCAAGCACGCGTCTGTGAAGCGGTATTTGCTTTTTAAAAATTTT
-TTACGGGATTTTGAACAAATAACTTTCAGCCATGGAACGCAGGCTCTCCT
-GACTCTAAATTCGGTGTTTGGCGCCCGGATCCAAAGCCTGCTGATAGCGA
-CGACGAAATTGATATCGAGCCGAGAGAAGGCTGGCACTTGCCAGAAGACA
-AATGGGCCGAGGTTAAGGTTGCTTTGTGGATTCTCGTTGACAATTTGATT
-TTGCAGGTCATCAAGATGCAGCTTGGCCTGTATGTCGGCGAACGCCTACT
-GATTTGCAAAGAACTCTCGCAGTTCGACTTTATTATCCCACTGCAGAAGC
-CATTTTCCCGAGGAACGGACAAGACTTTGATCTACCCAGCCGTCGGAGAA
-TACTTTCATTTCAGTGCTATTTGGTCGATGCAGCACAACGGTTTTCTGAT
-CTATGAGCTTCAGCCAGTTCCACTTCTCAGACAGCATGTAACCTCTGTCA
-ACGGAAATGTAAGTTATAATATTGATTTTTTTGTCCAGAACATAATTTTT
-ATTTCAGCTCCTTACCCGCGTCGTTCCTGCCAGTATCAGAGGTCTCTTCG
-TTGACAAGGAGGGCACTCTTGGATTGATTGATGACCCACACCATCTTCTT
-TCATTCTTCGAGTTTCATCCAGCTGGTTATGAATTCTTGAAGGCTATGGT
-AATCATGAGTGGGTCTTATTTTGAAACAAACGCTTTCAATTTTCAGGCCG
-AAGTTCGTGCTGTTCGAACTTCAGAAAACAAATCTGTCCGTTACCGCATT
-GTTCGTACATCGGGAATGTCCATTTTTGAAAACTGGCTTCGTGATACTCA
-GGTCTCTAAAGTTAAATTAAACTCGTCCTTTTCACCCCTGAATTTTTCAG
-TTCGTTGTTGGTCCAGTCAAAGGAATTCGAATCAATGAAGACACTGTCAT
-TTGTGCCAAACATCCGAATGTCTACTTCAAAATCCCCAATAACTTGAAGG
-AAGGAATCCCCATTGGCGGAGGAGTTCAATTCGTTGGAAAGCGACAAGCT
-GGAGTCGACAGTGAAATTATGATCACCGAATGTTCTCCATGTCCAGCGTT
-CACTTGTAAAAATTACTCGGTCTCTGGTGATACGGTTAGTCTTCAATTAT
-TTAATAGTTTTTATTCTATGAGGAAAATATTCAGCGCTTGTTCCAAGTGT
-ACTTGAAGCCAAATTGCGATCATGAGCAGTTGGCGGAGAGTGATTCGATG
-GGATTTGTGGATTTCAGAGAGTTGGAGACTCCATGTAGAGGAAAGTGAGT
-GTGTCAGGATTTGTAAAAATAATTGTAACTGAATTTTAAGGTTCCTGGCA
-TGGGTCCGTGAATCCATTACTGTCAATGATTGTCGCCGTGCTGCTACCAT
-CATGGAAGTATGCTCGACAGCCATCTGTCCTCCGTTGATTGCAATGAGCG
-CGAATTCGAGCAGAGCAACATCGGCCAGAACTACGCCAGCTGGAAGTTCC
-ATTGGATCCAGATCATCAATTCAATCAAGAGCATCTGCAGCTACTTCAGT
-GAGCTCAAACGTAAGTTTATTTTTAAGGTTGGAAGATGATAAAAACAAGT
-TTTTCAGCGATTCGTTGGCCCTTCAAGCCGCAGAACTCCATCTGGTACTC
-CACAAAGCTCAACATCTTCCAGGGTCTAATTAAATATATACGCATCCCGT
-TTTCCCCCGTATTTGTGTTTCAAATGTTCTGCTCATTTTTAATCTACCCG
-TTATCCAACCAAACATTTATTTATTTAAACTTCAAGTTCCACCACCATCC
-CATTCCGCACAACTTGTCTCTCGTAATTTTCTCGTGCTCTAATGAAGTTG
-TGGTAGGTTATTCTAGTGAATACACCCATGTTAAGCAGCGAATACATCCA
-GAAAAGTCCCAACAAGCCGGCAGCGAGATACTCCCCCCAAAATGATGGTT
-GATCGGTACATCCAAGATAGGGTAGCATCGCGATAGACGTGAGCAAGTTC
-GTTATGCACTTGAAAAACTGAAATTTCAGAAAAGATTAGGTGTATCAGAA
-GGTTAAAAACAAACAAATGACATATAGATGAACGAAGCCAGTGATGGAAT
-CGGATTCCGAATACGAGAAGCCATTCCCGGAGATACTGTGATAAGAATCT
-GTGTGATCGAGAACACAATGAGCACACCCACCGGGAACATGAATTCCATG
-GAAACACGGAGGCAAAGGTCACAGTACTGCAAAAAATGCGAAATTTTGGC
-GATTTTTGCTCTAAAAAATGCACTGGCCGGGTCTCACCACGACAAATTTT
-TGTTGTCAGTTGAATGCCAATAGAGTGTGCGCCTTTAAGGAGTACTGTAG
-TTTCAAACTTTTGTTGCAATCGATTTTACAGTTTTCCCGAGAAACAAAAG
-TTTGAAACTACAGTACTCCTTAAAGGCGCACACACTCTTTCCGCATTCAA
-CTTAACAAAAGGTTGTCGTGTCGAGACCCGGCCACTGCATTTTTGTAGCA
-AAAAAAATTTGAAATTTTCAAGTCTGGATAATAATATATAATATTTTTAC
-CTCAACTATGGGAATTTGCATTTCCAAACTATCCAAACAATCGCTGAACC
-CGAAAGCATCACAAATAATCGATCGATATTGTCGCGGAATGTCACGTATC
-GATTGGTAGATCATGAATATGTTGCCAAGTAACGCGAAAATCTTGAAAAA
-TGGAGGATTTTGCTTTTAAAAAATCCAAAAAAAAAAACTTAAATTCGACA
-ATTTCCTGTTTGAATTCCCTCCAAAATGAGAACTGCAGGACCCATCAGCG
-ATTTGAGTGGGCGGAGTCCGAGGGCGCTGATTGGTCGTGCAGTTCTAATT
-TTGGAGGGAATTCAGCCAAATTTGAAAAATCTCGTTTTTTTTGCAATTCT
-TTTGTGGTATTTTCGACATGGGGTTCTTTCTGGCTTTCCTCATCAAGGGT
-GTCAATGTCCCGTAAAAATTTCGAAAACGGGACAACGGGACGTCCCGTTT
-TTTTGAAAACACTCAAAAAACGGGACAAACTGGGCGGTTAAAAAAAAGAG
-TGCATAGTTGGCGTAAATTTTAGTGTATTCGAGGCAAATTATAAAAAAAA
-CTGCATGTAAGTCATTAATCTGCATGAATTTAAGTCTTGAAACAAAACTC
-AAAAACAGAACTTTAAAATGTGCAACAAAATCATGAGAGAAATTGTCCCG
-TTCCCGTGATAATTTTGAAAACGGGACAGCGGGACGTCCCGTTCCCGTGA
-AAACACTCAAAAAACGGGACAACGGGACAAACGGGACACGGGACTTGACA
-CCCTTGTTCCTCATTAAAATTTTCGCGCTCCATTGATAATCGCCCTGGGA
-AAGTCGTGTACTCCACACGGACAAATCACATTTAGTTTTACAACTAAAAT
-CGAGAAAATTGGGAGAGTTTTTGCCGCGAACCTGGCCTAGTTCGCGGCAA
-AAACTCTTCCATTTCAAAATATGGGCGAAGCCAGAAATCCGTGATATTTT
-CAGCATATTTTTTTGATTCGAAGCAAATCTCAGTTTCTCACCACAACGAA
-CAACTTCACATTCGGATGCCGCCCGTCTTCGAAACGTGGAATTCCAACTG
-AATTCACCGATTCGACACTTGAACCGGGTGACATCATCATATTTTCAACC
-AGCTCATACTCGAACTCCGGAATATCCGGCACCACATCAATCGGTGCTGG
-TTCTGGCGGTGGCGGCTCAACTGACACTTTTCCTTGATCTAAAATTTGTT
-TTTTTCTGAAAATTTGTCACTGTACCAAATCAAAAAAAAAACCTTACCAG
-AACTCATAATTTTTGGATTTTAATTTGTAAATTGCAAAACAGAAAATGAA
-TTGGAATTTTTTCACTTTTTATTTATGGGAGGGGGAAATTCTTTGTTGTT
-GCAATAAAGTAAAACAATCACAGTAAATGCCAGTACAATAGTTTTTCACG
-TGTAATATATTAACCAATTACTATATTCAATAACTCTGTCGTCTAAATAC
-ATAGGGTAGGGGGGAAGGTGAGGGAAAATGGAAATAATAAAGTGAAATGT
-TTTGTGTACTTGCGATAAAACAATCAATAAATGGGAACAAGCCGATGATA
-AACTGATAAACCGAACGTGAATATCGAGAGAGGGAGGAAGAAAGCGTATA
-CCCGTTAATGAAATCAAGTTAATGGAATTATTTGGATTGAAACAAAACAA
-CGAAAATATCAATGTTTGAGCATAAGGAATGAGGGAATGGCACTGGTGGT
-GGTGGATAAATGAATCGGGGGGAACGGAATCTATGGAAGTTTCGAATACA
-TCGCATCGAGTTGCTTCGAGTAGTGAGCCTTCAGCTTCGGACGCTTGCTC
-TTCAACGTTGGCGTGAGAAGATCATTCTCGACGCTGAATTGCTCGGCGGA
-GAGACTGATATCGCGCACTTGCTCGAACGAGAAGAGCCCGGCTTTCTTGC
-CAACAGCGACCATGTCATCGAGGATCGCCTTTTTGACGGCGTCGTTGTTG
-CACAGCTCTTCGAATGTTCCCTTGATTCCTTGGTCGGCCATCGCTGGGAC
-GAGAACCTAGAAAAATTGAAAATTACATATATATATATATATATACACGC
-TCTCCTCAAAGCCGAATAATTATTAGAGCGCGCTTACTGCGCTTCGCGTT
-TCTGCATCCGCGGCATTTTGACTTTACACTGAAAAAAGCAGATATTTCAG
-ATTTATCGAATTTTTAGCTTTTAAAATTTTTTTCTGCATTTTTCGAACAA
-ACCTTTTGTTAAACAGTGAAAATTGAATTTAAAATGACTAAAATGAACTT
-TTTTCGTTCACTGGTTGTGAAATGGTTTGAATTTGAAGAAATCAAAGGGA
-TTTTTCTGAATTTTTTAATAATTTTCTATTAAAAATCGGTTTTAAACCAT
-TTTTTGACCCTAATGTTAAGTCACAAATGTATTGAAACCGGTTTTTAATA
-GAAAATATTTAGAAAATAAGAAAAATCCCGTTGATTTCTTCAAATTCAAA
-CCATTTCACAACCAGTGGACGAAAAAAGTTCATTTTAGTCATTTTAAATT
-CGATTTTCACAGTTTAACAAAACGTTTGTTCGAAAAATGCAGAAAAAAAA
-TTTTAAAAGCTAAAAAATCGATAAATCTGAAATATCTGCTTTTTTCAGTG
-GAAAGTCAAAATACCGAGGATGCAGAAATGCGAAGCGCAGCAAGCGCGCT
-CTAATAATTATTCGGCTTTGAGGAGAGCGTGATATATATATATTTTTTTT
-AATTTTGAAAATATTTAAAACCAAAAAACCAACCTCAGCATCAGGTACAA
-CAATAGCAATGAGACACGTCTTCAGTGATTCTCCATGAACAAATGATTGA
-GCGACATATTTCGAGCGGACATAGATGTTCTCAATCTTCTCCGGTGCCAC
-GTATTCTCCCTGCGAGAGCTTGAAAATGTGCTTCTTGCGATCCACAATTT
-TCAGCGTTCCCTCAGGAGTCCATCGTCCAATGTCTCCAGTGTGCAACCAT
-CCATCCTCATCGATCGTCTCCTTCGTTTGTTGCTCATTCTTATAGTATCC
-CTTGAAGATGATGTGTCCCTTGACACACACCTCGCCGGCTTGATCCTTCG
-CGTAATAGTTCAACTCGGGCACGTCGACCAACTTGATCTGACACGATGGG
-ATCACCATTCCGACGTGTCCGGCTAGCGAATCTCCTTCCATCGAGACAGT
-GCAAGCGGCGACACATTCCGTTTGACCGTAACCCTCGACGACGACACATC
-CCATAGCGGCACGAACGAAGGTGAGCACATTCGTCGAAAGTGGAGCCGAT
-CCGGTGATCATCAGACGCACACGCCCTCCGAATCCTTCGCGAATCTTTTT
-GAATACCAAATTGTCGAAGAATCCGTCATTTCTGATATTGAAGCTGGAAA
-AAAAAAGAAGATATTAAATACTATCAAATCATTCAGACCACTCACTTTGC
-CATATCTCTGGCCTTGTATGAGATAGCGAAATCAAACAACATCTTCTTCA
-AAGTCGACTTGTTCACTTCAGACATCACTTTATCGTAAAGCCGATTCAAG
-ACACGTGGCACCACTGGCACCACAGTCGGCTTCAACTCTTTGATATCCTC
-GGCCAACACACGTATGTCACCACGATAGAATCCGACTTTCGCGCCGACAC
-AGAAGCACACACTCTCGATGACTCTCTCGAGCATGTGAGCCAACGGAAGG
-AAGCTGATCATCGAATCGGTCGCCGCGATGCCACTGTGCTTGAAGAAGTC
-CATACAGACACCGTCGGCGATCACGTTCGCGTGAGTGAGCATCACACCTT
-TCGGTGTTCCAGTCGTTCCTGACGTGTAGCATATGGTCGCAAGATCCTCT
-GGTGTTGGTGGAATGTGTGCTGGACGAGTCTTGGCGTTCTTTCCAATCTT
-CTCGAGATCCTCGAACGTGAGCACCTCGACTCCGAGCGATGACGCAGTCG
-TTTTGAGCTCATCGGTGACTGGTTCCATCACAACAAGTGTGCTCAAACTT
-GGGCATTGCTCCTTGAACTTTAAGAGACCTGAAATCAAATTTCCTTTTGT
-TTTTAATAATATTCCTTATCAAACTCACCAGTGGCCTTTGAAATATCATC
-ACAGACAACAATCTTGATCTCTGCCTGATTCAAAATGAATATCGACGCTT
-CTGATCCAAGGGTCTCGTAGATCGGCACAATCACATTCGAATAGTTGTAG
-GTGGCGAATTCGGTGATGATCCATTCGGCGCGATTCTTCGAGTAGATCCC
-AATGTTCTCCGCGTTGCCAGTCGGAACGCCGAGCTCACGGAACGCGACGG
-ACACGTTGTCGGCTCGCTCGAGAATCGTATTGTACGACTCCCACACGTAC
-GGGATTGAACCATCCGACTGTTTGACTCGACGTCCGAGCATCGGCCCGTT
-GTTCGAGAGACGGGCTCCACGGCGAACACCCTGGTAGAGGGTGCGCGCGT
-CTTCGAACAGGAAAGCCTGGAGTTCGTCGTCCTTCAGGTAGGCGCTGATG
-CGGGAACCATCCTGGAAATTAACATTTTAGTCGGGGGGTTTTTTTGGAAT
-TTTTTTTTCGCTCGTTTTCTATTGTAAACCGAGCCACGACGCGACACGCC
-GTAAATCGACAAGCCCAAATGGCCTAATTCGGCAAAATCTTACATTTAAA
-AATATGAGGGAAGACAGAACTCCGTGATTGGAGAAAATTAAAGGAGGACT
-AACGGTTCGGACGATTTTGAACGTATAGACCCAAAATGAGCTCAAATGAA
-TGAATTTCGTAATGAAACTGCTCAAAAATTTTTATGGCGGTTCAAAATGT
-TGAAAAAATTACACTGATTTTGGCTAAAATCACGAATTTTCCCATTTTTC
-CGTGTCACATCTGTTCGAAGTTGGATTTTTTGGAATTATCGTTTTTTATT
-ACATATATTGGTAGTTTATCTCATTTAATTTCGTCGATTAAAGTACATTT
-AAAGCCGATAGGTAACCAATTTCGATAATTTTTGGTCACCTATCGGCTTT
-AAATGTACTTTAATCGACGAAATTAAATGAGATTAATTACCAATATATGT
-AATAAAGGACGATAATTTCAAAAAATCCAATTTCGAACAGATGTGACACG
-GAAAAATGAGAAAAATTCGTGATTTTCGCCAAAAACAGTGTAATTTTTTC
-AAAATTTTGAACCGCCATAAAAAATTTTTGAAAATTTTTTGAGCAGCTTC
-ATTACGAAATTCGTTCATTTGAGCTCATTTTTGGTCTATACGTTCAAAAT
-CGTCCGAACCGTTAGTCCTCCTTTAAGTTTAAAAAAAAAACGGCATATTT
-TGCCCAGTTTCTCTCCAAAACTCACCGGCAAAATGCGACTCTGATTCATC
-GGATCCACCAGTGGCTTGACATTTCCCGAATAGGTGACCCCACTGAACGA
-GTAGGATCCCGACGTCGATGACGAGCTCTTCGACAAGTAGTATCCGAGGC
-CCATGGTGACTGCGGCGGCGGCTCCGATTTGAACGTACGGTGGAAGGGAA
-GAGTTCGAGTTTGGTGCCGAAATGAAATCGACAATACTTCTGTAACAATT
-GAAATTATATATAGAGAGGACGGGTGATGATGATGAGTCATCCAGGTTGT
-TGTTGTCGCGCGCGCGCGCCCGCACTGTTCCCCACAAAACAAACAACTTA
-TTTGAAATTATGAAATCGAAGTTTCTTTGTTATTTTATTTTATTTCACAA
-GATGGTTTTCATGTTTTATATACCATTCGCAAAAACAATACCTAGTTTTT
-GCTCGTTTGGACTCAGAAATTTTGAGACTTTTCTGAAAAGTTTAATGGCA
-GATCAAAATTTCGGAAAAAGGTGAATTTTAGCGAAAATTCGCCGTGGTTT
-TTCGAAATTTTGATCTGCCATTAAAGGTGGTGTAGTCGAATTTTTTTATT
-GCTTTATTAGACTCAAAATTGTCTGAAAACACCGAATTTCATAATAAAAC
-TTAAATGGCCTAAAATTAGCTAAAATTTGAAATTTGACCGACTTGTCAAG
-CGGCTGGAAACGTTTTTTTTTTGAAATAACCGTCAAATTTTGAATATACA
-GTGCAATTATCTTGCGTTTTCAACTTTATTTAGGTACTTTAAAGTCGATG
-AACGGCGAGATTTGTTTTTAATTTTTCACGAAATCTCGCCGTCCATCGAC
-TGTAAAATACCTAAATGAAGTTGAAAACGCAAGATAATTGCACAGTATAC
-TCAAAATTCGACGGTGTTTTCAAAAAAAAAAAAACTGTTTCCAGCTGCGA
-CGTCGGTCAAATTTCAAATTTTAACTAATTTTAGGCCATTTTTTGAGCCG
-TCATAACTTTTTTTGAGGAGTTTTCAAGAAGTTTTATTATGAAATTCGGT
-GTTTTCAGACAATTTTGAGTCTAATAAAGCAATAAAAAAATTCGACTACA
-CCACCTGTAATGGCAGATCAAAATTTCGAAAAACCACGGCGAATTTTCGC
-TAAAATTCACTTTTTTTCCGAAATTTTGATCTGCCATTAAACTTTTCGGA
-AAAGTCTCAAACATTTTGAGTATAAACGAGCAAAAACTAGTCATTGTTTT
-TGCCAATGGTATATAAAACATGAAAACCATCCTGTGAAAAAAAAACAACA
-AAAACACTTGAAATTCGTAATTTCAAAGTTCTCCAAAAAAAACATACACA
-CACCTCGATTGAGACTGTACCCACGCAGCCGTGTCTGTGATAACCATTCT
-GTGTGTTTCTGTGTTTAAGTGGCCTATTTATAGTCTTCTGCCAAAAGACG
-AAACCGCTTCTAAAATGAGATTAAATTGAGGTGGAAACGACGACGACGAA
-GAGGTGGAAGAAGTGAGGGTGAAAATCGAAAAAACAAAGAAGAGATCAAA
-GTTATTCCATCTTTAGAACTTTCTCCACTGCCAGCAATTGATAATAATAA
-TAAGATTTTTATGTTGATAACTCTTTCGGTATCAATACAAAAAGGGGTGA
-AAACCCGCCTCGACAAGCCTTTCGATCAGGCCATATATTTCTTTATCACA
-CTCTCCGCACATTTCGGAACAACTTTGACCTCCCCGGCAAGGGGGCAAAA
-GTTTCGAGAAGTTGTGTTGCGCGCGAAGGAGATGGAGAAGATGGAGAAGA
-TAGGCAAACACGTACACCTCCTCAAACAGTAGTAGTAGTGATAATTGATT
-TGATTAGTGATTCGGGTGGGCAAAACGAGAGAGATAGAAAGAGAAAAAGC
-GAAGAGGACAACGAACACGTGTAATCAACCGTGTGCCAAAGTTCTCGCCC
-TTTGGACTAATTGCAGTTTTTTTGGAGGAAATTCAATTAACACTGAAAAC
-TAGTTCGTTTAAGTGTTTACGCTGAATGGGCCAGGTTTTGAGGGAAAACG
-ATTTTCGAAGAACTTTAAATGTGGGGTACCGAAATCTGAAAAATATTTTA
-AATTGACTCCAAATTTTCCCCTGACTCCGAATATCGATGCGAAAAAATTC
-AAAAAAAATTTTCCTGATTTTATATTTAAGCTTGAAATCGCCGAATTTCA
-TTTAGAAATTCGCATTGGAGCGCGCTTGCATCGTTCGATTTTTTTTTCGT
-TTATTTTATTTATTTTCGCCGAATTCAATGTTTTTAAAGCCAGTTTCATT
-CATTTTTGTCGAGTTCTCATCGAAAATTTTTTTGACAAAAATTAATGAAA
-CTGATTAAAAAATTAAATTCGGCGAAAATAAGTAAAATAAACGAAGAAAA
-TCAAACGATGCAAGCGCGCTCCAATGCGAATTTCTTTGGGCGCGAAGTTG
-AAAAAATGGCCCGGGGCACAAATGAAATTCGGCGATTTCAAGCTTATATA
-TAAAATCAGGGAAATTTTTTTGAATTCTTTCGCATCGATATTCGGAACCA
-GGGAAAAATTTGGAGTCAATTAAAAATATTTTTCAGGTTTCGGTACCCCG
-CCTTTAACGGATTTTTTGGCTTAAAATTGGAAACTCTTGGTATAAAACTT
-GTAGAAACACCGAGTAAACTGTACACGTTTTAGACGATAATTCAAAAGTA
-TCGAGGGAAGTATCCAGAAGTTGAAAAATTGCGAAAAACAGGTAAAATAA
-GGAATTCAACGCGTGAATTTTGCATTTTTAGACTGAAAATAGTGTGGTAT
-TTCTTCAAATATAGACGAAAATATCGACTCGCACTGGTTTTCGATCGATA
-TTTATAGGTCGAGTTCATTGCTATGCACAACATTCCGGGAAAACACGAGA
-TTTGAGGAATTTCTGAGCAACTTCTGAGTAAAGCCAACAAAACATTTTGT
-ACAATTTTCTTGTTGGTCTTGCTCAGAAAATTTTCAATCAAAAACCAATT
-GGAAATCGATATTTTCTGCTAGTTTTGAAAAAACACATGATTTTTAATCA
-AAAATTGTTAAATTCATGCAATTTTCCAAAGTTTTACACGATTTTTTCTC
-TGGAATTCACATGCTTTTTAAAGCAAACGGCCGTTTCTCGTTGTTGGCTT
-CCACGCGATTCCATAGAAACACTGGGGCACCAGAGAAACCGGGGTCGAAG
-CAAATGACCAACAAACAACAAACGGATGTGTGCTTTTTCTTCGTTTTCGT
-CTTCACGAGGAACCACCACGCAAAATGGAACTACAACTACGATTGATAAC
-GAAAAAAAAAAAGAAGAGATGATGATAGTTTTTGCAGCAATAAAAAGAGT
-GATAACAAGATACACTCTATCTCACCCACACCTTTCCGTTCAAAGATAAG
-GAAATAAGATTCGGGGGGTTCAAAGTGTTGGAGCCAAAAACGGAAAACGG
-AGGGAGCAATTGTTCGTTGAACGAACAATAAAAAACCATCATCTGCGTCT
-CAAAAATACACGTGTAAGTGAGCGAGTGAGTGAGTGAGTGCCGGGGAATA
-AAACGAGTTATATGACCAACACAACGAGCGACGTTGCTGCTGCGTTTCCT
-CACTCTCTCCTAGTGAGCGTGTGTGCGCACCACACTCACATGAGCGCATG
-CAAGGGTGTATGCGCAAGTGGTACATCGACTCGGTATGAGAAGGACAGAG
-CAGTAGTAAGGAGCACACGTTATGTTGCTCCACTACTCACTGTTGCGTAC
-CGTGTAGCCTCTGCGGGCCACCGCGGTGCAAAGTACAGTGGAAGGAGGAG
-AGTTGAAAAATTGGTGTTTATTTTACTTTTAAACTCGTTTTCCTCCGGAT
-TTTGAAGAGAATTGGTTGACTTTTTGAATTTTAGGCGAAAAGCGCGGGAA
-AAATCGAAAAAAGATGTGAAAACGAGTGAATTTTAGGGCAAAAGTGAACC
-GACAATTGTTATGAGCAATCGGGCTTCTCGGTCGGAAAACAGATCACAGA
-AAAATCGGAAAATCCAGCAAAATACTCGAAAATTATGCAATTTTCTAGAA
-TTCCAAGCGAAATTTTCTAGAATTTGAGGCAAAATGATACGGAAACCAAC
-GAGAAATCCAGAAAAAAAAACTATTTTCATCGAATTCTAGGTGAAAAGCT
-CTGAATTATTCGATTCTCCGTCGGGGTAGACTCAAAAATTATGCAATTTT
-ATAGAATTCTAGGCCAAACATCGCAGGATCGCCTACACAATTTCCGGAGA
-ACGATGAAAATCGGCAAATCTGAAGCAAATAGGAGTGAAGGAAGAGGCTT
-CGGATCAGTTTTTCTGAAGAAAATACAAAACTTTCGCTTTCGCAAAACTT
-TCGGGAAAATTCTCAGAAAAGGCGTCAAAAGCTCAAAAAATCGACGTTGC
-ACGATTTTCGACGGAAAAATAGAGTAAAATATCCGAATTTCTGCTTTAAA
-ACTCGAAAAATTGCCCAAAAATCCGTTTGTTTTCGCCAAATTTCTCCTAT
-TTGGGGGTCACAAGGCGAGCGGGAGCCGCCGACGACGAGATGAAGAGCTC
-CACAGAGCCCCTGAGCCAACAACACAACACTCACCCAAAAATATTGGAAT
-TCTCCGGAAGGAAATCGTCGTACGACGACGGCGGCGGCGACGGTGCCATT
-TTTCATGGGGAAAATTAGAACCTTGTTCGAATTTGTGATTTATTATCGAT
-TTTCTATGTGCCACGTGTGCCCTATTGCGTGACCCACCTGATTAGTTGCG
-CGAGTATTTTGTCAGTGCGGTCGACGATCACCCGAAGAATGGAGAAATTG
-TCTGAAAAATGCGAAAATTGGCTATAAAACGACGGAAAAAGAAATAAAAA
-CAAGTGAAATGAGGCCGAGAGGCAGGTGAATTGTTTATGCAATTTTAGAA
-ATGTGATATTTTGGCGGTGTAGATCGAAAAAAATGCGAAAAACACGAAAA
-CAGGTCGAGAAATTCGCAAATTTTCGACGACTAAAATTCAAATGCACAAC
-GTTCGCGCGCGCGCCGAAGTACGGTAGGTCCCGCATTTTTGCGCGCGCGA
-AATTCAAATTTTAATTTTAATATTTTTTCTTTCTTCTTTTCTTTGATTTT
-TTAAGAATATTGTGCAAAAAATTCGTTCATTTTTCGAATAAAATTGTTAA
-AAAAGACGAAAAAAAAAAGAAAAAATAAGACAATTTCTCGGTGGCATACA
-AATAAATACAAGTTATTGTTCGGGAAAAAAATCACAATTTTACATTAAAT
-CCAGGTTTGTAATAAAATCAATTATTATTTTATTTTCTTCCAAATCCGGC
-ACATGGATTTGGGCATCCGCTGGTCATGCAGCAGCCACCTCCACTCCCTC
-CGAGACACGCCAACGACTCGCCGGTTGAGATGGCGAGAAGCACGAAGCAA
-ACGACCATGACCTGGAAGAAAATGTGTGAATGTTAAGGTCTCTTAATATT
-CCAATAAAATTATTTGGTTTTTTTTTACCGGTGTTCTTGCCAGAAAAGTG
-CAAAAATTAATTAAAACTCTAATCGTGGCGAGACCCATCTTAGAAACGAG
-AGTATGCGCCTTTAAAATTGGGCTACCGTAATAATCGAATTTTTGCAATC
-TTGCAATTGTTGATTTCCGAAGAGCGTTAACAAGAAAACATTTGATAGAA
-ATGACACATGAATTAGGTAAAATTTGGTTTTTTTTTAGATTCTTATAATT
-CAGATTTCTATTTTGGACACGGAGTTCTGGCCTTCCTCATTGAATTTTTC
-GCGCTCCATTGACAATCGCCTGCCGGACAACGAGTGGGAAAGTTGTGTAC
-TCCACACGGACAAATACATTTAGTTTAACAACAAAAATCGAGACGCGACG
-CGACACGCAACGCGCCGTAAATCTACCACAGATATGGCCGAGCCATAATG
-GCCTAGTTCGGCAAACTCTTCCATTTCAATTTATCGATGTCAGAGTGTCC
-CATTTCAGCTTGATCTACCTAGATCTACAAAAAATGCGGGAATAATACGT
-AGAGTTCTCAACTGATTTCGCATGGTTAAGTACGTGCTGACGTCACATTT
-TTTGGGCTAAAAATTCCCGATTTTTTTGTAGATCAAAAAACTGTGATGGG
-ACAACCTGACACCACGTGATTTATGAGGAAAGCCAGAAATCCGTGATTTG
-GAGAGCACAACAAAAAAAGAAATTCGGCCACTGATTCGCGGCCACGAGCC
-ACTGTGCCTTCTCAAGATATTAGTTAATAATTGACGCTGTGAGACCCACA
-GTTAAAGGCGCATGCTCAGCATGACTGGCCAATCTAATAGCATCTACAAT
-GATAATTGAAAAAAAAACTCACAGTTTGGCAAAGTTTAGCGACGAGTGAC
-ATAATTCTCCGAAAGCTTCAGCTGAACAATTTCAGGGATTACTTGCTGTT
-TCCCATCGCTTCACCGTCTTATATAGTGCCATCGCCGATTGGCAGAATGG
-GATACACCTGCCCCCAACTGCGCAGTTGAATACGATCCGTGTCTCTCTGC
-GTCTAGCGGTTCTCCACGATGTTTCTTTGGCGGCGGTGAAGCCGTGTGTG
-TGTGTGTGGCTCCTCCATTCTGATTGAATGTGTAACACTGCGGGCAACCG
-ATTGGTTTTGGCGGCGGCGGGAAAACGAATCCGGATATACTACATACACA
-AACACACACTCACACACACCGAAGGAACTTTTCAGAGAAACCTGAACTGG
-CTTTTTATGATTTAAGTGCTTCTGCTGCCAGCATGATGTGGTGGTTGTGT
-GTTGTCAATAGGATTTATGCTAATTCCTGACACATTCAAGAGATGAAACA
-TCAAACCGGGTAGGAACTTAGTCCACCCAACACTGTGAGAGATTAATAGA
-ACCTTTAAAAGTGGCACTTCTAGGCAGAATTCAATAGAATGGTGGGCGCC
-TTGGAGCCTAGTCGACCTGCGATGTGAGTGGCAAGGTTGGCAGAGCTAGG
-ATAAGCTTCTGGAACTGTAGGACTGTAACAAGCAAGGATCCCGCTCTGGT
-ACTGTAGTGAACTTTGAGATCAAATTAGGTTTTTCAATATTTAACTAGCA
-CTGTTTCCGGCCCTGATCTTAGAAAGAAAAGAAAAAAAGGATGTGAACCA
-GGCGTGGGCGGCAAACGATTTTTTTCCGGCAAATCGGCAAATCACTAAGT
-TGCCGGAATTTAAAATTTCCGGGAAATCGGCAAACTGACACTTTGCCAAT
-TTGCCGAACGGCAATTGCCGCCCACACCTGATGTATACATATATATGCTT
-TCACTCATGTGGTGCCAGAATGTCTCACTGCGGTTTGATCTACGAAAAAT
-GCGGGAATATTTTTCCAGAAAAATTGCGGCGTCAGCACGCTCCTAACCAT
-GCAAAATCAGATGAGATGTATGCGTCTCTTCTCCCGCATTTTTCGAAGAT
-CACAGCAAAATAGAACTTTCTAACTCCACGTGTCTACTGAGAAAAGAGCC
-GAAAGCTTATTTTCCACGTATCAGGGATCGGAATCCCACCTAGCTAGTTC
-ATCCTATTGCATCATTGAAGCATCTTCCGGATTCTCCACTTTGTTTGCTT
-TTCGAAATCGTTTCAAACTGAAAGCCGCGCTTTCAAGGCCGTCTTCTTCC
-GATTTTCCGATCTACCTTTTGTTGATCATCACGTGCCTGGCGATCACAAC
-ACTGTTCAACCGGAATATCTGAAGATGTTCCACCAAATGGATCGTTTTTC
-TCAGGACGGAAGAATACTAATTTGCAAAAAGTCTGTTCTGTTCTAAAAGT
-TCTGAATCTTCTGAAAAAATTTCAGACTTAGATCCTGTCATTACATGGGC
-AAGCAGTGGAGTCGGAGATTTTTTATCAAAATATATGGATAGGTAATCAG
-GGAGAGACTGGCTCCTTTGTTACAATATATTAGGTTTTGTTCTTTAAAAT
-GTTCAAATGAAGCTGAAGAGTTCCGGCTAAAAGTATATGATTTTTCAATG
-ATTTTTCAAAAATTTCAAGGTATAACTCTGAAACTAAAATTTAAAAAAGA
-AACTAAATTGGATTTTAATGTTAGTTAGTTTATTAACAGAAAGAGCAGTA
-TTTTTTGATAATTGTAACCTGAAAACTCTATTTTTCTAGTTTCGTGAAGT
-AAAAATGTTTTATTATGTGACATTTATTGAAATTTAATTATAATACACTG
-TTAGAAATATTTTATTATCTAAAAAAGTAAATTGGATTATAATGTTAATT
-ATTTTACTATCAAAAAGATCAGTATTTTGTGATAGTTTTAACCTAAAAAC
-ATTTCTGAAGATCGTTTTTTGTGAGAAAAAATTATTTTAATATGTGTCAT
-TTAAAGCAACTTTTAAAAAATTGCGGTTTAGAAATGTTCAGCTATCAAAA
-AAAAGTACATTGGATTTTGGTGCCAGTCAATTTATCAACAGAAAAAGTGG
-TCCTAAAATAATTTCCAAACTTATTAATGGTGGTAGCATTAAAAAACACT
-TTTTTTTGGATTTTTTGAAATGAATAGTGTATTTACAGAGACAATGGTAG
-ATCAACCTAAAAGAACAAAAAATTTGCAATTTTTCCAGGTAGGACACTTT
-TTTGCTACTCGAATATAACTAACCTAAAATAATTTCCAAAAGTTTCAATG
-GTGGTAGCACAAAAAAAAACAATTTTTTTGATTTTTGAAATGAATAGTGT
-AGTTACAAAGACGGTGGTACATTGACCTAAAAAAACGAAAAATTTACTAC
-TTTTTCAGGTAGGACACTTTTTTGCTACTCGAATATAACTAACCTAAAAT
-AATTTCCAAACGTTTTAATGGTGGTAGAATGTAAAATAACTTGTTTTTTT
-TTGGTTTTTTGAAATGAATAGTGTAGTTACAGAGACAATGGTACATTGGC
-CTGAAAGAACAAAAAATTTGCTATTTTTCCATTTTGACCAAAACTATTGG
-TTTTGTCCCCAAAAAATTAGTAAAATGACCCACAATCCAGTTATTTTGCT
-GTTTAAGCAGACACACTACACGGAATTATTTTCAGAAACCAGATGTATGT
-TAAGATTTTAGTAGTTTCGGTGCTGCAAAAACCATCAAAAAATACCAAAT
-TTTTCGGCGTTTGTGAAGCACGGCAATTTTTGAGATTTGCCGCACACCCC
-AGGTACAGAGACAATTTTATATCGACGTGAACGAACAAAAAATTTGCTAT
-TTTCTCAGGTAGGCCACTTTTTTGCTGCTCTAATTTCACACACCTAAAAT
-AATTTTCAAATGTTCATCCTACCCTTATATGTAGTAAGAAGATTTCAAAT
-TCAAATTTTCATGCATCAACTCGTCCCCACCGTTTTTGTTTCCCTGGCTG
-ACTCATCTGACCTTGTCACCCCACGTGTGTTTGTCTTTGTGCCCCCTCTC
-GTGCTCACCTTGTTCCAAATTCTGTGAAAACTCATCTCGAAGGCCATTTT
-CTTCGTTTATGAGTTTTGAAAAAAAAACGTTCAGACAACTGCAAATGACC
-TCCCCGGCGTCGAGAATCGGTGATAACCTTGTACTTCTTAGATGAGACCA
-GATACAAAGTGCACCAAAAAATTCAAATTCGCTTGAGAAGCGCTGGCGAG
-AGATTCGAAGCGAAAACGAGTTGATTGACAATCGGAACATATACACACAC
-CAGAAGACAAAGTGGGGGAAGAAAGGAAACAAAAAAGATAGAGAGGAAGG
-AGATTTTGAAAAACGACAATCTCTCTGTGTGTGTGGGTGACAGGTGAAAA
-AGTGAGAGTGAGAAAAACGTGGTGGGTACTGTATTGATGAACGATCAGAC
-CAAGTTGCATTCAAATTTCTTTGATTGGATTGTTTCCTGATCGGTTTGGT
-AGAAGGTGAAGTTGGATTTTGTTCACTGAAGTTATTGGATTTCGAGACAT
-GAGCAAGCTAGGTTCAGGATGACTGTAGTGGCCGGCTAACTTTCCGTACA
-CCTTTGGCCGACTAGTGAGTGCAACCAGGGCTAGTAAGGAGGTACATCCT
-GGTTACCGTAAGCTTATTAAAATTCTGAAAACACCCTACAAAAACTGATA
-TTTGTAAAGTTCTCCAAAACAGGTGCTAAAACTTCTGAGGCAAGAGTAGG
-CACTTGGAGTCAGAATGTCTTATTTCGATTTGATCTACAAAAAACGCGGG
-AGTTGAGACGCAGAAATCTCATCTGATTTCGCATGTTTAAGAGCGTGCTG
-ACGTCACAATTTTTCTGGAAAAATATTCCCGCATTGTTTGTAGATCAAAC
-TGTAATGAGACAGCCTGGCACCACGTGGGTAGGTGTCGGGATGCACGTGG
-TGTCAGAGTGTCTCATTTCAGCTTGATCTACGTAGATCAACAAAAAAAAA
-TGCGGGAGAAGAGACGCAGAGTTCTCAACTGATTTTGCATAGTTAAGCTC
-GCGCTGACGTCACATTTTTTTTGCAAAAAATTCCCGCATTTTTTGTAGAT
-CAAACCGTAATGGGACACCCTGGCACCACGTGGGGATGCATTAGTATGAT
-TACTGTAGATAAACCTTGAACAATATATATACATTAATTTCGTAATGCTT
-GAAACTTGGACCCAAAAACTATCTGTAACTAGAAAATCTGCAAAAATGAG
-TTTGCGACTTAAAGCTGGAAGTATACAAGTTGCGCAAAGACCTTTCCAGT
-GGCTTCAGCTAGCAACAAAAAAATTTGTAAATTTGCCGGTCCCCACACCA
-CATCAAACGTGCAAGACGGGCAACTTGGTACATCCAGTTCACCTGCACTC
-CAACTACTTCCCAGAACGCCACATAGTTGAATTATTACCCAACTTGGTAC
-ATTATTTTGTCGACTCGACACACCATCACCCCACCATAAACCCCTGCAAA
-TAAGGAAGCCGATCGCTATCTACTCATCTTTAGGGACCTTTTTTGCCGCT
-TTTTATTGATTTGAACAAAATCTCAGCAGAGCAGTCAAAAATTGCCAATA
-TTCCAATTTTTCAGTTGCCAAAGATTTTAGAGTTTCAATACCTACTAAAT
-CCTCCCGTTCCAGCCATCCGTTCTTGATATTCTCTCCATAAATTTTCGCT
-TATCTCCTCTCTTGTAAAACTAACGTTCACTTATCCACATAATAAATACA
-ATAAATGTATTATATACATATATATTATATATATATATATATATATATAT
-ATATATATATATATATATATATATATATATGTATATATATATCTCAAAAA
-ATCAAACAGGATCTCTCTTTTCCTCCAGGAGAAAAAGAAGATGCCGTTTT
-GCAGCCAACAATACTCTCACTCTCAATACACGACGCGACGACGTGGCATC
-CCTCCCCCCATCCTGCCTTTCTTCCCCGTTTCTCCTGTGTCATCGAAATT
-TCTAGGGCAGCAGCACACCGGATTGGTTGGCATGTGAAGCCGACGTGGAT
-CGTGATGGTGATGATGTGGCGGATTGTGATAGATCGTGTTTTTTATCCGG
-CGATTACTGCGAGAATTGTCTGAAAGAGTGGCAGGGCCTGGCGCCTGTCT
-TTCGGCTCTTTTCAGCATTTTGACGTGAATTTCCAAATTTCTAATTTTCT
-CATTTCTATAAATTTGCTGAAAATCAATCAAAGAAATAAAAAAAAAGTTC
-ACTCATGTTTTAGCATACGGCGCGAGAGGCAGGCGGAAATCGCCTTAAGG
-TCAGGCAGGCAGGCAGGCGTTTAACGCCTACATGGAAGCCCTATAGCACA
-CATCTATCTGAAACTGGGAATGTTGTTCCGAAGTGCATTGGAGTGCCTGA
-AATTATACAATGTTTGTTCTAATTTATCATTTACTGTATATAAAGCGCTT
-ATTCCGTGTGTCCATAGTTGGTAGTCTATGTAGTCTGAAGTTTTGGCTTC
-TGGAAGGATAGTGAGTTGGGGTTAGTGTAGGGATATGGTCGGGGAACTGT
-AGTGGTACAATAGCGGTACGGTAGCAGTACTGTAAGATTATGGTACTTTC
-AGAAAAAAAAGTTTTCAGCCCCAGAAGTCGGGGTCCGTGCCGGAGGAGCG
-GACAACGGCTGGTTATCAATAAAGAATACCAACATTTTATCACAGATCCG
-GTTACCGCTAGACAAGAAGGTAAAAATTCGCATTCTGAGAAGGACTACTG
-TAGCAGGTGTTTAGCGTGTGTCCGAGTAGATGTGGCGACTCTTAATTTAA
-GTTGTAGTTTCCTGGTGTCCCCTAATCGCGAACTTCACGATAATTGTAAA
-TATTTTAGTGTGGCCTATGTTTACAGGTTTTACGGACAGCCTAGCCCGAG
-AAAAACTCTGGAAAAAAATCCCAAAGCTCTTATCCAAAACTACCAAAGTA
-TTCTATGCAATTCCCTTTTTGCATTTCCTCACCCCGCCTAATAAGGCATG
-TTGTTTACCGCCGACTTTCCGCAATAATCTATTCTCGCAATCATGTGATT
-TACCTGACGAATCGAAAGTATACGGTAACCTTCACATTTGGAAGAGGAGA
-AAGGAATTCGTTGGAGCCTTGACCCATTCTCCCCACAGGCATAATTCAAA
-AAAATATTCACATCAAGAATGCGGATTTGCCACAACCCAACGGGTTCTCC
-CATCCAGCATCTCTACCTTTGCCGAGGCAGAAACTGAGGACCGATCTCGA
-TCTGCCGCCGCGTTCCGACAAATGTAATAGCAGCCCCCCGCGCGATAGCT
-TTTCACTTTTTCTTCTCTTTCTGGCTACTGCTGCTGCCTCCTCCTGCGCA
-AGGATGATGCTGCTAGGATGATACCCTACGAGATTACGGAACTATCCGAT
-AAATTAGCTTGATGGAGACTAGAGAGATAGTCCCGAAGCTCTGAAGGAAC
-CTGATCTTGTTACAGTCTTGGAACCGAACAGCTGATTGCGTCGTCGTATT
-ATCGTTATTCATTTCGTAAATAGATTTTCTCTAGGATTGATTCCCGGTTG
-AGCCACGTCACTGTCCGAGAACATTCCGGAATGTTATGCATATGTTCTTG
-TAAATAACCTTTCTCCTTCCTCCGGCCGGCCAACTACTTTCATTTCTTGA
-TGCGTCGAGATACGATATCCAAGGCCATCTTTCAAAATCGCAAGTTATCC
-ATCTTTTTTCGCTGATGACTCTCTCTCTCTCTACTCCTTCGCCCATCTCG
-TCTTCAGAATCACCTACCGCAAAACAATTGAATAAGTGAGTGTGGAAGTC
-ACGTCATGAGCGCGACGAAAAGAGAGAAAGAGAGAGAGAGAGAGAGAAGT
-GCCGAAGACGTCGGAAGAGAAAAGCTGGAGGAACCAGCGGCTGGATCGTC
-GTTTGTTGATGATGCCTCCTGCCTGCCATTGTTATTCGATATTCCGATAT
-TCGATTCTTTTTTGCCGCCGCCGCCCAAGAGGAGAGGAGAATCAGAGAAG
-CTTGCGCGCTCCCTATCAAAAAAAAAAGATTATCAAATTTGAAGCAGCAG
-AAGCTGGGAAATGGAAATAATAGCGGATAAACAAAGAGAGCGAAATGTTT
-TGGGCAATAAATTTGTAGTTTGATGATAAGAGTGGCATTTTGATATGAGG
-AAGCTTGCAGAATCTAGTGGTGAACAGGAAGCTTTCGCTATGGAGCAAAA
-TGGATTCCGTCATTTTTCTTAAAGAATCGGAGTCGAGATGAAACACCCAG
-CCGGAGCTGAAAAATTATTCTGCTGAAAAATCGAGGTGCTTGAAGTACCA
-GGGCGTTATACAAAAGATCCAGGGATCCTAGTTCTGCAAAAAAAATTTCT
-GCATAATGAAATGGAGAACAGGGCGGTGCGGCAACCAAGATTTTCGGCAA
-CCGGCATTTGCCGAAGTTGCGGAACCCAAAACATTTTGGTAACCGGCAAT
-TGCCGAAGTTGCCGAATTCAAAAAATTTCGGCAACCGGCATTTGCCGAAG
-TTTCCGAATTCAAAAAATTTCGGTAACCGGTTGCCGCACAGCTCTGATGG
-AGAACCCGGTGGTCAGCTCAGAGTTTGGATCACCACAACCCAGAAATACC
-ATCTTTCAGTGCCTCATACGTAGAAACACTCTAGCTCAAAGTGCCCCTGA
-GGCCCTGGGATCTATCCTTACCTGGAAAACTGTGTAAAATTTCGAATATT
-CACAGATCCTAGGTTCGTAGTTTCACAAAATGTTCCCACTCTGCCTTCGG
-ATCCCCAGGACGCATTGCTACAATATTTTGCACTTGGTACAGTACTCAGC
-TTTCCCTTTTTGCACCAAAAAACATTATTGATCCTTACGATTAGCGTCCT
-AGATAGGCTACAAGGCCATCGAGATCTCAAATATGCAAATTCTTAGGAAA
-GAAAGTGATGTTTCATCATCTTCTTGGATTAAAAATTTCCGAGGAAAAAC
-ATGGCAAAAATCAGGTTGATCGTGAAACTCGTCGGGGGCTCCTCTCACTT
-CTTCCCCATCTTCATCTCTCCTTCTCTTTCCCGATCCGATCTTTTTTCCT
-TTCTTCCATTTTTTCTCGTTTTTCCTTTCCATTTTTTCTTCTCCTTCTTG
-TGTTTGATTATCCATCCTCCTTGCCCTTTCTCCTTGTTTCATTTTTCTTT
-ATTCATTCGGATGGAATAGAGATATGGTTCCGTAAATTCATTCCAATACT
-AGAAGAATTAGTAAGACATTCGTAGGGGGGAAAATTCCGCGCAGAAAGCG
-ACAGGAGGTTCGGGATTGGGTAATCGTCGGAAAAATGAAAAATCGCGCGC
-GCCCGCCCGCGCAGATGGGATATATACTAAATCACATGGGCAGCGACATG
-ATATACGATGGATTGCGTGATCGATAGGCTTTTCAAGGAGGTACATTAGC
-ACTGGTGGGCGTCGGGATCCTTGAAGGAACAACGATCTTTGAAGGAGATG
-ACGAGGATGTTGTGAAATTTAATTGTGATATCATTCTATTATGTAATCCC
-TGGCCTAGAATATACATCATCTTTTAGAATTCTGGTCGGCTAGATGTTTT
-CGGGAAGTGCTTCTAAAGGATCGGCGCTGCCATGTATGTAGGAAGTGCTT
-ATGCCAACCCCAATCATCTTCTCAATCTACTCCTCAGAAGTTCAGTTCTG
-CCAATCCGCACGCTCCACCTTCGTCGCCTATCCGTTTCTCATGCGAGTCT
-CGGGTCAAGGCAAGTGTGCGTGTCCTTCAGTCGTGAAGTCCTATTCATTT
-ATTTTTGCTGCCAAAGTCCGAACAGTTTTTTCTAGCCGTGTCGGCAAAAG
-GGTTCTTATTGCGAATTCACCTCCTCCCCACTCGAGAAATCGCCCCCCCG
-CCGTCCTTGGTAAAACTGACCTAGAAAAATAAAAACAACACAAAGCGCCT
-CCCGCATCATCACGCGTATATATGTATATATATAAGATGGTAGGCGGGAA
-GAGGAATCGACGCAATATCGACTGAAGGTTGCGCAATCGAGATGGCTCTT
-CCCGGCACGGATACCTCCTCCTCGCGTACCAGGCACCCGCATATAGCTAA
-AGTTCTCCGCCCATTTCGTTACTTTTTTGTGCTTCCCATATCATCGCAGC
-AGCGCTTATGCCATTGCGCCCGACCCGATCCAACTTCTTATTCTTGTTCC
-TTAGCCTTCTCCCCCTCCCATGTCCTCCCGATATCCAAAAAGTGGGAGGA
-GCATGCCATAGTGAGAGGGCGGGGCCGGGACACACACAAGGCTGGCCCCG
-AGAAAACGAACAACACTTATGCCGAGGACAGTCTCGACAGTTGGTGGTCA
-CCCCACCTGCGCCTTGATTACCCCGCCCGTCCGCGCCCGCCGGGCTAAAG
-TATTTTGTTTGCCATTCATGTTCCTCATTCGACGTTCATCATGCTTCTGT
-TATGCTTCTTGGTGTTGGTCCGGTTCCTTTCTCTCTCTCTCTCTTTCTTC
-CTTGTGGATCAGATGCCATTCCGCCTTTTTGCTAGATAAGCGCATATTCA
-TCTCACTCTTCTTTGTTTTCAATTCAGCATTCTTTATATATCCAATATCC
-TACATCCTATATCCTCGTTCTCTCCTCATTTTCATTCATATGCCGATCCA
-TTTGGTACTGGTGGTGTCGTTCTTCTTAGTTTCGCTTTCCAATTCTTTTC
-TAGACAATTCCTTCTATTTCCAGAAACTTTTTTCTACACAATGCTCCCAG
-ACAGCCCATCCCCACGCGCTGCCCTTGCTCTCTCCGATCTTCAGCCACAA
-ACCGGCGCCTCAACGTTCTCAATTGGCAGTGGATCAGGCAACTGGTAAGT
-CGAGTTCTTATGTAACTAGTAGGATGGTAGACATCGAGATTAACGATGTC
-TGGCATTCGTTACGTAACGAACGGGTTCTCCCGCCGACCATCGAAGCGCT
-TAAGCGCCGAGATTCTCGGCTTCATCGCACCCCGGTCTAGCAAGTTTTCC
-AATCCATCCCAAATTACAGGTCGACAAGAGGTGTTGGTGGAGTTAATGGT
-GATTACATGGACAAATCCGGCGGAGGAATGTTCGGAAACAGCAGAAACAA
-CGTGAGTTATAAAAATATCTGGGGGGGGGGGGGGGGGGGGAAGTGTTGTT
-CTAGGCCAGGGACATTGAGAACCGCGTGATGAAGAGTACTTTTATCCGAA
-TTAAATCATAGGCAACGAAAACAAGAATCAGGTTCTTGTGCTTTGCACAC
-CATGTCGGAATATCCGTCTCAATCAAAACGAAAAAAGCCTAAGCTGGACC
-AAGTGTTAAATGCTTAAATGCCAAAAATGAACAATCTTTCAAATCACTTT
-CATCTTCCTGTAAATCAGAGAATCCTGAAGCGCTGGCGCGCACACTTACG
-AAAAGTGAAAGCCGATATATCAAGTTTATCACCTAGCGGGACTTCCATTG
-TCTCATTGTCTCTTGGCTATCCGCCCCACTTTCCCCCCGGATCATCCGCC
-CCCTTTAATCCAAGACTCTCGAACAGTTTCGCTTCATTCCAGGACCGATT
-CGCATTCGGCAACAACAGCTCGTCGTCCTCATCAGCAGGCTGCTTTTCAT
-CGAACAATTCGTCAGGCGGACTTTTTTCCAGTAAATAAGTTAATATGTGA
-GTTTTTTTTGTGTACATTTTCTTCTTTTCAAGATCCATTAACATTTCAGA
-ATGCGATCGGCAGCCGGTATTCTTATTCTAATCTCAATAATTATTCCCAG
-TGTATATAGTGAACCGAAGTTGCCCGATTGCGAGCAAATACCAAAAGTCT
-TGTGCTGTACCCAACGTGTCTTAGATAAATGTATGTCTGGTTGTATCGAT
-TATGTCACTGAGAAATGCCCCCACAAATTGGAAAAATACGAGACGATCGA
-TGAAGAGCCATCGACGAGAGCTCCAAAGAAGCAGGTGAAGCCAGCTAAGG
-CAACTAGCAACAGAGTTGTCGGAGCAGTTGAAGTAGACCATGAAGCCAAG
-GAGCAGTTCATCGACTCCAAGGATATCAGAAGAGCACCACGAGTCGGTGA
-TGCCAAGCTTCTCAGCCAGGAGTACCCGATCACCGAGGTCACCGACGCCG
-ATCTCTCCTCCGAGTGCGGAACCGAGAAGTCTCAGCCACCATTCTCACCA
-TGCTTGTCCCGCAAGTCGGCCGACGACGTCTTCCTCTCCTGCTGTCGCCA
-ACAGGTTCCATCCAACTGTCACAGCCTCTGCACCTACGAGCATCGTGAGC
-ATGTCGCCGCTGAAACTCTGATCCAGGCGATCCAGCAAGAGCACTGCGAT
-ATGAAGGTAAGAATAGTTCAATCTTCCTATTGAGTTTTTTTTTTGAGTTT
-TTCCAAAATTCATTCTTTCAGTACTTCTCCAAACTGCTCTACTGTGCCAA
-CCAAAACCGCGACAACCGCGCGTGCTGCTCCAACCTCGGCATGTCAAACG
-CGGAACTCGGCGTCGGCGATCGTTGCCTACGTATGTGCAACATCTCCCCG
-TCGGGAGACCGTGTAAGCTCTATGGAGAAGGAGGATCTCGTCTGCCTGTC
-CAACTGGAACGTCATCATGTACTGTGCCAGAGGTGGTCTTCGTACCATCA
-ACTAGACCATCATCCCCGTTCTCTTCTCCCGTAATAAGCTGGCTCAGGTT
-GTTAATAATAATTCGCCGCTCGTCTTAATAATTTTCCATTTTCCAATCTC
-GTCCCCCCTTTTCAACACTACCACATTTCTCAGTGATATTCATCTGAACC
-GCCCGACATACATCAGTTCCTCATAGTACCTAACAGGGTTCAACAAACCC
-ATCCACACACCGTCCCCCCACGTAACACCCCCCCCCCCCCCACTTAAGGA
-CCAAGTCCTAGTTACTGAATGTGCAACATTATGGCCAGAATGCAATACTT
-GTCCCATCTGAATCCATGTTATTTGATAATCTATGACAGTATTATACAAC
-CCTTTTTTTTCAAAACACAAGCCCCCTTGAAAACGAACTCATTGTATGTC
-AAACGGTATCCCTTATTACACGATTAATTGTGGAGTTTGAAGCGAATAAA
-TCAATCAATTTCTCGTTGGGTCCCACAGCGAAATGACTATTACCGGTACA
-GAGAGTGTGGATAGTTAGAGAGTGACAGACATCCGGGACCCAATGGGGCG
-GGGCGCGCGGAAGAGACGATTTGTGTCGATTTACGAAATGATGACAACGA
-GGAAAATTTCGTAAATCGACACAAATCGTCTCTTCCGCGCGCCCCGCCCC
-ATCGGGTCCCGGATGTCTGTCGCTCTCTAACTATCTACACTCTCTGTACC
-GGTAATACTATTGCAGTAATCGCAGGTTATTTCATAGCGATTTTTCATAG
-CTTCACGGATTTCTGGATTCCCTCATAAATTGAAATGGAAGAGTTTTTGC
-TGAACTAGGCCATTTTGGCTCTGTCATATCTGGGGTAGATTTACGGCGCG
-TTGCGGTTCGATTTTAGTTGTAAAACTAAATGTATTTGTCCGTGTGGAGT
-ACACGACTTTCTCACGCGTGGTCCGGCAGGCGATTATCAATAGAGCGCGA
-AAAATTCAATGAGGAAGGCCAGAACTCCGTGCAGCTTTACTCGCGAATTC
-AGGTGTGTGTTTTAATTGTCTTTATTCAGTTTTCTGATAATGAATATACT
-TTTTTACAGAAAAACTGGAAAACTGATAAAAAAGTCCCCAGAAACTAGAT
-ATTGAAATTACAGTACACTTTAAAGGCGCACACATTTTCACAGTAAACAA
-AAAATTTGTCGTGCCGAGATATTTCATCCAGATTATCAGTTGTTAAAATT
-TGACAACACTCATTTTGAATATTTAATGAATTCGAATGGAAAATAGAAGA
-AAGCTGCCAAAAAGTGAAATTAAATTCTCAAAAACTTGATTTCCAGACTT
-TTTTGGCGATTTTCGACCAATTTCAGCAGAATTTTTAGCAGAATTTTACA
-AATTTTTTTATTTTAAAGCTTATTTTAATAATTTTTCTCTGAAATATATG
-AATATCTTTGCTTTCGATGGATCTTCCTCAAAAGTAGACACACATTTTTA
-TTTTTCTACAAAACTGTGCAAAGTTACGTCGTGGTGTTTGCGTACCTCGG
-CGGGAATTTAAAGAGAAATGGCATTTTTCACTTTTCTCGCAGTTTTTCTG
-ATTTTTTTTTCGTTTTTTCGTAGTTTCCTAATAAAAAATCGTTCCAATTG
-TTTCCAGGTAATGGCTGGATTTGAAATTCAAAGAGTCGAGTCCAAATTCT
-TCGACTTGGACGACATAATCGCCAAGTCAGACTCCACGTCTTGCACATTT
-GAGATTGGAGATTTGAATCCAGGTCTGAAATCGCATCGAAAACCTAAAAA
-TTCTAGTGATTTTTGTTCAGATTTCTTCCAGGAAATGCTGGGAGTTTCGA
-AGCCAACTCAAAATGCAGACGGATACGGCGTTGATGCTCCATACTGGCTG
-CTGGAATCCGTTAGAAGTTCATTTTCCGTGAGAATTTAGTTAGATTTGCC
-CCGAATTTTAATTGAGAATTCCAGATTCAACTGCCAAAAGCTTATAGTGT
-GAACATGCAAAATGTGCTGAACGCTGACAGCAAGAAATTGAATCTCTCCG
-GCTTGCAGCAACACTTTTACGGCAACGGGATGCAGTTATGCCGTCTGATG
-AAGGGCGAAAATCCGGACGGCGCGCTGAGCCTCGCACGATGCCTTGTCTC
-CACACTTACACAGCGATTAGGAGGTATTAATTAATATAATAAAGCACTTA
-TAAAATACAATTTCTGGTTTTTTTTTGTTGCAGAAATTGTGTCAACTGCA
-ACCCATCTGCAAAGCAAAGGCGAGAAATTTGACAGCCTCGAGACAAAAGT
-GTTCCTGGAGGGTAAACGGTGCAAAGAAGACATTGATACTTGGCTGAGAC
-AAGACAATAAGTGCTCGAGCAAGAAGCGTAAGAGACTTTCGTTATAAACT
-TCAAATTTCTTATGCTTGAATCTAATTTTATTTTTTTTAATTCGTCTGTA
-AATATAATTCAAACCCACCATTCTGTAATAATATTTTATTTTCTATTTTT
-TCACACTCATTTTTGTGTTTTATTGGTGTAATAAACCTGGTTTCATGACT
-TTTTTGCAAGGAATTTTGTTGAAAAGGCTGCTGCAAAAACTTTGCCAGCA
-AAAAATTTTGTGCAAGCACGCTCCATCGCACAGTTTGAACGTCGCGGGTC
-GAAGTTAGATGTGCAGGTCATATAGCAAAAAGAGAAACACCCCTTTTTTT
-CTCGAGAAGTTTCACCAATTTTGCGCGATTTTTCAACTATTTTTTTGCTT
-TTTTGGCTTAATTTTGGCTCAGATTTTCCTCAAAAACATGAAAATCCAAT
-CTAGAATAAGTAGTAATGGGTATATTCTAAGATTGTGCAAAAGTTAGCTT
-GAATTTCCTCGATTAAAGCTTTCCTACCAAGAAAAATGTGTGGATATTTT
-GAATTTACAAGTTTTTCATCTTTTTTTTGTAATATTCTCTTTGAAACTCC
-TGTTTCTCTCAAATTTGTAAACTTTCATAAACGTTTTTTTCAGGGTTACC
-ACATTAAACAATGACCGGAAGCACCGAAACTCGCCAGAAGGAAGTCAAGG
-AGGTTGGTTGTTCAAAGTGACGTCTAAAATATTTAAATTTCTATATTTCA
-GCCACAAGTTGACGTTTCGGATGATTCCGACAACGAGGCCGTCGAGCAAG
-AGCTCACCGAGGAGCAAAGACGTGTGGCCGAGGCTGCTGGACTTGGAGAT
-CACATCGACAAGCAGGCCAAGCAAAGCCGCTCCGAGAAGAAGGCCCGCAA
-GCTCTTCTCCAAGCTCGGACTCAAGCAAGTGACTGGTGTCTCCCGTGTCT
-GCATTCGCAAGTCGAAGAACATCCTCTTCGTCATAAACAAGCCAGACGTG
-TTCAAGAGCCCAGGATCTGACACCTACATCATCTTCGGAGAAGCCAAGAT
-CGAGGATCTCACCCAACACGCCCAGATGTCTGCTATTGAGAACTTGAAGC
-CAACTCGTGAGGCCCCACAACTCAAGACTGTCGAAGAGGACGAGAATGAG
-GATGTTGAGGTAATTCAGTAACTTAATCGGATTTATTACATTAATTGTAC
-GGTTTAAGGAGGATTCCACCGGCATTGAGGAGAAGGACATCGAGCTTGTC
-ATTTCCCAAGCCAACACCACCCGCAACAAGGCCATCAGGGCGCTTAAGGA
-AGCTGACAATGACATCGTCAATGCCATCATGAGCCTTACCATGTAGCTTG
-TTTCCTGATGACCTTGCAGATACTCTTGTTATCGTTGTATCTCTTGCTTA
-TCCCGTTTTCCGTTCCAAGTAAACGTTTATCAGTCTTTTTTAACTTTTTT
-GTTATGTTTAAAAAACAATTGCATCTTCGAATTGACCTACCTTTTACAGA
-AAAGAACAATTAAATCACTGTTTGTGTAAAACACCCCTCTATTGATCGAG
-AACTTTCACTTCTTCCAATTCTTTACTCGTATGACTGTGATTCATTTCAC
-CTGCTATCACTTTATCATGACATTCCAGTTTATATCAACAGCAAATACCA
-ATTGTGTGTATGTGAAAAATGCTATTGAATAGCAAGCGCGCCCCAACAAA
-CACGTTTGAATGCGCGGGCGAAACGGCGTTAGATGTGCAGGTCATATGAC
-AAAACGCATCGACCAGCAGCCAATGGCAAGTTACTGCGAGCTGTTATAGA
-TTTTTTCACATGGTTTCCAGTGTTATCAGTTGGAAATCGATCGATAATAC
-TGACTAGTAGTACTTAACATCTTCATTCCCACCGTTTCGCTGTCATTTGT
-GATACGTGGATTTATTTTTCCTTTCTCGCCGACTTTTCATTTCTAAATCT
-TTTCTGGAATTGCGAAATTTTCAGCCAGTTTCATGATCGAATGGCTCGTA
-ATGAACCATCATCTCAGCAGCCGAGTAGTTCCGGGAGTAATGGAACTCCA
-GCACAACAAAACGGGTCGGCAAAACCATCAAAAGTCACAGTAAAAGGTAA
-CAATTCGTAGATTTTTTGCATCTGTTCTAATAATATTTCCCCCTCTTAAT
-CATAGTCGTCAACGCGTCGTTCACCAAGGCAGCCGACTGCTATGTCGAAA
-TCACGAGTGACACGTCATCGGCGGCGCCAAAAAAGACGACTGTAAAGAAG
-AAGACGATGGCGCCCGAGTGGAATGAACATCTCAACGTTCATGCAAATGA
-ATCTTCGACAATTTCGTTTCGTCTATTGCAAAAAGCCAAGCTATTCGATG
-ACACGTGTCTAGGGATGGCGAAGCTGAAGCTTTCGAGTCTCACAAGAAAT
-GAGAATGGAGAGTGTAAGTGGTTTTATTGAAATTTTCTCAAAAAATCTAT
-TATTTCAGTCAAAAACGACATCAACAATATATCTTTGCTGGCCAAAGACT
-CCTCGAAAATCGGAACTCTCAACATAATTTTCTCCGGATATCCAGAGCGG
-AAACGAAGAAGCGCAGGAGTACGAGCTGAAACCGCCGCGTCTGCAAGTTC
-AGAGGCATCCACGTCAAATGGCGTTGCCACGTCATCCTCGGCGCGGAGAC
-CGGCGACAGCGAAGCGTGACACTTTGGCGGCTCCAACGGTAATCGTGACG
-AGACCCATTTTGAATTATTTAATTATTCATGAAACGCTCTACTGGAGTGT
-TCATAATTATTAGAGCGCGCTCGCGCGGCACCTCACGAACTCCAGAATTC
-GCGAGGACAGCAGTTTTTGGCTATTTTGGCTTCTATGGAAATTATTTTTA
-ATTTTTTGATTTAAAATATTGTTGAGAAGCATCATCCAAATTGAAAATGT
-GTAAAATTATGAAATTTGACCGAAAACTGAAGGTTTTACAGAGAGGAGTC
-ACCACGGCTTTCTTTAAAAAGTATCAGTACCGTCAGTATTTCGATTTCAG
-AGTCGTAAAATATGTCATTTTGTAGAGAAACGTCTGTTTCACAAAAATCC
-ATGTTTGATATTTTAATTGTTTAATTTCTAATATAAAAATATTCAAAAAA
-TCAACAAGTTTACGTTAAAATCGAATTTTTCAATCGTTCAGTTTTTAATA
-AGAACAATTTCATAATTTCAAACATGGATTTTTTTGAAACAGACTTTTCT
-CTACAAAATGACATATTTTACGACTCTGAAATCGAAAAAACTGACGGTAC
-TGATACATTTTAAAGAAAGTCGTGGTGACTCCTCTCTGTAAACCTTCAGT
-TTTCGTTAAAAATAATTTCCATAGAAGCCAAAAATAGCCAAAAACTGCTG
-TCCCCGCGAAACGAAATCCCGCGAATTCTGGAGTTCGTGAGGTGCCGCGC
-GAGCGCGCTCTAATAATTATGAACACTAGAGGAGAGCGTGAATGAGCGTT
-TTTTATTCTTTTCTCTGCATTTTTAATGCTACAGAATCATACACAAAATG
-TTGTCAAATACATGCATTACTCTACTACTCTTAATGTTTACTTTTCATTT
-GCAGAGTACCGCAGCGGCGGCAGCAGCAGCAACAGCAGGCGGCACCCCGG
-CCGCCGGAGCAGAAGAACAGCTTCCCGATGGATGGGAGATGCGTTTCGAT
-CAATACGGACGCAAGTACTACGTGGATCACACCACCAAGAGCACCACGTG
-GGAACGCCCGTCTACTCAGCCATTGCCACAGGGATGGGAAATGCGAAGAG
-ATCCGAGAGGAAGAGTGAGTTTTCCGGCGGAAAAAGCAGATTTAGCACGA
-GAAAAGCGTTTCTGATTATATTTTTGATGCGAAAATCATCAAAATTAAAA
-ATATCTACCGTAGCCGCGGATACCTGGACCAAAATGCCGAAAAAAGTGAC
-CTGATAAATTATTTTAAGGCTAAAATCTTGATTTTTACATAATTAGTGTC
-TTATTTTTGTTGATTTCTTGTCAAATTTTTGTAATTGCATCGAAATAGGC
-CAAAAATAAAGTAAAAATCAACTTCCAACACAGAAAAACTGACAAAATTG
-AAGATTTTTGCTGAATTCAGGCAATTTTTCGTAATTTTGATCCTCCATAA
-TTTTTTTTTTCGAGAAAATTTTGAAATTTTTTCTTTAAATACGGCCTGAA
-AATTAGGAAATTATAACGACGGATAAAAAATTCTGATTTTCTTTATTTTA
-ACCAAGGTCTCCAATTATTTGATAATCGAAAAAAAAAAAACTTTCCAGTG
-ATTTTTACTTGAAAAATGTCTAAAAATTCACGCCAGGTGCACAATCCATT
-TTCAGGTGTATTACGTGGATCACAACACGCGCACGACCACCTGGCAACGA
-CCGACAGCCGATATGCTTGAAGCACACGAACAATGGCAATCGGGAAGAGA
-TCAGGCGATGCTTCAATGGGAACAACGTTTCCTTCTCCAGCAGAACAACT
-TTAGCGCCGACGATCCACTCGGACCATTGCCCGAAGGATGGGAGAAGCGT
-CAGGATCCGAATACGTCGAGAATGTACTTTGTGAATCATGTAAATAGAAC
-GACACAATGGGAAGATCCGAGAACACAGGGGTATGTGAAAATTTTCAATT
-TTCCAATAATATTTCTATCAAAAATCACAGTTTTAATGTTTTAAAAGTTT
-CAGAGGCTCCGACCAACCTCTTCCGGATGGTTGGGAAATGCGATTCACCG
-AGCAAGGCGTTCCATTCTTCATCGATCACCAGTCTAAAACCACCACCTAT
-AATGATCCAAGAACCGGAAAACCCGTCGGCCCGCTCGGCGTCGTCGGTGT
-TCAAATGGCCATGGAGAAGAGTTTCCGGTGGAAAATTGCACAATTCAGAT
-ATTTATGCTTGGTAAGGGAGGGCGAGAAATTCTTTGATTTTAGCTATAAA
-TTGATGTAAATTTCAGTCAAACAGTGTGCCTAATCATGTCAAAATCACAG
-TATCCCGTAATAACGTGTTCGAAGACTCATTCCAAGAAATTATGCGTAAA
-AATGCAGTCGATCTACGCCGGCGGCTGTACATTCAATTCCGAGGCGAAGA
-GGGTCTCGACTATGGAGGTGTCGCCAGAGAATGGTTCTTCCTGCTGTCGC
-ACGAAGTGTTGAATCCAATGTATTGCCTATTCATGTATGCTGGTAATAAC
-AATTATAGTCTTCAAATCAATCCAGCTTCATTTGTTAACCCGGATCATCT
-TAAGTATTTCGAGTATATTGGACGATTCATTGCCATGGTGAGTGTTTTTT
-TTTAATTGAAAATCAGTTGAAAATTGGATGAAAAATTGCGAAATCGAGAG
-AAAATCGAGTTTTCCGCTTTTTACAATTGAATTTTAAAATTTTAAACGTT
-AAATTTTGCAGAAAATTCCAAAAAAAAGCACTTGGATCTAAAATTTTTGT
-TTTTTGATGAAGGAAATCCTTAAATATCGATTTTTTTTATTTTCAGCTCA
-AAAAACCTGGAAATTTCGATGATCTCAAATTTTCAGATCAATATATTTCA
-TTTTCTCCTAAAAATGTTATTTTTATTTAAACAAATAGTTTTTCTTAGAA
-AATTCCTTTATTTTCAAATTTCCAGGCGCTATTCCACGGGAAATTCATCT
-ACAGCGGTTTCACGATGCCATTCTACAAAAAGATGCTCAACAAGAAGATT
-GTTTTAAAGGACATTGAACAAGTCGATTCGGAAATTTATAATTCATTGAT
-GTGGATCAAGGATAACAATATCGATGAATGCGATATGGAGCTCTATTTTG
-TTGCCGATTACGAGCTGCTCGGCGAGCTCAAGACTTATGAGCTTAAGGAG
-GGCGGTACAGAGATTGCTGTTACCGAGGAGAATAAGGTGAGATTTTGGAT
-TAGCTAGAGCTTATAAAAATAATTTTTAAATAAAATAATTTAATTTAAAA
-AATCCCAATTTTCCAGCTTGAATACATCGAACTGCTCGTTGAGTGGCGCT
-TCAATCGCGGTGTCGAACAACAGACAAAAGCCTTCTTCACCGGCTTCAAC
-TCGGTCTTCCCGTTGGAATGGATGCAGTATTTCGATGAAAGAGAGCTCGA
-GCTGTTGCTCTGCGGAATGCAGGACGTTGATGTGGACGATTGGCAGAGAA
-ATACTGTCTACAGACATTATGCTCCACAGAGCAAGCAGGTAGGGGAGAAC
-ATTTGATTAAAACTTCTTTTTTTTTAATTAAAAAATACATTTATAGGTAA
-CCTGGTTCTGGCAATGGGTTCGAAGTCTGGACCAAGAAAAACGTGCCCGG
-CTCCTACAATTCGTCACAGGAACGTGCCGTGTGCCAGTCGGTGGATTTTC
-CGAGCTGATGGGCTCGACGGGACCACAACTATTCTGTATCGAGCGTGTCG
-GCAAGGAGAACTGGCTCCCACGGTCGCATACGTGCTTCAATCGACTCGAC
-TTGCCGCCATACAGAAGCTACGATCAGCTCGTCGAGAAGTTGAGCATGGC
-GATCGAGATGACGGAAGGATTTGGAAACGAGTAGTCTCCCGTTGTTTTTT
-TTTGGTTTTGCTGGCCGCCTAATTATTGTATAACCCTCATATTTCTTCTC
-ACCCACACCCCATTGATTTTCCTTTTTTTTCTCTCCATCAATTAATGTTT
-CTTTTTTTCGAATTTGTGTGATAATTTTCGTGTTGTGATACCACTTGCTT
-AGGTTCTCTCTCTCTCTTTCCTTTCCTTCTGGGTATGTACCTATATTTAG
-AATATAGACAAAGCATCTAGTTTTTTTGGATTTAATTTCCAAATTTCCCG
-TTTAATTCCAACAACAAAAAAACAATTCCACCACTTTTCAAATATTTTTT
-TTGTGTCCATTGCTTCATTGCTTTTCTTCTTCTCAACCATTTCAACCACC
-ACCACCCAATCTGCGCCTTATTCTTACTTGGTCCTTGTCATTCTTAGTTC
-CAGTTTTTTTCACGGAAGCAGCTCTCGATTATTAATTCAAATGCATCCCC
-CCAACCAATCCGTCACCCCCCGATTAGAACAATTTCTACTTTTTTTTTTG
-AAAACAAAAAAAAACACAATTCCTCGATTTGGTTGTAATGAATTTAATTT
-TTTAAATTTTGAGCCTTTTTTGTTGTTTTAGGTTTTCTTAACTTTCAGAA
-TTTCCATGCGGAACACACGGAGAGCAGAAGATCAATATTTTGAACCCTGC
-AGGAGAAGGACGGGACCCTTTGGTCACTCATGTCTCGGCTGTCTGCGTCT
-CTCCTCTCTCTCTGCACCAGCGGAGAGGATGGATAGCCTCATTCGTTTTA
-TTTCGGACTTTCGATTTTTCTTATTGCTCCACGTTTTAGCTTTTATCAGA
-TTCGGGGAGCTCTTGCTTTTTTCTTGATTTTTTCGTAAAGTGTTCTTGGG
-TCCCGCAGCGAAAATTAACTTTAAAATGATTTTTTAAAAACTTTCTAAAA
-ATTCATTTTTTTTTCCATTTTACGACTAGAAATTTCGAAATTTGAAAAAA
-AAAACCGTGTTGCAAATGCGCTCCAGCGTACAAAACAAAACCGCCACCAA
-AAAATTTAAATTACTGAAAAAAACGATGAAATTTTGAATTTGTTTTGCCA
-TTTTCCGGCAATGATTTTTTAAATAAAAAAAACTGTACAACAAATGCGCT
-CCAGCGAACTAACCTTCAAATTACCGAAAAAAATTATAAAAATTTGAATA
-TTTCCGATTAACCCAAGAAAAGAAAAATTCAATGATTTTCTTGAAAAAAG
-TTATTTTTTTCTCAATTTTTCGTCAATAATACTCAAAATTTGAAGAAAAA
-TTGTGTAGCAAGCGCGCTCTAGCGAACCAAACAAAATGTCTCCATTGAAG
-CGTTTCACGAGGTTCTGGCCTACCTCATTGAATTTTTCGCGCTCCATTGA
-CAATCGCCCGCCGATAACGCGTGGGAAAGTCGTGTACTCCACACGGACAA
-ATACATTTAGTTTTACTACAAATATCGAGCCGCGACGCGACACGCAACGC
-GCCGTAAATCTACCCCAGATATGGCCGAGCCAAAATGGCCTAGTTCGGCA
-AAAACTCTTCCATTTCAATTCATGAGGGAAGCCAGAAATCCGTGATCCAA
-GTAAAAAAAATCCCAAAAATTTCAATTTGCAAGGGCGCTCCATTGAAAAC
-TGTGGCGCCGATCGCAACTCACGGTCGAATTTGAATTTTTAGTTGAAAAA
-AAAACACCAATTTGAACTGAAAATTTGAATTTTCAATTTTTTCCCTAAAA
-TAAATTGTTCAGAGTTTCGCTGTCGAATTGTTGATACCCGCTCGTCAGAA
-TTGGAAATTGAGAAATTGAGAGAGAATTAGAGAAGGAGAGGAAGAGGAAC
-TGCTCACTGGTCCCCTCACTCCATCCGAAATTAGGCACTTTTTGCTCCGG
-CGGCACTAGAAGACGAAGAAAAAACGACGAGCAGAACACAATCAATTTCG
-TCTTCTTTTTTATTTTTTTTTGGTTTTTTCTTGTTGGTACCACGGATTTC
-TGGCTTCCCTCATAAATTGAAATGGAAGAGTTTTTGCCGAAATAGGCCAT
-TTTGGCTCGGCCATATCTGGGGTAGACTAACGGCGCGTTGCGTGTCGCGT
-CGCGGCTCGATTTTAGTTGTAAAACTAAATGTGATTTGTCCGTGTGGAGT
-ACACGACTTTCCCACGCGTTGTCCGGCGGCCGATTGTCAAAGGAGCGCGA
-AAAATTAAATGAGGAAGGCCAGAACCCCGTGGTAAAACATGGTGCATCAA
-CGCAAAAATTTTTCATTTTTTGGAAAAACTCAATTGTTTTTTTTTCGCGT
-CGGGACCACCAAACCAGAGCTCGTTTACTAAATTGAATTTCCAAAAAAAA
-AAAAATTTCGCTCTGTTCAAAATTCGAAATTCAGTTTTCTTTCCCTAAAA
-CCTAATAAAATGATCTTGGCACAATGCTCACTGTGAGCTTTGGGTCTAGA
-ACGATGGCCTAGAAATGTTGAGATTTCCTCTTCCAGCGCCCTTGCCAATA
-TGACCTAGAAATTTCAAATTAGTATAACTCGGCCATTTTCCATCCGTTTT
-CGCCAAAACTACACCATTATAACATTTAAAACTTACTTTTCAATATGATG
-ATAATACTTTTCCAGTGGAAGAGTTTTCCGCATTTCTAAGCCACCAAAAC
-CTCTCCTCCCGACGTTTTATCAAACAAATGATATCACTGTGATTTGTGTT
-GTAAGTTGCGCGCATGATTGCACTTGCGCAATTAATTAAGACAATTACTC
-AAAATTTTGATCGAATTAACCCCATGTACATATAAAATACAAGATTTTTG
-TGTATTGTTCTTCAAAGTTTTTTGTCGTATTTATATAGAAGCAGTGTACA
-CCTAAATTTGGCTTATTACGACCTTTTTTTCCAAGGAAAATACTCATTTT
-TAGGGTTATAAACCCCTTGATTGATACGTGGCCTAGAAAACTGCAAGCGC
-TTTTTCCTGGAAGTTTTAGGCCACCAGTTAGAGTCTTGCAAAGACGGACT
-AGTTCTCACATGACCCAGAAAGTCTTAGTCCATCACGTATTTCTTACGAC
-GCCTAGAAATGCAAATCTTCGGCCACCAATTTTCATAGACATTCTAGGCC
-ACCCTTTTTGACGTGGCCTAGAATCTTTAACAAAATTTGTAATGAAAATC
-CTAGGCCACCATTCAGTTAGCTCTCATTTTTGATACTTCGCCTAGATTTT
-TAACACGTGGCCTAGATTTCTATTTTAACACGGGGCTTAGATTTTTATTT
-TAACAAGTGGCCTAGGTTTTTGCTACTAGGCCTAGATTTTTTACATGTGA
-CCTAGATTTTTATTATAGCACCTGACCTAGATTGTTGGCATTTGGCCTAG
-ATTTCTGTCATGTGACCTAGATTTTTTAATGCACCAAAAATTCTCCATAC
-AAATTTAACTCCTACACTCTAATTTGTAATCAGAACCTTCGATAAGAAGA
-ACATGGAGCTACTGCGGTGCTCAAATTCCGAACAAAAAACGGCTGAAAAA
-CTGAGGTATACGTGGTTTTTTTTCGAAACTGATAAAAGTCAGCATAAATC
-ACGATAAACTGAACGTCCTTTGGCCAAGTTTAGAGAAACCTAGGCCACGG
-GTAGTGGTGGCCGAATTTTAAAAAAACTGGGCCACGAGGTTTACGTGGTG
-TCAAATTGCCCCATTTTGGTTTGATCTTCGAAAAATGCGGGAGACGAGAC
-GCAGACTTTTCAACTGATTTCGCATGGTTAAGAACGTGCTGATGTCATTT
-TTTTCCGTGGAAAAATTCCCGCATTTTTTGTATATCAAACCACAACGAGA
-CACTCTAACACCACCGTCCGGCCGTTCAAACGAAAATTTAGGCCACGGCC
-ACTAGGGTGAAGTGGAATGCCCTACCCTTCTCTACAAAATTCATTGGAGA
-AACCTAGGCCATGCTCAAAGAAACAGTGGCCGAGAAAGGAAAAACTAGGC
-CGCGTTCGCTTTGTACCTCTCTTATAAAACACTGTCTGTTAGTTCATAAA
-TCAGAGTCTGCCCCCTATCACTACTCTCTCATTTACCTGCCCCTCTTAAC
-AAACAATCAACCCCCCCCCCCCCTCTAAATCGACTACTTGTTCCCCGTTG
-TACCTGTCTGCGTCTAGCTATTTCTGTTAAATTTTTGGAACGAAAAAGTG
-GTATGTGAATGTACGAAACAAAAATAATAATCAATTGAATACAATTTTTG
-CCCCCCCCCCCCCCCCCCCTCCACCCCGCTTGCCTGTCTCTAACCGGTTT
-CCCCTTTTTCACCTCAATCAGCCCCCCCCCCCCCCCCCCCCCCCCAATTT
-CATTTGACTGTACATTTTCCTTTACCTATCTGCGTATCTACACAATTTTT
-GTATTTTTTCCTTTTATTTTTCTAATTATAAACCCTGCAATTTGCAAGAA
-AAAATCTCTAAAACGCTTGGCCCCTTACCCGGAGTGCGACCGTGGCCTAG
-AAATTTATATTTCTTATAAGACCCCCCGGCTCTTCCAATTTTTCATTTTT
-TTTCTTTGAAAGCCTAAATTTTCATTTTTTCTTAGAGATCAATATATTAT
-GGGTTAGTAAAAAATTTCAAAAACAAGCTCCCCGTGGGCGTGGAAGAGTT
-TTCCAAATTTCTAGGCCATACTTTTCGAAGGCGTTGGGGTACGCTCGCAC
-CCTAGTACTAAAAATTGTAAATTATAAAATTATCATAAAATTGGCTCAAA
-GCATTTGAAAATAATAAAAAAAATTTTAGAAAAAAAAACACGAAAAAAAC
-CCCTATTTTGAACATGGTTCATCGACCGGGACCTATATACTTTGAAAGCT
-TATATCTCGCTTCATGTTTGTTTTATCAAAAATTTTTCAACCAACAAAGT
-GTTTATTATTTCTTTTTCTATATTTTTGTAATTAAAAACTTTTTGATAGC
-TTCAAAAGTAACTGAGATACATGTTGTCAAACAGAGCAAACTTATAGCTT
-AGCCCAATTATTTATTTTTTGCTGTGTAACATTTCTTGTATAAACTTTTA
-AAGTTTACGGTTTTTTTAAATTTCTAAAAAAAATTATTGACACTTTAAAG
-GGAGGTCATGTGGAGATAGCCTGTACAAATAAAACTGATGAACTAGGACG
-AACCGAAATTCATAAACCATTATTTACACAGGTGATTCTTGCCTTTTTTG
-GAGGGTTAAAAAGGTTAAAAATTATTTAAAGCTTGGAATGAGCATTTGTG
-CGGCCGAGTTTTTATTTTCTAGGCCATAATTTTTAAAACAATGGCCTAGA
-AGCACAAATTTCTAAGTAATTTGAATTTCCCGCCAAAAATTTTTTTTTCC
-ATAAAATTTAAATTTCCCGTCGAAAATTTTTTTCGGAAAATTTGTATTTC
-CCGCCAAAAGATTTTTTGTCTCAAAAAATTTGAATTTCCCGCCAAAATGT
-TTTCTCAGAAAATTTAAATTTCCCGCCAAAATATTTTTTGTCTCAAAAAA
-TTTGAATTTCCCACCAAAAATTTTATCCCAAATTTTATCGAACATTTGGT
-GGCCGAATTTCCATTTTCTAGGCCACCCTCAGTTAAATCGTCAAATAAGT
-TGACCTAATTAAATTAAAAATTAACAATTTGTAATGTCTCCGACCAAAGT
-TTCATAATTGTATAGATCATCATGGTGGGAGGCGGGGTAGCACTTATGAG
-TGAACTTACCGGTTGACCGCCCGTCTATACATAGTAGCCAACACCCGACC
-ATTTTCTGCCAAATACCTATAATATCGCTTCGAGACCCAACTATTGCACA
-GTTGTGGTTTATTTCGGTTGAAGACCCAATATTAATTTACCTACAGCTGC
-TAAAGCGTTTTAAGACCTAAAAAATTAAGCAAGGCCCAAAAATCCAAACT
-TAATACTATAGTACTTCTCGTTTCGAGACCCAAAATCCAAAGCTAGGCCA
-TATTCTTGGTGAGACCCACCTGTAATAAATATCACTTGAGTGAAAGTGAA
-CTCTTACTTTTTTCTTTCGACAGCCAAAAAAAATTGAGTCAATTAGCAAA
-TAATTCACGTCTCCCCCTTTCAATGTTTACATACACATTACGAACGAGAA
-AAAAAAACGAGAGAAAAATTGAGTGAAATGGAATCAAAATGTGTTCATTT
-TTACTTTTTATGAAAATTTGGATAAGCACATGGCGTCAGAGTGTCCCATT
-TCGGCTTGATCTACGTAGATCTACAAAAAATGCGGGTGAAGAGACGCAGA
-GTTTTCAACTGATTTCGCTTTTTTTTGGGCGAAAATTTCCGCATTTCTTG
-TAGATCAAACCGCAACAGTGGATAAGCGCGCTCTATCGACAAACCCGGTG
-TGTACTACTCGCGGACAACCAGTATAGTTTTTTTTTTGAATTTTTGTTCG
-AAATTGAAATTGAAATAAGATGCCAAATTTAAATTTAAAAAATAACAATT
-TTTGAAATTAAATTTTTAAAAAAATTCCCCGTAAATCTACACTTAGTCGC
-GTAAATCGACAAGGCTATTTTTTTCAATTTTTGCCCATCGCACTTTTTTT
-GCCCAATCAATCATCGTCAATTGATCCATTGATCTTCTTCTTCTTCTCTT
-TCTCTTTTCTCACCACCGAAAATTTCATTTTATTTTTTGACACTGTCTGC
-GTCTCTCTGTACCCCCTATCTCTCGCCTCTCAAGGACTATTACAACGAAA
-AATTTGGGGAGAAGCCGTGATTTTCATTTTAATTTTGATGAAAAATTTTA
-ATGAAAATGAAAAAAAAAATTGTTTTTCAAAAAACAATCCCCTCGTAAAT
-CCACACCAAATTCAATATTCACCTTATTACAAATTGATTATTTTTCCCAA
-AAAACACACGACATCGGGCGCCCATCTATTGTTTTTTATTCCAAAAAATT
-TCTGCAACTGTCTGGGTCTCCGGTTAACACTGAGAAACAACAAATTTCAT
-TTTTCGATTCATTACATTCATTTTGAAGGTTTTTGGTTACAAATTCGACA
-CGGATTTCTGGCTTCCCTCATAAATTGAAATGGAAGAGTTTGCTGAACTA
-GGCCAACTTGGCTCGGCCATATTTGGCATAGATTTACGGCGCGTTGCGTG
-CCGCGTCGCGCCTCGATTTTAGTTGTAAAACTAAATGTGAAGTGTCCGTG
-TGGAGTACACGACTTTCCCACGCGTTGCCCGGTGAGAGATTATCAATGGA
-GCGCGAAAAATTCAATGAGGTAGGTCAGAACCCCTTGAAAATTGAGAAAA
-AAAAATCTCACAACGATACTCCGCAAAGTGTGCGTGTTGTTTATTAAATG
-ATAAATTCAAAAGCAAATAGCGATTTTGTTTCAAAAATATGCCGAAAAAA
-AAGAAAAAAAATTAAAACAAAAGTTCAGCCACCAATTTTATTTCTCGGCC
-ATGGTTGTGTCGTTGTTTATTTTTTTGCGATCGTATTTTTTCTATAATAA
-GACTTAAAATGAAAAAACATTAATAAAAATCAGTTTTCCATGGCCACTGT
-CAAAAGTCGCAACGACACTCCCCTTCCAGGCTCCTCCCCCCCGCGTGTAT
-TTTAGCATGTAGTGTAAATTACGCGATTTTGTGTATAAAACCCTAATTTT
-TTAGAAGATTTGAGAAAAAAAACTTTTAAAAAATGGGAAAAAATCCCCTT
-TCCCTTTTTTGAAATACTTTCCGACAAAGTTTAGCCAAAAGTCCAAAAAA
-AACCAATATGGCCTAGAAAAAATCAAAAACTCGGCCATCCAAAAAACTAG
-GCTACACGTTCTTTCGACCTCTGCTCCCCACACCTATGCTGCCCATATCA
-AATGTCTCCCGGACCCCTCATTCCGTCACACATTTCTCAAAAAAATGTCT
-CTTTTTCTCAAATTCTCTGTCGAAAATCCCATATCTCTTCAGTGTTCAGA
-ACTGACTGTTTTATTTCAATTCTCATGATCTCATGTCTCCCGTATGACTC
-ATTCCTTCGATATATTTTTCTTTTTTCAAAAATCATTTTTCCTATATATA
-GACTTTGTTCGGTGGGAATTTCTCATTTCAAAATATTTATTGAGGTCGCT
-TGTTCCCTTTTTATATGGTCGTGGCCTAGGTTTCTAAAACTCGGCTACCA
-TTTCCAAGTTGTAGCTTCGAGCTCTTTGTCTCGGAGTAGAAAAAATTCAC
-GAAATAAATAAAAGTTCACGTGGCCGTGGCCTAGATTTCCAAAACTCGGC
-CACCAATTTTTTTTCTCTTATCAGTAAACCACGTAGAACTCCTTTTTTTC
-TAGCCATTTTTTAACTGAATTTCCAACATATTCGGTGGCTCCATCAATTT
-TACTGATAGTAATTTCCAATAAAAAAAGGTATTTCTGTCGATAGGAACCC
-ATTTTCATCTACTTTTTGTTTCTACTTTATGGGTTTTGCCACTTTCCCGC
-ATGCCTACGTGCCTACCTATCTGCCGACCTAATATACCTCGTAGGCAGAC
-CTCGGCCGCCTTGTGGTGAGATGCCAGTCGCTTTGTAGGCAGGCGTAGTT
-TGTCTTGCTGGTATGAGTAGGCCTGTCAGCCGCCCAGTAGGCAAGCGTAG
-GCATGATGCAGGCGTAGCAGGCTTCTTAACTAGGCATCGGCTGCCTTGTA
-AGCCGGCGCAGGTAAGTGAAGGTTTCTTCGTGGCTGGCATCCTTGCAGTC
-AGGCACAAGTCGTCGGCTTGAAGGCAGGCAGATGCCGCCTAGTAGGCAGG
-CATATTTTACTTATAGGCAGGTATTAATGATCCTCTAGGCTTGCGTTGGT
-CGGTTTGTAAGCTGTCGTAGGCTGCCTTGTAGGCAAATTGAACTCTCAAA
-CCAAACAACACAAAAATTCCAATATTTTTTGTACCTTCTGATTTTGATCT
-CTGACTCATGATCTCTTTATCAATCTCATATCTTCCATTTTTAGAAATAA
-ACAATTTTTCCCTTCTATTCATTGACTTTAATCCCTTTCAATATTCATTC
-AATACACCTATAATACGAAAAACTCTTATCTTTTTTCATTTTATCACACA
-TGGTGCATAATATTATAGTTAGTGGCTATTGAAAAAGCACATCATTTTAT
-CACTTTTTGTCACTTTTCCACGATTCTCAACGTCTTTTTTTTAAACACAA
-AACGTTTCCCGTCATTTTCTACAGTACTCCCGCATTTTCATTTTCCAGGT
-GAGACCTGAGATGGAGGGCGACGAGTTGGTTCATCGTCCGACGGTCCTCT
-CGACGACGGCTTCTGCCACGTCACGGCCGCGACACAAGACTTTTGAGCTG
-TTGGGTCCGGTGAATAATATCTCGTTGGCTGATATGTATAAAGTGTGCGG
-GAAGATAATTGGCAGGTTCCCGATTGCATTTATTATTGCGACGGTGATCA
-TGTGCAGTGGTGGATGTTAGTTTTTTTTGACGTAAAAAATACAGTTTGAG
-AAAATCTTTTTTTAGATCAAAAAAGAAGAAAAATATGGAAAAAACAACAT
-TAAAATATTTTTTAGAAATCAAAAAATGTAAAAACTGTATGATTTTACTT
-AGGGCCTCCATGGTAGACAGGCACGGTTTTAGGGCCTGACGCCTGCCTGA
-AACCCACGTGGAGTCAGAAAGTCCCATTTCGCTTTGATCTTCAAAAAATG
-CGGGAGAAGAGACGCAGATATCTCATCTATTTCGCATGGTTAAGAGCGTG
-CTGACGTCACAATTTTTCTGGAAAAATAATCCCGCATTTTTCGTAGATCA
-AACCGCAATGAGACAGCCTGACACTATTAAGCCGCAAAGGCAAAAGTGTT
-TGCCGTCTGAATTTTGAAACAAAAGGTTTAACCGGTGAAAATTGAAAAAA
-AGTATAATAATAATAATAATAAAAGTAGAACTATTTTCAGTATACTAAGG
-CAAAATGATTGTTTTATAAAAAAACTTAATTTTAAAATTAGATCTCCTAA
-ATGTTTCAAGCAGCACAACTTTCATGTGATGTCAGGCTGTCTCATTACAG
-TTTGATCTACAGAAAACGCGGGAATTTTTCTCCCAGGAAAATGTGACGTC
-AGCACACAATGCATAATCAGATGAGATTTCAGCGCCTCAACTCCCGCATT
-TTTTGTAGATCAAACTAAAACAAGACTCTCTGACACCACGTGAATTTTCC
-AACCATCAAACTATCACAAAAAAATTGGCGCCAAAAAAACTTCTTTAAAA
-ACTTCTCATTTCCAGTAGGAACAATCGGTCTCGAACTGAAGGATAATGTG
-CGCGACGGGTACACGCCGAAAAACTCGCTATCCCGACTGGAAAATCGCCT
-TTATCGAGAGTTCCTGAGTTCCGAAGGTGATCCGGTGATGACTACAGTTC
-TCATGACTGCCAAAGACGGAGGATCCATGCATCGGATCAAGTATTTGGAA
-GAAGCACAGAGGGTGAGTGGCATAACATATCGGATACCGTATTTCCTCTA
-TTAGTAAGGCATGCAAAACTGATTTTCGGACACCTAATTTGATGCAAAAC
-TAATAGAGGGTGCAAAACTAATTTTCGAACAGGTTTTTTCTCATTAAGTT
-ATATTATAATATCATCAATTTCAATAACAACTTCTGAACCAAAATGGGCG
-AATTTTACGACTGATACGCAAAAATTGTCCGAGTTGTACTCATATTTTGC
-CAGTTTTGACTTGTTATACCAAGTCTGTAAGAGTTTTCCTAATTTTCAGA
-ACGATTTTATAATGCAAATTTTGAATTCCTAAACATAGGGAACAAATTAA
-GGGGTGCAAAACTATTAGAGGTGCAAAACTAATAGAGAGTGGAAAACTAA
-TTTTCGATTAGTGATTTTTGATGCAAAACTAATGGAGGTGCAAAACTAAT
-AGAGGTGCCTAACTAATAGAGGAAATACGGTATATTTTTTTGAATAAAAA
-ATTTCAGCAATGGCTCTACATCTCCAAAAACCTATCCGCAGACGTTGGAA
-ACGGCGAGTTCATGAAATTCGGAGATTTCTGTGGCCACTACTGCCAAGCC
-AACGACATCATAGGATACTTCCTGGACGCCTACAAAACCAAGTCAGCTGA
-CCCAAAAATGGATGGCTACCAACTCAATTACCCAATTACCACAGTAATGG
-GTTATCAGCTTCATCTCGAGCGTAACTTTTTCGGGGTTACTGTGAATCAG
-TCGGATCCGGTCACTAATATTCAGAGTATGAAGGTTCTGACGCTTCCTGT
-GTTGTCAGAGGTACGGACGTTTGAGGATACGGATAAGCTGAACAAGTGGG
-AGCTGGCGGTTTATAACTATGCTACAGGATACTCTGCACTCGAGGGTGAC
-GATCATTTGGTGGAGATTAATGTGAGTGAATAAATTGGACCATTTCAAAA
-ATATTGGGCCAGCCCTAAAAAGACAGCGGGCCGGCCCATATCGACCCACT
-TAACAGGCTCAAAAAAGTTTAGTTCAGTTGTGTGCCGCAAATTTTGAAAT
-TTGCCGAGCTCGGCAAAATCGGCAAATTTGGTAAATCGCATAATTTTCGA
-GCTCGGCAAATTCGACAAGGCTAAATGTTTGAATTTTGCCGTTTTCGGCA
-AACGGCAAATTTGGCAAATTTGCCTTACACCCCTGGTTTAGGGGTTTCGT
-GTTTAATTTTCAAAGCTTAGATAAACCTCTTTTCCAGGTGATCGGTGCTG
-AAGTCGTCGACACCGAAATGAACAAGGACGCTCAGAAAATGGTGCCCTAC
-TTCATCGTCGGAATCGTCTCGATGATCATCTTTATCTTCTGCACCGTATC
-CATCTCTGCCTCCTACTACGGATACTTCTCCTGGCGAATCGGACTCATCG
-CCCTCGCCTGCCTCTTGGTTCCGATTCTCGCAATTCTCACTGCATTCGGA
-ATCAATAATATGCTGGGAAATCGAACGAACTCTCCGATGATGATCATGCC
-GTTCTTGATCAATGGAATCGGAGTCAACGATGCGTTTTTGACACTTCAGA
-ATTGGTTGCAGCATAGCCCGGATCTTCCGTCAGGGAAGCGGTTGGGGTAT
-ATGTTGGCTGAAGCTGGTCCATCGATCACTACGACCACTTTGACAAATGT
-CATTGTTTTTTTGATCGGGTGGATGAACCCAACGGAAGGTAAGGTTCAGT
-GGTGGACGGCAAACTACTTTTTCCGGCAAATCGGTAAATCGGTAAATTGC
-CGGAATTGAAATTTCTGGCAAATCGGAAAACCGGCAATTTGTCGATTTGC
-CGAATTTGCCGGAAAAAAAATTGCCGAACGGCAACTGCGCCCTGGTAAGG
-TGCATAGCTTTGGCCTCTAACATAAAAAAATTTGTCTATTCATCCTTTAT
-TCCAAAACGACATGTATTCCAGAGATGTCAATCTTCTGCCTTGGATGTGC
-AATCTCCCTACTCCTCGCCTACGTCTACACCCTCACGTTCTTCTGTCCGG
-TGCTAGTTCTTCTGCTTAGCGAACGCGTCAATGAGCCCAGCAAGCTCGAG
-GGCACTTTCAACAAGGTTCTCGGATTCTACGCAAAAATCATATGCAGCCG
-ATGGACATTTGCACTTCTCATCATCGGAAGTCTTGTCTACTGGGGTTTCG
-GTATCTATGGAACACTGGGGATCCGTGCCGTGTTGAACACTGCAAAGATC
-CTTCCCCTGGAGACGCCGATCCGCAAACCGAACAGGATTATCGAGGAGAC
-CGTGTGGAAAGAGTTCTACCCAGTCACCGTGATTGTGAACAGCCCAGTTG
-ATATAAGCAATGCAAATGCACTTCGAGCATTTGACAACCTCGTTCACGAC
-TTTGAATCGATGGAAAAGTGCCGGGGATCCGAGTACACCATATCTCCAAT
-CAGAGACTATCAGACCTATTTTTACGGTGTAGGAGCCGAGGACTTTGATT
-ATGAGGAAGAAACCGTGAAGAACACCTCACATTCTTTAGATTTCAGTGTA
-AGTTAGCAGTCCACGCGTTCCTATTAAAATCTACATATATGCCTATAACG
-TGTTTATCCACAGAAGAGAAAAATCGCCATATCTGCCGCGCAAATGAATC
-CGCGGGAAGAGACAAAACTACTGTAGTTTTTAACCAATTTGTGTAGATTT
-ACGAGCTATTGCGTCATCGTTGTATTTAATTTTGAGCCGCAATTTTTAAT
-TTTCAGGCGTTTCACACGTTTTTATATTGAAATTTATCTATTTATTGAAT
-AAATCTTAAAAGAAAACACAAAAAAATTAGAAAAATTCCGAAAAACGCCT
-GAAAATTAAAAATTGCGGCTCAAAATTAAATTCAACGATGACGCAACAGC
-TCGTAAATCTACACAAATTGGTTAAAAACTACAGTAGTTTTGTCTCTTCC
-CGCGGTTTCATTTGCGCGGCAGATATGGCGATTTTTCTCATCTCTGGATA
-AACACGTAATACCTACATATTTTGTGTGCCTAAAAACATGCCTAGCAGTG
-AAAGTAGACAAATGTAAGCACACAAACGTGAGTAGGGCTTAAATGGTATG
-CAGGCACTGTTTTAGGGCCTGACGCCTGTCCAGGCCTGTCTTGTACGTTT
-CATCAATTCAAGCCGTATATTTCCAGAAGCTCACCGGATTCCTTGCCAAC
-CCTATCTACAAGCATCACAAGGGAGGACTAAAACTTAACTTTTCAAATCC
-GTTAGTTCCTATCTGCCACCTTACCCTAAATCGAGTACCATTTTCAGTGT
-TCCAATCCGAAAAGTGCAACTGATATTCGCTTATGAAAACGTAACCTCGT
-GGGATGAACGGATTCAGATTATGCAGGACTGGCGGACCATCGCAAGTTCC
-CACGTGGCCCTAAATGTTTCAGTGTGGAATGTGAACGCAATGTTCGTAGA
-TCAAATGCTGAGCCTGAAGGGATTGGCGATCTCGGTAAGATCTCAATGGT
-TCCAGCGCCCTATAAATACCGCTTATTCTTTCAGAATGCCCTAGTCACCT
-TGGGATGTATGGCTGCCGTCTGTGTAGTCTTCATCCGCAACCCCCTCTCA
-GTTGGCCTAGCGACCGCTTCGATTTTATCCATCTCCATTGGAGTAACTGG
-ATACCTGTGCTTCTGGGACTTGGATCTGGACCCTGTGACCCTGTGCGCAG
-TAATTGTTTCAATTGGAATGTCCGTTGACTTTGTTGCCCATGTGGCCTGT
-CACTATCAGGTCAGGTATAAAGAGTTCGAGGAGAAAGGAGTATTGAAGAG
-GATTGAGATGAAAACTCCCGAATCTCGAGTCGTCAACTCGCTGTCCAATG
-TGCTCTGGCCAATGGTCCAGTCGGCTTCTTCAACTCTTCTATGTGTACTT
-CCACTTGGTATTCTACAGGTACCTACCAATACCTATACTTTACCGATAAC
-CCTACCCCTCAAACATTCCAGAACTACCTCCCAATGGTTTTCGTGAAAAC
-CATCCTGCTCGTCGTGATCTGGGGAATGTTCCACGGTCTTGTGCTGCTCC
-CGTGCATTCTTGCACAGTTTCCCCTGTCTGTGTTCAACAAGACGTTCGCC
-GACTTGTTGTTCGGCAGAACATCCTCTTCGTCTTGCTCTTCGGAGTCCGA
-TTCGGAAACCGACACCGGTGATGCTCAGGAGATGGTTCCGCTCGCTGGAA
-CCGAGAAGGCTTAAGATCTGAAATTAGTTGTTGTTTGTTATTATGTACAG
-TTGGGATACAAAGTGTATTATGTAGTCTGTAGTGTCGCAGTGCTACAAAC
-TACAAATTCAAAGCTACAAACTATAAACTCATTGAGATCTGGCAGAGCTT
-TATAGTTTGTAGTTTTATGTAGCAGCTACAAACTACAAATTTCGATTGTT
-GTAGTTTGTAGTATGGCGCACAAACTACAATGTACATTTTGCAAGTTTTC
-TAGATTTTTTTCTCACTCACACACACACACACACACCGTTTTGCTACGTG
-GCTGCGAAAATGGAAAACTCGGCCACGTCGCAATTCACACATCGCCAGAA
-ACTTCTAGCTTTACCAGTAGCTTTTCATGATCTACTCTTCTTTTTTTTCC
-CCCCTCAATTTCTATTTGAAATTTCAGAATTCCCTCAATTAGTCTTCTGT
-CACCGTGTCCTCCTCTTTTCCGCAAGCGGGTCCCCTTTTCCCCCCACAGA
-TCGGCTTCTCAGGGTTCCTATAGCACTTTTTTCTTCGATTCTTGTCACAC
-AAAAAATTGTACTTCCATCGCTCGACGTGTCCATTTTTTCTTGTATTTTT
-TAAATGCATTTTTTGATAAATTTGATTTTTTTTATCATCCAGAAAATGGT
-CAAAAATTCAGATTTTCTTGCTGGGATTTTGCTGGAATTTTTTCAAGCAT
-CAGACATGCAAAAACTTATGCAAAACTACACAACACTATCGATGGGGACT
-GTTCGACTCTTCACCCCAGTCAAACTTTTTTTCACTATTTTTTTTAACTT
-CTGTTTTTTTGGTACTTTTCTGGCCGTTTTTATGGAATTTTTTAACCCGA
-CATTGGAGTTTACCTTTTTTTGTTCAGGATTTTAGGAATTTCTGCGACCT
-TCTCACTCATGTCCTCCAGCCCCGCCTAAGCCTATGCCTTAACTCAAGCC
-TAAGCCTAAGCCTAAGCCTAACCTAAATCGCGTCAGAGATAACGTTCGCC
-ACTGACGCCAAGCCTCAACCTAAGCCTAAGCCTAAGCCTAACACTAAGCC
-TAAGTATAAGCCTAAATCTAGGCCTCAGCCTAATACTAAGCCTAAGCCTA
-AGCCTAAACCCAAGCCATAAGAAGACACTCTAAAAATGTTCAGATTATTA
-AAAAATTACATTCAAAGTTTTCTTCAAAATTTTGCTTTCGACTTTCCAAG
-TAATCAATACCATGTAGAATTCCAAAATCTTCATACAAATCCCTCCCCTC
-TTCACATCTTTCCCGACAGCTTGTACTATTTCTCCTCCACCCACTAGGCC
-AGGTCAACGCTGCGTCTCTCGTGTTTCATATGCTATCTCCCTTTTGTGGA
-ATCCGTTCATCGTTTCGGATCGCTTACTTCTTCCGCGCGCGTCGCATTTC
-ACTTTGAAATAAACTTCAGTTTTCCTTTCCAAAATTTAATTGGTGGAAGC
-GTTTGAACATGCGAAATTTGTTAATTATCGTGTGTATTCATTTAATATTA
-CTACTTGTACATTTTACCGATGCATGTAAGTTTTGGATGTATCAAAAAAT
-TAAATAAATTTCTTAAAGGTGGAGTAGCGCTAGTGGGGAAATTGCTTTAA
-AACATGCCTATAGTACCACAATGACCGAATATCATGATAAAAAAATTCAA
-AAAATTTTTTAAAATTTTATATGATTTTTTGAAAATTGGAAAAATCTCAG
-TTTTTGCCTAATTCCAATTTGAATTACCGCTAATTGGATTTGTTCGATGG
-AGCGCGCTTGCACGTTTTTAAATTTATTTATTTTATTTTTTGTTATTTTC
-CACCGATTTTTAATGTTTTCGGTGTATTTTTGCTCTAATTTTAGAGAAAA
-AGTCAAGATGAATGCAGATTTTCGATTAAAAAGCACGCTCACAGGCGTAA
-AAATGACAAAGTAACGATTTTAAACGGTTTCGAACCTGAATTAATTAATT
-TCACTGATTTACGACTGTAAGCGTGCTTTTTAATCGAAAATTTGCATTCA
-TCTTGACTTTTTCTCTAAAATTCGAGCAAAAATACACCGAAAACATTAAA
-AATTGGTGGAAAATAACAAAAAATAAAATAAATAAATTTAAAAACGTGCA
-AGCGCGCTCCATCGAACAAATCCAATTAGCGGTAATTCAAATTGGAATTA
-GGCAAAAACTGAGATTTTTCCATTTTTCAAAAAATCATATAAAATTTAGA
-ATTTTTTAAAGAATTTTTTTATCATGATATTCGGTCATTGTGGTACTATA
-GGCATGTTTTAAAGCAATTTCCCCACTGGCGCTACTCCTCCTTTAAAGTT
-TGAAGTTTTAGTAAAAAAAGAGTGTCGGTTTTTTAGTTAATAATATTAAT
-TTCCAGTCGCCGGAACAGTTCGACCATTTTTCACCACTCTTCCAGTACCT
-GGAAGAAATGTTCCTATTATGAGATTATTCGAGAACTATGCTGCATCGTG
-CCGACCAAAAAGTAAAAAGGACTTCAATGTTGATCAGCTGGCAAATGTAG
-GTTTTTTCCCGCAAAAAGTCGTATTTCGTGCAAAACCGGCAAAAGCAAAA
-ATTTTGAATACCGGCAATTGTCGGAGTTGCCGATTGCCGGAAATCAAAAT
-TGCGGGAAATAAAATTTTGATACTTTTTTGTAGATTTAGGAGCCTAAAAA
-TGCATTTTAATGAACAATTTTTAATTTTCAAGCTCAAAATGATTTAATCC
-TTTAAGGATTGACCGTTTTCTTTAAAAAAGACTAACCGAATACTATAAAA
-AAAGGTGAAATTTTTTCAATTTCCAAAATATAATTAATTTTGGCAACTGC
-CGATTGCCGGAAATTGCCGATTGCCGGAACTTCACAATACCGGCAATTGC
-CGAAATTGCCGATTGCCGGAAATTTCCAAAACCGGTAATTGCCGGAATTG
-CCGATCGCCGGAAATTCCCGATTGCCGCGCACCCTTGTATTAAAGGATAC
-GGCAAACGATTTTTTCCGGCAAGCGGCAATATCGGCAATTGCCGAAATAA
-AATATTTTCGGCAAACGGCAAACGGCAGTCAGCAACATGCCACTTCTCCA
-ATTTTCGGCAATTTCGGCAAACGGTCAATTTGCCAGAAATCATCGGAAAA
-TTGTGATCTTGCACATTTTTTCTGGAAATTTCAGAATTTCAATTTTAAAC
-AACAACATTGTACACATCCTATGAATGACACATATCTTAAAAAGCCAGTA
-AATTCTATAAAAAATATCTAGAGAAACTGGCAAAATAATTAAAAAAGGCA
-CGGATTCATGTGATTTTGATTATTGAAAATATCTTTGAAAACTTTCGGAA
-AATTGATATCCGGCAAATCGGCAAATCGGCAACTTGCCGATTTCCCGAAT
-TTGCCGAGCAATGAACTACACTGTTCCAAATCGAATTCGTAACCGATATT
-ATACTTAGGAATGATATTTGTAACTCGTATAAATATTAAATAATATATAT
-ATATTCCAGCTTCTCCAATCTCTCCAAATGGATGAAGTAGCCACAAAAGC
-CTACAACTCCCTATTCTTCTCAATGGCTGATATGCAAATCGAAAAGTTCA
-TGGGTAAATGGTACACAGTTGTTGATTCGAAAGAAGTTCATAAAGAGGAT
-TGTTCAATTTTCTATTGTAAGTTTATTTTCATTCTGAAAATGAGATGCAA
-ATTTTCAGTCGATATGGTACTTCAAACTCCATACACCGCAACATTCACCT
-CAAAGCAGTACGGAGTGATTAATAATGATGTCGTCACCAATGAGGGGTAC
-GGTAGTATGGTTGGTCCAGAGCCCGGAGCCGTTCTTATTACAACTGGTAG
-TGAAAGGGATCAGTGTCCATGTAAGTATTTTAAATAACTTTGGTCCGGTG
-ATATTAAGATACAAGTTTAAATACTTCCCGTTTCAAAAACTTCGAATTTC
-CCGCCAAAACTTTTCTCTGAAAATTTTAATTTCTTTCCAAATTTTTTTCT
-TTGAAAATTTGAACTTCCCGCCAAAATTTTGTAGTCAAAAAATTTGAATT
-TCTCTCCAAGAATGTTTTCTCAGAAAATTTGAATTTCCCGCCAAATTGTT
-AATGTCAGAAATTTTGAATTTCTCGCCAAAATTTATTTTCTGAAAATTTG
-GATTTCCCGCCAAAATTTTTTTCTCAATAAATTTAAATTTCCCGCCAAAA
-TTTTTCTCTGAAAATTTTAATTTCTTTCCAAATTTTTTTCTTTGAAAATT
-TGAATTTCCCGCTAAAATTTTATTGTCAAAAAATTTGAATTTCTCTCCAA
-GACTGTTTTCTCAGAAAATTTGAATTTCCCGCCAAATTGTTAATGTCAGA
-AAATTTTAATTTCTCGCCAAAATTTATTTTCTGAAAATTTGGATTTCCCG
-CCAAAATTTTTTTCTCAATAAATTTAAATTTCCCGCCAAAATTTTGTTAT
-CAAAAAATTTGGATTTCTCGCCAAAATTTTATTGTCAGAAAACTTGAATT
-TCTCGCCAAAGTTTTTTCTCAAAAAATTTGAATTTCCTGTCAAAACTTTG
-TAATCAAAAAATTTGAATTTCCCGCCAATTTTTTTTCTCCGAAAATTTAA
-ATTTCCCGCCAAAACTTTGTTATCAAAAATTTGAATTTCTCGCCGAAATT
-TTATTGTCAGAAAATTTGAATTTCCCGAAATCTCTATGAATAAAACATTT
-GCAGTTTTCCCTGTACGAATCGGTGGCTTGAGTGACGAAGGAGAATATCA
-ATACATGATCTTAAGTACACCACTGAAGTATCCAACGATGGTCTTGACAA
-GGTAAGTTTGCCTTAAAATTTGTTTTCTAATTATTCCAATCTAATATTCA
-TGTGATGTTGAAAAATGCAAACATGTATTTTAATACATTTTCCCCCTATT
-GATGCGTACCGAAAAATGTAGAAAAATGGAATCATTTTTTTGCATTTTTC
-GACATTTTCGACATTTTTGACATTTTCCGACATTTTTCGACGTTATTCGA
-CATTTTCACGCATTTTTCAGAGTTTGCCGAACTAGGCCATTTTGGCTCGG
-CCATATCTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTTGA
-TTTTAGTTGTAAAACTAAATGTATTTGTCCGTGTGGAGTACACGACTTTC
-CCAGGCAATTGTCAATGGAGCGCGAAAAATTCAATGAGGAAGGACAGAAC
-CCCGTGTCCACAGGAAGAATTTTCTCTGCGTCTCTTGTCTTTAGCATTTA
-AAGTGGGGCGACGCCGATGTAGAAAAATGCTGAAAAATTTCGAAAAATGT
-CGAAAAATGCACAAAATGATGGCATTTTTCTACATTTTTCTGCATTTTTC
-GGCACGCAAAAAACATCACATGAATAACCCCATAAAAACTCCAATTTTTC
-CAGAGACCTAACCCTATTCGAAACGAAATGGAAGCGAGAAGTGTATGATT
-TTGTTGAGAAGAATGGTTTCATGAGTCCAATGGCAGCATTGAACACTCGT
-CTCCATTTCACAGATGTCGATGTTTGCAGAAAAGTGAATAAGTTATATGA
-GAATGGAAATGTTTGAGTTGAAGATTATCTTTTTTCTGATGATACGGCAG
-AGTTTTTGACGGGTTGTGCAGTGTTTATTTTTAACCTTCATGTGTATTTA
-AAAATAAAGATTAATTTAATTGAATCTGTGTTTAATATGAACTTTTAAAA
-CACAAAATTTCAGATTTTGGTTTAAAAACTGTAGACACTTGATACTTTGT
-TGAGTGTACCTAATTTGAATTTCGCGAAAAAATGACTGTCATATGATTCT
-TGACCGTGTACACCTCTCGGGCAATACATTAATATTTTAATATTATGGAT
-TATAAGCATTTTCAGTAGACTTTCCATATTTTCTCATGATTATTACTCAT
-TTTTATGACGAAAAGCATTGTTTGGAACTCAAAATTATCAACTTTAAATG
-TTAAAAAATATTCAGGAAAACATAATATTTGCCTATTAAAAAATTTCCCA
-TTAATTTTCCACAAAAAAGTTTCTTTTTTCTTTTTTTAATTTTTTCTCAG
-AAAAATCAAATCTCCCAACAAAGTTTTTCTCAGAAATTTTGAATCCACCG
-CCAAAAATTTTTCTCAAAAAATTTGAATTTCCCACCAAAAAAATTTTTCT
-CACAACTTGAAAATTTGAATTTCCCACCAAAAATGTTGTCTCAAAAATAG
-TAAGTTTCCCGCCAAAACTTTTTTTAAAAGAAAATTTGAATTTACCGCCA
-AAAATTACTTACCAGAAAATTTCAATTTCCCGCCAAAAATGTTTTCTCAG
-AAATTTTTAATTTTTGGTCAAAATTAAAATACTACTACGGTACCTTAATC
-CTACACCTCCACCCAAAAAATCATTTTTCAAAAACTACTACAGTACTACT
-CCTACAGTACTCCTACCGTACTCCTAAAGTACTCCTACCGTACTCCTACA
-GTACTCCGACCGTACTCCTACAGTATCACTACAGTACTCAAACCATATCC
-ACCACTAACACCAATCCAATATCCCTTCAAACGACAATAACTTTTTTATT
-CAAAAATACAGTAATCTTACTGTAGACAATCTTTTAAATTATAGTCTTCA
-TCCAAAACTATAACGGACTCCATCCCATAAAAAGTAAACGACAAGTCATA
-AAAATTGGAATTCGCGTAGTTTGCTCTTCCGTGAAGGCAAACACACGTGC
-TCAGCTATATTGATAAGAGATGAAAAACGAGAGGAATCAGTCGAGGTGTC
-TGATCTACTTCCAGGATGGTGACCGCTCTTCTACTCCTATTGGCTCTTGC
-AGCCACCTCTTTGGCGGCTCTTCCAGATTTGGGATATCCCGGATGGCAGT
-GCGATGCATCGCTTTATCAGAAGTAGGTGGCTTACTTTAATTACTAAAGT
-TTGAAATTTTCCTCGCTTTCAGGAGCAAAAATACCCCGACTTCTGCCCAC
-TCCGTCCGATTCACCGACATAAAAGTTTTGGGAGCTCTCGGAGACTCCTT
-GACCGCCGCCAATGGAGCCGGAGCACCAAAGGGAGACCCTCTGGCTGTGA
-TCCTTCAGTACAGAGGACTAGCCTTCCAGTGTGGAGGTGACCACTCTCTC
-GACGAGCATGTCACTGTTGCAAGTAAGCCATTTTTCTGGGGAATTGAGAA
-AACTGAGTTGTTGTAGATGTGCTGAAAAAGTTCAGCCCTAACCTAATGGG
-ATACTCCACTGGAATCGGAAGTGCCAACGTTTGGGAGGTCTCAAAACTGA
-ACCAAGCAGTTCCAGGAGCTGAAGCAATCGATATCATCACTCAGGCCAGA
-GCTCTGGTGCAAATTATCCAAAGCCACAAGGAGGTAGCCAAGTCCAAACT
-AAACATCAATTCCGATGCATTTCCAGATTGATTACAAAACTGATTGGAAG
-CTTATCAACGTATTCATTGGAGCAAACGACATGTGCGCCTATTGCAACGA
-CCGAGAAAATGTAAGATAGTCAAAGATCATTCCACACCCGTTTTATTGCA
-TTTTTATAGGGCCCACACTCAAAAGCAATCTGGAAGCAAAATGTGATCAC
-TGCCATTCAAATTTTAAAGGATAACTTACCAAGGTAGGTAAACTATAGGG
-ACATGACATTCTAAAGTAAATAACTATAATATTATGAAATTGTCACATAC
-CTATACCTACCTATAAATACCTACATGGTCCAGAGCTGTGTGGCAAATTT
-TGAAACCAGCAAATTCGGCAAATTTTCCGGGGTCGTCATACTTGGTAAAT
-CGCAACATTTTTTGGAGCTCAAAAAGTGCCAAAATTAACAGAAAATCTAA
-GTTGTTAAACATTTGTGGCAAATTCCAAATTTGTCCAAATTTTTGAAATT
-TGCCTTGCTCGGGCAAATTCGGCAAATTTGCCGTGGTTGTCGGACTCGGT
-AAAGCGCATCATTTTTTGGTGCTCAAAAAGTACCGAGTTGATGGAAAAAC
-TAAGTTGTTAAACATTTGTGGCAAATTACAAATTATGTCCAAATTTTTGA
-AATTTGCCTTGCTCGGAAACCGGCAAATTCGGGAAATTTGGCACACCCTT
-GATCCCATAGCAGTGGCGCAAAAAAATCTTTAAAATTGTGGCCGTTTCCG
-TGCCAATTATAAATTAAAGTTAAACATATTATCGAAAAAATACGATCGCA
-AATTTTTCTCGTAACTTATTTTTGATCTACCTTGTTGACTAGGCTCCTCC
-CCTTCCTTCGACAAGACAGCCACAACAAAATAACAACGGCAACAAGATTA
-TGGGCAAACACGTGGTGCCAGGCTGTCCCATTACAGTTTGATCTACAATA
-AATGCGGGAATTTTTCGCCCAAAAAAAAAGTGACGTCGGCACGTTCTTAA
-CCATACAAAATCAGTTGAGAACTCTGCGTCTCTTCTCCCGCATTTTTTGT
-AGATCAACGTAATTCAAGCCAAAATGAGACACTCTGACACCACGTGGGCA
-GAGTCAACTTCCAAAGGTAGATCAAAAATTAATTATGAAAAAAATTTGCG
-ATCGTATTTTTCGATAATAAGAGCCAACATTTTTCGGCTTTTTATGGAAA
-TTTTTTTTTCAAAAAGAGGAGTATGGTCCATAACTATGCCATCAATACCA
-AGTCCTTCCAGAACCATCGTATCCATGACCGGAATGTTCGACATGGCCAT
-GCTTCGCCAAATCGACCACGACAAGTATTTCTGCGACGGCCTCCATGTGT
-TCGAGTGCCCATGCGAGAAGAACAAGGACTTCCCGAATACCGACATCTCG
-GCTGCCTGCCATCTTTACATGGATGCTCAGCAGGAGATTCAAGACTCGGG
-AATCTTCGACTCAACAGATGACTTTACATTTGTCGTTCAACCATTCTTCA
-ATGGAATCACAGTTCCACCACTCAAGCCCGACGGAGAAGTCAATCTGGAT
-TGGTTTGCACCGGATTGCTTCCATTTCTCAAAACTAGGCCACGCCAATGT
-TGCCAAGCACTTGTGGAACAATATCGTTCAACCAGTCGGATCCAAGAACC
-ATCAAGTCAATCTGTCAGATCCTACCATTCCACTAAACTGCCCAGACACC
-AAGTGCCCATTCTTCAGAACAACTAAGAACAGTGTTGACTGCTCGAAATA
-TATGACTGCCTAGACTGTAGGAAATTGTGTTTGTGTGTGTAATTTGACGT
-ACTTATCGGGTCTGCAATAAAATGTTTTATCGTGTAATCTTTAATTTTTA
-ACGTGTGAGACATAAAAGAAAGAGCACCCTCAATAAAAATATCCACGTGG
-AGTACACAATATAGCTATCAATAGAGCGAGTAAATATTTTTGCAATAATT
-ATTTATTAGAAGAATGGAGATCAAGGTAAAGGAAGAGATCTTGATTTTGA
-AAAAAAGATACTGGAAATACTAATTGTTCACGGGATTTCATAGAAGGGGA
-TATATCACGACTTTTTCTTTGAAAAATAAAAACAACATAAAATTATTGCG
-GCTTCACAATCTGATCATCCGGTATTTCTCCAGATCTTTCCTTTTCCGAT
-TCGATCTTCTTCCACTTGGTACGCCGGTTTTGGAACCAGATTTTCACCTG
-GAATTTGAGAAATTTCAGCTATGCGTTGAGTGCCGCGTTACGTGCTGCGT
-TGCGTGCTGCGTTGCGTGCCGCGTTGCGTGCCGCGTTGCGTGCTGCGTTG
-CGGGCTGCGTTGCGTGCCGCGTTGCGTGCCGCGCTGCGTGCCTACCTGCG
-TCTCCGTGACATCCAATCGTTTTGCAAGCTCACTTCTGTCACTACTTGAC
-AAATACTTTTTCGCCTCAAACTGCTTCTCCAGTTCGAATACTTGTTTCCC
-GGAAAATGTCGTCCGCGCCTTCTTTCTCTTTGTTTTTTGACATTTTTCTA
-TAGGAGACTCTTTGGCTTGGTCGAGGCTGGATTCTGAAAAAATATTCTTA
-ACGGCTGATTATTTTTCTACGTGTAGCATTTTTCCGAAATTCATTGAACA
-AAATTAGTAAATTTCCAAAAAATTTTTTTTCCAAAATTTCGAAAACATTT
-TAATTTTTTTCAGATTTTCTAATATTTTAAAACAAAAATTGAGAGTAAAG
-GAAATAAAAATTGTGTCTTGTAATTTTTGTAATTTTTACTCAAAAAAAGG
-CCAGTGAAATACTATTACAGAAAATACGAATCGATGCACCATGTCAAAAA
-GAATAGTATTTCACCTCAAATGCACCATGCCCAAAACTAGTCTATTTTTC
-AACTACAAAACTTCATACACCTAATCCAAAGAAATCAACTTACTGCATCT
-TCCAAATTCATCAATTTCTCCATTAACAGTTGGTAAGTCAAGTATATCCT
-TTATCAGGTGACTAGTTCTTCTCTGAGGCTTCACATCAGACGTCAACAGT
-GCAAAATAGGGTTGAAGTAGTTGGAAGAGCAAGTCAGTTTCCATTTTGCA
-CGAATGAAAAGAACTTCTGAGAGACTTCTCTATACAGTAGGTCTCGAGGT
-CCCCGCCTTCTCTTCAATCAAATAATTGAAATTCTGGACTCTCGGGGGAC
-TTTTGACGGTTGACGACGACGACAATTTGCCAAAGTGGTCGACAATGATT
-GCGCAATTGGTGTGGAAAGAAGAAGAAGATGGGTGAGTTCTGAGATGATG
-ACAAAAAGAGCATGAGCCAGCAAATTGAATAAGAGACCGGATTTCGAGAA
-GGAGGAGGGGGAGAGGAGGATTGGTGGTAAGGGATGATACTTGATGCAAT
-TGAGGGAATGAGTTTCTCATACTTGACTATTAAATACTTTTCTTGAACTT
-AAATATTTGAATTGAAATTTTGGAGTAGCGGAGGCACATGTGATATTATT
-GTGCTAATTTGTAATACTTGGACTTTCAAATATAACCTCAATTATTTGAA
-AAAAACCTTTTGAATAGACCAGCAAGGTTGATCTACAATTTTTCATGGAA
-ATCGAATTAATTTTGTAAGGATGTCTACTGAGTATAAGCTTATTGTTAGG
-CTTAGGCTTAGGTCTAGACTTAAGGCTACACTTAAATTTAGGCCTAGGCT
-TAGGCTTAGGCTTAGGCTTAGGCTGAGGCTTAGGCTGAGGCTTAGGCTTA
-TGCTCAGACTTAGGCTTAGGCTTACGCTTAGGCTTAGGCTTAGGCTTAGG
-TGTTGGCTTCAGAATAAGCTCAGGCGGGGGTGAGGGAAGGGTAGAAAAAA
-AAGAAAGAGAAATTTCCAGAAATTCACAAAATCCAGAAAAAAACATATCT
-TTCACAAGTTTATATTTTTATAGCCTAAAAAATTACTTTTAAAATGAGGA
-TATGCAACCCGCACGCAAAAAAACCTTTTTTTTTTTGAGCAATTTCACGG
-CTCTTTTTTTTTTAATTTAAAAATACAATAAAAAAACCAAAAAAATTTTC
-CGAGCCCAAATTGCTCCCAAATGCTCTAAATTTCTTTTGAAGTTTGATAT
-ATTCCTATTAGAACTTGAGGAAAATGTAAAACTAGAGAAACATAATACTA
-CGCATGTTAAATGTAAATTACTTACTTTTAAAAAGTCGTACGTTATTTTG
-GAAAGTTTGAGGTTTTTGCATTTTTTCCGTAATATCACTGAACACTTTTA
-TTTAAATATCATCAATTATCGGAAGTTTATAGGTTGCAGGAGAAAAAATA
-TATTCTAGCGGGAAAATGAAATGAGACGGGGGGACATTTTTAACCAAAAA
-AAAATCAGAAAACAGTTGGTAATAAAATTATTCCAAGAAAGTATAAATTC
-ATGACTTCCATCTTGGGAACATTCTTAAAAAATGTCAACGAATAAATCTT
-TGTGGCAAACAAACTTTTTCCATAAATGTTTCAGACCTTATATAGCGGAC
-ATGAAAGTTGATTGCTTATTTGATATGTCTTGAGTTTATTTTTTTTTATT
-TCAAGCGAGGGGAGATTTATTTGCCTAGATATATATATAATTATTACTGG
-AACGAACTGGAAAAAAACTTGGGATCAAAAAAATCAAAAATTCAAATTCA
-AAAATTCAATTTTTCGAAACTTTTTCTACAGCTTTGTCGAGAAGCAACAG
-ACAAATACTTATAGCTAAAATTTTATTAATATTCTAGTTTTAGTCATGGT
-GAATCGAGAATTTGTCAATTTCCATGTGGTATCTTAAAAATAAACCGATA
-CACGTGGTGTCAGGCTGTCTCATTGCGGTTTGATCTACGAAAAATGCGGG
-AATATTTTTCCAGAAAAATTGTGACGTCAGCACGCAAAAATTAATAAGGG
-TCTAACCAAAAAAACTTGAATCTTGGAAATATTTTTAATTCACCCTAAAT
-TTTCCCCTGATTCCGAATATCTATGTGAAAAAATTCAAAAAAAATTTCCT
-GAATTTATATTTAAGCTTGAAATCTTTCATAAAAATTTTTTTTTTTTAAA
-TTTCATTTGTACTCGCATCACTTTTTTCAAACTCGCGCCCAAATAAATTA
-GCGCGCGCGTGCATCGTTTGACTTTTTTTCGTTTAGTTTTTTTTATTTTA
-GCCGAATTCAATTTTTTTAAAACCAGTTTCATTCATTTTTGTCGGTTTTT
-TTTTTCTGAAAAAAATGTAAAAAAACGAAAAAAAATCAAACAATGCAAGC
-GCGCTCCAATGCTAATTTATTTGAGCGCGTATTTAAAAAAGAGACCGGGA
-TACAAATGAAATTCGGCGATTTCAAGCTTAAATATAAAATCTGGCAAACT
-TGTTTTGAATTTTGAATTTTTTCACATAGATACTCGGAATCAGGGGAAAA
-TTAGGATTCATTCAAAAATATTTCCCAGATTTCGGTACCCCACCTTAAAA
-ATTTTTTTTTGGGAAAACAAGGAAAATTTCTAGCTTGAACTTATTTTATC
-AATACCTAAAATGCTGAACATTAAAACACACACACCCGTATGAGTATTAT
-ATACTTCCAAGGAAACATTTGAAAAATAAAGAGTTCTCCGCTTTGATTAT
-ACACTTGTGATATTCTCACGCCTGGCACTTGGCACCAGCTCAAAGTGCTC
-ATTTTGGCTATAATTGTTTGAAGGTATATGAAAAAGTGGAAATTGGGAGG
-AAAAATGGCATGTTTTGGCTTTCTCTACCTGGCCTATGTGTTAGAAAACT
-CTTCTATGAAAATTCAGTTTAATTTTTTAATTTTTCTTAATTTTTAAAAT
-TCTAAAAATGGCTAAACTTTCAAAAATATAATTTTTAAAAAGCCAAATAC
-TATAAAATTTCTTTGTTAATTTCTTTATAACCAAAATTAACGATTTTCAA
-AAGTCAAATTTTTCAAAATTACAAAAAATTTAAAATTACTGTAAGATGCG
-CAAAAATTACAGAGTTTTCAAAATATAAAACACTCTTGTGGCCGAAAACT
-TCCAAAGTTCAGGAAATAAAAATTCCAAAAAAAAATCAAGAAAAAAATGT
-ATCTCGAAAAATTACCGCTATTAGAAAATCGCCTTCTCTAAAATTTCCCA
-AATTTTGAAATTATGGAAATTCCCAGATTTTTCAAAAGCGATCTAGTCGG
-AGTTGTCAGAAAAAAAGTTCAAGAAAACTTTCTCTAGAAACTCAAAAGTT
-GGCCTGATCAGAACTTGTTGGATTTTTTCAATTTCCCAAAAAATTTTCAA
-AGTTGCCGAAAATTACCGAAACTCCAGGGCTCACTTTTAGACCTTAAAAT
-GAAACTTTTGCCATTTGAAAGAGGCTCTTTGAAAAAGGTCTCTGCAAAAA
-ATTTAGCGGCAGACGAGCACTTTGAACTAGAAAAATGTCGCTTTGAAATT
-GCTATCATTGAAATTTTTCACTACTATAGAGGCCGGTAAAATTGCTCCAA
-ATCATAATTTAAAATATTTTTTCATGATTTTTTTTTATTTTTTCATGATT
-TTCGAGGTAGGCAAATATTCTGGGAGCTTTTTTGGATATATTTATTTTTT
-TGGAAAAAAAAATCTGAAAAATCCCACATTTCCAATAAAAAAATTCCAAA
-AAGCTTTCAGAATACTTGTCTACCTCGAAATATCCTAAAATTCATAACAA
-TTTCAAAAAAAATATAATTTGGAGCAAATTAACGGGCTATTTCAAAGTCT
-AAAAGTGAGCTATAATGCATACATTCCAGAAAATGGAATAAAAAATAAAC
-TGAAGTCAATTTAATCTAATCTCATGATACCTCCTCCTCCTTCCCCCAAC
-AAATAATGCTCAATAGCCCCCAATCAACTCGTTCCAATTTGAATAGTGTA
-TTATTTAACAAGCTTCATCATCTCTTCCTCCTATTTTTTTTTGTCATTTT
-TATCGTCCCCTCGGCCGTTTGTATTATCCTCTCTTCCTTCTTCTTCTTCT
-TCTTGAAAACGAATTGAATTTCTTCATCCAATTCACTCAAATCACATCCT
-CCACGGACACATTCAATTAATCCAAACGTCCTTTTCAATTGAACACAACA
-ACAATCACTATTTCATAAAAATTGTTTTAAATGTACATATATCAAAAATT
-GCGACGGCTGGAAAAATTAAATTTTTACACCAGAAGAAAATTTGTAACCA
-TAGTTATGGTAGCTATAACTCAAAAAAGTAGGAAAATTATGTGACATGTT
-CTCAGGACTGCAGTGATCGCAATAAAAATAAATTCTGCTGATCCAATACT
-CTTGAAATAATAAATCGTTTCTGATTGATTCCATCATTCTCAGACAAATG
-GAGCTTGGTTGAGTGCTCAATTGGTCAATGTCGCTGTCATGGCACCAGGG
-TTGTGCGGCATCCGGATTTTCTGGCAATCGGAAATTGCCTTTTGCCGAAC
-TCTAATTTTTTTTCGGCGATCGGCATTTGACGGTTGCCGAAAAACTCGTT
-TTTTCGTTTTTTCGCCATTTTTCGGCATTTTTCGGCGTGCTTAAACTCTT
-TGAGGTTTTTTTTTTATTTTTTCTTGTATTTTATAAATCTAAATAATTCA
-ATTCCAAAGTTTGATAAGGAGTGTCTTGGTTTAAATTTTCTAGCACAGAT
-CAATTTCATTTATTAACGATCAGACTGGTAGGATAGTCAACGACCCCAGA
-GGCAAGAATGATTCAAAATAATTGCACACATGGACAGCAATAGACAAAAT
-CTTTGAGAGTTTTATGGTGGGGTGGCGATGTGTCGACCAAAAGAGTATAT
-CCACTATATGGCTAATAATTCAAATATGTTGTATTTTGGAAAGTGTTAGA
-ACACAAGTGACTTGAGTGTTTTCGGATACAAGAGACACAGAGATGTCCCT
-TGATTGTTCACAGAAAGCGATTTTTAAGGGTTTGACTACAATATTTGCGG
-ATTTATGTTTCAACGAATAAATGTAAAAAACTCGAATATCATTTACTATA
-TATAAAGCGCTTATTCCGTTTTTCCATAGTTTGTAGTCTATGTAGTCTTT
-GTAGTTTGCGTAGTTTTAGCTTCTGGAGGGATAGTGAGTTGGGGTTAGTG
-TAGGGATATAGTCGGCGTACTGTAGTGGTACAATGGTGGTACGGTAGGAG
-TACTGTATGATTACGGTAGTCTCAGAAAAATTGGTTTTCAGCTCCAGAAG
-TCGGGGACCGCGCCGGAGGTGCGGTCCACGGCTGGTATATACATATGTAT
-ATGTATGTATATATGTATACATATATTCAATTAAATTTAATTTAAAAAAT
-AAAAAAAACATTTCTCACAAATGCCGAAAACACCGAAAAATGGCGAACAT
-TTTTAGGCATTCGCCGATATTTTGACCAACTATTTTTTTTTGGCGAACGG
-CATTCGCCGTTTGCCGCACAGTCCTGCATGGCACCCCGACCGGTTTCGTG
-ACAATAGTTTTGACCTGAACGCACTAGGAGTCAGGAAGTTATAGGGGTCA
-TGGGTGCTTTAATGACCCCCTGTAAAAAGCACATATATTGACAACAAAAT
-TTGCTCGCTGTTTTTTGTATTAATTTTTTGTCTCCCCTCGATGCGCATTT
-CTAGTAATGATGCACATATTTATTTTTTTTCATGTACATATCTAACAAAA
-TCATAAAACTGAAAATTGCGCTTTTGTTCAAGTTAGCAAGACAACCATTA
-TAAAGCTTTCCAAATAGCAAATTAGCAAAATAAAGTGAGAAGCTAGAAGA
-TAATGGGGAGTCCCTATAATCTTTCGGGCACACCTTCAGACTTTGTGACT
-ATAATAGCCCAAACCCACAGTTTACTGAAAACTAGGGCTTCATTTGCTAT
-ATGGTACCCCTAAACTCTTTCAGTAATCGAATCCCAAGAAACCTTCACAT
-CTGTAACCTGGACAAAAAACACACAATTTCAAAAATATAGAATTCTTTAT
-TCAAGAATCATCATCATCATTTTTTTCAATTTGTACAGACAAATGCCGAC
-CATATTTTTTGTCAGGGGAATGGCAACGGCGGGAACCCAAGAAAATCAAA
-CAAAAATATGGAGAGAAAAATGAGCCAGAGAGCCTGAGCAACCATGCATA
-AATAATGAGGAGTTGGTGAGATGAAGAAAAAACAGATAAGTTACGACGCG
-AGGAACTATTTGAAAAATAAACTGCTAAATACTATGTGCTTAATCCTCCC
-AGGTAAGCGAGTGACGGTTCTCGTATCTCAGCTGGCAGTTTCTCTTTCCG
-TACCAGTTGACGTAGGCGAACTCGGCGTCGGAGACGATGGCGTTGAAGCG
-TCCTCCGAACTTGGCCGAGGCGTCTCCCTCGATCTTTCTGGCGGCCTCGA
-GGTTGTCCTGGAAGGTATCAGTGATTGGATTTGATTTATAGTTCTTCTTT
-TTTTTCTTTAATTTCTTGCTTGTAATTCTAAAGCAACTAGAAAAAAAAGT
-TTCGGAACGCATCTATCATGCCAATTTACATAACCGGTATGGGTTTGCGC
-GCGCGGGGGGCTTGCAACATTTTCTTAAATGACATTAAGGTATGAGAGGG
-GGGGGGGGTGTTGTAAATAGGTATCCAGTTCTTGTCTGTCCCCGTTATCA
-AGTTTCTCTGGTGACGCAACGCAAGAAGGCAGAAAACAAACCTTCTCGTT
-CTTCAAAGCGGCCTCAACGATGGCGCGGAGCTCTGGATCGTCGCAGTTTC
-CCTCGTCTCCTTCCTCATCGGCGTACTCGACAGCTTCGTTGGTCTCCTGG
-AAATTTAGAAATTAGATTTTTCTCGAAATTTGGCCGAATATTAAAAAAGT
-AATACTAAGAATTTCCCCACGAAAGGCTGAAAAATTGAGGTTTCCTGGGA
-AAAGTGAAATCCCGGTCTCAAAATTTTTTTTGATTTTTGAGCTCCGTTGA
-ATACCGACAACAAAAATGGCTCTGGAATTTGAAAATTACGGGGAACTGAA
-ACGCAACTTCTACTGCTGCCAGTATGTCTCTCCCGCATTTTTCGGAGGCT
-CAATCGTAGATCAAAGTTTTCCGAATAAGTTACTATTAGGTTTTTATCGA
-GAATTGGTACTAGACTATGTTGACAAATACCAAATATCAAATATTTACCC
-AGATGCAAGTTATGGTGCTTTGAACTAGAATTCCTGGGAACTGATTGTAA
-GTGTCAAAACCTCAGCCAACCGACCTAAGCCTAAGCCTAAAAAGGTGTAT
-CGAACTTAAATTTCGACATGGCATGGCATTCAAATGGGTATACCGATGAT
-TTTGTTTCAGCAAAATTTTTAGGGTCGAATTTTTAAGGTAGAGCAAAATT
-GGGATAATTTTAAAGACTATTAATTGTCCAAAAATCCAACAAATCCAACT
-TCAAATGAGCTTAAACTTTAGATCACCTTCCCAAAAACCCACCTCAACAG
-TATCAACTTGCTCGGTGGCGGTCTCGGTGGCGGTGGATGGCTGCTCCTCA
-ACAATATCATCATAGGTGCTCTCCTCCTTGGCAGCGGCAACTGGAGCCTG
-AGTCTCCTCGACAACTGGAGCTGGAGTCTCTTCAACGACAACTGGCGCCT
-CGGTCTCCTCGATCACAACTGGAGCCTCGGTCTCAACGACGGCTGGGGCT
-TCGGTCTCTGCAACGACGACTGGTGCTTCAGTCTCAGCGACGATTTCTGG
-AACGATTTCCTCTTGGACAGTCTCGACTACGGTTGGCTCTGGTGCTTGCT
-GTGGTTCTGGTGCTTGTTCTGGTTCTGGTGCTTGCTGTGGCTCGACAACA
-GTCTCGACGACCTGCTCGACTGGTGTTGGGACTGGCCCCTGGGTGTATGT
-GGCGACTGGTGCGACTTGCTCGACAACTGAAGTGTGGGTGAGGGTGAATG
-TGTGGGTGGGAGTGGTGCGAATCTGACTAAAAACTGTAAAAACTAACCTT
-GAACAGCCTGGTGCTCTGGTGGAGCTTGGTAGTTTCCTCCCTGAGAGACT
-TGGGTCACCTGGATAGAGCTGACTGGTCCCGATTGGTATCCTCCTTGTTG
-AACTTGCTCGACTGGGGCAGATGGTCCGGCGTTGTAGCCTCCTTGTGGGG
-CGACTGGGGCTGGTTGGGAAGCTCCAGCGTATGAGGGTCCTCCTCCGATT
-GGTCCTTGGGATCTAGCGTATGAGGATGCTCCGACAGCTTGGGAAGCTCC
-AGCGTATGATGGTCCAGCTTGCGATCCAGCGTGCGAAGATGCTCCTCCTC
-CGATTGGTCCTGGACCAGCTTGGTAGGCACCTCCACCGACTTGTCCTCCG
-AATCCTTGTGGTCCCTGGGAGTACGAGGCTCCTCCGACTGGTCCAGGTCC
-TCCGAATGGAGCGGCATATCCGGCTCCTCCACCGATTGGTGCCGGTGGTG
-GTGGTGGTGGGGGTGGAAGGGCAGGCGCGGCGGCATAGCTTCCGCCTCCG
-CCTCCGGTTGCGTAACTGTAAATGAACACATTGGGAATAGTATGGAAGAG
-GTGGCTAAAGGGGGAAGCAGGTTTTAGTTTTGGCGGCCAGCAGCAGGAAA
-AAGGACATTTTGCATGAATGGGGTGGCAAGTAGAATGGACTTTGTCGCTC
-CTTAAGGAAGACATCAAAAGAACTTCAGAAAGAAAGAAATTATTTTTGGA
-ATCAGGAAAAAGCATTTGAATAGCAGTAGAAAAAATATAACAATATAGTC
-ACAAAAATACAAAAAAAAAGGCAAAATCTTACCTCGAGCTAGAGCATGGT
-GGAGCTCCTCCTCCGCACGATGGCTGGGATGGTGGGCAACATCCACCGGC
-GCTTCCGGCACCTCCGATACACGCTAACGCAGGCGACACGGCCAATAAGA
-CGGCTACCAAGACTCTCATCGTTTTTGAGAAGGCAGAAATCGCAATGGAA
-TGCTGAGTAACTGTCGTCGAATGGCAACGTAGGACGTGCCTTTTCTACCT
-GCCACCCCAAACTAACTCCGCCCATGGCCGTCTGGAGGGGGCACGCGCGC
-GCACGAAGCCTTCCGAAAGACGCCCGATCGCGTTTTATCGATGATGATGA
-TGATGATGATGAGATGAAGCCTCTCTCTCTCCGTCGGAGGGCACCTTGCG
-ACATTCACCTTGTGTGCGTGTGTGTGTTGCAGAATAGGGGGAAGAAGAAG
-CGATCGCGTACAAATGGGGTTCGTGTTCATTTCCGAATGATCCAATGATC
-AGCTGGAATATTCCTATTAATGTGACTCGTGCCACGTCATTGTTAATGAT
-CTACTATGTTTGAGTGATTGGATATGTGTTGTTTCCTTTTCTAGTTAGAT
-TCCTGAACAGTTCACCTTTACCTAATCCGTGATCGATGTTCCAATGCTTC
-TTCCTTTCACTTCCACTGCGGCACCTAATCAGGCGGAATAACATGCTTTC
-ACTCTGCCGGTAAAGTGTGAAAATCCTAAAGTTTTAGATTTCAAAGATTT
-CAAAAACGATCGTTGATCCTACCGCGCTTCCGCATCAACTGATATCAGGT
-TTTTTTTAATGATAAGATTGTGGAGGAATGAACTGGTGAACTTTTAGGCT
-GATTTAGAGCCACGTGGAAACTTCCAGCTTTTACCTAGGTGACTACAAAC
-TACGGAAGATCAAATTACATACATTTTGTAAAAACATACATCACTTTCAA
-AAATTTCGGTTTAGTTCAAAAAATCACATTTTTACTGTTTTGAGATTTTT
-TTTTTCCCAAAAATGTCGATGCAATTTTGATGTCGATGCACCACGGGCGA
-TTTAAAGGAAATTATCAGTTTTCTGAATATTTTTGTTTTGTATGTCTTGA
-TTATGGGTTTTGTAGGCTTCGATGGCAGGCAGGCGAGGTTTCGGGTCCTG
-GCGCCCGTCTGAAACCTGCCCGCTTCACGCCGGCCTTTTGCCTCTTTTTT
-GCATTTTTACGTGGTGCCAGGCTGTCCCATCGCAGTTTGATCTACAAAAA
-ATACGGGAATTTTTCGCCCAAAAATATGTGACGTCAGCACGTCTTTAACC
-ATACGAAATCAGTTGAGTCTCTTCTCCCGCATTTTTTAGTAGATCTGTGT
-AGATCAAGCCGAAATGAAACACGCTGACACCACGTGTGTTTCTCATTGGA
-AATTGGAGGCCTAGAAAATCAAAAGTTAGGCCATCAACAGATTTTTGTTT
-CAGCAAAAGGCGCGGATTGAGGCGAGGTCGCTTTAAAGTCAGGCAGGCAG
-GCGGTTAACGCCTACAGGAAAACTTTAGGTTTTAGGTTATCTGTATGTTT
-CCCTTTTGTGTGTTTTTTAGACGTCCAAAGAATCGTATCAAAATGAATAG
-GTATTTTCTCGTTTTATGCAGATAGGTAAAGGTCTGTAACCTGAAAATCC
-AGAGCCTTATAATCCACACCTACATAATCATCAATTAAAATATTCAGATA
-ACTGATAATTTCCTGAAAATAAGATATCTGTAAATTGAATCAACGCCAAT
-TTTAGACATGGTGCATCAAATGCAACATTGTATTGATATATAAACTTTGG
-CAGTCAATACATGTTTTCTTATGCATTGTTCTCAGTGCACCTTGATCAAT
-TGAGTAGACTTCATCTATTCTTGTCCACTTCCTAAACATGAAATCAATCA
-CGGCACCCCATCAAAAAGCACTAAAAAAGTACATTTAAAAGAGTACATTA
-TTATTGCCCGTTCAATCCTCGTAATGTATCTTTGCAAGTTCCTTCTTCCT
-CTGACATTTCCCGTTCCAATTCTCCGCCATACCTGATATGCTCGACTTTT
-TCGATCATAGACGCGAATTGCGCAACGCGCGAAAATATCTTGCGCAATGA
-ACAAGGAGAAGAAGAAGAAGAAGAAGTAGGAGAAGCCAAATAAAAGATAG
-GTGATAACCGAGATGTTAAGCCAAAGAGAAGGAGTGTAATAGCTGAACAA
-GGCCTATTTTTGTGTAACTCCCCCCTCTGACAGCTTCTTCACTTTCCCTC
-CAACCGTTTTTACTCTGTATGGTAATTGTTGATGGATCGCCATGGAAAAG
-CCCTAATGGTCATGAATAAGCTGTAAAGCAGCGGGGGTGAGCTTGAAGGA
-CGATCGGACAAATGAGATATGAAGCGTGAAAAACGGAAAGCATGCTTAGA
-GGGGGAGATATATGTAGATTTGGGGAAAAGCTACAAGGTCGATTTTTATC
-CGGTGTCAGGATTATAGAGGTGTTTTGAAGTAGAAGCAAGGCACTGAAAT
-TCACCACTTCCTCTATTAGAATTGCACATTTTTTAAAACTATGTACCTGT
-TTTCTTAAGAATTGCTTGAAAAGTTGAATTTGAACTAGTAGTTCTTGCAA
-AAAGGCCAATTGAACTATCTGGTTTAGTTGCGTCCTTATTAATATTGCAC
-TTTTTAATTCCGGCAAAACGCCGGTTTACCGATTTGCCGGGGATTTTCAT
-TTTTGGCAAATCGCCGATTTGCCGTTTGCCGAAAAAATTTTTAACAGACG
-GAAAAACTTAAAACTGTGTCATTTTGAATTTATTACCGTTTTCTTTAGAT
-ATTTTCATAGAATTTGCTAACTTTTGAAAATAGATGAAGGAACATTTATA
-TTATTTGAAATTGAAATTCTGAAACTTCCAAAAAAATAAGTTGCAAAACC
-ACAATTTGCCGAAATGCCGTTTTCCCGGCAAATTCGGCAAATCGGCAATT
-CGCCGATTTGCCGAAAATTTCAATTCCGGCAATTTGCCGACAAAGCAATG
-TTTCATAATACATAAAATGTTTCTAATTTTTAAGAATGATTTTTTTAATT
-TTGACAAAGTTTTTTTATAAAAGAGCCGAATTATTTTAAATTCCCGCGCA
-AATAAGTGACGCCATTTTTTACATTATTTGTATTTTCTGGCTAAATTAAT
-TGGTTTATGTATGTTTTTTCTTTAGTTTATAACTTGAGTAAAATTCACAG
-TAAAAATTAATTTTGAAAAATCGATTTTTAGTTTAATTTCAATTTCAGAG
-TTTCGGCAAATGTATTCTCAATTAACAAGTTTTCCAAACGGAAAAAAATC
-TGAAAATTGACAAACCACGGTGTAGATCAAGCCGAAATGAGACACCCTGA
-CACCACGTGTGTTTCCCCTTGGAGGCCTAGAAAATCAAAAGTTGGGCCAC
-CATCAGGTTTTTGTTCGACTCAATTGGTAAACTTTGCAGACTAGGCTGAA
-ACGTGGTATTTGCAAAAATACAATTTTACACATTTATTTTCCACAAACCG
-AATAAAATCCTTATCTCAACAGTGTTATATAATTTTTTTTTTCAGATCAC
-TATCACGACATTTTAAAATATATTACAGCACTCTCTTCTTTAGGTTTTGA
-ACGTTGATGCTTCGAGGATAAACATGAAAACCAGATCAGCTTTTCCGTGA
-CCTCACATACTCATTTTCTCAAATTCTCAAAAATGTTCTGCCTTCTCCAA
-CGGTCTCTAAAAAAGCTTGGAAAACCCACAAAAGGTGTCTTGGGACACTT
-CTGTCTCTCTCTTTATCGATGACCGGATCGCCCGGATAAACGGGTTTTGC
-GGACTGACACCAGCAGGTGGAAATGGGCACACTTGTAAAATAAAACGAAA
-AATAATAATAAAAATAACACGGAATGCGGAGAGAAGTGGCAAGATCGGAA
-GAATGGTGGGGGGGGGGGGGGGGGGGATTACATAAAGATGGCGGCATAAA
-GTGCGTTTCATTAGGGGGATATTGGGGTTTTTATAGGGGGAAACTTTGAT
-TTTTTTGAAAAAAAAATTAAGAAAGAAGCGACAACAACCAACAACAAGGT
-CATTTTTAAAAGGAAAATTTGGCATGAAATTTACATTTTGGGATGAATTA
-TGAGGATATACTCATATAACCTAATTTTGTCACAAAAAAAACGTCGAAAT
-TTTTAAAAATGACTACATTCTGCAATTTTGAAAAATTTGGTGGTCCTACC
-ACGAAAAATCCATGGTTTTTTGGTATTTTGACGAAAAACTGATTTTTTGT
-GTTTTTTTTCTGGTATTTTGAAGCCGCTGTACTTCAAACCCTTTTCATAT
-TCTAAAAATATCTTTTTGCAAAATTCGGTTTTTTCTAAAGTTCAAAATAA
-ACCACTATTTTCAATTTTTAACGGAAAATCTGCAAATAAAATTTCGGAAA
-ATTCCGGCAATTTGCCGATTTGCCATAAATTTCAAGTTCCGGCAACTTGC
-CGATTTGCCGATTTGCCGTAAATTTCAAATTCCGGCAAATTTGCGAATTG
-CCGTCCTACCATGAAAAATCCTTTTTTTTTCTGGTATTTTGAGACCGCCG
-TACTTCAAACAATTTTCATATTTTACAAATATCTTTGAGCGAGCGGTTTT
-TTTTGAATTTCAAAATAAACCAAAAGTCTACTTTTTTTGGTTTGTTTTTG
-TAATTTTTTTTTTAGAAATTTCAATTTTTATCGGCAAATTGGCAATTTGC
-CGGTTTGCCGGAAAATTTCAAATCTGGCGATTTGCTGCTTTGCCGATTTG
-CAGGAAATACCTATCCCTGATGTAAATTACCAGAATTAGAAGTTTGGTAC
-ACGATTGGCACACAATTTTTTGGTACAAAACACGCTAAAAATTAAATGTT
-TTTGAAAAAAAAAATTCTTTTGAAATTGTTTTAGTGTGAATTTCCATGTA
-TTCAATTTTTATCATTTTTAGCCTGTTGCTCCAAACTAGGTTTTCTCCCA
-CGTGGCATCTCTCATTACACATAAAAATACCTGCTAACTCAAAACATTAA
-TCAGAGATCCATATCCATGTCTTCCTCACTTTCCAACTTTTTCCCTCTTA
-GCTTATCTAGATATATGTAGGTATATCTATATCTACAAACAACTTTCTCT
-TTTCAAACATCCAGTTTATCTTCTGACCTTTGCAACATTTTTCCTTTATT
-CCAAACTTCCGCCAGATTGCATCTTATTCAATTATTACATTCAAAGAGTG
-TCTAAAGTTTTGCTTAGAAGAAACAAAAGGTAAAATGTCAGATATGTTTA
-GAGAAGGTTGTAAAATTTGGCAATTTATTGTAAAAATTCGCAATTTTGAA
-ACTCCTTTAAAATGGTTAATTTTGTAGTTAGAGGACTCAAAATTAATGCC
-CGAGAACTAAAAAGTTGTCATTTTTCATTTATCAATGATTTTACTTAATT
-TCAAAAAAAAAATTTTGCCCAAAAAAGGACAGTCATTAGAAAAAAAAACG
-GAAAAATGATATGGAGTGATTCTTTTTTATTTTATAAAATTAATCAGCAT
-AGTCAAATGTACCAGAAAAAAGCAAATAAAATGTACTAGATTGACCGGAA
-GATTATTTGAAAAATTGCAGAAAATGCACCAAAAGCTGCTTTTTTCAAAA
-ATTCAAAAGTACGGTAAAATCATACGGAGCTATTCTTTTTTATTTCATAA
-AACTCTTCAGCATAGTCAATAATACCAGAATATGTCAATCAAAGTATAAT
-AGCTTGTACGGAAGTATCTTTTTAAAAATTGATAAAAATATATAAAAGCT
-GTTTTTTTCAAAAATTCAAAAGTATGGGAAAATCATAAGGAGTCATTCTT
-TTTTATTTCATAAAACTCTTCAGCATAGTCAAAAATACCAAAATATGTCA
-ATCAAAGTATAATAGCTTGTACGGAAGTATTTTTTTAAAAATTGATAAAA
-ATATATAAAAGCTGTTTTTTTCAAAAATTCAAAAGTATGGGAAAATCATA
-TGGAGTCATTCTTTTTTATTTCATAAAACTCTTCAGCATAGTCAAAAATA
-CCAGAATATATCAATCAAAGTATAATAGCTTGTACGGAAGTATTTTTTTA
-AAAATTGATAAAAATATATAAAAGCTGATTTTTTCAAAAATTCAAAAGTA
-CGGGAAAATCATAAGGAGTCATTCTTTTTTATTTCATAAAACTCTTCAGC
-ATAGTCAAAAATACCAGAATATGTCAATCAAAGTATTATAGCTTGTACGG
-AAGTATTTTTTTAAAAATTGATAAAAACAAATAAAAGCTGATTTTTTCAA
-AAATTCAAAAATTCAAAAGTATAGGAAAATCATATGGAGTCATTCTTTTT
-CATTTTATAAAATTCTTTAGCATAGTCAAAAATACCAGAATATGCCAATC
-AAAAGATAATAGCTTGTACGGAAGTATTTTTTTTTTAATTGATAAAATAT
-ATAAAAGCTGATTTTTTCAAAAATTCAAAAGTACGGAAAACTATATGGAG
-CGATTCTTTTTTCTGTTATAAAACTGTTCATCATTGCCACGTATACCTGA
-AACTACCAGAAAAAGTATGCTAGCATGTACGGAAGATTATTTGAAAAATT
-GCAGAAAATGCACCAAAAGCTACTTTTTTCAAAAATTCAAAAGTATGGAA
-AAATCATATGGAGCGATTCTTTTTTCTTTTATAAAACTGTTCAGCATAGT
-AAAATGTACCAGAAAATACCAAAAAAAAGTATGCTAGATGTTCGAAAAAT
-TGTTTTTATAATTTTTGAGAGGAGTTTCAAAATTGTGAATATTTACAAAA
-AATGGACATTCTTGCCACTTTTTACTAATTTTTGATGGGCTAAACCTAGA
-TTTTCTAAATTTTACATTTATGAATTACCCGTTTTCGACGAATTCAGGCA
-AATTTTTATTTTTTCCTATTTTTTTCAGCCATTTAATCAGCCATAATAAT
-GAATGTCCTTTTTTTTTGGGCAAAAAAAAATTTTTTAAGGCTCGAAGACC
-AATTTTAAGTTCTCTAGCTACAAAATGAACCATTTTAGAGGAGTTTCAAA
-ATTGTGAATTTTTACAAAAATTGCCCAAATTTGCCACTTTGTAATGGTTT
-TTGGTGGGTTAAACCTAGATTTTCTGTATTCTGCATATATGAATTACCCG
-TTTTCAACAAATTTTGACAAATTTGTATTTTTTCCAAAATTTTTTTTCAG
-CCATCTATTCCTTTTTTTTGTCTGTTTTTTTTTCGGGCAAAAAAACCTTT
-CCCCACTGGTGCTATACCACCTTTAACGGTAAATTTTACTGGTCTAAAAA
-TCGGCGAAAAAATGAAACTTCAAGTAATATAATGGTAATTGAGTTTTTTT
-TTCTATTTTCTTTGTTCAAAATATCAATTATGACAAAAAACGAGAAAATT
-ATATTGACACAGTTAAGCGGATATAAATAATAAAACATCACAAGCACATT
-TAATTTTTCAAACCCCCTCAGGAGTCATGAAGAAATCCTTCTCTGCACAT
-CTACCTTTCTCCACATCCAACTCCTGATTTATTTTCTCCGCAAACTCCGT
-GTAACTTTTAATTGCAACATTCAAAAGTTTTGTATGATGCTTCAAGTGAC
-CCAAGTCGATTACACAATCCCCGCAAAGAGCTTCGCTGCGAATTTTGTCA
-ATTCCCTCTTCTAAATTCACTTGTTCTCCAAACTTCACTGATTTCCTTAG
-GATCCCAGTGCTCAGGCAACAGTTTGTGCAAATTCTCAAGGTTTTTGATT
-TCAGTTGGCAAGCGGTGCAGATAGGGCTCTGGAATTTTAAATTATTGATT
-TTTTTAAAAATTATTAACTCACCTCGTCGCTTTCATGTGCTCTTCTTGGA
-TTATGGTCATATGGAACTAAGAATCTCGAAAGTTGTATTAAATCCCACAA
-AGATCGATTCACATTTTTCCTTTCAAACGCATTTTCTCGTTTACAGTGTG
-GACATCTCTTGTTCAGTAGTTGGAGTCGGCATCTGTCGCAGATAGTGTGA
-CCGCAAGTGCCTATACAAGGGATTTGGGTATCATGATCTGGAAAATTTGG
-TGTGTAGGGCTTCCATGGTAGGCAGGCGCGGGGCCTGGCCCGCCTCACAC
-CGGTGAATTTACAAATTTTTGATTTTCTCGTTTTTGTCATTTTGATGAAA
-AACATTGAGGCAGGCGGAGGTCGCCTCAAGTTCACTCGGCGTTTGCCGCC
-AGCTTCCTACCCAAAGCTTTGCAACTTCTTACCCAAGCCTTGCCCAAAAA
-ATAAAAAGCTTAAATATCAAAATTACTCAATTTTGTGTCATTCTACTAAT
-TTTCTGAGAAAATTTGAATTCCCGCCAAAAATTTTATTGGAAAATTTGAA
-CTACTGGCCAAAATTTTTTTTGGCTGCGCCAAAGATGATCTTAGAAATTT
-GAATTCTCGCCAAAATTTTTCCCAGAAATTTGAACTTCTTGCCAAAAATT
-TTTGTTGGATAATTTGAATTTCCGGCAAAAATTATCTTATAGTGAGGACA
-CAATCAATAGTTTTGGTCAAAATTGTATTGTCAAATTTTTGATGTGTGTT
-GGCAATTTTGGCAAATTTGCCGAGCTCGGCAAATTCGGCAAATTTGCCGA
-GCTCGGCAAATTCGGCAAATCTACTTTTTGAAATTCGCCAAATTTGGCAA
-ACGGCAGAAAAAAGTACAATTGAGATTTGAGGTACACAAGACTTACATCG
-AAATTAATCTAATTAAAAGAATATCACTTACCATATTCATCATAGCATAT
-ACTGCATTCAGTAACCTTCATCGCAAAAATAGTCTAGACACTGACCAAAC
-ACTACACACTTGATGCTATTTATATACTTTCTATGCTGAGCAATACAGAA
-CATGCGATGTGAGGAATCTTAGGTAGCAGAAGTACAAAAAGATTGACATG
-TGATTAAATTCCTAATTTGTTCCTTATCACATTTCCCATATGTCAATTAA
-TTCGTAGATAGATGCTATTGATAAAAGTTTTTCGAGAATTTGTAAGATAT
-GAAAATAATATTCCTCATTTTTAATTTAATGATACAGTACTTTGAAAATT
-TCAACAATTTCAACAATTTTTAACACCTATGTTATCATTCATATACAACA
-ATTTGTTTAATACAGTAATACATTTCCACCCACGTGGTATTAATACAGTG
-TTAAGCTTGTTATTTTTTAAGGAAAAATTTAGAAAATTTTTCTTCCTCAT
-TTTGCTTACTTTTCAAAAAAGCGTGCAACTCCCTCATTTAAAAAAGAAGT
-GTCGTCGCTGAGGAAAATGTTAAAAATTTCTCTCATGGTGCTAAAATTAC
-TAACTAAAAACAGTAAGTATCGTAGCGAAACATTTCAAAAATTTTCAAAA
-TTTTTTATTTATAGTCAACAGTTTTGGAAGTCAATTAAAAACATTTTTTA
-CTATTTTTAATATTTAAAAACGTTTCAGTTGCTTGTAACTTTATAAGTTT
-GCCTACCGTACATTTACCGTAAAACAACCTTAAAAATGTAAGCTTTTCTC
-CCGATAAAAATCTTTACTCAGGAGTTCGCGACTCTTCTCTTACATTAATT
-TTTTCTCTAATATATTGAGCTCAAACCTAGCTGTAAAATTGAACATACAT
-ATAACTTTGAGTGCAATTTAAATTTCAGAAAACTTTCACAAACCCAAAAA
-TTGAGAATGCTCAGGACAGTTTGACCTTTCAAGAAAATTGCTTCGAGAAA
-ATTCCAAGCTTCACAAAATTGCTCATTGCCAAGTTATTTCCTTTAGTTTG
-TGGCCAACGCCTTAAAAAATACAAATTAAAAAAAAAACTCTGACACCACG
-TGATGATGCAATCAGACTCACGAACTCACGGGGTTCTGCCCTTCCTCATT
-GAATTTTTCGCGCTCCATTGACAATCACCCGCCGTACAACACGTGGGAAA
-GTCGTGCACTCCACAAGGACAAATACATTTAGTTTTACAACTAAAATCGA
-GCCGCGACGCAACACGCAACGCGCCGTAAATCTACCCCAGATATGGCCAA
-GCCGAAATGGCCTAGTTCGACAAACTCTTCCATTTCAATTTATGAGGGAA
-GCCAGAAATCCGTGCGAACTGCGAGCCTAACGCTCTTTTTCAAAATATCG
-TATAACTCGGAAAACAAGCCATATTCCCAGTTCCTGTTTTATTTCGAAAA
-ACAGATAATACAAAAGAAATATCTGAAAATTAAGAATAACATGTTTTTAT
-TAAATACTTCTTTGTCTATATTCCATATAAAAAGAACCCCATGCGAATGA
-AACACTCACTATACATTCAAAATGAATTTCGCCATCTACCTTCTCGCTTT
-CATCGCCTGTCTCGCTAACTTTGGATTTTCACAGGGTAATCCAGGACTCT
-CATTTGATCCAGAAGAAGATTCAGTAAATATTGTAAGTTTTCGGATTAAT
-GGTTACAACATCTATAAGATTGTTTAGAATGGCAAAGTGCCAGTGGGAGC
-AGTGAAGACGTTGGTTAATGATCTTGTGAGCCCTACTATTGCAATTGTGG
-AGAAAACATTATCCTCATTGTCAGTTTAAGGAGCTACGGGAGGGCTCCAT
-CCATCTCAAATGTTTCAAATAACTCATATTGTTCTTTTATCTGGGAGTAA
-ATAAATTACATATTGGGAATCCTTTTCTTTTTGTTGTTAACCAAGTTGCC
-GGTTGCCAAATTTTTTTGGGTTCGGCAACTTCGGCAACTGCCGGTATCAA
-TGTCAAACATTTTGAAGCTTAGAAAAAAGCATTCAGAGAGCCTGAAAAAT
-TCTATAATTTCACTTTAAACGAAAAAAATACCATACTTTTTTACCAAAAC
-GCTCAAAAATATAATTTCAACAAAAAAACATTGAAACCTGGTTGCCGAAT
-TTTTTTGGGTTCGGCAATTGCCGGTTGCCGTTAACCTCGGTTGCCGCACA
-GCCCTGATGTGGAACTCTGCAGGCCTAGCGGCATCCATGTGAAGGAAGCG
-TATTGTATTTATTTTTAAACATAAATTAAAAAATCGATAAAACCTTCATA
-TATATAAATTGTTTAGACCGGTGAATAAAATGAGACGATGCCACGCGAGT
-TGGCGAACGCTTTTCTCCGAAGATCCAAGTCAGGACGTCGTCGATGGGCG
-GGACCCGGTGGGCGGAGCTTAGTCGGATAGCGCAGCAGACAAAATACGGG
-CGGTGCGTCGAGATCAAGTGCGTACTCCTCGACGGAAAGGGAGCTTGACG
-CGTGGATTGCGTTCTCGTCGGATGAGGAAAGATCTTCTGAGGAGGCGACC
-GGAGCCAGTGGTGGGAGCTCTTGTAAAAGGCGTTCTCTGAAACAAATAGT
-GGTGTTAAGGGGAAATGCGATGGGAAATCCGAGTAGTTGATGTCCGCGGA
-ATTAATTTTCTCGGGGTTTCATGGAAATTTAATTCCGCGGATTTCAACTT
-GCCGAGTTTTTATTCGATTTTATGAAAAAAATTACACGAGAAATTGTTTT
-TTTTAATTAAAGTATCCGAAATCCCCGGAAACAGATTTCCATAGAGAGAG
-GTCACTAGAGGTTTCATGGAAATATGTATTCAAGGTCTTAAACTACCCAA
-TTTTTTTACCTCGATTTTAACAAATTTCAAGTAAATTTGAATAATTCTAA
-CCAGTTTTGTTGTTTTACACAAAAATTCGGGTTCTTTAATCCGCGGAAGT
-AGCTTTCCAGAGGTTTCATGGAAATATGTTTCCGGAGATTTCAACTACCC
-GAGTTTTTTATCTCGATTTCACACATAATCGGCATAAGAAACTACAATTA
-TTTGTTTTCGGGGAAACTTTAAAAAACCCCAGAAAGTTGAATTTCTAGAA
-ATTAGCTTTCCCGAGGTTTCATGGAAATTTGTTTTCGCGGATTTCAACTA
-CCCGAGTGTTTTACATCAATTTCATCATAATTGACATAAGAAACTACAAT
-TATTTGTTTTGGGCGAAAGCTAAAAAATCCCCGGAAATCTGGATTTCTAG
-AAACTAGCTTTCCCGAGGTTCATGGAAATTTGTTTCCGCGGATTTCAACT
-ACCCGAAATTTTAATTCAATCTTTAAAAAACATCCAGTTTTTGTGACATG
-TTCTTCAGTTAAAAAAAATCAGAGTGTTGGAATCCTAAATTTCTAAATTT
-TCATAGTTTCCGCGGATCGAATTTCTAGAAATTACCTTTCCCGAGGTTTC
-ATGGAAATTAGTTTCCGCGGATTTCAACTTCCTGAAGTCTTCATTGGATT
-TCAATATAATTCGCACAATAAAAAAAGCCAAAACGCGAGGATCCCTGGTA
-GTTGAAATCCGCAAGAATAGTTTTCTCTAGTTTGAAAAATTTACTGAAAC
-CCTTACTTTTGCTTTCCCAAGAATTCGAGTTGTTCCTCGAACAATTGCTT
-TGCAGTCCCAATATTCGGCGAAAATTTCGATGGTTCACTATTCCGACGGT
-GCTCTTCAATTTTTCGCAAGTTTGCTGATACCTGAAAAATCGATATTTCA
-GACTATCTGTGCCAAAAACTAATTTATTAATTTACCTTCTGACTAGCATC
-CTCCAGCTCAACAATGTTATGAATGGTGGCTTTATACTGTTTCAGCTTCT
-CCTCAATTAAAGTCTGAACACAACCCGTTTGCCGTGCCACGTCATTCAAC
-TGCTCCTGAGCATGAGCACTATCTTGTCGGCGGAGCACACATGGCCCGAA
-GATCAGAGCCAAGTTGTTGCAGCCCATTTTGTTGACGGCTTCCTGGTCGG
-CGACACGTGCCAAATGATACATTAGGCGATCGAGCACGGCGCGGTTCGGT
-TTTGGGAGAAGCTCGATCATTACGGAAAGACAACGGACACGTTCACCCAT
-ATCCTCCACTTCTGTAATTTTTTTTTTTGGACGAAAAAAAACAACAAAAA
-ATATCATTTTGACAAAATGTTAACTTTCAGAAAATTTGAAAATTGATTTA
-TTTTTTTTGTTTCAATTTTTAGGTTTATGAATGAATCCGATTTTTTTTTG
-TCGAAATTTTTAATAAGAGCCCTAGTAGGCATGTGGTGTGTGTGTGTCTC
-ACTTCGGCTTGATCTACGTAGATCTACAAAAAAATGCGGGAGAAGAGACT
-CAGAGTTCTTAATGGATTTCGCATGGTTAACAATATGCTGACGTCACTTT
-TCTGGGGAAACAATTTCCGCAATTTTTTGTAGATCAAACCGTATTGAGAC
-AGCATCTCTGCCTGGCTGCGGACGCCTCGTTTTTCCCTTGGAATTTTTTT
-GGCGCGAAATTCAACTTTTCAAGTAAGTGCGAATATTTTCAAGTGAGACT
-GTTCAAAATTATTTTGCTGCCAAATTTGAGTTTGCAAATAAATTATTGAG
-CAAAATTCAAATGTTCAAATATTTTCTTTCGAAACGTAATGAAAAAACTC
-AAAGTTACAAATAATTTGGCGCGAAATTTGAGTTTTCAAATATTTCTAGT
-GCAAAATTTGAATTTTTCGAATAATTCTGGTCCAGAATTCAAAAATTAAA
-AAAAAATTAGTTTGAAGCGATGCTCAGGTTTTCATAGAGCTTCCATGTAG
-GCGTTAAAACGCCTGCCTGCCTGCCTTATGCCGCGCCTAATGCTTGAATA
-TACGTAAACTTTTTTTCATTTCTTAATTTGATTTTCAACAAGTTGATAGA
-ATTGAGAAAATTATAAATTTGTAAATTTACTTAAAAATGCAAAAAAATAG
-GCAGGGTTCAGGCAGGTGCCAGGCCCTGAAACAGCGCCTGCCTACCATGA
-AAGCCTATCGTAAAAAATCCAAATTTAATTTTTAATTTTACTAAAATTTC
-GATGGCTCGTTTTTTTTCAAACATCACAAACCTGAAACATTCAAAAAATT
-TTCATAGAGATCAAAAATGATAATTGGTTCGGCGAGTTCTCGGAAGAACG
-CCTTGACAAGTGTAGTTAGCACATGAACTCCAATATCCTCAAGATTCACA
-GAATCCGCATCTGAAACTCCGAATTTGATTTTTTTTTTTTCAATTTTTCT
-GCAGTTCAACAATTACCTGCAGTCGATTCAATCACTTTTCTGATACTTCG
-AACTTGGGGTAGAGATCCACTTTTTCTGAAATTACGGGCGCAAAAATTTC
-AATTTCAAAGACCTTCAGGTATTTCCGTACCTATAAACTCCTTCCACAAA
-CAGGGCACGTGTCTCAATTGCAAAAAAGAGTCGGTCCAAGAGTGTTGGCA
-CAGTATGATCATCATCGACAATTGATACTAAAGAGGCGCCAAAGAATCTT
-CCACCATTTGTCTGAAATTCAATATTTATAATAGCATTATAATAGCATAT
-TTGGCTGTAGTTTGTAGCAGGGGTCAGGCAAATTGCCGATGTTGCAAATT
-TCCGGCAAATCGGTAAACCGGCAAACTGCCGGTTTGCCGAATTTGCCTAA
-AAATTTTTGGCAACTTTTTTTTGGAATTTTCAGAATTTCCATTTTAATCG
-GCAAAATTTTACGCATCGTATGAATTTTCTTACATTTATTTTGAAAAGTA
-AGCAAATTCTATGAAAACATCTGAAGTAAACGAGAAAAAAAAATTCAAAA
-AGGCACAGTTTTAAGTGTTTCCGTCTTATAAAAAATCCCTCTAAACATTT
-CCGGCAAATCTGATATCCGGCAAATTGCCGGAATTGAAAATTTCCGGCAA
-ATTTTGATTCTGAATTTTTCAAAAAAACTGTTGGCAAAATACAAATTTTA
-TTTTATTTTCAAATATGTTTTTTTTTTCAGAAAAGTAAATTTTTTGCCGG
-GAATCAAATAATTCTTGAAAATGTTTCAAGATTTTTTTGCCACGAAATCA
-GACGTTTTCAGAACAGTTTTAGCGGAAAGTTAAAAAAAAATTTCAAAATT
-TTTGGCAGGAAGTAAATATTTTTCAGAACATTTATCCGAACAGTTTTGGC
-TGTAAATTCAAATGTTTAGTTTTCAACAACTCTTAGCGGAGAATCCAATA
-TTTTTCAGAATTTTGGAAATTAAAAATTTATCGAAAATTAATTGCAATTT
-CTAAGAAAGCAGTTGTAATTTTTTTTTTCAAAAAGCTACCGAAAAAATCT
-GGCAAATTTGGCAAATTTGCCGAGCTGAGCAAACCCGGAAAAACGCAATC
-ATTTTCTATACTTTTTGGATCATCAAAATTACTGAATTCCTACAATTAGT
-ACACGTCAGATTTTTCTATAAGCTCCGTTTGGTCTACTTGTATAAAGCTC
-GAAATATCTCAATGTTATGTTATTTTACTAGATTTTTTTGGAACAAAATC
-AATAATTTCGGTTAAATTATATTGTTCATTTTGTGGTGTGTGCGTGAAAT
-TTCAAAATTTGCCGAGCTCGGCAAATTCGGCAAATTGCCGCACACCCCTG
-TATTACTCACCTTCGGATCAATCGCCTTTCCAGTCATCTGACACGGATGT
-GTGACCTTCGGCTGACACTTTTTATGACACGATATCCGGCACGCAACACA
-AGTGTACAGCTTCTCATGGTGCCATATTAACTGATTACACACTTCACAAT
-AAGTCGGCACATGGACTGCTTCGGCACGGAATCGGTGACCAGCATGTACC
-TGGAATATTGGAATTGCGTGGGCAGGGGAAACTAGTTTCATTGAAAATTT
-TTTTTTAACTGCTGAAATTAGTCCAAAATGACATGTTATATGTACTTTTC
-TCAAAATGTGTGAAAATTGCACACTGAATTAATAAATAATATTATTTTTG
-TAAAAACATAAAAAGGGGAAAAGTCAGCGGTAAAAAAGTAAAAACACTCA
-GAGTTAGATCTTTTGACCTCCAAAATCCATGAAAATTTGCTTCATTTTTT
-TCATAGCTGTGACGTCGTGGGCGGCAATTTCCGTTCGGTAAATTTATTTT
-CGGCAAATACGGCAAATTGCCGATTTGCAGTTTGCCGGATATCAATTTGC
-CGGAAGTTTTAAAAGGGATTTTTTAAAAATTCCAAAACACTTAAAACTAT
-ACTTTTTTGAAATGTATTTTTACTATTTTCTCTAGATATTTTCATAGAAT
-TTACTTACTGTTCAAGCCCACAGCTTGCCGAAAATTTCCGGCAAACTGTC
-GGTTTGCCAAAATTGCCGAAAATTTAAGAAACGGCAATTTGTCGGTTTTG
-CCGTTTTCTAAAAAAATTTAAATTTCGGCAATTACTGTATTTGCCGTTTG
-CCGAAAAACTAAATTTGCCGCCCATCGTCACACAATACAAAAAAATTGCG
-CGGCTTCTGGAGATCAAATCTGACAGCTTACTGTATTTATAACTACAAAT
-TCACGCTGTGTTTTTCTCTAATTCACGTGGTGTCAGGGTGTCTCACTTCG
-GCTTGATCTACGTATATCTACAAAAAATGCGGGTGAAGAGACGCAAGAAT
-GTGCTAACGTCACTTTTTTTTTGAAAAAAAAAAAATTCCCGCATTTTTTG
-TAGATCAAACCGAACCGTAATGGGACATCCTGGCGCCACGTGCTAATAGT
-AAGTCACTACATTCTTACCGCCGCTACATCTGATTTTACACGCTTCTTTC
-CAACTTTCTGAATACCAATATTTTACACAATTTTCTCGGATTTTGATATA
-TAATACTTTCGCGGGCTTCTGGCTTCCCTCATATTTTCAAATGTAAGAGT
-TTACCGAATTAGGTCATTTGGGCTAGGCTACGGCGCGTTGCGGCTCGGTT
-TTCATTGCAAAACTAAATGTATCTGTCCGATTGTCATTGGAGCGCGAAAG
-GAAAGCTAGAAGCCCATGTATTAAAAAATCGACTTACCTTTATCATTGAT
-GACTTCTCCTTCCCGCGCTTCTTTTTCGATTGCACATGAACGTATTCGTT
-CAGGAAACCTCTGGAATTGAAAAAAATTGTTTTGTTACAAACGCGCCCTA
-ATAACAATTGATCGTGTATTCCACGTTGGAAATTATACAAAATACAATGG
-AGCACTTTTGCTCGAAGCCTAACATTTTCTAAATGTTTTCTCACCTAAAA
-GCGTTAACGCCAAGTGTTGTCGGAAAGGACACACTCTCCTCGAGACAGAC
-TTTCGTTAAAAGTCCCTCGAACATTGTGATGACGTCACGGTATTTAAGCA
-CGGATTGCTCGACCTGAAATGATATGTTGCTAATTACACTTGCGTGGCCG
-TGAACCCCAAAAACTAGGCCACCTTTTGCGCCCAATTACCGATAAAACCG
-CCTCATATCCCAACAGCTCCATATGGAAAGCTCTTAGCGACTTTTTGAAG
-ACCGCATCCACTACAGTATCCCTTTTGGCATTACTCTCGTTTAGATGACG
-TGTCTTGTTGAAAATAAAAATACTGAATTGTCGGAGATCGTCGGTGGATT
-CTACAAGCATGTTTCCAGGGTCGATCTGTAAGTATTGTTTAAGTACAAAG
-TACTACTGCTTCAGTAAGCATTGTAGTTTATAGTTTGTGGTTTGTGTTTT
-GTAGTTTGTGGAGTTTTTAGTATGTAGTGTGAAGCTTGATATTCATTTTG
-CAGTACATTGACTTGGATTGGGGTGTGCTAAGATATAATATCAAAGTACA
-AACAACGAGTGACAAATTAAACATCTCAATCCGAAAACTACAAACTAAAC
-CCTACAGACTACAAACTACAAACTATATCCTACAGACTACAAACTACAAA
-CTACAAATCACAAACTACAACCACGCAAAAGAACGTTACCTACCTGTTGC
-TTGGTTTTTGTTAAACTGAACGTGCCGGTCGATGGAATTGGTGAGGAGGA
-TTGCCGCTGCTTGTGGGGCCTGGAGTTTCAATTTTTTTTTGTTTCAATTA
-AGATTTTCCTCAAATGTTCCTTACATCAAATCCCATGGCCGTTTCGGTGA
-ATGCAGCCGAGTTGGTGATCGAACTGGTGACGTGGGATTGCACGGGATGG
-AGGAGGCGAAGACGAAGCATTCCTTGTGCAGGCACATTTTGCATCCTGGA
-AGAGTTCAAATTACGGCTTCTAGGTCATGGTGGCCGTGGCCGAGGCTTGA
-AGGGATGCTAGGTCAAGTCTGACGTCACATGTGGTTTTTCTAGGACACGT
-TACAAAGATTTCGAAGCGCCCAATTTTCGGAGAGGTTTCTAGGCCATGAA
-AATGTTCTAAATTTCAGGTTTCTAGGCCAGTAGAGAATTTTGAGGTTTCT
-AGGCCAGTAGAGAATTTTAGGCCATATCTGACGTCACACTTTTTGGGACG
-CGCCTAATAACGATGGTGGACCTCTATTCTAGGAGGAGCAACACATTTTT
-TACGAATTTCTAGAAGATGCAACTTCTGCTACTAGGCCACTCATGTGGTG
-CGAGGCTGTCCCATTACGGTTTGATCTACAAAAATGCGGGAACTTTTTGC
-CCAAAAAAATGTGACGCCGGCACGTTCTTAAACTTGCAAAATCAGTTGAA
-AACTCTGCGTCTCTTCTCCCGCATTTTTTGTAGATACGTAGATCAAACCA
-AAATGGGACCACACACACACACAAAACCCACTCTGACACTTGTGCGCCTG
-TGAGATGAAGTTCGTCAGGTGCCGATTGCAAAGAGCACATATCTCCTGCC
-GATGAAGTCGTGACATCTTGAATTGATGGTCTTTTGCGACGAACACGTCC
-GGCGTCAGTTCACTGGCAAAACTTGGTCCCGGAGACGGTTCATCCTCGTC
-CTCGTTCCTGCCAAAAAGTGCCTTCAAATTCTTTTTTGCCTTCTGGAATC
-CCAACTTTCCAGCGCCTCCTTTCTTTTTGGAATGTGTTGGGCTTAGCTGA
-AAATTCAAAAGTTTTTAATATTATAAGTAGAACCCTTACCGTGAACGAGT
-CATCACATCTTGACATTGAGAAATTGTTGGATTCGGTACTATTAGCCCTC
-CGTAACATTTTTAATTTGGTGGTTGAAGCCGTAGGGGCCAGAGATTGCCG
-TCTATGATGGGATAGATCAGCTCCTTCAATGAGCTTCAACTTTGTGTCTT
-CCAGGATAAATGTGGCGTCCACGTCGACGGCGTCATCGCTGAAAAAAGGT
-TTGCGTGTTACGGTAAGCGAGAATTATGGCAGAGGTGGGCGGAAATTGCC
-GTTCGGGAAATTTTTTGTCGAAAAATTGCCGGTTTGCCGAAAATTTGAAT
-TCCGACACTTTGTCGGTTTGCCAGAAATTTTCAATTCCGGCAATCTGCCG
-ATTTGCCGGAAAATTTCAATTTCAGCAAGTTGTCGATTTACCGGAAATTT
-AAATTCCGACAATTTGCCAATTTGCCGGAAATTTCAATTCAGGCCATTTG
-CCGATTTGTCGGAAATTTCAATTCCGGCAATTTGCCGATTTTCCGGAAAT
-TTCATATCCGGCAATTTGCCGATTTGCTTGGAAAATATCAATTCCGGCAA
-TTTGCGAATTTTCCAGAAAATTTCAATTCCGGCAATTTGCAGATTTGCCT
-GGAAATTTTCAATTCCGGCAATTTGCCGATTTACCGAAAATTTCAATTCG
-GCAATTTGTGAATTTTCCAGAAAATTTCAATTCCGGCAATTTGCCGATTT
-GCCTGGAAAATTTCAATTCCGGCAATTTACCGATTTACCGAAAATTTCAA
-TTCGGCAATTTGCGAATTTTCCAGAAAATTTCAATTCCGGCAATTTGCAG
-ATTTGCCTGGAAATTTTCAATTCCGGCAATTTGCCGATTTACCGAAAATT
-TCAATTCGGCAATTTGTGAATTTTCCAGAAAATTTCAATTCCGGCAATTT
-GCCGATTTGCCTGGAAAATTTCAATTCCGGCAATTTGCCGATTTACCGGA
-AATCTCAATCCGGCAATTTGCGAATTTTCCAGAAAATTTCAATTCCGGCA
-ATTTGCCGATTTACAGGAAATTTCAATTAAGGCAATTTGCCGCTTTACCG
-GAAATTTCAATCCGGCAATTTGTGAATTTTCCAGAAAATTTCAATTCCGG
-CAATTTGCCGATTTGCCTGGAAAATTTCAATTCCGGCAATTTGCCGATTT
-GCCTGGAAAATTTAAATTCCGGCAATTTGCCGATTTGCCGAAAAATTGCA
-ATTCTGGTACATTGCCGATTTCCCAGAAAATTTCAATTCCGGCAATTTGC
-CGCTTTACCGGAAATTTAAATTCCAACAATTCTGGCACATTGCCGATTTG
-CCAGAAAATTTCAATTCTGGCAATTTGCCGCTTTACCGGAAATTTAAATT
-CCGGCCATTTGCCGATTTGCCAGAAAATTTCAATTCTGGCAATTTGCCGC
-TTTACCGGAAATTTAAATTTCGGCAATTTGCCGATTTGCCGAAAATTTAA
-ATTCCTAAGAAACAGTGGCCGAGATCAGTTTTGACGTCACTTCTCTTCCA
-GAAAATGCACTAAAGTGATGTGACGTCATGACTGAGTTTCTAGGCCACGT
-TTCGTTTGATAAAATTGGCGGAGGACCTAATTTCCAATGGAAAATAAATT
-CAATTTTTTTAAATTTCATAATTTTCTGAAAAACTCACTCCTGAAAAGCA
-TCACTCTCTTCCGAAATATCATCATCAAGCCCATCCTGCGTAGACTTATC
-ACTATCCGAATCATCATCCGAAAGAGCAAAAGCCGCCAGAGAGCTCGGAT
-CACTCAAGTCGAACTTTGTAAGATTCACAGCATGAACCTTCCGAACTCTA
-AACGGTGACTTCTTAACGTTCAAGGCTCCATTGCCCTTTGGAATCTCGCC
-GACTCGCTTGCGAACCGATGCTCCGCGATACGCAGACTGCAGAGCTATCA
-CCGATTCTCTTATCGATAAATATTTCTGTCGTTGCTTGTACTTCTTCCAA
-TTACACTGTATCGTTTGAGCTGCTAAGGCTTTTTTCCGAACTTCGGCTCT
-TGCAAATGATCCTCGAATCAATGCTTGGATCTTGATAATACCCTCTTTCA
-TTCTCAAATATCGCTTTCTAGCCAACATTGTCCTGAACCATCGTTGAAGT
-GTATCGATTGATTGCATAATTGTCCGATGCAAATGATCATCGAGTATCAA
-CTTTTCAGCGTCTCTCATAAAAATCTTATTGGTTCCATATTGAATATTAT
-CATTATCAATCGATGCATGGGAATGTATGTACTCTTTCACATCGTCCACA
-GTACTATCCCTTCCGTTTCGCAAAAGAATTCGGTATTGCTGGACAAAGCT
-TGGATACTCAATTCTCACAGAGTACCCGGCTCTCCGAATTCGAACGGTCT
-CGAGCATTCCGGTGTAGCGGAGCTGGCGGAGGATTATGTTGTCGTCGAAG
-TGGTTGGCGATCTATAAAATTTTAGGTGAGTGGTTTTTGTCAATAATTTC
-TACTTATATTCAGTCATATAAATAAAAACACATATAAGAAAAGTACCAAA
-AATTTCGATCACCTAATTTTTTTAATTTTTTCTATACTCTTACTAGTATG
-AAAGAGCAGGATACAAAAATAACTCCACAAGTGATAAACCACCTTTAATT
-GGATTAGTGTGTATCACTTTGAGTAAGCTAATATTGAAGGTTTAAATGTG
-GACTACCTAGCCTAGCAAGAGAGGTCCTGTAAGTAGACTTCAAAAATATA
-GATTATCTTATGAACATATGAACTTATAAACAAACGTTGGTCAAAAAGTA
-GGTGTTCAAAGATTCCACCAAAGTTTACAAACTCACCTTATCATTATTAC
-TCTTAATACACCTTATAAAATACGGCGTCGCGTTGGCCAGTGTGCTCATC
-AACCTCGTCAACGAGTACTCGAACTGCTTTGAAACCGACGATGGCTTCTT
-GGCAAGCCTCCGTCCTCCGATAGCCTCCTTCAGAATTTGCAGCGATTTCA
-GCAAGCTCATTTTGTCGTCAGACTTTCCCGCCGGGGTACGCCGTGCTTGA
-TTTCTAATCGTGTTGAACATGCTGGTATCACAAAAGTCTGGAACTTCACA
-GCGAAGTTCGCCACGTAGAAATGCGGAGAGAGCAGAGTCCGAGCCACGAC
-GGGGAGACGTTACGATGGAGTCCATTACTCGGAGATGGCCGGCGGATTCT
-GGAAATGTTGAATAATTATATTAAGGGCAGGATAGCTCAGTCGGTAGTGG
-TGGCCGCTAGCAATCTGGAGGTCACGAGTTCAAGTCCGCCTTCAACCCCT
-AGGTTCACCAAGCCTCTATTGGAAAATGGAGCAATCCACGACTGGATTAT
-AAGCCACAGCCTTCGGCTAGGACGTGGCTTAAATTGTAGCCCAGTGGGAG
-CACCACCAGGTAGTGTACCTGACTCCCAGATCCGCAGATACACTCAAAAT
-AAAAAAACTGCGTGGCGTGTACTGCAGAAAACCTAATATTTAGGCCCCGC
-CTTTTTCTCGTCCACTCACGGAGAAAAGGCAACAATTTTGAACCCAACCA
-ATATCAGGCCGCCGACATCTCACGGGTTCCGCGCGCCGCTGCGTTTAACT
-CGCTGTGGGCGTGGCGAGCTGTCTCCGCTTGCTGCGAGTTAAACATTGCG
-GCGCGCGGAACCCGTGAGATGTCGGCGGCCTGATATTGGTTGTGGTCAAA
-ATTTTTTGCCTTTTTTCCGTGAGTGGACGAGAAAAAGGCGGTGCCTAAAT
-ATTAGGTTTTCTGCAGTACACGCCACGCAGTTTTATTATTTTGAGTGTAC
-TTGAAGAACGGATCGTCCTTTAATCCTTTAATTATACATTGCATTTTTTT
-TCCACTTCTACGACTTCGAAGGGGCGCATTTACGCGCGATGGTCCCGCCA
-CCCACCCCAAAAATCAATGGGTGGCGCGTGCCGAGACCATCGCTCGTAAA
-TGCGCCCTCCTTTAAAGTCGTAGAAGTGGAAAAAATGCACTGTAGAAATG
-AAGAATACCATACTTTTTGTGTTAATTTTTTCTATAATATCGTAGTTGTC
-CATTTATTTAAATCTTCCCACTTATTTAACTAAGGACTTCTAACGCTTAT
-TCCAGTTATTGGTTCCGATTAAATCTACGAAAACTTGCCACTTTTCTGCA
-GTTTCCTTGTCGATTGCTTGAACGCGTTCATCGCCCGAAACACACTTCTC
-AGCACATTCCACCTGTGCACCGCCACCGGATCGATTCCCAGCAGGGTCTT
-CATCACTGAGCTCGTACTGGACTTCAGAGCGTTCAACACATCCTGTCTCA
-TTAGGTCCTTATTCTTTTCTCGGAAACCCTGAAATTTAGTTTTGACGTGA
-TGATGGAAGACGTTTTTTTTGGAAGTTGTGTGTTTACCGTAATTTGATAC
-TTGACTTTTCCAGCATAATGAGCCACGATGAATGCCGGCTCCTTCTTCTG
-TGGGGTCTCATAGTATTCGTTGTTCTGGAAATTTAATCATGGAACTAGTC
-ATGTAAAAACATTTGAAGGAGTTAAGGTATGTCCCGGAGGAGTGAACATC
-TTAAGCCTGACCTAGAAGTTGATCCAAGTGGCAAGCCGACTGGCCTGAAT
-CCTATTAACAGGCCTACATGTGAATATTAAAGGTGGATTAGCGCCAGTGG
-GAATTTTGTCTAAATACACTTATAACGATGCCAAACGATCGAATATCATA
-ATAAAACACTCCAAAAACTTTTAGATTTTTCATAATTTCCGGTCAAAGTT
-TTGGAACATTGACAAAATTTTGACAAATTTGAGCTTTTGAGGACATCAAA
-ATCAATGTAACATTTTTTTGGACCCCTACAATGTCTTTTTACGAAAAATT
-AAAACAAAATTATAGTATAACAAATAGAGAAAAAAATTTTTTTTAGTCGA
-ATTTGTGTCACTTTTTGACTGTAAATAAAAAAATTTTGAAAAATTTTTGA
-AAAGTTTTATCATGAGATTTGGTCATTTTGGGAGCATAGGAGTGGTTTTT
-AACAATTTCCACCACCGGCGCTACTCCACCTTTAATCGATAATCGATTGC
-AATTTTTTCATACCTTCAAAAACTGATTTAACTTCGCCAGCATTGAGTCA
-TCTGTTCCATTATTGATATTACTCTCCTCATCGACTAGCCTGAGAATTCC
-ATATGGTTTACTCTGAAAATTCATCGGAATTTATATATATGGATATATAT
-ATATATATATATATATATATATATATATATGTATATATATACATGTATAT
-ATATATATATATACAGTGTGGGAAAGTTCTATAGGACCCCCCCTAATTTG
-AAGGTTTGAGGAACTTCCGAAAATTTTTTTGAAAAACTGCTAATGCCATT
-CGTTTTTAAATTGAAAAAAACCTATATACATTTTTTTCCAGAAGTTTATC
-TCAAAAACTGAGGTCGCGCTGGAAAAAACGTCAAAATCCAGTGTGAAACT
-TCTATAGGACCCCCCGTTTTTTTTCACGATTTTTACTAAAATCAACAGAT
-TTTGGAATTTTTGACAAAGCTCAAATCAAGTTTGAGTTAGAAATGAGTTC
-AGATAAGCAGTTTTGACTTTAAAAAATTAATACGAAATGTTCTCGTGGGA
-TCTCCAGACTGGTTCTGATTCTTCCGAACTTTGATGTTCAAGTCTGTTTC
-AAGCTTCCTGGTGCTCTCGGTAATGCCAAAACTTGATAAACTCTCTTTAA
-CAAGTTCCTACTAAAATTCCTAGCACACACACCATAAAAATTTTTACGCC
-ATCCCCAAGAAACCAGTCAGAAACAGCGTATTAACAAGTTGCAGTTATTT
-TTGATCAACAACAGAACATTCATATACTAAAATCAAGAAAGGATCAATAG
-TTAATCGGGTTTCCTTGTGTGCGGATGATCTCAAACAGTCTGTCCTCCAT
-TGATCTGACCAAACTTTTCAGCTGGTTGTCCGGAATAGACTTCCAAGCGT
-CGAGAATTCCTTGCTTCAACGATGCAACTGTTGGGTAAGTCTTGTTCTGA
-GCATACACGATACGGACAAGAATCCCCCACAAATTTTCGATTGGATTGAG
-ATCAGGACTTCGAGCTGGCCAATCAAGAAGGTTGATCTTCTTGAGCTTGA
-AATAGTCGCGGGTTGAGTTGCTCACATGGATTGTCGCATTATCCTGCTGA
-AATCTAAAGTCTTTTCTGGAGTAGTGACGAAGATATTTGGAGAGCTCCAG
-TTCCAAGACGTTCTGATAGTCAGTGCTGTTCATCTTGCTACTGACGAACT
-GTATCTCAAGCTTCTTCTTCTCCGTGAACGCTCCCCAAACCATCACCGTT
-CCTCCTCCAAAATTACGTCTCGAAAAAACCATTGGTTCCTTGCGCAAATC
-GCGCCAATAGTAGCGGCAACCGTCAGGCCCATCGAGATTGAATTTCTTTT
-CATCGGAGAAGACAACCTAAAACAATGATCCTAATTATTCACTCTTGCTT
-TTTTAAATTCTCACTTTACTCCAATTCGTTCCCATATTGTTCTTAGCAAA
-TTCCAATCGCTTGAGTTTATGGTCTGCAGAGAGTAACGGAGCAGGGCGAA
-GTTTCTGACGAACGATTACACCAGATCGTTTGATGACATTGAGGATGGTC
-CTTTTTGAAGCAGACAATTGAAGCTCATTGCGAATATCTCTTGCCGTCTT
-ACAGGAGTTGGAGGCAGCACGAATCACATTTCGTTCGTCACGCACGGAGA
-GAGCTTTGCGACGAGGAGCTCTTTTAGATGTACCGTAGCTCACCGGATCC
-TTCAGATACTCGCGAATACAGTGTCGAGAACGGGAAATTTTCCTACTCAT
-TTCATGCAGGGACACATTGAGCAATTTCATAACATCCAGCTGAGCGCGTT
-CAGTGTCCGAAAGGGCAGATCCTCGAGGCATTGCAAGTTAGACTGCTTTC
-GAAGTAAGCTTTCCAGCCTCTATATGTGTGCCACAACACATGCCACAATT
-CCACATTTAATAATTCACGCAAAAAATAGTAAATAACATCTGTGAGGGAC
-AATTTAACTTGAAATATTGGTCCCATGGAACCTTGTAATCAAAGAAAAAC
-GATTTGATTCCTGATAAGCCTTCCATTGTTTCCTGCTGCATATTTTGCCA
-AATCAGCTTGACTACACAGTCGAAACATCTAAAGTGCGTGCTAGGAATTT
-TAGTAGGAACTTGTTAAAGAGAGTTTATCAAGTTTTGGCATTACCGAGAG
-CACCAGGAAGCTTGAAACAGACTTGAACATCAAAGATCGGAAGAATCAGA
-ACCAGTCTGGAGATCCCACGAGAACATTTCGTATTAATTTTTTAAAGTCA
-AAACTGCTTATCTGAACTCATTTCTAACTCAAACTTGATTTGAGCTTTGT
-CAAAAATTCCAAAATCTGTTGATTTTAGTAAAAATCGTGAAAAAAAACGG
-GGGGTCCTATAGAAGTTTCACACTGGATTTTGACGTTTTTTCCAGCGCGA
-CCTCAGTTTTTGAGATAAACTTCTGGAAAAAAATGTATATAGGTTTTTTT
-CAATTTAAAAACGAATGGCATTAGCAGTTTTTCAAAAAAATTTTCGGAAG
-TTCCTCAAACCTTCAAATTAGGGGGGGTCCTATAGAACTTTCCCACACTG
-TATATATATATATATATATATATATATATATATATATACATTTGAAACCC
-AAAAAGGACTTATTGGACTTACCTGAAACAGCTGCACACACTCCGTATTA
-TCAGTATACTCGATATTGGTCCAAGAAATGCCCTCCTTCAAGTACTCCTC
-TTGTTCAAATTGGAAAATATGTTGATTGAAATAGGACTGAAGTTTCTCAT
-TGGCATAGTTGATACATAACTGTTCAAAGCTGTTGCATTGAGACCCAACG
-TCTTCAAATCCGAATATATCCAAGATACCTGAAAATTACTTCAATTTTTA
-ACAATTGATAATTAATCTAACCTATATAATATCCCTTCCCAGCTGAGAAG
-TCCTTCTTCAGCAATGCCTGATTAATCCTGAGGACTATATAGTGAAACAA
-AGAGTTGTATATGCACTTTGCCATGGCATCTCGGGTGTTGGTGGCCTGAA
-ATTAATTTTTTTATCTTAAATTCTTAATTTCACTTCTGTATATATATATA
-TATTACCTCAGAGACACTATATCGCAAAACTACAGTTTCTGTCTTCATAA
-CATGTCGTTTCATAGTGAGAGCCTGCATGAGAGTGTCGGTTTTGATGTGA
-AGCAGATTTGCGACTAAATCCACGACTTCTTCATTTTCAATATACCCACT
-TTCATCGCTATGGTAGCCATGTCTCTGGAAAATTATAGGAAAAATAAAAA
-AAATTTGATGATGTTATTATATTAGGAATCCTCTAAACAAGGGTTTTCAG
-GTTTTTTGGTTTTACGATTATTCAAATTTTTATGGAAATTATTATAATTC
-AAATAATTTTCGTCACTATTATAGCCATGTTGTTGAAATAATATGCTATT
-TTTAAAGGTGGAGCACCGAAATCTGGAAACTATTTTTAAATGAGTCCAAA
-TTTTCCCCTGATTCCGAATATCTATGCGAAAAAATTTTAAAAAATTCATT
-TATCAAATTTTTCAAATTTTTCAAACGCCGAATTTTCGCGCCAGAAACGC
-CGTGTGCACGTGGTATCAGAGTGTCTCATTTTGGCTTGATCTACGCAGAT
-CTACAAAAAATGCGGGAGAAGAGACGCAGAGTTCTCAACTGAGTTCGCAT
-GGTTAAAAATGTGCTGACATCACATTTTTTTGGCATTTTTTGTAGATCAA
-ACCGTATTGGGAGAGCCTGGCACCACGTGAGTAGGCAGGCATTTTTTGCC
-TGACTGCTTGCGGGTGCCTCGTTTTTTCCTCAGAATTTTTTGGCGCGAAA
-TTCAAATTTTCAAATAATTTTGAATATTTTCGAGTGAAGCTTTAAAAAAT
-TGTTTGTGCCAAATTTGAGTTTGCAAATAAATTATCAAAAAATGTGCTGA
-CGTCACGTTTTTGAGCAAAAAAATCCCGCATTGTTTGTAGATCAAACCGT
-AATAGGACAGCCTGGCACCACGTGCGTGTGTCGATTTACGAGATTTGTGT
-ATATTTACGAAATTTTTTATCTTTATCAGACTCTGATTTCCGTTTCTCAA
-CGAGTTTTCTTCATTTTTGTATGTGATTTTTTTAAGGTCCATTAAATATT
-TTATCATCAAAACCCTAGCAAAATTTTTGGTTTTCAGTCGGTAAAATCAT
-ATAGGTAATTGGATTTTCCGTCAAGTTGTGACCTAATAGTAAGCATTGGA
-AATTTTGCCAGTTTTAAATAATTAATTGACCCTAAAACACACATTTCAAA
-AAAAAACCGATAAAAATTAAAAATTCCGTAAATATACACAAATCTCGTAA
-ATCGACACATGGCTCTAGCGCGAAAATTCAAAAACTCTTGGGTGTACAAA
-TAGCGATTTCAAGCTCAAATATAAAATCGTGGAAATTTTTTAAAAATTTT
-TTTCACATAGGTATTCGGAGTCAGGGGAAATTTGGAGTCAATTAAAAATA
-TTTTCCGGATTTCGGTGCTCCGTAGAACTCTCTGAATAAAATTTTAAAAC
-TATGGCAATAGGCAATTATTCGGTAGTTAACTTCTGAGTTGTATTTCTTT
-TTGAATCTAAACCGTCCCAATCATTTACCTTGATATATGTGATATTGCCA
-AGAAGCAACACTGCCGAAATAATCCCGAAGATGGTCTGCTGGGTCTTTGC
-ACAAAATCCGACGGAGCTCATTGCATGCCTCAACCTATCAAACTCATTCC
-GCTCGTTCACACCTTCCAGTGCAAATGGCTCGTTCTGGAAATTTTTAATT
-TTTTTTTAATTTTTTAAAAAATCGCTTTGAGGTCAGCGAATGTATCCCAT
-ATTCGCTCCAAACTTTTCCCAGCTCACCTGATTCAAATACTTATAATCAT
-GTGGCTTCAACAAGAAATATTTCTTCCTTTCTTCCTCGTCTGCACCCTCC
-AGAAGGTAGTAGAATACGTGGTAGTTTCTGAAAAAAATATTAAAGTCCAA
-GTGAGACACCAAGGGAGTTTATGTACCGTTCTCCTTTAGTTTGAAATATG
-ATGCGTGATTTTTCCAGCAGGTAGATCTCCACGTTTGCTCTGAAAAGTAC
-AAGTATAAGGCATTTTTTGTGGTATAGACATCAGGAGAAGGCTTCAAATT
-TTACGTTCAGGTCAATTTAGGTCATAGTGCCTAGTAAGTATGGTACCTAT
-AAGCTTGATTACTGCCAAAGTAAAAATTTTCCAATTCCGGCAATTTGCCG
-ATTTGCCAGGCATTCCAATTCCGGCAATTTGCCGATTTGCCAGGCATTCC
-AATTCCGGCAATTTGCCGGTTTGCCGGATTGCCGGAAATTTAAATTCCGG
-CAATTTGCCAAATTTTTTTTCATTTTCGGCAATATACTGGATTGCCAAAA
-TGTTACGGCAACTTGCCAATTTGCAGGAACTTTTCATTTTCGGCAAATTG
-CCGGTTTGCCGATATCCCAGAAATTTTCAGGTCCGGCAAGTTGTTGATTT
-GCCGATTTTCCCCGGAAATTTCAGTTCCGGCAACTTGCCGATTTGCCGGA
-AATTTTCAAATCCGGCAATCGCGGGAAATTTCAATTCCGTCAAATTACCA
-ACATGCCGGATATTCCAATTCCGGCAATTTGCCAATTTGCCGAGCATTTA
-AATTCCGGCAATTTGCCGAATTGCTGAAAATATCAATTCTGTCAAATTGG
-CAATTCGCCGGACATTCCATATCCGACAATTTGCCGATTTGCCGATTTCC
-CAGAAGTTTTCAATTCCGTCAAATTTCTAATTTGCCGGAAATTTCAATTT
-TACTAAGTCGCCTGCTAGCCTCCTAATCTCACCCGGAAACCATTCCATTC
-TCCCGATAGTTGATTTTGATGAATTTTCCAAATCTGCTACTATTATTGTT
-CGTTAATGTGACAGCATTTCCAAAAGCCTCTAGAACAGGACCAGCTGACA
-GAAGTGTCTGCTCAGTACTGCAGCCTGTTGAACCTTTCTGTGATAGCGAT
-ATCAAATGGGACATCAGATGATTCGTGGATTCCGTTTTTCCCGAACCACT
-TTCCCCGGAGATTACCACGCATTGATTTTCCTTGATACGGAGCATGCTGA
-AAAAATTGTTTTTTTAAAAATTAGTAGTGACATTTAGTTAATCCAGCATC
-AGAATGTATATCTCTGAAATTTTTTTTTTTTGAAATCAAAAGTGCTTTGA
-GGGTCTTGAAACGAACACATAACTGCAAAAAAATTGGTGGCCGAGTTTAT
-AATCGGCCACTTGGCAAATATACAAGCCAATACACAAAGTGAGCACCTAC
-GTGGCCGAGTGAAGAGAAAACTCGGCCACCGATTTTTTTTGGTCACTTGA
-AATTTCAAAAAATAGTAACTGGGTTCCGGTAAGAACTTAGAACTCACTTG
-TGGTAACAGACATCGGCGATTGCAAAAATGTGCGGTGGTAGTGAGCCGAG
-CCGCTTACTTTGAAAGTATAGCCTAGCATATTTTGGGTTGTAGATCGGAA
-AAAAGCAAAACGGGTTCACGGCTACTAGAATTGGACCGATGTACGTGTAA
-ATGTGCCCATTCGCGAATCTTTCCCGCAAATTGTCCAAGAGGGTTTGCTC
-CGTGAGCTCTGGCAAGTTACAGAGATCGGCGTACTCGCGGTCCTGAAAAA
-TTTTAAGGTTTAAAATTTTTTTAAATATAAAAATATTTAAAGGTGGAGTA
-CAGGAAATCTTTTTTAATTACTCCAAATTTTCCACTGATTCCGAATATCT
-AAGTAAAAAATTTTGAAAAAATTTCCCTGATTTTGTATTTAAGCTTGAAA
-TTACGATTTTCATTTGTGCCCGCACCACTTTTTTCAAATACGCCCAAAGA
-AATTCGCATTGGAGCGCGTTTGCATCGTTTGATTTTCGTCGTTTATTTTA
-TTTATTTTCCACGGGGTTCTGGCCTTCTTCATTGAATTTTCGCGCTTCAT
-TGACAATCGCCTGCCGGACAACACATGGAAAAGTGTCGTGTACTCCACAC
-GGACAAATACATCAGTTTTACAACTAAAGACAAGCCGCGACGCGACACGC
-AATGCGCCGTAAGTCTACACAAAATCTCTCCGACCCAAAATGGCCTAGTT
-CGGCAAACTCTGCCATTTCGATTTATGAGGGAAGCCAGAATTTCGTGATT
-TTCGCCGAATTCAATTTTCTTGAACCAGTTTCAATCATTTTTGTCGAGTT
-TTTGCTAGTTTTTTTTTTGACAAAAAGGAATGAAACTGGTTAAAAAAACT
-GAATTTGGCAAAAAATAAATAAAATCTTTAAATGAAGGAAATCAAAGCGC
-GCTCCAATGCGAATTTATTTGGGTGCGCATTTGACAAAAACACGTGGTGT
-CAGGCAAGGGTGTCAATGTCCCGTAAAAATTTCGAAAACGGGACAACGGG
-AATTCCCGTTCCCGTGAAAATTTTAAAAACGGGAAAACGGGAATTCCCGT
-TCCCGTGAAAACTTCAAAAACGGGACAACGGGAATTCCCGTTTTTTTGAA
-AACACTCAAAAAACGGGACAAACTGGGCGGTTTAAAAAAAAGAGTGCATA
-GTTGGCGTAAATTTTAGTGTATTCGAGGCAAATTATAAAAAAAAACTGCA
-TTATAAACATTTTTATCGATTTTTTCAATATTAAACAGATATTTAAAAAG
-CCAAAAAATGAGGGAAAATGTCCCGTTCCCGTGAAAATTTTAAAAACGGG
-ACAACGGGAATTCCCGTTCCCGTGAAAACACCCCAAAAACGGGACAACGG
-GAAAAACGGGAAACGGGAATTGACACCCTTGGTGTCAGGCTGTCTTATTT
-CATTTTTATCTACAAAAACAGCGGGAATAGTTTTCCAGAAAAATTCTAAC
-GTCTCTTAACCAGGCGAAATAAAATGAGAAGTCTGCGTCTCTTCACCCGC
-ATTTTTTGAAAATCAAAAAAAGAGACCGGGCACAAATTAAAATCAGGGAA
-AATTTTTTTAATTTTTTCACATCTAAATTCGTAATCGGGGGGCAAATTTG
-GAGTGATTTAAAAATATTTCCCAGATTTCGGTACCCCACCTCAAAAAAAA
-ATAATTAAAGAATTGCCTTACCTGTGGCTGAACCAAGAATTTCGTAAGAA
-AAGCGTCAATCGATGAGGCGACCTCTGCACTTCCAAACCGAGTGCCGCCG
-GTTGCCGCCCGATAACCGCGGTGTCGAAAAACAAATCGATTTTTTGGAGT
-GGCACTGTCCACCACTACAGGCAGTCTTGACCAGATGGCCTGTACCGCGA
-CTGGGTATTCCCCGGGGTCTAGGCGGCGTTCTTTATAGGTTTGACCGTCG
-GGGGTGCCCATCATTTCGAAGAGGTCAAAGTCTTGTACCGACTGGCCTTC
-TAGTTCTGGAAATTTTGACTTTAGAAAAGAAATCATTTTTTTCCTTTTTT
-TTTTAAATTAGCCCGTGGCTTTTTTCAAAATTAAAAGAAAATTTGAAAAA
-ACATTGCATTAGAGCGCGTTTGCATTCACTCCATGCAGTCCAATTTTGCT
-GGGAGCTTGAGTGTCTCATTCGACTTGATCTACACAGATCTACTAAAAAT
-GCGGGAGAATAAAATCCACTGATATTGTATGTTTAAGAATGTGCTGACGT
-CACATATTTTTGTGCAAAAAATTCCCGCATTTTTTGTAGATCAAACCATG
-ATGGGACAGCCTGGCACCACGTGAGATTGTGTCGACAAATTTTTGTTGAA
-GATGTATGGCCAAAAACGGCACATTTAAGTAATTTATCAGTAGAGCGCGT
-TTGAAATTTTTTTAAAAATTCTTTTTAAAAAGAGTTCCCACTACCCCAAG
-TCCTCCGATTTTTCTAAAAACTAAGAGAAGGGAATCTACGACCCTGAGCC
-TTTAAAACCTTACCAGCTCTCCCGGCGAGCACTTTTTCGATGAGCTCCTC
-CGTCGTGCACCGCTTATGAACCTCCAAGTGTACCGTATCATTTTCACAGT
-CGGGATTGAAGCTGTGCATATAGACGGCTACCGTATGTGTGTGTGCATCG
-TCTGTCGCGTTGATTGTGTGAGCACGTCGGGGAAAACATCCCGTCGCTCC
-AGCTGATATTGAGTCAAATGACATTTAGTTAATCCAGCATCGGGATGTAT
-ACGTCTGTAAAAAAAAATTTTTTTTGAAAGTAAAAGTGCCTGGAGGATCA
-TGCAACGAACACAAAAATTTCACAAGACCGCGAAAAAAATTGGTGGCCGA
-GTTTTCTCTTTCGCGGTCACTTAGGAAATACTAAAATCGCACGGATTTCT
-GGCTTCTCTCATAAATTGAAATGGAAGAGTTTGCCGAACTAGGCCAGTAT
-AGCTCGGCCATATCTGGGGTATGTTTACGACTTTCCCACGCGTTGGGCGA
-TTGTCAATGGAGCGCGAAAAACTCAATGAGAAAGGCCTGAACCCCGTGAG
-ATCGAAATGAAAATTTGCTAAATGGCCGAAAATTGAAAACTCGGCCGCCA
-ATTTTTCCACACGGCCACAGGAAAAATCGTAACAAAAATTGAGAGAAATT
-TATTAGAAAAAATCTGAAAGTAATTTTTATTGCACCGTGGCCGCAAAATG
-TAAAAACACGGCCACCGATTTTTTTAATGTGGGGAAAAAGTTGGTGGCCG
-AGTTTTATATTTTGCGGCCACTTAGAAAATATTTAGATCGAAGGGAAATT
-TTGTTGAAAATACGTTTAACGAAAACCAGTCAATTTTTGTTACATGACCG
-AAAATTGAAAACTCGACCACGGATTTGTTATGCTTTATAAATTTTTGAAA
-CTATTATTTTTTGATTCAGAAATTTTTGGAATTGAAAAAAACTCGGCCAC
-ATTTTTTTTCTCACGGTCACAATTTTCTTTGTGATCGTAAAAATGGAAGC
-TCGGCCATGGTGGCCGAGTTTTTTTCGCTGCCACTGGTAACACGTGGTTG
-GGTGAAGAGAAAACTCGACCACCGGTTTTTTTTGGCCACTGAAATTTTTA
-AATTTCAAAATATTTTAAATTTTGCTGCAATCTTTCACCACAACCGCGAA
-AAAATGAAAACTCGGCCACCAATTTATTTATTTTCACTGGGAGAAAAAAT
-ATTGTTAGCCAAGTTTTCTTTTAGGCAACAGAAAATCAAAAAATGAGCGA
-TTTTTGTTACGTGGCCGTGAAAAGAGAAAACTCGGCCACCAATTATTTTT
-AATTTGAGGCACTGTTGTAAAATCTTATAAAAAAACAGGTTTAGTACATT
-GAACTCAAAAATAAGGAAGATTTTTGGAAAAACAAAAATTGCTGGCCGAC
-AGCTGGAAAAAACTCGGCCACCAACTTTTTCCGGTCACACAGCAAAATCT
-CTCGATTTTCGATGTTTGAATATTGAAATCTGGGTTGGATTTTTTAGTAT
-CATTTCATTTCCGGTGGAGAAACGAGGGAGAGAAAAAGAGAAAAAAGATT
-TGTAGTGTCCCGGGAAGCTCTCTTTCTCATGTGGGAAGAAAGTGGAAGAA
-GCTTCTGCAGCAGCAGCAGCAGTGGTTCACGAAAGAGAGAGAGAGACATG
-TTGGACATGAAAATGATGAAAAATAAGAAGATGAAGAAGAGAATTACACA
-CTACCACCACAACACAGATTATTTTTATCACGTTTTGAGGGGGCGCTTCA
-CACAATTTTCATGGCCTAGAAATTTAAATTTGGTGGCCTAGAAAATACTA
-TATTAATTATATTAATTATTCTACGAAATTTCAATAATTTAAACGGGAAA
-ATTTATTTTAAAAAAGCCTAGAAGAGGTTTTGAAATTGGTGGACTAGGAA
-ATGAAAAATTGTGTTTTTGGAATTTTCTAGGCCATTTGAACTTCCTGACG
-TCCACAATTTTCATGACTTCGAAATTTGAATTTGGTGGCCTAGAAAATCA
-TAAAAACTAAGAAATCGAGAAAAAAGCATGGATGAAATTTTGAATTTTAT
-AGGTCATTTGAAATTTGTGGCCTAAAAAATGAAAAATGATTTTTTTTTTT
-TTGAATTTTCTAGGCCACTTGAATTTCCTGACGTCCACAATTTTCATAGC
-CTAGAAATTTAAATGTGGTGGCCTAGAAAATAATTAAAACTAAGAAATCG
-AGAAGAAAAGCGTGGAAGAAGTTTTGTATTTTCTAGGCCATTTGAATTTG
-GTGGCCTAGGAAATGAAAAAAAGATTTTTTAGGAAATTTCTAGGCCACTT
-GAAGTTGGTGGCCTAGGAAATTAAAATTTGTGTTTTTGGCATTTTCTAGG
-CCATTTGGATTAGGTGGCCTAGGAATTGAAAAGTAGTTGTTTTGGAATTT
-TCTAGGCCATTTGAATTTGGTGGCCTAGGAAATGAAAAAATATTTTTTAA
-AGGAAATTTCTAGGCCATTGAAGTAGATGGCTTAGGAAATAAAAAAAGGT
-TTTTTAAAGGAAATTTCTAGGCCATTGAATTAGGTGGCCTAGGAAATGAA
-AAATGATTTTCTTAAAATTTTTTAAGCCACTTGAATTTGACGGCCTAGGA
-AATGAAAAATGGTTTTTTGGTAATTTCTAGGCCACTTGAATTTGGTGACC
-TGGGAAATGAAAAATGATTTTCTTGGAATTTTTTAGGCCACTTGAATTTG
-ACGGCCTAGGAAATGAAAAATAGTTTTTTGGTAATTTCTAGGCCACTTGA
-ATTTGGTGGCCTGGGAAATGAAAAATGATTTTCTTGGAATTTTTTAGGCC
-ACTTGAATTTGACGGCCTAGGAAATGAAAAACAGTTGTTTTGGAATTTTT
-TAGGCCACTTGAATTTGACGGCCTAGGAAATGAAAAATAGTTTTTTGGTA
-ATTTCGAGGCCACTTGAATTTGGTGGCCTGGGAAATGAAAAATGATTTTC
-TTGGAATTTCTAGGCCATTGAATTAGGTGGCCTAGGAAATGAAAAATGAT
-TTTCTTAAAATTTTTTAAGCCACTTGAATTTGACGGCCTAGGAAATGAAA
-AATGGTTTTTTGGTAATTTCTAGGCCACTTGAATTTGGTGACCTGGGAAA
-TGAAAAATGATTTTCTTGGAATTTTTTAAGCCACTTGAATTTGACGGCCT
-AGGAAATGAAAAATAGTTTTTTGGTAATTTCGAGGCCACTTGAATTTGGT
-GGCCTGGGAAATGAAAAATGATTTTCTTGGAATTTTTTAGGCCACTTGAA
-TTTGACGGCCTAGGAAATGAAAAACAGTTGTTTTGGAATTTTTTAGGCCA
-CTTGAATTTGACGGCCTAGGAAATGAAAAATAGTTTTTTGGTAATTTCGA
-GGCCACTTGAATTTGGTGGCCTGGGAAATGAAAAATGATTTTCTTGGAAT
-TTTTTAGGCCACTTGAATTTGACGGCCTAGGAAATGAAAAATAGTTTTTT
-GGTAATTTCGAGGCCACTTGAATTTGGTGGCCTGGGAAATGAAAAATGAT
-TTTCTTGGAATTTTTTAGGCCACTTGAATTTGACGGCCTAGGAAATGAAA
-AATAGTTTTTTGGTAATTTCGAGGCCACTTGAATTTGGTGGCCTGGGAAA
-TGAAAAATGATTTTCTTGGAATTTTTTAGACCACTTGAATTTGACGGCCT
-AGGAAATGAAAAATAGTTTTTTGGTAATTTCTAGACCACTTGAATTTGAC
-GGCCTAGGAAATGAAAAATAGTTTTTTGGTAATTTCTAGGCCACTTGAAT
-TTGACGGCCTAGGAAATGAAAAATAGTTTTTTGGTAATTTCTAGGCCACT
-TGAATTTGGTGGCCTGGGAAATGAAAAATGATTTTCTTGGAATTTTTTAG
-GCCACTTGAATTTGACGGCCTAGGAAATGAAAAATAGTTGTTTTGGAATT
-TTTTAGGCCACTTGAATTTGGTGGCCTAGGAAATGAAAAATGATTTTCTT
-GGAATTTTCTAGGCCACTTCAATTTGGTGGTCTGGGAAATGAAAAATGAT
-TTTCTTGGAATTTTTTAGGCCGCTTGATTTAAGTGGCCTAAGAAGTTAAA
-AATAGTTGTTACGGAATTTTCTAGGACATTTGAACTTGGTGGCCAAGGAA
-ATGAAAAACTTTTTTTTTTGGAATTTTCTAGGTTTCTGTAATATTAATTT
-ATTCATTTAAAAAATTAAAAAACATTAAATTTTTTTTAAATTTCGTGTTT
-CAAAAAAAAAATCAAATTTGCCCAAAACTTCAAAAATAAGCTAAAAAATT
-GTAAAACGATACAGAACGGCTAATAAAACTTGAAAATAATAAGCGTGATG
-AGTCGGAAAGAGCCGCCGGCTGGGACCTTCTTTTTCTCTTTTTTTCTCCT
-CTCCCATCCCGAGCAGGAGCAACACAACGAGAGAGCACAACAAGAAGAAA
-AAGCAGATAGATATATAGATATATGTTGTCTTCTCTTCATATTCTTTCTT
-TTATCTTTTCATTCGAAACAACACTTGGTTCATTTCTCCCGTTGGACGGG
-GGGGGGGGGGGGGTGACGCGGGAGACGAAAAAAAAAAGAAAAATTGGGAT
-GGGAGTTGGAGAATGTTTGGAAAAAGATTGATTGATCAATCAATTTGCCA
-GCCGAGTCTCGGCTATTTTCGGAAATCGGGGCTATGCAAATGCGCCCTAC
-TGATAAAATGGGACGTGTCATTTAAACTCCTTGGTTTTTTAAAAAGAAAC
-GCAAAATCGGCAAATTTCCAGTTTGCCGATTTGCCAGAAATTTTCAGGTA
-CAGCAATTTTCCGATTTGCCGATTTGGCGGAAATTTCAATTTCGACAAAT
-TGCCGGCTTGCCGAAATGCCAAAAATGTCCAGGTCCGGCAATTTGCCAAT
-GTTGATTTTTGGCAAGTTGCTGGTTTGCCGGAAGTTTTCATTTTCGGCAA
-ATTACCGATTTGCCAAAACGCCAGAAATGCTCAGGTTCTCTAAACCGCTG
-GTTTTCCGGAAATTTTTCATTTTCGGCAAATTGCCGGCTTGCCAAAATGC
-CGGAATTTTTCAGGTCCGGCAATTTGCTGATTTGCCGGAATTTTTCATTT
-TCGACAAATAGCCGGTTTGCCGAAACGCAAGAAATGCTCAGGACCGGCAA
-TTTGCCGATTTGCCGGATATTTTCATTTTCGGCAAATTGCCGGTTTGCCG
-ATATGCCAGAAATGTTCAGGACCGGCAATTTGCCGAATCGCCGGAATTTT
-TTATTTTTGGCAAATTGCCGATTTGCCGAAAGGCCAGAAATGTTGCGGTC
-CGGCAATTTGCCGAAATGCCATAAATGTTCAATTTCGGCAATTTGCTGAT
-ATGCCGGAGTTATAAATTTCGGCAAATTGCCGGCTGGTCGATATGCCGGA
-AATTTTCAGGTCCTGCAATTTGATGATTTGCCGAAAAATTTATTTAAAAA
-AAAAATTAATTTTCGCCAGACAGGAAGTCTCTAAAATCTCATTTAATAAG
-AAGAAACAAAAGAAACAAATAATGGCCTAACAAGTTTCGAGTTACAGAAA
-CCTAGGCCACTTTGAACACCGGCGTGGCCTAGAAACCCAGTTCCACAAAA
-ATAAGAAAAAATTAAAACTCGGCCACATAATCTAGGCCAGGAGCATACAA
-ACACTCCACGAATATTAAAGACTCTTTCTAGGTTAGTGGCCGTTAACGAT
-GGAAAACTCGGCCATCTGCCAATTTTGTTGCTTAAAATTGGAAAAATAAA
-GTTTTTTTAACTTCAAAAAAAAAAGATCAAAAAGTGAAAAGCGGGGATTT
-TTCTCACACAATTTAATAAATCTGTAGCCGAGTAGCGGAGAGCTCTCGGA
-GCTCAACGTGAATTTCTATTTGGACGGTAAACATACTCAGCCACCCCACC
-CCAGCCCACCGTTACTGTCTTTTTTTTTCTTTTTTATTATCAACCAGCAC
-TTATCACCTTTATCTTTGTGTGATCCCGCGCCGCGCAAGAACGAGAGAGA
-GAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGA
-GAGAGAGAGAGAGAGAGAGAGAGAGAGGGATATTGGTGAGACGCAGACAA
-TTAGAGTCACTCGTGGGCTCTTTCACACATGTGATATTGAACGAGAAATT
-GCGCACCTAGGCCACAAAAAAAACAGTGTATTCGATTTCATGATAGGGGA
-GAAGCTGGCACGGTGCCAAGTTTCAGAAAAAATATGGAATTTTTGCTTGA
-AGCATGGTGAATCAGACGTGCTTACGTCACAATTTTTCGGGATAAATATT
-CCCGCATTTTTTGTAGATCAAACCGCAATGAGACATCCTGATACCACGTG
-AGGTTAATTAAAAGTATTGATCGGGATTTTGAGCGTCAAATATGGTGTAT
-TTACCGGCAACCCTGATGCGCCAGATTTGACGCGCAAATCCTTCATTTTA
-ATAAAGTTGGGCGTCAAATGTGATGCCTGAATTTTCAATTTTTTGAAATG
-TTTTGATTTCGTGAAAAATAACGGCGAATTTCAGAAAATTTATAGAAAAT
-TTTCATTTGTTGCGACCAAAAAATCTTAAAAACGACCAAAATTCTCAGGA
-AATTCACATTTTTCGCCGAAAAAACCATTTTGCGCGTAAATTCTGATGTA
-TTTTGCCGTAGGCTATGTGTGAAAACACTGCCGGTAATACGTCATATTTG
-ACGCGCAAACCACAAAAATCCTCGAAATTATTCCGGGTGCACAAAATTCT
-GAGAATGCGTACAGCGCAACATATCTGACGCGCAAAATATCTCGAAGTGA
-AAAATACAGTAATCCTTTTCAAATGACTACTGTAGCGCTTGTGTCGATTT
-ACGGGATCTCGACTTTCGAAATGGATTAAAATATATTATTTATCAATAGA
-ATATTACAAAAAGAAGTTAATTTCGTAAATCGAGCCCGTAAATCGACACA
-AGTGCTATAGTAGTAATTTTAAGAATTACTGTAGTTTTCGCTACGAGATA
-TTTTGCGCGTCAAATATGTTGTGCAGTACGCATTCCCAGAATTTTTCGTT
-CCCTTTCACAAAAATCTTCAAACTTGCGCGTAAAATTTGGTGCATTGGTG
-CCTGTGAGGGGTTCACCTATACAAGTGGTGCCAGGGGCTGTCCCATTACG
-GGTTGATCTACAAAAAATGCGGGATTTTTTTGCCCAAACCATGCGAAATC
-AGTTGAGAACTCTGCGTCTCTTCTCCCGCATATTTTGTAGATCAACGTAG
-ATCAAACACTCTGACACCACGTGGGCCGATGATGTAAGTGCACCAGATTA
-CACGCGCAAAAACTGAAAATCTGAAAAAAAAAAAAGCGAAAACTGTCAAA
-TTTGAGCGAGTTTTTTATTCCACGAATCACAAGAAAAATCAATAAAAAAT
-CGATAATTAAAAAGTGAGTATCATATTATTCGACAACAGAATTTCCAGTT
-TCATCAGTGAGCATTGTAAGTATACGATGAGCCATCGACGGTCCAACACG
-TCTCCCGTTCTCTGCCACAAGTTCGCCAATCTCTTGAATAGCGAGCGAGT
-AGTCCATTTTCGAGTATTTATCGATTGCGGCAATCGGATCAGGGATTAGT
-TCGAGAATTGCACGTCGCTGAGCATCCGACAGCCGATCGATTGTTGTGAG
-CATTTTCGACCACCAATCCGTGACGATTTCCGAGCGACTTCCGATCACAA
-TTCCCTGGAAAAAAATCATCGGGGTTTCATGCTTTTGATCTATTTGATCT
-ACAAAAAATGCGGGAATTTTTTGCCCAAAAATATGTGACATCGTCAGCAC
-GTTTTTAACCATGTGAAATCAGTTGAGAACTCTGCGTCTCTTCTCCCGCA
-TTTTTTGTAGATCTACGTAGATCAAGCCGAAATGAGACATTCTGAGTCTT
-GACACGACAAATTCCCGTTAATTACATACGGATGTGAGCCTTTGTTGGAT
-GTGAGAGAGTTTCCAGGTTTTTCTCGAAAGCTTTTCTTAAAATTTCATTT
-AAAAAATAATTTTTTAACGAAAAACTACAAAAAATCATCCGAAAAACCTG
-GAAAATCGATGAAAAACTCTGTGACAAATACAGTACTGTTTAAAGGCGCA
-CGCCAGTTTGTGTTCTGAGAATGCGTATTGCACAACATATTTGACGCGCA
-AAATATCTAAACTACAGTAATTCTTCAAATGACTACTGTAGCGCGCTAGT
-GTCGATTTACGGGTTCGGCTTTCGACAAATTTCGAAAATCGAGCTCGTAA
-ATCGACACAACCGCTACAGTAGTAATTTAAAGAATTACTGTAGTTTAGAT
-ATTTTGCGCGTCAAATTTGTTGTGCAGTACGCATTCTCAGAACTTTGCGT
-TTTCGTGATTTTTTTTTTCAAATTTTAACTGCAGTAAAAAAATAAAACAA
-CATAAATTTCATTTAAAAAAAACGATTTTAGCGCTCTTTAAAGGCGCACA
-CCCGTTTGTGTTTTAAAAAAAAAAAATGTCGCGTCGAGACCAGATTTCTG
-CAGATTTCGCGCCAAGACCCAACCTTATCCCCCTGATACTGTAATTTGTG
-GCCTCCTGCCCCTCCTGCACCACCACCACCGCCCCCATCACTTCCAGCGT
-CGAGCTTCTTCTTCTCCTGTCTCGCCAAACTTCTCAAGTACTGAGCAGTG
-AATAGTGCCAGCTCGGCGATCGTTTCGATTTGCACAATTTGTGCACGATG
-TTGCTCGTAGATTTGCAGCGATAAATTGTGCAATTTCTTCTTTTTCGCAA
-TTTCTGCCCTGCCGAATGAGACGATGAGCATTGTGCAGCGGCCACCGTTT
-TGAAATCCGGATTTTTGCTGGAAAAATAAAATTTAAATGAGATTTTTTTT
-AGGTCTCGCAGCGATTTCTCTGGCTGTTTCAATTACGGTTTGATCTACAA
-AAAATGCGGGAATTATAAAAAATGTTTGCCCGGTAAAATGTGACGTCAGC
-AAAGTTTCTTAACGCTGCGAAATCAGTTGAGAACTCTGCGTCTTTTCTCC
-CGCATTTTTTGTAGATCTACGTAGATCAAGCTGAAATGAGACACACTGTG
-TGTGCAAACACTATCCACAATACATCATATTTGACGCGCAAACTCTAATT
-TTTTTTTCGCTGCGAGACCTAAAAAATCTCAAACTTTCCAGTGAAAATCC
-GGATTTTCTTCATTTTAAAAAAGTTGCGCGTCAAATGTGATGTGCCTGAA
-TTTTCGCTTTTTTGAAATTTTTTATTTCGTTAAAAATGACGACGAATTTC
-TGAACATTTATAGAAATTTTAAAAATTTTCATTTTTTGGGTTAAAAAAAT
-CTTAAAAACAACCATAATTCTCAGGAAACTCAAATTTTTCGCCGAAAAAC
-CCATTTTGCGCGTGAAATCTGGTGTATTTTACCGTGCCTAGGCTGTGTGA
-GAACACTGCCGGTCATACATTATATTTGACGCGCAAACTGCAAAAATCGT
-CGGAATTATTTCGGGAACACAAAATTCTGAAAATGCGTATCGCGCAACAT
-ATTTGACGCGCAAAATATCTCGTAGCGAAAACTACAGTAATTATGTAAAT
-GACTACTGTAGCGCTTGTGTGTCGATTTAAGGGCTCAATTTTCAAAAAAT
-CGAGATCCCGTAAATCGACATAAGTGCTATAGTTGTTATTTAAAGAATTA
-CTGTAGTTTTCGCTACGAGATATTTTGCGCGTCAAATATGTTGTGCAATG
-CGCATTTTCAGAATTTTGTGTTCCCGGAATAATTCCGACGATTTTTGCAG
-TTTGCGCGTCAAATATGATGTATGACCGGCAGTGTTTGCCCACATCGCCT
-AAGCACGGTAAAATACACCAGATTTTTCGCGCAAAATGGGATTTTCGGCG
-AAAAATTCGAATTTCCTGAGAATTTTGGTCGTTTTTACTATTTTTTAATC
-CAAAAAAAAATGAAAATTTTTAAATTTTCTATAAATTTTCTGAAATTCAC
-CGTCGTTTTTCACGAAATAAAAAAATTTCAAAAAATTGAAAATTCCGCCA
-CATCACATTTGACGCGCAACTTTTTTAAAATGAAGAAAATCCGGATTTTT
-CTGGGAAATTTGAGATTTATTTAGGTCTCGCAGTGAAAAAAAAATTAGAG
-TTTGCGCGTCAAATATGATGTATGACCGGCAGTGTTTGCCCACATCGCCT
-AAGCACGGTAAAATACACCAGATTTTTCGCGCAAAATGGGATTTTCGGCG
-AAAAATTCGAATTTCCTGAGAATTTTGGTCGTTTTTACTATTTTTTAATC
-CAAAAAAAAATGAAAATTTTTAAATTTTCTATAAATTTTCTGAAATTCAC
-CGTCGTTTTTCACGAAATAAAAAAATTGATAAAATACACGATAAAATACA
-TCAGATTTTACGCGCAAACTGGCAAAAAAATTGATTTTTTGGCTTTTTCG
-GACTAAACATTAGAAAAAAGACTATACTCCAACAATTTTTTTCAGTTTTT
-TTTTTGAAATTTTTTTTTTTTCAGTTTAAAATGTTTTCATCGCTTTGTTC
-GTTTATTTTTGTCTGTTTATTGTGATTTTGTGCGAAATTAATGTAAAAAT
-TTCCATATCCAACACTGTTGTGTGATTAATTCGGATAGATAAAAAATGTT
-CAGCATGTTGAGTTTAGTTTTCGTCGTCCAATTTAGCTTTTTTTTGATTT
-TCAGTCAAGATTTTCTTTCGCCTTCCGCTTTTTGACTTTTCTATGCAGTA
-ATGACCAGTCTTGATTTCTAGCTTTTAGTGTTTGGTTTACCATTCTGCTA
-TTACATGAGTCACACCTTATCACTAATATAAATGCAGCATAATTTCAGAG
-TGAGCAAGCCGCGAGTATTAAACCAGCGCTGTTTTAAACTGATAATGATT
-GCAGTTTCCTTCATTCTCACCGAATATCAATTTTTATTCATTCCAGAGTC
-TCTCGAACTATGGAAAAACAACTAAAAGCTATGTCCGTCTCGGACAAACC
-TGCTGCCCCAGCTGCCCAAAAGCTTGGTACCGCTCCGCTCGCTGCAAAAA
-AGACGAGAAATGAGGAGTGGGGAACCAAGGTCAATATCGATACCAACATT
-CGCAAATTGAGTAAGTTTTTATTTTACAATTACCAGTCGTTCGAGCTTAT
-ATATCAATATTTTTTAGCGATCAAACCGAATCAGCCAATTTACAAGTACG
-CTGTGCAAGTGAACTACGTCTTCCGGAAACCTGATGGAACTGAGGCGACA
-ATCGAAATGTCCAAATCAGCCAAAAAGGGAACGGAGCACGACAACGACAA
-AACACGCTGCCAGAACGTTTACAATGAGGCGATCAAGCGTTACGATGAGC
-TGAAAACCGGAGGACCGTTTTTCTACGATCGTCAAGCCTCTTTGTACACT
-CTGACCAAATTGAAGAATGAGGTGAATTCGATTTTTTGCTTAAAGTTTAA
-TATTTTGCGTTTCAGAGCATCTCTTTCGTTGTTACTGACAAGATTTGCAA
-GCGACAAAACTTCAAAGAGGCACAGTTTGTTCTCAAAAAGGTGGATCAAT
-CGTTCCAGTCAACATCGAATGACGTCATCAAGACAACCAACTCGTGCCCA
-GCCAATGCCGACAAAACTTTGCTTGAGGCAATGAACATCATTGTCTCGGG
-ACCAGCGTTCGAAAAGTATGCCGCTTTCAGAGATAATCAAGCTATTTCAT
-CTCGTTTTCAGCAAAAATGTTATCACCGTTGGAGCATGCGTTCATTACCT
-CATCGACCCAACTGGAGTCGAGTAAGAAACTTTAAGAAATTATCATATTA
-GTATTTAATTGTTTTTTCCAGCGTCGCGTACAAGGAATACCCTGAAGGAC
-AACTCTACTCAGGAGTTGGTGTTTCAAAGTCGGTGAAGACATTGGAAGGA
-ACGGACAAGAAAGTTCCATCACTCTTCATGACAACTGAAAGTTAGTTTTT
-CAGAAAATCTAGATTTTTTTCAAAATGTTATAAAATTGTTAATTTTCAGT
-GAAGACAACATTGTTCCATCCGGATTATGCCCCACTTGTGGAACTTTTGC
-AAACGTTCAGAGGTTTCAGCACAACTCTCAAAGCGAATTCTCCAGCCGCG
-CAGAGAATTGAGAAAGCCTTTGTTGGACTGGATGTTGTCTTGAATTACGG
-TGTGCACAAGGGTCTCGGAGAGGATGGTGTCGTTATGAAGATCCGTCGAT
-TCCACACGTCAGCTAAGGAGACATGTTTTGAAGTTGAGAAGTCAACTCGT
-GAATTCACGAACGTCTTTGACTACTTCAAAAAGAAGTATGGAATCACTTT
-GAAGTATCCCGATTTATTCACCATTGAAGCGAAAGGGAAACAAGGAAAAA
-TTCATTTCCCTGCGGAAGTTCTCCTTCTCTGTCCGAACCAGACGGTCACG
-AATGATCAAATGATCAACAATGAGCAGGCGGACATGATTAAGGTAATTTT
-ATATTTTAAAATCTGAATAATATCCCGAATCCTTTTTCAGATGTCAGCCG
-CACAACCACATATCAGAAAGACGACAACTGATACTATCGTGAGAAACGTC
-GGATTGGCTTCCAACAATATCTATGGCTTCATCAAAGTTGAAGACCCAGT
-CAACCTTGAAGGAATGGTTCTTCCAAAACCTAAGATTGCGTTTGCCGGTA
-ACCGACTCGCTGATTTGGCAAATCCGAAGTCTAGATTCCCCACCGACTTC
-AATCGTGCTGGACAATATTACGATGCCAAGGAATTGACGAAATGGGAACT
-GGTCTTTGTTCAAAACGAAGAAGTCCAGTAAGTTTCAGTTTGTAATTTTT
-CATTTTATTGACTCAATTTCAGAGGACTTGCTAAGCAGCTCGCCGATGAA
-ATGGTGAATAATGGTATGAAATGCAGCAACCCAACGATGAGTTTCATCAT
-TAGAGGTGATTTGGAACCAATCTTCAAGAAAGCGAAGGCTGCTGGAACGC
-AACTTCTCTTCTTCGTTGTCAAATCTCGTTACAACTATCATCAGCAAATC
-AAGGCGTTGGAGCAAAAGTATGACGTGCTCACTCAGGAGATTCGCGCTGA
-AACCGCCGAGAAAGTCTTCCGTCAACCACAAACTCGTCTTAACATTATCA
-ATAAGACGAACATGAAACTCGGAGGACTGAACTATGCTATTGGGAGTGAA
-GCGTTCAACAAGCCAAATAGATTGATCGTTGGATTTGTTACTTCTCAACG
-AGTTGGTGGAAATCCAGATGTGAGTCATGTGTTACAGCTGCATAATCATA
-TTTCATTTTTTCCAGTATCCAATATCAGTTGGATTTGCTGCAAATATGCT
-CAAGCATCATCAAAAGTTTGCTGGTGGATACGTGTATGTTCATCGCGATA
-GGGATGTTTTCGGATCCATCATCAAGGATACTCTCTTGACAATCTTCAAA
-ACATGCACTGAGCAGCGCGGAAGACCAGATGATATCCTTTTGTATTTCAA
-TGGAGTTTCCGAAGGTCAATTCTCAATGATCAACGAGGAATTCAGTGCCC
-GAGTGAAGGAGGCGTGCATGGCATTCCAAAAGGAGGGAACCCCGCCATTC
-AGACCACACATCACCATCATCGCCTCATCAAAGGCTCACAACGAGCGTCT
-GTACAAATCCGACAAGGGACGTATTGTTAATTTGGAGCCGGGTACGGTCG
-TGGACCATACCATTGTGAGCAATGTCTACACTGAGTGGTATCATGCCTCA
-GCTGTTGCTCGCCAAGGAACTGCAAAGGCTACCAAGTTCACTCTCATCTT
-CACCACTAAAGCAGGCCCACAAGCTGAGCCATTGTGGCATCTCGAGCAAT
-TGACCAATGATCTTTGCTACGATCATCAGATTGTCTTCCATCCGGTCGGA
-CTTCCCGTCCCACTGTACATTGCTGATCGTTACAGTCAACGTGGAGCAAT
-GGTTCTTGCCGCCAATCAAGGGTAAGTGACAGTAAAATGTATACGACATC
-TCATTTATTATTTTCAGTCCAATCTACAATGAAGGACAAATCGATCTCGC
-GGCTACCAACAGTGCATATGGCTACGGAGAGAAGAAGCTCTTCACCACTC
-GTTTCAATGCATAATTATCTGTACTCCTCCGTTTCTTTTACTTGGCTGTA
-TAATGTTTTATTTCCGTCAACCCAGAATACTTTCGCTATGATTGTATATT
-TTTTAGCATTTGGTCATTGTAATTTGTAATTATTGTCGGAATGGATAAAA
-TGATTTAAGAATCAAATGCATCGCTTCTTGGACAATTCCTGTTGATAATC
-TCATTCTGATATTTTCAAAAGTTGTGGTATTGATTTTAAAAATTAAAATA
-TTTGCAGCTGCCGCTGTGACTGGAGAAGTTGATGTTTTATTTCTTCCAAT
-TCAGCTGTTTGTACCTGTTTTGTAATGTTATTACTTTCTTTCGAACAAAA
-TGTCATTCTTTTTCTGGCAGAAAATTCCGCTTTTTAAAAATTATTTTTAC
-AACATTACAGATGGATCCTTCTGTTGTGTCTCGATTGGAGAATGTTGCGA
-ATCGAATGGAGAATATATTGCTGAAATATGACTCGAACAAAAAAGGCAAT
-TAAATAATTGTTCTCGAAATTATAAATTTCAAAAAAATCGCTTTTTAGAA
-ACTCCGGTCGGCGCGACGCCTCAAATCATTAATCTTTATGACGATGCGAT
-CTGTGAGAATCTCGTCTCGTTTTATGATTTATCTGCAAAAATTGGAGGAG
-ATTTGAATCGCCTTGGATGCATGGTAAGGAAATATATAATATTTAATTCA
-AATTTTATCGAAAATTATGTTTCAGACTAAGAATCTATTTTTCACGCTTT
-TTTCGATGTTTTTTGTGGATTGCGTGTGGGCGCAAAAAAGCGGACAACGA
-CGAGTTCGCGACTCTTGTGAACGATTTGACGACGGAAATTGTTGCATTTT
-CCGATTTCAAGGAGAAAAATCGAAAATCCGAATTCTATAATCATATTTGT
-GGACTTGAAGCTGCGGTTGGAGGTGAAAATTTGCCCCTGATTCCGAATAT
-CTATGTGAAAAACTCTTCATTATTTTATATATTTCAGCTTGAAATCGCTT
-GTTCATCCATTACTTTTTTCAAGCACACGCCATATTCTCATTGGAGCGCG
-CCGTGTTGTGTCGATTTACGAAATTTTCCAATTTTTTCAATTTCAGTTTT
-TAAACGAGTTTTTATTTTTGTGGGCTTTATTTTTGTGGGTTTTGCTTTTT
-GGGTTAAAAAAAATCTTAAAAACAATCATAATTCTCAGGAAACTCAAATT
-TTTCGCCGAAAAACCTATTTTGCGCGTGAAATCTGGTGTATTTTACCGTG
-CCTAGACTATGTGTGAGAACACTGCCGGTCATACATCATATTTGACGCGC
-AAACTGCAAAAATCGTCGGAATTATTTCGGGAACACAAAATTCTGAAAAT
-GCGTATCGCGCAACATATTTGACGCGCAAAATATCTCGTAGCGAAAACTA
-CAGTAATTATGTAAATGACTACTGTAGCGCTTGTGTGTCGATTTAAGGGC
-TCAATTTTCAAAAAATCGAGATCCCGTAAATCGACACAAGTGCTATAGTT
-GTTATTTGAAGAATTACTGTAGTTTTCGCTACGAGATATTTTGCGCGTCA
-AATATGTTGTGCAATGCGCATTTTCAGAATTTTGTGTAAAAATTTTTGTG
-TTTAGTGATTTTTGCAGTTTGCGCGTCAAATATGATGTATGACCGGCAGT
-GTTTGCCCACATCGCCTAAGCACGGTAAAATACACCAGATTTTTCGCGCA
-AAATGGGATTTTCGGCGAAAAATTCGAATTTCCTGAGAATTTTGGTCGTT
-TTTACTATTTTTTAATGCAAAAAATGAAAATTTTTAAATTTTCTGAAATT
-CACCGTCGTTTTTCACGAAATAAAAAAATTTCAAAAAATTGAAAATTCCG
-CCACATCACATTTGACGCTCAACTTTTTTTAAATGAACAAAATCCGGATT
-TTTCTGGGAAATTTGAGATTTATTTAGGTCTCGCAGCGAAAAAAAAATTA
-GAGTTTGCGCGTCAAATATGATGTATGACCGGCAGTGTTTGCACACACAT
-AGCCTAGACACGATAAAATACATCAGATTTTACGCGCAAACTGGCAAAAA
-AATTGATTTTTTGGCTTTTTCGGACTAAACATTAGAAAAAAAGACTATAC
-TCCAACAATTTTTTTCAGTTTTTTTTTGAAAAATTCCATATTTTCTGAAG
-TTCAAATAAATATATATTTTTTTAAAGTTCAAAAAATTCAAATTAGCGCG
-TTAAAAACGACGTATTCAGGCATCACATTTGACGCGCAATTTTTTTTTTA
-AAGAAGGATTTGCGCGTCAAATCTGGCGAATTAGGTTTGTCGGCGGAATA
-CACCGAATTTCACGCGCAAAATTTCAAACCTCAATGATAAAATCGGAGAG
-CGTATTCGAGGAAATTACGTCTTTCAACGTCTCCGCCGGAACCACGACAG
-CGAACAAGTTTTGTGTTGACTGAAAAAAAAATTAAATTTTTCGACAAAAA
-AAATTAAATTTTTCAACGAAAAAAAATTAAATTTTTCAACGAAAAAAATT
-AAATTTTTCAACAAAAAAAAATTAAATTTTTCAACAAAAAAAAATTAAAT
-TTTTCAACAAAAAAAAATTTAATTTTTCAACAAAAAAAAATTAAATTTTT
-CAACGAAAAAAAATTAAATTTTTCAACGAAAAAAATTAAATTTTTCAACA
-AAAAAAAATTAAATTTTTCAACAAAAAAAAATTAAATTTTTCAACAAAAA
-AAAATTTAATTTTTCAACAAAAAAAAATTAAATTTTCCAACAAAAAAAAA
-TTAAATTTTTCAACAAAAAAAAATTAAATTTTTCAACAAAAAAAAATTAA
-ATTTTTCAACAAAAAAAATTAAATTTTTCAACAAAAAAAAATTAAAATTT
-TCAACGAAAAAAAAATAAATTTTTCATCAAAAAAAAATTCAAATTTCCGC
-GGAAAGTGCAAAAAATTTACAGAATATTCAAATCGTTCACTTCTCCCGCT
-ATCATCTTCACGCAATTCGACACATTTTCGTCGCCATTCGATGCGGGTTC
-CCAGTGATGTATCGATTTTCAGTTGATTATCGATTTTTCGCTCCACGTAC
-AGTACACTGAGTTCCGCTTCGAGGCCATCTGAAATTTTTTTTTTAATTTT
-TTTAACGATTTTTTTTTCAGAAAATCAATAAATCTATTCAGCTGTTTTTT
-TTTAACTTTTACACAATTTTCCGTTTGAAAATGTCAAAAAAATGTGTTTT
-TGAGCCACATTTTATTCAAAAAATTTTGAAAAATTCCCTGCATTTTCGCT
-GTGGGACCCAAGAAGTGCGTGTGCCTTTAAGAATATTTCAATTTTTTTAA
-AACTTAAAACAAAGATTTAAAAAATTCTGCTTTCTAAAAATAAATAATTA
-TTTATTTTTTTGTGTATTTGTTTGGAAAAAATCAATATTTATCGATTTTT
-GTGAATTTTTTTGAAAAAAATCAATATTTATCGATTTTTGTGAAATTTTT
-TGGGAAAAATCAATTATTATCGATTTGTGTGAATTTTTAAGAAAAAAATC
-AATAATTATCGATTTTTTGTGATTTTTTCGCAAAAAAATCAATAATAATC
-GATTTTTGTAAATTTTTTAATCGAAATTCGGCTTTTTCCGGTAAAAACAT
-CAAAATTTCGCAAAATTAATCTGATTTTTTCTGCGAAAAATTTAAATTTC
-TCATAAAACTTTCGAAAAATCGAATATTTTAAAAATCAATAATTTCGATT
-TTTGGTTAATTTTTTTGGAAAAAATCAATAATTATCGACTTTTTGCGATT
-TTTTTTTTGAAAAAAATCAATAATTATCGTTTTTTTTTAATTTATTGGAA
-AAAATCAATAATTATCGAATTTCAGTGAAATTTTTGGAAAAATCAATAAT
-AATCGTTTTTGTGTGATTTTTTTCGGAAAAAATTAAAAATTATCGTTTTT
-TGTGAATTTTTTGAAAAAATTAATAATTATCGACTTTTTTTGAATTTTTT
-TTTGGAAAAAATCAATAATCATCGATTTTTTTGTGAATTTCTTGGAAAAA
-AATCAATAATTATCGATTTTTCCGATTTTTTCCAAAAAAATCGATAAATC
-AATAAATTTTCCTTACGCCACGTGTCAATTACAGTCTTCCCCACGTGGCA
-AAACGTGTAGAGCTCGCATTTCGAATTGGTTGCCGCCGAAATTTCGCGTT
-CGATTTTTCGAGTTTCCTTGTCTTTCTGAAATTTTTTTTTTCTAAATTTT
-CTGAAAAATGTTCTTCTGTAAAACCTCTTTTTCCTCTCTTCTCCGCGCCA
-TTTCGCTCTTTTTTTTATCCTTTTCCAGCGTTTTTCTCTCTTTTTCAGCT
-TCCCGAGCTCGTTTCGCATTTTCTCGGAGTTCCTGAATAAGTTTTAAATT
-TTTAAGGGGAAATTTGCTATTTGGAGAGTAAATATTTTCGCTGTGAGACC
-CGTGGACCTGAAAATTTTGATTTTCCGCTTAAAATCAACTGAATTTCGCT
-TAATTGTGATGTTTTAAGCTGAAAAAGCTGAATTTTGATTTTAAAAAATT
-GAAAAAAATTAATATTTTTAAAGGCGCATTTATTGATTTTTTTTCCAAAA
-AAAATTTACAAAAAAATTGATAATTATTGATTTTTTCCAAAAAAATTAAC
-AAAAATCGATAATTTTTTTTCCAAAAAATTCACTGAAAAATCGATGATTA
-TTGATTTTTCCAAAAAAAATTCACTGAAAAATCGATAATTATTGATTTTT
-CCAAAAAAAAAAATCACAAAAGTCGATAATTACTGATTTTTTCCAAGAAA
-ATTTTAAAAAAAAACGACAATTATTGATTTTTTCCGAAAAAATTACAAAA
-AAATCGACAAGTACTGATTTTTTCTGAAAAAATTACAAAAAATCGATAAT
-TATTGATATTTTACAAAAAATCGATAATTATTGATTTTTTACAAAAAATT
-CACAAAAAAATCGATAATTTTTAATTTTTTTCAAAAAAAAAATCACAAAA
-AATCGATAATTATTGATTTTTACCAAAAAAAATCACAAAAATCGATAAAT
-ATTGATTTTTTCCAAAAAAATTAACAAAAATCGATAATTATTGATTTTCC
-CAGAAAAAATTCACTGAAAAATCGATAATTATTGATTTTTTCCGAAAAAA
-TTCACAAAAAAATTGATAATTTTTTAATTTAAAAAAAAATCACAAAAAAT
-CGATAATTATTGATATTTTACAAAAAAAAATTACAAAAAATCGATAATTA
-TTGATTTTTTACAAAAAATTCACAAAAAATCGATAATTTTTAATTTTTTT
-CAAAAAAAAAATCACAAAAATCGATAATTATTGATTTTTTCCAAAAAAAA
-TCACAAAAATCGATAATTATTGATTTTTAGGCGGAAAAGCCGAATTTTTA
-TCAATTTTTCAAAAAAACAATCGATAGTTTTAAAGGCGCATGCGCTCTCC
-TGGGTCTCACAGCGAAAAGTGGATTTTTCAAATTTTTTGGATAAAATTTC
-GCTGAAAAACGTATTTTTTTGACAGTTTTAAAGGGAAAATTGTCTAAAAT
-CAAAAAAAAATTGTTTTTTCAACAATTTTTTCAGTTTTCGTAAAAATTTC
-AGTTTTTTTTTCGCGAGAAAAAAACCAATTCTCGATTGAAAAATCAGAAA
-AAATATTTTGGTATAAAAATATTTTTGGTATTACGATATTTTGGGTCCCA
-CCTCGAAAATTTAGAGGATTTTTCAAATTTTTAAGATTTTCTTCAACTTT
-TAACAATTTTTTTCGGAATAAAAATCGATTTTCGCTGCGAGACCCAAAAA
-AAATAGATTTTCTCGAATTTTGCGATGGAACTTTTGATTTTTCGGTGAAA
-TTTTCCAAAAAAATCGCAAAATGTATCAAAAAATCAATACTTTCTGCGTC
-TCCTTCTCATCGTCGGTTAGTTTCCGTTTTTCGGGTCTCGCCACGACATT
-TATGTCAGTATTCTCTTGTGAGCTTGAGCACAACGAGTATGAGCTCGTCT
-GATTCTGACGGATCATTTCGTCAAGATTGAGCATTCCCTCATCCAGCCAT
-GTTTTTGCCGCAGCTGGAATTGCATCCTTATTCACTGCGTCGACGATGGA
-AAAGCTCGCGGAGTACCTGGAAATTATCGATTTTTTATTGATTTTTTATC
-GGTTTTTATCGATTTTTTTGATGGGGAAAAATCGGAAAAATCGATAAATT
-TCGATTGGAAAATTCAAAAAACTTCGGGTCTCACAACGAAAATTGATTTT
-TTTTCTTGGATTTTCAAATTTTTAAACTTTTGTTGTAACAACAGTGGAAA
-TTTTTCGAAAAAAAATCAATAATTATCGATTTTTTGAAAAAAGGCAATAA
-TTTTCGATTTTTTGAAAAAAAAAATCAATAATTATCGATTTTTTGTGAAT
-TTTTGAAAAAAATCAATAATTTTCGATTTTTTGTGATTTTTTTTCGAAAA
-AATCAAAAATTATCGATTTTTTGTGGATTTTTTGAAAAAAATCAATAATT
-ATCGATTTTTTGTGGATTTTTTGTAAAAAATCAATAGTTTTCGATTTTTT
-TTGGAAAAAATCAATAATTATCGATTTTTTGTGGATTTTTTGAAAAAAAT
-CAATAATTATCGATTTTTTTTTGAATTTTTTGAAAAAAATCAATAATTTT
-CGATTTTTTGTGATTTTTTTTCGGAAAAATCAAAAATTATCGATTTTTTG
-TGAATTTTTTTTTGGAAAAATCAATAATTATCGATTTTTGTGATTTTTTG
-TAAAATATCAATAATTATCGATTTTTTGTGATTTTTTTCGGAAAAATCAA
-AAATTATCAATTTTTTGTGATTTTTTTTTTGGAAAAATCAATAATTATCG
-ATTTTTGTGATTTTTTTTGGAAAAAATCAATAATTATCGATTTTTGTGAA
-TTTTTTGTAAAATATCAATAATTATCGATTTTTTTGTAATTTTTTCGGAA
-AAAATCAATAATTTTCGATTTTTTGTGAATTGATTTTTTTTGGATTTTCA
-AAATTTTAAACTTTTAAAATAAATTTTTCCATAGTTTTTTGTTGAAAAAT
-TCCTGAAATTTTGAAATTCAATTAATTTTTTCTTTAAAAAAATCGTTGAA
-AAATTAGTTTTTTGGAAAAAAAATCAGCGAAAATAGATTTCGCTGTGAGA
-CCCAATTGGGCTCCTCAAAGTCCCTGCGCCTTTAAAATATCGTTTTTTTT
-TTGTTAAATTTTCCCGCGAAATTAATCAGATTTTTTCTGCGAAAAAGTGA
-AATTTCTCAAAGAAACTTTTGAAAAATCAATTTTTTTAAAAAGAAAACCC
-CTAATTTTTCCGTTTTTCCCGCTAAAAAAACATCTAAAAAATTTGAAAAA
-TCCACAGAATTATCGCTGTGGGACCCAAAGTGCATGCGCCTTTAAGATTA
-TCGATTTTTTTCAAATTTTTCAATCGAAATCAGGTTTTTTTTTTCAGCAA
-AAATCATAATTTTGCGAAATTAATCTGATTTTTTGTGCAAAAAATTCAAA
-TTTCTCTTTTTTTACGTTTTTTCGCCAAAAAAACCATCTAAAAAATTCGA
-AAAATCCAGAGCATTTTCGCTGTGAGACCCAAGTCCGTGTGGCTTTAAAA
-ATATCGATTTTTTGTTAAATTTTCCAATCGAAATTTGGCTTTTTTTCCGG
-TAAAAAATCATAATTTTGCGAAATTAGTCTGATTTTTTGTGCGAAAAAGC
-GAAATTTCTCATAAAACTTTTGAAAAATTGATTTTTTTTTTCTGGAAAAA
-CCTATTTTTGTCGTTTTTTCGCTAAAAAACATCTAAAAAATTCGAAAAAT
-CCCCAAAATTTTCGCTGTGAGACCCAAGGCTCCTGAAAGTCCCTGCGCCT
-TTAAAAATATCGATTTTTTGTTAAATTTTTAATCGAAATTCGGCTTTTTC
-CGGTAAAAACATCAAAATTTCGCAAAATTAATCTGATTTTTTCTGCGAAA
-AATTCAAATTTCTCATAAAACTTTCGAAAAATCGATTATTTTCCGCTAAA
-AAATCATCTAAAAACTCGAAAAATCCAGACAACTTTCGCTGCGAGACCCA
-AGTCCATGCGCCTTTAAAAATATCGATTTTCTGTGAAATTTCTCACAATT
-TCTCCAAATTTCCCGCCGTCACATTCGTCGTTTCCTCAATCATAATACAG
-TCCTCATCATCATCATCATCCGAGAGGACTACAATCGCCTCGTCCATCTG
-AATAGTGGGAAAATATCGATTTTTTGTAGAAAATCATATATTTAAATTGA
-TTTTTTTACAATAAAAAAAATTTTGGGGATTTTTTTGGAAATTTCGGGTA
-AATCGTGTAAATCGTGTAATTTAAATTCATTTTTGTTTCAAAAAGTCAGG
-GGGGGGGGGGGAAAGAAAAAATTTTTGACAAAGCGTGGAGCGAAAAAAGG
-AGTAAATATACAGTCGCGAAAGAACGATCGCTCCGCCAATTTTGCATGCG
-GCAAAGGGGCGTGGTTTATTGGGGGCGGGATTCCGGCGCAACCCTGCGGC
-ACGCTTTTTTCTCGCTTTTTTCGTGCGGTAATTTTCAGTTATTTTTATTC
-GTTTTCTGTTCGAAATTTCACGATTTCGCTCGATTTTGTTCGTTTTTTCG
-GATAAAAAAGTGTCCAACTATTTTTTAAATGAAAAATAACCAAGTTTTCA
-CAGATTTTACCCGAAAAATGCTTTGTTGGTCTCTCTTTCTGTAAATTACG
-ATTGTTAAGAGAGAAAATGGGGGAAAAAAAGGAAAATGTGAAGAGAAAGC
-GTTTTTTTAACGTTTTGCTTCGTATATTACAGAAAAAGAGACAAACGAAG
-CATTTTTTCAAGTAAAAACTGATAAAACTTGGTTATTTTTCATTTAAAAA
-TAGACACTTTTTTATCCGAAAAAACGAACAAAATCGAGCGAAATCGTGAA
-ATTTCGAACAGAAAACGAATAAAAATAACTGAAAATTACCGCATGAAAAA
-AGCGAGAAAAAAGCGTGCCGCAGGGTTGCGCCGGAATCCCGCCCCCAATA
-AACCACGCCCCTTTGCCGCATGCAAAATTGGCGGAGCGATCGTTCTGTCG
-CGACAGTATGTAACATGTAAGGTAACAAGGTGGGTTGGTTTTCATGAGAA
-AAGGGGGATTTTTTTCCGATTTTTCAGGTGCAGAGCCCACGCTCTCCTCA
-AAGCCGAATAATTATTAGAGCGCGCTTGCAGCGACTCGCGTTTCTGCATC
-CGCGGTATTTTGACTTTCCACTGAAGAAAGCAGATATTTCAGATTTATCG
-AATTTTTAGGTTTAAAATTTTTTTTTTCTGTATTTTTCGAACAAACCTTT
-TGTCAAACAGTAAAAATCGAAATTAAAATGACTAAAATGAACTTTTTTTG
-TCCACTGGTTGTGAAATGGTTTGAATTTGAAGAAATCAACGGGGTTTTTC
-GTATTTTCTGAATATTGTTCTATTAAAAATTGGTTTTAATACATTTTTGA
-CTTAACATTAGGGTCAAAAAATGGTTTAAAACCGATTTTTAATAGAAAAA
-TATTCAGAAAATACGAAAAATCCCGCTGATTTCTTCAAATTCGAACCATT
-TCGCAACCAGTGGACGAAAAAAGTTCATTTTAGTCATTTTAATTTCGATT
-TTTACTGTTTAACAAAAGGTTTGTTCGAAAAAAACAGAAAAAAAAATTTA
-AAAGCTAAAAATTCGATAAATCTAAAAAAGCTGCTCATTTCAGTGGAAAG
-GCAAAATACCGCGGATGCAGAAACGCGAGACGCTGCAAGCGCGCTCTAAT
-AATTATTCGGCTTTGAGGAGAGCGTGGTGCAGAGCCCCAATTTTAAACAA
-AAAATAGCGGAAAAAAATATTTAAAAAAACGAGGATTAAATAAAAATTAA
-ATAATGTCAGCAATGTTCATTGGCATCTCGTCGATTTGTGTCGAGTAGTA
-CTGCTCAATGTCGCGGAGAATTCGTACGTCGTCCTGTTTGACGAAATTGA
-TGGCGACTCCCTTGCGGCCGAAACGTCCCGAACGGCCGATACGATGGATG
-TAGAGCTCACGGTTGTTCGGCAAATCGTAGTTGATTACCTGGAAAATTTT
-TTGATGAAAAGCTGATTTTTGCGATTTTCGCCATTTTTTGACCTAAAAAA
-TTGGCGAAATTCGGAATTTTTAAACAAATTTTGACGTAAAGTAGGTTAAA
-ATTCCAAAATTTTACGGTAAATAGCCTGAAATGCTTTAAATTGATCCTTT
-TTTGCACAATTTTAACAATGAAAACCTGTATTTTTCGCTACTTTTAGTTG
-AAAAAAGCTTCCAAAACGAGTAAAATTGGCAAATTTTATCGATTTTCGCA
-AATTTTTCACCTAAAAATTGAAGAAATCGGTATTTTTAAACAAATTTTGG
-CATAAAGTAGGTTAAAATACCAAAATTTTACGGTTTTTAGCAATTTTTGA
-GTCAATTTTCAAAATGTTCCAGTATTTTTGCAACTATTTGGTTTTTATTC
-ATCTATGTTCTTTGAAAATTCTTTTTTTTAAGGTGAATTAGGTTAGAAAG
-GGGTCGATTTTGCAGAATTTTGACAGATTTCGCATGAAAATTTGAATTTT
-CAGGCGAAAATCATCAAAAATATGATTTTTTGCTACTTTTAGTTGAAAAA
-AGTGTACAAAACGAGTAAAATTGACAAATTTTTATCGATTTTCGCCATTT
-TTTCACCTAAAATTTAATTTTTTTTTTCTAGTGAAATAAGTTAAATTCAG
-TGTTAAAATGTATCTATTTTCGCTCAAAATTTGAAAATTTTCAATTTTTC
-ACTGAAATCCATGAGAAACCAGTGAAAAAATTTTTTCAATTTGAAAATTT
-GCAGTGAATTTTATTTTTTCTGCTAATTTTTCGGTGAAAAATGCACTTTT
-TCACGAGAATTAGCGGGATTTTTGTATTTTCAAAGTTTTTAGGTCAATTT
-TCAAAATGTTTCTCGCTGAAAATTGATTTTTTGTCAATTTTTCACATATT
-TTCTATGAAAAATTCCACCTTTTTGCAGAATTTTGACTAAGAAATACGAT
-TGTCGCCTAAAAGTTTGAATTTTTCAATTTTTTTTTGCTGAAAATCATCA
-AAAATACGATTTTCAACAGAAAATGATGAAATTTTCGCTATTTTTCGCGG
-AAAATCATTGATAACCTGATTTTTTCGCTACTTTTAGTTGAAAATAGTTT
-ACAAAACGAGTGAAATTGGCAAATTTTATCGATTTTCGCAAGTTTTTAAC
-CTAAAATTTAGTTTTTTTCTAGTAAAGTAGGGAAATTCAGTGAGATTTTT
-TAATTTTTCACTGAAATCCATGAGAAATTAGTGAAAAAAAAATGTTTTTG
-GCCAACTTTTCACATATTTGATATGAAAAATGCCGTTCTGAACAAAAAAA
-GCTGTGGAAATTCAACTTATTGTCAATTTTCCGCTGAAAAATTCATTTTT
-TTTTCTCAAGAATTCGCATTAAAACTGCGGAATTTCTTGTATTTTCAGCA
-GAAAATGATGAAATTTTCGCTATTCTTCGCGGAAAATCATTGAAAACCTG
-ATTTTTTCGCTACTTATAGTTTAAAATAGTTTACAAAACGAGTGAAATTG
-GCAAATTTTATCGATTTTCGCAAGTTTTTAACCTAAAATTTAGTTTTTTT
-TTCTAGTAAAGTAGGGAAATTCAGTGTCAAAATTTACTTATTGGGTAAAT
-GGAAATTGTGAATTTCCATTGTAAAAATTTCTGCTGGGAAATTCATTTTT
-CCCAAATTTTTCATATAATTAGGCTGAAAAATGCAATTTTTCACAAGAAT
-TCGCATTAAAACAGCGGGATTTTTTTTGTATTTTCAACGGAAAATGCTAT
-TTTTTGCGGAAAATCACTGCAACTTTTTCCTCACGAGGGCCAAGGAAAAG
-TGGTTTCTAGGCCATGGCCGAGGGGCCGACAAGTTTCAGCGGCCATTTAT
-CTTGCTTTGTTTTTCGCCTGTTTTCTTTCGTTTTTCACAGCTTTTTCCCG
-TTTTTTCTTATTAAAACTGATAAATAAATATTTTTTGCAGATGCTAAAAC
-AATTTCCAAGTAAAAAAAATTATGTATTCAGTCGGCAAGCAGCGGTGAAA
-GTGGGCAATGTAAAATGATGGATTACGGGAATACAAAACCTGAAATTTTT
-CTGAAACATGATACATATGCTGCTTAGATGCTGATACTACCTGATTTTCA
-TAACGAGACCGCTGAAAAGTTTTGAGGTTTCCACAATTCAACTTTTTTGG
-TGAAAAAATCGAGATTTTCGCACAAAAAGTTGAATTTTGAAAACCTCAAA
-ACTTTTTCAGCGGTCTTGATATGAAAATCAGGTAATTTCAGCATCGAAGC
-ATCATATGTATCATGTTTCAGAAAAAGTTTAGGTTTTGTATTCCCGTAAT
-CCATCATATTGCATTGACCACTTTCACCGCTGCTTGCCGACTGAATACAT
-AATTTTTTTACTTGGAAATTGTTTTAGCATCTGCAAAAAATATTTATTTA
-TCAGTTTTAATGAGAAAAAACGGGAAAAAGCTGTGAAAAACGAAAGAAAA
-CAGGCGGAAAACAAAGCAAGATAAATGGCCGCTGAAACTTGTCGGCCCCT
-CGGCCATGGCCTAGAAACCACTTTTCCTCGTCCCTTGTGAGGAAAAAGTT
-GCAGTGGGAAAATGCTATTTTTCGCGGAAAATCGAAAATGTACCAAGGAC
-ACTTGCGGAACATCAAGTCCTCTCGCCCAAACATCAGTAGAAATGAGGAC
-ACGAGTGGTTCCAGCTCTAAACTCCTTCATAACCTCATCACGATCCTTCT
-GCTCCATATCTCCATGCATCGATGAGACGGTAAAGTTGGCCTCCTTCATC
-TTATCAGTCAACCAGTCCACCTTTCTACGTGTATTACAGAACAACACCGC
-CTGAGTGATGGTTAAGGTGTCGTAGAGATCGATAAGCGTGTCGAACTTCC
-ACTCCTCCCGATCAACTGCGACGAAGAACTGCTTGATGCCTTCCAGTGTC
-AACTCGTCACGCTTCACAAGGATCCGAATCGGATCCGTCATGAATTTACT
-CGTCATCTCCAGAATCTCATGAGGAAGCGTCGCGGAGAGCAGCACCACCT
-GGGCTCCGGGCGGTAGATAGCGATAGATATCGTAAAGCTGCTCCTTGAAC
-CCCTTGTTGAGCATCTCGTCGGCTTCATCGAGCACGAGAAGCTTGATGGC
-GCGGGTGCGCAGGTTTCGACGGCGAATCATGTCGAAAACGCGTCCCGGAG
-TACCGGAAACCACGTGCTGGCCGTAGTCGAGCTTTCGGATGTCCTCGCCG
-AGATTGGTGCCTCCGATACAGGCGTGGCACTGGACATTCATATAGTCGCC
-GAGCGCCAGCACGACTTTTTGAATTTGAACTGCCAGCTCTCGTGTCGGCG
-AGAGAATCAGAGCTTGGGTCTCGCGGACCTGGGTGTCTAGCGATTGGAGT
-ACGGAGATCGAGAATGTCGCCGTTTTTCCTGTTCCGGATTGAGCTTGAGC
-GATGACGTCACGAGCCTTGAGAATTGCGGGGATGGCGCGTTGCTGGATGG
-CAGATGGCTTTTCGAAGCCGTACGCGTAGATTCCACGAAGCAAGTCTTCT
-CTGGAAATCGAAAAAAATTTTGAATTTAGTTTTATATTTAAAGGTGGTGT
-AGTCGAATTATTTATTTCTTTATTAGACTCAAAATTGTCTGAAAAAAAAG
-TGTACAAAACGAGTAAAATTGGCGACTTTTATCAATTTTCGCCATTTTTC
-ATCTAAAAAAATCGACGAAATTCGGAATTTTAAACAAATTTTGACGTAAA
-GTAGGTTAAAATTCCAAAATTTTACGGTTTTTAACAATTTTTCCACCTTA
-AAGTTGGTGTAGTCGAATTATTTTTTTCTTTATTAGACTCAAAATTGTCT
-GAAAACACCGAATTTCATAATGAAACTTCTTGAAAACTGAAAACTTTTCA
-AAAAAAAGTTAAGGCCTCTTGAAAAAAGGCCTAAAATTAGTGAAAATTTG
-AAATTTGACCAACTTGTCTGTCAAGCGGCTGGAAACAATTTTCTTTGAAA
-TTGTCGTCTAATTTTGGGTATACAGGTCGATTACCTTGCGTTTTCAGCTT
-TATTTAGGTATTTAAAAGTCGATGGACGAAGAGATTTGTCAAATTTTTTT
-CACCAACTATCTTCGTCCATCGACTTTTAATACCTTAATAAAGCTGAAAA
-CGCAAGATACGACCTGTATACCCAAAATTAGACGACAATTTCAAAAAAAA
-TTGTTTCCAGCCGCTTGACAGACAAGTTGGTCAAATTTCAAATTTTCACT
-AATTATAGGCCATTTTTCGAGCCGCCATAACTTTTTTTTGAAAATTTTTC
-AAGAAGTTTCATTATGAAATTCGGTGTTTTCAGACAATTTTGAGTCTAAA
-AAAGCAATAAAAAAAATTCGACTACACCAACTTTAAGGTGGAAAATTTTT
-TAAAAACCGTAAAATTCTGGAATTTTAACCTACTTTACGTCAAAATTTGT
-TTAAAATTCCGAATTTCGTCAATATTTTAGATGAAAAAATGGCGAAAATC
-GATAAAATTTGCCAATTTTACTCGTTTTGTACACTTTTTTCAACTAAAAG
-TAGCGAAAAATCATGTTTTTGATGATTTTCAGCTGAAAATTCAAATTTCA
-GGCAAAATTCTGCAAAAAAAGGGTAATTTTTCAGAGAAAATATGGGAAGA
-ATTGAAAAAAAAAACTGTTTTCAGCAAGAAAAATGTTTGAAAATTTACCT
-TTAAATTTTTAAAAACCGTAAAATTTTGGAATTTTAACCTACTTTACGTC
-AAAATTTGTTTAAAATTCCGAATTCCGTCGATTTTTTTAGATGGAAAAAT
-GGCGAAAATCGATAAAAGTCGCCAATTTTACTCGTTTTGTACACTTTTTT
-CAACTAAAAGTAGCAAAAAAATAATGTTTTGAGGCGAAAATTTGTTTTCA
-GCGACAAAATTCTGCAGAAAAAGTTCAATTTGAAGCTTTTCTGGTTATTT
-ATAGAGAATTTTCCGTTAAAATCGATAATTCAATACCTCAAGCCCATTTT
-GTCAAAAGTTGGGATAATTGAGACCTCCTCAGACGACTCGAACTCCACAG
-TCGCCATATCGTCGTTTTTCTTTTTATTTTCCGCCATTTTTGAAGGAAGA
-ACTCTGTAAAATCGATAAAAATGAATATTTTCGAGCATTTTTGCAGAGAA
-ATTCAGCATTTTTAGGTGGAAATTATCAAAATCAATGAATTTACATCGAA
-AAAATCAAGAAAAACGTGTAAAAACGATAAAATTGATTATTTTCGGGCAT
-TTTGCAGAGAAATTCAAGATTTTTAGGAGGAAATTAACAAAATAAGTGAA
-TTTACATCGAAAAAATTAAGAAAAACCTGTAAAATCGATAAAAAACTAGT
-AAAAGAGCAAGATTTCGAATGTTTTCGAAAATACCCTGTTTTTCGAGCAT
-TTTTGCAGAGAAATTCAGCATTTTCAGGTGGAAATTTACAAAATAAACGA
-ATTTACATCGAAAAAATCAAGAAAAATGGTGATTTATCGGCTATTTTCGC
-TCATAATTCGTAGGATTCGATTCGAAACTAAAATTCGAAATTCGAAAAAC
-ATGGCCGTGGCCTAGCGTTCCCCTCCTAGTCCACGGCCGCGCACGATTTA
-CGGAGAGCACGATTATTGATCGATGACACATGGTTTCCGACTGTTTTTCC
-TGTTAAATTTACCCTTAAATCACAATTTTCCATAGAAAATGGGTGGAATT
-TTCTCGAAAAAAGAGAAATCACCAAAATCGGCGCCGGTTTCCGATCAGGA
-TAATGCGATTTTGGTTTGTTTAATGAGGTTTTTCACATGGAAATTATTAT
-TTTTTTGGTAATTCCAGGCGCTCAAAACACAACGGGACAAAATGAAGCAA
-ATGATCAAGCGAAAAGAGAATTGTTTGGAGAAGGAACGACAATTGGCAAA
-GCAGCTTATAAAGGATGGCCGGAAAGAGTAAGAAATTTCAGAAAATTCAG
-TTTTTTTTATTAAAAAAAAAAAATATATATATAAATTTTTAACTAATTTC
-AGCCGTGCTTTACTGCTTCTGAAGAAGAAACGCTACCAAGAGAAGATTAT
-CGATCAAACCTTGAACCATCTTAGCAAAATCGAGCAAATGGTATTGAAAA
-ATCAGAAAAAAATAAAAATTTTCCAGCAAAAAAATCAATAAATTTCCAGG
-TAAATGACCTAGAATTCGCAGAAGTTCAACAGCGAGTAACCGATGGCCTT
-CGACAGGGAAATGAAGCGCTGAAAAAGATGAATCAACTATTCGATATCGA
-TGAAATCGACAGGATTATGGAAGAAACCAAAGAGGCGGCGGAATATCAGG
-AAGAAATCTCGAATATGCTGTCCGGCCAGCTTTCCAACACGGATGTCTCG
-GACGTTGAGAAGGAATTGGAGGATCTGTTGGCGGCGGAATGGGGCACAGT
-TCAACTTCCAGAGGCTCCGAGCCATGAGCTGCCTGAAGCAGAGCGGGAAC
-GGCAAAAAGGTTGAGATTTGCCGAGAAAATTCCTAAATTTTCCCTAAATA
-AATAATTTTTTTTCAGAAAAAGAGAAGCCACGTCGCGAGAAGATTGCTCT
-GGAAGCCTAAATATTGCTTGTTACTGTGAATAAAATAAATTCATTATATT
-ATTATATTTTTTATACAATTTTGTCTTACTGGCGTTGTTCTGAACGAAAA
-ATTCGTTTAAATAACGCTGTAACAAAAAATCTCATTTTGCGCGTAAAATA
-AAATGCCAGTGACGCAATCACCACGACGAAAAATCGCACAGTTTTGGAAA
-ATTGCGGTTTTTCAAACTTTTTTTCGCTTTTTTCGGATGCTATTCAAGCG
-GCTATAGACTGTTCAAATAGAGATAGAACGGTCAGAAAATGAGAGACATA
-GACAAATAAAGAGACAATTTATTGACTTTTTAGGCTATTCTTTGTTGGAA
-ACCAACAAATTTTGTGTTCCCAGGCTTTTCTTTGCAAATTCTGAAGGGTT
-CTTCTTTGCAGATGCGTCGACGTGTAGCTCTGGACAATGACGAGCATGAT
-GGTAAGTTAAAAAATTGGAAAAAAAAACTTTGGTTTCTATTAAATTTTAT
-TATACTTATTCCCTTTTTATAATTAAAGGCGTCTAGCTCATTCAAGCTCA
-TTCACGACGTTAGTTGACGCATTCCTCCTTGCACGCATGGCCTAGTGGGT
-TAAGGCGCTGAACATCACTCAGAAGTCCACAAGTTCAAACCCAACGAGGC
-TCCCCCGCTTTTCTAACCCTAGCTTGAGCAATCAAATCGGAACGCGTCGG
-AGCTGTCTCGGAGCCAGAAGCCTCATCAAATATTTTGATTGCTTCCAAAC
-AATCTATCGCACGTTTGTGCTCCTCATTTCCGTAATGACGTGTGCATGCG
-TAAGCTTGATCTTTCCAGTTTTCTAGGTGACTCATTAGAGCAATCGAGTG
-AGCAACTCGTTCATTCGGTATTTCATGAGCCAATTGCTATGCGGGACGCG
-GGGCTTCTGGAAAAAAATTAAACAAATATTTTTCGTTTTTTTTTCCACAT
-GTGTGGATCTCAATTTATTTCTTCTTTTTTTGTTTACCTCATTTTATAAA
-ATTCTCCTTTTTTTCTCATTAATTTTTCTGTGGCTTTTTCAAAGATCTTT
-TTCAGATTTTCATCTATTTGTTTTAATGTGGAGCAAAATTGAAATTTGTC
-TGGTAGATACGGTAGCTTTAAAGGCGCATACTAAATTTAAAGTGACAAAA
-TAAATATTTAGTTCCATATGGAATTTCAATTTTTGCTGCCAGGCTGTCCC
-ATTACGGTTTGATCTACAAAAAATGCGGGATTTTTTTTGGCCCAAATAAT
-GTGACGTCAGTGCGTTCTTAACCATGCGAAATCAGATGAGAACTCTGCGT
-CTCAACTCCCGCATTTTTTGTAGATCTACGTAGATCAAACCAAAATGGGA
-CATTCTGACACCAGGTATTCGCCGCGGAACCAGTTTTATACCGTATTTCG
-TATGCGCCTTTAATTCTACCGTACCCGCTTCTGGAAGTTTGGAAGTTTGA
-AAAACTATTAAATAGAATTTATTAATTTTTGCATATTACTTTGTGCAGAA
-TACCTCTAAAAATATTAAAATCCAGATAAACATGGTTTTTAAAATGTTTT
-GCACAAAAAGCGATGATTTCGCTTCGAAGCCACTTTTATAAAACGCCTTG
-TGCGCCTTTAATTCCACCGTACTCGCCAAAATTAAACTGAATGAGCGAGT
-TTTGAACTAATTTTTACGAAAAAATCACGTTCTGATCGGTTCTGGTCTTC
-CTCTAAAATCGGTTCTGGTCTTCCTCTTTGAATTTTCGCGCTCCATTGAC
-AATCGCCTGCCGGACTGGGAAAGCCGTGTACTCCACACGGACAAGTACAT
-TTAGTTTTACAACTAAAATCGAGCCGCGACGCGACACGCAACGCGCCGTA
-AATCTACACCAGATATGACCGAGCCAAAATGGCCTAGTTCGGCAAATTCT
-TCCATTTCAATTTATGAGGGAAGCCAGAAATTCGTGTATTTTTACAAAGA
-AATGTGAAAAAGAAGCTAAAATTTCAATGAAATAGAGATTTTTCCCGGAA
-TCTCACAGTTTCGCAAAATACTATGGATTAAAAAACGCTGAAACCCAAAT
-TTGCGCGTAAAATTCAATGTATAGCGAACATTCACGGATTTCTGGCTTTT
-CTCATATATTGAGATGGAAGAGTTTGCCGAACTAGGCCATATCTGGGGTA
-GATTTACGGCGCGTTGCGTGTCGCGTCACGGCTCGATTTTAGTTGTGAAA
-CTAAATGCATTTGTCCGTGTGGAGTACACGCGTTGTCCGGCGGGCGATTG
-TCAATGGAGCGCGAAAAATTCAATATGGAAGGCCAGCACCCCGTGTTAAC
-ATTTAAAAATTACAAGATTTGCCCCCTCAAACATCCCTGGAAAAACTAGA
-AAAACCTCGTGTGCTTGCCTGACAACAGCTGTTCACCGACAAAAAGATGA
-CGGGGAGGGCTTCAACAGAGCTTGTGTTTCCTCGTCAACTCTTTCGAGAA
-CTGACAGCACTTTTCATATAACTCATCACTAACTTTCGCTGCTCGTGGCG
-GTTTTTTTTAGTTCCCCAGTAATGAGTCAATTTTGTCTGTTGCTCAGAAC
-TCTCAATTACCGATGCTATTAGCGGAAGGACTTTTGGAGCGCCGGAGCCA
-GAGCAAAATTCATTTTTATTTGAAAAATGAGTGATGAGTTTTTCTCTCTG
-TTTTTCCATGTTTTTCTCGTTATTAGGCTGTAACTTTCCACATACACTTG
-GTGTCAGAGAGTCCCATCACGGTTTGATCTACAATAAAAGTGTGACGTCA
-GCACGTTCTTAACCTTGTGACAATAGTTGAAAAATCTGCGTCTCGTTTCC
-CGCATTTTTGTAGATCACACCGTGATGGGACTCTCTAACACCACGTACAC
-ATGAAAATTTCGCTGAGAACAAATTTTTGCGCGTCAAATCTGATGTATCC
-GGACTGTACCGATATCAATACATCGAATTTGACGCGCAAACTCCGTTTTC
-ATGGGGAATTGTTGAAAAAATTGTTTAACTTCCGGAAAATTAACATTTTT
-CAGAGAAAATCAAAATTTTTCTGTTTTTCCTTAAATTTCTAGGAAAATTG
-TAGCAGATTTTGTTGAAAAAATTCAAATTTCCACTGAAAAAAGTGAAAAA
-AGAAGACGATGTGTAAGCCTAAGCCTAAGCCTAAGACTAGGTCTAAGCCT
-AAGCCTGAGCCTATGCCTCAGCCTGAGAATAAGCGTGAGCCTAAGCGTGA
-GCCTAAGTCTAAACCTAAGCCTAAGCCTAAGCCTGATCCCAAGCCCACAT
-GGTGCCAGGCTGACCCATAACGGTTTGATCTACAAAAAATGCGCGAAATT
-TTTTGCCCAAAAAATTTGACGTCAGCGCTTTCTTAACCATGCGAAATCAG
-TTGAGAACTCTGCGTCTCTTCTCCCGCATTTTTTGTAGGTCTACGTAGAT
-CAAGCCTAAATGGGACACTCTGACACCACGTGAAGCCTAATCCTGAGTCT
-AAGCCTTATCCAATTTCCGAAAAATCAATAAAAATGCAAATAACATAGAT
-ATTCCCGCCTAAAGTTCAATAAATTATTTTTTTTTTGAAACTTTTTTCAA
-AACTTGCGAATGCATAGTACCAAAAAACGCCATATTTGACACGCAATTTT
-TGGATTGACTTTTTTTTGAATTGATATGTCATGAGCATCACTCAAGTGGT
-TCCAAAAAGGCGTCAAGTACTTGAGCCCTCCCTGAGCCACCACCGTCTCC
-AGAGAGCAGCCGAAACCAAAAACAAATAGGGGGAAAATGAACAGTTCTCT
-CTGTTTCAAAATCTATATATTCCTGTTCTTTGTATTATCTTCCGTGCGGC
-TTCAGCCCTCTACTGCTGCTCCAATTCTTTTCCATGTTATTTACCGTACC
-GATTAGACGAATGAACAGGACCCCCTTTTACCGTTCAACCGATGAGCCAA
-TGTGCTCTTTGTTGGCTAATTTGGGTGTTTTGCTCATTTGGAGGAACACT
-AACTTCCCTCTCTAACTACACACTACGTGGAAGAGTTTTTTCAGATTTCT
-AGGCCTCGCAACTTTCCTTGGTGGCCCAGAAAAACGCTTAAAACTTCAAG
-GTCAAAACGTTCATTTTTGTTGAAAAAAATCGGTTTTTACTTGAATTTTT
-GTAAGTGGAAGAGTTTCCTAAATTTCTAGGCCATGTGCTTTTTCCTGCTT
-ATCTGAAAATTTTGTTCAAATTTTCTTTTTTCACTTAAATATTCCCCGAA
-AATCTTGTCCACAAAAAGAAATTTTTGAACATTCAGATCATTTTTTTAGA
-ATGGAAGAGTTTTCCAGATTTCTAGGCCACATGGCTTTTCCTGGTGGCCT
-AGAAAATTTTCTGTTGGAAGAATCAGGTTTTTACTTGAATTTTCGTAAGT
-GGAAGAGTTTTTTACATTTCTAGGCCACGTGATTTTTTCCTGATGGTCTA
-GGAAACTTGTTTTCTCTAATTTTCCCCGATTTTGGATAATATTTGTTTAG
-TGGAAGAGTTTTCAGAAATTCTAGGCCACGTGGTTTTTTTTGGAAAAGAA
-ATATTTAGATCACATTAACATGTACTTTTATCAGATTTTTTGCCAAAATA
-CCAATTTTACAAGCTATTTTTTTGTTATATGTAAATTTTGTGGAAGAGTT
-TTTAAAATTTCTAGGCCACCTCTAGATGCACGTGGTGTCAGAGTGTCTCA
-TTTCGGTTTGATCTACGTGGATCTACAAAAAATGCGGGAGACGAGACGCA
-GAGTTCTCACCTGATTTTACATGGTTAAAAACGTGATGACGTCACATTTT
-TTGGGCAAAAAATGCCCGCATTTTTTGTAGATCAAACCGTAATGGGACAG
-CCTGACACTACGTGTACGTGCAGATGGCCTAGAAATGCTAAAATCTGTTT
-TTTAAATGTAACTTTGAAAGTGAAAGAAACAATTAGAAACAAGTTGGCTG
-TCGCCCCCAAAAAGTCTGTTCTGGCTATGTGGTCGCGAAAAGAGAAAACT
-CGGCCACCAATTTTTTTCCACGGCCAGATCTATGACGCTATGACGTCACA
-TTATCAGCTTGTTTCCGATTTACACACACATACACGTACACTTTCTCCGT
-ATCACTTTCACTGATAGCTTGAAACGAGATTAATCATCATTCCAGCTATT
-CTTTTTTATTTATTAGGTTAATGCCACTACTACTATTATTTTTTCATATT
-AAAAATACAATGAACTATGTAGACATAAATTCAAATGAGATGCCAAAAAG
-TGAGTTCGAACTTGTGGAAAATGTGTGTTTTTTAATAAATTTTTCAAAAA
-TATAGTAAATTTCTGAGAAATTTTGATTTGAATTCCCGCCAAGCATTTTT
-TTGAAAATTTTGAATTTCCGCCAACCATTTTTCCTTTTTTTTCAGAAAAT
-GTGAAAAAATTTTCTAAGCAAATTTGAATTCCCGCCAAGATTTTTTTTGA
-AAAAATTTCGAACTCGCGCTAAAGTATTTTCTAATAGCAGGATTATTGGA
-ATCCCCGCCAAAACATATTCTCAGAAAATTTGAATTTCCGCCAAAACTTT
-TTCTGATAAAATTTAAATTCCCGCCAACCATTTTTTCCTGAGAAAATTGG
-AAGAACATATTTTCAGTGAGAAAATTTGAAAATATTTTTTTCAGAAAGTT
-TGAATTCCTGCCAAAACATTTTCTAAGAAAATTTGAATTCCCGGCAAAAC
-TTTTTCTGATAATTTTTTGAAATTCCCCGCAAAAATTATAGTAAATGAAG
-ATGATTTGAGCAAAGTTATGACGTGGCCGCGGAAAAAATTGATGGCCTAG
-TTTTCTCTTTTCGCGGCCACGTAGCCAGAACAGACTTTTGGGACCGTACA
-ACCAACAAATATTTCTTCCCCTTTCAAAAATACATAAAAACCAGATTTTG
-ACATTTCTAGGCCATCTAGAGGTGCCTCGTGGCCTAGAAATTTGAAAAAC
-TCTTCCAGAAAATTTGTTCTGTATTTCTTGAAAGTGCTCCAACAAATCTG
-TGCAAATTTTAAAAACGTTTCAAAATATTTATTGAATAAATTCTTTTGTT
-GCACAAAGAGGTATCAAATCAGACCACCAGATTCGACCGTTGATCATTGT
-TTCAGTTGATAGGTAGGCAGGCGTGGTTGCCTGAAACCTGCCGGCCTCAC
-GCTGGGCAAGAGGCAGGCCGCCTTAATGTCAGGCAGGCAATGCCTACATG
-CAAGCCCTACTTCTACGATTATCTCGAAATTTAGCGAGTTTTTATTTGTC
-CAAAAAAAATCGCAACTGAACAACATGAAAAAGCCGCCAAAAACTTTCAT
-AAAATTCTGTCCGTAGTTTGCCGTTTCTTGCGTCTCATGCTTAATCCCTA
-CTGTAATTATGCTGAGATTTTCGATCTTTTTCACTTTTTGAAAATTTTTG
-GCAATTCTTTTTAAGTTTGTTGAGATTGTAACTTATGACAAACAGTAACT
-AAAAAGCGTGGCCGCCAAATTTTCTAGGCCATCAATATCAGTTGCGTCAT
-TTCTTCACCATACTGGACCGAGAAATATTCTAGGACATGTGTTTGCGTCA
-TTCCTCTTCCATTCCTAGTCCCAAAAATTCCAAGACCACTGGTAAGTTTG
-GCCGAGAAATATTCTAGGCCATCGATGTTAATGACGCCATTTCATACCCG
-AATTGGCCACTAAAATTCTTAGGTCATCAGTGACGTCACACCTCTTCCAA
-GCCTTGGAATGAGCATTTCTAGGCCCTCTAATCTAGGCTTGGCCGTCAAA
-TTTCCTAGGCCAGGTGACGCCATCCCTCTTCCATGCTCGACCACTAGGTC
-AAATGACGTCACTTCTCTTCCACCTACCGCACTTTGATTTCCTAGGCCAC
-CATGTGACGTCACTTCTCTTCCATCTAGGTTTCCCATGCCCTTCTCCTCT
-CACGTGGTATCAGAGTGTCTCATTTTGGCTTGAATACGTTGATCTACAAA
-AAATGCGGGAGAAGAGACGCAGAGTTCTCAACTGATTTCGCTTGGTTACG
-CACGTGCTGCCGTCACATGTTTTTGGGCAAAAAATTCCCGCATATTTTGT
-AGATCATACCGTAATGGGGTGTCCTCTTGTTAAATATCGAAATTTCACTC
-AAAAATTTTGAACGTTGAGCTTTTTGTCTCTGGTCAATTGGTCAGCCGCG
-CAGTGTTCCGGTGTTTGTGCTCATGTTTTCGTGTGCACATTTGTGCTGCT
-GCTAAGGCGTATTTTGTTCCGGGCGGGGACAGGGGGGAGAAGCAAAAATG
-TGTCAAATTTTGTTTGTTTTGCCATTGATATTGTCCTTCTGCTCAGAGGA
-TTTCCTCATTTTACGCCGTATGTGCAAAAGCATAATCACCACAATAATTT
-TGAATATAAGTTTGCAAACGCGCCCTATTGATAATCCTCGCCCGTGTAGT
-CTGCGTGCACGTGGTGTCAAAGTGTCCCATTTTGGTTTGATCTCCGAGAA
-ATGCGGGAGAAGAGGTGCAGACTTTTCAACTGATTTTGCATGGTTAAGAG
-TGTGCTGGCGTCACGTTTTTCTGGGGGCAAAAATTCCCGCATTTTTTGTA
-GATCAAATTGCAAAGCGCCCTATTGATAATCTTAGCCCGTGTAGTCTCTT
-GTTTAATTTTCAATTTTTCTGGTTCGGCACCTAAACTGTAACTACGACAC
-TCGGCAAAGTTAGACTGTTAAACTCCGCCCACTTAATGGCACCTTTTTTG
-CAGAAATGTACCCAACCGACAAAGAGCAGACACGGACCACATTTGAGACG
-AGAAGTCGGCGGAAACGGCTGGCGCAGGTCGCCGCCACAATTGCTAGCGT
-GATATTACTCTTGTTGGCAGGTAAGTAAAAAACTACGACACTCCGAGACC
-AAGAAAAAAATCGATAATCGAAATATTGAAAATTGCAAAATTTATTTCGC
-CGGATCATTTTCCATATCGATTTTCTGAATGGTATGGTGATAGCAATCCT
-CATCGTAGGCACATCCCTGGTGAACCACGTACTCTTGACCTGAAAAATAG
-GTTTCGTTCGGTGGAGCACATTTGCATACACTGACCTTTAATCGGGTGGC
-GACACGCTTTACACTTGAAACATGCCATATGCCAGTGGACATTGAACGCC
-GACACGCATCTCTCAAAAGTCGGCAATTTGCACGCGTGGCATTTTGGTGA
-CTTGGCCGCCCGGTGACAGTCCGCGCAACGGAGCGCGTTACCGTACGGCG
-CGGGCATTGGATAACACGGAGTCATGCCAATGACTGTCTGGAATTTTGGA
-GAAATTTATTGATTTTTTGACGGAATTTAATGAAATAAGGAAAAATCAAT
-AATCGACATATTTATTTCGCAAAAAAAAAAAAACATTATTGATTTTCACG
-GATTTCTGTCTTCCTCATAAATTGAAATGGAAGAGTTTGCCAAACTAGGC
-CATTTTGGCTCGGCCATATCTGGGGTAGATTTACGGTGCGTTGCGTGTCG
-CGTCGCGGCTCGGTTTTTGTAGTAAAACTAAATGTATTTGTCCGTGCATG
-GAATTCTGGCTTCCCTCATAAATCGAAATGGCAGAGTTTGCCGAACTAGG
-CCATTTTGGGTCGGAGAGATTTTGTGTAGATTTACGGCGCGTTGCGTGTC
-GCGTCGCGGCTCGTTTTCAATTGTAAAACTGCTGTATTTGTCCGTGTGGC
-GTACACAACACTTTTCCACGCGCTGTCCGGCAGGCAATTGTCAGTGGAGC
-GCAAAAATTTAATTAGGAAGGCCAGAACCCCGTGTCCGTGTGGAGTGCAC
-GACTTTCCCGCGCGTTGTCCGGCGGGCGATTGTCAATGGAGCGCGAAAAA
-TTCAATGAGGAATGCTTTTTGCAAAAACAAATTACATAGGCTTCTGGCCT
-TCCTTATTGCATTTTTCGCGCTCCATTGACAATCGCCTTAAAGCAGGGGA
-GTGTGTGTGTGTGTACTCCACACGGACAACTTAAAATGAAAACCGAGCCG
-CGACGCGACACGCAACGCGCCGTAAATCTACTCCGGCCGTGGCCGAGTCA
-AAATGGCTTAATTCGGCAAATTCTTACATTTCAAAATATGAGGGAAGCCA
-GAAACGTGTGTCACATGTTATAAAATTAATTTTGAAAAAAAATTATTAAA
-TTTCGCAAAAATAAATTATCGCTTTTTGTAAGAATTTATCGAATGAATTG
-ATTAAAAATTTATCGAATTTTAGCGAATCAGAAAATATCGATTTTCACTA
-AGAATTTATCGAATTTTTCGATTTTCGCTAAAATTATCGATTATTGCAAT
-GTTTTACCTGACAAACCGAGCATTTCAGGCATGAAATATGATACATCTCG
-TCTTGAATTTTGATCACTTTTCCCTGCAAAAATCGATATTTTCAATTGAA
-TATATTTCCAAAAATGTGCTCACAGTTTGAGCTTCTTGACGAGTCAGCGT
-TGTTGTGCAGCCTTTGCAATGGATATTATATGGAAGAACAATCTTTTGGA
-GACGTTTATTGTTCGACGAGAACAACATTTTTCGAATTTTTGAAATGATT
-AATTTAAAAATTTAAAAAGGAGAAAATTGAAGAGAAACGTGGGAAAACGT
-ATTGATTTTTCAAAATTTTATTGATTTTATAATCACGGGGTTCTGGTCTT
-CCTCATTGAACTTTTCGCGCTCCATTGACAATCGCCTTCCGGACAACACG
-TGGGAAAGTCGTGCACTCCACACGGATAAATACATTTAGTTTTACAACTA
-AAATCGAGCCGCGACGCGACACGCAACGCGCCGTAAATTTACCCCAGATA
-TGGCCGAGCCAAAATGGCCTAGTTCGGCAAACTCTTCCATATGAGGGAAG
-CCATAAATCCGTGTATAATCAAACGCGCAATTTAAAAAAATCGGTAGTTG
-AAATTTATCGATTTTCCCTCGATCTTATCGATTTTTTAAAAGACTTATCG
-ATTTTTATCCAAATTTATTATTTGAAAAATCAACGTTTATTGATTTTTGT
-CATGATTTATCGATTTTCTCAAGAGATTATCGATTTTTGCTGTCGATGCA
-CCATGTGCAAACTTCGCCACGTTTTTTCGCGGCGAGACCCAAATTTTTTG
-AATTTTCAGTTCTCGGTCTGGTATACGGTAGCTTCTACCTCTACCGTCGA
-TATGTGACAGATGCAAATGATAAACGGGATAATGATGAATATTTGCGAAA
-ACTCGTTCGTCAAGTCAATGACTCGCCGGAGACCACGTGGAAAGCCAAAT
-TCAATAAGTTTGGTGTCAAAAATCGATCTTACGGATTCAAATATACGAGA
-AATCAGACGGCGGTCGAGGAATACGTGGAACAAATTCGAAAATTTTTCGA
-GTCTGATGCGATGAAGCGGCATTTGGAGTGAGTTAACTCAAATTTGAGCG
-GGAAACAACGATGCTCCGCGCTCTCGCCGCATGTAGTTTAGCGCGTAAGC
-TGTGATGCATACGATAGTCCTGCAATGCATCATATTTTACACGCAAATGC
-AGAAATTACCAAATTTCGAGAAAAATCTATATTTTCCTTTTAAAAATTAT
-CGATTTTTTAAACAAAACTTCTGAATAATTGGATTTTTCCAGAAGTTTTA
-AAAAGTTTTGGGTACAATTTTAAAAAGACAGCAAAATGTTCGTAAAACAC
-CAGGAAAGAATTTTGCGCTTAATATCTGATGCTTCGTAAACTCCACGGGC
-TTCCGGCCTTAAAGCCGAGCTACGCGCCGTAAATCTACCCCGGCCGCAAC
-GCGCCGTAAATCTACCCCGGCCGTGGCCGAGCTCAAGTGGCCTAGTTCGG
-CAAAATCTTCCATTTCAAAATATGAGTGAAGCCAGAGGCGCGTGAATGAT
-GACTTCCACACGGTTCGGTAGAGCGCATTTACACTTATGTACCCTTTGCC
-GGGCTGCGTTCAAAACCTAAAAATTTGAAATTTTGCGCGTAAGATCTGGT
-GCATTGGGTTCTGAATTATTTCGACAAAACATGGTGCATCATCCCAAAAA
-TTGCAATTTTGCAGTGAACTTGAGAACTTTAACAGCTCCGATGTTCCGAA
-AAACTTCGACGCTCGTCAGAAATGGCCGAATTGCCCGTCAATCTCGAATG
-TTCCAAATCAGGGAGGATGCGGGAGTTGCTTCGCGGTCGCCGCCGCCGGT
-GTCGCCTCCGACCGTGCCTGTATTCACTCGAATGGAACTTTTAAGTCACT
-TTTGTCCGAGGAGGATATTATTGGATGCTGCTCGGTGTGCGGAAATTGTT
-ACGGCGGAGATCCACTGAAGGCCTTGACCTATTGGGTTAATCAGGGACTT
-GTTACAGGTAAGCGGTGACGTCATAGGTGGCCTAGGAACCTTTGATCTAC
-AATGTGATTGAATTTTATATCACGCAATTTGTAATAATTTCTAAAAAAAA
-TTATCGATTTTTCTGAAAATTAACTTGTTCCAAATTTTGAACGAATTTTC
-TAGAAGATTTTTGCAATTTATCGATTTTTGCAAGCTATCGATTTTTCCCG
-CAAACTATCGATTTTTCTAGAAAATTATCGATTTTTCTAGAAAATTATTG
-ATTTTTCTAGAAAATTAACGATTTTTCTAGAAAATTTTCGATTTTTCTAA
-AAAAAATTATCGACTTTTTTCTCAAAAGTATCGATTTTTGCAATTTATCG
-ATTTTTTGAAATTTATCGATTTTCCCTGCAAATTATCGACTTTTTTGAAA
-ATAAGCTTTCCCCAAAAATTTGAACGAATTTTCTAGAAATTATCAACTTT
-TGCAATTTATCGATTTTTTTTTTGCAATTTATCGATTTTTTGCAAATTAT
-CGATTTTTTGCAAATTATCGATTTTTCCAAACAATAACGATTCTTCTAAG
-CCCGTGGAAGAGTTTTTCGAAAACCTAGGCCATCTCTATTTCCAGGTGGC
-CGTGACGGTTGCCGTCCCTACTCGTTTGACCTGTCGTGTGGAGTCCCGTG
-CTCGCCGGCCACGTTCTTTGAGGCCGAGGAGAAGCGAACATGTATGAAGA
-GGTGTCAGAATATCTATTACCAGCAGAAATATGAGGAGGATAAACATTTT
-GGTTAGAGATATTTTTTTTTAGAAAAATAGAGAAAAATTTCTGGGATCTA
-TTCAAAAATGGCAAACTTTTTGGAAATTATCGATTTTTTCCGGTAAATAA
-TTATCAATTTTTTTCTCGGAAAATATCGATTTTTTCGGAAATTGACAATT
-TTTTCGAAAATTATCGATTTTTTCCGTTAATGATCGATTTATTCGGAAAT
-TATTGATTTTTCCGATAATTATCGATTTTTCGGATAATTATCGATTTTTT
-CCGATAATTATCGATTTTCCGGTAATTATCGATTTTTTCCGATAATTATC
-GATTTTTCGGATAATTATCGATTTTTTCCGATAATTATCGATTTTCCCGA
-TAATTATCGATTTTTCCGGTAATTATCGATTTTTTCCGATAATTATCGAT
-TTTTCCGATAATAATCGACTTTTCCGATAGTTATCGATTTTTCCGATAAT
-TATCGATTTTTTTTCGATAATTATCGACTTTTCGGGTAATTATCGATTTT
-CCCGATAATTATCGATTTTTCCGGTAATTATCGATTTTTTCCGATAATTA
-TCGATTTTTCCGATAATAATCGACTTTTCCGATAGTTATCGATTTTTCCG
-ATAATTATCGATTTTTTTCGATAATTATCGACTTTTCGGGTAATTATCGA
-TTTTTTTCCGGAAATCATGAATTTTTCCAATAATTATCAATTTTTTCCGA
-TAATTATCAATTTTTCCGATAATTATCGATTTTTCGGATAATTATCGATT
-TTTTCCGATAATTATCGATTTTCCCGATAATTATCGATTTTTCCGGTAAT
-TATCGATTTTTTCCGATAATTATCGATTTTTCCGATAATAATCGACTTTT
-CCGATAGTTATCGATTTTTCCGATAATTATCGATTTTTTTTCGATAATTA
-TCGACTTTTCGGGTAATTATCGATTTTCCCGATAATTATCGATTTTTCCG
-GTAATTATCGATTTTTTCCGATAATTATCGATTTTTCCGATAATAATCGA
-CTTTTCCGATAGTTATCGATTTTTCCGATAATTATCGATTTTTTTCGATA
-ATTATCGACTTTTCGGGTAATTATCGATTTTTTCCGATAATTATCGATTT
-TTCCGATAATAATCGACTTTTCCGATAGTTATCGATTTTTCCGATAATTA
-TCGATTTTTTTTCGATAATTATCGACTTTTCGGGTAATTATCGATTTTCC
-CGATAATTATCGATTTTTCCGGTAATTATCGATTTTTTCCGATAATTATC
-GATTTTTCCGATAATAATCGACTTTTCCGATAGTTATCGATTTTTCCGAT
-AATTATCGATTTTTTTCGATAATTATCGACTTTTCGGGTAATTATCGATT
-TTTTTCCGGAAATCATGAATTTTTCCAATAATTATCAATTTTTTCCGATA
-ATTATCAATTTTTCCGATAATTATCGATTTTTCGGATAATTATCGATTTT
-TTCCGATAATTATCGATTTTCCCGATAATTATCGATTTTTCCGGTAATTA
-TCGATTTTTTCCGATAATTATCGATTTTTCCGATAATAATCGACTTTTCC
-GATAGTTATCGATTTTTCCGATAATTATCGATTTTTTTTCGATAATTATC
-GACTTTTCGGGTAATTATCGATTTTCCCGATAATTATCGATTTTTCCGGT
-AATTATCGATTTTTTCCGATAATTATCGATTTTTCCGATAATAATCGACT
-TTTCCGATAGTTATCGATTTTTCCGATAATTATCGATTTTTTTCGATAAT
-TATCGACTTTTCGGGTAATTATCGATTTTTTTCCGGAAATCATGAATTTT
-TCCAATAATTATCAATTTTTTCCGATAATTATCAATTTTTCCGATAATTA
-TCGTTTTTCCCGATAATTATCGATTTTTCCGATAATTATCGATTTTTCGG
-ATAATTATCGATTTTTCCGATAATTATCGATTTTTCCGATAATTATCGAT
-TTTTCCGATATTTTTTTTCGGAAATGGCTGCCCCATCGCGGTTTGATCTA
-CAAAAAATGCGGGAATTTTTAGCCCAAAAACATGTGACGTCAGCACGTTC
-TTAACCATACGAAATCAGTTGAGAACTCTGCCGCATTTTTTGTAGATCTA
-CGTAGATCAAGCCGCAATGAGACACTCTGGCACCAAGTGTCTGTAATTGA
-CTTCACGGAAGAAAATATATTTTTATTTAATGCGCAAAACTAAAATTCAA
-AATTTCGTTTCGACCAATACACCATATTTTAAGCGCAAATTTCAATTCAA
-ATTTTTGCAGCAACCTTTGCCTATTCAATGTATCCCCGCTCAATGACAGT
-ATCCCCCGATGGAAAGGAACGAGTAAAGGTGCCAACAATCATCGGTCACT
-TCAACGATAAGAAAACCGAGAAGCTGAACGTGACCGAGTACCGTGACATC
-ATCAAAAAAGAAATTCTACTTTATGGTCCCACCACGATGGCGTTCCCAGT
-TCCCGAAGAATTCCTTCATTATTCGAGCGGAGTGTTCCGCCCGTATCCAA
-CTGATGGTTTCGACGATCGAATTGTGTATTGGCACGTGGTTCGATTGATC
-GGATGGGGAGAATCAGATGATGGAACACATTATTGGTTGGCTGTTAATAG
-TTTTGGTAACCATTGGGGTGATAATGGTGAGTTTTCGTGCAAATTGCGCA
-CGGCCCGGCAAATGGTACATCCATACAAATGCGCTCCACTGATAATTTGA
-GTTTAGCCAGGTTTGGGCGCGTTTTAAGGAAAACGCCTTGGTCCAAAAAA
-TTTAGAATTTGATTTCGGACATTTTTTATATGCATCACAAAAATGTTGGA
-CGAGCCGTTTTTGAGAAAAAGCCCAGGTATACGGTAAACAAATTGCGTAC
-AGGTGCCACTTCCCGGGCCGTGATGCGCGTTAAATATAGTGCTTTTTAAG
-AATGCGTGTTGCGCAACATATTTGACGCGCAAAATATCTCGTAGCGAAAA
-CTACAGTAATTTTTCAAATGACTACTGCAGCGTTTATGTCGATTTACGGG
-CTCGAAAAAAAAGTTACAGCGATATTCCATTTTTTCTCATTTTTTGCTTA
-TTTTTATTTAGTATTCTCACGGTGTGTCATTCTGTCCCATAACGGTTTGA
-TCTACAAAAAATGCGGGAATTTTTCGCCCAGAAAAATGTGACGTCAGCAC
-GCCCCTAACCATACGAAATTTGTTGAGAAATCTGCGTATAAATTCCCGCA
-TTTTTTGTAGATCACGCCGAAGTGAGACACTTTGACACCACGTGTATTCT
-ATCTAAAAATAAATTATTTCAAAAATAGAGCCCGAAAAAAAAAATCGACA
-AAAGCGCTACAGTAGTCATTTAAAGAATTACTGTAGTTTTCGCTACGAGA
-TATATTGATATTTTGCGCGTCAAATATGTTGCGCAGTACGCATTCTTAGA
-ATTTTGTGTTGCCGTAAATAAATTTGGACGTCAAATACAGTGCATATTGC
-GGTCGATCGGCTACAATATATTTTGCGAGCAAATTTGGAAGTTTTGCGCG
-TCAAATATGATGTAGCCGATCGGTCATGTTACAAAACACCATATTTGACG
-CGCAAAACTTTAATTTTGGACAAAAAGTCAGAGAATTAGTATTGCGTAAA
-AAACTGGCAATTTTTTTCAGAACATTTCTGAAATTTTCAATATATTTTCA
-AACTTTTCGCGTCAAATATGGTGCATCAAGTCGCGAACCAAATACACTCT
-AACACGTAGTGCCAGGCTGTCCCATTATAGTTTGACCTACAAAAACGCGG
-GAATTTTTCGCCCAAAAAAATGTGACGTCAGCACGTTCTTAACCATGCAA
-AATCAGTTGAGAACTCTGCGTCTCCTCTTCTCCCGCATTTTTTGTAGATC
-AACGTGATTCAGGCCGAAATGTGACACTCTGACACCACGTGGCCCTAATT
-AACTCGTAAAAATCACCGTTTTTTTTCCAGGACTCTTCAAAATCAACACA
-GATGACATGGAAAAATATGGTCTAGAGTATGAAACAGCAGTCGTCTAATT
-ATAATTCGGCAAAAATTTTTTGTAAATAGTTAAATATTGTCCACCTATTT
-CATCCCCACCCGATTGCATCTCAACTTGTCCCATTTCCGAGAAAAATCAA
-TTATTTATTTTTATTCGGCCATCATTTATTAGCTCCCTCATTCCATAGTT
-TTTTTTTAATTAGATTTTTTTTGGATGCTAAAATTTGCCATTCTCATAGA
-CATTTTCAATATTTGTGTAAAATAAATCATTTTTCTGGTCTTCAATTGAT
-GGAAAAAAACAAAAAAACAATGCGCGTCAGGTTTGGTGTATTGTGTGCAA
-ACACCGAGCGCATATTTTGAAATTTATTTTTTTTTCGAATTTATTAAAGT
-TGCTGATTTTCTTTAATTTCAGGCTTAAAAATGTCGGATTTTGTGCCAGA
-AACCGAGGAAAATGAAGAAGAATCTCAAAAAATCGATGAAATCCATGAAA
-TCCCAGCTCAAGCAATTATCATCGACCAAAGTGAGGAAAATGCTGACTTT
-ATCAATTTTCAATTACTTTTTGCATTTTTTCTAGGTTTTTCTCGACGATT
-TCTCAACAATAAATGGTACGGAAAGTACGGCGAAGATGGGGATCTTCTGG
-AGCACATCGACGAGGACTGGGAGCCCGTAGGCCTCGACGAAGTGGAATTT
-CTGAGCCAACTGTGGTTTGAGCAGGAGGATCAGGAGAAAAAAGCTCATAG
-GCACTATGATTGGGATGAAGAAAAGAAGGAATGGGTGCCGAAGGCCAAGC
-AGGAGGAGGTCAATGAGGATTTTATCGCAGAATATCAAGCGAATTACGGG
-GTTCAGTATGATGATATTTATAAAAAAATGGACGAAGAATTGCAAGAAAA
-AGCGGCAAAAGCTCAAAAAGAAGATGAAGAGAAGAAGGAGAAGAAGCGGA
-AGAAAAAAGTTGGCTTGGGAGCCGGGGAAGACGCTAAAGAGGGCTGGCTT
-GACCTAGGAGATAAGGTTCATGCGGTTTATGTGTCAAATCTTCCGGAAGA
-TATTACAGACGAGGAATTCCAGAAATTTATGTCAAAATGTGGAGTTATTC
-AGCCGGATATTCGAACGAATAAGCCGAAATGCAAGCTTTACCGGGAGGAA
-AACGGCAAACTCAAAGGCGACGGAAGATGTTGTTATATTAAGAAGGAATC
-TGTCGAGCTTGCCTGTAACATTCTCGATGGAGCGAACTTAAACGGGCGGG
-AAGTGAAGGTTGAGGAAGCTCGATTTGAGATGAAGGGCGATTTTGATCCG
-GCGAGGAAGCGGCGGAAATTGACTGCGGCGCAGAAAAAACGATATATGGA
-GCAGCAGAATAAGTAATAAAAAATATTTGGTGAAATTTGAAATAGCTCGT
-AAATCGACATTAAGCTGAAAAAATGAAAAAAAACCAAAAAAAATCGTATT
-ACGGGAACACAAAATCCTGAGAATGCGTACTGCACAACATTTTTTTTTTT
-TTTGACGCGCAAAATATCTCGTAGCGAAAACTAAGACTACTGTAGCACTT
-GTGTCGATTTACGGGCTGCTCGATTTTCGAAATGAATTAAAAGAATTTAT
-TTATGTGATATTGAAATTGGGCAAAAAATAGGAAAATAATACAAAAAAAT
-CTAAAAAATTTATTTCAATAATCGAGCCCCCGTAAATCGACACAAGCGCT
-ACAGTAGTCATTTAAAGAGTAGTTTTCGCTACGAGATATTTTGCGCGTCA
-AATATGTTGTGCAATACGCATTCTCAGAATATTGTGTTCCCATAATATAT
-CGACGAAAAAATTGGCCCAAATCGTGGATTTTTGTCCGAATTTGATGACA
-AATGGCTTTGAAAATCACAAAATTTCAGAGAAAAATTTCGATTTTTGGTT
-TAAAAAAACAAAAATTGAAACCCAACAAAATTGTTAACTTGAAAACCTGC
-TGAAAATCTTAGAATTTTCAGATTTCACCCAAAAAATACCAGATTTAACT
-CGAAAATTGCGAATTTTAGGCCAAATTCCTTGCATTTTTCATAGAAAAGA
-TAAACTAACGACACAAAATCAAATGAAATTGACTAAAAAACTATTGAATT
-TTGTAGAAAAATCCCGATTTTTGCCTAAATTTGCAAAAAAAATATTTTAT
-TTTAGCATTTATTTTTCTTAATTTTCACACTAAAAATTACGAAAAAAGAC
-AAAAAAAATTTTTTTCATTCAACAATTTTTTGGGCTAAAATGTGTAATTT
-TTGCGGGAAGAATTCGAAAAATTATTAAAAATCGTAGAGACTAACTGAAA
-ATCAATTTTTTAGGGACCAAAAAGCCAACTTTTGCCGATTTTACTCAAAT
-TTTTCCGTGAAAAATCCGGAATTTTTAAATATTATTTAATTGCGAAATTT
-TACAATTTTTACACCTAAAATAAGGGTAATATGGTAGCTGGTCTCGACAC
-GACAATTTTTTTGTTAAATTCTAAAAAAGGTGTGCGCCTTTAAAGAGTAC
-TGTAATTTCAAACTTTATGGAATTTTTTTTTGATTTTTCAAATAAACTAC
-GAAAAATCGAAGAAAATTCCACAAAGTTTGAAATTACAGTACTATTTAAA
-GGCGCATACCTTCTAGAATTTTACAAAAAATTTGTCGTGTCGTGACCGGC
-GACCGTATTACCCTAATTTTTGGTGTAAAAATCGTAAACTGTCCGGATTT
-TTCACTACGAAATTCAAATTCGAGGAAAATCGAAAAAAATTGGTTGTTTT
-GGTTCCTAAAAAATATATTTTCAGTTATTTTCTACCATTTTTTAATAATT
-TCTCGAATTTTTCCCTCAAAAATTACAAATTTCAACCAAAAATTCTGATT
-TTTCCTTTCCAGAATCTTCGAATGGACGCCCGATAAGCCACGTAACTACC
-GTCCAAAGTCGGACTGTACGGTTATTGTCAAAAATCTGTTCACTCAGGAA
-ATGATGAACAAGAATGCGGCGTTGATGTTGGATTTGAAAGAGGAAATGAC
-ACAAAGTTGTCAGAAATATGGAATTGTTAAGAAAGTCGTCGTTTATGCGG
-TTGGTATTGAGGAAATTTGTGGAAATTTCGATTTTTGTAAAAAAAATTTA
-TTCTAAAAAAATAAATTAAAAAAAAAAGATTTAAAAAATTTAAAGCTAAT
-TTTCGAAAAATTGAAGCTAATTTTGGAAAAAAAACCGAAAATTTTTTTTT
-TTAGAAATGTCGATATTCATAAAAAAATATTCTAAAAACGGGATCAAAAA
-TTTTTGAAGCTATTTGTCGGAAAAATTTTTAAAAATGTAAAGCTAATTTT
-CGAAAAAAAACCCAAAATTATTGGATTTAACAAATTTTCAAAAAAATTGT
-TCTAAAAAAGATAACCTTTAACATTAAAAAAATTATGGCTATTTTTCGAA
-AAATTAAAAAAAAACAATTTTTAGCTAATTTTCGAAAAAAAACCGAAAAT
-TTGTGGAAATTTCGATTTTCAAAAAAAATTTATTCTAAAAAAAAATAAAT
-TTTTAACATTAAAAAATGGCTATTTTTCGAAAAAACCGAAAATTTTTGGA
-AATTTCGATTTTCGAAAAAAAAGTATTTTAAAAAAACAATGAGAAATGGT
-TATAAATTGTTCTTTCAAAAATTTTTTACAGCTTTTTTTTTCGAGAAATT
-TAAAAAAAAAACAATTTTTAGCTAATTTTAAAAAAAGTAAAGCTAATTTT
-CAAAAAGAACCCCAAAATTGATGCATTTATCGATTTTTAAAATAAATTGT
-TCAAAAAAAGATAAATTTAAAAAAAAAGTTATTGGATTTTTTAAAGTTAT
-TGGATTTTTCAATTTTCAAAAAAAAATCATCAAAATGTATAAATAAATAA
-AAACTATGGATTTCGAAAAATTAAAAAAAACAATTTTTAGCTAATTTACG
-GAATTAAAACAACAAAAAATTTCGGAAAATCGAAAATTGTTGGTTTTTTT
-TTTCGATTAAAAAAATTCAAAATCTTCTGAAAGACATTTTTAAAATTTCC
-AAAAAAAAATTATGAGTATTTTTCAAAAAACAAATCGAATTTTGATTAAC
-TTCCGATTTTTTTGACATTTTTTGAAATTTGAAAATCATTAATTCAAAAA
-TTTTTATTGAAATAATTCAAAAATTTTTATTGAAAAAAAACGAAAATTTT
-TGATTTTCGCTTGAATATTTCGGAAAAAACAATCGATTAAAAAAAAAATA
-GGCTTCTAGTTATTTTTCAAGAATGCTTTTTTTTTGACAAACTGCTGATT
-TTTTGTCAGTTTCGTCGATTTTCGTTGTAAAAAATCAAAAATTCAAAATT
-TCTTCTATTACGAGTGCACAAAATGCTGAGAATGCGTATTGCACAACATA
-TTTGACGCGCAAAATATCTCGTAGTGAAAACTACAGTAATTCTTTAAGTG
-TCTACTGTAGCGTTTTCGGAAAAATTCCACTTTTTTTATTTAAAAAAAAA
-AACGAAATATTTTGATTTTTTTTTATTAAAAAAAACGAAAAATTTTGATT
-TTTTATTAAAAAAAACGAAATATTTTGATTTTTTATTTAAAAATGAAAAA
-TTTTGATTTTCCAAAAAAAAAGGCTCCTAATTAAAAAAAAAAAATTTTTT
-TGAAAAAGTGCAGATTTTTGTCTTAAAATTTAAATCAAAAATTTTTAAAT
-AGACTTTTTCCATCAAATTTCCCCAATTTTCAGAACCACCCGGACGGCGT
-CGTATCGGTAACCTTTCCAACGACAGAAGAATCGGATATGGCTGTAAAAT
-ATCTTCACGGACGAGTAGTTGACGGTCGGAAATTGACAGCCGAGCTCTGG
-GATGGCCGGACAAAGTTTAAGGTCGAGGAGACGGAAGAGGATGAGGAGAA
-GCGTCGGAAAGAGTACGAGAAGTATATTGAGGGTGGAAGTAGTGAGACGA
-AGGAGGAGAGCGACGACGATGATGACGATGAAGCTGAAGATAATTGATTG
-ATCTAAATTTTTTCTGAAAAATTATTTTTAGTTTATACATTTTTCCGAGA
-GGAGCAACCGATCAATTTTTACCAAAACTATGTTCAAAATCGCCCAAAAA
-TATCAAATTTAGTGAATTTTCGTTTTCATGGATTTTTCGAAAATTAGCTT
-TAAAAATGTTTGCCAAATTTTTCGACGATATCGCGATATTTTAAAAATTT
-CGAACAAAAATTGCCTAATTTCAATTAAAATCCCTTTTTTCGAAATTTTC
-TAATTTTCTGGGCCAATTGGGTCGTTTAAAAAGAAAAATGGCCAAAATTT
-GAGAGTTTTAAAAAAATTCTAAAATTTCAATCCTACGATTTTCCGGGAAA
-AAAATTTTCTTGGAAAATTGCTTTTTTTTTGAAAAATTATTTTTAGTTTA
-TACATTTTTTTTCCGAAAATAGGAACAACCTATCAATTGAAATTTTCAAA
-AAAAAATTAATTAAATTTGGAAGCATTTTCCGAAAAATTGCATGTTTTCG
-GTTTTCTAGAAAAAAAAAACTAAAAGAACGAAAAATTTCACCAAAAATCA
-AATATGAAAATACTTTCCTAAAAATCTGAAAAAACCAGAAATTTTCAATT
-TTCCCTATTCAAAAAAATTCAAAAAAAAAACCAAATTTCAGTTAAAATCC
-CTTTTTTCGAAAATTTTAAAATTTTCTGCGCCATTGTGTCGTTGATTTGA
-AATTTTTTTCTAAAAATCCGTGAATTTTTGAAATTAAACAAAAAATTTGA
-AAAATCAAAAATTATCGATTTTTCAACGAAAAAAATTCAAAAATTTCAAT
-CTTACGATTTTCCTAACTAAAAAAAAATTTGAAGTAACGAAAATGTTCAA
-TTTTTTCGAAAATTTTCGAGGTCATTTAGAGTTTTTTCTGTGAAAATTGC
-ATTTTATATACTCATTTAAATTAATTTTTATATATTCCTTTCCCGAAAAC
-TTCAAAAAAAAAACCCAGTGATACAATTAAAATCGAGATAATCACAGACA
-AAGTAGGCAGTAGGCAGGCAAAAAACAGGCACATATTAAGGTAATACAAA
-ATTCTGATAATGCGTACATCGCAACACATTTGACGCGCAAAATATCTCGT
-AGCGAAAACTACAGTAATTCGTTAAATGGATACTGTAGCGCGCTAGTGTC
-GATTTACGGGAATCTTAAAGAACCTAAAGAATTGTAGGAAAAATGGAGAT
-CCCGTAAATCGACACTAGCACGCTACAGTATCCATTTAAAGAATTACTGT
-AGTTTTCGCTACGAGATATTTTGCGCGTCAAATATGTTGTTCAATACGCA
-ATTTTAAAATTTCGTGGTCTCATAATAATACACAATTAACTAGTAAATCT
-ACAAAATCTACAAAATTCTCTTCATCAACTCTTCCACAGCTCGATCGACC
-TGTGCATGAGTCTCCTCGTACGCCCACAGAGAGCACAACGCCACGTTGCT
-ATTGTCGAGACGTTCCTTATTCGAAATCTGTGACGACATGCGATCCTTGG
-CCTGATCTTCAGTCAGGTTATCCCTCGCAACGACTCGACGGACGGCTTCA
-TCTGCTGGCACGAAGACGGTCCACGTTTCGGCGAGCGTTTTGTGCCATCC
-GGCTTCGATTAGTGCGGCCGCTTCGATGACTGAATGAATTTTTTTTTCAA
-CTTTTGCAGAAAAAATTATGATTTTGCAAAATTAACGGGGAAAATTGGCT
-GTTTAAAAAATATTTATTATTTTCGCGTTTTTTTAAAATAAAAATCGATG
-AAAATTCTGCAAAGTTTGAAGCTTCAGTACCCTTCAAAGGTGCACACGTT
-TTAGAATTTAGCAAAAAATTGGCGTGTTCACGATTTTTTGGTTAAATTCA
-AGAAAGTGTGCGCCTTTAAGGAGTACTGTAATTTCAAACTTGCTGAATTT
-TCATCGATTTTTCACTTTTTTTCCACGATTAGTAAAATTTGTGTTATTGT
-AGATTTTTTAAATTTAATACCAAATTTTCCAAAAAATCGAAAAAAAAAAG
-AAAAAATGTAATTTCGTTATTTTCAAAAAAATAAATTGAAAAATTGAAAA
-AAAATCCAAATATTCGATTATATTTTTTCAGAAAATAAAAATGAAAATTG
-GAAAAAAACATATTTTTGGGTTTTTCGATTTTCCAAAAAATTTAAACATT
-TAAAAAATCTAAATTTTCGATTTTTTTCAAAAAAAAAAAATTAAAAATCG
-CACAAAAACCAAAAAAAAACATTTTTGGCCGATTTTCCAAAAAAAAAAAG
-AAAAATAAACAAAAAACAAATATTTCAAAAAAAAAAACAATTTTTTCCGA
-TTTTCCAGAAAAACAACTGAAAATCGGAACAATAATTTGTTTTTTCTATT
-TTTCAAAAAATATTGAAAAATAAAAGAAAAAACGGAAATTTTCGATTTTT
-TTCCGATTTTCCAAAAAAAAAAAATTCAAAATCTCACAAAAACCAAAAAA
-AAAATGAAAAATCAAAGAAAAACGAAAATTTCGTTATTTTCAAAAAAATA
-TCGAAAAAACTTTTTTTTCTTCCGATTTTTCTGAAAAACACTGAAAATTG
-TGGAACAATAATTTTTTTCTATTTTTTTGGTCTCCACGATTTTTCGCGAA
-AAATTTCAAAAATTAAAATTTTTTTTTAAATCCAAATTTTCACTTCCCCC
-CCCCCCCCCCCCTCACCAACAACTTTCGCCGTCGACTTCTTCACAATCTC
-CATAGCTTTCTCTTTCACCTCCGGCCAAACAAGCTCACTCAGCTCGCGGA
-GCTTCACCTTATCCGAAAACACAATCGTTCCAAGCTTCCGGCGGTCTACA
-ACTCCATCGACAACGACATCCCCTCCAAAATGTTCGCCGATTTTTCGATT
-CAACGAGCTTCCCCGTTCATAGCACGTGTGTGCGAGCTTATCACAATCGA
-TAACATCGAAATTATGCGTTTCACGGAGATATTTCCCGATATGACTTTTT
-CCCGACGCAATTCCTCCGGCGAGCCCAATGATGTACGGGGCGCCCGTTTC
-TCTTGGAACCGCCCGAGCTGGACGGAGCAAGTGACCCAGATCCTCTCGTC
-GTCTGGAGCTTGAGCTGATCTTTGTCTCTTTCAGGATCTCATCGGATCCT
-TCCACCAGCTCGACAATTATCACATCCAGCTGCGACATTCCTTGCTCATT
-TCTCTTTTTGTTCACCGCATCGGCACCTTTAATGGTCTCCCGGGACACTA
-CTATCGCTTCGAGGTCTTTTATTCGTGTTGAAGGACCGAATGGGTCGATT
-ATTGGCTCCGCGAGACATTTTGCCTGGAAAATTATGGGGGTTCTATTGAG
-CAAAAATGACCATTTTTGGAAAATTAGAAAATCGGAAAAAAAAATTTCCC
-GAAATTTTTTATTTAGAAAAGTTTTTAAAAAACAGAAATTATATATTTTT
-TGAGTTTTCCAAAACAAAAAATCGAAAAAAAATATTTCGATTTTTCGGAT
-TTTCCAAAAGAAAAAATTTAAAATATCGAAGTTTTTAGATTTGCAATAGA
-AAAATTGAAAAAAAAAACGGAAATTGTATTACGGGAACAGAAAATTCTGA
-GAATGCGTATTGTACAGCATATTTGACGCGCAAAATATCTCGTAGCGAAA
-ACTACAGTAATTCTTTAAATGACTACTGTATCGATCAAGCCCGTAAAGCG
-CTACAGTAGTAATTTAAAGAATAACTGTAGTTTTCGCTACGAGATATTTT
-GCGCGTCAAATATGTTGTGCAATACGCATTCTCAGAATTTTGTGTTGCCT
-TAATGCAATTTCCGTTTTTTTTTCAATTTTTTCTTTTGAAAATCTGAAAA
-TTTCGATTTTTTCCAATATTTTCTTTTGGAAAATCCGAAAAATCGAAACA
-AAAATTTTTTTCTATTTTTTAAATTTTTTTTTTTGGAAAATCGGAAAAAA
-ACCAAAATTTTAGTTTTTTAAAATATTTTATGGACCAAAAATATCGATTT
-TTCCTAAAGTTTTATAGAAAACTGAAAAATTTAAATATTTATTGTTTTTA
-ATTTTTAAATTTTTATGGAAAAATTTCGATTTTTTTTTTTGAAAAAAAAG
-CTTTTTTTAAATTTTTCTTTATTTTTGGAAAATCGAACATTTGCTATTTT
-TTTCGATTTATTAATTTTTTTGTTGGAATTTCTAAAAATCGATGTTTTTT
-TTTCAAAAATCAGCGGTTTTTCCGAAAAATGGCAAAAATTTTTTTAAAAA
-ACATTTATTTCTTTTCCTATTTTTCGAAAAATAAATAATTTTTTCTGGCA
-ATTTTTAATGAATTTTTGATCGGTAAACTCTTACAGTCCCGGAAATATCC
-TCTACAAAATCGACAACTTTCTTAATCCGAAACTCCACAGGCTCAATCAT
-CTCGAATAATGATTTTTCTGGAAAAAAACCAATTTGTTAAAAGTTTTATT
-TCCAAGCTATAATCTAACTAATAATCATATCCTTATCGGTGACCCCCACG
-ACAATAACATCAGAAGCGAGCTCGGCAGCCTTGTTGAGCAACACTTTGTG
-CCCATTGTGAAGCCGATCGAATGTGCCGCCCAACACGACTTTTTTGTACT
-TTTTCGCCGCCGCCAATTTTTCCGCGTTCTCCAGCAGCTTTTCCTCGCCG
-ATTAGCACATAATTCTCGGGATTTCCGCGGATTTCCGACACAACTAGACG
-GACGTCGAGCTTCGGGCATGAGCTCGCCGATGTTAGGTAGATTTTCGAGA
-CTAGCTCGTCGGTTCGCGGCTCGTCCGGGTTTAATCTGCAAGGAATCCTT
-GTTAACCTTGATTTTCGAGCCGGGAAAAAGCCCAAAGCACTTTACCTCAC
-ATAAAGCTTCGAGCTTAACGCGGCGGCCGCAGACGTGAGCAATTGCTTCA
-GTTTTTGCACATTTTTGCTATTTAACACGAGAAGTCCGTATTTCGAGCTC
-ATTGAGAATGATGAGAAATATCAGGGAATATTCCTCAAATTTTAAATAGA
-AAAATTCGCTGCCACGTTCGCTGCTCTTATCGGCTGCGCGTCTCTATTTC
-ACACACTGTCTCATCTCTCGTCTCGCGTCTCTCGTCTCTAACGCGTGACG
-GTGGAGCGCACTTCCCTCCTTTTTGCTGTAAAATCTTTCAGACATGCCGG
-AAACAAGAAAAACAAGAAATTATTGAACTGAAAATAATGTAAACGTACTC
-ATCGTATTTTTAGCTTCAAAATAAGATATCTTAGAGCATATAATATTGCT
-TCTAAACGAAAACCAAAACATCGCTGAAAATGTTGTGAATTTTATGAAAA
-TCTAGGATCATTTTTCCCATTTTTATGAAAAACAACAATAAAATGAGAAA
-AATTACATGGGAAAACCGAAGAAACTTAAATTTCGCGGTCAAAATTCGAA
-TAGAATTACTGTATTTTTCGCTCAGAGATATTTTGCGCGTCAAATATGCT
-GCGCGTGCGCATTTTCAGCGTTTTTTATTTAATAAAACAGTAATAAAATG
-ATTAAATGCATTTTGTGTGATTTTCAGCCCAAAATGTTTGAAATAAATTG
-TTGTTGTTCAAGCCAGCATTTTTAAAAACTTAAATATATGGGAAAACCAT
-AAAAATAACACAAAAGTTTGGCAAAATTTTGGAACTACAGTACTCTTTAA
-AGGCGCAAGCCCTTTAAGACAAATTTGTCGTGTCGAGACCGGACAAATAT
-TCTAAATTTCTTTTATACATACGCAGATTTAAAGTACAGAAGAGCGCATT
-TGCACATTGCGCAATTTCTAAATTTTTTCTAACAATAAAAATTAAAACCA
-AAATACTTTATTCAATACCACAAATACCACAAGTTCATTTATCTTATTCA
-ACCTCTTCCGCCGACGTCGTCTTGTTGTTGCTCTTCCCCTTCTTCTTAGA
-CTTCTGAAATTTTCTCATATATGCAAACGCGCTCCGATCTAACAAAAAAC
-CTTCTTCTTCTTTTTCTTCTTGTCTACATCTTCCTTCTTTGGCTGCTCTC
-CAGATTCTCCCCCGGCTCCCGGATCGCTCTTCCCAAAGTCCATCTCCGGC
-TTCAGCCCAACCTCAGGCGGCGCGATCATCAGTACCTGCTGGTATCCAGG
-ACCCTTGTAATCCGTCATACAATCCCAATCTGGTGGCTCCTGGGTATTTG
-ACTTAGACTTCTCAAACAGCTTCTGGATCCCATCAGCGATACGATCGTAC
-TCCACAAACTCAGCGACATCCTTGGGCTCACGGATGATGGTCAGAAGATC
-AAAGAACCCAGCAGTGGTCTCCGGAGTGGTTCTCCAAACCGACGCGACCA
-TCGGTGCAGTGATGCGACGTTTCAAGTGGAGCACGTCCTGTTCGCTTTCC
-TTGTTGAGCAGTGCCCATGGGAGAGCTCCGAGGAAGAACTCGAGCACCAT
-GTACCACCAGGACTCCATGTCGTCCTTGTAGCCGAGATTTTTCTGGGAAG
-AAAAAAGTTGTTTTAAAGAAATTGTGAACGGTAAGGTTACCCCCTGGTGA
-GCATGAACGCTCGCGTACTTGACGACTCCTCTGTAGTGAATCGCATTCTT
-TCTCATCTGCTCCTCAGCTTCGTCGTTCTTCTTGACGAATCTTAATTTTA
-AAAAAAGTTTTCGGGGTAGATTTACGACGCGTTGCGTGTCGCGTCGCGGT
-TCGATTTTAGTTGTAAAACTAAATGTATTTGTCCGTGTGGAGTACGCGAC
-TTTCCCACTCAAAATAGGATGGAATTGAATTCGGAGGTGTCACTGTTGCA
-AATTCGGATTGTCTGAATAAATATAAAGTGAGATTTTGAATTTTGCTCCA
-TTGATAATGGTGTTTTTTTTTGAAATTCTGCAAACATTAATTTCTAGAAA
-ATTTGAGTTTCCTCCAAAATTTTTCACAGAAAATTTGAATTCCCGCCAAA
-ATTTTTTCTCTGAAAATTTGAATTCCCGCCAAAATTTTTTCTCTGAAAAT
-TTGAATTCCCGCCAAAATTTTTTTCAGAAAATTTTGAACCCCGCTTAAAT
-TTTTCTGAACTAGGCTATTTTGTCTCGGCCATATCTGGGGTTGTGGTTTA
-CGGCGCGTTGCGTGTCGCGTCGCGGTTCGATTTTAGTTGTAAAACTAAAT
-GTATTTGTCCGTGTGGAGTACGCGACTTTCCCACGCGTTGTTCGTCAGGC
-AATTGTCAATGGAGCGCAAAAACTGCCGACCGCTCCAAATAACTACTTTT
-TGCACTTCATTGCATACACACAGCAGCTCGCGGCGTCGGCATGAGGCCCG
-CATTTCGCGCCTCACTGGAAGCCCCAGATGCCAAAAAATCTACCTCGGTC
-TCTTGCACAACCCGAAATCCAACAGGTAAACCTGATGGTGCTGTCCGTCA
-ATCTCTCTTCCAATACAGAAATGCGATGGCTTGATGTCGCGATGAATGAA
-TCCATTCCGGTGGAGGTCACGAATCGCGGCCAGCGTCTGCTCGGCCAAGT
-GAAGACCCGTCGCCATGCTGAACTTGCGATCCTTGTTCGTGTTCATCATC
-AGCTCGTATAGGTTCTCGCCATACTGAAATATGGAATTTGGCTGAAGTTA
-GGCAACGAAAAATGGTACCAATGGCATCACAATGAAGAGGAAGCGATTTG
-GAACCGTGCCACGTTCCTCGATATTCGTGAAGAATGGAGATGGGTGGTGG
-ATCGACGCGAGGACAACTGACATTTGACGAAGAAGCTGGAATTTTTTTTG
-CTCTCTAGAAACGGTTTTCACGGCGGCCGACAATTTCCGAGTTTGGAAAC
-TCACTGCACTTAGTCATGTAATTTTATAATGAGTGGCTAAACTCGGAAAT
-TGTCGGCCGCCGTTAAACCACAAGACAGTTGGTTCCTTCGCCGCGACCGA
-CACTTTCCGGGTTCCGCGCCGCACTATACAGAAGGCTGGCTGCGCGAGGC
-AGGCTAGACCGCGGCAGGTGTTTTGGCGCCTACATGGACTTGCTAGCTTG
-TCAACAAGGCAGCCTAAGCGTGCCTGCAAAAGGTAGGCAGGCACGCTTCT
-AAAACCGTGCCAACACACCATAAATAACTCACCGAGCTCTTCATGTTCAA
-CGCCTCGCATTTGACCGCAAAAAACTTCCCATCACTCTCGCGTTTTACCT
-TGTAAATCGAGCCGAACGTGCCCGTCGCCAGCGGTTTCGTGACTTCATAG
-GTGCCGTTTTGTGCTCGAATGAGCTCCTTTTGCGGTTGTCCAGGTCCGAC
-TGACGTCATTGATTTAACACCGAAATGTCACGATTATTCGGAAGTGAATC
-GATAATCGAAAATCGGAGACTCGAAACTTTTCGAAATAGATTTTATTATC
-TTTGTAGGGTTTTTGGAGTTTATGATGATAATGAGGAGGGGGGATTTTAT
-GTGGATTAAGAGGCTACGAGGAAAATATTTATTTTTTAAATATTTTATTG
-TCATTCTTTTCTTTTCTAGATTTTCACGTTTCTTATTATTAAAAAAAAGT
-TTTTCAGAATTTATTTCAAAATCCCGAACATAATCTGAAATTCAGAAATA
-CTACAAAAGAAAAACGAAAAAAAAACTGAGAAAAATGGTCCAGATTCTCC
-AGTATTGTTAGGCGTACCCCCCCCCCCCCCCTACCTACCTACCTTCCTTC
-CTCGCCTACATGCATACCTGCCTACCTACACGCCTGAGTGCCTGCCTACC
-TTCCTGCCTACGTTTATGTCTACATTTTTTGCCAGCCTTTTGCCAGTATA
-CTTTACGTGTGTTCTTAATTACGTGCCTATCTACTTACCTTTCTTCCTCG
-CCTACATGTATACCTGCCTACCTACACGCCTGCGTGCCCGCCTCCTGCCT
-ACCGACTCACCTACCTGTTTGCATACATGCCTGCCTACCTTCTTGACCAT
-GCCGAGGCGCCTATCTTACTACTTGCCTACCTACACGCCTGTCTATTGCC
-TACCTGTTTGGTTACATGTGCCTGTGCCGTACCTGTGCCTCAAAAACATC
-TTTATTTTGTAATAAATAATTTTAATAAAACTTTATAAAACAAAAAAAAT
-ACAAAATTGAAAATAACCTAACAAAAAGTCTTTTCAAACCCCTTCGAACT
-GCTCAACTGATAAAAATTCGTGTTATACTTCAACAATTTGAACTGCAAAT
-CCGATTTGACACAGCTAAACTTGTATTTTGTCGCTTTATTCCTGCACAAA
-TGTGCTCCTGGGCAATTGAGACTATTCGAATCGGTGTAGTAGGTGGTGAA
-GCTCTTTGAGCATCTTATTGTAGAGTGATCTTCTCGAAGACGGCCCAGAA
-TTGCGGTGATTGAGGGATTTGTGATGGTTCTGGGGATTTGATGTAATAAA
-TTTAAATTGTGTGGTTTAGATGCAGAAAAAAAAACTAAGAATTCAGACTA
-AGACTTGAAAAAGAGCCAAGAAAAGGGCGGAGCCTATTATCGATTTTTCC
-ACTTGCCGTTTATGAAGTTTATCTACACTTATATAGTCTATTATCAATAC
-TAAGTTAAACAGTATATGGTATAATAAATACTATGACTGCAAGAAAAATC
-AATAATAGGCTCCGCCTCTATATTTGTTTTTTCTCGTTTTAAATCCAAAC
-TTATTCTACGCCGAACCTATATTCTTTTATATTTTTTGAAATTATATATC
-CTTCTATTTATAAGATTTTTCCAGCCAAATTTTTTTTTCTCAGAAAAATT
-GAGTTTCCCGCCAAAATGGGTTTCTCAAAAAATTTGAATTTCCCGCCAAA
-ATTTTTTTTCTCAGAAATTTAAAATTTTCCGCAAAATTTTTCTCAGAAAA
-TTTGTATTCCCCGCCAAAAATGTTTTCTCATAAAACATGAATTTCCGTCA
-AAACTTTCTCATAAAATTTGAATTTCCCGCCAAAATTTTACGAGAAAATT
-TGAATTTCCAGCCAATCTTTTAATGAGAAAGTTTGAATTCCCACCAAAAT
-GTTTTTTTTTCTCAGAAAATTTGAATATTCCGCAAAAATGTTCTGAGGAA
-AATTGAATCTCTAGCCAATTTTTTCTCATAAAATTTGAATTTCCGGTCAG
-CTTTTTTCTGAAAAAGTTTGAATTTCGCGCAAATTTTTTTTCTCAGAAAT
-TTTAAACCTCTGGCTTTATTTTTCTCAAAAAAATTAAAATGTCCTGCCAT
-TTTTTTAAAAAAAAAATTCACAGAAAATTTGAATTTTTAATTTTAAAATT
-CACAGAAACTGACTTCCTTATCGACATGCCAATTGTCACACGATCCGCTG
-ATTTCAGAGCTTCACCGCCCGTAAAATTGCCACGTATCATTGAATCCACG
-TCAGCAGAGTCGGGAATTTCAAAAATTTTACTATCATCCATTTGTTTGCT
-GGAAGCGTTAATTATCGATTTTTATTTTTTTATTCGTTATATTAATTTTA
-TTCATATTTTTTGAAAAATAAAATCAATTTCACTCTCGGATTTCTGGCTT
-CCCTCATAAAATGAAATGAAAGAGTTTGCCGAACTAGGCCATTTTGGCTC
-GGACATATCTGGGGCAGATTTACGGCGCGTTGCGTCGCGGCTCGTTAAAA
-ATAGATTTATTTGTCCGTGTGGAGTACACGACCTTCTCACGCGTTGTCCG
-GCAGGCAATTGTCAATGGAGCGCGAAAAATTCAATGAGGAAGGCCAGAAT
-CCCGTGTTCACTGATTTTTTGAATTTACAATTTTTAAAGTATCGAATAAA
-AATTTTAATTGAAAAAATCGATTTTCAAAAAGTTTTAAAATTTTTTTAAA
-ATTTGAATTTAAAAATCGATTTTAAAAATTATTGATTTTCGAGCAAACCT
-TTTCAATTTGTACGGATGTTCCACGGGCTCATTGAGCCAAACACTATCGA
-TTAAAGATGGGCGTGTCACCACTTTTGCCACGCCCCTTTCATTCCGATAT
-TCCAATAACCCGACGAATATCTCTGATTCGTAATAGTTGGCGAACTCGGA
-AAAATAGGAATCGAACGATTTCGGCACGAGAAGATCAGACCACTCGAGAA
-ATGTGATGAAGCTCCCCGAGCTCTGAAAGTTTGGATAAATAGAGTTGTGA
-GCCTAGTGCAAGTTGAAAAAATCGATAAATTATCGATTTTCTGATTGTAC
-GAATTTAGGCGGGAATTCAAATTTTCTGAGAAAAATTTAGGCGAGAATTC
-AAATTTTCTGAGAAAAATTTAGGCGAGAATTCAAATTTTCAGAGAAAAAA
-TTTTGGCGGGAATTCAAATATTCTGAAAAAAAATTTGCCGGGAATTCAAA
-ATTTCTGAAAATAAATTTAGGCGAGAATTCAAATTTTCAGAGAAAAATTT
-TGGCGGGAATTCAAATTTTCTGAAAAAAATTTAGGCGAGAATTCAAATTT
-TCTGAGAAAAATTTAGGCGAGAATTCAAATTTTCAGAGAAAAAATTTTGG
-CGGGAATTCAAATTTTCTAAGAAAAATTTTGGCGGGAATTCACATTTTCT
-GAGTAAAACTTTGGCGGGAATTCAAATTTTCTGAGAAAAATTTAGGCGAG
-AATTCAAATTTTCAGAGAAAAAATTTTGGCGGGAATTCAAATATTCTGAA
-AAAAAATTTGCCGGGAATTCAAAATTTCTGAAAATAAATTTAGGCGAGAA
-TTCAAATTTTCAGAGAAAAATTTTGGCGGGAATTCAAATTTTCTAAGAAA
-AATTTTGGCGGGAATTCAAATTTTCTGAGTAAAACTCTCTGGCGGGAATT
-CAAATTTTCTGAGAAAAATTTAGGCGAGAATTCAAATTTTCAGAGAAAAA
-TTTTGGCGGGAATTCAAATTTTCAGAGAAAAAATTTTGGCGGGAATTCAA
-ATTTTCTGAAAAAAAATTTCGGCGGGAATTCAAATTTTCAGAAAAAAAAT
-TTTGGCGGGAATCCAAATTTTCTGAAAAAAAATTGGCCGGGAATTCAAAA
-TTTTTGAAAAACATTTTCGGCGAGACTTCAGGGGTTCTCATAAGAATTCA
-AATTTTCTGCAAAAAATTTTGGCGGGAATTCAAAATTTCTGAAAAAAAAT
-TTGCCGGGAATTCAAAATTTCTGAAAATAAATTTTGGCGGGAATTCAAAT
-TTTCTGCAAAAAATTTTGGCGGGAATTCAAATTTTCTGCAAAAAATTTTG
-GCGGGAATTCAAATTTTCTGAGAAAAATTTTGGCGGGAATTCAAATTTTC
-TGAGAAAAATTTTGGCGGGAATTCAAATTTTCTGAGAAAAATTTAGGCGA
-GAATTCAAATTTTCAGAGAAAAAATTTTGGCGGGAATTCAAATATTCTGA
-AAAAAAATTTAGGCGAGAATTCAAATTTTCTGAGAAAAATTTAGGCGAGA
-ATTCAAATTTTCAGAGAAAAATTTTTGGCGGGAATTCAAATATTCTGAAA
-AAAAATTTTGGCGAGAATTCAAATTTTCAGAGAAAAATTCTGGCGGGAAT
-TCAAATTTTCTAAGAAAAATTTTGGCGGGAATTCAAATTTTCTGAGTAAA
-ACTTTGGCGGGAATTCAAATTTTCTGAGAAAAATTTAGGCGAGAATTCAA
-ATTTTCAGAGAAAAAATTTTGGCGGGAATTCAAATATTCTGAAAAAAAAT
-TTGCCGGGAATTCAAAATTTCTGAAAATAAATTTAGGCGAGAATTCAAAT
-TTTCAGAGAAAAATTTTGGCGGGAATTCAAATTTTCTAAGAAAAATTTTG
-GCGGGAATTCACATTTTCTGAGAAAAATTTTGGCGGGAATTCAAATTTTC
-TGAGAAAAATTTAGGCGAGAATTCAAATTTTCTGAGAAAAATTTTGGCGG
-GAATTCAAAATTTCTGAAAATAAATTTTGGCGGGAATTCAAATTTTCTGC
-AAAAAATTTTGGCGGGAATTCAAAATTTCTGAAAAAAAATTTGCCGGGAA
-TTCAAAATTTCTGAAAATAAATTTTGGCGGGAATTCAAATTTTCTGCAAA
-AAATTTTGGCGGGAATTCAAATTTTCTGCAAAAAATTTTGGCGGGAATTC
-AAATTTTCTGAGAAAAATTTTGGCGGGAATTCAAATTTTCTGAGAAAAAT
-TTTGGCGGGAATTCTAATTTTCTGAGAACATTTTTGGCGGAAATTCAAAT
-TTTCTGAGAACATTTTTGGCGGGAATTCAAATTTTCTGAGAAAAATTGTG
-GCGGGAATTCAAATTTTCTGAGAAAAATTTAGGCGAGAATTCAAATTTTC
-AGAGAAAAAATTTTGGCGGGAATTCAAATTTTCTAGAAATCAATTTTTTC
-AGAATTTCAGAAAACACCACCCCGGCTATCAATGGAGCGCATTTTCAAAG
-TCTCACTTTATATTTATTCAGGCAATCCGAATTTGCAACAGTGACACCTC
-CGAATTCAATTCCATCCAATTTTGATTTCCCATAAAAATCTGGAAACGAG
-TCAACTGATATTCCTTTGAGACGCTTCAACTCTTCTAGAAATTCGAAAAA
-CGGGCGACTTGTAGTTGCCACGTATGTTTGGAGATGGCCGCCGAAACTGG
-AAAAAAAATTTAAAATAAACTGACAAGTCTATATATTTTTTCTTTAAATT
-TTTTTAATCGAAAAGCACCCCTATTATATAAATTCTTTTTTAACCTACCA
-TTTTTAATAATTGATGGCCGAGTTTTCTTTTTTAGGCCATGTTCAAAAAG
-CCGGTCGGTACCGGTTTTTGGTGACCGAATTTTCAAATTTTCTAGGCCAC
-GTAGAAAAACCAGGTCTTCTTTTCACACATTGATTGTTTAATTTTCTCAA
-AGAACCCCCTCTCCTATAAAATCACGGTTAATAATGGGCGATAAGTCGAT
-GGCCGAGTTTTTTTTATATATTTCTAGGCCATGTAGCAAAAACTGACCCT
-TTTTAACCCCAGAATGTTCTCAAAAATCGTATTTTTTAATTGTGGAAAAG
-CCCAGAAAATTATGTATGCTGCAAAATCACAAGTCGGCGGCCGAGTTTTC
-TCTCTTCCTAGGCCACGCTGCAAAAACTAACCTTCCGTTTACATATTGAC
-TTTTTCAAATAATTTCAAATAAAAATTATTCACTTATAAAATCATTTACT
-TCATGATTGAAAGCTTTTGCAATTGGTTAAAACCGGAAATAAGTCGATGG
-CCGAGTTTTCTCTTTTCTAGGCCACGTACCAAAAGTGTCCCTTTTTTACC
-CCAGAATGTTGTCAAAAATCGTACTTTTTATTTGTGGAAAAGCTCGGAAA
-ATTATGTTGTAAAAAATGAGTCAAGTCGGTGGCCGAGTTTTCTCGTTTTC
-TAGGCCACGCTGCTTAAACTGACCTTCCATTTACATTTTGGCTTTTAAAT
-TCAAATAAAAATTATTCCCTCATAAAATCGTTTACTGTCATTGTGAGAGC
-GGTTAAAAACAGGAAAAAAAATGGTGGCCGAGTTTTTTTTTCTAGGCCAC
-ATAGCAAAAAACTCACCTAGTATACACATGAGCAGCTAACAACACATTCT
-GCCATCTAACATTATTATAAATAGGCGGAGTACATACAACCAAATCCTTC
-GGCTTATTATCCGCCGGCAAATATCGAATTTTCGCGGTATGCCCATTCAC
-AAGAAGCTCCAGCTCCGTGAGCTCTTCCTCAAGCACTATAGTACCCACAA
-GTGTCACGTATTTGCATAAATTATGCGGAGTTGCTCTGTGAATTTGAAGT
-GGTTCGAGTACGGTTTTTGTGTCGTCACTTCGGATTGCGATAATCTTACG
-ACGTTCCCAATGTGCATCCCGAGGCGCGATAAAGGTTAGTGTTACTTGGT
-TTTTGTAGAGACTGAAAAATTTCAAAAAACTTAAAAACTAACGTAGTTTA
-AAACATTATTCTTCTTTTTTTATTCTGAGATATTTTGATTTTGAAAAAAA
-AAAATTTTTTTTACGAAAAAAAAATTGGCAAAATACCTCAAAAACTGTGA
-GTTTGTTGAAATTTAGTTTTTACAACCACGGGAATTAATTTTTTAAATTA
-AAAATATTTTACGTGTAGTCCTCTCGAATAATTTTGAAAAATATATGAAG
-TGTTGAATTCTGCCGAGTTTTTTTGTCCGAGTGGACTACAAAAGTGCAAA
-GAATTTGGAATTTTTCAAACTTTATATTTAACAGCAATCATCAACAACTT
-AAAAAAATTTAGATTAAAAAATTTTTTTTGGAAGTTTTCGAAAAAAATTT
-TGGAAAAATTTTTAATTTTCAGAAAAAAAAACCAGTTTGATTTTTTTCTT
-AAATTCTTTTTTGAAAATTTGTTGAAACTTTTTTTTAAATGCTAGACTTT
-TTTTTTGAATTTTCACGCGGTTCTGGTTTCCCTCATATTTTGAGATAGAA
-GAGTTTGCCGAACTAGGCCATTTTGGCTCGGCCATATCTGGGGTAGATTT
-ACGGCGCGTTGCTTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAA
-TGTATTTGTCCGTGTGGAGTACACGACTTTCCCACGCGTTAGGCGATTAT
-CAATGGAGCGCGAAAAATGCAATGAGGAAGGCCAGAACCCCGTGAAAAAT
-ACATTTTAAAAAATACTTGAAAAATGTTTAAATTTTCTTTTTAATTTTAA
-ATTTGAAATTTTGTAACTTTACAAAAAAATAATTTTTCGAAATTTTTTTC
-AAATATTTTTTTTCGAATTCTTTTTGTTGAAATTTCAATTCTCTGTTCTA
-AAAATCAATATTCCTTACCTGTATCCCACTCCATAATAGTACGCAGAAAC
-AAAAAATAGGTCTTTCTCGTCGTTATCCAATTCTTTAATCTTATTAGTGT
-ATGAATTTCGAACACGTCTTAATGCAGGCAAGGGATGTATTGAAATATGT
-ACAAATGCTAATAATATTACAAATAGATATAGGGTCCTGCAACGAATTAT
-CAACTGCTCGTAGAGTACGGAATAGGGTTTGAATTGAAAATTGTTCAGTT
-TCGTGTCGGAATTCATTTTTATTATGGGGAGGAAAACAATCTAGTGTGGT
-GGTAGTGGTAATGACAATCGCTATTTGAAATCATGTTGAATAGCTGCGAT
-AAGTATCGGGCGCCAGCGTGGCCTAGGATTTGGGAAAACTCTTCCACCAG
-AAGCTAGTCGTGGCCCAGGCTTTGAAATTTGATTATTTGATCAAGAAATT
-TACAACTAAATTTAAAATCAACAGTTAAGACATTTTTCATAGACTTTTCG
-AAAAATTTCTGATTTTTCCATATCAAATAACCTCGGTACGCATCTAACCG
-TCAGTTGCCTCGTGGCCTAGAACTTTTGAAAACTCTTCCACGAGAAGATC
-ACCGTAGCCTAGAAAGTTTTGAAACTTGTGTAGTTCGCTTGGAATTTTTT
-TTTGGTTTTTTTGTCAACTAACTAGGTTCAATAGCTATTAAAAAGTTGCA
-AAATTGGGCAATTTTTGTAAAAATTCACAATTTTGAAACTTCTCTAAAAT
-TATTAATTTTGTAGTAAGAGGACTCAAAATTGATCTTCAAACACTAAAAA
-ATAGCCCCTTTTTAGAATATAGTGGTTTCGAATATTTTTTGAAAAATTAT
-TTTTTTTTACCCAAAAAAAAGGACAGTCATGGCTGAAAAAAAATTTGGAA
-AAAATAAAAAAATTGTCTAAATTTGTTGAAAACGGGTAATTCATGCATTC
-TGAATTCAGAAAATCTAGGTTTAACCCATCAAAAACCATTAAAAGCGGCA
-AAAATGGGTATTTCATTGTAAAAATAATGCATATACAATAAACAATGTAG
-AGGAATGTTCAAAATCTGTAGTTTTTTTGAAATTTTTTTTTTATTTTTTG
-GTTATTTTTTTTGCAAATTTTCTCGTATATTTAATTAGTTAGTTTGCATG
-TTACATGCTAATGAAAAGGTTTTTTTTGCATCCTGATACATATAAAAACC
-GAGAAATTCACAATTTCACAATCAGTAAGGTATTTAATTTTTGTTAACTT
-TAGTCTTCTGCTCCTCTAAAGCTTCTGGAAGAGGACACTTTCTAAATTTT
-CAAAATATTTTTTGCGCCACTTTCCTGTCAAATTTCTGGCATTATTACAT
-CCAAAACCCAATAAAAATCGGAATTCCATAGCTACGACAACGTCAGCAAA
-AGCGGAAAGAAATTTTGTTTGCCTGTCTAACGAGTCACAAAGCATACACT
-GACGTTTCTATCAGAAAAGACAGGATTTCGTATCAAAACAAAAATTGGGT
-GCGATTGCTCGATGCACCATGTGATATTTTGCTTTTTTTAAAAATTATTT
-TGCTCGTAATGTATGGTGCACTTATTCCGTGGCTGCAGAATTTGCACGCG
-GTGTCATAATGCCCATTTCGACTTGATCTACGTAGATCTACAAAAAAATG
-CGGGAGTTGAGACGCAGAGGTAGGGCTCAACTGATTTCGTTTGGTTAAGA
-GCGTGCTGACGTCACATTTTTATGGGCAAAAAATTCCCGCATTTTTTATA
-GATCAAACCGTAATGGGACAGCCTGACACCATGTGAATGCAAACTTTACG
-CGAAAATTTTTAGATTTTTAATAATCTTAGAATTAGCTATGGTTTTATAG
-AATAATATCAAAATTATCCAAAAAAAAAAACACATTTTTTCAAAATTTTA
-GATTTCCAGTTTCTATTTGAACTTTAAAAGACTAATCCAAATTTTGTTTT
-GTTTCAACGATTTTTCATTGATCTCTCCAAAGAATTCATTGAAACACATC
-ATTCACAAAACTAAAAACTCCCCGACTTGGCTTTCATTCCGAGATGACAA
-ACTTTTTGGTGGCAAAGGTTCTTTGGGGGCATAGTATCCAAGGAGACAAA
-GTATCCAGTAGACAAACTGGGGTGTATCTTGGGGGGCATATCTTTGGTGA
-CAACCTTTTTTTCGACTAGATTTTTATATGTATTTTTCAACTAATTTTTG
-TTCACATTTTTCTGGAATAAGTTTTTTAATGCAATTTTCAATCGATTATC
-GGTTATAATTCCCTCACAATTGAATGTATGAACGATGGTCTTTTGGGAAA
-AGCTGTAAAACGTCCAACTAACTTGGAATATCGTGAGGCTCTTCCTGATG
-GTCTGATCCTTCAGCTCCGAAGGATCACATGGGTACCTTCTGATGTTCTG
-ATCCTTCAGATAAGAAGGATCGTAAGGGTACCTCCTGATGGTCTGATCCT
-TCAGATCCAAAGGATCACGAGGCTCTTCCTGATGTTCTGATCCTTCAGCT
-CCGAAGGATCACATGGGCACCTTCTGATGATCTGATCCTTCAGATAAGAA
-GGATCGTAAGGGTACCACTTGATGGTCTGATCCTTCAGCTCCAAAGGATC
-ACGAGGCTCTTCCTGATGTTCTGATCCTTCAGCTTCGACAGATCATATGG
-ATTTTTGACAAAATTTGAAAAAAAAAATTTTGAAAAAAAACTCGAAATTT
-TTTTTTGTTATTCTTCATTCTTTAAAGAATAGTTCAAATTTATCATGATA
-GGACCGAAAACTTTCAAGAAACAGTATAACTATACATGATAATCAGCTTC
-TACCAAATAATGATAAATTCTCCGCGATGACAAACTTTTCGGTGACAAAG
-TATCTTGGTGGACAAACAAAAATTACCGAAAACTGATGTAAGGAATAGTG
-AAATAGAGTCCTATGGACTATTAAACATGTTCAGTAGGTGTATTCAGGAC
-TGTCCGTCAAAATAAAAAAAAGTTTGTCAGACGAAGTTCGAACCTGGGAC
-CTGTAGGATGCAAAGTGCGCTCACTACCACTACACCAGCTATGCGAAAGT
-CGGCGAGCCTCATCGAAGGCTATTATAAAACTTAGTTCGCACGAGTATGA
-TCGACATTCAACAAACAGTAATATCTCTCAACAAGAATTTCTTCATGGAA
-TTGAGGTCATTTGACTATTTTTATCGGTTTTTCAAGTTGAGCATAGGGTC
-TTTTAATTTTTTGAGCATAGAAAATCATGAAAGCTGCCTGTTCCTTGTAT
-CCTGGATCGAAATAGACGTATCTGGCCTAAAATATTTCCTGAACAGTGAT
-CATTTCATGTCCATTGTGTGTTTCTCTGTATTTTGAACCAGAAAGTTGAA
-CAAAAATGATAATATTATATCGAAAAATGGAACAAATACAAATAATTTTT
-AGGCCTAATCAAATTTCCTCCGGATATTGTTTTTTTTGTCATGATTATAT
-GTGTCTAAATTTTTTATAATGTGTTTTATAACAAAATTCGTCATTATTTC
-CTTCATTTCAAGCAAAATTTAACAGTTCGAGCTTAAAAATAGATGTTGCA
-AAAAATTTAATTCGTTTCGATGAATACGGTATACGGTCGGTGTTTGCGTA
-CTTTGGCGTTTGCGTATGAAGCATCCTATTTGACGCACGAAACTTTCAAT
-GAAATTTAATGCAAATTCTGCATCGAAAAGGACATTACGATGGAAATAAT
-GACGAATTTAATTATAAAACACATTATAAAAAATTTAAAAACATATAATC
-ATGACAAAAAAAACAATGTCCGGAAAAAATTTGATTAGGCCTAAAATTTA
-TTTTTTATTTTTTTCCATTTATCGATTCAATATCAACATTTTTGTTCGAC
-TTTCTAGCTCAAAATTCATAGAAACTCACGATGGACATGAAATGATCACT
-TTTCAGGAAATATTTTAGGCCAGATACGTCTATTTCGATCCAGGATACAA
-GGAACAGGCAGCTTTCATGATTTTCTATGATCAAAAAATTAAAAGACCCT
-ATGCTCAACTTGAAAAACCGATAAAAATAGTCAAATGACCTCAATTCCAT
-GAAGAAATTCTTGTTGAGAGATATTACTGTTTGTTGAATGTCGATCATAC
-TCGTGCGAACTAAGTTTTATAATAGCCTTCGATGAGGCTCGCCGACTTTC
-GCATAGCTGGTGTAGTGGTAGTGAGCACACTTTGCATCCTACAGGTCCCA
-GGTTCGAACTTCGTCTGACAAACTTTTTTTTATTTTGACGGACAGTCCTG
-AATACACCTACTGAACATGTTTAATAGTCCATAGGACTCTATTTCACTAT
-TCCTTACATCAGTTTTCGGTAATTTTTGTTTGTCCACCAAGATACTTTGT
-CACCGAAAAGTTTGTCATCGCGGAGAATTTATCATTATTTGGTAGAAGCT
-GATTATCATGTATAGTTATACTGTTTCTTGAAAGTTTTCGGTCCTATCAT
-GATAAATTTGAACTATTCTTTAAAGAATGAAGAATAACAAAAAAAAATTT
-CGAGTTTTTTTTCAAAATTTTTTTTTTCAAATTTTGTCAAAAATCCATAT
-GATCCGTCGAAGCTGAAGGATCAGAACATCAGGAGGTACCCATGTGATCA
-TTCGGCTCTGAAAGATCAGATCATCAGGCAGAGCCTCATGTTCTTTTGGA
-GCTGAAGGATCAGAACATCAGGAAGAGCCTCATGATCCTTTGGATCTGAA
-GGATCAGACCATCAGGAGGTACCCTTACGATCCTTCTTATCTGAAAGATC
-AGATCATCAGAAGGTACCATGTGATCCTTCGGATCGGAAGGATCAGATCA
-TCAGGCAGAGCCTCATGTTCTTTTGGAGCTGAAGGATCAGAACATCAGGA
-AGAGCCTCGTGATCCTTTGGAGCTAAAGGATCAGACCATCAGGAGGTACC
-CTTACGATCCTTCTTATCTGAAGGATCAGAACATCAGAAGGTACCCATGT
-GATCCTTCGGAGCTGAAGGATCAGACCATCAGGAAGAGCCTCACGATATT
-CCAAGTTAGTTGGACGTTTTACAGCTTTTCCCAAAAGACCATCGTTCATA
-CATTCAATTGTGAGGGAATTATAACCGAAAATCGATTGAAAATTGCATTA
-AAAAACTTATTCCAGAAAAATGTGAACAAAAATTAGTTGAAAAATACATA
-TAAAAATCTAGTTGAAAAAAAGGTTGTCACCAAAGATATGCCCCCCAAGA
-TACACCCCAGTTTGTCTACTGGATACTTTGTCTCCTTGGATACTATGCCC
-CCAAAGAACCTTTGCCACCAAAAAGTTTGTCATCTCGGAAAGAAGGCCCC
-CCGACTTTGCGCGTAAGATATGGTGAGACCCTAATACATCATATTTGACG
-CGCAAAATATCTCGTAGCGAAAACTACAGTAATTTTTTAACCGTCTACTG
-TAGCGCTTTTGTAGATTTACGGGATCTCGATTTTTTTAATGATTAAAATT
-AAACAAAAAATGAGAAAAGAACACGAAGAAACGAAGAAAAATGAAATATC
-GATGTCACTTTTCGGAAAAAAAATTAATTTCAAAAATTGAGCCCGTAAAT
-TTACACATGCGCTACGGTAGGCATTTAAAGAATTACTGTAGTTTTCGCTA
-CGAGAAATTTTGCGCGTCAAATATATCGCACAATACGCATTCTCAGAATT
-TTGTGTTCCCGGAATAATTTATTTATTGGTTTTTTTGGTTGTATTGGTCC
-CAAAAATCAACAAAAAAAAATTTTTATGAAAAATTTCTGTTTTCTTCCGT
-TTAAAATCAAAAGTTGGTTTTTTTTGTTGCTTTTTTTGATAAATTTTTGC
-AACCACCCTGATTTATATTCCCATAAATATTTAATGTCCCGCTTATGATA
-TCTACTGCTTCTTTGCAAAATTCCTACCTGCGGACCAAATACACCATACT
-TGACGCGCACTTTTTTTTTGATTTTCAGCTGGACAAACACATTTTCAGCA
-TGATTCTGACTTATTTATTTAACTCTTATCACTCTTATCGTTAAAAAACG
-CCCTTATAATCATCAACCTATTTTCATTGTCATTCAAAAAAAAAAACTAT
-TTCGTACTCGTCGATCGTACTAATTTGTCATCGTTCCGTTCCGTCGAGCA
-AAAATCAATGTAGTTTTACGTTTTCCGTTGAAAAAAAATCCAAAAAAAAA
-TCCAAAAAAAATCCAAAAAAAAATTCCTTGTTAATTAAAACCGTGAATAA
-AAAATTCAAATAAAAAGTTCAAACGTTTCGTTATAAAAATGTACACCGGT
-AAGCTCAAAAATATACATTTCAGATTCTAACAATGTGCGACGATACGCTC
-GCATTTTGTAGTCCAGCTCCATTCAGTGATGATGTAGAGGTTATTAAACA
-ACGTGAGGCGATCGATTATTCCACACAAATCACTCTGGAAGATGCGATTT
-CTGGGAACGGTAAGTGCGCTCCGTTGTACTCATAGTTCGCTGAATGAAGG
-CATGTATAAGTTCTCAAATTTTCAAATGAAAATTGCCAAAAAAGGTTTTT
-AGTTAAAATTTAAAAAATTATCGATTTTTAAATTTATGAAAATTTTTTCG
-AAAAATTTGTGTTTTTTGTTTTTGTTTTATTGATTTATTGATTTTTTGGC
-GAAAATGTGAAAAATCGAAAAATTATGGATTTTTTCTTGGAATTAAAAAA
-AAAAAACTTTATCGGCTAAGCGAAACTTGCTTTTTCGGTTTATTGATTTA
-TTGATTTACTTGAAAAAGTACTTGAAAAAATCAATACTTTTATCACGGGG
-ATCTGGTCTTCCACATTAAACTTTTCGCGCTCCATTGAGAATCGCCCGCC
-GGACAACGCATGGGAAAGCCGTGTACTCCACACGGACAAATACAATTAGT
-TTTACAACTAAAATCGAGCCGCGACGCGACACGCAACGCGCCGTAAATCT
-ACCCCAGATATGGTCTGGTCTAGTTCGGCAAAAACTCTTCCATTTCAATT
-TATGAGGGAAGCCAGAAATCTTTGTTTTTATTTTATTTTGAAATCTCTAA
-ATTATCGATTTTTTGGAAAAAAAGTTGTTTGAAAATTCGATAATTTTTTA
-ATGATTTTTTGGAAAAATTAAAATTTTCGCTTTTCAAAAAAATCAAAAAT
-TATTGATTTTTGAAAAAAAAAACACGGCATGCAATTCCTAGACCACCAAT
-CAAAAACCTCTTCCAGTGACTCGTCCGGTCCGTGTCTACGCTGACGGTGT
-CTACGATATGTTCCACTACGGCCACGCGAATCAATTCCTGCAGATCAAAC
-AAACTCTTCCGAATGTCTACCTTATTGTTGGCGGTGAGTTCGGCCCGCGA
-AATTCAAAATTTTTAATTTAAAAAAAAAACGATTTTTTCCAGTATGTTCC
-GACGAAGAGACTATGAAGAATAAGGGGAGAACTGTGCAGGGCGAAGAAGA
-GCGGTACGAGGCGATTCGGCATTGCCGGTACGTCGACGAGGTGTATAAGG
-CGTCGCCGTGGACATGTCCGATACCGTTTTTGAAGGAGTTGAAGGTAAAT
-TGCGCGTGAGATTCGGTGTTTGCACAGTTTTATCTCCAAAAACGAAGGAA
-ATTTTATACCTAAATTTCGGAAAAAAATCAATAAATTATTGCCTTTTTTA
-AACGTCACAAAATCGATAATAATTTGAAAATCACAATTTTTTTTTTATTT
-TCAAAATTTCGTTGTTCTATCACGGGAACGCAAATTTCTGAGAATGCGTA
-CTACACAACACATTTGACGCGCAAAATATCTCGTAGCGAAAACTACAGTA
-ATTTGTTAAATGACTACTGTAGCGCGCTAGTGTCGATTTACGGGCTCTAT
-TTTAAGCTCAATTTTAATTTCTATCGATAAATATATGATACAAAATATTG
-ATCCCGTAAACCGACACTAGCGCGCTACAGTAGTCATTTAATGAGTCACT
-GTAGTTTTCGCTACAAGATATTTTGCGCGTCAGATATGTTGCGCAATACG
-CATTCTCAGAATTTTGTGTACCCCGTAATAAAAATTCGAGTTTTTCTAAA
-CAAAAAGTTTAATTTAAAAAACCTCTAATATTCGAGATATTCGATTGGCG
-ATTTATTGATCTATTGATTTTTCGATAAATATTGATTTTTCAATTTTTAC
-AATATTCGAAACAATTATCGAAATTTCAAAAAACTAACAAAAAATATTTG
-CGGAGGAAAATCGATAACTTTTCAATGTATATTTTCTGAAATTCCATAAA
-ATTGATTTTTCTAAATTTAATTTGTTCGATTTTCGGGTTCTCGGTTTTCC
-TAATTTCTGTAATTTTGAGTCGATAATTTTTTGTTTTTTTTTTTCAATTG
-AAACTTTTATTGATCAAGGATTTCTGGCTTCCCTCATAAATTGAAATAAG
-AAGAGTTTGCCGAACTAGGCCATTCTGGCTCGGCCATATCTGGGGTAGAA
-TTACGGCGCGTTTCGTGTCGCGTCGCGCCTCGATTTTAGTTGTAAAACTA
-AATGTATTTGTCCGTGTGGAGTACACGACTTTCCCACGCGTTGTCCGGCA
-GGTGATTGTCAATGGAGCGCGAAAAATGCAATGAGGAAAGCCAGAACCCC
-GTGATTGATTATTGAGTTTTGGAAAACTATTTTAAAAAACCTGATTTGAA
-AGAAAATATCGGTAATTTTTCGGATTTTTAACAAGAAAAAGGTTTTTATT
-TCCGGAAACTTTCATTTAATAATTATTTATTTATTGATTTCTCGGAAAAA
-TTTGCCGAAATCTATCGAACTATAGTCGAACAATTGGACGAAAAGTCGAA
-AAAAAAATTCTAGGCCACGAATTTCCTCTTCCAGGTTGACTTTATGTCAC
-ACGACGCTCTGCCATACCAAGGTCCCGCCGGAGAAGACATCTACGAGAAG
-CACCGCACTGCTGGCATGTTCCTGGAGACGCAGAGAACCGAAGGAATATC
-GACGAGCGATTCGATTTGTCGAATTATCCGCGACTACGACACGTATGTCA
-GAAGAAATTTGCAGAGAGGATATTCGGCCACCGATTTGAACGTTGGCTTT
-TTTACAGTGAGCCTGGCCTAGAAAGGGGTGGCCTAGAAAGAGGTGGCCTA
-GAAAAACAAAACTCTTCCATTTTTTTCAGACCAGCAAATATCGTCTGCAA
-GACACCGTAGTGGGAATAAAAGAAATGGGCCGTGGCCTGCTGCAAACGTG
-GAAAACGAATGCGGATTACTTGATTGAAGGATTCTTGACGACATTTGCCA
-TCAGTGATCCGAAACCGTTGCCGAACAACAAAAGTGCCGATGAAAATGTG
-GAAAATAGGGAGAATATTGAGAATTTTTAGAAAAAATTCGTGTAAATTAT
-GGGAATAAAAATTTGAATACTCGTGAATGTTTACTGAATTTATGCAATTT
-ATTTTTTGAAATTTTCAATTTTTTTGGAAAATTTTTTTTTCTTAGGCTTA
-GGCTTAGTCTTTGGCTTTGTTTTAGGATTAGGCTCAGGCTTAGGCTTAGG
-CTTAGACAAAAACTTAAGCTTAGGCTTAGGCTTTTGATTAGGCTTAGGAT
-TAGTCTGTCTTTCACTTAGGTTTGGCGTCATTGGCGAGCGTTAGCTCGCT
-ATTTAGGCTTGGGTTAATTAGGCTTAGGCTTAGGCCTAGCTTTAAACTTA
-GGCTTAGGCTTAGGCTTAGAATCAGGCGGGCTAGGGAAAAAAAGAGAAAT
-TCCAAAAATTCCAGAAAAAAGGAAAAAAGGTACATCCCGAAGTCGGGTCA
-AAAAATAAAGTGAAGAAATGAAATTTTCACGAAAATGAATGAATATTTTT
-GAGTCTCGCGGATTTATTTTCATAATCATATTCTGAACGTATTATTGACT
-CGTCGTGTGGGACATTTCAATGGATTTTCCGTAAAAATCTCTGTAGAATT
-CCGCATCGGTCAACGATTCTTCACAAGAGCCAAACTCGGCGAGTCGGTCA
-AACAAATGTTTGAGCTCCTGAAGAGTAGTTCAAAATTATATATGAATTGA
-TTTATCTTGCAAACCTTTCTCCGTTTGTCGGTAAAAAGTCCTTCGGGGCA
-GATTTCCGTATCAATCAGACGATTTGCAATGTATACAATCCACATGAGAT
-TTGTTCGCCTTGAGAATTTCTCCCAGTTGCCCCTGGAACGTTAATTTTTC
-TGAATTTCTAGAAAGGATATAGAAATAGCAACAAAAAAAAAAATTTATCC
-AAATAATGAGCTATTTAATGTAGTTTATATTACTACAAATACTTTTCTCA
-TAAGAACGTCTTGTTCTTGATAAATGTGTGCTTTAAGAAAAAAAAAAGTC
-AAAAATAGAGTCCTGAGATGTCGGGCGTTGTACCTATTAGGGGTGTCAAT
-AAGTTCCGGGTCAAAATTCATAACTTTTTTCGTAGCAAATCGATTTTCTT
-GAAAATGTGGGAATTTATGTTATCAAACATGGTCTTTCATTTGACGGCAC
-TTTCAAAAAGTTTTGACCACTCCATGTACCCTAGCTCGGATCCACTTTTT
-TCAGGCGTATGCCCGATCTCGCTTCTTTGTAACTTTCAATTGAGACTTAT
-GTGCGGATTTTGATTTATTAAGTATACAATGTAAGAATACAATAAAAATT
-TGAGAAAAAATTCGTTCAAAAAAACAATTTTTTTGATCGGCAAAAAACCC
-TCGAAAAAAATTTTGTCGAAAACTCTTGATTTTTTGTACAGGAATGATGC
-AACCAATTCTGAACAATTTTTTAACACATAAAAGTTTTGAATTTAAGGCG
-TCACACACAAGCGGCAATGGAAAAAATGATTTTTTAGTGAATTTTTTGAA
-ATTTTTGAGAAATTCTCGAAATCTAAATATTAAATTCAAATGTTTTGTGT
-GTTGAAAAATTGTTCAGAATTGGTTGCATCACTCCTGTACAAAAAATCCA
-GAATTTCCGACAAAAATTTTTCCGAGGATTTTTTTGACGAACCAAAAAAA
-TTTGTTTTTTTGAAGGAATTTTTTCTCAAATTTTTATTGTATTCTTACAT
-TGTATACTTAATAATTCAAAATCCGCACATAAGTATCAATTTAAAGTTTC
-AAAGAAGCAAGATCGGGCATACGCCTGAAAAAAGTAGATCCGAGCTAGGG
-TACATGGAGTGGTCAAAACTTTTTGAAAGTGCCGTCAAATGAAAGACCAT
-GTTTGATAACATAAATTCCCACACTTTTAGAAAAATCGATCAGCCACGAA
-AAAAGTTATGAATTTTGACCGGTAACTTATTGTGCTACATGCTTGTTGCG
-AAATATACCTATTTACCTATACCTATACCTATACCTGCAATTTTCTCTCA
-TCTCTCGATATACTTCAAATTGTGGAGCATCTGGTCCTTCAAAAATCGTC
-GTATCCTCTTCCAAATCCCAGTAGATAGTTGTCGAATCTAAAATTATATA
-TTTTTAATTATAAATTGTATATTTTTTTAATTTAAAAAATAACAAACCTT
-TCGAAATGCGGCTAAGTGTGAAATCAATAATATTGACCTTAATTCCATGG
-GTCCTCAGTGGAATTTTCTGCCCATGCACAGTGTAGGAGAGCTCTTCCAC
-TCCGTTCCGATCGATCAGCACATTACTAAGATTTAAGTCCCTGTGCTCGA
-ATTCAAGAGCTGCTTCAGCTGCAACCATTGAGAGAACGAGCTGGTGAATG
-ATGGAAAATAGTTCATCTTCACTTTCAAGGACAAAATCTGCCAGCGAGAT
-TCCACCATTTGCCGAGACGAAAAGGATAAAGTTTTGATGTTCTGAAGAAT
-AAACATCTGGCCTCAAATGTTCGGATTCATTGAGCTTATCGTAGGCATCC
-CAAGCTCTCAGTAATCCCTTAGGATATTCCCCCATGACTATTTGGGCTGA
-AATCATTTCGATAAAATTCGGCGTAGAATTCCAAGAATTTGGGTCTCTCA
-ACGCCGACAGTTCCTTCATCACAATCACCTCTGACAAAACGGCGTGGGTT
-GTTGGAATTTCCACGGATTGATTTCCATAGAAACATCCGTTGTTTTCGAA
-TGGCAAAACTTTGATAGCAACCGGTCTACCATTCCAGACAGTTGAGAAGA
-CTTCACCGTACGCTCCTTCGCCGAGCTTCTTCACTTTTCGAGCATCTAGC
-GCCGACGTTGGTAGGCTACCCCATGGTTTTGCTTCTTTTTGGCCAACAAC
-ACGGAGAAGTTGTGCCATGGACGGATCTTTATTGTGAAATGTGATACTGC
-CAATGGGGATATTTCTAGAATCAGGATGAGCTGACCGAGCACTTGGAGCT
-CTTTTGTTCAGTTCAGCAAGCATGCACAGTTCGAAAGCATGCACAGTGCG
-AAAATGACTTTTCTGAAATTGTCATCAAAAGTTCATTTTGAAAATTCGTT
-TCGGCAAAAAATGCAAATGCATTTCTGAAACTCACCAGTTGTCTCTGAAA
-TCGTCGTTCGTTGGTCATGTCGAGTGCAAGAACGGTGGTGGTGACCACTG
-CCGTCTTCGTGAACCGCATCCAAGACATGTTTCGGGAGATAACTATAGAA
-ATGAAGTTTTGAAAAAAAAACTCAAGACCACAATTATTGAAACACGTTAT
-TAGGCCAATAACTTCACACGTGAATTAATACATTATTCATGTATTTTTCT
-TTGACTGTTATCACGGGTTTCTGGCTCACGGTAGTTCAGCCACGGTAGCA
-CAGAAAATAGATGACCACGTTCATGATAATCAGTCTGAAACCTATATTGG
-CTGCTATCTCGAAAACTCTCTAAAAACGCGTTTTGAGAAATTATTGATTT
-TTTGGAGAAAATCAGAAATTATTGATTTTTTGGAGAAAATGGGAAATTTT
-TCATTTTTATTGGGGAAAATCAGAAATTATTGATTTTTGGAGAAAATCAA
-AAATTATTGGTAATTTGAAGCAGGGGTGGGCAGCAATTGCCGTTCGGCAA
-ATACGCAAATTACCGGTGTGCCGATTTTCCGGGAATTTTCATTTTCGGCA
-GTTTGCCGGTTTGCCGATTTGCCCGACATTTTTCAATTTCGGCAATTTGC
-CGGTTTGGCGATTTGCCCGAAATTTTTCAATTTCGGCAATTTGCCGGTTT
-GCCGATTTGCCCGACATTTTTCATTTTCGGCAATTTGCCGGTTTGCCGAT
-TTGCCCGAAATTTTTCAATTTCGGCAATTTGCCGGTGTGCCGATTTGCCA
-AAAATTTTCATTTTCGGCAATTTGCCGGTTTGCCGATTTGCCGGAAATTT
-TCATTTTCGGCAATTCGCCGGTTTGCCGATTTGCCCGAAATTTTTCAATT
-TCGGCAATTTGCCGGTTTGCCGATTTGCCGGAATATTTCATTTTCGGCAA
-TTTGCCGGTTTGCCGATTTGCCCGAAGTTTTTCAATTTCGGCAATTTGCC
-GGTTTGCCGATTTGTCGAAATTTTTCATTTTCGGCAGTTTGCCGGTTTGC
-CGATTTGCCCGAAATTTTTCAATTTCGGCAGTTTGCCGGTTTGCCGATTA
-GCCCGAAATTTTTAAATTTCGGCAATTTGCCGGTTTGCTGATTTGCCAGA
-AATTTTTCAATTTCAGCAATTTGTCGATTTGCCATTTGCCGGAAGTGTTC
-AGAAGGATTTTTTTATAATAAGGAACCACTTAAAACTGTGCCGTTTTGAA
-ACTTTTCCCCGTTTTTTTAAGATGATTTCATAGAATTTGCTTACTTGGTT
-TGCCGAATTGCCAGAAGTTTTTCAATTCCTACAAGTTGCCAATTTGCCGG
-AAACTTTTTAATTATGGCAATTTGCCGGTTTGCCGATTTGCCAGAAATTT
-TTCAAATTCGGCAATTTGCCGGTTTTCCGATTTGCCGGAAATTTTTCAAT
-TTCGGCAATTTGTCGATTTGCCGGAAAATTTTTATTTATGGCAATTTGCC
-GATTTGCCGGAAAAAAAATCGTTTCCCGCCCACCCATCAGTTGATGAGTT
-CATCTTTTTTTTGTGTCTCTCCCATCAATCTTAAACTCGACCCGGACTGG
-CAAACGCATATCTACAGTTTTCTCTTCTTAAAATGGTGGTCTTAAGTTTC
-GAAGACTATGCGTAATTTCTAGCGAAGTGGCGAATTTATGATGATTTTGC
-AATTTATCAATGAAAAAAACAAAAAAAGCATTTCCGCGTGGCAAATTATC
-ACTGTTGTGCCGCGAATAGTACTGATATAATTTTTTTTTAAATTGAATCA
-GTTTGGAATTTCGAATTTTTGAAACAACCGCCGGCAAAATGAATAATATA
-CTGTGAGTTTTCAAAGATTGTTCCCCGGTTTTCTTGTAGATTTTTGTGCA
-ATTTCAAAATTTCGACTTTCAGCGGAAACAAAAATACAAAAAGGTCGAAG
-AAGAAGGACGGAAAGTTTACGAGCAACACTGCTACTGATCTTGTTGAGGC
-CCCAAAACCAGGTGGAGCAAAAGGATCCAAAAAACCAAAACCATCGAAAG
-GAAATGACGACAGGGGACGCGGCGAACCGGAAATGACTGCACAATCCAAA
-AAAACCAAGAAAGCAAAAAAAGTGAGACAGAAGAGAGATACAAAGGCACC
-GGTGAGTTCAATTTTATAGTTTTATAGATATAATTGTATCAGGGGTGGGC
-GGCAATTGCCGTTCGGCAAATTGATTTGCCGCCAAATTCGGCAAATCGGC
-AAATTGCCGGTTTGTCGATTTGCCGGAAATTTTCAATTCCGGCAATTTGC
-CGGTTTGCCGATTTGCCGGAAATTTTCATTTTCGGCAAATCAGTTTTGCC
-GGAAATTATAAGACGGAAACACTGTCTTTTTGAATTGTTCCCGTTTTTTC
-TACATATTTTCATAGAAATTCATAGAGACAATTTGCCGAAATTTTTCGGC
-AAATTGCCGTTTTTCCGGCAATTTACCGATTTGCCGGAAATTTCCATTCC
-GACAATTTGCCGATATGCCAATTTGCCGGAAAAAATCGTTTGCCGCCCAC
-CCCTGAATTGTATCCCTTTTTAGTCTCCTGCAATGTCACCTCGATCACGT
-GAAATGCTGTCAGACAACAAAAAGACGACCGTTGAGGATGATCCAGCAGT
-TCCAATAACAACAAGTGTCGCTGGAGCAGTCACTTCTACGATTCCTGCTC
-TCATGTCCACTGAAAACGCGTTTCAGCCACCCAAAGACCTTATCTCGGGA
-AGAAAGCCAAAAGGTGCTCCGAACTTGTCTGGCAGCGTTCCACTTTCACA
-CAAGAGCTCACTGACTGGAGGTGCAGATAAGTGGGTTGGAGAAGCCGTGG
-CAAAGAATTGGATGGATTCGATCGGTTAGCATCCTTTTTTTTTTGATTGG
-AGGCCCCGGCGGCGTAAAAATCGTGCCAGAGTTGCAAGAGTGGGCGTTTT
-TTTTTGTTTTTCTGTTGTTGGTGGGGCCTTATTATTATTTGGTCGATGGT
-GATTTTACTTTACTGGTGGAAATCCGCTAATAAAACTAAAAACATCGGGA
-TATAAATAAAAACCCAACTTTAAAAAGCGAACCAATCAGCAGTTTGCTCC
-GCCCACTATTCAACCAATCCAATGATTGGTTCGAAATTGGGTACTCATTT
-TAGAGGGAATTCAAACGGAAGATTAGCAAGTTCGGTTATTGTTTCATTAG
-AATATCATTGCTTATATATATATTTAAAAAATAGTGTACGTCATCAATGG
-GCGGAGCCTCTCCCATCGTGGTGAGACCCATCGTGGTGAGACACATCGTG
-GTGAGACCCATCGTGGTGAGACCCTTCGTGGTGAGACCCTTCGTGGTGAG
-ACCCATAGTGGTGAGACCCATCGAGGTGAGACCCTTCGTGGTGAGACCCA
-TCGTGGTGAGACCCATCGAGGTGAGACCCTTCGTGGTGAGACCCATCGTG
-GTGAGACCCCCATTAATTTTGGCGTGAAATTCAAATTTTCTAAGAACAAT
-TTTTTGGCTTTTTTTTTAAAGAAAAATCTGGAAAATTCTAGCATTTTTTT
-AGAATAATCTGGAAATTTCTTGAACTTTCTAGCTAAATCTGGAAACTTCT
-AGAATTTCCTAAAATAATCTGGAGACTTCTAAAAAAGATCAGGAAATTTC
-TAGAACTTTTTTAGAATCTTCTGAAAACATCTTTCTAGAGTATACTAAAA
-ACTTCTAGAATTTTCATAAAATTCCGCGAAGCTCGAGGAAGAGATTTGTT
-CAAACAATTTAATGTGGAGCCAGTCGGAGCACGCGCTTTGCGCGTGCGAA
-CGGCTGGTTTTAGATATTTTGTAGTATTTTTCAAATCTTAAATTTTCAGA
-CACAGCAGAGGTGAAAAAGGAATACGATAAACTGCAATCACAGAAAATCG
-ATGTGGAGAAGGACTGTAAAACCTGGAAATCCAACCCAAAATTTAACCAA
-TCGGAAGACTTTCCTGCCTTGGACTCCAATCTCGTGAAACTTGGCAAAGA
-CTATGTGAACATCAGTCTTGTAGATGTTCCATTGGGAAGAAATGTTCATC
-TCGGTCAAGCTCCGGTCACGAATACGGAAGAAACATTCTGGAAAGCTGTG
-TTCGACAAGCGAATCACTCACATTGATCTACTCGTCGGCGATGAAACCAT
-CGAATTCTTCCCTAAAAAGGCAGAAGATTATACAAATTATGGTCAGATGT
-GGATCAATAACCGCCGTGTCGAGTATGTCAATGACGATGTGTACCGATTT
-GCAATTGAAGTAGTGCCCCACGGATGCTCCAACTCGATCATCTGCAATGT
-GACTGTTATCAGCAATTGGAAAGTGGACACTGTGCCTTTGAAACAAGCAA
-TCGCCATCAAAGAGGCACTTGGTCTAAACTACTTCTTGCTGAAAGCACCC
-GCTGACGAGCATGCGATGATCGTCTCACCACGTGGAGCTGGACGAGCTGG
-CTACTTTTTGGCACTTGCGGTTGCAGTCAACACAATTGATACAAAGCTTG
-CCGAACCATGTATTGCGGATATTGTCAAATCGATTCGCTCCCAGAGACCA
-AGAGCCGTGGATTCATTTTGTCAGTACTGCTCCCTGTACATTTCGTTGCT
-CTACTTCATCAAGGTATTGGTTTTTGAATTCTTGTAAAATGAGAGAATAA
-TTCTCAAATTTACAGAAGAAAGTGACAAAACCAGCAGAAGGGGATAAAAA
-GCCAACACTGAGCAACAAATACATCTACAAGAAGTCGGTTGAGTTGACCA
-AGCAATTCACCGTTCTCCTTCTCGAAGCGAGTCAGCAAAGTGTGATGGGA
-CCTGGATAGTTCTTCTCCATTTTGAATATGGAAAAGCATTTGAAGTGATC
-TGGGTTTGAAAATGAAGAATTTTATAAACCCTGGATTATTTCCGAAATCT
-TGCTTCCTGCCTGCTGTCTCATTGCGGCTTGATCTGCAAAAAAAGCGGTA
-ATATCTCCCCCAGGAAAATGTGACGTCAGCACACTCTTAACCATGCGAAC
-TTAGTTGAAACGTCTGCGTCTCTTCTCCCGCATTTTTCGAAGATCACACC
-AAAATGGGATACTTTGACAACACGTGCCTGCCATCGCTTCCTGACCGGGG
-ATTTTGTTAGAAAATTCGTGGAAAATAGGAAGAAACATTTCGAGAAAATG
-GAATTATTGATTTTCTGATTTTCTCAAACAAAAAAAAATTAAAATCGATT
-GATTTCTGGCTTACCTTACCTAAATTGAAATGGAAGAGTTTGCCGAACTA
-GGCCATTTTGGCTCGGCTATATCTGGGGTATATTTACGGCGCGTTGCGTG
-TCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAATGTGATTTGTCCGTG
-TGGAGTACACGACTTTCACATGCGTTGTGCGGCGGGCGATTGTCAATGGA
-GCGCGAAAAATACAATGAGGAAGGCCAAAACCCCGTGTATTGATTTTTCG
-AAAATTTCGGAAAAATCTCTTTGTTTTATTCATTATATTTCTCCTAATTT
-CTTTGAAATGTTCAAAAAATCTGATTTTCTTTTTTTTCCCGAATTTTTGA
-AAAATCGATATTTGCTATCCATATTTCTCGAAAAGAAAATCGATTTATTA
-ATTTTTTTCCGGTTTCCTGGAAGCTAATCAATTCAGAAAAAAGAATTAAG
-CTATGAATATATACTTATAAAAGTCGTAAAAGGTATGGAAATATAAATTA
-TTTTAAAACAGCGATTTCTGACTGAAGCATCTCAACTACCAGGGCCTCAA
-GTTCTTCTTATCCGACAAATGAGACGAGTCGGAGCTATAATTGTGCCGAT
-ATTTTCCGGGCGCCGTCTCTTCGAACTCGGATACGGTAGCCTGCCCGACG
-TATTTGAAATCGCCCATTAGCACTTCGTGGCAAGCGCCGATTGATGCTCC
-GTGGCCGACGAGTAGGAGGTTTCCTGAAAGAAAATCGATAATTTGCGGCG
-TGTTTTTATTGATTTTTATGTGAAAATTGGCAAATTATTGATTTTTCGGC
-TGAAATCATAAATTACTGATTTTCTGTTAAAATCAGTAATTTATTGATTT
-CTTCGGCTAAAATCAGAAATTATCGATTTTTCTGTGAAAATCTGAAATTA
-TTGATTTTTCTGCGAAAATCAGAAATTTACGTAGTTTCGCAAAAATTACC
-TTCATATTTCTCGAAAATCGCCCGCAGGGTCTTTCCGACACGTGGCACAC
-ACGCGTCATCTCCACATCCTTCGCGGGGTAGTGTGTACTGAAAAAAAAGT
-TCGGTAATTTTTCTAGGTCTCGCAGCGATTGCCGCCACCGGTATATTTTC
-ATTTTTCCAACTATAGCGCCAGCACCGGCGCCGGCATCTTTTTATTTTTC
-CACGTAGCACGTCGGCGCCGGCAGCCGCGCAAACTATTTTCGCCGCCGCC
-GGCATCTTTTTATTTTCCACATAGCGTGCCAGCGGCGCCGCCGGCATATT
-TTTATTTTTCCACGTAGCACGTCGGCGCCGGCAGCCGCGCAAACTATTTT
-CGCCGCCGCCGGCATTTTTTACTTTTCCACGTAGCGCGCCAGCGGCGCCG
-CCGGCATGTTTTTATTTTTCCACGTAGCGCGCTAGCGCCGCCCCCGGCAT
-CTTTTCATTTTTCCACGTAGCGCGCCAGCGCCGGCAGCCGCGCAAACTAT
-TTTTCGCCGCCGCCGGCATCTTTTTATTTTCCACATAGCGTGCCAGCGGC
-GCCGCCGGCATATTTTTATTTTTCCACGTAGCGCGCTAGCGCCGCCGCCG
-GAATTCATTCATTTTTCCACATAGCGTGCCAGCGGCGCCGCCGGCATCTT
-TTTATTTTTCCACGTAGGGCTCTAGCGCCGGCGGCATTTTTCATCTTTTC
-ATGCAGTGCGCCAGCGCCGCCGCCGGCATCTTCTCATTTTCCACGTAGCG
-CGCTAGCGCCGGCGGCAGCGCAAACCATTTTTCGCCGCCGCCGGCGCCTT
-TTCATTTTTTAATTAGTGCGCCAGCGCCGCCGCCGGCATCTTTTGATTTT
-TCCACGCAGTGCGCCAGCGCCGGCAACGGCGCAATTCTAATCTCGGTCTT
-TTTTGAGCGATACCTTCGAGAAAACAGGAATATAGTCCAAATCAACAAGC
-GGAAATTTCTCAGCTAGTTTGTCGGTTTCCCAGAATCCAGGAGGCTTATC
-ACAAAGATAAAGTGCCTCACAAAGGCCACCGTCCGCCTTCACTTTCATTC
-CTTTATCCTCAATAATCGTCGAAGCTGTCTCAATTGTCCGATCGAACGGC
-GAGGCAAACGTATGCGAGATTTGTGCATTTTCGAACCGATTTTTGCACTC
-TTTCGCCTGTTGCCGACCGCGCACGCTGAGCATCGAATTGTCCGACGTGA
-GACCGTCGGCTCCGTCGAGTTTACGCCAATTTCGATTGATATTGTCCTCG
-CTGCAATGCAAAAAATCAATAATTTCTGATTTTCACCGTAAAATCAATAA
-TTTCTGATTTTTGTTGAAAAATCATTACTACCGATTTTAACTGAAAAATC
-AATAAATTCAGATTTTCATTTTTTTTTTCGAAAAGTCGATAATTTCCAGA
-TTTTCATCGAAAAATCAATAATTTGTGATTTTCACAAAAAATCAATAATT
-TCAGATTTTTACCGAAAAATTGATAATTTCAGATTTTCACCGAAAAATCA
-GAAATTATTGACTTTGGATAAAAATCAATAATTTACTGATTTTCATCGAA
-AAATCAATAATTTCAACCTTTCGCAGAAAAATCGATAATTTTTAATTTTC
-ACCGTAAAATCAATAATTTCTGATTTTCACCAAAAATTAATAATTTTAAT
-TTTTTTTTCGAAAAATCAATATTTTCTAATTTTTATCGGAAAATCAATAA
-TTTCCGATTTTCACCAAAAAATCAATAATTTCAGATTTTTATCGAAAAGT
-CAATAATTTACGAATTTGACAAGAAAAAATCAATAATTTGCTGATTTTAA
-CAGAAAATCAATAATTTTTGTTTTTCATTGTTTTTTTTTTCGAAAAATCA
-GTACTTTTTTAATTTCCCCAAAAAATCAATAATTTTTGATTTTATTTTTC
-GAAAAATCAATAATTTCAGATTTTAACCGAAAAAATCAATAAATTCAAAA
-AATTTCATTTTTTTTTTGAATTCTTAAAAGTACCGTTCCGCGTGTCGAAC
-AATCCAAATTTTCCGTGGATAAGTGATCGGCATCCTATCGAGATCGGTTT
-TAGCTGAAAAAAAACCTTAAAAAATTGGAAAATTGTGTACTCCTCTCGGA
-CACGTGGTGTCAGGCTCTCCCATTACGGCTTGATCTACAAAAAATGCGGG
-ATTTTTCGTTCTTAACCATACGAAATAAGTTGAGAACTCTGCGTCTCTTT
-TCCCGCATTTTTTGTAGATCAACGTAGATCAGACCAAAATGAGGCACACT
-GAATGAAGACACCAGGATTTTTCGAAAAACTCTAAAGAAATTCTGCAAAA
-AGTGACGTCATGAGGTATATAGGTATGAAATCGAATACTTGGTATCAAAT
-GACGGAAAAATAAACGAAAGTTGCAAAATTTTTTGATGGAATTTATTAGA
-CTTTGGCGGGAAAACAGATCAAATTTACATTAAAAAATACGGGAAAAATA
-CGGGGAAAAAAACCAAATTATTGCCTAAAAAATTCAGGATTAAATTGCGA
-GTTGTACTTTTTCTTCTTTCCACGCTTCTCCTCCGAATCCTCGGCGGCTT
-TTCGTTTCTGCAGCAGCTCAATTTCCTCGGGATGTAGCAAAGCATGGGCT
-CTCGCTTTCTCGACTCGTTCCCGTTTCAGACGCTCGTCTCGCATGCTCGC
-CAGCTTCTGCCGTCGTTCTCGATCGTATTCCTCTTCGAGTTGACGTTCTT
-CAGAGCTATCACGGTGGCGGTGCTTTTCTGGAAGAAAAATTGGGGGGTTT
-TTTTGTAGTTTGTAGTGGTGAGCACCCTATATTGGAGGCGCGAAAAAAGA
-GATTTTTCGAATTTTTTTGTAGATCAACGTATGGTTAAGAACGTACTGAC
-GTCATATAATTTTGGGCGAAAAATTCCCGCATTTTTGGTAGATCAAACCG
-TAGTTGGACAAAAAGCAGATTTTTCGAAAAAAAATTACGAATTTCTGGCT
-TTCCTCATAAATTGAAATGGAAGAGTTTTTGCCGAACTAGGCCATTTTGG
-CTCGGCCATATCTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGG
-CTCGATTTTAGTTGTAAAACTAAATGTGATTTGTCCGTGTGGAGTACACG
-ACTTTCCCACGCGTTGTCCGGCAGGCGATTGTCAATGGAGCGCGAAAAAT
-TCAATGAGGAAGGCCAGAACCCCGTGGTGGTTCGATGCACAAAACTGATT
-TTTTTTTTGAATTTTTGGGATTGCGCAAGAAATTTCGCCGAAAAAGTCGA
-TAACTCAAAAAATTCTAAAAAATTTGGATAATCTGGAGAAAAAACCCAAA
-ATTTGCTGAAAATTTCGAAAAATTTAGCTTTAAATTTTTGCGCATGGCCG
-CCGGAAAAGAAAAAAACTCGGCCACCAATTTTTTGGCGGCCATGATGCAA
-GACACCATATTTGACGCGCAAAAAAAGGTGTTTTTGGATGTTTTTTTCTT
-TTTCCGCCAGAATTTTTAATAAATTTCCAGGGACAAAAAATCATAACCTG
-TTGCAAAAATGTTTTTTTTTTCGAAAAATTCAATTTTGCGCGTCAAATGT
-GATGCTTTAAGCTCTGTGGCCGCCGAAAAAGAGAAAACTCGGCCACCAAT
-TTTTCACTCTCCATTGACAATAGCCTGCTGGACAACGCGTGGAAAAGTGT
-CGTGTACTCCACACGGACAAATACATTTAGTTTTACAACTAAAATCGAGC
-CGCGACGCGACACGCAACGCGCCGTAAATCTACCCCAGATATGGCCTGGC
-CTAGTTCGGCAGAAACTCTTCCATTTCAATTTATGAGGGAAGCCAGAAAT
-CCGTGGCCGAAAAAGAGAAAACTCGTCCACCGATTTTTTTTTCTGACGGC
-CATGACAAGTTTGCGCGTCTATAATACATCATATTTGACGGGCAAAAAAT
-TTTTTAAAGTTTTTTCGAATTTTTGTGATTTTCGAGCAGAAAAAAAAATT
-GTCTGAAAATTTATGTGGCCGCGGTAAACTTCGGCCACCGATTTTCGACG
-ATTTTGCCCGTGTTTTTGACGGAAAAAGCACCATATTTGACGCGCAAATT
-TTCAAAAAAAAAAAAGCCCAAAAATCGCACTTTTCTTCTTCTTCTTGTCT
-TTTTTATGCCGTTTCTTCGCCTTTTCTTCACTATCACTATCCTCTCGTTT
-CCGCTTCCTCTCCTCTTCCAGCTCTTTCCGCTTCAAACACGGCAGAGCAT
-CGCGCGCTTTTCGTCGATCAAGTGGCTCGGCGGCTCTTCGCAGCGGCAGC
-TCCTCGTACCACTCTTTTTTCTTGTTTAAATCGTTCGTATTATCCGCGAA
-ATACACCTGAATTCCCATTTTCGACTCCCATTCCTTCTTCTCGGCAGCTT
-TTTCCGCTTCGTAGTCGCGGTTTCCGGATCCATAGTTTTTTCGTTCTTCA
-CGTTCGAGATCCTGCAAAATATCGATTTTTTTTGGAGAAAAATATAGTTT
-TTTTTTGGAGAAAATTATCGATTTTTTGGAAAAAATTATCGATTTTTCGG
-GGAAAATTAACGATTATTTTAATAGAAAATTATCGATTTTATTTGGGAAA
-AAAATCACTGATTTTTTGGAAAAAATTATCGATTTTTTTCGGAGAAAAAA
-TATTAAATTTTTTGCAGAAAATTATCGTTTTTTTTTTTGAAAAAAATTAC
-CGATTTTTCAGAGAAAAATATCGATTTTTTAGAATAAAATTATGGATTTT
-TAAATATAAAATTATCGATTTTTAGGGAGAAAATTATCGATTTTTTTTGG
-AGAAAAATATTGTTTTTTTTTGGAGAAAAATATAGATTTTTTTGAAGACA
-TTTATCGATTTTTTGTTGATAAAATTATCGATTCTTCGGGGAAAAATATA
-GCTTTTTTTGGATGAAATTATCGATTTTTTGGGAGAAAAAATACCGATTT
-TTTTGGATAAAATTATCGATTTTTTTGAAGAAAAAGTATCAAATTTTTTG
-AAGAAAATTGTCAATTTTTTTGGAAATAAATATAGTTGTTTTGGATAAAA
-TTATCGATTTTTCAGCTAAAAATATAGATTTTTTTAGATAAAATTATTGA
-ATTTTAAAAAGAAAATTATCGATTTTATGGGTAAAAAATAACGATTTTTT
-TGGAGAAAATTATTGATTTCTTCGGGGATAAATATTGATTTTTTCGGGGA
-AAATTATCGATTTTTGGATAAAATTATCGATTTTTTGGAAAAAATTATGG
-ATTTTTTTTGAAGAAAAATATTGATTTTATTGGAGAATAATATCGAATTT
-TTTCGGGAAAATATCGATTTTTTGGAGAAAATTATCGATTTTTTTTGAGA
-AAATTATCGATCTTTTGGGTAAAATTATCGATTTTTTGAAGCAATTCTGA
-GCCAAATTTTGAATTTTCGAGCGGCAATTTTTGCACAAAGCATCATATTT
-GACGCACAAAATTCGAATTTTTCAGAATTAGTTTCACAAAAAATCCATCT
-ATCACCTGAAACAAGTTCACATGTCCCGTTTCATCTGAAATGCTGACATC
-TTTTGCTGCTCCAGCTGAGCTCGAACCAGCTCCTCCACTAAACATCGTCT
-CCATTCGTTGATCGGCTCGGGCTCTCAACTGCATCAGGCGCCGCTCGTTT
-TCCGCCTGAATTTGCCTGTCGAGCACACGCTGCTCATCTTCGGCGGCTTT
-TCGCTCGTCTCGGCGAACCCGTTCCATGTTGGATTTTGTCCGAACGTGCC
-ATGATTTGTGATGGAGAATGTTCATCTGGAAGCGGAAATTATAGAGAAAA
-AATTGATAATTGTGCTCGAAATTTGGCTCTGGAAGAAGCGCAAAAAATCA
-ATAATTTCGTCCAAAAATCTATTTTTTTCAGAAAAACCAAAAAGCGTTTT
-TTTTTCCAAAAATAAAGATAATTTTCGTCCAAAAATCGATAATTTACTTC
-TAAAAGTCTCAATTTTTCCAACAAAAAAAACAATTTTCGTCGAAAAACCG
-ATGTTTTCAGAAAAATCAAAAATCAAAAAAAAAATTAAAAAATTAAAAAA
-AAATCAATAATTTTTTCTAAAATCTTGCAATTTTTTTCTAAAAATCGTTT
-AATTTTCTTCTAAAATCGATATTTTTCCGGATTTTTTCGTGAAAAAAATC
-GTCAATTTTATTGAAAATTTTGCTAAATTTCGAAAAAAAATCTTGAAATT
-TCGATGCACCATGATTTTGAAAATTCTGCTCCGGATCAATTTTTCGAGAA
-AAATTATCGATTTTTGGAAACTATCATACAAAAATCGATAATTGTGCTCG
-AAATTTGGCTCTGGAAGGAGGAAAAATCAATAATTTTCTTCTAAAAATCG
-ATTTTTTTTCCAAAAAATCAATAATTTCGTCGAAAAACCGATGTTTTCAG
-AATAATCAAAAAAAAAATTAAAAAATTAAAAAAAAATCAATAATTTTTTC
-TAAAATTTTGCAATTTTTTTCTAAAAATCGTTTAATTTTCTTCTAAAATC
-GATATTTTTCCGGATTTTTTCGTGAAAAAAATCGTCAATTTTATTGAAAA
-TTTTGCTAAATTTCGAAAAAAAATCTTGAAATTTCGATGCACCATGATTT
-TGAAAATTCTGCTCCGGATCAATTTTTCGAGAAAAATTATCGATTTTTGG
-AAACTATCATACAAAAATCGATAATTGTGCTCGAAATTTGGCTCTGGAAG
-GAGGAAAAATCAATAATTTTTTTCTAAAAATCGATTTTTTTTCCAAAAAA
-TCAATAATTTCGTCGAAAAACCGATGTTTTCAGAATAATCAAAACAAATT
-TCAAAAATAATAAAAAAATCAATAATTTTTTCTAAAATTTTGCAATTTTT
-TTCTAAAAATCGTTTAATTTTCTTCTAAAATCGATATTTTTCCGGATTTT
-TTCGTGAAAAAAATCGTCAATTTTATTGAAAATTTTGCTAAATTTCGAAA
-AAAAATCTTGAAATTTCGATGCACCATGATTTTGAAAATTCTGCTCCGGA
-TCAATTTTTCGAGAAAAATTATCGATTTTTGGAAACTATCATACAAAAAT
-CGATAATTGTGCTCGAAATTTGGCTCTGGAAGGAGGAAAAATCAATAATT
-TTTTTCTAAAAATCGATTTTTTTTCCAAAAAATCAATAATTTCGTCGAAA
-AACCGATGTTTTCAGAATAATCAAAACAAATTTCAAAAATAATAAAAAAA
-TCAATAATTTTTTCTAAAATTTTGCAATTCTTTTTTCTAAAAATCGATAT
-TTTTCCGGATTTTTTTCGTGAAAAAAATCATCAATTTTATTGAAAATTTT
-GCTAAATTTCGATAAAAAAACGATTATTTTGAAATTTCGATGCACCATGA
-TTTCGAAAATTCTGCTCCGGATCAATTTTTCTAAGAAAATTATCGATTTT
-TGGAAATCATCACACAAAAACCGATAATTTTGTGAAAAAATTCGATTTCG
-ACGCACCATGATTTCGAAAATTCTCAGAATTTTAGAAAATTTATCGATTT
-TGTGTAGAAAAAATTCGAATTCCAGTGGAAAAATTTTCTTTTCTCAAAAA
-ATGTTTGATTTAAAAAAAATCGATTTTTTCAGAAATTCAGGCATTTTTTT
-GCAAAGTAAATTGGCAAAAATCGATGATTTCACTGTGAGAATGGGAATTT
-TTGTCAAGAAAAATATAAAAAATTGCCTTAAACAATTAAAGTGGTTGTCA
-AAAAATTGAAATTTTGGAAAAAAAAATATATTTACAGATGAATTTATTAG
-AAAAATTCCACAAAAAAAGAGGTTCCATCTAATATTATTATGTCGCATTG
-GGGGTTATATCACATAATTTTTTTTTGTTTCGGTTGCCGTGGAGAAGGGG
-GAAAATATCACATTTTTCAGAGGAAAATCACAATAAATATAAGGAAAATT
-TACAAAAAAAGGCGCGGGGGGAAATTTCTTCACAAAATTATCGATTTTTG
-GGTGATAATTTCCAAAAATCGATAATTTTTATAGCAAAATTGATCCGGAG
-CAGACTTGGGATAAAGCAATTTTTGGAGGGGGAAAATGAACAAATTAATA
-AAATATAATATATTCGGGGCAAAAAATGGGAAATAATTAAATTGTCGGAA
-CATATAAATGATTAATTGATTGAGCCAATGGCATTGGTTTCATGTGAGCC
-AACGCTTCATTACAGAACACTTCCTCCCGATGACGTAGCGGACGAGAATG
-CTCGACACGAGCAAGACGGTAGGCTCTAGAGGCGTTTATCTGGAAATTTT
-TAGTGAAAAAATGAAGAAAAAAAGCTTTTTTCGCTGAAAATTCCAAGATT
-TTCGGTTTTTTTTTTGCTAATTTTTTTTAAATTTGCCTTGAAATAAATTT
-CCAGATGTTCAGTAGTTTTTTTTTCCTTCAAAAATCGATTTTTCAATTAA
-TCAAACATTTTTCAGAGTATTAATAATTATTTTTCCACCAGAATTTGAAT
-ATTTTATCCAAATTCTGAGAACCGGCTCACAGAGCGGCTTTTACTACGTG
-GCCTAGAAAAATCAAAAACTCGGCCAATGATTTATCTGGGATTTTTGACG
-TGGGATGTTTCTGAAACTTGACGAGAATGTTCTCGAATGGGGGTTCTATA
-GTTCCACCGTGGCGATTTTTGAGAAAATGTTCCGTATCCATGTTATGAAG
-GTGGCCGAGTTTTCTTATTTTACGGCCACGTAATAAAAACCGCTCTGTGG
-GCTCCTGAGCAGAATTTTCGAAATCATGGTGCATCGAAATTTCAAAATTA
-TCGATTTTTTTTTTGAAATTTAGCAAAATTTTCAATAAAATAAGAAATCA
-TGGTGCATCGACAAACCAATTTTTTCCATTTTTTCGGAATTTAAAATAAA
-ATTTAAAAAAAAGTAAAATTCTGGAATTTTACTTTTTAAAAATATTTTTT
-TCAAATTCTGGCAGTTTTAAAATAATAAAAAAACGTTTTTTTTCCATTTT
-TTTCAAAAATTTTTTTCTGAAATTTAGTACTACAAATGTAAAATTTACAG
-GGTTTTCACAGGAATTTTCAATTTTTTTGATTCGCTTTTCTTCAAAAATT
-CTAAATTTTCAGGTTTTTTTTTCCAATAATTTTTAATTTTTGTGAAAAAA
-AAATGTTTTTAATTTTTTCAGACTTAAAAAATTGTGACAACTTTTTTCAA
-TTTTTTCCGCAAAAATAAATTTTCGGAAATTTCAAATTTCCTACAAAAAA
-CCCCTTACCACAGTAAGCCTAACCAACTGTGAGAGCTCGCTCATCGTGAC
-TAGGGCTCCGTCGAAAAGCGGCCCAAACTCCAGAGCCGACGCCGTATCGA
-CGCGCACTCGAACCATCTGAAAAACCAAATAATGGAAGAGTTTTTTTTCG
-GCCAAGCCAGGCTGCCCCATTTGATCTACGTAGATCTACAAAAATTGCGG
-GAGAAGAAAAAAGAGACGCAGAGTTCTCAACTGATTTCGCATGATTAGGA
-GTGTGTTGACGTCACATTCGCAAAAAATTCCCGCATTTTTTGTAGATCAA
-ACTGTAATGGGACAGCCTGGGACCACGTGCAGTGTTAGGCTGTACCATTA
-CGGTTTGATCTACAAAAAATGCGGGAATTTTTTGCAAATGTGACGTCAAC
-ACACTCCTAATCATGCGAAATCAGTTGAGAACTCTGCGTCTCTTTTTCTT
-CTCCTGCATTTTTGTAGATCAACGTAGATCAAGCCTCTCTCTCTCTCTCA
-CCTTATCACCGACTTGCTCCAACACAATCAGAACATCACAAAACTTGGTG
-GCAATCGTTTCGCGGGTGTACACTTTCCGTGTGTTCTCAGTCCACACCAC
-ATGCACCTCATCGTTTCCGATATGCTTCCACTTCTGCTGCACATCGCCGT
-TGAGCATCGTGCTCACATGGAATATCACCTCAGCCTCGGCGTCTGCAAAG
-TACGGAGCCCGTGTCTCTACGGGCAGGCCACCGGTGTAACCATCGTGTCC
-TCGACCCACTTTGACCTCCCATCCGAGCTCCGACGTGAAGCTGTCAAATT
-GCGCGGAGGCGGAGGCGGTGGTGTTGGACAGGATCGATGCTCGATCTTCC
-TGCGATTCTCCTACATAGATCACAGCGACTTTGTGGACTTCACGAGAAGA
-AGTCTGATCTAAATGCTTCAAGTCACGCGGGAAATTCGCGTGAACCTGAG
-ACACAAGTGGGACGAATCCCAGGGAAGCCGACAGCGATCTCCATTCGAGA
-AGCTTCGCGTTCGGAGTGAACGCTGGCAAATGATCGTGAGCCGCCGACGA
-TGTGCCAAGTGGCTGTGGCTGCCGTCTAGACGTCTCAATCATCGATGTAA
-ACTGTGCGGCACCATCGACAGGCGACGGGCTCCCACGTGACGGGGGGTAG
-TCCGGTAGATCATCGAACGGATCATCCATCGCTCCGAGGATCCCCTGGCT
-TTCCCGACCGGGACGTTTTCCCTTGAGAGCCTCTTTGCGTAGCCAATTGG
-TCACGTTGGTGGCAGGCTTGCGGACATCCTCATGGGTATCTAGATCCCAG
-ATATGCCGGCCAACTACCGTTCGGGAAGTGATTTCGCAGGGGGATTTGGC
-GTGGAAATCCTTTCGGGACACCGAGATAATCGCCGATTGCCGATTAATAT
-ACACGGTTTTATCCTCTCCTTGTAGTGGCGGTGCTCCTGCAGAGCTCCAT
-CTCTGAACCTCAAAACCTCGCACCGGATACTGACCACCGAGCGTGACAAG
-CTCTCCATGGAGCACCATATGCCTATCGGCCAAGATACCGCGAATGACGA
-GTGGCATTTGAGGTTGTGGCCATTGCATACAAAGCTTCACCATCTGCCAC
-TCGATCTCGGTTCTCGTACGCTCATCGCGTAGGAGCGAGGCGGCACGGAG
-CAGCGCCTGGAGCAGTGTGGTGCTCGAGAACTGGGCGAGCGAGGCGATCG
-ACGAGCAGAAGAGCGGAATGAGCCGCATCGCGAACTGATGGGTTTCGATG
-GTTTTCAACGCGGTGAGCACCAAGTCGATTTGGGCTTTTTGCACGATGAG
-GATGGCTAGCGAGTTCACGATTACTACGGCGTTCTCCGATACGTCTGTAT
-TGACAAGCTGATCGAGAAGGATTTGCTCGGCTCCAGGATACGATGAAGCT
-AGCATTGAGAACAACTTCAACGAGTTCGAGGACACCTTCGTGTCCTTCGA
-GCTCTTCGCCGCCTGCAACATTTTCGGCAAATGCTCCAGAGCTCGCGGAG
-CAACAATTGATAGTTCGTGTGCAGAGAGCCCACAAATCGCCGGAACCACT
-AGTTGCTCCTTGGATTGCATAAGACGGATGAAGCAGAGAAGAATGTTGGC
-CGAGAGCAGTGGCGGTGGCCGACGGATCGTTGATTCGTTGAGAATTGCAC
-TTAGAGCCGGAACACAGCGGGGCAGCAGGATTGGGGGTACGGTAACGAGG
-CGGCACGCGAGCCAGTGGGCCAGTGGGTGCAGGTTTACCTGGAAAGCAAA
-ATTTTTTTTGGCTTTTTTTCAACTCGAATTTTTTTTCTAAATTTTTTTGT
-AAATTTTCTAAAAAATAATTGTTCGATTTCAGAGTGCCTCATTTCGTGCG
-TGATCTACGTTGATCAACAAAAAATGCGGGACTGATTCTGCATGGTTAAG
-AACGTGCCGACGTCCTATTTTTTGGGCAAAAAATTCCCGCATTTTTTGTA
-GATCAAACCGTAATGAGACAGCCTCACGTCGTGCCAGAAAGTCCCATTTC
-GTGCTTGATCTACGCTGATCTACAAAAAATGAGGGGCTGATTGTGCATGA
-TTAAGAACGTGCTGACGTCACATTTCGTTTGGCAAAAATTCCCCCATTTT
-TTGTAGATCAAACCGTAATGGGACAGCCTGACACCACGTGATCTTCAAAT
-TCCCGCCAGCCTGAAACCCACCAAAAGCAAGTTCTCAATCGTCAATGACA
-TGCAATCGATTGCCACGTGGGCACTCGAGTTGGTATACGGATCCACGAGT
-GAGATGACACGACGCCACGTTTGAAGCCACGCCAATTTGTCGCCAGACCA
-AGACTGAAAAAGGGAAAAAGTGTGATATGCGCCTTTAAGAAAGGGTTACT
-ATAGTTGTCAACAACAGAAAAAAATGCTGAAAAGGCATTTTTCAGGGTCT
-ATTTTCACAATGAGTTTGGGTATAAATTGGAGAGTTTTCCATAGATAATG
-CGTACTGCGCAACTAATTTGACGCGCAAAATATCTCGTAGCGAAAACTAC
-AGTAATTTTTTAAATTACTACTGTAGCGCGCTGGTGTCGATTTACGGAAA
-TTAATTAAAATAATTGATAAACAAAACAGAAACTATGTTCAAAAATCGAG
-ATCCCGTAAATCGACACAATCGCTACAGTAGTAATTTAAAAATTACTGTA
-GTTTTCGCTACGAGATATTTTGCGCGTCAAGTATGCTAAAAAATATGTAG
-TTGTGGGAGCCTTGTGAATTTTTAGAAGGTTTTTTGAAAAATAACTCGCC
-ACTATTAAAAAAAATATATATTTTGAGGCATTTTCAAAGGGTTAAAGTAA
-TTTTTTACTTTTAAAATCGTTTTTTTTTATAAAATAAATTTTAAGCGTTT
-TTAGTACAATTTTCGTAAGTTTTTCGTTTTTTTTTTGGTCATATTTTGTA
-GTTTTTTACACTATTTTCCAGAAATCGTCAGAAAAAGCACTTAGAAACGG
-GCTAGAAAAACGGGGTTTCGGCTTGCTGCGAAACTTTTTTTTTTGAAATT
-ACCGCGCAAAAATAAATTGTCATTCAAGTAATGTTGCAAAATGTATTAAA
-ATATAGGTTTTTAAAAATGTATTTTAATACAGTTGTGACGTAATTTTTCT
-ATTTCAATTTTTGCAAAATAAGAAAAAAAATGAATGTAAAAAAGTTAGAA
-AGTTTTTAAAACACATTTTATACAGGTCATTACGCTCTATTTTCTGCCAT
-TTAAAGCGAGAATGTTTTTTGACACTACATATATAATATTAGGTCTCCAA
-ATAAGATCCGGGTCAAAAATCATAACTTTGTTCGCTGTGTATCGATTTTT
-ATGAAATTGTGGGAATTTGTGTTATCAACCATGATCTTTCATTTGACAAT
-AGTCACAAAATTTTTTGGCCGTCCGAAGTGCCCGTACTCGGAGCCAATTT
-TTTCAGACATTTTTCAGATCTCGCTTCTTTTCAGGTTTCAACTGAGGTTT
-GTGTGCGGATATTGCTTAGTTTAGTACACAATGTAAGAAAACAAAAAAGT
-TTGGAAAAAAATCCGTCCAAAAAAAATTTTTTTGTCGCTCGTCAAAAAAT
-CTACAAAAAAAATTTTGTCGAAAATTCTTGAATTTTTATACAAAAATGAT
-GTAACCGTGTGCAAACTAATTTTAAACATACAAAACATTTGAGTATGAAA
-TTTGGATCTCGAGAAATACTCCAAAAACTCGAAAATAGTTCGAAAAAGCT
-GTGTTTTTTGTTATTTTTTTTAGTGTGACGCACCAAATTGAAATTTTTTG
-TATGTGTAAAAATAGTTTGCACATGGTTACATCATTTTTGTATAAAAAAT
-CGAGAATTTTCGAAAAAAAATTTTTTTGAAGATTTTTTGACAACCGACAA
-AAAAAATTTTGTTTGGACGGATTTTTTTCCAAACTTTTTTGTTTTCTTAC
-ATTGTGTACTAAACTAAGCACAATCCGCACACAAAGCTCAATTGAAAACT
-GAAAAGAAGCGAGATCTGAAAAATGACTGAAAAAACTGGCTCCGAGTTAG
-GGCACTTCGGACGGCCAAAAAATTTTGTGACTATTGTCAAATGAAAGATC
-ATGGTTGATAACATAAATTCCCAAAGTTTCATAAAAATCGATACACAGCG
-AACAAAGTTATGATTTTTGACCCGGATCCTATTTGGAGACCTAATATATA
-TATATATATAAAGATACCTACCGTAACCGCATTTGTAATATCATCAGTGT
-CATGAAAAACGTTATCCTCTGCAATTGTGTTCGACGATGACATACTATCT
-CCAGTCTCTGACGAATCATTTCTCGGGTCTTCCATCATTGCCGATTCGAT
-TGCCTGTCGTCGACTGTTCTGTGAGACTTCTGTCGCTTTTCGGAGAGCTT
-CTTCACGGGAGAATATGTCGATATGGGCGAGATGGAGGATTAATGCTCGC
-GTTACACTGTTCACAATCTGAAGATTTCGTTTTATTTTTTTGATTTTGGC
-TGGAATTTCATAAAGCTATGCTTTTGTTGAAATTTTAGTTTAAAAAAATA
-AGGTTTTTGAACTGAAAATTGGGATAAGAATTAGAAAAAAATTTGTTTTT
-TCTCTAAAACTGCTGCATTTTATTCAATTTTGTAAGATTTTCTGTACAAA
-ACATAATAATTTTTGAATTTTTTTTCCAAATTTTTTGAAATTTCAGCAAG
-AACTGGACAAAAAGCACTACTTTTACTAAAATTGGCAGCATTTAGGAATT
-TCTGAAAAAAACAATTAATTTTCATTATTATTGTCATATTACAGGAACAC
-ACTATTCTGAGAATGCGTATTACACAACATATTTGACGCGCAAAATATCT
-CGTAGCGAAAATTACAGTAATTCTTTAAAAATGACTACTGTAGCGATTGT
-GTCGATTTGCGGGCACGATTTTTTGAAATGAATTTTAATCATATTTTGAG
-CAAAAAATGGGTCAAAAATCAAGCCCGTAAATCGACACAATCGCTACAGT
-AGTAATTTAAAGAATTACTGTAGTTTTCGCTACGAGATATTTTGCGCGTC
-AAATATGTTGTGTAATACGCATTCTCAGAATTTTGTGACTTTTCAAAAAA
-AAAAATCGTGATCAAAAAAAATTTTTAATTGTTTTTTAAGATGAAATTAC
-GATTTTTTTCGTTCTCTATAAATTTTGATCAAATTTATTTCAAAAAAAAA
-AAAAATTCTTTCTATATTTTTTTTTTCGAGTTTTTTTTTCTATCTTCTGT
-ACAAAACACAGCAATTTAAAAAAAAGGCAAAATTTTAAGATTTTTCTAAA
-TCTAGATTTCTAATTTTCCTCGGGGTTCTGGCCATCATCCTCATAAACAG
-AAATGGAAGAGTTTTTGCCGAACTAGGCCATTTTGAAACTCTTCCATTTC
-AATTTATGAGGAAGGCCAGAGCCTCGTGGAAAATTAGAAATTAGATTTCG
-AAAAATCTTAAAAGTTTGCCAATTTCTTATTAGATTGATGTGTTTTGTAC
-AGGAAATTGAGAAAAAAATCGGCAATTTTATACAATTTAATTTTAAAAAA
-TATAGTTAAAAATAGAAAAATTCAATGAAACTGGAAAAAAATGTTTACTT
-TGAAAAGTTAAAAAAAATGAAAAAAAAACTCAAAAATTGAATAAAATGCG
-GCAATTTTTGAAAAAAAAGCTTTTTTCCATAGTTTCTGTCAATTTTCGGC
-TAAGATTAATTTTTTTTCATCAAAATTTCGATTTTCATACTCTCTTACCG
-AAGCCCATTGCTCAGCCATCGGTATCCAAACACCCTTCTTCATGACGTCA
-TGCACCTCATCCCACACCTCATCGTCAATTTCGATGCGTCTGACAGCCTT
-AATCACGACGACATTCGAGATGAGTGTCGACGTAAAAGCAGCCGACACAT
-TCTGGGAAAACGCGTCCGATTGGCGACAGATTTTCGAGGCGCATGTGCAG
-AGTCCCGCCATTAATTCTGACCAGAATTTTTGGGGAAGCGGTTTTGGGAG
-TTGAATTCGATGGGAAACCAGCTGCTTGCACGATGTTAGAATCGCAAATG
-CTATGGAGATTGCCGAGGAGTGACTGGAAAAATATTTTTTTTTAATTTTT
-AAAGGGATTTTGGGAAATCGAAAAATTTAAAAACTCGGATTTATGAAGTT
-TTTGGCAAACCGGCAACTTCTGGTTTTTGGAATTTCGCCACTTTTTAACA
-ACCGGCAATTTGGCGATTTGCAAATTTTTGGAAAACCGGCAATTTATGGT
-TTTTTTTTCGGAATTTTGCTAATATTTTTAAAACCGGCAATTTGCCGATT
-TGCAAATTTTTGGAAAACCGGCAATTTGTGGTTTTTGGAACTTGGCCACT
-TTTTATAAACCTACAATTTGCCGATTTGCAAATTTTTGGAAAACCGGCAA
-TTTCTGGTTTTTTTTTGGAATTTTTCTAAAATTTTAATAAACCGGCAATT
-TGCCGATTTGCAAATTTTTGGCAAACCGGCAATTTGTGGTTTTTTTGGAA
-TTTTTCTAAAATTTTAATAAACCGGCAATTTGGCGATTTGCAAATTTTTG
-GAAAACCGGCAATTTTTGATTTTTGGAATTTTGCTAAAATTTTTAAAAAC
-CGGCAATTTGCAAATTTTTGGAAAACCGGCAATTTGTGGTTTTTGGAATT
-TTGCCACTTTTTATAAACCGACAATTTGCCGATTTTCAAATTTTTCGGCA
-AATTGCAGGTTAATAAAAAGTGGCAAAATTCCAAAAAAAAACCAGAAATT
-GCCGGTTTTCCAAAAATTTGAATATCGGCAAATTGTAGGTTTATAAAAAG
-TGGCAAAATTCCAAAAAACCACAAAATGCCGGTTTTCCAACTCTTTCAAC
-GAGAGTATCCAATTTTTTAAATAGAAAAATTGCCGTATTCCCTACCGTTC
-TCCACACATTTGCCGATTTTCAAATTTTTGGAAAACCGGCAATTTTTGAT
-TTTTGGAAGTTTGTAAAAATTTTTTAAAGCGGCAATTAGTGGTTTTTGGA
-TTTCTGTCACTTTTTATAAACTTACAACTTGCCGATTTCAAATTTTTGGA
-AAACCGGCAATTTGTGGTTTTCAAGTTTTCTGCTAATTGGCAAACTGGCA
-AAATGCCTTATTTTGGAAGTTTAGGTAAATTCTCAGAACACCGGAATTTT
-GACATTTTTCAAAATTCCAAAAACCACAAATTGCCGGTTCGCCAAAAATT
-TGCAAATCGGCAAATTGCCGGTTTTTAAAAATTTTTGCAAAATTCCAAAA
-AACCACAAATTGGCGGTTTGCCAAATTTGCGAAATTCCTAAAACTGGAAA
-TTGACGGTTTTCAAAAAAAAAAAAAGAAGGGAAATCGGCAAATTACAGAC
-TTACAAAAAGTGGCAAAGTTGCAAAAGCCAGAAATTGCCGGTGTGCCAAA
-TTTGCGAACATTTGAAAATACCACAAATCAAATTGCCGGTTTGCCGAAAA
-TGTGCAAATCGGCAAATTGCCGGTTTTTGAAAATTTTTGCAAAACTCCCA
-AATTTACAGAAAAAATTCCAAAAATCAAAAATCCGAATTATTCCAGAATT
-TTTTCTTCGGAAAAATTAAAAATTGTTCAATTTTCCAACATTTTCAACAA
-GCGTATTATCGAAAAAATACAATCGCACAAATTTCTCGTAATTTATTTTT
-GATCTACCTTGTTGACTAGGCTCCGCCCCTAATCTTGTTGCTGTTGTTAT
-TGTTGTTGTGGCTGTCTAGTTGAAGGAAGGGGCGGAGCCTATTCAACGAG
-GTAGATCAAAAATAAATTATGAGAAATTTGTGCGATTGTATTTTTTTTCG
-ATAAAATCCAATTTTTTAATGGAAAATTGCCAATTCCCTACCGTTCTCCA
-CATTGAGCCAAATACGGACTGTGAAAGAAGCCCAACAAGATATTCGAGAG
-CAACAGCGAGCATCGTTCAATCGATACTTCTCCAGACGCTACGAATGGTG
-GAATTTCGTACTGCAAAAGCCATGCGGAGAGCACATTTACCACTTTATGA
-GTGACATTTGAGCATGCCAATGGGAGTTTCATTGCTTCACGCATTAGTGT
-TAATGCTACGTTTGTTGCCTGGAAAAGGACAAAAAAAACTATTTTTTTAA
-ATGTAAGTAATTAATTTATTTTTTGAAATCTCTTTAAATGTGGTGTAGTC
-GAATATTTTTTCAATTGCTTAATTACCCTCAAAATTGTCTGAAAACACCG
-AATTTCATAATGAACTTCTTGAAAACTTCTCAGAAAAAAGTTATGACGCC
-TCAAAAAATGGCCTAAAATTGGTTAAAATTTGAAATTTGACCTACTTGCC
-AAGCGGCTGGAAACTAGCTTTTTTTTGAAATCACTGTCAAATTTTGAGTA
-TTCAATTTAATTATCTTGCGTTTTCAACTCGATTCAGGTATTTTAAAATC
-GATAAACGAAGAGATTTTTAAAAATTATTTACCAAATCTCTTCTTCCATC
-GATTTAAAAATACATAAATTTAGTTGAAAACGCAAAATAATTAAATTGAA
-TACCCAAAACTTGACTGTGATTTCAAAAAAAAGTTAGTTTCCAGCCGCTT
-GACAAGTCGGTCAAATTTCAAATTTTAACTAATTTTAGGCCATTTTTTAA
-GCCGTCATAACTTTTTTTTTTTGAGAAGTTTTTCAGGAAGTTTCATTATG
-AAATTCGGGTGTTTTCAGATAATTTTTAGTATAATAAAGCAATAAAAAAA
-ATTCGACTACACCAACTTCAAAAATGTAAGCAATTTTATTTTGAAGGCGG
-TTTTCTTTTACTTTTCTAAAAAAAAAATTTATTCAATTTTACGATTTTTT
-GCGTAAAAAAACACGGTCAAATTTTTGTTAAATTCGAAAAGGCGTGTCCA
-TTACGGTTTGATCTACAAAGAATGCGTGAATTTTTAGCCCAAAAAGTGTG
-ACGTCAGCACGAAAATTCTGCGTCTCTTCTCCCGCATTTTTTGTAGACCT
-ACGTAGATCAAGCCGAAATGGGAGAGCCTGACACCACGCGCGTGTGCGCC
-TTTAAAGTGAGTACTGTAATTTCAAAAATTCCACAACATCGAGAGTTTGA
-AACTACAGTACTACTATTTAAAGGCGCACACACTTTTTCGAATTTAACAA
-TAAATTGTCGTGTTGAGACCGTATTTAGGGCTCAAAAAAAAAATAATTAT
-CTCGTTAGAATATTCGGGAAAGTTGCAGTTTCACTGAAAATTTGAATTTC
-CCGCCAAAACGAATTTTCTCCGAAAAATTTGAATTTCCGCCAAAAAATTT
-TTTTAAATCAGAAATTTGAATTTCCCGCCAAAATCGTATTTCTCAGAAAA
-TTTGAATTTTCGCCAAAAATAAAAAAAAAAATTTTGGCGCGAAATTCAAA
-TTTTCTGAAAAAAAAATATTTCGGCGGGAAATTCAAATTTTCTGAGAAAA
-TATTTTTTGGCGCAATTTTTCATAGAAATTTAGTTCTTTTGATGTGTAAA
-TTTCCAAAAATTTCAACAAAAAATCGCATTTTTCTTATTTTTTCCCCAAA
-ATTTTCAAATTTTCTCCTCCAAAACCACGGAACTTTATGCGACGAAAAAA
-GCGCATTTCGATACAAAATCAACGATGCATGTGTAGTTTGTAGTGTTGGT
-TGTCCTCCAGCCGTTGTGTGAGTTGTTGCCGATGCAATATTATTAATCCA
-TCGAATTAGCCAATATCTTGCAATTACCACCGGATCAGCTGTATCCAATG
-GTTCACCATTCTCATCGGCTCCTTCCCAGCCACCGAATACATCGACTCCG
-TTCGTTTCCAGATCGGTGAAGCATTCGCCCATGTATAGCTTTATTACTCT
-GAAAATTGAAGAGTTTTGTACTCCTCTCGGACAATTGGAGGTGATTTTTT
-TTTTCGAATTCTTTAAAACAAAAATTTCCCGAAATTGAGCTTTTAAAATT
-TTAAAATTTCAAAATTTCAAAATCAAAAAAAAAAAAAAAAACTTTTGTAC
-AAAATTTAAAGTGGAGAATTTTTGTATTTTAGACAAATTTTTTAAACATT
-TCTAGCAGAGTTGAAAATTTCAGGCAAATCGGCAATTCGCCGAAATTGAA
-AATTTCTCATAAATCGGAAATTGCCGAAAATGAAAAATTCCGGCAAGTCG
-GCATATTGCCGGAATTGAAAATTCCTTACAAATCGGCAATTTGCCGGAAT
-TGAAAATATCCGGCAAATCGGCAATTTGCCGGAGTTGAAAATTTCCGCCA
-AATCGGGAATTTGCCGAAATTGAAAATTTCGTATAAATCGCCGATTTGCC
-GGAGTTGAAAAATTCTGGCAAATTTGAAAATCGGCAATTTGCCAAAGTTG
-AAAAATTCCCGGCAAATCGCCAATTTGCAGATTTTTCGACCGAAATTTGC
-CTACCGGCAATTCCTGCCGACCCCTTTTTTCCGAGAAGAATTAACTTTCC
-ATTTCTAAAAAATCTGTAATTTGCCGGAGTTGAAAATTTCCGGCAAATGG
-GCATTATGCCGAAAATGAAACATTCCGGTAAATCGGCAAATTGCCGAAAA
-TGAAAAATTCCGGCAAATCGGCAATTTGCCGAAGTTGATAATTTCCGCCA
-AATCGGGAATTTGCCGAAATTGAAAATTTCGTATAAATCGCCGATTTGCC
-GGAGTTGAAAAATTCTGGCAAATTTGCAAATCGGCAATTTGCCAAAGTTG
-AAAAATTCCCGGCAAATCGCCAATTTTTTGCCTGTTGTGCATATTATTTT
-CACGACTAAAAATCGTAATAAATTAAATTAAATTAAATTTGCCGATTTTT
-CGACCGAAATTTGCCTACCGGCAATTCCTGCCGACTCCTTTTTGCCGAGA
-AGAATTAAAATTTCCATTTCTAAAAAATCTGTAATTTGCCGGAGTTGAAA
-ATTTCTGGCAAATTTGCAAATCGGTACTTTGCCGGAGTTGAAAAATTCTG
-GAAACCGGCAACCCGGCAAACCGCCAATTTGCCGATTTTTCGACCGAAAT
-TTTTTTTTCCTGTCGACCCCTTTTTCCGAGAACAGTTAAATTTCCAAAAT
-TCTCTAAAAACCACAAACTTCTCAATAATAAAATTCGCACACTCCTGTCG
-CTTCCCCTCATCATTCCACTCAATCCGCACAGTTTCTCGAGTACAGTACT
-CCAAAAACTTGTCCAAATAAACTTGGAGCATTTGAGCCCGTTCTTTCGAA
-GTCTGCGACGCCGACGCTGTCGACTTAATCGGCCCATTCCTCAGTCGTTC
-ACACCAATCACCGGCTCCCGACGATTGACAGTACTCGTTGAGCACATCTT
-CCGCATTTTCACCACTGGTAAGCGGGAAGAATGGTAGAAGACACTGAAAG
-ACACGATCCAGGTCTGGTGTCGCTTTTCCGTACACTCCGAGACATTGATA
-GAACACTAGGAACAAGCGAATCGCAATTTTTCGCACTGCCATCAAATTTT
-TCGGGTAGACTGCTTTTTTGAGAAGCGATTCGATTGCATGACGTTGCCAG
-CCTGAGAGAAATTGGGAAAATTTTTAATTTTTATTTAAAGGTGGGGTAGC
-GCTAGTGGGGAAATTGCTTTAAAACATGCCTATGGTACCACAATGACCGA
-ATATCATGATATAACAATTCAAAAAAATTTTCTAAATTTTATATGATTTT
-TTGAAAATTGAAAAAATCTCAGTTTTTGTCTAATTCCAATTTGAATTACC
-GCCAATTGAATTTGTTCTATGGAGCGCGCTTGCACGTTTTTAAATTTATC
-TATTTTATTTTTTGTTATTTTTTGTTATTTTTCCACCAATTTTTAATGTT
-TTCGGTGTATTTTTGCTCGAATTTTAGAGAAAAAGTCAAAATAAATGCAA
-ATTTTCGATTAAAAAGCACGCTTACAGTCGTAAATCAGTGAAATTAATTA
-ATTCAGGTTTGAAATCGTTTAAAATCGTTACTTTGTCATTTTTACGCCTG
-TAAGCGTGCTTTTTAATTGAAAATTTGCATTTATCTTGACTTTTTCTCTA
-AAATTCGAGCAAAAATACACCGAAAACATTAAAACTCGGTGGAAAAAACA
-ACAAAAAATAAAATAAAATAAATTAAAAAACGTGCAAGCGCGCTCCATCG
-AACAAATTCAGTTGGCGGTAATTCCAATAGAAATTAGGGGGGAAAACTGA
-GATTTTTTCAATTTTCAAAAAATCATATAAAATCAGGAAAATTTTTTTGG
-ATTTTTTATCATGATATTGGGTCATTGTGGTACCATAGGCGTGTTTTAAA
-GCAATTTCCCCACTGGCGCTACTCCACCTTTAATTTCTGACGGTTTTTTT
-TCGGTTTTCCTTGAAAAATCCTCTAAAAATCGATAATTTGTAAAAATTGC
-GTTGTTTTTCCGGGATTTTTTTCGGTTTTCCCACGGGGTTCTGGCCTTCC
-TCACTGAATTTTTCGCGCTCCATTGACAATCGCCCGTGTACTCCACACGG
-ACAAATCACATTTAGTTTTACAACTAAAATCGAGCCGAGACGCGGCAGCC
-AACGCGCCGTAAATCTACCCCAGATATGGCCTGGCCTAGTTCGGCGAAAA
-CTCTTCCATTTCAATGTATGAGGGAAGCCAGAAATCCGTGTTTTCCTCAA
-AAAAATCCTCTAAAAATCGATAGTTTGTAAAAATTGCGTTGTTTCTTCGG
-TTTTTTTTGCAATTTGAGGGTTTTTTGTCGATTTAACACGGATTTTTGGC
-TTCCCTCATATATTGAAATGGAAGAGTTTCTGCCGAACTAGGCCAGGCCA
-TAACTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTCGATTT
-TAGTTGTAAAACTAAATGGACTTTGTCCGTGTGGAGTACACGGGCGATTG
-TCAATGGAGCGCGAAAAATGCAATGAGGAAGGCCAGAAGCCCGTGCGGAA
-AGACGGGGAATCTCCGAAAAACGGGGAAAATCTACAAAAAAATGAGTTTA
-AAAAAGACTTCCTCAAAAAAATTCAAAAATTGTGGTTTTTTTTTTAATTT
-TTTGTATTTTGATAAATTTTTTGCGACATCAAAAAATGGAAGAACTTTTT
-TTTTTCGATTTTTGAATTTTTTGTTGGTGAAAAAGAAGAAAATTTCGAAA
-ATTCGTTAGGGAATGGATAAATTTTAATCAAAAATCGATTTTTTAAAATT
-ATTTTTTGCAGTTTTGCATAAAAAATCCAGATTTTTTCGCATTTCGCGCG
-TAATTTTCATTTTTGTCGTTTTTTTTTTCTGAATTTTCCGAAATTTCTGG
-AAATTTTTTCTTTTCTTGTTCTGAAGCTTATGCCTAAGCCTAAGCCTAAG
-CCTGAGCCTAAACTCCAAAAACGCACCACTTCCAACAAGCTCCGGAGCCA
-AACAGAGCACCTGCTCCAGTGTCCAAAGCCCGGATTCAGCCTCAATTGCA
-CTATCGATTTGACTGCTGACATCGTTGACGAGCAGAAGCTCGTCAACGAG
-ATGAAACGTCTCGAAACTGTGCTCATCGAGCAGTTGACGCTTTTCCTGAA
-GAAATGTTGTGGTCGAATTAATGCGAAATATGGGAAAATTCGGGTTAAAA
-TCGATGAAAAATCGTGGAAAAACGAACATTTGTGGTTAATGTGTCGAGCA
-GAATCTTCAAATGTTTCACACGGCTCACACAATCCCTGTTCAAGTCGGTG
-AATCTTGAAATGCTCGCCTGCACATCTGACGATTTGCCCTTTCGGGCAAA
-CATTTTCCTGTGATTTTAGGCGATTTTCTGCAAATTTTCGCTGTTCAAAC
-GTTTAAAATCGACGGAAAATGCGTATATTTTACTAAATATGCGAGAAATA
-GTGATTTAATTCGAAAAAATCAATATAAAAATGGAAAAAAACTACAGTAG
-TAATTTAAAGGCGCATACCTCGAAAGTTAAAATCGTGCCAGGACCCGCCG
-CAATTTAGAATCGATTTTTAGATGAAAACTTTTTTTTTCTTACTAAAAAT
-TAAAATTTTTCACTGAAAATTTCGGTTAAACTCTGACTTTTAACACGAAT
-CTTATCAAAACTATGACAATTTCTAGTGAAAATCGCCAATTTTGTGTGTA
-AAATCAATTTTTTCAGTGAAAAATGTTTTTTTTTGAGTTAAAACTAAATT
-TCGAGCTTGAAACTAGAAAATGTCAAGTAAAAAATTCATTTTTAAGCGAA
-AAATTAACGTTTTTTTCCAAATTTTCGCCTATAATTCACACAAAAAATAC
-TGAGTCAGCAAACAATGTGGGAGCATCCCGAAAATGGTGCAGAATGGTAG
-AGCAAAAACGAAAAATCGATGAATTATTGTGGAGAGAGAGGAAATTTTAT
-TCAATTTTTGAGGAATGGAGGTTAAAAAAAAGAGTAGAAACATTGAAAAG
-TGGCAAAGAAATCCAGCTTGAAACCGGAAAAACTCCCAGAAAACGAAGCA
-AATAAGAAAATCCCACAAAAAATCCGAATTTAATTGCAGTTTTCGACCGA
-AATTCAGCCAACCAGTGAGTGGTTCAATTATTAAAAAGCACATATATACA
-TATAACTTTATTCAAAGGACATAATCCATATAAAGTCTGTCAAAACGGAA
-AAGGTTCTTTCCAAACACACAATTGGCCCCCTCTGTCCAAAAGAGAGAGC
-ATGGGAATCGGAGAGGGCGGTGAGAGAGACGCAGACATCGAGATGACACT
-TTTTGACAGCAACACTGTGTGTGTGTGTGTGTGTGTGTGAGTCTCTGTGA
-TTGAGTGAAAGCACTTTTGGGAATATATACTGGTAGAAATTTAATTTAAA
-ATGATAAAAAATTTCTTGGGATTTTTTTTTTTGAGTACTGTAGCCACAAA
-AGTACGTAATTTTCTTGAAAATGCGCCCATGGGGTCCCAATGACGTAATA
-TCATGATAAAAAATTTTTGAAAATTGGAAAAATCTCAGTTTCCCCTCCCC
-CCCCCCCCTAATTCCAATTTGAATTTCCGCCAATTGAATTCGTTCGGCGG
-AGCGCGCTTGCATTATTTTTATTAATTTATTTAATTTTCTCTGTTGTTAT
-TTCACTGATTTTCTTCATTTTTTGGGGATTTTTAATTGGGAAAAGAGAGA
-AAAATGCAAGATAAATGCAAATTGTTCATTAAAAAATCACTGAAAATGGG
-TAAAACTGTGAAATATGCTAATTTCAGGCTTGGTGTCGTCGGAACTCATA
-ATTTCGCAGTTTTACCCATTGTCTATGATTTTTTAATGAACATTCTGCAT
-TTATCTTTTTTTTTTAAATTCAATTTCTATTAAAAATCCCCAAAAAATGA
-AGAAAATCAGTGAAATAATTAGAAAAAATAAAATAAATTTATAAAAATAA
-TGCAAGTGCGCTCCACCGAACGAATCCAATTGGCGGGAGTTCAAATAGGA
-ATTAGAGGGAAAACTGAGATTTTTTTCAATTTTCAAAACAAAAAATCATA
-AAAAATAAGCATTTTAGCTTAAAAACTCGAAAAATCATACAAAAATTAAT
-TTCAAGTTGTCCACGAGTAGTACGCGACGCCTGGTTGCAAAAATGGCGTA
-GATTTCGATTATTAAAAGCTTAAAAATCATTTTTTTTTACCAATTTCCAA
-TTAAATATCCTAATTTTAATCTCAATTTTCTTGAAAGACGTGCAAATATA
-GATACATCTAACATAAAAATTCTTCGCTGCGAGACCCAGGACCCCATAAA
-TCGCCTGCGCCTTTAAATTTATATTTATTTTCTCTCTCAAACAGCGATGA
-AAATCACGTTTTTGAACCAAATTTTCCAAAAAATAAGACAAATTTCTATT
-TTAAAAACCACTTTATTCGGTCATTGGTCGCTAAATAGCAAATTTTGAGG
-CAAAAAAAAAACGAACAGACAACGGAAAATCGAGTGAAAACAAGTGAGAA
-CACAGCAAAACTAGTCCTAATTAATTAAAGGCGCATCACGTGGAAAAGAA
-AACTGTTGTGGAAGAATAAAAAATGGAACATGAGGGGAAATATTACAAAA
-ATAGTAAAAGATGCATCAAGATTAAGATTATTTTTCGAAAATCGAGTCCT
-CCGCCCAGGAATTCATCATAATTTTCGACTTTTTTTCGGAGATTGCTGCA
-CATTGTCGGCTGCTCCGGTGGTTTTTGGAAGGTTTTGAGAGCTGAAAGAT
-TTGAATTTTTTGGAATTTCGAGAAATTTCTTTTTTTTTACCCGAAGCGCT
-TTGAATCTGGCGAGCTGCATTTCCAGCTTGCATTGTGCGTTCAGTGACTT
-TGATTCCTTGAAGTTTTCTGAAAAAAAAACACGAGTTTTGACTTGAATTT
-TCTGAATTTTTAACACGGATTTCTGGTTTCCCTCAAAGAATTGAAATGGA
-AGAGTTTTTGCCGAACTAGGCCAGGCCATATCTGGGGTAGATTTACGGCG
-CGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAATGTGAT
-TTGTCCGTGTGGAGTACACGACTTTCCCACGCGTTGTCCGGCAGGCGATT
-GTCAATGGAGCGCGAAAAATTCAATGAGGAAGGCCAGAACTCCGTGATTT
-TTCTTTTACTCGGCGTAGATTTCGCAGTTTCAGACTGTTTTTCAGGTCTA
-ATCAGCGGAATTTTCGTTGATCCCGCCAATCTCGGTGATTTTCTGAGCCT
-TTTTCGCTCAGGTTCTGGGATTTCAGCTTTTAGAGCAATCTTTGAAATTT
-CGACAAGTTTCTTGAAGTCCAACGCAATTTTTTCAGTAGAATTCGCAGTT
-TCCGGCAATTTTTCTGAGCAAATCTTCGAAATTTCGACAAGTTTTCTGAT
-TTTCGGCGTAGATTTCGCAAATTCTGACGGTTTTTCTGCAAATCCCGGTG
-ATTTTCGGCTCGGGGAGCTCCCAGCTGCTCTATTGTTCAGCATTGTCTGC
-TCAGTAGCGGGGGCGTCTTGATTTTCAGTAGAATTCGCAGTTTTCGGCAA
-TTTTTCTGAGCAAATCTTCGAAATTTTGACAAGTTTTCTGATTTTCGGCG
-TAGATTTCGCAATTTCTGACGGTTTTTCTGCAAATCTCGGTGATTTTGGG
-CTCGGGGAGCTTCCAGCTGCTCTATTGTTCAGAATTGTCTGCTCAGTAGC
-GGGGGCGTCTTGATTTTCAGTAGAATTCGCAGTTTCCGGCAATTTTTCTG
-AGCTAATCTTTGGAATTTCGACAGGTTTTCTGACTTTTGGCGTAGATTTT
-GCAGTTTCTGGTGATTTTCGGCACGATGAGCTCCCAGCTTCTTCATTATT
-CAGCCTTTTCAGCTGGGCTTCTTGAGAGCCTGTAATCACGTCGCCGTCGT
-CATCCTCTGAATCATCATCCGACCAAATTTCGATTATTTCCTGAAAAAAT
-CGATTTTTTTTGCTTTTTTTTGCTCTTTTCTCATTGTCAGCTTTTCCCAC
-TTTCCAGCAATTTCTCCACGGCGTCGGAACGTATCCTGGTCGCCGATCGA
-ACTGGATAACTGGCCGGCTGGCGATAAATCGGCGAAGATCTGCTACTATC
-TCGTCTGAAAACGTTTTTCTGCTAAAACCTGCTAAAAATCTGGCTAAAAT
-CACCTGATAACATTACAATATCATCATTTCCGGGCATTTTTGACGAAAAA
-AAAGCGGAAAATATTTAGAATTTCGAAAATGAAGAGAAGCGTTACGGTAC
-TAAAGGCACATGGCGTAAAATATTCCGCAGGACTCGCCGCGATTTATGAT
-TTTCACTATTTTTTTTGGGCAAAAGTTGACATTTTTCAGAATAAAATTCA
-AAATTGTGTTGATAAATTGTTTATTTGATTTTTTTTTCAAATTTAAATAA
-ACTGTAAATTTTAAATTTTCCCCCAAATATTCGCAAATTCCCTTCAAACC
-AAGTTTTAATAGCACAGTAATCCCCGAGCAATCGCGCTCCACCGGACTAA
-CCTACACACCGCGAATTTTGAATTACATCCCTCATAATTAATTGTTTTTG
-CCATTTTTTCGCTATTTCCAGTGGATTTTAATGAGTAAAAGCCTACAAAC
-CGACGAAAATGGCGGTGTCAGTGAAAGTCCATCAAATTGCACATATTGCT
-ACACGCTGGAATGCTCTCTACGCATCGAATCCACCTCATCAATCAAGAAA
-AAGACTCCAATCTCCTCGAAAAGCGCTATAATGACTGTCGGCAGAAATGC
-GCAGAGGTTTTAGTCGAATAAATGCCTGTTTTAAGAGCAAGAAATTCCAG
-AAAAATTCACCTTCAAATCGAGCTAAAGACCACCGCTACCGGACAGCCCG
-CTGTAGTGTGCTATGACGTCACAGATGCAGTTGTACACTTGCAAAGCGTT
-GCAAATGGGAAGTGTACTGTAGAAATTCCTTCGCTGTAAGACCTAAAAGA
-CCAGAAAAATGGAAAATATCTGAAAACCCCAATTTCAGCTCGTTAATGTT
-CCAAATGTTCAATTGCGCGCCGCGAAAGCTCAACGTCTTCATGAAATCTC
-TCCAAGCAAAGTTGGATATTATGAAAATGGAGAAAAGCCCAATTTCAGCA
-GTGTAAAATCGATAAATTATCGAAAAATCAATAAAAATCCCTTCAGACCC
-CGGCAATTCTCACGTCCGCCGGCAGTTTTCAGCGTTCTGAGCCCGCTGAC
-GATCAGCGAAATGCGAAAAGTGAAGAAGCTACGCGAACCGTCGGCGCTGG
-CGAGACCTTCGAAAGAGGCGACCACACCGAAGCGGCGGTAATTTGAAATT
-TTCACATTAAAAAAAAATCGCGAATTTCAGCACTTCCTCAATGAATTTGC
-TCGCCGGCGGCTTGGAAAATCGAATTATGAATCGATCGATTGGGCTGAAA
-AGGACGACCAGTTTTGCTAGAGATGATCGTGAAAAAGCCGAGGTTCTGCA
-GCTAAAAATCCGTCAAAAATCGATAAAATTTCGTTTTTTTTCCGTGAAAT
-TCCAGGTTTTTTAGTCCAAAAGCACGGATTTCTGGCTTCCCTCATAAATT
-GTAATGGAAGAGTTTTTGCCGAACTAGGCCAGGCCATATCTGGGGTAGAT
-TTACCGCGCGTTGCGGCTCGATTTTAGTTGTAAAACTAAATGTATTTGTC
-CGTGTGAAGTACACCACTTTCCCATTGCCCGGCGGGTGATTGTCAATGGA
-GCGCGAAAAATGCAATTAGGAAGCCCAGAAACCCGTGAAAAAGTGTCACG
-CGGTTTTCAAAGTAGAGGTGCAAGCGCGCTCCACCGCTCCACGGTGCTTG
-GCGGCAAAACCAGAATTTTCGCTGATTTCAAGCATTTTCCGTCGTTTTTC
-ATGATTTTTCATGTCGAAATAGTGTTTAAAAATGTCTTTAATGCTGAAAA
-GTGAATATTTCAAAAATTTTGACATGAAAAACTGAAAAAATTATCGGAAA
-AGTGTATTTTTTGAGTTTTTACTTATTTTTCGGTTTTTAAAAAAATTATT
-TCTACATAAAAATTGATGAAAACAGCATATGAAGTGCAAAAAATAAAGAA
-GACTTACATAAATTTTGACAAAAAATCACGAAAAACAATAAAAAAAGTCG
-AAAAATGATTGGAAACGGAGAAATTTTCCCTTTTTATGTAGAAATTTTGA
-ATTTTTTCAAAATTTTCTCAATTTTGAAACACAAAACATGAAAAATGATT
-GAAAATATTTGAATTTTTAGTTTTCGCGCCAATACCTAACGAGACCCATC
-GGTGTGACCATGGAGCGCGCTTGCATCTCGATTTTAAAATTCGTATGAAT
-TTTTCGCGCTCCATTGACAATCGCCTGCCGGACAACGCGTGGGAAAGTGT
-CGTGTACTCCACCCGGACAAATCACATTTAGTTTTACAACTAAAATCGAG
-CCGCGACGCGACACGCAACGCGCCGTAAGTCTACTGAGCCAAAATGGCCT
-AGTTCGGCAAAAACTCTTCCATTTCAATTCATGAGGGAAGCCAGAAATCC
-GTGTTTTAACCTAGAAAATCAAGAATTTTTTTGGGAAAAAATGCCAAAAA
-TCCCAGATTTTCCCTAATTTTCAGCTAATTTTTCCCCGAAACAGACAATT
-TTCAGACCCTTGTCTCCCTGAAATCATTCAAAGATGCTCCTGCAATTTCC
-GAACGGATTCAGCTGTCAGATGAGCAAAAATCGGTTGTCCGATGTGTGAT
-AAATGTAATTTTTCGTTCGAAAAAAAAAATTATCGAAAATTTGCAGTCTC
-GAACGAGTGTCTTCTTCACGGGATCCGCTGGAACCGGAAAATCTGTGATT
-CTTCGGAGAATCATTGAAATGTTGCCCGCCGGGAACACCTATATCACCGC
-AGCGACAGGTAGAGGATCACTTTGAAATATTTGCAAAAAATCGTGTCAAG
-ACCTCCCCCAAAAAATTTTCATGTACCTTTAAAAAATAGAACCGACTTTT
-TTTAATTAAAAAATCATTAAAAATTAGAGGAAAATTTGGGAAAAAAAATC
-ATTAAAAATTCTTTAAATAATAATTGTTTATTTGTCACAAGAAATAGCTA
-CACCGGAAGATAAAGAAAAAAAGTAAATAAAAAAGATGTGTGGACAAATA
-AGTAAAATGACCAATTGGACCAGCTATAGCCCGGGAGGTTAAGTTGGGGG
-GAAGAGGGTGTCAAATGGGATAGAGTCTAGGCGCGACGCAAATGCATTTG
-GAGTTAACAGTTTAGGGAAACGTTTTGCTATTCGATTCCACAACGACAAG
-TTAACATGTAGAAAACATTTAGACGGAACACCACAGACAACAAGTAGATA
-GGGGTGACGAGTAGAGCGTGAAGCTCGAACGAACGATGATAAGGACGGGA
-AGTGATACTCGCTTGAAATAATTTTATGGAAGGTTCGGAGGATTTGAAGA
-ACCCGTCTATGGTGGGTAGACAATAAATTAAATTGGGAAAGCCTACTACT
-GTATGACGAGTAAGATAAATTGCACCTTTGAAAGACACACTTTGAGAAAA
-ACCGGAGGGGAGATTCTAGTTTTTTGGCAAGTTCGGTGGAGTTGGGCGGG
-AAGAGCTCGCAGCCATATTCGAGTACGGGGCGGATGTAAACATTGAACAG
-TTTAAAATAGAATTCGGGACTTTTAGAGCGGAATGAACGAAGGATTTGGC
-GACACTTAAGGAGGGCACTATTAGAAGTCTGATTAATATGATTAACAAAT
-GATAATTTGGTATCGACAATGATTCCAAGATCTCTGATAGAATCACGCGG
-TTTAATTTCAACACTATTTACAAAGTATTTATGACGGGGGTTCTTTTTTC
-CAAAATGTAATACGGCAGTTTTGTGCTCAGCAAGATTTAGACGCCATTTT
-TTACACCAATCAGCGACAATATTGATGCTTGTTTGGATAGAGGTGGGGTC
-CGATCCGAGTAATTTTAGATCGTCGGCAAAGGCTGTAACATGGACATCAG
-GGGGGAACAAATCTAATAAGCCATTAATATACAAAAGAAAGAGGAATGGT
-AAAATTGTGGAAAAAACCGTAAAAAATCAACAAATTTCGAAAAAAAATCG
-TAAAAAATTGAGACATTTGAAAAAAAAAATCTAGCAAAATTTGAAAAAAA
-AATCGTTTAAAATTCAGCAAATTTATTTTAAAAAATCATTAAAAATTCAG
-CAAATTTGGAAAAAAAAACAAATAAATCTGTAAAATTAAAAAAAAAACCA
-GTAGAATTTGAAAAAAAATTGTTTAAAAAATTCAGCAAATTTCTAAAAAA
-AAATCATAATTAATTGATAAAAATTTTTTAAAAACGTAAAAAAATATTTA
-AAATTCTGCAAAATTTGAAAAAAATCGTTTAAAATTCAGCCAAATTTCGA
-AAAAAAAAGCATTAAAAAAGAGAAAAATTGGAAAAATTCTGCACAATTTT
-TTAAAAATTATTATTCTGAAAAAATTTAAAAATTCATGGAAAAATCTGCA
-AAATTATTTTTTAAAAATCGTTAAAAATTCAGCAAAAATTGGAAAAAAAT
-CGTTTAAAAATCAGCAAATTTCGAAAAAATAAAACATTAAAAATTCAACA
-AAATTAAAATTAGAAAATCATTAAAAAATACAGCCAAACCGTAAAAAATC
-AGCAAATTTCGAAAAAAATTCGTTAAAACTTCAGCAAACTTCTAAAAAAA
-ATCATTTAAAAATGCAGGAAATACGAAAAAGAAACATCAAAAATTGAGAC
-AATTGGAAAAAAAATTCGTTAAAAATTAACCCAAATAAATTTGCTGAATT
-TTTTAGATTTTTTTTTTTATAAATTTGCTGAATTTTTGAAAAAAATTCAG
-CAAATTTATTTTAAAAAAATCTAAAAAATTCAGCAAATTTCTTTTTTAAA
-AATCGTTAAAAATTCGGGAAAACTTGGAAAAATTGTGCAAAATTCAGAAC
-AAAAAAATTTCAAAATTTTCCCAATTTTTAAGTTTTTATTTAGTTTTCAG
-AATTGTTTAATAGTGAAAAAATCATAAAAAATTCAACAAAATTTAAAATT
-CAAAATTTTCCAGAATTTTCATGGGTCCCGCCACGATCCACTCCAACCTT
-CAAAAAATCATGTAATTTCCAGGCGTTGCGGCTTCCCAAATCGGCGGAAT
-CACACTTCACGCGTTTTGCGGTTTTCGCTACGAAAATTCGACGCCTGAAC
-AGTGCCTAAAACAGGTTTTACGCCAAAATCACATGGTCCGACAGTGGAAA
-CAATGCTCACACTTGATAATTGACGAGATTTCCATGATTGATCGCGACTT
-TTTTGAAGCTCTCGAATATGTGAGCTCATTGCGTTTTGATCTACAAAAAA
-TGCGGGAGTTTTCCCAGCATTGCTCATTTGATCTACAAAAAATGCGGGAA
-TTTTCCCAGCATTGCTCATTTGATCTACAAAAAATGCGGGAATTTTCCCA
-GCATTGCTCATTTGATCTACAAAAAATGCGGGAATTCTCCCAGCATTGCT
-CATTTGATCTACAAAAAATGCGGGAATTTTTCAAGTGTGACGTCAGCACA
-CTCATGCGAAATCTGCTGAAAAGTCTGCGTCTCTTCTCCCGCATTTTTCG
-GAGATCAAACCAAAATGGGACCCGAAAATTCCAAAAAAAAATCGATAATT
-TCCCGTCCCAGGTCGCCCGTACCGTCCGTAATAACGATAAGCCGTTCGGT
-GGAATTCAGCTCATTATCACTGGAGATTTCTTTCAATTACCGCCCGTCTC
-GAAGGATGAACCAGTTTTTTGTTTTGAGGTGTGCGGAATTTCGGAGCATC
-GTTTGGACCGTCTAACTCTTAAAAAAATTTTTTTGCAGAGCGAAGCCTGG
-AGCCGATGTATCCAAAAAACGATTGTCCTGAAAAATGTGAAACGACAAAA
-TGACAATGTTTTTGTGAAAATTTTGAATAACGTTAGAGTTGGAAAGTACG
-TAAACTACTGGAAAAATTTAAAAATTTCGAATTTTTCAGGGTTTTTTACT
-AGAAATTTTGATTTTTTTCAGTGAAATTCCAATAAAAGCTGGAAATTTTC
-AGAAAAAAGGAAAAAATATGAAAATTTGTAATTAATTTCGAAAAATGCTG
-AAAATCTCCAAAACCTTCCAGAAAAGCTGGAAATTTCATAAAAATTTGGG
-AAAATCTGAAATTTTCAGAAAATTCAAAAAAAGCAAAAAATCTCGAAAAC
-CTTCCAGAGAAGCTGGAAAATTTCAGAAATTTCCAAAAAAATAAATTCTG
-AAAATTTCATAAAAATCACTGATTTCTGTCTTCCCTCATAAGTTGAAATG
-GAAGAGTTTTTGCCGAACTAGGCCATTTTGGTTCGGCCAGATCTTGGGTA
-GATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAA
-TTAAATGTATTAGTCCGTGTGGAGTACACGACACTTTCCCACGTGTTGTC
-CGGCAGGTGATTGTCAATGGAGCGCGAAAAATTCAACGAGGAAGGCCAGA
-ACCCCGTGATAGACCGGCCAACACGGGGTTCTGGCCTTCCTCATTTCATT
-TTTCGCGCTCCATTGACAATCACCTGCCGGACAACACGTGGGAAAGTGTC
-GTGTACTCCACACGGACAAATACATTTAGTTTTACAACTACTAATTGAGC
-CGCGACGCGACACGCAACGCGCCGTAAATCTACCCCAGAAATGGCCGAGC
-CAAAATGGCCTAGTTCGGCAAAAACTCTTCCATTTCAATTTATGAGGGAA
-GCCAGAAATCCGTGTGAAATTTCCAAAAAGAAGCTCCAAAAAAAAATTCC
-AAAAAAATCTCGATAGCCTTCCAGAAACGCTGGAAATTTCAGAAAATCTC
-CTGAAATTGATAAAAATTCGAAAAAAATCTCAAAATTGTTAGAAAATCAG
-TGAAAATTTGGAAAATTCAGAAATTAAAAAAAAAATTTTTTTTTGGAATT
-TAGAATTTAGAATTCTTCAAATTGTCGAAAAATGCTCCAGAAAACTTGTA
-AAAATTTAATTTTTTTTTTTTTGAAATTTCCAAAAAATTTATTTATTTTT
-CAGATGCGACTTCAAATCAGCGGATATTCTAAAGGAATCCTCGAAAAATC
-AATTCCCATCCAGCGTAATTCCAACCAAACTGTGCACACATTCAGATGAC
-GCCGATCGAATTAACAGCTCAAGCATCGAGACAACACAAGGCGACGCGAA
-AACCTTCCACGCCTACGATGACGAGAGTTTTGACACGCACGCCAAGGCCC
-GAACGTTGGCACAGAAGAAGCTTGTGCTGAAAGTTGGAGCTCAGGTGATG
-CTCATCAAGAATATCGATGTGATCAAGGGACTTTGTAATGGGTCACGTGG
-ATTTGTGGAGAAATTCTCTGAAAACGGGAATCCTATGATTCGATTTGTAT
-CGCAAGCCGATGCTTCCATTGAGGCACGTTTTACAGAAATGACCATTTTA
-TGGGCGTGGCTTTTTTTTTGGAAAATTTTTTTTTTCCAAAATTTCTGGAT
-TTTTCTCTAAAATGGAAAAAACCCACGAAAATTGTAAAAAATTTGAAATT
-TTTTAAATCGGAAAAAAATAAAATTTTCTTTCTTAAAATTAGGCTTAGGC
-TTAAGCTTAGGCCTGGGCTTAGTCTTAGGTTTATGCTTAAATTTGAAAAA
-AAAAATTTCTAATTTTTTCCAGATTTTTCCGTTTTTTTTTTCAGAGAAAA
-TCTAAAATTTTCGATTTCTACCTGTTTTTCAAAAAAAGTTAAAAAAAACA
-TTTTCGCAAATTTTGTAGAAATTTTTCTTTTTTTTTTCTTAAAATTAGGC
-TTAGGCTTAGGCTTATGCTTAGGCTTAGGCTTAGGCTTATTCGTAGGACT
-ATGCTTTGGCTTAGACTTAGACTTAAGCCTAAGCCTAAGCCTAACCCTCT
-TAAAAAGTTACAAGAAGGTTTTTCCTTGCGCTTGGAGCGCAAAAGAAAAG
-AAAAAGAGCTATTCAGACTTAGGGTGCCCAACTGGAATAAAACATTGGAA
-ATCCTTATGACACACTTAAGCCTAAAGGCCCGAAAAACATACTAGGATGC
-CCAACTGGAATAAAATATTGGAAATCCTTATGACACACCGGCGGTATGGC
-GCGGCTTAAGCCTAAATAGCCACTTTTATCAAAATACATTTGAGCTCGTC
-TTGCGTTTTACTTTGACTTCTCAGGCAACTCAAAAGTAATCTGTGGATAT
-TTTTCAGTAATCTAAATGAAGACTATAGATTACTAAGAAACTTGGAGATT
-TCATAATATTTGGGGGGATGCGAGCATCCATTGGAGATTTGCCATTTGAT
-AGAACTTTTAGCGGCAAAAGTCCAAAACAAAGCTCACAGTGGGCTCTCAA
-AGATCATAAAATAGCACTGTAACGAAGAACTTTAACGATCTAACGAAGCA
-ATTTTACAAATTCACTTTGGTAGCTCATATCTCCGTGGATAAAATTTTTA
-CAGAAAAGTCATCAACTGATAAGTTGTTGATATTGTTGTAAAGAACAAGT
-TTGTAGTTGAAAGTTTTTTTTACCAAAAAATTTTTGTTTGAGAGAAAAGC
-ATTAGAAACGGAATAGCATCATAAAAATAACAACAGCAGTTGCCGCACTT
-CACGCGGTTCTATCTCAAACAAAAGCGGAGATATGAGCTACCAAAGTGAA
-ATTGGAAAATTGGCCCTCCAATGCTTCGTTAAAGTGCTATTTTCAGGATC
-TTTGAGAGCCCGCCGTGAGCTTGGTTCTGGAGTTATATTGATCAAATTGA
-CCCTCCAGTAAAGGAGGACCTTTGATGAATATAATCACTCTGATGGTATT
-TAATTCCGATGAGTAATCCATTTTTCTTTTTCTCACATTTGTGAACCAAA
-AATAAGTTTTAAATTAAGGCGGGATATTCTAAGGTGTGATAACATATGTT
-ATTTATTTTTAAATTTAAATAAAGTTTTTTTTTAATTTTTGCTAAAAAAC
-GAATAGTTTACAACCGCCTCGCTCAAATGTATTTTGATAAAAGTGGCTAT
-TTAGGCTTAAGCCGCGCCATACCGCCGGTGTGTCATAAGGATTTCCAATA
-TTTTATTCCAGTTGGGCATCCTAGTATGTTTTTCGGGCCTTTAGGCTTAA
-GTGTGTCATAAGGATTTCCAATATTTTATTCCAGTTGGGCATCCTAGTTT
-TTTTTTTTCGGGCCCTTAGGCTTAAGTGTGTCATAAGGATTTCCAATGTT
-TTATTCCAGTTGGGCACCCTAAGTCTAAATAGCTCTTTTTCTTTTCTTTT
-GCGCTCCAAGCGCAAGGAAAAACCTTCATGTAACTTTTTAAGAGGGTTTC
-ATATATTTTATTAAAATCGGGGCGAAGCCCTGATTTTAAATCCATATTGT
-TTTTGTTTTTGTCTTCCACTATCCCTGCAAATAGGAAAGAGAATGTGTTC
-TTTCTGATGAAGTAAAAATCATCATAAAATCTTGAAAACTGAGAGCAGGA
-GGTAATATTTGAATATATTGGGTTGTAAATGTGTGTCTCCCTGTGGGTGG
-GGTGGCGATGTGTTGGCAGCCAATCCTTCAACGAACTGTATCTCCCGCCT
-GTATCTCCCTTCAAAGTGAGAATTGGGTTACAAAAATTTGAGGGAATATG
-AAAAAAGGTGTGAGGATTTCAAAAATATTATTGTTGAAACACCAGACCAA
-ACCACTTTTTCTGGGCAAGAGACAGAAAATTAATTTTTTGAAAAATTTCA
-AACTGGCACAAAATTTTTTCAAAAACAAATTTTCACAAATTGTTAAAAGA
-TGCCATTTTTAATCAATATTGTTCATTGAACACAGAAAAGAAAACGAAGA
-TTCATCAAAAAATGAGTGAAAAATCGCAAAAATTCGAAAAAATCCGTGCT
-GAAAAACTCGAGTTTTTGGCGGTGCTGAAAAAAATTTTCACTAAAATTTT
-TTTGAAACTTAGTTTTTCGGATTTAGCGTCAAATTTTGAATCTATATAAA
-AAAAAAAATTAAAATTGATCTCAGATTGAGTGAATAATAAACGCTCAAAG
-TTGAAAAATGAACAACGCAAAAACGGCAGTAACTTGCTTCAAGGTCGGTT
-GTCTCAGTGAGTTTTCACTCAATTTTCGAAATTTTTTTGCTCTATCGCTT
-TAGAAATATTTGTAATTTCATTTTTTTTCCTCAAAATCAAAATATCTCAA
-ACGACCGCCATCCTACGAGAAGGGAAAAAAAAAGTTTTTGGAAAAAAAAT
-CAAAAATTTTTTTTCTGCCTCGATTTTCAAAATGAAAAAATCACTTTTTC
-GGAATAAACTTTTTCACAAATGTATTTTGATAAAAGTGGCTATTTAGGCT
-TAAGCCGCGCCATACCGCCGGTGTGTCATAAGGATTTCCAATATTTTATT
-CCAGTTGGGCATCCTAGTATGTTTTTCGGGCCTTTAGGCTTAAGTGTGTC
-ATAAGGATTTCCAATATTTTATTCCAGTTGGGCATCCTAGTTTTTTTTTC
-GGGCCCTTAGGCTTAAGTGTGTCATAAGGATTTCCAATGTTTTATTCCAG
-TTGGGCACCCTAAGTCTGAATAGCTCTTTTTCTTTTCTTTTGCGCTCCAA
-GCGCAAGGAAAAACCTTCTTGTAACTTTTTAAGAGGGTTAGGCTTATGCT
-TAAGCTTAGGGTTAGGGTTAGGGTTAGGCGTAGGCGTAGGCTTAGGTTTA
-GGCTTCGGCTTCAGGAATATTTAAAAAAAAAATCGAAAAATAGATTTTGC
-GAAAAAAAATCGTGATAAAGCCTGCTAAAATTTTCAAAAAAATTAAATTT
-TTCAAATTTTTCAAATTCCCAAGATTTTGGTCTCGCAGCGAAAACATCCA
-ACTACAGTAACCCTCGCCCTCTCCAATTTTCAGATCCGCCGCTCCAAGTT
-CTCAGTCCGCATTCCCGGGAGTGATGCTCCGTTGATTCGCCGTCAACTCC
-CACTCCAACTCGCCTGGGCCATCTCCATTCACAAATCGCAGGGAATGACG
-CTCGACTGTGCGGAAATTTCGTTGGAGCGCGTTTTCGCCGACGGACAGGC
-GTATGTGGCGTTGTCGCGCGCACGATCACTGGCGGCAATTCGAATTATCG
-GCTTCGACGCGTCGTGTGTCCGAGCGAATTCAAAGGTGAACAGGGGATTT
-TCGAGATGGAAATCTATGAAAAATGGATGGATGGTGTTAGATATCTCCTT
-TTCGTGGGTTCTCTCACGTGGTGTCAGAGTGCCTCATTTCGGCTTGATCT
-ACTGTGTAGATCTACAAAAAATGCGGGAGATGAGGAGACTCAGACTTCTC
-AACTGGTTTCGCATGGTTTAGAACGTGCTGACGTCACTTTTCTCTGGGCA
-TAAAATTCCCGCATTTTTTGTAGATCAACCGGTAAGGGATCTCTCAGCTA
-CGTGGAAAATTATCGATTTTTTATCGAATTTTTTGCAGGTTATCGATTTT
-TACAAATCCATCGAGGCAGAATGCGACGACGAACAGGACTGGGAAGCCCC
-TGCTGCTGGACCAAGGCTCAAGCGAGTTCGATCGATTTAATTTTTTTTTT
-TAAATTTTTTTGTGATCTCCAAATGTTCTGTCTTTCTGTCTTCCCCCCCC
-CCCCGCCAAAATTCATTAACTGTTTTATTTCACAACACTCTGTATCATCA
-TAATTTTCACATAAAATTGGCTATTTCAATGTTGACGTCGAATTTTTAGT
-CCTATCAGCGTCATCGGATCTGAAAAAATGGAAAACTTGAACAAAAAAGC
-AGGGGGTGGCCTAGAAAGCACAAAAAAAACTCGGACACAGTTCAACGGAG
-GCAGTTTTTGGAAAAAAAAAAACGTCATTTTCGTATAGCCACACTGAAAT
-TGAAAGAATTCTGGCCGAGTTTTCCAAATTCTAGGCCACCATGCAAACCG
-ACATTTTGGGCGGAAAAGTGCCGGTGGCCGTGGAAGAAGGAAAAACTCGG
-CCACTCTTCTATGTACTCCTCTCGGAGAATTGTGTTTTCCATGGCCGAGT
-TTTTGTGTTTTCTAGGTCATGTCGGCATTTTTCTTAGTCAGTTTCAAAGG
-AAATACGATACCTGGTCTCGACGCGAAAATTTTTTAATTAAATCCAAAAA
-GACGTGCGCCTTTAAAAAGTACTGTAATTCCAAACTTTCGTTGTTGGGAA
-ATTTTTATCGATTTTTCGTAGTTTTCAAAAAAAATAATCAAATGTACACA
-GGGTTCTGTTCTTCCTTATTGATTTTTTCGCGCTCCATTGACAATCGCCC
-GCAGGATAACGCGTGGGAAAGTCGTGTACTCCACACGGACATCGAGACGC
-GACGCGACACGCAACGCGCCGTGAATCTACCCCAAATATGGCCGAGCCAA
-AATGGCCTAGTTCGGCAAACTCTTCCATTTCGATTTATGAGGGAAACCAG
-AAATCCGTGAGTAGTGAGAAAAACAACGAAAAAATCGATAAAATTTCCCA
-ACAACGAAAGTTTGAGATTACAGTAGTCTTTAAAGGCGCACACTTTTTCG
-CATTTAACATAAATTTGTCGTGGAGAGAGTATTTTTGGCGCAAAACTTCG
-CATTCGGGTAATGATAATAGAAGAATTGAAACTCACAAATTCTCCGCCGT
-CTCCTCAAGCAGCAGCGGCACAATAAACATGAAATACACGGCCAACACGA
-AATGAATCGGCACCATCGACACAATGAACAACGACATTCGGAGCATGTGC
-TCCAAAACTGTCGGCCGCAACTTTTTCGACGGATTCTCAAAGACGAGATA
-CACTTGCATCGGGCTGTGCACATCTTGAACCGACTTCTTCTTCATTACAG
-CGCTCCCTTCTCTGGGCAGCAGGTAGCGTGTCCACGTGGTGTAGGGTGAC
-TCAGTGGTTGTGTGATTTATCGGCGTGAGCTGGAGCATTTTTGCAGAGTC
-GCAGGCCAAGGTAGCGGAGGTGTTGGCTCTGAAAGTAGATTTCATACAGG
-ATGGTAATTTCGGGGAGTACTGTAGTGGTGTTATAGTGGTACTGTAGGAG
-TACACTGTAGGGGAACTGTAGGGGTGCTGTAGCAGTACTGAGGGGGGTAC
-TGTAGGAGTACTGTAAGGGTGCTGTGGGGGTACTGTAGGAGTAATGTGGG
-GGTACTGTAGGAGTACTGTAGGAGCACTGTAGGGGAACTGTAAGGATACT
-GTAGGAGTAATGTAGATGTACTGTAAGGGTACTGTAGGGGTGCGCTAGTG
-ATACTGTAGGGATCATGTAGGAGTACTGTAGAAGTCCTGTAAGGGTACTG
-TAAGGGTACTGTAGAGGTGCGCTAGTTGTACTGTAAGGGTACTGTAGGGG
-TACTGTAGGTGTACTGTAGGAGTAAAGTAGATTAACTGTAAGGGTACTAT
-AGGGGTACGCTAGTGGTACTGTAGGAGCACTGTAGGCGTACTGTAAGGGT
-ACTGTAGATGTACTGAAGTAGTTCTGTAAAAGGTACTGTAGGGGTACTGT
-AAGAGCACTCTAGGGGCATTGTAGGGGTACTGTAGGTGTACTGTAAGGCT
-ACTGTAGATGTACTGTAAGGGTACTGTAGTTGTTCTGTAAAGGGTACTGT
-TGGGGTACTGTAGGTTTACTGTAAGGGTACTGCAGGGGTGCTGTAGGGAT
-ACTGTAGGAGTACTGTAGTGGTTCTATAGGAAGACAAACTTTTTTTTGAA
-TTTACTCATCGGAGAATCTAATATTTTTCACCAAATCGATACACCATAAA
-AATTTTAGGACCCAAAGCTAAAAAAAAAAACCAACTTCTCCAATATCATC
-TCCATCAATTCCAGTTGTTCTGTGCAGTTCGCCATCCCTTCCTTCTTCAA
-TTCCTTCGCCCGATTCTCCAAATCGTCCACCATCTTCACACCCCGCCGAC
-ACGCCGTCTCCACATACCGTTCCGTACCAGCTTCCGCAATTTTCATAAGC
-TTCTCGACAGACTCGTTAAACTTGCGTGTTGGCTTGAACAAATGGGAACC
-TCGAATCGCCTCGGGAACCGGATTTCCACCTCCTTCCACCAGGAGGCTGA
-ACAGTGTCGTTTTCTGCCTGACGGCCTTAGCCAGGACGTGCCCATAGTTG
-ATCATGTAGATTTGCCCGTTTTCAGATATGTTGAATGTTTCAGCAGATGA
-GAACATTTGAAAATTATTTGATTGTGCGTGTTCATGCACCACAGTAATGA
-ATGCGAGGCGGCAAATTAAAACTCTGAAAGTTTAGATAATTGTACTTTAG
-TTGAAATCTACTTTGGTTGACAGGTGCATCGACTAGACTAAAAAAAAAAG
-CAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTA
-GGTAGGTAGGTAAGTAGGTAAAGCGAGACACGGTGCATCGATCTGACTTT
-AAAAATCTCAATCTCGTATCTTAAGCGTCTTTGGTTCTGTCAGGGAAGCA
-GGTAGGGGGGAGGTAGGTGTGATCAGGCAGAGCACCGGAGTTAATATCTG
-GTGGATTGTGGGCTGCTAATAGGTAGGTAGGCAGGTAAGCAAGCAAGCAA
-GCAGGCAGGTAGGTAGGTAGGTAGGTAGGCAGGCAGGTATCAGTTGACAA
-CTTTTTGATGAAACTAAACGGAGCCGAGTTATAAGGTGCCAAAGTTGCAC
-TAGACATGGTGCATCGACCTAACTTGAACAACTCGTATCTCAAGTGTCTT
-TGGTTCTATTTGGGAGGCAGGTAGGTAGGCAGGTAGGTAGGTATATCTTA
-GGTTGTTTCAAAACTATTATACATTAAAAATCAATAAAAATATTTTGCAC
-GAATTTTATCAGTTGACAACTTTTTGATAAAACTAAAAAGAGCCGAGATA
-TTGTAAGTTGCAAAAGTTGAACGAGACATGGTGCATGGAAGGTAGGTAGG
-TAGGTAGGTATTTAAGTAGGTAGGTAGGTAGGTAAGCATTCCGTATTTCT
-CTCTACTTTGACAGCTTATATCCTGGTTGTTTTGTGTTGTATCAAAAAAT
-GTTTAACAAAGATAACATAGAAAAATATTTAGCACGTAGCAAATTTAAAA
-AACTAGGTTGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGAAAG
-GCAGGCATGTAAGTAGTAGGTAGGTAAAAGTACTCACGTGGAGAACATCA
-AGCAGAAGATCGCTGAGCAAATTGAAAGTGGTACTGGAAGTTGAGCAAGT
-ATTTTGGAGTATTTTTCTGGAAAAAAATAAGTATTCAAAGTAACTAAAAT
-AAAATACCAACTCCGAAACTCAAACTTCATAATAAACAAAATCGTCAGAA
-TCCCACTGGAGAGGACTGCAAAAGTCACTGTCGTGTTGGCAGACGTCTGA
-TAAAAATCGAGGGTGTGTCCGGATGGTAGGAGAAGCACATTATCGTGATA
-CTTTGACACAAATTCCTCAATAGACGCCAACGCTTTTCCGAAAACTGGAA
-TCGAAATGTTCAAAGCATTGAGAATTATTTTCTGGTACTCTTCCACCAGG
-ATGTTGTACTCCGAGTTTAGATCCGCTGAAAAATTTAAATTTGTATTAAA
-TTGGGCAATACTCGTACTTGCCTACCTGCCTACTGGTAGGTAAGCAGCCT
-ACTTATTTTCAACTTACAAAACTCCATATACTTTGTAACGTTTTCCAATT
-TCGCAAAAATCGATTTCTCGAAATATTTGCACTTCCCCTCGACAAATGAT
-TTCTTGGCGGGAATCTTCAGGAACAGCTGAAAATTTTTTTTTCCGGTGGC
-CGAGTTTTTTCACGGCCACGACGTACCTTATTAAACATGGTGAAGTTGGC
-GTAGTCATGCAAGAACCAATTTATTCGGCGGCGTTCGTTTTCGGTGACGG
-CGAAGTCTCGTTTGAACAAGCACGGTATGTAGGACAGCTTACGGTGGAGA
-CGCTCTTTGATGGCTGGAAGTTATGACGTCATGAATAATAAGGGATGAGA
-TTTCTAGGCCACGTGTGACGTCACAGCAATCCCCGAAACCTTTTTGGATG
-GCCGAGTTTTACCGATTTCTAGGTCATCGAGCGAAACTTTTGTGATACTT
-TGGCAATGGTCATCAGGTAGACAAACAACGTGATAATTTCTAGGCCACGC
-TTGACGTCACGTGGCCGAGATTTCGCGCCAGGACCTAGAACTAGACATGG
-TGCATCGACCTAACTTAAACAACTCGTATCTCAGGTGCCAGGTAGGTAGG
-TAGGCAGTCAAGCAGATAGGTAGGTAGGCAGGTATTTTAATTTCATTTCT
-GCGGCTACAACACAATTTCTCTTCCAATCAAGGACGTAAATTTCTAGGCC
-ACACATGCAGAGTGCGGACTAATAATTAAAGTGTTTTACGACATGGCCGA
-GAAAAGAGAAACCTAGGCCATGGTAGTTAGGTGTGACGTAACGCCACTAT
-AAAACTATAAAACTCACGCATAAAACTGTGATCATTGGCGGTTTCGAGCA
-TCGTCCTTCCATAGACCGCATCCTGAGTACACTCTCGTAAATTGGCGGCC
-AAAATTGTTAGACCAAGGATACAAAATATGGGGATAATGGTGAATCCGGA
-GCGATTATCATCCAACCAATACACGATTACTTCGATAACCTCGAAGAGCA
-GCAATTTCCAGACGACGAGGAATATCAGCAGAGCTGTGATCAGGCAGAGC
-ACCGAGATTATTATCTGGCGGATTGTGGGCTGAAAATAGGTAGGTAGGTA
-GGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAAG
-TAGGTGGTAGGTAGGGAGGCAGGTATCAGCTGCCAACTTTTCGATAAATA
-TTAAACGGAGCCGAAATATAAGTTGCCAAAGTTGTACTAGACATGGTGCA
-TCGACCTTACTTAAACAACTAGGTAGGTAGGTAGGTAGGCAGGCAGCTAG
-GCAAGTAGGTAAACTCACCAAATGCCTGAAAACAATTGCAAGAACATCGG
-AATAACCCGAGCTCCTCCCGTTCAACGTCGCGACCACAAGCGCGTGCACA
-CTTTTCCGCAGCTTCTCATCATCGCGATCAGCGCAAAAATCCTCGATTAT
-CTCGAATCGATGGCTCTTTTTTGTGTGCGCCGGGTCTAATTTATAGCTGA
-TCGGCTCGGGAAACCAATCGTCACACTGCAGCTTCGCATCCTCCAAGCTG
-AAGCCGTGAGAAAACTGTGCACTGCATAGGAATAGAAGTAATTTCAGTTT
-CATTTTGTTCTGGAAGAAGGCATTTTTATGGATGGAGTTTGAAAATAATA
-ATTAAAAAAAAAACTTACAGCTGGAACTTTGTGAAATCGATAATGAAACA
-ATAAATCTAAAAAAAGCTCAAAAAATTTTTGACAAAATTTAAAACTGTAA
-CGTGTATGAAGGTCACGTGAAAACTGAAAACTCACCAAAAATGTCGAAAA
-ATAGCAAGAAACTAGGCACACGTAGACTTATGGTAGGCAGGAAGGCGTAG
-GCGTTGATCCAGGCAGGGTCACGTCTTGAAGGCAGACTGTTAGGTATAGG
-TAGGCATAGGTAGCCATGTAGGCGTAAAGGCAGGAAGGCATCTCTAGATC
-CTTTTTGTGGCAGATTGGCCGCTTTGCAGGCAGGCAGGTGTGGGTGGCCT
-AGTAGACCGAAAAACAAGCAGGTAAAGTTCCTATAGTAGTAGGTAGGCGA
-GCCAAACCTTTTTTGTAGATGATGAAGTAGGTGTAGGCCGTCTTTTGAAG
-GCAGTGAGGCAGACAAGGTTAGGTCGTCGCAAAGGTTGGCTGGAAGGTAG
-GCACGTGGGTCAGCAGATAAGCGTAGGCAGGCATAGGCAGGAAGGCATAG
-GCAGGTAGACGTAGGCAAGTAGACGTAGACAGGATAAGATTCAAATATGA
-AAATCGTGAAAAGGGGAAAATTTCTTATTCTTCGAGTGCGCGACAGTATG
-CGTAGGCAGGTAGGCGTTGGCAGGTAGGCGTAGATAGGTAGGCGTATGCA
-GGTAGGCGTAGGCAGGTAGGCGTAGTCAGGTAGATAAGCAGGTAGTCGTA
-GACCGGGTAGGCGTAGGCAGGTAGGCGCATGCAGATAGTCCTAGGCAGGT
-AGGCGTAGGTACGTATGCGTTGGCAGGTAGGTGTTGGCAGGTAGGCGCAG
-GCAGGTAGACGTAAGCAGGTAGGCGTAGGCAGGTAGGCGTAGGTAGCTAG
-GCGAAGGCACGTAGGCGTAGGTAGGCAGGCATAGGCAGGTAGGAGTAGGC
-GTAGACATGCGCACATGAAAACCTTATAAATGTTTCAACCCCATCATCAT
-CATCCCATTTTTCTCTCGATCAAAACGAAAAAATGTGCGCAAACACAAAT
-TGCATCCATTTCTCTCTCTTTTTTACTCACTTATATATCTCTCATCACTT
-TATCCCCCGTTTTTCAATCCCTTCCAAACACTTCCAAAACTCTCCAGAAC
-TCCTAGAGAGTAACACGAGAGAAAATATTTGAACTTTTGTCTCGACCAAG
-TTTTTTTTTTTGGGATTTTTTCTTTGGATTTCTACAAATTTGATGTATTT
-TTTCCATTTTTCGTGCAAAATATGGTAATGGACTAGGTTTTTGCTACGTG
-GCCTAGAAAAATCTCGGCCACCGATTCTGAGCTGTTGCAGCGGCCGCGGC
-CGAGGGTTTTTCTCTTCAATCGATACCAATCCCTCTTTTACGCAAGGAAT
-CACGTGGAGTCAGAGTGTCTCATTTCGTCTTGATCTACGTAGATCTACAA
-AAAATGCGGGAACTGATTTCGTATCGTTAAGAACATGCTGACGTCACATT
-TTTTTATCATAAAATTCCCGCATTTTTTGTAGATCAAACCGTAATGGGAC
-AGCCTGGCACCACGTGCTCTTCCAACCTTTATATTTTTTTTGACAAAATC
-TTGAGAATTTCTAGAATTTCAACGAAAATCCAATTTTATACCTAAACTTA
-AAAAAAAATTGCTAAATTGTGTTCGACTAGCAAAAAATGCACCCAGTTTT
-ACAAAAAATCTTTTTTTCTGAAAAAAAATTCAGTGGAAAATGTCTATAAT
-TTTCAGTAATTCATACTAAAAAAAATCCAATTTTTACAACAAGTTTTTGT
-GGCCGCGGCCGAGGTTTTTCCTCTTCCACGTGGTGTCAGAGTGTCTCATT
-TCGGCTTGATCTACTTAGATCTACAAAAAACGCGGAAACTGATTTCTCAT
-GGTTAAGAACGCGCTGACGTCACATTTTTTTGATCGTAAAATTCCCGCAT
-TTTTTGTAGATCAAACCGTGATGGGACAGCCTGGCATTACGTGAAAACAA
-ACAATGCAAGCGCGCTCTAATGCGAATTTATTTGCTCTACCACCAGATAA
-ATTCCACTTCTTCACAATAAACCTAAATATTTTTTGTGTCAAAATCTTGA
-GAATTCTTAGAATTCCAGAATTTCAGCGAAAACCTAATTTCCGATTTTGT
-TATTGTTCAGGGGAACAAGTGAGCCACACAGCTTCCGCTTCTGCTCCGAA
-TTCGATTCCCCTGAGGCATTTTTGTTCGAAAAAAGCCTCATTTGTCATAC
-TTGTCGGCAACTTTCTTCGAAGTTTTTGTTCTTGTTTCAAATAATTTTTC
-TTCAATACTTGTTCCTTCCGTCCCAGCAGATGTTCTTTTGCGGGGGGGGG
-GGGGGAGGGGAGAAAAAAAATAAGAGAAGAAGCAGAAACTCGACACTTTT
-GTGTCCGCATTTCTCGTAAAGTTTTCAGATTTTTGAGCTTTTCAAGCTAT
-AGCTGAACCACCTAGCAAATTTCGCCGCAGAGTTGATTTCTCCGGGAGTG
-GGCTTTCTACTGGAGACCTCACTTTTTTTGCCTTTTACTAGAGCTTTTTA
-ATTTTTTAATAATTTATTGCAGCTCTATGGATTTTCCAAAAAAAACCACC
-GAAAAGCCCGAAAAATCAAAATTTTCGTTTTTAAAACCCTAAATTCCATA
-CTCCGTCCAAAGAACACTCACATAAAAATGAAGAGATTTCGCAAAAAAAG
-TGAAATCCAATTCAATTTATTTCAATTTTGAAGAGTGCGTTCGTCAGCTT
-TTTTTTCGACAAAAAAAAAAGAAAATGTGTAGTGTAGTTTTCAACAGATT
-TATTGTTTTATTAATATAATAGAAATCAAACCTTCTTTCTGCCTACCTAC
-ATGGCTACCTACATGCCTACTTGCAAGTAGACCTGTCTATCTAGGTACTT
-ATCTCACACCTCTTTACCTACATACCTACCTTCCTACTCACCTGCCTACT
-CATGTAGACATAAGTGATCGTCAAAAAAGAAGCTGATGGATCAAAAGTTT
-TTGGAAATTTATTTCGATTTTCAGGTTTTAAAAATTGCGGAAGATGTTTA
-ATTTTTGACGATTAGTTTAGAATTTTTTTTAATTAAGAAAAAAAAATTAT
-TATTTTATTTTTAAATTACTCCAAATTTTCTTCTGATTCCGAATATCTAT
-GTGAAACTTTTTTTAATTCCTTGGTTTTATATCTAAGCTTAAAATCGCTA
-ATTTCATTTGTGCACCCAAGAGATTTCGAATTTTCACGGGGTTCTGGCCT
-TCCTCCTTGAATTTTTCGCGCTCCATATAATATTGACAACCGGGCAACGC
-GTGGGAAAGTCGTGTACTCCACACGGACAAATACATTTAGTTTTACAACT
-AAAATCGAGCCGCAACGCGACACGCAACGCGCCGTAAATCTACCCCAGAT
-ATGGCCGAGCCAAAATGGCCTAGTTCGGCCAAAACTCTTCCATTTCAATT
-TATGAGGGAAGCCAGAAATCCCGTGTAATTTTCGCGCCAGAGACGCCATG
-TGTCGATTTACGAGATTGGTGTATATTTACAAAATGCGTAATATTTATAG
-AATGCTGATTTCCGTTTTTTTTTTTTGAAAAATGTCATGTGTGCACAAAT
-TAAATTCGGCGATTTTAAGCTTAAATATAAAATCAGGGAAATTTTTTAAA
-TTTTTTTCACGTAGATATCCGGAATCAGGGGAAAATTTGGAGGCAATTAA
-AAATGTCTCCCTGATCATTTAAATTCTTTAAAAGTACTCTTCAGAATCCT
-TTTTTCCTAACCAAATAAAATAATTTCTGACGCCTTTTTTTTCTCTTTTC
-AATAAGAAGCAAAAAACAGACGAACCTATTCCAATTTCCCACCACACCAA
-TTCGTTCTTTCCGCATTCTTTTTCTTCCATTATTTATCTCCCTTTTCCTC
-CATTCTCTGTGCTCTTATATATATCCATCATCCCATTTTCTTTCTTGTTG
-TGTGGTATGCTCTTTTTCATCCATTATTCGAAAATTCTCATTTTCCAAAG
-TTTTTTGTCAAATACATTTTAAAAATTTTTTAAACCAAATCTCGCCGTCC
-ATCGATTTTAAAATACCTTTTTTGAGAAGTTTTCAAGAAATTTCATTATG
-AAATTCGGTGTTTTCAGACAATTTTGAGTCTAATAAAACAATTTAAAATT
-TTGACTACATCACCTTTAACTTGTAGAATGCCGTTTAAACACACTTATCA
-CTTTTTCAGAATCCCATATGCAATGGTATCACTTGCTCCTGCTAATTCTC
-ATGATCCTGGTCCTAATCCCATGTTTCTGGCAAGCTTGGCTACGATTTTC
-CCGTCGATTCTCCGATTCCTATGATCTATCAAGAAATGCGCAAAAGCGTG
-ATGAGATTTCAAAGGAGTTTTATGTATAGCTTACTGACAGGATTTCAAAA
-AACAGTTACGGTAAGATTTTTCGAAAAATTTCACGGATTTCTGGCTTCTT
-GCCGAACTAGGCCATTTTGGCTCGGCCATATCTGGGGTAGATTTACGGCG
-CGTCGCGTGTCGCGTCGCGGCTCGATTTTATTTGTAAAACTAAAGGTATT
-TGTCCGTGTGGAGTACACGACTTTCCCACGCGTTGTCCGGCAGGCGATTG
-TCAATGGAGCGCGAAAAATTCAATGAGGAAGGCCAGAACCCCGTGCCTGT
-ATAGGATATTTTGAATCTCAAAAGAATTTGAAGATTTGAGTTTTTTGAGT
-TTGAGGTGGAAAAAATCGTAAAAAATTCCTTTCCGATAAATTTTCGGATG
-CAAAAATGTGATCCATGCTGTAAAAAATCCAAGAAAGCCAAGAAATGTGC
-GGAGCCTATTTTCCGATTTTATATTACTTTTTATTTCAAAACTTGATTCA
-AAAATATCAAATTCGGAAAAAAAACCGCAACTTGGTAAAATTTCCTCGAA
-AAATATTCTCCGCTTAGGCTCCGCCCCTCTCTTGGCATTTCGAATTTTTT
-CGTTAAATTTTTGGAAACTGAAATTAAGTCCAAAAAGAACCAAGAAACGG
-GCGGAGCCTATTATGGGATTGAAAAGACATGGTGCATCGATATGGAAACG
-GCTTTTAATTTGGTTTTTTTTAAATAAGAAACTAGTAAAATTCAAGTGGC
-CTAGCTTTCAACTCTTCCATAATTCCAGGGTACATTCCAACTGGTCATTG
-CTCATTGCTCTCTCTTTATGCTTCTCATCACCAACGAATCCACTCAATTT
-TCACTCAAGCTGTCATCTCCAGCAGTGTCTCTCAATTTAATTATGCTTGA
-AATTGTTTTATAAAATGAAACAACACATACTCTGTAAAAGCAATTTATTA
-TTAAAAAGTATATATATACACGTATTCCTGGGTGGGTATTGAGACTAACG
-GAAGCGACATGGAGGAGAATTTGAATTTCATTAAAAAAAAAAAACAAAGA
-GGTAGGTTACTGTAGCATCCAATCTGGAGGCTGCACAAAGAAGACTCCAC
-CGTCAGTGGCGCAATATGTTGGACACACCTGGAACGTTGAAACATTATTT
-ATTTCTTTAAAATTTTCTTTGTCTAAGCCTGAGCCTAAGCCTGAGCCTAA
-GCCTAAGTCTAAGCCTAAGCCTAAGACTAAGCCTAAGCCTGAACCTAACC
-CTAGGCCTAAGCCTAAGAAAAAGCCTAAGCTTGAGCCTAAGCCTAAGCCT
-AAGCTAAAGCCAAAACCTAAGCCTAAGCCTAAGCCTAAACCTAAACCTAA
-ACCTAAGCCCGAGCTTAAACCTGAGCCGATACCTAAGCCTAAGCCTAAGC
-CTATTCCTAAGCTTAAATATAAACCTAAACCTAAGCCTAAGCCTAAGCCA
-AGCGCTGAGCGTAACTTAGAGCCTAAGCTGAGCCTGAGCCTAAAACTAAG
-CCTAAGCCTAAGCTTGATCTTAAGCTTAAACCTAAGCCCTGAAAATTTTT
-TTTTGAACTCCACAACAAAATTTGTAGAATGTTTTTAAAAATTGGGATTC
-TGAAATTCCCCGCCAAAAAGTTTAAAAACTTCACATTTTAATTTATCTGT
-AAAATTTATATAAATCCCTCTTAGATTTTGAATTTCGCGGCAAAACTTGT
-AGAACATTTCAAAAATTTACTTTCGCGCCAAAGATTGTCGCGCGAAATTT
-ACAATTTTTCTATAAAAAATGTATTTCATAGAATTTCAAAAAATCGAAAA
-TCGCGCCAAAAATTTTTAAAAATTTTTTTCAGTATTGTGACGTCATAGAC
-TACAAACTAACCCCTCTATTGCCTTCCTCCCCGTGCTCTCCAATGAGTCC
-TTCGGCTCCAGCGGCTCCATCATTCCCTGGGAACCCGGGCTTTCCTTTTT
-TTCCTCGTGGGCCTTGTGCACCAATCGGGCCGTCGATACCAGGCATACCA
-GACGGTCCTGGCGGCCCGAATTCTCCTTCCTCTCCGATCGGACCTGCTGG
-TCCCGGGATGAACGGTTTCGGGGTGGCGTCCGCACCCGGGTCGCCCATTT
-CTCCATCCAGTCCTGGGATTCCCTGAGGGCCTTGTAGGCCTTTTGGTCCC
-ATTTTTCCATTTTCCGCGCGAAGTCCATTCTTTCCGGGTAGTCCTGGCTT
-ACCAGTGTCTCCTTTCACTCCCTGAAAATTTAGTTTAGTGGTATAGGCCT
-ATCAAATAGGCTTACCGTAATCCCAGTGGTTCCTTGTACTCCTCTCGGAC
-ACGGATCCGCACACAAAGACTTATAATTCACAGGAGGCTCACATGGTAGG
-CGCGCTGGAAGTCCAGGCGCACCTTCCGATCCTTTCGTTCCAGGAAGACC
-GTCTCTTCCAGGGATCCCCGGGGGTCCTTGTGGATGACGGCACTCACATA
-CTCGGGATCTTGCGGTTTGGCCGGTTTCGTGTAGGAAATCGTCGATTTCA
-TCTCTTTTCTGGCGGGTTATGTTTTGGAAATCGTTGGCGACATCGGATAG
-CATGCTTTTCATCTCGAGGGCGCTTTCCTGGAAATTTAAATTTGCTTGAA
-ATTTTCAAACTTGTTATATTATAATTTACAAAATACTGACTGCCTTTGTA
-AGTTTTTTATTACAGGAACACAAAATTCTAAGAATGCGTACTGCACACTA
-TATTTGACGTGCAAGATATCTCGTAGCAAAATCTACAGTAACTCTTAAAA
-TGACTACTGTAGCGCTTGTGTCGATTTACGGGCTCGATTTTCGCAACTTT
-TTTTCTTTCGGATTTCCTTCGTTTCCTCGTATTGTTTTCTAACTTTTTAT
-TTCAAAATTTCAATATTCTATCGATAAATAAATCATTTTAATTTATTTCG
-AAAATCGAGCCCGTAAATCGACACAAGCGCTACACGAGTCATTTAAAGGA
-TTACTGTAGTTTTCGCTACGAGATATTTTGCGCGTCAAACATGTTGTGCA
-ATACGCATTCTCAGAATTTTGTGTTTCTCTAATACTGTGTTTTTAGGATT
-TTGAATGAAAGGAAAAGCCCGAAACTTTTAAACAAATTTTTCGGTGCATT
-CTGTATCAAAAAAGCTGAATAAAATTGTACAAAAAAATGCCACATTTTAT
-TGAAAAATTGATAATAAAATAATTTGTTTTCAAATAATTTTTGAATTTCT
-CAATTTTTTGGAATTTTTGGATTTTTTCGGGCCAGAAAGTAGGCATTCTC
-ATGAACTGATGTTTTCTTCATAATAATATATTCAAAAAAACGGTCTCCCA
-CAAAAAAAGGTCCGAGAGGCGAACAAGGTTGTAAAACGTTGCTATTGTTT
-ATTTACAACCGCCATTATACCCCTATAGGGGTTGTAACACCACATAACAA
-TTTGATAAGATGCACACAGTAGGGAGAGGGACCTAATTTAAAAATATAAG
-AATTTTCTCATTAAATACAATTTTTCTCTATTTCTTTCAGGAATATCGAG
-AGGAAAATCAGCGAAATTTTTGGAAATTTTTGGTTTTTTTCTAACGAAAC
-AAAAAAAATTTGAAAAATTTCAAGAAATTCTGTGTATTTATCGATAAAAT
-TTCAGAAATCAAGGGGGTCGTATAGAAGTTAGACGGTCGGTTTTTCGACT
-TTCAGCTAACTTTATGAAATTTCATTTGTTCAGGTTTTCTGACATTTAAA
-ATCAAATGGCATTAGCAGTTTTTCATGAAAAGTTTCAGAAAGTCTCAAAA
-CTCCAAATTTTAGGAGGGTCGTATAGAAGTTGGACGCACTAAAAAAAAAG
-GAAAAATGTGGTTCTAATTATTACGGAAACACTAAATTCTGAGAATGCGT
-ATTGCACAAAATATTTGATGCGCAAAACATCTCGTAGCGAAGACTACAGT
-AATTCTTTAAATGTCTACTATTGTAGCGATTGTGTCGACACGTGGTGCCA
-GATTGTCTCATTTCGGCTTGATCTACGTAGATCTACAAAAAATGCGGGAG
-AAGAGACGCAGACTTCTCAACTGATTTCTCATGGTTAGGAACGTGCTGAC
-GTCACATGTTTTCGGGCCGAAATTTCCCGCATTTTTTGTAGATCAAACCG
-TGATGGGACAGCCTGGCACTATGTGTGTCGATTTACGGGTTTGATTTTTG
-AAATTGATTAAAATAATTTAGTTATCGATATTATATTGGAATTAAACAAA
-AAGTGAGAAAATAAATCGAGCCCGTAAATCGACACTACAATAGTCATTTA
-AAGAATTACTGTAGTTTTCGCCACGAAATATGTTTGCGCGTCAAATATAT
-TGCGCAGTACGCATTCTCAGAATCCGTAATCCTCAAACTTCTCACCTGAC
-AGTACTCGGCATCGTTGACAGTATTCTGAATAGCCGGTCGAAGTATTGAG
-GCAAGGGGTCCTACAGAAACAATAAACGACGACATCGTGGATAGCGAGAT
-AAATAGTGAAACTATGATTAACGTGGCGTATGCCGTTTCTCGAGCATTCT
-CGTTCATTTTCCAGGAGAAGCCTCCAAGAGAAGCCTATGGAGGATCCAAC
-GAAAAGTGAGTAAAGAAATGATGCGCTGGCGCGGAAAAACGAGAGCGATT
-ATGTATGGGAGTGACCCAAAAACACGGAAAAGTAACGGATAACAAGAAGA
-AGAAGGGGGCAACTTTCTCTTTCTTATCATCATCACCATCATCATTATCT
-CCTTTCTCGGGATTCCGTCATGAGAATGAATCCATTTACTCGTTTTTTTT
-GTGTCCATTTAAGTTTGTCTATAAATATGGCTAATTTCAACTTTAAAATC
-AAATAATGAAACTAGTAATTCTACTCATCTCTCACGCAATTCCTTTCTTT
-TATGTGATATATAACTTTTATTCCATATTTAAAGAAATTTCAAGTTTAGA
-GTCTAACTTGAAAATTGCCAGTGATGAATATAAAATTAGAATGAAGAATA
-TTTCCAGAGAAGTTGGAAGTGTAGTCTTGGAGGAGAAGAGAGGAAAGAGG
-TGAGGAAAAATTACGTTTTTTTGAAGTTTTTTCTTTAATTTTCGAAGGAT
-TAGGCTTAGGCTTGGGCTTAAGTTTAGGCTTAGGCTTAGGTATAGGCTTA
-GGCTTAGGTTCAGGCTTAGGCTTAGGCTTAGGCTTAGGCTCAGGCTTTTG
-TTCAGGCTTAGGTTTAGGCTTAGGCTTAGGCTTAAGCTTATGCTTAGGTC
-AAAGTATAGGCTAAGAGGCCTAGGCTTAGACTTAGGCATAGGCTTAGGCT
-TAGGCTTAGGCTTAATCTTAGGCTTAGGATTAGGCTTAGGCTTAGGCTCA
-GGCTGAGGCGTAGGCTTAGACCAAGGCGTAGGCTTAGGCTTAATCTAAGG
-CTTAGGTGTCGGCTTAGGCTTTAGCTTAGGCTTAGTCTTAGGCTTAGGTT
-AATCTTAGGCTTAGGATTAGGCTCAGGCTTAGGCTGCGGCCTGGGTTTCG
-GCTTAGGTATAGGCTTAGACTGAAGCTTAGACTTAGGTTTGGGCCTAGAA
-TTAGGCTTAGGCTTAGGCTTAGGCTTGGGCGGGGCTGGGCGGATGAGAAA
-AAGAGAAAAATTCCAGGAAAATCCAAATAAAATCCAGAAAAAATAATAAA
-AAAAAGGAAAAAACGGGAAAAATGGGGCATTCCGCGTCTGCCGCGTCAAA
-AACTTTTCCTTAAAAAACGGACAGAGAAGGACCAAAAAAGACAAAAGTTT
-AACAAAAAATAGTTAAACATTTTTTTTGACGGGGTTGAGCTCACCCAGCT
-GAGCTCACTCCATAATTGCACACAAAATTCTCAAAAAATTAATTTTAGAG
-ACTACACAGAGGCTAGCAAATGCACATGCTCTTCAACGATTTCTCAGAAA
-TGCCCGCCAGGCTCCAAAGGTGCTCCAGGAGCCGATGGTCTGGACGGGAT
-CCCCGGCTCCAGAGGTCTGAATGGTATGGATGGAGAGGCTGGGCACAGTA
-ATATGGATGTTTGTGAGTTGCCCAAGATCTTTTATTTTTTGTAAATTCAT
-ATTCCAGTCATGTCACCAACAGGATGCATCCGTTGCCCAGCGGGTCCTCC
-AGGTTCTCCTGGTGATCATGGTTCTCCTGGTGAACCAGGGTACCCGGGAC
-CTTCAGGACCTCCAGGGGAACCCGGTTACGCAACAATTGGGCTTATCGGG
-CCACCTGGACTCGCAGGCCAAGATGGTCTAGATGGAGCTCCTGGCGAGCC
-GGGAGTAGGTGGAATGGATGCAGTGAAGATTGTTTCAGTTGATGGAAAAA
-TTGGAAGAAGAGGAGAAGCGGGGAACAAAGGAAGCAAAGGATCTCGAGGA
-GGAGTTGGAAAAGCTGGAGGGCCTGGGGTGGCTGGAGAAATGGGAGAAAA
-AGGAGCAAGAGGTGAAGATGGAAAGCCTGGAGAGTCTGGAAAGGTGAATT
-CTCAGAAGTTGATCGATGCACCAGGGCGACAAATTAAGCGAATCGGCAAA
-TTGCCGATTTGCCGATTTGCCGGAAACTTTCAATTCCGGCAATTTGCCGG
-TTTGCCGATTTGTCGGATATCAAATTTGCCGGAAATGTTTAGAGGGATTT
-TTTAAAAGACGAAAACACTTAAAACTGTGTCTTTTTGAATTTTTTCCCGT
-TTTCCTAACTAGGGAATATTGTTAATAGGGGAATTGCTAGGAAGAAAAAA
-CAAACTTTAAATGACAGATGAGGTCTTTGGCTACAAAAATCATTTTTTTC
-ATTATTTTCATTTTCATAGAATTTGCTCACTTTTCAAAATAGACGTAGGA
-ACATTCATAGGATGCGTTTAATTTTGCCATTTGAAATTTAAATTCTGAAA
-TTTCCAAAAAAAATCGGCAATTTGCCGGTTTGCAGATTTGCCGGAAATTT
-TCCATTCTGGCAATTTGCCGATTTGCCGATTTGCCGATTTGCCGGAAACT
-TTCAATTCCTGCAATTTGCCGGTTTGCCGATTTTCCGGAAATTTTAATTC
-CGGCAATTTGCGGATTGGCCGATTTGCCGGAAATTTCAATTCTGGCAATT
-TGCCGGTTTGCCGATTTGCCGGAAATTTCAATTCCGGCAATTTGCCGGTT
-TGCCGATTTGCCAAAAATTTTAATTCCGGCAATTTGCCGGTTTGCCGATT
-TGCCAAAAATTTTAATTCCGGCAATTTGTCGATTTGCCGATTTGCCGGAA
-ATTTCAATTCCGGAAATTTGCCGATTTGCCGGAAATTTAAAATCCGGCAA
-TTTTCCAAAACTGTATAATTTTTCAGCCCGGCGCACCTGGAATCCCTGGA
-AAAGATGGTACATACTGCCGATGTCCCGATCGAAATCGTTACGATATTTA
-TCCATATAAATCGAAAATCTGATAATAGTAATAAAGATAATAATACAATA
-AATACAGACAGGAAACGAAAAGCGAGCACTGACGATTGTATGATACCCGA
-AACATTAAGGAGGAGCACAAAAAACACAATGAAAAGACACAGAAAAATTG
-AAATTTGAAAAACTGGTAACGAGACTAGAATCGTCATGATGATCTTGTTG
-AAAAAATTGGAAAAAAATTAAGAATCTAGAAATTGATTAGGCGCAGACTT
-GACACGATCTTGGGCACCGAATCCGCATTTCAGGCCAATTTTCGCATGCT
-CCGCCTTGAGCCCATGACGGGCAGAGGGAGTCATGATCGATGCATCTGAA
-ATGGGGAATATTATTTTTTATTTTAAGCTTCAGGTTTAGGCCTATCGACT
-TTGGATCTCAGGCTCAGGTCCTTAAATTGTGTATCTCAAGCTTAGGCTCT
-CTCGCTCAAGCCTTTAGATTTCAAATCTTAGCCTTAAGCTCTCCGACTGA
-TTTAGGATATCAGACTAAGGGCCTAGGACTTTGGGCCTGAGGCTTAGGCT
-AGTATTCAATCTCAAGCTTAGGATCTCACGCTTAAGCTCTCTGACTCAGG
-CCCTTAGATTGCAAAAACCTTTGCCTTAGGCTCCCCGACTGATTTAGGAT
-ATCAGACTTAGGGCCTAGGACTTCGGGCCTGAAGCTTAGGCTCTCAGATT
-CAGGCCCTCAGACTTTGAGTCTAAGGCCGTTAGACTACGATTTTCAAGCT
-TACAATTAGGCTTTTAGGCTTAAAATCAAAATCCAATTTAGTTTTTTAAA
-AATAATCAAACATTTCTAAACCGCAATTTTTTAAAAATTACCCTAAATAT
-TTCAAATTTTAGGCTTAGACTGTCAGACTTAAACCTTTAAACTTTTGGTC
-TCAAATTTAGCCTACAAGTCTGTGGACCTAAGACTTTGGACCTCGAACTG
-CGGCCCTTAGATCTCATGCTTGGGCTCTAATATCCTGGCCCTCTAGTCCT
-AAATCTTTTGATCGTAGTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCT
-TTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTT
-CAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCA
-GGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGG
-CTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAAGCTTTCAGGGT
-TTCAGGGTTTCAGGCTTTTAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTT
-CAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCA
-GGCTTTCAGGCTTTCAAACTTTCAGGCTTTCAGGCTTTCAGACTTTCAGG
-CTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCT
-TTCAGGCTTTCAGGCTTTCAAGCTTTCAGGCTTTCAGGCTTTCAGGCTTT
-CAGGCTTTCAGGCTTTCAGGCTTTCAAACTTTCAGGCTTTCAAACTTTCA
-GGCTTTCAGGCTTTCAGACTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGG
-CTTTCAGACCACAACTAGACCGGCAACACACGTGTTGTCTAATTACTCAC
-CTCTTTGCCGGCGCTCTATGCATATTTGATGGTAACTCGATTGTCTTTGA
-AGCTATCACTTTCACAGCTTCCCAAGTTTCCCGAGCTGTTGGAATGATCT
-GAAACATCAAAAATCATCATCAAAAATCGTGGTGAGACCCAAAATTACCT
-GATTCTCAGCCAGCAAGAATCCATCCCAAACTTGCTCTTCGGGTCTCAAC
-TCGAACAGGAATGAGTACTTGACGTGGGCTTTTCCCTTTGCCCAATCTTC
-TGAGCCACCGGATGCGGGGTCTGGAAATATTTTGAAATTTTATACATAGG
-AGCCTTAAGAAATAAGAGCTTACAAAGTGTATCTGCACCGGTTCCAACTT
-TGTACTGCGTGTTGTAGACACTATTCAAAGCCTGAGCTGCTGAGAGGGCA
-GTGGATCTCTGAAATGTTTAGAAAATATGACCATGACTTGGGCAAACAAT
-TCCCGCATTTTTGTAGATCACACCGTAATGGGATAGCAAAACACGTGGTG
-CCAGAGTGTCGCATTTCGTTTTGATCTACGTAGATCTACAAAAAATGCGG
-GAACTGATTTCTCATGGTTAAGAACGTGCTGACGACAAATTTTTTTGAGC
-GAAAAATTCCCGCATTTTTTTGTAGATCAAACCGTAATGGGACAGCCAGG
-TACCAAGTAAAAAATTTACTCACCAAATCATTCAAATCATTTGAATAAGT
-TCTGACTTGATGGCCGAACGGATACATCAAAATTTGAGAGTACGAGTGGA
-AGGTGAGGAATGTCGAAATACGGTGTCGCTGCACGAAATCTCTAACCGCC
-GCAGTCTCGGGCTCCGAGAAGGCGTAGGCTCCCTGATAGATTTCCGAGCA
-AGGATCAGTTGATGAGCCGACTTGTCCGAAGAACCAGTCAAAGTTTCGAT
-TGAGGTCGACACCTTGACAGCAGGTTGTTGTGGGAGGTTGGAAGAGTCCT
-GAAAGGTTTTTATTTTTGAGATTTTTAACTTTCACGGAGAATTGCCAAAA
-TCTTAGTTTTCATAGCCTGTGTGACATTATTTGGGCGTAACTAAAGTCCA
-GAAAGCTTATGCCTTGTGCTGATGAATTTTTGCAAAAATTGTGCCCAGTT
-TTGCCACTTTTTAGTGGTTTTTGATGGGTTAAACCTAAATTTTCTGAATT
-CAAGTTTTTATTTTTTCCAAATGTTTTTTCAGCCATCGAATGGCTGTCCT
-TTTTTTCGGGCAAAAAAATAATTTTTCTGAAACTATTTGAAACAATTATA
-TTCTAAAAAAAAGGCAATTTTTTAAATTTTTTCTAGTAAATTTTGAGTCC
-TCTAGCTACAAAATAAACCATTTTAGATGAGTTTCAAAAATGTGCATTTC
-TACAAAAATTGCCCAATTTTTGCCACTTTTTGGTGGTTTTTGATGGGTTA
-AACCTAGATTTTCTGAATTCTGCGTATATAAATTACACGTTTTCAACAAA
-TTTAGACATTTTTTTTATTTTTGCCCAATTTTTTTCCAGCCATCTAATGA
-ATATCCTTGTTTTTAAGCAAAAAAAAATTTCTGAAACACAATTATTATGA
-TCCAAAACAGGGGTGTGCGGCAAATCTCAAAATTTGCCGAGCACGGCGAA
-TTTGGCAAACGGCAAATTTGGCAAATTCAGCAAATTTGCTGAGCTTTACA
-AACTCCGCAAAAATTTGATACTTTTTGAAGCACCTAAACTACTAATTTCT
-GAACAAAAGTTCAAAATAACTTGATTTTGTGCCATTTTTCTAAATTTTTG
-GAAATCAATAATTTTGTCAATAATTTTGGTTAAAATTGTATTGTCAAATT
-TTTGACGCGGGCGGCAAATTTCAAAAATTTCTGAGCTCGGCAAACGGCAA
-ATTCGGCAAATTTGTCAAATTTGCCGCACATTTTTTTTTGGTTCAAAACA
-TAATAAAACACTCCAAAACATTTTAGATTTTTCATAATTTCCGGTCGAAG
-TTTTTGCAAATTGCTAAAATTTTGAAAAATATGAGTATTTGAGGAAATCC
-AAAGCAATGCCGCATGTTCCGACCCCTACAATGTTTTAATACAAATGATT
-AAAACAAAATTACAGTAGACAAAATGTAGAAAAAAAATTATTTTTGGTCG
-ACTTCCAAAATTATGAGTGGCAAAAACTTTGTAATTGTCACTTTTTGACA
-GTAAATAAAAAATTTTAAGAATTTTTTTGAAAAGTTTTATTATGATATTC
-GGTCATTTTGGGACCAAATGAGTGGTTTTTAACAATTCCGGCACTGGCGC
-TAGTCCAGCAATTGCCGTAATCTTAGTTTTCATAGCCGACATTATGCGGG
-CCTAACTGAAGCCCAGAAAGCTTGTTTACAAAAATGAGCAAGCAGAAAAA
-GATCAATCTCCCCAACAAACCTGTTGCCTGTTGAATACACTTTGGTGGTG
-ATCGATTCTTTCTCCACAGTCTGATCTCCGGATCATTGCTACTTCTACTG
-TACTCATAACCATCCGGATTCAGCAGTGGAACAATATACCATTCGAGTTG
-ATCTACGAATTGCTTGATTTGAACATCTTTGTCGTACTGGGTGACCAGTT
-GGTGAATGAAATAGAGTACTGTCGATGGTGACACCCATTCACGAGCATGG
-ATTCCTCCGTCCACCCAGATGCCACGTTTCGTACCTCCGTTACGCTTGTT
-GGTGATCTGGAATTGAGGAAAATTGGGGTGAGATGGGATCACTAAATTCT
-GAATCTAGTTTCTGTGCTACTGTGTGTTACGTTTTTTGCGCTCCATTGGC
-AATCGCCTGCCCATCAAAAACCGTCAAAAAGTGGCAAAACTGGGCAATTT
-TTGTAAAAATTCACAATTTTGAAACTCCTCTAAAATGGTTTAGTTCGTAG
-CTAGAGGACTTAAAACTGATTTTTGAACCCTAAAAATTGTCTAAATTTGT
-TGAAAACGGGTAATTCTTGTATGCTGAATTCAGAAAATCTAGGTTTAACC
-CATCAAAAACCATCAAAAAGTGGCAAAAGTGGGCAATTTTTGTAAAAATT
-CACAATTTTGAAACTCCTCTAAAATGGGCAATTTTGTAGCTAGAGGACTC
-AAAATTAACTTCCAAACTCTAAAGAATTGTCCTTTTTCAGAATATAGTGG
-TTTCAATAATTTTCGAACAGAATTTTTTTTGCCCAAAAAAGGATGGCTGA
-AAAAAATTTTGGCCGAAAAAAAAACAGTTTTACACTGAAAGCCAAACCGC
-GACGCGACACGCAAAGCTCGGTAAATCGACCCCAGCCGTGGCCGAGTTCA
-AATAGCCAAATTCGGCAAACTCTCACATTTCAAGCTATGTATTTCAAGCC
-AGAAGCGCGTGCGATTTCTCAAAAACCGGCAGCTCAGTTGCAGGAGGACT
-TTACGAAAATTTTGAAAATTCCAAGGTATAATTGGTAGGTTTTTCGGCAT
-GTTGCATGGTACTTAAAATGTTTTTTTAACTTTCAAAAGTGGCTTTTATT
-TTGGTTCTTATTGCAAGCCTAATAATAAAAATACTATCCACGTTTTAAAT
-GCTTCCATGGTAGGCAGGCGCGGTTTCAGGGCCGACATGGAAGCCCTACA
-TGTCACGGATTTCTGGCTTTCCTCAGAAATTGAAATGGACTAGTTTTTGC
-CGAACTAGGCCAGGCCATATCTGGGGTAGATTTACGGCGCGTTGCATGTC
-GCGTCGCGGCTCGATTTTAGTTGAACAACTAAATGCATTTGTCCGAGTGG
-AGTACACGACTTTCCCACGCGGGCGATTGCCAATGGAGCGCGAAAAATTC
-AATGAGGAGGGCCAGAATCCCGTGATCGTCCGAAGCAAAGTTAAAACAAC
-AAACCTTAATCAACGGGATCTGCCGTCCTTCGTGAGTCGTTCCGATTGGC
-TGCACAGACACAAGCTCCGGATAAGTGATGGCTAATGAGTTCAGGTAGTT
-GATAACATCAGCAAACGAGTGATATTGTGCAAGGTTAAATTGAACCTGCA
-ATAAGTTATCATTGAACTATGTATCATTGAACGTGGTGTCAGAGTGCCTC
-ATTTTGGATTGATCTACGCTGATCTACAAAAAATGCGGGAGAAGAGACTG
-ATTTCGAATGGTTAAAAACGTGCTGACGTCACATTCTTTTGGGCTAAAAA
-TTCCCGCATTTTTTGTAGATCAAACCCTAATGTGACAGCCTGACACCACA
-TGTATTCACTCACTTTCTGCTCCCTCCAATCATGCAGTCGAACTTGTTTC
-CGAAGCTTATCCCGCTTCTCCTTCTGCTCGACAATCACTCTGAAATCGAT
-GAAAAGATTGTAAGTTGGGCTTAATAGTGTCCCCCCACGACACCCATCAC
-GCGTAACGAGCCGTGACGCGTTTGAATAAAGAGGGTATTTGGACTTGTGA
-TCCCCGCGAAAACCTGTATCGCACGTGATGCCAGGGTGTCTCATCACGGG
-TTGATCTACAAAAAATGCGGGAATTTTTTGCCCAAAAATGTGACGTCAGC
-ACGTTCTTAACCATGCCGAATCAGTTCCCGCATTTTTTGTAGATCTACGT
-AGATCAAGCCGAAATGACACACTCTAACACCACGTGGTATCGCCGAAAAA
-CTCACTTCTGAACGTCATCAATCATAACGGAATGCTTAATCGAATGATCA
-TCGAGCTCTTTCATAAACTGCTGAGTTTTCTCATCGGATATCATCACATG
-AACCTCCTTGCCAGCTTCCGACGGGGATTTCCAAAAATCTAGCTGAAAAT
-TTTAGTGTGTCTGAAGCACCCTTATCAGTTCATATTATATTTCAAAATTT
-TTCTCTAACCCCTCAAAACCGTACTCTACATCGCCGTTCTGGCCGAGTGG
-TCTAAGGCGCTGCGTTCAGGTCGCAGTCCTCTCCGGAGGGCGCAGGTTCG
-AATCCTGCGGACGGCAGATTTCTTTTTTGAATACTACTCTTCAAACAATG
-CATGATGAAGAAGAAGAAGAAAAAGAGAAGAACGTATTGGCTTTTCCTTT
-TACACTTTTGAAATCCCTAGGAACAGGTTATAAACAGCGATGTAACATGA
-AAAGCAGCAGTGAGAGTGATCGAAAACGAGCTGATTATGATTTGTTCAAT
-TATATGACACCGCTATTGTAATGGTTGGTTTGTTGCGTGGAACATCATAC
-CTTTACATCGTTTAAATACAAATTATGAAGAATGTCTACTTGATCTTGGG
-TCGTCGGCTGCACCCTCCATACTGTGAATTTTCTGAAAAATCGAGAGTTT
-ACCGGCTTTTGGGGGAGATTTTACCATTGACTTTTGACTTTTTGGAGAGA
-TCTAAATCTAGTAGATCATGCGGCGGTTAGGTCTATTTGAAATAAAAAAT
-AATTGATCTAGATATGAAACATGGAGATCTAAGGGTTTTGGTAAAGTTGA
-GTAGAATTTTTAATTATTTTTTTGAAAATTTGTTTGCAACATTTTACAAA
-AAAAGACGAATAAATATTGACCAAAAAAATTTTTTTCAATAAAAAATGTT
-TAAAAATTAACCACCTTTTAGCTTTTAAAGGTGGAGTAGCGCCAGTGTGG
-ATTTTGTCTAAATACACTTATTATGAACCAAAATGGTCAAATATCATAAT
-AAAACACTTCAAAAAATTTCTTTATTTCAGATTTTTCATAATTTCTGGCC
-AAACTTTTTGCAAATTTCCAAAATTTTGAATGTCGCAGTTTCCGACCCCT
-ACAATGTTTTAATACAAATAATTGAAACAAAATTACAGAATAAAAAATGT
-AGAAAAAAAATTTTTTTTTTGGTCGACTTCCAAAATTATGAGTGGCAAAA
-ACTTTGTAATTGTCACTTTTTGACAGTAAATAAAAAATTTTAAGAATTTT
-TTTGAAAAGTTTTATTATGATATTCGGTCATTTTGGGACCAAATGAGTGG
-TTTTTAACAATTTTCCCACTGGCGCTACTCCCCGTTTAAAGTTCTATGCT
-TTTTAAAACTCACGTTTTTTTTTATGAAGTCTATTTTAAAAAATCTGGAC
-TCTCAGTGGACAGTTCAGCATTTTTCGAAATTTCAGAAATTTAAAACATA
-AGTCGGAAGTGGTCCTAAAACTTCAAAAAAATTCTCACAATATGTTTTTT
-TGATGAAAACAAACTTATATAGTGCCAAAATGACCAAAATTTTTTTAAAA
-ATAATATTGAAAAATCTTTAAAAAATCTCTTCTGGTTTTTATTTATTTTT
-AAAAAATTCATATTGAAATATTATAGTGCTTTAGATTGCTCGGAAAAAAT
-TCCACAAATTTTTTAATTTTTCATAAGTTTTATAATGATATTTGGTCATT
-TTAGCTCTCTCGGGTAATATTGCAAACCCACGTGGTGCCAGGATTTCCCA
-TTAAGGTTTGATCTACAAAAAATGCGGGACTTTTGCTTAAAAAGATGTGA
-CGTCAGCTCATTTTTAACCATGCGAAATCAGTTGAAAACTCTGCCGCATT
-TTTTGTAGATCTACGTAGATCAAACCGAAATGAGACATTCTGACACCGTG
-TCCACCTTCAAAGTTAGTAATTGCATGAACAAAAAATTCTGAGAATGCGT
-ATTGCACAACATATTTGACGCGCAAAATATCTCGTTGCGAAAACTACAGT
-AATTCTTTAAATTACTACTGTAGGTCGATTTGCAGGCTGGATTTTTTGAA
-AAAAAAATGAATTAAAATTTAATGGAATATTTCTATCTCTATGTATTAGA
-AAATAAGGCCCGTAATGAGACGAGCGGGCCTGCCTACCTGCCTGACTATA
-GAAGGCCGCCTTAAAATCAGGCAGGTAGGTTTTAACGCCTAGCCTACAAT
-AAACATAAAGAGAAATGCCTAAAATAACAATAACTTTCCATTATCCTTTC
-TTATCGTCCTCCCCGGCGATCGCCTAAGATCATAGATAACAACTAGCCGC
-TTTCGGTCATGCAATTATTATATTATAATTGATGGATGGATGGGGGATAA
-TCCAGAGAAAGGGGAAAAAGAAACTTAGAATCCTAGAAAACAGGTTCCCC
-TGACTCAAACAAAAAAACCTACTTTTGATGTGCCAACACGGATGGCACGA
-CGAGACCGATGAGGACGATGATGTTCATCATCATCATCTTCATCGTAGTA
-AAACTTGGGGGGTGATGAGGGGCAAAAGGATGCCCTCCGCGCGTCAAGTG
-TTCGTTGAACAATCCGACGCAGACGGTTAAACAAAGCAACACAGTGGTGT
-CTCCGCCCAACTTCCGCGCGTCCGCCGCCGCCCTGTGTACTGTCTTGTCC
-TATCCTATCTCTCTTTTCTCCACCCCGGCTTGTGTGTGAGATTCTTCTCA
-TTACTAGAAGAAGGTCTCTAGTAGAAGAAGAAGAAGAAGAAGAAGACGAC
-GATGGAGAAGAAGCTGAAGGCACGACGCACTGTTTGCGCAACGATGTTTG
-TTTTTGCGCGCGCGAGCGCCGCATTTAAAACGTGTAAATCGGTTTCAAAA
-GCGCGCGCGCGCGGTCTTCTTTCTCCGCTTGCGCGCACGCATTGACAAAA
-AACCGAAAGGTGCAAAAGTGAAGAGGCCAACTACTTTCGTCCTCTTTGAG
-CACCTAATTGTGGAAAGCTTTTGCTCTGATGTGAAATGAAGTTGGGTAAG
-CTATTCCTGTCTGGGTGATGTTTTCAACTTCCGGGGGCATTGTTGGGAAA
-GTGAGGACCAAAATAGGCCATAAAAAATGAAGATATACATGCTTAGGCTT
-AGGCTTAGGCTAGGCTTAGGCTCAGATTCAGGCTTAGGCTTAGGCTTAGG
-CTTAGGCTTGGAATTAGGCTTGGCGTCAGTGGCGAGCGTGAGCTCGCCAC
-TGACGCTATTTAAGCTTGGGTTTATAGCGTTTTTTTAATTTTTCAAAGGG
-TTCCCGTCTGCCGATCAAAGCGAAATTTAACAGAGAGTCGTATAGGCCGC
-CAAGAAGCTGAAGTTTCAAATTGATTTCATTAAAACTCGCTTAGGCTTAG
-GCTTAGGCTTAGGCTTAGGCTTACGTTTTAGCCATATGCTAGCTGATCCG
-GAACATATTTTTAAAAATTGCAATATTTGACCAAAAGCTGTATTTTTCAA
-AAATTCAAAAGTACGGTGAAATCATATGAAGTGCTTCTTTTTCTTTCATT
-AAACTGTTCAGAATTGTCATTTTTACTAGAAAATACCAAAAAAATATGCT
-AGCTTGACCGGAACATATTTTAAAAAATTAGAATTTTTGACCAAAAGCTG
-TTTTTTCAAAAATTGAAAAGTACTGGAAAATCATATGAAGTGCTTCTTTT
-TTCTTTCGTAAAACTGTTCAGAATTGTCATTTATACCAGAATATATTAAA
-CAAAGTATGCTACCTAATCCGGAACATTTGTTTCCAAAATATTTTAAAAA
-AAAGATTTAGCGGCTCTGACTAAATTGTTTGTTCGTTTTTTCTGGACCCT
-TTTTTCCCCTTTTTTTGGGTGAAAAATTTTGTAAAAAATTTGACCGAGGT
-GTAGAGTTGAATTCATCAATTTTTGACATTTTTTGAGTACGGGCACATGA
-AAACGAAATTTCCAAAAACGCTTATTTCTCGGGATATAGTTCAATTCTAC
-CAAATTTTTCTTTGCAAATCTGCTAATTCTACAAATCTACTAACCGAGGT
-GTAGAGTTGAACTCATTTCCAAAAAGAAGTAGCAGTCCTGAAAATGTTTT
-AGTGAGTCTTCTCATTACTCTAGAGCCCGAGCCAGTAAAATTGCTCCAGA
-AGTAGTAATTTATAAATTTTTGATGATTTTATGCTGTCCAATGATAGAGA
-AATTGTTAAAATTTTCAGATCAAATTGGAATTTTCACAGCCAAATATTTT
-GGAAAATTTTCCACAAAAAATTGGGCGGAAAATTGGAATATTAATTCGAT
-TTAATTCGATTTGGAGCAGTGTATAAATTCAAAGTTTCCTCCCTTAACAG
-CCATTCAAATGCACTTTTTTCTTCGTTTAGTTTTTCTTATATATGGCCTC
-CAGGCTCTCACCAAGTTCCGTTTTACCGGAGAGTTTAAGTGCAAACATAA
-ATTCCTGAGATCCCATGTTGTAGTTTATGAAGACGATGAGGTGTTGTGAG
-TAGAAATGAAAAATGAGAAATGTTGTATTTAATATTATAAATTGTTTCAG
-CGACAACGTTATCAGTAAACACCATTACGTGTTCCATACAAATGCACCAC
-ATATGTATCTCGTTGAGGCTGAAGATACCAATGACGGATTGCCAAAGTTT
-TTGGATGTATTACTTTTTAATTTCCCGCTTTTTCTCTAGTATTTCTCAGA
-AAATTTGAATTTCCCGCCAAAATTTTTTATCAGAAAATTTGAATTTCCCA
-CCAAAATTTTTTATCAGAAGATTTGAATTTCCCACCAAAATTTTTTCTCA
-GAAAATTTGAATTTCCCACCAAAATTTTTTCTCAGAAAACTTGAAATTCC
-CGCCAAAAACTTTTTCTCAGAATTTTGAAATTCCCGCTAAAAAATGTTTC
-TCAGAAAATTTGAAATTCCCGCTAAAAAATTTTTCTCAGAAAATTAAAAA
-TCCCCGCCAAAACTTTTTCTCAGAGAATTTGAATTTGCCGCCAAAAAATT
-GTTTTCTCATAAAATCTGAATTTCCCACCAAAATTTTTTCTCAGAAAATT
-TGAAATTCCCGCTAAAAAATTTTTCTCAGAAAATTTGAATTTCCCGCCAA
-AAAATTGTTTTCTCATAAAATCTGAATTTCCCACCAAAATTTTTTCTCAG
-AAAATTTGAAATTCCCGCCAAAAAGTGAACATTCTAGGAGTTTGGCAGTT
-TACCAAAACCTTGACTGACCATTTTGGAAAATCGAATAACCTCTTAAATA
-AAAACTCTAACTTGTAAAAATTTAAAAATTTAAATATATAGCTTTGCAGT
-CCTATTTCGAGTTATACATGATCATCGTCCACGATTGCACGGATAATGGG
-AAATACAAGTTGTTGACAGTTGACTTGGGATCTTATTATATCAAGGATGG
-GTAGGTACTTTCTACAGGGCAGGCTAGGGCTTCCATGGGAAGCAGGAGCG
-GTTTGCCGGCTTCTCGCCTGATTCCTGCACTTTGGCAAAAAGTCAAAGCC
-TCGATGCTCACACATAGGGCTGGCATATTGGACGTCCGGTTTTTTGAAAT
-TTTAAATTTTTCCGAGAGGTAGTTTTTTTTGTACGGCGGCCGACAATTTC
-CGAGTTTGGCCACTCATGATAAAATTATATGATTAAGTATAGTGAGTGGC
-CAAACTCGGAAGTTGTCGGCCGCCGTAAAAAAAACTACCTCTCGGAAAAT
-TTTAACATTTCAAAAAACCGGACGACCGGACGCCCAATATGTCAGCCCTA
-CTCACACCAAATAGTACTATAAGCGGTTTTTTTTGCCGCAGCCGACACTT
-TACGGTTTCCACGCCGCACTGTACAGAAGGCGCGGCCCGAGGCAGTTGTC
-AGGCGTTTTGGCGCCTATATGCAAGCTCTAGGGCAGGCATTTCTGTTTTC
-AAAAAAATGAATATTTTCAGGCAGTACGATGAAACACGCAACATTGATCT
-GAACAATGCCGGTGAATGGACAAACGAAGTAATCGGAACAAAGGCGATGG
-TGATGTCCAAGATATTTATTTTCAATGTTTGATAAAATTGTTCATCAATA
-TTCGAGCCTACCTGCCTACCTGCCTACAAGGTAGCCTACATATATTATTT
-TTCCTAATTAACAAAAATATAATTAAAACATGATTAAGATTTTCTGAAAA
-TGAGCAAAAAGTGTTTTTAACTTCCACTTTTTGCCCAACAGGTTTAAGAT
-AGGCATGTGACAAAGCCTACATTCAAGGCAACCTACGCCTGCCTCGGTAC
-ATGGTGCATCGACCAATATTTACCTCTTAGCTTCGAGAGCTTATATCTCG
-GTTACATTTTGCTCTATCAAAAAATGGCCAACTGAAAAACTGTTCTCCAA
-TGCTTTTTCTACAATTTTGTGGTTAAAATTTTTTTAATATCTTGAAAACT
-AGCGAAAATATAAGCCACCAAGTCGCGCGCCGCCCCCCGAGAAAGCAATT
-CCAACCCAAGTTTATTGCAATAAAAACCAGTAGAAACGAAAGAAATGAGG
-TTGATTTTGGAGACTTTTCAGGTGACACGGGGAGCTTTTACATTGTTGGC
-ATTATTCAGATTCGATTGAGAAGGAGAAGTCGTGGGGAGGCTGAAAAATG
-TTCTAAAGTTGTTGAAAAAAAAAACAAATCTGCATTTTTTAAAAACCTGA
-TTCTTAGACTTCCATCCATTGCCATAAGTGCACAGAACAGTCTGTTGCTC
-TTGCTCTTTGTGCTCCGTGTCCTCGGAGCCATCATCAACCTTGTCTGGAA
-CTGTCGGTGTTGGCTCAGTTGACGGAGCAAATGAGGAGGATGGTGTCGCA
-GATTCTTCAGTTGGTTTGGGAGATGATGGCGGAGCTGGCTGAGGTGGAAT
-TGGAGATGCTCTTTTTTTTGGGGTTACTGCAGACTGTTTGCTCTTCAAAC
-TCTTGCTCCGCGATTTTGTGCTCTTTTTTGTTTTCTTCTTTGGCTGCTTT
-TGTTGCTTCTTGCTTTTTATCTGAAAATTAGAGTTTCTAGGCAATCAAGC
-GATTTTCTAGGCCACCAGACATATATTTAGCCATGTCGGAATTTTCTAGG
-CCATCACAGACAGTTCTAGGCCATATAGAAATTTTCCTAGGCCACCTAAA
-ACTTTTCTAGGCCACCAACAGTTTTCTATGACCGCGATTTTTGCTAGGCC
-ACCAACAAAAGCAAATAACACATTTTCTAGGCCACCAACAGAATTTCAAA
-TTTTTCTAGGCCTTTAACTCACATATTTCACAATGGAAGCGGCGGCGAAC
-ACGATGAAGGCTACAATGAGAATGCCAATAATTATGAATATCACTACTTT
-GGTCCATGGCGTCGATGATGCTGCAAAAATGGAGGTACAAATATGCAAAC
-GCGCTCTACCGCACTACCAGTGCGGTAGAGCGCGTTTCAAACTAACAGCC
-AGAAGTTGGCGCCGGTGGTCGCTGAGTGGAGGTGGACATTATCAGGAAAT
-GAATGAGAAAATGGAGAAATTTGGGAAAATTGATTAGAGACGTGGGATTT
-TTTTTTAATTTTTATAATATTTTTGAGTAGGGGGAAGGGGTGAGGGTCAC
-GGAAAATACCAAAAATTTGTGATTTTTCCATTAAATTGGAGCAAAATTGA
-CACCATACCTCGTGGCCTAGAAAACTGCAGAATTTCTAGGCCACACACGT
-TACGTCATAATTTACCTGTTAAACCAGGTAACCAACAATCAAATCAAGAG
-TAATTAATCATCTCCTATCTTCTTTTATTTCTCCGTTCCTACTCCCAATG
-TTTTTTTTTTGTAATTTGTGATCACAAATTGTTGCATTTTGTAGTACGCC
-ATGTACGTCTGTGTACTACTTTTTTCTGAAAAGAATACAAAAATGTTCGC
-TTTCAGGAAAAAATAGTGAGAGGTAGAAGAAAATTACGGGGACTAGAAAT
-ATGTAAAAGTTCGACAACGTAGGCAGGTAGGCAGGTAGGCAAGTAGGCAG
-TTAGGCAGGTAGGCAGGTAGGTAGGCAGGATAGTAGGCTGCCAGGCATAA
-TAAAGATGCAGGCACGTAGGCGGATGTTGCAGGCATGAGAAGTCACGGGG
-GTAGGCAGGCATGTGGGTATGTAAGCAGATGTAGGTATGTTGCAGTCATG
-ATGAAGGCACGTGGGTAGGTAGGTAACTAGTTAGGCTGGTAGGGAGGTAG
-ACAGGTAGGCAGGCAGGCAGACGCGTAGGAAGAGTTAGCCAGGATGCAGG
-CACGTAGGCAGATGTAGGTATGTTGCAGGCATGCTGAAGTCACGTGGGTA
-GGCAGATTGGTAGATGTGTACGCAGAGTAGGTATGTTGCGGGTATTATGA
-AGGCACGTGAGTAGGTAAGCAGGCAGGTAGGTAGGCAGGCAGGTAGGTAG
-ACATGTAAATATGCAGGCATATACGTAGGGAGAACAAGCCATAATTCAGG
-CACGTAGGCAGATTTAGGTATGTTGTAGGCATGATGACGTAACGTGGGTA
-GGCAGATAGGCAGGTAGGCAGGCTCGTAAGCTGGCAGGCATAATAAAGAC
-ACATAAGCAGGCATGTAAATCTGCAGGCAGATACGTAGGAAGAGCAAGCC
-AGGATGCAGGCACGTAGGCAGATGTAGGTATGTTACAGGCATGATGAAGG
-CACGTGGGTAGGCAGGTAGGTAGGCAGCCAGGCAGGATCGGAGGTTGGTA
-AGCATAAAAAAGACAGGTAGGCGGGTAGGCAAGCATGTAAATGTGCAGGC
-AGATACGTAGAAAGAGCAAGCCAGGATGCAGGCACGTAGGCAGATGTAGG
-CATGTTGCAGGCATGATGAAGGCACGTGAGTAGGTATGCAGGGAGGTAGG
-TAGGCAGGCATGCAGGCACATAGGCAGATGTAGGTATGATTCAGGTAGGC
-AGGCAGGTAGGAAGACTGAATGCAGGCGTGTTGCTAGGCAATAGCGCCCT
-TTCCTTGTTATGACAATCTCGATAATCTAATAATAAGCTATTCAATCATA
-TCACTGCGCCGATACACAAACTACCTGTTTTTTTGAGTATGCGTCTCGTC
-CCGTCTGCCCAAAAGCTTCTACAGAGTGATTAGACGGTATAAGGGGGAGA
-GATAGGATAGATTTCAATCATTCTCACTTTTTTCGTCCCTTTCTCTGTCT
-TCCTTCTCCCTTTTTTTACAGGGCGCTTTTCCCTTTTTCGTGTGTGTGAA
-GAGAGAGAGTGCATACAGGTGTAGAGGACGCCCAGACATCGAGACGGAAC
-AGGATTCTTCATCGTCTTCAGCTATTTGGAAGAAGGAGTAGAAGGTGACG
-GTGTGTGTTTGGAGACGTGTAATCATCATGTCTTATAACACTTCCTTGCT
-CATTTTTCTCTGCTTCTCTGCCGTCTCTCTATCCACACAGTCTTTCGCCG
-TTTATCGATTATTACCCAAATCACAGACGGATTTTCAAGCTATACAGAGG
-TTATACAAAAATGCGACGGATCATGATGTGAGTTTTGTTTTCGCATTTTT
-GAGCAGATACAATTTCTAGGCCACGAAAAATTTTTCTAGGCCGTTGAAAA
-AATCACTAAGTTTTCTAGGTCACAATTTTGAGCAAGTTCTAGGTTATTAG
-ATTATTACGCCATGGTGCATTTTTCTAGGCCATCAGGAAATTTTGCAGGC
-CACCATGAGTTTTTGATGCAGTTGAACTAAGTTAGTGGCCTAGAAAAACC
-TTTGTTAGCCTAGAAATATTTTCGCCGGCCTAAACACATTTTTGGTGGCC
-TAGAAACACTAACTTTTGGTAGCCTAAAAATTTTCTGTGACCTGGAAACA
-TTGTTGGTGGCCTGAAAACATTTTTGGAGGCTTAGAAATATTCTTGGCAA
-TTTGAAAACATTTTTGGTGGCCTAGAAATATTTCTGATGGCCTAGAATGT
-TTTTGTGGTCTATAAATAATTTTGGCGGCCTAAAAAAATTTGGAATGGCT
-TAGCAAAATTTTTTTGGTGGTCTACAGCCATTTTTAACGACCAAGAAACA
-TTTTTGGTGGCCTGAAAACATTTTTGGTGGCCTAGAAACATTCTTGGTGG
-CCTGAAAAAACATTTTCGGTGGCCTAGAACCATTTTTGGAGACCTGGAAA
-TGTTTTGGTGGCCTAGAATATTTTTGGTGGCCTAGAATATTTTTGTTGGT
-CTAGAAATATTTCTGATGGTCTAGAATGTTTTTGTGGTCTATAAATAATT
-TTGGTGGCCTAGAAATATTCTTGGAGACCTGATAACATTTTTGGTGACCT
-ATAAATATTTTTGACAGCCTAAAAATTTTCGGTGGCCTAGAAATATTTCT
-GATGGCCTATAATGTTTTTGTGGTCTATAAATATTTTTAATGACCTAGAA
-ACATTTTTGGTGGCCTTGAAACATTCTTGGTGGCCTAGAAATGTTTTTGG
-TTTCCTAGAAACATTCTTGGAGACCTGAAAACATTTTTGGTGGCCTAGAG
-ACATTTTTAATGGCCTAGACACATTTTTGGTGGCCTAGAAATGTTGCTGA
-TGGCCTATAATGTTTTTGTGGTCTATAAGTATTTTCGGTGGCCTAAAATA
-TTTTTGGTGACCTAAAACATTTTTGGAGACCTGGAAATGTTTTGATGGCC
-TAGAAATATTTGTGCTGTGCTGAAACATTGTCGGTGGCCTAGAAATATTC
-TTGGAGACCTGAAAACATTTTTGGTGGCCTAGAAAAATTTTTAGTGACCT
-AAAAACTTTGGGAATTACCTGGAACCAATTTTGGCGACCTAGAAAAATTT
-TCCGTGGCCTAAAAATTCCCAATAATTAACAAATTTTTAGTTAAACTTCT
-GGAAAACGGGCAAGGACAAGCACGGGTTTTGGGATGTGATGGTGGATATG
-AAGAATTCGAAATATTTTTTGGACTTTCTACAAGTAAATGATATTTCTTA
-CATAAAGACGATTGATGACGTGGAGGGGTGAGCTTTTTCTGAAATTTTGA
-AAATTACATAAAGAATATGTGCTCTATTGATAAACTGTTAGGATCACCGT
-AAATCGACAAGAATCTCCGTAAATCCACAACGGCCCCATCTCAAAAATTC
-CTAGGCCACACGTGTGACGTCATTTTTCTTCCAGATTAATAACAAAGCAC
-GAGAACAACAAGACCCTCTCGAACATGTTCCCCCGTCTGTGGGATGACTC
-CTCGTCTGCTCACTATGACTTCCACACCTATGGATCCTATCAGCGAATGA
-CTGATTGGATGAAGCAGCTGGTGGTGAAGTATCCAAAGATGGTTCAGTAT
-ATATCGATTGGAAAAACTACGGAGGGCAGGAATATCGATGGAGTTGAGGT
-AGGTCTAGAAGGCTGCCTTAGGTCTAGGTCTAAGTCTAGGTTTAGGTCTA
-GGTCTAAGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGG
-TCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTC
-TAGGTCTAGGTCTAGGTCTAGGTTTAGGTCTAGGTCTAGGTCTAGGTCTA
-GGTCTAGGTCTAGGTCTAGGTCTAGGTCTATGTCTAGGTCTAGGTCTAGG
-TCTAGGTCTAGGTCTAGGTCTAGGTCTAGATCTAGGTCTAGGTCTAGGTC
-TAGGTCTAGGTCTAGGTCTATGTCTAGGTCTAGGTCTAGGTCTAGGTCTA
-GGTCTAGGCCGATTTCGATTTCTATGTGTATGGCCTATAGTGATTTTCAG
-ATCGGCGGAGACTCCCGCACCAAAAAGATTTTCTGGATCGATGGAGGTAT
-TCATGCTCGAGAATGGGCGGCCCCGCACACGGCTCTCTTTTTCATCCATC
-AGGTATGTGATCCCGCCCCGTCAGAAAAAAGTGTGTTCCGATTAGTTCCG
-CTTGGATTACACAAATGTTGGCAGAGACAGAAAAAGGGAAAACTTGATAA
-CAAATGGGTTGGAAAAAACGTAATCGGATGATGCAATCGCGCTCTATTGC
-ACTACCTCAACAAAACATTTTTTTGCAGCTTACCTCCCGCGCAAACGAGC
-CCGGAATCAAGAAATTGCTGAACGAGATCACATTTGTAGTGGTTCCCTGC
-TTGAATCCAGATGGCTATGAGTTCACGAGATCCTCCACAAATCCACATGT
-AGGTTGGGGTAAGGTTACTGTACCCCCCCCCCCCCCCCTCCCCAACTCAA
-AGGCGCAAGCACTCCCAAATTTTTTGCAGGTTCGTCTGTGGCGTAAGAAT
-CGCTCGAAAATGCAATGCCGTAAGGACATTTGGGGACGCAATCGCTGCTG
-TCGCGGTGTCGATTTGAATCGTAATTTCGATTTCCACTTCAGAGGTGAGA
-GAGAGAGGGTGAAGTGGTTTTTCTCAAAGTGGACTTGAAAATTAAGGGTC
-AAAGTTTTAAAAGAAAACTTTGAAAAAAACTTGGGAATTTGTTCACGAAT
-ATACGAAGTTGCTGAAAATTTGTAAAACGTTTTGGAACATTCTAAAACTA
-TTTGAATTTAAATAATTTTTTAAACATACCAAAAAATCATGGATGTTCTC
-AAAATTCACGAAAGTTTCGAAAATTCCCTACAGTACTCCTGAACTAGCCC
-TACAGTATCCTTAAAGTACCCTACAGTACCTATACAGAACTCCTGTAGTA
-CCCTTACAGTATCCCTAAAGTATCCCTACAGTACCCCTACAGTTTCCCTA
-TAGTACCCCTACAGTACTCTCGCAGTATCCATACAGTAGCCCTACAGTAT
-CCCTACAGTACCCCTACAGTATTCCTACAGTACCCCTACAGTAGCCCTAC
-AGTACCCCAGTAGCACCCTTACAGCATCCCTAAATTATCCCTAAATTATC
-CCTACAGTACCCCTACAGTACCCCTACAGTACCCCTACAGCATCTCCATA
-GTACCCCTATAGTAGCCCTACAGTATCCCTACAGTTCCCACACAGCCCTT
-ATAGTGCCTATACAGAACCCCTATAATACCCCATACAATACACCTACAGT
-ACCCCTACAGTATCCGTAAATTACCCCTATAGTACCCCTACAGTACCCTG
-ACGGTACTCCTACAGCACCCCTACAGGACCCCTATAACATCCCTACAGTA
-CCCCTGCAGTACCCATACGGTTTCCTTACAGTATCCCGTGAGTATCCCAA
-CAATACTCTCACAGTACTGCTACAGTACCCCAAAAGTACCCCTACAAAAC
-CCCTACAGTACCCCTACAGAACCCTCACGGTACCCTACCGTATCCCTACA
-GTACCTGAAGCTCCAAAAATTTCCCCCACTTCCAGAAAGCGGTACAAGCG
-ACGACCCGTGCTCCGAGATCTACCAGGGACCCTCTCCATTCAGTGAGCCC
-GAGGCAAAAGCCGTACGGGACGCGTTGTTGTCGCAGAGATATAAGGGAAG
-AACCGACGCCTATATCACACTACACACTTATTCACAGGTACTGTTAAGCA
-GTTGAAAACTTTTTCTCGGCCACCGATATTTTCTCGGCCATCGATATTTT
-CTCGGCCATCGTTATTTTCTCGGCCACCGAAATTTTTCGCGGTCATCGAT
-ATACTCTCGTTCACGGATATTTTTCCCAGCAACAGATTTTTTTCTCGGTC
-ACCGATATTCTCTCGGCCACCAAAATTTTGTTTTTCGTGGCCATCTATAT
-TTTCATCGGCCATCTATATTTTCTAGGCCACCAATTTTTTCTCGGTCTCC
-GATACTTTCTCGGCTACCAACTTTTTCTCGGCCACCAACTTTTTCTCGGC
-CACAGATTTTTTTCTCGGCCATTAATTTTTGACGGCCACCGAAATTTTTT
-CGGTCACCGATATTTTTCACGGCCATCGATATTTTTTGAAAATTTGATTT
-GAGCAAAATATTTTCAGATTTGGATTCATCCATATGGTCACAAGAAGGAT
-GCATATCCAGGAGATATTAAGGATTTGGTGAGTGATGACGTCATTCTTCT
-TGAAACGTTGAAACTCAAATTTCCAGTACGAAGTTGGCAAAAAAGCTGCT
-CAGGCTCTGAAACGGGTTTACGGCACAAAATACGTAGTCGGAAGCGGTGC
-GGACACGCTCTACCCGGCGTCTGGAGGATCTGAAGATTGGGCAAAGCACG
-AGGCGAAGGTCAAATTTGTGTACCTTCTAGAATTGAGGCCCGACGAGAAA
-AGTAAAAAAAAAACGTTCAAAGTTGCTGAAAAAAGTTGGGCGATAATTTC
-AGACTGGGATGGGTTCATACTGGACGAGAAGGAGCTGATCCCGACGGCTC
-GGGAAACTTGGGAAGGTGTCCGAGTTGTGGCGGAAGCTGTGCTCGATCGG
-ATAGTTGCCGGCAAGTCGACGGCTCCAAGAGGTAGGCAAACTTTGATGTG
-CCTGCCTGCCTTGTGCCTACAGTTTTATTACGAGTAGGCACGGAGGTAGG
-CAAGTAGGCAGGCAGAAATGTGGACCGATAGGCGTAAGGTTAAGGGCTTG
-CGAAGCTTTTGCGTAGGATTGCGAAGAAAAAGAAAAATTTTTAAATTACA
-GTGCGCACGGCCTAAAGGAGATGGCTTCTGAGGTAGTCACTACGATGCTC
-CGCTTGCTCTGACCACGCCCCTTTCCTGGTTTCTCGATTTTTGTTTTAGA
-AATTACACTTGTTTATTTTATGATTGTTGATAAATGTTTTTTTAAACATA
-ATTTTTCTTGAAAAAACAACTTACAATTAGAGAAAATAGCAGCGAGCGGT
-CGTGGCCGCGAAATGAAAAACTCGGCCACCAGCTATAAAATTAAAACGTA
-TAATAATTTGGTGGTTCAGTTTTGCAGAAAAAAAATGGCTGGCCGAGTTT
-TCACGTTTCTAGGCCATCTAGCAAAGTTGCTCTGAAGCGCTTTCGCGAAT
-TCGTTTCCGAAAAAACTGTAGGTGAAAACTCGACCACGCTTTCTTAAAGC
-CACGAAATTTTGAAATAATTTCTCGGTCACCAATTTTTTCTCGGCCACCG
-ATATTTTCTCGGCCACCGATATTTTCTCGGCCATCAAAATTTTTCTAGGC
-CACCAACTTTTTCTCGGCCATCTATATTTTCCCGGCCTCCGACATTTTTT
-CTCGGCCACCGATATTTTTCGCAGCCGTCTATATTTTCTTGGCTACCAAT
-TTTTTCTCGGTCTCCGATACTTTCTCGGCTACCAACTTTTTCTCGGTCAT
-AGATATTTTTCGCAGTCATCTATATTTTCTCGGTCAGCGATATTTTCTTG
-ACAACCCATGTTTTTCTCGGCCACCGATATTTTTCTCGACCATCTATATT
-TTCTCGGCCACCAAAATTCATTCTCGGCCACTTATATTTTTCTCGGCCAC
-CAATATTTTTCTCGGCCACCTATATTTTCTCGGCCACAGATTTTTTTCTC
-GGCCATTAATTTTTGACGGCCACCGACATTTTTTTCGGTCACCGATTTTT
-TCTCCGCCATCTATATTATCTCGGTCACCAATTTTTTTCGGTCATTGATA
-TTTTCTCGGCCACCAATATTCTTCTCAGCCATCAATATTTTATCGTCCAC
-CGATATTTTATCGGCCACCGAAATTTTTCGCGGTCATCGATATACTCTCG
-TTCACGGATATTTTTCCCAGCAACAGATTTTTTTCTCGGTCACCGATATT
-CTCTCGGCCACCAAAATTTTTCTCGGCCACCGATTTTTTTTCCTGGCCAC
-AGATATTTTTCTCGGCCTCCGATATTTTTCTCGGCCACCGATATTTTTTC
-TCGGCCACCAATTTTTTTCTCGGCCTCCGAAGTTTTTCGTGGCCATCTAT
-ATTTTCATCGGCCATCTATATTTTCTAGGCCACCAATTTTTTCTCGGTCT
-CCGATACTTTCTCGGCTACCAACTTTTTCTCGGCCACCAACTTTTTCTCG
-GCCACAGATTTTTTTCTCGGCCATTAATTTTTGACGGCCACCGAAATTTT
-TTCGGTCACCGATATTTTTCACGGCCATTGATATTTTTTTCGGTCACCGA
-TACTTTCTCGGCCACAAATATTTTCTCGGCCACCGAAATTTTTCGCGGTC
-ATCTATATTTTCTCGGCCTCAGCCATCGATATTTTTCTGGACCGTCTAGT
-TTTTTTTTGGCGGCCGTGACCTCCAAATAGAATTACAAAAATAAACGATA
-CATCTCATATTTCTGTGCAAATCCTCAAGTACCCCCCCCCCCCCCCCTAT
-ATTTATTGTTCCAGAAGCCCCAAAAGCTCGCGGATTCCGATTCGGCGACG
-GCACCGAAGGATCATGTTTCGATGTCCGACACGCGTGCAAACGATGGGTT
-CAGGAACGGGAGGAGCTGTGCAGGACGGTGCCAATTTTCATGCGCGAGAA
-CTGTGCCTACTCTTGCAATTTCTGTTGATTTTTTTGGTGTGCCACTTCTT
-TTTTTCTGTACATATATCCATTTTGTCTTCTACATACATATATATATGTA
-TATGAAATGTTTAAAAACCTAAAACCTAAAAAAAAACCAACCTAATACAG
-TGTTCACGAGCGCCCCCCGCCGCCGGCGGCTCCTTATTTGCCTTGTGCTC
-ACCGTGAGGTGGCTCCGCGCGGGAGCCCCAGTGATGAGCATCTCTTTTGT
-CCACACGAATAATACAATAACACGGGCTCCTCTTCAAATATGACAAAATG
-TCAAATTTTGGCGTCTCTCCTGACTTGGAGCTTCTGGGTCTTCAGACACG
-TTCTTGTGTGTGAGGCGAGATGCGATTACCCTCTATATTATTGATTTTTG
-GAGCATTTTTTGGTTTTCTAGGGGCTATTCATAATACAGATGATAATGCC
-GGCTATCATAAGTAAGTCCCCAAAATACCCATATGGCCTAGAAATTCGGA
-AAACTCTTCCATTTCACTTTTGGTAGGGACATTTGGTTTCTGTGCTAGCT
-TTTATGCTGAACATGGTAATTTAAATTTCCTAGGCCAGTGTATATGTTTT
-TCTAGGCTACGACATACAATTTTTTAGGCCACAAAATATTTTTTTTTAAT
-TGCGGCTTATAAAAATGTTCCATAAATTATCTATTTTTGAATTACAGTCT
-GAAAATTTCCATTTTTCAAGGGCACCTTTCTAGGTCACAAAAACGGATTT
-TTTCAACATAGGCATTTTTCAACTTTTTCTAGGCCACGACAGATGGAAGA
-GCTTTTCGTAAAAAAAGCTCGGCCACCACCCCACCTAACCAAAAAACTTC
-CAGCTTCAAACTAATCCGAATCAATCCGGAAACTGAAGGAAGTGTGAAAT
-ATCTTCGAAGTCTGTACGAGGATCCCTCTCCGTACGAGCTGGATTTCTGG
-CAGCCTCCTACGAATATCGGTTAGTGTGACTTACCCACGTGATGTTAGCG
-TGCTCCATTTTAGTTTGATCTACGTAGATCTACCAAAAATGCGGGAGAAG
-AGACGCAAAGTTCTCAACTGATTCTGCATGGTTAAGAACGCACTGACGTC
-ACATTTTTTGGGAAAAAAATTTCCGCATTTTTTGTAGATCAAACCGTGAT
-GGGACAGTTTGCCACCACGTGCTTACCCAGGAAAATCTGAAATTTTTCGA
-ATTTTCAGGAGCTATCGTAGACTTGACAGTTGCTCCGGCGGATGCTCCAA
-GATTTGTGAAGGATTTGGAATCGAAGAAGATCAGCTACATCGTGGCGGTT
-AATGATTTGTCAAAGTTCGTTTTTTTTTCTAGGCCACGGCCATCTGTGAC
-GTCACTAAACTAGTTTCCAGAGCAATCGAAAACGAGCGCGGAAGCGACAA
-ATTCTACAACCCGGTCGCTGGTTTTGCATACGACAAGTACAACAGTTTGG
-AGGAGATTCAAACAGAAATGAAGCGGCTTAAGAAGGAATACCCGACCATG
-ATCACGCTTATCGATATCGGACAAAGTCACGAGAATCGTACGCTTTTGGT
-GATGAAGGTAAGAGCGAACGCGCTCTATTGAGTGGGCGTGGTCACGTCCA
-CGTTTTGCAAAGTGGGCGCACGGTTCCTTTACAGCGGTCCCAGCTTTTGA
-AGTTTTGAGTAATTTTTATATGGGAATTGCTAAAATTCATTTAAAAAAAA
-CCCAAAAATACTTTTAAAGTCGTAACGAAAAAAAACAACCGTGCGCACGT
-CTTGCAAAAAGTGGGCGTCCCAAAATTTAAAAACGACGGAATTTCATTAT
-TTCAAACGCTCCAAACTCATTTTCACTACAAAGACATCACGCGCCTCCTG
-GGAAAGCCCTTACTCATTTGCTGGATATATGACGTCACTAAATTAGTAGA
-TGTGTGAAACCGCGCTCCATTGTACTACGCAACACCGATCCCACGTGGTG
-TCAAAGTGTCCCATTTCGGTGTGATCTACCATAAATGCGGAAATATTGAC
-GCGGATTTCTAAACAGATTTCGCATGGTTAAGAGCGTGCTGACGTCACAA
-ACTTTTCTCTGCAAGAAATTCCCACATTTTTTGTAGATCACACTAAAATG
-GGACCGTTTGACGCCACCTGCGCTCTCACTTTCAACACTCCCATTAAGCA
-TTTCATGTACGCGCCAAAACGCACGGATTTCTGGCTCCCCTCATAAATTG
-AAATGGAGTTTGAAAAAGAGTTTGCCGAACTAGGTCATTTTGGCTCGGCC
-ATATTTGGGGTAGATTTTCGCCGCGTTGCGTGTCGCGTCGCGGCTCAATT
-TAAGTTGTAAATCTAAATGTGTTTGTCCGTGTGGAGTACCCGACTTTTCC
-ACGCGTTGCCCGGAATGCTATTGTCGATGGAGCGCGAAAAATTCAATAAG
-GAAGGCCAGAACCCCGTGAAAACGCCTGCCGCGCCCCCGCCTGCCTTGCA
-GCGCGGAACCCAAAAAGTGTCGGCCGCGGCGAAAGGCCCTCGCACTATGT
-GGTGTTAATACCTAGCTATTGACTTATCGCCATAGTGTAAAAAAACCCAA
-ACTCCCAAATTTTCAGATAACCGGAAAACGAAACCCCCTCGGCTCGAAAA
-TCTCCATGTGGATTGACGCTGGAATTCATGCTCGAGAATGGATTGCTCCG
-GCGACCGCAATGTACATTGCTCATGAGCTTCTCCTCGGGTATGAAAACGA
-CGCGACGGTGGCTAAGCTGATGGACCATATCGATTTTTATATTCTACCTG
-TGATGAATCCAGATGGATATGAGTATTCCAGAGAAAAGGTTGGTTTTTGA
-ACCTTAAAAAAGCCTTAAAACTAGTGCTCTATTTCAGAACCGCATGTGGA
-GGAAAAACCGGAGCCCCGCAAAATGCGCCCGGCAAACTTTCAGTACGGTC
-TGCTGCTCTGGAGTCGACCTCAACAGGAACTTCGATTGGTTCTGGGCCTG
-TAAGTCACGTGGTGTGAGAAAGTCTCATTGAAGTTTGATCTACAAAAAAT
-GCGGGAATTTTTTGTAGATCAAAGCGAACTGGGACTTTCTGACTCTACGT
-AGTTAGCTCAATATTAGACCTTAAAAAATAACTTAATCTTAAAAATTTCC
-AGCCACCGGTTCGTCTTCGGATCCGTGCCACGACACGTATCACGGCTCGG
-CGGCCTTCTCGGAGCCTGAATCACAAGCTGTCAGGGATTTCCTGGAGCAA
-AACACACCCGAGGCGTTCATCTCGCTGCATTCCTACTCCCAAATGTGGTT
-GATACCATATGGACACAGAAAACAGAGTTATCCACAGGACTACCATACTG
-GACTGCGGCCATTGGCTCTGCGAGCAACTAAGGCGTTGTATGAGTTGTAT
-GGGACGAAATATCAAGTCGGGACCGGCGCTGATTTGATGTGTAAGTTAAT
-ATCCTTTTTTTCGAATTTTTAAATTTCTAAGGATTTCAAGAAATTTTAAA
-ATTTTGAAAATTAAAAAAACAATTTTTTTCGGAATGTTTAAAAATTAAAA
-AAAAAATTTTTTTAATAGATTTTTTAAAGCTTTTTTTTGGAAAATTTTGG
-ATTTCTGAATAATTTTTTTTTCAGAACTGGAATTTTTGAGTTTATTAAAG
-ATTTTTTTAGGACTTTTTAATTTAGACATTTCCTGAAAAATTTTTAAATT
-ATTAAAATTTCGAACTTTTTCGATATTTTCGGATTTTTTTGCAACCTGAA
-TTTTATTTTTTTTTTGGATTTATTGGAATCAGGGGTGGGCAGCAAGATTT
-TTTCCGGCAAATCGGCAAATCGGCAATTTGCCGGAATTGAAAATTTCCGC
-CAAATCGACAATTGCCGGAATTGAAAATTTCTGGCAAAACGGCAAATCGG
-CAAACTGCCGGAATTGAAAATTTCTGGCAAACCGGCAAACAGGCTAATTG
-CCGATTTGCCGAATTTATCGATAAATCAGTTTGCCAAACGGCAATTTCCC
-CCACCCCTGATTGGGATCTTTGAAATAAAACAGGAAGAAATTTTAAATTG
-TTGGAAATTTTGTAATTTTCCGGAATTTTAATAAAAAAATGCTGAAAATT
-CTAAAAGTTTTGGAACTATGTAAAATTATTTGTGATTTAAAAAAAAACAT
-TTTTTGGACTTTTCTGAAATTTCACGGATTTCTGGCTTCTCTCATAAATT
-GAAATGGAAGAGTTTTTGCCGAACTTGGCCATTTTGGCTCTGCCATATCT
-GGGATGGATTTACGGCGCGCTTCATGTCGCGTCGCGGCTCGTAAAACTAA
-ATGCACTTGTCCGTGTGGAGTGAGGAGAAAATTCAATGAGGAAGGCCAGA
-ACCCCGGATTTTTGAAATTTTGAAGTTCTGAGAAACCTGTGACTTCTACA
-CTAACCCTGAAGAATTTCAGACGAAGCTTCTGGAGGATCACATGATTGGG
-CTAAGGGGCAGCTTAAGGTCCCCTATGCCTACCTGATTGAGCTCCGACCA
-AAGAACACCATGATGGGGTAAGCAGGACGATGGATCCTATCAAAATTAAA
-ATTTCATTCCAGCCACGGCTTCCTTCTCCCCGAACGAGAAATTGTGCCCA
-CTGGACTGGAAACCTTCGAATCCATCAAAGTGGTTGCCGACGAGCTTGTG
-GCGCAATTTGTGGAACCTGTGATTCGAGCCAAGCTGACCACAACCACAAA
-GCCCGCAATCCCACCGTATCGGCGTGGGTACTCTATAATCGACACCACAA
-CTATGGAGCCGGTCGATGAGATTACACAGAAGCCTACAGAAGCTCCAACC
-ACAGAGGAGCCCACCACCACTACTACGGAGGAACCTACAACTACCACAAC
-GACCGAGGAGCCTACCGAAGCCCCAACAGAACCCAGTCCGACTACTGTCG
-AGGCCACCGAGGCTTCTACAACACCAGAAGCTTCCACATCCTCTGAGACA
-AGTACCACAGAGAATTCTGAACCCAACCAGAAGACATCCACACCAGTGGC
-ACCTGAAGCAAGCACCGTTGAGGAGGTTGGTTTTTGGCTTAGTCTCAGGC
-TTAGGCCTAGGCTTAGGCTTAAACTTAGCCTTAGTCTTAGACTGAGGTTT
-AGGCTTAAGCTTAGGCTTCAGCTTAGGCTTAAACTTAGTTTTATCTTAGG
-CTGTGGCTTAGTCTTAGACTTAGTTTTAGGCTTAAGCTTAGGCTCAGACT
-TCGGCTTAGGCTTAGGCTTAGAATTAGGCTTAGTTTTAGGCTTAGACTTA
-GTCTTGGGCTTAAGCTTCGGCTTAGGCTTAGTCTTAAGCTTAGGCTTAGG
-CTTGCACTTGGGCTTGGCGTCAGTGGCGAGCGTGAGCTATTTAGGGTTTT
-ATGCTTAGCTTTAGACTTAGGCTGAGGTTTAGGCTTAGGCTTCGGCTTAA
-GCTTAGGCTTATGCTTAAGCTTAGGCTTGGACTTAGGCTCATACTTAGGC
-TTAGGCTTAGGCTTGCACTTGGGCTTAGGCTTAGGCTTATGCTTAGTTTT
-AGGCTTAGATTTAGGTTCAGGCTTAGGCTTATACCTAAGCAAATACATTT
-TTGGAACTATTTGGATATTTGCCAGCGACCTATTTTATCAACTTCGAATT
-TCCCAAACCATTCCAGGAAACAATCACACCGATCAAATGCGTCGACTACG
-GTGACTACTGTCGTCTTTGGGGAGTCTTACAGCTCTGCTATCGGGATCAG
-GTCTCCAAGTTGTGCCCCAAGACTTGCGACTCGAGGTGCTCTTTTTCGGT
-GTGAGGCGCACGCTGGAAACTATCGTATGACAAATTGTCAGCTTATGTAT
-GTATAAATGATTTCAAACTTTTGTAATTGTGGACTAAAAACTACATTTTT
-CATGCCTGACTGACTGCCTGGCAGCGTGTCAGCGCCCGACATTTTCTGAG
-TTCCACGACGGGATCCTGGCAGGCGTAGGCGTGCAATTTTTAACTCATCA
-AATTGCTTGGAATAATTAAGCACTGCTACAAATGATGTCACTAGCTACAA
-ACTACAAACTAGGAATTTCACACTACAAACTACAAACTACAATCTTAGCT
-CTTCAAGCTATGAAATACAAACTAAGAAATTTTTATTTTTCAATATTTTT
-TAAACGAGGTGTAATTATGGGCGTATATAGTAAAAACTGGAACGACAAAA
-TGCAAATCACAAACTACAAACTAGAAACTAAAAACTAGAAACTGCAAACC
-ACAAACTACAAACCACAAACTACAAACTACAAACTACAAACTACAAATTA
-CAAACTACAAGCTACAAACTACTGAACTCTGAATAAATTTGAACGTGTAA
-ATTTTGCGTTTTTGTGCAATGATTGGACGTATGAATTGCGAAACCATAAG
-TGTTTAATCACATACTACAAACTACAAACTACAAACTACAAACTACAACC
-TAGAAACTACAAACTACAAACTACAAAATATAAATTACAACCTTCAAGAA
-ATTTGTATTTTTCAATATTTGTCGAACAAGTTTTAATTATTCGACGAATA
-AAGTCAAAGCTGAAATCATAAAATGCTAACCACAAACTACAAACTACAAA
-CTACAAACGGCAAACTACAAGCTACAAATTACTGAACTCTAATAAAATTT
-GAAAGTGTACTCATGGTTTTGTGCAATTACTGGACGTATGAATTACGAAA
-CCATAAGTTTTTAGTCACACACTACAAACTATAAATTACAAACTACAAAC
-TACAAATGAAAACTACAAACTACAAACTGGAAACTACAACAGCAAACTAC
-AAACTACAAACTACAAGCTACAAACGCTTATATAATTCGATTTTAGTTAT
-TTTCTGTTTTTTATTTTTCCAAATTCTCAAACCTGAAATAAAATTACCTA
-CACACAAATGTTTCTCATTATGCATCGAATGACTAATATTTTCCAATAAA
-CGTTTTGAAAAAGTATGGAAGAAACAAAAAATGGAAAACAAAGGCGGAAA
-TATGCATTTTTCTTCTCATTTTCTTGAAATTCGTGTGATTGTACTTATTG
-ATTTTTTGTTGTTGTTAAAAACGTGGTAGGCAGGCATTCATGCCTACGTG
-CCTGCCTACCAGTCGAATTCGAACCCGCAAGATGTCGGCCGCTCCCTTCG
-ATTTTGGAAGTTTTTACTTATTTTCCTCTTCTGCTAACACATTAGACAAT
-TATTATTCAACCCGTGTACACAATAGGGCGGCTAATAATTAGGTTGGCAG
-GTAGAGGTGTACAGGAAACGTTTATAAGCTCTTTATTTACTACTGAGCTA
-CCACTTATTTGGAGCCAATGCATTTTGTTTCTCAACAAGTTGGAGATTCC
-AGAACAACCAAGATTTGGGCGGGGCTTATTTTGAGGCAATTTTTCAACTG
-TACAGTAGATTCATATAATTTAAGTTTTGAAAACATTTAGGCGGGAATTC
-AAACATTTATTTTTAAAACCATCTTGGCGGGAATTCAAATTCTAGTTTTT
-CGAAAACACTTTGGCGGGAATTCAAAATGTTATTTCTTAACAACTTCCTG
-AAATGCTCTAGAACCTTCTGGAATATTTGAGAAAACTCTAGAATGTTCTA
-GAACCTTCTGAAAAATTCGAAAAAAGTCTAGAATGTTCTAGAGCCTTTTG
-GAAAATTCGAAAAAAATCTGGAATATTCTAGAACCTTTTGGAAATTTTGA
-GAAAATTCTGGAATGTTTTGGAACCTTCTGGAAAATTCGAGAAAATTCTG
-GAATGTTCTAGAACCTTCTGAAAAATTTGAGAAAATTCTGGAATGTTCTA
-GACCCTTCTGGAAATCCGAGAAAATTCTGGAATGTTCTGGAACCTTCTGG
-GAAATTTTTAGAAAAATCCTGGAATTCTCTAGGACCTTCTGGAAAATTTG
-AGAAAATTCTTGTCGCCAAAGTTTTGTGAAAAAATTTAGCTGGAAACTAA
-ATAATTTTGTGAGAATTCAAACTTTAATTTTTCCAATTTTTTCGGATTTT
-TTTTTTAGCTTTTAAGCTTTTTACATTTTCTATAAATTTTAGATTTCAAA
-AAAAAATTGGCGAAAAATTTTGACCAAATTTTTTGGCTTTATAGCATAAT
-TTCAAAAAGTTTAAAAAGTCCAAACTTTGCTCCAGTCCCCAAAAAAAAAT
-TTGGTGGAAAATTCAAATCATGTTTTTTTTTCAAAAAATTTCATGGCCTA
-GAAATTTCAGCAAAGCAGTAAGGCCGCCTACCTCCCTTCAATCCGAAAAA
-TACCTAAAAATCAATCCCAAGCAATTAGTCTCATCAAGAAAGAAAAGAGC
-TCTGCTTGTGCCCACTCCTCATCTCTTCTCATGTATTTGCTTTCAATTAA
-ACATCTTACTCAGACAGCATAACGAAGGAAACAAAAAACGAAAGAATAAC
-GAAATGAGCATATTTCCTTTATTTATTCCTTATTTATGTATTCAGGTAGA
-ACAAAAAACCGGCTCGGCGGGTTTATTTGTCTGTAAATCTTATGCCTACA
-CGCCTACCTACAGCGGCCCTGACTGCCTATTTGCCTAGTGTTTTTTGTCC
-TTTTCGGTTGGTTTTTTTGAAAATTTTTCCTGATTTTTTTTGTCGTTTTT
-TTTCCATTTTTCTGAATTTTTAGGAATTTATGGAAGTTTCTCTTTTTTCT
-CCCCCCCTCGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC
-TAAGCCTAAGCCTAAGCCTAAGCTTAAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCTAGGCCTAAGCCTAAGTCTAAGCCTAAGCCTGAGCTTAAGCTTAAG
-CCAAAGCCTAAGCCTAAGCCTACTCCTATGCCTGAGCCTAAGCCTAAGCT
-TAAGCCTAGGCCTAGGCTAAAATAAGCTCGGCCCCTTTCTGGGCCAAAAT
-TTCATGTACCTCCTAAAATTGTTTCATCCTAAATAGCCAAAAAACTTGGA
-AAAATCTATTTTTCAAATTTTGTAAAAATGTCAAAGAAAAATTCTCAGAA
-GTGCGGGAAAGTTTGACCCAGAAAGGGGCGGAGCCTATTTTTGGATAGGC
-TCCACCTCTTTCTAGGTTTTTTAAAATCAAATTTAGGTGTTTCCTGGTAA
-GTTTTAGTGGTTTCATTTTTTGTATTCATCACATTTCTTTTTCATTTTTT
-ACATTTTTCTCATAATTAATTTTTGATCTACCTGTTGAACTTGACCCCGC
-CCCCCAATCTTGGTGCCTCAAAGGAATCGGAGGAGTCTAGTCAACAAGGT
-AGATCAAAAATAGAATATGAGAAAAATTTGCCATCGTGTTTTTCGATAAT
-ACTACAGTTTCATACAATAATCCCACAACTTAAAATTCAGCAAATAACCA
-GGAAATGGGCGTGGCTTAGATTTTCAAGGTTTCGTTGTTTTTTCCAGGTT
-GTACTTCTGATCTGAACGGGCTCCGACAAAAAATGCACAAAATTCGTAGT
-AGTGATGTGTGACGTCTGTTCTGATGACTCGAATTCATATTATAAAAGTC
-GAAAAATTCCTTCCGAACGAACCCCCCATCATCCTAACATCATCCAGATT
-TCTGCACCCGCCCGCTCATATAATCTGCTTTTCTTCACCCATAATCTTTT
-TGCTTATTTCTCAATCTCCGTCTTTCTTGCGTTTTTAATTAATTCAAGAA
-ATCAAGCAGTTGTGGTTAATGGCGTTCTACGAATTGCTTTTTTCTTGTAT
-TATGATATTTTAATTAATTTTATTTATTTAGTATCTAGGCATGTACATGT
-GCAAGTTGAGTTGAATAACCTGAAAATTTTGTGCCAAGTTATGGGCGGGG
-TCTTTCATACATTTTTTAAATTGTTTTTTGGCTAAATTTGTATGTATTTG
-CTTTGAAAGTTGTGTTTTTTTTCAATTTTCTTTAAAAAAAAACCAAAAAA
-AAAAATTGGTATGTAGTAACGTAGGTAGGCAAGAAGTAGGTGTGTAGGTA
-GGGACTTGAAAATAGCAGCTATGAATAGGTGCGGTATTTGAAGTTTAGGC
-AGGTTCGTAGGCAGATAGGTGAGTAGAAAAATCATTCAGAAGACATTCAG
-GTAGGCTCACTGGTAAACAGGCATAATGTAGGTACGTAGGTTAACACTTA
-CGTACGAGGCAGTAGGCATCAGGGCTTTGTGGCAACCGGCAACCGGCAAC
-CAAAAACCAGGTTGCCGGTTACCGAAAAATTGCCGAAATTTCAGCAACCA
-AAAGTCGCCAGAATTTTCTCGAATTTTCCAAAAGGTTCTAGAACATTCCA
-GAATTTTCTCGAATTTTCCAAAAAGTTCTAGAACATTCCAAACTTTTCTC
-AAAGTTTCCAAAAGACTCTAGAACATTCCAGAATATTCTCGAATTTTTCA
-GAAGGTTCTAGAACATTCCTGAATTTTCTCGAATTTTCCAAAAGGTTCTA
-GAACATTTCAGAATTTTCTCAAATTTTCCAAAAGGTTCTAGAACATTCCA
-GAATTTTCTCGAATTTCCCAAAAGATTCTAGAACATTCCAGAATATTCTC
-GAATTTTTCAGAAGGCTCTAGAACATTCCAGAATTTTCTCGAATTTTCCA
-AAAAGTTCTAGAACAAGTTGCAGAAATTTTCAGCGTACGGCAACTTCAGC
-AATTGCGGGTTGGCATGTAGGCAGGCAGGCATGTTAGTAGGCAGTTTTGA
-CAGTTTTGAAGTTAACAATCCTACCTGATGCACAAGAAAATGCGCGGCAA
-TTGCGGACCGGCAATTCTACAAAATGAGACGGTTGGGCATGTTCTTCCGA
-TATTTTTTATAAAAATTTAATGATAAAGTATAGAAAAATATTTGTTTTAT
-TTGAAAATAAGTTTTATTTGGCTAGGAACAACCGAAAAAGTGCTCAAAAA
-TTGTCGGAATCTTGAAAATTGCCGTGAAAATTTCCAACATTTCGACTATT
-TCTGGAGATTTTTACAATTTTGTCTATTAAAAAAAAACAGTTACTTTCAA
-ATAAAGCAAATATTTTTCTATATTGTGTCATAAAATTTTAATGAAAAATA
-TCGGGGGAACATGCCCAACCGTCTCATTTTGTAGAATTGCCGCGCACCTT
-GTTAGTTTATCCCCGTAAACCTCCAATCAATAATTGGCAGGAGTCCTTCC
-GTCCGTCCAAAACGTCATAAAAACTGGAGATGGCAAAATTGGAGATGTGC
-CAAGTTTGCTGGAGAGGTGGGGGGAAGGAGACAATCATGTTGTCTGCGTA
-TCTCCAGACTCGTCTGCTATCTCTCTTACCCGGCAAATGGGACCTCCCCA
-GAACGGTGATTTTGTCCTTTCAACACCTTTTTTGTGTTTTTGTTTGTTTG
-ACACCTTTTTTTCACTACTTTGCGGGAATTTAGACTGATTTCTCATGGTT
-AGAAACGTGCTGACGTCACATTTTTCGCGGGAAAAAAAACCCGCATTTTT
-TGTAGATCAAACCGTAATGGGATAGCCATTCTAACAATTCACTGTTTTTT
-TTCTGAACAAGTCTGAAGTTTTGAGTTCAGCACCCGCAATTCTGTCTCTG
-ATAAGTTTGAAAGTTTCAAATTGAAACCTCTCAATTGTCGGACCAGCGCG
-CTACTTCATCATACCCCGCAAATTGAACTGCTCGCGGCAAAATTTAAAAA
-TTGATGCTTCTCCAGAAACATCCCACCAGAAACTACCTAAGACTGAACTT
-CATTAACTTCTTTTAAACTTAAACAACGATCATAATACCTTAAAAAAAAC
-GTTTGTACGTGGTGTCAGAGTGTCTCATTTCATTTTGATCTACATAGATC
-TACAAAAAATGCGGGAGAAGAGACGCAGAGTTTTCAACTAATTTCGCATG
-GTTAAGAACGTGCTGACGTCACATTTTTTAAGACAAAAAATTCCCGCATT
-TTTTGTAGATCAAACCAGCCTGGCACCACGTGCGTTTGTAATCGTTCAGT
-AGGTAGGTAGACACAGGTCAGTAGGCATAGGCAGGCGGTAGGTCTGAGGT
-AGGTGTTGTTGACCACCACGTAGCAAAACATGCTTGACGACTAGCCTCAA
-ACGGATAATCACAAAGTTCTACGTAGTTATGATTTCAAGCCGCCCAATGA
-GCACATTACGCTGACTAAGCCACAGCTATAAGACCCTCCTCCGAGTATAT
-TCATCACCAAACATCCAGTTTCCAGTTTTGCAGTCTTTTTTTCTGTTGGA
-AAATAAAGAGAGTACATCTCATTAGACATTAATGAACAATTTCAAGTTCA
-AAACTATAAATATAAATAAAGCTAGTAATTGAGCCAGTCCAACCAAATTT
-CCCACAAGTTCATTATAAACCTTCCAATTTCCCAATCCCATGTACTCCTA
-CTAATCAGTTTCTTTCCTTCCGCCCTACTTTCCAAATTCATTTATCCGCT
-TTGCATACTTTTCGGTAATCTTGACGATTTTCAGAGGTTTCTAGAATTTT
-TTATTTTTTCAAATTATGCAAAAATAAATTTTTTTTTGTATTCTCAAAAA
-ATTGCTAAAATTGTCCAACTTCCCATTTCTCGGAAATTGACGTAATTGCA
-GTTTTTTGAATTTTTTTGAAATTACTGATTATCAAATTTTGTTGGAAAGT
-TTCCTTTCACCTACACACCTACCATATGCCTATCTGCCTAGGTGCTTACC
-TACACGCCTGCTTCGTGCCTACCCGCCTACCTGCCTGGTTTATTTTCAAA
-AAGTGCAAAGAGCCAAAAGTTTCGAATTGTCAAAATTGCTCGGAAATTTT
-TTGAAATTTTGGAAAATGCCAAAGTTATCAAATTCCGCATAATTCCAAAA
-TTGGCAGCCCGACATCATGCCTGCCTACATTCCTGTCTGCATATAGGCCT
-GACAAAATGTCCATCAATGTATGTACCTATTTCATACCTATCTACCTGTA
-TAAACATAGTTCATCTCTACCTCAAACAGCATGTTACAGGCTTTCTTCTT
-ACCTACCTACTTCATTAACTGCTGTTTATTGACCTGTCTACGTGCCTACC
-TCATGCCTGGCATGCCTACATACCTACCTCATTTATCAGATCCTCATGAA
-GCCTATTTACAAGCCTACTTCCAGCCTACCTATTGTGTTGATTACGATCA
-CCGTCTCTAGGTTGCCTAACCTGCCTAATTGTGTCTACCTACTTAGCTAT
-CTCATGCCTGCCTACTAACCTGCTCAAGTACCTACTTCATGCCTACCGGC
-CTACGTTCCTACCAACGTGCCTACCTGCCTGCTCACTAGCCTAAGTGTCT
-GCCTACATAAATTGTCCGTTAGCACATCAAACTTTTCATATATACAAAAA
-ATTGCATAAAAAGAAGATAATCATTAATAACAAGTGGGTAACTCAAAAAG
-GAAATTGGTTTATCTCCCGGCTCCGAGAGCACCAGCACTTTGCTTTTCCG
-TCACTACAACCTCTAATTTTGTTTTGTTCGAAGGACTTTTTCCGATACAT
-ACTAATTTTTTCGGATCCGGTTGGCTCTGGATTTCAAGTTTTATAATAAC
-TTGGGCTCCCAGTGACGTCACCAAAGGTGCAATTAGCCTTTAGTAACTAA
-ACAGCTTGCTCCTAGTTTACTGCTCCGTCTTCTCAAATGAAACAGAGAGA
-GAGAGACCCCTCATCGAAAATTCAATTAAACGCTAAAACGTAGGTAGGAA
-AGAGAGAGAGAGGGAGACTCCTCCCAAAAAAAAAAGACAGGGGGGCTCTC
-TCTCTCTCTCTCTCTCTTCGAGCGGCAAATCGGCTTCCGAATTCATTCAA
-AAACAAATTATGTGCTCAACCACCACCACTACCACCGGCTCCAGGCGGGT
-AATTACACTTGAAAACCAAGTACTAGGTTTCGTGGCCGGGCAAACTTTTT
-CTTATTAGACCCCGGTGGAATTTTGTAGGTCTATTTAAAATTGCAATTGC
-GCTATTTTGTACTGTTTTTTTTTTGACAAACTTTGAAGCTTGATGTCAAG
-CTGGAAAAGCGCTCTAATGACAATTTTGACTGCAAACTCGCTCTGTTGAT
-AAATGGTCCGTGTACTCCACGGGGGCAATTAAACTGGATTTTTTTCGATT
-AAATAATATCTTGATTTTTTGCAGTTTTGGCTTAGGCTTAGGCGTAGGCT
-TAGGTTTAGTCTCGGGCTTAGGCTTATGGTCAGGGTCAGGCTTAGGCATA
-GGCTTGGGCTTAGGCTTCGGCTTAGACTTAGGCTTAGGCTTAGGCTTATG
-CTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCT
-TAGCCTAAGGCTTAGGTTTAGGTTTAGACTTGGGTTTAAACAGGCTCAGG
-CTTAGGCTTAGGCTTAGGCTCATGCTCAGGCTTAGGCTCAGACTTAGGCT
-TAGACTTAGGCTTAGGTTTTGGCTTAGTCTTAGGTTTGGACTTAGTCTTA
-GGCTTAGTCTCGGACTTAGGCTTAGGCTTAGGCTTAAGTTCAGGCTTAGG
-TTTAGGCTTAGTCTGAATATTTGGCTTAGCCTTGGGCTTAGGTTTAGGGC
-TTAGGCTTAGGATTAGGCTTTGGCTTGCCGGCCACCTGGGATATTGTGGT
-TTGACAGGGGTAGGCTATCCAAATTTTAAAAAAATCGGCTACAAAATTAA
-TATTTAGATGGGCCTATAAACCATTTCTCTAGGCCATCCTGCAAAATTTC
-CAAGACAAAAAATTTCAGCCGTGAATAAAGTTTCCGTTTTCCTAGGCCAC
-CTCCAAATTTTCCACGTCATATGTAAGGTATCGGAGGGTACTGTAGAAAA
-TTATCAAAAATCAGCAAAGAATAATAAGCATTAAGAAAGTTTTTTGTGTG
-TGTGTGTTTTTTGTGGGAGAAAACATTTCCCCTCTCCTTTTTTCCTGCCT
-GCTCATTTGGATACCACCGCTAACCCAACTTGACTTTGATTACCCATTTC
-CGTCCCCCTTCTTCGTCTTCTTCTACTCCGGGATAGAGAGAGAGCTCTAT
-ATAATTACTTTCGTCTTCTTGATCCGTTACCGCCCATTGGCAATTGGTTT
-GAGCTGCCGCCGGAGAATATATACATGCATGTCTAATTTTTTACTGGAAA
-ATCTAGGAATTTTTACGTTGAAAATTTGGTTAAAAGCGTACAGATCGGCC
-CATGCTGGTGATTGTACGAAATTTTAATTTCAAAGTATCTGCAGAGGAAG
-CTAGGCCACAAGCCCCTACGTGGCCGTCAAAATTGAAAACTAGGCCACCG
-ATTTTTTCTCGGACTTTTTATCTACTTTTGCTATTAGGCCCTGTCTTCTT
-TTTTGCAACGTTTTTCTACTAGGTCACCAAATTTTTCCTAGGCCAAGCTG
-CCTAAAACTCGGCCACCGATTTTTATTTGCGTCGGTCTGTAACATTCAGG
-CTCCGACCAGCTCGACTTTTGCTACGTGGTCGCCAATTTTTCCTAAGCCA
-CATCGAAAATGACTCGCTGTGACATTTGTACTTTTTTTCACACGGCCTAG
-AAATTTTGAAAAAAACTCGGCCACTGATTTTATCGGCCTTGGAATCCTAT
-GTAACTTTGTGGCATGATTTTTTATTTATTGTCCATCCAGTTTTTCGTCT
-GAAAATTACAAAATGTTTTAGTGACCGTTGGAGAAAACTCGGCCACCAAT
-TTTTTTCTCGGCCAAGTTACCAAATTACGGGATACCGTGTTCTCTATCAT
-ATTTCTGGCTCAAAACATACTCTACTTCCGTGCTGCCTACGTGGCCGCTC
-AATTAGAAAACTCGGCCATCATTTATTTTCTAGGCCATGTCGAAAATAGG
-TAATGTAAATAGGCAAAGAAATGCGGTGGTTCAAGTAATTTTGGGAAATG
-GATTTTAAAAAGTTGAAAAAATAAATCAAATGAATAAGTCTGAAACACGC
-AAACCTTAAAGCTAGGCCATCAATTTTTTTCTCGGCCAGGTTGCCAATCT
-ACGGGAAACCGTCATGTTTCTTGCTCAAAATTACACCCTATTCTCGAAAA
-ATTTTTTTTACGTTGAGTATGCTCTCCTGCCTAGGTGGCCGCCCAATTAG
-AAAACTCGGCCACCCATTTTTTCTAGGTCATGTCGAAAATAGGCGATGTA
-ATGGGGTAGTTCAAGGAATTTTGCGTAATGAATAACCCCAAAAATGTTTT
-CAATATATGGCCGCCAAAAAAGAGAAAACTCGGCCACCAATTTTTTCTCG
-GCCAGGTAGGCTACCAATCTACGGGATACCGTGCGCTCCATCCTATCTCA
-GGCTCAAAATTACGCCTTTTTTCTCGAAAAATTTTTGCATACTCTCCTCC
-CGTGCGGTTCTTAATTAATGAAAGACGTTTTTTTTTCTCCTTGTCTAACG
-AGTGTATATGCAGAATTCAGGATATGCGTCTTCTTTTCCGAGTTCTTGTC
-TTCAAAGCGAAAAAAAAAGTGTGTGTGTGTGTGGACATAGGAAGACTCGT
-CTTCGAAGAAGACGCTCATTAGCTCATTTCATCCACTCGCTAATTTCATT
-AATTTTGTGCTTCTTCGCCTGCCTTCCGACGTGTTTACCCACACCACCAC
-CACCACCACTCAGTACCTCCTCACTCACCGTGGAGAAAGATGTTCTGGAT
-TTTTTTAAGCTTTTGAGTTTTGTGTCCTACCTCACTTTTTAGGCTCCACC
-CACTTCTTGGCCTGTTATTTCGGTTTATTAGAATTTGTGTGGTGTACTAC
-AAATTTCGATCCGAAAAATGGCAAAAAAAATTCAGCTGACTGAATTTTTT
-TGAACTTTCAAAGGTTCAGTTTTTGCAACCTAAACCTCTCTTAACTTTAA
-CTTTTCAAACCCCGCCCATATCTTGGCTTTTCCAGAAATCCGAGTAATTT
-TTTGGGAAATTTATGGTACAACTAGCTATCAGAACAATTTTTACGGAAGT
-TTTTTTAATTTTATTTTAATTTAAGTCTACTGAAATTGACCTAAAATATA
-TTTTGAAAAATGCTTTGATCCCGAAATTGGCCAAAAAACGTTGATCGAAT
-TTTTTTGAACTTTCAAAGGTTCCGTTTTTGCAACCTTTAAGCCCCGCCCA
-TTTCTTGGCTGTATTGTATTCAAAGTTAAAAGTTGTTCATGTTGTACTAA
-AATATGCAAGTATCATAAAAAATTAACTTTTTAAGCTCCACCCATTTCTT
-GGTTTTTCTGGAAATCCGAGTAATTTTCTGGGACTGTTATGGTACAATTA
-GGTATCAGAAAAAAAATCAAGGAAATTTTTTACTTGGATTTATGTCCACT
-GAAATTGACCTGAAAATGTTTTGAGATTTTAAAAAACTTAAATATTTTGA
-TAAAGGTAGAATTTGAATTCCCCGCCCATTTCTTGGCTGCAGTTCCCAAC
-TGTCCAACTTTTTGAATATTTTCTCAAACTTCATGGCCTAAAATTCCAAT
-TCTAGGCGATCTACCTTGATAAGAACTTACTCCTGAGTTATGTTTGAAAA
-ACATAGTCCATCCGTGGCCTAGAAATCCAAAACTAGGCCATCAGATTTTA
-GGTTCCTAGGCCCAATCACAAAGCCAGCAGTTTTAAGTTGTCAAATTTCA
-GTGGCATAACCTCATAATTTAGACCTATTCTATTAGGTCAGCCTATTACA
-GTTTCTGGCCTAGAAATTTTCCTTGAGTTTGAGCCCACTACCCCCACACC
-CACATGGCCTAGAAACCCAAGCCTAGGCCATGTGTCCCCGCATTCTCACT
-CACTTTTAATTTCTTAATCCACTTACACAATTCTCTCCCCCTTTTCCAAT
-TTCACATCGAACCCGGGAAAGCTCATTAGCTCATTTGTTGTGTGTGTGTG
-AGTTGAAGAAGCGGGGGGAAGGGGAGCCCCCCTTTTGAGTGGACGGGGAG
-CTAGAATGGAAAAAGAGAGAAGGAGGAGAGCCATTTTGAATGGGTATGCA
-ATTAGCAATCGATGCAAATTAATTAAACAAACAACGAAATGAAAGGGGGG
-GGGAGGGCAATCGCCTGCCTTCACTCACATGTCCCCTGCTGGAAATGTGG
-AAATGTAAATTAAAATTAGAAAACTAGCAAAAAAGTGCGTTTTTTATTCC
-TACTTGTTAATTAGTTTAAATTTCTATATATGTATGGCTTTGACATGCCA
-ATTTTGGCGTCTAAGGGTAGGTATAGGTGGGCGATGCACCATGTTAAATG
-GTCGATGCATCATGCCAAATAGTAAATGCACCATTACACATTGAAAATTT
-AGCATTATACACTCCATATAACTGAAATTCGGGGCCCAATCAATATCATG
-CCGCCGACATCTCACGGACTCCGCGCGCCGCTATGTTTAACTCGCAGCGG
-GCGGAGACAGCTGGCCGCGCCCACAACGAGTTAAACACAGCGGCGCGCGG
-AACTCGTCAGATGTCGGCGGCCTGATATTGGTTGGGTCCCGAATTTCAGT
-TTTATTATTTGGAGTGTATAATGCTAAATTTTCAGTGCACCGTGTTAAAT
-GGTCGATGCACCATGATAATGCTAAATAGTCCATGCACCTTGTCTAGAAA
-ACTCGTTGAGTACTGTACTTATGAAACAGTTTAGCAAAAAAAAATGTCAG
-CCTGTTTGGCTCCGCCCCGAAAGTGGGCGGAGTCTAATTTCTTGAATTTT
-TTTTTTTCAAAAATTGTTTTAAAAATAGCTCTGTGAATTCCACCTCAAGC
-AACTATTTTTAGTGGAAAGCAAATTTTTTCAAAATTTTGCGCAAATGGTT
-CTGAGGCTCCGCCTTGAAATTGGATGCTCTTAATTAAGAAAGAAGTGTTA
-GTCCCGCCCCTTTATTGGAGGAACTCAAAACTGGGAGGAGCTTAAGAAGG
-TTATAAAATTTTGCTAATTAAAACACCCAGCTCCGCCCACTTATATATTA
-GTTGACTCCGCCCCACCCATTAAAAGTGGGCGGAGCTTAAAAATATTGAC
-CACGCCCCTTTCTTGGGTAGTTTTAGCGTTTTTCATAGAGTCAATTTTCA
-CGGCGGACCCCGGATCGATGCACCATGATTTGACGCGCAACCCAGGTAGT
-ATGACGTCACTCGTGGCCGAACTCGCGGGGGAAATTTGTACTTACAGCAA
-TAAATTTCGGTGTCTCACGGAGCACCTGCACACGTACCGATCATGAGTGA
-TGCTTCCCACCACAAGACATACACATACACACACAAACCTACTAATTAAG
-ACAAATTATAGAACAAGTGGGGGGAGAAGGGTAGAAATAAAAGTGAGCAG
-TGCGAGAGAACGCGTTAGACGGAGAAGCTGCTCTGGGAGACGTGTGAGAG
-GCATATAAGTTGGATTAGTTTACTGCTCTTTTCATGGGAAAATCAAGTGA
-GCTCCAAATATTTAATCTGACTTTGATTTGGTTTGATTCTGAAATTTTTT
-TGGGATTTGCAGAAAAAATACGTTTTTTTTTTGTATTTTGGAATCGCACC
-AATACGCTGCGTTGCCCTCCTACAGTGCAACTGAGCCACATTTCTCTTCC
-ATAACTTTTTTCTTAATCTCAAAGATTAAAACTCTGCAAAAGCTCAATAT
-TTTATAAATGATAAGGATTAGCAAAGTGTGGGTGATCTTCCAGAGGGGGG
-ATTACCATAATTCATTACTCATTTTTCAAGTTTCATCTGTGTTTTGTTTG
-ATAACCTAGGTGACCTACTAGTTTACCTACAGGGCTGGGACCAAAAAAAA
-AATTTGGACCAAAAAACAAAAAAACAAAAAATTGAAGTTTTTGAAAAACC
-AAAAAAACCAAAAAAAAACAAAAAAAAACAAAAAAAACCAAAAAATTTCT
-TATGCTTAAGTTGATTTTTAATGGGGTTATTCAAGTAATGTTGCAAAATG
-TATTAAAATACATTATGACGTCACAACTGTGTTAAAATACATGTTTTAAT
-GTATTTTAATACATAATAGTCTCGAGTCGAGACTAGACATGGTAAACACT
-TTTTTGGATTTTTTTGGATTTTTTGGTCCCAAAAAACCAAAAAAAACCAA
-AAAATCGATTTTTCGTCAAAATACCAAAAAAAACCAAAAAACAAAAAAAC
-CAAAAAATTCTCAGCCCTGGTTACCTGTCAGCAAATAATTTTCCCCTATA
-TACCACCACTTCAGGAGTAATCAACACCCCAAAACGGCAATTATTTATTA
-TTCTCCTCACCTTCTCAACACTCCATAGCGCCAGCCAGCCTAATTTGATT
-GTTTAATTCGATTCAGGGCACCCCACCACACACAAATTTATTAATTTTTG
-TCTTTCTCGCCATTTTCCAATAATTTTCCCGGCTTGTGTTAGCTTTATTA
-TAGAACTTTTTAAAGCGATTTCTTAGGAATTTATGTGTGACGTCATATGT
-GGCCTAGAAATTTGACGATCTCGGCCGTCGGGGTCGATGAACCATGTTGT
-GATGTATAGGTGGCCTAGAAAATTTTAGGCCACCATGATAGTCGTGGCCT
-AGAAATTTGGGCGCCTTCAGGTGGCCTAGAATGTGAAAAGTGACGTGTGA
-CCTAGTTCTTTTGACGGTCAGGCCAATTTTCCAATTCGATGCTTTTTTTT
-TAATTAAGGTCCATATTCTGCAATTTTAGGCTCCGCCCATATCTTGGTTA
-AACATTTTTTTTTTGCTTTTTTCTGCAATATTCATTCAATCCATCATTGT
-TCTCAAAATTTGATGCACCATGATATGGCAGTGGCCTAGAAAGTGCGACG
-TCACTTATGGCCTAGAAAATTCGAGGATCTTGAAATGGGAGAAAGTAAAA
-AAGTAATCAATGCCCCCTGACGGTCGTGGCCTAGAAAGTTAGAAGATCTA
-GAGGAGGGGAGTAGGAGATCGATGCACCATGTACAGCTACAGTGACGACT
-CACGTGGCCTAGCTTTTTCGCAGGCCACGGCCATAAAAAAATGTATGAGA
-TCGATGCACCATGTTTGTCGCGGACTAGAAATCGAGAATGTGGCGCACGT
-CACGCATGGCCTAGTGACTTTTACGGTCAGGCCGAAACACAGGACGTGGC
-CTAGAAGTCATTCTGTTAGTCTAAGACTCTGCAAAAACTCTCAAAAAAGG
-TGAGCCTATGTGCCTGCCTACTTGCCTACATTCTTGCCTACCTGTTACTG
-CTTTCTAATCTGTACCATGTTGCACCTACAGTACCCCCTTCCGCCCCCGT
-AAAGACTTTTTCAAGCTCAAAAGTGCAGAAAACACAAAAAAACCAAGCCC
-AATCTACAAAAGCTCATCTATTCGTGCTTGGATTAAAATGCCATTAAAAT
-GATTAATTAAGAGATCGAGACTGGTTGAAAACTGATCGGATTAAAAAGCG
-ACTGAGGTCCGCGAATGAGCTTTTCATGCAACTGATGAGCACATTTCCTG
-TGTATGTACACTGATGATAAATCTCCTTATCTTTTCCGAGACATAACAAT
-CTCAATGTTCTTCATTAGTTTCTTCATTTCCTTCTGAAATTTGTTGCTTT
-GATTTATTAAAATCTGTCATTATGTAAGATCCATAATTCGTGATTCGAAA
-TTTTTTACAGTTTTTTTTAAATATAGAAATTTGAATAACTTTCCTACCAG
-GCTGCCCCAATACAGTTTGATCTACAAAAAATGCAGGAATTTTTTGCCCA
-AAAATATGTGACGTCGGCACGTTCTTAACCATACAAAATCAGTTGAGAAC
-TCTGCGTCTCTTCTCCCGCATTTTTTGTAGATCACCGTAATACAATGCAA
-AAATGAGAGAAAAAAATTTGAAAAAAAACCTATCCAAAAATTTGGCATTT
-TCAGATTTTTTTTTTCGAGCAGACCTAAAAATGTTTCGATAAATTCTAGA
-TTTTTTGAAAAACTGTCTGAATTTTTTTTTTTGAGAACAATGATTATATT
-TTAAAGATCAGTGTTGACTTGAATCATGTAGCGTAAAAAAGGTTAAAAAA
-AAACCAAGATATGGGCGGAGCCTAAAATTACAGAAATTGGACCGTAAATT
-TTTCAAAAAATTTTTTTTTTTTCAAAAACCGAAATTTTATTTTAATTTCA
-AAATTTCCGCTTCGGGGTTTCTTGATTTTTTCAATTTCAATTTCAATTTT
-TTAGATTTTTTCCCGTAAAAAACCCAAAATAAATTTACTGAAGCTTCACT
-ATTGGATTAAAAATTTATAAGGTTCTTTGCGGGAAAATTAGTAAAAAATC
-GAAAATATATTTTAAAAGAAAAATCAAAATTAATACAAAAAATTAAGGCT
-TCCATGTAGGTTCGCGTGGTGCCAGGCTATCCCATTATTTTTTCTTTTTT
-TTTTTTTTTCCCCAGGAAAGTGTGACGTCAGCACGTTCTTAACCATGCTA
-AATCAGTTGAAAAGTCTGCCTCTCTTCTCCCGCATTTTTCGAAGATCATA
-CCAAAATGGGGCACTTTGACGCCACGTGTAGACTGTAGGCCATAAACCGC
-CTGCCTGCCTGATTTTCAGGCTACCTACGCCTGCCTGTCGCCCCAATCCA
-CGCCTTATGCTAAAACACATTCATTTCTTAATTTGATTTTCACCAAAGTG
-ATAAAAAAGATAAATTAAAAATTAGTACATTCTCGTCAAAATGCAAAAAG
-AGTCGTAAGGCAGGCAGGTTTCAGGCAGGCCCTGGCTCACGCCTGCCTAC
-GATGCCGGTTACTAAATTTCCAAAATACCTTATTTACTCTACAAATCCTC
-TACCCCGACATTACATCTCAAAACTCATCCTATTAATTTCTGCCTTAGGC
-GATAGCACTACTAATTGATAGGAAAAGACGACTTGTGTGTGTGTGTGTTG
-AATTATTATACTAATTTGATTTTAGGCAGCCTCTTTCGTCAAAAAAAAAT
-AACTTGTGTCACCACACCACACCTCCCACGTTTTCGGTGAGTGAAGCTTC
-TGCTCGCTGTTAAGCAGATATTCATAGGGAAATCATCCGTAAATCCATTC
-AAGTCCTCTTTATTTTCTTCTTCTTCGACCAAATTAGTATACAGATGTCA
-TCAACTTTTTTGTTTCTTTTTGAGGGCCCAGGCTGTTCATTACAGTTTGA
-TCTACAAAAAATGCGGGAAATTTTTTTTTGCTTTTTGCCCAAAAGAATGT
-GATGTCAGCACGTTCTTAACCATGCAAAATCAGTTGAGAACTCTGCGTCT
-CTTCTCCCGCGTTTTTTGTAGATCTACGTAGATCAAAACGAAGTGGGAAA
-CTCTGACACCACGTGCTTTGAGAAAAAATTTGAAAAAAACCTTTTTAAAA
-ATTTGGCATTTTCAGTTTTTTTTCTTTACAAAATTTTTTTGAACGAATCT
-AAAAATGTTTCGATAAATTCTAGATTTTTTGAAAAACTGTCTGAAATTTT
-TTTTGAGAACAATGATGACTTGAATATTGTAGAAAATCGTAAAAATAAGT
-TTTAAAAAACCAAAAAAAAATGGGCGAAGCCTAAAATTACAGAAATTGGA
-CCATAAAAGTTTCCAATTTTTTCTTCACAACTTTTTTCAAAATTGCTGAA
-ATAAAAAAAAACTATTATTTAAATTTAAATTTCAGAAATCCTAATTTTGA
-CGCCGATTTTTAAAATTATAAGGATTTGTTTTTCCTGCAAATTCTTTTTT
-AGAAACTTACAGTTTGTCGGTTTGTCGATAGAGCGTGCTTATTCACCAGG
-CTGTCCATTACAGTTTGATCTACAACAGTGCGGGAACTTTTTTTTTGCTT
-TTTGTCCAAAAGACTGTGATATCAGCACGTTCTTAACCATGCAAAATCAG
-TTCCGCATTTTTTGTAGATCAACGTAGATCAAACCGAAATGGGGCACTCA
-GACACCATTTGGGGGGCCTAGAAACCGGTCCCTTTCTCATTCAAAGTGCT
-CTCTGTTATCAAGTCTCCCACGCTTTATGCATTCAACTTTGTACAGTTCA
-CACGAGCACCCACGACTTGATTATTCAACATTATACAGAACTAACTATTC
-GAATCTCAACATGTCTTCTTGCCGAATTTAATCAACTTTGACTTCTTCTT
-CTTCTTCGACTTCTTTATACAACTACTCATCTTCTAGTTGCCCCTCTAGT
-TGCCTCACACAAGCAAAATTTCTTTTGAAATGAAATTTAAACGAATTGAC
-TAGTCAAAATTTCATCAATTTTCTACTAGAGAGAAGCGACGAGATTGACT
-TTTGGCAAATATAGAAGAGAGAGGCACCGAAAATGAATTAGATTTAACAC
-AACAACGAGTAGATGAGTTGTGTGTGTCAACGATGATGATGATGATGAAA
-AGAGCAGAGGAGCAAGCATGAGTGATTTCTGCGGCGGAGGTCGCGGCGGA
-TGAGGAGCATGAAGAAGGCTAACGAGCTGTATGGCGATGCGGCTAAAAAT
-TGATGATTACTGTAGATTTGGAGCTTTACACCGTTTAACTGGCTACGATT
-ACATACAGACTTGTTTTAGAATATTCTGTATTTGAACCTAATAATACAAA
-TTGCCGGTGTGCCGATTTGTCGGAAATTTTCAATTCCGGCAACTTGCCGG
-TTTGCCGATTTGCCGTAAATTTTCAATTCCGGCAACTTACCCGTTTGCCG
-ATTTGTCGGAAATTTTCAATTTTGGCAAACTGCCGGTTTGCCGATTTGCC
-GGAAATTTTCAGTTCCGGCATTGTGCCGGTTTTCCGATTTGCCGGAAATT
-TTCAATTCCGGCAATTTTCCGGTTTGCCGGTTTTCCGTTTGCCGGATAAC
-AAAGTGTTTAGAGGGATTTTTTTATAAGAAGGAAACTCTTAAAACTGTGA
-CTTTTTGAAATTGTTTCCCGTTTTCTTTCGATATTTTCATAGATTTTGCA
-AGAATGCGTGCAGTTTTGCCAGTTTAGACGTAATTGAATTTCTGAAATTT
-CAAAAAAAAAAGAGCAAAATCATAAATTTTTGACATTTGTCATTTTTTCC
-GGTAATTTGGCGATTTGCCGGAAAAAAATCATTTACCGCCAACTCATGGT
-ACGTCTAACCGCAAAAATTTTTTGGGAGCCTTTTCTGGCTTTCTTTCAAG
-CTATCGTAATGTGACCACACACCTTTCTATAATTTTCAGTATTTACGCCA
-ACCGAGAAGATCACAGTAGTTTAAGGTTATGGTGCAGTTTCTGGTCAATG
-GATCAGGTCTCTTACCGCGAAAATTTTAATACCGTGAATGTGAAGCTTTG
-AAAATTTTCTGCCGTAAATTGTCAATTTTCTGCCGCACTTTGTCAATTAT
-CTCATAAAGGTCACTTAAGTTAGCCAAACCGTGAGCCAAAACTGCCCCTT
-ATTCCTCATGCCGTCTTGGAGGAAATCTAGAGCAAACCCTGGTCCATATT
-CGGACAAGGTCCCCTTTCTTCCCCCAAGCGTCTATCTAACTTTTCCTAAC
-TACATATAACGGAATTAATAATCCTATCCCCAATTTAACGTGTCCTTAGT
-TCTCTCCCTCCTCACCGTCTTCTAGTTTCATCCATGTCTCGCCTCATTTC
-ACCCGATTGACGATCATCTCGGCTCCACACTTTGACACCATAGCGCGAAT
-GAAAAAAAAGAGTGAGAAAAGGGGAAAAAAGTTGCTGCCCTATTATTAGG
-AGTCAAATAGACACACACACACACACACTCAATTTTAATGGATTACGCAC
-GATTTGACACCATCGACACCAATTTGGAAATGGGGGCACATAGATACATA
-CACAAAAGGAGTTGTACTACTAGTTTTGGAACTAACATCATTCTAACATC
-TTTTCATTTATGATTTGATTTATGCAAATGTCCTTGATTCGTGACTTCTT
-GTATAGTAGTTGGGATAAGTATAATCATGGTAGTTGCTCAAGACTAAGCT
-CTTTAGCAGTTTTAAGGTATGCCCCAGTTCGGGATTCCGGCTTGCTTTAA
-GATTGTGTCAGGTCCGGCCCAGGTTGTCTAAAAAATACAGGTCTGCTCCA
-GGACGGTATACCATCACTATATATAAAGCACGTGTCGTTCCGTCACTTTG
-TAGTTTGATCTTTGATCTTTGGTCTTTGAACTCTGTAGTTTGTAGTCTCA
-TCACACAAGAGAGGTCACATAGGCCCGGCCCCTTTTGTGACGTCATCACA
-AATTGGCGGGAAATTCAAATTTTCTGAGAAAATATTTTGGCGGGAATTTA
-AAATTTAATTTTTTGAAAACATTTTGGCGGGAATTCAAAATTTAATTTTT
-CAAAAACATTTTGGCGGGAATTCAAAATTTAATTAGACTGTTCTCGGTTC
-GGCCCAGATATATCCAAAGTCTTTCTCAAGACCACTCTAGATCTGTTCTA
-CTGTTACCCAAGACTGCCGCTCCACACCCTGTATAAGTTGGCCCTAAGGC
-TCCACTGAGTTTGATCTAAATCTTGCCAAGCCTGTATCATACCTACCTAG
-GCCCACCACAGGTGCATCTCTCACAGATCTTCCACAGGTGTTTCTAAGTC
-TGCATCAGATCTGCACCAGGTCTGTTTTTAGTTTTGCCTGGGTGCAGCCC
-AGTAGTCTACCTCACTATCAAGCAGGTCCTGACACCAGTTCCTAGGTCTC
-ACATTCAGGCTTCTAGGCGGATAGTCTACCTAGCTAAAGCTTCAACCTCC
-ACTGTTTTAAAGGCTTCCCCTTTCTCAAACTTCAACTAACATTAATACAT
-ACATATGTTATTAATTCGCGACTCGGCGACTAATAACAATAATTCAAAAC
-CTCTTTCCTGGCAATGCTTCCGGTACTCAACACGGAGAGAGAGGTGGCAG
-GTATCCGGTAATTTATTAACTCGAGCCGCGCACCCTGGCTCCCAGAGCAC
-ACAGCCCCGATGATCGCTCATGCACGAGTACTCACGAGGTGGTGGTGAGA
-GGTAGGTTGGAGAAAGCGGTTCTACCTTCACAAATTTCAATTTCAATTTC
-CTCTCTCTCCGTTTTACTCGGGCCCCCCCCCCCCCCTTCTTTCAATTTTT
-CGCCCCAAATTTGTGCTCCTTTAATGGAAAGTTTTTGAGTGTGTGAAAAA
-GAGAGAGAGAGAGACACCTTCGTGTCACGCCAATTGCACTAATATGTGCT
-CTCCCCACCTAGAGCTACCAAAATGTTCAATTCACAATTTCCGAACTAAT
-TCGTGTCAAGTTTTTAGTTGGTCCTAACTCTTTGGCCTAGAAATTTAGAT
-TTCTAGGTCATCCATCTAGATGCGGTGGCCTAGAATCCTAAGCTTTAGAT
-GCCCAGGCCATCAGGCCTAGATTCTGAAATGTTGTGATTTTTCTAGGCCA
-TCAACTTTGACCCAAAAGCCCTCTAATTTTTAGGCCATGAATCTAGGAAC
-CTATCTAGAGGCCTGATCCTTTGCTTTCTTGCCAAAAACTAGAGATCAAT
-GCCCTAGAAGCTCACAAAACTTTGGCCTAATAATTTCTAGGCCACCAATT
-TTTTAAAGATAGCCTAAGTCATCAACCTAAAATTCACGGCTTAGAAATCA
-TGAAATTCGCTTTTAAGGCCTCTGACTTCATAGCAGTGGCCTAGAACTCC
-AACTGTCAGTAGTCTGTAAAAATGAGCTTTTTGGGCCTCGAACATAACAT
-GGGACATGGAAGCCTAACATTTTTAGGCCACTGACTTTAAAGCAATGGCC
-TAGAACCCCGTTTTTCTGTAGCCTAGACTATCATCTAGAAATCAATGGCC
-TAGAATCCTAAAAATAATATTTTTCGGCCACCAAAATTTTAGGAATGGCC
-TAGAAATCTATTTTGTTGTATTCTAGGCCACCATCGACAAAGGAATGGCC
-TAGAATCCCTAAGAATGTGATTTTTAAGCTACCATCTATGTACCCTAGAC
-CAATATTTAAAATTCAATGGCCTAGAAACTAGAATATTTGATTTCTAGGC
-TACTAACTGTTGTGTGCTGTATCCTAGACTATCATCTAGACCCCAATGGC
-CTAGATTCCTGAAAATGTGTTTTTTCGGCCTGAAATAGGCCTAACATTTT
-CCAGTCCACCAACTCTTTTAAGATGACCTATAAGTTTAATCCTAGCTTGC
-CAACTATAAATAATTGGCCTAGAAGCTCCTAGGCCACCATCTAAAAATCG
-ATGGCCTAGAAACCTCCCATTTTTTGTATCCTAGGTCACCAACAACCACT
-GATGCCCAAGACCCCGGCTTCTTATTTCATAATGAGCAGCAAAATGAGCT
-ACCGTACCCCTTCTACACACTTCCTCCCTCTCCACACCCATTTCCCCTCA
-TTTTCGTCTATTTTAGCGGCGGCGGCGCGGGATAAATTTGTGAGAGGTGA
-GCTGCTCACAATAATGGGCTTGTTGTAATAGGCGGCAGTGGTAGTGGTGT
-ATGGATAATTGTGAGTTCCCAAACACACAAAACTTTTTCGCCGCAATTGT
-TATGCAACCAACATAATAATAATAATAATAATAAGTGAATGTGCATAAAT
-GTGCTCTTTTTCGCGTCTCCACACCCGTCCTGATGGGGACGACGCTTCGT
-TGAATAGTTGGAATAATAATAATAAATTGGAAAAATTTGGGCGCCCCCCT
-CCTAACACCCTAACACACACGAAATTTCATTTCGCGCGCGCTTCGAAAAC
-AAATTGAAGACAAGTTTTTCGCGAGACAAGTTATGATAATTTGTGGGATG
-TGGTCCCCGCCGGCAGCTTCCATCAATTTGGAGCAAATTTGTGCTCTCGC
-AAACCTTCTTAAAGAAGGGTTACACTAACAAAGTTTGTCGGAATCGATAT
-TTTTGTAAGTGGGCCTGAACCCCCGGTCTTTAAATTGATAGGCATTCTAG
-GGCTTCCATGGGAGACAGGCGCGGTTTTAGGGCCTGACGTCTGCCTCTCG
-CCTCATTTCTGCACTATGGCGAGAAGCCAAAGACTTGGTGTTCACACTTT
-GTGCCAGAGTGTCTCATTTCGGCTTGATCTACGTAGATCTACAAAAAATG
-CGGGAGAAGAGAAGCAGAGTTCTCAACTGATTTTACATGGTAACCAGAGC
-GTGCTGACGTCAAATTTTTTTTGGACGAAAAACTCCCGCATTTTTTGTAG
-ATCAAAAACCGTAATGGGACAGCAGGGCTTTCCACCAGAATAATTCCACT
-TCTTCACAATAAACCTATATATTTTTTGTCAAAATCTTGAGAATTTCCAG
-AATTTCAACGAAAACCACTGCTAAAAGTGGTTCTTTCGCCGCGGCCGACA
-CTTCTCGGGTTCCGCGCCGCACTATAAAGGAGGCGCGGCGCGGCAGGCGG
-CGCGAGGCAGGCGTTTTGGCGCCTGCACGGATGCCCTACACCAAACTGCA
-AACATTTCTAGTTCCGTTTTTCGGACTCTACGCCTTATTTCGGTCTTTTT
-GTCACAACTTCGCTACACTGTGTTTTTCTCCACTTCTACGACTTTAAAGG
-AGGGCGCATTTATGCGACTCACGTGATGTCAGGCAGTCTCATTGCGGTTT
-GATCTACAAAAAATGCGGGAAACTTTCCACCAGGAAATTGTGACGTCAGC
-ACACTCTTGCGAGATCAGTTGAAAAGTCTGCGTCTCTTCCCCCGCATTTT
-TCGAAGATCAAACCAAAATGGGACATTCTGACACCACGTGGTGACTTAGG
-ATCAATGTAGATCGTTTTATAGGCCATCCATTGATTTTTAGAGCTCGTGG
-CGGGACCATTTTAAATGAATTTCCAAAATTTCCAAAAACCTAATTTTTTT
-GTCAATTCACAAGTCCCCCGGACCCCCTCCATTGTCCCCCCGTTCACAAC
-TTCCTCCCTCGTTAACCACCCATTTAGCGGGACAAAATTAGCGAATCATT
-GACTCATAATCAAGTAAATCGGTGAATGCTCGACGAGCAAGAGGGGGGGG
-GGGGGGTCTAATCGAATTACGGGGGAAGGGACCCCTCCGCGCGACACCTC
-GCTGCCAATTAACAAGTCAACTACTTGGGGGGGGGGGGGGGCCTCCTCAC
-AACAATGTTTGTATTATATTTCTTGTTATTATGATTATTATTATTATTAT
-TATTAGAAATTAGTTAGTATGAATATATAATATCAACTAAAAACAAAATG
-ACAGTTAATAATAATTGAAGTCATCCAATAGGTGCCAATTAGTCAAAGAG
-AGGGGTCTGTGAAAACAGAAATAGAAGAGAGAAGGCGGGGGAGAGGGGCG
-CTCTCAAATAATTAATCTGGGCTCCGTGGGCTCGTAAAATTCCGATAAAA
-TGGCTTGTTTGTAATTAGCTAATTCACGGAATCTTTTTTTTTTGTTGGGG
-TTTTACTATGTTTTTGAACAACTTCCTGTTATAACATGTTTCAAAAAAAC
-TATTGACCTCAATGGGGACTTGAACCCTGGTGTTGAGATTGGTAGTCTGT
-TAACCAGTACACCAAAAATTGCAATTTTTGATTTTTGTTTTGTCTATTTT
-TTTGAATACAACGATAAGTAAGGATCATTTAGATTTAGAAAAAAAAAATC
-AAATTTTGTAAAAATTTTCTAAAAAGTTATGAACATTCCACTTTCACAGA
-TTTCTGGCTTCCCTCATAAATTGAAATGGAAGAGTTTTTGGCGAACAAGG
-CCAGATGCGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAATGCATT
-TGTCCGTGTGGAGTCCACGACTTCCCCCGTTGTCCGCCAGACGATTGTAA
-ATGGAGCGCGAAAAATTCAATGAGAAAGGCCAGAACCCCGTGCACTTTTT
-TGTTTCTAAAACTGAAAATTTTGAATTTTGAAATTTTCCTTGGTTTTACA
-GTATACAAAATCTTAGTTAGAGTTCGCAAAAATTATTGACACTGGTGGGG
-GCTCGAACCCCTGAGGTGGCATCCCTGTTAGCCACTGCGCCAAAATTGCT
-AAAACTTCAAAAAAAAAATTTTAGACCGTTTTTAAGGTTTTTAGACTTCC
-GACTCTTCAAAAATTCCTATACAAAGTCTTCGTAAAACTAATGACTGGGG
-GGCTCGAACCCCGGTCATCATATCAGTAGTCATCCCTGTTAGCCACTACA
-CCACTTGCCCAGACGTGTTTCTGGTCTGTTTTACGGTGCAGCGTGGCCTA
-AAAAAAACTAGTCAGCCACCAATTCGAAAAGTCCATAGACCAAGTTAATA
-TAGAAATTCTTCAAATTCGAGCCAACCAACTAATATATTCACTAACCTAT
-TTTCGCCGTGTTCTTCCTGTGTGTGTGTGTGCCCCTAGTTAGGCCTAGCC
-CCCCCCCTTATTTTACTTGCTTCACAATTCAATTGGCCCCCACACAGTTA
-CAGTAGTCATAATCATTTTGTGTCGGGTTTTCGACACATCGTTTAAACGT
-GTTACCTCTCTCGGGGCCCCCTCTTCTCCTACTTCTTATTTGCTCAAAAT
-TTGCGCGTCGAAATTTCTTCGTCGTGCGCTGCCCCTTCCGAATAATCAGA
-TTCACCAATGTATAAAATAGGCCACGCCTCACTTTTTCCACACCCATCAT
-CTTCCCTCAACTTTCCTCTTCTCAAATGCCTAATCAGCCAGTTATAACGA
-GGGTGCTCTTCGTGTGGCGCCCCGCCCATTTTATTGCTCCTCTCACGCTT
-CATTCTCACTTTTTCTGGGGATCCTTTTTTTTGCAGACCTAAAAATTTGA
-GCTCAGCCATATTTTTTTTGTAAATATAATCAAAAAAAAATAGACATTAG
-TCAAAAAAGTTGTTTTAAGCCTAAAAAAATTTTTCAGATAAAAAACGTTT
-TTCTTTAACTTTTTTGAACAGTTTTTCAGTGAAATATTTTTAAATTTTTA
-TTTTAAAAAAATGTTTGTTTATCTAAGCCTAAGCCTGAGCCTAAGCCTAA
-TAACCCTAAATAGCGTCAGTGTGGGAGCTCACGCTCCCCCACTGACGCCA
-AGCCTAAGCCTACGCCTAAGCCAAAGCCTAGGCCTAAGCCTGGGCCGAAG
-CTGAGACCTAAGCTTAAGCCTAAGCCTAAGACTAAGACTGAGTTCAAGCC
-TAAGCCTAAGACTAAGCCTGAGTCTCAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCATTTTTAAAAAGCTTAAAAATTTTTGCAATTACTATTTTTTCTGAA
-AATCTGTAAAAATATCGAATTTTTAGAGTTGCTATAAAATTTAAAATAAT
-ATTCAAAAAATAATCCGAAAAAATTAAATTTTTTTTCTCAAAACGTAGAT
-CATACAGAATCAGCTTTAAAAAATTCAAACCATTTTTCGTTTCAAAAATG
-TTCAGAAAATTTGTAAAACTTGAGTTTTGAAGAAAGTTTTCATAAACTAG
-CTCTTGAATAGGGTTTTTAAGTAGGCGTTAAAACGCTTGCCTGCCTGACC
-TTCAGGCGACTTTCGCCTGCCTGCTTGACTTTCAGACGTTCTCTGCCTGC
-CTGCCTGACTTTAAGGCGACCTCCGCCTGCCTCTCGCCTCAATCCGAGCC
-TTATCTCTTAAAATGTTTTTCATCAAATTGATAAAAATACGGAAATTACA
-AAATTTTGTAAGTTCATGCCAAAATGCAGGCATCAGGCCCTGAGGCCACG
-CCTGCCTAGGCCTCCGACTTTCGTTCTACAATTGTCGTTGCCGTTTCCTT
-TATCCCATTTTCATACCCCAAAGTTATGATTTTTCTTACACCCCTTGCGC
-TGCTGCTGCTTCCGCTCCCGTGATCTTATGAATCAGTAGTCAGAACTGCA
-GGTGTGAATCTCCACAATGATCACCCAATAAACGCGAAACACCATTAGAA
-ACAAAGTGTCCCCCGTTTTTTTTTTCTGAGAGTGTCGGCACCCCCCTAAC
-ATATGCGGGGAACATTGTCTCAAGTTTTGTGTGCTCCTCCAGCTCCTCCA
-TATGGTTACCGTAGTCCCCTGTCAGTGTTGTGTAATTGTTGTTGTAACTA
-TCCCCCGAATACCTCTCCTCACATTCATTCACAACACAGGTGTCAACTCA
-ACTCTCAGTGCTCATTTGAAGTTTATGAAGTTTAGCTTCCGGGGATGGCT
-CTCCTGGGCTCCCCGCTCCCTCGAAAATTTAATTAATTGCAAGCACATGT
-GGTGGTGGTGGGGCGAGCTCCGCGCTTCCCCCCCCGCCCCGATTCTCTCT
-CTCTCATTTGCGACTCATTAGATTTTAAATCACTCTCAAACTTTCCACTT
-TTCCAACTTTCGCGTTTTTTAAATTTTTTTTTCACTTTTTCCTCACAAAT
-TCATCCAAAAAAATTTCCAGAGTTGCCCCGCCCATATATTGGCTAAATGG
-TAGAATGGACGTGGCACTTTTGACAATGGATGACAACAACAAACCGCCGA
-CAAGTTCAGAGTCTACGGAGAGTAGGGGTGAGTTTGGCCGGGGGACCGAT
-AATTTTTAGGCCAAGACTTCTTTTTTTTTAAATCATTTTCAAAGGTACGT
-TACCTTCACGTGGTGCCAGGTTGTCCCATTGCTTTTTGATCTACAGAAAA
-TGCGGGATTTTTTCCCCAAAAAATGTGACATAAGCAAGTTTTTAAATCTT
-TTCTCCCGCATTTTTTTGTAGATCTACGTAGATCATACTCTGACACCACG
-TGTACCTTGAACCTCCTGGCTTTCTGAAACTAGAGTTCGTCGCTAGAGCG
-CATTTGCATTGTCGTGGTATTTAATTTACAGTACCGCCAGAATCATGTCG
-CGCCGCTTGTAGTCTAGTGGTTAACACGCTTCAGCTCTAAACAATAGGTC
-CGGGGTTCGATTCCTTGCAAGATGAAATTTCTTTCTCAAGATGGAGGTAC
-ATATGTGCTTTAAATGTGCACTAGAGATAGCGAAACTGATACCATGGTCC
-GACATGTACAGGGTTCCGCGCGCGCCTAGGGCCTCCAAAACGCCTGCTGC
-TCCAGTTTTGCGGCGACCTCCGCCTAACTCGCGGCGCGCCTTCTGTATAG
-TCACGGCCTTCTGTCTTCCCTCATAAATTGAAATGGAAGAGTTTTTGCCG
-AACTAGGCCATCTTGGCTCGGTCACATCTGGGCTCGATTTTAGTTGTAAA
-ACTAAATGTATTTGTCCGTGTGGAGTGCACGACTTGCCCACGCGTTGACC
-GGCGGGCGATTGCCAATGGAGCGCGAAAAATTCAATAAGGAAGGCCAGAA
-CCCCGTGTATAGTGCCGCGCGTGGAGCCCGAAAAGTGTCAGCCGCGGCGG
-AAGAACCACATTCCATAGGACTAAAAAACTAAAGTTCTCTCTTTCAGAAA
-CATCACCACCAATGATGCCAGATTCTGCGGAGATAATGCGACTTCTTACG
-GATCCTTCGACGGCTCAGATGTTTGGTAGGTCATAGATCAAATTTTTTCC
-GCAATTTCCCGAAAAATTTCAGCCAACGAAAACACAAAATGTCAGCTGGG
-ACGGATTCTCGCCGCGTCAGGCTTCGACGAGGCGAGCCTCTCCTCCTCGT
-TTCCGTTCGATCCGACGCTCGGCGCGTTCGCCGACATTTCCCAATTCTCA
-TCACTCCGAAATTCGTCGAAAACGCTGAAATGTCCAAAGTGTAATTGGCA
-CTACAAGTACCAGGAGACCCTTGAAATTCATATGAAGGAGAAGCACAACG
-ATGTGGATGTCAAGTGCATGTTTTGTGCCGAGAACCGTCCCCACCCGAAG
-CTGGCTCGCGGTGAGACGTACTCGTGCGGTTATAAGCCATATCGATGCGA
-TTTGTGTCGGTACAGTACGACGACAAAGGGCAATTTGAGTATTCATATGC
-AAAGTGATAAGCATCTTCATGCAGTGCAAGAGCTCCCGAATAGTATAGGT
-AGGTGGGGGGGGGAGGCGAAGGGTACTGTAGTTTTCGTGGTGGGACCCAA
-GAATTTGAATTTCACAAGAATTTAACTGTTGAACTCGAACTTTTCGATTC
-TAGGGTCTCGCCACGCAAAAACACTTACGCCAACTTTTTTGAACCCTAAA
-AAATGATACTCAAATTAGAGTTCTCAGTGAGCTAAATTCGATTTTACAGT
-ATTTTTTTAATTTGACGTTCTGTGGGTCTTACACTCAAAGGGTACTGTAG
-TTTTCGTGGTGGGACCCACTTGTCCAAAAATGGACGTGATTATATTTGGA
-TTAAAGCCCCTAACTTTTCTGATTTTTTTAATAAATTGGTTTTATTTTGA
-AAAGACTGAGAAAATTGAGTTTAGATCGAAATCAATAAAAATCGCGTCGA
-GACCCAAATTTCCCGGGTCTCGGCACGAAAATGGGGGAGAGGGTACTGTA
-GTTTTCTGGCTTCTCTCATAAATTGAAATGGAAGAGTTTTTGCCGAACTA
-GGCCGGCCATATCTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGGCTCA
-ATTTTTGTTTTAAAACATGAGGAAGACCAGAATCCCGTGTTTTCGTGGTG
-GGACCCAAATGGGTCATGATTATACTTATTTGAAAGGCCTTAAGCTGAAT
-TCAGATTTAAGATTTTTATTATTTTAATTCAAAAATATCCTGAATTTTCC
-AGAATTCGCAGCCAACTTCGCGTGTGGTGCTCCAGTTAGCCGAAGTAGTC
-CAATCGAAGAGTCCGACGGATCCCTGGTCTGCTTGATCTGCGGTATCTTC
-GCCACCGAATCTATCGCCGAAATGATGGAACACGTGGAACAAGACCGTTC
-CAGGACGTTCCAAGGAGACGTTACCGTCCTAAACGGGAGCTTCCGGTGCC
-ACTTGTGCCCGTATAATACCACATTGAAAGCCAATTTTCAACTACACACA
-AGGACGGATAAGCATCTGCAAAAGGTTCAAATTGTGAGTTTTGTATTCCC
-CTCTCATCATCTTCTTATTTTTATTGTGTCGCCCTTTTCCCATTTTTGTG
-TGTCTGTGTGTGTATGCGCACCGATTTGCATATACACATAAATTCATGAT
-TTAATAGCGTAATGAGTAATATTTGCTTTGCCAAGGCTAACAGTTTTCGT
-ATTTTAAAGCCTTTTTTCTACAATTTTTGAAAAAAAAATTCAAAAATTTG
-AACATTTCAATATATCCCTAGAAAGCTCAAAATTGTAGTGAAAATTTTGA
-ATTCAGTACGCTGAGACCTTTAAAATAAGTATAATCATTACTAGGTTTTG
-GTTCTGACGCGAAAGTGTTCGTGGCGGAGCCCAAGCAAGGCGTAATTGAT
-TATAGGGTCTTTGCACGCAAAAAATTTAAGGTCCGGTAGGCGTGGCGGGG
-AGTTTTTCTTGAATTATTTTAGTTTTTCATAAATTTTCAATTTTTTGGAA
-TTTATTTTTCTCTCCCTTCCCCCGCGTAGTCTGAGCCTAAACCTAAGCCT
-GAGTCTAGGCCTAAGCCGAAGCCTAGGCCTAAGCCTGAACTTAAGTTTAA
-GCCAAAGCCTGAGCCTAAGCCTAAGCCTAACCCTAAGCCTCAGCCTCAGC
-CTAAGCCTAAGCCTAAGCATAAGGCTAAGCCTAAGCCTAAGCCTGAGCCT
-AAGCTTTAGTCTAAGCGTAAGCCTAGGCCTAACCCTAACCCTAAGCTTAA
-GCCTAAGCCTAACCCTAAGCCTAACCCTAAGCCTGAGCCTAAGCCTAAGC
-CTAAGCCTAAAGTCTTCGTGTCGAGACCCAATTATACTCAATTGAAAGCT
-CACAATGAGCTGAATTCAAATTTCTCAATGAAAATGTGAAATACTTTGAT
-TTTACGGTCGGTGGCTTTACTCCCCCCGAACTTTGGAAAAAACTCTGAAA
-TTTTTTTTTCATTGAATTCCAACCGGTTTCTACTCTCTCCGGCTATTAGT
-GTATGTGTCTTTCACTTCTTTGTTCTCGTCGGGTTGTTCCCAATTTCCAA
-CCCTCGTTTTACTCATTCCCCCTCTCATTTTCCCAATCCAATTAGTTATA
-CCTATGGGGGGAGGTGACGGTGATGATTCTCGCCATTAAGACCCCCCCCC
-TCTCCTGGGCCGATTGAGATGGAAACAAAACAAAACTGTCAATTTGAATA
-AATTCGCAATTTGACGCGGGCGGCGCAGCGGGTTGCCGAGAAGGATATAA
-ACTGGGGAACTCTACTTAGCCCGTAAGGTGTCGGCTGCTACTATTTTATC
-ACATCTCAATTTTTACGGAATCCCGTAAGGCGTCGGCTGCTTCTCTGTTT
-TTGCATGTTTTTACAATTTCGGCCCGTCCGATGTCGGCTCCTTCCAATTG
-TTTTGCAAAACAATTTAAAATTTGAGCCAGCAAGGTGTCTGCTGCTCCGG
-CTAGATTTCCAATATTTAAATTTTGCACAATCCTGTAAGATGTCGGGTGC
-TTCTCAGTTTTTACAAAGTTTTTTCTCAAATACGGCCCGCGCAGTGTCGG
-CTGCCACCTCGTATGTTTCATCAAACTTGAACGATTCGAGCCCGTTAGCT
-GCCCGCTGCGTCTTTTTTTTTCTCAAAATTCCAGCCCGTAACTTTTCGGT
-TGCTGAAATAAACAAAATTTTTACGAAATTTTAACCCTTGAAGTGTCGGC
-TGCAAATTAAGATACCTACTCATTCAGATTCCCGTCTCTCCCTCTCCCTC
-TCTCTTCATTGGGGAGTCCTTCTCCCGAGAGAAAATGAATAAAACTGTCA
-ATTTGAATAAATGCACACAGCGGGAGATGTTTTTCTGTGAAGACTCCACC
-GTCTTCTTCGTCTTCTGCCTATTAAGCGATGATCCTTTCACTTAACTGTC
-GTTCCCTCCCCCTCTCCACATACCAATAAACCTTGCCAAAAGGTCGAGTA
-TGCTTTGCCCGCCATCGTGCCGGAGGTCTTTTTTCTAGACTATGATGTTT
-TTTTTTGGAAAAACATTTTTCTATGGATCGATGCACCATGATGCCGAGTT
-GCCGAGTTTTCAATTTAATCAATTTTGAGATTTCAATTTTAGTCCCTTGT
-ACATATTAATTTTTTTGGAATTAACATTAAAATTTGATAAACTGTAGCTA
-CAACTATTTATTTTTGTGCCAAATTATACTATCCAATTTGACTTGTCTCT
-TGATGCACCATGACTAACTTTCTAAGATCTCATATTTTGGCCTAAAATTA
-TTCTCAAATATTTAAATTTAAACTTTAATCCTATTTTTTTTAATTCCTCG
-GAAAAAACCCCGTTAACAGAATTCCCAATTTGGCCTCCAGGAGCTTTTGT
-CGATGCACCATGTTCAACATTTTTTCAAAATTTTGCTCATTTTGACCTGA
-AATTTTGTCATTTTTTTATGTTGCAGGGTTTTTTATTTTGTGATTTTTGC
-GATGAAAACCACATTATGTGGATGAAAAAAGTTTGGAATCTAGTTTTCCC
-GTTAGGCTGCCATATTGCTATGTAGTTGATGCACCATGTCCAGCTTTCTG
-AAATTTTACTTTTTACATTTTTTGCTCAGTTTGACTTTAAAATTTTGTTA
-GTTTGACCTTAAAATTTTGTCAGTTTGACATTAAAAATTTGTCAGTTTGA
-CCTTAAAATTTTGTCAGACATATAATTTTTTTGTGTTTTTTGGTTAAAAA
-ATTGAAGGTTTTTCGCGATATTTAACACATTACATGGAAAAATTCTTTTG
-ATCGAGTTTTCTAATTTGTTCGTGTAGCAAGTCGATGCACCATGTCCAAT
-TTTTTAAAATTTTACTTTTTTTAAATTATTTGCCCAGTTTGACCTTAAAA
-TTTTGTCAATTTTACCTTAAAATTTTGTCAGTTTTACCTTAAAATTTTGT
-CAGTTTGACCTTAAAATTTTGTCGGTTTTACCTTAAAATTTAATCAGACA
-TATAAACTTTTCTGTTTTTTGGGTTTAAAAATTGATTTTTTTTGCGTTAT
-TTAACACATTAAATGGCAAAAAATCATGCACCATGTCTAACTTTTTCCAA
-AAACACTTGATTTTTCCCTAAAAGTTTGTCAGAATTATACATTCCTTAAG
-TTCAAAACCGTACGGAAAAATTAGAACCCATGTCGATGCACCATAAGCTT
-TGGCTCGCTGAGCTTCGTTGCTGCTCCTGCATATCTCTTACCCCCTCTCG
-CCGCTCTCAGAACATTGACCAATTACTTGGGCGGAGCGCCGTTTTGAAGT
-CGATTGGCTGATGAGTGTCCCGCCCCGCCCCCCGTCCCGCAAATTTTCGG
-AGGAACTTTGCACTGCACACACACACACACAAATACACAAATACACGCCA
-ATTATTGTCGATTTTTCTTGAAAATTTCTTCATTATTGTATATTGACTTT
-TTTTGTCGTCCTCTAGTCTTCCGCCATCCTCGGCGTCTTCATTCGTTTCA
-TTATTTCATACACCTGTTACCACTTAATTCGCCTATTATCCTCCTCATTA
-CCTTCATTTTTCGGTCGGCGTTGACGTCGACATTGGCGCCCGAAATGAGA
-GGAATAGGGGGGGGGGGGGGGGGGTATAGACGACGGCGACTACGACAACC
-ATGATGACGATCATTTTCGTTCTATTCATCTAATCCTGCTAACCGTCGAT
-TTGTCCCCCTCCGTTTTTCAACTTACCAAAACTTTTCGGTTACCTTGGGA
-ATTGGTCCCCTTTTATAGGCGCGTAAATTGACAACATATTTTGCTCACTT
-TTTCGAAGTTTCACAATTTTTAGTTAGTCCGTTTTTTCAATCTGGCCGAG
-TTTTCAATTTTCCCCGGCCAGGGAATTCTAGTAGTATTCACATAATTTTT
-CTTATTTTTGGTTTTCTAGGCTACGATAAAACTCCCTATGCCCGGCAAAA
-CTTCTAGGTCCCCCATTTTACACCTGACTTCCTACCTATCTGAAATGCCT
-ACTTGCCTTTCCACCTGACTAAGATGCCTACCTACCTAAAACCTACCTAC
-CGAACTATAAGATGACTCCTTACCTACATAAGACTTGCCGATCTGAAATA
-CCTACCTACTAAGACATGCTACCTAGCCTACCTATCTAAGATACCTACTT
-ACATATAATGTACCGACACAAGACTTGCCTACCTACGCAAGGCATGATTT
-TTTAGACCTACCTACCTGTACTTAAGATTTAAGACCTAGATCTTATTACA
-TAAGAATTTTCATCTTAGATACCTACTCAAGATCCTACCAAAGATGCATG
-CCTACCTATGACCTACTTACTTAAGATACCTGCCTACCCAAACCATACTA
-CCTAGCGCTAGCGCCCACCTACCTAAGATACCTACTTACCTATAATTTAC
-CTACACAAGACTTGCCTACCTACGCAAGGCATGATTTCTTATTGTTAGAC
-CTACCTACCTAACTATAAGTACTTAAGATTTAAGACCTAGACGTTATTGC
-ATAAGACTTTTTGTCTTAGATACCTACTCAAGATCCTCTTACCCAAGATA
-TACCTAGATGAACTTCCGACCTAAGATGCCTACCTACCTAAGCCCTGTCT
-ACCTAAGACCTACCTATAAGAACTTCCTACCTAAAAACACCTACCTAAAA
-TAAGCCTTCAAGCTCAAAAATTTTTAGAGCATCTGCATGAGATAAGGCTG
-AAAAATATTAACGAATAAGTGGAGAGCGATTAAGTTCCTGCCCTCTTAAA
-GTTCGGAAGTAGGCGCCGCAAAACCCCATTACTATTGCTCATCGAGCCAT
-TTCCGGTACTCAGTACTTTTTCATCCCCCACTCACTTTTTTCTCTCTTCT
-CGATTTGATTTGCATTCTTTTTCCCCTCGAATTTCGAGCTGAGCCCGGTT
-GATTTCCCGCACTTTCTCAATTCTTTCCTTAAGCCACCCCACTTGACCAG
-GAGCAGTTCATTCAAACTCGCACTTAATCATATTATGACCCCCCCCCCCC
-ACCCCTCTTAATTTCCTAATCCCCCTCCCCCTCCTCCTCATAATGACCAA
-AAGACAATTGCAGGCGAACCATCTTCGTGAGGGAACCCGTCCGCACACGG
-CAATCTACCGTCTGTCGAGCACAAAGACGAGCGTTCAAGTGTTGTGTCGA
-CAGTGTCAGGAGGTGATTTCCAGTGGCGAATCGCTCCGCGAGCATCGACA
-CTTTCACGCCCTGCTTGCCGCCAAGCAACGCTTGTGGCGATGCAAGTTGT
-GTAGGCTGGAGTTCGACTCGGTTCTTCTTGCAGCTGGTGAGTCTTGATAG
-TTTTTTTTAGGAAGAAATTATATCTGTAAGTCCCCCAAATATAAGGCCCC
-CATGTCCATCTTAATGAAGCTTCTGACTTAATTTTTACTATAGATTTTGA
-ATTTTGTCTATCGGAAGAAAAATTAGGTTCACCATGATTTTTCGATTTTT
-TCGATGCACCATGATTTGTTGCTAGAATAGAAAACAATTCGTGGCCAAGT
-TTTTTAATTATTTCTTTTTGTCGGCCAAGTTGCAAAAGTCACCTTTTGTG
-TATGGATGCACCATGACCCTTTTCAGTGGATTTTGGCCCAAAAATCGTCA
-AAATTTTGAATTTTTAAAAATCAAACTCTAAATTACCTTTTTTTTTCAAA
-TTTTCTTAACAAATTGGAGCATTTTAGAAAGTTCCGATGCACCATGATTT
-TTGCTAGAATTGAAAAAAAAATTGTCGGGCAAGTTGCAAAACTCACATTT
-TATGTATCGATGCACCATGACCATTTTCGAAATTTTGCGGTATCTATTCA
-AATAGTGCACATAGCCGTAAAACATTGGTGGTGGCCTCGTTTTCTCATGC
-TTCGGCCACGAAAAAAAAAATTCTACAGTTTTTTGGATCGATGCACCATG
-ATTATTTTTCAGTGAAAGCCTGTTTTTGCTTAGCTCAAAGGCCGGCTTAA
-TGTTCCCACAAAACGTAATCCAAAAATTTAAATTTTACCGTCAAACTTTT
-AGCCTGGCGTACACTAAAAATTGTAAAGTTTCAATATATCAAAAATATTT
-CTGGCCTATAAAATTAAACCTGAAAGCTTAGAAATCCAAGATATTTTTTA
-AAAATTGATGTCCAATACATGGGTGTGCAGCAAATCTTAAAGTTTGCCGT
-GCTTAACAAACTCCGAAAAAGTGTGATATTTTTTTATGCTTTTTGGAGCA
-CCAAAACTACTGAATTCGAGCTTAGCAAACGGCAAATTCGGCATATTTGC
-CGCACACCCCTGGTCCACTAGTTAAGCAAAACCCACCGCTGAAAACTAAT
-CAATTGGTGTTTGAAACGGTGTGTGCTACTACTAGAATTTCGCTGTTCAA
-AATCTCTTTATTAAACACTTCTTTGTGTCTATTCTGCCCTTTCCTCCTCC
-CCGCGCAAAATCCACTTGTACCTCTAATTACGGTCAACAAGTTTGCGGGT
-TTAGTTTAGTGAATGAATTGTGAAATGAATGAATGAATGAATGGATAGGT
-AGGTGTGTATGTATGTGGAAAAGTGCGACACACACAACCAGCCGTCCACC
-ACCGCCACTACCACCAGCAGTAGCAACAGCCATCAAATATAATCCTTGCA
-TTTCATTATTTCATAGTGTCATAGATAGTAGCAGGCCCGAGGTCCGAAAG
-GCCTTGACAGCGGTTTATATTCATTTCATTTGACACCCCCCCCCCCCCCC
-CCCCCTCCTACTATTCTTCTTCTCTACCACATACATTCACATAGTCAGGC
-CATTCATGTTTTTCACACAATTTTGTTAATAAAGCCGCTCTGGCGCCACC
-TCTCAGTAGTCCTTCTTCTTCATCATCATCACTCCCTCTCCCTTACCAAT
-AACCAAAAACAGTCATTGATGCGTATCGGAATTATAATCGCGCATTTATT
-GTAGGACACATGACTTGCCACGAGCCGTCCACTTGGCCCAACGAATCACT
-TGGTGAGTCTCTTTACAGTGAATCTTGAAATTTGTGTTGTTTTGTTGTGA
-AATATTGTTAATCGTTTTTTTATTAGTATCTCCAATTAGGCCAAAACTAT
-AATCGTGAAAGAATAGTTTCTGCACATGGTGCATCGACCTGATATATCTC
-ACTTTTTTTGGGCTTCATCAAAAACTTGTTAGCTAATTATAGTTAAGCAT
-CACATCTATTGATATGTTCAATTTGAACAGAATATGGTGCATTGCATTGT
-ATTGCAACTGAAACAATTTTATTGGCGCATAACATTCAACTATGTAGTTT
-ATGTACATCGATCTTAATTACCGTATTTCCTCTATTAGTATTGCACCCGA
-CTAATTAACTTTGAAACGTTATATCTCGGTTCATATTGAAGATATCAATA
-TATAATTAACTATGAAATAATAGCAAAAGAACTAACAAATATTTTGTTAG
-TTGACCATTTTTGAATAGGACAAACGATTACGGAGATATAAGCTGTCAAA
-AGTGGACAATGGGGTGCAATACTAATTGTGTAAATACCTTATATCTCGGT
-TAGCTTTGGTTTTAACAAAAATTTTAAACTGACAAAATATAAGTCATCTA
-AATGTCTATAGTTTTGTAGTTAACAATTTTTTGATATCTTTAAAATGAAC
-TAGCGATTTTCGACATGGTGCATCAACCTCAGTTACCTAGTCTAACTTTG
-CTGGCTTATTTCTTAGTTTTAGTATTAACCGTTCATTTTAATATACTTTT
-ATAGATAGTTAACAATTTTTTGATACCTTCAAACTGAACCGGAGCGATTT
-TAGACATGGAGCTTTGATCCTATCTTGCCTTAATTTTCAAGCTTATCTTT
-TTGTTGTAAAAAAAATTTAGACATGGTGCATTGACCTGAACTACCTGATA
-TATCCTACTTGATATATCTTCAATTTTAGCAAGTTTTGGAAAAAAAAAAT
-TTTAATGAAATCGATTTTTTTTTTCAATTTTCAACCTTCCGGCCAAAATT
-TTCAATTGAGTTTTGACCTTTTTTTTTAACCCGGCAAAAATCTAAAAACT
-CCCAAGAACAATCTCCCACAAAAAACTAAAAACTTGTGAATCTAGATTAG
-TCAAAAATTTGCACCTTCTTCCCATGGGATGGCTCAATCGAACCCAGTTG
-ATGAATCGGCCTGTGGGCCGCGAGCAGTCGCCGCTCTAATTTGGAGCATT
-TGTATATATATAGCGAAGAATTTCACGTGACCAATGAAACCAATAGAAAT
-CCAATCATATTTTTGTTTTGTCTCTAAATCATCTCTTCCCTCTCTCTCTC
-TTGCCCCTCCTTAACCAATCAGAGACGCACACACCGCACCGCCCGTCCGT
-CATCGTCATCGAGTTCCGCAATTAGTCGTCTATTCTCTCCGTTTTTGATT
-GGAGATGGAGCGAAAATGAAAGAGAAAGAACGAGAGAGAGAGAGAGAGAT
-TAGCTCTTAGATTCATTCAACTAATCTTGAAATAACACACACACACACAT
-ACACAAATGAATTATCTTCATTTCAAATCATGGAAATCAGCAAATTCGCT
-AGAAATTTCATGGAAGGGGAAGCTTGAATTAGGAGCACTACTTGATACCG
-AGTTGGAATTGTAGTCTTTTAATATTTGAAGAAATATCACAATTTTTCAT
-TTTAAACTTCTAAAAATATGCAAGTTACTTGATGCATCATGCCTCTTTAG
-ATAACGTTTTTTTTAGGCTTAGGCTTAGGTTTAGGCTTAGACTTAAGCTT
-AGGCTTAGGCTTAGGCTTAGGCTTAGGCTTAGACTTAGGCTTAAGCTTAT
-TCTTGAGCTTAGGCTTAAGCTTAGGCTTAAGCTTAGGCTTCGGCTTGGGC
-TTAGGCTTAGGCTTAGGCTTAGGCTTAAGCTTAGGATTAGGCTTAGGCTT
-AGGCTTAGACTTCTAGATACTTTCTCAAACCACCAAATTACTGTATATTC
-TCTATCATAGATACTACTTCCATTTGGCAGCTTATAACTCAAGTCTTTTG
-TTAGAGATATCACTAGCTTTAATTACAACATTATAGGTTAATAAATACAC
-CATATTTTGTTAGTTTAAATTTTTTGATTAACCTAACGAGAACCGAAATA
-TGAGTAGTCAAAGATTATCGATGCACCATGGTACTACACTTTACTTTGCC
-GGCTCATAACTCGGTTTATTTTCAGGATATCAAAAAGGTTTTTACTACAA
-ACCTATAGAGAAACATATAATAAAAATATTACTATTTTGCAAAATTTTGG
-TAAAACTAATAAGAATTGAGATATAGGCCGTTGAAGTTGCATGATGCAGT
-TCAAAGCCTACGGTTTTAGACTTATAGCTTTAAAAGGAGGTACCGTATTT
-CCTCTATTAGTATTGCACCCATTGTTCAACTGTGACATCTTATATCTCAG
-TTACTGTTTGTTCTAATCAGAAATTGTCAACTAACAAAATATTTCTTAGT
-TCTTTTTCTATCATTTCTTAGTTGACCATATATTGATACCTTTAAAATAA
-ACCGAGATAAAACGTTTCAAAGTTAAGTAGTCGGGTACAATACTGATGGA
-CGAAATACGGTATTGAATATTTTGATCTACGTAACTATTTGATCTAAAAT
-CTCGATATCATTTTAATTTCTGATCCATAGCTTTGCGTTCAATTATCCTG
-CCTAAAAAATCTCTAAAAATAACGTCTACGAGAGCGGGTGAAACAATAGG
-TGGTTAGATGTAAGTTGATACCCCTGAAGGGCATCCGGGATCCCCGCGCA
-AAAACAGTACAAACATGAGATGTACAATCCCCCATTTTTTTGTGGTCGCT
-CTAAGTTGAAATCGATGCAAAGACATTGTCAATATAGCCGTGACGCGACG
-GGCGGGTGGGCTGGCGCGCTCGATGAATCAAGATCGTTTTGGGAAGAGAG
-GGACTGAAAATATTAAAACAACATTTGCATTTTGTAATTGTTTGAATCAT
-CATCATCATCATCATCATCAATCATATCATAGAGGTGGCGAAACTTTTCC
-TGCTGGGAATGTGTCTCCTTTTTAGTACAGTCAATAAATGTGTCACTTTT
-GAACGGGGGAAAAGCTTTTCTGCTTTTCTTCGCTCTCCACCTCCTTCCCT
-CCTCGCTCATAAATTTCCATTTTTCTCTTTACAAACATTGATTGATTTCC
-TTATTCTATTGACTTTCTGATATTAAATTGATCATCTACTAAAAGGTATA
-TATATATATAAGGTATATCAACTCTTGGAGCCCATATCTTTAATGCTCAT
-CAAACTCCCAGTTAGGACTGGGAGTGAAGTACTGGGTGGTGGGATAAGAA
-AGTTAGGATGTGACGGGTTTCATGCTCATCTCGAGCTGCCAATCTTGCAC
-ATTAAGCAATTGGCTCATTGGCATGCTCTTGTCCTCTGGGCCTGCCGCGG
-AGCCATCTCCCGTTTGATATCTGCTCCCGGGGGACGTTCCCAACTTGGCC
-GGAGAGAGGCGCCGCGAGCAGCACAAGCTCAACCAAAACTTTTCTAATGT
-AATGGGCCGGAATTAGGGGAAGAACAAACGAAGGAGAGGGTGGGGTGGAT
-GAGGAAGAGAAAAGAGCACCACCACCAACTGATTTGATGGTTGGAGAGGA
-GCTCGTTTTGTTTTCTTGTCGTCGTAAGAAGAAGAAGAGAAGCGCGCTAG
-TTAGTGGTTAAACGAATCAAGACCCGAATGTGATAGATGTGCCGCCAATT
-TAGCCAGTAGGATTTTTGCTGATTTTGCACACATTCATTTTTCGCTTGCC
-TAGACATTACATCCCATCTTATTCCGCTTCATTCATTGTCGTGATTTTAA
-GATTTGGGGGACCTAGGAGCCTCTACAGTATTATTTAAATTTCACTTTTG
-TTTGGATTTTGAAAAGAGATGCGTCATACATATTCATTTTAAGGCACCTA
-TGTATACAGTTCAAAATTTTGGAACATTCCTGGAATAGCGATCTTAAAGC
-GGGAAATATAATGACATTATCTGACAATTTTTTCGAACACCTAAAAAACT
-TGAATAAAGCCAATTGAATCGTATCCCTAATGGTTTGCAAAGTTGGGCCA
-TGCTCTGAATAGCTTAGAGTTCCATCCTGACCTGGAGCTCGCCAGAAGCT
-GAACGCACTGAACTTCCAGTCAAGCCTCTTTTGAATAAGTCTAGTTGCAG
-ACTAGAAGCCTTAACTACCTGATGAGATTTTCACCCTTCTCTCATTAGTC
-TATTTCATTAAGCATGAACTTACACGAGAATTCCAATTACATTACCATGT
-AACATTACTTAAGATCCCATTTCCACTTAATTTGTGAAAATCGATACGGT
-TTTATAAGAAGTGTTTTGTCCTTTTGCCTATAGCCTAGAGCAAAAATACC
-CAAATTATTTGGCAGATCATGTCTCCGACAATATTCTGATCGATTAAGAA
-ACTTTTGCAAATCTGCTCGGTTTTTTAGTCTACATTCGCCCCCAGATAAC
-TGTTCTCGGCAAGTTGCCGATTTGCCGATTTGCCGGAAATTTTTCTTTTC
-GCCAACTTACTGATTTGCCGGAAATGTTTAAGGGATTTTTTTGAAGACGG
-AAAATTTTTTCATTAGATATGTTCATAGAATTAGCTTGCATTACAAAATA
-GGTGTATGAACATATTCAAAGGATGCGTACAATTTTGCCGATTGAAATTG
-AAATTCTGAAATTTCCAAAAATAAATGTGCAAAACCACAATTTGCCGTTT
-TCCGGCCAATTCGGCAAATCGGCAATTTTCTGGGTTGCAAATTTGCCGGA
-AATTTTCAATTCCCTTTATTTGCCGGGTTGCAAATTTGCCAGAAATTTTC
-AATTCCGCAAATTTGCCGTTTTTCCGGCCAATTCGGAAAATCGGCAATTT
-TCCGGGTTGCAAATTTGCCGGAAATTTTCAATTCCCTTTATTTGCCGGGT
-TGCAAATTTGCCAGAAATTTTCAATTCCGGCAATTTGTCAGTTTGCCATA
-AATTTTCAATTCCGGCAATTTGTCGATTTACCGGAAAAAATCGTTTGCAC
-CCACCCTTGATGTGAACGCTAGCACTACCTCCTAGTATTAAGGCTCCAGC
-TAATTTCTATATCATGGCTCCCAACTATACGTTCCTCCCTCCTCCCCCTT
-CCCAATTTCGAATGGGCGCCAATTATTGCTCAATTCCCATCAGATTGGGG
-GGGGGGGGGGGGGGGGCATTCGTACAGTGTCAACACGAATAATAATTATG
-AGCCCTCTTCTATGCCCAAAGCGCGGCGTCTTCTTCTTCACCCCTCTAGG
-AAGTTCTCATAATTAGCATTTTGTAAGACTCGGTGTCCCCCTTTCAAGTA
-TCTCTGGATGATTCCCCCCTCTCGCACACACTCTTCCCATTTTTTTTTCA
-CAATAATCATAATCATCAAGTTGGACACCAAAAAAGCCATAAATTCGATT
-CCGGTCGAATCGAGAGAATTGGAAGAGAGAGAGAGAGAGAGAGAGAAAGA
-GGAAATGAGACAGAGGGGTGAGAGATGGAAAACGAACAAGTGTGATGGTC
-GTCCCCCCCCCCCCCCCCCACGGGGCCGCTCCTCATTCCTATATTTATTT
-ACAGCTCTCTCTCTCTTTTTCTCTTCAATTTCCATCTCTCTCTCCTCATC
-TACAGTAATCGGGGAGGGGCTAGTGATAAGCCTCTCCCCGCCCCCCCCCC
-CCCGGCGGTTAGGTGTCAGAAATTAATCATAGAGGCCACGCCTCTAATGT
-TTTCGGAGCATCATCCTTAATTCTTTAATTCATTAACCTTAATTCATTAG
-TCTTACACTGAATTTCATAACTAAACTTGTTGAAAAAACTTCTCAAAAAA
-AAAAGTTTTGGCGGCTTAAGAAATGGCCTAAAATTAGTTCGACTTTTCAA
-GCGGCTGGAAACTAACTTTTTTTGAAATCCCCCCTAATTATGGGTCTACA
-ACGTAAATAAAAAAATTTGGTGACCAAATTTATTTAGGCCAAATCTGGTG
-TTCAAATTTTTTAGGCCAAATCTGGTGACTAAATTTTTTAGGGCCCAATA
-TGGTGAAAAAATTTTTTAAGGCCAAATCTGGTAACCACAATTTTTTAAGG
-CCAAACTTTTTAAAGACCAAATTTTTAGAGCCAAATCTGGTGACCAAATG
-TTTTTAGGGCCGAATCTAATGACCAAATTTTTTTAAGGCCAGACCTTTTA
-AAGCCCTAATTTTTTAGGGCCAAATCTGGTGACCAAATTTTTTAGGCCAA
-GTCTTGTGATCAATTTTTTAGGCCAAATCTGATGACCAAATTTTTTAGGC
-CAAATCTAATGACCAAATTTATTTAGGGGCCAAATCTGGTGACCAAATGT
-TTTTAGGGCCAAATCTGGTGACCAAAATTTTTTAAGGCCAAATCTAGTTA
-CCAAATTTTTTAAGGCCAAATCTGGACACCGAATTTTTTAGGCCAAGTCT
-TGTGATCAAATTTTTTTAAAAATTTTTTTCAAATCTGGTGACCAATGTTT
-TTTTAGGGCCAAATTTGGTGGCAAAATTTTTAAGGCCAAACTTTTAGGAC
-AAATCTGGTGACCAAATTTTTAAGGCCAGAATCCACAACTTTTTTTTGAG
-AAATTTTGAAGAAGTTTCTAATTCACCTAATTCATTACTCTTTTTGAATT
-TAATCTTCGATATTCCAGATTTCAAAACGATGGAGGATGCGGCGTACGCG
-TGTGCTGGCTGCGAATTCACCACAAGTGAGTTTTTTTTGTTGTTTCCTTA
-TCAGCATCAGCTCTATGCCTTCTCCCCACCCCACCCCGCTCCTCCTGTAA
-CCTTCAATTGCCATTCATTTCACACAGTAATAGTACCACACAACACCCTT
-CCATGCCTTCAATTTGACTCATTAATAGCCCTTTTCACCATGTCTTTTTT
-CCCCCTCTTTCTCTCTAATACTCAACCTTTACCTACCTACCCGCAATTTA
-ATTGGCAACTAATTCGGATACATTCGGACGGCTCAAACGATGCGCGTCCG
-TCGTCGGGTGCCCGAGACTGGGACCGGTTTTCAGAATGTCAGTGTATGTG
-TGTGTGTGTCTACCGGCTGGCAGGCAGCCACACCACTGCGATTCGTTAAT
-TTATTGTGAGATGATGACTGTACATTATTTTGAGTGCTGCTGGTGCTGGT
-GGTGTGCATCATATAATTATAGCCTAGTTGATAGAGATATATCGACACAC
-ACACACATACACATTTACTTTCAATTGCTTCTACCCAATCTTTTTTCTTC
-CATTCTCCAATTCCTCTCCTTGCTCCCATTTCGCCCTTTGATATTCACCG
-CGTTTCGCGTTTCGCACTAATTTCGCGCCCGGACCGGTGTGCTCGGCGCG
-GCACGTCTTTCATCTTTTTGCCTCAATTTCATTATGATAATAATAATCAT
-AATAATTATGCGAGACACGGCAAAGACGCGCTCAAGAAACTGATAAGTGT
-GTATAGGTCGGGTCCTTTTGAGAGAGAGAGAGAGCGAGGTGTGATAAGCG
-CGTCTAATGAGCATGGGCAATCATAACATTCCTATCAGCATATCAGCATT
-AAAACATTTTTTTCAGAAGACGTGTCGGACTTTGAAGAGCACGCAAAAGG
-ACACGAAGAGGAGGCGGGAGCCTCTTCACAGAAGGCGTGTGCGCTGTGCC
-TTGAGCCCACCGACGACCTCGAAAAGCACCTTGTCGAGCAGCATCGCATC
-GCCGAGAGCGCCATCGAAAAGTTCCTGCTTACTGAGAGAACAGCCAAGTG
-AGTGTTTTTTTTTGTCTTCAACTCAAATATCTAGTAGTAAGTCTTATACT
-TGGCTTATATTTCAGCGGTTTCAAAATATTTTTGATAGCTTTAAAAACCA
-TAGAATAACAATTAATTTGACAACAATTTTGTCGTTTGAATTTTTTGACA
-AAAATTTTGTCGTTTGAATTTTTAAAATATGATCAAAGACAACCGAGATA
-TAAACGGTCAAAGTCCAGTGAGAGGGGCCATACTAATAGGGATTATACGG
-TAGGTAACGAAATTTTGATAAGACTTATAAGGACAAAGATAATGGAGCTA
-GAAAGTTTAAACTAGTCCAATTTGAACAATAAAAATATATATAACGTACT
-TTTTAGTATAAATATTTTAAAAGTAGAGTAATCTGAGATACAGTAAATTT
-TTAACAATTTCTAGTCGATGCACCATGTGCAAAAACTAGTCCAGTCCTAA
-AATTAAATAGCACGTACTTTTTAGTATAGATATTTCAAAAGTTAAGCCAT
-CTGATATACAGTGAATTTTACCAATTCCTAGTCGATGCACCATGTGCCCA
-CTTAACTTTCACGGCTCACTTCCCGGCTAATTTCAAACATTTCAAAATAT
-TTTCAACTATTCAACTATAGAGGGGTTTTTAATAAACATTTTCTCAGTTG
-ACGACTTTTTTATAGAATCAAAGACTACCTAGATATAGCTAGTTAAAGTC
-GAGATGCAAGATTTTTCGGAAAAATCACGTGGTGTTTTCGGTTTGATCTA
-CGTAGATCAACGAAAAATGCGGGAGAAGAGACGCAGAGTTATCAACTGAT
-TTCGTATGGTTAAGAACGTGCTGACGATGTCACATATTTTTGAACAAAAA
-ATTCCCGCATTTTTTGTAGATCAAACCGTAATGGGGCAGCCTCGCACCAC
-GTGAAAAATTAGTTTTTGAGGCTTTTCTAGTCTAGAACTAAAGTTTTTTT
-TTTGATTGGCCTTGTTTTTTCTAGTCTTAAACACCAGGTAGATCAAAACA
-AATTTTTTTTCAGAGTTTCGATTTTTATGAATTTAAAACTTTCAAATTGT
-CGCACTTCCTGTCCCTTTCAACCCCAAAAACGTTACGATTTTGTGCTATC
-ATAATCATTAAACCATGCTTGCTTGTGTCAAGTTGCACAGGGTGCGCCGG
-GGGGGGAATTGGCATTACTGTAAATTTCCTGCGTCTCCATCCTTGCCCCC
-AGTGTCCCCATCGGCAATTAGAGAGTACGATCCGATTTTGCATATTTTAT
-TCACGTCGCCTCTTGTTTACTCGCTCTAAATTTCAATCCGTCGCCAACCC
-CCCCCCCCTGCCTGCCTCTTCCATTCATCATGAGTATTAGTGTATTGATT
-AATTTTCGAATTCACGAATGAATTCATTGCTGGCGCCCTGCTACTAGTAA
-TCAGTGAGGTCATAGCGTTGTCCTTTCGATAGGGCTAATTAAATGTTTCT
-CTAGGAGCGGGAGGATAGATTTGAAATCAGGTGGGCGTCGGTTTGATCTA
-CGTAGATCTACGAAAATCGCGGGAATTTAGACGCAGACTTCTCAACTGAT
-TTTGCATGGTTAAAAACGTGCTGACGTCATATTTTTAGGGGAAAATATCC
-CGCACTTTTTGTAGATCAAACCGTAATGGGACAGCCTGACACCATGTGCT
-CAGTTACAATTGGAGGGTTTTGTCGGAAAAAAATCAATTTTTTAAACTGA
-CAACACATTTTGCTCATTCTCCAAAACTGAGCCAAATGTGTTGTCAAACT
-TTTCTTGAAATTTTTTTGAATCGAAATTATGTTGAGGTGAATTTTCAAAT
-TTCAAAAAATGCCCCATTTCTATCAATTTGTCTTCACCTATGTTTTCGAA
-TAAGGGCGAGGCGAGAGGCAGGCGGAGGTCGCCTTAAGATCATAAGATAG
-CCTTATGTGATGACGAAAAATGCCAAAAAATGTATTTTTATATAGTTTCC
-CCGTGTGTAGAAAAATGTAAAAAGAGCATGCATTTTGTGCATTTTTTGAC
-ATTTTTCTGCATTTTTTTTTGACATTTTTTTTTCATTTTTCCACACAGAT
-GAATAGCGGAAAAACGGAAAAAAATACATTTTTGCATTTTTCATGATCAC
-ATGATCAACCCCATAAGGTTTTTTAAGGCATAATATTGATATTTTTTATT
-AGTCTACTTTGCATAATGCCTACTATTGAAGGCAAATCAAATCGACATCA
-CTTTTTGCTCATTTTCAAAACTGAGAGGCACGGCTTCTATGTTGACTACT
-AAACCAGTAATAACACTTATAAAATGTTTGGAAAACACTCATACACATTG
-CCACGTCATTTGGATGGAAGGGACCCCATTTGTTGAATCATAATTGATTG
-TTAAACTATCATCACTCTCCCCCCGCCCTCCTCATTGGACCCCACGGCTC
-CAAACTGTCTCCAATTTGCTCCCCGTCCTCTTCTTATCACCTTGACGCGT
-AATTGAATTTTTGCGGATTTCTTCCTCCCCACCGCTTCCTTTGCTCCTTG
-GGGGAAAAGTATGGAGAGTGTTTATGTGTGTGATTGAATTGAAGAAGGTG
-GCTGACTCATTCTTTCATTTTCCTCGCTTTCTTTGAAAGAACAACTTGAC
-AGTTTCCCCCCCCCCCCCCCATCTTATAATAATAATTACTTGCAGAGAAG
-CGTCGTGTTCATCGTCGTCGGAGCCGAGCTCAGAATTCGCGCATCGCTGC
-TCGAGGTGCTCGATGGCGTTCCGAAGCGAGTCGCAGCTGCAGACGCATTC
-CCTTCAGCACGTGTTCAACACGTTCCACAAGTGCCCCACGTGTGGCGATT
-CGTTTGATGAGAATACTATTGTGGTGAGTGAATTCACAACACTTTTGGCT
-CACAGTCACGCTTGATCTACGTGTTTTTAGACAATTTTGAGTCTACACGT
-GGTGTCAAAGTGTCTCATTTCGGCTTGATCTGCGTTGATCTACAGAAAAA
-TGCGGGAGAAGAGTTTTGGGCAAAAAATTCCCGCATTTTTTGTAGATCAA
-ACCGTAATGGGACAGCCTGGCACCACGTGCTCAGTTAAAGTAAGAGGGTT
-TTGTCACTAGATTTATTTTTTGTAAACTGACAACACATTTTGCTCATTCT
-CCAAAACTGAGCTAAAAGGGTTGTCAAACTTTTTTTGAAATTTTTTTAAA
-CGAAATTAGTTTTGCTAGTTTTCCTAAAAGGAGCAAAAAGTGTTGTCCAA
-TTTTTATAAGAAGGTTTTTGTCGCCTAATCGATTTTTGTAAACTGACAAC
-CCTTTTCGCTCTTTTTTCAAAATTAATTTTTTTCTTTTGGCATTAATCCC
-ATTTTTTGTAAATTAACAAAAAAATTTCAAAAAATCTTCAAGTATTTCTA
-CAGGGTGGCCTAGATTCTCTATAGGGTGGCCTACATTTTTACACTGGTTG
-TCTAGATTCTTAAACAGGGTGGCCTCGATTCTGTACAGGGTGGCCTAGAT
-TTTCTACACGGTGGTCTAGATTTTCACTGGTGGCCTAGATTCTCACACTA
-GGTGGCCTAGATTTTTCCACTAATAGCCTAGATTCTTTACAGGGTGTCCT
-AGATTTTCACACTGGTGTCCTAGATTCTACACAGGGTGACCTAGATTTTT
-TACACTGGTGGCCTAGATTCTCTACAGGGTGGCCTAAATTCCTTATAGGA
-TGACCTAGATTCTTAAACAGGATGACCTAGATCTTGACACTAGTGGCCTT
-GATTTTTTACAGGGTGGCCTAGATTTTCTACAATGGTCTAGATTTTTTGC
-AGGGTGGCTTGGATTCTTAAACAAGGTGGCCTAGATTTTTCACAGGGTGG
-CCTAGATTTTATACAGGGTGGTCTAGATTTTTACACTGGTGGCCTAGATT
-CTTTACAGGTTGGCCTAGATTTTCTATAGGATGGCCTAGATTCTTAAACA
-GGGTGGCCTAGATTCTTTACAGGGTAGCCTAGATTCTTCACAGGGTAGCC
-TAGATTTTTACACTGGTGGCCTAGATTTTCTAAAGGGTGGTCTAGATTTT
-TGCACTGGTGGCCTAGATTCTTAAACAGGCTGGCCTAAATTCCTTAGGGG
-ATGCCCTAAATTCTTAAACAGGATGACCTAGATTTTATACAGGATGGCCT
-AGAACTACTTTTTGTAAATCGACAGCACTTTTTGCTCGTTTTCCAAATCG
-TTTTTTTTTCAGACCCATATGTTGGAGCACACCAAAGAAGAATGCGAAAT
-GTGCTCTGAAACATTTGCCACAAAAGAGGCATTCCTCTCCCACCTGAACT
-CAGCCCGACACCTACAACAGGCAAAGAAGCAGCTGGAAAACTCACTGGTC
-GACTTAAACTCTCAGGTGAGCCGCCGCCGTGCCTCCTGCCGCCTGGCTAC
-CGTAATCACCGTACCCATTATTTAATTGATTTGCTTTTAGCCACGCCGCT
-GCTGCTCGGAGCGCAGAGGTGACAGAAAAAGCCGACAAAAAACAACATTA
-AAATTATTACACTTTTTTATGATTGAATGCGAGAGAGATGTATGTGTGTG
-GAGAGATGGAGAGGCGCATGAAATGGTGTTCGGGTTCCATAGCAAGCTCA
-TTGAGCACAATGATTTTTTTTTAAATATATTTTATTGGAAATGACAGAAG
-CTGAAGCTTGAAAGGAACGTCCAGTTTTAAATTAAAGTATTGATTTAGCA
-CGTAGTTTCAGCATGTCCCATCACGGTTTGATCTACAAAAAATGCGGGAA
-TTTTCTTCCCAAAAAATTTGACGTCAGAACGTTCTTAACCATGCGAAATA
-AATTGAGAACTCTGCGTCTCAACTCCCGCATTTTTTGTAGATCTACGTAG
-ATCAAACCGAAATGGGACACTTTGACACCATGTGATATTTAAAGGGTCTA
-GAAAGAACTTAAAATAGCCTAGCCAAGAAATGGGCGGAGCTTTGGTAGGA
-ATTTTCATAAGTCGAGGACTCCGCCCATTTCTTGGCCAATTTGGGTTTTT
-GGCCTTCAATTTTTAGTGTTCACTAATTTCCAATAAGTTTAGGATTGAAA
-AAGTTTTTGAGGTGAAAATTGATCCTAGCATAGGCTCCGCCCATTTCTTG
-GTTTTTTTTTTGTTTTTTTTTCTTTTAAACTAAAATTCCACTGAACTTGT
-CTAATTTCAGTTTCCAAAAATTTAACGAAAAAATTCGAAATGCCAAGAAA
-GGGGCGGAGCCTAAGCGAAGCCTATTTTTCGATGAAATTTGGCCAAGTTG
-CGATGTTTTTGAATTTCATATTTTTGAATCAAGTTTTGAAATAAAAAGTA
-ATATAAAATTGGAAAATAGGCTCCGCCCATTTATTGGCTTTGTTGGATTT
-TTTACTGCATAGATCACATTTTTGCATCCGAAAATTTATCGGAAAGGAAT
-TTTTTTTCCCAATTTTTTTCCGTAAACTGTATCATCAAATTCTTTTGAGA
-TTCAAAATATCCAACATAAGCACGGGGTTCTGGCCTTCCTCATTGAATTT
-TTCGCGCTCCATTGACAATCGCCTGCCGGACAACGCGTGGGAAAGTCGTG
-TACTCCACGCGGACAAATACATTCAGTTTTACGCGCCGTAAATCTACCCC
-AGATATGGCCGAGCCAAAATGGCCTAGTTCGGCAAACTCTTTCATTTCAA
-TTTATGAGGGAAGCCAGAACTCCGTACATAGGCGCAATAAAAGGTGAAAT
-AGGCTCCGCCCATATCTTGGATCGGTTCCAATAATGTATCCAAATTGACA
-TGTGTTAGTTACACTTGTTCCTAATCCAAAATTCTATCCGAATTTCAATT
-TCCCAAAGTCAAAAAGTCAACAAGTTCTGTTCTTATATGTGTAAGGCGCG
-CGCGAGCGCGATCGTTTGTCTCTAGTATTTGCTCATCTCTCTCTCTCTCA
-ATTACCGTACCCATTATCATTCCGCCCATGGATGATGATGATGATGAAAA
-TGAGCGGTGGGCCCCCTCTTCCCCTGCCTCTTTTCGCGCATTCATCATGT
-TTGTACAAAAGGCGGCGGTTTGAGAAAAGAAGACAGTGAGAGGGAGGGAG
-AGAGAGAGGTGATGAAGGTAGTAAACGTGTGTCGACAAACACATATAGAG
-AACGATTCGTGTGAAATAGATGAGGGCAAATAGGACGAATTTATTTAAGA
-GAAGAATAAGATGCTTTGGCCCAGATGAGGGGGGGGGGGGGGTATCATGA
-AGGTGTGATGACGAACCATATTCCTTCAATGTTTGTTGCTCGCTTAACCG
-CCGTCGCCGCAATTTAAATTGTTTCGACTGGGTGATCAGACAAATAAGAA
-GACGTAGACGGTTTTTCTTGGGGGGGACGTTCAGCTTTGATTCCTTTCAA
-ATAATCGATGCGGCCTAGCTTTCTGATCTCCAGAAACCGCGGGCCTTCTT
-TGCTAAATTTTAAGCGATTTTACTTCCTCCCCCCCCCACTTTGATCTACT
-TTAACAGCTTATATCTCGGTTGTCTTTAGCTTCATCAAAAAGTTATCAAC
-TAACAAAGTGCGTGCCAAATATACTTCTACAATTCGGTAGTTAGTATTTT
-TTGGATAAAAGTTAAGACAACCGAGATATAAGCTGTTGAAGTAAATTTCT
-AGTTTGACTTACTCCCCCAATTTTGATCTACTTTTACAGCTTATATCTCG
-GTTGTTTTTGGTAACAGCAAAAAGTTGCCAACTAACATATTACGTGCCAA
-ATATTTTTCTAAAATTTGGTAGTTGAAAATTTTTGAATAAAAGTTAAGAC
-AACCGAGATATAAGCTGTTGAAGTAGATTTCTAGTTTGACTTACTCCCCA
-AATTTCGATCTACTTTGACAGCTTATATCTCGGTTATTTTTGGCAATATT
-AAAAATTTGTCAACTAACAAATTACGACCCAAATATTTATCTACAATTTG
-GTAGTTGAACATTTATGTTAAAAGTTAATACAGCCGAGATATAAGCTGTT
-GAAGTAAAGCAGTGGTGGTGCTTAGCTCGACCTATATTTTTGAATTGCAT
-AACAGTTATAACTAACTTATTTTATGTGAAACCCTATTCTAGCTAGTTGA
-CTTACAAAATCTCCAGAAACTTTTGCCTGCCTACCACCTTTAGCAGCATA
-AGCGCCTATAGGCACACCTACTGCCTACACCTATGCCACCTACTGTACAC
-CTACTGCCCATACGCCTACTGCCTTTTGCCTACTTTCTACATAACTTTGA
-ACTGCCCGTTTCTAACCAATAATCTTTTACAGGACGTCGAAAAGCAGCGT
-ATTTATGTGTGCAACGTCTGCAAACAATCCTATCCACAAGCGGCTAATCT
-CGACGTGCACATGAGGTCAATGACACATCAGAGCCGGATGAGCCGGCTGT
-CCGAACTTGTGGCAACCGGGGAGCTTAATGGGGAGAAGGCCGTGTTTGAG
-CAACCAGGAATACCGGCACCGACGATAAACAGCTTCATTGAGACGGTAGG
-TGAGGGGTTTGAGCAGGCATAATCCTGAAAATCATCTGTTTGGTTTCTGT
-GAAAAACTTTTGTGCGGAAAATAGTTTATTTATAGTTCAATTTGAAAAAA
-ACTGGTTTCCGATTTTCAATTTTCAATTTTCAATGTTCGATTCTCGATTA
-ATAAAATTTCCAATTTCCAATTTCCAGACAACCAACCAATCCTCACTGAA
-CGACCTGATGTCACTGCTCACACGAAGCGAGTCGGATGAGATTCGAGAAG
-AAGTAAACGGCCTTCAAGTCATGACACAGATCAAAGTCTACGGTGAATCC
-AAGATCACTAGCCTAGTCCCAGAGTTGGCCGGGAAAATCGATAACATCGC
-GCTCTTCGATGACTCCCGTGCGGCAGAGGTGTCGAAGATCGATTGCTCGG
-CTTGTGGGCAGCAGATCTCAGGGATCCTTGCTTTGAACCTCCATTATGAA
-GAGTCCCACTCATCGAAGATCCCGAGTGACGTGTTAAGAAAGTTCGGAGA
-GCGGTTACTTGCCGCATTAGAGGACGGGTTGAGCAGAGAGAATTCCGTGA
-AGAACGGATCGCAAAGCCCTCTGAGCAATGACGATGAGCCCATGGAGAAG
-AAGATGCGGCTGGAGAATATGCTTCCTGAAATGGACAAGAACGCGGCAGC
-GTCGCAATTCGCAATGTTCCAACAAATGATGAACTGCTTCCCGTTCATGG
-CACCACCAGGCACGTCTAGTGGCAACTTTGGCTTCTCGCCAGAAATGATC
-AATCAGCTCATGAATCCTGCGGCGGCGGCGGCGGCGGCGACTGCAGCAGC
-AGCAGCCCACGCTGCCAACAACTCGCCGGCGAAGAGAGCAAGAACACGGA
-TCACTGATGATCAGCTCAAAGTTTTACGGTAAGTCGTCTTGTGTGTGATT
-ACTGTAAGCTACGGCGAACAGGAGAGACCCGAGGGGGGCGGTGGAAAATG
-AATTGCAAACAATAGGTGGGAAATGGTCGGCGCCGTGATCAAAATGAATG
-AGAAATGAGAATGAAGAACAAACATTGTGTGTGAGTGTGTGTGTGTGAGA
-CGAGACGAAAATCAATCAATTTCTGGAAAAAACAACACATATATTTTCCC
-GGCGAACTTTCTGTTTGAGGGACCGTACGGAACAGGACCCCCCTGAAAAA
-AAAAATCCGGAAAATCCTAAGCCTAAATAGCGAACGCTCGCCACTGACGC
-CAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAGCCCAAGCCTAA
-ACAGGAACCCCCTGAAAAATCAAAAAATCCGGAAAATCCTAAGCCTAAAT
-AGCGAACGCTCGCCACTGACGCCAAGCCTAAGTCTAAGCCTAAGCCTAAG
-CCTAAGCCCAGCCCAAGCCTAAACAGGAACCCCCTGAAAAATCAAAAAAT
-CCGGAAAATCCTAAGCCTAAATAGCGAACGCTCGCCACTGACGCCAAGCC
-TAAGCCTAAGCCTAAGCCTTGGCCTAAGCCCAGCCCAAACCTAAGCCCAA
-GCCTAAGCCTTTCACCTTCCTAATTTTCAGGCAGGCCCTAAAAACCGCGC
-CTGCCTACCATGGAAGCCCTAATCTGTGCGCTTTAGATTCTGAACCCTTA
-AATATGTTGCACGGCCGGGCAAAGGGCACATCAGTGTAAACGCGCTCTAC
-TGATAATTCGAGTTTAGCCAGGTTTGGGCGCGTTTCAAGGAAAAAAACTT
-TGGCTCAAAAAATTGTGAATTTATTTTCGAACATTTTTATATGCATCACA
-AAAATGTTAGACCACCCGTTTTTGAGAAAAACGCGCCCAAACGTCCAGGT
-ATACGGTAGACAAATTGCGTACAGGTACCACTGGGGGGTCGTGTTTGGGC
-TTTAGTTTAGCTAAGGGAATCTGTAGCGGCCCAACGGCCTAACTGCAAGC
-CTCAGCTTATTCGCCATAGGCTTGTCTGCCGTATTTCAAGCCGATTCCAA
-CAAAAAACTTCCAGCCAATACTTCAACATCAACAACTCGCCGTCAGAAGC
-GCAAATCAAGGAGATGTCACAAAAAGCGAGCCTTCCGGAGAAAGTCATCA
-AACACTGGTTCCGCAACACACTTTTCAAGGTTTGTTTATTTATTTTACAA
-AACTATTCATATTGTTATTAGGCTCGGAAATGAGCGAGGTGAGAACATGA
-GTGTGGTAATTAGTCATCGGATGAATACCCACACAAGAGGGAGAGCAAAC
-AAGAGAGCAATTGAGACGAGGGAGGGAGAGAGGGAGAAAATAAGAAAATG
-TTAATGTCAGTTGGGTGCCAGGCGCTCGGCCAGGACCACAGGCCGGGAAC
-CATTTAGTTTTGATTACGATTTCCGTCGTGACTCATGATGGGAATTGATA
-TTTGTGCCTGTGGTGATAGAATAGTTAGAGCAACTATCAGGAAGGGGACA
-AGTCGCAGTGCGAGACTATTAGAACCTGCAAGGTTTATTCTGATAGATTT
-GGGACTAATAAGGACTAATTTGGTAGAGACTAATTGGCTCTCTTGATATA
-TACCAGCTTAATAATTTCTACAAAAAAAACTGTAAGAACGCTTCGAGATT
-CGAGCTTCGGGAAAGCTTAAAGGATGGGTACCGAAAAATTTTTTTTCCCT
-GATTCCGAATATCGATGTGGAAAAATTCAAAAAAAATTCCCTGATTTTAT
-ATTTGAGCTTGAAATCACGATTTTCATTTGTGCCCACCTGGTGTCAGAAT
-GTCTCATTTTGGATTGATCTACGTTGATCTACAAAAAATGCGGGAGAAGA
-GACGCAGAGTTCTCAACTGATTTTGCATGGTTAAGAACGTGCTGACGTCA
-CACTTTTTTGGGCAAAAGCAAAAAATTCCCGCATTTTTTGTAGATCAGAC
-TGTAATGAGACAGCCAGGCACCATGTGTGTGCCCCGGTTCAATTTTCAAT
-TTTTTAAACCAGTTTCTTTTTTTTTAGTCGATAGGTTTTTTTCTGAAAAA
-TATTTTTTTTGCCAAAAATGAATGTAACTGGCTAAAATAAACTAAAAATA
-AAACGATGCAAGCGCGCTCAAATGCGAATTTATTTGGGCGCGAATTTGAA
-AAAAGTGATGCGGGCACAAATGAAAATCGGCGATTTTAAGCCTAAATATA
-AAATCAGGGAAATTTTTTTGAATTTTTTCACATTGATATTCGTAATCAGG
-GGAGAATTTAAAGCCAATTAAAAATATTTTCCAGATTTCGGTGCCCCACC
-CTTAATGAGATAAAAGAGCAAAAAAGGTGTTTTGTAACTTTTTAAGTTTT
-TTCTTTTTCAGGAACGCCAACGCGACAAGGATTCCCCGTACAACTTCAGC
-ATCCCTCCCCAAATGGGAATCGACTTGGACATCTACGAAAAGACCGGCGA
-GACAAAAGTACTGTCGCTTAGCAATGAAGCACCAAAGTCTGAGTTGAGCT
-CTGCGCGCGCCACACCGACAATTCCGACTCCGATACCGCTCATCGTTGAA
-GAGAAGAAACCGGAGCCAAAGAGCCAGACACCATCGTCTTCTTCCTCTCA
-GCTCAACCTGCAGGCTATGTTATCTCAGATGCAGGGAAGTTTTTTCGACG
-CGTCAAACTTCATGTCAGCATCAGTGAATCCGATGACACCGAGCACTCCT
-TCCTGCAACACGTCGTCCAGTGGACGACGAGCCAATCGCACGAGATTCAC
-AGATTTCCAGCTGAGAACTCTACAGCAATTTTTCGACAAGCAAGCCTACC
-CGAAGGATGATGATCTTGAAGCGCTGAGCAAGAAGCTTCAGCTGAGTCCA
-CGTGTGATTGTCGTCTGGTTCCAGAATGCACGGCAGAAGGCCAGAAAGAT
-CTATGAGAATCAGCCGAATCACGAGAGTTCCGATCGATTTGTGAGAACGC
-CGGGATCGAACTTTCAGTGCAAAAGGTTGGTTTTAGTGTTGGAAATTAAC
-ATTTAAATTTAAATTTTCCTAAATTCCAGGTGCAGCCAAGTATTCCAACG
-CTACTATGAACTCATCCAACATCAACAGAAAAAGTGCTACAAAGACGATG
-TAGCAGCCCTGGCAAGTGACAACAAGAGTGTCGAAGAATCACTGACGGAA
-GAAGAGAAATCCCAGCTTCTGGCTCAACAACAGGTCGCCCAACTAGCCAG
-CACTCTGGAGCTCCCAAAGTTCCAGCCGGCAGAGCTTTTGAAAATGATCG
-GAGCTAATTCGGTGACTCCATCCTCGTCGGCTGCAAGTCAGAAGTCTAGC
-AACGACGTTCTGCTGAAGATGTGTGAATCGATTGTTGGTGGGAGCACACC
-TAGTACATCATCGTTCCACAAACTTTGTATATTCTGCGCTCAAGACTTCA
-AGGATCGGAGTGCGATGAGTGAGCACATGGCTCAGAAGCATCCCCAGCAT
-ATGCTTCTTCCAAACTTCGATCTCGACATGATGCCAGACGCTGGTGGTGC
-AGAGCTTCTCATGGATCTTAAGGACTCTGCGTTGGATCTTTCGGGCTCTT
-CAGTCGACTACCGGGATTCTATCTCAACATCTCCATCTCGATCCGAAGAT
-GATGTTCTCACAGAGGCTCTGGATGATTCTGCATTTGCCGCGTTCGGACT
-ACAGCTTGCAAATTCCACAAGCGGCTCGGAATGCAGATCTCCGGCGAGCA
-ACAAGAGATTCCGAACTCATCTCACACCGATGCAAGTGCAAATGATGAAG
-AGCGTGTTCAACGAGTACAAGACCCCATCCATGGCAGAATGTGAGCTTCT
-CGGCAAGGAAGTCGGCCTTCACAAGCGTGTCGTTCAAGTCTGGTTTCAAA
-ATGCGCGAGCCAAAGAGCGAAAGACGCGCGGTGCAGTTGACGAGGACTCT
-CGATCCGGAGAACTTCACTGTGAAATTTGTGATAAGACGTTCGCGACGAG
-GCTTTCGCTGCAAGACCATCTGTTTGCCGAGCAGCACATTGAATTTTTAA
-GGAATAATCTGAAACGGGAAGGGGTCTCCGAGTTGACGACCGCTTCGGTG
-ACCGAGTGCTCTCCAGAGAAAAAGTAAGAAATTTAATTTTTAATTTAATT
-TTACATATATCATTACCCTATATAACCTTAAAAATTTTCCAGAGCAAAGC
-TTCCGAACCCGCTGGATCTTGCCAGTTTCCCGTTCCTCAACACGTTCGAC
-ATTCAAATTTACGGAACACCCATCGCCTTTCTGCAGGTGCCTGATGAGAT
-CAAAAAGCAGATCACTGATGATATCACGGCTGGAAAATCGCGAACCACGT
-TCTCCCAGGACGGTTTTCCGCTCGACAAGTTGAAAGAGTCGCTGCCCGAG
-GATGAGAAATCAAATTTGACAGTAACCCAGAAAGATGTGAGCTTTTTTTT
-TTTGGGAAAAATTTTGAACAATTTGGCAATTTCAGGTCGGATGGGCGTGC
-CCGGCATGTACATTTGTCTTCCAAGAAGAAAAGAAGCTCCGTGAGCATCA
-AAAAGCCATGTGCCAAAGTGATAAGGTGGGCAAGAAATTAGGAAACGGGC
-TTGAAGTTTAGCTTATAGTTAGGCAAGTGGTGTCAGACTGTCTTTGATCT
-ACAAAACATGCGGGAATTGGAATTTTTCCCAGAAAAATTGTGAAGTCAGC
-ACGTTTTTAACCATGCAAAATCAGTTGAGATGTCTGCGTCATTTCTCCCG
-CATTTTTTGTAGATCTACGTAGATCAAACCGAAATGAGGCACTTTCTGAA
-TCCACGAGCTAGGCTTAAGCTTAGGCTTAAGCTTAGGCCTTTTCTCAGGC
-TTAGGCTTAGGCTTATGCTCAGGCTTAGGCCTTTTCTTAGGCTTATGCTT
-GGGCTTAGGCTTAGGCGTAGGCTTAGGCTTAGGCTTAGGCTTATGCTTAG
-ACTTAGTCTCACTATCAGTCTTAGGCTTAGGCTTAGACTTAGGCTTAAGC
-TTAGGCTTAAGCTTAGACTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCTT
-AGGTTTGGGCTTAGGCTTAGGCTTAACCTCAGGCTTAGGCTTAGGTTTAG
-GCTCAGGCTTAAACTTAGGCTTAGGCCCAGGCTTAGGCTTAGGCTCACAC
-GTTCTCACGTTCTTAACCATACAAAATCAGCTAAGAACTCTGCGTCTTTT
-CTCCCGCATTTTTTGTAGATCTACGTAGATCAAACCGAAATGAGGCACTT
-TCTGAATCCACGAGCTAGGCTTAAGCTTAGGCTTAAGCTTAGGCCTTTTC
-TCAGGCTTAGGCTTAGGCTTATGCCCAGGCTTAGGCCTTTTCTTAGGCTT
-ATGCTTGGGCTTAGGCTTAGGCGTAGGCTTAGGCTTAGGCTTAGGCTTAT
-GCTTAGACTTAGTCTCACTATCAGTCTTAGGCTTAGGCTTAGACTTAGGC
-TTAAGCTTAGGCTTAAGCTTAGACTTAGGCTTAGGCTTAGGCTTAGGCTT
-AGGCTTAGGTTTGGGCTTAGGCTTAGGCTTAACCTCAGGCTTAGGCTTAG
-GTTTAGGCTCAGGCTTAAACTTAGGCTTAGGCCCAGGCTTAGGCTTAGGC
-TCACACGTTCTCACGTTCTTAACCATACAAAATCAGCTAAGAACTCTGCG
-TCTTTTCTCTCGCATTTTTTGTAGATCAACGAAGATCGAGCCGAAATGAG
-GCACTCTGACATCACGTGGGCTAAGACTTAGGCTTAGGCTTAGGCTTAGG
-CTTAGGCTTAGGCTTAGACGTAGGCTTAGGCTAGTTATTTGTAACTTTTT
-TAAATCTCCCCCGAGTCAAAAAAAAAAACAATTCAATTCCAGACGCTAAC
-CCTGGTGCAAACCCACTACTCGTGCAAAAGCTGTCAAAGTGATTTCTGTC
-TTCAATCCGAGTATCAATTCCATCTCTCAATGCCTCCTCATACTACTACT
-ACTACCACGACGACGCCATAACAAAACCCCCCAAATAGTCACCTCATGTC
-ATTTCATTTGCCGTCTTCACTCAAGGACCTATTTCCGTCTCTCTCTCTCT
-CTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTTCTCCTCTCG
-CCTTAAAAAAACCACAACTCCTTATCCCGATCTGAGCTCACTTCCTATCC
-CCCAAAGTAATTTCTTTGTAATATCTATATCCACTTTTTTTTCGACACAC
-TACACCACATCCCGCCGCCTATCCCCTCCCCCCCCACCGCTTTATGACAC
-AAAAACTGGTTTCGCTTTTGTCTTCAATTTCACCCCAACCGCCTGCAGCT
-TCTCATAATAATTAATAATTTTTCTTACCATGCACAATGATTTTGATAAA
-TATATATATATATAGTCATCAGGATTGCCCCCTTTCTAGGATATGTTTTT
-TTTTGTCTTCACACAATTTTCCCATTTTCTATGATAAGAATTATTTCTTT
-GTCCGGTTGACACATGTAGATGTTCCCCTTCCAATTTTTAATAGATTTCT
-ATTCTAGTTTTTTGCAGGCCTCACTATTCTATTGCAATAATCACTTGGAT
-TTCATGTATGGAACGCAATAATAATTCAATAAAATATTGGTACTTCTTTT
-TTGAAACACACTAATTCAAACTCACGCGGTTCCAGGCTGTCCCATTACGG
-TTTGATCTACTAAAAATGCGGGAATGTTTACTCCCAACAAAATGTGACAT
-CATCAGCACGTTTTTAACCATGCGATATCGGTTGAGTACTCTGCGTCTCT
-TCTCCCGCATTTTTTGTAGATCAAGCCAAAATGAGACACTATGACACCAC
-GTGTAGACTTAAAATTGACTGAAACCACCGAATTTCATATTGAAACTTCT
-TGAAATCTATTCAAAAAAAAAGTTATGAAGGCTCAAAAAATGGCCTAAAA
-TTTGTTAATTTAAACAAAAGACACTTAAAACGGTGTCTTTTTGAATTTTT
-CCGTTTTTTTAAACATATTTTCATAAAATTTACTTATTTTTCAAAATAGA
-TGTTGGAACATTTATAGGATGCGTTCAATTTTGCCATTTGAAATTGAAAT
-TCGGAAATTTCAAAAAAAAAAAAAAAAAGTGCGAAACCAAAATTTTCCGA
-AAATTTTCGGCAATTTGCCGGTTTGCCGGAAATTTCAATTCCAGCGATTT
-GCCAATTTGCCGAATGGCCGGAAATTTCAATTCCAGCAATTTGGCGATTT
-GCCGATTTGCCGGAACCTGCTAACCTACCTACTAACTTGCTAATCTTCAA
-GGTTTTTAATGAGTTTTCAATAGAAAATTCGGTGTTTTCAGGCAATTTCG
-AGAAAGCAATACAAACGTTTAACAAAAAAAAGACGCTTTTTCCTCTTATC
-CGATTCTCAATTCTCAATTTTGCCTTATCAATTTATCCTCTCCTCACAAG
-GTGACACACACACACACACACACACACACACTCGTTTCTCGACAAAAAGC
-TATGAGCTAACAAGCGCCTTCTCGCGTAAGAATACATCCACTGATAAGAC
-ATCTGATAAGAGTGGAACCCGTCCGCCATTGTCTCGAGAAATACACGCCT
-CCGCCCGGGAGGACAGGTTATCCCACCTCGTCGCTTCACTTCATTGTTTC
-AAACGATTCCATCGGCTTGCGCTTGGATTTTCTCTTATGCAACTTGCCAT
-TCTTCTTTTATTGCTTAACATCATGGTTATTTATTAGGGAAATTGTTCTA
-CCCTGACTTGAAATGACTGAAGACGGCCTATTTTACTTTAATTTGAAGAC
-TCAGAAGACTACTATAAGCGGTCATTCTTGTTGCGAAAATTTCTGCATTT
-AAAGGTGGAGTAGCGCCAGTGGGAAAATTGCTTTAAAACACGCCTATGAT
-ACCACAATGACCGAATATCATGATAAAAAAATTCAAAAAAATTTTCTAAA
-TTTTATATGATTTTTTGAAAATTGAAAAAATCTAAGGTTTTCACTTAATT
-CATATTTGAATTACCGCCAATTGGATTTGCTCGATGGAGCGCACTTGCAC
-GTTTTTAAATTTATTTATTTTATTTTTTGTTATTTTCCACCGATTTTTAA
-TGTTTTCGGTGTATTTTTGCTTGAATTTTAGAGAAAAAGTCAAAATAAAT
-GCAAATTTTCGATTAAAAAGCAAGCGTACAGGTAAATCAGTGAAATTAAT
-CAATTCAGGTTCATTTTTACGCCTGTAAGCGTGCTTTTTAATCGAAAATT
-TGCATAAAAAACATTTAAAATGGGTGGAAAATAACAAAACATAAAATAAA
-TAAACTTAAAAACGTGCAAGCGCGCTCCATCGAACAAATCCAATTGGCGG
-TAATTCAAATAGGAATTAGGCAAAAACTGAGATTCTTTCAATTTTCAAAA
-AATCATATAAAATTTAGAAAATTTTTTTGAATTTTTTATGGTGCGTCCAT
-AGAAAAACCGGAGTTCCTCGCTTTTTTTTCCTCGAAATTCAAAAAAGTAG
-GCGTGGCCAACCAATCAGCTGTTGTTTCTTGTTTTCTCATTGCTCAGCTT
-AAAATTTTACAGCCTCTAATTGGTTGAACACGCCCACTATTTTGAAATTG
-ACCAATAACAAAGCGAGAAACTTCTTGTTTTTTCCGCAGACTATGGACGC
-TTCCGCACGCGGGAAATTCCCGTTTTCCGCAGACTATGGACGCACCATTA
-TCATGATATTGGGTCATTGTGGTACCATAGGCATGTTTTAAAGCAATTTC
-CCCACTGGCGCTACTCCACCTTTAATGCATTCTGCGTCTATTTTATACAG
-TTCTGACCATAAAAGCACACAAATTTTTGTCTCAAAGTTTAGGAATATAT
-AGATTTAAGGAAGAAAGTTTTAGTAAGAAAAAATATAGTCTTCTTCATGT
-TTTCTTTTTTTTTACAATATCCATTTGCCATCCGTTTTTTTTTCTGCAAC
-CTTCGATAAATGTTTGCTTGGATAACTATGTAAGGTGCTTTGAACACTCG
-GCATTTGGGCTTCTTGCCCAAGTTTAGCCCAAAAATATTAACTTGGATCA
-GAAGTTGGGCAATACTTTGGCAAAACTTGGATTCAGGCAATATCAAAGTT
-TAACCCAAGTTTCACCCAACAAACTTTGGCCTAAACTTTTTTTGTTTCGA
-ACTTGCGTAGAAGTTTTTGCCCAATTTTCGCCCAACTTTTGCCCAACTTT
-TGCCCAAGTTTAGCCAACTTCTGTTCCAAGTTAATATTTTTGGGCCAAAC
-TTGGGCATGAAGCTAGAGCCGAATGCCGAGCTAATTTTATTTGACTCTAT
-CCGAATTCTGCTAATTCTCAAAAATCCCCCAATTGCCAACCATTTCAGAA
-TGCATTGGAGTAGTTGGGCGATAGCGCTCAACGTGCTCGTGCTGGCTTTG
-GCCGACAGTGCTCCTGAAAGATTCCCAGAGGATCATGTGGACCTGGTACT
-TCCTATGAAAAGTATCCACCATTTCACCTAAACGTTTCCTAATCATCTTG
-ATTACAGTGAAATACGACAGTCATCTTCGACAAGCTGATCTTCCACCGCA
-CTTCATTGGTGCCAATGAGACGAACTTGGTTCCGCTCACCTTGAGATTGG
-AGACTAGGAGGAAGAGATGCTCGTGTGGATGTTCGGGATGTGATCTTTTC
-CCGAATAGATCTTGTTGTTCGAGCTGTAAGTTTGCGATTCTATAAGACTT
-GTCAACGTGGTGTCAGGCTGACCCATTACGGTTTGATCTATAAAAAATGC
-GGGAAGTTTATGACCAGAAAAAAATGACGTCATCACATTCTTAACCATAC
-GAAATCAGTTGAGAAATCTGCGTCTCCCATTTCTTCTCCCGCATTTTTTG
-TAGATCTACGTAGATCAAGCCGAAATGAGACAATTGAAATTCCAGCTTGC
-TGCTCCTCTCAAAAACCAATCCCACTTGCCTGCTGTCCGCCACCTCCCCC
-ACCAAAACCGTGTTGCCAGCCAGCCTTCGGCCCTTGCTGCCCGGCAACCC
-CAAACTGTTGCCCGAAACCCTGCTGCCGAGGTCGTCGCCCCGAATACGAA
-GAGTACGAGGACGAGGAAGGCAACCCTGGAGGCGTCCCAGCACCACCAAA
-CCCACCAAGAACTTGCTGTCCTCCACCAACACCTGCTGCTCCACCACCGC
-CACCACCTCCACCACCACCGGCTCCGGAAGCTCCAACGCAATGCTGTGGA
-TCACAGCCTTATGGAAGAACACCGTGCAGGTCCGGATGTCCGAATGGAGA
-TTGTGGATGCGGAAGACCTTGCTGTTACTATCAGAACCCCACATGTTGTA
-ATCAAGGGCAAAAGGCTTGCTGCCCACCTGAACAGCCTTGCTGTCCTGAG
-TTGAAGCTGGATAACTGCCTCGCTTCGGTCCCACCTTGCCTTCGCGCCTG
-TCCATCGTGCCCTTGCAGAAAACGTCTGATGCTTGGGAAGAGAACTAAGA
-GAGACGCACCGGGGCTTCATTGCCAGCCAAGTAAGCTATAAGTTTAGATT
-TTCACGTAGTGTCAGGCTGTCTCATAGTGGTTTGATCTACAAAAAATGCG
-GGAATTTCTCGCCCAGGAAAATGTAACGTCAGCATCAGGGCTGGGACCAA
-AAAAAAAATTTTTGGACCAAAGAAGTTTTTGAAAAACCAAAAAAACCAAA
-AAAAAAACAAAAAAAAAACCAAAAAATTTTTGATATGCTTAAGTTGATTT
-TTAATGGGGTTATTCAAGTAATGTTGCAAAATGTATTAAAATACATTTAT
-GACGTCACAACTGTGTTAAAATACATGTTTTAATGTATTTTAATACAGAA
-TAGTCTCGAGTCGACACTAGACACGGTAAACTTTTTTTTTAGATTTTTCG
-TCAAAATACCAAAAAAACCAAAAAATTCCCAACAGCATGTTCTTAACCAT
-GCGAAATCAGTTGAAAAGTCTGCGTCTTTTCTCCCGCATTTTTCGAAGAT
-CAAACCAAAATGAGACACTTTGACACCACGTGGATTTTCAAAACGCTGAA
-AATAAGTAAAATAAATAAAAAATTTTCAGTCGGACTCCTTGGTCAACAAT
-CCCCACCGACTCTGATTTCAAAGCCGGTAAAGACCATAATAAAATCAAAA
-TCCCGCGTTGCTGGAACCAAGACATCTCAAGTGTCCGTCACCAAAAAGCT
-CATCGAACAATCCTCTGACCACGTGGAATCGCCTCCAACAGCCGGAAGAC
-TCTACGACTTCCGAAGAGCCCACGTTCGAGTCAAGAGAAACATGAACTTT
-GGAAATGGAGCATGCCAGCTGTGTCTGAACGGAACTCCGCTCAAGAGAAC
-CAAGCGGTCTCTCGATTGTGTTCCGTGTACCTACCTACAACCACAATACT
-CTGATTGGAACCCGTTCCTCGGAGATCAAACGCCACGCGGATCGCAGTCG
-CCAGTTGGAACTCCACTCGCCGGGCACAGAACTAAGAGAGCTGGCGTGAG
-TTTGACTCATAGAAATTAACGAAGCTAAATTTATTTTTGCAGTGCCTTCC
-TCATCCACAATGTACCCTGCATGTCCGTCGCTATAAGAGAAACCTGATCG
-GATCCCAATATTGTGAGCCATGCAATGGACACTACGGTAGAAAGAAGCGG
-GAAGCCGAGAGAGATCAGTGCTTGAAAAGAGAGAAAAGATATGCAGATGA
-ACAGTGTGATAACGATGAGTTCAGTATCAATGAGCGAAGCAAACGACAAG
-CCTACAATCCAAAAGGAATTTTGGATATCGTGAAGCTCCTATCCAAGGCC
-TCCTCAGGTGGCAACAATCCAGGAGGATGCATGAAGTTCCCAGCCTGTGT
-TCTGGCTCAGAAGAAGAGAAGAAAGAGAAATGCAGATCGGCTCGACACGT
-ACTACAAAGCTGTGGAGGAGCACAAGAAGCTGGTGGAAGAGTACGAGATG
-GCGATGGAGGAGCACAAGAGAGTCAAGCGGCAGTTCTTCGCTCCGGATAA
-TGCTGCATCCTGTGTTCCGTGTCCGGCATGGGTGACACTTGCCTTGGCTA
-GCAGAAAGAAGAGAGAAGTCGAGAAGGTGGAGAAGCATATGACGATGAGC
-GAAGCTATCGCGGATATCAGAGCAAAGAAGGGGTATAAGGAAGGATTTGA
-TGATGATGATGAGGTGAGGACTAGACCTGAAATTTTAGATCCTGTAAGAA
-CTTTTTGAAAATTCCAAAAAAAAAACCCCCTAATTGAATCACGCGCGCAC
-GCGCCACTGAGAAGGATACTGTATTCGCGGCGAGACCACCTGCACATCTA
-ACTCCCAAAAGTGACGAATTTGGCCTAAAATGGACTTTCTTCATGGGATT
-TCCACAGTTTTCACCATTTTTTTGACACAGTTCATGACTTTTTACACTCA
-AAAAATTATTGGCGTGGTCATTTCACAATGATTTCAACAATTTACTGGAT
-TTTACGCGTGTACTTCATCGTGGCACACCAAAAATTGATCTGGTTCATGT
-GGTGTCAGAGTGTCCCATTTTGGTTTGATCTACGTAGATCTACAAAAAAT
-GCGGGAGTTGAGAGACGCAGAGATCTCAACTGGCGTCACATCAATGCGGA
-TTTTAAAATTTTCATTTCAGGACGACGAATCCTCTGAGGAAACCATCGAG
-ACCCGCAGAAAGCAACGCCGCTCCTGCCAACAAAGTGACGATTGCCTGAA
-CAACGTCGAGTACGCAGTCTTCCAAAAAGTCTATGCAGACAAGAGAACCA
-AACGAGAAGCCGTGTTCCGTCGTAAGAAGTGCTCGAGGTGTGGAGTCTCT
-GGGCTCACGCCACATCGTGTCAAGAGAAACTTCGGGCAGCCGAATATCAA
-CGTCTCGGAGCAGAATTGCATGGCATTCCCACAGTGTCGGCATAGAGTGA
-AGAGAAACTTTTTGGGAGAAGACTGTAACATCTGTACACAGGATACTGGT
-CTGAAGCGGAGGAAGAGAGACTTCGGAACAGCGGTAGGTGTTGGTTTAAT
-GAGCTTCCTTATCTTAAAGTTTTCAGCAATGCTACCCATGCCCAGGAACA
-CGTTCATAACTTGAAGCGACTCCCTCCGATTCTCACATATCACATAAATA
-CCACCTCGTAATAATAATTCAACATGACTAATAAAACAAATAAGTACATA
-CATACATTTATATTAGCTTTTAGCACCCGTAGCAATTTGGAGCAAGAAAA
-TATGTGTAAAGAAATTGGAGATGTAGTAGATTTGGTCGTTATAGTGATCG
-CAGATCTTTCAGCTCTTTGAGCCGGAATATTGACTGGCTTGGAGCCAGGA
-GATGAACCTCGCGGGGGAATGAGGCAAAGTAGGGGTGAAGCATTGCACTG
-GCTGCGGAGACACGGCTTTCCGGGCGGAGCTGTAATTTTGAGGGTTACAA
-GATAGGTGTAGCTCGATGTCGATTCATTTAGACTAGCATTGCAGCCAGGG
-CTTAAGCTTTCGGCTTGAGCTTGCACTCAAAGATTGCTGCTCAATATAGC
-TCGCGAAGACTGATTTGTCAAAGATTAGACTAGTAGGCCTGGACTGACTT
-AAAGGTGGAGTAGCGCCAGTGAAAATTTTGTCAAAATACATACATAATGA
-TCCGAAAAAAAAACCAAATTTCATAATAAAACAATCCAAAAAATTAGATT
-TTTCACAATTTCAGGTCAAATTTTTGGCAAACTGCTAAAATTTTGAAAAA
-TGAGCAATTGAGGAAATCTAGAGCAATGTCGCATGTTCCGACCCCTACAA
-TATTTTAATACAAATAATTAAAACACAATTACAGTATAAAAATGTAGGAA
-AAAAAATTTTTTTTTTGTTGGTCGACTTCCAAAATTATGAGTGGTAAAAT
-TACAGTAAATAAAAAATTTTCAAAATTTTTTTGAAACGTTTTATTATGAT
-ATTCGGTCTTTTCGGGACTAAAGGAGTGGTTTTTACAAGTCTACTTACCT
-GAAGAAGCATCCCCAGAAGTTCCTGACCAGTCTTCAGAATCTTCGTGAAC
-ATCGGGTTCACCGCGATGAACGACAACTCCCGATACCTGGGGAACAGTTC
-AGGGGTGTAGCCTGGTAATGTCTTTACCTGAAACAAACATCTTTATCTCT
-AGATTTTAGATTCCCTCACCTCCGGCCACTTTTTCTCGTCTGGAGTACCC
-CGAATGCTGAAGATCATATCCAACTGGTCCTTGGTGCCGGGGTAGTGAGA
-GTCCTTGGATCCCGGGAACAAAGCGGCGCCCGTGCAAATTTCAGCGAATA
-TGCAACCGACTCCCCTGCAAAGTTAGTAGATATAGTTGGTACCTTTTATA
-AAATAATATCCTCCTACCACATATCCAGGGAAGTTGAATAGTCGGTACTT
-CCCATGAGAACATCAGGCGGGCGGTACCATAAAGTGACCACCTCGTGAGA
-ATATGTCCTACTCGGCACAGATTTCGCCCTGGCTAGACCAAAGTCTGCGA
-GTTTTAAAACACCGTCTTCGTCGAGAAGCAAGTTTTGTGGTTTTAAATCT
-CTGAAAATCAGTTTTTATCAAGAGTTATGGCCGCAACGGCGCCTCCGCCG
-ACCCCAGCGGTCGCCGCGCCGGCCTCCGCGGAACCCCGAAAATGTCCGCC
-GCTCCAAACAACCACTTTTTTGCACTACGTTGCGCACACACCAGGCTACT
-CATTTCACGCCAAGCTGCGGAACACCGAACGTGTCCGCCGCTCCAAATAA
-CTCCCTTTCGCAATACGTTGAGCACACACCAAGCTGCGGAACTCCCAACG
-TGTCGGCCGCTCCGAACAACCACTTCTACGCACTTCATTGCGCACACACC
-AGGTTACTCATTTCACGCCAAGCTGCGGAACCCTGAACGTGTCCGCCGCT
-CCAAACAACTCCCTTTCGCAATACGTTGAGCACACACCAAGCTGCGGAAC
-CCCCAACGTGTCGGCCGCTCCGAACAACCACTTCTACGCACTTCATTGCG
-CACACACCAGGCTACTCATTTCACGCCAAGCTGCGGAACCCCGAACGTGT
-CGGCCGCTCCAAATGACCACCTTTCGCGCTTCAACGGCGTCGGCGTGAGG
-CCCGAATTTCGCGCCTCACTCTGCTGGGAGCCCTATCAACACTAGGGAGC
-AGTTTGAAAACTAACCTATGAAGAATCTTCTTCCTATGACAAAAATCGAG
-TCCGCGGAGAAGTTGAAAGAGGAGAAGCTTGATGTCAATGCTATCCAACC
-CATAGACGTTCTGCTCCAGGTACTTGCTCAAATCCATTTTCATGTACTCG
-AACACAAAAGTTAGCTGGTGGTGTTGATAGAAGATGTCGTGCAAAGAGAC
-GATATTCGCATGACGGAGGTTTCTGAGAAGCGAGGCTTCACGGATAGCGG
-TGAATGGGAGACCTTCTTGAAATTGAAGTTTGATCTCTTTCAAGGCGACT
-ATGGATCCGTCAAGTCTGAAAATATAATTTAGTTTGGTAATATCAGCTGT
-TAAAATATCTAACTTCGATTCGCACTTATACACCGTTGCATAAGATCCTT
-CCCCCAGCTTGTCAATTCGTTTGTACAGATCATTCACATCCTGCGGTGTC
-ACTTCCTCCTTCGCAGGAAGCGTTATCGTATTTGGATCGTAGTGTGCTGA
-TCGTGGTCGACGTCTTCGAAGATGTGTGAAGTCGGCCACAGTGTTGCTAG
-ATGGTGGTGGTGGCATTGATGGAGAGTTCTTGTTTAGGGGCACGGTTGAC
-ATGGTTTCAGATGGATTGTTGGAGCGGGAACGTGATTGGCGGCTGAAATG
-GTATTACTAGGGTTTGATTCGGAAAATTTTCTTAGAAAAACAGTTTGGCG
-GGAAGTTTAAATTTTCTGATTAAAAATGTTGGCGTAAGTGGTGTCGAAGT
-GCCCCATTTTGGTTTGATCTACAAAAAATGCGGGAGTTGAGACAAAGACT
-TTTCAACTGATTTTGCAGGATTAAGCTGACGTCACATTTTCCTGGGGGAA
-AAATCCCCGCATTTTTTGTAGATCAAGCCGCAATGAGACAGCCTGACACC
-ACGTGTTGACGGGATATTTAAATTTTCTGAGAAAAACATTTTGGCGGGAA
-GTTCAAATTTTCTGAGAAAAACATTTTGGCGGGAAATTGAAATTTTCTGA
-CAAAAAAATTTTGGCGGGAAATTGAAATTTTCTGACAAAAAAATTTTGGC
-GGGAAATTGAAATTTTCTGACCAAAAAATTTTGGCGGGAATTCAAATTTT
-CTGGGAATTAACTTTGGGGAGAAGTTCAAATTTTCTGTAAAAATTTTGGC
-GGGAAATTGAAATTTTCTGACAAAAATATTTTGGCGGGAAAATCAAATTT
-TCTGAGAAAAAAAAATTTTGGCGGGAAATTGAAATTATCTGACAAAAATA
-TTTTGGCGGGAAAATCAAATTTTCTGAGAAAAAAAAATTTTGGCGGGAAA
-TTCAAATTTTTTTTTTTTGAAAAGAAAATTCTACGGACCGGAAACGGCCC
-AACTACGGCTCAAGAGCCGTCTCGGTCGGTAAATGTGTTTTTTGCTCTAA
-ATAATGCATTTAACGACGTAAAAATGCTTAAATTAGCCAACTGGTATCAT
-AGGTATTAAAAAAATTCGTTTTCTTAAAATCCATTTTTTCCTCTTAATGG
-CCATTTTTTTACATTCCCCGTAGTTTGCCCGTAATTGGTCCGTCCCGCTT
-TTCATATCCGTAGTTCACCCGTTAATGGTCCGTTCCCGGTCCAAGATCCG
-TAAACGGACCGTACCGGCTTTGCCTGTGGTCAGATATAACTAGTAAGTCA
-AGTGGTGTCAGGCTGCCCCATTATGGTTTGATCTACTAAAAATGCGGGAA
-TTTTTCCCCCAGAAAAACGTGACGTCAGCACACTCTTAACCATGCGATAC
-CAGTTGAAAAGTCTGCGTCTCTTCTCCCGCATTTCTCGGAGATCAAACCA
-AAATGAGGCACTTTGACACCACGTGGTAAGTTATAACAAACATAACAAGG
-TGTCGAAACTACTGTAATTATAGTCTTACTTCAATATACAACCTAATAAG
-AATCTCCACCACTTACCTCAAAAAGCTGAAAATATTCTTATTATGATGTT
-CTGGTGTGCTTCCACTTCCGGACCCCGATGATGCCCCATTCACATGATTG
-GAGTGCCATGATTGTGTCATTTCATTTGTTCCGTTTTTCGAGATCGGAGA
-TTTGGTGGAGCCTCCTGAAAAAACAGAAATAAATGTGGAATTATATGGGG
-GCTCATATGTTTTCGGAACTAACCTTTTTGGGAGAAGACTCTGGAGAGCA
-TTTTTGTGTAAACTGACTAACTTGTGCCACCCCCCGCACCCCATAGAATA
-AATTGGCTAAAATTTCGAAAAAAAAAACTCGCCACCGCCGTTATTCTTGT
-ATTTCTTCTCCTTATTCCGACTCCGACGCAAAGTGAAAATTGACGAGGAC
-GGCTGGAATAATGTTTTGTGTTTGTGTCTTGTGGAAGAGATGCAGAATCG
-CCGGAAGTTTAGAGGGGGTGGCGTGACTTACTGACCTTCCGGGTGCTCGG
-CGAGCCGTCCACGTCCTGAATTCGTTGCGGCGACATTGTGGTGATCTGGA
-ATATGTGGAGCGTAATCGAAATATTTAGGCTTAGGCTTAGGCTTAGACTT
-AGGCTTAGGCTTAGTCTTCGGCTTAGGCTTAGGCTTAGGCTTAGGCTTAG
-GCTTAGGCTTAGGTTTAGGCTTAGGCTTAGGCTTAGGCTTGGGACTGGGC
-TTAGGCTTGAGCTTTGGCCTAAGCTTAGGCTTAGGCTTACGCTCAGGCGT
-AGGATTAGGCTCTGGCTTTGGCTTTGGCTTAGGCTTAGACTTAGGCCTAG
-GTTCACGCTTAGGCCTAGGCTTACAAGAAATATCCTCATTTACCGACCGA
-CTGTGGCCTAGGATTTCAAAAAATGACCCTTTTTGAAAAATCGAAAAATC
-GAAATATCGACGAATTTTCGTTTTTGAGGCGTTTTTTTAATTTCAATTTT
-TATAATTTTTTTCGGTTTTTCGATTTTTCTTGAAAATACCAAACTCACCC
-TATGCAAGTTCTCCGACGACTTCGAACTCCTAACAGCGGTGAGCTGTGGA
-TGATGTATCATAGACAGTGAGCACGATGCTCTCATAGGCCTCTCGGCCTC
-CTCCAGCCCAAACCATACTCCAATATGCGAGGTTATTTTTCCCCACATTT
-GATTGAAAGATGGTATCTGCAAGTGAAATTTTTGGGTGGGGAAAAAGAAC
-GTGAACGAATAATTTGGAGCAGCGGGGGGGGGGGTGGAAAAATGAAGAGC
-TGCTCGGAGGAGGGAGCCGTACTACGAAATGAGAAGAGGAGAAGCCGGTG
-TGACGGCGGGGCGTTAATGGGTTACTAAAGCCTCCACATTCCCATTTTCA
-GCCGTTTCGAAACAAAGAAAATAGAAGAAAAAAAAGACAGATGAAAAATG
-ACTTGGGTGGGTTCGGTGAAAAACAGGAAGCAGGAAGAGTGAGGAAATTG
-GATGGTGGAAGAGTTTTGGCATTTCTAGGTTACCGGGAATCTTTAGAGAC
-ACCTGGGCTGTCCCATTACAGTTTGATCTACAAAAAATGCGGGAATTTTT
-CGCCCAAAAAATTTTCAACAAATTTAGATATTTTTTACATTTTTTCCCCA
-ATTTTTTCAGCCATATTTCAGCCATGACTGTCCTTTTTTTCGGGCAAAAA
-AAAATTTTCTCTGAAAATGTTCGAAACTACTAAATTATGCAAGAAGACAA
-TTTTTAAGGTTCGGAGATCAATTTTGAGTCCTCTAGCTTCAAAATTATCC
-ATTTTAGAAGAGTTTTAAAATTGTAATTTTTTACAAAAATTGCTCAATTT
-TGCCACTTTTTAATAGTTTTCTAAACCTAGATTTTCTGAATTCTGCATAT
-ATGAATTACCCGTTTTCAACAAATTTAGACAATTTTTTTCATTGTTTCCA
-AAATTTTTTTCAGCCATTTTTCAGCCATTACTGTCCTTTTTTTGGGCAAA
-AAAAATAATTTTTTGAAATTACATTACACACCTTCCATGTTTTCTTCGTA
-GATTTAAGGTCCATGTCCACTGCTTGGTGGAAGAGTTTTCCGAGTTTTTA
-GGTCACCGGAGAATTTGAGTTGGAAGAGTTTTCGCATTACTCCCCAACTG
-TGATAGAACTTCAAAAATGAATATGCAGGGACATCACTCAAATTTGACAT
-GTCAGTTTAAAGGAACACGCTGATTTTCCGAGTGGGTCTCGCCACGATCC
-AGGTGCTAAATTTTCACAGTTTTTAGTATGTACCTAGTGGCTTATTTCTA
-AACAACACGCGCATAACATCGGAGTGTCGTTGCATAGGCCACTCTAAAAC
-ATAAACAAATGTGTGAAGAAAAATTAAACACAACTAGCACGGATTTCTGA
-CGTCCCTCAGAAGTTGAAATGGAAGAGTTTTTGCCGAACTAGGCCAGGCC
-ATATTCGGGGTAGATTTACGGCGCGTCGCGGCTCGATTTTAGTTGTAAAA
-CTAAATGTATTTGTCCGTGTGGAGTACACGACTTTCCCAAGCGTTGTCCG
-GCAGGCGATTGTCAATGGAGCGCGAAAATTCAATGAGGAAGGCCAGAACC
-CCGTGGGATTTTGAAATTTTTTTCAGATATGACAAAAAATGACAATGCCA
-AATTTAAAATGCATTAATAGCGGACAGAGGAGAGAATAAGTAGGGAAAAA
-AGAAGAAAAAAAAAGACGGGCGGCGCTTCTCTCATAAAATAGTAATTGGT
-CATTCTAAGTGTGCCTATTGTTCCTTATTTTTCGCTTTTTCTTGGCTCAT
-TTTAGCTCAAAAACCAAATGTCGAAGAGTTTCTAGAGAACTAGGCCACGA
-GAGGGAAAAACTAGGTCACTGGAATTTCTACGCTAAAAATTTGGCCCAGC
-ATATTTACCTACGTGGCCGTAAAAGAGAAAGTTCGGCCACTAACTTTTTC
-GGGCTATCAAAAAAGGTTTACCAAAACTTTATAAAAAAGAAACCACTTGT
-GGAAAATGGCCGTGCATACTAAAGTTCGGCCACAAACTTTTTTAAAACTT
-TTTTGCTCAAATTGAAGTACAGGACCACTTCGATGGGCGGTTTTCACTAC
-TTGGCCGTGTAAGAGAAAATTCGGCCACCAACTTTTATTCAAGGCCACAC
-CTCCAAATCCTTCAAAGCTTCAAAAATTTTCTACGTGGCCGTGTACGAAA
-AAATTCGGCCATCATCTTTTTTTTGGGTCACGTCGCTAAATTCTTCAGAG
-CTTCAGAGATTTTCTACGTGGCCGCGGGAGAGAAAATTCGGCCACCAAAT
-TATTTTTTAAGGCCAAACCTCCAAATCCTTCAGAGCTCATATTTTCTACG
-TGGCCGTGTACGAGAAAACTCGGCCACCAAATTAATTTTGAAGGCCCCAC
-CTCCAATTTCTTCAGAGATCATATTTTCTACGTGGCGTGGCCGTGTACGA
-GAAAATTCGGCCACCAAATTCTTTTTTAAGGCCAAACCTCCAAATCCTTC
-AGAGCTCCTATTCCCTTCGTGGCCGTAGGAGAGAAAGTTCGGCCACCAAA
-TTAATTTTTTAAGGCCACGTCGCCAAATCCGTCATATTATGAGGAAAAAA
-GTAAAAAATAATACTAATAACAATTGAAGAAAAATTGAAAAATATAAAAA
-TATAAGAGACTAGTAAATGAAGAGGAATGAAGAGCGAATAGGAGGCCAGA
-GAGAGAGAGGGGAGGAAATTGTGCTGTTGAAGACCTTGAAGAGAGAGGCA
-CAGCAATAGATAAATTGAATTACAATGGGGTGAGGAGCCGGGTCTGTCCC
-CCCCCCCCCCCCCCCCCAAAAAGTGCGAACAAATGTGATGAAGCGCAGAG
-AAAATCGGGAGGGGGGGGGGGGGGGGGGGCTGTGCTCCAGGTTGATTGAG
-CCAAGTGTTTCGACTTTTTGCCGAACACGTTGAGCTCTCCGATGAGCCGG
-GCTCACCGGAGAGCCCATGGAGCCCCATGAAGCAGAGGGTCACAAGGTTT
-GAGACTTCCGGGAGATAGACTGCACAACGTACAAAGACTAAAACTTTTTT
-TTTTTGCAGGTGAGGCATGAAATTTAGAGCTTTTTTGCAACAAAATCCAA
-CATTTTTTTTGTAAAATAAGGTCAAATGACGAGTTTTTTCTATAATCTGG
-CCGAGAAAACCTGAAAATTGATCTACCTTGATAAACAGGGCGCGCGGGTG
-TAAAGCGGAGCGTCGTTGTGAAGCTGAAATATTGTTGAACGAATTCTGGA
-ATTCTGGCTTCCCTCATAAATTGAAATGGAAGAGTTTTTGCCAAACTAGG
-CCAGGCCATATCTGGGGTAGATTTACGGCGCGCTTTTTTTTGGGCATAAA
-ATTCCCGCATTTTTGTAGATCAAACCGTACAGCCTGACATCACGTGTTTT
-TGGCCCCGCTAAACAGGGCGCGGGTGTAAACATTCAAATATTATGTGAAA
-AAAACGCATGAATTTGAACAATTTTGCGTAGAATTTTTGAACAAAAAAAT
-ATATGAATAACTAATGCAAAACGAACAGAACTAAATTTTCTGAAATTGAA
-GAGAGGGGAAAAAAATTGGGAAATTTTGGACATTTTTCCCAACGACGCAT
-TGAGCCACCGGACCCAGATGAGCAAATAAACCGGGGGAGCAGGAGGAAAA
-TGGAAATGACAAAAAAGGCGGAGGAGGAGAAGCTCACGTATTTAGTATCC
-CATAGAAAGAGTCAATTTTCATAAACTGCGACAATTGACTACCAGGGAGC
-AGTTGCGCTCTACCGACAAAATCAAGCAAGGTCCACGTAGTGCCAGTCTG
-TCCCATTACGGTTTGGTCTACAAAAAAATGCGGGAAAATTTGGCTCAAAA
-AAATGTGACGTCAGCACACTCTTAACCATGCGAAATCAGTTCCCGCATTT
-TTTGTAGATCTACGTAGATCAAGCCGAAATGAGACACTGTGGCACCACGT
-AAAGGTCCTTCTTACAGAGTGCGCTAGAGCGCGATTGCCAGTTTTCTAAA
-AAAAAAATCTAACATGAAAAAATGTGCGTAAAAGCGGAGTTTCGTTGCGA
-TGTAAAATTTGGAGAAAAATTGAAAACTGAGGAGGAAGAAAAAGTTAAAT
-GCCTCTTCGCAAGACCGGGATTAAATAGTATTTTACTTCTTTTTTTTCCT
-TCAACTTTTTGAAATTTTTGGCGGAATGGGGAAAAGGAAAAAAAAACGAA
-ATCATCGATAAAAACAACACTAGGCCACCCAGAAGTAAACCTAGGCCACC
-TTATAGAAATTCTAGGCCACCCTGTAAGAATTTTAGGTCATCGCGTAGAA
-AAGCTAGGCCACCCTGTTGAACTGCTAGGCCACGCTGTTGTACACTTAGG
-CCACTCTGAAAAAAATCTAGACCTCCCTGTAAAAAATCTAGGCCACCTTG
-AAAGAATTTTAGGTCATCGTGTAGAAATTCTAGGCTACGTTTTCGAAATT
-CTAAACCACTCTGTAGAAAACTTGGGTCATCTACCGAAATTCTAGGCCAC
-CCTGCAGAAAACTTAGGCCATCTACCAAAATCCTAGGCCACCCTGTAGAA
-AACTTAGGTAATCTACCAAAATTCTATGCCACTCTGTAGAAAACTTAGGC
-TACCTCGTTAAAGTTCTAGGCCACCGTGTAGAAATCTTAGGCTACCTCGT
-TAAAATTCTAGGCCACCCTGTAGAAAAATTAGGTGATCTACCAAAATTCT
-ATGCCACCCAGAAGTAAACCTAGGCCACCTTGTATAAATTCTAGACCACC
-CTGTAGAAAACTTGGGCCATCTACCAAAACTCTAGGCCACCCTGTAGTAA
-ACTTAGGTCATCTACCAGAAAACCTAGGCTGTTCCGTTACGCCGCATGCT
-AAAAAATCCAGACCGCCCTGTAGAAAATCTAGGTCACTCCCTACAAAACC
-TAGGCCACCCTGTGAAAATTCTAGGCCACCTTGTGAAAATTCTAGGTCCT
-TCCCTAGAAAAACTAGGCCACCCTGTTAAACTCTTAGGCCACTCTCTAGA
-AAAACTAGACCACCCTGTAAAAAAACCTCGATGGCCTAGAAAAAAGCTTG
-GGAAATTTTGTGGAAAAAGTTAAAAAGGAAAATCTAGGCCACCCACAAAA
-AAGCTAGGCCACGTGGCAAGAAACTTCAAAAGTGACGAATGATGAGACGA
-GAGGCGTATGTTTGAGGTCAAAAAGGGTGAAAAAGAAGAAAAAAAGACGA
-GGCGGAATGTTTCTTTTTTCTTTTCAAACTGAGCATCTCCCCGTCTCTCG
-GCCACCAATACTACTACTACTACAACTATTCATGTTTTTAGAGAGCCCCC
-CCCCCCCCCCCCCCCGGCCACTTGTCAGCTTTTTTGACGGAAGATGCCAA
-CACACAATCGAAGGGGAAACCATAAAAACCCGCCAACGACACTCCGTTTT
-AAGGCCCGGATGCCCAGATGTATGAAAAAATGGAGAAACTGAAGGCTTCT
-CCCCTCCCCCCCCCCTCCCTTAAAAAATGATGAATTACTAATGGTGCCGC
-CCATGTTGTGTTTGTTGCTTTCCCCCCGTGCTCCATCATTGGGGGAACAT
-GACAGCCACCTTGAGTTACATGTATACAAAGTGACAGGAGGGAAAGATAG
-GGGTAAAAGTGCAAAAAGGGAGTCGCGGGTTCGAACCAGTGAGGGTTTGC
-AAAATTTGGGCTGTGCGCGGCGCCTTAGACTACTGCGCCACGCGTGCGAA
-CTGTAAATAGAACTGTCAGGCTAAATACGAACGTTCGGTTTTTAAACTCG
-ATTGGCAAAAATGAAATGAATGAATAGACAGGAATGACTCATATTTTTTG
-CATAAAGGGGCCTGGGTCTGGGAACTAGGAACTAAACTAAATGAAGGAAA
-ATTGAGGCATCTCCCGCCAATTGAGTAGAAAAGTGATGAGAGCGGCAAAA
-AGAGATAGGGGGGGGGGGGGGGACCCATTCATTTTACACTGGACACCACA
-CTCCCCACTCTCTCTTTGATGACGAAGGACATGAGTACGAACTCGCGAGC
-ACAGAAATACGACACGTTTTCTTCTCATTTTTTTTTTGCAAAAGGTGATG
-ATGATAATCGCTTCTAAACGAGGGGAAGTGTACTAAATAATAAAATTGCG
-AGTGGATATTGGATTTTTTCGTTATTTTCCGCTCTGAAAAACCTGAAAAT
-CAGTCGGAAATTCGAGTTTTGGCTAACTTTTTGTAAATTTTGTTTAAAAA
-ATCACTTTTCGCTGCGAAACCACCTGAAAGGATATAGTGGGCATGCGCCT
-TTGAGCGCTACAGTGGAGGGAATGCAGTATCTCTTGGAAGTCAGATTTGC
-CGATTGTTTTAACGCAAAACCTGAAGTATAGAAAAGAAAACATGAAAATT
-TATTGAAAATATAATAAATAAATTAAGCAAATTACATATCAACTGAGAAA
-ATCACCTGCTGGAGAGAAAAATTGAAAAAAAACCAGAAAATCGGCAGGAA
-AGCAATAATCGAGCAAGATCCTTGGAATTTTTAGGTGCAGATATCGGTTC
-AAAAGGAAAACACTATTTTAGCTTTTTTTTGTCTTAAGTTCAATGTTATA
-ACACAAGAAACGATATTTCTATGGCATAATTTTTGGGTCCTAGAAAGCAG
-ATTTTCACGTAGATTGGTCTGAAAATAATATTGGAGTAATTTTTATTATT
-TTTCCTTGCATTATAAAATTATTTCTCTTTTATTTCTCAATTCTAAAACT
-ATTTTCCCGTTCTTTTTCCCTATATCTCGCGCTTCTCCGGGATGTTGCAT
-CCCATTCGACGTGAGGAGTCTCGGAGTCTCTCCGCTGCAAACGCGCTCCA
-CTGGACACAGAAAATAAAAAAAATAAATTGTTCGAATTCATGCAATTTTC
-TTCTAATTTTCTCCGTTTTTCGTCAATTTTTCTGCAAAAAAGACAAAATT
-TACAGGTAGCAATGTATGGGGGATATCAAGGAGCATATGGGTAAGGCTAA
-AAACTAGGAAAAACTAGGAAAAACCCATGGAAAACTAAAAAACTCTGAAA
-TTTCAAATTTCAGAGCCTACGGGAACCAGCAGGCGGCTTCACAACCATAT
-CAACAGCAAGGACAACAGAATTATTACCCGTAACTCGAAAAAAATTCAAA
-AAATTCGAAAAAAATCAATTAAAAAGATCAAAATTTTCAATTTTTTCAGC
-GGAGTGAACCCGTACGCGGCGAATTATGGGTACGCGGCAGCACAGCTTCC
-ACCACCACCTCCACCACCGCCAGTATGCCTTAAAATTGAAGAAAATTTGA
-TTAAAAAATTGAAAAAATGCAAATTTTCAGGTAGCCGATCCATACGCCGG
-CCAATTTCAGACATTTCCCTCTCAAGCCACCAAAATAGCGCCGAATCCCT
-ACTTTAAAAAGCCACAAAATCAGCAGCAACAGGGTATTTTCGCCGTGTTT
-TCTGGCTGCAAAAAAATTAAATTATCGATTTTTTTAAGGCTACGACGCGG
-CGGTCTACAATTACGCTCAGCAGAATACTCCGAAAAATTGGAAACACGGC
-GGCGGCGGCCGGCAGGGGAGACAGGGATCTGGCGATAATAAACAGTACTA
-TTGTGAGGTAAAAAACGTGGAAAAAATCGAGTAAAACACAGTTTTTTATT
-CAAAAATCTGAGAATTTCCGTAAAAAATCCTGTTTTTTGACGTTTTTAAG
-CAAAAAAATCGGGTTTACAGCACTTTTAGAGATAAAAAAGTGGAAAAAAT
-CGAATTTTGGACCTGATTTTGGGCTTGAAAGCATGATTTTTATCAGAAAA
-CACAGTTTTTTTTGTCAAAAATCTGAGAATTTCTATGAAAAGTCTTGTTT
-TTGGATGTTTTTAAGCAAAAAAATCGGGTTTACTTCATTTTTAAGGGTAC
-AAAAGTGGCGAAAAGTTAATTTCTTGTAAATTTTCACATGCAAAATATTG
-AATTTATTAGGTTTTTTCCAGAAAAAGTAGTTTTTTTGCTACATTTACAG
-GCTTTTAAAACTGAAAACATGTTAAATTTCGAGGAAAATCGACAAAAAAA
-CCCATCTTTTGGCCAAATTTAAATTTTTGAGCAAAAAAATCGGGTTTGCA
-GCACTTTTAAAGATAAAGAACTGAAAAAATTCAATTTCTTGGAGAAAAAA
-GCAATTTCAACACCAAAAATAGCAAAAAATTCGGGAAAATTGTCAATTTT
-TTTGAAAAAAAACTTGAAAAACCGGATTTCCAGTTGTTTTTTCATGATTT
-TTTCTCAAAAATCTCATAAAAATTGGAAAAAATTCCGAATTTTTTACTGA
-AAATTCGAGAAAAATTGAAATTTTTTCAATTCCGATTTAAAAAACATTTT
-TCGCTAAAAAATTGAATATTTTTAGGCTTTAAAGTTCGGAAAAGATGCTG
-AAAATTCGGAATTTTCTGTTTAAAGAAATTTTTTTTGTGCTGAAAAATTG
-ATTATTTTTATGCTCCAAAAACTGGAATTTTTGAAAAATTCGGACAAAAA
-AATTTTTTTATTAGTTTTTAAATTTTTTTAATTTTTCAACCCGCTTTTTG
-CCCAAATTTAGATTTTTTATTTAAAAAATCGGGTTTACAGAACTTTTAAA
-GGTAGAAAAACTGCAAAAAGTTAATTTCTTGGATATTTTCAGGCTTTAAA
-GTCCAAATAAACATGTTGAAAATTGAAATGTCTTCAATTTCGATTAAAAA
-CATTTTTTTCGCTAAAAAATTGAATATTTTTAGGCTTTAAAGTCCAAAAA
-ACAAGCTGAAACTTGAATTTTTTTCATTTTCAATTTAAAAAAATTTTGCT
-CAATAGATTTTCAGGCTCCAAAACACTGGAATTTTGGACTTAATCGAAAA
-TTCGGACAAAAAAATATTTTTATTAGTTTTTAATTTTTTTAATTAAAAAA
-AATCCCAATTTCCAGGTGTGCAAAATCTCATGCATTTTTAGGGTTAAAAT
-TGGAAAAAATTATCAAAAATTTTCGAATAAAAATGGAATAAATCTGATTT
-TTATAAATTTTTCGAAAAAAAAATGATTTGTTGGCAAAAATTAAATATTT
-CAGGCTTTGGAAGTCCAAAAACCATGTAGAAAATTCGGAAAAAATCGAAA
-AATTGGAAGAAAAAAATTTTTAATTTCAAAAAATTTCAAAAAAATATTTA
-AAGCTGGTGTAGTCGACTTTATTTATTGCTTAAGTAGACTCTAAATTGCC
-TGGAAACACCGAATTTCATAATGAAACTTCTTGAAAACTTCTCAAAAAAA
-AAAGTTATGACGGCTCAAAAAATGGACTAAAATTAGTTAAAATTTGAAAT
-TTGACCGACTTTTCAAGCGGCTGGAAACATTTTTTCTTTGAAATCACCGT
-CAAATTTTGAGTATACTGTGCAATTATGTTGCGTTTTCAACTTCATTTAG
-GTATTTTAAAGTCAAAGGGCGGCGAGATTTTTAATTTTTTGAACCAAATC
-TCGCCGACCATCGACTTTAAAATATCTAAATCGAGTTCAAAACTCAAGAT
-AATTACATTATATAATCAAAATTTGACGGTGATTTCAAAAAAAAGGTAGT
-TTCTAGCCGCTTGAAAAGTCGGTCAAATTTCAAATTTTAACCAATTTCAG
-GCCATTTTTTTAGTCGTCATAACTTTTTTTCGAGAAGTTTTCAAGAAGTT
-TCATTATGAAATTCGTTGTTTTCAGACAATTTTGAGTCTGATAAAGCAAT
-AAATAAATTCGACTACACCGCCTTTAAATATTTTTTTGAATTTTTTTAAA
-ATTAAAATTTTTTTTTCCAATTTTTCGATTTTTTCCGAATTCTCCACGTG
-GTTTTTGAACTTCCAAAGCCTGAAATATTCAATTTTTGCCAACAAACTAT
-TTTTTTTTCGAAAAATTTATAAAAATCAGATTTATTCCATTTTTATTCGA
-AAATTTTTGATAATTTTTTCCAATTTTAACCCTAAAAATGCATGAGATTT
-TACACACCTGGAAATTTGGAATTTATTTGTAGAATTTTTGGATTTTTTAA
-TTAAAAAAAAGTTTTTTCCGATTTTTTTTCCGAATTTTCAACATGGTTTT
-TGAACTTCCAAAGCCTGAAAATGATTTTTTGAATAACTTTTTGATTTTTT
-CGGTTATTTTTGGTTTTTTTTTTTAATTTAAAAAAATTAAAAAATTAATA
-AAAATATTTTTTGTCTGATTTTTCGATTAAAGTCCTGAAAAAAAAATCTA
-TTTTATAGCAAAAAATCCTAATTTTCAGCCTGTTTTTTTGCCTTGATATT
-CAATTTTTACAAAAAAATTTTTTTTGGAGTTTTTTGCCTAAAAAATCGAA
-AAAAAAAATCATCTTTTCTCGAATTTTTGGAAGAAAAATTAAAAATTTCA
-AAAATAATTCAATTTTTTGGTGTTTTTCGGGTTTTTTACATAATTATTTT
-TTAATTTAAAAAGTTTGTAAATAACCATAAAAATTTATAATTTTTTAAAT
-TAAAAAATAATTATTAAAAAAAACTCGAAAAACACCAAAAAATTGAATTA
-TTTTTGAAATTTTTAATTTTTCTTCCGAAAATTCGAGAAAAGATGATTTT
-TTTTCGATTTTTTAGGCAAAAAACTCCAAAAAAAAATTGTTTTGTAAAAA
-TTTAATATCAAGGCAAAAAACAGGCTGAAAATTCGGATTTAAAAAAATAA
-TTTCTTGCTATAAAATAGATTTTTTTCAGGACTTTAATCGAAAAATCAGA
-CAAAAAATATTTTTATTAGTTTTTTAATTTTTTTAAATTAAAAAAAAAAT
-CAAAAATATCCGAAAAAATCGAAAAATTATTCAAAAAATCATTTTCAGGC
-TTTGGAAGTTCAAAAACCATGTTGAAAATTCGGATAAATAAAAATATTTT
-TTTGTCCGAATTTTCGATCAAAGTCCAAAAACTTCCAGTTTTTGGAGCCT
-AAAAATAATCAACTATTGAGCAAAATTTTTTTAAATTGAAAATGAAAAAA
-ATTCAAGTTTCAGCTTGTTTTTTGGACTTTAAAGCCTAAAAATATTCAAT
-TTTTTAGCGAAAAAAATGTTTTTAATCGAAATTGAAGACATTTCAATTTT
-CAACATGTTTATTTGGACTTTAAAGCCTGAAAATATCCAAGAAATTAACT
-TTTTGCAGTTTTTCTACCTTTAAAAGTTCTGTAAACCCGATTTTTTAAAT
-AAAAAATCTAAATTTGGGCAAAAAGCGGGTTGAAAAATTAAAAAAATTTA
-AAAACTAATAAAAAAATTTTTTTGTCCGAATTTTTCAAAAATTCCAGTTT
-TTGGAGCATAAAAATAATCAATTTTTCAGCACAAAAAAAAAATTTTTAAA
-CAGAAAATTCCGAATTTTCAGCATCTTTTCCGAACTTTAAAGCCTAAAAA
-TATTCAATTTTTTAGCGAAAAATGTTTTTTAAATCGGAATTGAAAAAATT
-TCAATTTTTCTCGAATTTTCAGTAAAAAATTCGGAATTTTTTTCCAATTT
-TTATGAGATTTTTGAGAAAAAATCATGAAAAACCAACTGGAAATCCGGTT
-TTTCGAGTTTTTTTTCAAAAAAATTGACAATTTTCCCGAATTTTTCGCTA
-TTTTTGGTGTTGAAATTGCTTTTTTCTCCAAGAAATTGAATTTTTTCAGT
-TCTTTATCTTTAAAAGTGCTGCAAAAAACTACTTTTTCTGGAAAAAACCT
-AATAAATTCAATATTTTGCTTTTTTTTTTCCTTTTTTTGTGAAAATTTAC
-AAGAAATTAACTTTTCGCCACTTTTGTACCCTTAAAAGTGCAGTAAACCC
-GATTTTTTTGCTTAAAAACTTCCAAAAACAGGAATTTTCGGGTTGAAAAA
-TTAAAAAATTTTAAAAACTAATAAAAATATTTTTTTGTCCGAATTTTTCC
-AAAATTTCAGTTTTTGGAGCCTAAAAATATTCAATTCTTTAGCGAAAATT
-GTTTTTTTTTCAAAAACTTCCTACGACTACACCACCTTTAAAAAACCAAA
-TTAAATTAGAGAAATTCTTCAAAAAATCCCCAAATTTCCAGGTTTGCAAA
-ATCTCGTGCGCCGGCGGAATCACATACAAAGAGCATCTGGAAGGTCAACG
-GCACAAGAAAAAAGAAGCTATGGCAAAACAGGGCATACCGAGCACTTCCC
-TCGCTAAAAATAAGCTTTCCTATCGTTGTGACCTATGTGACGTCACTTGC
-ACCGGTCAGGACACGTATTCGGCTCACGTTCGTGGCGGAAAACACTTGAA
-AACTGCACAATTGCACAAAAAATTGGGAAAACCGGTGCCTGAAGACGTTC
-CGACGATTATTGCTCCGGGAGCCGATGGGCCGACGGAGACGAAAGCCAAA
-CCGAAATGGCATCAACAAGCTCTGCCTGGCGGGAAAATGTGCGGAATTTG
-AAAAAAAAATTTTGGAAAAAAACGAGAAATTGCACATTTTTAGGCTCAAA
-AATCTGAAAATTTAGCAAAAAAATTTAGAAAAATTTGGATTTTTAGAAAA
-AAATTAGCGTTTTCTCGCCAAAAATGCTCAATTTTCGATAAAAATGTACA
-TTTTTTTTTTTGGATTTTTAAAAAAATATTTTAGGGCTCAAAAATCTGTA
-AATTCTGCAAAAAAAATTCTAAAAAATTTTGAAATTTTGAGATTAAATCT
-TTCGCCAAAAAAACGAAAAATTTGAATTTTACAACTTAAAATGCTCAATT
-TTCGAGGAAAATGTAAAATTTTTTTTCAATCTGAAATCTGTAATTTCTTT
-TAAAAAATCGATTTTTTAAAAAATTTCTACTGTAAAATTTTGAAAAAGTT
-GAACGACGTCAAAAAGAAGGTAAAAATCCGAAAAAAAGCAACAAAGAACT
-AGGAATTTTAAAATTTCCAAAAATGGTCTGAAATTTTGAGAAATCAAAAA
-AAACAAGTTTCTTTCAGTTTTTTTTAGAAAAAAAAATCGTATTTCAGAAT
-TTAAATTTAAAGCATATTTTAAACTTTTAAACGCAAAAACATTATATTTT
-TCTTTAAAAAAAAAACAATTTAAACGCATTTATTGCTTTATTAGACTCAA
-AATTGTCTGAAAACACCGAATTTCATAATGAAACTTCTTGAAAAAAAAAA
-GTTCTCAAAAAAACAAGTTATGATTGCTCAAAAAATGGCCTCAAATTAGC
-GGAAATTTGAAATTTGACCGACTTGTCAAGCGGCTGGAAACTAGCTTTCT
-TTTTTGAAATCACCGTCAAATTTTGAGTATAAAATGTAATTATCTTGCGT
-TATCAACTTGATTTAGGTATTTTAAAGTCGATGGACGGCGAGACTTTTAA
-AGGTGGAATACCGAAATTTAAGACTTTGCTTTTTTAGACCGAAATTTTGG
-CAACTTATCGGTGCGACACTGCAAAATTGCCAAAGTTTGAGATTTTAGCT
-AAAAATAGGCCGTTTTTTCCAAAAACTTTGATCGGCCATAACTTTTTTTT
-GGAAAATTTTCAGAACGTCTCATTACGAAATTCGGCAGTTTTGGGCCATT
-TTGGGTCTAAAAAAGCAAAGTCTTAAATTTCGGTACTCCACCTTTAAAAA
-TCTCTCCGTCCATCGACTTTAAAATACCTAAATCAAGTTGATAACGCAAG
-ATAATTACATTTTATACTCAAAATTTGACGGTGATTTCAAAAAAAAAAAG
-TTTCCAGCCGCTTGGCAAGTCGTTGAAATTTCAAATTTCCGCTAATTTGA
-GGCCATTTTTTGAGCAATCATAACTTGTTTTTTTGAGAACTTTTTTTTTC
-AAGAAGTTTCATTATGAAATTCGGTGTTTTCAGACAATTTTAAGCCTAAT
-AAAGCAATAAAAAATTAGAATATACCACTTGAGAAAAATTAAAGATTTTT
-TTAAGTTTAAAATAAAAAAATATGTTTCTTTCCGATTTTTTGATAGTGAG
-ATAAAAGTTTTGGCGGGAAATTCAAATTTTCTAGAAAAAAAATTGAAAAA
-ACTCATAGTGTATAACTGCACAGAACGGCTGGTTATGAGTATAGGTGTCA
-AAGTGTCTCATTTCGGTTTGATCTACAAAAAAAGCGGGAATTTTTCCCAA
-AAAAAGTTACGTCAAGATGCTCTTTTTTATTAAATTTAATTAAAAAAGAG
-AGCATGCTGACGTAACTTTTGAGGAAAAATTCCCGCTTTTTTTTGTAGAT
-CAAGCCGAAATGAGACACTTTGACACCACCACGTTCAGACAAAATCCCCC
-ACTAAATATTTGGTAAAACTAGTTCAAAACCCGACTGTAGTACATTTTTG
-GCAGAAATTTGAAAATTTCAACTTAAAACCGCTCAATTTTTCCAAAATTT
-CACAGTATGCATTTCAAAAATTATGGTTTTGTTTTTTTTTAATCGAAAAA
-TATATTTTTAACAAAAATGGACCATTTTTAGTTGTAAAATTCAATTTTTT
-GGCGCTTTCAAATTTTTAGGCAAAAAATGTGCAATTTTCTCCAAAAATTT
-TCAGATTTTTTAACCCTAAAATTAAAAAAAAATCTAAAATATTAGAATTT
-CCCGCTTTTTTTTTCAAATATTTCAATTTTTCCAATTAAAACACAAAAAT
-TGAGCATTTCTAGTTGGCACATTCAAATTTTTAGGCGAAAAATTTGATTT
-CAAAATTTCAAAATTTTTCAGAATTTTTTTTTGCTAAATGTTCAGATTTT
-TGTGCGCAAAAATATTTGAAAAATCCAAAAAAAAAACTCGAAAATTGAGC
-ATTTTCAGTTGTAAAATTCAACTTTTTAGGCGGAAAAATGTGCAATTTTT
-CCCCAAAAAATTCAAATTTTCCAACTTTTCTCTCAAATAGCACAGAAACA
-GAAAATTTGTTATACCTAATGTGGAAAAACTGAATTAAAACAGATTTTTT
-GAAAAAATGCACTTTTTTTTTTGCCAAAAAATAGTTCAAACCCCGACTTT
-TTGTTCCAGAGTTTCCAGGTCATCGGTATCATCGCATAAATAAATTTTGC
-GGGAAAAATTCCCGCTTTTTTTGTAGATCAAACCGAAATGAGACACTTTG
-ACACCCCACGTTCAGACAAAACCCCGACTTTTTTCCAGAGTCATCGGCAT
-CAACACGGTAAACTTCGTCGGCGGTACGAAGCTCAACTCCACCGGACAAC
-TCGAGGAGAAGAAGCGCGAAGTTGCTGCCGCCGTGAGCTCAGTCGGCCGG
-AAAACCGGTGGTGCTGCTGCAACGACGACGATTGAGGTGGAAGACGAGAA
-GCTCCGAGCAATGATCGCCGCCGAGGAGGTACAACCTGTCGGCGAGGAAC
-ATGTCACTGAAGAACGTGATGCTACCGGAAAACTGGTGCAATTCCATTGT
-AAACTGTGCGATTGCAAGTTCTCCGATCCGAATGCCAAGGAGATTCATAT
-CAAAGGTCGTCGACATCGTGTCAGCTATCGGCAGAAGATTGATCCGACGT
-TGGTGGTGGATGTGAAGCCATCGAACAAAAGATCACAGGAGAAGCGGAAG
-AATCAGCTTCCAGCAGTTCATGGTGTGTGGATTTTTTAACAAAAAATCAA
-CAACAACACAAAAAACATGTTCCAATAAAATTGGAAAAAAAAATTTAAAA
-AATCCCAAATTTCCAGGTGTCTAAAAATCTCATGCATTTTTAGGGTTAAA
-ATTGGAAAAAATTATCAATTTTTCGAATAAAAATGGAACAAATCTGATTT
-TTATAGAAAAAATAATAATTTGTTGGCAAAAATTGAATATTTCAGGCTTT
-GGAAGTTCAAAAACTATGTAGAAAATTCAGAAAAAATCGAAAAATTGGAA
-GAAAAAAATTTTTAATTTGAAAAAATTCAAAAAAATTTAAATTTTTTTAA
-AAATTGAATTTTTGAGTAAATAATTTTTTGCTATAAAATTCAATATTTTC
-AGGCTTTCAAGTCCAAAAACCGTGTTGAAAATTCCGAAAAAATCGAAAAA
-TTGGAAAAAAAATTTTAATTTAAAGGTGGACTACGCTCAGTGGGGGGAAA
-TTGCTTTAAAACATGCCTATGGTACCACAATGCCCGAATAGCATAATAAA
-AAAATTTTAAAAAATATTCTAGATTTTATATGATTTTTTGAAAATTGGAA
-AAATCACAGTTTTTGCCTAATTCCTATTTGAATTACCGCCAATTGGATTT
-GTTCGGTGGAGCGCGCTTGCATGTTTTTAAATTTATTTATTTTATTTATT
-GTTATTTTCCACCGATTTTTAATGTTTTCGATGTATTTTTGTTTGAATTT
-TAGAGAAAAAGTCAAAATAAATACTAATTATCGATTAAAAAGCACGCTTA
-CAGGCGTAAATCAGTGAAATTAATTAACTCAGGTTCGAAATCGTTTAAAA
-TCGTTACTTTTTCATTTTTACGCCTGTAAGCGTGCTTTTTAGTCGAAAAT
-TTGCATTTATTTTCACTTTTTCTTTAAAATTCAAGCAAAAATACACCGAA
-AACATGAAAAATCGGTGGAAAATAACAAAAAATAAAATAAATAAATTTAA
-AAACGTGCAAGCGCGCTCCATCGAACAAATCCAATTGGCGGAAATTTAAA
-TGGGAATTAGGCAAAAACTGAGATTTTTCCAATTTTCAAAAAATCATATA
-AAATCAGAAAAATTTTTGTTTTTTTTTTAATTTTTTTAAACATGACATTC
-GGTCATTGTGACCCCATAGGCATGTTTTAAAGGTGGTGTAGTCGAATTTT
-TTTTATTTCTTTATTAGACTCAAAATTGTCTGAAACCCCGAATTTCATAA
-TGAAACTTCTTGAAAAATTTTCAAAAAAAAGTTATGGCGGCTCGAAAAAT
-GGCCTAAAATTAGTGAAAATTTGAAATTTGACCAACTTATCATTGTCGCA
-TCGGCTGGAAACAATTTTTTTTTTGAAATTGTCGTTCAATTTTGGGTGTA
-CAGGTCGATTATCTTGCGTTTTCAGCTTTATTAAGGTATTTAAAAGTCGA
-TGGACAAATGGATCTGTCAAATTTTTTACCAAATCTTTTCGTCCATCGAC
-TTTTAAATACCTAAATAAAGCTGAAAACGCAAGATAATCGACCTGTATAC
-CCAAAATTGAACGACAATTTCAAAAAAAAATTGTTTCCAGCCGCCGCAAC
-AATGATAAGTTGGTCAAATTTCAAATTTTCACTAATTTTAGGCCATTTTT
-CGAGCCGCCATAACTTTTTTTTTTGGAAAAGTTTTCAAGAAGTTTCATTA
-TGAAATTCGGTGTTTTCAGACAATTTTGAGTCTAATTAAGCAATAAAAAA
-AATTCGACTACACCACCTTTAAAGCAATTTCCCCACTGGGCGCTACTCGA
-CCTTTAAAGGGGGAGTAGAGTTTGTGGGTATTTTGCTTAAATAGACTAAA
-ATTGGTCCAAAACCACCGAATTTCATAATGAGACTTCACAAAAAATCTCC
-AAAAATTTTTTATGGCCGGTCAAAATTTCGAAAAAAAAAGATGCAACTTT
-TGCTAAAATCTGAAATTTCGCACACTTTTCTTTGTCTAGCAGCCGCTGGA
-TTTTAGTTTTTCTAAAATTATCACCCTCTAATCCTTCTTTTTGGTAATTT
-ATCTCGCGAAAATCCGTTGATTGAGACAACTTTTAGGCCGATAGGCATCC
-AAAAATGATCAATCTAGGGATGCCTATCGGCCTAAAAGTTGTCTCAATCA
-ACGAATTTTCGCGAGATAAATTATTAAAATAAGGATTAAAGGGTGATAAT
-TTCAGAAAAACTAAAATCCAGCTGCTGTGACAAAGAAAACTGTGCGAAAT
-TTCAGATTTTAGCAAAAGTTGCATCTTTTTTTTCGAAATTTTTTATTTTG
-ACCGGCCATAAAAAATTTTTGGAGATTTTTTGTGAAGTCTCATTATCAAA
-AATTCGGTGGTTTTGAACCAGTTTTAGTCTATTTAAGCAAAATACCCACA
-AACTCTACTCCCCCTTTAAAGGAATGAAAATAATTATTGGAACGTTTGTT
-TTTTAAAATGATTTTTTGTTAAAAAATCCACACCGACGAAAAATCCACAG
-TTTCAGAGCCTCCGAGCTTCATGAAAACGCCGTGGTTCGCCCCACCGGCT
-CCAGAAGGCCGGGAATTCAATATAGTAGATGATAGAACTATTAACGAAAA
-GTACGCCGGGCTTAATCCGGGCGTCGAGTTCATTTCCAATGTGGATCGCC
-TTATTTCGGATATCAATGAATCGCTGAAGTATGTGTCGGATAAGATCGAG
-CGAGACGTTCGGAAGATCCCTGAAGACGTGGTGGAGCTTCCCACCACCAC
-CACCACAACGGAGCAGCCGCCGCGGACAGTGTTGGGATGCTCGAGAGTTG
-GAATTATTGCGAAGGGAACGTTCATCAAAGGGGATCGGTGTGCGGAGGTG
-GTTCTGACGTGTACGCCGGTGCCGACTTCGGGGCTTGTTGAGCAGATTAG
-GCGGTTGTTTGGAGAGTCGACGGTACGGGCCGGCCTTTTTTTTTTGCCGG
-AAATTTGGGGATTTACCGGTTTGCCGGAATGTTTTTTTTTCCGGCAAATT
-GCCGGTTTTCGCCGGAAATTTGAAAAACGGCAAACTGGCAATTTGCCGGA
-AATTTTCAGTTTCGGCAAACTGCCGCGATTTGCCGGATAACAATCGTTTA
-TTCCGGCAAATTCGGTAAGTTGCCGGTTTGCCGATTTGCCGGTTTGTTGA
-ATTTAGCGGAAATACGGCAAACGGCAAGTTGCCGGTTTCCCGACTTACCG
-GAAATTTGAAAAACGGCAATTCGCCGGTTTGCCGGAAATGTGAAAAACGG
-CAAATTTCAGAATTCGGCAAGTTGCCGGTTTTTGCCGGAAATTTTCATCT
-TAGGAAAATTGCCGGTTTTTGCCTGAAATTTTCATTTCAGGAAAATTGCC
-GGTTTGCCGGTTTGTCGAATTTTCCGGAAATGTGGAAAACGGCAAGTTGC
-CGGTTTGCTGATTTGCCGGAATTTTTAATTTTCGGCAATTTACCGATTAG
-CCGGAAATTTTTTAACGGGATTTTTGATAAGACGGATTTTTTTCCGGCAA
-ATTCGGCAAGTTGCCGGTTTGCCGGAATTTTTCATTTTTGACAAATTGCC
-GATTCGCCGAATAATAATTATGCCAGAAATTTGAAAAACGACAAGTCGCC
-GGTTTGCCGATTTGCCGGAAATTTCAAAAAACCGGCAATTTGCAGAATTT
-TGCCGGAAATTTTCATATTCGGCAAAGCTACCGATTTGTCGGATTTTTTA
-AACCGGTTTTTTCATAAGATAGATTTTTTTTCCGGCAAATTTCCGGCAAG
-TTTCCGGTTTGCCGGAAATTTCAAAACCGGCAATTTTCCGAATTCTGCCG
-ATTTCTTGTTTGACAATCTCAATAATTACACAGACATCTCTAACAATTGA
-GCCGGATCCCGAGTCCCCATCAAGCCTTATCGTCACAGCTAACTACTTTC
-CCAATATGAAATGTCGTATTCTAATCACTTCAGCTGTAGTTAGAAAAGAC
-GATGATAGTATTGTAACTGGATGTGCTGCTGATAAGGATTTGTGCATTTA
-TGCGCTCGCTTCTATTCGGAATACAAAGTGGTATGATGTGAGTTTTTTTT
-AAATTTTACACATATTTTAAATTACTTTATCATTGGAAAATCTAATAAAT
-TAGAGCCCAGTTTACAAAAAAATCTATATTTTTCCAAAAAAAAAATTGAA
-AAAAATCGATAATTTCTCAAAAAATGTTTACAAAATCGAACTTTTTCCAA
-AAAACTTTGAAAAAATCGATAATTTTAAATAACTGCTGACAATTAAAAAA
-AATCGAAAATTTCTCAAAAATTGAAAAAATTAATATTTTTCCAGAAAAAA
-TTGAAAAAAATCGATAATTTCAAATAATAGCTGAAGATTTTTTAAAAAAA
-TCGAAAATTCGAACCTTTCTCAAAAAATTTGAAAAAAATCGATTTTTTTT
-CCAAACTTTTTTTCATCAAAAATTTCTCAAAAATTTGGAAAAAATTAGAA
-AAAATCAATATTTTTCCGAAAAAATTTGAAAAAAAAATCGATAATTTCAA
-ATAATAGTTGCAATTTTTAATTTAAAAGCGAATTTTTCAAAGATTTTTCA
-AATTTTTCACGTTTTTTTCTCTGGTTTTTTTAAATTAAAAAGCGTAATTT
-TTACCGAATTTATCATTAAATTACATGAATTTTTCTGAAAGAGCGAGAAA
-ATTAAAATAATTCGGAAAAAAAACAATTTTTTTCCAAATTTTCCAAAAAA
-TCCCACAGAAACCACCAAACTTTACTTTTTTTTTTTAACAAAAAAAAGTT
-TTAAAAAATATCAATTTCCGGCTTTTTTTCTGCCAAAAACTTTGGAAAAT
-GTGGGTAATTTTGGCTTTAAAAGTTTAAAAATTGAAAAAATCAGGAAAAC
-TTTTTGAATTTTCAGAGTCACTGCCAATACTTGAACTCGTGCCAATCAGT
-TATTCGACTGCTCCGAGATTTGCGAAATAAATATCCTGAAGTTGCGTGTC
-TTGATGATTATGTAAGTTTGAGAGTTTGGAAAAATATTCGAAATTTTTTG
-TGAAAAATTTGGTAAAAGTTCAAAATAATGTATAATTCTTTAATTTTTTT
-GCGAAAAAATTAATTTTTTGAAAAAAATTCTCTATATTTTTTGCTAAAAA
-GTTTAAAAATCTAAATAGTATGAAAAAATATTTTAGCAGAATCAACAAAA
-ATTGTATAAATTCATAATTTTTTGAAAAAAATGAAATAAATTTTTTTTTG
-CGAAAAAAATATGCGAAATAGGTTTTTTTAATGCAGGAAATAGTTTTATA
-GCTGAAAAAATGAGAAAAAACGGAGAAAATTGAAAAATTACGTACATTTT
-GCAGATTTTTTGCTCACAATTTTGTAAAAATTTCGGCAAAAATATCACCT
-TATTCAAAAAAAAATTGCTAAAAAAAATTTTTATAATACAAAAAAAATAT
-GAAATCTATCTATTTTTTTCAAAAAATCTACCTAAAAATCTATTAATAAT
-TTTCAATTTTTTTGTGAAAAATTTTGAAAAAATTCAAAATAATGTATAAT
-TCTATAATATTTGGCGAAAAAAATTAATTTTTGAACTATAATTTTTTTTT
-TGAAAACTAGTTTCAAAAATCGATATTTCACCTAAAAAAAACCCTAAAAA
-TAGGCGGCAAACTATTTTTCCGGCAAATCGGTGGTAATTGCCGAAATTTT
-TGGCAAATTGTGGCTTTGCAATTTTTTTTTTGTTGGAAATTTCAGATTTT
-CAAATTTAATCGGCAAGAAAACTGAAAAATCCCGTTTAAAAAATTCCGGC
-AAATCGGCAAACCGGCAAATTGCCGAATATAATATTAGGTCTCCTAATAA
-GTTCCGGGTCAAAAATCATAACCTTGTTCGCTGTGTATCGATTTTTATGA
-AACTTTGGGAGTTTATGTTATCAACCATGATCTTTCAATTGACAATAGTC
-ACAAAATTTTTTGACCACCCCAAGTGCCCGTACTCGGAGCCAATTTTTTC
-AGGCATTTTTCTGATCTCGCTTCTTTTTATCTTTGAATTGAGGTTTGTGT
-GCGGATTTTGCTTTGTTTAGAATACATCATTAGAAAACGAGAAAAGTTTG
-GAAAAAAATCTGTCCAAAAAATTTTTTTTGGTTGATCGTCAAAAAAGCTT
-CAAAAAGATTTTTGTCGAAAATTCTAGATTTTTCATACAAAAATGATGTA
-ACCAAGTGTAAATTATTTTTATACATACAAAACATATCAATTTAGTTCGA
-TACACTAAAATGATAATAAAAAATATAATTTTTTCGGATAATTTTTGAGT
-TTTTTGAATATTTCTTAAGTTTCAAATTTCAAACTAAAAGGATTTGTGTG
-TGTAAAAATAATTTACACTTGGTTACATCATTTTTGTATCAAAAATCTAG
-AATTTTCGACAAAAATCTTTTTGAAGCTTTTTTGACGATCAACCAAAAAA
-AATTTTTTGGACGGATTTTTTTCCAAACTTTTCTCGTTTTCTAATGATGT
-ATTCTAAACAAAGCAAAATCCGCACACAAACCTCAATTCAAAGATAAAAA
-GAAGCGAGATCAGAAAAATGCCTGAAAAAATTGGCTCCGAGTACGGGCAC
-TTGGGGTGGTCAAAACATTTTGTGACTATTGTCAAATGAAAGATCATGGT
-TGATAACATAGATTCCCAAAGTTTCATAAAAATCGATTTGCAGCGAACAA
-AGTTATGATTTTTGACCCGGAACTTATTTGGAGACCTTATACAATTTTTC
-AACATTTTCCAGAAAATGGAGCTAATCGTCTCGAACATTATCGATTCATC
-TCCAATGTCACTTGGACTATCCGATGCGTTTAAGCGAATTGTCGAAGCAC
-TTGCATCTGGATATTTGTATTCTGGTAGGGGGGTTAACATTTAATTTTTT
-TAAAATATTGAAAAATGAGCATATAAAAAGTTTTAAAATAATTCAAATTT
-TTACAAAAAAAAAATTTTTTTTTTCAATTATTTTGCGTTTTTGTATGAAA
-ATTGTGTTTTGAGAACGGAAACTCTTTTTTTTTAATTAAAATTTTGAAAA
-AAAATCCTGGAAAAATGCTGAATTTTTCGGGATTTTTCGGAGCACATTTC
-CAAGCTCTAAAAATTGCTGAAAATTGAATTTTTCAGAATTTTTTTGAATT
-TTGCACAAAAATGACTATTTTAGGAACAAAAAAAACATTTTTCAATCACC
-GAAAAAATGTATTAATTTTATATTTTAATGTTAAAAATACGGTATTTAAA
-TTTTTTTTAAACGTTTTTTTTACACAAAAAGTTGAAATTAGGTTGAACCC
-GGATAAAATTTAGAAAAATTAAAATTTCAATTTTTTTTGCGTTAAAATAT
-GTTTTTTAAGGTTGAAAAAAATATGTTTATTCAAATAAACACATTTCTTG
-AAAAGTTCTTTTGATTTTTAATATTAAAAAATTTATTTTTCAAAAAAAAA
-TTTATTTATTTAATTTTAAAATTTTAAAAACTTTAAATGTGGTGTAGTCG
-ATTTTTTAAATTGTTCTATTAGACTCAAAATTGACTGAAAACACCGAATT
-TCATAATGAAACTTCTTGAAAACTTCTCAAAAAAAAGATATGACTGCTCA
-AAAATGGCCTAAAGTTAGTTAAAATTTGAAATTTGATCTACTTGTCAAGC
-GGCTGGAAACTATTCTTTTTTTTGAAATCACCGTCAAATTTTGAGTATAA
-AATGTAATTATCTTGCGTTATCAACTTGATTTAGGTATTTTAAAGTCGAT
-GGACGGAGAGATTTTTAAAGGTGGAGTACCGAAATTTAAGACTTTGCTTT
-TTTAGACCCAAAATGGCCCAAAACTACCGAATTTCGTAATGAGACGTTCT
-GAAAATTTTCCAAAAAAAAGTTATGGCCGATCAAAGTGTTTGGAAAAAAC
-GGCCTATTTTTAGCTAAAATCTCAAACTTTGGCAATTTTGCAGTGTCGCA
-CCGATAAGTTGCCAAAATTTCGGTCTAAAAAAGCAAAGTCTTAAATTTCG
-GTATTCCACCTTTAAAAGTCTCGCCGTCCATCGACTTTAAAATACCTAAA
-TCAAGTTGATAACGCAAGATAATTACATTTTATACTCAAAATTTGACGGT
-GATTTCAAAAAAGAAAGCTAGTTTCCAGCCGCTTGACAAGTCGGTCAAAT
-TTCAAATTTCCGCTAATATGAGGCCATTTTTTGAGCAATCATAACTTGTT
-TTTTTGAGAACTTTTTTTTTTCAAGAAGTTTCATTATGAAATTCGGTGTT
-TTCAGACAATTTTGAGTCTAATAAAGCAATCAAAAAAATATTCGACTACA
-CCACTTTTTGGCCTATTTTTTTGGCCTAAAATTGAAATTTTTCCAGCAAT
-CCTAAGCGATCCGTGTGAGACGTCTCGTCCGAACGTTCTCGATGCTTTAA
-CCGACGAGCAGAAGCATTCGTTGACCGCCCTGGCACAGAATTTTGTTCGG
-CAAATTGCATTCAATCAGATACATGAGGTATGCGGGGATTTTTCCTGTGC
-AGAAAAAATGTTTAGTAAATTAGGGAAAAAAACCTTGAGTTTTTAAAAAA
-ATCTGTGGAAAATTTGAAAATTTTCGCAAAAAAAAAATTATAATAAAATT
-AATTTCAAATTTGCAAAAATTTCAATTTTTCAAATAAATTTTGAATTTGC
-ATTCCAAAGTCACTAAAATGGAAAAAATTGCTAAAAATTGAATTAAAAAT
-ATTTCTTTCCTGAAAATTTTTTATTTTCCGAGAATTCTGAAATTTCTTTT
-AAAAAAAATTAAATTCGCGAAAATTTGAAATTTTTTGGAATATTGCAAAA
-AATTGCTAAAAATTGAATTTTCCTATATTTCGATTTTTTAGATTTTTTAA
-AAAAGTTTTTTTTCAGCCATTTCTGGCCGAAAATTGAGAAAAAATAGTCA
-GAAAATTCAAAAAATTGCTTTTTTTTTTCAATTTTCCGAAATTTTGAATA
-TTGATCGTCCGAAAATTTAAAAAATAATCGCTAAAAAGTTGAAAAAAAAA
-TTATTGAAAACAATTTTTTTAAAATAATTTCTAGCAGATTCCATGAAAAA
-AGGCTGAAATTTACGAAACAATTTTTTTTTCAAATTCAATTCAGAAAAAA
-TTGAATTTTCTCTGATTTTGGGCCGATATTTATAAGATTTTTCAGAATTT
-TCCAAAAATTCTTGAGAAAAATTGAAATTTTTCTGCCGTATTCCTATGAA
-AACAGCGGAAAATTGAATTTTCCAAGTTATTTTTATAGGGAAAATTATAG
-TGACTCTATAGAATTCATGAAAAATTCTGACAAAAAACCAAACATTTTGG
-CCCAAAATCAGAGAAATTTCACAAAAAAAAATGCTGAAAAATTTAATTTT
-CAGCAATTTTTTTTTCAAATTTTTTTAAAAAATAAATTTTCGTAAATTTC
-ATAATTTTCAGTTTTTTTCCATTTTTTTAAAGAAAAATTATTTTTCCAAA
-AATGTGCAGAAATTTCAGAATTTTCGGAAATTAAAAAAATTTTTAGCAAA
-AAAAAAAATTTTTTAATCCAATTTTTATGATTTTTTCACTTTTTCGGTGG
-TATTAGGACTGCAAATTCAAAGTTTCTTGGAAAAACATAAATTTTCAGAA
-AATTTAAAATTAATCTGATTATAATTCGGAGCATAAAATGTGCTTTTATC
-AACAACATTTTTTTTTTCGAAAAGTCAAATTTTTCCACATTTTTAAAAAT
-TCCTTTTTTTTGTATATATTCGGATTTAAATTTTTTTTTTAACGGGTTTA
-AGCTATTTTCTGAGCAAAAAAATTGAATTTTTCTAAAATCACCATTTTTC
-TTCCAGATTCTCGGAATCGATCGTCTTCAAGACACTATTGATCTACCAGA
-GGATGCTCCGATGCTCAAAAGACCACTGGAGAGCAATGAAAATGCTGAAA
-ACGCAGAAAATCTCGACGATTCGCCAGTTTCCAAAAAGGAGAAGCTCGAC
-GAGGAGCCCGCCGATATTTGAGCATTTTTATTTTAAATTTGGTTTAAATT
-ATTTAATTTTCCTCTAATTTTCCTCATCTCTGTGTTTTTTTCTAATGTTT
-TTGGGTCCCGTAGCGAAAAAACGAATGGCTCTCTTCGCGGTGAGACCTTG
-AAATTTTTATTTTTCTACTATTACCTCCCCCTGCAAACGCGCTCTATTGA
-CGACAATTCGCAATGGAGCGCGATTGCATATTTTGTTACTACATTTTCCA
-CACTCATGTTCGATCTTCCACTAGGGGAGGGTCTCGCAGAAGGATTTTTT
-GAAAAATTTAGATTTTTTTTTGAAAAATATTCGAAACAATTTTACGTTTT
-TCGAAAAAAGTCCTAATTTAGCCTAAAAAATCAAAAATTGATAGGATTTT
-TGAAAAAAATTCAAAAAATCAAAAAAAATTGCAAAAATTTTTATTTTTTT
-TTTTGAAGAAAATTTTTTGTAAAAATTTGATTTTTTTGAAAAAGTTTGAA
-TTTTGAATTTTTTGAAAAATTCTAAAAATTTTGAATTTTTTGAAAAAAAC
-TCAAAATTTTTGGAAAAATTTTGAATTTTTTTGAATAAATTCAGAACTTT
-TTGAAAAAATTCGAATTTTTCTGAAAAAAACTCAAAATTTTTGGAAATAA
-TTGAATTTTTTCGAAAAAATTCGAGAAAATTCCTAATTTAGTCGGAAAAA
-AATATTAAAAATTGATACGATTTTTGAAAAATTTTCCCAAAAATTCTATA
-GAACTGTCCTGAATTTCTAAAAAAAATTCAAAAAAAAAACAAAGTTTTTT
-AGAAATTTGCAAATTTCTTTAAAATTTTGGAAAAAAATCTATTTTTTGTT
-GAAAAGTCTGCAATTTCTAAAATTTTCCTATTTTTTCTGCTAAAACCTGC
-AAAAAAGGACCCTCCCCCTAACTATCTTGTTCCTCCAAAAACCGACAATT
-CTTCTGTTTTTGTGTTATAATCGTCCTTTTTCTTGTTCAACAAAACAAAA
-ATTAAAATAAATTAGAAGAAACGGTAAATTTAGATACGTTTTTGCCACGT
-GGCCGAGGTTTTTCACGGCCACGTGGCAAAGGCCGGCAAGAAATGCGCTG
-TGGTGGGAGAGGAAATTGATAGGGAAGAAGGAAGAAGAAAAAAAAAAGAA
-AAAATCAATATTTTAAAGCCAAAAAAAATTTTTCTGAAAAGACTAGCAAA
-ACAGGAATGGTTATGGGTAAAGCCGAGGTTTTGAAGGAGAATTTTTGGGA
-AAAAAATTGCAAAAAAAAACGAATCGGTAGGGACGGACCGGCAAGATTGA
-TTGAAAAATTGACGAAATTATCGATTTTTTGGCGGCGCACGGGGTTCTGG
-CCTTCCCTCATAAATGGAAGAGTTTTTGCCGAACTAGGCCACCAGGTCAT
-AACTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTCAATTTT
-AGTTGTAAAACTAAATGTATTTGTCCGTGTGAAGTACACGACTTTCCCGG
-CGCGCGATTGTCAATGGAGCGCGAAAAATTAAGGGCCAGAAGTCCTCAGA
-ACCCCGTGCAAAAATCGATAATCCCGTTTAGAATCGGTGAGGGCGTGGAA
-AGAAAGAGATGATGAAACGGGAATGAGCAAAATTGCAAAAAAAAACAACA
-AGAAATTCCAGAAAATTCCATAGAAAACGGGGTCTAAAGCACCAGATTAG
-TGTTGTGCGTGGGCGTCCACTGTGACGTCATCACCTTCCACTTTTCGTAG
-TTCGACTCGAGCTGATCGGAGAGCTCGCCGAGCTTGGCGAACTCGGTGAA
-TGTGGCGAATGCTTCGCGGGCGAACATGTCTGTAAAATCAGAAATCAGGA
-GAAAATTCAATTTTGCGCGTCAACTTTGATGTTTTTTTGTGTTGGTGAAC
-TTCAGAAAATTGAATTCGCCAAATTTTACGAGCAAAATTGGGTTCTTTTG
-GTATTTTTCGTGGAAATTTAACCAAAAATCGAGTTTTCTACGGAAATTTA
-ACGTATTTTATCGATTTTTCATCAGAAATCAGTAGAAAATTCCGTTTTGC
-GCGTCAATTTTGATGTATTCGGGTCGGTGAACTGCACCAAACTGGATTCG
-CCAAATTTTACGAGCAAAATGGGGGTTTTTGCAAATTTTTCTTGGAAACT
-CAGTCAAATATTGAATTTTTCGTGGAAATTTAACCAAAAATCGGGCTTGC
-TACGGGAATTTAACAAATTTTATCGAATTTTATTTTGCGCGTCAAATTTG
-ATGTTTTTTGTGTCGGTGAACTTCAGAAAACTGTATTCGCCAAATCTTAC
-GAGCAAAATTGGATTTTTTGGGTATTTTTCGTCCGAAATTGATTTGTCCA
-GTGAAATTAAACGCGATTTATCGATTTTTTATCGGAAATCAGTAGAAAAT
-TCAATTTTGCGCGTCAAATTTGATGTTTTTTGTGTTGGTGAACCTCAAAA
-AACCGTATTCGCCAAATCTTACGAGCAAAATTGTATTTTTTGCGTCTTTT
-TCGTGGAAATTTTTACAAAAATCGTTCTTTTAAAAAAAAAATTCCACACA
-AAAGTACAATTTTCACACAAAAACTGCAATTTGCGCGTAAAATATGGCGC
-AATCGGTTGAGTGCGGCACGCCGACTCAAAAACACCATATTTTACGCGCA
-AATATTAATTGAAGCGCCTTCACGTGGTGTCAGGTTGTGTCATCACGGTT
-TGATCTACAAAAAAATGGGGGAATTTTTTGCCCAATAATATGTGACGTCA
-GCATGTTCTTAGCCATGCAGAATCCGTCTAAAATCCCGCATTTTTTGTAG
-ATCAACGTAGATCAAGCCGAAATGAGACACTCTGGGCTTCAAAACACTCA
-CCAATAAAACCGCATTGTGTGATCGGAACGTTACACGTGTTCCGATCGAA
-TACCTCCATCGTCACAGGCAGCCCTTTCTCTTTTTCTTCTCGAGTCTGGA
-AAATATTGATTTTTATTTTATTCTTGGAATTTTAAATTTCAAACAGTAAA
-AAACCAAAAATTATCAGTTTTAACTTATCCAAGTTAAAGAACTACAGTGA
-AGAGAACTACAGAAATATTAAAAAATATATCGATGCACCAAGAGCCCAAG
-AAATCTCTGAGAGCCCATATCTCGGCTCATTTCGAAGTTACAAATAAACT
-GCAAACTATAAAAATATAGAAAATTAAATTTCAATTATTTTGTTAGTTAA
-CAAAATTTGGCTAGAATTGAAATGAACTGGGATATGGGCTGGCAAAGTTC
-ACTGAATTTTTTCTTTTTTTTTCTTTTGTTTATTTTGATCTCTACACCAG
-GGGTGAGCAGCAAACGATTTTTTCCGGCAAATCGGCAAATCGTTAGCTTG
-CCGGAATAGAAAACTTCCGGCAAATCGGCAAACCGGCAAATTACCGATGT
-GCCGAGTTTGCCGGCAACCGTATGTTCCCTATGAGTATGGCCACCCATCA
-ATCGACTTTGTCGGCTTATATTTCAGCGGTTTCAGAAGTTTTTTGATATT
-TTCAAAAACCAGAGGATAACGATAGATTTGAAAAATATTTTGTCGTTTGA
-ATTTTTAAAATATGATAAAAGACAACCGAGATATAAACGGTCAAAGTCAA
-GGGGGGCCATACAAAAATTTTTTTTTGGAAATTTAGAAAAAAATGTGTTT
-CCGTCTTATTAAAAAAATCTCTCTAAGCATTTCCGGCAAACCGGCAATTG
-CCGCCCTCCCCCGACCTACGCACCTGTTCAAAGTACTCCTCAACAATCCG
-ATGCGCCCATCGCTGACACAATCCCCACTCTCTCGCCGGATTGGAGATGT
-CGGCGCACTTGACAAGCATATCACATATCGTAAGTGAATTCGTGTCACGT
-TGCTCCTCCGGCACATCTGTCACATGCATCTTGTTGAACTTGGCGAGGTA
-CTCAAAGTGTCGACTGATGTCCGTAGCCAACACCATCTCCACCATCGCAT
-GTCGCATTTGGATGAACTCCTCGCGCGACAGACTCGAGAAGATGTTCACG
-TTGGCGTTGTGCTGAAGGGTTAGCTGAAAGGCTAGTGCGATGTGATGATT
-CTCCAGGATCGAGTTATCATTGTAAAGTATTGCAAGCGACTGTCGCGTAT
-TGATCAGGTACGCGTTTCCTCTTCCAGGATGGTCTAGATCATGCACCGCC
-GCTGCGAGAAGAGCCGCCACCGCATGACTTTCATTCACGTGCACGGCGAC
-CGACGGGGAGTCCAGGAAGAATGAGGTGGCCTGTAGGACGTCGGCTGCGT
-GAGTTGCGTTGTGATACGTGTTTCCCGCATGGTAATGAGCCTCGATGGAT
-AGAATCCAACGGTGGAGGAGATCGTCGGAGCAGCCGAGCACATCGCAAAC
-CTTCCACCTCTCGAAGACTTTCATTCCGACTTGGGAAAGAGCGTGGTGAT
-CCGACACCTTTTCCAGATGAAGGATGTCGAATTTCCAGCAATTGTCGTTT
-TCCAGCGCGTTCTTCACGTCAGCAGATACCCGCCGACGTTCTCCATGGGA
-TCCTCGCTTCTCTCGATGCGCGTCGACGACGCTTCGCTTTCGCTGCCTAG
-CTGGATGATGGAGGCGAATGAGACCATCGTAATATTGAGTTGCTATCCGA
-TCGGCGTCGCGGAATCGATTGATCGACGGCGCGTACAGCTCGTGCGACGA
-CAGCACCTTCATCGCGTCCTTTATCGTTTGTGCCGGTTCTCCGTCGACCC
-GTGCCGACACGTCTCGGAGCATTGTGAGCACCTCGGAGATGGGCGCCTCG
-ATGCCGCCCGTCTGCGATTTCAGGCTTTTCAGGGAGACGTCGCGGAAGAT
-TGCGGCGGTGTCACCGGTGGTGTTTGAGCGTTTCATATACACGAATTGAC
-TACTGCAAAATTCATAGAATTTTTTGATTAATTGGTGGCCGAGTTTTTTA
-AAATGGTGGCCGAGATCTTTAAGTTGATGGCAGAGTTTTATAGGTTGATG
-GCCTAGTTTTTTAAAATGGTGACCGAGTTTCTATGCAATTTTGTGGCCGT
-GTTTTTGTATAAGTTGGTGGCCGAATTTTATAAATTGACGGCCGAGTTTT
-ATAGGTTGGTGGTCGAGTTTTATGAATTGGTGGACGAGTTTCTATACAAT
-TTTGTGGCCGAGTTTTTGTATAAGATGGTGGCCGAGTTTTTTCAAAATGA
-TGGCCGCGATCTTTAAGTTGATGGTCGAGTTTTATAAGTTGGTGGCCGAG
-TTTTATAGGTTGATGGCCGAGTTTTTATGTAATTTGGTGGCCGAGTTTTA
-CAAGTTGATGGTCGAGTTTTATGAATTGGTGGCCGAGTTGCTATACAATT
-TTGTGGCCGTGTTTTTATATAATTTGGTGGACGAGTTTTATAAATTGGTG
-GCCGAGTTCTAACGGATTAAGCAAAGGAAACTAGAACAGAATTTTATTGA
-AGAGAAAACTAGGCCATCAGCTTTTCAAGAAAAACTCGGCCACCAAATTT
-TCCAGCAAAAAACTAGGTCGCCAGTTTTTCCAGCAAAAAAACTCGGCCAC
-CAAATTTTCCAGCAAAAAAAACTGGGCCACCAAATTTTCCAGCAAAAAAA
-AAATCGGCCACCAATTTTTCCACGGAAAACTAGGTCATTTCATTGTTCGT
-TTGAGAGAAAGCTAGGTCACGTACATTTTCAATAAGAAAACTCGGCCACC
-AATTTCTTGAGCATAAAAAATTCGGTCATCAATTTTTATAGAGAAAGTTC
-GGCCATCAAGGTTGAAAAATAAGCTAGGCCACCGATTTTTTTTGTTGAAA
-AAAACTCGAACACCTAACCTATTTTCCTTTTTTTTTCAAGCCTAGAAAGC
-TCGGTTATCGAGTTTTTAGGCCACCGATGCATTTTTTTAATCGAAAATCG
-AAAAAAAAAATCGGTGGCCGACTTTTTCATTTACGGCCACCAATTAAAAA
-AAACTCACTTGTTAGCAAACGGGACCCGTATAAATTTCCAGTCGCAACTC
-CGCCGCCGCTCCTCTTCGCCACGTGCCCTCGGCAGGGACTTTCGTCGCAT
-TTCCGATTCGGGTTGTCCGATCACCTCGGATCGTATGCATCCCGTCACGT
-TCTCGTAGGCGCGGTTAACGTACTGCACTACTCGTTGCTCATCACATATT
-TCCACTGCTTGATCCGTCTGAAAATACGCAAAATTTGAAGGTTTGTAGGC
-ACACGTGGCGCCAGTCTATCCCATTACGGTTTGATCTACAAAAAATGCGG
-GAATTTTTCACCCAAAAATATATGACGTCAGCTAGTTCTTAACGATTCTC
-AACTCCCGCATTTTTTGTAGATCTACGTAGATCAAGCCGAAATAAGAGAC
-ACTCTGACACCGCGTGTAGGCAGGTAGGCGTTCAGCCAGGCGATTAGGCA
-GGCAATTAGGCAGGCGATTAGGCAGACTAGTAGGAGGTAGGCAAGTAGGC
-ATGGAGGCCAAAAGCTCACCTCATCCAAGACGGCGAAAAGGGCGGGCAGC
-GCGCGGATCCGATTCGCGAGCCGCCCGACGTAGTCGAAGAGCACCACGTC
-ACGCGTATTCCACGTCACATGCTGAAAAGAAACGAATGAATGGGAATCAG
-TGTGAATGAAATATTAATTAGAATTGAAAATGAGAAAGTGAGAAAACGGA
-TGACTTACATGAATGATGTTGGACTGCGCAAGAGCTCTCCGTCGCTTTTC
-GCTGATGTGTCTGGAATATGTGATTGTTAGATTGACAATTCTGGCAGAGT
-GGTCTAGAAAATTGGGGAAAACTCGGCCACCGATATGTTTTCTTTGGTTG
-TGGTTGGAAAATTTTGGCGACCGAGTTTTTCAACGTATCCAAATTTATGT
-GGCCGTGGCCGACTAAGGCCACATAGAAAAGAAAAATACCGAAACAATTG
-GTGGCCGAGTTTTATCAACGTAGCCTAAATTAGGTGTACTTGGCCGAACT
-TTTCTTCTGACGGCCACGCAGCAAGGAAAAAATAATGAAAAAAAAGTTGG
-TGGCCGAATTTTAAGCCTACACAAAAAGTTGGTGGCCAAATTTTAAGCCA
-ACAAAAATTGGGGGCCGAGTTTTTGTTTTTTGAAAAAATTCGTGGCCGAG
-AAAATGGGAAAACGCGGCCACCGATATTTTTTCTTTGGTTTCTGGCTGAA
-TAATTTTGGTGGCCGAGTTTTTGTTTTGGATAGGTTGGTGGCCGATTTTT
-ATCATTTTAACCTAATTTACGTGTTCTTGGCCGAACTTTTTTCTGACGGC
-CACATAGCAAGGAAAAAATAACGAAAAAAAAGTTGGTGGCCGAATTTTAA
-ATTCACAAGAAAAGTTGGTGGCCGAATTTTAAGCCTACAAAAAGTGGCGG
-CGCTTTTTCTACAAAAAATTGCTGTCATTATTTTAATTGGAAAAACTTGT
-GGCAGTGATTTTGTTTTGAAAAAAATCGTGGCCGAGTTTATCTGTAAAAT
-TGGTGGCCGAGTTTTATTCACGTAACCTAATTTACGTGGCCGTGGCCGAC
-TAAGGCCACATGGCAAAGAAAAATACCGAAACAATTGGTGGCCGAATTTT
-TAGTCTAAAAAAATGGCGGCCGAGTTTTTGTTTAAAAAACCGTATTTAGT
-ATATCTGGGACGAAAAATGGTGGCCGAGGTTTTTCAATGTATCCAAACTT
-ATGTGGCCTTGGCCTATAGCCTAGCTTTCCTAAACCATTTGTTTAAAAAG
-TTGGTGGCCTAGTTTTCCAGCATAATCCAACTCACTTCTCGGCGATCGAC
-ACAATCAACACCTCCTCTGTGCTCACCGATGAGACGTCTCTGAAAAAACG
-TTTCGTTAGTAGATCATGGCTGACGATCAACGCTGCTCCCTTACTTGGCG
-ATTTGCGATGGATGAGGTACTCGAAGATCTATGAATACAGCTAAAGGGCA
-TATTGATTCAACGTCGGATGTTGCCTGCAAGAAAGTGTACATATTCAAAA
-ATTTCCAAAATTCAATTTCCTTTTTCCCGCCCGTGTCCGAATTTCCGGAA
-CTGACCACGTTTCAGTCATGGTCTTCGTAATTCCCAATTTCCTTTCTCCC
-TTATCTTTTTACGTCAATCATGATAGCGGTGATACGTGTTTCGAGGGTAT
-ACATGCTCACACAACAATGCACTTAATCAGCTAATCTCTCCCACACCTCC
-ACAGAGAGAGTGTATGAGCAAGAGAAAGAGCACCTGCTTCTTCCAGATTA
-GTGAGCGAGCCTGTTGTCATCTGACTTCTGCTGACGGAGGGAGCTTGAAA
-AGCGGAGCAGGAAGAGGAGAAGAAAAAGAGCATTCAGAGATAATTACGCG
-CGAGTCGTAGTAGTATGTATACACTGACTTCTTCTTCTTCTTCTTCCTCT
-TTTTCCCCGTCTTCTGCTCGTTGATGTCTGCCATTATATTGATCATTAAC
-GAGGGCCTAAGAATCCTGGAAGAGTTGTGAGGTCACACTGATGGCCTAGG
-AATCTCAAAGGCAGGCCATATCATATTGCAGGCCATATCAGGCCCCATAG
-CCTGGCCATAGTAGGTCACCACAAGCTATGGACTGCCCTCAAGATTTTGG
-CTCAATTTGGATAAGCTTCTTCGGAGCCCCTGGGCTTAACAGACTGACGT
-CATAGGTGGTATATCTCGGCTAGGCGGAAACTCGGAAATGTGAATTTTTT
-GACGCAAACCAAAGATCTTATAGATCCTTGAAATCTTCCACAGGACTTAG
-CAGACCGGAGGCCTGGGAACTATGCAGTTAGAGGTAATCGCCAAGTCCAG
-GGCTCCGAAGAGAGAGGGCCCAGGGCTCCGAAAAAAGCTTAAATTTTGGG
-CCAAAATTTCCCAAATTGGGCCAAAATTTCAAAAGTATGTAGTAGGTTTC
-AACCCTCATATTTCCCGGGATCATGATTTTGTGGACTATTATTTTCAGGC
-TGTGGTGGCCTGCTATACCCAGACTATGTACTGGGCCAAGCTCTGGCCAG
-GTTATGGCCTTTAATAGCCTTGAATTTTGGAGTCAAAGTTCTTGCAGAGC
-CTAGGAGACGCTTACCACTTCGGATCAAAGGCCTGATCTAAAACTCAATG
-GATCATGACCCTAGAACCTCAATTTTCATAAGCCTAATACGCAGCTACTG
-GTCTAAGCTCTGACCAGGCTATATGGCCTGATATGGCCTGAACACTTCGG
-TGGCCTAGTCTAGGTTTTTCCAAGCCCCAGCGGGCCTCAATTTTCATAAG
-CCTAAAGACGCAGCTACTGGGCCAAGCTCTGGCCTTGAATTTTGGAGTCA
-AAGTTATTGCAGAGCCATCATGCCTAGGAGGCCTAATCTAGATTTTTTCA
-AGCATTGAGGCCCCCACGGGCCTCAATTTTCATAAGCCTAAAAACTCAGC
-TGCAGCCTTACCTGTGTTGGAAATGATACTGTACAAATCCATCCGGATGC
-CCGTAACGAGTCGAGGAGCACACTCTCGCCGGTGCCTTCCGTCACGATCA
-CAGCCTGCAAAAAACGCATTATTTATAAGATCTTACAGGGGATTTTCAGG
-ATTTTCAGGAGGATTTTGTCGTGTGCCAGACCTCAAAGCTCGTCGGGATA
-AAATGCTGATATTGATTGACATGCATATATATAGATATATATGAAGTTGG
-AAGAGCGGAAGCAGCAGCAGTGGCAGCAGAACTTGTGTGTGACGGGGATT
-TGTGGGAACAAGGCGCCAAAGAAGACGAAGCAGAAGAAGAAGAAGAAGCC
-GGGGGCAAGCAATGAATGCAATGTATGTAGGAGTATGTAGGAGTATGTGT
-GTGTGTGTGTGTGTGTGCGAAAGTCTCTCTATGTGTGTGTGTGTGTGTCA
-CAGGTTATATATTGCGTGTGCACAAAAAATGTATGAGGTCTCCTGATGTG
-TGTGTGAGTCTGTGAGTCTGTGAGTGCAGTGTACAACACCTTTTGCGGAG
-TCTTATCACATACTGATACGAAAGTGTTTGTATTTTTATATTTCTTTGCC
-ACGTCACACTTTATTCAATTTTTCGCGTGTGCCTCTCGCCCCGTCATTGG
-CACGCAGTAGAAAAAGAAGTAGAAGAAGATGCGTCTTCTTGTTGCCATAT
-CCCATCCAACTTTGTTACTTACGGAATTCGCGCGCGCGCGCGGGGAGGAG
-AAGCAGAAGACGACGACGACGAGCTCGAAAGAAGACGAGTCCGCCTGCGT
-CTCTGCAGTGATCTCGTGTCCCTCGGCAGCGGCTGCGGCGCGCGCTTCAA
-TGAAGACGAGAGCTCCCCCCCCCGGCGGCGCCGAATACGCGATTTGTCAT
-CGAGATGAGCGCTTTGCTGACAGAATAGAATGGGCAAAAACAGGAATACG
-GAATACAGTAGTCATGTTTTGTTGCAATGTTATGGGAAAGCTGGCTTGGC
-GTGGTCGTCGAATTTTTCGCGCTTCATTGACAAAGAACAAGGGAAAGTCG
-TGTTCTCCACACGGACAATCACACTAAGTTTTAGGACTAAAATCGAGCCG
-AGCCAAAATGGCCTAGTTCGGCAGAAACTCTTCCATTTCAATTTGTGAGG
-AAAGCCAGAGTTCTGTGAACCTCGGACCTGCGATCGCCGACCTGCGATCT
-CCTAGACAAATGCTCACCCCAGCGCGGGACTCGGGAAAGTTAGCGCCAGG
-AGAATAATTTTTGAATTTGAAGAAAAAAAAAGAGGAACTTACAGTTTTCA
-GCATCTTCACTTGCATCGGCCCAAACGTGTCATGTGCCGTGGAGCTGCTC
-GTTGCGGCGACAGTTAGCAGAGGTGTTGGTGGAGCACCACGCGATCCACC
-TCCACCACCACCATTCTCAGAATACGACCCACCGCAGCACCATCTCATTG
-CAAACACTGGCCTGGATGCTGCTGCTGCTGTTGCTGCTGGTGCTCTCTGT
-GCGCCTCTTCTAGCTGCGGGCGTGTGCTGCTGCCTCCTGCCAGCTTGACT
-GTGTGCGCTAGCCCCGAGCACACTCTTTTCACCCTCTTCTCCCCCCACCC
-CGCTTCTATCGCCCATTCTCTCAATTCTTCTCTGCCTCCTCCTCCTCCTC
-CTCCTCCTCCCAATTCTCATGTCATCGGGGGGCCCGTCGTGTCGTCGAGC
-GCCCTCTCGCGTCTGCAATGTCTCGGCGCCGCCGCCGTCGTCGTCGTCGT
-CGTCGTCGTCTTCGGGGGGTTGTCATCTGCTGTGTTCACACTGATGCCGC
-CGCCTTCACCGCCCATCTCATCGTCTCCTCCTCTGTGTGGACCCGCCGAC
-CGGCCGGCGCGCCTTCTCCCATCAGTTCTATCTCTCTCTCTCACTCACTT
-ACTCTCAAACCGCGTCAATTGATCTCTCTGGCACGCTCTTCGCTCGGCGA
-GCTGTATTCGGTGTCGGTTTTCAGTCTGCGTCTCCGCGCCCCGGTGCAAT
-GCATATGTTCCATCACGTTCTGCTCCTCTTGTTGCTCCGTGTGCTGCCGT
-GTTTTACGCAATTTCAGGTAAAATTGATACAATTGATACAATTGATAATT
-ATCGAAGTGTCCTCTATGTGTACTCACGCTGTTAATTTAATGGCCTAACC
-ACAGAATTATGCTTCTTTAATTTTTGAACTCGTAGCTCCGTATGTTAAAT
-CCACTATGAGATTCCTTGCCATGTTTTTGCAATATTTTTTTGTTTGTTAT
-GAGAAAGTGTATGTGTTCTTTGTTTGGTCACATGGGAACCGCTGGCCTGA
-GAATGGAAGGTTTTCTGGGACAGAGCTTTTGAATCCGATAGCCTACAATA
-GGGCCCCAGTGCAATAACGGTAGGCAGGCCCGAGGCCTAATTTAGTCCAA
-ATAGTCCTTATTCAGTCTAGATGATTCAAAGCTAAAATCAAAGGGCTGTT
-CCATTACGTTGTGATCTACAAAAAATGCGGGAATTTTTCGCCCTAAAAAT
-GTGACGTCATCACGTTCCATGCGTTATTATTTATGAAGTCTGCGTCTCAT
-TCTCCCGCATTTTTTGAAGATCTACGTAGATCAACCAAGCGCCTTACCCC
-TAGCCTCTAAGCTCCTAGGGCCCTCTAGGACCATTTAGGCTTTTTGGACT
-GTCTAAGACCAATTGGGCTTTTAGGCTCCTAGGTCCCTCAAGGACCGTTA
-GGCCTCTTGGACTATCTGAAACCATCTGGGCGTCTAGGCTCCTAGGGCCC
-TATAGGACTATTTAGGCCTCTTGGACTATCTAAGACCATCTAGACTTCTA
-GGCCTCTAGGGCTCTCTAGGACCATTTTGACTTGTTCTATAGGACCTTGT
-TCGACTAGCTAAGACCATCTGGGCTTCTAGGCTTCTAGGGCTCTCTAGGA
-CCATTTAGGCCTCTTGGACTATCTAAGACTAATTGGGCTTCGAAGCTCCT
-AGAGCCCTCTAGGACCATTTAGGCCTCTTGGACGATCTAAGATCATCTGG
-GCTTCTAGGCTTCTAGGCCCCTCTAGGACCTTCTAAGACCCCAGTCTTTA
-TTCCCTAGCCTCTAGGCTCATAGGCCTCGATTCCGCAATTCTAATGGCTT
-TGGGAGCCCAGTTCTAAGGCCCATGGACTTCCACAGTAGCTTTTCAGTCA
-ACCATTTCCAAGTTAACCAAGGACCATTTAAGCCTTTTGGGCTATCTAAG
-ACCATCTGGGCGTTTACTTTCTAGGCCTTTTCCTGCCTATTGGGCCCTCT
-TGGACCTTCTAAGACCCTGGCCTTTAATCCCTAGCCTCTAATCCTCTAGG
-CCTCGATTCCGCAAATACAATCCCAGTTCTAGACTCTCAGGGCCCTTGGG
-CTTGTAGGCTTTCAGTTAACCATTTCAAACAGGTGCCGTTCCGCTCCATC
-TCTTCTTGCTCTCTCGTGCTCCTCTCCTACACCATCTTCTCTCATTGTTC
-TGACGGATGGATGAGCTGTCATCATCATCATCAAAGCTCCAAAGACAATT
-GCCATCAATTTGTGCCGCCGCTGTGCTAAGTGGTCTTATTCCGCCGGGAC
-AAAAAAAAAGGGAAAATTCTCTGGGAATTTGGACTAACACCACCTACTAT
-TACTGTAAAAAAACATTTGGAGAAGGGGGAAACGAACTAAAAAAAAACAA
-ATTAAAATCGGCGTATCAAATTGAAATCATATGATTCGTTGCCGTCGTCT
-TCTCTGCAATGATCGTTTGTTCCGTCGTGTCAAACTAACCTACTCAATGT
-CATAAAGAACAAAGAATGAATTCAATAAAACAAGACGAAAAAATAAATAC
-ATTCAGGTACTGTACAGAGAGAATCAGGATCACATCTGGAATAGCTCGCA
-GCCTGTTCGATTCTGGGAGCTTGTTGAGTATAGGCCGACCACTACGCCGC
-CGCCGACCACTACGACAGAGTATATACCGCCACCGACGACTACGTATGTT
-CCCTGAACTTTAAAGTTGCATTTTTTTTTAAAGGATTAGGGGTTTTAATT
-GAAATTTCAGAATTTTTGGTAAATTTTTTAAAATTAGTTTTATTTTTTTA
-CGGGCTTTTGCGATTATTACTGGTAGAATGAAAGTATGTACATTTCTTGT
-AGATCAGAAAATTTAATTTTTGATATCCGATAAATGTTAAAAACTCGATC
-GAAAAAAAAATAAATTTTTCCAAAAACTAAAAAGTTGCAAAATTTATTTT
-TTTTACAATTCAAAGTTTGTAATTTTTGACAAAATACATTCAGAAATTTT
-TTTGGAATAGGGGTTTTAATTAGGCTTGGGCCTAGGTTTGGGCTTGGGCT
-TGGGCTCAGGCTTAGGCTTATGGTTAGGCTTAGGCTTAGGATTGGGCTTA
-GGCTTAGGCTTGTGCTGAAGCTTGGGCTTGGGCTTAGGCTTCAGCTTAGG
-CTCAGGCTTAGGCTTGTGCTGAGGCTTGGGCTTAGGCTTAGGCTCTCAGG
-CTTAGGCTTGGGCTTGGGCTTGGGTATGGACTTAAAATTTTTTTTCAAAA
-ATTTTATTTTTCGAAAACTTATGGTTTTACCGGTATAAAGTGCCTTTTTT
-TGTACATAAAAAATAATTTTTAAATTTTTTAACGTTCCTAAAAACTAAAC
-AAACTGTAAAGAAAATTTTGTTTAAAAAAAAAATCAATAAAACATATTTT
-CAGTAATTTCCAAAATTTGATTTCCCGGTAAAAATCAACAATTTTTTATC
-GGGGCCACAAAAAAAATTCGCTGAAAAAAATTCAATTGGATGTATTTTCT
-GCAAATTCGAGTCAATTTTCTGAAAATAGTTGTTTATTTTCCCTGATTTT
-TTGGCGTTTTTTCCTTTTTTAAAGGAATTTTAGGACTTTCTGGGATTTAG
-AAGGGTTTAGCCTAGGGAGTGATTAAGCCTAGGCTTAAGCCTGAACCTGA
-GCCTAAGCCTAAACCTAAGCCTAAGCCTAAGCCTAAGCCTAACATCAAAA
-AAACCGGAAAATCCTAAGCCTAAATAGCGTCAGTAGCAAGCTGACGCTCG
-CCACTGACACCAAGCCTAAGCCTCAGCCTTTAACGAAAAACAATTTTGGC
-ACAAAAATTGCAAAATTTCCGCTTCTCCGCTTCTCTTAAGACATTGAATT
-TCCAAATTTAAAAATTTTTAGAAAAAAAAAAACCTCGGTCCAAAATGATC
-TGAAAATTCTTATTTAGGCTTTAAAAAATTTCACTTTTTTCTGCGACACT
-TTCCATAACACCACAAATTCGGCGAATCGACCTGTTGATGATCTTGTCTC
-GACCCGCTCTCTCTCTAAGTGATTATAACAGAGATACACCCACACACCCA
-CACACGTCATCTATTATGTTCTAGAACTTTATACTTTATGATCAAAACCG
-AATGCTACAAACTAAAAAAACATCACCACTTTTTCCAAATTTTCGTCACA
-TTTTTGCAGTCCGACCACAACTACAACCACCAAAGATCCATGTGAATCAT
-CGCATCCGTTGGATCTGACGCGTCGGCTACGGGACACTGCCGGCTACAAT
-CGTATCTATATGGCCAGCGACTTTTCGTCGGCTCGCAATGAGTTTCCTGA
-TCTCAGGGGTTTGGCTCACAAAGCTTCAACGGACTATCATTGCGGGAAGA
-GGTGCCAACGGTGAGCTCTCAATGCCTACCTGCCTACTTGTTTGCAGTAT
-CAAACATATAATGCCTACAAGCCTACGCGCCTACCTTGGTCTACGAGCCT
-GAACTTGCACATTTTCTGTGCCTAACATGCACGCTATACTTTTGTCTGCC
-GTTACGCGCCCCCCCCCCCCGCCTATCTGCCTACAAGTCTCCCTTTTGTC
-TTTATGCCTACGCGCCTATCACATGCCTACCTGCCTATTTGCTTGCGGTC
-GAGTCGATACATATCATGCCTACGAGCCTACGCGCCTACCTTGGGCTACT
-AGCCTGAATTCGCATTTTTCCAGTGCCTAGCTTGCGCGCTATACCTATGC
-CTGCATTTACGCGCCTTCTCCCCGCCTAGCTGCCTACAATCGCACTTTCT
-GCCTACCTGCATGCTTTCCTACCTATTCGCATACTTAGGCGTACCTACCA
-CAAGCTTAGCTACCTACAAAACTGCCTTCTGCCAACCTGCATGACTGCGT
-ACCTTTTCGCCTGCTTAGGTGCCTACCACAAGCCTCCCTTTTGTCGATAT
-TCCTACGCGCCTATGGCATACCTACATGCCTACTTGTTTGAGTCGATACA
-TATCATGCCTACGCGCCTACCTTGGCCTACCTTGGCCTACAATCCTGAAA
-TTGCACTTTTCCTGTGCCTAGCTTGTACACTATACTTATGCCTGCCTTTA
-CGCGCCTTCTCCGCGCTTATCTGCCTACAAGCATACCTTCTGCCTCCTTG
-CATGCCTACATACCTATTAGCCTGCTTACGCGAACCTACCACAAGCCTAG
-CTGCCTACAAACCTCCCTTCTGCCTATATGCCTACGCACCTAACTCCTGC
-CTGCCTATACGTCTACCTCATGCTGAAAACAGACCTGCCTTGTACCTACC
-TATGCGCCTACCTAAGATTTGCCTCCTACGTGCCTGGCTGCCTATTTTGC
-CTATAGGCATTACTGTCAGTGCGTCTACCCAGAGCCTACCTTTAGGTAGA
-CGTTTGCCTACCTAAAGCAACCGCCTACAAGTCTATTCGCCTGCCTCCTT
-GCCTACCTACACACCTCCCTTATCCCGGCTTTTCCACCTGCCTATGCGCC
-TATCTCATGCCTACCCAAGACCTGCAAACGTGCCTAGCCGTATGCCTACC
-TAACTTCGCGCCTACATATGCCTCCCTTTCAGATCGAGTCAACTAATTCG
-AAAAATCATAAAAACCGGCCAACCGGCAGAAGCCGAACGTGCTTGGTGGG
-ACGAGGAAGAGTGGGAGGAGGGCGAGAGACGCAGGAAACGAGCCATCGAA
-TGGAAGGATACAGATGATCGTCTGCTAATGCGAAATACCGGAACATCACG
-TCATATTTTGGGTAGGTAGGTGGGTGAACACAGCAAGTGCGCTCCATCGC
-GCGGGACACTTTTCCCGCGCTTTTTAGGAGGTCAAACACGGAATTTTTCC
-AGGAATGACTGTGGCGGTGGAATGCGATGATGAGACTGGAGAATTTAATA
-GTGGTGGATACTCGTTGTGTACTACGTGCCGTGCTGTTCGACACTTGCCA
-TCCACGTATTTTCCACGTGTCATTAATGAGCTGATTTGCTCGCAGAAAGC
-GTGTTTGCGAGGAGAAGGAAAATGCATACAACGGGTTATGCCGATGAAGG
-TATGTAATTTTTTTGTTTTTGCAATGGAGCGCGTTTGTACTCACTCCACG
-AGAATCACGTGGTGTCAGAGTGTCTCATTTCGGATTGATCTACAAAAAAT
-GCGGGAGAAGAGACACAGAGTTCTCAACTGATTTTGGATGATTAAGAACG
-TGCTGACGACACATTTTTATGGGCAAAAAATTCCCGCATTTTTTGTAGAT
-CAAATCACTTGGAGAATATTATTTTTATTTGAATATGATCCTTTAAAGAA
-AAAATAAAATTTGACTGAATTTCCCGCCAAAAAATTTTCGCAGAAAATTT
-AAATTTCCCGGCAAAATATTCACGGATATCTGGCTTCCCTCATAAATTGA
-AATGGAAGAGTTTTTGCCGAACTAGGCCAGGCCATATCTGGGGTAGATTT
-ACGGCGCGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAA
-TATATTTGTCCGTGTGGAGTACACGACTTTCCCACGCGTTGGTGATTGTC
-AATAGAGTGCGAAAAATTCAATGAGGAAGGCCAGAACCCCGTGAATATTT
-TCTCAAACATTTTTTTTGGAATTAATGTGCAATCGCGCTCTAACGCAGTA
-TCCAAAACTTGGGTCTTTTGGCGGGAAACCCGAAAATTCAAAGTTTTTTG
-CTTTAAAATATCGTGAAACAGACGAAACTAGTCGCAAAATTTCAAATTTA
-CGGTCTTGCCGCGCCAGTGCGGTGGATCACGATTGCACTTAAGAAAAATG
-GCGAAAATCAAAAATTTGGTTTATTTTTGGCAACTATTTTTCATTCTCTA
-TCAAATTCATACTGTACACGTGGAAAATCATTGATTTTCCCGAAAATTTG
-AATAAATGGGATGCAAGATGCGAGCGCGCCCTATTGTGATTCGTTAAAAT
-TCGTTAGAAGCGTCACTGAAATCGAAATTTTTTCTCGAAAAATTGCAGTG
-TGCCACGTTGTAAAATATCGATTTTTTGGAAAATTTAATATTTAGAAGTG
-CGGATGCATCCTATTGTGCTCCAATAAAATTACACGGGCTTCTGGCATTC
-CGCATTGAATTTTTCGCGCTCCATTGACAATCGCCCGTGTACTCCACACG
-GACAAGTGCATTTAGTTTTAAAACTAAAATCGAGCCGCGACGCGACACGC
-AACGCGCCGTAAATCTACCCCAGATATGGCCTGGCCTAGTTCGGCAAAAA
-CTCTTCCATTTCAAAATATGAGGAAGGCCAGAACCTCGTGGAAAATATCG
-ATTTTTCCATTTCCACGTGGCCAAAGGAATTGCAAGCGCGCTCCAGTGAA
-CTCGCCCAATTTCCATTTTTTTTCAGGTTCTCCGAAACGTGGGCACCCGC
-GAGTGTGCTCGCTGGCAAATGAGCCAAATCGACGTGCGAACGTGTTGTGA
-TTGTATGCTCAATCCGTCATCACCACTGGTCACCTATTTATGAGCGAAAA
-AACCGGGGAAAAAAACACACAAAACAACTCAAAACTCAACAAAAAAAAAT
-AATTTTACAAGATTCAACGAAACAACAAAAAAAAGAAACAATGGAAATTA
-AATACGGATGCTGCTGCCAAATATGCTGCCAAATTCAAATTCTCGCCTTG
-TACACACGATCTTTATTGAAAACGGTGATCAACGGGCACCCTCCACTCTG
-ACCTTTTATCTGAAAATAATTGTTTTAAAGATTTATTTGATTAAAAACCT
-CGGCCACGGCCGCGACGCAGCCGCTCCGCACGCAGCTGCGTCGCGGTCGG
-GTGGATCCTAACCTGAACTTCTCCCTCCAGCTCGTTATCGTCGTCGACCA
-CCTCGAACAGTTTGCTAGCCTCGAATAGAAATCTGAAAAAAATAAATTGG
-TTTTTTTTGAAAATATATAATGTTTTATGTTTGGGCTTCTGGCCTTCCTC
-ATTGCATTTTTCGCGCGCTCCATTGACAATCGCCCCCCTGTGTACTCCAC
-ACGGACAAATCACATTTAGTTTCACAACGAACGACACGCAACGCGCCTGG
-CCTAGTTCGGCAGAAAAACTCTTCCATTTCAATTTATGAGGGAAGCCAGA
-AATCCGCGTGTGTTTTATTGATTTTATTGATTTTTTTACTTTCGAAAATC
-GCGTTCCGGCTGGTAGAAGCACAAGGTTTTGCGCGTGTCGGCGATTCGAT
-CCCTCGACCATTCTCTGCAAAAAAAATATTTTTTTTTGTGTAAAATTCCC
-AATCTGCGAGAACGGGATCTACGAAAAATTTTTTTTTTAATATTTTAATG
-ATTTTTTCAGAGATCACATTCTTGCAGATCATCTTTTCGTGGGGCCTCCT
-AATTTTTCAGTGCTGCACATTTATTTAACATTCAAAAGTGCTTTTTTCAT
-AAAAATTTGAATTTTTTGCCCAAAAATCGAGAAAAACGCCGCTCCGCCTC
-TTTTTCCGTGCGGCACTGTGCCTTTTGCAAGCTGGGCACAGTTTTGTAGG
-CGTGAGCATGGTCTTACTTGAGCGCTTGAGTGATCTACGAAAAAAAAAAA
-GCTTTTTTTAAAATTTATGTCGGAGATCACATTCTTGCAGATCATCTTTT
-CGTGGGGCCTGCTTATTTTTCAGTGCCGCTCGGAAAAAGAGGCGGAGCGT
-CGTGAGGCACGGTTTTTTGTCACGATTTTACAGTTTTTTGACTAAAATTC
-TTGATTTTGGATCATTTTCGTTGATTTTTTTCGGAAAAAGCTGATTTTGG
-CAAAAAAAAAATTTTCGCTTTTTTTTGGACAAAGAAGAGCCAAAAAAAAA
-AATGAAAAAATCATAAATTTTTTAGTTTTTACATTTTTTTTTTTGAATTG
-AAAAATGTTTTTTTGTGTTTTTGGTGAAAAAAACTACTTTTTTTTGCGAA
-AAAAAAATAGCAAAAATGACCAAAAATCGGAAAAAAAAAACGCCGCTCCG
-CCTCTTTTTCCGTGCGGCACTTCGCCATTTGCAAGCTGGGCACGGTTTTG
-TAGGCGTTGTCATGTTGTCATTACTTGAGCGCTTTGAGGCAAAGACTTAT
-GGGAGAACGGTGAAATCCAAAATTGGTGGCGTTCGGGAAGAGACGGGGGT
-GCTTCTGAAAAAAATTGTTGAAAAATGCAAAAAATCTGAAATTTTAGAGC
-ATTTTTCTGAAAAAAATGCAAAAAATCCGAAATTTTTGAGCATTTTTCTG
-AAAAAAACGCTAAAAATCTGAAATTTTAGAGCATTTTTCTGAAAAAAACG
-CTAAAAATCTTAAATTTCTGAGCATTTTTCCCGGAAAAAAAAAGATTTTT
-ATGCACCTCTGCGAAAACTTCATCCATCATGGTAATTGAAAAATCACAAC
-TGTCCAAAAGCACCGAATTCACAGTGTCGAGCTCGAAAACGCCGACATCT
-TCGACCTAAAATGCTCAATTTTAATGGGGAAAAGCTCTAAAATCATGGGC
-TTCTCGCATTCCTCGTTGAATTGTTCGCGCTCCATTGACAATCGCCCCCG
-TGTACTCCACACGGACAAGTGCATTTAGTTTTAAAACTAAAATCGAGCCG
-CGACGCGACACGCAACGCGCCGTAAATCTACGAAAAAAAAAAGGAATTTT
-TGCTGAAAAATCGATAAAACACGTTAAATTTAACCAGAAAAATCAATTTT
-CGCACAAAAATTCGCAAAAAAAAAAAATCAAATTTTGCTCATAAAATTTG
-GCGATTTCAGTTTTCTGAGGTTCACCGACCCAAAAAACGTCAAATTTGAC
-GCGCAAAACTTGAATTTTCTATTGATTTTTGATGAAAAATCGATAAAATA
-CGGTCAATTTAACCAGAAAAATCAATTTTTAACGAGAAAAGCCAGAAATC
-CGTTGAAAAAGCTCTAAAAATCAAAATACAAACATTCGAGAGAGTCAGAT
-GACGGAGACAGACGCATTTTTTCAGAATTTTCTGCAAATTTAGGTCCAAA
-CTGACGAAATAGAAGACACGGAGCACACTGGAAATGAAAAAAAATTAATT
-AAATGCTAGATTTTTAGCATTTTTTCAGAAAAAATGCACTAAAATTTCAG
-ATTTTTAGCATTTTTTTCCGGAAAAATACACTGAAATTTCAGATTTTTAT
-TTATTTTTTTTTGAAAAAATGCTACAGACCGAATAGTTTGCCAGGCATTT
-CTGCCGCGGAGGAAATCGGCGATGAACTCTGCCACGTAGCGGCATTCGAT
-GGGCGGTGGCTGAAAATTTGCAATTTTTTGGCCTAAAATTTGGTTTTTTC
-TGGAAAATTCTCTTACCAACGGGAAGGTTTTCGTCTTCGGAATGCCTAAA
-TTAACAATACAAGCCCTCGGAGCAATTCTCGCAAGAATTGGAGCCAGCTC
-CTTGGCATAAGTGAGATCATAGATGAAGAAGACGAGCCGCTTCACCATTA
-CGATGCTCTTGCAGCGTTCACGGCGTTCTGCGTATTTTTCCAGGATACTC
-TGAAAAAAAATCCGTTAATTTTAGCCAAAAAATCCGTTAAATTTAGCCAA
-AAAATCCGTTAATTTTAGCCAAAAAATCCGTTAATTTTAGCCAAAAAATC
-CGTTAATTTTAGCCAAAAAATCCGTTAACTTTAGCCAAAAAATCCGTTAA
-TTTTAGCCAAAAAATCCGTTAATTTTAGCCAAAAAATCCGTTATTTTAAG
-TCAAAAAATCCGTTATTTTAGCCAAAAAATTCGTTAATTTTAGCCAAAAA
-TTCGCTAGTTTCAGCCAAAAAAATCCGTTAATTTTAGCCAAAAAAGAACC
-GTTATTTTTAGCCAAAAAATCCTTTAATTTTAGCCAAAAATTCGATATTT
-TTAGCAAAAAAAATCCGTTAATTTTAGGCAAAGAACCGTTAATTTTAGCC
-AAAAAATCCGTTAATTTAAGTCAAAAAATCCGTTAATTTTAGCCAAAAAA
-ATCCGTTAATTTAAGTCAAAAAATCCGTTATTTTAGCCAAAAAATTCGTT
-AATTTTAGCCAAAAATTCGCTAGTTTCAGCCAAAAAAATCCGTTAATTTT
-AGCCAAAAAAGAACCGTTATTTTTAGCCAAAAAATCCGTTAATTTTAGCC
-AAAAATTCGATATTTTTAGCAAAAAGAATCCGTTAATTTTAGCCAAAAAT
-CCGTTAATTTTAGCCAAAAATCCGTTAATTTTAGCCAAAAATTCGATATT
-TTTAGCAAAAAAAATCCGTTAATTTTAGGCAAAGAACCGTTAATTTTAGC
-CAAAAAATCCGTTAATTTTAGCCAAAAAAATCCGTTAATTTAAGTCAAAA
-AATCCGTTAATTTTAGCCAAAAAAATCCGTTAATTTAAGTCAAAAAATCC
-GTTAATTTTAGCCAAAAAAGAACCGTTATTTTTAGCCAAAAAATCCGTTA
-ATTTTAGCCAAAAATTCGATATTTTTAGCCAAAAATCCGTTAATTTTAGC
-CAAAAATCCGTTAATTTTAGCCAAAAATTCGATATTTTTAGCAAAAAAAA
-TCCGTTAATTTTAGGCAAAGAACCGTTAATTTTAGCCAAAAAATCCGTTA
-ATTTTAGCCAAAAAAATCCGTTAATTTAAGTCAAAAAATCCGTTAATTTT
-AGCCAAAAAAATCCGTTAATTTAAGTCAAAAAATCCGTTAATTTAAGTCA
-AAAAATCCGTTAATTTTAGCCAAAAAAGAACCGTTATTTTTAGCCAAAAA
-ATCCGTTAATTTTAGCCAAAAATTCGATATTTTTAGCAAAAAGAATCCGT
-TAATTTTAGCCAAAAATCCGTTAATTTTAGCCAAAAATCCGTTAATTTTA
-GCCAAAAATTCGATATTTTTAGCAAAAAAAATCCGTTAATTTTAGGCAAA
-GAACCGTTAATTTTAGCCAAAAATTCGATATTTTTAGCCAAAAAATCCAT
-TAATTTTAGCCAAAAATTGCTAATTTTAGCAAAAAAATTCGCTATTTTTA
-GCCAAAAAATCCGTTAATTTTAGCCAAAAAATTCGCTATTTTTAGCCAAA
-AAACTGTTAATTTTAGCCAAAAATCCGTTGATTTTAGCCAAACAATTAGT
-TATTTTTAGCCAAAAAATCCGTAAATTTTAGCCAAAAAATCTGTTATTTT
-TAGTCAAAAAATTCGTGAATTTTAACCGGAAAATCCGTTATTTTTACTAC
-AAAAATAGCGAATTTTCGCCAATTTTAACCAAAATCTCTCGATTTTTTGT
-CAAAAATGCACCAAATGTGCGCTTTTTTTCGTTTTTTTTTGGCATTTTCC
-CTACTTCAATAGCGAGTTTGCAGGTCGTCGTGCAAATTTTGACTTCGATT
-TCAACAGAATCCAGCAGAATTCGATCATCAGTCATACATTCCAAACAATT
-TTCAGCATCCTTTATGGGCACTTCGATGAAATCTGAGAGAGCAAACACTT
-TAGAATTGCCAGGGTTTACAGCTCTTTTAATCACCATCCAACTGGCACGC
-GACGTCCATTTTTGGCTGCCCATTCACCCGCTCGCCGCCACCCTTGCAAA
-TGTTGTGAAATTTGATGACAAACGGTTCAGAGTACTCGAAATTCTCCAGA
-TCGCCGTGCTCGACGAGCTCGTTGTTCGATGGTGCTCTTTCCGGCGTTCT
-TTTCCATCTGAAACTGCTGTTTTTCCTTTTTTTTTTTGTCGCAAAATCTT
-TTTTTTCACCGAATTTTTCCACCAACCTGAACAGCGAATCTTCGAAAAGA
-GACGAAGAATTCGATTTTGGGCTTTCCAAATTTGAAAAATTCAAAGAAGT
-TGTCACAGAACTAGCCATTTCGAAGTTGAAATGATTAAAAATCAAAAACA
-AAAAATTTCGATAAAAATCAATGTCCGAGAGGAGTACACGCTTGGGAACC
-ATGCGCGGGTCTCGCACGGAAGAGACGAATTGAAGTACGGTAGCTCGTAA
-ATCCTGTTCCACGATTGATTTTTTTTTAATTTTTGATCAATTTTTTCGAT
-TTTATCCCAGAAGTTCTTGAAAATTATCCGTTTTTTTGCAATTTTTTCGG
-AAAAATGCTCTAAAATTTAAGATTTTTAGCATTTTTTTCCGAAAAAAATG
-TTTTAAAATTGCAGATTTTTAGCATTTTTTCACAAAAAATGCACTAAAAT
-TAAGATTCTTAGCATTTTTGCGGAAAAAATGCTAAAAATCTTGCAAAGAC
-TGAAAAAATTCGAATTTGTTGTAATATTGCATGTTTTCCGAGGTTTTACA
-TCAAATATGTGTAGTTTTCCTTGAAATTTGACGTTTTTCACTGAAAAATT
-CTACAAAAATAAGCATTTCTGAGCTCTTTTGTCGCAAAAGTTGATGAAAA
-TCGCCAATTTTTCAATAAATATTGCACAGAAACCGTCAGATTTTTAGCAT
-TTTTTCGGAAAAATGCACTAAAATTTTAGATTATTAGCAATTTTTCAGAA
-AAATGCTCTAAAATTTAAGATTTTTAGCCCTTTTTTTCAGAAAAATTCAC
-TAAAATGCAAGATTTTAATCATTTTTTTGCAAGAAAAATGCTCTAAAATC
-TAAGTTTTTTAGCATTTTTTTCGGAAAAATGTTTGAAAATCCCTTCTTTA
-ACGCCTTTTTCGCACTAAAAGATGCTCAAACTAGTTTAAACTTTCAGAGT
-TTTCCCATGCTTTTGCCCCCTCCACTTCACAAGAAACAAGAAACAAATAC
-GGCGGGAAAAAAGCGAAAATTCGCGGAAAACATCATTTTCAATGCATTTT
-TCATCGCGAAAATTGCCGAATTTCATTAAAAATGGCCAATTTTTGTGCCA
-GTTTTCCCAATTAATCATGTATTTTCGATTAACTCGAAGCCCCTGCGCAG
-AGAAAAACACAAAAATGTTGCAATTGTTTGTGTAAAGCACTTCTCTGCGC
-GTCTGCGGCATCCGATATGACGAGCAATATATATCTTTTTTCTGGGAGCC
-TTTTATTTTAAATTTATCATTTTTCATTTAGTTTTTGAGAAAAAAATTCC
-CCCAAAATTAACCTAAAAGCCTTGAAAATGTGAATTTTGAGTGAAATTTG
-ACGTTTTTCAGCGAAAAATTCTCAATTTTTAGTGCATTTTTGCCGGAAAA
-ATGCTAATAATCTTGAATTTTAGTGCTTAGCGGAAAAAAAATTCAAAATG
-AAAATGTCGAATTTGAAATAAAATGCTTTAAAATTTAAGATTTTTAGCAT
-TTTTCCCGAGAAAAGCTAAAAATCTTAATTTTTATAGCTTTTTTGTTGAA
-AAAATGCTAAAAATCTTAAATTTTAGATCATTTTATTTCAAATTCGACAT
-TTTCATTTTGTATTTAAGAAAAAATAACCTCAAAGTCTGAAAAATATCGA
-ATTTTGAGTGAAATTTGACATTTTTCAGCGAAAAATTCTCATTTTTCCGG
-AAAAAATGCTAAAAATCTTGAATTTTAGTGCATTTTTCCAGAAAAAATGC
-TAAAAATCTCAATTTTTAGTGCATTTTCCCGGAAAAATGCTAAAAATCTT
-AAATTTTAGAGCATTTTCCAGAAAAAATGCTTAAAATCTTGAATTTCAGA
-GCATTCTTAATGAAAAATGCTAAAAATCTTAAATTTTAGAGCATTTTTCT
-CGAAAAAATGCTTAAAATCTTGAATTTCAGAGCATTTTTTTCGGAAAAAT
-GCTAAAAATCTCAATTTTTAGTGCATTTTTCTGAAAAAATACTAAAAATC
-TTGAATTTTTAGAGCATTTTCGCTGAAAAATAATAAAAATTTTAAATTTT
-AGAGCATTTTTCCGAAAAAAAAAACGCTAAAAATCTTGTAATAACTGACA
-AATTTCGAATTTTGAGTAAAATGGCATGTTTTTTGAGGTTTTTCCTTGAA
-ATTTGACGTTTTTCACCTAAAAATTCGACAAAAATGAGCATTTCTGAGCT
-CTTATATTGCAAAAATTGACAAAAATCGTCAATTTTTCAATAAAAATTGC
-CCAAAAACCTTAAAATATTCTGAAAAAAGCCGAAAAAACCCCATTTTTTA
-GCCATTTTCTACAGAATTTTACATTTTTCTCAACTTTCTTCACCTAAAAT
-CGCCGATATTATTCACATAAAATTCCCTTTTTTTTCAGCGCAATGGGGTG
-TATTATGAGCCAGGAGGATGAAGCAGCGAAACGAAGATCCAAGAAGATTG
-ATCGATTGGTAAAAATTGGGGATTTTTCGTTGAAAAAACTCGATTTTTTG
-TGAAAAAATATAGAAAAATCATCAAAACTGCTTCAAAAACCGAAAAATTT
-CACTAAAAACTAGAATTTTTGCTCGAAAACCTCAAAAAATCGCAAAATTT
-GCAGTGAAAACTAGATTTTTATTTTTAAAAAATTCAAAAAGTTCATAAAA
-ATCAATAAAAAAATCGGATTTTTTTTCTTAAAAAATCTGGAAAACTGTCT
-AAAAATCTACTCAAAATCAGTTTTTTTTGTAGAAAATCTGAAAAATAGTC
-TAAAAAATTAATAAAAATCGATTTTTTGGGAGAAAATTTGAAAAATTACG
-AAAAAAATCAATAAAAAATCGGTTTTTTGGGAAAAACCCTGAAAAATTGT
-CTAAAAATCTATAAAAAATTGGATTTTTTAAATAGAAAATCTGAAAAACT
-GCCAAAAAATCAACAAAAAATCGATTTTTGTGTGAGAAAACCTGAAAAAT
-TATCAAAAAATTGGTTTTTATCTAGAAAATCTGAAAAATTACCTAAAAAG
-CAATAAAAAATCGGTTTTTTTTCTGGAAAAACTGTAAAATAGCCTAAAAA
-TCAATTTAAAAAAAGTTTTTTTTTTTGTAGAAAACCTGAAAAATTATCAA
-TAAAAACCACGAAAAACAGTTTTTCGCTTATAAAAAGTCCAAAAATCCCA
-AAATTTGCATTAAAAACTAGATTTTTATTTCAAAAAAATTCAAAAATTGC
-CTGAAAATCAATAAAATTGTTGTTTTTTTTTGGAAAAAAAAACCCTGAAA
-AATTGGCTAAAAATCCCAAATTTTTTTGCAGCTCAAAGAAGACGGCGAGA
-ACTCAATGCGAACCATCAAGCTTCTGCTCCTGGGAGCCGGCGAGTCTGGA
-AAATCGACGATTTTAAAGCAGATGCGTATCATTCACGACGTCGGATATAC
-GACTGAAGAGAGAAAAGTGTTCAGAGGCGTCGTTTATGGAAATATTATTT
-TGGTCAGTGCTCCGATGCACTGAAAAATGACAGGAAATTGGCAATTTTGA
-CCAAAATTCGTGGATTTTAACCAAAAAATCCGTTAATTTTAATCAAAAAT
-CGGCTAATTTTAGCCAAAAAATTCGCTATTTTAACCAAAAAATCCGTTGA
-TTTTAGTCAAAAAATTCGCTATTTTTAGCCAAAAAATCGCTATTTTTAGC
-CAAAAAATCCGTTAATTTTAGCCAAAAATTTCGCTATTTTTAGCCAAAAA
-ATCCGTTAATTTTAGGCAAAAAATCCGTTAATTTTAGTCAAAAAATCCGC
-TATTTTAACCAAAAAATCCGCTATTTTAACCAAAAAATCCGTTAATTTTA
-GCCAAAAAATTCGCTATTTTTAGCCAAAAAATCCGTTAATTTTAGCCAAA
-AAATTCGCTATTTTTAGCCAAAAAATCCGTTAATTTTAGCCAAAAAATTC
-GCTATTTTTAGCCAAAAAATCCGTTAATTTTAGCCAAAAAATTCGCTATT
-TTTAGCCAAAAAATTCGCTATTTTTAGCCAAAAAATCCGTTAATTTTAGC
-CAAAAAATTCGCTATTTTTAGCCAAAAAATTCACCAATTTTCGTTTAAGA
-TTCTCCAATTTTTGACAAAAAAATTCACCGAATTTGCTCAAAATTCTCCC
-TTTTTTGGCTAAAAAATGCATAAATTACACAATTAAACCAAAAATTACCC
-AATTTCGCCCAAAAACTCTAATTTTTACCAAAAATTCTCCTATTTTTTGT
-TGAAAATTCACCAATTTTTTTGCCAAATTTTAACAGAAAAATCTATAAAA
-TATCAGGCGAAAATAACCTAATTTTGGTCAAAAATTCACCGATTTTTGTT
-CAAAATTCTTCAATTTTACCCAATATCCACCAAATTTTAACCAAAAAAGT
-CTAAAAAATTATTCAAAAAATCCCTAATTTTGGCCCAAAATTCTCCATTT
-TTACTCAAAAATTCTCTCTTTTTAACCAAAAAATCTAGAATATTAGGTGA
-AAAATGCCTAATTTTGGCTAAAAATTCACCGATTTTTGACAAAAAAAACC
-TCCAATTTCAGCTTAAAACTCTCTGATTTTTACCAAAAAAATCTAAAATA
-TTAGGCGAAAAATCACTAATTTCGGCTAAAAAATCACCAATTTTTGACAA
-AAGAAACTCCAATTCCAACAAAAAATTCACAAAATTTACTCAAAAATTGT
-CTGTTTTTCACAAAAAAAAAACCTACAATATTAGGAGAAAATTCACAAAT
-TTTGGCCAAAAAATCCCTAATTTTGGCCGAAAAATTTGCCAATTTTGTTC
-AAAATTCTCCAATTTTCGACTAAAAAAACCTGCCATATTCAGCAAAAAGT
-TCACCAAATTTACTCAAAAATTCAAAAAAAATCTAGAATATTAGGCGAAA
-AATCCCTAATTTTGTCCAAAAATTCACCGATTTTTGACAAAAAAAACTCT
-AATTTCAGCAGAAACTTCACCAAATCATAGCCAAAAATTCACTGTTTTTT
-ACCAAAAAAATAGAATATTAAGAGAAAATCCCTAAATTTGTCCAAAAAAT
-TAAACAAATTATAGCCAAAAATGCTCTGTTTTTTACCAAAAATTCTAGAA
-TATTAGGTAAAAAATCCCTAATTTTTCCCAAAAAATTCACCGAATTTACT
-CCAAAATGCTCTGTTTTTGACAAAAAAAAACTCTAATTCCAGCACAAAAT
-TTACCAAATTATAGCCAAAAATGCTCTTTTTTTTCCAAAAAAAATCTAAA
-ATATTAGGCGAAAAATCCCTAATTTTGTCCAAAAATTCACCGATTTTTGA
-CAAAAAAAACTCTAATTTCAGCAGAAACTTCACCAAATCATAGCCAAAAA
-TTCACTGTTTTTTACCAAAAAAATAGAATATTAAGAGAAAATCCCTAAAT
-TTGTCCAAAAAATTAAACAAATTATAGCCAAAAATGCTCTGTTTTTTACC
-AAAAATTCTAGAATATTAGGTAAAAAATCCCTAATTTTTCCCAAAAAATT
-CACCGAATTTACTCCAAAATGCTCTGTTTTTGACAAAAAAAAACTCTAAT
-TCCAGCACAAAATTTACCAAATTATAGCCAAAAATGCTCTTTTTTTTCCA
-AAAAAAATCTAAAATATTAGGCGAAAAATCCCTAATTTTGGCCAAAAAAA
-TTACACCAATTTTCCCCAATTTCAGCTTAAAATGTTCAATTTCTAACCAA
-AAAACCCCCAAATTTTAACCCAAAAATTCCCTCGAATTTCACCCCAAAAC
-CGTCCAATTTTCCAGTCTCTCAACGCCATCATCCACGCTATGGAGCAGTT
-AAAAATCAGCTTCACCACACTCGATCACGAATCAGATGCCCGAAAGCTTC
-TAATGTTCAGCACAACAGGCGAAGAGGATGAGCTGCCCGAAGAGCTCGTC
-GTGCTCATGAAGAGTGTTTGGTCCGATTCGGGAATTCAGAAAGCGCTCGA
-AAGGTGGCGAAATTTCGCTGAAAATTGAGAAAATTCGAGGGATTTTCGCT
-GAAAATCGAGAAATTTCGGTGGAAATTAGCTTATTTCCATGAAAAAATCG
-TTAAAATCCCAGAAAATTGCGATTTTGGACTATTTTTGAGCATTTTTCGC
-GTTTTTTCCATGAAAAATTCAATGAAATCGATTTTTTAGGTCATATTCGC
-TGAAAATTACCGCTTTTTTCGATGAAAAATTCGTTGATATTCGTTGAAAA
-TTATCTATTAGAGCTAATTAAAATTTAAAATTCCAAAAAAAAAAATATTT
-TAAAATAATCAATCGAATTATTTTTTGCTCACACTTTCAAAAACCGCTAA
-AAATTCTAAAAAAAAAATTTTGGAGCCCCTTTTCCGCTAGAAAATAGCTT
-TTTTTCCCTCAAAATCCGGGAAAATTCAGAAATATTTAATTTTTTGGCTA
-TTTCTGACTCTTATTCCCACACAAAAATAGTTTTACCAAAAAAAAACAAT
-TTTTGTCAAAAATTCGAAAAAAAAATTTCTGGGAAATATTTTTAAATGAC
-TCTAAATTTTCCCCTGTACCCGAATATCGATGTGAAAAAATTCAGAAAAA
-TTTTCCGCGATTTTATATGATTTTTTGAAAATTGGACAAATTTCAGTTTT
-CCCCCCTAATTCCTATTTGAGTTACCGCCAATTTGATTTGTTCGATGGAC
-TTGCACATTTTTGAATTAATCTATTTTATTTTTTGTTGTTTTTTCCACCG
-ATTTTTAATGTTTTCGGTGTATTTTTGCTTGAATTTTAGGGGAAAAGTCA
-AAATAAATGCAATTTTCGATTAAAAAGCACGCTGACCGGCGTAAAAATGA
-AAAAGTAACGATTTTAAACGATTTCAAACCTGAATTAATTAATTTCACTG
-ATTTACGCCTGTACGCGTGCGTAGATCAGTGAAATTAATTAATTTAGGTT
-CGAAATCGTTTAAAAGCGTTACTTTTTCATTTTTACGCCTGTAAGCGTGC
-TTTTTAATCAGAAATTTGCAATTATTTTGACTTTTTCTCTAAAATTCAAG
-CAAAAATACACCGAAAACATCAAAAATCGGTGGAAAATAACAAAAAATAA
-AATAAATAAATTTAAAATTGTGCAAGCGCGCTCCATCGAACAAATCCAAT
-TGGCGGTAATTCAAATAGGAATTAGGCAAAAACTGAGATTTTTGAGGCAC
-CACGTTTTGAAGATCTGTTCAAAAAGAAGATCTACGTTTTCAGGATCTGG
-CACCGTGCCAACTGCGGTTTTCTCGATGAAAAACGTAACAACGATGCTCC
-GATGTTACGCGTCGCGTGTTGTTTTGCGTTCAGAAAGATATTTTTTGAAA
-TTTTCTTCTTGAAGAAACGCTTAACGACACGCAACGCGTAACATCGGAGC
-ATCGTTGTTACGTTTTTCATCGAGAAAACCGCAGTTGGCACGGTGTCAGA
-TCCTGAAAACGTAGATCTTCTTTTCGTAGATTTTCAGAATGTAGATCTTC
-TTTTGGTAAATCTTCTTTTCGTAGATCTTCTTTTCGTCGATCTTCAAAAT
-GTAGATCTTCTTTTGGTAGATCTTCTTTTCGTAGATCTTCTTTTCGTAGA
-TCTTCTTTTTCGTAGATCTTCTTTTTGAACAGATCTTCAAAACGTGGTGC
-CTCTGATTTTTCCAAATTTCAAAAAATCATATAAAATTTAGAAAATTTTT
-TTGAATTTGTTTATCAGCATATTTGGTCATTTTGGTACCATATTTTCCCC
-TGATTCCGAATATCAATGTGAAAAAATTCAAAAAAAAAATCCCTGATTTT
-ATATTTAAGCTTGAAATCGCCGAATGAGATTTTTCAAATACGCGCGCACA
-AATAAATTCTCCTTGGAGCGCGTTTGCCTCATTTGATTTTCTCCATATTT
-ATTTTTACTTTTTTTTCAGTTTTTCACAGCTATTTTCATTCATTTTTATT
-GTATTTTATAGGTTTTTTTTTTTGAAAAATAAATTTTTCCGTGTGAATTG
-AACATTTTATTTGCATAAAAATGAATGAAAATAGCTGAAAAACTGAATAA
-AGTAAAAATAAATATGGAGAAAATTAAATGAGGCAAACGTGCACCAAGGA
-TAATTTATTTGGGCGCGTATTTGAAAAATCTCATGTAGGAGGCAAATGAA
-ATTTAGGCGATTTCTAGCTTAAATATAATATCAGGGAAATTTTTTTTTTG
-ATTTTTTCACATCGATATTCGAATCAGGGGAAAATTTGGAGCCACCTGTA
-ACAAAATTTTATGAAAAAAAAAACTGTATAATTTCTAACAACTTTTTTTT
-TGTAGATCACGCGAATATCAGCTCAACGATTCGGCCGGCTACTATCTGAG
-CCAACTCGACAGAATTTGTGCTCCTAATTACATTCCCACACAGGTATTTT
-TCACTGGAAAATTCACAAATTTTTCCACTACTAAAAATTCAAATTTCCTT
-TGCAGGATGACATTCTCCGCACAAGAATCAAGACAACAGGAATCGTGGAG
-ACGCAGTTTGTCTACAAAGATCGCCTATTTTTGTAGGGGGAAAATTAATT
-TTAAAAAATTGAAAAAATCGTCGCCGAAATTCAGGGTTTTCGACGTTGGC
-GGACAGCGATCCGAACGAAAAAAGTGGATTCATTGCTTCGAAGACGTGAC
-GGCACTCATTTTCTGCGTTGCACTGTCAGAATATGATATGGTTCTTGTCG
-AAGATTGTCAGACGGTGCGATTTTCGAGTTTTTTGCTTTTTTTTCGTTTT
-TTTCCCAAGTTTAGGGTTTTTCGGTGAAAATCTCGGTTTTCTTGGTTAAA
-ATGGTTTTTTTTTTGGCAAAAAACGGCAAAAATTGAGGATTTTAGCGTAT
-TTTGGCGAAAAATTGAGTTAATTACATGGAAAATTTCAGAATTTGAGTTA
-AAATTGTAGTTTAAGGATTTTTTAGTGATTTTCTCGATTTTTGAACCGAA
-AAACGTTCGAATTTCATTTATTACGCGCGACCACAAAATGCTGAGAACGC
-GTATTGCACAACATATTTGACGCGCAAAATATCTCGTAGCGAAAACTAAA
-GTAATTCTATAAATGACTACTGTAGCGCTCTTGTGTCGATTTACGGAAAT
-CGTGTATTAATCGATAAAGTATTTTTTTTAGAAACACAAAAATGACAAAA
-AAAATACGAAAGAAAATTGAATTGTTTCGAAAATCGAGTCCTCCCGTAAA
-TCGACACAGTTGCCATTAAATTAAATAAAATTAATGTTAACTGTGTCGAT
-TTACGGGAGGACTCTCGATTTTCGAAACAATTCAATTTTCTTTCGTTTTT
-TTTTGTCATTTTTGTGTTTCTAAAAAAAATACTTTATCGATTAATACACG
-ATTTCCGTAAATCGACCCACAAGAGCTACAGTAGTCATTTTCAGAACTAC
-TGTAGTTTTCGCTACGAGATATAATTGCGCATCAAATATGTTGTGCATGA
-CGGATTCTCAGCATTTTGTGGTCGCGCGTAATGAAAAGCGAAAAAATCGA
-TATTTTCTGATTTTTGCGCCGAATTTTGTTAATTTTTCTTTTTTTTTTTT
-CTGCGAAAACCACATTTTCCTGACTAAATTCAGGTTCAGCCATTTTTTTT
-CGCAAAAATCGACGAAAATTGAGAATTTTAGCGTACTTTTAATTTTTTTA
-AATTTTTTTCGCTCTGAAAATTATGAAAAAATCAAAATTTTCTCGATTTT
-TGAACCGAAAAACGTTCAAATTTCATTTAAAAATCGAAAAAATCGGGAAA
-AAATTTTCCGATTTTTGCACCGATGATTTTCGCTAATTTTTCACCACATT
-TTTTGCGTTTCAGAATCGAATGCGAGAATCGCTAAAACTGTTCGACTCGA
-TTTGCAACAATAAATGGTTTGTCGAGACGTCGATTATTCTATTTCTCAAC
-AAAAAAGACTTATTCGAAGAGAAAATCGTTCGATCTCCACTCACACACTG
-CTTTCCGGAATATACGGGCGCCAATAATTACGAAGAAGCTTCTGCGTACA
-TTCAACAACAGTTTGAGGATATGAATAAGAGGACTACTGGAGAGAAAGTT
-GGTGGTTTTTTTGAATTCACTGCAACTTTTTCCTCACGAGGGACGAGGAA
-AAGTGGTTTCTAGGTCATGGCCGAGGGGCCGACAAGTTTCAGCGGCCATT
-TATCTTGCTTTGTTTTCCGCCTGTTTTCTTTCGTTTTTCATCGATTTTTT
-TCGTTTTTTCGTAATAAAACTGATAAATAAATATTTTTTGCAGATGCTAA
-AACAATTTCCAAGTAAAAAAATCATGTATTCAGTCGGCAAGCAGCGATGA
-AAGTGGGCATTGTAATATGATGGATTACGGGAATACAAAACCTAAACTTT
-TTCTGAAACATGAAACATATGATGCTTAGATGCTGAAATTACCTGATTTT
-CATAACGAGACCGCTGAAAAGTTTTGAGGTTTCCACAATTCAACTTTTTG
-TGCGAAAATCTCGACTTTTTCACCAAAAAAGTTGAATTTTGGAAACCTCA
-AAACTTTTCAGCGGTCTCGTTATGAAAATCAGGTAGTTTCAGCATTTAAG
-CAGCATATGTATCATGTTTCAGAAAAAGTTTAGGTTTTGTATTCCCGTAA
-TCCATCATATTGCATTGCCCTTGTTTCACCGCTGCTTGCCCACTGAATGC
-ATAATTTTTTTACTTGGAAATTGATTTAGCATCTGCAAAAAATATTTATT
-CATCAGTTTTATTAAGAAAAACGAAAAAAATCGATGAAAAACGAAAGAAA
-ACAGGCGGAAAACAAAGCAAGATAAATGGCCGCTGAAACTTGTCGGCCCC
-TCGGCCATGGCCTAGAAACCACTTTTCCTCGTCCCTCGTGAGGAAAAAGT
-TGCAGTGAGAAAACTCAATTTTTGAATTTTTTTTTCATGAAAATCGGAAA
-ATCTTCAATTTTTCCTAATCAATTCCATCTCTACAGAATCAAGAAATCTA
-CACCCAATTCACATGTGCCACCGACACTAACAACATTCGATTCGTTTTCG
-ATGCCGTCACCGACATTATCATTCGAGATAACCTCCGCACGTGCGGGCTC
-TACTAAATTTTTCCGCTAAATTTTAAATTCCGTTTTTTCCCCCCAAAATC
-CCCTCCCAGACATTTTCCGGTATTTATGTATTGACCACACACAACTCTTC
-TCTCCCGTCTCCGCTGTTCAATGCTACGGTTATTCTCTTTTTTTTTCTTT
-TTTTTTCCTGAAATTCCAAGGGTGTCGTTGAAAATCGAAAAATTCGAAAA
-ATTTGGGTTTTTTAGAGGAAAAGCCAAAAATTCAATTTTTTTTTCGATTT
-TTATTCCGGAAAATTCGAAAAATTTCGATATTTTTTAAATTTTTTACAAA
-AAATTCGAAAAATTTGGATTTTTTCAGGAAAAAGCCAAAAAATTACAATT
-TGTGTTTAAAAAAACGAAAAAAAAAACCAATTTTTCTGATTTTAATTCCG
-GAAAAATCAAAAAATCTCGATTATTTTCAGAAAAATTCGAAAAATTTGGG
-GCTTTTTCCAAAAAAGAAATCGTAAAATTTCGATTTTGTCCAGGAAAAAT
-CGAAAATTTAATGTTTTCTTTTTTGGCTTCTTCCGGAAAATCCAAAAATT
-TTGAATTTTTTGGATTTGTTTTCAGAAAAATTGGAAAAATTTGGATTTTT
-CAGGAAAAAGCCTAACAATTTCAAATTTTGCTTTAAAAAAACTTTAAAAA
-ATTGATTTTTGAGGAAAAAACGAAAAATTTCGACATTTTTTGATTTTTTT
-TTTACCGAAAAAAAAATTGATTTTTTCCAGGAAAAAGCCAAAAATTTTCA
-ATTTTTAAGGAAAAATTCGAACAATTTTGATTTATTGATTTTTTATTACG
-GAAAAATCGAAAAATTTGGGTTTTTTAGAGTGAAAAGCCAAAAGTTCAAT
-TTATTTTTCTGGAGAAATCCAATTATTTCAATTTTTGAATTTTTTCAAGA
-AAAATAAAAAAATGTCGATTTTTTCCAGAAAAATCGAAATTTTTCGTTTT
-TGAATGAAAAAAAATTTTTCCTTCAATTTTTCCTTTAAAAAAAATAAATA
-AAAATGTTCGAATTTCCATGAAAAAAAGTCAAAAAAATTCAAAATTTTCC
-ATTTTCCCTGACAAAAAAATCAAAATTTTCCGATTTTCCTAAACCAAAAT
-CCCAAAATTTTCTGATTTTCCAATTTTCTCTGAAAAATCGAATTTTTTGC
-CGCACACCCCTGGTTTCACGTGGTGGTCAGGTTGTCTCATTGCGGTTTGT
-GATCTACAAAAAATGAGGGAATCTTTCCTCCCCCGGGAAAATCTGACGTC
-AGCGCACTCGTGTAACCATGCGAAATCCTCTGCTGAAAAGTCTGCGTCTC
-TTCTCCCGCATTTTTTGTAGATCAACGTGTAGATCAATCCAAAATGACAC
-CTTGACACCACGTGCCTAAGCCCAAGCCTAAACCAATCCATTTTACCGGT
-ATATCTCTACAACCTTTCACTGTCTGAAATATCGCGTCATTTTATATTAT
-TATTATTATTGTATTCGCTTAAACGACAACAATTCCCCCATTTGATTCAA
-AAAGTAAACATTTCCGAACTTTTTAAAAATTTGAAAAATATTTTTAAAAA
-ATTTTAGCGTGAAAAACTTGTCCCCCCACCCTGCCTCTCCAAAAAAAATT
-AATTTCGGAAGAATTCAGTCCTTGTTTTTGTAAATTGAGAACGTAATGCG
-CTTTTTGGTGGTTTTTGCATATTTATCGACACTTGCGTACGCGAGGTATC
-GATTCAGATTCCGTGAGTTTTTTACAACAAAATATCGCTAAGCAATCGCG
-CTCCAGCGCGAAACTTCAAAAAAAGGCCAAAATTTTGCGTCGCTTTCTAT
-GATTTTAAGACGAAAAGCGAGGAAAAATCAATAAAAACAGCGAAAACTTT
-GAAATTTACGGGTTTGCCGCTTTTTTTGCGCTAGAGCGCGATTGCTCACT
-GAGTTCAAGCGCCCTTCTTATTTTGAAATGGAAGAGTTTGCCGAATTAGG
-CTATTTTGGTGCGGCCACGGCTGGGGTCAATTTACGGCGCGTTGCGTGCC
-GCGTCGCGGTTAGGTGGACCACGCCTTTCCCACGCGTAGACGATTGTCAA
-TAGAGCGCCGAAAATGCAAGGCCAGAAGCCCGTATGAGTGAAGTTTTTGT
-TCATTTTCACTTTTTTTTCGTCGTTTTTAACGGTTTTTATGTGAAAATCA
-ATAAAAACGGCGAAAATAATTAAAAATTTTCGATATTCCGGGTTTGGCGC
-TTGCTTTGCGCTAGAGCGCGATTGGTCACCGAGTTCAAACGGCGCACTCT
-GGCTTCCCTCTTAATTTGAAATGGAAGAGTTTGCCGAATTAGGCCATTTT
-GGGTCGGCGGGTAGATTTACGGCGCGTCGCGTGTCGCCTCGCGGCTCGAT
-TTTGATTGTAAAACTAAATGTATTTGTCCGTGTGGAGTACACGCGACTTT
-CCCACGCGTTGTCCAGCAGGTTATTGCCAATGGAGCGCCGAAAATGCAAG
-GCCAGAAGCCCGCCGTATAAGTAGCCCATATGAGTGAAGTTTTTGTACAT
-TTTCACTTTTTGTTTCGTCGTTTTTATGGTTTTTATGTGAAAATCCACAG
-TCTCCTCGTCATCGAAAGCGCACAAAAAACTGCTTACTGGCGCGTTTCGC
-GTTTTTGCTAGCGCATTTTGTGGATTTCTCCGAAATTCAGAAATTACGCG
-GAAAATAGGCTAGAATTCCAAAATTACAGCCCCGCCTCTTTTGATAATTA
-TCTTCAGGATGAAGAAGATGATCGCGAAGGTGGGTGACTTGAAATATACA
-AGAAAAATATGATTTCTTCAGAGAAACACCATTTTTACCGTTGATTTTTT
-AATATCCCTACTCCTCCTTCAGTTTTTGACCAAATTTTCTCTTTTAATGG
-TCTTTCATTTCATTTTGTGCTAATAAACAAATGTTAAGTTCGAAATCTGC
-GAAAAAATTCGTTTCAACGCTAAAAAACGACGAAGTTTATTTTTCAACAC
-TAAAAAGATTCACTCCCTCCCCCGGCTGTGCCAATGTGCAAGTGCGCCCC
-AGCCCAATTCGACGCCGAGGAGACTGTGAAATCATTAAAAACAGTGAAAA
-TAACGGAAAATTTCTGAAATTCCGGGTTTGCCGTTTTTTTTTGCGCTGGA
-GCGCGATTGCTCACCGATTTCAAATAGCGCACGCGCTTCTGGTTTCCCCC
-ATAAATTGAAATGGAAGAGTTTTCGCCGAACTAGGTCATTTTGGCGCGGC
-CACGACCGGGGTAGATTTACGGCGCGCTACGTGTCGCGTCGCGGATCGAT
-TTTAGTTGTAAAACTAAATGTAGTTGTCCGTGTGGAGTACACGACTCTCC
-CGTCCGGCAGGCGATTGCCAATGGAGCGCGAAAATGCGAGGCCAGAAGCC
-CGTGCATTTTTTTGCGGGTCCCGCCACGACATTTACCCTTTCAGACACGT
-GTATCAAAGAGGACCAGGCGATTTTGGAGAAGGAAAATGTGAACTCGCCA
-CGCCAATTTCTTTTTATCGATGACGGACAATCGCCAAAGTGGAGGGAAAA
-TGATCTCGAAGGAAAAGGAATTCTTATGAGCTTCGGAAATCGATTGAAGA
-ATCTGACAAACGGATATGAGACTGTGAGACTTTTTTTACGGGTCTCGACG
-CGATTTCCCACGGATTTCGGGCTTCCCTCATAAATTGAAATGGAAGAGTT
-TTTGCCGAACTAGGCCCCGGCCATATCTGGGGTAGATTTACGGCGCGTTG
-CGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTGAATGTATTTGTCC
-GTGTGGAGTACACGGGCGATTGCCAATGGAGCGCGAAAAATTCAATTTGT
-GTCTCGTAACGATTTTATCGATTCTTTTTCAGGGTGCCGAACAAGCTCTG
-CGTGTCCTTGAATTCAACAATACGGAACACTTTCTTGTGATCAATTTTTG
-GATGAGAAGCTACTATTTCATGAAAAACGGTGATAAATATCAGCTGTCAT
-ACACCGGAACCACCATCAAACCCGATTTGAATCACTTTATTCGGTTAGCA
-GGCTTGGAGATGCAATATCGCTCCATCGCAACCATTTTTTCAGCGTATAC
-TTCATCTGCGCTCCAGCGAACAGTCAGAGTGCGTTGATCGTGTTTGGGGA
-TCAGTCGAAACCGCGAGTTTTAAAGTCGAAAAAATCGAAGAGGGAAGCAG
-CGCTGATTGATGAGAATTCGGGGAAGAAGCTGAAAAAGTGCCAGAAAATT
-CGGACGAAAAGAGCGGCGGCGGTGAATAACTCGACGGAGTGGACACAGAC
-GCTGAAGGATACTCGGAGACTTAAACAACGTAGCGAGTGAGTTTGTGCCA
-AACGATACTCCGATGTTCCGCTTCCGCTGAGGACACCGCGTCGTTTGATC
-TCTGAAAATTGCGAGAGTCAGCCTCGTGTAAGTTTACCGCAAATTTGGAG
-GTCAAGCAGCGAGGTCCTCATATTTTGAAATGGAAGAGCTTGCCGAATTC
-GGAGTCGATTTACGGCGCGTTGCGTTGCGTGTCGCGTCGCGGCTCGTGAT
-TTTCGCATATTTATCGACACTTGCGTACGCCAGGTATCGATTCAGATTCC
-GTGAGTTTTTGCAACAAAAAAATCGCTGAGCAATCGCGCTCCACTGGAAA
-ACACCCGAAAAGTTTTGAAATTCCGGGGTTGCCGCTTGTTTTGCGCGCTA
-GAGCGCGATTGCTCGCCGAGTTCAAACGGCGCTCTCTGGTTTCCCTCTTG
-TACGAGACGAGCGTCGCGGTTCGGTCCAGCAGGCGATTGTCAATGGAGCG
-CGAAAAACACGTGGTGTCAAAGTCTCCAATTATGGTTTGATCTTTGATAA
-ATGCGGGAGACGAGAGACACCGACTTCTCAACTGATTTCGCATGGTTAAA
-AGTGTTCTGACGTCACATTTTTCTGGAAGAAAAACTCCCGCATTTTTTGT
-AAATCAAACCGGATTAGGACAGCCGGACACCACGTGGAAAAACAAGATGA
-GGGAAGCCACAGAAGCCCGTGCAGAGTCTCGGTTTTATCAGTTTTCGAGT
-AGTTTCGCACCACAAAAAGCGTGTGACGTCACATTTTTCCGGCCGCAAAA
-TTCCCGCGTTTTTTGAAGATCAAACCGAAATGCATTGTTTCAGAATCTAC
-TCTTGGGCACGTCTCTCGTTCATTCACCTCGGTTTCGGTATGGTAGTGAT
-CGTCAACGCCATCGTTTTTTTGTTCTTTTTCAAGTATTTCAAGAAGTTCA
-ACTCGACGGTGAAGAATGGAGATCAGAAGCAGGAATCGGATGAGACTGAT
-GAGAAGACTGAGAAGACTGAGAAGCAGGCGAAATAGAACTTTTTAGTCTA
-TCTGTGTTGAAATAAAGGAATTGAAAAAAAAAAAAAAAAAAATTTTTTTG
-CATATATGCATGTGGTGTCAGAGTGGATTATTTCGGTTTGATCTACGTTG
-ATCTACAAAAAATGCGGGAACTGATTTTGCATGGTTAAGAACGTGCTGAC
-GTCACATATTTTTTGGGCGAAAATTCCGGCATTTTTTGTAGATCAAACCG
-TGATGGGACGTCTGGCATCACGTGTACATGTAGAAATGAGATACAACATG
-TTATGTACCGTTATCCTACAGTACTATAGGTGAACCCCTCAATTTTTGAC
-CTCCAAAAATTGCGGGAATCTTATAGGTCAACTTGCAGGGGGTCGTGGAC
-ATGAATAAGCCAAATTCAAATTATTCAAGCCAAAAAGATGATAGCGCAGA
-CACGTGCCCCCAATTTCGGTTTGATCTACTGTGTAGATCTACAAAAAATG
-CGGGATTTAGGACGCTGAGTTCTCCACTGATTTTGCAACAAATTCCCGCT
-TTTTTGAAGATCAAACCGGACAACCTGACACCACGTGAAGGAATAAACCA
-CGCTCTTTTGCCAAAATCTTAAGAGTTTCTACAATTTCAGTGAAAATCCA
-GTATTAGATTTGATATTTGAAAAAAAAAAGTTAAATAATGGACGCGGCCT
-AGTCTTTCCTCTTCTACTAGCAAAACGCCCTGTTTTACAAAAAAAATCTA
-TAGTTTCTGAAAAAAAAATCAGTGGCAAATGTCTACAATTTTCAATATTT
-CATACTAAAAAAATCACAAAAAATTATTTTATGGCCGCGGTCGAGTTTTT
-TACTCTTCCACGTGGTTTCAGAGTGTCCAATTTCGGTTTGATCTACCGTG
-TAGATCTACAAAAAATTCGGGAGTCGAGAACTGATTTTGCATGATTGCTG
-ACGTCACATTGTTTTGGGTAAAAAATTCCCGCATTTTTTGTAGATCAAAC
-CGGACAGCCTGGCACCGCGTGCGCAGAGAAGAAAAAGCTAATGAGCACGC
-GGTGTCAGGCACGGCTTGATCTACAAAAATTGCGGGAATTTTCAACCCAA
-AAATATGTGACGTCAGCGCGTGCTTAACCATGCAGAATCAGTTCTCAACT
-CCCGCATTTTTTGTAGATCTACGTAGATCAAACCGAAATGGGACACTCTG
-ACACCACGTGAATGAGCCAATTGAGCAAAAATCGTACTGAAAGAGATCGT
-TTTATTCGCGCAGAGGTTAGTTACACGAATTGAATAGAAAAAATAATGTT
-TTGCAAAAAAAAAGTAATGTACATACTCATGGAAATAAATTTATTATGGG
-GGAGCTTGATTATTACAAGTCGACGAAGAGCAGCACTCCTTCTTCTCCTC
-CTTTTCCTTCTCTTTTTCCTTTGGAAGCTGCGGAGAATTCGACTCGGATT
-TCGACATTAGACGGGAGCTGGAGCATCTGAAAAAAAAACGCGAAAAATGG
-TAGATCACACGTTTTCCAACCTATTACCTTCTCAAACTAAGACTGGAGAA
-GAGCGGTGTACACTTGAGCATGTCCTTCAACTGTATCGACTCGTAGTTTT
-CGATCGATTCCTGGAACTTTTCGATCCACAGCTCCTTGTCCGCCTTGTCG
-GCGGCTTGTAGGGTGTAGATGCCGACGACTTGGTAGTAGCGGGTTAGGTG
-AATTATGACGAACGCGAATTTTAGGGACACTGGAAGAGGAACACACTTAT
-AGTGACACTACAGTAGTCCTAGAAGGTATTGGTAAGGTACTGGTAAGGTA
-CTGACTGCGCTAATTTTTGTACGTTACACATTTTCCTGGAGTTTTGCAGA
-CCTTCAAGAAAATTCTAGCACTTTCCAGATTTTCTCCGAAAAATTCCTGC
-ACTTTCCAGATTTTTCCAGAGAATTCCTGCACTTTACAGATTTTTCTAGA
-AAATTTTGTTTTTCTCAGAGTTTTTCCTATAACTACAGTAATCCTACAGT
-ACCCCGACCATATCGCCCCTACCAACATACAACCCAATATTCCATCAAAA
-GACAAAAACTCAAATTTTCCCGAACTACAGTAACCCTACAGTAACTCTAC
-CGTATACCTACCGGGCCCCTACAGTACTGCTGCAGTACCTTGACATTATC
-CCCTACCAACATACAACCCAATACCTCTTCGAAAGCTGGGAACTCAAATT
-TTCTATAACTACAGTAATCCTACAGTACTTCTACAGTACCTCTACAGTAC
-TACTACAGTACACCGACCATATCCCCCACTAACCCTAAACCAATATTCCT
-TCAAAAGACAAAAACTCAAATTTTCCCAAACTACAGTAAGCCTACAGTAC
-TCCTACAGTCCCCCGACCATATCCCCCTACCAACATACAGCCCAATATTC
-CATCAAAAAACAGAAAAAACTCAAATTTTCCAAAACTACAGTAACCCTAC
-AGTACTCCTACAGTACTCCTACAGTACCTCTACAGTACTCCTACAGTACC
-TGGACATCATCCCTCACCAACTTCCAATCTAATACCTCTTCAAAAGCTGA
-AAATTCAAATTTCCTATAACTACAGTAGTTCTACAGTACTCCTACACTAC
-CTCTACAGTACCACTACAGTACCCCTACAGTACCCCGACCATATCCCCCC
-ATTGACTCTAAACCAATATCCCTTCATAAGCACACTACAAAGACTACGTG
-GACTACAAACTATGTATGGTCAGACGGATAGTTTTTTTTAATATAAGAAA
-TGATGATGAACTATATATACTACTATATATACTGACACTGATTCACCAAA
-ATTAGCGACTCTGGCAATTCACCAAAGATAGGGTACGGTACTGGTATGGT
-ACTGGTACGATACTAGACCCCAGTTCTTTAATACGATTCCCTAAAATTGC
-TCACTCGGCGTTGCCTGGTCGTTGGAGTCCGCATCACAGAACACGCAAGA
-ATCCAACGGTACCGGCTGTCGTTGGACGATGTAGTGCTCGGATTTCCCGA
-TTGGGACTCCTTTCTGCAACTCTTTCAGTAATAAAACAAGTAATAAAACT
-TCGCGGGACTCCTCACCACTTTCAGCTTCGAAGCGCACTTTTTAGTTTTA
-GTCAGCACAAACATGTCGTTGAATAGAAACGCGTACATATCAACGGTCCG
-CCCGTTTTCCACAAGCTCGAGGGGGCCTTCGTGGATAAGCTTTCGACGCG
-GATGAGCCAGAAGGTTCTCGCAGAATTGACGGGATAAGGCGACGCGGAGG
-AACTGGAATTGTAAAAAATCAAGGGAAAATGTTGCAGAGAAAACAAATGT
-TTCAACTTACATCAGGGACATAAGACTTGGGCTCCAAGTCGCTTATATTC
-GGCCAGACAACCTGTGTCTGCAACTGCTGAAGCCTCTCAAAATTATGAAG
-CCACTGCACACTATCATCAATCGATCGGAGTGATTCCGTCATTGTGTCGA
-TCACCTTCTCCACCTTTCCCTTACTCTCCTCTTCCTCCGATCTTTTGTGA
-ATCTCGCGGAGAAGGATCGGAAGCCGAGTGATTCGTTGAAGCGGTGCGAT
-CAAAAGATCCTCGAGCTGTAGACGGAAGCATCGTTCATCGGCCAGACATA
-TCCGCTCGAATTCCGTGAATCGTTCCTCTTTCTGTCGAATTGAGCCGAGA
-TATTCCATGGTTGCCTTGTAGTTGATGCAGTAGGCTTGGTAGGCCGAAAT
-TGTGGAGGGGCCTTTGGAGAACTGGAAGTTTAGAGTTATAACAAGGCATA
-GTCTCAAGCTATTTTCCAGCCTATCCAAGCTGTGGTCCTGGTGCTTAACA
-GTCTTGATTTTTTAGAGCTGGAAAACCGGACTAATCCGGACTACGGAAGC
-CTGGTTTTTGTCTAAACGACAACATTGTGCAACAAGGTACGCTTTTTCAT
-ACTACTTTTTTTTAAACTTTTGTTTTTTTTTGTTCTTTTTCGGCCAGCTT
-TTAGGAACTTTTTTGACCCAACTTCGAAATGTCCCTTTTTTTTGCAATTT
-TAGGAATTTCTAGAAATTTCCCATTTTCTCTTTTTCCAGCCCCTTCTAAA
-CCTAGGCCTAGGCCTACGCATAAACCTAAGCCTACGCCTAAACCTAAGCC
-TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCTTAAGCCTGAGCCCAAG
-CCTAAGCCTAGGCCTAAGACTAAGCCTATGCCTAAGTCCCAGCCTTAACC
-CAAGCCTAGGGCTAGTTGAAAGCCTAAGCCTAACCCAAACCCTAAGCCTA
-AGCCTAAGCCTAAGTCCAAACTTAGGCCTAAGCATATGTCTAAGCCTAAG
-CCGAAAATGTCCCTTTTTTTTGCAATTTTAGGAATTTCTAGAAATTTCCC
-ATTTTCTCTTTTTCCAGCCCCTTCTAAACCTAGGCCTAGGCCTACGCATA
-AACCTAAGCCTACGCCTAAACCTAAGCCTAAGCCTAAGCCTAAGCCTAAG
-CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCT
-TAAGCCTGAGCCCAAGCCTAAGCCTAGGCCTAAGACTAAGCCTATGCCTA
-AGTCCCAGCCTTAACCCAAGCCTAGGGCTAGTTGAAAGCCTAAGCCTAAC
-CCAAACCCTAAGCCTAAGCCTAAGCCTAAGTCTAAACTTAGGCCTAAGCA
-TATGTCTAAGCCTAAGTCTAAACCGTAGCCTAAGCCGAATCCCAAGCCTA
-AGCCTAAGCCTAAGCCGACGGAGCACGAGGAGAAAGTCCAAAACTTCACA
-AAAAAACAAACATTTCTCTCAATCTCGGTCAGTTTTCAAAAATATTTCGA
-GTAATTTTTCAGCACAAATAACAAAAACCCACCCTTTCAAACAAGTCCAC
-AACTAGCTGTGTGCAGTCCCAATTCTCCTTGTCTACCGTACTGAGCAACG
-AGAGGAACGATTGACAGAAGGTTCGAGATATTCTGACAAAATAAAAATGT
-GTGTGTGTGTGTGAAATGGCACGTCAGATTAAAGGCAAATAGAAAAAAAA
-AACCAATTAAAAACTGAACGAACCTGCAGAGTTGATCCAAATTTCCGAAA
-AGGAGGTCCGGCTCGACAAGCAGTAGACATCCCTCGACTTGACATCTCTT
-CAGCGGCTCCTTGTAAACATCGCGGAGCACGAAGAGCTGACGATAGAGGA
-AGACGAGCTCCGTGTGGAACAGCTCCCATACCGCTTGAAGGTATTTGTGT
-TTGGATGAGGGAATTGTCGTGGTCTCGTCTCCCATGAACATTTCCTCAAA
-GGATACTGGCTGAAAGTTGGATTTTTTTTTGGTATTGGAGCTCGTCTCTG
-GGCTCGTTTTGCAGTTTGTACCCTTAAAAAGACATTAAAAAGACATCAGC
-AACAAACTCCAAAATCCCAAGTAGTAAACAGATTTTTTCTAAAACGGCAA
-AATTGAGTGAGGAATTTTTATTCGATGCACCATGTTTCTCACTCAAATTT
-GACTACTCATAACTTAGTTAAACCTAATCCAATACTTCCTTAAAAGCTAA
-AAATTCACATATTCCCAAACTACAGTAAACTACAGTACCCTACCGTACCC
-CTACAGTACCCCGACAGTACCCCTACAGTACTTTGACAATATCCCCCATC
-AACTCCCTACAAAATCATCAAAAACAAAAAATTCACAATTTTCAAATCTA
-CAGTAACCCTAGAGTGATCCTACAGTATTCCTACAGTACCACTACATTAC
-CTTGACATATCCCCCACCAATTTCCAACCAAATACCTCTTCAAAAACTAA
-AATTCACATTTTCCAAAACTACAGTAACCCTACCGTATACCTGCAGTACC
-ACTACAGTACCATTAAAGTACCTTGACATTATCCCCCACCAACTTCCAAT
-TAAATACCCCTTCAAAAGCTAAAAATTCAAATTTTCCCGAACTACAGTAA
-CCCTACCGTATATCTACAGTACCCCTACAGTGCCACTACAGTACCTTGAC
-ATTATCCCCCACCAACTTCCAACCCAATACTCAATCAAAAGCTAAAAATT
-AACATTTTCCCAAACTACAGTAACCCTACCGTATTCCTACAGTACCCCTA
-TAGTTTCACCTACCAACAACTTTTCCAGCTCATCATCCTCAATCTCATGA
-TCCTTAGAAGTCTCCAACGCGGCCTGCACATGCTTAATAATCTCCCTCCG
-TTTTGCTCTGCCCGACCACTCGTAAAGTCTCTTCAGAATCCAGGGCGATC
-GATTTTTCTGCGGCTCGGAAGCTTCTGCATAGAAGGCTTGAGAGGCTATT
-GTGGCACGTTGAAGATCTGAAAATGAAGAATCGGTGGGGATCAGTGGTGA
-CAGCGAGGGAGAAGATCTATTTGGTGGGGTGGCACATATAGAAGTGGGTA
-GTAGCGGTTTTTTGTGTGATCTTTGTGTAAATAGACATGATATTAGGGCT
-TCCGTGGTAGGCAGGTGCGGTTTTAGGGCCTGGCGCTTGCCTGACGCCTG
-CCCGTCTCACGCCTGCCTGGCGCCTTTTATTCTGCATTTTGAAGTGAGTT
-TTCAAATTTCAAATTTTCTCATTTTTATCATTTTGTTGAAAATCAAATTA
-AGAAATGAAAAAAAGTTTAAGTAGGTTTCAGCATCAGGCGTGTATTTAGG
-CGAGAGGCAGGCGGGGGTCGCCTCAAAGTCAGGCAGGCAGGCCTTCTTAT
-GCCTACACGGAAGGTGTTCAAAAATCGGTTGCGTGTGTCCAGTAATGACA
-AGAATCATACAAAGCATTCGACTTTTACACAAAACTAGTCTGTATTCCAC
-CTGTACAAAAACCTACCGATCGATGTGATTTTATTTGAATCTGAAAAAAA
-AATTTCTCAGAAAATTTGAATTCCCGCCAAAATGTTTCTTTGAAAGTTTG
-AATTCCCGCCAAAAACATTCTCAGAAAATTCAAGTTCCCGCCAAAAATGT
-TTCTTTGAAAATTTGAATTCCCGCCAAAATTTTTCTTTGAAAATTTGAAC
-TCTCGCCAAAATGTTTTTTTTTTGAAAATTTGAATTCCGATAAAAAACTT
-TTTACAGAGAATTTGAATTTCCCCCTACAATTTTCACAGATCTACTTATA
-TATATATATATATATATATATATAAGTTGAACTTTAGTTTTCAAAAAAAA
-ACCGGTCATTTATTAAAGCACGTGGTGTCAAAAAATATTTTTTCGGCTTG
-ATCTACGCCGATCTACAAAAAATGCGGGAGAAAAGACGCAGAGTTCTCAG
-TTGATTTCTCATGGTTAAGAAAATTCCCGCATTTTTTTGTAGATCAAACC
-GTAATGGGACAGCCTGGCACCACGTGCTAAAGTTATAGTTAATTTACAAG
-TCCTGGTTGGACCTGCAGGATGTCAGGCGCTGAAACGTGTTTCAGGATAA
-AGTTGGTAAACTTTTATAACCAAGAGGAAAGTGTTATCGATATTTTGCTA
-GTTGAACATTTTTTTTTGCTAAAAAGTAAGAGTATTTGAGCCAGGCGTGC
-GCGGCGATCGGTAATTTCCGAAAATCGGCAATTTCGGCAATTGCCGGTTT
-TGTGAATTTTTGGCAATCGGCAATTTTGGCAATTGCCGAAATTGCCAAAA
-ATTCGATTCCGCACACTCCTGCTTTGAACTGTGCATTTCCAAAATCCAAT
-AGAAATTCTGCCGACACTGTAAAATCCCTACCTGCCAACAATCCTCCGCC
-GGAGCTGATTGCCCTATTGAACAGGTGACTCTCGTTAGGGGATATTTGAA
-CATGTGGGACAATGATCACATTGTCCGACGAGCAGCACCCTTGGGATGAG
-GTCTCCTGATTCTCACTTGGCTGATCAGGAATGATTGCATGGCGACGGGA
-AAGTTGCTCCTTGTTAGGGTGAATTGTTTGGGGCTCTCCTTCTTCTGGCT
-GGAAAAATACAATTTTTTGAAGTTTTTGAAAGAAAGCTTGTCATTTTTTT
-GTTGCTATTTTTTACCCTAAAAATGTGGTTTCAAAATTTTTTTACCTCTG
-AATATCTAATCAACGGGGTGAACAACTGCAGATCGACCATACTCGAGCTT
-CTAAAAGTTTGAAGGAAGCTTCTCGTGAAGCACGAAAAAAAAAGAAACAC
-GAAATAGTTACCCTTACAATTATCAGAATAGGATGGGATGTACAGAGAAG
-TAAATAGGAAGAGAAATGAGAAGAGTTGCACTAGAGAAGTATGTACAATT
-AATAATTTATGAGCATCTGAGAAAATGAGAGCGACTTGAAAATCTGAAGA
-GCAAGGAAGATAAAACTCGGTCTCTTATCAGAAAATTTGAATTCCCGCCA
-AAATGTTTATTGTTTAATTTGAACTCCCGCCAAAACTTTTCACAACGAAT
-TTGAATTTTTCGCCAAAATTTTTCTCAGAGATTTTGAATTTTCCCGCCAA
-AAGTTTTACCAGAAAATTAAAATTCCCGCCAAAACTTTTCACATCGAATT
-TGAATAACCCGGCAATTTTTTTATCAGAAAGTTTGAAATCCCGCCAAAAT
-TTTTCACATGAAATTTGAATCTTTCGCCAAAGATTAAAATCGTTGGATAA
-TTTTAATTCGCGGCTGAACGTTTCCAATTCGAATTAAGACCGGCCAAAGT
-TTTTCGGGGTTTTTTTTAAAACTTACTACAAAAAAGCATACATTTATTTT
-CCTAACTAGACGCCTTACTAGGTAAAACCCGCTTTTCACATCAAAAACTT
-CAACAATGCGTCACCGCCAAAAGAGATTCTTGCACTTCACCACGAATAAT
-AGATCAGAAGGAAAAGCGTGTAGTGAGTTGAGAATTATAACTAATTCATA
-TCCCCCGAAAAAAAAAACGCTGATGTCTATATTCTATACATGGTGAGAGC
-TCACCGAAGAATAGACGGGTAATGAGATATATATGTGATACATAAATGTG
-TGCGCCCGGGTATCCGAGAGCCGAAAACAGAAGCATGGAATGGAGCAACT
-AGGGAAAATTGTGTTATCACGAGGCACGGCGGGAGACACAATAATATGAT
-TTTTTTTCGAAAATTTTCCATTTTCACGTGGTTGTCCCATTACGATTTGA
-TCTACCAAAAACGCGGGAATTTTTCGCCTAAAAAAATGTAACGTCAGCAC
-GTTGTTTACCATGAGAAATCAGTTGAGAAATTAGCGTCTCTTCTCCCGCA
-TTTTTTGTAGATCTAACTTGATCAAGCCGAAATGAGACGCTCTGACACCA
-CGTGACGAAAAAAAGTAGATCAAAATTTGGCAAGCCCTTATAAAAGTCCC
-TTTTTCAGTTCTAGGCGGAGCTCAGTTTGACTGATGACGTAAACGCAAAT
-CTTGAAATTTCGAATTCTCTATGGAAATTAGAACTTCCCGCCGCCGCCAG
-ACTTTGTAAAGTTCAACAAAAAGATGAAATATAGAAAAAGTTCAGACTAT
-GATAAGGAACTTATGACTAACGTCTCTTGAGGTGAATGAGTATGATGTGA
-TTAGTGATGCAAGACGACTAGACCGAGAGAGAGAGAGAGAGAGGCTCAGA
-GAGGGGGGAGGGAAGGTAGGTTTGTAGGTAGGCAAGCAGGTAGGCAAATA
-GGGGGTCGTAAGTAGAAATTATGAAGGAACCTAGGTCGGCAGCCATAAGG
-TAGGCATAAAGTAGGTCAGCATCCAAGTAAGTTAGACAGGTACGCATAAG
-ATAGGAAGGTAAGTAGGCGCGGTGGCAAGGAGACTCAAGGCAAAGTAGGA
-CAGGAAGTAGGCAGTAGGTAGGCACGATGAAGGTAGGTGGGTAAGCTTGT
-AAGAAGGCAGCCATAAAGTATGAACGTCGACAGTAGGCATGCATTTAGTA
-GGTAGGTATGAAATAAGAATTAAGGTATGCATAAGGAAGTAAAGTATGAA
-TGATGAAGCCATGTAGATACAGAAATATCAGGCAAGTAGACAGGCAGGCA
-TAATATAGGAAAGTTAGCAGTAGGTAAGCATGTAGTAGGTACGTGGGTAG
-GCATGTAGGTAGGCACGTGGTAGGCTTATGGTAAGCAGAACACAAGCACA
-GAAATATGCATATTGGCAAGTATGTAGGCATGCATAAGATACAAAAGTCG
-ACCAGGCATGTAAGTAGGCACATAGGTAGGCAGGCTTGAGGCAGCAATGT
-AGGTGATCTCGTAAGTAGGTATGAGTAAGGAACCTAGGTAAGTCACAGGT
-ATTTGGCACAACCTGTGTTCTTCTCAATGGTAATCAGGCGAACGTGCCTG
-CCTGCCTACCTAGAAATTCGGTAAAAATTGTGGAAAAAAAACTAGGGGAA
-CCTCTTCCCAATGGAATGCGTAATGTGAGTGGGAGGCGGCAAAAAAAGAG
-CGGACGTAAACACTTTTTCCTAATTCTCTTTTTCTCTCGCTCGTGGAAAA
-TGAATGAATATTTGATACAATTTTGTGGGTACAGCCAGCAGGAGAAGAAG
-AAGCTGATGTCCCGACGCGCGCGCGCGAAAAAAACTTTCAATTCCCTCCC
-CTAATTATCCGCCTAACGCCTAATGTGTGTCAAATTTACCATGTATTTTT
-TTCTCCTCTCGGCTATGTTTTTTTTTCTTTTTCAGCAAAAAAAAGTACGG
-GCACATGAGGTCGGGATGGATAATTAGGGATGTGTGCCAATTTGTTGGAT
-AATAGACAAAAAAAGTACGTGAGATTTTTAGAAAATGCTGAGAAAAATAT
-CACGAGGCGTTGGGGACGTGGCCGCGAATGAGAAAACTAGGCCACCTTCA
-CAGGGCCCTGGCCTTCCTCATTGAACTTTTCGCGCTCTACTGACAAACGC
-CCGTGTACTCCACACGGACAAATGCATTTAGTTTTGCAGCTAGAATCGAT
-CAGCGACGCGACACGCAACGCGCCGTAAATCTACCCCAGATATGGCCGAG
-CCAAAATGGCCTTGTTCGGCAAACTCTTCCATTTCAAATTTTTTATTCAG
-TTTAATTTTCTAGGATACGCCTACGAGTGATCTAGGCCAGGCAGTAGGTA
-GGCAGCCAGTGTAGGTAGCCCCCTTTTGGTGTCAGGCTGTCCCATCGCGG
-TTTGATCTATCAAAAATATGGGAACTTTTCTCCCAGTAAAATGTGACGTC
-AGCACGTTCTTAATCAGGCGAAATCAGTTGAAAAGTCTGCGTCTCCTCTC
-CCGCATTTTTTGTAGATCAACGTAGATAAATACGAAATCAGACACTCACG
-TGGTGCCAGGCTGTCCCATCGCGGTTTGATCTACAAAAAATGCGGGAACT
-TGTGCCCAAAATTATGAGACGTCAGCACGTTCTTAATCAGGCGAAATCAG
-TTGAAAAGTCTGCGTCTCTTCTCCCGCATTTTTTGTAGATCAAAGTAGAT
-CAATCCACATTAAGACCTTCTGACACCATGCCCGAGAAGAGTTCAAAATA
-AATTTCGTAGAACATAAATTTTTCCACGTGGATTTTACAGCACAATTGCT
-TATAGAGCGCGGTTGCACCCCAAATTTTACAGGAAAAATAGGAAAATTTT
-ACCAGATTTCCCGCGCAAGACACGAAACAAGGTCTTAAAAAGTGGGAGAG
-CATGAAAAATCCTAAGAAAGTAAGAAACTTCTGGTTTACCACATAACTCA
-AATTGGAGATAGTTCGACCTTAAAAATTTTGCACCAAAAAGGGCGGAGCC
-AAAAACACCAAAACTTACGTGCAAATTTGTACATGAAAAAACTAAAAAGG
-ACACCTAAAACCGGCGAAATATGAAGAAAAACGCTGAAAATGAGCAATGT
-GTATCAATTTTTCCCCCGTTGCTTAATTTAATACATGTCTTCCTCTCCCC
-CTTCCTTCCTGCTTCACACTCTTTCGGGCGGCGCCTCCTTTTGATTTGAG
-ACTTGAGACTTTTTTTTTTGTGATGTGCGTTGAGTAGTGTGGGATGCATA
-TATTATGAATCAAAAATCTGACATCAAAAATATCGCTGAAAAAATAGTTA
-AAATTTGCTTTAAAACTGCCGTTTTTGATCTACAGGGTGCTTTGGCGCGT
-TGCGGTCGCGTCGCGGCTTGGAGTTCTAGGCCACGGCCATTCAATTTGAC
-ACTACTACAATCAGAAATATTTTGTAATTCTTAGGCCATCAAAAAATTTT
-TAAGCCAGAAAACAAATCCGGAAATTTCTAGGCCATCAAGAATTTCTAGG
-CCACATCAGACTACTTTGAAAATTTCTAGGCCACAATGGGAACTAATTTC
-TGAACCTAATTTCTGAAATTTCTTGGCCACGATCTGAAATTTCGAAGCCA
-TAATTTGAAATTTCTAGGCCACGATCTGAAATTTCTAGACCATCAACAAT
-TTCTAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAATTTGTAGGT
-CAAGGTTTGAAATTTCTAAGCCACGATTTGAAATTTCTAGGCCACGATCT
-GAAATTTTTAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAATTTT
-TAGGCCACGATCTGAAGTTTTTAGGTCATCAAAAATTTCTAGGCCACGAT
-TTGAAATTTCTAGGCCACGATCTGAAATTTCTAGGCCACGATTTGAAATT
-TCTAGGCCACGATTTGAAATTTTTAGGCCACGATCTGAAATTTCTAGGCC
-ATCAAAAATTTATAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAA
-TTTCTGGGCCACGATCTGAAATTTCTAGGTCATCAAAAATTTCTAGGCCA
-CGATTTGAAATTTCTAGGCCACGATTTGAAATTTCTAGGCCGCGATCTGA
-AATTTCTAAGCCATCAAAAATTTCTAGGCCACGATTTGAAATTTCTAGGC
-CGCGATCTGAAATTTCTAAGCCATCAAAAATTTCTAGGCCACGTTTTAAA
-ATTTTTAAAATGTTTAAAATTATAGGTTTTCAAAAAAATTCTAGGCCATC
-AAAAATTTCTAGGCCACGATTTGAAATTTCTAGGCCACGATCTGAAATTT
-CTAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAATTTTTAGACCA
-CGATCTGAAATTTCTAGGCCATCAAAAATTTATAGGCCACGATTTGAAAT
-TTCTAGGCCACGATTTGAAATTTCTGGGCCACGATCTGAAATTTCTAGGT
-CATCAAAAATTTCTAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAA
-ATTTCTAGGCCGCGATCTGAAATTTCTAAGCCATCAAAAATTTCTAGGCC
-ACGTTTTAAAATTTTTAAAATGTTTAAAATTATAGGTTTTCAAAAAAATT
-CTAGGCCATCAAAAATTTCTAGGCCACGATTTGAAATTTCTAGGCCACGA
-TCTGAACTTTCTAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAAT
-TTTTAGGCCACGATCTGAAATTTCTAGGCCATCAAAAATTTATAGGCCAC
-GATTTGAAATTTCTAGGCCACGATTTGAAATTTTTAGGCCACGATCTGAA
-ATTTCTAGGTCATCAAAAATTTATAGGCCACGATTTGAAATTTCTAGGCC
-ACGATTTGAAATTTCTAGGCCACGATTTGAAATTTCTGGGCCACGATCTG
-AAATTTCTAGGTCATCAAAAATTTCTAGGCCACGATTTGAAATTTCTAGG
-CCGCGATTTGAAATTTCTAGGCCGCGATCTGAAATTTCTAAGCCATCAAA
-AATTTCTAGGCCACGTTTTAAAATTTTTAAAATGTTCAAAATTATAGGTT
-TTCAAAAAAATTCTAGGCCATCAAAAATTTCTAGGCCACGATTTGAAATT
-TCTAGGCCACGATTTGAAATTTTTAGGCCACGATCTGAAATTTCTAGGCC
-ATCAAAAATTTATAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAA
-TTTCTGGGCCACGATCTGAAATTTATAGGTCATCAAAAATTTCTAGGCCA
-CGATTTGAAATTTCTAGGCCACGATTTGAAATTTCTAGGCCGCGATCTGA
-AATTTCTAAGCCATCAAAAATTTCTAGGCCACGATTTGAAATTTCTAGGC
-CACGATTTGAAATTTCTAGGTCACGATTTGAAATTTCTAGGCCACGATTT
-GAAATTTATAGGCCGTGATCTGAAAGTTCTAGGTCATCAAAAATTTCTAG
-GCCACGATTTAAAATTTCTAGTCCATCAATAATTTCTAGGCCACCAGAAA
-ATTTGTGTTCACTTTTTTTTTTGGTTTTTGGTATGTATTTTTCAGAAATT
-ATTCAAAATTTGTGGGAGCAACAATATGCTTTTTTAGTTTCTAGGCCACA
-AAATTCTTTGGCCATTTTCACATTTTTTCCCGCCGCCAATGGTTCCACTG
-GATAATTGAATGTATAGAAAAAAGGGAAGAGTTCAGCTGGCGCAAAAGAG
-GGTAATTCGTTGGAAGGGAAAAAAATAAATGCAAATCTTCGCCAAAAACC
-AATTTTCGGTCGGAGCTCGGCGCGGGCCGACACACACAAAAATGGAGCAG
-AAGAAGACGTCAGAATCTTCTTTTTCAGAAGGCTTTCTCACTTTGAAAAT
-GGGGTGTCCAATTTCTTGTTGCTAATTGTTGGATGGGGAAAGAATGATAT
-TTTGTTTCAGGTTTCACACAACATCAGCCTAGACATTTTTTTTTTGTTTT
-CTCCAAGAGGAGTACACACACTATAAATTGTTGTAAAAATCGAAAAACAC
-GTGGAGCCAGAATTTCTTATTTCGATTTGATCTACAAAAAATGCGGGAGT
-TAAAACGCAGACATCTCACCTGATTTCGCAAGAGCGTGCTGACGTCACAA
-TTTTTTTGGAAAAATATTTCCGCATTTTTTGTAGATCAAACTGCAATAAG
-ACAGCCTGGCACCACGTGAAAAATAGTATTCCTCTTGAAAAAGATTTCCC
-GAATCAAGTTCCTTGAAAGGAGTACGCAAAATTTTGCAAAAAAAATCGGT
-GGCCGAGTTTACTCTTCTGGCGGCCACGTAACAAAATTAACAAGGAAGGA
-TAAAAAGGAAAAAAAAATTTTACTCGTAAAAAGGTACCAGGAAGCAATTT
-GAGGAAGGAAGGAAATGTGAGTGTCTACTCTAATGATCTACCAGTTTTGG
-TGGCCGCGGAACAGAGAAAGCTCGGCCCCCAAGTATTTTTTCAAATATCA
-CGGATTTCTGGTTTCCCTTATAAGTTGAAATGGAAGAGTTTTTAAAGAAC
-GAACTAGGCCATTTTAGCTCGGCTGGGGCAGATTCACGGCGCGTTGCGTG
-TCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAATATATTTGTCCGTGT
-GGAGTACACGACTTTCCCACGAGTTTTCCGACAGGCGATTGTCAATGGAG
-CGCGAAAAATTCAATGAGGAAGGCCAGAAACCCGTGAGATATTTAAAAAA
-TATTCCAAAACTATTTTTATATTCAAAATTGGAAATTATACATACTATAA
-GTATTTTCAACTACATACATGGCCGCGAAAAAAAAAAACTCGGCCACCAA
-TTTTCGCGGTCACTTACCGCAGATCTCCATCGATCCTGAAGTCTTGCCGT
-ATACAATAAGGGCATTTTTCGGATCATAGTGAATGAATTATTTCAGGAAT
-ATTATTTCAAAGAACACACACCACACAAGAAATGTGAAGGGAAGGAAACG
-GGGAAAAAGAGACAGGTGGAAAAATACATTTTCTCTATTATTTCGCTCTG
-TTTCTGACTAGGAAATGAATCAGAATCAGTGATTAAGAAACTGGGAATTT
-ACGAGGTGTTTAGGGAGATGGTGACCGCGAGGATGAGGAAAAACTCGGCC
-ACCGCAAGACTTACCGGCTTAATCAATTGATTTCCTCGTATGTGATGGAA
-CAATGTGAGAGCCGGAGCTTCACTCGTCATAGCTTTGTGTCTAGGTGGCT
-CTCAAGTACTGCTGGACCTGAAAAACTGCAAATTTAATTTGAAATTTGGG
-ATGCAAAAAAGTAGCAGCCGACACCTGCCGGGTTCCCGCAAGATGTCGGA
-TGCTTCAATTGACCTAGTAGAATCGTTAGTGATCTACCGAGCAAAAACAA
-GTATGCTTGCAAGAAAAAAAGGCGTGTGGCTCAAGTTGACAAATTCGACA
-CTTTGGACACACGAAATTGGATGAGCCACACCACACCGGCTAGCTCAGAA
-GAGCCCCTCCGACGTCAAGGACCCCATGTGCGCGCGCGAGCCGAGATTCT
-GGCAACATGAGAAGCGGAGAAGGCGAAGAGAAGAGTGCTAATTTGAACTT
-GTTGCTGCAGGAAAAATATCTAGGCTTAGGCTTAAGCTTGGGCTTAGGCT
-TAGACTTATGCTCAGGCTTAGGCTTAGGATCAGGCTTAGGCTCAGGCTTA
-GGCTCAGGCTTAGGCTCAGGCTTAGGCTCAGGCTTAGGCTCAGGCTTAGA
-ATTGGGCTTCGGCTTCGGCTTTGGCTTGGCTTAAGCTTAGGCTTAGGCTC
-AGGCTTAGAATTGGGCTTAGGCTCAGGCTTAGAATTGGGCTTAGGCTCAG
-GCTTAGAATTGGGCTTAGGCTTTGGCGTAGGCTCAGGCTTAAGCTCAGCC
-TTAGGCTTTGGCGTAGGCTTAGGCGTAGGCTTAGATTTAGGTTTAGGCTT
-AGGCCTTGGCCTAGGCACAGGCCAAGGTTTCAGGTCACTATCACTTGCTC
-CTAGGTGTGGCTGGGGAAATGAAATTCTAGGCCAGTGACGTCAAGATTCT
-GGAAGAGTTCCGTTGACGCCACCAAAAGCAACAAAAACTTCAAATCTGAG
-AAGATCAGAACAAAATGTACTGAAAGTACAAAAAGCCCGCACTTTTTTCT
-CTATTAATACTACTCATTTGAAGAGTGGGGAAAAGAAAAATGTGTTGCAA
-GAAATAATTCCGTGCGAAAAAAGTTTGAGAGGAATGAATGGAGCGGAACT
-TTTTTTTTTGTTGGAAAATCGTAGGTGTGACGTCACTTCTCTTCCAACCC
-CCAGGTTTCTAGGCCACTTAAGAATTTTGCAAAAAAATCACAGAGCAAAA
-CTACAAAAAGGAAAGAAGAAATGTGCTCTTGGAAAATAATAAATATTGGT
-TACGAAATAAAAGAGAAAAGAGAACGAAAAAAATAAAAAAGAAAATGGTA
-ACCAAGGAGGAATGTGGAGAAGAGGCTCTTGTGAGCCCAGATATACCCAG
-CAATTAGGGAGCGAGTACTACTGCCGGGAGATGACGTTTCGAGGATATTT
-CTCACTGGAATGGAGGGTGGTGGAAGAGTTTTGTAAAGTTCTAGGCCACG
-GGTTTTTTTGGCCAATGAGCATGGTGCATCGATGAAAAGCTATTGGGTTT
-CTCGGCCACAATAAATTACAAAAACCTAGTACGATGGAGCACACTTGCAA
-TAGAATTGCAAAAATTTATTTGAAAATTGAGAAGAAAGAAAATCAGGGGG
-GCATAAATGCTCAACAGTGCAATCAAATTGTAGAAGAGCTTTCGCCCAAA
-AAGCTAGGCCACGGAGGAGACCGCTGGAGAAAGTGACGTGTATATGGTGG
-AAGAGTTTTCTTGTTTTTCTAGGCAATCTTGGGCGATTGCAAAAATTGAA
-TTTATGAAAAGATGGCTTGGAAGAGCTTTCGCATAGAAAATCTAGGCCAC
-GGCTAGCAATTTAATAGGGGATAGAAAACCGCGTCGGAAGATTATTTAAC
-TTTTCCATAAAAATTAGCAAATTTAAGAGAGTTCAGATACTGATCTGGAA
-GAGTTTTTGAGCAAAAAACCTTGGTCACGGCCAGCAACTAAAGTAGTAGG
-GGAGATAGGGTACCCCGCTAATTTTTTATTTATTTTTCAAAGAAAGTTTT
-AAGGTTTCGGGAAAAATTTTGATGAAATGGCTTGGAAGAGCTTTTGCCGA
-AAAAACTTAGGCCACGGCCAGCAATCTAATGAGAGGGGGAGGGTTCCCCG
-CTAAATTTTTTTTTTGATTTTTAAACAAAGTTTCATGGGTTCGGGGGAAA
-ATTTGATTAATTGACTTGGAAGAGTTTTTAAGCAAAAAAAAACCTAGGCC
-ACGGCCAGCACCCTAATGAGAGGGGGGAACATAAGGTACCCCGCTATTTT
-TTTTTGATTTTTCAAAGAAAGTTTTAAGGTTTTGGAGGAAATTTGATTAC
-ATGACTTGGAAGAGCTTTTGCAGAAAAAAACTTAGGCCACGGCCAGCAAC
-CTAAAGTAGTATGGGAGATAGGGTACCCCGCGGAAAATTTTTAAATTTTG
-GTAAACAACAATGGAAGAATTTTCCGGTTTTCTAAGCCATTGCATTTTTT
-CAGCGTCACGGATTTCTGGCTTCCCTCATAAATTGAAATGGAAGAATTTG
-CCGAACTAGGCCATATCTGGGGTAGATTTACGGTGCGTTGCGTGTCGCGT
-CGCGGCTCGATTTTAGTTGCAAAACTAAATGTATTTGTCCGTGTGGAGTA
-CACGACTTTCCCAGGAAGGTGATTGTCAATGAAGCGCAAAAAATTCTCAA
-AAAAAATCCAGATTCCCGTGCAGCGTCGCAGGAGATCATTTTCAAGAAAT
-CTGGCTCAAGAAGGATTCAGTAAAACAAGAAAAGAAATAAAAAAGGAATG
-AAAGGTAAGGGTGGACAAGTCGGCGGGACAACTTGTCACTTGCCATCATC
-ATCATTTTTCTTCTCCTCCTCATCAGCTTCTGCTGCTCCGCGAGCTCGCG
-ATGACTCTTCTGAAATTCTAAACTTGGCCAACACAACGTCGGCAACGAGT
-TTCGAATTTACACACACACACACATACGAAAAAAGCTCATTAATTGGAGC
-AGGAGACGGAAGAGAGGGAGGAGAGGCTGCTCAATGAGTTAGAGAAGAGA
-GAGAGAGAGAGAGACTGAAAGATGAAGTATAAGCAGAAGTCGTCGGGATG
-ACAGAAGAAGGAGGAGAAGAAAACGTGAGAAGGGGGGATGTGGAGACAGA
-AGGATATGTAAATATATTAGATTCAAGGATTACAGCAATTTTAAGGAGGC
-AAAAAAAAACAACGATGCTCCGATATTTTTGGGGTTACTGTAGTTTTTGT
-AGATACTTCCAGAAGTTATAAACAAATCCGAGTTTTTTAAAATTTGCCAG
-AAGCACGGGTTCATTGAATTTTTCACGCTCCATTGACAATCGCCTGCCGG
-ACAACGCGTGGGAAAGTCGTGTACTCCGCACGGACAAATACATTTAGTTT
-TACAACTAAAATCGAGCCGCGACGCGACACGCAACGCGTCGTAAATCTAC
-ATATATGGCCGAGCCAAAATGGCCTAGTTCGGCAAAAACTCTTCCATTTC
-AATTTATGATGGAAGCCAGAAATCCGTGCAGAAGTTTCTCGGAAAAAAAA
-CAGAAAGTTTGCGAAATGGCAACCTCTAATTCATTAACATAAATACATCA
-AATATGACGCGCAAAAATGAATTAATTTACTAGTGAAACATGGTGCATTG
-AAGTCGGTGTTTGCACAATTTGTACAGATCTGAGGTTCACTAACACCAAT
-GCACGGCCCGAGAAGTGGTACCTGTACGCAATTTGTCTACCGTATACCTG
-GACGTTTGGGCGCGTGTATCTCAAAAACGGTTGGTCCAGTTTTTTTGTGA
-TGCATATAAAAAATGTCCGAAATTAAATTCTAAATTTTTTGGACCAAAGC
-TTTTTTCGTTATCACGCGCCCAAACCTGGTCTACACTCAAATTATCAGTA
-GAGCGCATTTGCATGGATGTACCACTTGCCGGGCCGTGTTCAAAGGGGTG
-CAACGATTGCGCGTCAAATCGAATGCAACTACAGTAATCCCTAGTAGTTG
-CGCTTCAAATTTGATGCATTGCACGGCCCGGCAAGTGGTACATCCATGCA
-AATGCGCTCTACTGATAATTTGAGTGTAGACCAGGTTTGGGCGCGTGATA
-ACGAAAAAAGCTTTGGTCCAAAAAATTTAGAATTTAATTTCGGACATTTT
-TTATATGCATCACAAAAAAACTGGACCAACCGTTTTTGAGATACACGCGC
-CCAAACGTCCAGGTATACGGTAGACAAATTGCGTACAGGTACCACTTCTC
-GGGCCGTGTTGAATGTTTGAGAAATGTTAAAATTTTGAGTTATATGTGCT
-GGAAAATTGACATGAACATGGTTTTTTTCATTATTTGCGCGTGAATTATG
-GTGCATTGAAGTCGGTGTTTGCACAATTTTTTTCAGATCTGAGGTCAACT
-GACACCAAAGCAACAGAGTTGACGCGCAAATTTTAAAATGCGCTTAACAT
-TTGGCACGCTTTGCAGTCGGTGTTTGCACATTTTCGATTGTTGTGTGAGG
-TTCACCGACACACCAGATTTGACGCGCAAAATTGTACGAAAACAGTTAGT
-TAGAAAACTAATAAAAACTATTAATAAAAGTATAGTGCATCCTGAAAAAT
-TATTTCTGCAAATGTATCTATAGAATTTAAAACAAAATATACAAAAAAAA
-ATTATGAAAACCACGACGAAAAACCCGGAAATGTTTTTTGGGTAGCTTGT
-CGATTCCGGAGGGTATTGAATTTCGCGCTCGAATAATATTGTTTCCTATT
-CATTTTCCCCAGAATACCTACAGAATTTGGGGGAAAAATATGAACTGGTA
-CCTAACATTAACCTACACGTTTTTTAAATAAGTTTAGGCCACGCCCAGAA
-AGTAGCTGGGCGGGGTTGCAGATTTTTCTAGCTTTCCGAAATATAAAAAG
-TCGGAAAAAAAGTTGTAGTCTGTAGTTTGTAGTTTGTAGTTTGTATCAGG
-TTGTCCCATAAGTTTTTGTACTTTTTTTCAAATATTTTTCCAAAACTTCT
-AGAAAGTTTTAAAATTTTTTCATCGTAGGTCGTGTCAAGGTCGGGTCGTC
-CCCTTTCAGAAAAGATTCATTTCATCCATTTCTACTTTGCCACGATGACA
-ATCATCAAACTTGAACGTCGAGACGTTAGATTGCTTCTTCTTTATGAATT
-TCGTCTTGGTCATTCAGCAATGGAAGCGGAACGAAACATATGCGGTGCGA
-TGGGTGAGGGAGCACTCTCTTATAATACAGCAAAGAGTTGGTTTCAAAAG
-TTCAAGAACGGCGACTTCAGTCTCGAAGAAATAGAACGTTCTGGGCGACC
-GGTAGAGTTAAATGAAGAAGACCTAGTGAAGCTGGTGGAGGAAGAGCCTC
-GTCTTAGTCTTCGTGAAATGGAAGAGAAGCTTGAGTGTTGTCATAGCACA
-ATTGCACGTCACTTGGGTCGCCTTGGTTTTACTTCAAAACTTGGAACTTG
-GGTGCCTCATGAACTTTCGGCATCACAGAAGCTCACTCGGGTCAACGTTT
-GTACTCAACTTCTAACTTTTCGTCGAAAGTTCGATTGGCTGAACAATCTG
-GTTACTGGAGATGAGAAGTGGGTGCTCTATGTTAACCATTCCAGAAAACG
-TCAATGGCTTCCGATCGGTGAGAAAGGAATACCGACGCCAAAGCCTGATC
-TTCACCCAAAAAAGATTATGATCTGTGTCTGGTGGGGTGTTCAAGGACCC
-GTGCACTGGGAATTGTTGCCAACTAATAAAACTATCACTGCTGATTACTA
-TTGTGCCCAATTGGACCGAGTTGCAGAAAAGACCAACGGAAAATATGAAA
-AACTATATTTTCTTCACGATAATGCTAGGCCTCATGTCGCCAAGAAGACT
-TTCCAAAAGCTGCAAGATCTTGGTTGGACTGTTTTACCGCATCCACCATA
-TTCTCCAGATCTTGCACCAACCGACTACCATTTGTTCTTGTCTCTCAGTG
-ACTACATGCGCGACAAGCAATTCGACGACGAAGAGCATCTCAAAACTGAA
-CTCTCCACTTTCTTCTCATCGCGTTCGCCGGATTTCTTCTCCCGTGGCAT
-CATGATGTTACCTAGTAAATGGCAACAAGTGGTGGACACTAATGGTGAAT
-ACTTGTGTGAATAGTACTACTTGTCGCTTGAGAGAAATAAATTTTTTTCA
-AAAAAAAAATAGTACAAAAACTTATGGGACAACCTGATAGTTTTAGTTCG
-TTATTTGCAAATTGTTAACGTTAGTATTAGGAGAGCCGAAATAAATAAAT
-TTTAGAAAAGAAAACGAAATTATATACATAGTTCATTAAAATGTGGTAGT
-TTGTAGTTTGTAGTCTATGTATTATGTCTATTCAAATTGTATTCAACATC
-AAAAATTAAACAGGAAACTTATATTTAAAAAAAAAACGAATACTGAAAAA
-AGGCGGCTGCATAGGAAAAAACAATGATTCTCCTCCAAAAAATAGAATTC
-CGCATTTTTTCAGCGGCTATTTTCACGATGATGAGAGGAGACAACAAAAA
-CATTTGAGATGAGAAATGAGGGGAATATTGCACAAAAATTGGGAAATGAT
-TTTTTTTACTTTATACACAGTTAAAATGCGATGCGCGCATAGTGTTTTTG
-GCGTGGATCGCGAGTGGGAGAAAAAGGAACCGGAAATGATGCGCATTGTG
-CGTCCATCGCGAATTTGAGATGCATTGTGCGAGCATCGCGAACATAAATA
-ATGGGCACATTGTGGATTCTCCTTTCTGATAATATTTTACTCTCTATGGC
-TTCACCAATTATCTTTCTCTCTGTGGCTTCCCACTATATTTTACTCTCTG
-TGGCTTCACCAATTATTTTACTCTCTGTGGCTTCCCACTATATTTTACTC
-TCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCACCAATTATTTT
-ACTCTCTGTGGCTTCCCACTATATTTTACTCTCTATGGCTTCCCACTATA
-TTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCAC
-TATATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTC
-ACCAACTATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGG
-CTTCCCACTATATTTTACTCTCTGTGGCTTCACCAACTATTTTACTCTCT
-GTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTATATTTTACT
-CTCTGTGGCTTCACCAACTATTTTACTCTCTGTGGCTTCCCACTATATTT
-TACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTAT
-ATTTTACTCTCTGTGGCTTCACCAACTATTTTACTCTCTGTGGCTTCCCA
-CTATATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTT
-CACCAACTATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTG
-GCTTCACCAACTATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTC
-TGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCACCAACTATTTTAC
-TCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTATATT
-TTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCACCAAC
-TATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCC
-ACTATATTTTACTCTCTGTGGCTTCACCAACTATTTTACTCTCTGTGGCT
-TCCCACTATATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGT
-GGCTTCCCACTATATTTTACTCTCTGTGGCTTCACCAACTATTTTACTCT
-CTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTATATTTTA
-CTCTCTGTGGCTTCACCAACTATTTTACTCTCTGTGGCTTCCCACTATAT
-TTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACT
-ATATTTTGCTCTCTGTGGCTTCCCTCTATATTTTACTCTCTGGCTTCACA
-GTATATTTTATTCTCTGGCATCACAATATATTTTACTCTTTGGCTTCGCA
-GAATATTTTACACTCTGGCTTCACAGAATATTTTACTCTCTGGCTTCGCA
-GAATATTTTACTCTCTGGCTTCGCAGAATATTTTACTTTTTGGCTTCACA
-GAATATTTTACTATCTATTAATCTATTTCTTCGTATAACAATCTATTTTT
-TCGTATAACAATCTATTTTTTGTATAACCAACTTCAAACTCAACTTTTCC
-AAAACTACAGTAACCCTACAGTAATTCTACAGTACTCCTAAAACTCCCCG
-CAACCTGCAGTTCAATGACACCTCGTTTTCTCACGCGTGACTCATGACTC
-ATTAGCTTACATTTCCTTCATCCATCGGTGGTGGGGCGCTGTGTAATATA
-CAAGAAGAGACACCACCACACGCTGCTATTTCTGCTGCTGGTCTGTCTTC
-GTTTACAGCCACTTATGACTCAGCACTGCCATCAATGACTACTTCCTTCT
-TTTTTATCTTTTCGGCTTCATCTCGAGTAGCAAATTTAACAAAATTCAAT
-AGGTGTGACGTCATCAAATGCCTTCGTGGCCTAGAAATCCAAGATTTCTC
-TCGAAAGGATCAATGTGATGTCATGGCCTAGAAAACTCCAGTGTGAAACC
-TAGGCTATGTTAAATAGTCTTGAAAACTCTAAACTGAAGCACATAAGGCT
-ATGATGTCATCGCCTAGAAATCCCAATTCTATGACGTCATGAAAGACCTG
-AACTGCACCGAACCTAGGAATACCCTCAAAAGGGGTGCTGTGAAGTCATG
-TCCTAGAAAACATGAGTGCGAAAACTAGGCCGTAATCTACCATGTGGTAG
-ATCATGCGGCCCTATTGATGGCCTAGAAAACTTACAGCTTGAAGCTATGA
-CGTCACGACCTAGAAACTCAATAGTTGTGACGTCATCAATGACCTAGGTG
-TATCTCGAATGACGCAGTGTCTTCTAGAATTTTCTGAATATCACACAAAA
-GTATAACATCTTCTTGAAACCAAATAATTTTGTTGTAACACCCACACAGT
-ATTGTAACAAATGATATAATAGCGATCGGAACATTCGAGAAAACTGGAAA
-TTTGAGGTCTGACCTTGTTCGGGAAACTTACCAGTGATTATGAGGTGTGT
-CGAAAAATGTGGCCTAGAAAATGGGAAAACTCTTCCTTTTTTTTTTTAAG
-TCCAGAATTACGTTTTTGAGAACGAGAAGTGCATTTCATTTTTGTTAGGT
-TGGAAATTTAAAATTTAAATATTCGTCTCCTAGTTACAGCCGTGGAAGAC
-TTTTTCAGAAACTTTAGCCACGTGTCGAAGTCTGGCGGTGCCCACGATAT
-TAGAGAATGTTGATATTTCCTATTTACTTATCTCCTCGAAATTTTAAGAT
-TAAAGTTACTACCGTTAAGTTACACTGGTGGAAGAGTTTTTAAGATTTCT
-AGGCCACGGCAAAGTTTGGGTGTGCCAGTGACCCTAACACTAAATTTTTA
-AATTTTTTTCAGCCAAATCATCATATGGTGGCCTAGAAAATTTAACACCT
-GAAAACTCTTCCATATTTTTTTAATTTCTGAAATCCAACAAAATAATTTT
-CAAACTCCTCTTCCTTTTTTCCAGAAAAATAAATTAATGTAAATCAAGTT
-CATCTCCGATGAGTTGTAACGGTGGAAGAGTTTTTCAGATTCCTAGGCCA
-CGTCAAAGTTTGAGGGCTTCCCGTGACCCTAACACTAAATTTTCCAATTT
-TTTCAGCCAACCCAAATCAGAAGCTTTCTCTTTGTGTAATAACATGACAA
-TGGGCTATTATCATATGAAATTTTTTAGGTTAAATTTCTGAGGTCATTTG
-CAAAGGTGTCATGACTAGTTTGGAGGCTTTTTTGTGACGGTAGGGGTATG
-AAACAGGTTGTTACTTCTCGAAAAGGTATTATGTGGGGGAGAGGAGAAGG
-AAAGAAGGAAGGCAGATTAGCCAACAGAGATACAGCAAATTTTGTGTGAG
-TGGTGGCAGTTTTGAGAAGAAGCCATGCGCCAAGGTCGGTTTGCCTTCTG
-TTTTCTCATTTTTCGGTTTTTTTGTGAATTTTTGTAAATTAAAAATATTT
-TTTTATAGAAATAAAAATTCAGAAAAAAATACTGGAAGTTTCGTTTGCCT
-TCAAACATTTTTTAAAAATTCACAGTTTTTCAAATAGATGTACTTACACG
-TGGTGTCAGAGTATCTCATTTCGGCTTGATCTACAAAAAATGCGGGAATC
-TTTTGCCCAAAAAAATGTGACGTCAGCACGCTCTTAACCATGCGAAATCA
-GTTGAGAACTCTGCGTCTCTCCTCCCGCATTTTCTGTAGATCAGCGTAGA
-TCAAGCCGAAACGAGACACTCTGGCACCATTTTATTTTTTTGGGCAAAAA
-ATTCCCGCATTTTTTGTAGATCAAGCCGTAATGGGGCAGCCTAGCCCCAC
-GTGCACTTATTCCTTATGCCGAACGACACTCCGATATCCCGTTTTTACAG
-TATGACTGTGGGTTACTGTACCATTTTTGGTGCTTTTGTAATATTGTTTT
-CTTTTTCAAAAACCTAGGAAAAATTTGAACAATTGTTTTTTTTTAATATT
-TGAATTTTTTAGGCTCCCACACATTTTTGCGGGATATCGGAGTATCGATG
-TAAACGTTTTTTTTTTGGTTTTTTGTATTAAAAAGGGTTTAAGTGTTGTA
-ATAAGACATTTTGAATAAAAAATAGCTAGCGCCGCCACGACTTACTGGCT
-TCCCTCCTAAATAAAAATGGAAGAGTTTTTGCCGAACTAGGCCATTTTGG
-CTCGGCCGTATCTGGGGTAGATTTACGGCGCGTTGCGTGCCGCGTCGCGG
-CTCGATTTTAGTTGTAAAACCTAATGTATTTGTTGTCCGTGTGGAGTACA
-CGACTTTTCCACGCGTTGTCCGGCAGGCGATTGTCAATGGAGCGCGAAAA
-ATTCAATGAGGAAGGCCAGGACACCGATTCAAAGATATAACGGCCCACAT
-TTCAACAGCGGTATATCGGAGTGTCGTTATTTTAAGCTTGCACACGGGCT
-TCTGGCCTTTTTCATTGCTTTTTCGCGCTCCATTGACAATCGCCTGCCGG
-GCAACGCGTGGGAAAGTCGTGTACTACACACGGACAATTTTTTTTAAGTT
-TTATAATGAAAACCGCGACGCGACACGCAACGCGCCGTAAGTCTACCCGG
-GCCGAGCCGACACGTGGTGTCAGAGTGTCACATTTCGGCTTGATCTACGT
-AGATCTACAAAGAATTTTGCATGATTAAGAACGTGCTGACGTCACACTTT
-TTTGGGCAAAAAATTCCCGCATTTTTTGTAGATCAAACCGTAATGGGACA
-GTCAAAATGGCCTAATTCGGCAAACTCTTACATTTCAAAATATGAGGGTA
-GGCAAAAGCATGGGGAATTTGTGATTAAATTTTTGAAAAAGGAAACAATT
-TTTTCCAAATTTCTTCTGAAATTTTTTCAAAAATAAATGTTTTTTTTCCC
-TAAAATCTTCAAATTTCTAGTTTCAATCTCTCACTACCGTGACCAAAAAT
-TCCTATGATTTTTGACCTCCCGCCACACAGTTTTACCACCAACTTCTTCC
-CCCCCCACCCACCCACTTACTTCTCGTATCTGAAACTCCGCCCCATTTTT
-CGTGTACTTTACTACTACTTGAATGATGATGAGGTAGAACAAATCTGTGT
-TTATTGGCAGAAGCAGTGGTAGCAACAGGAGAAGAAGAAGAAGCATCACT
-GTGTGGAACCAGCCAGCTGTGTTGTTGTGGTTTTAGTCGTGGAGAGAGAG
-AGGACGACGTCGTGTGTCTTCAATAAAATGAGGATCTCATCGCTCTTATT
-CCTGACTTTCTTGGCTGGAATTGTTCAGGTAAGCTGGGTTTTAAGTATTG
-ATATTGGTGCTATTTGAAAATTATTTCAAAAATTTTTGGAAAATTTTTTT
-TTTTTGGCCCAAAAATTTTTTTTCTAGAACTTTATCATTCCTAGGCATAC
-TCTAAATATGTCTGCAAATATTATTTTTTCTGGAAAATTTTGAAAATGTA
-TATATGGATATATGCAAGTTTGGAAGTTTTTGTAGTATTATTTTGAAAAA
-TTATAAATTTTTTTAAAAAAAATTTTTTATAAATCTAGCAAGAAACGTTT
-TTAAAAACAATTTTAGTCAATTTTCTTTTTTTTTTTTTGGAAATTTCACC
-AAATATCGGCCCAAAATCTATGCAATACTATTTTTTCACAAAGAAATTTT
-CAAAATTTGACATTATACAGATCTAGGGCTTCCATGGTAGGCAGGCGCGG
-TTTCAGGGACCTGCCTGAAACCTACCTGGTTGCCGCCGGCCTTAATTTTT
-ACGGGAATTTAGAAAAATTTCTAATTTTCTCATTTCTATCAATTTGATGA
-AAACCAAAATAAATTGGCGAGAGGCAGGCAAAGGTTGCCTTAAGGTCAGG
-CAGGTAGGCGTTTTAACACCTACCAGCTTTACAAAAGCACTATACAAGTC
-TGTTTTTGAAATCTCTAGCTTTAAAAATCTTTAAAACAAGACATGGTGCA
-AGACAAGACAAAGACATCGACAAATTTTCGACAAAATTAATTTTTTTCGA
-AAAACTTTTAGTTTCTTCCAAATTCGCCAAAGTGAAAAAAAAGTTCCTAA
-ACGTGAGATTTTGTATGTCTTCTACACATACTAGCCAATATCAATTACAA
-TATCTGCCAAGAAAATCTCGAACCAAACACCAAAACGGCGTTTGGTAACC
-GGTTTTTTTTCCAAAAAAACTATACATAGTTTCTAGTAAACAAATACGAA
-TGGAAAATTCAAGGTGACAGAGAAGAAAAAAAGATTAGAAAAAAAATCGT
-TGGTGGTGGCCTAAGAATTGCATGTAACGTCACACCTCGGCCAGGGGTCA
-TGGTACATGCTACATGATTACCCATGGCAAAAGAGTGACGTCACTCTCGG
-CCATGATTTTTAGGTTTAGGCTTAGGTTTAGGCTAAGGCTTCGGCTTAGG
-CTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCTCAAGCTTAAGCTTAGGCT
-TAGGCTTACCTTATGAGCCTATAAGCTTTCTGAAAAAGACAAATATTAAA
-AAAAAACCAAAAAAAAAAAAAAAAAAAGACAAACAAACAAATAAAAACAA
-ACAAACAAATAAAAACAAACAAAATATTTGAATTTTTCTAAGAAGACAAA
-TACGTCACTCTCGGTCACGATTTTTGGGCTTTAGGTTTAGGTATATGTTT
-AGGCTTAGGCTTAGGCTTAGCCTTAAGCTTAAGCTTAGGCTTAGGCTTAG
-GCTCAAGCTTAAGCTTAGGCTTAGGCTTACCTTATGAGCCTATAAGCTTT
-CTGAAAAAGACAAATATTTAAAAAAAACCAAAACAAAAAAAAAAAAAAGA
-CAAACAAACAAATAATTTTTCAGGCCCAAGACTTCCTTGCAATGTTCAAG
-CCGTTCCTCGGAGGTGGCGGTGGTGGCGGTAATCCGTTTGCAAATCCACA
-GGCGATCGGCGTAAGTTTTCCGACAGGCAAACAGACAAACAGACAGACAA
-TCGAAAGTGGTCCAGGCGCTGAATGTGTTACGCAATTGGTTTTGGGCGCC
-ACGCGCGCATATTATTTGCATATATACATACATCATTCAGATAAATGGCA
-TTGAAAACGAACAAAAAGTGAAGATTTAGTGGGTTGGCAAATGCATTTTA
-TGTTTCTTTTCCAGGGTCTCTTCCAACAATTCGCCGGTGGAAATGGTGGA
-GGATTCGGGCAGCTTCTTGCTGGAGCAATGGCACCGGTATGTGTTGCGAC
-GTTTAAAACGGAGTGTCGTTGTGAAATTTTCCGCTTTGGAAAACATTGAG
-AATATTCGAAAATTTTTGTAAAATTTTGAGATTTTCTTTTTCCAAGCTTT
-GGGCTTAGGCTTAGGCTTAGGCTTAGGCTTATGCTTAGGCCTATGCTTAG
-GCATAGGCTTAGGCTTAGGCTAAAGCTCATGACTAGACTTATTCTTAGAT
-TTAGGCTTAAGCTTAGGCATGGCCTTAGGCTTAGGCTTTTGCTTAGGCTT
-TTGCTTAGGCTTTGGCTAAGGCTTAGGCATAAAAAAAGAGAAATTCCCAA
-AGTAAAAAAAAAGACAACTTTTGACAAATTTGAAAGTGAAATGTTATATT
-TTAAGCCTATTTTTTCCCTAAAAAGAAAAAAATTACTTTTATAGTTTGAA
-AACGATTTTTTGGCAGTGTTTCAGCAGTCAAAAATATGGCTGAAAAAAAA
-AGTTGATTTCAAAATATTTTTCATCTCAATTAATTCTTTTAAATTTGCTC
-TACCAAATTTGAAAAAAATATTGAAAATTATTTTAAAAAATTTAAATTAT
-TAAATTTCAAGTAAATTCGAAAATTTTGTTTATTTATTTTATGTTCATTC
-TTACAATATAAATTATAATCCTCAAACATTCCAGAAACCAGCACCAGCCG
-CAGCTGGACCCCGCTCAGCTCCAGCTCCAACCAACGAGGACTACAACACC
-GACATCGACGTTCCAGCTCCAAAGGCAAAAGCCCGTGCAGCTCCAACTCC
-ACGAAGAGCACAAGGTGATGATGATGATAATATTGATATGTCTCTGACAC
-GTCTTGGCTAACTTGGCTTGGAAAAGCACAATTCCTTTAATACAAAAAAC
-TTTTCTCAAAGATTCTCAAAATTTTGCACTTTAATTTTTAAGTTTAATTT
-TTAAAAAGTTGTCTCACGTTTTTTAACCAATTTATATGCAAATATGATCC
-TTATTACTAACAATATTTAGTAATCTAAACATAAATTGGAATATTTGGTC
-TTTTTCCCGCCGAAAATGATCAAACATTCCGAAGTTAGCAACAGAAAATT
-GCAGTGAATTGTGTTGGTTTAATTTTACCGTCGTTTTTCATATTTTTTGC
-CCGATAGCTTTGCTGTGTTTTGTGCCATCCTTTTCTCTGTGATATACTGT
-TACTTACTTCAATAAATGATTCTTTTAAAAGTTTTCGCACAAAAAATTTA
-GAGTTGCTGGCAAAAATACACGCCGACACGTGGTGCCAGAATGTCTCATT
-TCAGCTTGATCTACGTTGATCTACAAAAAATGCGGGAGAATGGAGACGCA
-GAGTTTTCTATTGATTTTGCATGGTTAAAAACGTGCTGACGTCACATTTT
-TTTAGGCAACAAATTCCCGCACTTTTTGTAGATCAAGCCGTGGTGGGACA
-TCCTATCCCCACTTGCGCTGGGGGGACAAAACCGACATAACTTTTGAAAC
-ATATTACACATATACATTTAATATATGTTTTCTGAGAGAAAACGTTTTAG
-AAATTTTAGAGAATTTCAGCAAAAAAATTCTGATAGCTTTTTGGAAATTT
-ATATTATAAAATTTTTTTTTTTTTTTAATTCTGATTTTTTCAAAAAAGAA
-ATTTTGCAAACCGCTTCCAGAATATTTGCCTGTCTCAAAATACCCTAAAA
-AACATTAAAATGTTTCAAAAATTATCTTTTGGAACAATTTTACGGGTCAC
-GCGAAATACTTTCTTTGTAAGTTTTTTTTCTTTGAAATTTAGATTTATTC
-CCAATATACGTAAATTTTTCACTGAAAGTTAGAAAATTATACTTGTTTTT
-TTCCAGAAATTGAAATGTACATGATACAAGGCTGCTACATTCCAGCAAAA
-TCTGATAAAATTTTAGAAACAATTTTTTGTCAGAGTCTTGAATATTTGAG
-CTATAAGTTTTTTTTTTTCAAAAAATTAATCCAGTTTGGCCTAAAAACTT
-AAGGCTAAGATTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAA
-GCTTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGC
-CTAAACTTAAGTCTAATCCTAAGTCTATTCACTAAAATTTTGACGTAAAA
-CTTGGGACTAAAAATTTTGGACACAAATTTTTTACCTAATTTTTTGGTCT
-AAGCCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAA
-GTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGT
-CTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCT
-AAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAA
-GTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGT
-CTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCT
-AAGTCTAAGCCTAATAAGCCTAAATAGGGTCTAACGCTTGCCACTGACGC
-CGCTAACGCTCGCCACTGAAGCCACGCCTAAGCCTAAGCATAAATCAATT
-TGAAACTTCAGACTTAAATTTCTTGGTGGCCTATACGACTCTCTGTTAAA
-TTTCGCTTTGATCAGCAAACGGGAACCCTTTGAAAAATTAAAAAACTAAC
-GCTCGCCACTGACGCCAAGTCTAAACCTAAGGGTAATACTAAGCCTAAGC
-CTAAGCCTAAGCCTAAGCGTAAGCTTAAGCGTAAGCGTAAGCGTAAGCGT
-AAGCCTAAGCCTAAGCCTAAGTGTAAGCGTAAGCGTAAGCCTAAGCTTAA
-GCCTAAATCTTTCGACAAAAATTTTGACCTAAAACTTTGACCTAAAATTC
-GAGACTAAATATTTTGGACTCAAATTTCGGCCTGAATTTTTGGACTAATT
-CTGGGAACTATTCCAGAGTAATTTTAACAAATTGAAAACTTTTTATAGTA
-TTCGTAAAACAAAAAATAAATGCAATGTTTTCAGTAATAAATTTGAAATT
-TTTGAAAAATTAAATATTTCTTCGAAACTTCGAAACTTCCTTTTCTCTGG
-CATAACCCCAAATTCCAGCCGATGCCCCGCCAGTATACCGCCAGCCTCGC
-ACAAAAGCCGAAAAAATCGAAAGATTCCGGAATATCGCTCGGACATTCTC
-GCCGTTCGTGTACGAGGTGAACACCACACCAGCTCCTCACTTTGACAACT
-TCATCTGGCAACAAAATGCACCAGCTGTCACACCGGAGCCATTCACATTT
-GCTCCATTCTCCTTCCCAACTCTTGCCACCGTCGCACCACCAGCTCCAGG
-ACCCGGCGGCCCGACTCTTGAGCCATTTTTACCGACGACAGCTAGTCCGA
-AGCTGTTAGCTCATAACACTGCTAGGGTATCAAAAAATTTGAATACTGAA
-TACCTCCCTATAACTTTTTCAAATTCCAGATGATCCGAGAAATCGCTTCA
-TTTTCCGACGGAGGACGCTCCAGGGATCAGGATTTTGGCGCAGTTCAAAC
-GCTCATGCAAGCCTTCTTCGAGGCAGTCTCCAGTGGAAATAATGGTGGAG
-CAGGAGCTGCCGCCGGAGCCGGAACAGCTTTAGGAGTAGGTTAAGCTCAC
-TAAAGAGGTCGTGAAGTTTTACTATTTTTTAGGATGCTCCAATGCTTCAA
-GCCCATCGAGATGGTACCGAGTTGGGAGCCAATCGCGCGCTGACCAACAA
-GCTTTTCGAGTCGGATATGGTGTTGACGGTCAAGCAGATGAAGGCGTGAG
-TGTGGGGTACTGTGCAATAAGATTATTGTAGGGGTACTGTAAGATCTCTG
-TAGGGATACTGTAACCCTACCGTGATATTACTAAAGGGGTGCTGTAAGAT
-TACTGTAGGGGTACTATAGGATTACTGTAGGGGTACTGTAAGATTACTAA
-AAATATACTGTGAGATTACTGTAGGGGATGCTGTAAAATTTCTCTAGGGA
-TATTGTAGAATTACTCTAGGGATACTGTAGAATTACTGTAGGGAACTGTA
-AGAGTACTGTAGGATTACTAAAGAAGTACTGAAGGATTACTGTAGGGGTA
-CTGTAAAATTACTATAGAGTACTGTAAGATTTCTGTAGGGGTACTGTAGG
-ATTACTGTAGTATTACTAAACAAGTACTGAAAGATTATTGTAGGGGTACT
-GTAAAACTACTATAGAGTACTTTAAGAGTACTGTAGGATTACTAAAGAAG
-TACTGAAAGATTACTGTAGGGGTACTGTAGGATTACTGTAGTATTACTAA
-ACAAGTACTGAAAGATTACTGTAGGGGTACTGTAAAATTACTATAGAGTA
-CTGTAAGATTGCTGTAGGGATACTAGAAGATTATCGTAGAGATACTGTAA
-GATTATTGTAGGGGTTCTGTAAGATTTCTGTAGGGTTACTGTAGAATTAC
-TGTAGGGTACTGTAAAATTACTGTAGGGGCACTCTAAGATTACTGTAGGG
-ATACTGTAGAATTACTGTAGGGTTACTATAAGTTTACTATAATATTTCTG
-TAGGGTACTGTAAGATCACTGTAGAGGCTACTTTAAGATTCCTGTGGGGG
-CACTGTAACACTACTGTAAGATAACTAAAACGGTACTGCAGGGTACTATA
-AAGCGACCACCCTAGATTCATGGTTATTTCAGAATTGTGCTCGCCGCCCA
-AGAGGCCCGTAACCCTCACGGACGTAAAAAGCGAAAGGTGATTACGGGAT
-CCGTGTACCGATGGAAGAGTGTGATTCCGTTCCGATTCAAAGGTGGCGAC
-GCGAAATGGAAGAAGCTGATCCGTGAAGGCCTAGGCCTATGGGAGAAGGA
-GACGTGTGTGCGATGGAGCGAGAATGGCCCCGGCAAGGATTATGTGATCT
-TCTTCAGAGGATCTGGGTGAGTTGACATGCCCATGGTTTTCGGATAGTTT
-GGGTTTTTTTTCAGATGCTACTCATCAGTCGGAAGAACCGGAGGATCTCA
-ACTTATTTCGATTGGGTATGGCTGTGAAGATGTAAGTTTTAGTATTTCTA
-CTATACTATTTATTTTAAATTCAAATTTTCTAGAAAGGAATCGTTGCTCA
-CGAAGTCGGTCACTCCCTAGGCTTTTGGCACGAGCAGTCCCGTCCGGATC
-GGGATGACTACATCCATTTAAGAAAAGACTGGATTATTAAGGGAACCGAT
-GGAAACTTCGAGAAACGAAGTTGGGAAGAAATCGAGGATATGGGCGTTCC
-GTATGATGTCGGAAGTGTCATGCATTATGGGTCGAATGTAATTTTAAATT
-TTGAGTCGGTAGTTTTTAGATACTGAAAATGATTTTCAGGCTTTTACAAA
-GGACTGGGACCAAATTACTATTGAGACCAAAGATAGTAGATATCAGGGAA
-CGATTGGTCAACGCCAGAAGCTTTCGTTTATCGATGTTAAGCAGGTTAAC
-AGGCTTTATTGCAATTGTGAGTTGTTATGCAAAAATGAAAAAAATTTGAC
-CACTGAGCGGATCGAACGCCCAACCTTTCGATCTGGAGTCGAACGCGCTA
-CCATTGCGCCAAGCAGTCACATTTTGTTGCAGGAAACGGTGTATAGAGGA
-GAAAAGAAAAAAATAGACAACCCTACGTTTTATCAGTGGAGCGCGGTTGC
-AATTTAACATTCCAATTTTCAGCTGTTTGCCCGGTTGCCTTACCCTGCAT
-GCATGGAGGATACCCCGACCCCAATAACTGTGCGGTTTGTAAATGTCCAG
-ACGGGCTCGGAGGAAAGTTGTGTGGACGTGCCGCAAAGGGCACAGATCAT
-GGTAAAACTCCACTGGAATTTATGGGAAAAAACCGCCCTAAAATTTTCAG
-ACAAATGCGGCGGTGAGCTAACAGCGACCGCCGAATGGCAGGAGATGGTC
-TACAAGGGGAAGCGGACGTGCAATTGGAAGGTGAAGTCGCCGAGCGGTGG
-GCGGGTTCGGTTGGTGCTCACCGAGCTCAGGTACCAGTGTGCACCGGCGT
-GTAAGGCCTACATCGAGATCAAGCATAATACCGACTTCCAGCAGACCGGA
-TTCAGAGTTTGGTGAGAACCCTAGATTCCCAAAAAATTCTACACTTTTTT
-CAAAAAAAAATCGAAATTCGACCCATTTTGGCGGGAATTAAAATTCTTTT
-AAAAATGACAAAAAAAATATTTTTCTGCAGAAAATTTTTCGACTTTTTAG
-AAAGCAAGCTTTCACGCGGTTTTGGCTTCCCTCATATATTGAAATGGAAG
-AGTTTTTGCCGAACTAGGCCATTTTGGCTCGGCCATATCTGGGGTAGATT
-TACGGCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAATTTAATTGTCC
-GTGTGGAGTACACGACTTTCCCACGCGTTGTCCGGCAGGCGATTGTCAAT
-GGAGCGCGAAAAATTCAATGAGAATCGAGCCGCGAAGCGACACGCTACGC
-GCCGTAAATCTACCCCAGATATCGCCGAGCCAAAATGGCCTAGTTCGGCA
-AGCTCTTCCATTTCAATTTATGAGGGAAGCCAGAAATCCGTGTAAATTTT
-TAATTTTTTGTTGCTTAAAAAAAAAAACTAAACAACTATTTTCCAATTCA
-AATTTCTAGCTGCTTCAACAAAACATATGACGTCATCTCCGACCAATCTG
-AAGCCCTGATCCTCTCCAACGCGAACATCGTGGACTACGAGGTCTCCTAC
-AAGCTGCAATGGATTCAAGGTACCCCACCCCCCCCCCCTTTTCTATCCAT
-AGAGCGCACTTTCTTCCAGACAACGGAAAAGCTCTTCCACCACCGAAACC
-CACGTCGACCTGGGTGCCCGGAAAAGAGAATCGACCATTCCGCGGAGTGG
-AGAACTCGGGCGGCACCATCGAAAAGTTCATCCTGCAAGCGATCCCAAAG
-ATCCGAGACTCGCATCGGCCACTGGAGAGTATTACTAGTATTGTTGCGGA
-ATATGGTCTCGCAACGCTACTTGGTATATCGCATAATGGAAAGTAGTCCG
-TTTGGAACGATTTTTGCAATCGTCAGAGGAATATATATATATATTTGTAA
-ATTTTGTACCATCCCAAAAATCCAATTTTTCTTTCACAATTTTCAAAATT
-TGCTCATCTTTCACAATTACTCGGGTTAACACATTTAATGCCTTTCAATA
-AATAACAGTTCATATTTAAAGTGATTATTATATTACAGGAACACATATAT
-CTGAGAATGCGTATCGCACAACATATTTGACGCGCAAATATCTCGTAGCG
-AAAACTACTTTAAAAGACTACTGTAGCGCTTGTGTCGATTTACGGGCTCC
-TTTTTTGAAATTTACACGGTTTTCTGGCTTCCCCTCAAAAATTGATATGG
-AAGAGTTTGCCGCGAACTAGGCTATTTTGGCTCGGCCATATCGTTCAAAA
-ACTACAGTAATTCTTTAAATGACTACTGTAGCGCTTGTGTCGATTTACGG
-GCTCCATTTTTGAGATTAATTTTCTTTCGAGTTCCCTTCGTTTTTTTTGT
-AATTTTTTGCTTAATTTGAATTTTTTTTTGATAAATTAAAAAAAATGATT
-TTACACGGTCTCCTGGAGTGTTCATAATTATTGGAGCGCACTTGCTGATC
-CTTGCCGCGCTTATTTACTTTTTCACCGTTAGAAAATGAGTAAAATCAAC
-GATTTTGGTCAAGAAATTTAAAATAAAATTATTAATTGATTTCAAAACCG
-AGTCCACGTGGTGCCAGACTGCCCCATCACGGTTTGATCTACAAAAAATG
-CGGGAATTTTTAGCCCAAAAATGTGTGACGTCAGCACGTTCTTAACCATA
-CGTTGAGAGTTGAGAATTCTGCGTCTCTTCTCCCGCATTTTTTGTAGATC
-TACGTAGATCAAGCCGAAATGAGACACTTTGACACCACGTGCGAGTCCGT
-AAATTGACACCAGTGCTACAGTAGTCATTTAAAAAATTACTGCATGTCAA
-AATTAAAATTTCCTGTTCCCGTAATATCGGATTCAGCACGCCACCCTATG
-AAAATACCAAAATTGGAAAAAAATCAATAAAAATTTATTTTCACGGAAAA
-AAAATTGAGACCACCTTTTTGTTTTCTATCTATATAAACCCGTTGTTTTT
-CACAAAAAATTATTGAAAATCCTTCAAATCATATTATTAGTTCGAAACGT
-CGACGCGTAGGTGTTCGATCGTACACTGCCGGGAATTGCCGGTTGCGGGA
-GTTTCGGCACCGCCGGTTGATATCCTTCTTTGCTAACTTTTGATCTGAAA
-ACATTGACTTTTGCTACGTGGCCGTGGAAGAGAAAACTCGGCCACTATGT
-TTGTTTTTGCGACAAGGGTATATGCGCAAACCTACAAAATGATCTTCAAA
-AAATGCGCGAATTTTTTGCCCAACAAAATGTGACGTCAGCACGTTCTGAA
-CCGTGCGAAATCAGTCCCGCATTTTTGTAGATCTGCGTAGATCAAGCCGG
-ACCACAAAAATATCAAAGTTTTGAATTTTTCAAAAAAAAAGCACTTACGA
-GGATCTAGTCAGCTTGAACAGCAAGTAAATAAGACAAAACGCGCACATGA
-TGAAGCTCAAAAGTAGATCAAACGAGAACTTGGTCGCCGAGACCGCATTG
-AAACTTCTGTCAAGTGAGAGAAACGGTTGGGTGGCATCGTTCACAAATGA
-AAGCATGTAGAATAGTCCAGCAATCGGATAGACTGCCGCAATGACTCCGG
-CAAACCCATTGACATCCTGCTCATCAGAGCCCAGAAGCCGGCAGCAAGCA
-GACGAAAGAGCAATGGAGCTGATGAGGAATAGAATGAGCTCCCGGCAGAA
-GTTGAAGATCCAGTCGGTGCCCGGGCTTGCTGCTCCGATGAAGCAGAGTC
-CGGTGAGGGGATTGGCGGCGACGGCTTTTGCGAGTAGCGCGAGCATTAGT
-GGAGCCAGCGGGATTCCCAGGATGAGCATGATCACGCGGGTTCTGGAGTC
-GTCCTGGAAGATCATTTTTTAAAATTTAATTTTTGAAAATTTATCATGTC
-TGGAAAAGGTACAGGCTGACTAGACCTATTTCACGTGGTGTCAGAGTGTC
-TCATTTCGTCTTGATCTACCATGATCTACAAAAAATGCGGGAGAAGAGAC
-GCAGACTTCTCAACTCTCAACGTATGGTTAAGAACGTGCTGACGTCACAT
-TTTTAATGTACAAAAAATTCCCGCATTTTTTGTAGATCAAACTGTAATGG
-GACAGCACAAAATTCAAAGCCCTCACCAATATATGCGATGTCCTTGTCGC
-CTTATTCCACGACACACAGATCAAGAGCCACCAGAGACGTGAGCAAGTTG
-CCGTGTAGTAAATCAGTGAGGCCACTGAAGAACATGGAACATGGGAAAGC
-CCTCCGACGACGAAGAGCAGGTGATGGGTGTAGTCGGTGCACGAGATTTG
-GAACTTCAAAATTCTTTTTGAATGGCTCAAAAATATTGATTTTGAGCCAA
-GTTATGACCATTTGAAGTTGGTGGCCTAGGATTTTCCTAGGAGTATTCTA
-GGCCGCCAACTTTGGACAGCCATAACTTGGCTGAAAATCAAAATTTTTGA
-AATCTAATTTCACAGTTGAATTTAGCAGACCATGAGCTTCAATTTGACAT
-ATTTTTGTGCCTTGCCACGAAAACTCGCAGACCTACAGTAATCCGGCCAA
-AATTAATGTTAACTGAAAGCTCAGAGTCTGCTAAATTTAAATACAAAGTT
-CGATTTCCAAAATATCGATTTTCAGAAAAATTATGAAGACTCTAAGTTGA
-TGGCCTAGCATTTTCCTAAGAGTATTCTAGGCCGCCAACTTCAAACGCTC
-ATAACTTGGCTCAGAATTAATATTTTCGAGCAAAATAAAAAGAATTTAAC
-ATAAAATCTTGTGATCTACCGGAAACTAGATGAGCGCAATTTTAAATATC
-TAGGCCACCAAGTGAAAACCGTGACTCGGCTCAAAACCATTATTTCTGCT
-TCAACCAAAAACCAATTCATTTATTTTAATTGAAAGCCCGGTGTCGGCTC
-AATTCAAATACCAAGTTTATTTTCAAAATACCAATTTTCAAAAAAGCTAT
-GAGCGTTCTAAGTTGGTGGCCTAGGATTTTCATAGATTTTCTAAGCCACC
-AACTTCAAACGCTCATAACGTGGCTTAAAATCAATATTTTCGAGCAAAAT
-AAAAAGGATTTAATATAAAATCTTGTGATCTATCGGAGAATGCATTTTAA
-ACTTTCTAGGTCACTAAGTAAAATATTCGGCCACCAAGCCTCGGCCGAAA
-ATTATTATTTCTGCTGAACCAACAACCAAATTCTCCAAAAACTGCTTACC
-TGATCTTTAAACGAAATGCTCACAATATAAATAACCGATGTCGCACAAAA
-CGAGATGCACGAGAAGAACATGGCAGTTTCCGTAAGTGAGTGGAGCATCT
-CGAGACGTCTAAAGTAGATCCTGATTTGTTTTTGGAAAATTAGGCCACAC
-ATCACACAATCCAAAACTTACGATAAGCCGACTATGAAGACTGATAGAAT
-TGTTAGTATTACAGAGCTCAGCGAGAGAAACAACAAGAGTCGGGTGGCGG
-ATTCACGGTCAGTCTGGAAATGTACTCATTTGTTACTGAACTAGGTCTAC
-TTAAGCCTAAGCCTAAAGTAAGCCTACCTGCCCAACCTTCTGTGGGTTCG
-AGCACAAAGGCACACACTTTGAGGATCGATTCAGGAACACCTCATCCTGT
-GGGCATTTTCCGTTGAGGCGGTCGACCTCCCGTTGAATATCTTCTACTCG
-ATCATTACCGTCGTCCTCCTGGAAAAGAAAGATGATTGATTTGAAGCTGT
-GTATCTAATTACCCCCGTTTGATGATATAGGACCGGAGAGATTACAATCA
-GATGTTCTCTGTTTTTCTCTGTTTTTTGGTAGCTAGTATAGAAAACTATA
-GAGTACTGTAATTCCTATTTGGGAGCTTGGTATTGTGCTATTATCAAAAA
-AATACAATTGCACAAATTTCTCATTGATCTACCTGTTGAACTTGACTCCG
-CCCCCAATCTTGTTACTGTTATTATTAAGGTAGATCAAAAACACAAGGAA
-GATCAAAAATAAATTACGAGAAAATTGTGCGATTGTATTTTTTTCTATAA
-TATCAAACATTTATTGATTTTAGGACATTCTGTGATTAACTTTTATAGTT
-TCACGGATTTCTGGCTTCCCTCAAAAAATTGAAATGGAAGAGTTTTCGCT
-GAACTAGGCCATGTTGGCTCGGCCATGCGTGGCGCGTCGCGGCTCGATTT
-TAGTTGTAAAACTAAATATTTCCCACGCGTTGTCCGACAGGCGACTGTCA
-ATGGAGCGCAAAAAATTCATTGAGGGAGGTTTCTATTTGGCAATGCGCTT
-TTGGTTTTTCAGTGATCTTTCAAAAAATTTTTCATAATTTTCAAATGATC
-ATAACTCTGAAACTAAAATTTTTGGCAAAAAAAGTCGTAATATTGTAAAA
-TGTTGCTCATAATTTCTTCTATACGATAAAATTTTTTCAAAATTTTACAT
-TAAACAGGCCAATAGGTACAGCGCCCGACAACTCGCGGGTCCAAAAATTT
-TTCAAAAATCGTCAAAATTCGACTCGCGAGATGTCGAGCGCTAAATCTAT
-TGACTTTATTTTTTTGAATTTTTGAAAAATTTGTTATCCAATAGAAAAAT
-TTATGAGCAACATCTTATTAGTTAAGCGTTTCTTGCCAAACATTTTATAT
-TCAGAGCTATACTCATTTGAAATTTTTGAAAAATCACTGGAAAACCAAAA
-ACGCGGCAAACGATTTTTTCCGGCAAATCGGCAAATTGGCAAACTGCCGG
-AATTAAAAATTTCCGGCAAATCGGCAAACCGGCAAATTGTCGAATTTGCC
-GAAAATTTCGGCAAATTGTGGTTTTGCACTTTTTTTGGAAATTTCAGAAT
-TCCAATTTCAAATTGCAAAATTAAACTCATCCTATGAATGTTTCTACATC
-TATTTTGAAAAGTAAGTAAATTCTATGAAAATATATAAGGAAAACGAGAA
-AAAATTCAAAAAGACATAGTTTTAAGTGTTTCCGTCTTATTAAAAAATCC
-CTCTAAACTTTTCCGGCAAATTGATATTCGGCAAACGGGAAATTGGCGAT
-TTGCCGGAATTGAAAAACCCGATACTTACACTTTCTTTCGCTGCAAACTT
-TGCCCTCTCATCTTGAATTGCTCCTTGCTCATTTGGCCCTTTCATGCACA
-TTTTCTCTCGATTGTTCTCCAACGGGAACTTATCACAACGAATCACATCG
-GGCCACTTGAAACCGAAACTTTCCAGCACTGGAAGACACTTTTCCTGGAC
-GGAAAGACACAATGGACGGCATGGACCAATTGGGTTGGCTAGCTGAAATT
-TTTTTGAACGATGAAATGATAAAAATGTGCGATTCTTCTCTGATTGAACT
-CACTTTCTCGTTGCACATCGGGAAGTAGACGGAGCACAGGAAGAATTTGA
-GCTGCTCGGAGCAGACAACGGAGAGCAGGGGCTTGTAGGTGAGGATGGAT
-TCGGAGGCGTCTTTCCATGATTCCTCGTCGACGAGATTTGGGAAGCTGGA
-ATAAGGGCTTGTAAAGTTTGAGAAACTTGAGATTTACAGGGTCAAAAATT
-GCTCACGAGCTCTCCCGGTTGCCGAAAAGTTGCCGAAATTTGAGCAACCA
-AAAGTTGCCGATTGCCAAAAATTGTAGGGTACGGCAACTTCGGCAATCGC
-CGGTTACCGAAGATTTTAGAGTTCGGCAACTTCGGCAATTGGCGGTTGCC
-ATTGCTCTCACGAAATTTCCCGCTATTTTTGGAGATTAAACAGCAAGTGC
-ACGTGTGGGTGTCTCAAACAGGAAAGAAATCCTGGCAGGAGCCGACTTGC
-CGGAAATTTTCAATTCCGGCAAATTGTCGGTGTGCCGATTTGCCGTTTGC
-CGGTTCTCAGATTTGCCGGAAGTGTGTAGAGGGATTTTTATAAGACGGGA
-ACACTGAAAACTGTGCCTTTTTGAATTTTTTCCCGTTTTCTTTGGATATT
-TTCATAGAATTTGCTTACTTGTCAAAATAAATGTAGGAACATTCATAGGA
-TGCGTTTAATTTTGCTATTTGAAATTGAAATTCTGAAATTTCCAAAAAAA
-TGAGTACAAAACCACAATTTGCCGGAATTTTTCAATTCCAGCAATTTGCC
-GATTTGTCGTTCTGCTGGTTTGCCGGAAATTTTCAATTCCGGCATCTTGC
-CGATTTGCCGATTTGCCGGATTGCCGAAAATTTTCAATTCGTTAGCCGTC
-CACCCTGGATCCTGCCATCCAAAAAAAAACGGAAATTTTTGGCAAATTGC
-CGTTTTTCCGCCGGCAAATTCGGCAAATCGACAATGTGCTGTTTTGCCGT
-TTTGCCGGTTTGCCGGAAATTTTCAATTCCGGCAATTTGCCGATTTGCCG
-ATTTGCCGGTTTGCCGGAAATTTTCAATTCCGGCAATTTGCCGATTTGCC
-GATTTGTCGGATTGCCGAAAATTTTCAATTCCGGCAATTTGCCGATTTGC
-CGATTTGCCGGTTTGCCGGAAATTTTCAATTTCGGCAATTTGCCAATTTG
-CCGTTTTGCCAAAAATTTTAGGGTTCGGCAAATTCGGCATTTGCCGTTTT
-GCCAAAAATTTTAGGGTTCGGCAACTTCGGCAGTTGCCGGTTTCCGCACA
-TCCCTGTCCCACACGCCCCAGGTGGAAGATGGTGGAAGAGTTTCTAGCGG
-GTCCATCAAGGATGGGAATCATCAGTCAACACAATCCTTAGCCGACCTTC
-CCAAATTCATCATTCCTTCCTTCCAAAACGGTTTCCGGTCCTTCCAACCG
-ATTAATACCAGCCACCACCACACCACCAAACCCTCTCCTTCGAAATAGAG
-AACAAAGTTGCATACCCCCCTCATTTCTTTGTTTTGGAGAAAGGGGCGTT
-TTGTGGTGCTCGGAGAGCCTGAGGACGTGACAAGTGATATATAGACGGGC
-TTATACTATCTGCTCGTCCATATTTCACGCGCCTAGGCAGAGTGCACGGC
-GGGAGGTGGAGACGCAGGTTCCCGTCCAACTGCCGCAGAGCATCCCCTAT
-CTGCTCCTATCAATTGTTCGGAGAGACTTTTTTGTGAATTTTGCTTTTTG
-CAAGAGGTCTGAGATTTGGGATTTGGGCTTTAGGCTTTAGGCTTTGGGCC
-TTGCTTTGCGCCAGAGAATGGAAATTTGTCCGTATTTTCCCGGCTTATAT
-CAAAAAATGATCAACTATAAAAATATAGAAAAAGATTTTTCAAGTTTTTT
-GTCAGTTAGTATTTTTTGATAAAACAAAAGAGAGCCGAGATATAAGCTGT
-CAAAGTAGAGCAAGGGTGGTTTGATCTACAAAAAATGTGGGGATTTTTTT
-TCAAACTTGCTCTACTGATAAATTAATAAATTACTCCCACAAAATCCAAT
-AAGCCTCAAACTTAAGATCCTCCAATCTCATCCCCCTCATAAAACAATAA
-TACTAAATCACTAGATCTCCGGTAGTATATATCAGAAGAACAGTTGCTCT
-CCCTCTCGAACCGACTTACACTTGAGAAAAATAAATTGTGGAAGAGAAGT
-GACGTCATCGTAACCTACCACTTCACAAGTTTATATATATATATATATAT
-AAGTACTAGTTAGGACTAGCTAAGACCTAATTAGAACATAGGTATGGCCT
-GTAAGTTAGGACCTAATTAGAACTCACTAGGACTATATATATATATATAT
-ATATATATATATATGTAAACAAGAACCCGGGCGGGTAACCCCTTACGGTC
-AGAGGGGTGTCCTACACCAAGGGTATGTAAACTGTGTCCCCCAGATGGCG
-AAGTTGAGAGGGAAAAAGTGAAAAAGCGCGCCACATGGCCTCGCGACCGT
-ATGTTGCAATTTCAAGCAACGTTTTTGATTTATTGGAGGAGAAATTTTGA
-AAAAGTGAAAAAAAAGTGTGACCCCATATGAGATGCGTAATAAAATTCCC
-TACAAGACCTTAAGAAAACGTGGCTGGCTGGCAAAAAACAGGTGGCAATA
-ATAACGGAATGTGTATGTGTGTGTGTGTGTGTGTGTGTGCTCGAAGAGCA
-TAGGCTCGTAAATCGTTATAATTGATGCTGGAGGAGAAGGAGACGATGGG
-CCTCCAAAGTGTTACACCTGGTATTTGTTGGGAAAAATTTGGGGGAAATA
-GGCATTAAACTACCTAACCTAATTGAGTTTTTTCAAAGCTTATATTATTA
-TAACTAAGAGGTGTGATAATAAATAATTAAAGAACTTTAAAATTATCAAA
-AACGCTTTCAAATCTGTAAAGCTGATATTTTAAGGATTTAGTACTAGTTA
-AAATCTAGTTGGGACCTAGGTAAGACTATCTAGAAAGTTCGGACGTAACT
-ATTTAGGAACAGTTAAGTCTTAAGGCCTGCTTGGGTACAGGTAAAAATGT
-TTAGAAAGTTAGGAACTAAATAGGTGAAGTAAGTACTAGTTAGGACTAGT
-TAAGACCTAATTAGAACCTAGGTAAGGCCTGTAAGTCAGGACCTAAATAG
-GACTTACTAGGACTTAGGTAAGACTAGTTAATGTCTTGTTAGGACTAGTT
-AGGACTAGCTAAGACCTAATTAGAACCTAGGTACGGCCTGTTAGGGAAGA
-TCTGATTAGGACTTACTAGGATTTAGGTAGGACTAGTTAAGATATAGTTA
-GGACTAGTTAGGACTAGTTAAAATTTAATTAGAATCTAGGTATAGCCTGT
-AAGTTAGGACCTAATTAAGACATACTAGGGCTTAAGTAGGACTAGTTAAT
-ACTAGTTAAGAACTAATTAGAACATAGGCACGGTCTGTTAGTTAAGGCCT
-AATTAGGACTCACTAGGACTTAGGCAGGGCTAGTTTAGTTATTGTTAGGA
-CTAGTTAGGACTAGTTATGTACCTAATTTGGACTCACTAGGACTTAGGAG
-GACTAGTTATAATCTTGTTAGTAATATTTAGGACTAGTTAAAATCTAATT
-AGAACCTAGATATATCCTGTAAGTTAGGACCTAATTAAGACTTGATTTGC
-TAGGATTTAGACAGGACTAGTTAAGATATTGTTTGGACTAGTTGACTAGT
-TAAGACCTAATTAGATCTTAGGTACGGCCTGTAAGTTAGGGCCTAATTAG
-GACTGAATAGGACTAAATTTCTTGTTACGAATAGTTAGGACTAGTTAGGA
-CTAGTTAAAACTTAATTAGCACCTAGGTACGGTCTGTTAGGGAATACCTA
-CTTACCAGGCCTTAGGTAGGACTAGTCATGACCTAATTAGAACCTAATTA
-GAACCTGGGCACGGCCTGTTAGGGAAGACCTAATAAGGACTTACTAGGAC
-TTTGGTAGGACTAGTTAGGACAAGTTAAGACCTAATTAGAACCTTGGTAT
-GGCCTGTAACTTAGGACCTATTTAGGACTTACTAGGACTTAGGTAGGACT
-AGTTAGGACTAGTTGGAAGTTGGGACCTAACTAGTTAGACCCTTAATTTT
-GTACACATGCTTATTAATATCAATAAAAATTTTAAAAAAAAACGACTTTT
-TTAAGTTTAACTATATAAAACTATAATTTGGAAAATTTGCTACTTTGCTT
-AAAAATCGAGAAAAAACCTAGCGTTTCTATAAAAAACCATCTTGAAGTAA
-ATTTTGAAAAAACCCCGTCATCCAACAAAAAAAAATTCACTCACCTCGTT
-AAGTTATACGGCAAATCGTTGCACATCTCATGATCCACCTTTTGACACCT
-CTGCCCGTCCACACCAATCACAAAGAGCAACAGGAGCCAGGTTACTCCGA
-GGTAACCACGAAATGGTCCCATTAATGATAATGGAATTGGGGGCTCACAG
-CCTGGGTGGGGGAAAATATTGAGAGTAAAAGAAACAATGAGAAGAAAGAC
-GGAGGATAGGCGGGGGGGGGGGGGGGGGCACACCAGTGGCAGCACCACCA
-CGGCCTGTCCGTTGACAAATGACCCAAACGGACGGGGGGCGGGAAGAGTG
-TCTGTTGTGTGTGTTGGGAGATGGCTGGCGGTTATCAGATATTTGTATGA
-ATGGTATAGAGAAACAGAGACCAAGAGAGCTGAAAGATGGAGAGGCGAAA
-GAGGAAGAGAGGGGGGGGGGTGGAAGTTTTTACGAGCCCTGTAATAAATA
-TATCGAAGCAGCAAATCATTTGATGATAACGGAGGAGCGCGGGGACGGAG
-ACGGCAATCATCATCATTATTAGGACCAGGGGTGTGCGGCGAATTTTTGC
-CGAATTTGCTGTTTGCCGAGCTCGGCAATTTACCGAATTTGCCAAGCTCG
-GCATATTTCAAAAAAGTAGATTTGCCAAATTTGCCGAACTTGGCATATTT
-CAAAAAAGTAGATTTGCCGAATTTGCCGAGCTCGGCATATTTCAAAAAAG
-TAGATTTGCTGAATTTGCCGAATTTGCCGAGTTTGCCGAGTTCGGCAAAT
-TTGCCTATTTAGCCGAGCACGGCATATTTCAAAACAGTAGATTTGCCGAA
-TTTGCCGAATTTCCCGAGCTTGGCATATTTCAAAAAAGTAGATTTGCTGA
-ACTTGCCGAGCTCGGCAAATTTGCCTATTTAGCCGAGCACGGCATAGTTC
-ACAAAAGTAGATTTGCCGAATTTCCCGAGCTTGGCATATTTCAAAAAAGT
-AGATTTGCTGAACTTGCCGAGCTCGGCATTTTTCAAAAAAGTAGATTTGC
-TGAATTTGCCGAGCTCGGAATATTTCAAAAAAGTAGATTTGCTGAACTTG
-CCGAGCTCGGCATTTTTCAAAAAAGTAGATTTGCTGAATTTGCCGAGCTC
-GGAATATTTCAAAAAAAGTAGATTTGCCGAATTTGCCAATTTTGCCGTTT
-GCCGAATTTGCCGAGTTTGCCGAGCACGGCATATTTCAAAAAAGGAGATT
-TGCCGAATTTGCCGAATTTGCCGAATGTGCCGATGCCGAGCTCCTGTTGA
-TTTTTTTCCAAAAATTCAGTAAAACGACACAAATTTGTTTTAAGAATTCA
-TTAGTTTCGGTGCTCCAAACAACATCAAAAAATATCAAATTTTTCCGAAT
-TTGTTAAGCACGGCAAATTTGCCAAATTTGCCGAATTAGCCGAGCACGGC
-TAATTTTGAGATTTGTCGCACACCCCTGATTAGGACCGAGAAAAGGGCCT
-AACATGATTTCACAATTTGAAAAATGAAATTCAATTTTTCTTGGGAAAAA
-AGTATGAATCTCTTCCTCCGCCCGTTTCCGGCAGAAACAATTGAACCAAA
-CGAGCCAAAAGTGCACATTGTGTAACTTTGTTGGGGAGTGTAGATAACCA
-GAAGAAACAAGATGGAACTTTCTTGCGATGAACAAATTTTGGAACACTGG
-AGGGAAATGATTGGTGTTTTTTAAGCTTTTTAGTCAATTTTTAAAACTGT
-TCTACAATAGGCCCAAATAGGCCTAATAGGCAAATAGGCCAAGTAGATTA
-AATATGCCAAATAGGCAGTATAGGTTGAATAGGTAAACAGGCCAAATAGG
-TCAAATAAGCTAAATAGGCGAGACTGGTGCTCAAATACTTTTTGAACTGG
-TAATGTTTTTTCTTCTACACAAAAACAAAAAAGTCCCTGCTTAGTTCCGC
-AAAATTGTGATTTTTTTCAAAAGTTACCCATTTTTGCCACTTTTCAATAG
-TTTTTGATAGGTTAAATCTAGATTTTCTGAATTCAGCATATATGAATTAC
-CCGTTTTCAACAAATTTAGGCAAATTTTTATTTTTGCCCAATTTTTTTAG
-CCATCTAATGACTGATTTTGGGCAAAAAAAATTTTCCTGAAATTGTACAA
-AACCATTAGAAATTGAAAGGCTCCTCAGTTTAAAGGCACATGAGGTTTTT
-CGGAGTGGGTGGCAATTGTCGTTCGGCAAATTTTTTGGTCGACAAATTCG
-ACAAATTGCTGGTTTGCCGATTTGCCGGAAAGTATTTTCTTACTTTTCAA
-AATATATGTACGAACATTCAGAGGATGCTTACAATTTTGCCGGATAAAAT
-TTAAATTCTGAAATTTCCAAAAAAAATGTGCAAAACCATAAATTGCCAGA
-AATTTTTAATTCCGGCAATTTGCCGATTTGCCGATTTGCCGTAAATATCA
-ATTCTGGCAAATTGAAGATTTGCCTTATTTGCCGACTTGCCGCATTCCCT
-GATGTAGGCATCAAAACGACTGAACACCAAGTTTTTTTGAAATTTTTTAA
-GTTTACCTTTATAATTTTTAGTGCTCAAAAAGTTCCAAAATTAAATAAAT
-TTTGAAATTTGCCGAGCTCGGCAAACGGCAAATTTGCCGCACACTCCTGT
-TTCAAATGTTCACCGCATATTTAATTATTCCGGAAATCCCCTCAAACATC
-CATCAAAAGTGTTTTCCCTGATTTGTTGACTCTGACACCGACGGTGGTTG
-TTCCCCCCCCCCCCCACTCTCTCAATTGGCATGTAAATGAGCCCGTATGA
-ATGAAGTGCCTTTTGGCGGCAAAATGCATATCTCCAAGTACCATTGAATT
-AATCTTCCATCCCCCATTGTCTCCTTCTATATAGGGGGGAGGATGCGTGA
-TTCTTGAAATATGCTCCAAGTGACAAATTGAGCGTGTGTGATGTATCGTG
-GCAGATGGCTGGCTGACAACGGATCAGTTCCAAAAACTGTATCAAACGGG
-GGGAAGAGAGGGGAGATGAAGGATGGGGGCAGATGGAGTCATCGATGCAC
-CATGTTTTTTGGAGCTGTTCACTCAGATATTAGGGTATTTTAATCCCCTT
-TTTAAGGTCTATTTCTGATCGTAAAACTTGGTATTTTCAACTCATTTTTA
-ACTCAAAAATTTCAAAAGTTTGAAAAATTACACAAAAACCTAAATTTTGA
-TCTGGTTTCAGGCATTTTAGTCCCTGTTAAGCGTCTTCGATGCACCATGT
-TGTTGTTCAACTTGTTTAAACTTTTTAGTTCCGCATCGAGGAAAATGGAA
-AATAAAAAATTATTTATGTATTCAAAAACCATACTTTGATTCTCCGTAAC
-AACGCTTTCATGGGAGGCAGGCCCGGTTTCAGGGCCTGACGCCTGCCTCA
-AACCTGCCGGCCTCACGCCGGCCTCACGCTTCATTTCTGCATTTTGGCGA
-AAAATCAAATACTTGGACATAGTGAAAAGGTGATTTTTTCGACGCGGCCG
-ACACTTTTCGGGTTCCGCGCCGCACTATACAGGAGGCGAGGCTCGCGGCG
-CGAGGCAGGCGGAGGTCGCCGCAAGGCAGGCGCGGCAAGCATTTTTGTGC
-TTACATGGATACCCTAGTCTACACAAAGCACGAATTTCTGGCTTCCCTCA
-TAAATTGAAATGGAAGAGTTTTTGCCGAACTAGGCCATTTTGGCTCGGCC
-ATATCTGGGGTAGATTTGCCGTCGCGTTGCGTGTCGCGTCGCGGCTCGAT
-TTTAGTTGTAAAACTAAATTTATTTGTCCGTGTGGAGTACACGACTTTCC
-CATGCGTTGTCCGGCGGGCGATTGTCAATGGAGCGCAAAAAATTCAATGA
-GAAAGGCCAGAACCCAGTGAAAAAGATAATTTGACAATTACAAATAATGT
-TTTAAAATTTTTTTTTTGTTTTTGATTTTTGGTTCTCCTTGTGTTTTAAG
-AACATGATGCATCACCGCTGGAAATTGCTGGATATGTAAAAAAATTATTT
-ATGTACATATTTAAAAATCAAATCTTGATTCTCCGGGATAGAAGCATAAA
-TCAAATTTATTACTGTAAATTTTCACTTTCAGTACATTTAATTGAAATTT
-TTAAGCTTTGAAGTTCAGGGTATCATAGTTTTGCCTCCAAAATCCACTTG
-CCCAAAAAACAAGCCTGGGAATTCCCGGCGGGGGACGATGGTTCGATAGC
-ATCAATCATATCTGTGTGTGTGTGTGTGTGTGCAAGGCGGGGGATGAGCC
-GGCGCGCGAAACGAATAAATCAAGAAACGTCTCTCTTTCTGCGAGCACGG
-ATTTTGTTGTGAGCCCGCGCGCGCGCGGTCTATAGGAGGAGAGGGGTATC
-ATGCACTTCTAATACAGGGCATACTTCTTTCATTTCCATGTTTTTGTACA
-TGTAATAAAATTGTTAATTAGCCAAAAGTGGTTCACATGTTCACGTCGTA
-AACGTCGGTTTTCAGGGTGTACTGATAATGAATGTGCTCTGTGTGGAGAC
-AAAGAGGCAGCAGAGAGCAAGAATCAGTTAGGTTAGGCAGGTGACTTTTT
-TCAATTGTGACTAGGAAAAAGTATTTTGGGAATTTTTTTTTATTTTTTGG
-CTTCTGCCCAGATTTTCAGGATTTTTCAAATATTTACAGAAATTTTCGTG
-ATTCTACAATAATATTTTTGTAATTTTCTCAATTTTCAAAAAATTGCCAA
-TTAATTTTGAAGTTTCGAATGAAGCAATTGCCGAAGTTGCCGACTCCCGG
-AAATTTCGAAAACCGGCAATTGCCGAAATTGCCCTTTGCCGGAAATTTCG
-AAAACCGGCAATTGCCGAAATTGCCCATTGCCGGAAATTTCGAAAACCGG
-CAATTGCCGAAGTTGCCGACTCCCGGAAATTTTGAAAACCGGCAATTGCC
-GAAATTGCCGACTCCCGGAAATTTTGAAAACCGGCAATTGCCGAAGTTGC
-CGACTCCCGGAAATTTTGAAAACCGGCAATTGCCGAAATTGCCGATTGCC
-GGAAATTTCGAAAACCGGCAATTGCCGAAATTGCCGCTTGCCGGAAATTT
-CGAAAACCGGCAATTGCCGAAATTGCCGATTGCCGGAAATTTTGAAAACC
-GGCAATTGCCGAAATTGCCCATTGCCGGAAATTTCGAAAACCGGCAATTG
-CCGAAATTGCCGCTTGCCGGAAATTTTGAAAACCGGCAATTGCCGAAACT
-GCCCTTTGCCGGAAATTTCGAAAACCGGCAATTGCCGAAGTTGCCGACTC
-CCGGAAATTTCGAAAACCGGCAATTGCCAAAATTGCCGATTGCCGGAAAT
-TTTGAAAACCGGCCACTGCCGAAATTGCCGACTCCCGGAAATTTCGAAAA
-CCGGCCACTGCCGAAATTGCCGACTCCCGGAAATTTCGAAAACCGGCAAT
-TGCCGAAATTGTCGATTGCCGGAAATTTCCGATCCCTGAGTTTAGCCTTT
-TTCAGCAAATCAAACAGTTTATGATTATTTTTTCAAAAATTGTTCTGCAG
-TGCTCTTGCATCACTATTGTGGCCCTCCTTTAAATACAGTACTTTCTACA
-GTACCACTACATCAATGATCCTTCCAGTAATGCCAACACATTGTACCACT
-ACAGTAATCCTACAGTACCCTATACAGTACCGTCGCAATACAATTACCGT
-AACACTATGGAAATCTTACAATAGACTACAGTATACAAAAACTACAGTAA
-CCCCCTTGAAGTTAGTGTAAAACTTGCAAATGTTCAACTCTTTTTTCTGA
-TTTTTTTTTGTTAAGTTCAGAAATTGTAGAGTGTTTTTGGCTTCTGCTCA
-GATTTTCAGAAATTTTCGTGATTCTATAGTAGTCTTTTTGTAATTTTCTC
-AATTTTCAGAAGTCTGCAAATTCAATTTGAAATTTCGAATAGCTTTAAAA
-AACTCAAACAGTTGGCACAAATTTTCGTAGATTCATGTAGAATTTCAGCC
-TTTTTCAGCAAATCAAACAGTTTTTTATTTTTTTTTGTATTTTTTCAGAA
-ATTGTTCTCACCCTCCAAAGTACTATCACGTCCTAACAGTAATATTAGCC
-TACCGTATCACTACAGTAATCCTCCAGTACTTCTGTGCATGCTACAGTAC
-CCTTGCATCACCATAGTGGTGATCCTTTAAACCTACAGTACTTCTACAGT
-AGCACTACAGTACCACTTCAACAGAATCTTTCCAGTAATATCAGCGTATC
-GTACCACTACCGTAATCCTACAGTACCGCCACAATACTATTACCGTAACA
-CTATGAAAATCTTACAATACACTACAGTATACAGAAACTACAGTAACCCC
-CTTGAAGTTGGTGTAAAACTTGCAAATGTCTACCGTAATCCTACAGTACC
-CCAATACAGTACCGCCGCAATACAGTTGGCATAACACTATGAAATCTTAC
-AGTACACTACAGTATGCAAAAACTACAGTAACCCCCTTGAAGTTGGTGTA
-AAACTTGCAAATGTTCAACTTTCTACAAATTTGCCATTAACTTGTAAGTT
-GGGGGAGCGCATCGAAGTGTATACATATATGTACATGCCAACCAATTATT
-TTCTCAAACAATTTATTAATAGTCGAAGACACCTGAAGCAACGATTAGGA
-GGAAGAAGAGGAAGGAGAGATTGGCAGAAGAAGAAGAAGAAGACGAATTA
-GTTGAAGAATCTGTTGAAACGGAAGACGTTGTTTGTGATGTCTCTAGCCG
-TGCGACAGCTTCCCGTTTCAGACGGAACGATGTTCGCACGGCGATCGGTG
-GCGAGATGTCGGACACGTCGATTGTCGACGAGAAGGGATCAGAGACGGTT
-GAAGAATGCTGAGGAGGAGGATTATGTCGACGTTCCCGTCCACGACACGC
-GGCCTGGGTACACGTGACACAGACGTGAAGGTTACAGAAGATGTTCACCT
-CGTTGCTGGAATAATAGTCGTTGAGAGGTGGGTGGTGAACATGAACAAAG
-AACTTAAGAGGCTTACCTCGTTGGGAATGCCCAGGCCTTTATGTGGTTGT
-AGAAGATGGTCTTACCATTGCGTCGAGTCACTTCAAAGTCTCCCCACACC
-TGGAACAATTTTCTATGGAAGTCTCAAATAATATGCAGTTGGTCGATGCA
-CCATGATGAATTTTGTGCCAAACATGGTGCATCGACGCTAAATAATTTTC
-TTTTGAAATTTAAAGATGTTTTGCTAGACTTTCCCTAAACATCTTTTTAG
-TTTTCCAATGTTCTCTAATATCATCATGGTGCATCGAGAAAAAATGTTAT
-AGGAGGAGTAAAGAAATTTGAGACTTTACTTTTTTAGACCAAAAATGACC
-CAAAACTACCGAATTGTTTAGTAAGACGTTTTGAAAATTTTTCAAAACAA
-AGTTATGGCGGTTCAAAGTTCTGGAAAATAGCATATTTTCAGCTAAAATC
-TAATGTTTTGGGGGCTGGGGGAGGAATAAAAATGTAATTTTTTTTGTGCC
-CCACTGCCCGAAAATGCACTTTAATCGACGAATAAACGGCTTATAAAGGG
-CCACAATATTTATAAAAGAGTGATATTATAGTTATAAATAAAAATTGAGT
-TCCCGACCGAGAAAAAAATTGGCGAAAATTTTGATTTTAGCTGAAAATGG
-GACTTTTTTTCCAAAACTTTGAGCGGCCATAACTCTTTTTTGAGAATTTT
-TCAAAACGTCTCATTTAGAAATTCGGTAGTTTTGGGTCATTTTTGATCTA
-AAAAAGTAAAGTCTCAGATTTTGATACTTTCTCGATGCACCATGATGAAG
-AGAAAAAAAGAGAAAATTTAGAAAAAAAAAAAAAGAACCCTTCCGATGTT
-TTGGGAAAGTTTAGCAAAACAATAGATTTGTAAAAAATTCAATTTCATTA
-GGTTCCTATTAAATTCTCAATTTTTATCAATGCACCATACATTTTCAGCG
-TGAAATTTTGTAAAATGCACAGGAATGAAAATTGATCAGGTGTGTATAAA
-ATAAGAAATTGAAGCATTTTGTTTTTTTTTTTGTCGATACACCATGATGA
-ATTTCACGTCAAACATGGTGCATCCTGGAAAGGAGAGAGTTTTAAAAATG
-TATCATTTTTTTCTCGATGCACCATGAAGATTTATATTAGTAGAACTTAA
-ACCGCACTTAGCATAAGTGGCATAAAAATAAAGGTGGAGTAGCGCCAGTG
-GGGATTTTGTCTAAATACACTTATTATGATCCAAAACGATCGAATATCTT
-AATGAAACACTCCAAAATATTTAAGATTTTTCAAAATTTCCGGTCAAAGT
-TTTGGCAAATTGCCAAAATATTGAAAAAAAATATGAGCTTTTGAGGAAAT
-CCAAAGCAATGTCGCGTGTTTCGACCCACACAATGTTTTTATACAATGTA
-GAAAAAAATTTTTTTTTGGTCGACTTTTAAAATTATGAGTGGCAAAAACT
-GAGTAATTGCCAATTTGACAGTAAATAAAAAATTTTCAAAAACATTTTGA
-AAAGTTTTATTATGATATTCGATTATTCTGGCACCATTTGAGTGGTTTGT
-AGTAATTTCCCCACTGGCGCTACTCCACCTTTAAAATTAAAAAAAAAATC
-ATAATGGGTATTTAATATCAATGAAAATTATCGATTTTTCCAAATGTATC
-AAAATGAGTGTTCAGCGCGAAATTTTGTGCAGGACTTTTTCTTTCAATAA
-TATATCCCGAATGATGCATTAGTTATGGGCTACACGATTTTTAGAAAAGC
-ACCTGGCCATGCTTAAAGGTGGAGAACCGAAATTTGATACTCTGTCTTTT
-TAGATCCAAAACGGTCCAAGACTACCAATATTCGTATTAACCTGTTCTGA
-AAAATTTTCAAAAAAAAAAGTTATGGCCGTTCAAAGTTTTGGAAAAATGG
-TCGATTTTTAGCTAAAATCTCAAATTTTGGCAACTTTTCAATGTCACAGC
-TGGAGCTTAATTTTAGAAACAACACGTGATAAATTGCAAAAACATGCATA
-AAAATATGTTCCAACCGCTCCGACACTAAAAAGGTGCCAAAATTTGAGAT
-TTTAGCTAAAAATCGACCATTTTTCCAAAACTTTGAGAGGTCATAATAAC
-TTTTTTTTTTGAAAAATTTTCAGAACGTCTTAATACGAAATTTGGTAGTT
-TTTGGACCATTTTGGGTCTAAAAAGGCAAAGTATCAAATTTTGGTACTCC
-ACTCACTATCGAAGCAGAGCCCCAAAAGTTTGACCGACCCAATTTTGTAA
-GTTTCTTCGATGCACCATGATGATTTTGAGCAAAATGTTAGTTTTTTTTT
-TTGAAAAACTGGTGGCAGGACCCAGTTTTCGGCAGTTTTAAATGTCGATG
-CACTATGTTTTTTTTAATGAAACCGTACCTCCCCAGAAGTCTGCAAAGAG
-CATCCGTGTGAGTCCGACAGTGGTAGCTCGGATATCCCGTCATTCGCCCA
-ACACCTTCCGATTCGTCCATTCTGATCATCGCTCATTTCAACTGTGTACG
-TCTACAATTTACAAATAGTTTCTTTTGATTTATGGAGTTCCTGACTTACA
-ACTCTATCACCAACTGCTAACGGACGTTGTAGCTGCTTTGAATCCAAACT
-GTCGCCGTCTAGAACACGAACTCGGTAGTCGACTGTCTGAAACATTATAT
-GGGTCTCGCAGCGATAATTTTGAAGCCTTACCTTATTATCCGATAGGCTG
-CTTGCTGTGGTGGCATCCGAGTTGATAGTGATTCCACCAAATGATACGGT
-CACCTGAGATTCTTTAGGAACAGGGGCAGCAGGTATACAGGTCAGAAGGA
-ATCGTTTGTCGGTTTCTGCATTGAATCTTAAAAAAAAACGATGAGGAAGT
-TATTTTTTATTTTTGTCTATTTTTGTTCGTATATGGTTTTTTAGGTACCA
-TGGAATAAAAAAAATGCTCCTAAAAAAATTAGTTTCAATAACAAATATTA
-CTGGTACAGAGAGTGTAGATAGTTAGAGAGTGACTGACATCCGGGACCCA
-ATGGGGCGGGGCGCGCGGAAGAGACGATTCGTGTCGATTTACGAAATGAT
-GACAACGAGGAAAATTTCGTAAATCGACACAAATCGTCTCTTCCGCGCGC
-CCCGCCCCATTGGGTCCCGGATGTCTGTCACTCTCTAACTATCTACACTC
-TCTGTACCGGTAATACCATAATATGATCATCATTCTACATTAGAAAAAAA
-TCGATCTGAAATCACAGATTTTTGGCCTCCCTCATAAATTGAAATGGAAG
-AGGTTGCCAAACTAGGCCATTTTGGCTCGGCCATATCTGGGGTAGATTTA
-CGGCGCGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAAT
-GTAGTTGGCCGTGTGGAGTACACGACTTTCCCACGCGTTGCCCGACGGGC
-GATTGCCAATGGAGCGCGAGAATCTCAATGAGGAAGGCCATGGCGCGCCA
-GAACCCCATGATTTTTAGGGTATTTCGAGGTTGGCAAATATTCTGGAATC
-TTTTTGCAAAATGTTTTTTTTTTTTTGAAAAAAAAATTCCAAAAAATATC
-CTGATCGATGAAAATTGTTGGGTGAAAAAAGTTGCAGATTTTAGGAGAAA
-TTTGAGAAATTAGAAAAATTAGAAATTAGGAGAAATCAGAAAATTTCCAA
-ACTGCTTTCAGAATACTTGTATATATTGAAATAGCCTAAAAATCATGAAA
-TTTTTCAAAAATCTCTAAACTAGCCTCCAAATTTGGTAGTAAAAATTCAC
-TGGCAGCAACTTCAGAGCGAGATTTTTCTAGTTTAAAGTGCTCGTATGTC
-GCTGAATTTTTTGTAGGTACCTATTTGAAAGCTCTTTTTTCAAAATTCAA
-AAATTTAATTTTCAAGTTTAAATTTTGAGTAGCGCCAGTGGGGGATTTTG
-TCTAAATACACTTATTATGATCCAAAACTACCTGAGTAATTGCCACTTTT
-TGACAGTAAATAAAACATTTACAAAAAAAAAAAGTTTTATTATGATATTC
-GGTCACTTTGGGACCAAATGAATGGTTTTTCATAATTTCCCCACTGGCGC
-TACTCCACCTTTAAAACTGAGCGGAAATACTTTCCTTGTGAGCATAGCGG
-CAAAAAACCTAGTACCACATGGCAAAAAAAAACCCACTCATTGTTAGCCA
-TGACAACTTCGATCTCATTCTCCAAATTGCCTTCTCCGTTCTCCTTGGTC
-GAGCAGCCAGTCAGCGGAATCTAAGCAAATAATGCCCAAAAATTCAATAC
-ATTCAATAGGCAAACCTTCAACTGATATTTGGTGTCCGATTGAAGCGTGC
-CATTTGCATAGATACACTTTGGATGGCCCGCGCGACTTTGTATCGTGCCA
-CGGAAGTTTTCGTCAAACTTGATTTTCAATAGGAAATCTGTCTGCAATAT
-TGAAGACGTTTTTTTCCTTTTGGGTGGTGACCTTCAAGGTTTTGGCCTGG
-GTTTTTAATCTTCCATTAAATGCCCTTCAAATTCGCTTTTTCGAGAGTTT
-AAGAGAGTTTCTAGGCCGAGGAACTTCTTGCAGCCAAATTTCTAAACTAT
-TGTGTTTTTGCCAAAAACAATGAAACATTTTAGGTCATTTGTGACGTCAT
-ATTTTTTCCATGCAACTTTTTATTGGCTCCACACATCTTCCAAAAAGCCT
-AAGCCTGAGCCTAATCCAATGTCTAAGCTTAAGCCTAAGGTTCAGCCTAA
-GCGTACGCCTAAGCCCAAACCAAAGCCTAAGCCTAAGCCTAAGCTCAAGC
-CTAAGCCTAAGCCTAAAAAAAACCGGAAAATCCTAAGCCTAAATAGCGTC
-AGTAGCAAGCTAACGCTCGCCACTGACGCCAAACCTAAGTCTCGGCTTAA
-GCCAAAGCCTAAGCCTAAGCCTAAACCCATGATTAAGCCCAATCCTAAGC
-CTACGCCTAAGCTTGAACCTAAGCCTAAGCCTAAGCCTAAGCCTAAACCC
-AAGCCTAAAATTTCTAGGCCACCACTAATATTTTCAAAACTCGATTCTCA
-AATACTTCATTTTTTCAGGATATGAAAGTAGGACAGAAATGGGCAGGGTA
-TATGGTATGGAGCAAATATCACAAGATGGCAGAAACATAGATACGGGGTG
-GGAGTGTTGGACTAGGTGACTTTTCTAGGCCATCCCTACCTTATCACACG
-CAATAGAAGTGTCCACAATGGCCACCGATCGAATCAGCGGTGGCAGCACC
-ACAACCACCGACCAAATGATCCAGTGCAGAATCATAAATTTGTGGAGGGA
-AAAATCGATAACAGTAGTGAGGGTAATAGTAGTAATAATACAAATATATA
-TGGAAAAATGAATACAAAAAGATGTGTGCGCTGGTTGGGGTGGTGGCGTA
-AGAATACAGGTGGGTGGGGGGTATAATTGGAGCGTGGCCGAGGAGGAGAA
-TCGCAAAAAAAAGAAGGAAAGAAAGAGGATAGTAATGACATGTTACGGTA
-GAAGGACAACTACCTAATTATATGAAAGAGGGGGGGGGGGCGACGAGAAG
-AGGAAAAAGTCTTACGCAATTTGCTACTCGACTTTCAATTTCTGCTAGAA
-ATCGAAAAAAAAATAGGAAACAAATTCCGACTCTATTCGATATCATCACT
-TCCGGGGCACGGCACAGGTCGGATCAGATTCAACGACGTCTCGCGATCCC
-GACCCTCTGATCTTACGGCCATCCCATTGTTCACATGATAGTCGATGAGC
-TCGGAGATGTTGCTGAACGTGCGATCGCGGGTTCGGACTCTCTGGAATTT
-TGAGAGGTTTGAAGGTTTGGCGGGGGGGGGGGGGGAGGGTCTTACGTTGT
-GATTGTCCAGTAGGATGAGATGTTTGTGCTCGTTTTCAGCGGTTCGGCCA
-CTCAGCACGTACTTGCCGGGCGTGTGGTCGCTTTGTCTGCAAGGAACTGG
-ACAAGTTTGAGCGGCCGACAGCTTGCGGGTCTTTTTTTAGAGAAGGGGGA
-CTGTGAGGTGTCCGCTGCTTCAGACAATCTTAGCATCATGCAAACCTTGC
-ATCTTTTGTATTTCAGGAAAAAAAACGCAGAATTTTTTTTGAACAAAAAT
-TTCAGCCTAAAACAAAAATCTAAAAAAATTTTGGGAGGATGAACTTATTA
-TACCAAATTTTTCCCTGGTCTTTCAAGAATTATTTAAAGTCCCGTGGCTT
-CTGAACATATTATCAAACAAATTACAGATATGAAATGTGACTGAAGCTTT
-AAGTCAGAAATATATAAAAAAAGGATTTTTCATACTATTTTTTCAGTCAA
-ATTTGATTTTTTTAGACTTTCAGATTTTTCTACGAAGTCTGTTAAAATAG
-GCTTATATTAAAAAGCTATCCGATTTACTATTAGTAAAAAATTATAGCGA
-CCGACATCTCGCAGGTTGTTAAAGAAAGGTGCATTGACCGGCTCACGCAA
-CTTTGGCAGTTTATATCTCGGCTGGTTTTGGTTTTATTTAAAAAATTTCA
-ATTGACGAAATATTTATCACTTTTTCTACTAAAAGTTTGCAGTTGAACAC
-TTTTTGCTAGCAGCGATATTAACCGAGATATTAGCGGAAAAAGTTACATG
-AGAAACATGGTGCATCGACAAGAAATATCTCACAAAACTTTGGCAGGTTA
-TATCTCGGCTGGTTGTGGTTTTATTAAAAAATTGTTAATTAACAAAATGT
-TTATCCTTTTTTCTACTACAACTTTGCAGTTCAACACTTTTTGCTAGCAG
-CGATATAAACTGAGATATGATTGGAAAAAGTTACATGAGAAACATGGTGC
-ATCGACAAGAAATATCTCACAAAACTTTGGCAGGTTATATCTCGGCTGGT
-TGTGGTTTTATTGAAAAATTGTTAATTGACAAAATATTTATCCTTTTTTC
-TTCTACAACTTTGCAGATGAACACTTTTTGCTAGCAGCGATATAAACCGA
-GATATGATTGGAAAAAGTTACATGGAAGACATGATGCATTGATCAGCTAT
-CATAGCTCATATTTTACTTATCTCAGGTTTTACCAAAAAATTGCCAATTA
-TTAAAACATTAGCCTTTTTCTTCGAAAATCAAATTTTGCCCGAATTGCCG
-AAAATATAGATTTGATATTTTTTTGTAGATTTAGGAGCCTAAACATTTTT
-TAATTTTTTAAGTATTGACCGTTTGCTTTTAAAAATGACTAATCGAATAC
-TGAAAACACAGTTAACTTTTTTTTCAATTTTCGAATTATAATTAGGTTTG
-AAAATTGCCGAAAATGTCGGCATTCAGTTGGAATTTTGGCAATTGCCGAA
-AATTTCCGATTCCCACGCGCCCCTGGTGTGAACCTAGTGAGCATGAAGCC
-AAACGTTTTAGAAATTCAGCAAAATTCTAGCTTTTTTCTATAAAAAATCT
-AAAAAACCTTACCGAACCAAAAAATCGCCTTCCGTCTTCAACAAAGCCTG
-TGCATCCTCTCTGGATAAATTTCCATGATACCAAACTTTCCCCACAACAT
-CCTCAGTTACAGTAGGTGCTCGGCAATTCGACACAAATGACTGTCGATGC
-AGGGAACTTCGATGTCTCATCGGCGGCGCCGGCACCGTAAATCCATCGTT
-AGAAGTTGAAGCATTCGCCTGTGCATCAAAAGTGTTCACATTGATCGCAG
-TGGTAAGGACGTCGATGAGCTTGTGCACATCCTCGATGAACACCACGTGG
-CATCGACGATCCGTTCCATCCTTGTTTTTTGCAATGTAGCCGAACATTAG
-CTCCGTGTCCGTACCCTTTTGGCCTTGGGCTCCGAATGAGAAGAATGAGA
-AGGGATGACGTTGAATTAGACGACTTTGTTTTATGATTTTGATCATTTTC
-GAGGAAATGTTGATGTCTACGGGGAAGTTTTCTTTTTTCACTTCACCGAT
-TACCTGAAAATAAGGATGGTTTACCTGGGCTTTTTCATCGACCCGTGAAG
-TGTCGGCTGCAATAATTTTAGTCGAAATTAGTGATAATAACTTTTCTATG
-AATAGCGGCTGACATCATTTAGCGCGATTTTTGATCGACCTGTAAGATGT
-CGGTTGCTTTAGTACATTCTATAGTGGCAGGCTTTTGGCTGAATTTTACT
-GGATATATAAGCTATCAAAATTTGAGCATGTCGATGCACCATGTAATTAT
-CTCAGTTTATTTCGCTGCTATCAAAAAGTGTTAAAATGCAAAGTTGTAGT
-AGAAAAAACGATAAATATTTTGTCAATTGACACTTTTTCAAAAAAAAACC
-AAAACCAGCAGAGATATAAGTAGTCAAAGTTGAGTCAGATATTTCCAGTC
-GATGCACCATGTAACCTTTCTCTAATAACCTGTGAGATGTCGGTTGCTAT
-AATTTTTTAGTCATTAATTTGGACAGCTTGTTAATTTGAAATAATTCTTG
-ATGATATCGTAGCGCGGCCGACATTTCACGGGTCCTTTTTTTTAAACATT
-TTGCAAAGCTGGTCATGCATTTTTGGTAACACTTAATATCAAATTAATGA
-GAAAATGTTTTGTAAATTTTTACCATTAGCCATGCCCAGAAAATGGCAAG
-TTTTTTATTTTATTTTCTTTTGTTTTTTTAATTCACAAAAAAAAACTCAC
-CCTACTAACAACTGGATTGATTTCTCGAGCCGCAGTCACGCCAACAGTAG
-CTGCAACGTGTTGTATACATTCTCTGAAAATTGAACAGTTACTTTATTAC
-GTAGATTTTTTATATATTTGAGCTTGCAGATGTTACCTGCCTTCATGCCT
-GCCTACCGCCTGATTTCTAAATTTTTGAATAAGATTTTTTTTTGATTTTA
-AGCCATAAGAAAAACTAACGAAACAACTTGAACTCTCATCTCGGAAACCA
-TCACGTTAATTGACTCGACTACTGGAACACTTCCGAGGTACTGAAAGACA
-ATTTTATATTTTCGGGGAAAAAACTAATAAAAAACTCACAGTAGCCGACA
-GAGAAACCCCGCTGCTCCGCAGCTCCTCTGCAAATGAGGGCTCCACGTTG
-AGCATCGCCGCAAGTTGATTTTTCGACGGAATTTTTGATTATTTTTAGAA
-AAAATCTAACTCGAAATTCGTTACAACCGAAATTTTGCAAGATTGAGTGA
-ATGAGGAATGACCGGGAGAGAAACGGAGACGCAGGCGGTGAGCGGAGTGG
-GAGAGAGAGCGCGCGAGACGGAGAGGCGCAGGCAGTGGTAGGGAGGAGAC
-AGGGAAAGATTAGATTGGTGTTGACTGGGTGAGTCAGCATTCTAATAAGT
-TAAGTTGACTCATAACTTTGTTTTTTGATCAGAGGGGGGGGGGGGGGGCC
-GTGGCCTAGAAATATCATTGCCTACTTATTACGTCACTAATGGTCTAGGA
-AACCTTGATAGCTTTTTTGGAGAAGATATGACGTCATTGGTGGACTAGAA
-ATCTTATTTTAGTTCTGGAAGAGAAATATTTTGACCGTGGAAGACAAATT
-AATGATGTGACCGGTGGCCTAGAAGTTTCAAATTATACCTGGGGAAATAA
-ATGACGCCACTGGTGGCCTAGAAAACTTAAACTATGCCTGAAGACGTCAC
-CGGTGACCTAGAAATTTAATTCTGGCGACGTCATAGAAATTTGAATTTTG
-ATGAGAAATATAATTTTATTGGTTTTCTGAAAATTGAATTTTATTGATTT
-TTTGGCAACCGGGAAATTGGAAAATTTAATAAATTGAACAAATGCAATAA
-AATAAGCAGTTTTTCAACAGTCATTACTTTTTTCCGTGAACCGTTTTGAT
-TTTAATTTGTAAATCTAGGTCGGAAAAGTCACACACACCGAGGAGCTAGG
-CTTCCCTCATCCTCCCTGGATCAGTCGGTAACTGCTTCGACTGGGGAGTG
-GGAGTGGGAGGGGTGGGATGAGTTCAATTCTTCTGGAATTCCATAATTTT
-TATTTTTGTTTTTTTGCGCCTACATATACCTGTGAAAATTGGAACTCGAC
-ACAAAAACCTCTCTAGCGCGGCTTAAATTTACTTCAATTCTTCCGGAATT
-CCATAATTTTTATTTTTGTTTTTTTGCGCCTACATATACCTGTGAAAATT
-GGAACTCGACACAAAAACCTCTCTAGCGCGGCTTAAATTTACTTCAATTC
-TTCCGGAATTCCATAATTTTTATTTTTGTTTTTTTGCGCCTACATATACC
-TGTGAAAATTGGAACTCGACACAAAAACCTCTCTAGCGCGGCTTAAATTT
-ACTTTCCTGTCCCAAAAACTCATCTATAATATTTTTAAAAAATCTAGAAT
-CCAAATCTATCAGATTTTTTTGAATTTTTGATTTTTTTCACATCGAGATT
-CGGAATCAGCGGAAAATTTGGAGTCAATTAAAAATATTTTCCAGATTTCG
-ATACTCCACATTTAAAGGAGATCACCTGAAACGCCAGAATATGATACTTC
-ATACTCTCCATCTTCTCGCTTTTGAAAATAATCAAAAAAAATAGTCGCCG
-TATTTATTGATATAGAAAAAATACCAACAAAATTGTAACTATTGATTAGC
-CATACAGGGTCTTTAAAGTCAACATTCATAGTGGGAGCTGGAAATAAAAA
-TATATAATAACTTGTTAAAAGAATTTATTGTGGAGTTATAACACCTATAG
-ACAATTAAAATCACCTGCTGCCTAAAGAGTATTTACCAGAAGCAAAGGTT
-TTCTGAATTTAGTGGAGTTTGTCCATTTACTTTTTTGCATGTTATTGAAT
-TGAAATGATACATAGTGAAACTAGAGGTAAAATTATTTACTAGGTTTAGG
-CTTAGGCTCAGGATTAGGCTTAAGCTTAGGCTTAGTTTTAGGTTTAAGCT
-TAGGCTTAGAATTACCGATAACTGATAACTTTTGCAAATTTAGTTTCTGT
-AATATCGGCAATAGCCAAAATTGCCGGAAATTTCTGCGATTCGAATAAAT
-AAATTGAAATAAAAATTAGTTCCTAAGATACATGTTATCTTTTTGCAGGA
-AAGTAGTAAACTCATGAAATGAGAAATTGCGATGAGGAAGGAAACATTCC
-TATGGTTCCTTAGACAATTTCTCACCTTACATTAGTATATAATATATAAA
-TGATGAATTTGACTTTTTGAAATTCTCTTCAATAAATACATTTAGTTGTT
-TTTTTTTTAATGAGTAAAGTTGCAGAGTGTGGAATTTGCTATGAGGAATA
-TGGTGAATATTGTTGGAAATTTTTCTGAAAGTTTTCATTTTTTTTGGAAA
-TTTAGAGAGTTGGGTGTAATTACTGAAAATTATGTTTTAAAAAAATTATT
-TTAATGATTTTTCAAATTTTACAAAAAACTCATTTTTAAATCATTAGAGG
-TGAAGTAGCGCCAGTGGGAAGATTGTTAAGATCCACTCCTTTAATCCGAA
-AAGTACCGAATATCATAATAAAACTTTTCAAAAGTTTTTAGAAACTTTTT
-TATTTACTGTCAAAAAGTGACAACCACTCAGTTTTTGCCACTCATAATTT
-TGGAAGTCGACCAAAAAAAAAATTTGTTTTCCTACATTTTTTATACTTCA
-ATTTTGTTTTAATTATTTGTATTGAAAAATTGTAGGGGTCGAAACATGCG
-ACAATCCTGTCAGTTTTCAAAAATCTCTACTTACAAAATATAGGACACGC
-TCCAAAAATGGATGTTTTTACAGACAACGCCATCCGAATCCCTTGCATCG
-GCACATGCGGTCATACGTTATGTGACAGTTGTCGTGAGAAAATTAGAGAT
-AAAAAATGTCCTCAGTGTAATCAGAAAGGCGCATTTGTTGTGAAAAATGT
-GAATAAACAATTTTGGGATTTAATTGTTTTTTCGCAATTTTTAAAACCCC
-AGGAAGTGGAAGTTGAGGAGACTGAAGAGGTTGGTTAGAACTTTTTTTTT
-GGATTTTTCGGTATTTCCGGGAGGTTATCCTTTGGGCCTAAAACTAGGCC
-TAAGAGTAGGCCTAAGCCTAAGCCTAAAACTAAGCCTTAGCCTAAAACTA
-AGCATGAGCCTGAGCCTAAGCCTAAGTCAAGCCTAAGCCTAAGTCTGCTG
-CTATCAAAAAGTGTTAAAATGCAAAGTTGTAGTAGAAAAAACGATAAATA
-TTTTGTCAATTGACACTTTTTCAAAAAAAAACCAAAACCAGCAGAGATAT
-AAGTAGTCAAAGTTGAGTCAGATATTTCCGGTCGATGCACCATGTAACCT
-TTCTCTAACAACCTGTGAGATGTCGGTTGCTATAATTTTTTAGTCATTAA
-TTTGGACAGCTTGTTAATTTGAAATAATTCTTGAAGATATCGTAGCGCGG
-CCGACATTTCACGGGTCCTTTTTTTTTAACATTTTGCAAAGCTGGTCATG
-CATTTTTGGTAACACTTAATATCAAATTAATGAGAAAATGTTTTGTAAAT
-TTTTACCATTAGCCATGCCCAGAAAATGGCAAGTTTTTTATTTTATTTTC
-TTTTGTTTTTTTAATTCACAAAAAAAAACTCACCCTACTAACAACTGGAT
-TGATTTCTCGAGCCGCAGTCACGCCAACAGTAGCTGCAACGTGTTGTATA
-CATTCTCTGAAAATTGAACAGTTACTTTATTACGTAGATTTTTTATATAT
-TTGAGCTTGCGATTGTGTAATCAAAAATAAACATTTGAAGCATGATACGA
-AATATTTGAACGATTTTTTTTCGGAAAATCAATAAATGAAAATGGAGTTT
-TTTTTTTGGATTTTAGCAAACTTCCCAAATGACGGAAAGATCATATGAAG
-CGATTATTTTTTCTTTTATAAACCTGTTCAGGATTTGCATTATTATGAGA
-AAATCCTAGGCCAATTAGGCTAGCATGTACGGAAGTATTTTTTAAAAATT
-TATAAAAGTAATGAAAAGCTGATATTTTCAAAATTCCAGAATGACGGAAA
-AATCATATGAAATGCTTTTTTTTTCTTTTTTAAACCTATTTAGAATTGTC
-AAAACTACCAGAAAATACTAAACAAAATAGCTTAGCTTGACCGGAAATAT
-TTTTAAAAAATTGATAAAAATAATGAAAAGCTGATATTTTCAAAATTCCA
-GAATGACGGAAAAATCATATGAAGCGATTCTTTTTTCTTTTATAAACCTC
-TTTAGAATTGTCAAAACTACCAGAAAATACTAAACAAAGTAGGTTAGCTT
-AACCGGAAGTAATTTTTACAAATTGATAAAAATAATAAAAAGATGATTTT
-TTCAAAATTCCAAAATGACTGAAAAATCATATGAAGCGATTCGTTTTTCT
-TTCATAAAATAGTTTAGAATTGGAATAATGATCAGAAAATACTAAACAAA
-GTAGGTTAGCTTGACCGGAAGTATTTTTAAAAAATTGATTAAAAAAACTG
-ATTTTTAAAAAATTCCAGAATGACGGAAAAATCATATGAAGCGATTCTTT
-TTTCTTTTATAAAGTAGTTCAGAATTAGCATTATTATGAGAAAATCCTAG
-GCGAATAAGGCTAGCATGTACGAAAGTATTATTTAAAAATTTATAAAAGT
-AATGAAAAGCTGATTTTTTAAAAATTCCAGAATGACGGAAAAATCATATG
-AAGCGATTCTTTTTTCTTTTATAAACCTGTTCAGAATTGTCAAAACTATT
-AGAAAATACTGAACAAAATAGGTTAGTCCTAGGAAAGACTAGTTAGGAAA
-GAATTCTTAAAATAGGAAGTTGAACAGAAAATCTGGAAGATCTGAAATCT
-GGAAAAAGGAACTCTCAAAAATTCAAATTTTGATTTTAGGAATATATGGC
-TGTGTAGTCTTCATAGACAATCAAAATAAATTATTTTAATTTTCAACCAT
-CTTTATGCACGGGCTTCTGTCCTTCCTCATTGAATTTTTCGCGCTCCATT
-GACAATCGCCTGCCGGACAACGCGTGGGAAAGTCGTGTACTGCACACGGA
-CAAATACATTTAGTTTTACAACTGAAATCGAGCCGCGACGCGACACGCAA
-CGCGCCGTAAATCTACCCCAGATAAAGCCGAGCGAAATGACCTAGTTCGG
-CAAACTCTTCCATTTCAATTTATGAGGAAAGCCAGAAACCCGTTTTTATG
-TAAAAGTTCATACTGTGCAGTTAATTTAAACAAATCAAAATTTGGAAAAT
-GATTTTTGGCTTTGTGCAAACTGTAGCGTTTTAGGCGTTAAAAATCTGCC
-AATGAATAAAAAATTTCTTATAAAATTTTTAAAAAAACAGTTATTTGCCC
-ATTCCGTTTTTCAACATTTATCAATTACGGTTCCAGTGATCAAATGCTTA
-CACGGAAGTCACTGATGACGTTGACTCCATGTTTGGTTGCGATGTGAAAA
-AGGTCGTTTTTTGCCCAAATCGAGAAAGGTCACACACACACATAGACATA
-CACAAAACCTTATATAATTTGTAAGATATTTTGTTTGATTCGAGAAAAAA
-AAGAGAACAGGTATTCCTGCGGCGTCGTTTTTCTAAACGGCAGGAAAAAT
-TGAGAGAAAGAAAGAGAAAGAAAAAAGATGGAAAAAAACAGTTTAAATAT
-AATTATTAGGTTTAATTATTAGGGGTGCACCATATTGTCGTAGGGGCCCT
-TCTCCAAAGTTTTAAGTTTATCGATAGAGCGTGAATACATAAAGAGAGAA
-ATTTGACCTGCAAAAAAAATATATGGTTGGTTCCCATGCCATAAAAAATC
-CATGCAACAAATGAAAACAACACCTGCCAAGTGTCCTCCGCCAGTCTAAC
-CAAGTTTTTCCCTCCAAATGTTCCGTGACATTGTTGTTTAAGGCTTTGTA
-CTTTCCGCAGCCGTCTTATTCTTCCCGAAGTGTTCTCCCTAGATAATCGG
-GTTTTTTTGTTGAATCGGCTGGGGGTAATGATCGGAGAAGATATATATGA
-AATAAATGAATAAAAAAGGAACACCTTTTGGAGAGGCAATGAAAAAGCAA
-GCTATGCAAAGTATTGATCCGTTGTTATGAATGGGCTTGCTTAGGCTTAG
-GTTTTTTTTAGGTTTAGGCTTAGGCTTAGGCTTAGGCTTAAGCTTAGGCT
-TAGGCTTAGGCTTAGGCTTAGGCTCAGGTTTAGGCTTAGGCTTAGGCTTA
-GGCTAAATCTAGGCTTTGGCTTAGGCTCAGGCTTGTGCTTAGGCTTAGAC
-TTAGGCTTAAGCGTAGGCTTAGGCTTAGGTTAGGCTTAAGCTTAGACTTA
-GACTTAGACTTAGGCTTAGGCTTAGGCTTAGGCTTAGGTTTAGGCTTAAG
-CATATACCTAGGCTTAGCCTTAGGCTTAGTCTTAGGCTTAGGCATATGTT
-TAGGCTTATGCTTTGGCTTAGGCTTAGACCGTGTGTATATCCGAATGTGT
-GTTTTATTATGTTCCTGATTCTGAAATCATTTGTTAGTTTAATATCTACA
-AACATTCCAAACAGTCTGTATGTGCTGCCAGGTGGCATTTCCTTAATCAT
-CTCAAATATATTTGGTTTCATTTCCCCCCATCGCAAAATCCCTTTCTTTA
-CCTGTCATTTCGCCTTTACGTTCAACTTATTTGATTTTGTTGTTTTCAAG
-TGATAATCACGATTAAACAACGAATGAAAAAAATAGGTATGGAATTACTA
-CGGTATTCTTTTTTGCCTATCCTTCTTTCTCTCATTTTCCTTTTGTCTTC
-TAACAAGTTCTGCACTTTTGAGGTACATTTCTTCTCCGATTTGATCAGTC
-AAAGCTATTCGGTTTAAACCATCTTCTATTCAATTCTGATGATTACTGTT
-AGGAACGAGTGGTCACTTAATTCAAAAGGTCGAACTGTTGTACTAATTGA
-ATTGGAAAATTTGTAGGTTATTTGACGTTTATCAGAAATTGAAGATTTGA
-TATAAAATTTGGTAAAAATGAAAAATAAAGTTTCATTTAGAGTAGTATTC
-TGGCTTCCCTTATAAATTGAAATGGAAGAGTTGGCCATATTGGTTCGGCC
-ATATCTGGGGTAGATTTACGGTGCGTTGCGTGTCGCGTCGCGGCTCGATT
-TTAGTTGTAAAACTAAATGTATTTGTCCGTGCGGAGTACACGACTTTCCC
-ACGCGTGGTCCGGAAGGCGATTGTCAATGGAGCGCGAAAAATTCAATGAA
-GAAGGCCAGAACTTCGTGTAGTATTAGCAGACCAGGTTTTCACATAAATT
-TGAGCGGTGAAACTAAAATTATGACATTTTTACGCAACTTTATGGGCCAG
-AAAATTTTTTTTGGAATTTTTTTTTGAAAAAAATTCAAAAATTTTGATAA
-AAATAATTGCCAAAAAGACAAATTTTGAGTAATTTTACTGCCTCTAAGAG
-TAATGAACAAATGTTTCCAACTTTTTGCAAATTACTTTCTTAGTTCCCTT
-GCAAATCTATATAGATTGAATTTGGCCTAAAACCTAACAATTTAGCTGCA
-ATATTGTTACAAAAATTTGGGTACAATAGTGTGTTTATTGAAACATGTGT
-TCTTGAAGTTGGGTAAGAACAATTGATGAAGGTTGTACCAAATGAACAAA
-AAATGTTTTTAGAGAAAGTCTGAAACATTACCTTATTTCTGATGGTCGTT
-AATCAAATTTTACTGTAACTGTTATGAAACCTTGGGCATCGTATTTTCTC
-TATTAGTGCAGCCGACCACTTTACTTTGAGACGTTATATCTTGTTTATTT
-TAAAGATCTCAATATTTTAATAACTACAAAATCATAGAAAAAGAACCAAC
-AAAAATTTTGTTAGTTGACAATTTTTAAATAGGACAAACGATAACTGAGC
-TATGAGCTGTCAAAGTTGAACAATGGTGGTGCAATAGAAGGAACTAATAG
-AAAAAATACGGTAACCTAAATTTTTATGTTAAAATAAGAAGTAGCGGGTT
-GATTCCAGAAGTTTTTTTTATAAGGTAACCATCCGCTGACCGCGCCTCCG
-GTATCCCTTCAAAAGGCAAAAAGTAAACTTTTCTAAAACTACAGTAATCC
-TACAGTAGTCCTACAGTACACCTACAGTACCTCTACAGTATCTTGACGTG
-ATCCTCTACCTACTCCCAACCCAGTACCTCTTCAAAGGCTAAAAAGTCAA
-AATTTCACAAACTACAGTAATCTTACCGTACTCCTACAGTAACCCTACTG
-AACCATTACAGTAATTTGACATTATTCGCCACCAACTCCAAACCCAATAC
-CTCTTCAAAAGCTAAAAAGTCAAAAGTTCACAAACTACAGTAATCCTACC
-GTACTCCTACAGTACTCATACAGTACTACTACAGCACCCCGAACATATCC
-CTCCACTAACCCCAAGTCAATATCACTTTAAATGACGAAAAGTCAATTTT
-TCCAAAACTACAGTAATCCTACAGAACTCCTACAGTACCCCTACAGTACT
-ACTACAGTACCCTGACTATGTCTTCCACTAACTCCAAACCAATATCCCTT
-CAAAAGACGAAAAGTTAATTTTTTCAAAACTACAGTTATCCTACAGTACT
-CCTACAGTACCCCTACAGTACTACTACAGTACCCTGACTATGTCCTCCAC
-TAACTTCAAACCAATATCCCTTCAAAAGACGAAAAGTCAATTTTTCTTTT
-TTTTAATTGAAATTGTCCGTTATTCCCTATTATGTAATTTTCCAAAAATG
-CTGCCAACCTCAAAAACTGTTATGTTTTTGTTCATACACATTTAGCCACC
-ACCTGCATATGACCCATAAAAAACCATACTTGACACCTGACATACTTGGT
-TTCGATACAAAAATCGAGAACATTTGGCAAACCTGAGTTGTCATTCTATT
-GGCTATTCACCATGTGCTCTAATAAAGTAGAACTTGGGAATATGTGTCAA
-GGCTGTAAATGGGGGAGTAGTATTGTTAACATATGTACTGTGCAATATTC
-CAGATGCCAAGTATACAGATTATCTAATGACAATAGGTAATTTGATTTTT
-CAGGTGCTATAGTGCTATATTGTTCCAAATACATGATTTTTTTTTAGAAA
-ATTGAGGTGTGGTGTCGAATGTCCCATAATTTTGGATAATCAATGGTCTT
-TAGCGAAATCCTAATTTGAAGCCGTTTAAAGCTCGAAAGTGCAATACATT
-TACAACTGCATTAGCGTTTTATTTTGCTCTGAAAATGACAAATACACAAA
-ATTTTGGATTAAACCGCCTGGTTTTAAAACCGAGCTTAAACAATTTTAAT
-TTTACAAATTAAAAAGTAAAAATTTTCTAAATTCCCTACACTAAAATTTA
-GCGTCCACATCACTTTCTACCCCTTAATTAATTTTTTACTACATTTAACA
-AAAATATTTTGAACCGGCAATTGTCAAAATTGCCTATTCCCAAAAATTTC
-CAAAACCGGCAATTGCCAAAAATTTTCAAAGCCGGCAATTGTCAAAATGG
-CAGCAAACTTCCAAAACCGGCAATTGCAGAAATTGCCTATTGCCAAAAAT
-TTCCAAAACCGGCAGTTGCCGAAATTGCCGAAACTGCCGCAAACTCCCAA
-GACCGGCAATTGCCGAAATTGCCGGTTGCCGAAAATTTTCGAAACCGGCA
-GTTGCCAAAATTGCCGCAAACTTCCAAAACCGGCAATAGCCTAAATTGCC
-GATTGCCAAAAACTTCCAAAACCGGCAATTGCCGAAATTGCCGATTGCCA
-AAAATTTTCAAAAAAATTTCAGAAATTGATACATTTTTTAATTGTTGTGG
-GAATTTTTTTTAATAAATTTGAAACATATCACATCCTCCTGTTTTCAAGA
-AAATTAATTCCTTCAGTTTCTGACGACTCAAATCCTCCTCAAATGCCAAA
-TTTATTTTGGGAAACTATACCAATTCTCAACAGAATTTTAAAGGTGGAGT
-ATTGCCATTTTGTCTAAGTACACTTATAATAATCCAAAACAACCGAATAT
-CATAGAAAAACACTCGAAAAAAAATTTTTTTGGTCGACTTCCAAAATTAT
-GAGTGGCAAAAACTGTGTAATTGCCACTTTTTGACAGTAAATTAAAAAAT
-TTCAAAAAAATTTTGGAACGTTTTATTATGATATTCGGTTATTTTGGGAC
-CAAGTAAGTGGTTTACTCCACCTTTAAAAATTTAGCCGTTATACAAACTC
-CAAATATATCCATTATTCTTTCCCCTATACCCTACCCATAACAAAACAGA
-AAAATTTCAAATTCGCATCGTCGCAACACCACAGCATGTCCATTTGGAGT
-GATGTTCCGAGAGAAAGGTCAAATCGTCTACCTCCTTATTCTAACCATCT
-CTATGCCTATATATGAGGCTTTAATGAACGAGCGCCGCCGCCGCGCGCCT
-AGCGCCTCCGAGTGTCGCAAAGTGCAACTTGTTTGCCACTTAACCTGAAT
-TCTACTGTGTTGTATTATGTGAAGAATCGGATAGATGTAATGTGTAACAA
-TAAAAAACCACGACGACGACTGAATATGGAATCGGCTAGGTGGTGCAAAA
-GTTTCGGAAAGTTTTGGTACCATGGTACCTGTGTAAGCTCTGTGAATTTT
-TGAGCCACGATGGGTCTTGCAACGATATTTCGTCGAAACTTTATTCTCGA
-AAGTTTGTTCAATTTAAATTTTCCGCAAAAAACATTTTTTGAAAATATTT
-TTAAAAATTTGAATTTCTCAGCATTTTTTTTTTAATATGAAGTTTCCAAT
-CCCTCAAAAAAAAATTTCAGAGAACATTTGAATTTCCCGGAAACCCCAAT
-TTCTGAGAATTTTTCAATTTCCCTTTAAAATAAAATTTCGGAGAAAATTT
-GAAATTCCCGCCAAAAATTTATTTTGAAATATTTGAATTTCCCGGCAAAT
-ATTTTTTTTTTTGAAAACTTTGATTTAACGGAAAACCCATTTTCTGAGAA
-TTTTTGAATTTCCAGTTTAAAGAAATTTCCACGGGTTTCTGGCTTCCCTC
-ATAATTTGAAATGGAAGAGTTTGCCAAACTAGGAAATTTTGGTTCGGCCA
-TATCTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTCGTTTT
-TAGTTTTAAAACTAAATGTATTTGTCCGTGTGGAGTACACGACTTTCCCA
-CGCGTTGTCCGGCAGGCGATTATCAATGGAGCGCGAAAAATTCAATGAGA
-GGAGGCCAGAACCCCGTGAATTCCAGCAAAAAACTTTTTGAAACTATTTG
-AAATTCCCACAAAAAAACAGTTTTGCTGAGAATGTTTGAATTTCCCCCAA
-AAATTTGACGGAATACTTGAAATTCAAAAAATGTTGTGAGAATATTTGAA
-TTTCACGGAAAACCTGTTTTCTGAGAGTTTTTGAAAATCCCTCAAAAAAA
-ATTTCGGAGAAAATTTGAATTTCCCTCAAAAAATTTCGAGAAATATTTTA
-AATTACCGGCATATTTGACATTTTGAACTCCCCACAAAAAAATTTTTAAA
-AATATTCGAAATCCCGGAATAATTTTTTTCACTATAGTCAGAAAAGATCA
-ACTGACTAACTTTTCACAAACTACAGTACCCCGAGCATAACCCCCATTAG
-TTTCCGATAGCTACAGTAATCCTACAGTACTCCTACAGTCCCCCTTCATA
-ACGTTACCCTGATTACTAAAAAATGCCCTTTTAATGCGTATTATCACATC
-TCACATGATTAAGACCAAAAGGGGTGTCCTTCAGATAAATACCCGTTCAA
-TTTTTTTTACTGCAAACCAGTAGACTTATCTTTTAGGTTATGAAGAGAAG
-ACTAAGTGTAAACAAGGTCGTTGGAAGTGATATGTTAAGAAGTTAACGGC
-AAAATCGATGCCAAAACTTTCTGAGCTTTGACTTCTACTGCTCAGCTCAT
-TCCATAACCATGAGCTCATCAACTTGCCCTCCCCCCCCCCCCACTATCTT
-CCACCACACTTTCATTCCTCATTGTCGCAACAAACCCATCTCCGGATTCG
-TCCTTTATATGTGTCACAACACAGGAGTACTCCTTAGCGCGCCAACTTGT
-AATACCCCCAGCGACTTGGCCCAGAAACTTTCCTCTAATCGCATCCACAA
-TATGGTCTGCAAGTACAAGATTAGCACCCCCCATTGTATGTCAATTTGTC
-TAGTTTTTTATTCCATTGAACTATTCCACAATGTAGAAAATTGGGGTTAT
-GGTACATCGAAACATGGTGCATCACATAATGGTGCGCCCAAATCATGGTG
-CATCGTCAAAAATAAGAATCCGAGTCCTCCCAGACATCCATGTAGGTATG
-CACTTTCCCGCCTGTTCCGCATCTAACCAACGATTAACTGAATCTTTACG
-ACCCTCTCTCCTCCGAATGATGTTGAAAAATGTCGCGCCAGCACCTTTGG
-AGGGGGGGGGGGGGGGGTTAAAAAGATTCCAATCTACCACCTATCTTCTC
-CATTTATCTTCAATTTTGCCCCCCGCGCTCTTAGATTAAATGAACTTTTT
-TGGCTAAATCACAGCACTTTTTATTAAATCTAGGAACTGCATCTAAACAA
-TGCATGTGGTTACAGTTACCGAAAAATGTTGAAAATTTGGGAAAAGTGCC
-AAAATGTTGAATCAAGTCAGAGAGATTCGAAGACGCTTCTAGCAATTTTT
-TGACAGTTCCTGTCCCCTTTCGGTAGATTTGCGGCAATTCTCGGCAGATT
-TACACCCGCTTTTGGCGGTTTTTCGGCAACTTTTAGCAATTTTGGCAATA
-CTTGAAAACTTCTATTTAGCAACTTTTAGTCAATTTTCTGTAATTTCTGA
-GAACTTCCGATTTTCTTTTACATTTTTTTCCGATGCACCATGTCCCGAAC
-GCTCGCGCCACGACTTTTTTATTCATTATAGCAGGTCCTGTTTTGATGCA
-CCATTTCCCAAAGAGCCCTGCAATGCTGGCTCATGTCACGATGTACCATG
-TCCTGAAATGTCCCACCACGTTCCGCAACGAGGTTTTACTGCCAAATTTT
-ATGCAATTCCAAAATATTTTTCGACAATTTTGTTAGCTTTTCCCTTTCAA
-AAAAGTTCAAAATTCTGTTCCAAAACCACACCAAAAAGTCGAAGATCCGC
-AAAATCTGCACTTGAAACACTATTTGACAACCCCCGTCTCAGGCTATCAA
-AAATGCATGCAGTCATATATATGTGCAGCTTGTGAAACAAAAAACGAGAG
-GGATCAGGGGCTCAGTGCTCAAGGTAGATGTGCAACTCTATGAAATTGAT
-CGGTTATGCATGGCAAGTAAGAGTGACAGGGAGCGAAGTATGATGATGAT
-GATGATGATGGTGTGGAGAGAGCGCAACGTATGAGTTATTGAATTTTCGA
-GAAAGGTTATCTTTGATGGGGGGGGGGGGGGGGGGGGGCAGTTCATGGTG
-CATCGAAATATAAAAACTTTCGTGGAGATACGCTTTTTGAAGAATTTTGT
-GACACCTTCTTGGTGCATCGAGACAGTTTTCGTGGCAAGACCTGATTTGG
-TTGAAACTCTGAAGCCAAATCGCGCTCTACGATTTTGTGACCAGGCCAAG
-GTTTTGGTGGCATGGTGCATCATAGTAAAAATTCAAATCCTGGGAAAAAA
-AGCTCTATATATAATATCCAGCCATGGACCGTACCTCCGGCGTGGCCCCC
-TTCTGGAGCTAAAAACTAATTTTTCTAAAACTACCGTAACCCTACAGTAT
-TCCTACCGTACCACTATTGTACCACTACAGTACCCCGACTATATCCGTAC
-ACTAACCCCAACTCACTATTTATCCAGAAGCCAAAATTTCACAGACTACA
-AAGACTACATAGACTACAAACTATGAACACACTGAATAAGCGCTTCATAT
-ATATAGTGAATGATGGTGAGATCCATGTGACATGGTGCATTGTGACAGGC
-ATTTTGGGAAGGGGGCTTTGAGCACAAAACAAAATCTTTAGTTATTTTTC
-CGACAATTTCCAATAAAGTGAAGTTTAACAAGGTCGTGGCGTACTTGTTT
-CCAGTTTCCTCACGAGTGTTGCATATTATACCGCCAGTAATCATTGCGTT
-ATCACATAGTTGACAACGGTTTGATAATGTCACAAAGTGTGGGGGTTTTG
-GAAGTGGCATCAAACCAGCATACGATTATTAGGACGTGATGAACTTATTT
-TACCTGAACATATTATTAGGTGGTGGAGCTGGGAGCTTAGTATTTGGGTT
-TTGAAACAATGCACCATGTCCTAAAAGATGCTTTATTGCTAGGTAGGGTG
-CCGCGACTTTTGTATTCATTATAACAGGTTCAGTTCCGATGCATCTGCAT
-TTTTTTAATACTGTTCTTATTCTTAGCTCAATAATTCAGGCTGAGGGCCG
-CAGGCCCGAACACTTTTGGAAACTGTGGGCCAGCTTTAATCCTATTCCAA
-GCAAATTGTTATTCGCTCAAGCCAACTAACCAGATTTCCTCAAACTTTAA
-TCGCTCATATCTCAGCTCAAAACCATAGCAGAGACTTCGTTTTTTAATCA
-ATCGATCCCAAATTTTAAGGAAATCTCGAATATCCCTATCTCAGGTTTGA
-GGCGAAGCCGAGAACCTGCGCAAGCTACCTTTTTGGGCATCCCCATTCCC
-GAAAGGCTGGCGCGGCCCTGCCGCGCTAGTCATTTGCCAAAACGTCAAAT
-TGGGTCATGTCACGATCCATAATGCCTTGAAGGGTTCTTCTGCAACAGTC
-CTAAAAGAAACTTAGCACTCTGGTTGAGGTATAGATGCACCATGTCCCAA
-AGGGTCCTGCCATGTTGGGACATGTCACGATGCACCATGTCCTGAAAGAT
-CCACGCTCGAAAACTACATTGTTCCGAGTGTTTACCTCTATTTCAATACG
-AAATTTCAGCAAATTTTCATCCAAAATCATGTCATTCTAACAAGAGCCTA
-TCATGTTGACTATAGGGTCGTGACGACCTGCTCGAGTTCGCCTCGCTCTC
-CTGTTATCAGAATAGCTATGCGTTAAGTACGCGATGTATTGACAGTCACG
-ATTTAACGCTTCAGTTTTGTAGTTTTGCTGGAAATTTTTGAGTTTTTCGT
-TTTTTCTTGGCTCAAATCGAGTTTTGCTTTTTTGACGATTAAATAATTTA
-TTCAAACTTAGCGCATTTTTTGACTGATTGTGAGACATGATGCATCGTGA
-CAGGGCTTAATCGTGGCGAGACCCTCTAGTACAAAATTCTTTTAAATATC
-AGTAAAAGCATTATAATCCATGATTCTATACTTATTTTATGGAATTTTCA
-GCCTTAAAAAAATCTGAAATTTACGATGCTAAAATCTACTCAAATTATAG
-TTTCAATCCAAAATTTCTCAGAAAAACTAAAATTAGCATAAAAATGTTTT
-GTCTGAAATAGCCCTAGATTCAAATATCCCTAACACCCCAAAAAACACCA
-ATGTACATCTCCTCTCCGTAAATATGTAGTTTTACAACCGCCTCTCTGTT
-GACTGGGAGCCATAAATGTAGATATATTATCTTTCCAGATCGCCTGCCGG
-CCCCTCCCACCTGATTGTAAAACTGCTCTTTGCTGTGGCGTTTTATCGAC
-TTGTTTTTCTTATATATTCCATTCTACATACCTTAACACATTTTCTTGTA
-TATTTTCTATACACTTTTTTAACTATAAAAAAATGCAACTCCTTTTTCTT
-CGATTTCTTTTTATGCAAATTTTTTGGCTTAAAGGTGGAGTAGCACCAGT
-GGGGAAATTGTTAAAAACCACTCCTTTGGTCCGAAAAGTACCGAATATCA
-TAATAAAACTTTTCAATATTTTTTTGAAATTTTTTTATTCACAGTCAAAA
-AGTGACAATTACTCAGTTTTTGCCACTCATAATTTTGGAAGTCGACCAAA
-ATGTTTTTTCTAGATTTTTTATAATGTAATTTTGTTTTAATTATTTGTAT
-TAAAACATTGTAGGACAAGACAGGGCCGCAACATAAGATATTGCTTTGAA
-TTTCCTCAAAAGCTCATATTTTTCAGAATTTTGGCAATTTGCCAAAACTT
-GGTATTTAAAAATTGTTAGAGATAACTGTATTTAGACAAAACATAGAACA
-TTTGTATTTCAAAATAGTTCAAAATTCTAGTTTTTGAAATTTTGCGGCCA
-GACTGACCCCCACGATGCACCATGACAAATTGCAATTTTTTTTTCAAAAA
-TTGTTTTCCAAAGGGGCGTGTTCCAAACATCTGACCCAAGTTTTCCCGTA
-GTTCTTCTCTCCCCCAGCGGGGTAAACACTGCACTTTACGACTCCGCCCA
-GTGCTTTTTTTTTCGCAGAAACTGAGAGAGAAAGAAACATCTGCGTCTCT
-CTCCCCCAGTACGCTCGTTCCCGCCCCCCACCTCGATCTGCCAGACCACA
-CCGACCTGATTCGAGATTCCTTTTCTTATATGTATATGTTTTTGGAGAGG
-TGATCTTGTTTTTTTTGTTTCTCCTTTGGTTTTGTTCTCTATGCTCTGAA
-CTTTGGTCTCCTACTTTTCTACAGTTTTTTTTTAAATATCCAAATTTTTG
-AAATAGAGGGTTGATCTACATGACCCCCATGCTTAGTCTACTATAATGCT
-ATATCTGATGTTCCTCCGAATGGCCTGGTAGGTGAAGGCTTTTAGCCCAG
-TGAGCCGGCTTACCAAGTCTAGGACCATGGTTCTTACAACTTAAGGCCCA
-AAAAAAGCAGGCATCTGGCCTAACTTCCCCCTCACTAAATCTGTAGTAAT
-ATATAATTTCTATCATACTCCATCTTTTTTTTCTACCTCTTATCATGTTG
-TTATTGAGCAGCAACGCCCTTATATTGTTTGGTATATATATTTGATATAA
-AACCTCGTAGTAAATTTTATTTTACACAACAACATTTATTATTTACTTTT
-TTCATACTATTTTTTTTTTGCAGAACGAAAAAAAAATGCTATTCACAATT
-GAGCAACTGGAGCTCATCAAAAAGCTGCAGCACACCGGGATGTCATCCGA
-TCAGTTGCTCAAGGCTTTCGGCGAGCTGGAAGTTCCAGAGCAGCTTCAGA
-ATAACAACACAATTGCCGCAGCCCTGTACAGCCCACTCCTGGTCCAACAT
-CTCACAACACCCAAATCAGAGACTCCAGTCAAACTCACCGTGCAGACAGT
-GCCGACACCTGTGAAGTCAGAGCCACAATCTTCAAATTGCTCATCACCAT
-TTGAGCATCCGATATGCTCGAATGCTCCGCGGCCGATTAGGAGTCAGCGA
-ACGCCGATGAAGGAGATTACCACACTGGACGATCCGAATGAGCTGGAGGA
-GTTTATGAAGCAGGGCGAGGAGGCGTGCATTTTGGATATGAAGACGTTCA
-TCACACAGTACTCGTTGCGGCAGACTACGGTAGCAATGATGACAGGTTAG
-TTCCCAAAAAAGTGTAGTGGAAGAGTTTTTTTTCTAAAATCTAGGCCGTG
-ACCAGAAATAAATCAGAATACATCCCCGGCGCCTAGATTCCTAATCTCTG
-CTGTTAGCCACAGTGCAATTGAGTATTACTGTAGTTGATTCCTTCTATGA
-CGTCATATGAAATAAAGTTGGCTAAAGGGAAAAGGGGACTCTGGATCTTA
-GGCGAGCAATTCTCTGCAGCCGGCACCAGAATCGATCCCCCGGTGCCTGG
-ATATCTATCCTTCGCTGTTAGCCACTGCGATATGCCCCACCCGCGCTGAG
-ATCGAACCGAGGCGTCTGAATTCCTAGGCGAAGTTGCTACCCACTGCGCC
-ATGTCAATCTTCTAAATTTCCAGGAGTAAGCCAGCCGTACATTTCAAAAT
-TGCTCAACGGCAACCACCGTGAACTATCGCTCCGTTGCCGTAAGAACATC
-TACTGTTGGTACCTGAACTGCCGACGTCATCCCAACAAACTCGCTGCCTT
-CCTCGCCGATCCGACAACTCGCCTCGAGACGAATGGAGATGGCGAGCTGA
-TCCCACAACGTCGAGAACGCTACGTGTTTCGTCCAATTCTGATCCGAATG
-CTCGAATCGTTCTTCACACAAACGCCATTCCCAGATCTTCCACGGCGAGT
-CGAAATAGCGAATGCTTGCAATCACGTTCTGAAGATGGATAAGAAAGGTG
-TTGGGTTGATGCCAAAGGAGGTGGTCAGCCCTCAAGTCGTTTCGAATTGG
-TTTGCAAATAAGCGGAAGGAGTTGAGAAGAAGATCCGCTGAAGCTTCGGC
-CGCCTCCACCTCGTCCGCTTCGTCTTCTGCGTCATCGACTGCTAATCATG
-ATTCTGTCAGTGTGTCCAGCATGAGCCCTCGCGATGAAGAGGTGAGAGTT
-TTAATTTCTCGGCCACGCTGTACTCTGGGTGGAAGAATTTTTTCTAGGTC
-TTATAAGGAATCGCCCTCCGGTTTTCCCACAAGTTAAGTCATAAACATGT
-ACCATCTAGAGGTTAAATTTCTGGAGTTTTATTTATTTGAGAGTGATGGT
-AAACCTGTCAGTCCTTGGCAAACATGTGTCTGTTTGGTCTCAAGGTCTAG
-GTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTTGGT
-CTAGGTCTAGGTCTAGGTCTAGGTCTTGGTCTAGGTCTAGTTCTAGGTCT
-AGGTCTAGGTTTAGATCTAGGTCTAAGTCTAGACACAAATTTCTAGGCCA
-CGAAAATTTCTGCCGTGGCCTAGGATTTTTTAGGCCATATTCTAGGCCAT
-GATCCAAAAAAAACTTTCCCTGTCTCCTCTAACCCATTTTTTTTGCAGAC
-AAGCTCCCGTAACACAACCCCGGAGACAGCAATCTCCCCGTCACCAGCAG
-TGTCCACTTTTGAAGTGTCCCGCCCGTCTGCCATCATCTCTGCCACGTCA
-TCAACAACCTCGCCAATCTCAATTCCAGCAACAATCATTCCATCAGTATC
-GCCGTCAGCTCTCGAACTTTTCGCCATGGCCCAACAGCTTGGAGTTCAGC
-TTCCGGTTCCATTTCCAACATTGCCAACACACTTTTTCCCGTTTCAAATG
-GCTCCGTTCTACGGGAACCCGGCTTCTATTTTGAAGTCTGAGTGAAGCAT
-TTCTAATTTTCTTTTCTTCTTTTCTACACCAATATCTTTTTTCCATTTAT
-TCAACTTATTCTTCATCCCATGACACGAAAACCTCAATTCTTTCATATTA
-CAAACGATGCTCCGTTTCTTACGCCCTGCCCCACACACGCCCCGTCGTCC
-AAAAATCAATCAATAATCGATTTTTCATAATATTTAATTTGTTTTTTTTG
-TGTTTCACTGCTGTTTTAATATTTGAAAAGTACGAGTTTCTTCAAAAACA
-TTTTTTGAATAATATTTGCTTCACACTCCACGCGTTTCGTAATGTATCGC
-TTGCCCTGAAATTTTGTTGGAAATTCCATTTTTTGTGCAATTTTTGTTAT
-TTTTCAAGCGAGAATAAATATTTTCTAGTTCTAGAATTCAATGAAATACT
-TTGCAAACGCGCCCCATTGCACTTGACCGAGGGGTGAAACAAGTTCAGTG
-TTTTCAAGATATTTTTTTTTAAAAACTTGAATTTGGAACAATACAAAAAT
-CTGTAAAATGCAACAGTTTTCCAAATCTTGTCCACGTGGAGTACACAATA
-ATTTTTCATCTATACGGAAAGATTTCAAAATTGGAATGTTAAATTATTTT
-GTGGTTTCTAGGCCATGGGAAAACTAGGCCATCAAAAAAATTCCAGAGTG
-ACCTGGAAGTTCTAAAACTTTGTTGAAACTTGTCCACGCGGAGTACACTG
-GTAGTTTATCAATAGAGCGCAAGTAATAATCCCTTGGAATTTTCCTTTCA
-CCACCCCCTCTCCATTTTATATGAGAGTTTTTTCCCTCGCAATTTCCCAC
-GCTCAAGAGGGTGGCCGCCATTTTTTTTTTGAGGGGGGTCGTATCTAGAT
-TTGAAACACGTCATTTATGCTCAAAATGTGCCAATTTTTATTGTTTTTGA
-GTTTCTAGGCCATTTTGGTAAGTTAGGCCGCATACTGACTTTGCGACTTC
-CAAGGATATGGCCTAGCTTTTTTTTCTAGGCCATATAATTTTTTGAGTTG
-CAACTGTGGCCAATGTTTTTTTTGGGTTTCTATGCCACTTGTGAAAAGTT
-AGGTCATAGAATAACCTTACGGTAAACGGGTCCTCACAATCAGGAATTGT
-GGCCTAGTTATTTTCCTAGACCACGTTTGATTTTTGTCTTTCTAAGCCAG
-GTTTGGGTCTAGCTCTAGACCTAGGTCTAGTTATAGGTTTAGGTCTATGT
-CTAGGTCTAGATCTAGTTCTCTCACGTGAGAAAATTAGGCCACCTTTCCC
-CCTAAACTCTATGATCTCAAAACTAAAACTACTTTCTAGAAAACTCTTCG
-AAAATCATAAAACCAATTTTTTATCACTATTTTCATGCTAAAATCCAATC
-AGAAATTGATCAGAAACACGCATATAAATATTACGACTATAAATTCATTT
-CTTTTTTTCATTTTTCCCTCCAGAAGGCTCTTGGCGAGAAAAATCTGCAT
-ATTTTTTCTACTTATATGTGTCGAGACATGTGATATTCCGGCCGGCGGTG
-GCTCTGAATGAATATTCAATTGAACGAGAAATATATATTCTCTCCAGAAG
-GCGTTTATATTATGTGTTGCTCCTGTTTCTGCTGTATTCGGCGTGGATTT
-GGTATGCTTCTCAGTGGAGTGCAGTTGCAGCATTTTTTTTCTTCAAATTT
-TGCAATACTCTCGAACTTTTTGCACTTTCAAGCCTTTTTTTGGGTTGCCT
-AGAACACTAGAATTTCTGGACTATTTTGAGATTTCTAGGCCATTCTTGAG
-ATTTCTAGGTCATATTGTGATTTCTAGTGCATTTTTGGGTTTCAAGGCCG
-AATTGGAAGTTTTAGGCCATTTTTCGGTCACATTTTTAGGCCACTTTGAG
-GATCTTGTGCCAAACTGGGATTTCTAGGCCATCATGGGATTTTTAGGCCA
-ATTTCGAGTTTTCCAATCATAATATAATTTCTAGGCTATCTTGAAATTCC
-TAAGCCAGTTTGGAATAATTAGGCCATCTTGGGATTTCTACGCCATTCTC
-GGATTTCTAGGTTAAACTGGAAATTTTAGAATTTTGGGGTTTTAGGTCAT
-ACTGCGAATTTTAGTCCACGGTTGGATTTATAGGCTATCGTGGGATATCT
-AGGCCGATTATGGAATCCTAGGCCAACTTAAAATTTCTAGGCCATTTCGG
-GATTTCTAGGCCATCACGCCTCCTAAAAGGCACAGACAAAGTTCAAAACC
-CACCAGAAAAAAGTGTGGTGAATTAGTCAGCAACACCCCATTTTTCTTTT
-CCAAAAACTAAAAAAAAAGATACCCCTGACAGATATGGGCAGAGATGGGG
-GTGCGAATCCTGAAATTTCCGAATTCCAGTGGGAGCTTTTTGTGCCAGAA
-AAAGTAGTGGGGGCAAGTGAGAATGTGTGTCGCCTTCCACTTTTCAAACA
-CCATTTTGTCCGTTTCGCCGGCCCGAAAATAGGCTTGAAAAGCTGTGGCC
-TAGAATTTTTTCTCAAAATTTTTGACGTGGAAGAATTTTAAGATTTTCGA
-GGCCAAGAGGTGGCCTAGAATTCAACATTTATTGGCAATTCTTATCTAGA
-TCCCGAACCCCGACCAGTCAGTTTTTAATTTCCGGTGTCTGAATTTTTAA
-TTAAAAATTATTTTTGGGAGGAGCTCCTGTTTTTTTTTCGTCAAAAAATG
-AAGGTGGCCTAGCTTTCTCATTTTAAGGCCACGAATTCTAGTTAATTTTT
-TGTTGGCTCATTTTTTGTTTCAAAAAACGAAAGTTAGTCAAAAACTTTTC
-TGCATATCAAATGCTCTTTTTGAGGTTTTTTCCTGCAAAATTTTTCTAAG
-AAAATTTGAATTCCCGCCAAAATTTTTCTCAGAAAATTTGAATCGCCGCC
-AAAATTTTTCTCTGAAAATTTGAATCGCCGCCAAAATTTTTCTCAGAAAA
-TTTGAATTCCTGCCAAAGTTTTCACAATGGGTCTCACCACGAATGGTGAC
-AGACCCCGCCCACAATTCTCAGAGACATTGGGTGTGTTTTAGACCAAAAA
-AATAGTTTTTTTGACAAAAACAATTTTCCAGCAAATACTTGATCAGTTGT
-CATTTGTCTGTTGAAAGTGGAAAAAATAAAACATCTTTCCTTTTTTCTGC
-TTCTCCCCCTCCTCGTCCTTTTTGTGCTCAAAACTCAAATGGCTCATCTC
-AATTGCATGACAAATTAGCAAAAGATGAGAGCAATTTTTCCCTGTTTCTC
-TTTTTTTTCCTCCGTTTGGCTCCTCCTCATGTCTTTTTTAGTAGTTTTCA
-GAGTTTTACTATTGAATGTTCAAACTGGCTAAAAAATTTTGATTTTTTTT
-TCTTTTTAAACTCTTACGAAAATTTTGATATAGGTTAGAAGCCTAAAATC
-GACGGCCGACAGCGTTTACATTTGTGGCCTAGACTTCCAAGCCTTGGCCA
-TGGCAAAAACTTGTTTAGCCTACCTTTTCAAATAGTGGCCTAAAAACCCT
-ATACTATTTCTGAACTAACTGTTTACTCAAAAGAGAAAGTTAGTGGCCTA
-ACTTTCTGAATGGTGGCCTAGAAAACTCAATTTTGGCACTTTCATGACCG
-GTCATCAACCTGACATTGATGGCCTAAGTTTTAATGAGTGGCCTAGAAAA
-CCAAAATATGGCCATGCGCTCAGCATGATCTAACTTTCCAACTCTGCTAT
-AAATTCCTTGGGGGAAACCTCGGCCATCACGGGTGGCCTAGAAAACTGAA
-ATTCGGCCAAGACCCCGTAATTCATGGCCTAACCTTTTAAAAGGACAGCG
-TTTGGCTTTGGTGGCCTAGTTTTTTGTGGCCTAAGTTTACAGAAAAAATC
-CTCAGCCACAACCTTTACCCTATACATGAAATCACATAAAAATGTCCAAA
-TATTTTCCAATTAAATTTCCAATTCTCCACCCTTAATTCTTCATTTTCTT
-TTCTTCTTTTATTCCTTTTTCACTCTCTCATTCTGAAACTAATCTTTTCA
-ATTCTCAGCTTCTCTTTTCTGGTGTGGCTCATTTTCACTTTGCTCCCGCC
-ATTTTCAATAGGATTATCCGTGCACACACACACATGGCTCAGTGAGCAAC
-ACCAACAAAAAAGAGCATATATAGATATACAACGATATCTAACTAGTTAC
-ACAGGAGCTTCTGTTGTTCTTCTGTGCCCCTCCGAGCCGAGACAAACTTT
-TGGAAAAGAGCAACGCTTCTGGAGCCGACATATTCGAGAAATCCCGGAGA
-CAATTGAGACCACTATGAGGAAATGATGGTCGAGGAGGAAATGAGAGATG
-GCGTTGCTCAAAGTGCGCGACGAATGCACCAAGTTGGTCGGTTATCAGTG
-AGTTTTTGTTTTTTGTTGGCCGAAGTAGAGATAACTAGGCCACCTAGGTA
-GGCTGACGATCTTCAGTTTGCAAATCCTCTTCCACCGCACTTTTTTGAGC
-GATCTAGGTTTGCAAAAGGTAGGCCGCCTGGTCCACCGTACCTGTCATGA
-TGGCAGAGGTCTGGGAAAGCTAGGCCACCTGTCTGAGCTGATGGTCTAAG
-GTCTAAAGTTTACCAAAAACTCTTCCACCGAAACTTCTAGGGCGACCAAG
-GCTTGCAGAAGCTAGGCCACCAGACTTGGCTGGTGGCCTAGAATTTTCAA
-GAACTCTTCCATCGTAAATTATTAGAAAGCCGCGATAGGAAAAAGCTAGG
-CCATCAAATTACCTTAGTGGCCCAGAATCTATAAAAACTCTCCCATCGTA
-CTTGCAAGGACGGCTGAGCTTGGAGGAAGCTAGGCCACCAGAATAGGCCA
-GTGGCCTAGAATCAACAAAAACTCTTCCACCGTACCTCCTACAATGGCCG
-AGGTAGGGAAAGATGGGCGCCAGGCTAATCTAACTTTCCTAGACTGACCT
-AAATGGGAGAAAACTAGGCCACCGGGTTTACGGAGTGGCCGAAAATTTAC
-AGAGACATTGCCCTGACTATCTGACTGTTTTTTTAGCGAAAGAACTTTCA
-TATTTTCTAGGCCAGGGGCCCCCTACGCCCCAACACAATCCAATTTTTTT
-TTGCAGATTTCTAAACTCGCACATTTGTCTCTGCATATCACTCATCCAAC
-TTCTCGTCTGCTGCTGGGCCGTTGCTCAGCACGTCAACTCCTACATGACG
-CACAGTAAGGTGAGCCAGAGTTCATTGGAGCGAATTTGTAACCAGAGAAA
-ATTCAAAACTTAAAATTCAGATCTTAAAATGTGATTTTCTGGAGGGGAGC
-CTCCCGCTGGAGGCCGTGGACGCTGTAATTTTCGATATCCGACTTTTCCA
-TTACCTATGGGGCATTCGAGGATGTGTGGCAGAGTATTTGGATGGTGGTG
-GGTACTTTTAAGTTTCCCACGAATCTTTACATTTTTCAGGCTTCGGGCGA
-CTTTTGTGGTGCGTTTCCCACTGCTTAACCCTGGTTTTCTCCATTCCGGT
-CACCTTCATCTCCCATCCGAAACCCTGTCTCTTTTGGCCGCTGCTTTTTC
-AGGTGAGTTGGCTGAAAAAATTTGGAAAAAAACTTTTTTTAAATTTTTTC
-CGAAAGGCGCAGTGGGATTTTCCACGACTACCACTCACAACAGCATGGTT
-CGAGTCCGCGTGGGTGTGAATTTTTTTTCTAGTTTTTTTTTGAAGTACGG
-AAATTGTATTTAGCCTTGAAAAATTCTAAAATAAGCAAACAAAAAAATCT
-CCGATCAAAAACCAAGTAATCCGTCTCCAAAAAGCGCAGCAACGTCAAAT
-GGTCCCACGGGGGGCCTGAAACGACAAATTTCCTGACATTTGACGGGTTA
-TCCATCCGCCACCCTCTCTTTTGAAGGAACATTGACTTTTTCCGTTGAAA
-TGGATAAAAAAATTGAAAAGAATTAGATAGATTCGGGAGAATGAATATGG
-TGGCCTAACGTGGTGCTTGACCCATGGCCTAGAAAACCAAAACTCGGTCA
-TCACCCTGATTGAGTGCCCCTTAAGAGATTAGGCCACGTACGACGCAATC
-CTAGGCCACCAATAGTTTTCTCGGCCACAGCCACCCCAAACAAAAATCTG
-AACTTTCTGATCCTTTACATCTGTACCCACTGAACCGTTTGTTTATCTTT
-TTACTCGCTCCACGGGAGCAGAACTTTTTTTTTGAAATTCCACAAAAGAA
-TGGGACAGACACTAGTGTATTTTGTTTTTTATTCAGACATGAGCCAGACC
-AGAAATAGGATTGAATCTCGGATTTCAGAGCCTGGAAAAAATCGGAAAAA
-ATCGGAAAACTGTGGGAGAACTGAGTTGGGTGGTAAATTTGGCAAATTGC
-CAAAATTTGGGGAAATTAACTTTTTCGGTAATCTGTAACTACAGTTTTCC
-TAAAAATGTATGAACCTTTTAGTGATTCTGCATAGTTTTTCAGGTCTTTA
-AAATTGAACCTACAGTACCCCGTACAGTTCAGAAGATTGCAAAATTCCAA
-GTTGACCACTTTTAAAGCGTGTATCTCGGCTGATTGGGAAAGTATCGGAA
-TATTTTAAAATACAAATTTATTGTTGGAAAATTTTTTTTTTACTTAAAAT
-TAATTAAAATTCAGCTTTCAAAAATGAGCAATGTATTTATAGATCCCATG
-CAACTTTGAAATTTTGTATATCCGTTCAGTGTAATGCTATCAAAAAATTT
-TCAACTACAAAATTATAGTAAAATTTAAAACAAAGAAATTGTTAGTTGAC
-AACTTTTTAATGAAATAAAGTACAACCGAGATATGAGTTCTCAAAGTTGA
-GCTACTTTATCGGCAACCACAATATAAGTCGCCCCCGTACAATGCACCAT
-GTGGTAGAAAATTTCGGTTTGATCTACTTAGATCTACAAAAAATGCGGGA
-GAAGAGACGCAGAGTTTTCTTTGCATAGCTAAGAACGTGCTGACGTCACA
-TTTTGTTGGGCAAAAAATTCCCGCACTTTTTTGTAGATCAAACCGTCGTG
-GGACAAACTGGTACCTCTTCGTTTTGTTGGTATGAAAATTTTGAAACTCA
-CTTCGTTTTGTTGGTATGAAAATTTTAAACTAGAAAAGCCAAAGTTGAGC
-TAGGCGCTCAAATTTGGTAGCATTTACTTTTTTCAACAAAAAAATAGCTG
-GCCGAGCTTTCCATTTTTACGGCCACGTTGCAATAAAAATCCAGGAGGTC
-CATGTCATCAACAAAAGTGCAAGGATGTAAAACAATTACACCGAAACGTT
-TGTCGGGAACTGCTTTTTCAAAAAAAAAAGGATCTCTCCGAACACATGTC
-ACCCCCAGGGTTCTAGCGTCTCCCTGACCTCGCGAGCTATTTCCTTGAGA
-CATATCTCTCCGAAACCTTTTGTAATGGTTGTTTCATGTTCTTCTTCATC
-TTCTTCTTATTCTTCTTGCTGGGATAAGCAGTTGAAGAAAACGAAAAGAA
-CACATAAAACACAGGCACACACACACACACATACACACCGTAATATCATA
-TAAAAGTGCGTCTGCGTCTCCCAGAGCGCCCTGGGGGTAAGGAACGCGGG
-CGCCCGCAAGGAAAAAGTGCAAAGAAATTAGAGAAAAAAGACCGGTCTCT
-CACTCACTTCTCGATCCCTTTTCTTCTCTAACTATAAAAAATGTGTGGCC
-TAACGAACGAAAGCGAAAAAAATCATCGAGAGAAGTAGTGAGAGAGAGAG
-AGAAGAAAGAGTTTTTTTGGACGCCGCCGCAGCTGCCAAGCATCAATAAT
-GACATGCTGGAGAAAAAAATTCCAAAGTTTAAATGTATTGGGGATCAGAA
-GCCTAGACCATAAGCCCCTTGTAGAGTTTTCTCGGCCATAGCCTTTTTGG
-TACGGTACATATACATAGAGACTTCAGATTGGGAATTGCGAATCTGTTAG
-AGTAAGAATAGGCCTAAAACATTATTGGGCCTAACGGTGACGGAGACTAG
-GCCTTGTTGGGAGCTTAAACTATGACATTGCCTAGAACGTTGTTCTATCT
-TGGTTATGTGGTGTCGGGCTTTCATGATCAGCTCCTCTACTTTTGTCCAG
-AGAAGTTTTGGACTTTTTCTATGGGTGCTTTGGGCTCTATTGCACAAATA
-GGTGATCTTGCGCACAACACAACGTAGATCAAATTCTTGTCTAGGCTCTG
-CAGGCTCCTGAGAGGTGTTTTGTACAAGCCCAAAGCAAAAGGATCTCAAA
-ATGTTTACAGGACTTCAAGCAGAGGATTTTTCGATGATTGCCAAAAATTT
-TGGAACTTTTATAGGCTTAAGCTTATGGTTATGTTTAGGCGTAGGCTTAG
-GCTTAGGCGTAGGTTTAGGCTTTGGCTTAGGCCTATGCTAGGCCTAGTAC
-CATAATACTATTCTTACCGCCGCGCCTGATCAAACCAAAGAGTAGGTCAA
-CAACCAATATTGACTTGCACTTTTTGCACGGTTAACTATATTACGCATAT
-GGCCAATTTTGTTAGGGAGCATTGATTCATGGAAAAAATTTCGGAATTTA
-TGAATGTTCAATTAAACTGGACTACGACAATTATTGGGTTCAAACATTTG
-AAAATTTTTTGGCCGACGTCGGAACGTCTCACTTTTTCCTGATTTTTGTA
-GTTTTTCCTTTTTACCGAATTTTTAGGAATATCTGGGAATTTCTCGTTTT
-CTGATTTTTTTTCAATTGTTTTTAGATCCCCCAAGCCTAAGCCTAAGCCT
-AAGTTTGAGCATAAGCATAAGCCTAAGCCTATGCCTAAGCCTACGCCTCA
-GCCTAAGCCAAATGCGGAGCCTAAGCCTAAGCCTAAGTCTAAGTCTAAGT
-CTAAGTCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTGCCGGAGCCTAA
-GTATAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTATGCCTAAGC
-CTAAGCCGATGCCTAAGCCTAAGCAAGTTCCGACATTTTCGACAATTATC
-TAAAAATCCTCTGCTTGAAGTCCTGAAAATCTTTAGGGATCCTCAAGTTT
-CGAGTTTGTACGGAACGGCCCAAACGCCTCTTGGGAGCCTGCAGAGCCTA
-GACAAGAATTTGATCTATGTTGTGTTGTGTACAAGGTCACCGGTTTGTTG
-TGCATCAGAGCCCAGAGCACCCACAGAAAAAAGTCCAAGAGTGTATAGCC
-TACGGTAGTCCTTGTTTAGGAGACATAGACAGTCTCTTTCTCTAACGGTT
-TTTGTTTATTCTTTTTTTTTCTCCCCCTACTTTCCGACAGACATTTTCAT
-CTTCATCTCCTTCTGCTGCGCGAATTGAATGGTCTATAAGTGTCTGCGTC
-TCGCCGATTCGTACAGTCTATCGCTTTGAAATCGTCACCCCCAGGCAAAC
-AGGACACCCGAACACACACACAACTATCCTCATTCTCAAAAAAATGGCTT
-CACTGCATAAAAGTGCAGAAATTAGAGAGTATGCGGAGATTCGGAGAATC
-CAGAGAGAACACACAAACACACTCGGAAACTCATATAGTTAGACCAGAAT
-GATGGCTTTTTTGGAAATTTGAATTGGAAAGGGGTTTTTGAAAATTGGTT
-GGAAGCATTTCAGATAGATTTACATTGAAAAAAATTAGCAGGAGCACCTT
-TTCCATTTTAAAAAAATTTGTTGGCTTTAACTTTTTTCACGGATTTCCGG
-CTTCCCTCATAAATTGAAATGGAAGAGTTTTTGCCGAACTAGGCCATTTT
-GGCTCAGCCATATCTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGC
-GGCTCGTTTTTAGTTGTAAAACTAAATTTATTTGTCCGTGTGGAGTACAC
-AACTTTCCCACGCGTTGTCCATCTGAAGATTGTCAATGGAGCGCGAAAAA
-TTCAGTGAGGAAGGCAAGAACTCCGTTTTTTTTCAATACTGAAAAGTCTA
-ATATTGAATTAATAAATTATTCAAACATTTAAAAACAATCATTTTTAGTG
-TTTTGAATTTTTTTTTAATTTCAAATTTTTCTTTAAAACATTAAAATTTT
-AAAAACATTTCCAAATTGTTCCAAATAACATTATTGAACTCGTAAAACAA
-ATTTAAAGGTGAATTTTCATTTATTTCGTTAAAAAATTACCTTTTAAAAT
-TTATTTTTTCAAAAAAATCTGGATTTTTTTTCTGCGATAATATTCGAGCA
-GTTTTTTTCGATTTTTTTTCTGAAATTCTGTGAAATTATTAACATTATTT
-GAATTAATTATTCAAACAATTTCAAACAGAAATACAACGAGTTTTTCCAT
-TTTTTATCATTTTCCAAAGTTTCAGAAAAAAATTTCGCAAAAAAAATTTA
-GATTTTTCCAAAAAAATTAAATTTTTGAAAAATTCTCAAACGCACGGATT
-TCTGGCTTCCTTCATAAATTGAAATGGAAGAGTTTGCCGAACTAGGCCAC
-TTTGGCTCTGCCATATCTGGGGTAGATTTACGGTGCGTTGCGTGTCGCGT
-CGCGGCTCGATTTTAGTTGTAAAACTGAATGTATTTGTCCGTGTGGAGTA
-TACGACTTCCCCTCCGACAGGCGATTATCAATGAAGCGCGAAAAATTCAG
-TGAAGAAGGCCAGAACCCAAAGTTTCACCGAAAAATTCGAAATAAAAAAT
-CCTGAAAAATTTTTTAATTTTTCCATAAAAATTAAAAATTTTTAAAAAAT
-TCCCAAATTGTTCCCAAGACACATTTCAGAGCAGGTTTCAAAAAATCATA
-TAAATTATTTATAAGGGTAACAACACAAAATTTGGGTAACAAGAGCAACA
-ATTTTTAATTAAATGTTTCATTTTTCATCAAAATTACTCAATTTTCCTGT
-TTCAGCAATCGGCCTATGGTATTTGCCTCCTGGTTCTTCTTCTAGCAGCT
-CTTCCAAGAATTGTTGTAGTACTTGCGTCTCCACAAGCGGCTCCGTTGAT
-TCCTATTCTGTTTTATCTTGTTGGCACCGCGCTCAATTTTTTTCATGTGA
-GTACTTGCTCACTTTTTTATGGTCTAAAAATTGGCGGGAAATTCAAAAAG
-TTAAGAGTTTCAAAAAGATCGGCATAAAATTTAAATTGAACATTTTTGGG
-GATTTTTTTGGAAAAAAAAACAAATTCGAAATTCGACCCATTTTGGCGGG
-AATTCAAATTCTTTTAAAAATTTCGAAAAACATTTTTCTGCAAAAAAAAA
-TTTTCATTTAAAAAAAAAACATTTTAAAAAGCAAGCTTTGCCGGGAAGAA
-TTCAAAAAATGTGGCTGGGATTTTGGCGCGAAATTCAAATTATTTTAAAA
-AATTTTTGAGAATTTCTTGAAAAAAAAACTGAAAATAATTTTGCGGAAAT
-TTGAATTCTTTAAAAAATGCCAAAAAAAAAAGATGTTTGTGCAGAAAAAA
-TTTTAATTTTTAAAAAGCAATTTTTCACGGATTTCTGGCTTCCCTCATAA
-ATTGAAATGGAAGAGTCTGCCGAACTAGGCCATTTTGGCTCTGCCATATC
-TGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTAGATTTCAGT
-TGTAAAACTAAATATATTTGTCCGTGTGGAGTACACGACTTTCCCTCCGA
-CAGGCGATTATCAATGAAGCGCGAAAAATGCGAAGAGGAATCTGTTCTAA
-AATTAGGCGGGAAATTCAAAAAGTTCAGGGTTTCAAAAAGATCGGCGAGT
-TTCAAAAATGTCAAAAATATTTTTCTGCAGAAAAATTGTCGACTTTTTAA
-TAAACTTTGCCGGAAAGAACACGTGGTGTCAGAGTGTCCGGTTTGATCTA
-CGTAGATCTACAAAAAATGCGGGAGTTGAGAAGCAGAGTTTTCAACTGAT
-TTCGAATGGTTAAGAACGTGCTGACGTCACATTTTTTGGGCGAAAAATTC
-CCGCATTTTTCGTAGATCAAACTGTAATAGGACAGCCTGACACCAAGTGG
-AAGAATTCAAAAAATGTCGCTGGAATTTTGGCGCCAAATTCAAATTACCA
-AACGGTATTTAATACATAGAGCTTCTCACTCAACATCTGAGCTACCGGAA
-ATTAACAACCTTCACATTTTTTGGTCATTACTCACACACATGTGGTTTCT
-AAGCAAGTTTCAGATACTTTTTTTTTTGTTTTTTTTTGAATTAATACTAT
-TTTTTGCAAAAGTCGCTTCGGGACCCAAAAAAAAAATTCAAATTCTTTTC
-AGTTATACGTGTACTGGCACTGGTATTGGCACGTGAGTGCCATGTGGAAT
-TCGGTGGTCCGTGTAAAGTTCGGACAGCGGCTCGAAAACGCGAATAAGCG
-AAGTCGACGGGATAAGCCGATTGTGCCGAAGGAGGAGATCGATGATGCCG
-TTTTGCATTACGTGCCAGCGAATAAGCCAACTGAACAGCAGAATCATGTT
-CAGCACAATCATATCAGTCAAAACGGGATTCAGCAACCAAAGGTAGGTCT
-ACCTACCTGCCTATTTTCCTGCCTACTCGCCTAAGTTTGTCTAAAATCCA
-ACTGCTTGTCTGTTCTGCATACCAATATGCCTAGACATACCCACATTTCT
-GCTCATCTTCTAACATGCCTGCTCGCCTAACTTAATGCTGTATGCCTATG
-TACTAGGTTACTGCCAGCCTGCCTACTTGCCTACCTACACAAATGCCTAT
-CTGACTACATCTATATCTATGCTTCTCTATGCATAAATGCCTGCCAAAAT
-GGCTAACTGCGTGTCAAAGTTCATGCATGCCTGCCTACCTGCCTACGTGC
-GTACATGCCTATTTGCTTACCTAAATGATTACCTGCTTACCTACCTGTCT
-ACCTGCTTAAGAGCCCTACTTATTTGCCTACCCACCTGACTGCGTGTCTC
-CTCTCTTTCTGCCAATCTAGGCCTACATGTCTATCTAGGCCTATATAAAT
-TCCTACCTGCCTACCTGCCTAAATACCTACTTGCCTGGCTATGTCTTCTT
-ACCAACCGTTTTTTTATGCCTACGTACCTGCGCGCATGCCTACCTACGTG
-CCTACCAACACCTACAAATACCTGTCCGCCTTCATCACATTTTTCACTTT
-CAGGTAATCCTTCCACCACCGAACCCCTACAACACCGCGCCCACACATTA
-TCGACGCCGATCCTCCACAGAAGCCCACCGCTACCACCCACCTCGGCAAC
-CGAGAAGCTCGGCGCCAACCCACCACCGAGTACCGGCCGACTATCCGAGT
-GACGAGGAAGACGACTATGATGATACGGAAGGAGACGACGCGGATATTGA
-TGATCTACCCACACCGCCACCGCCGATTTACGCCGTCCGCCTGACCTCCG
-ATTCGTGGGAGAATCAGATGAGCCGCCCGTCGGGTAGACGGCGGTTACCG
-GCGACTCCGAATTTGCCGAAACATGGAGAATTGCCGCAGATATTTAATAT
-TCCTCATGCTAATGTTTAATCAAATTTTTGGGGTTTTATGGGTTTTGGAT
-TTTCGGAGCGGAGCTTCATTTATCGCTTTAATATTGAATCAGGGGTGGTT
-TTCAATTCTGGCAATTTGCCGGTTTGCCGATTTGCCGGAAAATTTAATTT
-TCGGCAAATTGCCGATTTGCTGTTTGCGGGATATCAGATTTTCCGAAAAT
-GTTTAGAGGGATTTTTTATAAGACGAAAACACTAAAAACTGTGTCTTTTT
-GAATTTTTTCCACTTTTTCTACATATTTTCATAGAATTTGCTTACTTTTC
-AAATTGCCGATTTGCCGGAAATTTTTAATTCCGCCAATTTGCCGATTTGC
-CGTAAAAAATCGTTTGCCGCCCACCCCTGTATTGAATTATCCGGAACACA
-GCAACACTCTGAAATTCGAGCATTAGTTAAATGTGATATTTGAAAAGTTT
-TGCAAACAAAATAATTTTCCCCAGCTTTCATCATTTTTTCTTTCAACAAA
-AAAAAACCGAGTGATATTATGATTTCCAATTTGTGCTATTTTGAGTTTTA
-TTTTATTTTATTTTGTTGTTTTCAATAAATAAACGAATATTTTTTGGTCA
-TTTTTTGGCGCTATGAAACTAAAAAATTTCAGGTAACTTAGCGGGAAGTT
-CGTTTTTTTTTCATTTTGGCAGGAAATTTCATTTTATAAAATGGCAAAAA
-CTTTTCGTTAAAAGTTTTTAAATTTTGAGAAAATTGACGAGAAATTAAAA
-ATTTCAAATTTTTTGGCTCTAAATTAGGATTATAATTTTCCGAAAAAAAA
-TTTCCGAATTAAAATTTGGCGTCTCAGTGTGTTATTCAATTAGAAAAACC
-TTCAAAATATTAAGACATTTCGGAGGCACGTGGTGTCAGAGTGTCTATGC
-TCCTTTAAATGATGCATTCAAAGGCGCTTACACACCTGCACGTAATCTCT
-TTTTTGTCTCAAAACAAAAGGAGCTTCAGACTCTCATATCTCTGCAACTC
-TGTGTGAATAACAATTGGAGCCCCAGAGCTCCCGGCTCCACACTGCCCGT
-TTCCATGGAGACACTCCGATTATTATGGGAGCCACCACTGCTCGCCGAGC
-AGCAGCAGCAGCAGCCCATTGTTAACCCGATGACCAATATCTATATTTGG
-GTCCGGACCGCCCGTTCCCTTCAGTTTTTTTATCCGACTATCGATGTGGA
-GGCCGATGGGTTCGGTTGCTTCTATGAGATTTGTTTGGAAATTGTTGGCT
-TGTTGGAGGAGTGCGATAGGATAAGGTAAGCGTGCTCTATTGATAACACG
-AATTTTTGTGATTTTCGGCAACATGGGATCGTGGTTGCCCAAAGGGAAGG
-AAACGCGCCCCATTGATAAAATCATTTCGCAATAGAGCGCATTTTCATCA
-TTTTTTTGCAGTTTTGACGAATTCGAGACCCTCTGCGAGAATAGAATATC
-GGAAGTTTATGTGGAAGCAATTTTTCAAAATGCTGTGGAACAAGGAAATG
-TGAGTTTTTTTGTGATTCTGATGCTAATTTAGCAAGTGCGCTCTATCGAC
-AATTATGACTTTGTGCACGTTCAAGTATTTTCTCAAAGTTTAACACAGGG
-TTCTGGCCTTCCTCATTGAATTTTTCGCGCTCCGTTGACAACGGACAACG
-CGTGGGAAAGTCGTGTACTCCACACGGACAAATCACATTTAGTTTTACAA
-CTAAAATCGAGCCGCGACGCGACACGCAAGGCACCGTAAATCTACCCCAG
-ATATGGCCTGGCCTAGTTCGGCAAAAACTCTTCCATTTCAATTTATGAGG
-GAAGCCAGAAATCCGTGAAGTTTAACAAATTGTGAGGTGTAGCAAACACG
-CTCAAGTGACAATTTTTACTTTATGCGTCATAAATTTTTTTCTGAAACTT
-AGAAAACGCGCTCTATTGCTACTTTGAACGGAAAACGCGCTCTAATGTCA
-ATTTTATTTCCAGATAAACGCCCGCCTAAAGCTTCTCACCTTCTCACTTC
-TCTTCGCAGGTCTCCAACAAAAAACTAAAGATCTCACAAATTCCATCAGG
-TCGGACGTGGTCTTGACACGAATTTCAAAGTATTTTGGTAAATTTGAAGA
-ATAATATTTGTTATTTTTTTGTTTTCCGAACTTTACAGGCCAAATATTCA
-AACTTTTGTTCCAATTAGACGTGGGCCGCCGGTTACAGGACAGAGAAATT
-GTGCACGCCATTGGAAATGGGCAGGTGAGAAGTTCGGCTACAAAAACGTG
-ACGCGTGGCCTAGAAAGATTTGTTTTTCCACAGCTTTTTCCACAGCTTCC
-ACAGCTAACGGGATGGCCTAAAAAACTCCACGGTCGTTTAGCGATAGAGC
-GCACTTGCACATTTTGGGAATCTTCTGGAAGAAAGTAAACGTCACAAAAG
-GCCTAGAAATCTTTATCGTGTGTGGTTTAAGAAACAATTCTCGGCTTTGA
-AATTATGGTTGCTCGGGGAAAAATGATTGTTAGAAGCCGCACGCTTGCAC
-GCTTGCACAGCTTGGGAATTTTCTGGAAAAGAAGTGACGTCACTGGTGGC
-CTGTAAATTTTCGCCATGTGTGAATTAACAAAACAATTATGGGCTTTGAA
-ATTATCGATTTTCACGGATTTTTGGCTTCCCTCATAAATTGAAATGGAAG
-AGTTTTTGCCGAACTGGGCCATTTTGGCTCGGCCATATCTGGGGTAGATT
-TACGGCGCGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAA
-ATTTATTTGTCCGTGTGGAGTACACAACTTTCCCACGCGTTGTCCGGCGG
-GCGATTGTCAATGGAGCGCAGAAAATGCAATGAGGAAGGCCAGACCACGT
-GAAAATCAATAAGTTTTTCAGCAAAAAATGAAAAATGAGGAAATTTCGTT
-AATTTTAGTTTTGTTAGCAGTAGTGCGCGCTCACATAGTTCAAGAATTTT
-TTTTTGAAGAAAAGTGACGTCACAGATGGCCTAGGAATCTCATCTATGAC
-GTCACTTCTCTTCCACTTTATCCTATTTTCAGGGCTATGAATTCCTGGAC
-ACCCTATTTGAGGGAACAGTAAAGCACAGACATGGAAACTCGAACCATCA
-CGGCGTGCGCCCCCTTTCCCATATAATCCCCCAAATTCTCGAAAAAGCGA
-GCAGTATATCCCTACCATTTTTGTGCAATGAAATCCGCCGACACCTTATC
-AAAGACCCGTATCATATTGATGAGTTCTCAACTGACAAACCTGCTCAAAT
-ATTTTCGACGGCTCGCCGAACGACACTGGCACATAATAGTCGACGGGTGG
-TACACTTGCATTATATCAATCGAATTGAAGTGCTGCGGAAGGATGAATTT
-GCGAATGTTCACCTGAGAATTTGTAATGATAAGATTAAGGCGTCGTTCGT
-TTTTGTTCCGTTGAGGTGAGATTTTTTGGCCGAACTTTTTTTTGTTGCTT
-TTTTTGAAAAATTTTTAAGAGATTTCATTTTTTTTTACAATAATAGAAAA
-ATCAGAAAAAATATTCACGAAACCAATAAGTGGGCGGAGCATCAAACTGG
-CACGCTCATTTTCCGTAGATCGTTTCTGCCAAAATCGAAAATTTCTTGAG
-CTTTCTTGAAAAATAACGCTAAATTTAATTGTGAATTTATTATTATCTCG
-AAAAAAATTATCAAACAGTCGAAAAGGGGCGGGCTTACATTTTTTAGCCC
-CGCCCACTTTTAGATTTGTTTTGTTGAAAAATGTCCAAAACTGAGTTTTT
-CTCGGAAAATTTGAATTCCCGCCAAATTTTTTTCCAGAAAATTTGAATTC
-CCGCCAAATTTTTTCCAGAAAATTTGAATTCCCTCCAAATGTTTTTATTT
-TCAGAAAATTTGAATTTCCCGTCAAAATTTTTTTCCCAGAAAATTTGAAT
-TTCCCGCCAAAATTTTCCCAGAAAATTTGAATTCCCGCCAAAATGTTTTC
-CAGAAAATTTGAATTCCCGCCAAAAAAAATTTTCTCAGAAAATTTGAGTT
-TCCCGCCAAAAAATTTTTTTTAAAAGAAAATTTAAATTCCCGCCAAAATG
-TTTTCCAGAAAATTTGAATTCCCGCCAAAATTTTTTCCAGAAAATTTGAG
-TTCCCGCCAAAAATTGTTTTACTGAGAAAATTTGAATCCCCCCCCCCCCC
-CCCCCCCCAAAAAATTGTTTTACTCAGAAAATTTGAATTCCCGCCAAAAA
-TGTTTTTTCTAAGAAAATTTTAATTCCCGCCAAATTTTTTTTTAGAGAAA
-ATTTGAATTCCAGCCAAAATGTTTTCCAGAGAATTTGAATTTCCCTCCAA
-ATTTTTTTTTCTCAGAAAATTTGAATTCCCGAATTTTATTTTTGAAAATT
-TGTGTGAAATTAAATTTTTGGGAATATTCATTGTGGCCTAAGTTGCTCCA
-AATGGAAGAGTTTTTTAAAAATTAATTTCTCGTCCACGCGTCAATTGTAT
-GCAAGAAATTCGAATATTTTCCAGATGTGAAACCGTATTCCTCGACAGAC
-TTATGTACACAAAATGGATAGTTCTTGGCGCAGTACGCGGCATTGTAATT
-GTTAAAAATTGTCAATCGACCCGAATTTCGGTGAGCTGCGACCAGCTGAT
-TGTGCTCGATTCGAAAAATATCGAAATCTACGCCATGTCGCCGAAGAAAC
-CAATAATTTTCAACAGCTCTGCGGTAACTTTTGCCCCATTTAACACGATT
-TACGAGGTGAGTTCGGTGGGGCGCGTTTGCATTTATGAATTCGAAAATTT
->CHROMOSOME_II
-CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC
-TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG
-CCTAAGCCTAAGCCTAAGCCTAAAATAGTGACTCTGGCAGTTCTCTAAAA
-TAAGTGACTCTGGCAGTTCACCAAAAATTGTGACTCTGACCGTTCACCAA
-AAATAGTGACTCTGACCGTTCACCAAAAATAGTGACTCTGACCGTTCACA
-AAAAATAGTGACTCTGACCGTTCACCAAATATAGTGACTCTGACCGTTCA
-CCAAAAATTGTGACAATGACCGTTCACCAAAAATTGTGACTCTGACCGTC
-ACTATTTTTATTGAACTGCCAGAGTCACTATTTTTAGTGAACTTCCAGAG
-TCACAATTTTTAGTGAACTGCCAGAGTCACTATTTTTAGTGAACTGCCAG
-AGTCACTTATTTTGGTGCACTGGGGTGGGTCACGCCCCCAGTTCTCAGTT
-ATGGGTACTCTGATCCACTCGGGACCCACTTTATCGTGTTCCCCGTGCCT
-CATTTACCCTAGAGCTTCCTCCTTTACCTCTCCTCTCGCTATCTCTAACA
-TTCCAATGGAAACTCCTATTTGAATTACCGCCACCGATGTGCCCGACGCG
-ACTTACTGTTAGCCCTTGTTTTGCACAAATCTGTTGGCTTCCATATTTAA
-AAGTTAATTAATGACCCAATGTTCTTTTTTTCTCTAAATCTCCACAAGAT
-GTTCTGTTTTCCCTACTGGACACTATCGTTCACTGCGTCTCACCAATTCA
-CATTGTCTCTACTTTACCTTTTTTGTCATAGTACACGTTCGCCAACGGTG
-TCGACGGCCAAATGCTTTGGGCAGCGTTTGCTTTTTTTATAATTAGTTTT
-ATTTTATTAAAACAATAGCTCTAAAGTTTACAAGTCATTTGTTATAGGCT
-AAATGAGTTATGTCTAATAAGTAATTTGAACTAGATACTTCCGTGTAAGT
-GACAATGTATCGGAAAAGTCCTCAAAGTGCGATGTAGAAGTTCACATGTA
-CTTTGTTTGGCATGTTAGTAAAAGAGCCAGTATGCTGATTCATTTTATAT
-TCTATATACTCATGTAATATGCCCATGTAAGGTTTAATTCCAAAAATATG
-AGCGTGTTCTATTTTATAATATTTTACTAAAATACCTTTCAGTTAATTGC
-ACTCAAATTTGTTGTTCTTCATTCTCTCGTTATGATTTAATCTTATTGCG
-TCAAGGTCATTATTTTAGGTCCATTAGTTATCGATCTGAAACATGTTGTT
-GTATTTTTCTATTCTTGTGAGCTCAGGACACCTCATACAACTCCAGAGAA
-AATGTGTCTCATTATTCTTGTCTTTTTTCAAGATCTAATCAATTTTCTAC
-ATTAACGACGTTTTTGTCGTTCTGCTTCTTTTTTTCGTTCGTTTGTCTCG
-TCCATCAGCTGTCCACTCATTTCTCTCCCACTCACTAGGCAGTGCTTTGT
-TTGGTTCCGATTGGCAGCTGGCTGCAGGGCCTGCATCTCTTCTATGTCTC
-TCATTTACTTGCATTCTTTTCTTCGTTAATTTTTGTTATGATATTTAAAC
-GGGAAGAAGAGTTTGTGGTTCTTCTTTTTATAATCACTAAAACTTTTGGA
-TAAGTAACAATTTTCTGATAAAAATATTTTCACGGCGAAGAAAAAAGAAA
-AAGAAGAGTAGTTTTTGCACGTTTTCATATAATTATTTTCGTTGATCAAA
-TGTTCTTCTGGAGTTTTCTAATAAATTTCTTATCGACTTTTTTTCAGAAA
-TTTTTCTCAACTTGTCATGTCAATGGTAAGAAATGTATCAAATCAGAGCG
-AAAAATTGGAAGTAAGTTCTTTATAATTTCATTTATATACTATAAGTTTT
-CTCGATCACAGGAGAAACAAAAACAACAGACAACACAAAAAACAATAAAA
-CAATATTGCTCTAGTAATCAATAGTGTTGTAAAGAGGGAAGAAAATTGTT
-ATCTGTGTAGCAGTCAACGTTGATTGAGATGTTGTGTTTGACTATAGAGT
-TGAAAATAATAACTTCAAACTTGCAAGTCATGACTTATCAAACACTGCCG
-GAACTTATTCTGGATCAAAGGAAAGTTGTCCAACTGTAGAGTCATGTTTT
-TCAAAAGAAAACACAATTTTTAAGTATAAATATTTTGAAAAAGTATGTTT
-TAGAAGTATGTCAAATTAAAAAAAAAATCCTTGGTTAAAAAATGATTTTT
-TTGGATATATGTGTATTTTTAACTAAAAATATATACTTTACATATATATT
-TTGGCGCAGTTATTTGATCTATAAATCAAACTTTTTGATAGACATTTTTT
-TATATTTACAACAACTAGGGTTGTTATGAAAACGCCTATTATTCTACAAA
-CTAAATTATTTTAATCATACATTCCCCACTATCTAAAAACTAATGCAATT
-TTCAGATTTTGTCATGTAAATGGGTAGGATGTCTCAAATCAACAGAAGTG
-TTCAAAACGGTTGAAAAGTTATTAGATCATGTTACGGCTGATCATATTCC
-AGAAGTTATTGTAAACGATGACGGGTCGGAGGAAGTCGTTTGTCAGTGGG
-ATTGCTGCGAAATGGGTGCCAGTCGTGGAAATCTTCAAAAAAAGGTATTT
-TTAATTTAATGTGCATTTTATAATATAAATTCTTCAGAAAGAGTGGATGG
-AGAATCACTTCAAAACACGTCATGTTCGCAAAGCAAAAATATTCAAATGC
-TTAATTGAGGATTGCCCTGTGGTAAAGTCAAGTAGTCAGGAAATTGAAAC
-CCATCTCAGAATAAGTCATCCAATAAATCCGAAAAAAGGTATTCACAATT
-TGCATGATATTGTTATAATCTAATTTTCAGAGAGACTGAAAGAGTTTAAA
-AGTTCTACCGACCACATCGAACCTACTCAAGCTAATAGAGTATGGACAAT
-TGTGAACGGAGAGGTTCAATGGAAGACTCCACCGCGGTAAGTGTGTTTCT
-TTAAAAATTACTTCCTTTTTTCAATTGTTTGAAATTAACAAGAAACCTGT
-TGGAGCGTATTTCTGAACTTTTAAATCGAAAATATCATTTGCAAAAAAAC
-TTGAAAATTGAGAAACTTTTTTAAAAGTGGAGTAGCGTCTGCGGGTTTTT
-TTGCCCTAAATGACAGAATACATACCCAATATACCGAATATAACCGTAAT
-AAAATTATGCGATTTTTATTTTTATTTTTCATGAATGTTAGGGGCAAAAA
-ACCCACATGCGCTACTCCGCCTTAAGAAGAATCAGCTGTGAGCACTATCC
-ACTATACATTGGAAATTTACAAATAAAATAGAGATTAAGTAATATAATTT
-TTAAGGGTTAAAAAAAAGACTGTGATATACTATGATGATGGGCCGAGGTA
-TGTATTTCCAACGGGATGTGCGAGATGCAACTATGATAGTGACGAATCAG
-AACTGGAATCAGATGAGTTTTGGTCAGCCACAGAGATGTCAGATAATGAA
-GAGTACGTTGTTTTGCAAATTGATTAAAAGTGGAGTAGCGTCAGTTAAAA
-ACTCTAACATGTCTTAGGTTTTTCAAAAGTTTGGTCAAAGTTTTGGCAAA
-CTGCCAACTTCTTGAAAACTTCGTTAAAAAAATTCTTGAAATGATTTGAA
-AATTTGTATTATGTTATTCTCTTATTTCTGCACTATTCTATATGGCGCTA
-CTATACTTTTAATTGATTTCTTGAAAGCAGTTCAATAATAATTAATTTTA
-GAGTATATGTGAACTTCCGTGGAATGAACTGTATCTCAACAGGAAAGTCG
-GCCAGTATGGTCCCGAGCAAACGAAGAAATTGGCCAAAAAGAGTGAAGAA
-AAGGCTATCGACACAAAGAAACAATCAGAAAACTATTCGACCACCAGAGC
-TGAATAAAAATAATATAGAGATAAAAGATATGAAGTAAGTCGAAATTGAC
-AAACAGTGGTTTTTGTTTAAGTTTATTGCGAAATATTCAAAATTAGACAT
-GTTAAAATTTTGCGAGATAATCTAAAGATTAGGTATACAGATTTTTTCAT
-GTAAAGTTACATTCATCAAAATTTTTGTGTTCACCAAATTAGACAAAAAA
-TGTTAGTTACACAGTATATTTATTTTTTATATCAATAAAACCTTTTTCAG
-CTCAAATAACCTTGAAGAACGCAACAGAGAAGAATGCATTCAGCCTGTTT
-CTGTTGAAAAGAACATCCTGCATTTTGAAAAATTCAAATCAAATCAAATT
-TGCATTGTTCGGGAAAACAATAAATTTAGAGAAGGAACGAGAAGACGCAG
-AAAGAATTCTGGTGAATCGGAAGACTTGAAAATTCATGAAAACTTTACTG
-AAAAACGAAGACCCATTCGATCATGCAAACAAAATATAAGTTTCTATGAA
-ATGGACGGGGATATAGAAGAATTTGAAGTGTTTTTCGATACTCCCACAAA
-AAGCAAAAAAGTACTTCTGGATATCTACAGTGCGAAGAAAATGCCAAAAA
-TTGAGGTTGAAGATTCATTAGTTAATAAGTTTCATTCAAAACGTCCATCA
-AGAGCATGTCGAGTTCTTGGAAGTATGGAAGAAGTACCATTTGATGTGGA
-AATAGGATATTGATTTTATAACGTGTAATTGAGTTTTGGCCAAAAAGGTA
-TGGAAAGGTGGCTGTTTAGTTATATATTTTTCTATTATTTATTTGAAACA
-TGCAAAATTGAAGTGAACAATAAGTGATGTTCATGGAAATTTAAACTGTT
-TTATGATACTTTTTTGAGAAATTGAAAAATCTGTTCATTTTAGAAACAAT
-GTCCACATGGTTCTAAGAGCTAAAATTTTTATTTTCATCCATTTAGAGTA
-CTTTCTCTTTTAGAGTACGGCCCCAGAGCGATGTTAGAAACCTGAGATCG
-GTCAACACAGACCGTTAATTTTGGGAAGTTGAGAAATTCGCTAGTTTCTG
->CHROMOSOME_III
-CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC
-TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAAAGCGCGAAATCCTATGAA
-ATTTCAAGGATTTATAACTTTTTGAGTCCGAAAAGAGTCGGAAATCAGAT
-AAAAATAAAATCGGGCTTTTCGACCAAAATTAGGCCTCGAAAAGTCTGAG
-AAAGCACGGAATCTATGGATTCACGGCTTTTTGATTCCGAAAAGGTTCGG
-AAAGAGAAGAAAATCGATAAGAATCGATAAATTTGCAGAAGTATTGCAAA
-TAAATTCCGATTTTCACTAGAATTGCGTCATTTGGGCGCAGAAAATCGGG
-CTTTTCGACCAAAATTAGGCCTAGAAAAGCATGAAAGGGGTCCAAATTCT
-GAGATTTCGCAACAGTTTTTGGACAAGGTTATCCCGGAAATTAGCGGGAA
-GCACTGAAGATCGAAAAACTGAAGATCTTGTCGTTGAGAATCGTTCAACA
-GCGTCAGTTACTACTGAAAAACTGATTTTTGAGCAGAAAATCTGCCGAAA
-TGTCCGAAATCGGACGAAAATCAGTGGTTTTTTCGCCAGGAACTCGTAAA
-CGAGCGGGAAAAAACACTAAAATAAAATACATAATCGACGACGGCGTCGA
-AAAATGGACTTTGGAGGCGATTTTGAGATAAAAATCGCCTCTCTGAGACC
-GCGTCACCGCAACTCGTGCCTCCATCTGACTCAGGATCCGAATCCGGCTA
-ACGAGTATACTCGAGCCGGTTCGGTCGATGCACCAATGTTGACACCCATG
-TTCTTCGGGGAGTCAGACCCGATAGGTAACAAACGTGCGGCTTACTTAAT
-GACGCGCGGAGGATACGGAGCTAGTACGAGCGGTGCGACTGATGATGCAT
-AGGGAATAACAGTACACAAGCTTGAATTAATCCAAGTTTATTATCGAATA
-AAAGGATTAATCAAAGAAAAAAGGAGGAAAGGGCGAGCTGCATTGGGAGA
-CGACCTTCCTCGACGAGAGTTGTTGAAGAATTGAATGGATCGTAGGCCAG
-AGGCCTATAATAATTATTGTGTGGATTTACGGGCAACGACACTCCGGAGT
-AACGCTAGTTAGCGAAGGAGCGCGGTTGCATCTGAATAGCGCATATTGGC
-ACGTAATTCAAATTAGAAAAATTACTAAAATGATTTAATTAATATTTTTA
-ATAGAACGAATGGAATATAATCAGCAAATGGTACAAGCGGACGTCACAAC
-ACATTGCTTAATAATAAATTTCCAACTGAAACCAATAGATTCAGCCTTGA
-CACAACTGATCAGAAACTTGTTATACATGTTAAAATACTCGAATTCATAT
-TCATCGCCACCAGAATAATTGGGTTTGAACACTCTTGCAACTTCAACTGA
-GATGGTACCGTAGATCCAGAAGATGCATTGTTGGAATGTACTTCTTCCCA
-AAAGGTTCTGAGATTTAATTGATTTTTAACCTGGGCCTAAAAGTCTCACT
-TACGTACATTTCTAATATTTAAGGCATTTAGTGCTGAGAAGTATTCGACA
-GTGGCCTCGATGTTTTCAAAGTGGAATAAATAGTGAATTGGAATAATGTT
-GAAATAATGACCAAAAACTTTACATTCTTTTGATTTTTTCCACTGATCCA
-TCCGAGTAAGCTGCTCAAAGTCATCGATTGTTTCAAGGCACCACAATTCA
-ATACTTTTCAACTCTTGAGAATCGAAATAGGGCAGCGTAGATATAATATC
-ATTGGGTGACACAAAAATAATCGATAATTCCTTCACATGAATGCATTGCT
-TAGATCTGAGGATGTTCAGAAAATATGTGGTAACGTTAAGGTCTTGTTGA
-GTTTGTACAACAAATTCGAATTTCCTGACACGTCCCAGTAATATTCTCAA
-ATCGTTGAAAGCTAGTTGCATGAAGTTATCTCTTCTGATTACTCTCTTTC
-TTCTGTGAGCCACAATCGAATTCCCGGCATTGGTGTAAATGATTTTCATT
-TTATCAATCCGCATTTCAACTCGACCATTGCATACCCAAAACGAGATAGA
-ATCAAAATTAATTCCATTTTGAACAACGGCAGCTCTCAGACTTTTACAAA
-TTTTGAGGTGAGTGAGTCTGAAGAATAATAGCTTGGTTATGATTTTTCAA
-AGTTAGGGTACCGAAATCTTGGAAATATTTTTAATTGACTCCAAATTTTC
-CCCTGATTCCGAAAATCGATGTGAAAAAAATCAAAAAAAAAATTCCTGAT
-TTTATATTTAAGCTTGAAATCACGCATTTCATTTGCGCCCCGGTCTCTTT
-TTCAAATTCGCGCCCTAATAAATTTGCATTGGAGCGCACTTGCATCGTGT
-CATTTTCTTCGTTTTTTTCATTTATTTTAGCAGAATTCAATGTTTTAAAC
-CAGTTTTATTCATTTGTGGAGAGTTTTTATCGGTTTTTTTTTGACTAAAA
-TGAAAAAAGGGTCCAAATGAAAATCGAGATGAGCTAAGTCAAGCTTAAAT
-ATAAACCAGGGAAATTTTTTGATTTTTTTTTTCACTTTGATATTCGGAAT
-CATGGGAAAGTTGGGAGTCAATTAAAAATATTTCCCAGATTTTGGTACCC
-CACCTTTAAATCAAAATAAAATCAACTAACTGATCCACTGGCTTTAGCTT
-TTCCAATACTTGACCAAGGATCTCTGTGGGCATATCGGAAAGAGTAGGGG
-AAATGTGATCCTGGCTGTAACAATCAAATTGCCATTAACCCAGTATTTCA
-ACAAAAAAAAACTCACAAATTCATATATCGCACAAAATTAATTGCCCACC
-ATTTGTCAAGTTCAGCTCCACGTTCTTCAGTCAGAGCACGTCGGGCTTCT
-CGGCTGATTGTTACCATTTTCAAAAGATATAATTTCTTTAACACAGAAGT
-TAAATAAAATATGTCCGATAGCAAAAAGTAGATGTGAATGAATTGAAGAA
-GAACTGAGAAATAGCTAAATATCTATGTCTTAATTTTCATAGAGTTTCAT
-TGTCAGATACTACAATGTTACTATTGAGAAAAATGTCAAACTGATAAGAA
-TAGCAGCCAGCTTAAAATGAAAATTTGATAAGAAATTGCTGTCTTAATAT
-TAATTATATTGTCGTCAACAAACAGAATTTTCACTTGCTAGTTGTTAGTT
-TAAATTATATTTTGATACCGAAAAGTGTTTGAAAATGGGGGGAAACTAGA
-AAATAAAGTTTTCTACATATTCCATATTTTCAGAATTGATTTCAAGATAT
-GTCGGAAACAAGCCAAGAAGCTCGACGTGCACTGACGGAAGAACGGGGAA
-AGGTGCTTGACAAATGGTGGGCAATTAATAATTTGAGATTCATGAAATTG
-TGAGTTTTTTGGAAATACTGGCTTATTGGCAATTTGATCGTTACAGTCAG
-GATCCCATCTCCCCCACGCTTTCCGATATGCCCTCAGAGATTCTTGTTCA
-AGTTTTTGAAAAATTTGATTCTATAGAACATTAAGTTGCTTTGACTTTTA
-CAACAAAAATATTCGGTATAAAAATGTTCTGACTTATTTGTCGAAAAGTT
-TGTCGAAGTCTGAAGCCCGCCGTGGAAAAAATTGAAATTCATTTTGATTC
-TATTTCGTTTGAAGTATTTAATAAAAATGTTATTATGAAATTGGATGGAT
-TAAAAATTCTCTACAATGATGTCGCAAATGGTGCTTCTATAGTGGCTTAC
-AATAACAAGGAAGCAATGATCAAAGGAGAAAACTTCCTGAAACTAGCTTT
-CAATGATTTGGGAATACTACTGGAACGTGTGAGGAAATTCAAATTTAAAA
-TCTATGGAGACGATGTACATGCCATTGCCACATTTCTTTTAAATGCTCTC
-AAAGCTGATCAGTGTGTTCACGTAAAGAAAGTAGTGCTTTTTTACGTGCC
-ACTCATTGATATTTGCTCAATTCTCTCGTATTTTGATTCTGAAATGTTGG
-AAAGAATTGACTTGCGTTGTAATGATACAAACGCTCATTTTGAACAACTT
-GCTCAAAAAAAATTCCAACGAACAAAATGTGTAGAACTTTACAAACTTTT
-TAATAAAGATTTCCAAATTTTTATACAGATTCACTAAATTTCCAGAGTTT
-TCCCACAAACCGACACACAGACCGACCTGGTAGTGGAGAGGACAACATCT
-TTATTCAATCCAGTCAGTGAAGTGGAATTAAACTGGGCTTCAAGGAAGAA
-ATGGCACAACGGAAAAGGTCGGGAGAAAAACCAAAAGTCGGAAAAATATT
-TTTTATTGAGATATAATTTTTTTTGGTAGAAACATTTTTCTTCGAATTTA
-AATTATATTTCGCGCCAAAAATAAGATTAAAAACCAAAAAAAAATCCGAG
-TGTGGAGAAGTATTTTCGAAAATATTCCTCTAATAATACCCTTTAACAAG
-GGCTATAATAATGGAATTTCGGGTGCTTGAAAATGAGTTTTTTGAGATTA
-GAAGTATGAATTTTTGTGTCTGGTGTTAAGTTATTTAAGTTATATTGAAT
-GGAAATTTTAAAAAAATTCTGAAAAAATATTTATAATTGTTATTTGAAGC
-TACTATTTCACCTGGAAACTTCTAGAATTTCCAATTTTTTTAAAAATTTT
-TTAAAAATTTTTTTATTTTCAATATTTTTCACATATGATACAATTTATTA
-TGAGATTTTCGGAATTTTTTAAGTGAAGTTTTTCCCTAAAGTTTTCAAAA
-TTGACTCGAATTTTCTGGAATTTTTTTTTTCAAAAGAAACACAGCTTTTG
-TTTAATTTCCAGTTAATTTTTAGCTTTAACATTAAAAAAAATTTCTTTCA
-TTTTTAACAAAAATTCCCCTTCTTATTTTAGAATTCAAAGCCAAAAACCT
-TCAAATTCAATTTTATCTAAAACCTCCTCAAATTCGAAAAAGTGTGAGAG
-AGATACGCGAGCTACGAAAAAGAGCAAAAATCTGAGTTTTTGAGCACTTC
->CHROMOSOME_IV
-CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC
-TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG
-AAGAGACCAAACCGAAAAATCAATTTTTTAAACGAAAAATCAATGTTTTA
-AACGAAAAATCTATTTTTTAAACGAAAAATCAATTTTTTAAACGAAAAAT
-CCATAAAAAATTGTTATAAAAATTCTGGAAAAAAAACTAAAAACTTAATT
-TTTGCTTTGAACATTCATCTTTCGCGAAAAAAATTTCAGCAAATAAAACC
-GAAAAATACAATTTTGCAAATAAAAAATCTAAATCAACAGTAAAAAACAA
-AAAAGTCAAATTTCAATAGAAAAAAAAATCAAAAATCAATTTTTACTCCA
-AAAATTCAACTTTTGCCAAAAACTAACCCAGAAAAATCAATTCACAAAAA
-AAAACAAATAAAACTGCAACGATGTTTGTGAAAAAAATTTTCTTGATATT
-TTTAACGAATTTTTGTTTAAAAAAAATGCATTTTTGGCCATAAAATTTTT
-TTTTTGATTTTTTCAAACGAATTTCCCCTCAATTTTCTTGCAGATCGACG
-TGGATATTGACGACCTAGATGACGATTTTCTCTCCACAAACGGAATGGAA
-CGACACGGTTCAGAATTACAAGGAGAAGTGGTTTTCACTACGACGAGTAC
-TGCGAATAACAATGTGAAACGAGCCGTCGAATATTTCGAAGATGATAATC
-AAGATGATGCACTAACATCCACTTCATCCGGCAACAGTACACAGAAGGAA
-TCGTCTCCGTTCACAGATTTTGATGATGTTCCGCCGCCACCAGTGGCTCC
-AGAAACTCCGGCTCCAGCCCAAAACCGCCGAGAATCTGCGTCCCCCGAAC
-GTCAATTCCTTGATGAGAGTCACCTCGGCGGAATTGGATCTCCGTTATCA
-CAGAGTACAAGGCTCGATGAGACGTTTATTGAGGAATACTCTATTGAGTT
-GGACACCTCTGGGAAGTATGTGTTGGGAAAAAAAATCCGAAAATTGATTG
-AAAAATTCGAAAAAAAATCCAAAAAACCTTTTTTTAATGAGATTTTTTCT
-GTGCAAAAATTTAAATTTAGAGCTGAAGAATGTGCACTTCTAGAAAAACT
-TATTTTAAAAAATTCACATCCTTTTATCAAATTTATTAGCATATTTATAC
-AAATTGATGGATAAAAATTCCAAAAAAGTTCCAGAAACAACATTTCCTCC
-GCAGCTTCACCTGGTCCCAAGTCTCCATTTGACGATGATTTTACTGATAC
-AGCTGCCCCGGTAGCCCCGCCACCAGCACCTACAAAAGCTGCCGAGGAAT
-ATCGCCGGCAACCACATCAGAATCCGTTTGATGAGGAAGAGGAAGAAGAA
-TCACAGTTTGGAGGGGGAACTCTGTCCGGTAGAGACCCATTTGATGAAGA
-TGTACGTTTTTCGTAAAGTTCGGAATTTTTAGGGTATAAATTGAAAAACA
-AATGGAGAAAATATGAATACCTAGATTTTTTTTTTCAAAAAATCCCAACC
-CTAATATCCACAATTTTTTTTCAGTCTGGAAACTCTAACGAAAACCAGCT
-CCGCGAGAAGAAGCTCCACAAAAAAGAGCAACTAGCTCACCGGCTCTCCT
-CCTCTTCCGAAGAAATTGTGGAAGCCTCAATTCACGAGGATGAGCCAATT
-GTGATGGCTCAAATTCCAGAGGAGAAGCCCAAACCGAAGGCTATCCCGGC
-TTTTGATAACGCCTATGACGCCGACTTTGACAATTCCCCACCACTTCATC
-ATTACTCGGCGGTTCATTTGGAAACTGGGCTCTCACCGCTTGAGGAGGCT
-CAGAGAGCTCTCCGAGCCAACCGAGCAAGGCATAAGCCGTCGAATGTATC
-GTTGGCAGAGGAGGCGAAGCTTGCTGCCAGACAGAGATACTCGAATGCAT
-CGGATATTAGAAGAGAAGAGGAGGAAGAAGTGGTGGAAGAAGATCCAGCA
-GTGGTAGTTCCAGTTCTACGGAAGGATCTGGAAGTTGAGGAGGCTCCGAA
-ATCGGTACGACCGCCTAGATATCGGAAGTCAAGGGAAATTGAGGAACCGG
-TGGTTGTTGATCGGTTTGTTGAGGAAGAAGTTGATGAGAAGGAGGATATT
-GATGCGATTTTTGAGAAATATCGAAAGGTTCGTAAAGATATTTTCGAGAA
-AAACGGCGTTGAAAATTTGAAAAATTTGAACTTTTTTCGAGTTAAAAAAT
-TTAAACATATAGAAAAGATATGAATCTGACAAAATTTAGAGAAAATAAAA
-TGTTATTCACCAAATCGCCAATTTTTCTGCATTTTTTTGTCCGTTTTACT
-TTGGTAATTCTGGTAATACAAAACTAGTTTTTTTTCAAAAAAGAATTGCA
-GGAAAAATATTTTAAATGTTTTTTGAGCACTTGAGCGCATGAGATAGAAA
-AACGTTATTATTATGCATTCCCTCATATAAAAGTTTGTTCAATTTTTTTA
-ATTAAACCCCGCTCTTTGAGAAAACTCTGGACTCTACATGGAGACTACCT
-TAATACAAATTAACTCATAAATATCGGTGATTTTCAACTAGTTATTCATA
-TGATGCAATTACTGATTTAATAACTTATAATTATGTGTCAATTTCAGACG
-TCTGTATCCGCCGATCCAAAATCTCACACGCCGATTTTGATGGCCGACGA
-GTACAAAGAACCACAGAAGCAAGGTGAGTTTAGTTCGAAAAAAAATCATA
-ACACACACCAGTAGGTTTAAAAACATTGTTAGAAAATTTGAAAAAAAAAC
-CAAAAACCGTCGTAAAACTACACTTTTTCTATTGAAAATAGAACAAACAA
-ATCAAATATCCTACATGTAAAATTTAAATCGAGTGGAATTAAATTCTTCA
-AACAAAAAGAAATCTGCATTTAATATCGATTTCTCATTCAATTGTTATGA
-ATCATAAAACATGATTTTTTACGACCTCCTCTGAATTATCTACATTGTTC
-TCTTTTTCATACTTTCCATATTCTAGTATCGATAGGACTAACACAATTTT
-AATAGTGAGTTCGTTTTTCAAACAATTGGGATTAATTTTCAACTGAACTA
-GACTGTTTCTGAACGCTCAAAACCTTCAAAATCAATGCTTCTTCAAAACG
-AAAAAATTGCACACTATAAACCTCTCACTTGAAGTGGCAGCGCTCGTTTT
-ATATTGAGAAAATATATATTCAAAAAAATGCTGCTGCTTCTTCAGCTTCT
-CGCCGGGCGCCGCCGCCAATAGTGAGTTCGTTTTTCAAACAATTGGGATT
-AATTACAAAAAAACTTAACTGCGCAATTTTTAATTGGGAAACTTTCAAAT
-TTTAACCATAACTATCAATACAGCGGTATACGAAATTTTTCTTCAAAATC
-GCACCGATACTGCATTTTTCCGGAAAAGGACAAAGTCGGCTAATTGCCGT
-TTTTTATAATTTTTGCTCATTAAGCTTATTCCATTAAAAATACAATTCTT
-GTTTAAAATTGCTGAACGGCGAATTTTGTCTACCCGTGGTGGAAATTGCC
-GGTTTGTTGATTTGCCGGAAAATTTCATTTTCGGCGTGCCGATTTGCCGT
-TTGCCGGATATCAATTTGCCTGAAACGTTTAGAGGAATACAACGGAAACA
-TTTGAAACTGTGCCTTTTTGAAATTTTTTCCCTTTTTTTTACAATATTTT
-CATAGAATTAGCTTACTTTTCAAAATAGATGTAGGAAAATTCATATGCGT
-ACAATTTTGCCAATTAAAATTTGAATTCTGAAATTTACAAAAAAATGTGC
-AAAACTACTATTCGCCGAAAATTTTTGGCAAGTTGCCGATTTGCCCGAAA
-TTTTTATTTTCGGCAAATTGGCGCTTTGCAGTTTGCCGGAAAAAATTACA
-TACACCTGTTTTCAGCCTAACTTAAAATATGATTTACTTTGAAAAATAGG
-GAATTAAATTTAAATAAAATTTTCAACTGAACTAGACTGTTTCTGAACGC
-TCAAAACCTTCAAAATCAATGCTTCTTCAAAACGAAAAAATTGCACACTA
-TAAACCTCTCACTTGAAGTGGCAGCGCTCGTTTTATATTGAGAAAATATA
-TATTCAAAAAAATGCTGCTGCTTCTTCAGCTTCTCGCCGGGCGCCGCCGC
-CACATTTACCGGCCAACCCGTTCTCTGAGGTTGTCTTGTAAGGGCGTTTT
-CATGTATATTCAGATTATTATGCATGAATTTCATTAATAACGGTATCCAC
-CCACGTATATTTCTCTTCTTCTCTCTTTCTGTTGCGACGGGGGATGTCGA
-TTGATTACGCCACGGGCGCTAGCCTATTCCGAATGCATTGAGAAATTTGA
-GACCAGATTCTGGAGTTTTTGGAAGACGAATCGTCGGCAGCGGAGCTCGA
-TTTTAATTTAATTTCGAGAGCACCCGCGTGCTCTCGCCTCGACACCCTCA
-AACTTCTTCTTCTTCTTCTTTTCGTCGTCTTTCACTTTTTTCCTTTTTCC
-TGTCCTAACCACGGCGTCTTCCTCCAATTTTCAGTTACCACGACGTCATT
-AGCTATTTTTAGTCCGAGTGTGGAGCTTGAGAATTTGAGCAATTCTGATG
-TGACATTCCTGTCGTTTTTAGCGCTAATTTTCCTAAAACCTTCAAAAATT
-TAGAAATTCTCTATCGTCTTTCAAGAGCCTAAGTTTTTTTTTTCGAAATG
-AGTTTTTTAAAATTGATCGAAATGTTTTTAAATACTGAATATTTGGGATT
-CTAGATTTTTACTACAATATTTCCTTTTCAATTTTTAATTGGACAAAATT
-TCAAAATGTTAAAAAAATTCTCCGAATTGAATGCTATTTTTCTAAAAAAT
-TTTTTTAGTGCCTGCACCAGTTGTCGTTGCTCAGGAGTCGCCGATCTTAA
-AACGAAGAAACTCTCTAGTACCATCAAGGATCAGTGGAAGGCAGTCGACG
->CHROMOSOME_V
-GAATTCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCATAAGC
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCATAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCATAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCATAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACA
-TAAGCCTAAGCCTAAGCCTAAGCCTAAAACATTTGGAAATTATTTTTGAT
-CGTTTATATTCAAGTAGCAAGAAAGTGTCCTAGCGTTAAAAATAGGAAAT
-TTTTCGCTCTTTCAGAACAGTATACTCATGTCTCTGTACCGACGATATTC
-ATTTCAAAAATCGCAAAAAAAGTTTTTTTCAAAATACCACTACCATTAAA
-ACATTTGGAAATTATTTTTGATTGTTTATATTCAAGTAGCAAGAAAGTCT
-CCTAGCCTTAAAAATAGGAAATTTTTTGCTCTTTCAGACCAGTATACTCA
-TGTCTCTGTACCGACGATATTCATTTCAAAAATCGCAAAAAAAGTTTTTT
-TCAAAATACCACTACCATTAAAACATTTGGAAATTATTTTTGATTGTTTA
-TATTCAAGTAGCAAGAAAGTCTCCTAGCCTAAAAATAGGAAATTTTTTGC
-TCTTTCAGATCAGTATACTAAACATTCACGTGTGGATTAAAATTAAAAAG
-GTAGTGTTAAATAATTAAAAATCATTTAGGGGGGAACGAAACCCATAAGT
-ACTGTCATTTTTATCTTTTACCTTTTTTTTTACGTACGACGTTTTTCGCT
-GTTTTCCCTGATACAAAATGCGTTGTTCTTGTTTATTTATGTTTTTCTTG
-AAAATGTTATCAACACTGATAATCTGAAAAATTATAATTTAAAACTTAAA
-CGAAGCTAAAATGTGGCTGTTATAATACAGCGACTCAATGAAAAACTCAA
-AAAAAAGTTGACTTTGCACGCTATGGTTAAAAATGAATGAATTCTTGGTA
-CATGGTTTTTTTTGTGATTTTTCGTTGAAAAATCCACACCGTGTCAGAGA
-GAGCTGAAAATGTTCATTGAAAGCGCTAAAAAACATTTGAAAAAATGCCA
-ATTTTTCCGTAAGATAATTCGATTTGAAAGTTTGAAAACTGAATAGTAAT
-TGTGTACTTGCAAAGAACCTTGTTTGCTTTTTAGTTTATTTGATCTACCA
-AAGATTGGGTTCACTGTCTGACCATTTGGGTCACTAATCTCATAAACCGT
-CAAAACAATCCAACGTGGTACAAAGTACATCAAGTTTTTCACAAGTCCTA
-TAGTTAGCTGCGCATCCCTAATAGGTATCCCCATTAATTTTTTTTTCAAG
-AAGAATGGCAACACAAACACCCCTCTCTGATGACTCGTGTGTCAAAAACG
-AGCTCACGGAACTCTCCTCTAGTGAAACGGTCTCGAGGATTGACGAGGCC
-CCGAAATTTCATGTCAAAGCTGTCGTCGGGCGTGTTGTGATAAAACATTT
-TGGTGGCCGGGATTGTGTTTGTGTTCAGTCAGAAAGACGCTATTAGGACC
-TCCTCCCATCTTATTAGCTGTTTATCCTTCATCACAAGACATCTCAATAT
-TGGTTCCATAGGTGTAGCTTCTTCTGCTTCTTCTTCTTCTTTTGTACCTA
-CGTCATCATACATTGGTTACTGTCCTACCGAGGTTTGTTTCAAATTTGCA
-CATTTAAAATGGTATACACCTTTAAAATAAACTTAGAAGTAAGGCCTTTG
-GTCCCACTACAAAAAATTTACAGTAGTTTGGTTCAGACTTTTCTAAATTT
-AATTAAGGTTATTTTTTATTGACAAAAAATATTTTAGTTCAAGAAATATG
-TTATGTTCAGTGGGTTTCCTGTCATATACTTCTACTTACCGTATTTCCTC
-TATTAGTCTTGCATGCAAGACTAATTTTCAATTGACCCGTAGGGGTGCAA
-GACAAATAGGGGTGCAAGACTAATAGAGGCTGCAAGACTAATAGAGGAAA
-TACGGTAGTTATACTGGCAAAAGCGATAGCATTTCGAGAGAAAAATATTC
-TTAAATGTGCTCAATATGGCTGATACAGATAGGTTTTTCATTACAGACAG
-GTTTTTCATTTCAATTTTAAAAAAATACCTGACAGTTTATCAAGAAAATC
-CAGCACATTCCAGAGTTATTAGAGTATTTAGAAGTTTGCAAGTTCCCAAT
-TTTGTCAAGGGATTTTTCAAAGTTTCTCAAACTTTCCAAAAAATGCAAAA
-AAAAACATTCCAAAAGTACCAATTTTTCCAAAAAATTCCATAAATATATT
-CAGTCCACCGAACGTTTTTAGATCTAACTGAGAGTTCTCCTGAAGTTTTT
-CAGAGTTTGAAGGAATTTATAGAAGTTTCTGATGTTTTACAGGATTTTAC
-TAAAGTTTCTCAAATTATCTATAAATGCCAAATCTTTTCAGAAAGTTTTC
-AGAAAATTTCCGGAAAACCTTCAATTTTTCAAGTTTTCCAGAAGATTCTC
-GATTTTTCCAAAATCGTTTCAGAATTTTCCTAATTATTCCCATATTTCCA
-TCGACTTCTTATAGTTAATTTGATTTTCATCAAATTGATACAAATGAGAA
-AATTTGAAATTTGATAACTCACGTTTCGATGCAAAAAGAGACGAAAGGCG
-GCGTGATGCGGGCAGGATTTAGGCAGGCGGTAGGCCCTGAAACCGCGCCT
-GCCTACCATTGAACCTCTAAGCTATTCAGTTGTATTTTTTGATATTCCAG
-ATGCGTACCGACGTGGGTTCTATTCCATTAATGTGTATTCTGTCTACACT
-AACGACTGGTGTGTTCGGATATCTTCCGACAGAAGATCTCACAAATTCGA
-TAATTTCTGGAAACGGTGGTTATCCAGTTCCTCCGGACACTATTATACCG
-GCCGATGGAGATGAGGAAGGTAAGTGGATCAGAAATTAATAATTATAAAT
-TTTTTAGAGTAGGGTTTTCTTCTGAAATCTGATATTTTGTGAATTTTGCA
-AAAAATTGGAAAAATCGACAACGAAATGCAAATTGTTTCGTTAAATGCAA
-AATGGATGCGCACCTTTAAAGAGTAAAGTCTATGAAAATGCTTTTATTTG
-GTATTACAGTTCTTTTCAAAGGCACACATATTTTTCCCATTTAACAAAAA
-ATCGTCGTGACCTTATATCGTATTTTCGGCGCAAAAATCGGAACATTTCG
-CGTCTGTATAATACCCCATTTAAAGGTTTACGACGCAATAATACAACACC
-GGGTCTCGACGTGGCAAACGATTGTTTATTGATTTTCACGGGATTCTCGC
-CTTTCTCATTGAATTTTCGCGCTCCATTGGCAATCGCCTGCCGGACAACG
-CGTGGAAAAGTGTAGTGTACTCCACACGGACAAATCCATCGGTTTTACAA
-CTAAAAACGAGCCGCGACGCGACACGCAACGCGCCGTAAACCTACACAAA
-ATCTCGCAGACTCAAAATGGCCTAGTTCGGCAAACTCTGCCATTTCGATT
-TATGAGGGAGGCCAGAATTCCGTGATTTTCCCATTTCTCACGGCCTCTCT
-AAATTTCACGTTTTTCAAAATTCATCTTTTTCTCTCTGCTCTCTCACTCT
-CTCACGTGAAATATTACTTTCTGAATAATAATTTGTGTTTAATTAAATCA
-AATTTTATTGAAATAGAATTCATGATACACGATCTTGAGAAGAGCTCTGT
-CCTCCAGGCTGCGAACTGGAGCGTAGAAAGTTTTCATATTGTTAAAAACT
-GCAAAGAAATGTTCGATTCCTTGTTCTGACGTGTGATGCTTTCTCAAATA
-TGGAATTAAATGACAGACAAGGAGATGAAGTTTCGGAGTGACTCATTATT
-TCATCAGTTTCATTAGGAAAAACACTCTTTATTTATTCAAGGAACTGTTA
-AAGCAAAACTTCAATTTTGTCAATCTCTTGGTCTAAATACGTTCTATCGT
-TAGATAAATCTAACTATCTAACTGAAACGAGTACAACTATATTGTAACGC
-AAAAAAGCTAAGCGCCATAAAACACAAGTAAAACAGGCTCCAGTAAGCCT
-AAACTGTTTTTACTATAAAAAACCATTGTCATTCACCTACCTACCAAATG
-CCAATATAATTGGTTGAAAAAAATTAGTTTAATCTCCTCGCAAGATTTTT
-TTCTCCGAAATTTAAGATTGGGCGCTTAGTGATATCATAACTCTGCAGCC
-ATCAGAAAAACTGAAATGTATTTAAACTGTAAGTTTTAATCGTTTTATGA
-GGATTATTTCTTTAGTTGACAGTTTTTTGATAGCTTCTTTAGTTATTGAG
-CTACGGGCTTCCAAACAAAACCAATCAAAAACCACTATAAACCACAATGT
-CCTAAAAGTGAAATTACTCAGTCAATTTTTAACCAAATCACGGCATTAAT
-GTCTTGATATCTTCATTGAACAATTTGTAAAAATCGTAAGGCGGTAGTTT
-TTTGATAAATGTCATCGTTTTTTAGTAAAATTGCGTTAACCATTCAAAAA
-TGGCCCATTTTTGGTGTTTTCAGGCCTAATTCTTGTTTTTGAAATTCCGG
-AGCCAGTTTTTATCGAAAATTTTTGTGCAATGTCAAAAAATGACCGGAAA
-AAAATTCTCTACAATCGTAAGGCGGTACTTTTTAAAATTTCGTTTCCATT
-CTTCCCCAGGGATCCCGTAAAAAACCAATTTTTCGACTAGGTCTCACATT
-TTGCCCTACAAGAGCATAGTTAATGTTATAAATTTGGATTTTTTGGTCGA
-ATTTGATGAGGTAATATTCAGTTGTTTGTTTATTGTTGGAAAATCTGAAG
-ATTTATCAGCGAATCGCCCGATTTCGCCAATTATGACCAAAAAACCCCTA
-GTTTAGGATTTTCACGAATGGATGAGTTCATTGATACGCTTCCACGCTGT
->CHROMOSOME_X
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCCTAATCTGTGCTCCAAAGCCTTCGAACTGACGGACTTGTGTC
-CCGAAGTCGAACTCTTGAAGTTGTCACCGAGTTGGCTAATAAGAAAGACG
-CTACGTTGTCTTTTTAGTAAGTTTTCGTCGAAATTCTGGAAAAAAAATCT
-GAAAAAAATGAGAAAAATTGAAGTTTCTTGTGAAAACGTGCAGCAGCCGA
-CAACTAACGGGACTGGGAAAATTGAAATTTTTAACACAGTTAAAATGCGA
-TGTGCGCATAGTGGGTGAAAGGCCATAATGCGCGCACCGCGTGTGGCGAC
-CACCTATTATGCACCTATCGCGAACGGTTCGCGATGGGTCCATAATGTAT
-CCATGATGCTTCCACTCACGAAACAAACAATTCGAAATATATATTGTTTT
-TCCGCCTATTTTTTTAACATTTTATTGCAATTTTTATTGAATTTTTGATT
-TTCACTGGTTTTTTTTCTTGAAATTTTGTTTCGTATGTGGTATTTTGTAA
-TAATCATAATATTTTTTTCTAAATTGTGTGTCTTTTAGAGAAAACACTGC
-TCTAACCAGTTGAGGCATTTAAAAACATCATTTAAACAACATGGCAAGCA
-TTATTTCGTTCCTAATAAATGGAAGCATAGTCAGGATTACTGTAGTTTCA
-CATGTATTTAGCCATTAAAATTGTAATCTGAGTTTTCATCGGTATTTGCG
-CATACTCAGAAAATTTTGTTAAATATCTTGTCTGTTCCTGTATTTTCAAG
-AGCGAAATATCGTCAAAATCAGATTATTTCGTTGAATCTGGAAATGCCCA
-CTGTTCTTCATGCCTACTCGTGTCTATTTCTCATCAGCGTTATAACTCAC
-CTTTTAAATAATATTGTAGAAACAAATTTTTTGCAGCTTCTCTTCGAGCA
-GCAGACTTCACAAAAACTTCATCAACAAGAAAAAACGTGAAAATCTTCAA
-CATCGGAATGTCTAGGTGAAGGATGTCGGAACGGGCAAGGTTTGGAGCAC
-GGCTCAGCTTTTTTAGATTTTAGATTTTAATTTAGAAACACACCACCGAA
-GAGGAGGAGATAAAGATGGCTCGGCTCCAGAATGCATTGAAAGTTGTTGG
-ATGGTCGAATGGATTGAAAGCAATTGTAAAGAAGGAGTTACCCGGAAGCC
-CTGCCAAAAAGCAAAAACCGGCATCGGTTGCGCCGAAAATTTTGGACTCC
-TCGATCGGAAGAGTGAGTTTGCTGATTTTCAAAAAATAGGATGAAAGGCT
-GAATAATTTGAGCTCTCAATTGCTAAAAATATACGGATGGACAAAACTAC
-GATCATCATTGGTCACAAAGTTGCAGCTCCGAAAAGAGAATTCGTCTGGA
-ATTCTGGAAGTTCACAAGAATGGTGAGTACTTACCTTTCAAGTGAAAATT
-GAGGAAAAATTGAGAAAGAAATGTGTTGAAAGATGCAAAAAAATGACAAA
-AATTCAGCTTATCCTGCTAAAATTACGCGTGAAAAAGCATATTTTGTGCT
-TGAAAATCGCAAAAAAAATGCATTAGAAAAACCGATTTTATTTAGTCCTC
-CTAACAAATCGATTTTTGTAGACCTGGAGTCATCCTAGCAAACGAGGCAA
-CACTGGAAGAGGACGAAAAACGTTAAGATTCCGTATGAAGATGTCAGAAA
-ACCGAGTTAGGAGGAACTTGGAATTAAATTTTTGAGTTTTCTTTTTTCTA
-TAATTTTTTAAGCTCACTTTTTATTCTTTTTGTTGTTCTCCCACTTAGGC
-CATGTTAATAAATGTGTTTTTGTTAAGAAAACTGTCTTAAATGCTCAGGA
-TCAGGTTTTATTATTAAAAAAACAAACCCACAAAGCGCACATAATTTATG
-TTCGCGATGCTCGCAAAATGCATCTCAAGTTCGCGATGGACGCACAATGC
-GCGCGCAATGGGCATCATTTCCGGTTCCTTTTTAACACACGCGCGATCCA
-CTCCGAAAGCACTATGCGCACATCGCATTTTAACTGTGAATGAAAATTTG
-AAAAAAAAAACTAAATTTGAGAATTTTTGAGTTAAAAAATTCCAAATTGC
-AGAGAAATAAAAAATAAAATTTTTAGAGAATATATCGAAAGAAATTCAAA
-TTTTTAAGAAAAAATCCCAAAAATAAATCATTTTTCTAGAAAAAAAAAGC
-AAAAAGTTCCCATTTTGCGATAAAAATCGAAAAAATCCCGATTTTTTTAC
-AATTTTCTAAAAAAAAACTGAAAAAAATCCACATTTTTCAGAAAAAAACG
-CTAAAATTTTAATTTTTTCTAGAAAAAAACAAAATTTTCAATAAAAAATC
-CAAAAATAAAACCAAAATTAAAAAATTATAATAATTACGGGTAAAATCGT
-ATGAAATCCCGTTTTTTTTTTAATCGTAATTATTTTCAATTTTTTGGTTT
-TCTCCTCAAAAAAAATTGTTTTTTTTCCCATTTTTCTTTAAAAATTGAAA
-GTTTTCCAATTTTTCTCGAAATATTGACTCAAAATTAGCTTTTTCTTCGA
-ATTTTTAATAAAAATTTTCACTTTCGCGACCCGTTAGTTGTCGGCTGCAC
-GGTTTTCTGAAAATTGAGAAATAAAATTAGAAAAGTTGCAAAATTGAAAA
-AAAAAACCGCAAAAAACTGAAATTTTCTAGGCAAAAAAAAATAAAAGAAA
-TCCACAAATTTTTCGATAAAAATTGAAAAAATCCAAATTTTCCTGAAAAA
-AATCCCAAAAATCCAATTTTTCTACAAAAAAAACCCAAAAATCCACTCCT
-TTTCGATAAAAATTTGAAAAAATTTCGATTTTTCAAGAGAAAATTCCGAT
-TTTCTAGAAAAAAAACCCCAAAAAACTATAATTTTCCTTTAAAAAAAACC
-CCAAAAATCCAAATTTTTGTACAAAAAATACCAAAAAATCCACATTTTTC
-AATAAAAATTAGAAAAAAAAAACAATTTTTGCTGAAAAAAAACTCAAAAA
-TCCAATTTTTCTACAAAAAATACAAAAAAAATCACGATTTTCCTGAAAAA
-AACCCAAGAAACTATAATTTTCCTGAAAAAAAAATCCAAAAAAAAACCGG
-GAAAAAAACAAAAGAAATCCAAATTTTTCGATAAAAAAATTGAAAAAATT
-CCGATTTTTCAGGAATAAATTCGGGAAAAAATTCAATTTTTCTAGTAAAA
-AACCCAAAAAAAACCCAATTTTTTTGCAGTTTCCGTCACTTCTTCTACCA
-CCGTTTCCACAGTAATCTCATCGAAGGCTCAGGTCGCCTACTCGACAAAA
-TTAATGATACTACTGCTGCCCAACAACAACTACAAACTACAAACGAACTC
-GACGGCGATGGCCCAGAAATTGCAATCGCCGCGGCCAAAGCATTCCATCC
-GACTGAAAAATTCGATTTGGAAATGAATGTGGACGACGATGAAATTCTGA
-AAGTATTTGATATACAAGAACAAGAGCAAATTGTGATGAAAAAAATCCGA
-CATTTGGAGAATTCTGACTTACATTTCGAGCGAATTCATGTGAATTTGGC
-GAAAAAAGAGCGATTTTTTGACGACGTTCAGAGCTCGGAAAATGACTCAA
-GCGACGAAAAACTCGCCGAAATTTGCGATTTTTTGAGCCAAAATTGCCGG
-GAAATCTCGAATGCTGCGAAGCCTCCTCGAGCAACACTTGACGAATGGAT
-TCAGACTGGAAAATTCGAAATACAACGTCGTCGAGAGATCCGGGCGGTTT
-GCCACGTCATCAAGGCCATCGGTCAGATGGGAATTACACTTGGCGAGCTG
-TGTGGAAAATTGAAAATTGCCATAGAGCAAATTGCCGGAATTTTGGCCGA
-TTTGAGCGGAGACAAGAAATGGTGTCCGAGACCTTGGATTGCGCCGGAAG
-GTTTTCTTTTTTTTTTAAGGGATTTTTGGGGCGAAAAATTTGGATTTGGC
-TCACCACGCGCGAGCTTTGATTTAAAGGTGTTTTCGCGGTGAGACCCGGA
-AATTTTATTTTTCCTAAATCTCTCTGAACCCGGTCATGATTATACTTAAA
-TGAAAGCTCACGGCGAGCTGAATTCGAATACTAAGTGTATGGTTGTTTAG
-CTACAGTAACCTGACACTGAATTTCGCGGCGAGACCCGAAAATCCCCAAA
-AACTCTCAAAAACCGTCTTAGAATCGATCAAAATATGTCAAGATTATACT
-TAAAGGAGGACTAACGGTTCGGACGATTTTGAACGTATAGACCAAAAATA
-AGCTCAAATGAACGAAATTCGTAATGAAACTGCTCAAAAATTTTTCAAAA
-ATTTTTTATGGCGGTTCAAAATTTTGAAAAAAATTACACTGATTTTGGCT
-AAAATCACGATTTTTTCTCATTTTTCCGTGTCACATTTGTCCGAAGTTGG
-TTTTTTTAGAATTATCGTCCTTTATTACATATTTTGGTAATAAATCTCAT
-TTAATTTCGTCGATTAAAGTGCATTTAAAGCCGATAAATAACCAGTTTCG
-ATGATTTTTGGTTACCTATCGGCTTTAAATGTACCTTAATCGATGAAATT
-AAATGAGATAATCTACCAATATATGTAATAAAGGACGATACTTCCAAAAA
-AGCCAACTTCGGTCAGATGTGACACGGAAAAATGGGAAAAATTCGTGATT
-TTAGCCAAAATCAGTGTAATTTTTTTCAAAATTTTGAACCGCCATAAAAG
-ATTTTTGAAAAATTTTTGAGCAGTTTCATTACGAAATTCATTTAAGTATA
-ATCATGAGCGGGTTCAGAGAGATTTAGGAAAAATAAAATTTCCGGGTCTC
->CHROMOSOME_MtDNA
-CAGTAAATAGTTTAATAAAAATATAGCATTTGGGTTGCTAAGATATTATT
-ACTGATAGAATTTTTAGTTTAATTTAGAATGTATCACTTACAATGATGGG
-GTTTAAAATTCTATAGTAAAAGTGTTTTTTGTTTTAGCTGTTTTAAGTAG
-GATTATTAGATATATTAATATTGACCCTATAAAAAGAAGTTTTTTTCTTA
-TCTTTTCACTACTTTTTAGTATACCAGTTATTTCAATGAGAATACATATT
-TGGTTTTCTTACTTTATTTGTTTATTATTTTTAAGTGGTATTTTTGTTAT
-TTTGGTATATTTTTCTAGTTTATCTAAAATTAATGTAGTGAAAAGTTATA
-TAGCTGTGTTTTTACTTTTGTTAAGAATGTTATATTTTTCTCCCACAGTA
-TTAACTTATAGAAGATATTTAGGTTTAAGAGGTTTTTATTATAGTATTTA
-CTGGTTTATTTTTTGTTTTATTTTAGTATGTTTATTATTTTTTATAAATT
-TTAGTAGTTATTTTTTAAATTTTTCAGGTGCTTTACGTAAAGTTTAAAAT
-TATGTTTTTATTTGTTAGATTATTTATATTTATTTTTAAATGACAACGTT
-TAATTTTTATTCTAATTTCTTTAGAATTTATAATGTTGAGATTATTTTTA
-AAATTTTCTTATGTTTTAGGGGAAATAATGTTTTTTTATTTTATGTGTTT
-TTCTGTTATTTCAAGAATCCTGGGTATGGTAGTTATAGTAGGTAATATAA
-AATTTTTTGGTAGTGATAATTGTATTTTTTAGTAACAGATATAAGTTAAG
-TTTAAACTATTGATCTTCAAAATCAAAAATTTATTTCTGTAGAGATAATA
-GTATAAATAAGTATGTTTCTTTTTCGCAGAAATGGTTTTTTATCTTATAA
-AGTTTTCTTTCAGGGAATTAAAATTTGATCATGGTTTAAGATGATTTAAA
-ATGGTATTATCTAAATTTGATTTACAGAGTAGGCAATAAAAATTTACCTC
-GGCAATTTATCGCTTGTAAAATACTTGTTCCAGAATAATCGGCTAGACTT
-GTTAAAGCTTGTACTTTAATTGATGTTAATTATGAAATTATTATATTTTC
-TTTTAGATCTATGGTAGAATTTGGATTTATATTAGTGAATTTTCATAATT
-TTAAGATTTGTTGAACAAAGCAGATTAGTACCTGGTTAGACAAAAATTAA
-AAGAGCAGGAGTAAAGTTGTATTTAAACTGAAAAGATATTGGCAGACATT
-CTAAATTATCTTTGGAGGCTGAGTAGTAACTGAGAACCCTCATTAACTAC
-TTAATTTTTTGACTCGTGTATGATCGTTTATTTTATTCTTAAGGATTATA
-ATAAAAAATTTTTAATTTATTAAAATAGATATATACCCGGTTTATGATTT
-AAGAAACATTTGGCCTACAATATTTTATATTATGGATTTTAGTTTTAGTT
-AACTAAATGAAATTGTAAAAGACAGTAAAAAATTCTTAATGTATTTTTGA
-AGATTATCTAGAAGTGGTACAAATCATCCATCAATTGCCCAAAGGGGAGT
-AAGTTGTAGTAAAGTAGATTTAGGGGAACCTGAATCTAGTAATAAAACTA
-TTTTTAAATATGTTTTGAAAACATGTTTTGAGGTAACTCGTAGTTTTTAA
-GAGTTAGTTTAATATAGAATTGTTGACTGTTAATCAAAAGGTGTACCTCT
-TAATATAAGAGTTTAGTTTAAGTTAAAACGTTAGATTGTAAATCTAAAGA
-TTATTGCTCTTGATAATTTTAGTTTTACTTATAGTTATTTTAATGATGAT
-TTTTATTGTTCAAAGAATCGCTTTTATTACTCTATATGAGCGTCATTTAT
-TGGGAAGAAGACAAAATCGTCTAGGGCCCACCAAGGTTACATTTATGGGA
-TTAGCACAAGCTTTATTGGATGGGGTTAAACTTTTAAAAAAAGAACAAAT
-AACACCCTTAAATTCCTCTGAAGTATCATTTTTACTTGTACCAGGAATTT
-CTTTTGTTGTAATATATTTAGAATGATTTACGTTACCATATTTTTTTGAT
-TTTATTAGTTTTGAGTATTCAGTTTTATTTTTTTTATGTTTAATTGGATT
-TTCTGTTTATACAACTTTAATTAGCGGTATCGTAAGAAAATCAAAATATG
-GTATAATTGGGGCCATCCGTGCTAGAAGACAAAGAATTTCTTATGAAATT
-GCTTTTTCTTTATATGTTTTGTGTATTATTATTCATAATAATGTTTTTAA
-TTTTGTTTCAAAATTTAATTTGAGACTTTTAATTATTTACATCCCATTTT
-TAATTATAGTAATTGCTGAACTTAACCGGGCGCCATTTGATTTTTCTGAA
-GGTGAAAGGGAGTTAGTTAGAGGATTTAATGTGGAGTTTGCCAGAGTAGC
-TTTTGTTTTATTATTTTTAAGGGAATATGGAAGATTAATTTTTTTTAGGG
-TACTTTCTTCTGCTATATTTTTTAAATTTTCAATTTTTATAGCATTTAGT
-ATTTTTTCATTATTAATTTTTATTCGTAGTTCATACCCTCGTTATCGTTA
-TGATTTAATAATAAGTTTATTTTGATTTAAACTTTTACCAATCTCTTTAA
-TTATATTGTGTTTTTACGCAGTTATTTTTTATTATTAATCAAGTTTATTT
-TTTAGACATTTTTATATTTGTTTTTGTTTTACAATTTTTGTTTTATTTTA
-AAGAAAGTATATTAAATACTTTAGTGAAAAAATTTCTTAATAGGTTAGTA
-GGAGTATTTAGATATACAAATACTTTACCATTAAGGTCAGTAATTTCTAT
-TTTTACTTTTATTGTTCTTTTAACTTGTTGTTTTGGAGGTTATTTTACTT
-ACTCTTTTTGTCCTTGTGGAATGGTTGAATTTACTTTTGTTTATGCTGCT
-GTAGCGTGATTAAGTACTTTGTTAACTTTTATTTCAAGAGAAAAATTTTC
-AGTTTATATAAGAAAACCAGGAGACACATATTTGAAAACTCTTAGAATGC
-TATTAATTGAAATCGTTAGAGAATTTTCTCGTCCACTTGCTTTAACAGTG
-CGTTTAACAGTTAATATTACTGTTGGTCATTTAGTTAGAATAATGCTTTA
-TCAAGGATTAGAATTAAGAATAGGTGATCAGTATATTTGATTATCAATTT
-TAGCCATTATAATAGAATGTTTTGTTTTCTTCATTCAAAGTTATATTTTC
-TCTCGTTTAATTTTTTTATATCTTAATGAGTAATAAAAAAAAAAAGATGT
-TAACTTAAGTTTTAAAGTGCCAAACTTTTAATTTGGAAATGGTGGACCAC
-ATCTTAGTTGATATAGCATAAGAAGTGCATTTGTTTTAAGCGCAAAAGAT
-ATCCGTCAACTAACGAGTTCATAAAGCAAGTCTTCTAAATTTGTTCTAGG
-TTAAATCCTGCTCGTTTTTGATTGTTTTTATTTCTTTATTTACCTTGTTT
-TTAACATTATTAAGAATTTTGACTAATAACGTTATTGTTTGATGAAGAAT
-TTTTTTATTGATAACTGTAGTTTTTATTCTATTAAATAAAAGCAGCAAGA
-GATATACCAGAATTTTTAATTATTTTGTTATTCAAGAGTCTTTAGGTTTA
-TTATTTCTTCTTTGTAGAGGAGGTCTATTACAATTTTTTATTATTTTATT
-GAAAATTGGTGTAGCACCGCTCCACTTTTGAATTTTTAATGTAACAAATA
-ACATTTTTAATTATGGGCTAATGTGGTTTTTAACATTTCAAAAATTACCA
-TTTTTAACTATTTTATTACAAATTTTTTGGTTAAGATCCGTGTATATTTT
-GTTATTTGGTTTATTGATTTGTTATGTTCAAATTTTTGTCATAAAAAGTT
-ATAAAAATTTGTTAATTATTTCATCCACAGAGTCTTTTAATTGGATTGTT
-TTGGGAGTATTTTTTTCAATGTTTAATACATTTTATTTATTTATTTATTA
-CTTTGTATTAATAGTTTTATTAATTTCTAAGTTTTCTAAAACTAGGGGTT
-ATAATTTTATTAATTGAGAAACAACATTAGTATTTTTAAATATTCCATTT
-AGAGTTTCATTTTTTGTAAAAATTTTCTCATTGAGGGAAATTTTTAAATA
-TGATAGATTCTTTACTCTATTTTTGCTTTTTACAATATTTTTATCTGTAT
-TGGCATTTAGATTTTGATTAATTAACTTGAGAATGAAAAATAATGAAGAA
-ACTTCAAATAATAATAAAATAAATTATTTTATTATTTTTCCGTTAATAGT
-TATTTCTATTATTTAATTACTTTTCTAGTAAAATATATTATATTATCTTG
-ATAAGGTAAAGTTCCAGTTGGGAGAAGTAAGATGTAAAATAGATATTACT
-ATGTTTGGTTACGGTCCAAAAAGATGCACATCTTTGCGATCTAGTTTAGA
-AAAAATATTTGTTTTTGGTGCAAAAGAGTTTGATTGCATTTAGTTTACTC
-TTTTAGTTTATAATTAAAATATGGCCCTGAAGAGGCTAAGAATATTAGGA
-GTATTGAAAATTAATAATAGATTATTAAATTTTGTTAATGGGATGTTGGT
-GACATTGCCATCTAGAAAAACTTTAACATTAAGATGAAATTTTGGTAGTA
-TATTGGGTATAGTTTTAATCTTTCAGATTTTAACAGGTACATTTTTAGCA
-TTTTATTATACGCCCGATAGGTTAATAGCATTTTCAACAGTGCAGTATAT
-TATGTATGAGGTAAATTTTGGATGAGTATTTCGAATTTTTCATTTTAATG
-GGGCCAGGTTATTTTTTATTTTTTTGTATTTACATATTTTTAAAGGGTTA
-TTTTTTATAAGATATCGTTTAAAAAAAGTATGAATGTCTGGTTTAACAAT
-TTATTTATTAGTAATAATAGAAGCTTTTATAGGTTATGTTTTAGTTTGAG
-CTCAAATAAGATTTTGAGCAGCAGTAGTTATTACTAGACTTTTAAGAGTT
-ATTCCAATTTGAGGGCCAACTATTGTTACTTGAATTTGAAGAGGTTTTGG
diff --git a/src/test/resources/htsjdk/samtools/cram/ce.fa.fai b/src/test/resources/htsjdk/samtools/cram/ce.fa.fai
deleted file mode 100644
index 2ad2e7f..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce.fa.fai
+++ /dev/null
@@ -1,7 +0,0 @@
-CHROMOSOME_I	1009800	14	50	51
-CHROMOSOME_II	5000	1030025	50	51
-CHROMOSOME_III	5000	1035141	50	51
-CHROMOSOME_IV	5000	1040256	50	51
-CHROMOSOME_V	5000	1045370	50	51
-CHROMOSOME_X	5000	1050484	50	51
-CHROMOSOME_MtDNA	5000	1055602	50	51
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram b/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram
deleted file mode 100644
index 240df31..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram.bai b/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram.bai
deleted file mode 100644
index c168662..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram b/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram
deleted file mode 100644
index 312f642..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram.bai b/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram.bai
deleted file mode 100644
index bfe6239..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram b/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram
deleted file mode 100644
index 77a5ef2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram.bai b/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram.bai
deleted file mode 100644
index c44b7e9..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram b/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram
deleted file mode 100644
index 285c0a0..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram.crai b/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram.crai
deleted file mode 100644
index 2b6f632..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram.crai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/fieldarith.sam b/src/test/resources/htsjdk/samtools/cram/fieldarith.sam
deleted file mode 100644
index 180d1e8..0000000
--- a/src/test/resources/htsjdk/samtools/cram/fieldarith.sam
+++ /dev/null
@@ -1,15 +0,0 @@
- at SQ	SN:one	LN:1000
- at SQ	SN:two	LN:500
- at CO	For each SAM record that has each listed aux field, performs these tests:
- at CO	XQ is the expected result for bam_cigar2qlen()
- at CO	XR is the expected result for bam_cigar2rlen()
- at CO	XE is the expected result for bam_endpos()
- at CO	(Note that these are all zero-based, while POS is one-based in SAM)
-r1	0	one	50	20	8M	*	0	0	ATGCATGC	qqqqqqqq	XQ:i:8	XR:i:8	XE:i:57
-r2	0	one	100	20	50M	*	0	0	ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCAT	qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq	XQ:i:50	XR:i:50	XE:i:149
-unmapped	5	two	200	0	*	two	200	0	ATGCATGC	qqqqqqqq	XQ:i:0	XR:i:0	XE:i:200
-hascigar	5	two	200	0	6M2S	two	200	0	ATGCATGC	qqqqqqqq	XQ:i:8	XR:i:6	XE:i:200
-s1	0	one	300	20	2M	*	0	0	AT	qq	XQ:i:2	XR:i:2	XE:i:301
-su1	4	*	0	0	*	*	0	0	AT	qq	XQ:i:0	XR:i:0	XE:i:0
-su2	5	two	400	0	*	two	400	0	AT	qq	XQ:i:0	XR:i:0	XE:i:400
-su3	4	one	500	0	2M	*	0	0	AT	qq	XQ:i:2	XR:i:2	XE:i:500
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.dict b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.dict
deleted file mode 100644
index ca3f427..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD	VN:1.0	SO:unsorted
- at SQ	SN:20	LN:200	M5:8ccb6b8284befc25d90a23637cad0bdd	UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/cram/human_g1k_v37.20.21.0-100.fasta
- at SQ	SN:21	LN:200	M5:8ccb6b8284befc25d90a23637cad0bdd	UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/cram/human_g1k_v37.20.21.0-100.fasta
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta
deleted file mode 100644
index 53a8bbd..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta
+++ /dev/null
@@ -1,11 +0,0 @@
->20 dna:chromosome chromosome:GRCh37:20:1:63025520:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNN
->21 dna:chromosome chromosome:GRCh37:21:1:48129895:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNN
-
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta.fai b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta.fai
deleted file mode 100644
index 0214054..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-20	200	53	60	61
-21	200	310	60	61
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.dict b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.dict
deleted file mode 100644
index 10aff59..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD	VN:1.0	SO:unsorted
- at SQ	SN:20	LN:200000	M5:fcb26df26fe47f4b364854e8371e465e	UR:file:///home/chris/projects/htsjdk/testdata/htsjdk/samtools/human_g1k_v37.20.21.10M-10M200.fasta
- at SQ	SN:21	LN:200000	M5:f02fab23cf86525e5ce048774c66a23d	UR:file:///home/chris/projects/htsjdk/testdata/htsjdk/samtools/human_g1k_v37.20.21.10M-10M200.fasta
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta
deleted file mode 100644
index f77d885..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta
+++ /dev/null
@@ -1,5002 +0,0 @@
->20
-TTGTTTACTACAGCTTTGTAGTAAATTTTGAACTCTAAAGTGTTAGTTCTCTAACTTTGTTTGTTTTTCAAGAGTGTTTT
-GACTCTTCTTACTGCATCCCTTGCATTTCCATATGGACTTTATAATCAGCCATGTCAACTTCTGCAAGAAAGACAGCTAG
-GATTTTGATAAGGATTGTGTTGAATCTGTAGTCCAATTTTGGGAATACTACCATGTTAACATCGTCTTCCCATCCATGCA
-CGTGCAATAGCTTACCATTTATTTGGTCTTCCTCAATTTCTGTCAACAATGATTTGTAGTTTTCAGTTGCAAGTCTTGCA
-CTTCTTTTGTTAAACTTTTTCCAAATATTTATTCTTCTTAATTACATAATTCTCATAATTAATAAAATTCTGAAATTTTC
-TTAATTTCATTTTTGTGGCCATGCACTTTAAAACTTGCCTTTTAACAAGACTTCCAGATGATTCTTGTGAACATTAAGTT
-TGTGAAGTGCTTCTCTATTGACAAACTGAACTCACGTGACATTCCACACAGCACTGGCAAATTCTGTCCCGTAACTCCGC
-TAGCTCTCCAACAAGAAGTGACTTGACGCAGCCCAAGGTTACTACTTAACACAATGAATTAAATGTTTTTAAATAAGAGG
-AAGCAATAAGATTCTAAAGGCTTTTCTGTTTTAATTTTCATGCAATGGAAAACTGGTATTAAATATCTATTTAATTAGGA
-GGAAACTACAATGCTGACTTTTGTCTGAATTATGTAGATAAGTGATTCATTTGAAACAATTATTTTGATAATTGTCAATT
-ATCCATTTCATTTTAATGCATTTTTTATTCTTTTTTCAAAAATAGCAACAATTACAACAGTTAAACCTTATAATGAATAT
-GTTTCCTAAACCCTGTTCTACTTTCTGGTTCCAGATCTGACACCAATTACCTTTCTGATTTTGGACAAACCACTTAATAT
-TTGTAACTTACAATTACTTCAACTGAATAATAAAAGAATTGGACTAGATTTCTCCAACATCTCTCTCTTTTGGCTTTATG
-TTAGATAATGCTAAATTTTCATCATATCCAAACATGCTATATAATTTTATGAACTGTTACAGAGTCAGACATAAGCAATA
-TAAAGTATGATTCTGAATAAAGGCTGTGAAGTCTCGTTTTTCATACATAATTACAGGAACCGATCAAATTCAATAAAGCA
-TTTATAGTCATGACAATATATTCTCTTAACTTGCAATGTGGTTTTAGGAAACAATGAAACAAATTAAACAAATGCATGAT
-TCCTTAAATTTTGTTGACTCGGGATTTAGTTACATATAAGACTCTTTTCCCCCAGCCAGATTAACCCTGCTCTGTATATG
-TAATACGCATCTTCCCCCCAAATTTCACAATAATAATTTTATGAAAATCAGTATGTAAGTTGCTGCATTGGCATGAAAGG
-CTACTAATGTGATATCTTTCAAAGATAAAGTGAACGTTTTTGTAAAAAGCCACCACACTGGAGGCATTTAACAATATTCA
-TCTTCCTATGGCATTACTACCCTAGATGTACTTTGCAATATTAATCAAGCCTTGTCTTACTTCAGGCTTCCTAGAAATAG
-AGCACAAGGCAGGGATTCTTTCTTGCTCGGTGATTTATTGAGGAAGTGCTCTCAGAAGAAATTGGTAAGATGCTAAGGAG
-AACAGCAAAGGACAGGAGAAGGGGGCTGAGCAGAGATGGGGATCTAACTGGAATCTGGCCTTTGCTGATTACCAGAGCAG
-CTCTGGGTGCGAATGGTGAAGTGCTGTTCTATTGACAAACTCCACTCAAGTGACATTCCATGCAGCACTGCCAAATTCTG
-TCCCATAACTCTGCTAGCTCTTCAACAAGAAGTAACTTGAGGCAGCACAGTTACAGAAAACAGCACAAGAACCAAGGATA
-CTAAACAGTGACTTAAATGTTTTTAGATAAGAGGAAGCAATGAGATACTATAGGGTTTTAATTTCTGTGCAATGGAAAAC
-TAGTATTAAATATTTATTAATTAGGAGGAAACGACAATGCTGACTTCTGTCTGCATTATAGACAAAATTGAGTTCTCCAA
-CCATGAGGCAAGGTGCTGGCTTTTTGTACCCCTGCACTATTCATTTGATGGGTGAGTGCACTGTAACTTCCAGACGTCTC
-TTGGTAGGTGGGCCCCACTGGCCAAGGGCATTTCCCGGGAGAGTGAACGGCTGTGAGCTACTAGCAGTAGCAGTCACAGC
-AGCTGGGAGGAAACACACTGGTCAGGTAAAGGGCCAGCATCTACCAAGGTCCAGTTCCACAATTAGTGGAGAAATATTTA
-ATAACATTATTTTTGAAAATAATTAGGCCATATGACTTTGACACTTTTTCTCTAGCAAAGTGACTAAAGAGAAGCAGGTT
-TTTAACTGGGTTTTTATTTCTGTTGTGTCTCTAGCCAAAGCCATGCTGATGTTTGATAGTTTTTTTTTTTCTTTTTTTAA
-GAGATGGGGTTTCACCATGTTGGCCATGCTGGTCGTGAACTCCTGACCTCAATGGCCTCCCAAACTGTTGGGATTACAGA
-CGTGAGCCACCACGCCCAGCCAGAATTTTTTTTCCTAAAGAATAGAACAACATTATAAAATTTTAGGCATTAAGGACAAA
-TTTTATTTTATGATTTTCATTTCGGTGAGTCACAAGATATTCAACACAAAATGAAACTTCACAAAATTTCACAAAATGAA
-AAATTCATTTCAGATTCAATATCCACCTCCATCATCCATATTCATTCTTCCAATGTCTCAGGCCAGAAATTTGGAGTATG
-TGGCTTCTCCACCTCACACAATTTGCCCTAACTTTAATATATACTCAGAAATTACTGGCTTTTCACTGTTTCTATGATTC
-CCATGTGTAATATACAATACTCACCATGCATACAATAATACAATAATTCTGTGTCACAACCACACCTAAATTGGTAAGTT
-TATAAGGTTATAAGCTGAGAGGTTTTGCTGATCTTGGCTGAGCTCAGCTGGGCAGGTCTTCCGGTCTTGGCTGGGGTTCA
-CTGACACACAAGCAGCTGACAGTTGGCTGATCTAGGATGGCCTCAGCTGGGATGACAGGCTGTTTCCTCACCTTCCAGCA
-GGCAAGCCAGTCCCAAGAAAGAGAAGGGTGAAACATGGAGGCCATTAATTGAGCCCATCGCATGAAACGCATCTGTGACA
-CCATCACCGTCTGATATCAACTCTCACCTGGATGTTTGCAATCGCCTAACTTTTCTCCTTTCATTCACTATGCTGCCTTA
-CAAACCTATTCTCCACAAATCAGCTAGAGCAAACCTTTTAAATCCTAAGTAGAATGCTACCATTCCTCTGCTCAAACTAC
-TGGAGAGGAGATGCCACAGTCTTTACTATGGTCTTCAAGACCCTATGGGAGGTAGCCCTGTCTTACAACCATAGCCTCCT
-ACCACTGCCCCAACATGCACACTGAGTTCCGGCCACAGCATCTGCTTCCTCTTTATTGATCTGCCAAGGACATGAATGAC
-TCAGAATCTCAAACTTATTCTTCCCTCAGAATCCACTGAGCCTACTCCCTCTTTTTCTCAAATGGCAACTTCTCAGAGAT
-GCCTTCTCTGGCTAACGTATATGTACTAAAACCTCCATCCAGCACTCTATGTCATCCTTACTATGGTTTATTTTTCTTCA
-TAGCACCTATCAATTGGTGAAGTATTAAATATGCATTTTTGTTTGTATGCATCTCTCTCCCCGCACCAGTATGTGAACTC
-CACCAGACTGGAGAGCGTGTTTATTTTGTTCACTGCTGTAACTCCAGTGTCTAGAACAGTGCCTGGCACACAGTAGGTGT
-TTAATAATGATTTGTTAAGCTAAGCCAATGAATAAATATTCTTTTGCCCATGAGATGATGTTAAAAATTTTTCAATTATT
-CATAACTGCCTGTAAGGAATGAATGTTAGTGAATTACTGTGATACCAATGAAAGTTAAATGATGCAATGAAGATTGGGTG
-GATCACAAGGTCAGGAGTTTGAGACCATCCTGGCCAATATGGTGAAACCCCGTCTCTACTAAAAATACCAAAATTAGCTG
-GGCATCGTGGCAGGACCCTGTAGTCCCAGCTACTCAGGAGGCTGAGGCAGGAGAATCGCTTGAACCCAGGAGGCGGAGGT
-TGCAGTGAGCCGAGATCACGCCACTGCACTCCAGCCTGGCCGACAGAGTGAGATTCTGTCTCCAAAAAAAAAAAAAAAAA
-AGATGTAAATATTATTATTGTTTGCCATCACCCTTATGTGCTGTCTTGGCTTTATGTCGTGCTTAGATCTTTTCCAGGTG
-CAATTTGAATTGATGCAACTAATGGAAACTACAACAGAAGTTCATATTGCCCTATTGTATTACACTATTTGACTCATCTT
-TCAGTATCACCAGGTGCATAAGGAAAATTTCAAAAGTAAATCAAGAGAAAGAAATATGATCGCAGCTTAACACAATGTAA
-ATTTATTATTTGTACTTTTTGTCTAAATGGTTTGCCTAAAAGACTGAAAGACATTTTATATTAGTTAGAATACTTGAGGA
-TAATAACATAAAAACTTTCCTTTCCAACTTGTTTATAAAAGGAAATCTTCACTGTTTTGAACATCAGTTATTTTAAACTT
-TTAAGTTGTTAGCACAGCAAAAGCAACAAAATTCTAAGTGCAGTAATCACTTTACTGCGTGGTCATATGAAATCAAGGCA
-ATGTTATGAGTATTACTGGAAAGCTGGACAGAGTAACGGGAAAAGTGACTAAAACTATGCAAAACTATGCAAAACTAAGC
-AGATTGTGTCTCTAGAGTATTTCCCATCTCAAGTTTAGTTATTTACTAATTTGGCAACATCTGACCTATCTTTAATTGTG
-AGAAAATAAACAAACACATAAGCCAACTCTCAGAATATGGTTATACATAGGTGTAGCCTATGACTTTGAATGTATTTGTT
-TGAATAGCGTAAAACAAAATAAAAATAAAATCTTGTTACAGTGCAAGAAACGGCAGTCATCAAACTAAGATGAGGCAAGT
-GTCATGAAGTATGAAAATATGGTACCTGAATTCTATTTATTAGAAAGTCTTCACTGAGCTGAGCATGTTTTTTTTAACAA
-ATTCAATTACTGATTTGAATATTTATTATACTTAATTATTGCAGCCATGAAAAGAGGTGCTGGCTGAGGCTGCATTTAAT
-AAAAACATTTAATCAGCTTGAGGTTAGTAAACCATTTAATTTGTTTTTTCATGAAGATTTAACTTCTAGAATAATTTCAT
-TTATGTATTTTTAGGTATAGCCCTAGATTCTGGTCTACATAGTATACAAATCATTTTAGAATGACACTAGGTTATTTCAA
-CTGCTTTTCTACAGAAGTGTTAAATAAGGGAGTAAAGTGTTGGCTTTTTCCATAATTGAAATAAATGCACAATGAGCAGT
-AACATCCTGATTTCACTGCTATTTTGTTTAATCAACATAATGATGTAGATTTACTCTGTATATATATGGAAGAGTGAAAG
-AAGGTTGGGAAGGAATAACTATCAATTAATATAGGTGATATAGTAGTTATTTTTGCAAATCAACTATAATTTCTGAATGG
-ATATTCAGACCATATTTACATTACATAGAAGAGGCACACACCAAAAGATTTAACAAATGTGCCAAATATTGGTGAATATT
-TAGTTAGGTACCAAAAGGATGTTGTATAAATTAGGATGCTTTCAACCATAAGAGACTCATCTCAAAAATGGCTTGAAAAT
-GTGGGGAATTTTTATCTCAGTGTGAAGTTAAAGGTAGGGCAAGTCCAAATCAATTCAAGTTAATTAAAGCCCCAAGTTCT
-TGGAATTTGCTCTGCTAGTCTTAGCTGGTTAGCCTTTGTCCTGAAGTTTGTAACTTCATGACCAGAAGATGATCGCAATA
-TTTTCTAAGTATAAAGCCTGAAGGTGTAAACCAGGTAGTCTCAGCAAAACCAATGATGCATGGTCACCTTTCCCTTAGTT
-GACAAATACTTGCCTTCCAGATACTTTGAATCAGAATGGGCATTTTAACTAAGATCCAGTGCAACTAAAGGAATAATCAA
-ACAAATGATAAAATAATTATTCTGAGCTGAAAACACAAGTCTGAATATTGGAAGAGGTTCCTGATTTCCAGGCAGAATAG
-ATAAGCAAAGATATCAACCTAAACACATCCTGGTTATAGTCTAAAATTTAGAGAATAAATGGGAAAAGATTATGAACTTT
-AAGGAAGAAATAACAACTTACACATAAAACAAAAAGGAAAAACTATCTGTTGACAGATTTATCACCTGCTAGATAAGAGC
-AGAATAACCATTCACTAGGAGAAAATGGGAGAAGCTAGAAGATACTGGAGTAATATTTATAGAGTACTGAAGAAAAAACA
-AAAAACAGAAATTCAATACACAGCTAAGATATCATTTACCTGTAAATGATACATGGTAAAATAAAGGGTAAAATAAGGAT
-ATTTGCAGATTCACAAGGAGAAGTTAGCCTTCACATACTCAGCTGAGGAAAATCCTAGAGACAAAACTCTAACAAAAACA
-AACTAGCCGGGTGCAGTGGTGCAGGCCTGTAGTTCCAGCTACTCAAGAGGCTGAAGTAAGAGGATCACTGGAGCCCAGGG
-GTTCTGGGCTGTACTGTGCTATGCTGATCAGGTGTCCACACTTAGCTCGCCATCAATATGATGACCTCCCAGGTGGGAAA
-TGGAGCAGGTGAAAACTCCCATGCTGATCAGTAGTGGGATCATGTCTGTGAATAATCACTGCACTCCAACTGGGAAACAT
-AGCAAGACCCCATCTCTAAAAAACAAACAAACAAACAAACAAACAAACAAAAATGTTTCAGACAAATGTCAAGATAGAGT
-AAAAGAAGAAAGTACTGAAGGCCCTTCAACATAAATTGGATCAGATAATAAAAATAATAGCAAAGTTCTTTTCATGCTGT
-ATCCTTAATTCTTCACCATAATCTTAGGAAGTGAATGTATTAATTATCTTTTGCTATATAACAAATTACTCCCAAAACTT
-GGCGGCTTAAAACAACAAATATTATTTCACAATTTCTGTGGGTCAAGAATTTGGAAGTAGTGACTCTGGCTCAGGGTCTC
-ATTTAAGGTGGTAGTTCAGGATGCCAGTCAGGGCTGCAGGCACTGAGGCTGCTTCCTCAATGGCCCACTCACATGGCTGT
-TGGCTGGAGGCCTCTCTTTCTCACCACACGGGCCTCTTCATAGGACTGCCCGAGTGTCCTTACAGCGTGGCAGCTGGCTT
-CCCCCAGAGTGAACATTCTGAGAGAGAGAGAAAGAGAGAGTTAGAAGGCATGCTGTCACTTCCACTGTATCCCATTCACC
-AGAAGTGAGAGACTAAATTCACCAAACAGAAAAGTGAAGGAGAATGAGGCTCCAGTTTTTTGGGTGAGAGTTGAAGAATG
-TATGGATATTTTGAACAACCACAATATAATTCTTCTTTTCACAGAAGCACAAAAAAATTTATTTAACTTGTCCAAGTTTA
-CACAGTTAGCAAGCAACACCTTTGAGAAAAAAATCCATGTAGTCTGATACAAGCACCCAAACTCATAACCACAATGTGAA
-TCTAACTGCTTTTCAATTAAAAAAGAAAGAAAGATTCCCTTCAAATCTGGCATATGCATTCACATGGAGCATTCATACTG
-CCAGTGACAGTACCATAGTTATATGGAATTAGAAGTTCTAACTTATCTTGGCCAAACTAAAGACTTAGGGCTGGGTAGAA
-GGTTGGAGGGATGTAAGGTCATTCTCAAGATCTCATCTAGGAGAAGAAAACAAAATGGGGAAGTAGAAGACAAAATGCTT
-TTTTAGGTTGGGAAAGGACTGGGAGAATCAAGCATCTAGAAATGGGCACAAAGAGTTACCTTATTTTATTTAAAAGAAAA
-TAAATGTTTGACTATTAATGCCTGAGAACGGAAGGTGATTATTAATGAGATGAAAAAGTTAATCAGATTCTCCAAGTTAG
-GAGGGACTTGAAGACCAAATTGATAAAAATAAAAAAAAAGATGTCATAGTAGAATAATCTAGATAATAAGCAATCAATGA
-GACTGAAAAAATAAAATCAAGTATATCATTTGTTACACTAAATATTAATATACCAGATTCTCTCATTAAAAAAACAGAGA
-AAGTCAAATTGGATTAAATAAGAACAAAAAGTTAGCTATATAGTATTTATCAGAAACATTCTTATAAACAAATTGATAAT
-GAAAGATTAAAAATAAGAGATTTGAGGCAAGGCAAGCAAAAAGAAATAAATGTTAAACAAGGAGAAATTAAAGGCTACGG
-ACATTACCTAAGGAAAAGGATGACATAGAGTTACAGTGGCAAAAGTTAGGAAGCAGATGACATAAATCTATATGCACAAA
-CAGTATGGCCACAAAATACATTAATTAAAAATTACTAGAAATATAAGATGACTTTGATTAAAATACACTGATTACAAGGG
-ATTTAACATATAAAAATTAGGCTGATGTGGTAAATTTAAATATAATCAAATATTTAGGAAAATAGAACAACACAACAAAG
-TTGATTACATATATTCATTTTCCAGATAGTATACTTTATGCCTATGAAATAGTTCTTAAAATCAATTATATATGGCCGGG
-TGCAGTGGCCCACGCCTGTAATCCCAGCACTTTGGGAGGCCAAGGCAGGTGGATCACGAGGTCAGGAGATCGAGACCATC
-CTGGCTAACACAGTGAAACCCCGTCTCTACTAAAAATACAAAAAAAAAAAAAATTAGCTGGGCGTGGTGGCTGGAACCTG
-TAGTCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATGGCGTGAACCCAGGAGGCGGAGCTTGCAGTGAGCAGAGATTGCA
-CCACTGTACTCCAGCCTGGGCGACAGAGTGAGACACCGTCTCAAAAAAAAAAAAATCAATTATATATTTAAACACACACA
-CACACACACACACACACACACACACACACACACACACCTTTTCTAAAAAATCGGGATTTAATAGACATATTATCTGATCA
-TAGGCTGTTGAAGATAAATGATTTAAAGGTGGCCTAAAGTTTAAGTACTTGCAAATTAAGAAACATCCTCTCCACATCAA
-AGAGAAAATCACAACTAATGTTACTAATTTTCTAGGAAGCAATTTAAAGAACACTAAATCCAAAACCTATGAGACACAGA
-TGAAACTGTGTTCAGGGGAGAATGTATAGCCTTAAATGCTTACATTAATAAAGTAAATGAAAGAAAAAAATAGTTTTTAT
-CCTAGGAAATTAGGAAAAAAGCAAATGAAGTGAAATATACTACTAAGAAATAAAGGCAAAATTACTGAATTTCATGAAAT
-AGAAAACAATAAAATATATTAGAAAGGATAAAAAGGATTTTAAAAATCTGCTCTTTTAAAGAATCTGTAAAACAGAAAGC
-CTTATGGTTCAGATTAAAGAAAAAAAGTTTGTGTACGTGTGTGTGTATGTATTAAGAAAGGAGATATAACTTCACAATCA
-AAGAAGTTTCAAAGAATTGCAGTTACATGGCAATAAATTTGAAAACTGAGAGGACACAGAAGATTGTGTAACAAATTACA
-AATAATGAAAATTGACCTTATTCTGAAGTAGAAAACAGGAATAGATCAAGTTTCATGCAAGAGTTTGGAAAGATGATTAA
-AAATGTACCCTCTAAAGAGCAAGCTGGGCATGGTGGCTCATGCCTGTAGCCCTAGCTACATGGGTGGCTGAGGCAGAAAG
-ATCACTTGAGCCCAGAAGTCCAGAAGTTCAAGGCTACAGTGAGCTATGATTGTGCCAGTGCCCTCCAGAAGAGAGAAAGA
-AAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAAGAAGGAAGGAAGGAAGGAAGGGCAGAAAGCAGA
-CCAGACCAGATTTCATAGCTGTATTCTGTCTATCCTTAAAGAATAAATAGTTCCACTTATATTTTAAATATTCTAGACGA
-CAGAAGAAGGAGGAAAGTTCTTAGGAACCGATAAGAGAATTCAGAAGAACCAAGATTCAGTAGCCTACAAAGAATGAAAA
-TATGCTCATAGCAAGACAGCTTTTGAGATATTTATTTCAAATTCACAAAAACTCCCCCATGCAATCTTAAAGAGGCTTTA
-CTTTATTTAAGCCAAAGAAAAGTGCAGATCCTGATATGAATATATTTATCTACAAAAGGCTCATATTCTGAAGTAATACT
-ATTCAACTCTCATTCATTCAAGAGCTGTTCTGTAATTGTTCCAATATAAAGGAGTCAAAACAATTTCTTAATGGAAGTAT
-TAAGTAGTGCTCTATGTTGTCAACTAATTTATTTCCCATTTCAAACATTAGTTGACATGTTTTCATTTCTCTTTTGGAAG
-GAAACAACTAAATATGTTATCAATCCATCATTTACTTGTACAATAAATAAAGTTCTAAATCACTGCACAGTGTAAAATGG
-CAAATAGACTTCCCCATAACACAAAGCCATCCTGAAAAGTTTTGTTCATTTTAGAAGAAAAAATTTTAAAACCTGAGCAC
-CATAGGATATGAATTTTGTAAATAATTATGAAAAGAAAACAACAATAATAAAACTCTACTAATCTTAGCTCGATCTTATA
-AAAAGTTCCATAATGAGTAATCAAATTTTATTTCCAATTAAATATGTTATCACCCAGTAGTATGCCATACCAGTTTCTAA
-TTCATACTTCAATTATCTTCTAATTTAAATTAATGACTATAATTGCTGTTATAAAACAACAGCTCTATAGCCTGCTATTC
-AGACCAGTAAATAAGAGTTTAAGGGCTTGTGATAGCAAATGAAGTTTCTTATTGGATTTTAAGAAAAATTTTTATAAAAA
-TATGTGAGGTTATTCAATAGAATCACATTTAATTTGCCAAGCATTTTGCAGAATGCCTAGGACTATGTAAGAAGTATTAA
-ATTTGCAAGCCCTTTGAATAGTTGTAATTTAAAGATAAAAATTGGTTTAATACCAGACAAAGATAGAAGCACAAGTTAGG
-TTATTAGAGAATTTAGCCAGTGTATCAGTTTGTATCGTAAGTCATTGGCAAGAACAACGTGTACTTTTCTGTCACCTCCC
-AACTAGCTATGTTTTGAGCAGTAGGAATATTTAATACCCCTTCCTCCCATTTTTCCTTTGTGTTGTCCAAATTCTGACAA
-CTCTACTGCCAGATAGCTCAGGGCAAAAATGATAAAGTTCAAGTTAAGAAGGCTCTGCAGTGTTCTCAGTTCTCCTCTGG
-TGAAAGAGGAGAAAGGTTGTGTTTAATTATGAATCTGGGATTTCCAAAACTTTACCCATGCCCTGCCTGTCCCCTCATTA
-GCATGAAGCTGTTATTTAAATAGTTCAGCAATAACGACTTTAGTAGCCTCCCTAGGTTAAAAAGATTGAAATTAAATGTG
-TTTATCTATTGTTCTACTATTCAGTTACCTGATTATAAAATCAAAGATTATTTCATGAAACTCAGTACCCCTTCAGGGAA
-AAAAAAAAAAAATTCCCTAAAACAAAGTTAGGAGAGTGAATCGGACCACATGCTTATCTCCAAGGTCTCAATCAAACAGC
-AAATGCTTACCCAACTTCTATTCAAAATATTTGCGCCAGTAGTTCTGATATGACCCAAGCAGAGTTCACACATTATTAAT
-CTACTCCTTTCAGTCTTCTAGATGTGTTTCCTCCAAAATCTACCAGATTCTCAAATAATTTCAGGAACTTTCTCCAGAAC
-AGAAACAAGGTTGTTACTGATACCAACTTTGTCTCCAAACATGGGGAAGATTATCATTGGAAAGATCTATTGATGACCTA
-TAATACATAGTTGGAACTGTTTATCCACAGAAGTATTCCCCAAGAATCAACCACAGAGCCAAGATGGAGCTTATGTCATT
-GTTATGCATACTTCTTTTACGGCTTGTGAGGGCAGTTCATACTATTCTGATTTTACAACTGAGACCCAAGGAACCTGAGT
-GACTTCTAGGCTCCATTATGTCAAAAAAAACTCAAATGTGAGGCTTTGCCTACACTGAGAAACAGTAGTTCAAGAAACGG
-TGCCCTGGTTCTGTTAAAATAATCTGAGAGTTATGTGGTAAGTAGTTGAGAGTGAATAGGGTAGCTTTGAGAGGTGACAG
-CGTGCTGGCAGTCCTCACAGCCCTCGCTGGCTCCAGGCGCCTCCTCTGCCTGGGCTCCCACTTTGGCGGCACTTGAGGAG
-CCCTTCAGCCCACCACTGCACTGTGGGAGCCCCTTTCTGGGCTGGCCAAGGCCGGAGCCGGCTCCCTCAGCTTGCAGGGA
-GGTGTGGAGGGAGAGGCGCGAGCGGCAACCGGGGCTGCGCACGGCGTTTGCGGGCCAGCTGGAGTTCTGGGTGGGCGTGG
-GCTTGGCGGGCCCCGCACTCGGAGCAGCCGGCCAGCCCTTCCAGCCCCAGGCAATGAGAGGCTTAGCACCCGGGCCAGCA
-GCTGCGGAGGGTGTACTCCGTCCCCCAGCAGTGCCAGCTCACAGGCGCTGCGCTCAATTTCTCACCGGGCCTTAGCTGCC
-TTCGCGCGGGGGGTGCTCGGGACCTGCAGCCCGCCATGCCTGAGCTCCCACCCCCTCCATGGGCTCCCGTGCGCCCGAGC
-CTCCCCGATGAGCACCACCCCCTGCTCCACGGCGCCCAGTCCCATCGACCACCCAAGAGCTGAGGAGTGCGGGCGCACGG
-CGCGGGACTGGCAGGCAGCTCCACCTGCAGCTCTCGTGCGGGATTCACTGGGGGAAGCCAGCTGGGCTCCTGAGTCTGGT
-GGGGACGTGGAGAACCTTTATGTCTAGCTCAGGGATTGTAAATACACCAATCGGCACTCCGTATCTAGCTCAAGGTTTGT
-AAACACACCAATCAGCACCCTGTGTCTAGCTTAGTGTTTGTGAACGCACCAAGCCACACTCTGTATCTAGCTACTCTGGT
-GGGGCTTTGGAGAACCTTTGTGTCCACACTCTGTAGCCAGCTAATCTGGTGGGGACATGGAGAACCTTTGGGTGTAGCTC
-AGGGATTGTAAACGCACCAATCAGCGCCCTGTCAAAACAGAGGACTCGGCTCTACCAATCAGCAGGATGTGGGTGGGGCC
-AGATAAGAGCATAAAAGCAGGCTGCCTGAGCCAGCAGTGGCAACCCGCTTGGGTTCCCTTCCACACTGTGGAAGGTTTGT
-TCTTTCACTGTTTGCAATAAATCTTGCTGCTGCTCACTCTTGGGGTCCACACTGCTTTTATGAGCTGTAACACTCACTGC
-GAAGGTCTGCAGCTTCACTCCTGAAGCCAGCGAGACCACGAGCCCACCAGGAGGAACCAACAACTCCAGAAGCGCCGCCT
-TAAGAGCTGTAACACTCACCGTGAAGGTCTGCAGCTTCACTCCTGAGCCAGCGAGACCACGAACCCACCAGAAGGAAGAA
-ACTCCGAACACATCCGAACATCAGAAGGAACAAACTCCAGATGCGCCACATTAAGAGCTGTAACACTCACCGCGAGGGTC
-CCTGGCTTCATTCTTGAAGTCAGTGAGACCAAGAACCCACCAATTTTGGACACAGTTTGACAATAAATTTACACTCAAAT
-ATCTCTAAGGAATCAAACTTACAGATTAATAATTAGTAATCAGGTCACGTAAAGTAAATTATAAAAGAGCATTGATACCA
-AGATTGGCAGAAAGTTTTTTGTGTGACAAAACCAAGTTTTGGCTAAGATACACACTGCTGATGGGAGTCTAAATTGCTGT
-ATATGTCGGGAAAACAAGTTGTCTTTATCTTGATGTTATAAATAACCTATGACCCAGAAATTTAACTCCTAGACATATAC
-TCTAGTGAAACTCTTGAACGTGTGCGTCCAAAGACATTTATAAACATGATCTTAGTAGTATTGCTTTTAGTAGCAAATTC
-TGGAAACATCCCAAATGTCTATCAATAGTGGAATTGATTTGAAAGGGGTGTGGAATGGTAATATAATGGAATAGCCTACA
-GCTGTTTAGATAAAGGAACTCCAATTAAACATACCAACAAAGATACATTTCAAAAACAAGACGTTGAAAGGAAAAAAGTC
-ATCAAAACAATACACAACATTCTACCACATTTTTATAAATTCTCAAAATATGCAATATTAAACATGCATTATTTAGGGAG
-GCATTCAATGTAGCAATGCATTTTTAAGAGGCTGGGATGATAAATGTAAAATTCAGAACAGGTATTATCTCTGGGAACAG
-GAAGAGGAGGATGCAGTGTTGGGAAGAAATACATATAAGTACAGCAGTAGAGGCAGACTTTTTTTTCCTTTTCCTTTTTC
-CTTTATTTTTCCTAGCTTTCTTTTTCTTTAGCTATGGTATTTCTTTAGCTATGGTATGGTATGGTATGTACTTTCCATAT
-ATCATACAGTATATTTTGGTGTGCATGAAATAGTCCTTAATAACATTTTTATTATTTTTTATTTGACGTTTAAGTTCAGG
-GGTACATGTGCAGATTTGTTATATAGGTAAACTTGTGTCATGTGGTTTTGTTGCACAAATTATTTTCTCACCCAGGTATT
-AAGATTAGTACCCATTAGTTATTTCTCTTGATCCTCTCCCTCCTCCCACTCTCCACCTTCTACCCTCCAATAGGCCCCAG
-TGTGTGCTGTTCCCCTCTATGTGTCCATGTGTTCTCATCACTTAGCTCTCACTCATAAGTGAGAACATGCAGTATTGGGT
-TTTCTGTTTCTGCGTTAGCTTGCCAAGGATAATTGCCTCCAGCTCCATATTCCTGCAAAAGACATAATTTTGTTCCTTTA
-TATGGTTGCATAGTATTCCATGGTGTATATGTACCGCATTATCTTTAGCCAGTCTATCATTGATGAGCACTTAGGTTGAT
-TCCATGTCTTCGCTCTTAACATTTTTAAACAGTCTCTGAGTAGAATAGGGTAGGCTGGTGTAAGGAATTACTGTTTTTAA
-TTGGAAGCAATTACATACTGCATTAAAAAGCATATATATATAGACACACATATATATGTTTTACATTCACATAATCAAAC
-CAAAGCTTTCAGAATTTTCCGCCAAAAAGCATGTGTGGAGGGAGAGAGAGGGGTGTTATGGTGCATTTGTAGGCCCTGAA
-ATAAAGTGATCTCCATATTTGCTTCCATTTGTGTATAAATATTTTTTAAGCATATATGCATCCTAGAGTATGGAAAGAAA
-ATTTCTGGGAAGATTTGCAAGAATCTGTGGCAGTTGAGAGTAGGTTCACTTTCGCTTTATTGTGTAATTTATTGTATTTT
-TCATTTAATTGTACTTTGTAAACTAAATATTTATTGTATATTTTACTTCATTTTTTAATTGCCATATGCAGCTTTAATTT
-TATAACTAAATTACGTTCTGACCCAGGGCAGGAGGTGGGAGAAGAGAATGAGAGAAGGGCGGAATCCTCAAGACAGCAGC
-ATTCTGCGCTCCGCCCTGGAACACCCAGCGCAGCTACCCCATCCCGCCCAGGCCGGCCACCTGGCGTCGAAGCCAGGCGC
-GAGGGGCGGAGGCGGAGGCGGGGGCGGGGGCGGAGGCGGAGGCGGAGGCGGAGGCGGAGGCGGAGGCGGAGGCGGAGGCG
-GAGGCGAGCACCGCCCCACCGCGCACGCTGCGGTTGCCCCGGCAGCCGCGCCCTGCGTGGCGGAAGCTCACAATCAGCCC
-GGTCCCTCCGGCTTCCACCCCGCCCCCTGCGCTCACCTGCCCGCGCGCTCGCCTTCCGGGGACCCGGGGCCCATGGACAC
-ATACACCCAGCCCTGCTGTCCCGCGCGCCAGCTCACCAGCCCTACCCAAGGGACATCATTCACGCCTGGGCGCCTCCGCC
-GGGCTCCGGGAGCCCAAGGTCGCGGCTGGGCCAGCGCTGAGCGTCAGAGGACGAGAGCAGGGGCCTCCCCGGTCGCCCCA
-GCAGGCCCAGGCACATAGGTGCCCAGAGATCCCTGGCTTCTGATCGCCCGGAAGACTAAGAGGTGAGCATGACACATGGC
-TTTTCCTTTGACGTTACATCTCTACCCCCTCCACTCCTCTCTTCTCCAGATTTTTCTGGAGACTAAAAAGTGGAAAGCAC
-AGTAGAGAACCCCCAACATGTAAACTATCGCTTACACTTGTGGGTGAGCTGAAACCCGCAAAAGTTTGGTGTATTCATAA
-GGAGCCTATATTGAAGGACTTTGCTAAATGTTTTACAAGGATCATATCTCATTTCCTTTTCACACAGTCCCATGAAGTGG
-GCACCATTGCTATTGCCAGTTCACAGATGCAGAAACTGAGGTAAAAACTAGGTAGGTAGCATATCCATATTTATATCCAA
-CTAGTTTGTGTAAATAATGATACAGGGAAGGGAGGATCACAACGGATTTCCCCACCTCAAACCCTACATTCCACTGTACC
-AAGCTTGTCTTCCTCCATTCCTCTTTCTAATGATCCTTCCTTGTCGCACAGCCCCCCTTTGAGAGTTAAATGACCTGAAC
-ACACACAGATTCCCACAGATTTTCATGTAATTTCCGAGTATTCAGACCCCGAACATGGACCTCAAGTCAAGACATTCTGC
-TCTATTCCACTACCTTGGTAGATGGTTAGATGTGACTAAGGTGGCCCAGGGTCATGCTGGGGAAAAGTACAGGTGTGCTT
-GTATGTGGAGGATCCTATATGCTGCTCAATTTACAAGGAACCCAGGACCCAAGGGCTACACTTGTGTGATTTCCTGCAGT
-GGGGTGAGCTCTTGGTCAGTCTTAGCAGTTGATTGTGAAGGACACTATACAGGGTGCTGCCCTCTCCCCAGCACTTCAGG
-GCTTTAGCTGGGAGGGAGGCAGTCCACAGGAAACCGACCCATGGACCTACTGAATTCATCACTGTAGCTGCTAATTAATT
-CTCCGTTAGAGATGGGTGCTAACAGAGGCAACATTGAAGTCCCTGATTGGGAAATCCTTATTTTCACAAATCAAGTGGCA
-TTGATTCAGTCTAATCATTACCTATGTAGGAGCATCTTGCCCTATTCCATAGATGACACATATACATATGCAGTATGATG
-ACACCGCACCTAATCGGAATATGGCCGATAATAATAAAACAAGCCATAAATAGCAGCTAAGGTGAGTGTCACCAAGCCGT
-GCAGCAAAGTCCAAGTGGATGACTCTGAGGCAGCCTCAGTTGGTTCCCTAGTCCACCGCATGTTATAAACAGATTAAAAG
-GCAAAGGAGGCCTGGCCCGGTGGCTCACGCCTGTAGTCCCAACACTTTGGGAGGCTGAGGCGGGTGGATCACCTGAGGTC
-AAGAGTTCAAGATCAGCCTGGCCAACATGGTGAAACCCTGTCTTTACTAAAAATACAAAAATTAGCCAGGTGTGGTGGTG
-GGCACCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCAGGAGGTGGAGGTTGCAGTGAGCCG
-AGATTGTGCCACTACACTCCAGCCTGGGTGACAGAGTGAGAGTTGGGCTGAGGGTCGAGGGTCATGGGATAGGGCGAGAC
-ACCAGGGGAGTGTGTGAGGACAGAAAAGAGTCTTGAGGACCTAGCCCTGGGCACCCAACATAGGCTTCTTGAAATGGGGA
-GTCAGCAAAGGAGCCTGAGCAGGAGGGGGCATTGGTGTTGGATGGAAGCAGGCGATGGAGATGTTGTGGTGCCTAGAGAG
-ACACATTTAAAGGAGAGAGAGCTCACTGCCGTAGAGAATGTAGGTGAGGGAGCAGGCTTGCGATGGAGAAAAATGGTGCA
-TAGTTTCAACTTTTGTAGTAAGATGGAATCTTTTCATTGCAAATGTTGGAAACTTAGCTAACTAGCTTATACCAAAATAA
-GGTGACGGGGGAGAAGATGTATTTACCCACAAAGTGGTAGATGGCTTCTGGCACCATGGAATCCATGTTGCAACTAATGC
-CATCAATCTCAGTCTCTCTCCATCCTCCAAGCATGGACTCTCTCTGTGGCACCCAAGAGAGCTACCTGCGCCCCAGCCCC
-ACACCATACTGCTTAACAACTTCAGCAGAATAGTCTTCCCTCATAGTTCTGGATGATGGGCTGCTGATTGGTTGATGTCT
-TTTATGCACATATGCTTGAGCTTCAGTGTACCTGGAAAGGGATGGTTCCCTCAAATGGGCCAAGCCTAGGCCACAGACGC
-TTTCCTCTGGCAGGGGACAGAAGGGACAGCCCCATCCAAACGACCCGGATAGGATTCCCTATGTGATAATGGAGTTCTTT
-TCTCATAAGAAATGAAGAAACAACTGGTCATACCTAGCATGGCCTGCTACTCAATCCAAAAGATTTTCCGTACAAGGAGG
-TAAAATTACATACTAGAATGCCCATCACAATTTAACAGGGAGATTGTTTATGAAGATTTGCAGTTTCCTTGCAGCCATTT
-AACTACATCTTTTCCACTTAAGATGACATAGGAATCACTCATCACATCTCTGATATGTTACAGAGCCCAGTAGATTTGTT
-TATAATGAACACCTCAAAATTATATGTTTTTATAACACCTTAAAACTATTAAAACCTGCATGATCTCTCTATTTTGCTGG
-TGTGAAACCATGTAGATAGATGGTGGGAACTCAAACCCTTACCATGGCAATTTAGTTAACCTCAGCTTCTTCATGGTAAA
-ATGGTAAAGTGTGATGAGGAGGGAAGGTTAAATGGATAATAAGAAAACCACCTGGCAAACTATTTTTAATTATGATGGAA
-GATTTGTTTGAACTGTTTTAACTTTATGCCCACTCAATATTTTTGATATTTATGTATAAATCCTACTTTCTGAACATTTC
-TTAAAAAACAATCTCTGTTCTTAAGGAAGTTCCAAAATATTGTTATTTAATCAAAATGAAGATGATAAAATTAACTTTGA
-GTTATTTTTCTTTTTTGTTGCTTCAGCTTTAGTTTTGGTCCAGAAAGCATTTTCAAGGAGCTGGTCAAGCATGGCTTTAG
-CAGATAAGAGACTTGAGAACTTACAGATCTACAAAGTTCTTCAATGTGTGCGGAACAAAGACAAGAAGCAGATAGAGAAG
-CTGACCAAGCTTGGATACCCTGAACTAATCAATTATACAGAACCCATTAATGGACTTAGTGCTTTGCACTTAGCCTCAGT
-TTCCAATGATATTGATATGGTCAGCTTTCTCCTTGACCTTGGTGCTCACCCTGATGTGCAAGACCGAATGGGCTGTACTC
-CCACAATGAGGGCTGCAGAACTGGGCCATGAATTGTCAATGGAAATATTAGCAAAGGCAAAGGCTGATATGACTATAGTT
-GATAATGAAGGAAAAGGTAAAAATCCCGACATCCTCTCCAGCAGATTGCAATTCATTTTGTAGCCAGAAAGCAATAACAT
-GGACTCTTTTTGTTTTCCAACTTTAGAAGTGAATTACTTATGGTTTTAAGGGAAAGGCTAAATTCTCACTCCTATACCTA
-AACCTACTGTCTCCTCATACTTTGAAAATGAGATAGCTATATCTTAGGGAAATCATTTATGAGAGCTTGCTCATATACTT
-AGATTAATTTGTGTTTGGTGGTTTCTTTTAAATGAGGAGAATTTTGAACATTATACACACTGATTATTCATTATAAATTA
-TAAACTCTTCTTTAAAACAAAGATGAAGTAGAGCATTTCTTATTCTTTTTTACATTTTAGAATTTCAGGCAGTACTACAC
-CTAGGACTCCAAAAGGATTTTGACCCCCTCAATAGCAGTCTGATGTAGGAAGGACTTGCACTTGGAAACTTGAAAGGACT
-AAAGTCAATTCTGGCATAAACTCCAACTTTCTAGGATCATTTAAAAATGTATTTGGAAATACAACTTCAAACTTTAGACA
-TGACCTTTCAACAATGATTCAGATCAAACAACTGCACTTCCACACCGTTAATCCCATCATCTCAAGACCATGGTCTGAGG
-ACTTCTTGCCCAAATAACTTAAGGTTCAGGCAAGAATTGACACAGCCTCATAAAAATAACTGAGATAATTACCAATAAGC
-TTAATGTAAACTGATAGGTTTGAGCAGTTGTCCTGAGTTTCTGCAGATACAAGGCCATTAACATCAGCTCTGCAATCGAG
-AAATGAATCTCATTTGATAATGTGAATATTTACTGACAAGAGCAAAATCTACTTTTCTAACTCTCTCCAGACTTGGTGTT
-TGATATGATTACTTGCTTAGAACAAAAGAGGACAAAGAAAAGGGATAATTACATATTTAATTGTACCACGTAAGAAAATA
-AACTTCAGATGCATTCAGGGGCCAGATGTACTTTGAAATGCTAAATCCTGAAAAAACGGTATCCTCTCAAAGCTCTATAG
-TATACCATTTCCCAAAGTGTGTTCCATGGACCACTGAATTGCCAGGATGTTGAGAAGTACTACAGGCAAAATTGGTTCCA
-CGGTCGCATTCATTAGAGACACATTTTAGGCATTTATCTTTCACATTGTTGGCTCAAAAATGGTGACATTTTCCATATTT
-ATTTGACCACAAAATAATTTTTTTTAATGACATCTTATATGCCTGGAGTTTTGTGGACTAACCTTTGGGAAACACTATAA
-TAGAGAAACGTTTAACTTACTGAGTTTGAAACAGATACAAATCACAAAGAAAAAAGAAATTCTATAGTGTAACAATGTAA
-AAGTGTAAATTTTTTTTAAAAAATCAAGGTAAAATTGGAAACAAGGTCAAGTAAATACTTGCAGCAAATGCAACAGGCAT
-ATGGCTAAAGGAAACAAATCTCATGGGCAGAACTGAAACTATAAAAGGAAACAAATGTAAAATCTTGTTTCACACATAAG
-CTTGTTAGGATGGCTGCCTGCAGCCCTCACTCTGCATAACCCAAGGTAGTGCCCATTGTACAGAGTACATTGTCTCTTCC
-CACATCAACAAGGCTCACTCAGCTTGCACATCCCTCAGTTTGGCTGCCAGTGGCCAAAGTGCTTTGCTTATTCCACAGTA
-CCCTCTCTGTCATTGACATCCTATTTTCTGGTGACTCATGTTTGACTCACTGTACATCGTTCCTAAAGGATAAGCAAACA
-TTTAAATGGCTAAGTGGGTCTTTAGGATGTGAGACATGCCCTAGGCCTAAGCGGCACTTTCTCTTGGAACAGTTTTACAG
-AATATGGAGAAGGTAAAGCTCTAAGCCAATACATTCTTTCTTGTATGTTGTCCTAGGGAATTAATTACAATGTGGAATCA
-TTCTCCTTAAAAGTTAAGCTATAATAGTTCCTTATAGCACCCATTCCCATTCCATTGGTTTTTGCATTTACAGGCATGTG
-TACTCAGTCCTCAATGCCGTATGCCAGTTCTATGATAAGGTACAATATTTTTCAAACTGTTTTCCCTTCAATTTAGGAAT
-GCTGATTCGTGTTCTTTGTGGCTTAAGGAGTCAGCCCAGATACACTTTAACTGTGTGTTGCACATGCCATCATTATGAAA
-TATTCATTTCATAAGTGGCTCTGGGCCTTTTGTAATGAATTCAGCCTCCTCGGGTATTATGCTTAGGTTGTTTTGCTGTT
-GCTGTTGTTGTTTTGCTCTGTTCCTGCCTTCTATGTCTTGCTCTTTCTTTGACTTTCTCTTTTCAATAATAACCTTGACA
-ATCTTTTCTTTTTTTTTTTAACTGTTCTGAGTAACCCTACTTTAGGTACATCAGTTTATATAAAATATATTTAGGTTTTG
-ATTTTCATATACATTTTATTTTTTATTTTAATGGTGGAATTTATCCAATTTATAGTTATCTAGATTTCCCATAGGGTTGG
-TTTCAGAAACATCATTTATTTTATATTGTGAAGGCAAAATATATCTAATATATAAAATACATGTGAAAGTATTGTCATAT
-ATGGTCCATAGATTTGTTTTACTTTGCTGTATATGTGTGTTTTTCTTTATATGCTTGTAAGTGTATTTTCTAAAATTGAT
-GGGCTTTTTAGTTATTTTAGTTTTTTTATTTTTTTTTAGTTATTTTAATGGTTAACTTGATACTTCATATGCCCTTAAAC
-CTGTTTATTGAGTTAGCATCTTAAACAGTATTCATTGATTCTTTACTCTGTTTAGTAAGATTAGTACAATAGTATAAATT
-AGATAAGATTAGTACAATAACCCTTCCTCTTACCTCTGCTACTTCCCTTCTACCACTCAATTTTATACTCAATTATAATT
-ACTTAGTTCTTTCAATGATTCCCTTTTAAATAATAAGTACCTTGTACTTTATTTCCTTACCTGCTTTACATAATATCTCA
-GTCTTAGCCCTAAAAGATGAGAAGATCAAATACTTATACTATTTCTCCTTCCTTCCCTCAAATTTTTGATAAATTATATT
-ATTTTTACATTATTACAAATTGCAATATATTTTTCTCTATCTAAAATTGCTAAGGTGACTTAGCTTTGGTTCTGTGGCTA
-AAGAGATTCAGTATTTATGACTGTTCTTTTAGTCACATATTCTCTATTGATCTCTTGGAAAACTCACTTTTGCCATCAAG
-TAGTTTAAGTCACTTCTTTGGGCTTGTATCCCTGATTACTTATATCCTTAAGACTATACATGTCTGTTGTTTTTACATGA
-ACAAAGTCTTGATTGGGTATAAAAGTTTCCTGTTTTTTTTCCCCAAGTTATAGTGTAGAGATCCTTTGATTATACTGTAG
-CATTGAATGTTGTTGTGATAAATTTTTGAGGGCAGCTGGACTTTTCCCCTTCATGGATTAGTTGAATTTTTGCCTGGATT
-CTTATGAGACACTTTCTTTGCCTAGCTTTACCTAGGCATGCCTTGTTGACTGTTCTTAATCAACTTTTCCTAAGACCCAA
-CGTACCCTTTTAATCTTAAGATTCAGGTCTATCTTTGCACTTTCATTTTAGAACAAGTTATATTTAGTTTCTTTGCTATC
-ATGGAAATGAATTAGCCAGTAATTTTCACTGGTATATCTTTTCTAGTATGTATCCTTTTTGCGTGGCTTTCAGTATCAGT
-TTCCTTTTTCCTTGCAGTATTTTTTTTTAATAGGTTGCATAGTGGTTTCTTTTTTGGTTATTCTTTGAATGGAGTCCCTT
-TTTTGGAATGAACTCGTTACAAAGTCAGTTTGGAGTCTGATTGTTATTTACCTAGGACTTTCTTAGTAACACTCTGCCCT
-GGGTTTATAACAGTAACCCTGATGTGTAGTATGCTTTTGACATGGATTATATTGAAGGCCTGTATGTTACAGGTCCTGGG
-TGTAGGGATTTAGCATGTTCCTTTCTCCAACGGAACAAAATGATTTGCTAAAATGGCAGAGGCACTTGCCATCTAATTAG
-CCACTTGGCATCTAATTCACCTCTTTACTGCTATACCGACAGCCTGCTTCTTACAAACATGGTCAGTCTACACATTTCAT
-CACCCAGTACCATCTCTTTTGCCATTCTGCAGTTTTAGAGGGGACCGGGGGACTTACCAGTAGCCCTTTGGCACACATAG
-CTGTAGCCCTTCACATTCCAAGAAGGGACACTCAGGGTACGTATTGCAAGATGCCAAATACTCAGGGTCAACAGGGTTCA
-CCTATCAGCGCTCCAATTCTTCCATAAGCCAGGTCCTATCATATGTGGTTGTGACTGTTTTCTAACGATGTCAGGAATTA
-AGATTTTTTGTTTTTTGTTTTCTGTCTTGGTGTTTTAGTTGGTTTCAGAGAGGAAACTGAGGCAGATATGCCTTTAACTA
-GCTAAATATGGATTTTTAATAATTTTACTTTCCTTCCTGTCAAATATGTATAGATGTTAAATACTCTCTGGGGATTTTAT
-TTCTCTGCAGGTGTTTTGTTTTACTGCATTTTACCGACTAAGCGGCATTATCGCTGTGCTCTGATCGCCCTTGAACATGG
-TGCAGATGTCAACAATTCTACCTATGAAGGAAAGCCAATATTCCTTAGAGCTTGTGAAGATGCACATGATGTTAAAGATG
-TGTGCCTGACATTTTTGGAAAAAGGAGCCAATCCTAATGCAATCAACTCAGTATGGCTATTCTTGTGATTACAAATATTT
-CTTGTTTCAATTACAGCATAGTATAATCTTTTCATTTAAATATGATGACATTATCCTGTTAGCTGATAGACTGTTCATTT
-TGATTCAAAATGCTTGAAGATGGTATACGTTTATTATCTTCATATTGCTGTGATTCTACAGTCTGTTTCCTAATTATGTT
-TGGAAACTTGGTATTTATTATGCATAATGTCAAGGTACCATTATAGGAAATAGTAAAAAAAGGCATTGCTGATGCCTAAT
-AGGATTTATCTTCTTAGAAAGAAAATATATAGTTCTGCTGTTTCTTTTCTTTTTCTTTTCCTTTTTTTTTTTTTTTTTTT
-TTTTGGAGACAGCGTCTCACTCTGTTGCCCAGGTTGGAGTGCAGTGGTCCAATCTTGGCTCACTGCAACCTCTGCCTCTC
-AGGTTCAAGCAATTCTCCTGCCTCAGCCTCCCGAGTAGCTGGGATTACAGGTGCATGCCACCATGCCCCGCTAATTATTT
-TTTGTATTTTTAGTAGAGACAGGGTTTTACCATGTTGGCCAGGCTGATTTCGAATTCTTGGCCTCAAGTGATCTGCCCAC
-CTCTGCCTTCCAAAGCGCTGGGATTACAGGCATGCCCAGCCTAGTTCTGTTGTTATATCAATTTCGTTCACTCTCCTTAT
-TTTGAGTTTTCTTGTAATTGCCCTTTCTTGACACTAAACATTGATTTTCTTCTCATTATAAAACACCTATGACCTAATTT
-TATATTAGGTGTTGATATTTTATCTCTCTTTCTCCCTTTTTATTCTGCTCTATTTGCAAGAAATACATTTTTTAGCATGA
-TATTCTCACAGGGGCATGCAGTGTGACCTTGACTCTGATTTTAGAATTCTACGTTTTGGATACTGACCCATTGTACTTGC
-TTAATTTTTCCTCTTTGTTACATGAAGCTAAGAAAAATGTAGAGAACTAAACTTGTAAGTGTAAAGCTAAGGTCAAATGG
-ATTCAGACTGTATTTGTACTGATTCTGCTACTTAATATGATGGGTATAAACAGCATCTCATATTGGACTATTTCATGTCC
-AGTCCACAGGCCGCACAGCTTTAATGGAAGCGTCAAGAGAAGGGGTAGTGGAAATAGTTCGAGGCATATTGGAAAGAGGA
-GGTGAAGTGAATGCATTTGACAACGACAGGCATCACGCTGCTCATTTTGCTGCTAAAGGAGGCTTTTTCGATGTAATAAT
-CTATTCTTTGCTTTAAAATTTGTTGCTAAAACTTTTCTGTCCTTTTTCTCAAATTTTTTTATATGTCATATAGAGTACGC
-TAAGGCAGACATTTTTCTGAGTTACCTATGTTGTTTTCATCTTGATTTCCCCAAATAATTCTAAAATTATATTTTTAAAA
-ACTTCATCTCTTTATTTAGTTTTATGTGTTTGCTAATTTACTTATTTAATATTATTCATAGTATTTTTCTGTACACTCGA
-TGATAACAATTTAAAACTTCTGCCACCTGGGACTACTGTATTTTATGACTTCATTACATACTAGAGTCTTCAAAATATAA
-TATGATCTAATTATGGGAGAACAATGCCCTCATACTCTTATCTCCATGGTGTTTGTGTGTATTAGATAATGATATACCTG
-AATTTTAAACTCAAGTATTCTGATTATCTAAACATACAGCAAAGAATATCTCACTGATACAGTAACATTGCAGAAACAAA
-ATAAAAACACTATTTTTTTAAATTCTGAATTTCATCTGAAATTTCTTTACTCAATTTCTTTGAGTTTTAACATAGTTATC
-TTCATTTATATCACTATTTTCCGTGCAATAAAAGTATACACAAAGATAGAAACCACGTTTGGTAAAGAATTTTCCCCTTG
-GATGCTGTTTTCCATGCTCTGATGCTTTCTTAAATTACCTACACTAACAAAAATGGTAGTGCCCCCTCTAAGTATAGAGT
-TTTCTATACTCTAGATCGATGCTATTTAATAGAACTTTTGGTGATGATGGGCATATTCTATGTTTGTGCTATACAACACA
-GTACAACACAATGGCCATGTGGCTTTTGAGTACTTTAAATGTGGCTAGTGAAACAAACAAATGAAACTTAAATATTTTCA
-GTTTAGTTCATTTCAATTTGAATTTTCAATAGTCATACGTGGCTAATTGATATTGTACTGGATAGTGCCGGTCTAGCTGT
-CAGTCTTTATATAGTAAATGTACATTCCTATTCCTCCACAATATCCACTATTTATTTTACAGATATTGAAGCTTCTTTTT
-GCCTACAATGGAGACGTGGGGCTGATTTCGATAAATGGGAACACACCACTTCATTATGCTGCCATGGGTGGTTTTGCAGA
-CTGCTGTAAATATATAGCTCAGCGAGGTAAAATTGTCTAGCAATTTTGTGCTTCAAGTACTTATGATTTACCCATGTCAT
-AGATAAGCAGAGAATTTGGGCCTATCACTTGTCAGTGGCTTATTTTTTTCTATAGCAAAACCTCACTCATATGTAGAAAG
-AAAATTGAAAATTATTTCTTATACTACCCTCTGTTAAATCATGAATCTGCGCTTAAAAGTGATGAAAACCCATTTGTCCA
-AAAATTTTAGGTTATTGTTAAAAACCTAAAGGGGATTGTTCCTGAGCCAACTAATTATTCAAATACTTATGGTTGAGGGC
-GGGGTGTGGTGGCTCATGCCTGTAATCCCAGCACTTTGGGAGGCTGAAGCAGGTGGATCACTTGAGGTCAGGAGGTCAAC
-ACCAGCCTGGCCAACAAGGCAAAACCGCGCCTCTACTAACAATGCAAAAAAAAATTAGCCAGGGGTGGTGACGGCGCCTG
-TAATCCCAGTTACTTGGGAGGCTAAGGCACAAGAATCACTTGAACCTGGGAGGCAAAGGTTGCAGTGATCCAAGATCTGT
-GTCTCAAAAAACAAACAAACAACAACAAAAAACTTACAGTTGATTAAGTTCCTTATTTTAAAAATGCCAACATCAATCTA
-AAAAAGGACACACACTGGAAACCATTTGCTTTCATTTGAATTTTTAGTTTATTTTAAAAAATGTTCCATTGTGTCAAATG
-CAAAGATAACTTTTCTGGATAATTTGCAGTTATGGGGAAAATAATTTGGGGGAAAACATGAAATGAAAATTTTCATGGAA
-AATTTGAAATGTAAGCAGAATTTTTAATTTTAGATTTTCCTGTAGCTTTTAAGTATTAATTTAGAAATATGAACTATATC
-ATATATAGCTTAATGAGTTTCTTAAAATGAAAATATTAATTATATTTAAGGATATGTATTTTTTGTTAATTACATGCTAA
-TTAAATGCACATTAAAAGCTTTTTAACTCTGTTAGAGATAGAACTGCATTTTGCAGAACTGTATATATTTTTTCTAGTTT
-ATGAGAAATAGGCAAAAACTTAAAGTTCACCAACTCTATAATAGAGCAAAGAAAGTGTTTTATTTTTCTGTCTTTCACAC
-AGACACAAAATTTTAGAAGTCACTAAAATTATAAATAAAACTAACATGCCCGCATAACTATAATAGCATAATAACATCCA
-TTTTTACTTGTATGAATGTATACTTTCCCTATGTCCCCAGTGTGATAAACCCTTTTAGCAAATGAGAAAAAAATATATCA
-AATGCAATTCTGGTTCTCTCAAACTGTCTTAATTGGTTTTGTTTTCAAATCTGTCTCTATTAGCAGTTTATTCTGACATT
-TCAGATTTAACATTATGTATTTCTAAAAACTAAAGATCCACTCAAGTTGAGACGAATTTCTTTAACTTTAATATGTTGAC
-TTATTTCTTATTGGGACAAATATCACACATACGCTATCATTTATGTATTCCTGGAATAAAGTCACAGAAAGCACATTGAG
-AAGCCAAGGACCAGAGCCTGGGTCATGCAAAAAGGCCTAACTCAGTGATGCAGAAAAGATCCATTTTCCTAGAAGAATCA
-ATCATGAGACTATTTTAAAGCAAATGTTTGAAAATGTTCTGAGTTCTGTGCATGTTCGGAAATATAAACACGTCACCAGA
-TCCTATGTGGGTGACCCAGTTTCACAGCAGAAGTGTTGTCAGTTACATTTCTACCTTTAGAATCTTACATCTAAGGCAAT
-CAGAGCAGGAAGAAACCCTTAGTGATCAAATGCTTGTTTCTGAATAAGCTCCCTGGGCTTAGTCTCTTCTGTACTTAATT
-GTAAAGCATTTGTGCTGGCTGGATTCATTTCTCACATTTCCTCATGATGGTCCTCTTTCGCCCCCTCGTCCCCCTGCTGG
-AGCAATTGGCAACTCCCTGTAAGCATGTGAGAGCCACATCCAAGGGCAGAGGAGAGGAGCTCGTGGAGTCCTCCTCCTCC
-TCTTCCTGGGCCCTCAACTCCCTGAGTTCTGCAGCACCAGCCAGCTGGAAGTTGAACAACTTTACCACAGAGGAGCATAA
-GTCTCACAAGGAATGAATAGATCTTTATTTACTAATCATAAAGGAGGAGACAGAAAGCTCCAAGTCAAAACGACAGGAAA
-ACTGCCTTTAGCTCTTTAAAGTGGGATGTTGGAGTCTTTTATACACATGGAAGTTTCTAACTAGGATTAAGCTGGAAGCT
-GCAGAGGGTAAGCTAAAACAGGATGAAAATCCTTTGGTCCTTAGTGCTGGGTGAACATAGAAGAAGAGGCTTGAGAGGTG
-GGATCAAAACCCCCCAGACACCCTGAGTAAGCAAAATAAATAGCTAAGTAAAAACAGCATATCAGAATTAGTATGGAATT
-GCACTATGGAATTACTACGCTATGGAATTACACTATAGAGTCACTGTTCTTAAAACTATCCAATATAGAAATTTTATAAC
-CTTTATTGTCCCCATAGTCTTTTTTAGTTTTTCTACTACTAGTAAAATTATCAGCCTTAGTATAAAAATGTGTGTGTGTG
-TGTGTGTGTTTGTGTAGTAAAATAGATTTATTTTTCTTTTTTTACTTTTTATTTTTTTGATAGTAAGTATATATATTTGT
-GGAGTATGTTAAATGTTTTGATATAGGAATACCATGCTTAATAATCACATCCTCTAGAATGGGGTATCCATCCCCTCAAG
-CATTTATTCTTTGTGTTACAAATAATCCAATTACGCTCTTTTAGCTATTTAAAAACATACAATTGTTATTGATTGTAGTC
-ACCCTGTTGTGCTATCAAATAGTAGGTGTTATTCATTCTTTCTATTTTTTTACCCATCGTATACAATTTTAATTTTTGGC
-AATACTAAGGAAAGTATTAATCTTGAAAAACATGGTCTGACTGCTTCTTCAAAGTCTTACTTATACATATACTTATTATA
-GACAACACAGCCTTTTTGGTAGCACTAAATGGATTCCCTAACATGTTCAAAAAAGTTTATTTCTTTGGTGAATATTTATA
-AATGATGTTGGAATCATCATTTTGTTAAATAAGGGACCAAAAAGGAAAATGAATTTTAATGTCTAACTTGCACATAAATA
-TAATGCTGAACTCCTCAGATTTAATTACAATTACTTTTTCCTCTGTGAAGGTTGTTCATATGGCCATACCACAAAACAGC
-AGATTAGTATAAATTACATTATTTAATGAAGAATACGGAAAAAATATACTTAAAATTATACACAGATTTACAGTTTAAAT
-CATTCAAAAGGAAGTGGGTATTCTGCATCTTTTCAGGTTCAGATCTGAGTTCATAAGGTCCTAGGTAAGCTGTTTGAATC
-CAGCTTCTTTCCAAATTTAAATGTATCCTTGCTCTTTTCCTGTTGGCCTGAAGTCCCCTGAGCAAGTGTACCAATATGGT
-GTGTGTTTCAAATATCTCTAGGGATAAATGTTCTAATCCTATTGTAAATTGTAAACGTATCTTCTTCAGAATTCACCAAA
-GTGATGCTCACAGAAAAAAAAAATCACAGCTCAATTTTGTAATTATAACAGCAAAATGTGCACATCTCTATATACATATA
-ATTTGGGGACACATTTTTTACTAATCACGAGAAATTAAGAAAACAGTTGGATGAGTGTCACTTATAGCCATGCAAATGCC
-TTGGCACCATTCATAATTAATGATGCTTTATGTTTTAGGATGTGACCTGAAATGGAAGAATTTAGATCATAAAACGCCCA
-GGGCTGTGGCTAAGGAAGGCGGCTTCAAAGCAGCAAGCAAAGAAATACGCCGAGCAGAGAGAATCGCTAATAAACTAGCC
-AGGCCAGGAGCCAAAAATCCAAATCCACTGTGGGCCCTTAGACTGCACGATTGGTCCGTAGAACGTGAGGCTTTCCTCCG
-GGAAGCCTTTGCGGTTTTAGACAGGGGTGATGGAAGCATCAGCAAGAACGACTTCGTGATGGTGTTGGAGGAAAGGCAGG
-ATTATGCAAGCTCAGAACAGCTGGCTGCCATCGCTCACCTTCATGAGAAAACCCGGGGAGGAGGGGTCAATATTAATGAA
-TTCTTTAAAGGAACCAGATATTTAAACAAGTCTTTTGTCTTAGGATCGTATGGACCTAAGAAAAAGGAAAAAGGGATGGG
-CAAAAAAGGAAAGAAAGGGAAATTTGTCTTACCCCTTCCAATCTGTGTCATTCCTGAGTACGCGTTTCCACGCCGGCAGG
-ATGGTGGGCCACCGTATTACATGATTGAGACCTACAAGAATGTCACTGATAGCAGCCGGTTTAATAGAGATCATCCCCCA
-GAACATCCCATTCAGGATGACTCTGTTTGGTACATTGATGATTCAGAGAAGGTATTTTCAAACATTAATATTATCACCAA
-AGCAGGGGATCTGGCTTCTCTGAAAAAGGCCTTTGAATCAGGAATACCTGTGGATATGAAGGATAATTATTACAAAACTC
-CGCTAATGACGGCGTGTGCAAGTGGAAACATAGATGTGGTCAAGTTTCTTCTTGAAAAAGGGTACGCGTCTCCGTCGGGT
-GTGGCCTAAATTTTCACGAGTCTTCACATTTCAAGGAAGTGAAAAGATGACCGAATTTTAGTAATATAGAAAAGTGCTAC
-TTTATTAAAGTCTATAATAAGGCTTTAATATATAAAAGCCTTTTATTAACAATTAACTTATAGGCTTCATTAAAGAATGT
-TATTAAAGAATGCTTTATTAAAAATGCTGATTTATTACAGGCTTTATTAAAGTCTAACAAATGCCCTATAAAAGTATGTG
-TTCATATTACTGATGGCTAGGGTTAGAAAAGGAGAATTTATGTTAGATTTATGTTATGTTAGATTCCTAGCCCCTTTATT
-AAAGCCTATAATAAATTAATTAAGCCTATAGATCTTATATGGGAAACCAGGATAATGGGAGCATAGGATTGTGTGTGCAC
-AAATATATTTTGCCAATAGCAATTATGCATGAAGTGAAGGCCAGTAAGTGTTTACTCAGGGTGAATAGAGTCTTCTGATT
-ATTACTGGCCTTCTATCAGTGGCAGCACGGCTCAGTCCTGTCTCAGAGCTTCACCTAGATGGTGTGGAGTCACTTTTTAA
-TCTGCCTCTATTTGAGGATCTCAACAACTTCAAACAAGTGGAATGGTGGCTATAATAACATGCTTTGGTCCCAAAACCTG
-CTGCCCTCCTCCAGTGTGGGGCATCCTTTTCCTTGGTCATGTAAATATTTTTAAAATATCAAATCATGAGAGTTTTATAA
-TACTTAACTTTTTAGACTACAACAATCACTCAGGTTTAATTCCTTCTTCTACCATAGTTGTATAACCTGGGTGAGTTTCT
-TAATATTTTTGTGCCTCAGTTCTGTCATGTATGTAATGAGACTGTAGTGGGACTCATGCCACAAGATTAGTTGAAGATTA
-GATGAGTTAAAATATGTAAAGCTCTTGTTAACACAGTAGTTACATACTTGAGAAATAAAGTACTAATCTTATTAGTACTT
-TAATGTTAAAGAAAGACTCAAATTTGTATATTATCAAGAGAGCAACTAATGAGAATATGAACTTCTGGACAGTGAATTTC
-TAAAAAGGACTAAAATGTTAAATAATACATGGTAATATTTATAATTTATTAATGAAGTTTCATTTAAAAATGTATTACAT
-GCAGAGAAAGTCACAAAATGAAATATGTCCTGTCAGCTTTTATCTTCATTGGATCTGATTTTATAATTTTCCTTGATTTT
-AACCTTTGCAAATCGTAATCCCTAGAATCTAAAGTGCCTTTTAATGTAGATATACACAAAGAAAGTTAAGACTGTCAAAT
-AATGCAGAACAAAGAGGTTTGAAGAAAAATTATGGCACAAAGTTTACAATTTAGCAACTTGATAGAACTCTATGAAATCT
-TACTTTGCATTTTTAGTGTCCAGTCATTGGAAAACCGTATTTTTAGTTTGTTCATCTATCTTATTTTACAGAGCTAACGT
-TAATGCAACAGATAACTTTCTGTGGACTCCACTTCATTTTGCATGCCATGCAGGCCAACAAGACATTGTTGAGCTTCTTG
-TTGAATCTGGAGCTTTAATAGATGCAGCTTCAATCAACAACTCAACTCCTTTAAATAGAGCCATTGAAAGCTGCAGACTG
-GATACAGTAAAATACCTACTTGATATTGGTGCTAAATTCCAGCTGGAAAATAGAAAAGGTATGCGTTCATATTATTGATG
-ATTAGGGTTAGAAAAGGAGAACTTATGTTAGATTCTAAGCCCCTTCTGATTCTATTCTCGTAGGCTTGCATTGTCCACTG
-GGTTCCTGGTACAAACACAAGCCTGAGTTAAATGTTATGGAAGTTTATCTTATACCAAGTGCTTCTCCACTCATTGGTGT
-TGGAGGGCCAATTCTTTATGTTTATAATCTTTCATGGACTGAAATACTTTTGTAAAATATAATAAAATTATTTATTAGAA
-AAATAAAATGAAAAAAATACAAGGCCAAAACTTTGTTTTTAATCTTTAAATTTTAATGACAGAAAATTATATTAAGTTGC
-TAAAAACATTTATAAATACTTAGTTTCTGTAGTTACTTCATTATGGATCAGTAACTATTAGTCTGTGGACTTGCACCAGT
-TTGCAGATGACACTGAGTTATTACACTGTTATGACTGTTAATTACTAATAATTGCATACCCTATAGACTTTGGGTTTCTC
-TTAAAGCTGGACAAAGCAATTCCTGAATTGAGGCTTCCCTGACTCTAGGAAGTAAACACACAACCTACCTTGTATCATAA
-ATACCATACAGGAAAAATTAAAAAATCATTTGAATATATTTGAGCTCCTTGTTTGGAAGTACCATTTTCCTACATTGGAA
-GCCATTGCTTCCTTTGACTGAGGAGCATCATACCTCTGGTTGGTTCAGGCTGCCTCTGAGTCACAGATACTACTGCACCT
-GTCCTGCCTGATGATATTATAGGTAACATATTGCCCAGCCATCTGCCTGGAGCACCTGTGGCCACTAGCTTCCCCAGACC
-TTTTGGAATTTACCTCCTTACATCAAGGAAAGGGGAAGATAATGTAAAATTATCTATCACATAGAAGGAAATTTGCACAA
-TGTGGGGAGAGAATAATCAATTTGATATTTAAGATGTAATATAATATTTCCTATCACTCTTTTAAGAAACATAGTAAAAA
-AAAAACTAAGGAAAAGTAATTTTCTGTATTTAGATGGCACTATAAATCATGGGATCTTAAAGCTGGGACCGCCATAGAGA
-AAATCTGATCTAGCTCTGTGAACTTCTGTATATATACCCCTTGCTTTAGGAATCACCCTTATTAGGGCAGGCTTAGAGCT
-GATGTGCTGAGATATTTTTCTACATGGTTTATCATTAATATGTTTATAGTCACTCTGAATTTATGTTTATGTTTCAACAG
-GGCATAGTGCCATGGACGTTGCAAAGGCATATGCTGATTATAGAATAATTGATCTGATTAAAGAAAAGCTAGATAACTTG
-CCGAAACCAGCAGAAAATCAAAAACTAAAAGGCAAGACACCTCCTATACTGAAGACTGAAGGCCCTGAAATTAAGAAAGA
-AGAGGTAAGAAAAATGGTTGACTACCCATTAGTAACTGGAACTCTTTAAAAATCTGTTTGGGGGAAGGCAGAAGCACTAT
-TTACATATTGTTATACAACATGGGTAAGATAATATGCAGTGCATACTTTCAATAGCATTATTATATAGTACTTTTAAAGA
-AATATCTAATAAAATTCTTATCACTGAAGAGCCTAAAAAGTACTCACTGCAAAGAGAATCCATACAAAAACCAAATGGGT
-TCAGCCAAATACAATTAGAATGTTGAAAAAGAAAACCAAAACTGGTGTTGGATTTGTATATATTTGGTCCTGAATTATAC
-AGATTTGATGAGATGGTCCAAATAGGGAAGGAGATTAACCCTTATGAGGAGTGAAGTAAAGCATGATTTTTCTTCATTTT
-GGTCTCATTACCACCATATCCCCTTTCATTGCCCACCACTTCCCCTTCCTCCCACCTGCCGCCTCCACCAAGGAATTTTA
-ATGAATACCACTGAATTCTGGGATACGGAGCCATTGTCTCTAGAATATCCTGCAAAATGGTTGTAGGTTTTCAACGTTTC
-TGGTAATCCGGAGTGATTTGGAACTTCTAAACTGCAGTGGAAGGTTGAAGTTGTTGCCCATGGGAGTTACTGAGACATCA
-AGACTTTATCATTAGCAGGAAACCCCTAAGTGTGTCTCTAGATTGGAAGCTTTTCTTAAGGGAGCAGAATATCTACTGGA
-GACTCTTGGCTGACACAGGACAAGAGATGAAAGTCAAGAAGGAAAAGTTTTAGTGTCATCAAATTGGAAAGCATTGGGGA
-AATGTAGGTGGTAGGGAGTAGATAGGATGAAGGGATTGTAGACAGACAGCAGACTTATAAACATGGAGGATGTTAGAATG
-GCAAAAGGTGAAGGAGGATCAGTCAACTAAAGTTCTTCCATTGTCATTTTAGTAGGCCACAGATCAAGGATGGGTATCTC
-AAAGACTTACGTGATCTTCTACCAATACTTCTAATTAAAGTTAAACAAGGCAAACTATCTCTCCCCATCCCCAAAGTTAT
-AATAATATACTATTTTATCTCAAATTATAACTTGTACAGTAGCATTTTTAGGTTTCTTTCTGGCTTCAGAGTAAGATGTG
-AAACAGCAAATAATATTAGAAAATCAGTATAGATTTTTACAATTTATAATTTTTTTGTTCTTGTTTCCAGGAACTGCTGT
-CATCAATTTATGGTGTACCAACCACATCAGAGGGAAAGAAAGTACAGAAGGGTAATGTGGTTCATCTGAATTCATTGATT
-ACCAGTGGTTATACTAAGAAAGTGGATATCACATTTATTCCACGGAGGGTAAGTGCTTCGAAAAGATCTTCATAGCATGG
-TAGAAGCTCATAATGTCATTTTTTCAAAAGCTTTTTATGTAGAATATCCAAACAAATCTGCACAGTTTGTCTTTCATAGT
-TACTACTTGTGAATGTTCTTTTGCCAGGTTCTGGTACTTTCAACTCAGTATGCCCAAGTGATAGCTCCCGGCATCTAGTT
-CTCTTTCTATTACTATTTCTGTATTGAGATTTACATTTTCCTAGAAAGGTTGAAGTCTTTCTGAATCAATGGCATGATCT
-GCAGCTGTTTAATCACTAACTCCTAAGGATACTTTTTTTTGGTACTTCTCAGACCCAACCCTTCTTTGTACTTAACTACT
-ACCAGCTCATGCAGGAGTTTCATATAAATCAAGACTGGATTTATTCAGTAGCTTCCGAAAACCTCCACAACTAAAGAGGT
-GGAGACATCTTTTGGAGAAAAGAGTTGTCTTTCCATTGGCCATCCAACCAGGCTGAACAAGCAGCTCCCCTCGCCTTCTA
-TTATAAAAATAATTTTGACTTCTACATAAGACATATAGGTAGTAAACCTAGATGATCTTCTAATTCCTTTGCTTCCCTGT
-TTTGGCATCCTAAAAAACGCACAGCAGCTGGTCTGAGCATAACTGGCCAGAGAAGTAACTGAATAATATTTCCGACATTA
-TTTGTCTAGACAGTCATCATCAAAAACAGTGATGCTCGTGCAACCACTAGTGTCATATGAGAGGGGGGGAAGAAGTTAAA
-ACACATCTAAAAGTAAATTTAATAGTTTTAAGTTAAAACTATAAACAAATTTTTAAGTTAAAACTGTGTATTGAAAATTG
-TCTGGATATTAGCATATTTACTGGCTGTCATACTCATACCTGCTGGGGTATGGCTATTTTTCTTTTTAAGATTTGGAGTC
-CTGAAGCCACAACAGCAGAGCTGATCAGGAAGAGGGAACTACGGCGAGAGAGGTTTACACATGAGGTGGACTTCGACGAT
-TTTATGATGCCTTTTCAGAAGAACATCACAGAGAAAGCTCGAGCACTGGAAGCTGCCTTGAAGACCTAAGTCATAGCAGT
-TATTTCTTGGGGTAAATGCTTTGAGGCCCAGGGACCAATCTTTGGAGAAAGTAGATATTTCCATCAAAGCCAAAGCAATC
-CATACACCAAGAACTTGTTACCAAGAATTTCTTTTTGCTTTAACAACTATAAATATTCTTAGCTGTCTAGAGAAAAGATG
-TATGTTATTTTGAAATGAATGGTATGTCATTCTGGATAAATCCCCAAGCCCCTTTATGAATGTAGTGAAATACATGGCAT
-GTGGGTTATAAACGTTGCTGTCAAAAGATTTACCAGGTCTACACCATTATGCTTATTATTTTTTTAATTATCCTTTTTAT
-TTATTAAATAGAGACAGAGTCTCACTATATTGCCCCAGCTGGTCTCGAACTCTTGAGCTCAGGCAGTCCTCCCAACTTGG
-CCGTCGAAAGTGCTGGGATTATAGGCATGAGCTACTGTGCCCAGCCTGCTTATTGAAGATACATTTCTAGTGGAAATTGA
-TGAAACAATTTAGGTTTTGGAAAAAGAAGTAATATTTAATCTTTTAAGGAAGGAGTTTATTTCTCACATGCCATTATAAA
-CTATGTGTATTAGATACCTTGGGTTGAATACACTTTTAACAGCCCTAGATCGATAGCCCTAGCCCTAGATAGATAGCCCT
-AGCCCTAGATAGATAGCTATTAGGTTGGTGCAAAAGTAATTGTGGTTTTTGCCATAACCTTTAATTGCAGCAAAAACCGC
-AATTACTTTTGCTCCAACCTGACAGCTAGGTATCTAGCTAGCTAGAAAGGCAGATAGACAGATATATAGATGATAGATAG
-ATAGATGATAGATAGATAGATAGATGATAGATAGATAGATAGATAGATAGATAGATAGATAGATAGAGATTTATTGCAAA
-TAATTGGTTTACATAATTTTGGGCCCCAGATGGTTAAGTGCTAAATTTGTAGGGTAGGCTATCAGGAAGTGCAGGCTGGA
-AACATGCAGGAGCTGTCCCTGAAGTCCACAAGTGGAATTTCTTCTTCATCATGGAAACCTCAGTTTTGTTCATACACCTA
-AATACTTCAGTATGTCTTTCCTAAAATAAAAGGCATCCATTTACCTAACCAGATTACGATTGTGAAAATTTCAACTGTTG
-TTAAAGCGACTGATGGGATCAGTTTCACCTAGATTATCTAAAGCAGTCTCCTTTACATAAAGTCAATGAATTGTAAATAT
-TGGTTGCATGTACACAATTCCTTCACCACAACACCTAAGATTAGTATTTGATTGAGTTACTGGGTGCTACAACCTAGCCA
-AGTTGAGTCATAAAACTGACCATCTCTGGAGGTGTACTCTGCAGTAAAAAGCTAGCTGAGGCATTATTCACACCAAGAAA
-TGCAGTGGGTACCGAACAGGAGCTCCAAAAATATCCAACGTCTCATTGACAGAAAGAAGCCACTTTAGAATCTGCCTTAC
-CAGAAGGCACCAATTGCAGATTACAGCTCTGTCAGTCACGTATGGATTAAACCCCTTTCCTCTAACCTCCTCCCTCTCTT
-TCCAACCTTGGAGGGACCTTCCACAGGAGCCAGTTAGGGAGGAGAAGGGAAGAGAGAGAATGAAGCAGGTAACCAGGCCC
-ACCCCTCTGGAGGAGACAGACCTGAACAGGGGTTGCTTACAAGCATTGCATTTGGATCCCAAGATTTGCTATTACAACTA
-AATTTTGTCTGTTTTGTAAGGTTTTGGTTGGTTTTTTTGTTCTCTCTTTTCTTTTTGTTTTGACATAATTTCATATTTAT
-GGAAAAGTTGCAATAATTTGACAAAGAATTCTTATATGCCCTTTACCCAGATTACCTAAATGTTAACCACTTACCACATT
-TGCTCTATCTCTTTCTCCCTCTACATATATGCATATGTATGTTTAATTTTTGTCCCCGAACTATCTGTGTGTCCGTTGAA
-GACATGATGAAGACATGATGTTCTTCACATGATGTTTTCATATTTGTGTGTCAGTTGAAGACATGATGTTTTAAATATTT
-CATTGTGTATTTCCTAAAATCACGATGTTCTTTTGCATAACAATATTACCATTGGCAAACTAAGGAAATTAACACTTAAG
-TGAACTATTTAATCTATAGACCTTATTCAGATTTTGCTATTTATCCCAATAATTTCCTTTGTACTCCCAGGTCATGAAAT
-ACATTCGCTTGCCCCATCTCTTTAGTCTCTTTTAGTTTAGAACAACCTGTATTTCTTGTTTGTTTGTTTGTTTGTTTGTT
-TATGACAGTATATAAGAAGAACACAAGCCACTTTTATCTTGTAAAATGTCTCTCAACTTTGGTTTGTCTTAAATGTCTTC
-AAGAATAGATTCAGGTGATGCTTTTGGGGCAGCAGTGCTACAGATGTCATTGCACCCTTCTCAGTACATCATATCAGGAG
-GCACATGATGTTGATACCTGATATAAACTTTAACTGCATTTGCAGTTGAGAGAAATGTAAATAAAAGTAAAGCTGCAGTA
-ATAAATCATAACTGCATAAAATTAACTGTAGTACATACTGTACAACTGTAATAATTTCATAGCCACCTCCTGTTGCTATT
-GTGTTGAGTTCAATTGTTGTCTTTTCTCAAGCTTACTTTATTGCACAAATACAGTATTTATAACATACAAAATACGTGTT
-AATTGATTATGCTATGGGTAAGGCTTTTGGTCAACAGTAAGTTATTAGTATCTAAGTTTTTTGGGAGGCAAAACTTATAC
-ATGGATTTTTTTATTGTAAGGAGAGTTGGTGCCGGTAACTCTCTAGTAGTTTTCCTTGTACTTAATGAATATCTGATAGA
-TAGATACTTTGAAACTATGGAAATTTCCTTCTACTTTCATACTTTCACCTACTAATTTTAGCATCCATGGATGATTCTCG
-CCTAAAATAATTATTACAGTGACAGTTGCCATAAAATAATTTCTACATTTTATCATTCTTTCCATTTCTTACTTGGCCTT
-CTGCTGTTGGGCAGAGCTTTCTTTTCTTCCTTATTAATTTATGTACTCAAATCAGTACAGACTCATGCATTCCCTTTTTA
-TTTAATGCGAATTATATATGTGTGGGGACCAACTCAGAACTCCAGAGTTGGTATAAAGATTATTTTAAGCCAAAGACATT
-TGAGATTTAACATACCATATGCAGGGGAAAAAAAAGTCTTCTCAGACCTTTGCTTATCTGACTACAAGCAGTAACTTCTA
-GGAAATAAGGCTGCCATAAATTCCTCTTCAGGTTTGATCTACTTCTAGAACACAAGTAATCCTACCCCAAATCCCTTCTC
-CAGAAGTGTTGTATGGCCCCGAAGGAAATTTAAGGACCATTTATACCTGTATAGATAAACATTATCACGTACTTTTTTAT
-CTCCTGTTTGTTCACCTGAAAACTCATGTATCTTTGTAAAAAGTCATTGTGTTTACATAAATGTCTTCTCCCCCTCCCCT
-TTGCTTATCAAGATGATTATAAGCCACCGATTTTAACTATCCCTTTCAGTTACTCATCACTGAGTTCTCCCAAGTGTATA
-TGCCTTGCATGCATAAACTTGTTTTCTCCTGTTAAAATGCCTTTTGTCAGTTTAATTCACAGGCTCCAGGCATTGAACCT
-AAGAGGGTAGAGGAAAAGTTAATCCTCCCCTATGTGATCCTTTACTCTCATTATTAATTTTGATGCTCAAATTGTCCCTG
-ATTTAACTAGGGGAAAACCCTTCAAGTTGGCTCCTGATAAAAAGACATTTTGTTTTCTAAAACAATCAGAGGACTCTTTA
-TTTCTTGAATGTGAGGGAAAATGCCTACCTTTGGCTTCGTTCAGGAACAAGGAAAATGAATCTGCAACAGCAGATTTTCA
-GAGGTGATCACTTTCTGTTTTCACTCTAGTGAGTACATTTTTTAAATGTCAGTTTGATAGATAGTGGTGTCCTGGGATCA
-CCTTCAGCCACTTGCAAATATAAACTGAGAGTAAGCATTAATGTTAGGTCCTATTAACTCTCTTTCCCCACATACGGAGT
-GTTTGTATTCATTTTAATGGCTCAACATGTTTAAAGGGGAATTGTGTGAGGGGAACAGTCACACAATTGACTGAGTTTAT
-TTGGAGTTTAATGCTAAACCCAAACATAGCATAGCCACAGTTCTAACAATGGCCCATAAGAACATCAGTGCTATTCAAAG
-AGTGATCCACAGGCCAGCAGCATCACAGGGAGCTTGCTCCCACTACCTGCCGCCCAAAATTATGGTACTGAAGTCTATAT
-GAGCGTAACGAAAATTTTGTAGAGGAAATCTTACTGGCATAAAAAGACTGTCAATGTTGCATGTAAAGTACCTACATTAT
-AAGTAGTATAATATCAGACTTGCAAATGCACAACATGTACATAAATAGTAATTTTTCTGGGTCTTTATGAGTTATCTGAC
-CTTTATTGTTTTATTTTGGCTTACCTGTATTTTCTGTTTTTCTTTTTCTTTTCTTTTTTTTACAATGTACACGTATTACT
-TTGGAATTAACAATTTTTTTTTAAAAAAGAAAAAACACAAGTTAACACCAAAGTCCATAATACCAAAGTGAGTTTATTAG
-TATTTGCCTCTTTTATGCCTTTTTGTGCATTGCATTAAGATTCTCTCAGAAGAACGGAGCCAAGAGTTCAGGAGCAAATG
-ATGTGTGAAGGAAGTGCTCCCAGGGGAGAGCAGTATGGGGTGAGGGGTATGAAACAGGACACGGAAATGAAAGGAGCCAA
-ACAAGGGTGCGCTTTCAGATGAAACCACAGCTTCTGAGTAGCCCGTGGGGAGCTGTAGCGCACAGGCAAGGAGCTGGGCT
-TCTGGGTTCCTGTATCAGTGAGCAGCTGCAGGATTGAGGGTGTACTGGCGAGGCTGTTCCAGTGCTCGAGGGCAAGTCTG
-CAAAGGTCATGGTGGGAACTATTGGCTAGAAAGCATGCAGAAGCTGTAACTGCGTGCATAGCACAGGAAAGGGAACACAT
-GCACTTATCTTTAAATTTACACTTCGGTGAACTGGGTAAGACTGTGGGTTTTATATTAGCAGACCTGGATTTGAATCTGC
-ATATTGTTAGTCATCTGCATTTACTGCCTGCTTGCCTATGGATCAAGTTATGAAGGGTCATGACTCCGAATTTCATCATT
-TATAAAGTAGGGATAATAATACGTCCCTCAATGAACTCTTATGAGACTCTAGTGGAATAATGTCTTTAAGGATGCTCAGT
-CTGTGCCCATGCCTGGTTGGTGGTCAACATATGGTTTGTTTTTAACCATCTTATAGTCTCTATCTGAAAAGTGAACCAAA
-AGAAGGCACAGGAAGGAATAAGGACCCAGACCTGAACAGTCAGAACAGAAAAGGCTTCCTGGAGCAGATTCACTTTCAGA
-CCATCGAAGTCATTTAAACATATGTGTGTGTGTGTGTGTGTGTGTGTGCATGTGTGTGTGCGTGTATATATATATATTTT
-TTTTTGAGACAGGGTCTCATGGAGCGCAGTAGCATGATCTCAGTTCATTGCAACCTCCACCTCCTGGGTTCAAGAGATTC
-TCCTGCCTCAGCCTACCGATTTTTTGTATTTTTAGTAGAGATGGGGTTTCACCATGTTGGCCAGGCTGGTCTCGAACTCC
-TGACCTCAAGTGATCCTCCTGTTTCTGCCTCCCAAAATACTGGGATTACAGGTGTGAGCCATCGCACCTGGCCCTAAACA
-TGTAGATATTTTATCTACATATTTATCTACTTTATCCAGTTTCTGATAATCAGAGAAAAATGAAAAATCCCTATTTGCCA
-TGAGATATACTTACTAATTTCAGTATAGTTCCTGTGGATAGTGGCCCAAAGGTTATCTAGGTAATTACTAGTTAGGTAGT
-TAAAATAATGTCTTAGATCAAGCTTCCTAGAAATAGAAGCTGAGATGGGGACTCTAGTGCAAGTGACTTATTAAGAAGGA
-ACATGTCAGGGAATGAGAGAAGCAGAATAAAGCAGGGAAAGATCTGAGGGAAGGTTGTGATCTCAGGAGGGCATTAGCAC
-CAGCCTAATTTCCTGGAGAGCTTTGGAGGATGAATGGAACCACAGAGGTTTGTCCTGCCCAGAGGGAAGAAGCCTGCCTG
-TTACATCCTGCATCAATCAGTCATTAACCAGCCCCTTGTCAGGAGAGAAACCTTTCAAGTGTCACCTGGCTGATTCGCAA
-GGTGGCTCTGATCAGCCAAAGGCAATCCCCAGAGAAGTGGGTAGCACTTAGCCTCCAACCACAGCAGCTGAGCACTGGGT
-GGGCCAGCTGGTTAAGGGGATCTGGGCAGCGTACCAACAGCATCTGCTACAAATGGCATGCTCTTGTGTGCAAAGTTCAG
-GTGCAAAATTTCAGATGGTGACTCCTTGAGATCACTTTGCATGACACACTTTGTTTTTAAAAAGAATATTAACTTCAACA
-AACTTCTGAACTTGCCTCATTGTTAAGAATAAAGATGAATGAGCAAGAACAGCATTGATAACTGATTTGGCAGCTAGTTG
-AAAGGGGAATCACAACTTGAGTGTTACCAACTTTAGTGTTATCAATGGTTAAAAATGATAAACATGAGAGACAGAAAGAT
-GTACTCAGCCTTATGCTCAGGATAAGGTAATGTCTAATTGGTACAAATCAATCATCCCCAGTGAAGTTAGTTTAGCAACT
-TTTATTAAAGTCACAATGTAGCCGTGAAAAGTGCCCAAAAGAACTACTGAGCCTGTACTTTTTTTCAAAACGGGTGGTGT
-AAAAAGAGAGAAATGGGAAAATTCAAATGCCTTCTCCACACTGGCATAAATTTGAAGTAAACAGTCATCTGAACTATGGT
-ATTATTAACTATTTACACAGTATGTATATTTCATTATATGGATTTGTATTTCTGTAACAATGCATCCTAGGGGAAGTTTA
-CAAATGAAGGTAGATGGGGTGTTTGTGTATATCAAATAACCATGTGCTAATATTCATAGATCCTTAGGTAATTATTACTA
-CATCATGAATTTTATCTGAGTAATAAGGAAGAACTGAATATTCTGTTGAGATTCTGGAACTTACTGGAGATTTCTTTTAT
-CCTAGATAAATAATTGAGTATTGTGTGATGTATGATGTGATACGTGTGTGTAGGTATGTGTTTATTCAGGATTAATGATG
-GTATTTTCCTTTTATCTTCAGTAAATAAGACTTTGAAGAGGAATTAATATGCAAAAAAAGATTTATTTTTCATAGGCTTA
-ATGACTTTTTGTAAGATGGTTTGAAATAGCCATATATTTTTCTAAATGTGGGAGATTGTTATGTTGTTCATTATTGAGAC
-TCGCAGGCTGCAGTTCGATGCTTTCCTCTGAAAAGCATTAGAAGTGAGAAAAATAAGTGAGAGAAATAAGTATTCCCTCA
-TAAAAATTAAATAATGAAATTAACACATAAAGAATTAAATGAGCAATGAGTATTATTGATGTCTGAATATATCTCACACT
-AAAGCAACACTTCCCAACACTTCCCAAAGCTAACAAGTCAGCCAGAAGGAGAATTGATCAGCAATAGAAAATCATGGAAT
-GAGAGTACCTAGGCAGACCTTGTGTGTTCAGACTCTGCAGACCTCTGGTCCATATAACACATGCGTCTCAGTTAGAGATT
-GAGACTTTTCATGATGTCCAAGGTTGCTACTGCCAGAATGCTGAATCTATCAGCAGCCCTTGTTCTACATACAATTTGGT
-TTTATTCATTCAGCATATATTTATTGAGCACCGATAATGAAAATCCTAGGTCTGTTCCTTGCTCTCTTCATGGTGCATGA
-CAGGAGAGCAATTCATCCAGTTTGCATGTCCCAGGTTTCTGCATTATTTGGCTTCCAGTAGGATCCAGACAACAGGAGAC
-AACAAAAGATGAGAGAGGGAGGAGAGGAAAAGCCAGGTAGTTCCCCCTTTCCATCTTTGCCTTTGTCGGCATCCCCGTCA
-ACAGCTGTGTCTGTCTCCCCCATGACTCCACTCCCCACTGTGTGGGGAGCTGTGTATCCTGCTGTGGTCCTAGCCTCCCT
-CATGTGACCCTGGCCCCTAGGCTCTGGTAGTACTACCCACTCCCTCTGTCCCTTAAGCCTCCAAGGGTGGTACCAGCTTC
-TTTTGTTGTTAGTCTCAGGGCTGCCTCACTGTGCTCTGGTTGTTTCCTCAGCCTCTTCTATTGCTTGTGCAACCAAATCC
-TCCCATTAACTTCCATTCTGTAGGAACTCAGAGTTGTTTCTGCTTTCCCATGTGGATCCTGATTAATCACGTATCAAGCA
-CAATGGCATGTCTGGATAAAATGGAATGCAAAACCAGGAATAGCCCCTGCCCTCATGGAGTTTATAGTTTCGTAGGAAAA
-GCATATTTTCATAGAATAATCCTAAAATACTTATGAGATGATTGCACAAGATTGAATAATTGAAGATTATCAAAAGACTC
-ACAAGATTTCACAGTGTGTATTTGAGTAAGGTTTTAATACAGGTGAAGGATACATTAGGACACAGAGCACAGATGATCAC
-AGAGGGGTCTAGGGCTTCCAGGCACAGCCCCCCAGGGTCCATTTTAATCACTCGGTACAGGACACATTTTATCTTCAGAT
-TATATACGATCACCGTAAGTGTGAGTCCAGGTATATAATTTATTGAGGGGTCTTTCATACCCACCAGCCATGTAGCTAAA
-CCCAGGCTGTATACCCTGTTAGACCAGGTACAAACTATCAGTCTATACAGTCCTAAACAATGTAGACAAGCTAATACAGG
-CTGCCTCCAGGGGAATTTCGAGCTTTAAATAGCACATTGCACATTATAAAGTCCTCAGTAGCACATTTCATTCTTACCTT
-GACCAGACTTCAAGCATCCCAGGAGACAAACAGAGGGCTACCCCAGGATAGCTGCAAGGTAACGCTACCTTATACAACAT
-ATGAACTTATAGTGGTGCTACAGAATAGGGGAAATTTTCACTAATGAAATGGTATTTTAGCTGAACTCTAAAGAATGAGT
-GAGGAATTAAGTTGACCCAGAGGGAAGAGAGGAATTGAGTAGAAGCAGCAGCATTTTGCAGTGCAGACCCATTCCAGCAA
-GTGAAATAAAAGCAATGTGACAAGAAATAAATAAAAAATGGTCAGGGAAAAGAGGCCAAAGCCACATCCTGGAGAGATTT
-GTAAGACAACCATATGGATTTGGAAAGTGATGGATTTCCATTTGATTCTGCTGATTCGTCCCTTGTCCTAGAAATTTTCT
-TGACTTTAGCAACACCACAGTTTCCTGGTGCTTCTCAATATCCTTTGTAGCCATGCTTTTTGCATCAGGACTCTCAACAC
-CAGCAGACAATAACAAGAGAATTATTAAGACTTAGAAAAAGAGAATTCTTAATACAGAATTTCAAGGGGTGGATTGAGCA
-AGACTGGAGGCAAAACATCTTCCCTGAAAACCATTTCTCTCTTCCTTGCTTGCTGACATTCTCACTGTCTGGCTCCCTTG
-CTCTCTCTACTTGGCTTTAGTCTGTGTGAGCTCCAACCTTAGCTAGAATGTAGCAAAGATGTCCACCAGAAGCTCCAGGG
-TTACATCCTAGAACTCCAAGTGAAATGAGGTACTCTTTCCCAGCTGGTCCTGTGAAAACCCTGATCGCACTCTCAATGGT
-CAGGCTTGAGTCAAGGGTCTTTCTCCACACCAGTCATTATACAACAGGACACAAGATTCTGATTGGCCAGATCATTTTGT
-CAGCCCATGACTCAGGGAATGAGTCACTCTACCCAAAACACCAGACTGCTACTTGTATAGGTGTGGGCTCCCAAGAAAAA
-GTAGGGATTATTCTTCCCCAAAAAAAGAGTTAGGGATGCTGGAAAGGCAGAAAGAAAAGGGAAGGGAAGAGGAAGGGGAA
-AAGGAAAGAAAAAAAAGAAAGAAAGAAAGAGAAAGAAAGAGAAAGAGAAAGAAAGAGGAAAGAGAGAAAGAGAAAGAGAA
-GGAAAGAGAAAGAAAGAGAAGGAAAGAGAGAAAGAGAAAGAGAAAGAGAGAGAAAGAAAGGAAGGAAGGAAGAAAAATGA
-AGGGAGGAAGGAAAAAGGAGACAGGAAGGAAGAAAGAAAAAGAAGAAAAAAGAGAGGGGAAGAAAAGAAAGGAATAAAGA
-AAGAAGAGAAAGATGGAGAAGAAAACAAACCAAAAAAGTGGCTACTACAACCTCCGCCTGACCATTAAATGTCGGAATTT
-CTCAAGACTCAGTTTCAAACCTTCATCTCACACTACGAGCTCTCCCTAGGCAAGCTCATTTGCACTCTCTCCTTGGAATG
-ACTCCCACATTTGTGTCTTAAGCGTAGTTATTTCATCTAAGCCTACAGAAACATATCTAATTATACTTGACATCAGTTCT
-TGAATTTACAAACGCTCCTGAAACTCAACAATTCCCAAATCAAACTTTAGACCTCTACTGCCCATCCTTAAGTCTAGTTT
-ACTTCGAGTGTTTTCTAGTTCAGTAATGGAACCACCAACATTCTGCTATGAAAGCCAAACTCCCAGATATCATCATGACT
-TGCTTCCCCAAGCACCCACCCACCCCAATTCAACTCCATTTAATCTCATAAATTCTTGTGACTCTTCCTCCTACTATCTC
-CACCCTTACCGCCGTAGTCTACCTTATCATCTTACCCAGAAAACTGTAAGAAATATTCTGATCTGTTCTTTTATCTCCTT
-CTGTCCTGCAGTCTATCTATACATTGATGCCAGACAAGTCTTTTCAAGGATGAAAAGTGATTACTTCAGTACTCTACCTA
-CCATCTAATTAAAATACTTTCAAAATTACTGATTTTCTTAATAATATAAGAAAATGTATGTGAACATGGCCTATGATCAC
-CTGAGCGGTCTGAGCATACTTACTCCTCCCCCAGATCAGGCCTTTAAACACTCTGCTGTAGACAGTCTGTTATTTTATTT
-TATGTACATGCTCCCACCTTCCATTAAGTTTTTGCATAAACTGTATCCTCCTTGTCCAGGAATTCATTCTCCCTCCTCTT
-CCCCAATACCTCATCTGCTTAATTTTCCATTCCTTTTTCATCTCAGAGAAATCATCTCTTTGTTAGGGCAGACTTCCTCA
-CCTTCCTCACGAAGTTAAATTCTCTTCCTATATACATTCATAGATCACAATGCACCTTCCTTCACGGCACTTACCGCAGT
-TGCAACTATATCTTCACCTGTGCAATTATTTGAATAATATTTAATTATTTGACACCATAACTGTCATGACTGAACATTCC
-AAAATATACCACATATTTTCTGGCCACATTGATGGGATTATAACATAATATAAACTTGAATTATTTTAAAATTTGTGCAC
-AACTGAAAATCACGTATGTACTTTCTCAGTGCCTCTTTATGTGGAGAGTTTATCTTATACTAATTCATCCCTGACTATTG
-TACTCCTGAGTTCCTGCCTCTGTTCTTTAGAATGGTTTCTATTTTTTTTCTGCTGGACTGTATTAGCCTTTCCTTTTGCC
-ACTGGGAACATAGCTGTTTGTAGCTATCCCAGGTGTATAAGTAACCTAAATGGCTGCTTATAATTTCTGCCCACTAGGAG
-AGGGACTCCTTTACTCCATTAGTCTCCTGTTTGAATCTTAACTCTGCCCCAGGCTTCAGGATACATAAACACTGCCAATC
-ATTCTTAAGAAGTGAAGGGATTGCAAATAAGCAAAGAAAAAGTAATTTTAAACATTCTTTCCAAATGACCTTGCAAGAGT
-TTTTTCCATTTTTAGAGGGAATAGTGGGAGTCAGAATTGGCAGAATAAAAGCAGCGTATTCCTAGACCATATATCAGCAG
-ATAAATGTGTTCTGCAGCATTAAAATTACCCTTGTGGTGCTCATTCCTGGATGTACCATGTGTTCTGTGATGTAAATCAG
-TACATAGCCTTATATTTTCCTCTGTGTCATGGACCCACAGAATTGCAGTAGCATGAACTGGTTGGCAACAAAATTCTTTC
-CAGTGCTTCATAAAGCCTTTGGCTTTTCTTCATTTGATATGTGTGAGTAGGAATGCACAAAAAACAAGAACAGATGATAT
-TATTTAAACCGTTTGGTAAGAAATGTCTGACAGGAAAAAAGAAAACATATGTATCGATTCAAGTGCAGTAATTCGCTTGG
-CGGTTTTCTATATTATCCTTTCTACTTGTAAAAATCATCTCCAATGCAGCAAAATGTTCTTAAATCCTTTATACTTCATT
-CTAAAAATCAATAGTCCAAAGATGTTAACTCTTTTTGGGCTTTTGGAAAACAAAACAAAAACCAGAAAAGAGAGGATAAA
-TGTTTTCATTTTTATCTAAATTTTTCTGGTTGTTTCTGGTTTTTCCGTCTCCACTTCATTATTACTAACATGGAATTATT
-GATAAAGCTTAAAAGAAGAGAAACACAAATTCAGACTTTAGGAACTCACTTGAAATCCTTACTTAAAGACTAAAAGTCAT
-TCATTTATTCATTTCATTCAATAAATACTAAGGATCTACTATTTTCCAGTTGGCCTCTTTGGCACTGGTGTATAATGCTA
-CACGCAGCACTCACTGCTCCCTTGGTTCCTGCCACCATAATAGGGAGATAGCAATTAAATAAACACAGCTATATTATTAT
-AAATTGGGATGCATGTTACCATGGAAAAGTACTGGGTGGAGTTTTAGTTTGAGAGTCAGGGAGTGCCTCTCTGAAGAAAT
-GTCTACTATGAGACCTAAAAAATGAGTAGAAGTTGTCAGATTAAGGGGAGGAAAGGTGTTTTAGCCTGTTTTCTGCTACT
-ATAACAGAATACCACAAACTGTGTAATTTATAAACAATAGACATTTATTTGGTTCATAGTTCTGGAGACTGGGAAGTCCA
-AGGTCAAGGGGCTGCATCTGGTGAGAGCCTTCTTGTTGCACCATAACATGGTGGAAGGGCAAACAAGCAAGTGAGACAGA
-GAGAAAAAGTAGGCCAAACTCCCAAGATAACTAGCCTACTGCCAAGATAACAGCATTAACCCATTCATAAGGACAGAGCC
-CTCATGACTAACCTCTTAAAAGCCCCACTGCCTGATAGAACTATATTGACAGTTAAATTTCAATATGAACTATGGAGAAC
-AGTTTGGAGGTTCCTCAAGAAACTAAAAAAATAGCTACCATATGATCTAGCAAGCCCACTGCTGGGTATATACCCAAAGT
-AAAGGAAATCAATATATTGAAGGGATATCTGCACTTCCATGTTTGTTGCAGCTCTGTTCACAATAGCCAAGATTCAGAAG
-CAACCTAAGTGTCCATCAAGAGATGAATGGATAAAGAAAATGTGGTACTTATACACAATGGAGTACTATTCAGCCATAAA
-AAAGAATGAGACCCTGTCATTTGCAGCAACATGGGTGGAACTGGAGGTCATTATATTAAGAGAAATAAGCCAGGCAAGAA
-AAGACAAACATTGCATGTTGTCACCTATTTGTACGATCTAAAAATCAAAACAATGGAACCCAAGGAGATAGAGAGTAGAA
-GGATGGTTACCAGAGGCTGGGAAGGGTAGTGGGGAAATGGGAGACAGGGTAGAAAAGGTTAATGAGTACGAACAATAATT
-AGAATGAATGAATAAGGCCTGGTATTTGATAGCACAATAGGGTGACTGTAGTCAATAGTAATTTAATTGTAAATTTAAAA
-ATAACTGTAATTGGATTGTTTATACCAGAAAAGACAGACGCTTGGGGTGATGGATAGCCCATTTTCCATGATGTGATTAC
-ACATTGCATACCTGTATCTAAACATCTCATGTACCCCATGATGCAACTACCATATATCCACAAAAATTAAATATAAAACA
-TTATATAAAAATTTCCACATAATTTTCAAAAGGGATACTCTATAGTGGCGTGGGGAGGCAATCTACACATGAGGGGGAAA
-TACCTGCCACAACTCTGAGGCCAGAAAGAGCCTGGCTTGGTGAAGAGCAGGAAGAAAACCAGAAAAGCTTGCACAAAGAT
-GGTGGTAGCAAGGGGAAGCCAGCTTAGGACAAGGTTGACGAAGAGGACGGGGCCAGATATCGAGGAACTCGCAGGGAAGA
-GTAAGGAGTGTGGATTTCTTTCCAAGTTCAATTGGTTTTCACATTGCTGATAGCATCTCCCAAGTGATTACAAGTCACAT
-TGCTCTGTATCATCCATAAATTATCCTCAAGAACTCCTAGGGCCATAACAATTTTATGAAGGACTCAGCTCTGATAATAG
-AAAGTCAATATTTTTAGTCTCTAGCTTTTCAAGTAGGCAGCTGGAAGTATAGCCAAAGGATTTCAGATTTCACAAATGTG
-AGATCAAGAGACATCTGCTAGTCTCTGTTCAATCTCTAATTTTCCTGTGTCTTTCTAAGTGACACAGAATTAGTAGGCTT
-AGAATTTGCTGTAAAAACTTGTTAAATCCATGCTTTGTTCTTTAACAGCATCTTAGCTCTTCTGCTTACTAGCTTTGTGA
-CTTGGCAAGTTGTTTGACCTCTCAGATTCTGTTTTCTCATGTATAAAATAGGGACACACTACAGTAGTGATTAGCACTAT
-TCACCAAATATTTCCTGCTCTCTCCACTTTGGACACACGGTAGGATTATACTCTCTGCCCCATTCCCTTGTAGTTAGGTG
-GTGTCAGGTGACTAGTTCTGACGAATGAGCTATGCATGGAAGTGAGGTTTGCCATTTCCAGGCTGGAGCTTTTGATTGCA
-AGTGTGAGGCTCTCTGAGCAATCCTCCCCTCTGCTGCCGGCCGCTCTGTCAGCCTAGGAAATATGGAGTAGGATGCAGAG
-TTGCCCATCAATGGACATGGTGGGTTATAAGCAACTGGGACTTTAGGTTATTGACCAGCCTCACTAACAGACTTACTTCA
-TAGGTTTGTGATTAGAACTTGTATTCATCCATTCTTACACTGCTATTAAAAATACCTGAGACTGGGTAATTTATAAACAA
-AAGAGGTTTAATTGGCTCACAGTTCTGCAGGCTATACAGGAAGCATAGCAACTTCTGGCTCAGGGGAGACTTCAGAAAGC
-TTCCAATTATGGCAGAAGGCAAAGGGGCAGCGAGGCACTTCACGGCCAGAGTAGGAAGAAGAGAGAGGGTGGGGAGGTGC
-CACACACTTTTAAACAACCAGCTCTCATGAGAATTCACTCACTATACAGTATCAAGCAGCGGACGATGCTAAACCATTCA
-CGATAACTTTGTCCCCATGATCCACTCACCTCCCACCAGGCCCCTTCTCCAACACTGGGGACATGGTGATTTGGGTGGGG
-ACATGCATGATTTGACATGAGATTTGGGTGGGGACACAGATCCATACCATATCAGAACTTAATGGGATAATAGACACTAG
-GCAATTGTTATACTATCTGGCACACTATGAAGTACTAAATATAGGTTTCTATATTTCAAGTAAGCATTACCGGATTTCTC
-TGCCCAAGCATTTGCGTAGCTTTCAGGATTTAATTTTCAAGCCCAGAATTGAATGATTCAAGTTACCGTTAGAAATATTT
-ACCCTGACATTTAATTATACATGCAAATTATTGGCCATCGTTTGTAAATCATATTTTTGGTTTATGATAATAGGTGATCT
-GCAAGAACCTCCAAGAACTGAACATTACTGTGCTCACAAAAGTAAACTCATAATGGCTGAAAACATATCTAATCTCCTTT
-TCAATAAATAATGATATGCAACTGATAGCTCTTGCCAAATGTAATTGAGATAAATCTTAACTGTTTGAAAATATTAAAGA
-AGTATTTACTTTTAATTCATTACAGATGCAAAATGTTTGGGTTTAAAGGAGAAAAATCAAAAGAAAACATTCTAAAATAA
-TATCAATTTCTTTCTCTCCTTGCCATTTTTACAAACATACTCTACCTATAAACATGCACCTGTATAAATTATGACTAAAT
-CTATTTTTACTGCTTCACAGTAAATCTTCTGCTGAATATATGGGGCCTTAATCTCCGGTGTATTATGTACTAAAGGCTAA
-TAGATTTGGCAGCAAAAATAGACAGTTATATTCCATTAAAAACCAACTCCATAATTCATGACTGGACTCGGGGTCTGCTT
-CCAGCCCAATGGCACACCTGGCTCCCAAAGCTCTAAAACAAAATTTCCAGTTTTATAATTGCCAGAGTCATAGTTTTCTC
-CATTTAAAAAAACACATCAATATTTATGTTGTTTTCCATGTGCTCTCAAAATGACAGCTTAAATGATTTGACAATAAGTA
-AGGTTTGATTAAATTCAGTAGTCCCTTGACAGGGGTGGTTTATTTGATTATTCAAATTATTAATCATCATGCCATCTATT
-TAATTTTTTAATACTTAAATGAATTTTTTCTTGTAAAAGAAAATCTTGTAAACAAAATCATATCAGAGAAAGCCCTGCAA
-ATTACAAGGAAGAAATAATCACTCATAATTCCAACCCTAGAAAAATATCACTGTTGACCACTTGAGGACTTTACCCTAGT
-CCTTTTATTCTGCAAACATTTGCCATAGAGGTGCAATAGAACACAAAATAATATATGCTGCTTTTAAATATTTGTGTATA
-ATTATAAATGCAATCTATATAGTTCCTTATAAGGAAATATGAAAATTATTAAGTCAAAAACATAACCCAGGGAAAAAACC
-ATCAGAGATAGTCATTATTCATATTTTAGTGCTTCCCCTAAAAGCAGCCATTACTTAGCTACTTTAGCATTCACTCAAAA
-GGTGTATTCTGCAGAATGGTCCTTAGCAGTGCAATTGTATTTTCCAGAGTGCCAAACATTTATTCACTTTTGAGTTCGAG
-CACCCACACACGTCATGCATTTGCAATATGAAGCAACAACAACGTGTTACACCCTGGTATTATCAATGAAATTAAACCTA
-GCCTGTCCTCTCCAAGAGCTCCAGGTCTGAGGAGGATGTAGACTAGGAAACAATTATAATACAGAGTGATTAATGCTAGG
-ATTTGAGATATGCTCAGGATGCCATGGCACTGCGATGGAACACAAACCTCGTCTGATGGAGGAGAAGGTTTCAGGAAAAC
-CAAAAGCTTCCTGGGGGCTTTGCAGTAAGGCTAGTTCTCAATGGATGCAGCCAAAGACAGAGGAATAGAGTCACAAGTGA
-GCATATGCAATCTAGGATCAAAGGCAATTCCATATGGTTGGAGGATAGAAAGATAGTGACAGGAGATGAGGTGGGAGAAG
-TTGGCCTGCAGGATTTGTATTCCATAATAAGAAGCCTGAATTTTATGCAAAATACAACAAAGCAGTTAAGCAGCAGAGTG
-ACATATTCAGGTATGCATTTAAGAAAGAGCACTCTGGCTGCAGGAGGGGACAGATAAGACATGTGGCAAGGCTGAAGCTA
-AAGAGAACAGTAAACAATGGTCATCATCCAGATTAGAAATGGAGAGAGCCTAAATGAAGGCAGCAGTAATATAATGAATA
-TTAAGAAAGTCAAGGAGGCTTAGACTATTCCTATCTACATGCAGCTTGGGGATTAACCTCAGATGTTGATCATGCTTGCC
-AAATTATTAATAAGACAATATCTCAAGACCTGCCTTGATAATCTCCTTTCAGTCTTATGATATGAGGTTAAAAACAAGGC
-AAATAATATATCTTGGATTCTATCCTAAAGGGATCAATGTAAGAAACCTGGCTAAAATTCTGACACCATAATTGAAATCC
-AGGAACAGAGGCCTATGCTACATCACATACGGAGAGCAGATGGCTCAGAGTGATCATCTCAAGAACTTCTCGTTGGGCAA
-CGTGACTTTTGCAAAAGAACTAGGAAAGTGTTCCTTTGGGCCATGATGATTTATCAAGGCTAGAAGTTGAAATAATAAAT
-CTATTCTGAACAATATACTTACTAAATCGTAGTCATTTATAGCCCTCTAATGAGACAGGTACTCAAATGGGTACACATTT
-GCTAGGTAAACAAATGTATTGCATGGGGAATTAGGGATTTACAGCTAGCAGGGGACATTGAGGCTCAATATTGATGGTTT
-GCTTTTTCCATTTCGGTTGCTAATGTGATTTATTTGCAGTTTTCTTAATCAAGGTGACTGACACAGAAACTATCTAAATT
-TTTTAGCACAGCAGTTAAAACAGTCCACAATACATAATTTGGCTCCTAAATAATTTCTCCCCCAACAATTAGAACTTTCC
-GAAACTGCTTTAAATCGCCTTATGAGGGTATCATGAGTTTGTGGTCATTGGAAGTATTAAAAGAAAAAAGCCTGGAATAT
-CAGTAATGAAATGCATCAAGCAGGAATCATACATACATTAAAATACTGGTTTATAGTTTTGAGGGCGTTTTCTTTTTTTT
-CTGTTGCAGCTATGCGAAGATATGCTTATGTATTAATTGTTTTTCTTGCTAACACTGTATAAGCAAATTCAACTAAATTG
-ATATAAGATTTTGCATACAAGATTAGAAAACCTGATACCTAGAATTATTTTAACACACATTTTTCAAGTTTGCTTATGAC
-TTCACTAGGTTAGAACTTCTTAAAAAGCAATGCTTTAAACATTTTATTCATTCAACCTTTATTGAAAGCCAACATTGTGT
-TGCTGGATATGCAAAAATAAATCATGTATAGTGAGCTATTAAAAATTTTTATCAACTTACAAACTGAGTACAGGTACCTA
-CTCTCACTGTAAAGCCTTAGCAAAAAAAACTGATTAAAATAATGCATAATAGTACATAAAAAATTAAAATCTTCCATTAG
-AGGAACAAAAATTATGAAGAATTTCTAGGAGATAGAAAATAATTATGTACAGAGAAGATAATTCAAAATACATGTTGGAG
-AAAATTACTCTTTCAAAAGTCAGACATGTCCAGAGAAACTGGAAGGGAGGAAGATAGAACTGATGGGAAACATGGCAGAG
-GGGGACACCCCCATCATGTGATGGCAAGAAATGCTGTTTCCACCTGAATGAATTCCCAAAATCTAAAAAACAGGAAAGTG
-AGATCTGAGCTGTATTCATAATTCTTTAACGTTTTCAGTATTCTCTCCAGCACTGCTTACTGAACTTGTTCAGGAGTGAA
-GCCACGTGTCCCCTGGGAGTGTGCTGCACTGGCAAGAAGAAATGGATGACTCACAATTTTGACAGTGACTCTATAGAAAG
-AAAAAAAATCTGTGACTCAGGGCCTTGGGGAGAAGTCATCTCTTCAAAAACTCATCTGATTTTTTTTCATGCCATGTAAT
-TACTCAGAGAACATTAAGAGTCTAAAAAATTTCAACACTGGTGTCTAAGAGATATGGAATTACCTTTTGCCTGAGATGCT
-GGAAGCAGTGGGGGCAAGTTTGTAACTAGAAAGATTTGAGCAAGTCCAGGCTCAGGTATCCAAATTGCCCTCTTTGCTGT
-TGGCATAGGGGATTGAGATTTTCTGGGTCTTAAATAAGGTTTTATTTTTATCTAAGGAACTATAGTTTCTATGCAAATCC
-GAGGGGGCTTAGAGAAACCTAGCGTGGAAAAAAGAAACTGTCAAAGCAGTGTTTGGGGAAATGAGATGGGGAAATTTCAC
-GAATAGTGGGCATAGAGAAACTGACTAGACAAGAGAACGTGAACATTATAATGATATCAAATGGAAAATTTGAAAGTTTA
-TTTTGAAGGAGATGGCTAAAAACAATTTTATTCTGAATGAGAATGTGATTGCCAAGAATCAGTCTTCAAGCAATCCAGGA
-TTTAAATTTCCTTGTTCTAGGCTCAGAATTTAAATAGGCAAAATGCAGGAGTTCGAGGCTGTATGAGCTATGATCATGCC
-TCTGCACTCCAGCATGGGTACAACAGCGAGACTGTATCTAAAAGAATAAAAATAAATAAAATAAAAAATAAATGGGCAAC
-AGGAAAGACTTTAAGACCACTCTCCCCTCGCTGTTCACATGGCTGGGTTCTTCCCATTATCCAGGTTTCAATTTTAAGAT
-CACATCCTTACGTATAGTTTTCACTGAATACTTAGCAATTTGATCAGCAATTTGATCTTATATAACACATTGAAATGCAA
-CACGTGTGTTTCAAAGTCAAGTGATTAGAAGACTGTGGGCCCTAACTGCTGTTTATGGAAGTATGCATCCAAAGCAGATG
-CTGTCAGAGGTCCCATGTACACCCAATTCCATTAACAGTCTCTTCTGATTCTTTTTCTCACTGACAGCCTCTCAGCAAGT
-ACTGGTGCTCTCCCTGAGGATTTTCTCTGGCTGCAGGAGCGTGTTTCAGCGTGCAGGGCAGACTGGAAGAATCTGTGAGT
-TGATGCCTCAGGAAGCAGCCCTCAACAGACATCAGACAGGAAATGCTGGATAAATATCCCAACTTCTCACCTCTTGGGTA
-GGACAACATTGAGGAATGTCCTGCAAAGTCTCCCTAGAGTCCCAAAGGGCCTGAGCCCCAGTTACCCACAGCAGCAATTC
-TGCACATTAGCACACTCCTTTAGTAATTTTCCTCCTTTCCTGTCTTATTTCCTCACTCCTGTCCATTGTTTCCTGGGATC
-ACTCCCGAAGCAAATCACTTGCACTCACATCCACATCTCTACTTCTGGGGAGTCCCAAACTCACAAGACATTTTTCTACA
-AAGGAAAATCAAATATAAAAGAAAGTAGAGTAAGAAGAGTTGGGACCAACAATGACTGATGATTAAGCAGCAAGAATAGC
-GGCAATTAAAAACTGTAGATAACACTATGGATGCACTGATGACACAGTGTCTTGGCCAAGCCCTGTGGGAATTCATACTG
-TTTGCCTGTGTGCAGCAGCGGTGCAAGTTTTGCAGTGTTGTGAAATATTTAGTGGACGCTGACTTTCACAGAATCCTGAA
-TTACTGTTCTCAATAAGCTCCAGTATTGTGCTATTTCAAATGTAGAAATACCAAAGTTTACTAATTGTGAGCTCTTAATA
-TAGTAACTTACTAGCAGGTTATATAATGAAATGATATCATATGGCATATCATTTCCCATAATAAAGAAAAAGCTCTCAGT
-GTTCTACCAGTTTGGGCCCTTAAGACTCCTGATAGGCAGGTAGATGCTGGACCACACTCTCTTCCTGCACTAAATAGAGG
-TTGCAGACACTGGGTAAAACCCCAAGAACCACAAGCAGATGCCCACTGCTTTCCTGGCAGCCTGACCCTTGCACCAAAAA
-TACTTTAAACAATAAGTTCCCAGTTCTTAAAAGAGCAAACATACCTTTAAAGGAAAAAGAAAAAATACACAAAAGTCTTA
-CCGACCTTGGGTTTAATATTTACTCTTCTCTTTCTTAGGTCAAAGCTACGGAGTATAAACTGGGCTCCTGCCAGGTTCTT
-ACCATATTCCTTCAATAGTTGTTTTTCAGGAAGCTCTGTTTTCTGGAAGAGATAAGAAAATAGTACCTGGGAGGAAATGA
-GCCATGCTTGTGTTGCTGAGTGATTCTAACATGTTTGGTGGGGGAGAGGCACATAGATGTTAAATCATTCACCCTTTGCA
-GAGAACATCCTTTGGGTAGAGTGTTTCTTATCCTCCTCCACCCAGAAGCCTTGTTTCTAGTTTCCTGTGCTTGCAAGCTT
-GTCTCTCCCAACTAGGCTGTAAATGAATTGAGGGTAAGGATCTTGTCTAATTTACCTCTACATCCCCAGGACAATAAGCA
-AGGGTGTAAATGCCTAGTTCCCTTGCCCAGGTAAAGAGAAAAGCGCACCTGAGGCAAGATTCCACTGCAGCGCCCCCTGC
-AGGCTCCACAGACGTGGTCTGAATTCACCGCCAGCTTCACTTCCTTCCATTCCCTGTCCTACTTCCCCCATTCCTTTACT
-GTCTCTGTGGAGCCTTCCTTAGTAAACCACTTGCACACAATTCTCAAGGTTTGCTTATGAAGATCAACAGCTATGACATC
-AACCCATAGGACAAAAAAACAGAGCAATAGAAAAATTAGTAGGCAATAGAAAAATTAATGACTGCCATGTCATCTTAGAG
-AAGGATCCTCGATTTCCACTCAAATTAGCTTGAGTGGAAAGTTTACAGAGGACTCTACATTGCTAGAAGTACTGGACGGG
-CTTGGGGGGATTCGCAAGTCACCTTTACTTGCTAGGGCCACATGGTGTCTCTCCTCTGTTTCTCTTAGCACTTGTACTCG
-TCTTTTTTTGCTGTAGTCCCATATTGCCTATGATGTTTTACTCTAATGTAATGTGTTTGCACATGACTGTGGCTTCCTAA
-GGCAAAGAAGCTCTTGCCCTGGCTCTATAGAGAACCAGCTTATCCAGTCCCTTAATTCTGTAGGTCCAAATGCCAGACAA
-AAACAAAATAAAATAAAAAAACAGACTCTGATGAGCCCATCCAAGGTCAAGTCCCTGCCCCATCCAAATCAGATTCAACA
-GTGGAAACAGAGTCATCTGCCATGACACAACCACTTCTTTGACGGTACTGTGGGCATGAGTGGACTTTTTCAGGAGGAAT
-TATGCACTCAGGGTAATGACTGACATCTGTAGGGCAATAACAAGCCAACACTGCTTGTTAGATTCCCAGTCCTCTTGAAC
-ATGTTCCATCAACTCCATTCTCATGGGCTTGCTCACTGTCTACCAACATACTGGGCTAAATTTGCCTCCAGGCTTCCTCT
-CATTGTCCCTCAAATTATATAGGCGTTGGCTCTTTTCTGAAAACAATATCCTTCATTTCCTACTTTCCCCATGAAGCCTT
-TCCCAGAATTCCAATTGTCCCCTAATGCCTAAATCAACATTTTATTTTGTCCATTTACCCACTGGTGCATGGTAGCACCA
-GGGTTGTCTTCCTTACTTAGAGAATAAGTTCCTCCAAATCAGGGAGGGACCATGCCTCCTATTTCTTCTGTTTCACTTAT
-ATCATTTGGCACGATTCTGAGCACGTAGCCAGCAAAACATAGCTGCTTCTCCCTAATGTACTGAATGAAGTAGATAAAGC
-TTTTCTACAGCACCTATTTCAGTGCCTTAATCATAGGCTGGATAAGAAACTTTTTGTACTACTGCCCCTTGGGCCTCACC
-ACTACAGCATGAGCTTATTCCACTTCCAACTGCCAGGATCTGTATCTCTTTGCCAGAGGGCTTTTTCCCAAGCAGCAGGA
-AGCCTTTCTGGCCTTGGGCATAGTAGACTGGATAGTCTGGAATATTAATTGCTGGCAGCACTCAATTCAGGAGCTGGTGG
-AAGTAACCCAGCTCCCTCACCCCTCCATGGGTGTCAAGACTTGGTTCCTTCCAGTGGGTTCATGGTCTCGCTGACTTCAA
-GAATGGAGCTGCGGACCTTCGCAGTGAGTGTTACAGCTCTTAAAGATGACACGGACCCAAAGAGTGAGCAGTAGCAAGGT
-TTATTGTGAAGAGCGAAAGGACAAAGCTTCCACACAGCGTGGAAGGGGACCCAAGCAGGTTGCCACTGCTGGGTGGGGTG
-GCCAGCTTTTATTCCCTTATTTGCCCCTCCTGTGTTCCATTTCTGTCCTATCAGAGTGCCCTTTCTTCAATCCTCCCCAT
-GATTGGCTACTTTTAGAATCCTGCTGATTGGTGCATTTTTACAGAGTGCAGATTGGTGCATTTTATAATCCCTTTGCTAG
-CTACAGAGCACTGACTGGTGCATTTTACAATCCTAGCTACAGAGTGCTGATTGGTGCATTTTACAATCCTCTTGTAAGAC
-AGAAAAGTTCTCCAAGTTCCCACTTGACCCGGGAAGTCCAGCTGGCTTCACTTCTCAGTAGGTTAACTCTGAGTGTTCTA
-CACTGTTTCCCAGAGTTCCCCAGTGGGCTTGAGCCCCAGCTGCCCACAGTGGTGACTTACTTGATAATGGCCTCCTGTGT
-CTGCCTTTCCTTCCTGTCTCACTTCTACACTTCCCTGTTAGTGTTTCCTGGGATCACCTCCCAAGTAAACCACTTACACT
-TGAATTCTTGTCTCCGAGTCTGCTTTTAAGGAAACCTAAACTAAGACAATGTTCAATAAATGCCAATGGAAAGGTTGAAA
-AGGTAATTTTCACCTTCCCCCTCACAGGTAGAGAAGCTAGGCCATTGACAGGGTTGGATTTCTCAAGACTGGCAGGATAG
-AGGACTCCACTCCTATGGAAGCACCTTTCAAGAAGAGACGGTATGGGAATCAGTTTAAAACACAAAGCACTGCATCCTTG
-GGGGCATCTGTTAAGTTCATTGCACCCAACCAGACCTCCTAGAGAGGGCAGGTGCTGACAACATAACTGCCAACAATTTA
-CTGGTCCAATTTGTGATAGGCAATATATAACTCGGCAGCCCAGAAGCCACATCCCCATTTGTCTTGGTTTTCATTAATTC
-AAAAAAGAGGAAGAAACCAATAATGATAATAATAATAACAATAACAACAACTATTAGACTTTCTGCTAACCTGGGTGAGC
-AGCATTTGACTTGAGCTATGAAATCAGAAAAATGTCCCTTTCTTGCATCTTAATTTTGCAACAAATTCAACCTGTTAATA
-TAGTCCTTCAGGAATTAAACAGACAAAACCATACAAATGCTTGGAGGATGATGGGAAAAACCAGTTACTTCTGACTAACT
-GGAAGGGCAGCTTGATCATTTCTGATGGTTGATTGCATAATTTCAGTCCTTGAACATTTAGTGTGCCATCCCCTTGGTTG
-CTGGAGGAATGCAATTGCTCTATGAAATGTGAAGAGACTTGACAAGAACTATTTTCATGGTTATGTGCCAAGTTCTTGCT
-TTAACTTGCTTGCTTAATCAAATGTCTACTCATGATATCTTTGGGAGTTTCTAAGTTTCATTAGCTCTTTCCTTAAAGAG
-AAATTAATCTACTTGGCAAGGAAGGTTTATTCATCATAGGTGAGCAAACATTAGCACTTTCTAATAATTAGTTCCAAGAT
-CCAGTTTCTAGATACCTACCAAGTTCAGCCCTGGTTCACAAGAAATTGACCTATTTTCAGTGGAAGCACTGTAACCAGTG
-CAATAAACTCTATCTCATAGAACAGTGTTAATCTGTCATCACAGCCAAAATGATTTGTTATAGCAAAGCAACAATCAGAG
-TAAATGATGCCTGTCCCTTCATTAAGGAAATCTAGAAGAATGCTCTGTCATGAGTTTAATCTGAGATTTGCCTGGCTATC
-CTGATGAAAACCATCTAATGAATATGTAAATTTATCATTGTCTTCTATTGTAAAAATGCACAGCAAATTTTCTGCTTGGC
-TATGCATAATCAGAAGAGAAATCCTCACTGCTGTGAATTTGAACTTGAATAAAAATTGTCTTCTCAGGAAAAGAGCATGC
-TAGATGGAGGAGGGGTTAACAAGAGCCTTCAGTTTACAGATGTAGGATGTCTTCCTGCTGTTAATTATTGTGGTAGGCAG
-TGTAATGGCCTTCTCCCCAAAGACATCCACATTCTAATCCTTGGAAACTGAATATGTTATCTCACACAGCATGGGGCCCA
-CTGGCACTGGACCCCTCCAGTTGGCAGGTCCACTGAGGCTTGGGTACATGGGTAGACATTCACCCTCATTTACCATTCTG
-CTGAAACTGTATCTCTAGGTTTCTGAATGGGAAGAAGGAGCCTACTGGAAGGAAGAGTCATGGCTCCTGGAAAGTGGGGG
-AAATGAAGCAAAATGGAGTTCTTTCCAGAGTTGCCAGATTATTTCAATAAAAATATCAGACATGTGTGAGTAAAAAACAT
-GGACAAAATAGCAACAAAAATGCAATATAGAAAGATTTCTGGAAACAATCCATAACGTCTTATATTTTGCACTGAATACA
-ATGACATTTTTTCATTTCTTTATTTTTCAGAAACTCAGGTTTTGTACACTTGAACTAGAAAAGCATCACATAGGTCAAGA
-CAAGAAAAAAAAATTTTCAAACATCAGTTAATGACATGAAAAATAATAAAAACTATTTAGTTAGATTGTTTAGACTTTTA
-TAAGGAAGACTAATATAAATTTACTGACACATTTCTTCAATGTGTTTCCAGAATAAAAGCTCAAACTCTCAATGCTTTCA
-GAATAAAAGACCACACATGATCTTCGGTGTGGTAAACACCCTCCAGAGTACTTCAAATCATGGGTTAGACAGAAACTACA
-GACCAGCAATATCCAATGGAAATATAGCATGAACCATGTTCAAAGAAGTTGAAGGAAACATATGAAATTATTTGTAAGAA
-TCTATCTTATTTAACTTGATATAGCAAAAACATCATTTCAATGTGTAAACAATATAAAAATTAACTAAATATTTTGCTTT
-TTCAAATCTATTCTTGAAATCCGATGTGTAATGTACTTAAACCATATCTCAATTTAGATAGTAAAATTTATCAGAAATAA
-TTAATCTGTAGTTACATTTCATAAAATTTATCATTGGCAAGTAAGATTCACATACTCAAGTTGTTCTAAGCATACATTAA
-AAAGTTTTCAATAACTGAATCAGTTTTTTATTTTAATTTTTAATTACAATTAAATAAAATTAGAAATTCAGTTCTTTAAT
-CACAGTAGGCAGCCGGGCACGGTGGCTCACACCTGTGATCCCAGCACTTTGGGAGGTCGAGATGGGTGGATCACGAGGTC
-AGGAGGTTGAGACCATCCTGGCCAACATGGTGAAACCTTGTCGCTGGTAAAATACACACACAAAAAAATTAGTCTGGCGT
-GGTGGAGCGCAACAGTCGTCCCATCTAGTCAGGAGGCTGAGACAGGGGAATCGCTTGAACCCAGGAGGTAGAGGTTGCAG
-TGAGCCAAGATCGTGCCACTGCACTCCAGCCTAGTGACAGAGTGAGACTCTGTCTCAAAAAAAAAAAAAAAAAAAATCGC
-AGTAGCCACCTTTTATATGCCTAGTTGACACCTGTAGCTTATGGCTACCATATTGAACATCACAACACTAGCTCATACAC
-AATGATTATAAGAATGTGTGAGATTTGTTTCACTTTCATAAATTTTTTGTGCTAATTTTCTATGTGACCCATTTTTTTCT
-CCATGTTTAATCTGAAGCCTTTAAATGAGAGGCCCTTGTGTTCTTGTCAGTGGTGTCAATAAGGAAGTGAAGAAGGTAAG
-AAGGAAAGGGGAGAAGTTTCTATGAAAGAATGGAGGATGTTGGCAGAAGCTTCAGAGAAAGGAAATCAGCCTAACTCTCC
-AAGATCTGTTGGGCAGAAAGAACAGAGGTTCCCAGGGCAGTAGGATGGGCCTGGAAATTGTTCTAGCACACTTTCAGACT
-GGGCTCTTGTTTACAAATGACAGAAACTTGATTCAAACTGGCTTTGACAATGAAAGTACTCTATCAATTCAAATAAATAA
-AACATCTACATGTTCTGTAGTGAGAAGCTCAGGCATGGCTAAATCCAGAGGATCAAATAATGTCATCACAAATTTATTTT
-TCTTAATCTCTCAGCATCAATGTCCCTGTGTTGCTTTAAATCCAATCAGGGTTTCACCATAGTAAAAAGATGGCCACCAG
-CTACCCCAACCTATGTCCTATTCTTAACAACTCTACCAAAAAGAGTACTTCTTTCTGAGAAGCCCCAGCCAATGTCCTGG
-GCTGATACTCCCTGGTCTGGGCATAGATCTTATGCTCATTCCTCAACTAATTCCCAGGCCTGGTGAATTTCCCAGCTTTG
-GAGATGGAGGGTTGGATCTGACCACTCAACCCCCATGAATTAGAAAAGGGAGAGTGATTTGTTCTTCCAAGGGAAAATCA
-GGCTGCTATAGCTAGGAGAAGAGGGAATGGATGCTGGGCAGGAAAAATTTCTTGTGTGTTAAATCAAGACTTTTGACAAT
-GAGGAGGCTAGTCAGTTCCCCCAAAATAATTTATTCAGACTTTAGGTGTTTCATGAAGAAAATTGTATCATCTGCCAAGC
-ACCTAATCTCCTTTCCCCATTAGTCAGTCACATGGGAATTCATACCTTTTTAAAGCTACCTAACCTTGAAAAAGTTGTTT
-AATCTCACCATGATTCAGATTTTCCATCTATAAAATGGAAATGATAATAGGGCCTACCTCATACATTTATAATAAAGATT
-ACATTTAATCTTATATAATAAGATAATATAATAAAGATTATATTTAATCTTTTATAAATGTATGAGGTAGGTCCTATTAT
-CATTCCTATTTTATTTGTTCTTATTTGTGAAGTGCTTGCAATAAAGTCTGGCAGATGACAAGGGTTTAAAAAAACCCCAC
-TAAATAAATACACAAAAGTGTGATATTATACATTTTTCTCAGAAAAGAAGATTCATTGACTTCTCAAATGAATTCATCTA
-GGCTTCTTCCCATCAAGGTGGCCTCCAGAGAGATGAGAAACTACTGGAAATGTTTACTAAATAAATGAGTCTCATTTTCA
-AAGGAAAGGTCATAGACACTTTTTAAGACACACAGATGTCCTTTAATGCAGCTCATCTGTATTGTAATTTCTGTGAGCTT
-GCATTAGAATGTAATTAAATTAACACCAATGCAGTCCTCCTGTCAAGGAAGCTCTGCCTAATGTAATGGCGTCAAGGAAC
-AATCTGAGCATTACACATATCATGAGGAATTGTTTCCATCCCCATTCTATTCTTATTGTCACAATATTTGGTTTAATTAA
-GTTATATAGGATAGTAATTATAGCAAATGTAGTTTGGCTGGGAAAATACTCCTTGTGATATGAAGGTCGCATCTCCAGAC
-ACCACTGCTGGGGAAGGCAGAATTCAGTCCCTACTTAGGACATAAAAACTCTCAGACACATAAGAAGACTGAGAATAGGA
-ATTGCCTGCTCCTGAAAATGCCAAATTGATATATGGTGAGAAGCCGAGTCTTAGAGTCCCTTTATTGTTGGATACATTCA
-ATAAATAAAAGGAAAGAGCCACCTATAAAAGGTAATTCAAGGGACCATATGCTCTACCTTTCCAAAAAGATAAGTCTAAA
-ATTACAGCCCTAGGGTCAGTTCTCTGATTTGGCATTGCCTCAAGTAGGCCCTTGCCTGTTACAGGGACATTTGCTACCTG
-GAGGGAAACACATTAACATTCTAGCACCACCACCACTGTCATGTAGGTAATGTACTAGATTACTCAGCCGGGTGTGGGAA
-TGTTCCCATTCCTCACTCTTCCCCATACCCATGTCCTTGCCCAAGAACTCTCCAGTTCCTTCCTCTAGAAAGTGTGCTTT
-GTCCCATGTGGCTTGCTTTGGCCAGTGACGTATGGGAAAGAGTGAGGATGTACTGTTCTGACCCTACACCCAAAGAAGTG
-CTATCCCTTTCTGCTCACTCCTCTTGGTTTCTGCCACACCATTCTTCTATTCTAGAAGAATGTGAGACATATGGAACAGA
-GGCACCCTGGCCAATCAGCAACTCTGTGAGTGTGATCATCAATGCTTATCATTAAACGCCACTGAGATTTGGGGTGGTTT
-GTTGCGCAGTATGGCTGAGGTAACAGTTGACTAATACACTGGTTATTCAGCTAAGACAGAGAGACGCTCTGAGTGTCTTA
-ACCATAGCAAGTAAAGTTTCCTGTAAGACAAGGCAGAATTTGTAGCCTTCATTGTAGCCATTCCCTGGCCCTTTTTCCTT
-GCTTTGTATAATTATAGAATCTAAGGAGTGAAATACTCAAGTTCCAGAATTTTTTACAGCTAGGGTGGCCATATGATGCA
-TTTGTAGCCAGTGATACATGTTTTTTTTTTTTTTTTTTTTTTTGCAGGGGACTCCTGGAAATACTTTTGCCGTCATGAAA
-AAAGCAGACTTTTGTTACTGCTCTTCTCCCTTCTTCCTGCCTTGAAGGCAGTCATGATTCCTGAAACTAATGCAGCCAAG
-GTGCAGCCAGGAGGGGAGCAGTGTGAGGTTGAAAAATCAACAGCTTAAGGAGGGCAGAGTAGGAAGATGGAAAAGGCATG
-AGTCTTTGATGATGTTGCTGAGTTAGCTAAACCCCAGTAACAAATGCCTCAGTCTTCTTTTTCTTAGAGCTAAAATTAGT
-GTCCATTTTGTTTAAGCCCCTATTAGATGGGTGATATCTAATGTGATATCTAAAATTAAATGAATTTCTAACTGATATGC
-CTAATTTACAGTTTGGCTTGGAACTGGCTTAGTCTGTTTGCATCAGAAAGATGGCATAGTTTCCCCCATTGGGTATTAGA
-GAAACTAAAATAGAAAGAAACTGAAAGTTTTATGGCCTACTGAGGTCAGAAGGAGGGGAGAGCAGGGAAGCAGCAGTCTC
-AACCTTTAACAGCAAATCGAAGTCCCCTAGGAATTGAGATGGGGAAGACTTGGAACACCTCTCTTCTCTGTGTCTTGTCC
-TGTTTACCTATTAAAACCCAACCCATCCATTCCTAGCCTCTTCCATGAAGCTTTCTCAAAATCCAGCCAGAGTGAACCAC
-AGCTTTCTCTGAATATCTAGAGTTGTTTATTGGTTTTGATCTATGTGTGCCCCTCAATTGACACATCACACTTGTCCCTG
-CATGAGTCCAGCTGTGTAATGTGTCTTATCTTCCCTACAAAGATAACATCTTAATCTCTGCAGAATCTCCTGCAGAACCT
-AGTAAATACGCAGCATACATCAAGTCTTTAGTAACCAGTAATAACAATTAATTACATAAAATGAATATAAACTTGCTTTA
-TAACAAGCCTATCATCACACCTCTGCTTATGGGTGTATCTGGAAACTTAATTAGGAGTTGGTAGCAAAAACAGTCAGCTA
-TTTCTCTTCTATTGCAGAGGAAATAGATTAGGAGAGAAATGAGAGAGGACAACAGAGAGGAGAAACAAAGAACAGTTCAA
-AGTCACCTCCAAAGAGACCAGAGTCTCTGTATAATTTATTCCCTCTTGGGAGCATTCCTATCAGTAGTTCTGATGAAAAG
-AGAGTTAGCAATCTGGCACCGTTTTGCATATTTACACTGTTCCTTAAAATATATGTTGAATCATTTAGACTTTTTAGCTT
-CCACTTTAGTAAAAAAAAAAAAAAAAAAAAAAAAAGAGGGAAAGTCTAAGCTGGAGAGTGCTAGAACTCATAATTAAGAA
-GGAGGGGAGTCTTACACTGGTCCCCCAGAAGCAGACACTGAAACAAGGGTTTGAGTCCAGATGGTTTATTTGTGAGGTGA
-CCCCAGGAACCATTGTAGGAAAATGTGGAAATGAGACAGTGAAGGAAAGGAAGCTAACACAGGTGCATTAATGAGTGGGT
-AATTGGAAATCAGTCCCCACGGAAAGCTCTATGTAGAACACAGCTCCAAATTGTTCCCCATGTGTGATGAGGAGCTGGGA
-TATTTATCTACTAACTCCCATTTGCACTTGGGCCCATTGGGCACTCCTAGACTGCCCCACGCATAACTGATCATGCTCCT
-GCAGCCAAAGAAAGTCCTTAAGCAGAGAATCCAAGGTGCTTGCAGTAAGAAACCATTGGCATGTGCAGGAATACTGAGTA
-TTGATGATATGTAAATAGGGCATCAATCGTGTCTGCTATATGGGGAAAAGTAAAGGGTAGCAGAGTAGGGGCTGGGGGAT
-GAGAAAGCAAGGAATGAGGAGCACTCACTTGGGGAGGACTGCCAACTGTGTAGCCAGGTCTCAATGAACAAAAGTAGGCA
-TTCTGTTGAAACTGCTGGGGAAGTCTATAATATAATACCTCTACCATTTATCTTAATTGTCTTTAGATATAGAATGCCTT
-CAAAATCATAAGGGCCAAAACTTATATTTATCAACCTTCCTGTCCCGTATTGAGGGAATAATAGAGTACATCCATATAGC
-AGAATATTCTGAATCTGTTTAAAATTATGATGCATAGTTTCAATAAAAAGAAAAGGCATTTATAATTTAAAGTTAAGTGG
-TTTTTTTAAAAGGCAAGATCTAAAATTGTATATCTGGTAGGATTTCCACACTGTAAAAAACATGTACTGAACCAATATTG
-GAAGAAAATGTTAACTTTTTAAAAGTTTTTGAGTGGTGGGATTGTAGTTACTTTCCTCTGCTTCCTTATAATTTTCTAAA
-GTTTACCTGCTTTCCACAAGGACATGTATTACTTATAACTATAAAGATTTTTTATGAAATCTCTAAATATAAATAAATGT
-GTATATATATATGTATATATATATATATATATATATATATATATAGCCACTCATTGCCACCAATGGTCCTGCAATAACTT
-GGCCCATCTGAGCCTTTGTTGTTAGATTCTGTTTAGGACTGTGCTCAAGGGCACTGGCTCCCAGGAGATTAACATCTTCA
-GCTTTGCTCTCATTTCCCAAGAAGTCGGTGTCACATTTCAGTTCAGCCAACGAACAGGTATTCACTAATTTAATAAATAT
-TGATAGATTACCCAGTGTATGCCAGGCACTAAATAAAACCAAATATAGTTTCCAGCCCTCATGGAGGGAACTGAGTAATA
-AAAGCAAATGAATAAAACTGTCCATCTTTGAGTAGTCCTATGCAGGAGAGATGCCTGGTTGTATTAGAATCTGCAGTAGG
-AGATTTGGATCTAATGGGTTGGGCTGCCCTCAGGAAGTGAGGGTCAACTTAAGATCCCAAGGATGCATGGAAGTTAACCA
-GGCAAATGTTAATTGGGCTTCTAATGTGTGCAAGGGGTCACCATGCTGGAGTCTTGGGACACAAACTTCTGTCCTCAAGG
-ATCTAGCCATCTGATTGCCAAGCCACAATCAGGATTCCTAAAATAAAAGAAAAATCCCCACCGGTATTAGATTAAGGCCC
-CGGATGTCTATAAGAAGTTCAAAGGAGGAGCAATCAATAAGGGCTAAAGTAGTCCAGAAAGACTCCAGAGAAAAAGTAGC
-TTAGGTGCACTTTTTTGTCAGCCAGAAGGACAGGCTTGCCTAGCAAGGGGAACTGCATGAGCAAAAGTCCAGAAGGGTCA
-ATGCCAATAATCTTTATATAAGAGAGTAAGATGAGAGGTTGCAACTGAAACTGTTACTGGAAAGGCATCCCGATCCTGAC
-CCCAAGAGAGGGTTCTTGCATCTCACACAAGAAAAACTTCTAGGCCAATCCATAAAGTGAAAGCAAGTTTACTTAAAAAG
-TAAGGGAATAAAGAATGGCTACTCCATAGGCAGAGCAGCCCTGAGGGCTGCTGGTTGCCCATTTTTATGGTTTTTTCTTG
-ATTATATGCTAAACAAAGGGTGGATTAATAATGAGCTTTCCAGGAAAGGACTGGGCAATTCCTGTAACTAACGGTTCCTC
-AGGCTTTTAGACCATATAGGGTAAATTCCTGACGTTGCCATGCACCTGTACATTGTCATGGTGCTGGTGGGAGTGTCTCT
-TAGCATGCTAAAGCATTATAATTGACCTATAATGAGCAATGAGGATGACCAGAGGTCACTCTCATTGCTCTCTTGGTTTT
-GGTGGGTTTTGGCCATCTTCTTTACTGTAATCTGTTTTATCAGCAAGGTCTTTATGGCCTATATCTTGTACTGACCTCCC
-ATCTCATGCTGTGACTTAGAATGCCTAACCATCTGGGAATGAGGACAAGAGGACAGCTTCAACTTTTCATGACTTCATCT
-CCAACCCAACCAATCAGCACTTTCCACTTCCTGCACCCCCTACCCATCAATTTATCCTTAAAATCCCCAGTCTCCAAATT
-TTTGGTAAGATTGACTTGAGTAGTAATAAAACTCTGGCCTCGCATTCTGCCGGCTCTGCGAGAATTAAACTCTTTATGGC
-AATTTCTCTGTCTTGATAAATCGATTCTATCTGGACAGCTGGCAAAATGAACCTGTTGAGCAGTTACAAGAGTAAAGGAT
-GAGTACTGAGTGGAAAGGATGGCCTGTCCTTGGGAGTCGGGTAAGGACACTTGAACTCATGATAGAAGCTAGGGAGCAAA
-GAGTGATCAGACAAAAGTTGTATCTATAGGAGGATGGGTGTGGATTACTGAGGCCAGTCCCTATGACCTCTCTCTTTCCA
-GGGCCAGGAACTATTACTGTTTTTTGTGACTTTGGTAAGTAAGTGAACCCAGGGCATGGTTTGCAACTGGCTGCGTTGGT
-CATTTTTATGAATCGATTTGTGCAAACCCATGGCAAGCTTTCCTAATATAAACAGGTGGAAAGAGAGAAGTCAGAGGGGC
-TGGCCTCAGTAATCCAGACAGCAAATCTTACAGGGAAGACCCTCCTTATATCCTGGGGAAATTGGTATATGAGAAGTTAA
-CTGGGTTTTTACCCTCTGAAAAGGAAATTTCTATAAGAAAGGGAAGCATCACTGCATTGCTTGATAACATCTGTTTTATC
-TTGCTTGTTTTATCTGACTTTCTCCCATGGCCAAGGAAACATGATGAAAGAACCAATTTCTTTCCTCTTTTAGAAGCTCT
-GATCATGGAGGAGACCATATCTGCAAGTCATCTAGGACTCAGCTCTTTTAGAGCTATCCATGGACTGGGAGACCCTTCTC
-CCACTTCAAGGAGCCCCTCTTTTGTACCCCCCAAACTTCCTGGCTTACAAAATTTGCTGCCAGATGTGGTGGTGTGGGAG
-TGAGGGTGGGTGGCATAGGTCATGTTGGTAAAAGGCCTCCCATAGGCGGGAAAACTGCAGAGCCAGGGGGCCTAGGGGAA
-GGCATCTCTTGCCTAGCAGATGCTGACAGAGGAAATGGCACATTCTGCCCATGCATCTGTCCTCATGATTCACATGCCAG
-CAATTCCTCAGGCTAGAACATACCTTGTAGGTCATTTTCTAGCACATGCCGTAACTAGATAGCCCCTAGGTCTCTCTAGG
-AAAGGTGACTTTCTAAACTTTTTTTGTATTCTGTCTGTAAAGTACTGCATACTTTAAGGACTTTTTAAACAATAATAGAG
-AAATCAGCTTCATCCCTGCTTCAAGACACATCACAAAGCTCCAATCACAAAAACTCTAGAGTTTCTGTAGAGGGATTAAA
-GTGTGGCAGTCTAGTGACCTAAAGGGATTTGACTTGAAGCTGTATTTGCTTAGCACACACGCTGTTTTTATCTTGATTTT
-AAGTTTATTGGTGCAGCACATGGAAATAATGGGCATCAAAGCCCACACCTCCCAAGCTGGTCCTTGATGCCATCACTGAG
-CCCTAAGTGAGAGGCCTGCTTATAATAGTCCTGCATTCTCAGCTTCCCTTAACCCCAAGAATAGAACGGTGTCTTGCATG
-CAGAAATAGGTTATTGGTGAATAAATTGCTTAATGAATTATCTAGTTTCCCTAACAGAGCTGGTTACTTCTTTCTCATGT
-GAAGGTGAGCACCTGGTGAGGTTTTCAGGAATCAGGTTCACCTTGAACACCATACTCAGGCCTTGGCGGCTCTCTGGGCC
-TGCCTGGCTCCTACAAACACCATGCAGTGTTTCTGGATCTCCTAGGCCCTCTAGTGGCTATTCTTAGGCTGAAATCCCTC
-AGAACTCAGCCTCTCAGCTCCTGCTAAAATTTCAACCAGTCCCTGAATTTAGAAATATGTATATATACTTATTTTGCTTC
-TCGTAAACTGCAAAGAAATAAATTTAATTATGTCTAGTTTCTGATCAAGATTTATCTGGTCTCATAGCCTTCCCCTGGTT
-TGTGTTTTAATGAGCTTTTTATTTTTCAGTTGAAAGATTATACCAGATGTCAAGACTTAACAGGAATCAAGACAGCATGG
-ATTGATATAAGGGTAGACATAATTATCAATGGACAGAGTACAGACTCCAGACACAGACCTACACCTATATAAGCAACTGA
-TTTTCAAAAGTATCCTGCTTGCCTGCTTGTACCCCCAAATGGGCTCTCCCTCACCCCAAATGCATCTTTAGGTTTGTTTC
-AGAGAATTTCTGATGGTCTTTCTCGCACAGAAACACACAAGGGGTCTAAATGGGTTCTTTATGCAGAAGAGCGAAGATTT
-CCAGGTCCAGTGGGCCAAAGTGCCTTCCCCTGCAAAGCCTTTGAGTGATTCCAGGCACCAGGGGCATCAAAGCCTTGGTG
-GGACCAGAAACTATTGCTGTTTTTTATGACTTTGGTAAGCACGTGAACTCAGGGCATGGTTTGAAACTGGCTGTGTTGGT
-CATTTTTATGAACTGATTTGTACAAACCCATGGGAAGCTTTCCTAAATAGAAACAGTCTGCATTATGGTGGTATCACCTT
-CATCTGACCCCTGGGAGCTCTAAAGAAAAGCCCATGATACTCACCTGGCCTTCAGCCTGACCAGGGGATTAGGCCACTGG
-CCAGGATGAGACTGAAGGAGGAAAGGAACCTATACAACTACTCTTCCCTTGGTTGAAAGGAAAGTCCAGAGAGAATAGCT
-ATTTGCAAATATCTGGGCTTCTACTGGGTGCTTACTGTTGAGTATCTTATATTGGGACACAGGTATGTTCATCTCCATTT
-TACAGATGAGGAAATCGAGGCTCAGAGTTAAATATATTTCCCAAGGTCAACTAAGTAAGTGGCAGGATTAGGATCCAAAC
-CCAATTCTAACACTCTCTAAAACCCACTCTTTAGCTAGCCCCTGCCTCTTAGCTTTGGGGTTCAGGTTCTTGACTCAGTC
-TATGCAAATGTTGCCTTCTGGAATTTGGCAGTGCACAACCTGCACATCTGTACAGTGTAGCTGAAACCAACTTCTGGGTT
-GAAACCCTTCCATATTCAAGATTCTAAGCCTGGGCTAAAATCTAGAGCCTTGTTACTCAAAGTGGTCCCTGAACCTGCAA
-CATCAGCCGTGTTTGGGAGCTTTTTAGAAATGTAAATTTCTGCTCTCCTGCTGCCACTCCCCCCAACCCCTTTCTATTGG
-ATTACACTCTCCAAGAATGGAGGCTGCACCCAGGATTTCTCAGCTGTTATGTGCATTCAAATCACTGGGAATCTTGTTAA
-ATGGAGATTCTGGCACAGGAGTTCTAAAGAGGTAGTGCTAAGCTTTTGCTTCTTCGGGCAGCTCCCAGATGATGCCGATG
-ATGTGAGCCACACTTGGAATAACACAGCTTTAGATCAGTAAGTCTCAAACTTGAACCTGTATTCAAATCACCTGAAGAGC
-TCGTTAATACACAAATTGCTGGGCCCTACTCTCACACTCTCTTACAATAGCTGTGCACCTTCACCTTTACTTTCACCCCA
-AGAATAAAACAGTTTCTTGCACACAGAAATAGGTTATCCATGAATAAGTTGGTTAATTAATTATCTACCTTTGCTAATAG
-AGCTGGTTACCTCTTTCTCATGTGAACATGAGTACCTGCTGAGAGAGTGCTTCAGAGGGTCTGGAGTGGAGCCTGAAAAT
-TTGCATTTCTAACAAGTTCTGGGCCCAGCATGGTGGCTCATGCCTGTAATCCCAGTGCTTTGGTAAGCCGAGGCAGGAGT
-ATCACTCGAGGCCAGGAGTTTGAGACCAGCCTGGGCAATATAGTGAGACCCCATCTCTACAAAAACTTTTTAAAAATTAG
-CCAGGCATTGTGGTGTGAGCCTGTTGTCCCATCTACATGGGAGGAAGATCCCTTCAGCTGAGAAGTTCGAGGCTGCAGTG
-AGCTGTGATCTAACAAGTTCCTAGGTGATGTTGCGATGCTGCAGGTTTAGGGACCCCACTTTGAGAACCAGTGTTCTAGC
-CTATCAGAACTTCCTCTAATTAGACAACTAACTCCATGCTTTCTGGCATTTCATTTTTATAAAGCCCTATTCGGTCCTTG
-AATTCTAGCATTTTAGAGCTGAAAGGGACTTCAGAGGCTACCTTGTCTCAATTAAAGAAATGCAGGTCAAGGGTCCCACT
-CAAGGCCATACAATTAGCCAAGAGGCAAAGTCAGGATTAAGCATCCTGACTCACTCTATTTCTATGCTGTTTACTCTGCA
-TCCTGCTGGCTCCAAAGCTCAATAAATTCCCTGGCATCCAGCAACTGCAGTATTTTTGGTGAGCTCTCCATCCCAGGCCA
-GCTTTGAGGTGCTAGAATCCCTGTCAGACACATATGTCATCCGCACAATCATGGAAACGCAGTGGCCTCCTACCTAACAG
-CTCTGTGAAAGAGGGCTTTGGAAAAAAACAGCAGCTGTGCTGGCCACTGTAGCAGAGAGAAAATGCAGCAGCTAGCAAGC
-AAACCCAGACAAGGTGAGTCAGCATAGAGGCCCTGGGGCTAAGGAATATACCAGGATACTGCCAACAACTGGCACCCAGA
-TTCTCCTGAGCAAATCTGAGAAGGTCAATCAACTTCTCTGTGCCTGAAAAGATGCTTTTCTTTAGAGAAAACAATACTCT
-TATTCAAGGGAATGAACACACAAGAGGATATCAAAAATGTGCTTGGGGTGGGAGTTGTATCAGTCCTGCTGCATGACAAA
-TCACCCAAAACTTAGTTGCTTTAAACGACAACCATATTCTTGCTCACAAGTCTCTGAGAAAAAGGAGAAATGCTTAAGAT
-CCCTTGAAGCCTAGACTTGGAACTGGCATATCATCACTTCCTCCATACTCTACTGGCCAAAGCAAGACCCAAGGTGAGCC
-CACTTCTTAATGAAAGGAACTGTAACTTTACAGTATAAGGATGTAGAGAGGCGGAAGGTTTGTGGCCATTTTTGCAATCT
-ACGACAGAGAGGTCTTCTTAGTTTAGGAAAGTCTGAGACAAAGATTCCAAAGCAAATGGTTTACTTGGAAAGGAAAGGAA
-ATACCGGTAGGGGAGAGAAAAATGGAGACACAGAGAAGCAGCAGCCAGTAAAGGGTGCAAAGCCAAGTCGGCTGGCGCTC
-TGGGCAGCTGGAGTATAATTCCACTGGAGAACTCTGGAAGCTGGTGCAGGACACAGGCCTCATCATCATCCTACCTAAAG
-GAGGACGCCAGGATGTTTATACATCAATCCATGATATGGTTTGGATCTGGGTCCCTGCCCAAAACTCACATTGAATTGCA
-ATCCCCGATGATGGAGATGGATCCTGGATCCTGGTGGGATGTGATGGGATCACAGTGGTGGATTCCTCATGAATGGCTTA
-GCATCCCCGTGGTGCTGCTCCCATGATAATGAGTGAGTTCTAATGAGATCTAGTTGTTTAAAAGTATATAGCACCTCCCT
-CACTCCAACTTTCTCTTGCTCCTACTCCTGCCGTGTGAGACATCTTATACCTCCTTCCTCTTCCACCGTGATTGGAAACT
-TCCTGAGGTGTCCTCAGAAGCAGAAGCCATTATGCTTGCTGTACAGCCCGCAGAACTGTGAATCCATTAAACCTCTTTTC
-TTTACAAATTACCCAGTCTCAGATATTTCTCAATGCACGAACACACTAATACAATCCGTATCAGTCATTTACTGAGGCTG
-CTCTCAGAGCACAGAAATTCCCTGTAATTTCAGCCCTCCACTCTGGGCAATGTGGCTTAAGAGGTCAGAGCAAGACCTTG
-ACAAAAAAATAAAAAAAGAAAAGCAGATGCAGCTAGCTTAGCTGGACCGTTGTGCCCTGCAGCGGTTAGACAAAGAGGAT
-AAAAGGGAAGGAGGATATGAGTAGGGCACCACCTACAACATATCCTTCACTGTGATGGTGATTAAAAAGAAAAAAAAAAA
-CTCAAGTTTCAGATTTATGTTATTTTAGTCAAAACATCTTTTTTTCTTTTTTTAAGACTGTTTACTGTATTTTGGATGAT
-GCCTCAGTTCTCTTGCTGGCAGAGGTTGGAACACTAGATGGCATTGTATTAAGTTGTCCTATAGCTCAGGAAAAAAAAAA
-ATGCAAAGGGATGTTCCTAGTTGTCTTTGGAATTTAACAATTATCAGCATGAGTTGAGAGCAAACAACTGTCCCAGCCAA
-AGTGATGATGGGTCGCTTCAGCTCTACCAAGGCCACCACTCCATCTTGATCTCACACCTTGGCAGCAACATCACAAACCA
-TGGGGGCCAAAGCACAAAGGGAGCAGGCTAAGATAGGAGGCATTTTCTAAAAACTAGGATTCGCAAAACCCATGGGAGGA
-GAAGCAGTAAGGAGAACGAAGCCTTCTGCCTCAAGAAAGGTCTTTGAGAGGCACAGAAAAATGGACTGCAAGAAAAAAGC
-AGCAAACTTATAGTAAAGATTTATTCTTACTTTAGTAATAGTAAAGATTTATTCTTTGCTGTAAGTTAGGTGTCTTGGTG
-TTGCCTGAAAAGAGATACTGCCTTTCTCCCTTGAATGTAAATGAGAGAGAACTCTTGATGTCTTTTACCAACTTAGAGAA
-AGCCCATACCCAGCCTTCACAAAATGCCATGAGAAAAAGAGGGGTCAGGTGTGGTGGCTCACGCCTGTAATCGCAGCACT
-TTGGGAGGCCAAAGCGGGCAGATCACCTGAGGAGATCAGGAGTTCAAGACCAGGCTGGCCAACATGGTGAAACCCCGTCT
-CTGCTAAAAGTATGAAAATAAAAAAAATGAAGAATTTACTCTTGGGGGCAGGAATGGAAATGAGAGTGGCAATAGGATGG
-GGTTGAAAGTGAGGGTCAAAGGCATTTAACATTTTCTTTAAAATATTTTAAACAAGTGAGATAAAATGTCAACAATGATC
-AATTCCTCATAATGGATATTAGGTGGATGTCATCTTATTATCTTTATCTTAAATTTCAAAAAAGAAGAGAAAAGAATATG
-ATGTTCTCTTGTAATTAGCAAGGGCTGATAGGGTTCAAGAGGTGACACTGATATGGATCTTGAGTAACTGTTGACAAATA
-CTTCCCTTTACTGAGCTTCCATTTTCTTGTTTATAAACTGAGGATAATGATAGTAGTGATGTCAGGGAATTGTCATAAAC
-CTCGACTAAAATAATGTACTCGGAACAGTGCCTAAAGCAAGGTGGGAACAGTGCCCAAAGCAAGGGGGTCCCTCAAAAAA
-TGCTTGCTTGCCCAGGACCCTCACCAGCCACCACCACCAATGTGAGTACAAGGATTAGTTAGGCTCATCTTTCTCACTGA
-GTCAAACCATACGATTGGCTGGTTGTCTGGATGTGATTAGAAACAGAAAAATCTTAAATAAAGCCTCATCCTGAATCCTC
-TCAATCCAGAGACAGAGTTGACCTAAGACCAAAAAAAAAAAAAAAAAATAGAAAATAGTTTTTGGAAATATGGGTGAAGA
-GACATCTCCTCTTATGGAAAAAGGGATTCTAGAATTTAACAATAAATATTCCCAACTTTCCCCAAGGCTTTAAAATCTAC
-CTTGAAGGAGCAGCTGATGTATTTCTAGAACAGACTTAGGTGTCTTGGTGTGGCCTGTAAAGAGATACTGTCTTTCTCTT
-TTGAGTGTAAGAGAGAAAGGACAGTCTACTCAATAAAGAGTGCTGGGAAAACTGAATATCCACACACAGAATAATAAAAC
-TAGATCCTATCTCTCACCATATACAAAGATCAACTCAAAACAAATTAAAGACCTAAATGTAAGACAAGAAATTATAAAAC
-TACTAGAAAAAAACACAAGGGAAATGCTTCAGGACATTGGCCTGGGCAAAGATTTTATAAATAAGACCTCAATAGCACAA
-ACCACAAAAGTAAAAATAGGCAAATAGGATTATATCAAACTAAAAAGCTTCTGCACAGCAAAGAAAACAATCAACAGAGT
-AAAGAGACAACCTGAAGAATGAGAGAAAATATTTGCAAAGTATTCATCTGACAAGGGACTAACAACCAAAATATACAAGT
-AACTCAACAGCAAACCATCGTCGTCATCATCATCATCATCATCCAATTTTTATAATGGACAAATGGTCTGAATAGACATT
-TCTCAAAAGGAGACACACAAATGGCCAACAAGTATAAGAAAGAATGCTCAACACCACTGATCATCAGGAAAATGCAAATC
-AAAACCACAGTGAGATATCATGTCATCCCAGTTACGATAGCTAATTATTTTTTTCTTTTTTCTTTTTTATTATTTCAATA
-GTTTGGGGGGAGCAGGTGGTATTTGGTTACATGAATAAGTTCTTTTGTGGTGATTTCTGATATTTTGGTGTACCCATCAC
-CTGAGCAGTGTACACTGTACTCAATGTGTAGTACCACCCCTGAGTCCCCAGAGTTCATTATATCATTCTTACACCTTTGC
-ATCCTCATAGCTTAGCTCCCATTTATAAGTGAGAACATATAAGGTTTAGTTTTCCATTCCTGAGTTACTTCACTTAGAAA
-AATGGGCTCCAACTTCATCCAGGTTGCTGTGAATGCCATTATTTCATTCCTTTTTATGGCTGAGTAGTATTCCATGGTAT
-ATATATACCACATTTTCTTTATCCACTCATTGGTCAATGGTCCTTTAGGCTGGTTCCATATTTTGCAATTGCAAATTGTG
-CTTCTATAAATATGTGTGTGCTGCTATAAAAACATGTATACTTTTCATACAATGATTTCTTTTCATCTGAGTAGATCTAG
-TAGTGGGATTGCTGGATCAAATGGCAGTTCTACTTTTAGTTCTTTAAGGAGTCTCCATACAGTTTTCCACAGTGGTTGGA
-CTAGTTTACATTCCCACCAGCAGAAGTAAGGTGGTATCACATTTTGGTTTTAATTTGCATTTCCCTGATAATTAGTGATG
-TTGAGCATTTTCTCATATGTTTATTGGCCATTTGTGTATCTTCTTTTGAGAATTGTCTATTCATGTCTTTAGCCCACTTT
-TTGATGGGATTATTTGTTTGTTCTTGCTGATTTGTTTGAGTTCCTTGTAGATTATGGATATTAGTCCTTTGTTGGATGCA
-TAGTTTGTGAATATTTTCTCCCACTTTGTGGGTTGTCTGTTAACTCTGTGGATTATTTCTTTTGCTGTGCAAGAGCTTTT
-TAGTTTAATTAAGTCCCATCTGTTTATCTTTGTTTTTGTTGCATTTGCTTTTGGGTTCTTGGTCATGAACTCTTTGCCTA
-AGCCAATGCCTAGAAGAGTTTTGGGGATGTTACCCTCTAAAATTTTTATAGTTTCAAGGCTTAGATTTAAGTCTTTGATC
-CATAAGATGGCTAATTATAAAAAAAAGATAAAAAATAGCAAATGTTGGCAAAGATGTAGAGAAAAGGGGAACTCTTGTAC
-ACTGTTGGTGGGAATATAAATTAGTACAGACATTATGAGAAACAGTAGGGAGTTTTCTCAAAAAACTAAAAATAGAACTA
-TCATATGATACAGCAATTCCACTACTGAATATATATTTCAAGGAAAGGATATCAGTATGTCAAAGAGATATGTGCACTTC
-TATGTTCATTATTTATAAATAAATAAATAAATTATTTATTTATAAATGAACTCCAATGTTCATTTATTCACAATGGCCAA
-GATACAGATCAACCTAAGTATTCATCAACAGATGAATGGAAATGAATGTTTGGTAACAAAAAAAAAAGATGAATGGATAA
-AGAAAATGTGATATATATGTATGCAATGGGATACTATTCAGCCATATAAAAAATAAAATCCTGCCATTTGTGGCAACATG
-GATGAGCCTGGAGGACATTATGTTAAGTGAAATACCACATGTTCTCACTTATGTGTGGAAGCTAAAAAAGGTGAGGTATG
-GAAGTAGAGAGTAAAACAGTGGTTACTAGAGGCTGGTAAGGGAAGGGGGAAGGAGGAAATAGGGAGAGGTTGGTTAACAG
-ATACAAAATTACAGCTAGGTAAGGTAAATAAGTTCTAGTGTTTTTCAGCACTCTAAGGTTACTATAGTTAGCAATATTTT
-ATATTTCAAAATAACTAGAAGTAAGAATTTTAAACATTCCTAACACAAAGAAATGATAAATGTTTGAGAAAATAGGTATG
-TTAATTACCTTGATTTGATCATTACACATTGTATATAGGTGTCAAAATATCATACTATACTGCATAAATATGTATAATTA
-TTGTGTCAATTAAAACATGTGTAGGACACAGCTAAAGTAGTACTGAGAGTAAAACGTATATCACTAAGTGCATACATTGC
-AAAAGGAGAAAATCCTCAAATAAAAATTCTAACCTCCCACCTCAAAGAGAAGGGAGGGCATGACAAAAATAAGAGCAAAA
-AAATCAACAAAATTGAAAACTTAAAATCAATAAAGAGCTGGTTCCTTGAAAACATCAATGATATTTACAAACATCAAAGC
-AGATAAAAAGAATAAAGGTCGGTATCAGGAATGAAACAGGGAATATCACTACAGATGTTTTCAACAAAAGGTGATGGCAC
-AATTAAACATCCATAAACTATAAAATGAACTCTAAGTTTCACATCTTATACAAAAATTAACTAAAATTTATTATCCACTT
-GTGATATGGTTTGGCTGTGTCACCACCCAAATCTCACCTTGAATTGTAGCTTCCATAATTGCCAGGTGTTGTGGGAGGGA
-CCCAGTGGGAGGTAATTGAATTATGGGGGTGGGTTTTTCCATGCTGTTCTCATGATAGTGAATAAGTCTCACAAGATCTG
-ATGGTTTTATAAAGGGCAGCTCCCCTGCACATGGTCTTTTGCCTGCCACCATGTAAGACATGCCTTTGCTCCTCCTTCGT
-CTTCCACTATGATTGTGAGGCCTCCCTAGCCATGCGGAACTGATGAGTCTATTAAACCTCTTTTTTCTTTATAAATCACC
-CAGTCTTGGGTATTTTTTCATAGCAGTATGAAAATGGGCTACTACAACTTGTAAACCTATAAAACCTTTAGAAAAAAAAA
-AACACAAGAAAAACTCTTTGGTATATAAAACTAGGCAAAGGGTTCTTAGACACCAAAAATGTGATTCATAAAAAGAAAAA
-TTGAAAAAGTGAACTCCACCAAAGTTAGAAAATTTTGCTCTGTGAAAGAACCTATTAAGGAGATAAAAAGACAAGGTACA
-AACTAGAAGAAAATATTTGCAAACCACATACATGTCAAAGGACTAGTACCTAGGATATATAAAAAGCTCTTAAATGAAAC
-AGTAAACAAACAATTCAATTAGAAAATAGGCAAAAGAAAGAGATATTTCACTGAAGATGTTATATTGATGGAAATTAAAC
-ACATAAAAAGAAGTTCAACAACATTAGCCACTTGGAAAAAGCAAATTAAAACCACATTGAGATATCATTACACATCTATC
-AGAATAGCTAAAATTAAAAAAGAATTAACAAAACCAAATATTGGAAAGGATGCAGAGATATCATATCACTCAAATATTGC
-TGCTGGGAATATAAAGTGGTGTGGCTATTCTGGAAACAGTCCCACAGTTTCTTAAAAAAGGAATAAACATGCACCTGTGA
-GGCTGGGTTCTCATGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCAGATCACAAGGTCAGGAGTTCAAGACCAG
-CCTGGCCAACATGGTGAAACCCCATCTCTACTAAAAATGCAATAAATTAACTGGACGTGGTGGTGGGTGCCTGTAATCCC
-AGCTACTCAGGAGGCTGAGGCAGGAGAATCGCTTGAACGTGGGAGGTGGAGGTTGCAGTGAGCCAAGATCATGCCACTGC
-AGTCCAGCCTGGGCAACACTGTGAGACTTGTTCTCAAAAAAAGAAAAAAAAATGCACTTGCTATATGGCCCAGCAATTGC
-TCTCCTGAGCATTTATCTCAGATAAATAAAAATTTATGTTCCCACAAAAACCTGTACATGAATACTTATAGCAGATTTAT
-TCATAATAGCACAAAACTACAAGGCACCCAGATGTTCTTCAGATGATGCATAGTTAAACAAACCATTCCATACAATGAAA
-TATTACTCAGCAAGACAATGGAAGGAGTTATTGATACATGTAATAATCTGAATGAATCTCCAGGGAATTATACTGAGTGA
-AAAGAAAAGCCAATCCCCGAAGATTTCACACGATAAGCCTTTCTTTATATAGCATTCTTAAAATGACAAACTTAAAGAAA
-TGAAAAACAGATTGCTAGTTGCCAGGGGTTAAGGACCAGGCAAGGGTGGAAGGGAAGTTGGTTTGACTATAAAAGTATAG
-CATGAATGATCCTTGTGGTGATGGAAATGTTCTGTATCCTGGCTGCATCAATATCAATATCCTTGTTGTGATATTACACT
-ACAGTGTTGTAAGATGTCACCACTGGAGGACACTGGGTAATTGGTATACAAGATTCCTTTGTATCATTTTTTATAAATTC
-ATGTGAATCTACAATTATCTCAAAAAGTTTATTTTAAAAAAATGTTAAGGCTAAAGTGAATTTCATATATGAAAGAGGTC
-AAGTGGAGAAATAATTGGAAAGAGCACTGGACGTTGGGTCAGGAGTTTTAGATTCAGGTTTTGATTCAATCAACTTAAGT
-AAATAACTCCTCTTGTCTAAAATTATTTGTATAATGCAATTGACAAGACCTGCTACAGTTATCTCCCAGAGTTGATAATA
-GGTAAAAATTATATTAATTAAGAGAAAAACTTTAAAAACATAAGAACCAAGGCTCTATATAAATATTTGGTATTTAAAAG
-CTTGCATTATATAAATGATGCCTCAAAGCCTATTTCTCCTGGTAGTTTAGAAATATAATTACCTGGATAAGACCACCAAC
-TAATTTCACTTTCACCGTCATTCAGTAAATCTCAGAAATATAAGCAAAGAACAATCTTGGACAAGAGAAAAGAAGAACCT
-GATCTCTTTTCCAGCCCTATGACTCACTGAAGAAACCAGGAATATGCCACGTGTTCTCTTTCTGCTGCAAGGGTTGCTGT
-GAAATAACCTCATTTAAGCTGTGTTGTACAGAATGGACCACCTTAATGCTGAGATTCCAACATTTTCTATTTCAGGACTG
-GTTTGGGGAGATTGCACAGAGTTCATCCTATGATCCTTCATGTGAGAAGGAAGCCATTCGGCCATTTATAGCCTAAAGAA
-GACAGAGCTAGAAGGGATAAAGCCAATCTTGGCTATTGCTGCTATGGGAACAGAGGGTAGAGATCATTTGCTCCATTGTA
-GAAATTTGGAACTACAGTTGACCCTCGAACAACATGGATTTGAACTGTTTGGGTCACATACATGTGGACTTTTTTCAATA
-AAAGCACCTGTCCCTCTTGCCTCCCTTTCCACCTCCTCCACCTCTTCTACCTCTGCCACCCCTGAGACAGCAAGACCACC
-CCCTCCTCTTCCTCCTCATCCTACTCAAAGTGAGAAGAGGATGAAGGCCTTTATGATGATTCACTTCTTAATGAATAGTA
-ATGATTTTCTTAATAACATTTCCTTTTCTCTAGGTTACTTTAGAATACAGTTACTTTAGAATACAGTGTATAATATATAT
-ATAATATATAAAATATGTGATAATTAGCTGTTTATGTTATCAGGAAGGCTTCTGGTCCAGAGTTGGCTGCTACTAGTTAG
-GTTTTGGAGGAGTCAAAAGTTAGACGTGGATTTTTGGCTGCACAGGATGTCTACACTCCTAACCCCAACCTTGTTCAAGG
-GTCAACTCTAATGGGAAGCTTTTGCAGCCATTAACTTTCAGTGATTTCAGTACACGCTAAACTGGCTTTTTAAAATGAGG
-GAATATATAAGCTCATTTAACAGGAAATTTAATAAAAGCTGGTTGATCCAGTACCCCAGTGTTATTACCTAGGACTTAGG
-TTCTCTACATTTCCTGTCTTTGCTATACACATGGTTGACTTCATTTTTAAGGCTGGTTCCCACCAGAGGACAATTGTGGA
-TTCATCCACTTTCATTCAAATCTGGGGAGAGAGCGGGAGAATAGCTTGTTCTTTAGAGCAAGGCAGAACTTTCCAAGAAG
-TCTTCCACGAACCTCCCTTCACATATCATTGGCCAGAACTGAGTCACAGGACTTTTTATAAACGAATCACAGACAAGGGG
-GTATGAGCTAACCCTTAACCCAATCAGAGTTACTCCTGAAGCTGAGGGTATTCCTTGGAGTCACATGGACTACATGAAGA
-CAGGGCACTTGAACAAAATTGAGGTTCTATTAGGAAGAAAAACTGAGGTTGTAAGTGCTATGTAAGTAGTTGGTGCTCAG
-TAATGCTGCCATCCTGTCTTAACTTAGCTAACAGGACTAAGTGACATATTTCTGAGGACTCTGATACTAAATGGTGTAAA
-TATAGGGTAGAGTTTGATTTTTTTAGTTTTGACTCTTTCTTTAAACTGACTGTGAAACTTCAGGAAGTCAAGTTATTGAG
-CCCTTGTTTTCTTACTTCTGAAAGGAAATAAAACTGTATAACTTCGGGCAAGTTACTTACCTTTACAATGTGTCAGCTTT
-CTCTTTTGTGGATTCCTTATCTAAAGTTTAATAGTACTTTACTCATAAAGTTGTATTAGTTTTCTAGGTTTTCCATAACA
-AAGTACCACAGACTTTGTGGCTTAAACAACAGAAATTTGTTTTCTCATATTTGGAAAGCTAGAAGGCCAAAATCAAGGTG
-TCGACAGGGTTGATTTATTCTGAGGACCTTTCTCCTTGGCTCGTAGATGACCATCTTTTCTCTATATCTTCGCCTGATCT
-TGCTTCTGTGTGTGTCTGTGTCCTATCTCCTCTTCTTATAAGGACACCAGTCATATTGGATTAAGGACTACTTTAATGGC
-TTCATTTCACATCTTTAAAGACCATATCTCCAAACAGGTCACATTGTGAATACTAAAGGTGAGGACTTCAACATATGAAT
-CTTGGGGTGATACAATTCCATGCTTTTGATGTAAGAATTACGTGATTTAATACATGTTAAGGATGTAAATCTATATAGTA
-GATGCATACTCAACATTAGTTATAAAATTATCTTATTTTCAGTAGTAGCAACAGATATAAAAACAATAGTATTTGAAGTA
-GTAATAGCATCACTAGCAGGGATAATAGCAGAACTGTCTGAGAGAAAAGGAGAAAGAATCCCTATGCAAGGAAGGGGGAA
-GATATACTTTATAGAGAAATGAGACACAAGAGAATAGTATTTGTTTCACACTCTTCCAGCTACTATGGCTGTGTAACATA
-GTATGTCAAAACTTACTGGCTTAAGTCAACAACACTTATTTTCTTCATGAAATCTGCAGTTTTGACAGGCCCAACAGGGA
-TAGCTCGCTCAAACTGTACTTGTCATCAGCTGGAACGTTCAGAGTCTCACTCACATGTCAATGCCAGCTGTCAGCTGGGA
-CCTCAGTTGGACACGTATGTGGGGCCTCTCCACATGGCCTGGGTTTCTGCACACATTGTTGCTGGTCTCCAAGGGTGAGC
-ATCCTGAAAGAGAAAAAGTGGAATTGTAGTGCTTTTTATGACCTAACTTCAAAAGTCACTAAAAATTCCTTTGGTTGCAT
-TCTACTCATTTGAGGCATTTATAAAGACTGTCAAAGTTCAAGAGATGGGGAAATAGACTCTTCCTTTTGATGGAGAGTGT
-CAAGGTCTGGAAGAGAATATGGGACTGCATTTACTGCTGTAGTCATGTTTGGAGAGTATAATCCTCCATTCATACCTAAC
-TTCCCACACGAAGCTTCTCTTTCTGGAGCTTACTTTCAAACACTTGGGTTTGTGATTTTGTTCCAGATCAGAATTGGATC
-CTTATGCTATGCTACCCAACTTCCAGAGATTTGAGGATAAAATGGCACATTTGGCAGAAAACTTTTGAGAAGATCTTTAT
-CAAAGAGGGAACTCTCTAAATAAAGGTTCAGTGTGCCTCATAGTTCTCTTTCAAACAGGAACATACAGAAAGGGGGTTGA
-CATTTTGATTTCCCAGATAATCTTTTGTTTTTATGATTTTGGATATAAACATGTCTCAGACCTGAACAAGGAACTCAGAT
-TTTTATCCTTAAAATTAAATCTGAAGAATAAGGAGAACCACATGCCCTTATCAGCTTTAATATTCTAAGAAAATGAGAAA
-AAAAATGATTTAAGAACATTTAAAAGTTGTGCACTGGGTTCATCAAAGATTCTCCCATTGAAGAGAAAATCTGAGCTGTT
-TCTTGCTTTATATTTGAATGCTGTGCATGGTTTTCATGATGGCAATAATAATTTACTGCAAAATGCTTTTATTGAGTTGC
-CTTTACTGAAGAGGCCCTGCATGCCTTTTCACCAGCTTGCTACAATTAAAAGCAGCAGTAAACAGAGCCTTTCTATTTAG
-ACTGAAAAGCAATGATTAAGCTTACCCAGCTATAAATAGGAGGCAGCTTCACATCTATGGCCCCAACTGCACACATTAAA
-GACTCCAGCTCCAAATGCCCCCAATTTATTTCTACAGGACAAACCAATAAATTGTCAAACTCTGACCTTAAAAGTGACAA
-TTTCTTAAAAAATGAAAGTAGGTAAATTATGCATAATTATAGATAATTACTGAGATGTCTATGAGGCCAGGAAATCAGTA
-CACATGCTGGAAATCTAAATTTGCACGCTGATAGCTTCTCCTTTTACCATTATCAAACCATGGTTTGCCTTGAGCAGCTG
-TCAGAGATGGCTTTTCTTTGCTTGGGGGCACAGAAGAAAATAAGGGACTTAAGAGAGAAGATGGAAAATACAAAGTTATT
-TTTTAAGATTCCCGTTAGTTCAAGTGATTCAGCAAGGAAACCAGAATATAGGCAGTTACTGTTAAACGTTTTTGAATAAA
-AATGTTTAAATGCAAGCCATTTATCCCACCTATAAGCTGTAGCTATCTGAGTGTTTAGAGATTTGAAGGCATTTGATTCA
-ACCTCCTCACTTTCTGCAGCAGGAAACTGGAGGCTAAGAAAGCCCTGTGAATTGTCCAAGGTCACATGGCTTGACAGCAG
-CCGTGCTGGAACTCAGTAGCTTTTCTGACTGTCACTGCAGCATCCACTGAATGGAAAAATTTGTTCCCTTTTTATTATTT
-TTAGTATAAAACCCTAGATTAATGAGATCTAAGTCATAAAAGTCCATAGGGTGCTGTATTTCTTTGAGTGCAAGACAAGC
-TTGCAAAGGTGACAGGATTTTCCCACTTGAAGAAACGTGGTCCCCTCTGCCTCAGCATCCTCCATCTGAGCCAAGAGTTG
-CCAATTTCCAAAAGCCCAAGAAAGTAAGTTTCCAAAATATGTCTTGGGTGATCGTATCTTTTTTAAACTTGTGAGTCCTC
-TTCATTTCGTGTTTGCATGTGGCCTTTGTCTCCCAGTGATTTTCCAACTGCCCATGACTCCCCTTGGGTCATGCGCTGGA
-TATTCTCTGTTGCCTTCTGTCACCTTCTCAACTCTGTGCCCAGGAGACTGGCATTTATGTATGTATCAATGTCACCCTAG
-TCCTTTGGCTATAATCAGGCTGAGCTATCAAGGATACTAACAGAAGACCGGATAGCAGGGAGATAAAGAAGCCACAGTTT
-CTATTCCCCCAGTTCACTTCCTGCAGAATAAAGCACAGTTGCCCAGCTGAGCCCAGCCCACATTACCAAACCCCAGAAAA
-ATTAGTGAGAATTAACAACTGCTGTACTAAACTACTCCATTTTTAGGAGTTTTTTTAAAATTCAGCATTATCTGACTGAT
-ACAAAATATGACACCTGCAAAGAATTTAAGACAACATAACTAACTTGAAATAGAGATCAATAGTTCTGAGACCCAGAAAT
-GGAAGTGAACTCAGACTGGGATTGAGTTTGCAGATTCACTTGACTCCACGTCCAGAAGCAAATGGAGACATCTGGGGCCC
-TGTGGGGTAGCAAAACTAAAAGTATCCCATGGGAAGTAAGAGATTCACTCTTCAAACTCATTGCTTGGAACTAGTAACAA
-GTTTGAGGTTCTCTCATGCATTAAAGGGGGCTGAAATAAGCTCTTAAAACCACCGTCTGAACTATAAAACTGGATAGCAG
-GGAAGCCGTAGAAAATAAAGTCTTTTATCCTGAACTTAGGCTTAACTGCTGACTTGGTAGCTGAATGTGCGAAAACCTCA
-ATTTCAGTGCATTTTGGGAGCCTTGAGCTACCAATATAAGACCTGGTTTTTGACTAAATGTTATTGAGAAATGGTGGAAG
-AAGAAATTAAATATAAATCTGCAAGACTGTGAGACATAAAATGGCGGAGAGAGAAAGAGACAGAGAGAGAGAGAGAGAGA
-GAAAGAGAGAGAGAGAGACCTCCATTCAATAATAAAATTCCAAAACACATAAGGAAGTAATGCTAAGAAAGACAGCAACA
-AAATAAACTAATAGAACTGAGTTCACTCCAGATGAAATGGAAATAATAAAATAGACTATTACCCACTAGTCTTCACTAAA
-ATAACTGCTGAAGAATGTATTTCAGGCAGAAGAAAACACCCTAAGAGATATAGAAGAATGGAGCGGAATGCAGAAACAAC
-AGTACAGAATTTCGTAAAATATGATGATAAATTTAATTAACTATTGACTCTTAAAAAGAATGGTATTTTTCACATCATGA
-GATAAAATTCAAATAACACCAAGAAAGACATAGATGGGAAAGATATTATGTGTGTAATAAAAGCATACTTAGTTATTGGG
-TTATTTGGGAGAACAGCAGAGATACTAAATCACTTAAATTCTGTTCAGAATTTTTTTTACTTAAAAATGTTAAAATGTTA
-AAACTATCAATCAAACAGGAAGAAAGAAAAGAGGTAAAATAAGCAAAAAAAAAGAGGATGGTAAACATAAAATATATAAT
-AACTAAGTCCAAATACAGCAGTAATCAAAATAAATGTAAAGGAACCAACTTACTTATAAGAGCAAGATTATCAGGCTAGG
-TATTTAAAAATCCAACCATATGTAGTTTATAATAAACACACTTAAAACATAATGGTCCACAAAGGTTGAAAATAAAGAAA
-TGGAAAAAAACAAGTAATTCAATCACTAACCAAAAGAAAGCTGATATGGCAATATGAATGTCAGATGGCACTGGATCTAG
-GCCAAAAAGCATAAAAAGAGACATTATGTAGTGATAAAAAGAACAGTCCTGGCCAGGCGCGGTGGCTCACGCCTGTAATC
-CTAGCACTTTGGGAGGACGAGAAGGGCAGATCACGAGGTCAGGAGATCAAGACCATCCTGGCTAACATGGTGAAACCCCG
-TCTCTACTAAAAATACAAAAAAGTAGCCTGGCGTAGTGGCGGGCACCTGTAATCCCAGCTACTCGGGAGGCTGAGACAGG
-AGAATGGCGTGAACCCGGGAGGCGGAGCCTGCAGTGAGCCGAGATAGCGCCCCTGCACTCCAGCCTGGATGACTGAACGA
-GACCGTCTCAAAAAAAAAAATAAAATAAAAACCAGTCCTGTATTTGAATGGCTAAGATTATGGCTTGAAATATAAAAGAA
-AAATGCTGACAAAATTACAAAACAAAATTGAAAAATCTACTATCTTGTCTGAGATTTTAAAACACATATCAAAAGCCAGC
-GGAGTCAGCAGAAAACACCAACTTGTATTAAAAAGCTGGAAAATAATAAACCCACTTTATAGATGTAGAAACTGGGGCCT
-AGGCAAGTTGAGTGATTCATGCAAGATCACAAAGTTTGTATGAATTCAAGCCAGGACTAAAACTCACACTTTCTAAATAG
-TAATCCTATGCCCTCTCCATTTTATAACATTAACACATGTAGAATAAACTGCGTATCTGCAGAAATGATTAGCCTTTTCT
-ATGTCCTTAAGAGAATCCTTAGTGTGGTAGCATATCTGTCAATGTTCCACTCGGTTTACCTTGAATTTCTTTTACTTTTT
-CAGTGTGCCTTTTCTTACCTCCTACATATTATGTTTCTAATTATCCATCTCTGTGATTCTCTATGGAGAACCACCCTTAG
-GCCACCGGGGTGTCTACTGTGAAACAGAAGTTCCTGGGATGTTATGCCCTCAATCACGGCCCTTATTCAATGACTGACCG
-GTGTGGGAAAATGGAAGCCCAGCTCCTTTGCCTTAGAGTTTGAACAAATCTAAGGTATAATTTTCACTCCGAAGCTCCCC
-CGTGGGATCAGGCTGAGGCTGAATCTCTGCTTGGCTTCTTCCCTTATCTTTCCTGCTTTTTACACCCAGTTCTACCTCGA
-AAATTTTCCTCAATAAATTGAGTTGCATGTGATTTCTCATCTCAAGGTCTGCTTCTGGGAACCCTTTCCTAAAATGAGGA
-CCATACAGCTCTGTACTAGGAGTAAAAAGAGAGTAGAAAGTGGTTCTACAGAAAACCAAATACAGCATGTTCTCATAAGT
-GGGAGCTAAATGATGAGAACACAGGGACACAAAGAGGGAAATAACAGACACTGGGGCCTATTGGAAGGTGGAGGGTGGGA
-GGAGGGAGAGGATCAGGAAAAATAACTAATGGGTACTAGGTTTAATACCTGGGTGATGAAGTAATCTATACAACAAACTT
-CTGTGACACAAGTTTACCTATATAACAAACCTACACAAGTAGCCCTGAACTTAAAAACAAACAAACAAACAGGATTATTC
-CATAAAAGTATGTTCTCTATTTAAAAAAATTTGAAGTAAATGAAAGTCACCCATAATCCCACTATTTGTAAGGCTATTTT
-GGTCATTTACCTAAGTATATATACTGTACAAGTAAAAGTGTGATAATGCCAAAAAAAAAAAAAAAAGTAGTTCTAGGGAA
-AGAATATTTGAGTGGTTAAGGTTTCCTGCTGCTTTTATCTTTGGGAAATTCCAGTTTGATTTGGGCACTAGGAACCTGGC
-ATAGTGAATGTAGTGTCTGCCAAGCTAGAAGAACACTGCTGCAACTTCAGACTTCAGGTCAATTACTATTGACTGGCCAA
-CTTTCTGTCCCGAGCATACCCTCTTGGGTCCAATTCCAGATTAATAATGGCCCAATTCCAAATCTGGAGGATTCCTGGCC
-TCTCTCTCTCTCTCTCTTTCAATGCAGTTGCTTACTTCCCTTAAGACTGGCTCTGAATATACAAGAAGGCAACTCCGGGA
-TTCTGGCCTTTAAGATGCAAGACCATGGGTAACCATACAAGCAACATCATGGGCTTTCCAGTTGGTTGAGCCATTATTTC
-AGCCTCTACTTTGTATCTCATAGCTTCACATTTCTTTGCTTTCCAAGTCTGGATTTAGAGGTGGGCCTTGTCTAGAAAGC
-CAGGTCTACCTTTTTTCAGGCAAAAAGTTTCATTAACCACTGTGGCTTAGAATAATATTTATGTAATAAAATATTTACTA
-GGTATTGAATGCATGCTATATGCCACTATACAGATGAAGAAATGGAAGTTTAGATCTGAAGATTAACTTGCCCAGATTTA
-TGTGGCCAGCTCTTGCCACAAACCAACCAAGGATTTAGTGAGTCAGACATGAGCCTGACTCTGCACGTATCCTACAAGTC
-ATAGCATTCCCTACCCTGGTTTTGCTGACCCCAGGCTCTAGCACTGGATTTATCCTTGGTTCTCTTACTGAGTGCTCTAG
-TACTTTCCTAGTTGAGCCCCTGACACCCATCCTCTGTCAACTCATTTTCCCCAGGAGCTGACACCTGCTCCTCAAAGTAT
-GTCTTCAACTTCTACCTGCCATTTTTCACAGAGACACATGGAGAATTTGCCCCAAATACACATCTCTAGGGACTTTCTGC
-TTCAATGCCCTGCCCTCCTCCTGCCAGACTGAACCATGGCAATGGGGCCTAAAATTCTCAATGCTATCTTAGGTTGGGTT
-CCCCAGAAGCAGAACCCAAGAAAGGGAAAATCAGGCACACATTGCTTCAGTCCTCTTGAGGAAAGACTCTCAAAAGAAGC
-ATCTAAAAGAAGAAAAGCAGACAGGACAACTAGGGTAAGAAGCCAAGCAAAGATGCGTGCTCAGGAAAAATCTAAACCTG
-GCCTGATATGAGAGAGGATCTGGAGCATAAATTACAACACTGACATGATGGTCCTCATCATTAAGACAAGGTGGTTCGCC
-TTTTGTACTCCTGTATCAGCCAGTCATTGCCATAGACTTCTCCTGATAAAACCATTTAGGGAGTGTAACTTTCTGGGCAT
-TAACTTAGGGTGATACTTGGGGAAGAGGACCTCTGTTAGCTTTTAGCAGTCAATACAGCAGCTGGAGGCTAGAGCCCCTG
-CTCATCCACCAGCATCTACTACAAGTGCCTGGGCCTTGGGCAATGAACGTGGGACTTCAGCAATCAGATCCCTTTTCTCA
-TCCCACCTTCCTGCTCCTGGCCTCCTCCTACTCCCCATCATCCTGTGTGGCTGGGGCCCCCCCATGCCATGTGCCTATCC
-ACAGGCTCCTGGATTTTAGTACCTGCTCAGAGTCCACTGCATTGGCGCCTGACACTTTATTAGTGTTCTAAAGCTTTGTT
-TACAGTTACCAGGACTCTCTAGATAGCAGCAAAAAGTCAACAAGGAAATAAAACTCCACCAGCTGGTGTATTTGTTGGGG
-ATAAACTCACCACACAGGAAACAGCTGGGTACATGCTCACAAACGTCAGTACCTTGCTGGTCCCAAAGGCTCATCTGAAG
-TTGCAAGTTTGAATCCCCCTTTCCAAGCTGGTCTGTTTATACGCACTCCTCCACACCTTCAGTTCCTTTACACCATGTGA
-GCCTCAGGAAGCTGAGGCAGTAATGAGCTTTGAAGCTGTTCTACTGCCTGTGACAGCCCACAGGCCAGTCATTTGATCCA
-ATTGCTTGATGCTACCTCCAGCAGCCTCTTGGCAAAATCTCTGCCATTATATACCATTGTTTCCTTACTCTAAAGCTCAC
-ATCTTCTCATGCTGAAGTCTATATGCTTCCTAGTGTATGAAAGTAACACTTTAATGTAGCCCTGAAGAAAACTGTCCAGC
-CCATCTGGACATCTGCCAGTCACTAGGAAGAGAATAGATTTTTCAGGCACAAATGTTAGCATACTAAGGAGTAGAAGGCT
-GAAGGCCATCTTCACTGACTTTATAGTCAGTGCGTTCTTTGTTCAGCAAAACTTAGCTCCTAGTCCTGAGCCAATTCCAA
-AATGCTGAATTTCATCCTTCCACTACTTTGAAAGCATTTAAGGTCTAATGAAAGGGATTAGGCCTGGAATTGGTGCCAGA
-AATTAAAATGAAGGCATAATTTGCATGTTTTGACAATACCTTCACACTTACACCCATGCCATGCTTTCTTAAACACTCTT
-GAAAATATGTGAGAATCAAGATTTCATAATCCACTTCTTCTGGAATGCCATGTAGAAACATTCTCATTTTGCTTTCTCCC
-TGCCTTCTGATTTTACTCACAGGCTTAATAATCACTGTAAGGATGGGGTAGCCATAAACAGCAGAGCATTGAGCTTTAGT
-GCACTCAGATGTTTGTGTATTTCCCCATTTACCTTGTATATAAAGCCATGCTAAGATTCGCAGTTAATGCTGGAGCTCAC
-CTTGAAAATAGCACCATCTTTCTCCTGAAGATGCTCAAACTCCAGGTAGTAACCTCAGGTTGTATCATAGCTCCTTCAGG
-GTACCTCACTGTTTTTAATAAGCACATGATAAAGATAATGTCTTCCTCGATTCTAGTGGTATTTCTTAACAAAAGCCTAA
-GCTGCACCAGGATGAGGTGTTGTAATATTTTCACAAGTGTTAAAAAGGATTACTGCTCTTCCTAATATTGGTCAATGTGC
-CCAGATGGAGACTATTGCTTTTGCGCATAACGTCTAAGCTTCTTTGCCAGCGCACAATTGTTTAAGAAACCACTTTTCTT
-GCTATGCCCTGATAATCTTGCCTCTTGAATAACTCATTTCCATCAAGAGCAGGACAGAATCAGAACAGCATGGACAAGGA
-TAATCTCTAAAATGTGGTTTCAAATGGAGAAGTATGATATGGTTTGTCAGAGGCCTGGAAGGTGCACATTGTTTAGTAGG
-TTGACCCAAAGCCATCCTCAAGAGGTAGGATGGGTTTTTTTGTGTGTGGTTTTTTTTTTTTTGGTTTGTTTGTTTTGTTT
-TGTTTTGTTTTGTCTTTTGAGACAGAGTCTCACTCTGTCACCAGGCTGGAGTGCAGTGGAGCAATCTCAGCTCACTGCAA
-CCTCCGCCTCCCGGGTTCAAGTGATTCTCCTGCCTTAGCCTCCCGAGTAGCTTGGACTACAGGCTCACGCCACCACATCC
-AGCTAATTTTTGTATTTTTAGTAGAGATGGGGTTTCACCATGTTGGCCAGGATGGTCTTGATCTCTTGACCTCATGATCC
-ACTCGCCTCGGCCTCCTAAAGTGCTGGGATTACAGGCATGAGCCATTGCACACGGCCTAGAAGTAGGATGGTTTTAAGAG
-CACTGCACTTTCTTTGACACTTCTACCCCTGAGAGTAGGGTCTATGTTCCCACCCCTTGAACCTGGGTGGGCTTTGTTAC
-TGCCTTGATCAATAACAAAGTGCAGCAGAAGTGACACTATAATTTCCAAGGCTGGGTCTGAAGAAAGTCATGTAGCTTTT
-TCCTTGTTCTCCTGGAACACATACTCTTTGTATCTTCAGCCTCCATGTAAGAAATTTTACTGTCCCGAGGCTGCCCTGCT
-GGACATACTAGGTGGAGAGACCACTAAGAGAGAGAGAGATGATCAACAAGCCTTAGCTATTCAGGCATCATACATGGGAG
-CGACAAAAGCTTCAAGATGGCACTAGCCCTAGCTACTGCTCAACTGTAATCACAGAGAACCCAAGGCCAGAAATGCCCAG
-AGGAGCCTAGTGGACCCCAGAACTGTGAGAGATACTAATAAATTGTTATTGATTTAAGCTACTGTGTTTTGAAGATGTTG
-GTTCCACTGCAATACATAATGGGAACAGGAGGTGCATTACACATAATATAATGTACAATTCAACCCAAAGGACTCTCCTA
-CCCACCACTGGATACATGTCTATGAGAGTTGGCACTGCTGTGGGTGCACAGAGCCAAGGCCATGCCTCACAAGACAGTAG
-AGTGGGTGGATGTCTGCATGCTATGATTTGAGAATGACTCAAAGTAATCTCCCTCAGGGGGCTGCTCAGGTCCCTGACCT
-CTTCCACAGTAATTGCCTTGAGAGGATATGCAATCTTGGAAACTTGCCAAATGTTAGAAATCCCCTTGTTCAGTGGGTTT
-CAAACTAAGAACACTCAGGTTTTGAGAAGGGATTCCAAGGAAGTACAGTGAAAGCAAGCCTTCTACAGACACAGTATTCT
-CTCTCTCTGGCCTCAGAGGGAGGATTTCTTCCCAGCCTCAGGGGTGGAACTGACCCAAGGTGCCCATCAGTGCAACACAT
-TCTTCTTGCCATTGTGATTGGTATAGGGCTGGACACGTAGTCCACATCAGGCCAATCAAAGTGAGTATCAGGACAGTCCC
-AGGGAGTTCTGGGAAAACAATGTTCTCCCTTTTTCACTAGATTGGAATTTAGAAGTATAGTACTTTGAGAGCTGCTAGCA
-ACCATAGGAAAAGTGGCAGAGAATCCTAGGAATGGAGTGGAAAGAGAGGAAGTAGATCTCAGAAGAGACAGAAAAAAAAA
-GTTGATCCTAACGGCTTTCAACCTGATATTCAGCTGTTCTTGAAGCAGATCTCCCCTGGACTATTTTGTTATGTGAGCTC
-ACAAATTTATTTTGTTTAGTGATTTAAGCAACTAGAATTTTAAAAATCAATGTGTACATATATGCTTAGCTTCTCTTGGA
-GTTTGTGTTTTAGCAGTAGAAGAAAATGATTTCTGCTGCTAAAAACATGTTTGGAAATAGCTGATCTTATCCTAGTGATC
-TAGTCCTTTTTGTTGTGCAAAAGGAAGTGCTAAAATCAGAATGAGAACCATGGTCACCTGACATAGACACAAGTGATGAT
-GATGATGATGATGATGATGATGATGATGATGATGATGATATCCATGTTCAAGTACTAATTCTGGGCAAGACACTGTTCTA
-AGTGCTATGAATATATTACCTCATTTAATCATCTCCAAAACATTATGAGATATTCTGTTACTATCACCATTTACAAATGA
-TGGGATTGAAGTACAGAGAGGATAAATAGCATCCTAAGATCACACAGCTAGTAAGTTGTGATGCTAGGATTGAACACAGC
-TGTTCTCTTAGCCATACCCTACACCCCTCTGACAAGGTAGAGTGCCTTCTCATTGGCCCCTAGGTTCTGGGCTCTCTTTC
-CACGATGCCTCTATTCTTAAAGCATGCAACCCAGAAGGTTCCTGTTAAATGTAAGTGAGAGAATTTCTATCACTGTGGAC
-CTGCTTCCATCATCTGGTTTGTGGTTTTATTCTAACCACAAAGTATATGACTTACTCATGTCTGCTTGGTTTTGACTCTT
-TACTAAGAGTAAGGGAATGCAGTGATCAAAGGGAAGGAAGATTTTTAACTTAAGTTGTCAGCTTGCTTCTGCTTCCAAAA
-AAGTTTCATGCTTAAAAATATGGCACCATGCTTTATTCTTCAAAAGAAGAAAAGTCAAATTGTAGCTGACTCCAACTCCT
-TGTTTTACTTAGGTGGAGGAAGATTCCATCTCAGTGAGTATGATTTGTTCCTGCCCACCCCTCAGCTCCCAAAATGGCCC
-AGGAAGTTGTATGCAGCATAGAATTTGATGTCACTGTTATTTGGTCAACTTGTATGATCATTGTTCAGATTTGTGTAGTC
-CCTGGAAAGAAGGTGCCTCTGACAGTTCTCTGTCATTTTGGGGTACAGGGCACCTTGTTATATGGCTGCTTCCCCGGGGC
-CTAGTGTCAAGCTTCTCTTCGTGGGTGTTATATATATATCCTATTCTAAGAAGATGCTAAGGTGTCAGATTGGAAGCCAC
-CATCCCTCTCTTTGTCTCCATTAATCTCCACCTCTCTGCCTTTGCTATTTCCGCCCATCCCTTCCTTTCAGTGAAGAACA
-CAGATCCCCTCACTGCTCTGCTCCATTCTTTATAGCTCTTTGCATATTGCATGGGTTTTGCCTAAATTAGAATGGACCTT
-AATAGAACTGTGGGGCTTTTAAACATTCAAGCATCACTTATTTTAATATCCCCCTAAATACCTTTTGAAAAATCTCTTAG
-AAGTCCAACCGATTTAAGGGTTAGTGTGCATTTTAATTGACCATTCAATTTCAAATAAATGTGGAGGAAATTACAACCCT
-CTTAACAGAGAAACGACAATTTAAGGAGAATGAGACCTTGATTGAAACAATTAGGAACTTAGAAACCAGACTCTGATGTG
-GTCAAAGAAAACAGCCCAGGAATTTATAAAGCCTGCCTTATTTTGCTTTGAAGAAAAACTTGAAAACCATAAAACAAGGT
-GAGATGTTATCCAAAATTTGGAAGCTAATTTAATAAACAGATTAATGCAGTTAGTTTTGTTTGGCATTGAGAAACATTGG
-TTAACCAAAATTTTATTACAAAAATAAAATAAAATAGTTAGTTCTCACCCAGCCTATGGACTTGAGGCTTAGAAGAAAGA
-CATTTTAATCTCCTGTCATCTATTAACATATTTTTTATCAAATCACATAATCAGATAAATTCTTTTTTTTTTCTTTTTGA
-GATGGAATTTCGCTCTGTCGCTAGGCTGGAGTGCAGTGGCATGATCTCAACTCACTGCAACCTCCCCCTCCTGGGTTCAA
-GTGATTCCCCTGCCTCAGCCTCCCAAATAGCTGGGATTACAGGCACACACTACTACGCCCAGCTAATTTTTGTATTTTAG
-TAGAGACGGGGTCTCACCATGTTGGCCAAGATGGTCTCGATCTCCTGACCTCATGACCTACCTGCCTTGGCCTCCCAAAG
-TGCTTGGATTACAGGCATGAGCCACCGCACCTGGCCTCAGACAAATTCTTGATCAGATGGGCTCCCTAAGAACACTCTTT
-TCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTTTTCACATTTTTTTCCCGTAGGTTATT
-GGGGTACAGGTGGTATTTGGTTACATGAGTAAGTTCTTTAGTGGTTATTTGTGAGCTCCTGGTGCACCCATCACCTGAGC
-AGTATACACTGAACCCTGTTTGTAGCCTTTTATCCCTCATCCCCCTCCCACCCTTCTGCTAAAGTCTCCAAAGTCCATTG
-TATCATTCTTTACTTCGATTTTTTGTTTGCTTGCTTTGAGACAGAGTCTCACTCTGTCGTCCACGCTGGAGTGCAGTGGT
-GCAATCTCAGCTCACTGCAACCTCTGCCTTCCAGGTTCAAATGATTCTCCTGCCTCAGCCTCCTGAGTAGCTGGGACTAC
-AGGCATGTGCCACCACTCCGGGCTAATTTTTGTGTTTTCAGTAGATACAGGGTTTTTACCACGTTGGCCAGGCTGGTCTT
-GAACTCCTGACCTCAGCTGATCCACCTGCCTCAGCCTCCCAAAATGCTGGGATTACAGGCATGAGCCACTGTACCTGGCC
-CATTGTATCATTCTTATGCTTTTGCATCCTCATAGTTTAGCTCCCACATCTCAGTGAGAACATAGCAATGTTTGGTTTTC
-TATTCCTGAGTTACTTCACTTAGAATAATAGTCTCCAGTCTCATCCAGGTTGCTGCAAATGCCATTAATTCATTCCTTTT
-TATGGCTGAGTGGTATTCCATTATATATATATATAAAAAACTGGGTATTTGTGTGTGTGTATATATATTATATATATAAT
-ATATATAATATATATGTAATATATATAATATATATATTAAATATATATAATATGTATAATTTATATGTAATATATATAAT
-ATATATATTAAATATATATAATATATATAATTTATATGTAATATATATAATATATAATATATATAATATATTATATATAA
-TGTGTATATATATATAATATATATAATATTATATATATTATATATAATGTTTTATATATATATAATATATATAATATATA
-TATAATATATATAATATATAATGTGTGTATATATAATATAATATATAATATATAATGTGTATATATAATATATATTATAT
-ATATAATGTGTATATATAATATATATATTATATATAATGTGTATATATAATATATATTATATATAATGTGTATATATAAT
-ATATATTATATATAATGTGTGTATATATAATATATATTATATATAATGTGTATATATATAATATATATATTATATATATA
-ATGTGTATATATATATATATTATATATATAATGTGTATATATATATATATAATATATATATATATACACTGAGATTTTTT
-GTTTTGTTTTGTTTTTTGAGATGAAGTTTCACTCTTGTTCCCCAGGCTGGAGTGCAATGGTGTGATCTCGGCTCACTGCA
-ACCTCCCCCACCGGGTTCAAGTGATTCTCCTGCCTCAGCCTCCCGAGTAGCTGGGATTACAGGTGTCTGCCACCACACCC
-GGCTAATTTTTGTATTTTTAGTAAAGACGAGGTTTCACCATGTTGGCCAGGCTGGTCTCGAACTCCTGATCTTCCGGTGA
-TCTGACTGCCTCGGCTTCCCAAAGTGCTGAGATTACAGGCGTGAGCCACCACACCCAGCCTGGTTTTTTTGTTTTGTTTG
-TTTGTTTGTTTTTTGTTTTTGGGGGATGAAATTTCACTCTTGTTGCCCAGGATGGAGTGCAATGGTGAGAGCTCAGCTCA
-CTGCAACCTCCGCCTCCTGGATTCAAGCAATTCTTCTTTCTCAGTCTCCCGAGTAGCTGGGATTACAGGCACCTGCCACG
-ACACCTGGCTAATTTTTTATATTTTAAGTAGAGATGGGGTTTCATCATTTTGGCCAGGCTGATCTTGAACTCCTAACCTT
-CAGGTGATCCACCCACCTCGGCCTCCCAAAGTGCTGGGATTACAGGCATGAACCATGGCACCCAGCCTATACCAGCTTTT
-TATCCGCTCGTTGATTGATGGGCATTTGGGTTGAGAACACCCTTTTCTATCCGTCCATTTCATTTATTTCCCATTTCAAA
-AATTACTCCATAAACGTGATCATCCCCATAAACACAGGATAAACACTTGACAAAATTCAGTGCCTTTTCATGATAACAAA
-TAGTAAAGAAGGAAATTTTCTTAACTAATAAAAGTCAATACACAAAATTCACAGGTAACATCATACTACACAAAATTGAA
-AAGATTCCCCACTAAACCACGAACAAGACAAGGAGGGCCACTCTTACCATTTCTATTAAACATTATACTGGAGCTCCTAG
-CTGGGGAATTAAGCAAAAAGAAGTAAGAAAAAATGGAAATAAGTAAATGACATCCAGATTGGGAAGGAAGAAATAAAATC
-ATGTCTATTTGCAGATGGCATGATCTTCTATGTAGAAAATCCTAAAAAATCCATGCATACACACAAAAAGCTATTATAAC
-TAATAAATGAATTCAGCAAGACTACAGGATAAAACATCAAAAATCAAAAATCAATTCTCCTTTTGTACACTAGCAATGAA
-CAACCCAAAAATGGAATTAAGAAAGACATTTACTTTATAATAACACCAAAAAGAATAAAATACTTAGGAAAAAATGTAAG
-CAAAGAAGTGTGTGGTCATTTATTTTTTATGTCCTCTGGACTAGGCCTTGGGCTACCCAGACATTTGTTCAAGCATTATT
-CTAGGCATGTCTAGGCATGTTTGTGAGAGTGTCTCTGGAGGAAATCAACATTTGAACCAGTAGGCAGAGTAAAGCAGATT
-GCTCTCCCTAACGTGTGTTGGTTTCAACGCATCAACTGAAGACCTCAACAGAACAAAAAAGCTGAGTAAAAGGAAATTCC
-TGCCTGACTACTTGAGCTCGTCTTTTCTGGCTTTTGGACTCAAACTGAAACATCAGCTCTCCTGGGTTCTCCAGCTTGCT
-GACTGAAAATCTTGGAACTTCTCAGCCTCCATAATTCCATGAGCGAATTCCTTATAATCGATTATTCTTTCTTACATAGG
-TACATATGGGGTGTGTATATATATAAATATATGTATATATATACACACATATATGTATACTTCTAGTTCTCTTTCTCTGG
-AGAACTCTAATGCAAGATTATAAAAAAAATTACTGAAAGAATTCTTAAAATACATACATAAATTGAAAGTCATTTTATGT
-TCATGGATTGGAAGACAATATTGTTAAGCTAGCAACACTCCCTACATTAATTTACAGATTAAACCCAAGTCTTATCAAAA
-TCTCAACTGCCTTGCTTACAGAATTTGACAAACCTATCCTCAAATTCACATGGAAATGTAGTAAACTCAGAATAGCCAAA
-ATAGTCCTGAAAAAGAGGAATAAAGTTGGAAGACTTACACTCCCTGATTTCAAAACTTACTACGTAGCTACAGGAATCAT
-CCTGAATACTTTGTACTGGCATAAGGATAGTTATATAGATCTATAGAACAAAATTGAGAGTCTAGAAATAAACCCTTACA
-TTTATAATCAATTGATTTTGGACAAAGATGTCAACAAAATTCAGTGAGGAAAGAATAGTCTGGTGCTGGGGTGACTGGAT
-ATCCTCATGCAAAAGAATAAAGTTGGACCCTACCTCATATCATATACAAAAATTAACTCAAAATGTAGGAGAGATCTGAA
-TGTAAGAACTAAAATATAAAAATCTTAGCAGAAAACCTAGGTATAAATATTCGTGATCTCATATTAAGTGATACTTTCAT
-ATGTATGACACCAAAAGCACAAATCAAAAACTTTTGTGTGTCAGAGAACATCATGAAATAAGTGAAAATAAAAAAACCAC
-AGAATGGGAGAAAATACTTGCAAGCCATATATCTGATAAAACACTTGCCGTATAAAGAACTCTTCAAAGTCAACAAGAAA
-ATGACAAACAACTCAATTAACAAATGGGGAAATGATCTGAATGAACATTTTTCCAAAGAAGATATTCAGATGGCTAATAA
-GCACATGTAAATATCTTCAACATCATTAGCCACTATGCAATTATAAATTAAAATTACAATGATATATCACTTTGTATCCC
-TTAGGATGATTAAAATAAAAGACAGACAGTAACAAACATTGGCAAGGGTAGAGAATTGGAACCCTCATATATTGCTGATG
-GTATTGTAAAATGGTGTAGCCATTTCTGAGTAACAGTCTGGCAGTTCTTTAAAAGTTAAAAATAGAGTTACTGTTTGTGT
-GTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTATTTGAGACAGGGTCTCACTCTGTTGCCCAGGCTGGAGTGCAGT
-GGCGCGATCTCAGCCCACTGCAATCTCCACCTCCCAGGTTCAAGCAATTCTCCCACCTCAGCCTTAGAATTACTGTTTGA
-CTCAGCAATTCCACATCTAGGTAATAATCACCAAAAAAGTAGAAACAACCCCAATGTCCATCAACTGATTAACAGATACA
-CAAAATGTGGTATACTCCATACGGATTATCATTTGGCCATAAAAAGGAATGAAGTACTGGCTTATACATTCTAAACATGA
-ATGAACCTTGAAAACATTTTGCTAAGTGAAAGAAGCCCATCACAAAAGACCTTATATTTTATGATTCATTTATATGCAAT
-ATCCAGAATAGGCAACATCATAGAGACAGCAAGTAGATTAGTGGTTGCCAGGCAATCGGAGGGGAGAGAAGGGAGATAGC
-AAATGACTGTTAGTGGGTACGGAGTTTCTTTTGGGGGTAATGAAAATGTTCGGGAATTAGTGGTGATGGTTGCACAACTC
-TGTGACTGTACTAAACAGTATTGAATTACACACCTTAATATATTTTATAATATATGAAGTACATCTTGATAAAGCTGTTC
-CAAACACTTTATATAATATATGCTAAATATATATTATATAACAATATAATCAATATAATATATATCTCATATTTATTATT
-GTGTATTATATATTGTATAAATGTATATATAACTATATAGTATAAAATTATAACAATTGGACATGTTATAATTGTTATGA
-GCCCTATATATATCTCCTGTTGCAGCTTAAAAGCTGGAAGTCCCTGAATTCATTTGAAACCTAAAATAATTTCCTTCTTA
-CTTAAATATGCTGCCTTAACATCCTTTAAAGGTCTGAGAATTAAAACAAAACAATACCTATCAAAAACTTCCTTGTGACT
-AGTTTATCCCTAAGTCAAGTTGTTTTCTATTTATTTGTTTTCTTTTGGTTTGGATCAGATTGGTTTGTACATTATGTGGT
-TAAGAGCGTCTGCTGGGCTTCTAGTACTGGCCATCACCACTAGTAGCTATGATACAGGGAAAGTTATGTCCCTCTCTTTG
-CCCAGGTTACCCATCTGTAAAATGGGAAAATTTTTGAGGCCATCACTAAATATCAGTAGACTAAAGGACTAAATGACCTC
-TTAAAAATTCAGGGTTCAAGACAACCTATAGAATGGGAGAAAAATTTTGCAATCTATCCACCTGACAAACACCTAATATC
-CAGAATCTACAAGGAATTTAAACAAATTTACAAGAAAAACACAAATAACTGCATTAAAAAGTGGGCAAAGGACATTAACA
-GACACTTCTTTGAAGAAGGCATTTATGTGGCCAACAAACATGAAAAAACGTTCAACATCACTTATCGTTAGAGAAATACA
-AATCAAAACCACAATGAGATACCATCTCATGCCAGTCAGAATGGCGATTATTAAAAAGTCAAGAAACAACAGATGCTGGC
-AAAGTTGCTGAGAAAAAGAAATGCTTTTACACTGTTGGTGGGAATGTAAATTAGTTCAACCATTGTAGAAGACAGTATGG
-TGATTCCTCAAAGACCTAGTACCAGAAATACCATTTGACCGAGCAATCCCATTGCTGGGTATACATCCAAAGGAATATGA
-ATCATTCTATTATAAAGATACATGCCCACGTATGTTTACTGCAGCACCATTCACAATAGCAAAGACAGGGAATCAACCCA
-AATGCCCATCAATGACAGATGGGATAAAGAAAATGTGGTACATATACACCATGGAATACTATGCAGCCACAAAAAGAAAT
-GAGATCATGTCCTTTGCAGGGACATGGATGCATTTGGAAGCCATTATCCTCAGCAAACTAACACAGGAACAGAAAACCAA
-ATATCGCATGTTCTCACTTATAAGTGGGAGCTGAACAATGAGAGCACATGAATACAGGGAGGGGAACAACACACACTGGG
-GCCTGTCAGGGGGCCGGGAGAAGGGAGATTATCAGGATAAATAGCTAATGCATGCAGGGCTTAATACAGAGGTAATAGGT
-TGATAAGCACAGCAAACCACCATGGCACACATTTACACATGTAACTGTATTAGTCTGTTTTCATGCTGTTGATAAAGACA
-TACCCAAGATGGGGCAATTTATAAAAGAAAGAGGTTTATTGGAATTATAGTTCCACATGGCTGGGGAGGTCCCACAATCA
-TAGTCGAAGGCAAGGAGGAGCAAGTCACACCTTACGTGGATGGCAACAGGGAAAAAGAGAGCTTGTGCAGGGAAACTCCT
-GTTTTTAAAACCATCAGACCTCATGAGACCCATTCACTATCACAAGAAAAGCATGGGAAAGACCCGCCCCCATAATTCAA
-TCATCTCCCACTGGGTCCCTCCCACAACATGTGGGAATTATGGGAGCTACAAGATAAGATTTGGGTTGGGACACAGAGCC
-AAACCATATCATTCTGCCCCTGGCCCCTCCCAAATCTCATGTTCTCACATTTCAAAACCAGTCATGCCTTCCCAACAGTC
-CCCCAAAGTCTTAACTCATTTCAGCATTAACTCAAAAGTTCACAGTCCAAAGTCTCATCCGAGACAAGGTAAGTCCCTTC
-TGCCTATGAGCCTGTAAAACCAAAAGCAAGCTAGTTACTTCCTAGATACAATGGGGGTACAGGCATTGGGTAAATACAGC
-CATTTCCAATGGAAGAAATTGGTCAAAACAAAGGAGCCACAGTCCCCATGCAAGTTCAAAATCCAGCAGAGCAGTCAATG
-TTAAAGCTCCAAATGATCTCCTTTGACTCCATGTCTCACATCCAGGTCATGCTGATGCAAGAAGTGGGCTTCCATGGTCT
-TGGGCAGCTCCACTCCTTTAGCTTCGCAGGATAGAGGCTCCCTCCCAGCTGCCTTCACAGGCTGGCATTGAGTGTCTGCA
-GCTTTTCCAGGTGCACAGTGCAAGCTGTCGGTGGATCTACCATTCCAGGGTCTGTAGGATGGTGGCCCTTTTCTCACAGC
-TCCACTAGGCAGAGCCCCCATAAGGACTCTATGTTGGGGATCTGACCCCACATTTCCCTTCTGCATTTCCCTAGCAGAGG
-TTCTCCATGAGGGCACTGCCCCTGCAGCAAACTTCTGCCTGGGCATCCAGGCATTTCCATACATCCTCTGAAATCCAGGC
-AGAGGTTCCCAAACCCCAATTCTTGACTTCTGTGCACTTGCAGGCTCAATACCACATGGAAGCTCCCAAGGCTTGGGGCT
-TGCACCCTCTGAAACCACAGCCCAACCTCTACATTGGCTCCTTTCAGCCATGGCTGGAGCAAACGGAATGCAGGGCACCA
-AGTCCCTAGGCTGGACACAGCATGGGGACCCTGGGCCGGGCCCACAAAACCACTTATTCCTCCTAGGCCTCTGGGCTTGT
-GATGGGAGGGGCTGCCATGAAGCCCTCTGACATGCCCTGTAGACATTTTCCCCATTGTCTTGGGGATTAACATTAGGCTC
-CTCATTACTTATGCAAATTTCTGCAGCAGGATTGAATTTCTTCTCAGAAAATGGGATTTTCTTTTCTAATGCATTGTCAG
-GCTGCAATTTTTCCAAACTTTTATGGTCTGTTTCCCTTTTAAAACTGAATTCCTTTCACAGCACCCAAGTCACCTCTCAA
-ATACTTTGCTGCTTAGAAATTTCTTCTACCAGATACCCTAAATCATCTCTCTCAACCTCAAATTTCCACAAATCTCTAGG
-GCAGGGGCAAAATGACACCAGTCTCTTTGCTAAAACATAACCAGACTCACCTTTGCTCCAGTTTCCAACAAATTCCTCAT
-TTCCATCTGAGACCACTTCAGCCTGGACTTTATTGTCCATATTGCTATTAGCATTTTGGGCAAAGCCATTCAACAAGTCT
-CTAGGAAATTCCGAACTTTCCCAGATTTTCCTGTCTTCTTCTGAGCTCTCCAAACTGTTCCAACCTCTGCCTATTACCCA
-GTTCCAAAGTTGCTTCCACATTTTCAGGTATCTTTTCAGTAGCACCCCACTCCTGGTACCAATTTATTGTATTAGTCCAT
-TTTCATGTCGCTGATAAAGATATACCTGAGACTGGGTAATTTATAAAGGAAAGAGGTTTATTGGACTTACATTTCCACAT
-GGTGGGGAGGCCTCGCAATCATGATGGAAGGCAAGTAGGAGCAAGTTACATCTTACATGGATGGCAGCAGGCAAAAAAGA
-GAGCTTGTGCAGGGAAACTCCTGTTTTTAAAACCATGAGATCTTGTAAGACCCATTCACAATTGTGAGAACAGCACAAGA
-AAGACCCACCCCCATGATTTGATCATCTCCTGTCGGGTCCCTCACACAACACATGGAAATTATGGGAGCTACAAGATGAG
-ATTTGGATTGGGACACAGAGCCAAACCATATTAGCAACAAAGCTGCATGCCCTGCACATGTATCCTGGAACTTAAAATAA
-AATATAATACAATTTTTAAAATGAAAAATGAAAAAAATTTTTTAATTCAAGATTCAGTCATTAAAACAGGGACATATGCC
-CAATAAATGTATCATCATTATTTTAATACTTAGCACTCTGTTCTGTGGATTCTTAAAAGTAGCTTATATTTTAAACCACT
-TAGGCCTTATAACTGGGGGAAGATTCCGTCTTATCCCAAATTGGGAGAATGCAGGAAGCATGAAGGACAAAGGGTCAATG
-GAGTTACAACCTGTAGACAGCCTGAAAAACCAAATTTGGGGCATCCCTTTGTGCTGCTCTACAAATAGCCTTCATTTGCT
-TTTCCTATCTGGCTTCAAGATTAATTGCTAAACTTGGAAGGAGGACCTTGAAGTTTGCTCGTAAATTTTCTGTGTTTAAA
-AAGAAGAGTTTTATCATTAATATTCTGGAGTGAGCATGAGTCAGGGAGAGTGACTCAGGCCATGTTCTCAGAGGTGGCTG
-GCTATAAATCCACTTTTGCAGAATATTAATCTCCCCTGGCTCCTTTGAAAAGTTAGCAATTATTAGTAGATGGTGTGAAA
-GAGAGTCTTTAAAAGAGGAATGGTAAGACAATGTCACCTTGAGTTTCTTCCAAACTCATTGCTATTAGAGAAGAGAAAAG
-CTGTTCCCTCAAACAAACTTTGGAGAGGAGTTGTCCTGGCAGGCACAGGCAGCAAAAGCAAGTCACAACTCCACTAGACG
-GAGCCCCCACAGGGACTCTGTGGTGGGGGTCTGACCCCACATTTTCCTTCTGCACTGCCCTAGCAGAGGTTCTCCATGAG
-GGCGCTGCCCCTGCAACAAACTTCTGCCTGGGCATTTAGATGCCTAAAACTTACCGCATATGTGTACTGGGTCCCAAAAA
-AAACCCTAGTACCTTCAAGGAAAGATAAGGTTTCATGAAGCAATTTGACTCAATAATTAATTGTTCCTACCCGGTGATGG
-AATACCTAGGTTGCCTTGAAAATATTAAGCCAATCATTTGGAGAGTTTGAATCTCTTGAATGTAATAGTTAAAGGTAGAT
-AATATTTATGTCTTTGGGCAAGTGTAAACAGGGTCACAGAATTAGGGGATTCAAGAAATGGACATTGAAGTATCACCACC
-CATTCAAAGCCCTTGCCTGAGGAAGGGATACATTGAAACCACAACATACTGGTTTTTTTTTTTTCCTTTCCTGTATATTT
-ATATTAGTTGGCTCTTAAAATGTGGTGCCCAGAAGGCAGCATGGGCATCACCAGGGAACTTGTTAAAAATGCAAATTATC
-AGGCCCCTCCCCAGACTTACTGAATCAGAATCTCTGAGGTTGGGACTCAGAAACCTGTATTTTAACAACCCATCCAGATG
-ATTCTGCTGCTTGCAGAATTACTGCTCTAACTACAGCCAGTAACAGAGCTACTTTTAAAAAGCAAGTGATTATAACAGTT
-GGGACTATTGTAGGCCGAAAAAAGAAAAAGAAAGAAAGAAACTGGACTACAGTGGTCTAACTAAATAAGGGTTTATTTTT
-TTGTCACAAGAAGAATGGAGTTCAGCTACCCTGGGCTGATTCTGCAAAACCAGAATGTCATCGTTGTCCCAGGCTCCTTC
-TACCTTGGTAAGTGGCCTTTTCCCTCAGGTTCAACACTTCAAGGCCATAAGACAGCTGCTTCACCTCTGCCATGTTCAAG
-GCAGGAAGAAGAATGAGAAGTGCAAAAGGTAAAAGGTACATGCCAGCTGGGTCTCTCCACTTCTAAAAGGCTGCCTGGAA
-GCTTCAGCAAGTGACCACCACTCATGTGGCATAACATACAAAAACATTAATCAAATATTTCATCATCAGGGCTGGAAGGG
-ACAATAGGAAAGTACAAAGAGTTTAAAAAGAGTGGTTAAGGCCAGGCATGGTGGCTCATGCCTGTAATCCCAGCTCTTTG
-GGAGGCCGAGGCAGGCAGATCACTTGAGCTCAGGAGTTCGAGACCAGCCTGGGCAATGTGACGAGACCCCATCTCTACAA
-AATACACAAAAAGTTAGCTGGGCATGGTGGTACATGCCTGTATTCCCAGCTACTCAGTGGGGCTGAGGTAGGAGGATCAC
-TTGAGCATGGGAGGTGGAGGTTGAAGTGAGCTGAGATCACGCCACTGCACTCCAGCCTAGGCAACAGAGTAAGACCCTGT
-CTCCTAAAAGTAAAAAATAAAAGTAAAAAGAGTGGTTAGCAATTGTATTGCATAAGGTCTAATTTTGGTAAAGTGTGCTT
-GATTTTATTTTGGAAATTATTCTTCTTAAGATTGAAAATGCAACATTTGCCATTGTATTTACACCTTTCTTTATTATTTC
-TTCATCACTGGATGATTTTTACTCTTGATAAAAGTTTGGAAGTTGAATTGCTAGCACCAACTGTAATATCGGTGTGTAAT
-GCTGGGCCACTGTAGTTGAGGAAGATGGCTCATGTTGTCTTTTCTTGACTGACTTCATTCCACTTAATTATGGAATTTTG
-TTCATATCTTAGTGTTACTTCCTGGCCAGAAATTTTTATTTTGCAAACAAGTCCAAACAGTAAAATCTTTATTACAGAGA
-AATACTCTTAAGTCCATTTACTTTGATATATACATCTTTCATCAGCTACGTTTTTCTTCTTGGCAGCTAAGGTTTACATT
-TAATCAAGAAAATGTCCTTCTTGCACTTAGAGTAGGCACCCTCCTACCCAGCTCTGCCTCTAGTCCCAAAAAAGCCATCT
-GATGCTCACTACTGCCTGTCAAACATCCTAATGGATTATTGCTCCTCTCCATCAACCCCCATCTGAGGACCTAGCCAGCA
-GAATGCTAAAACACCCAATCCACACAGGCAAAATAAAATGATGGGGGGAGCAAAATCTGGAAACTTGGTACTCAGAGTAG
-GGTCTTCCCTCCAGGAGCATCAGCATTTCCTGGACCCTTGTTGGCAATGCAGACTCCCAGTCATCCTAAATCTGCTAAAT
-CAGAACCCACATTTTAAAAAGACCTCCAGTGGTGGTTGTGCATCTTAGTTTGAAAAGCACTGGCCTAAAGCAGTGGTTCT
-TGAAATATTGCTCTAGACATGCAGCATAATCATCTTCTGGGAAACTGTGAGAAATGCAAAATCTCAGTCCCATCCCAGCC
-CTGTTGAATTTGACACTTTAGGGGTGGAGCCCAGTAATCTGTGTTTTATCAAGCCTTCCAGGTGATTCTGACATAAGCCA
-AAATCTGAGAACTTCCCCTATAACAATGGTAGTCAACCTTACTTATACAAAGAAATCACCTAGGGTATTTAAACATTACA
-GCTGTCTCCTATCTTAAATATTTCTGCTCACAGGAGGAGTGTTTTAGGTCAAATTTCCCAGAAGAGCACCAGGAAAGACC
-ACATCTATGTCTAGCCCCACTCTTCTTCCTCCTCTGTCACATAACACTTAACAAGAATCCACATTTCAGACTGTTCCTTA
-TGAGCTCTCCCACACTGCCACACATTTGTTTCACCAGGCAAGATGAAAACAGCCTGCTGAGCCCCAAAGGAATAAAGCAT
-GGAAGACGACTGGAGAACACATTTGACCGCTTTGTAGGGTCAGTATCAGGGGCTGCAGCCTAGGAGGCCTGGATAAATGC
-TGCTTTCTACATAGACAGGTTGTGGAGGGGAAAAGACCTGATTCTCAACACCATTGTCTTGGCGCCCCTGCCACAGGTAG
-TAGATTAATTACAGAAAAATAAATAGTCCTGATTTCCCATTCCTCCTTGTATGCACACTCTTTGCAATGTGATTTTGTGA
-TTCTTCCAATCCAGAAATAGACTCTGTTTCCCTACCAGTTGAATCTGCTCTATGACTTGAATTCGCCATAGAATGTGGTG
-GAAAGGATGGTTTGCCAGTTCCAAGCCTGGCCTCCGCAGGCTTGAACACTCTCCTCTTCCTCTCCGACCCTTAGCCAGCA
-CCAAGTGATGATACCCAGACAAACTAGCGTGAGAGACTTGTGCCCCAGTCATGCCATCCCCCCCAAAACAGCCAGCTGAC
-CACCATACATGTGGGCAAGACCATCCTGGAGCAGCACTCCTCTAGTTGACCAATGACTCCCATATGAGCCCAGCTGAGAA
-CAACAGAGAAGGGCCCAGGGCAAAAGGGTCACACACTGACCTGTAACCTTGAGAACTAATAATGGCTGCTATTTGAAGAC
-ACTGACTTTTGGGGTGCCTTGTTAGGCAGAATTATTGTGACAACAGTTCAATAATACCTCACAACTTTCAGACCTTTCCT
-GGAGAGACCCAAATATGGGACAGAAACATTAAACTACAAACTACAGACAGCTCTGCACACCTGACTCTGGGTGTGAGGAA
-ATGGACCACGGAGAAGGCAGAGGCATTGGTGGTCAGGGAACACAGCACTCGAGACAGAGCAGGCTTAGAGCTCAGAGGGG
-CTCGTGAGCTGCGAACAGCACAGCCTGCAGCCTTCTGTGAAGTCACACGGGGAGGAAGTGATGAGAAGGCAGGTTCTATT
-TCTGTTATGTGATCTAGAAAAAGTACCTGGGAAGCCAGCAGGGAGCCAATCAGGGAAGTTGACTGATGGGGCCAACATGG
-GCTTCCGTTTTTATGAAAGATGTGGAAGAGAAAGAGAGAAGGGCCCAGAAGTGTGAGATTTGGGGGTAAAATTAGAACTA
-GGTTTTTTTTGTAGCTTTAAATTTTTTCTTTATTGAGGTATAACAAAAATACAGTAAATTGGCTGGGTGCAGTGGCTCAC
-GCCTGTAATCCCAACACTTTGGAAGGCCAAGGTGAGAGGATCACTTGAGCCCAGGAGTTCAAGGCGAACCTGGGCAATGT
-AGGGAGACCCTGTCTCTACAAAAAATTTTAAAATTAGCTGGACATGCATACGCCTGTGGACCCAGCTACTCAGGAGGCTG
-AGGTGGGAGGATCCCTTGAGCCCAGGAGTTCGAGGCTGCAGTGAGCTGTGATCATGCCACTGCACTCTAACCTGGACAAC
-AGAGTGAGACCCTGTCTCAAAAAAGCAAAACTAAAAAAAGCAAAACAAATGCAAACGCAGAACAGTACATTGCACAGATC
-TTAAGAGTCAAGCCTGGTGAATTGGTGGTGTAAGCTCCCAGATCAACACGAAAGGCTTTGTAGCACCCGGAAGTCTCCCT
-TGTGCCCGTTCTTGGTCAACTCTTCTTCTTCAGAGGCAACCCCTCTTCTAACTTCTACCACTGCAAACTAGTTTTGCCTG
-TTTTTGAACTTCATATAAATGAAATCATGCAGTATGTGCCCTCAACTCTGTTTTTTTTTTCTGCTCATCATTTTGCCTAT
-AGAATTCTTACATGGAGGTGCATGTTATAGTAAGATGTTCTTTTTTATCATTCTGTAATATTCCATTTTATGAATATACT
-ACAATTTATTCTGGTCTACTGTTATTAGACATTTTGACTTTATGAATAGGGCTGTTATGAACATTCTTGTACATGTCTTT
-TGGTGCACACATGTTCTCTTTCTCTTGCTAAACCTGTGGCTTTTAATCAATCCCTCCTTTGTTCATCAACTGGTTTGAGT
-AATGACCCGACACCCTTGGTCCCCCTTTCCCAGGCTCAGTAAGAATCTGCCCCTGAATTCAAAGCCCACTCTAGGAGGGA
-GGGCAAGAGGAGGAAAAGGGAGAGAAAGAAGAAGGTAGCTCCAGTGACTACAGAAATGATATCAGTTCTTCCTAACTTCA
-CGTTTTGTCTCTAGTGGCTATCTGAAGTGCCTAAAATGACATTCATTGGAAGTAAAGACGTGAAGATTCCTTTAGAGATA
-CAAATATGCCTTTTAGAAGGGTAAATACATAAAAGAATTTAAATGTTACCTTTGCTGGTCCTTCACAATGTTCAGATTAT
-CCTTTATTTATTAGCTCCCCCACTACCCAGAGTGGCCTCCCCACTACTTGCATCCATTACCTAGGAGTTTGTAAGAAATG
-CAGAATCTCGGGCCCCACCCCAGACCTGGAATCAGGATCTGCATTTTTAAAAGATCCCCAAGTAATTCCCGGGCATGTTA
-AAGTTTGTGAAGCCGTGTATTATCCCACTGATACTTTATACAAAACTCTATAAACAGAGAGAGGAGGAATAATTGTTCTC
-ATTTTACAGATAGGGAAATATGACGCGGAAAGGTGAATTTGATGTGCCAAGGGCACCTTGCTGGTTCTCTGCCAGGGGAA
-GGTCTCTAGGTGGAGGCTCTGTTGATTTTCTGAACACAGATATTTCCATTATTTCACACTGATACCCACTGGCACTCCTA
-ACGCTTTATCAGGCCAACCAGCCTGCCTCTCTCTAGAGAGCAGTGTCCTAAGGGCATGCACTGTGTAACTTTGTTTGAAA
-GTTGGCATGAGGAGCCACCAAGGACATAAATGTTGCAGTGTGGTAAGTGGGAGTAAAAGGGGCAGGGTAGAGGAAGGGAA
-AAGGAATGAGGAACCCCAGCCACCACGTGAAATGGCCCAGAGGGGCTTGGGAAAGAGGAATGAAGGGGCTCCAGAGACGC
-ATTTCAAGTTCCTGGCCTTGCTGTCTGCTCCTCCCTTGCCTGCAGACAGGAGGTCTGTGCTGTGACGCAGTCTGTTAGAG
-CCTGTTGGCAGCCAGCCTGGAGTTGGCCTGCACCCCCACTGCAGAGCTCTCAGCTACGCAGGGAGAGTGGAGGCTGCCCA
-GTGCACCTTTGCTGGGTACTGCAGAGCATCCATGCCACCTGCACCAGAGGGAACACAGCTCTGCAGTAATGCCAGTTAGA
-CTGCAGTAACCCGAGATGGGTGTAGCTCATACTGCAGTAACCCGAGATGGGTGTAGCTCCATGCCCTTGCACACCTGCAG
-GGTCCGAGGACCCTGGGTTTTTACCATCTGTTTCTGCACCCCCCTCCAGGAAGCAGCTCCAGGTTGCAGAGTTGCTCTGC
-CTACCCTGAAGATGTCTGGAGGCTCCCCATTGACCCTGAGCCCCACGACGGTCCCACAGCCAGGAAGACGGGCTCAGCAC
-GGCTCATGGTTCAGATCAGTGAAACTAGATTCCATGGCCTCCTTTCAAATCCAGCTGGAGGAGGCTGAAAAATACCCCCA
-GGGCTCTGCCTGCCTGTGTACCGGTATGGGAAGACTCCAAGAAAATGTACAGCCTCCCCCACACCACCCCCACAGGCGCC
-AGACATCAAAGGTATAGTTAGCAGTGGCCTTCCAAAGCCAGTGTCTGATTTGTTTCCTAACCTAAAAGGATGGCTCTAAT
-GGCAGAGGTTTTGGGACAGGCAAAGGGAAGGGAGTACCACTGGCTGGTGAGGGAGCTGTTCGGGGCAGGTAAAGAAGCTT
-GTGGGGAGGTAAAGCTACAATGTGTAGTGAGCTGTCCCCATGGAGTGTGAGCCCGATCAACCCCCTCAGTCTAAAGAATA
-GGACACCTGCCTCTGCCTTGTGCAGCCTCCCCGGTGCTCCCAGCTGCCCAGTTTGCCTCCATAAATGTTACTTTTCTGCC
-GTCCATATTAAATGTTACCCTTCCCCAGTGTTCATAGAGAGAGGAGACAGATGCCTTTCTCTATGAACCGCTGCAGACTG
-TATTCAGTCAGGGCCTAGTTGTGTGGCAAGGGCACTGAATCCAACCTCCCAGCAGACAAAGCCATGCAAGAAGGAGGGTC
-AAGTTTCCAGGCCCAGGTTAAAAATCGTTGTGAGTGTCAGGTGTATGTTGGCAGGTGATCAGAGGCGGGGAAAGGAGGTG
-GAGGTCCCTGAAAAGCATCAGCCAAAACCACTGCTTAGGGATTAACAGCTTTTCAAGCAGCCTGGGATGTCCTTCTCATA
-AGGTTTGCCAGAATGGATGCTACTCACCTTCTTCCCTACTCCCTGCTGTGTATACCTGTACACAACATCCAAAGCAGGAC
-ACATCAGGGAATTCAATCCAAACCCTATCACGACAGTGGAAATTTTAAAAAATCTTCATGACAGAAAAGGTTCAGTGTTG
-GATGTCACATGGCAAGGGTATAAAAGAGTTAATTCAGATACCATCCTATCTGAAATTCCATCGTTATTTTTCCCACCTGT
-TTAACTGAAGCAGACAGGGCTTAACAATCTCGCTCAGATTTCAGTCTTCTCTCACTAGTCACCTAGATACTGACAGTTCA
-CTCATTTATTCGATTAATAATTATTGAGTACCTGTCATGCTTGAGTCACTGTGCTAGTGAGAAATCAGTACACTGTCTAC
-CATATAGGCATTCACTTATTCTACAAATATTTATTGAGCACCACCTGCTTACATAGCACTGTCCAAGGTGCTAGGGAGGG
-TACAAAGGAAGACAGCAGACAAGCCCTCAAGAAGCTTCAGATACATGTGGAGAAACGTGCAAGCCCACAACGCAGCCCAT
-TTCTACTGTCAAAGAAATGGACCCTTGCTACAGAACTGTGGATCTCCTGAGAGCTTGTTAGAGATAGAGTCTCACACCCC
-ACCTGAGACCTGCTAAATCCGAACCTGCCTTTTAAGAAAATTCCCCAGGAGGTTCCACGCACATTAAAGTTTGAAATCTA
-CTGATCTAGACAAAAGAAGCTCTAAAAATTCAGGGGAGAGAGAGATTATTGTGCACATCAGTGGTCAAAAAAAAAAAATC
-CATGAAGGAGTTTGCCTTTAAAGGATGTCTGGGCTTTGGCCAAGTATAGAGAGCTCAAGGAATAGTAATTTCCCACCTCC
-AATGAGTTAAAAAAAAATATGTCTGCAAACTGCGGAAGGCAGTGACATTTTTCAGACACATTTTCCACAACAGCAAAAGC
-TTTGACTCAGGTAAGATGAGTCTGCAAATTCTTGTTGCTGATGCTATCAGGATCCCCAAATTGCAACTCGCCCAGTTTGG
-ACAGCTTCAAGGTCAGATTACCTGCTGTCCTGAAATGGACAGGCCCAGGAAAGATTCCTGGCCTTGTCCAACCCACCTGT
-CAGTCAAGTAGATCAGCCAGTGAGAAACTGGCTCATTATTTTCCAGCAGTTACTCAGCCAATTGGCAGTCCCCAGCAAAT
-TGAATTCTGGAGTGGCATCGTGTGAACATCGGTGTGGTGGCTGCTTTATCAAGCCAGTCCAACAGAGCAGATAAATCACT
-GAGAAGTTTTGATTAGAGGCTGTTGGCACCAAGACTATTGTTTCATAGTAGATCAGACTGAGCAGGTGTCTCAGTTTTTC
-TTACACTCATCCTTCCTGCATTCCATTTAAGAATTAAGATTTTTGCTTTCAATACAAAAATTGAAATAAATGAATAAACA
-GATCTAAACATGACTCTACTGTTATCTCTTGTTTCTAACTACCACCCACAATGTCTGTTTGTCCAACAATTGAATCCAAA
-AAAGATTGTACAGAACTTCACAATTGCATAGTTATATAGAAATTCTCATTCACCATTGAATGAACTGCTTACAATTCAGG
-CCTGTAGTCTATGGTGATAAAATCTGCCCATTGCTTCAGAAGTCATGCCAGGGAGGATTTGTCAGGTAAGCTCTAAAGAC
-AACACAGCCCAACTCATTTACCATTGGGCCATTATTTTCCAGAAGCAGGGATGGGTTTGTGATGAGCCATCTATACTCTC
-TAACCTCCGTGGCCATGGCTTATGTTTATAAGGCAGCTGGCAGGGATAGGGAGGTTGGGTTGAAGCTGAGTAGCAGGACC
-TGGCTGGCTCACATGAAGTGGATCCTAGGACTTTGACTCATCAGCTCTGTCTTAGTCCTGTTAATTTGATGCTTAATTAA
-TAACAGGGCATTAACATCTGCTGTGAACATACTGCTACTCATCACCCTCCCAACCCTCCCTGCCTTCTCCTCTCATACCT
-GTCTCCAGGAAGCTGGACCCACTTATCAGCCAACTTAGTCTCTCAATTATTACCAAAAATGTGTTTTCAACTTGGTGCAC
-ACTGGGGGTGTGCCTGAGCAGGATGGCGAGAAGGGGCAGGCACACACTGAGAAGCGTAGACATACTCCCCTTTATCTAAG
-GGCTCTGCTATTTAGGAAAGGGCTTTTGTGTGAGGAGGTTCGAGCCTCAAAGGCTCATCTTGTCATTTTTCCTGTGCCTT
-TCAGAGATGGAGCATATTGTGCTGTGTTTTTGAAATGATGAAATGAAAGTGTGAGGAATCTGAAAGCCATATAGATAAGG
-AGTGGTTGAAGGAACTGATGGAGCTGAGATGAAACGTTATTTCAAACGTTGGAGGCGTCGTCGTGGGAAGAGGCAGCAGG
-TGTGTTCTTTGTGGTTCCCGCAGGTGGGATATAGGTTCGGTAGAAGGAGGCACTTTCTCACAAAGAAAAACCACCCAACA
-ATGGGAGGCCAGGCCCTGCTTCCTGAAGAAGGAGCCCCCCCATGATGACAGGTACTTAAGCTGAAGCTCCACGACTATGT
-ATAGGAGTCACCTGCATTATAAGCAAAAGTTGGAATAGAACTCAGCATTCTTTTAACTCTGAAAGCCTACAACACATGCA
-AAGCTAACCTTCACAGAGTAGCTCCTATGGTCTCACTTTACAGGTATTATCCCACTTAACGCCCACAGCAGTCCAATAAG
-CTAGGTACAGTTATTATGTTTTGTTTTGTCTCTTTTTGTCCTCACTTCGGCTTGGAATGCTCTTGCCTCAAATATCTCCC
-TCCTTTCCCATTATTCTGATCTTCTCAGGGTACTATTTCCTCCCCAGTCCTTCCCAGTCTTCCCAAAGAGGGGATAATAT
-AACCACCCCTCCCCCATCTCTCCATCCCTTACACTGTTTGATTTGTCTTTATGGCATTTAGCACTGCCTAAAATAATGCT
-GCAATTGTATCTGTTTATGACCTGTCTCCTCTGGGAGAACAGAAGGACTTGGTTGGCTTTGCTCAGTGCTCCATTTCAGC
-ACAGAGAATCAAGGCCTGGCATAGCGTAGGTGCTCAGGACGTATGCATGGAAGGAATAAATCAGTCAGTTTTACAGATGA
-GGAAACCTAGGCATTAAAGAGGTAAAGCAACATCCAAAGGCCAGACAGTAAGTAAAGAGAAGGACCAGGTTGAGAGCAAT
-TTGACTCCAGAGTTCACATATGTACAGACAACCCCCTACTTGTGATGGTCCAACTTCACGGTTTTCAACTTATGATGGTG
-AAAAAATAATAAGCATTCAGAAGAAACGATACTTCAAGTACCCACACAACCATTCTGTTTTTCACTTTTAGTACAGTATT
-CAATAAATTACATGAGATATGCAACACTTTATATAAATAGGCTTTGTGTTAGATGATTTTGCCCAAATATAGGCTGATGT
-ACGTGTTCTGAGCATATGTAAGGTAGGCTAGGCTATGCTATGATGTTTGGTAGGTTAGGTGTGTTAAATGTGTTTTATAA
-TATTTTCAACTTATGAAGGGTTTCTCGGGACATAGCCCCTTTGTAAGTTGAGGAGCATCTGTACCCCATTTGACCCTTTG
-AAAAAAACATGTATTCTCAAAGAAAAGCTGAGACATCCTTGTTAATTCAGTGGCTGGTGCTGGCTCTTGTTTTATGACTT
-CAAATGACTTGTGCCTATAAGCAGGTGGTCACTGGTTGCCACCAACATGGTGTCTTAAAAAGCCCATTGAGAGAGGTAGA
-GGGCAAAAGGCAGAGGGCACAAAGTTACCTTTTGCCTCAAAGGTCTGACTGCACAGTGATTTGCTGAATAGAGCAGGTGA
-GTCAGAAAGGTACAGAGAACAGCTTGGCAGTCACCTGGTCCTAATCTATCCCTGGGCAGATACATTGAATCTGACACAGC
-TCCCGTGCCTGGAGTCCTCAGAATCAAATTTGCAAACTCAGAGCAGATTTCTTGCGTCTCCAGGCGATTTGAAACCATAT
-GCAATGTCACCCTTTCACCAAAGGAGCTGAATTTATGTTCCTTGTTTTCTCCCTCCCGGTAAGGCTTGGATTTTTCCATG
-ACAAAAATCTTGTTCATTTGAATATAAACAAGTTATAAAATGAAATCCACATTGACTTTTGCAGTTAATTAAAAAGAATA
-TGGACTTGAAAATCAGACTAACTTGAGTTAGAATTCAGGTTACCACTTTGAATCTCCATTTTCCTACCTGAAAAATAGAA
-ACTAACCCTTCTCGCATGGTTTTTGTAAGGATTAGATAAAAAAAATTGAAGGGGGCATCTGCCATTGATTTTCTCTTCTA
-TTGTCAGAGCATTGTTTTCCGGCTAGACGCCTTCTAGTCTTTCTGTAGCTGGGTACAGGAAGAAGCATTGTCTGAAGGAG
-TTATCGGTGTGGAATCCAAAACAGCTAAATTGAATTAGCAGAAAGACAAGGGCATTCCAGTACACTGTGGCCAGGGAAGT
-GCTGTATTCACTCATTGTTTGCACTCCTGAGGTCAGGCTTTCAGGTCAGACCTTGAACCCTCTGCCTGCTTCACATCCTG
-GCTCCTTGGGAAGCCACTCCTGTGGCTTCAAAGGGGCAAAACTAAGAGAATGGTGGAGCTGGAACTTTCATGACCAGAGC
-CTGCCCTGGCCACATCCTCCCTTGGAACCTACAGTGGAAAGTGGGGACAATTTTGCTAGGTCACACCTTTTTGAGGACCT
-TGCTGGGCTTGTGGATCTGCCAGAAAATTCTTTCTTTTTTGAGGGACAAAAGCCTGCTGCTCAGCAGTTTTAGATTAAGC
-CTAATGAGTTCTCTCTTGAGATCACCATTGTTCTAAGCTTAATATCATCCTCATTGACCTAGTGGTATCAAATTCTGTTG
-GCATACCTCTTACTAACAAAACACATCAAATATGTTTTTATAAAACATGATACTAAATTATAGAATATACCAAGAAATAT
-GCTTGTACAGTGAATCTGTGTGCTTCTATTGCTACCATTAAACGTTTGCACCTACTTCTAGCTATCACCAGAATGGGTTC
-CACTAGCTTCTAATATAAAGTCCTACACAGCTGTATCTCGTAATTTATAAGGTAAGGTGGGAAAATGCATCTCAGGTCTC
-AGCTATCTCCAGTGGGAGGCAGGTTCTACCACTTTCAAGGCTCATAACACAGGAAGGGGTGTTCAAAGGTGCAGGGTAAA
-CAGAAAGATGGTGTTCACTGCTAGGCGTCTCAAAATGAATGTGAATGTTCATGCACTCTTATATACAGCATTTGAAACAA
-AACAAAACAAACATAAAATTAAACCTGACATCTTGGGAATGAGAAATTCTAAGGGTGCCCAACATATAGTAAGTGCTCCC
-TAAATAAGCTGAATGGATGAAAGAGTAAATAACTAGGTAGATCATGGAGCCTCTGATATCTGAGTAATACGGAAGTGTTC
-ATAAAAAAGGGAAGCCTCAGTGAGACATATAAATCCAATGAAATATGTTAAGTCTCAAAAAGGGAGCAGATAATTACTTT
-TGCTTTATGTTTTTCAATGGAGTAATAAATAATAGAAGAATTCTGGTCTCTTCTCTGGAAGCTGTCGTTTACTTGGTGAA
-GTTTTCCTGTTTTTTCCTAATAAATGATATCAGTTTTAATGCCGTGCTGCCCAAAGATAACATCTGATATGCCCTTAGAG
-TCAGTTATACAAAGAAATATAGGTTTAGCTCTGGGCTTCTCATCCTTGAAACTGTAGACATTTGGGACTGGATAATTCTT
-TACTGTGAGGAGTCGTGCATTGTAAGATGTTTAGCAGCATTCCCTGGCCTCTAACAACTAGATGCCAGCGGCATCCCTAC
-CCTATGTGATAACAATTAAAAATGTATCCAGACATCACCAAATATCCCTAGGAGGCAAAATTGCCTCTGGTTGAGAATCA
-CAGACTTAGGCCTCAAAAATGGGCAACTCTTAGACAAATTTGATTTCTAGGCTTTTTCAAGTTGTAAACTAACTTTTCTC
-TAAGCACAGCTCTGCCATGGTATTTGCCTTGTATTCAGTTAGGGCCTGAACAAGATAGTGATAGAGACCAGAGATCTCAA
-AATGTGTCTATAAGATAAGCTGTTACACCGAATGATATTATTTCAGTTAACTATTTACATAGTCCTATTGTTAACAAACC
-ACTCTGGAATTCAGTGATTTAAAACAATAATTATTCTTATGTTTCTGGGTTTACTGATTGGCTGGAGCCACTCAGGGTCT
-GTAGGTTGACTGGGGCAATTTTGTTCCATGAATATTATTTTTACACCCAGGTAGAAGCTACTAGGGAGAAGCTCTTCTCA
-GGATGGAGGAAGAAGCTTCCGGAAGCACTAGCAGAAAAATGCACTGTCTCCTGAGGTCAAAGAAGGCACTCGGCACACAC
-TGTCATGTCCGTCCACTACTGCTAGCCTAAGCAAGACACAAGGTCAAGGCCAACATCAGCTGGGCAGGAAAGTACACACT
-TCCCTTGAAGACTGGGGCAAAGGAATTCATGAACGCCAAAGATGACATTTTCAATACAACCAATGAGATGGTGTCATGGG
-TCTTCGGTTCTCACTGGCTCCATTTCTTTAAGAGACAAAGATGGGGAGGTATCACTGGCGTTTGAGTCACGTTTGCAAAA
-CATATTAAGATCCCAGTGGGAAAACGCACAACACAGAGAACAAAATTTCCATAGCTACATTTAAGAAATCTGACTATTGA
-ATCAGTAGGCTGGTGGTTTTATTTGTTTTATTATGTTTTCCGGACCCTTGGTAAATATTGTCTTAATTTGGGTTAATTAC
-TTTTAAAGGGAACCTCAAGAATCAAGGCAAATTATTTGATATTTATTTCGTATTCTCCTTCCTTGTGACTAGAATACTAA
-ATAAATCACTAGCAGCTTGACAACAGCAGCAGCCTACAACAGAGGTATAGAATCGGTACTTTTGTTCTGCCTTCTTATGT
-ACTCTGCATTAGTCATGGCCATGGTAGAGAATTCTGTGGACTGTTTAAGCTTCTGTGTTTTTCTGAAGGTATATAGAGGA
-ATGGAATGGGTCCAACAGCAAAATTATTATTAGAAGGGAATAGAAATTGCCCACTAGTTGAATCTTCAATAAATATCTAC
-CGTTGATTTCATTAACTGATACATGTGAAAGCTAAAAGATAGTTCAAATATTCCTGATACATCTTCCCAGGGACCTGACT
-GAGGTCAACCCCAAAATTTTAAGGATGAGAAACACTGAATTTAAAAAAAAAATCCATACATTGTTCAAGTTTTCCTTTTA
-GCCATAACAGATCCTAAGCTAGATCAGCCCAGGCTTTTTAGCTCCTAATTCCAGAACCTTCCAGCATACCATGCTTGCTT
-AATACAATAAAGGAACTGCAGGTATTTGGCCTAAGGGAGATAATAGTCATTTGGGATTTTAAGTAAATAAGAATCTCTTC
-CATCTGGATGCAGAACGCCGGGGTCTCAAATTGGGCAGGCAAAAGGCTTATTTTGAGGACAATGGAACACTCCCCTGTGG
-TCCCATTCATGGAGATGTGGGATGAGAATGAAAGTGAGGATCTTCAGCCTTCCTGACAGAATGTCCATCCTGTCACCTGA
-ACCTCTGTCTGCCAAGTACAGTGGGGACTTTTCATTCCTGTGCTGATTTATAGCTTTCTGACATCTGACACTGTTGGCTT
-CCTCTTCTTAGAAAAATTCCCTGGGAATTTTTCTGATCCCACTTCTCTGATGGCTGCTTGTTCATTATTTTTGCAGTTTC
-TTTTCTTCTGGACTTGTCCTAATTAATGGTGTTCCCTTTGGTCCTCCCCTTTCCTCACTCCACGTGCTGCCCTTAGGGTC
-TAGAATTGTGGCTCTCAAATCTTCATCCCCAGCCCAAGTTGTCTTTTAAGCCCCAGAGCCACATTCTCAACCTTCTGGTG
-CACATCTCTTGGCTCATGGGAACCTGACTCCACATTCATGTCTCCCTGTGCCTGCCCTTCAAACACCATCTCCTTCTCTG
-GCATCTCCCCACTCAGGGAGCAGCAGCATCTACTCAGATACCTAATCCAGAAACTAGGGACTTAATGGAGATTCCACTGT
-TCCCACCTTGCCTCACATCTAAGCAGCCACAAGCTCTGTAATTCTACAGCCTCAGTATTTCCTAATTATCCCCTTCCCTT
-CATTCGCAGACATTGTCTGAGTTCATTCACATCTTGTCATTTCTTACCTGGAACTGTGCACTGACTTCCTAACCATTCCC
-TAAACCCAACCTCAGCCCTTCGGCCCTCCATCCCTAAACCATTCTCCATGTGCCCACAAGCCATCTTGCAGTATAGAGCA
-CACATTTTTTTCTCCTTTTTTGTTTTTTAAGGGATAGGTTCTTACTATGTTGTCTAGGCTAGTCTCAAACTCCTGGCCTC
-AAGCCATCTTCCCGCCTCATCCTCCTGAGTAGCTGGAACTGCAGGTACATGCCACCATGCCCGGCCCACAAATTCTTCAG
-AGAGTTTCTCTAATAATGAATAAATTCAAGTTTTAGACAGTAATCTGATTTATATCAGCATTTGTACTCTGAGCATGGGA
-CATTTGTTTATTTATTCCACATTATTTATTAAGTGCCTATTCTGAGCCTGACCTTGGCAATAGAATAGCAGTGAATATTT
-TCTTTAAACTCATTCTCATGGAGCTTAAAACTTAGTAGGGGGAGGCACACAATACAAAATTAAATAGATATCTATAATGA
-ATAATATATTAGTTTGGTGCAAAAGTAATGGCAGTTTTTTGCCATTGAAAGTAATGGCAGAACCTACAATTACTTTTGCA
-CCAATCTAATAAATCAATACAATATATATTACGTGAGAAAGTGAAAAGTGCTTTTGAGAAAAGCAAATCAGAAAAGGGGA
-GTTGGGAGCGTTGTGGGGGAGGGTTGAAATGCTAGGCAGGGTCTGAAGAAGACGACATTTAAAGACCACAAGTGGGAAAG
-GAGTGAGCTATGCGGATAACCTGGAGGAGGGGGATTCTGGGTGGGGAACAGCAAGTACAAAGGCCCTGAGTCAGGAGTGC
-ACTTGTCAAGTAGAGGAAGTAGCAAAAGAGACCGATGTGGCTGTAAAGTGAGAAAAGTGACAGTAGCCAGCTTGCATAGC
-ATCCCATTGCCAATGGTTGCAGCAGTACCTAGAAAGAAGGCCAGCACTGAAATCTAGTGTTTTTGGCTTTCTCTGGTATC
-TCTGAGAAAGTGTCAGTCTGGCATACCCATTGTCAGAACAATCCACTTAAATAATATGTGTCCTAGTCAGTTTTTGCTGC
-GCAGCAAACAACTTTAAGTCTCAGTTACTTACAACTACAAGCATTTGCTTTTCTCACTTATGGATCTGTGGGTTGGGTGA
-TCTTGGCTGGGCTCAAGATCTTGGGTGATCTTGGCTTGACTGCAGGCTGTAGGTTGGGCTCATGTCTGCCCACCTTGCCT
-CTGAGTTTTTCCTGAACCGAAAGACACATTCTATGGTGATCACAGAAGAAGAGGCCCAGCCAAACGATGAAGCACTTTAA
-AACCCCTGCTCATTCACATGTCATTGGTCAAAGCAAGTCACATGACCAAGACCAACATCAAATAGATGGAGAATTATATT
-CTACATGCCCTAGGGGGAGGCACTGCAAACCCACAGCAAAGGATGTGGAAGTATAATTCTGCAATAGTAAATGAGTGAAG
-AAACAAGACCAATCATCCAGTATTTCATTATACTGTAGTCCTGCCTTGAATCTCTACACACTTTTGCAGGTTAGAATGCA
-CTTACACACGCCTTTCTGTGATACCTATTTAAAAGCCTTGTAGATAGTAGGCACTCATAAAACTGCTTCCTTAATAATGA
-AATCTATGGATAAATGCCTTATTTCATATGACCCATGCAACAATTAGTGAATTAAATACAAATATCTTCATTTTACAGAT
-GAGAAAGAATCTAAATGACTTTTCATTCAGGGTTGGCAGACTCAAGGCTCAAGCCCAATTCTTTGCTCTCTAAAGCAAAA
-GACAAAAATTCCAACATTACCTCAAAATTAAGTTTACAGCAACATGAGGCCTATATTTGATTACAGTTGTCTGGAGTTCG
-AAGCACATTTTGTTGTAAATAGTTTTGGTTAATCTGACATTTTGTGAAACACAGTAAGGGCCACAGTGAGTTTCTGCTGG
-GTTTAGGCTTCTTTCTGAGATTGGCCTGGCTGAGCTAGGCAGGCTGACTGCTCATTCACCCATTTATTTTTCATTCAATC
-AACATGAACTGAGTGTTTATAAGAAGCAGTGTTTTTAAAGCTAGGGCTTCCACTGTAAAGAAAACAGACAATCATGGAGC
-TCTTTGAAAGGCAGACGGTAGTATATACGAAGTTGGAAGTGGTAACTACTCTGAAAACAAATAAAACAGAGTTGGGGATA
-GGAGGTTAAGGGGCATGATGACCAAGGTGAAGTAAACGAAAGAGGAGAAAGCTATAGTCCCCATGGCAGAGAAGGATTTG
-TATAGCTGGTAACAAGAAGGATCAACTCAAAGCACCAGGAAAGGAATTGGATTAAATAGACAACTCTTGTCCAGGGTTGG
-TGGCTTAACCTGCACGAGTGTCCCCAGGAATGCAGCCCCCACCCCAAAGGCAACAAAGACCCTGCTTTTAAACTGACTGT
-TGGGGTTTCTTCACTTCCTGAAACTATTTGAAAGAGTCATCATTCTTGATTTTCTTTCTTAGTTAAAATTTGAAATTCAG
-GTTGAATTTTTAAAAACTGAGTTCTGTCCTAGAACTTCAGACAGAGGAGGTCAAAGTATCTATAAGATGCTTACATGCTA
-ATAAAAGATTTCACACCAGTAAAGTGCATTGAAGGGCACTGTTGGTGGGAGTGAGGTTCTGAGTGGTCTTCTCATCTCCC
-CACCAGGAAAATAAAAGAATCTTGAATATGATTTGCATAGAATTCTGCCATAATTCAAGATATGACCTGTAATTTTATTG
-CAAATATTGTTGTTTGGCTCCCACCAAGTGGATAGATGGGAGTAGCACAGAGGAAGGGTGCAGAAAGGAGAGAACCCTCA
-GTAACAAGGAGAGGTTAGGAGAAGAGCCTTTTTATAATCACTCTGTTCTCTCTGGAAGGAAGAACATCTTTGGGAAACTT
-GAGGCAAACAATTTCCTTGCATTTACTTTGACAAGTACCATCTGTTAATGGCAAATGATCCTGGATTTTCATTTACAGTA
-TAAATACAAAGTTTCCTTTTAAAATAACTTTAATTTGTAAAGTTAGTACAGGTGGTATATTCTTGGATTAGTTTTTTCAA
-CCTCCCCTTTTCTTTCCAAGAGGTTGGATGTCTTAGAATTATACTTTCCAGACATCCTTGTGGTTAAGGCTCTGGATGAA
-TTCTGTTGTGCCAATTAAATGCAGTTGCATGAGTTTTGTAAGGCAGAAAGAAAGTGAAGCGAGCCTTGCTGCAGTAATGG
-CAGCTGATTAGTAAGCTTTGTGAGATTTGAGCACATGCAGGAGTCAGACTCATGCTTCTACTCTAGTCGACGGAGGCAGT
-TATTATGGCAGCAAGAGTGGAAAACGTGAAAACTGTGGTTTCTTCCTGTTGACATGGATAGCAAGTTCCACTGGTGCCTC
-TGACTTCCATACTCTTCTCACCATTTTATAAGCATCTATTTCCCTGTATTAAATCACCTTCTACTTGAAATACCTAGAGT
-GGTTTCTCATTATTTTATTAATTTAACACATGTGGCAAAATTGTGATGTGGTAAGCACTGGTCTCATGGTGACATGACTA
-GAAACACACATTCTCAGAATTTATACAAAGGATACCTGAATGGATTTCGAAATATTACAATTTGGAGGCAAAGCAAAGCT
-GGAAATGCCAAGGGAAACTCATTAATTGATGTCCTATTGCCTTAAAAAATCTATTCAATTCCTTTTATGAAATGTGTTTT
-CAATTAATCTAATTGTCTTGGAGTCCTTCAGCTGACTGATTTTTCAACTGGTTTGGAGGAGGTTTTTTGGACATTTTGGT
-GGAATATAAGGAAACAGAGTTTGTCTCTTTGACTACCTTCATCACAGAGTAAAAGCTACATACTTACCTGAAGCCACAAC
-TCCACGTGACTTACTATTTCAGTTGACCTAGCCCTTGAGCTTCTGAGGAAAGCAGATGTTGGGCTCAGTGGGTGGCTCCT
-TCAATAAACATGAAGAATGGCTTCAAAAAAAGCTACGGATAAACTATGAGTGGTTGGGGCTCTATACCAATGGCTGGGGA
-GGGTGTGAGGAGAAGAGAAACATAGCAGTGACTGCTAGCCCTGTGAGATCTTTTGCACCCAAGAAGTCCACTTAATTTAT
-CAGGGAGGTCTTAGGAAAATTTAGCTGCCTCAGAAAGCCTGAAAGAAGACAGGTAGAGCACTTGAAAAAAAAAAAAAAAA
-AAAACAAGAAAATGTCTAGAAGTATCTGCATCATCAGTAATGTGAGCAAAGGAACATTTTGAATACTGAGTTAGCAAGTC
-TTGCTCTAGCGCTGAGGAGCCTTAGGTTTTAGGGGATTGCATAAGCAGAAATTGCCTCTTAAACTACAAGATTCTCTTTT
-CCTTTTTTTGCTTTGGTAGAAGATCTTTGTTGTTTTGCTTGCCACTGTCCACTCTACCAACTTTTGTTAATCATACTCCA
-CTCTTCCTTTAGGAAATACTCCCTTTCCAGCTCTCAGCCCATGTGAAGATGGGCTGACTGGCCTGGCGTGGGCTGACTGA
-GTACATGACCCAGGCCTGGCAAACTAGATCATTCCATCATCTAGACCACTCTGATTGGTTCAGACATGGTCACATGATGT
-AAACCTAGACAACCCCAGACAATGAGCATGAGTCTGAAGACTTTTGATGGCACCATTTGAGAAAAGGATGCTCTTTTTGT
-TGGTGTAAATAAACTGGTGGATGTAGCCTTATAACTGTAGGGAGACCTCCCTGTGAGAAAAGCTTTACCTGAGAATGAAG
-CTAACATGAAGGAAAGATGAACAAATAAATGAAAAAAGAGAGATGAAAACAGAGACAGAGATAGTCCTTTAAATGCCATA
-TGAGCCCTGGATCCAGCCATACCTGAAGTCAGAACTACTCCCTGGACTTAGTTACATGAACCAATGGATGTTCATTAAGG
-CTTAGATCAGTTTGAACTGACTTTCTGTCACTCACAATCCAAGGCACCATGACGAATGCTTTAATTGTTCTTTTTCCACA
-TTAACACAGTGCTAATTAGAGAGCATAGATCTTTATTTTCTTCCTTTTTCTACAACCCCCACCTCCACCACCCAGAAGTC
-TTCTGATGCCTGGTTTTATCCTGTATTCATTCAGCAGACATTTATAGAGCACGCACCATATGCCAAGCATTGTCCACAAC
-AACAGTTTTAGAAAACTAATATGGCATAGACCTTGCCATTAAAAAATTCAGTCAATACTGCTTTCCTAAAATGCATAAAA
-GATCACAAGTTGGTCATTTTGTTTTCTCCAAATTTTCAGCTTTCAAAAAAAAATTTAACTCTCAATTTCAAAATGTTTGT
-AACTGTTACCCATAAATTTACTTTATTGCATATGAATAGTTTAATTTTATAATAGCATCAATTTTCACCAAATTTCTTCA
-TGTTTTTAATGTTGTTATCACATCTTCACCTTAGGAAACTTATTTAAGCTCTCTGAGCCTTGGTTTTCTCATCTGTAAAA
-TAAACGGGTAGAGGGTACTGATATGCCTGGTATCTTCTCAACCTGAAATTCTGACAGTTTGCTCACCTATGTTGACTCCT
-TTCTTCCTTTGAAACAATTTTTTCCTCTGCCCTATAGCAACTTCTATAACACATATCCCCCCCGCCCCCCAAACCCCAGG
-GAATTAAATGCATTTCTCAGAATTCAGGAAGACTGCCCTGCTTTCATTCCTAATGCCTGTAACCTGTTCTCTATGAAGCA
-GCCAAACCGATCATTCCCAACTATATATGAAACCAAACTCCACATTTTCCACTCCTATTTAACATCCAGTGGCATCCTAT
-CACCCTTGCAATAAAATCCAAACTCCTTATCTGATCCCTGTTGATATAGTTTGAATGTGTGTCCCTGCCCAAATCTCATT
-TTGAAATGTCATCCCCAGTGCTGGAGGTGGGGCCTGGTGGGAGGTGATGGGCTCAAGGGGGAGGATTTCTCATGAATAGT
-TTGACACCATCCCCTTGGTGCTGTCCTTGCAGTAGTGAGTGAGTTCCCATGAGATCTGTTCATTTACAAGTGTGTGGCAC
-CTTTCCCCTCTCTCTCTTGCTCTTGCTTTTGCCATGTGACATGCAAGCGCCTGCTTGGCCTTCTGTCATGATTGCAAGTT
-TCCAGAGGCCTCCCCAGAAGCAGATGCCAGTGTTATGCTTCCGCAAGCCAATGAAGCCTCTTTTTTAATAAATTACCCAG
-TCTCGGGTATTTCTTTATAGCAACACAAGAACAGACTAATACACCTGCCTTTCTCTTCCTCTCTCATCTTACTTCCTCTT
-CTCCCTCTTGCTCAATATATTCCAGCCACTCTGCCTTGAATTTGCCAATCTTGTTTCCCTTTCAGAGACTTTGGTCTTGC
-TGCTCCCTCTTTCCAGAATACTTTCTTCCCAGATCTTGACAAGGTTTTCTTCCACACTTCACTCAGGTTGCCCATTCAAA
-GATATTTCCTGACTCTACCCGCCATCTAAAATAACATCTTACTCCCACTCTTTTCCATACTTTGTTTTATTTTCTTCTCA
-GCTCTTATCACTTATTGAAATTATAATGTATCATGTTATAATGATTCTATCTTATATAATTAACATTTAATTTAATATAA
-TTTAATGTAAATTACATTAGCATAGAGAGTAGCAAATAGTAGAGGCTCAGCTGGCTTTGTGGAATGAATAATTTTACTCT
-AATTCTAATAATAGCCATCTGTTTAGCTTTGAGGTATTTATGACAAAAACCCACCTTAATCACAAGCCCTGCTTTTAACA
-TCTTTTGTTCGAATATATGGACAGTTTTTTTATCCAAGTGGATTTTAAGAAACTTGAAGATCCTACAAACAGACATCCCT
-TCTTTTGTGAGTTCTCACAGACTGCCATTAGCTAGTAGAATTGTAATTATATTTTCAGAAGGAACTGTATACTCTACAGA
-TTGAGAAAGGTTTTTCTTGCATTCTTAAAAGATTCAGTTAGGAAATGGCAGAATTGGTTTCTAAGACAACCTGTAATGGG
-TAGCATCTAAAACTTGGTTCACCAGGTGGAATCACAGGCAAGTGCTCAGAAATCGTGACATTAGACCCAGAGTTTAAACC
-AGAATGATGTGTTCTACTGATGAGGTCTTTCTGCTTTTTATCAAACTCATCCTATTTGGCCATTTGATTCTAGAAATATG
-GTCCAGGCAAAGGTCACAGTAAGCCGTACAAAGTGTTCCCAGTTCATTCAGAAAGAAGCTCATGGAAACTATCTCAGAGT
-CTTTAAGTGCCTATGCCCCAGGTTAGGAGATCAAGGACAAGAAATCTGGGTGTAACTCCTGGTGAACAGAATAAGGCTCA
-GAAGAGGAAAGGTCAAGAATCTCCCTCATATACATGTTTACTCAATGGTAACAAGAATGCACCAGATTTTTCACAACAGT
-ACTATTTGTAATAGCCAAAAATGGTGAGAATCCCCATGTTCATCAACAGTAGAATGGATAAATTATGTTGGAATTCATGC
-ATAGATTAGTGTACAAAAAATGAGAATGGATGGTTTACAACTGCATTGAATGATACAGATACATATTGTTGAGAGAAAGA
-AGACAGTCAACCAAACACAAAAGAGTACATACTAAATAATTCAGTCTAATGTTCAAAAAAACAAACAGACTTAATTCATG
-GTGTGAAAAATCAGGATTGTGGTTACCCTTAGGGAGTTAGTGACTAGAAAAGAACATGAAAGAGGCATCTGGGGTACTGG
-TAATGATCTAGTTCTATATTCGGGTCCTGGTTACACAGATGTGTTAACTACCAAAATTCATTCAGTTGTGCACTTATAAT
-ATGTGCATTTTTCTGTATTTATTTCATATTTCAATAAAAAGTTTACTAAAAAAATTTCCTCATGTGTTTTAGAAATTTTA
-AGCCAAGAAAATTAAGAGAGCCCTCTTTTGCAAGCACTCACAGATTGATATACCAACTTTCAAACTCATAAGAAGCATGT
-GTTGAAAAGTCGTTGACTCTTTAGCTGAACCTCACAAAAAGAACTCATTTGATTCTGAAGATGTCACACACCCTGAGTTT
-GTGAAAAGAGAAGGTTTGGCTTTCAGGATCCCAGAGCATATATTTTCCAAAATCTCACACTTTCCCTCTTGGTCATGATC
-ATTCACCAAAACACACACACACACACACACACACACACACGCACACACACACGTGTGTGTGTATGTATGTGTGTGTGTGC
-ATAACATACATATACATACATATATGTATATATATATAATTATACAATATATAATTTAAGCAATTACTGTCTTGTGTGCT
-GTATTCCAAGCTTTTCCTACATTATTAATAAAAAATTGTCCTCCATCTTCTAGAAATTTTCAGTCTACCTGAATGTTTAT
-CATATGTATAATTGAACATTTCCCTAAAGCATAAAGACTCAATCAATGGGCTTCTACTGCTCACTGAGATAATCACCTTT
-AAAAAGACAAATGTTTTTTCTGCTAGATCTCTTTATCTTCACTGTGGGTTCCTCTTATTTTATTTCTACATCAATGTTCA
-TATTTAACTTATTATTTTATCTTATTTTTAAATTTCTTTTATGTTGAGCCTTGATGAAAGCCATAGGTTCTCTCATATAA
-TTGTATGTGTATGTATGTATATGTACATAATATATACATATATGTATATGTATGTGTATGTACATAATATATACGTATAT
-GTATGTGTATGTACATAATATATACGTATATGTATGTGTATGTACATAATATATACGTATATGTATGTGTATGTACATAA
-TATATACGTATATGTATGTGTATGTACATAATATATACGTATATGTATGTGTATGTGTATTACATAATATATACATATAT
-GTATATATTATGTATATGTACATAATATATACATATATGTATATGCATGTATATGTATGTTATACACACACTAATTCCCC
-TACATCTCACCTGTATAAGCCATTTTTTTAGTTGCTATAAAGGAATATCTGAGGATGGATAATTTACTTTTTTAAAAAAA
-GAGGTTTAATTGGCTCACAGTTCTGCAGGCTCTGCAGGAGGCATGGTGCTGGCACCTGTTTGGCTTCTGGCGGCAGTTTC
-AGGAAGCTTAAAATCATGGTGGTGGGAAAAAAGTCCTGGTGGAAGGTGAAGGGGGGCTGATGTATCCTGTGGTGAGAATG
-GGTACAAGAGAGTAGGAGAAGGGAGAGATCCCGGACTTCTAAGGAAACACATCTTGTGTGAACTGAGCAAGAACTCACTT
-ATCACCAAGGGGATGGTGCTATACCATGAGGGATCCGCCCCCACGATCCAATCACCTCCCGCCAGTCCCCACTTCCAACA
-TTGAGTATTACATTTCAACGTGAGATTTGGAGGGGACAAACATCCAAACTATATCATGACCCTTCCATCTACCACCTTTT
-CTACCATCACCACCACCAGAACCCTGAACCCACATGCTATAACTCTGAATTTTTTCCCCACCACCACTATACTTTTTGGC
-AATTTTAATTTGATTTGATTGATAGGAAAAGATTCAGAGATGACAAACTCGGAAGGAAATGGCTATAGGCTTCATTCTAC
-CTACAGATAAATTTTGTTTGGTCTTCACAAGGTATTTGTTAAATTTCTGAATGTGAATGTCTTTAGACTGGGCAAATGGT
-CTCCAGTTAACTGTGGTTCCCCAGCACTTTTTGCTATTTAACTCCCAACATACTACACTTAGGTTTCCCAAAATCTCATA
-CCTTCCCTTTCTTATATTTTCTGCCAAGAATATAAGACATTTTGAGTTTTCCATCTTTGTTGTTGTTGTTTTTACTTTTT
-TATTTCAATAGGTTTTTGGGAAACAGGTGGTGTTTGGTTACATGAATAAGTTCTTCAGTGTTGATTTCTGAGATTTTGGT
-GCACCCATTACCCAAGCAGTGTATGCTGCAACCGATGTGTAGTCTTTTATCCCTCACCCCCCGCTCAACCTTCCCCCTCC
-CCAAGTCCCCAAAGTCTATTGTATCATTCTTATGCCTTCACATCCTCATAGCTTAGTTCTCACTTATGAGTGAGAACATA
-CAATGTTTGGTTTTCCATTCCTAAATTAGTTCCCTTGAAGTAATGGTTTGCAATTCCATTCAGGTTGCTACAAATGTCAT
-TATTTCTTTCCTTTTTATGGCTGAGTAGTAGTAGTCCATGGTATATATACATACATACATAGACACACACACACACACAC
-ACACACACAAACACACACATATATATACACATTTTCTTTATCCACTCGATGATTGATGAGCATGTGGGCTGGTTCTATAT
-TTTTGCAATTGTGAATTGTGCTGCCATAAACATGCATGTGCAAGTATCTTTCTTGTATAATGGCTTCTTTTCCTCTGGGT
-AGATACCCAGGAGTTTTCCACCTTTGAATTAATCCTTAGGAATCAAAAAACATTGCCCTTCCCCACTTGCCTACTGAAGG
-TCAAACAAGCCTCTTCTGGGGAGCAAAAGTCAAATGGAGAATATACATGTTTGTGTGACTGTTGTCCCCATGGTTTAGTG
-CTTCCAAGGTACCAGAGTTGATTGGTTCATTGAGGGGTATGTATGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT
-GACAGAGAGAGAGAGAGAGAGAGAGAGAGAGAAAGCTAGATCTCAACCCTACTAGGGAAAGGATCAGATATGCTTACAAT
-GCTCCACCCCTGTAACTAAAATTGTCTTTGCATAAAAAGTCACAATTTAGAACTCCAAACTACTCATACCACAACATACA
-GAAGATTTACTCACCAAAAATCTCATGATACTTAAGAAAATATTATCTCTAAACATGAGCCAAGTTGGTGATGAAAAAGA
-AAAAAAAAACACAAAAAAACACAAAAAAACAAAAAACTCCCTGCTAAAAATCCAAACACTTTTGAGATTAGCAAGCGCCT
-TTAGAGTAGACCACCAGCATTGCCTTTATGGAAAACTCCTGGAAATGAAAACAACAGTCCCTTCATGAGATAATTAGGTC
-CTCCTTCCTCAACTCAATCTGAAAATATTCATTTAGAGACCAGACAGCCTGGTATCAGAAATTAAACCCCTGATTTCTGT
-GGCGTCTGATGGTTCAGAGTTCATGATTCTTGGTTAGCTGCATCAGTAACTGCTGTATGGACCTGTATAAAACCACTTGC
-CTACTCTAAGCCTTGGTCTTTTCATCTGTAAAAGGTTTGCAAACCAACTGATTCTATTTCTAAAAGTTACTTTTGGTTCT
-AAAATCCCATATTACAAAATGTGATATTCTATTTCTTAACCTGGGTAGTGATTGCACAAGTATTTGCTTTATAATTATTC
-TTTAAACATATATGTTTTATACAGCCTTCTAAATAAGTAATGTTTGACAATGTGTTGAAAGGGAAAAGCATTCTATCAGA
-AGAAGCCAGTCTAGTACCATTCTTGAATTCATAAAAGTAGGTGTGAAAATTAAATGTCAGAGGCAAAAAGCCAAGAGCAG
-ATTGAAGCTTGTAAAACTCCTGAGGCTTCAAACCATTTCAGTGATAAGCTAGAACCAAAGAAAGTAGAATGAATGGGAAC
-TTGCAGGGCAAGAAGGACTATTATAGGCTCATACAAATCCCCACAATGGTCCTAGGAGGAAATTGAAATCTAAAGGCTGT
-TACTTAATGGCCAAATTCTTAGCGAAATGTGACCATGGACATAGGAGACACTTTCTTCTGGTTTACAATAAGGAGCATCT
-TAACATTCTCAAAATGACTTGATTGTAAAACTTTTTCCTTCATTGCATTTATTTCTTTTGCCAAGCACCGTGCTAGGCCA
-CAGCAATATAGAGAAAACTAAAGTATGACTGCTTTCAAGGAACTTGCAGACTTAGAAGCCTCTATGTCATTTAGAAAAAA
-TTTCAAGCTTATTGCTTCTCCTGAGACCTCTGATCTCTTCTAAAAACATCCTACTCCCCCACTGCTGGACTGGCTCTCTG
-ATGTGCTTCAGAAAGCTCCCGCCTCAGGCCAGGCATGGTGGCTAACACCTGTAATCCCAGCACTTTGGGAGGCCAAGGGG
-GGCAGATCACGAAGTCAGGAGACTGAGACCATCCTGGCCAACACGGTGAAACCCCATGTCTACCAAAAATACAAAAAATT
-AGCTGAGCATGGTGGCATGTGCCTGTAATCCCATACTCAGGAGGCTGAGGCAGGAGAATTGCTTGAACCAGGGAGTTGGA
-GGTTGCAGCCGAGATCACGCCACTGCACTCCAGCCTGGCAACTGAACAAGACTCTATTTCAAAAAGAAAGAAAGAAGGAA
-AGAAAGGAAGAAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGA
-AAGCTCCCACCTTAGGGCCCTTGTACTTGCTATATCCTCTGCCACACAGTCTCTTCTCCCACCTTTACTTCTTTACTTGG
-CCCACTCCTTCTCACCATTCAGACCTCAACTTAAATGTCAGAGATGATTTTCTTGACTTCCCAGTTAAAAAAAATTTCCT
-CCTCCCCCACCTCAGTCATTCTCTACTTCATTTCTCAAAGTAATATTCTTCCAAATACTCCATATTTGAAAGTATCTTTT
-GCCGTAGATGTTTTTTAAAATGTATTTCTAGTCTTTTTTCTCTCAATATGAAGAACTTCTAGAAGACCAAAGGCAATGCT
-TTGTCCACTGCTACATCCCAGGGCTCATATCAGTGCCTGGCTCATAGTAGTTGCACACTAAATATTTTTAAATTTTATTA
-TTATTTATAAGTGAGTGAATAATATGAGGCAAACTCAAAAAAAGTTTTCCAAATGACTTTTAAGGTTCTAGTTAGTCTTC
-AGATTTATGTGGTCCTAAGTAGTGTCAAAAGATAAAAGTTTCAGGGAGCTGGGAGGTAAGAAAGAAGAGATGAATCCTGA
-TAGCATTCGTGCCTTCTTTGATGGTTGGGATCATAGAGGGATTCACAGAAGGTGTCATTAGTGGGAGTAGGAAAGATGCA
-TATAGTTATTCAATATACAGAAAGAGAGGAAGGCATTCCAGGTCAAGTGAACAACATAAGCAAAGGCACAAAGAGATAAG
-AATGCACAAAAAGTTGGTAGAACAGAAGACAAATGGAAGGGTAGCGTAATTTATGCAATGGTCATGAAAAGCTTTGGACT
-TTATTCTAAAGAAGACAAAGATTCGAAAAGTAAACCAGCCTCACTCATCTCATAGAACAATTAGACTGACAGCAGTGTGA
-GGAATGGGTGTGTCCATGAACACTTTGAAATTTTGGCCAAAATTGTACATGTATTTGTGAGCGTGTGATATTTGGGCATT
-TTACTGGGGAGAGAGAACCTATGGCTTTCATCAATGCTCAACATAAAAGAAATTTAAAAATAAGATAAAATAATAAGTTA
-AATATGAACATTGATGTAGAAATAAAATAAGAGGAACCCACAGTGAAGATAAAGAGATCTAGCAGAAAAACATTTGTCTT
-TTTAAAGGTGATTATCTCAGTGAGCAGTAGAAGCCCATTGATTGAGTCTTTATGCTTTAGGGAAATGTTCAATTATACAT
-ATGATAAACATTCAGGTAGACTGAAAATTTCTAGAAGATGGACAATTTTTTATTAATAATGTGGGAAAAGCTTGGAATAC
-AGCACACAAGACAGTAATTGCTTAAAGACAGGAAAGATAGGCAAATTCAGGTCCTAATGAGCTAAGAACGGATAGAAAAA
-GAGAAAAGTAGAAACCATACTTAGGTATGTTCTATGTGATTCCCACCTCTGCCTCAATAATCCATTCTTTCGTGGTGGGT
-TTCTCTTTCCTGCTAAGCAGTTCCTCCCACACCCCTATAGATGAACAGTCAATTCTTTGGTCATACTTGAGCCAGATCTC
-TGGTGATATAATTGCCAAAATGGCTTGACATTTAAAATATCAGAGATGACCCAGCTGCCCTAAGTGATAATAATGCTATT
-ATAGTGGGGGTAGAAACAGCCCCAAAGGAGAGAAGAGTGGGATACTAATGATAAAGTTCAGAAAAATAAGAATTAAGATG
-AGATAATGAACAACAGGGAGACTCGATCCAAGTCAAGTCAATGGTCATCTCACCATGGGGACCGATTGGAGAAAAACTGA
-AGTTAAATAAGGACGCTGGCAAGAGAAGACAACAGGCAGTGGAGTCAGATGGCCTCATCCTTGTAGAAGCTATGCACACC
-CATTTGAAGAGGAGGTAGTTGGATTAAAGGAATTGGCTCTAATTCAGTAGGAAAAAGTTGCAGGAGCCAGGAGGCTGAAA
-GACGCCTGCCATCTGGAGAAACTGGGGAAGGAGAATTGGAAGTCAGGCAGATCAGGGGTGGGGAAACGGTAAGGAAGAAA
-GGCTATTTGGCAGGAATACTTTGGGCGGGGTCAGCTTCTCCCACGATGCTCTTAATTCAGGGATGTAACTTGCACACTCT
-TCAGTAGAAGCATCAGCAATAAAAGAAAATAATTTTATTTCCAAATCCTAATAAATCTATATTTTGAACTGATATTTAGG
-AAAACTGTCTTTTAATATGTAAATGTGTTTCACATGCAATCCGTTTGGAAAAACACCAAATCTCCAAAATCTTTAACAGC
-AATTCTACAAAGTATAATATATTTATAATTTTTTGGTTGGGGTAAAATAAATTATACCAGATTTTTCAAGATATAGAATT
-TCTTATAGGAGAAGCAGAATGCACTAGAAGTCATTGAAACACTGGCAGGACTAAGTAGAAAAAGTTAAGGTTAGTAATGG
-TTACAGGTACAAGCTCTTAAATGAGAACACCCAAGATCACATCCTGGCTCCACTAGTTTACTAATTGTGTGATCTCTGGC
-AAGTTCATAAACTCTATAAACTTCAATTTCCTCCACCATACAATGGGATTAGTGCCCATGCAAGGAGTTATTTTTTTTTT
-AACTTTTATTTTAGATTCAGGGAGAACATGGGCAGGTTTGTTACAAAGGTATATTGCGTGACATTGAGGTTTGGAGTAAA
-ATTGAACCAGTCACCCAGGTAGTGAGCATAGTAACTGATAGGTAGTTTTTCAACCCCTGCCCCCTCCCTACATTTCCCCT
-CTTATATTCTCCAGTGTCTGTTGTTCCCATCTTTATACCCACGTGTACCCAAAGTTTAGCTCACACTTACAAGTGAGAAC
-ATGTGGGATTTGGTTTTCCATTTCTGCATTAATTCACTTAGGGCAATGGTCTCCAGCTGCGTCCATGTCACCTCAAAGGC
-CATGATTTTATTCTTTTTTGTGGCAGCATAGTATTCCATCATATATATGTACCACAGTTTCTTTATCCAATCTATCATTG
-ATGGACACCTAGATTGATTCTGTCTTTGCTACTGTGAATAGTGCTGCAATAAACATACAGGTGCACGTTTTTGGTAGAAT
-GATTTATTTTCTTTGGGGCATATACCCAGTAATGGGATTGCTTGGTTAAGTGGTAGTTAAACTGTTAGTTCTTTGAGAGC
-TCTCAAAGAGTTATTATAAGGATTAAAATTAAAAATAATAATGCTTGTAAATTATTTAACACAGTGCCTCATATATTTTG
-GGAGCTAAATAATTATTATCTGTCATTTCCATCATCATTATTATCAGTTAATTTGAGAGCCTTCCAGAATTATTTGCGGA
-CAGTACTGATCAAGATTGTGGTTTTTCATCTGCTCCTGACTTGCTATATAAACTTCACCAAATGATTCAGCTACAAAAGA
-GGAACAGGGTCTATGTCCATGTTGAATCTCAAGAATTTAGATCATAGACATTATTGTTATTATTAACACTCTACTTGCAA
-ATAGGAGCGTTGGTCTCTTGTGTCAACTCTACAACAAACTCACCACAGGGCTAGACAAGCCACACATCTGTTCTAGGTCT
-CTGTTTCTTCATCAGCCAAGATGGATAAATTACACAATCTTCAACGTTCATCTGAGTTCTAACATTCTATGATTCTGCAA
-CTGCTGTTTCAAATGTGGCACTTGTGAGTTATAAACAACATAACTTCCCTTCACCTGCATTGGACTACACCTATGGGGAC
-TGAAAGTGCAGTATGTGGTGGGTATGTGACCTTCCACAGGTAAGAGATGAGTTGCCCTTCTCTGCCTGCATCCTCACAAG
-AGCCATTTTGTTCTGCTCCTGTCTGACTGGCTCTCCAGTAATTTTCTGCAGCAAGCTCTATCCTTATCCCAGCCAGTGAG
-AGGAAAATGAATTCACCCAGCAGTCCTATGCATCCCTTCAGATGTTGCAGGGAGAAAGCACGCCAGGCATTTCACTGTTA
-ATTATCAGCAGCCTGGCTGCTATGGCACCTTGCTGTGCCAATTTGAGAGATGAGATTCTTTACACTGCTTATTAGGCTCA
-GCTAAATAAATATTACCCAGCATTAATGTTGTCAGAGATACAGTCTGAATTCAGCTCCCTTGAGTGGCTGTTGGTACCCA
-AGCTTTTCACCATCAATTTTTCTTCCTGTACCTCCTTCCCTTACCAATCCACCACTAATCTCTTTCTCTCCTCCCTGGAT
-GTTCAGCTGGATTCTGACATCAGAGGACTGAAATAATATCACCGATTTAGCTCCTTTGCTTAAGGTTATCAAATACTTGT
-GCTGCTACTAGATTTAAGGGCCCCATTATTAGTTACTTTGTAGTCTTGTCGTAACAGATTTCAAATTTCTGAAGCATGTA
-TTTTGAGTTAGAGCCCGCCCTCTCCCCCAGCAAAGTGAGTTTTGAAAGACTGAAGCCCTCTGGCTACAGCAATTGGTTTA
-AAGGTGAACCCTAATAAGGCCAATCATGCCCCCAAAAGAATGAATTTCAGGATTTATTTTAGCTATTTAAAAAACAGAAG
-TTTTCTTCTTGGCTGGATGTTGAATCTAGAAAATATAGCCCCAAGGAACCACTGTTAGCTATTTTGCAACCATGAAGGTA
-AATGCTACCCATAATGGAGACGACATATAGTAAGTGGTGGAAAGAATTAGAGAAAAGAAACCCACACCTGTTAAGAGCCT
-AGATCAAGCTTTACCTAAAGCCAAATCAATCTTTGGACATTTCAGTTTGAATCCTTATGGCTCTCATATTATTTAATTCT
-GAGTTGGAAATTCTAATACTTTCAGCTACATAGATGTGTTTGTTACAAGGTCTCCTGGATGTGTCTATTTGGAGCAAGTG
-TAGGTGAAGCCCTGCCCACATCACTTCAGATCTTACCACTATAATGCTCTCCTACCTGAATTCCCACTCCCGAGGGCTAA
-CTGTAGTGATTTTGCTTCAGCACAAGATAGTACAGAAGTGGTGGGTAATAAAACACCACACCGAGGCAGCCCTTAATAAA
-TGATTGGCAGCAGTTGGTGAGTAAATATGCCAGCTTCTTTGCTCATTTTGTGTAATGCTGAGACACATGTTCTATACAAG
-CTCTCAGAGTTCCTCAGGGGGATTGACCCTAGTTTGTTTGATAACAACCCTTCATTGGCTGCCTTCTTTTCTCTGTCCCA
-TTTCTCTATTGGTTTGTTGGTATCACCTTCTGAGTCACTTGTACTTGGGTCCACAATGAATTTATACAAAGTAACATCTG
-CTTATACCTTTTAAAATGCACCCTACAGGGAGTCACTTCCAAGATGGTTGAATAGGAAGAGCTCCAGTCTGCAGCTCCCA
-GCGAGATCGACACAGAAGATGGGTGATTTCTGCATTTCCAACTGAGGTACTTGGTTCATCTCAATGGGACTGGTTGGACA
-GTGGATGCAGCCCACAGAGGGTGCGCTGAGCAGGGTGGGGCATCGCCTCACCTGGGAAGCACAAGGGCCAGGAGATTTTC
-CCTTTCCTAGCTAAGGGAAGCCATGACAGGCTGTAGTTGGAGAAATGGTACACTCCTGACCAAATACTGTGCTTTTTCCA
-CAGTCTTAGCAACTGGCAGACCAGGAGATACCCTCCCGTGCCTGGCTCGGCAGGTCCCATGCCAACAGAGCCTTGCTCAC
-TGCTCATGCCGAAGTCCAAGATTGACCTGCAATGCTGCAGCTTGATGGGGGGAGTGGCATCTGCCATTGCAGAGGCTTGA
-GTAGCTCACAGTGTAAACAAAGAGCCCAGGAAGCATGAACTGAGCAGAGCCCACCAAAGCTCAGCAAGGCCTACTGCCTC
-TACAGATTCCATCTCTGGGGGCAGGACATAGTAGAACAAAAAGCAGCAGACAGCTTCTGCAGACTTAAACATCCCTGTCT
-GACAGCTCTGAAGAGAAGAGTGGTTCTCTCAACATGGCGTTCGAGCTCCAAGAACAGACAGACTGCCTCCTCAAGTGTGT
-CCCTGACCCCCGTGTAGCCTGACTGGGAACACCTCCCAGTAGGGGCCAACAGACACCTCAAAAAGGCAGGTACCCCTCTG
-AGATGAAGCTTTCAGACGAAGGATCAGGCAGTACTATTTGCTGTTCTGCAGCCTCCGCTGGTGATACTCAGGCAAACAGG
-GTCTGGAGTGGACCTCCAGCAAACTCCAACAGACCTGCAGCTGAGGGGTCTGACTGTCAGAAGGAAAACTAACAAACAGA
-AAGGAATAGCATCAACATCAACAAAAAGGACATCCACACCAAAACTCCATCTGTAGGTCACCAACATCAAAGACCAAAGG
-TAGATAAAATCACAAAGATGGGGAGACACCAGAACAGAAAAGCTGAAAATTCCAAAACACAGAGTGCCTCTTCTCCAAAG
-GATCGCAGCTCCTCGCCATCAAGGGAACAAAACTGGATGGAGAATGAGTTTGACATGTTGATGGAAGCAGGCTTCAGAAG
-GTCGGTAATAACAAACTTCTCCAAGCTAAAGGAGCATGTTCTAACCCACCACAAAGAAGCTAAAAACTTTGAAAAAAGTT
-AGACAAATGGCTAACTGAAATAAACAGTGTAGAGAAGACCTTAAATGACCTGATGGAGCTGAAAACCATGGCACAAGAAC
-TTTGTAATGCATGCACAAGCTTCAATAGCCAATTCAATCAAATAGAAGAAAGGATATCATAATTGAAGATCAAATTAATG
-AAATAAAGCAAGTAGACAACATTAGAGAAAAAAGAGTGAAAAGAAACAAAAAAAGCCTCCAAGAAATATGGGACTATGTG
-AAAAGACCAAATATACGTTTGACTGGTGTACCGGAAAGTGATGGGGAGAATGAAACCAAGCTAGAAAACCCTCTTCAGGA
-TATTATCCAGGAGAACTTCCCCCTAACCTAGCAAGGCAGGCCAACATTCACATTCAGGAAATACAGAGAACACCACAAAG
-ATACTCCTAGAGAAGAGCAACCTCAAGACACATAATTGTCAGATTCTCCAAGGTTGAAATAAAGGAAAAAATGTTAAGGG
-TGGCCAGAGAGAAAGGTCAGGTTACCCACAAAGGGAAGCCCATCAGACTAACAGCGGATCTCTCGGCAGAAACCCTACAA
-GCCAGAATAGAGTACGGGCCAATATTCAACATTCTTAAAGAAAATAATTTTCAACCCAGAATCCCATATCCAGCCAAACT
-AAGCTTCATAAGTGAAAGAGAAATAAAATCCTTCACAGGCAAGCAAATGTTGAGAGATTTTGTCACACCAGGCCTGCCTT
-AAAAGAGCTCCTAAAGGAAGCACTAAACATGGAATGGAACAACAGGTACCAGCCACTGCAAAAACACGCCAAATGGTAAA
-GACCATTGATGCTAGGAAGAAACTGCATCAATTAACTAGCAAAATAACCAGCTAATGTAACATTATAATGACAGGATCAA
-ATTCAAACATAACAATATTAACCTTAAATGTAAATGGGCTAAATGCCCCATTTAAAAGACACAGACTGGTAAACTGGATA
-AAGAGTCAAGACATCAGTGTGCTGTATTCAGGAGACCCATCTCACGTGCAAAGACACATATAGTCTCAAAATAAAGGGAT
-GGAGGAAGATCTACCAAGCAAAAGCAAAGCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGTAGGGGTTGCTCTGATACA
-ACAGACTTTAAACCAACAAAGATCAAAAGAGACAAAGAAGGCCACTACATAATGGTAAAGGAATCAATTCACAAAGAAGA
-GTTAACTATCCTAAATATATATGCACCCAATACAGGAGCACCCAGATTCATAAAGCAAGTCCTTAGAGACCTACAAAGAG
-ACTTAGACTCCCACACAATAATAATGGGAGACTTTAACACCCCACTGTCAATATTAGACAGATCAATGAGACAGAAGGTT
-AATAAGGATATCCAGGACTTGAACTCAGCTCTGGACCAAGCAGACCTAATAGACATCTACAGAACTCTCCACCCCAAATC
-AACAGAATATACATTCTTCTCAGCACCACATCGCACTCATTCTAAAACTGACCACATAGTTGGCAGTAAAACACTCCTCA
-GCAAATGTAAAAGAACAGAAATCACAACAAACTGTCTCTCAGACCACAGTGCAATCAAATTAGAACTCAGGATTAATAAA
-CTCACTCAAAACCACACAACTACACGGAAACTGAACAACCTACTCCTGAATGACTACTGGGTAAATAACGAAATGAAGGC
-AGAAATAAAGATGTTCTTTGAAACCAATGAGAACAAAGACGCAACATAGCAGAATCTCTGGGACACGTTTAAATCAGTGT
-GTACGGGGAAATTTATATCACTAAATGCCCATAAGAGGAAGCAGGGAAGATCTAAAATTGACACCCTAACATCACAATTA
-AAAGAACTAGAGAAGCAAGAGCAAACAAATTCAAAAGCTAGCAGAAGGCAAGAAATGACTAAGATCAGAGCAGAACTGAA
-GGAGATAGAGACACAAAAAACCCTTCAAAAAAATCAATGAATCCAGGAGCTGGTTTTTTGAAAACAAAATAGATAGAGCA
-CTGGCCAGACTAATAAAGAAGAAAAGAGAGAAGAATCAAATAGACACAATAAAAAATGATAAAGGGGATATCATCACCGA
-TCCCACAGAAATACAAACTACCATCAGAGAATGCTATAAACACCTCTATGCAAATAAACTAGAAAATCTAGAAGAAATGG
-ATAAATTCCTGGACACATACACCCGCCCAAGACTGAACCAGGAAGAAGTTGAATCTCTGAAAAGACCAATAGCAGGTTCT
-GAAATTGAGGCAATAATTAATAGCCTACCAACCAAAAAAAGGCCAGGACCAGACGGATTCACAGCCGAATTCTACCAGAG
-GTACAAAGAGGAGCTGGTACCATTCCTTCTGAAACTATTTCAATCAGTAGAAAAAGAGAGAATCCTCCCTAACTCATTTT
-ATGAGGTTAGCATCATCCTGATACCAAAGCCTGGTAGAGACACCACAAAAAAAGAGAATTTTAGGCCAATATCCCTGATG
-AACATTGATGCAAAAATCCTCAATACAATACTGGCAAACAGAATCCAGCACATCAAAAAGTTTATCCACCATGATCAAAT
-CAGCTTCATCCCTGAGATGCAAGGCTGGTTCAACATACACAAATCAATAAACGTAACCCATCACATAAACAGAACCAACA
-ACAAAAACCACATGATTATCTCAATAGATGCAGAAAAGGCCCTTGACAAAATTCAACAGCGCTTCATGGTAAAAACTCTC
-AATAAACTAGATATTGATGGAATATATCTCAAAATAATAAGAGCTATTTATGACAAACCCACAGCCAATATCATACTGAA
-TGGGCAAAAACTGGAAGCATTCCCTTTGAAAACCAGCACAAGACAAGGATGCCCTCTCTCACTACTCCTATTCAACATAG
-TATTGGAAGTTCTCACTAGGGCAATCAGGCAAGAGAAAGAAATAAAGGGTATTCAATTAGGAAAACAGGAAGTCAAATTG
-TTTCTGTTTGCAGATGACATGATTGTATATTTAGAAAACCCTGGCTGGGCACGGTGGCTCATGCCTGTAATCCCAGAACT
-TTGGGAGGCCAAGGCAGGTGGATCACGAGGTCAGGAGATTGAGACCATCCTGGCTAACACGGTGAAACCCCGTCTCTACT
-AAAAATACAAAAAAAATTAGCCAGGCATGGTGGCAGGTGCCTGTAGTCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATG
-GCGTGAACCCGGGAGGCGGAGCTTGCAGTGAGCGGAGATCGCACCACTGCATTCCAGCCTGGGTGACAGAGCGAGACTCC
-TTCTCAAAAAAAAAAAAAAAAAAAAAAGGGAAAAGAAAAGAAAACAAAACTCCATCGTCTCAGCCCAAAATCTCCTTAAG
-CTGATAAGCAACTTCAGTAAAGTCTCAGGATACAAAATCAATGTGCAAAAATCACAAGCATTCCTATACACCAATAACAG
-ACAAACAGAGAGCCAAATCATGAGTGAACTCCCGTTCACAATTACTACAAAGAGAATAAAATACCTAGGAATCCAACTTA
-CAAGGGATGTGAAGGACTTCTTCAAGAAGAACTACAAACCACTGCTCAACGAAATAAAAGAGGACACAAGCAAATGGAAG
-AACACTCCATGCTCATGGATGGGAAGAATCAGTATCGTGAAAATGGCCATACTGCCCAAGGTAATTTATAGATTCAATGC
-TATCCTCATCAAGCTACCACTGACTTTCTCCACAGAAATGGAAAAAAACTACTTTAAGGTTCATATGGAGCCAAAAAAGA
-GCCCACATAGCCAAGACAATCCTAAGCAAAAAGAACAAAGCTGGAGGCATCATGCTACCTGACTTCAAACAATACTACAA
-GGCTACAGTAACCAAAACAGCGTGGTACTGGTACCAAAACAAATATATAGACCAATGGAATAGAACAGAGGCCTCAGAAA
-TAACACCACACATCTAAAACCATCTGATCTTTGACAAATCTGACAAAAACAAGCAATGGGGAAATGATTCCCTATTTAGT
-AAATGGTGCTGGGAAAGCTGGCTAGCCGTACATAGAAAGCTGAAACTGGATCCCTTCCTTACACCATATACAAAAATTAA
-CTCAAGATGGAGTAAAGACTTAAATGTAAGACCTAACACCATAAAAACCCTAGAAGAAAACCTAGGTAATACCATTTAGG
-ACATAGGCATGGGCAAAGACTTCATGACTAAAACACCAAAAGCAATGGCAACAAAAGTCAAAATAGACAAATGGGATCTA
-ATTAAACTAAATAACTTCTGCACAGCAAAAGAAACTATCATCAGGGTGAACAGGCAACCTACAGAATGGGAGAAAATCTT
-TGCAATCTACCCATCTGACAAAGGGCTAATATCCACAATCTACAAAGAACTTAAACAAATTTACCAGAAAAAAATAAACA
-ACCTCATCAAAAAGTGGGCAAAGGATATGAACAGACACTTCTCAAAAGAAGACATCTATGCAGCCAACAGACAGGAAAAA
-ATGCTCATCATCACTGGTCATCAGAGAAATGCAAATCAAAACCATAATGAGATACATCTCATGCCAGTTAGAATGGCGAT
-CATTAAAAAGTCAGGAAACAACAGATGCTGGAGAGGATGTGGAGAAATAGGAACACTTTTACACTGTTGGTGGGAGTGTA
-AATTAGTTCTACCATTGTGGAAGACAGTGTGGCGATTCCTCAAGGATCTAGAACTAGAAATGCCATTTGACCCAGCCATC
-CCATTACTGGGTATATACCCAAAAGATTATAAATCATGCTACTATAAAGACATATGCACACCTATGTTTATTGAGGCACT
-ATTCTCAATAGCAAAGACTTGGAACCAACCCAAATGTCCATCAATGATAGATTGGATTAAGAAAATGTGGCACATATCCA
-CCATGGCATACTATGGAACCATAAAAATGGATGAGTTCGTGTCCTTTGGAGGGACATGGATGAAGATGGAAACCATCATT
-CTCAGCAAACTATCACAAGGACAGAAAACCAAACACCGCATGTTCTCACTCATAGGTGGGAGTTGAACAACGAGAACACA
-TAGACACAGGGCGGGGAACATCACAAACTGGAGCCTGTCGGGGGGTGGGGGGCTGGGGGAGAGATAGCATTAGGAGAAAT
-ACCTAATGTAAATGACGAGTTGATGGGTGCAGCAAACCAACATGGCACATGTATACCTATGTAACAAACGTGCATGTTGT
-GCACATGTACCCTAGAACTTAAAGTATAATAAAAAATAAATTAATTTTAAAAAATGCACCCTACAAGTTGTGGCTTACAT
-GATTTCCACCGTTCCACCCCCAAATAGACTGATGCATACCCAAACCATTTGACATAAACTCAGCCTAGAAAAAAGCTATG
-AATTCAAATCCAAGTAAGCCAAAGTGTTCTTTCCTGTCAGTGCCAGCCAAGCAGAGGGTTATGGACTAGACGGAAGATTT
-TAGGAGAGAAAGGGAAGCAAAAGCATGAACAAGCCAAGGTATGGAGGATGCTCATTCATCCTCAGGCTCCAGAAGTGGCA
-GCGAGCTGTCTGGATACTCCACTGAAAGTCACAGTCAATGAGGTTATTAATCTGGTGGTCCTAAAAGATGAGCAGCACAG
-ACACCTTGAATCTCTGGATACACTTCCCCCTCTGCATAGCCTCTCTCTCAGTTCCTAAACCCTCCATGCTAAGAAAAACA
-TCACCAGGCATGGGGCTTTGCCAGAAACGTTCACTCGAAACAGTACCTGGCAAATGAAAAATGCACTTTTAAATTATGTA
-CTTTCCGACTAGTCTTCCTAATGGTATGTTGACTATTATTTACATGAAAAATGTCAAAATGTGGATTCCTTTGTTTTATT
-TTTATTTGGGGCATTTTAAACAAAACATTCACTTTAATACTCATGGAGAAAGGTCTACTTCTCTTTCATCTTCCTCTCTG
-TCTTCCAACCAAAACTCCTTGCCAAAGAACACGGATGGCCAACAGGACTTGCACTGACCACATCGCACTCCTACTAGAAA
-ATTACGGATGGAGGAACCAGCAATTTCTAGATGAAATGGCCCTATTTCCTCATTTTACCACTAAGGATAAAGAAGGATCA
-TGCCTGTAATCCCAGCACTTTGGGAGGCTGAGGCAGGCGGATCACCTGAGGTTGGGTGTTTGAGACCAGCCTGACCAACA
-TGGAGAAAGCCTGTCTCTACTAAAAATACAAAAAATTAGCCAGGCATGATGGCACATGCCTGTAATCCTAGCTGAGGCTG
-AGGTAGGAGAAGCACTCGATCCCGGGAGGTGGAGATTGCAGTGAGCCATGATCACACCATTGCACTCCAGCATGAACAAC
-AAGAGCGAAACTCCGTCTCAAAAAAAAAAAGAGGGCAAAAAGTCTTCGATGACAAGCCTGGACAGGACTTTAACAGTATA
-TGCTCCAATTTATCCCTGTCACAGATGAGGAAACTGAGGCACAAATCAGTGAAATGCTTTGTTCAAGACTTTACAGCTAG
-TTAGTGACAAAGTCGGGGCCAGAACTAAGGAATCTTGATTCCATGCCCTCTTCATACTATCCTCGTCAATTCTGGTTTAA
-GTTTTTCACTTGATTTGTATGTTTGCTTTATCTTAAGCTCATATTTCAACCCTATAACCTATCTTGCATATGATGTGGGT
-TGTTTATTCTTAGAAAAATCTAAGATTATTCCACTGTATTAGTGGCCTTGCCTAAATAGATGCATTGGGGAGAAATCCTC
-CCACATAATGAATTTTGTCACTGAGACATTGCAAGAAGTAGCCCATAGCCTTTTCTTATCCTTTTAGAAACAGCCTGAAA
-AGTTCGATTATCCTCCAGATTCAACCTTAGTCCATTTGGTTTCATGCTCATTCCTAATCCCAGACCAATTCCTGGCCCTG
-AGCCCAGGTACTGGTATGGCCTGGAAAATGCCAGAAGCCATATGGACTCCCCAGGCTACCTCCTGGATGAGGATGGATGG
-CACACACCGAGGAACCAACTCTTTCCAAGAGATAGAACAGATGGCATTCCAGATATGAATATGTATAATGTAGACTGCTA
-AGTTGTTAAATAAGTATGTATTTTTAGGTGGATTCATGAAAATCAAGAATTTTATAACTAAAATGAAAGCCAAGCAAATG
-AAACCACAAACACCATTGAAAGCTGTGCATTACTCCATGTTTGTTGGTATTGGCCTCCATAGCATGCTCCAACCTCTAGA
-GAAACCACTCGAGAAGAACCAGGAAGAAATAATTCAAAACTGCGGCAAAGGATGTTAACTTCAAGCTTCCATGCTCTAAG
-ACCCTAGGACGTCCATGGATGGCAGAATTAGTATTCAGAAGAGCAAGGAGTGGGCTGGATTTTTCCTTGGCTTTACCACC
-TTTCTCTATGTCCCTTTATTGAAAATTCCACTCTATCACACCCCCAACTCAAATTCCTTATGCTTTAATTTGGCTGCCCC
-AAGAACAAGCCTAAGAGGCATAAGAATAATGCAAGTCATTGAATCAGTAGAATCAGTCAAGAAGATCAGCTTCCACAAGC
-TTCCAGTACAAATAGTACCCTTCAGAAGACTTTAAGCTCTTTGCTCCGTAATAATACTACATTACAGGTATACTTATTTC
-CAGTTTACAGAAAATTTTAACAATCCCATGTGAAAAAATAGAACATGAATTGTTACCCCCATTTTTACAGAGAAGAAAAT
-GAAGTCTTGGAGAGGTTAAACAACCACTCAAGAATGCACCAATGGTAAATGTGCCACTGGGACTTGAAGCTAAGACTCTG
-ATTCTGTCCAGTAATGCATCTGATTTGGCATTCACCAATGAACCTACAGCCAAACGGGCCATCACTGGAGAAGTCCAACT
-GCTACTTGAAAAGCCTAATCCATGGATTAACAGATTCCAATGAGTTAGAACATCAAAGGGTAGAATAGGATATATTTCCA
-CAATCTGGGAACATTCCAAATAGAGAAACTGGATTCTTATTTATCCATTATTGATGCAAGTCCTTAACTCCTTCCTGTAT
-CCATGGGACCTTTTGCAATCCTTCACACTAGAGACAGAATACACTCTCCTGCTCCATTAATGATAGGCAATGGAAAGGTG
-ATCTGCTTCATCCAATGAAATGTTAGCAAGTGTGATGCAAGCAAAGACTAGAAATTGACTTACTTGGTTGTGCTTGTCCT
-CTTGTGCTCCTATTATCTGCCCACAGTAGCTCACTGAACCAAGGGAAATGAGAAACATGTGCATAGATCTAAACTTAACT
-CACTGCTTTGAGACAAGCACATCTGAGCCGAGCCTAGATCATCCAGCATGCAGCCAACTGCTGACACATGAGCAAGAAAG
-AACATATATTGTTATTTGAAGCTATTGAGTTTGGGGCTGACTTGTTTTACAGCAATAGCTGACTAATACACTTGCTATAT
-TTCTTTCATCTTCCTACTTCCACTTCAATGCAAATGGACTCTGCCCCTTGTTATTATTACTGTCTGTTTCTTTCCAGGCA
-GCAAATCACCACCTCTTTTGATGTCCTAAATTATCAGCAGTCTCAATATCAAGATCTACATAGTCATTAATTTACAAAAA
-GCTATTATTAGGAAGTGAGATGGTAGTAAAAATAAGGTAGGTGAAGTTATACCCACAAAATAGAATATCGGGGTGCCAGA
-TCAATATTTAATAAATGGTTGAAAACTTCAAACATTTAAAGATTATTTTGTGGTTAACAAGTTAGAGAAAACACATTGCC
-ATTAGACGACATTTCTTATGTGCTTCTTTACATAGTGACCTGGTGCTTGATGTGCTGTGAAGACAGGATGCTCATCGCCT
-TATAGTTTATCGATAAACACAGGCAATACAGAGGCAGGCAGCTAGTAGAAAATATAGATAGGTGTTGGATAAATTGATAA
-TAAAAGGGTAAGATTAAGTGTTTTGTTTGGTCTTATTTTACCATTTCAGATTTGCTTGATTATTAATTTCCAAAGCCCCA
-GAAAACCCAATTCTCCTGCATTCCTAGAAATCGTGGCAGGTTTCCATCTATAGAAAATTACATGCTTTTCTAGGTGTTTC
-AGAGGTTTAAGTTGCTTAGTTCTTTAAGAAACTGCTCCAAGCTGGGGTGAGGGGAGAAGAGTGTACCAGTATCAACCCAC
-TTACACAAAGAAGGACTTGACTATTCATCAGGTATCTAGGGACAATTTCCTGAAGATGATGGAAAGAAGACAGTGCCTAA
-CACTTGGATGGTAAGCACTTCAACAGTATTTACTAAATTAAAGAAGGGAGGAAAATAGGAACTAGTCCTGCCTTACCCAT
-CTTTCCATTCCTTCCGCTTTGTGTTTTCATCTCAGTTTTGTCAGATCCATTTCTCTGGCCTCTCCAACTCTCAAAGTTCC
-AGCCCTGTGATTCAGCCATCGCAACTCTCCCAAAGTGTTCATTGATCACATTTCCTCCCTAGTCATTGGCACAGTGCTTC
-TTTCATATTTGATTCTTGACACCTGCAGGTTTTCCATTTTGGCTCTCAACTTTTTTTATTATACCCCAGTGGGCTTTGTT
-TTGTACATATCCCCCACCCTGAGTGTAGCCTCAGAAAGGTGGACTTTGGTTCTCAATTATAAGAATATATATATTCTTTC
-TAATAGCATCATGCTGGGCACTGTAGTATCCAATCCTATAGTGCTTACAAGGCACTTTATTCCACACTAACTCATCTGAC
-CCTCACAATGGTGTTCTCAGTTGGATAGGATGACCCTAACTGTTCAAATGGGGACTCAGAGTACAAAGGAGGTCACAGAG
-TTGGTATATAGAGAAACCAAGACACAAACCCAGTTTTCCTGTCTCTAACTCTGGGAATTATTTCTTTGCATCATGCTATT
-TTAAAAAGTACTAGCACTGCTGAAATTCTTGGACTTTCTTTATAATACACAACCTTAGAAGAGAAAGTAAATCATTGCTA
-AGGAAAGGAACTTTTCTTAGCTCAAAAAACAGCCTCAAGAGGACTGAACCTCTTAGAATGCTCGTCTTTGCCCAGATGAT
-CACCAGCCACACTCCAACATATTGATACAGATTTTATGATTTTATAATTTTGGGTTCAGTTGGCAGGACTCACTCTTCCA
-AAAATAGCTTTGGCCTTAATGGGTAGGATGAGCTGCATTACAAAGGCCCTCAACTCCATAAAATTTGGCATCCAGCCAAG
-CCTTCAAAGGTGACTAAAGAAGAAATATCAAGAAAGACCAGAGGTTGGTACTGCCTTGTGAACCTCTCAACATCTATTGG
-AACTTATCAATTTTATAGATATTCACATTCCAAAGCAAGGAGCATTTGAGCTTTTAGAGAGATTAGAAGACCCTAAAAAG
-TGCATCTCGCTCAAAAGGTGTCCAGCTTGTCCAGTGGTCATTGTCCAATCTGATTCCATTTCAAAATCATTTCCATATAA
-CCAGCTTGATGGTGAGATTCTTGAAAAGTTCTAGACCAGGAGGAGGAAATGAGGGTTTGGTTCCTGGCTGTGCCACTAAC
-CGACTGCATGAAGTTAAGCAAATTATGGGGCCTATTCCAACCTCGTTCTTTTTACAGGTCTGACACCTACAACGTGTCAG
-ACACTGGGAATAGAACAGTCCACAAGACAAAGTCCTTGCTCTAAGGGAACTTACCTTCTAGGGAAGATATATGATAAACC
-AATACATAAATATATAATAAGGACATGAAAGCAATAGAGAACAAAAGTGCTGTGAAAAAGATGCTGTTTTGGATAGGATG
-GTCTTTTGAGCAGTGAAATAAAATAAATATCTGAGGGAATAGAGTTCCAGGTGGAGGGGACAGCAGGAAGGCCATGAAGT
-TGGGGTGCACCTGGCATCTTCAAGGAACAGGGAGAAGGCCAGTACTTCTGGAGCAGAGGGAACAGCCGGGAGAATGGAAG
-GCAAGGAGGTGAGCGATAACAGGGGCCCAATCCTGGAGGGTCTTTTAGCTTTGGTAATGACTTTGGATGGGAAGGCAGTG
-GGGGAATCTGAGCAGATGAGGGTATGAACTGACTTAGGTTCCCTGAATGTGACCTTGGCTGCTGTATGAAGGACGGGCAG
-CCATTTCCTCATCTGATAGCAAACTGGTATGGACCAGAGAAACGAGAAGCTTCCCACTGCCACTCTAAGAGCTGAGATTC
-CGAGTCATATGTTTTACTGAACAAATTACTGCCCATCTTGGTTGAAGCCCATCGGGGCCTGAGCTAAGTCTTTGATCCCA
-GAGGCCAAGGCAGCACCATTCCTCGCCATTAGCCCATGGCTAGTGACCCGGGAGGTACAAAGTCAATCCTAGCTACAGCA
-GGAACTCCTGCAGAACCTGTGACCCTCATAGCCAGGGGGTCTCAAACCAGCGGGATACATCTCAGAGTGGCTTTGCTGCG
-ACGTACCTTTGGGTAGTTTGAGACTGAAATGACTCTAGTCACTACTTTTCATTTCCATCCTTTCTTCCCTAAAGGTCAAC
-TGGAAAGGCAGCCGGCTGAGAGAACTCGATCTCTGTCCAGCAGAGATTATTTTGTGGACGCTCAAGGTTCTGAGAGCTTA
-CTTCCTTTTTCTGGGTCACCTGCTTGGTGTGAATTCATCCAAAATCATCCGTTTATTTTTAGAGCTATAAATTATATCTG
-CATTTCTACTCTCCTGCAGAAATTCAAGCTCAGAGCTTGGGCAGGGGCCCTGTGTTTGAGGCACAGAGACTGGCAAAGCG
-TCTTGCCTCCCACCTCTTCTGAAGTGAGGCCTCTGCGCTACTGTGTCCCAGCCCTTCAAAAATCCTGAGTCATTTCACTG
-TTTCTGTTTCTCCCCTTTCCCCAGCAAGCTTCCTGATGCAAAGGAACACCGGAGCGGGGCGATTGCCTCCCTAGAGCTGG
-GCCGGCCACCCCCACCCCTCGGGCTGCTAAAGCAGCGGGCCGGGCGGAAGGTCGGGGAGCCAGAGCCCAGGGAAGAGCAG
-AAGGCGCGGGGGGGCGGGGGGGGCACCCAGGAGGGAGGACGGGGCAGCGGTGAGGGTGTAGACGGGAGGGAATCTGTCCG
-GTGCCGCAGTGAGTTGGGTGGCGGTGATTTGTTCGCGGGCGCAGGCTGGGAGGCGGGGTTCCTGACTCACTGCGGCACTG
-GCAGGGCTGGTGACAGCACCACCCCCGCGCCGCCTGCAATCTGCCACCGCTGCCACCGAGCCGAGGGGCGCCAGCAAGGC
-ATCCCCTGGGTCAAGGGGCCTCCCGTGGGCTTTCCAAACAGCCTGTGCTCATTTCCGCGGGAGCCCTCGGGGCGCTGTGC
-TGTGGCTGCATTGTCACTGTTTGTTTATTTCTACATCTGCTCTGTTAGAAGATAGGCTCGCTTAGGACAGAGCCTTCTAA
-TCCACCCCCTGATGAATTCGGGCCCTCGCCTTTGGCACAATGCCTGGCGTCATCACAACGCGGGTGATCAGTAAACGGCA
-GCGAAGGAAGCGGGGTCAGGACTGGAGAGGAGAGGGGGAGGAAGACAGACGACCGGAGAGGAACAAAAATGGAAGGTAAC
-TTGAGCTTTCATAACTGCAGAAGTGCAAAACAGCTCCCTGTGTGATATAGGAAGTAAAACCGTAGAGATGGGACTTGGCT
-GGCCTGCCCTTCACACACTTTAGACATTAACCCAAAGTTCATGCTCCTGCCATGACAGTGATGGTGGACAGGAGGGAAGA
-AAATGACAAGGAGGAAAGGAGGTGTCTTTTGCTCTTAAAAATGAGAAGGGTCATAAACAATCCATCGGCTGCAAACCACG
-AGTTGCCCCCAAAGCAAAGCAGGTTAGTGGCTGCTGCCGCCTCATCATAGCTTCAGAACCCACAGAGCCTGGAGGACTGT
-CAAACATTATCTAATATCCCATTCTACAGAAGAGAAAACTGAGGTTGAGGCAGGAACGCAGACAGGAATCAAGGTTTTGG
-GGTTGGGATTTGCAATCCATTACTTTGCCTCCTGCATCCACTGCTTTTCCCTGGGCATTCTCTTCTTCCGGTTTCTTGGA
-AGTTAAAATTGCGAGAGAAGCAACACAGAGTGGTTTTCCCAGGGCCTCGACCTCGGTAAGGGAAGACGTGGAATTCCGAG
-TGTGGAGACCCAGACAGCCTCCGAAACCCCCACGCAACCCTGGGCGTTCAGCAGCTGCCAATGCCCGCCTGACAAGTTTC
-TGGGGCATCTCTGCACACGGAGAGGTGTGTCTCCTGCAGCTCCAAAAACAGATTTTGCCATCTCATCCCCATATTTGCAG
-TCTCCAGTTGGCTTCTTGTGATTGGCCAGAACTTTTCCTCACTGGAGAGATGAGGAGAATCCAGTCCTCCAACCAGCTGA
-GAGAAAACACTGCAGTAGCAGAGATAGCAATGGCTGTTCCACCCCACACTGATACGATGTCAGGGAGCCAGGGGTGGGCT
-CAACAGGCTGAATGATGCCAGGGACTCCCAAGGGTCTATACATTTAACCCTGGAGGAAGTGGCCTCTGACCAGGTACCTA
-ACCTTCTGTACTTCTCGTTCTGTAATTGGGGGCATCAGAGTGTATTCTTTGGCTTTCTGGAAAAAAAGATTTCTCAAATT
-TTAATTTCGGAAGTTTCCATCAGGACTGGCAGCTGTGTACACAGAAGGAGGTTGCTAATGTATTTCAGATTGGGGGCAAT
-TACAGCTTCCCACCTACCCACCCCAATCTATTCCCAGATCACTGCACCACACTGACTCTTGGCCTCCTCTAGAGTTGGAA
-ACTCTACCTGAGAGATGCACTCCTTTAAACTAACATAAAACCTAAACTAACAAAACCATAGCACTTCAAGGTATCCTTAG
-GGTAAGGTTTAATGACCTATTAATATCTCTAACACAGCAATTCTCTTGCTTGGCTATTCACTAGAAGCACTTGGAGAATT
-TAAAATAACACTGATGCCCAGGCCATACCTCAGACCATACCTCTAGAGGTGTTTTCTAAAAGCTCCCCCAGGTGACTATA
-ACAACAGTAAGACTGAAAACCTCTGCTCTCGTGGGAGCTGCTAGTTTGCTGGTCAGCATCTGTTCTCCCTTCCACTAATA
-GCACCTGATGTTCCTTTGGAAACCCCACTCTTTCTTGGTCCACTTGATTGAGTTACACTAACCCCATCATCACCTCCCAT
-TTACTTTTTTCAGGGAATAGCAGGCTACCAGTTTGGCCCCTTTGCATTTTTCCATTCCCCTGAAAGAAGTAATTGGTTCA
-GGCAGAAGATGTGATACAAGGGGGTCCAATGAAAATCAGTCTCAAGACTGGCTGAAACTATTGGGAAGGGAAAGATCTGT
-TTCTGCTGCAGTTATTTAGGAGAAAACATGGGAGCCTTGAGCTTCCAGCAGGCATTTTGCCACCACATGGAGAAAATCTG
-CTTGTAAATTAAGGCAACATAGAGGAAAAGAGATTATTCATAGAGTGAAAAAGACTGAAATCTAATTAATACCACTTCTG
-AAGCCAGATACTTCCAGTAACAGATATTAAATCCCCCTTTTCACCCAAGAAAACTTTGAACTGAGTTTTCTATGATATGC
-CGCATCATAGCAGAGTTAATCTGTTGCTTTAAAATGCAGAGAATAGAGTTCTAATCTAATATGACAGCAAACAAGCAAGC
-TTCAACATTCCTGGTCAAAGATTCCAGATAGCTAAAGACAAGTGGGTGCTGTCCATCTTCAAGGATAATGGCTTTCAGTG
-GAGAAGGGTGAGGAAACTGAAGACAGCAATGTTCTACTACATGTTTTTTTCAGTTAGTATCAAGAGTTATTGGTAGCTTA
-GCCTTTGCTAAATATGAAAGAGCTTAAGAAGTAAAGAGGTTCCAACCATAGGAACCTCTTTTAACCGTAACTATAAGAGC
-TTTTATAATAGCTCTTATAGGTTTTTATAGTAGCTCTTATAGGTTTTAACCATAACTGTAAGAGCTTTTATAATAGCTAA
-TATAGCAGTGATGTATAGGAAGTACACAGAAGCACACAACAGACCATCAAGACAATGCATTGGATGTTTCAGATTCCCTT
-CTTGGTCACGGGAGATTCCCTGGAAAATGTGCCCTCTGTCTGAAAGTGCAAGTGAAGCCAAAGTAATTGATTGGCTGCAT
-TTTAGATTTGAAAGTTTTTCCATGAACAATTGCCATGTAACAAGCTACCCCTAAATTTGGTAACTTAAAAAATGATGTGT
-TTGACTTGTCTTTGTATAGACTTGGATAGCTTTTCTGGGCTTACCTGGGATCTGCAATTGGCTTCTGGTCAGCTAAGTGG
-CTCTGTGTCTGAACTTGGCTGGCTCTTGGCTGGGGCAATGGGAGTGATGAGCTAATGTATCTGTCAACCCTTCAGAGCCT
-AGCCTGGGCTTATTCACATGGGGGAGGCAGGGTTCCAAGAGTGAGAGCAAAATTGCACAAGGTCTCTTGAGATTCGGACT
-CAGAACTTGCTCACTGTCATCCTGCCACATTCTATTTGTCAAAGTGTGTCACAACCCCATTTTTTTTTTTTTTTTTTGAG
-ACAGAGTCTTGCTCTGTCACCCAGGCTGGAGTGCAGTGGCTCAATGTCAGCTCACTGCAACCTCCACCTCCAAGGTTCAA
-GCGATTCTGCTGCCTCAGCCTCCTCGGTAGCTGGAACCACAGGTGTGTGCCACCACACCCGGCTAATTTTTGTATTTTTA
-GTAGTGGTGGGGTTTCACCTTGTTGGCCAGGCTGGTCTCAAACTGCTGACCTCAGGTAATCCACCCGCCTCGGCCTCCCA
-AAGTGCTGGGATTAGAGGCATGAGCCACAACGCCCGGCCACAACCCCGCTTCTTGATGGAAGGAGCTGCAAAGTCACATT
-GCAGAGCACCAGTAAGAGCTCAGAGATCATTTAGCCCAATCCTCCCCATTTAACAGATGAGAAACTACAGACACCGAGCT
-TACCCAAGTCCCCATTTGATTAAATAAATTATATAGGATTATGCTGCCTTCCACACTGATACTCTGTCCACACTGATGTT
-TTGTCCACTATATCTCCTTTTTCCAAGTTATTTCCCATACGATGTAGCTCATGTCCATTATCATAAGATCTCTGCGAAGT
-GGTTAGGCAGAAATTGCCTAAATGTGCTACCTAACAATGGAAGAAACTGATACTCTTCTTCTCAAATTCGCCCATCAAAT
-ATATAGGAATTCTTTTCCAGGAATGGGCACTGGAGTCACAACAGAAAGCAGGGCAGACATAGATCTTATCTGTACAGAAC
-ATAGAGTTTACCATTTAAGTGGTGTCACTGGGACTTCAACCAAGACTGTATGATTCCTCCTCTGGATGTACTTTTCACCC
-ACAGTGGTTGTTATGGTTCCCTGAAGGCTAGTTCGTCTATCAAAGCCAGTTGTTTGTATTTGTGACGGGGCAATCCATAT
-TAATTTACAGGGTTCTCAGCCTCCCCTCATCCCCTTCTCTTCTCCTTGTGAATGAGAATGCTCTGTTTGATCACTCAACT
-TTGTGTATTCCCCACTGTCTTTACTGGGTAAGGTCCCAGGATTTGTGGTGGTTGACTCTGAATAATGGGAAGATAAAGTT
-TAGAAGAATCAGGAAGAAAAAAGTAAGAGAATGAGACAGGAGAACCACATAAGATTGGGCAGCAAAAAAAGCTGGGGTGC
-AGAATAGAAAGGAAGGGATTTGTAGAATGAATAAAACTACAGGCCACATGAAAACTAGAGAGAAGAAAGAATGTTTTAAA
-ATACTGTACTGAGTTATGAACTGAATCTCTTATTTTTCTTCCAGATACAGAAGTGAAGTTTGATCTATTTTTTATTTTTA
-TTACTATCGGCCACTAACTTAGTTGGTTTTTAATGTAACACTTTGGCAGGCCTAAACCACATGCAAACTGGGTAGTTATC
-TGGAGCAAATTTAATTAAGAATCATTATGTCCCCTGAAAGGACAACCAGAGTTTGTGCCTTCTCTAAATACTTGGTCCAA
-ATCAAAACATCAATTGTCCTTTTCTTAATGAAAAAAAAAAAACCTCAACTCCATACTTTATTCTGGTTTCATTGATTTTT
-CCCGAATAACATTTTTTCTGTTTCAACATCCTAATTGGGATACCACATTGTATTGGTTTGTCATGTCTTCCTAACTCCTC
-TGGACTGTGGCAGTTTTTCAAACTCTCCTTTTTTGGGGTAACCACAAAAGTTTTGAGGAGAGCTAGTCAGGTGAAATGCC
-TTTCAATTGGATTTTTCTAAATTTTTCTTTTCATAGTTACACTTGAGTTATTGTCTTCCCACAGAGAAAAGACCACAGAG
-GCAAAATGGCATTTTAAACACATGATATCAAGTGTGCATATCATCAACGTGACTTATGACCAATGACGTTAACCTCGACC
-ATCTGGCTAATGTGCTGTTTGCCAACTTCTCCACTGTAAAGTTGCTTCTTTCTCCCTTTCCATCCTGTATTCTTTGGAAT
-CAAGATGCTAATTGTAGCCCACACTTAAGGAGTGGGGAGTTCTGTCTTTAACCATAGTGAAGAATTTTATTTACTGGAAT
-TTCATTTAAAGTTGGAGTGGGAAGGAGGATGATTCTCAGAAGAACAATAGTGTAAAGAACAGAAGAACAATACTGTAAAG
-CATAAGGGGTGAGGGAGTTCCCATATTATAAGCATGATGGGCAGAAATATTGCAGAGTAGGGAATGAAGAAATGGGAAGC
-CACATGCTGGTGAAAGGAAGGTTTGGAAAAAGAGAGAAAATTTAGCAGTTGTTCTCACTGAAAAATTTTGTGAAGAGATA
-CCTAGAGAGAATGTTGTGAATGTTTTCTGAGCAACTCACTGTGAGAAGCCCCTATACTACATCTTTGAGAAAACTTACAG
-TAAAGATTTACATTCATCTTCTAGGTACCAGAAACTACACTGTTATCTTGTCCAGGCAAAAACTGGTCCACAAGAGAGTC
-CTATCATATTTGGGTTGTACCAGCAAACAATAAGTTGGGCTGGGTCTAGATCTGAAATGAAAGATCTGTAATCCAAAGAC
-CAGATCAAGCATATTGTTTAATTTCTTCAACCTCAAGGAACTTATAAAATTGCTTATAGTAGCAGATTTTTGCAATGGCA
-TCCATTAGTTCCACAGCAGTTTCCCATTATTTATCTAAACATGCAAGGGGTAGAGTGGCTAATAGTGGGATCTTTGGACT
-GTCTTGAAGATTGGACTCTTTTGTTAATTTTGTATTCCTCGATTATTGCTTATACATATATTGTACTCCATTGTGACTCA
-TATTTTTTGGTCATTACTTTTTACTTACATATAACCCATAACGTTTTTTATGTATGTTTCTACTGCAGAGAGAAAGATTA
-TTCCCCCACTCAATACCTATTAACTGATTGGCTGCTTTATGGTTGCTATTTCCATTCTGCACACTTGTGTTGAAAGATAA
-AGCTTCGATAACTTACAAGGAGCAGTTTAGCAAGTTGAAAGAAACTAGATGTAGGATCCATGTGTTTCCACAAAGGATAT
-GCAGGCTTCAACTAGAAAGATGATTTAAGTGTTTAGGGAAGAAATAAGCATGTTCTAACAAGAGTTTTGCAGTCAGCAAA
-ACAAGGTATGTGGTAAATAGGTCCTATCTTGGGAATTGCCAGAGCCCAGAGCTTGTGCTGTTGGCCCATCCAAGGAAACC
-AGTTAAATTAACTGTCTGGAAGGCATCCACAGAGATCCTTGGCTGGGAGGCAGAAGCAGGACATGGAACAGGTGCCCCTT
-TCCACTATTCCTGGGCACAAAGTCTCATTTCCAGCACACGCTGTGGCAGCAGGAGATGCAGTAAATCAACCAAGCTTCAT
-TTCATCTCAGAAGTCCTCTGTGTACTAATAATGCAGGGAAACTTAGCTCATGAAGGAAAGAAAAAATAAATAAATGCTGA
-CGGTTGTTAGAGCTAGTCCCAGTGATAAGCCTGGAACAGGCAAATATTCTTAGTGATTCAGACAATTACTATTAAACAGA
-GGCCAGTTTCCAAGTGACGTTGTGGTGCCAAACACAGCTTTTATCATTTTTGATGAGATTTTTATGATGCTTGTTATCTG
-CCAATATTATTAATGTTGTTAATGACATAAAAAAATTAGCATTTGCCACCTGTGTGCCAGAAGGCAGGCCTTCTTCCTTC
-TTTGGTCTTTGTTCTCACTAGTTTCATAGGCCATCTTTGCTTTGAGAAGGAGCAAAGTTGTCAGCCTAGACCTTGTTTGA
-GTTCTTGTCTGAAATATACTGGTCACCTAAGTGCATAATTCAAAGAAGCCTCCAGCTTGGTAGCTCCTGGGCCTCAGTCC
-TTCAATTTGCCTTTTAAGACTGCTGGGAAATAATAGCATTCAGTTAGCTGTTACTCTCACATTAGAAAAGTAAAATGAAG
-TATTCCACAGAAAAAAAATAAAATATTTTGTTTCAACATCAAAATCTTAAGTGGGATTGGATATGAACCCTAGAAGAAGA
-CCATCTCTGGGAAATCCCTATTGCAAGGACAGAAGCAATAAGATTCTTAGCCAGAAAGAAGCGATCCTTGGGCCAAATGC
-AGTGCTGCCCCCAGTGGTCTGGATAGCAATGCTCTGTGAGACCAGCAGCTTTCAGTCTTGGGAAGAACTCAAATCTCCAT
-CAGATAAAAATGTCTAAACTGGCCCATACCCGTATTATCATGGGGTGGACTTGGGTGCCGTGTGGACTGTGCAGGCCACA
-TTTGGGTTGGTTAAGTGTCTTAATCTGCCCTGTACCCATAGCTAATGTATCCTTAAGTGGGAAAGGAGAGACAGATGATA
-GATAACTAAATACAACTACAGTCTGCATCATTCACTAAAGCAAGTCAAGTGACCAACCCCAGATCCAAGGAGTGTGGAAA
-TAGACTCTGCTCTAGACGCTACCTCATAGAAAGAGGAATTATGAGATCACCTGAAAAAGGATACATGAATACAGGGTTGG
-GCAAAGAATTAGGACAAATGGTGCAATCCATCACTACCAGTTTAACATCATCTCTTTCAGATTAACTCAGTCTCATTTGG
-GCAAATAATTAATCACTTTTTATTCAAATGCTCTAGAAGGATTGTTATCTCTTCCTTCTCAGTGGATCTCACAACCTGAT
-CTTTCCTTCTAATACAGTGTTTGGGAACAGGTAGAAGTTTATGTTCTTACCTACATATTGTTCTCTGCTGGCTCCCAGTG
-ACCTCAAGTTCAGATATACCCTACCAGGGAAAACTCTAATTTTGCTGCATCTATTGCTGATGGGTCTTGTGTAATTTATA
-GTCTGTCCTTGCTGAATTGTCTTTCTTTGGGGGTCTTGGTGTTGAAATTCCTCCTCTGGGACATGGCAATGATTCCCATT
-CAACCTAGAGCCTGAGTGACCCACCCTACAGGCCTCTTCTACAAAATCACCACATTCTTTACTGAGAGTCCTTTGGTGGA
-GTCATAAGTCAGTTTCCTGGGGCATGCAGGAAAGTGAATTCTCTGTAAAGCATTCTCAGGCTAAGGCAGGCGAAATAAGC
-TTTCTTGGTATTTAACACTATCATGTGTTCATTTCTTTTCTTTTTTGACATCTCCCTGTTGGCATAGGACTCATCTTAAG
-GTCTTTAAATGTTCTAGGATCTGCTGGTAAAAGTGAGGAATAATTTTCCCTGTTCTGGCATTCCTCCAAAACTGTCTGGT
-TATTTCTCCCACTGTATCATCTTGGATGCTTTTGGCTCTAAATAACAGAAACCCTGACTCAAACTGGATTAAACAAGAAA
-GAACGTCATTATAGCACAAAATGAAAAGTCTAGCATTAGGTTTGGTTAATTCAGGGGCTCAGCAATGTCAGCTGGGACAT
-GGGTTATTTCCATCTCTTCACTATGAAATCCACACTGTTGACTTCATTCCAAAGCTGACTTTTCTGCATAGCCAGAAGTT
-GGCTGTAAATAGTACAGTAATACCCCCCTATCCAAAAGGGAATTGTTCCAAGACCTCTAGTGGATGCCTAAAACTGCTGA
-TAGTACCAAATGCTATATATACTATCTTTGTTCCTATCCATATATACTATGATAAAGTTTAATTTATAAATTAGGTACCA
-TAAAGATTAACAACCGTAAGTAAAATATGGGTTAGTTGAACACAAGCACTATAATACTACAACAGTCAATCTGGTAGCCG
-AGAGGACTAAATGACTAATGTGTGGTAGCATGTACAATATGGATATGGTGCACAATTTAAAACTTGTGAATTGTTTATTT
-CTCAAAATTTCCATGGAATAGTTTCAGACTGTGGTTGACCATAGGTAACCGAGATGCAGAAATCAAAATAAAATCATGGA
-GACGGGGGGAATGACTACTGTATGGAGAGCCTGCTTCCTCCATCACCAATGGGAAAGAAAAATAGAAAACTTCTCTGTAA
-CCTTGTATTTAAAAACTTTTCCTCCATCTTCATTGGGTCATCTCAGAACAAGTAAGAATGGACAGAGGAATACCATGTGC
-TGACTGACGAACGCCTGGGTTTCTGAACCAATTGCCATCAAGGGGATTGGGATTACCATAATTTTTGCTGAGACTAAGCC
-CCACCCCAGTAACCAAAGGTGAGTTCAGTTTCTCTGGTCACTATGGACTGTGTGAGGTAAGATGGGCAGCTATCAAAATA
-GTCAGTCTATCAATAAAGAGCAGGCAAATACGAAGCTAATTGCTCAAAAATAATCATCTTAAGTGATCATCTAAAACTAT
-CTTTCTAAAGGTTTTGTCTATCTGCTAGAAGGAACCAGTTCACTCATATCTGACCTCCTGCCCCTCAGTTTCTCTTTCTC
-CCTCTCTCTTTCAGTGGTGGGAAACTTTCTACTCCTTTCTGTCTCATTGAAACTTTCCTTTTAATGTAAGCTAAGTTTTT
-CTACTCTGCTTTACAGCGAAACTCTGTGTTCAGTCTCCACACATTGCTCTTAATATGTAAAGAAAGGCTTAACTATTTTT
-AATTTTTTCTTTGCTGACAAAAGTTAGCTTTCTAAACTTTTGTTTCATTCAACTTTTAAGTTGTGATTCAGTGACACCTC
-TTATTGTCTAGGGGCCCCTGCCATCCCATGAAAATACATATGCCAGTGACTTAATAAGTAGAGAATGGCAAGGCAGTAAG
-AAAAACAGGTCAACAGGAAATTCAGAATACATGAAAAAAAAATGGGCTGGGCTAGATGGCTCATGTCTGTAATCCCAGCA
-CTTTTGGAGTCTGAGGTGGGAGGATCACTTGAGTCCAGGAGTTCAAGACCACCCTGGGCAACATAATGAGACCCTGTCAC
-TACTGAGAAACAACAACAACAACAAAAATTAGCTGGGCATGGTGGCAAGACCCTATCTCTACTAAAAAAAAAAAAAAAAT
-AGGCACGATGGTGTGTGCCTATAGTCGTAGCTACTTGGGAGGCTGGGATGGGAGGATCACTTGAGCTTAGGACTTCAAGG
-AAGGTTGCAGTGAGCCATGATTCTGCCACTGCACTCCAGCCTAGCCAATAGAGCAAGACTCCGCTTCAAAAAAAAAAAAA
-ATCTATCCCTATCACACCCCTTCCTGGTTTTTCCTCCAGGTACAGAGAATTAGAGCCTTCAAACGCAGACATTATCAATT
-TGGTCCATGTTGCTTAAGATCCAATTGGCTTCCTTCCTAGCAATTATTATAATTTGTAATTATTTGCAATTATGTCATTT
-TTTGTCTGCTATTTTATTGCCTATTTCCTGCACTAGAATGTAAGCTCTATGAGACTTCAACTATATTGTTCATTCACATC
-CCTAACATCTAGTAGAGAACCTGGCATGGAACAGGCTTCCTATAGTTATTAGTTAGATGAATGAATGAGTAAATTTTCTC
-CTCCTAAATTGAATGGTCTTACACAGTTTAGCACTTTCAGGCCCATTATGGTAGCTGACTCTCAGAATGAGGTTACTCTG
-TCTACCAGATAATAATAATAATAGTAATTATTCAACATCAGAGATGTTAAGTGATTTGCTTAAAGACACCCAGTAAGTGT
-GAAATATGAATCTTAAACTCAGGTCTTTCTTTCAAGTCCTATATTCTCTCCATTTTTACTTGTCTTAAAGTTCTCCAAGT
-TTAAGAACCATTTTAGCATTGAGAGATGGTAGAAAGCCTTCTCAAGTCAAAGTGAATAGGGTGAGCCAAATTAGGGAAGG
-CAACAGGGAGCATTCTGGGAGAAATCCAGTGGTGCATTCTGGGAGCCCTTTCATGTACTTAGCCTCATCCAATGCCCAGG
-GAGATGTGAGACTTCCCGCAGCCCACAGGGCAAGCTTTTCCCTGCCTGTGTTTGCCTGCAAAAACAACTACTACTGCCTC
-TAGCAACGTCTGGAACCATGTTCCCTGCATAATAAGAAAGTATAAATGGAGGACACAGTATTGAAGTATTGAAATCACAA
-GATAAGGAAGATTAAATTAGGCTCTGCCTTCCTGAAATGCTCCCAGAGCTAGAGCTACATGGGAGCAAGGCCAGCTACCA
-GATCTTGGGGCTTCTCCTTTAGCAAAGGGGAAAATCCCCGGCCCTGCAGGCATTTCAAGCTCAGGGATTGGTGGAGGCAG
-ATCTGTCAGGAGCCCCGGTAACACTACAAACCAGGAGGGAAGCTGACAGGAGGACAAGCAATGCTGGCATTTTCCTCCCT
-TGGAAATCCCAGGGACTCTAACACCAGAGATCTGAGGCTGATCTGATGCTCCAGCAACTATATAACCTCCACCCTGCCTG
-AACAGCCTCCTACAAATAGGAAACTATAAGATTTGCATTATCTCAGAATAACCATTTGTAGGACTAGAGTCCGTCCATCA
-GCAGTAACTGTTCTTACTCAACCTTGATAAAAGCTTTGCCAGATGAGTTGGGCTCTGTTTAAGTTTACTAGGCCTGCCAT
-AACAAGGTAATACAAATTGGGTGGCTTAAATGTAGTATCACAGTTCTGGAGACTAGTAGTCTGAGATCAAGGTGTTCACA
-GGACCATGTTTTCTGAAACTCTGGGTAGAATCCATCCTTGCCTGTTCCTCGTTCCTAATGGTGGCCATCAATTTTTGGCA
-TTCACAAGCTTGTAGCTGTGCTATGCCAATCTCTGCATCAGTCATCGCATAGCATTCTCCCTGTGGGTCTTTATCTTCAT
-GTGATGTTTTCTTCTTCTTATAACAACACCAGTCACATTAGATGAGAGCACATACTAATGACCTCATCTTAACTTGATTG
-CACCTGCAAAGGTACTATTCCCAAATAAGGTCACATTCATAACTACCAGGGGTTAGAACATCTGCATATCTTTTGGGGAA
-CATAATAACCCACAACAGGCTAATATTACTATATCCACTTTTTGGAGGTAGAAACTGAGGCTCAGAGAAACCAAGAGATT
-TATGTAACATCACTGTGGTGAATCAATGCCATAATGGCCCCAATATTTTTCCTGCCTCTCTGAATCTATCTGTTGGTAGT
-ACATTTCCCTGCTGATGCTGGGCTTGGCCATGTGACTTGCTTCAGCCAATAGGACAGAGCAAGTGTGATGCCAGCAGAGG
-CCTGGAAAGTGCTTATGCACTAGGATTTCTTCTCTTGCATACTCTGGAACACCGTGACCATTGAGTGAATAAACCTAGGC
-TAGCGTGTTAAGTGATGCGTGACCATGTGGAGAGAGACTCCAATCATTCTCATGTCACTATATGAAATCAATCAGCACCA
-GCCAAACCTCCAGCTGACCACAGATGCATGACCAAACCCCACCAAGATCAGGCAAGCTCAACCTGAATCAGCAGAACCCT
-TAGTTGATCCATAGATTCATGAACAATTATGAGTGAATGGTTGTTTTGAGCCACAAAATTTGGGAGAGGTTTGTTACACA
-GAGAAAACTGATACAGTCACATAGGTGTTAAATGGCAGAGCTGGAACGTGTAATCACTATGTGACCTGTTCATACCACAC
-AGTTCTGAATCAATGGGATGGTGATTCATAATTTTCCTGTTGGCCACAACATGAGTTTCCCATGTGTCCACCAGCATCGA
-GCCAATATACAGAGCCTGTAACTATATTAACTTAAATATTTTGCTTTCCTTCTTTTTATTCCTCCTTCTCTAAATTATGA
-ATAGAAAGTTATGAGTTTGCCCTTTAATTATGTGCTTTCTGGCTATGAAGAGATTGACTAAAATCTATGGTGTTAGTGGT
-GAAGTAAGCAAGAAAAGGAAGAGAATGAAGGCTCTGTAGGTGAAAGAACAGTCATCTTAAAAACCAGTCAGTTGGCCCAG
-TGTAATGTAGCATTTGCCTGCCTCAGTTGCGTCCCAGGGCAGACGGAGAGTTTAATCCTTGCCCCTCTCATATGAAATAG
-GCCACCACTAGGATCCTCAATATATTTCTTTTTTTAATCTCTCTCTCTCTTCTGCAGGCTTATGGGTGGAATGCAAGCTA
-TTGGAAGTATTTGAAGATGTGACCAAGGAAGCTATGAGAATTGGAAATGAGGCAGTTGTTTAGAAACGGGCTGATGTGCT
-TGTGGTAAGGTGGAAGGAGGAAGGCAGATGAGGAAAGGAATGTGCAACTGAAGCAATTAGCTGTTACTATGTAACGAACC
-ATCCCAAAACGTAGTGACATAAAACAACAACCATTTGTTATTTCTCATGCGCTTACATTTCTACTAGGAAGTTCTGCAAA
-TCTGGATTGGTCTTGGCTGATCTTGGCAGGGCTTGTTCTGGCATCCACTCTCAGCTGCTGAATTAGCTCTCAGTTCCTGG
-TTCAGGGTGGCCTTGGCTTGGATGACTTGGCTCTGCTCCATGTATCTTTCACATCCTTCCAGCAGGCCAGCTCAAGCCTG
-TTCTCTAGATTGTGGCAAGGATCCAAGGGAAAGAGAGAAAGCCAAAATGTTCATGCCCTTTTTTGAGCCACTTTTTTCAA
-TGAGTTGGCTACTGTCTCCCTAGCTAAACACATCTCAGCCAAGCCCAGAACCAGTATGGAAGGTCACTAACCAAAGCTGT
-GGGTAAATGGAGGCATGGAAATCTGTGACCTTTAATGCAATCATCTACAATAACAAGCCAATGACCATGAAGCTGGACAG
-AGAAATAGATTCCTGGGAGGAAGAATAGCAAAATGTCTGGAGTAAGAGGAAGTAGGGTATTTCAGGGAACTCAGCAAACA
-GTGTGATGACAAAATGAAAGCACAGTCATGCAATCAGCACCTGGGTAAATATTTAGGTTGGAGTCTGTGTTGACCCAGTC
-TGCAGGTAACCCTCAGCCTGGCCCAGCATTTCACTGCCCTCCTACTACTTACCCAGAAACAACTCTCCTGTATTGATTAA
-GCAGGAAAGAGGAAACTCTCCTGGAAGACACAAGGGCAGATCCAAGCAGGAGCTAAGGTTTTCCAGAATGTGGTCTTAGG
-TCTGTGAATGGCTTTTGGACAGAGGCACAGCTGAACATTCCCATGGTTTCTGTGACTTTAGAATCACTACCACCTCTTGA
-CTATGCACCTCTTGACTAATTTCTATTTCTCAAATTATAGAATAAAAAATGCTGATTCTAAGGATAAAAACACAACAAAT
-AATCCAAAAGTATATAAGATGAAAAATAATAGTGTGAGTTCTATTCCATTCTCCAGAGAGTAACAACTGCTCTCAATTTG
-GGCACTTCCTTTCTGTCTTCTTCCTGCACATGTACTTTTTGCATATGTCCTTTGCACGTTCTTAACCATACTTGGGTAAT
-GATGCCAACATCACAAGCATAACTTTCTGACAGCCCAGAAAGCCAACCTTGTCTTCTTCCTTGTTCAACCCTTGTGCCAT
-TTTGCCCTAACCAGAAAAATACTCCACTTGGTAATGATTCTCTCTCTGTGTCTGTGAAAAATAACATTGGAAAGTCTAAT
-GTGGAAATGTTGAACCAGGCTGGGCATGATGGTTCATTCCTGTAATCCCAGGACTTTGAAAGACCAAGGTGGAAGGATGG
-CTTGAGCCCAGGAGTTCAATACCAGCCTGGGTAACATAGTAAGACTCCCATCTCTACAAAAAATTAAAATTAACCAGGCA
-TGGTGGCATATGCCTGTAGTCCTAGCTACTCAGGAGGCTGAGGTGGGAGGATGGCTTGAACCAGGAGGTCGAGGCAGCAA
-TGAGCCATGATTGTGCCACTGCATTCCAGCCTGGGTGACAGAGTGACAGCCTGTCTCAAAAAAGAAAAGAAAAGATACAA
-AAGAAATATTGAATCAAAAAATATAGGTAAAAGTGAAACAAAAGGAAATTTAAAAATAAATATGTATCAATAGATAAAAA
-ATGGTAAAATGAACAAGATGTGGAAAATGTTGTAGTCTCTACATCTGGCCTAATATTTAATCTAAGAATCTAATGCAAAT
-TTCTTACATCATGAATAAATATGGATGATGGGCCTACAGATCAGATACATTTTAATAATGAGCAGACTAAGTGAGGCCTC
-ATACCTCTCATCTCCATGTGTAACCTAATTAATCGGGCCATTTCAGTTGCAGAACACTCACTTCCATAACTGTCTTCTAC
-TTCAGAAGTGTGTGTTTCAGTTAGAATTTGATTTGGGTGCAGATGCCTATGATAGACAATGCAAACAGTGACTTAAAGAA
-ATAAAAGTTTATATTCCTCTCACATAAAAAAAATTTAAATTTAAATAGTGCAGGGCAGATTTAGCACTCCACGGTGCCAA
-GAATATGAGCTTCTTTTATTTTGTTGCTCTTGGCCTTCACTTTATGGCTCAAAATGGCTGCTGAAACTCCAGACATCAAA
-CCTGCATTCCAGCCTGCACAGTAGAGGAAGGAAGTAAAGAAGGGTAAAGGCTCATTTTCTAAGGAAATTGCTCATCAGCC
-TCACACAACACTTCCTCATACACTGCATTAGCCCAATTTAGTCATATGACCACACCTATCTGCAAGGAAAGCTGAGAAAT
-GTTGTTCTTGTTCTCAGGGGAGATGTATGTGCCCAGCTAAAAATAAGGTGTTCTGCCACCAAAGAAGAAGAGAAAGGGGA
-TATTGAAGTTCAAGTGGTAATCTTAGACATATAAAGCCATCAAAATTATTTCCCCCCCAAACCCTTTTGAGAAACTGAGT
-GCGTAAAGATAGATTATGACTGGGCACGTCAAACTTGTTTTAAATATACAATTGGCCAGGCACAGTGGCTCACACCTGTA
-ATCCCAGCACTTTGGGAGGCCAAGGCGGGTGGATCACCTGAGGTCAGGAGTTTGAGACCAGTCCGGCCAACATGGCGAAA
-CCCTCTCTCTACTAAAAATACAAAAATTAGCCGGGCATGGTGGCATGCCTGTAATTCCCAGCTACTCAGGTGGGAGGCTG
-AGGCAGGAGAATCTTTTGAAACTGGGAGGCAAAGGTTACAGTGAGTTGAGATCACACCACTGCACTCCAGCCTGGGTAAC
-AGGGTGAGACTCTGTCTCAAAAAAAATAAAATTAAAAAATGAAATAAAAATACAAATAAATATACTATTTTTTTCAAAGG
-ATAGAAGGAGCATTGTCTACGTTAAATAATGCAGAAGATTTTAACTGATTGCAGCCCAATTTGTTTCCATATCCCCAGAG
-GCCATCCCAACCCAGAGGCTTTCCCATAGAACCGTGGGGAAAGATCTCAATTGTCTACACTCTGGCTCTGAGATAAGGCA
-GCGCTCTCTCAGCCCTTTAAAGGGGGAGAAGGATGTTAGTTCTATTCCTTAGGCAAGAGGGCCTCACCTGTGGCCATTCA
-ACCCCAGGTTCTGCAAGAGTGAGAAGCAGAAAGCCTACTTTGCGTTGCCTCTACCTGAGGAGAAGAAGCCAGGTGTGCTC
-TCAGATGGTCGGGGTAGTGCTTGGGAAGATGTCGGGAGGACCGCGTAGAAAGCTGAGAGTGAGCTTCCCTTTGCTCACTG
-GCTTCTCAGCCAAAAACCGCTGGAGTGGAAGAGGGACATTATGGGCCTGCAGCAAACTCTCTCTCAACCTTCAGTTTCCC
-AATGTATAAAATGAGTATGATGAAACTTGCCTCATAGATTCATTACAAGGGTTGTTTAAAAAACATTTACCAAAGTGCCC
-GCTGTATACCTCCATTTAATGCATGCAAGTTCCTTTCTCTTCTTCCTTTTGGAATAACATAACCTGATTGTAAGAACATG
-TTTCCACAAGACAACATGATGAGAAATGTTTGGCAAGATCTAGAATTGCAGTATGGTAGCCACTGACCACATGTGGCCAT
-TAAGCACTCCAAATGTGTCTATTGTAACTAGGAACTGAACTTTTAATTTTATTTCATCTTAATTCATTTAAACTTAAATT
-TAAAACCTGCTGCTTGATTAGAGTATTGAAAAATATTTAAACGTATTTGGAACAATTTGGGTATGTGAATTTCCTCTTTC
-AACTATAAATCTTACAAAATCTAAACACAGATCGAGTATTCCGAATTAAAATTTAACATTCAAATTAAAATGTGCTACAT
-GTAACAAATACATACAAGATTTCAAAAAATATACTATAAAAAAGAGAATGTAAATAAAGTCATTGATAATTTTTATGTTA
-ATAACTTTCATGTTGAAATATGTTGATATATTGGGTAAAGTAGAATACAATATAAAACTAATTTGTCCTGTTTCTTTTGA
-CTTTTCTGATGTGATGATTAGAACATTTAAAGTTACATAAGTGGTTTGCATTATATTTCCAGTGGACAGTGCTAAGCAGA
-GGATAGCAAATAATCATTTGGATTGAGTCTTCTCACCAGACTGGCTAGTGATTTTGGCCTTGCACAGACATTTCATTAAT
-TAACCGAGCACCTATCCTGAGCTAGGGATAAAGTAGCAGTTGAATCAGAAATAAGCACATAAGCAAACATTGTAAATAAG
-ACAATTTCTGATAATTATCATAAGCAGAAGGAAGGAAATAAAGTAATAAAAGAGAGAATAATTACCCAGAAATGGAGCTG
-GTTTCTTTACATGGGAGGGCAGGCAGAGAAGGCCTCTCAGAGGAAGGACATTTGAGTTGAGATTTGAAGGGTAAAGATGA
-GCTAGAAGTGCAAAAGTTTAGATGAGGGGAACATTTTACAGAAATATTAAATGGTTGTGCTCAAGGTCAGATAGCAAGCT
-GCTAAGTCAGACTAGCATTATATACCCAGACTGATCTGTGCCTAAGTCTGTGATCATATCCATTTGTGAGAGATGCTAAT
-TTCCACTCTGACAAAATTGTTGACACTAATGAACTGCCCTCCCCCTTCCCCATTATACTTCAGCAGGGTATTGGTGGGGC
-ATTTCCCAGTTATATTCCTAAGAGCAGAAATCGAAAACAACAGTTCTATACAGGTAGGCATATGTCATATCTTGGAGAAA
-AGCATCCTTTCTACTCTTTTCAGCCTCTTGACTTCCTATGACAAGAACCAATTACAAATACTGCAGAGCAAGAATCAATG
-AAATAAAGAAATAATGGGAATGATTTCTGAGGACAGGAATTAAATAAGTGTGTCTTTCCAAAGCTATGACTTAATGGGGT
-CAGGATAACAAGCTCCAGGAATAGAAATGTCCTAATGGGAAAATAACGGCAATTCTGAAAGAGGAATAGTGGGGATTTTG
-GTGTAAGGGACTAACCATCATTACAGTCCCATGGGAAGTTATTAGATCTGGAAAGGTAGGCATCCCTTCATGCTTCTATA
-GACCGAAAAAAAAAATGGATGTAATCAGCCATGTCGAGTTACAGAATTTCATAGGCAAACTAATGATGGAGCACCAATTT
-TTTCTCAGACTTAGGACCTCCAATATTTTTCTTTAACTCTGGGGGCTGCTGTGAAGTTACAAATATATGGTATGGAGCCA
-TTTAAGCTCCAGATCTTGACCTTTTTTTTTTCTGATGCTGCTGCTAAGAGTCCAGAAATCTGGTCAGCCTTTGCTTTACT
-TCATAAGAAGAGAAGAGGGCTGAAAAAAATATTCATAGACACCAAAGTGAAGATGGAGAAAGATGACACTGGTGTTACAG
-GAATAAGCCTGGAGCTGAAGTGATTGGGAAGCCCAAAAGGACATCAAAAGTTACAGGATTTAAGACCACAGCCAACGTAG
-CTGTGTCAAAAGAATAATTCAAGTTTTAAAAACTGATTTTTGTTTAATAAGAAAAATTATATGTCTACCTCAGAACTCTT
-TCTTTGGCCCTAGGTTTGTAAATCCAATTTCCCACTTGACTTCCAACCCCAAATAGAAATTAGGATATTTTATTGTCACC
-CCAAATGGAACATGGCTAAAATAGAACTTTGGGGTTCTATGCCTAGCTTTTCCTATCTGGGGAAATTGACACTACTTAGT
-TGCTCAAGGCATACCATCCCACATCCATTTTATCACCAAGTCCCGTTCATTCTGCCTCCAAAATATATTTAGAAACTTTG
-TCTTCACTTAACCTCCAGAAAAGAGGTTAGGGTTAGGGTTTGGGTTAGGGTTAGGGTTCAAGTTGTCATCATCCTATGTG
-GCAGCAACAGTCTCTTAACTGGTGCCCTGGCTTCTCTCCTTGACCTCCAACCCCCAATCCATTATTCAGATAGCAGTCAC
-AAGCCTACCCAGATCCAGGGGAGGAGATATAGACCCCCAAGCTCTCAATGAAAGGAGTATCTGAGAATCTGTGGCCATTT
-TATTCTAAACTGCTGCATTCACTCTTACAGAAATCAGTCTCCATCCTACCTGTTGTAGAGCACTTCTGGCACTCTCACTG
-CTGCTGTCACTGGCCTTGACCAATATGGAAAAAAAAAATCCACACCAACTTCATCCTTTACAACGTCAATATTTTGCATG
-GTTTACCCACAGAAACAGGGCAGGCCTCTGTTGAAACCTTAAGGTTTTAATTCAGTCCAGTTCTGTATGTCTTTATTGTT
-AGCTCTAGTGTTTCAACCATTTATTAGTCAGATGGCCTTTGGCTAATTATTTAGTCTCCCTGGGCCTCAGTTTTTTCATC
-TGAATTAAATGTCCTTGTATCTCATCATTTCTAAGTGCTTTGCAAGTCAGCCAGCTCTATGAGAGTTCAGCCATTGGCTA
-TGCTCACAGGCCATTGACACACAGTTAATAATAATTTTTTAGTTGCATTAGTTTTAAGAGGGCTTGCTTCTATTTCAACT
-TTTCACAGAACATGATGCAAACCTCCTGAGGATCTGAGCTGTCTTGCCTCCCTCCTCCCCAGCATCTTAAATTATTCTTA
-CCAACTTTTGATGCTTTGATTGTTTCCATAGCCAATTTTCTAAAAGCTGCTTTCCTTTTTGACCCAGCCAATTTGTCCCT
-ATGCCAGTTTTCCAAGCAAACCCCTATCTGATTTGGCCTTCTAAAAAATTTCTGCAAGGTCTTCTTTTCTTTCTAACTGT
-TCCAATTTTGTTCTTGAGTCTTCTTATTCAAAAGAGGCTTCTATACCTTTTATTAGCGTACATTTCTAACAAAAAGCAGT
-TTCTCTTGTTTGAATTTTATTTTGCTCTGTGTTAAATGGACAATGCATGCTAAGGCAGAAAACTAAATTCCTTTTACATA
-TTGGAGATTCATTTAAGCTGGGATAGAAGACAAAGATAATAAATATTTTTCAAAACTATTAAAAATTTTAAAAATCAATC
-ATGATTAAATTGCTTACAAAGAGAAGGAATTTGTTTTGTTTATTTTGAAGCCTCTTTTTCTAAATTTTGGCTCTGAAATA
-TATATGACTATATCACACATATATGCAAATGAAAATAATAAAAGTAAGTTCTAATGAAAAGACATTTAGCACATTTAATC
-AAACTAAACCACTTTGAGGCATCAACAATCCAGAGGAGTAAGGCTATGTGTGTGTGTTTTAAAATTTTTATTGCAGTATA
-ACAATGACATAGAAGAACACACAAGTAATAACTATGTGATCTGATGAATTTTCACAAACTTAAAACACTCATGTAACCAG
-CAAAAGGGTTATCTTATTTAAAAAGTCTCACTGATGGGCTCTTGAGAAACACCTGTATAGTTGTCCTACCTTGTTATTAA
-CTTTATGTAAGCATGAGGCTGTCTCTCCAACTCAATGATATATTCTACATGGCCGGATAGTAGGACTGTAGTTTATACCA
-CACATTTTTTCTAACATAGTGGTAGCTAAGTGCCCTGGAATGAGGACACCCTGAGTAAATGAATATGAACTATATCAGAC
-TCAGTTTATTAAACATTAATACACACAAATCTCTGCTCCACATGCTTTCGATTCCTATTTTATCTTCTATATCACTGGCC
-TTTGCTTCTAAGTCTTTTTGCTGTCACCAACCTCACTGACAAATTATTTAATCAATTATTGACAAAATGCTTAAGTTTCC
-TAGAACTCAACTATTCTTCATCTAAACCTCTCTCTGGCCGAGTTCAGTTGGTCCCATGGCTTTAAATAACACCTATAAGC
-TAAAGACTCTTGAGTTATAACCCGTACTACAGCCAATTAATTGCATTTACGGCCCCAATTAATGGCCTTTCTATATCCCT
-CTCATATCTTGACGTGAGCTGTTGCAAAGTCACATCGCAACAACTCACATCAAGAGGTGGAATCTATTTCATTACCCAGT
-GAATCTGAACTGGCTCTATAACTTTCTTTGGCCAATAGAAGGTTGGGGAATACCAACTGCATTACCAACTTTAAGCCTGT
-GCTTACTCTTGGAGCCCTCCGTCTACCATATGATCAAACCCAAGGCAGCCCACTAAAGAATGAAAAACCACATGGAACAT
-TACACTCACTGACAATCAACCAACCCCTGGAAGCAAAGCCATCTAACCAACTTGCAGCTGACTACTGATGCATGAGGTAA
-CTCAAGCAAGACTAAATGAGTCCCCCCAGCTTAACCCAGCTAAATAAACAACCTGCAACCTCATAGGGTAACAAAATAGT
-TATTGTTTTAAACTGCTGACTTTTGGTGTGGTTTGTTACACAGCAATAGCTAACTGATATACCAGCTTAGACATATGTGT
-AGACACGTATTCAACACCAATCTACACTTCCATGTAGACATCTCATAGCCATTAAAAAAATCTATACCAAATTTGATGTT
-TACCCCATCTAAAAACCTCTTCAATGTTTTCCTTTTGAAAAGTGGCCCCCTTATCTGTCCAGTTCTTCAAGCCAAAACTC
-TGGACGATACCATTTAATTCTTCCTTTCCTTCACTTTCCACATTCAATCCATCAGAAAGTCCTGCTGATTCTAATTTCTG
-AATTTTTCTTAATCCATTTAGTTCTGTCCACTCCACTCACATCATTTCTGCCAGTCTAAGCTGCTAGTGTCTTATGCCAA
-CAGCACTACAGTAGCCTCCTGTCTGATCCCTTCTGAACCTCTCCAAACCTTTTTTACACAAAAGCTATTTTTGGTTTAAA
-AATCCTAGAAGATCATGTCGGTTCCCTGCTTAAACCATTCAGAAACTTCTCATCATGCTTAGAATCAAATCCAAGCTGAG
-TATCATGGCCCATGAGACCCTCCATGACCTATTTCCTTTCCTTCTCTCCAGTCTTTCTTCCCGCCACTCTCACTCTTTGA
-CTTACTACATTCCAGCCACATTTGCCCAATTTTTTTTTTTTTTTTTTCTGAGACAGTGTCTTACCTTGTCACCCAGGTTG
-GAGTGCAGTGGTGCAATCCCAGTTCACTGCAACCTCTGCCTCACAGATTCAAGCAATTCTCCTGCCTCAGCCTCCCTCCT
-GAGTAGCTGGGACACCAGGAGCATGCCTCCATGCACAGCTAATTTTTATAATTACATGTAGAGAGGGGGTTTCACCATTT
-TGACCAGGCTGGTCTCGAACTCCTGACCTCAGGTGATCCACCCACCTCAGCCTCCTAAAGTGCTAAGATTTCAGGTATGA
-GCCACCATGCCCAGCCCATGTTTGCCCTCTTGCTTCTCCTGAAATAGCCAAGCTCTTCCTCATCTGAAGGCTTCTGCTCT
-TGCTCTTTAATCTGCTACAAAAATCTCTTTCCTTGCTTCTTGCTCTTTGCCTGGTGTCTTCCTTTACCTCTTTCTTATCC
-CAGATTAAGTCTCGCCACCTTTTGAAGGCCTTTTCTGGCCACCCTGTCTAAAGTGGTCTTCCTGTCCCACCATTTTTCTC
-CATTGTCCCATCCTATTCAGTTCATTGAAAATATTACGATTGCTGATTCTTGGTGTATTTACTTAACAATATGTGTTTTC
-TTGCCTGTCTTTTCTACTAGATTTGAAATCCCATGGGGGCAGGATACCATGTCTACTTTGTTCACTTAGCATCATAAGTG
-CTTTCCACAATTTTTGGCCCATGGTAGGCACTCAGTAAACATTAGTTTAATAAACTAATCTAAGTCTTCCAATAACACTA
-TCAAGTAGATTTTTATTATCCTAGTTTTACAAATAAGAAATTTGAGGGCAGGCATTATTTGTATTACTCATACTCAGAGT
-AGAGAGACAGTACGGTAACCAGGCCAATATGTCAGAGAAGTGGAGTGGGGACATGAACCCTATAGTTCCTATACAAAGCC
-CAATCTTTAATTGCTCAATTCCCATGACTTGAAAAACAAGCAATTGTGCTCTTGAGGGATGGAGTGTTGTAAAGGGATGT
-GAAGAACAGAATGCTCCAACCCAGACAGGTGTTTCCCCCTCCTTGAACTGATGCTGCCACTCCAAGAGTCATATCCTCAC
-CCAATTAAATCCAGATGCAGGAAGGTAGGGATAGACAATAATGGCTCTTCTTCATACTTTCCACTCAGAAAAGAGGAAAA
-TAGTTTCCTGAAGCCTTCAGTGGATATCTAGTTACATTTCATTAGCCAGAATTTGGTTCCACTCCCACTACTATCATTTG
-CAAGGGAGACCAAGATTGCCACTCCTGATTTACGTTCATCACCATTCATCATCACCTGGGCTAGGCTGGTTCCACCCAAA
-TGTATCAAGATTCTGATATCTATGATGGAAGGGAAGAATGGCTATTGATCATACCAGCAACAGCATTTGCCATAGAAATT
-GAATTACTCTAGGTTCTTTTGTCCCACTTTATTCTAGAAAATATGGATGTTATGGATTAAGTCCATGGACTAAGAAACTT
-AGAGCTCAATCTGATGATACTGAGTCTTGAAAAAGTTAGTCTACTCTTCTCAGTAATTGATGAACCCATATGTTGTATCC
-AAATAGTTCCAACCTCCCAGCAAAGCATAAATTTATATACCTGGCATAGAATAACAAAACCACACAACATAACAAGGCAT
-TGTCCTAATGATAAACCTAAAATTGTCCTGATAGATAAATCCAGCCATGTTTTAAATTCAGCACTTTATAAGCAACCTAA
-ATATGCTAATATCAAAATAAATCCCTTTTGGTAAACCTCAGTGTTACCTTGTTCTCTTCCCCATAAAGACAACTTTTATT
-TTCCATAAAATTCAATCTACATATTTCTGTTTTACCAGCAGTCATACAAGAGTTGTTGAAAATTATTTATAGATGAATAG
-AGGCAAGTTTGGCGTTGCAGAGCTGAGCTTTGGCTGCAAATTGGGAGACTGGGTTCTGGTCCTAGAACTTCCAAAAACTA
-GCTGTATGAATTTAGGCAAGTTACTTCATTTCTTCTTTGGTAAAATATGGAGATTAAAAGGATTATATCTGATAACCCAA
-TTGAAACCACTTGAACAATATATTAGTAACGGTAATTGATTCTAGCTGTTACAACAAATGGCCCCCAGATTATAGTAGTT
-TAACATAATTAAAGTTTATTTCTCACCTAACAGTCCAGTTGGATTCATGAGGCATTTTTGCTGTCTTTCCTCCAGGCAGT
-GTTTCAAGAACCCAGCTCCATTCATCCTATGATGCCACCATCCTCAGCATTTGACTTCCATGGCTCCTGTAAGAGAAGAG
-AACATGAAGAACAAAACAGGAGGTTTTTATGGGAGGCATGTCAATTTGACCAGATACTTTGCCCAGAACCTTGTCACATG
-GCCTCTGCCTAAATGACAATGAGGCTAGTGGCTGGGTGTGGTGGCTCATGCTTGTAATCTCAGCACTTTGGGAGGCTGAG
-CCAGGAGGGTCTCTTGAGCCTAGGAATTCAAGATCAGCCTGGGCAACATAGGGAGACTTCGTCGCTACAAAAAAAAATAA
-ATTAAAAATTAGCTGGGCATAGTGGCACATGCCTGTAGTCTCAGCTAGTTGGGAGGCTGAAGTGGGAAGATCACTTGAGC
-TGGGAGGTTGAGGCTGCAGTGAGCCGAGATCACGCCACTGCACTCTAGCCTGAATGACAAAGTGAGACCCTATCTCAAAG
-AAAAAACAAAAAATGAGTCTGGGTAACGTAGCCTGTGAGACCAGAAAGAAGCATCAGGATTGGCGAGTATTAATACCATC
-TCTACCATAAACATTTTTGGAAATATTTCTTTTTTTTTTTTAGAGAAAGGGTCTTGCTGTGTTGCCCAGGCTGGTCTCAA
-ACTCCTAGCCTCAAGCAATCTTCCCAACATAGCCTCCAAAAGTGCTGGGATTACAGGCATGAGCCAACAAGCCTGGCCCT
-AGAAATATTTCTTTCTCTAAATTCAAAGTAACTAGGGGGAATATTAATCTCATTCTAAATATTTTATTTTGTCACTCCCT
-ATCCTTTGTTTTCAAACACCTCACACTACTATTATGTGTTATCACGAGTCAACTGTTTACATGTCTATCTCCAGCTGTTG
-GTTGGGAGCTCACTGAAAAAGGAAACCTTTGTAATTCATTTTTGTATCCTGAGGGCTTAGCACAGAGGCTGGCACCTGTT
-AGACCTAAGAAGGATTGGCAACTCTGGACAAATCAGAGAAGGAGCGTTGTCAACCCTTTTCTCCTGGTGATGATGATGGT
-GATGGTCAATGTCCACTCCCAAATATCTATATTGGGAAGAGGTGGTTTGTAGGGTGAGCATTTGTCTTTTGAGTGTATAC
-TTGAGGGAGGGATGAAATTATGTTTGTTTTATACTCTAGAAAAATTGGCTAAAACAGCAAATGTAATTTTACAGAATGAT
-GGAGAGGGCATACTGAGGTGGGAGGCAAATAATAGAAGGAGATGTAAAACTGTCAACCTTGATCCCCACAGTGATGGGGG
-ATGATGACAGCAGGAGTAAGTTATGGGATGATTGTATGTTTGTGAACCTCAGTTCTTCTGCAGCATGAGCTGGCAGGATC
-CTCTCCTTGACCACCTCAGGTGACCTGCTGGAGCCCACTGGTCTCACCAGGAGAGGTCATCGGGCCACCAGACCAACTGA
-AGTAATAGTTCTTCTTGAGGACAGTCTCTAGCTCCCCCTCTATCCCATCCCACAGTCCAAAAATGCTACCCAGCATGGCC
-TAACCCAGAGTCTACCCCCAAATAAGTGATTCTGCAAGTTGCTAGAATTCAAAGATGCTCACACCCCAGAATTAGAAAAC
-ATCACTGTGGCAGTTTCAGGTTCTCAGCAAGCAGACCAAGAATGCACATGTGAGCTTCCTTTATTTCAAGTTAAGGATGC
-ATTTTCGGTTTTTAAAGTTCAACAATAATAAAATCAGTTGAAAGCCCAACTTCTAGAGCAGTGCTATTCAATATACTAGC
-ACTGGCCTGTGTGGCTATACAAATTTAAACTAATCAAAACTCAACAAAATTTAAAATGCAGTTCCTCAGTGGCAGTAGCC
-ACATGTTAAGAACTAAATGGCCACATGTGGCTAGTAGTCACCTTATTGGACAAGGCAGCTGTAGTACATTTCTGTCATCA
-CAGAAAGTTATGTTGGATAGCATTCCTCTAGAAGCTGCTTCCGTGAAGCTGTGTGCCAGCTTTCTAAGTCAAGTTCTGTC
-GATCCTATTTGGTAGAAAATATGATAAATGTTTTAGAAAATCACAAGAGGACTTTTATTTGGCTGAAATTTAAACATATG
-CATGCAATTTCTTAAAATATATTTTACATATTTGAAGGTTCAGTTCACCTTGGAAAGCCAAATTTCACATCTACAATATG
-AACAAAATTTCAACTTCCTGGAGCTCAGTGATAATTATGGATTATAGGTTAAAAATAAAGTTAATAACTCCTAACAAGAG
-CATGAGCAATGTAAGACTTTTTCCAGGTAACATTAGAAGCAAGAAATAACTAAAAAAGGACATTGCTTATTTTTAAGGGT
-ATTATCTCCAAGTACATATCATTTTAAAGAATAAAATTTTGTGTTATCTTTTTCAAAGCACAGATATTTCTTGTACATGT
-TAACCTTCTAAGCTGCACAATAAGATATGACATCGTTTCTTTCCAAGAAAAGAAGTTAGTTCACCTAAGAGAAAAATGAA
-TCAGCCTGGATCCTATTTTATTATTGGTCCAGGAGAAGCAAGGACCCTACCTGACTTCAGGGAGACCATCTGGGCTAGTT
-ATTAGAGCTGTTTATAAAACCCTGGCTCTCCTTCTCTAGGGGTGTGGGAGGGCTCACTTCCCCACTCCCTAAAGTAAAAA
-AAGGCCACATGACTTGGCTTAAACATGAGTAAGAGTAATGAATGTCTCTTCCAGAAGAAGCATTTAAGTAACTGTGCTTG
-ATTCATTCCCCCTTTCTCTCTACATTGACAGTCATGGAATCCCAAGTTGGAATCTCCATCAGCAGATAACCACTAGTGAG
-GACGATTAAGAAAGGCTCTTTTAATCTACATTGGACACATAGCAAGAGGAAAAATAAACTTTTCTTATATTAAGCCATTA
-TGAGCATGAGGATGTTTGTTACTGCAGTATAACATGGCCTTTGCTGACCAATACCTCATCCAAATCTAGGTCACATGGCA
-CCAAATGGCAACACGGTTCTGAGTCTTTTGTTTCTATGAATACAAAGTGAAAAAGCTATATGTGTACAAATCAAGAATCA
-GATAAAGGTGAAGAATCAAACTTGACGAAAGCAATCCTAGGGGCTGGGCATGCTGTCTCACGCCTGTAATCCCAGCACTT
-TGGGAGGCCAAGGTGGGTGGATCACATGAGGTCAGGAGTTCAACACCAGCCTGGCCAACATGGTGAAACCCAATCTCTAC
-TAAAAATACAAAAATTAGCCAGCCATGGTGGTGGGTGCCTGTAATCCCAGCTACTTGGGAGGCTGAGGCAGAAGAATCGC
-TTGAACCTGGGAAGCGGAGGTTGCAGTGAGCCAAGATCGCACCACTGCACTCCAACCTGGGTGATAGAGCAAGACTCCCT
-CTCAAAGAAAAAAAAAAAAAAAAGCAATCCTAGGTCTGATTTCCTACAGACACTAAACATAGAAAGAAGAAATGGCTCAT
-TCATGTGAGCACAAACAGTAAAGAGGTTTATTTAAACTCTGCTGTGAGCTTGGGCCTCCTTTCCTGCCTGGTTGAATTTA
-AAAATACCATATAGACTGTGTGTACCTAAGATGCTTTTCCTACAAGAGCCTTAAAATTTTCATTTCTCTCTTTCTAGATA
-TGCTGCCAAGAGAATTTTTTTCTTTAAGAACAAATAAACTAAAGAAATTAACATCCAGCTTGCTGAGTCACTTGCTTTCC
-ACTTGAATTTTAACTACAAGGATCTGAAGACAGCCTGTGTTAGGCAGAGAAAGAAAGAGACAGAGAAAGAGTCAGGGAGA
-AGAGAGGAAGAGAGATGTAGCTGGAGAGTCAGGGAGAAATTCAAAGAGATGGAGAGAGAGACTGGTTCTGGAAAGAAAAG
-ATAAGTTAAATAGAAAAAGGAAAGTAATCTTTGAAAGGTTTGTTTAAGACATGTATTTTCTTACTCTGTAGTGGGAGCGC
-TGAATAAAAATATTTAAATAAAAGCTGTAATGTGATTAAGGTTTGAGTTGGGGTTTAATCGTGGAAAGAGCAAGGTATTT
-AGAGTGAAAGATCTAACTTTTGTATTTATTTTTCATTTTTTAGTGTTTTCGCTTTTTTAATCCCAGGTCCTCTACCATTG
-ACTATCTGATGTTAACAAAATCAGTTCGCTTTTGTGTCTTGGTTTCCTCATCTATGAAAAGGGAATAGAAAAACTTACCA
-CATAAGTTGGTAGGGAAGACACAATTCTATAAAATATATTGGATGATCTGTGAAACCACCTGACACCAAAAGGGAATAAT
-AAATTCCCTTCTCTCTTCTTTTTCTACACCATCTCTTTTTAATTCTACCAGAAAGTTCCTTTCTCTATGAGGCTTCTTGA
-AGACTGGCTGTATACAGGAAAACTGTATTTCTAATTCTGCTATTTATTGGAATACTAGGTCAAGTTTTTCCTCCTTCTTA
-TTCTATTTAATCTTCACAATAACCCTACATGAGTTTATCTTCATTTTACAGAGAAAACAGAGGCTTACAGAGGTTAAAAA
-AAAATTCCCAAATCCACACAGATAGTCTTTTAGTAATCTATTGCCATAATAATACAGTATTGAAATTTCCCCCAAATTCG
-GCAGCTCACAACAACCATTTTGTGTGACTCATCAACCTGTGGGTCAACTTGGCCGTTCTGCTGGTTGAAGCTGGCCTCAG
-CAGGACACACTCCTGCAACTATAGTCATCTGGGCTTTGGCAAATCCCTTTAGTCTATAGCCAAAGAGCAATAAGTGAGCA
-GCAAGAAACTGAATTATCTCTGACCCTTTTATTAAATAAAATGCTGATCTTGGGCCAGCTAACTAACCTTCCAGAACCCC
-ATGCCAAGGCTTTCCTTTGGTCCAGTGCCTTAAACCCATGCAGTCCTGGGGTAGAGAAATGAGGAAGCCCATAATTCTGG
-CAGAAAGGCTGCCTCTCATTCCCAAATACCCCTGAGAGAGATGAATGATAGCAGGATGGAGCCTGCCAAGGGCACACAGA
-CAGGGCATACAGAATCGTCCAACCTCTCACCAATTCAAGGGCAGGGCAATTAAGAGGCCAGAACTCACCACAGCTAGAAA
-TTATTTACGTTAATGCTTTAGCACAATGTGGTCCACTAACCAGCAACATCAGCATCACATGGGAGTTTGTTAGCAATGTT
-GACTTTTGAACTCCATTCCAGACCCACTAAATCAGAATCTGAGAAGCACAGGTTCAGCAAGAATCGCACCAGGAGTATAC
-CACTGGAAAAGCATGTGTAGCCAGATTTACTGTATTAGATGAATTAACGCTTCAAGGCCCAGCACCTTACTGAGTTTCTG
-ACCTCCCACCCAAGCACTCAATACTTTCCCCTGTCAATTGGCCCTGCTCTCTGGGATGAGTGCCTGGTATTTTTGCTTGC
-TCCGTATGCATTTCCTTCTTGTTTGCCTCATTCTGATTTTTCCTTGAAAGGAGTTTCCTTCCCCACTCCTAGTCGATGTG
-TGTCAGGTTGACTTATCATGGCTTCTGGGAATGAATATATGACCCAGGTCTGACCAATTAAAAAAAGTAGGGATTTTGCT
-GGAACGATTGGAAAAGTGGCATGTTCTTTTCTGCTGTTGATGATAATTGGCTGAGTCTATCTGAGAATGAAATCAACACA
-GAGATGATGAGAGATAAGTTCCTGATGACATTGTTTGAGCACCTAAATCCAGCCTTGCTTGAAACTATAGATCTGATTCC
-AGATTTTTTAACTGCATACGCCAATACATTTCCTTTTATGCCTAAGTTATTGTGGTCTGGTTTCTATAATTTGCAAGCAA
-AATGGTCCTGGTCTGCAAAGCCACCCTATGTTGTAAGCTTGATGCCCCCCTCACAAGTTTTTGCCTCAACTTCCTGTCTC
-TCTTCTGTTTCCAATCACCTGTGACAGTCATTTTCCAATTTCCAAATTACGAAATTTTTACATATTATATTTGCTGTCAT
-AACACAAGTGGGAATTGACCCCAGAGACTTGGGATAGACACAATTCTTCAATAACATAGAATAGGCCTGAAGTGCTCAGT
-TCTGTCTAGAAGCTCACTACTCAAATATATACTGTGGGGGAAAGTAACCGCCTGATGGTTAAAAGGCTGGCCCCGTATTT
-CCTCCTCTTCCTCAGTTTCCTCATTCATGAAATCAGCAGACATTTTGGAGATTTACTTCAGCCCAGACTTTCTAAGACAC
-TCATAGTTAGGGGTTCCTGGTTTAAATAGATTGCGACAACTTAACATGCAGCTTAACATGAAACACAGATGGCAGAAAAA
-TAAAAAGGTGCCTCTATCAGTTACAAAGAAATTGGTTGGGCGCAGTGGCCCACGCCTGTAATCCCAGCACTTTGGGAGGC
-CGAGGCGGGTGGATCACCTGAGGTCAGGAGTTGGAGACGAGCCTGGCCAACATGGTGAAACCCCATCTCTACTAAAAGTA
-CAAAAATTTGCCCGGTGTGGTGGTGGGCGCCTGTAATTCCAGCTACTCAGGAGGCTGAGGCAGGAGAATCACTTGAATCC
-AGGAAGTGGAGGTTGCAGTGAGCCAAGATCATAGCACTGGACTCCAGCATGGGCGACAAGTGGGAGACTCCATCTCAAAA
-AAAAAAAAAAAGAAAGAAAGAAAAAGATTGGCTAGACCCTGTGTGTGGCATGACATCCTATTCCAACTAAACACAATGTT
-CTATTTTACAAATAAGAAAACAAGCTAAGAGAAGTTAATTGGTTTTCAAAAAGTCACACAGTACAGACATAGCAGAGGAA
-GAATGAGAACCTACAGCAGAGTTGAGAAGGTTCAACAGAATAACGGGTCATGTTTGGGCACTTGTATTCTGGAGCTGGCA
-CCTGGGTCCTGGCACTTATTAGCTGAATGTCCTTGGGTAAGATATTTAACTGCCCTGTGTCTCAGTTTACTCATTTGTTC
-AATGGGCATTATAATAGTATAAACATCAGAAAGTTGTAGGGGGTTAAATCTCTAAAGTGTTTAGAATGCTTGCAACTTAT
-AACATTTTATATGTGTGTTTATTAAATAAATAAAAATAAATCTGACTTCATGTCCAAAGTATATTTTTCATACCCTGCAG
-CTGTCCTGTACCAGAAATATCTCTTCCCACAAGATCTCTTTAACGACCTGGCAATGTGTGTAAAACCTCACCTTACTCAA
-TTCTTAAAATTACTCTGATTTTCTAGCTTGGTGAGAAGTCTCTAAATGCTTACTATGAATTAGTTACCTGATAATCTATC
-CTTAGTAGAAGCTATCTGCCGCAGCAGATTAGGTCACTAGGGCTTCTTGAAGGGAGAAAGGAATTAGAAAAAAAGCATCG
-AGTGGATGGAAAGAACCAGAAAGAAACAAACAAGGCAACACCTATTAGTTTATTCATGGTTGACCCAAGGAATAGATTGA
-AATACCAGATGCACCTGAAAAATAATTTTTTCTCACTCTGGCACCCAAGCTGGAGTGCAGTGGGCTGGGTGGAGGGGGGA
-GGTCATGGTTCACTCCAGCGTCAACCTCCCCAGCTCAAGCGGTCCTCCCACTCAGCTTCCCAGGTAGCAGGGACCACAGG
-CATGTGCCACCACACTTGGCTACTTTTTTAAAAAAATTTTTGGTAGAGACAGGATCTGACTGTGTTCCCTAGGCTAGTTT
-CAAACTCCTAGACTCAAGCAATCCTCCCGTTCGGCCTTCCAAATTGTTGGAATTACAGGTGTTAATCACTGCACCTGGCC
-TGATTTTTTAATTATCAAATCATGTTCAGAACTCACTTCAATCCAATTAACTGAGGATTTCTGGAAAGGTTACCCAGGCA
-TCAGTATTTTTTCACTGTGATAAAATACATATAAAATGTACTATAATAATTTACTTTAATAATTGTCTTGACAATTTTTA
-AGTGTAGAGTTCTATGGAATTGAGTACATTCACATGGCTGTGCAACCATCACCACCATCCATCTCTAGAACTCTTTTCAT
-CTTGCAAAACTTAAATGCTGTGCCCGTTGAACAATAACTTTCTCTTTTCTCCATCTTCACCCTGACAACCACTATTTTAC
-TTTCTGTCCCTATGAATTTCACTACTCTAGGTACTTCACGTAAGTGAAATCAAACAATATTTGTACTTATGTGACTTGCT
-TATTTCACTTAGCATAGTATCCTCAAGGTTCATCCACGTTGTAGTATGTGTCCAAGTTTTCTTCCTTTTTAAGGTGGAAA
-ATATTGCATTTTATGTATATGAATTTTACATATCCATGCCTCCATCGATGGACACTTGGGTTGTTTCCCTCTTTGGCTAT
-TGTGAATAATACTGCTATGAACACGGTGGGCAACTCCCTCTTCTAAACCTTGCTTTCAATTCTTTTGGATATATACCCAG
-AAGTGGAACTGCTGGATTATATGGCAAATTATTTTTAATTTTTCAAGGATACATCTTACTGTTTTCTATAGTAACTACCA
-TTTTACACTGCCACCAGCAATGCACAGGAGTTCCAATATCACTACATTTCTTTCAATACTTGTTATTTTCAGGTTTTTTT
-CTTAGTATCTATTCTAAGGGGTGTGAGGTGGCTTCTCATTGTGGTTTTGATTTGCATTTCTCCAATGATTAGTGATATTG
-GACATCTTTTCATGTGCATATTGGCCATTTGTATATCTTTTAGGAAAAATATCAGTTCCAATACTTTGCCCATTTTTGAG
-ATGGGTTGTGTGGTTGTTGTTGAATTATAGCTTTTTATGAATTCTGTATATTAATTCTTTATCAGATATGCTATTTGCAA
-ATATTTTCTTCCATTTTGTGGGTTGTCTTTTCACTCTATTAATTATTTCCTTTGATGCCTAGAGATTTTTATTTTTGATG
-TAGTCCAACTTACTTTTTTTTCTTTTGTTGCCTGTGCCTTTGGTATTTCCACTTTTTTTGGCTATTGGACATAATGCTGC
-TATGAACATTTATGTACAGGATTTTTTTGATGGATATGTGTTTTCAGTTCTCTTGGGTTTATGCCTAGAAGTAGAACTGC
-TGCATCATATGGTAGCTCTGTGTTTAAGTTTCTGAGGAACTGCAAAAATGTTTCCAAAGTGGCTACACCATCTTATACCT
-TACCAACAATAGATAAGTGTTATATATTCTCCACATCTTTACCAACACTTGCTATTTTTCATCTTTTAGATTAGAGATAT
-CTTGGGGATGTGAAGCAGTATCTCCTTGTGGTTTTGATTTGCATTTCCCTAATGACTGATCATGTCAAGCATTTTTCATG
-TGTTTATTAGCCATTTGTAATCTGCTTTAGAAAAATAATTCTTAAATTTTTTTCTCATTTTTAAGTTGTGTTGTCTTTTT
-ATTGAGTTGTAAAGGTCCTTTAAATACTCTGCATAGAAGTCCTTTATCAGATATATGATCTGCAAATATTATTTTCCTTT
-TTGCTTTTTGCCTTTTCATTTGTAAAATTGTATCTTTAGAAACACATTTAACTTTTTTTTATTTTGAGGAAGTCAAATTT
-ATAATTTGCTGTCATTTGTATTTTGGTGTTCAATGCCTGATCCAGGGTCATAAAAATGTGCACATATGTTTTATGCTAAG
-ATTTTTATAGTTTTAGCTCTTAAGGTTTTGATCAATTTTGAGTTAATTTTTTTCTATGATATGAGGAACTGGGCCAACCT
-CATTCTTTTGCAAATGAACCTCATTCTTTTGCATATTTTGCAGTTTTCTGAGCATCATTTGTTGAAAATACTGCCCTTTC
-CCCATTGGTCTTGGAGCCTTTGTCAAAAATGATTTGACCATACTATATGCAAGCATTTATTTCTGGACCCTCTATTCTAT
-TCCATTGGTCTGACTTTATGCCAATACTACACTGCCTTGATTATGAAGCTTCATTGTAAGTTTTGAAATCAGGAAATCTG
-AAACTGCAACTTTATTCTTCTTTTTCAATATCATTTTGGTTATTTAGAATCCCTTGAGATTCTATATGAATTTTAGAGGG
-ATTTTTCTATTTCTGAAAAAAAATGTCAATGAGATTTTGATAGGAATTGCATTGAACCTATAGATCACTTCGGGTAAGTT
-AGTTTTTCTATATGGTGTGAGAAACAGATACGCCATTTTTTTGCATGTGGATATCCAATTCTTGCAGCACCATTTGTTAA
-AAATACTATTTTTTTCCACATTGAATTCTGTTGTCACCCTTGTCAAAAAATAAATTAATCATAAATGAAAGGGTTACTTC
-TGGACATTTAATCTGATCCCAGTTATTTGTTTTTATGTTGGTGTCGTAAAGTCTTTATTACTATACCTTTGTATTAAGTA
-TGGAAATGCGGAAGTGTGACTCTTCCAACTTTGTTCTTCTTTTTCAAGATTTTTTGGCTATTCTGGGTTACTTGCATTGC
-TATATAAATTTTAGAACCATACTGTTTATTTTCCCAAAAACATTTCTGGGTTTTTCAGTAAAGTTTTTGTTTTGTTTTGT
-TTTGTTTGTTTGTTTGGAGATGATGTCTCGCTATGTTGCCCAGGCTGGGCTTGAACTCCGGGACTCAAGGGATCCTCCCA
-CCTCAGCCTCTTGAGTAGCTGAGATTACAAAGGTGAGCCACTGTGCATAGCTGGGAAGTACAATTAATGTGATAAGTTTT
-TAAAATCTAGTTCAAATTAATACAAACTTGATTTTGATAGTACACCAAAACTTTGCTCTGACATAGCTCTATTCCCTCCT
-CCCTCCTTGGTGCTTTTATTTTCATACAAATTACATCTGTATACATTATAAACTCATCAACATAGTTTTACAATTATTGC
-TTTATGTAATTTCGATCAGATAGGAGAAGAAAAAAATACAAACCAAAATAACACAATAAAGCTGGCTTTTATATTTCTCT
-TTGTACCTACCTTTACCAGTACTCTTTATTGTTTTATGTGGATTTGAGTCACTGTCCAGTCTCTCCATTTCAGCTGAGGC
-ACTTCCTTTAGTACTTACAGGGAAGGTCCGTTAGCAACAAATTATTTTAGTTATTGTTGCTGTTTTCCTTCCTTTTGAAG
-GATAATTTTGTTGAATATAGACTTCTTGGTTGAATGTCTTTTTCTTTCAGTACTTTAAATATGAGCATGTCATCCCACTG
-TCTCTGTGGTTTCTAATGAGAATCTTAATCTTATTAAGGATCCCTTGGACATAATGAGCCATTTTTCTCTTTCTGCCTTC
-AGTATTTTCCCTCCATGACTTTTAGTTTTGATTGTAATGCACACAGATGTTGATCTCCTTAAGTTATCCTACTGGAGTTT
-GTTGAGCTTCTTGGGTGTTTAGATTAATGTTATTCCTCAAAATTTTGTTAGTTTTGGCCATTACATCTTCACATGTTCTA
-TTTACCCATTTCTCTCATCTCCTTTTGGTTTTCCTTTATGCTGACTTGGTATGCTTGATGATGTCTCACTGATCTCTGAG
-GCTTCATTAGCTTTTGTTCATTCTTTTTCCATTTTGCTCAGACTGAATCATCTCAATTGATTTATCTTTGAAATTGCTTG
-TTCTTTATTCTGCCACCTCCAATATGTTACGGTGCTTCTCTAATGAATTTTTTTATTTCAGTTATGATATTTTTCAACTT
-CGAAATTTTTATTTGATTATTTACAATACCTATTTATTTATTGATATGCTCTATTTTGTGAGACATCTTTCCCATATTTC
-CCTTTAGTTCATTGGACATGGGCTAGTTCATTAGTTCTTTAACACATTTATAAGAGCTGATTTTAAGTCCTTGTCCAGAA
-ATTCTAATGCCTAGGTATCCTCAGGGACAGGTTCTCTTGACTGTTTTTCTCCTGCATATGGGCCACATTTGTTTGTATGT
-CTTAATATTTAGTTAAGAACTACACATTTTAAATAATATAATGCGGCAATTCTGGAAATCAGATTTCTACCTTCATCCCA
-CAGCATTTGTTACTGTTGCTATTTGTTACTACTGTTGTTACTGTCCCTAGTAACAATTTTTGTCTTAAATTCTATTTTGC
-CTGATATCCACTTTATCCAATTCTCTTTGATTATTTGCATTGTATATATATTTCATCTTTTTTTTTTTCAATCTATTTGG
-GGGAGTTTTGTTTGATTGTTGAGTGATTTTGCTGAACTACTTTGGTAAGTCTTCTTTATTGTGTATGGCCCTGAAGTCTC
-TACTCAGCTAATTTAATGTTCAGCTCATGTTTGGACAGAGATTTCCCTAAATACCTTGCACCAATAAGGCTCACAGTCTT
-TGCTGAGAAGTTCTGTGTATGTATTTTTTGGAGTACTCTTTCAATGCTCCACCAGGCAGGTTACAAAGCTGCCTTAGTCT
-TTGCTTCCTGATGATGCAGTCTCAGGTTATGGAGAGGTGAGAGAAGAGGGCCTTCTCAGATTTGGGGCATGCACCCAGCT
-TTCTGCATGTGCATGGCTTTCTAGATTCCCAGAAATACGTGAGAACTTTTGAAAACACCCTATGAACATCTCAGTTTCCA
-GCATTTCCTGTTATGATTTTTGGTCAACTTCTTATTTGTCCCAGCTGTTACCACTGCCTCAGGCAGCTGCTATGTGAAAC
-ATTTGATGCTGATTGTTTTTGACTAATGCTTTGGGGAGATAATGTTTATACTATGTGAGTTCTAAGTTACCTCAAATAAA
-GATAAGCTTCAAGAGTGGTAGTTTTTAGGGAACTTTTTATTTTTTATTTTTACTTTTTTTCTTTCCAACTTCTATTTAAG
-ATTCAGGGGGTACCTGTGTAGGTTTGTTGCATGAGTAAATTGCATGTCATGGGGGTTTGAGGTATGGATTATTTTGTCAC
-CAAGGTAATGAGCATTGTACCCAATAGGTAGTTTTTTGATCCTCACCTTCAGGAAATTTTCAGACAAGTTAAATAGTGAC
-AATTCTCTCTGGATGGGATTCTGGGGAGCTCCAAATCAATTCTGTTACCCTCCAAATGGCATGTAGGTCCCTGGTTTTCA
-AGGTTGCTATAAAGCTGCAGAAAGGGGAATGGCAATAGGGCAAGTTAAATGCCACAAAGTTTCTTGTTCTTACCCAAAAT
-GTAGACATTTTTCTTGAATAAATGCTCCTCAGATTGTTGCAAGCCTTTGGTTAATTTCCAGATTTCTAAACAAAAAAATT
-ATTTTAACAATTTTTGCTAGTGTTCTTGTTGCTTTTATGAAGGAATAGATTTTCAGAGGTCCTTATTCAACCATCCCCAA
-AGTGGCTCTTTCATAATCATAATTTTATTATTAAAATGTTGGCTCCAACAGACCTCCTGACCAGATGTCAGCTCTCATGT
-CTCATATTTCCATTTTAATCTCAGTATCTTTCCTTAACATTGCCTAGAAAAACACAGGGGTTAAAAATACATTTCAAGGA
-ATCTTTCTTTTCTCCACTTTAAAAATCAATACCGTTTTGTTATACTGAATAAGAAAGGTTATGGAGTTTCCAAAGCATTA
-TAGGAGAGGACATTGAAGACAGAATTTTGCAGCCCACCCAAACCAGGAGAGCTTGCATAAAAGCTTTTTGAAATAATTTT
-GTTACTGCCATTCTTTTAAAGAAGAGTAACACATTCACAGGAAAACAATAATGAAGATTGTTTAAATAAAATAAAATCTT
-TTTGCATCTTACTCATTATCCTTCCCAAAAGTAACCATCTTTAAATACTTCCTCTTCAAGTTATCTTTGGTGTTTCCAAC
-CTTAATTTTAAATAATATCTTTTTATTTCTTGATTTACCAATTTTAAATAATATATAAACATCCTTTATGAAAAAACTGA
-GAACGTTATCTTGTTGGCTCTGTCTCCCTTATTACAACCACTGAACTTTGGTACTTCTATTACTTTTTGGGTTTCTGTTG
-GCTAACTTTAAAATAATACATATAACTTTATATATGATTATACCATCAGTAAACTTTATTTTTCCTTTTATGAACTTTAT
-ACTGATTATTTTAATCCTTTACCATATAAAATGAGTAAATTGCGGTGTCTGCATTATAAAGTCTCTTTACATTGCCCCTC
-CTAAGCCCTCTCCTTTACTTCCCACATCTGACAGCTCTCTCACTACTTCTATATGTTAGGTCCCATAATATTCAGATTCT
-GTTTGGTAAATATTAAGTCATTTATTCTTGGTCTACAGTTTAATTTAAACTTCAAAGATCAAAAAAGAGCATTTACAGCT
-TATGATTATATAGATAGTATTTATTGCAGAACCAGGTAGGGTGGTAAAACTTTAAAGAAAAAATGTCTCTGTGGCACTAA
-ATTTTCACACCAAAAAAGAAAAAAAAATTGAAGATAAAGGACAAATAAAAAATATTTCCTTAAACGCCATCAAAAAATGC
-TCAAAATTGTGTCGTATAATTGACTTCAGATTTGAACCAAAAATATATGATATAGCTTTTGTTTTTCCTGTCATTATAGG
-GGCATTTTCTTGTTATTACTGATAGGAGATATTTATGCCATTGTCTGGTTAATACTATAATTAGCTTTTAAACTATACTA
-TTTGTCAAACTAATTTTACTCTGATTTATTACCGTATCTGTTTCCTAGCTTTGGTCCTAGGAAAAAAATGCTACCTTAGT
-TCTAATATTTCCTAAGTTCCTGGTCTTCCTCCTTTGCATAGATTCCTTTGTGAGTTGTATTGTTAAGGTAAAATCCTTAG
-AAAATATTTTTATTTGCAAAAAATGTTCATGGGAGGTAATTGTCCTGAGTCTGTCCACATCACATCTAGAAATGTTTTCA
-TTTTGCCCTTCGCTCTTTATTAATATTCTGGCTTAATATAGACTTATAGATGGAGATTTATTTTTCTTGCTGTATTTGAA
-GACCTGTTCCATTGACTCCTACCACCTGAATTTGTTTTGAGAAGTCCAATTTTGCTGTAATTCTTCCTCCTTTGTAGGCG
-ACCACCTCTTTCTTCTCTATGAAGCTTGTAAGAGCTTCTTTAGGGAAAGTGGGAAAATATGCAAAAAAAAAGAAGCATAC
-TCATTATGTGGTACTACTTACAGTGAACAATATTTACCTAGATATATTCATGGCAGAGTGACTATTTAACACACAGTTGT
-GTTATTGACAGGATGGGGAGAAGAAACAAGGGTGATGTAAGAGAGCCTCATTATTAGGAAGTCAACTGATGTCTATTTTA
-TAAATCAAGAATTAGCAATGTCTGCATATTATTTGGAAACAAAAAAGAAATTAACCAAAGCAAATGCAAATGCCATTGAA
-AACCATTGCCTCTGGGAAATATAATATAGATGTAGCTATAAACACATATATAATGTCAACAGGAGAAAAGTGCTATGAAG
-AAAAATAGTGCAGGGTAAAATAATTTTAAAAAATAGAGGTTAGCAACTTTAGCGAGTTTAGATTGTCAGAGAAGGCTCCT
-TTGTAAATGTGGCATTTGAGGAGATGAGACATGAGACGATCTGGGGGAGGCTATTTCAGGTAGAAACACTAACTAGTGCA
-AAGGTCTTGAGATAGGAGTGTGCTTGGTTGTTCAACGGACAGCAAGAAGGCCAACGTGATTGGAATGGAGAGGTGCTGGG
-AAATGAGTTCGGAAAGGTGGCCAGGAGCATGATCTTGTAGAGTAAAGGAAGAACTTCTAAGTGTGATGGGTGACATTGAA
-AGTTTTAGAGAAAGGAAATATGATCAGATTTGTCTTTTAAAAGTATCACTGCAGCAGCTATGTAGAGGAGATACAGGTGC
-TAGAAGACAAATTAAGAGGCTACTGTAATATCCCAAGAGAGAAATGATGGCGACTTAAACTAAGGTGGTATCCGCGGAGG
-TGCTGAGGAGTAGTTGGATTTGAAAAGTATTTTGACAATAGAGCAACAAGTGTTATTTATTATGTGTGAATATAAAAAAT
-ATCCTTGAAATAATATAAGATTTTCATCCTCAGGGACTAGGAATGTCAATGCCGTTCGCTAATATGGAGAACTAAGATGA
-AGGGAGCCTCTTGAAGTTAAAAAATCTGAAATCTGCTTTGGATATGCTAAGTTAGATGTCCATATTTGCCTTATGCTTAA
-GTACAGATATTGAGTAGAAACTTGTGCATACATGATGCAGTCCAGGAGCAAAATTAGGGCTGAATATGTAACATAAAAGC
-ATCAACACATAGACACTACCCAAGGCCTTGGAAATGGATACACTTACCAGGGAATGATTATGTAGAGAGGAGAGAAGTTC
-CAAGTCTTGAACGCTCGGAGTTGAGAAAATGAAAGCAAAGCCAGCAAAGGAGAGTGAAAATAAGATGCTTGTGAGTATAC
-TAGTTTGGAAGATGGGACATCATGAGAAAATGTTAATTAAGAATGTAAGAGGCGAAGTAGATTCTTGCAGAGTATGGAAC
-CAACTTATGCATATATATGTTCAGTTTGAGGTGCCTTTGATTCAGCCAGATAAGAGTGTTCATTAAGAAGCTAGGAATAT
-GACTTTGAAGCTCACAAGAGTGAGTGAGACTGGCAATAGGAAATTAAAAGTCAAATATATAAAAAGATGGTTAAACTCAA
-GGGTATGAAATCAGATTTTTTGAAGACAACATATGAAGGAAGATATAGAACACTGAGTCTCTTGAGGTACCATGGTCAGT
-AGAGAAGGCTGAAAGACCAATCAGAATTCTGCATTTTCTGATGTAGAATTTAGAGTAGGAAGTTTTCAGTACCTATTCTA
-ACTCCATTACCAACTGGCTGCATGGTATAAGATAATCATGTATTAATTGGGAATTAAAATAATAATTACTATTATACATA
-CCTCAGAGAGTTGTTGCAAGAATAAAATGAGATCATGTGTGTGACAGTTCTTTGCAACTTTCGTATTTCTTTAGCACAGA
-GCTATATAAAAGAGAGCTATTTAATTTTTTTCTCTTTGGCTTAGAGCACAGAAGCTTTCAGGGTGGAGAGTCAGGACAGG
-TTCTATGGACATATGGAGCTCCCAGGGGGGCTTGTGCAGGACTCAAGGAAATGTCCAGCTTAACCTGCTGGGCACAACAA
-TTTTGCTGCTTCAACCCATCTGCTATGGAAAATGAGGAGCCAACAAAAAAGGGAGAAACAGAGGTGAAGGCACCTGATAA
-TGAAAGCTTTAAGAAAGGGAAGGGGTAAGTACATGCCGTCAGGTGAACCCAGAAGTCAATAAAGATGAAAAGTCCTTTGG
-ACCATGACCAAGAGATTATTGATGCAATCTGCTGATGTCTTAGAATGTGCCTTGCCTAGGCTGGTGCCTGTGAGCTGGCA
-GAAGTGTGATGCCCTTCTCCGCTAGTATCAATAAAATCGCACGAGATATTCTTGCCCCATTCCCAGGTATATCCTGAGTC
-ATTCATTTCAACCCAGCTTAACCCCATCCTCACCCTCAGAGTTCTTCACCCTTGGAATCAATTCGTGTTGAAGACCTCAT
-ATCATCTGCCTCAAAACCACTGATCCACATTGCCATTCTGTTCTGACCTCTGGCTGACTTGCTTAGGTATATTTTGAGAG
-CATTTTCTGCCCTGATTCTTATTTAAGCTGTTTATTGGATATTGATCTCTGAATTCCCTCCTTGATTGTAATTTGAACTC
-TCTTCCTTTGAATATGTTGTTTCTGTTCACCTCAGGTTAACAGCCTAGACTTCTTTCTTGAAATTCGCCACAGCGAAACC
-TTGTGATTCAGCCAACCAAACCAGTAATTCATACTCATCCCTCTAGCAAACGAAACCCTGAAGTTGCTAATGAGAAAAGG
-CATATGCAAGCCACAGTGTGTTGAGGCAGAGAAGGTAGCTGCAGAGGGCAGAAAGGAGTCTGATGGAGCTGGAGGAGGCT
-GTACTAAAACATAGTGATTATGAGCTTGGGCCCTGGGGTTCAAACCCCAGCTATCCCATTTCTTAGCTGTGTCCTTGGCC
-TGGTTATTTAACCGCTCTAACCCTCAACTCTCTACTCAATTTTTCCTAGACCCCAGTGCTAAGCATATGGCAGGTGTTCG
-ATATTGAGTAAATGAATAAGTTCATATAGATGAAAAAAACAAGGCCCAGTATGATTGATACATATCTAATTAATAGCTAA
-TGAAAAAAATGGCAATCCTCCATATTAAAGCCAAGCTACATGTCATTTCTTAGAGAAATAAAGTTAAAGTCTCATCAAAA
-TGATAGATTTTATTTAGCCAATACTTCATAGTGCTAGACATGACACTCAGTGCTTCATAATTTCCTTGTGTATTTGCTAT
-AATTATTGTCTCCATTTTACCTATGAGATAATTGAGATACAAAGAGGTTACAGAACTAATATGATTCCTAAAAGATTTAC
-TCAAGGAATACTGTGATCCCTAACAAATAGCCTTTTTGAAGTGTACTAATTTGGACTACCATTTTCTCTGCCTCTCTGTT
-CCTAATTGTCACAGGTTCTTCCTCCCTACTGGACCACAGGCGTGTCTCAGCATTGGGAAGGGTCCTAGGATGCATTGTAA
-AAGAAAGTCTGTAATTTTGGTGCATCAAGGAACAAAAGTGTGGAAACATCCAGCCTGTGGCTGCTGGACACTCCCCTTCT
-TCCTTCTCACCATACTGTCTGTAATAAAGAATAAAGTGTTATTTAATATTCTGAGTGTACAGTCCTATTTTTTCTTAACC
-TGGCAAACCAGAAACAGCAACTAATATTCCTGGTTCTCTTTTTACCTTTCACAAGATCTATATCTACCTTAGAGGCTTCA
-GGGAACAAGAACAGCCTGGATAGTTTAAACCTAGAGTTAAACTACTCGAGGCATTTTAAGGTACCGCTACTTCACTATAT
-ATAAATGGGGTGGGGGGCTGGATTAAGGGCTAGAAGAATATATGAAGAGAAAGTGGCAAGCAAACCACTTGGAAAGCAAA
-CCAAGGAATCAAAACAGTTGCTCTATCAAACTGAATATTCTTGCGCAGAACTGAATATTCTTTGCCCTCACAGTGTTTTG
-AAACATTGTCATAGGGTGCCAGGCATGTCCCAAAGGAGGACCCTGGAGAGAGGGCTTCTGAGCTGGGCTATCTCTAAACT
-GCTTCCAAGTTGACTTTGGAAAGATCACATGGGATTTTAGAAAAGTTATTATTATTATGACTTATAAAATTGTAGTTATT
-GAGTCAACTATGAATCTTGCACCTTACCTTGGAGATACAAGCTAAATACCTTGGACCTAGAGCTACTGCAAACCAGAATA
-CTTTGGGGCATAATGTACCAAAAAAGCTTTCAGAGGCTTGAATTATCACAGTGTAAATATCCATCTAGCAGAGCAGGTAA
-TTTTCTCGTTACTCATCCTAAGCATTAGATACTCTGTGTGTTAGTTCTTTGCAGAAATAACCCATAGCAGCTGAACCATT
-TTGGAACAAATTTTCCATCACCTTCCTTCCCTGTGTGGTTCAGGCCTTTGCAAACCCTGAGTATCATGAATCTGCTGGTT
-CTCTACTGGCAAAGATGATGACGTTTTCTTGTTTGTTTTTGTTTTGCTTTAATCATGCCGTGAGAAAATCCTAAGGGAAA
-AAAATCTCATTATCCTATTCAAAATACATTTAGGGTTATCTGGTCATCCCTAGCAGATTTTTATGTACCCAATGTTTATG
-TATCTCAAATTACACTCTGTTACCTTTCCCAGAGCAAGATGAAGAACCTCTAAGAACCTCTCAAACAGCATCATTTTCAC
-AACAAGCACTAGCAATGGAAAACATTGTCACCACCACCAGCTAATCTTGTAGGGTCCATGGTATTTTCTGTAATGCCTTG
-AAACAGTCTGCCTCTCTCTTCTTGTCTGTCATTTTTATAGATGTCAGTGTGGGGCATCAGCAGTTGAAAACTCAGAATAC
-CAAGCCAGTCCTTCCCTGTGACTGCTACATAGCTTTTGCCTGCAGGATAAGCCTCCATCACTGACGTAGTTGCTTTTTAA
-CTTCTTTTTTTTTTTTAACTTGGAAAATCCCCCACCTCCTCCATTCCTTCACAAAACTTTCTGCCTGAATGATTTCTAGT
-CTGAGGGCCATACACACATTTTTTTTTCTCCCTCTGCAGGTTTTTTTTTCTCTTCAAACTTCCGCATGCTGCCTTTTTTT
-AAAGTGTCACACTTTGGAAAAAATTCTGACTACAAAGGATTTTGCAGTACATTGCATTCAAACCCCTTTCCCCCTATTCC
-AACTTGCTTTATAATGAAAGTAAGAGCCATACTCAAGAGACTTTTATTGGCAATTAAGTATCTAAGGACTTTGCAGATTT
-TCTTCTTTATTGTATGGCAATCTTAAATGTTTAATGAATATTTAAGTAAACAAATTTCAGCAACATGCCTTTTTTAGGAA
-TTTGGCTTTAATTAACATCCAAACACTGTTAATTATTATGGCAAAAACATCAATACGTCAAAAAAAAGCCTTCAGGCCAG
-GGAATCTTTAAGAAACAATTATGTCTACTAATTTCGATTAAAGGTATCCTTTATTAAATTCTTAACAACCCGTCTCTTTC
-TAAACGCAGCGCCTTCACAACTCTTCTTCCCTTCCCCCTACCCCGCTTCCCTCCCTCCGCAATGGAGCGCAATCAAAGGC
-CGTATTATTGCCTAAGCTTGGCTCTCAGGCCAGCTAGGGATGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTG
-GTGGGGCGGGGGTGGGGGGCGAGGGTGCAAGGGGAGAGGTTGTACGCCGCTTTTCCGAACCCAGCTCTAAATGGTTTCTC
-CTAAGCGAGACAAGGATTTTCCATAGCCTAAAAGAGGCCATCAAGTTTTAACATTGCGAGGCACGACTTCTAATCGCATC
-CTTCCCGGAAAAGTACAAACAGTTCCTCAGACGAGGTCCCCCACCTCCCACGCGCTCCCCAGCCCTCCCTCCCTGCGGAG
-AGCCCCGCGACAGCCTCCCCAACACCTGTGAATCATCCGGGAGGCTGCCACCGCCGAGCGATCCGCGCACCACCCCCTTC
-CCGGGCCCGGGCACGGCCAGGGAGGACAGTTAGGGTTGTTGCTTTATAATTATCACTTTTAATCTCTAATACGACCAGCA
-CAAGTAGCCTTTGTCTCCCCGCCCTGATTTGAGCATCCGAGGGCCCCCCGAGGCAGCCTGCACGGGTACCCCGGGGTTTG
-CGCACTGAGTGAACCCCCAGATTCGGCCGTGTCCCAGCCGTCCTTGCTCTGAATCCCCCACCTCCTCCCGGCCGTTTGGA
-CGGTTCCCTCGGGGCGTCTGTGCCTCCGTGGGGTACCCCTAAGACACCCAGCATGAAACCCCAGCACCGACTGCAAATTC
-CACCGAAAGCAGAGTCATCCGTTTTTGCCCTCGGCAAACAACTCAACTTCAAGCCTCGAGTCCTTGCAAACCCACGCTGG
-CTGGGCTAACTCCGCTTCCCTTCTCCTTCCCCCGACTCCTGCAACAGCTCAGAGAGCCTGGCTCTGACGTAGTTCAAAAT
-AACGTGCGCCAGCCTCGCTGCCCGGCTGACCACAGCAACGAGAGCCACAAGCCCTCGACGCTGCTTCGATAACATGAAGC
-AATCACTCATAAAAATAGCAACCCACGTAGCCTGGCCATATATGGAGCTGGCGAGGGTGGACGGGGATGCCCCTACGGAC
-CCTCTTCGGAGAAAACAAATCGCCGCTGAAATTTCCCCCACCCCTCCCATCACTACCTTTTACCCCTCCTCTGCCTTCCC
-CTCTCCTTAGATGACTCAACCACAGATTCCACTGAAAGGGGGTGGGGGTGGGGGTGGGGGGGAATATATACACATACACA
-CAAATTATACATATATTATACATGTATTATAAAATATACACACACATACATATATACATACACACACATATACACATATG
-TACACACACACGCACACACACCAAAGAACATCAGGAATGCAGTTGCGGGATGAACGCGTTTGCCCAAGACCGAGTGTTAA
-AATGGAGTCATAAGAGTCGCCCCGTGCGGGTGTTTATAGAAGGTGAAAACACGCAGGTTTGCAGGCCAGCGCACTGGGAA
-CCGAGTCAAGCGCGCCGCAGCCCGGGCCCCGCCCCCGCCCCCGCCGTGCCCCGCCCCCACTTCCTCCCGCCCCTCGCTGG
-GCGGCTATTAAAAGCTGCTGACGTCAAAACGGACGGCCATCTTTGATGAGGGCAGAGCTCACGTTGCATTGAAGACGAAA
-CCTCGGGGAGGTCAGGCGCTGTCTTTCCTTCCCTCCCTGCTCGGCGGCTCCACCACAGTTGCAACCTGCAGAGGCCCGGA
-GAACACAACCCTCCCGAGAAGCCCAGGTAAGAACCCCCCTCCCCAGGTCGTGGCTCTGGCTCGGGATGGCTGCATACCCA
-GAAGGGACAGCAGCTGGGCAGTCCGAGTGGGCTTGGGTAAATACAAGTATTGGTGCACTTAGGGTGCGGTATTCCGTGTG
-TGCACGTCTGGTGGGGGCTTTATAAAGTGTTTTCGAGGTGAGCTGCTGGGGAAAAGGGAAACGGGAGCCCTGCAAATGGA
-GCGACGGGGAGGAAGAGCGAGGGTACGTACCGAATAATAACTTACTCTTTTGAAACAGTAGTGGGACCCCCTCTTTCTTC
-CATTTTGCGATGCAGTTTTCAGAGATATTTAGGCTGTTGAGTTTTCCTCCCCTGTCGTTCTAACCCTATTATTATGACTG
->21
-GGAATGTAGGAGGGTAGGGAGTGGATATTTTCTAACCTGGAAAAAACTCATTTTACCCTATATAATTTTTTTTAGCAAAT
-TCCTTCTTTGCACTTACTCCACAATCTTTCCAAATTCTCCCAAATGCTCAAGCTTTTAAAAAACAAAAGACAGAAAGATA
-GCAGGTTATTAGGTTTTCCACCAAACCTTTTCTTTCTATTCCTTTACATCAGTGAGCTTAGAATAACTCTGCTCCTGGAA
-CTGGGAAAGGGACTTGGGAAAAGAAAGAAAAAAAAAGCTCCCAAAGTTTAGCATCACAAAACATTATAGTCACTGCTATT
-TTATTATTTATTTATTTATTTATTTACTTTTGAGATGGAGTCTTGTTCTGCCACCAGGCTGGAGTGCAGTGGTGCGATCT
-CTGCTCACTGCAACCTCCGCGTCCTGGGTTCAAGTGATTCTCCTGCCTCAGCCTACTGAGTAGCTGGGACTACAGGCGTG
-TGCCACCACACCCAGCTAATTTTTGTATTTTTAGTAGAGATGGGGTTTCACCGTGTTAGCCAGGATGATCTCGATCTCCT
-GAATCTGTGATCCGCCCGCCTTGGCCTCCCAAAGTGCTGGGATTACAGGCATGAGCCACCGTGAGTGACCCTGCTTTGTA
-AGTTTTACATCATATATCCCCTGTGTTAGACCAAGAGCTTGTAAAAGCCAGAAGACATACACCATTTATCGTTCAATTAG
-AGATGTTCACTGATAAAACTGATTCTTCCATCTGAGGGTGGTAATTGTAGTTACAGTAATGTAGATGACAATCTAAGTTA
-TGTTCTATAAACTGTGTCACTGACATCTCAATCTACAGCTAACTTTGATTTTTTAAAAGCAGAGGAGTGGGTTGTATAGG
-TTTAGAAATACATCCATCAAGCTAGTTAAGTGAGATGGATTCAAGCCTTCAACTCACTGGAATATTTACCAAATTGACTA
-TTCATTAGCTAAAGGAGCCATATAAACAAGGTACTTTTTAAAATTCAAAATTATGTAAGGTTTTATTTCCTTTTTATGTT
-GTTATGAATTGGATTGTAGAGGTTATAAGGTAAAATAAGATTACTTTTACAGTAAAACATACAACACATTGTCGCAAGAG
-GGCAGCCTTTGAACACGAATTGCTTCTCAGGCATTCCTTGAAATTTTGAGACAGTTACTTTAATTAACACAACAAAATAA
-TAAAACACTACAGAGGATCTAAGAAGATACTTTGACTTATGCATATTGTTACTTTTTTATTACTGCTAGTGGAAGATGTA
-ATCGACAAGGAAGGTAAGGGCTGAATTTGTTTTATGTAAAAAGACAAATTTCTTTGGGTTTTAGCTTTCAAACATCAAGA
-TAGTAGGTCAATGTCTAAATGAGTGTATCAAAGTTCTCACAATGGCACATGTAAATTCACCTCTTGTCTACCCAAAACTC
-TAACCAAGCAAAGGCAAGTTGGAAGAATCAGACAAATGTAAGTCCCTAGGATACATAAATGCCACGGGATTTTATGTTTT
-TAACTTTCAACCTCCTAAGTTTCACTAAGAGACATGTTATTTGGAGAGGTTGCTAAAGTGTATTTGTATGATGTCTCTGT
-TTACGGTTGGTCTGGACCTCTTTCTGTCCAGTGGTTGCCCTCAACTGATGAGAGTCACCTCTCTAAAGATCATGCTTACG
-TCCCTGGAGCAGTCCGCAGCACTATCAATGTCTGACGTCCACCTTTTTCCAATTAATATTTCTGTACTTACTGAATTGGA
-AAACATACAGGTGTTTTTTGCCTGGTCACTTGTGGTTTTACAACACTCCCCCCGCTTCCCCACCACTGCCCCAGGTGATT
-TTGATGCCAGCCAAAGTGTGAGAACTACTGGCAGCTGCTGGCCGACAGCAGCAAAGGCCCAAATCCTCTGTGTGACTTCA
-AGACCCGTATCTGGTTTTCAGCCATATTTCCTTCTCCTTCTCACAGCTGAGTCCACTCCTCCTCCCTCACCACCTGTAGG
-CTATGCTTTCCAGCCTGTGTCCAGGATTAGTCCTGATGTAAGGCACGTGGGGTTTAAGGAGCTCTCTCTTCAGTCTTATT
-TCCACACCATCTCTGACAGATATATTCCAGTTGTAATCATGGGGCTACCTCCTCTTGTTTCCAGTCCCAATCTCGTTTTC
-TCTATCACATTCTACCTTGTAATAACCTAAATCTTCTGGTGGGCAAGCTTCTTCCTCAATCAAATTTGTGTTTATGATTG
-TGTTGGGGATTGGCATAGTAATCCAGGTACTGCTACTGCCTTGAAAGCGGAGACTGCATCCTTCTGTCTGGATATCTTGA
-GTTTCTGGATTGTAAACCTTATTAGGGCCCATTTTTCCTAGAATTGGAGCCTCTACTTTGTTCTTGCTACTTTAGTTCAC
-CCAGAAAGCACGATCTCTGCCTGAATTTCAAAGTGTTGGCTAGTTTAAATATCCTTTTGTGAGACTTTTGTCTTCCTGCG
-GGGTGATTTTTTCATCTTACATATCATTGCTAATCTTTTTACCTTGAATATAATTGAAATAGTTTTAATCTGTGTTACCA
-GCAACAAGAACCCCTTTTATGAGATGAAGAGGCCAGGTCAGTCTCATAACTTGTGTACCCCTCCGTGTGTTGAATTTATG
-TCAGAGCCAGGTTCTTTCCTATTTGATGTCTCTCACCAAATTCCAGTGTTTATGTCCTAGGAGGTGCCCAATAAATTCTA
-GAGTTGATACAAGCTGTAATTTTAGAGAAATTAAATTAGCAAGTAGAATTAGATTATATACAACCTAATCAACTTTTTTT
-TTTTTCCCTGAGGATGACCAAGATTTGGGCTTCAGTGACAATAGTTATCCCCTAAATATTTATACTCAATCTAGGATCAC
-CAGTAAAATGTTGAATAGAGGTGATGAACACACACATCCTTTTCTTGTCCTAATCTATGTGGTTTAAACATTTACGCTTT
-CACAATTAAATATAATATTGTTTATATGTTTTGTTGTGGATGCTTTCCACCACTTCTAAAAAATTTCTTTTTCTAGCTTG
-CTGAGAGTTTTTTTTTTTAATCAGCAATAGATATTTCTCCAAAGAAAATATCCAAATTACCAACAGGTACATGAAAAAAA
-TGCTCAGCATCACTAATCATCAGGGAAATGCAAATCAAAACCACAAAGAGATATTGCCTCAAGCCTGTTAGAATGGTCTG
-ATTAAAAGAAAAAGATAACGAGTGTTAACAATGGGGAGAAATTGGAACACTTGTACAGTGTTTCTGGGAAAGTAAAACTG
-TGCAGCCTCTATGGAAAACAGTACAGTTGTTCCTCAAAAAAATTAAGAAAGTAGAACTACCATATGATCTAGCAATCTCA
-CTTCAGGTTATTTATCTGAAAGAATTGAGATTGGGATGATTCTCAGGCTCATTGCAGCATTATTTACACTAATCAAAATG
-TGGAAATAAGGTTAATGTTTATTGGCAGATGAATAGATAAAGAAAATGTGGTATATTCATACAACGGAATATTATTCAGC
-TTTAAAACAAGAAAATCCGGCAATATGCAACATGGATGAACCTAGAGGACATTAATGCTACGTAAAGTAAATCAGTCACA
-GAAGGACAAACTGTATGATTCCACTTGTATAAAGTATCTAAGATAGCCAAATTAATTAGAATCACAGATTAGAATGGTGA
-TAGCCCTTTAAGTTGAAATCAATTTTACATTCCTGGGTTTTGTAGTTTTGCTATCAGGATTCTGACTCATAAAACAAGTT
-TGGAATTCCCCCCTTCTTCTGAAATAATTTAAAAATTTTATTTTTTTAAAACGTTTGAAAGAATTCACCAGCAAAACTCT
-TTGGATGTGGAGTTTGCTTATTTTTTTATTTCTTTAGTTTTATGTTTTTATGTGCAGGTATTTGACAATTTAATTACTTT
-AATAAATGTCAATTACTTCATATATTCCATTTAATCTTGTGAAATTTTTTATAAGTTTCTTTTCAAGGAATTCACCCTTT
-CATCCAAGTAATGAAAATTAGTATAAAATGTTTCACAATATTCTATTATCTTGTTAATGTCTCTTGTGTCTACAACTGTA
-CAATCTCATTAATCCCTGATATTTATAATTTGCGTTTTCTTTCTTTCTCACAGAACTAACTTTTGGCCATGTTAATTTTC
-TCCTGTGTCTGTTTTCTGTCTCATTGATTTCTAATTTCTGTTTTATTTTCTTTCTTCTACTTGTTTTGGACTTAATTTGT
-TCTCTTGTTTTAGATTTTCTTTTTAAGGTAGAAAATTAGTGCACTTGTTTTGAACTTCTCTTTTTTAGAATAAGCATTTA
-TACAAAAAATTTACTCTGGGTCTGCTTAACTTATCCCACATATTTTGATATAGTATATTTTTATTTGTATTCAGTTCAAT
-GTATTTTAAGGTGTTTCTTATGATTTCTTCCTTGAGCTAAAGGGCATTTTAAGGTGTATTTAAATCTTCCAATAGTGTAG
-ACTTTCCTGGGTAGCTTGTTTTCACCCATTTCAACTCATTTTCATTATGGTCAGAAAGTATACTTTCTATGATTACAGTG
-TTTTGAAACTTCTTGACAGATATTTTGTGGTCTATAGCCTATTGATAAATGTTTCATGTGTAGCATAATAGAACATATAT
-TCTATTTTCTTGGTCAATATCGATTAGGTCAGGGTGTTGTCAAAATTATTTTACCTTAACTTTCTTTAGTTATTCTATCA
-GCAATACAGCATTATGTCTTCATAATTACTTGACATTTTATCATTATGAAATAGCTTTCTGTTGTAATATTGCTTGTTTG
-GAGGTCTACTTTTTCTTATATTAATATAGCCACATAAGATTTCTTGTGCTTGTTGTTTCCTTGGTATACTTGGAAATTAT
-TTAACTCTCAACTTATCTATACCATAATATTTGGCATGCATCTCTTATAGGTACTTTTATTATATAGTTGGACAATCTGT
-GTTTTATTTGGAGTATTTAAATTACATTTGAAATAATTATTGATAAGGTTGGAGTTAAGCCTACTATTTTTGCTTTTTTT
-TTTTTTTTTTGAGACGGAGTCTGTCCCTGTCGCCCAGGCTGGAGTGCAGTGGCGGGATCTCGCCTCACTGCAAGCTCTGC
-CTCCCGGATTCATGCCATTTTCCTGCCTCAGCATCCGGAGTAGCTGGGACTACAAGTGCCCGCCACCATGCCCGGCTAAT
-TTTTGCATTTTTAGTAGAGATGGGGTTTCACCGTGTTAGCCAGGATGGTCTCGATCTCCTGACCTCGTGATCCACTCGCC
-TCGGCCTCCCAAAGTGCTGGGATTACAGGCTGAGCCACCGCGCCCAGCCTATTTTGCTCTTATCTTCTATTTGTTCCATC
-ATTTTTTGCTCCTCTGTTCTTTCTTTCATGCCTTTTTATATTAACTGAACAATATTCAGCGTTCCATTTTAATTCCTTTA
-TTGGCATTTTAGAAGAATATCTTCATATAATGTGGTGGTTCTCTAGGGATTGTAATAAACATCCTGGGCTTATCGCAGTC
-CACTTACTGTTAATAGTCAACGTTTTCATGGAACATAAAGAAAAGTTGTGGCAAAATTGTTGCGTTTAGTCTCCTGTCAG
-AGCTATTAATTTAGAATATTTTACTCTACATACGTTATCAATAGTACTCTTAATTTTTTATTTAAACCATCAGTTGTTTG
-TTATAAAACTAAAAGAAAAAAGCCTTAGTTTTTCCTGTTTATGCACATGCCATTCCTAGAGCTTCTCCTTACTTCCTGTA
-GGTCAGAATTTCCATCTGTTGTTATCTTTCTTTAGTCTAAAAAATTTCCGTTTGCATTTCTTGTATCTAGGTCTGCTAAT
-GACAATTGTTCGAAGCTTTCTTTTATCTGAATAAATCTTTATTTTCTCAAGAATTACTTTTTCTAGTTATAGAATTTGGA
-GCTGACAGTTTTTTTTTTATTTTGAAGATGTAGTTTCATTGCTTTTTAAAGTGTCATTTCTGATGACAGGTAGATGACCT
-ATTTGTTTCCACGTATGTAAATTATTTTCTCCCTCCCTTTAGCTACTTTCAAGATTTACTCTTTTTTTGCCCAGTGTTTT
-GACTATGGTATGTCTACATTTGGTTCTGTATATTTTTATTCTGTTCTTTGAGTTTCTTAAACCTGTAAGTTGATATATGC
-TGACAATTAGGAAAACTTTTGGTCTTTACTTTTTCAAATAGCTTTTTCTGTCTCATTTTCTTCTCTACTCTTTCTAGGAG
-TCCAATTATATTAGTGCTAGACTGGTCATATTTTTATTATTTTTCTCCTTTGTATTAGCTGTATTGGGAAATTGTTCTTG
-ATCTGTTTTTAAGTGCACTGATAGTTTTTTCTGCCATCTTTAATTTACTGGTATGTGCATAAAATGACACTTTTATATAA
-GATATTCTGTCTCTCAGTTCTAAAATTTGTCCTATTATCCCTTTATCATTTTTACTTCTCTGTTGAGATTCTCCATATAT
-TCTCTCTTATGACCATCTATTCCTTAAATCCTTGAATATGCTTATAATAGCTTATTTTAAATTTCTCATCTTCTAATTCC
-AGCATGTGGGCCATTTCAATGTCTTAATCCATTGTTTACTTTTTTTGTTATGTGTCATATTTTCCTGGTTCTATGTCTAG
-GCAGGTTAAATTATATGTTAGATTATGTGTATGATATTTTGTAGAGATAGGCTCTTTTATTTTCCTTTGAAGAGTGACTC
-TTTTCTAACATTAGTCTTCTTTCTGTAGTCAAACACCAAACTTTCACTCCTGAGCTATATGCAATGGTTGAAATCTCTGC
-TCTGTACTAGCAATTTAGCTGTTGTTTTCTGCTGGATTCTATGGAGTCTCTTTTTATGAATGTGAAATGTAGCAGCCATC
-ATATATCTGAATGAAGTTTAAGTGCTGATTTTAGATTTTTACTCTGTGACATTCTCCTCTGTGACTTTCAGTTGTGTGAG
-ATTTCCTCCCATGTCATTCAAATTTCCCAATTCTTCTTTTCTGTCAGCCTGGAACTCTGTACTCTTATTCCTCAAGCTAG
-TAAAACTCACCGCTTTACTCTTAGACATCTAATTTTGCACAGACTTGGAAGTGTCATCAGGTGTGAAGTTACATTGATGC
-AAATTTAAATCATTGCAATTTTCTTTATTCAATGGTCAAATACTTCATCAGTGGTTGAATATTCTACTATTTCTGCCTGT
-TTTCTGTTTCTCATTACCATCAAATGTGTATTTAATTTTTTTTAGAGTTAATAGTTTTTTTCCCTGCATTTGAGTTAGAC
-CTGAGCTACTACCACATTTTGTAATTCAAACTTTTTGTCTAACAATGTTTTAAAAAACTCTTTATTTGGAGGGAATTCTC
-AAATTTCTAAATACTCTACAAACATTAGGATCAGGGCTCACATTCCCAGTTTCCCTTGTAGCCAGATGTGCATATCGAAC
-ATGGCCTCAGCTAATGAAGCATACCCACATATTTGAAAGTAAGAAAAGTGTTAAGAGGAACTGTAGATATCATTTTAGTT
-GATGTAAGGATGGAAAATAAATAACCAACTTTCACTGGTGAACTTTGTCTTCAATCATTGTTTTCCCGTGGGTAAGCAGC
-TAATTTTCTGGCCTAGAGGTGAAATTGGTGTGTTGGTAAGAATTGATTTAATGATAACCTGCTTTTGTCTTTTTAAAAAT
-TGTGAATCCACCATTGTTTCTGGTCCTGTTTTATACTTATGCAGTGTATAATCTCTCATGCAAAATTTAGTTCTTTGTTT
-CTCAGCTTAAACTGGATTTTGATGAGCAGTTTTCACCTTCAAATGAAAGAAATGGCTTTGGTTGATGTTAGACAAAAATA
-ACAAGAAGGAATTAAAGAAATTTGTTTGTCATCTTGTAACATTAAATAAATGAAACTGAAAATTCAACAATTCTGTTTCA
-TAAAAAAGTAGAAAGTTTCTACTGTTTTTCATTATTTTCAAAGCTATATCATTAAATGAAATTTCTGCCTCATGGAAGGT
-TTTTAGAACTATGTAATAATACCATACAGACCATTAGGAGAGAAATGAATAAAGACTGAAAGAAGTAAGCACTGTGTGGT
-AACATAGATGGTGCACAGTTGTGTGTGTGGAGCCCTAATACATTTGACCATGGAATTTATACAATAAATGTCAGTTTCCT
-GTGAACCTGCTAATTAATATGACTTTCGCAGACCTTTCCTTAACCTAAACTGTTTAGGTTTCCTGTCGACAGACTGCATG
-TATTCTCACCTTTAACCTTTCCATAATCTTCCCTAATTACAGATGTCATTGGTTCTTAATAGCAAAAGAACAGCAGTAGC
-TTATAAAGTTATATTATTTGTTTTTTACTAATATGTGAAGTGATTTTGTCTTTCATTTCACCTCTAGAGCTAATTATGTC
-TTCTAGGTTAACAAAAATTCCAGATCATACCATCATTAGTTTAAACTTTACAATGAAATCATTATTTCCATTTATTACTA
-GCCTGCATTATAGCAATGTTTAGCTAATGAATTCTCAAAATATTTCTTGAAAGGTGAAAGAGTACCTCAAGTAAATGATG
-TAATTAATTTATTTATCAGAATTTTAAATTAAGTGTTCTGTTTAATCTCAAAGGGGTACCAATGAAGTCAGGGCATAAGG
-ACTCTGGTTAATAAAACGGTAAGAATTAAAAAAGATTATTACATTTTTCCTCATACTATGATGGCTATAATTTTTAAAAC
-AGTAGAAATGTTTAATTTTTAAAGGCTACTAGTGTCTATTTCATTCAAAGATGTGAGCTCTTCAGTTCAACTTGTTGTTT
-GAAATTTGAACAGCTTTTTCTTGCTTTTGTTCAATACAGTTATTTAACAGTCCAGGCAGGCCTCCGGAGTTACATATATG
-TATGTGGCTATGTGTGTATATATACATAGAAGTACAAATAGCATATAAACAATTTACATAAGACTTTTGCTTTTGATGAA
-AATTCTTCTAAAAGTGAATATAAATTAATAGCATATGGAGCCTACAAAAATTGTCCAATAGGGAACTAGGAAAAGATAAT
-TTGTGAAGAAAAAGTTTGCTAAAACAGACTTTTTATTTTTACATGTAATAACTTTATATTGAAGGGTTTCCAGAAATATA
-AAATGTTATAGGGCACTTATCCTGAGACACATGAAGGAGACAAGGGATAGAGCTAGGATGGAAGTGAAAATAAAGGACAA
-ATAGAGATAGATACTTAAGTGGAAATGAAACACTGCATGTTCTCACTCATAGGTGGGAATTGAACAATGAGAACACATAC
-ACACAGGAAGGGGAACATCACACACCAGGGCCTGTTGTGGGGTGGGGAGAGGGGGTAGGGATAGTATTAGGAGATATACC
-TAATGCTAAATGATAAGTTAATGGGTGCAGCACACCAACATGGCACATGTATACATATGTAATTAAATTGCACGTTGTGC
-ACATGTGCCCTAAAACTTAAAGTATAAAAAAAAAATCATCAAACAGGAGGTAATTTCAAAACATGGCTTTTCCAGGCAGC
-AAATTTTCTGAATGTATCGCAAAAGAAGATAAATTGCATGTCTATGTAGATCATGTCAATGAAATAAACAATAAAGTTAC
-TTATTGGAATATTGAAAGTGGTTGATAATAAATAAATTATTTATATTTATGGTAAAAGCAATAAACTTGATTTTTAGGGG
-GTTCAATGACTTCCTGAAAATATCCTCTCACAGATTTTCTCAGAGTGTCTAGTTGGCAAAAGCACAGCTCCAAATAGCTA
-TTTCTGTCAACGTCTACAGAACATTTACAGTTTGATTTCTAAAAGTTTCCATTTCTACTGACCTTACAAATTTGTAAAGT
-GAATGCCCACCAGGACAAAATATTAAGTGATAAAATTAATTGGATCCTACAAGTGCAAATCTAGGCAAGGAAAATCTTCT
-TCCTTCTTAATGAATGATTTTTATGTCTCTTCATTCTTGTCCTTCTAGGTAGAGCAACACTCTGGAGACCTTCTTTTGAG
-GCATTTCACCACCAGAGTAAGTGTGATGTGTGAGTAATTAGTCCACCCACAGGGAGCTGGTGAAATTAAATTGGAAGTTA
-TTTCCTAACTGGCATATCTTGGAGTAAAATTAATCTAATAACAGCTTTCATAAGAGAGCATAAGCTTAAAAGACAACATT
-TTTCATTCAACTTTACCAAACAAAGTGCAAATTTAGGTGTCCAGTTGTGAAGTTTTGTTGTGTGTGGATTGTACAGTGAA
-GGTACCAGTGGACAACAGTTGCTCATCAAGCAAGTTTATACAAAAGCTTTCGGACAAGTCCAACTCTAGATAAAATTCTA
-AAGTATTTCATGCTTGTGTTCAGAGTTTCTTTTTCTCTCTCCAAGGTAACCCACATATCAAAAGACATATGGGTTGTGGG
-TAGAACTTCCTAAAATTGCTGGTGAGAAGTGTGCCATGCATAAGCATACTTCACTAGCTTGAATTTTCTGTTAGTCTCAC
-AGGCAACAATTACAATCCTGTATGATTTTCTATCTCCACACACTCCTGAATATAGAAAGACCAAGTAACATCCCTGGTTA
-AGATGTGTACAGGTTCCAAGACATGTCTAAATATATTCACCAAGAGGTTTATTATTTTCACAGTGGCATTCACTAAATCA
-GTTGTCAGTGTAGCATTACTCAAGGAATAAGCAGGGTCTTTAATTTATCAAAGTTTGGAGTGCACCCCAAGTTGGATCAC
-TGAAGCACATAACTATAGATAAGATCACTCAAAAGCACAAATCCAGGTAATAAATATTCACTAGTAGTTTATATGCATTT
-AGCAATTTGAATGCTGGGAAGTGTAGCCCAGAAAATCAATCGACATGGAGCTATTAAAGAGGCATTCATGGCACCTGCAC
-TTTGAATCTCTTCAGACTCAGGTTAAACAGGAGACATGTTAGCTCATGTATAGTGCAAAAACCCGTCCTCTTTCCCTTTT
-TATCTATGAACCTGCCCTTTTCAATGTTATCTAGATGCCTGAAGGTATGAATACCCTTGATCTTGGTAAAAAATGGTACC
-ACCCGTCAGCAAAATCTCACTGATCAGTGTCTATGTTACCTCACTGAGTTAGCCTTTTGTGTTGTTGTGGCCCAGAATGA
-CAATGTTGACACAATCCAAACCAGTAGTTGGGAAGTTAATGTTGGATGCGTCTTTGACAATTGATGGAATGACCTGAAAT
-CAAATGTGAGGCAGTGGAGACACAAGAATGCTATTCAGGAAGTTAGTGATCTGTGGAGATACTAAATGAAATATCTGGAA
-GGAAATGTAATCTTGCAACTATGCTTTTATGTGTTTTTTGACATAAACAGTTTCTATTTATGGTGGAGCTAGAGTGTCCA
-TTTCCCATGAAGTTCCCATAGTGTTAACTAATACAGTCATGTGTCACTTAATGACAGGGGTGTGTCTGAGAAATGCATTG
-CTGGACGATATTATTATTGTGTGAACATCACAGAGTTTACTTACACAAACCTAGATGCTATAGCTGATTACATATCTAGG
-TTAGGTGGTATAGCCTATTCCTCCTAGGCTACAAACCTGTGCAGCATGTTATTGTACTGAATACTGTAGGCAATTGTAAC
-ACAACAGTTAAGTATATCTATACTTACTTATATCTATACAGTAAGTGTATCTATACATGTCTAAACATACAAGAGGTACA
-GTAAAAGTACAGCGTTATGATTTTATTGCACCACTGTCATACATGTGCACTATCCTTGACCAAAATGTTGTTATGTGATG
-CATGATTGTAACAAAAGAATTAATTAAATATAATATTGAAGTGCCTATTGAGATTTCAATGAAGAGAGGAATATTTGTAA
-ATTCTGATTACCTTAAGTGGGAATTGACTTTCTTCCTGTTTCCATGGCTGTTCTTGTGAAAGAGCATAGCTTTCCAAAGA
-CCTGAAATCTCTGACAAATCTTGCAATTCTCTATTGCCTGCATTATGAAAGTCACCTGGTATCAAATGAGGCAAAATTGT
-AGATTATAAAGACCTGTACTTGTCAGTTCCTAAACATAGCAAGCCTTGGTCTATCTTGAACATTTCTGCAGTTATAAATG
-AGCCTTGGGTCATGATTTTCTGCCTTTTTATCATAGACAAGATTTAATTTAGGAGATGTCCTTTTAATGTGTAATGTGAA
-TAGTAAGTGACACTTATGAAGCCTATTTTCTTCCAGCCATTTTAATTGTCAAATCTGTCCAGTCAAGATGCATTGTTAGA
-GGCTTCACTGACAACACCGTCTGTGTGTGTGGCTGTGTGTGTGTGTATACATACACATGGTTGAGCAGGATTTATTGTAA
-GTCAAAACAGTCTCAAATTTCTTTGGACAATACAGCTTCCTTGGCCATTCCCTTGGAGCTCTGAGTTGAGGAGCTGGTGA
-TGTGTATTTCTCTTGCATGTTCTCCACATTATCCCTATGCAGGTCTTCCATGGGCTTGGTTTTGGAACCAGTGATGAGGA
-AGATCACTAGAATTGTTGTTGTCAAAAAGATGCCTCCATTCTTCTGTATAAGCAATGGCAATTTTCCCTGACCAATATTT
-CTTCTTTTGAAATGGTAAATTTTGAATATTAACTGATTAATATAATCCCATAAAATAACAAAGTTTGAGCCCTATGATCT
-GTATTTTAGGCTAAAGTTGTGTTTTATGCTAAATCATCATTTACTCCATGTATGATCTTTTTTTTTTTTTTTTTTTGAGA
-CAGAGTCTCACACTGTCACTCAGGCTGGAGTGCAGTGGCACAATTTTGGCTTACTGCAAGCTCCGCCTCCCAGGTGCACA
-CCATCCTCCTGCTTCAGCCTCCTGAGTAGCTGGGACTACAGGTGCCCACCACCACACCCAGCTAATTGTTTTTTAAGATT
-AAGGGCGAAATAAAAGCTGCTCTCCTATATTACATTCATAAATCAGAATTATTAAAGCAAGCTATTTATTTATTACAAAC
-ACATACTCCAAATTTAGCATCTAAGACATGACAGTCTTTCAAGAGACATCAATTTACTTTTTAGGGTCTATAGCTATATT
-TGTATTCATGTTATTGGTGTCCATAATATTTCATTAGATGTTCTGGGTAAATTGATAAATGAAAATAACGTATGTGATAA
-GGAGAACAACCTAGGTCTCCTGGAGGGCCCCTTACAACTCAGCTGGTGTTAGCAGAAATGCCTGGGTGTAACAGTGAGAA
-ACAACCTTTCAAAAGTATTGAGCAATTTTTCAGGCAGAGGAATATGTATGCCAATCCAGGCAGCCAGATAAGTGGAGGTC
-AGTTAAAAGATCAGTGTGTGATTACATTTTTTTTTTAAGGTTTCTACTGAGAGGAAATATAACTCTCAGTTATTATTTTC
-TCTGCATATCTCTGGTTATTTTGTCACAACTTTTTATGTAAGCTACTACCAAACACTGGGTTATCCAAGATCTATGGGTC
-GTATTCAATATTTGCTTTTCCCTCAACTACTAACACGTTTGATTCCCTTTGTAACTTTCTCCCCTATTTCTCCTTTGAAC
-CTGTTTTCCCCAACCACACTGAGTTAATAAGCCTCCTATATACTCTCATACCCTGTTTTATCTAAAGAGATTTCCTTTTT
-CTACTATTATACCCATCTCATTCCTTAATTTTTTCTTCTTATTTCTCTCTCTATTTTTTACTCTTTTAGGCACAGCTCAT
-GTCTCATGACTTTCAAAAAGTTTTTCTTCTGATATTCCCAGCTCGAATTAGGTATATCCCAATCAGTTTCCTTAGAATTA
-CAAGTCTGCATATTATTGGCTTGCAATCTGTCTTAGGCTGGGAATTGGCTCCTTGTAGGCAGGGACTAGAATTTATTTCC
-TCTTATGTCCATAATGCCTGACACAGGAACTATTCTCACATACAAATTGTAGGGCCATAATTCCTGAGAACATATGTATA
-TTTTAGTGACTCATAAAGGCTTGAAATACATTTTTAAAATGATTAATTGGGAAGTCCATGAACTTGACATCTTGATGTAG
-AAGAAAAGCAAGGGCAGATGAAGAAGTTATACACGATACTTGAAATACCAGAAGAATATAATCAGAGAGCAATAAATTAA
-TCCTAGATTTTTAGATGTGAAGAAGTTCTGAGAAATATTTGAAGACTTGGCTCTAGGGATGAGTACATAACAGAGACCAG
-TAGCCAGACTCAGAGCTTTAAAGAGTGAAGAAATGGCATTGCAGGGGGAAGGACTGTTGTATACTAAATAGAAATTGTCA
-TTAAATGGAAGACTAAGCAAGAGGCTGATGATCTGTGGATGAGAGACCAAAATGGTGTGGAGATAGAGGTAAATGCCATA
-ATCTACAAAGAAGATATTTTTGTGCCAGAACGAAATGATAGGTCTAGAATGTAATAAAAGATAAATAGTTAACTACATTG
-TAATGTGGTCTGAGAACTCACTGAAGGCATAGCCATTGATATTAACTTCCACTTTGCTTCCAGACAAAAGATTTTAAATA
-TCTTAAAAATTACATTTGATATTGTATGATTCATCAAGACAAAGTAAAGCTGTAGTTGCCCTGGGGGGGTGGGGAATGGG
-GAGTCACTTTTAATGGGTACAGGATTTCAATTTTAAAAGACAAAAAGAATTATGGAGATGGGTGGTGGTGATGCTTGCAC
-AACATTGTGAATACATTTAATGACACCGAATTGTATAATTAACAGTGGTTAAGATGCAAATTGTTGAGTGTGTTTTGCCA
-CAATTAAAAAACAGAAAACAATAGTATTTGAAGATATAGCCCATTTCATCTGGTAGCTAGCTGTATGTGTCTGCTCAGCT
-GTGGATAGATATTTATGCTGTTTCTGAACTGGAGGTTACTGGTATTCTCTAAGGTATAGGAAAATTGATCTTATGTGGCT
-AACTGAGGTGGATATAGTTGTATCAGTCAGACAGTAATGATATAATCATGAGAGTTTACATTTAACACAACTTACATGTG
-TTATACTTTAGAAAGCACTTCATAGATATTATTACTTCATACCATTTTCCCCTTACCATATTTGTCTCTCCTTTCTCTGC
-TGACTTCACAAAATGTCTGTTCCACACTACTCAGTTCATCTCCTTATTTTGTCAAAATTTTAAGTATCAGAGTCTCCAAA
-AAAAAAATTCCAGACAAGTCTCATCAGCTTTCGGTCATTGATTAATCGATGCTCTTAGGGGGTTTCCCTTCCCCTTCTCA
-ATTTAACATAGCTTCCCAATTCACTTGCCAGTAAAACAACGTTGTTTATATGGTTTTGTATTTCTTCCTGCTGAATTATG
-AACATTTTTTCATATTGACATTGATTTCCATCTGGCCATGAAATACTCAAGGTGAAGAAAATGAAACAAAATTGTTAATA
-TTTATCAAGAGCCAGGTACTGTTTTCAGTGTCCTAGAAGCATAAACTAGTGTAATGCTCACCAGCTCATATGAGAGGCAA
-AAATGGATGAAACTATAAAACCAAGACACAGAGAGTTAAGGGAAATTTCCCAAGATCACACAGCCACTGAGGCTATGAAC
-TAGATTTTGACTTCAGGCTGTTTACCCCAGAACCTGTGCTTTCAACCGTCATTTGTACTGCTTCCCTAAATTACACTTGA
-GTACACTGTGACATCAAATTTCACCTATGACACTGATTATCTGGGGAACTTTGCAACTTATTCTGAATATGACTCAGTTT
-TATTTTCTGTACAGAGGTAAAGTCAGTATATACTCCATAGATTTGTTATAAGGATTATATGAAATGACACAAGAGAAGGC
-TTTAAAAGGACTTGGAAAGCAATAAGCTTTTTTGTTTTCAATCATTTTTCAATAGGTTATCAGTGTTGTGAATGGTTCAT
-GAAAAATGACTTTGGGCTCAGTGAGTAACTGAAATGTTGTTGTTTAATAGTGTGTTTAATATTAATATAATAGTAACAAA
-TGTTGTTATTGTTGAGTAATAGTTATTTGGCTTTTCGCTGCTTTTCTTTTCTAGTGTTTTAGTCAGAGACTTCTTAAGTC
-TCCTCAAGTGTGTACACATTTCTTAAATTTGTTGGAAAGTACCAAATTTAAGATATCTTGCATTTTTTTTCTTCCTTAGT
-AAACACTAAATTCCATCACACAGCAGAAAAAGGGCTCTGTTATTGTCGGTACAATGGTTTAATATTCACTTTTATTCCCT
-ATATCATAGTTCTGATTTAATTACTATTTAGAATAAAACTTGTTCCTTATTATATGCATTCATAATTATAAAATTTGTGT
-TTTAATGCCTTCTACAAATATACTGTGCTTTTCTTTATTTCCTTATATCTTTTACTGTTGCATGATCCTGGTATTTGAAA
-TCTCATTAAGTGTTGTTTGGGGATTTGCTGGGAATGTCATCTACATAGTAATGTCTCAAGTTTGTAGCATCTTTAAAACA
-TAATAGGAGACGGAATTCACAGCAGAGTAATAAGCCTCCCACTTTAGGCAATATATTTGTGATTGACATGACTTTGTTCC
-CAGAGGGCAGTTAGCAACACAATATTATGGCTATGTGTACAAGGAAAACAAATTTTAAAAATCTCCTTTAAAAAAAACAG
-TTCCCAATCCTAACCAGTATCATGCACAGAATCCGTTTCCACCTCTTCATATGGAAGCAGCTCTGGGTGGACATCTAGAA
-AGTTGGATAACTATTTATCACATATGATCTGCAAAGGGAGAGATTTACAAGAAAGTATTAAATTTGATCCATAGGAAAGC
-AAAATCAAAAATCAATGAATTTTCCATTTGTAGTTTTCCCTAGGGGCTCTACTCTCAAGATGGCTTAAATGCATTAGAAT
-TCAATGACTAGGCACAATTGTTTGTTAGTGACATAAAAGCAAGGTAAGCATTTCTGCTTTATGAGTCCAAGCACAGGGAC
-ACTTGGTTTTATTTGGAAGGATATCATAAAGGCAATGTTTATGAGTAATCCCTCATTGTCTTTTCTTCTGTAACATTCAA
-TGCTATGTACTAAAATTTAGAAATGAAAACTACTTAAAGACCACCTGCTAAGTTTCATGTATTTCAAATTCTCAGATCCT
-GAGTGTTTAAATATGTCTGTATTTCTTCATGAAAAAAACATAATCTTTGCCAAGTTAGAAAAAGAAAAACTCATATTCCC
-ATTTTTAACTAAAGGTAATCAGAAATTTGGACAGTTTTTAGCCTTCAATACATTATGTAATTTGGGTAACAGGCTGAATA
-AAAGTAAGGAACTTCAGTTAAATTCAGAGAGAAGCTAGTAATTATTTCTAAGACTCAAATGTATAGAACAGATCTCTGAT
-ATTAAGGATAAGACCCTCAAAGGTGACACAAAATGGGTAATTGTGGGATTATTTTAGGAGGAATCATCATATATTCTTAC
-TGCTATAAATACAGTCAAATGTCAGATAAATATACTCCACTGAAATGTTTTCTAGGAATGATGTTGGAACCAATGTTGAT
-AATTTTGAAAGTCATGGAGAGGATTTCAGATGATAGAAGTCGGGCAAATATCCCAGGTTTAATAAATAAGCAAATGGTGA
-GTTCCAAAGCTGCTGTATCAGTGAGCCTCATATTGATCCTGAGCACAATTTCAGAAAGGTCCATTAAATGGGTCTTTGGA
-GAGCACTTAGGATAAGAGGCTGGCAGCAAAGATTCACTAAGAACAATGGTGCCAAGCTTGCCTCTTTGACATTGTTATCT
-GACTGATAAAGGTAGGCTATAGCGGTACACAATACAGATATTTCCAGGGTAAAGCTGTTGAGCTGCTGTAATTTTCCTTG
-CCTCTTCACTATCTTCTCCTATAGTTGACTCCCAAGGAAAAGATAGTTGACTTTTAATCTAGAAATGTATGTTAATTGGC
-AAAAACAAAAAAATGAAACCATAAAATATCCTTTAGGCTTCTCTCTGCTCAGTTATTAGATCATATGAATGTGCCCTTAG
-GAAACACAGAAGGCCCACACTATTATAGAGACAAATTTCTTACATTTTCTGCTGTTTAATGCTCTTCAAAAGACTTACCA
-TACTTCACTAATTTGATTACCAACTACTTGAACACAGGGACCAATGTGTTTATTAAAAATTTTGCATATTATGAGGGCAT
-TAACTTTTAATTATTCAATTGTTAAGACAATGCATATTATTATAAACCATAGAAGGCACACTTATTACCTCCTTAAGAAC
-CAGTCTCTATTTCTCTGGTTCATAGATCTCCAAGTTTATAGAGGGATTGGACATTTGTGTCTTCAATTGGCCCTCTTCAG
-CCCTAGGATAAATAGTGATTAATCTAAGCCAATAGTTTTCGGCTCTGTCTGACCCAATGCCTCTACTTCATAAGAAATTC
-TTCAAAGACCCCTTCGCTATTCTAAATTATTAGTGAGAACACAATGTATGCATTCAAGTTGTTGAAAATATTAATGTTAT
-GCTGAAGCTAACAAAGGAGAAATAATTTACTGTCAATATATAATCCAAAATGTATATAATTGTGCCAGAACATTTACATA
-TCAAATACAATAGAACATAATGAAATTTTCATATCTTCGCCCATACCTTGAAACATTGTAAATAAAAAGTTACAAATATA
-GTTTCATTGAATAACCAAATGCCAAAACTGCCATTTCTATTGTTGACATGATTGAACTGCATTGGTAAATGTAATAGATA
-CTTTCTGTTTGGCCCTTGTCCCCTGTTATACTCCCCTGTTTACTGGCTTTTGTCCAAGTGGAATGGTCCATATTGAATAT
-CTCCATCGGTTCCCTTGTTCATTGCCTTCTATGCATGTTCATGAGATTAAAGGGAAGGAGGAAATGGGATTGGGGGTTAT
-TGCCTAAACTCCCTCTCTGCTAGGTCTCCTGGACCAATCTTTTTCATAAGAAAATTAGTGGGCCGGGCGCGGTGGCTCAC
-GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGTGGATCATGAGGTCAGGAGATCGAGACCATCCTGGCTAACAAGG
-TGAAACCCCGTCTCTACTAAAAATACAAAAAAAATTAGCCGGGCGCGGTGGCGGGCGCCTGTAGTCCCAGCTACTCAGGA
-GGCTGAGGCAGGAGAATGGCGTGAACCCGGGAAGCGGAGCTTGCAGTGAGCCGAGATTGCGCCACTGCAGTCCGCAGTCC
-CGCCTGGGCGACAGAACGAGACTCCGTCTCAAAAAAAAAAAAAAAAAAAAAAAAGAAAATTAGTGTTTCCTTCTGTGATC
-AGGGCAGTTTACTCCCCAGAACTCTGCCTGCCACTGCTAAACCAGAGTTATTGTGGGGTGTGATTTCTGTGATTCCTTCA
-CCCTTCTCCCCTGACATTTTCGTAAGTAGTCTCTTTGGAAATAAACCCAAGTTAAATTATCTTAGTTGGTGTGTTTTCTA
-TTTTTCCTATTGAGACTCTGAAATGAGTATCTAAATGAAAAAATCTACCATCTTTTCTCATATACATAGTAGTTTCATTC
-TTGCAAAATTCATGGCATATTAAAACCATGCAAAAGTACTTGGCACTTAGGCAGTTACATTTGGGATTGTATAATTAAAC
-AAAGCAGGTTATTCACCTTCATTACATTAGAAAGTCATTCAGGACATACAGCAATCCTTAATTAGGAGCGGCTATCCCAT
-GTTACTGGACATATGGTATCCCTGTTTTCCAATCCTTAAAGTTTTTCCTTAAAGTTCCAAAATGCCGTCACTTATTATTT
-CCTGCCATTGAATTTTGTCACATGAAGTTGTAAGGCTGGGAATGCCATAGCCATCTTGAAAACATAGGTAGAAAGATAAG
-ATAATCACAAAGAAGTGGATCATGTTGAATTAACTAAGCATTGATACCATCTATTTGTTGTGCGATTTGGTCAAAGTTGC
-TCCTTGTTTTTTTCTTCAATTAGTTGACTATTCTGTTACTTGAAGCTAAAAACATTTTTTTCTTTTCTTTCTTTCTTTTT
-TATTTTTGACAGAACCTTACTCTGTTGCCCAGGCTGGAGTGCAATGGCATGATCTTGGCTCACTGCAACCTCTGCTTGCC
-TAGTTCAAGCAATTCTCACACCTCAGCCTCCCTAGTAGCTGGGATTACAGGCACATGCCACCACACTCAGATAATTTTTG
-TATTTTTAGTAGAGATGGGGTTTCACCCTGTTTGCCAGGCTGGTCTCAAACTCCTGACCTCAAGTGATCTGCCCACCTCA
-GCCTACCAAAGTGCTGGGATTACAGGTGTAAGCCACTGACCCTGCCCAAAAACATTTTAACCAATAGCAAAGCACATTAT
-TTCATTATATTTTTTCAAAAGTTGCCAGTAATTTCAATTAAAAATATTATATAACATGTTTAATGCAATACAAATGCTTT
-TCAATGTACAATGGGGTTAAGTCTTGATAAGCTGATTATAAATTGAAAATACAGTAAGTTAAAAATGTATTTAATATCTA
-ACTTACTGAATATCACAGCTTAGCCTGGCATACCTTTAATGTGCTCAGAACACTTACATCAGCTGACAATTGGGCAAAAT
-CGTTGAATACAAAACCTGCTTTATAATAAAGTATTGGATATTTTATGTAATTTGTTGAATATTGTACTGAAAGTGAAAAG
-CAGAATGGTTATATTCTATTCAAAGCTATCACTTTTGCTTCATCATAAAGTAAAAAAAATCATAAATTGAACCATTATCA
-GTTGTTGACCATCTGTGTATATGTATGTGTGTGTGTACCTATATAAACATGTATGTTTATATATATATTTGTGTGTGTAT
-ATAACCTCGGTGTGTGTGTATGTGTGTTTGAGAGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTATGAAATTGTAGGGA
-AGTAAAATTTCTTATCTTATAGATATAGCATGTTAACATGTTGGTACCTATCCTCCTGAGATGTAAAATTTTACATGGAT
-AGATATGTACATTTACAGTTGTACACAAAGAGAAACATATTCTGTAGCCTCTTTGTTTTTCTGCAGTTTCATTCAACACT
-ATCTGGTTTATATGGGTGATTACATATATAATGCTAGGATTAAGGTTCTTCTCTATAACTTTGAAACTTCCTTGATTATC
-AACCCTTGGTATATTCTTAGAATAGGATTTTATTTTAGAATTAAGATCCTTGTTTCAGGACTCTAGACTGTTAACACACA
-GAGCCAATAATTATTCAGAATGGTTGGGTTAGTTCACATTCCCACAGAGGAGACATCAAATGTCCAGGCTGCACAGCCTC
-ATTAACACTAGATTTTCTGGACATTTTATATAGTATTTCATCTGATATAAAAAGTAGAATTCTAATTTGATTATGGTTGT
-TAATTTATTTTTACATTTTTAGTCATTATGAAAATGTTTTACTATATGAAAAGCCAGGAAAGGGTTTTTTTTTTAAGGTA
-GTACTTCAGAAATATTTATGATACTTAATTTTTAAAAATTAACTCTAAAAGAATCTTGAAATGTCTGTTTAATAAAATAG
-GACATAAATACTGGTCACATTAGTGAAAAATATTTGTTTAAAATTAAAATATCTGCAGCAATCCTGTAGATATTAATAAG
-TTTTTAAAGAATGACATCTTCAAAATATAACTGTTCTAAACTAATATGTCTCCATTAATACATATAGATACATATATCTA
-AATAAATTTGAAGACTTCAAATTCCAGGTACAATATAATTTTTTTCTATCCTTTGATTTGTCATTCAGGATTTTGTAATT
-TGAACAGAAATATTTTGCCCTAACCACATGTCTGTCTTTTCTCTTACTAAAAATATTATTTTATGTAAAATTGTTTTAAA
-GGTCAGTTAGCACGTTTGAAAAGCATCTTGTACAATGTTACATAATATATTGCATATTTGGTTACATTGTTTTAACTGTG
-TAAATATGGTTTAAATCTGTGATGCTCTTTAGTGCTGATCATGATGCAAATCAAATTTATCTGTATAAAAGGCTCCTGTT
-AATTTTTTTTATTATACTTTAAGTTTTAGGGTACATGTGCACAACGTGCAGGTTTGCTACATATGTACACATGTGCCATG
-TTGGTGTGCTGCACCCATTAACTCCTCATTTAACATTAGGTATATCTCCTAATGCTATCCCTACCCCCTCCACCCACCCC
-ACAACAGTCCCCGGTGTGTGATGTTCCCCTTCCTGTATCCATGTTTCCTCATTGTTCAATTCCCACCTATGAGTGAGAAC
-ATGTGGTGTTTGATTTTTTGTCCTTGTGATAGTTTGCTGAGAATGATGGTTTCCAGCTTCATCCATGTCCCTACAAAGGA
-CATGAACTCATCATTTTTTATGGCTGCATGGTATTCCATGGTGTATATGTGTCACATTTTCTTAATCCAGTCTATCATTG
-TTGGACATTTGGGTTGGTTCCAAGTCTTTGCTATTGTGAATACTGCCACAATAAACATACGTGTGCATGTGTCTTTAGAG
-CAGCATGATTTATAATCCTTTGGGTATATACCCAGTAATGGGATGGCTGGGTCAAATGGTATTTCTAGTTCTAGATCCCT
-GAGGAATCACCACACTGACTTCCACAATGGTTGAACTAGTTTACAGTCCCATCAACAGTATAAAATGTTCCTATTTCTCC
-ACATCCTCTCCAGCACCTGTTGTTTCCTGACTTTTTTATGATCGCCATTCTAACTGGTGTGAGATGGTATCTCATTGTGG
-TTTTGATTTGCATTTCTCTGATGGCCAGTGATGATGAGCATTTTTTCATGTGTCTTTTGGCTGCATAAATGTCTTCTTTT
-GAGAAGTGTCTGTTCATTTCCTTTGCCCACATTTTGATGGGGTTGTTTGTTTTCTTCTTGTGAATTTGTTTGAGTTCATT
-GTAGATTCTGGATATTAGCCATTTGTCAGATGAGTAGGTTGCAAAACTTTTCTCCCATACTGTAGGATGTCTATTCACTC
-TGATGGTAGTTTCTTTTGCTGTGCAGAAGCTCCTTAGTTTAATTAGATCCCATTTGTCAATTTTGTCTTTTGTTGCCATT
-GCTTTTGGTGTTTTAGACATGGAGTCCTTGCCCATGCCTATGTCCTGAATGGTATTGCCTAGGTTTTCTTCTAGGGTTTT
-TATGGTTTTAGGTCTAACATGTAAGTCTTTAATCCATCTTGAATTAATTTTTGTATAAGGTGTAAGGAAGGGATCCAGTT
-TCAACTTTCTACATATGGCTAGCCAGTTTTCCCAGTACCATTTATTAAATAGGGAATCCTTTCCCTATTTCTTGTTTTTG
-TCAGGTTTGTCAAAGATCAGATAGTTGTAGATATGCGGCATTATTTCTGAGGGCTCTGTCCTGTTCCATTGGTCTATATC
-TCTGTTTTGGTACTAATACCATGCTGTTTTGGTTACTGTAGCCTTGTAGTATAGTTTGAAGTCAGGTAGCATGATGCCTC
-CAGCTTTGTTCTTTTGCCTTAGGATTGACTTGGCAATGCAGGCTCTTTTTTGGTTCCATATGAACTTTAAAGTAATTTTT
-TTCCAATTCTGTTAAGAAAGTCTTTGGTAGTTTGATGGAGATGGCATTGAATCTTTAAATTACCTTGGGCAGTATGGCCA
-TTTTCACGATATTGATTCTTCCTACCCATGAGCATGGAATGTTCTTCCATTTGTTTGTATCCTTTTTTATTTCATTGAGC
-AGTGATTTGCAGTTCTCCTTGAAGAGGTCCTTCACATCCCTTGTAAGTGGTATTCCTAGGTATTTTATTCTCTTTGAAGC
-AATTGTTAATGGGAGTTCACTCATGATTTGGCTCTCTGTTTGTCTGTTATTGGGGTATAAGAATGCTTGTGATTTTTGCA
-CATTGATTTTGTATCCTGAGACTTTGCTGAAGTTGCTTATCAGCTTAACGAGATTTTGGGCTGAGACGATGGGGTTTTCC
-ACATTCACAATCATGTCATCTGAAAACAGGGACAATTTGACTTCCTCTTTTCCTAATTGAATGCCCTTTATTTCCTTCTC
-CTTCCTGATTGCCCTGGCCAGAACTTCCAACACTATGTTGAATAGGAGTGGTGAGAGAGGGCATCCCTGTTTTGTGCCAG
-TTTTCAAAGGGAATGCTTCCAGTTTTTGCCATTCAGTATGATATTGGCTGTGGGTTTGTCATAGATAGCTCTTATTATTT
-TGAGATACGTCCTATCAATCCCTAATTTATTGACAGTTTTTAGCATGAAGATTTGCTGAATTTTGTCAAAGGCCTTTTGT
-GCATCTATTGAGATAATCATGTGGTTTTTGTCTTTGGTCCTGTTTATATGCTGGATTACGTTTACTGATTTTCATATGTT
-GAACCAGCCTTTCATCCCAGGGATGAAACCCGCTTGATCATGGTGGATAAGCTTTTTGATGTGTTGTAGGATTCTGTTTG
-CCAGTATTTTATTGAGGATTTTTGCATCACTGTTCATCAAGGATATTGGTCTAAAATTCTCTTTTTTTTTTTGTCTCTGC
-CAGGCTTTGGTATCAGGATGATACTGGCCTCATAAAATGAGTTAGGGAGGATTCCCTCTTTTTCTATTGATTGGAAAAGT
-TTCAGAAGGAATGGTACCAGCTCCTCCTTGTGCCACTGGTAGAATTTGGCTGTGAATCCATCTGGTCCTGGACTTTTTTT
-GGTTGGTAAGCTATTAATTATTGCCTCAATTTCAGAGCCTGTTATTGGTCTATTCAGAGATTCTACTTCCTGGTTTAGTC
-TTGGGAGGATGTATGTGTCGAGGAATTTATCCATTTCTTCTAGATTTTCTAGTTTATTTGTGTAGAGGTGTTTATAGTAT
-TCTCTGATGGTAGTGTGTATTTCTGTGGGATTGGTGGTGATATCCCCTTTGTCAATTTTTATTGCATCTATTTGATTCTT
-CTCTCTTTTCTTCTTTATTAGTCTTGCTAGTGGTCTATCAATTTTGTTGATCTTTTCAAAAAACCAGCTCCTGGATTCAT
-TGATTTTTTGAAGGGTTTTTTGTGTCTCTATTTCCTTCAGTTCTGCTCTGATCTAAGTTACTTCTTGCCTTCTGTTATCT
-TTTGAATGTGTTTGTTCTTGCTTCTCTAGTTCTTTTAATTGTGATGTTAGGATGTCAATTTTAGTTCTTTCATGCTTTCT
-CTTGTGGGCATTTAGTGCTATAAATTTCCCTCCACACACTGCTTTGAATGTGTCCCAGAGATACTGGTATGTTGTGTCTT
-TGTTCTTGTTGGTTTCAAATAACATCTTTATTTCTGCCTTCATTTCCTTATGTACCCAGTAGTCATTCAGGAGCAGGTTG
-TTCAGTTTCCATGTAGTTGAGTGGTCTTGAGTGAGTTTTTAAATCCTGAGTTGTAGTTTGATTGCACTGTGTTCCGAGAG
-ACAGTTTGTTATACTTTCTGTTCTTTTACATTTGCTAAGGAGTGCTTTACTTCCAACTATGTGCTCAATTTTGGAATAGG
-TGTGGTGTGGTGCTGAAAAGAATACATATTCTGTTGATTTGGGGTACAGAGTTCTGTAGATGTCTATTAGGTCTGCTTAG
-TGCAGAGCTGAGTTCAATTCCTGTATATCCTTGTTAACTTTCTGTCTCGTTGATCTGTCTAATGTTGACAGTGGGGTGTT
-AAAGTCTCCCATTATTATTGTGTGGGAGTCTAAATCACTTTGTAGGTCACTAAGGACTTGCTTTATGAATCTGGGTGCTT
-CTGTATTGTGTGCATATATATTTAGGATAGTTAGTTCTTGTTGAATTGATCCCTTTACCATTATGTAATGGCCTTCTTTG
-TCTCTTTTGATCTTTGTTGGTTTAAAGTCTGTTTTATCCGAGACTAGGATTGCAACCCCTGCCTTTTTTTGTTTTCCATT
-TGCTTGGTAGATCTTCCTCCATCCCTTTATTTTGAGCCTATGTGTGTCTCTGCACGTGAGATGGGTTTCCTGGATACAGC
-ACACTGATGGGTCTTGACTCTTTATCCAATTTGCCAGTCTGCACCTTTTAATTGGAGCATTTAACCCATTTACATTTAAG
-GTTAGTATTGTTATGTGTGAACTTGATCCTGTCATTATGACGTTAGCTGGTTATTTTCCTCGTTAGTTTATGCAGTTTCT
-TCCTAGCCTTGATGGTCTTTACAATTTGGCATGGTTTTACAGTGGCTGGTACCAGTTGTTCCTTTCCATGTTTAGTGCTT
-CCTTCAGGAGATCTTTTAGGGCAGGCCTGGTGGTGACAAAATCTCTCAGCATTTGCTTGTCTGTGGAGCATATTATTTCT
-CCCTCACTTATGAAGGTTAGTTTGGCTGGATATGAAATTCTGGGTTGAAAATTCTTTCCTTTAAGAATGTTGAATATTGG
-CCCCTACTCTCTTCTGGCTTGTAGAGTTTCTGCAGAGAGATCAGCAGTTAGTCTGATGGGCTTCCTTTTGTGGGTAACCC
-GACCTTTCTCTCTGGCTGCCTTTAAAATCTTTTCTTTCATTTCAACTTTGGTGAATCTGACAATTATGTGTCTTGGAATT
-GCTCTTCTCGAGGAGTATCTTTGTGGCATTCTCTGTATTTCCTGAATGTGAATGTTGGCCTGCCTTGCTAGATTGGGGAA
-GTTCTCCTGGATAATATCCTGCAGAGTGTTTTCCAACTTGGTTCCATTCTCCCCGTCACATTCAGGTAAACCAAATAGAC
-GTAGATTTGTTCTATTGACATAGTCCCATATTTCTTGGAGGCTTTGTTCATTTCTTTTTATTCTTTTTTCTCTAAACTTC
-TCTTCATGCTTCATTTCATTCATTTCATCTTCCATCGCTGATACCCTTTCTTCCCGTTGATCACATCGGTTACTGAGGCT
-TATGCATTTGTCGTGTAGTTCTCGTGCCATGGTTTTCAGCTCCATCAGGTCCTTTAAGGACTTCTCCACATTGGTTATTC
-TAGTTATCCATTCGTCTAATTTTTTTTTCAAAGTTTTTAACTTCTTTGCCATTGGTTCGAACTTCCTCCTTTAGCTCGGA
-GTACTTTGATCTTCTGAAGTCTTCCTCTCTCAACTCGTCAAAGTCATTCTCCGTCCAGCTTTGTTCCATTGCTGATGAGG
-AGTTGCATTCCTTTGGAGGAGGATAGGCACTCTGATTTTTAGAGTTTCCAGTTTTTCTGCTCTTTTTTTCCCCATCTTTG
-TGGTTTTATCTACCTTTGGTCCTTGATGATGGTGACATACAGATGGGGTTTTGGTGTGGATGTCCTTTCTGTTTGTTAGT
-TTTCCTTCTAACAGTCAGGATCCTCAGCTGCAGGTCTGTTGGAGTTTACTGGAGGTCTCCTCCAGACACTATTTGCCTGG
-GGGGTATCAGCAGTGGTGGCTGCAGAACAGTGGATATTGGTGAACTGCAAATGCTGCTGCCTGATCGTTCCTCTGGAGGT
-TTTGTCTCAGAGGGGTACCCGGCCATGTGAGGTGTCAGTCTGTGCCTACTGGGGGGTGCCTCCCTGTTAGGCTACTCGGG
-GTTCAGGGACCCACTAGGTGGGGGTTGTCTGCCCGTTCTCAGATCTCAAGCTGCGTGCTGGGAGAACCACTATTCTCTTC
-AAAGCTGTCAGACAGGGACATTTAAGTCTGCAGAGGTTATTGCTGTCTTTTGTTGGTCTGTGCCCTGCCCCCCGAGGTGG
-AGCCTACAGAGGCAGGCTGTCCTCCTTGAGCTGTGGTGGGCTCCACCCAGTTCGAACTTCCTGGCTGCTTTGTTTACTTA
-CTCAAGCCCGAGCAATGGCGGGCGCCCCTCCCCCAGCCCAACTGTTACCTTGCAGTTTGATCTCAGACTGCTGTGCTAGC
-AAACAGCAAGGCTCCGGGGGTGTAGGACCCTCCAAGCCAGGTGCTGGATATAATCTCCTGGTGTGCCATTTGATAAGCCT
-GTTGGAAAAGCGCAATATTAGGGTGGGAGTGACCTGATTTTCCAGGTGCCATCTGTCACCCCTTTCTTTGACTAGGAAAG
-GGAATTCCCTGACCCATTGTGCTTCCCAGGTGAGGTGATGCCTTGCCCTGCTATGGCTCATGCATGGTGCGCTGCACCCA
-CTGTCCAGCACTCCCCAGTGAGATGAACCTGGTACCTCAGTTGGAAATGCAGAAATCACCCGTCTTCTGCATCACTCACG
-CTGGGAGCTGTAGACTGGGGCTGTTCCTATTCGGCCATCTTGGCTCCACCCTCTAATTTTTAACTTTCAAAAGATTAGAT
-ACATTTACCCTCTTCTGAATTTTAATTCCTGATGGAAAGATTGTTAAATCTCAAGAGGATAATGAATCAGCTTCTGATTA
-TATTCTGGAATTGAGATTTGATCACACATCCAAGAATGCGTATTCACTTTCCTTTACATTACACACATGCATAATACCAT
-GCTGAGTGATGCTGGAAAAAGTGAGTCTTCAGTAATGCCCTCATGAAATTACAGTCTCACTACACTGAGGTATTTTCTTT
-TTAACCCTTTCTTTCTTTTCTGTTGTGAATATGTGCCTTCTAAGAGGTGAACAACGGGAAAAACTGAAAAAGAACCTTCA
-TCTAATTCAGTAACTAGCTTTTGTATCTTCTAAGAATTTTTATCTCCAGAAAGCTCTAATTTTCATTCCTTTACAAGCTT
-TATTTCTCTCTCCTTTCCAACACCAGACTTTGCTCTGTTTGTTTTCTATATCTTTTTTAGAGATGCCTACAATAGAAAAA
-AACTATGACATATTCAATACATCTGAAAAGTTTGCATTACCATAGATAAGAATGAATTATCTGTTTATAAAGAAAAAATA
-ATAAAAATATGAACCAAGAAAGCACAGAAGGTAGTAACCACATTTAGATGTTTATCATGGAATCATCTTTATAATCCATC
-TGTTACAATTCCACACAGCAAATTACAAGTAATTGTGAAGTTTCCCCTCATTTTATAGGTTTGGTCTTATAAGGCATACA
-ACACAAATTTTAATTACTTTTCATTTTGGTATTTGGATCTTAATTTGGTCAAGTGGCCACTGGGTAGATGATGGAGACTC
-TTGAGACATGCAGTCTTCTTCTAGCTTTGTTGATGTGAATATTACTGTGTATTTTTCATTCACTTATTATTTTACAAGGC
-ATGCTTCATTAAAAATATATCAGCATCTCATTGACAAATCACAAAATTTAAAAGGCACCAGAAAAAAACAATTTATTTAA
-AACATTCCTGTGTAAAAGTAGTCACCACTCTTACTATTCTTCAAATATTTTTGTTATATTTAAACGCAAGCCTAATTTTA
-TCTCGAGTGTCTGACCTTGATGATATTGTACACTTTAAACTTAGAAAAATTGAACTCTATTGGAAATTTCCTACAGATCA
-GCTTTTCTAGATGCCAAGCGCCTTGTTTCAGCCATGGTGATGACAGCAAATTGGGTTCTCAGGGATTCTGGCCTCTGGCA
-TCATCTCAGTTGTTTATAATTGAAGTTGGGTCTGATGAGAATGCAGCTTAGATGCATGGTGGGACTGCTGGGCTTAAGGC
-TGGCCTGCCAGGAGGTTGCATTGAGGTGTAACTAGGCAAAGAAAGAAAGAGTTTATTGAGGCACTACTGACAATAGCAAA
-GACTTGGAACCAACACAAATATCCAACAATGATAGACTGGATTAAGAAAATGTGGCACATAAACACCATGGAATACTATG
-CAGCCATAAAAATGATGAGTTCATGTCCTTTGTAGGGACATGGATGAAGCTGGAAACCATCATTCTCAGCAAACTATCAC
-AAGGACAAAAAAACACCGCATGTTCTCACTCATAGGTGGGAATTAAACAATGAGAACACATGGACACAGGAAGAGGAACA
-GCACACACTGGGGCCTGTTGTGGGGTGAGGGGCTAGGGGAGGGAAAGCATTAGGATATATACCTAATGTAAATGACGAGT
-TAATGGGTGCAGCACACCAACATGTCACATGTATACATCTGAAACAAACCTGCACGTTGTGCACATGTACCCTAGAACTT
-AAAGTATAACAAAAAAAAGAAGGGGTTGGGCAAAATTACCAACAATCTTCAACTATGAATTTGTATGAGTAGGGGCTTCC
-CACACCATCAGGCACTCCAAGTTGGAGAAACAAGGGATGTTGAATTGAAAGTTTAATTTTTTAGGCTTGATAGTCAGATT
-AGGGAAGTTTTGGGTACACCTTTCCCACTCTAGAGCCCTCTCCCTAACTCAGGGCCAATTTGGGGCATGGGCTCAGTGGA
-AAAGAGTGCCAAGATCAATTAGAAATATCCATCATGAACATAGGAGGCAGGCATTCTGGCCAAGGGGGTGCGTCTTCCCA
-CTTTGTAATCCAGAGTGCGATTTCTTCTTGCTATCTGTCCCTCCATAAATAAGCGTTGGGTGAAGGACAAGCTAGTTACC
-ATTGAGGATGGAATGAAATTCTACCAGAATTGCAAAATGAACTGAGAGCCACGAAAGTGTTCCTCTGTGAACCAGCAGAG
-AGATCTGTGGAAGGCAAAGGAAGAGGAGCCAAGAGGCCAGATAACATTCCTGCTTCCCCTACATTGTGAGAATGAAATTG
-TCAGCAACCTATATCAGTAATTAACCAGAGGCTTTTTAGAGAGTAAGACTTCTGATAGATACCTCAATAGCTGAAGTTGC
-TCTTCAGTACTGCATATAACCTGTGGACAGATTTTCATCATTATTAATTCATTTATTCAACACATAGATATTAAATTCAA
-GGCATAGTTCTAAACTATGCAGTCAATTCCAAAAAAATAATAATGAAGGACATTAGCTCTGCCTCATAGGACGTTAAAAC
-TCTAGCTGCTAAATGAGACAAATAGGGTTCCCACATCAAGTGCCTGGGCTCCTGTTATAAACTGGACTCTGCTTCCATTG
-GCTTCTCTTGTTTCTGTTTTGATAAACCCATCATTTGGCTTAGTCCCTACCCTTGCCATGCTCACCCACCAGTAGGTGGA
-CCTCCTTGACCATAACTACAGACATAGATCTTTGATTGTTTCTTTTCAAATGTTTGCTTACTTTAGAGGTGCAGTCAAAT
-GTTGTTTGGACCATAAGACTCTGAGGCTGTGTGTGGTTGAAACTGTCTTGAGACTCAAAGAGCTATTGAGGAAGGGATTT
-GATAGCTGAACTCTTTTGAAGATTTTCTCTGTCTCTCACACATCTGGGGCTGAATAGCTTAACGTTTAATTTCTACATCG
-ACGATAGTTTAATAGCCATTCATGCAAATCAGTTCTGCTGTGAGTTATTATCCTACTCCAATACCAACTAACGCATTCCT
-TAAATTTAGTGTACGTATAAATTCTACATGGTAAGTGAAGCTGTCTTTATGAATGGCTGCTATAGAATATACTAGATTGT
-GTAGGTTTTAGTACAATCCAGGTAATTATCAAGCCTTTGTAATATTTTCAGGAAAGTGATCCTTTCACTTCAGTTTATGG
-AACTTGAAAATTTTTTAGTTGCCACCGACTAGTTAGATCATAAACTTAATTCTATGTATCTGAATTTATTTTTCTATTTA
-TAAATTTATCTGGGTGCTTTCTCAAAGGTTTCCCAGATTAAAAACCTATGGCTTTGTAAAATTAAAACAGAAGTAATAGG
-AATTGAGTTAAAAAACAGAATCAGGCCAAGCCTGGTGGCTTATGCCTCTAATGCCAACACTTAGGGATGCCAAGGGGGGA
-GGATCATTTGAGGTCAGGAGTTCAAGACCAGCCTGGACAACATGGCAAAACCCCACATGTATTAAAAAAATACACAAATT
-AGCTGGGCGTGGTGGTGAATGCCTTTAGTCCTAGCTACTCAGGAGGCTAAGGCAGGAGAATAGCTTGAACTTGGGAGGCT
-GAGGTTGCAGTGAGCCAAGATAGAGCCACTGAATTCCAGCCTGGGTGACAGAGTGAGATCCTGTCTTAAAAAAAAGGAAA
-AAAGAAAAAGAAAAAACAGAATCATACAATGAGAGAGATTGTATAGCCCTTTTAATTGTCCATAATGGATACATTTCTTT
-TTCTGTGTAATAGTTTATCAGCATGAAAAAAAAGAGTCACTGAACACTGATAATTTTCTTTCTCTCTCTCTCTCTCTTTT
-TTTCCTTTTTTTGGAGATGAAGTCTCGCTCTGTTGCCCAGGCTGGAGTGCAATGGCAACATCTCTGTTCACTGCAACCTT
-CACATCCTAGGTTCAGGAGATTTTCCTGCCTCAGCCTCCCAAGTAGCTGGGATTCCAGGTGCACCCCGTCATGCCTGGAT
-AAATTTTTGTATTTTCAGTAGAGACGGGGTTTCATCATGTTGGCCAGGCTGGTCTCAAACTCCTGACCTCAAATGATCTG
-CCCGCCTTAGCCTCCCAAATTACTGGTGATGATTTTCATTTAATGGTGTTCTACAAAGTGAGTTTAGGCAGTGAAAGGGC
-ACAAGTCACCTATAGTTTACCAGAAAGTAGTACCAGTCACCAGCGTTGAAGCATACTCCTAACCCTGGAAAATTTCTTCA
-GCAGCCAGAATTAATCTCAGATTTTGAGACTGGAGCAAAGACTAATTTGGTATGTGTTCATTTAGATTAGTAAATCTCTA
-TGGTGTTCGAACTGTATAATATCAAATCTAAAATAAGTCAAGAGAGTTAGACAATATCTCATCTCTGAGAAAATAAATGC
-ATTATTTTCAAGAGATTTAAGACTGAATTTAAAATCCAACTGCCTGTTCCAGTGTATGTTTCTCTAGAATATGGCCAAGC
-CCTACAAATTCTGGATAGTGTCCTCCAAGTTGTGTTTAAGTGATAATTGATAAATCTATGGTTTAGATACATATGGAATT
-CCACATAACTCTAGCTCCAGCCTTTGCGAGTAAAAATTGGCAGTGATCATGGCCTTAATGGAGGCATGTGGTTAATTGGA
-ATTTTCAGTACCAAAAGTCTTCTTCTTACTAGTTTATCAGGGTACCCTATAATAGTATCCATAACTCATTGCCCACTTGT
-CTGTTTTGATTTCTTTTTTAAAAATACAATTTTAAACTTAGAGGTTTTGTACCTCAAGTCACATATGTGGCACATTTATA
-AAATAATCATGCCTTTGCATATTTTTCCTTTGATATCTTAGCTGTATATACAAGCCACTTATGTTTTTTAATTGCCACAA
-ATATTGCACTGAAATAGAGCACTAGTTGCAAAAATGCCTGGTATAACATTTCTTCTTGTTCTTGAAAGTAATTTTAATAC
-CCCATGTTTAAGATATTCCTAGACAACTATAAGTAACTATAATTATTTCTGCTAGGTAGAAGCATCTTTGTGGTCAACAT
-TTGTGAAGTGCCTTGTAAATAAAAATATGCTTGAGTAGAAATAGTATTTTGCAAATATAGCCCTAAATAGAGCTACTGAT
-TTTACCAAGAATTAAAGACTCCAAACTCTGTCTTTGTCTTTCAAATTTGGTTTATAGGAACATCTCATTACAATGAGCAA
-AAAGCCTATCTGATCATTAAAGAGATAATTTTGACACTTTCAAATGACACAGCTAATTTGTAGTAGGTTTTTGAAGTGCA
-AATTACATGTTTCTGTTTAAATAATGACAGTAAAATATGGACAGTATCTATTCACACTCTATATACACAACTACAACTTG
-TCCCTAGAAGAAAAGTTTAATTTTTCAGGTCTCATCCACAAAACGAAGTGTTAATAAGCTGTATCTTTATTCTCACTTTT
-AAGTAATTTCTTCTTAACCATTGTATAACACTACCACAGTTTGTATGGAGATAAAATAACTCATGGTGAGAAATCCAGTT
-CTTTAAAAAATCATTTTACCTTCAATCACTTTTAGGATGTCTATGGTTTTAGAGTAAGGACGAAAATTTATAAACATTTG
-TTAAATTATGCAACTGTGTTTGAAGATGTTTCAAAATTACATTTTCCTTATTTTACAACTAGTTTTCATGTATTCACAAA
-CGAGACACATGAGAATTATTAATGCAAAAGCACAGCATATCAACAAAGTTTATAATGTAAATAGTTTAGTTAGGAAAGAA
-TGTAATGAGTGAATTATCAAAGCTATTTTATTGGTTCCTAGATTTACCATAGAAGAAAATAAAGCAGCCTTTTAAAAATT
-TCTCAGCACTGAGTCCATTTAAGGTCTGTATTGTATGCCGTAAGTTCTAAAAAATGTTATTGCCGGTAAAAATAGGATGC
-CTATCTAAAATTGTCTTTTTAAAGGTTCTCTCTTATTCTTCTTCCCTTCCTATGTGTGCACAGAATACTGTCATCGTCTT
-GATTGGAACACTATCTCTCTTTCTCAGAGGGTGTACATTTGTAGAAGGGAGAAAATATTTGTTAATTTTGCTTCCTGTAA
-GATAAGGCCTCAATGGTTAAAGGTTAGTTAACAAACTTTTTTTTTGTCTTCATACTATTATCTTGGAATTACCAACTGGC
-TTCTACTTGGATTTTGAATAATGAAAGAAAAGAACTAGCATTTGTTAGAACTTACTGTGTTCCAGAAACTTTATTGATGC
-CATTTCTTCTCATTATCACATTCATTCTTTCAATTAGTATAATTTTTTTCCATCTTAATGAGGTGGGACCAGAGGTTTTG
-TAATATCCACTAACCCACTGTGGATTTCATGGATTGCAAGAGGAAGAAAGCATGGTGGAACTCAGGTTTCTCTGATTCCA
-AATTCACATCCTTTCATGTCTCCATGAAAAATAGAAAAGATAAATTGGGCTCTATTCTAACAAGAGAAACACAATTTTCC
-GTCAGTTAAATGAATAATTCTTTTTTATTTTATTTTATTTTATTTTTATTATTATACTTTAAGTTTTAGGGTACATGTGC
-ACATTGTGCAGATTAGTTACATATGTACACATGTGCCATGCTGGTGCGCTGCACCCAGATACCTAAATGAATAATTCTTA
-AACCTCAAAAATAAAAAGTAGCAAAACCTCAATTCAAGAGTAGACATAAAGGTTGTGACATGGGTGGCAGGGACATATGT
-CTAGTGACAGATTTCCTATGCATATCTGACCAAAAATCCCCCTCATGATTTTCAAATCAGATGCTTAACTACATTTAATG
-AGTTTCCCGAATCATTAATATCAGGCTCTGAAAACAGGATCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGATCCTGTCGAAAGAAACGAATGGAATGGAATGGAGTGG
-AGTGTAGAGGTGTGGAGTGATGTGGAGTGGAATGGAGTGGAATGGAATGGGATGGATTTGAATGGAAGGAGTGTAGTGGA
-GTGGATTGGAGTGGAGTGGAGTGGAATGGAATGGAATGGAGTGGAATGGAATGGAATTGAATGGAATGGAATGGAATGGA
-ATGTTGTGGAGTGTATTGGAATGGAGTGAAATAGAGTGTAATGTAATGTAGTGGAATGGAGTGGAGTGGAGTGCAGTGGA
-GAAGGGTGTAGGGGAATGGAATGGAATAGTGAAATGAAATGTGAGCTGAGATACTCCCACTGCACTCCAGACTGTGTGAC
-AGAATGAGATCCTGTCGAATGGAATTGAATAGAGTGGAATGAAATGGAGTGCAGTGGAGTGGAGCAGAGTGGAGTGGAGT
-GGAGTGGAATGGAATGGAATGGGATGGAATCAAATGGTATGAAGTGGAGGGGAATGGAGTTGAGTGGAGGGACGAGGAGT
-GGAATGGAATGGAATTGGATGGAATGGGATGGAGTGGAGTGGAGTGGGGTGGAGAGTAGTGGAGTAGAGTGGAATGGAAT
-GGAGTGGAGTGGAGTAGAGTGGATTGGAGTGTAATGGAATAGAATGGAATGGATAGGAATGGAATGGTATAGAATGGAAT
-GATGAAATGAAATATGAGCTGAGATTGTGCCACTGCACTCCAGCCTGGGTGACAGAGTGAGATCCTGTCAAAGGAAAGGA
-ATGGAATGGAAAGGAGTGGAATGGAATGGAATGGAATGGAATGGATTGATTGGAGTGCAGTGGAGTAGAGGTGAGTGGAG
-TTCACAGTAGTGCAATGGAATGGAATGGAGTGGAGTCGAGTGCAGTGGAGTGGGTTGGAATGGAATGGAGTGGAATGGAA
-TGGGATGGAATGGAATGGAGTGGAGTGGAGTGGAGTTCACAGGAGTGCAATGAAATGGGATGGAATGGAATTGAATGGAA
-TGGAATGGAATACAATGGAGTGGAATGCAATGGAATGCAATCGAATGGAATTGTGAAATTAAATGTGAGCTGAGATAGTG
-CCACTGCACTCCAGCCTGTGTGACAGAGTGAGATCCTGTTGAAAGAAATTAGTGGAATGTAAGAGAATAAATTATACTGG
-AATGGAATGGATTGGAGTGGAGTGGAGAGGAATGGAGCTTAATGGAGTGGAAGGGAATGGGAAGGAGTGGAATGGAATGG
-AGTGGAGTGGAGTGGAGTGGAGAGAAATGAGGTAAAATGCAATGGGATGGACTGGAATGGAGTGGAGTGGAGTGGAGTGA
-ATTGGAATGGAGTGGATTTGACTGGATTGCAGTGGAATGAAGTGGAGTGGAATGGAATGGAATGGAATGGAATGGAATGG
-AGGGGAGTGGAGTGGAGTTGAGGGGAATGGAGTGGAGTGGAATGGAGTGGAATGGAATGGAATGGAATGGTGAAATAAAA
-TGTGAGCTGAGATTGTGCCACTGTGTTCCAGCCTTTTTTTGACACAGTGAGAGCCCGTCAAAGGAAAGGAATGGAATGGA
-ATATGGTGGAATGGAATGGAGTGGAGTGGATTGGAGTGGAGTGGAGTGGAGTCAAGTGGAACAGAGTGGAATGGAATAGG
-ATGGAATCGAATGGCATGTAGTGGAGTGGGATGGAGTGAATTTCAGTGGATTAGGGTGGAATGGAGTGGAATGGAATGGG
-ATGGAAGGGAATGGCATGGAGTGTAGTGGAGTGGACTGGAGTGGGTTAGAATGGAATTGAATGGAATGGTATGGAATGGA
-ATGGAATGGAATGGAATGGAATGGAATGGTGAAATTGAATGTGAGCTGAGATAGTGCCACTCCACTCCAGCCTGGGTGAC
-AGATTGAGATCCTGTCAAAAGAAAGGAATGGAATTGAATGGAGGGGAATGGAATGGGATGGAGTGGGGTGGAGTGGAGTG
-GAGTGGAGGGGACTGGATTTGAGTGGAGTCTAGTGGAACAGAGTGGAATGGAATGGGGTGGAGTGGAACGGAATGGAATG
-GAGAGGAGTGGTGTGGAGTGGAGTGGATTGGAATTCAATGGGATGGAATGGTATGGAGTGGAGTGGAATGGAGTGGAGTG
-GAATGGAATGGAATGGAATGGAATTGGAATGGAATGGAATGGAATGGAATGGAGAGGAGAGGAATGGAGTGGAATGTAGT
-GTAATTGGAAAGGATGGAATGGAATGGAATGCCATGGAATAGAATTAGGAATAGAATGGAATGATGTGGAATGGAATGGA
-GTAGAATTCAGTGGAGTGGAGTGGAGTGGAGTGGAATGTAATGTAATGGAATGGGATGGGATGGAGTGGAATGGAATGGA
-GTGGAGTGGAGTGGAGTGGAGTGGAATGGAGTGGAATGCAATGGGATGTGATGGAATGGAGTGGAGTGGAGTTGAGTGGA
-TTGAAATAGAATGGAATGGAGTGGAGAGGAGTGTAGTGGAATGGAATGGAATGGAATGGAATAGAAGGGAATAGAATGGT
-GAAATGAAATGTGAGCTGAGATTGTGCCACTGCACTCCATCCTGGGTGACAAGTGAGATTCTATCGAAAGAAAGGAATGG
-AACGGATTAGAGTGGAATGGAATGGAGTGGGGTAGAGTGGAGTGGAGTGTAGTGGAGTAGAGTGGAATAAAGAGGAATGG
-AATGGGATGTAATGGAAAGGAATGCAGTGGAGTGGAGTAAAGTGGAGTGGAGCGGAGTGGAGTGGTGTGGAGTGGAGTGG
-AGTGGAGTGGAGTGGAGTGGAGTGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGCACGGTGAAATGAAA
-TGTGGGCTGAGATTGTGCCACTTCACTACAGCCTGGGTGACGGAGTGAGTTCCTGAAGAAATAAAATAATGTAATAGAAT
-GGATTGGAATGAAATGGAATGGAGTGTAGTGGACTGGAGTAGAGTGGAATGGAGTGGAGTAGAGTGGAAGGGAATGGAAT
-GAAATGAGATGGAATGGAATGGAATGGAATAGAATGGAGTGGAGTGGAGTGCAAAAATCCTCAATAAAATACTAGCAAGC
-CGAATCCAGCAGCAAATCAAAAAGCTTATCCACCATGATCAAATGGGTTTCATCCCTGGGATGCAAGGCTGGTACAACAT
-ACGCAAATCAGTAAACGTAATCCATCATATAAACAGAACCAACGTCAAAAACCACGATTATCTCAATAGATGCAGAAAAG
-CCCTTTGACAAAATTCAACAACCTTCATGCTAAAAACTCTCAATAAATTAGATATTGATGGGACGTATCTCAAAATATTA
-AGAGCTATTTATGACAAACCCGCAGCCAATATCATACTGAATGGGCAAAACCTGAAAGCATTCCCTTTGAAAATCTCAGT
-TACCTTTCTTTTGGATATGAGTGTGAGGAAAGAGTACCTACAAACTACCCTTTTAGTTAAATGCCATATACAATAAATAT
-TAATACCTACAGTCCTCATGTTGTACATTAGAGCCCTCAATTTGTTAATTCTACATATCTGCAACTTTGCATCCTTCGAA
-TTCTCTCTCTCCATTTTCTCTTCTCACCCCCAGCCCCTGGTAACCACTGTTTTATACTCTATCTCTGCATATTTACCTTT
-TTGCTGTTTTTGTCCTGAGAAGTTTATTGGGACTTTCAGCTAGGAGATAATATGTTCTGAGTCTTGATTATCTCAAATTA
-TATCAGGTAAGAAGTTTTACTTGTCTGGAGAGCAGAGAGCAAGTGCATAATTTTATGCAGAAGAGGGAATAAAGAGAATT
-CTCTAATTAAAATTTGAATCAGAAATATGGTTCATATTTTTATGTACAACAATCTCTAAGGCTTCTTGGAAAGGAACTAG
-CTGCCTGATTTTTTTTCATTTGAATCCTCTAATACATGAAGAGGATGATTCTACCATACCAATCACAAGAATGATATCTG
-TAGAATCAAAAGTTGAAATCCTATTATCCTAGAAGTTTTTTCAGAAAACTTGAACATGTATTGAAATGTCATGCTGGTCA
-TATATGTTACAGCAATGAGGAATTTACTTATTATATACTTTAGCTTTTTAGCCCTTTCCCTGCCCACCAGAAATGTTTCT
-TTTGAATCCAATTTGGTCCTCAGAGTTTTAGAATGTTAAGGAATGTATAGGGGTATCTTTTTTCTTCTTTTTTTTTTTTG
-TCAAGCTATTGTATATTTTTACTTTACCTGTTTGGGTATGTAGTTACTATTTGTTTGGACTGTCATACTAGAAAAAAATT
-ATAGTGAATTTTACATGTATGGAGTCTTCATTAATCTGTATAAACTGACAAGTTTAGAATATCAAAGTCATCACTGTAAA
-AAATAAAGTGATATTTTATCTGGTCTATCTCCTTGCAAATAAAAGAACAATAAATTCTGTACTATTATGAAATATAAGAG
-CTTGAAAATTTTTCAAGCGTCTTGTATAGAATGGCCTTCGAATTCAAGGTATAAACTACAACAAAACACTTTCGAGATCT
-AGTTTGATTGAAGAGTGCATTCTTACTTATTTATATATTCTCTGCAATTTCTGATTCAAGATAGTCCACAATTCTAAAGG
-AAAACCAAAATAGAATAATAATTATAAAACAAAATAAAAAGTAATTGAGGAAGATAATTGAGCAACTTATTCTTGACAAC
-TAGCTTTTTAACAAACAGAAAAGTGCACTAAAAATACTGCCTAGTTGTTTAAAGTAGGCTGAGATCTGACTGTATCCCCT
-GAGTGACATAAAGAAAAAACTACCTTTGAGGAAGCACAGTGATTAAATTTAAAAGATTTATTGTTTAACCTCAGGAAGAC
-TTTCAATAACTTTTTATAAATTGTATACAGTTAATGGAAGACATGCTAGGCTTCTTGTAAGAATTTATTCCAGATCACTG
-TGTATAATTAATGGCTTGTCTACATATTTTTTCAATAAAACTGTTCATGAAGAATTTTAAGTATGCACTTTCAGTAACAG
-AATGGATATATCTTTGTGAAGATACCATTTATGTACCATAACATCCAAAGCATAATGAGGAGATTTTGATACACTGCAGA
-TTTAGAACTGAGTTGGAAAACAAAACTTCAACATACTGTCTTGTCAGCACAAAGCAAATAAATTCATCACTGTCAGTTGA
-GATTTAAATTCACAAACTTATAAGCAATAAAATCAAAGTAATTTTGTTATAAGTTTTTTGACACCAGATTATATGGGGTA
-AATAATTTACTTTCTAATCAAGCAATTGATACATATAAACCTGAAATAGAGAGTTTTGCCTTTTAATTAGATACATTGTT
-ACGCAAAGAGTGGTTGAAGCTGCAGTGGAGAATTATCTTTTTCTCTTTTTGCTGTTCTTACAAGGACAGTTTCTAGAATT
-CTTTTCAAAACAATAGAACAGAAAATTTCACTTACTTAATTTAACTTTTGTTAAAGTACTTTGCCAAAATTAGCAAACTA
-TGAAAGGAAAGTTTGCCTTTTCAATATATATGTAAGTGGCAAGTAAAAGTTGTTCTTAAATCACGTGATCTCATAGAAAT
-AACATGGGATAAAAAGAGTTCTGAAGGTGTTCAGGAAATGCCAGTCCTAAATGTATTGCTTTGGTGTACTGATTATATTG
-AACTGAAAATATTTGAAAAATAACAACTGTGGGACATGCTTTCTCTGCACTCCCTTTACGTTCCTCAAGAGAGATCCTCC
-AAAAGGAATTTTCAATACCAGAATGAATGTATCTTTGTAAAGATACCATTTATCTACCATAACATCCAAAGCATGATGAG
-GAGATTTTTATACACTGCAGATTTAGAACTGAATTGGAAAACAAAGCTTCAAGATACTGTCTTGTCAGCACAAAGACATT
-CATCTCCTTCCTAGGAGTTTCATCAGCCAGGGAAAATTGACTCCTCATATCACAGGAGACAAGACTAAGAGTCCATTCCA
-CACCAAGGCAGACTGCCACAAACTATCATCTATGCTCCTAGGGGTCTGGTCATCTTTCCCAAAAGTCATTTGCTCTCCCT
-TAAGTTTCCTACATTCTTCCTCCTGCCTTCCCTACAAGCTCCTAAATCTCCCTGGGTTTTTTTCTTGGTGGTGTTTTGTT
-TGTTTTGTTTTGTTTTGTTTTTGATTCCACGTTTCTTTCCTGTGATTCCCCCATGCGTGTAATAAATGTGTACACATTTT
-CTTCTTTTGACATGCCTGTTATCCATTTATTCAATAGACTCAGTTATCATACCTTCAGAGGGTAGAGGGAAAGGTCTCCA
-AGTCCTACAGTTCCAAAAGAAAATAGCTAGTAATGCAAATGCAAAAGTCATATAAACTTTGAGACAAAGTTAGCGTCTTA
-TATGGTACGTTCAGAAAGAAGAGGTGTGTTGCACACCAAGGGACATTTTCCTGGTCTTAGCTACTAAGTTTCTCTGAGAA
-GAAGCAGTTACTACTACAGCAGTTAAACACCTGACTCCCAAATTATAAAAGCCTAAGTGTTCAGATTAAATCATGAGTTG
-TCACCTGTGAATCATAAAGTCTGAACTCTTTAAATTGCAAACACACATAGAAAAACGATTCTTACACAGGGATCCATGAG
-TGGAACTGCAAAGTTTTGTCAAAATCTATATATATGTTTTCTTTTTAAGGGTCATAGATTTCAATATATGTTAAAAGATA
-TCTGGGGCTAGTAAAGATTAATAACCATTTTCAGTTTTGTGCTGAAATTGGCAAATCATGGCTTTTCTCCCTCCAACACA
-CCCCCTCCCGCCTCAGCACACCACTGGTTAATCTTTATTTTCAGGAGAGAAAAAGATGTTTCATATTAATAAAGGTAAAT
-TATACACTTGTTTGTTTTATACTTTTCCACCTCTTAAGCTTAATCGTGTTTTAATAATGTATAATTGAATACATTAACAT
-TTAGATGTTAGTAAATGAATAACAAATGTTCATTGTTTCTCTTGAGTAGAGGAATAAAAATTTTGCACCTGTTGTATAGA
-ATGATTTTTAAAATCTCATTCAATCCTTCAGAAGTTTAAGATTTTTTTTCAAGAATTTTTATATAAAATTTTTACTCAGA
-AGCAGATAGCTCACAAAAAGTATGGGGGTTTTTTGGATTATAAATAAACTATTCCACTCACCAAGATGCTGAGACATCCT
-ACTTTGTGGTATTTTGAAATAAAAACAAAACACAAGAATGTGACGATGAAGCAAGTGAAAATTAAAAGGGTACAGACTTT
-AGAAGTATCATAAGCTAAAAATAAAATGAAACAAACCTGTAAAGGAACCAAAAGCCCAGGTAGATATAATACAGTAAATT
-ATGAGAAGCTAAAAAAAATGAGGAGGTGATAAACAATAAAGTGAAAATCTCTGATAAAGCCAAAACTACTTGAATGGCAG
-TCAACAAAACAGAAGAAAAAAATGACACTCATAACAAGGCAGAACTATGGAAATGCATCCCTGGGGGTAAGATAATAGAG
-TTGCGAATTAGTGGAGGTGGATCACAAATACTGGCCAAATAAAGCCCGCTAACATAATTCAAAGGACAGAGAAATTCTGT
-AGCTGAAGATAAAAAGTCTGAAATACATTATGGTATAGTCAAATGAGTGTCATTTCTAATAGACACACTTATTTTTCAAG
-AGTTGATAATATGAAGTAAAAATTTAGTATGCAAAGTTCAAATTTTCCATTTGTTGAGTAATTCATTTTTATTAAATATT
-TTCCAACAATTAAACTAAAGTGGTACCAGAACAGAGTAGACATTCTGAGTTTTCACTTTACAAAAGCTACACATAAATCT
-ACGTACTTCTTAAGGGTATAAACAAAGTCAGAGCCTGTGTGATATTTCAATAAACAATTGGAGAAAATTTTTTTAAGAAT
-AGATTATATACATATTGACCTCTTTGAGAACCTTATTTTTTTCTTTTTTTTGTGTGTGTGTTTGTTTTTTTTTGTGTGTG
-TGTGTTTTCATTTCTTTTTTAAATTATTATTATTATACTTTAAGTTTTAGGTTACATGTGCACAACGTGCAGGTTCGTTA
-CATATGTATACATGTGCCATGTTGGTGTGCTGCACCCATTAACTCGTCATTTACATTAGGTGTATCTCCTAATGCTATCC
-CTCCCCCCTCCCCCCACCCCACAACAGTTCCCAGTGTGTGATGTTCCCCTTCCTGTGTCCATGTGTTCTCATTGTTCAAT
-TCCCACCTATGAGTGAGAACATGCGGTGTTTGGCTTTTCATGCTTGCGATAGTTTACTGAGAATGATGGTTTCCAGCTTC
-ATCCATGTCCCTACAAAGGACATAAACTCATCATTTTTATGGCTTCATAGTATTGCATGGTGTATATGTGCCACATTTTC
-TTAATCCAGTCTATCATCGTTGGACATTTGGGTTGGTTCCAAGTCTTTGCTATTGTGAATAGTGCCACAATAAACATACG
-TGTGCATGTGTCTTTAGAGCAGCATGACTTATAATCCTTTGGGTACATACCCAGTAATGGGATGGCTGGGTCAAATGGTA
-TTTCTAGTTCTAGATCCCTGAGGAATCACCACACCGACTTCCACAATGGTTGAAATAGTTCACAGTCCCATCAACAGTGT
-AAAAGTTTTCCTATTTCTCCACATCCTCTCCAGCACCTGTTGTTTCCTGACTTTTTAATGATTGCCATTCTAACTGGTGT
-GAGATGGTATCTCATTGTGGTTTTGATTTGCTTTTCTCTGATGGGCAGTGATAGCATTTTTTCATGTGTTTTTTGGCTGC
-ATAAATGTCTTCTTTTTAGAAGTGTCTGTTCATATCCTTCACCCACTTTTTGATGGGGTTGTTTTTTTCTTGTAAATTTG
-TTTGAGTTCATTGTAGATTCTGGATATTAGCCCTTTGTCAGATGAGTAGGTTGTGAAACTTTTCTCCCATTCTGTATGTT
-GCCTGTTCACTCTGATGGTGGTTTCTTTTGCTGTGCAGAAGCTCTTTAGTTTAATTAGATCCCATTTGTCAATTTTGGCT
-TTTGTTGCCATTGCTTTTGGTGTTTTAGACATGAAGTCCTTGCCCATGCCTATGCCCTGAATGGTATTGCCTAGTTTTTT
-TCTATGGTTTTTATGATTTTAGGTCTAACATGTAAGTCTTTAATCCATCTTGAATTAATTTTTGTATAAGGTGTAAGGAA
-GGGATCCAGTTTCAGCTTTCTACATATGGCTTGCCAGTTTTCCCAGAACCATTTATTAAATAGGGAATCCTTTCCCTAGT
-TCTTGTTTTTGTCAGGTTTCTCAAAGATCAGATAGTTGTAGATATGCGGCATTATTTCTGAGGGCTCTGTTCCATTCCAT
-TGGCCTCTATCTCTCTTTTGGTACAAGTACCATGCTCTTTTTGTCACTGTAGCCTTGTAGTATAGTTTGAAGTCAGGTAG
-CGTCGTACCTCCAGCTTTGTTCTTTTGGCTTAGGATTGACTTGGCAATGCAGGCTCTTTTTTGGTTCCATATGAACTTTA
-AAGTAGTTTTTTCCAATTCTGTGAAGAAAGTCATTGGTAGCTTGATGGGGATGGCATTCAATCTATAAATTACCTTGGTC
-AGTATGGCCATTTTTACAATATTGATTCTTCCATGAGCATGGAAGGTTCTTACATTTGTTTGTATCTTCTTTTATTTCAT
-TGAGCAGTGGTTTGTAGTTCTCCTTGAAGAGGTCCTTCACATCCCTTGTAAGTTGGATTTCTAGGTATTTTATTTTCTTT
-GAGACAATTGAGATCCTTATTGTGAGATTCAATTCAGAATCTGGGATTTTGTTTTGTTTTGAGATGTAGTCTCTCTCTGT
-CACCAGGCTGGAGTACAGTGGCACAGTCTCTGCTCACTGCAATCTCTGCCTCCCAGGTCCAAGCGATTCTCCTGCCTCAG
-CCTCCCAAGTAGCTGGAACTACAGGCACGTGCCACCATACCCAGCTAATTTTTGTATGTTTTTTTAGTAGAGATGGGGTT
-TCACCATGTTGGCCAGGATGGTCCGGATCTGTTGACCTTGTGATTTGCCTGCCTCAGCCTCCCAAAGTGCTGGGATCACA
-GACGTGAGCCACTGCGCCCAGCCCAGAATCTGGGTCTTAACCAGATTTGCCATTATAAAATGAAATGAAACCAAAACCAC
-CAGTCAATATCTGTAGCAGTGTTATTGTTGGGGAGCATGCACGTTTGTTTGAGCTTACTTATATATACAGAGCTGTTTAG
-CTTAATCTTTAAATTGAAAATTTTTAGTATTTTTAGAATGTTTTAGATACTTTGATGAATAAATTTTGTGTTAACAAACT
-ACTATTAATAAAACTTATAAATTAAATATTTCTGAACACATTGGCAGAGGTAAATGATAAAGTTATATTCACACAATTAG
-TTTTTCTTGCACAGAATTGACATTTTGTCAAAAAGTTAAAATCTTTGAAATGTGTTTTCTGTCCTCATCTTTCCCCTTTT
-GAGCATTTTTCCCCCTGGGTTGGTTATAAAATATTCCCTAACTTCAGGCATCTGGTTAAGTTTTGGGTTTTCTCCCTTCC
-TACCAACTCATATGGATTGGTAATGATCTGATAGAAGACAATTGCCAAAAATCAATCAAATATGTTTTAAATGAAACTTC
-TCCAATATAATATTCATATTAATCCTTCTTTAATTGCTGAATGAGTAATAATTGTTCACTGACCCTTAAAATCCTAAAAC
-TTAATCAGCTCACTGGAGTGGATGAATGGATGTTTGTCTAGATGAGAATGCTTAAGGTCTACTTCAAGGAGTTCATAATA
-GTAAAAATGTCCTTTTCTTCCATCAGAAACTTCATCCTGGATCTTTTCATCCTTGTTTTTCTACTAGCTCTCCTTCTCCA
-AATACACTGACTTGGAACCCCAGTTTCAGTGGTGGACTGCGTGGATTTGATTCTAAGCTATGCTATAATGAGAAAGTAGC
-TCTAACCCTATTCTCATTTTCTTCACCTGTAATATAGAAATCATCATCAGACAATATACAGATAGGGGCCAGTTATTTCA
-CAGATAATAATAGGTGAAAATGGAGAGTATGTGGGTGTAGGCATGGAAAAGTGAGTTTAAATGGTTTCAGGAGTCTGTGG
-AAATTGTCTTTGGGTGATTCAATGTTCTCAGGGAAGCACACCCAAAAAGACATTGAGGATTTCTGGGGAAGTGTTAGGGA
-TTAGAGACAGGATAAGATACAAAACTAGGAAAATTAGAGAGTGAATAGATTGGAACATATGTAGTATGATTGATTGATAG
-GCGGCACTCAGATTCTCAGTTTCAAGTGGGATATTTTTCAATTTGATCCATATAGCTAGTTGCTCAAATATATGTGGGGA
-TTTGGTGGAAATTTGGATCTAACCAGGGTTATTTTCCTGGTTAGATTCAGCAAAGTGAAAGAGAAACAAGGAAGTTGAAG
-TTTCCTGGGAATGGTTGGCCACGGAATTTAGGCAGGAGAACAGGAAATAGAGTACATCAGTAGGTAAGGGTCATTATAAA
-TATGATAAAATAATAGTTTGGAGGTCTCAGAGAGATTGAAAAATTTTATGTCAGCGTATGAAAGGGAATGATTAAAGGAG
-GAGTTCAGAGAATGGGATGAATGAAATTGTGACTACAGAGGAGTTGCTATTATAAGTAACGACGATGCTTCACTCAGTTC
-CTCTGGAAGTGTGGTCCCTGTGCTAGCAGCAACAGCATCACCTGGGAACTTACTAGAACTGCATATTCTCAGGTTACACC
-CCCAGATCTTCCAAATATGAAATTCCAATAGCAGGTCTCAGCAATCTCTTATTGTAACACAACTGTAGGCAATTTTGAGG
-CACACAGTAGTTAGCACAACTGGTCTAGTGTATGTCTTATTTGGTCTTCCTCCCCGGTTCACAGTACAGAGCTCCTAAAA
-CTTGAAATTTCCTGATAGAGATGAGAGGACCATCCTTTACTAGTCATAAGTCCCTCTTAGCCATACCTGAGTTTATGCTA
-TTGACATGACATGAGTGGTGGTTGGAGACCCGTATGGCTTCAGGGTGGGTGCTTGACACCAGAAACATGAAGGCATAACT
-AGATGGTTAAAACTGTCAGCCCTCTCCTCCATCACCTCTGAGGTGCTGGGAGGGTGATACAATGATATACTTAGAGGTCA
-TATGGCAGCTTTGTGCCCCTTTTCACCATACCTGGCCCTATGTGTCTCTTCTATTTGACAGTTCCTGATTTGTATCAGAC
-AGTAACTGTAAGCAAAGTGCTTTCTTGGGTTCTGTGAGCCATCTTAGCAAATTATAGAACCTGGGGAAGGAATCCATGGA
-AGTGCTAATTTATAGCCAGTTGGTCAGGAGTATGGCAGGCCCACAACTCCTCTCTAATGGTGGGGGGGTGGCAGTCTTGT
-GGTCCTGAACCCTGAACTTGTGGGATCTGATGCTATCTCCAGATAGATAGTCTCAGGATTGAATTGAATTGTAGGACACC
-ATTTGGTGTCCTGAGAGTTGAAAAATTGATTGGGGTGAGACTAAACCAACAAATTTCATCTCAGAAGTTTGAGTAGAAAT
-AATTCTGTTGGAAAACATTATCGTTAGATCAAAGGTGTTAATAGAACTGAGAGATCAAAATGGCAAAGAGTCATCTATGA
-TTACACATTGTTGACATAAACTAGAATTAAGACAAGAGTATGTCAAAGAGAGTTACATTGAGCCAGGGATAAAAATAGTC
-AATTGATTGATTAGAATTTAGTAAATGCTATTTTTTGAAAAATTAATATTTAGTTAATTAATGGAGATACTTAATTATCT
-CCATTTTGACTTTAAATTTAAAACTAAAAAATTGATATTTTATCTATTTTCCATAAATGGAAATTGAAAAGCAATAGCAA
-AATGCTTCGACAGAAAATCTGCCCTTCTTATTCCCAAGAGGAAGAATGGCCAACTACCTTAAGAATAAGTTAGAAAAACT
-TTCATAATTTTTTAAGTTGCCATATTTTATAGCTTTGAACAAGTTGAATTATTAACTAGACTGCCCAGGGAATGGAGCCA
-TCTAATATAATTTCCTTACTATTTAGATAAAATCTTTGTTGTTGAAAATCTTAATCATTTTTAATGATCCTGTTTTCAGA
-GCCTGATATTAATGATTCGTGAAACTCATTAAATGCAGTTATGCATCTGATTTGAAAATCATGAGGGAGATTTTTGGTCA
-GATATGCATAGCAAATCTATGTCACTAGACATAAGTCCCTTCTACCCATGCCACAACCTTTATGTCTACTCTTGAATTGA
-GGTTTTGCTACGTTTTATTTTTGAGGTTTAAGAATTATTCATTTAACTGTCGGAAAATTGTGTTTCTCTTGTTAGAATAG
-AGCCCAATTTATCCTTTCTATTTTTCATGGAGACATGAAAGTATGTGAATTTGCAATCAGAGAAACCTGAGTTCCACCAT
-GCTTTCTTCCTCTTGCAAGCCATGAAATCCACAGTGGGTTAGTGGATATTACAAACCTCTGGTCCCACCTTATTAAGATG
-GAAAAAAATAAGACTAATTGAAAGAACAAATGTGGTAATGAGAAGAAATGGTATCAATAAAATTCCTGGAACACAGTAAG
-TTCTAACAAATGCTAGTTCTTTTCTTTCATAATTCAAAATCTAAATAGAAGCCAGTTGGTAATTCCAAGATAATAGTATG
-AAGACAAAAAAAATGTTTGTTAACTGACCTTCAACCATTGAGACCTTATCTTATAGGAAGCAAAATTAACAAATATTTTC
-TCCCTTCTACAAATGTATACCCTCTGAGAAAGAGAGACAGTGTTCCAATCAAGACGATGACAGTATTCTGTGCACACATA
-GGAAAGGAAGAAGAATCAGAGAGAACCTTTAAAAAGACAATTTTAGATAGGCATCCTATTTTTACCGGCAATAACATTTT
-TTAGAACTTACGGCATACAAAATAGACCTTAAATGGACTCAGTGTTGAGAAATTTTTATAAGGCTGCTTTATTTTCTTCT
-ATGGTAAATCTAGGAACCAATAAAATAGCTTTGATAATTCACTCATTACATTCTTTCCTAACTAAACTATTTACATTATA
-AACTTTGTTGATATGCTGTGCTTTTGCATTAATAATTCTCATGTGTCTCATTTGTGAATACATGAAAACTAGTTGTAAAA
-TAAGGAAAATGTAATTTTGAAACATCTTCAAAAACAGTTGCATAATTTAACAAATGTTTATAAATTTTCGTCCTTACTCT
-AAAACCATAGATATCCTAAAATTGACTGAAGGTAAAATGATTTTTAAAGAACTGGATTTCTCACCATGAGTTATTTTATC
-TCCATACAAACTGTGGTAGTGTTATACAATGGTTAAGAAGAAATTACTTAAAAATGAGAATAAAGATACAGCTTATTAAC
-ACTTCATTTTGTGGATGAGACCTGAAAAATTAAACTTTTCTTCTAGAGACAAGTTGTAGTTGTGTATATAGAGTGTGAAT
-AGATAGTGTCCATATTTTACTGTCATTATTTAAACAGAAACATGCAATTTGCACTTCAAAAACCTACTACAAATTAACTG
-TGTCATTTGGAAGTGTCAAAATTATCTCATTAATGATCAGATAGGCTTTTGGCTCATTGTAATGAGATGTTCCTATAAAC
-CTAATTTGAAAGACAAAGACAGAGTTTGGAGTCTTTAATTCTTGGTAAAAATCAGTAGCTCTATTTAGGGCTATATTTGC
-AAAATACTATTTCAACTCAAGCATATTTTTATTTACAAGGCACTTCACAAATGTTGACCACAAAGATGTTTCTACCTAGC
-AGAAATAATTATAGTTACATATAGTTGTCTAGGAATATCTTAAACATGGGGTATTAAAATAACTTTCAAGAACAAGAAGA
-AATGTTACACCAGGCATTTTTGCAACTAGTGCTCTATTTCAGTGCAATATTTGTGGCAATTAAAAAACATAAATGGCTTG
-GATATATAGCTAAGTTATCAAAGGAAAAATATGCAAAGGCATGATTATTTTATAAATGTGCCACATATGTGACTTGAGGT
-ACAAATCCTCTAAGTTTAAAATTGTCTTTTTAAAAAAGAAATCAAAACAGACAAGTGGGCAATGAGTTATGGATACTATT
-ATAGGGTACCCTGATAAACTAGTAAGAAGACGACTTTTGGTACTGAAAATTCCAATTAACCACATGCCCCCATTAAGGCC
-ATGATCACTGCCAATTTTTACTCACAAAGGCTGGAGCTAGAGTTATATGGAATTCCATATGTATCTAAACCATAGATTTA
-TCAATTATCACTTAAATACAACTTGGAAGACACTATCCAAAATTTGTAGGGCTTGGCCTTATTCTAGAGAAACATACACT
-GGAATAGGCAGTTGGATTTTAAATTCAGTCTTAAATCTGTTGAAAATAATGCATTTTTTTCTCAGAGATGAGATATTGTT
-CAACTCTTTTGACTTATTTTAGATTTGATAATATACAGTTCAAACACCATGGAGATTTACTAATCTGAATGAACACATAC
-CAAATTTGTCTTTGCTCCAGTCTCGAAATTTGAGATTAATTCTAGCTGCTGAAGAAATTTTCCAGTGTTAGGAGTATGCT
-TCAATGCTAGTGACCGGTACTACTTTCTGGTAAACTATAGATGACATGTGTGCTTTCATTGCCTAAACTCACTTTGTAGA
-ACACCATTAAATGAAAATCATCACCAGCAATTTGGGAGGCTAAGGCGGGCAGATCATTTGAGGTCAGGAGTTTGAGACGA
-GCCTGGCCAACATGATGAAACCCCGTCTCTACTGAAAATACAAAAACTTATCCAGGCATGGCGGGATGCACCTGGAATCC
-CAGCTACTTGGGAGGCTGAGGCAGGAAAATCGCCTGAACCCAGGATGTGAAGGTTGCAGTGAACAGAGATGTTGCCATTG
-CACTCCAGCCTGGGCAACAGAGTGAGACTTCATCTCCAAAAAAAGGAAAAAATGAGAGAGAGAGAGAAAAAAAATTATCA
-GTGTTCAGTGACTCTTTGTTTTTCATGCTGATAAACTATTACGCAGAAAAAGAAAATTTTCATGCTGATAAACTATTACA
-CAGAAAAAGAAATGTATCCATTATGGACAATTAAAAGGGCTATACAATCTCTCTCATTGTATGATTCTAGTTTTCTTTAT
-TTTTCTTTTCTTTTGTTCTTTTTTTTTTTTAATACAGGATCTCACTCTCTCACCCAGGCTGGAATGCAGTGGCTCTATCT
-TGACTCACTGAAACCTCAGCCTCCTGGGTTCAAGCTATTCTCCTGCCTTAGCCTCCTGAGTAGCTAGGAATAAAGGCATT
-CACCACCACGCCAGCTAATTTGTGTATTTTTTTAATACAGGTGGCGTTTTGCCATGTTGCCCAGGCTGGTCTTGAACTCC
-TGACCTCAAATGATCCTCCCACCTCGGCCTCCCTAAGTGTTGGCATTACAGGCATAAGCCACCATGCTTGGCCTGATTCT
-GTTTTTTAACACAATTCTTATTACTTCTGTTTCAATTTTACAAAGCCATAGGTTTTTAATCTGGGAAACCTTTGAGAAAA
-CATCCAGATAAATTTATAAATAGAAAAATAAATTCAGACACATATAATTAAGTTTATGATCTAACAAGTGGGTGACAACC
-GAAAACTTTCCAAGTTCCATAAACTGAAGTGAAAGGATCACTTTCCTGAAAATATTACAAAGGCTTGATAATTACCTGGA
-TTGTACTAAAACCTACACAATCTAGTATATTCTATAGCAGCAATTCATAAAGACAGCTTCACTTACCATGTAGAATTTAT
-ACATACATTAAATTTAAGGAATGCATTACTTGCTATTGGAGTAGGATAATAAACTCCCAGCAGAACTGATTTTCATGAAT
-GCCTATTAAACTATCATTGATGTAGAAATTAAACAATATATTAAGCTATTCAGACCCAGATTGTGAGAGACAGAGAAAAA
-CTTCAAAAAAGTTCAGCTACCAAATCCCTTCCTCAATAGCTCTTTGAGTCTCAAGACAGTTTCAACCACACACATCCTCA
-GAGTCTTATGGTCCAAACAACATTTGACTGCAGCTCTAAAGTAAGCAAACATTTGAAAAGAAACTCAAAGATCTATACCT
-GTAGTTATGGTCAAGGAAGTCCACCTACTGGTGGGTGAGCATGGCAAGGATAGGGACTAAGCCAAATGATGGGTTTACCA
-AAACAGAAACAAGAGAAGTCATTGGAAGCACAGTCCAGGTTATAACAGGAGCCCAGGCACTTGATGTGGGAACCCTATTT
-GTCTCATTCAGCACCTAGAGTTTTAACGTCCTATGAGGCACAGCTAATGCCCTTCATTATTTTTTTGTAATTGACTGCAT
-AGTTTAGAACTATGCCTTGAATTTAATATCTATCTGTTGAATAAATGAATTAATAATGATGAAAATCTGTCCACAGGTTA
-TGTGCAGTACTGAAGAGCAACTTCAGCTATTGAGGTATGTATCAGAAGTCTTACTCTCCAAAAAGCCTCTGGTTAGTTAC
-TGATATACGTTGCTGATAATTTCACTCTCACAATGTAGGGGAAGCAGGAATGTTATCTGGCCTCTTGGCTCCACTTCCTT
-TGCCTTCCACAGATCTCTCTGCTGGTTCACAGAGGAACACTTTCGTGGCTCTCAGTTCATTTTGCAATTCTGCTAGAATC
-TCATTCCATCCTCAGTTGTAACTACCTTGTCCTTCACCCAACGCTTATTTACGGAGGGACAGATAGCAAGAAGAAATCGC
-ACTCTGGATTACAAAGTGGGAAGACACACCCCTTGGCCAGAATGCCTGCCTCCTATGTTCATGAAGGATATTTCTAATTG
-ATCTCGGCACTCTTTTCCATTGAGCCCATGTCCCAAATTGGCCGTGAGTTAGGGAGAGGACTCTAGAGTGGGAAAGCTGT
-ACCCAAAACTTCCCTAATCTGACTATCAAGCCTAAAAAATTAAACTTTCAATTCAACATCCCTTGTTTCTCCAACTTGGA
-GTGCCTGATGGTGTGGGAAGCCCCTACTCATAAAAATTCATAGTTGAAGATTGTTGGTAATTTTGCCCAACCTCCTTCTT
-TTCTTTTTATTCTACTTTAAGTTCTAGGGTACATGTGCACAACGTGCAGGTTCATTACATATGTATACATGTGACATGTT
-GGTGTGTTGCACCCATTAACTCGTCATTTACATTAGGTATATCCCCTAATGCTTTTCCTCCCCTAGCCCGTCACCCCACA
-ACAGGCCCCGGTGTGTGATGTTCCCCTTCCTGTGTCCGTGTGTACTCATTGTTTAATTCCCACCTATGAGTGAGAACATG
-TGGTGTTTGTTTTTTTGTCCTTGTGATAGTTTGCTGAGAATGATGGTTTCCAGCTTCATCCTTGTCCCTACAAAGGACAT
-GAACTCATCATTTTTATGGCTGCATAGTATTCCATGGTGTATATGTGCCACATTTTCTTAATCCAGTCTATCATTGTTGG
-ACATTTGGGTTGGTTCCAAGTCTTTGCTATTGTCAGTAGTTCCTCAATAAACTCCTTCTTTCTTTGCCTAGTTACACCTC
-AATGCAACCTGCTGGCAGGCCAGCCTTAAGCCCAGCAGTCCAACCATGCATCTAAGCTGAGTTCTCATCAGAGCCAACTT
-CAATTATAAACAACTGAGATGATGCCAGAGGCCAGAATCCCTGAGAACCCAATTTGCTGTCATCACCACAGCTGAAACAA
-GGCGCTTGGCATCTAGAAAAGCTGATCTGTAGGAAATTTCCAATAGAGTTCAAGTTTTTCTAAGTTTAAAGTGTACAATA
-TCATCAAGGTGAGACACTCAAGATAAAACTAGGCTTGTGTTTAAATATAATAAAAATATTTGAAGAATAGTAAGAGTGGT
-GACTACTTTTACACAGGAATGTTTCAAATAAATTGTTTTTTTCTTGTGCCTTTTAAATTTTGTGATTTGTCAATGAGATG
-CTGACATGTTTTTAATGAAGCATGCCTTGTAAAATAATAAGTGAATGAAAACTACACAGTAATATTTACATCAACAAAGC
-TAGAAGAAGACTGTATGTCTCAAGAGGCTCCATCATCTACCCAGTGGCCACTTCACCAAATTAAGATCCAAATACCAAAA
-AGAAAAGTAATTAAAATTTGTGTTGTATGCCTTATAAGACCAAACCTATAAAATGAGGGGAAACTTCACAATTACTTGTA
-ATTTGCTCTGTGGAATTGTAACAGATGGATTATAAAGATGATTCCATGATAAACATGTAAATGTGGTTACTACCTTCTGT
-GCTTTCTTGGTTCATATTTTTATTGTTTTTTTCTTTATAAACAGATAATTCATTCTTATCTATGGCAATGCAAACTTTTC
-AGATGTATTGAATATGTCATAGTGTTTTTCTATTGTAGGCATCTCTAAAAAAGTTATAGAAAACAAACAGAGAAAAGTCT
-GGTGTTGGAAAGGAGAGAGAAATAAAGCTTGTAAAGGAATGAAGATTAGAGCTTTCTGGAGATAAAAATTCTTAGAAGAT
-ACAAAAGCTAGTTACTGAATTAGATGAAGGTTCTTTTTCAGTTTTTCCCAGTTGTTCACCTCTTAGAAGGCACATATTCA
-CAGCAGAAAAGAAAAATGTGTTAAAAAGAAAATACCTCGGTGTAGTGAGACTGTAATTTCATGAGGGCATTACTGAAGAC
-TCACTTTTTCCAGCATCACTCAGCATGGTATTATGCATGTGTGTAATGTAAAGGAAAGTGAATACGCATTCTTGGATGGG
-TGATCAAATCGTAATTCCAGAATATAATCAGAAGCTGATTCATTATCCTCTTGAGATTTCACAATCTTTTCATCAGGAAT
-TAAAATTCAGAAGAGGGTAAATGTATCTAATCAGTTGAAAGTTAAAAATTAGAGGATGGAGGCAACATGGCCGAATAGGA
-ACAGCTCCAGTCTACAGCTGCCAGCGTGAGTGATGCAGAAGACAGGTGATATCTGCATTTCCAACTGAGGTACCAGGTTC
-ATCTCACTGGGGAGTGCTGGACAGTGGGTGCAGCGCACCATGCATGAGCCAAAGCAGGGAAAGGCATCACCTCACCTGGG
-AAGCAGAATGGGTCAGAGAATTCCCTTTCCTAGTCAAAGAAAGGGGTGACAGATGGCACCTGGAAAATCAGGTCACTCCC
-ACCCTAATACTGCGCTTTTCCAACAGGCTTATCAAATGGCACACCAGGAGATTGTATCCAGCACCTGGCTTGGAGGATCC
-TACACCCACGGAGCCTCACTGTTTGCTAGCACAGCAGTCTGAGATCAAACTGCAAGGTTACAGTGGGGCTGGGGGAGGGG
-CTCCCGCCATTGCTCAGGCTTGAGTAAGTAAACAAAGCAGCCAGGAAGTTCGAACTGGGTGGAGCCTAACACAGCTCAAG
-GAGGCCAGCCTGCCTCTGTAGGCTCCACCTCTGGGGGCAGGACACAGACAAACAAAAGACAGCAATACCCTCTGCAGACT
-TAAATATCCCTGTCTGACAGCTTTGAAGAGAGTAGTGGTTCTCCCAGCATGCAGCTTGAGATCTGAGAATGGGCAGACAG
-CCTCCTCATGTGGGTTCCTGACCCCTGAGTAGCCTAACTGGGAGGCACCCCCCAGTAGAGGCAGACTGACATCTCACATG
-GCCGGGTACCCCTCTGAGTCAAAACTTCCAGAGGAACGATCAGGCAGCAGCATTTGCAGTTCACCAATATCCACTGTTCT
-GCAGCCACCGCTGCTGATACCCAGGCAAATAGTGTCTGGAGTAGACCTCCAGTAAACTCCAACAGACCTGCAGCTGAGGG
-CCCTGACTGTTAGAAGGAAAACTAACAAACAGAAAGGACATCCACACCAAAACCCCATCTGTATGTCACCATCATCAAGG
-ACCAAAGGAAGATAAAACCACAAAGATGGGAAAAAACAGAGTAGAAAACCTGGAAACTCTAAAAATCAGAGTGCCTCTCC
-TCCTGCAAAGGAATGCAGCTCCTCACCAGCAATGGAACAAAGCTGGACGGAGTATGACTTTGACGAGTTGAGAGAGAAAG
-GCTTCAGAAGATCAAAGTACTCCGAGCTAAAGGAGGAAGTTCGAACCAGTGGCAAAGAAGTTAAAAACTTTGAAAAAAAA
-TTAGACGAATGGATAACTAGAATAACAAATGCAGAGAAGTCCTTAAAGGACCTGATGGAGCTGAAAACCATGGCACAAGA
-ACTACATGACAAATGCATAAGCCTCAGTAACCGATGTGATCAACTGGAAGAAAGAGTATCAGCGATGGAAAACGAAATGA
-ATGAAATAAAGCATGAAGAGAAGTTTAGAGGAAAAGGAATAGAAGAAATGAACAAAGCCTCCAAGAAATATGGGACTATG
-TGAAAAGACCAAATGTATGTCTAATTGGTGTACCTGAAAGTGACGGGGAGAATGGAACCAAGTTGGAAAACACTCTGCAG
-GATATTATCCAGGAGAACTTCCCCAATCTAGTAAGGCAGGCCAACATACAAATTCAGGAAATACAGAGAATGCCACAAAG
-ATACTCCTCGAGAAGAACAACTCCAAGACACATAATTGTCAGATTCACCAAAGTTGAAATGAATGAAAAAATTTTAAAGG
-CTGCCAAGAGAAAGGTCAGGTTACCCACAAAAGGAAGCCCATCAGACAATCTGCTGATCTCTCCTCAGAAACTCTACAAG
-CCAGAAGAGAGTGGGGGCCAATATTCAACATTCTTAAAGAAAATAATTTTCAACCCAGAATTTCATATTCAGCTAAACTA
-GGCTTCATAAGTGAAGGAGAAATAATATACTCCACAGACAAGCAAATGCTGAGAGATTTTGTCACCACCAGGCCTGCCCT
-AAAAGAGCTCCTGAAGGAAGCACTAAACATGGAAAGGAACAACTGGTACCAGCCACTGCAAAAACATGTCAAATTGTAAA
-GACCATCAAGGCTAGGAAGAAACTGCATCAACTAACGAGGAAAATAACCAGCTAACATCATAATGACAGGATCAAATTCA
-CACATAACAATACTAAGCTTAAATGTAAATGGGTTAAATGCTCCAATTAAAAGGCACAGACTGGCAAATTGGATAAAGAG
-TCAAGACCCATCAGTGTGCTGTATTCAGGAAACCCTTCTCACCTGCAGAGACACACATAGGCTCAAAATAAAGGGATGGA
-GGAAGATCTACCAAGCAAATGGAAAACAAAAAAAGGCAGGGGTTGCAATCCTAGTCTCTGATAAAACAGACTTTAAACCA
-CCAAAGATCAAAAGAGACAAAGAAGGCCATTACATAATGGTAAAGGGATCAATTCAACAAGAACTAACTATCCTAAATAT
-ATATGCACACAATACAGAAGCACCCAGATTCATAAAGCAAGTCCTTAGTGATCTACAAAGTGACTTAGACGCCCACAAAA
-TAATAATGGGAGACTTTAACACCCCACTGTCAACATTAGACAGATCAACGAGACAGAAAATTAACAAGGATATACAGGAA
-TTGAACTCAGCTCTGCACCAAGCAGACCTAATAGACATCTACAGAACTCTCTATCCCAAATCAATGGAATATGTATTCTT
-TTCAGCACCACACCACACCTATTCCAAAATTGACCACATAGTTGGAAGTAAAGCACTCCTCAGAAAATGTAAAAGAACAG
-AAAGTATAACAAACTGTCTCTCAGACCACAGTGCAATCAAACTACAACTCAGGATTAAGAAACTCACTCGAAACCACTCA
-ACTACATGGAAACTGAACAACCTGCTCCTGAATGACTACTGGGTACATAAGGAAATGAAGGCAGAAATAAAGATGTTCTT
-TGAAACCAACAAGAACAAAGACACAACATACCGGAACCTCTGGGACACATTCAAAGCAGTGTGAAGAGGGAAATTTACAG
-CACTAAATGCCCACAAGAGAAAGCAGGAAAGAAATAAAATTGACATCTTAACATCACAATAAAAAGAACTAGAGAAGCAA
-GAGCAAACACATTCAAAAGCTAGCAGAAGGCAAGAAGTAACTAAGATCAGAGCAGAACTGAAGGAAATAGAGACACAAAA
-AACCCTTCAAAAAATCAATGAATACAGAAGCTGTTTTTTGAAAAGATCAACAAAATTGACAGACCACTAGCAAAACCAAT
-AAAGAAGAAAAGAGAGAAGAATCAAATAGATGCAATAAAAATTGACAAAGGGGATATCACCACCAACTCCACAGAAATAC
-AAACTACAATCAGAGAATACTATTAACACCTCTACACAAATAAACTAGAAAATCTAGAAGAAATGGATAAATTCCTTGAC
-ACATATACTCTCCCAAGACTAAACCAGGAAGAAGTTGAACCTCTGAATAGACAAATAACACTCTCTGAAATTGAGGCAAT
-AATTAATAGCTTACCAACCAAAAAAAGTCCAGGACCAGATGGATTCAAAGCCGAATTCTACCAGTGGTACAAGGAGGAAC
-TGGTACAATTCCTTCTGAAACTATTCCAATCAATAGAAAAAGAAGGAATCCTCCCTAACTCATTTTATGAGGCCAGCATC
-ATCCTGATACCAAAGCCTGGCAGAAACAAAACAAAAAAAGGAGAATTTTAAACCAATATCCTTGATGAACATTGATGCAA
-AAATCCTCAATAAAATACTGGCAAACCAAATCCAGCAGCACATCAAAAAGCTTATCCACCATGATCAAGCGGGTTTCATC
-CCTGGGATGCAAGGCTGGTTCAACATATGAAAATCGGTCAATGTAATCCAGCGTATAAACAGGACCAAAGACAAAAAACA
-CATGATTATCTCAATAGATGCAGAAAAGGCCTTTGACAAAATTCAGCAAACCTTCATGCTAAAAACTCTCAATAAATTAG
-GGATTGATAGGATGTATCTCAAAATAATAAGAGCTATCTATGACAAACCCACAGCCAATATCATACTGAATGGGCAAAAA
-CTGGAAGCATTCCCTTTGAAAACTGGCACAAGACAGGGATGCCCTCTCTCACCACTCCTATTCAACATAGTGTTGGAAGT
-TCTGGCCAGGGCAATCAGGAAGGAGAAGGAAATAAAGGGCATTCAATTAGGAAAAGAGGAAGTCAAATTGTCCCTGTTTG
-CAGATGACATGACTGTGTATGTGGAAAACCCCATCGTCTCAGCCCAAAATCTCCTTAAGCTAATAAGCAACTTCAGCAAT
-GTCTCAGGATACAAAATCAATGTGCAAAAATCACAAGCATTCTTATACACCAATAACAGACAAACAGGGAGCCAAATCAT
-GAGTGAACTCCCATTCACAATTGCTTCAAAGAAAATAAAATACCTAGGAATACCACTTACAAGGGAAGTGAAGGATCTCT
-TCAAGGAGAACTACAAACAACTGCTTAATGAAATAAAAAAGGATACAAACAAATGGAAGAACATGCCATGTTCATGGGTA
-GGAAGAATCAATATCGTGAAAATGGCCATACTGCCCAAGGTAATTTATAGATTCAATTCCATCTCCATCAAGCTACCAAT
-GACTTTCTTCACAGAATTGGAAAAAAACTACTTTAAAGTTCATATGGAACCAAAAAGAGCCCACATTGCCAAGTCAATCC
-TAAGCCAAAAGAACAAAGGTGGAGGCATCATGCTACCTGACTTCAAACTATACTACAAGGCTACAGTAACCAAAACAGCA
-TAGTACTAGTACCAAAACAGAGATATAGACCAATGGAACAGGACAGAGCCCTCAGAAATAATGCCACATATCTACAACTA
-TCTGATCTTTGACAAACCTGACAAAAACAAGAACTAGGGAAAGGATACCCTATTTAATAAATGGTGCTGGGAAAACTGGC
-TAGCCATATGTAGAAAGCTGAAACTGGATCCCTTCCTTACACCTTATACAAAAATTAATTCACGATGGATTAAAGACTTA
-CATGTTAGACCTAAAACCATAAAAACCCTAGAAGAAAAACCAGGCAATACCATTCAGGACATAGGCATTGGCAGAGACTT
-CATGTCTAAAACACCAAAAGCAATGGCAACAAAAGCCAAAATTGACAAATGGGATCTAATTAAACTAAGGAGGTTCTGCA
-CAGCAAAAGAAACCACCATCAGAGTGAACAGGCCACCTACAGTATGGGAGAAAAGTTTTGCGACCTCCTTATCTGACAAA
-GGGCTTATATCCAGAATCTACAATGAACTCAAACAAATTCACAAGAAAAAAACAAACAACCCCATCAAAATGTGGGCAAA
-GGAAATGAACAGACACTTCTCAAAAGAAGACATTTTGCAGCCAAAAGACACATGAAAAAATGCTCATCATCACTGGCCAT
-CAGAGAAATGCATATCAAAACCACAATGAGATACCATCTCACACCAGTTAGAATGGCCATCATTAAAAAGTCAGGAAACA
-ACAGGTGCTGGAGAGGATGTGGAGAAATAGGAACACTTTTACACTGTTGGTGGGACTGTAAACTAGTTCAACCATTGTGG
-AACTCGGTGTGGTGATTCCTCAGGGATCTAGAACTAGAAATACCATTTGACCCAGCCATCCCATTGCTGGGTATATACCC
-AAAGGATTAAAATCATGCTGCTATAAAGACACAAGCACATGTATGTTTATTGTGGCACTATTCACAATAGCAAAGACTTG
-GAGCCAACACAAATGTCCAACAATGATACATTGGATTAAGAAAACGTGGCACATATAAAACATGGAATACCATGCAGCCA
-TAAAAAATGTTGAGTTCATGTCCCTTGTAGGGACATGGATGAAGCTAGAAACCATCATTCTCAGCAAACTATTGCAAGGA
-AAAAAACCAAACACCACATGTTCTCACTCATAGGTGGGAATTGAACAATGAGAAAACATGGATGCAGGAAGGGGAACATC
-ACACACTGGGGACAGTTGTGGGGTGGGGGGAGGGGGGAAGGATAGCATTAGGAGATATACCTAATGTTAAATGACGAGTT
-AATGGGTACAGCACACCAACATGGCCCATGTATACATATCTAACAAACCTGCACGTTGTGCACATGTACCCTAAAACTTA
-AAATATAATAATAAAAAAAATTAACAGGAGACTTTTATACAGATAAATTTGCTTTGCATCATGATCAGCACTAAAGAGCA
-TCATAGATTTAAACCATATTTTCACAGTTAAAACAATGTAACCAAATATGCAATATATTATGTAACATTCTACAAGATGT
-TTTCAAACATGCAAACTGACCTTTAAAACAATTTTGCATAAAATAACATTTCTAGGTAAGAGAAAATACAGACATGTGGT
-TAGGGCAAAATATTTCTGTTCAAATTACAAAATACTGAATGACAAATCACAGGATAGAAAAGAATTATATTGTACCTGGA
-ATTTGAAGTCTTCAAATTTATTTAGATATACGTATCTATATGTATTAATAGAGACATATTTAACTGATTATAAGTTTAGA
-ACATTTATATTTTAAAGATGTCATTCTTTAAAAATTATTAATATCTACAGGATTGATACAGATATTTTAATTTTAAACAA
-ATATTTTTCACTAATGTGACCAGTATTTATGTCCTATTTCATTAAACAGACATTTCAAGATTTTTTAGAGTTAATTTTTA
-AAAATTAAGTATCACAAATATTTCTGAAGTACTACCTTAAAAAATAAAACTCTTTCCTAGCTTTTCATATAGTTAAACAT
-TTTCATAATGACTAAAAAGATAAAAATAAATTAGCAACCATAATTAAATTAGAATTCTACTTTTTATATCAGATGAAATA
-CTACATAAAATGTCCAGAAAATCTAGTGTTAATGAGGCTGTGCAGCCTGGACATTTGATGTCTCATCTGTGGGAATGTGA
-ACTAACCCAACCATTCTGAATAATTATTGACTCTGTGTGTTAACAGTCTAGAGTCCTGAAACAAGGATCTTAATTCTAAA
-ATAAAATCCTATTCTAAGAATATACCAAGGGTTGATAATCAAGGAAGTTTCAAAGTTATAGAGAAGAACCTTCATCCTAG
-CATTATATATGTAATCATCCATATAAACCACATAGTGTTGAATGAAATTACAGAAAAACAAAGAGCCTACAGAATATGTT
-TCTCTTTGTGTACAACAGTAAATGTACACATCTATCCATGTAAAATTTTACATCTCAGGAAGATAGGTACCAACATGTTA
-ACATGCTATATCTATAAGATAAGAAATTTTACTTTCCTACAATTTCATACACACACACACTCTCAAACATACATACCCAC
-ACACCGAGGATATATACACACACAAATATATATATAAACATACATGTTTATATAGGTACACACACACATACATATACACA
-GATGGTCAACAAATTATAATGGTTCAATTTATGATTTTTTTTACTTTATGATGAAGCAAAAGTGATAGCTTTGAATAGAA
-TATAACCATTCTGCTTTTCACTTTCAGTACAATATTCAACAAATTACATAAAATATCCAAAACTTTATTATAAAGTGGGT
-TTTGTATTCAATGATTTTGCCCAATTGTCAGCTGATGTAAGTGTTCTGAGCACATTAAAGGTATGCCAGGCTAAGCTGTG
-ATATTCAGTAAGTTAGGTATTAAATACATTTTTAACTTACTGTATTTTCAATTTATAATCAGCTTATCAAGACTTAACCC
-CATTGTACATTGAAAAGCATTTGTATTGCATTAAACATGTTATATATATTTTTAATTGAAATTACTGGCAACTTTTGAAA
-AAATGTAATGAAATAATGTGCTTTGCTATTGGTTAAAGTGTTTTTGGGCAGGGTCAGTGGCTTACACCTGTAATCCCAGC
-ACTTTGGTAGGCTGAGGTGGGCAGATCGCTTGAGGTCAGGAGTTTGAGACCAGCCTGGCAAACAGGGTGAAACCCCATCT
-CTACTAAAAATACAAAAATCATCTGAGTGTGGTGGCATGTGCCTGTATTCCCAGCTACTAGGGAGGCTGAGGTGTGAGAA
-TTGCTTGAACTAGGCAAGCAGAGGTTGCAGTGAGCCAAGATCAAGCCACTGCACTCCAGCCTGGGCAACTGAGTAAGATT
-CTGTCAAAAAAAAAAAAAAGAAGGAAAGAAAAGAAAAAAAGTTTTCAGCTTCAAGTAACAGAATAGTCAACTAATTAAAG
-AAAAAAACAAGGAGCAACTTTTACCAAATCGCACAACAAATAGATGGTATCAATGCTTACTTAATTCAACATGATCCACT
-TTGTGATTCTCTTATCTTTCTACCTATGTTTTCAAGATGGCTATGGCATTCCCAGCCTTACAACTTCATGTGACAAAATC
-CAATGGCAGGAAATAATAAGTGACGGCATTTTGGAACTTTAAGGAAAAACTTTAAGGATTGGAAAACAGGGATGCCATAT
-GTCCAGTAACATGGGATAGCCGTTCCTAATTAAGGATTGCTGTATGTCCTGAATGACTTTCTAATGTAATGAAGGTGAAT
-AACCTGCTTTGTTTAATTATACAATCCCAAATGTAACTGCCTAAGTGCCAAGTACTTTTGCATGGTTTTAATATGCCATG
-AATTTTGCAAGAATGAAACTACTATGTATATGAGAAAAGATGGTAGATTTTTTCATTTAGATACTCATTTCAGAGTCTCA
-ATAGGAAAAACAGAACACACTCAAACTAAGATAATTTAACATGGGTTTATTTCCAAAGAGACTACTTACGAAAATGTCAG
-GGGAGAAGGGTGAAGGAATCACAGAAATCACACCCCACAATAACTCTGGGTTAGTAGCAGCAGGCAGAGTTCTGGGGAGT
-AAACTTCCCTGATCACGCAAGGAAACACTAATTTTCTTATGAAAAAGATTGGTCAAGGAGACCTAGCAGAGAGGGAGTTT
-AGGCAATAACCCCCAATCCCATTTCCTCCTTCCCTTTAATCTCATGAACATGCATAGAAGGCAATGAGCAAGGGAACAGA
-TTGAGATATTCAATATGGACCATTCCACTTGGACAAAAGCCAGTAAATAGGGGAGTATAACAGGGGACAAGGGCCAAACA
-GAAAGTATCTATTACATTTACCAATGCAGATCAATCATGTCAAAAACAGCAATGGCAGTTTTGGCATTTGGTTATTCAAT
-GAAACTATATTTGTAGTTTTTTATTTACAATGTTTCAAGGTATGGGCGAAGATATGAAAATATCATTATGTTCTATTTTA
-TTTGATATGTAAATGTTCTGGCACAATTATATACATTTTGGATCATATATTGACAGTAAATTATTTCTCCTTTGTTAGCT
-TCAGCATAACATTAATATTTTCAACAACTTGAATGCATACATTGTGTTCTCACTAATAGTTTAGAATAGTGAAGGGGTCT
-TTGAAGAATTTCTTATGAAGTAGAGGCATTGGGTCAGACAGAGACGAAAACCATTGGCTTAGATTAATCACTATTTATCC
-TAGGGCTGAAGAGGGCCAATTGAAGACACAAATGTCCAATCCCTTTATGACCTTGGAGTTCTATGAACCAGAGAAATAGA
-GACTGGTTCTTAAGGAGGTAATAAGTGTGCCTTCTATGGTTTATAATAATATGCATTGTCTTAACAATCGAATACTTAAA
-AGTTAATGCCCTCATAATATGCAAAATTTTTAATAAGCACATTGGTCCCTGTGTTCAAGTAGTTGGTAATCAAATTAGCG
-AAGTATGGTAAGTCTTTTGAAGAGCATTAAACAGCAGAGAATGTAAGAAATTTGTCTCTATAATAGTGTGGGCCTTCTGT
-GTTTCCTAAGGGCACATTCATATGATCTAATAACTGAGCAGAGAGAAGCCTAAAGGATAGTTTTTGGTTTCATTTGTTTG
-TTTTTCCAATTAACATACATTTCTAGATTAAAGGTCAACTATCTTTTCCTTGGGAGTCAACTATAGGAGAAGATAGTGAA
-GAGGCAAGGAAAATTACAGCAGCTCAACAGCTTTACCCTGGAAATATCTGTATTGTGTACCGCTATAGCCTACCTTTATC
-AGTCAGATAACAATGTCAAAGAGGCAAGCTTGGCACCATTGCTCTTAGTGAATCCCTGCTGCCAGCCTTTTATCCTAAGT
-GCTCTCCAAAGACCCATTTAATGGACCTTCCTGAAATTGTGCTCAGGATCAATATGAGGCTCATTGATACAGCATTTTTG
-GAACTCACCATTTGCTTATTTATTAAACCTGGGATAGTTGCCCGACTTCTATCATCTGAAATCCTCTCCATGACTTTCAA
-AGTTACCAACATTGGTTCCAACATCATTCCTAGAAAACATTTCAGTGGAGTATATTTATCTGACATTTGACTGTATTTAT
-AGCAGTAAGAATCTATGATGATTCCTCCCAAAATAATCCCACAATTACACATTTTGGGTCACCTTGAGGGTCTTATCCTT
-AATATCAGAGATCTGTTCTATACATTTGAGTCTTAGAAATAATTACTAGCTTCTCTCTGAATTTAACTGAGGTTCCTTAC
-TTTTATTCAGCCTGTTACCTAAATTACATAATGTATTGAAGGCTATAAACTGTCCAAATTTCTGATTACATTGAGTTAAA
-AATGGGAATATGACTTTCTTTTTCTAACTTGGCAAAGATTATGTTTTTTTTCATGAAGAAATATAGGCATATTTAAACAC
-TCAGGATCTGAGAATTTGAAATACATGAAACTTAGCAAGTGGTCTTTAAGTAGTTTTCATTTCTAAATTATAGTACATAC
-CATTGAATGCTACAGAAGGAAAGACAATGAGGGATTACTCATAAACATTGCCTTTATGATATCCTTCCAAAGAAAACCAA
-GTGTCCCTGTGCTTGGACTCATAAAGCAGAAATGCTTACCTTGCTTTTATGTCACTAACAAACAATTGTGCCTAGTCATT
-TAATTCTAACGCATTTAAGCCATCTAGAGAGTGGAGCCCCTAGGGAAAACTACAAATGGAAAATTCATTGATTTTTGATT
-TTGCTTTCCTATGGATTAAATTTAACACTTTCTTGTAAATCTCTCCCTTTACAGATCATATGTGATAAATAGTTATCCAA
-CTTTCTAGATGTCCACCCAGAGCTGCTTCCATATGAAGAGGTGGAAACGGATTCTGTGCATGATACTGGTTAGGATCGGG
-AACTGTTTTTTTTTAAAGGAGATTTTTAAAATTTGTTTTCCTTGTACACATAGCCTTAATATTGTGTTGCTAACTGCCCT
-CTGGGAACAAAGTCATACCAATCACAAATACATTGCCTAAAGTGGGATGGTTATTACTCTGCTGTGAATTGCACCTCCTA
-TTATGTTTTAAAGATGCTACAAACTTGAGACATTACTATGTAGATGACATTCCCAGCAAATCCCCAAACAACACTTAATG
-AGATTTCAAATACCAGGATCATGAAACAGTAAGAGATATAAGGAAATAAAGAAAAACACAGTATATGTGTAGAAGGCATT
-AAAACACAAATTTTATAATTACGAATGCATATAATAAGGAACAAGTTTTATTCTAAATAGCAATTATATCAGAACTACGA
-TACAGGGAATAAAAGTGAATATTAAGCCATTGTACCAACAATAACAGAGCCCCTTTTCTGCTGCGTGATGGAATTTAGTG
-TTTACTAAGGAAGAAAAAAATGCAAGATATCTTAAATTTGGTACTTTCCAACAAATTTAAGAAATGTGTACACACTTGAG
-GAGACTTAAGAAGTCTCTGACTAAAACACTAGAAAAGAAAAGCAGTGAAAAACCAAATAAGTATTACTCAACAATAACAA
-CATTTGTTACTATTATATTAATATTAAACACACTATTAAGCAACAACATTTCAGTTACTCACTGAGCCCAAAGTCATTTT
-TCATGAACCATTCACAACACTGATAACCTATTGAAAAATGATTGAAAACAAAAAAGCTTATTTCTTTCCAAGTCCTTTTA
-AAGCCTTCTCTTGTGTCATTTCATATAATCCTTATAACAAATCTATGGAGTATATACTGACTTTATCTCTGTACAGAAAA
-GAAAACTGAATCACATTCAGAATAAGTTGCAAAGATCCCCAGATAATCAGTGTCATAGGTGAAATATGATGTCACAGTGT
-ACTCAAGAGTAATTTAGGGAAGCAGTACAAATGATGGTTGAAAGCACAGGTTCTGGGATAAATAGCCTGAAGTCAAAATC
-TAGTTCATATCCTCAGTGGCTGTGTGATCTTGGGAAATTTCCCTTAACTCTCTGTGTCTTGATTTTATAGTTTCATCCAT
-TTTTGCCTCTCATATGATCTGGTGAGCGTTACACTAGTTTATGCTTCTAGGACACTGAAAACAGTGCCTGGCTCTTGATA
-AATATTAACAATTTTGTTTCATTTTCTTCACCTTGAGTATTTCATGGCCAGATGGAAATCAATGTCAATATGAAAAAATG
-TTCATAATTCAGCAGGAAGAAATACAAAACCATATAAACAACTTTGTTTTATTGGCAAGTGTATTTGGAAGCTATGTTAA
-ATTGAGAAGGGGAAGGGAAAGCCTCTAAGGATATCGATTAATCAATGACTGAAAGCTGATGAGACTTGTCTGGAATTTTT
-TTTTGGAGACTCTGAGACTTAAAATTTTGACAAAATAAGGAGATGAATTGAGTAGTGTGGAAGAGACATTTTCTGAAGTC
-AGCAGAGAAAGGAGAGACAAATATGGTAAGGGGAAAATGGTATGAAGTAATAATATGAATGAAGTGCTTTCTAAAGTATA
-ACACATGTAAGTTGTGTTAAATGTAAACTATCATGATTATATCATTACTGTCTGACTGATACAACTATATCCACCTCAGT
-TAGCCACATAAGATCAATTTTCCTATATCTTAGAGAATACCAGTAACCTCCAGTTCAGAAACAGCATAAATATCTATCCA
-CAGCTGAGCAGACACATACAGCTAGCTACCAGATGAAATGGGCTATATCTTCAAATACTATTGTTTTCCATTTTTTAACT
-GTGGCAAAACACACTCAACAATTTGCATCTTAACCACTGTTAAGTATACAATTCAGTGTCATTAAATGTATTCACAATGT
-TGTGCAAGCATCACCACCACCCATCTCCATAATTCTTTTTGTCTTGTAAAATTGAAATCCTGTATCCATTAAAAAGTGAC
-TCCCCATTCCCCGCCCTCCCAGGGCAACTACAGCTTTACTTTCTGTCTTGATGAATCATACAATATCAAATGGAATTTTT
-AAGATATTTAAAATCTTTTGTCTGGAAGCGAAGTGGAAGTTAATATCAATGGCTATGCCTTCAGTGAGTTCTCAGACCAC
-ATTGCAATGTAGTTAACTATTTATCTTTTATTACGTTCTAGACCTATTATTTCTTTCTGGCACAAAAATATCTTCTTTGT
-AGATTATGGCATTTACCTCTATCTCCACACCTTTCTGCGTCTGTCATCCACAGATCATCAGCCTCTTGCTTAGTCTCCAT
-TTAATGACAATTTCTATTTAGTATACAAGAGTCCTTCCCCCCGCAATGCAATTTCTTCACTCTGAAAAGCTCTGACTCTG
-GCTACTGGTCTCTGTTATGTACTCATCCCTAGAGCCATGTCTTCAAATATTTCTCAGAACTTCTTCACATCTAAAAATCT
-AGGATTAATGTATTGCTCTCTGATTATATTCTTCTGGTATTTCAAGTATCCTGTATAACTTCTTAATCTGCCCTTGCTTT
-TCTTCTACATCAAGATGTCAAGTTCATGGACTTCCCAATTAATCATTTTAAAAATTTATTTCAAGCCTTTATGAGTCACT
-ACAATGTACATATGTTCTCAGGAATTATGACCCTACAATTTGTATATGAGAATAGTTCCTGTGTCAGGCATTATGGACAT
-AAGAGTAAATAAATTCTAGCCCCTGCCTACAAGGAGCTAATTCCCAGCCTAAGACAGATTGTAAGCCAATAATATGCAGA
-GTTGTAAGTCTAAGGAAACTGATTGGGATGTACCTAATTCGAGCTGGGAATATCAGAAGAAAAACTTTTTGAAAGTCATG
-AGACATGAGCTGTGCCTAAAAGAATAAAAATAGAGTGAGAAATAAGAATAAATAAATTAGGGAATGAGATGGGTATAATA
-GTAGAAAAAGGAAATCTCTTTAGATAAAACAGGGTATGAGAGTATATAGGAGGCTTATTAACTCAGTGTGGTTGGAGAAA
-ACAGGTTGAAAGGAGAAATAGGGGAGAAAGTTACAAACGGAATCAAATGTGTTAGTAGTTGAGGGAAAAGCAAATATTGA
-ATACGACCCATAGATCTTGGATAAACCAGTGTTTGGTAGTAGCTTACATAAAAGGTTGTGACAAAATAACCAGAGATATG
-TGGAGAAAATAATAACTGAGTGTTATATTTCCTCTCAGTAGAAACCTAAAAAAAAAAATGTAATCACATACTGATCTTTT
-AACTGACCTCCACTTATCTTGCTGCCTGGATTGGTATATATAGTCCTCTGCCTGAAAAATTGCTCAACACTTTTGAAAGG
-TTGTTTCTCACTGTTACTCCCAGGCATTTCTGCTAACACCAGCTGAGTTGTAAGGGGCCCTCCAGGAGGCCTAGGTTGTT
-CTCCTTATCACATATATTATTTTCATTTATCAATTTACCCAGAACATCTAATGAAATATTATGGACACCAATAACATGAA
-TACAAATACAGCTATAGTCCCTAAAAAGTAAATTGATGTCTCTTGAAAGACTGTCATGTCTTAGATGCTAAATTTGGAGT
-ATGTGTTTCTAATAAATAAATAGCTTGCTTTAATAATTCTGATTTATGAATGTAATATAGGGGAGCAGCTTTTATTTCAT
-CCTTAATCTTAAAAAACAATTAGCCGGGTGTGGTGGCGGGCACCTGTAGTCCCAGCTACTCAGGAGGCTGAAGCAGAAGG
-ATGGTGTGCACCTGGGAGGCGGAGCTTGCTGTAAGCCAAAATTGTGCCACTGCACTCCAGCCTGAGTGACAGTGTGAGAC
-TCTGTCTCAAAAAAAAAAAAAGATCATACAAGGAGTAAATGATGATTTAGCATAAAACACAACTTGAGCCTAAAACACAG
-ATCATAGGGCTCAAACTTTGTTATTTTATGGGATTATACTAACCAGTTAATATTCAAAATTTACCATTTCAAAAGAAGAA
-ATATTGGTCTGGGAAAATTGCCATTGCTTATACAGAAGAATGGAGGAATCTTTTTGAGAACAACAATTCTAATGATCTTC
-TTCATCACTGGTTCCAAAACCAAGCCCATGGAAGGCCTGCATAGGGATAATGTGGAGAACATGCAAAAGAAATACACATC
-ACCAGCTCCTCAACTCAGAGCTCCAAGGGAATGGCCAAGGAAGCTGTATTGTCCTAAGAAATTTGAGACTGTTTTGACTT
-ACAATAAATCCTGCTCAATCATATGTATGTATACACACACACACACACACACACACACACACACACACACACACACACAG
-AGAGAGACGGTGTTGTCAGTGAAGCCTCTAACATTGCATCTTGACTGGACAGATTTGACAATTAAAATGGCTGGAAGAAA
-ATAGGTTTCATAAGTGTCACTTACTATTCACATTACACATTAAAAGGACATCTCCTAAATTAAATCTTGTCTATGATAAA
-AAGGCAGAAAATCATGACCCAAGGCTCATTTATAACTGCAGAAATGTTCAAGATAGACCAATGCTTGCTATGTTTAGGAA
-GTGACAAGAAAGTACAGGTCTTTATAATCTACCATTTTGCCCCTTTTGATACCAGGTGACCTTCATAATGCAGGCTATAG
-AGAATTACAAGATTTGTCAGAGATTTCAGGTCTTTGGAAAGCTATGCTCTTTCACAAGAACAGCCATGGAAACAGGAAGA
-AAGTCAATTCCCACTTAAGGTAATCAGAATTTACAAATATTCCTTTCTTCATTGAAATCTCAATAGGCACTTCGATATTA
-TATTTAATTAATTCTTTTGTTACAATCATGCATCACATAACAACATTTTGGTCAAGGATAGTGCACTTGTATGACAGTGG
-TGCAATAAAATCATAACACTGTATTTGTACTGTACCTCTTGTATGTTTAGACATGTATAGATACACTTACTGTATAGATA
-TAAGTAAGTATAGATATACTTGACTGTTGTGTTACAATTGCCTACAGTATTCAGTACAGTAATATGCTGCACAGGTTTGT
-AGCCTAGGAGGAATAGGCTATACCACCTAACCTAGGTATGTAATCAGCTATAGCATCTAGGTTTGTGTAAGTAAACTCTG
-TGATGTTCATACAATAATAAAATTGTCCAGCAATGCATTTCTCAGACACACCCCTGTCATTAAGTGACACATGACTGTAT
-TAGTTAACACTATGGGAACTTCATGGGAAATGGAAACTCTAGCTCCACCATAAATAGAAACTGTTTATGTCAAAAAACAC
-ATAAAAGCATAGTTGCAAGATTACAATTCCTTCCAGATATTTCATTTAGTACCTCCACAGATCATTAACTTCCTGAATAG
-CATTCTTGTGTTTCCACTGCCTCACATTTGATTTCAGGTCATTCCATCAATTGTCAAAGATGCATCCAACATTAACTTTC
-CAACTACTGGTTTGGATTGTGTCAACATTGTCATTCTGGGCCACAACAACACAAAAGGCTAACTCAGTGAGGTAACATAG
-ACACTGATCAGTGAGATTTTGCTGATGGGTGGTACCATTTTTTACCAAGATCAAGGGTATTCATACCTTCAGGCATCTAG
-ATAACATTGAAAAGGGCAGGTTCATAGATAAAAAGGGAAAGAGGAAGGGTTTTTGCAGTATATATGAGCTACCATGTCTC
-CTGTTTAACCTGAGTCTGAAGAGATTCAAAGTGCAGGTGCCATGAATGCCTCTTTAATAGCTCCATGTCGATTGATTTTC
-TGGGCTACACTTCACAGCATTCAAATTGCTAAATGCATATAAACTAGTAGTGGATATTTATTACCTGGATTTGTGCTTCT
-GAGTGACCTTATCTATAGTTATGTGCTTCAGTGATCCAACTTGGGGTGCACTCCAAACTTTGATAAATTAAAGACCCTGC
-ATATTCCTTGAGTAATGCTACACTGACAACTGATTTAGTGAATGCCACTGTGAAAATAATAAACCTCTTGGTGAATATAT
-TTAGACATGTCTTGGAACCTGTACACATCTTAACCAGGGATGTTACTTGGTCTTTTTATGTTCAGGAGTGTCTGGAGATA
-GAAAAACATACAGGATTGTAATTGTTGCCTGTGAGACTAACAGAAAATTCAAGCTAGTGAAGTATGTTTATGCATGGCAC
-ACTTCTCACCAGCAATTTTAGGAAGTTCTACCCAAAACCCATATGTCTTTTGATATGTGGGTTACCTTGGAGAGAGAAAA
-AGAAACTCTGAACACAAGCATGAAATACTTTCGAATTTTATCTAGAGTTGGACTTGTCCAAAAGCTTTTGTATAAACTTG
-CTTGATGAGGAACTGTTGTCCACTGGTACCTTCACCGTACAATCCACACACAACCAAACTTCACAACTGGACACCTAAAT
-TTGCACTTTGTTTGGTAAAGTTGAATGAAAAATGTTGTCTTTTAAGCTTATGTTCTCTTATGAAAGCTGTTATTAGATTA
-ATTTTACTCCAAGATATGCCAGTTAGGAAATAACTTCCCATTTAATTTCACCAGCTCCCTGTGGGTGGACTAATTACTCA
-TACATCACACTTACTCTGGTGGTGAAATGCCTCAAAAGAAGGTCTCCAGAGTGTTGCTTTACCTAGAAGGACAAGAATGA
-AGAGACATAAAAATCATTCATTAAGAAGGAAGAAGATTTTCCTTGCCTAGATTTTCACTTGTAGGATCCAATTAATTTTA
-TCACTTAATATTTTGTCCTGGTGGGCATTCACTTTACAAATTTGTAAGGTCAGTAGAAATGGAAACTTTTGGAAATCAAA
-CTGTAAATGTTCTGTAGACGTTGACAGAAATAGCTATTTGGAGCTGCGCTTTTACCAACTAGACACTCTGAGAAAATCTG
-TGAGAGGATATTTTCAGGAAGTCATTGAACCCCCTAAAAATCAAGTTTATTGCTTTTACCATAAATATAAATAATTTATT
-TATTATCAACCACTTTCAATATTCGAATAAGTAACTTTATTGTTTATTTCATTGACATGATCTACATAGACATGCAATTT
-ATCTTCTTTTGCGATACATTCAGAAAATTTGCTGCCTGAAAAAGCCATGTTTTGAAATTACCACCTGTTTGATGATTGTT
-TTTTTATACTTTAAGTTTTAGGGCACATGTGCACAACGTGCAGTTTAGTTACATATGTATACATGTGCCATGTTGGTGTG
-CTGCACCCATTAACTCGTCATTTAGCATTAGGTATATCTCCTAATGCTATCCCTACCCCCTCCCCCCACCCCGCAACAGG
-CCCTGGTGTGTGATGTTCCCCTTCCTGTGTGCATGTGTTCTCATTGTTCAATTCCCACCTATGAGTGAGAACATGCAGTG
-TTTCATTTCCACTTAAGTATCTATCTCTATTTGTCCTTTATTTTCACTTCCATCCTAGCTCTATCCCTTGTCTCCTTCGT
-GTGTCTCAGGATAAGTGCCCTATAACATTTTATACTTCTGGAAACCCTTCAATATAATGTTATTACATGTAAAAATAAAA
-AGTCTGTTTTAGCGAACTCTTTCTTCACAAATTATCTTTTCCTAGTTCCCTATTAGACAATTTTTGTAGGCTCCATATGC
-TATTAATTTATATTCACTTTTAGAAGAATTTTCATCAAAAGCAAAAGTCTTATGTAAATTGTTTATATGCTATTTGTACT
-TCTGTGTATATATACACGCATAGCCACATACATATATGTAACTCCAGAGGCCTGCCTGGACTGTTAAATAACTGTATTGA
-ACAAGAGCAAGAAAAAGCTGTTCAAATTTCAAACAACAAGTTGAACTGAAGAGCTCACATCTTTGAATGAAATAGACACT
-AGTAGCCTTTAAAAATTAAACATTTCTACTGTTTTAAAAAATTATAGGCATCATAGTATGAGGAAAAAATGTAATAATCC
-TTTTTAATTCTTGCCATTTTATTAACCACGGACTCCTTATGCCCTGACTTCATTGGTACCCCTTTGAGATTAAACAGAAC
-AATTAATTTAAAATTCTGATAAATAAATAAATTGCACCATTTACTTGAGGTACTCTTTCACCTTTCAAGAAATATTTTGA
-GAATTCATTAGCTAAATATTGCTATAATGCAGGCTAGTAATAAATAGAAATAATGATTTCATTGTAAAGTTTAAACTAAT
-GATGGTATGATCTGGAATTTTTGTTAACCTAGAAGACATAATTAGCTCTACAGGTGAAATGAAAGACAAAATCACTTCAC
-ATATTAGTAAAAAACAAATAATATAACTTTATAAGCTACTGCTGTTCTTTTGCTGTTAAGAACCAATGACATCTGTAATT
-AGGGAAGATTATGGAAAGGTTAAAGGTGAGAATACATGCAGTCTATATACAGGAAACCCAAACTGTTTAGGTTAAGGAAA
-TGTCTGCAAAAGTCATATTAATTAGCAGGTTCACAGGAAACTAACATTTATTGTATAAATTCCATGGTCAAATGTATTAG
-GGCTCCACGCACACAACTGTGCGCCATCTATGTTACCACACAGTGCTTACTTCTTTCAGTCTTTATTCATTTCTCTCCTA
-ATGGTCTGTATGGTATTATTACATAGTTGTAAAAACCTTCCATGAGGCAGAAATTTCATTTAATGATACAGCTTCAAAAA
-TAATGAAAACCAGTAGAAACTTTCTATTTTTTTATGAAGCAGAATTATTGAATTTTCAGTTTCATTTATTTAATGTTACA
-AGAGGACAAACATATTTCTTTAATTTCTTCTTGTTATTTTTGTCTAACATCAACCAAAGCCATTTCTTTCATTTGAAGGT
-GAAAACTGCCCATCAAAATCCAGTTTAAGCTGAGAAACAAAGAACTAAATTTTTCATGAGACATTATACACTGCATAAAT
-ATAAAACAGGACCAGAAACAATGGTAGATTAGCAATTTTTAAAAAGACAAAAGCAGGTTATCATCAAATCAATTGTTACC
-AACACCCCAATTCCACCTCTAGGCCAGAAAATTAGCCACTTACCCACGGGAAAACAATGATTGAAGACAAAGTTCACCAG
-TGAAAGTTGGTTATTTTTTTCCATCCTTGCATCAACTAAAATGATATCTACAGTTCCTCTTAACACTTTTCTTACTTTCA
-AATATGTGGGTATGCTTCATTAGCTGAGGCCATGTTCCATATGTACATCTGGCTACAAGGGAAACTGGGAATGTGAGCCC
-TGATCCTAATGTTTGTAGAGTATTTAGAAGTTTGAGAATTCCCTCCAAATAAAGAGTTTTCTAAAACATTGTTAGACAAA
-AAGTTTGAATTACAAAATATGGTAGTAGCTCAGGTCTAAACCAAATGCAGGGAAAAAACTATTAACTCTAAAAAAATTAA
-ATACACATTTGATGGTAATGAGAAACAGAAAACAGGCAGAAATAGTAGAATACTCCACTAATGATGAAGTATTTGACCAT
-TGAATAAAGAAAATTGCAATGATTTAAATTTGCATCAAGGCAACTTCACACCTGATGACGCTTCCCAGTCTGTGCAAAAT
-TAGATGTCTACGAGTAAAGCGGTGAGTTTTACTAGCTTGAGGAATAAGAGCACAGAGTTCCAGGCTGACAGAAAAGAGGA
-ACTGGGAAATTTGAATGACATGGGAGGACATCTCACACAACTGAAAGTCACAGAGGAGAATATCACAGAGTAAAAATCTA
-AAATCAGCACTTCAACTTCATTCAAATATATGATGGCTGCTACATTTCACATTCATAAAAGGAGACTCCATAGAATCCAG
-CAGAAAACAACAGCTAAATTGCTAGTACAGAGCAGAGATTTCAACCATTGCATATAGCTCAGGAGTGAAAGTTTGGTGTT
-TGACTACGGAAAGAAGACTAATGTTAGAAAAGAGTCATTCTTCAAAGGAAAATAAACGAACCTATCTCTACAAAATATCA
-TACACATAATCTAACATATAATTTAATCTGCCTAGACATAGAACCAGGAAAATATGACACACAACAAAAAAAGTAAACAA
-TGGATTAAGACATTGAAATGGCCCACACGCTGGAATTAGAATATAAGAAATTTAAAATAAGCTATTATAAGCATATTCAA
-GGATTTAAGGAATAGATGGTCATAAGAGGGAATATATGGAGAATCTCAACAGAGAAGTAAAAATGATAAAGAGATAATAG
-GACAAATTTTAGAACTGAGAGACAGAGTATCTTATATAAAAATGTCATTTTATGTACATACCAGTAAATTAAAGATGGCA
-CAAAAAATTATCAGTGCACTTAAAAACAGATCAAGAACAATTTCCCAATACAGTTAATACAAACGAAGAAAAATAATAAA
-AATAGGGCCAGTCTAGCACTAATATAATTGGAGTCCTAGAAAGAGTAGAGAAGTAAATGAGACAGAAAAAGCTATTTGAA
-AAAGTAAAGACCAAAAGTTTTCCTAATTGTCAGCATATATCAACTTACAGGTTTAAGAAACTCAAAGAACAGAATAAAAA
-TAAAGAGAACCAAATGTAGACATACCATAGTCAAACCACTGGGCAAAAAAAAGAGTAAATCTTGAAAGTAGCTAAAGGGA
-GGGAGAAAATAATTTACATCCGTGGAAACAAATAGACAGATGACCTGTCATCAGAAATGACACTTTAAAAAGCAATGAAA
-CTACATCTTCAAAAGAAAACTGTCAACTCCAAATTCTATAACTAGATAAAGTAATTCTTGAGAAAAGAAAGATTTATTCA
-GATAAAAGAAAGCTTCAAACAATTGTCATTAGCAGACCAAGATACAAGAAATGCAAACGGAAATTTTTTAGGCTAAAGAA
-AGATAACAACAGACGGAAATTCTGACCTACAGGAAGCAAGGAGAAGCTCTAGGAATGGCATGTGCATAAACGTGAAAAAC
-TAAGGCTTATTTTTTTAGTTTTATAACAAACAACTGATGCTTTGAATAAAAAATTAAGTGTACTATTGATAATGTGTGTA
-AAATATTCTAAATTAATAGCTCTGACAGGAGACTAAACGCAACAATTTTGCCGCAACTTTTCCTTATGTTACATGAAAAC
-GCTGACTATTAACACTAAGTGGACTGCGATAAGCCCAGGATGTTTATTATAATCCCTAGAGAACCACCACATTATATGAA
-GATATTCTTCTAAAATGCCAATAAAGGAATTAAAATGGAACGCTGAATATTGTTCAGTTAATATAAAAAGGCATGAAAGA
-AAGAGGAGCAAAAAATGATGGAGCAAATAGAACATAAGAGCAAAATAGGCTGGGCGCAGTGGCTCAGCCTGTAATCCCAG
-CACTTTGGGAGGCCGAGGCGGGTGGATCACGAGGTCAGGAGATCGAGACCATCCTGGCTAACACGGTGAAACGCCGTCTC
-TACTAAAAATACAAAAATTAGCCGGGCATGGCGGCGGGCACCTGTAGTACCAGCTACTCCGGATGCTGAGGCAGGAAAAT
-GGCGTGAACCCAGGAGGCAGAGCTTGCAGTGAGCCGAGATCCCGCCACTGCACTCCAGCCTGGGTGACAGGGCCAGACTC
-CGTCTCAAAAAAAAAAAAAAAAAAAAAAATAGTAGGCTTAAATCCAACCTTTTCAGTAATTATTTCAAATGTAATTTAAA
-TACTCCAAATAAAACACAGATTGTCAAACTGGATAATAAAAGTACCTATAAGAGATGCATGCCAAATATTATGGTATAGA
-TAAGTTGAGAGTAAAATAATTTCCAAGTATACCAAGGAAACAACAAGGACAAGAAATCTTATGTGGCTATATTAATATAA
-GAAAAAGTAGACCTCCAAACGAGCAATATTACAACAGACAGCTATTTCATAATGACAAAATGTCAAGTAATTATGAAGAC
-ATAATGCTGTATTGCTGACAGAATAACTAAAGAAAATTAAGATAAAATAATTTTGACAACAGCTTGACCTAATCGATATT
-GACCAAAACAATAGAATATATGTTCTATTATGCTACACATGAAACATTTATCATTAGGCTATAGACCACAAAATATCTCT
-CAAGAAGTTTCAAAACACTGTAATCATGGAAAGTATGCTTTCTGACCATAATGAAAATGAGTTGAAATGGGTAAAAACAA
-GCTACCCAGGAAAGTCTACACTATTGGAAGATTTAAATACACCTTAAAATGCCCTTTAGCTCAATGAAGAAATCATAAGA
-AACACCTTTAAATACATTGAACTGAATACAAATAAAAATATACTATATCAAAATCTATGGGATAAAGTTAAGCAGACCCA
-GAGTAAATTTTTTGTATAAATGCTTATTCTAGAAAAGAGAAGTTCAAAACAAGTGAACTAATTTCTACCTTAAAAAGAAA
-ATCTAAAACAAGAGAGCAAATTAAGTCCAAAACAAGTAGAGGAAAGGAAATAAAACAGAAATTAGAAATCAATGAGACAG
-AAAACAGAAACAGGAGAAAATCAACATGGCCAAAAGTTAGTTCTGTGAGAAAGAAAGAAAATGCAAATTATACATATCAG
-GGATTAATGAGATTGTACAGTTGTAGACACAAGAGACATTAACAAGATAATGGAATATTGTGAAACATTATATACAAATT
-TTCATTACTTGGATGAAAGGGTGACTTCCTTGAAAAAAACTTATAAAAAATTTCACAAGATTTAATGGAACATAGGAAGT
-AATTGACATTTATTAAAGTAATTAAATTAATTGTAAAATACCTGCACATAAAAACATAAAATTAAATAAATAAAAAAATA
-AGCAAACCCCAGATCTAAAGAATTTCACTGGTGAATTCTTTCAAACGTTTAAAAAAAATAAAATTTTTAAATTATTTCAG
-AAATAAAGAAGGGGGAAATTCCAAACTTGTTTTATGAGTCAGAATCCTGATACCAAAATTACAAAACCTAGGAATGCAAA
-ATTGACTTCAACTTAAAGAGCTATCACCATTCTAATCTGTGATTCTAATGAATTTGGCTATCTTAGATACTTTATACAAG
-TGGAATCATACAGTTTGTCCTTCTGTGACTGATTTACTTTACTTAGCATTAATGTCCTCTAGGTTCATCCATGTTGCATA
-TTGACGGGCTTTCTTGTTTTAAAGCTGAATAATATTCCGTTGTATGAATATACCACATTTTCTTTATCTTTTCATCTGCC
-AATAGACATTAACCTTATTCCCACATTTTAATTAGTGTAAATAATGCTGCAATGAGCCTGAGAATCATCCCAATCTCCAT
-TCTTTAAGATAAATAACCTGAAGTGAGACTACTAGATCATATGCTAGTTCTACTTTCTTAATTTATTTGAGGAACCACCG
-TACTGTTTTCCATAGAGGATGCACAGTTTTACTTTCCCAGAAACACTGTAGAAGTGTTCCAATTTCTCCCCATTGTTAAC
-ACTCGTTATCTTTTTCTTTTAATAAGACCATTCTAAAGGGCTTGAGGCAATATCTCTTTGTGGTTTTGATTTGCATTTCC
-CTGATTAGTGATGCTGAGCATTTTTTTCATGTATCTGTTGGTCATGTGGATATTTTCTTTGGAGAAATATCTATTGCTGA
-TTTAAAAAAAAAAAAACTCTCAGCAAGCTAGATAAAGAAATTTTCTCGAAGTGATGGAAAGCATCCACAACAAAACATAT
-AAACAATACTATATTTAATGGTGAAAGCGTAAATGTTTAAACCACATAGATTAGGACAAGAAAGGGATGTGTGTGTTCAT
-CACCTCTATTCAACATTGTACTGGTGATCCTAGATTTTGAGTATAAATATTTAGGGGACAACTATTGTCACTGAAGCCCA
-AATCTTGGTCATCCTCAGAAAAAAAAAAAAGTTGATTAGGTTGTATATAATCTAATTTTACTTGCTAATTTAATTTCTCT
-AAAATTGCAGCTTGTATCAACTCTAGAATTTATTGGGCACCTCCTAGGACATAAACACTGGAATTTGGTGAGAGACGTCA
-AATAGGAAAGAACCTGGCTCTGACATAAATTCAACACACGGAGGGGGACACATATTATGAGACTGACCTGGCCTCTTCAT
-CTCATAAAAGGGGTTCTTGTTGCTTGTAACACAGATTAAAACTATTTCAATTACATTCAAGATAAAAAGATTAACAATGG
-TATGTAAGATGAAAAAATCACCCCGCAGGAAGACGAAAGTCTCACAAAAGGATATTTAAGCTAGCCAACACTTTGAAATT
-CAGGCAGAGATCGTGATTTCTGGGTGAACTAAAGTAGCAAGAACAAAGTAGAGGCTCCAATTCTAGGAAAAATGGGTCCT
-AATAAGGTTTACAATCCAGAAACTCAAGATATCCAGACAGAAGGATGCAGTCTCAGCTTTCAAGGCAGCAGCAGTACCTG
-GATTACTAAGCCAATCCCCAACACAATCATAAACACAAATTTGATTGAGGAAGAAGCTTGCCCACCAGAAGATTTAGGTT
-ATTACAAGGTAGAATGTGATAGAGAAAATGAGCATGGGACTGGAAAGAAAAGGAGGTAGCCCCATGATTACAACTGGAAT
-ATATGTGTCAGCGATGGTGCGGAAATAAGACTGAAGAGAGAGATCCTTAAACCCCACGTGCCTTACATCAGGACTAATCC
-TGGACACAGGCTGGAAAGCATAGCCTACAGGTGGTGAGGCAGGAGGAGTGGGCTCAGCTGTGAGAAGGAGAAGGAAATAT
-GGCTGAAAACTAGATAGGGGTCTTGAAATCACACCGAGGATTTGGGCCTTTGCTGCTGTCTGCCAGCAGCTGCCAGTAGT
-TCTCACACTTTGGCTGGCAACAAAATCACCTGGGGCAGTGGTGCGGAAGCGGGGGGAGTGTTGTAAAACCACAAGTGACC
-AGGCAAAAAACACCTGTATGTTTTCCAATTCAGTAAGTACAGAAATATTAATTGGAAAAAGGTGGAGGTCAGACATTGAT
-AGTGCTGTGGACTGCTCCAGGGACGTAAGCATGATCTTTAGAGAGGTGACTCTAATCAATTGAGGGCAACCACTGGACAG
-AAAGAGGTCCAGACCAACCATACACAGAGACATCATACAACTACACTTTAGCAACCTCTCCAAATAACATGTCTCTTAGT
-GAAACTTGGGAGGTTGAAAGTTAAAAACATAAAATCCAGTGGCATTTATGTATCCTAGGCACTTACATTTGTCTGATTCT
-TCCAACTTGCCTTTGCTTGGTTAGAGTTTTGGGTAGATAAGAGGTGGATTTACATGTGCTAGTGTGAGAACTTTGATACA
-CTCATTTAGACATTGACCTACTATCTTGTTTGAAAGCTAAAACCCAAAGAAATTTGTCTTTTTACATAAAACAAATTCAG
-CCCTTGCCTTCCTTGTAGATTACATCTTCCACTAGCAGTAATAAAAAAGTAACAATATGCATAAGTCAAAGTATCTTCTT
-AGATCCTCTGTAGTGTTTTATTATTTAGTTGTGTTAATTAAAGTAACTGTCTCAAAATTTCAAGGAATGCCTGAGAAGAA
-ATTCATGTTCAAAGGCTGCCCTCTTGTGACAATGTGTTGTATGCTTTACTGTAAAAGTAACCTTATTTTACCTTATAACC
-TCTACAATCCAATTCATAACAGCATAAAAAGGAAACAAAACCTTACATAATTTTGAATTTTAAAAAGTACCTTGTTTATA
-TGGCTCCTTTAGCTAATGAATAGTCAATTTGGTAAATATTCCAGTGAGTTGAAGGTTTGAATCTATCTCACTTAACTAGC
-TTGATGAATGTATTTCTAAACCTATACAACCCACTCCTCTGCTTTTAAAAAATTAAAGTTAGCTGTAGATTGAGATGTCA
-GTGACACAGTTTATAGAACATAACTTAGATTGTCATCTACATTACTGTAACTACAAATACCACCCTCAGATGGAAGAATA
-AGTTTTATCAGTGAACATCTCTAATTGAACTATAAATGGTGTATGTCTTCTGGTTTTTACAAGCTCTTGGTCTAACACAG
-GGGATATATGATGTAAAAATTACAAAGCAAGGTCACTCACGGTGGCTCATGCCTGTAATCCCAGCACTTTGGGAGACCAA
-GGCGGGCGGATCACAAGGTCAGGAGATCGAGATCATCCTGGCTAATATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
-ATTAGCTGGGTGTGGTGACACACGCCTGTAGTCCCAGCTACTCAGTAGGCTGAAGCAGGAGAATCGCTTGAACCCAGGAC
-GCGGAGGTTGCAGTGAGCCGAGATCGCACCACTGCACTCCAGCCTGGTGGGAGAACGACTCCATCTAAAAATAAATAAAT
-AAATAAATAAATAAATAAATAAATAATAAAATAGCAGTGACTATAATGTTTTGTGATGTTAAACTTTGAGAGCTTTTTTT
-TTTCTTTCTTTTCCCAAGTGCCTTTCCCAGTTCCAGGAGCAGAGTTATTCTAAGCCCACTGATGTAAAGGAATAGAAAGA
-AAAGGTTTGTTGGAAAACCTAATAACCTGCTTTCTGTCTTTTGTTTTTTAAAAGCTTGAGCATTTGGGAGAATTTGGAAA
-GATTGTGGAGTAAGTGCAAAGAAGGAATTTGCTAACAAAAATCATATAAGGTAAAATGAGTTTTTTCCAGGTTAGAAAAT
-ATCCACTCCCTACCCTCCTACATTCCTTTCCCATGGTTAAGAAGAGGAAAAAACAAAGGCCTCTTGGTGAGCAGTGGTGA
-CTTAGGCAGTTTCTTAGAAATATTCTAGAAGGCATAGTCATCTTTTAAAAAAAAAATAGCTACAAGGATATGTCTAAGCA
-GAAGGGTCCATGGGCCAAATTACGTGTAGATTTTTGCATTCCAAATATGGTAAAGAAGAAGCAGGAAGCTGGGGCTCCTT
-AACAGGTCACACAGAAATGGACAAGGAAGAGGCCAGCAGCAGCTTGTGGGGACAAGATGTCAAGCCCCAAATGTTAAACC
-CACCAACCATCCTCCAAATTCTGGCTCTGTTTAACAAGGCTGTGGTCTGACACTACATGCCGCCTCAGTGACTAAAGCAT
-AATTTCCCGTCTCCTGGGAGTGTTGACAGCTGACTCCTGGCAACAATACTCACAGCACAGTAAAGTTCCTTCATCCAAGT
-TCATGTCCCTTCTCAAGGCATCCCACATCCGAGAACTGCTTGGTACAGAAATATAATGGCCTGGTTTTCTTGCTCCAATT
-CGAGGTCTTTAGGTAAACTCACCAAGATCTTGTAGAGTGGACTGCGGCCATGATAGTGATTGCATTCCAGCCGACTTCCT
-GCTCCACCCAATCCTATTGCTTTCACTCTTCCACAGGTGTTGGGAATATCATTTCAACCTCCTTGCATGCAAATCTCCAA
-CTCGGAGTCGGCTTCCTAGGACACCTGACTGGTGATATCTCTATCACTATCACAGTACTTAGAGGGGAGCATCTTAAAAT
-GATTGAAGGCTAACTGCCCTAACAGCACAGACAGATGATGGCTTAAAATAGAATTTAAGTGGATTTAAAAAAACATGAAA
-AAAGTTGACATTGCACGCTCATATGAGCTTATGGATCAAACCATGTGTATGATTTCTAAGATCCCTCGTGCAGTATATAT
-TTGCACTGTTTATAAATGACATCCCCTTGAATTGAATTCAGTGCAATTCAAAACAGTAATTTGTGGGAAAAATTAGATAT
-GCAGATAGCCTGGACTCTAGAGAAGCACACATCATTTGGAGAATAATAGTGAACCGGCTAGTCTATGAGGGAAGAAAACA
-GAGTGAATATAGACTATTAGTGAACAAGGATATTTTCCCATGTATATTCAAATTAAGGTGAACTTCTTTAGAGAATTGTG
-CCTTAGAAAGAAAAAGTATTTCCCTGTATTTGAGTCCTCACAAGTTTTCCTACGATGAGTGCTTTTGTGATTATTTTGAA
-TAACAAAGTAATATTTAAAGAAACTCTCTTGCCCTGAATGTACTTTAATTTATGTCAATTGATGTTGCATATAGAGATCA
-TCAGAGTCAAGCTACAAGAAAAAGAGGAACATAACTTAGCAAAGACTTAGAGGATTAGTCCTAATAGTGTGAAATCAAAA
-TTTCAAGTGAGGGAATAAATGCAGCTTTTAATGATTACTTAAATGAAGTTTAACTCTAGCAGGATCTACAAGAAATTGGC
-AACCTTTGGCTTCAGTAACAGAAACTCAGGATATATGCCCTTCAGTGAGTTTGCATTCTGCATCATACTGAGAGACACTC
-CTTTAAACAGCAATAAGAAACTTCCTGTGACAACATAATAAATTCAAAAAGTTCTGTAACTCAGACAGTTTAGATAGAAG
-TGATAACTTTGGCCTATAAAGCCCTGTTCACCCTAAAGATGGATTAAACAATGAAAAAGATATTGATATCAAAAGTTCAA
-TCAGTAATTTGATTAAAGCATTTCATTAAATGTGATAATTTCTTAGTATATTATCTTACATATGCAATATTCATGTGTAA
-CAAATTATATACAAGTAAACATTTGACCATATTATCTGCAGCATAATTTACATATCAATTTACATATTCAGTTTTGCTCA
-CATGAAAACTTGGATCTTCTCAATAAGAAAATTTGTGAAATCTTTAATTCCTCATCCCCAGGAATGTAAATAAATAAATA
-TAAATACTGTAAGTCAGTGATTTTTTCCTAGGAAGACAGTAAAAATACTTTACACGCCTTCTCATTGTAAACCTAAATAA
-CAAACAGAGAAAGGCTCTCTAAAGGAAAAAGACACATCTTAGGGAGGAGGGCACTGCAATGGGAATATGCATGACAAAGC
-AAACTATATAGATTCAAATGGTAAAGGAAGACAAGGACTTTAAAAGAAAAATGATCAACCTGGAAGTATGGGGGAGTAGA
-AAAAAATAAATAAGGGAAAATGAAGAGGCTTCTATAATTGTTTTGATATAGTTACCTTTGACTATAAAGATCAACAACAA
-GGTCAATATCAGTTGAAGTTTGGGCAGGCGGTTGCTGGATAGATGTCCTCACAGAAGTGTATTTTGTGTAAGGTTGCTAT
-GGCCTTTGTGCAAGGTTGTGGTTTTTGTGGTATTTTGTAATAGTTTTTATCAGGCCTAGAAGCATGAGAACCCTCTCTTC
-AAGGCCTTCTCTGAATCTATTTGTTCAGGTTTCTTCTTCTCTTTTTAAACATTAGTGACAGTTTTGATTCTGATAACTTT
-CATATCATGATCCCTAATTTCAAAAAAAATTAAACGTGTAACTTATTTATGATGTATTTGATAGGCTTGGATTTGTGAAT
-CACCTCTACTATCTATAGTGGTAGATATATCTGAGCCTGCTTACACAGGACTTCCATCAGATTCTCTCTTCAGTGGAATT
-GGAAGAGGGGGTTTTGGAGAAGGGAATGAAGGAATTGTGCTGCATCAGAGGTCCCCACCTAACAGCACAGGGTCTTTTTC
-TGTGCTCTTGCCAGGCCGTTGTATTGGCTGATGCAAAAGTAATTTTGGTTTTGTCATTGAAAGTAATGAGACCATCTGAC
-TTACAATGTCTGTGCCATAACCAGCTCCTAATAGCCTCCGAGGACAGCTTTGCCCTGACATATACTGTCCTGGGACCACG
-TCTGCTTTGTAACTCCTGAGGTAGCTGCCACCATGACCAATGCCTTCTCATCTTTACTCTACATGCAGGTAACAGTTATA
-ATTATATCTCTGTGTATTCACAGAACATTTAGTACATCTGGGACTTCTACAAAATTTCCCTAGCTGATTTTGGTGTTCTG
-GGGTACTGGCAGCTCTAGCCATGAAGGGATGATGCTTTATCAGCATTTCTGTTGAGTTTTTTGCTTTTTCTCAAAAACTG
-ATTCCACTTTTCCCACATACGTTTGACAATTCATTTGAACTCATTTATTCTAAACCCATTATTTCTGGTCTATTATTTAA
-TAGGAAGGGAGGCGAGGGATAAAAGATTACAAATAGGGTGCAGTGTACACTGCTCGGGTGATGGGTGCACCCAAATCTCA
-CAAATCTCCAGTAAAGAACTTACCCATGGAACCAAATACCACCGTACCCCAATAACCTATGGAAAAAAATAAAAAATAAA
-GTAAAAAAGAGTCAGAAAGAAAGAAAATAATCACTGTACTTCCCAAGACACTTAGAAATGGTGACTAGCATTATTTGTAA
-GTGTCACCTAATAATATTATTATTTTTTCTTTATGCTACAAACTAGCTCTGATATTACAATCACTACTATTTGAAGTGTT
-ACTAAATTAAATTAAATGTATTGTATCCTTCTGGACTCAGAAATGGGGGTAAATGCTAAGACAATTTCAGAATATGATCA
-CATATTAAAAGCATATTATATGGGGAAAATTTGATTTTTAAAAAATAGAAATTGGTAGAGAAACAATTTTTGGGTCTTTA
-ATGTACGCACATTTTGCAAGTATGGACGCTGAATTTATTGTTCCAAATGATTGTTTTCAAGCATGTTTGTATAGAAAACA
-GCCTTGGAATAGAAAACCAGTACCTCCTTCTGGAACAAAGGAAAAGTTTATTTACTGTCTAGTATAATGCAGATAATTTC
-TCCCTCTTGGGAAGCATACAGCCAAGTGAACTTCCAATAACACAAGTTGGGGTTTCTTGAGCTTGGGTTTTTCTTCCACA
-GTGTAATGTGCAGGTGCCACTTGGCTCTCTTTGTGTTATCCTGCGAAAGCTGATGGCTATAGGTGCATGTGTTTATTTTG
-GGTTTCTCTATTATGTTTCATTGGTCTTTGTGTCTGTTTTCATATCAGTACCATGTTATTTTGTCTACTGTGGCCTTAGG
-GTATAGTATGAAGTCAAGTAATGTGATGTCTCCAGCTTTGTTCTTCTTGCTTAGATTTCCTTTGGTTGTCTGGGCTCTTT
-AAAAATCCATATGAAATTTAGAATATTTTTTTTTTCTGATTCTGTGAAAAACGACATTGGTTGTTTCATAGGAATAGTGT
-TGAATGTGTAGATTGCTTTTGGCAGTATAGCCATTTTAACAATATTGATCTTTCTAATCCATGAGCATGGAATGGTTTTC
-CATTTGTTTCGAGATCTATGATTTCTTTCTGCAGTGTTTTGTAGTTCTCCTTTTAGATATCCTTTACCTCCTTGGTTAGA
-CATATTCTTCCTTTATTTTATTTTATTTTGGGGGTTGCTGTTGTAAACAGGATTGCACTCTTGATTTACCTTTCAGTTTA
-AACATTTTTGGTGAACAGAAATGCTACTTCTTTTTATATGTTGTTTTTTTTTTATCCTGAAAGTTTGCTGAAGTTTTTTT
-TATCAGTTCTAGGAGCCTTTTGGCACAGTCTTTAGGGATTTCTAGGTGTAGAATCATATCATCAGTGAAGAGAGATAATT
-TGACTTCATTTCCTATTTGGATGCTTTTTATCGCTTTCTCTTGCCTGCTTGCTCTGACTAGGACTTGTTAAACAGGAGTG
-GGGAGAACAGGCATCCCTATTTTATTCCTGTTCATAAGGGGAATGTGTTGGGAGAAAAGCTGAGTGTTGGAAGACAAGCT
-GAGGCAGGGCCATATGTTTCTCATTCACTTGATACACCATTTCCTTTCAACCCCCACATCCTCACCACCTGTTTCTTTGT
-TTGAGCACCAACAAATAGCGTGGGCTCCCAGAGCTTGGGGACTTTGCAGACTCCATACTCGTGATGGTCTCCTGGTCCCA
-CTTTCTCTCTCAAACTGTCTTTTTCTCATTCCTTTGACTCTGCCGGACTTCATCACCCCCATGACCAAGTGTTGGGTCTG
-ATCACCCCAACATTCCTGGCGCCCAACATAGGGTGACAAAGACCCGGTGAAGGAAGGCTAGAGCATATGAAAGCAGAGGA
-CACATCATCAAAAGACACCCGAGGACATACAAAGATGGGGAGTGAAAGTTAGTACTTAGAATTTGTTATTACTCTTTAGT
-ACAGTAAAGCAGTTTTGCCCATGGTTTCCAGAACAAAGGACTATGCAGTTGGATGAATGGGAGAGAATTGGAAGAGATTT
-TTAATAGGCATATAAAGATGGAGCAGAAATTCCAGTTTATATATGGTCAGTGTGGGCACTAATAAAGGCAGCCCTTGAGC
-CATTTCAAACAGATGATGAGGCAGATTCAGATGAGGAAGAGGAGGATGAGTGTAAAAAACTAACTTCAAATTCTGAGTGT
-GAGGAGCAGCTACCGGAGGAGATTAAAGAAAAGAAAGAAAAACTTTAAAAAGTATGTTTTACTAGCCCGTTGGCTCCACC
-TGCTGAATTAAGTGAATGGCCACCTCCTCTCTCTCCCCTAAATGGGTGAGAAAATAAATTAGCTGAAAAACTTACTGCTC
-CTGTAGTTACAACATTAAAACCTGGAGCAGTTGGTGGTGCTAGACAAAATTCTATTCAAAAAGCTAAAGCCAAGGGAGAC
-CTTGAAGCATGGTAATTTCCCGTTACTATAATCCAGCAAGTAGGACAGAATATAGCTAATTAGCCTGCTTTTTCTTCTAA
-GTTACTAAAGAATTTAAGCAAGCCATTAGTCAATATGGACTGAACTGTCTTTTTGTGCAATCTTTATTAAAAAATATGGC
-TCTTGATAATACATTACTACCATATAATTAGGATACTTTGACAAAACCTGTTCTCACTCCCATCTCAGTACTTGCAGTTT
-AAAACTTGGTAGGCTGATGAACTCAAACTCAGGCAAAAGAAAACACACACGTGCAGCCACCTGTGCCTGTTTTCTTTGAT
-CAGTTAATATGAGTTGGTCCTAACTGGGGTTGATTAGAGAATCAAGCAGTAATGGAAGATGTTGCCATTATTCAGCTGTG
-CTTCATGTGCTTACATGCATAGAAAAGGATAAATGTTACAGGGGAAAAGTATCCTTATTTAAGTTCTGTCTGACAAGGAC
-CTAAAGAACCATATATTAATTCTATTGCTCAGCTCCAAGAGGCTGTGTATAAAGCCGTAAATGATCAAAACAGCTCAGGA
-TGTTGTAATACAGCTTCTTGCATACAATAATGCTAATGCAGAGTGTCAAACTGCTATTAGATATCTGAGAGAGAAGGCTC
-ATTTAACTAAATATATTAAGTCTTGCGATGGCATTGGAGGTAACTTACATAAGGCTATTCTTTTAGCTCAGGCTATGGCT
-AGATTAAGAGTAAGAAAAAATATGCTTCATTTCTCAGGCTCTTGCCTTAATTGTGGGCAAATTGGACACAAGAAAGGAAT
-GTAGAAAGGAATTCAAAAGACGAAAACTACTACCATGAATCAACAGAAAAGACCCAGTGTATGTCCCTGGTGTAAGAAAG
-GCAATCACTAGGCAAGTCCGTGTCATTCTAAATTTAGCAAAGATAGACAACCTCTTTGAGGAAATAGGAAGAGGGACCCG
-CCTCAAGCCCCTCAACAAACTGAGGCATACCCAGCACAGCCACTGCCCTTACAAATGTACAGCAATTGTCCCCCGCCTCA
-GCAAGCAGTGCTGCTGTAGACCTCTACAGCACAATTCCCATCTCCTTACTTCCTGGGGAGCCACGAAAGAAGGTCCCCAC
-AGGAGTTAGGGCACCCTTACCCTGAGGAACTGTTGGGAACAAGCCCCCACAAATCCGGCCATAAACTGGCCCCAAAACTG
-GCCATAAACAAAATCTCTGCAGCACTGTGACATGTTCTTGATGGCCATAACACCCACGCTGGAAGGTTGTGGGTTTACCA
-GAATGAGGACAAGGAATACCTGGCCCGTCCAGGGTGGAAAACCACTTAAAGGCATTCTTAAGCCACAAACAATAGCATGA
-GTGATCTGTGCCTTAAGAATAAGGGATACTTTTAGTTAATCTAATATCTATAGAAACAATGCTAATGACTGGCTTGCTGT
-TAATAAATACGTGGGTAAATCTCTGTTCAGGGCTCTCAGCTCTGAAGGCTGTGAGACCCCTGATTTCCCACTTCACACCT
-CTATATTTCAGTGTGTGTGTCTTTAATTCCTCTAGTGCTGCTGGGTTAGGGTCTCCCCAACCGACCTGGTCTCAGCAAGT
-GGTGCCCATTCATGGGGGCTCGAATACAGGTCAAAGGATCGCTGGAGCAACGATTGGAGAATGTGGAACTAGCTGGAGGA
-CATCCGAGTACTCTTAAAGCAATCCCCGTGGTGAGTCAGAAGGGGAGCTCGGAAGCATCAGGGTAACAATGGGACAAGTG
-TGGGCTGTGGTTCGTTCTACCTTGGAACTTTTTCACACTGATAATGAGGAGGAAGGAGAGTATATCAAAGTAACAGTAGA
-GGCTACAGACCAGGTTTATTTGCCACCTAAAGCTAAAGCAGAAAAGGAGGGAGAGGTTCATCCCTACCCTTCTGCACCCC
-CTCATTATTATTTTGAAGAAAACGACCCTCCAGATATTTCTTTTCTGGAGGACACTGGGTGAAAAGTAGTTGCCCTGGTG
-ACTGTTCGAGCACCGCCTTGAGCGACTGCTTAGTTCTATTCAGGCAGGAATTCAGCAAGCTAGACAAAAGTGGGATTTAG
-AGGCTTGGCAGTTCCCTGTTTGAATACACCCCCCAGATCAACAGGGAAATATTATAGCTACATTTGAATCTTTTCCTTTT
-AAATTACTCAAAAAAATTAAACAAGCTATAAATCAGTATGGACCAGGTTCTCCTTTTGAAATGGGACTGTTAAAGAATGT
-TGCTGTTTCCAGTCGGATGATTCCTACTGACTGGGACACTCTTACTCTAGCTTGTCTAACTCCTGCTCAGTTCTTACAAT
-TTAAAACTTAGTGGGCAGATGAAGCTTCCATTCAGGCTGCTCGCAATGCCTGGGCCCAACCTCAAATTAATATAACTGCA
-GACCAACTTTTGGGGGTTGGTGGCTGGGCTGGTTTACATGCACAAGTAGTCAAGCAGGATGATGCCATAGAACAGCTTAG
-AGGAGTGTGCATTAGAGCTTGGAAAAAATCACTTCATATGGAGAACAATACCCTTCATTTAGTGCTATAAAACAGGGACC
-AAGAGAACCATATGTGCATTTTATAGCTTGGTTACAGGAGTCTCTTAAAAAGATGATTGCAGATTTGGCTGCTTAGGATA
-TAGTGTTGCAGTTATTAGTTTTGACAATGCTAATCCCTATTGCCAGGCTGCTCTGCGACCTATCAGAGGGAAAGCACATT
-TAGTTGATTATAACAAGGCCTGTGATGATATCAGAGATAATCTACATAAAGCTACTTTGTTGGCACAGGCGATGGCAGGA
-CTGAGAGTGGATAAAGGAAATACTCTATTTCCTGGAGCTTGTTTTAACTGTGGGAAGCATGGTCATACTAAAAAGAATGT
-AAAAAAAAAATCAGCAAGTCAGGCCACCAGATAGGTGAAAAAAGAAAACTGCTGATCCTGAAATATGTCTAAAATGTAAA
-AAAGGAAAACTTTGGGCTAATCAGTGTCACTCTAAGTTTGATAAAGAAGGGAACCCGATTTTGGGAAACTCCCTGGGGGG
-CCCATTCCAGGCCCTGTTCTAAACCAGGGCATTTCTAGCTCAGGCCATTCCCTCACACCCGTACATTATCTGTCCCCCAC
-CATAGCCCATAGTGTCGCAGTAGACTTATGCTGCACAAAAGCTGTGAGCCTTCTGCCTGGGGAACCCCCGCAAAAGGTCC
-CAACAGGAGTCTGTGGACCGTTGCCAGGAGGGACAATGGGATTACTTTTAGGAAGGTCTAGTTTAAGTTTAAAAGGGGTA
-CAAATACACACTGGAGTCATTGATTCAGATTACAATGAGGAAATTCAAATTGTGATATCTACTTCTGTTCCCTGGAAAGC
-ACAGCCAGGAGTGGGCATAGCACAGCTCCTGAGTGTGAAGTATGTGGGAATGGGAAAAAGTGAAATTAAATGAACTGGAG
-GATTTGGAAGCACAAATAAAAAAGGCAAGGCAGCTTATTGGGTAAATCAAATTACTGATAAACATCCTATCTGTGAAATA
-ACTATCCAGGGAAAGAACTTTAAAGGTTTGGTAGATACAATTTTTTTTTTTTTTTGGTAGGAGTGGACATTTCAATCATT
-TCTCTACAGCACTGGCCGTCCATGTGGCCAATTCAGCCCACTCAATTTAACACAGTGGAAACTGCTAAAGCCCCAGAAGT
-GTATCAAAGTAGCTATATTTTGCATTGTGAAGGGACCGATGGACAACCTGGGACTGTTCAACCAATTGCAACTTCTGTAC
-CTATAAATTTATGGGGGAGAGATTTATTATGACAATGGGGAGCACAAGTTCTAATTCCATAGCAATTATACAGCCCTCAA
-AGTCAACATATGATGCACGAAATGGGGCATGTCCCTGGTATAGGAGTAGAAAAAAATTGCAAGGTTTGAAAGAACTGCTT
-CAAACGGAAAGACAAAGTTCCTGCCAAAGATTAGGATACCATTTTTGATGGTGGCCACTGTTAAGCCTCCAGAACCTATA
-CCTTTAAAATGGTTAACAGATAAGCCAATTTGGATAGAATAATGGCTGCTAAGCAAAGAGAAACTGGATGCTTTAGAGAA
-ATTAGTTACTGAACAATTAGAAAATGGGCACATAGCTCCAACATTTTCCCCTTGGAATTCTCCAGTGTTCATAATTAAGA
-AAAAATCAGGTAAATGGAGAATGTTAACTGACTTAAGAGCCATCAATTCAGTTATACAACCTATGGAAACATAACAGCCA
-GGATTGCCTTCTCCTACTATAATTCCAAAAAATTGGCCTTTAATAGTCACAGATTTAAAAGACTGTTACTTTACTACCCT
-TTTAGCTGAGCAAGACTGTGAACGGTTTGCATTTACAATTCCTGCAGTAAACAACCTGCAGCCTGCTAAGCGTTTTCGTT
-GTTTCACAGATGGGTCTAGTAATGGTAAAGCTTCTTATTCTGGATCAAAAGGTAAAGTTTTCCAGACACCCTATACTTCA
-GCTCAAAAAGCGGAGCTTGTAGCTGTAATTGAGGTATTGACTGCTTTTGATATGCCTGTTAATGTGATTTCTGATTCTTC
-ATACATGGTTCATTCCACACAGTTAATTGAAAATGCTCAGTTACGATTTCATACAGATGAACAACTGATAATAAAAACAA
-AAAAAGGGGGAGAAACAGGGATTACGGGTAGCCCATACACAATTGAATCTATCATTATTAACTTTCAAATTTTTGAGCCT
-GCCCAAAGGCCAGATGTTACCAGCAGCTGAACAGCATCTACAGAAACTAGCTGCAAAGAGAGAAGCAGAACAACTGGTTT
-GGTGGAGAGATCCAATAACAAAAAGTTGGGAAATAGGTAAAATTATAACTTGGCATAGAGATTATGCTTGTGTTTCTCCA
-GGACCGAATCAACAACTGATTTAGATACCATCAAGACACCTGAAATTTTATCATGAGTCAGATGCTGAGGAAGAGATAAA
-AAGCACAATCATCATTGAAATTAGAGCTTCTGGCTGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTCTGGGAGGCCG
-AGGTGGGCAGATCACAAGGTCAGGAGATCGAGACCATCCTGGCTAACACAGTGAAACCCCGTCTCTACTAAAAATACAAA
-AAATTAGCTGGGTGAGGTGGCGGGCGCCTATAGTCCCAGCTACTCAGGAGGCTGAGGCAGGAGAATGGCATGAACCCGGG
-AGGCAAAACTTCAGGTTTTGCCAAGAATGACACTGTAAATGTAACAAAGCTTCTGTGCTTGTTAGTGAACACCAAATCAG
-CTACTCTCCTGTATTCGGAGATCAGGATGAAATGAAAAGAACAAGCAGGCCGGGCGCGGTGGCTCATGCCTGTAATGTCA
-ACACTTTGGGAGGCTTCGGTGTGCGGATCACCCGAGGTTGGGAGTTTGAGACCAGCCTGACCAACATGGAGAAACCCCGT
-CTCTACTAAAAATGCAAAATGTGCTGGGCATGGCGGCACAAGCCTGTAATCTCAGCTTTGGAGGCTGAGGCAGGATAAGT
-GCTTAAACCTGAGAGGGGGAGGTTGCTGTGAGGCAATATTGCACCATTGCACTCCAGCCTGGGCAACAAGAGTGAAACTC
-CATCTCAAAAAAATAAAAAATAAAAAAAGACCCCCAACCTTGTCTAGACTGTGGGGTTTCAGTTTCACCCCAGGGGGGTC
-CTGGTTGGGTTAGAATCCTGAATCTCGTTTGAGTTCGAACCCTAAAGAATAAAGGGAATAAAGGCTGTAGCTACTGAGCT
-ACTCAATCTGGTCTGGTTCTGGCTTTTGTGTGTCTATCTGTATTTTTGGTCTAAATATTTGGCCCAACAGAGGTTAAAGG
-CTTTGATGTTCTCAGCAAAAGCCTTGTGAGATTTCTAGTTTATCTGTGTGCTCAATTGGAACAAAGAGACTCAATAAACT
-AGAAAAACCTAAAGAAAATGGCACACGTGAAAAATTGAGAGCCAACTCCTGTTTGTTGTTCTGTCCACCTCCCTCTCTCA
-CTCCTCCTTCTGCCTTTGCTGTGGTCCCATGGTGTTTCTGTCTTTCCGGGGACCTGAGATTCAGTGTAGGAGTGAAGTCC
-ATGATTTTAAAGCCTTCATGTCTCTGCTTTTTAACTCTGCCTGCTTTGCTGAGCTCTTATAATGAGAAATAAACTATTCA
-GAACAGGTACAACAGGGCATCAGAAAACCAACTTCAGGCAGCGCTCCGGCAAGTACCTCCCTAGAGGGGAAGGGCTTACT
-AAAGGAGATTTAATCTTGAAAAGGCCAAAATGAGAAGCTCTAACCTTTAGCTTGCTAGGTTTTCTGGGACTCGAGCTGGC
-TATATATTATGGACCATTCTAGCCACACACACACACACACACACACACACACACACACACACTTTTTTGAGACAGAGTCT
-TGCTCTGTTGCCCACGCTGGAGTGCAGTGGTGCGCTCTTGGCTCACTGCAACCTCCACTTCCCAGGTTCGAGCAATTCTC
-CTGTCTCAGCCTCCTGAGTAGCTGCGATTACAGGTGTACGCCAACATACCCGGCTAATTTTTGTGGTTTTAGTAGAGATG
-AGGTTTCACTATGTTGACCAGGCTGGTCTCAAACTCCTGATCTCAAGTGATCCACCCACCTTGGCCTCCCAAACTGCTGG
-GATTACAGGCATGAGCCACTGTGCCCAGCCTATATATATATATATATATATATATTTATATTTATATTTATATATTTATA
-TTTATATTTTTTTTCTTTTTCTTTTTGACACACAGTCTTGCTCTGTTGCCCAGGATGGAGTATGGTGGTACAATCGCGGC
-TCACTGCAACCTCCACCTCCCAGGTTTGAGCGATTATCCTGCCTCAGCCTCCTGAATAGCTAGGACTACAGGTGCACACC
-ACCACACCCAGTTAATTTTTGTATTTTCAGTAGAGATGGGGTTTTGTCACGTTGGCCAGGCTGGTCTCAAACTCCTGGCC
-TCAAGTGATCCACCTGCCTCAGCCTCCCATAGTGTTGGGATTACATGAATGAGCCACTGCACCTGGTCTCTAGTGCACAC
-TTTAAACCTGACGGCCAAATTACATGAAAGAAAATTCAGAACTCAAATAGTTACTATTTTTAAAAACCCTAAAATGAAAA
-AGTCTCAGTTCTTTTGCCTATCTTTTTTTTTTTCCCTGCCTACTTTGAATCTGCTGATTTGTCTACTGGTGTTGAGATAA
-GACTTACTGTCTGTGGTGTTACCAATTCAAGGTTACTTGGCTGAAGAAAAACAAAAGAATGAAACAATTTTTTATTTTTT
-TCTCTTTTTGAGACAAGGTCTTACTCTAAGGTCTTACTCTGTTCCCCAGACTGGAGTGCAGTAGTGGGATCATAGATCAC
-TGTTATCTCAACCTCCCAGGCTCAAGCAATCCTCCTGCCTCATCCTCTCTAGTAGCTGGGACAATAGGCATGCACCACCA
-TGCCTGGCAATTTTTTATCTTATTCTTAGTAGAGATTGGATCTCACTCTGTTGCCCAGGCTGGTCTCAAACTCCTGAGCT
-CAAGTGATCCTCTTGCCTCAGCCTCTCAAAGTGCTGGGATACAGGCATGAACCACTGTGCCCAGACAAAAGAGTTCTTTT
-ATAAATGCAAATAATTTAAAAAGTACTGATAAAATAAAAATAGAAATGTCTTCAGAATTGTCAGCATACATTTTTGACTG
-TGTTTTATATTTACATTTGCTAGATATTTTAAGGTGCTAGGGTTTGGCATGAAGGTTATAAAGCTATAAACACAGGAAAA
-AAAGAATATTTGTTTATGTGATTTTTTAAATACATAAGACCAATTTAATACGGTTTGTTGAACAAAAATAATGGAATTTT
-CTGAGTTATTGGTAAAATACCCTTGTATTTAACTTTGAAATCCTCACTTATGTGAACACCTGATATTCACAGGCTATAAC
-ATGGTTAACAAGAAAATAACCTAGAAATGACTAGCTTTGTCTAATACCTCAGTTCTCACAAATACTCTAGATAAACTGTC
-AAAAATAAGTAAATGTAAATGGATAAATGTCTATACAAGACATTTTAATGTATTTTTGAAATTTTTTTGAGCCAATGTCT
-CTGCCTGTCACCCAGGCTGAAGTGCAGTGGCATGATCACAGCTCATTGCAACCTTGACCTCCTGCACTCAAGGGATCCTC
-CCACCTCAACCTCCCAAGAAGTTGTTAATTACAGGCATGCAACACCATGGTCAGCTAACTTTTATTTTTTTTGTAGAGTC
-AGCATCTCGCTATTTGCTCAGGCTGGTCTCACGATACTCCTGCCTTGGCCTCCTAAAGTGTTGGGATTACAGGTGTGAGC
-CACCATGCCCAGCCTATTTTTGAAATTTTAGTTATGTTAAATTAAATAATAGATACTCATTAAATATCTGGGTTATTTCC
-AATTTAAAACTTATGTTTTAGCCCAGGCACTATGGCTCATGCCTGTAATCCCAACACTTTGGAAGGCCAAGGCGGGTGGC
-TCACCCGAGGTCAGGAGCTCAAGACCAGCCTGATCAACATGGTGAAACCCCATCTCTACTAAAAAATACAAAAAATTAGC
-CAGGTGTGGTGGTGGGTTCCTGTAATCCCAGCTACTCGAGAGGCTGAGGCAGGAGAATTGCTTGAACCTGGGGGACGGAG
-GTTGCAGTGAGCTGAGATCACACCATTGCACTCCAGCCTGGGCAACAAGAGCGAAAATCCACCTTAAAAAATATGTTTTA
-GGAACACATAATTCTAAATTATGAAATCATTCTCATATGTAAGATACTGCTATATGACAATTCAAGATTTCTTTCTTCCT
-AAGTTTTTTATTAAAATAAGGGTTACTAAGTGTTAATATCTTGGTAGATATATGTGATTAAGACTACTAGATACAAGAGA
-AACAATTCTGTATGCAAAATCTATACGGGTTTTTGTTTCAGAGAAAGTAAATTCGCTTAGAGATTTTTAAGGATTATTTT
-AAATTGAAGGAATAAAAAAGATAGATAAAACTAAATGTGTATAAAAAGTTGGGAAAGATGGAAAAAATTATACAAGCTTA
-TTAAAAGTTTATGTAAATCTTACCTCGAGGTCAAAACTGATTGAGATCAGATAGATTGTTTATAAGGTTTATTTAAATTA
-GCTGTAATATTAAAAACATAGTGATAAAAAACAAAAAAATTTGGTTAAAACAACAAGGTTTTCTTAATGCATTTATTTGC
-TCATAATAAGAGGTAATAAATATTGACTTTTAATCCTGATATCTGTTACTATAAAATCTTTTCAGATTTGTATATCAGAA
-GTTCAACGTTTCCTGTACTTTCATGTTACACATGACTCACAGATCACATCATTGTCTTCTGTTTCTTCTTGAGAAGGAAT
-AAAAGGCTTGGGTTTCCTGCTTGGCTGGGATGATAACTCCTTCAGCTTTTTCATCAGGTCTAATTTTGTACTCTTGGCTT
-TTAAATATGTCTTAATTACTTCATGTAACCAGGATACAGCAGGAAACTTCCATGCTATCATTGTGAGCTATGGATCCCCA
-CTGCTCTATGCTCTGGTTTTCCTGTTTACATTCCTCTGTAATATTATGCTCACTCATGACCCTGGACACACTCTTTCTAT
-GTCTAATTAAATTCAAGTCTCCGTGTCATCGGTTTGACTTCCAAGTGATTTAAATTAGCTTCCCATAAGAAGACACAGTT
-ATGCCACAGGAGCTTTTACCCTTTAAATGACTGGCCTGTAATAAAGATTTTAGGTTTTATCAAGATAATCCATGTGTTGC
-CTTTATTGTTTTTTTAATTACTTGGGAAAACTGAGGGTTTTCAGTTTTCACATCCATGTAACCTTCTATGTTGCTTTTGA
-TGTCTTTTGGTTGTCATGTTAATTAAATGAATGTTATTTAAAAATGACATGTGGCTGTGTGCAGCGGCTCTTGTCTGTAA
-TTCCAGCCCTTTGGGAGGCCAAGGTGGGTGGATCACTTGAGCCCAGGAGTTCAAGTCCAGCCTGGGCAAAATGGCAAAAC
-CCCATATCTACTAAAAATACAAAAGCTAGCTAGGTGTGGTAGCAAGTGCTCATAGTCCTGGCTACTTGGGAGACTAAGGT
-GGAGGATCACCTGAGCCTGGGAGGTTGAGGCTGCAGTGAGCCATGATTTCACCACTGCACTCCAGCCTGGGCAACAGGGT
-GAGACCCTGTCTCAAAAAAATAATAAAATAAAAAACAATAAACTACCATTCCGTTTTGGTCAAATGTTTTCAATTTTTTG
-ACATCTTTGCTAAAACTTAGTTGATAACATTGTATGGGAAGCATTGCCAAAAGATAAGTAACACTAAATCTTCTTTTTTT
-TTTTCTCTGAGACAGAATCTTGCTTTGTCACCCAGGCTGGAGTGTTGTAGCATGATCTAGTTTCACTGCAAATTCTGCCC
-CAAGGTTCAAGCAATTCTTCTGCCTCAACCTCCCAAGTAGCTGGGACTACAGACAAGTGCCACCATACCCGGCTAATTTT
-GTATTTTTAGTAGAGACAAGATTTCTCCATGTTGGCCAGGCAGGTGTCGAACTCCTGACCTCTGATGATCTGTCCAACTT
-GGCCTCCCAAAGTGTTGGGATTACAGGCATGAGCCACTGTGCCCAGCTTAAATCTTCTTTTGGTTACATTTATAGGTATG
-TTATTAATATAAATATTTTAAAAGTTATATAAATTATAAAAATCTAATAGGGTTTCAGTCATAATTTTGATGATGTTAAA
-TATTTTCTAAAGTTGTATGTGTATAGATATATTATTAATATAAATATTCTAAAGATTATATAAAATTTCTGGAAGTCTGA
-TGGATCTGATGTGTTGCCATCAGTCATGATTCTGGCTGTTATCTTAAAATGCTACATATAATACAAATAACTAAATTTTC
-TCGAGATTTGAGAACTTCCACTGGATTTTAACCAACGGCTATTCTAAGTTTTTGTCATCCACGGTGATTGATTAAAGTTC
-TTCTCTAAAACCCTTTACAGGCCGGGCACGGTGCTGGAGGCCATGCAGGGCACGGTGCTGGGCATGGTGCAGGGCATGGA
-GGCTCATGCGTGTAAATATCCCAGCACTTTGCAAGGCTGAGGTGGGTGAATTGCTTAAACTAAGAAGTTTGAAAGCAGCC
-TAGGCAATATGGTAAAATCCCATCTCTACAAAAATACAAAAATTAGCCAGGCATGATGGTGCATGCCTATGGTCCCAGCT
-ACTTCGGAGGGTGAGGTAGGAGGATGGCTTGAGTTTGGGAGGGAGAGATTGCAGTGAACCAAGATCATGCCACTGCACTC
-CATCCTGAGTGATAGAGCCAGACCGTGTCTCAAAAAAAAAGCCTTTACAATCAGCTATCATCTAAATTACTTTTAATGGA
-AAGGATTCTGACAAGTTCTCTTAAATATGGTTTCAGATAACTTTGGGGATCAAACCATTGGACTAGGAAAATCTTCCAGG
-ACTCTAAAAAGCTGAATGAGAATTTCTAATTGAAATCAAGCAAAACACAAAAAACTGAATGAGAATTGCTATTTGAAATC
-AAGCAGAACAAGATTTAGTTACATGGGAGTGAACTTATAAAAGAAGGAAAAGATTTTATCCATGGCCCTCCCATTAGAAA
-CATTGTTGATCCTCTTTATGTTTTGTTTTCCAAAGTCAATAATTTTTTTTCTTTTCAGCTATTTTTAATTTACAATACAT
-TGGATAAACTACATTGTGAACAAAAATTTGAGCCATTTATCTGTCTCTCTAGCTGATTTCTCCAGAATTCAGAAGCCATT
-CGTGAGCATTCTTAAATTATGGCAATATAATTATTTGCATAATTTCAATAAGAATCTGTTTTTGGTAACAAGATTCAATT
-GGAGACACTGTTTGTTTTATCAAGGCTTTAACTCGAATGGCAGATACAACCAGACCACTTTAAGGAATTGAGGTTGACTT
-TATAGCACCAATACAAAGCCCCTTAGAATGACTGGCTTGATGTCCTGTATACAAAGGTCCTTTACAAAGTTGCTATTCTT
-GTGGTAAGAAATAAAGAATGTCACTTTCTGATGGGCCAGGAACCTCAAGATATTTGGGGACCTTGAGAAGAGAAGACTAC
-ACCCATTCATTAAAGTATTACAGGAGAGCTGGCAAGATGTCTGAATAGGAACAGCTCCGGCCTGCAGCACCCAGTGAGAT
-CAACACAGAAGTCAGGTGGTTCATGCATTTCCAACTGAGCCTCCACTGGTGATACCCAGGAAAACAGGGTCTGGAGTGGA
-CCTCCAGCAAACTCGAGCAAACCTGCAGCAGAGGGACCTGACTGTTAGAAGGAAAACTAACAAACAGAAAGGAATAGTAT
-CGACATCACCAACATCAAAGACCAAAGGTAAATAAATCCACAAAGATGGGGAGAAACCAGTGCAAAAATGCTGAAAACTC
-CAAAAGTCAGAATGCCTCTTCTCCTCCAGAAGATCACAACTCCCCGCCAGCAAGGGAACAAAACTGGACAGACAGTGAGT
-TTGATGAATTGACAGAAGTAGGCTTCAGAAGGCGGGTAATAACAAACTCCTCCGAGCTAAAGGAGCATGTTCTAACCCAA
-TGCAAGGAAGCTAAGAGCCTGAAAAATAAAGGTTAGATGAATTGTTAACTAGAATAACCAGTTTAGAGAAGAATATAAAT
-GACCTGATGGAGCTGAAAAACCCAGCACAAGAACTTCATGAAGCATACACAAGTATCAATAGCTGAATCAATCAATCAGG
-AGAAAGGATATCAGAGATTGAAGATCAACTCAATGAAATAAAGCCAGAAGACAAGATTAGAGAAAAAAGAGTGAAAAGAA
-ATGAACAAAGCCTCCAAGAAATAGAGGACTATGTTAAAAGTCTGAATCTACGTTTGATTGGTGTACCTGAAAGTGACAGA
-AAGAATGGAACCAAGTTGGAAAAAACTCTTAAGGATATTATTCAGGAGAACTTCCCTAACCTAGCAAGACAGGCCAACAT
-TCAAATTCAGGAAATACAGAGAACACCACTAAGATACTCCTCAAGAAGAGCAACCCCAAGACACAAAATCATCAGATTCA
-CCAAGGTTGAAATGAAGGAAAAAATATTAAGGGCAGCCAGAGAGAAAGGTTGAGTTACCAACAAAGGGAAGCCCATCAGA
-CTAACAGTGGATCTCTTGGCAGATAGCCTACAAGCCAGAAGAGAGTGGGGGCCAATATACGACATTCCTAAAGAAAAGAA
-TTTTCAAACCAGAATTTCATATCCAGCCAAACTAAGCTTCATAATTGAAGGAGAAATAAAATCCTTTACAAGCAAATGCT
-GAGAGATATTGTCACCACCAGGACTGCCTTACAAGAGTTCCTGAAGGAAGCACTAAACACGGAAAGGAACAACTGGTAAC
-AGCCACTGCAAAAACATACCAAATTATAAAGACCATTGACACAATGAAAAAACTGCATCAACTAATGAGCAAAATAACCA
-GCTAGTATCATAATGACAGGATCAAATTCACACATAACAATATTAACCTTAAATGTAAATGAGCTAAATGTCCCCAGTTG
-AAAGACACAGTCTGGCAAATTGGATAAAGAATCAAGACCCATCAATGTGTTGTATTCAGGAGACCCATCTCATACACATA
-GGCTCAAAATAAAGGGATGAAGAAACATTTACCAAGCAAGTGGAAAGCAACAAAAGGCAGGGGTTGCAATCCTAGTTTCT
-GATAAAACAGATCTTAAGCCAACAAAGATAAAAAGAGACAAAGAAGGGCATTACATAATGGTAAAGGGATCAATGCAACA
-AGAAGAGCTAACTATCCTAGACATATATGCACCCAATACAGGAGCACTCAGATTCATAAAGCAAGTTCTTAAAGACCTAC
-AAAGAGACTTAGGCTCCCACACAATAATAGTGGGAGACTTTAACACTCCACTGTCAATATTAGATAGATGAGACAGAAAA
-TTAACAAGAATATCCAGGACTTGAACTCAGCTCTGGACCAAGTGGACCTAAAAGATATCTACAGAACTCTCCACCCCAAA
-TCAACAGAATGTACCTTCTTCTCAGCACCGCATTGTACTTATTCTAAAATTGACCACATAATTGGAAGTAAAACACTCCT
-CAGGAAATGCAAAAGAATGGAAATCATAACAAACAGTCTCTCAGACCACAATGCATTCAAATTAGTATGCAGGATTAAGA
-AACTCACTCAAAACCTCACAACTACATGGAAACTGGGCAACCTGCTCCTGAATGACTACTGGGTAAATAACGAAATGAAG
-GCAGAAATAAAGATGTTCTTCAAAACCAATGAGAACAAAGACACAACGTACCAGAATCTCTGGGACACATTTAAAGCAGT
-GTGTAGAGGGAAATTTATAGCACTAAATGCCCACAAGAGAAAGCAGGAAAGATCTAAAATTGACACCTTAACATCAAAAT
-TAAAAGAACTAGAGAAGAAAGAACAAACAAATTCAAAAGCTAGGAGATGACAAGACATAAATAAGATCAGAGCAGAATTG
-AATGAGATAGAGACATGAAAAACCCTTCAAAACATCAATGAATCCAGGAGCTGGTTTTTTGAAAAGATCAACAAAACAGA
-CCACTAGCCAGACTAATAAAGAAGAAAAGACAGAAGAATCAAATAGATGCAATAAAAAATGATTAAGGGGATATCACCAC
-TGATCCCACAGAAATACAAATTATCATCAGAGAATACTACAAAGACTAAACCAGGAAGAAGTCAAATTCCTGAATAGACC
-AATAACAAGTTCTGAAATTGAGGCATTAATCAATAGCCTACCAACCAAAAAAAGTCCAGGACCAGACGGATTCACAGCCA
-AATTCTACCAGAGGTACAAAGAGGAGCTGGTACCATTCCTTCTGAAACTATTCCAAACAATAGAAAAAGAGAATCCTCCC
-TAACTCATTTTATGAGGCCAACACAACAAAAAAAGGAAATTTTAGGCCAATATGCCTGATGAACATCAATGCAGAAATCC
-TGAATAAAATACTGGAAAACTGAATCCAGCAGCACATCAAAAAGCTTGTCCACCATGACCAAGTTGGCTTCATCCCTGGG
-ATGCAAGGCTAGTTCAACATGCAAATCAATAAATGTAATCCCTCACATAAACGGAATCAATGACAAAAACTACATGATTA
-TCTCAATAGATGCTGAAAAGGCCTTTGACAAAATTCAACAGCCCTTCATGCTAAAAATTCTCAATAAACTGGTATTGATG
-GAACATATCTCAAAATATTAAGTGCTATTTATGGCAAACCCACAGCCAATAACATACTGAATGTGCAAAAACTGGAAGCA
-TTCCCTTTGAAAATCAGCACAAGACAAGGATGCCCTCTCTCACTACTCCTATTCCACATAGTGTTGGAAGTTCTGGCCAG
-GGTAATCAGGCAAGAGAAAGAAATACAGGGTGTTCAATTAGGAAAAGAAGAAGTCAAATTGTCTCTGTTTGCAGATGACA
-TGATTATATATTTAGAAAACCCCATCGTCTCAGCCCAAAATCTCCTTAAGCTGATAAGCAACTTCAGCAAAGTTTCAGGA
-TACAAAATTAATGTGCAAAAATCACAAGCTTTCTTATACACCAATAACAGACAAACAGAGAGCCAAACTATGAGTGAACT
-CCCATTCTCCATTGTTACAACAAGAATGAAATACCTAGGAATACAACTTACAAGGATGTGAAGGACCTCTTCAAGGAGAA
-CTATAAACCACTCCTCAAGGAAACAAGAGAGGACACAAACAAATGGAAAAACATTCCATGCTCATCAATAGGAAGAATCA
-ATATCGTGAAAATGGCCATACTACCCAAAGTAATTTATAGATTCACTGCTATCCCCATTAAACTCTATTGACTTTCTCCA
-CAGAATTGGAAAAATATATTTTAAATTCCATATGGAATCAAAAAAGAGCCCGAATAGCCAAGACAATCCTAAGCAAAAAG
-AACAAAGCTTCAAGCATCATGCTACCTGACTTCAAACTATACTACAAGGCTATGATAAACAAAAGAGCATGGTACTGGTA
-CCAAAACAGATATATAGATCAAAGGAACAGAACCGAACCCTCAGAAATAACACCACATATCTACAACCATCTGATCTTTG
-ACAAACCTGAGAAAAACAAGCACTGAGGAAAGGATTCCCTATTTAATAAATGATGTTGGGAAAACTGGCTAGCCTTAGGC
-AGAAAGCTGAAACTGGATCCCTTCCTTACACCTTATATAAAAATTAACTCAAGATGAATTAAAGACTTAAACCTAATACC
-TAAAGCCGTAAAAACCCTAGAGGAAAACCTAGGCAATACCATTCAGGACATAGGCATGGGCAAAGACTTCATGACTAAAA
-CACCAAAAACAATGGCAACAAAAACCAAAATTGACAAATGGGACCTAATTAAACTAAAGAGTTTCTGGACAGCAAAAGAA
-ACTATGAGAGTGAAAGGGCAACCTACGAAATGGGAGAAAATTTTTGCAATCTATCCATCTGACAAAGACCTAATATCCAG
-AATCTACAAAGAACTTAAACAAATTTACAAGAAAGAACAATCCCATCAAAAAGTGGGCAAAGGATGTGAACAGACACTTC
-TTAAAAGAGGACAATTATGCAACCAAGAAACATATGAAAAAAAGCTCATCATCACTAGTCATTAGAGAAATGCAAATCAA
-AACCACAATGAGATGCCATCTCATGCCAGTTAGAATGGCAATCATTAAAAAGTCAGGAAACAAAAGATACTGGAGAGGAT
-GTGGAGAAATAGGATTGCTTTTACACTGTTGGTGGGAGTGTAAATTAGTTCAACCATTGTGGAAGACAGTGTGGCTATTC
-CTCAAGGATCTAGAACTAGAAATGCCATTTGGCCCAGCAATCCCATTACTGGGTATATACCCAAAGGATTATAAATCATT
-CTACCATAAAGACACATGCACACGTATGTTTATTGCAGGACTGTTCACAATAACAAAGACTTAGAACCAACCCAAATGCC
-CATCAATTATAGACTGGATAAAGAAAATGTGGCACATATACACCATGGAATACTATGCAGCCATAAAAAAGGATGAGTTC
-ATGTCCTTTGTAGGGACATGGATGAAGCTGGAAATCTTCATTCTCAGCAAACTAACACAAGAATAGAAAACAAAACACCA
-CATGTTCTCACTCATAAGTGGGAGTTGAACAACGAGAACACAAGCACACAGGGAGGGGAACATCACACACTGGGGCATGT
-TGGGGGTTGGGGGCGGGGGGAGGGATAGCATTAGGACAAATACCTAATATAGGTGATGGGTTGATGGGTGCAGCAAACCA
-CCACAGCACATGTATACCTATGTAACAAACCTCAGCATTCTGCACGTGTACCCCACAACTTAAAGTATAATAAAAACGTA
-GGTTAAAAAAAAGTATTACAGACACAGTATGATGCAAATCTTTGACTTGGCTAGCCTCAAGGCTTTTAAAAGTCTAAGAT
-TCCTTAGTAGAAAGTTCCAACAAAGCCAATTTTAAGAAGCCTATATGGTCAATAAATATTCTTGCTGCACTTTATGCAAA
-TAATCAGACCAGGTATGATAAGACTAAAACTTATTTTGCACAGAAATTTGTCCTACTATGGTTTGTCTTTGATAAAATGA
-TGGACTAGAGAGAGAAAATTCATGTTTCAAATGAAAACTGTGACATATGCTATTAGATTCCAGCCCTGATCATTCTTTTC
-CGAGTTTTTATTATTTGCCTATAATTTGGGCTGAATCCTGAATTATTTCCTGGCTCCAAGTGTTCCCTAGTGAACCCAGA
-TAAAATATATTTTTAAAAAACTTGTTTTATCCTGTCAGTAATGAGATGTATTTTTATAGGACTACTTAAACTAGCAATTA
-CAATTCGATTATTATGATTATAGAATCTCGGGATTTATCTTCCTTCTTGTCAAGGTCTTTACCTGATGTTTGTCTCATTA
-AAAAAAAAAAGAAATCAGACTGATTGCACTCTACTCAAGACTGAAGACATGTACTTTAACCTGTCTCTGTTACCAGTAAA
-CCAAAGCCTTAAATTTCAGAATCCGTCAGGGACCCTGTGTGGTCCCTGGATCAAGCACACATGGGCTTATGAATGTGTTG
-ACCGCTGGCATATGAGAGGTAATTGTCTATTAGGTTATGTGGCTCTTCCTCTTCCTATTTATAACTCCAATGTTTCTGAA
-CGCTGAAGTAGTTCATCGAAATTATTTTCCAGGATTAGACAAACCGTACCTGCAAACCAAGGAGATGAATTTTGGCCTAT
-GTTTGGCAGAAATCTCTTGCAATGGTGGGGAGTAACCTCTCATGAACGTATAATTAGAAATCTGTCAACCACTCTAGGTA
-ACTTAGCAAATGAACTAGCTGAAGCCATAGCTACCAAATAAAGATCTTCAGACTCTTTATTCAGGATAGTCATGGATGAC
-GGAATAACTTTAGGCTACATAGTGGTGAAACAGGGAGAAACTCATATGGCAGCTAGCTAACACTTCATGTTGTGTTTAGA
-TCCATACATCTTCTGAAGTTGAAACACGTGTAAAAAAATAAGACGATATGGGAATTAATTATGACAAATCCTAGGGAAGA
-GGCTGAAAGAGCTGTAACACAAACAGGGCTGAGACATGCCCCTTGCTCGCCACATTGTGGGCAAAGAGAAGGAAAGAAGA
-GCTATGGCCCTTTGGGGAGCCCAGACCTGGGAGCTCCCTGAGCCAGAGCTGTGATTCCTTCTTTGGGGCCTTTGGTTCCT
-GATATCTCCAAGCTTCTGGGTGCCACTGTGTTCCCAGTGTGCCAGCTGTGGAAGCTTCTTGAGGTGCCCGTGGTCCAGCC
-ACAGCCTTGTGGAGAGCTGGCGCCCGTGTTGGCACCTGGAGCTACCTGCTCCACTTCAGCAGCCAGCAAATCTGACTGCA
-CAGTGACCAGACCCCATGCTCACTCACACACCCCTTGCCACTCCATGCAGTCTCCCTTGGCAGGCATGGGATCCAACGTG
-GTAGCATGAGCAGAGCACAGCCTGCCAGGCTGAGTGTGCGGGGCCCAGCAAAACTCAGGCAAAGGTGCCACCAGTCATAG
-AGGTTTCTGTCCAGAAAAGTAACACCCCAAAGATCCCATAACACCGCTACTCTTCCCAGCCTCTGGAAACTCTCAGTCTA
-CTCTCTATCTTGATGAGTTCAATTGTTTTAATTTTTAGCTCCCACAAATGAGTGAGAACATGCGAAGTCTGTCTTTCTGT
-GCCTGGCTCATTGTACTTAACATAATTGTCCTCTAGTTCCATCCATGTTGTTGCAAATGACAGAATCTTATTCTTTTTCA
-TGGCCGAAGAGTACTCCATTGTGTATATGTACTACATTTTCTTTATCCCTTCATCTGTTGATGCACACTTAGGTTGCTTC
-CAAATCTTGGCTATTATGAATAGTGCTGAAATAAATATGGGAATGCAGATATCTCTTTGATATACTAATTTTCCCTCTCT
-TGGGTATATACCCAGCAGTGGGATTGCTGGATCATATGATAGTTCTATTTTTAATTTTTTGAGGGACCTCCATATTGTTC
-TCCATAGTGAATATATTAATTTACATTCCCACCAACAGAGTAAGAGTGTTCCCTTTTCCCCAAATTCTTGAAAGCATTTG
-TTATTGCCTGTCTTTTGCATAAAAGCCATTTTAATGGGGTAAGATGATATATTTTTGTTGTTTTGATTTCAATTTCTGTC
-ATGATAAATGATATTGAGCATCTTTTCATATACCTATTTGACATTTATATATGTTCTTTTTTGTTTTTGCTCATTTTTTG
-AGACAGGGTCTCACTCTGTCACCCAGGCTGGAGTGCAGTGGTATGATCATGGCTTAATGTAGTGTTGACTGCCAGGGTTC
-AAGCAATCCTCCCACCTCAGCCTCCTGAGTAGCTGGGACCACAGTCATGCATCACCATGCCCAGGTAGTTTTTAAAATTA
-TTTGCTATGTTGTTCAGGTTGGTCTTGAACTCCTGGGCTCAAGTGGCCCACCCGTCTTGGCTCCCCAAAGTTCTGGAATT
-ACATGTGTCAGCCACTGCGCCTGACCTGTGTGCCTTCTTTTGTGAACTGTCTGTTCAGATCTTTTGCCTATTTAAATAAT
-TGGATTGTTAGTTTTTTTCTTGTAGAGTTGTTTGAGCTCCTTATATATTCTGGTTATTAATCCCTTGTCAGTTATATAGT
-TTGCAAATATTTTCTTCCATTCTGTGGATTGTCTTTTCACTTTGTCCATTGTTTTCTTTACTGTGCAGAAACTTTTGAAC
-TTGATGTGATACCACTTGTTCATTTTTGCTTTGGTTGCCTGAGCTTTTGGAGTATTACTCAAGAAATCTGTGCCAAGACC
-AATTTCCTGGAGAGTTTCCCTAATGTTTTCTTTCAGTAGTTTCGTGTCTTTGATTTAAGTCTTTAACCCATTTGGATTTG
-ATTTTTGTATATAGTGCAAGAGAGGGTTCTAGTTTAACTATTCTGCCAATGACTTTGGGAGGCCAAGGTGGGCGGATCAT
-GGGGGCAGGAGATCGAGACCATCCTGGCTAACACGGTGAAACTCCGTCACTACTAAAAGTACAAAAAAAAAATTAGCCAG
-GCGTGGTGGTGGGCACCTGTACTCCCAGCTACTTGGGAGGCTGAGGAGGAGAATGGTGTGAACCCGGGAGGTGGAGCTTG
-CAGTGAGCCCAGATCGCGCCACTGCACTCCAGCCTGAGCAACAGAGCTAGACTCCATCTCAAAAAAAAAAAAAAATCTGC
-CAATGAATATCTAGTTTTCCCAGCACAATTTGTTGAAGAGACTGTCCTCTCCCCCATGTATATTCTTGGCACCTTCATTG
-AAAATGAGTTAATTGTAAATGTATGGATTTATTTCTGGGTTCTCTATTCTGTTCCATTGGTCTATGTGTCTGTTTTATGC
-CAGTACCATGGTGTTTTGTTTATAATTGCTCTGTACTATAATTTAAAGTCAGGTGATGTGATTCTTCCAGTTTTGTTCTT
-TTTGCTCAGGATGGCTTTTGGTATTCTGGGTCTTTTATGGTTTCATGTAAATTTTAGGATTTTTTTTCTATTTCTGTGAA
-GAAAGTTATTAGTATTTCAATAGGGATTGCATTGAATCTGTAGATTGCTTTGTGAAGTATGGGTATTTTAACAATATTTA
-CTCTTCCAATAAATGAACATGGACTATCTTTCCATTTTTTTTTTGGTGTCCTCTTTAATTTTTTTGCATCTATGTTTTAT
-AGTTTTCATTGTAGAGATCTTTCACTTCTTCTGTTATGTTTATTCCCAGTTATTTTATTTTATTTGTAGCTATTGTAAAT
-GGGATTACATTCTTGATTTTCTTCTTTAGATTGTTCATTTTTGTCATTTAGAAATGCTACTGACTTTTGTAGTTTGATTT
-TGTATGCTGTGACTCTGAATTTGTTGATCAGTTCTAATAGTTTTTTGGTGGAGTCCTTAGGTTTTTCCAAATATAAGAGC
-TAATCATCTGCAAACAAGAAACAGTAATAATTTTACTTCTTTCCAATTTGGATCCCTTTTATTGTTTTTCTCTTGTCTGA
-ATTGCTCTAGCTAGGACTTCCAGTACTATGTTGAGTAACAGTGTTGGAAGTGGACATTCTTGTCTTGTTCCAGATCTTAG
-AAGAAAGGCTTTCAGCTTTTCCCTGTCCAGGATGATACTGGCTGTGGGTCTGTTGCATATGGTTTTCATTGTGTTGTGGT
-ATGTTCCTTCTATATCTAGTTTTTTTTGAGGGTTTCTTTTTATCACAGGGATGTTGAATTTTATTAAATGCTTTTCAGCA
-TCAATTGAAATTATCATATGGTTTTTGTCCTTCATTCTGTTGATATGATGTGTCACATTGATTGATTTGCATACATTGAA
-CCATGTTGGCATCCTTGGGATAAATCCCACTTAGACATGATGAATGGTCTTTTTCATAGGATGAGTTTGGAAATACTACA
-GCCTTCTCTGTTTTTTTTGAATAGTTTGAGTAGGATTGATAGTAATTCTGCCTTCAATGTTTGGTAAAATTAATCAGTGA
-AGCCAGTGAAGCCATTGAATCCAGGCTTTTCTTTGCTAGGACATGTTTTATTAAGGCTTCAATTTCATTTATCCATTTCT
-TCTAGGTTTTTTTTTTTTTTGAGATGGAATCTTGCTCTCTCACCCAGACTGCAGCGTGGTACAATCTCAGCTCACTGCAA
-CCTCTGCCTCCCAGGTTCAAGTGATTTTCCTGCCTCAGCCTCTAGAGTAGCTGGAAGTACAGGTGCATGCCACCATGCCT
-GGCTAATTTTTGTATTTTTAGTAGAGATGGGGTTTCACCATGTTGACCAGGCTGGTCTTGAACTACTGACCTCAGGTGAT
-CACCTGCCTTGGCTTCCCAAAGTGTTGGGATTACAGGCATGAGCCACGGTGCCCAGCCATTTCTTCCAGGTTTTTCAATT
-TATTGGAATATAGTTGGTCATAATAGTTTCTAATGATTCTTTGAATTTCCACAGTATCAGTTATAGTGTCTCCTTTTTAA
-TCTCTGGTTTTATGTATTTGAATCTTCTCTCTTTTTTCTTAGTCTGGTTAAGTGTTTGTTGATTTTGTTGGTCTTTTAAA
-AATATTAACTTTTCATTTCATTGATATTTTATATTTTTAAATTTCAATTTCATTTATTTCTGCTCCGATCTTTGCTATGT
-TTCCTTCTACTAATTTTGGTTTTGGCTTGCTCTTGCTTTTCTAATTATTTAAGATGCATTATTAGGTTGTTTATTTGAAG
-CTTTTCTACTTTTTTTGATGTAGGTGCTTTTATCTATAAACTTACCTCTTAGTACTGTAGTACTGTTTTTACTGTATCCC
-ATAGGTTTTTTTTTTTTTTTTTTTTTTTTTTTTGTTTTTTTTTTTTTTTTGAGATGGAGTCTCGTTCTGTTGCCCAGGCT
-GGAGTGCAGTGACGCGATCTCGGCTGACTGCAAGCTCCGCCTCCCAGGTTCACACCATTCTCCCGCCTCAGCCTCCCGAG
-TAGCTGGGACTACAGGCGCCTGCCTTCACGCCCGGCTAATTTTTGTTTTTTGTATTTTTAGTAGAGACGGGGTTTCACCG
-AGTGCGCCCGGCCTGTACCCTAGGTTTTGGTTTGACTTTAAACTTTTTCTTTTCTCGAAAACTCAGTGTCATGGTACCGG
-CTTCTTGTGCTTTGGGCAGTGAGACCCTTTTACTTGATAACAGTGGTAGCTGGGACAAGTTGGCAATGTAAATAAATAAA
-CAACATCTAGATTGGAAAGGAAGAAGTACAGTTATCTTTATGTACAGATGACATGATCTTGCATTTAGAAAATCGTAAGA
-AATTTACTAAAAAGTATTAGGACTCATGAACAAACTTAAGAATGTAACACTATATAAGATTGGTATACAAAAATAACTGT
-ATTTCTTTACCAATAAATCAAGAATCCAAAAATGGAATTAAAAAAATAAATCTTGTTACAATAGAATTAAAGCTGGGGAA
-GCTTAAACTTGAACACTAAAAACTACAATACATGGTTAGCGTTGGAAACACCCAGATACCATCCCTGAGCCTTCTCTCCT
-TGGCTCTGAGGGCTTTACCTTCACGGGGTGAGGAAAGGGGTTGCATTCTTGGCTTTTACATTATATTAGGTGGGTTCGGG
-TTGAGGTATCTGCAATTCAAATGAGTATTACAATCTCTACTTTTATGGATAAGAGACTGAGGCCCACCAAGAGAGGGAAT
-GACAGTCCATATCCTGGAAGGCGAATTGTCAGGCACTGATTTCCGCTATTTAACCCCTGCCAATCATCATGTATTTAAAG
-GATCCCCAGATACCATACCAATAGGTGTTCAAGAGAGAGGCCTGTAATCTAGGCGTCTGAGAAAACAAGGCTAGAGATTC
-CAATATTGGAGACAACAGGGCTCTGGGAAGATTAAGGTTGAGTTTTCTGGATCTGCAGAATAGAGTCACTGAGGACCAAT
-TGCAAGATCAGAGGAGATGAAAGAACAAGTCAGGGCATGCTTAGGAAAAGAGAATACCAGGGATAGGTTTTAGGCAAGAG
-TCACACTGAGGAAGGGCAGGTTCTTGGCGTCGTTTAGGAAGAAATCCAAAAGCAAGCCTGTGGTGGAAGAAAGCAGCTCT
-ACGGAGGCATTGGCGGTGTTACAGCACTGCGTCCACTCCGGCAGGGCAGGGAGCCCTCCGTGGGTTGTGCTCCCAGAGCA
-GCAGCCTAGGGGTGGCTTGTAGTCATTTTTATAATTCACTTTTAATGGCATGCTAATTAAGGGGCGGGTTATTCAGAAAT
-AGCTAGAAATGGGCAGTAACTTCCATCTGTTTCCATGGCAAGGGGTGGGGACTTCTCGTGATGACATGGCATTGGCAAAC
-TGTCATGGCACTGGTGGGAGCGTCTTCTGGTGATCTGAGGCGTGAGGTGCTTTCGCTGCCTCTCCCAGGTTCCTGCGTGC
-CTCTTACCTGAAAGCCCATCACACCCCCATCTGCCCACCTACAAACGTCACTGCCCTTTCACCCCATCCCCGTTTCACAC
-GCACTCCCACATCAACCCTGAGCATTCAAGCCTGCGTTTCCCTGTTAGGAACCTCGGTGGTAGCCGGAGCTCTGAGAAAC
-CCCTAGGCAGAACTCCTTGCCTAGTTTGTGGCAGACATCAGGGAAGGAAAGGCAAATTTCAGGTCTTTCTCACAATAAAT
-AAATAAAGATAGGTAGATTTGATTGATGGATGGATGGATGAAACCTGGGAGTCTACGGGCAAATATTTATCAGACACTGG
-AAGTGTAAGTTGTCACAAAGATTATGGAGTGCACCTGTCTTATGACCCTGTTATTTTATCCTAGTATGTGCACTAGAGCA
-TATTTTCTAACAGTGTAAATTGAAGGCTCACAAATTAGTTTAGTGAGAGAAAAGATAACGGATTGGAAGAGAATTACCAT
-ATTCATTAGTTGTGTTTTAAAATTTTTAAAGTAAAATAGAGACATTATTTTTTTCATGCTTTCGAATGCATCTATAAAAA
-ATAGACTTGAGGGCTGGGCGCAGTGGCTCACGCTTGTAATCCCAGCACCTTGGGAGGCCGAGGAGGGCGGATAACGAGGT
-CAGGAGTTGGAGACCAGCCTGACTAACATGGTGAAAACCCGTCTCTACTAAAAATACAAAAATTAGGCGAGTGTGGTGGC
-ACGCGCCTGTAATCCCAGGTACTTAGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAAGCGGAGGTTGCAGTGAGCC
-GAGATCGCACCATTGCACTCCAGCCTGGGCGACAGAGTGAGACTCCTTCTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAACTTATTCATAGCATAGACCAATTGGCCTCTATTGAAATTTCTCCATTATTTTCACAATGTCCCAGGCTG
-TGAAACCAGGATTTAATAAAGAACCAGAATGCCACATCTGTGTCACCTGGGTAGGGACCAGTCCTGATACATTAACTCCG
-GGTCTCTGGGTAACTGGACTCAACTGCTGGGCAAAACAGAATGTCCGGCTTGGGTTCCTAACGGGGTACCGCAAAGCCTC
-ATGGGAATTGTAGTGTCACCTTCCAATGATGTTACCATCAAGGACCTTGGGAACCAGCTTTTCTCTCTGCGCTTGCGCCG
-CCCGGCCCACTCCGCCATTTTCCTCCGGAAGTGCGGCACCCAGAGGCCGTCCTGTAGCCGGGCCGGCTTGGGGCTTGGTT
-CTATGTCCCTGCGGGTCGGTGCAAGGGCGAAGAGGAACCCGTGGGCCTCAGGGGATCCCGGGGGGCCGGACCAGTGTTCC
-CTAGTTGTGGGAGCAGACGCGTGGGCACATTGCGGGCGGGCAGGGCCTGAAGTGCAGGTGCGGGCAGTGGACCCTGGCGG
-GGGCTGGGAGGACAGGCGTGGGGTCCCGGCAGTGAAACGGGTTCTAGAGGCGCAGGAGCAGGTAGGAGAGGCCGGTGGCC
-CTGGGCCCGGAGTCTGCAGGCCGCGCTCCTGTCCTGCCGCTGAGGGACCCGGTTACCAACCTGCATGACGCTCAGTTTGC
-CCATCTGTCCCAGTGGTAACACACAGTTCTCGGGAGACGTTCCCCATTCCCAGAGGAGTAGTGTGAAACGCGTGCGCCTC
-TAGTCTTAAACTTGGCGTTTGTATTAGTTGGGTTTCCTGGTGTCTCTTTAGCAAGTGAAGTTTCTGGTTCCCTCCTTCAC
-TGTGTGACCTGCCTAGTCCTCCTGGGTCGCATTTACAGAAGTTTATACGAGACCTAGTTTCCAGGGAAGAACTCACTGAT
-TCCGCGAGGGAGATGGCTTAATGGATGATGGTCGTCAGCCTTAAGGATACTTCAGTCTTAACTGTGTGTTACAAAGTTTG
-AAAGGGAGGGTTCCCTATGAATAAGAAGCACACTTGAAAGAACAGCCATCTGGTCTAACCTCTCACTGGTGCTTCAGAGG
-AGGAAAAAAGGTCACAGGTGAAGATCCCAGTTTTCCTTGCTCAGGAAATATTAATTCTACTCCCTAGAATGCACAAGATT
-TGCAAAGACTAGGTGATAGTAGAAGGTTTGGACGAACTTTCAGAAGGTTGAGGTGAATTCAGCTAAGAAGAACAGGCAAG
-GACTTAGGAAATATTCCTTATTTGAAGGGGCCTGAAAGTGTGGTCTGGGGTACAGCAGTGACCTGTCATACTTGAGAGGA
-TTAAAATACTCTCCAAACACAGTCCCATTCCTTCAACCTTAGCTCGTTTTTTCCAGCGTCTGAGATACATTAAACCTAGT
-CCATCCCCAAATTTAACATTAGATTGCGAAGTTCTATTGATTGTATTTGATTTGTAATTTAACATTTTCTCCCCCTACGT
-AATTTTGTTAAAAACACAGAAGTGAATTCTGTTCACTTAGGTGTAACAGTTAATACTTGCTGTTTAAGGAACTAATTAAA
-CCTTACTGGCTTATAAAAAACAACCACCATTTTATTTGTTCGAAGTTCTGTGGATCTGCACTTTGGTGTGGTGGGTTCAG
-CTGGGTAGTTAATATATTTGTGTTGCCTGGATCACAAAAAGGCCTCAGTCACCTGGTGCCTTGACTGAGCCTGGTTGGTT
-TAAGATAGTTTACTTCACAATCTGGTGGTTTGTGGTGACTCTTGGCTAGGCCCTGTGTCTCCAACAGGGTAGCTCCAGAC
-TTCTTCACAATTTCCCCCAAAAAGGAAAGAACCAATGGATATTTGCATCACATTTTCCATTTTCCATTCACTGGACAAGT
-CAGATGGAAAAGCCCAATTTATTGTCAGAGCATAATATGAGGGCTTGGATAGAAGGAAAGGTGTTATTGGGAAACATGAG
-TAGAATGGTGTACTGCAGGAAATACATATTATGTACATTTTAAAAAACGTAATTGTAGGCCAAAATTGCTGGTTTGCAAG
-ATGCACTTTCCATGATGTTCAGGTATAGAAAAGCAAGATGTACTGTCATAGGAACACTCATATGAAGTTATTTGTGGAAT
-CTACATATTAATAGGAAAATAGTTAATACAGCCCAGTATATTTCTATAACATTTATTTTAGTGAACTTATAATGTTTCTT
-TGTATTAAATTATTAGATTATATCTTTAGATAATATTGTTACTAAATTAGTAGGTAATATATATTTTTATTCAAAAATAA
-ATTGTGCATCTAATGTCTACCAATTAATGTACTTGTAGATGTATCTTATCTTAACTTGAGTCTTTGCTGCCCCTAATGAG
-GTGTGAAGGACTCTTCTCCCCTGGGGAAGTTTTTCTTTTTCAGGAGGGAGGAGGGCTTTCCCAGGTAATGTGTCTAGAGT
-GTTGGGCAGAAGAATCTGGGACCACACCACACCAGTTCTCTCCTTAATCCACGTCATTTGCCTTCTATCCCAGCTATGTT
-TCCAGTGTCCTCTGGGTGTTTCCAAGAGCAACAAGAAATGAATAAATCTCTGGTGAGTTGTTTATTTGTTCTTCACTTTG
-TTTTACACTGTATTTTCTGAGTTTATGGGTGTCTGTGAATTAAAAAGGAAAAGTAGAAATAAGTAAAACTCAGGTTGAAG
-GAAATATACATAAATAAGATAAAGCTGACCTGTAGATATAGGCAGGTTATAAGAGCTTAGAGTTGTCTAAGTTGAGTGCA
-AATTTTCCTCTGATCTTTCTGATGCCGAGACAAAAAAGGCAGTCATGTTTGTTATGTGATTGGAATGGAACCCGAGAAGA
-GAGCATGCTGTGTTCTTGTGGGACAGGAAAGCTTGCGTGCACCAAGTCTGAACCACCACCTTCATTGGTGACATAGATTA
-TGTGCTGGAACATATTTCACACCGGCCTGGCAGTAAACACTTGTAGTGTTGTGCAGTGGAAACGGTCATCTTCCGCTAAA
-GCACGGCGTGTTGTGCAGCGGAAATGGTCATCTGCTGCTAAAGCACAGCTTCCATCGTAATGTATGCTCCTTGCTCAAAG
-AGTGTGGTCCCAAACAGCCTTTGGGAGGTCCTCCTTGATTCATGGATGAAACCTGGAACATCTTGAGGACTGAGTTAACC
-ATAGGTCCTTAAATAACTCTCCACACGTTTTTCTTAGTTTATCTCTACATGCAGGGTGTGCAGCAGCCTGTTCAAAGTCA
-TATTTTCTGGGAAATATTTCCAGTGTTTATTTGCACTTTAGCCCACTCTGTGTAGCCTTATTTCTTCTAAACTCACCATT
-AACCTGAATAATAGTCAAATTTAGGGGGACTGTATTTGCCTTACTTGAGTCTTCTACCATAGTTGAAACTGTCGTACCCG
-AGTGAGTTAGAGAGAAATGCCACGCATTGAGACGAATTCAGGAGTCCTTTACTAGCCAGCGACTGAGACATGGCTAACGC
-ACGAAATTCTCTCGGCCCTGAAGAAGGGACTAGATTTTCTTTTATACTTTGGTTTAGAGAGGGGAGGGGGGATTCTAGCT
-GCAACAACTTTACAGAAGAAAAAAACAGACAAAAAACTTAGAAAAACAGATGGTTACAGGAAAACAAACTGTTCCTGGTG
-TAGGGTCTTTAAATTCACCACAAAGTGATAGGTGAGGGGGCTCTGGGCATTATCTGCCGGACAAATGTGGGGGCTTTATG
-ATACTATCTCTGAGTAAATTGCTGGGAACTGGGGACATCTCTTGTCTCAGCACTTTATCAGTTATTTGCACGCTTTGATA
-TGTTGAAAATCAGCTTGCACAAGTTAAAGTCCTTGAGGAAAGGGGGTGGGTAAGGAGTCCTTGATGTCTTGTTAATGAAG
-GAGCCAAATGGAGTTTGTCTGGTTTTCTCAGCTAAGGGAGAGTCTATTCATATTAAAAACAAGGTTAGCTGTCTAAGGAA
-GAGTCTATTCATGTTAATACAACGTTGGGTATTACAAAACGTCTGTTCATGATCTGGAAATTCTTCTGTGTTAGTTCTGT
-TAAAAGAAAAACTTTAAAGGAGTTTAATTTAGCAATAAACGATTCATGAATCGGACAGTCCCCAGAATCACAGCAGATTC
-ACAGAGACTCCAGTGCAGTCATGTGGTGGAAGAAGATTTATAGACAAAAGGGAAGTGGCATACCGAAATCGGAAGTGAGG
-TACAGAAACAACTCAGCGTTTGCCTTGTTTGAACACATTTTGAACATTTGGCAGTGCCTGAGTGGTTGAAGTTTGGCCAT
-TGGGATTGGCCAAGATGTAGCTGTTGTTCCAGGTGCATACTCTTAAGTTAGTTTTTCATTCTTGTATACCTATTAAGGTA
-GGTTGCAGTTCACCCACAAGGACTCATATATAGAATTATGGAGTCCTTCTCAGGCCATACTTAGTTCACTTTAACAATGC
-CTTCCCTTTGGTTATTTTCTCAATTTTGAGAGATTGGCCGAAACTTCAGTCACTGGTGTCACTATTACCATTGCAAATGT
-ACTTACTTGGTTTAGAAACCCACTGGGAAATAGACCAGTGAGATTTGAAAAGGTGGAACAAGGACTTGAGTAGAAGGTAT
-CTTCTTATGCTGGAACATCCTGTTTACAGGAGAAAAACAAAACCTGGTTTGTTCTAGGATTTATGTGTTTCCCTAAAGTC
-TTAGTTTGATTATGTTACATTTAGCATGAGTGACTCCATTTTGGTTTGGTTTGGTTTGGTCTGTTGGGACCTATTGCATG
-AGCTTAGTTCAAAACAATGGCCTCCCATAATTTTGCTTTAAAAATTCCTCCTTTTTGCTGGGTGTGGTGGCTCACACCTG
-TAATCCCAGCACTTTGGGAGCCTGAGGTGGGCAGATCACGAGGTCAGGAGATTGAGACCATCCTTGCTAATATGGTGAAA
-CCCCATCTCTACTAAAAATACAAAAAATTAGCCAAGTGTGGTGGCGGGTGCCTGTATTCCCAGCTACTCAGGAGGCTGAG
-GCAGGAGAATGGCCTGAACCCGGGAGGCAGAGCTTGCAGTGAGCCAAGATCATGCCACTGCACTCCACTCTGGGGGACAG
-ACCAAAACTCTGTCTTAGAAAAAAAAAATCCTCCTTTTCAGTCAAGTTCTCACTTAGTTGAGAGTGTGACCAAAATGTAG
-GGCCTTAGCATCACTCTTAGTTACCATTGTTTTGGGTTCCAGTTTTAGCATGTCATTCCCATTGTTTTGGGTTTCTGGTT
-TAGCACATCACTCCCATTGTTTTGGGTTCCGGTTTTAGCACGTCATTCCCATTGTTTTGGGTTTCTGGTTTAGCACGTCA
-CTCTCATTGTTTTGGGTTCCTGTTTTAGCACGTCACTCCCATTGTTTTGGGTTCTGGTTTAGCACGTCACTCACATTGTT
-TTGGGTTCTGGTTTTAGCACCTCACTCCCATTGTTTTGGGTTTCCAGGTTTTAGCACGTCACTCCCATTGTTTTGGGTTT
-CTGGTTTAGCACGTCACTCCCATTGTTTTGGGTGTCTGGTTTTATCACGTCACTCCCATCGTTTTGGGTTTCTGGTGTAG
-CAGGACACTCCCATTGTTTTGGGTTTCTGGTTTTAGCACTTCACTCCCATTGTTTTGGGTTTCTGGTTTAGCAGGACCCT
-CCCATTGTTTTGGGTTTCTGGTTTTAGCATGTCACTCCCATTGTTTTGGGTTCCGGTTTTAGCACGTCACTCCCATTGTT
-TTGGGTTCCGGTTTAGCACGTCATTCCCATTGTTTTGGGTTCAGGTTTTAGCACATCACTCCCATTGTTTTGGGTATCTG
-GTTTTAGCATGTCACTCCCATTGTTTTGTGTATCTGGTTTTAGCACCTCACTCCCATTGTTTTGGGTTTCCAGGTTTTAG
-CACGTCACTCCCATTGTTTTGGGTTTCTGGTTTATCATGTCACTCTCATTGTTTTGGGTTTCTGGTTTAGCAGGACGCTC
-CCATTGTTTTGGGTTTCTGGTTTTACACGTCACTCCCATTGTTTTGGGTTTCTGGTTTAGCAGGACACTCCCATTGTTTT
-GGGTTTCTGCTTTAGCGGGTCACTACCATTGTTTTGGGTTCCGGTTTAAGCACATCACTCCCATTGTTTTGGGTTCCGGT
-TTTAGCACATCACTCCCATTGTTTTGGATTTCTGGTTTAGCAGGTCACTCCCATTGTTTTTGGTTCTGGTTTAAGCACAT
-CACTCCCGTTGTTTAGGGTTCTGGTTTTAGCACCTCACTCCCATTGTTTGGGTTTCTGGTTTTGCAGGTCACTCCCATTG
-TTTTGGGTTCCAGTTTAAGCACATCACTCCCATTGTTTTCGTTTCCGGTTTTAGCACGTCACTCCCATTGTTTTGGGTTC
-CAGTTTTAGCAAGTCACTCCCATTGTTTTGGGTTTCTGGTTTAGCATGTCACTCCCATTGTTTTGGGTTTCCAGTTTAGC
-ATGTCACTCATAGGTTATGGTGGCCTTATGGTTGCACATTTTTTTTAATCTCTTGTCATTCCAGTTGAAGAGATACCATT
-TGACATTTTAGAGATGGCTGCATGCAAACTCTTGAAACATTTGAGTAAGTACAGTACACCAGGGAGACTCTTATGACTAT
-TGGGATAACACCAAGATGTGGTATATGCTCCTTACTCAGGGTCCCCATAAATCAAACCACCAAAAATCAAATAGATTAAA
-GAATGAATTAGATAAAGGGTTTACTTGCTTAACTAAGTGGTTTTTTTTTGTTAATTCCCTACAACCAAATCTTTATAATA
-CCCCATGTTTTCTCCACATGCTGTAAGTGTTAGCAGCTGCACAGATACTTAAGATAAGAGTCTCATGATAGTAGAGAAGT
-CTTGATCTGTGATCTTGGGAAAAGCTGTTCACATTAAGGATGCCATCTTCTTCTGGGGGGAACTGTCCGTGTTAGCTTTA
-CCTTAAGGGTTCCAATAGGCATATGGTTCTGAGTGTGGAGGGACCCTTCTGAGTTGTGAGACTATGAACCCAAAGTTTAA
-GGTTTTAAAGTTTTGTTGTCATGTGGATGGCGAGGGCAGTCCTTCTCTGATGTTCTCAGAAGATCCAGTCATCAGATTCT
-AGATTTTGAAGGGTTTGACTGTCCTCAGTGAACCATAAAAGGCTTTCTTTACCTGGTGAAAATACACTTCAGGGTAATAA
-TCTACTGTTTTAACATCAACTCTCTCGCATGGAAGAGCTTTTATACAATCAGAAAACATGCACTGAAAATGACAACTGAA
-TGAAATCCCTTTATAAAATGTTTAAATGGCCCATCAGATAACCAAATGTACCTAAAGTTTTGATTGTTTTCCTAGGAATA
-TAGGTTTCACAAACCAAACATTGGTTATAAACTATTTTAGCAGTTTAGAAATCACCACACCAATATATTTAATTTGGATC
-GTTTTCTCTTTCTGTGATGAGTTATGGAATGCAGAACTTTTAATAACAAAAGTTTTTAGGACTTAAGAAGGATAAGGTGG
-CCATCCTGGTTCTTTATAGGTCTGTGCTTAATTAACATCAGACTTACATCCTCTTGAATACCAGCTGTTTCTCCAAATTA
-GGTGCATGGCACTGGTAACTGATGAGTAGTTATAGGTAATTTGATTTAGACCATGGAGTTTATTTAAATTATATATCTAA
-ACAATTTCAATATTGGTGATTTAGCATGAAAATGTGGCATAATATTTCCTTGGTATACAATTTTTGTTTTACTTGGGTTA
-GCAGTTTTACAAACCAGTTGGTCTTTTTATTAAATTTTTGATATTTTTTTTTTTGAGACAGAGTCTCACTCTGTTACCTA
-GGTTGGAGTGCAGTGGCACAATCTTGGCTCACTGCAACCTCTGCCTCCTGGGCTCAAGCAATTCTCTTGCCACAGCCTCC
-CGAGTAGCTGGGATTACAGGCACATACCACCACACCCAGCTAATTTTTGTATTTTTAGTAGAGGTGGGGTTTCACCTTTG
-GCCAGGCTGGTCTCAAACTCCTGACCTCAAGTGATCCACCGGCCTTGGCCTCCTAAAGTGCTGGGATTGCCGACATGAGC
-CGCTGCACCCAGCCTAACTGTTGAGAATTCTTAGCCAGTCCAATTCTTGGGGTATCGGGGAACTTATGGGGAATTTTTAC
-CCATGATATTAAAGTTATTAGAAATCTGTGTTCACGAGTGTTTTTCAGGGTCATTTTCATTCTTTCATGAATCTTCTAAG
-AGACACCATACTCTAGAATTTTGCATGCTTGTGAAGTTTTTAGAAACTGCATCACTATTAAGCAATTAACTGTGAAATGA
-CTTTAGTTATAGTTAAAGACAATTGACAAGGAAATTTGGTTATTTCTGTGGTCTACAATAACTTAATAACCATAATTAGG
-GTGGATGTGGTGGCTCATGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGTGGAAGGATCATGAGGTCAGGAGATCGTGA
-CCATCCTGGCTAACACGGTGAAATCCATCTTTACTAAAAATACAAAAATTAGCCTGGCATGGTGGTGGGTGCCTGTAGTC
-CCAGCTACTCGGGAGGCTGAGGCAGGAGAATGGCATGAACCCGGGAGGCGGAAGTTGCAGTGAGCCGAGATTGCGCCACT
-GTACTCCAGCCTGGGTGACAGAGCAAGACTCCATCTCAGAAAAAAAAAAAATACAAGAATTTTAGAAATCCTACACAATT
-TTAGAATGGATTGATGACACACACTAAATATAACCTGAGGAAGGTTCCACATTATTTTTTATTTTGACAGTGCTACCCAT
-GTGACTTAACATGTTAAATAGTCCTGTTTACCTCTCTTTTGGGTGCTTCAGGGGTCTCTGTAGTATCCCAAAATTAGAGG
-TCAGAAAAGACAATTTTGAAGTTGAAATTTGATTTTGGGAAGCCTATTAAATATATTAAAGGTTTAAACACTTGATGTTA
-TGAAATAGAATTCCACGTCACCGTAAGTCATTCATTTACCAAAAATCATGACAAAAAATTTTTATTATTTTTTTATTTTT
-ATTTTTTATTATACTTTTAGTTTTAGGGTACATGTGCACATTGTGCAGGTTAGTTACATATGTATACATCTGCCATGCTG
-GTGTGCTGCACCCACTAACTCGTCATCTAGCATTAGGTATATCTCCCAATGCTATCCCTCCCCCCTCCCCCCACACCACA
-ACAGTCCCCAGAGTGTGATATTCCCCTTCCTGTGTCCATGTGATCTCATTGTTCAATTCCCACCTATGAGTGAGAATATG
-CAGTGTTTGGCTTTACGTTCTTGCAATAGTTTACTGAGAATGATGATTTCCAATTTCATCCATGTCCCTACAAAGGACAT
-GAACTCATCATTTTTTATGGCTGCATAGTATTCCATGGTGTATATGTGCCACATTTTCTTAATCCAGTCTATCATTGTTG
-GACATTTGGGTTGGTTCCAAGTCTTTGCTATTGTGAATAATGCCGCAATAAACCTACGTGTGCATGTGTCTTTATAGCAG
-CATGATTTATAGTCCATTGGGTATATACCCAGTAATGGGATGGCTGGGTCAAATGGCATTTCCAGTTCTAGATCCCTGAG
-GAATCGCCACACTGACTTCCACAATGATTGAACTAGTTTACAGTCCCACCAACAGTGTAAAAGTGTTCCTATTTCTCCAC
-GTCCTCTCCAGCACCTGTTGTTTTCTGACTTTTTAATGATTGCCATTCTAACTGGTGTGAGATGGTATCTCATTGTGGTT
-TTCATTTGCATTTCTCTGATGGCCAGTGATGATGAGCATTTTTTCATGTGTTTTTTGGCTGCATAAATGTCTTCTTTTGA
-GAAGTGTCTGTTCATGTCCTTCGCCCACTTTTTGATGGGATTGTTTGTTTTTTTCTTGTAAATTTGTTTGAGTTCATTGT
-AGATTCTGGATATTAGCCCTTTGTCAGATGAGTAGGTTGCGAAAATTTTCTGCCGTTTTGTAGGTTGCCTGTTCACTCTG
-ATGGTGGTTTCTTTTGCTGTGCAGAAGTTCTTTAGTTTAATAAGATCCCATTTGTCAATTTTGGCATTTGTTGCCATTGC
-TTTTGGTGTTTTAGACATGAAGTCCTTGCCCATGCCTATGTCCTGAATGGTAATGCCTAGGTTTTCTTCTAGGGTTTTTA
-TGGTTTTAGGTCTAACGTTTAAGTCTTTAATCCATCTTGAATTGATTTTTGTATAAGGTGTAAGGAAGGGATCCAGTTTC
-AGCTTTTTACATATGGCTAGCCAGTTTTCCCAGCACCATTTATTAAATAGGGAATCCTTTCCCCATTTCTTGTTTTTCTC
-AGGTTTGTCAAAGATCAGATAGTTGTAGATATGTGGCATTATTTCTGAGGGCTCTGTTCTGTTCCATTGATCTATATCTC
-TGTTTTGGTACCAGTACCATGCTGTTTTGGTTACTGTAGCCTTGTAGTATAATTTGAAATCAGGTAGTGTGATGCCTCCA
-GCTTTGTTCTTTTGGCTTAGGATTGACTTGGCGATGTGGGCTCTTTTTTGGTTCCATATGAACTTTAAAGTAGTTTTTTC
-CAATTCTGTGAAGAAAGTCATTGGTAGCTTGATGGGGATGGCATTGAATCTGTAAATTACCTTGGGCAGTATGGCCATTT
-TCAAGATATTGATTCTTCCTACCCATGGGCATGGAATGTTCTTCCATTTGTTTTTATCCTTTTTTATTTCCTTGAGCAGT
-GGTTTGTAGTTCTCCTTGAAGAGGTCCTTCACATCCCTTGTAAGTTGGATTCCTAGGTATTTTATTCTCTTTGAAGCAAT
-TGTGAATGGGAGTTCACTCATGATTTGGCTCTCTGTTTGTCTGTTGTTGGTGTATAAGAATGCTTGTGATTTTTGTACAT
-TGATTTTGTATCCTGAGACTTTGCTGAAGTTGCTTATCAGCTTAAGGAGATTTTGGGCTGAGACAATGAGGTTTTCTAGA
-TATACAATCATGTCGTCTGCAAACAGGGACAATTTGACTTCCTCTTTTCCTAATTGAATACCCTTTATTTCCTTCTCCTG
-CCTAATTGCCCTGGCCAGAACTTCCAACACTATGTTGAATAGGAGTGGTGAGAGAGGCCATCCCTGTCTTGTGCCAGTTT
-TCAAAGGGAATGCTTCCAGTTTTTGTCCATTCAGAATGATATTGGCTGTGGGTTTGTCATAGATAGCTCTTATTATTTTG
-AAATGCGTCCCATCAATACCTAATTTATTGAGAGTTTTTAGCATGAAGCATTGTTGAATTTTGTCAAAGGCCTTTTCTGA
-ATCTATTGAGATAATCATGTGGTTTTTGTTTTTGGCTCTGTTTATATGCTGGATTACATTTATTGATTTGTGTATATTGA
-ACCAGCCTTACATCCCAGGGATGAAGCCCACTTGATCAAGTTGCATAAGCTTTTTGATGTGTTAATGGATTCGGTTTGCC
-AGTATTTTATTGAGGATTTTTGCATCAATGTTCATCAAGGATATTGGTCTAAAATTCTCTTTTTTGGTTGTGTCTCTGCC
-TGGCTTTGGTGTCAGAATGATGCTGGCCTCATTAAATGAGTTAGGGAGGATTCCCTCTTTTTCTGTTGATTGGAATAGTT
-TCAGAAGGAATGGTACCAGTTCCTCCTTGTACCTCTGGTAGAATTCGGCTGTGAATCCATCTGGTCCTGGACTCTTTTTG
-GTTGGTAAGCTATTGATTATTGCCACAATTTTGGCTCCTGTTATTGGTCTATTCAGAGATTCAACTTCCTGGTTTAGTCT
-TCGGAGAGTGTATGTGTCGAGGAATTTATCCATTTCTTCTAGATTTTCTAGTTTATTTGCGTAGAGGTGTTTGTATTATT
-CTCTGATGGTAGTTAGTATTTTGCTGGGATTGGTGGTGATATCCGCATTATCATTTTTTATTGCGTCTATTTGATTCTTC
-TCTCTTTTTTTCTTTATTAGTCTTGCTAGAGGTCTATCAATTTTGCTGATCCTTTCAAAAAACCAGCTCCTGGATTCATT
-AATTTTTTGAAGGGATTTTGTGTCTCTATTTCCTTCAGTTCTGCTCTGATTTTAGTTATTTCTTGCCTTCTGCTAGCTTT
-TGAATGTGTTTGCTCTTGCTTTTCTAGTTCTTTCAATTGTGATGTTAGGGTGTCAATTTTGGATCTTTCCTGTTTTCCCT
-TGTGGGCATTTAGTGCTATAAATTTCCCTCTACACAGTGCTTTGAATGCGTCCCAGAGATTCTGGTATGTTGTGTCTTTG
-TTCTCATTGGTTTCAAAGAATATCTTTATTTCTGCCTTCATTTCCTTATGTACCCAGTAGTCATTCAGGAGCAGGTTGTT
-CAGTTTCCATGTAGTTGAGCAGTTTTGAGTGAGATTCTTAATCTTGAGTTCTAGTTTGATTGCACTGTCATCTGAGAGAT
-AGTTTCTTATAATTTCTGTTCTTTTACATTTGCTGAGGAGAACTTTACTTCCAAGTATGTGGTCAATTTTGGAATAGGTG
-TGGTGTGGTGCTGAAAACATGTATATTCTGTTGATTTGGGGTGGAAAGTTCTGGAGATGTCTGTTAGGTCCGCTTGGTGT
-AGAGCTGAGTTCAATTCCTGGGTATGCTTTTTGACTTCCTGTCTTGTTGATCTGTCTAATGTTGACAGTGGGGTGTTAAA
-GTCTCCCATTATTAATGTGTGGGAGTCTAAGTCTCTTTGTAGGTCACTCAGGACTTGCTTTATGAATCTGCATGCTCCTG
-TATTGGGTGCATATATATTTAGGATAGTTAGCTCTTCTTGTTGAATTGATCCCTTTACCATTATGTAATGGCCTTCTTTG
-TCTCTTTTGATCTTTCTTGGTTTAAAGTCTGTTTTATCAGAGACTAGGATTACAACCCCTGCCTTTTTTTGTTTTCCATT
-TGCTTGGTAGATCTTCCTCCATCCTTTTATTTTGAACCTATGTGTGTCTCTGCACGTGAGATGAGTTTCCTGAATACAGC
-ACACTGATGGTTCTTGACTCTTTATCCAATTTGCCAGTCTGTGTCTTTTAATTGGAGCATTTAGTCCATTTACATTTAAA
-GTTAATATTGTTATGTGTGAATTTGATCCTGTCATTATGATGTTAGCTGGTTATTTTGCTCGTTAGTTAATGCAGTTTCT
-TCCTAGTCTCGACGGTGTTTACATTTTGGCATGATTTTGCAGCGGCTGGTACCAGTTGATCCTTTCCATGTTTAGTGCTT
-CCTTCAGGAGCTCTTGTAAGGCAGGCCTGGTCGTGACAAAATCTCTCAGCATTTGCTTGTCTGTAAAGTATTTTATTTCT
-CCTTTGCTTATGAAGCTTAGCTTGGCTGGATATGAAATTCTGGGTTGAAAATTCTTTTCTTTAAGAATGTTGAATATTGG
-CCCCCACTCTCTTCTGGCTTGTAGGGTTTCTGCTGAGAGATCCGCTGTTAGTCTGATGGGCTTCCCTTTGAGGGTAGCCC
-GACCTTTCTCTCTGGCTGCCCTTAACATTTTTTCCTTCATTTCAACTTTGGTGAATCTGACAATTATGTGTCTTGGAGTT
-GCTCTTCTCGAGGAGTATCTTTGTGGCGTTCTCTGTATTTTCTGAATCTGAATGTTGGCCTGCCTTGCTAGATTGGGGAA
-GTTCTCCTGGATAATGTCCTGCAGTGTTTTCCAACTTGGTTCCATTCTCCCTATCACTTTCAGGTACACCAATCAGATGT
-AGATTTGGTCTTTTCACATAGTCCCATATTTCTTGGAGGCTTTGCTCATTTCTTTTTATTCTTTTTTCTCTAAACTTCCC
-TTCTCATTTCATTTCATTCATTTCATCTTCCATCGCTGATACCCTTTCTTCCAGTTGATCGCATCGGCTCCTGAGGCTTC
-TGCATTCTTCACGTAGTTCTCGAGCCTTCGTTTTCAGCTCCATCAGCTCCTTTAAGAAATTCTCTCTATTGGTTATTCTA
-GTTATACATTCTTCTAAATTTTTTTCAAAGTTTTCAACTTTGCCTTTGGTTTGAATGTCCTGCCATAGCTCAGAGTAATT
-TGATCATCTGAAGCCTTCTCTCAGCTCGTCAAAATCATTCTCCATCCAGCTTTGTTCCGTTGCTGGTGAGGAACTGCATT
-CCTTTGGAGGAGGAGAGGCGCTCTGCTTTTTAGAGTTTCCAGTTTTTCTGTTCTGTTTTTTCCCCATCTTTGTGGTTTTA
-TCTACTTTTGGTCTTTGATGATGGTGATGTACACATGGGTTCTTGGTGTGGATGTCCTTTCTGTTTTTTAGTTTTCCTTC
-TAACAGACAGTACCCTCAGTTTCAGGTCTGTTGGAGTTTTCTAGAGGCCCATTCCCGACCCTGTTTGCCTGGGTATCAGC
-AGTGGTGTCTGCAAAACCGTGGATTTTCATGATCCGTGAATGCTGCTGTCTGATCGTTCCTCTGGAAGTTTTGTCTCAGA
-GGAGTACCTGGTCGTGTGAGGTGTCAGTCTGCCCCTGCTAGGGGGCGCCTCCCAGTTAGGCTGCTCGGGGGTCAGGGGTC
-AGGGACCCACTTGAGGAGGCAGTCTGCCCATTCTCAGATCTCCAGCTGTGTGCTGGGAGAACCACTGCTCTCCTCAAAGC
-TGTCAGACAGGGACATTTAAGTCTGCAGAGGTTACTGCTGTCTTTTTGTTTGTCTGTGTCCTGCCCCCAGAGGTGGAGCC
-TGCAGAGGCAGGCAGGCCTCCTTGAGCTGTGGTGGGCTCCACCCAGTTCGAGCTTCCAGGCTGCTTTGTTTACCTAAGAG
-AGCCTGGGCAATGGCCGGTGCCCCTCCCCCAGCCTCGCTGCTGCCTTGCAGTTTGATCTCAGACTGCTGTGTTAGCAATC
-ATCGAGACTCCATGGGCATAGGACCTTCTGAGCCAGGTGCGGGATATAATCTCGTGGTGTGCCATTTCCTAAGCCCATCA
-GAAAAGCTCAGTATTAGGGTGGCAGTGGCCCGATTTTCCAGGTGCCATCTGTCACCCCTTTCCTTGACCAGGAAAGGGAA
-CTAACTTCCTGACCCCTTGCACTTCCCGAGTGAGGCAATGCCTTGCCCTGCTTTGGCTAGTGCACAGTGCACTTCACCCA
-CTGTCCTGCACCCACTGTCTGGCACTCCCTAGTGAGATGAACCCAGTACCTCAAATGGAAATGCAGAAATCACCCATCTT
-CTGCATCGCTCATGCTGGGAGCTGTAGACCGGAGCTGTTCCTATTCGGCCATCTTGGCTCCTCCTCCCATTATTTTTTAA
-TATTTTCTGAAAATCTTCTTTAAAGAGAGAAAGCCAAATGTCACCCACTTTTTCATAAAACCTTACAGGCAAATCTATTA
-TTCTTTTCTTTTTTGAGATGGATTTTCCCTCTTGTTGCCCAAGCTGGAGTGCAATGGTGCGATCTCGGTTTACTGCAACC
-CCCTGCCTCCCAGGTTCAAGTGATTCTCCGGCCCCAGCCTCCTGAGTAGCTGGGATTAGAGGCATGCCCCACCATGCCCA
-GCTAATTTTGTGTTTTTAGTAGAGACGGGGTTTTTCCTTGTTGGTCAGGCTGGCCTTGAACTCCTGACCTCATGTGATCC
-ACCTGCCTCGGCCTCCCCAAGTGTTGAGATTACAGCTGTGAGCCACTGCCCCGGGCCATTTTTTTTTAAAGATAGCGTCT
-TGCTCTGTCACCCTCCTCACCACATTATAGCTCTGGGGGCCAAGCTGCATCACAATGGAAATCATGGAGCCACAGGAAGA
-ATCCACTTAGCTTTGCAAGATGCTGCCCAAGGGGTTGCTTGGAGTAACCAAATTAACATTTTTCATTCTGCTCAGAGCAA
-AATATATGTGACAAAACATAGCCACGAGCCACTTTGCTTAGCACCCAGTGTCAAACTGGTAAGACTCAAACTTCCTCCCA
-GATAGGCCATGCCATCTCTAAATCTTTTTAGAAGCTTCTGCATGTTAATAGGCATCCCTAGATGAGACTAATTTGGGAGC
-CATCATTTTTAAATGCACTTCAGGGCATTATTCATTTGGAATGTTACACTATAAGTTATCTTTAGTAAGATTTTGCCATT
-TCTGTAAGACTTTGCTGCTTCCCAGGCCTAATGAATTAGCCAGAAAGAACTTAGTTTTCCAGAAATTAAGGATCCTATTT
-TTACCTAATATATTGGCTTTACTCTCAGGTTCCCTTGATTGACTTAGCCAATGATTTTTTTTCCTACCTAAGCGTGTGAG
-GAAAATGAAACAAAGGGGCAGAACACAAAAATCCCCGTGAATTTCCAAAAGCCAAATTTTACAACCCTCCAATATTATCA
-TTTACTACCACTTTCCTTCTGACCCATTCAGATGTAGGAGGCCTCTAACTGGAACTGGATTCAAGCCAGTTAATTACTGG
-ATCAAATCTGATCCTGGACCCGGTCCCGTTTCTGTCATAACTTCTAAAACATCCAGCCAGTCATGGCTGGATAGCAGTTT
-GGAACAGAAATTTGCTCAGAGAAACTCAGCTCAAAACACAAATTCATGGAGCTCTGAAATCCGAGAGAGAATTTACCACG
-ATCCCCAGATGCTCTGAGAGGTCAAAGGGCACAAGTGTTACAGAATCCTGAGGCGTCACTTTTCTGCCTGAAACCTCTGG
-CTGGTGGCGCCTTTACCTGTGTTTTGCTCGGGCCCACTGGGTTCGTTCTGTCCACTTGGCTCATGCTAGTGGTCTGGATC
-CCACACCTGCCAAGGGTGAGCTGGGTACAGAGCAGTGAAGGGTGTGTGAGCAAGCGAGCATGGGATCTGGCCACTGCACA
-CAGCCAAGCATGCCAGCTGCAGTGGGGTGGGCAGCTCCAGGCACCGCCACAGGTGCCAGCTCCCTGTGAGGCTGCAGCTG
-GACCAGGCTGACTGCAAACAGCTTCCACTGTGGGTATCAGGGAATGCAGCGGTGCCTGGAAGCTTCGAGATGCAGGAACT
-GCAGAGCCCCAAATAAGGTGTCACAGCCCTGGCTTGGGGAGCTCCTAGGTCTGGGCTCCCTGAAGGGCCACAGCTCTTCT
-CTCCTTCTCTCTTCTCTTCTTCTTGCCTGCAATTTGGCAAGCAAGGGGTGCGTTTCAGCCCTGTTTATGTTACACCTCTT
-TCAGCCCTGCTAGTTGGCAGGTCCCGAGTTCTTGTCCTGAGTCCAGGAAGAATGAGGTATGTGGGCAAGTAGAAGGTGAG
-CAAGGTGAAGAGGTGCTTTATTGAGCAACAGTACAGCTCAGAGGAGACGTGCAGTGGGTAGCTCCTTTCGGCAGGCAGGT
-CATCCCAATGTCTGTTCAGCTCTCAGCAGCTGAGAGAGATGCATGGTGGTTAGCTATGCCCACAGTGCCCAGGCTTTTCG
-AGCTGAGGAGTGCCTTCAAGCCAGTGCTGAGCCACTCTTAGCCCCACCTCAACGTCCCTCCTGTGCTCATCAGTTCCCAA
-AGTGTGGAGGGGGCCGAGGTGGCAGGGGGCTGGCATGTCAGCACTGCCCTGAGCTTGCACAAACTGGGCTGGGTTGCGAC
-TGTGCCTGGGTTCAACCTCAATTTGGATCCGAAGTTGGAGTGGGCTCTGGGAGCGGAGACATGCCAGGTGGTGGGAGCAG
-GTATGACTGGGCCTACGGGGGCAGGGGGGCTTGCTGGGCCTCTGAGAGTGCAAAGATGCCCGGGTTTGCTGTCATGGGTG
-GATGGCTGCAGCTGTGCCTGGGAGGGTGGGGCTCCTGCCTGCCAATTTAGAAGGGGTGGGTCTCTCACCTGTTCCTGGCT
-CCCACTAACTTTGAGGAGTTCACAGCCCCAGCCACTCCTCCCCACTGCAGCCAGTGTCTCCGTAGCAACTGCTCCACATG
-GGCCACTGCTGCCATCATAGAGCGGTCCTTGCAGGTGCCTTTCTTGTACCTCAGCACTCCTGGGGGTCATTAGAAGCCCT
-AGCAACACTGCTCACCACACTATAGCTCCAGAGGCCCTAGCAGTCCTGCTCCCACAGATCCCACTTCTGACACCATCTAT
-TAAAAGAAAATCTTCAGCTGAATTAAATTTAAAGGAACTTAATTGAGCAATGAATGATTCACGAATCAGGCAGCCCCCAG
-AATCACAGCAGATTCAGTGAGACTCCAGCACAGCTACATGGTGGAAGATTTATAGACAATAAAGGGAACGTGATGTACAG
-AAATCTGAAGTGAGGAGTGAGGTCCAGAAGCAACTGGGTCCGTTACAGTTCTCAGCAGTGAGGTCCAGAAACAACTGGAC
-TGGTTACAGTGCTCAGCATTTGCCTTATTTGAACACAGCTGAACACTCAGTAGTGTGTGAGTGGCAGAAGTTTGGCTGTT
-GGGATTGGCCAGGACTCAGCTATAGTTACAGGTGCATACTCCAAAGTTAGGTTATCAGTCTTTCTACCTATTAAGTTAGG
-TTGCAGTTTGTCCACAGGGACTCAAATCTAGAAGTACAGAGTCCTTCCCAGGCCATATTTAGTTCACTGTAACAGTTCCT
-ATTATGACCTCACTGACAGTTCTTTTTCTCTGAATTTTCCTTTCTTCTCAACAGCTTGTCCAAATGTTCCATTGGTCCCT
-GTTCATCCCGCCCTGCAGCTCTCCTTGACTGATTCTGCCCTTTGTGGTTTGCAGTCCTGTTTCTCTACAGCTTGGACCCC
-TTCAATCTTTCCATCATAGGTTTAACTCTCTGTTGAATTCTTATTTGTAGCTACGCAAATGTTACCTTAAGCTAAAAAAA
-TTCAAAGTGAAAGCCACATCCTCCTCTCTTCCCTTATGTGTATGGTATTACTACCATGCAGCCAGTGACCCAAAATGGGA
-TTTTTTCTGGGCTTTTCTTGCTTAGATTCAGGCTCATCTGGTGTCAAGCCTTGTTACTTTTGTTTCCTTGTTCTTTTATT
-TTTAATTTTTTTTCTTTTGAGACAGAGTTTCACTCTTGTTGCCCAGGCTAGAGTGCAGTGGTGTGATCCCGGCTCACTGC
-AGCCTCCACCTCCCGGGTTCAAGCAATTCTCCTGCCTCAGCTCCTGAGTAGCTGGTATTACAGGCATTTGCCACCACGCC
-TGGCTAATTTTGTATTTTTAGTAGAGATGGGGTTTCTCTGTTTTGATCAGGGTGGTCTCGAGCTCCCGACCTCAGGTGAT
-CTGCCCACCTCGGCCTCCCAAAGTGCTGGGATTACAGGCCTGAGCCACCGTGCCTGGCCTGCTTGTTGTTTTCATCTCAT
-CCTGATTTCTGAATACAGGAGAGGAGCTGAGTTGGTGTTCACTAACAAGCACAGAAGCTTTGTTACATTTACAGTGTCAT
-TCTTGGCAAAACCTGAATGGTATGTTTGTGGGGTGATGAGGTTCAGTCCCCTGTGACCTGTGCATCTGGCCAACACTGTG
-GTGACATCCTTAGGAATCCATGGGGAGAGACAAAGCATTCAGGAGTTAGTGGGTCACGTTTGACAAGGGCCAATAAAGAA
-ATATGCAAAGACAAAAAACAAGAAGAACATTATCATATTTTATACCTTTTGTTTATATAAATTTATGTCAATGATTCTAG
-CTTATGTTAATATACAATGTATACAATATGCTAACATATACAATATATGTTTATAGTTTAAACATTTCTGTCATGTTTTC
-AGATTCTTTAAAGATTACATTACACTTCCTATTTCAGATAGCTGTTTAAAATGAGTAAGGAAAAACGGATGTGTGCATCA
-GTTCTAACTGTTTATGGACTAAAACTAGTTGATTTCTTGGTTAAGAACAAAAAGTGACAACCTAATTAACTGAAAATTTT
-AAGTAGGCAATTATGGTTTTAGCTTTAATGTAAAATATTAACTATGCTCCATTCTTGCATTTTTAACCTAATACTCAATA
-TAAATCGCCACATGCCATGTTTCAGATCAAGGTTCTACTTGTGATCTCTCATGAGTTTTTCAAGGTTTTAATTATCTGAG
-ATGTAACAATGTACCCATAACCTTACTGGCTTAAACCAGGAATTTATTCTTTTTACATGTCACAATTTTCTGGGTCAAGA
-CACTGGACAGAGCGGTGTGGGTTGGTTGCTTCATGATGTCCCTGGTCTCATCTGGAAGGACTCTAGTGGCTGGAGATGTG
-AAGCAGGCACCCAGAAGGACTCTAGTGGCTGGGGACATGGAGCAGGCACCCAGCCCTCTCTTTGTGGCCAGCACGGACTT
-CCTTCCAGTCTGGTAGCATCAGGTAGTCAGGTTTGTCTGGCTTCTCCCAGGGTGTGTGTCCAAGAGGCCCAGGCAGAAGC
-TGTAAGGTCTCTCATGATCATCCCTCAGAAGTCCCAGAGCATCTCTCCTGCCACACTGTCCAGTTGTACTCATCACTGAG
-ACCAGCCATGATTCAAGGGGGAAAGGTGATTAGATTCCACCTCTTGATGAGAAGCATAGTAGGAACCTGCAGCAGTCTTT
-AATAAACCACAGCTTGTCCTCTGGCCACAAACTATTAACGTTTCTCCCACATGCAAATTATGCTTTGCCCCTCTCAAGAG
-CCCCAGAATGGTTTTCCTTATGGCACTGGCTAGTAGCCCAACTGAATCCTGAATCAGGTTGTGGTGGCTTGTCATCTGCA
-CCCACACACACTCAGCTGCAGTGAGGACTGAATCAGGTTGTGGTGGCCTGTCATCTGACCCCCCACACACAGCCACAGTG
-GGGACTGAATCAGGTTGTTGTGAGCTATCATCTGAGCCCACAAACTTAGCCGCAGTGAGGGGACTGCTGTGAAAACAGTC
-GACATTTCCCTTTAGAAGCTTTGGTGGGAGGCAAGAGGGAAGTGCTGCCCTGCAGGCCCCGTCTAACAGTTGGTCATTCC
-CATGGGGCGCCTGTTACAGTTCTGTGATTAGTGCCCAGTCCTGGTCCCTGAAAACGGCGCCCAGTCCTGGTCCCTGAGAA
-TGGTGTTTGTGTCCTTTTACTCCTCCCTCTGGGCTTTTGTCATTCTCCATGTTCTTTTTCCTTCAGTGCCTGGGTTGCCG
-TTGACCAGCTTTCCCTGCCTTTTTCTTATGGTCAATAGGGTATTCAATGGCTTCTTTTTCATTTTTTTTCCTTTTCTTTT
-CTTTTCTTTTTTTTTACTTTGGCCTTTTGAGACAAGAAATTATTTCTTTATATTTTCTCTAAATTCTGTTTGAAAACTGA
-ACCTTCTTCTTTAGATCATGTCCCTCTCCTGTCATATTTATTCAGTGACAGTTAGGGGAGGCTGGTAGCACTTTCCATGT
-TCTTCCCAGATGTCTCCTTAGGCAGATCCCTGAGATGGTGCAGTGCCCTTTCAGTTTCCATGTTGTGGCCATAGTTTTCC
-CACAGTCCCTCAGCAAGTAACTCTCAGACCTTTTCTCCAGTTTCCAATGACATTTTCTCACCGTCCTTCAGGCCCTGACC
-AAGAGTCTTGATGCCCTTCCAGGTTGCATGAATGGTCTCCTTGAGGCCCAGTTACAGGTCAGCCTCACAGTCGTGTCACA
-TATTGTAGCTTCTGATTACCACAGCAGCTCATTTCCAGCTGCCATATTCTGTTCCAGTTATCTATTCTGAAGTAAAACAA
-CTCATTATTACTTGTTTTTTGGCTTAGAGAGTCTTGGTGGCCAGCTCATCTCACACACAGTTGCAGCCAAGCTGGATTGT
-GTGAAAGCACAGTGGGGTGGTGTGCAGGGTGGCTCACTAGTGGTTGGGAGTGGATGTTGCTGGAGGCTCACTAGTTGTTG
-GGAGTCGGTGTTGCTGGAGGCTCAGTGGGGGATGTCAATGCGTGTAGCTAGTCATGGACTGGCCTTGTGGTTTCCATCAT
-GAGGTCTCAGGGGAGTGGGATTTCCTGCCTGGTGACTGGCTTTCTCCTGGGTAAGTGTTCTGTTTTCTCAGCCTGGCTTC
-TGAAGTCCCCAAATACCAGCTTTGTCACCTTCTGTTGGCCAAATAAGTCAGTAGTCTGGTCAAGGTTTAAGGGGAATTGG
-TTCTCACAGAGAGAGGAGCAGGAAAGAATTTGTCACCTTTAGTCTACCAGAAATGAGATTTTTATAACAAGTTTATTCCA
-AATACATTCCAGTTCCCCTTGTGAATACTTTTTTGACTCACAGGGTATTTCAAAGTTTATTACTTGGTTTTCAGACATTT
-GAGGCTTTTCTGGATATCAATTTGTTGTTGGTTTCTAATTTAATTTCAAGTGTTCAGACAACATCCTTTGTATACTATTT
-CAGGCTTGAACCTTTTCTCAATCCATCGACATACAGTCTATCTTGGCACTGCCAAGTACCATTTGGGTCAGGATTTTGTC
-ATTTAGATCCGTATTTTTCCTATATTTTTATCTGGTTGTTCCGTCAGTTACTGAGAGAGCAGTATTAATTCACCAGCTAT
-AATTTTGGATTGTCAATTTCCTGCTTTTGTTCTGTTGTTTTTGATTCACATACTTTGAGGTTCTGTGTGTGTGTGTGTAG
-TTTGTGTGCACTTTGAGGCACAATTTATAATTGTAACATCATCCTCTCTGATTCTTTTATTTTTATTAAATTACCCTGTT
-TATTTCTGGTGATATATTTTGTTCTGAAGCCTCTTTCATCTAGTGTTAACATCTCTGTTGAAGCTTTTTATGATTAGTGT
-CTGGATAGCATATTTTTATGTTTAGCATCTGCATAGCATATTTTTTCTCATACTTTGTGTCTTTGTGTTTAAATTGTGTC
-TCTGTGGATGCCATATTGTTGGGTCTTGCCTTCCTCTCAGGTCTGGCAGTCTCTGTCTTAAGTAGAGTATTTGTCCACTT
-ACATTGTAACTAATCATTGCTAAGGTTGGATTTAGGTCTGCCATTTTTCTACTTATTTTCTATTTGTTTGTTTATTTTTT
-TTAAGACAGGGTCTTGTTCTGTCACCCAGTCTGTAGTGCAATGGTGCAATCTTGGCTCACTGCAACCTCTGCCTCCCAGG
-CCCAACCAATCCTCACTTGAGCCCCCTGAGTAGCTGGGACTACAAGTGCATGGCACCACACCTGGCTAATTTTTATATTT
-TTGTAGAGATAGGGTTTTGCCATGTTGCACAGGCTGGTCTTGAACTACTGAGCTCAAGCAATCTACCCACCTTGGCCTCC
-CAAAGTGTTCAGATTACAGGCATGAGCCACCATGCCTGGCCTTCGTCTGTCTTTTGATCTTCTATATATTCTTTCCTAAC
-TTCTTTTGGGTTAAATATTTCTAAATATTCCAGTTTGATTAATCTTTTGGCTTTTGGAAATAATTTTTTATAGGCTGGGC
-ATGTTGGCTTATGCTCATAATCTCAGCTCTGTGTGAGTCCAAGGGAGGTGGATTGCTTGAACCCAGGAGTTTGAGACCAG
-CCTGGGCAACATGGCAAAACCCTCTCTACAAAAAACCAAACCAAAATTTAGCCTGACATCTTGGTGTGCACCTGTAGTCC
-TAACTATTTGGGAGGCTGAGGTGGGAGGGTTGCTTGAGCCTGGGAGGTTGAGGCTGCAATGAGCTGTGATCATGCCATTC
-CACTCCTGCCAGGGCAACAGAGTAAGACCGTGTGTCAAAAAAGATCATTTTTTATAAATAATTTATAATTTCGAATTTTG
-GTAACAAACACATACCTTAAAATTTACCATCATAACCAGTTGTAAGTATACAGTTTTGTAGAGTTAAGAATATTTACATT
-GTTGTGTAGCAGATTTCTAGATTTTTTTTTATCTTAGAAAACTCTATACCCATTCAACAACTATTAATTTCCCCTTCCTT
-CCACCTCCTGGCAAGTACTATTCTACTTTGTGTTTCTAAAAATTTGGCTTATATACCTAGGGTTATATAATATTTGTTTT
-TTAAGTAGGTTCCATGTTATGTGCAGATGTGTCAGGATTTTCTTCCTTTCTATGGCTGAATAATATTTCTTCATATATAT
-ATATTTTCTCTATATATATATATATGTATATTCTTTTGTTTATCCATCTATTCCTGGATGGACGTTTTGGTTTCTTCCAC
-CTCGTGGCTATGTAATGCTCCTGTGAACACAGGTGTACACATATCTGTTTGAGGTCCTGCTACTAGTTATTCTGTCTCTG
-TAGAAGTTGGATGGCTGGATCATATGGTCATTTTATTTTATTTTTTTGAGGAGCCAGTTAATATTTCCACCAACAGTGTT
-CAAGTGTTTCAGTTTCACCTGCACTTGTTACTTTCTGTTGGGTTTGAAGTGATGTCCCATTGTGGTTTCTATTTGCATTT
-CTCTAATGATTAGTGATGTTACACATCTTCTCATATATCTCATGTATCTGTTGGCTATTTGTATATCATCTTTGCATCTT
-TGGATGAATGTTCTTTGTCCATTTTTTAATCACTTTATTTTGTTGTGTTGTAGCTGGGTTTTTTGGTCATGAGCATTCAT
-TTATCTCACAGTTCATTCTTGTTACTTGGGCCAGGGTCATGATCATTCATTATCTCTCAGTTCATCCTCATTACGTTGGG
-CAAACAGTCATGCTGCAGGGTATAGATTATGTTATTCTGTTACTTTCAGGTAGAATTCGGGTCTAGGTTCTAATTGTTTC
-TAAGTTTAGATTCTGAATGAGAATCAGCAGAGGTAGACCACTGCTGCTGAGGCCTGGGGATTGCTGGGAAAAAGGCAGGA
-AACAGATATTGACCTGACCATGGAGGGTTTATGTTTCACGGCTCCCATCTGGGTACCCAAGGAACCTACATGTAGCTCGT
-GTGTGGAGAGCCTACATTGCCCACTCAAAGCAATTGAGGATGGAACAGTCTTGGGGCTGGAGCTCATTATTTGGAATGAT
-AACCACATCTGCACAGAGAGGACCTGATAAGATGTTGTCCTTCCATGTATATCTGGGAATCCTGTGTAGGGTCTCTCTGT
-AAGGACAGGGGCAGTGTTGGCTCCTTGGCCTCTAGTTAGCTTCACAAGTAGTCTAGTAAAGGCTTTGCCAACTTGTCACC
-ATCTGTGGATATTCTGGTCAGCTCTTGTTTTCACCCTACTGACTTCTTCAGACACTAGGCTTTTGCTTTAGACCATTCAT
-GGTTTTCTTCCTCTTCAAATCAGTAATCAATAAATCGCCTTCAAGTCAATAAATTTCCACTCCTTTAGGAAACCCTGATC
-TTCTGGTCACACCAAGGTTTAATTAACTGGTTTGATTGTTTTTCTGTTTTCTTGGATTTTTTTTCCTTCTTCCTGGGGGT
-TTCTAGTAATTCTAGTTTGATGTCTCACTTTCTCCATTTTTTATTTCTTAGTTTTCTTCTGTGATTATTTTCACTGCAGC
-TGCAGGGCCTAATCCTGGGTTGGCAGAGAACTAGCACTTACTCTGCCCTAATTGGAATCCAGGAGAGATAGCAGGTTCCC
-TAGTGTGAAAATGTGTTTGCTCCTCTCTGCTTCTGGTAGTCTCTCTGTAGGAGTTCTTTACGCATTCTGAATGTTCACTT
-CTTATGAGATACATGATGTGCAACTATAGGTTGAATGTCTCTGATCCAAAAATCTGAAATCCCAAATGCTCCAAAGTCTG
-AAACTTTTTGAGTGCCAACATGACACTCAAAGGAAATGCTTATTGGAGCATCTCAGACTCAGGTGTTTGAATTTGAGATC
-CTCAACCAGTAAGAATAGTGCAAATATTACAAAATCTGAAACACATCCCAAGCATTTCAAATAAGGGACACTCAACTGGT
-ATTTTTTTTAATTTTACAGTTTGCCTTTTACCCTGTTGGTTGTGACCTTTGAGGTACAGAAGTTTTTAGGTTTGATATAT
-TTTTGCTTTTACTGCCTGAGCTTTTAATGTCATATCCTAAAAATTATTGACAAATTCATCGTCATAAAGCATTTTCCAAA
-TTTGTTTTCCCTAGGAGTTTGATAGTTCTAGTTTTACATTTAGGTTTATAATTCACTTTGAATTGATTTTAACGTGGTGT
-AAGGTAAGAGTCCAACTTCATTGTTTTGCATGTAGTTATACAATTTTCCCATCATCACTTGTTGAAGAAACTGTGCTTTT
-CCATTGAGTGGTCTTGGCATCCTTCTGGAAGATCATCGGACCATATATGCCAGGGTTGGTTTCTGAGGTCTCTGTTGTGT
-TGGTCCATAAGTGTGTCAAGAGTGTCTTTATGCCATGACCACATTTTTTCTTTTTGGCTTATTGCAGTTTTGTAATTGCT
-TTGAGACGTTTAATTTTGTTCTGTTTCAAGATTGATTTGCCTATTCATGGGCCCTGGAGATTCCATATGAGTTTTAGGAT
-AGGTTTTTCTGTTTATCAAAAATGTCATTGGAATCTTTATAAGGATTGTATTGAATCTAGGTCACTTCGAGTAGTGTTGA
-CATCATTCCAAGATGAAATCATCTAATTTGCAAACCCAGCTTTTCTTTTCATTTATTTGTGTTTAATTTCTTTTAACAGT
-GTTTTGTAGTTTTCTGTGTTCAAATCTTTTGCCCTCTTGGTTAAGCTTATTTCTAATTTTTATAATGCTGTTGTAAATAT
-AATTTTTTTTTTTTGAGATGGAGTCTTGCTCTGTCTCCCAGGCTGGAGTGCAGTGGCACTATCTCAGGTCACTGCAACCT
-GCACCTTCCTTATTCAAGCGATTCTCCAACCTCAGCCTCTCAAGTACCTGGGATCACAGGTGCGCGCCACCATGCCCAGC
-TAACTTTTTGGTATTTTTAGTAGAGACAGTGTTTCTCCATGTTGACCAGGCTATTCTTGAACTTGTGACCTCAGGTGATC
-TGCCCACCTCGGCCTCCCAAACTGCTGGGATTGCAGGCATGAACCACTGCACCCAGCCAAATGTCATTCTTTTTAAAAAT
-TTCTTTTCTTTTGTTTTCTCTTTCTTTTCTTTTCTTTCTCTCTCTTTCTTTCCTTTCTTTCTTTTTTTTTGAGACGGTGT
-CTCACTCTGTTTCCTAAGCTGGAGCACAGTGGCACAGTCTCAGCTGACTGCAACCTCCACCTTCCAAGTTCAAGCAATTC
-TCCTGCCTCAGCCTCCCAAGTAGCTGGGACTACAGGTGTCTGCCACTATGCCCAGCTAATTTTTGTATTTTTAATAGCGA
-TAGAGTTTTACTATTTATATTAGAGATGGGGTTGACCCAGCTGGTCACGAACTCCTGACCTCAGGTGGTCCACCCGCCTT
-GGCCTTCCAAAGTGCTGGGATTACAACTGTGAGCCACTGCACCTGGCCTCTTTTTAAAATTTTATTTGCAGATTGTTCAT
-TGTTAGTTTATAGAAATGGAACTGACTTGTGTGTGTTACTGTATCCTGAAACTTTGTTGAATTTCATTATTCTACCAGTA
-TTTTGTGGAATTTCAGGATTTTTACACATTACATCATGTTGTCTGTGAACAAAATTTTGTACTTTTTCCTTTCCAATTTG
-CATGCTTTTTATTACTTTCTCTTGCCTAATTATTCTGAGTAGAAATTCCAGTACTGTGGTGAATAGAAGTGGCAGGAAGA
-GATGTTGCTATCTTATTCCTGATCCTAGAGGAAAAGATTTTAGTTTTTCACCATTCAGTATGATGTTAGCTGTGAGCTTT
-TCATGTATAATCTTTATTTACTGAGGAGTTTCCATATATTACTAATTCTTTGAGTGTTTTTATTACAAAAGGTGTTCATC
-TGGCTCTGGAACCAGATAAATGTTGACCTGATAGAGTGGATTGGAATGTCCCCTTCTGGTTTTTGAACATTTTTGGAATA
-TTTTACAAAGGGCTGGCATTAATTCTTCTTGAAATGTTTGGTAAAATTTTCCAGTGAAGTTATCTGGACCTGGAATTTTC
-TTTTTTGGGGGGTTTTTGATTACTGGTTGAATCTTCTTACTAGTTACAGGTCTCTTTGGATTTTTTATTTCTCCATGATG
-CAGTATGGTGGTTTGTGTTTCTAGGAATTTATAAATTTATTCTAGGTTGCCCAGTTCTGTGGCATATGGTTGCTCACATT
-AGTCTCTTGTAATCTTTTTCATTTCTGTGGAATCTGTTGTACTGTCACCTCTTTTATTTATGATTTTAGTATTTGAGATT
-TCTCTTTTTTTCTTAATATAGCTGTGAGTTTTAAAATTTTTATTGATCTTTAAAAAAACAAACTCAGTGGTTTTTTTTTT
-CCTTTTTTTCTGGTCTTATTCTGCTTATCTCTGTTCTAATCTGTTATTTTCTTCCTTTTGCTTGGTTTGTCATTAGTTTT
-TTTTTTTTTCCCTTTAGGTGTAATGTTAGGTTATTGATTTGAGATCTTTCTTCTTTTTAATTTGATCACCTGCAGCTATA
-AGCTTCCCTTTAGCATGGCTTTGAGATCTTTCTTCTTTTTAATTTAAGCATCTGTGGCTGTAAGCTTCCCTTTAGCACTG
-CCTTTGTTGCCTCCTCCTGAGTTTGGGTATGTCATGGTTTTGTTTTCATTTGCTTAAACATTTTTTTTTGTCCTATTGTA
-ATATAATTGTGTTGTTTTTAATAGAGGTAATTAATGAAACACATAATGAATTGTGCTTCTGTTTTTATAATATTTTAAGC
-ATTCTTAACTCAGAAATGTAAATTTTAGAAAAAAATTCCAGGCCAGGCACAGTGGCTCACACCTGTAGTCCCAGCACTTG
-AGGAGGCCGAGGTGGGAGGATCATCTGAGGTCAGGAGTTGGAGACCAGCCTGGCCAACATGGTGAAACCCTGTCTTTACT
-AAAAATAGAAAAAAAATATATAAAAGCTAGCTGAGTGTCATGGCGGGTGCCTGTAATCCCAGCTACTCTGGAGGCTGAGG
-CAGGAGAATCACTTGAATCTGGGAGGCGGAGGTTGCAGTGAGCTGAGATTGCACCACTGCACTCCAGCCTGGGTGACAGA
-ATGAGTCCATCTCAAAAAAAAAAGAAAAAAGAAAAAATTTGAGACATATTTATTTGTATTTCAATTTAGAAACTATGATC
-TCCTAAGTGTATTGACACAGCAACCTGACATAAAGATAAAGAATAATAAGTATATAACAAAACGGAAACTTGCAAATACC
-TTTTTTAATTAATTTTTAATTATATATATTTAAAAATTGCCGGGTGCAGTGGCTTACACCTGTAATCCCAGCACTTTGGG
-AGGCTGAGGTGGGCAGATCACATGAGGTCAGGAGTTTGAGACCAGCCTGGCCAACATGGTGAAACCTCATCTCTATTAAA
-AATCAAAAAATTAGCCAGGCGTGATAGCATGCATCTGTAGTCCCAGCTACTCAGGAGACTGAGGCAGCAGAATTGCTTGA
-ACATGGGAGGCAGAGGTTGCAGTGAGCCAAGATAGTGCCACTGCACTCCAGCCTTGGTGACAGAGTGAGACTCTGACTCA
-AAAAAAAATTGTCTGGGCACGGTGGCTCACACCTGTAATCGCAGCATTTTGGGAAGCTGAGGCAGGCAGATCACGTTAGG
-AGATCGAGACCATCCGGGCTAACACGGTGAAATGCCATCTCTACTAAAAATACAAAAAATTAGCCGGACGTGGTGGCGGG
-TGCCTGTAGTTCCAGATACTCCGGAAGTTGAGGCAGGAGAATGGTGTGAACCTGGGAGGTGGAGCTTGCAGTGAGCTGAG
-ATTGCACCACTGGACTCCAGCCTGGGTGACAGAGCGAGACTCTGTCTCAAATAAAATAAAATAAAATAAAACTAAGGTGT
-GGTTGACATACAAAAATTACACATATTTAATATATACCTTTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTTAC
-GGAGGTTTTACTCTTGTTGCCCAGGCTGGAGTGCAGTGACACGATCTCAGCTAGCTGCAACCTCCACCTCCCGGGTTCAA
-GCAATTCTCCTGCCTCAGCCTCCTGAGTAGCTGGGATCGCAGGCGTGCGCCCCGACACCCGGCTAATTTTTGTATTTTTT
-TAGTACAGACAGGGTTTCACCATGTTGGCCAGGCTGGTCTCGAACTCCTGACCTCAGATGATCCACCTGCCTTTGTCTCC
-CAAAGTGCTGGGATTACAGGCGTGTGACACCGAATATATACATCTTAATGAGTTTAGAGATAAGTATTCGCCCCAGGACT
-CATCACAACAAATAATGCCGTAAACTTGACCATCACTCCCCATATATTTCTCATTCTGACCCTTTTTAAAAAATGAGACC
-GGGAGTGGTGGCTCACGCCTGTAATCCCAGCATTTTGCGAGGCCGAGGCGGGTGGATCACGAGGTCAGGAGATCAAGACC
-ATCCTGGCTAACACAGTGAAACCCCGTTTCTACTAAAAATACAGAAAATTAGCTGGGCGTGATGGCGGGCACCTGTAGTC
-CCAGCTACTTGGGAGACTGAGGCAGGATAGTGGTATGAACTCGGGAGGCAGAGCTTGCAGTGAGCTGAGATCGTGCCACT
-GCACTCCAGCCTGGGCAACAGAGTGAGACTCCGTCTCAAAAAAAAAAATGAGATGACCATTTCACCTAAAATATACCCTC
-TTAAGTTTTATTTTAAGTGTACAATACAGGACGGCCATGCATCAGAGATATATGTGGGTTTGGTTCCAGACCACTGCAAT
-AAAGTGAGTTATACAATTTCTTTTGGTTTTCCAGTGCATGTAAAAGTATGTTTATACTGTGCTGTATAAAGTGTGCAATA
-GCATATGTCTACAAAGTGTTCACACTTTAATTTACAAATACTTTATTGTTAACAAGTGCTAACAGTCATCTGAGCCTTCA
-GAAAGCTGCAATCTTTTTTTGTGTGTGTGACAGGGTTTTACTCTGTGGCTCAGGCTAGAGTAATTGCAGTCTCAACCTCA
-TGCTCAATCAAACCCCCACCTCAGACTCCTGACTAGCTGGAACTACAGATACATGCCACCATGACCAGCTAATTTTTGTA
-TTTTTTTTTTTTTGTAGAGATGGGGTTTTGCCATGTTGCCTTGACTTCCTGGGCTCAAGCAATCTACCCACCTTGGCCTC
-CCAAGGTGTTGGGATGACAGGTGTGAGCCACTGCACCTGGCCAAGTTTCAGTCTTCTTGCTGATGGAGGGTCTTGCCTTA
-ATGTAAGGTGGTGGTTGCTGAGCGTTGGGGTGGCTGTGGCAATTTCTTAAAATAAGACACCATTGAAGTTTGCTGTGTCA
-ATTGACTCTCCCTTTCACAAAAGAATTATCTGTAGCATACGATGTTGTTTGATAGCTTTTTACCCACAGTAGAACTTTCA
-AATTGGATTCAATCCTGTCAAACCTTCGTACAGCTGTACCAACTAAGTTTATGTATTATTGTAAATCATTGTGTCAATCC
-TGTCAAGCCCTCCTTCTGCTGTACCAACTAAGTTTATTCTAAATCTGTTGTCATCTCAACATTGTTTACACTGTCTTCAC
-CACGAGTAGATTTCATCTCAAGAAACCACTTTCTTTGCTCATCCTTGGAAGCAACTCATCCACTCACGTTTTCTCCGGAG
-GCTGCTGCAGTCTCGCCAGATCTTCAGGCTCTGTCTCTGATTCTAGTGCTCTTGTTATTTCCACCATATCTGCAGTTACC
-TCCTCCACAGAAGTCGTGAACCCCTGTGTCATCTGTGAGGGTTGGAATAATCTTCCCAACTTCTCTCTCTCTCTCTCTCT
-CTTTTTTTTTTTTTGAGATGAAGTCTTGCCTGGGCTGGAGTGCAGTGATGCGATCCCAGCTCACTGCAACCTCCACCTCC
-CAGGTTCAAGCAATTCTGCCTCAGCCTCCCAAGTGTTTGGGATTACAGTCACCCCCGACCAGGCCCAGCTAATTTTTTGT
-GTGTTTTTAGTACAGACAGGATTTCACTATGTTGGCCAGGCTGGTCTCAAATTCCTGACCTCGTGACCCACGTGCCTTGG
-CCTGCCAACATGCTGGGATTACAAGTGTGAGCCACCACGCCCGGCCCCAACTTCTCCTAATGTTGCTATTTTGATCTTAT
-TTTTTAAATCATGAATGTTCTCAATGACATCTAGAATGGTGAATCCTTTCCAGTAGGTTTTCAATTATTTTGCCCAGATC
-CATCAAAGGAATCACTTTCTAGAGAAGTTATAGCTTTATGAAATATATTTTTAAGTGATAAGACTTGAAAGTTGAAATTA
-TTCTTTGATCCAAGGGCACCAGAATGAATGTTGGGTTAGTAGGCATGAAAACAATATTCAGCTCTTTGTACATCTCTGTA
-AAAGCCCTTGAGTACCAGGGGCATTGTCAGTGAGCGGTAATACTTTGAAAGGAATCTTATTTCTTGAGCAGTAGGTGTCA
-ACAGTGGGCTTCAGATATTCAGTAAACCATATTTGTAAGCCGATAGTCTGTCATCCAGGCTTTGTTCCCATTTGTAGAGT
-ACAGACAGAGCTGTGTTTTATCATAATTCTTCAGGGCCCTTGGATTTTCAGAATAGTAAATCATCATTGGTTTCAAGTTA
-ACATCACCAACTGCATTAGCCCTTAACAAAAGAGTCAGCATGTCCTTTGAAGCCTTAAAGCCAGGCATCAACTCCTCTCT
-AGCTGGGAACATCCTAGATGGCATCTCCTTCTAGTAGAAGGCTGTTTTGTCTCCATTGCAAATCTATTTAGTGTTGCCAT
-CTTAATCAGTTATCTTCTAGATAGCTTTCTGCAGCTTTTCCATCAGTACTTGCTGCTTTATCTTGCGCTTTTATGTTATG
-GAGATGACTTTTTTCCTTAAACCTCAAGAAACAAGCTCTTCTAGCTTCAGACTTTCCTTCTGCAGCTGCCTCACCACTCT
-AAGTCTTCATAGAATTGAAGAGAGGCCGGGTGCGGTGGCTGTCACACCTGTAATCCTAGCACTTTGGGAGGCCGAGGCGG
-GCAGATCACCTGAGGTCGGGAGTTCGACACCAGTCTGACCAATGTGGAGAAACCCCGTCTCTACTAAAAATACAAAAAAA
-TAGCCAGGTGTGGTGGTGCTTGCCTGTAATCCCAGCTACTTGGGATGCTGAGGCAGGAGAATGGCTTGAACTTGGGAGGC
-AGAGGTTGCGATGAGCCAAGATCACGCCATTGCACTCCAGCTTGGGCAAGAAGAATGAAACTCTGTCTCAAAAAAAAAGA
-AAAAAAAGTAAAAAGAGAGTTAGGCTTAGGCTTAATGGAATGTTTTTTGTTTTTTTTTCATCTTCTATCTAGACCAATTA
-AACTTTCTTCATAACAGCAGCAAGATTGTTTAGCTTTTTATCATTCATGTGTTCACTGGAGCAGTACTTTAAATTTCTTT
-CCAGAACACTTCGTTTGCATTCACAACTTGGCTAAGTGTTTGTTGCATGAGGTCTAGCTACTGGCCTGTCTTGCTTACAG
-CATGCCTTCCTCACTAAGCTTAATTATTTCTTCCTTTTGGTTTAAAGTGACAGACATGCAACTCTTCTTTCATGAACATA
-TAGAGGCTATTGTAGGGTTATTAATTGGCCACATTTTAATATTAATAAAAAGAAGCCTGAGAAAAAGAGAAAGAGAAATG
-GCCCGTTGGTTGGGCAGTCAGAACAAACGCATTTGTCAATTGTTTGCTGTCTTATCCTGGTGTGATTTGTGGTTCCCAAA
-ACAATGACAACAGTAGCATTAAAGATTACTGATTACAGATCACCACAACAGATTCAATAATAAAAATCTTAAAATACTGT
-GAGAATGACCGAAATGTGACACAGAGACGTGAAGTGAGCACGTGCTGTAGGAACAATGGTGCCAGTGAGACCTGCTTATT
-GCAGGGTGGCCACAAACCTTCAATACGTAAAACACATGGTCACAAAACACAATAAAGCAAAGTGCAGTGAAACAAGATGT
-GTCTGTCTTTTGATAGACTCTGACAATCTCTACCTTTGAATTGGTACATTCATACCATTAACATTCAAAGTGATTATTGA
-TATCATTGGATTAATATCTACTATATTTGTTACTGTTTTCTATTCATTCTCCTCAGTCTTCATTCTTTTGTCTACCACTC
-TTTTTCTGCCTTTTGCAGTTTTCATTGATGATTTTAGATGACTCCATTTTCCCTGTCTTTCTTAGTACATACTTCTCTTT
-TTAAAACTTTTTTTTAACTAGTTGCCACAGAATTTGCAATATACATTTACAACCAATTCAAGTCCACTTTCAAATAACAC
-TATCCAACTATCCCACAAATAAGACTACCTGCTTAACAAACAAAACACCTAATTCCTCAGTAACATTTACAACCAATTCA
-AGTCCACTTTCAAATAACACTATCCCACTATCCCACAAATAAGACTACCTGCTTAACAAAGAACACACCTAATTCCTCAA
-TATACATTTACAACCAATTCAAGTCCACTTTCAGATAACACTATCCCACTTCACGGGTGACTACCTGCTTAACAAAGAAA
-ACACCTGATTCCTCCCTCCCATCCTTCCATTCCATTCCTTGTATTATTGTTCCTTATTTCACTTGTGTATAAGCATGCAT
-AATCTATCTGTGTGTATTTATTATTATCTACAAACTTATTGGTCAGATCAATTATGAATAAATACATGTTTTTATTGTAC
-CACAATGCCTCCCTACCATCCTTCCATTCCATTCCTTGTATTAGTGTTACTCATTTCAATTGTATATAAGCATACATAAT
-ATATCTGTATTTGTTATTGTCTATGATCTTCTTGGTCAGATCAATTAAGAATAAATACATAGGTTTTTATTGTACCACAA
-TTCTTTCTTTAATGCTCTTTTTAAAAAAATGTTGATCCAGGTTTCAGTTATATATCTTTTGTTTCCCTAAAGAATTTCAT
-TTAACATTTCTTGCAAGACAGGTCTCCTGGCAACAAGTTTCTTGAATTTTTATTTTTCTGAGGAAGGCCTTAATTCTCCT
-TCACTTTTGAAGGGTGGTTTCAGTGGGTACAGAAACTTAGGTTGGTGGGTTTTTTCTGTCAACATTTTGAATTTTTCATT
-TCACTGTCTTCTTACTTTCACAGTTTCTGAAATGTTGAATGCAGTTCTTATCTTTGTGTCTCTGTAGGTAAGGTGTTTTC
-TGCCCCACCTCTGGTTTCTTTCAGAGTTTTCCTTTATCTTTTATTTCATATAGTTTGAAAATTATATGTCCAAGTGTAGG
-TTGTTGGTATTTATTCTGCCTGGTGTTCTCAGAGCTTCCTGGATCTTTGGTTTGGTGTCTGACATTAATACTGGAAGTTC
-TCAGACATGGTTGTTGCAGAACTTTCTTCTATTTCTTCTCCTCTTGGTATTCTCATTACTGTTTCACCTTTTGTAGTTGT
-CCCACAGTCTTGAATATCATCTTCTGTTCTTTTCAGTGTTTCTTTTCTTTAGTTTTCGAAGTTTCTGATGATAAATCCTC
-AAGCTCAGAGATTTTTACTCAGCTGAGTCCAGTCTACTAATAAGCCATCAGAGGTATTCTTCAGTTATTTACCACGTTTT
-TCATCACTACATTATGTTGAAAGTTCTTACGATGTCTGTCTTTCTCATTACATTACCCATCTACACTTGAATACTGTCTA
-CTTCATTCATTAGGCCCTTAGCATATTCTCCAGAGGTTTAAAAAAAAATTCCAAGATCATATCTTTGTCTGCTTCTGAAG
-CTTGCTCTGTTGACACAAATTGTATTTTTTTCTTTTTTTGGATTTTAGTAAGCCTTGCAATTTTTTCCCTTTATTCTGAT
-GCATGAAGTACCCACTAAAAGTGACTGTTGTTAGTATAGCTTCAGTAATGCGGTGATGAGGTGACAGGGCAGGTGATGCT
-CTCTTAGTCTCTTTAGGCTACTATAACAAAATACTTCAGACTGAGTAATTCATAAACAACAGAGATTATTGTTCACAGAT
-CTGGAGGCTGGAAAGTACAAGACTAAAGGGCCAGGATATTTGGTGTTTGGTGAAGGTCAAACATTCAGACACTCTCAACG
-ACTATAGCGACAGCAGCAGTCTTCAGGAATCCTATGTGAGGGACAAACACTCAGAAGCCAGCTGGAGTGTTCTAGAATCC
-TATGTGAGGGCCAAACATTCAGACCCCAGCAGTAGTGTTGTGGAATCCTATGTGAGGGACAAACATTCAGACCACGGGAG
-CAGTGTTCTGGAATTCTATGTGAAGGACAAACATTAAGACTCTCATAGCAGTGTCCTGGAATCATATGTGAGGGACAACC
-ATTCAGACACCAGCAGAAGTGTTCTGGAATCCTAGGTGTGGGAAAAACATTCAGAACCTAGTAGCAGTGTTCTGGAATCC
-TATGTGAGGGACATACATTCAGACCACGGCAGCAGTGTTCTGGAATGGTATGTGAAGGACAAACATTCAGACCCTTGTAG
-CAGTGTTCCAGAATTTTATGTGAGGGACAAACATTCAGACCACAGCAGCAGTGTTCTGGAATCCTATATGACGGACCAAC
-GTGCAGACCCTTGCAACAGTGTTCTGGAATACTAGGTGAGGGAAAAATATTCACACCCTTGTAGCAGTGTTCTGGAATTC
-TATGTGACTGACAAACATTCAGACTCCAGCAGCAGTGTTCTGTAATCCTATGTGAGGGACAAACATGCAGACCCCAAGAG
-CAGTGTTCTGAAATCCTATGTTAAGGGAAACATTGAGACCCCAGCATGAATGTTCTGGAATCCTATGTGAGTGACAAACA
-TTCAGACCACGGCAGGAGTGTTCTGGAATCCTATGTGAGGAACAAACATTCAGACCACAGCAGGAGTGTTCTGGAATCCT
-ATATGAGGTATAAGCATTCAGACCCTCATAGCAGTGTTCTGGAATCCTATGTGAGGGAGAAGCATTCAGAGCACAGCAGG
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta.fai b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta.fai
deleted file mode 100644
index c5e2e02..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-20	200000	4	80	81
-21	200000	202508	80	81
diff --git a/src/test/resources/htsjdk/samtools/cram/io/bzip2-test.bz2 b/src/test/resources/htsjdk/samtools/cram/io/bzip2-test.bz2
deleted file mode 100644
index a16c0e0..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/io/bzip2-test.bz2 and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/test.cram b/src/test/resources/htsjdk/samtools/cram/test.cram
deleted file mode 100644
index 59f11d2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/test.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/test.cram.bai b/src/test/resources/htsjdk/samtools/cram/test.cram.bai
deleted file mode 100644
index fcb31fc..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/test.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/test.dict b/src/test/resources/htsjdk/samtools/cram/test.dict
deleted file mode 100644
index dfb98d6..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test.dict
+++ /dev/null
@@ -1,2 +0,0 @@
- at HD	VN:1.4	SO:unsorted
- at SQ	SN:Sheila	LN:20	M5:7ddd8a4b4f2c1dec43476a738b1a9b72	UR:file:/Users/edwardk/Documents/htsjdk/testdata/htsjdk/samtools/cram/auxf.fa
diff --git a/src/test/resources/htsjdk/samtools/cram/test.fa b/src/test/resources/htsjdk/samtools/cram/test.fa
deleted file mode 100644
index 11d25dd..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->Sheila
-GCTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/test.fa.fai b/src/test/resources/htsjdk/samtools/cram/test.fa.fai
deleted file mode 100644
index f3cdedb..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-Sheila	20	8	20	21
diff --git a/src/test/resources/htsjdk/samtools/cram/test2.cram b/src/test/resources/htsjdk/samtools/cram/test2.cram
deleted file mode 100644
index 59f11d2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/test2.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/test2.dict b/src/test/resources/htsjdk/samtools/cram/test2.dict
deleted file mode 100644
index dfb98d6..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test2.dict
+++ /dev/null
@@ -1,2 +0,0 @@
- at HD	VN:1.4	SO:unsorted
- at SQ	SN:Sheila	LN:20	M5:7ddd8a4b4f2c1dec43476a738b1a9b72	UR:file:/Users/edwardk/Documents/htsjdk/testdata/htsjdk/samtools/cram/auxf.fa
diff --git a/src/test/resources/htsjdk/samtools/cram/test2.fa b/src/test/resources/htsjdk/samtools/cram/test2.fa
deleted file mode 100644
index 11d25dd..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test2.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->Sheila
-GCTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/test2.fa.fai b/src/test/resources/htsjdk/samtools/cram/test2.fa.fai
deleted file mode 100644
index f3cdedb..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test2.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-Sheila	20	8	20	21
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#blank.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#blank.2.1.cram
deleted file mode 100644
index ec69511..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#blank.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#blank.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#blank.3.0.cram
deleted file mode 100644
index 0600333..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#blank.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#large_aux.2.1.cram
deleted file mode 100644
index 29992ea..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#large_aux.3.0.cram
deleted file mode 100644
index 2b01737..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.sam b/src/test/resources/htsjdk/samtools/cram/xx#large_aux.sam
deleted file mode 100644
index 93fb8cf..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at SQ	SN:xx	LN:20
-a1	16	xx	1	1	10M	*	0	0	AAAAAAAAAA	*	aa:i:1	ab:i:1	ac:i:1	ad:i:1	ae:i:1	af:i:1	ag:i:1	ah:i:1	ai:i:1	aj:i:1	ak:i:1	al:i:1	am:i:1	an:i:1	ao:i:1	ap:i:1	aq:i:1	ar:i:1	as:i:1	at:i:1	au:i:1	av:i:1	aw:i:1	ax:i:1	ay:i:1	az:i:1	ba:i:1	bb:i:1	bc:i:1	bd:i:1	be:i:1	bf:i:1	bg:i:1	bh:i:1	bi:i:1	bj:i:1	bk:i:1	bl:i:1	bm:i:1	bn:i:1	bo:i:1	bp:i:1	bq:i:1	br:i:1	bs:i:1	bt:i:1	bu:i:1	bv:i:1	bw:i:1	bx:i:1	by:i:1	bz:i:1	ca:i:1	cb:i:1	cc:i:1	cd:i:1	ce:i:1	cf:i:1	cg:i:1	ch:i:1	ci:i:1	cj:i:1	ck:i:1	cl:i:1	cm:i:1	c [...]
-a2	16	xx	1	1	10M	*	0	0	AAAAAAAAAA	*	aa:i:1	ab:i:1	ac:i:1	ad:i:1	ae:i:1	af:i:1	ag:i:1	ah:i:1	ai:i:1	aj:i:1	ak:i:1	al:i:1	am:i:1	an:i:1	ao:i:1	ap:i:1	aq:i:1	ar:i:1	as:i:1	at:i:1	au:i:1	av:i:1	aw:i:1	ax:i:1	ay:i:1	az:i:1	ba:i:1	bb:i:1	bc:i:1	bd:i:1	be:i:1	bf:i:1	bg:i:1	bh:i:1	bi:i:1	bj:i:1	bk:i:1	bl:i:1	bm:i:1	bn:i:1	bo:i:1	bp:i:1	bq:i:1	br:i:1	bs:i:1	bt:i:1	bu:i:1	bv:i:1	bw:i:1	bx:i:1	by:i:1	bz:i:1	ca:i:1	cb:i:1	cc:i:1	cd:i:1	ce:i:1	cf:i:1	cg:i:1	ch:i:1	ci:i:1	cj:i:1	ck:i:1	cl:i:1	cm:i:1	c [...]
-b1	16	xx	1	1	10M	*	0	0	AAAAAAAAAA	*	ZZ:Z:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""####################################################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [...]
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.2.1.cram
deleted file mode 100644
index 3d1a6ee..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.3.0.cram
deleted file mode 100644
index 73b1570..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.sam b/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.sam
deleted file mode 100644
index 9e338ed..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at SQ	SN:xx	LN:20
-a1	0	xx	1	1	1M	*	0	0	A	#	aa:i:1
-a2	0	xx	1	1	1M	*	0	0	A	#	aa:i:1	ab:i:1
-a3	0	xx	1	1	1M	*	0	0	A	#	aa:i:1	ab:i:1	ac:i:1
-a4	0	xx	1	1	1M	*	0	0	A	#	aa:i:1	ab:i:1	ac:i:1	ad:i:1
-a5	0	xx	1	1	1M	*	0	0	A	#	aa:i:1	ab:i:1	ac:i:1	ad:i:1	ae:i:1
-a6	0	xx	1	1	1M	*	0	0	A	#	aa:i:1	ab:i:1	ac:i:1	ad:i:1	ae:i:1	af:i:1
-a7	0	xx	1	1	1M	*	0	0	A	#	aa:i:1	ab:i:1	ac:i:1	ad:i:1	ae:i:1	af:i:1	ag:i:1
-a8	0	xx	1	1	1M	*	0	0	A	#	aa:i:1	ab:i:1	ac:i:1	ad:i:1	ae:i:1	af:i:1	ag:i:1	ah:i:1
-a9	0	xx	1	1	1M	*	0	0	A	#	aa:i:1	ab:i:1	ac:i:1	ad:i:1	ae:i:1	af:i:1	ag:i:1	ah:i:1	ai:i:1
-aA	0	xx	1	1	1M	*	0	0	A	#	aa:i:1	ab:i:1	ac:i:1	ad:i:1	ae:i:1	af:i:1	ag:i:1	ah:i:1	ai:i:1	aj:i:1
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#minimal.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#minimal.2.1.cram
deleted file mode 100644
index e25b0f2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#minimal.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#minimal.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#minimal.3.0.cram
deleted file mode 100644
index fda0032..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#minimal.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#minimal.sam b/src/test/resources/htsjdk/samtools/cram/xx#minimal.sam
deleted file mode 100644
index eb72140..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#minimal.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at SQ	SN:xx	LN:20
- at SQ	SN:yy	LN:20
-a0	16	xx	4	1	10H	*	0	0	*	*
-a1	16	xx	4	1	5H0M5H	*	0	0	*	*
-a2	16	xx	4	1	5H0I10M0D5H	*	0	0	*	*
-A0	16	yy	4	1	0H	*	0	0	*	*
-A1	16	yy	4	1	0I	*	0	0	*	*
-A2	16	yy	4	1	0D	*	0	0	*	*
-A3	16	yy	4	1	0M	*	0	0	*	*
-A4	16	yy	4	1	0P	*	0	0	*	*
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#pair.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#pair.2.1.cram
deleted file mode 100644
index 246ebd8..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#pair.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#pair.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#pair.3.0.cram
deleted file mode 100644
index 89c1c2f..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#pair.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#pair.sam b/src/test/resources/htsjdk/samtools/cram/xx#pair.sam
deleted file mode 100644
index aa8c77b..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#pair.sam
+++ /dev/null
@@ -1,7 +0,0 @@
- at SQ	SN:xx	LN:20
-a1	99	xx	1	1	10M	=	11	20	AAAAAAAAAA	**********
-b1	99	xx	1	1	10M	=	11	20	AAAAAAAAAA	**********
-c1	99	xx	1	1	10M	=	11	20	AAAAAAAAAA	**********
-a1	147	xx	11	1	10M	=	1	-20	TTTTTTTTTT	**********
-b1	147	xx	11	1	10M	=	1	-20	TTTTTTTTTT	**********
-c1	147	xx	11	1	10M	=	1	-20	TTTTTTTTTT	**********
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#rg.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#rg.2.1.cram
deleted file mode 100644
index 618a43d..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#rg.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#rg.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#rg.3.0.cram
deleted file mode 100644
index 8b0148b..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#rg.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#rg.sam b/src/test/resources/htsjdk/samtools/cram/xx#rg.sam
deleted file mode 100644
index 2d7efbc..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#rg.sam
+++ /dev/null
@@ -1,13 +0,0 @@
- at HD	VN:1.4	SO:coordinate
- at SQ	SN:xx	LN:20	AS:?	SP:?	UR:?	M5:bbf4de6d8497a119dda6e074521643dc
- at RG	ID:x1	SM:x1
- at RG	ID:x2	SM:x2	LB:x	PG:foo:bar	PI:1111
- at PG	ID:emacs	PN:emacs	VN:23.1.1
- at CO	also test
- at CO	other	headers
-a1	16	xx	1	1	10M	*	0	0	AAAAAAAAAA	**********	RG:Z:x1
-b1	16	xx	1	1	10M	*	0	0	AAAAAAAAAA	**********	RG:Z:x2
-c1	16	xx	1	1	10M	*	0	0	AAAAAAAAAA	**********
-a2	16	xx	11	1	10M	*	0	0	TTTTTTTTTT	**********	RG:Z:x1
-b2	16	xx	11	1	10M	*	0	0	TTTTTTTTTT	**********	RG:Z:x2
-c2	16	xx	11	1	10M	*	0	0	TTTTTTTTTT	**********
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#tlen.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#tlen.2.1.cram
deleted file mode 100644
index ecf3396..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#tlen.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#tlen.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#tlen.3.0.cram
deleted file mode 100644
index ec1b380..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#tlen.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#tlen2.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#tlen2.2.1.cram
deleted file mode 100644
index 558e4dd..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#tlen2.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#tlen2.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#tlen2.3.0.cram
deleted file mode 100644
index add9c38..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#tlen2.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#triplet.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#triplet.2.1.cram
deleted file mode 100644
index 8a1d9cf..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#triplet.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#triplet.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#triplet.3.0.cram
deleted file mode 100644
index 515827e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#triplet.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#triplet.sam b/src/test/resources/htsjdk/samtools/cram/xx#triplet.sam
deleted file mode 100644
index 1255725..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#triplet.sam
+++ /dev/null
@@ -1,7 +0,0 @@
- at SQ	SN:xx	LN:20
- at SQ	SN:yy	LN:20
-a1	67	xx	1	1	10M	=	6	20	AAAAAAAAAA	**********
-a1	35	xx	6	1	10M	=	11	-20	AAAAATTTTT	**********
-a1	147	xx	11	1	10M	=	1	-20	TTTTTTTTTT	**********
-a1	67	yy	1	1	10M	=	6	15	AAAAAAAAAA	**********
-a1	3	yy	6	1	10M	=	1	-15	AAAAATTTTT	**********
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#unsorted.2.1.cram
deleted file mode 100644
index 9c55dcf..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#unsorted.3.0.cram
deleted file mode 100644
index e161bca..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.sam b/src/test/resources/htsjdk/samtools/cram/xx#unsorted.sam
deleted file mode 100644
index 05887a3..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.sam
+++ /dev/null
@@ -1,8 +0,0 @@
- at SQ	SN:xx	LN:20
- at SQ	SN:yy	LN:20
-b1	147	yy	11	1	10M	=	1	-20	TTTTTTTTTT	**********
-a1	147	xx	11	1	10M	=	1	-20	TTTTTTTTTT	**********
-a1	99	xx	1	1	10M	=	11	20	AAAAAAAAAA	**********
-b1	99	yy	1	1	10M	=	11	20	AAAAAAAAAA	**********
-c1	99	xx	1	1	10M	=	11	20	AAAAAAAAAA	**********
-c1	147	xx	11	1	10M	=	1	-20	TTTTTTTTTT	**********
diff --git a/src/test/resources/htsjdk/samtools/cram/xx.fa b/src/test/resources/htsjdk/samtools/cram/xx.fa
deleted file mode 100644
index a233f7d..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx.fa
+++ /dev/null
@@ -1,5 +0,0 @@
->xx
-AAAAAAAAAATTTTTTTTTT
->yy
-AAAAAAAAAATTTTTTTTTT
-
diff --git a/src/test/resources/htsjdk/samtools/cram/xx.fa.fai b/src/test/resources/htsjdk/samtools/cram/xx.fa.fai
deleted file mode 100644
index 97b1a3b..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx.fa.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-xx	20	4	20	21
-yy	20	29	20	21
diff --git a/src/test/resources/htsjdk/samtools/cram_query_sorted.cram b/src/test/resources/htsjdk/samtools/cram_query_sorted.cram
deleted file mode 100644
index 2397cd6..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram_query_sorted.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta b/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta
deleted file mode 100644
index 9561151..0000000
--- a/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta
+++ /dev/null
@@ -1,40 +0,0 @@
->chr1
-TTCATGCTGAAGCCCTCTTACGATCGTACAGATGCAAATATTAACAAACC
-TTTAAGGGCAAAAAAAAAACAATACAATAATAGAGTACGTTAACACTCCA
-A
->chr2
-CATCTCTACAAGCGCGTCCTACCAGACGCGCTTCCGATCTGAGAGCATAC
-TTTTCATTGGATTCCAGCACAACTCCATTTTTGATCCACTTGACACCTTT
-T
->chr3
-CGTATGCGCTTTTTATGTCGCCCACAGTGCCTAGTATAGCCCCTGCTAAT
-AAAAAGAGATGAATACGTTTACTTAAAAAACTGAAACTAGGAATGTGCAA
-A
->chr4
-CGTGATACCAACTCATGTTCACAGCCAAAGCCTGAAGCTGTCTATTATAT
-TTCTCAACCATAAACTTTTGCCTCAGGCATCCGCAGAATGGTTTGCAGCC
-C
->chr5
-NTCTCATTTAAAAATGGTTATAAAAACATTTATGCTGAAAAGGTGAAGTT
-CATTAATGAACAGGCTGACTGTCTCACTATCGCGTTCGCAAGACGTTATC
-T
->chr6
-NAATTGTTCTTAGTTTCTCGGTTTATGTGCTCTTCCAGGTGGGTAACACA
-ATAATGGCCTTCCAGATCGTAAGAGCGACGTGTGTTGCACCAGTGTCGAT
-C
->chr7
-CAACAGAAGGGGGGATCTGTGTTTGTGTTTCGGATTTCCTGCTGAAAAGG
-TTTTCGGGTCCCCCCCCCATCCCGATTTCCTTCCGCAGCTTACCTCCCGA
-AACGCGGCATCCCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCA
-GCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCCAGAGCATA
-CACAACAGAAGGGGGGATCTGTGTTTGTGTTTCGGATTTCCTGCTGAAAA
-GGTTTTCGGGTCCCCCCCCCATCCCGATTTCCTTCCGCAGCTTACCTCCC
-GAAACGCGGCATCCCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGG
-CAGCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCCAGAGCA
-TACA
->chr8
-CACATCGTGAATCTTACAATCTGCGGTTTCAGATGTGGAGCGATGTGTGA
-GAGATTGAGCAACTGATCTGAAAAGCAGACACAGCTATTCCTAAGATGAC
-CCCAGGTTCAAATGTGCAGCCCCTTTTGAGAGATTTTTTTTTTGGGCTGG
-AAAAAAGACACAGCTATTCCTAAGATGACAAGATCAGAAAAAAAGTCAAG
-CA
diff --git a/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta.fai b/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta.fai
deleted file mode 100644
index d5e1a06..0000000
--- a/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta.fai
+++ /dev/null
@@ -1,8 +0,0 @@
-chr1	101	6	50	51
-chr2	101	116	50	51
-chr3	101	226	50	51
-chr4	101	336	50	51
-chr5	101	446	50	51
-chr6	101	556	50	51
-chr7	404	666	50	51
-chr8	202	1085	50	51
diff --git a/src/test/resources/htsjdk/samtools/cram_tlen.fasta b/src/test/resources/htsjdk/samtools/cram_tlen.fasta
deleted file mode 100644
index 01b8f8a..0000000
--- a/src/test/resources/htsjdk/samtools/cram_tlen.fasta
+++ /dev/null
@@ -1,41 +0,0 @@
->chr1
-TTCATGCTGAAGCCCTCTTACGATCGTACAGATGCAAATATTAACAAACC
-TTTAAGGGCAAAAAAAAAACAATACAATAATAGAGTACGTTAACACTCCA
-A
->chr2
-CATCTCTACAAGCGCGTCCTACCAGACGCGCTTCCGATCTGAGAGCATAC
-TTTTCATTGGATTCCAGCACAACTCCATTTTTGATCCACTTGACACCTTT
-T
->chr3
-CGTATGCGCTTTTTATGTCGCCCACAGTGCCTAGTATAGCCCCTGCTAAT
-AAAAAGAGATGAATACGTTTACTTAAAAAACTGAAACTAGGAATGTGCAA
-A
->chr4
-CGTGATACCAACTCATGTTCACAGCCAAAGCCTGAAGCTGTCTATTATAT
-TTCTCAACCATAAACTTTTGCCTCAGGCATCCGCAGAATGGTTTGCAGCC
-C
->chr5
-NTCTCATTTAAAAATGGTTATAAAAACATTTATGCTGAAAAGGTGAAGTT
-CATTAATGAACAGGCTGACTGTCTCACTATCGCGTTCGCAAGACGTTATC
-T
->chr6
-NAATTGTTCTTAGTTTCTCGGTTTATGTGCTCTTCCAGGTGGGTAACACA
-ATAATGGCCTTCCAGATCGTAAGAGCGACGTGTGTTGCACCAGTGTCGAT
-C
->chr7
-CAACAGAAGGGGGGATCTGTGTTTGTGTTTCGGATTTCCTGCTGAAAAGG
-TTTTCGGGTCCCCCCCCCATCCCGATTTCCTTCCGCAGCTTACCTCCCGA
-AACGCGGCATCCCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCA
-GCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCCAGAGCATA
-CACAACAGAAGGGGGGATCTGTGTTTGTGTTTCGGATTTCCTGCTGAAAA
-GGTTTTCGGGTCCCCCCCCCATCCCGATTTCCTTCCGCAGCTTACCTCCC
-GAAACGCGGCATCCCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGG
-CAGCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCCAGAGCA
-CAGCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCCAGAGCA
-TACA
->chr8
-CACATCGTGAATCTTACAATCTGCGGTTTCAGATGTGGAGCGATGTGTGA
-GAGATTGAGCAACTGATCTGAAAAGCAGACACAGCTATTCCTAAGATGAC
-CCCAGGTTCAAATGTGCAGCCCCTTTTGAGAGATTTTTTTTTTGGGCTGG
-AAAAAAGACACAGCTATTCCTAAGATGACAAGATCAGAAAAAAAGTCAAG
-CA
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/cram_tlen.fasta.fai b/src/test/resources/htsjdk/samtools/cram_tlen.fasta.fai
deleted file mode 100644
index 4f7bd29..0000000
--- a/src/test/resources/htsjdk/samtools/cram_tlen.fasta.fai
+++ /dev/null
@@ -1,8 +0,0 @@
-chr1	101	6	50	51
-chr2	101	116	50	51
-chr3	101	226	50	51
-chr4	101	336	50	51
-chr5	101	446	50	51
-chr6	101	556	50	51
-chr7	454	666	50	51
-chr8	202	1136	50	51
diff --git a/src/test/resources/htsjdk/samtools/cram_tlen_reads.sorted.sam b/src/test/resources/htsjdk/samtools/cram_tlen_reads.sorted.sam
deleted file mode 100644
index 0d1947e..0000000
--- a/src/test/resources/htsjdk/samtools/cram_tlen_reads.sorted.sam
+++ /dev/null
@@ -1,19 +0,0 @@
- at HD	VN:1.5	SO:coordinate
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at SQ	SN:chr4	LN:101
- at SQ	SN:chr5	LN:101
- at SQ	SN:chr6	LN:101
- at SQ	SN:chr7	LN:454
- at SQ	SN:chr8	LN:202
- at RG	ID:0	SM:Hi,Mom!	PL:ILLUMINA
- at PG	ID:1	VN:2.0	PN:Hey!
-both_reads_align_clip_marked	83	chr7	1	255	101M	=	302	201	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0
-both_reads_present_only_first_aligns	89	chr7	1	255	101M	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0
-read_2_too_many_gaps	83	chr7	1	255	101M	=	302	201	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0
-both_reads_align_clip_adapter	147	chr7	16	255	101M	=	21	-96	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0
-both_reads_align_clip_adapter	99	chr7	21	255	101M	=	16	96	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0
-both_reads_align_clip_marked	163	chr7	302	255	101M	=	1	-201	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0
-read_2_too_many_gaps	163	chr7	302	255	10M1D10M5I76M	=	1	-201	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0
-both_reads_present_only_first_aligns	165	*	0	0	*	chr7	1	0	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram b/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram
deleted file mode 100644
index 5609d5e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram.bai b/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram.bai
deleted file mode 100644
index db53e08..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram b/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram
deleted file mode 100644
index 5609d5e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram.crai b/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram.crai
deleted file mode 100644
index 309f06f..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram.crai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/empty.bai b/src/test/resources/htsjdk/samtools/empty.bai
deleted file mode 100755
index 237f2e5..0000000
Binary files a/src/test/resources/htsjdk/samtools/empty.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/empty.bam b/src/test/resources/htsjdk/samtools/empty.bam
deleted file mode 100644
index c8de04f..0000000
Binary files a/src/test/resources/htsjdk/samtools/empty.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bai b/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bai
deleted file mode 100755
index 237f2e5..0000000
Binary files a/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bam b/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bam
deleted file mode 100644
index eeb875c..0000000
Binary files a/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/hg19mini.dict b/src/test/resources/htsjdk/samtools/hg19mini.dict
deleted file mode 100644
index 8c844a8..0000000
--- a/src/test/resources/htsjdk/samtools/hg19mini.dict
+++ /dev/null
@@ -1,5 +0,0 @@
- at HD	VN:1.0	SO:unsorted
- at SQ	SN:1	LN:16000	M5:8c0c38e352d8f3309eabe4845456f274	UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/hg19mini.fasta
- at SQ	SN:2	LN:16000	M5:5f8388fe3fb34aa38375ae6cf5e45b89	UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/hg19mini.fasta
- at SQ	SN:3	LN:16000	M5:94de808a3a2203dbb02434a47bd8184f	UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/hg19mini.fasta
- at SQ	SN:4	LN:16000	M5:7d397ee919e379328d8f52c57a54c778	UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/hg19mini.fasta
diff --git a/src/test/resources/htsjdk/samtools/hg19mini.fasta b/src/test/resources/htsjdk/samtools/hg19mini.fasta
deleted file mode 100644
index 038dd84..0000000
--- a/src/test/resources/htsjdk/samtools/hg19mini.fasta
+++ /dev/null
@@ -1,804 +0,0 @@
->1 dna:chromosome chromosome:GRCh37:1:1:16000:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-TAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTA
-ACCCTAACCCTAACCCTAACCCTAACCCAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCTAAC
-CCTAACCCTAACCCTAACCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCC
-TAACCCTAAACCCTAAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCAACCCCAACCCCAACCCCAACCCCAACCC
-CAACCCTAACCCCTAACCCTAACCCTAACCCTACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCC
-TAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCTAACCCTAACCCTAACCCTCGCGGTACCCTC
-AGCCGGCCCGCCCGCCCGGGTCTGACCTGAGGAGAACTGTGCTCCGCCTTCAGAGTACCACCGAAATCTGTGCAGAGGAC
-AACGCAGCTCCGCCCTCGCGGTGCTCTCCGGGTCTGTGCTGAGGAGAACGCAACTCCGCCGTTGCAAAGGCGCGCCGCGC
-CGGCGCAGGCGCAGAGAGGCGCGCCGCGCCGGCGCAGGCGCAGAGAGGCGCGCCGCGCCGGCGCAGGCGCAGAGAGGCGC
-GCCGCGCCGGCGCAGGCGCAGAGAGGCGCGCCGCGCCGGCGCAGGCGCAGAGAGGCGCGCCGCGCCGGCGCAGGCGCAGA
-CACATGCTAGCGCGTCGGGGTGGAGGCGTGGCGCAGGCGCAGAGAGGCGCGCCGCGCCGGCGCAGGCGCAGAGACACATG
-CTACCGCGTCCAGGGGTGGAGGCGTGGCGCAGGCGCAGAGAGGCGCACCGCGCCGGCGCAGGCGCAGAGACACATGCTAG
-CGCGTCCAGGGGTGGAGGCGTGGCGCAGGCGCAGAGACGCAAGCCTACGGGCGGGGGTTGGGGGGGCGTGTGTTGCAGGA
-GCAAAGTCGCACGGCGCCGGGCTGGGGCGGGGGGAGGGTGGCGCCGTGCACGCGCAGAAACTCACGTCACGGTGGCGCGG
-CGCAGAGACGGGTAGAACCTCAGTAATCCGAAAAGCCGGGATCGACCGCCCCTTGCTTGCAGCCGGGCACTACAGGACCC
-GCTTGCTCACGGTGCTGTGCCAGGGCGCCCCCTGCTGGCGACTAGGGCAACTGCAGGGCTCTCTTGCTTAGAGTGGTGGC
-CAGCGCCCCCTGCTGGCGCCGGGGCACTGCAGGGCCCTCTTGCTTACTGTATAGTGGTGGCACGCCGCCTGCTGGCAGCT
-AGGGACATTGCAGGGTCCTCTTGCTCAAGGTGTAGTGGCAGCACGCCCACCTGCTGGCAGCTGGGGACACTGCCGGGCCC
-TCTTGCTCCAACAGTACTGGCGGATTATAGGGAAACACCCGGAGCATATGCTGTTTGGTCTCAGTAGACTCCTAAATATG
-GGATTCCTGGGTTTAAAAGTAAAAAATAAATATGTTTAATTTGTGAACTGATTACCATCAGAATTGTACTGTTCTGTATC
-CCACCAGCAATGTCTAGGAATGCCTGTTTCTCCACAAAGTGTTTACTTTTGGATTTTTGCCAGTCTAACAGGTGAAGCCC
-TGGAGATTCTTATTAGTGATTTGGGCTGGGGCCTGGCCATGTGTATTTTTTTAAATTTCCACTGATGATTTTGCTGCATG
-GCCGGTGTTGAGAATGACTGCGCAAATTTGCCGGATTTCCTTTGCTGTTCCTGCATGTAGTTTAAACGAGATTGCCAGCA
-CCGGGTATCATTCACCATTTTTCTTTTCGTTAACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTAT
-TTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTT
-CATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTG
-GAGAGGAGCCATGCCTAGAGTGGGATGGGCCATTGTTCATCTTCTGGCCCCTGTTGTCTGCATGTAACTTAATACCACAA
-CCAGGCATAGGGGAAAGATTGGAGGAAAGATGAGTGAGAGCATCAACTTCTCTCACAACCTAGGCCAGTAAGTAGTGCTT
-GTGCTCATCTCCTTGGCTGTGATACGTGGCCGGCCCTCGCTCCAGCAGCTGGACCCCTACCTGCCGTCTGCTGCCATCGG
-AGCCCAAAGCCGGGCTGTGACTGCTCAGACCAGCCGGCTGGAGGGAGGGGCTCAGCAGGTCTGGCTTTGGCCCTGGGAGA
-GCAGGTGGAAGATCAGGCAGGCCATCGCTGCCACAGAACCCAGTGGATTGGCCTAGGTGGGATCTCTGAGCTCAACAAGC
-CCTCTCTGGGTGGTAGGTGCAGAGACGGGAGGGGCAGAGCCGCAGGCACAGCCAAGAGGGCTGAAGAAATGGTAGAACGG
-AGCAGCTGGTGATGTGTGGGCCCACCGGCCCCAGGCTCCTGTCTCCCCCCAGGTGTGTGGTGATGCCAGGCATGCCCTTC
-CCCAGCATCAGGTCTCCAGAGCTGCAGAAGACGACGGCCGACTTGGATCACACTCTTGTGAGTGTCCCCAGTGTTGCAGA
-GGTGAGAGGAGAGTAGACAGTGAGTGGGAGTGGCGTCGCCCCTAGGGCTCTACGGGGCCGGCGTCTCCTGTCTCCTGGAG
-AGGCTTCGATGCCCCTCCACACCCTCTTGATCTTCCCTGTGATGTCATCTGGAGCCCTGCTGCTTGCGGTGGCCTATAAA
-GCCTCCTAGTCTGGCTCCAAGGCCTGGCAGAGTCTTTCCCAGGGAAAGCTACAAGCAGCAAACAGTCTGCATGGGTCATC
-CCCTTCACTCCCAGCTCAGAGCCCAGGCCAGGGGCCCCCAAGAAAGGCTCTGGTGGAGAACCTGTGCATGAAGGCTGTCA
-ACCAGTCCATAGGCAAGCCTGGCTGCCTCCAGCTGGGTCGACAGACAGGGGCTGGAGAAGGGGAGAAGAGGAAAGTGAGG
-TTGCCTGCCCTGTCTCCTACCTGAGGCTGAGGAAGGAGAAGGGGATGCACTGTTGGGGAGGCAGCTGTAACTCAAAGCCT
-TAGCCTCTGTTCCCACGAAGGCAGGGCCATCAGGCACCAAAGGGATTCTGCCAGCATAGTGCTCCTGGACCAGTGATACA
-CCCGGCACCCTGTCCTGGACACGCTGTTGGCCTGGATCTGAGCCCTGGTGGAGGTCAAAGCCACCTTTGGTTCTGCCATT
-GCTGCTGTGTGGAAGTTCACTCCTGCCTTTTCCTTTCCCTAGAGCCTCCACCACCCCGAGATCACATTTCTCACTGCCTT
-TTGTCTGCCCAGTTTCACCAGAAGTAGGCCTCTTCCTGACAGGCAGCTGCACCACTGCCTGGCGCTGTGCCCTTCCTTTG
-CTCTGCCCGCTGGAGACGGTGTTTGTCATGGGCCTGGTCTGCAGGGATCCTGCTACAAAGGTGAAACCCAGGAGAGTGTG
-GAGTCCAGAGTGTTGCCAGGACCCAGGCACAGGCATTAGTGCCCGTTGGAGAAAACAGGGGAATCCCGAAGAAATGGTGG
-GTCCTGGCCATCCGTGAGATCTTCCCAGGGCAGCTCCCCTCTGTGGAATCCAATCTGTCTTCCATCCTGCGTGGCCGAGG
-GCCAGGCTTCTCACTGGGCCTCTGCAGGAGGCTGCCATTTGTCCTGCCCACCTTCTTAGAAGCGAGACGGAGCAGACCCA
-TCTGCTACTGCCCTTTCTATAATAACTAAAGTTAGCTGCCCTGGACTATTCACCCCCTAGTCTCAATTTAAGAAGATCCC
-CATGGCCACAGGGCCCCTGCCTGGGGGCTTGTCACCTCCCCCACCTTCTTCCTGAGTCATTCCTGCAGCCTTGCTCCCTA
-ACCTGCCCCACAGCCTTGCCTGGATTTCTATCTCCCTGGCTTGGTGCCAGTTCCTCCAAGTCGATGGCACCTCCCTCCCT
-CTCAACCACTTGAGCAAACTCCAAGACATCTTCTACCCCAACACCAGCAATTGTGCCAAGGGCCATTAGGCTCTCAGCAT
-GACTATTTTTAGAGACCCCGTGTCTGTCACTGAAACCTTTTTTGTGGGAGACTATTCCTCCCATCTGCAACAGCTGCCCC
-TGCTGACTGCCCTTCTCTCCTCCCTCTCATCCCAGAGAAACAGGTCAGCTGGGAGCTTCTGCCCCCACTGCCTAGGGACC
-AACAGGGGCAGGAGGCAGTCACTGACCCCGAGACGTTTGCATCCTGCACAGCTAGAGATCCTTTATTAAAAGCACACTGT
-TGGTTTCTGCTCAGTTCTTTATTGATTGGTGTGCCGTTTTCTCTGGAAGCCTCTTAAGAACACAGTGGCGCAGGCTGGGT
-GGAGCCGTCCCCCCATGGAGCACAGGCAGACAGAAGTCCCCGCCCCAGCTGTGTGGCCTCAAGCCAGCCTTCCGCTCCTT
-GAAGCTGGTCTCCACACAGTGCTGGTTCCGTCACCCCCTCCCAAGGAAGTAGGTCTGAGCAGCTTGTCCTGGCTGTGTCC
-ATGTCAGAGCAACGGCCCAAGTCTGGGTCTGGGGGGGAAGGTGTCATGGAGCCCCCTACGATTCCCAGTCGTCCTCGTCC
-TCCTCTGCCTGTGGCTGCTGCGGTGGCGGCAGAGGAGGGATGGAGTCTGACACGCGGGCAAAGGCTCCTCCGGGCCCCTC
-ACCAGCCCCAGGTCCTTTCCCAGAGATGCCTGGAGGGAAAAGGCTGAGTGAGGGTGGTTGGTGGGAAACCCTGGTTCCCC
-CAGCCCCCGGAGACTTAAATACAGGAAGAAAAAGGCAGGACAGAATTACAAGGTGCTGGCCCAGGGCGGGCAGCGGCCCT
-GCCTCCTACCCTTGCGCCTCATGACCAGCTTGTTGAAGAGATCCGACATCAAGTGCCCACCTTGGCTCGTGGCTCTCACT
-GCAACGGGAAAGCCACAGACTGGGGTGAAGAGTTCAGTCACATGCGACCGGTGACTCCCTGTCCCCACCCCCATGACACT
-CCCCAGCCCTCCAAGGCCACTGTGTTTCCCAGTTAGCTCAGAGCCTCAGTCGATCCCTGACCCAGCACCGGGCACTGATG
-AGACAGCGGCTGTTTGAGGAGCCACCTCCCAGCCACCTCGGGGCCAGGGCCAGGGTGTGCAGCACCACTGTACAATGGGG
-AAACTGGCCCAGAGAGGTGAGGCAGCTTGCCTGGGGTCACAGAGCAAGGCAAAAGCAGCGCTGGGTACAAGCTCAAAACC
-ATAGTGCCCAGGGCACTGCCGCTGCAGGCGCAGGCATCGCATCACACCAGTGTCTGCGTTCACAGCAGGCATCATCAGTA
-GCCTCCAGAGGCCTCAGGTCCAGTCTCTAAAAATATCTCAGGAGGCTGCAGTGGCTGACCATTGCCTTGGACCGCTCTTG
-GCAGTCGAAGAAGATTCTCCTGTCAGTTTGAGCTGGGTGAGCTTAGAGAGGAAAGCTCCACTATGGCTCCCAAACCAGGA
-AGGAGCCATAGCCCAGGCAGGAGGGCTGAGGACCTCTGGTGGCGGCCCAGGGCTTCCAGCATGTGCCCTAGGGGAAGCAG
-GGGCCAGCTGGCAAGAGCAGGGGGTGGGCAGAAAGCACCCGGTGGACTCAGGGCTGGAGGGGAGGAGGCGATCTTGCCCA
-AGGCCCTCCGACTGCAAGCTCCAGGGCCCGCTCACCTTGCTCCTGCTCCTTCTGCTGCTGCTTCTCCAGCTTTCGCTCCT
-TCATGCTGCGCAGCTTGGCCTTGCCGATGCCCCCAGCTTGGCGGATGGACTCTAGCAGAGTGGCCAGCCACCGGAGGGGT
-CAACCACTTCCCTGGGAGCTCCCTGGACTGGAGCCGGGAGGTGGGGAACAGGGCAAGGAGGAAAGGCTGCTCAGGCAGGG
->2 dna:chromosome chromosome:GRCh37:2:1:16000:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-CGTATCCCACACACCACACCCACACACCACACCCACACACACCCACACCCACACCCACACACACCACACCCACACACCAC
-ACCCACACCCACACACCACACCCACACCACACCCACACACCACACACCACACCCACACCCACACACACCACACCCACACA
-CCACACCCACACACACCCTAACCCTAACCCCTAACCCCTAACCCTAACCCTACCCGAACCCTAACCCTAACCCTAACCCC
-TAACCCTAACCCCTAACCCTAACCCTAACCGTAACCCTAACCCTTTACCCTAACCCGAACCCCTAACCCCTAACCCCTAA
-CCCTTAACCCTAACCCTTAACCCTGACCCTGACCCTGACCGTGACCCTGACCCTAACCCGAACCCGAACCCGAACCCCGA
-ACCCCGAACCCCGAACCCCAACCCCAACCCCAACCCCAACCCTAACCCCTCACCCTCACCCTCGACCCCCGACCCCCGAC
-CCCCGACCCCCACCCCGAACCCGACCCCGACCCCGACCCAAACCCTAACCCTAAAACCCTAACCCTAGCCCTAGCCCTAG
-CCCTAGCCCTAACCCCTAACCCCTAACCCTAAGCCGAAGCCTAACTCGTGTCTGACTTTGAGTATTCAGTGCTGCAAACA
-GGAAGTATTTTATTCACCGTCGATGCGGCCCCGAGGGGTCCCAAAGCGAGGCAGTGCCCCCAAACTCTGTCCTGAGGAGA
-ATGCTGCTTCGCCTTTACGGTGTCCACCGGGTGTGTGCTCAGCAAAACGCAGCTCCGCCTTCGCGGTGCCCGTGGCCCAC
-CCGCCCGGGTCTGTGGTGAAGAGAACGCAGCTCCTAGTCGCAAAGGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCG
-CGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGCAGAGAGG
-CGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGC
-AGAGAGGCGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCG
-CAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGCACACAGGCGCACCGCGCCCGCGCAGGCGCACACAGGCGCACCGC
-GCCCGCGCAGGCGCACACAGGCGCACCGCGCCCGCGCAGGCGCACACAGGCGCACCGCGCCCGCGCAGGCGCACACAGGC
-GCACCGCGCCCGCGCAGGCGCACAGAGGGTCGCTGGGCAGGGGTTGGGGGTCGTACTGCAGGTGCACAGCTGCATAAGCG
-CACAGTCGCAAGCCGCCAGGCGCGGAGCGTGGGGGTGGCGGGGTGCAGGCGCAGAGACGGACGTCCCCGGGGGCGCGGCA
-CAGAGACAGGTGGAACCTCAATAATCCGAAAAGCCGGGCTCGGGAACCCCCTGCTTGCAACCGGGCACTACAGGATCCGC
-TTGCCCACGGTGCTCTGCCAGTGCGCCCCTTGCTGGCCACTAGGGCAACTGCAGGGCTATCTTGCTTACAGTGGTGTCCA
-GCGCCCTCTGCTGGCGTCGGAGCATTGCAGGGCTCTCTTGCTCGCAGTGTAGTGGCGGCACGCCGCCTGCTGGCAGCTAG
-GGACATTGCAGAGCCCTCTTGCTCACAGTGTAGTGGCAGCACGCCCGCCTCCTGGCAGCTAGGGACAGTGCCAGGCCCTC
-TTGCTCCAAGTGTAGTGGCAGCTGGCTCCCCCGCTGGCAGCTGGGGACACTGACGGGCCCTCTTGCTTGCAGTATAGTCG
-TCGCACGCCTTCTGGCCGCTGGCGGCAGTACAGGATCCTCTTGCTCACAGTGTAGGGCCCTCTTGCTCCCGGTGTGACGG
-CTGGCGTCCCCTACTGGCCGCCTCCTGCACCAATTAAAGTCGGAGCACCGGTTACGCCCCATCACTTCTGTAAATTCAAA
-CTGAAACGGAGCTATTAGTGGGGAGAGCTGATGTCCCAGTTCTTGTTTAACTTGGAAGAAAGATTTTCACCAAGAGGCAG
-TACAAAGATGACAGATAACTTCATTGAAAAGAAATACAGTGTAAACACCTTACTGTAGAAAAATAGGGAGGACAGGGCTG
-ATCGTGCATGAAAACAGCCTAAGAGTCTTGTGCAGGGAAGTTACTCTAACTGTAACTTACAACAACTTAGTAGATTATAC
-TTTTGTAAACAGAAGTGAAGCATTTATCTTTTTTCTTGCTTGATTATTTACATAATCAAGCAAAATCTAACAAAACAATA
-ATATTTTAACAATAATATTTTTAAAACAATAATAGTCTTACTTTGATTATGATCAAAAATGATGGTTACTACAGAGAGAA
-TTTTTATGTTTCAATGGAAAAGTATAACATGGCCAGGCATGGTTGCACATGCCTATAATTACAGCACTTTGGGAGGCCAG
-GAGTTCAACATCAGCCTGGGCAACATGGTGAAACCACGTCTCTACCAAAAATACAAAAATTAGATGGGCATGGTGGCATG
-TGCCTGTAGTCCCAGGTAATCAGGAGGCTGAGGAGGGAGGATCGTTTGCACCCGGGAAGTAGAGGTTGCAGTGAGCTGAG
-ATTGCACCTTTGCACTCCAGCCTAGGCGACAGAGCCAGATCCTGTCTCAAAAAAAATTTTTTTAAAGGAAAACTACAGCC
-ATTGTGGGTTATCAGATTCTAGTCTTGTTTCTTGTTTCTGGGCTATTTTTACCTCTTTGTAAACTGCATCCTGCCATCTG
-ATGAATTTTGTCCCACAATGATACTTGGGGAACAAGAAGCCAATTATTGTCTCTCCTACTAATGTATCTATTGTCAGTTA
-ATTTGAAGGTCTCCAACCCTGGAACAAAGTTAGAAGAGGAAGGTTCTGCTCCCCAAAATGCATAACCAAATTGTGGTACA
-TTCATGTAATGGAACACTATTTAGCCATAGAAACGAACAAGCTATCAACTCACACAAAGACATGAGTGAATCTTGCATGC
-ACATTGCTAAGTGGAAGAAGACAGTCTGAGGAGGATACACACAGTGTGACCTCATTTAATGAGACACTGGAGAAGGCAAA
-CTACACAGATGGGAAGCCATTGGCTCCATGGGGTGGGGGTTTGAAGCATTCCATATGATACTTTAATAGTGGGATATCTG
-CCACAATGCATTTGTCAAAATATGCAGAATTTTACAGCCATATGGTTAGAGCAAACTCTATTCAAATTAAATAAAATTAC
-TCAGGATGTGGAGTATCCCAGGACAGAATACATCATGTGAAAAAGCATTTATGCTACAAATTACTATGGTAATTATGCTA
-CAAATTTATGGTACCATAAATTACCATAGTAATTTGTAGCATAAATTTGTACTATGGTACAAATTACATGGGAGAGTGAA
-GGTGGGTTAAAACATTCATATTAAAGAACTTCCACTCAGATTGCAAGAAAAGAGAGAGGAATGGAGATGGTAGCACAAGT
-CCCTACAATAAAAGTAGATGTTTTGAGATCAGTTCTATTTGTTCTGACAAAAATTAAAGACAGAAACCAAAGTTTAGCCT
-GAGGCAACAATTAGTTGGGGAATAAGCCAGAGGCATATATGGCATAGACACATTTAAACATTTCTCTCATATTAATACAA
-ATACTAAAATGACATATCAATTGATTCCAAATAAAACAAATATTTAAAACATTTAATGAATAAACACTGGGGTCTACAGT
-AGTAGTTAAAGGAGATCTCACAAACAGGTTTGGTTTTTGAAGGTTAGAAATGATGGTCTAGAGAATTCATTTCATTCCAG
-AGACAGAAAGAGGAATATCTTGGGTTCCTTCAGGAATACATCTGGCTTTGCCTCATCTTTGTGTGTTTGAACTATGCATA
-CGGCAGAAGAAAACATGGGGGTTTCAGAGTTTTTTTTTTTTTTGAGACAGAGTCTTGCTCTGTTGCCCAGGCTGGAGTGC
-CGTGGTGTTATCTCGCCTCACTGCAACCTCTGCCTTCTGGGTTCACACCATTCTCCTGCCTCAGCCTCCGGAGTAGCTGG
-GACTACAGGTGCACCACACCTGGCTACTTTTTCTGTATTTTTTAGTAGAGATGGGGTTTCACCATGTTAGCCAGAATGGT
-CTAGTTCTCCTGACCTTATGATCCAACCGCCTCAGCCGCCAAGAATGATGGGATTACAGGGGTGAACCACCACGCCCGGC
-TAAGGATTTCACAGATTTAAGGTGCTAAAATCACTGGGTTCTCTAAGAAGCCTGGGATTCTTCTGCTGGAAAAATAAGTT
-TGTTGAGAAAAATGAGTTGGAGGAGGTTGTTATTGAAGTGAAGCAGAATTGTTTTTACTAATCTGCTTATTACCCACTCT
-GAAGTGTGGAAACAAATTTTTCATGCACAAGGTCATCTTACTGTTACTGGAATGCAGTGGAAAGAGAACAGATTAGTTTT
-TCTCTCTCAGAACACAACCACTAGAAACGTCCTATGTCAGATGAGATATTGCCCAGTTATTTTCAAAAGACTGAAAAATC
-CTGGATGTAAATGTTTGCTGCAAAATAAATACATGCTAGAAACAGAAGCATCTGGGTCACAGCTATATTAGAGCTACCTG
-TGTTCCCCTGTTACTGAGATTAAAACAAAAATGTCCAATAAAAATCATTCACAGTGTGGGAGAGGGGAAGTTGAAGGATG
-GAAAGGCCAGGCATAAAAAGATTTCAGAATTTCAGTCCATAAGGAAGTTGCTTTGTGCATTGTCTGTTGCTGTGTGCAAG
-GTGAAGGCTGGGGCAAGAAAACGTGCAGTAACAAGGGCTCCTTTGTCCATCTCACCTCTCTAGATACCAAGTTTCAGACA
-TGTTGCATTTTAATTGAAAAGTTGATATAACTTTTTTTAAAAGAATACTTGCAGTGCTTGAAGTGTAAAAAGCTGCTGTG
-ACAAAAAAAAAAGCAGGGAAAGGGATTTTTTTTAAAAAAGCAAACAGCAACAATAAAAAACCCACAAACAACAAATAACA
-AACAAAAAAACAGAGGAAGAAGTCGAAACACCCTGGGCTGAGACTATTTCCAGGAAGGGGCTACGAAAGGCAGTTGGAAA
-TTCCATTTTCTTTGCAACTGTGGGTTTTCTGGCCTGCTTCCTTTCTAAAGTATATTACTTTCTTTTTGGTTCATGAAGTT
-ATCCCTTTGTGTCTTCTGGAACAGCTATGTATTTTCTTTATCTATCATCTAGCTACCTGCCTATCATCTATCTGTCTTTT
-CTGCCTTTTGCTATCAAAAGCTTGGGTCAAGCAGGATAGAATTCCAGTGTATGTTCACTCTACCATTTAAAACAAGAGCT
-CTTGTAGGCATTCTTCATCACATCACAAACCTGAGCTTTCTAAAACAGGGTGTGGCAAACTACCATGCATGGGCCATGTC
-TGACACAGTCTGCATTTGTAAGTAAAGTTGTATTGGGACAAAGCCACATAGATGTGTTATATAACATCTCTGGCTACTTT
-CATAGTACAATGGAAGAGCTGAGTCATTGAGACAGAGACCACATGGCTTGGAAAACTTAAAATATTTAACATTTTGCCCT
-TTGCAGAAAATACTTGCTAACTCTTGTTTTAAAAGATCTTTGTTTAGAATGCTACCTGTTGCCTTCTGGGTAGAATCACA
-ACTATATACCACAATAGACACAACTTGAACCCTGCTTCTATATCCAGCCTCATCTATTATTTCCTCTCCTTCTTATTTTC
-CTTCTGGCCGTGCTGATGGATTGTCAGCTTCCCAGATGTGCGAGAATCTCTCCTCCCTTCCCCACATTCTCATGCTCTCC
-CTCTGCCTCTGGAGAACTACCTGCCCCATCTCTCATGATAAATCCTTTCTTCATTCTTTATGTTGCAGCCCCTTTGCTCC
-TTCCTTAAGGATGTCTATCTGGCTCTATTTTGGGTGACATGCTCCTTCTGCATCTCCCAGAGCCAGCCTGTGTGTGTCAG
->3 dna:chromosome chromosome:GRCh37:3:1:16000:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
->4 dna:chromosome chromosome:GRCh37:4:1:16000:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-ACCCTAACCCTAACCCTAACCCTAACCCTAACCCTACCCTAACCCTAACCCTTAACCCTTAACCCTAACCCTAACCCTAA
-CCCTAACCCTAACCCTAACCCTAACCCTAACCCTACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCC
-TAACGCTAACCCTAACCCTAACCCTAACCCTAACCCTCATTATTCTCGGCTGCAAAGAGGAAGGATCTTTACCGTGGATG
-TGGCCCCCAGTTGTCCCAAAATGAAGCAGTGCCCCCAACGTCTGTGGAGAGGCATGCGCTGCTCCACCTTCGGGATGTCC
-CCCGCGTCTGTGCTGAGCAGAATGCAGCTCCGTTATCGCGTTCCCCCCGAAGTCTCTGCAGAGGAAAACGGAGCTCCTCC
-TTCGCGATGCTCTCCAGGTCTGCGCTGAGGAGAACGCAGCTCCGCCCTCGCAAAGGCATAGCGCCATCGCAGGCGCAGAA
-AAAAACGTCGGTGCAGCGCAGGCGCAGAGAAAAACGACGGCGCGTCCCTGGGGGGCGCGGCGCAGGCCCAGAGAGGCATG
-CCACCGTTGCGCCGGGGCGTGGGCGCGGCGCAGACGCAGAGACGCACGCCGGCGCAGCGCCGGGATGGGAGCGCGGCCCA
-GGCGCAGACACGGACGGCAGCGTGGCGCCTGGCCGGAGGCGCGACGCAGGCCCAGACACACACGGCGGCGCGGCGCCATG
-ATGGGACCCCGCGCAGGCGCACAGACGGATGGTGGCGCGGCGCAGGCGCAGTAGAAAAACGCCAGCGCGGTGCGGGGGGC
-GCGGCGCAGGCACAGGCGCAGAGACGGACGCCGACGGGGCGCAGGCGCAGAGACGGACGCCGCCGGGGCGCAGGCGCAGA
-GACGGACGCCGCCGCGGCGCAGGCGCAGAGACGGACGCCGCCGCGGCGCAGGCGCAGAGACGGACGCCGCCGCGGCGCAG
-GCGCAGAGACGGACGCCGCCGCGGCGCAGGCGCAGAGACGGACGCCGCCGCGGCGCCGTGGCGGTGGCAAGAGTCACGCG
-GAGAGATGCACGGCTGCGTGGCGCAGGCGCAGAGAAAAACGCCGGCGCGTCCCCTATGGGCGCGGCGGAGGCCCAGAGAC
-GCACGCCGGCGCGGCGCCGGGGCGGGGGTCGGGGCGCAGGCGCAGAGAAAAACGCCGGCGCGGCGCCGGGGCGGGGGTCG
-CGGCGCAGGCGCAGAGACCCACGCCGGGGCGGGGGCGCGGCGCAGGCGCAGACACGCACGCCGGGGCAGGGGCGCGGCGC
-AGGCCCAGAGACGCACGCCGGCGCGGCGCCGGGGCGGGAGCTCCGCGCAGGGGCAGAAAAGGACGCTGGCGCGGCGCAGG
-CGCAGAAAAAAAATGGCGGCGCAGCGCAGGCGCCGAGAAAAGCGCCAGCGCCGGGGGTCGCGGCGCAGGCGCAGAGAAAA
-ACGCCAGCGCGGCGCCGGCGCAAAGACGGGCGCAGGCGCAGAGTCGGGCGCTGGCGCGTCGCCGAGGTGGGGGCGCGATG
-CACGCGCAGAGACGCACGGCTGCGTGGCGCAGACGCAGAGAAGAACGCGAGCGCGGCGCCGAGGACAAGGCGCAGGCGCG
-GAGACGCACGCCAGCGCGGGGGCGAGGCGCAGGCGCGGAGATGCACTCCGCCAGGCGCGGGGAGGGGGGCGCGGCGCAGG
-CGCAGTGACGCACGCCGCCTGGGGCGCAGCGCAGAGACAGGCGGAACCTCAGTAATCTGAAAAGCCAGGTTGCCCCCTCC
-TTGCGGCCGGGCACTAAAGGGCCCACTTGCTGAAGGCGCTGTGCCAGCGTGCCCCCTGCTGGTGACTGGGGCAACTGCAG
-GGTTCTCTTGCTTCCATTAGTGGCCAGCGGCCCCTGCTGGCGGCGGGGCACCGCAGGGTCCTCTTGCACACAGTATAGTG
-GCGGCATGCCGCCTGCTGGCAGCTGGAGACATTGCAGGGCTCTCTTGCTCATAGTATAGTGACAGGACGCCCGCCTGCTG
-GCAGCTGGGGACACTGCCGGCCACTCTTGCTCCAAGTGTAGTGGCTGTTGGCTCCCCTGCTGGCAGCTGGGGACACTGCC
-GGGCCCTCTTGCTTGCAGTTTACTGGGGGCACGCCCCCTTCTGGCCGCTTGGGGCACTACAGGATGCTCTTGCTCACAGT
-GTAGTGGCAGCTCGCCGCCTGCTGGCAACCAGGGTACTGCAGGGTTCTCTTGCTCATGGTGTGGTGCCCGTCCACCACCT
-GCTGGCAGCTAAGGACACTGCAGGGCCCTCTTGCTCAGAGTGTAGTCGTCGTACACCCCCTGCTGGCAGCTGGGGACGCT
-GCCGGGACTTTTCCTGGCACTGTCGTGGCAGCACACTACCTGCAGGCAGATGGGGACTATGCAGGGACCTCTTGTTCAGG
-GTGTGAGGGCTGGCACGCCCTACTGGCCGCCTCCTGCACCACTTAAAGTCGGAGCGCCAGTTAAGCACCATCAGTTCTGG
-AAATTGAAACTGAAATGGAGCTATTACTGAGGAGAGTTGATGTCCCAGTTCTTGTCTAACTTGGAAGAAAGATTTTTCAC
-CAAGAGGCAGTAAAAACATGGCAGATAACTTCATTGAAAACAAATACAGTGTAAAGAGCTTATTGTAGAATAATAGGGAG
-GAGTGGGCTGATTGTGCAGGAAAACAGCCTGAGAGTCCTGTGCAGGGAATTTTATTTTGGACTTCTTCACATTTCTGCCT
-CTGTCTCAAGTCTCCACCTGTTTTCTTTGTCTGGTTTTCCTGCTACTGCCTTAGGTCCCTGAGTTGCCCCACTTAGGCTT
-ATGGGACCTCCTCACTGTTGGTTGAGGCACATGTGTGCTGATCAATCCGAATCCACTCTGGTACCAGGCTCCTTCCCCCC
-ATCCCAGGCAGGCTGACAGCGGTCATGTTTCTGCCTACAGCGCCTGCCTATCTCTTTTGAATGTCCTTCTCTACACTACT
-CTGTACTTATGGTGCCAGGTTTCTCTTAAGAATGTCCCCTTTGTCCTTCTTATCAGCATGTAGCCAGCAATATTGTGACA
-TTTTTACTGCAGAGTGAATGATGACTGGGGCATCTTAAATGGAGTTCTGGGGTGTTTCTTTCTGCATAGGTACCTCTGCA
-GTAGTAGTTTCCAAAATACTTTTGGTAATTTTTAACCTTAAAGTTAACCTTAAAGTTAAGCTAAGTAAAAGATTTGCATT
-AAATATCTAGACCATTTATAAATAAGATACAATACTAAAACATTACTGAAGATAAATAATTCTAGTTTACATACTTTTGG
-CTACTTATTTTTACAGAGAAACTAAAGATATTTTAGCCCATTAATAAACATGTTTTTGTCTACCACACTGAGAAATTGTA
-CTATGAGGAAACACATCCCTCTAGATGTTGGGAGATGGTATACTCATACATTTTCTAACCTACTATAGAATGCTAACATA
-TGACAGTTTATAACTGTCTACTTCCTAGTTTTCTCTGGAAAATAAAAGATTACTAAGTATTAAAATTATAATCAATATGT
-GTAAATAAAACTACTGGAAATAATAGAATAACTAGAAACAACTCTATGCAAAGCATGCAAGAAAAGTAGTGCATGTTTTG
-CAAGTAAAGTAGGACGTATTTTTTATAAGGAAAACCATACAAAAGATACAAATAAAAAGAGATACCTAGCCTTCCCTGTG
-TTATATTTGTATGGGTAAAATGTCATGTTTTCAGAAATTATATAAAATTCCTGGAAATTTGTCAATGTTCTCCTTATCCA
-TGCTATGTGCCAGTATAGAGTTATGAGTCATAATTCCAATTATTATTTTAAATGTTGTGCTGGGTGCAGTGGCTCACGTC
-TGTAATCCCACCACTTTGGGAGGCCTAGGCAGGTGGATCACAAGGTCAGGAGATCGAGAACATCCTGGCTGACATGGTGA
-AACCCCATCTCTACTAAAAATACAAAAAATTAGCCAGGCGTGGTGGTGGGCACCTGTACTCCCAGCTACTCAGGAGGCTG
-AGGCAGGAGAATGGCATGAACCAGGGAGGCAGAGCTTGCAGTGAGCCAAGATAGCGCCACTGCACTCCAGCATGGGCAAC
-AGAGCGAGACTCTGTCTCTAAATAAATAAATAAATAAATAAATAAATGTTTTATCCCACAGAAAAAATCGAATATCCTTG
-TCAGTTGTGGTATAATGAACTCTCATCAGATCTTTCATCACAGCCATTTCATATTCTTTATCATTTAGATATTATTTCCC
-CCTGATGCTTTCCTGAAAGCTCCTGCAATCAGCTACAGGTCAGAATGTTCATCTCCATCACGGGACTCCCTCTGAGACAC
-ACAGAAAAGAGTATGCAAGATAGTCTGGTTATAGGCTTCTGATGATATTGCTTAAATAACTTTAAGACCATACACTTCGC
-TCAGTGAAGATCTCCAGAAGTCTGCTTCAGAAATTGATGGGTTCATGACACTGCTAACCCAAGATGCAACAAGACTGGAA
-TTGATTACATGGTACTGAATGAACTGATGAAAATTGATTATAATTTTATAGCTTTTTGGAGCATTGCTGGTTCTTTAATG
-TTCTAGTTTCTGGACTTAAGAAATCTCTTTCTCTTAACCTAACTGTAACATACAATTTAGTAGATTATACTTTTGAAAAC
-AGAAGTGAAGCATTTATCTTTTTTCCCCTGCCTGATTTTTCCAGAATTTTGAAATCCTTACTGAACACTCTTATTTTCAC
-GATGATATAGTTGTTAGCAAAAGTCCAATAAGAATCTGTTCACCTTGAACAGAGACCTCAGAAATAATGCCGCATATCTA
-CAACCATCTGATCTTTGACAAACCTGACAAAAACAAGCAATGGGGAAAGGATTCCCTATTTAATAAATGGTGCTGGGAAA
-ACTGGCTAGCCATATGTAGAAAGCTGAAACTGGATCCCTTCCTTACACATTATACAAAAATTAATTCAAGATGGATTAAA
-GACTTACATGTTAGACCTAAAACCATAAAAACCCTAGAAGAAAACCTAGGCAATACCATTCAGGACATAGGCATGGGCAG
-GGACTTCATGTTTAAAACACCAAAAACAATGGCAACAAAAGCCAAAATGGACAAATGGGATCTAATTAAACTAAAGAGCT
-TCTGCACAGCAAAAAAAAACCTACTGTCAGAGTGAACAGGCAACCTACAAAATGGGAGAAAATTTTCACAACCTACTCAT
-CTGACAAAGGGCTAATATCCAGAATCTACAATGAACACAAAGAAATTTACAAGAAAAAAACAAACAACCCCATCAAAAAG
-TGGGCGAAGGATGTGAACAGACACTTCTCAAAAGAAGACATTTATGCAGCCAAAAGACATGTGAAGGAATGCTCATCATC
-ATTGGCCATCAGAGAAATGCAAATCAAAATCACAATGAGACACCATCTCACACCAGTTAGAATGGCGATCATTAAAAAGT
-CAGGAAACAACAGGTGCTGGAGAGGATGTGGAGAAATAGGAACACTTTTACACTGTTGGTGGGACTGTAAACTAGTTCAA
-CCATTGTAGAAGATGGTGTGGCGATTCCTCAGGGATCTAGAACTAGAAATACCATTTGACCCAGCCATCCCATTACTTGG
-TATATACCCAAAGGAGTATAAATCATGCTGCTATAAAGACACATGCACACGTATGTTTATTGCGGCACTATTCACAATAG
-CAAAGACTTGGAACCAACCCAAATATCCAACAATGATAGACTGGATTAAGAAAATGTGGCACATATACACCATGGAATAC
-TATGCAGCCATAAAAAATGAAGAGTTCATGTCCTTTGTAGGGACATGGATGAAACTGGAAACCATCATTCTCAGCAAACT
-ATCACAAGGACAAAAAAACCAAACACTGCATGTTCTCACTCATAGGTGGGAATTGAACAATGAGAATACATGGACATGGG
-AAGGGGAACATCACACTCCAGGGACTGTTGTGGGGTGGGGGGGAGGGGGGAGGGATAGCATTAGGAGATATACCTAATGC
diff --git a/src/test/resources/htsjdk/samtools/hg19mini.fasta.fai b/src/test/resources/htsjdk/samtools/hg19mini.fasta.fai
deleted file mode 100644
index 2a20cf3..0000000
--- a/src/test/resources/htsjdk/samtools/hg19mini.fasta.fai
+++ /dev/null
@@ -1,4 +0,0 @@
-1	16000	48	80	81
-2	16000	16296	80	81
-3	16000	32544	80	81
-4	16000	48792	80	81
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTest.vcf b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTest.vcf
deleted file mode 100644
index 39bed22..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTest.vcf
+++ /dev/null
@@ -1,53 +0,0 @@
-##fileformat=VCFv4.1
-##ApplyRecalibration="analysis_type=ApplyRecalibration input_file=[] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null do [...]
-##CombineVariants="analysis_type=CombineVariants input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null use [...]
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=VQSRTrancheINDEL99.00to99.90,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -4.1718 <= x < -0.8611">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00+,Description="Truth sensitivity tranche level for INDEL model at VQS Lod < -727.2136">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -727.2136 <= x < -4.1718">
-##FILTER=<ID=VQSRTrancheSNP99.00to99.90,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -25.4561 <= x < 3.2489">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00+,Description="Truth sensitivity tranche level for SNP model at VQS Lod < -38672.7015">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -38672.7015 <= x < -25.4561">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth (reads with MQ=255 or with bad mates are filtered)">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=PL,Number=G,Type=Integer,Description="Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification">
-##FORMAT=<ID=TP,Number=1,Type=Integer,Description="Phred score of the genotype combination and phase given that the genotypes are correct">
-##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=BaseQRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt Vs. Ref base qualities">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth; some reads may have been filtered">
-##INFO=<ID=DS,Number=0,Type=Flag,Description="Were any of the samples downsampled?">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=END,Number=1,Type=Integer,Description="Stop position of the interval">
-##INFO=<ID=FS,Number=1,Type=Float,Description="Phred-scaled p-value using Fisher's exact test to detect strand bias">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with at most two segregating haplotypes">
-##INFO=<ID=InbreedingCoeff,Number=1,Type=Float,Description="Inbreeding coefficient as estimated from the genotype likelihoods per-sample when compared against the Hardy-Weinberg expectation">
-##INFO=<ID=MLEAC,Number=A,Type=Integer,Description="Maximum likelihood expectation (MLE) for the allele counts (not necessarily the same as the AC), for each ALT allele, in the same order as listed">
-##INFO=<ID=MLEAF,Number=A,Type=Float,Description="Maximum likelihood expectation (MLE) for the allele frequency (not necessarily the same as the AF), for each ALT allele, in the same order as listed">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=MQRankSum,Number=1,Type=Float,Description="Z-score From Wilcoxon rank sum test of Alt vs. Ref read mapping qualities">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=RPA,Number=.,Type=Integer,Description="Number of times tandem repeat unit is repeated, for each allele (including reference)">
-##INFO=<ID=RU,Number=1,Type=String,Description="Tandem repeat unit (bases)">
-##INFO=<ID=ReadPosRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt vs. Ref read position bias">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##INFO=<ID=STR,Number=0,Type=Flag,Description="Variant is a short tandem repeat">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##INFO=<ID=set,Number=1,Type=String,Description="Source VCF for the merged record in CombineVariants">
-##PhaseByTransmission="analysis_type=PhaseByTransmission input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog= [...]
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/humgen/gsa-hpprojects/NA12878Collection/bams/CEUTrio.HiSeq.WGS.b37.list] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=[/broad/hptmp/ami/tmp/queueScatterGather/.qlog/CEUTrio.indelcall-sg/temp_020_of_300/scatter.intervals] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_s [...]
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA12878	NA12891	NA12892
-1	8216712	rs11121115	A	G	1540.26	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=0.917;DB;DP=131;Dels=0.00;FS=11.67;HaplotypeScore=3.35;MLEAC=3;MLEAF=0.500;MQ=57.74;MQ0=1;MQRankSum=0.427;QD=11.76;ReadPosRankSum=-2.190e-01;SB=-9.390e+02;VQSLOD=5.53;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0/1:23,28:51:99:681,0,668:127	0/1:16,18:34:99:338,0,244:127	0/1:24,22:46:99:560,0,323:127
-1	17032814	rs2773183	T	C	2828.26	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0/1:63,59:122:99:1434,0,1831:127	0/1:53,56:109:99:910,0,871:127	0/1:61,30:91:99:523,0,1257:127
-1	17032818	rs2773183	T	C	2828.26	FILTER	AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0/1:63,59:122:99:1434,0,1831:127	0/1:53,56:109:99:910,0,871:127	0/1:61,30:91:99:523,0,1257:127
-2	1143476	rs4998209	C	T	1483.26	PASS	AC=2;AF=0.333;AN=6;BaseQRankSum=-4.814e+00;DB;DP=189;Dels=0.00;FS=5.61;HaplotypeScore=0.324;MLEAC=2;MLEAF=0.333;MQ=58.36;MQ0=0;MQRankSum=1.58;QD=12.06;ReadPosRankSum=0.326;SB=-9.320e+02;VQSLOD=6.81;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0|0:66,0:66:99:0,178,2264:127	0|1:33,38:71:99:844,0,1024:127	0|1:26,26:52:99:678,0,719:127
-2	9240279	rs56249990	A	G	3978.01	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=1.70;DB;DP=213;Dels=0.00;FS=7.83;HaplotypeScore=1.19;MLEAC=3;MLEAF=0.500;MQ=59.40;MQ0=0;MQRankSum=0.143;QD=27.25;ReadPosRankSum=-9.700e-02;SB=-1.991e+03;VQSLOD=9.14;culprit=FS	GT:AD:DP:GQ:PL:TP	0|1:33,42:75:99:1400,0,1031:127	0|0:67,0:67:99:0,178,2277:127	1|1:0,71:71:99:2578,199,0:127
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list
deleted file mode 100644
index aad2820..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list
+++ /dev/null
@@ -1,7 +0,0 @@
- at SQ	SN:1	LN:249250621
- at SQ	SN:2	LN:243199373
- at SQ	SN:3	LN:198022430
-1	8216712	8216712	+	rs11121115
-1	17032814	17032814	+	rs2773183
-2	1143476	1143476	+	rs4998209
-2	9240279	9240279	+	rs56249990
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverse.interval_list b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverse.interval_list
deleted file mode 100644
index 9bcca99..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverse.interval_list
+++ /dev/null
@@ -1,10 +0,0 @@
- at SQ	SN:1	LN:249250621
- at SQ	SN:2	LN:243199373
- at SQ	SN:3	LN:198022430
-1	1	8216711	+	interval-1
-1	8216713	17032813	+	interval-2
-1	17032815	249250621	+	interval-3
-2	1	1143475	+	interval-4
-2	1143477	9240278	+	interval-5
-2	9240280	243199373	+	interval-6
-3	1	198022430	+	interval-7
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverseManual.interval_list b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverseManual.interval_list
deleted file mode 100644
index de85ca5..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverseManual.interval_list
+++ /dev/null
@@ -1,10 +0,0 @@
- at SQ	SN:1	LN:249250621
- at SQ	SN:2	LN:243199373
- at SQ	SN:3	LN:198022430
-1	1	8216711	+	interval-1
-1	8216715	17032813	+	interval-2
-1	17032815	249250620	+	interval-3
-2	3	1143475	+	interval-4
-2	1143477	9240278	+	interval-5
-2	9240280	243199373	+	interval-6
-3	1	198022430	+	interval-7
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManual.vcf b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManual.vcf
deleted file mode 100644
index f9ec538..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManual.vcf
+++ /dev/null
@@ -1,57 +0,0 @@
-##fileformat=VCFv4.1
-##ApplyRecalibration="analysis_type=ApplyRecalibration input_file=[] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null do [...]
-##CombineVariants="analysis_type=CombineVariants input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null use [...]
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=VQSRTrancheINDEL99.00to99.90,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -4.1718 <= x < -0.8611">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00+,Description="Truth sensitivity tranche level for INDEL model at VQS Lod < -727.2136">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -727.2136 <= x < -4.1718">
-##FILTER=<ID=VQSRTrancheSNP99.00to99.90,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -25.4561 <= x < 3.2489">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00+,Description="Truth sensitivity tranche level for SNP model at VQS Lod < -38672.7015">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -38672.7015 <= x < -25.4561">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth (reads with MQ=255 or with bad mates are filtered)">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=PL,Number=G,Type=Integer,Description="Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification">
-##FORMAT=<ID=TP,Number=1,Type=Integer,Description="Phred score of the genotype combination and phase given that the genotypes are correct">
-##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=BaseQRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt Vs. Ref base qualities">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth; some reads may have been filtered">
-##INFO=<ID=DS,Number=0,Type=Flag,Description="Were any of the samples downsampled?">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=END,Number=1,Type=Integer,Description="Stop position of the interval">
-##INFO=<ID=FS,Number=1,Type=Float,Description="Phred-scaled p-value using Fisher's exact test to detect strand bias">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with at most two segregating haplotypes">
-##INFO=<ID=InbreedingCoeff,Number=1,Type=Float,Description="Inbreeding coefficient as estimated from the genotype likelihoods per-sample when compared against the Hardy-Weinberg expectation">
-##INFO=<ID=MLEAC,Number=A,Type=Integer,Description="Maximum likelihood expectation (MLE) for the allele counts (not necessarily the same as the AC), for each ALT allele, in the same order as listed">
-##INFO=<ID=MLEAF,Number=A,Type=Float,Description="Maximum likelihood expectation (MLE) for the allele frequency (not necessarily the same as the AF), for each ALT allele, in the same order as listed">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=MQRankSum,Number=1,Type=Float,Description="Z-score From Wilcoxon rank sum test of Alt vs. Ref read mapping qualities">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=RPA,Number=.,Type=Integer,Description="Number of times tandem repeat unit is repeated, for each allele (including reference)">
-##INFO=<ID=RU,Number=1,Type=String,Description="Tandem repeat unit (bases)">
-##INFO=<ID=ReadPosRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt vs. Ref read position bias">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##INFO=<ID=STR,Number=0,Type=Flag,Description="Variant is a short tandem repeat">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##INFO=<ID=set,Number=1,Type=String,Description="Source VCF for the merged record in CombineVariants">
-##PhaseByTransmission="analysis_type=PhaseByTransmission input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog= [...]
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/humgen/gsa-hpprojects/NA12878Collection/bams/CEUTrio.HiSeq.WGS.b37.list] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=[/broad/hptmp/ami/tmp/queueScatterGather/.qlog/CEUTrio.indelcall-sg/temp_020_of_300/scatter.intervals] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_s [...]
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA12878	NA12891	NA12892
-1	8216712	rs11121115	A	G	1540.26	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=0.917;DB;DP=131;Dels=0.00;FS=11.67;HaplotypeScore=3.35;MLEAC=3;MLEAF=0.500;MQ=57.74;MQ0=1;MQRankSum=0.427;QD=11.76;ReadPosRankSum=-2.190e-01;SB=-9.390e+02;VQSLOD=5.53;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0/1:23,28:51:99:681,0,668:127	0/1:16,18:34:99:338,0,244:127	0/1:24,22:46:99:560,0,323:127
-1	8216713	yossi-1	A	G	1540.26	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=0.917;DB;DP=131;Dels=0.00;FS=11.67;HaplotypeScore=3.35;MLEAC=3;MLEAF=0.500;MQ=57.74;MQ0=1;MQRankSum=0.427;QD=11.76;ReadPosRankSum=-2.190e-01;SB=-9.390e+02;VQSLOD=5.53;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0/1:23,28:51:99:681,0,668:127	0/1:16,18:34:99:338,0,244:127	0/1:24,22:46:99:560,0,323:127
-1	8216714	yossi-2	A	G	1540.26	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=0.917;DB;DP=131;Dels=0.00;FS=11.67;HaplotypeScore=3.35;MLEAC=3;MLEAF=0.500;MQ=57.74;MQ0=1;MQRankSum=0.427;QD=11.76;ReadPosRankSum=-2.190e-01;SB=-9.390e+02;VQSLOD=5.53;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0/1:23,28:51:99:681,0,668:127	0/1:16,18:34:99:338,0,244:127	0/1:24,22:46:99:560,0,323:127
-1	17032814	rs2773183	T	C	2828.26	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0/1:63,59:122:99:1434,0,1831:127	0/1:53,56:109:99:910,0,871:127	0/1:61,30:91:99:523,0,1257:127
-1	249250621	yossi-4	T	C	2828.26	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0/1:63,59:122:99:1434,0,1831:127	0/1:53,56:109:99:910,0,871:127	0/1:61,30:91:99:523,0,1257:127
-2	1	yossi-5	C	T	1483.26	PASS	AC=2;AF=0.333;AN=6;BaseQRankSum=-4.814e+00;DB;DP=189;Dels=0.00;FS=5.61;HaplotypeScore=0.324;MLEAC=2;MLEAF=0.333;MQ=58.36;MQ0=0;MQRankSum=1.58;QD=12.06;ReadPosRankSum=0.326;SB=-9.320e+02;VQSLOD=6.81;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0|0:66,0:66:99:0,178,2264:127	0|1:33,38:71:99:844,0,1024:127	0|1:26,26:52:99:678,0,719:127
-2	2	.	C	T	1483.26	PASS	AC=2;AF=0.333;AN=6;BaseQRankSum=-4.814e+00;DB;DP=189;Dels=0.00;FS=5.61;HaplotypeScore=0.324;MLEAC=2;MLEAF=0.333;MQ=58.36;MQ0=0;MQRankSum=1.58;QD=12.06;ReadPosRankSum=0.326;SB=-9.320e+02;VQSLOD=6.81;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0|0:66,0:66:99:0,178,2264:127	0|1:33,38:71:99:844,0,1024:127	0|1:26,26:52:99:678,0,719:127
-2	1143476	rs4998209	C	T	1483.26	PASS	AC=2;AF=0.333;AN=6;BaseQRankSum=-4.814e+00;DB;DP=189;Dels=0.00;FS=5.61;HaplotypeScore=0.324;MLEAC=2;MLEAF=0.333;MQ=58.36;MQ0=0;MQRankSum=1.58;QD=12.06;ReadPosRankSum=0.326;SB=-9.320e+02;VQSLOD=6.81;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0|0:66,0:66:99:0,178,2264:127	0|1:33,38:71:99:844,0,1024:127	0|1:26,26:52:99:678,0,719:127
-2	9240279	rs56249990	A	G	3978.01	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=1.70;DB;DP=213;Dels=0.00;FS=7.83;HaplotypeScore=1.19;MLEAC=3;MLEAF=0.500;MQ=59.40;MQ0=0;MQRankSum=0.143;QD=27.25;ReadPosRankSum=-9.700e-02;SB=-1.991e+03;VQSLOD=9.14;culprit=FS	GT:AD:DP:GQ:PL:TP	0|1:33,42:75:99:1400,0,1031:127	0|0:67,0:67:99:0,178,2277:127	1|1:0,71:71:99:2578,199,0:127
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManualComp.interval_list b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManualComp.interval_list
deleted file mode 100644
index 6c6b5e0..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManualComp.interval_list
+++ /dev/null
@@ -1,12 +0,0 @@
- at SQ	SN:1	LN:249250621
- at SQ	SN:2	LN:243199373
- at SQ	SN:3	LN:198022430
-1	8216712	8216712	+	rs11121115
-1	8216713	8216713	+	yossi-1
-1	8216714	8216714	+	yossi-2
-1	17032814	17032814	+	rs2773183
-1	249250621	249250621	+	yossi-4
-2	1	1	+	yossi-5
-2	2	2	+	interval-1
-2	1143476	1143476	+	rs4998209
-2	9240279	9240279	+	rs56249990
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListchr123_empty.interval_list b/src/test/resources/htsjdk/samtools/intervallist/IntervalListchr123_empty.interval_list
deleted file mode 100644
index f8fd99b..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListchr123_empty.interval_list
+++ /dev/null
@@ -1,4 +0,0 @@
- at SQ	SN:1	LN:249250621
- at SQ	SN:2	LN:243199373
- at SQ	SN:3	LN:198022430
-1	1	1	+	test
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/inttest.bam b/src/test/resources/htsjdk/samtools/inttest.bam
deleted file mode 100644
index 5c646f5..0000000
Binary files a/src/test/resources/htsjdk/samtools/inttest.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/inttest.sam b/src/test/resources/htsjdk/samtools/inttest.sam
deleted file mode 100644
index 805e153..0000000
--- a/src/test/resources/htsjdk/samtools/inttest.sam
+++ /dev/null
@@ -1,26 +0,0 @@
- at HD	VN:1.5	SO:unsorted
- at SQ	SN:Sheila	LN:20
- at RG	ID:ID	SM:foo
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P0:i:0
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P1:i:127
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P2:i:128
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P3:i:255
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P4:i:256
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P5:i:32767
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P6:i:32768
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P7:i:65535
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P8:i:65536
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P9:i:2147483647
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	PA:i:2147483648
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	PB:i:4294967295
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P0:i:-0
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P1:i:-127
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P2:i:-128
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P3:i:-255
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P4:i:-256
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P5:i:-32767
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P6:i:-32768
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P7:i:-65535
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P8:i:-65536
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	P9:i:-2147483647
-Fred	16	Sheila	1	86	10M	*	0	0	GCTAGCTCAG	**********	PA:i:-2147483648
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/io/5newline5.txt b/src/test/resources/htsjdk/samtools/io/5newline5.txt
deleted file mode 100644
index 53ff652..0000000
--- a/src/test/resources/htsjdk/samtools/io/5newline5.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-     
-     
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/io/slurptest.txt b/src/test/resources/htsjdk/samtools/io/slurptest.txt
deleted file mode 100644
index 44718c3..0000000
--- a/src/test/resources/htsjdk/samtools/io/slurptest.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-bacon   and rice   
-for breakfast  
-wont you join me
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/issue76.bam b/src/test/resources/htsjdk/samtools/issue76.bam
deleted file mode 100644
index 32c05b7..0000000
Binary files a/src/test/resources/htsjdk/samtools/issue76.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/issue76.bam.bai b/src/test/resources/htsjdk/samtools/issue76.bam.bai
deleted file mode 100644
index 2366517..0000000
Binary files a/src/test/resources/htsjdk/samtools/issue76.bam.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/liftover/hg18ToHg19.over.chain b/src/test/resources/htsjdk/samtools/liftover/hg18ToHg19.over.chain
deleted file mode 100644
index 9f7a0cf..0000000
--- a/src/test/resources/htsjdk/samtools/liftover/hg18ToHg19.over.chain
+++ /dev/null
@@ -1,30850 +0,0 @@
-chain 21270159960 chr1 247249719 + 0 247199719 chr1 249250621 + 10000 249233096 2
-616	0	137
-166664	50000	50000
-40302	50000	50000
-153649	50000	50000
-1098446	269	272
-773	1	1
-43	1	1
-864369	2	2
-51	0	3
-104	13694	13694
-104	3	0
-51	2	2
-134936	50000	50000
-1161048	60000	150000
-1440092	50000	27273
-7590365	50000	50000
-116914	50088	100088
-237162	50000	50000
-3518496	50000	50000
-12702424	50000	150000
-16145012	1	0
-7772	0	1
-4705841	1	0
-52977198	50000	50000
-157344	50000	21065
-16604841	50000	50000
-189539	50000	150000
-398739	20290000	21050000
-195588	50000	50000
-186739	50000	150000
-175055	50000	50000
-201709	50000	100000
-126477	50000	130183
-381	3	0
-315	2	0
-62	1	1
-73	1	1
-1158	0	1
-314	1	0
-11	1	1
-2849	0	3
-5615	1	1
-37	1	1
-3172	4	6
-190	1	1
-34	1	1
-380	1	0
-2099	0	3
-1135	4	0
-970	5	5
-209	0	1
-460	1	0
-1242	28	28
-574	1	1
-21	1	1
-2268	0	3
-239	1	0
-970	11	11
-2365	1	1
-21	1	1
-384	8	8
-996	0	2
-10383	0	2
-713	1	0
-5188	1	1
-30	1	1
-1233	0	1
-132	1	1
-44	1	1
-2955	0	1
-512	1	1
-39	1	1
-1096	16	0
-743	0	1
-9028	1	0
-2506	6	0
-8446	0	2
-5505	3	0
-7541	0	1
-109864	50000	50000
-78698	50000	50000
-127263	50000	50000
-170669	50000	50000
-38311	100000	100000
-1022394	50000	50000
-281532	50000	294733
-1687	1	1
-39	0	1
-1018	1	1
-26	1	1
-1722	0	2
-158	0	4
-1602	6	0
-1384	0	1
-2066	1	1
-32	3	1
-1556908	50000	150000
-185320	50000	150000
-172789	50000	50000
-220313	50000	50000
-455185	50000	50000
-22047237	0	1
-34365824	50000	150000
-259514	50000	150000
-17265625	50000	50000
-11394365	50000	50000
-13665999	50000	150000
-174886
-
-chain 989083 chr1 247249719 + 2475290 2488984 chr1 249250621 - 246751494 246765188 1383
-13694
-
-chain 5421 chr1 247249719 + 1609759 1609849 chr1 249250621 + 1672838 1672928 2227793
-90
-
-chain 3303 chr1 247249719 + 13192499 13192587 chr1 249250621 - 236203315 236203403 109
-88
-
-chain 467 chr1 247249719 + 142633259 142633287 chr1 249250621 - 128420441 128420469 123
-28
-
-chain 12431961244 chr10 135374737 + 50000 135374737 chr10 135534747 + 60000 135524747 10
-5577107	50006	0
-12337568	50000	50000
-20794160	50000	50000
-286100	2480000	3200000
-191752	50000	50000
-3830277	150000	50000
-952205	150000	100000
-263307	150000	100000
-163231	150000	50000
-989829	150000	100000
-1941874	50000	50000
-211435	50000	50000
-30112515	319974	0
-13249156	10	0
-31058956	50000	50000
-2696597	50000	150000
-4615335	10000	50000
-246123	50000	50000
-1327328	1	1
-47	1	1
-1312	1	0
-56	1	1
-190	1	1
-31	1	1
-20182	0	1
-448068
-
-chain 8134587 chr10 135374737 + 81444609 81551340 chr10 135534747 + 88976631 89083503 218
-369	41	41
-149	6	6
-83	71	71
-548	9	9
-391	9	9
-334	42	42
-81	1	2
-954	1	0
-441	0	4
-922	37	37
-343	253	253
-278	59	58
-404	13	13
-90	39	37
-70	132	123
-145	4	4
-392	9	9
-58	29	29
-166	51	50
-78	14	14
-455	61	65
-243	41	41
-1183	17	17
-163	57	57
-169	51	51
-912	5	5
-667	12	12
-250	20	20
-506	8	8
-292	8	8
-266	17	17
-69	27	27
-131	22	22
-668	46	47
-270	13	13
-128	7	7
-300	48	48
-818	32	32
-667	67	67
-402	24	36
-293	18	18
-423	68	68
-113	9	9
-630	42	42
-269	51	51
-165	0	1
-645	52	52
-76	91	90
-505	13	13
-143	31	31
-319	68	70
-245	126	126
-145	35	37
-90	57	57
-378	41	38
-193	13	13
-333	51	30
-51	6	6
-821	56	56
-547	18	18
-343	9	9
-270	47	47
-706	1	0
-120	21	22
-371	35	35
-530	13	13
-51	36	36
-611	48	48
-587	18	18
-499	9	9
-183	26	26
-847	7	7
-134	5	4
-64	34	34
-120	66	66
-173	147	147
-126	19	16
-53	44	49
-69	1	0
-153	89	90
-81	16	16
-52	32	36
-72	28	28
-86	68	68
-56	51	51
-120	17	17
-181	5	5
-86	17	18
-68	36	36
-356	101	101
-90	3	11
-226	26	28
-70	19	19
-95	9	9
-88	16	16
-272	33	33
-216	71	71
-394	83	83
-853	14	15
-90	23	23
-130	0	3
-52	11	11
-192	49	49
-407	13	13
-122	71	34
-179	28	28
-102	10	10
-299	36	36
-268	4	4
-123	36	36
-112	41	41
-233	77	75
-73	88	92
-519	43	43
-118	101	101
-78	33	43
-117	31	31
-83	37	37
-86	3	0
-468	0	2
-791	55	55
-268	97	97
-111	55	59
-164	38	38
-176	0	3
-116	67	74
-269	0	3
-92	66	67
-205	50	55
-1339	33	34
-86	9	9
-310	34	34
-217	42	42
-194	18	17
-191	4	4
-250	0	3
-148	79	79
-77	3	0
-199	57	57
-200	53	53
-331	52	53
-136	32	42
-69	60	60
-169	0	1
-594	88	88
-174	70	70
-135	48	48
-53	9	9
-862	25	25
-1106	33	33
-974	76	76
-368	17	17
-369	43	43
-263	49	49
-143	8	8
-228	57	57
-74	3	0
-914	2	0
-137	77	74
-243	32	32
-166	53	53
-646	87	87
-71	0	1
-661	45	45
-142	76	76
-851	17	17
-56	60	60
-52	59	58
-80	60	60
-602	13	13
-617	76	78
-51	152	152
-77	38	38
-150	0	4
-386	45	45
-585	40	33
-108	12	12
-219	99	99
-1376	58	58
-517	27	27
-124	20	20
-566	58	58
-235	47	47
-72	26	26
-157	43	43
-208	31	31
-578	122	84
-259	15	15
-1141	119	119
-141	13	13
-817	14	14
-188	0	5
-323	62	75
-447	0	5
-64	161	161
-945	23	23
-66	35	35
-104	125	125
-613	186	184
-102	205	203
-767	27	27
-111	13	13
-107	80	83
-272	0	1
-438	4	4
-127	68	68
-564	44	44
-141	14	14
-137	13	17
-167	18	0
-241	25	25
-586	30	30
-178	44	44
-310	90	87
-1277	35	35
-646	32	32
-704	56	56
-367	93	101
-241	15	14
-340	64	64
-1000	23	26
-163	81	81
-895	12	12
-345	2	0
-117	48	49
-491	32	32
-206	17	17
-439	109	109
-202	6	7
-756	24	24
-380	63	62
-144	48	48
-608	80	80
-154	71	71
-232	16	16
-1809	40	40
-346	53	52
-117	10	0
-383	10	10
-1973	19	19
-879	42	42
-91	50	50
-1147	2	1
-210	68	88
-189	7	7
-595	50	49
-248	104	126
-265	106	106
-167	0	7
-141	93	62
-825	1	0
-348	47	46
-211	3	0
-114	52	56
-66	7	7
-759	48	48
-269	0	1
-106	109	114
-114	38	39
-282	20	20
-504	0	1
-174	14	7
-123	45	46
-82	58	58
-203	12	13
-153	44	44
-121	74	74
-805	43	43
-120	67	68
-171	6	6
-329	20	20
-151	33	33
-71	46	46
-195	25	21
-65	23	42
-96	78	78
-58	0	4
-389	0	3
-214	137	138
-111	2	3
-116	10	10
-128	0	3
-52	8	8
-62	43	43
-142	6	6
-214	0	112
-179	0	1
-234	4	0
-75	116	117
-119	63	67
-286	72	42
-73	150	150
-206	214	220
-73	2	0
-82	48	48
-135	40	67
-115	109	114
-185	49	49
-99	63	63
-52	204	205
-121
-
-chain 2724232 chr10 135374737 + 81309951 81339951 chr10 135534747 + 81320000 81350000 983
-22137	957	957
-46	77	77
-38	83	83
-51	54	54
-984	53	53
-5520
-
-chain 1898345 chr10 135374737 + 81349952 81369946 chr10 135534747 + 81360000 81380000 1327
-15902	21	27
-4071
-
-chain 946327 chr10 135374737 + 81339951 81349952 chr10 135534747 + 81350000 81360000 2894
-6692	1	0
-3308
-
-chain 939763 chr10 135374737 + 81430217 81440202 chr10 135534747 + 81440000 81450000 3159
-163	3	0
-518	0	16
-972	42	43
-5149	0	1
-3138
-
-chain 928169 chr10 135374737 + 81379935 81389948 chr10 135534747 + 81390000 81400000 3587
-1970	7	8
-141	10	0
-413	39	39
-622	4	0
-574	42	42
-2153	0	2
-1520	5	3
-2513
-
-chain 922636 chr10 135374737 + 81300280 81309951 chr10 135534747 + 81310330 81320000 2721
-2989	1	0
-6681
-
-chain 885793 chr10 135374737 + 81369946 81379851 chr10 135534747 + 81380000 81389916 4570
-507	30	32
-880	91	91
-1155	82	82
-784	10	10
-907	16	28
-1265	50	50
-859	0	3
-1375	1	2
-165	27	27
-124	29	29
-275	8	8
-308	6	0
-79	1	0
-871
-
-chain 839370 chr10 135374737 + 81389948 81399836 chr10 135534747 + 81400000 81409799 4960
-446	1	0
-639	0	1
-112	140	59
-198	24	22
-98	162	137
-63	10	10
-97	180	192
-71	31	33
-322	38	38
-431	0	1
-741	45	46
-229	1	3
-186	1	4
-3019	14	14
-131	1	0
-722	16	16
-1530	92	92
-32	2	1
-63
-
-chain 788625 chr10 135374737 + 81241464 81249852 chr10 135534747 + 81251575 81259959 6147
-783	1	0
-883	23	33
-3247	1	0
-143	31	31
-957	15	3
-2304
-
-chain 781678 chr10 135374737 + 81280054 81289770 chr10 135534747 + 81290109 81299824 3334
-65	841	841
-84	228	228
-27	240	240
-1767	0	10
-186	66	54
-976	0	3
-1495	0	7
-899	0	1
-376	7	7
-2156	10	0
-196	50	50
-47
-
-chain 778944 chr10 135374737 + 81250813 81551219 chr10 135534747 - 53516479 54101824 544
-53	63	72
-96	209	213
-193	44	44
-202	331	335
-149	28	28
-100	125	123
-56	238	272
-60	91	93
-123	9	11
-66	147	144
-82	210	211
-77	17	17
-196	31	31
-379	27	27
-954	71	71
-69	4431	3721
-746	66	66
-502	12	12
-282	28	28
-224	59	59
-52	35	35
-448	12	0
-474	42	42
-260	11	11
-83	38	44
-160	152	149
-284	76	76
-110	73	73
-284	9	9
-478	110	110
-95	5	5
-583	122	122
-116	1	1
-67	1	1
-118	1	1
-38	1	1
-566	1	1
-35	1	1
-287	1	0
-481	1	1
-42	1	1
-198	1	1
-22	1	1
-54	1	1
-25	1	1
-50	1	1
-50	1	1
-294	4	0
-158	1	1
-31	1	1
-255	8	8
-291	12	12
-171	2	2
-21	1	1
-685	77	77
-817	20	20
-312	39	39
-181	1	0
-249	50	47
-75	7	7
-86	4	4
-54	8	8
-518	134	134
-376	24	26
-189	17	27
-143	13	13
-93	16	16
-192	24	24
-992	140	132
-828	1	1
-40	1	1
-410	1	1
-25	0	2
-13	1	1
-83	8	8
-143	1	1
-20	1	1
-421	1	1
-49	1	1
-107	1	1
-28	1	1
-77	1	1
-32	0	2
-44	2	2
-348	1	1
-53	0	4
-58	1	1
-97	1	1
-125	56	53
-526	1	1
-46	1	1
-209	9	9
-76	1	1
-37	1	1
-53	1	1
-24	1	1
-141	1	1
-26	1	1
-304	1	1
-60	1	1
-199	1	1
-47	1	1
-92	6	0
-138	64	64
-299	65	65
-186	24	24
-631	84	84
-100	20	20
-108	27	27
-240	8134	8243
-50	47	45
-107	11	11
-750	5	5
-230	25	25
-221	62	62
-106	32	32
-106	52	52
-270	56	56
-166	31	31
-89	77	77
-127	666	662
-56	22	22
-55	95	83
-51	30	30
-77	35	35
-189	16	16
-130	53	53
-131	5	5
-158	140	131
-170	21	21
-55	79	79
-207	200	199
-152	11	11
-105	50	50
-104	34	34
-56	402	402
-69	0	1
-61	150	150
-181	10	10
-130	22	22
-180	5	0
-73	161	161
-77	151	151
-68	128	128
-330	138	126
-116	1211	328
-252	4	4
-102	8	8
-72	23	23
-51	51	51
-608	31808	287592
-56	14	14
-161	9	9
-717	46	50
-77	38	30
-83	51	51
-54	984	987
-53	65700	95386
-47	559	556
-99	119	119
-193	38	38
-164	12	7
-59	38	38
-58	9	5
-57	34	34
-68	30	30
-59	28	28
-51	82	87
-142	7	7
-67	162	152
-248	1	2
-114	34	34
-140	22	22
-58	119	118
-143	50	50
-255	69	65
-53	18	18
-127	11	13
-446	39	39
-134	24	24
-143	42	42
-123	65	65
-57	0	3
-199	73	73
-271	17	17
-113	24	24
-203	40	40
-51	38	38
-119	50	50
-81	60	60
-239	85	70
-79	219	219
-64	149	150
-29	211	211
-91	319	310
-76	40	40
-59	596	591
-34	579	579
-51	90	90
-169	336	329
-146	226	226
-50	480	479
-23	66	66
-95	447	447
-49	298	298
-29	180	180
-45	1186	1169
-53	2222	2217
-11	116	116
-33	313	313
-63	75	75
-14	257	258
-31	122	122
-73	311	316
-238	46	46
-130	81	78
-103	262	266
-56	168	163
-29	861	857
-61	655	666
-18	40	40
-436	1	1
-8	4	0
-35	1	1
-417	21	18
-51	2	0
-54	1	1
-126	10	9
-72	5	5
-377	1	1
-18	2	0
-35	2	2
-78	1	2
-18	2	2
-82	1	0
-99	1	1
-82	0	4
-99	1	1
-50	0	4
-50	7	7
-225	11	11
-135	2	0
-326	26	989
-2646	0	1
-560	10	0
-347	114	114
-284	118541	118621
-43	120	120
-65	1	0
-1	677	677
-33	71	71
-46	404	404
-78	661	663
-137	489	492
-43	854	846
-116	119	119
-63	286	286
-72	73	73
-150	206	206
-17	1	1
-85	1	1
-110	157	157
-48	135	135
-36	0	4
-4	115	115
-73	2	0
-19	1	1
-14	185	185
-49	99	99
-22	1	1
-40	79	80
-177
-
-chain 662550 chr10 135374737 + 81399647 81430169 chr10 135534747 - 46431029 46458544 512
-92	103	101
-125	0	2222
-53	53	50
-58	48	48
-298	191	189
-69	6167	5
-118	101	101
-128	111	111
-207	48	43
-55	175	169
-212	93	89
-159	23	23
-109	34	34
-150	21	20
-258	30	30
-120	51	54
-90	171	171
-268	224	219
-202	62	62
-480	237	237
-394	49	49
-100	28	28
-93	25	25
-52	29	29
-180	45	45
-141	47	47
-56	49	49
-169	39	42
-60	102	113
-53	1	13
-151	105	105
-58	33	30
-88	246	246
-334	116	116
-63	83	84
-268	115	113
-70	43	43
-252	2	1
-62	97	97
-88	6	0
-61	23	23
-84	75	75
-75	2	3
-83	8	8
-53	160	162
-312	153	152
-192	96	98
-122	95	100
-94	793	791
-61	1	5
-154	140	135
-130	32	33
-121	21	21
-82	6	6
-171	34	34
-110	52	49
-129	193	194
-64	26	29
-72	18	18
-286	75	58
-114	6596	7638
-114	284	172
-558	8	9
-111	5	5
-55	2	2
-80	0	1
-27	1	1
-72	1	1
-45	1	1
-516	1	1
-66	1	1
-106	23	42
-64	4	0
-21	1	1
-312	2	2
-30	1	1
-151	20	20
-193	1	1
-38	1	1
-96	6	6
-171	0	3
-27	0	2
-34	2	2
-120	3	3
-39	1	1
-752
-
-chain 650336 chr10 135374737 + 81249915 81259740 chr10 135534747 + 81260018 81269841 3195
-898	53	53
-63	96	96
-209	193	193
-44	202	202
-331	149	149
-28	100	100
-125	56	56
-238	60	60
-91	198	198
-147	82	82
-210	290	290
-31	1360	1360
-71	69	69
-196	1	0
-454	16	15
-3764
-
-chain 462746 chr10 135374737 + 81440202 81450008 chr10 135534747 + 81450000 81459803 2861
-1116	4	4
-801	3	0
-2483	369	369
-41	238	238
-71	1291	1291
-42	2400	2400
-37	343	343
-253	278	278
-36
-
-chain 389885 chr10 135374737 + 81290873 81299672 chr10 135534747 + 81300927 81309722 2802
-25	221	221
-62	106	106
-32	106	106
-52	270	270
-56	166	166
-31	89	89
-77	127	127
-666	133	133
-95	51	51
-30	77	77
-35	335	335
-53	294	294
-103	4	0
-33	246	246
-79	207	207
-200	268	268
-50	104	104
-34	56	56
-402	130	130
-150	601	601
-161	77	77
-151	68	68
-128	330	330
-138	116	116
-1211	512	512
-51
-
-chain 178315 chr10 135374737 + 81400041 81409702 chr10 135534747 + 81410003 81419664 4252
-32	404	404
-191	168	168
-119	193	193
-38	235	235
-38	124	124
-34	68	68
-30	59	59
-28	51	51
-82	216	216
-162	363	363
-34	220	220
-21	9	9
-89	143	143
-50	255	255
-69	995	995
-42	123	123
-65	256	256
-73	628	628
-40	208	208
-50	94	94
-47	239	239
-85	79	79
-219	64	64
-31	147	147
-72	625	625
-40	271	271
-93	754	754
-30	700	700
-66
-
-chain 157388 chr10 135374737 + 81410627 81419292 chr10 135534747 + 81420589 81429247 5183
-66	95	95
-53	1136	1136
-46	81	81
-25	268	268
-38	269	263
-105	58	58
-6	0	1
-27	88	88
-34	53	53
-81	32	32
-46	334	334
-116	63	63
-83	268	266
-115	429	428
-97	262	262
-75	757	757
-75	230	232
-41	343	343
-69	47	47
-78	238	238
-46	130	131
-17	36	34
-28	319	319
-46	56	56
-38	707	707
-52	129	129
-132	125	125
-26	376	376
-75
-
-chain 142913 chr10 135374737 + 81466547 81535718 chr10 135534747 - 46275769 46344990 569
-44	2128	2133
-24	2535	2533
-31	2379	2381
-34	143	143
-43	270	270
-50	1045	1058
-51	494	498
-36	2085	2105
-60	1979	1981
-71	1197	1197
-41	1594	1601
-37	2856	2871
-66	205	205
-50	1339	1339
-33	656	663
-42	805	805
-79	280	275
-56	200	200
-22	18	18
-13	1443	1450
-44	2526	2526
-33	974	974
-75	1489	1489
-47	1658	1653
-53	1652	1653
-41	1071	1071
-59	10705	10669
-57	6434	6441
-25	586	586
-30	178	178
-44	310	310
-74	7	1
-9	1277	1277
-35	5735	5751
-32	2139	2139
-63	3162	3162
-40	346	345
-53	3391	3390
-41	92	92
-50
-
-chain 97392 chr10 135374737 + 81500632 81510012 chr10 135534747 + 81510451 81519840 3573
-60	191	191
-60	1232	1232
-76	51	51
-152	77	77
-38	536	540
-45	585	586
-39	340	340
-99	1376	1373
-58	517	517
-27	710	710
-58	235	235
-47	72	72
-26	157	157
-43	208	208
-31	630	637
-70	1415	1415
-119
-
-chain 87386 chr10 135374737 + 81512081 81517268 chr10 135534747 + 81521923 81527111 3288
-161	1034	1034
-35	104	104
-125	613	613
-186	102	102
-205	767	767
-27	231	232
-80	841	841
-68	564	564
-44
-
-chain 81916 chr10 135374737 + 81260486 81269831 chr10 135534747 + 81270587 81279924 3410
-66	796	796
-28	224	224
-59	52	52
-35	934	925
-42	354	354
-1	0	2
-37	160	160
-121	19	18
-12	284	284
-76	110	110
-73	771	771
-110	683	683
-8	36	35
-78	4099	4100
-77
-
-chain 75208 chr10 135374737 + 81450008 81464865 chr10 135534747 + 81597933 81612795 1746
-23	1356	1354
-29	166	166
-51	547	547
-30	274	278
-40	1364	1363
-57	169	169
-51	3032	3032
-27	1585	1586
-48	818	818
-32	667	667
-67	1160	1160
-68	752	752
-42	269	269
-51	810	813
-52	76	76
-91	661	661
-31	319	319
-42
-
-chain 71596 chr10 135374737 + 81480667 81490183 chr10 135534747 + 81490477 81500000 3725
-36	395	395
-36	536	535
-88	519	519
-43	139	139
-80	78	78
-33	117	134
-31	1468	1468
-55	268	268
-97	111	111
-30	6	0
-19	164	164
-38	292	292
-67	2459	2459
-34	2063	2060
-52	136	136
-26
-
-chain 65913 chr10 135374737 + 81470614 81479436 chr10 135534747 + 81480422 81489246 3085
-36	1955	1955
-26	1450	1450
-97	248	248
-44	223	223
-89	149	149
-32	72	72
-28	86	86
-68	993	993
-49	0	1
-52	319	320
-26	569	569
-33	216	216
-71	1842	1842
-49
-
-chain 63808 chr10 135374737 + 81521220 81529648 chr10 135534747 + 81531068 81539504 3362
-32	704	704
-56	367	367
-93	596	601
-64	1186	1189
-81	1371	1371
-48	1185	1185
-109	1575	1575
-48	608	608
-80	154	154
-71
-
-chain 58084 chr10 135374737 + 81490258 81499708 chr10 135534747 + 81500075 81509527 2957
-60	807	808
-44	174	174
-70	135	135
-48	924	924
-25	2943	2943
-43	263	263
-49	1566	1566
-77	243	243
-32	865	865
-87	732	733
-45	183	183
-35
-
-chain 41373 chr10 135374737 + 81540284 81544136 chr10 135534747 + 81550136 81553982 6087
-47	328	324
-52	832	831
-48	375	375
-79	0	1
-30	114	114
-38	1117	1115
-45	82	82
-58	368	368
-44	121	121
-74
-
-chain 34777 chr10 135374737 + 81464865 81470020 chr10 135534747 + 81474671 81479828 3724
-26	245	245
-34	44	44
-48	145	145
-12	0	2
-23	90	90
-57	378	378
-41	1468	1468
-56	2453	2453
-35
-
-chain 34249 chr10 135374737 + 81270980 81279755 chr10 135534747 + 81281073 81289810 4510
-39	431	431
-50	752	752
-134	2175	2167
-44	3025	2995
-35	14	9
-7	2005	2010
-64
-
-chain 29298 chr10 135374737 + 81537077 81539110 chr10 135534747 + 81546931 81548963 3702
-68	791	797
-50	617	605
-33	0	2
-73	308	311
-93
-
-chain 18939 chr10 135374737 + 81450538 81452241 chr10 135534747 + 81460333 81462036 3255
-39	70	70
-132	1431	1431
-31
-
-chain 6030 chr10 135374737 + 81422413 81430217 chr10 135534747 + 81432363 81440000 5582
-26	7730	7563
-48
-
-chain 5154 chr10 135374737 + 81371363 81371422 chr10 135534747 - 72572913 72572972 4033525
-2	1	1
-56
-
-chain 1569 chr10 135374737 + 81371422 81371454 chrX 155270560 + 63278348 63278380 8657459
-32
-
-chain 1063 chr10 135374737 + 81231366 81231464 chr10 135534747 - 54101945 54102043 901
-98
-
-chain 4275918 chr10_random 113275 + 18676 65432 chr5 180915260 + 138864813 138909803 707
-204	2	0
-4653	4	0
-2427	0	1
-5957	0	1
-1558	1	0
-780	1794	33
-29376
-
-chain 870863 chr10_random 113275 + 9144 18556 chr10 135534747 - 46779061 46789268 4835
-301	2	0
-564	3	0
-802	1	0
-2624	0	112
-142	0	2
-128	100	787
-4745
-
-chain 637317 chr10_random 113275 + 102183 113228 chr10 135534747 + 88758795 88768050 8258
-1205	22	22
-793	0	1
-914	1	1
-9	0	1
-45	0	1
-9	2477	1631
-132	1562	615
-2006	1	1
-36	1	1
-557	24	23
-885	0	2
-194	1	0
-171
-
-chain 383436 chr10_random 113275 + 97894 101991 chr10 135534747 + 88848068 88852165 132306
-2932	0	1
-697	4	3
-464
-
-chain 312568 chr10_random 113275 + 0 3305 chr10 135534747 + 88861095 88864401 225266
-2905	0	1
-400
-
-chain 263395 chr10_random 113275 + 91858 94672 chr10 135534747 + 88776474 88779288 339622
-1683	3	3
-130	11	11
-987
-
-chain 254817 chr10_random 113275 + 83066 85798 chr10 135534747 - 46749813 46752549 368581
-201	0	6
-798	0	1
-403	4	0
-841	14	15
-471
-
-chain 244215 chr10_random 113275 + 5995 97779 chr10 135534747 + 88818267 88897264 4711
-966	0	1
-2072	66256	15486
-2428	10567	42513
-197	0	1
-820	6	6
-18	1	0
-21	0	1
-20	2	1
-1685	0	2
-703	3020	9053
-1156	0	1
-1846
-
-chain 216530 chr10_random 113275 + 72868 75170 chr10 135534747 - 93082016 93084318 524441
-2302
-
-chain 211663 chr10_random 113275 + 85898 88144 chr10 135534747 + 88832831 88835078 546276
-536	0	1
-1710
-
-chain 171789 chr10_random 113275 + 70706 72761 chr10 135534747 - 93140436 93143121 737133
-50	1	1
-68	85	4
-15	15	34
-17	7	53
-13	1	647
-81	1	1
-50	21	21
-1630
-
-chain 129924 chr10_random 113275 + 67807 109229 chr10 135534747 - 46627912 46728083 8515
-467	0	1
-256	0	1
-42	1	1
-1352	0	2
-308	10219	43352
-227	1	1
-22	1	1
-2232	22395	48006
-1581	0	2
-518	1	1
-30	1	0
-197	132	132
-1439
-
-chain 125160 chr10_random 113275 + 4561 5895 chr10 135534747 - 46655374 46656707 1028939
-94	1	0
-1239
-
-chain 104003 chr10_random 113275 + 65554 66651 chr10 135534747 - 93176760 93177857 1232247
-1097
-
-chain 92361 chr10_random 113275 + 66732 67707 chr10 135534747 - 93158718 93159693 1382147
-975
-
-chain 89191 chr10_random 113275 + 3509 4486 chr10 135534747 - 129898314 129899289 1428933
-69	1	1
-35	1	0
-336	1	0
-401	1	1
-44	1	1
-87
-
-chain 29685 chr10_random 113275 + 34270 80352 chr10 135534747 - 46758431 46763489 186939
-210	0	6
-1251	4	4
-73	42015	985
-1249	1	1
-46	1	1
-1232
-
-chain 4572 chr10_random 113275 + 70436 70610 chr10 135534747 - 93144449 93144623 2904410
-51	50	50
-73
-
-chain 3114 chr10_random 113275 + 70610 70643 chr10 135534747 - 93147281 93147314 29780913
-33
-
-chain 12415599352 chr11 134452384 + 50000 134451920 chr11 135006516 + 60000 134946516 11
-1102759	16576	50000
-49571094	207000	307000
-503352	3000000	3100000
-14395596	2605	50000
-488471	34	102
-26	0	176
-30213	141	350
-27914	1	0
-20009	1	0
-19	1	0
-39	1	0
-17	3	1
-10	1	0
-1008	1	0
-95	1	0
-5127	15	0
-302	1	0
-975	0	4
-1548	0	1
-190	20	0
-41	1	0
-29	1	1
-44	0	1
-101	1	0
-25	0	1
-6178	0	1
-1875	21437	52561
-468	1	1
-81	1	1
-2620	1	0
-1640	4	0
-3305	0	1
-3342	1	0
-17899663	12000	50000
-8549206	15562	150000
-38507165	2	0
-1327	174	0
-392	18	0
-48
-
-chain 188276 chr11 134452384 + 69433462 69437111 chr11_gl000202_random 40103 + 7212 10860 1247
-1868	1	0
-1780
-
-chain 38178 chr11 134452384 + 134451288 134452384 chr5 180915260 - 180902450 180903869 1901368
-174	458	926
-1	8	0
-63	136	1
-64	2	0
-190
-
-chain 6040 chr11 134452384 + 134451996 134452128 chr1 249250621 - 249240179 249240388 3449013
-89	36	113
-7
-
-chain 2221 chr11 134452384 + 134452085 134452111 chrY 59373566 + 59362903 59362929 5436109
-26
-
-chain 4284950 chr11_random 215294 + 0 215294 chr11 135006516 - 65191297 65289033 706
-40524	167558	50000
-7212
-
-chain 3340892 chr11_random 215294 + 90524 125679 chr11 135006516 + 69689619 69724695 863
-1003	62	0
-3019	1	0
-695	1	1
-26	1	1
-1133	0	1
-1374	2	2
-20	1	1
-729	11	11
-269	0	1
-1091	14	14
-969	21	21
-532	5	5
-2677	18	0
-21481
-
-chain 3051979 chr11_random 215294 + 175679 208082 chr11_gl000202_random 40103 - 0 32891 790
-17546	11	51
-27	523	35
-32	6	6
-6712	100	1036
-7446
-
-chain 10612 chr11_random 215294 + 193466 193615 chr11_gl000202_random 40103 - 18116 18265 21504297
-59	27	27
-63
-
-chain 5102 chr11_random 215294 + 91527 91580 chr11 135006516 + 69690684 69690737 20979070
-53
-
-chain 12330181372 chr12 132349534 + 16000 132289534 chr12 133851895 + 145739 133779461 12
-7035083	0	4
-544	0	1
-3777	0	1
-3889	73000	52114
-6014	1	0
-6524	168	34
-20974	0	2
-3965	3	0
-444	0	11
-464	1	0
-27577110	1395000	3000000
-38631945	0	1
-14541	0	4
-1703	1	0
-789	250000	12128
-1783	1	0
-1075	0	2
-1042	1	0
-1526	1	1
-27	1	1
-2320	0	1
-166	1	0
-564	0	1
-2856	0	2
-900	0	1
-1387	1	1
-33	1	1
-2139	1	1
-48	1	1
-1305	0	2
-1533	1	2
-879	0	1
-744	26	26
-855	0	4
-1092	6	0
-1114	12	0
-817	1	1
-18	1	0
-217	1	1
-36	1	1
-2002	1	0
-1025	0	1
-450	1	1
-43	1	1
-919	1	0
-18	1	1
-3207	42	42
-1440	0	8
-148	4	0
-3655	2	0
-3403	1	1
-47	1	1
-1524	1	1
-28	1	1
-5561	0	2
-44	0	1
-676	8	8
-810	16	16
-536	2	0
-236	4	0
-167	0	4
-1419	49	53
-4688	1	1
-38	1	1
-18577	5	0
-5284	0	2
-1577	34	34
-4875	1	1
-25	1	1
-4340	0	14
-2663	5	0
-1170	1	0
-4268	0	4
-1036	0	1
-2117	0	8
-5917	1	0
-3239	0	4
-2619	1	1
-21	1	1
-937	1	1
-38	1	1
-2412	0	2
-38	17	0
-2732	0	2
-9314	2	0
-1986	2	2
-16	1	1
-229	1	1
-93	1	1
-895	12	0
-415	1	5
-27	1	1
-78	14	14
-185	8	9
-458	0	2
-89	1	1
-42	1	1
-2034	0	1
-1545	0	2
-280	0	4
-97	14	14
-231	0	2
-2816	5	0
-537	50	50
-1090	1	1
-27	1	1
-25758689	0	1
-6536665	0	1
-377270	57000	96749
-668	1	1
-20	1	0
-3348	1	1
-33	1	1
-648	1	1
-29	1	1
-3732	4	0
-977	46	46
-785	4	0
-34	1	0
-1688	0	10
-4248	1	0
-1167	1	0
-985	9	9
-2897	1	0
-1630	9	0
-1096	0	1
-1356	0	8
-13065723	150011	68363
-799	2	0
-343	0	1
-1771	0	1
-2702	7	6
-1900	1	0
-705	6	0
-303	1	0
-727	1	1
-43	1	0
-3	2	0
-490	1	1
-59	1	1
-226	1	1
-52	3	0
-465	0	8
-194	1	1
-25	1	0
-139	1	1
-15	1	1
-1833	1	0
-81	1	1
-39	1	1
-453	1	0
-719	1	1
-47	1	1
-558	1	0
-838	8	1
-288	10	9
-741	5	2
-465	1	1
-48	1	1
-268	1	1
-26	1	0
-1337	30	48
-84	2	85
-917	1	0
-110	31	31
-1580	1	1
-40	1	1
-683	1	1
-24	1	1
-247	1	1
-36	1	1
-1574	0	1
-10091386	0	3
-296	0	5
-220	45000	100872
-972469
-
-chain 2523 chr12 132349534 + 107924339 107924385 chr20 63025520 - 54448952 54448998 196257
-46
-
-chain 9007877316 chr13 114142980 + 17918000 114127980 chr13 115169878 + 19020000 115109878 14
-26987167	1	0
-40753157	50000	150000
-25443670	400000	150000
-1821999	384108	414007
-369878
-
-chain 17589560 chr13 114142980 + 113473994 113658050 chr13 115169878 - 529930 713796 162
-174857	2	0
-1328	144	0
-1156	1	1
-27	1	1
-2159	2	0
-49	1	1
-175	2	0
-20	4	0
-590	30	0
-163	8	4
-2905	2	0
-430
-
-chain 8677 chr13 114142980 + 113650223 113650314 chr13 115169878 - 706193 706284 25436870
-91
-
-chain 17750502 chr13_random 186858 + 0 186858 chrUn_gl000212 186858 + 0 186858 156
-186858
-
-chain 8359013040 chr14 106368585 + 18070000 106360585 chr14 107349540 + 19000000 107289540 15
-1081285	1	1
-43	1	1
-76	2	0
-437	1	1
-19	1	1
-440	12	13
-59	15	15
-63	12	12
-70	0	1
-734	1	1
-165	1	4
-96	1	1
-46	1	0
-83	1	1
-149	4	4
-164	1	1
-18	1	1
-63	15	16
-359	1	1
-39	1	1
-103	1	1
-76	1	1
-139	1	1
-38	1	1
-344	1	1
-65	0	1
-166	5	5
-88	1	1
-66	0	287
-50	1	1
-317	0	1
-52	1	1
-92	4	0
-651	4	4
-82	1	1
-93	1	1
-64	1	1
-24	1	1
-856	1	1
-35	1	1
-258	1	1
-17	1	1
-478	1	0
-1048	70	70
-1279	1	1
-37	1	1
-1115	3	4
-72	1	1
-126	1	1
-102	1	1
-413	10	10
-132	6	6
-89	0	2
-209	15	4
-77	5	5
-427	1	1
-41	1	1
-949	1	1
-16	1	1
-732	1	1
-44	2	0
-128	0	1
-91	1	1
-180	6	6
-388	6	6
-50	13	12
-275	1	1
-33	1	1
-142	1	1
-61	1	1
-560	1	1
-20	1	1
-1327	6	13
-729	37	37
-284	1	1
-44	1	1
-205	0	4
-40	1	1
-352	10	10
-261	1	1
-39	1	1
-940	12	0
-1677	36	0
-159	1	1
-32	8	1
-818	0	6
-580	1	0
-931	1	0
-276	2	0
-3298	45	45
-169	14	0
-46	1	1
-882	2	0
-94	1	1
-49	1	1
-859	4	0
-45	1	1
-807	16	15
-416	0	3
-3345	15	15
-92	30	29
-80	1	1
-48	1	1
-2459	0	1
-646	1	1
-31	1	1
-392	1	1
-29	54	0
-1875	3	0
-141696	1	1
-32	1	1
-8201115	1	0
-107	1	0
-2137	1	1
-39	1	1
-8848	0	1
-4806	1	0
-2075	1	0
-16619	41	40
-2338	3	0
-11507	8	0
-1352	0	1
-4596	0	1
-2073	2	1
-28	1	1
-2311	1	1
-44	1	1
-10440	0	4
-894	0	1
-1641	0	96
-38	9	0
-20	1	1
-2706	6	0
-351	1	1
-25	1	1
-742	0	1
-1048	2	18
-12085977	0	1
-14871228	3	0
-29067652	1	1
-47	1	1
-20174307	1292	0
-2548043
-
-chain 14855 chr14 106368585 + 19159713 19190443 chr14 107349540 - 87865807 87904514 64
-20	0	6
-50	9933	9915
-37	16916	24930
-30	3690	3692
-25	27	0
-2
-
-chain 6432 chr14 106368585 + 19179765 19190441 chr22 51304566 + 16377620 16388301 97
-45	10604	10609
-27
-
-chain 7700812247 chr15 100338915 + 18260008 100338915 chr15 102531392 + 20000000 102521392 16
-8448	6	2
-4086	1	0
-9569	1	1
-40	0	5
-56	7	1
-872419	40441	40448
-553	4	4
-876	0	1
-38	1	1
-139	1	1
-23	1	1
-1881	1	1
-17	1	0
-499	8	8
-310	2	2
-25	11	5
-46	1	1
-78	1	1
-22	0	3
-181	5	6
-569	11	11
-539	1	1
-23	0	4
-261	1	1
-19	0	2
-776	13	15
-62	13	13
-860	1	0
-719	26	0
-1346	1	1
-134	0	1
-30	1	1
-1070	1	1
-21	1	1
-398	0	1
-177	5	21
-534	4	0
-770	0	6
-17	1	1
-606	1	1
-31	1	1
-1861	1	1
-53	1	1
-2169	3	0
-558	1	0
-18	1	1
-227	2	0
-13	1	1
-329	5	5
-430	1	1
-17	2	0
-620	0	1
-1112	2	0
-641	0	4
-476	1	1
-45	1	1
-1285	0	1
-1139	1	1
-47	1	1
-183	4	0
-1435	20	0
-176	0	1
-219	0	1
-607	1	1
-42	1	1
-371	2	8
-507	2	0
-66	1	0
-41	1	1
-999	4	4
-318	15	15
-1092	1	1
-72	1	1
-808	5	5
-54	2	2
-52	1	1
-40	1	1
-109	3	3
-47	1	1
-1535	14	0
-14012	4	0
-7954	4	1
-1350	1	0
-318	1	1
-25	1	1
-600	0	4
-442	0	1
-1396	1	1
-36	1	1
-1107	0	3
-1441	0	5
-360	1	1
-47	1	1
-228	10	0
-37	1	1
-497	1	1
-37	1	1
-2129	4	0
-1242	2	0
-478	4	0
-708	1	1
-90	1	1
-154	10	10
-1583	1	1
-31	1	1
-1302	0	37
-101	14	14
-1138	1	1
-83	10	0
-11	7	0
-111	1	1
-29	1	1
-2917	1	1
-32	1	1
-1762	1	1
-46	1	1
-449	1	0
-2458	9	1
-869	1	0
-534	1	1
-47	1	1
-309	1	0
-6358	22	0
-564	0	1
-1845	1	0
-660	1	1
-25	1	1
-68	1	0
-182	0	9
-54	3	18
-1519	1	1
-32	1	1
-559	1	1
-30	1	1
-3851	1	0
-265	8	7
-240	4474	0
-428	1	0
-1651	11	10
-297	1	0
-665	21	0
-48	1	1
-1763	2	0
-245	1	1
-39	1	1
-519	1	1
-31	1	1
-2398	0	6
-749	49	1
-2074	4	0
-701	5	5
-337	1	0
-470	1	1
-43	1	1
-1163	3	0
-1342	1	1
-43	1	1
-140	0	1
-83	1	1
-24	1	2
-37	1	1
-723	1	1
-36	1	1
-99	3	0
-27	1	1
-92	1	0
-80	43	43
-1095	0	13
-384	0	2
-292	1	1
-39	1	1
-101	12	12
-576	0	2
-1907	1	1
-19	1	1
-318	1	0
-1973	1	1
-32	1	1
-689	1	1
-49	1	1
-357	8	8
-2081	13	13
-260	15	15
-2295	1	1
-24	1	1
-2558	1	1
-26	1	1
-571	16	23
-323	0	1
-36	0	1
-5353	111	0
-1711	38	70
-272	13	13
-1284	0	1
-1128	4	4
-2189	1	0
-474	2	0
-1284	61	67
-643	1	1
-37	1	1
-381	0	2
-56	1	0
-2591	1	1
-55	1	1
-160	4	4
-116	1	1
-89	2	0
-316	0	1
-785	20	0
-152	1	1
-21	1	1
-600	0	6
-568	1	0
-278	1	1
-29	1	1
-89	0	4
-1737	1	1
-58	1	1
-368	24	24
-2113	20	24
-218	0	2
-18	1	1
-684	4	4
-3200	1	1
-31	1	1
-58	18	18
-164	1	1
-37	1	1
-296	6	6
-431	1	1
-35	1	1
-431	1	1
-45	1	1
-93	1	1
-24	1	1
-216	1	1
-46	1	1
-2773	0	17
-751	2	1
-104	1	1
-59	1	1
-445	1	1
-26	1	1
-356	1	0
-1484	1	2
-436	25	25
-306	1	1
-55	1	1
-230	4	4
-892	1	0
-364	7	7
-796	1	1
-26	1	1
-663	0	2
-80	0	15
-4391	1	0
-133	1	1
-25	0	4
-41	0	2
-164	1	1
-61	4	4
-925	3	0
-1882	13	13
-4513	1	0
-111	1	1
-76	1	1
-202	6	0
-680	0	1
-200	3	0
-429	0	2
-736	1	1
-18	1	1
-1573	0	1
-119	1	1
-245	0	9
-11	1	1
-1656	54	22
-616	2	1
-158	0	1
-587	1	1
-39	4	1
-1053	6	6
-1116	1	1
-34	1	1
-152	10	7
-448	0	1
-269024	100000	863295
-334079	100000	50000
-180553	0	74
-66	73	3
-40	1	0
-28	156	73
-202	1	1
-17	0	1
-156	1	1
-55	1	1
-111	0	1
-144	1	1
-57	0	1
-687074	50000	50000
-120647	0	348
-45586	0	1
-6994	1	0
-3398063	44008	12354
-7672	0	2
-1809	1	0
-428524	101014	10165
-43170	4	4
-1064959	128966	5086
-1021	0	1
-1710	1	0
-931	0	2
-4505	0	1
-686	525	2
-432	33	0
-58	20	20
-12369	1014	0
-6233	0	1
-359485	100000	111749
-33855821	0	239
-2852113	1	0
-7040367	0	1
-2815738	3	1
-7055922	60000	50000
-363827	32	32
-104991	0	1
-203136	0	6050
-2271	47	47
-1424473	60000	50000
-13510190	22012	5553
-9194	0	3
-109	0	4
-40	0	1
-43	0	7
-2352	0	13
-5027	0	2
-534	1	0
-794	0	2
-4233	0	2
-5769	1	0
-381	1	0
-2524	0	2
-547	0	5
-1967	0	1
-1207	105	0
-1027	0	6
-3935380
-
-chain 4143271 chr15 100338915 + 19154641 19368514 chr15 102531392 + 21901264 22115049 110
-40441	8593	8593
-26	89965	89965
-4257	1	1
-30	1	1
-185	16464	16391
-43	29947	29883
-25	1	1
-34	23835	23884
-25
-
-chain 390135 chr15 100338915 + 26478746 26483022 chr15 102531392 + 28681030 28685306 6048
-1039	22	22
-3215
-
-chain 187810 chr15 100338915 + 26483022 26517556 chr15 102531392 - 73809068 73843318 79
-41	12	0
-36	1	1
-490	5	5
-285	1	1
-71	1	1
-215	1	1
-53	0	12
-8114	1	0
-10796	15	15
-2483	0	1
-20	1	1
-2048	8856	8847
-163	792	517
-33
-
-chain 51529 chr15 100338915 + 26530390 26530949 chr15 102531392 + 28731348 28731907 2473877
-450	8	8
-101
-
-chain 17522 chr15 100338915 + 26516748 26516957 chr15 102531392 + 22658399 22658608 1968
-209
-
-chain 14035 chr15 100338915 + 20378176 20378474 chr15 102531392 + 22829101 22829399 772378
-73	69	69
-156
-
-chain 12347 chr15 100338915 + 26530060 26530390 chr15 102531392 + 22671289 22671619 3189077
-244	4	4
-82
-
-chain 5537 chr15 100338915 + 96402403 96402461 chr15 102531392 + 98585049 98585107 22350382
-58
-
-chain 4486 chr15 100338915 + 96402461 96402508 chr15 102531392 + 98585002 98585049 16761199
-47
-
-chain 2874 chr15 100338915 + 26517060 26517091 chr15 102531392 + 28719096 28719127 6634083
-31
-
-chain 2874 chr15 100338915 + 26517029 26517060 chr15 102531392 + 28719096 28719127 6634084
-31
-
-chain 2874 chr15 100338915 + 26516998 26517029 chr15 102531392 + 28719096 28719127 6634085
-31
-
-chain 2874 chr15 100338915 + 26516967 26516998 chr15 102531392 + 28719096 28719127 6634086
-31
-
-chain 2314 chr15 100338915 + 26530003 26530033 chr15 102531392 + 22671232 22671262 5236
-30
-
-chain 12940492 chr15_random 784346 + 189260 358080 chr15 102531392 + 28561246 28726591 233
-2522	0	1
-3762	1	1
-40	1	1
-2427	6472	2
-1744	0	1
-263	0	7
-2963	4	4
-1889	1	0
-2501	0	1
-3377	6	6
-5238	0	1
-1277	5	5
-38	1	1
-8232	12	8
-5507	0	18
-155	1	0
-379	14	14
-363	7	13
-336	1	1
-46	1	1
-218	8	8
-1074	0	4
-101	12	13
-178	1	1
-93	1	1
-156	10	11
-398	0	20
-45	1	1
-255	9	10
-2661	0	1
-17	1	1
-82	1	1
-14	1	1
-227	64	64
-1154	1	0
-493	1	1
-39	1	1
-369	1	0
-21	1	1
-322	2	7
-222	0	2
-171	15	0
-81	1	1
-47	1	1
-159	9	9
-154	1	0
-272	4	4
-26	1	1
-121	8	7
-659	1	0
-440	1	1
-35	1	0
-1419	15	0
-181	0	2
-292	0	15
-1767	1	1
-44	1	1
-59	0	1
-910	0	1
-290	1	0
-288	1	0
-567	2	0
-1088	0	1
-1758	1	0
-72	1	1
-21	1	1
-5748	17	17
-800	0	1
-2037	13	13
-113	5	5
-2832	1	1
-44	1	1
-3581	2	0
-33	1	1
-812	5	5
-33	0	1
-257	17	17
-1932	0	14
-168	0	1
-424	5	0
-24	1	1
-67	14	14
-90	1	5
-124	1	1
-34	1	1
-48	0	9
-460	0	8
-294	7	0
-813	1	3
-240	1	0
-511	0	9
-190	1	0
-267	1	1
-38	1	1
-1082	7	57
-21	15	0
-28	0	1
-5	1	1
-123	0	5
-781	1	1
-21	1	1
-390	1	1
-36	1	1
-287	1	1
-90	0	3
-6	2	2
-189	9	9
-263	2	1
-724	13	14
-308	2	0
-1752	1	1
-114	1	1
-236	4	0
-46	1	1
-72	5	0
-1039	1	1
-25	1	1
-403	1	1
-22	1	1
-231	6	6
-834	15	15
-617	1	1
-53	1	1
-243	1	1
-154	3	5
-571	11	16
-231	1	1
-47	1	1
-910	1	1
-45	1	1
-1510	1	1
-79	1	1
-2053	1	1
-48	1	1
-768	8	8
-546	1	1
-19	1	5702
-784	6	0
-275	20	13
-131	114	114
-363	1	1
-46	1	1
-396	1	1
-39	1	1
-75	15	15
-1875	1	0
-332	1	1
-49	1	1
-265	3	2
-55	1	1
-96	1	1
-136	1	0
-305	8	8
-297	0	2
-255	2	2
-23	1	1
-181	19	6
-151	0	1
-707	667	9324
-284	5	3
-73	1	1
-208	26	25
-34	0	773
-80	20	0
-2003	400	125
-163	2	0
-2630	9	1
-19	1	1
-100	12	0
-2421	0	2
-47	21227	0
-853	1	0
-1238	0	12
-3571	1	1
-20	0	1
-2483	15	15
-8803	287	9594
-5992
-
-chain 8627768 chr15_random 784346 + 422939 629603 chr15 102531392 - 19338638 19927596 385
-168	56	59
-73	4	4
-378	23	23
-868	29	29
-85	1	0
-528	119	5106
-152	31	31
-184	8	7
-322	0	1
-62	46	45
-77	37	46
-80	22	22
-201	45	47
-175	31	33
-1923	82	77
-546	7051	32690
-7810	209	153340
-1308	1	0
-9826	1	0
-1486	1	1
-148	1	0
-76	6	6
-53	36	34
-178	5447	565
-14	14505	121
-72	13	16
-57	1	1
-157	0	2
-11	1	1
-74	1	1
-24	3	3
-220	1	1
-54	1	1
-142	1	1
-82	2	0
-60	4	0
-99	1	1
-106	1	1
-98	1	1
-402	1	1
-79	4	7
-78	1	9
-5	0	1
-31	7	7
-65	1	1
-105	0	1
-22	6	8
-76	10	8
-47	0	1
-39	3	0
-5	1	3
-108	2	2
-61	16307	40121
-676	26	26
-7087	25	25
-20818	7	7
-2750	60358	90388
-69	54	53
-165	166	516
-42	0	42
-81	4	151
-18	0	42
-148	111	112
-73	4	4
-378	23	23
-868	29	29
-85	1	0
-528	8	8
-280	32	34
-426	78	79
-81	648	334
-181	8	7
-485	0	2
-1404	24	24
-101	36	38
-240	8	8
-77	53	54
-347	18	18
-72	9	9
-94	82	82
-384	8	8
-250	108	151474
-1152	0	1
-633	226	12498
-3255	4	0
-58	32	32
-6209	1	1
-30	1	0
-1060	2	0
-3747	4	4
-173	5	5
-2548	0	22
-2275	0	20
-606	41	41
-4653	12	12
-6138	0	1
-148	5	0
-244
-
-chain 3986761 chr15_random 784346 + 0 334816 chr15 102531392 - 78891064 79878228 248
-30328	8040	15984
-3015	1	0
-70	44499	160931
-52	0	5
-1038	1	1
-29	1	1
-1001	0	18
-680	0	329
-181	1	1
-32	1	1
-839	2	0
-440	0	3
-547	1	0
-278	1	0
-410	1	1
-26	3	0
-101	1	1
-24	1	1
-149	0	9
-179	2	1
-29	1	1
-226	3	0
-21	1	1
-473	10	0
-717	2	0
-1044	1	1
-23	1	1
-625	1	1
-41	1	0
-150	1	1
-62	1	1
-145	59	59
-242	12	12
-179	1	1
-64	1	1
-1405	1	1
-35	0	2
-469	5	0
-401	0	1
-25	0	10
-17	1	1
-55	1	1
-165	1	1
-1966	15	23
-839	0	18
-969	1	1
-44	1	1
-1905	1	1
-47	1	1
-1037	128	128
-486	5	0
-1086	2	1
-199	4	4
-59	2	0
-243	84	0
-410	1	1
-39	1	1
-70	0	324
-77	1	187
-42	4	151
-897	135051	676116
-64	54092	52483
-25	1	1
-88	9286	18277
-201	26614	5202
-33	1	0
-1
-
-chain 2185345 chr15_random 784346 + 423107 689458 chr15 102531392 + 82637661 83186296 482
-30	0	5
-26	1346	1346
-29	885	5865
-31	576	577
-46	77	77
-5	0	1
-32	303	304
-45	175	176
-31	1923	1923
-66	1943	144683
-715	0	1
-548	13	13
-1907	1	1
-16	1	1
-66	3	0
-1219	5	1
-1066	34012	198199
-7204	2446	2446
-2762	100	7680
-5162	1	0
-2782	1	1
-26	7	4
-49	1	1
-3627	3	0
-1686	133598	65296
-3109	1	1
-21	1	1
-1430	63	63
-335	3	3
-14	4	0
-203	1	1
-23	5	5
-1262	4	4
-323	1	1
-47	1	1
-417	0	1
-537	19	1
-1913	2	0
-1685	6	0
-1740	1	1
-49	1	1
-120	1	1
-30	0	3
-920	4	0
-479	30	30
-1207	1	1
-182	4	0
-72	3	1
-78	1	1
-150	1	1
-46	1	1
-222	1	1
-24	1	1
-74	1	1
-44	1	1
-391	1	1
-33	1	1
-149	9	8
-56	1	1
-30	1	0
-52	1	1
-298	6	0
-22	1	0
-29	1	1
-393	35	0
-145	36	36
-226	15	15
-185	7	7
-692	1	1
-34	1	1
-1291	0	2
-1824	5	5
-1119	1	1
-49	1	2
-1025	25013	44930
-835	88	11347
-692	0	2
-2551	3	0
-1144	82	77
-1939	26	28
-164	1	1
-44	0	2
-201	1	1
-133	5	14
-77	1	1
-44	1	0
-92	1	0
-293	8	7
-184	31	31
-381	8	8
-384	1	1
-80	1	1
-94	9	9
-57
-
-chain 1845967 chr15_random 784346 + 61569 84889 chr15 102531392 - 73695594 73766494 782
-153	33	33
-49	1	0
-197	15	15
-67	62	62
-241	12	9
-185	41	44
-64	23	23
-559	50	50
-333	46	46
-397	6	6
-141	4	0
-660	50	50
-315	38	38
-282	309	47864
-57	7	7
-85	39	39
-340	62	62
-43	0	1
-77	0	1
-768	0	12
-71	70	69
-102	17	17
-58	45	50
-676	2	0
-430	21	22
-112	0	1
-401	4	0
-617	95	95
-168	50	50
-442	4	0
-91	114	114
-463	0	1
-94	28	28
-1577	16	16
-572	0	1
-1451	55	55
-2327	51	51
-394	1	0
-109	21	24
-660	50	54
-703	1	0
-93	22	22
-94	48	48
-219	46	46
-352	22	22
-150	155	161
-173	19	19
-162	6	12
-1201	48	49
-119	17	17
-435	4	4
-146	38	38
-946	10	10
-98	37	37
-60	47	47
-579
-
-chain 1297748 chr15_random 784346 + 203918 328028 chr15 102531392 - 73698913 73856126 264
-567	109104	118059
-369	106	23997
-700	2	0
-40	0	248
-320	0	33
-130	1	1
-18	1	1
-138	20	20
-1341	8	0
-863	1	1
-48	1	1
-240	1	1
-34	20	0
-3218	1	1
-20	1	1
-2062	46	46
-285	14	14
-937	1	1
-25	3	3
-305	1	1
-42	1	1
-706	2	0
-232	1	1
-67	1	1
-88	4	5
-844	1	1
-82	1	1
-430	0	7
-78	1	1
-458	27	27
-52
-
-chain 898399 chr15_random 784346 + 457589 504019 chr15 102531392 - 19636589 19905366 626
-5344	14	14
-7167	26767	249114
-26	7087	7087
-25
-
-chain 844102 chr15_random 784346 + 95554 784338 chr15 102531392 + 22730405 27183335 411
-59	9906	9932
-128	2128	2090
-42	1792	637909
-89	10	10
-71	198	198
-122	137	141
-341	29	29
-104	103	103
-395	11	14
-667	6	7
-74	7	0
-178	1	5
-203	9	4
-172	55	55
-791	25	25
-714	19	22
-597	133	133
-142	2	0
-252	0	4
-260	67	67
-41	6	0
-860	29	30
-258	93	95
-1793	11	11
-358	71	70
-242	1	1
-20	1	1
-1308	0	3
-468	0	2
-755	1	1
-81	2	2
-72	3	0
-597	4	4
-492	25	7
-1459	10	9
-674	16	16
-711	1	1
-49	1	1
-1525	1	1
-45	1	1
-2919	1	1
-36	1	1
-493	1	1
-21	1	1
-830	16	0
-3	7	0
-644	17	17
-479	0	1
-2343	0	315
-307	8	311
-87	0	3
-330	42	0
-520	7	6
-72	2	1
-745	6	6
-324	6	0
-398	22	22
-118	27	27
-68	600887	3728395
-44872
-
-chain 555121 chr15_random 784346 + 634265 679702 chr15 102531392 + 82723475 82991213 602
-20	1	1
-41	24204	246463
-2085	6	6
-667	14	14
-596	0	24
-1743	415	422
-870	1	0
-3572	1	1
-1152	8	0
-498	0	1
-3239	1	1
-34	1	1
-1283	1	1
-41	1	0
-676	0	2
-2078	0	1
-1283	0	18
-681	1	0
-223
-
-chain 530253 chr15_random 784346 + 409131 430676 chr15 102531392 - 19567939 19581201 1716
-786	8	0
-171	8918	159
-2113	8268	8752
-1281
-
-chain 417534 chr15_random 784346 + 35735 80744 chr15 102531392 + 23413134 23608954 1095
-840	0	54
-916	0	2
-777	3337	13583
-637	50	57
-858	0	4
-779	0	14
-171	1	2
-927	4	0
-1753	2	0
-814	35	35
-1073	14	14
-81	99	101
-66	42	42
-1291	66	66
-240	45	48
-68	36	36
-98	38	38
-1141	5	5
-70	14	15
-150	46	46
-650	13461	153954
-62	1206	1201
-45	3148	3138
-46	6617	6616
-50	2415	2415
-46	615	621
-64
-
-chain 169648 chr15_random 784346 + 417136 418914 chr5 180915260 + 131590649 131592427 748288
-1778
-
-chain 152639 chr15_random 784346 + 200201 201828 chr15 102531392 + 28662778 28664407 841936
-970	0	1
-468	5	6
-184
-
-chain 151945 chr15_random 784346 + 110737 203590 chr15 102531392 - 73700255 73867708 1083
-74	87238	121334
-88	426	14673
-942	2	0
-567	1880	28137
-86	1	1
-62	1	1
-716	14	14
-212	0	1
-468	0	1
-76
-
-chain 142059 chr15_random 784346 + 583198 664057 chr15 102531392 - 16763491 17663089 651
-176	7	7
-242	7	7
-1002	1	1
-61	1	1
-286	10	10
-1697	57790	716388
-17	1	1
-12	3589	70884
-35	145	145
-36	6576	99374
-431	11	1
-19	0	4
-96	2	0
-98	1	1
-62	1	1
-1047	10	15
-223	1	0
-575	2	0
-465	1	0
-8	1	1
-140	1	4
-65	1	1
-381	5111	5164
-145	1	1
-29	1	6
-32	8	2
-199
-
-chain 140486 chr15_random 784346 + 414032 415531 chr5 180915260 + 131627050 131628561 916856
-486	0	13
-290	2	1
-721
-
-chain 136843 chr15_random 784346 + 411466 412886 chr5 180915260 - 49283520 49284940 941594
-1420
-
-chain 113176 chr15_random 784346 + 577887 601700 chr15 102531392 + 85729223 85793813 754
-51	12	12
-630	1	1
-27	5	5
-51	41	41
-249	505	29710
-148	24	24
-110	0	2
-145	12	11
-646	54	53
-291	404	700
-590	7	0
-154	1	1
-36	5	3
-106	1	1
-42	1	1
-517	181	27
-164	18572	30011
-30
-
-chain 110898 chr15_random 784346 + 410214 411366 chr5 180915260 - 49350156 49351308 1158024
-1152
-
-chain 90718 chr15_random 784346 + 415631 422839 chr5 180915260 - 49281425 49321173 523505
-1405	4191	36723
-57	0	4
-785	0	4
-770
-
-chain 87628 chr15_random 784346 + 412986 413908 chr15 102531392 + 82958289 82959211 1453275
-922
-
-chain 78489 chr15_random 784346 + 408080 408895 chr5 180915260 + 131628738 131629553 1616335
-815
-
-chain 75848 chr15_random 784346 + 328894 334289 chr15 102531392 + 28663807 28669202 22165
-415	0	1
-219	14	14
-716	1	1
-62	1	1
-1820	1	0
-432	1	1
-21	1	1
-549	1	1
-42	1	1
-1098
-
-chain 55946 chr15_random 784346 + 579203 582900 chr15 102531392 - 19568187 19572180 874
-256	1085	1091
-54	291	291
-49	100	396
-255	1464	1453
-62	1	6
-80
-
-chain 50039 chr15_random 784346 + 328288 328894 chr15 102531392 - 73792653 73793260 1678654
-449	99	100
-58
-
-chain 41737 chr15_random 784346 + 53223 55079 chr15 102531392 - 79138743 79140590 1899
-987	5	0
-378	4	0
-30	1	1
-324	1	1
-36	1	1
-89
-
-chain 40184 chr15_random 784346 + 35650 52319 chr15 102531392 + 23578289 23604839 1865
-85	6507	16388
-50	5309	5309
-35	1168	1168
-99	66	66
-42	1291	1291
-66	240	240
-45	68	68
-36	98	98
-38	1380	1380
-46
-
-chain 36402 chr15_random 784346 + 63654 139260 chr15 102531392 + 20712328 20743651 996
-46	46877	2371
-29	5894	5886
-28	261	261
-55	0	3
-35	2163	2163
-70	17110	17298
-32	0	42
-10	2220	2218
-27	68	68
-335	31	31
-315
-
-chain 33407 chr15_random 784346 + 63271 84310 chr15 102531392 + 28567817 28636450 784
-50	2730	50298
-39	1361	1355
-70	2485	2497
-95	168	168
-50	618	618
-33	8782	8789
-48	4472	4485
-38
-
-chain 26884 chr15_random 784346 + 71527 84203 chr15 102531392 + 23434933 23447596 1313
-28	3628	3632
-43	3563	3545
-38	1762	1762
-91	1625	1625
-17	1	1
-30	721	722
-38	1054	1054
-37
-
-chain 17994 chr15_random 784346 + 577754 595591 chr15 102531392 + 82746005 82941680 2345
-133	777	777
-41	8083	152910
-1120	114	33023
-47	1	1
-5	265	681
-66	293	293
-111	2277	2277
-32	585	587
-5	0	1
-25	0	1
-6	1	0
-11	3164	2847
-53	540	540
-82
-
-chain 17584 chr15_random 784346 + 334305 334490 chr15 102531392 - 73868107 73868292 12488910
-185
-
-chain 16638 chr15_random 784346 + 334590 334767 chr15 102531392 + 28693782 28693959 13398527
-177
-
-chain 15574 chr15_random 784346 + 203754 203918 chr15 102531392 + 20713399 20713563 2884965
-164
-
-chain 11941 chr15_random 784346 + 112567 138945 chr15 102531392 + 28572611 28599524 1070
-24	791	791
-25	2119	2124
-57	23331	23861
-31
-
-chain 10106 chr15_random 784346 + 307857 307966 chr15 102531392 - 73812018 73812127 6634519
-109
-
-chain 9879 chr15_random 784346 + 198177 198415 chr15 102531392 + 28709863 28710101 596395
-238
-
-chain 5493 chr15_random 784346 + 34234 34291 chrY 59373566 + 27644447 27644504 32044688
-57
-
-chain 4133 chr15_random 784346 + 323293 323339 chr15 102531392 + 22666870 22666916 2166
-46
-
-chain 4016 chr15_random 784346 + 328237 328288 chr15 102531392 + 28668851 28668902 1790991
-51
-
-chain 3958 chr15_random 784346 + 107733 107775 chr15 102531392 - 78958306 78958348 1193
-42
-
-chain 3427 chr15_random 784346 + 198013 198049 chr15 102531392 + 20714128 20714164 4212128
-36
-
-chain 3014 chr15_random 784346 + 591545 685196 chr15 102531392 - 19431434 19585695 819
-47	89045	149655
-87	4422	4422
-50
-
-chain 2874 chr15_random 784346 + 307826 307857 chr15 102531392 - 73812018 73812049 6634520
-31
-
-chain 2855 chr15_random 784346 + 198147 198177 chr15 102531392 + 28831982 28832012 6776371
-30
-
-chain 2097 chr15_random 784346 + 200178 200201 chr15 102531392 - 79852957 79852980 911500
-23
-
-chain 1855 chr15_random 784346 + 307785 307816 chr15 102531392 + 28688468 28688499 5960032
-31
-
-chain 1291 chr15_random 784346 + 110710 110736 chr15 102531392 - 73822377 73822403 1552683
-26
-
-chain 1093 chr15_random 784346 + 687136 688443 chr15 102531392 - 19508634 19509938 742
-25	1251	1248
-31
-
-chain 7474990131 chr16 88827254 + 0 88822254 chr16 90354753 + 60000 90294753 17
-172342	0	1
-112	1	0
-5627	2	1
-8398838	17500	50000
-25336229	100000	150000
-1112651	9800000	11100000
-42003582	20000	50000
-1855370
-
-chain 9963354 chr16_random 105485 + 0 105485 chr16 90354753 + 29712462 29819360 326
-5589	7	8
-6783	0	218
-41	1	3
-38	1	1
-234	9	9
-219	46	0
-15	0	50
-3818	0	1
-1090	1	1
-45	1	1
-308	1	0
-524	0	4
-984	1	1
-24	1	0
-970	0	2
-106	1	1
-25	2	1
-436	0	5
-296	1	1
-23	2	0
-813	0	1
-1173	1	0
-5500	1	0
-1193	16	16
-1329	0	1
-2727	0	1
-3622	0	13
-3844	3	0
-5076	0	1
-4157	2	0
-178	0	2
-126	1	1
-344	5	6
-497	1	0
-620	7	7
-378	0	1
-669	24	25
-211	1	5
-453	0	11
-176	0	1
-486	0	8
-326	1	0
-2143	40	9
-2337	0	1
-866	1	0
-10	2	2
-1366	1	1
-44	1	1
-831	1	1
-45	1	1
-1612	6	5
-3801	0	1
-910	0	2
-486	0	1
-2775	1	0
-1083	1	0
-1793	1	1
-50	0	1
-1339	0	2
-145	17	17
-651	10	10
-1140	0	1
-724	1	1
-39	1	1
-3261	1	0
-1513	0	9
-606	22	0
-2027	27	19
-3470	11	0
-4100	3	0
-2045	0	4
-1047	0	1
-6647	78	1279
-748
-
-chain 7369813928 chr17 78774742 + 0 78653129 chr17 81195210 + 0 81060000 18
-252627	1	1
-24	1	1
-33	0	29
-566	87	0
-116	58	0
-92	29	0
-79	8	37
-485	1	59
-28	1	1
-76	233	1
-27	29	0
-2764	17	20
-2220	18	18
-837	1	1
-39	1	1
-564	1	1
-14	1	1
-2523	39	9
-1824	0	56
-76	29	0
-1681	0	1
-414	0	3
-256	0	68
-119	10	10
-290	0	4
-3193	1	0
-2562	0	4
-1809	3	0
-84	1	1
-62	1	1
-3703	0	27
-2041	16	0
-911	0	2
-696	4	4
-1428	15	15
-290	1	0
-1779	0	1
-60	1	1
-216	0	1
-375	1	1
-41	0	1
-9221	46522	100000
-3080543	0	1
-1208216	0	2
-1370	2	0
-1279	0	4
-322	0	5
-5661	210	0
-307	21	22
-973	8	0
-2901	1	0
-8479	0	1
-4122	7	0
-3187	4	0
-571	0	1
-167	0	1
-10174	7	7
-856	2	1
-1630	1	0
-4258	3	1
-1688	1	0
-264	0	304
-796	1	0
-8494	0	10
-2273	1	0
-8297	1	0
-1500	1	4
-733	2	2
-40	1	0
-4	0	1
-15	19	1
-64	1	253
-22	0	34
-18	1	205
-2070	2	0
-2981	14	13
-1309	0	1
-3991	3	0
-1939	0	3
-887	0	2
-463	18	0
-64	0	3
-2104	0	20
-556	0	4
-121	0	1
-3670	2	0
-4345	0	5394
-5334	0	1
-2505	4	10
-6776	14	11
-9573	0	1
-1136	0	2
-3754	1	0
-4588	1	0
-637	17	17
-1285	8	0
-369	0	1
-2084	1	0
-492	2	0
-517	0	4
-954	0	2
-1517	1	0
-958	9	0
-807	14	14
-357	0	10
-3611	0	2
-3191	0	39
-742	1	0
-646	2	0
-2211	1	0
-14829	1	0
-3465	11	0
-31	0	33
-833	16	16
-1345	0	1
-6443	5	4
-2627353	1	0
-11581979	0	43
-25	0	89
-238783	0	1
-1830653	1	0
-419873	100008	116477
-5587	6	0
-11056	0	2
-3240	1	0
-1237	0	2
-373	1	1
-43	1	1
-558379	100000	3000000
-1823446	0	1
-2728383	0	1
-29	0	1
-138	1	0
-144	6	8
-38	0	2
-7	0	1
-18	1	1
-70935	10	13
-52	28	31
-189	0	1
-41	2	2
-750363	44	44
-4038953	100000	50000
-1524006	1	1
-47	1	1
-231	2	0
-1175	1	0
-555	1	1
-49	1	1
-568	7	0
-605	2	0
-4954	1	1
-18	6	7
-567	0	1
-421	2	0
-943	75	67
-777	0	3
-925	3	0
-5	4	0
-318	1	0
-230	20	13
-244	1	1
-13	0	1
-42	1	1
-220	1	1
-56	1	1
-101	225	0
-1113	1	0
-17	1	1
-2614	4	0
-3186	50	50
-3872	0	2
-617	14	0
-5674	0	2
-1852	1	1
-63	1	1
-56	1	1
-25	1	1
-332	0	6
-423	5	5
-61	4	0
-108	1	1
-46	1	1
-160	2	2
-72	1	1
-162	1	1
-20	1	1
-53	1	1
-63	1	1
-112	1	1
-59	1	1
-5885	2	0
-255	36	36
-6246	1	1
-114	1	1
-255	1	1
-49	1	1
-210	1	1
-138	157793	28603
-927	5	0
-212	7	7
-641	17	17
-1296	46	46
-2513	71	69
-76	1	2
-61	50226	0
-1959	18	18
-2727	22	22
-6616	1	0
-5109	68	86
-2450	7	7
-50	10	0
-3439	0	4
-4179	0	4
-2749	0	1
-1124	8	0
-56	1	1
-1840	14	14
-624	8	0
-1743	4	0
-3689	0	4
-2051	0	1
-751	0	1
-2111	10	11
-3110	1	0
-682	1	0
-2795	5	2
-241	0	1
-165	1	3
-1258	0	1
-1602	5	0
-3715	0	1
-1308	0	1
-2058	1	0
-1624	0	1
-478	4	0
-9	6	0
-35	3	1
-47	0	1
-2425	1	0
-1178	0	4
-33	1	1
-415	5	5
-887	1	3
-946	29	29
-630	15	0
-259	2	0
-78	0	1
-4570	0	1
-322	1	0
-1801	2	0
-836	3	0
-1509	0	1
-1732	0	1
-935	0	6
-1372	1	0
-625	2	12
-5009	1	1
-75	0	1
-20	1	0
-153	20	21
-489	4	326
-1375	1	0
-774	1	1
-16	1	1
-3642	5	0
-497	4	0
-174	9	0
-1317	0	3
-508	0	1
-1126	1	0
-1952	0	2
-565	2	0
-871	0	1
-1460	6	0
-55	0	1
-420	6	0
-57	1	1
-119	1	1
-427	1	0
-459	14	11
-448	0	1
-1275	7	7
-360	1	0
-73	1	1
-48	1	1
-4920	3	0
-713	41	34
-691	1	1
-44	1	1
-1642	9	10
-566	0	1
-173	0	4
-798	0	10
-810	1	0
-78	18	17
-1531	0	2
-1274	1	1
-39	1	1
-53	3	1
-202	0	1
-707	17	17
-1733	0	1
-14053	3	0
-286	3	1
-5600	4	0
-6458	0	1
-4866371	102000	0
-1870113	257	0
-590050	6	18
-2095	12	12
-24846	1	0
-5154	22	22
-1561	0	4
-5946	1	0
-2317	0	4
-1643	1	1
-27	1	1
-1237	1	0
-2698	1	1
-140	1	1
-1689	0	2
-836	29	30
-5333	1	0
-509	1	0
-5216	6	0
-10782	47	47
-1095	13	3
-1039	0	1
-11605	1	0
-22064	0	1
-16612	8	0
-902	1	0
-757	1	0
-619	0	1
-10979	1	1
-18	1	1
-1517	1	0
-4576	1	0
-12559	4	0
-2725	0	1
-5291	2	0
-8706	0	1
-83	1	0
-424	0	7
-72	38	0
-5528	1	0
-23971	1	0
-7855	54	22
-4095	0	1
-803	5	5
-6382	6	0
-3545	0	28
-4265	0	2
-13194	6	6
-6463	1	0
-26075	1	1
-59	1	1
-10791	17	7
-707	0	1
-210	1	0
-1655	0	2
-5301	1	0
-1930	1	0
-14632	2	0
-1043	1	0
-3607	3	0
-312	0	1
-5953	2	0
-170	0	17
-489	0	1
-5260	0	28
-888	10	0
-2461	10	10
-237	2	0
-1716	3	1
-10691	0	4
-3757	1	0
-6173	0	1
-8017	1	2
-3594	0	4
-5439	0	1
-4138	28	57
-6418	0	1
-1267	1	0
-720	0	6
-1083	2	0
-3878	0	1
-3310	23	23
-4349	1	1
-44	1	1
-3135	0	1
-174853	1	2
-2008	7	7
-5657	0	1
-6496	0	3
-89	0	5
-665	0	1
-954	46	46
-375	7	8
-1248	28	28
-2041	0	2
-2753	1	0
-1863	0	3
-3228	1	0
-3575	0	4
-40	1	1
-6488	0	2
-8612	11	11
-3795	0	16
-2105	0	1
-268	1	1
-22	3	0
-7889	4	0
-701	4	0
-2411	28	34
-2943	2	3
-8420	1	0
-926	0	324
-6732	1	0
-543	4	3
-4028	2	0
-51	52	40
-3000	1	0
-530	1	0
-2083	0	2
-1173	0	17
-119	16	16
-2727	1	0
-543	0	1
-783	1	0
-1372	0	4
-8624	20	0
-278	44	44
-4364	51	50
-2856	0	1
-5399	0	1
-1506	1	0
-919	0	6
-7229	10	0
-3225	1	0
-435	1	0
-2814	47	47
-1577	0	132
-9785	0	1
-2035	6	0
-7655	1	0
-198207	0	132
-11704	0	5
-7648	1	0
-9062	4	0
-8778	0	2
-7014	1	0
-1613	0	2
-790	7	5
-7433	1	0
-6482	12	12
-6798	0	1
-1422	1	0
-3454	1	1
-43	1	1
-3097	0	2
-334	0	18
-1444	1	0
-2400	3	0
-3272	0	1
-9106	1	0
-1573	0	1
-4742	1	0
-3366	1	0
-5484	0	1
-2444	0	5
-5448	8	8
-2539	0	1
-1471	0	1
-238	1	1
-16	1	1
-288	5	5
-2995	0	2
-951	1	1
-35	1	1
-279	16	15
-3534	6	0
-3513	0	1
-163	0	1
-6173	0	1
-1074	1	0
-2818	1	0
-2868	0	1
-3796	1	0
-1118	1	167
-1278267	25	25
-10747172	0	217
-3504877	0	1053
-10844	13	11
-18805	1	0
-1960834	126729	50000
-3065	1	0
-3601036	90008	8833
-34292	1	0
-1834	0	44
-3083	1	1
-43	1	1
-789	1	0
-11432680	153000	50000
-1902015	0	4098
-99	0	21
-3183	6	6
-877	1	1
-49	1	1
-296	0	1
-1375	1	1
-21	1	1
-607	5	5
-98	0	22
-6811	1	1
-17	0	11
-3804	1	0
-1356	1	1
-29	1	1
-297	1	0
-9543	0	2
-3130	0	4
-861	0	1
-27346	1	0
-7547	8	6
-2834	0	2
-394	4	0
-6524	1	0
-405	11	8
-1128	7	0
-271	1	1
-21	0	28
-507	6	0
-1211	44	31
-384	0	3
-521	18	18
-395	11	0
-799	1	1
-25	3	2
-51	1	49
-49	1	1
-558	0	1
-351	1	0
-2779	13	13
-114398	65008	82124
-7795	0	1
-18	1	1
-4140	1	0
-28048	1	1
-32	1	1
-4630	1	0
-4573	3	0
-357	2	0
-4812	1	0
-14372	0	3
-203	0	1
-26257	1	0
-2734	0	2
-19262	5	5
-5022	0	1
-25471	0	1
-1114538	0	53
-82	126	0
-1416	16	16
-629	57	0
-463	1	0
-148	1	1
-24	1	1
-2322	1	1
-23	1	0
-725	0	16
-24	16	0
-95	9	9
-1277	0	1
-2498	0	1
-354	49	0
-41	0	50
-17	0	49
-37	0	49
-65	8	152
-906	0	47
-234
-
-chain 3352932 chr17 78774742 + 33364384 33585329 chr17 81195210 - 44852585 44945131 363
-36	7017	7017
-2072	1	1
-16	1	1
-2167	2	0
-2513	1	1
-44	1	1
-1296	17	17
-860	5	0
-1482	0	11
-3433	1	1
-18	1	1
-393	0	3
-198	19	18
-1850	4	5
-267	1	0
-1125	6	7
-1255	1	0
-1502	0	1
-37	0	1
-26	0	1
-302	0	1
-1164	4	2
-1145	8	8
-1170	0	1
-298	1	2
-330	1	0
-2433	13	13
-79	0	2
-5343	1	1
-26	1	1
-994	1	3
-943	0	3
-2485	1	1
-22	1	1
-1574	129212	0
-265	54	54
-5225	26	26
-995	36	36
-240	1	0
-5900	61	61
-112	65	65
-53	14	14
-150	95	95
-160	48	48
-108	70	66
-401	0	6
-354	27	27
-56	65	65
-716	5	3
-1097	4	0
-518	27	27
-944	11	11
-579	37	37
-614	1	0
-2967	12	0
-601	1	10
-1307	35	35
-1719	0	889
-1973	0	3
-709	2	0
-496	5	1
-185	11	11
-98	1	0
-724	3	0
-2103	0	5
-1038	0	1
-257	7	0
-231	1	0
-312	0	2
-423	6	6
-520	10	13
-294	1	0
-17	1	1
-413	4	0
-1698	1	1
-46	1	1
-597	1	1
-21	1	1
-1182	0	2
-50	1	1
-44	0	2
-34	66	3
-3318	3	0
-624	7	0
-507	0	1
-60	1	1
-49	1	1
-332	1	1
-38	1	1
-77	1	1
-19	1	1
-65	1	0
-1174	5	0
-76
-
-chain 1309281 chr17 78774742 + 33410392 33424757 chr17 81195210 + 36336024 36350387 1779
-203	116	116
-6522	2	0
-5195	584	584
-1743
-
-chain 421642 chr17 78774742 + 33424760 33429230 chr17 81195210 - 44789041 44793512 103557
-258	1	0
-320	0	1
-3477	0	1
-414
-
-chain 288364 chr17 78774742 + 33534894 33553104 chr17 81195210 + 60335980 60353933 1564
-39	403	82
-124	31	31
-264	17	18
-283	79	89
-146	36	36
-392	27	27
-75	32	32
-295	106	106
-170	1	0
-69	35	35
-148	57	57
-152	23	23
-96	16	16
-594	57	58
-172	87	87
-108	39	39
-156	68	68
-148	63	63
-54	9	9
-39	289	289
-30	13136	13189
-45
-
-chain 141893 chr17 78774742 + 38701721 38703214 chr17 81195210 + 41346194 41347687 907641
-1493
-
-chain 138910 chr17 78774742 + 59795041 59797994 chr3 198022430 + 46191235 46194190 927459
-65	140	139
-77	32	32
-50	53	53
-51	108	111
-72	86	86
-65	76	76
-109	74	74
-120	2	0
-121	111	111
-69	23	23
-101	39	39
-56	40	40
-294	20	20
-65	100	100
-105	124	124
-147	116	116
-64	108	110
-70
-
-chain 73899 chr17 78774742 + 33536708 33552896 chr17 81195210 + 36333128 36349315 1571
-27	75	75
-32	306	306
-95	240	240
-35	148	148
-57	881	881
-57	172	172
-87	108	108
-39	156	156
-68	148	148
-63	6667	6667
-36	6153	6152
-49	112	112
-64	239	239
-74
-
-chain 29385 chr17 78774742 + 33422514 33422962 chr17 81195210 + 60352539 60352987 2653
-73	72	72
-133	53	53
-117
-
-chain 28843 chr17 78774742 + 33535172 33536316 chr17 81195210 + 34740000 34741144 3516
-164	124	124
-31	564	564
-79	146	146
-36
-
-chain 23419 chr17 78774742 + 40573363 40573608 chr17 81195210 - 37977034 37977279 7093437
-245
-
-chain 22267 chr17 78774742 + 59795106 59797450 chr15 102531392 + 100960318 100962666 927477
-74	509	513
-86	250	250
-74	1061	1061
-100	108	108
-82
-
-chain 19110 chr17 78774742 + 33422430 33422845 chr17 81195210 + 34807497 34807912 5737
-84	73	73
-72	133	133
-53
-
-chain 15302 chr17 78774742 + 59872221 59872543 chrX 155270560 + 133327972 133328295 14745200
-91	145	146
-86
-
-chain 15089 chr17 78774742 + 33553212 33554185 chr17 81195210 + 34758015 34758988 3454
-70	755	755
-27	56	56
-65
-
-chain 12559 chr17 78774742 + 41846587 41875489 chr17 81195210 + 44708735 44737620 783
-44	4372	4365
-43	24396	24386
-47
-
-chain 12028 chr17 78774742 + 253252 253513 chr17 81195210 + 253455 253745 1186280
-87	116	116
-26	30	59
-2
-
-chain 9840 chr17 78774742 + 59850421 59850563 chr12 133851895 - 30785452 30785594 23191844
-56	27	27
-59
-
-chain 8117 chr17 78774742 + 33410595 33410681 chr17 81195210 + 34744635 34744721 10477
-86
-
-chain 7470 chr17 78774742 + 59872141 59872220 chr8 146364022 - 25940938 25941017 21166303
-79
-
-chain 6548 chr17 78774742 + 59823421 59823489 chr9 141213431 + 108396482 108396550 29214974
-68
-
-chain 6212 chr17 78774742 + 33601781 33601849 chr17 81195210 + 34807429 34807497 5781
-68
-
-chain 6147 chr17 78774742 + 33578902 33578968 chr17 81195210 + 34784578 34784649 3380
-29	0	5
-37
-
-chain 5883 chr17 78774742 + 33556525 33558123 chr17 81195210 + 34761324 34762919 3874
-27	1534	1531
-37
-
-chain 5739 chr17 78774742 + 59862459 59862519 chr13 115169878 + 43436593 43436653 31343618
-60
-
-chain 5729 chr17 78774742 + 59852430 59852489 chr7 159138663 - 42785228 42785287 31366016
-59
-
-chain 5493 chr17 78774742 + 254397 254454 chr17 81195210 + 254136 254193 32044913
-57
-
-chain 5493 chr17 78774742 + 254339 254396 chr17 81195210 + 254136 254193 32044914
-57
-
-chain 4633 chr17 78774742 + 59795405 59797489 chr7 159138663 + 22571262 22573349 985966
-53	1992	1995
-39
-
-chain 3684 chr17 78774742 + 59871978 59872017 chr5 180915260 + 67132991 67133030 32368210
-39
-
-chain 3604 chr17 78774742 + 59872312 59872350 chr6 171115067 + 73766967 73767005 18649321
-38
-
-chain 3578 chr17 78774742 + 59797823 59797921 chr9 141213431 - 46000791 46000889 1219359
-98
-
-chain 3496 chr17 78774742 + 59872079 59872141 chrX 155270560 - 52661918 52661980 17303862
-62
-
-chain 3063 chr17 78774742 + 59796390 59796453 chr18 78077248 + 3738092 3738155 1007405
-63
-
-chain 2832 chr17 78774742 + 78651772 78651801 chr17 81195210 + 81058451 81058480 35013371
-29
-
-chain 2507 chr17 78774742 + 254312 254338 chr17 81195210 + 254167 254193 28153285
-26
-
-chain 2327 chr17 78774742 + 253481 253511 chr17 81195210 + 253858 253888 2965414
-30
-
-chain 2229 chr17 78774742 + 59795509 59795562 chr9 141213431 + 99971007 99971060 1163412
-53
-
-chain 2158 chr17 78774742 + 59871912 59871978 chr10 135534747 - 7120285 7120351 17475521
-66
-
-chain 2116 chr17 78774742 + 41755737 41755765 chr17 81195210 - 18330211 18330239 723
-28
-
-chain 2038 chr17 78774742 + 59872018 59872072 chr12 133851895 - 60047857 60047911 21673207
-54
-
-chain 1971 chr17 78774742 + 33410681 33410711 chr17 81195210 + 58084086 58084116 2335
-30
-
-chain 1910 chr17 78774742 + 59797697 59797752 chr7 159138663 - 95523915 95523970 1276958
-55
-
-chain 1797 chr17 78774742 + 59795569 59795617 chr8 146364022 - 39560190 39560238 1234503
-48
-
-chain 1764 chr17 78774742 + 59795840 59795881 chr17 81195210 - 78142303 78142344 1077161
-41
-
-chain 1713 chr17 78774742 + 59797636 59797671 chr10 135534747 - 112842234 112842269 1000659
-35
-
-chain 1680 chr17 78774742 + 59795180 59795214 chr3 198022430 + 108471362 108471396 1315432
-34
-
-chain 1591 chr17 78774742 + 59795881 59795916 chrX 155270560 - 139019545 139019580 1025236
-35
-
-chain 1456 chr17 78774742 + 59796656 59796685 chr6 171115067 + 121488440 121488469 989186
-29
-
-chain 1332 chr17 78774742 + 33532356 33535172 chr17 81195210 + 34572150 34574966 5130
-25	2722	2722
-69
-
-chain 1250 chr17 78774742 + 59795215 59795246 chr11 135006516 - 104930893 104930924 1222490
-31
-
-chain 1089 chr17 78774742 + 59795324 59795355 chrX 155270560 - 141145732 141145763 1311664
-31
-
-chain 1006 chr17 78774742 + 59797671 59797695 chrX 155270560 + 72606434 72606458 1154867
-24
-
-chain 622 chr17 78774742 + 33334125 33344374 chr17 81195210 - 46414201 46424210 397
-69	10130	9890
-50
-
-chain 20335446 chr17_random 2617613 + 224588 1377183 chr17 81195210 - 41910550 46712950 133
-1433	3	0
-976	0	1
-281	0	1
-1231	0	14
-2584	0	15
-2816	1	0
-3815	1	0
-122	1	1
-25	1	1
-335	0	1
-4687	29	0
-68	0	1
-1769	32	0
-616	3	0
-1017	1	1
-35	1	1
-864	17	17
-321	4	4
-47	1	1
-6467	8	10
-746	1	0
-188	30	0
-179	14	14
-120	1	1
-19	1	1
-477	1	1
-25	1	1
-300	5	5
-33	4	4
-968	6	6
-1546	1	1
-39	1	1
-66	1	1
-92	1	1
-349	12	12
-839	3	3
-36	1	1
-654	1	1
-88	1	1
-647	3	0
-993	10	8
-296	0	12
-183	4	4
-385	1	1
-25	1	1
-405	1	1
-29	1	1
-108	1	1
-36	1	1
-57	1	1
-88	2	1
-78	4	4
-39	1	1
-133	1	1
-133	1	1
-162	1	8
-398	14	14
-52	16	16
-122	1	1
-56	1	1
-98	1	1
-25	1	1
-332	1	1
-48	1	1
-83	0	1
-25	1	1
-71	1	1
-71	1	1
-79	4	0
-87	1	1
-207	1	1
-70	1	1
-263	16	16
-143	1	1
-72	1	1
-198	0	1
-1062	104	0
-6	61	0
-278	8	8
-454	49	49
-297	0	1
-1271	1	1
-48	1	1
-85	1	1
-66	1	1
-89	1	0
-327	1	1
-61	1	1
-51	1	1
-25	2	2
-72	1	1
-80	1	1
-132	1	1
-136	4	4
-63	1	1
-47	1	1
-134	1	1
-28	1	1
-1004	1	1
-45	1	1
-2017	1	1
-22	1	1
-778	8	0
-3805	0	4
-3884	1	0
-1082	1	1
-39	1	1
-926	1	0
-12182	105	0
-19079	4	0
-108	0	6
-81968	13	12
-5894	126	0
-5069	696334	2698100
-65	1	1
-31	0	1
-165	15	0
-2504	0	2
-1155	0	10
-463	1	0
-2422	0	1
-90	10	0
-75	0	1
-397	0	1
-64	31	32
-1531	4	0
-2064	0	1
-1305	1	0
-1045	0	1
-1972	0	1
-3554	0	2
-428	1	0
-1541	10	12
-1808	1	0
-1758	0	1
-500	1	0
-737	1	0
-218	0	1
-2132	0	1
-744	0	1
-7456	2	0
-45	0	2
-2311	23	23
-727	0	2
-916	1	0
-360	5	5
-2956	0	1
-3263	3	0
-1460	1	1
-34	1	1
-117	1	0
-1852	10	0
-50	7	7
-3949	42	42
-528	40	40
-736	100	17954
-680	119199	29667
-516	22	22
-2397	100	1694896
-1291	0	4
-232	1	1
-32	1	1
-1529	0	4
-20	2	0
-42	0	2
-94	0	10
-402	1	1
-16	1	1
-1099	1	1
-49	1	1
-2223	32	32
-1530	36	36
-1563	57608	84063
-160	94	94
-164	108	108
-123	61	61
-136	449	449
-3509	28	28
-1092	1	0
-611	1	1
-28	1	1
-2932	1	1
-52	49	45
-64	1	1
-27	1	1
-1320	1074	0
-6819	0	1
-4716
-
-chain 16836081 chr17_random 2617613 + 2022361 2536424 chr17 81195210 + 77630507 81150656 169
-143	0	4
-116	4	4
-74	12	10
-298	1	0
-533	1	0
-340	27	27
-130	16	16
-184	15	14
-699	1	0
-68	1	0
-153	1	0
-1835	1	0
-5	2	0
-95	1	0
-105	6	4
-14	1	0
-10	1	0
-88	1	0
-63	1	0
-27	1	0
-37	1	0
-18	1	0
-75	1	0
-49	2	0
-366	1	0
-206	1	0
-114	1	0
-237	1	0
-265	16	12
-223	1	0
-182	1	0
-26	1	0
-34	1	0
-138	1	0
-170	1	0
-26	1	0
-16	1	0
-53	4	2
-85	1	0
-188	1	0
-107	1	0
-31	1	0
-180	1	0
-4	2	1
-4	1	0
-16	1	0
-21	1	0
-324	1	0
-106	2	0
-46	1	0
-74	1	0
-12	1	0
-557	2	0
-194	5	2
-23	1	0
-67	6	3
-7	1	0
-50	1	0
-143	1	0
-190	1	0
-24	1	0
-310	1	0
-204	1	0
-108	1	0
-15	1	0
-212	1	0
-3	1	0
-57	4	2
-44	1	0
-298	1	0
-38	1	0
-54	1	0
-112	1	0
-20	2	0
-79	1	0
-10	6	3
-12	1	0
-59	1	0
-51	1	0
-234	2	0
-43	1	0
-194	1	0
-5	1	0
-96	9	4
-67	2	0
-270	1	0
-13	1	0
-59	1	0
-54	1	0
-57	1	0
-375	1	0
-50	1	0
-87	1	0
-83	4	2
-234	4	2
-44	1	0
-24	7	4
-25	1	0
-44	1	0
-139	1	0
-201	12	9
-215	1	0
-5	1	0
-30	1	0
-43	1	1
-54	16	13
-210	1	0
-109	2	0
-55	1	0
-14	1	0
-126	1	0
-79	1	0
-326	1	0
-18	1	0
-150	1	0
-13	1	0
-85	1	0
-47	1	0
-16	1	0
-41	1	0
-43	5	3
-56	1	0
-62	1	0
-164	1	0
-108	1	0
-20	2	0
-137	1	0
-214	1	0
-14	1	0
-5	2	0
-60	5	3
-24	1	0
-72	2	0
-25	1	0
-23	1	0
-60	1	0
-53	1	0
-15	1	0
-145	1	0
-337	1	0
-112	1	0
-39	1	0
-234	1	0
-7	2	0
-108	1	0
-19	1	0
-150	1	0
-22	5	3
-221	1	0
-30	1	0
-195	1	0
-126	1	0
-116	1	0
-189	1	0
-231	1	0
-87	2	0
-136	2	0
-69	1	0
-350	1	1
-29	1	0
-76	1	0
-42	1	0
-10	3	1
-63	1	0
-168	1	0
-97	1	0
-11	1	0
-291	1	0
-150	1	0
-10	1	0
-141	15	12
-9	1	0
-35	1	1
-57	1	0
-9	2	0
-211	1	0
-193	1	0
-51	1	0
-337	1	0
-94	1	0
-9	1	0
-58	1	0
-152	1	0
-58	1	0
-127	1	0
-6	1	0
-65	1	0
-379	1	0
-93	1	0
-11	1	0
-106	1	0
-545	1	0
-11	1	0
-66	2	0
-28	1	0
-242	4	2
-32	8	5
-373	10	9
-242	1	0
-207	1	0
-51	1	0
-132	1	0
-118	1	0
-19	2	0
-116	1	0
-16	1	0
-23	1	0
-54	1	0
-67	1	0
-62	1	0
-52	10	7
-15	2	0
-33	1	0
-248	1	1
-27	1	0
-122	1	0
-25	1	0
-55	1	0
-141	1	0
-57	1	0
-45	1	0
-21	1	0
-66	4	2
-23	1	1
-234	1	1
-25	2	2
-56	1	0
-34	1	0
-12	1	0
-11	1	0
-5	1	0
-54	1	0
-16	1	0
-64	1	0
-361	1	1
-24	1	0
-111	1	0
-12	1	0
-74	1	0
-56	1	0
-43	1	0
-21	1	0
-8	1	0
-13	2	0
-34	1	0
-59	1	0
-79	1	0
-159	1	0
-69	2	0
-15	2	0
-8	1	0
-142	19	17
-302	1	0
-49	1	0
-114	1	0
-72	1	0
-38	1	0
-16	1	0
-39	1	0
-106	1	0
-16	3	1
-31	1	0
-5	1	0
-43	1	0
-120	1	0
-16	1	0
-82	1	0
-47	4	1
-10	6	3
-59	1	0
-10	1	0
-258	1	0
-97	14	13
-72	1	0
-126	1	0
-14	1	0
-92	1	0
-406	1	0
-194	1	0
-43	1	0
-30	1	0
-50	1	0
-8	1	0
-161	6	4
-39	1	0
-12	1	1
-60	1	0
-61	1	0
-23	1	0
-13	1	0
-41	2	0
-260	1	0
-144	1	0
-38	1	0
-45	1	0
-17	1	0
-73	1	0
-64	20	13
-25	1	0
-84	1	0
-42	11	6
-180	1	0
-32	2	0
-172	0	1
-65	1	0
-53	1	0
-39	3	1
-203	1	0
-16	3	1
-42	3	2
-27	6	4
-13	1	0
-99	1	0
-34	4	2
-511	1	0
-182	1	0
-230	8	3
-42	1	0
-16	1	1
-270	5	4
-13	1	0
-141	1	0
-100	1	0
-144	1	0
-146	1	0
-356	1	0
-99	1	0
-69	2	0
-146	1	0
-55	18	14
-54	7	4
-18	1	0
-170	2	0
-45	1	0
-13	1	0
-628	1	0
-93	1	0
-46	1	0
-131	1	0
-20	1	0
-98	1	0
-20	1	1
-355	0	2
-88	1	0
-121	1	0
-31	1	0
-27	1	0
-132	1	0
-64	1	0
-43	1	0
-30	1	0
-95	1	0
-22	1	0
-44	6	3
-20	1	0
-138	1	0
-198	1	0
-100	1	0
-163	1	0
-6	1	0
-155	1	0
-79	1	0
-34	1	0
-193	1	0
-159	1	0
-50	5	3
-30	1	0
-9	1	0
-115	1	0
-93	1	0
-54	1	0
-91	1	0
-336	1	0
-134	18	13
-126	1	0
-61	1	0
-133	1	0
-613	4	2
-244	1	0
-586	1	0
-5	1	0
-93	19	16
-148	6	3
-12	2	1
-20	1	1
-138	102	11399
-572	8	6
-529	1	0
-659	1	1
-35	1	0
-191	2	0
-56	1	0
-105	1	0
-18	1	0
-226	1	0
-59	15	16
-275	1	0
-87	1	0
-5	1	0
-85	1	0
-21	1	0
-71	1	0
-507	1	0
-21	3	1
-82	1	0
-32	1	0
-39	1	1
-312	1	0
-263	1	0
-196	5	3
-23	5	3
-275	1	0
-46	2	0
-154	0	6
-229	1	0
-27	1	0
-87	1	0
-5	2	0
-502	1	0
-97	105	101
-162	1	0
-114	1	0
-65	1	1
-43	1	0
-217	1	0
-14	1	0
-172	1	0
-326	1	0
-9	1	0
-446	1	0
-73	1	0
-245	2	0
-114	1	0
-237	1	0
-35	22	13
-318	1	0
-320	1	0
-76	1	1
-54	1	0
-44	1	1
-100	1	0
-30	0	1
-462	1	0
-22	1	1
-72	1	1
-121	1	0
-37	1	0
-22	5	0
-23	1	1
-154	1	0
-63	1	1
-87	1	0
-278	1	0
-36	1	1
-230	1	0
-182	3	1
-51	1	0
-7	1	0
-101	1	0
-39	1	0
-17	1	0
-55	1	0
-13	1	0
-114	1	0
-13	1	0
-24	1	1
-69	10	9
-171	1	0
-60	1	1
-77	1	1
-8	2	1
-25	1	0
-51	1	0
-327	1	0
-105	2	0
-133	0	1
-28	1	0
-67	1	0
-119	4	2
-334	1	0
-37	2	1
-47	1	0
-165	1	0
-29	1	0
-35	1	0
-46	1	0
-9	1	0
-657	1	0
-62	1	0
-171	1	0
-17	1	0
-113	1	0
-15	1	1
-123	1	1
-62	1	0
-4	1	1
-288	21	0
-809	0	1
-22	1	0
-61	1	0
-52	1	0
-25	2	0
-263	3	1
-35	1	0
-192	238701	2061422
-87	1	0
-6	1	0
-1080	1	0
-76	1	0
-1007	1	0
-98	1	0
-35	1	0
-134	1	0
-285	1	0
-33	0	1
-225	1	0
-281	1	0
-108	1	0
-55	1	0
-107	1	0
-202	15	12
-111	1	0
-36	2	0
-25	1	0
-202	1	0
-97	1	0
-143	1	1
-21	1	0
-222	1	0
-41	1	0
-492	0	4
-594	1	0
-181	1	0
-410	1	0
-37	1	0
-13	1	0
-34	1	0
-76	38	37
-204	27	27
-204	40	32
-432	1	0
-143	1	0
-271	1	0
-224	96	91
-385	1	0
-337	1	0
-375	1	0
-139	22	17
-297	1	0
-72	1	0
-5	2	0
-193	1	0
-8	1	0
-28	1	0
-17	1	0
-17	1	0
-445	1	0
-169	1	36
-35	3	1
-425	1	0
-41	1	0
-37	1	0
-79	1	0
-100	1	0
-130	1	0
-419	1	0
-17	1	1
-284	3	1
-56	1	0
-9	2	1
-655	1	0
-158	2	0
-8	1	0
-34	1	1
-519	1	0
-39	1	0
-78	1	0
-216	1	0
-3	1	0
-68	1	0
-56	1	0
-70	1	0
-290	0	4
-46	0	2
-108	0	2
-23	0	114
-830	1	0
-136	76	98
-63	65	64
-380	1	0
-106	1	1
-358	1	0
-64	1	1
-17	1	0
-171	5	3
-27	1	1
-130	13	10
-131	1	0
-415	1	0
-5	1	0
-37	1	0
-29	1	0
-27	1	0
-750	1	0
-249	1	0
-221	1	0
-109	1	0
-50	1	0
-323	1	0
-296	1	0
-383	1	0
-67	1	0
-239	2	0
-248	1	0
-9	1	0
-180	1	0
-241	1	0
-40	3	1
-6	1	0
-19	1	0
-27	1	0
-166	1	0
-80	1	0
-163	1	0
-33	1	0
-9	1	0
-172	1	0
-261	1	0
-200	1	0
-14	6	2
-121	1	0
-37	4	2
-74	1	0
-97	5	3
-10	2	1
-51	1	0
-642	1	0
-317	14	11
-163	3	1
-25	2	0
-875	1	0
-128	1	0
-211	8	4
-409	1	0
-233	1	0
-263	1	0
-12	1	0
-73	1	0
-188	1	0
-96	1	0
-183	1	0
-126	1	0
-235	1	1
-68	0	1
-618	1	0
-13	1	0
-73	1	0
-1315	883	57
-78	2	2
-774	1	0
-21	1	0
-13	1	0
-9	2	0
-168	1	0
-214	1	0
-84	3	1
-645	1	0
-150	1	0
-72	1	0
-8	1	0
-108	1	0
-120	1	0
-1469	1	0
-38	1	0
-697	1	0
-44	1	0
-345	1	0
-126	1	0
-46	1	0
-110	1	0
-972	1	0
-104	23	22
-93	2	2
-38	1	0
-34	3	1
-730	1	0
-151	1	0
-124	1	0
-210	1	0
-60	1	0
-227	1	0
-122	1	0
-225	2	0
-26	1	0
-85	1	0
-84	6	3
-408	1	0
-5	3	1
-18	1	0
-69	1	0
-76	1	0
-122	1	0
-288	1	0
-10	1	0
-55	1	0
-22	2	0
-455	1	0
-246	1	0
-37	1	0
-153	1	0
-27	1	0
-101	1	0
-158	1	0
-107	1	0
-437	1	0
-31	1	0
-149	1	0
-121	1	0
-5	1	0
-175	1	0
-76	1	0
-75	1	0
-26	2	0
-98	1	0
-169	1	0
-82	1	0
-20	1	0
-326	1	0
-274	1	0
-78	1	0
-42	1	0
-64	1	0
-11	7	4
-39	1	0
-91	1	0
-140	1	0
-397	14	12
-500	7	4
-879	5	2
-448	1	0
-42	1	0
-522	1	0
-247	1	0
-484	1	0
-689	1	0
-66	1	0
-198	1	0
-441	1	0
-143	1	0
-35	1	0
-84	1	0
-9	1	0
-445	1	0
-110	1	0
-204	1	0
-31	1	0
-77	1	0
-54	1	0
-213	1	0
-601	1	0
-25	1	0
-239	2	2
-42	1	0
-29	2	0
-15	1	0
-175	1	0
-611	1	0
-418	1	0
-191	1	0
-295	1	0
-30	8	5
-609	1	0
-372	1	0
-154	2	0
-117	1	0
-282	1	0
-360	1	0
-750	1	0
-402	1	0
-45	1	0
-678	1	0
-17	1	0
-117	1	0
-148	1	0
-164	3	1
-51	1	0
-65	1	0
-452	1	0
-1443	1	0
-142	1	0
-509	1	0
-92	10	6
-264	1	0
-69	1	0
-78	1	0
-43	1	0
-164	1	0
-349	1	0
-117	1	0
-373	1	0
-235	1	0
-160	1	0
-8	1	0
-263	1	0
-15	1	0
-23	1	0
-151	1	0
-100	1	0
-204	1	0
-250	1	0
-33	3	1
-272	1	0
-262	1	0
-55	1	0
-519	1	0
-251	1	0
-189	1	0
-459	1	0
-183	1	0
-295	1	0
-552	1	0
-94	16	12
-259	1	0
-30	1	0
-396	1	0
-17	1	0
-72	1	0
-56	1	0
-90	1	0
-106	1	0
-19	2	0
-271	1	0
-448	1	0
-628	497	497
-254	26	26
-391	1	0
-32	1	0
-171	1	0
-126	20	17
-94	1	0
-446	1	0
-30	1	0
-96	1	0
-17	1	0
-159	1	0
-390	1	0
-105	1	0
-94	1	0
-5	2	0
-21	1	0
-22	1	0
-380	1	0
-12	1	0
-211	1	0
-377	1	0
-3	1	0
-63	1	0
-37	2	2
-1596	1	0
-638	1	0
-30	1	0
-665	13	10
-32	1	0
-102	1	0
-361	1	0
-609	1	0
-590	1	0
-1189	29	29
-345	1	0
-732	1	0
-544	1	0
-272	1	0
-725	1	0
-198	1	0
-8	1	0
-275	1	0
-95	1	0
-101	1	0
-626	1	0
-154	1	0
-242	1	0
-937	1	0
-142	1	0
-236	1	0
-456	12	9
-77	1	0
-189	1	0
-172	1	0
-201	1	0
-417	1	0
-179	1	0
-141	1	0
-219	1	0
-164	1	0
-138	1	0
-500	2	0
-263	1	0
-48	1	0
-17	1	0
-91	1	0
-169	1	0
-8	1	0
-185	1	0
-48	1	0
-345	1	0
-546	2	2
-229	2	2
-614	1	0
-73	2	2
-129	1	0
-91	1	0
-287	3	1
-504	2	0
-264	22	22
-508	1	0
-1324	1	0
-1313	1	0
-36	1	0
-346	1	0
-285	5	2
-31	1	0
-6	1	0
-133	1	0
-27	1	0
-101	1	0
-249	1	0
-68	5	3
-34	1	0
-31	1	0
-140	1	0
-350	1	0
-312	1	0
-139	1	0
-66	1	0
-24	1	0
-37	1	0
-16	1	0
-32	1	0
-204	1	0
-21	1	0
-11	1	0
-120	2	0
-161	1	0
-13	1	0
-143	1	0
-46	1	0
-136	3	1
-75	1	0
-176	1	0
-23	1	0
-30	1	0
-34	1	0
-307	1	0
-27	1	0
-261	1	0
-39	1	0
-995	1	0
-556	1	0
-211	1	0
-278	1	0
-850	1	0
-285	1	0
-207	1	0
-154	1	0
-51	1	0
-237	1	0
-204	1	0
-11	1	0
-348	2	0
-41	1	0
-75	2	0
-47	1	0
-49	1	0
-253	1	0
-171	10	6
-106	1	0
-83	1	0
-86	1	0
-30	1	0
-166	1	0
-297	1	0
-480	1	0
-285	1	0
-339	1	0
-30	1	0
-74	1	0
-15	1	0
-310	1	0
-88	1	0
-111	1	0
-104	1	0
-644	1	0
-29	1	0
-413	2	0
-33	3	1
-19	1	0
-321	1	0
-318	1	0
-131	1	0
-111	1	0
-89	1	0
-751	120	120
-314	1	0
-613	2	0
-991	3	1
-44	1	0
-42	1	0
-57	1	0
-102	1	0
-318	1	0
-47	2	0
-186	1	0
-550	1	0
-504	1	0
-76	1	0
-336	1	0
-505	1	0
-34	2	0
-61	1	0
-257	1	0
-439	1	0
-94	1	0
-18	1	0
-6	1	0
-86	1	0
-18	1	0
-179	1	0
-52	1	0
-635	1	0
-535	1	0
-90	1	0
-531	2	0
-59	1	0
-132	1	0
-122	1	0
-17	1	0
-96	1	0
-281	1	0
-145	1	0
-342	1	0
-132	1	0
-95	16	12
-417	1	0
-143	1	0
-135	1	0
-11	1	0
-486	1	0
-224	1	0
-277	1	0
-449	1	0
-321	34	30
-96	1	0
-20	1	0
-358	1	0
-146	1	0
-176	1	0
-37	1	0
-92	1	0
-115	1	0
-245	1	0
-72	1	0
-65	1	0
-108	1	0
-41	13	10
-121	65	54
-54	1	0
-359	1	0
-53	1	0
-55	1	0
-10	1	0
-5	1	0
-6	2	1
-43	1	0
-9	1	0
-223	1	0
-90	1	0
-157	1	0
-686	1	0
-250	1	0
-160	1	0
-264	50363	1224780
-4948	0	1
-1850	60	67
-3859	0	1
-456	4	5
-1605	21	21
-1281	7	13
-5090	456	0
-1543	1	1
-37	1	1
-2825	1	1
-64	1	1
-1075	0	1
-721	0	1
-5566	22	5
-1136	1	0
-2390	0	3
-1347	0	2
-4617
-
-chain 16543266 chr17_random 2617613 + 0 174588 chr17_gl000205_random 174588 + 0 174588 172
-174588
-
-chain 10747371 chr17_random 2617613 + 1609852 1757206 chr17 81195210 - 15050606 15196423 297
-3573	1	0
-1031	1	0
-4890	10	7
-318	0	1
-667	1	0
-168	0	2
-974	2	0
-143	2	0
-208	4	0
-2621	10	10
-634	2	0
-1898	0	2
-99	21	21
-6731	1	1
-49	1	1
-345	2	0
-210	1	1
-1621	1	0
-1077	0	2
-371	6	0
-4548	5769	26131
-1148	0	1
-1283	1	1
-24	1	0
-2931	0	6
-38	22	0
-682	0	1
-1267	0	2
-470	9	19
-2335	0	9
-720	8	0
-2859	26315	4346
-4414	0	1
-777	1	4
-894	4	0
-3207	0	3
-3071	0	1
-1338	1	0
-869	1	0
-2072	0	1
-395	1	0
-1060	8	8
-1138	1	1
-6	2	0
-40	1	1
-473	0	1
-748	2	0
-306	8	0
-81	6	0
-748	4	0
-158	0	22
-6454	0	2
-145	1	1
-49	1	1
-619	0	1
-1579	14	14
-455	1	0
-5224	1	1
-31	1	0
-31	0	57
-3855	0	2
-2164	11	21
-1491	0	4
-213	16	4
-4589	6	6
-1564	0	6
-325	0	1
-2241	0	1
-149	0	1
-4150	0	4
-4768	0	12
-411	0	6
-804	2	0
-124	19	19
-937	2	0
-997	27	29
-685	37	37
-5	2	0
-35	37	48
-29	1	1
-237	2	0
-333	0	1
-1296	31	23
-472	4	0
-34	1	1
-683
-
-chain 7797784 chr17_random 2617613 + 2131554 2212864 chr17_gl000204_random 81310 + 0 81310 420
-81310
-
-chain 5191141 chr17_random 2617613 + 986480 1282720 chr17 81195210 + 34482891 34744119 309
-118	29	29
-73	435	3450
-113	9	9
-74	44	43
-109	53	55
-147	361	38
-603	128	128
-69	8	8
-278	22	22
-1262	20	20
-83	37	44
-478	1	1
-32	1	1
-54	1	1
-81	1	1
-57	0	1
-71	4	4
-83	1	1
-103	1	1
-80	1	1
-15	1	1
-312	15	15
-185	1	1
-24	1	1
-720	1	1
-19	1	1
-185	1	1
-35	1	1
-144	7	7
-238	1	1
-62	3	3
-196	10	10
-123	1	1
-99	1	1
-1997	1	1
-27	1	1
-64	49	45
-19	1	1
-547	1	1
-16	1	1
-796	0	2
-213	0	1
-1353	0	5
-59	1	1
-604	1	0
-1099	28	28
-2219	0	1
-1732	6	6
-115	1	1
-80	1	1
-123	1	1
-106	1	1
-164	1	1
-92	1	1
-160	34984	45270
-79	5	5
-348	149	150
-73	23	23
-322	46	46
-284	35	28
-1307	16	16
-515	89	89
-62	9	9
-203	3	0
-65	10	9
-188	33	32
-342	1	0
-100	0	1
-67	48	52
-69	1	0
-2330	39	42
-356	2	0
-767	5	9
-69	4	0
-373	29	30
-138	1	0
-571	0	1
-273	13	13
-140	25	24
-457	39	39
-204	19	19
-137	49	49
-178	59	59
-220	38	38
-66	23	22
-315	1	0
-399	30	30
-345	62	62
-200	36	36
-1097	33	35
-255	5	0
-61	4	0
-371	48	33
-119	30	30
-52	0	2
-236	0	2
-81	13	13
-168	12	12
-174	0	1
-250	81	81
-185	35	35
-343	27	35
-271	232	235
-79	116	119
-288	61	61
-869	9	8
-282	7	0
-6366	1	0
-2033	112	1128
-417	0	1
-64	145492	5631
-587	0	2
-184	392	14227
-792	0	4
-408	2	1
-1608	0	1
-1287	0	2
-676	1	1
-31	1	1
-112	1	1
-91	1	1
-173	1	0
-42	1	14
-784	11	11
-3219	0	13521
-8127	24	23
-7132	0	12
-9450	0	4
-3351	28	28
-5832	3	0
-100	0	1
-67	0	5
-31	6	5
-10	1	1
-69	2	0
-2314	1	0
-11507	0	1
-742	0	63471
-5695	0	1
-731	1	0
-3536
-
-chain 4342758 chr17_random 2617613 + 615163 663282 chr17 81195210 - 81146986 81195210 699
-117	89	88
-430	1	1
-8	7	3
-19	1	1
-521	14	7
-577	1	0
-4	1	0
-284	1	1
-19	12	6
-55	3	0
-193	1	0
-383	16	13
-508	5	0
-404	6	1
-1326	31	25
-723	84	3
-41	75	0
-21	1	0
-303	27	0
-65	81	27
-94	1	1
-40	1	1
-118	746	87
-30	2	1
-37	1	1
-179	2	0
-43	1	1
-46	27	0
-35	32	0
-278	1	0
-353	8	10
-363	13	1
-106	4	0
-188	34	34
-206	1	0
-3	1	0
-1339	1	0
-632	1	1
-21	0	4
-248	1	0
-655	1	0
-258	1	0
-777	1	0
-1440	16	16
-124	1	1
-36	1	0
-33	1	1
-89	1	0
-165	1	0
-86	1	1
-47	1	1
-319	8	4
-506	4	2
-537	16	12
-2310	1	0
-7	2	0
-922	9	0
-294	1	0
-145	1	0
-1890	2	0
-15	1	0
-38	1	0
-2030	12	6
-1208	2	0
-107	1	0
-438	2	0
-492	2	0
-184	1	0
-42	1	1
-646	1	35
-28	4	4
-62	4	36
-43	0	32
-54	1	1
-8	2	0
-23	1	1
-77	0	32
-34	0	32
-52	1	167
-69	70	6
-61	0	36
-99	0	64
-605	22	22
-133	1	0
-296	1	1
-42	1	0
-361	10	6
-225	14	14
-387	1	97
-405	0	480
-101	1	0
-24	2	2
-339	0	336
-1176	1	0
-192	1	0
-553	1	0
-114	4	1
-544	18	12
-575	3	0
-85	1	0
-934	1	0
-667	13	7
-28	18	12
-770	10	6
-149	1	0
-884	22	20
-214	0	1
-607	1	0
-129	1	0
-14	6	4
-27	6	3
-10	1	0
-4	2	0
-155	39	28
-214	2	0
-43	1	1
-1236	44	27
-1759	2	0
-472	6	2
-342	8	5
-970	6	0
-227	1	0
-691	1	0
-359	2	0
-141	1	0
-5	1	0
-2008	1	0
-302
-
-chain 3923033 chr17_random 2617613 + 864624 922266 chr17 81195210 + 81075742 81117538 762
-924	1	0
-428	1	0
-763	1	0
-19745	32	32
-637	15873	36
-186	1	0
-2389	1	0
-616	1	0
-1932	12	12
-10081	18	18
-2216	1	0
-92	1	0
-271	4	4
-67	5	5
-698	83	82
-473	27	27
-62
-
-chain 3905383 chr17_random 2617613 + 460666 565054 chr17 81195210 + 41343520 41406910 763
-9362	3	1
-1313	0	1
-344	1	0
-2289	0	2
-14919	0	1
-1393	6	4
-1047	1	0
-21	0	1
-31	5511	0
-28	783	8
-978	3	4
-213	0	2
-2198	0	702
-75	4479	3549
-723	0	13
-165	1	1
-19	3	3
-113	0	4
-88	1	1
-41	1	0
-38	7	7
-98	17	17
-152	50743	16221
-115	169	185
-169	0	4
-278	1	1
-48	1	1
-6399
-
-chain 3524656 chr17_random 2617613 + 1876393 1913891 chr17_gl000203_random 37498 + 0 37498 830
-37498
-
-chain 3296870 chr17_random 2617613 + 1963891 2002673 chr17_gl000204_random 81310 + 42877 81310 872
-560	1	0
-101	2	0
-296	42	39
-438	2	0
-256	1	0
-136	1	0
-109	1	0
-101	2	0
-234	64	62
-405	37	35
-61	1	0
-366	5	3
-501	39	37
-142	1	0
-191	27	24
-59	6	4
-53	67	62
-91	1	0
-159	1	0
-74	40	38
-164	1	0
-57	28	26
-75	1	0
-46	1	0
-61	45	43
-117	1	0
-360	45	43
-204	1	0
-180	61	58
-589	1	0
-212	1	0
-88	1	0
-53	1	0
-492	1	0
-75	26	24
-273	1	0
-701	1	0
-444	1	0
-75	1	0
-393	11	9
-105	59	56
-72	42	40
-79	1	0
-79	1	0
-95	153	144
-127	1	0
-85	4	2
-175	3	0
-222	1	0
-121	1	0
-48	1	0
-50	1	0
-61	1	0
-213	1	0
-73	1	0
-180	2	0
-83	1	0
-58	1	0
-192	11	5
-57	140	125
-101	1	0
-91	38	34
-190	1	0
-73	1	0
-116	6	4
-275	16	14
-200	1	0
-201	3	1
-632	1	0
-60	1	0
-198	9	1
-254	2	0
-89	1	0
-60	38	36
-326	32	28
-306	1	0
-55	1	0
-100	18	16
-127	36	32
-67	1	0
-78	1	0
-90	1	0
-63	35	31
-120	150	141
-103	9	7
-406	88	85
-54	15	13
-142	9	7
-112	32	30
-237	1	0
-114	27	18
-157	40	38
-145	1	0
-380	20	18
-73	109	104
-57	1	0
-83	68	65
-567	1	0
-378	0	4
-282	29	27
-725	1	0
-204	1	0
-246	1	0
-295	17	15
-243	1	0
-187	46	44
-56	1	0
-244	1	0
-303	1	0
-121	16	15
-253	1	0
-273	44	44
-427	10	0
-403	2	0
-219	1	0
-151	1	0
-115	14	13
-193	1	0
-63	1	0
-63	38	36
-609	1	0
-81	42	40
-297	1	0
-455	17	14
-278	3	1
-691	1	0
-417	104	101
-57	1	0
-93	5	3
-309	48	47
-303	1	0
-324	1	0
-126	41	37
-138	2	0
-233	1	0
-100	50	47
-86	9	7
-256	1	0
-208	1	0
-486	3	1
-118	1	0
-70	69	64
-455	8	6
-149	1	0
-175	5	2
-115	1	0
-159	1	0
-109	12	9
-135	33	31
-53	1	0
-256	5	3
-82	41	38
-268	70	67
-600	1	0
-128	18	16
-114	1	0
-149	62	58
-99	57	54
-158	42	38
-88	1	0
-75	46	43
-300	50	47
-71	13	11
-118	1	0
-177	1	0
-120	1	0
-275	1	0
-74	13	11
-230	1	0
-117	6	4
-113	39	37
-71	1	0
-597	9	8
-82	10	6
-195	10	8
-361	1	0
-53	1	0
-291	0	1
-149	1	0
-164
-
-chain 2935078 chr17_random 2617613 + 1427191 1457644 chr17 81195210 + 81045288 81075743 955
-1667	2	0
-1156	0	2
-25	0	2
-27603
-
-chain 2199778 chr17_random 2617613 + 671651 748529 chr11 135006516 - 134809692 134880676 533
-53	3	0
-176	68	0
-22	38	1
-38	43	16
-122	41	249
-34	4	16
-5	1	0
-6	1	0
-68	0	37
-1042	1	1
-35	1	1
-27	326	0
-359	1	0
-3	2	0
-176	16	5
-44	5	1
-224	1	0
-432	1	1
-35	1	1
-266	21	16
-109	14	10
-806	0	34
-465	56	0
-57	4	0
-787	1	0
-283	1	1
-27	1	1
-1090	1	1
-81	1	0
-1354	1	0
-40	1	1
-305	1	0
-89	1	1
-63	1	1
-48	1	1
-167	11	11
-83	8	4
-45	5	3
-343	1	1
-47	49	0
-56	0	294
-17	49	0
-79	5	103
-162	49	0
-442	10	10
-438	3	0
-50	1	1
-676	1	1
-39	1	1
-66	1	1
-7	1	0
-35	1	1
-547	7	2
-549	2393	0
-3	2913	0
-65	1	0
-60	1	1
-69	1	1
-42	0	1
-175	5	4
-100	1	0
-402	1	0
-39	1	0
-10	1	0
-10	1	0
-14	1	1
-95	4	2
-120	0	5
-126	1	1
-32	2	1
-72	1	1
-335	1	1
-45	1	0
-403	4	1
-54	1	0
-108	1	0
-289	1	1
-40	1	0
-164	12	12
-169	1	1
-76	1	1
-71	3	3
-34	1	1
-65	72	72
-84	64	1
-55	190	1
-52	1	1
-42	5	5
-138	1	1
-39	1	1
-311	6	7
-300	1	0
-597	17	17
-187	1	1
-32	100	2817
-24	203	202
-36	1	1
-115	4	0
-139	25	24
-1050	1	0
-56	1	0
-90	1	0
-33	1	0
-35	3	0
-114	1	1
-19	1	1
-215	1	0
-431	1	1
-23	1	0
-421	14	11
-292	1	1
-22	1	1
-49	2741	2490
-33	4095	4075
-9	0	3
-18	1474	1474
-3	6	1
-11	3	0
-38	14404	14348
-27	15613	15513
-5	5	5
-21	1	2
-13	19	20
-34	104	104
-44	214	216
-8	3	0
-27	2800	929
-60	1	1
-29	4270	3383
-30	49	0
-26	1	1
-40	2712	2960
-33	1	1
-7
-
-chain 2173268 chr17_random 2617613 + 699498 748919 chr1 249250621 - 248538148 248591008 468
-685	3	3
-36	4	4
-73	9	5
-59	70	63
-42	285	48
-44	1	1
-96	74	80
-321	1	1
-49	1	1
-107	1	1
-47	11	2
-85	3	0
-67	1	0
-179	19	16
-220	9	0
-138	33	33
-136	1	1
-26	1	1
-545	1	0
-8	14	10
-42	1	1
-64	1	1
-28	1	1
-119	1	1
-49	1	1
-54	1	1
-32	1	1
-960	1	1
-41	1	1
-731	16	16
-57	1	1
-19	1	1
-118	1	0
-196	1	1
-50	1	1
-263	1	1
-52	1	1
-171	1	1
-26	1	1
-181	25	16
-51	27	0
-56	1	1
-139	0	4
-33	1	1
-236	1	1
-17	1	1
-192	15	13
-186	1	1
-30	7	7
-280	1	1
-80	1	0
-196	62	54
-290	1	1
-38	1	1
-772	10	10
-123	1	1
-28	1	0
-20	34	22
-81	0	4
-45	1	1
-806	1	1
-31	1	0
-35	1	1
-101	17	15
-89	1	1
-34	1	0
-8	1	1
-290	13	9
-284	1	0
-53	7	0
-26	6	0
-605	4	0
-531	35	35
-704	1	1
-66	1	1
-168	1	1
-34	1	1
-527	1	1
-30	1	1
-249	16	7
-414	1	1
-27	1	1
-344	1	1
-43	1	1
-117	1	1
-30	1	1
-862	0	1
-229	1	1
-48	1	1
-197	14	14
-972	19	31
-924	1	1
-42	1	1
-123	1	1
-56	1	1
-77	1	1
-23	1	1
-119	1	1
-53	18	11
-382	1	1
-17	1	1
-116	5	2
-37	1	1
-38	2	0
-223	1	1
-21	6	1
-583	1	0
-400	0	4
-1574	27	27
-54	4	1
-158	10	7
-336	6	7
-492	1	0
-14	1	1
-843	1	2
-247	1	1
-41	1	1
-50	6	6
-513	17	13
-615	12	12
-585	32	23
-161	6	6
-515	9	5
-43	5	3
-460	5	5
-158	11	11
-252	1	1
-22	3	0
-135	12	12
-556	0	1
-542	3	0
-298	4	1
-24	4	0
-117	9	5
-151	0	1
-291	0	1
-360	15	15
-962	20	17
-231	1	0
-293	1	0
-33	32	0
-40	15	10
-213	23	23
-458	1	1
-51	1	1
-437	1	0
-394	1	1
-25	2	0
-117	10	4
-50	1	1
-40	1	1
-626	8	5
-492	1	0
-383	1	0
-672	1	1
-136	1	1
-203	2	2
-88	1	1
-261	1	1
-45	1	1
-189	15	15
-78	1	1
-49	1	1
-93	1	0
-35	13	10
-21	1	1
-527	99	94
-103	44	44
-79	24	26
-111	39	36
-235	24	27
-117	7	7
-127	222	1777
-58	167	165
-59	75	75
-203	12	12
-55	56	44
-269	34	32
-87	24	24
-250	35	29
-682	91	91
-312	4	3
-583	124	2653
-132	399	398
-134	1	1
-33	1	1
-179	1	1
-27	1	1
-245	4	4
-93	1	1
-940	1	1
-20	1	1
-271	1	1
-16	0	1
-353	24	17
-369	146	0
-83	1	1
-34	1	1
-1103	1	1
-26	1	1
-112	1	0
-3	1	0
-370	32	27
-410	170	174
-51	1	1
-310	42	41
-66	5	2
-319
-
-chain 2047886 chr17_random 2617613 + 532224 554093 chr17 81195210 - 39794017 39815907 1262
-682	50	50
-270	0	4
-316	0	1
-691	1	0
-678	1	2
-601	1	0
-383	1	0
-20	1	1
-1048	2	0
-1884	0	6
-690	0	5
-1205	1	1
-43	0	2
-891	19	19
-1916	7	6
-2354	0	3
-2253	10	0
-2406	0	13
-1972	6	6
-595	0	4
-148	100	100
-356	20	20
-109	4	4
-73	2	0
-59
-
-chain 1863993 chr17_random 2617613 + 1011919 1106715 chr17 81195210 + 34578530 36287451 432
-1027	148	148
-295	18	18
-204	37	37
-144	7	7
-238	38	38
-357	101	101
-125	64	64
-712	21	22
-181	126	1729
-702	0	2
-184	29	30
-236	37	37
-1080	60	65
-606	1	0
-328	63	63
-556	20	20
-94	37	37
-172	0	1
-1430	0	1
-151	53	53
-605	36	36
-292	1	0
-84	17921	60667
-87	11034	74480
-38	804	804
-30	345	345
-62	200	200
-36	1097	1097
-33	696	696
-48	119	119
-30	986	986
-81	185	185
-35	641	641
-232	79	79
-116	288	288
-61	11306	1517682
-155	7	0
-427	5	5
-742	2	0
-85	1	1
-401	1	1
-97	1	1
-566	1	0
-607	1	0
-1318	0	24
-1995	71	3
-34	0	2
-44	1	1
-39	0	1
-3518	0	4
-469	1	0
-294	10	13
-520	6	6
-403	0	3
-331	1	0
-231	7	0
-255	0	1
-3122	0	1
-729	0	1
-117	11	11
-186	4	0
-84	1	0
-412	2	0
-19	1	1
-1642	6	0
-628	1	1
-21	1	1
-377	50	50
-151	0	9
-2370	1	1
-35	1	1
-1328	1	10
-586	14	0
-789	12	13
-1397	0	1
-1521	0	2
-382	0	1
-866	1	1
-20	1	1
-710	2	0
-1259	161	161
-387	28	28
-53	24	24
-3626	1	0
-1718
-
-chain 1732426 chr17_random 2617613 + 2586433 2605017 chr17 81195210 - 39776940 39795500 1439
-1157	1	1
-31	0	5
-2053	8	8
-691	1	1
-30	1	1
-1212	3	0
-3864	1	0
-3	1	0
-56	15	0
-860	1	1
-30	1	1
-6532	4	4
-147	13	13
-1042	17	17
-319	7	0
-181	10	10
-68	42	42
-51	16	14
-115
-
-chain 1719393 chr17_random 2617613 + 1323861 1343929 chr17 81195210 + 45650033 45670000 1446
-76	1	1
-94	1	1
-84	9	9
-70	1	1
-43	1	0
-40	0	2
-126	1	1
-38	1	1
-391	1	1
-43	1	1
-100	0	1
-66	12	12
-65	1	1
-39	2	0
-9	4	0
-25	1	1
-99	1	1
-27	0	4
-362	22	4
-659	2	0
-433	0	20
-16	1	1
-117	1	1
-248	1	1
-200	1	1
-23	1	1
-248	6	0
-120	1	1
-930	1	1
-14	1	1
-76	1	1
-11	1	0
-23	2	0
-23	1	1
-236	1	1
-48	1	1
-108	1	1
-141	7	5
-50	1	1
-27	1	1
-306	0	3
-290	1	1
-20	0	1
-31	1	1
-618	5	6
-350	14	6
-55	0	2
-112	4	0
-50	1	1
-263	1	0
-51	1	1
-527	1	1
-47	1	1
-247	1	1
-34	3	3
-169	0	2
-33	3	0
-165	12	0
-163	1	1
-77	1	0
-56	26	26
-54	6	6
-338	2	0
-185	73	73
-336	0	3
-89	1	1
-19	1	1
-65	18	18
-89	0	1
-178	1	1
-45	1	1
-67	8	0
-347	0	1
-22	1	1
-192	1	1
-73	1	4
-38	0	1
-61	1	1
-164	1	1
-74	3	3
-260	5	0
-89	9	9
-142	1	1
-49	1	1
-71	0	1
-62	1	1
-391	1	1
-78	1	1
-100	1	1
-32	1	1
-155	11	12
-304	8	0
-79	1	1
-115	1	1
-29	1	1
-97	19	0
-168	1	1
-19	4	4
-359	2	0
-18	1	1
-358	1	1
-38	1	1
-83	1	1
-31	1	1
-389	1	1
-32	1	1
-128	1	1
-39	1	1
-54	1	1
-11	2	0
-165	4	0
-34	1	1
-58	1	1
-68	3	0
-230	1	1
-44	1	1
-276	16	16
-170	6	6
-104	1	1
-61	1	1
-107	6	6
-177	1	1
-66	5	0
-60	1	1
-14	1	1
-50	4	4
-15	1	1
-62	1	1
-194	1	1
-72	22	1
-39	1	1
-70	1	1
-42	1	1
-58	1	1
-36	1	1
-329	1	0
-136	1	1
-192	9	10
-682	24	21
-81	0	1
-367	12	12
-81
-
-chain 1570588 chr17_random 2617613 + 1644335 1687876 chr17 81195210 + 66068832 66112387 1087
-1168	16352	16361
-2197	2	0
-1554	1	0
-6339	0	4
-1936	0	7
-2357	2	0
-7231	1	0
-4401
-
-chain 1476469 chr17_random 2617613 + 2303443 2319476 chr17 81195210 + 79885696 79901628 1655
-880	1	0
-298	1	0
-60	43	40
-227	40	38
-326	1	0
-77	1	0
-148	1	0
-199	21	19
-60	1	0
-224	1	0
-173	1	0
-317	88	84
-84	1	0
-96	48	45
-432	1	0
-107	1	0
-505	1	0
-88	1	0
-551	1	0
-107	1	0
-176	1	0
-79	2	0
-127	1	0
-56	1	0
-239	1	0
-218	1	0
-11	1	0
-27	1	0
-256	1	0
-130	1	0
-60	1	0
-586	1	0
-96	1	0
-58	1	0
-80	1	0
-135	1	0
-55	1	0
-219	5	2
-11	4	2
-30	4	1
-368	1	0
-106	1	0
-119	18	13
-146	1	0
-636	1	0
-156	1	0
-541	1	0
-107	1	0
-97	1	0
-61	1	0
-66	1	0
-7	1	0
-238	1	0
-105	1	0
-13	1	0
-667	1	0
-85	1	0
-70	1	0
-642	1	0
-635	1	0
-57	1	0
-249	1	0
-237	1	0
-162	1	0
-166	1	0
-380	1	0
-271	1	0
-215	2	0
-260	1	0
-160	1	0
-62	1	0
-6	1	0
-185	1	0
-48	1	0
-265	5	2
-87	1	0
-186	1	0
-62	1	0
-20	1	0
-135
-
-chain 1260177 chr17_random 2617613 + 853052 928106 chr17 81195210 - 43628 125104 962
-949	1	0
-3976	1	0
-155	1	0
-1382	1	0
-174	1	0
-249	1	0
-3481	16	14
-138	196	313
-72	88	86
-491	22816	3210
-803	32	32
-116	1	0
-346	10	9
-779	1	0
-620	1	0
-336	1	0
-2035	1	0
-1010	1	0
-1029	22	20
-97	39	114
-77	79	0
-5135	26	26
-535	1	0
-2026	21	19
-206	2	0
-254	19578	45525
-174	1	1
-34	1	1
-97	25	25
-137	6	5
-2443	14	9
-445	1	0
-116	1	0
-2150
-
-chain 1227372 chr17_random 2617613 + 986700 1051441 chr17 81195210 + 34570816 36317431 617
-294	0	3023
-141	196	196
-44	109	109
-53	147	147
-19	33	32
-101	42	42
-166	603	602
-128	1742	1742
-37	15134	15157
-88	7169	151654
-89	3878	5468
-37	1080	1080
-60	1668	1668
-37	1753	1753
-53	605	605
-36	506	39138
-695	47	47
-375	59	59
-312	20	20
-185	37	37
-144	7	7
-238	38	38
-357	101	101
-125	64	64
-712	185	184
-2677	120	1494235
-1055	15	15
-700	4	4
-1174	24	24
-888	9	3
-1590	0	3
-913	18	20
-1011	1	1
-26	1	1
-2545	1	1
-35	1	1
-1283	87	87
-45	432	432
-149	418	418
-46	284	284
-2	3	3
-30	1838	1839
-89	540	540
-32	511	512
-48	2400	2403
-39	3223	3228
-39	360	360
-49	178	178
-59
-
-chain 1028733 chr17_random 2617613 + 2262901 2274699 chr17 81195210 - 1281214 1293541 2373
-276	161	161
-1171	1	0
-181	1	0
-943	1	0
-423	1	0
-384	47	47
-111	466	1042
-106	31	31
-75	4	4
-63	20	16
-142	1	0
-59	1	0
-607	1	0
-135	1	0
-31	1	0
-82	1	0
-266	1	0
-76	1	0
-5	4	2
-41	1	0
-52	1	0
-985	1	0
-87	1	0
-4	1	0
-114	1	0
-175	1	0
-30	1	0
-140	2	0
-22	1	0
-130	1	0
-239	1	0
-766	1	0
-203	1	0
-68	2	0
-252	1	0
-300	4	2
-377	1	0
-735	1	0
-279	5	2
-91	1	0
-66	1	0
-159	1	0
-7	1	0
-562
-
-chain 931587 chr17_random 2617613 + 978106 1010959 chr17 81195210 + 36277154 36406169 991
-1048	10	12
-382	0	1
-199	22	22
-381	8	8
-56	66	66
-80	176	176
-73	27	27
-90	32	32
-166	31	209
-634	0	4
-1199	65	65
-56	27	27
-255	27	27
-50	1	7
-422	5	5
-61	4	0
-80	311	311
-40	144	144
-53	3450	47979
-41	18030	69497
-201	21	0
-219	1	0
-310	0	1
-3136	0	1
-510	50	52
-321	3	0
-279
-
-chain 813092 chr17_random 2617613 + 1807252 1826317 chr17 81195210 + 22246129 22262163 2589
-338	20	20
-223	15	15
-164	162	162
-54	59	60
-73	230	230
-52	48	48
-50	66	66
-54	49	49
-257	14	14
-103	22	22
-96	5	5
-357	121	121
-100	88	88
-108	94	94
-490	34	34
-81	27	27
-54	82	82
-80	138	138
-128	12	12
-262	24	21
-199	35	35
-263	80	80
-84	52	52
-185	16	16
-75	113	113
-160	99	99
-70	27	27
-84	49	49
-59	25	25
-133	30	30
-64	45	45
-304	25	25
-986	74	74
-160	13	13
-209	22	22
-54	43	43
-61	156	156
-54	6	6
-77	5	5
-86	85	85
-117	48	165
-381	74	74
-262	32	32
-165	71	71
-57	95	95
-89	31	31
-114	140	140
-117	216	216
-77	5	5
-52	442	441
-185	60	60
-363	22	22
-179	11	11
-259	197	197
-118	35	35
-108	60	60
-61	61	61
-137	50	50
-53	56	56
-269	161	161
-106	103	105
-56	8	8
-368	41	41
-47	3145	0
-401	42	42
-90	23	23
-151	73	73
-81	148	146
-351
-
-chain 788653 chr17_random 2617613 + 1298766 1307227 chr17 81195210 - 44798207 44806654 6145
-463	1	0
-2422	0	1
-90	14	0
-75	0	1
-397	0	1
-64	1	1
-30	0	1
-202	1	0
-1329	2	0
-1396	1	0
-668	0	1
-280	45	45
-980
-
-chain 597412 chr17_random 2617613 + 807879 2303216 chr17 81195210 - 0 1281216 430
-180	1676	138
-25553	1	0
-149	14	14
-1938	1	0
-350	32	32
-1230	1	0
-3	1	0
-6237	1	0
-45	2	2
-6514	1	0
-228	662945	0
-7897	0	1
-2396	1	0
-1101	17	0
-41	1	1
-355	0	52
-50	18	1
-41	0	68
-84	34	0
-4918	0	1
-717	0	1
-313	1	1
-42	1	1
-73	29	31
-205	58	0
-414	1	1
-64	1	1
-959	1	1
-17	1	1
-2276	1	0
-739	0	1
-418	11	49
-1541	0	1
-3494	7	13
-1281	21	21
-1738	1	191
-26	0	38
-40	0	77
-67	5	5
-11	1	75
-55	2266	0
-112	47	9
-78	38	0
-24	1	1
-80	5	5
-551	0	5
-87	1	1
-35	1	1
-54	119	195
-74	1	1
-957	15	15
-64	1277	306
-91	1	1
-35	1	1
-820	48	67
-330	0	1
-2794	1	0
-1127	1	1
-19	0	5
-1483	715858	1169096
-78	1	0
-529	1	0
-25	1	0
-200	1	0
-643	2	0
-450	2	0
-211	1	0
-380	2	2
-180	2	1
-32	1	0
-246	1	0
-61	1	0
-5	1	0
-351	1	0
-37	1	0
-304	1	0
-18	1	0
-109	1	0
-16	1	0
-200	1	0
-105	1	0
-37	1	0
-376	1	0
-108	1	0
-91	1	0
-394	1	0
-20	1	0
-1014	32	30
-21	2	1
-34	1	0
-230	26	26
-941	1	0
-188	1	0
-610	1	0
-555	1	0
-303	1	0
-509	157	157
-169	22	22
-101	1	0
-501	1	0
-140	1	0
-78	2	1
-22	1	0
-39	6	5
-62	94	94
-593	114	111
-260	120	120
-362	1	0
-697	0	1
-123	28	28
-402	36	36
-904	1	0
-50	1	0
-379	1	0
-256	25	25
-23	17	17
-53	27	27
-556	1	0
-409	1	0
-106	1	0
-276	24	24
-35	2	0
-252	32	32
-213	4	4
-70	2	0
-27	4	2
-82	1	0
-17	1	0
-639	1	0
-172	11	7
-10	1	0
-76	1	0
-1582	1	0
-275	1	0
-21	1	0
-17	4	2
-66	1	0
-1653	1	0
-19	3	3
-139	179	179
-76	2	2
-60	1	0
-226	1	0
-538	1	0
-346	4	4
-42	25	25
-1319	1	0
-261	1	0
-512	1	0
-69	1	0
-480	2	0
-388	8	7
-305	5	5
-64	2	2
-846
-
-chain 590397 chr17_random 2617613 + 1317586 1323861 chr17 81195210 - 44817018 44823295 6400
-2259	1	0
-955	0	1
-2132	0	1
-744	0	1
-184
-
-chain 365975 chr17_random 2617613 + 1296053 1313819 chr17 81195210 + 45621804 45639993 6832
-81	12	44
-148	0	6
-401	61	62
-589	32	30
-259	39	57
-53	103	103
-231	127	131
-59	7954	7632
-45	980	978
-16	142	143
-82	46	46
-363	247	934
-159	50	48
-341	33	34
-57	16	16
-304	65	65
-69	9	9
-136	66	66
-138	57	57
-70	10	10
-70	123	120
-143	52	52
-152	15	19
-320	53	52
-121	0	1
-161	98	108
-97	59	59
-205	127	125
-55	11	11
-56	30	30
-88	43	43
-512	45	43
-125	143	136
-165	48	48
-56	24	24
-161	114	115
-364	40	40
-240
-
-chain 323854 chr17_random 2617613 + 753664 757726 chr11 135006516 + 51394886 51398944 206195
-84	571	570
-807	3	1
-2082	1	0
-514
-
-chain 193433 chr17_random 2617613 + 495545 497612 chr17 81195210 + 41377728 41379794 617459
-55	1	0
-1306	28	28
-677
-
-chain 170984 chr17_random 2617613 + 1315777 1317585 chr17 81195210 - 44815210 44817018 741311
-1808
-
-chain 158566 chr17_random 2617613 + 1808012 1818883 chr17 81195210 + 22251644 22262630 5258
-162	209	210
-87	88	88
-32	270	270
-48	855	855
-36	185	185
-88	888	888
-37	888	888
-35	263	263
-80	85	85
-51	276	276
-47	20	20
-46	329	329
-27	350	350
-4	5	5
-21	413	412
-25	986	986
-74	458	458
-43	137	137
-80	228	228
-85	546	663
-9	10	10
-55	262	262
-32	293	293
-68	116	116
-25	120	120
-109	148	148
-60	1	1
-67	6	4
-74	1	1
-7	134	134
-220	1	1
-65	1	1
-91	1	1
-62	186	186
-60
-
-chain 150869 chr17_random 2617613 + 749022 751008 chr11 135006516 + 51475668 51477652 852441
-306	379	377
-1301
-
-chain 148651 chr17_random 2617613 + 808184 809735 chr17 81195210 + 81137722 81139272 865111
-940	1	0
-610
-
-chain 145464 chr17_random 2617613 + 1314230 1315767 chr17 81195210 - 44813661 44815198 885049
-1537
-
-chain 120518 chr17_random 2617613 + 1343929 1345208 chr17 81195210 - 44843364 44844643 723183
-1279
-
-chain 116919 chr17_random 2617613 + 1353036 1364922 chr17 81195210 - 44845210 44857111 1380
-449	299	299
-31	164	164
-55	373	373
-449	9718	9733
-348
-
-chain 115845 chr17_random 2617613 + 508518 509981 chr17 81195210 - 39794017 39795500 1110103
-682	50	50
-270	0	4
-177	169	185
-115
-
-chain 114042 chr17_random 2617613 + 516500 517961 chr17 81195210 - 39794017 39795500 1127130
-682	50	50
-210	5	6
-54	0	6
-175	170	185
-115
-
-chain 113591 chr17_random 2617613 + 521388 522849 chr17 81195210 - 39794017 39795500 1131524
-58	0	1
-623	50	50
-210	5	6
-54	0	6
-175	171	185
-115
-
-chain 112548 chr17_random 2617613 + 503499 505329 chr17 81195210 - 39794017 39795500 1141710
-27	370	0
-655	50	50
-210	5	6
-54	0	7
-174	170	185
-115
-
-chain 92910 chr17_random 2617613 + 1642194 1643169 chr17 81195210 - 1314977 1315952 1374174
-975
-
-chain 86438 chr17_random 2617613 + 1345275 1346182 chr17 81195210 - 44844700 44845607 1472746
-907
-
-chain 80313 chr17_random 2617613 + 2609695 2610598 chr17 81195210 - 39794017 39794920 1580802
-682	50	50
-171
-
-chain 78741 chr17_random 2617613 + 1643269 1644095 chr17 81195210 + 79874782 79875608 1611354
-826
-
-chain 75472 chr17_random 2617613 + 1310578 1313579 chr17 81195210 - 44810007 44813007 188419
-53	282	282
-98	97	97
-59	205	205
-127	122	122
-30	88	88
-43	512	512
-45	125	125
-72	1	0
-70	165	165
-48	241	241
-114	364	364
-40
-
-chain 74354 chr17_random 2617613 + 1547620 1548395 chr8 146364022 - 2302524 2303299 1703290
-775
-
-chain 61189 chr17_random 2617613 + 1546707 1547351 chr8 146364022 + 144057273 144057917 2067192
-644
-
-chain 59362 chr17_random 2617613 + 751149 753548 chr1 249250621 - 248579195 248581575 182656
-35	2	1
-152	1	0
-15	1	0
-107	3	2
-74	1	0
-10	1	0
-19	1	0
-57	1	1
-48	3	1
-6	1	0
-107	12	330
-61	1	1
-51	357	35
-388	110	110
-84	38	38
-62	227	223
-116	106	105
-141
-
-chain 56858 chr17_random 2617613 + 1298104 1298766 chr17 81195210 - 44797535 44798197 1968612
-85	59	59
-518
-
-chain 56536 chr17_random 2617613 + 501286 502149 chr17 81195210 - 39794614 39795500 2243684
-85	50	50
-210	5	6
-54	0	7
-174	170	185
-115
-
-chain 55411 chr17_random 2617613 + 688273 689806 chr7 159138663 - 159114165 159114723 7844
-88	175	0
-148	458	0
-103	231	3
-111	117	3
-102
-
-chain 52941 chr17_random 2617613 + 1822234 1824166 chr17 81195210 - 58941545 58943477 1155
-887	1	1
-77	1	1
-300	1	1
-20	9	9
-133	1	1
-23	1	1
-59	1	1
-158	1	1
-91	1	1
-54	1	1
-112
-
-chain 52559 chr17_random 2617613 + 983839 1162005 chr17 81195210 - 44845659 46605886 726
-299	65	65
-117	68	68
-1986	9723	54270
-49	72036	1500609
-1027	6412	6412
-71	13528	13528
-50	11447	11447
-132	60546	169487
-42	528	528
-40
-
-chain 51097 chr17_random 2617613 + 1023443 1026449 chr17 81195210 + 34744258 34747264 8774
-47	375	375
-59	517	517
-37	389	389
-38	357	357
-101	125	125
-64	712	712
-185
-
-chain 49537 chr17_random 2617613 + 686221 687340 chr7 159138663 - 159114165 159114714 2581538
-393	570	0
-156
-
-chain 49422 chr17_random 2617613 + 2502237 2515076 chr17_gl000206_random 41001 + 6806 19645 760
-60	12323	12323
-456
-
-chain 46461 chr17_random 2617613 + 530697 531391 chr17 81195210 + 41399710 41400427 2769983
-115	170	185
-151	0	7
-77	5	6
-176
-
-chain 44819 chr17_random 2617613 + 1346282 1352646 chr17 81195210 + 36399842 36406169 117269
-158	113	113
-546	19	0
-337	0	1
-343	21	0
-219	1	0
-310	0	1
-3136	0	1
-510	1	1
-49	0	2
-321	1	0
-279
-
-chain 42351 chr17_random 2617613 + 1308282 1310091 chr17 81195210 - 44807710 44809519 659295
-50	341	341
-33	377	377
-65	214	214
-66	138	138
-57	150	150
-123	143	143
-52
-
-chain 41114 chr17_random 2617613 + 1307243 1308123 chr17 81195210 - 44806671 44807550 1295496
-142	82	82
-46	363	362
-247
-
-chain 38415 chr17_random 2617613 + 980212 983216 chr17 81195210 - 46382593 46436652 7347
-66	80	80
-176	73	73
-27	90	90
-32	166	166
-31	1833	52888
-65	56	56
-27	255	255
-27
-
-chain 37708 chr17_random 2617613 + 1313819 1314225 chr17 81195210 - 44813251 44813657 3332998
-406
-
-chain 34385 chr17_random 2617613 + 689365 745709 chr16 90354753 + 90179685 90235100 655
-111	4456	3661
-64	55	55
-25	28	28
-47	0	945
-90	45591	45393
-56	269	269
-34	5469	4540
-13	2	2
-32	0	48
-2
-
-chain 29758 chr17_random 2617613 + 1820296 1826385 chr17 81195210 + 22249775 22252718 80336
-37	643	643
-77	136	133
-51	3143	0
-44	74	74
-224	80	80
-64	79	79
-9	741	741
-39	82	82
-59	25	25
-56	358	358
-68
-
-chain 29219 chr17_random 2617613 + 1551349 1551651 chr17 81195210 + 81144397 81144699 5017519
-302
-
-chain 28762 chr17_random 2617613 + 686677 687796 chr7 159138663 - 159114165 159114714 2625478
-282	456	0
-111	3	3
-57	114	0
-96
-
-chain 26027 chr17_random 2617613 + 1296695 1298103 chr17 81195210 - 44796117 44797535 630440
-61	589	589
-32	259	269
-39	53	53
-103	231	231
-41
-
-chain 25589 chr17_random 2617613 + 1810180 1822057 chr17 81195210 + 22246679 22258671 5893
-31	6949	7063
-28	2666	2666
-60	580	580
-49	73	73
-37	1172	1173
-232
-
-chain 22463 chr17_random 2617613 + 503557 503790 chr17 81195210 - 39794076 39794309 8690008
-233
-
-chain 21299 chr17_random 2617613 + 1013035 1014722 chr17 81195210 + 34795732 34797419 1064
-59	517	517
-37	389	389
-38	357	357
-101	125	125
-64
-
-chain 20434 chr17_random 2617613 + 685587 686087 chr7 159138663 - 159114215 159114487 2822651
-209	248	20
-43
-
-chain 19692 chr17_random 2617613 + 2611651 2612116 chr17 81195210 - 39813091 39813524 10717347
-67	163	137
-78	68	62
-89
-
-chain 19589 chr17_random 2617613 + 2616810 2617276 chr17 81195210 + 41381686 41382119 10803726
-89	68	62
-77	165	138
-67
-
-chain 17762 chr17_random 2617613 + 852036 852257 chr5 180915260 - 51646 51969 938
-13	1	1
-60	1	1
-29	1	1
-13	0	102
-103
-
-chain 17600 chr17_random 2617613 + 1364922 1365125 chr17 81195210 - 46397651 46397854 1833
-172	1	1
-30
-
-chain 17149 chr17_random 2617613 + 1514626 1514877 chr1 249250621 + 547399 547650 3354419
-131	1	3
-101	2	0
-16
-
-chain 16567 chr17_random 2617613 + 2610699 2610873 chr17 81195210 - 39795026 39795200 13468304
-174
-
-chain 16365 chr17_random 2617613 + 1812948 1813633 chr17 81195210 + 22258959 22259644 44227
-99	181	181
-49	59	59
-25	227	227
-45
-
-chain 16348 chr17_random 2617613 + 525487 525673 chr11 135006516 + 62609095 62609281 13688187
-75	4	4
-107
-
-chain 14733 chr17_random 2617613 + 2605728 2605963 chr17 81195210 - 39813295 39813524 15353144
-78	68	62
-89
-
-chain 14711 chr17_random 2617613 + 556093 556262 chr11 135006516 - 72397235 72397404 15378622
-107	4	4
-58
-
-chain 14711 chr17_random 2617613 + 527846 528015 chr11 135006516 - 72397235 72397404 15378623
-107	4	4
-58
-
-chain 14711 chr17_random 2617613 + 512402 512571 chr11 135006516 - 72397235 72397404 15378624
-107	4	4
-58
-
-chain 14711 chr17_random 2617613 + 510910 511079 chr11 135006516 - 72397235 72397404 15378625
-107	4	4
-58
-
-chain 14711 chr17_random 2617613 + 494247 494416 chr11 135006516 - 72397235 72397404 15378626
-107	4	4
-58
-
-chain 14711 chr17_random 2617613 + 492878 493047 chr11 135006516 - 72397235 72397404 15378627
-107	4	4
-58
-
-chain 14711 chr17_random 2617613 + 519356 519525 chr11 135006516 + 62609112 62609281 15378630
-58	4	4
-107
-
-chain 14711 chr17_random 2617613 + 514467 514636 chr11 135006516 + 62609112 62609281 15378631
-58	4	4
-107
-
-chain 14711 chr17_random 2617613 + 492408 492577 chr11 135006516 + 62609112 62609281 15378632
-58	4	4
-107
-
-chain 13395 chr17_random 2617613 + 685879 686024 chr7 159138663 - 159114165 159114310 16961745
-145
-
-chain 12350 chr17_random 2617613 + 554102 554230 chr17 81195210 + 41401065 41401193 18472361
-128
-
-chain 11140 chr17_random 2617613 + 2611055 2611170 chr17 81195210 - 39795385 39795500 20498301
-115
-
-chain 11115 chr17_random 2617613 + 1365516 1365648 chr17 81195210 - 46613257 46613389 1914
-132
-
-chain 10814 chr17_random 2617613 + 689806 689963 chr7 159138663 - 159114495 159114652 3160720
-43	20	20
-94
-
-chain 10716 chr17_random 2617613 + 690046 690160 chr11 135006516 - 134823089 134823203 21297817
-114
-
-chain 10594 chr17_random 2617613 + 686107 686221 chr11 135006516 - 134823089 134823203 21541329
-114
-
-chain 10432 chr17_random 2617613 + 752965 753084 chr3 198022430 + 197944313 197944432 1419040
-26	27	27
-66
-
-chain 10233 chr17_random 2617613 + 751962 752152 chr1 249250621 - 25108929 25109119 2449036
-190
-
-chain 10215 chr17_random 2617613 + 298300 298405 chr17 81195210 - 41991981 41992086 2272776
-105
-
-chain 10088 chr17_random 2617613 + 2614941 2615048 chr11 135006516 - 72397235 72397342 22628945
-107
-
-chain 9967 chr17_random 2617613 + 687027 687133 chr7 159138663 - 159114173 159114279 19905170
-106
-
-chain 9953 chr17_random 2617613 + 1352829 1353036 chr17 81195210 - 44845003 44845210 3604154
-38	53	53
-37	50	50
-29
-
-chain 9937 chr17_random 2617613 + 2607755 2608553 chr17 81195210 + 41464708 41466209 22969163
-59	661	1364
-78
-
-chain 9782 chr17_random 2617613 + 685310 686656 chr7 159138663 - 159114165 159114714 2594423
-225	1079	282
-42
-
-chain 9490 chr17_random 2617613 + 268561 268666 chr17 81195210 + 39296306 39296411 8067183
-50	6	6
-49
-
-chain 9384 chr17_random 2617613 + 1808529 1810797 chr17 81195210 + 22256920 22261566 263516
-29	104	104
-28	50	50
-48	1976	4354
-33
-
-chain 9278 chr17_random 2617613 + 1333217 1333901 chr17 81195210 - 44832655 44833339 2515
-26	585	585
-73
-
-chain 9162 chr17_random 2617613 + 1819790 1824781 chr17 81195210 + 22261160 22263006 131478
-64	322	322
-59	818	816
-30	3642	499
-56
-
-chain 8930 chr17_random 2617613 + 507298 507390 chr17 81195210 + 41466131 41466223 25058540
-92
-
-chain 8739 chr17_random 2617613 + 1294354 1363161 chr17 81195210 - 46388680 46446941 1280
-36	59095	48559
-76	160	160
-63	250	250
-52	124	124
-61	4094	4092
-28	4719	4711
-49
-
-chain 7495 chr17_random 2617613 + 1514877 1514981 chr17 81195210 - 42613 42717 4053350
-104
-
-chain 7310 chr17_random 2617613 + 1352662 1353007 chr17 81195210 - 20840434 20840778 292042
-167	38	37
-53	37	37
-50
-
-chain 6706 chr17_random 2617613 + 687825 687939 chr7 159138663 - 159114173 159114287 10506562
-114
-
-chain 6456 chr17_random 2617613 + 673480 673547 chr11 135006516 - 134811854 134811921 22781013
-67
-
-chain 5049 chr17_random 2617613 + 752664 753185 chr1 249250621 - 248584104 248584621 921258
-110	84	84
-38	62	62
-7	119	119
-72	7	3
-22
-
-chain 5012 chr17_random 2617613 + 557502 557555 chr17 81195210 + 41382227 41382280 33565948
-53
-
-chain 4802 chr17_random 2617613 + 1345218 1345268 chr17 81195210 - 44844643 44844693 34312672
-50
-
-chain 4547 chr17_random 2617613 + 688053 688156 chr7 159138663 - 159114401 159114504 10358404
-103
-
-chain 4503 chr17_random 2617613 + 690214 690262 chr7 159138663 - 159114675 159114723 34814023
-48
-
-chain 4408 chr17_random 2617613 + 1808470 1808528 chr17 81195210 + 22261618 22261676 11976838
-58
-
-chain 4236 chr17_random 2617613 + 269418 269467 chr17 81195210 - 41933979 41934028 1349427
-49
-
-chain 3906 chr17_random 2617613 + 1365126 1365187 chr17 81195210 - 23109543 23109604 10221956
-61
-
-chain 3852 chr17_random 2617613 + 685196 685310 chr7 159138663 - 159114165 159114279 3139829
-114
-
-chain 3804 chr17_random 2617613 + 676798 676843 chr11 135006516 - 134814627 134814666 26257176
-33	6	0
-6
-
-chain 3734 chr17_random 2617613 + 1819749 1824493 chr17 81195210 + 22251604 22253205 550639
-41	1133	1133
-53	3451	308
-4	6	6
-56
-
-chain 3666 chr17_random 2617613 + 689649 689704 chr3 198022430 + 197891166 197891221 670
-55
-
-chain 3459 chr17_random 2617613 + 687133 687184 chr7 159138663 - 159114165 159114216 4526522
-51
-
-chain 3336 chr17_random 2617613 + 1365188 1365250 chr17 81195210 - 20853025 20853087 9938797
-62
-
-chain 3079 chr17_random 2617613 + 681792 681827 chr11 135006516 - 134820249 134820284 24010224
-35
-
-chain 2916 chr17_random 2617613 + 690160 690191 chr7 159138663 - 159114621 159114652 25187800
-31
-
-chain 2901 chr17_random 2617613 + 1010962 1011819 chr17 81195210 - 44844823 44845680 205824
-857
-
-chain 2668 chr17_random 2617613 + 837741 837773 chr8 146364022 + 31195 31227 1221
-32
-
-chain 2659 chr17_random 2617613 + 747955 747987 chr5 180915260 + 180755757 180755789 880
-32
-
-chain 2649 chr17_random 2617613 + 622962 622989 chr17 81195210 - 81153206 81153233 29165068
-27
-
-chain 2631 chr17_random 2617613 + 1252044 1252072 chr17 81195210 + 34548405 34548433 469
-28
-
-chain 2530 chr17_random 2617613 + 1100849 1100878 chr17 81195210 - 46384734 46384763 4689
-29
-
-chain 2422 chr17_random 2617613 + 621448 621568 chr17 81195210 - 81152835 81152952 7235512
-27	65	62
-28
-
-chain 2158 chr17_random 2617613 + 688361 688384 chr16 90354753 + 90179770 90179793 21906636
-23
-
-chain 2073 chr17_random 2617613 + 690420 690442 chr7 159138663 - 159114653 159114675 31315602
-22
-
-chain 1877 chr17_random 2617613 + 1533316 1533338 chr17_gl000206_random 41001 - 16469 16491 815
-22
-
-chain 1804 chr17_random 2617613 + 687361 687825 chr7 159138663 - 159114165 159114515 2659234
-54	381	267
-29
-
-chain 1771 chr17_random 2617613 + 742259 742283 chr1 249250621 - 248585388 248585412 123201
-24
-
-chain 1698 chr17_random 2617613 + 268509 268561 chr17 81195210 - 41933055 41933107 4387515
-52
-
-chain 1694 chr17_random 2617613 + 747513 747535 chr1 249250621 - 249115973 249115995 773
-22
-
-chain 1343 chr17_random 2617613 + 555358 555450 chr17 81195210 - 39728987 39729079 19263806
-92
-
-chain 1343 chr17_random 2617613 + 511667 511759 chr17 81195210 - 39728987 39729079 19263807
-92
-
-chain 1343 chr17_random 2617613 + 526316 526408 chr17 81195210 + 41466131 41466223 19263808
-92
-
-chain 1343 chr17_random 2617613 + 520168 520260 chr17 81195210 + 41466131 41466223 19263809
-92
-
-chain 1129 chr17_random 2617613 + 1019025 1019068 chr17 81195210 + 60348267 60348310 2834
-43
-
-chain 1082 chr17_random 2617613 + 686959 687027 chr7 159138663 - 159114561 159114629 2979122
-68
-
-chain 594 chr17_random 2617613 + 1548943 1548990 chr17_gl000206_random 41001 - 30268 30353 3713456
-4	9	47
-34
-
-chain 7055976638 chr18 76117153 + 0 76117153 chr18 78077248 + 10000 78016181 19
-15400898	1363998	3100000
-28218587	15	15
-5329636	47000	150000
-3667309	0	18
-16406890	28008	50000
-3388467	22000	50000
-2103304	3	0
-136125	7	9
-647	0	1
-1543	0	1
-25	0	1
-6	2	7
-19	0	2
-10	4	7
-9	2	4
-656	0	1
-358	0	1
-1625
-
-chain 404699 chr18_random 4262 + 0 4262 chr18_gl000207_random 4262 + 0 4262 116011
-4262
-
-chain 5307789368 chr19 63811651 + 11000 63806651 chr19 59128983 + 60000 59114839 21
-7286004	5000	50000
-1291194	5000	50000
-11767057	0	69160
-4058367	8000000	3100000
-20129228	0	2
-701	3	0
-347	1	1
-31	1	1
-1833	3	0
-1984	1	1
-47	1	1
-190	1	1
-34	1	1
-889	0	2
-1413	0	7
-2680	0	4
-375	0	1
-328	0	4
-15	0	1
-69	1	0
-3881	1	1
-36	0	12
-296	0	14
-1480	0	1
-233	1	1
-45	1	1
-1049	0	1
-1766	44	7
-220	3	0
-536	0	7
-352	8	8
-3603	1	1
-17	3	0
-697	1	0
-269	3	0
-974	6	5
-96	0	10
-1096	10	10
-1177	14	12
-110	3	3
-1028	12	9
-1090	1	0
-173	0	16
-1066	4	0
-4779	1	1
-42	1	1
-722	1	0
-548	2	2
-44	1	1
-424	54	54
-61	1	1
-59	1	1
-2086	0	15
-1500	1	0
-1754	2	0
-11209362
-
-chain 15150451 chr19_random 301858 + 142689 301858 chr19_gl000209_random 159169 + 0 159169 196
-159169
-
-chain 8748871 chr19_random 301858 + 0 92689 chr19_gl000208_random 92689 + 0 92689 377
-92689
-
-chain 14432273 chr1_random 1663265 + 444114 915337 chr1 249250621 - 104328377 105379619 206
-1802	63331	510
-7296	6958	14784
-7961	0	2
-631	19782	48350
-2466	1	1
-72	1	1
-281	2	2
-18	1	1
-2234	1	1
-23	2	1
-1869	0	2
-890	0	1
-2816	0	3
-59	12	12
-1298	1	1
-11	1	1
-294	214294	820733
-136815
-
-chain 10693564 chr1_random 1663265 + 965337 1079393 chr1 249250621 + 199645090 199759149 300
-3537	0	2
-1755	1	1
-38	1	1
-15918	1	0
-2372	0	1
-1251	34	34
-7007	1	6
-3552	1	1
-44	1	1
-799	1	1
-42	1	1
-3907	2	0
-1780	1	1
-49	1	1
-1586	2	0
-197	1	1
-37	1	1
-292	1	1
-47	1	1
-927	0	2
-549	1	1
-27	1	1
-595	1	1
-18	1	1
-291	0	2
-6685	1	0
-2369	1	0
-6503	13	13
-639	1	1
-70	1	1
-477	1	0
-1001	0	2
-1967	2	0
-3454	1	1
-26	1	1
-3144	0	4
-89	1	0
-6546	14	15
-6194	1	0
-5390	13	13
-196	1	0
-7401	1	9
-1242	1	0
-1702	1	0
-477	1	1
-61	0	1
-1487	1	0
-1276	1	0
-1950	9	0
-4681	0	2
-1332	1	0
-956
-
-chain 10110185 chr1_random 1663265 + 1464329 1570762 chr1_gl000191_random 106433 + 0 106433 317
-106433
-
-chain 6680210 chr1_random 1663265 + 198768 359123 chr1 249250621 + 1257620 1436018 467
-467	0	1
-41	0	1
-10	4	4
-930	2	3
-122	3	4
-138	66071	6986
-47	0	1
-945	0	1
-279	1	2
-508	0	1
-482	0	1
-1285	1	1
-40	1	1
-199	0	1
-207	1	1
-29	1	1
-1021	0	1
-1168	0	2
-388	0	1
-69	15	17
-195	4	4
-52	1	1
-9	1	3
-23	0	1
-284	0	1
-1485	15	16
-138	9	9
-27	44	5
-35	46	46
-97	0	1
-5	0	1
-734	0	3
-257	1	1
-18	1	1
-442	0	2
-51	4	0
-424	0	1
-134	1	1
-39	0	1
-22	1	1
-564	15	17
-469	0	3
-39	0	1
-22	2	2
-1076	0	1
-210	14	14
-166	0	1
-3264	1	0
-111	0	1
-309	19898	50666
-91	0	1
-116	0	1
-56	0	1
-152	0	1
-46	0	1
-51	0	1
-63	0	2
-420	4	5
-697	0	1
-2269	7	0
-48	1	1
-4086	0	2
-317	0	1
-49	0	1
-1795	0	1
-1147	1	1
-39	1	1
-1378	0	17
-477	2	0
-4457	1	1
-105	0	1
-1003	0	1
-232	1	2
-147	277	46717
-169	0	1
-37	1	1
-227	0	2
-651	1	0
-1805	1	1
-45	1	1
-498	1	0
-233	1	1
-29	1	1
-231	12	20
-2015	0	1
-20	1	1
-653	0	1
-12	0	1
-17	1	1
-139	0	1
-10	0	1
-22	0	1
-37	16	19
-38	0	5
-54	0	1
-437	0	1
-539	2	0
-1067	0	1
-1042	1	0
-2434	10	0
-256	133	0
-839	0	1
-267	0	1
-640	1	1
-35	1	1
-1351	15	15
-1316	1	1
-31	0	1
-1986	5	5
-1179	0	1
-3153	1	0
-1165	0	1
-22	0	1
-56	1	1
-27	1	1
-77	0	1
-81	15	17
-111	1	1
-44	0	1
-2254	1	0
-320	1	0
-2368	0	1
-26	0	1
-407	5	6
-2982	0	4
-852	0	5
-703	1	0
-191	2	3
-73	5	5
-72
-
-chain 4901563 chr1_random 1663265 + 676697 728522 chr1 249250621 - 205721991 205773795 637
-1664	1	0
-299	1	0
-1113	4	0
-100	1	0
-1522	1	1
-46	1	1
-83	1	1
-30	1	1
-62	1	1
-46	1	1
-1990	1	1
-41	1	1
-1403	0	4
-1148	0	5
-10134	1	1
-21	1	1
-1479	1	0
-1499	9	9
-3057	0	2
-137	6	0
-1251	2	0
-21	1	1
-897	5	4
-2851	1	0
-399	0	2
-624	6	5
-440	1	0
-5	1	0
-2953	1	0
-480	9	0
-2793	36	35
-6791	1	0
-4870	1	0
-1478
-
-chain 4504833 chr1_random 1663265 + 1205412 1353281 chr1 249250621 - 133273039 133340206 679
-3980	0	1
-79	1	1
-34	1	1
-916	4	6
-1818	34	28
-51	21	16
-5	1	0
-5	1	0
-4	1	0
-11	1	0
-28	1	0
-8	1	0
-8	1	0
-1366	1	1
-38	0	1
-7507	0	1
-3084	2	0
-2569	1	0
-20	1	0
-8	1	0
-10	21	16
-51	10	10
-3979	6	5
-2086	1	0
-5466	0	1
-27	1	1
-1117	1	0
-66	1	0
-23	1	0
-2070	0	1
-67	1	0
-2611	1	0
-9	1	0
-23	23	18
-577	97925	17254
-5929	0	1
-1948	1	0
-72	0	1
-1365	60	62
-706
-
-chain 3984524 chr1_random 1663265 + 1620762 1663230 chrX 155270560 - 27920664 27963158 751
-107	0	1
-696	27	12
-658	0	12
-1440	0	2
-671	0	2
-506	0	3
-806	0	1
-4759	0	12
-131	1	0
-848	1	0
-213	0	8
-2046	1	0
-4979	0	1
-2482	1	0
-1502	1	0
-3474	0	4
-782	0	1
-12366	1	0
-3969
-
-chain 2698055 chr1_random 1663265 + 6164 122978 chr1 249250621 - 139553697 139584554 1020
-486	1	1
-19	9	9
-297	1	1
-73	1	1
-341	1	0
-105	1	0
-286	47997	0
-689	1	1
-48	1	1
-53	0	2
-1870	1	1
-39	1	1
-1682	0	39
-470	8	9
-691	1	0
-370	1	1
-24	1	1
-356	0	1
-1496	9599	84
-28	0	1
-7	4	0
-131	0	1
-66	932	181
-88	9	11
-10	7	0
-10	8	5
-5	0	3
-76	27759	26
-44	3	0
-26	0	2
-6	1	1
-59	3	1
-121	2	4
-4990	1	0
-672	0	1
-1487	1	1
-39	1	1
-1691	0	1
-36	10	10
-3503	1	1
-46	1	1
-4128	0	1
-1818	0	5
-1107	16	16
-841
-
-chain 2474973 chr1_random 1663265 + 1129393 1155387 chr1 249250621 + 229232478 229258468 1104
-3505	1	1
-44	1	1
-5232	4	0
-17207
-
-chain 2468882 chr1_random 1663265 + 1280682 1387454 chr1 249250621 - 133163307 133238928 735
-149	0	1
-7073	122	124
-1799	1	1
-43	1	1
-5594	24	23
-60	12182	28596
-3279	1	0
-571	21	21
-1080	1	0
-10	0	2
-1138	1	0
-3484	1	0
-1689	0	8
-810	42350	1
-1088	1	1
-21	1	0
-78	30	29
-746	0	2
-2729	1	0
-2088	0	3
-1949	966	174
-31	9	0
-12	16	16
-29	0	4
-13	100	98
-53	1884	0
-16	1	0
-5	0	1
-18	3916	1388
-1729	0	1
-1373	1	0
-102	1	0
-21	1	0
-4	1	0
-7	1	0
-38	2	0
-48	1	0
-525	5	4
-645	5	5
-1189	1	0
-1911	4	0
-69	8	8
-24	5	4
-284	1	0
-1481
-
-chain 2064841 chr1_random 1663265 + 247141 392880 chr1 249250621 - 247850669 247948213 608
-351	1	0
-965	0	1
-35	0	1
-248	0	1
-122	0	1
-1194	11	11
-580	3	5
-969	0	1
-425	5	5
-25	1	1
-586	1	1
-77	1	1
-1895	1	1
-37	1	2
-253	0	1
-560	1	1
-62	1	1
-74	1	1
-27	1	1
-90	31631	11346
-887	0	40
-759	32	0
-2596	0	1
-308	1	0
-37	0	1
-40	0	1
-346	17	19
-89	2	2
-34	1	2
-44	0	2
-35	0	1
-20	0	1
-260	0	1
-3009	1	1
-30	0	1
-5	10	12
-104	1	1
-48	0	1
-67	13	15
-1226	0	1
-111	7	7
-31	0	1
-47	1	3
-13	3	5
-38	7	10
-7	0	2
-48	0	1
-110	1	0
-623	0	2
-241	1	1
-47	1	1
-1601	0	1
-582	13	21
-1128	2	0
-348	4	4
-28	22	23
-481	0	2
-30	1	1
-628	0	1
-96	0	1
-30	0	1
-78	17	173
-64	55865	28961
-69	13	14
-498	0	1
-1593	0	4
-183	26	27
-337	1	0
-1433	0	1
-6191	0	2
-2435	0	1
-3451	540	0
-83	695	0
-1318	5	5
-21	1	1
-526	0	1
-833	0	1
-144	0	1
-427	8	8
-235	1	2
-297	1	1
-34	0	1
-250	0	3
-1007	0	1
-1403	1	1
-37	1	1
-355	1	1
-6	0	2
-94	1	1
-278	2	2
-5	0	1
-20	1	1
-667	24	24
-1858	10	12
-146	8	7
-2002	0	1
-284	0	1
-1233	0	1
-840	11	0
-914	2	0
-122	1	1
-26	0	2
-118
-
-chain 1850028 chr1_random 1663265 + 76914 101906 chr1 249250621 - 139621990 139717568 1363
-3916	0	1
-77	20	20
-26	0	856
-764	17	16
-12	1	0
-295	1	0
-2648	2870	23264
-250	997	50331
-2203	0	5
-797	1	0
-2197	1	1
-117	7	8
-429	1	0
-7345
-
-chain 1707631 chr1_random 1663265 + 501749 626697 chr1 249250621 + 144188000 145316961 852
-223	42	42
-236	22	22
-242	91	103
-199	8	8
-102	112	112
-50	126	126
-290	32	32
-213	45	45
-125	1	1
-56	1	1
-82	1	1
-27	13	13
-71	5	5
-493	3	3
-15	1	1
-248	1	1
-44	1	1
-65	1	1
-52	1	1
-169	1	1
-82	1	1
-292	1	1
-83	0	1580
-458	1	1
-16	1	1
-478	5	5
-568	23	17
-634	1	1
-46	1	1
-50	14	14
-864	31	61
-55	23320	364967
-85	1	1
-107	1	1
-376	1	1
-20	0	1
-195	10	10
-150	1	1
-35	1	1
-274	5	5
-143	1	0
-862	7	0
-20	1	0
-504	1	1
-25	1	1
-238	1	1
-36	1	1
-139	0	1
-25	1	1
-157	8	8
-60	16	16
-59	17	17
-285	0	1
-120	1	1
-69	1	1
-509	1	1
-59	1	1
-162	0	322
-70	5	5
-2169	1	1
-31	1	1
-224	1	1
-36	1	1
-76	1	0
-5	5	0
-109	6	6
-139	5	3
-65	0	20
-360	47	48
-86	18	17
-149	44	44
-76	54	55
-196	38	38
-139	139	6280
-107	1	1
-95	0	1
-46	1	1
-91	1	1
-18	1	1
-62	11	11
-511	0	1
-106	1	0
-505	0	2
-443	9	9
-519	112	112
-396	1	1
-26	1	1
-225	1	1
-57	1	1
-502	1	0
-485	1	1
-105	0	2
-146	1	1
-41	1	1
-203	1	1
-45	1	1
-62	5	5
-850	1	1
-55	2	2
-215	1	1
-45	1	1
-474	0	3
-19	1	1
-2337	1	1
-34	1	1
-148	1	0
-159	1	1
-32	1	1
-64	0	4
-849	1	1
-34	1	1
-126	38816	272842
-32	0	140
-3176	18	17
-6689	1	0
-274	0	1
-1449	0	1
-1312	1	0
-1861	8888	417910
-92	172	6531
-148	0	2
-213	1	1
-30	1	1
-227	1	1
-62	6	0
-276	1	1
-35	1	1
-94	14	14
-325	5	5
-118	1	1
-81	1	1
-234	4	0
-15	1	1
-243	1	1
-39	1	1
-117	1	1
-35	1	1
-83	1	1
-64	5	5
-55	13	13
-61	11	11
-175	1	1
-27	1	1
-134	1	1
-60	1	1
-64	1	1
-87	1	1
-615	1	1
-22	1	1
-201	5	5
-48	1	1
-117	1	1
-23	3	3
-319	6	6
-156	0	1
-25	1	1
-215	13	13
-97	14	14
-113	0	3
-35	1	1
-65	15	15
-480	0	1
-636	1	1
-107	1	1
-753	1	1
-43	1	1
-861	17	16
-470	1	1
-38	1	1
-579	1	1
-25	1	1
-224	1	1
-71	1	1
-266	36	36
-167	88	88
-400	53	53
-131	6	5
-220	22	19
-317	23	23
-109	95	101
-73	0	4726
-208	28	28
-293
-
-chain 1680348 chr1_random 1663265 + 1245440 1263421 chr1 249250621 + 116101959 116120000 1475
-441	0	14
-728	0	2
-1146	2	0
-1829	6	6
-93	3	2
-2916	0	6
-2013	0	47
-369	1	1
-27	9	0
-37	1	1
-200	1	0
-2285	0	2
-3527	1	1
-24	0	1
-1001	0	1
-1195	1	1
-39	1	1
-85
-
-chain 1335863 chr1_random 1663265 + 231796 246037 chr4 191154276 - 30408128 30422371 1784
-3391	6	6
-562	7	7
-5976	2	3
-4144	10	11
-143
-
-chain 1170727 chr1_random 1663265 + 577933 590476 chr1 249250621 + 144898104 144910646 2036
-1896	48	48
-2779	1	0
-7128	45	45
-646
-
-chain 1143882 chr1_random 1663265 + 1330802 1343100 chr1 249250621 - 133251270 133263558 2093
-1050	1	1
-51	1	1
-237	1	1
-35	1	1
-514	16	12
-76	9	1
-1642	12	12
-53	0	1
-3766	0	1
-40	1	1
-1513	0	1
-195	11	11
-135	26	26
-2627	1	0
-284
-
-chain 988809 chr1_random 1663265 + 564355 574807 chr1 249250621 - 104390169 104400621 2516
-59	1	2
-5994	1	1
-45	1	1
-3985	3	3
-42	1	0
-320
-
-chain 957971 chr1_random 1663265 + 256162 266426 chr1 249250621 + 1291904 1302191 2686
-83	0	1
-585	0	1
-1018	0	1
-18	1	1
-59	16	16
-1569	0	1
-69	1	0
-35	0	1
-36	1	1
-176	0	1
-48	0	1
-56	2	3
-41	0	1
-160	17	1
-461	13	21
-174	0	4
-517	7	7
-141	4	4
-89	0	1
-1155	1	0
-370	7	7
-143	1	0
-1019	22	22
-1177	0	1
-607	0	16
-86	0	3
-279
-
-chain 895962 chr1_random 1663265 + 196343 223209 chr1 249250621 - 247894293 247990621 2587
-108	25	24
-131	0	1
-299	0	1
-137	44	45
-51	0	1
-572	0	1
-406	36	37
-508	2162	63455
-80	5	8
-86	0	1
-61	0	1
-31	1	0
-165	14	15
-78	75	78
-234	0	1
-152	13	15
-849	0	1
-1798	12505	20653
-3495	0	1
-43	0	1
-1944	1	1
-26	1	1
-169	0	1
-365	0	1
-196
-
-chain 884318 chr1_random 1663265 + 4444 145186 chr1 249250621 + 109546538 109651856 1047
-123	47	1183
-818	1	1
-75	1	0
-22	1	1
-455	18927	20784
-855	1	0
-74	12001	11300
-2581	2	2
-31	0	1
-81	1	0
-24	1	1
-123	1	0
-147	0	1
-45	0	1
-26	0	1
-9	1	0
-12	2330	786
-22	41	53
-127	1706	714
-3729	74524	39329
-68	5	7
-3088	2	2
-15	5	6
-14	0	2
-657	1	1
-37	1	1
-2140	1	0
-3034	1	0
-42	1	1
-446	0	1
-55	2	2
-30	1	1
-391	1	1
-35	1	1
-982	3	0
-123	1	1
-28	0	4
-1503	1	0
-1159	0	3
-1464	0	1
-838	1	1
-47	1	3
-162	1	0
-139	1	1
-10	0	1
-2424	6	6
-448	1	0
-846	5	0
-1509
-
-chain 739113 chr1_random 1663265 + 68329 76740 chr1 249250621 + 109654512 109662863 6250
-254	1	0
-27	1	1
-746	1	0
-315	19	19
-163	42	2
-51	3	1
-44	1	1
-592	0	1
-216	1	1
-34	1	1
-2323	10	0
-10	236	236
-125	1	0
-806	213	213
-828	6	0
-82	6	6
-1253
-
-chain 688441 chr1_random 1663265 + 605533 614556 chr1 249250621 + 144612760 144812114 1498
-76	1	1
-70	1	1
-73	4	2
-40	0	2
-159	1	1
-56	2	0
-911	1	1
-63	1	1
-84	9	1
-149	1	1
-21	1	0
-606	1	1
-21	3	3
-132	12	10
-368	1	1
-26	1	1
-50	1	1
-65	1	1
-57	1	1
-44	1	1
-279	0	1
-34	0	4
-7	1	1
-308	0	32
-331	1	1
-84	1	1
-286	1	1
-35	1	1
-59	8	8
-146	1	1
-237	1	1
-52	1	1
-35	2	0
-40	1	1
-53	3	3
-103	1	1
-397	1	1
-59	1	0
-33	1	1
-587	11	11
-219	10	10
-71	5	5
-62	1	1
-38	1	1
-240	1	1
-70	1	1
-85	12	12
-86	413	190724
-207	1	0
-825	186	186
-172
-
-chain 590572 chr1_random 1663265 + 516651 523401 chr1 249250621 - 104651805 104658532 8996
-157	1	1
-17	1	1
-395	1	1
-65	1	1
-187	0	9
-21	1	1
-62	16	16
-110	2	0
-205	1	0
-43	1	1
-248	1	1
-59	4	2
-725	1	1
-49	1	1
-455	1	1
-106	1	1
-450	1	1
-133	0	2
-383	1	1
-37	1	1
-178	4	4
-70	1	1
-85	2	2
-43	1	1
-56	1	1
-22	24	0
-30	1	1
-64	1	1
-21	1	1
-198	1	1
-67	1	1
-58	1	0
-79	7	6
-74	1	1
-79	1	0
-26	1	1
-202	15	15
-352	2	2
-16	1	1
-51	22	19
-574	0	1
-87	1	1
-46	1	1
-88	1	1
-27	1	1
-120
-
-chain 526301 chr1_random 1663265 + 1264935 1361969 chr1 249250621 + 116056429 116101915 1232
-69	0	1
-30	1	1
-2663	2	0
-4185	1	0
-229	1	0
-25	1	1
-1104	1	0
-604	4	0
-1264	1	0
-2613	1	1
-21	1	0
-12	1	13
-2785	72844	21309
-397	19	2
-2203	1	1
-31	1	1
-658	1	1
-27	1	1
-923	9	9
-168	1	1
-46	0	2
-2502	43	43
-879	17	17
-644
-
-chain 506365 chr1_random 1663265 + 1399143 1404500 chr1 249250621 - 133194419 133199775 28136
-3175	1	0
-1447	0	1
-512	1	0
-221
-
-chain 482769 chr1_random 1663265 + 211415 216543 chr1 249250621 - 247889067 247894197 45886
-70	2	3
-905	2	3
-1091	1	1
-23	1	1
-302	15	14
-393	1	1
-24	1	1
-1961	0	1
-336
-
-chain 474976 chr1_random 1663265 + 1295676 1399043 chr1 249250621 + 115999419 116093083 1267
-571	10	10
-627	7	6
-46	1	1
-3095	0	1
-960	0	1
-608	11	10
-426	39	35
-2035	1	1
-23	1	1
-1866	17	18
-79	1	1
-1530	63368	32589
-866	110	110
-100	53	53
-1884	40	40
-3775	15606	36683
-2322	14	14
-145	49	49
-296	96	96
-297	0	2
-465	58	58
-262	22	22
-182	0	1
-638	1	0
-764
-
-chain 456897 chr1_random 1663265 + 1317 37745 chr1 249250621 + 109592282 109609521 6704
-1178	0	1
-16	1	0
-10	0	1
-4	1	1
-245	7763	188
-27	1	1
-1155	1	1
-91	4156	3450
-1810	51	51
-50	9	10
-567	3839	4491
-37	6346	0
-128	0	2
-29	50	48
-45	1519	155
-6	2	0
-9	10	6
-246	1806	0
-18	1	0
-5	2068	31
-2018	2	2
-20	3	3
-833	1	0
-101	1	0
-149
-
-chain 426748 chr1_random 1663265 + 63710 68210 chr1 249250621 - 139547929 139552428 99412
-1542	1	0
-2957
-
-chain 353264 chr1_random 1663265 + 462791 467071 chr1 249250621 + 144608404 144612698 156569
-71	50	50
-33	29	29
-226	10	10
-526	66	67
-55	50	50
-414	5	5
-57	46	58
-57	12	12
-254	1	1
-25	1	1
-52	13	13
-638	16	16
-579	1	1
-60	1	1
-178	1	1
-79	1	0
-35	0	3
-111	1	1
-43	1	1
-264	1	0
-119	1	1
-15	0	1
-76	1	0
-5
-
-chain 327229 chr1_random 1663265 + 1409275 1412904 chr1 249250621 + 115977641 115981270 200837
-2640	156	155
-473	0	1
-360
-
-chain 312923 chr1_random 1663265 + 1319916 1393318 chr1 249250621 + 115926067 115986980 1722
-1418	1	0
-1389	1	0
-1620	0	1
-374	1	0
-1361	0	1
-1994	1	0
-827	0	6
-1784	56909	44431
-253	1	0
-12	2	0
-8	24	14
-5344	2	0
-76
-
-chain 244562 chr1_random 1663265 + 478502 503782 chr1 249250621 - 100680024 100953393 1328
-106	13	13
-478	55	55
-310	1	1
-23	1	1
-376	1	1
-61	1	1
-1100	10	10
-810	5	0
-53	1	1
-119	1	1
-44	1	0
-94	100	32051
-60	5	5
-744	1	1
-87	1	1
-44	2	0
-53	11	5
-584	2	2
-30	0	17
-73	1	1
-49	1	1
-456	8	8
-796	19	19
-166	1	1
-42	1	1
-105	1	1
-38	1	1
-55	1	1
-80	1	1
-293	2	2
-19	1	1
-550	5637	9366
-68	24	22
-103	1	1
-35	0	1
-102	1	1
-39	6	0
-388	9	9
-21	1	1
-338	27	27
-500	4	0
-117	5	5
-271	1	1
-38	1	1
-273	3	3
-16	3	3
-80	1	1
-63	1	1
-130	1	1
-18	1	1
-204	1	1
-45	1	1
-141	1	1
-112	1	1
-75	1	0
-75	4	4
-83	2	0
-854	5	5
-104	0	4
-12	1	1
-351	1	1
-40	1	1
-102	4779	217183
-40	502	502
-31	0	12
-58	311	311
-110	52	52
-78	1	1
-46	535	535
-45
-
-chain 239113 chr1_random 1663265 + 455713 471283 chr1 249250621 + 144877306 144889304 5703
-73	1	0
-944	0	1
-2741	1	1
-77	1770	1206
-12	1449	338
-10	71	1301
-14	10	145
-26	4281	1018
-2672	0	1
-1418
-
-chain 228041 chr1_random 1663265 + 450807 453388 chr1_gl000192_random 547496 + 525635 528523 474030
-521	25	26
-256	4	316
-195	1	0
-183	4	0
-249	48	48
-915	19	18
-161
-
-chain 219405 chr1_random 1663265 + 8071 23476 chr1 249250621 + 109602419 109665881 23204
-1669	2217	48069
-1950	5	1
-213	6609	8813
-681	1	0
-580	0	1
-296	37	38
-248	0	4
-301	31	31
-143	38	38
-386
-
-chain 219231 chr1_random 1663265 + 32127 34517 chr1 249250621 - 139682423 139684814 491274
-85	27	27
-14	0	1
-204	5	5
-63	24	24
-1968
-
-chain 210320 chr1_random 1663265 + 459650 474308 chr1_gl000192_random 547496 + 522489 531711 22108
-267	0	10
-1175	5	1
-48	0	2
-16	3	3
-119	0	12
-37	12	12
-1340	8711	3256
-34	0	2
-58	1	0
-38	1	0
-351	5	5
-486	17	15
-158	81	81
-76	1	1
-36	1	1
-69	12	13
-1500
-
-chain 207966 chr1_random 1663265 + 29704 55292 chr1 249250621 + 109529352 109557857 7568
-742	273	273
-560	0	1
-232	17541	20458
-729	2	2
-97	3	3
-89	1	1
-68	0	1
-28	1	1
-2575	2	0
-59	1	1
-2585
-
-chain 202325 chr1_random 1663265 + 27243 45056 chr1 249250621 - 139669260 139678536 8944
-1432	157	157
-50	45	45
-677	2608	49
-27	8791	867
-266	9	9
-169	1	1
-62	1	1
-67	7	5
-28	1	1
-1619	22	22
-41	127	127
-21	1	1
-40	2	1
-32	1	1
-362	0	1949
-1147
-
-chain 199687 chr1_random 1663265 + 18553 20627 chr1 249250621 + 109595202 109597276 600797
-2074
-
-chain 171508 chr1_random 1663265 + 447628 491985 chr1 249250621 + 148535207 148566609 6481
-121	14	14
-517	0	4
-507	1	0
-74	1	1
-41	0	1
-61	4541	11291
-1073	1	0
-718	70	44
-66	31371	11607
-690	1	1
-115	1	1
-61	1	1
-70	1	1
-57	0	4
-54	1	1
-41	2	6
-28	5	77
-73	1	1
-34	5	5
-887	1	0
-427	1	1
-7	0	5
-40	1	1
-59	1	1
-47	1	1
-121	9	9
-57	2	0
-362	1	1
-48	4	4
-429	1	1
-28	1	1
-160	1	1
-92	5	0
-15	0	5
-15	1	1
-139	5	5
-37	1	1
-87	1	1
-40	1	1
-253	1	1
-35	1	1
-197	1	1
-69	1	1
-114	1	1
-79	1	1
-51
-
-chain 170629 chr1_random 1663265 + 474420 479154 chr1 249250621 - 104365477 104643040 2652
-3982	697	273526
-55
-
-chain 143194 chr1_random 1663265 + 449166 450695 chr1 249250621 - 104373413 104374943 899312
-167	0	1
-362	11	11
-989
-
-chain 141808 chr1_random 1663265 + 195186 230464 chr1 249250621 + 1361949 1390000 8100
-66	0	1
-865	27548	20313
-75	1	1
-163	2	2
-2267	0	2
-1549	0	2
-37	1	1
-597	1	1
-28	1	1
-269	14	19
-59	1	1
-20	1	1
-734	2	0
-977
-
-chain 137395 chr1_random 1663265 + 446016 447466 chr1 249250621 + 144922370 144923820 937713
-1450
-
-chain 120082 chr1_random 1663265 + 1413004 1414278 chr1 249250621 + 115908963 115910237 1071399
-1274
-
-chain 110577 chr1_random 1663265 + 0 1193 chr5 180915260 + 33390295 33391489 1161255
-153	0	1
-942	4	4
-94
-
-chain 101176 chr1_random 1663265 + 442945 444014 chr1 249250621 - 104338746 104339815 1265508
-1069
-
-chain 61431 chr1_random 1663265 + 9891 10535 chr1 249250621 + 109697165 109697809 2020878
-644
-
-chain 48091 chr1_random 1663265 + 497444 501649 chr1 249250621 + 144842054 144846259 8551
-4205
-
-chain 31572 chr1_random 1663265 + 576223 577747 chr4 191154276 + 100714665 100716180 4375428
-114	20	20
-105	460	462
-56	375	378
-65	263	249
-66
-
-chain 28915 chr1_random 1663265 + 230464 231387 chr1 249250621 + 1420670 1421247 4712368
-191	574	228
-67	38	38
-53
-
-chain 27385 chr1_random 1663265 + 205390 205833 chr1 249250621 - 247799065 247799507 5896168
-141	86	86
-106	47	46
-63
-
-chain 25670 chr1_random 1663265 + 87811 88395 chr7 159138663 - 51241913 51242744 3648322
-121	405	652
-58
-
-chain 21035 chr1_random 1663265 + 376636 377171 chr1 249250621 - 247932544 247932844 3872256
-107	118	0
-61	93	15
-49	39	0
-68
-
-chain 18694 chr1_random 1663265 + 540390 626404 chr1 249250621 + 148529505 148589817 1111
-44	254	254
-43	76	73
-54	196	196
-37	240	6477
-31	4	4
-4	2528	2531
-8	1	1
-42	1	1
-60	70185	38258
-94	10137	10136
-31	1	1
-3	167	167
-88	400	400
-52	829	828
-33	10	0
-52	281	281
-28
-
-chain 18305 chr1_random 1663265 + 612752 613165 chr1 249250621 + 146400208 146400621 434456
-18	31	31
-215	97	97
-52
-
-chain 18205 chr1_random 1663265 + 210123 210768 chr1 249250621 + 1400633 1401273 11939617
-55	410	403
-82	10	12
-88
-
-chain 16211 chr1_random 1663265 + 84691 84862 chr5 180915260 + 68593902 68594073 10696361
-171
-
-chain 14543 chr1_random 1663265 + 375983 376437 chr1 249250621 - 247932585 247932921 12601411
-13	231	153
-56	101	61
-53
-
-chain 11766 chr1_random 1663265 + 209234 209374 chr6 171115067 + 48765751 48765891 19406706
-84	4	4
-52
-
-chain 10899 chr1_random 1663265 + 1264583 1264729 chr4 191154276 - 96228610 96228756 20935897
-69	19	19
-58
-
-chain 9779 chr1_random 1663265 + 575439 575892 chr5 180915260 - 127861600 127862049 19918678
-60	389	385
-4
-
-chain 9449 chr1_random 1663265 + 206282 206576 chr1 249250621 - 247814999 247815293 24134146
-64	179	179
-51
-
-chain 9080 chr1_random 1663265 + 376922 377270 chr1 249250621 - 247932789 247932982 12922008
-42	39	0
-12	156	79
-8	39	0
-52
-
-chain 7488 chr1_random 1663265 + 375996 376227 chr1 249250621 - 247932827 247932944 24096271
-39	178	64
-14
-
-chain 7272 chr1_random 1663265 + 492183 493450 chr1_gl000192_random 547496 + 517200 518462 5534
-104	1136	1131
-27
-
-chain 7258 chr1_random 1663265 + 576783 577499 chr14 107349540 - 76512188 76512903 4928952
-56	262	262
-101	216	215
-81
-
-chain 7167 chr1_random 1663265 + 376446 376521 chr1 249250621 - 247932507 247932582 27908410
-75
-
-chain 6857 chr1_random 1663265 + 87342 87413 chr4 191154276 - 48731804 48731875 28524152
-71
-
-chain 6426 chr1_random 1663265 + 508964 509092 chr1 249250621 + 144828390 144828518 146082
-13	51	51
-64
-
-chain 6204 chr1_random 1663265 + 211009 211075 chr1 249250621 + 1467491 1467557 30075428
-66
-
-chain 6008 chr1_random 1663265 + 376783 376999 chr1 249250621 - 247932727 247932982 14593768
-49	132	171
-35
-
-chain 5855 chr1_random 1663265 + 576112 576191 chr20 63025520 + 560198 560277 14627950
-79
-
-chain 5539 chr1_random 1663265 + 247082 247140 chr16 90354753 - 36623787 36623845 31913042
-58
-
-chain 5517 chr1_random 1663265 + 575499 575571 chr1 249250621 - 135388947 135389019 22575370
-19	14	14
-39
-
-chain 5153 chr1_random 1663265 + 463736 463802 chr1 249250621 - 100897669 100897735 496173
-66
-
-chain 4331 chr1_random 1663265 + 576997 577043 chr4 191154276 + 125192159 125192205 31588172
-46
-
-chain 4269 chr1_random 1663265 + 508977 509028 chr1 249250621 - 101245694 101245744 11082093
-11	1	0
-24	1	1
-14
-
-chain 3392 chr1_random 1663265 + 1264741 1264777 chr1 249250621 + 103601716 103601752 22855599
-36
-
-chain 2584 chr1_random 1663265 + 472532 472613 chr1 249250621 - 104701386 104701467 60543
-81
-
-chain 2530 chr1_random 1663265 + 576576 576677 chr2 243199373 + 18874674 18874775 4960893
-101
-
-chain 2443 chr1_random 1663265 + 508878 508906 chr1 249250621 + 145358788 145358816 8460
-28
-
-chain 2298 chr1_random 1663265 + 376035 376059 chr1 249250621 - 247932520 247932544 25650669
-24
-
-chain 2200 chr1_random 1663265 + 377179 377218 chr1 249250621 - 247932814 247932853 18046603
-39
-
-chain 2078 chr1_random 1663265 + 576191 576213 chr2 243199373 - 87184513 87184535 19810119
-22
-
-chain 1902 chr1_random 1663265 + 462945 462974 chr1 249250621 + 146388727 146388756 1440299
-29
-
-chain 1597 chr1_random 1663265 + 87932 87955 chr1 249250621 + 203810737 203810760 8954286
-23
-
-chain 1582 chr1_random 1663265 + 576728 576783 chr12 133851895 + 80469819 80469874 8882774
-55
-
-chain 1575 chr1_random 1663265 + 377270 377295 chr1 249250621 - 247932789 247932814 25950613
-25
-
-chain 1557 chr1_random 1663265 + 376743 376767 chr1 249250621 - 247932958 247932982 25686497
-24
-
-chain 1423 chr1_random 1663265 + 577528 577578 chr3 198022430 + 24122600 24122650 5633229
-50
-
-chain 1401 chr1_random 1663265 + 208964 209027 chr19 59128983 + 53692979 53693042 24768107
-63
-
-chain 1269 chr1_random 1663265 + 577058 577101 chrX 155270560 - 54470903 54470946 5438939
-43
-
-chain 1137 chr1_random 1663265 + 88481 88531 chrX 155270560 - 107394638 107394688 10193603
-50
-
-chain 1096 chr1_random 1663265 + 88429 88481 chr1 249250621 - 213837318 213837370 14790649
-52
-
-chain 963 chr1_random 1663265 + 575892 575970 chr1 249250621 - 198864223 198864301 11419759
-78
-
-chain 917 chr1_random 1663265 + 455298 455327 chr1_gl000192_random 547496 - 58673 58702 411262
-29
-
-chain 870 chr1_random 1663265 + 577218 577269 chr6 171115067 - 89553434 89553485 24911812
-51
-
-chain 794 chr1_random 1663265 + 88312 88337 chr4 191154276 + 171087862 171087887 6635553
-25
-
-chain 649 chr1_random 1663265 + 576545 576576 chr15 102531392 - 5321440 5321471 7251364
-31
-
-chain 622 chr1_random 1663265 + 576462 576495 chr11 135006516 + 114505284 114505317 6564387
-33
-
-chain 546 chr1_random 1663265 + 88531 88556 chr6 171115067 + 144792007 144792032 10415340
-25
-
-chain 398 chr1_random 1663265 + 575763 575814 chr14 107349540 + 34662629 34662680 24063646
-51
-
-chain 22466167312 chr2 242951149 + 0 242751149 chr2 243199373 + 10000 243102476 1
-1201236	1	0
-2057	1	1
-26	1	1
-4043	0	22
-82	101	7
-33	0	74
-36	13	1
-67	0	48
-152	0	418
-50	2	0
-6	6	0
-76	74	0
-20	6	0
-22	118	0
-374	0	2446
-836	0	2310
-21	0	2444
-21507	1	1
-50	0	4
-2041	4	0
-9052	0	2
-81	8	0
-10	42	0
-1078	1	0
-4122	0	1
-1608	1	28
-4029	9	0
-967	1000	4547
-414	0	27
-2237132	1	0
-2458	17	17
-3915	47	47
-633	0	4
-3531	14	14
-3954	50000	51129
-1426129	100025	160449
-11087286	3	0
-773	50000	103977
-1576	1	0
-240	1	0
-318	0	2
-258	16	0
-2848	10	10
-1404	1	1
-27	1	1
-703	0	13
-375	1	0
-4783388	25000	35000
-848	2	0
-1225	2	0
-391	0	1
-3445	24	24
-184	1	1
-28	1	1
-49	4	0
-4514	9	0
-9628	9	1
-1483	7	7
-1990	1	0
-1949	0	1
-2716230	0	1
-46732767	9	5
-9477928	3	0
-7520813	0	72396
-1900436	150000	294073
-17672	0	1
-5792	0	1
-9019	266	0
-2942	1	0
-9388	0	2
-37826	0	4
-23440	4	0
-290929	1000000	1273578
-731068	3000000	3000000
-2558421	1	0
-1196	0	10
-686	1	0
-26	3	0
-15	1	1
-2309	1	0
-1332	23	22
-344	1	0
-1645	4	4
-6564	0	1
-6329	0	1
-769	1	0
-873	0	7
-1299	1	0
-8250	15	15
-4291	12548	10626
-1054	0	103
-84	218	0
-5897	1	1
-33	1	1
-9905	37	51
-1645	113	113
-1597	4	4
-61	1	1
-866	0	13
-2830	0	3
-2819	2	0
-156	436	88
-100	54	0
-4753	8	0
-4903	6	6
-3847	2	0
-108126	145	0
-3542	0	1
-10276	1	0
-402	1	1
-47	1	1
-63	0	2
-583	1	1
-34	1	1
-8975	46	0
-378	1	1
-70	1	1
-2476	102	0
-1754	1	0
-8426	1	0
-11986570	142000	151150
-14207	1	1
-49	1	1
-1784	12	0
-406	0	1
-1874	1	1
-33	1	1
-4795	0	2
-3686	1	1
-15	1	1
-164	0	2
-7287	5	5
-702023	150000	72796
-69	0	1
-1598	1	0
-1340	1	0
-1030	4	0
-1166	10	10
-629	27	27
-5750	1	1
-34	1	1
-3283	4	2
-496	21	1
-25	1	9
-41	1	1
-329	4	4
-9955	41	41
-10953	1	2
-1417	44	0
-911	0	17
-18270	0	1
-178429	281526	0
-34455	406	0
-58863	2	1
-1843	2	0
-14994	1	0
-12992	0	2
-2571146	0	1
-35688061	100000	108224
-29671719	0	1
-39665349	0	1
-14876089	20000	64197
-401	3	0
-1831	1	1
-61	1	1
-654	1	11
-138	28	0
-105	1	1
-25	4	0
-73	9	9
-3247	0	2
-1355	0	1
-816	21	25
-526	1	1
-60	1	1
-773	0	1
-1494	0	1
-448	44	44
-1191	0	1
-21	1	1
-596	0	1
-1582	0	1
-425	3	0
-1141	8	0
-136	744	80
-18	1	0
-4	1	0
-8	4	2
-32	1	0
-71	0	1
-385747	1	1
-110	1	1
-51	7	7
-54	15205	15205
-54	7	7
-51	1	1
-110	1	1
-5198249	1	0
-108	0	40
-65	0	80
-100	2	82
-442	1	1
-35	1	1
-119	129	9
-33	40	0
-42	1	1
-86	40	0
-1330	1	0
-1194	2	0
-11	1	1
-1773	5	0
-1623	1	1
-25	1	1
-2422	1	1
-20	1	0
-2315	1	0
-31	1	1
-1508	3	0
-50	4	0
-970	6	6
-7234	0	4
-1228	0	1
-1233	1	8
-744	16	16
-3447	1	1
-41	1	1
-3297	2	0
-1714	0	2
-2299	0	2
-2143	1	1
-18	1	1
-917	0	1
-1082	1	1
-49	1	1
-9098	4	0
-5529	1	0
-3266	8	0
-894	0	6
-3536	0	2
-4179	13	18
-1785	1	0
-1675	6	0
-1216	33000	32348
-287	109	573
-12548	30000	30000
-952154	25000	41011
-1914	0	1
-225	1	1
-57	1	1
-2910	1	0
-471	0	1
-1956	1	1
-43	1	1
-1000	92	0
-2854	0	3
-1837	0	306
-1007	0	30
-206	35	32
-217	17	17
-1525	0	8
-413	1	1
-32	2	2
-1573	12	12
-2258676
-
-chain 1437141 chr2 242951149 + 234136066 234151271 chr2 243199373 - 8712841 8728046 1459
-15205
-
-chain 1229376 chr2 242951149 + 110524471 111016063 chr2 243199373 - 132402743 134718956 53
-41	12371	12350
-33	0	23
-11	197610	197512
-5295	5	5
-190	69	19
-2195	1	0
-285	34	34
-1682	1	0
-182	11	6
-291	0	1
-1506	15	16
-146	5	5
-2050	51	51
-186	8	7
-68	7	6
-41	1	0
-306	0	1
-1545	1	0
-1334	25	24
-543	0	2
-224	17	21
-615	1	0
-208	2	0
-158	27	21
-3320	0	1
-576	0	2
-4562	0	6
-1023	0	1
-977	0	1
-3904	1	0
-827	415	28
-1508	14	13
-9571	36	36
-1393	1	1
-42	1	1
-2205	0	2
-5258	36	0
-42	2	0
-4437	2	0
-3357	1	0
-6289	0	9
-1996	1	0
-3228	0	1
-202	0	1
-2743	7	0
-24	0	5
-549	3	1
-942	0	6
-1815	8	0
-874	0	3
-4737	0	2
-852	14	18
-518	14	14
-4377	1	1
-49	1	1
-3270	1	0
-753	0	4
-240	1	0
-2391	0	1
-4745	4	0
-5752	0	2
-880	0	1
-397	1	0
-1407	0	3
-120	1	1
-89	1	1
-7011	3	0
-188	8	8
-834	5	0
-94	18	18
-3711	150112	1975291
-345	52	52
-100	8	8
-52	6	6
-650	6	6
-273	91	95
-88	90	90
-331	116	116
-66	35	35
-145	13	15
-95	6	6
-301	43	47
-444	12	12
-645	116	119
-215	31	31
-748	58	57
-212	71	71
-420	38	38
-190	4	4
-51	32	32
-65	32	32
-182	69	69
-161	17	17
-74	36	36
-170	25	25
-124	19	15
-230
-
-chain 33206 chr2 242951149 + 111008548 111015495 chr2 243199373 + 113147044 113153995 310
-112	345	345
-52	1095	1095
-15	0	4
-76	88	88
-90	331	331
-116	66	66
-35	560	560
-43	1101	1101
-116	215	215
-31	748	748
-58	212	212
-71	420	420
-38	245	245
-32	65	65
-32	182	182
-69	252	252
-36
-
-chain 15095 chr2 242951149 + 97284299 97473552 chr2 243199373 - 145080546 145267103 122
-48	13638	11732
-218	15837	15837
-37	1645	1645
-113	8336	8336
-436	100	100
-54	121645	121635
-3	25	0
-101	26915	26159
-9	0	1
-93
-
-chain 10366 chr2 242951149 + 110742577 110753868 chr2 243199373 + 113162562 113173850 1257
-34	5889	5884
-51	5290	5292
-27
-
-chain 3994 chr2 242951149 + 111050518 111050561 chr2 243199373 - 132647167 132647210 483
-43
-
-chain 3626 chr2 242951149 + 1208025 1208063 chr2 243199373 + 1217618 1217656 30090800
-38
-
-chain 3098 chr2 242951149 + 110780566 110780602 chr2 243199373 + 100698198 100698234 394442
-36
-
-chain 2548 chr2 242951149 + 89594034 89594300 chr2 243199373 - 153635204 153635700 103
-90	9	107
-22	9	0
-32	3	0
-5	0	125
-21	15	30
-5	1	0
-25	0	5
-29
-
-chain 2507 chr2 242951149 + 1207989 1208025 chr2 243199373 + 1217656 1217692 7254147
-36
-
-chain 2306 chr2 242951149 + 97446409 97446434 chr2 243199373 + 98080299 98080324 1844703
-25
-
-chain 5644665978 chr20 62435964 + 8000 62435964 chr20 63025520 + 60000 62965520 20
-26259569	1765661	3100000
-234339	1000000	150000
-4004088	0	1
-6459	0	244
-37810	0	2
-1044573	20000	50000
-9411883	2	8
-362	0	1
-11607353	0	1
-1301304	1	0
-31033	0	9
-1154	0	2
-1088	1	1
-29	1	1
-2509	0	2
-407	1	0
-40	1	1
-3787164	27050	50000
-71932	110000	50000
-694117	0	1
-1008033
-
-chain 3228730713 chr21 46944323 + 9719767 46944323 chr21 48129895 + 10697896 48119895 23
-490233	3050000	3150000
-19828060	0	1
-8789369	1199	50000
-243783	1500	1500
-1381822	1359	50000
-3437231
-
-chain 42537850 chr21_random 1679693 + 281005 1255172 chr21 48129895 + 9411193 10647896 88
-184355	50000	489372
-131056	458754	281918
-150002
-
-chain 21600281 chr21_random 1679693 + 876305 1679693 chr21 48129895 - 37585054 38304458 99
-178865	280890	346005
-315	2	2
-38	1	1
-261	1	1
-24	1	1
-157	0	325
-16	1	1
-85	1	1
-66	1	1
-330	11	11
-235	1	1
-51	1	1
-405	1	1
-26	1	1
-130	5	5
-80	1	1
-91	1	1
-20	1	1
-244	0	1
-478	1	1
-5	1	0
-13	0	1
-49	1	1
-197	10	10
-158	1	1
-57	0	1
-829	1	1
-60	1	1
-51	0	1
-584	1	0
-21	2	0
-151	20	20
-316	1	1
-16	1	1
-100	7	7
-102	1	1
-49	1	1
-125	1	0
-102	13	13
-153	20	20
-199	1	0
-35	1	1
-367	1	1
-51	1	1
-344	1	1
-101	1	1
-243	1	1
-27	1	1
-338	0	4
-166	15	15
-73	1	1
-44	1	1
-282	4	4
-67	1	1
-54	1	1
-216	1	1
-48	1	1
-76	1	1
-70	1	1
-392	1	1
-44	1	1
-65	8	9
-362	0	4
-34	1	1
-68	1	1
-57	1	0
-120	1	1
-374	1	1
-21	1	1
-121	1	1
-34	1	1
-80	1	0
-64	2	0
-162	8	8
-184	1	1
-34	1	1
-658	2	2
-52	0	4
-297	1	0
-136	1	1
-20	1	1
-905	0	1
-250	7	8
-138	0	3
-104	1	0
-42	1	1
-539	0	1
-43	4	0
-633	0	20
-353	17	17
-969	4	0
-39	3	3
-210	3	1
-188	7	7
-459	2	2
-25	1	1
-207	1	1
-55	1	1
-375	1	1
-66	1	1
-599	0	2
-395	1	1
-33	1	1
-73	1	1
-35	2	0
-275	9999	10000
-353	1	1
-26	1	1
-423	1	1
-32	1	1
-86	7	7
-197	1	1
-44	1	1
-96	1	1
-77	7	0
-247	0	2
-77	1	1
-425	13	1
-32	1	1
-65	1	1
-217	3	2
-115	1	1
-33	1	1
-268	1	0
-959	1	1
-63	1	1
-93	5	5
-185	1	1
-31	1	1
-944	12	12
-413	1	1
-92	1	1
-276	1	1
-35	1	1
-500	1	1
-31	149436	9
-158069
-
-chain 14432948 chr21_random 1679693 + 78709 231005 chr21 48129895 + 9882623 10034920 205
-77296	0	1
-75000
-
-chain 7807601 chr21_random 1679693 + 1362161 1471624 chr1 249250621 - 105758025 105867745 293
-77	11427	11419
-174	5	5
-857	64	64
-2170	0	2
-621	1	1
-26	1	1
-4365	0	1
-155	0	1
-452	0	4
-941	0	4
-403	1	1
-45	1	1
-534	86	86
-2198	0	1
-303	2	0
-5470	6	6
-845	1	1
-45	1	1
-221	6	0
-321	1	1
-44	1	1
-354	1	0
-374	131	130
-577	6	5
-263	17	16
-207	0	2
-1746	14	14
-3223	1	1
-46	4	4
-1479	1	1
-46	1	1
-383	0	3
-44	1	1
-2724	67	67
-47	145	145
-350	116	116
-138	0	1
-1	65	65
-796	17	17
-645	1	0
-24	1	1
-1318	1	0
-687	1	1
-41	1	1
-2292	1	1
-37	1	1
-589	1	1
-37	1	0
-670	13	13
-357	4	0
-2667	3	0
-1941	1	1
-31	1	1
-1538	54	54
-64	166	166
-120	226	226
-46	14	0
-14	155	155
-92	54	54
-26	55	55
-98	131	131
-36	1	1
-76	391	391
-44	294	294
-37	813	813
-35	219	219
-898	1	1
-19	1	1
-213	12	12
-1926	1	1
-21	1	1
-4561	1	1
-28	1	1
-8361	1	1
-43	1	1
-429	211	492
-3095	0	1
-3873	1	1
-43	5	5
-3785	171	171
-65	122	122
-70	116	116
-29	459	459
-36	352	352
-39	93	93
-39	190	190
-41	1783	1784
-35	509	509
-27	394	394
-57	834	834
-58	10	10
-17	758	760
-41	0	4
-82	194	194
-60	543	543
-31	58	58
-46	607	607
-34	98	98
-31	1	1
-38	563	562
-135	1980	1976
-48	370	370
-42	515	515
-49	456	456
-3137	0	1
-2483	1	0
-357	1	1
-49	1	1
-1181	1	0
-885	1	0
-86
-
-chain 3630496 chr21_random 1679693 + 696416 1463441 chr21 48129895 + 9645548 10215976 235
-129889	481231	310631
-225	46	51
-383	6	6
-73	18	18
-200	18	39
-236	63	68
-123	340	365
-57	300	259
-51	138	138
-71	55	55
-60	152	152
-51	100	103
-61	358	357
-85	1906	236
-88	157	153
-56	39	39
-73	20146	20047
-67	1	0
-57	154	154
-59	940	953
-61	205	205
-60	46	46
-122	149	149
-53	64	56
-210	16	16
-209	1	0
-214	29	29
-71	69616	76139
-67	47	47
-145	350	354
-116	139	135
-65	13718	10425
-54	64	64
-166	120	120
-225	75	75
-74	14	13
-67	92	92
-54	26	26
-55	98	98
-127	117	117
-173	16	15
-202	44	44
-198	21	17
-75	37	37
-442	18	18
-353	35	35
-219	27532	0
-105	0	3
-66	65	65
-122	70	70
-116	29	29
-459	36	36
-278	17	17
-57	39	40
-93	39	39
-190	41	41
-285	16	20
-859	22	37
-176	4	4
-183	32	32
-206	35	36
-509	27	27
-394	57	56
-116	5	5
-596	1	0
-116	85	85
-54	0	1
-119	0	2
-585	124	127
-74	10	11
-109	60	60
-82	22	22
-439	31	31
-58	46	46
-106	21	22
-186	15	14
-279	34	34
-98	70	67
-166	1	0
-396	135	135
-1551	12	12
-90	0	3
-69	4	4
-48	3	0
-203	48	48
-370	42	42
-139	14	53
-362	49	49
-456
-
-chain 2630212 chr21_random 1679693 + 936 28709 chr21 48129895 + 44682664 44710462 1048
-3985	6	7
-8941	0	30
-3327	1	1
-74	1	1
-859	22	22
-89	70	70
-489	14	3
-11	2	1
-10	10	0
-10	0	1
-31	1	27
-556	3	0
-128	0	1
-358	1	1
-45	1	1
-1712	8	0
-6545	32	31
-431
-
-chain 517534 chr21_random 1679693 + 1332563 1373665 chr4_gl000194_random 191469 - 21469 62943 261
-130	2	2
-53	1	1
-139	1	1
-60	1	1
-321	125	125
-72	1	1
-81	59	59
-248	22	23
-250	13	13
-407	61	61
-205	60	60
-46	122	122
-149	53	53
-14	0	8
-50	650	650
-29	19697	20073
-100	1	4
-106	2	2
-158	1	1
-89	1	1
-10	1	1
-65	1	1
-48	1	1
-156	1	1
-61	1	1
-156	1	1
-81	1	1
-522	16	16
-377	22	22
-358	1	1
-17	1	1
-141	1	0
-29	0	1
-16	1	1
-105	1	1
-49	2	1
-63	1	1
-32	1	0
-7	1	1
-349	1	2
-102	1	1
-146	1	0
-93	3	0
-149	1	1
-86	1	1
-220	1	1
-111	1	1
-195	19	19
-108	1	1
-79	6	1
-98	0	1
-29	2	2
-98	1	1
-125	1	1
-196	1	1
-52	1	1
-767	1	1
-68	3	3
-70	1	1
-66	1	1
-331	1	1
-22	1	1
-60	77	77
-437	1	1
-61	1	1
-134	1	1
-48	4	2
-26	0	2
-79	1	1
-16	1	1
-77	1	1
-24	1	1
-176	1	1
-33	1	1
-61	0	4
-141	1	1
-17	1	1
-232	1	1
-42	1	1
-439	2	1
-31	1	1
-55	1	0
-181	1	1
-77	4	4
-145	4	5
-22	1	1
-159	1	6
-53	1	1
-63	1	1
-67	6	6
-71	1	1
-25	1	1
-103	6	6
-303	6513	6492
-211	1	1
-87	1	1
-170	2	2
-36	0	6
-361	1	1
-58	1	1
-292	10	10
-201	1	1
-35
-
-chain 353583 chr21_random 1679693 + 1323386 1332563 chrUn_gl000218 161147 - 0 9198 304
-693	1	1
-28	4	0
-425	51	51
-874	2	4
-421	1	1
-23	1	1
-299	2	1
-20	3	3
-88	1	1
-35	1	1
-283	4	4
-42	4	4
-719	14	14
-181	1	1
-41	1	1
-1010	1	1
-59	1	1
-478	1	1
-45	1	0
-78	1	1
-315	1	1
-22	1	1
-342	1	1
-27	1	1
-716	0	25
-83	1	1
-44	1	1
-218	6	6
-142	1	1
-178	1	1
-220	1	1
-35	1	1
-55	1	1
-44	1	1
-143	1	1
-80	1	1
-85	1	1
-46	1	1
-169	1	1
-56	1	1
-94	1	1
-51	1	1
-48
-
-chain 153763 chr21_random 1679693 + 1307498 1317523 chr1 249250621 + 142541121 142549427 248494
-38	225	225
-46	934	934
-63	240	230
-50	653	627
-57	559	562
-4	186	183
-51	101	101
-16	235	235
-70	1848	174
-58	193	194
-3	255	257
-97	40	40
-164	35	35
-167	27	27
-82	213	218
-106	172	171
-55	274	274
-125	214	209
-158	123	124
-94	169	169
-69	430	425
-66	871	864
-95	213	213
-81
-
-chain 88175 chr21_random 1679693 + 0 28278 chr21_gl000210_random 27682 - 0 27251 1050
-107	675	0
-154	27310	26958
-32
-
-chain 46308 chr21_random 1679693 + 1305249 1307368 chr21 48129895 - 38147885 38150014 728191
-46	171	171
-69	165	166
-32	292	292
-34	184	184
-26	73	73
-23	117	117
-57	54	54
-7	16	25
-68	78	78
-23	242	242
-53	230	230
-59
-
-chain 40072 chr21_random 1679693 + 1311066 1311528 chr3 198022430 + 38430454 38430916 3283349
-95	1	1
-47	1	1
-177	1	1
-41	1	1
-98
-
-chain 25551 chr21_random 1679693 + 1316263 1317134 chr21 48129895 + 10022171 10023044 3443865
-97	94	94
-87	148	147
-94	340	343
-11
-
-chain 20886 chr21_random 1679693 + 1305172 1307309 chrY 59373566 - 45989384 45991522 2022
-77	46	46
-64	50	50
-57	69	70
-165	32	32
-86	11	11
-195	34	34
-184	122	122
-117	57	57
-54	91	91
-50	51	51
-242	61	61
-68	9	9
-145
-
-chain 10360 chr21_random 1679693 + 1384481 1394861 chr21 48129895 - 38158677 38169079 831
-56	10224	10246
-100
-
-chain 9106 chr21_random 1679693 + 1316541 1317639 chr2 243199373 + 56015784 56016880 4408555
-45	37	37
-66	97	95
-66	672	672
-115
-
-chain 7814 chr21_random 1679693 + 1312477 1312593 chr8 146364022 + 34952530 34952621 21041862
-26	37	12
-53
-
-chain 6987 chr21_random 1679693 + 1305359 1306761 chr1 249250621 - 105769657 105771059 738748
-38	5	5
-7	1324	1324
-28
-
-chain 3478 chr21_random 1679693 + 1309705 1309742 chrX 155270560 - 92499801 92499838 30075241
-37
-
-chain 2939 chr21_random 1679693 + 1312274 1312311 chr1 249250621 - 217601682 217601719 16037052
-37
-
-chain 2906 chr21_random 1679693 + 1394861 1394892 chrUn_gl000247 36422 - 2105 2136 848
-31
-
-chain 2805 chr21_random 1679693 + 1309675 1309705 chr4 191154276 - 16268024 16268054 28769751
-30
-
-chain 2788 chr21_random 1679693 + 1374701 1374765 chr4_gl000194_random 191469 - 63980 64044 1175
-9	36	36
-19
-
-chain 2571 chr21_random 1679693 + 1317411 1317442 chr20 63025520 - 39738360 39738391 24462467
-31
-
-chain 2324 chr21_random 1679693 + 1311588 1311646 chr2 243199373 + 3637936 3637994 8156424
-58
-
-chain 1980 chr21_random 1679693 + 1440240 1440313 chr1 249250621 + 142677559 142677632 922
-73
-
-chain 1679 chr21_random 1679693 + 1316387 1316422 chr13 115169878 + 41439086 41439121 11997585
-35
-
-chain 1437 chr21_random 1679693 + 1316422 1316454 chr3 198022430 + 119282439 119282471 8460363
-32
-
-chain 1151 chr21_random 1679693 + 1312216 1312274 chr13 115169878 + 46060123 46060181 10002138
-58
-
-chain 1007 chr21_random 1679693 + 1312144 1312195 chr17 81195210 + 33522637 33522688 8813060
-51
-
-chain 810 chr21_random 1679693 + 1306268 1306301 chr4 191154276 - 63157613 63157646 21715000
-33
-
-chain 762 chr21_random 1679693 + 1312422 1312477 chr7 159138663 + 153013126 153013181 10840208
-55
-
-chain 732 chr21_random 1679693 + 1312000 1312066 chr7 159138663 - 102920653 102920719 25474729
-66
-
-chain 561 chr21_random 1679693 + 18264 18311 chr21 48129895 + 44700101 44700148 25859698
-47
-
-chain 3320960322 chr22 49691432 + 14430000 49591432 chr22 51304566 + 16050000 51244566 22
-647850	150000	150000
-3661581	50000	100000
-15278435	0	18
-293	0	36
-1410	1	1
-46	1	1
-6626947	2	4
-1759	1	1
-43	1	1
-1367363	12000	10615
-7856	4	0
-809336	0	20
-6307	20	0
-6702	50000	2669
-4247727	10618	0
-1558	0	2719
-35231	0	131
-12647	4	0
-45594	85	9
-19562	0	506
-165501	5	7
-1103946	16700	60575
-644	0	2
-319796	1600	1155
-17927	19763	15469
-464566
-
-chain 6025887 chr22_h2_hap1 63661 + 0 63661 chr22 51304566 + 42594964 42658568 527
-748	1	0
-260	4	0
-675	1	0
-4844	0	2
-10592	8	0
-3276	29	0
-2384	10	0
-2795	0	2
-464	1	0
-3865	1	0
-1777	1	0
-1286	0	2
-875	1	0
-2336	1	0
-4337	1	0
-2724	0	3
-1087	6	0
-7154	0	1
-1045	2	0
-11070
-
-chain 15737781 chr22_random 257318 + 90752 257318 chrUn_gl000211 166566 + 0 166566 187
-166566
-
-chain 3641362 chr22_random 257318 + 7 38789 chr11 135006516 - 18284691 18323344 804
-2900	3	1
-66	1	1
-55	1	1
-3449	0	1
-1785	1	1
-37	1	1
-178	1	0
-852	0	1
-2329	2	0
-4939	1	0
-1557	1	1
-30	1	1
-1005	1	0
-622	16	0
-39	0	1
-42	0	22
-755	1	1
-30	1	1
-952	1	1
-26	1	1
-141	18	17
-1110	2	0
-1529	1	1
-22	1	1
-399	1	1
-33	1	1
-1369	20	30
-3959	0	4
-1144	1	0
-1032	27	25
-8	23	0
-56	24	0
-51	0	9
-11	1	57
-34	4	4
-7	134	0
-296	26	0
-25	1	1
-2452	0	5
-19	1	1
-231	1	0
-327	1	0
-962	1	1
-22	1	1
-1571
-
-chain 109494 chr22_random 257318 + 39517 40750 chr22 51304566 - 30977735 30979001 1172425
-166	5	5
-133	3	3
-48	1	1
-297	0	33
-234	1	1
-58	4	4
-283
-
-chain 19094 chr22_random 257318 + 39007 39213 chr22 51304566 - 29625864 29626070 11204980
-206
-
-chain 8587 chr22_random 257318 + 39415 39517 chr22 51304566 - 29782769 29782871 2027258
-50	48	48
-4
-
-chain 3763 chr22_random 257318 + 39465 39513 chr22 51304566 - 30978529 30978577 2726523
-48
-
-chain 17719073 chr2_random 185571 + 0 185498 chr2 243199373 + 242522204 242710000 158
-43034	21	22
-16724	1	0
-52199	0	669
-3059	0	4
-14500	1	0
-409	1	1
-22	1	1
-2039	1	0
-809	0	1
-2041	0	4
-2258	6	6
-4179	12	13
-1973	1	1
-21	1	1
-1855	1	1
-37	2	2
-4315	0	1
-1584	14	0
-281	0	2
-78	1	1
-1497	9	0
-237	2	1
-826	4	0
-21273	4	0
-6716	0	1650
-3449
-
-chain 18404389309 chr3 199501827 + 35000 199446827 chr3 198022430 + 60000 197962430 3
-13552792	1	0
-585083	1	0
-2092	74	72
-31067262	1	0
-90	0	1
-5628461	15	0
-788	0	1
-3676	2	0
-35	1	1
-4682	0	1
-1295	5	0
-437	42	53
-326	2	0
-3309	1	1
-40	1	1
-998	3	0
-3584	0	5
-930	7	5
-845	1	1
-28	1	2
-303	1	0
-509	5	0
-2291	6	6
-2789	0	1
-2541	9692	9690
-949	4	4
-35	1	1
-2874	1	0
-6717	1	0
-2823	0	1
-704	4	0
-5142	0	1
-2490	10	10
-162	7	7
-6308	15	0
-15177535	260003	152352
-2532	0	1
-24209179	4400000	3000000
-60453438	4	0
-40076811	20000	20999
-8195	1	1
-44	1	1
-1408	1	1
-33	1	1
-172	4	3
-25	1	1
-538	13	13
-173	1	1
-27	1	1
-636	1	1
-28	1	1
-470	3	3
-112	1	1
-375	1	1
-26	0	26
-106	0	78
-72	9	6
-12	3	29
-79	5	262
-56	1	1
-20	1	1
-815	43	43
-457	1	1
-49	0	18
-509	3	4
-23	1	1
-391	1	1
-44	1	1
-1270	4	0
-40	1	1
-264	27	31
-2416	2	0
-4377	13	13
-736	1	1
-47	1	1
-1416	1	1
-20	1	1
-1020	1	1
-25	1	1
-482	0	5
-716	0	1
-1697	1	1
-29	1	1
-1270261	27000	23108
-40930	0	1
-17455	1	1
-28	4	4
-45	491	0
-1669	58	0
-18	3	61
-54863	16	53
-7653	6	0
-3	99	0
-170	30	0
-25	0	30
-210	0	45
-359	0	915
-5980	256	640
-1363	1	1
-37	1	1
-7958	1	0
-372	1	0
-2442058
-
-chain 572461 chr3 199501827 + 50900356 50910048 chr3 198022430 - 147087402 147097092 2111
-52	1	6
-5886	1	0
-2586	6	0
-1160
-
-chain 14997 chr3 199501827 + 196923229 196923617 chr3 198022430 + 195437554 195437811 3659243
-77	131	0
-180
-
-chain 6146 chr3 199501827 + 196987930 196988205 chr3 198022430 + 195502296 195502751 2529960
-74	171	141
-23	2	212
-5
-
-chain 4201 chr3 199501827 + 196923126 196923228 chr3 198022430 + 195438036 195438138 6236935
-102
-
-chain 2082 chr3 199501827 + 196994845 196994975 chr3 198022430 + 195509346 195509572 2249717
-55	18	114
-57
-
-chain 20970321 chr3_random 749256 + 196010 556188 chr3 198022430 - 121623404 130096441 129
-131258	0	1
-41217	50000	8162858
-137703
-
-chain 13779918 chr3_random 749256 + 0 146010 chr3 198022430 - 77602115 77748060 219
-64144	1	0
-1191	0	1
-633	0	1
-4651	29	21
-5147	0	1
-947	14	0
-64	56	0
-55	0	2
-2421	0	15
-741	9	0
-371	6	4
-554	1	0
-5424	0	1
-4074	1	1
-44	1	1
-3065	0	1
-2772	1	1
-36	1	1
-15950	1	0
-2351	0	2
-5999	1	0
-17825	0	13
-74	1	1
-367	1	1
-47	1	1
-2084	2	0
-288	0	3
-744	1	0
-131	0	1
-465	1	1
-29	1	1
-659	10	0
-830	0	3
-262	3	0
-1428
-
-chain 13528802 chr3_random 749256 + 606188 749256 chr3 198022430 + 46352896 46495976 221
-8517	0	10
-20860	0	6
-16120	0	1
-4148	7	6
-745	7	6
-517	6	0
-907	5	5
-1382	4	0
-2730	0	1
-1143	36	36
-457	13	17
-1748	1	1
-48	1	1
-954	0	2
-767	1	4
-7353	0	8
-4950	0	12
-13338	0	1
-4685	1	1
-21	1	1
-1414	3	0
-4158	23	23
-5081	0	1
-14097	1	1
-49	1	1
-770	16	16
-424	1	1
-17	1	1
-244	1	1
-23	1	1
-1462	12	0
-2048	14	0
-4573	1	0
-3856	2	0
-754	0	8
-7304	1	0
-5243
-
-chain 17653370240 chr4 191273063 + 0 191263063 chr4 191154276 + 10000 191029082 4
-1413146	51000	71672
-5369	5	6
-65	1	1
-67	1	1
-425	1	1
-32	1	1
-175	1	1
-34	1	1
-5092	1	1
-46	1	1
-1396	15	15
-1446	0	1
-5135	1	0
-586	1	1
-38	1	1
-10	0	21
-1587	0	6
-205	0	3
-97	6	0
-177	0	9
-4059	1	1
-71	1	1
-1413	83	1
-51	7	7
-105	7	7
-67	41	0
-67	42	1
-55	41	0
-25	41	0
-3244	558	0
-64	93	0
-93	558	0
-907	0	2
-1101	55	0
-3473	15	15
-1167	3	0
-25	0	29
-135	29	0
-5074	1	1
-42	1	1
-1825	14	14
-1992	0	3
-23	1	1
-4171	6	6
-796	0	165
-196	0	99
-87	0	33
-190	6	8
-107	2	2
-21	0	2
-62	1	68
-32	14	15
-81	18	18
-55	0	100
-17	1	1
-222	2	169
-51	0	35
-3289	18	18
-298	0	1
-373	0	1
-2965	1	1
-28	0	23
-1704	0	38
-114	0	38
-53	7	44
-119	77	0
-269	1	1
-70	1	1
-2000	23	33
-2400	1	1
-94	1	1
-6002	18	18
-776	1	0
-369	16	16
-418	51	0
-53	1	27
-2181	1	4
-57	1	1
-1973	10	0
-4184	11	11
-1594	0	18
-2038	0	109
-4332	0	7
-49	0	4
-1465	3	1
-4156	2	0
-5455	3	2
-129	4	4
-9082	0	1
-786	20	20
-1506	0	1
-252	8	7
-17512	50	1
-56	1	0
-2474	69	52
-69	0	30
-60	16	0
-19	15	0
-40	1	1
-138	16	0
-74	5	51
-3386	0	1
-968	0	4
-1624	11	11
-1065	0	3
-2935	8	0
-2312	0	181
-2300	1	0
-1641	6	1
-1955	0	1
-68	1	1
-347	1	1
-40	1	1
-1553	6	0
-678	16	16
-92	0	33
-390	4	0
-1147	0	1
-1948	4	4
-4296	18	18
-955	1	1
-47	1	1
-1555	1	0
-2251535	81122	0
-145	1	1
-48	1	1
-718	1	0
-2789	1	1
-27	1	1
-1601	4	0
-1048	39	39
-820	0	2
-20	6	0
-28	2	0
-76	12	18
-28	1	0
-11	9	3
-1772	0	6
-22	1	1
-946	1	1
-24	1	1
-1245	1	0
-3231	1	1
-41	1	1
-1652	20	20
-11270	3	0
-2704	1	1
-41	1	1
-1812	5	6
-1477	0	11
-3790	4	0
-2187	1	1
-48	1	1
-1704	1	1
-73	1	1
-2265	1	1
-10	1	1
-553	1	1
-49	1	1
-67	1	1
-33	1	1
-3932	5	0
-18	1	0
-780	0	1
-1260	0	1
-4203	0	25
-863	14	14
-7114	1	1
-70	1	1
-169	0	1
-43	1	1
-145	1	1
-39	0	3
-8	1	1
-753	0	1
-2255	1	1
-21	1	1
-1605	1	1
-19	2	1
-392	1	1
-29	1	0
-3673	1	0
-145	14	14
-39	0	1
-1246	0	1
-2302	1	0
-1554	9	9
-4537	0	1
-1064	2	0
-2051	1	0
-1130	0	2
-164	1	0
-1972	0	1
-18	3	3
-2597	1	1
-46	3	3
-196	1	1
-17	1	1
-60	4	4
-187	4	4
-46	1	1
-692	1	0
-3920	3	3
-15	1	1
-486	14	14
-1709	8	0
-169	1	0
-597	1	1
-18	0	7
-3423937	0	1
-1295496	1	1
-26	1	1
-760	150000	591802
-22468468	1	1
-27	1	1
-2592	0	2
-33	1	1
-2065	3	0
-1050	11	11
-1046	3	9
-52	11	11
-3200	1	0
-906	1	0
-1644	6	0
-1180	0	1
-475	0	5
-2556	26	22
-351	0	1
-1716	71000	36200
-976586	59000	26528
-7701	0	4
-9296	0	1
-1862	1	0
-3316	7	3
-1131	0	1
-1795	1	0
-569	1	0
-2895	44	44
-458	3	0
-5371	1	0
-6774	0	2
-2504	0	2
-1247	1	1
-45	1	1
-2415	17	17
-8215	1	1
-18	1	1
-272	10	10
-420	1	1
-34	1	1
-7961	4	0
-1973	1	1
-45	1	0
-529	1	0
-603	0	1
-18	1	1
-621	4	12
-67	2	0
-18	34	0
-516	0	1
-1400	38	41
-3786	0	1
-228	3	0
-1026	1	1
-49	1	1
-3336	0	3
-951	1	1
-77	2	1
-441	1	2
-1833	9	9
-301	5	5
-2787	17	17
-1747	1	0
-3040	2	9
-81	10	10
-86	2	0
-7354949	20000	1606
-1681	16	30
-13957	0	8
-1947	0	3
-1255	1	1
-38	0	1
-1788	12	17
-1045	6	0
-1327	0	1
-5775	1	1
-18	1	1
-1933	1	0
-1716	13	13
-255	1	0
-124	0	3
-792	0	5
-1521	1	1
-64	1	1
-9005617	150000	150000
-171176	3000000	3000000
-7074452	53320	65431
-1937	0	1
-2845	2	0
-1387	0	1
-114	1	0
-2382	0	4
-68	6	6
-60	4	0
-20	0	1
-93	0	51
-9781584	351994	0
-1909446	184275	0
-3919546	13	13
-435	23	23
-838	0	1
-807	6	6
-74	1	1
-43	1	1
-652	30000	29839
-13847966	0	1
-14069801	2	0
-8504	0	1
-32266	8	0
-12729	0	2
-35327	12	14
-1503	1	0
-1334	1	0
-759	0	1
-7479	34	34
-2523	7	1
-9912	18	17
-2523	1	0
-1321	0	1
-3684	18	18
-5282	2	0
-5505	20	20
-9694	6	6
-22003	9	0
-578	0	1
-5166	2	0
-92208	2	5
-8	1	0
-5	0	2
-113	4	0
-845	6	7
-2247	3	1
-3770	0	1
-5719	0	2
-2511	0	1
-1557	0	1
-5812	0	1
-3607	0	1
-7405	1	0
-11075	0	1
-2794	1	0
-2340	1	0
-429	0	1
-522	2	0
-2397	5	0
-371	11	0
-1376	1	0
-2416	8	0
-210	1	1
-20	1	1
-5104	1	1
-20	1	1
-525	2	0
-836	0	1
-2094	1	0
-2213	3	0
-327	9	6
-2593	1	1
-57	1	1
-1618	0	1
-1400	4	0
-254	0	2
-93	10	0
-754	0	6
-193	0	1
-2378	0	1
-1753	3	0
-1903	0	4
-29	1	1
-1136	14	14
-2452	4	0
-3622	31	3
-456	14	14
-1076	7	8
-68	1	1
-20	1	1
-145	1	1
-68	1	0
-12	0	1
-10	0	1
-11	1	0
-35	1	0
-5	0	1
-11	1	2
-32	6	7
-35	1	0
-8722	1	0
-888	0	4
-456	3	0
-45	0	1
-151	13	13
-756	0	1
-203	8	7
-140	1	1
-20	1	1
-308	5	0
-1020	0	1
-1258	0	1
-160	0	2
-1411	1	1
-22	1	1
-1180	12	12
-4521	0	2
-1155	27	0
-4954	3	0
-1392	1	1
-47	1	1
-3854	2	1
-130	1	0
-2633	2	0
-3053	12	13
-2308	0	1
-1747	0	45
-732	2	0
-1336	9	11
-3898	0	6
-437	1	0
-981	0	1
-1326	0	1
-382	4	0
-1081	10	0
-81	1	1
-142	0	2
-5452	29	29
-495	1	1
-26	1	1
-485	0	1
-525	0	4
-36	0	6
-3945	347	0
-1034	1	1
-27	1	1
-60	2	0
-2581	3	0
-3880	0	4
-1792	0	1
-20	1	1
-356	1	0
-4244	5	5
-36	1	1
-2232	2	2
-42	1	1
-4462	0	2
-1611	1	0
-1290	0	2
-110	1	0
-1466	0	1
-357	3	0
-850	12	0
-13547766	0	1
-3724943	2	0
-46473408	0	1
-1696	1	1
-28	1	1
-1629	0	4
-666	4	0
-13464	30000	12874
-8520008	2	0
-1107	1	1
-15	1	1
-1892	0	4
-6798	0	2
-1793	1	1
-25	0	3
-422	389	0
-786	2	0
-545	0	2
-54	1	0
-143	1	1
-39	1	1
-89	1	1
-29	1	0
-171	1	1
-46	1	0
-192	1	1
-33	1	1
-2580	0	1
-107	1	1
-29	1	1
-218	1	0
-175	6	5
-1407	1	1
-52	1	1
-8851	1	0
-14427	4	0
-1737	22	0
-5806	1	0
-1115	1	1
-29	0	2
-3395	0	1
-3164	0	2
-522	1	0
-24	1	1
-658	4	0
-5724	9	9
-1209	0	1
-5380	1	0
-97	1	0
-854	4	0
-78	5	11
-2728	6	7
-3754	17	13
-1363	1	0
-1025	1	0
-1811	0	1
-7507	0	4
-1184	3	0
-763	1	0
-797	3	0
-293	2	0
-2488	0	1
-335	0	1
-9959	1	0
-3255	1	0
-1322	0	1
-8118	2	0
-2908	49	49
-369	2	0
-632	1	0
-63	0	5
-3008	0	1
-9582	0	1
-14742673	0	3013
-39686
-
-chain 945825 chr4 191273063 + 69381892 69391896 chr4 191154276 + 69230000 69240000 2911
-2225	1	0
-4917	1	0
-2807	2	0
-51
-
-chain 941684 chr4 191273063 + 69471941 69481941 chr4 191154276 + 69320000 69330000 3076
-3521	0	1
-4784	1	0
-1694
-
-chain 941274 chr4 191273063 + 69614595 69624595 chr4 191154276 + 69580000 69590000 3093
-10000
-
-chain 940419 chr4 191273063 + 69564606 69574607 chr4 191154276 + 69530000 69540000 3129
-3216	5	5
-134	0	1
-5676	2	0
-968
-
-chain 939146 chr4 191273063 + 69534617 69544617 chr4 191154276 + 69500000 69510000 3182
-387	6	6
-9607
-
-chain 939091 chr4 191273063 + 69481941 69491934 chr4 191154276 + 69330000 69340000 3184
-8138	0	4
-1546	0	3
-309
-
-chain 938726 chr4 191273063 + 69461942 69471941 chr4 191154276 + 69310000 69320000 3193
-130	0	1
-9869
-
-chain 936769 chr4 191273063 + 69604595 69614595 chr4 191154276 + 69570000 69580000 3285
-2900	25	25
-7075
-
-chain 936653 chr4 191273063 + 69421914 69431904 chr4 191154276 + 69270000 69280000 3293
-6388	14	14
-338	29	29
-266	0	1
-2309	1	3
-55	1	0
-83	0	8
-506
-
-chain 936357 chr4 191273063 + 69391896 69401898 chr4 191154276 + 69240000 69250000 3304
-2367	1	0
-2329	0	1
-795	23	23
-2819	2	0
-1666
-
-chain 935200 chr4 191273063 + 69441943 69451948 chr4 191154276 + 69290000 69300000 3343
-1203	4	0
-488	57	57
-7133	2	1
-310	1	0
-551	0	1
-256
-
-chain 934799 chr4 191273063 + 69544617 69554606 chr4 191154276 + 69510000 69520000 3366
-1296	39	39
-1112	1	0
-204	1	0
-2340	0	12
-1710	0	1
-3286
-
-chain 933839 chr4 191273063 + 69584607 69594595 chr4 191154276 + 69550000 69560000 3402
-417	3	0
-966	1	0
-2053	0	1
-1784	5	8
-284	0	12
-4475
-
-chain 932655 chr4 191273063 + 69594595 69604545 chr4 191154276 + 69560000 69569950 3440
-8695	26	26
-1229
-
-chain 930772 chr4 191273063 + 69451948 69461942 chr4 191154276 + 69300000 69310000 3507
-1068	0	1
-1437	25	27
-806	0	4
-5337	50	50
-300	1	0
-970
-
-chain 928519 chr4 191273063 + 69411919 69421914 chr4 191154276 + 69260000 69270000 3571
-62	32	32
-801	11	11
-3595	38	38
-941	54	59
-4461
-
-chain 928371 chr4 191273063 + 69511937 69521941 chr4 191154276 + 69360000 69370000 3579
-6433	60	60
-335	10	6
-239	10	10
-2917
-
-chain 925594 chr4 191273063 + 69554606 69564602 chr4 191154276 + 69520000 69529997 3671
-2109	0	1
-4421	81	81
-1599	22	22
-1764
-
-chain 922960 chr4 191273063 + 69501928 69511937 chr4 191154276 + 69350000 69360000 3756
-714	8	8
-423	18	18
-882	33	33
-952	22	22
-607	1	0
-196	64	64
-495	3	0
-2055	2	0
-548	3	0
-2983
-
-chain 915200 chr4 191273063 + 69491934 69501928 chr4 191154276 + 69340000 69350000 3933
-1036	10	10
-2821	5	0
-53	40	40
-209	3	0
-3718	11	0
-421	0	23
-332	11	11
-292	0	2
-432	23	23
-159	20	20
-115	20	20
-263
-
-chain 911203 chr4 191273063 + 69431904 69441943 chr4 191154276 + 69280000 69290000 4026
-364	6	5
-212	4	0
-2445	40	15
-377	30	30
-1126	60	60
-262	8	6
-3222	145	138
-1738
-
-chain 903419 chr4 191273063 + 69401898 69411919 chr4 191154276 + 69250000 69260000 4208
-1051	52	52
-1007	0	1
-319	27	26
-154	98	97
-145	40	40
-512	23	0
-355	5	5
-126	19	19
-128	49	49
-67	0	1
-3337	0	2
-1729	5	5
-773
-
-chain 895926 chr4 191273063 + 69574644 69584607 chr4 191154276 + 69540037 69550000 4357
-3368	220	220
-1524	84	84
-1558	19	19
-889	41	41
-1592	43	43
-625
-
-chain 866339 chr4 191273063 + 69524748 69534617 chr4 191154276 + 69490119 69500000 4930
-190	50	50
-59	111	111
-51	7	7
-78	59	59
-58	121	121
-57	39	39
-70	0	1
-1558	108	108
-737	24	24
-3582	0	1
-84	0	10
-2826
-
-chain 659008 chr4 191273063 + 71711854 71718864 chr4 191154276 + 71492990 71500000 7936
-7010
-
-chain 608986 chr4 191273063 + 69375441 69381892 chr4 191154276 + 69223549 69230000 8701
-135	1	0
-2166	0	1
-4149
-
-chain 248590 chr4 191273063 + 69521941 69527313 chr4 191154276 + 69370000 69375377 111030
-2807	190	190
-50	59	59
-111	136	136
-59	58	58
-121	57	57
-39	1628	1633
-57
-
-chain 214386 chr4 191273063 + 71534589 71536854 chr4 191154276 + 71500000 71502265 534073
-2265
-
-chain 96900 chr4 191273063 + 3963456 3964475 chr4 191154276 + 3912520 3913539 1319679
-1019
-
-chain 52181 chr4 191273063 + 69624595 69625143 chr4 191154276 + 69590000 69590548 2441389
-548
-
-chain 20814 chr4 191273063 + 1495708 1495926 chr4 191154276 + 1526075 1526293 9826122
-218
-
-chain 8858 chr4 191273063 + 1496845 1496937 chr4 191154276 + 1526189 1526281 25171661
-92
-
-chain 8858 chr4 191273063 + 1496752 1496844 chr4 191154276 + 1526189 1526281 25171662
-92
-
-chain 8858 chr4 191273063 + 1496566 1496658 chr4 191154276 + 1526189 1526281 25171663
-92
-
-chain 7802 chr4 191273063 + 1492030 1492276 chr4 191154276 + 1522531 1522736 2805154
-25	83	42
-23	15	15
-4	55	55
-41
-
-chain 7606 chr4 191273063 + 69578098 69578232 chr12 133851895 + 88986938 88987072 9526361
-134
-
-chain 7510 chr4 191273063 + 1496208 1496286 chr4 191154276 + 1526203 1526281 25171660
-78
-
-chain 7439 chr4 191273063 + 1527942 1528019 chr4 191154276 + 1557568 1557645 18158883
-77
-
-chain 7376 chr4 191273063 + 1496452 1496529 chr4 191154276 + 1526075 1526152 27495831
-77
-
-chain 6986 chr4 191273063 + 59479326 59479400 chr7 159138663 + 119297971 119298045 28268313
-74
-
-chain 6131 chr4 191273063 + 1496080 1496144 chr4 191154276 + 1526075 1526139 27495827
-64
-
-chain 5599 chr4 191273063 + 1495650 1495708 chr4 191154276 + 1526203 1526261 27226300
-58
-
-chain 5460 chr4 191273063 + 1496658 1496715 chr4 191154276 + 1526095 1526152 27495830
-57
-
-chain 4356 chr4 191273063 + 1498960 1499009 chr4 191154276 + 1528103 1528152 18458745
-49
-
-chain 4121 chr4 191273063 + 69578012 69578069 chr3 198022430 - 95182224 95182281 17792812
-57
-
-chain 3000 chr4 191273063 + 1495929 1496022 chr4 191154276 + 1526110 1526203 11256589
-93
-
-chain 2961 chr4 191273063 + 69443663 69443695 chr4 191154276 - 68628109 68628141 14494983
-32
-
-chain 2485 chr4 191273063 + 1503833 1503862 chr4 191154276 + 1532970 1532999 23156792
-29
-
-chain 2401 chr4 191273063 + 1492301 1492331 chr4 191154276 + 1522679 1522709 5335388
-30
-
-chain 2012 chr4 191273063 + 1496731 1496752 chr4 191154276 + 1526075 1526096 27495829
-21
-
-chain 1744 chr4 191273063 + 1597414 1597448 chr4 191154276 + 1627062 1627096 3575887
-34
-
-chain 1461 chr4 191273063 + 69579763 69579840 chr5 180915260 + 121968423 121968500 3935628
-77
-
-chain 1332 chr4 191273063 + 69545913 69545943 chr11 135006516 - 130984886 130984916 21069914
-30
-
-chain 909 chr4 191273063 + 69582306 69582346 chr3 198022430 - 10790236 10790276 7796945
-40
-
-chain 18169122 chr4_random 842648 + 440032 631501 chr4_gl000194_random 191469 + 0 191469 150
-191469
-
-chain 18001815 chr4_random 842648 + 0 189789 chr4_gl000193_random 189789 + 0 189789 151
-189789
-
-chain 15268007 chr4_random 842648 + 681501 842648 chrUn_gl000218 161147 + 0 161147 194
-161147
-
-chain 9245037 chr4_random 842648 + 239789 336038 chr4 191154276 + 8829368 8925617 353
-96249
-
-chain 137712 chr4_random 842648 + 388580 390032 chr4 191154276 + 9620000 9621452 935614
-1452
-
-chain 10386 chr4_random 842648 + 388312 388420 chr11 135006516 - 91778086 91778194 21974850
-108
-
-chain 3377 chr4_random 842648 + 388277 388312 chr11 135006516 - 84847900 84847935 23649965
-35
-
-chain 2456 chr4_random 842648 + 388184 388235 chrX 155270560 - 93144339 93144390 24160146
-51
-
-chain 16791974256 chr5 180857866 + 63000 180837866 chr5 180915260 + 10000 180905260 5
-17520657	24032	50000
-1688	3435	1
-37	1399	0
-27	2	1
-8	1	1
-3983	3434	0
-103	1	1
-32	1	1
-67	1	1
-35	1	1
-752	1669	0
-43	1	1
-1207	0	1
-46	0	1
-5	0	1
-19	1	1
-70	3434	0
-962	16	16
-1905	44	44
-85	41	41
-332	49	49
-1675	23	23
-1185	11	11
-124	35	35
-713	105	105
-408	4	4
-113	16	16
-1835	1	2
-26	7	8
-18	2730	25
-3103	1	0
-7858	718	10488
-307	1	636
-7461	0	1
-23772	51	0
-4031	0	1
-20571	0	1
-9135	0	2
-6885	2	3
-110	3	0
-816	2	3
-2295	0	34
-3936	28	28
-3536	0	2
-2917	0	1
-652	1	1
-37	1	1
-657	1	1
-22	1	1
-419	3	4
-3580	1	1
-29	1	1
-274	11	35
-835	3036	0
-1907	1	0
-10504	30	28
-784	0	6
-127	10	0
-668	1	1
-28	1	1
-2467	4	0
-179	0	2
-1650	1	1
-39	1	1
-2433	1	0
-720	1	1
-40	1	1
-772	1	1
-32	1	1
-353	1	1
-17	1	1
-1776	0	1
-6082	3	0
-2669	12	10
-2857	1	1
-35	1	1
-722	60	60
-200	1	1
-240	1	1
-4048	1	1
-49	1	1
-702	1	1
-33	1	1
-2927	1	2
-1487	17	0
-276	16	16
-1039	1	1
-35	1	1
-2068	1	1
-40	1	1
-828	1	1
-36	2	0
-317	8	0
-893	1	1
-33	1	0
-8143	0	4
-28632199	3000000	3000000
-12470071	0	1
-29760415	40000	50000
-5878002	23000	20845
-4521	1	0
-676	6	6
-5928	0	1
-372	1	1
-47	1	1
-6801	3	2
-639	0	1
-871	3	4
-11530	0	4
-22966	0	1
-15447	0	1
-53856	0	2
-15988	0	2
-906887	10	11
-40152817	5000	52715
-3521239	0	1
-1604	10	0
-12778810	4100	51715
-15152692	27	0
-1852096	1	0
-8710030
-
-chain 924655 chr5 180857866 + 17585088 17611949 chr5 180915260 - 163333152 163394435 1227
-14	409	52001
-494	3435	1
-24	1	1
-1487	10	10
-682	13	13
-132	3449	15
-306	1	1
-74	1	1
-967	3434	0
-1285	3434	0
-68	4569	1135
-2087	50	50
-435
-
-chain 315813 chr5 180857866 + 17584685 17618655 chr5 180915260 + 17581691 17599590 1580
-403	14	14
-237	1475	75
-628	25	25
-51	89	89
-304	24	24
-70	33	33
-37	698	698
-667	3506	72
-1354	96	96
-75	4	4
-752	1710	41
-450	382	382
-51	14129	7264
-237	12	12
-614	37	37
-134	16	16
-422	31	31
-796	4345	1642
-62
-
-chain 312488 chr5 180857866 + 17597387 17639380 chr5 180915260 + 17580657 17599710 1454
-373	70	70
-1245	2263	863
-1184	3434	0
-1733	3775	2106
-50	9111	2246
-1078	993	993
-1363	8015	1147
-44	85	85
-41	332	332
-49	6299	3596
-341	45	44
-70
-
-chain 265075 chr5 180857866 + 17745718 17748537 chr5 180915260 + 17713035 17715853 333767
-1906	1	0
-912
-
-chain 207388 chr5 180857866 + 17584033 17596937 chr5 180915260 + 17583073 17597745 2201
-51	557	557
-14	17	17
-13	654	654
-172	494	494
-219	23	23
-567	4975	6743
-176	6	6
-865	14	14
-96	1354	1354
-26	2261	2261
-350
-
-chain 193008 chr5 180857866 + 17583668 17629078 chr5 180915260 + 17580674 17599710 1465
-356	84	84
-533	3434	0
-698	5562	728
-51	4689	1255
-946	4787	1353
-543	8	8
-167	12743	7643
-324	5466	2032
-306	3553	850
-1045	45	44
-70
-
-chain 130263 chr5 180857866 + 17639380 17641654 chr5 180915260 + 17592112 17594386 19200
-936	23	23
-116	16	16
-1183
-
-chain 123401 chr5 180857866 + 17602522 17620625 chr5 180915260 + 17589594 17593961 2306
-159	16	16
-1763	19	19
-54	14448	712
-1644
-
-chain 53192 chr5 180857866 + 17626966 17629142 chr5 180915260 + 17590000 17592176 2614
-952	1045	1045
-45	70	70
-64
-
-chain 42492 chr5 180857866 + 17625757 17626966 chr5 180915260 - 163394507 163395716 9006
-1209
-
-chain 23743 chr5 180857866 + 17605548 17605956 chr5 180915260 + 17596054 17596462 38000
-290	9	9
-109
-
-chain 20601 chr5 180857866 + 17748538 17748754 chr5 180915260 + 17712817 17713033 9842237
-216
-
-chain 11635 chr5 180857866 + 17618762 17618981 chr5 180915260 + 17595532 17595751 149283
-219
-
-chain 9108 chr5 180857866 + 17618655 17618762 chr5 180915260 + 17583355 17583462 1340460
-107
-
-chain 7916 chr5 180857866 + 17587442 17604673 chr5 180915260 - 163387098 163397461 2244
-25	61	61
-79	398	398
-33	16608	9740
-27
-
-chain 7204 chr5 180857866 + 17604533 17604646 chr5 180915260 + 17599204 17599317 3499
-113
-
-chain 4292 chr5 180857866 + 17639265 17639310 chr5 180915260 + 17595431 17595476 67944
-45
-
-chain 2558 chr5 180857866 + 17604673 17604706 chr5 180915260 + 17591745 17591778 3790746
-33
-
-chain 2511 chr5 180857866 + 170275712 170275739 chr5 180915260 + 170343161 170343188 11152528
-27
-
-chain 2447 chr5 180857866 + 17635643 17636496 chr5 180915260 - 163394091 163394944 8841
-35	713	713
-105
-
-chain 2252 chr5 180857866 + 17601306 17601338 chr5 180915260 + 17595246 17595278 11344
-32
-
-chain 2027 chr5 180857866 + 17785693 17785748 chr18 78077248 - 45596607 45596662 524022
-55
-
-chain 1518 chr5 180857866 + 17629142 17629191 chr5 180915260 - 163394458 163394507 205933
-49
-
-chain 1109 chr5 180857866 + 17613421 17613452 chr5 180915260 - 163395907 163395938 8647
-31
-
-chain 143977943 chr5_h2_hap1 1794870 + 0 1794870 chr5 180915260 + 68505249 71134051 52
-5440	1	0
-1785	0	1
-12373	0	2
-7216	0	1
-714	2	0
-4360	0	1
-11179	1	0
-2027	1	0
-6969	0	2
-3779	1	0
-634	4	3
-1384	0	9
-378	0	2
-1153	3	0
-1246	0	6
-1427	0	2
-608	1	1
-23	1	1
-1981	44	44
-3998	1	1
-33	5	0
-148	1	1
-18	1	0
-331	2	0
-162	1	0
-333	0	1
-644	1	0
-2053	1	0
-1896	0	1
-2096	1	1
-32	1	1
-265	0	14
-1061	0	1
-7303	6	6
-1313	1	0
-3225	0	2
-65	1	1
-220	1	1
-1422	0	1
-248	1	1
-21	2	0
-641	0	1
-163	3	0
-522	1	0
-1685	0	1
-299	1	1
-16	1	0
-3259	1	0
-6492	9	9
-700	0	2
-379	1	0
-186	0	16
-21	0	27
-242	21	19
-156	0	3
-2040	1	0
-7852	0	2
-1267	0	4
-8016	0	1
-2057	85	0
-449	0	1
-2797	0	1
-3858	0	1
-2129	1	0
-234	1	1
-28	1	1
-2923	0	3
-4346	1	0
-2467	1	0
-11093	1	0
-3932	0	3
-2223	1	1
-22	0	1
-25	0	6
-1909	2	0
-1136	1	0
-658	2	0
-32	8	0
-9	2	0
-14	15	11
-22	14	0
-20	51	1
-34	2	0
-43	0	2
-38	127	19
-15	14	0
-41	0	5
-9200	1	0
-2655	1	0
-38	1	1
-237	1	1
-28	1	1
-1065	1	0
-2979	3	0
-13	1	1
-653	4	0
-1950	1	0
-2320	2	0
-817	3	0
-524	8	0
-417	1	0
-873	1	0
-352	1	0
-152	2	0
-651	1	0
-285	1	0
-1830	0	1
-1271	0	1
-957	0	1
-1506	2	0
-2454	4	0
-6	4	0
-300	1	1
-68	1	1
-1648	0	1
-10725	10	10
-1308	2	1
-48	1	1
-1242	15	0
-1869	1	0
-26	0	452
-1178	0	3
-43	0	4
-3567	0	1
-2289	0	1
-695	0	6
-721	13	14
-192	0	2
-1190	1	1
-36	1	1
-451	0	1
-4137	1	0
-809	23	0
-1624	0	4
-453	4	0
-983	0	1
-188	0	5
-489	0	1
-299	11	11
-1923	1	0
-168	0	1
-891	1	1
-54	0	1
-908	0	28
-1224	2	0
-175	0	1
-459	2	0
-119	133	153
-50	13	13
-4001	0	1
-4764	3	0
-90	1	1
-117	92	0
-325	0	27
-19	1	1
-92	1	67
-21	1	28
-15	1	28
-9013	0	1
-1376	0	1
-674	10	0
-87	0	1
-1317	43	35
-260	1	0
-1518	11	12
-232	0	1
-1093	0	1
-737	0	2
-176	10	10
-664	1	1
-33	1	1
-2816	3	0
-4679	0	2
-3212	0	2
-2383	14	16
-3049	0	1
-146	1	0
-721	1	1
-35	1	1
-2260	2	0
-1228	0	1
-682	1	0
-8927	1	0
-795	2	0
-5278	0	2
-5578	13	0
-3665	20	0
-1852	9	0
-4564	1	1
-20	4	0
-111	1	1
-1065	37	37
-2979	1	0
-820	0	1
-9147	0	1
-411	0	1
-745	2	0
-144	3	3
-27	2	0
-734	1	1
-38	1	1
-105	0	4
-554	1	0
-35	1	1
-226	2	0
-254	1	1
-39	1	1
-3302	0	2
-16	1	1
-1276	1	1
-57	1	1
-122	5	0
-178	0	1
-29	1	1
-89	1	1
-32	1	1
-1743	1	0
-294	1	1
-27	1	1
-1925	1	1
-48	1	1
-116	1	1
-20	1	1
-163	4	4
-821	4	3
-46	1	1
-247	1	1
-27	2	2
-613	1	1
-44	1	1
-181	9	7
-1220	1	1
-53	0	3
-596	1	0
-1052	12	12
-130	1	0
-1524	0	1
-1878	1	4
-76	0	1
-6	0	5
-895	0	1
-290	9	5
-783	1	1
-45	1	1
-1910	1	1
-48	1	1
-409	1	1
-30	1	1
-158	2	0
-69	6	0
-428	1	1
-136	1	1
-418	44	44
-767	35	27
-711	1	1
-28	1	1
-1137	1	0
-585	1	0
-433	13	0
-3034	1	0
-961	0	3
-950	1	1
-15	1	1
-948	0	5
-153	21	20
-181	38	38
-765	8	10
-207	13	15
-3092	4	0
-202	5	5
-1406	0	5
-205	1	1
-44	1	1
-2719	1	1
-36	1	1
-1050	0	9
-108	0	2
-1177	4	0
-115	1	1
-2051	15	0
-520	8	8
-1072	0	1
-595	2	0
-4576	73	73
-6176	1	0
-1299	1	1
-29	1	0
-496	0	4
-379	2024	0
-7	3663	0
-82	4	0
-79	6	1
-556	11	0
-598	9	9
-138	77	73
-1651	3	9
-3302	0	8
-429	1	0
-163	0	3
-60	3	0
-132	1	1
-23	1	0
-1660	1	16
-2124	0	1
-1601	9	0
-35	525	6
-38	1	1
-235	1	30
-497	1	1
-37	1	0
-79	0	1
-1239	1	1
-31	1	1
-135	1	0
-5	2	0
-669	0	1
-1158	1595	0
-21	3	0
-5	126998	500121
-730	31	27
-278	0	2
-352	0	12
-363	13	21
-366	1	0
-378	3	0
-61	1	0
-105	17	68
-1480	32	32
-640	1	1
-52	1	1
-482	1	0
-638	1	1
-20	1	0
-21	1	1
-326	1	1
-37	1	1
-995	0	7
-1685	0	1
-1607	9	8
-633	1	1
-37	1	1
-697	6	6
-1363	8	8
-234	1	1
-44	1	1
-3022	5	6
-96	12	11
-674	4	0
-768	0	1
-169	3	0
-2083	0	1
-1098	20	20
-5586	1	0
-174	28	13
-366	2	0
-202	1	1
-69	1	1
-682	5	5
-3457	1	0
-232	1	0
-305	10	0
-1770	40	40
-349	38	38
-401	0	1
-441	7	3
-547	11	10
-210	4	0
-779	4	0
-193	4	0
-576	0	4
-514	48	48
-789	23	16
-2496	25	25
-874	25	11
-2776	19	19
-2824	4	0
-440	0	2
-876	14	14
-1198	39	39
-521	6	0
-126	40	40
-315	29	29
-616	94	99
-285	35	35
-175	12	12
-320	17	1
-3339	0	1
-260	49	49
-109	11	11
-586	0	1
-133	19	13
-8202	0	1
-307	0	1
-1366	1	0
-1073	9	12
-1385	0	1
-321	106	108
-1101	28	28
-483	42	42
-1752	58	58
-166	37	36
-748	16	16
-52	1	0
-1679	0	2
-455	9	17
-484	1	10
-74	33	33
-155	0	1
-62	0	8
-424	23	23
-491	8	9
-450	0	2
-63	1	0
-410	5	0
-1131	165	170
-254	39	39
-1162	0	272664
-1919	1	1
-82	1	1
-740	4	4
-261	1	1
-83	1	1
-52	1	1
-49	1	1
-231	6	6
-244	1	1
-21	1	1
-52	44	44
-114	20	20
-87	32	32
-149	0	6
-202	50	50
-115	44	44
-114	65	65
-50	111	111
-61	52	52
-101	42	45
-250	15	15
-208	1	0
-2259	3	0
-239	64	66
-168	10	10
-2393	1	1
-38	1	1
-674	1	1
-29	1	1
-469	22	25
-827	1	0
-1679	0	1
-463	9	13
-232	1	0
-248	1	5
-325	0	7
-1389	0	4
-63	1	0
-410	6	0
-685	3	0
-35	1	1
-407	166	168
-253	39	39
-71	0	4
-1288	35	35
-1697	32	32
-243	22	22
-395	51	51
-259	49	49
-108	6	6
-54	168	168
-464	45	45
-81	20	20
-84	21	21
-240	25	25
-584	0	810
-126	4	4
-42	6	6
-101	0	3
-41	1	1
-473	1	0
-373	1	1
-41	1	1
-614	1	1
-41	1	18042
-857	50	50
-279	2	0
-246	67	69
-160	10	10
-199	0	1
-154	1	0
-276	28	28
-124	29	28
-105	7	7
-355	1	1
-45	1	1
-299	1	1
-25	1	1
-283	30	35
-594	2	0
-1401	1	1
-46	1	1
-123	4	0
-830	1	0
-100	1	1
-61	1	1
-737	2	7
-285	1	1
-58	1	1
-143	18	0
-19	1	1
-575	1	1
-91	1	1
-318	2	0
-4090	4	0
-702	0	1
-2007	0	2
-901	0	1
-79	9	9
-31	3	3
-1203	1	0
-16	1	1
-574	1	1
-28	1	1
-346	6	0
-25	1	3
-22	2	0
-34	4	0
-7	1	0
-20	18	22
-511	0	5
-5088	0	1
-1065	0	4
-51	2	0
-2714	25	25
-81	8	8
-56	788	18
-22	1	1
-4702	0	1
-536	6	6
-3900	1	0
-1063	0	8
-4095	1	0
-1841	1	3
-1015	0	1
-2808	1	1
-17	1	1
-340	1	1
-39	1	1
-1548	1	1
-73	1	1
-291	1	0
-236	72	43
-104	0	1
-1843	4	0
-80	15	15
-1140	29	1
-45	1	1
-1245	3	0
-194	1	0
-816	11	1
-25	1	11
-47	1	1
-508	0	1
-255	1	1
-24	1	0
-319	13	13
-1846	397	398
-803	0	37
-509	0	12
-130	0	4
-609	0	3
-6495	1251	1253
-1091	11	11
-384	2	0
-1657	31	30
-109	31	31
-2815	63	63
-85	0	13
-589	48	48
-194	25	25
-1068	16	16
-209	2	0
-215	47	47
-1775	127	77
-533	188	0
-1164	1	0
-1863	1	1
-29	1	1
-1993	1	1
-19	1	1
-782	2	0
-3224	2	0
-22	1	11
-473	332	0
-604	1	1
-28	1	1
-223	1	1
-28	1	1
-2870	0	1
-38	1	1
-313	1	0
-768	0	1
-1039	9	9
-886	0	4
-243	0	1
-172	17	17
-2721	1	1
-71	0	1
-607	105	117
-54	46	44
-2057	1	1
-32	1	1
-452	1	1
-49	1	1
-169	322	6
-26	1	0
-567	3	0
-2324	1	0
-825	4	0
-1251	4	4
-2651	0	4
-703	14	19
-10731	13	0
-741	2	0
-1659	0	12
-7683	0	6
-838	1	0
-2905	12	326
-1714	1	0
-1172	90	100
-619	2	0
-263	0	59
-730	1	0
-56	4	0
-1746	17	17
-377	1	1
-27	4	0
-836	1	1
-67	1	1
-1022	0	1
-1096	1	1
-40	0	1
-8	1	1
-1864	1	0
-56	5	1
-6	0	10
-114	1	1
-34	1	1
-631	19	19
-139	13	13
-1330	1	11
-22	2	0
-2846	1	0
-358	0	2
-798	11	11
-3004	1	1
-30	1	1
-2032	1	16
-752	16	0
-40	0	6
-3211	0	1
-965	0	14
-2978	1	1
-29	1	1
-138	0	2
-1646	2	0
-375	1	1
-31	1	1
-6235	0	2
-2598	0	3
-592	0	4
-135	0	12
-3892	1	0
-840	0	12
-5528	9	5
-5400	0	1
-181	0	1
-836	0	3
-3087	1	1
-46	1	1
-2796	11	9
-6282	1	1
-25	1	1
-2009	1	1
-56	0	2
-209	15	15
-2433	1	1
-50	1	1
-366	1	0
-3233	0	1
-5144	0	2
-811	53	22
-23	1	0
-6	1	3
-43	0	2
-13	2	0
-5	0	14
-634	8	8
-1663	10	12
-433	1	1
-43	1	1
-397	2	0
-638	1	1
-42	1	1
-285	1	1
-28	1	1
-516	1288	2
-424	4	0
-660	1	1
-49	1	1
-816	0	12
-1015	1	1
-47	1	1
-988	0	3
-1000	14	32
-330	1	1
-38	1	1
-124	7	2
-43	1	1
-693	1	1
-61	1	1
-94	0	1
-963	1	1
-46	1	1
-1393	0	2
-139	2	0
-113	1	1
-20	1	1
-323	6	0
-34	0	1
-978	1	1
-38	1	1
-105	1	1
-18	1	2
-43	1	1
-381	0	1
-811	15	8
-2537	0	2436
-2642	1	1
-42	4	0
-92	10	10
-1363	1	1
-37	1	1
-252	5	0
-165	1	1
-329	1	1
-77	1	1
-705	0	6
-258	6	6
-155	0	1
-57	2	0
-1380	5	0
-348	2	0
-489	9	5
-448	1	0
-1681	0	1
-835	29	25
-1359	36	36
-223	0	1
-399	15	15
-466	4	4
-75	10559	200741
-1150	1	0
-682	12	15
-802	53	53
-535	1	0
-65	62	63
-497	30	1
-1458	1	0
-683	0	1
-1449	1	0
-977	15	0
-1636	0	4
-216	3	0
-587	0	10
-4302	1	1
-28	1	1
-733	0	4
-138	9	9
-595	0	11
-249	1	1
-65	1	1
-242	1	6
-74	0	4
-87	6	5694
-363	4	0
-513	0	1
-29	1	1
-1297	0	1
-415	1	3
-1947	0	2
-978	0	1
-3121	1	1
-17	1	1
-872	1	1
-31	1	1
-602	8	8
-238	1	1
-36	1	1
-930	1	1
-36	1	1
-1073	22	0
-494	0	1
-66	1	5
-60	1	1
-15	1	1
-452	1	0
-1587	0	7
-1465	1	1
-27	1	1
-76	1	1
-44	1	1
-143	16	14
-323	23	23
-685	1	1
-15	1	1
-136	6	0
-400	0	2
-109	3	0
-50	1	1
-18	1	1
-985	1	1
-38	1	1
-1034	12	12
-247	1	1
-91	2	1
-1383	1	1
-44	1	1
-164	15	16
-292	1	1
-47	1	1
-73	1	1
-43	1	1
-203	1	0
-420	1	1
-37	1	1
-449	0	2
-25	0	4
-415	4	6
-155	1	1
-26	1	1
-199	1	1
-41	0	32
-20	1	1
-68	1	1
-28	1	1
-2097	13	15
-207	8	10
-984	21	20
-134	5	0
-967	10	10
-956	3	0
-4424	5	6
-595	0	1
-1140	1	1
-28	1	1
-733	7	16
-1218	149	149
-429	0	4
-59	0	2
-2568	1	1
-45	1	1
-784	5	8
-289	1	0
-877	5	0
-34	1	0
-68	4	1
-735	1	1
-35	1	1
-1094	4	4
-1519	5	6
-138	12	12
-1044	0	1
-91	80	80
-369	1	1
-53	2	0
-63	1	1
-1220	7	9
-181	1	1
-44	1	1
-134	0	3
-476	2	2
-27	1	1
-205	1	1
-88	2	2
-822	4	4
-163	22	22
-116	1	1
-48	1	1
-3849	1	1
-21	1	1
-120	1	1
-32	1	1
-89	1	1
-29	1	0
-178	3	6
-1452	19	17
-5455	1	0
-10333	1	0
-784	0	1
-55	8	0
-468	0	1
-539	12	0
-98	1	1
-24	1	1
-77	1	1
-81	1	1
-4604	17	19
-7803	7	7
-807	0	1
-2260	7	5
-980	0	1
-2105	0	1
-4083	0	1
-836	0	2
-5612	1	0
-519	0	1
-1334	0	1
-2401	0	9
-1823	1	0
-159	0	2
-484	2	0
-14815	1	1
-36	1	1
-2512	4	0
-58	3	0
-3277	1	0
-559	0	1
-4024	1	0
-4383	22	13
-4131	1	1
-35	1	1
-290	1	1
-29	3	0
-533	1	0
-305	0	1
-2608	0	1
-443	3	1
-2322	0	20
-514	1	1
-46	1	1
-791	19	30
-3206	3	0
-6272	0	2
-1789	8	0
-291	39	39
-521	6	0
-126	40	40
-315	29	29
-616	94	99
-206	114	109
-506	0	14
-2370	0	2
-4709	1	1
-36	1	1
-5588	0	11
-299	1	0
-1366	1	0
-1644	1	1
-28	1	0
-4859	16	21
-1992	0	10
-505	0	1
-448	8	12
-721	40973	60417
-3484	1	1
-40	1	1
-2152	0	2
-5298	39	40
-141	25	25
-427	0	11
-1543	1	0
-3707	0	1
-1056	292	8656
-1768	2	0
-717	1	0
-14041	0	1
-4167	0	2
-7403	5	0
-7673	0	1
-3630	67	67
-74	129	129
-226	1	0
-1720	138	136
-1185	1	0
-878	46874	0
-862	1	1
-31	1	1
-9409	1	1
-37	1	1
-2231	0	2
-1682	0	1
-13767	0	1
-9473	0	1
-7168	2	0
-12384	1	0
-1188	0	4
-2044	1	0
-3076	1	0
-796	0	1
-5477	0	2
-5780	1	0
-6338	1	0
-2680	0	4
-2033	0	1
-9452	0	12
-402983
-
-chain 13752336 chr5_h2_hap1 1794870 + 324513 1282806 chr5 180915260 - 110525721 111977366 61
-37	39926	39909
-44	767	767
-34	9178	9179
-38	20004	20004
-27	1	1
-44	8383	8384
-1071	3	3
-511	0	1
-439	7	7
-3663	1483	1482
-77	11199	11214
-525	4132	4132
-704	1	0
-729	3	0
-158	29	29
-653	0	3
-154	0	2
-7041	8	0
-2068	0	7
-166	1	0
-812	6	7
-25	1	1
-1423	0	8
-438	0	1
-4783	0	1
-31	1	1
-1269	1	0
-926	3	0
-2542	2	0
-112	1	1
-2183	1	1
-59	1	1
-1605	2	2
-4515	0	1
-4368	1	0
-382	0	34
-60	1	1
-86	0	1
-552	6	6
-892	1	1
-33	1	1
-6705	0	1
-934	0	2
-8985	2	1
-445	6	0
-6283	0	1
-456	0	1
-1101	0	5
-696	0	1
-2973	6	0
-158	0	3
-449	0	3
-657	12	12
-151	0	1
-406	1	1
-55	1	1
-163	1	1
-72	1	1
-1955	1	0
-713	0	1
-3050	1	1
-35	1	1
-3127	1	0
-233	1	0
-1343	17	7
-1250	3	0
-322	1	0
-2081	0	1
-2413	5	0
-818	0	1
-18	1	1
-268	0	1
-271	1	1
-35	1	0
-586	2	0
-1192	0	1
-494	2	0
-4657	1	1
-30	5	0
-2172	0	334
-1981	5	0
-33	321	0
-2633	2	0
-142	1	0
-1597	7	0
-248	1	0
-317	1	1
-21	1	1
-441	0	1
-600	6	4
-35	1	1
-1593	2	6
-9303	1	0
-2781	0	2
-6052	0	4
-771	1	0
-1500	14	0
-1544	730	730
-31	3419	3419
-30	30394	30395
-40	349	349
-38	3691	3690
-48	3308	3306
-25	874	880
-25	8151	8151
-39	653	653
-40	315	315
-29	616	616
-94	285	285
-35	4123	4120
-49	13570	13573
-58	30899	10440
-165	1652	1655
-35	1697	1697
-32	660	660
-51	259	259
-49	168	168
-168	464	464
-45	446	446
-25	3886	3879
-67	800	800
-28	124	124
-29	1123	1123
-30	24987	23723
-2	1	1
-21	146	146
-2	1	1
-785	22543	22552
-67	3192	3170
-28	5357	5348
-397	8546	8565
-1251	3145	3145
-31	110	110
-29	2816	2816
-63	674	688
-48	195	195
-23	1511	1509
-47	1810	1786
-37	14	0
-41	533	533
-182	1	16
-5	20555	20281
-49	1	21
-55	54	52
-46	2763	2762
-37	5	2
-280	124045	123118
-495	0	1
-703	3	0
-87	27183	48462
-36	1182	1182
-389	16	16
-257	1	0
-118	3	3
-547	1	1
-25	1	1
-126	0	2
-3598	810	0
-148	0	6
-483	1	1
-34	1	1
-266	6	6
-350	2	2
-30	1	1
-297	4	4
-666	1	1
-89	1	1
-52	15	15
-2220	2647	2651
-53	53651	53634
-149	9850	9843
-39	1	1
-39	116984	481498
-39	653	653
-40	315	315
-29	616	616
-94	206	206
-114	65101	68610
-358	27	27
-588	11156	11155
-25	56460	137674
-105	1	0
-2251	13	13
-319	25	26
-826	25	25
-370	7	7
-439	0	1
-192	7	1
-250	0	13
-1302	1	8
-866	91	94
-91	14	14
-501	1	0
-1238	1	0
-113	475	60006
-212	8	10
-907	0	4
-350	1	0
-486	9	17
-448	0	2
-515	0	10
-788	13213	230
-199	16	16
-645	0	2
-112	37	25
-634
-
-chain 283844 chr5_h2_hap1 1794870 + 1261701 1280951 chr5 180915260 + 69698102 69815360 1487
-91	6326	96869
-318	0	10
-505	0	1
-204	64	64
-440	1	0
-235	0	1
-1269	0	1
-945	1	0
-670	242	551
-75	3	0
-1233	50	50
-199	4900	12045
-409	59	59
-310	37	40
-664
-
-chain 206667 chr5_h2_hap1 1794870 + 1287039 1295912 chr17 81195210 + 76583705 76597262 568754
-558	4	0
-365	2	2
-40	0	1
-253	1	1
-31	1	1
-522	6316	11003
-780
-
-chain 184822 chr5_h2_hap1 1794870 + 1284679 1286632 chr17 81195210 - 4506444 4508397 671275
-1953
-
-chain 128717 chr5_h2_hap1 1794870 + 1283006 1284382 chr5 180915260 + 70517839 70519212 1000883
-791	20	17
-565
-
-chain 128621 chr5_h2_hap1 1794870 + 1291852 1293214 chr17 81195210 + 76573863 76575225 1001637
-1362
-
-chain 122147 chr5_h2_hap1 1794870 + 627399 939358 chr5 180915260 - 110828619 111993762 93
-42	1752	1753
-58	6978	6974
-165	255	254
-37	4915	4915
-44	4384	4378
-64	19819	875253
-39	1	1
-9	264030	261784
-58	0	6
-56	6	6
-105	3	3
-98	1	1
-483	7968	7968
-62	497	497
-30
-
-chain 118081 chr5_h2_hap1 1794870 + 1290357 1291631 chr4 191154276 - 20442500 20443774 1089300
-230	18	18
-1026
-
-chain 112391 chr5_h2_hap1 1794870 + 1288972 1290160 chr17 81195210 - 4580707 4581894 1143267
-1134	1	0
-53
-
-chain 92982 chr5_h2_hap1 1794870 + 1293593 1294614 chr4 191154276 + 170627590 170628611 1373141
-72	1	1
-129	1	1
-818
-
-chain 75482 chr5_h2_hap1 1794870 + 1274745 1276419 chr5 180915260 - 111410923 111412615 820
-271	0	10
-350	0	6
-499	9	9
-444	0	2
-101
-
-chain 68300 chr5_h2_hap1 1794870 + 1276804 1279228 chr5 180915260 - 110416917 110419341 216
-2424
-
-chain 29652 chr5_h2_hap1 1794870 + 524804 525112 chr3 198022430 + 8519605 8519913 4781887
-308
-
-chain 29428 chr5_h2_hap1 1794870 + 756919 757240 chr2 243199373 + 16251117 16251431 4913030
-177	7	0
-137
-
-chain 27649 chr5_h2_hap1 1794870 + 641866 1186473 chr5 180915260 + 68929706 69564604 89
-32	351	351
-50	115	115
-44	114	114
-65	50	50
-111	61	61
-52	101	101
-42	14056	14883
-33	529303	618767
-27
-
-chain 20581 chr5_h2_hap1 1794870 + 1249367 1254462 chr5 180915260 - 111122604 111127700 1762
-2153	24	24
-85	8	8
-1086	0	1
-1739
-
-chain 5516 chr5_h2_hap1 1794870 + 253548 253608 chr5 180915260 + 68759177 68759237 7759123
-60
-
-chain 5218 chr5_h2_hap1 1794870 + 1244675 1244945 chr5 180915260 - 159621198 159621468 493
-30	1	1
-36	122	122
-81
-
-chain 4702 chr5_h2_hap1 1794870 + 1279881 1280287 chr5 180915260 + 70518261 70518663 9283
-59	311	307
-36
-
-chain 4436 chr5_h2_hap1 1794870 + 1274323 1274373 chr5 180915260 + 70526833 70526883 9273
-50
-
-chain 4277 chr5_h2_hap1 1794870 + 625682 625728 chr5 180915260 - 111701952 111701998 814
-46
-
-chain 3978 chr5_h2_hap1 1794870 + 1276419 1276466 chr5 180915260 + 70082181 70082228 137301
-47
-
-chain 3805 chr5_h2_hap1 1794870 + 1244816 1244863 chr5 180915260 + 69926901 69926948 475
-47
-
-chain 2924 chr5_h2_hap1 1794870 + 253608 253640 chr5 180915260 + 68759034 68759066 4803455
-32
-
-chain 943 chr5_h2_hap1 1794870 + 1282135 1282172 chr5 180915260 - 111121871 111121900 54522
-21	8	0
-8
-
-chain 692 chr5_h2_hap1 1794870 + 1276691 1276804 chr5 180915260 + 21496928 21497041 821
-113
-
-chain 13519395 chr5_random 143687 + 0 143687 chr5 180915260 + 180261930 180405660 222
-5859	0	4
-460	1	1
-23	0	2
-42	1	3
-42	1	1
-1633	55	55
-2271	0	10
-1279	2	0
-761	2	0
-25	1	1
-150	13	13
-4989	0	1
-1174	1	1
-23	1	1
-495	16	16
-2709	1	4
-349	0	4
-466	0	1
-292	2	0
-184	0	5
-621	13	13
-1788	2	0
-21	1	1
-731	12	12
-149	0	3
-5100	1	0
-1059	0	3
-1724	2	0
-4111	1	0
-890	4	4
-47	1	1
-1137	0	1
-147	17	19
-72	1	1
-22	1	1
-365	1	1
-19	2	2
-1360	0	1
-1476	1	1
-43	1	1
-1141	1	0
-2615	18	18
-4308	0	4
-135	0	2
-1484	8	6
-7384	0	11
-284	1	1
-69	1	1
-232	6	0
-1064	0	2
-4530	0	1
-4542	6	6
-10543	1	0
-4051	2	0
-11340	5	6
-4936	1	0
-12029	3	3
-43	1	1
-2955	27	27
-775	0	10
-822	1	0
-2057	1	0
-733	0	1
-4016	0	1
-4514	1	1
-49	1	1
-4484	1	0
-784	1	1
-25	1	1
-5707	2	0
-1274	1	0
-289	1	1
-34	1	0
-80
-
-chain 15799018021 chr6 170899992 + 5000 170896992 chr6 171115067 + 60000 171055067 6
-1297281	0	1
-7806978	162987	0
-4013144	0	9
-261	15	13
-18786172	17	17
-439	16	16
-59	4	5
-32202	17	17
-439	16	16
-59	5	4
-15403	0	1
-13914166	0	4
-115	1	1
-17	1	1
-415	0	12
-105	3	6
-12160281	50000	50000
-642507	3050000	3100000
-248423	50000	50000
-2918791	0	1238
-9427508	4	4
-162	12	12
-2193	22	22
-293	1	1
-30	1	1
-845	0	1
-45	1	1
-9769	0	2
-6058	1	1
-24	1	1
-2223	1	1
-24	1	1
-182	12	12
-284	1	1
-20	1	1
-970	1	1
-64	36	7
-575	43	43
-389	1	1
-27	1	1
-3279	1	1
-44	1	0
-3012	0	1
-545	17	17
-2562	1	0
-251	1	0
-943	0	8
-29	1	1
-566	0	6
-1483	0	2
-1960	0	1
-4564	1	1
-25	1	1
-832	1	0
-801	8	8
-1131	1	1
-58	1	5
-6177	1	0
-3712	0	1
-2185	1	1
-35	1	1
-710	2	2
-78	1	1
-2201	1	1
-30	1	1
-283	1	1
-30	1	1
-448	0	1
-75012	0	8
-2508457	0	1
-4641788	5	5
-37	1	1
-8503609	2	0
-5363169	200000	150000
-6040303	1	1
-36	0	1
-2020	1	1
-46	1	1
-1559	1	1
-72	1	1
-1098	1	1
-29	1	1
-264	7	7
-580	1	0
-30	1	1
-536	1	1
-41	1	1
-5663	0	1
-423	0	2
-372	1	1
-18	1	1
-9612	0	1
-1414	0	1
-176	2	0
-2742	0	1
-1968	1	0
-754	0	1
-4237	1	0
-2388	1	1
-31	0	1
-3385	1	0
-2004	0	8
-3395	3	0
-32	1	1
-4109	1	0
-1055	0	20
-1611	0	1
-17198424	26	17
-7835	1	0
-11119	1	1
-5197	0	11
-4791	1486	66479
-6787989	1	0
-149	0	4
-947	0	4
-244	1	0
-28418215	1	1
-21	0	1
-3116903	50000	171704
-1939305	1	1
-19	2	0
-8192274	4	4
-122	2	0
-1127	0	1
-1104	1	102
-18	0	29
-40	0	3
-22	1	4
-50	0	26
-56	18125	195105
-950946	1	157
-51	1	1
-104	0	255
-610	0	408
-104	0	105
-1285158	150028	50028
-725067
-
-chain 8374990 chr6 170899992 + 9109557 9199728 chr6 171115067 + 9164559 9254607 394
-3887	2	0
-1509	45	45
-888	7	8
-372	0	1
-4746	3	0
-1114	31	31
-140	35	35
-2111	13	13
-445	248	137
-1437	38	38
-55	25	25
-739	19	19
-2479	70	58
-1297	0	4
-7065	24	24
-542	31	31
-531	22	22
-824	0	1
-2286	40	39
-1209	48	48
-1435	6	0
-4096	4	0
-495	41	42
-6884	0	1
-3177	0	1
-2843	0	1
-904	5	5
-830	18	18
-1997	0	1
-942	4	0
-122	33	33
-1012	0	10
-3751	0	1
-5959	49	49
-4503	0	20
-7514	8	8
-4012	15	15
-673	16	0
-83	4	0
-424	3	0
-3932
-
-chain 892181 chr6 170899992 + 9258019 9267980 chr6 171115067 + 9150000 9160000 4430
-970	53	55
-802	16	17
-389	27	27
-73	5	4
-118	9	5
-615	0	2
-69	17	15
-578	0	1
-114	22	22
-888	130	130
-252	3	9
-564	0	1
-211	5	0
-90	4	0
-1846	21	21
-1832	0	42
-238
-
-chain 763150 chr6 170899992 + 9249728 9258019 chr6 171115067 + 9141295 9150000 6494
-566	0	1
-140	8	0
-205	47	47
-145	18	12
-46	1	0
-3841	0	56
-172	0	372
-444	18	18
-2447	20	20
-173
-
-chain 369937 chr6 170899992 + 9267980 9272102 chr6 171115067 + 9160000 9164126 144773
-1134	49	45
-1420	38	38
-203	0	4
-144	0	3
-115	54	55
-965
-
-chain 4624 chr6 170899992 + 9129966 9130015 chr6 171115067 + 165872977 165873026 28640892
-49
-
-chain 1407 chr6 170899992 + 74606704 74606747 chrX 155270560 + 149588561 149588604 701656
-6	11	11
-26
-
-chain 414456960 chr6_cox_hap1 4731698 + 0 4731698 chr6 171115067 + 28541283 33351542 27
-3409	1	0
-3526	0	1
-2940	0	4
-981	0	1
-4053	0	2
-1433	0	1
-3153	2	0
-369	0	1
-1090	0	1
-884	1	4
-363	1	0
-1969	0	1
-994	5	0
-58	1	1
-131	1	0
-4080	1	0
-680	0	1
-978	0	1
-1062	1	0
-2669	19	19
-7247	1	2
-1704	0	4
-1513	0	2
-49	2	0
-2160	0	5
-672	1	1
-38	1	1
-1384	1	0
-1685	1	1
-30	1	1
-2421	1	1
-42	1	1
-830	1	1
-41	1	1
-1630	0	1
-7458	1	0
-691	0	1
-525	0	1
-79	1	1
-29	1	1
-2055	1	1
-16	0	24
-1867	5	7
-786	0	2
-280	0	1
-227	2	0
-6678	1	0
-4401	1	0
-210	1	0
-3193	2	0
-3619	0	1
-2414	0	2
-5387	0	3
-2927	0	1
-3304	0	1
-440	0	5
-415	0	9
-3597	1	1
-48	1	1
-3412	1	1
-46	1	1
-3604	4	4
-1063	1	1
-36	1	1
-3511	6	6
-2797	32	41
-393	0	1
-477	1	1
-37	1	1
-2459	2	0
-517	0	12
-318	0	1
-1010	7	6
-2103	0	1
-5171	0	8
-1483	1	0
-3813	888	0
-4675	0	2
-5620	1	0
-2017	1	0
-3363	0	5
-1197	0	3
-3208	1	0
-1928	1	0
-174	6	0
-780	1	3
-443	14	0
-3079	0	5
-1993	0	3
-1089	1	1
-58	1	1
-80	0	8
-256	2	0
-2473	37	43
-752	0	2
-33	0	2
-825	0	1
-787	1	1
-37	1	1
-1168	16	0
-377	5	1
-27	1	1
-2161	2	0
-636	25	25
-1663	1	0
-1757	6	6
-205	4	0
-203	7	7
-107	1	1
-28	1	1
-100	4	4
-258	5	0
-659	1	0
-3805	5	8
-1486	4	4
-213	39	43
-4429	0	2
-1199	13	13
-5803	12	0
-2987	0	1
-813	0	17
-920	2	0
-3820	1	3
-130	21	9
-1913	0	14
-1800	0	1
-1255	2	0
-1466	4	0
-747	0	1
-124	2	0
-2108	1	0
-169	0	26
-593	1	0
-632	5	0
-2711	0	4
-1042	0	1
-34	1	1
-1025	2	0
-27	4	18
-81	1	33
-33	0	1
-6	0	76
-3950	1	0
-86	1	1
-12	1	1
-2947	0	1
-1160	1	0
-2046	3	0
-720	1	0
-1341	1	0
-10205	0	5
-1265	1	0
-10	1	1
-1278	5	6
-399	0	32
-96	16	18
-605	4	0
-1072	12	12
-950	11	7
-5128	9	10
-2711	1	0
-676	0	1
-2904	1	1
-30	1	1
-851	0	1
-1410	0	1
-394	1	1
-57	1	1
-1561	0	2
-11062	1	1
-58	1	1
-3238	1	1
-42	1	1
-269	1	0
-284	3	3
-24	1	0
-2796	0	5
-2451	28	0
-2251	1	1
-32	1	0
-10	0	4
-24	1	1
-694	0	2
-3475	0	1
-2008	1	1
-49	1	1
-475	1	1
-28	1	1
-259	160	0
-1858	1	0
-1621	3	0
-1791	1	0
-316	0	2
-1169	0	1
-2549	1	0
-2941	1	1
-34	1	1
-243	9	0
-5157	0	2
-1748	0	8
-472	4	0
-2470	0	4
-402	1	0
-643	2	0
-748	0	2
-859	1	0
-409	2	0
-267	0	2
-322	0	4
-155	1	0
-9957	0	4
-1440	4	4
-127	1	0
-1085	1	0
-131	1	0
-767	1	0
-1160	21	21
-1294	1	0
-712	1	0
-1819	2	1
-464	1	0
-6944	0	4261
-55	0	7
-1235	0	3
-702	0	24
-2847	0	1
-2428	3	0
-7517	0	1
-3204	1	0
-611	1	0
-7104	1	0
-4959	14	14
-2827	1	0
-9421	82	25
-4428	8	0
-5987	41	41
-2108	0	2
-344	1	0
-4216	1	0
-810	0	5
-4443	1	0
-10291	10	0
-7265	5	0
-7041	1	0
-6007	1	0
-8185	4	0
-4961	0	3
-13564	0	1
-1475	0	2
-105	0	10
-10104	2	0
-3073	1	0
-3715	8	0
-2246	24	24
-11461	0	2
-837	61	1
-7660	39	39
-1705	0	1
-6068	7	0
-916	0	4
-569	1	1
-72	1	1
-2260	0	2
-7036	4	0
-3591	0	3
-713	4	0
-7058	11	11
-3319	0	2
-8475	0	1
-1324	0	2
-5438	5	0
-156	1	1
-44	0	1
-21501	7	7
-3359	16	16
-2138	0	5
-4406	11	11
-1525	1	1
-28	1	1
-2159	16	0
-48	4	0
-3030	0	1
-5717	10	0
-6594	2	0
-648	31	31
-1275	1	0
-4	1	0
-3599	1	0
-7515	4	0
-979	0	2
-1990	0	10
-123	1	1
-27	1	1
-1255	0	2
-2769	5	5
-727	1	1
-26	3	3
-785	0	1
-8871	29	29
-15459	1	0
-5978	5	5
-66	1	1
-46	1	1
-18539	1	0
-7732	2	0
-652	0	1
-861	0	1
-10658	17	17
-1313	0	1
-3515	3	0
-19	18	0
-539	0	1
-655	2	0
-10586	2	0
-2385	0	1
-7589	1	0
-29834	1	1
-27	1	1
-1216	1	0
-1323	1	0
-673	0	3
-20031	0	3
-2841	13	0
-1841	4	0
-6446	1	0
-11727	0	1
-8427	17	17
-2864	0	143
-4107	0	8
-748	0	2
-3417	1	1
-32	1	1
-18799	0	2
-21810	1	1
-34	1	1
-2784	2	0
-7864	2	0
-4498	0	1
-49089	1	1
-32	1	1
-509	1	1
-37	1	1
-5371	22	16
-389	1	1
-21	1	1
-806	1	0
-1638	6	6
-228	1	1
-45	1	1
-2068	6	3
-441	1	0
-2338	1	0
-1948	1	1
-26	1	1
-214	0	1
-6118	1	1
-31	1	1
-2382	5	5
-4335	1	1
-39	1	1
-4561	1	1
-38	1	1
-2199	1	1
-49	1	1
-243	19	6
-2779	1	1
-37	2	0
-24	1	1
-1966	3	0
-233	1	1
-29	1	1
-13756	0	4
-3956	4	1
-33765	46	46
-12758	1	0
-18985	0	8
-1384	3	1
-85	1	0
-3539	1	1
-32	1	1
-145	1	0
-1245	2	0
-1736	80	80
-1607	1	5
-712	10	11
-502	0	1
-3670	1	0
-740	0	1
-1693	0	1
-6497	0	2
-2898	1	3
-141	0	1
-1108	0	2
-1448	1	0
-1340	0	1
-7616	74	66
-2882	1	2
-30	8	0
-896	21	3
-395	1	1
-37	3	0
-23	1	2
-1210	18	0
-65	1	1
-20	1	1
-791	0	4
-389	1	0
-809	1	1
-55	0	7
-428	1	1
-17	1	1
-239	1	1
-20	1	1
-69	1	1
-37	1	1
-955	1	0
-839	0	1
-165	1	0
-3867	0	5
-70	1	1
-27	1	1
-899	1	2
-107	1	0
-1457	1	0
-763	12	5
-35	1	1
-1417	10	10
-121	1	1
-38	0	3
-377	1	0
-325	2	2
-178	1	0
-11	4	0
-297	0	24
-337	11	0
-134	1	1
-694	3	0
-72	1	1
-144	1	1
-96	1	1
-199	2	0
-1011	1	0
-107	1	1
-1280	1	1
-73	1	1
-84	25	25
-287	1	1
-26	1	1
-139	1	1
-41	1	1
-440	4	0
-130	12	12
-435	21	0
-85	1	1
-28	1	1
-73	1	1
-61	1	1
-53	5	1
-70	1	2
-52	2	0
-157	30	30
-554	2	2
-128	1	5
-68	1	1
-44	1	1
-125	0	1
-57	1	1
-308	0	7
-15	1	1
-725	9	0
-60	1	1
-180	1	1
-55	1	1
-61	1	1
-23	1	0
-5	1	2
-88	1	1
-56	1	1
-433	2	0
-84	68	68
-182	12	12
-216	1	1
-94	1	1
-561	1	1
-16	1	1
-113	1	1
-86	1	1
-148	2	0
-75	2	0
-77	1	21
-209	3	8
-374	1	0
-173	4	3
-201	1	1
-42	1	1
-56	1	1
-115	1	0
-327	1	1
-54	5	5
-929	1	1
-21	1	1
-97	1	1
-28	0	3
-830	0	2
-68	1	1
-525	0	1
-2081	1	1
-41	1	1
-165	3	3
-46	1	0
-378	1	1
-49	1	1
-352	0	1
-142	1	1
-30	1	1
-95	1	1
-45	1	1
-227	1	1
-53	1	1
-130	1	1
-18	1	1
-138	1	1
-90	1	1
-129	41	41
-50	1	1
-79	1	1
-117	1	1
-31	1	1
-240	5	5
-57	1	1
-152	1	1
-30	1	1
-177	5	5
-321	1	1
-63	1	1
-504	18	18
-662	1	1
-74	1	1
-248	1	1
-34	1	1
-1507	0	10
-1051	0	2611
-560	3	3
-23	1	1
-1631	0	15
-78	4	0
-160	0	21
-3764	0	4
-1358	0	1
-1773	1	1
-43	1	1
-1263	1	1
-39	1	1
-183	0	16
-4097	10	0
-1261	1	1
-20	1	1
-137	1	0
-2351	1	1
-43	1	1
-1010	0	4
-536	1	1
-38	1	1
-381	0	1
-888	19	19
-1521	1	1
-27	1	1
-161	1	1
-46	1	1
-2659	2	0
-533	10	0
-441	1	12
-1684	1	1
-26	3	4
-879	16	16
-514	0	2
-58	1	1
-117	1	1
-24	1	1
-207	1	0
-38	1	1
-730	1	1
-39	1	1
-429	10	10
-134	0	4
-37	1	1
-144	8	8
-1036	2	0
-262	2	2
-38	0	1
-70	18	18
-84	11	13
-317	0	3
-1256	0	2
-332	1	1
-21	1	1
-193	8	28
-30	1	1
-79	1	1
-29	1	1
-536	1	0
-611	1	1
-25	1	1
-399	4	4
-118	0	32
-23	1	1
-116	1	1
-30	1	1
-503	1	1
-22	0	3
-136	1	1
-48	1	1
-330	9	9
-1108	1	1
-98	1	1
-582	0	4
-711	7	7
-89	1	0
-293	7	6
-159	1	1
-24	1	1
-167	6	6
-171	17	17
-681	1	1
-43	1	1
-538	1	1
-44	1	1
-537	16	16
-180	6	6
-778	2	2
-44	1	1
-168	0	7
-211	1	1
-42	1	1
-1253	1	1
-29	1	1
-320	1	1
-36	2	2
-55	1	2
-460	1	1
-35	1	1
-553	8	8
-386	1	1
-26	1	1
-540	1	1
-31	1	1
-65	0	1
-625	12	12
-313	0	1
-52	1	1
-22	1	1
-583	1	1
-49	1	1
-678	37	37
-784	3	0
-770	1	1
-87	11	0
-1129	1	1
-36	1	1
-553	8	8
-997	16	15
-157	1	1
-31	2	2
-204	18	19
-487	1	1
-29	1	1
-374	1	1
-67	1	1
-720	13	13
-266	10	10
-330	16	14
-413	1	1
-44	1	1
-78	6	6
-181	2	2
-36	1	1
-397	1	1
-20	1	1
-311	1	1
-48	2	2
-1298	11	11
-437	4	4
-35	1	1
-194	10	10
-310	1	1
-51	1	1
-136	1	1
-49	1	1
-521	1	1
-23	1	1
-220	1	1
-71	1	1
-1046	15	15
-216	1	1
-21	1	1
-51	1	1
-49	1	1
-527	17	17
-340	12	11
-1025	1	0
-2572	1	1
-29	1	1
-397	2	5
-668	13	13
-541	1	1
-59	0	2
-6	1	1
-122	14	14
-51	1	1
-46	1	1
-72	5	5
-352	0	21
-136	1	1
-12	1	1
-66	16	16
-456	37	34
-371	7	7
-48	1	1
-194	10	10
-108	1	1
-60	1	1
-122	0	1
-48	1	1
-238	1	1
-32	0	1
-100	1	0
-72	1	0
-390	1	1
-38	1	1
-144	1	1
-27	0	4
-184	21	228
-49	1	1
-608	0	1
-152	1	1
-31	1	1
-281	8	8
-337	1	1
-45	1	1
-222	1	1
-20	1	1
-380	1	0
-44	1	1
-368	1	1
-72	1	1
-502	36	18
-63	1	1
-43	0	4
-136	1	1
-42	1	1
-80	4	4
-35	1	0
-89	1	1
-24	0	5
-829	13	13
-102	14	0
-233	1	1
-42	0	3
-85	0	1
-400	1	1
-40	1	1
-538	25	25
-174	1	1
-20	1	1
-705	1	1
-26	2	2
-614	1	1
-44	1	1
-509	1	1
-32	1	1
-224	1	1
-42	1	1
-747	5	5
-804	1	1
-29	1	1
-166	1	1
-43	1	1
-233	1	1
-44	1	1
-620	8	8
-133	1	1
-31	1	1
-165	1	1
-29	1	1
-1249	1	1
-26	4	0
-56	1	1
-67	1	1
-716	1	1
-46	0	1
-16	1	1
-174	1	1
-96	1	1
-141	1	1
-39	0	4
-263	1	1
-18	1	1
-259	4	4
-38	1	1
-104	1	1
-40	1	0
-248	1	1
-18	1	1
-238	1	1
-32	1	1
-70	0	2
-16	1	1
-818	1	1
-22	4	4
-1641	1	1
-46	1	1
-53	1	0
-38	1	1
-373	1	1
-60	1	1
-1149	0	2
-19	1	1
-1653	4	4
-42	1	1
-218	12	12
-363	1	1
-24	1	1
-457	10	10
-414	13	13
-825	1	1
-41	1	1
-492	0	8
-1370	1	1
-18	1	1
-808	2	2
-335	6	4
-880	1	1
-35	1	1
-236	1	1
-67	1	1
-298	0	1
-147	4	4
-322	11	11
-613	1	1
-62	1	1
-340	1	1
-22	1	1
-1057	1	1
-57	1	1
-358	1	1
-128	1	1
-146	10	10
-490	1	1
-20	1	1
-62	1	1
-88	1	1
-293	1	1
-28	1	0
-20	1	1
-83	0	1
-90	1	1
-312	1	1
-44	1	1
-1213	1	1
-51	1	1
-467	1	1
-39	1	1
-122	14	0
-35	1	1
-485	14	14
-110	13	0
-127	1	1
-7150	9	13
-3278	0	2
-28	1	1
-2211	1	0
-1325	18	18
-1304	3727	0
-299	0	248
-2603	2	0
-160	1	1
-34	1	1
-631	1	1
-40	1	3
-38	1	1
-332	17	17
-231	14	14
-202	1	1
-199	1	1
-71	1	1
-42	1	0
-53	11	10
-82	34	34
-135	1	1
-50	3	0
-32	1	1
-194	1	1
-45	1	1
-143	1	1
-78	1	1
-193	6	0
-40	1	1
-432	1	1
-17	1	1
-429	3	6
-58	1	1
-85	1	1
-62	1	1
-85	1	1
-57	1	1
-51	2	2
-278	1	1
-49	1	1
-77	11	11
-120	0	4
-139	1	1
-30	2	2
-205	4	4
-131	1	1
-22	1	1
-251	1	1
-34	1	1
-175	1	1
-36	1	1
-239	1	1
-32	5	5
-63	1	1
-27	1	1
-78	1	1
-19	1	1
-209	1	1
-143	1	13
-176	0	1
-7	0	8
-375	0	1
-62	1	1
-129	2	2
-135	1	1
-88	8	0
-90	6	8
-796	2	0
-1219	1	1
-34	1	1
-833	1	1
-46	1	1
-74	1	1
-45	1	1
-95	1	1
-29	1	1
-298	0	3
-47	1	1
-311	1	1
-58	1	1
-349	15	15
-208	1	1
-37	3	0
-413	11	11
-54	1	1
-97	1	1
-137	0	2
-95	1	1
-257	3	0
-35	1	1
-66	1	1
-47	1	1
-104	7	7
-220	17	17
-228	4	4
-432	1	1
-34	3	3
-175	4	4
-26	1	2
-116	7	7
-60	13	13
-137	1	1
-44	1	1
-744	1	1
-29	1	1
-148	0	5
-30	1	1
-387	1	1
-22	1	1
-309	1	1
-82	1	1
-52	1	1
-32	1	1
-121	1	1
-37	1	1
-396	3	2
-324	1	1
-92	1	1
-51	9	9
-71	7	7
-24	1	1
-115	1	1
-101	1	1
-799	12	12
-197	1	1
-146	1	1
-103	1	1
-134	1	1
-16	1	1
-378	1	1
-85	1	1
-134	1	1
-25	1	1
-54	3	3
-55	1	1
-67	1	1
-22	1	1
-54	13	13
-55	11	11
-120	1	1
-23	1	1
-51	1	1
-22	1	1
-369	1	1
-273	1	1
-119	6	6
-229	34511	40178
-78	1	1
-22	1	1
-180	1	1
-33	1	2
-26	6	6
-474	1	1
-36	1	1
-151	1	1
-29	1	1
-120	1	1
-23	1	1
-865	1	1
-39	1	1
-330	1	1
-24	1	1
-197	1	1
-69	1	1
-116	3	0
-161	1	1
-38	1	1
-753	1	1
-57	3	3
-145	1	1
-121	1	1
-300	1	1
-147	1	1
-379	1	1
-55	2	2
-65	1	1
-32	1	1
-1008	1	1
-24	1	1
-159	18	18
-659	1	1
-76	0	2
-77	1	3
-65	1	1
-84	1	0
-119	1	1
-15	1	1
-247	4	0
-372	1	0
-1633	1	1
-16	1	1
-221	9772	11561
-315	1	1
-53	1	1
-67	1	1
-91	1	0
-23	1	0
-27	2	2
-66	2	2
-80	0	41
-12	1	1
-158	1	0
-92	2	0
-254	1	1
-43	1	1
-846	6	149
-84	1	1
-29	3	3
-315	17	17
-482	1	1
-29	3	3
-278	1	1
-73	1	1
-2767	1	1
-34	1	1
-192	1	1
-33	1	0
-168	6	0
-276	10	10
-344	1	1
-49	1	1
-109	1	1
-35	3	3
-561	24	27
-923	1	1
-102	1	1
-75	14	14
-266	1	1
-80	2	2
-185	1	0
-1035	1	1
-23	1	1
-417	10	10
-97	1	1
-94	1	1
-492	1	1
-37	5	5
-1429	1	1
-19	1	1
-839	1	1
-96	1	1
-1279	4	0
-683	1	1
-49	1	1
-514	1	1
-28	4	4
-2302	1	1
-42	1	1
-537	2	21
-1555	1	1
-42	0	1
-14	4	4
-86	1	1
-62	1	1
-515	5	1
-330	0	1
-159	0	22
-3841	1	0
-5065	12	12
-97	0	3
-772	1	1
-21	2	1
-1058	0	2
-349	2	0
-1080	6	0
-11	1	3
-53	0	2
-14	1	1
-1035	1	1
-85	1	1
-69	1	1
-27	1	1
-547	7	7
-195	1	1
-41	1	1
-395	1	1
-35	1	1
-73	0	1
-71	1	1
-557	3	3
-30	1	1
-66	49	49
-1310	0	2
-26	2	0
-10	1	15
-36	1	1
-196	1	1
-40	1	1
-141	1	1
-76	1	1
-1480	1	3
-347	1	1
-26	1	1
-231	1	1
-82	3	3
-69	3	0
-441	16	16
-147	1	1
-21	1	1
-3565	0	3
-877	2	0
-1036	1	1
-47	2	1
-3761	12	0
-5345	1	0
-11541	1	0
-1843	0	4
-1157	16	16
-7354	19	0
-736	0	1
-8058	1	0
-4449	21	21
-649	1	0
-2913	0	1
-381	331	0
-6066	0	1
-1968	7	0
-3198	1	0
-667	1	0
-3870	0	1
-36	13	0
-1894	1	1
-40	0	4
-1137	6	0
-211	2	0
-345	1	0
-592	4	4
-1043	4	0
-686	14	0
-1032	0	1
-9035	0	4
-167	0	2
-19472	35	35
-4457	0	3
-1470	0	1
-289	3	0
-3780	41	41
-522	1	0
-2026	8	0
-430	0	1
-631	1	1
-21	1	1
-479	0	1
-697	4	0
-1779	1	1
-27	1	1
-196	4	0
-58	8	0
-2881	1	1
-39	1	1
-120	44	45
-538	1	0
-393	6	6
-3090	1	1
-43	1	1
-1246	1	0
-294	1	1
-27	1	1
-374	3	3
-144	1	1
-190	1	6
-750	1	0
-695	2	0
-1003	11	0
-1185	8	8
-763	0	4
-2737	11	11
-453	1	0
-536	1	1
-43	1	1
-57	1	0
-21	7	0
-3892	0	1
-3177	0	1
-8990	0	2
-2303	1	0
-2850	4	0
-1273	0	2
-5863	1	0
-9593	1	1
-81	1	1
-2777	0	2
-4564	34	34
-674	0	8
-11548	2	0
-6086	0	1
-109	1	1
-2286	0	1
-997	0	18
-3344	1	1
-40	1	1
-842	28	24
-1584	1	0
-1582	0	1
-1670	3	25
-17	0	4
-16	2	0
-6	12	0
-49	1	1
-538	1	1
-26	1	1
-5879	2	4
-2513	0	1
-346	8	8
-222	16	16
-103	1	0
-198	1	3
-539	1	1
-47	1	1
-1154	0	1
-3737	1	2
-370	2	0
-1178	1	1
-78	1	1
-47	0	1
-518	6	0
-646	13	13
-469	1	0
-1072	1	4
-858	1	0
-3674	1	0
-282	1	0
-597	0	6
-505	4	4
-183	1	1
-43	1	1
-1294	1	1
-40	1	1
-572	0	4
-464	0	4
-757	40	40
-1089	2	0
-548	1	0
-1300	0	3
-1839	2	0
-189	1	1
-49	1	1
-1253	1	1
-43	1	0
-498	1	1
-45	4	0
-3538	0	1
-1989	14	14
-1332	2	0
-3586	1	0
-989	1	2
-447	0	4
-40	1	1
-2445	16	17
-291	1	3
-7	1	0
-11	0	1
-41	1	1
-94	1	1
-49	1	1
-1515	6	0
-603	13	13
-163	1	1
-45	1	1
-2050	11	11
-1126	1	1
-16	1	1
-391	1	1
-19	0	1
-932	1	0
-42	1	1
-751	1	0
-287	1	1
-42	1	1
-464	0	4
-4069	5	5
-153	1	0
-514	2	0
-1093	1	1
-41	1	1
-1746	4	4
-1351	1	1
-38	1	1
-682	12	12
-519	0	72
-168	18	18
-146	7	7
-293	1	1
-61	0	1
-43	1	1
-236	1	0
-35	1	1
-152	14	14
-776	0	4
-809	4	0
-155	1	1
-44	1	1
-1068	1	1
-93	1	1
-209	15	15
-1331	0	3
-3912	0	1
-6624	0	4
-375	0	1
-7255	5	0
-419	2	0
-293	1	0
-10397	5	24
-11095	0	1
-1770	4	0
-374	0	4
-7714	1	0
-1229	7	6
-3055	1	0
-5818	1	0
-2415	11	9
-2056	0	1
-955	4	0
-3907	0	2
-16936	0	1
-1044	1	0
-2392	0	1
-158	2	1
-199	0	1
-75	6	6
-2094	8	0
-649	2	0
-373	75	75
-2253	1	0
-15	1	0
-1995	0	2
-818	4	0
-676	0	1
-3171	8	0
-170	0	3
-459	1	1
-37	1	1
-336	1	0
-206	1	1
-26	1	1
-224	15	15
-308	2	1
-82	1	1
-23	1	1
-562	1	1
-80	1	1
-241	0	8
-1530	1	1
-20	1	1
-1372	1	1
-44	1	1
-427	1	1
-20	1	1
-651	105	81
-221	1	1
-45	1	1
-1747	1	1
-27	1	1
-179	1	1
-70	1	1
-173	1	1
-84	0	36
-1864	1	1
-41	1	1
-44	9	0
-1028	1	0
-85	1	1
-21	1	1
-475	0	2
-256	1	1
-31	1	1
-653	1	1
-18	1	1
-62	1	1
-19	1	1
-997	1	1
-22	1	1
-326	1	0
-505	5	4
-386	0	7
-466	13	13
-870	11	12
-134	15	15
-248	0	2
-2281	1	1
-79	1	1
-56	9	6
-498	100	100
-802	1	0
-290	1	1
-38	1	1
-185	1	1
-61	1	1
-944	1	1
-22	1	1
-835	1	1
-66	1	1
-890	0	1
-3503	6	6
-231	0	1
-2136	1	0
-999	1	0
-5220	3	4
-830	1	1
-24	1	1
-1209	1	1
-38	1	1
-7077	1	0
-2939	1	0
-3959	0	2
-3746	0	2
-1011	1	1
-34	1	1
-7443	0	1
-688	2	0
-574	1	1
-29	1	1
-1785	2	0
-16	20	0
-4073	2	0
-136	1	1
-77	1	1
-528	27	0
-253	0	1
-204	1	0
-129	2	0
-811	1	1
-38	1	1
-2347	52	0
-4634	1	0
-856	14	14
-1052	1	1
-28	1	1
-1255	1	1
-36	1	1
-97	0	1
-58	1	1
-1708	1	1
-48	1	1
-958	13	0
-3371	1	1
-37	1	1
-4267	0	15
-1059	0	1
-272	0	20
-168	2	0
-26	4	32
-4090	0	2
-3269	1	1
-17	1	2
-1378	1	0
-1443	0	1
-6206	1	0
-2318	0	1
-7695	2	0
-396	22	12
-918	0	1
-1818	0	1
-28	1	1
-492	1	1
-33	1	1
-326	1	1
-80	1	1
-288	8	17
-2671	0	1
-1099	0	1
-144	1	1
-29	0	1
-2098	0	2
-24	4	0
-1207	4	4
-45	1	1
-757	0	5
-1926	1	1
-40	1	1
-2657	0	1
-414	1	0
-61	0	1
-235	0	2
-2087	0	1
-713	0	4
-58	1	0
-1041	3	0
-36	1	1
-377	1	1
-17	1	1
-948	1	1
-41	1	1
-458	1	1
-21	1	1
-1055	0	1
-8189	4	5
-36	1	1
-102	2	0
-14	1	1
-682	0	6
-147	0	1
-750	0	3
-40	1	1
-2428	0	1
-750	2	0
-473	0	2
-2032	1	0
-3841	1	0
-560	1	0
-1108	1	0
-8087	1	0
-11881	1	1
-30	1	1
-4383	2	0
-6883	49	49
-3146	0	1
-906	2	0
-887	1	1
-80	1	1
-2210	1	0
-905	0	1
-1037	1	0
-5866	0	2
-18	1	1
-582	0	5
-2828	1	0
-847	1	0
-1996	4	0
-3170	1	0
-1751	0	1
-910	2	0
-691	0	1
-32873	0	1
-1722	0	1
-17559	16	24
-1369	29	0
-494	2	0
-4432	0	1
-23680	26	26
-10911	0	1
-920	0	1
-4586	0	2
-2232	1	0
-5718	0	1
-12415	1	1
-51	0	1
-7997	0	2
-1700	1	0
-2697	1	0
-2561	2	0
-1544	0	6
-1613	3	7
-37	9	1
-2113	1	0
-7174	0	34
-7914	1	1
-35	1	1
-5308	1	0
-2303	2	1
-423	7	7
-590	1	0
-24	1	1
-165	6	0
-2848	13	13
-64	0	1
-28	1	1
-723	0	4
-2868	0	1
-731	1	1
-60	1	1
-1012	3	0
-490	29	29
-1225	1	1
-78	1	1
-61	1	0
-2362	11	11
-399	1	0
-1494	16	16
-128	24	24
-530	1	1
-35	1	1
-5276	1	0
-415	0	1
-580	1	2
-1450	22	23
-816	1	0
-1953	1	0
-881	10	1
-885	8	14
-183	14	14
-1139	25	25
-155	1	1
-94	1	1
-419	3	3
-26	1	1
-56	1	0
-69	1	0
-117	1	1
-120	1	1
-42	1	1
-825	0	2
-108	1	1
-24	1	1
-956	3	0
-664	1	1
-41	1	1
-716	4	0
-1731	8	8
-4228	0	1
-5694	3	0
-4493	0	1
-2656	1	0
-3029	4	0
-5688	1	0
-170	2	0
-5972	0	2
-840	0	2
-55	1	1
-28	1	1
-2954	0	1
-4343	6	0
-1663	4	0
-150	1	0
-3128	1	0
-1449	3	0
-1534	1	0
-489	1	0
-431	0	4
-299	2	0
-5082	9	0
-413	0	1
-989	0	2
-4941	0	1
-6655	1	0
-349	8	7
-762	1	1
-29	0	3
-1434	0	1
-1267	0	1
-587	1	1
-22	0	1
-894	28	0
-1343	2	0
-2256	0	1
-4332	0	4
-22	1	1
-12415	12	10
-10485	0	1
-1429	0	12
-625	1	7
-1224	0	10
-1680	4	0
-5169	14	14
-3878	0	8
-2544	0	140
-9238	0	1
-1575	0	3
-1775	1	1
-31	1	1
-1200	1	0
-32	0	3
-797	0	8
-35	0	2
-599	1	1
-22	1	1
-5338	2	0
-1998	0	5
-146	0	4
-12031	0	1
-1993	0	1
-706	2	0
-2735	0	1
-3859	0	4
-4845	0	2
-268	2	0
-827	4	4
-1063	6	6
-7834	2	0
-3195	0	1
-4012	10	0
-6429	0	2
-308	0	1
-808	1	0
-17	8	0
-5472	19	2
-2436	0	14
-820	9	9
-2643	1	1
-32	1	1
-1189	1	0
-5710	0	3
-308	1	0
-4930	0	1
-4308	1	0
-946	82	0
-1790	0	2
-1218	25	0
-52	0	1
-1271	1	1
-33	1	1
-4760	1	0
-4924	0	1
-4817	4	4
-39	1	0
-1116	3715	901
-205	1	0
-1591	5	2
-138	2	2
-16	1	1
-802	0	89
-1600	0	6
-2175	0	5
-606	14	14
-519	1	0
-540	1	1
-40	1	1
-568	2	0
-458	1	1
-41	1	1
-1106	24	62
-818	1	1
-42	1	1
-2266	1	0
-14059	0	4
-5030	1	0
-12630	0	3
-84	9	9
-129	13	18
-564	10	15
-154	1	0
-438	10	10
-38	0	5
-98	11	9
-2034	1	1
-25	1	1
-73	10	10
-70	5	5
-132	1	1
-52	1	1
-599	1	1
-46	1	1
-279	1	1
-18	1	1
-239	3	0
-383	6	0
-224	0	1
-321	15	0
-1783	1	1
-18	3	0
-108	1	1
-60	1	1
-405	16	16
-60	1	1
-16	1	1
-970	1	1
-24	1	1
-424	3	0
-41	1	1
-57	8	8
-285	2	0
-672	1	1
-44	1	4
-103	0	1
-148	1	1
-49	3	0
-146	5	11
-91	1	1
-79	1	1
-94	1	1
-101	1	1
-88	16	16
-117	1	1
-15	1	1
-58	1	1
-93	1	1
-466	1	1
-44	1	1
-160	1	1
-23	1	1
-481	14	14
-181	4	4
-72	1	1
-25	1	1
-82	7	12
-4	0	1
-11	1	4
-20	0	5
-92	1	1
-56	10	0
-80	1	1
-141	2	0
-60	1	1
-372	0	2
-784	1	1
-85	1	1
-109	1	1
-16	1	1
-57	1	1
-92	3	1
-23	1	0
-26	1	1
-74	1	1
-33	1	1
-176	1	1
-25	2	2
-193	1	1
-35	0	1
-383	0	5
-249	1	1
-69	1	1
-98	1	1
-70	1	1
-55	1	1
-143	1	1
-438	1	1
-64	1	1
-53	4	0
-127	3	0
-75	5	5
-45	1	1
-197	1	1
-27	1	1
-116	13	13
-218	15	20
-1107	16	19
-73	1	1
-101	1	1
-123	1	1
-60	1	1
-994	1	1
-43	0	1
-18	1	1
-1215	18	18
-340	1	1
-34	1	1
-1350	16	16
-1417	1	1
-29	1	1
-475	1	1
-48	1	1
-198	10	10
-87	1	1
-18	1	1
-171	7	7
-427	1	1
-21	1	1
-2011	0	3
-17	1	1
-1412	1	1
-24	1	1
-214	8	4
-228	1	1
-34	1	1
-410	16	16
-185	1	1
-24	1	0
-164	0	1
-222	1	1
-25	1	1
-297	10	10
-1171	1	0
-569	19	19
-2755	1	0
-11	1	1
-2502	1	1
-23	1	1
-44	12	0
-2856	0	1
-148	1	1
-36	1	1
-993	2	0
-1251	2	0
-6619	14	14
-1014	4	0
-134	2	9
-818	1	0
-61	1	7
-563	46	0
-78	5	5
-1677	1	1
-49	1	1
-399	1	1
-32	1	1
-790	27	27
-104	1	1
-75	1	1
-1638	1	1
-16	1	1
-92	1	1
-44	1	1
-276	0	13
-1020	1	1
-35	1	1
-389	14	14
-256	1	0
-38	1	3
-631	1	1
-40	1	1
-2356	85	83
-1300	0	5
-511	0	2
-605	1	1
-17	1	1
-880	12	0
-1689	4	0
-2492	1	1
-39	1	1
-641	16	16
-682	0	5
-669	1	1
-25	1	1
-1926	1	1
-39	4	3
-1037	1	1
-40	2	0
-890	6	0
-41	2	0
-498	3	0
-321	0	1
-281	3	0
-450	1	1
-34	1	1
-498	1	1
-28	2	1
-280	0	2
-648	1	1
-47	1	1
-1002	4	0
-120	1	1
-1538	0	1
-75	1	1
-37	1	1
-510	91	91
-60	18	18
-2075	1	1
-19	1	1
-2429	1	1
-21	1	1
-107	1	0
-2786	0	2
-31	5	5
-1973	12	0
-3118	1	0
-246	0	1
-33	1	1
-6752	1	0
-822	2	9
-606	1	1
-18	1	1
-3920	1	1
-37	0	2
-4497	10	13
-301	20	20
-2130	1	1
-16	3	0
-1843	0	4
-3780	3	0
-850	0	1
-2774	0	3
-2065	0	1
-20	1	1
-1400	1	0
-3243	0	15
-1336	5	0
-448	49	49
-121	7	7
-1507	8	7
-422	1	0
-2184	0	1
-304	0	2
-19	0	1
-101	1	1
-417	3	3
-22	1	1
-672	4	4
-31	1	1
-150	1	1
-38	1	1
-161	5	0
-17	1	1
-72	1	0
-106	1	1
-463	1	1
-94	1	1
-138	3	4
-185	1	1
-29	1	1
-220	15	15
-167	1	1
-32	1	1
-93	1	3
-217	1	1
-23	1	1
-137	9	9
-62	0	3
-353	1	1
-27	1	1
-117	9	9
-421	1	1
-47	1	1
-124	0	1
-997	6	0
-54	5	5
-764	1	1
-45	1	1
-1431	7	7
-387	6	6
-1103	0	36
-767	1	1
-31	1	3
-208	5	5
-1610	1	1
-23	1	1
-779	0	8
-324	0	2
-45	1	1
-264	0	3
-45	1	1
-250	1	1
-18	1	1
-517	33	0
-117	1	1
-42	1	1
-550	1	1
-20	1	1
-671	1	1
-68	1	1
-89	1	1
-104	1	1
-172	0	1
-124	0	1
-522	0	1500
-466	5	5
-32	1	0
-171	1	1
-19	1	1
-67	1	1
-22	1	1
-654	1	1
-25	1	1
-68	1	1
-21	4	0
-1588	1	1
-66	1	1
-401	0	1
-186	1	1
-21	1	1
-168	0	1
-686	3	0
-19	1	1
-127	1	1
-29	1	1
-234	1	1
-30	1	1
-141	0	2
-33	1	1
-673	1	1
-89	1	1
-161	16	16
-504	20149	20139
-1269	1	1
-40	1	1
-327	1	1
-24	1	1
-172	2	2
-27	11	15
-381	10	11
-376	1	1
-45	1	1
-121	1	1
-62	1	1
-289	1	1
-26	1	1
-191	1	1
-20	11	11
-425	1	1
-37	1	1
-296	1	1
-149	1	1
-284	1	1
-37	1	1
-705	1	12
-106	12	12
-306	1	1
-24	1	1
-1299	1	1
-47	1	1
-2026	1	1
-20	1	1
-133	1	0
-9803	0	4
-15871	3	0
-2464	1	1
-24	1	1
-879	1	1
-73	1	1
-89	1	1
-42	1	1
-108	1	1
-43	0	1
-26	1	1
-511	5	6
-605	19531	20105
-55	1	1
-37	0	2
-89	1	1
-51	1	1
-85	1	1
-78	1	1
-173	1	1
-51	1	1
-90	3	3
-95	1	1
-32	1	1
-53	1	1
-231	1	0
-82	2	0
-27	0	1
-44	1	0
-96	10	7
-132	1	1
-233	1	1
-257	1	1
-56	5	5
-237	1	1
-141	1	1
-92	1	1
-154	7	7
-3208	1	1
-33	1	1
-671	1	1
-21	1	1
-955	0	3
-130	1	1
-26	1	1
-288	8	8
-218	0	3
-1076	8	0
-609	10041	10021
-240	2	2
-66	1	1
-228	1	1
-23	1	1
-1612	1	1
-21	1	1
-261	1	1
-99	1	1
-128	1	1
-15	1	1
-77	9	9
-618	8	8
-84	4	6
-438	1	1
-140	1	1
-158	4	3
-277	12	12
-165	4	4
-36	1	1
-253	1	1
-59	1	1
-910	0	1
-915	4	5
-276	15	15
-682	1	1
-28	1	1
-1483	13	13
-203	1	0
-52	1	1
-48	1	1
-229	12	12
-68	15	15
-83	1	1
-39	1	1
-194	1	1
-24	1	1
-251	8	8
-619	0	4
-15	1	1
-690	1	1
-28	1	1
-54	0	1
-463	1	1
-30	1	1
-449	1	1
-54	1	1
-58	5	5
-979	1	0
-318	1	1
-28	1	1
-898	10	10
-100	1	1
-22	1	1
-446	1	1
-74	1	1
-273	1	1
-19	1	1
-333	1	1
-44	1	1
-220	1	1
-56	2	0
-209	1	1
-70	1	1
-223	0	20
-220	1	1
-31	1	1
-56	1	1
-111	1	1
-220	1	1
-89	1	1
-119	1	1
-113	2	0
-195	1	1
-46	1	1
-184	1	1
-60	0	4
-76	0	4
-53	3	1
-43	1	1
-153	1	1
-53	1	1
-195	6	0
-60	1	1
-278	1	0
-42	1	1
-124	10014	10005
-302	1	1
-24	1	1
-135	20	19
-55	1	1
-40	1	1
-175	1	1
-46	1	1
-52	1	1
-19	1	1
-277	1	1
-88	1	1
-172	1	1
-26	1	1
-129	1	1
-35	1	1
-55	9	9
-318	3	3
-46	1	1
-101	8	8
-4653	1	1
-38	1	1
-817	2	0
-256	1	1
-27	1	1
-339	1	1
-48	1	1
-54	10	10
-1393	3	0
-1491	2	0
-1983	16	0
-167	0	4
-3886	7	8
-535	1	1
-16	1	1
-1555	3	0
-3131	1	1
-17	1	1
-4196	1	0
-14974	0	1
-3514	0	4
-29	1	1
-123	0	2
-51	33	0
-121	0	133
-80	1	10
-26	60	4
-52	13	0
-20	0	2
-19	2	0
-22	4	156
-57	156	3
-61	0	2
-29	20	0
-42	11	0
-21	2	0
-50	4	6
-31	1	3
-23	1	53
-25	0	32
-66	1	55
-11	0	2
-13	0	41
-68	1	42
-23	1	3
-12	2	0
-17	1	29
-51	17	13
-18	2	0
-28	2	0
-26	2	0
-158	1	25
-102	0	82
-99	280	0
-53	21	0
-5064	0	2
-7569	2	0
-2189	0	1
-85	1	1
-31	0	4
-399	14	14
-408	0	1
-681	0	5
-184	1	1
-20	1	1
-64	1	1
-29	1	0
-9	2	0
-442	4	0
-342	1	1
-24	1	1
-131	1	1
-198	1	1
-370	0	1
-34	1	1
-447	21	20
-259	1	1
-23	0	1
-121	2	0
-2257	1	1
-22	1	1
-811	1	1
-27	1	1
-95	18	18
-631	0	5
-843	0	2889
-55	0	88
-1189	0	2
-2274	1	0
-752	4	0
-164	1	1
-55	1	1
-1033	10	10
-683	1	1
-57	1	1
-3578	1	1
-34	1	1
-1446	1	0
-460	1	1
-31	0	1
-6	1	1
-163	1	1
-22	1	1
-81	1	1
-27	1	1
-548	1	1
-61	1	1
-1169	1	1
-41	1	1
-1568	14	14
-4889	1	1
-62	1	1
-530	17	17
-394	1	1
-40	7	0
-57	12	12
-69	2	2
-39	1	1
-70	1	1
-22	0	3
-2307	1	1
-30	1	1
-411	1	1
-104	1	1
-375	26	27
-1218	1	1
-35	1	1
-85	1	1
-20	6	0
-687	1	1
-34	1	1
-268	13	13
-74	1	1
-47	2	0
-69	1	1
-49	1	1
-73	1	1
-48	1	1
-218	1	1
-42	1	1
-197	1	1
-41	1	1
-313	1	1
-40	1	1
-476	1	1
-29	1	1
-185	1	1
-35	1	1
-594	1	1
-24	1	1
-220	26	0
-245	0	1
-261	13	13
-89	1	1
-90	1	1
-224	1	1
-201	1	1
-306	1	1
-29	5	5
-121	1	1
-31	1	1
-109	1	1
-25	1	1
-168	1	1
-19	1	1
-93	12	11
-132	1	0
-113	1	1
-30	1	1
-56	9	9
-300	1	1
-50	2	2
-96	1	1
-43	1	1
-76	1	1
-44	1	1
-197	1	1
-91	7	1
-119	0	9
-392	5	5
-89	1	1
-428	11	11
-260	1	1
-23	1	0
-10	1	1
-70	1	1
-65	2	0
-16	0	19
-28	1	1
-208	1	1
-70	1	1
-149	0	3
-51	29	29
-163	1	1
-55	1	1
-63	17	17
-1208	1	1
-98	1	1
-162	1	1
-45	1	1
-148	14	14
-51	5	5
-209	4	4
-1242	1	1
-42	5	0
-87	1	1
-522	0	3
-305	0	1
-1379	0	2
-390	0	15
-72	1	1
-16	1	1
-270	1	0
-280	7	7
-2763	20	20
-674	10	10
-1375	14	0
-327	2	0
-107	1	1
-629	16	16
-54	4	4
-680	16	16
-395	1	1
-42	1	1
-1763	1	1
-46	1	1
-282	1	1
-39	1	1
-860	1	1
-26	1	1
-745	0	2
-2081	2	0
-817	4	4
-202	1	1
-48	1	1
-168	1	1
-53	1	1
-379	10	10
-1178	14	14
-132	5	0
-555	1	1
-65	1	1
-550	1	1
-21	1	1
-462	1	1
-43	1	1
-121	1	1
-48	0	3
-15	1	5
-1404	0	1
-450	4	0
-626	1	0
-304	1	1
-39	1	1
-564	1	1
-45	1	1
-303	2	0
-409	1	1
-18	1	0
-858	2	0
-2168	0	1
-54	1	1
-20	1	1
-524	0	1
-410	10	10
-106	1	14
-2419	18	14
-64	1	1
-31	1	1
-185	0	5
-1646	1	1
-20	1	1
-227	1	1
-37	1	1
-500	1	0
-136	3	4
-8239	1	1
-23	1	1
-1114	0	2
-688	0	1
-901	18	18
-4781	0	4
-815	0	1
-5069	0	5
-415	0	2
-352	0	1
-1085	11	11
-1099	0	1
-991	0	1
-845	1	1
-32	0	2
-5751	0	3
-1553	1	1
-60	1	1
-278	0	1
-30	1	1
-1855	0	2
-958	0	1
-66	0	16
-2109	0	2
-1265	0	1
-17312	0	4
-1875	0	1
-2157	1	0
-915	0	6
-4940	1	0
-2649	0	1
-3331	2	0
-2276	14	0
-3128	0	4
-3496	1	0
-966	0	1
-3597	1	0
-1647	0	3
-1182	1	0
-654	0	3
-2049	1	0
-6838	1	1
-39	1	1
-186	1	0
-2718	1	1
-30	1	1
-160	11	11
-4954	0	1
-420	1	1
-123	1	1
-156	0	4
-219	4	0
-195	1	0
-4402	2	0
-4295	1	0
-4207	20	20
-468	0	1
-30	1	1
-6025	1	0
-4179	1	0
-19834	0	1
-11605	0	1
-4121	2	0
-2863	0	2
-4890	1	0
-5576	0	6
-4104	4	0
-19858	4	0
-1616	0	3
-1647	4	1
-36	0	12
-2213	0	14
-414	0	1
-458	20	20
-2860	0	3
-678	3	4
-292	2	0
-1922	0	1
-913	0	1
-2720	1	0
-1111	3	0
-2589	0	8
-9425	1	0
-1403	0	2
-1964	0	12
-4433	0	1
-1569	0	1
-7209	1	1
-41	1	1
-2257	1	0
-3001	0	1
-1845	1	0
-1593	0	1
-497	0	2
-6109	0	1
-2019	2	0
-921	0	1
-241	1	0
-5473	1	0
-2213	2	0
-1974	8	0
-4952	0	1
-6146	2	0
-953	1	0
-4141	0	1
-4244	5	0
-152	0	2
-209	0	1
-2400	0	10
-785	2	0
-1733	0	1
-554	1	0
-128	0	2
-3051	0	1
-8577	0	1
-1503	0	1
-1705	0	3
-2052	17	17
-998	177	0
-2804	1	0
-1925	1	0
-9215	0	1
-971	8	0
-36021	1	0
-8016	29	27
-3890	0	1
-67913	1	1
-18	1	6368
-73	1	32739
-14676	1	1
-19	1	1
-22867	1	1
-20	1	1
-5638	5	0
-47	12	0
-11313	0	1
-1769	0	1
-8355	0	3
-4114	0	2
-1403	1	0
-5140	0	1
-490	0	1
-219	1	0
-3483	1	0
-8939	1	1
-44	1	1
-10813	0	2
-7480	2	0
-617	1	0
-1464	0	1
-500	0	2
-1466	1	0
-527	5	0
-3593	0	1
-374	0	1
-2946	22	22
-698	0	1
-2149	1	0
-311	2	0
-6570	1	0
-962	1	0
-23	1	1
-2647	4	0
-588	1	1
-21	1	1
-3256	28	20
-870	0	1
-644	1	0
-602	2	1
-3730	1	1
-45	1	1
-12848	7	7
-7306	0	3
-6647	45	45
-1365	1	1
-63	1	1
-4166	1	0
-1887	10	0
-2949	1	1
-31	0	1
-669	1	0
-2190	2	0
-2081	0	2
-373	0	6
-421	4	4
-1460	0	1
-1699	0	8
-2882	2	0
-147	0	1
-1656	1	1
-27	1	1
-1828	0	2
-4066	35	38
-361	17	17
-1254	6	0
-1643	0	2
-2542	0	1
-848	2	1
-2117	0	2
-119	1	1
-44	1	1
-1104	0	1
-415	0	12
-634	18	1
-377	6	7
-227	6	0
-449	13	13
-895	0	17
-457	18	18
-663	0	3
-382	1	1
-26	1	1
-135	0	1
-105	1	1
-25	1	1
-620	2	0
-290	5	5
-375	1	1
-30	0	4
-98	1	0
-20	17	4
-3824	28	0
-39	4	0
-28	4	0
-44	4	0
-1898	9	9
-221	0	2
-10522	30	0
-783	1	1
-59	1	1
-94	1	1
-21	1	1
-491	1	1
-49	1	1
-289	2	0
-120	0	1
-37	1	1
-112	1	1
-21	1	1
-183	16	16
-73	2	0
-1007	1	1
-38	0	1
-79	1	1
-48	1	1
-561	1	1
-29	1	1
-145	5	5
-576	12	12
-834	1	0
-846	5	7
-34	1	1
-417	10	11
-55	1	1
-40	1	1
-110	1	1
-47	1	1
-351	1	1
-69	1	1
-53	1	1
-91	1	1
-260	1	1
-36	0	1
-604	1	0
-169	0	1
-2118	1	1
-34	1	1
-147	1	1
-213	1	1
-67	1	1
-31	1	1
-566	1	0
-17	1	1
-763	1	1
-34	1	1
-671	5	0
-41	2	2
-98	0	1
-449	0	2
-61	1	1
-38	1	1
-202	1	1
-44	1	1
-190	1	0
-46	4	4
-51	0	4
-476	1	1
-17	1	1
-212	1	1
-26	1	1
-485	1	1
-25	1	1
-263	1	1
-26	1	1
-1327	4	0
-44	1	0
-2397	1	1
-44	1	1
-4146	14	14
-901	0	1
-1769	14	14
-1721	1	0
-1125	1	0
-254	1	0
-427	0	1
-30	1	1
-111	0	2
-52	0	8
-528	44	0
-969	1	1
-10	1	0
-28	1	1
-140	1	1
-43	1	1
-1989	2	1
-598	1	1
-87	0	4
-124	1	0
-4840	1	1
-28	7	4
-505	0	2
-24	1	1
-5134	4	0
-543	1	0
-18	1	1
-97	1	1
-29	1	3
-101	6	0
-148	13	7
-1346	0	1
-128	7	0
-49	0	1
-876	2	0
-286	5	5
-184	0	1
-84	5	5
-365	9	9
-981	1	1
-11	1	1
-734	4	0
-563	4	0
-244	9	9
-379	1	1
-17	1	1
-49	2	0
-95	1	1
-30	1	1
-147	1	1
-37	0	6
-340	1	2
-58	1	1
-332	0	2
-233	6	9
-156	0	1
-26	1	1
-439	4	0
-34	0	2
-508	5	0
-96	1	1
-34	1	1
-1267	63	63
-590	1	1
-24	4	5
-1055	13	13
-135	0	1
-194	1	1
-61	1	1
-384	6	6
-2756	1	1
-19	1	1
-99	15	15
-1754	2	3
-2238	1	1
-31	1	1
-3002	4	0
-2156	15	15
-855	14	13
-442	5	5
-2022	6	6
-506	0	2
-1110	0	1
-2578	0	2
-4864	1	1
-36	1	0
-3187	1	1
-16	1	1
-184	1	1
-18	1	1
-1636	0	7
-23	1	1
-527	1	1
-39	1	1
-653	3	0
-227	1	1
-18	1	1
-102	7	7
-109	0	323
-91	1	0
-124	0	15
-621	0	4
-553	12	12
-463	1	1
-40	1	1
-372	1	1
-25	1	1
-188	12	12
-357	0	1
-250	0	5
-4193	0	4
-967	1	1
-76	1	1
-3236	4	4
-529	7	7
-246	4	0
-160	1	1
-34	0	3
-1469	0	2
-499	1	0
-937	1	1
-45	1	1
-356	71	65
-2127	0	1
-491	1	0
-80	1	1
-72	2	0
-255	6	6
-728	14	11
-702	3	0
-290	0	2
-210	19	1
-473	1	1
-42	4	0
-219	0	1
-348	1	1
-83	1	1
-851	0	16
-72	13	0
-246	1	1
-47	4	0
-410	1	0
-93	0	12
-225	0	16
-428	1	0
-4	6	0
-324	0	1
-3060	0	16
-1305	1	1
-29	1	1
-3094	0	7
-600	0	2
-5495	1	1
-47	1	1
-1247	49	55
-4351	1	1
-15	1	1
-2011	6	14
-8378	2	0
-295	0	17
-4583	1	0
-4132	0	4
-924	4	3
-1751	0	2
-1060	12	12
-380	0	2
-425	8	0
-84	0	1
-244	1	1
-28	1	1
-221	4	0
-348	1	1
-37	11	11
-50	1	1
-180	1	1
-348	1	1
-20	1	1
-1714	1	1
-79	1	1
-729	1	1
-44	1	0
-78	1	1
-112	1	1
-23	1	1
-55	9	9
-1044	1	1
-27	1	1
-494	1	1
-32	1	1
-237	1	1
-27	1	1
-1422	4	4
-413	7	1
-710	8	0
-185	0	2
-966	1	0
-13	15	1
-251	1	1
-47	1	1
-285	1	1
-103	1	1
-977	1	1
-41	1	0
-97	1	1
-131	1	0
-307	1	1
-47	1	1
-1070	1	1
-69	1	1
-382	0	1
-167	1	1
-35	1	1
-161	1	1
-30	1	1
-1068	18	0
-1173	1	1
-32	1	1
-59	1	1
-12	1	0
-18	1	1
-55	0	22
-72	1	1
-2806	1	1
-15	1	1
-1395	1	0
-157	13	0
-536	8	8
-101	1	1
-21	1	1
-147	8	8
-638	1	1
-18	1	1
-183	15	15
-990	0	12
-21	1	1
-145	0	1
-332	1	1
-31	1	1
-231	22	5
-39	1	1
-414	9	9
-93	1	1
-63	1	1
-739	0	2
-632	1	1
-74	1	1
-138	5	5
-128	0	1
-294	1	1
-45	1	1
-679	6	6
-1756	0	34
-560	27	27
-1608	5	0
-219	1	1
-134	0	3
-81	1	1
-82	0	1
-357	1	1
-28	1	1
-670	7	9
-270	0	1
-891	13	33
-257	4	0
-80	0	4
-130	2	0
-2504	42	42
-1226	1	1
-44	1	1
-2256	0	1
-80	12	0
-5544	1	0
-428	13	13
-77	4	4
-63	1	1
-64	13	19
-178	10023	10000
-157	3	3
-109	1	1
-180	1	1
-56	1	1
-169	1	0
-93	1	1
-33	2	2
-72	1	1
-30	1	1
-267	25	25
-65	1	1
-19	2	0
-108	27	27
-218	1	1
-37	1	1
-477	11	11
-93	1	1
-30	7	5
-242	0	1
-171	1	1
-29	1	1
-218	0	9
-241	1	1
-55	4	4
-88	1	1
-99	1	1
-57	0	1
-523	12	16
-399	1	1
-50	1	1
-389	1	1
-71	4	4
-173	12	12
-92	1	1
-20	1	1
-132	0	5
-15	1	1
-75	1	1
-26	5	5
-119	11	11
-542	1	1
-23	2	2
-254	1	1
-34	1	1
-172	1	1
-45	1	1
-95	11	11
-127	23	23
-64	1	1
-95	1	1
-390	1	1
-52	1	1
-170	1	1
-16	5	0
-30	1	1
-599	1	1
-119	1	1
-85	1	1
-75	1	1
-286	4	4
-61	1	1
-286	9	9
-429	1	1
-21	1	1
-53	1	1
-44	1	1
-77	165084	190027
-5156	0	1
-1680	1	1
-88	1	1
-4502	0	1
-46	1	1
-800	4	4
-23	1	1
-1305	2	0
-136	0	1
-4941	0	1
-547	0	1
-70	8	8
-293	1	1
-35	1	1
-1165	4	0
-6662	1	1
-121	1	1
-92	0	8
-214	1	1
-35	1	1
-108	1	0
-1063	0	1
-1017	1	1
-20	0	6
-1725	0	1
-150	5	5
-33	1	0
-12	1	1
-349	1	1
-24	0	1
-1562	1	1
-31	1	1
-2513	0	1
-73	36	36
-305	1	1
-27	1	1
-543	1	1
-47	4	28
-4874	0	3
-599	10	10
-137	1	0
-7	0	4
-54	1	1
-2497	1	1
-166	1	1
-637	3	3
-46	1	1
-74	4	4
-414	1	1
-48	1	1
-75	4	4
-153	0	26
-93	1	1
-39	1	0
-58	1	1
-51	1	1
-145	9	9
-29	1	1
-55	1	1
-427	1	0
-141	1	1
-87	1	1
-20	1	1
-89	3	3
-141	18	5
-48	1	1
-87	14	14
-173	1	1
-68	1	1
-54	1	1
-51	4	0
-22	1	0
-52	1	1
-171	1	1
-109	3	1
-6	0	2
-205	1	1
-54	10064	10083
-76	3	1
-197	15	15
-77	1	1
-70	1	1
-178	1	1
-60	1	1
-210	1	1
-28	1	1
-62	1	1
-33	1	1
-70	0	1
-202	1	1
-60	1	1
-106	2	0
-176	1	1
-79	0	1
-50	1	1
-50	3	3
-207	1	1
-272	5	5
-243	1	1
-84	1	1
-98	1	1
-50	5	5
-77	1	1
-74	1	1
-20	0	1
-143	1	1
-45	0	1
-4	1	1
-1088	1	1
-35	1	1
-320	1	1
-22	1	1
-275	1	1
-47	1	1
-370	19	19
-119	1	6
-51	1	1
-21	1	1
-244	0	1
-345	1	1
-24	1	1
-181	1	1
-61	3	3
-542	1	1
-16	1	1
-312	1	0
-353	4	3
-279	323	0
-86	1	1
-49	1	1
-342	1	1
-44	0	2
-222	1	1
-37	1	1
-588	8	8
-593	47	47
-359	1	1
-25	1	1
-2054	1	0
-2510	1	0
-5040	11	12
-1489	9	9
-3292	1	0
-1449	1	1
-21	1	1
-6768	1	0
-706	2	0
-7107	1	1
-38	1	1
-1163	1	1
-35	1	1
-435	1	1
-60	1	1
-325	0	1
-254	1	1
-43	1	1
-210	1	1
-7	1	0
-47	1	1
-130	4	4
-34	1	1
-208	1	1
-39	2	2
-526	1	1
-36	1	1
-99	9	7
-20	1	1
-73	1	1
-62	1	1
-425	1	1
-43	1	1
-811	1	1
-38	1	1
-362	1	1
-49	1	1
-109	1	1
-19	1	1
-79	1	1
-29	0	1
-26	1	1
-252	1	1
-75	1	1
-441	1	1
-66	1	1
-389	13	13
-67	7	7
-1185	0	311
-64	6	6
-389	31	31
-247	1	1
-38	1	1
-79	1	0
-553	1	1
-30	1	1
-433	1	1
-16	3	0
-1133	12	12
-262	5	5
-276	1	0
-960	14	14
-272	1	1
-41	1	1
-196	1	0
-1424	18	19
-314	1	1
-22	1	1
-345	1	1
-23	3	0
-245	1	1
-78	1	1
-77	1	1
-779	1	1
-32	1	1
-247	1	1
-48	1	1
-778	2	0
-226	1	1
-61	1	1
-867	0	1
-53	1	1
-397	1	1
-12	4	0
-46	1	1
-602	1	1
-35	1	1
-422	1	1
-49	1	1
-789	1	1
-37	1	1
-268	0	2
-589	8	8
-366	12	20
-1651	2	7
-19	1	1
-417	1	1
-37	1	1
-812	1	1
-33	3	0
-1351	18	18
-2186	1	1
-86	1	1
-1433	1	1
-39	1	1
-83	0	1
-238	0	1
-171	1	1
-7	2	1
-67	1	1
-596	1	1
-29	1	1
-144	4	6
-417	1	0
-88	1	1
-24	1	1
-390	18	18
-496	14	21
-145	1	1
-46	1	1
-310	1	1
-35	1	1
-214	1	1
-38	1	1
-206	1	1
-37	1	0
-240	1	1
-32	1	1
-469	1	1
-32	1	1
-208	1	1
-21	1	1
-343	1	1
-17	1	1
-88	1	1
-58	6	0
-169	1	1
-22	1	1
-162	0	1
-196	0	2
-500	6	5
-108	1	1
-40	2	0
-50	1	1
-111	1	0
-21	0	1066
-175	5	5
-155	1	1
-44	1	1
-11005	0	1
-6280	1	1
-48	1	1
-1173	1	1
-19	1	1
-2664	0	1
-351	1	0
-1059	14	14
-593	0	1
-869	16	16
-23065	2	0
-2197	0	1
-949	0	1
-15048	0	1
-606	1	0
-7820	0	4
-14669	1	0
-14708	0	1
-16326	0	1
-304	18	18
-388	2	0
-194	1	1
-49	1	1
-262	0	1
-92	1	1
-10677	2	0
-4856	3	0
-7447	6	6
-421	1	0
-884	6	0
-17	1	0
-3075	1	0
-1610	12	12
-13049	3	1
-3762	2	0
-601	2	0
-2461	0	2
-5154	1	0
-1604	0	16
-3338	26	26
-225	0	1
-1488	1	0
-1196	0	2
-683	0	1
-1218	1	0
-221	1	1
-22	1	1
-296	4	4
-1456	23	41
-880	1	12
-2490	1	0
-151	1	1
-33	1	1
-2809	4	4
-3645	1	1
-17	1	1
-3496	2	0
-154	1	1
-29	1	1
-158	0	1
-5981	1	1
-32	1	1
-1041	0	2
-174	9	0
-1383	0	1
-389	1	2
-1570	2	0
-3993	4	0
-4576	87	87
-142	8	8
-2203	20	24
-2009	1	1
-39	1	1
-489	1	1
-17	1	1
-628	1	1
-124	1	1
-1607	1	1
-23	1	1
-1021	0	8
-1249	0	20
-46	0	32
-46	6	0
-24	0	10
-7679	1	1
-44	1	1
-580	1	1
-28	1	1
-264	1	1
-65	0	1
-15	1	1
-1513	28	28
-830	19	19
-57	1	1
-21	1	1
-231	1	1
-94	1	1
-105	1	1
-208	5	5
-124	1	1
-112	3	3
-207	1	1
-38	1	1
-244	1	1
-60	1	1
-98	1	1
-50	1	1
-256	29	29
-157	1	1
-33	1	1
-143	1	1
-59	1	1
-51	1	1
-45	1	0
-73	1	1
-81	1	1
-270	1	1
-272	1	1
-232	1	1
-94	1	1
-3189	0	176
-834	0	35
-303	0	51
-321	1	0
-17170	0	1
-321	1	1
-25	1	1
-679	1	1
-33	1	1
-990	11	11
-131	8	8
-79	9	9
-1284	9945	10022
-2039	8	23
-491	1	1
-32	1	1
-85	1	1
-41	1	1
-480	1	1
-74	2	2
-1108	59	0
-70	10	10
-325	11	11
-879	1	1
-34	1	1
-524	1	1
-25	1	1
-202	17	17
-1154	1	1
-26	1	1
-89	17	17
-87	1	1
-39	1	1
-950	1	1
-15	2	2
-51	1	1
-81	1	1
-180	1	0
-187	1	1
-37	1	1
-467	1	1
-19	1	1
-755	0	2
-81	3	1
-16	1	1
-67	6	6
-84	1	1
-37	2	0
-31	0	28
-15	0	37
-266	14	14
-372	1	1
-68	1	1
-462	1	1
-46	1	1
-563	19	0
-217	9	9
-363	1	1
-22	1	1
-884	1	1
-40	1	1
-179	1	1
-42	1	1
-94	6	6
-922	1	1
-30	1	1
-481	0	3
-7925	15	11
-333	5	0
-1235	6	6
-355	1	1
-27	1	1
-515	1	0
-1077	11	0
-1521	1	0
-38	1	1
-119	1	1
-58	1	1
-63	4	3
-385	1	1
-49	1	1
-77	44	46
-87	11	11
-190	2	2
-45	1	1
-373	1	1
-47	1	1
-77	10	10
-186	1	1
-24	1	1
-1140	1	0
-214	1	1
-34	1	1
-89	1	1
-36	1	1
-288	0	1
-544	0	331
-320	1	0
-199	1	1
-16	1	1
-112	1	1
-29	1	1
-783	0	3
-311	1	1
-38	1	1
-59	1	1
-68	1	1
-52	1	1
-98	1	1
-166	7	7
-698	1	1
-68	1	1
-165	0	1
-114	1	1
-92	0	1
-14	1	1
-215	1	1
-81	1	1
-792	1	1
-31	1	1
-54	1	1
-44	1	1
-179	1	1
-26	1	1
-200	1	1
-30	1	1
-639	7	7
-505	40	42
-549	12	0
-19	1	1
-2184	1	0
-840	1	1
-69	1	1
-966	21	21
-33	12	0
-56	1	1
-94	1	1
-237	11	9
-189	1	1
-47	1	1
-318	3	0
-80	1	1
-94	5	1
-32	1	1
-126	16	16
-83	1	1
-47	1	1
-104	6	5
-56	1	1
-68	1	1
-417	12	13
-636	0	2
-30	1	1
-694	0	4
-95	1	1
-28	1	1
-1358	1	1
-19	1	1
-68	1	1
-97	1	1
-155	15	15
-323	1	7
-158	2	0
-42	6	0
-59	1	1
-314	14	14
-94	1	1
-64	1	1
-637	1	1
-21	1	1
-144	2	1
-229	11	5
-410	1	1
-96	1	1
-272	1	1
-22	1	1
-118	1	1
-44	1	1
-96	1	1
-48	1	1
-414	22	22
-373	13	13
-554	1	1
-87	10	0
-313	1	1
-37	1	1
-122	17	18
-179	1	1
-40	1	1
-591	8	8
-129	1	0
-70	1	1
-71	1	0
-73	10	6
-12	1	1
-203	0	6
-24	2	0
-45	4	0
-46	1	1
-186	9	9
-87	1	1
-28	1	1
-3625	0	1
-71	1	1
-126	1	1
-34	1	1
-532	0	2
-696	2	0
-555	1	7
-287	1	1
-30	0	3
-946	0	1
-88	1	1
-60	12	0
-12546	1	1
-37	1	0
-2071	0	1
-1253	9	9
-2003	0	1
-24677	0	2
-6212	1	1
-26	1	1
-816	0	4
-13602	18	15
-2375	2	0
-1957	2	0
-2394	6	0
-1561	0	1
-2805	4	0
-12333	8	0
-835	0	1
-426	0	27
-12156	0	18
-6903	2	0
-21807	3	0
-1588	1	0
-2605	1	1
-23	1	1
-11252	8	0
-298	6	7
-946	2	0
-232	0	1
-501	1	0
-4748	0	4
-770	0	7
-914	0	1
-295	1	0
-214	3	0
-121	0	1
-784	0	1
-2512	0	1
-4476	3	0
-926	0	1
-189	2	0
-3543	2	0
-893	1	1
-46	1	1
-1296	0	1
-153	0	1
-336	5	0
-228	1	1
-45	1	1
-207	3	0
-322	0	1
-658	1	0
-1516	3	0
-1025	0	13
-1518	0	1
-591	10	10
-3384	0	2
-182	12	0
-328	1	0
-301	0	1
-994	1	1
-18	0	6
-1743	0	1
-2350	22	23
-1548	0	7
-1976	1	0
-199	0	1
-5922	12	12
-873	0	3
-3080	12	8
-322	1	0
-490	1	0
-3602	1	0
-482	1	0
-3178	1	0
-5157	0	10
-753	0	1
-885	20	0
-1746	10	0
-4045	6	1
-3520	5	13
-2048	0	1
-3529
-
-chain 323865 chr6_cox_hap1 4731698 + 1267152 1270823 chr12 133851895 - 763369 785145 206180
-2772	0	815
-201	0	17291
-643	1	0
-54
-
-chain 65284 chr6_cox_hap1 4731698 + 2460102 2460796 chr6 171115067 - 140105134 140105832 1936071
-178	0	4
-516
-
-chain 59092 chr6_cox_hap1 4731698 + 4004481 4005101 chr4 191154276 + 48364786 48365406 2142970
-620
-
-chain 52987 chr6_cox_hap1 4731698 + 2674042 2675969 chr3 198022430 - 151830192 151832103 2402006
-102	557	556
-77	395	393
-169	221	221
-81	15	15
-81	35	35
-55	44	31
-95
-
-chain 40067 chr6_cox_hap1 4731698 + 3843208 3843655 chr1 249250621 - 189436883 189437330 3283815
-379	3	3
-65
-
-chain 34258 chr6_cox_hap1 4731698 + 2746095 2746514 chrX 155270560 - 17905933 17906346 3956727
-73	15	15
-155	1	1
-20	6	0
-17	1	1
-131
-
-chain 30865 chr6_cox_hap1 4731698 + 3996373 3996892 chr6 171115067 + 32713281 32713770 4500603
-73	89	59
-184	77	77
-96
-
-chain 30808 chr6_cox_hap1 4731698 + 1446736 1447059 chr11 135006516 - 73898390 73898713 4511271
-323
-
-chain 29563 chr6_cox_hap1 4731698 + 4089902 4090211 chr1 249250621 - 75305559 75305868 4853755
-309
-
-chain 29490 chr6_cox_hap1 4731698 + 3888227 3888535 chr20 63025520 - 21266962 21267270 4884719
-308
-
-chain 23990 chr6_cox_hap1 4731698 + 1313393 1314169 chr7 159138663 - 51241795 51242737 7706852
-178	101	101
-72	385	551
-40
-
-chain 19279 chr6_cox_hap1 4731698 + 2759716 2759948 chr5 180915260 + 25289600 25289832 11061062
-91	17	17
-124
-
-chain 18106 chr6_cox_hap1 4731698 + 3844292 3845362 chr7 159138663 + 50640514 50641583 3599691
-33	446	444
-74	250	251
-5	55	55
-48	69	69
-90
-
-chain 17763 chr6_cox_hap1 4731698 + 3840247 3840451 chr6 171115067 - 2083149 2083361 12325354
-52	0	8
-26	2	2
-124
-
-chain 17263 chr6_cox_hap1 4731698 + 3890221 3890428 chr4 191154276 + 3927369 3927573 12785973
-50	3	0
-26	4	4
-124
-
-chain 16283 chr6_cox_hap1 4731698 + 3267732 3267909 chr2 243199373 + 128545205 128545381 580296
-28	2	1
-147
-
-chain 16000 chr6_cox_hap1 4731698 + 3842640 3845155 chr5 180915260 - 144997615 145000132 3598025
-127	1430	1431
-95	205	207
-98	29	29
-57	419	418
-55
-
-chain 15874 chr6_cox_hap1 4731698 + 2744265 2744697 chr6 171115067 + 31304784 31305225 14156555
-58	158	158
-72	76	85
-68
-
-chain 15671 chr6_cox_hap1 4731698 + 1306242 1307477 chr6 171115067 - 139875690 139876935 14366990
-56	408	416
-54	620	622
-97
-
-chain 15351 chr6_cox_hap1 4731698 + 2791400 2791601 chr11 135006516 + 74748600 74748801 14697621
-99	26	26
-76
-
-chain 14920 chr6_cox_hap1 4731698 + 2791114 2791352 chr12 133851895 + 56894984 56895263 15150280
-65	69	110
-104
-
-chain 14203 chr6_cox_hap1 4731698 + 4000567 4000717 chr6 171115067 - 148948255 148948405 15963295
-150
-
-chain 14065 chr6_cox_hap1 4731698 + 3901987 3902139 chr6 171115067 - 138602057 138602209 16122340
-152
-
-chain 13939 chr6_cox_hap1 4731698 + 2790912 2791061 chr15 102531392 - 60147333 60147482 16276423
-149
-
-chain 13590 chr6_cox_hap1 4731698 + 4000399 4000543 chr2 243199373 + 178345068 178345212 16711221
-144
-
-chain 13240 chr6_cox_hap1 4731698 + 3909742 3911000 chr6 171115067 + 32548108 32549235 17164167
-52	422	421
-78	652	522
-54
-
-chain 12556 chr6_cox_hap1 4731698 + 1348680 1348819 chr2 243199373 - 184149574 184149713 18162971
-139
-
-chain 12225 chr6_cox_hap1 4731698 + 3890501 3890631 chr13 115169878 - 44980182 44980312 18662730
-130
-
-chain 12178 chr6_cox_hap1 4731698 + 3972449 3972615 chr14 107349540 - 58393926 58394091 18734378
-55	26	25
-85
-
-chain 12008 chr6_cox_hap1 4731698 + 3896810 3896939 chr8 146364022 + 49154427 49154556 18990652
-129
-
-chain 11746 chr6_cox_hap1 4731698 + 1299553 1299701 chr7 159138663 - 7702899 7703047 19437477
-54	14	14
-80
-
-chain 11718 chr6_cox_hap1 4731698 + 299537 299697 chr13 115169878 + 54026210 54026329 7331663
-62	41	0
-40	13	13
-4
-
-chain 11503 chr6_cox_hap1 4731698 + 3894886 3895312 chr11 135006516 - 111045874 111046295 19852909
-57	287	282
-82
-
-chain 11377 chr6_cox_hap1 4731698 + 3840583 3840825 chr11 135006516 + 57049649 57049891 20071170
-62	107	107
-73
-
-chain 10960 chr6_cox_hap1 4731698 + 3841022 3841165 chr12 133851895 - 49356794 49356937 20822626
-50	15	15
-78
-
-chain 10867 chr6_cox_hap1 4731698 + 2681465 2681622 chr6 171115067 - 132617434 132617597 20998653
-55	29	35
-73
-
-chain 10738 chr6_cox_hap1 4731698 + 3896518 3896639 chr10 135534747 + 59600699 59600817 21255898
-61	3	0
-57
-
-chain 10496 chr6_cox_hap1 4731698 + 3892569 3892679 chr1 249250621 - 174039531 174039641 21744607
-110
-
-chain 10328 chr6_cox_hap1 4731698 + 3840451 3840892 chr4 191154276 - 114078209 114078650 18698120
-15	372	372
-54
-
-chain 9881 chr6_cox_hap1 4731698 + 2734004 2734554 chr6 171115067 + 31205448 31206008 23100546
-72	423	433
-55
-
-chain 9755 chr6_cox_hap1 4731698 + 4021493 4021793 chr6 171115067 + 162490109 162490409 23390927
-65	181	181
-54
-
-chain 9560 chr6_cox_hap1 4731698 + 1301303 1301404 chr6 171115067 - 141323187 141323288 23857061
-101
-
-chain 9455 chr6_cox_hap1 4731698 + 3891953 3892158 chr6 171115067 + 32468923 32469135 24116909
-54	91	98
-60
-
-chain 9090 chr6_cox_hap1 4731698 + 2680711 2680821 chr3 198022430 - 94212956 94213066 24807216
-53	4	4
-53
-
-chain 7297 chr6_cox_hap1 4731698 + 3844000 3844124 chr8 146364022 + 96809146 96809270 3974525
-124
-
-chain 7162 chr6_cox_hap1 4731698 + 2675969 2676329 chr17 81195210 - 22005566 22005927 2836104
-7	302	303
-51
-
-chain 7031 chr6_cox_hap1 4731698 + 2673410 2673921 chr5 180915260 + 106108094 106108601 3265511
-58	376	372
-77
-
-chain 6840 chr6_cox_hap1 4731698 + 3971466 3971538 chr11 135006516 + 40011829 40011901 28544257
-72
-
-chain 6473 chr6_cox_hap1 4731698 + 3890669 3890742 chr1 249250621 - 102907635 102907704 21815173
-11	4	0
-58
-
-chain 6422 chr6_cox_hap1 4731698 + 4013834 4013902 chr6 171115067 + 32728707 32728775 29535230
-68
-
-chain 5921 chr6_cox_hap1 4731698 + 2681183 2681245 chr4 191154276 - 94306644 94306706 30842389
-62
-
-chain 5676 chr6_cox_hap1 4731698 + 2671999 2672059 chr3 198022430 + 95260601 95260661 31509897
-60
-
-chain 5595 chr6_cox_hap1 4731698 + 3972615 3972674 chr14 107349540 - 80191032 80191091 27115653
-59
-
-chain 5576 chr6_cox_hap1 4731698 + 1302171 1302230 chr18 78077248 - 3698437 3698496 31796878
-59
-
-chain 5517 chr6_cox_hap1 4731698 + 3842389 3842453 chr20 63025520 - 5368566 5368630 20848663
-64
-
-chain 5458 chr6_cox_hap1 4731698 + 3985007 3985065 chr2 243199373 + 112827415 112827473 32167738
-58
-
-chain 5421 chr6_cox_hap1 4731698 + 2677334 2677391 chr19 59128983 - 38462903 38462960 32247802
-57
-
-chain 5403 chr6_cox_hap1 4731698 + 3897499 3897556 chr12 133851895 + 59864980 59865037 32286341
-57
-
-chain 5339 chr6_cox_hap1 4731698 + 4081817 4081873 chr17 81195210 + 16805661 16805717 32499905
-56
-
-chain 5266 chr6_cox_hap1 4731698 + 4021149 4021204 chr3 198022430 + 6923000 6923055 32744278
-55
-
-chain 5103 chr6_cox_hap1 4731698 + 2743431 2743485 chr3 198022430 + 27241143 27241197 33231446
-54
-
-chain 5094 chr6_cox_hap1 4731698 + 3984745 3984799 chr6 171115067 + 67966752 67966806 33279729
-54
-
-chain 5089 chr6_cox_hap1 4731698 + 2674314 2675775 chr1 249250621 + 7474130 7475590 2473669
-98	975	974
-58	295	295
-35
-
-chain 5076 chr6_cox_hap1 4731698 + 1300901 1300955 chr11 135006516 + 101518151 101518205 33343005
-54
-
-chain 5067 chr6_cox_hap1 4731698 + 2741303 2741357 chr19 59128983 - 37393851 37393905 33368570
-54
-
-chain 5058 chr6_cox_hap1 4731698 + 3967166 3967220 chr1 249250621 - 172942963 172943017 33379585
-54
-
-chain 5020 chr6_cox_hap1 4731698 + 1345886 1345938 chr6 171115067 + 29692684 29692736 33527644
-52
-
-chain 4959 chr6_cox_hap1 4731698 + 3892516 3892569 chr18 78077248 + 5090594 5090647 22176918
-53
-
-chain 4957 chr6_cox_hap1 4731698 + 2678048 2678100 chr9 141213431 - 31846047 31846099 33735026
-52
-
-chain 4957 chr6_cox_hap1 4731698 + 3946024 3946076 chr6 171115067 + 32439356 32439408 33735182
-52
-
-chain 4930 chr6_cox_hap1 4731698 + 3894496 3894548 chrX 155270560 - 4541772 4541824 33815607
-52
-
-chain 4914 chr6_cox_hap1 4731698 + 2673741 2673793 chrX 155270560 + 7935883 7935935 17711968
-52
-
-chain 4885 chr6_cox_hap1 4731698 + 2740950 2741002 chr5 180915260 - 163072859 163072911 33995114
-52
-
-chain 4884 chr6_cox_hap1 4731698 + 2760326 2760379 chr7 159138663 + 8699184 8699237 23141527
-53
-
-chain 4821 chr6_cox_hap1 4731698 + 3935381 3935432 chr6 171115067 - 11031703 11031754 34213824
-51
-
-chain 4685 chr6_cox_hap1 4731698 + 3915703 3915753 chr12 133851895 + 112261417 112261467 34690968
-50
-
-chain 4613 chr6_cox_hap1 4731698 + 2844682 2846505 chr13 115169878 - 41386504 41386960 3856143
-33	479	279
-7	46	0
-24	11	0
-33	1097	0
-24	13	0
-56
-
-chain 4221 chr6_cox_hap1 4731698 + 2437589 2437671 chr14 107349540 + 75461679 75461839 4623812
-28	0	78
-54
-
-chain 4202 chr6_cox_hap1 4731698 + 2673968 2674023 chr3 198022430 + 156309398 156309453 19139889
-55
-
-chain 4186 chr6_cox_hap1 4731698 + 3955813 3955860 chr5 180915260 - 113986983 113987030 34971958
-47
-
-chain 4136 chr6_cox_hap1 4731698 + 2672610 2672662 chr13 115169878 + 42049101 42049153 23521137
-52
-
-chain 3978 chr6_cox_hap1 4731698 + 2673481 2673609 chrX 155270560 - 130914483 130914611 4485241
-128
-
-chain 3891 chr6_cox_hap1 4731698 + 2760039 2760115 chr16 90354753 - 58442153 58442229 17002345
-76
-
-chain 3877 chr6_cox_hap1 4731698 + 2672485 2672526 chr15 102531392 + 40275232 40275273 21164310
-41
-
-chain 3776 chr6_cox_hap1 4731698 + 2759549 2759589 chr1 249250621 - 143888892 143888932 33598889
-40
-
-chain 3639 chr6_cox_hap1 4731698 + 3890631 3890669 chr3 198022430 + 101411146 101411184 20382394
-38
-
-chain 3574 chr6_cox_hap1 4731698 + 2673146 2673184 chr3 198022430 - 173409162 173409200 29596627
-38
-
-chain 3573 chr6_cox_hap1 4731698 + 2790788 2791088 chr16 90354753 + 31183111 31183406 18086604
-58	215	210
-27
-
-chain 3489 chr6_cox_hap1 4731698 + 3842885 3842952 chrX 155270560 - 48144545 48144612 19043441
-67
-
-chain 3394 chr6_cox_hap1 4731698 + 3896482 3896518 chrX 155270560 - 4545757 4545793 28280414
-36
-
-chain 3393 chr6_cox_hap1 4731698 + 3840688 3840752 chr8 146364022 + 7016797 7016861 21522443
-64
-
-chain 3345 chr6_cox_hap1 4731698 + 1313572 1313633 chrX 155270560 - 101738888 101738949 11083842
-61
-
-chain 3209 chr6_cox_hap1 4731698 + 3842526 3842560 chr4 191154276 + 80147803 80147837 32673071
-34
-
-chain 3189 chr6_cox_hap1 4731698 + 2790872 2790912 chr11 135006516 - 131957088 131957128 22905486
-40
-
-chain 3053 chr6_cox_hap1 4731698 + 4021558 4021590 chr2 243199373 + 38182694 38182726 24706669
-32
-
-chain 3045 chr6_cox_hap1 4731698 + 2677533 2677565 chr11 135006516 - 20509488 20509520 33762261
-32
-
-chain 3033 chr6_cox_hap1 4731698 + 3842991 3843062 chr1 249250621 - 90164672 90164743 11203780
-71
-
-chain 2997 chr6_cox_hap1 4731698 + 2759644 2759694 chr16 90354753 + 47212776 47212826 11278440
-50
-
-chain 2984 chr6_cox_hap1 4731698 + 3842575 3842625 chrX 155270560 + 76422698 76422748 20248077
-50
-
-chain 2960 chr6_cox_hap1 4731698 + 3896779 3896810 chr21 48129895 + 18677639 18677670 32477029
-31
-
-chain 2845 chr6_cox_hap1 4731698 + 2673184 2673214 chr3 198022430 - 156603737 156603767 26791325
-30
-
-chain 2761 chr6_cox_hap1 4731698 + 3844406 3844465 chr6 171115067 + 18547856 18547915 4276868
-59
-
-chain 2745 chr6_cox_hap1 4731698 + 3842326 3844197 chr11 135006516 - 48638733 48640605 3968835
-61	675	676
-53	1015	1015
-67
-
-chain 2739 chr6_cox_hap1 4731698 + 2673924 2673968 chr8 146364022 + 90457478 90457522 20607564
-44
-
-chain 2729 chr6_cox_hap1 4731698 + 1302230 1302259 chr14 107349540 + 79349511 79349540 33029767
-29
-
-chain 2723 chr6_cox_hap1 4731698 + 2673793 2673825 chr5 180915260 - 70673106 70673138 18877917
-32
-
-chain 2561 chr6_cox_hap1 4731698 + 299599 299640 chr6 171115067 + 20244702 20244743 12574490
-41
-
-chain 2518 chr6_cox_hap1 4731698 + 4021649 4021704 chr16 90354753 - 20685134 20685189 24272036
-55
-
-chain 2470 chr6_cox_hap1 4731698 + 2745980 2746030 chr1 249250621 + 111776293 111776343 7607561
-50
-
-chain 2373 chr6_cox_hap1 4731698 + 2760156 2760181 chr17 81195210 - 66761411 66761436 17362234
-25
-
-chain 2319 chr6_cox_hap1 4731698 + 2900811 2900837 chr6 171115067 + 31357660 31357686 3303778
-26
-
-chain 2312 chr6_cox_hap1 4731698 + 2759490 2759549 chr4 191154276 + 98204882 98204941 18366184
-59
-
-chain 2209 chr6_cox_hap1 4731698 + 3843799 3843896 chr12 133851895 + 60159606 60159703 5400255
-97
-
-chain 2146 chr6_cox_hap1 4731698 + 1299766 1299827 chr12 133851895 + 105697047 105697108 23835468
-61
-
-chain 2140 chr6_cox_hap1 4731698 + 3840491 3840558 chr6 171115067 - 96829007 96829074 20827044
-67
-
-chain 2000 chr6_cox_hap1 4731698 + 1313744 1313777 chr4 191154276 + 153686345 153686378 8134925
-33
-
-chain 1995 chr6_cox_hap1 4731698 + 3842817 3842864 chr4 191154276 - 47817470 47817517 17212566
-47
-
-chain 1991 chr6_cox_hap1 4731698 + 2845315 2845345 chr4 191154276 - 30046978 30047008 15284842
-30
-
-chain 1990 chr6_cox_hap1 4731698 + 4008195 4011710 chr6 171115067 + 32722816 32726965 28700009
-61	2506	2690
-85	515	965
-52	103	103
-193
-
-chain 1943 chr6_cox_hap1 4731698 + 3844851 3845272 chr11 135006516 + 83226111 83226530 3906185
-58	323	321
-40
-
-chain 1927 chr6_cox_hap1 4731698 + 2759609 2759644 chr7 159138663 - 110094552 110094587 24531071
-35
-
-chain 1727 chr6_cox_hap1 4731698 + 2674522 2674583 chr20 63025520 - 53185733 53185794 4777998
-61
-
-chain 1671 chr6_cox_hap1 4731698 + 3843897 3843947 chr9 141213431 + 78317603 78317653 4355881
-50
-
-chain 1637 chr6_cox_hap1 4731698 + 2760272 2760326 chr2 243199373 + 119859185 119859239 11695157
-54
-
-chain 1632 chr6_cox_hap1 4731698 + 2673214 2673313 chr4 191154276 - 69486891 69486990 2834158
-99
-
-chain 1628 chr6_cox_hap1 4731698 + 3842952 3842991 chr2 243199373 - 116273698 116273737 14990340
-39
-
-chain 1584 chr6_cox_hap1 4731698 + 1313851 1313915 chr1 249250621 - 24961912 24961976 17607390
-64
-
-chain 1548 chr6_cox_hap1 4731698 + 2672923 2673038 chr2 243199373 - 193655574 193655689 3516324
-115
-
-chain 1509 chr6_cox_hap1 4731698 + 2674838 2674895 chr5 180915260 + 165569524 165569581 2491813
-57
-
-chain 1508 chr6_cox_hap1 4731698 + 2675985 2676708 chr6 171115067 - 141365359 141366083 3289535
-50	615	616
-58
-
-chain 1507 chr6_cox_hap1 4731698 + 2673661 2673741 chr4 191154276 + 138835824 138835904 16168846
-80
-
-chain 1489 chr6_cox_hap1 4731698 + 2845209 2846585 chrX 155270560 - 102215688 102216455 6549884
-27	1297	452
-2	0	236
-50
-
-chain 1467 chr6_cox_hap1 4731698 + 2760221 2760272 chr7 159138663 + 122232756 122232807 13147168
-51
-
-chain 1456 chr6_cox_hap1 4731698 + 3844931 3844983 chr14 107349540 + 48881293 48881345 9320615
-52
-
-chain 1452 chr6_cox_hap1 4731698 + 2673321 2674838 chrX 155270560 - 1098426 1099942 3000529
-51	1428	1427
-38
-
-chain 1354 chr6_cox_hap1 4731698 + 1313967 1314021 chr4 191154276 + 544307 544361 14282164
-54
-
-chain 1310 chr6_cox_hap1 4731698 + 3843714 3843782 chrX 155270560 + 17249549 17249617 3972308
-68
-
-chain 1307 chr6_cox_hap1 4731698 + 1498573 1498607 chr5 180915260 - 156542608 156542642 2089959
-34
-
-chain 1294 chr6_cox_hap1 4731698 + 2760418 2760473 chr4 191154276 + 147516497 147516552 12285122
-55
-
-chain 1278 chr6_cox_hap1 4731698 + 3845015 3845082 chr15 102531392 + 92125438 92125505 4023305
-67
-
-chain 1247 chr6_cox_hap1 4731698 + 3844702 3844748 chr2 243199373 - 7511493 7511539 13743690
-46
-
-chain 1194 chr6_cox_hap1 4731698 + 2676043 2676103 chr1 249250621 + 94380187 94380247 20995710
-60
-
-chain 1160 chr6_cox_hap1 4731698 + 2676209 2676237 chrX 155270560 + 56836392 56836420 21177535
-28
-
-chain 1125 chr6_cox_hap1 4731698 + 3890818 3890886 chr8 146364022 - 86779351 86779419 20749389
-68
-
-chain 1106 chr6_cox_hap1 4731698 + 2760181 2760221 chr9 141213431 + 74027839 74027879 13331514
-40
-
-chain 1039 chr6_cox_hap1 4731698 + 2674441 2674507 chr3 198022430 - 71498815 71498881 4421669
-66
-
-chain 1033 chr6_cox_hap1 4731698 + 2676372 2676431 chr5 180915260 - 20894072 20894131 3124143
-59
-
-chain 1014 chr6_cox_hap1 4731698 + 2759961 2759990 chr10 135534747 + 69125589 69125618 23828230
-29
-
-chain 1005 chr6_cox_hap1 4731698 + 2760005 2760039 chr10 135534747 + 5299750 5299784 23898321
-34
-
-chain 982 chr6_cox_hap1 4731698 + 2759426 2759479 chr13 115169878 + 111326976 111327029 14386536
-53
-
-chain 977 chr6_cox_hap1 4731698 + 3845410 3845467 chrX 155270560 - 144584413 144584470 4043690
-57
-
-chain 963 chr6_cox_hap1 4731698 + 2674253 2676589 chr9 141213431 - 119032541 119034846 4479982
-47	2231	2200
-58
-
-chain 919 chr6_cox_hap1 4731698 + 2677255 2677315 chr4 191154276 + 45112377 45112437 22402156
-60
-
-chain 883 chr6_cox_hap1 4731698 + 3843656 3843714 chr18 78077248 + 28929278 28929336 6530663
-58
-
-chain 881 chr6_cox_hap1 4731698 + 2675038 2675098 chr5 180915260 - 79225133 79225193 14536118
-60
-
-chain 858 chr6_cox_hap1 4731698 + 2676338 2676372 chr7 159138663 - 148564023 148564057 6699557
-34
-
-chain 857 chr6_cox_hap1 4731698 + 2676103 2677646 chr4 191154276 + 171430336 171431860 18546235
-50	1412	1393
-81
-
-chain 838 chr6_cox_hap1 4731698 + 3843947 3843980 chr18 78077248 - 28720814 28720847 7914761
-33
-
-chain 819 chr6_cox_hap1 4731698 + 2673062 2673118 chr2 243199373 + 149156283 149156339 14209631
-56
-
-chain 796 chr6_cox_hap1 4731698 + 1314021 1314060 chrX 155270560 - 10752795 10752834 16687246
-39
-
-chain 747 chr6_cox_hap1 4731698 + 1314275 1314339 chr12 133851895 + 57178267 57178331 20664563
-64
-
-chain 731 chr6_cox_hap1 4731698 + 1638596 1638636 chr15 102531392 + 55738847 55738887 18753864
-40
-
-chain 704 chr6_cox_hap1 4731698 + 3842767 3842817 chr9 141213431 + 32212289 32212339 4117535
-50
-
-chain 701 chr6_cox_hap1 4731698 + 2674653 2674701 chr16 90354753 - 23821388 23821436 3556080
-48
-
-chain 679 chr6_cox_hap1 4731698 + 1313640 1313672 chr21 48129895 - 2887431 2887463 13569070
-32
-
-chain 672 chr6_cox_hap1 4731698 + 3844325 3844357 chr10 135534747 - 103351577 103351609 5595826
-32
-
-chain 661 chr6_cox_hap1 4731698 + 2676159 2676209 chr9 141213431 + 85388422 85388472 5334226
-50
-
-chain 661 chr6_cox_hap1 4731698 + 3844987 3845015 chr2 243199373 + 98215178 98215206 5611311
-28
-
-chain 650 chr6_cox_hap1 4731698 + 2672375 2672435 chr7 159138663 - 140047518 140047578 22707410
-60
-
-chain 643 chr6_cox_hap1 4731698 + 2677085 2677144 chr6 171115067 + 74793831 74793890 5895430
-59
-
-chain 604 chr6_cox_hap1 4731698 + 1314169 1314195 chrX 155270560 - 101522169 101522195 11588450
-26
-
-chain 595 chr6_cox_hap1 4731698 + 2675343 2675387 chr12 133851895 - 110550302 110550346 3606052
-44
-
-chain 571 chr6_cox_hap1 4731698 + 2672827 2672901 chr3 198022430 + 50956018 50956092 15278850
-74
-
-chain 525 chr6_cox_hap1 4731698 + 3902955 3903021 chr6 171115067 + 32474022 32474088 26162225
-66
-
-chain 485 chr6_cox_hap1 4731698 + 2671938 2671998 chr1 249250621 - 193322919 193322979 8312425
-60
-
-chain 412 chr6_cox_hap1 4731698 + 2672740 2672827 chr8 146364022 - 113140827 113140914 13566503
-87
-
-chain 395 chr6_cox_hap1 4731698 + 2846505 2846533 chrX 155270560 - 102216470 102216498 6380381
-28
-
-chain 395 chr6_cox_hap1 4731698 + 2675098 2675125 chr12 133851895 + 9999203 9999230 23891782
-27
-
-chain 347 chr6_cox_hap1 4731698 + 2671704 2671754 chr15 102531392 - 65978487 65978537 12839282
-50
-
-chain 251 chr6_cox_hap1 4731698 + 2671761 2671812 chr9 141213431 + 17677697 17677748 27279073
-51
-
-chain 184 chr6_cox_hap1 4731698 + 2672526 2672587 chrX 155270560 - 91681431 91681492 16167874
-61
-
-chain 369716150 chr6_qbl_hap2 4565931 + 0 4565931 chr6 171115067 + 28742641 33379750 32
-2350	0	1
-1750	0	2
-3815	1	0
-9743	0	2
-3960	0	4
-2109	0	2
-33	2	0
-9000	0	2
-16647	0	2
-38786	1	0
-80529	0	1
-14475	0	1
-6819	1	0
-6845	1	3
-6188	0	1
-6397	0	1
-345	1	0
-68374	2	0
-39133	39	39
-7774	7	0
-1489	1	1
-72	1	1
-2260	0	2
-10629	0	1
-1249	1	1
-195	1	1
-18132	0	1
-1324	0	2
-5438	5	0
-2061	1	0
-3982	6	6
-1725	0	1
-3153	1	0
-18	1	0
-18	1	0
-2026	1	0
-4175	10	10
-4235	18	18
-493	9	9
-4767	7	7
-1225	1	0
-8	1	1
-151	1	2
-5079	1	1
-28	1	1
-281	11	11
-1178	0	4
-685	8	0
-48	4	0
-1701	1	1
-43	5	5
-862	18	18
-58	1	1
-66	1	1
-420	1	1
-44	1	1
-680	4	4
-1675	1	1
-83	1	1
-3082	4	0
-5467	1	1
-27	0	1
-1099	16	0
-627	51	51
-1278	6	1
-129	1	1
-25	1	1
-1397	15	15
-810	1	1
-27	1	1
-1192	2	0
-7515	4	0
-979	0	3
-3406	0	2
-2340	1	1
-20	1	1
-1139	1	1
-26	1	1
-787	0	1
-1416	3	1
-22815	4	4
-126	1	0
-38	1	1
-140	1	0
-999	0	17
-56	0	15
-11759	161391	161513
-11155	0	2
-5376	0	1
-19253	1	0
-4212	1	1
-3671	1	0
-21	0	6
-4451	1	0
-27910	1	0
-9946	0	1
-11233	1	1
-32	1	1
-2238	1	1
-20	1	1
-3659	22	16
-1218	1	0
-1638	6	6
-228	1	1
-45	1	1
-2048	0	3
-461	1	0
-20759	1	0
-3778	2	1
-1268	1	0
-1511	1	1
-42	2	0
-24	1	1
-4119	22	0
-1757	1	0
-1527	1	1
-29	1	1
-1886	1	0
-10628	12	0
-46568	1	0
-18985	0	10
-1825	3	4
-5288	0	9
-1071	50	50
-1607	1	5
-722	0	1
-502	0	1
-1025	0	1
-134	14	0
-4944	0	1
-319	1	0
-6178	0	1
-2898	0	2
-143	0	1
-1775	1	0
-2123	0	1
-2715	1	0
-4901	70	66
-2884	1	0
-1362	1	0
-1233	0	8
-2134	0	1
-1042	0	1
-163	1	1
-45	1	1
-50	2	0
-64	1	1
-48	1	1
-380	0	1
-30	1	0
-30	1	1
-61	1	1
-22	1	1
-368	4	4
-319	5	7
-310	1	1
-37	3	1
-162	1	1
-194	2	0
-36	1	1
-242	9	9
-1932	1	1
-16	1	1
-528	1	1
-20	1	1
-509	0	5
-76	1	1
-21	1	1
-439	15	15
-2779	1	0
-1597	24	28
-59	12	12
-307	1	0
-516	1	0
-286	11	33
-339	5	0
-570	1	1
-37	1	1
-220	1	0
-72	1	1
-144	1	1
-48	1	1
-247	2	0
-174	9	10
-816	1	0
-940	1	1
-45	1	1
-91	3	3
-71	1	1
-291	14	14
-100	1	1
-23	1	1
-452	3	3
-85	1	1
-65	1	1
-77	1	1
-252	0	1
-129	15	15
-432	10	0
-85	1	1
-28	1	1
-189	2	1
-71	1	1
-52	8	0
-810	2	2
-63	1	1
-378	1	1
-26	1	1
-187	31	36
-966	1	1
-25	1	1
-91	12	12
-125	1	1
-38	1	1
-433	2	0
-596	1	1
-48	1	1
-465	4	4
-64	1	1
-20	1	1
-525	5	5
-237	3	8
-183	11	0
-364	4	3
-201	1	1
-42	1	1
-56	1	1
-115	1	0
-67	16	16
-244	1	1
-54	5	5
-929	1	1
-21	1	1
-126	0	3
-830	1	11
-59	1	1
-537	0	2
-24	1	1
-745	15	15
-810	1	0
-425	1	1
-89	1	1
-592	1	1
-49	1	1
-352	0	1
-142	1	1
-30	1	1
-95	1	1
-45	1	1
-227	1	1
-53	1	1
-130	1	1
-18	1	1
-138	1	1
-90	1	1
-129	41	41
-50	1	1
-79	1	1
-117	1	1
-31	1	1
-155	155	0
-34	1	1
-50	5	5
-57	1	1
-152	1	1
-30	1	1
-177	5	5
-345	1	1
-39	1	1
-504	18	18
-596	12	12
-54	1	1
-158	1	1
-164	1	1
-34	1	1
-626	15	15
-866	0	10
-1051	0	2611
-680	0	1
-1537	0	18
-75	1	0
-147	52	1
-119	0	12
-23	1	1
-1927	13	13
-1702	2	0
-3694	1	1
-18	1	1
-958	43	47
-246	2	0
-146	1	1
-49	1	1
-410	1	0
-667	1	1
-38	1	1
-362	7	1
-159	2	0
-515	2	0
-1026	1	1
-29	1	1
-249	0	6
-129	1	1
-33	4	0
-10	1	5
-1236	1	1
-20	1	1
-138	10	9
-448	0	3
-660	1	1
-28	1	1
-83	1	1
-51	1	1
-2659	1	1
-38	1	1
-424	0	1
-70	1	1
-820	1	1
-26	1	1
-1472	1	1
-21	1	1
-491	5	5
-2372	2	0
-533	6	0
-441	1	7
-1689	1	1
-26	3	4
-879	16	16
-514	0	2
-58	1	1
-350	1	0
-769	1	1
-39	1	1
-429	10	10
-134	0	4
-37	1	1
-144	8	8
-668	1	1
-22	1	1
-344	2	0
-262	2	2
-38	0	1
-70	18	18
-84	11	13
-198	0	1
-32	1	1
-74	11	15
-1255	0	2
-332	1	1
-21	1	1
-193	8	24
-34	1	1
-79	1	1
-29	1	1
-536	1	0
-308	0	1
-850	0	32
-23	1	1
-651	1	1
-22	0	3
-136	1	1
-48	1	1
-330	9	9
-1108	1	1
-98	1	1
-582	0	2
-713	7	7
-89	1	0
-293	9	8
-125	1	1
-31	1	1
-192	6	6
-171	17	17
-681	1	1
-43	1	1
-514	1	1
-68	1	1
-537	1	1
-35	1	1
-159	6	6
-778	2	2
-44	1	1
-168	0	7
-211	1	1
-42	1	1
-1253	1	1
-29	1	1
-320	1	1
-36	2	2
-55	1	2
-108	1	1
-33	1	1
-317	1	1
-35	1	1
-553	8	8
-386	1	1
-26	1	1
-540	1	1
-31	1	1
-65	0	1
-625	12	12
-313	0	1
-52	1	1
-22	1	1
-583	1	1
-49	1	1
-678	37	37
-784	3	0
-838	1	1
-19	12	0
-1129	1	1
-36	1	1
-553	8	8
-109	1	1
-45	1	1
-841	16	15
-157	1	1
-31	2	2
-204	18	19
-487	1	1
-29	1	1
-374	1	1
-67	1	1
-720	13	13
-266	10	10
-330	16	14
-413	1	1
-44	1	1
-78	6	6
-181	2	2
-36	1	1
-397	1	1
-20	1	1
-311	1	1
-48	2	2
-1298	11	11
-186	1	1
-33	1	1
-216	4	4
-35	1	1
-194	10	10
-310	1	1
-51	1	1
-136	1	1
-49	1	1
-521	1	1
-23	1	1
-242	1	1
-49	1	1
-600	1	1
-31	1	1
-413	15	15
-290	1	1
-49	1	1
-527	17	17
-340	12	11
-1025	1	0
-2572	1	1
-29	1	1
-397	2	5
-668	13	13
-541	1	1
-59	0	2
-6	1	1
-122	14	14
-51	1	1
-46	1	1
-72	5	5
-110	1	1
-76	1	1
-164	0	21
-136	1	1
-12	1	1
-66	16	16
-456	37	34
-371	7	7
-48	1	1
-194	10	10
-108	1	1
-60	1	1
-122	0	1
-48	1	1
-238	1	1
-32	0	1
-100	1	0
-72	1	0
-390	1	1
-38	1	1
-144	1	1
-27	0	4
-184	21	228
-49	1	1
-608	0	1
-152	1	1
-31	1	1
-281	8	8
-337	1	1
-45	1	1
-222	1	1
-54	1	1
-346	1	0
-44	1	1
-368	1	1
-72	1	1
-502	36	18
-63	1	1
-43	0	4
-136	1	1
-42	1	1
-80	4	4
-35	1	0
-89	1	1
-24	0	5
-829	13	13
-73	1	1
-28	14	0
-233	1	1
-42	0	3
-85	0	1
-400	1	1
-40	1	1
-538	25	25
-174	1	1
-20	1	1
-705	1	1
-26	2	2
-614	1	1
-44	1	1
-793	1	1
-16	1	1
-747	5	5
-804	1	1
-29	1	1
-166	1	1
-43	1	1
-233	1	1
-44	1	1
-507	0	3
-110	8	8
-133	1	1
-31	1	1
-165	1	1
-29	1	1
-1249	1	1
-26	4	0
-56	1	1
-67	1	1
-716	1	1
-46	0	1
-16	1	1
-174	1	1
-96	1	1
-141	1	1
-39	0	4
-263	1	1
-18	1	1
-259	4	4
-38	1	1
-104	1	1
-40	1	0
-248	1	1
-18	1	1
-238	1	1
-32	1	1
-70	0	2
-16	1	1
-818	1	1
-22	4	4
-492	4	4
-1145	1	1
-46	1	1
-53	1	0
-38	1	1
-373	1	1
-60	1	1
-1149	0	1
-20	1	1
-1294	1	1
-41	1	1
-316	4	4
-42	1	1
-218	12	12
-363	1	1
-24	1	1
-457	10	10
-414	13	13
-825	1	1
-41	1	1
-492	0	4
-1374	1	1
-18	1	1
-808	2	2
-335	6	4
-880	1	1
-35	1	1
-236	1	1
-67	1	1
-298	0	1
-147	4	4
-322	11	11
-613	1	1
-62	1	1
-340	1	1
-22	1	1
-1057	1	1
-57	1	1
-358	1	1
-128	1	1
-146	10	10
-490	1	1
-20	1	1
-62	1	1
-88	1	1
-293	1	1
-28	1	0
-20	1	1
-83	0	1
-90	1	1
-312	1	1
-44	1	1
-1213	1	1
-51	1	1
-467	1	1
-39	1	1
-122	14	0
-35	1	1
-485	14	14
-110	12	0
-127	1	1
-5450	0	5
-1699	9	9
-3278	0	2
-28	1	1
-2211	2	0
-521	1	1
-18	1	1
-784	18	18
-1603	0	248
-4769	47	47
-4486	4	4
-103	0	2
-88	1	1
-95	1	1
-2174	1	1
-22	0	1
-1244	7	7
-922	2	0
-1507	1	1
-44	1	1
-208	6	1
-1946	2	2
-85	0	1
-133	1	1
-666	1	0
-52	1	1
-29	1	1
-148	0	5
-30	1	1
-790	14	14
-52	1	1
-32	1	1
-121	1	1
-37	1	1
-396	3	2
-324	1	1
-152	1	1
-71	4	4
-27	1	1
-115	1	1
-101	1	1
-423	10	10
-294	1	1
-101	1	0
-4	0	1
-174	1	1
-146	1	1
-103	1	1
-134	1	1
-16	1	1
-378	1	1
-85	1	1
-134	1	1
-25	1	1
-54	3	3
-55	1	1
-67	1	1
-22	1	1
-54	13	13
-55	11	11
-120	1	1
-23	1	1
-51	1	1
-22	1	1
-364	1	1
-278	1	1
-354	34448	40149
-311	1	1
-33	1	2
-26	6	6
-474	1	1
-36	1	1
-151	1	1
-29	1	1
-120	1	1
-23	1	1
-865	1	1
-39	1	1
-553	1	1
-69	1	1
-116	1	0
-1618	9	9
-820	11	11
-173	0	8
-405	9	9
-196	1	1
-26	1	1
-173	1	1
-27	5	1
-42	1	1
-676	17	19
-77	1	3
-65	16	16
-69	1	0
-277	1	1
-44	1	1
-72	0	3
-70	1	1
-54	1	1
-240	1	0
-31	1	1
-1192	18	19
-454	28	28
-373	1	1
-46	1	1
-1565	1	1
-53	2	2
-543	1	1
-38	1	1
-985	1	1
-27	0	1
-8	1	1
-158	0	38
-656	1	1
-104	1	1
-771	1	1
-21	1	1
-398	1	1
-16	1	2
-163	4	3
-94	1	1
-44	1	1
-172	1	0
-122	5	5
-193	16	16
-535	2	2
-17	1	0
-93	1	1
-580	1	1
-91	1	1
-141	1	1
-79	1	1
-80	13	13
-165	1	1
-129	1	1
-114	1	1
-30	1	1
-83	1	1
-35	1	1
-126	16	16
-270	0	1
-111	9	9
-151	1	1
-118	1	1
-253	1	1
-45	18468	20220
-102	1	1
-20	1	1
-111	1	1
-97	1	0
-86	1	1
-70	0	4
-69	1	1
-52	0	1
-219	3	3
-76	1	5
-209	4	4
-22	1	1
-61	1	1
-91	1	1
-194	0	21
-15	0	1
-229	1	1
-185	0	1
-113	5	5
-45	1	1
-53	1	1
-37	1	1
-157	1	1
-279	1	1
-233	1	1
-19	0	8
-67	2	0
-41	1	1
-102	12	12
-275	14	14
-70	1	1
-82	2	2
-224	5	1
-490	0	22
-3841	1	0
-3216	1	1
-42	1	1
-1914	0	3
-616	11	12
-144	1	1
-21	2	1
-775	1	1
-50	1	1
-50	2	2
-96	2	2
-1522	4	0
-58	0	2
-1099	1	1
-42	1	1
-3502	0	6
-255	1	1
-40	1	1
-150	0	4
-18	1	1
-589	1	1
-37	1	1
-539	5	5
-354	1	3
-128	1	1
-58	1	1
-159	1	1
-5	2	0
-21	1	1
-231	1	1
-82	3	3
-69	3	0
-549	1	1
-69	1	1
-74	9	9
-126	1	1
-47	1	1
-614	9	9
-138	1	1
-29	1	1
-681	1	1
-49	1	1
-67	1	1
-19	4	9
-234	1	1
-93	1	1
-60	4	4
-96	4	4
-76	1	1
-169	1	1
-418	1	1
-130	1	1
-44	1	1
-69	1	1
-80	1	1
-76	1	1
-41	1	1
-129	6	11
-363	1	1
-42	1	1
-295	1	1
-43	1	1
-83	6	0
-52	0	2
-1228	1	1
-34	1	1
-3527	20	0
-1768	2	1
-2467	0	2
-101	10	0
-129	1	1
-37	1	1
-121	1	1
-25	1	1
-161	1	0
-97	1	1
-124	1	0
-178	1	1
-34	1	1
-54	1	1
-38	1	2
-634	83	83
-874	1	1
-40	1	1
-59	0	1
-59	4	4
-316	1	1
-178	1	1
-103	1	1
-61	1	1
-220	1	1
-61	1	1
-296	1	1
-33	1	1
-185	12	12
-269	1	1
-84	1	1
-864	15	15
-241	1	0
-79	3	3
-161	1	1
-48	1	1
-539	1	1
-44	1	1
-357	1	1
-37	1	1
-436	1	1
-59	1	1
-71	1	1
-261	1	1
-289	1	1
-47	1	1
-95	12	12
-97	4	4
-27	1	1
-100	1	1
-16	1	1
-101	1	1
-33	1	2
-481	1	1
-42	1	1
-206	7	7
-56	12	12
-179	10	10
-80	1	1
-41	1	1
-251	1	1
-306	1	1
-80	2	0
-4	94	0
-433	1	1
-23	1	1
-107	1	0
-265	1	1
-49	1	1
-282	72	72
-838	7	7
-60	1	0
-108	1	1
-24	1	1
-134	1	1
-32	1	0
-158	0	2
-1040	1	1
-42	1	1
-737	1	0
-790	1	1
-9	2	1
-11	1	1
-129	1	1
-23	1	1
-894	1	1
-43	3	3
-854	1	1
-23	0	1
-23	2	0
-26	1	1
-395	0	15
-403	5	5
-14	1	1
-2454	1	1
-76	1	1
-170	1	1
-18	1	1
-574	4	0
-291	1	1
-47	1	1
-786	19	0
-88	10	11
-48	1	1
-58	1	1
-28	1	1
-500	0	2
-1280	1	1
-28	1	1
-975	1	0
-3231	1	0
-865	1	1
-39	1	1
-1561	109	100
-1037	0	1
-510	1	1
-49	1	1
-1253	1	1
-19	1	1
-1078	3	0
-221	1	1
-21	1	0
-899	0	4
-466	1	1
-38	1	1
-297	0	3
-730	19	6
-1043	1	1
-49	1	1
-273	0	1
-708	1	0
-364	14	13
-58	1	1
-74	1	1
-614	60	60
-1889	4	0
-531	1	1
-19	1	1
-1944	5	0
-163	6	7
-1206	0	2
-718	1	1
-41	7	0
-1795	13	13
-1390	1	0
-2933	0	16
-540	1	1
-14	1	1
-167	1	0
-897	17	4
-1208	1	0
-1307	1	1
-20	1	1
-540	0	10
-203	2	0
-44	1	1
-298	1	0
-87	11	10
-491	14	8
-991	1	1
-74	6	0
-179	1	1
-34	1	1
-448	10	0
-1688	1	1
-38	21	0
-173	1	1
-49	2	1
-2161	30	30
-203	1	0
-89	1	0
-492	1	1
-30	1	1
-1212	3	0
-990	1	1
-38	1	1
-780	1	0
-191	1	1
-47	6	6
-393	1	1
-41	1	1
-259	1	0
-941	1	1
-20	1	1
-185	0	6
-165	0	16
-420	3	1
-130	1	1
-31	1	1
-253	18	18
-720	16	18
-1257	3	0
-986	0	4
-3311	1	1
-26	1	1
-556	0	4
-120	0	1
-1273	1	1
-20	1	1
-338	8	8
-3965	0	3
-15	1	1
-2531	17	17
-3334	5	5
-121	13	13
-161	1	1
-45	1	1
-94	14	14
-63	9	10
-2108	1	1
-34	1	1
-1436	1	1
-47	1	1
-273	7	0
-153	0	5
-283	12	12
-619	1	1
-36	0	4
-225	1	1
-23	1	1
-553	5	0
-2334	1	1
-49	1	1
-350	1	1
-31	1	1
-1012	2	2
-422	1	1
-46	1	1
-91	4	19
-468	0	1
-46	1	1
-1491	0	4
-426	0	1
-1144	1	2
-1131	1	1
-20	1	1
-1533	16	0
-3103	44	45
-4016	12	12
-346	0	1
-943	1	0
-524	1	1
-20	1	1
-151	3	3
-144	1	1
-189	1	7
-750	1	0
-695	1	0
-1003	0	2
-7819	1	1
-78	1	1
-1811	0	1
-3177	0	1
-8990	0	1
-2268	1	1
-35	0	10
-8205	1	0
-3193	1	1
-76	1	1
-10955	0	1
-22875	0	20
-2417	1	0
-998	0	13
-4236	8	0
-4845	0	2
-64	40	34
-10941	1	1
-40	1	1
-4759	0	6
-12084	0	3
-3052	0	4
-2989	1	0
-13523	1	3
-16170	1	0
-11761	0	3
-3912	3	0
-6620	0	7
-7633	3	0
-419	2	0
-10690	5	24
-10798	0	1
-296	0	1
-1770	4	0
-374	0	4
-230	16	16
-7468	1	0
-1229	1	0
-3061	1	0
-5818	1	0
-2415	12	9
-2056	0	1
-955	4	0
-20022	0	1
-4418	2	1
-2375	0	4
-2086	1	1
-32	1	1
-1225	1	0
-857	2	0
-1154	0	1
-4667	1	0
-170	0	3
-2376	0	1
-2799	10	10
-1512	4	0
-68	9	1
-2170	1	1
-47	1	1
-318	2	0
-19	0	6
-14527	1	1
-33	1	1
-3080	1	1
-23	1	1
-1645	6	6
-231	0	1
-2136	2	0
-6222	0	1
-830	1	1
-24	1	1
-8326	1	0
-2939	1	0
-3959	0	2
-3746	0	2
-1011	1	1
-34	1	1
-7443	0	1
-688	2	0
-574	1	1
-29	1	1
-1799	13	1
-4074	2	0
-136	1	1
-77	1	1
-528	19	0
-253	0	1
-204	1	0
-129	2	0
-811	1	1
-38	1	1
-2347	52	0
-4634	1	0
-856	14	14
-193	0	4
-855	1	1
-28	1	1
-1255	1	1
-36	1	1
-97	0	1
-58	1	1
-1708	1	1
-48	1	1
-958	15	0
-3371	1	1
-37	1	1
-4267	0	13
-1061	0	1
-272	0	26
-8	1	15
-25	0	2
-112	2	0
-26	4	32
-4090	0	1
-3270	1	1
-17	1	1
-2822	0	1
-6206	1	0
-2318	0	2
-1504	0	1
-6189	3	0
-396	22	12
-918	0	1
-2340	1	1
-33	1	1
-326	1	1
-80	1	1
-205	3	2
-81	8	17
-2671	0	1
-1099	0	1
-144	1	1
-29	0	1
-2097	0	3
-24	3	0
-1207	4	4
-45	1	1
-757	0	5
-1926	1	1
-40	1	1
-2657	0	1
-414	1	0
-61	0	1
-235	0	2
-2087	0	1
-713	0	4
-58	3	0
-1027	3	0
-428	1	1
-17	1	1
-948	1	1
-41	1	1
-458	1	1
-21	1	1
-1055	0	1
-6611	0	3
-1575	4	5
-36	1	1
-99	2	0
-700	0	2
-151	0	1
-467	11	11
-272	0	3
-40	1	1
-2428	0	1
-750	2	0
-473	0	2
-421	1	1
-34	1	1
-1575	1	0
-3841	1	0
-560	1	0
-1108	1	0
-8087	1	0
-11881	1	1
-30	1	1
-4383	2	0
-6883	49	49
-3146	0	1
-906	3	0
-887	1	1
-80	1	1
-3115	0	1
-1037	1	0
-5866	0	2
-18	1	1
-582	0	5
-2828	1	0
-847	1	0
-1996	3	0
-3170	1	0
-1751	0	1
-910	3	0
-691	0	1
-5793	0	1
-26407	1	0
-672	0	1
-19269	29	35
-1371	29	0
-494	2	0
-20417	1	0
-18633	0	1
-601	1	0
-319	0	1
-6820	1	0
-5718	0	2
-17894	1	0
-4272	1	0
-4967	3	1
-290	1	0
-2447	1	0
-740	1	9
-9299	0	18
-7427	1	0
-8151	2	1
-673	1	0
-3453	0	1
-149	0	1
-611	0	4
-4662	0	4
-1752	1	1
-78	1	1
-1581	0	1
-1092	2	0
-159	1	0
-4480	0	2
-4019	0	1
-1451	22	23
-816	1	0
-8701	1	1
-23	1	1
-1796	2	0
-5015	6	1
-1383	8	0
-2368	1	1
-31	1	0
-1883	3	0
-335	0	1
-4157	0	1
-561	4	0
-1538	1	1
-61	0	1
-159	0	2
-3362	4	0
-3333	1	1
-46	1	1
-2307	1	0
-170	1	0
-5972	0	2
-840	0	2
-55	1	1
-28	1	1
-1154	0	2
-650	0	4
-30	0	4
-1100	10	11
-4343	6	0
-1663	4	0
-150	1	0
-3128	1	0
-1449	1	0
-2023	0	1
-428	3	6
-299	2	0
-427	7	7
-1914	14	14
-1273	7	7
-1444	72	0
-423	0	4
-954	1	0
-2467	1	0
-190	8	8
-2034	3	1
-6396	1	1
-34	1	1
-485	1	0
-348	7	0
-770	1	1
-29	0	13
-65	1	1
-1358	0	1
-302	0	1
-659	12	12
-293	0	1
-610	0	1
-906	12	0
-1331	0	6
-1786	0	1
-463	0	1
-4305	0	4
-1041	1	0
-11424	3	1
-13797	0	8
-166	0	1
-1510	5	0
-9069	0	8
-25	1	1
-332	5	3
-76	0	1
-1306	1	1
-46	1	1
-134	19	23
-1467	1	1
-32	1	1
-449	17	0
-367	9	9
-3525	12	10
-91	3	0
-1430	1	1
-24	1	1
-1156	9	13
-843	1	1
-28	1	1
-515	0	17
-1559	0	4
-1045	9	9
-1953	1	0
-31	1	1
-843	0	1
-2174	1	0
-3788	1	0
-2001	0	1
-2400	0	1
-1614	1	0
-8167	0	1
-2700	2	0
-2735	0	1
-8508	1	1
-57	1	1
-141	0	3
-448	1	1
-22	1	1
-2215	1	1
-32	1	1
-1714	32	32
-667	14	14
-142	1	0
-789	1	1
-45	1	1
-84	1	1
-95	1	1
-465	1	1
-45	6	4
-541	1	1
-42	1	1
-1339	5	6
-391	1	1
-20	0	1
-251	1	1
-22	1	1
-561	0	2
-78	3	0
-1718	1	1
-12	1	1
-1042	1	1
-38	1	1
-301	14	0
-222	10	10
-436	10	10
-556	55	55
-953	1	1
-17	1	1
-1752	20	0
-1561	135	0
-58	0	45
-245	101	11
-46	90	0
-150	0	270
-54	180	0
-2130	12	12
-1630	1	1
-26	1	1
-189	0	14
-296	2	0
-809	2	0
-17	20	0
-665	0	40
-236	1	1
-44	1	1
-352	1	1
-25	1	1
-554	6	6
-850	1	1
-33	1	1
-809	3	13
-1832	7	9
-468	1	1
-21	1	1
-951	1	1
-22	1	1
-219	17	18
-733	0	14
-215	2	2
-36	1	1
-301	1	1
-22	1	1
-241	1	1
-52	0	1
-47	1	1
-72	1	1
-109	1	1
-129	1	1
-28	1	1
-174	8	8
-683	3	0
-1190	285	0
-48	1	1
-1330	12	0
-557	17	17
-932	3	1
-27	1	1
-166	1	1
-19	1	1
-406	1	1
-48	3	3
-137	1	0
-161	6	6
-884	2	0
-58	1	1
-107	1	1
-150	14	14
-522	1	1
-28	1	1
-945	4	4
-34	1	1
-472	0	2
-203	0	1
-281	1	1
-46	1	1
-1130	1	0
-232	17	17
-510	1	1
-33	1	1
-62	10	10
-1501	1	1
-20	1	1
-573	1	1
-29	1	1
-928	0	3
-304	1	1
-41	1	1
-160	1	1
-58	1	1
-656	1	1
-40	4	0
-108	6	6
-321	1	1
-14	0	16
-91	1	1
-184	1	1
-43	8	3
-180	1	1
-68	1	1
-144	1	1
-27	1	0
-17	1	1
-212	0	1
-212	1	1
-34	1	1
-115	1	1
-41	1	1
-407	10	10
-200	1	1
-44	2	0
-187	2	0
-146	1	1
-17	1	1
-122	4	4
-73	1	0
-56	1	1
-155	1	17
-80	15	15
-458	1	1
-16	3	3
-343	1	1
-111	1	1
-160	55	55
-157	12	12
-346	0	2
-382	4	0
-35	1	1
-937	0	1
-246	25	0
-52	0	1
-419	0	1
-165	1	0
-75	24	3
-297	1	1
-38	1	1
-5066	1	0
-4922	7	9
-2488	14	14
-2241	1	1
-67	4	4
-39	1	0
-547	1	1
-43	1	1
-524	3715	901
-1796	4	2
-138	2	2
-16	1	1
-415	1	1
-18	1	1
-367	0	89
-1600	0	6
-2175	0	5
-606	14	14
-519	1	0
-540	1	1
-40	1	1
-568	2	0
-165	1	2
-31	1	1
-259	1	1
-41	1	1
-452	31	31
-623	40	62
-818	1	1
-42	1	1
-565	1	1
-44	1	1
-571	10	8
-61	1	1
-28	1	1
-233	2	0
-33	28	0
-53	1	1
-37	1	1
-75	0	396
-156	1	0
-473	0	4
-421	1	1
-35	1	1
-2132	1	1
-80	0	2
-544	9	9
-152	2	1
-33	1	1
-2932	1	1
-44	0	1
-164	22	0
-149	1	0
-534	1	1
-36	1	1
-113	1	1
-15	1	1
-661	1	1
-48	1	1
-1987	1	0
-34	1	1
-444	1	1
-45	1	1
-65	1	1
-67	1	1
-210	1	1
-68	1	1
-55	1	1
-47	1	1
-169	1	1
-64	1	1
-109	0	6
-77	2	32
-6	0	5
-67	0	1
-7	16	0
-51	12	0
-36	0	12
-700	1	1
-33	1	0
-49	0	2
-450	0	1
-98	4	0
-489	32	0
-63	5	1
-78	7	7
-538	17	17
-1269	1	0
-841	1	1
-43	1	1
-2004	1	1
-41	1	1
-86	0	4
-5	1	0
-36	1	1
-573	2	1
-297	1	0
-85	1	1
-30	1	1
-1041	1	0
-12	1	1
-392	33	12
-515	5	6
-583	1	1
-33	1	1
-616	16	16
-1052	0	11
-39	1	1
-184	1	1
-67	1	1
-102	7	7
-58	0	1
-307	1	1
-56	0	3
-930	21	19
-1264	0	1
-832	1	1
-28	1	1
-272	1	1
-82	1	1
-56	1	0
-976	6	6
-2015	0	3
-84	9	9
-130	13	17
-564	10	15
-154	1	0
-438	10	10
-38	0	5
-2141	1	1
-25	1	1
-73	10	10
-70	5	5
-132	1	1
-52	1	1
-599	1	1
-46	1	1
-279	1	1
-18	1	1
-239	2	0
-383	6	0
-224	0	1
-321	3	0
-8	16	0
-1775	1	1
-18	2	0
-575	16	16
-60	1	1
-16	1	1
-1247	2	0
-173	3	0
-41	1	1
-57	8	8
-285	2	0
-672	1	1
-44	1	1
-106	0	1
-148	1	1
-49	3	0
-146	5	11
-91	1	1
-79	1	1
-94	1	1
-101	1	1
-88	16	16
-117	1	1
-15	1	1
-58	1	1
-93	1	1
-140	1	0
-326	1	1
-44	1	1
-160	1	1
-23	1	1
-481	14	14
-181	4	4
-72	1	1
-25	1	1
-88	1	3
-36	0	12
-92	1	1
-56	10	0
-13	0	1
-66	1	1
-141	2	0
-65	1	1
-367	0	2
-610	1	1
-22	1	1
-150	1	1
-85	1	1
-109	1	1
-167	3	1
-23	1	0
-26	1	1
-74	1	1
-33	1	1
-176	1	1
-25	2	2
-193	1	1
-35	0	1
-383	0	5
-249	1	1
-69	1	1
-98	1	1
-62	1	1
-62	1	2
-74	0	1
-68	1	1
-438	1	1
-64	1	1
-47	0	8
-125	3	0
-75	5	5
-45	1	1
-197	1	1
-27	1	1
-116	13	13
-218	15	20
-1107	16	19
-73	1	1
-25	1	1
-199	1	1
-60	1	1
-994	1	1
-43	0	1
-18	1	1
-1215	18	18
-340	1	1
-34	1	1
-1350	16	16
-1726	4	4
-193	1	1
-48	1	1
-295	1	1
-18	1	1
-411	19	19
-175	1	1
-49	1	1
-146	1	1
-61	1	1
-116	1	1
-41	1	1
-137	1	1
-30	1	1
-158	9	9
-136	10	13
-349	8	8
-468	1	1
-44	1	1
-862	17	17
-813	1	1
-24	1	1
-214	10	4
-228	1	1
-34	1	1
-101	12	12
-242	1	1
-69	1	1
-185	1	1
-24	1	0
-164	0	1
-222	1	1
-25	1	1
-297	10	10
-1171	1	0
-182	1	1
-35	1	1
-350	19	19
-1966	1	1
-24	1	1
-548	7	7
-208	13	12
-298	1	1
-65	1	1
-193	2	2
-28	1	1
-125	4	4
-95	7	7
-566	1	1
-40	1	1
-118	0	1
-318	1	0
-374	1	1
-58	1	1
-143	1	1
-74	1	1
-53	21	0
-81	1	1
-45	1	1
-138	15	16
-180	1	1
-62	1	1
-661	1	1
-48	1	1
-1463	1	0
-156	0	1
-148	1	1
-19	1	0
-17	1	1
-1927	4	0
-1469	14	14
-466	0	1
-3098	0	1
-1141	2	3
-743	14	14
-79	1	1
-22	1	1
-362	0	1
-682	16	9
-275	0	4
-539	1	0
-61	0	7
-331	0	4
-130	1	1
-31	0	3
-1554	1	1
-43	1	1
-224	1	1
-49	1	1
-159	3	0
-1064	27	27
-104	1	1
-21	1	1
-222	2	2
-49	1	1
-1397	1	1
-37	1	1
-414	0	2
-695	1	1
-31	1	1
-742	1	1
-21	1	1
-230	3	2
-42	1	1
-68	1	1
-37	1	1
-703	0	3
-2216	84	83
-1430	1	1
-23	1	1
-1867	13	0
-35	1	1
-137	16	16
-1500	4	0
-4546	1	1
-25	1	1
-358	19	19
-1549	1	1
-39	4	3
-1037	1	1
-40	2	0
-890	6	0
-41	2	0
-498	3	0
-321	0	1
-281	3	0
-414	1	1
-70	1	1
-284	1	0
-214	1	1
-28	1	1
-280	1	0
-650	1	1
-47	1	1
-1030	1	1
-91	1	1
-6520	5	5
-462	1	0
-2864	0	3
-1930	0	4
-2915	1	1
-20	1	1
-413	1	0
-1844	11	11
-133	0	6
-569	10	10
-110	12	12
-184	0	3
-228	1	1
-43	2	2
-51	14	13
-1499	1	0
-12	1	1
-378	1	1
-49	1	1
-424	1	0
-1069	1	1
-142	0	1
-821	2	9
-311	1	6
-247	1	1
-86	1	1
-1850	1	1
-26	1	1
-498	1	1
-34	1	1
-688	5	9
-44	1	1
-369	1	1
-69	1	1
-156	2	0
-83	1	1
-128	1	1
-50	9	9
-249	1	1
-70	0	1
-624	2	0
-74	2	1
-300	1	1
-26	1	1
-240	4	0
-1705	1	1
-52	1	1
-231	29	24
-378	2	0
-236	1	1
-76	1	1
-116	9	12
-301	20	20
-59	0	6
-43	1	1
-384	15	15
-1414	5	0
-225	0	2
-1234	1	0
-29	1	1
-235	10	10
-227	1	1
-77	4	0
-43	5	9
-485	7	7
-380	10	0
-46	1	0
-90	1	1
-161	1	1
-401	1	1
-58	1	1
-2127	3	0
-186	20	20
-323	5	5
-47	1	1
-236	1	1
-31	0	2
-1568	1	1
-136	0	1
-202	0	3
-77	1	1
-44	1	1
-411	12	11
-317	0	2
-599	1	1
-37	1	1
-391	1	0
-273	1	0
-744	0	4
-703	1	1
-20	1	1
-198	3	0
-158	19	15
-27	12	0
-282	1	1
-32	4	0
-740	1	0
-327	1	1
-105	1	1
-146	16	16
-101	1	0
-21	1	1
-232	1	1
-33	2	0
-12	1	1
-189	1	1
-30	2	2
-544	1	1
-153	1	1
-586	5	0
-1351	21	0
-446	49	49
-121	7	7
-1147	12	12
-777	1	0
-701	1	1
-29	2	2
-154	12	12
-191	1	1
-55	1	1
-113	0	1142
-87	0	2
-15	0	1
-525	1	1
-22	1	1
-355	10	10
-50	0	8
-252	1	1
-31	1	1
-354	6	5
-148	15	15
-407	1	1
-42	1	1
-275	0	1
-737	5	9
-1432	1	1
-39	1	1
-84	0	2
-77	7	7
-514	20	20
-385	7	1
-815	1	1
-45	1	1
-487	1	1
-66	1	1
-2379	0	24
-779	1	1
-18	1	0
-2653	4	0
-34	1	1
-191	1	1
-35	1	1
-1174	12	0
-2497	1	1
-24	0	1500
-447	8	0
-3268	1	0
-946	1	0
-2223	20044	20060
-119	1	1
-71	0	3
-53	0	5
-40	1	1
-309	1	1
-57	1	1
-101	1	1
-47	2	2
-67	1	1
-47	1	1
-74	0	1
-28	1	1
-167	1	1
-33	1	1
-543	1	1
-27	11	34
-33	1	1
-149	7	7
-61	1	1
-120	1	1
-366	1	1
-55	1	1
-121	1	1
-62	1	1
-78	1	1
-48	1	1
-161	1	1
-26	1	1
-191	1	1
-20	11	11
-550	1	1
-76	1	0
-20	1	1
-112	1	1
-149	1	1
-284	1	1
-37	1	1
-705	1	12
-106	12	12
-83	1	1
-46	1	1
-1500	1	1
-81	1	1
-210	1	1
-26	1	1
-713	1	1
-48	1	1
-723	0	3
-196	6	6
-62	2	2
-32	1	1
-606	1	2
-357	1	1
-38	292	0
-589	1	1
-30	1	1
-714	8	8
-639	1	1
-20	1	1
-1068	0	1
-571	1	1
-49	1	1
-436	0	1
-609	0	2
-30	1	1
-66	0	1
-349	11	11
-65	1	1
-40	1	1
-717	0	3
-299	1	1
-29	1	1
-724	1	0
-275	1	1
-33	1	1
-318	0	3
-279	1	1
-28	1	1
-389	1	0
-548	0	8
-330	1	1
-47	1	1
-170	1	1
-47	1	1
-519	14	14
-841	24	24
-732	1	1
-29	3	3
-688	2	2
-23	0	1
-94	14	14
-726	13	13
-508	0	12
-21	6	0
-69	1	1
-37	1	1
-590	1	1
-59	1	1
-89	11	11
-164	1	1
-58	1	1
-1709	18	18
-520	1	1
-27	1	1
-683	10	10
-814	1	1
-26	1	1
-350	1	1
-39	1	1
-132	6	6
-439	10092	10075
-78	15	15
-3352	1	1
-23	1	1
-873	4	4
-887	1	0
-1827	1	0
-216	6	6
-805	2	0
-874	0	8
-2266	1	1
-47	1	1
-761	0	4
-86	1	1
-19	1	1
-1794	9	9
-271	0	1
-2266	1	1
-34	1	1
-916	0	1
-21	1	1
-108	21	21
-141	1	1
-27	1	1
-406	3	0
-3950	1	1
-38	1	1
-128	2	2
-56	1	1
-72	0	1
-96	1	1
-22	1	1
-169	7	7
-511	1	1
-38	1	1
-1070	1	1
-90	1	1
-50	1	1
-41	1	0
-30	1	1
-659	12	12
-701	1	1
-33	1	1
-569	15	15
-70	1	1
-38	1	1
-955	0	3
-130	1	1
-63	1	1
-251	8	8
-191	1	1
-26	0	3
-187	1	0
-916	5	1
-70	13	13
-498	20061	20021
-160	1	1
-76	1	1
-95	1	1
-76	1	1
-275	1	0
-101	1	1
-79	1	1
-100	7	7
-159	1	1
-75	0	8
-87	1	1
-76	1	1
-44	1	1
-71	32	32
-89	11	12
-196	1	1
-55	0	2
-61	1	1
-83	0	1
-944	1	1
-126	1	1
-81	6	6
-41	3	0
-641	1	1
-92	1	0
-113	1	1
-39	1	1
-671	1	1
-28	1	1
-123	1	1
-59	1	1
-210	1	1
-17	1	1
-168	15	14
-494	1	0
-22	1	1
-484	18	18
-376	1	1
-114	2	0
-67	1	1
-10	1	1
-109	1	1
-165	1	1
-149	6	6
-234	1	1
-19	5	5
-64	1	1
-111	1	1
-220	1	1
-89	1	1
-119	1	1
-113	2	0
-168	1	1
-73	1	1
-194	1	1
-50	0	4
-37	1	1
-95	3	1
-43	1	1
-153	1	1
-83	1	1
-55	1	1
-39	1	1
-70	7	0
-59	7	7
-75	1	1
-84	2	2
-110	1	0
-42	1	1
-129	9978	10000
-438	1	1
-43	1	0
-55	1	1
-40	1	1
-175	1	1
-46	1	1
-52	1	1
-19	1	1
-277	1	1
-60	1	1
-98	1	1
-24	1	1
-333	4	4
-1047	2	0
-4080	1	1
-38	1	1
-837	0	64
-172	1	1
-55	1	1
-1818	2	0
-1143	13	13
-335	1	0
-1944	5	0
-39	6	0
-4057	3	8
-9465	5	4
-301	19	1
-191	84	0
-427	1	1
-29	0	4
-157	4	5
-296	21	18
-158	2	2
-36	1	1
-539	13	13
-399	1	1
-46	1	1
-348	1	1
-49	1	1
-268	1	0
-66	0	4
-178	2	2
-107	1	1
-133	5	5
-355	1	1
-30	1	1
-346	1	1
-29	1	1
-161	1	1
-38	1	1
-121	4	4
-55	8	8
-67	7	7
-318	17	17
-259	1	1
-94	1	1
-80	1	1
-35	1	1
-260	1	1
-81	1	1
-106	1	1
-58	1	2
-301	3	0
-2052	1	1
-40	1	1
-174	20	22
-574	0	2
-414	1	0
-234	0	1
-425	51224	51060
-1568	14	14
-11956	0	1
-2667	0	2
-884	1	1
-19	1	1
-676	1	1
-63	1	1
-3138	0	3
-3038	5	2
-132	10	6
-136	18	13
-363	1	1
-89	1	1
-382	1	1
-29	1	1
-58	8	7
-297	4	0
-66	1	1
-93	2	0
-145	1	1
-31	5	5
-576	1	1
-89	1	1
-1256	0	12
-67	1	1
-193	2	2
-23	1	1
-51	1	0
-727	1	0
-1148	12	12
-837	1	1
-77	1	1
-941	10	10
-776	19	19
-300	1	1
-24	1	1
-256	1	7
-93	1	1
-224	2	0
-138	1	1
-563	1	1
-104	4	4
-2898	1	1
-46	1	1
-282	1	1
-39	1	1
-204	2	2
-22	1	1
-469	1	1
-20	1	1
-140	1	1
-26	1	1
-745	0	2
-539	0	6
-1536	1	0
-817	4	4
-202	1	1
-48	1	1
-168	1	1
-53	1	1
-379	10	10
-1178	14	14
-132	5	0
-555	1	1
-42	1	1
-573	1	1
-21	1	1
-462	1	1
-43	1	1
-121	1	1
-48	0	3
-15	1	5
-1404	0	1
-934	1	1
-49	1	1
-1350	1	0
-384	1	1
-24	1	1
-4169	0	15
-244	10	10
-2167	18	14
-64	1	1
-31	1	1
-185	0	4
-1647	1	1
-20	1	1
-227	1	1
-37	1	1
-636	3	4
-5590	1	1
-39	1	1
-461	0	2
-2145	1	1
-23	1	1
-1114	0	2
-688	0	1
-901	18	18
-4781	0	4
-815	0	1
-5027	42	47
-415	0	1
-2743	1	1
-78	1	1
-390	1	0
-328	0	1
-878	0	1
-5752	0	2
-1554	1	1
-60	1	1
-278	0	1
-19	1	1
-1164	11	11
-691	0	2
-960	1	0
-62	0	20
-2108	0	2
-1265	0	1
-1642	2	0
-3584	2	0
-12086	2	0
-3766	0	2
-1209	1	7
-3466	1	0
-1448	1	0
-1943	0	1
-698	0	8
-1166	135	135
-2030	2	0
-540	1	0
-1736	14	0
-3128	0	2
-4464	0	1
-3597	1	0
-378	1	0
-1269	0	3
-1182	1	0
-654	0	3
-2049	1	0
-6838	1	1
-69	0	3
-154	1	0
-2718	1	1
-30	1	1
-160	11	11
-4954	0	1
-420	1	1
-123	1	1
-156	0	4
-219	4	0
-195	1	0
-4402	3	0
-3045	0	1
-1249	1	0
-3522	0	10
-675	20	20
-117	8	0
-346	0	1
-8538	5	0
-455	1	0
-119	0	1
-355	48	48
-724	1	0
-9254	22	22
-1672	1	0
-833	0	1
-4251	1	0
-8	1	1
-2079	0	1
-1735	8	12
-1612	0	1
-1373	5	0
-8585	7	0
-64	1	1
-3799	1	0
-258	2	0
-899	1	0
-1362	8	9
-593	0	2
-3351	2	0
-618	0	4
-905	2	15
-2797	1	0
-2776	2	0
-4110	0	6
-4466	18	18
-1783	9	9
-475	0	4
-134	1	0
-12963	8	0
-1616	0	2
-1685	2	0
-2225	2	0
-428	0	1
-458	20	20
-2860	0	3
-677	4	6
-325	11	1
-1887	0	1
-913	0	1
-997	5	5
-2814	17	15
-1389	1	0
-1200	0	4
-2495	1	0
-3921	26431	26426
-2419	0	1
-6110	0	1
-1370	0	1
-3085	1	0
-3568	1	1
-24	0	9
-597	1	0
-2642	1	0
-1545	10	0
-4952	0	1
-6146	2	0
-1452	1	0
-2967	1	0
-4920	5	0
-147	4	5
-850	1	0
-1875	1	0
-695	3	1
-1719	0	1
-259	0	1
-294	1	0
-128	0	2
-3051	0	1
-908	0	4
-3399	0	1
-4673	1	0
-3179	1	0
-411	1	1
-44	1	1
-174	1	0
-1047	17	17
-998	178	0
-671	0	40
-2093	1	0
-313	0	1
-7581	1	0
-3245	1	0
-972	0	4
-4085	2	0
-346	1	1
-45	1	1
-368	1	0
-26	1	1
-8444	0	1
-17044	1	0
-2795	2	0
-2860	1	0
-622	0	1
-167	0	5
-1968	0	2
-259	2	0
-4992	29	27
-170	1	0
-3528	0	1
-191	1	2
-117	2	0
-2275	1	0
-12676	1	1
-20	1	1
-9972	1	0
-13955	0	5
-19867	1	0
-9612	1	0
-14233	0	32737
-6316	1	1
-19	1	1
-970	8	8
-2685	16	16
-18093	0	1
-6799	0	16
-3350	0	1
-7574	0	12
-2132	0	1
-7228	52793	52800
-1955	22	22
-698	0	1
-2149	1	0
-6880	0	2
-960	0	1
-23	1	1
-2646	2	0
-3867	5	0
-26077	0	3
-3174	1	0
-8183	0	1
-2817	10	0
-5841	1	0
-2081	0	1
-374	0	2
-3589	0	4
-10625	28	28
-3275	3	0
-773	7	7
-175	1	1
-79	1	1
-400	12	12
-1096	0	4
-717	7	7
-52	1	1
-68	5	1
-2117	0	3
-130	14	14
-1124	0	3
-413	0	4
-643	3	0
-58	1	1
-127	1	1
-196	0	2
-226	3	0
-136	3	4
-293	1	1
-25	0	3
-63	1	1
-417	0	2
-412	0	16
-737	4	0
-402	2	0
-654	1	1
-42	1	1
-75	1	1
-64	1	1
-2980	4	0
-576	0	1
-29	2	2
-715	1	1
-36	1	1
-511	38	38
-218	4	40
-44	1	5
-43	49	5
-709	21	21
-1147	9	9
-22	1	1
-195	7	4
-659	3	0
-27	1	1
-637	1	1
-42	1	1
-531	1	1
-67	1	1
-39	1	0
-717	11	11
-53	1	1
-61	1	1
-1535	1	1
-89	0	1
-49	1	0
-102	1	1
-67	1	1
-76	1	1
-129	1	1
-85	1	1
-607	10	0
-12	137	1
-41	1	1
-1043	1	1
-22	1	1
-203	3	0
-480	14	21
-91	23	23
-1345	2	1
-435	15	17
-1188	30	0
-1778	1	0
-120	0	3
-3797	1	0
-3211	0	1
-2456	4	0
-954	0	4
-1847	0	1
-5929	20	20
-984	14	0
-2112	1	0
-2013	1	0
-1770	14	14
-3100	1	0
-1160	16	0
-733	7	7
-238	3	2
-2203	2	1
-5654	1	1
-28	5	10
-482	0	1
-2970	0	4
-2892	0	1
-251	1	7
-1346	1	0
-877	0	4
-3583	0	1
-1178	0	1
-1293	0	2
-491	2	0
-6803	1	1
-22	1	1
-2218	1	1
-44	1	1
-4780	4	0
-3026	14	13
-442	5	5
-2022	6	6
-506	2	0
-8557	1	1
-36	1	0
-1575	1	0
-1329	1	1
-35	1	0
-247	1	1
-16	1	1
-184	1	1
-18	1	1
-1636	0	7
-23	1	1
-527	1	1
-39	1	1
-653	3	0
-227	1	1
-18	1	1
-218	0	323
-91	1	0
-124	0	15
-621	0	2
-555	8	8
-467	1	1
-40	1	1
-372	1	1
-25	1	1
-188	12	12
-357	0	2
-2389	1	1
-22	1	1
-2579	0	5
-461	1	1
-36	1	1
-1584	1	1
-26	1	0
-429	1	0
-33	1	1
-1071	0	4
-1068	9	0
-1472	0	2
-1839	94	92
-337	1	1
-46	1	1
-416	1	1
-42	1	1
-1255	0	2
-628	17	15
-587	15	15
-398	3	0
-623	1	1
-78	0	3
-287	10	0
-191	0	2
-493	1	1
-42	4	0
-219	0	1
-408	1	1
-23	1	1
-283	1	1
-21	1	1
-633	2	0
-241	6	6
-457	1	0
-330	0	16
-428	1	0
-4	6	0
-324	0	1
-3060	0	2
-9953	0	1
-1899	0	6
-6431	0	1
-8674	0	4
-4595	11	0
-5064	2	0
-2813	12	12
-1391	5	0
-3690	1	1
-64	1	1
-2635	1	1
-49	1	1
-69	1	1
-15	1	1
-605	4	4
-400	8	0
-735	0	20
-3074	2	0
-1879	0	1
-572	0	8
-576	1	1
-42	1	1
-265	24	0
-209	11	11
-953	1	1
-42	0	5
-58	1	0
-95	1	0
-1121	1	1
-17	1	1
-751	0	1
-24	1	1
-351	1	1
-43	3	3
-565	1	1
-15	1	1
-271	1	0
-323	1	1
-23	1	1
-221	7	7
-705	9	0
-631	2	0
-64	1	1
-1577	1	1
-21	0	1
-371	7	21
-160	0	1
-283	1	1
-48	1	1
-227	1	1
-40	0	1
-1359	0	2
-836	13	13
-722	7	7
-1153	1	1
-93	1	1
-797	14	14
-433	8	0
-108	11	11
-140	1	1
-40	1	1
-470	1	1
-42	1	1
-1106	0	1
-85	4	4
-129	1	1
-123	1	0
-95	1	1
-104	6	1
-641	1	1
-77	1	1
-57	1	1
-62	1	1
-473	2	0
-262	6	0
-45	1	1
-63	2	0
-39	1	1
-267	0	1
-197	2	104
-189	107	3
-112	0	4
-108	5	0
-563	14	14
-324	1	0
-205	1	1
-17	1	1
-495	0	1
-201	4	0
-14	1	1
-667	42	42
-178	1	1
-58	1	1
-133	1	1
-24	1	1
-91	24	24
-342	1	1
-32	1	1
-121	1	1
-62	1	1
-2371	2	0
-164	8	1
-655	1	1
-30	1	1
-271	1	1
-47	1	1
-609	1	0
-1780	2	0
-742	1	1
-40	1	1
-2014	1	0
-1741	3	0
-3833	0	1
-14622	161198	190000
-5156	0	1
-1680	1	1
-88	1	1
-4502	0	1
-46	1	1
-800	4	4
-23	1	1
-1305	2	0
-136	0	1
-4941	0	1
-547	0	1
-70	8	8
-293	1	1
-35	1	1
-1165	4	0
-6662	1	1
-46	1	1
-167	0	8
-214	1	1
-35	1	1
-108	1	0
-1063	0	1
-1017	1	1
-20	0	6
-1725	0	1
-150	5	5
-33	1	0
-12	1	1
-349	1	1
-24	0	1
-1562	1	1
-31	1	1
-2513	0	1
-73	36	36
-305	1	1
-27	1	1
-543	1	1
-47	4	28
-5476	10	10
-531	1	1
-37	1	1
-776	1	1
-44	2	2
-115	22	20
-181	1	1
-125	3	3
-466	1	1
-76	1	1
-144	5	5
-32	1	1
-225	1	1
-41	1	1
-707	24	24
-66	4	4
-414	1	1
-42	1	1
-81	1	1
-63	1	1
-76	28	46
-187	1	1
-97	1	1
-99	9	9
-85	14	14
-81	6	6
-62	1	1
-109	4	5
-150	1	0
-44	4	4
-93	11	11
-188	3	3
-73	1	1
-52	1	1
-19	13	0
-48	1	1
-62	0	7
-205	1	1
-68	9	9
-99	4	0
-21	1	0
-52	1	1
-171	1	1
-109	3	1
-6	0	2
-190	1	1
-69	10078	10069
-90	3	1
-197	1	1
-157	0	6
-137	1	1
-101	2	2
-233	6	6
-62	1	1
-104	0	1
-143	1	1
-119	1	1
-106	2	0
-176	1	1
-79	0	1
-50	1	1
-50	3	3
-179	1	1
-159	1	1
-36	1	1
-107	1	1
-176	1	1
-154	0	5
-91	1	1
-54	1	1
-77	1	1
-238	2	2
-50	1	1
-1421	1	1
-23	1	1
-216	1	1
-122	1	1
-86	1	1
-41	3	1
-336	7	7
-41	9	0
-107	1	1
-90	1	3
-6	1	0
-84	1	1
-213	1	1
-26	1	1
-138	1	1
-25	1	1
-206	1	1
-36	3	3
-37	7	0
-500	1	1
-52	1	1
-52	1	1
-48	1	1
-395	1	1
-66	6	6
-72	1	0
-69	1	1
-100	10	10
-160	1	0
-64	7	7
-89	1	1
-123	1	1
-128	1	1
-36	1	1
-231	1	1
-61	1	1
-564	8	8
-593	47	47
-163	1	0
-196	8	8
-174	5	5
-37	1	1
-67	0	1
-192	1	1
-60	3	0
-19	1	1
-1149	1	1
-18	1	1
-77	1	1
-32	2	0
-32	1	1
-136	1	1
-78	2	0
-162	4	0
-41	1	1
-351	13	13
-1634	2	0
-229	8	8
-57	13	2
-410	1	1
-76	1	1
-180	1	1
-92	1	1
-270	1	1
-40	1	1
-92	1	1
-53	1	1
-227	1	1
-42	1	1
-357	4	4
-23	1	1
-94	1	0
-200	6	0
-201	7	7
-70	5	13
-57	4	0
-35	1	1
-206	1	1
-76	2	2
-651	1	1
-68	4	0
-73	1	1
-49	4	0
-37	1	1
-145	2	2
-78	2	2
-108	12	12
-52	1	1
-35	1	1
-242	1	3
-76	2	2
-50	12	12
-70	1	1
-33	0	2
-57	1	1
-64	15	15
-168	1	1
-22	1	1
-63	36	37
-73	0	2
-64	1	1
-177	2	0
-19	4	0
-55	1	0
-33	1	1
-51	1	1
-122	1	1
-296	1	1
-85	1	1
-109	1	1
-64	1	1
-155	1	1
-58	0	2
-72	1	1
-25	1	1
-128	1	1
-45	2	0
-444	1	1
-25	1	1
-64	1	1
-21	1	1
-368	15	15
-734	2	0
-701	15	15
-71	1	1
-41	1	1
-77	1	1
-56	1	1
-478	2	0
-714	8	7
-95	2	2
-50	4	3
-1129	1	1
-34	1	1
-1715	1	1
-87	1	1
-692	1	1
-47	0	1
-75	1	1
-541	12	12
-1602	10	10
-1265	1	1
-46	1	1
-298	1	1
-22	1	1
-186	1	1
-34	1	1
-202	1	1
-61	1	0
-185	1	1
-24	1	0
-98	0	2
-258	8	14
-967	1	1
-15	1	1
-625	1	0
-1362	0	4
-23365	4	0
-246	26975	26986
-3307	0	1
-13671	3	3
-52	1	1
-1308	2	0
-942	0	1
-17790	1	0
-4586	0	1
-949	0	2
-15047	0	1
-606	2	0
-7820	0	4
-22313	16	0
-10539	8	0
-4836	0	1
-8320	18	18
-388	2	0
-194	1	1
-49	1	1
-320	1	1
-34	1	1
-6813	0	1
-8719	3	0
-7037	1	0
-721	0	1
-999	6	0
-17	1	0
-3075	5	0
-593	13	11
-1006	12	12
-3487	1	0
-9535	0	4
-23	0	2
-23	2	0
-513	0	3
-377	1	0
-2627	0	2
-16	0	1
-211	18	18
-571	2	0
-7617	0	1
-1607	1	0
-69	1	1
-66	1	1
-275	1	1
-67	7	0
-25	1	1
-1206	1	0
-136	8	7
-612	1	1
-61	1	1
-740	0	2
-78	26	26
-129	15	15
-69	12	16
-1483	13	28
-1062	1	0
-108	4	0
-685	0	2
-1566	1	0
-192	4	4
-1452	9	45
-1514	1	1
-46	1	1
-1969	0	1
-35	1	1
-1094	1	0
-618	1	1
-43	1	1
-6580	1	0
-1636	5	0
-6325	1	1
-32	1	1
-1041	0	2
-174	9	0
-11983	18	18
-142	8	8
-2203	10	8
-2025	1	1
-39	1	1
-907	4	4
-225	1	1
-124	1	1
-3928	0	22
-38	2	0
-44	18	0
-46	0	6
-61	0	1
-3653	6	0
-34	1	1
-4559	1	1
-28	1	1
-283	5	5
-1572	28	28
-351	1	1
-34	1	1
-443	19	19
-57	1	1
-21	1	1
-231	1	1
-94	1	1
-105	1	1
-208	5	5
-124	1	1
-112	3	3
-207	1	1
-38	1	1
-244	1	1
-60	1	1
-98	1	1
-50	1	1
-256	5	5
-23	1	1
-157	1	1
-33	1	1
-143	1	1
-59	1	1
-51	1	1
-45	1	0
-73	1	1
-81	1	1
-339	1	1
-56	0	5
-142	1	1
-232	1	1
-43	1	1
-332	1	1
-47	1	1
-479	1	0
-137	0	3
-1456	10	13
-63	1	1
-37	1	1
-261	0	2
-109	1	1
-50	1	1
-56	129	1
-88	1	0
-44	1	1
-54	1	1
-56	1	50
-58	50	1
-54	277	1
-44	1	1
-297	0	39
-142	1	1
-85	1	1
-124	16	16
-58	3	15
-677	1	0
-1333	2	0
-13591	6	0
-989	1	1
-107	1	1
-678	1	1
-31	1	1
-2571	5	5
-56	2	2
-39	1	1
-3986	0	4
-18351	32	30
-10811	1	1
-25	0	1
-417	1	1
-40	1	1
-159	4	4
-37	4	4
-179	1	1
-51	1	1
-103	2	0
-108	1	1
-79	1	1
-25	1	1
-58	1	1
-12	1	1
-275	14	0
-80	1	1
-83	1	1
-24	1	1
-59	1	0
-91	1	1
-65	1	1
-67	1	1
-136	4	0
-68	8	0
-331	5	0
-40	1	1
-110	10	6
-64	1	1
-368	1	1
-22	1	1
-509	1	1
-89	1	1
-926	1	0
-959	1	1
-44	1	1
-72	11	0
-47	1	1
-361	1	1
-37	1	1
-2204	2	2
-45	1	1
-1117	18	18
-141	1	1
-47	1	1
-148	1	1
-75	1	1
-104	1	0
-205	3	2
-249	1	1
-146	1	1
-94	1	1
-34	1	1
-700	0	331
-21	1	1
-73	1	1
-49	1	1
-356	1	1
-16	1	1
-112	1	1
-36	9	0
-515	1	1
-27	2	2
-192	1	1
-53	0	14
-82	1	1
-302	1	1
-68	1	1
-52	12	12
-52	1	1
-34	1	1
-166	7	7
-384	1	1
-31	1	1
-281	1	1
-57	1	1
-176	0	1
-1625	1	1
-26	1	1
-369	1	1
-21	1	1
-86	1	1
-134	1	1
-215	1	1
-214	15	1
-50	2	2
-26	1	1
-78	0	19
-64	1	1
-118	53	53
-433	1	1
-76	0	1
-6	12	0
-52	1	1
-108	1	1
-87	1	1
-62	1	1
-26	1	1
-291	2	1
-143	1	1
-29	1	1
-56	12	12
-230	1	1
-153	4	4
-87	32	32
-584	12	12
-227	1	0
-1931	4	0
-836	1	1
-68	1	1
-205	24	19
-816	1	2
-1932	0	7
-1732	13	0
-257	4	0
-1423	1	0
-129	6	0
-1505	1	1
-42	0	1
-373	13	13
-565	1	1
-76	1	0
-1881	0	4
-68	4	0
-43	0	4
-2201	8	8
-3726	3	0
-339	15	11
-249	1	1
-35	1	1
-250	1	1
-38	1	1
-359	11	12
-109	1	1
-43	18	0
-822	1	1
-53	1	1
-325	15	15
-123	1	1
-42	6	6
-240	1	1
-44	1	1
-438	7	7
-142	2	0
-1004	0	1
-9275	1	1
-37	1	0
-2071	0	1
-1253	9	9
-9137	0	1
-12513	2	1
-11243	1	1
-26	1	1
-816	4	0
-15996	2	0
-1594	1	0
-363	5	0
-6757	47	41
-2700	1	0
-841	0	1
-1807	0	2
-2565	11	0
-2089	0	2
-477	1	0
-657	0	1
-776	0	20
-365	82	49
-779	0	1
-401	25	63
-441	0	2
-1152	0	2
-1315	1	0
-5352	6	8
-902	0	1
-2154	1	1
-36	1	1
-109	0	1
-668	6	0
-1923	0	1
-91	3	2
-3560	1	0
-1235	1	0
-139	26	0
-7381	1	0
-155	0	14
-2393	1	1
-33	1	1
-507	4	0
-1337	0	1
-9954	3	0
-1588	1	0
-2605	1	1
-23	1	1
-3000	0	3
-8249	8	0
-912	0	1
-338	2	0
-734	1	0
-4332	1	0
-416	0	4
-1691	0	1
-295	1	0
-214	2	0
-121	0	1
-784	0	1
-2512	0	1
-4465	12	11
-926	1	0
-190	1	0
-5780	0	1
-490	5	0
-228	1	1
-45	1	1
-207	3	0
-322	0	1
-633	1	1
-24	1	0
-1516	5	0
-1025	0	13
-1518	0	1
-591	10	10
-1061	1	0
-1371	1	1
-22	1	1
-928	0	2
-182	8	0
-328	1	0
-301	0	1
-994	1	1
-18	0	6
-1743	0	1
-2350	22	23
-1548	0	2
-1498	8	6
-7484	0	3
-2988	7	7
-93	2	0
-322	1	0
-280	1	1
-49	1	1
-2114	16	17
-617	0	1
-1012	0	1
-495	1	0
-29	1	1
-3134	1	0
-1837	0	4
-4079	0	1
-905	8	0
-5764	0	1
-3493	0	20
-1174	0	1
-900	0	1
-1006	1	0
-1699	0	1
-1682	1	0
-688	1	1
-21	1	1
-3349	0	1
-384	3	1
-3616	3	0
-748	0	1
-3001	0	10
-541	1	0
-286	1	1
-22	0	1
-250	1	1
-27	1	1
-898	1	0
-1161	0	2
-2067	0	1
-8000	0	12
-857	29	0
-1399
-
-chain 72788 chr6_qbl_hap2 4565931 + 3808375 3809175 chr11 135006516 + 118201008 118201901 1739030
-615	13	107
-119	2	1
-51
-
-chain 65509 chr6_qbl_hap2 4565931 + 2258974 2259668 chr6 171115067 - 140105134 140105832 1929446
-178	0	4
-516
-
-chain 50097 chr6_qbl_hap2 4565931 + 2471491 2473781 chr6 171115067 + 44553942 44556234 2550079
-125	147	147
-81	297	298
-77	380	378
-160	345	343
-82	181	182
-60	299	303
-56
-
-chain 30865 chr6_qbl_hap2 4565931 + 3800272 3800791 chr6 171115067 + 32713281 32713770 4500604
-73	89	59
-184	77	77
-96
-
-chain 26769 chr6_qbl_hap2 4565931 + 2218659 2218944 chr1 249250621 - 83463584 83463869 6084938
-285
-
-chain 25453 chr6_qbl_hap2 4565931 + 1111775 1112573 chr8 146364022 + 94982474 94983353 6804147
-181	108	108
-72	385	466
-52
-
-chain 18586 chr6_qbl_hap2 4565931 + 2472758 2473366 chr3 198022430 - 151831455 151832050 2830221
-34	221	221
-81	91	91
-5	35	35
-55	44	31
-42
-
-chain 18520 chr6_qbl_hap2 4565931 + 2558133 2558568 chr13 115169878 - 5075411 5075846 11677159
-71	220	220
-144
-
-chain 17263 chr6_qbl_hap2 4565931 + 3694162 3694369 chr4 191154276 + 3927369 3927573 12785974
-50	3	0
-26	4	4
-124
-
-chain 16745 chr6_qbl_hap2 4565931 + 2589692 2589893 chr11 135006516 + 74748600 74748801 13289219
-113	12	12
-76
-
-chain 15761 chr6_qbl_hap2 4565931 + 3069257 3069435 chr19 59128983 - 18504215 18504393 607285
-59	1	1
-45	1	1
-72
-
-chain 15688 chr6_qbl_hap2 4565931 + 3804298 3804527 chr11 135006516 - 109492289 109492518 14350697
-129	50	50
-50
-
-chain 14458 chr6_qbl_hap2 4565931 + 3751685 3752808 chr6 171115067 + 32441118 32442245 15662572
-59	270	268
-88	656	662
-50
-
-chain 14065 chr6_qbl_hap2 4565931 + 3705931 3706083 chr6 171115067 - 138602057 138602209 16122341
-152
-
-chain 13955 chr6_qbl_hap2 4565931 + 2589304 2589471 chr9 141213431 - 10269188 10269355 16251226
-93	11	11
-63
-
-chain 13115 chr6_qbl_hap2 4565931 + 937718 937855 chr7 159138663 + 102343613 102343750 17340123
-137
-
-chain 12452 chr6_qbl_hap2 4565931 + 4213437 4214179 chr12 133851895 + 124586233 124586652 1913233
-57	408	105
-14	32	63
-45	0	78
-44	129	0
-13
-
-chain 12361 chr6_qbl_hap2 4565931 + 1150685 1150815 chr1 249250621 + 48985442 48985572 18455294
-130
-
-chain 12272 chr6_qbl_hap2 4565931 + 2479004 2479160 chrX 155270560 + 155194421 155194569 18587559
-71	1	1
-25	8	0
-51
-
-chain 12201 chr6_qbl_hap2 4565931 + 1105096 1105867 chr6 171115067 - 139876162 139876935 18699321
-54	620	622
-97
-
-chain 12178 chr6_qbl_hap2 4565931 + 3776349 3776515 chr14 107349540 - 58393926 58394091 18734379
-55	26	25
-85
-
-chain 12008 chr6_qbl_hap2 4565931 + 3700751 3700880 chr8 146364022 + 49154427 49154556 18990653
-129
-
-chain 11752 chr6_qbl_hap2 4565931 + 3745259 3747655 chr6 171115067 + 32491461 32493852 19428924
-56	676	682
-61	1516	1505
-87
-
-chain 11746 chr6_qbl_hap2 4565931 + 1097944 1098092 chr7 159138663 - 7702899 7703047 19437479
-54	14	14
-80
-
-chain 11503 chr6_qbl_hap2 4565931 + 3698827 3699253 chr11 135006516 - 111045874 111046295 19852910
-57	287	282
-82
-
-chain 10738 chr6_qbl_hap2 4565931 + 3700459 3700580 chr10 135534747 + 59600699 59600817 21255899
-61	3	0
-57
-
-chain 10686 chr6_qbl_hap2 4565931 + 2478152 2478673 chr18 78077248 + 11342173 11342695 21355061
-80	388	389
-53
-
-chain 10496 chr6_qbl_hap2 4565931 + 3696510 3696620 chr1 249250621 - 174039531 174039641 21744609
-110
-
-chain 10342 chr6_qbl_hap2 4565931 + 3714159 3714889 chr6 171115067 + 32548581 32549235 22073729
-78	598	522
-54
-
-chain 9560 chr6_qbl_hap2 4565931 + 1152614 1152715 chr6 171115067 - 141323187 141323288 23857063
-101
-
-chain 9560 chr6_qbl_hap2 4565931 + 1099695 1099796 chr6 171115067 - 141323187 141323288 23857064
-101
-
-chain 9385 chr6_qbl_hap2 4565931 + 3825573 3825778 chr16 90354753 - 20685009 20685189 24272037
-58	92	67
-55
-
-chain 9214 chr6_qbl_hap2 4565931 + 1102327 1102424 chr6 171115067 + 29758158 29758255 24607529
-97
-
-chain 9048 chr6_qbl_hap2 4565931 + 3694493 3695083 chr16 90354753 - 14504923 14505798 16016601
-79	460	745
-51
-
-chain 8993 chr6_qbl_hap2 4565931 + 2558568 2558745 chr2 243199373 + 116390976 116391155 17783325
-1	102	104
-74
-
-chain 8702 chr6_qbl_hap2 4565931 + 3686082 3686238 chr6 171115067 + 32439449 32439606 25393693
-54	51	52
-51
-
-chain 8427 chr6_qbl_hap2 4565931 + 3804527 3804616 chr6 171115067 - 148948316 148948405 15963296
-89
-
-chain 7704 chr6_qbl_hap2 4565931 + 3688237 3688318 chr6 171115067 + 32557831 32557912 26927503
-81
-
-chain 6794 chr6_qbl_hap2 4565931 + 3775350 3775421 chr3 198022430 - 94748615 94748686 28659148
-71
-
-chain 6473 chr6_qbl_hap2 4565931 + 3694610 3694683 chr1 249250621 - 102907635 102907704 21815174
-11	4	0
-58
-
-chain 6457 chr6_qbl_hap2 4565931 + 1158502 1158569 chr6 171115067 + 30228837 30228904 29438118
-67
-
-chain 6422 chr6_qbl_hap2 4565931 + 3817908 3817976 chr6 171115067 + 32728707 32728775 29535243
-68
-
-chain 6368 chr6_qbl_hap2 4565931 + 2478912 2479004 chr6 171115067 - 132617434 132617532 20998654
-55	29	35
-8
-
-chain 5830 chr6_qbl_hap2 4565931 + 1098157 1098218 chr7 159138663 - 104622057 104622118 31091038
-61
-
-chain 5757 chr6_qbl_hap2 4565931 + 3825218 3825278 chr14 107349540 - 70017731 70017791 31292281
-60
-
-chain 5558 chr6_qbl_hap2 4565931 + 2472407 2472466 chr15 102531392 + 37673660 37673719 31870719
-59
-
-chain 5479 chr6_qbl_hap2 4565931 + 1111956 1112025 chr9 141213431 - 103321949 103322018 11235972
-69
-
-chain 5339 chr6_qbl_hap2 4565931 + 3885926 3885982 chrX 155270560 + 55718242 55718298 32499987
-56
-
-chain 5185 chr6_qbl_hap2 4565931 + 3788909 3788964 chr14 107349540 + 22827226 22827281 32987373
-55
-
-chain 5179 chr6_qbl_hap2 4565931 + 1150896 1150960 chr19 59128983 - 37357346 37357410 20742827
-53	10	10
-1
-
-chain 5176 chr6_qbl_hap2 4565931 + 1100596 1100651 chr14 107349540 + 79349485 79349540 33029769
-55
-
-chain 5058 chr6_qbl_hap2 4565931 + 3771065 3771119 chr1 249250621 - 172942963 172943017 33379587
-54
-
-chain 5039 chr6_qbl_hap2 4565931 + 2475495 2475548 chr7 159138663 - 94193358 94193411 33438564
-53
-
-chain 5038 chr6_qbl_hap2 4565931 + 1148806 1148858 chr6 171115067 + 29856463 29856515 33456716
-52
-
-chain 4959 chr6_qbl_hap2 4565931 + 3696457 3696510 chr18 78077248 + 5090594 5090647 22176919
-53
-
-chain 4949 chr6_qbl_hap2 4565931 + 3825516 3825569 chrX 155270560 - 91231208 91231261 33742123
-53
-
-chain 4829 chr6_qbl_hap2 4565931 + 1159026 1159076 chr6 171115067 + 30459319 30459369 34177698
-50
-
-chain 4685 chr6_qbl_hap2 4565931 + 3719592 3719642 chr12 133851895 + 112261417 112261467 34690970
-50
-
-chain 4391 chr6_qbl_hap2 4565931 + 4214058 4214103 chrX 155270560 - 99494613 99494658 30227326
-45
-
-chain 4348 chr6_qbl_hap2 4565931 + 3739277 3739323 chr7 159138663 - 76863668 76863714 34891433
-46
-
-chain 4338 chr6_qbl_hap2 4565931 + 2201356 2201401 chr6 171115067 + 30954494 30954539 34909104
-45
-
-chain 4061 chr6_qbl_hap2 4565931 + 2201872 2201914 chr6 171115067 + 30955145 30955187 31149648
-42
-
-chain 4003 chr6_qbl_hap2 4565931 + 2470663 2474155 chr12 133851895 + 104783555 104787047 2981748
-99	961	960
-40	481	480
-76	473	472
-44	1256	1259
-62
-
-chain 3775 chr6_qbl_hap2 4565931 + 2471376 2471416 chr10 135534747 - 90944157 90944197 25967017
-40
-
-chain 3639 chr6_qbl_hap2 4565931 + 3694572 3694610 chr3 198022430 + 101411146 101411184 20382400
-38
-
-chain 3574 chr6_qbl_hap2 4565931 + 2470595 2470633 chr3 198022430 - 173409162 173409200 29596632
-38
-
-chain 3494 chr6_qbl_hap2 4565931 + 3700422 3700459 chrX 155270560 + 104134375 104134412 29536090
-37
-
-chain 3491 chr6_qbl_hap2 4565931 + 2471293 2472133 chr8 146364022 - 12751685 12752521 3617865
-79	701	697
-60
-
-chain 3436 chr6_qbl_hap2 4565931 + 2471844 2473225 chr1 249250621 + 7474211 7475590 2872741
-34	959	957
-58	295	295
-35
-
-chain 3220 chr6_qbl_hap2 4565931 + 3776529 3776563 chr12 133851895 + 85826623 85826657 35349035
-34
-
-chain 3148 chr6_qbl_hap2 4565931 + 3825631 3825664 chr2 243199373 + 38182693 38182726 24706670
-33
-
-chain 2975 chr6_qbl_hap2 4565931 + 2478232 2478268 chr3 198022430 - 94213030 94213066 24807218
-36
-
-chain 2972 chr6_qbl_hap2 4565931 + 1105868 1105908 chr6 171115067 + 30459045 30459085 20759384
-40
-
-chain 2845 chr6_qbl_hap2 4565931 + 2470633 2470663 chr3 198022430 - 156603737 156603767 26791326
-30
-
-chain 2838 chr6_qbl_hap2 4565931 + 2474990 2475020 chr4 191154276 + 92075174 92075204 21730347
-30
-
-chain 2761 chr6_qbl_hap2 4565931 + 3804625 3804685 chr4 191154276 + 37278694 37278754 22658556
-60
-
-chain 2671 chr6_qbl_hap2 4565931 + 2478852 2478911 chr9 141213431 - 60456470 60456529 21094091
-59
-
-chain 2604 chr6_qbl_hap2 4565931 + 1151032 1151059 chr17 81195210 + 6784720 6784747 30920849
-27
-
-chain 2579 chr6_qbl_hap2 4565931 + 3700720 3700751 chr21 48129895 + 18677639 18677670 26190064
-31
-
-chain 2574 chr6_qbl_hap2 4565931 + 1150960 1151032 chrX 155270560 + 72544773 72544845 18935818
-72
-
-chain 2481 chr6_qbl_hap2 4565931 + 3804442 3804477 chr3 198022430 - 58737971 58738006 17138123
-35
-
-chain 2394 chr6_qbl_hap2 4565931 + 2478673 2478698 chr11 135006516 - 67345781 67345806 29321362
-25
-
-chain 2363 chr6_qbl_hap2 4565931 + 2473435 2473485 chr3 198022430 - 59783725 59783775 3613581
-50
-
-chain 2322 chr6_qbl_hap2 4565931 + 2470859 2470989 chr15 102531392 - 72822940 72823070 3150079
-130
-
-chain 2266 chr6_qbl_hap2 4565931 + 2470989 2471957 chr9 141213431 - 114376815 114377769 4168715
-45	845	831
-78
-
-chain 2263 chr6_qbl_hap2 4565931 + 2471123 2471268 chr12 133851895 + 84401354 84401499 4041581
-145
-
-chain 2209 chr6_qbl_hap2 4565931 + 2470765 2470818 chr3 198022430 + 182918728 182918781 9563966
-53
-
-chain 2087 chr6_qbl_hap2 4565931 + 2558317 2558369 chrX 155270560 - 89201309 89201361 22578016
-52
-
-chain 2078 chr6_qbl_hap2 4565931 + 1112026 1112064 chr3 198022430 + 120909358 120909396 13027265
-38
-
-chain 2035 chr6_qbl_hap2 4565931 + 2557888 2557938 chr16 90354753 + 47212776 47212826 17692575
-50
-
-chain 1978 chr6_qbl_hap2 4565931 + 4213820 4213948 chr15 102531392 - 61555806 61555934 2051418
-28	68	68
-32
-
-chain 1899 chr6_qbl_hap2 4565931 + 2558399 2558424 chrX 155270560 + 94068150 94068175 17734181
-25
-
-chain 1860 chr6_qbl_hap2 4565931 + 1112180 1112230 chr8 146364022 + 68079613 68079663 13479327
-50
-
-chain 1860 chr6_qbl_hap2 4565931 + 3812269 3815784 chr6 171115067 + 32722816 32726965 29521084
-61	2506	2690
-85	515	965
-52	103	103
-193
-
-chain 1828 chr6_qbl_hap2 4565931 + 2473656 2473684 chr14 107349540 - 54723100 54723128 20222699
-28
-
-chain 1658 chr6_qbl_hap2 4565931 + 1112136 1112169 chr4 191154276 + 153686345 153686378 11053932
-33
-
-chain 1514 chr6_qbl_hap2 4565931 + 1112233 1112291 chr13 115169878 - 5205835 5205893 10260311
-58
-
-chain 1396 chr6_qbl_hap2 4565931 + 2473606 2473656 chr1 249250621 + 83820278 83820328 4577579
-50
-
-chain 1388 chr6_qbl_hap2 4565931 + 4214123 4214166 chr19 59128983 - 43654778 43654821 2801865
-43
-
-chain 1329 chr6_qbl_hap2 4565931 + 2557727 2557778 chr7 159138663 - 55106997 55107048 20610784
-51
-
-chain 1304 chr6_qbl_hap2 4565931 + 4213365 4213389 chr1 249250621 + 182710286 182710310 2078906
-24
-
-chain 1296 chr6_qbl_hap2 4565931 + 4213389 4213424 chr8 146364022 + 99694 99728 9829550
-12	1	0
-22
-
-chain 1233 chr6_qbl_hap2 4565931 + 2558102 2558133 chr5 180915260 + 67992831 67992862 12309329
-31
-
-chain 1171 chr6_qbl_hap2 4565931 + 2473569 2473606 chrX 155270560 - 90928252 90928289 23413190
-37
-
-chain 1170 chr6_qbl_hap2 4565931 + 2471983 2472043 chr9 141213431 + 232427 232487 4190853
-60
-
-chain 1144 chr6_qbl_hap2 4565931 + 2469449 2469508 chr2 243199373 + 81796678 81796737 21594602
-59
-
-chain 1125 chr6_qbl_hap2 4565931 + 3694759 3694827 chr8 146364022 - 86779351 86779419 20749390
-68
-
-chain 1106 chr6_qbl_hap2 4565931 + 1112362 1112413 chr1 249250621 - 17660691 17660742 13643228
-51
-
-chain 1071 chr6_qbl_hap2 4565931 + 2470508 2470575 chr12 133851895 + 78891507 78891574 9444392
-67
-
-chain 1040 chr6_qbl_hap2 4565931 + 2470400 2470457 chr5 180915260 - 146134722 146134779 6672758
-57
-
-chain 1023 chr6_qbl_hap2 4565931 + 2471416 2471471 chr2 243199373 + 162554783 162554838 24613681
-55
-
-chain 935 chr6_qbl_hap2 4565931 + 2558067 2558102 chr4 191154276 + 31205 31240 16972854
-35
-
-chain 919 chr6_qbl_hap2 4565931 + 2474702 2474762 chr4 191154276 + 45112377 45112437 22402157
-60
-
-chain 902 chr6_qbl_hap2 4565931 + 2474552 2474612 chr5 180915260 - 23766246 23766306 4704228
-60
-
-chain 884 chr6_qbl_hap2 4565931 + 2473696 2473725 chr1 249250621 - 199045131 199045160 12500824
-29
-
-chain 825 chr6_qbl_hap2 4565931 + 1112413 1112452 chr1 249250621 - 184583816 184583855 16072417
-39
-
-chain 801 chr6_qbl_hap2 4565931 + 2470111 2470156 chr1 249250621 - 71436588 71436633 19248116
-45
-
-chain 789 chr6_qbl_hap2 4565931 + 3698600 3699777 chr19 59128983 + 8446620 8447803 26630175
-58	1059	1065
-60
-
-chain 788 chr6_qbl_hap2 4565931 + 2470239 2470322 chr6 171115067 + 137168270 137168353 4512040
-83
-
-chain 740 chr6_qbl_hap2 4565931 + 1112667 1112731 chr12 133851895 + 57178267 57178331 20850792
-64
-
-chain 718 chr6_qbl_hap2 4565931 + 2474782 2474837 chr9 141213431 - 49469911 49469966 23568604
-55
-
-chain 694 chr6_qbl_hap2 4565931 + 2469923 2469992 chrX 155270560 - 140437581 140437650 5405913
-69
-
-chain 584 chr6_qbl_hap2 4565931 + 2474349 2474405 chr15 102531392 + 67105223 67105279 15249534
-56
-
-chain 562 chr6_qbl_hap2 4565931 + 2557778 2557819 chrX 155270560 + 91975692 91975733 21019876
-41
-
-chain 562 chr6_qbl_hap2 4565931 + 2469824 2469884 chr2 243199373 - 169790362 169790422 25410177
-60
-
-chain 552 chr6_qbl_hap2 4565931 + 2237356 2237383 chr17 81195210 - 14890828 14890855 11066346
-27
-
-chain 523 chr6_qbl_hap2 4565931 + 2470057 2470111 chr13 115169878 + 42049099 42049153 16964924
-54
-
-chain 489 chr6_qbl_hap2 4565931 + 2469992 2470048 chr14 107349540 + 79003493 79003549 5260265
-56
-
-chain 481 chr6_qbl_hap2 4565931 + 2470189 2470239 chr8 146364022 + 50441810 50441860 5267091
-50
-
-chain 481 chr6_qbl_hap2 4565931 + 2469386 2469447 chr1 249250621 - 193322918 193322979 8728434
-61
-
-chain 455 chr6_qbl_hap2 4565931 + 2472488 2472547 chr6 171115067 - 85200236 85200295 17778688
-59
-
-chain 445 chr6_qbl_hap2 4565931 + 2469210 2469265 chrX 155270560 - 127487766 127487821 16318369
-55
-
-chain 358 chr6_qbl_hap2 4565931 + 2475020 2475084 chr4 191154276 + 74158363 74158427 16300933
-64
-
-chain 347 chr6_qbl_hap2 4565931 + 2469153 2469203 chr15 102531392 - 65978487 65978537 12839283
-50
-
-chain 246 chr6_qbl_hap2 4565931 + 3697415 3697467 chr12 133851895 - 104314075 104314127 28162397
-52
-
-chain 47340388 chr6_random 1875562 + 1357431 1875562 chr6 171115067 + 157393490 158069469 78
-906	2	2
-193	1	0
-29	1	0
-8	10	8
-11	2	1
-842	41	40
-754	2304	72101
-91082	5628	50000
-31833	338	50000
-42477	272	0
-39	168	66
-53	1	1
-15	1	103
-64	2	172
-23	1	103
-14474	4	0
-30198	0	8
-1391	2	0
-1319	4	0
-142	0	3
-3412	9	7
-372	1	1
-22	1	1
-5871	0	1
-237	26	25
-3020	1	1
-83	1	1
-141	7	7
-201	2	1
-403	1	0
-3638	1	0
-20	1	0
-552	32	32
-1386	0	1
-4174	1	1
-37	1	1
-3912	5	5
-4160	2	0
-6561	0	1
-3879	0	1
-8665	0	1
-2170	0	3
-895	1	0
-1812	0	1
-36	0	4
-133	1	0
-165	0	9
-427	0	1
-917	1	0
-3166	0	1
-16647	1	0
-6161	10	10
-833	4	0
-1934	1	1
-56	1	1
-2622	9	9
-749	1	0
-482	0	2
-344	1	1
-32	1	1
-868	2	0
-444	0	3
-1096	12	0
-709	0	1
-113	1	1
-35	1	1
-2349	20	0
-175	0	1
-1675	0	2
-1206	0	3
-345	0	5
-4695	1	0
-6715	1	1
-35	1	1
-2131	0	1
-4220	8	0
-2065	1	0
-1986	0	1
-484	0	1
-1543	4	4
-52	22	0
-5090	0	1
-2768	9	2
-12577	0	5
-13727	9	9
-51	4	4
-26	2	3
-11	0	1
-735	1	1
-35	0	1
-12	1	1
-2616	1	0
-327	1	1
-35	1	1
-345	0	20
-50	98	187
-975	1	0
-7329	0	1
-3241	0	35
-583	5	5
-278	1	1
-40	1	1
-123	12	12
-1208	17	0
-477	0	1
-163	1	1
-28	1	1
-3307	1	0
-66	1	1
-25	4	0
-2459	0	1
-1326	1	0
-700	1	0
-2316	6067	13
-725	3	0
-42	1	1
-8162	0	2
-2147	0	2
-79	1	1
-25	1	1
-313	1	0
-2194	1	0
-709	1	1
-33	1	1
-934	4	4
-543	1	1
-37	1	1
-2581	1	0
-606	1	0
-666	1	1
-34	2	2
-250	9	8
-652	1	0
-2306	22	0
-38	0	24
-946	1	0
-3766	1	1
-57	1	1
-3591	2	0
-128	1	1
-1414	7	1
-435	1	1
-29	1	0
-529	0	1
-3649	1	1
-32	0	1
-9760	0	18
-6470	1	1
-49	1	1
-488	0	1
-304	2	0
-1780	0	5
-2759	1	0
-48	1	1
-380	1	1
-33	1	1
-5102	1	1
-33	1	1
-192	0	1
-1103	1	1
-29	1	1
-12912	0	1
-9445	2	0
-2949	1	1
-28	1	1
-826	1	1
-19	1	1
-404	1	1
-49	1	1
-1408	8	0
-1625	10	0
-2962	0	1
-1824
-
-chain 37689909 chr6_random 1875562 + 884671 1286589 chr5 180915260 - 167715260 168127349 92
-6889	0	1
-34829	1	0
-4156	0	2
-4477	0	8
-7827	0	415
-37	9	9
-207	0	1
-272	7	7
-7925	1	0
-75982	0	1
-11336	0	1
-4233	14	14
-362	10	10
-4607	4	0
-1310	0	3
-1741	4	0
-499	1	1
-69	1	1
-509	15	15
-166	12	8
-145	0	2
-66	1	1
-16	1	1
-325	1	1
-31	1	1
-804	1	1
-109	1	1
-1071	0	106
-73	38	121
-1998	1	1
-37	1	1
-500	0	5
-625	3	0
-2354	1	1
-42	1	1
-1652	0	1
-92	1	1
-68	1	1
-1023	1	1
-16	1	1
-849	2	1
-28	1	1
-1793	4	2
-850	26	26
-251	0	2
-794	1	1
-26	1	1
-798	1	1
-80	1	1
-211	20	12
-153	1	3
-373	6	6
-231	0	4
-302	1	1
-26	1	1
-305	0	4
-3735	1	0
-342	0	2
-2211	0	1
-1969	2	0
-2834	0	10
-1054	0	14
-2176	0	2
-10517	0	2
-3071	6	0
-5697	21	21
-2458	0	5
-1335	3	0
-411	1	5
-2718	10	11
-3652	1	0
-785	1	0
-777	1	0
-2088	0	1
-24	1	1
-1005	16	16
-5426	18	0
-378	1	0
-19	1	1
-5303	0	14
-19	18	0
-2125	1	0
-936	0	5
-29	1	1
-893	19	19
-312	0	2
-32151	1	0
-14548	1	0
-109	0	1
-1481	1	0
-6537	0	2
-3390	1	0
-7479	6	0
-29963	4	0
-3972	9	5
-1637	0	9
-7977	1	0
-1973	0	3
-1212	0	5
-372	29	19
-1216	0	50
-628	0	4
-8388	0	1
-1429	1	0
-3029	2	4
-785	1	0
-291	10	9516
-1642	0	1
-5042	1	0
-1117	1	0
-1558	8	7
-1475	4	0
-1859	0	1
-9528	0	1
-877
-
-chain 31999718 chr6_random 1875562 + 165017 507468 chr6 171115067 - 55532370 55875067 101
-42954	0	1
-24905	1	0
-579	0	6
-612	0	1
-1128	0	2
-5541	1	1
-30	1	1
-2064	1	0
-505	0	1
-1974	0	1
-5299	1	1
-16	1	1
-368	1	1
-28	1	1
-7024	1	0
-19574	8	9
-6646	4	0
-6060	0	1
-2290	0	1
-22638	6	58
-1402	0	1
-502	0	1
-218	0	1
-5768	0	1
-178	0	3
-659	1	1
-33	0	8
-92	4	0
-693	0	2
-1190	0	3
-375	5	0
-422	3	0
-2215	1	0
-7271	1	1
-33	1	1
-817	1	1
-67	1	1
-2442	1	1
-62	16	0
-165	1	0
-1535	1	1
-32	1	1
-596	4	4
-627	1	1
-22	1	2
-201	5	5
-35	1	1
-232	5	0
-651	4	4
-26	1	1
-105	1	1
-45	1	1
-325	1	1
-34	1	1
-265	1	1
-91	2	0
-1383	1	1
-35	1	1
-1469	19	19
-295	0	1
-644	0	1
-3324	1	1
-44	1	1
-1797	1	5
-21	2	0
-10	11	1
-58	2	0
-61	1	9
-715	0	1
-388	1	1
-47	1	1
-774	1	0
-571	0	3
-2308	0	1
-103	15	15
-1339	1	1
-19	1	1
-348	0	1
-372	1	1
-31	0	1
-4	4	0
-14	1	5
-14	1	25
-4634	1	1
-16	2	2
-305	27	24
-2252	10	217
-1695	0	2
-2541	0	7
-741	2	0
-1401	0	2
-202	2	13
-3853	1	0
-3037	36	0
-18	2	0
-25	94	0
-14	0	4
-487	0	1
-5889	0	1
-572	1	1
-17	1	1
-806	1	1
-24	1	1
-723	0	2
-1640	1	0
-2023	1	1
-21	1	1
-192	15	1
-994	0	106
-1362	2	0
-324	1	1
-19	1	1
-683	1	1
-39	1	0
-771	1	0
-1211	13	0
-1728	1	1
-23	1	1
-911	0	2
-1042	6	6
-206	5	0
-17	1	1
-3351	14	19
-783	1	1
-48	1	1
-673	0	4
-137	1	1
-23	1	0
-1357	4	0
-254	0	1
-1408	0	7
-564	1	1
-49	1	1
-319	13	13
-721	12	12
-821	2	0
-912	4	4
-47	1	1
-148	1	1
-61	1	1
-267	1	1
-46	1	1
-421	1	1
-36	1	1
-577	1	1
-35	1	1
-122	1	1
-95	1	1
-241	1	1
-40	1	1
-585	10	1
-1286	0	1
-97	2	0
-22	1	1
-969	0	1
-1448	14	20
-2000	1	0
-1448	0	1
-2390	1	1
-18	5	5
-1421	1	0
-412	0	1
-1867	2	1
-179	3	0
-852	1	0
-1426	20	18
-151	1	1
-26	1	1
-581	1	1
-86	2	1
-2659	1	0
-12163	2	0
-1149	13	13
-818	16	16
-113	1	1
-51	1	1
-343	1	1
-91	0	4
-7	2	0
-8	0	2
-914	1	1
-28	1	1
-670	1	0
-151	7	7
-1887	18	18
-119	0	5
-2395	2	0
-4395	0	6
-380	6	1
-423	17	17
-531	1	0
-23	0	6
-592	1	1
-23	1	0
-844	4	0
-1497	6	0
-407	17	17
-341	19	17
-1020	0	6
-178	1	0
-1233	0	1
-1861	0	1
-2007	2	0
-6480	1	1
-36	1	1
-6817	17	20
-3356	7	5
-1788	1	1
-83	0	1
-7678	18	18
-2095	1	1
-19	1	1
-4934
-
-chain 25195472 chr6_random 1875562 + 615192 884135 chr6 171115067 + 167833423 168297434 120
-2006	1	0
-2654	1	1
-28	1	1
-3139	1	1
-85	1	1
-690	0	1
-639	0	2
-1589	4	4
-122	2	0
-1127	0	1
-1104	1	102
-18	0	29
-40	0	3
-22	1	4
-50	0	26
-56	124	195105
-10440	18	25
-3042	0	24
-72	0	8
-206	4	0
-146	4	0
-2483	0	4
-702	0	1
-1035	0	8
-85	3	1
-2710	1	1
-84	1	1
-3774	1	1
-58	1	1
-20613	15	53
-14	32	0
-52	0	4
-1883	4	0
-52	3	0
-44036	171	0
-2224	2	2
-57	1	1
-7263	0	64
-5311	0	2
-24677	8	8
-1972	1	0
-3543	2	2
-46	1	0
-11768	1	0
-494	47	19
-36447	1	1
-67	1	1
-11347	8	0
-4230	1	3
-591	5	5
-1020	0	8
-680	1	1
-60	1	1
-4536	0	1
-1417	0	2
-2471	1	1
-22	1	1
-6781	0	5
-4943	5	0
-1067	2	0
-2588	2	0
-523	34	35
-9266	0	2
-3897	0	2
-1404	0	1
-3120	0	1
-2566	1	0
-1825	0	8
-5342
-
-chain 9830417 chr6_random 1875562 + 510011 615192 chr5 180915260 - 108917398 109022458 335
-331	57	57
-1247	1	0
-4094	15	15
-6775	12	0
-6148	1	0
-30	1	1
-251	0	1
-26	26	1
-238	1	1
-29	1	1
-148	1	1
-41	1	1
-5831	6	7
-2439	1	0
-4247	12	42
-2333	1	9
-3039	5	0
-476	2	2
-4359	0	1
-1237	11	11
-1223	12	0
-2800	2	0
-2660	0	1
-4531	1	1
-24	1	1
-7407	0	1
-395	2	0
-1841	391	0
-410	50	26
-321	1	1
-27	1	1
-226	9	9
-157	6	6
-80	1	1
-70	1	1
-5158	10	10
-1385	4	0
-991	0	2
-48	1	1
-1083	0	2
-751	0	1
-4266	1	1
-48	1	1
-1557	0	304
-1552	1	1
-21	1	1
-2652	1	0
-598	0	8
-115	15	16
-1277	1	1
-38	1	1
-898	1	1
-27	1	1
-699	0	1
-34	1	1
-279	4	0
-12	1	1
-2863	1	1
-25	1	1
-2484	12	15
-1447	1	0
-8689
-
-chain 8736931 chr6_random 1875562 + 25094 155092 chr6 171115067 - 3172994 3267843 378
-3079	5	5
-1125	2	0
-1270	7	14
-1955	1	1
-47	1	1
-4538	38	38
-1300	25	26
-67	7	8
-176	3	0
-1132	3	0
-906	103	48
-5311	0	16
-133	1	0
-94	153	987
-142	13	13
-2453	2	0
-238	2	0
-960	13	13
-4697	1	1
-26	1	1
-3575	36650	734
-4434	0	1
-5190	138	107
-33	1	1
-5998	4	0
-1660	1	0
-4740	1	1
-29	1	1
-7196	0	12
-17519	30	29
-12768
-
-chain 553807 chr6_random 1875562 + 1768811 1774813 chr4 191154276 - 111879139 111885141 10762
-1294	2	2
-109	1	1
-242	1	1
-106	1	1
-2122	1	1
-17	1	1
-200	1	1
-40	1	1
-1071	1	1
-24	1	1
-284	1	1
-77	1	1
-403
-
-chain 255982 chr6_random 1875562 + 1456339 1459136 chr6 171115067 + 157377507 157380303 364419
-1101	4	4
-21	1	0
-70	43	44
-1490	1	0
-66
-
-chain 238316 chr6_random 1875562 + 1453720 1456237 chr6 171115067 - 13762873 13765390 431401
-2517
-
-chain 190390 chr6_random 1875562 + 1355230 1357270 chr6 171115067 - 13765611 13767650 644275
-875	0	1
-30	1	0
-7	0	1
-32	2	0
-1093
-
-chain 147846 chr6_random 1875562 + 163259 164828 chr10 135534747 - 86648034 86649603 870502
-1569
-
-chain 66179 chr6_random 1875562 + 509035 509994 chr6 171115067 - 55868072 55869030 1909901
-52	241	240
-666
-
-chain 39557 chr6_random 1875562 + 507468 508471 chr14 107349540 - 76514262 76515265 2447482
-67	13	13
-252	48	48
-70	43	43
-73	340	340
-97
-
-chain 15445 chr6_random 1875562 + 574580 574743 chr6 171115067 + 168277787 168277950 14597733
-163
-
-chain 11899 chr6_random 1875562 + 508034 508258 chr7 159138663 - 61729371 61729595 2527246
-50	119	119
-55
-
-chain 6795 chr6_random 1875562 + 508264 508336 chr5 180915260 + 74550099 74550171 28643390
-72
-
-chain 5830 chr6_random 1875562 + 884328 884389 chr6 171115067 - 37135398 37135459 31091070
-61
-
-chain 5767 chr6_random 1875562 + 508601 508846 chr8 146364022 + 54253304 54253548 3655159
-50	103	102
-92
-
-chain 4821 chr6_random 1875562 + 16131 16182 chr10 135534747 - 59552661 59552712 34213212
-51
-
-chain 3598 chr6_random 1875562 + 720272 720329 chr6 171115067 + 168133749 168133806 2857460
-57
-
-chain 3185 chr6_random 1875562 + 1768774 1768810 chr2 243199373 + 130168617 130168653 16948
-36
-
-chain 2982 chr6_random 1875562 + 508896 508970 chr12 133851895 - 4327021 4327095 12758815
-74
-
-chain 2685 chr6_random 1875562 + 509240 510388 chr3 198022430 - 97729559 97730704 3388749
-33	1069	1066
-46
-
-chain 2530 chr6_random 1875562 + 720329 720365 chr6 171115067 + 168133920 168133956 3810246
-36
-
-chain 2208 chr6_random 1875562 + 720386 720422 chr6 171115067 + 168133692 168133728 3917950
-36
-
-chain 1957 chr6_random 1875562 + 507800 507848 chr1 249250621 - 36684504 36684552 2679811
-48
-
-chain 1423 chr6_random 1875562 + 508846 508894 chr2 243199373 - 143356177 143356225 7803118
-48
-
-chain 1172 chr6_random 1875562 + 508537 508601 chrX 155270560 + 123719418 123719482 4007841
-64
-
-chain 1047 chr6_random 1875562 + 509273 509328 chr20 63025520 + 3479096 3479151 2808508
-55
-
-chain 560 chr6_random 1875562 + 508669 508719 chr5 180915260 - 128392227 128392277 20287927
-50
-
-chain 14618906734 chr7 158821424 + 102995 158821424 chr7 159138663 + 10238 159128663 7
-973	5	0
-3912	0	2
-1234	4	0
-51	0	6
-70	1	1
-24	1	0
-143	8	0
-16	170	1
-47	1	1
-243	0	6
-913	3	0
-2538	980	0
-63	1610	0
-1362	0	1
-2104	0	456
-1158	0	1
-791	1	1
-49	0	1
-4175	8	0
-17	1	1
-4845	12	0
-2509	0	1
-1697	6	6
-192827	150000	278557
-5682472	0	1
-42007910	40000	35970
-4371	7	16
-17699	0	4
-5249	4	0
-2088410	1	1
-47	1	1
-4565	0	1
-7116	0	1
-2706	40000	43050
-6577293	50000	13552
-1052855	3000000	3000000
-256182	50000	416507
-190137	50000	50000
-5722629	24	25
-239	1	1
-59	2	2
-138	1	1
-34	1	1
-206	1	3
-18	1	0
-410	1	1
-72	1	1
-199	1	1
-62	5	5
-120	1	0
-468	1	1
-32	1	1
-264	1	1
-23	1	1
-1459	4	4
-107	1	1
-42	1	0
-14	1	1
-201	1	1
-46	1	1
-268	20	20
-303	2	1
-866	0	4
-76	3	3
-63	1	1
-74	1	0
-25	1	1
-66	1	1
-34	0	2
-180	35	36
-93	1	1
-41	1	1
-70	1	1
-49	1	1
-63	1	1
-57	1	1
-383	1	1
-133	1	1
-87	1	1
-38	4	4
-50	0	1
-46	5	6
-136	11	11
-200	1	1
-63	4	0
-6	9	0
-263	1	1
-32	3	3
-152	16	16
-567	1	0
-322	3	0
-1258	0	1
-505	4	0
-1141	11	10
-537	12	12
-1418	1	1
-47	0	1
-164	7	7
-90	5	0
-156	1	1
-20	1	1
-380	3	3
-41	3	0
-5	2	2
-921	1	1
-34	1	1
-1607	2	2
-73	66	0
-46	14	0
-168	1	1
-53	1	1
-3195	1	1
-23	1	1
-2115	0	14
-9872	1	0
-1204	13	13
-416	1	0
-2311	319	0
-6906	0	10
-184	24	0
-2933	4	0
-1392	0	12
-1856	5	0
-3439	0	1
-469	3	0
-771	15	12
-497	1	1
-65	1	1
-1210	0	2
-4131	10	10
-1198	1	0
-718	1	1
-21	1	1
-3668	1	0
-874	1	1
-25	1	1
-2444	0	1
-1867	1	1
-29	1	1
-1660	0	1
-1232	0	6
-784	1	0
-705	0	3
-3577	1	0
-365	1	0
-3389	8	4
-2652	0	3
-664	0	1
-169	1	0
-8	1	1
-138	0	1
-8037	0	56
-112	196	0
-495	0	35
-3028	1	1
-40	1	1
-1068	4	0
-631	0	33
-29	2	0
-86	9	1
-3081	2	0
-806	0	1
-21	1	1
-3901	26	27
-843	0	1
-6916420	250000	50000
-25789103	0	51216
-1399994	1	0
-3623	0	212
-38	1	1
-210	1	0
-5	1	0
-6	1	0
-18	1	0
-1321	16	0
-2187	1	0
-145	0	1
-1388	7	7
-2240	14	14
-771	1	1
-34	1	1
-92	1	1
-39	1	1
-505	1	0
-66	1	1
-49	1	1
-159	1	0
-78	3	0
-15	2	0
-7	1	0
-28	1	0
-27	468	5
-2022	1	0
-1796	7	7
-61	1	1
-20	1	1
-4560	3	0
-157730	1	0
-194	14	14
-650	0	12
-717	26	26
-819	0	5
-278	60	32
-69	0	5
-1345	8	0
-652	84	0
-118	0	4
-498	0	1
-3187	1	1
-43	1	1
-1476	0	3
-2101	5	0
-788	6	6
-872	0	6
-893	3	0
-155	33	33
-4610	5	7
-521	10	0
-2773	40	40
-627	43	43
-1424	0	1
-2554	8	8
-44	0	7
-615	1	1
-32	3	0
-2693	0	1
-1029	0	2
-151	0	1
-1753	0	21
-370	2	3
-969	0	1
-452	1	0
-3035	1	1
-40	1	1
-704	0	2
-2472	0	6
-238	1	0
-1442	1	1
-37	5	5
-126	0	1
-795	0	1
-1191	1	0
-171	17	16
-724	6	5
-2988	40	42
-359	2	0
-199	19	19
-1969	1	0
-251	0	1
-729	0	1
-992	27	27
-205	4	0
-3209	0	2
-1006	8	10
-1571	10	10
-756	0	1
-36	1	1
-433	0	1
-672	0	3
-4430	157	0
-5606	5	1
-17	1	1
-942	10	9
-3433	2	1
-24	1	1
-4262	13	0
-661	2	0
-167	8	0
-3474	6	11
-217	0	2
-778	34	34
-158	0	1
-1167	0	1
-684	0	1
-878	39	39
-2012	0	1
-345	52	52
-640	0	2
-27874045	0	136705
-2519	0	2
-1000	8	0
-14695	1	0
-4456	1	0
-2977	1	0
-9065130	25000	29055
-2369	1	0
-12174	18	20
-877	0	4
-5247	0	12
-3483	2	0
-6766	0	1
-2469878	0	1
-734	2	2
-99	0	1
-2471	1	1
-11	1	1
-758	8	0
-2234	13	14
-8394	1	0
-47	1	1
-903	0	1
-5537	0	1
-269	1	0
-7114	1	1
-30	1	1
-2412	0	1
-2442	21	21
-91	1	1
-37	1	1
-96	1	1
-22	1	1
-246	1	1
-23	1	1
-254	12	12
-569	1	1
-27	1	1
-1624	1	0
-112	3	3
-45	1	1
-384	13	13
-70	1	0
-658	1	1
-20	1	1
-176	1	0
-307	19	19
-428	1	1
-19	1	1
-87	1	1
-30	1	1
-140	1	0
-292	2	0
-1492	1	0
-302	0	2
-364	1	1
-35	1	1
-1956	0	1
-728	12	12
-6522	2	2
-1531	1	0
-488	1	0
-2056	18	8
-1286	1	1
-27	1	1
-731	1	0
-1423	0	7
-2010	1	1
-19	1	1
-6423	0	4
-57	1	1
-4505	13	0
-933	0	12
-1250	0	1
-1313	1	0
-2610	0	1
-2398	0	1
-453	1	0
-346	1	1
-12	1	1
-83	25	25
-83	12	12
-277	0	1
-45	1	0
-811	2	0
-164	0	1
-104	0	1
-32	1	1
-1386	0	14
-306	1	1
-43	1	1
-2765	0	1
-1819	0	1
-1480	1	1
-24	1	1
-276	0	1
-21	0	1
-119	2	0
-12	26	0
-541	1	1
-63	1	1
-180	0	1
-2456	1	0
-1055	1	0
-1166	2	0
-784	0	4
-170	1	0
-939	6	0
-5597	15	15
-1253	0	1
-3336	0	18
-1851	9	0
-45	1	1
-657	38	38
-4099	0	1
-1387	2	0
-1460	1	0
-204	0	5
-1506	0	1
-2621	1	0
-6620	0	1
-34	1	1
-249	1	0
-1440	0	10
-245	0	1
-368	1	9
-257	4	0
-1589	6	0
-1543	0	1
-4189	120	0
-354	312446	278046
-3734	24	25
-3097	1	0
-8	1	1
-4861	0	4
-5649	1	0
-2011	0	1
-4344	24	24
-10546	42	1467
-20955	0	1
-2075	2	1
-5546	1	0
-2168	4	0
-1266	1	0
-4124	1	1
-46	1	1
-54	1	1
-43	15	0
-780	1	1
-25	1	1
-497	0	1
-46	1	1
-810	0	1
-5701	0	1
-6998	0	1
-2002	0	3
-7160	1	1
-24	1	1
-479	2	0
-1872	0	1
-1192	1	0
-371	2	0
-31	1	1
-572	16	16
-1725	16	16
-588	1	1
-90	1	1
-2483	3	19
-187	0	1
-20	1	1
-3673	1	1
-27	4	0
-3021	1	0
-1323	19	6
-498	13	13
-1618	2	0
-5282	0	1
-719	0	8
-2994	1	0
-2822	0	2
-1396	1	1
-48	1	1
-8723	5	0
-291	1	1
-25	1	1
-116	0	1
-2809	1	1
-27	1	1
-224	1	1
-48	1	1
-292	0	2
-400	0	1
-754	1	1
-19	1	1
-4225	1	1
-28	1	1
-801	1	0
-671	1	1
-17	1	1
-390	1	1
-28	1	1
-84	7	7
-568	1	1
-56	1	1
-499	7	8
-266	1	1
-31	1	1
-518	18	18
-164	1	1
-50	1	1
-162	1	1
-60	1	1
-702	1	1
-28	1	1
-146	18	17
-517	1	1
-24	1	1
-686	12	12
-101	1	1
-22	5	5
-107	5	5
-277	9	9
-272	1	1
-48	1	1
-77	1	1
-67	1	1
-1548	1	1
-40	1	1
-763	1	1
-42	1	1
-541	8	8
-88	1	1
-77	1	1
-233	11	11
-311	1	1
-22	1	1
-147	1	8
-504	1	1
-26	1	1
-987	20433	0
-3090	1	0
-405	5	5
-1811	1	0
-1174	0	1
-70	1	1
-1100	10143	18
-2722	0	1
-2957	1	1
-32	1	1
-9585	0	1
-1350	0	1
-473	0	1
-675	0	1
-1435	0	1
-805423	0	79189
-10872737	100000	100000
-721570	1	1
-19	1	1
-816	1	1
-44	1	1
-572	8	6
-2021	0	4
-1001	2	0
-3757	1	0
-5942	2	2
-70	1	1
-100	7	7
-395	80000	17188
-1010	1	1
-45	1	1
-1486	18	18
-173	1	17
-15	1	17
-158	0	192
-33	0	368
-50	50	2
-40	1	1
-95	4	52
-60	39	8
-15	16	0
-92	16	0
-1589	0	1
-897	13	13
-28	3	3
-2454	1	1
-44	1	1
-301	0	468
-2030	1	1
-45	1	1
-1277	8	0
-1716	1	0
-1579	11	15
-2439	36	0
-39	37	1
-349	21	92
-2096	13	11
-192	1	1
-48	1	1
-130	1	1
-22	1	1
-970	1	1
-23	4	0
-64	0	14
-129	17	11
-154	13	14
-53	15	5
-48	1	1
-47	0	2
-114	18	16
-363	1	1
-43	1	1
-559	1	1
-32	1	1
-3980007
-
-chain 16701236 chr7 158821424 + 141723881 141902219 chr7 159138663 - 16862466 17040468 171
-1662	1	1
-69	1	1
-887	1	1
-16	1	1
-115	339	1
-1512	0	1
-3597	0	1
-309	2	0
-34	1	1
-623	0	2
-1746	2	0
-816	4	0
-7868	1	0
-22	0	4
-593	0	1
-2757	0	1
-1147	7	7
-134	1	1
-42	1	1
-669	1	1
-25	1	1
-539	1	1
-49	1	1
-1387	1	1
-53	0	1
-19	1	1
-878	1	1
-27	1	1
-9739	1	1
-15	1	1
-2064	0	1
-1069	1	1
-31	1	1
-612	0	1
-21	1	1
-821	2	0
-1002	2	0
-3478	4	0
-1394	1	1
-25	1	0
-60	1	0
-4	1	0
-10	1	0
-23	0	1
-12	0	1
-2396	1	1
-25	1	1
-401	0	2
-1918	0	2
-43	1	1
-806	1	1
-36	1	1
-126	1	1
-53	1	1
-411	5	5
-524	13	13
-2896	1	1
-62	1	1
-4194	2	0
-8269	2	0
-368	11	10
-546	1	0
-1040	2	0
-45	1	1
-234	1	1
-29	1	1
-1218	16	16
-206	11	11
-584	13	13
-334	4	4
-167	3	3
-31	1	1
-973	9	9
-142	81	81
-58	1	0
-74	1	0
-1707	19	19
-2413	1	1
-57	1	1
-160	1	1
-23	1	1
-2380	0	1
-5561	0	4
-2790	14	14
-76	3	0
-1823	1	1
-11	0	9
-6	2	0
-5	3	0
-9	5	0
-28	1	1
-727	1	1
-37	1	1
-2678	0	3
-1497	1	0
-3414	1	0
-1171	6	6
-4018	7	7
-269	1	1
-36	1	1
-366	1	1
-22	1	1
-916	0	9
-2431	1	1
-68	1	1
-855	4	4
-1052	2	2
-81	0	2
-45	7	7
-648	1	1
-27	1	1
-402	1	0
-791	1	1
-41	1	1
-1041	20	20
-1094	1	1
-29	4	0
-364	1	1
-40	0	1
-22	0	1
-124	0	1
-205	0	1
-720	0	1
-59	1	1
-1063	2	0
-112	2	0
-3106	15	15
-2542	1	1
-64	1	1
-3052	1	1
-73	1	1
-3722	1	1
-31	1	1
-3476	1	0
-229	1	1
-40	1	1
-1321	0	5
-1845	1	0
-558	5	5
-3811	19	19
-125	1	1
-25	1	1
-3387	1	0
-1781	4	4
-2191	0	1
-1201	0	1
-260	1	1
-17	7	7
-137	0	1
-38	1	1
-732	0	1
-1626	1	0
-1987	2	0
-45	1	1
-763	0	1
-1978	0	1
-135	1	0
-6209	1	0
-24	1	1
-4867	0	1
-171	0	1
-6299
-
-chain 6490016 chr7 158821424 + 34000 116005 chr16 90354753 - 90001 171511 354
-591	11	11
-383	0	4
-1364	1	0
-430	12	13
-1431	1	1
-21	1	1
-490	12	12
-509	1	1
-97	1	1
-604	2	0
-1188	1	3
-665	1	1
-22	6	0
-499	1	1
-19	1	1
-402	1	1
-51	1	1
-1193	0	4
-245	1	0
-688	0	1
-975	2	0
-463	0	23
-73	24	0
-32	7	0
-165	1	0
-1593	1	1
-20	1	1
-1203	1	1
-31	1	1
-740	2	0
-47	1	1
-485	1	1
-63	1	1
-381	5	0
-28	1	1
-254	1	1
-22	1	1
-306	0	1
-34	1	1
-283	0	2
-627	10	10
-74	1	1
-50	1	1
-1053	0	1
-54	1	1
-77	1	1
-210	1	1
-70	0	3
-1957	0	4
-2154	1	1
-69	1	1
-147	67	67
-69	1	1
-74	1	1
-242	1	1
-41	1	1
-63	5	5
-155	3	1
-101	1	1
-53	1	1
-877	1	1
-21	1	1
-60	1	1
-49	1	1
-167	1	1
-21	1	1
-623	15	15
-202	0	97
-86	0	49
-9	2	2
-84	5	248
-56	1	98
-40	0	1
-48	1	0
-87	1	1
-55	99	1
-50	50	0
-23	1	1
-81	0	194
-78	1	1
-55	3	3
-53	6	344
-15	1	1
-262	1	1
-80	1	1
-455	1	1
-108	3	3
-431	1	1
-101	1	1
-158	1	0
-9	1	1
-323	3	0
-85	1	1
-19	1	1
-345	32	0
-24	1	1
-342	1	1
-65	1	1
-90	8	8
-545	1	1
-130	2	2
-87	4	3
-62	3	3
-34	2	2
-77	1	1
-47	1	1
-61	1	1
-27	1	1
-224	7	7
-117	2	0
-17	1	1
-242	1	1
-34	1	1
-107	1	1
-36	1	1
-100	15	15
-154	0	8
-13	1	0
-34	5	5
-100	27	27
-263	11	11
-116	1	1
-41	1	1
-117	1	1
-49	1	1
-116	2	0
-70	1	1
-174	1	1
-125	1	1
-70	1	1
-30	1	1
-74	1	1
-32	1	1
-337	1	1
-49	1	1
-2127	1	1
-35	1	1
-538	1	1
-32	1	1
-744	10	10
-471	53	17
-2001	7	7
-453	1	0
-2656	0	1
-1785	1	0
-1454	1	1
-33	1	1
-419	1	1
-49	1	1
-4610	1	1
-36	1	1
-905	1	1
-13	0	2
-5128	17	17
-519	0	3
-613	7	0
-660	0	4
-2632	1	2
-278	21	21
-969	1	0
-2852	14	14
-149	1	1
-21	1	1
-198	1	1
-29	1	1
-801	6442	6416
-125	6	0
-39	3745	3755
-814	162	1
-4	63	63
-74	63	0
-47	1056	13
-370
-
-chain 227647 chr7 158821424 + 141707499 141716076 chr7 159138663 + 142043811 142047809 475649
-53	484	465
-55	51	51
-78	242	220
-60	274	271
-51	13	13
-51	37	37
-229	4	4
-228	16	16
-108	47	47
-50	4583	49
-498	131	130
-945	36	36
-253
-
-chain 87685 chr7 158821424 + 58756 115635 chr3 198022430 - 71488 126874 406
-67	3328	3375
-28	1	1
-29	2	2
-39	50	50
-7	2	2
-41	2708	1663
-32	2831	2828
-27	46647	46820
-96	378	0
-152	47	12
-72	252	0
-43
-
-chain 48969 chr7 158821424 + 142175391 142175904 chr7 159138663 + 142475439 142475952 2613549
-513
-
-chain 47803 chr7 158821424 + 141911444 141913842 chr7 159138663 - 17029555 17031946 2683091
-78	139	139
-57	226	225
-124	92	92
-56	135	135
-72	193	193
-53	23	23
-133	958	952
-59
-
-chain 43189 chr7 158821424 + 142199519 142199970 chr7 159138663 + 142498738 142499189 3009311
-451
-
-chain 30396 chr7 158821424 + 67364377 67364696 chr15 102531392 - 56463077 56463396 4465114
-319
-
-chain 30094 chr7 158821424 + 141700053 141707301 chr7 159138663 + 142042846 142043613 4669748
-89	15	15
-68	6585	104
-66	129	129
-62	35	35
-199
-
-chain 30060 chr7 158821424 + 141963578 141964737 chr11 135006516 + 33264685 33266127 4680203
-91	398	397
-87	228	512
-77	163	163
-115
-
-chain 28591 chr7 158821424 + 141910578 141910878 chr7 159138663 - 17028690 17028990 5361712
-300
-
-chain 21822 chr7 158821424 + 141716123 141716468 chr7 159138663 + 142047850 142048195 9124304
-170	99	99
-76
-
-chain 20144 chr7 158821424 + 142166403 142167075 chr9 141213431 + 33792981 33793662 10344618
-82	380	389
-66	18	18
-51	19	19
-56
-
-chain 16654 chr7 158821424 + 101805867 101806156 chr7 159138663 - 92369277 92369565 11127744
-33	12	11
-63	91	91
-90
-
-chain 14923 chr7 158821424 + 102039289 102039446 chr7 159138663 + 102153090 102153247 2823
-157
-
-chain 10542 chr7 158821424 + 115456 115592 chr16 90354753 - 170836 170972 2672410
-136
-
-chain 10012 chr7 158821424 + 114469 115025 chr9 141213431 - 90660 90901 550
-63	395	80
-98
-
-chain 9195 chr7 158821424 + 141943788 141943884 chr7 159138663 - 16914722 16914818 24637833
-96
-
-chain 8667 chr7 158821424 + 142177809 142178136 chr7 159138663 + 142477851 142478180 25450135
-54	219	221
-54
-
-chain 7349 chr7 158821424 + 142180607 142180684 chr7 159138663 + 142480664 142480741 27551182
-77
-
-chain 7340 chr7 158821424 + 142180197 142180274 chr7 159138663 + 142480253 142480330 27565643
-77
-
-chain 6886 chr7 158821424 + 141960844 141960917 chr8 146364022 - 77913390 77913463 28463282
-73
-
-chain 6730 chr7 158821424 + 102059075 102062034 chr7 159138663 + 102172727 102175692 3338
-34	2887	2893
-38
-
-chain 6431 chr7 158821424 + 142166514 142166582 chr7 159138663 + 142454997 142455065 29498865
-68
-
-chain 6414 chr7 158821424 + 114166 115456 chr9 141213431 - 90644 91234 1816570
-68	791	378
-44	328	41
-59
-
-chain 6276 chr7 158821424 + 142176939 142177005 chr7 159138663 + 142476982 142477048 29891950
-66
-
-chain 6166 chr7 158821424 + 142179945 142180009 chr7 159138663 + 142480002 142480066 30171758
-64
-
-chain 5761 chr7 158821424 + 141963726 141963989 chr14 107349540 - 25420241 25420503 6848073
-68	130	129
-65
-
-chain 5666 chr7 158821424 + 142179798 142179857 chr7 159138663 + 142479855 142479914 31548103
-59
-
-chain 5608 chr7 158821424 + 101977370 101977454 chr7 159138663 + 44036096 44036185 7960
-10	0	5
-74
-
-chain 5430 chr7 158821424 + 142178562 142178619 chr7 159138663 + 142478613 142478670 32231795
-57
-
-chain 5139 chr7 158821424 + 142176520 142176574 chr7 159138663 + 142476565 142476619 33117712
-54
-
-chain 5020 chr7 158821424 + 141966623 141966675 chr12 133851895 + 53762512 53762564 33527602
-52
-
-chain 4939 chr7 158821424 + 142176195 142176247 chr7 159138663 + 142476241 142476293 33775264
-52
-
-chain 4778 chr7 158821424 + 73598 73651 chr5 180915260 - 172444 172497 587
-53
-
-chain 4039 chr7 158821424 + 101996220 101996263 chr7 159138663 + 102308194 102308237 1871
-43
-
-chain 3908 chr7 158821424 + 142167123 142167183 chr7 159138663 + 142455620 142455680 17639294
-60
-
-chain 3217 chr7 158821424 + 141963833 141963883 chr6 171115067 - 41704900 41704950 22743877
-50
-
-chain 2759 chr7 158821424 + 67423135 67423165 chr7 159138663 + 67785172 67785202 11329361
-30
-
-chain 2575 chr7 158821424 + 67423107 67423135 chr7 159138663 + 67785172 67785200 11329362
-28
-
-chain 2575 chr7 158821424 + 67423079 67423107 chr7 159138663 + 67785172 67785200 11329363
-28
-
-chain 2575 chr7 158821424 + 67423051 67423079 chr7 159138663 + 67785172 67785200 11329364
-28
-
-chain 2575 chr7 158821424 + 67423023 67423051 chr7 159138663 + 67785172 67785200 11329365
-28
-
-chain 2575 chr7 158821424 + 67422995 67423023 chr7 159138663 + 67785172 67785200 11329366
-28
-
-chain 2457 chr7 158821424 + 114257 114311 chr16 90354753 - 170806 170860 17475755
-54
-
-chain 2391 chr7 158821424 + 67422969 67422995 chr7 159138663 + 67785202 67785228 13667102
-26
-
-chain 2359 chr7 158821424 + 101974113 101974139 chr7 159138663 + 102286210 102286236 158723
-26
-
-chain 1502 chr7 158821424 + 141709533 141709580 chr7 159138663 + 142013474 142013521 12917072
-47
-
-chain 721 chr7 158821424 + 141963699 141963726 chr17 81195210 + 19853796 19853823 7983736
-27
-
-chain 615 chr7 158821424 + 141964154 141964190 chr19 59128983 - 28688778 28688814 21921932
-36
-
-chain 362 chr7 158821424 + 101987601 101987634 chr7 159138663 - 57149003 57149036 1101
-33
-
-chain 17312866 chr7_random 549659 + 162804 345700 chr7_gl000195_random 182896 + 0 182896 164
-182896
-
-chain 10142542 chr7_random 549659 + 0 112804 chr7 159138663 + 158928464 159038297 315
-4073	0	1
-5056	1	0
-1766	1	1
-63	5	5
-2422	1	0
-1297	1	0
-1967	196	0
-230	28	0
-2331	5	0
-47	1	1
-345	1	0
-41	1	1
-807	1	1
-31	1	1
-238	3	0
-100	1	0
-281	1	1
-43	1	1
-359	27	26
-59	1	1
-43	1	1
-1385	1	0
-161	1	0
-45	1	1
-1693	1	0
-93	1	0
-5	1	0
-805	0	3
-649	0	49
-1400	1	1
-4	1	0
-28	0	1
-7	0	1
-157	1	1
-117	0	31
-166	13	12
-138	1	0
-556	1	1
-46	1	1
-204	1	1
-21	1	1
-511	2	0
-390	1	1
-29	1	1
-60	1	1
-68	0	3
-27	1	1
-71	0	1
-37	5	0
-18	0	6
-56	3	3
-89	2	0
-103	6	15
-43	5	0
-7	0	11
-55	0	4
-456	46	45
-1286	1	1
-46	1	0
-36	2	0
-57	1	0
-396	1	1
-38	1	1
-298	1	1
-16	1	1
-602	224	0
-82	1	56
-1115	1	74
-17	3	3
-88	1	74
-98	158	12
-90	3	3
-70	3	3
-117	1	1
-43	1	1
-53	1	1
-21	1	1
-53	229	10
-120	81	8
-59	8	10
-411	1	0
-47	1	1
-723	0	9
-8142	6	6
-1297	1	1
-22	0	1
-7799	12	11
-1878	1	0
-70	5	5
-592	1	1
-28	1	1
-2251	1	0
-1474	1	0
-1975	0	1
-2577	0	1
-612	15	15
-93	1	0
-3	1	0
-149	1	0
-61	3	3
-34	1	0
-11	2101	0
-63	73	3
-67	106	1
-57	83	13
-60	70	0
-79	561	1
-321	70	0
-262	0	35
-83	183	8
-2406	0	549
-85	32	0
-27	0	26
-72	0	35
-22	3	0
-24	0	93
-74	2	0
-17	28	0
-63	1	0
-6	1	0
-1451	44	4
-23	1	1
-38	0	40
-80	1	121
-34	1	1
-58	0	82
-839	1	0
-31	1	1
-2861	0	4
-1376	1	1
-20	0	1
-78	2	0
-24	2	2
-2760	3	1
-585	8	0
-761	1	0
-6449	4	1
-259	1	1
-22	1	1
-717	0	1
-887	7	8
-2174	3	0
-970	1	0
-1768	12	0
-4378	0	1
-5	0	1
-13	1	0
-1637	5	10
-312	0	1
-2167	11	0
-164	10	10
-1517	1	1
-42	0	3
-698	0	4
-90	1	1
-20	1	1
-167	1	1
-16	1	1
-860	0	1
-1719
-
-chain 9633059 chr7_random 549659 + 402818 549659 chr7 159138663 + 514489 666751 345
-3766	22099	5004
-26	4	4
-11014	7	5
-17	1	0
-8	21	0
-3389	1	1
-54	1	1
-55	1	1
-66	1	1
-165	1	1
-38	1	1
-52	22350	21842
-816	4	4
-10432	15	15
-20532	1	1
-29	9	9
-13871	157	23205
-37837
-
-chain 2073422 chr7_random 549659 + 444161 465736 chr7 159138663 - 158510053 158531628 1246
-21575
-
-chain 1225579 chr7_random 549659 + 415456 428202 chr7 159138663 + 537499 550245 1943
-12746
-
-chain 745495 chr7_random 549659 + 406711 414469 chr7 159138663 - 158580384 158588142 6708
-215	11	11
-2423	4	4
-5105
-
-chain 224185 chr7_random 549659 + 399770 402202 chr7 159138663 + 518876 521308 490490
-367	50	50
-1609	1	1
-53	3	3
-304	1	1
-44
-
-chain 25943 chr7_random 549659 + 67571 70764 chr7 159138663 + 158995434 158996421 1881723
-67	73	3
-55	13	153
-17	71	0
-159	183	8
-119	21	21
-154	1960	0
-64	35	0
-105	35	0
-62
-
-chain 21070 chr7_random 549659 + 68795 70055 chr7 159138663 + 158995572 158996097 2684005
-86	98	63
-43	35	0
-76	455	0
-18	248	38
-61	57	57
-83
-
-chain 19298 chr7_random 549659 + 67796 68209 chr7 159138663 + 158995799 158996246 2040899
-35	195	229
-183
-
-chain 8295 chr7_random 549659 + 70341 70449 chr7 159138663 + 158996348 158996421 13908836
-11	35	0
-62
-
-chain 8007 chr7_random 549659 + 70264 70825 chr7 159138663 + 158995746 158996237 2373081
-77	186	46
-35	218	288
-45
-
-chain 7010 chr7_random 549659 + 69669 69742 chr7 159138663 + 158996026 158996099 13809421
-73
-
-chain 6757 chr7_random 549659 + 71674 71744 chr7 159138663 + 158996246 158996316 26425870
-70
-
-chain 6582 chr7_random 549659 + 16740 16849 chr7 159138663 + 158945342 158945395 9902405
-48	56	0
-5
-
-chain 5793 chr7_random 549659 + 36845 36905 chr7 159138663 + 158964922 158964982 31172491
-60
-
-chain 5504 chr7_random 549659 + 68645 69446 chr7 159138663 + 158995947 158996153 2767372
-68	176	1
-63	420	0
-74
-
-chain 5075 chr7_random 549659 + 34499 34552 chr7 159138663 + 158962931 158962984 33354772
-53
-
-chain 4386 chr7_random 549659 + 36139 36193 chr7 159138663 + 158964435 158964489 9901820
-54
-
-chain 4359 chr7_random 549659 + 69809 69854 chr7 159138663 + 158996061 158996106 24027999
-45
-
-chain 3345 chr7_random 549659 + 71561 71653 chr7 159138663 + 158995923 158996015 5823696
-92
-
-chain 3242 chr7_random 549659 + 36212 36249 chr7 159138663 + 158964435 158964472 7647561
-37
-
-chain 3169 chr7_random 549659 + 68713 69336 chr7 159138663 + 158995385 158995658 13517397
-46	500	150
-77
-
-chain 2856 chr7_random 549659 + 36091 36138 chr7 159138663 + 158964168 158964215 3415068
-47
-
-chain 2508 chr7_random 549659 + 74235 74267 chr7 159138663 + 158999705 158999737 11181217
-32
-
-chain 2422 chr7_random 549659 + 16701 16740 chr7 159138663 + 158944995 158945034 20425801
-39
-
-chain 2296 chr7_random 549659 + 76078 76102 chr7 159138663 + 159001472 159001496 26237556
-24
-
-chain 1888 chr7_random 549659 + 68772 68795 chr7 159138663 + 158995829 158995852 23967691
-23
-
-chain 1646 chr7_random 549659 + 16653 16684 chr7 159138663 + 158945171 158945202 6593972
-31
-
-chain 1510 chr7_random 549659 + 34573 34664 chr7 159138663 + 158962893 158962984 9181320
-91
-
-chain 1319 chr7_random 549659 + 70142 70185 chr7 159138663 + 158996289 158996332 23051286
-43
-
-chain 1065 chr7_random 549659 + 69520 69582 chr7 159138663 + 158996297 158996359 18766264
-62
-
-chain 13483752813 chr8 146274826 + 0 146274826 chr8 146364022 + 10000 146304022 9
-930417	1	1243
-52	10	10
-44	0	972
-100	0	54
-162	0	324
-409	0	1
-2323216	1	0
-3352649	2	0
-854996	100000	50000
-3399023	1	1
-46	1	1
-13965	1	1
-30	1	1
-121189	1	1
-35	1	1
-283700	0	1
-719291	100016	93054
-1155	0	2
-755	26	26
-980	21	21
-1479	54	54
-3597	1	0
-1937	19	19
-322	1	0
-1758	2	0
-1141	0	1
-956	48	48
-739	21	21
-1005	0	1
-543	1734	1734
-5338	15	15
-1029	1	1
-28	1	1
-305	57	57
-164	27	27
-5130707	0	1
-1288	0	1
-446	1	1
-80	1	1
-2123	4	4
-2514	3	0
-545	9	0
-527	1	1
-18	1	1
-256	9	9
-79	1	1
-40	1	1
-148	0	2
-2231	0	27
-958	1	1
-20	1	1
-2487	1	1
-113	1	1
-73	13	13
-365	10	10
-151	1	1
-32	3	0
-26	1	1
-1480	1	1
-29	1	1
-621	1	1
-28	1	1
-701	9	9
-362	1	1
-19	1	1
-691	1	1
-44	6	0
-47	1	1
-513	12	11
-382	1	1
-22	1	1
-111	1	1
-36	1	1
-337	1	1
-42	1	1
-602	2	0
-36	1	1
-475	1	1
-23	0	1
-32	4	3
-65	1	1
-59	1	1
-688	1	1
-22	1	1
-1473	1	1
-36	1	1
-372	1	1
-16	6	6
-1605	1	1
-38	1	1
-816	1	1
-17	1	0
-374	1	1
-17	1	1
-48	1	0
-82	1	1
-45	1	1
-263	1	1
-23	1	1
-204	1	1
-39	1	1
-2341	0	1
-2989	9	11
-811	8	8
-741	0	2
-337	1	1
-25	4	4
-763	1	1
-19	1	1
-343	1	1
-31	1	1
-1953	1	1
-74	1	1
-67	1	1
-18	4	4
-73	1	1
-31	1	1
-114	11	1
-87	1	1
-65	1	1
-125	9	9
-378	49	48
-90	1	1
-99	1	0
-173	13	7
-696	0	1
-6184	13	13
-830	13	13
-128	1	1
-37	1	1
-136	1	0
-66	5	6
-870	1	0
-4877	0	1
-585	3	7
-1728	1	0
-33	1	1
-465	1	1
-68	1	1
-581	6	0
-2088	1	0
-304	0	1
-2674	1	1
-28	1	0
-54	8	8
-846	0	1
-1409	16	16
-559	0	1
-407	0	5
-11	5	1
-29	1	1
-4051	1	1
-10	0	1
-43	1	1
-385	1	1
-35	1	1
-101	11	11
-602	1	0
-491	14	16
-1366	19	19
-321	1	1
-49	1	1
-546	1	1
-25	1	1
-2568	1	1
-51	4	0
-119	1	1
-39	0	1
-1040	0	1
-1682	0	4
-39	8	0
-862	1	1
-17	1	1
-587	1	1
-21	1	1
-904	0	1
-261	0	1
-1151	0	2
-2325	5	5
-5415	0	3
-1545	1	0
-428	4	4
-1950	2	0
-1073	0	1
-3653	0	86
-1283	1	1
-79	1	1
-6656	12	12
-1550	0	18
-5832	1	0
-4835	10	10
-1719	1	1
-84	1	1
-848	0	2
-236	1	1
-42	1	1
-1272	12	0
-49	1	1
-820	1	1
-22	1	0
-58	0	22
-510	8	8
-983	6	0
-539	14	14
-863	0	2
-27	1	1
-204	14	14
-163	4	4
-290	1	1
-59	1	1
-842	0	2
-2044	1	1
-90	0	1
-3434	0	3
-356	0	1
-873	0	1
-864	25	1
-630	12	7
-62	10	10
-156	11	11
-1364	19	19
-156	4	4
-244	4	18
-505	1	0
-109	1	1
-230	1	1
-107	4	3
-150	1	1
-83	5	5
-70	1	1
-33	1	0
-142	1	1
-626	5	6
-274	10	10
-128	1	1
-35	1	1
-216	1	1
-44	1	1
-312	1	1
-16	1	1
-1496	8	7
-451	0	1
-855	1	1
-20	1	1
-350	1	1
-62	1	1
-617	10	10
-845	1	1
-58	1	1
-2189	1	1
-147	1	1
-475	1	1
-27	1	1
-278	1	1
-17	1	1
-994	1	1
-40	1	1
-219	5	5
-26	1	1
-900	1	1
-29	1	0
-26	1	1
-484	15	16
-61	9	9
-114	21	26
-801	1	1
-33	1	1
-560	1	1
-37	1	1
-80	14	14
-211	1	1
-43	1	1
-156	1	1
-20	1	1
-685	1	1
-18	1	1
-48	4	0
-711	1	1
-38	1	1
-402	7	7
-1045	1	1
-37	1	1
-4035	9	9
-247	4	0
-4146274	17400	5734
-330366	0	1
-2346742	0	55
-413177	3	0
-450	1	0
-9436	3	1
-7044	4	0
-2886	1	0
-635	1	0
-16567	1	0
-6926	29	28
-9249	1	0
-14916	8	0
-12872	2	0
-3330	2	0
-2673376	2	0
-2603	1	1
-78	1	1
-2170491	7	7
-29817	66108	2485
-6473782	5	5
-39	1	1
-9574	0	2
-5879	1	1
-29	1	1
-6139	1	0
-2354	1	1
-28	1	1
-91	88	87
-142	16	15
-54	1	1
-22	3	3
-1479	4	4
-221	4	4
-132	1	0
-574	11	11
-23	1	0
-604	1	1
-44	1	1
-899	1	0
-70	1	0
-10	1	0
-13561	1	1
-44	1	1
-4476	4	4
-799	26	25
-1466	18	18
-17897	4	0
-1667	1	0
-4250	1	1
-44	1	3
-14	1	1
-4956	1	1
-18	1	0
-39	3	2
-4990	1	1
-47	13	13
-69	4	0
-9729	1	0
-355	0	1
-2186	1	1
-37	1	1
-6111	3	3
-100	4	4
-68	1	1
-43	1	1
-1126	5	7
-5520	8	8
-2316	1	1
-181	6	6
-50	1	1
-29	1	0
-83	1	1
-1073	245	639
-150	1	1
-25272	0	1
-2132	0	4
-2522	1	1
-48	1	1
-1498528	0	1
-6044582	3000008	3000000
-1291113	60074	16691
-3837	3	0
-811	1	0
-2567	1	0
-7375465	11	11
-42062	1	0
-19604621	1	0
-10692667	1	0
-110	0	1
-3577	0	3
-907	1	1
-18	1	1
-897	1	1
-64	535	251
-21	0	1
-140	0	1
-70	1	0
-77	9	10
-149	4	0
-5	1	5
-68	1	0
-142	5	5
-57	14	14
-43	1	1
-31034	124100	99683
-2301	0	2
-44	2	0
-568015	87325	183549
-330	5	5
-114	0	3088
-1776	0	3085
-949	0	4
-514	37	37
-963	15	14
-1351	71	71
-56	15	15
-405	713	713
-651	1	1
-41	1	1
-837	1	0
-658	0	1
-794	0	1
-73	1	1
-30	1	1
-817	51	51
-566	72	72
-195	0	12193
-1599	0	3085
-217	43	43
-247	29	29
-4148	1	0
-158	266	266
-696	20	20
-58	69	69
-100	13	13
-326	137	137
-151	35	35
-1804	151	151
-1341	289	289
-154	23	23
-1932	17	17
-111	47	47
-128	16	16
-78	30	30
-1022	6	10
-78	1	0
-342	31	31
-86	23	23
-1601	41	41
-144	49	49
-170	10	10
-398	23	23
-419	20	20
-955	55	55
-1139	11	11
-1925	0	276
-223	58	58
-702	25	25
-1030	23	23
-363	164	164
-653	16	16
-78	13	13
-1035	0	4
-514	37	37
-1069	10	10
-321	15	15
-603	68	68
-789	20	20
-56	25	25
-1007	5	5
-1198	24	24
-689	3	0
-743	32	32
-817	43	43
-574	11	11
-123	19	19
-618	28	28
-1270	15	15
-289	29	29
-106	11	11
-1395	46	46
-850	4	4
-777	62	62
-86	36	36
-374	97	97
-2072	31	31
-195	56	56
-379	80	80
-64	11	11
-191	18	18
-1051	13	13
-52	163	169
-1297	1	1
-25	1	1
-3451	0	188
-3097	0	9
-2715	1	0
-11829	0	3
-6001	28	0
-10728	0	1
-3770769	1	0
-62	1	0
-22	1	0
-827	1	0
-1485	1	0
-242	0	1
-7142	1	0
-4029	3	3
-69	1	1
-15865	1	0
-83463	4	0
-5976	9	0
-2661	1	0
-1483	1	0
-15868	4	0
-17798	1	0
-2649	1	0
-3627	1	0
-4789	1	0
-9541	1	0
-6844	1	0
-3187	2	0
-411	14	0
-3056	4	0
-19776	3	0
-29085	0	1
-745	2	0
-11453	2	0
-16739	1	0
-14697	1	0
-8539	1	0
-25514443	1	0
-17680	0	1
-55359	0	1
-58	57	59
-1515	1	0
-1111	1	0
-5736	6	6
-66213	1	0
-68	1	1
-24	6	7
-43	1	1
-33414	7	7
-22	1	1
-19312	0	1
-8588	1	1
-31	1	1
-15969	1	1
-32	1	1
-27034	1	1
-42	1	1
-3352	0	1
-15009	1	0
-20433	18	18
-32141	9	8
-116	41	41
-4920	1	0
-33364	1	0
-11160	15	17
-28423	1	0
-43835	1	1
-24	4	2
-269244	4	4
-37	1	1
-17193	4	3
-53	12	11
-23	2	1
-7	1	1
-37978	9	9
-37743	1	1
-35	3	3
-26636	1	1
-17	1	1
-8728292	1	0
-16734742	0	71275
-27	1	1
-657033	0	2
-2911	0	2
-1941	1	1
-35	1	1
-835	1	1
-116	1	1
-399	1	1
-101	1	0
-194	1	2
-450	1	0
-825	1	1
-73	1	1
-156	1	1
-58	1	1
-50	5	5
-153	11	11
-189	5	5
-233	1	1
-83	1	1
-642	0	1
-1380	1	1
-17	1	1
-315	1	1
-26	1	1
-786	0	901
-76	1	1
-45	1	1
-535	1	1
-34	1	1
-2007	7	7
-159	1	1
-26	1	1
-6362	13	13
-504325	100008	25635
-420771	0	232
-287680	0	104
-73	0	364
-181	0	55
-95	1	1
-46	1	1
-4002	1	1
-24	1	1
-183	49	0
-72	1	2
-8	1	0
-39	688	1
-306	0	50
-1939	0	1
-615	684	0
-254	0	1
-572035	7362	108542
-480202	1	0
-11866	6	6
-26917	0	1
-6097	15	15
-3074	0	1
-12292	0	1
-2209	0	1
-7358	0	1
-321393
-
-chain 161719 chr8 146274826 + 12213564 12217654 chr8 146364022 + 11922619 11926713 3890
-48	2333	2337
-1544	26	26
-139
-
-chain 94297 chr8 146274826 + 86864948 86909782 chr8 146364022 + 86767902 86816113 712
-43	4583	4586
-51	23	23
-69	22	22
-81	3466	3466
-114	1460	1461
-170	2237	2237
-47	3442	3445
-24	161	161
-49	1995	1995
-32	5554	5830
-116	4	4
-12	2309	5394
-37	2018	2018
-68	865	865
-25	3669	3669
-32	817	817
-42	1346	1346
-28	1574	1574
-29	1512	1515
-46	1652	1652
-41	2665	2665
-30	2224	2230
-50
-
-chain 49697 chr8 146274826 + 86036864 86037399 chr8 146364022 + 85964814 85965349 932809
-535
-
-chain 26725 chr8 146274826 + 86857851 86907733 chr8 146364022 + 86754632 86786590 1026
-491	49362	31438
-29
-
-chain 24621 chr8 146274826 + 145396034 145396288 chr8 146364022 + 145493131 145493385 2960834
-254
-
-chain 18039 chr8 146274826 + 144819613 144819801 chr8 146364022 + 144748845 144749033 12082915
-188
-
-chain 14890 chr8 146274826 + 86857082 86862299 chr8 146364022 - 59611598 59616815 1124
-71	476	476
-222	4397	4397
-51
-
-chain 13243 chr8 146274826 + 144819801 144819938 chr8 146364022 + 144748593 144748730 12136518
-137
-
-chain 9530 chr8 146274826 + 144823061 144823289 chr8 146364022 + 144751680 144751756 18947814
-3	152	0
-73
-
-chain 9463 chr8 146274826 + 144819938 144820036 chr8 146364022 + 144748632 144748730 13619337
-98
-
-chain 8087 chr8 146274826 + 86874741 86874834 chr8 146364022 + 86817360 86817453 1088
-93
-
-chain 7965 chr8 146274826 + 86865238 86879045 chr8 146364022 + 86780387 86797281 766
-29	7982	7984
-37	5729	8814
-30
-
-chain 7439 chr8 146274826 + 12201270 12203830 chr8 146364022 + 11910337 11912897 3584
-26	2480	2480
-54
-
-chain 6315 chr8 146274826 + 86909619 86909690 chr8 146364022 + 86556151 86556222 765064
-71
-
-chain 6303 chr8 146274826 + 144823559 144823625 chr8 146364022 + 144751722 144751788 29838951
-66
-
-chain 5756 chr8 146274826 + 86854716 86862896 chr8 146364022 + 86782059 86817706 1940
-37	8112	35579
-31
-
-chain 5521 chr8 146274826 + 144823643 144823701 chr8 146364022 + 144751730 144751788 31959915
-58
-
-chain 5339 chr8 146274826 + 144823077 144823133 chr8 146364022 + 144751620 144751676 32492605
-56
-
-chain 4702 chr8 146274826 + 144819343 144819392 chr8 146364022 + 144748967 144749016 12082914
-49
-
-chain 4684 chr8 146274826 + 144823154 144823323 chr8 146364022 + 144751621 144751752 19314390
-33	102	64
-34
-
-chain 4385 chr8 146274826 + 144820066 144820134 chr8 146364022 + 144748613 144748681 20813384
-68
-
-chain 3959 chr8 146274826 + 144820160 144820201 chr8 146364022 + 144748560 144748601 13619336
-41
-
-chain 3959 chr8 146274826 + 144819572 144819613 chr8 146364022 + 144748560 144748601 13619338
-41
-
-chain 3270 chr8 146274826 + 86905368 86905406 chr8 146364022 - 59611399 59611437 120315
-38
-
-chain 3190 chr8 146274826 + 144819513 144819546 chr8 146364022 + 144748697 144748730 12136519
-33
-
-chain 2525 chr8 146274826 + 144823339 144823377 chr8 146364022 + 144751692 144751730 23202086
-38
-
-chain 2511 chr8 146274826 + 144819546 144819572 chr8 146364022 + 144748632 144748658 13619339
-26
-
-chain 2509 chr8 146274826 + 144820134 144820160 chr8 146364022 + 144748632 144748658 22535050
-26
-
-chain 2395 chr8 146274826 + 144820036 144820061 chr8 146364022 + 144748974 144748999 15328526
-25
-
-chain 2146 chr8 146274826 + 86862896 86862937 chr8 146364022 - 59626667 59626708 2042
-38	1	1
-2
-
-chain 2013 chr8 146274826 + 12224371 12224395 chr8 146364022 + 11933433 11933457 5802
-24
-
-chain 928 chr8 146274826 + 86871422 86871445 chr8 146364022 + 86566156 86566179 4371
-23
-
-chain 19961283 chr8_random 943810 + 732172 943810 chr5 180915260 + 69954173 70165811 138
-211638
-
-chain 4772201 chr8_random 943810 + 62854 113804 chr8 146364022 + 16274686 16325603 650
-4146	9	9
-1642	5	9
-541	4	0
-1197	1	1
-27	1	1
-2498	0	1
-20171	4	0
-2761	3	0
-1978	0	1
-628	10	0
-5533	3	0
-2428	24	0
-47	5	9
-197	11	11
-687	0	2
-642	1	1
-17	1	1
-2228	0	4
-1978	1	0
-1521
-
-chain 4401722 chr8_random 943810 + 396973 443039 chr8 146364022 - 801667 847519 685
-2079	1	0
-22818	62	9
-50	57	0
-25	0	8
-40	91	0
-5953	32	0
-1937	0	2
-803	13	14
-786	0	5
-3908	2	0
-783	0	1
-854	1	0
-142	1	0
-1521	1	0
-114	0	1
-498	4	4
-591	2	0
-2750	0	9
-147
-
-chain 3680035 chr8_random 943810 + 643258 682172 chr8_gl000196_random 38914 + 0 38914 797
-38914
-
-chain 3554032 chr8_random 943810 + 493047 530222 chr8_gl000197_random 37175 + 0 37175 825
-37175
-
-chain 1222443 chr8_random 943810 + 0 12854 chr8 146364022 - 108556772 108569616 1946
-5765	0	1
-2843	2	0
-279	0	1
-299	1	0
-1113	9	0
-2543
-
-chain 995258 chr8_random 943810 + 250482 297042 chr8 146364022 + 46838897 46856230 2491
-52	5	5
-72	1882	0
-246	1888	0
-158	79	78
-59	82	81
-53	46	46
-76	18	18
-100	1942	59
-231	1	0
-84	1	0
-49	23	22
-65	25	25
-312	49	47
-118	1	0
-169	645	640
-71	18	18
-202	15	15
-74	114	112
-65	1444	30
-86	2249	34
-216	9	8
-173	33	30
-63	81	79
-265	87	84
-103	11	10
-122	1	1
-47	1	1
-165	858	0
-14	1027	0
-88	1879	0
-148	7	6
-166	1	0
-288	1888	1
-62	1	1
-90	1	0
-35	1890	1
-280	3	3
-23	1	0
-109	1	1
-283	4	4
-88	1	1
-67	1	1
-23	1	1
-109	680	0
-89	1876	0
-41	1	0
-45	1898	0
-107	18	18
-18	1	0
-28	1	1
-50	1	0
-35	1	1
-50	7	4
-54	1	0
-37	1	1
-298	11	10
-94	1	0
-17	1	0
-36	1	0
-55	1	0
-12	1	1
-148	1	1
-79	11	9
-78	1	1
-140	5	4
-54	3	0
-97	1	0
-138	6	4
-73	1	0
-59	19	19
-207	1	1
-45	1	1
-76	1	0
-8	3	1
-60	2	2
-56	1	1
-70	1	0
-45	1	1
-136	131	128
-86	17	16
-75	7	7
-53	483	144
-75	26	26
-230	135	132
-110	15	15
-61	25	23
-76	43	42
-120	1	0
-78	1735	1728
-192	42	41
-61	82	82
-190	37	37
-90	1911	30
-168	56	56
-56	10	10
-83	26	26
-230	1927	49
-224	1937	52
-244	41	41
-125	36	36
-96	26	26
-83	81	78
-272	2019	139
-59	236	231
-103	71	70
-183	31	31
-58	119	117
-131	1	0
-167	25	25
-72	97	96
-91	6	6
-75	10	9
-219
-
-chain 895028 chr8_random 943810 + 298039 346176 chr8 146364022 - 99507152 99525054 4376
-63	126	463
-229	1883	1
-104	25	25
-58	6	6
-155	36	35
-84	10	10
-88	23	23
-53	1	0
-164	5	5
-68	56	55
-231	24	24
-149	409	408
-53	1	0
-69	1	0
-134	6	6
-201	318	315
-27	1885	0
-105	1	0
-82	82	82
-144	27	27
-56	238	235
-130	24	23
-109	1	0
-77	2	1
-100	31	30
-102	14	14
-63	11	10
-108	91	91
-72	94	93
-169	149	148
-198	238	234
-86	2	0
-169	3	1
-72	11	11
-66	1	0
-247	18	17
-392	540	533
-186	7	7
-121	1	0
-254	1977	89
-53	7	7
-193	483	475
-93	50	47
-198	28	28
-76	1883	8
-61	130	129
-123	29	29
-112	201	199
-138	12	11
-21	1873	0
-107	33	33
-53	1880	1
-118	40	38
-141	1943	53
-168	137	134
-81	16	16
-115	2216	0
-103	32	29
-71	128	127
-104	54	53
-121	128	127
-66	99	96
-80	75	74
-128	1924	40
-53	2	1
-288	1910	24
-53	1907	23
-56	40	40
-72	111	111
-62	127	127
-122	65	65
-80	210	206
-115	0	1
-146	5663	0
-183	40	40
-53	34	33
-229	28	28
-92	83	83
-234	1983	101
-57	1885	0
-44	11	11
-62	1	0
-69	28	28
-126	1	0
-148	147	144
-58	14	12
-53	1	0
-66	1	0
-105	34	33
-71	39	38
-69	17	17
-56	6	5
-79	48	46
-53	6	6
-57	38	35
-77	78	75
-111	649	644
-110	45	43
-235
-
-chain 604051 chr8_random 943810 + 178170 281976 chr8 146364022 + 46838954 46856867 5476
-212	1875	0
-272	566	562
-114	1	0
-143	1	0
-55	74	74
-65	25	25
-63	62	62
-61	31	31
-102	23	23
-215	1	0
-63	67	68
-68	373	34
-158	64	63
-53	46	46
-105	67	67
-55	2294	38
-202	15	15
-63	51	51
-246	23	23
-71	1	0
-271	103	102
-427	6	5
-51	25	22
-54	1878	0
-36	10	10
-122	26	26
-134	1886	0
-121	93	92
-51	1	2
-246	54742	0
-134	1884	0
-129	33	31
-147	39	38
-116	65	61
-66	43	41
-62	1982	95
-213	196	193
-339	260	254
-187	89	88
-10	2292	403
-57	5123	1343
-293	24	22
-61	1	0
-73	7	7
-53	1877	144
-91	4270	499
-59	2463	581
-37	339	671
-59	342	0
-110	266	261
-150	6	6
-92	244	241
-51	62	62
-51	3119	1229
-91	761	80
-60	48	47
-137	1876	0
-136	12	10
-131	12	11
-290	1	0
-45	4005	2083
-59	88	424
-59
-
-chain 496223 chr8_random 943810 + 580222 593236 chr8 146364022 - 59615387 59795086 34662
-2144	4634	17818
-237	1	1
-31	1	1
-194	35	40
-1575	162	153603
-534	0	55
-995	64	64
-1343	58	58
-112	1	1
-38	1	1
-70	1	1
-41	1	1
-81	1	1
-34	1	1
-624
-
-chain 279595 chr8_random 943810 + 199376 329223 chr8 146364022 - 99506514 99525054 6095
-67	50	47
-55	631	967
-63	1082	0
-177	61	58
-147	6	6
-143	1	0
-42	1882	0
-74	31	30
-83	23	23
-13	1879	0
-204	5	5
-58	69	69
-227	1933	51
-152	123	122
-83	1	0
-118	72	72
-159	17	17
-119	34	34
-230	36	36
-134	1929	32
-189	3017	0
-24	83	83
-121	1	0
-49	5680	1
-325	136	129
-277	30	30
-335	1436	53
-51	63	62
-99	867	859
-154	860	855
-269	32	31
-112	1	0
-50	1877	0
-99	58	58
-108	1	0
-96	2221	0
-37	1546	0
-136	2648	89
-52	7	8
-278	1	0
-202	139	136
-145	65	63
-51	44	42
-62	143	139
-61	156	155
-243	214	215
-20	1872	0
-194	74	75
-337	25	25
-145	15	15
-71	65	65
-84	1878	0
-60	1	0
-244	227	225
-226	53	53
-62	42	41
-66	63	61
-120	35	34
-64	56110	1
-98	41	40
-53	2795	914
-65	10	10
-57	8290	755
-67	63	61
-66	17	16
-53	1	0
-58	36	36
-92	3924	162
-40	61	61
-58	4119	368
-133	2082	185
-58	42	42
-167	2235	21
-50	4401	627
-71	40	39
-147	360	353
-60	174	173
-446
-
-chain 208078 chr8_random 943810 + 170910 242131 chr8 146364022 - 99506628 99524507 6380
-55	632	967
-69	73	73
-115	28	28
-146	4836	20
-75	1	0
-54	58	58
-87	10	10
-294	22105	209
-184	59	59
-53	209	208
-64	1388	305
-56	340	338
-60	50	50
-134	32	32
-108	2	0
-106	83	82
-108	1884	0
-62	68	68
-216	1	0
-55	20	20
-107	3862	104
-61	311	311
-29	2182	2154
-53	1	0
-93	1388	251
-108	3	2
-129	159	158
-109	1	0
-31	114	113
-51	60	60
-78	14	14
-99	14	13
-152	64	62
-60	13	12
-120	98	98
-138	115	114
-56	6	4
-26	438	436
-213	183	182
-53	1	0
-81	2318	428
-71	25	25
-145	15	15
-71	65	65
-109	1956	43
-69	112	108
-33	397	392
-58	1466	80
-62	46	46
-401	64	64
-45	51	51
-56	1	0
-6	99	99
-54	146	144
-187	67	67
-166	52	49
-51	9	8
-63	11	10
-61	186	186
-68	38	38
-168	105	102
-125	3	2
-113	17	17
-186	2	0
-3	6394	747
-113	762	83
-102	4015	254
-238	102	101
-91	6	6
-85	1999	129
-12	9	9
-44	2322	442
-90	319	318
-42
-
-chain 110041 chr8_random 943810 + 584910 586860 chr8 146364022 - 59525621 59532924 58275
-151	1	1
-64	1	1
-158	1	1
-137	0	5353
-14	3	3
-73	8	8
-52	11	11
-57	9	9
-54	15	15
-289	15	15
-837
-
-chain 81230 chr8_random 943810 + 228410 243660 chr8 146364022 - 99515272 99524158 121868
-53	818	813
-113	55	55
-76	1036	1025
-78	1	0
-115	1280	591
-98	36	34
-79	25	25
-73	189	188
-120	2622	738
-79	145	145
-8	21	19
-36	157	155
-27	18	14
-98	82	81
-130	280	280
-78	83	83
-21	20	20
-27	51	51
-134	238	238
-10	39	39
-53	216	215
-252	5175	1418
-73	6	6
-146	231	228
-111	1	0
-201	35	35
-101
-
-chain 78595 chr8_random 943810 + 271315 287023 chr8 146364022 + 46844767 46855610 13381
-177	7	6
-61	49	46
-54	86	84
-62	24	23
-151	92	91
-73	109	107
-108	1	0
-51	8	6
-97	2409	1723
-29	1995	118
-92	64	63
-24	701	695
-42	7	7
-53	90	89
-54	403	392
-25	6360	4099
-70	192	192
-26	77	76
-63	336	336
-129	125	126
-143	878	869
-27	23	23
-61
-
-chain 70241 chr8_random 943810 + 583972 584708 chr8 146364022 - 2327498 2328234 1800744
-736
-
-chain 67060 chr8_random 943810 + 583131 583834 chr8 146364022 + 144032710 144033413 1885205
-703
-
-chain 60161 chr8_random 943810 + 163863 193392 chr8 146364022 + 46840361 46854926 51951
-69	30	30
-79	155	153
-22	224	224
-36	635	633
-54	78	77
-53	1660	61
-55	408	405
-36	32	32
-40	163	161
-29	96	89
-5	85	85
-4	108	106
-193	10362	0
-211	23	23
-164	214	212
-108	41	40
-217	35	35
-85	25	25
-266	2366	490
-48	600	260
-32	3507	4987
-74	590	587
-105	2319	2307
-66	2880	990
-102	1	0
-89	507	168
-143
-
-chain 59106 chr8_random 943810 + 169718 174718 chr8 146364022 - 99507650 99524666 884317
-69	73	73
-53	107	105
-145	323	5927
-57	45	43
-58	51	49
-65	130	129
-16	74	74
-175	49	49
-53	423	422
-53	2360	8782
-34	55	55
-95	1	0
-28	1	0
-2	113	113
-292
-
-chain 53138 chr8_random 943810 + 171392 346403 chr8 146364022 - 102525263 102570806 8603
-57	57	57
-79	626	627
-64	1139	91
-72	32	32
-61	1	0
-192	55	53
-253	233	231
-113	1894	10
-151	18218	118
-161	39	39
-89	168	167
-68	174	168
-68	7236	473
-76	2229	347
-40	124	120
-50	21	21
-55	1906	29
-98	2	0
-51	3928	158
-113	3230	214
-58	5760	82
-62	113	112
-39	7442	4152
-122	13	12
-149	90	90
-56	48	47
-71	400	397
-133	1910	21
-97	23	23
-92	2561	0
-54	15	13
-67	70	69
-90	95	94
-59	72	72
-139	45	45
-101	71659	2394
-62	72	72
-84	1	0
-9	2000	117
-95	39	39
-65	70	68
-87	2031	150
-103	1949	61
-106	17	17
-136	75	74
-53	5662	38
-58	1936	41
-42	168	168
-108	95	95
-66	243	241
-50	5018	908
-53	4282	513
-74	1906	30
-83	2078	26035
-107	1947	59
-57	500	483
-160	1936	53
-185	1897	12
-119	3972	202
-29	14	14
-79	61	61
-44
-
-chain 52733 chr8_random 943810 + 164218 295513 chr8 146364022 + 43821028 43838759 7574
-63	20	20
-141	36	36
-153	32	31
-103	40	40
-53	86	85
-99	1658	59
-83	265	263
-110	21	21
-51	29	27
-160	108	108
-51	1	0
-49	1	0
-61	130	123
-85	12281	44
-69	272	272
-118	62	62
-75	7995	1645
-102	45	45
-59	32	32
-14	328	328
-126	2372	483
-86	58668	153
-40	4323	551
-31	1938	56
-58	2392	511
-58	234	222
-51	1403	0
-51	91	91
-50	218	218
-83	67	66
-75	77	77
-110	391	53
-2	2678	792
-147	104	101
-59	1917	33
-92	1958	75
-54	5899	1442
-11	105	104
-132	1	0
-50	2212	332
-66	5506	1369
-60	189	189
-173	223	221
-222	1874	0
-87	23	23
-54	108	108
-109	29	28
-94	64	63
-70	91	86
-97	164	161
-112	123	123
-78	1942	66
-145	118	118
-69	1917	31
-51	10	10
-113	235	231
-193	327	327
-41	392	391
-51	363	361
-123	1977	94
-57
-
-chain 48120 chr8_random 943810 + 172087 205615 chr8 146364022 - 99508140 99525054 275640
-50	1136	89
-81	56	55
-4	1876	5603
-199	577	570
-71	144	141
-39	17920	1690
-56	276	276
-117	289	289
-64	172	170
-10	18	18
-76	284	279
-308	237	229
-64	1904	0
-33	2094	204
-40	43	43
-63	3	2
-59	12	12
-306	15	15
-33	1146	61
-49	757	4487
-37	62	62
-83	46	46
-112	178	174
-95	1	0
-29	1956	73
-248
-
-chain 37837 chr8_random 943810 + 253130 272078 chr8 146364022 + 46839659 46847391 87472
-42	44	44
-61	2771	880
-109	37	36
-171	1	0
-120	209	204
-98	56	55
-61	10	9
-23	187	186
-75	18	18
-17	5316	1682
-9	145	143
-53	1	0
-29	137	137
-73	132	128
-65	14	14
-79	6214	2430
-95	70	70
-83	2232	342
-91
-
-chain 33662 chr8_random 943810 + 209837 215530 chr8 146364022 - 99514311 99520696 710844
-71	67	65
-87	1	0
-118	10	8
-19	543	533
-53	11	11
-89	4	2
-68	143	138
-148	1307	167
-110	627	624
-30	2103	3960
-84
-
-chain 32940 chr8_random 943810 + 226035 229035 chr8 146364022 - 102534454 102537445 203694
-68	23	23
-49	847	842
-50	91	91
-134	57	57
-61	1290	1287
-37	113	113
-86	41	40
-53
-
-chain 31024 chr8_random 943810 + 206449 211988 chr8 146364022 - 99514678 99520173 701886
-8	43	43
-64	6	5
-58	14	12
-82	340	0
-49	416	749
-81	59	59
-117	75	75
-207	1422	3285
-36	2428	531
-34
-
-chain 29825 chr8_random 943810 + 245532 246838 chr8 146364022 + 46839602 46840894 3893579
-57	560	553
-119	226	222
-5	184	184
-21	75	72
-59
-
-chain 28513 chr8_random 943810 + 169082 170209 chr8 146364022 - 99514495 99515614 2995290
-72	337	330
-70	17	17
-84	143	144
-53	81	80
-64	162	161
-44
-
-chain 28403 chr8_random 943810 + 244271 247583 chr8 146364022 + 46840215 46841632 1514192
-150	21	21
-65	247	246
-61	60	60
-144	37	36
-68	1	0
-56	146	144
-158	1945	55
-153
-
-chain 27366 chr8_random 943810 + 305024 329400 chr8 146364022 - 99508828 99514021 185326
-30	144	144
-27	1950	69
-57	1	0
-69	4733	954
-80	7	7
-60	2015	139
-144	51	51
-17	50	48
-20	2199	324
-179	83	83
-149	1	0
-45	50	50
-29	198	197
-38	56	56
-36	163	162
-27	2035	153
-71	157	157
-56	6099	109
-62	47	47
-93	104	100
-75	1	0
-39	342	0
-49	1641	94
-81	539	539
-177
-
-chain 25161 chr8_random 943810 + 165410 166073 chr8 146364022 + 46840031 46840686 5084847
-51	107	104
-69	107	106
-77	51	48
-53	79	78
-69
-
-chain 23498 chr8_random 943810 + 275598 276538 chr8 146364022 + 46848347 46849285 1106774
-150	39	39
-58	1	0
-156	159	160
-43	237	235
-97
-
-chain 22556 chr8_random 943810 + 221873 233787 chr8 146364022 - 102535430 102541485 264178
-56	92	91
-134	1524	140
-26	9348	4879
-77	298	294
-159	126	126
-55	8	7
-11
-
-chain 21554 chr8_random 943810 + 211856 229563 chr8 146364022 - 102534119 102541711 230838
-98	1283	144
-76	1760	1749
-25	1	0
-80	1889	12
-87	80	79
-50	14	14
-51	55	50
-59	207	201
-52	31	30
-212	2303	390
-120	3503	2102
-43	5590	1830
-38
-
-chain 21378 chr8_random 943810 + 315539 346866 chr8 146364022 - 99515536 99522005 182294
-65	7	7
-59	1872	0
-52	1	0
-110	59	59
-145	1929	47
-157	4107	0
-50	19	19
-76	11	11
-9	218	215
-20	69	68
-27	104	104
-38	3941	169
-93	9868	446
-40	53	53
-33	350	349
-83	1915	34
-228	2	1
-71	4993	3080
-80	103	101
-58	162	162
-50
-
-chain 20133 chr8_random 943810 + 187153 190961 chr8 146364022 + 46839718 46841635 711123
-27	2490	610
-70	193	186
-75	6	6
-22	81	81
-48	1	0
-41	200	200
-10	13	12
-78	103	101
-193	10	10
-147
-
-chain 19851 chr8_random 943810 + 184692 274845 chr8 146364022 + 46839508 46849467 34309
-59	20	20
-103	2903	645
-204	29	27
-122	5	4
-251	1	1
-19	1	1
-370	102	102
-45	59	59
-32	2407	520
-35	53082	226
-207	6009	346
-163	6	4
-101	79	79
-50	419	416
-33	1900	15
-227	6	6
-48	1	0
-53	22	21
-65	58	57
-59	43	42
-133	81	80
-20	44	42
-50	14	12
-53	37	36
-104	2375	490
-62	1340	1334
-14	1	0
-183	3854	228
-49	6055	405
-35	6036	1578
-80	25	25
-89	8	7
-13
-
-chain 19146 chr8_random 943810 + 175023 175290 chr8 146364022 - 99508150 99508416 4025470
-88	58	57
-65	25	25
-31
-
-chain 17870 chr8_random 943810 + 167013 193249 chr8 146364022 + 46840039 46851047 112211
-37	407	404
-31	233	231
-41	10382	13
-26	802	800
-40	282	279
-41	6132	1660
-77	3954	2070
-28	510	4239
-81	90	89
-50	30	30
-120	2083	201
-60	192	191
-51	338	0
-118
-
-chain 17758 chr8_random 943810 + 265412 266607 chr8 146364022 + 43830436 43831619 676151
-58	100	98
-16	14	14
-59	946	936
-2
-
-chain 17102 chr8_random 943810 + 196211 212812 chr8 146364022 - 102534634 102539542 315778
-4	176	169
-110	677	661
-101	229	222
-63	12	11
-71	2311	416
-66	5	5
-3	2545	1456
-25	7	5
-52	21	20
-3	9994	1320
-61	8	7
-57
-
-chain 16958 chr8_random 943810 + 303736 319647 chr8 146364022 - 99509421 99514022 288375
-62	1	0
-115	55	55
-12	6716	1059
-173	60	58
-5	238	238
-27	142	138
-80	1	0
-32	1181	1170
-56	95	93
-15	6818	1186
-27
-
-chain 16519 chr8_random 943810 + 191041 191237 chr8 146364022 + 46841712 46841907 5194781
-138	7	6
-51
-
-chain 16395 chr8_random 943810 + 250196 250458 chr8 146364022 + 46842349 46842610 5706058
-109	63	63
-38	1	0
-51
-
-chain 16284 chr8_random 943810 + 248826 295566 chr8 146364022 + 43821313 43835075 8983
-38	3114	1217
-58	3878	108
-134	2320	436
-35	2074	180
-90	6230	729
-53	51	51
-165	2138	257
-18	1	0
-14	9087	4604
-68	26	23
-70	26	25
-165	4726	2469
-31	113	113
-45	6358	726
-53	323	321
-29	3160	1272
-53	1943	60
-1	1	0
-51
-
-chain 16072 chr8_random 943810 + 313809 340982 chr8 146364022 - 102527896 102533983 267291
-28	5309	1547
-73	15383	1858
-110	23	22
-51	120	119
-75	171	167
-144	2405	509
-56	2087	199
-104	240	238
-93	367	364
-59	113	109
-162
-
-chain 15849 chr8_random 943810 + 261982 295288 chr8 146364022 + 43821759 43829198 76114
-110	412	75
-52	237	234
-137	1904	21
-61	17	17
-88	8048	505
-97	1212	533
-118	1	0
-62	80	80
-12	643	644
-105	9123	1231
-153	113	112
-50	1019	1018
-55	3899	142
-89	478	475
-43	4836	1068
-52
-
-chain 15670 chr8_random 943810 + 194296 345941 chr8 146364022 - 102525263 102540770 8834
-113	3789	1
-79	5134	279
-81	25039	3655
-36	72	71
-66	2073	189
-82	66	62
-87	280	277
-20	23	23
-59	87	84
-72	49	48
-51	7	7
-82	1014	334
-62	79983	3178
-76	18	17
-68	2382	504
-43	42	41
-108	10477	733
-134	2033	147
-59	5650	11
-88	3846	65
-64	297	293
-50	3779	12
-69	123	122
-120	121	120
-68	15	15
-57	136	135
-139	239	237
-72	1	0
-63	4	3
-53	59	59
-8	490	488
-28	84	81
-35	298	293
-34	805	799
-67	1	0
-53	69	67
-100	14	14
-81	134	132
-53	38	38
-39	110	109
-45
-
-chain 14986 chr8_random 943810 + 225882 226349 chr8 146364022 - 99518359 99518822 2174986
-18	53	51
-56	166	164
-73	33	33
-68
-
-chain 14834 chr8_random 943810 + 243014 243551 chr8 146364022 - 99519780 99520313 2299338
-16	162	159
-19	313	312
-27
-
-chain 14491 chr8_random 943810 + 298927 299279 chr8 146364022 - 102541139 102541484 3650546
-95	253	246
-4
-
-chain 13927 chr8_random 943810 + 330425 330634 chr8 146364022 - 99513165 99513373 16289681
-108	47	46
-54
-
-chain 13708 chr8_random 943810 + 204114 204446 chr8 146364022 - 99514221 99514551 7956244
-38	2	1
-51	137	136
-104
-
-chain 13201 chr8_random 943810 + 267894 296641 chr8 146364022 + 46841376 46846486 149880
-47	8325	118
-153	12619	975
-124	10	10
-59	1933	45
-415	178	178
-62	103	99
-67	193	193
-45	34	34
-4	542	542
-26	2853	963
-60	194	194
-31	632	628
-38
-
-chain 12234 chr8_random 943810 + 261803 269960 chr8 146364022 + 46841266 46843423 172872
-35	2890	667
-1	24	24
-60	15	15
-6	166	166
-32	2034	149
-193	134	132
-81	69	68
-116	2096	211
-21	87	83
-97
-
-chain 10617 chr8_random 943810 + 337138 337293 chr8 146364022 - 99523571 99523724 21494273
-69	29	27
-57
-
-chain 10554 chr8_random 943810 + 261774 276161 chr8 146364022 + 46850579 46856384 287750
-26	3379	1156
-30	20	20
-51	4844	1067
-12	16	15
-65	51	50
-53	361	357
-85	102	101
-13	51	51
-26	87	87
-46	4988	2413
-81
-
-chain 10039 chr8_random 943810 + 325665 325968 chr8 146364022 - 99512180 99512483 3203386
-32	146	146
-51	12	12
-62
-
-chain 9889 chr8_random 943810 + 299929 343052 chr8 146364022 - 99507161 99512618 194143
-54	125	463
-172	6011	368
-29	4240	471
-68	8003	490
-69	47	47
-10	133	133
-55	45	44
-46	4488	379
-66	1908	22
-82	7833	307
-63	2043	161
-90	115	115
-101	1	0
-97	2144	241
-32	4543	773
-83	294	293
-33
-
-chain 9887 chr8_random 943810 + 315022 315154 chr8 146364022 - 99513153 99513284 7544872
-79	1	0
-52
-
-chain 9860 chr8_random 943810 + 311200 311307 chr8 146364022 - 99513093 99513199 8991129
-52	1	0
-54
-
-chain 9817 chr8_random 943810 + 331048 331155 chr8 146364022 - 99513786 99513892 13428201
-64	1	0
-42
-
-chain 9446 chr8_random 943810 + 266857 296082 chr8 146364022 + 43794817 43828117 103381
-44	9743	27369
-146	121	120
-47	983	976
-79	10221	2331
-165	112	112
-51	81	80
-39	1877	0
-66	2043	157
-36	3318	1429
-53
-
-chain 9082 chr8_random 943810 + 283227 283503 chr8 146364022 + 46855567 46855841 3572014
-72	39	38
-7	101	100
-57
-
-chain 9078 chr8_random 943810 + 266179 266275 chr8 146364022 + 46841541 46841637 24832874
-96
-
-chain 9056 chr8_random 943810 + 234327 343102 chr8 146364022 - 102532678 102541696 177988
-49	2060	180
-83	4311	566
-60	72559	3258
-278	110	111
-124	380	378
-51	246	244
-21	14	13
-37	2147	273
-83	195	193
-50	29	28
-5	2000	121
-73	4435	328
-132	3864	97
-47	5706	63
-45	54	54
-151	1883	5
-99	3796	15
-99	63	61
-64	1	0
-58	1881	0
-137	76	74
-53	53	48
-27	312	310
-85	17	16
-19	140	140
-52	244	244
-62	105	104
-50
-
-chain 8907 chr8_random 943810 + 174718 174972 chr8 146364022 - 99514987 99515577 3222521
-12	195	531
-47
-
-chain 8843 chr8_random 943810 + 329461 329557 chr8 146364022 - 99512211 99512306 12312646
-78	1	0
-17
-
-chain 8728 chr8_random 943810 + 244822 248433 chr8 146364022 + 46838897 46840609 1548241
-52	2949	1051
-100	1	0
-231	55	55
-65	34	34
-124
-
-chain 8619 chr8_random 943810 + 294534 295111 chr8 146364022 + 46855606 46856180 1696895
-31	25	25
-71	52	51
-46	97	97
-58	132	130
-65
-
-chain 8428 chr8_random 943810 + 281982 282213 chr8 146364022 + 46854328 46854560 448042
-60	97	98
-56	17	17
-1
-
-chain 8419 chr8_random 943810 + 261190 261281 chr8 146364022 + 43820969 43821060 10860311
-91
-
-chain 8395 chr8_random 943810 + 294914 295046 chr8 146364022 + 46848509 46848640 12873675
-58	69	68
-5
-
-chain 8358 chr8_random 943810 + 183391 183662 chr8 146364022 + 46851295 46851565 1204104
-177	39	38
-55
-
-chain 8235 chr8_random 943810 + 303417 303563 chr8 146364022 - 99516580 99516725 5721277
-92	1	0
-53
-
-chain 8187 chr8_random 943810 + 330253 330340 chr8 146364022 - 99512994 99513081 26147162
-87
-
-chain 7754 chr8_random 943810 + 175981 176066 chr8 146364022 - 99524049 99524133 15930227
-61	1	0
-23
-
-chain 7677 chr8_random 943810 + 237294 312035 chr8 146364022 - 99517817 99525125 210590
-33	254	254
-156	1	0
-142	25	25
-70	127	127
-226	1925	53
-62	55	55
-112	29	28
-91	36	36
-139	46	43
-7	796	791
-54	65384	1748
-45	3060	1165
-46	839	833
-119	535	529
-77	214	206
-36
-
-chain 7632 chr8_random 943810 + 192816 192897 chr8 146364022 + 46850614 46850695 27043702
-81
-
-chain 7605 chr8_random 943810 + 285785 290878 chr8 146364022 + 46850643 46851974 486318
-50	2571	689
-13	4	4
-73	73	73
-25	2038	160
-132	56	54
-58
-
-chain 7406 chr8_random 943810 + 221929 222203 chr8 146364022 - 99519540 99519813 598559
-62	1	0
-29	134	134
-48
-
-chain 7383 chr8_random 943810 + 294257 294361 chr8 146364022 + 43837510 43837614 4128881
-70	9	9
-25
-
-chain 7298 chr8_random 943810 + 168270 168367 chr8 146364022 + 46839414 46839508 6543284
-4	56	53
-37
-
-chain 7295 chr8_random 943810 + 336620 336697 chr8 146364022 - 99513722 99513799 27625946
-77
-
-chain 7211 chr8_random 943810 + 261472 261549 chr8 146364022 + 46839068 46839145 24666501
-77
-
-chain 7186 chr8_random 943810 + 330047 330123 chr8 146364022 - 99512791 99512867 27853996
-76
-
-chain 7178 chr8_random 943810 + 316571 316677 chr8 146364022 - 102541857 102541963 5712191
-106
-
-chain 7102 chr8_random 943810 + 318170 320971 chr8 146364022 - 99520028 99520932 765669
-72	19	19
-135	121	121
-72	13	12
-29	2280	384
-60
-
-chain 7077 chr8_random 943810 + 192950 193025 chr8 146364022 + 46850748 46850823 28082919
-75
-
-chain 7057 chr8_random 943810 + 203108 206189 chr8 146364022 - 99515093 99516287 1156085
-30	91	89
-53	2333	448
-35	503	503
-36
-
-chain 6980 chr8_random 943810 + 332337 335152 chr8 146364022 - 99522544 99523471 1124480
-50	412	409
-6	79	79
-50	126	126
-65	1978	93
-49
-
-chain 6922 chr8_random 943810 + 183305 183378 chr8 146364022 + 46840000 46840073 28376594
-73
-
-chain 6904 chr8_random 943810 + 266355 266429 chr8 146364022 + 46841714 46841788 28413782
-74
-
-chain 6731 chr8_random 943810 + 303313 303384 chr8 146364022 - 99509001 99509072 28774708
-71
-
-chain 6664 chr8_random 943810 + 303981 314057 chr8 146364022 - 99517140 99519668 641395
-51	3	2
-55	1	0
-72	170	168
-30	7422	1761
-7	12	11
-54	1882	0
-68	153	153
-96
-
-chain 6603 chr8_random 943810 + 322619 327380 chr8 146364022 - 99513231 99513884 1344743
-127	337	0
-120	9	8
-78	1963	78
-31	1885	0
-211
-
-chain 6584 chr8_random 943810 + 197737 202982 chr8 146364022 - 102536127 102540259 775939
-91	1155	1137
-22	12	11
-57	3876	2782
-32
-
-chain 6449 chr8_random 943810 + 218412 233428 chr8 146364022 - 99516080 99519573 697985
-27	8506	1438
-73	54	54
-91	295	295
-235	28	28
-6	100	100
-56	5516	1061
-29
-
-chain 6331 chr8_random 943810 + 327023 327090 chr8 146364022 - 99511661 99511728 29751334
-67
-
-chain 6250 chr8_random 943810 + 208146 208242 chr8 146364022 - 99508890 99508983 12204367
-15	70	67
-11
-
-chain 6212 chr8_random 943810 + 207786 207861 chr8 146364022 - 99514136 99514211 3829743
-75
-
-chain 6150 chr8_random 943810 + 203513 205795 chr8 146364022 - 102537045 102537445 1909663
-16	3	2
-125	118	117
-8	1955	75
-57
-
-chain 6094 chr8_random 943810 + 299279 299402 chr8 146364022 - 99508718 99508841 2977078
-68	21	21
-34
-
-chain 6085 chr8_random 943810 + 250101 250166 chr8 146364022 + 46842254 46842319 30387783
-65
-
-chain 6067 chr8_random 943810 + 293889 294038 chr8 146364022 + 46845620 46845767 4301892
-66	21	19
-62
-
-chain 6049 chr8_random 943810 + 230044 230135 chr8 146364022 - 102569888 102569979 10345810
-91
-
-chain 5962 chr8_random 943810 + 207380 207446 chr8 146364022 - 99509995 99510061 8394857
-66
-
-chain 5949 chr8_random 943810 + 272784 272847 chr8 146364022 + 46853694 46853757 30762472
-63
-
-chain 5823 chr8_random 943810 + 299452 300023 chr8 146364022 - 99514497 99515068 1422380
-470	61	61
-40
-
-chain 5814 chr8_random 943810 + 289476 289952 chr8 146364022 + 46839369 46839842 2257769
-77	110	110
-124	92	90
-42	1	0
-30
-
-chain 5753 chr8_random 943810 + 192024 192086 chr8 146364022 + 46838954 46839016 21955899
-62
-
-chain 5749 chr8_random 943810 + 233271 233333 chr8 146364022 - 102570546 102570608 31315232
-62
-
-chain 5681 chr8_random 943810 + 341821 341883 chr8 146364022 - 99511396 99511458 7040566
-62
-
-chain 5649 chr8_random 943810 + 174777 174837 chr8 146364022 - 99507908 99507968 31588023
-60
-
-chain 5623 chr8_random 943810 + 175706 175950 chr8 146364022 - 102534119 102534360 3287579
-59	23	22
-63	22	20
-77
-
-chain 5394 chr8_random 943810 + 322313 322370 chr8 146364022 - 99511057 99511114 32316179
-57
-
-chain 5303 chr8_random 943810 + 187437 187493 chr8 146364022 + 46840000 46840056 32583273
-56
-
-chain 5285 chr8_random 943810 + 290446 290502 chr8 146364022 + 43794807 43794863 32673339
-56
-
-chain 5276 chr8_random 943810 + 336755 336811 chr8 146364022 - 99513853 99513909 32693850
-56
-
-chain 5265 chr8_random 943810 + 208344 208568 chr8 146364022 - 99514691 99514915 3842595
-38	152	152
-34
-
-chain 5263 chr8_random 943810 + 587464 592229 chr8 146364022 + 86573610 86746488 37343
-35	3283	168311
-47	1343	1343
-20	1	3086
-36
-
-chain 5194 chr8_random 943810 + 184072 184128 chr8 146364022 + 46838897 46838953 32965865
-56
-
-chain 5184 chr8_random 943810 + 329855 329911 chr8 146364022 - 99512600 99512656 19420929
-56
-
-chain 5176 chr8_random 943810 + 177599 177656 chr8 146364022 - 99506628 99506685 33029925
-57
-
-chain 5155 chr8_random 943810 + 281730 289038 chr8 146364022 + 46843205 46844537 960143
-32	6927	953
-200	103	101
-46
-
-chain 5093 chr8_random 943810 + 184617 184671 chr8 146364022 + 43793908 43793962 23494272
-54
-
-chain 5050 chr8_random 943810 + 326962 327016 chr8 146364022 - 102542496 102542550 23236949
-54
-
-chain 5030 chr8_random 943810 + 212164 212217 chr8 146364022 - 99524079 99524132 33461083
-53
-
-chain 5021 chr8_random 943810 + 265903 265956 chr8 146364022 + 46841267 46841320 33516233
-53
-
-chain 5010 chr8_random 943810 + 325697 333370 chr8 146364022 - 99519686 99521704 323579
-146	5416	1638
-176	1905	28
-30
-
-chain 4963 chr8_random 943810 + 195042 195095 chr8 146364022 - 99525006 99525059 2910708
-53
-
-chain 4923 chr8_random 943810 + 294759 294811 chr8 146364022 + 46846486 46846538 24481170
-52
-
-chain 4775 chr8_random 943810 + 300049 300108 chr8 146364022 - 99511357 99511416 2287019
-59
-
-chain 4729 chr8_random 943810 + 323590 341586 chr8 146364022 - 99508256 99511164 508733
-81	188	186
-45	5653	0
-76	6291	651
-50	2125	222
-31	36	36
-21	50	50
-1	57	52
-62	3121	1237
-18	5	4
-85
-
-chain 4516 chr8_random 943810 + 291820 291870 chr8 146364022 + 46839826 46839876 19135311
-50
-
-chain 4460 chr8_random 943810 + 340307 340812 chr8 146364022 - 99522970 99523472 2799007
-59	396	393
-50
-
-chain 4363 chr8_random 943810 + 169662 169718 chr8 146364022 - 99524410 99524466 15024078
-25	20	20
-11
-
-chain 4245 chr8_random 943810 + 323934 340633 chr8 146364022 - 102539490 102542980 824111
-57	5415	1637
-55	4265	507
-46	6509	840
-13	129	125
-132	10	10
-68
-
-chain 4191 chr8_random 943810 + 346770 346816 chr8 146364022 - 99523777 99523823 32415009
-46
-
-chain 4157 chr8_random 943810 + 182640 182685 chr8 146364022 + 46841541 46841586 34989719
-45
-
-chain 4075 chr8_random 943810 + 287206 294116 chr8 146364022 + 46853923 46857394 507901
-58	44	43
-3	6754	3316
-51
-
-chain 4035 chr8_random 943810 + 210210 231774 chr8 146364022 - 99509073 99511132 504053
-68	1	0
-87	1	0
-47	151	148
-33	3084	58
-60	3981	215
-31	2075	179
-62	11852	1040
-31
-
-chain 3902 chr8_random 943810 + 322746 322788 chr8 146364022 - 99511490 99511532 25070576
-42
-
-chain 3842 chr8_random 943810 + 326212 339029 chr8 146364022 - 99518333 99519833 259270
-47	312	308
-17	60	57
-117	12236	926
-28
-
-chain 3793 chr8_random 943810 + 191943 191984 chr8 146364022 + 43793349 43793390 19585042
-41
-
-chain 3728 chr8_random 943810 + 267941 270995 chr8 146364022 + 46845159 46846318 991534
-57	2323	433
-41	406	402
-51	140	139
-36
-
-chain 3715 chr8_random 943810 + 252408 255104 chr8 146364022 + 46840810 46841615 879027
-44	1	0
-30	2575	685
-46
-
-chain 3689 chr8_random 943810 + 281829 281916 chr8 146364022 + 46850779 46850864 2001274
-26	3	1
-58
-
-chain 3667 chr8_random 943810 + 254324 254368 chr8 146364022 + 46840842 46840884 6647423
-30	11	9
-3
-
-chain 3646 chr8_random 943810 + 267998 268037 chr8 146364022 + 46850823 46850862 21797624
-39
-
-chain 3562 chr8_random 943810 + 168212 168270 chr8 146364022 + 43793831 43793889 3070871
-58
-
-chain 3504 chr8_random 943810 + 293480 293517 chr8 146364022 + 46839611 46839648 25642059
-37
-
-chain 3471 chr8_random 943810 + 337522 337596 chr8 146364022 - 99523948 99524022 18137430
-74
-
-chain 3448 chr8_random 943810 + 276204 276644 chr8 146364022 + 46854559 46854996 1897606
-49	365	362
-26
-
-chain 3411 chr8_random 943810 + 253189 255402 chr8 146364022 + 46850929 46853124 621337
-27	1269	1253
-37	776	774
-2	49	49
-53
-
-chain 3373 chr8_random 943810 + 338130 338166 chr8 146364022 - 99513335 99513371 20995505
-36
-
-chain 3359 chr8_random 943810 + 165298 184945 chr8 146364022 + 43823972 43836890 282023
-56	2595	8459
-64	12771	2404
-3	8	8
-69	4024	1798
-57
-
-chain 3297 chr8_random 943810 + 194502 225687 chr8 146364022 - 102525468 102530377 366001
-70	4347	545
-64	92	91
-87	8182	1452
-36	9798	1128
-56	8421	1348
-32
-
-chain 3286 chr8_random 943810 + 278118 290566 chr8 146364022 + 43833036 43837583 504233
-53	11	9
-65	12260	4361
-59
-
-chain 3257 chr8_random 943810 + 218922 219219 chr8 146364022 - 99516581 99516875 4722847
-56	32	30
-58	32	31
-119
-
-chain 3241 chr8_random 943810 + 233589 233706 chr8 146364022 - 102539417 102539534 832166
-52	16	16
-49
-
-chain 3212 chr8_random 943810 + 266430 268559 chr8 146364022 + 46841788 46842035 1348744
-53	1890	10
-128	11	9
-47
-
-chain 3157 chr8_random 943810 + 327996 328036 chr8 146364022 - 99512626 99512665 16621225
-16	15	14
-9
-
-chain 3082 chr8_random 943810 + 310645 310683 chr8 146364022 - 99512541 99512579 16551162
-38
-
-chain 3062 chr8_random 943810 + 163933 165245 chr8 146364022 + 46851641 46852949 942341
-29	1223	1219
-60
-
-chain 3030 chr8_random 943810 + 262108 262298 chr8 146364022 + 43831228 43834818 1405601
-67	13	3413
-110
-
-chain 2982 chr8_random 943810 + 183568 183600 chr8 146364022 + 46840262 46840294 9991965
-32
-
-chain 2745 chr8_random 943810 + 335974 336003 chr8 146364022 - 99513082 99513111 33185960
-29
-
-chain 2672 chr8_random 943810 + 298503 298547 chr8 146364022 - 99522900 99522944 24221385
-44
-
-chain 2671 chr8_random 943810 + 332183 346560 chr8 146364022 - 102528996 102533910 187401
-51	6123	457
-105	6796	3008
-38	249	246
-57	891	885
-67
-
-chain 2639 chr8_random 943810 + 219413 219441 chr8 146364022 - 99507721 99507749 35294427
-28
-
-chain 2612 chr8_random 943810 + 200816 200846 chr8 146364022 - 99525102 99525132 4075609
-30
-
-chain 2604 chr8_random 943810 + 240329 240369 chr8 146364022 - 99522715 99522755 8959532
-40
-
-chain 2556 chr8_random 943810 + 216929 216957 chr8 146364022 - 99514612 99514640 10325210
-28
-
-chain 2552 chr8_random 943810 + 191384 191411 chr8 146364022 + 46840185 46840212 15340406
-27
-
-chain 2552 chr8_random 943810 + 304972 304999 chr8 146364022 - 99516251 99516278 22571486
-27
-
-chain 2523 chr8_random 943810 + 327142 327169 chr8 146364022 - 99524856 99524883 11689776
-27
-
-chain 2451 chr8_random 943810 + 317909 318170 chr8 146364022 - 99521638 99521896 1452880
-31	226	223
-4
-
-chain 2447 chr8_random 943810 + 313295 313321 chr8 146364022 - 99513300 99513326 34910154
-26
-
-chain 2433 chr8_random 943810 + 230135 233158 chr8 146364022 - 99507638 99508095 1270471
-81	73	73
-21	37	37
-40	18	18
-82	2643	77
-28
-
-chain 2394 chr8_random 943810 + 309803 310102 chr8 146364022 - 102570308 102570605 11245020
-97	185	183
-17
-
-chain 2370 chr8_random 943810 + 237880 237905 chr8 146364022 - 99520270 99520295 11943708
-25
-
-chain 2370 chr8_random 943810 + 302899 302924 chr8 146364022 - 99512327 99512352 35222469
-25
-
-chain 2330 chr8_random 943810 + 274710 274735 chr8 146364022 + 46843727 46843752 26272760
-25
-
-chain 2188 chr8_random 943810 + 303139 303300 chr8 146364022 - 99512566 99512727 1325340
-161
-
-chain 2164 chr8_random 943810 + 254246 254269 chr8 146364022 + 46840765 46840788 24904248
-23
-
-chain 2146 chr8_random 943810 + 166073 166100 chr8 146364022 + 43793293 43793320 16498497
-27
-
-chain 2129 chr8_random 943810 + 171463 171506 chr8 146364022 - 99524332 99524375 3948851
-43
-
-chain 2094 chr8_random 943810 + 256486 256530 chr8 146364022 + 46856070 46856114 4878843
-44
-
-chain 2067 chr8_random 943810 + 182380 182437 chr8 146364022 + 46850625 46850682 3805032
-57
-
-chain 2054 chr8_random 943810 + 318711 318733 chr8 146364022 - 99511225 99511247 10715405
-22
-
-chain 1964 chr8_random 943810 + 202805 202867 chr8 146364022 - 99509184 99509246 3143072
-62
-
-chain 1962 chr8_random 943810 + 187357 187601 chr8 146364022 + 46841788 46842031 9057308
-62	87	86
-95
-
-chain 1941 chr8_random 943810 + 278085 278118 chr8 146364022 + 46854559 46854592 1239137
-33
-
-chain 1922 chr8_random 943810 + 294361 294534 chr8 146364022 + 46849827 46850000 1057760
-173
-
-chain 1907 chr8_random 943810 + 166115 166177 chr8 146364022 + 46850070 46850132 2756260
-62
-
-chain 1904 chr8_random 943810 + 294565 294590 chr8 146364022 + 46846293 46846318 7797359
-25
-
-chain 1899 chr8_random 943810 + 239038 239062 chr8 146364022 - 99519559 99519583 3632092
-24
-
-chain 1874 chr8_random 943810 + 311858 316542 chr8 146364022 - 99523087 99524010 1127459
-40	4555	794
-89
-
-chain 1842 chr8_random 943810 + 208242 208344 chr8 146364022 - 99510852 99510954 1122309
-102
-
-chain 1826 chr8_random 943810 + 333370 333404 chr8 146364022 - 102528310 102528344 12860155
-34
-
-chain 1699 chr8_random 943810 + 189740 189801 chr8 146364022 + 43830083 43830143 11700756
-13	1	0
-47
-
-chain 1671 chr8_random 943810 + 586860 586891 chr8 146364022 - 59596972 59597003 79385
-31
-
-chain 1671 chr8_random 943810 + 582366 582405 chr8 146364022 + 86778164 86778203 135745
-39
-
-chain 1614 chr8_random 943810 + 174855 174917 chr8 146364022 - 102535142 102535204 7562660
-62
-
-chain 1604 chr8_random 943810 + 210485 210541 chr8 146364022 - 99516819 99516875 24689779
-56
-
-chain 1577 chr8_random 943810 + 165529 165568 chr8 146364022 + 43833540 43833579 5487018
-39
-
-chain 1529 chr8_random 943810 + 199844 199893 chr8 146364022 - 99524132 99524181 16599934
-49
-
-chain 1430 chr8_random 943810 + 204007 204051 chr8 146364022 - 102535667 102535711 2444362
-44
-
-chain 1384 chr8_random 943810 + 331973 334317 chr8 146364022 - 99510969 99511436 2459541
-88	2124	247
-132
-
-chain 1361 chr8_random 943810 + 178432 178456 chr8 146364022 + 43821398 43821422 13532386
-24
-
-chain 1349 chr8_random 943810 + 282101 282136 chr8 146364022 + 43834762 43834797 3301014
-35
-
-chain 1325 chr8_random 943810 + 330748 334904 chr8 146364022 - 99513486 99513886 3761248
-39	3999	243
-118
-
-chain 1299 chr8_random 943810 + 216700 216875 chr8 146364022 - 99512515 99512690 2121346
-175
-
-chain 1278 chr8_random 943810 + 275077 288204 chr8 146364022 + 46842223 46845574 199410
-48	13052	3276
-27
-
-chain 1258 chr8_random 943810 + 272883 272996 chr8 146364022 + 43835974 43836087 2232086
-113
-
-chain 1256 chr8_random 943810 + 324880 325008 chr8 146364022 - 99513272 99513400 5381670
-128
-
-chain 1237 chr8_random 943810 + 196535 196612 chr8 146364022 - 99507792 99507869 15310375
-77
-
-chain 1235 chr8_random 943810 + 284286 284429 chr8 146364022 + 46839806 46839949 2930992
-143
-
-chain 1191 chr8_random 943810 + 293574 293786 chr8 146364022 + 46839704 46839915 1788603
-62	1	0
-149
-
-chain 1161 chr8_random 943810 + 294116 294212 chr8 146364022 + 43829899 43829995 1318655
-4	39	39
-53
-
-chain 1160 chr8_random 943810 + 183897 184027 chr8 146364022 + 43793197 43793327 2884372
-130
-
-chain 1130 chr8_random 943810 + 241032 308421 chr8 146364022 - 102539359 102541234 585349
-125	60736	871
-57	75	74
-53	2150	266
-105	4036	272
-52
-
-chain 1119 chr8_random 943810 + 229190 229281 chr8 146364022 - 99508572 99508663 1537143
-73	17	17
-1
-
-chain 1018 chr8_random 943810 + 315759 315867 chr8 146364022 - 102570622 102570730 1907772
-108
-
-chain 1013 chr8_random 943810 + 274298 274330 chr8 146364022 + 46839580 46839612 3252033
-32
-
-chain 968 chr8_random 943810 + 209695 209807 chr8 146364022 - 102537590 102537702 976902
-112
-
-chain 955 chr8_random 943810 + 319692 319755 chr8 146364022 - 102541225 102541288 3356813
-63
-
-chain 920 chr8_random 943810 + 258623 258775 chr8 146364022 + 46839508 46839659 980562
-59	25	24
-68
-
-chain 912 chr8_random 943810 + 192332 192490 chr8 146364022 + 46839260 46839417 3759652
-73	1	0
-84
-
-chain 891 chr8_random 943810 + 282553 282623 chr8 146364022 + 46843688 46843758 5243973
-70
-
-chain 873 chr8_random 943810 + 329911 329999 chr8 146364022 - 99523866 99523954 8492095
-88
-
-chain 847 chr8_random 943810 + 202393 202429 chr8 146364022 - 99516251 99516287 1768031
-36
-
-chain 808 chr8_random 943810 + 208103 208146 chr8 146364022 - 99506642 99506685 12166401
-43
-
-chain 772 chr8_random 943810 + 215530 215581 chr8 146364022 - 102536642 102536693 4621463
-51
-
-chain 770 chr8_random 943810 + 298794 298927 chr8 146364022 - 102529795 102529928 1833110
-38	53	53
-42
-
-chain 762 chr8_random 943810 + 250305 250368 chr8 146364022 + 43793197 43793260 2202736
-63
-
-chain 756 chr8_random 943810 + 175550 175595 chr8 146364022 - 102569149 102569194 15473865
-45
-
-chain 725 chr8_random 943810 + 227416 227458 chr8 146364022 - 102569147 102569189 2128584
-42
-
-chain 715 chr8_random 943810 + 237975 238010 chr8 146364022 - 99524101 99524136 9984625
-35
-
-chain 713 chr8_random 943810 + 336818 336983 chr8 146364022 - 102542943 102543107 12287033
-51	32	31
-82
-
-chain 659 chr8_random 943810 + 178382 178432 chr8 146364022 + 43825088 43825138 1126561
-50
-
-chain 630 chr8_random 943810 + 343296 343350 chr8 146364022 - 102532544 102532598 1087222
-54
-
-chain 622 chr8_random 943810 + 284683 284767 chr8 146364022 + 46845804 46845888 4299331
-84
-
-chain 618 chr8_random 943810 + 240201 240253 chr8 146364022 - 99520719 99520771 5790991
-52
-
-chain 609 chr8_random 943810 + 323290 333340 chr8 146364022 - 99511696 99512332 2037608
-32	1962	77
-33	7985	456
-38
-
-chain 511 chr8_random 943810 + 216312 216456 chr8 146364022 - 99508390 99508534 2116227
-83	23	23
-38
-
-chain 484 chr8_random 943810 + 208068 208103 chr8 146364022 - 102535970 102536005 2214348
-35
-
-chain 473 chr8_random 943810 + 323389 323449 chr8 146364022 - 102540821 102540881 1734527
-60
-
-chain 468 chr8_random 943810 + 200282 202177 chr8 146364022 - 99515228 99517906 493558
-37	1827	2610
-31
-
-chain 468 chr8_random 943810 + 309496 309560 chr8 146364022 - 99509535 99509598 902510
-13	1	0
-50
-
-chain 464 chr8_random 943810 + 238361 238411 chr8 146364022 - 102570011 102570061 2549299
-50
-
-chain 406 chr8_random 943810 + 336390 336452 chr8 146364022 - 99513496 99513558 3227798
-62
-
-chain 400 chr8_random 943810 + 198171 198198 chr8 146364022 - 99524348 99524375 19170252
-27
-
-chain 389 chr8_random 943810 + 239467 298039 chr8 146364022 - 99516251 99516834 914933
-36	19	19
-76	58363	374
-78
-
-chain 383 chr8_random 943810 + 268230 268298 chr8 146364022 + 43829500 43829568 7647204
-68
-
-chain 371 chr8_random 943810 + 289553 289594 chr8 146364022 + 43829105 43829146 1419836
-41
-
-chain 325 chr8_random 943810 + 171359 194889 chr8 146364022 - 102534570 102537063 1177879
-33	23458	2421
-39
-
-chain 321 chr8_random 943810 + 245198 245253 chr8 146364022 + 46850481 46850536 16403329
-55
-
-chain 316 chr8_random 943810 + 336558 336619 chr8 146364022 - 99513661 99513722 9588463
-61
-
-chain 316 chr8_random 943810 + 215939 215982 chr8 146364022 - 102570362 102570405 11794790
-43
-
-chain 307 chr8_random 943810 + 268331 268373 chr8 146364022 + 46843677 46843719 14936951
-42
-
-chain 302 chr8_random 943810 + 246654 246683 chr8 146364022 + 46846317 46846346 2597963
-29
-
-chain 277 chr8_random 943810 + 330681 336249 chr8 146364022 - 99513081 99513355 13257215
-37	5476	182
-55
-
-chain 224 chr8_random 943810 + 233016 233053 chr8 146364022 - 102535110 102535147 5909193
-37
-
-chain 219 chr8_random 943810 + 216875 216929 chr8 146364022 - 99508952 99509006 1250703
-54
-
-chain 217 chr8_random 943810 + 192086 192136 chr8 146364022 + 43793491 43793541 12267504
-50
-
-chain 176 chr8_random 943810 + 230251 230289 chr8 146364022 - 99522702 99522740 26486914
-38
-
-chain 171 chr8_random 943810 + 301863 301893 chr8 146364022 - 99524375 99524405 2607431
-30
-
-chain 128 chr8_random 943810 + 303580 303689 chr8 146364022 - 102542031 102542140 1606173
-109
-
-chain 117 chr8_random 943810 + 213542 213590 chr8 146364022 - 102569848 102569896 24793283
-48
-
-chain 107 chr8_random 943810 + 265719 265758 chr8 146364022 + 43793691 43793730 32387625
-39
-
-chain 103 chr8_random 943810 + 302985 303114 chr8 146364022 - 99516149 99516278 2070053
-129
-
-chain 102 chr8_random 943810 + 266041 266087 chr8 146364022 + 43794012 43794058 15664471
-46
-
-chain 87 chr8_random 943810 + 266314 266347 chr8 146364022 + 46839806 46839839 33038660
-33
-
-chain 11336435868 chr9 140273252 + 0 140273252 chr9 141213431 + 10000 141153431 13
-189075	1	1
-14	2	2
-39464594	50000	50000
-261110	50000	50000
-208233	50000	50000
-142805	50000	50000
-464507	50000	50000
-152873	50000	50000
-172579	50000	50000
-799200	0	4
-398958	50000	50000
-549743	50000	100000
-632871	50000	50000
-680077	50000	50000
-181647	50000	50000
-291910	50000	100000
-465318	50000	50000
-350909	50000	50000
-194609	50000	100000
-370335	0	176
-128583	50000	100000
-157546	18100000	18150000
-450681	50000	50000
-223855	50000	50000
-162441	50000	50000
-159539	50000	50000
-199148	50000	50000
-194491	50000	100000
-158462	50000	150000
-471702	50000	150000
-376183	50000	150000
-174765	50000	150000
-289439	50000	50000
-682157	50000	50000
-158187	50000	100000
-187806	50000	50000
-178933	50000	100000
-21507948	50000	100000
-85380	50000	150000
-834971	1	0
-39559293	100000	150000
-3818133	200000	50000
-2075804	30000	50000
-1936434
-
-chain 19053295 chr9_random 1146434 + 140076 853151 chr9 141213431 + 43822338 44639038 145
-1110	1	1
-47	1	0
-215	1	0
-468	9	9
-1934	0	1
-953	14319	26012
-970	11	11
-117	1	1
-57	1	1
-127	0	1
-1035	1	1
-123	1	1
-1418	29455	36221
-965	1	1
-33	5	5
-816	1	1
-38	1	1
-87	8	8
-588	6	6
-286	13	13
-967	6	6
-911	125	14857
-67	1	1
-18	1	1
-472	11	11
-269	7	0
-869	1	1
-23	1	1
-240	1	0
-456	1	1
-96	1	1
-247	22	22
-225	1	1
-13	0	4
-40	1	1
-211	13	29
-582	1	1
-22	4	0
-453	1	1
-37	1	1
-251	11	11
-87	1	1
-49	1	1
-95	11	11
-149	1	1
-31	1	1
-205	5	0
-1090	5	5
-89	1	1
-74	14	14
-83	1	1
-51	1	1
-594	1	3
-462	85	85
-635	50621	3293
-88	0	1
-148	18	18
-428	2	0
-5	2	0
-19	0	1
-43	1	1
-529	1	6
-77	1	1
-31	1	1
-39	0	5
-124	15	15
-51	1	1
-80	1	1
-103	1	1
-77	1	1
-147	1	1
-72	1	1
-95	10	10
-657	1	1
-57	1	1
-69	1	1
-32	1	1
-587	4	4
-298	14	14
-1505	10	8
-560	0	4
-171	1	1
-44	1	1
-211	1	1
-22	1	1
-649	1	1
-42	0	2
-96	8	8
-45	1	0
-195	402195	519766
-38949	0	176
-45847	1	0
-46124	1	0
-3889	0	1
-52224
-
-chain 10363290 chr9_random 1146434 + 903151 1075657 chr9_gl000199_random 169874 + 0 130000 308
-35955	882	0
-20	1020	0
-32	3062	0
-106	14	15
-100	9	7
-334	16	18
-121	1	0
-84	3469	73
-179	1193	0
-255	3064	0
-235	844	167
-325	2720	0
-211	25	25
-216	3639	67
-100	681	1
-58	5271	0
-71	36	36
-155	11817	855
-1017	1	0
-10599	1	1
-42	0	1
-8519	112	112
-9882	0	680
-263	8	8
-56	30	30
-206	865	183
-1131	1	0
-12309	16295	0
-37	2637	0
-463	15	15
-739	1	1
-64	1	1
-2323	1	0
-743	202	202
-245	2	0
-10307	33	32
-8496	15	15
-1065	3	3
-49	1	1
-67	1	1
-24	1	1
-150	15	15
-81	1112	7412
-104	5	5
-160	48	48
-156	31	31
-109	29	29
-32	0	337
-118	36	36
-108	21	21
-69	163	165
-105	29	29
-255	32	32
-176	46	46
-97	54	54
-158	110	5213
-54	5	5
-61	1	0
-12	66	578
-49	0	1
-256	0	1
-5	1	0
-110	0	507
-39	59	227
-44	1	0
-5	1	2
-13	268	611
-32	340	0
-2169	5	5
-109
-
-chain 8496666 chr9_random 1146434 + 526031 616031 chr9_gl000198_random 90085 + 0 90000 391
-90000
-
-chain 3482851 chr9_random 1146434 + 0 36148 chr9_gl000201_random 36148 + 0 36148 837
-36148
-
-chain 3114479 chr9_random 1146434 + 350153 383343 chr7 159138663 + 58020084 58054331 923
-5741	0	1
-5176	1	1
-36	1	1
-8401	0	3
-180	1	0
-1283	1	371
-2015	11	695
-10343
-
-chain 2652717 chr9_random 1146434 + 939453 971857 chr9_gl000199_random 169874 + 50544 169869 966
-78	104	103
-57	43	43
-41	0	1193
-212	20	20
-112	51	51
-93	1	0
-763	32	32
-929	0	85729
-2133	785	785
-1551	1	1
-38	0	1
-29	1	1
-1849	179	179
-1081	14	14
-98	255	255
-3064	235	235
-844	325	325
-2000	1	1
-55	1	1
-663	211	211
-25	216	216
-3639	100	100
-681	58	58
-5271	71	71
-36	155	155
-4203
-
-chain 864673 chr9_random 1146434 + 1126594 1146123 chr9 141213431 - 1097613 1113419 4959
-1953	6	5
-978	2409	6373
-1991	1	1
-30	1	1
-1102	7741	55
-57	1	1
-3259
-
-chain 850211 chr9_random 1146434 + 1025598 1042157 chr9_gl000199_random 169874 + 85137 125159 1202
-223	15	15
-69	106	782
-56	4	4
-103	0	1190
-57	51	51
-154	11	11
-103	0	1190
-303	94	5704
-122	20	700
-283	11	11
-564	0	6798
-68	31	31
-85	0	1
-80	48	48
-422	49	50
-604	27	3091
-147	0	4594
-563	468	470
-104	1	1
-65	1	1
-786	1	1
-26	4	4
-3436	346	0
-2356	158	158
-2985	37	37
-170	167	170
-910	11	11
-54
-
-chain 769263 chr9_random 1146434 + 86461 232520 chr9 141213431 + 40031497 40507253 306
-1287	1	1
-39	9090	8469
-1482	3	0
-72	22972	39210
-845	1	5
-1628	100	33581
-19	1	1
-708	1	1
-40	1	1
-1672	2596	163229
-3012	1	1
-27	1	0
-759	0	1
-98	72164	49914
-85	17764	159979
-3474	1	1
-50	1	1
-6064
-
-chain 759449 chr9_random 1146434 + 205961 214049 chr9 141213431 + 40301888 40309971 6546
-2149	0	1
-2715	38	32
-3186
-
-chain 584316 chr9_random 1146434 + 1135427 1141773 chr9 141213431 + 140095418 140108346 9081
-578	0	1
-958	0	1
-3002	120	6700
-1688
-
-chain 406492 chr9_random 1146434 + 174973 187473 chr9 141213431 - 97329171 97382324 1352
-1045	1	0
-610	3	3
-25	1	1
-707	0	1
-949	1	0
-476	1	1
-37	0	2
-115	22	0
-99	2	0
-19	0	1
-85	84	84
-391	0	2
-2020	102	40820
-178	0	5
-70	1	1
-108	1	0
-1683	56	22
-203	4	0
-53	0	3
-1920	1	0
-25	15	0
-171	0	4
-991	1	0
-102	1	1
-39	1	0
-81
-
-chain 392431 chr9_random 1146434 + 102229 150933 chr9 141213431 - 100800050 101111299 1649
-1200	31	31
-61	100	87
-1550	13066	115954
-174	1	7
-2845	28138	189099
-40	1462	165
-36
-
-chain 384690 chr9_random 1146434 + 98535 256322 chr9 141213431 - 100787713 101169878 613
-1160	1	0
-743	100	2055
-1590	33793	2374
-3943	1	0
-110	10986	2654
-28	3892	11
-65	38	37
-101	8010	603
-1627	0	1
-4154	127	18597
-1903	17	17
-1098	1	0
-907	16	6
-635	1	0
-110	11	10
-1170	39276	55950
-254	1	1
-16	1	1
-222	1	1
-23	0	3
-11	1	1
-963	0	1
-1311	1	1
-22	1	1
-1083	0	2
-4770	9790	219711
-142	1	1
-35	1	1
-191	1	1
-48	1	1
-4295	1	0
-1323	1	1
-26	1	0
-2991	1	0
-1653	100	28511
-184	1	1
-25	1	1
-2332	2	0
-2424	1	1
-18	1	1
-1612	0	2
-1973	2	0
-4314
-
-chain 222862 chr9_random 1146434 + 974475 976909 chr9_gl000199_random 169874 - 29206 35723 496317
-103	0	512
-103	0	2379
-1951	0	1192
-277
-
-chain 216950 chr9_random 1146434 + 179171 191499 chr9 141213431 - 75591738 75613431 4354
-84	8327	17685
-315	1	1
-43	1	1
-565	1	1
-45	1	1
-144	1	1
-47	3	3
-216	4	8
-856	15	15
-173	1	1
-23	0	1
-306	1	1
-34	1	2
-855	1	1
-41	1	1
-59	0	1
-60	1	1
-46	1	1
-55
-
-chain 213582 chr9_random 1146434 + 1129631 1131840 chr9 141213431 - 1091833 1094042 537694
-2209
-
-chain 165378 chr9_random 1146434 + 971957 973731 chrX 155270560 + 21244335 21246110 770883
-1088	0	1
-111	1	1
-46	3	3
-525
-
-chain 132596 chr9_random 1146434 + 92033 271291 chr9 141213431 - 75460140 75627580 890
-687	15	5
-714	42447	12782
-26	11947	6649
-27	11	12
-38	1490	2
-104	2	0
-98	117515	142147
-548	14	14
-760	1	1
-15	5	5
-244	0	8
-225	1	1
-25	1	1
-184	1	1
-24	1	1
-112	1	1
-49	1	1
-657	0	4
-26	1	1
-142	1	1
-117	1	1
-521	1	1
-30	1	1
-427
-
-chain 126182 chr9_random 1146434 + 264182 265594 chr9 141213431 + 41417376 41418784 8289
-408	11	11
-453	3	0
-470	1	0
-66
-
-chain 121265 chr9_random 1146434 + 153981 183865 chr9 141213431 + 40369543 40485128 5651
-820	1	0
-80	65	65
-38	101	101
-1814	1	1
-19	1	1
-2113	24775	110477
-56
-
-chain 112452 chr9_random 1146434 + 977951 979143 chr9 141213431 + 41554070 41555262 1142654
-1192
-
-chain 111666 chr9_random 1146434 + 115028 116206 chr9 141213431 + 38976673 38977851 1144814
-1178
-
-chain 91839 chr9_random 1146434 + 95026 96000 chr9 141213431 - 97340505 97341479 1389514
-974
-
-chain 86695 chr9_random 1146434 + 89274 94894 chr9 141213431 + 40421854 40482922 755289
-656	0	1
-294	1	0
-357	1	1
-58	1	1
-181	2726	58174
-1345
-
-chain 85848 chr9_random 1146434 + 116324 118085 chr9 141213431 + 40126032 40127795 187229
-1300	0	2
-247	1	1
-31	1	1
-181
-
-chain 83527 chr9_random 1146434 + 105271 111078 chr9 141213431 + 43838264 43842306 8535
-1025	1	1
-44	1	1
-374	2077	318
-609	3	0
-643	18	19
-121	15	16
-135	5	0
-736
-
-chain 82351 chr9_random 1146434 + 265594 267154 chr9 141213431 - 97363431 97364991 1727
-341	2	2
-20	1	1
-738	1	1
-34	1	1
-206	1	1
-40	1	1
-174
-
-chain 74906 chr9_random 1146434 + 107880 108681 chr9 141213431 + 40288016 40288817 1344818
-46	1	0
-553	0	1
-201
-
-chain 73427 chr9_random 1146434 + 106816 115028 chr9 141213431 - 93902441 93905998 1707
-229	0	1
-500	19	19
-145	5760	1098
-49	0	1
-9	0	1
-188	1	1
-43	1	1
-243	1	1
-41	1	1
-206	1	1
-25	1	1
-443	0	1
-171	0	3
-135
-
-chain 72594 chr9_random 1146434 + 977068 977842 chr9 141213431 - 99740263 99741035 1743552
-651	1	0
-45	1	0
-76
-
-chain 68316 chr9_random 1146434 + 87923 91873 chr9 141213431 - 101134923 101183249 1049825
-372	0	1
-115	1	1
-37	1	1
-725	1749	46124
-950
-
-chain 61838 chr9_random 1146434 + 1042331 1042988 chr9_gl000199_random 169874 - 40496 41153 2045151
-657
-
-chain 55013 chr9_random 1146434 + 1075993 1076574 chr2 243199373 - 242829160 242829741 2308873
-581
-
-chain 54512 chr9_random 1146434 + 144930 149178 chr9 141213431 - 75605255 75609502 8620
-250	1	1
-26	1	1
-262	14	19
-1397	10	9
-876	1	0
-98	79	75
-65	1	1
-772	1	1
-31	1	1
-235	1	1
-74	1	1
-51
-
-chain 52053 chr9_random 1146434 + 149316 153855 chr9 141213431 + 40375457 40380000 99648
-79	244	244
-76	2437	2440
-75	10	10
-247	0	1
-19	1304	1304
-48
-
-chain 51431 chr9_random 1146434 + 126523 128919 chr9 141213431 - 101152632 101155028 6098
-2396
-
-chain 48062 chr9_random 1146434 + 390785 391322 chr5 180915260 - 163073999 163074536 2667488
-241	1	1
-201	3	3
-91
-
-chain 43629 chr9_random 1146434 + 1073062 1075987 chr9_gl000199_random 169874 + 35053 37976 298767
-312	2456	2456
-1	2	0
-78	21	21
-55
-
-chain 37453 chr9_random 1146434 + 1024767 1030521 chr9_gl000199_random 169874 + 88172 123905 8301
-52	0	3738
-40	1994	12406
-94	1068	11110
-31	165	2038
-48	1933	5847
-329
-
-chain 33524 chr9_random 1146434 + 133017 135796 chr9 141213431 + 39163384 39166153 115831
-53	1	1
-307	5	4
-44	1	1
-406	1	1
-21	5	0
-43	1	1
-177	1	1
-25	1	0
-31	1	1
-137	5	5
-20	1	1
-52	1	1
-27	1	1
-233	1	1
-20	1	1
-394	3	0
-363	1	1
-24	1	1
-370
-
-chain 29196 chr9_random 1146434 + 343146 344485 chr3 198022430 + 156000638 156001989 5034584
-50	1	0
-56	1	1
-104	128	140
-64	838	839
-97
-
-chain 28265 chr9_random 1146434 + 96095 96747 chr9 141213431 - 93903474 93904131 1828707
-74	0	10
-511	4	0
-47	1	0
-15
-
-chain 26156 chr9_random 1146434 + 111189 113362 chr9 141213431 - 102220148 102222323 47568
-1400	0	1
-94	5	6
-674
-
-chain 25868 chr9_random 1146434 + 149715 153807 chr9 141213431 - 93950637 93954729 91748
-181	1	1
-57	1	1
-353	15	15
-330	1	0
-22	1	1
-220	93	93
-114	0	17
-104	9	9
-290	2	0
-293	1	1
-20	1	1
-328	351	343
-127	1	1
-76	1	1
-331	4	0
-52	1	1
-17	1	1
-106	5	0
-146	1	1
-38	0	3
-7	1	0
-116	3	3
-16	1	1
-168	0	1
-85
-
-chain 25003 chr9_random 1146434 + 1069304 1075830 chr9_gl000199_random 169874 + 56286 59580 21268
-305	7	7
-77	487	487
-25	288	288
-36	198	198
-163	105	105
-29	463	463
-46	1256	67
-82	36	36
-95	32	32
-28	2595	552
-103	9	9
-61
-
-chain 23281 chr9_random 1146434 + 1028681 1035309 chr9_gl000199_random 169874 + 97567 114227 7110
-30	1360	6799
-121	342	0
-5	4424	9363
-103	237	233
-6
-
-chain 21805 chr9_random 1146434 + 1135081 1135321 chr9 141213431 + 140101239 140101479 9135145
-197	1	1
-42
-
-chain 21533 chr9_random 1146434 + 1010735 1043373 chr9_gl000199_random 169874 + 61213 69988 6310
-337	14018	4703
-439	42	42
-27	307	307
-106	220	220
-51	16938	2390
-153
-
-chain 19014 chr9_random 1146434 + 335566 335883 chr16 90354753 - 56512811 56513131 11268597
-170	97	100
-50
-
-chain 18803 chr9_random 1146434 + 86148 86348 chr9 141213431 - 100705477 100705677 11441237
-200
-
-chain 13349 chr9_random 1146434 + 1068589 1070018 chr9_gl000199_random 169874 + 79052 79803 7749
-23	14	14
-253	37	37
-60	717	39
-8	269	269
-48
-
-chain 13149 chr9_random 1146434 + 410938 411078 chr8 146364022 + 38639711 38639851 17290853
-140
-
-chain 12972 chr9_random 1146434 + 332343 332481 chr7 159138663 + 61759398 61759536 17535033
-138
-
-chain 12821 chr9_random 1146434 + 388858 389014 chr15 102531392 + 80798356 80798512 17757829
-81	12	12
-63
-
-chain 11442 chr9_random 1146434 + 388166 388417 chr12 133851895 + 34836761 34837526 19956621
-81	109	623
-61
-
-chain 11149 chr9_random 1146434 + 343358 343713 chr3 198022430 - 62479553 62479920 5356830
-1	103	115
-24	134	134
-93
-
-chain 11085 chr9_random 1146434 + 468603 468722 chr9 141213431 + 42720405 42720524 20596057
-119
-
-chain 9550 chr9_random 1146434 + 389696 390760 chrX 155270560 + 61752907 61753125 23891795
-65	939	93
-60
-
-chain 9178 chr9_random 1146434 + 345818 345932 chr16 90354753 + 32819577 32819691 24666411
-52	7	7
-55
-
-chain 9128 chr9_random 1146434 + 321692 322933 chr7 159138663 + 61799163 61799701 24755828
-61	1115	412
-65
-
-chain 9086 chr9_random 1146434 + 338884 339289 chr16 90354753 + 32789437 32789842 24819157
-53	289	289
-63
-
-chain 9023 chr9_random 1146434 + 387021 388166 chr7 159138663 + 61404533 61405164 23790101
-52	1085	571
-8
-
-chain 7872 chr9_random 1146434 + 1069035 1072121 chr9_gl000199_random 169874 + 119465 157584 536281
-72	46	46
-97	2835	37868
-36
-
-chain 7579 chr9_random 1146434 + 402601 403961 chr3 198022430 - 107545066 107546932 27123369
-31	1026	0
-52	201	1733
-50
-
-chain 7458 chr9_random 1146434 + 343360 343449 chr6 171115067 + 69499143 69499232 6836024
-89
-
-chain 6713 chr9_random 1146434 + 425056 425127 chr16 90354753 + 46455806 46455877 28826250
-71
-
-chain 6541 chr9_random 1146434 + 468921 468991 chr7 159138663 + 61361207 61361277 29216706
-70
-
-chain 6486 chr9_random 1146434 + 330636 330705 chr10 135534747 + 42383267 42383336 29375264
-69
-
-chain 6456 chr9_random 1146434 + 411427 412083 chr11 135006516 + 48877623 48879132 29439180
-48	554	1407
-54
-
-chain 6295 chr9_random 1146434 + 404771 404838 chr8 146364022 + 43770407 43770474 29850106
-67
-
-chain 6049 chr9_random 1146434 + 414120 414184 chr7 159138663 - 101095351 101095415 30492982
-64
-
-chain 6040 chr9_random 1146434 + 465963 466027 chr6 171115067 + 83274875 83274939 30512451
-64
-
-chain 5969 chr9_random 1146434 + 389015 389089 chrY 59373566 - 43064540 43064609 20514560
-61	5	0
-8
-
-chain 5636 chr9_random 1146434 + 406636 407740 chr8 146364022 + 43770397 43770476 31630565
-28	1025	0
-51
-
-chain 5631 chr9_random 1146434 + 426803 426863 chr10 135534747 + 42387748 42387808 31636152
-60
-
-chain 5540 chr9_random 1146434 + 419067 419126 chr7 159138663 + 61079182 61079241 31906304
-59
-
-chain 5476 chr9_random 1146434 + 398987 399045 chr12 133851895 + 34839855 34839913 32105830
-58
-
-chain 5376 chr9_random 1146434 + 415322 415379 chr11 135006516 - 86268315 86268372 32415872
-57
-
-chain 5358 chr9_random 1146434 + 413960 414017 chrY 59373566 - 49305277 49305334 32458256
-57
-
-chain 5349 chr9_random 1146434 + 411179 411236 chr7 159138663 + 91218545 91218602 32466470
-57
-
-chain 5349 chr9_random 1146434 + 417041 417098 chr11 135006516 - 84295010 84295067 32466776
-57
-
-chain 5305 chr9_random 1146434 + 979284 979471 chr9_gl000199_random 169874 + 100510 100697 1541
-187
-
-chain 5294 chr9_random 1146434 + 393589 393645 chr19_gl000208_random 92689 - 78786 78842 32648958
-56
-
-chain 5285 chr9_random 1146434 + 407829 407885 chr16 90354753 + 34022252 34022308 32672407
-56
-
-chain 5248 chr9_random 1146434 + 345095 345150 chr3 198022430 + 72765342 72765397 32777800
-55
-
-chain 5194 chr9_random 1146434 + 325928 325983 chr16 90354753 + 46454212 46454267 32965981
-55
-
-chain 5076 chr9_random 1146434 + 385523 385577 chr9 141213431 - 74211269 74211323 33342253
-54
-
-chain 5012 chr9_random 1146434 + 398477 398530 chr3 198022430 - 107545544 107545597 33565319
-53
-
-chain 4985 chr9_random 1146434 + 417987 418040 chr8 146364022 + 43776134 43776187 33649135
-53
-
-chain 4821 chr9_random 1146434 + 397137 397188 chrX 155270560 + 61817502 61817553 34214385
-51
-
-chain 4794 chr9_random 1146434 + 414576 414627 chr11 135006516 + 50778923 50778974 34325073
-51
-
-chain 4794 chr9_random 1146434 + 397714 397765 chr19_gl000208_random 92689 - 71810 71861 34325191
-51
-
-chain 4730 chr9_random 1146434 + 411917 411967 chr21 48129895 - 33764186 33764236 34527656
-50
-
-chain 4709 chr9_random 1146434 + 107713 107880 chr9 141213431 + 40326898 40327067 460940
-64	0	2
-103
-
-chain 4703 chr9_random 1146434 + 396620 396670 chr11 135006516 + 50701175 50701225 34648839
-50
-
-chain 4594 chr9_random 1146434 + 460317 460366 chr1 249250621 + 72586197 72586246 34758860
-49
-
-chain 4154 chr9_random 1146434 + 389765 389825 chrX 155270560 + 61859291 61859351 24051909
-60
-
-chain 4125 chr9_random 1146434 + 1047887 1048034 chr9_gl000199_random 169874 + 145761 145908 266403
-21	18	18
-108
-
-chain 4032 chr9_random 1146434 + 1010207 1010501 chr9_gl000199_random 169874 + 46738 47032 105345
-133	51	51
-110
-
-chain 3744 chr9_random 1146434 + 974418 974475 chr9_gl000199_random 169874 - 111819 111876 792102
-57
-
-chain 3426 chr9_random 1146434 + 939387 939437 chr9_gl000199_random 169874 + 161370 161420 23133078
-50
-
-chain 3397 chr9_random 1146434 + 1069115 1069304 chr9_gl000199_random 169874 + 57287 57476 721888
-38	97	97
-54
-
-chain 3297 chr9_random 1146434 + 1037665 1037723 chr9_gl000199_random 169874 + 108413 108471 1099981
-5	32	32
-21
-
-chain 2900 chr9_random 1146434 + 210827 210859 chr9 141213431 + 43889710 43889742 6957
-32
-
-chain 2688 chr9_random 1146434 + 1042157 1042279 chr9_gl000199_random 169874 + 112227 112349 8300
-65	9	9
-48
-
-chain 2652 chr9_random 1146434 + 999650 1043482 chr9_gl000199_random 169874 + 41812 46278 8409
-112	43376	4009
-54	0	1
-28	153	153
-109
-
-chain 2438 chr9_random 1146434 + 1025529 1025571 chr9_gl000199_random 169874 + 134052 134094 269933
-42
-
-chain 2404 chr9_random 1146434 + 153855 153881 chr9 141213431 + 40071265 40071291 103174
-26
-
-chain 2298 chr9_random 1146434 + 1010672 1010735 chr9_gl000199_random 169874 + 66766 66829 8935
-63
-
-chain 2164 chr9_random 1146434 + 1010368 1010391 chr9 141213431 - 71502272 71502295 32168220
-23
-
-chain 2160 chr9_random 1146434 + 388789 388840 chr7 159138663 - 101569537 101569588 23945255
-51
-
-chain 2026 chr9_random 1146434 + 343746 343819 chr10 135534747 + 18324071 18324144 14357746
-73
-
-chain 1834 chr9_random 1146434 + 1010501 1010672 chr9_gl000199_random 169874 + 60299 60470 7461
-171
-
-chain 1808 chr9_random 1146434 + 391322 391360 chr7 159138663 - 47529927 47529965 6263864
-38
-
-chain 1777 chr9_random 1146434 + 343550 344817 chr22 51304566 + 35077657 35078810 5733588
-48	1167	1053
-52
-
-chain 1529 chr9_random 1146434 + 263922 264091 chr9 141213431 + 65673675 65673833 515
-62	10	0
-17	1	0
-14	2	2
-63
-
-chain 1325 chr9_random 1146434 + 1037723 1037780 chr9_gl000199_random 169874 + 96057 96114 245438
-57
-
-chain 1237 chr9_random 1146434 + 1024624 1024767 chr9_gl000199_random 169874 + 49580 49723 8604
-143
-
-chain 1217 chr9_random 1146434 + 1071842 1072151 chr9_gl000199_random 169874 + 48108 48417 165690
-30	6	6
-74	169	169
-30
-
-chain 897 chr9_random 1146434 + 1035274 1035303 chr9_gl000199_random 169874 + 108574 108603 711169
-29
-
-chain 881 chr9_random 1146434 + 345308 345393 chrX 155270560 - 77826120 77826205 8910963
-85
-
-chain 812 chr9_random 1146434 + 344331 344387 chr9 141213431 + 18649465 18649521 20542621
-56
-
-chain 538 chr9_random 1146434 + 1029334 1029359 chr9_gl000199_random 169874 + 75943 75968 9317
-25
-
-chain 480 chr9_random 1146434 + 344828 344880 chr4 191154276 - 62643619 62643671 15050009
-52
-
-chain 461 chr9_random 1146434 + 96747 96777 chr9 141213431 + 38980922 38980952 1279
-30
-
-chain 364 chr9_random 1146434 + 1025018 1025062 chr9_gl000199_random 169874 + 64308 64352 115390
-44
-
-chain 296 chr9_random 1146434 + 1009971 1010001 chr9_gl000199_random 169874 + 44634 44664 18919
-30
-
-chain 288 chr9_random 1146434 + 974120 974172 chr9_gl000199_random 169874 + 44920 44972 1936043
-52
-
-chain 260 chr9_random 1146434 + 394227 394279 chr11 135006516 + 50701175 50701227 28339537
-52
-
-chain 210 chr9_random 1146434 + 1025062 1025090 chr9_gl000199_random 169874 + 71670 71699 216729
-6	0	1
-22
-
-chain 209 chr9_random 1146434 + 388033 388083 chr11 135006516 - 84294197 84294247 27927923
-50
-
-chain 152 chr9_random 1146434 + 393023 393074 chr20 63025520 + 26259164 26259215 28112557
-51
-
-chain 86 chr9_random 1146434 + 405210 405252 chr3 198022430 - 107550280 107550322 32195393
-42
-
-chain 79 chr9_random 1146434 + 392892 392941 chr11 135006516 + 50661000 50661049 27948217
-49
-
-chain 1574309 chrM 16571 + 0 16571 chrM 16571 + 0 16571 1567
-16571
-
-chain 14267288654 chrX 154913754 + 0 154913754 chrX 155270560 + 60000 155260560 8
-34821	50000	50000
-86563	30000	50000
-766173	50000	50000
-36556	50000	50000
-80121	90000	50000
-754004	100000	50000
-5505644	0	50000
-3064785	0	50079
-26309510	25000	50000
-201175	0	8
-7417	2	0
-53136	0	8
-3076	12	0
-21092	2	0
-60831	0	2
-57728	20	0
-54336	1	0
-31676	4	0
-9986	0	4
-12109	4	0
-11227342	2000	0
-354815	50000	50000
-77401	1	1
-17	1	1
-94	3	0
-266	10	10
-113	1	1
-21	1	1
-5401	5	0
-4970	2	0
-33	6	0
-3221	1	5
-6456	0	1
-1476	5	5
-2100	1	1
-40	1	1
-1316	1	0
-2446	0	1
-1589	17	15
-11171	0	1
-2639	0	1
-5190	4	0
-78	0	8
-5087	1	0
-2663	0	1
-9149	8	7
-1851	1	0
-9081	1	0
-7249	0	25
-199	2	0
-12	2	0
-16	0	209
-37	0	20
-2536	1	0
-1394	6	0
-12550	42	0
-821	0	4
-30579	0	1
-3710	0	4
-3638	0	1
-11945	1	0
-20204	1	0
-4171	0	8
-5680	0	1
-23827	2	0
-54817	1	0
-657	1	0
-342931	180000	50000
-2052068	1	27
-5375	0	2
-46	2	0
-6489	1	0
-7175	0	2
-1239	0	2
-4302	4	0
-27253	1	0
-4244	2	0
-717	2	0
-261	6	0
-26074	0	1
-236464	50000	50000
-6136098	3000000	3100000
-13518993	0	1
-449	0	1
-4533	0	4
-757	0	1
-1102	25	26
-107	0	2
-3470	1	0
-1108	0	1
-4775	0	1
-8628	1	1
-46	1	1
-1072	1	1
-44	1	1
-292	5	4
-9091	4	4
-2218	4	4
-705	1	5
-452	1	0
-88	32	32
-212	1	0
-1801	1	7
-3960	0	1
-2007	0	1
-1979	38	38
-1320	0	1
-2093	0	1
-403	0	310
-6134	1	1
-36	1	1
-1697	0	1
-97	0	13
-7624	1	1
-19	1	1
-6933	0	1
-779	7	7
-721	1	1
-43	1	1
-1626	1	0
-6146	2	0
-150	1	1
-47	1	1
-2172	2	0
-398	1	1
-31	1	1
-1149	2	2
-183	16	16
-1663	1	1
-18	1	1
-2105	10	11
-1409	1	1
-33	1	1
-1753	0	1
-408	1	0
-1916	0	1
-477	37	37
-1415	12	0
-3799	17	17
-2921	1	0
-1811	33	33
-2753	2	0
-486	0	6
-1388	1	1
-44	1	1
-186	1	1
-46	1	1
-3037	1	0
-2301	3	0
-3876	1	1
-22	1	1
-1724	0	1
-3733	0	1
-627	0	1
-250	1	0
-194	1	1
-26	1	1
-20797	10	10
-2445	1	0
-1733	0	2
-1001	12	0
-4394	9	9
-4052	10	9
-670	1	1
-97	6	0
-25	1486	1188
-10	3	2
-28	41	41
-28	2	3
-10	126	1058
-11	1051	417
-25	0	6
-18	1	1
-62	17	17
-77	0	1
-1009	41	41
-3899	10	10
-4690	0	1
-7343	1	0
-1248	1	0
-1259	1	0
-1345	0	4
-1534	1	0
-3797	16	16
-807	1	0
-2427	1	0
-48	0	1
-287	1	0
-611353	0	1
-1041	6	0
-371	0	1
-227	0	1
-2806	1	0
-36	1	1
-234	1	1
-23	1	1
-584	1	0
-22241	1	1
-65	1	1
-4605	0	1
-2326	0	20
-2130	0	1
-6170	9	13
-10665	0	1
-14631	1	0
-5359	4	0
-4004	1	0
-3182	11	0
-3897	14	16
-2551	1	0
-1824	1	0
-5274	1	1
-41	1	1
-4309	0	1
-3827	0	1
-4594	0	1
-65	1	1
-1170	1	1
-42	4	4
-214	0	1
-5228	0	1
-553	1	0
-5528	7	7
-735	14	14
-2861	1	0
-156	0	2
-6183	42	42
-2595	1	1
-41	1	1
-472	1	1
-65	0	1
-8	1	1
-1162	1	0
-565	1	1
-48	1	1
-536	2	1
-766	0	2
-4520	0	1
-1574	1	0
-503	0	1
-2558	0	1
-250061	7	7
-9650	18	18
-3208	1	1
-25	0	1
-744	2	0
-2994	1	1
-33	1	1
-1331	1	0
-2042	6	17
-1292	1	1
-35	1	1
-2485	1	1
-35	1	1
-17284	1	0
-7	7	1
-670	0	4
-429	0	1
-4736	1	0
-3849	0	1
-6745	16	16
-2344	1	1
-41	1	1
-4459	9	9
-3449	0	1
-3876	1	1
-75	1	1
-1429	7	7
-11126	26	26
-781	1	1
-28	1	1
-409	12	13
-1223	12	12
-5354	0	1
-1255	0	6
-851	65	65
-126	1	1
-47	5	5
-5931	4	0
-420	0	1
-2949	0	6
-193	324	324
-6740	1	3
-1074	1	0
-2465	1	1
-40	1	1
-640	2	0
-550	1	1
-32	1	1
-4096	1	1
-29	1	1
-949	6	6
-6258	1	0
-3957	1	0
-19608	1	1
-48	1	1
-234	0	1
-13246	13	13
-4651	321	0
-2617	1	0
-4553	0	3
-491	0	6
-7496	1	1
-9	0	10
-77	0	4
-3314	1	1
-32	1	1
-5217	1	0
-1500	17	17
-2023	1	0
-2425	0	18
-3110	8	8
-3248	1	0
-1946	1	1
-48	1	1
-9620	0	2
-31242	20000	50000
-36075685	3	0
-36004	1	1
-27	1	1
-5196	0	1
-293	0	2
-13307	0	3
-2420	6	0
-1863	0	2
-2911	0	1
-3233	2	0
-66	1	0
-2376	10	0
-4893	1	0
-745	1	0
-3897	0	13
-3835	1	1
-55	1	1
-538	1	1
-48	4	1
-20	0	2
-279	0	2
-33	1	1
-48	1	0
-387	8	8
-692	0	1
-375	3	0
-383	1	1
-18	1	1
-1289	1	1
-29	1	1
-12332	0	331
-856	4	0
-48	0	4
-8716	0	5
-130	2	0
-3001	0	1
-1332	8	5
-23273	0	1
-30174	27	39
-337	0	3
-2838	1	0
-1614	0	9
-313	0	1
-83	4	0
-172	1	1
-25	1	1
-4912	0	39
-1863	0	1
-2931	1	0
-3134	0	3
-390880	0	1
-7199	1	0
-305	2	0
-1811	2	0
-5449	0	3
-7443	0	2
-2171	1	1
-27	1	1
-2668	0	2
-2180	0	1
-1170	0	9
-1450	16	16
-3080	1	0
-920	18	18
-10219	1	0
-678	1	1
-28	1	1
-698	1	0
-112	1	0
-1831	3	0
-14327	2	0
-2087	10	10
-150	0	3
-380	1	1
-28	1	1
-1265	19	21
-7184	3	2
-4225	9	14
-1002	0	1
-3855	4	0
-2534	1	1
-30	1	1
-794	1	0
-25	1	1
-76140	70000	50000
-1432750	4799	0
-8	2973	0
-681864	20000	50000
-4278742	0	56347
-12021233	9	9
-1775	1	0
-1468	1	1
-51	16	14
-6	0	1
-6	0	1
-11	4	5
-7	0	1
-4	0	1
-75	1	2
-26	1	0
-16	0	1
-9	0	1
-19	0	2
-22	1	0
-9	0	1
-5	1	3
-14	6	7
-38	1	0
-26	1	1
-62	0	1
-38	1	1
-1687	0	1
-54	0	1
-8528	0	1
-2722	0	1
-6240	0	1
-33	0	1
-121285	1	0
-6	0	1
-35	1	0
-1381	0	1
-5368	1	0
-3079	0	1
-10863441	0	4
-1799	1	1
-24	1	1
-334	1	0
-4960	17	0
-1160	1	1
-34	1	1
-6153	3	0
-1346	4	0
-103	4	0
-2835	12	12
-304	0	16
-719	0	1
-3286	1	0
-10182	0	9
-804	1	1
-28	1	1
-749	0	1
-3387	1	1
-47	1	1
-482	0	1
-455	15	15
-719	1	1
-18	1	1
-2074	0	1
-1348	0	4
-3928	1	1
-18	1	1
-907	0	1
-2972	2	0
-115	1	1
-37	1	1
-4428	1	0
-1120	1	0
-4055	5	0
-2753	18	18
-158	3	0
-3590	1	1
-47	1	1
-62	1	0
-947	1	1
-45	1	1
-1639	1	1
-32	1	1
-1076	0	1
-3996	4	0
-7965	1	0
-1733	1	0
-1451	0	2
-617	1	0
-4375	0	1
-2194	64	63
-301	1	1
-27	1	1
-6661	1	1
-79	1	1
-1495	1	0
-499	1	1
-37	2	2
-968	1	0
-34	1	1
-6337	1	1
-18	1	1
-8162	1	1
-22	5	0
-9274	1	0
-6017	5	5
-3872	8	0
-5421	1	0
-532	6	7
-5673	0	4
-1542	4	0
-890	3	1
-2561	1	0
-1692	1	0
-1142	1	1
-32	1	1
-503	2	1
-123	1	1
-75	1	1
-2322	1	0
-201	1	0
-40	3	3
-149	3	0
-1441	1	1
-40	1	1
-159	2	0
-1278	1	1
-33	1	1
-221	0	1
-31	1	1
-161	9	10
-1890	0	1
-132	1	1
-37	1	1
-514	17	23
-1373	4	0
-907	1	1
-15	1	1
-714	1	1
-18	0	1
-10	1	1
-55	1	1
-24	1	1
-1038	2	0
-95	1	5
-1094	1	1
-170	1	1
-844	0	3
-369	1	1
-39	1	1
-650	1	1
-41	1	1
-176	12	12
-688	1	0
-7640	4	0
-2650	1	1
-28	0	4
-44	1	1
-728	8	0
-2196	0	1
-13466	0	1
-3510	0	2
-2147	1	1
-44	0	3
-1320	11	11
-210	0	4
-105	1	0
-3239	0	1
-1496	142	153
-2391	1	1
-39	0	2
-438	4	0
-2272	8	0
-6865	0	3
-7183	0	1
-5104	0	3
-182	1	0
-3131	1	1
-31	1	0
-14	1	1
-59	1	0
-373	1	1
-42	1	1
-235	13	13
-1608	0	5
-152	1	1
-106	1	1
-783	34	34
-1633	1	1
-29	3	0
-821	1	1
-24	1	1
-1178	1	1
-33	1	1
-328	1	1
-27	1	1
-5682	16	13
-146398	30000	50000
-59809	0	2
-3389	1	1
-37	1	1
-11606	0	1
-1597	0	1
-618	1	1
-47	1	1
-2698	0	1
-826	5	5
-33	0	2
-2560	0	14
-98	0	3
-1287	0	1
-7600	0	1
-9894	0	8
-7160	0	1
-32	1	1
-1698	0	1
-754	2	0
-6787	0	1
-584	0	2
-1107	1	1
-40	1	1
-365	1	1
-35	1	1
-399	0	8
-11444	0	1
-1973	0	1
-1200	0	1
-716	1	1
-25	1	1
-1570	0	2
-433	2	0
-905	0	2
-94	1	1
-28	1	1
-2490	18	18
-5054	9	1
-2184	0	2
-2955	23	21
-431	49	49
-314	1	0
-1563	1	1
-20	1	1
-1632	11	0
-1671	2	0
-1527	0	1
-676	1	1
-29	1	1
-1245	1	1
-34	0	1
-1203	22	30
-1934	1	0
-3421	0	2
-17	1	1
-774	0	30
-97	6	6
-59	12	26
-840	1	1
-19	1	1
-2036	27	53
-683	30	30
-401	0	1
-25	1	1
-381	16	0
-159	1	1
-17	1	1
-1150	0	4
-700	1	0
-29	0	2
-409	1	1
-49	1	1
-1240	1	1
-37	3	3
-2248	0	1
-1828	0	1
-1997	1	5
-4640	4	4
-4555	2	0
-150	52	0
-618	2	2
-16	1	1
-83	0	22
-56	1	57
-2531	8	0
-4250	17	17
-2203	4	0
-1665	10	0
-415	0	2
-393	0	1
-15728	1	0
-158	0	4
-82	0	14
-543	1	1
-42	1	1
-3261	18	18
-139	1	1
-37	1	1
-410	1	1
-18	1	1
-5405	0	1
-1104	1	1
-53	1	1
-392	1	1
-55	3	3
-3352	0	9
-692	106	52
-27	4	0
-13	1	3
-14	88	0
-61	2	0
-8931	0	1
-6692	2	1
-253	19	19
-869	2	0
-196	0	2
-389	1	1
-30	1	1
-949	1	0
-6057	3	0
-4741	0	1
-7689	0	2
-2046	18	18
-215	1	0
-46885	0	2
-24138	0	2
-4037	0	1
-4047693	0	1
-9545	2	0
-11590	0	4
-1698	3	1
-18923	0	4
-1806	1	1
-44	1	1
-2581	2	0
-10620	1	0
-3804	1	0
-339	2	0
-476	1	0
-5861	5	8
-109	14	0
-901	1	1
-19	1	1
-45	0	2
-1736	0	1
-6625	0	2
-7812	0	4
-7678	0	2
-5086	3	8
-4170	1	0
-1671	0	6
-6333	16	0
-902	1	1
-44	1	1
-384	6	0
-23181	4	4
-214	0	2
-8958	4	0
-220	1	1
-49	1	1
-2783	1	0
-2641	1	0
-136	20	20
-1279	1	0
-3924	6	6
-13054	0	6
-8954	13	0
-4128	0	2
-2269	0	1
-16258	2	0
-30076	1	1
-49	1	1
-102	0	1
-8824	27	27
-1730	1	1
-47	1	1
-3339	1	0
-132	16	0
-81	0	16
-89	0	6
-6369	0	1
-541	0	1
-6288	4	0
-3814	0	2
-7260	1	0
-802	0	68
-1166	1	0
-2230	0	1
-1109	1	0
-1106	0	2
-12396	1	0
-26207	1	1
-21	1	1
-4087	16	0
-1323	7	7
-525	1	0
-4198	1	0
-4682	13	13
-890	2	0
-816	2	0
-1961	4	0
-24586	1	1
-19	1	1
-4403	0	1
-1342	0	1
-57	11	12
-2229	30	31
-1979	35	0
-10541	1	0
-9725	6	0
-2536	1	2
-20	1	1
-1541	12	0
-1130	1	1
-34	1	1
-927	1	0
-4003	1	0
-966	0	1
-149	1	0
-842	0	8
-4326	1	1
-25	1	1
-569	6	7
-664	2	2
-5695	0	1
-3074	1	0
-1539	9	3
-634	1	1
-39	1	1
-8610	1	1
-11	0	1
-345	43	43
-372	0	2
-4311	6	0
-3122	2	0
-369	0	1
-9963	10	10
-2191	1	1
-23	1	1
-1060	1	1
-19	1	1
-240	12	12
-1748	1	1
-45	1	1
-1040	1	1
-31	1	1
-7446	1	1
-25	1	1
-8379	7	7
-7325	0	3
-357	1	0
-1313	1	0
-11624	0	4
-5865	0	1
-9750	0	1
-3540	16	0
-5671	13	13
-2885	4	0
-8179	0	1
-753	1	0
-2289	49	49
-1979	2	0
-1318	0	1
-957	1	0
-825	12	12
-1110	16	0
-3735	17	17
-9997	223	53
-149	22	24
-636	1	1
-22	0	1
-42	1	1
-1634	4	4
-3380	3	0
-979	0	2
-3429	1	0
-7138	14	0
-1727	1	1
-38	1	0
-88	0	1
-630	20	20
-476	0	5
-21	0	1
-94	0	1
-42	1	0
-17	0	1
-27	0	1
-172	1	1
-37	1	1
-191	1	1
-66	1	1
-630	0	1
-261	1	1
-28	1	1
-1282	17	18
-429	0	1
-1588	1	1
-20	1	1
-1416	1	1
-33	1	1
-529	0	1
-25	0	1
-1863	0	4
-1651	1	1
-28	1	1
-11815	0	1
-26	0	1
-19	1	1
-3105	0	1
-700	0	1
-150	0	1
-68	0	1
-1420	0	6
-568	14	16
-2415	0	1
-41	1	1
-415	1	1
-33	1	1
-4521	1	1
-33	1	1
-307	1	0
-176	1	0
-3790	1	1
-86	1	1
-67	1	1
-65	0	1
-7439	1	1
-18	1	1
-16805	0	1
-1764	1	0
-3104	35	35
-3845	0	1
-3384	0	2
-17	0	18
-156	1	1
-30	1	1
-165	0	2
-1087	1	0
-953	1	0
-483	0	1
-632	1	0
-652	1	0
-8563	9	7
-1860	1	0
-398	1	0
-2219	1	1
-53	1	1
-756	1	1
-66	1	1
-69	1	1
-48	1	1
-63	1	1
-28	3	0
-1057	3	0
-63	0	3
-55	1	1
-74	3	2
-159	0	3
-92	1	1
-29	1	1
-58	3	0
-1210	9	9
-54	1	1
-27	1	1
-1374	0	2
-1775	17	2
-764	14	14
-331	16	16
-2291	3	4
-1687	1	1
-26	1	1
-2469	1	0
-3243	0	1
-3636	1	1
-24	1	1
-615	1	0
-2566	0	1
-275	5	0
-695	7	0
-9686	32	32
-3416	0	1
-1452	4	0
-214	13	13
-49	0	124
-1393	9	9
-5812	1	1
-24	1	1
-5703	0	1
-4006	1	0
-1462	3	0
-5199	2	0
-1554	0	2
-715	10	12
-1966	0	2
-2801	0	16
-618	0	1
-413	18	0
-730	1	1
-31	1	1
-4372	5	0
-10789	1	0
-2399	1	0
-6750	0	2
-1363	6	0
-6736	2	0
-4457	0	4
-7867	1	0
-3495	2	1
-7584	0	1
-2652	1	0
-1771	0	1
-14808	41015	41008
-19235	0	1
-9638	0	1
-2994	0	1
-469	3	1
-499	0	1
-12074	13	13
-2807	10	11
-715	0	2
-1627	6	6
-5099	1	0
-488	1	5
-975	0	2
-1761	0	1
-1794	5	0
-8254	3	3
-18	1	1
-3737	9	9
-1442	13	13
-212	0	10
-7712	1	1
-44	1	1
-4480	40	40
-1751	1	0
-1316	1	1
-49	1	1
-9050	4	0
-143	0	2
-2813	13	13
-1286	2857	49999
-75638	40000	50000
-1583473	0	2
-1564099	1	97463
-2933461
-
-chain 1621142 chrX 154913754 + 148570601 148611616 chrX 155270560 - 6466757 6507765 175
-13140	0	1
-20345	6	0
-3704	1	0
-1517	1	0
-2301
-
-chain 259772 chrX 154913754 + 75282398 75286444 chrX 155270560 - 79901776 79905823 6183
-1486	41	41
-41	40	40
-126	11	11
-1051	1209	1210
-41
-
-chain 192506 chrX 154913754 + 114908114 114911060 chrX 155270560 + 114997023 115000000 3054
-63	528	528
-60	0	16
-630	28	44
-689	16	16
-436	1	0
-495
-
-chain 188216 chrX 154913754 + 114908656 114914454 chrX 155270560 + 115000574 115005488 36116
-49	2721	1850
-47	8	8
-197	704	696
-2	16	0
-1155	42	43
-455	2	12
-400
-
-chain 119665 chrX 154913754 + 114906873 114908114 chrX 155270560 + 115003848 115005094 1024208
-1216	0	5
-25
-
-chain 29390 chrX 154913754 + 76491035 76491342 chr1 249250621 - 136684922 136685229 4932608
-307
-
-chain 25643 chrX 154913754 + 114911150 114911426 chrX 155270560 + 115005157 115005433 246321
-276
-
-chain 19821 chrX 154913754 + 114908177 114911739 chrX 155270560 + 114982173 114982762 1997
-479	3022	49
-61
-
-chain 15998 chrX 154913754 + 114911743 114912382 chrX 155270560 + 114967843 114968482 6239
-639
-
-chain 9708 chrX 154913754 + 148714470 148714905 chr5 180915260 - 8837105 8837560 23506322
-56	313	333
-66
-
-chain 9294 chrX 154913754 + 114906712 114906808 chrX 155270560 + 115005518 115005614 24447825
-96
-
-chain 6266 chrX 154913754 + 114906808 114906873 chrX 155270560 + 114962882 114962947 1027613
-65
-
-chain 6215 chrX 154913754 + 76426104 76426191 chrX 155270560 + 29934095 29934182 9535161
-87
-
-chain 5894 chrX 154913754 + 143027611 143027675 chr2 243199373 - 154977524 154977591 249
-15	0	3
-49
-
-chain 3277 chrX 154913754 + 76426069 76426104 chr1 249250621 - 60612464 60612499 19993171
-35
-
-chain 2407 chrX 154913754 + 148714814 148714839 chr2 243199373 + 100113459 100113484 27784968
-25
-
-chain 1984 chrX 154913754 + 76426191 76426234 chr8 146364022 - 27059036 27059079 21505033
-43
-
-chain 1549 chrX 154913754 + 114911087 114911150 chrX 155270560 + 114976136 114976199 336010
-63
-
-chain 1443 chrX 154913754 + 114913555 114913597 chrX 155270560 + 114984570 114984612 98822
-42
-
-chain 1245 chrX 154913754 + 148714288 148714366 chr4 191154276 - 133575330 133575408 22672116
-78
-
-chain 1030 chrX 154913754 + 114911060 114911082 chrX 155270560 + 114988042 114988064 7002
-22
-
-chain 733 chrX 154913754 + 148715982 148716070 chrX 155270560 - 110405878 110405966 21525610
-88
-
-chain 469 chrX 154913754 + 76426248 76426375 chr8 146364022 - 18567958 18568085 6841016
-127
-
-chain 293 chrX 154913754 + 148716634 148716684 chr2 243199373 - 107635751 107635801 26436223
-50
-
-chain 50554324 chrX_random 1719168 + 610279 1452044 chrX 155270560 + 76412035 77367385 75
-7124	5	6
-4742	1	1
-31	1	1
-1606	21	28
-3800	1	1
-23	1	1
-6209	1	1
-4	1	0
-22	1	0
-13	1	0
-1193	1	1
-32	1	1
-2218	0	1
-7608	6	1
-670	0	2
-1396	0	2
-1207	20	20
-5098	1	0
-1294	1	0
-119	0	1
-6626	16	16
-8221	1	0
-3722	4	0
-169	0	4
-1754	11	13
-58	0	1
-239	1	1
-75	1	1
-910	0	1
-518	7	7
-6771	0	1
-4354	26	26
-781	1	1
-28	1	1
-406	16	16
-4353	1	0
-22	100	24
-930	1	0
-33	1	1
-1226	0	1
-1278	660	1078
-3884	2	2
-22	1	1
-2022	4	0
-2593	1	0
-777	0	3
-4596	153	64
-2593	1	10
-1074	1	0
-3147	1	0
-2227	1	0
-9697	1	0
-3957	1	0
-3098	0	186786
-22519	1	0
-204	1	0
-22	1	0
-63	17	18
-9565	0	6
-6660	129	0
-58	1	0
-17671	100	83
-39	1	1
-9798	2	1
-5	0	1
-19	100	237
-1127	0	1
-4928	133	164
-8370	115	394
-3028	259	91
-9555	100	1670
-18018	6	0
-3818	1	0
-72	1	0
-15	1	0
-11	1	0
-4	1	0
-10	100	30
-18171	0	1
-18316	0	28
-22590	0	1
-2592	2	0
-8265	0	2
-4335	4	3
-14218	100	218
-8896	0	2
-5422	18	17
-1347	4	4
-83	166	0
-5120	101	153
-3114	126	148
-4567	1	0
-2511	0	1
-1289	2	0
-3129	124	175
-5332	1	0
-20	1	0
-15993	0	4
-9940	115	1562
-10856	1	1
-18	0	1
-2379	1	1
-32	74	72
-41	1	1
-3148	155	3622
-2876	621	0
-31	1	1
-2212	81729	108028
-557	0	1
-4283	1	0
-148	0	457
-722	1	1
-49	113	176
-33	2	2
-2654	1	0
-25	188	415
-1394	12	0
-5398	0	1
-28	100	19
-5509	151745	28754
-87	102	102
-66	5	5
-53	70	72
-56	201	601
-7819	256	150
-16	0	1
-6	0	1
-8001	4	0
-8135	0	1
-528	12	0
-797	100	193
-2857	496	0
-5822	153	0
-8578	1	0
-10594	1	0
-6352	3	3
-35	6	7
-50	55655	72028
-890	0	1
-72	0	1
-2125	1	1
-64	1	0
-15	1	0
-5	22	19
-12	129	67
-11	1	0
-8	0	1
-4	1	0
-16	2	2
-3637	1	1
-36	1	0
-28	1	0
-942	0	1
-231	1	1
-109	101	336
-18	11	294
-14959	0	2
-22656	3	1
-1280
-
-chain 6857177 chrX_random 1719168 + 1212241 1285856 chrX 155270560 + 76337041 76411192 460
-53	4	4
-3247	0	6
-51	2	0
-2014	2	0
-45	4	0
-20	4	0
-48	1	0
-5158	1	1
-29	1	1
-394	16	13
-1410	1	0
-12	1	0
-14	1	0
-7	1	0
-5	1	0
-13	1	0
-36	106	188
-1195	0	31
-133	0	4
-28	1	1
-1388	1	1
-18	1	1
-2790	0	1
-767	4	4
-49	0	1
-10	110	385
-52	0	1
-56	0	1
-4004	182	11
-23	1	1
-767	1	1
-66	1	1
-3217	2	0
-25	1	1
-4309	1	0
-26	0	1
-820	2	2
-4450	0	1
-1391	1	1
-33	0	1
-31	0	8
-3634	1	0
-1669	111	432
-10524	1	2
-8620	1	0
-2158	1	0
-1513	7	7
-4600	4	4
-2111
-
-chain 5479158 chrX_random 1719168 + 19684 169644 chrX 155270560 + 3753512 3953553 578
-1162	21228	9243
-742	1	0
-2200	7659	14347
-948	1	0
-4152	211	33421
-819	48	49
-92	22	22
-544	44	42
-175	0	1
-63	102	104
-246	37	37
-203	6	5
-279	27	27
-206	54	54
-394	39	40
-260	2	0
-311	16	16
-208	57	57
-349	6	6
-262	134	134
-481	0	6
-56	1	1
-868	0	5
-1387	18095	3193
-790	8	6
-1718	0	2
-3436	13	13
-241	40033	77157
-63	10	10
-425	63	0
-38963
-
-chain 5155611 chrX_random 1719168 + 1349115 1404263 chrX 155270560 - 77841540 77897663 609
-4514	1	1
-4	1	0
-15	0	1
-1714	142	0
-26953	1	1
-31	100	192
-4795	129	41
-2612	4	0
-3389	4	0
-5037	1	1
-22	101	1223
-13	9	8
-34	2	2
-5520
-
-chain 4548442 chrX_random 1719168 + 595876 1601165 chrX 155270560 - 77827311 79038577 141
-3039	114	45
-9150	2	0
-1995	422998	109473
-19795	1	0
-23	1	0
-12	111	343
-20	5	4
-13	1	1
-2240	1980	60
-2381	1	3
-44	1	0
-37	0	1
-24	100	79
-2445	100	136
-5050	0	1
-8804	4	0
-4444	704	262
-34	2	2
-12610	100	395
-4803	1	1
-22	1	1
-4171	128	46
-569	0	1
-2902	29308	112180
-236	1	0
-659	1	0
-711	1	0
-104	0	6764
-3212	4	2485
-1198	1	0
-8224	110	1
-4	0	1
-8	0	1
-21	0	1
-23	4	4
-5939	0	1
-182	101	1162
-2127	1	0
-28	100	77
-5048	2	0
-2345	1	0
-3616	100	211
-11	10	11
-1378	0	44
-1405	0	1
-1238	0	1
-575	0	20
-9423	100	122
-20	1	1
-7723	0	1
-431	0	1
-181	2	0
-5386	16	0
-866	105	61
-1365	0	1
-11613	318206	1966
-13	1	2
-40	1	1
-781	0	2
-5976	121	213
-3371	0	1
-693	1	0
-169	2337	746790
-586	1	0
-2072	1	1
-34	1	1
-58	13	13
-211	1	1
-28	1	1
-332	1	1
-31	1	1
-179	11	0
-2785	0	5
-1418	1	0
-12774	0	1
-3561	1	0
-4305	1	1
-120	1	1
-377	1	1
-68	1	1
-208	9	9
-998	15	15
-2146	0	1
-693	101	90
-36	1	1
-1743	1	1
-18	1	1
-2412	15	15
-1943	29	30
-3136	0	3
-12327	3	4
-2517
-
-chain 4126434 chrX_random 1719168 + 1485975 1530227 chrX 155270560 + 76291305 76335950 725
-1188	0	2
-717	1	1
-34	1	1
-1032	1	1
-42	1	1
-974	1	0
-5479	16	16
-2476	1	1
-35	1	1
-1212	3	0
-152	1	1
-46	1	1
-77	7	6
-912	1	1
-38	1	1
-4230	17	17
-617	146	545
-27	3	3
-374	1	1
-18	1	1
-3639	1	1
-122	1	1
-435	4	4
-1916	16	16
-2739	1	0
-622	16	16
-6383	2	0
-2520	35	35
-5915
-
-chain 3853214 chrX_random 1719168 + 170863 1715347 chrX 155270560 - 151357158 154150181 220
-101	0	61
-11	0	2
-38	0	155
-54	0	1
-34100	0	1
-12001	158233	27287
-105	0	1
-847	4191	3311
-101	25049	633
-4294	18781	8391
-120	26	27
-1173	0	1
-2374	87	87
-206	41	40
-40	7493	0
-1552	0	1
-194	0	1
-6613	4	3
-492	13807	11516
-2651	0	2
-1724	0	2
-2453	0	1
-3866	165	10497
-2912	8	0
-2305	93	94
-6287	1	0
-3225	7	7
-393	1	1
-18	1	1
-298	495	25877
-271	0	138
-31886	6	0
-14613	3	0
-9199	1105799	2318225
-448	0	73
-215	36	2
-248	14	15
-1012	1	0
-110	1	1
-211	15	16
-87	3	0
-268	10	6
-108	12	12
-74	1	1
-27	1	1
-178	1	1
-18	1	1
-1429	0	10
-168	1	1
-36	1	1
-64	1	1
-62	0	1
-129	2	0
-80	13	10
-11	3	0
-19	823	1702
-36	1	0
-605	17	17
-193	1	0
-215	12	13
-271	1	1
-18	1	1
-91	1	0
-178	4	4
-39	1	1
-233	1	1
-31	1	1
-500	1	1
-68	1	1
-325	9	9
-244	0	1
-843	1	1
-46	1	1
-202	0	1
-957	0	1
-150	1	1
-81	1	0
-6	1	1
-303	8540	16182
-59	4	0
-415	4	7
-127	38	38
-333	0	44
-16	0	252
-226	27	26
-64	4	0
-91	0	4
-56	32	32
-977	0	16
-701	1	1
-29	1	1
-1743	1	0
-676	0	2
-2780	0	16
-85	0	11
-22	1	1
-952	3	0
-470	1	0
-840	4	0
-146	0	4
-131	0	34
-39	4	0
-99	1	1
-26	0	4
-80	1	1
-1476	0	13
-977	0	2
-480	0	800
-1133	4	5
-532	1	1
-37	1	1
-207	0	117633
-2070	1	1
-30	2	0
-524	2	0
-484	0	1
-446	1	0
-1642	2	0
-63	1	1
-43	1	1
-148	12	12
-2115	0	1
-116	1	1
-182	10	10
-88	1	1
-65	0	320
-107	0	2
-2083	295	0
-1170	10932	59997
-1792	0	1
-292	6	7
-677	8	11
-1932
-
-chain 2670012 chrX_random 1719168 + 22277 129533 chrX 155270560 - 151420019 151525192 697
-318	0	8
-1212	7792	0
-1334	4590	634
-3132	4549	4298
-403	12	12
-889	7	7
-393	20	20
-2070	17932	14002
-179	0	1
-1042	0	1
-4330	476	475
-66	0	1
-1653	797	0
-2278	8	0
-5943	18846	26826
-69	77	81
-86	822	824
-287	1	0
-7796	1771	9789
-1118	1349	0
-2572	2	0
-4177	1	0
-2904	5	0
-881	1	1
-56	6	0
-590	1	1
-23	1	1
-262	6	6
-349	1	1
-55	1	1
-208	16	16
-311	0	2
-260	1	0
-34	5	5
-394	54	54
-206	27	27
-199
-
-chain 2529127 chrX_random 1719168 + 1458959 1485875 chrX 155270560 + 77160344 77187173 1079
-634	0	1
-9184	1	0
-59	1	0
-14	100	16
-21	1	0
-53	2	2
-11087	2	0
-2487	0	2
-2602	1	0
-667
-
-chain 902700 chrX_random 1719168 + 269161 291745 chrY 59373566 - 58967799 59197152 4215
-4053	3	0
-293	1	1
-26	0	1
-791	0	165863
-51	243	5
-66	134	1
-42	388	5
-141	0	15
-35	2	2
-42	361	0
-256	1	0
-341	3	36
-453	301	1
-147	0	1
-278	4	4
-15	0	3
-29	1	1
-122	2	0
-148	430	0
-222	151	0
-55	0	2
-149	1	0
-687	6309	50121
-61	1	1
-43	1	1
-408	80	0
-147	11	11
-228	1	1
-48	2	2
-1372	1	1
-31	1	1
-75	1	1
-28	97	0
-263	0	1
-495	98	1
-51	1	33
-52	1	1
-51	33	1
-226	1	1
-20	4	0
-211	340	0
-179	1	0
-10	1	1
-236	341	1
-555
-
-chain 569801 chrX_random 1719168 + 1106858 1112877 chrX 155270560 - 78234537 78240560 9279
-4787	0	4
-1232
-
-chain 569444 chrX_random 1719168 + 1452563 1458801 chrX 155270560 - 78136578 78142679 9342
-609	3	13
-1692	0	8
-1539	155	0
-30	3	3
-254	9	9
-1944
-
-chain 534458 chrX_random 1719168 + 90245 170863 chrX 155270560 - 151402385 151465977 943
-12303	69	69
-77	86	86
-822	66146	49119
-57	3	4
-1055
-
-chain 494413 chrX_random 1719168 + 391508 439759 chrX 155270560 - 151446976 151536655 1213
-50	57	60
-3938	36909	78166
-87	206	206
-41	40	40
-6143	240	408
-340	6	6
-194
-
-chain 379298 chrX_random 1719168 + 415243 419212 chrX 155270560 - 151507548 151511517 135808
-663	12	12
-3294
-
-chain 372919 chrX_random 1719168 + 1663885 1667930 chrX 155270560 - 153907181 153911269 141765
-802	0	3
-83	1	1
-47	1	1
-767	17	17
-1585	0	73
-215	36	2
-248	14	15
-229
-
-chain 274258 chrX_random 1719168 + 1667930 1671196 chrX 155270560 - 154066175 154070218 305212
-2034	1	281
-24	1	1
-190	0	200
-632	326	623
-58
-
-chain 267510 chrX_random 1719168 + 422339 428025 chrX 155270560 - 151460048 151465730 1055
-1034	4	3
-2317	3	0
-2328
-
-chain 266050 chrX_random 1719168 + 27992 75212 chrX 155270560 - 151430977 151495459 1091
-2648	315	25719
-644	9056	5097
-1296	30530	26348
-164	1	0
-310	1720	1720
-536
-
-chain 247472 chrX_random 1719168 + 49544 52383 chrX 155270560 + 3800594 3803433 7089
-2766	6	6
-67
-
-chain 247318 chrX_random 1719168 + 58807 462399 chrX 155270560 + 3743706 3828677 987
-48	658	658
-44	238	238
-102	246	246
-37	488	488
-27	206	206
-54	394	394
-39	797	797
-57	617	617
-134	287931	26427
-60	1338	0
-1419	8746	13247
-2214	50	50
-51	31242	578
-263	4	4
-5180	1349	0
-1121	24105	7962
-467	20820	8687
-32	2	2
-3992	2	0
-898	48	49
-92	22	22
-544	44	42
-175	0	1
-63	102	104
-246	37	37
-203	6	5
-279	27	27
-206	54	54
-394	39	40
-260	2	0
-311	16	16
-208	57	57
-349	6	6
-262	25	25
-590	57	63
-881	1017	1022
-1498
-
-chain 203629 chrX_random 1719168 + 419791 421950 chrX 155270560 - 151464996 151467156 582605
-2107	0	1
-52
-
-chain 199106 chrX_random 1719168 + 1699808 1701947 chrX 155270560 - 153935858 153937997 603481
-61	1	1
-57	1	1
-1588	4	4
-59	7	7
-361
-
-chain 199089 chrX_random 1719168 + 378452 380544 chrX 155270560 + 3796616 3798707 602253
-1586	1	0
-505
-
-chain 187776 chrX_random 1719168 + 376353 378301 chrX 155270560 + 3798256 3800203 654951
-729	1	0
-1218
-
-chain 174234 chrX_random 1719168 + 1285969 1288372 chrX 155270560 + 77019422 77021825 343560
-1763	87	87
-102	124	124
-70	56	56
-201
-
-chain 157788 chrX_random 1719168 + 111815 113457 chrX 155270560 + 3753462 3755104 810742
-1642
-
-chain 154415 chrX_random 1719168 + 1055747 1057376 chrX 155270560 + 77369279 77370908 822932
-1629
-
-chain 134293 chrX_random 1719168 + 1708912 1710376 chrX 155270560 + 1185231 1187137 959481
-129	1	1
-82	1	1
-350	2	297
-68	0	147
-831
-
-chain 132265 chrX_random 1719168 + 403961 405553 chrX 155270560 - 151477034 151478628 31377
-436	0	2
-1156
-
-chain 90853 chrX_random 1719168 + 1707707 1708693 chrX 155270560 + 1353464 1354449 1404000
-164	1	0
-46	1	1
-620	1	1
-37	1	1
-115
-
-chain 74037 chrX_random 1719168 + 267762 268693 chrY 59373566 - 59139189 59140054 1710353
-79	97	0
-220	1	0
-317	27	60
-128	1	0
-61
-
-chain 63811 chrX_random 1719168 + 410390 415127 chrX 155270560 + 3822705 3827447 11885
-2487	0	6
-1981	48	47
-221
-
-chain 61116 chrX_random 1719168 + 346359 347004 chrX 155270560 + 3777922 3778567 2069731
-645
-
-chain 55813 chrX_random 1719168 + 2787 3496 chrX 155270560 - 151499719 151505905 2274078
-50	6	6
-412	0	5477
-241
-
-chain 38577 chrX_random 1719168 + 1651263 1651671 chrX 155270560 - 153943757 153944164 3434500
-271	1	0
-136
-
-chain 34659 chrX_random 1719168 + 1707297 1707664 chrX 155270560 + 1118849 1119216 3901406
-367
-
-chain 33830 chrX_random 1719168 + 267400 267758 chrX 155270560 - 154819600 154819959 4017435
-54	0	1
-304
-
-chain 33594 chrX_random 1719168 + 347004 347356 chrX 155270560 - 151523309 151523661 4010211
-352
-
-chain 33500 chrX_random 1719168 + 290273 291150 chrX 155270560 - 155043354 155044230 1935940
-149	427	427
-91	1	0
-137	17	17
-55
-
-chain 33229 chrX_random 1719168 + 1452213 1452563 chrX 155270560 - 78136229 78136579 3954656
-350
-
-chain 31748 chrX_random 1719168 + 1656832 1657169 chrX 155270560 - 154080972 154081310 4345014
-118	0	1
-219
-
-chain 31047 chrX_random 1719168 + 364702 460901 chrX 155270560 + 3752840 3788747 1318
-48	54	53
-80	31133	470
-26	58237	28604
-46	660	660
-40	242	241
-78	0	2
-22	248	248
-33	492	491
-25	208	208
-52	400	400
-34	798	798
-56	1232	1232
-21	1	1
-34	882	887
-1017
-
-chain 26366 chrX_random 1719168 + 1717468 1717765 chrX 155270560 - 154599490 154599787 6355797
-65	8	8
-224
-
-chain 20775 chrX_random 1719168 + 1657225 1657446 chrY 59373566 + 1138227 1138450 9855403
-101	0	2
-120
-
-chain 20767 chrX_random 1719168 + 4453 4700 chrX 155270560 - 151332163 151332410 9860775
-174	10	10
-63
-
-chain 20271 chrX_random 1719168 + 1698243 1698467 chrX 155270560 - 154161726 154161950 2868
-224
-
-chain 20189 chrX_random 1719168 + 22064 22277 chrX 155270560 + 3752676 3752889 10232162
-213
-
-chain 20092 chrX_random 1719168 + 410218 414905 chrX 155270560 + 3784106 3788794 77876
-172	4468	4469
-47
-
-chain 19894 chrX_random 1719168 + 365127 367414 chrX 155270560 + 3744796 3747084 92469
-246	37	37
-203	5	6
-279	27	27
-206	54	54
-394	41	39
-260	0	2
-535
-
-chain 19881 chrX_random 1719168 + 217168 217385 chrX 155270560 + 3913712 3913929 10410664
-217
-
-chain 19372 chrX_random 1719168 + 1704190 1704597 chr2 243199373 + 106598364 106598785 10983407
-91	100	114
-81	74	74
-61
-
-chain 17351 chrX_random 1719168 + 365104 366619 chrX 155270560 + 3783188 3784703 560009
-23	246	246
-37	487	487
-27	206	206
-54	394	394
-41
-
-chain 16176 chrX_random 1719168 + 3557 21469 chrX 155270560 + 3768043 3793719 20345
-896	16406	24170
-326	33	33
-130	29	29
-92
-
-chain 15865 chrX_random 1719168 + 276938 277188 chrY 59373566 - 59140528 59140772 2014767
-82	6	0
-162
-
-chain 15331 chrX_random 1719168 + 367414 367617 chrX 155270560 + 3823924 3824127 647220
-203
-
-chain 13713 chrX_random 1719168 + 489399 489544 chrX 155270560 + 3712149 3712294 16431967
-145
-
-chain 12918 chrX_random 1719168 + 274951 275159 chrY 59373566 - 59139058 59139278 8720139
-52	0	12
-156
-
-chain 12632 chrX_random 1719168 + 1705530 1705970 chrX 155270560 + 145057484 145057926 18056495
-78	288	290
-74
-
-chain 12447 chrX_random 1719168 + 1030429 1030575 chr5 180915260 - 168461964 168462110 18325086
-146
-
-chain 12016 chrX_random 1719168 + 1317064 1317191 chrX 155270560 + 77214259 77214386 18979178
-127
-
-chain 11687 chrX_random 1719168 + 278072 278210 chrX 155270560 - 154988343 154988492 4329206
-112	25	36
-1
-
-chain 11514 chrX_random 1719168 + 278210 278346 chrY 59373566 - 59141204 59141340 4138572
-136
-
-chain 10224 chrX_random 1719168 + 1704620 1704728 chr19 59128983 - 37939031 37939139 22329028
-108
-
-chain 10213 chrX_random 1719168 + 277934 278654 chrY 59373566 - 59141065 59141499 2702219
-138	514	228
-68
-
-chain 9983 chrX_random 1719168 + 290082 290229 chrX 155270560 - 155043503 155043650 2501552
-48	40	40
-59
-
-chain 9686 chrX_random 1719168 + 1671544 1671645 chrX 155270560 + 1359785 1359886 23561825
-101
-
-chain 8627 chrX_random 1719168 + 274506 274913 chrX 155270560 - 154985996 154986278 9490470
-54	20	20
-32	0	8
-10	242	109
-49
-
-chain 7400 chrX_random 1719168 + 1030281 1030397 chr9 141213431 + 129760930 129761046 27439238
-59	26	26
-31
-
-chain 7194 chrX_random 1719168 + 274704 274779 chrY 59373566 - 59139208 59139283 27842833
-75
-
-chain 7041 chrX_random 1719168 + 129047 129334 chrX 155270560 - 151486292 151486579 1717
-54	206	206
-27
-
-chain 6777 chrX_random 1719168 + 275159 275252 chrX 155270560 - 154986140 154986238 15049098
-1	37	42
-55
-
-chain 6125 chrX_random 1719168 + 479075 479168 chrX 155270560 - 151461082 151461175 898
-93
-
-chain 5720 chrX_random 1719168 + 1705205 1705283 chr3 198022430 - 36255828 36255906 21764861
-52	21	21
-5
-
-chain 5699 chrX_random 1719168 + 57777 57859 chrX 155270560 + 3747892 3747974 156364
-82
-
-chain 5684 chrX_random 1719168 + 275730 275789 chrX 155270560 - 154985991 154986050 31480070
-59
-
-chain 5671 chrX_random 1719168 + 278678 278737 chrX 155270560 - 154987944 154988003 7684992
-59
-
-chain 5648 chrX_random 1719168 + 288487 288546 chrY 59373566 - 59194675 59194734 31602153
-59
-
-chain 5292 chrX_random 1719168 + 1698467 1698538 chrX 155270560 - 154160180 154160251 1242775
-71
-
-chain 4986 chrX_random 1719168 + 1705613 1705672 chr7 159138663 + 43857891 43857950 19004666
-59
-
-chain 4456 chrX_random 1719168 + 1030620 1030666 chrX 155270560 + 76367481 76367527 34837220
-46
-
-chain 4200 chrX_random 1719168 + 65786 66804 chrX 155270560 + 3789104 3790122 1705
-1018
-
-chain 4147 chrX_random 1719168 + 1704281 1704341 chr4 191154276 - 52750556 52750615 11058024
-1	2	1
-57
-
-chain 4142 chrX_random 1719168 + 276887 276938 chrY 59373566 - 59140619 59140670 3855343
-51
-
-chain 3859 chrX_random 1719168 + 291150 291190 chrY 59373566 - 59196218 59196258 16097861
-40
-
-chain 3722 chrX_random 1719168 + 1703633 1706063 chr17 81195210 - 47362086 47364493 15646977
-109	441	439
-7	1805	1784
-68
-
-chain 3009 chrX_random 1719168 + 1705804 1705856 chrX 155270560 + 62632912 62632964 24180689
-52
-
-chain 2509 chrX_random 1719168 + 1708877 1708912 chrX 155270560 + 1109247 1109282 2078841
-35
-
-chain 2078 chrX_random 1719168 + 1706063 1706085 chr1 249250621 + 114909259 114909281 21967653
-22
-
-chain 1700 chrX_random 1719168 + 274379 274412 chrY 59373566 - 59139235 59139268 19436247
-33
-
-chain 990 chrX_random 1719168 + 1705283 1705342 chrX 155270560 + 119232530 119232589 19658805
-59
-
-chain 463 chrX_random 1719168 + 1703519 1703583 chrX 155270560 + 65440530 65440594 26501250
-64
-
-chain 2373402471 chrY 57772954 + 0 27228749 chrY 59373566 + 10000 28819361 24
-34821	50000	50000
-86563	30000	50000
-766173	50000	50000
-36556	50000	50000
-80121	90000	50000
-754004	100000	50000
-6846717	50000	50000
-276367	600000	50000
-813231	500000	3000000
-39401	400000	50000
-554624	100000	50000
-535761	1	0
-32919	1	0
-10	1	1
-12811	5	0
-18899	1	1
-121	5	4
-230478	1	0
-750	24	24
-14340	1	1
-43	1	1
-2095	1	0
-14635	9	0
-2781	1	0
-45022	6	5
-7151	1	0
-9343	0	628
-5417477	0	50006
-2175794	0	50000
-1481749	50000	50000
-4867933
-
-chain 46617811 chrY 57772954 + 57228749 57772954 chrY 59373566 + 58819361 59363566 80
-98295	50000	50000
-395910
-
diff --git a/src/test/resources/htsjdk/samtools/metrics/metricsOne.metrics b/src/test/resources/htsjdk/samtools/metrics/metricsOne.metrics
deleted file mode 100644
index 46c724e..0000000
--- a/src/test/resources/htsjdk/samtools/metrics/metricsOne.metrics
+++ /dev/null
@@ -1,13 +0,0 @@
-## htsjdk.samtools.metrics.StringHeader
-# picard.illumina.MarkIlluminaAdapters INPUT=testdata/picard/illumina/MarkIlluminaAdaptersTest/unevenReads.sam OUTPUT=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven5946421709712534555.sam METRICS=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven4591996041776878558.metrics    MIN_MATCH_BASES_SE=12 MIN_MATCH_BASES_PE=6 MAX_ERROR_RATE_SE=0.1 MAX_ERROR_RATE_PE=0.1 ADAPTERS=[INDEXED, DUAL_INDEXED, PAIRED_END] ADAPTER_TRUNCATION_LENGTH=30 PRUNE_ADAPTER_LIST_AFTER_THIS_MANY_ADAPT [...]
-## htsjdk.samtools.metrics.StringHeader
-# Started on: Mon Aug 24 13:31:51 EDT 2015
-
-## METRICS CLASS	htsjdk.samtools.metrics.MetricsFileTest$TestMetric
-STRING_PROP	DATE_PROP	SHORT_PROP	INTEGER_PROP	LONG_PROP	FLOAT_PROP	DOUBLE_PROP	ENUM_PROP	BOOLEAN_PROP	CHARACTER_PROP	SHORT_PRIMITIVE	INT_PRIMITIVE	LONG_PRIMITIVE	FLOAT_PRIMITIVE	DOUBLE_PRIMITIVE	BOOLEAN_PRIMITIVE	CHAR_PRIMITIVE
-Hello World	2008-12-31	123		9223372036854775807	456.789001	0.713487	Two	N	A	123	919834781	9223372034707292160	0.55694	0.229233	Y	B
-
-## HISTOGRAM	java.lang.Integer
-clipped_bases	read_count
-6	1
-7	1
diff --git a/src/test/resources/htsjdk/samtools/metrics/metricsOneCopy.metrics b/src/test/resources/htsjdk/samtools/metrics/metricsOneCopy.metrics
deleted file mode 100644
index 46c724e..0000000
--- a/src/test/resources/htsjdk/samtools/metrics/metricsOneCopy.metrics
+++ /dev/null
@@ -1,13 +0,0 @@
-## htsjdk.samtools.metrics.StringHeader
-# picard.illumina.MarkIlluminaAdapters INPUT=testdata/picard/illumina/MarkIlluminaAdaptersTest/unevenReads.sam OUTPUT=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven5946421709712534555.sam METRICS=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven4591996041776878558.metrics    MIN_MATCH_BASES_SE=12 MIN_MATCH_BASES_PE=6 MAX_ERROR_RATE_SE=0.1 MAX_ERROR_RATE_PE=0.1 ADAPTERS=[INDEXED, DUAL_INDEXED, PAIRED_END] ADAPTER_TRUNCATION_LENGTH=30 PRUNE_ADAPTER_LIST_AFTER_THIS_MANY_ADAPT [...]
-## htsjdk.samtools.metrics.StringHeader
-# Started on: Mon Aug 24 13:31:51 EDT 2015
-
-## METRICS CLASS	htsjdk.samtools.metrics.MetricsFileTest$TestMetric
-STRING_PROP	DATE_PROP	SHORT_PROP	INTEGER_PROP	LONG_PROP	FLOAT_PROP	DOUBLE_PROP	ENUM_PROP	BOOLEAN_PROP	CHARACTER_PROP	SHORT_PRIMITIVE	INT_PRIMITIVE	LONG_PRIMITIVE	FLOAT_PRIMITIVE	DOUBLE_PRIMITIVE	BOOLEAN_PRIMITIVE	CHAR_PRIMITIVE
-Hello World	2008-12-31	123		9223372036854775807	456.789001	0.713487	Two	N	A	123	919834781	9223372034707292160	0.55694	0.229233	Y	B
-
-## HISTOGRAM	java.lang.Integer
-clipped_bases	read_count
-6	1
-7	1
diff --git a/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedHistogram.metrics b/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedHistogram.metrics
deleted file mode 100644
index 3e6f088..0000000
--- a/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedHistogram.metrics
+++ /dev/null
@@ -1,14 +0,0 @@
-## htsjdk.samtools.metrics.StringHeader
-# picard.illumina.MarkIlluminaAdapters INPUT=testdata/picard/illumina/MarkIlluminaAdaptersTest/unevenReads.sam OUTPUT=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven5946421709712534555.sam METRICS=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven4591996041776878558.metrics    MIN_MATCH_BASES_SE=12 MIN_MATCH_BASES_PE=6 MAX_ERROR_RATE_SE=0.1 MAX_ERROR_RATE_PE=0.1 ADAPTERS=[INDEXED, DUAL_INDEXED, PAIRED_END] ADAPTER_TRUNCATION_LENGTH=30 PRUNE_ADAPTER_LIST_AFTER_THIS_MANY_ADAPT [...]
-## htsjdk.samtools.metrics.StringHeader
-# Started on: Mon Aug 24 13:31:51 EDT 2015
-
-## METRICS CLASS	htsjdk.samtools.metrics.MetricsFileTest$TestMetric
-STRING_PROP	DATE_PROP	SHORT_PROP	INTEGER_PROP	LONG_PROP	FLOAT_PROP	DOUBLE_PROP	ENUM_PROP	BOOLEAN_PROP	CHARACTER_PROP	SHORT_PRIMITIVE	INT_PRIMITIVE	LONG_PRIMITIVE	FLOAT_PRIMITIVE	DOUBLE_PRIMITIVE	BOOLEAN_PRIMITIVE	CHAR_PRIMITIVE
-Hello World	2008-12-31	123		9223372036854775807	456.789001	0.713487	Two	N	A	123	919834781	9223372034707292160	0.55694	0.229233	Y	B
-
-## HISTOGRAM	java.lang.Integer
-clipped_bases	read_count
-6	1
-7	1
-8	1
diff --git a/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedMetrics.metrics b/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedMetrics.metrics
deleted file mode 100644
index a4d23d8..0000000
--- a/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedMetrics.metrics
+++ /dev/null
@@ -1,13 +0,0 @@
-## htsjdk.samtools.metrics.StringHeader
-# picard.illumina.MarkIlluminaAdapters INPUT=testdata/picard/illumina/MarkIlluminaAdaptersTest/unevenReads.sam OUTPUT=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven5946421709712534555.sam METRICS=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven4591996041776878558.metrics    MIN_MATCH_BASES_SE=12 MIN_MATCH_BASES_PE=6 MAX_ERROR_RATE_SE=0.1 MAX_ERROR_RATE_PE=0.1 ADAPTERS=[INDEXED, DUAL_INDEXED, PAIRED_END] ADAPTER_TRUNCATION_LENGTH=30 PRUNE_ADAPTER_LIST_AFTER_THIS_MANY_ADAPT [...]
-## htsjdk.samtools.metrics.StringHeader
-# Started on: Mon Aug 24 13:31:51 EDT 2015
-
-## METRICS CLASS	htsjdk.samtools.metrics.MetricsFileTest$TestMetric
-STRING_PROP	DATE_PROP	SHORT_PROP	INTEGER_PROP	LONG_PROP	FLOAT_PROP	DOUBLE_PROP	ENUM_PROP	BOOLEAN_PROP	CHARACTER_PROP	SHORT_PRIMITIVE	INT_PRIMITIVE	LONG_PRIMITIVE	FLOAT_PRIMITIVE	DOUBLE_PRIMITIVE	BOOLEAN_PRIMITIVE	CHAR_PRIMITIVE
-Hello World	2008-12-31	122		9223372036854775807	456.789001	0.713487	Two	N	A	123	919834781	9223372034707292160	0.55694	0.229233	Y	B
-
-## HISTOGRAM	java.lang.Integer
-clipped_bases	read_count
-6	1
-7	1
diff --git a/src/test/resources/htsjdk/samtools/queryname_sorted.sam b/src/test/resources/htsjdk/samtools/queryname_sorted.sam
deleted file mode 100755
index 068e7bc..0000000
--- a/src/test/resources/htsjdk/samtools/queryname_sorted.sam
+++ /dev/null
@@ -1,15 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at RG	ID:0	SM:Hi,Mom!
-A	73	chr2	1	255	10M	*	0	0	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-A	133	*	0	0	*	chr2	1	0	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-B	99	chr1	1	255	10M	=	26	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-B	147	chr1	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-C	99	chr2	1	255	10M	=	26	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-C	147	chr2	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-D	99	chr3	1	255	10M	=	25	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-D	147	chr3	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-E	99	chr1	2	255	10M	=	15	30	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-E	147	chr1	15	255	10M	=	2	-30	CAACAGAAGC	)'.*.+2,))	RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/readWithBadRname.sam b/src/test/resources/htsjdk/samtools/readWithBadRname.sam
deleted file mode 100644
index 71bafb9..0000000
--- a/src/test/resources/htsjdk/samtools/readWithBadRname.sam
+++ /dev/null
@@ -1,6 +0,0 @@
- at HD	VN:1.0	SO:coordinate
- at SQ	SN:chr21 afterspace	AS:HG18	LN:62435964
- at RG	ID:L1	PU:SC_1_10	LB:SC_1	SM:NA12891	PL:ILLUMINA
- at RG	ID:L2	PU:SC_2_12	LB:SC_2	SM:NA12891	PL:ILLUMINA
-read_28833_29006_6945	99	=	28833	20	10M1D25M	=	28993	195	AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG	<<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<<	MF:i:130	Nm:i:1	H0:i:0	H1:i:0	RG:Z:L1
-read_28701_28881_323b	147	chr21 afterspace	28834	30	35M	=	28701	-168	ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA	<<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<<	MF:i:18	Nm:i:0	H0:i:1	H1:i:0	RG:Z:L2
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.fasta.fai b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.fasta.fai
deleted file mode 100644
index aa00476..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.fasta.fai
+++ /dev/null
@@ -1,45 +0,0 @@
-chrM	16571	6	50	51
-chr1	247249719	16915	50	51
-chr2	242951149	252211635	50	51
-chr3	199501827	500021813	50	51
-chr4	191273063	703513683	50	51
-chr5	180857866	898612214	50	51
-chr6	170899992	1083087244	50	51
-chr7	158821424	1257405242	50	51
-chr8	146274826	1419403101	50	51
-chr9	140273252	1568603430	50	51
-chr10	135374737	1711682155	50	51
-chr11	134452384	1849764394	50	51
-chr12	132349534	1986905833	50	51
-chr13	114142980	2121902365	50	51
-chr14	106368585	2238328212	50	51
-chr15	100338915	2346824176	50	51
-chr16	88827254	2449169877	50	51
-chr17	78774742	2539773684	50	51
-chr18	76117153	2620123928	50	51
-chr19	63811651	2697763432	50	51
-chr20	62435964	2762851324	50	51
-chr21	46944323	2826536015	50	51
-chr22	49691432	2874419232	50	51
-chrX	154913754	2925104499	50	51
-chrY	57772954	3083116535	50	51
-chr1_random	1663265	3142044962	50	51
-chr2_random	185571	3143741506	50	51
-chr3_random	749256	3143930802	50	51
-chr4_random	842648	3144695057	50	51
-chr5_random	143687	3145554571	50	51
-chr6_random	1875562	3145701145	50	51
-chr7_random	549659	3147614232	50	51
-chr8_random	943810	3148174898	50	51
-chr9_random	1146434	3149137598	50	51
-chr10_random	113275	3150306975	50	51
-chr11_random	215294	3150422530	50	51
-chr13_random	186858	3150642144	50	51
-chr15_random	784346	3150832754	50	51
-chr16_random	105485	3151632801	50	51
-chr17_random	2617613	3151740410	50	51
-chr18_random	4262	3154410390	50	51
-chr19_random	301858	3154414752	50	51
-chr21_random	1679693	3154722662	50	51
-chr22_random	257318	3156435963	50	51
-chrX_random	1719168	3156698441	50	51
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.dict b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.dict
deleted file mode 100644
index 8dd3e5b..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD	VN:1.0	SO:unsorted
- at SQ	SN:chrM	LN:16571	UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta	M5:d2ed829b8a1628d16cbeee88e88e39eb
- at SQ	SN:chr20	LN:1000000	UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta	M5:b4eac854d70893986ac578c53c2324f1
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta
deleted file mode 100644
index 9b75d10..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta
+++ /dev/null
@@ -1,16946 +0,0 @@
->chrM
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTT
-CGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTC
-GCAGTATCTGTCTTTGATTCCTGCCTCATTCTATTATTTATCGCACCTACGTTCAATATT
-ACAGGCGAACATACCTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATA
-ACAATTGAATGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCA
-AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGCCAAACCCCAA
-AAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAATTTTATCTTTAGGCGGTATGC
-ACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTA
-ATCTCATCAATACAACCCCCGCCCATCCTACCCAGCACACACACACCGCTGCTAACCCCA
-TACCCCGAACCAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCCTCA
-AAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGG
-TCCTAGCCTTTCTATTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGA
-GTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGC
-TCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAACCTTTAGCAAT
-AAACGAAAGTTTAACTAAGCTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACC
-GCGGTCACACGATTAACCCAAGTCAATAGAAGCCGGCGTAAAGAGTGTTTTAGATCACCC
-CCTCCCCAATAAAGCTAAAACTCACCTGAGTTGTAAAAAACTCCAGTTGACACAAAATAG
-ACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAACTGGGATTA
-GATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAG
-AACACTACGAGCCACAGCTTAAAACTCAAAGGACCTGGCGGTGCTTCATATCCCTCTAGA
-GGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATA
-TACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAA
-AGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCAAGAAATGGGCTACATTTTCTACCCC
-AGAAAACTACGATAGCCCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTG
-AGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCC
-TCAAGTATACTTCAAAGGACATTTAACTAAAACCCCTACGCATTTATATAGAGGAGACAA
-GTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACA
-CAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAAACC
-TAGCCCCAAACCCACTCCACCTTACTACCAGACAACCTTAGCCAAACCATTTACCCAAAT
-AAAGTATAGGCGATAGAAATTGAAACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGA
-TGAAAAATTATAACCAAGCATAATATAGCAAGGACTAACCCCTATACCTTCTGCATAATG
-AATTAACTAGAAATAACTTTGCAAGGAGAGCCAAAGCTAAGACCCCCGAAACCAGACGAG
-CTACCTAAGAACAGCTAAAAGAGCACACCCGTCTATGTAGCAAAATAGTGGGAAGATTTA
-TAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTT
-AGTTCAACTTTAAATTTGCCCACAGAACCCTCTAAATCCCCTTGTAAATTTAACTGTTAG
-TCCAAAGAGGAACAGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAAAATT
-TAACACCCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACC
-CACTACCTAAAAAATCCCAAACATATAACTGAACTCCTCACACCCAATTGGACCAATCTA
-TCACCCTATAGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAA
-GCCTGCGTCAGATCAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCA
-ACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAAGGAAAGGTTAA
-AAAAAGTAAAAGGAACTCGGCAAACCTTACCCCGCCTGTTTACCAAAAACATCACCTCTA
-GCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACC
-CTAACCGTGCAaaggtagcataatcacttgttccttaaatagggacctgtatgaatggct
-ccacgagggttcagctgtctcttacttttaaccagtgaaattgacctgcccgtgaagagg
-cgggcatgacacagcaagacgagaagaccctatggagctttaatttaTTAATGCAAACAG
-TACCTAACAAACCCACAGGTCCTAAACTACCAAACCTGCATTAAAAATTTCGGTTGGGGC
-GACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCG
-AACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAA
-CAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGAT
-CAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAACGATTAAAGTCCT
-ACGTGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTC
-CCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATG
-ATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTgttaagatgg
-cagagcccggtaatcgcataaaacttaaaactttacagtcagaggttcaattcctcttct
-taacaacaTACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGC
-ATTCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAA
-CGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCATAAAACTCTTCACCAA
-AGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGC
-TCTCACCATCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCT
-CAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTG
-ATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCA
-AACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGG
-CTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATC
-ATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTT
-CGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGG
-CCCCTTCGCCCTATTCTTCATAGCCGAATACACAAACATTATTATAATAAACACCCTCAC
-CACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTACACAACATA
-TTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCC
-CCGATTCCGCTACGACCAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCCT
-AGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCCCCCTCAAAC
-CTAAGAAATATGTCTGATAAAAGAGTTACTTTGATAGAGTAAATAATAGGAGCTTAAACC
-CCCTTATTTctaggactatgagaatcgaacccatccctgagaatccaaaattctccgtgc
-cacctatcacaccccatcctaAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCC
-GAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTAC
-TCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACCTGA
-GTAGGCCTAGAAATAAACATGCTAGCTTTTATTCCAGTTCTAACCAAAAAAATAAACCCT
-CGTTCCACAGAAGCTGCCATCAAGTATTTCCTCACGCAAGCAACCGCATCCATAATCCTT
-CTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGAACCATAACCAATACTACC
-AATCAATACTCATCATTAATAATCATAATGGCTATAGCAATAAAACTAGGAATAGCCCCC
-TTTCACTTCTGAGTCCCAGAGGTTACCCAAGGCACCCCTCTGACATCCGGCCTGCTTCTT
-CTCACATGACAAAAACTAGCCCCCATCTCAATCATATACCAAATCTCTCCCTCACTAAAC
-GTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGATTA
-AACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATA
-ATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATC
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTA
-TCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCC
-CTAGGAGGCCTGCCCCCGCTAACCGGCTTTTTGCCCAAATGGGCCATTATCGAAGAATTC
-ACAAAAAACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTC
-TACTTCTACCTACGCCTAATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAAC
-GTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATC
-GCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATACTAATAATCTTATAGAAATTT
-AGGTTAAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTG
-CAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTA
-ATTAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGC
-TAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCGGGA
-GAAGCCCCGGCAGGTTTGAAGCTGCTTCTTCGAATTTGCAATTCAATATGAAAATCACCT
-CGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTC
-AGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCAC
-AAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCT
-CTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCAC
-ATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCC
-ATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATG
-GCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTG
-CTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTA
-GCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTA
-GCAGGTGTCTCCTCTATCTTAGGGGCCATCAATTTCATCACAACAATTATCAATATAAAA
-CCCCCTGCCATAACCCAATACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATCACAGCA
-GTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGAC
-CGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGGAGACCCCATTCTATACCAA
-CACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATCCTACCAGGCTTCGGA
-ATAATCTCCCATATTGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGT
-ATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATA
-TTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATC
-GCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATG
-AAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGC
-CTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTAC
-GTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGC
-TTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATC
-CATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGC
-CTATCCGGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATC
-CTATCATCTGTAGGCTCATTCATTTCTCTAACAGCAGTAATATTAATAATTTTCATGATT
-TGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTG
-GAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGAAGAACCCGTATACATAAAA
-TCTAGACAaaaaaggaaggaatcgaaccccccaaagctggtttcaagccaaccccatggc
-ctccatgactttttcAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAA
-TTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACG
-CTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTT
-TCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTA
-ATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCA
-TCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACG
-ATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCG
-ACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCG
-ACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTA
-TAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAA
-CAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTAT
-ACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAG
-AATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATTTACCCTATAGCACCCCCTCT
-ACCCCCTCTAGAGCCCACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAA
-GAGAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCA
-TAATTACCCCCATACTCCTTACACTATTCCTCATCACCCAACTAAAAATATTAAACACAA
-ACTACCACCTACCTCCCTCACCAAAGCCCATAAAAATAAAAAATTATAACAAACCCTGAG
-AACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACC
-CGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCAT
-CAACAACCGACTAATCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGAT
-AGCCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTT
-TATTGCCACAACTAACCTCCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACT
-ATCTATAAACCTAGCCATGGCCATCCCCTTATGAGCGGGCGCAGTGATTATAGGCTTTCG
-CTCTAAGATTAAAAATGCCCTAGCCCACTTCTTACCACAAGGCACACCTACACCCCTTAT
-CCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGT
-ACGCCTAACCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCAC
-CCTAGCAATATCAACCATTAACCTTCCCTCTACACTTATCATCTTCACAATTCTAATTCT
-ACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGT
-AAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTA
-AAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTA
-GCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACA
-CTAACCATATACCAATGGTGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCAC
-ACACCACCTGTCCAAAAAGGCCTTCGATACGGGATAATCCTATTTATTACCTCAGAAGTT
-TTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAA
-CTAGGAGGGCACTGGCCCCCAACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTC
-CTAAACACATCCGTATTACTCGCATCAGGAGTATCAATCACCTGAGCTCACCATAGTCTA
-ATAGAAAACAACCGAAACCAAATAATTCAAGCACTGCTTATTACAATTTTACTGGGTCTC
-TATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGC
-ATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGC
-TCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACAT
-CACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTTTGACTATTT
-CTGTATGTCTCCATCTATTGATGAGGGTCTTACTCTTTTAGTATAAATAGTACCGTTAAC
-TTCCAATTAACTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCCTTAATTTTA
-ATAATCAACACCCTCCTAGCCTTACTACTAATAATTATTACATTTTGACTACCACAACTC
-AACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCC
-CGCGTCCCTTTCTCCATAAAATTCTTCTTAGTAGCTATTACCTTCTTATTATTTGATCTA
-GAAATTGCCCTCCTTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATA
-GTTATGTCATCCCTCTTATTAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTA
-CAAAAAGGATTAGACTGAGCCGAATTGGTATATAGTTTAAACAAAACGAATGATTTCGAC
-TCATTAAATTATGATAATCATATTTACCAAATGCCCCTCATTTACATAAATATTATACTA
-GCATTTACCATCTCACTTCTAGGAATACTAGTATATCGCTCACACCTCATATCCTCCCTA
-CTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAAC
-ACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAA
-GCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTA
-CATAACCTAAACCTACTCCAATGCTAAAACTAATCGTCCCAACAATTATATTACTACCAC
-TGACATGACTTTCCAAAAAGCACATAATTTGAATCAACACAACCACCCACAGCCTAATTA
-TTAGCATCATCCCCCTACTATTTTTTAACCAAATCAACAACAACCTATTTAGCTGTTCCC
-CAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTACCTGACTCCTAC
-CCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGCGAACCACTATCACGAAAAAAAC
-TCTACCTCTCTATACTAATCTCCCTACAAATCTCCTTAATTATAACATTCACAGCCACAG
-AACTAATCATATTTTATATCTTCTTCGAAACCACACTTATCCCCACCTTGGCTATCATCA
-CCCGATGAGGCAACCAGCCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCC
-TAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCAC
-TAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACT
-TAATATGACTAGCTTACACAATAGCTTTTATAGTAAAGATACCTCTTTACGGACTCCACT
-TATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAG
-TACTCTTAAAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGA
-CAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATAACAAGCT
-CCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACA
-TAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCA
-TTCTCATAATCGCCCACGGACTCACATCCTCATTACTATTCTGCCTAGCAAACTCAAACT
-ACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCAC
-TAATAGCTTTTTGATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTA
-ACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCC
-TACTTACAGGACTCAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAA
-CACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAA
-ACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCA
-TTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAACATCAGATTGTGAATCTGACA
-ACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCC
-CCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATTGGTCTTA
-GGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCACACTACTATAAC
-CACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTTAACCCTAACAA
-AAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCT
-CTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTG
-AGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACTACTTCTCCATAAT
-ATTCATCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATAT
-AAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATTTTCCTAATTACCAT
-ACTAATCTTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGG
-AATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGC
-CATTCAAGCAGTCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCTTAGCATG
-ATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCC
-AAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGG
-TCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCA
-CTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGA
-AAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGC
-AGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAG
-TCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCA
-CATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCA
-CAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCT
-CACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGG
-TTTCTACTCCAAAGACCACATCATCGAAACCGCAAACATATCATACACAAACGCCTGAGC
-CCTATCTATTACTCTCATCGCTACCTCCCTGACAAGCGCCTATAGCACTCGAATAATTCT
-TCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACATTAACGAAAATAACCC
-CACCCTACTAAACCCCATTAAACGCCTGGCAGCCGGAAGCCTATTCGCAGGATTTCTCAT
-TACTAACAACATTTCCCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACT
-CACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTAAC
-CAACAAACTTAAAATAAAATCCCCACTATGCACATTTTATTTCTCCAACATACTCGGATT
-CTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCT
-GCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACA
-GCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTT
-CCTCTCTTTCTTCTTCCCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCC
-GAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACCACTACTA
-ATCAACGCCCATAATCATACAAAGCCCCCGCACCAATAGGATCCTCCCGAATCAACCCTG
-ACCCCTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCA
-CCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAA
-CACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCCATCG
-CTGTAGTATATCCAAAGACAACCATCATTCCCCCTAAATAAATTAAAAAAACTATTAAAC
-CCATATAACCTCCCCCAAAATTCAGAATAATAACACACCCGACCACACCGCTAACAATCA
-GTACTAAACCCCCATAAATAGGAGAAGGCTTAGAAGAAAACCCCACAAACCCCATTACTA
-AACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGA
-CCAATGATATGAAAAACCATCGTTGTATTTCAACTACAAGAACACCAATGACCCCAATAC
-GCAAAATTAACCCCCTAATAAAATTAATTAACCACTCATTCATCGACCTCCCCACCCCAT
-CCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAA
-TCACCACAGGACTATTCCTAGCCATACACTACTCACCAGACGCCTCAACCGCCTTTTCAT
-CAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCA
-ATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACG
-GATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAG
-CAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAG
-TAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCT
-GAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCT
-TACCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACGGGAT
-CAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACA
-CAATCAAAGACGCCCTCGGCTTACTTCTCTTCCTTCTCTCCTTAATGACATTAACACTAT
-TCTCACCAGACCTCCTAGGCGACCCAGACAATTATACCCTAGCCAACCCCTTAAACACCC
-CTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGATCCGTCC
-CTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCC
-CCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTT
-ATTGACTCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCT
-ACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCC
-TAATACCAACTATCTCCCTAATTGAAAACAAAATACTCAAATGGGCCTGTCCTTGTAGTA
-TAAACTAATACACCAGTCTTGTAAACCGGAGACGAAAACCTTTTTCCAAGGACAAATCAG
-AGAAAAAGTCTTTAACTCCACCATTAGCACCCAAAGCTAAGATTCTAATTTAAACTATTC
-TCTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAAC
-AACCGCTATGTATTTCGTACATTACTGCCAGCCACCATGAATATTGTACGGTACCATAAA
-TACTTGACCACCTGTAGTACATAAAAACCCAACCCACATCAAACCCCCCCCCCCCATGCT
-TACAAGCAAGTACAGCAATCAACCTTCAACTATCACACATCAACTGCAACTCCAAAGCCA
-CCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAA
-GTCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCC
-CCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTG
-CTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGAC
-ATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATAAG
-ACATCACGATG
->chr20
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNGATCCAgaggtggaagaggaaggaagcttggaaccctata
-gagttgctgagtgccaggaccagatcctggccctaaacaggtggtaaggaaggagagagt
-gaaggaactgccaggtgacacactcccaccatggacctctgggatcctagctttaagaga
-tcccatcacccacatgaacgtttgaattgacagggggagctgcctggagagtaggcagat
-gcagagctcaagcctgtgcagagcccaggttttgtgagtgggacagttgcagcaaaacac
-aaccataggtgcccatccaccaaggcaggctctccatcttgctcagagtggctctagccc
-ttgctgactgctgggcagggagagagcagagctaacttcctcatgggacctgggtgtgtc
-tgatctgtgcacaccactatccaaccgatcccgaggctccaccctggccactcttgtgtg
-cacacagcacagcctctactgctacacctgagtactttgccagtggcctggaagcacttt
-gtcccccctggcacaaatggtgctggaccacgaggggccagagaacaaagccttgggcgt
-ggtcccaactcccaaatgtttgaacacacaagttggaatattgggctgagatctgtggcc
-agggcctgagtaggggagaagctcccactctcagaacactgagaaaagtgaggcatgggt
-ttctgggctggtacaggagctcgatgtgcttctctctacaagactggtgagggaaaggtg
-taacctgtttgtcagccacaacatcttcctaagggagccttgtgtccgggaaaaactgac
-agaccagtgatctgggtgcagaaggcttgagacaaaactagctggttgggccagctatgg
-ggcaaatgctggaaagaaacctggtcagggagcctgagctgagtggtccccacagtcatc
-tgcttggcaagaaaccctaggtcgcaggtgctagaccagctgcacacccacagcaacact
-gccatgcccaggatcctctgcccttgatcctgaatcaacagaccacttgcagatatactt
-cacagcccacgctgactctgccaagcacagacaaccactgggccccaggggagctgcagg
-tctcctggtcacctaatcttttttttttttatactttaagttttggggtacatgtgcaca
-acgtgcaggttacatatgtatacatgtgccatgttcatgtgctgcacccattaactcgtc
-atttaacattaggtatatctcctaatgctatccctcccccctccccccaccccacaacag
-gccctggtgccatggaatactatgcagccataaaaaatgatgagttcatgccctttgcag
-ggacatggatgaagctggaaaccatcattctcagcaaactatcaaactatcacaaggaca
-aaaaaccaaacactgcatgttttcactcataggtgggaattgaataatgagaacacatgg
-acacaggaaggggaacatcacacatcgggacctaatcttaagctaagtgtggctaagagc
-ctatctgctggcctttactattaagcactgcccactggattgcagcctgaattacaccgc
-caaacaaatactgtttcagcatacattaccagtgaaacccaatgcaggaacatagtcaaa
-aataaacacctggcatagagacttggccctctgaaaacacccagaaaaaagccagctata
-ttcaacatacatcactgtcaaaatatcaaggaaaatgaagaagaataaaacaaaaagtca
-aaaccaaatgataggaacttcaaaaagataaagtaacaccagctgtcttagatgagaaag
-aatcagcacacattcttgcaattcaaaaagtcagaatgtctccttacctccaaacaatca
-tactagctctcatcagattgaaatggctgaaatgacagacatagaattcatgatctggaa
-ggtaaggaagctcaagaacattcaggagaaagttgaaacccagtccaaggaagccagtaa
-agcaatccaagagtacagagataacatagccattttaagaaagaaccaaaagaaacttct
-gcaattgacaaattcattataggaattttgtaatacattcagaagcattaacaacagaat
-agatcaagttgaggaaagaatctcagagctcaaagatcagtcctttgaatcaacacagtc
-agacaaaactaaagaaaaaaatttaaaaataaaacctctaaaaaaatatggaattatgta
-aagataccaaacttacaacttatgggcattcctgaaagaggagaaagaataagtaacttg
-gaaaacatatttgaggatagtccatgaaaatttccccaatctccctagagaggctgacat
-gcaaattcaagaaatgcaaataacccctgtgagataactacaagataactatccccaaga
-cacatagtcataagattctccaaggtcaacgtgaaagaaaaaaatcttaagggcagctag
-agaaaagcctgaggtcacttatgaagggaagctcatcagactaacagcagacttctcagc
-agaaaccttacaaaccaagcaagattaggggcctatttttagcatccttaaagaaaagaa
-atttcagtgaagaattccatatcctgcaaaactaagcttcataaaagaaggagaaatagg
-ctgggcatggtggctcacacctgtaataccagcattttgggaggctcaggcaggaggatt
-gcttgagctcaagagtttgagaccagcctgggcaacatggcaaaaccctgtctcttctaa
-aaatacaaaaattacctgggcAAGACTCCATCACAAACAAACTAACAAACCAAAActatc
-aggtactatgctcactacctgggtgacaaaatcatttttacaccaaacccagtgacaagc
-aatttacccatgtaacaaacctgcatgtgtatcccctgaacctaaaataaaagttaaaaa
-aaaaagaaCTTTCATCAACatttcttgcagtgaaggtatgttagtgatgaacattctctg
-cttttattgcctgaaaatatctttattttgtattcatatttgacatatattctcactggg
-cataaaaattctaaattacaagtttttccccttttttgtattaaaaatttcattccaata
-tcttTCATATTGCCTTATTTGTAATGATGCCTTCTATCCTTCTTATCTTTGTTCCATTTA
-TAAGAAGTGTTCCCCAACCCCAGACTGATTAAAACCATTTTTTTAATTAAAAAAGCAAAA
-GAAAGAAACATTTTTATCTGAAGCTGTCTCAGACTCAGACACCACCCAATCTTCAGATTT
-CAAATAGCTTATACTCAAACATTTGGTAATATCAGCCCCTTAATGGTCTTCCTGGAGGGC
-AGATGCATTCTAGAGATGAGAACACGATCATGATTACGAATGCTACCACCACTACGAACG
-CACAAAAGTCACTGGTGTGATCCTTTCTCAGAACACTGTGGTAACTTCTGGACATTCTCT
-GCTGTTATCATTGCTTCTTCCTTCTGGGTTTTTTTCCCCCTTATATGGGCAGATAATTTT
-CTCCATTGGAATGAAAAAGTCTTGCTTCATGCTCTTtaactgtgtgaccttgggcgtatt
-actttactttggggcaaaccattttccttcttgaggaccaaatgtgctcttttataaaac
-gagcagttagaattagattgtctctctggacacggcttatgttgacaacctggatcacAT
-TAGAGGATCAcactgagacctttatgtcggcctcagttcctccatctgtaaagtagaggt
-tgggcttagattatAGATGATAAAGACACCAACTTTCctggaaaggattctggaaaggat
-tctgAACTTAGGCTCAGCCTCAGTAAGAAGGAGTTCTGTGATTAAACAGGGATGCCCACA
-CATCAGCAACAGAAATGGGCAGGTCAACCATGTATGCTGTGCCTCAGTGAAGATTTTATG
-CTATGCTGTGCATTTGATATCCATTCTCTATATTTGATATCCAATCTAAGATTATCTAGA
-AGGTCCTTTCCAAGACACTGATGAGATACATCTGTATAAATATATAACTCAGGATGAAAG
-CAACTTTTAACATTTAGCGTGTGCCTCTGCCTCTGATCTGATTACAGCCCACAGAGAAAT
-ATAAACAATACACAATACAGGCTAATGAAGAAGGGTGATAAGAtttttttttttttttga
-gacggaatttcactcttgtcacccaggctggagtgcaatggtgcaatcttggctcactgc
-aaccttcgcctcccggttcaagcgattctcctgcctcagcctcctgagtagatgggattg
-gaggtgcccaccaccacgcccggctaatttttgtattttttagtagagacagggtttcac
-catgttgtccacgctggtctcgaactcctgacctcaggtgatccgccagcctcagcctcc
-caaagtgctaggattacaggtgtgagccactgcaaccggccAAGGGTGATAAGattttaa
-aaatttatttaaaataCAGAAATTTCAAAAAGAGAGAAGTGCAGTGATAGCAAAATTGAT
-GCAAACTGTGCAAGCATGAAATCTATTTTATAGCTGAATCTACTTTTCTTGGTCCCAAGA
-TTCTATTTCCATTGGTTTTCAAATAGTTAATTCTATTGTTTTTTCAGGGAGATTACTAAA
-ATCACTAATAATTATTTTCCTACTGACACAAAATCTAAAAAGCACCATATAGACCTTCTC
-TCTCCATCTCCCCTTATCCTTATGTCACCTTACCCTACCCCAATACTCCAATGGCAGAGT
-ATCTACCCATGGCAGAGTAGAGAATATGTACACTAACAAAACCAGATGCACAGAGGTGGG
-GTATCCATCTCTGACTTGGCTGAGCTAGTCTAAGGAAGGAAGGCTCTGTGGCCATTGTCC
-TTGGAAGTCATTCTCACAGGTTGGTGGTATTCTCAAGTAGGTGGTGCTTGAGTGGCCCAA
-GAGCACCCACATGCTGCTATGCATTTTTCTGACAACCTCTTTATGATCTCTGACTTTGGC
-AGATCATCTTGCATCTCTCAATTGGAGAGTCACTTTTCTTATCTCCACAGAAAATTCTTA
-ATCAAGCTCCTGGTTTTCCTTTATAGCTTCTACTTTTTAAACTCACTTCTCCAACTTCAC
-CGCTACATCTCTGACAGATGAGAACATTAGAGATTCCCTGTTTTTCAAAAACAAAACAAA
-ACTCAGCAAAACTATAAATATACTAAGGGTAAGTCTGTATTATCTCCTGCCAAAATACAC
-CACCCTGCATTTTTTTAAATttttatcttttgtaggtacatagtaggtgtctatatttgt
-ggggtacatgagatgttttgatacaagcatgcaatgcataataaccacatcatggaaaat
-ggggtatccatcccctcaagcatttatcctttgtgttacaaattatctaattatacttta
-ttattttaaaatgtacaattaaattatttttgactatagtcacctcgttatgctattaaa
-taccaggtcttattcattctttctaactattttttgtacccagtaaccatcctcaccttc
-ccacacacgcccaccacctttcccagcctctgataaccatccttctactctctatctccc
-ttgaattcagtagttttgatttttagatttcacaaataagtgagaacatgcaatatttgt
-ctttatgttcctggcttatttcacttagcataatggcctccagttccatccatgttattg
-caaatgacagcatctctttcttttttatggctgaataatactccactgtgtataagttcc
-acattttctttatccactcatttgttgattgacacttacgttgcttctaaatcttggcta
-ttgtgaatagtgctgcaacaagcacaggtgtgcagatatctattcaatattcttatttcc
-ttttggaggggagtgtgtacctagcagtgggattgctggattgtatggtaactctatttt
-cagtttttttaggaacctccaaactgttctccatagtggttgtactatcttacgttcaca
-ccagtagcatacaagggtttccctttctccaaatccttgccagcatttgctattgcctgt
-cttttggataaaagccattttaactggagtgagatgatattccattgtagcttgattttc
-atttctctgatgatcagtgattttgagcaccttttcatctgcctgtttgccatttgtatg
-tcttcttttgagaatatctattcagatactttgcccatttttaagttggatcattagatt
-tttttcctatagaattgtttgagctctttgtatttcctgttattaatcccttgtcagaag
-ggtcgtttgcaaatattttctcccattctgtgggttgtcttttcactttgttgattgtgt
-gctttgctgtgcagaagctttttaacttgatgtgatcccatttgtccatttttgcttcga
-ttgcctttgtttgtgggttgctactcaagaaatttttgtccaaacatcctggagagattc
-cccagtttcttatagtagtttcatagtttgagatcttagctttaagtctttaatccattt
-gacttaatgttttgtatatggtgaaagacaggggtctagtttcattattctgcatatgga
-tatccagttttcccagcaccattttttaaagagactgtttttcccccaaagtatgttctt
-ggcaactttgtcaaaaatgagtttactgtagatgtgtggacttgtttctgtgttctctat
-tcttttccattgctctatgtgtctgtttttatactagtaccatgctgttttggttactat
-agctttgtagtataatttgaagtgaggtaatgtgattcctctagttttgttctttttgct
-taggatggctttggccatcctgcatttttAAcccttttcccattttcacccagaatactc
-gctggtggcacttgcagctgcagggtttaccctgagataactttgccacaaaatatctcg
-cctttattattattttcacatcgttctaatatatcgactttgaaaacacaaatcatcatt
-ctatttatagcatcttgttgttagcagtggtatttccatttacaaaatatagaaattctt
-gatcgctgaaaatgtcaaattctagaaagcatagcattcccatgttaacattgttctcaa
-acagttttgggccaaagagtcatttaatgaatccggttttttccaaaatagatgattctg
-attattcagatgattctgatgttagttctgtttaaaaataattccaagaacagtttgtat
-attttattttcacactgaacatcagtcagcctccagagcatgttaatgtaaaattaaatg
-aacatgggcagtgagctgcagttttttttctaaacagTGCAGCTGTTTAGAAAATTTTTT
-TAAAATTTTCCTGATTTCCTTGGTATTAAACATATGTGGGAGAAATACAGCTCAGCAAAC
-TCTTCCAGGAGATAAAATGCTGATCACTCCTACTGGGCAATTTCACAAATGTCTCCTATA
-TTTTTCTCCTTTGGTAGTGGGGATGGGGGGCATAATGTTACATTGGGCctctctcctctc
-tctctttctctctccctctcCTTTTAAAATGTTTCCTCTCTCTCAATATTTCATTTCTTA
-TTTGTATTTCTGAATGAGGGAAAAGAGTTGATGGGACAGCGGAACGGGAAAAAGAAGAGC
-ACCAATAAAACCTGTTTTCCTGTTTTCACTATTTTCATTCCAAATTCCTTCTGTCTCATA
-ATTGATGGAATCTTATGAACTTATTAGTTAAAAAGTGTCTTTCTTGTTTCACAGGAATTC
-ATATCGGGGTGATCACTCAGAAGAAAAGGTGAATACCGGATGTTGTAAGCTATTGAACTG
-CCACAAGTGATATCTTTACACACCATTCTGCTGTCATTGGGTATGTACAAAGTGCTGCAT
-ACAGACAGAGGAGAAGGACAATTGAGCCCATCTAAAGTTAACAAAAACTTCCTCTTGGGG
-CTGTTTCTTTCCATCAGACCTTACAGTTCTACGGGATAATAGCTTATCTCATAAGGCCTC
-AGCTTTCTTTAATAATTTCTAGAAGCAGACGTTATTGTGTCATGCACACTCAGTGTTGCA
-AATTAATGGTCTGGTGATCTGGGTGGCATGGCATTTTCCCCTTCTCTGGTTCATCACCCA
-TGATAGACCAGTAAAGGTGACCACTTAAATTCCTTGCTGTGCAGTGTTCTGTATTCCTCA
-GGACACAGAGCTTCCTCTCTCCCAGGAGCCATGAATATCCTGATGCTGACCTTCATTATC
-TGTGGGTTGCTAACTCGGGTGACCAAAGGTAATGGAACCCTATAAAGCAGAGATGATGAC
-TAGGATGAGTTGTTGCCCTTGGGCTCCCCTGGTATCATGATGGGAAGAGAGGGAATCTGC
-AGGAAAAATCTGGGCCAACAAAGAGCAGCAGAATGCTCTTATTTTGGCAGCTCCATGCCC
-CTAGTCTCTGAGAATCTTTCTGTTAGGGGCATCTAGCAAGCTGGGATGTCCTCTGAGGCA
-TTTCTCCAAAGACAAGAATTTCCTTAATGCTCTGAGCCACCCTATCTGTCTCTCTACATA
-ACTATCCAATGTTAGTTCAGCCTCACTTCACTTCCATTTCGATTATTCTGTTGTATCTAT
-TTCATTGTTGTGTCCTATTAGTTCTCCTACCATCTTGAATTCTTCTTTGCCCGGAGGGTA
-CCTTCAGAGGGAGGCCCTCACTTTCATGTTCTTAGATATGGTGAACAAGTCCATTGACAG
-TTTGTAGATTCTGTAGCACTATCATATGGAAGAGACAATATATATGTTTGGGGTAGAAGT
-GGAAATAAGTGGAGTGAAGACAGGATAGACAGACTAGTGACCAATGGGGAGCTTCTAATT
-TTAGATGAATAGGAACAGTCTGTTTCCACTATTTAATAATGCTACTTTTGAAAATTGTTA
-ACTTTTTATTAAAAAATAATACTTGCAATTGACTTATGTATCAAGCAATCGATGGATTTA
-TAGGGTTTAAGGAAAAGAAAAATGTTTGTCTGTCCAAGAATACCAGTTCTTCAGTCTTCC
-CCTTCAGAATCAATCAATGTTACCAATTTCTTATATATCCTAGCAAATACAAATATATTT
-ATATTTGCATGTGTATACCTTTTAGATTTTTAAAAAATGCAATTGCAAATGCACCATGTG
-AATTGTTCTGCAATGTACTAGCAATATATTAGAGACATCTTATCCATACATAAACCTAGT
-TCATTATTTTTAATCGATAAGTAAAACTTTGAGGAGGAGCAGATGAATTGCCTCACATTA
-ATTACTCCGCTACTGATGAAAAATAGGTCTTTAATTATCAAAAACAATTCAGCAAGAAAA
-ATTTGTAAACAAATGTATGTCTTTTCATTTATGACTGGACACGTGGacacacacacacac
-acacacacacacacagtcaaaccacctaccagaaaagctgaactattcttctctcctatc
-accagttgcaagagtgtcagcttcccacaccctcatcagtcctttttgttttttctacta
-cattcagttttctactacattcagttttacagtctaatatgtgaaaatgatgtcctgatg
-tttgaattcatgacactttagttataaatgagtttgaacatccagtccattagatttcta
-aactttcttAATTATCTTTATATACTAAGAAATTTGGCTTTTGTTAAATTTGGAGGTGTT
-ATATGTTGCCTAGAAAGATGCTATTCATGTCTATTAAATGGTTATAACTGTGCCTATGAT
-CTGTTATGTCTTGATTCACATGTTGATGTAATGTGAGTTACAGAATTAATATCTACATTC
-ATTTCTGATTATAAACTGCTGTATTTGTTGAAAATTTGGAAATTTTGAAATTGTAAAGAA
-GTAAAAAAATTGTAAAGAAGTTAAAAGAGACAAAATATTTTTGATCTATTGTTCTTCCTC
-AGTTTTCTTATTTGAATAAAAATGTATAGCATACTTATAAATTTTCTATTATACTATTAG
-TATTTTCCCATTTACTATTTTCAAAAACTGTATTTCCAATGACTGTATAAATTTTATAGA
-ATGGATACTGTTTAAATTACTTAGCCAAATTGTTTTTGCATAAATAAGTGCATTTACATT
-TTATAGACAAGGATGGCTAGTATAACCTTTCTTATACATAAATCATTCAGCATAAAATTC
-CTGGAGATGTACTTTTTTCTGTCTGCTTCATGTGTTATCAATTTTTGAATACTTGCCAAG
-TCCtaaaaatgaaatattatatataaatatttaatttttatttatGTCTGTGAGTAATGG
-GGAAGTCGAACTTCAAATACATGCTTAATGTATATTTAACTTTTCTACAAATTGTCTATG
-TCTCTCTTTCTCTTTTATTTTGGAGAGGTAGTTTTCATTTCTTTTGATTTAGAGATTTTC
-ATTTTTGTGTTCTCTTATAGGTTTTGTTTTGAAATTTAGCTATTTAGTCTCTCTGGGCTT
-TATATTATGTGTTTTCAAGTGAGATAGCACCTGATGGCTTGTGAAGCAACTTTTTACCAA
-GCCAAGCTATCAGTGGACTGGTATCCATAGATATATtttaagttgatgctagctgattat
-atatctggtatgttttagaaagaactccacacatgggataatgttttggctagatggctc
-cCCTACTTAGAAACATACAATTGCTAGTCATATTTCTAATTTTAGGATTTCGAGATACTG
-GTGATGAAGATCACATGTCCTAACAACATAATAGTTCCAGACTGAAGTTCTTTGAAAAAA
-ATGACTGTTGTCACTTTAGAAAAAAAAAATTATGAATTATTCCcaattgccatcattcta
-ctgctaaaaccaaattcttggaattatctatgatttttctatatcctatgacactcatat
-ctatcaggaagtctattacatctgcctgcaaattatatccagaatgcaattattctcgcc
-acctccattgctgccactctgattctagtcaccatcatctctcacctgtgttattgccat
-agcttcctcatgagatctgtccttctgctcttccctgccaccatcttgtgaagacacata
-gtgcatgatccgcttacactggaagtcagatcatgtacttttgctcaaaactctgctatg
-gccccctctatactcagagcggtaacaagagtccatacagtggctcacctggccctgcag
-gatctggcccttatgacctctctcacctcatctcctactattatagtccttgttcactcc
-actacagccacacaagccccagtgctcttccccaaacatatcagacttactcaacccata
-gagctttgtttgtttcctctgcctagaatgtacttgcctcagatactggtgtgactaatt
-cctttacctccttcaagctgtttaatcatcaccttgttacacaggcttgtgcaactcctg
-tttatgaatcttctattacccttaaatctattctcccttctttctgcaaaccatttgtca
-ccttttcatctacaaaataatgtacttttttattAAGGTAAAATATACATTTAAAAATTA
-CCATCCTTACCATGTTTTTACCATatttttatgtatacctgatggctgtttgtatgtctt
-ctgttgagaaatgtctattcaaatcttttgcctgttttaaaatcagattatttgtttttg
-tttgctatggagttttttgagctccttatattaatatactttttgttgttaattcctcgt
-cagatggatagcttgcaaatattttctcctactctgtgggctacatcttcactttgttga
-ttatttcctttgctgtgcacaagctttttagtttgatgtaatcctaattgcctatttttg
-ctttggttgcccgtgcttttgaggtcttacccaagaaatctttgccaagaccaacgtcct
-gaagtgtttccctaatgtttttttcaggtagttccatagtttcaggtcttagatttaagt
-ctgtaaAACCATACAGTCTAGCAGGGAGTGCatttactttttattatctgtctccctctg
-ctagaaagtcagctccatgtgatttttgtctgtttagttcacagatgtacctcaagggcc
-caggatagtgcctgtgccatagtaggggcccaaaactttgatgactgtgtgaCTATAGCC
-TAATTTAAGAATGGAGGGGATAATTTAAAAGCAGTAGGAAGGAATGTAAGTGAGAAACAA
-TTTTGAAGAATAATTGACAGAACAAGGCGATTCAAAGACAAAGGAGAAGAAGAGAGCCAA
-GATGACATATTTCAAGTATGGATAATGCTGGAGGAAAAAAATTAAGATATAAATCTTTGT
-AGATGTGAGGAACGAAGAAGCAAGGTTAGAGTCTGTCTTGCACAAAAGAAGTGGAAGGTC
-TAGACTTGAAACTTATAGAAAATTCCACGAAGTACAAAGTAAAATCGAGCCAGTAAAATA
-ACAAAGATAGAATAAATGACTCTAGAGGAGTGAAGGTAGAATAAATAATTGGTGAAGCTG
-GACTAGAGCCAACATTTCCCAGAGGATAAAATATAAACCAAATTATTGTGAGCCTAatat
-atacatacatacatacatctatatatgttttatatatatTATCACATTAAGTTCAAATAA
-GGTTGTTTAGAAAATTActtgctcttctgcacatataccaggcttcctcctccatagagc
-cttatctctagctgcttcctctgcctagaatacacttATCTAGGTACTCCTTGGGCAATT
-GTCTTGAGAAAGATGATCATGCCGTTTACTgcttgataaatgaacatacaatgcagcaca
-ctagtttccctttagatttatatcctcacccctcaaatgagtagtcacactgcttggaaa
-tcctactgcatttctcttgtaaatgaaccttccttcttttttttttttttttgagacaga
-gtctttctctgtcaccaggctggactgcagtggcccaatctcggctcattgcaaccgcca
-actccctggttcaagtgattctcctgcctcagcctcccgagtagctgggatcacaggcat
-gtgccaccacatccagctaatttttatatttttagtagagacaggttttcaccaggttgg
-ccaggatggtctcgatctcctgaccctgtgatccaccctcctcggcttcccaaagtgctg
-ggattacaggtttgtaccaccacacccagccatcttccctcttttttagacaactatttt
-gtcctgacctttatttgtcttttattttcctgctcctctcctctacatggctctccccct
-cagtttatcccatgccccatttatttaaacaattcaaataggaagttttcactcatttcc
-tctgtcccctttgccataaatggagaaacgtgtcttctccatctaaagatcagtctgctc
-tgtgtgaatttgtgactatgcccttctgtcatctcatcaccctattctatattaatctct
-ccttttctgcttttttttttttttttttgagatggagtcttgctcttgttgcccaggctg
-gaatgcagtggcacaatcttggcttactgcaaccttcgcctcccaggttcaagtgattct
-cctgcctcagcatcctgagtagctgggactacaggtgctcgccaccatgcccagctaatt
-tttgtattttttagtagagacagggtttcaccatggccaggctggtctcgaactcctgaa
-ctcaggtgatctgcccgcctcgatctcccaaagtgctgggattacatgtgtgagccactg
-cgcccagactgcttgtctcttttctcattgcttgcaagcaccatttggtatttctcgttc
-ttcaaaacaaacctgaaagctttcccttaaccttacattgctctctaacaagttatttat
-ttctctgcttttctttggatctaaacttcttaagagtttcatctacaggtcctgcattca
-cttctctctcattcacattttgaccaactgcaatttggtttcttttttcataccactcgg
-aagctgctctcctcagtatgaagttaccttcatactactaaaagcatggacattttcctg
-ccttcatcatttttttttaacctctcagcagtatttgactacaaaatgaccactctgtcc
-tttaagaaacagtctcctctcctgCTTAATGTAGTCACATCTGATACAACTTTCCCCATA
-ACCTTTTATGCATTTTCTGTTTTCATGCATATCAGCCCAACTTGCAATTGTCAGTATCTC
-CAGTCTTTCAACAACTGCTTGTGAAATACCCCTGTACAGGGCAATCCAGAAATGCCAGAA
-AATTATCAGCTGTCTCTGGATCATCTGTCAACTATGGGGGAAGCTGGATAAATAGTCCAG
-GTCCTTTGAGCCTCATGTAGAATAACTTTGAGGCTTGGTAATATTTTTTTTTTCCTGTGG
-TAATTCCCTTATTTGCAGTTCAAGGCTATTATGGGAAGAAAACATAAATGGATGTTAGTT
-CTTCAAGGTTTTTACTGTAACTGTGCACCCTTTCATTCTTCAAGGTTTTTCTGTAACACT
-GCACCTTCAGGACCTGATGCCCAATTAAACATTTTTTTAAGTTTTTTGGTTTTTTTTTAA
-TAAAAACTAAATGCTATTTTTTCttctacttttagttgatgtgtaataattgttcatatt
-tagaagatgcagagtgatattttgatacatgtatacaatgtgtaatgatcaaatcagggt
-aattagcatatctatcacctcaaacatttgtcatttttttatattgggaacattcagaat
-cgtctcttctagctatttgaaaatatacagtaaatgattgttaactaccgtcaccctaca
-gtgctatagaacagtggaccccttttggcaccagggaccagttttgtggaagacagtttt
-ttcgacgaggtgaaggtggtggtggggatggtttcaggatgaaactgttccacctcaggt
-catcaggcattagagtctcacaaggaacacacatcctagatccctcacatgcacagttca
-caatagggttcatgctcctatgagactctaatgccttggctgatctgacaagagatggag
-ctcaggtggtgatgcttgcacacctgctgttcaccttttgctgtgcagcctggttcctaa
-caggccatggaccagtacccattggctgcccaggggttggggacccctgctataggatgc
-tggaactttttcctcctatctaggtgtaattttctatctgttaaccaacctctctctatc
-ctcctttcccttcccagcctctagtaatcattattctacagtctacttctatgaactcaa
-cttttttagctcctgcttatgaatgaaaacatgtggtatttatctttttgtgtctatttc
-acataacggaatgtaacatgtcccccaggctcatccatgAGTCTGAGGCTTATTTGTAGC
-CTGGCTGCTGGGCTTCCCTGTGGGATTGTCCTCTGAGCAAACAGAACACAGCCATCCTGC
-TGGCCAGCAGTTGATAGATGATCTCATGATAATAACAGGTTATAACTCACCTTTTCTTGG
-ATTTCTTGCTTTCCTGATTTCTACATTTCTCCACTGATTTTTTTTAAGGAGGAATTGTCT
-CTCAACTAAACTATTATATTCAAATCTTTGCTGGAGCTCTGCTCTGCTGGGGGTCTGCTT
-TAAGACTCTAGAGTCTTattctcctgttttgatctgacttatcttattggtccttttaag
-tcgtttcctcttatctgatctcttatctcttaatattgaaactcactagaatttaattct
-agtcctctttttttctcatattattccaacccaccatggtttaccaatttctgtacttta
-aatgctatccataagcaatcacatttattgatttgcatatgtcgaaccaaccttgcattc
-caaggataaaggctacttgatcgtagtggataagctttttgatgtgctgctggattcagt
-ttgctactattttgttcaggatttttgcactgatgttcatcaaggatactggcctgaaat
-tttttttttcttgtgtctctgctaggttttggtctcaggatgatgctggcctcatagaat
-aagttaaagcggagtcctgccttctcaattttgggtgaatagtttcagtaggaatgatac
-cagctcttctttgtatatctggtagaattcagctgtgaatccatctggtcctgggctttt
-CATTTTCATCCTTTCTTTCTAGGTTTCGTATCAGTCTCAGTATGctctctctctctccgt
-ccctctctttttctacatttctccttttctcCATACAACTTCTTTGATGGCACATAGCAC
-AATTTTAATATACACTTTTTGTTCTCCTGTTTGTCTCTTACAATGGCTTTTTGTATTTGA
-CATCATATTAGTCTAGATGTCAGTCAGTGTAAATTTTTGAATGAATGAAAAGTTGTTATG
-TTGATGCCAGAGTTAAAAATTTGACCTATATTTTATTCTCTACAGGTAGCTTTGAACCCC
-AAAAATGTTGGAAGAATAATGTAGGACATTGCAGAAGACGATGTTTAGATACTGAAAGGT
-ACATACTTCTTTGTAGGAACAAGCTATCATGCTGCATTTCTATAATATCACATGAATATA
-CTCGACGACCAGCATTTCCTGTGATTCACCTAGAGGATATAACATTGGATTATAGTGATG
-TGGACTCTTTTACTGGTTCCCCAGTATCTATGTTGAATGATCTGATAACATTTGACACAA
-CTAAATTTGGAGAAACCATGACACCTGAGACCAATACTCCTGAGACTACTATGCCACCAT
-CTGAGGCCACTACTCCCGAGACTACTATGCCACCATCTGAGACTGCTACTTCCGAGACTA
-TGCCACCACCTTCTCAGACAGCTCTTACTCATAATTAATTAACATTTACTTCTGGTATGG
-AACAACTAGAAATACTGCTGGAAATAATATCCAAAGAGCTGATTCTACCAATCCAATTTC
-ACCAGGAAAATTCCATCAGGGATTGGATGACCATGGGGATGGACATAATTGCTACTACCA
-ACACAACAGCCAAGAGAGTTGCCTTACAATTAGAAATGTGTAGACAGAAATGTATAGAAG
-ATACAAGGATTCTCTTAATTGGACTTAAATTCTTTATCTGTCTTCCTCCGATGTACTCAA
-ATATATGAGCTAATTTTTGTCTTAAGTGAACATTTGTATATCTATGTATTTTTCCATGCC
-AAAAACAAAAACGAAGACCATTGTTTGGAGCTGCCTCTTATGACTAAGACAAGAATTTTT
-ACTTTAACAGTGCCTGGCCCACTACTATCGTATATAGGAGAACATATAAAAGCATATAGA
-AAGTTCCAGATGAATGTTCCCTTCTCTACCCTCCACCTTTTATTGTAAGTTCTGACCCTA
-AATACTTTTCTGTGTCATGACGTCAAATTTTGTTTAAGGTTCTAGCTGGTAACTAACAGA
-GTCAGAAGCTAATTCTTTCATTCAACACAAGCACTGATCTAACTGGATAGAGATAAAAGT
-GGGACTTGCCTTGAGAGTACATCATATTAAATTAAAAGCTGCATCTCAAATTCTACTTAT
-CTTTCCAATCTTCTTTCCACTTAGAATTCCAACTTCCAAGTATGGCAGCCTCATAACATG
-CCTCTTCAGGTCTCTGTGTTGTCCATGAATGTTAGTTGTGTGCAGTGTTTCTATGCTTTG
-TATGGCTGTACGCATGTGACTGCTGTTTGTATGGCAACAGGTGGGTCAGTAAGTGTCTTC
-TATGATACTACAGAGAAGCGGTTATTAACTATAAAGTTGATTAGGttttttttttttttt
-gagacagagtctagctctgtcgcccaagctggagtgcagtggcatgatctcggctcactg
-caagctctgcctcctgggttaacgccattctcctgcctcaggctcccgagtaactgggac
-tacaggcacccactaccacacctggctaattttttgtatttttagtagagaggggtttca
-ccatgttagccaggatggtctcgatctcctaacctcatgatccatccgccttggcctccc
-aaaatgctgggattacaggtgtgagctactgtgcccggctGATTAttattttttttaagt
-tccaggatagaagtgtagaacatgtaggtttgttacataggtatacatgtgccatgatgg
-tttgctgcacctatcaacgcatcatctaggttttaagtcccgcatgcattagctatttgt
-cttaatgctctgcctccccttccccacacaccctgactggcccccatgtgtcacgttccc
-ctccctgtgtccatgtgttcttattgttcaattcccacttatgagtgagaacacgtggtg
-tttggttttctgttcctgtgttagtttactgaagatgatggcttcgagcttcatccatgt
-ccctgcaaagagcatgatctcattcctttttatggctgcatagtattccatggtgtatat
-gtaccacattttctttatgcagtctatcattgatgggcatttgggttggttccatgtctt
-tgctattgtaaatagtgctgcagtaaacatacgtgtgcatgtgtctttataatagaatga
-tttatattcctttggatatatacccagtaatgggattgctgggtcaaatggtatttctgg
-ttctacatccttgaggaatcgccacactgtcttccacaatggttgaactaatttacattc
-ccaccaacagtgtaaaagtattcttatttctccacagccttgccagcatctattgtttct
-tgactttttaataattgccattctgactggcatgagatagtatctcattgtggttttgat
-ttgcatttctctaatgatcagtgatgttgagcttcctttcatacgtttgttggctgcata
-aatgtcttcttttgagaagtgtctgttcatatcctttgcccactttttgatgtttttttt
-ttcttgtaaatttaagttcttgtagattctggatattagacctttgttagctgggtagat
-tgcaaagcgttcctcccattctgtaggctgcatgttcaccctgatgatagttttttttgc
-tgtgcagaagctctttcatttaattagatcccatttgacaattttggcttttgttgcaat
-tgcttttggtattttcttcatgaagtctttgcccatgcctatgtcctaaatggtattgcc
-taggttttcttctagggtttttatggttttgggtattacatttaagtctttaatccatct
-tgagttaatttttgtataaggtgtaaagaaggggtcccgattcagttttctccatatggc
-tagccagttttctcagcaccatttattaaatatggatcaaattcacacataacactatta
-accttaaatgtaaatgggctaaatgccccaattaaaagacacagactggcaaattggata
-gagtcaagacccattggtgtgctgtattcaggagacccatcacacatgcaaagacacaca
-taggctcaaaataaagggatggaggaaaatttaccaagcagatagaaagaacaaaatagc
-aggggttgcaatcccagtctctgacaaaacagactttaaaccaacaaagatcaaaaaaga
-caagagcattacataacggtaaagtgatcaattcaacaactagagctaactatcctaata
-tatatgcacccaatacaggagcactcagattcataaaacaagttcttagaggcctacaaa
-gagacttagactcccacacaataatagttggagactttaacactcagtgtcaatattaga
-cagatcaatgagacagaaaattaacaaggatattgaggacttgaactcagctctggatca
-agtggacctaatagacatctacagaactctccaccccaaatcaacagaatgtacattcgt
-ctcagtgccacatgacacttattctaaaatcgaccacataattggaagtaaaacactcct
-caggaaatgcaaaagaactgaTTAGTTATTAATAAATTGGGCTGAGGCTTGGGCGCTACT
-GAAAGCCACAATATCAGATGCCAGAATGTCTCAAAATCAAAAAGGTTTTTTCCTCTAATT
-ATTTTTTATGTGATCCAAGCCAAGCTGCCAGTGACTATGGCTGTAGTTTGGATGTTGACC
-ATCAGACCACTGACCTTTCAGTAGACCTCATATTCTAATAGGTCTTAGACCACCAGTtag
-ggtgtccatcattcagatttgattgggactgaggggcttcccagaacatgggaattagag
-agctaaaatcaagaaaatccagagtaaattgggacaagttgatcaccctCACTTCAGTGT
-ACTTCTGTCTAGCAAGCTATTTTTCCATTTTTCATGGCTATACCTCATCACATAGGTCAT
-ACATTGGCTTTTCACAGAATCAGTCTAGGGTGCTCTTTTTCCATATTTTTGCCTCAACTG
-TCATTTCCTGAAACACACTCCTTGAGCATGCAGAACACCTTCCATTCTACTTTGTATTAT
-TTTCTTCCCATCATTTGAACTCTGAAATCATTTTGAGTATTTACTCTCTCTCTGATTTTT
-TTTACTAACTTATGGCCTAACACCCCTGCTATAATGTACATATAGTCCTCATCTCTTGgt
-cttgttgacctatgtgatccaaactgcaagaacagtgcgtcacacatgagaaatgctcaa
-taaaaatttgAGAACAAATTATTCAGGCAGTTATCTTAATATATATGAGAAGGTTATATA
-ATATAAAAcagtagtcttcaaactgcaatactggttacaaaaagatttttcaagctatac
-atattgatagtttaaaggaataaaatttcagaccctcaagttccaaatttcttatgatgt
-tttggagcattcttaacaggctcttcttttataactccaatttctcaattttccttctcc
-cactctgaaaagaaaacttacctctcacccaccctttatctgacaatcatggattgccct
-gagtgaacaaacctccagtggacaattgaaatactagtgctggTattcagaaagtgaata
-atcatagactttgaataaaaatcctttggaaataaaagtgtttttaatttttttgtttac
-aaaagcaatgatggggtgtcaatcaagttgatggttaatattaaatagatctttgaagat
-aaactttaataatagcctactatgaaattttttagcatatcacttggaagaggttaaaag
-aactgtgtaaacattagagtcttatgttcaaagagatttcacaataagctacaatgtatg
-tctatgttttgtcacagagaaatgtgatagaatgattaataaaagacttgcaaacacaaa
-aatatagtacattaggatcaaattttgcagagaagtttgaataaaaactaaagttttaaa
-aagaaaaaagatacaatgttcccaattgctaaaaaagagcttctttgcatatttattaaa
-tgaattattgtgattagcaaattgtcatgcattcatattccattggatgtatttagtatt
-tagttgttacatgtcaatatttgtaatatgctattagttatctttttatgattaaaattt
-aagatgaaatagtttatttcccaattttaaattgtattgggaaaatacacactttATTTT
-TATACCTAGCATAGACTTTTTGTTCCTTCTAATTGGAAAAAGGCTTTGCAATTTGCAATT
-GGTATATGTGTGACTTCTAGAAATGTGGTGTTCTttttttgttttttgtttttttgtttt
-ttttgagatggagtctcactctgtcgcccaggctggagtgcagtggcgccatctcggctc
-actgcaagctctgcctcccgggttcacgccattctcctgcctcagcctccctagcagctg
-ggactacaggagcacgccgccatgcccggctaatttttgtatttttagtagagacggggt
-ttcaccctgttagccaggatggtctagatctcctgacctcgtgatccgcccaccttggcc
-tcccaaagtgctgggattacaggtgtgagccaccgcgcccggccCAGGAATGCTCTTAAC
-CACTTCATCAAGCATCAAGGTTGGCACTGTCTAGATGTTGGTTTTGATTGCCAACCTACA
-AAAGAAAAGGGAAATTATAAAAGAGAAAATTAACAAGTGAGTACAGTTTCAAAATCTGTC
-CTGCAAATGTGTTTTAAACCAAAGAAATCATCTTTGGCATGGGCTATTTGCTTTATAGTC
-ATTCAGAATTGCTTGGTCTCTGTCTCCTGAAGACTGTGGCTAGGATTATTCCTGATGAAT
-GAGAAAGTTACCATAAATCAAAAATAAAATGAATAGAAAACTTAACAGTTGACTCTCAGA
-AGAAGGTATCTTCCCTCACTTTGCACTGGTtatatatatatatatacacacacatacata
-taATTGTATAATATGTATTAttttataaattgatttagaaggtacaagtgttgttttctt
-atatgcatatattacatagtggtgaagtctgggcttttagtttagccatcacccaaatag
-tgtacattgtacccattaagtaatttctcatttcttagcccccttctacccttccaagtt
-tccagtgtctattacccactccttatgtccatgtgtatacttagtttccacttgtgagaa
-catgtagtatttgactttctgtttctgagttatttcacttcagataatgAAAACATTCAC
-TTCAGATAATGAAAACACACTTTTCAAAATTCAAAGAGGTTTGAAAAGCTCATGGCCTAA
-TACCCCCACTATAAATTTTATTTTTAAACTGTTCATACTCCTAGAATGAACAGAGGCTTC
-AAACACTATCTGGTATAAACTGATGATGATTCTTCTACTACTGTGATCATTCTGTTTTTC
-TATGATTCCTGGATTTTCCTTTTCCATGAATGTGGGCTTTGCAGCATAACTTCTAGTTTG
-TTTATATCATTGCCCTTTAGGATCTCCTGTAGGCTCAGTAATCTATCACTTCCCTATATG
-GGACTGACCTCCAAATTACTGACTTTATATGTTCTCTCTCTCTCTCTCTCtgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTTAGTATTTGCATTTTG
-CCACATTCTTATATAGTTTCCAGCTCAAGTCTGAAATTCTCTACCtctttatctatgctg
-tccatattaggtatatgatttgataagttagacatgtgacatatatttcccccattctct
-gggttgttttttcattatatcaatggtgtcttttgaagtagagcagtttttaattttgat
-gaagttctcttttttaaaaacacttttctttttggtgtcatatctaagaaatcattccct
-aatttaaggtcataaaggcttattcttgtgttttcttctaagggttttagctttcacatt
-tagctgtacgatcctttttaatttaatttttttgtatgatgtaaggtaggggtccaaatt
-cattcttttgcatgtggctctccagtttctccaacactatttgataaaaagactatttac
-ccactgaattgtctggacacccttatagaaaatcaattaataataaatgtGataatttgg
-gcagatctttggagagaaagcaccaagagtggatggagaggcaacactgacaccaaagct
-gaagagagaggaagctggaatctctgcatgaggtgcctgaacattagggctagttcctga
-ccctgagtggctcctggggaaggggtaagtaaggggactaaggaacatcccgcttttgcc
-atggacctctgggatcatagctacagggtaccccatgtccctcatggatttgtaggctag
-cagggagcaggcagagacagggcttcagccagtgtgaagcccaggagcttttgtgcatgg
-ggcagctctggcagcgcatgaccgcaggtgcccatccccaagggctccccatcttcttct
-gagaggctgtagccccagctgactgctggacctggagagagtggcgccagctttgccatg
-ggactggggtgcatctgttctgcaggctctcctgcctgccagcccctcccatggcccctg
-cctagccaccctgcaggagcatgagcacagcacagcctccaccactaagccggagtgctt
-tgctccacctgagtacattcccagtaacctgggagcacttcagatccctcagtgcagctg
-gagcttgaccccaagccacagatcatccccgtgccccagggctgcagcacacagcttggg
-agcatgcagctgagatctgtggctgacaggcaagtagaggagaggcccccaatatcagaa
-cataaagggggcaagatgtgtgggttcatgggccagcttgggagcaaggtgtgcctccct
-ctgcagggttggtctggaaagggtgtggcccatctccctgccatggcctctgcccaagga
-agccccacagcctggaacacctaacgaaacacagaaatgatgccagtgatcagggtgggg
-tccctaaaggcccaagagcagatctggtgaggagttttctctcccactccactcaccata
-gaacatgcctgcaaatggaaggacatgcaaaagagctgagtaacagcctatgtaccagtc
-actacttaagcatcaatgactagatctcagccccaactacagcaccaaaaatgattctgc
-taatatacacccctgtgaaaccaagtgcaagactttgcccatacataaagatcctgtaca
-gagccacggacctctgaaaacatccagaaatgaactcaactgactatattcaacttacac
-cacatttaaaagaaaaccagcccccctcccaccagaagagaaagaatcaatgcaagaacc
-ccagcagttcaaaaagccagggtgtccccttacctcaaaatcagcccactatctccccag
-cagtggtccttaaccagactgaaatgacagacatagaattcagaatccaaatggcaagaa
-gctcattgagatttaggagaaagttaaaatccaatccaaggaatccagtaaaatgattca
-agagctgaaagatgaaatagccattttaagaaggaaccaaactaaacttctagaactgaa
-aaatttgctacaataatttcataatatgacagtataacagtattaacagaatagaccaag
-ctgaggaaagaatctcagagctcaaaggctggtccttcaaatgaacaaagtcagaaagaa
-aaaatctttaaaactgaacaaaaccaccaagaaatatgagattatgtacagaaacaaaac
-ttctgacacactagcattcccgagaggagggaaagagagtgaacagcttggaaaatatat
-ttgaggatatactccatgaaaatttccctaatctcactagagaggttgacatgcaaattc
-aagaaatacagagaaccccagctagataaaatacaacatgaccatcccaagaaacatagt
-catcagatttgccaaggtcagcatgaaggaaaaaaaatcttaaagccagctagaaagaag
-ggtcatgtcatatgtaaagagaaccccatcaggctaacaccagacctctcagcagaaacc
-tgacaaaccagaagagattaggggcctttttcagaatccttaaagaaaagaaattctaac
-caagaatttcaaatcccatcaaactaagcttaataaacaaagaggaaataaaatatttct
-cagacaagcaaatgctgaggaaattcatcacaaccagatatgcctccttacaagagattc
-ttaagggagctctaaacctacaatcaaaagaacaacacctgctacaaaaaaaaaaaaaaa
-aacatacttatgcacataaagacactataaagcaactacactatcaagtctacataataa
-ccagctaacaacacaatgacaggataaaaatctcgcatatcaatactaaccatgaatgta
-aatggactaaacaacccacttaaaggacacagtgtagcaagattgataaaaagacaagac
-ccaactatctgctgtctttaagagacctacctcacatgtaactacacccacaggctcaga
-gtaaagggataaagaaagatctgtcacacaaatggaaaacaaaaaagagcatgagttgtt
-attcttatatcagataaaacagactttaaatcaacaactatgaagagggacaaagaaggg
-cattacataataataaaggatacaattcagtgagaagacttaactgttgggcctggagag
-agtgggaccacctttgccatgggactggggtgcatctgttctgcaggccctcctacctgt
-agcccctccgaaggcccctgcctagccaccctgcagaagcatgtgcacagtgcagcctcc
-actgccaagcctgagtgctttgctccacctgaatatgtttatattctaaacatatatgtt
-cccaacattgaggcacccagattcataaaacaagttcttcttaacctataaaaagatgta
-gatagccatgcaataatagtgggagacttcaacaccctactgagagtgttagacaaatca
-ctgaggcagaaaattaaccaaaaaatcctggacttcaactcaacgtttgaccaactagac
-ctaacagacacctacaaaatattccacccaacaacaacagaatataacttccttcttctc
-tttggcacgtggaacatattccaagattgaccacatgctcagtcataaagcaagtctcaa
-taaatttaaaaaagtcatgctgagcccattctcaggccacagtttaataaaaatagaaat
-gaatatcaagaagatctcttaaaattacacaaatacatagaaatgctcctgatacctggg
-taaacatcaaattacagcagaaaattaaaaaattatctgaattttttattaaaataggga
-cacaatttaccgaaatatctgtgatacagccaaagcagtgttaagggaaatttatagtgc
-taaacgtcatcatcaagaagttagaaagatctcagattaaccatcaaagtttgcacctag
-aactagaaagaaaagaacaaaccaaccccaaagctagcagaagaaaaaaaaattactaaa
-attagaaaagaactgaaaaaaattgagatgcaaaattccatagaaaggaccaataaagcc
-aaaaggtggttttttgaaagaataaaaaaggttgatagactgctagctacataaccatga
-agaaaaaagaagaccaaaataaatacaataaaaaatgaagaagatgacattacaatgaat
-cccacagaaatacaaaagatactcagagatcattttgaacaactctatgcacacaaattg
-gaaaatctagaggaaatggataaattcctggaaatataaaacctcccaatattaaagcca
-aaggaacatgaaaacctgaacaatcaataaacaagttcctaaactgaatcaataataaaa
-acctaccagcccaaaaaaaccctggaagagatggattcacagcctaattctaccagacat
-aaaaagaactggtatcaattctactgaaactattccaaaaaaatctaggaggagaggctc
-ttccctaactcagtctatgaagccagcatcagccagataccaaaatctgtcagagacaca
-aataaagaaaacctcagaccaatatccctgattaacatagatgcaaaaattttcaacaaa
-atactaggaaaccaatcccagcaacagatcaaaaaattaatacatcagaatcaagtaggc
-tttattcctgggatgcaaggctggctcaatatatgcaaatcaataaatgtgattcaccac
-ataatcagaattaaaagcaaaaaaatatgatcatctcaatagatgcagaaaaggatttga
-aaacaatccaacgcaccttaatgataaaaacccacaacagactaggcactgaaggaacat
-accgtaaaataatgagccatctatgacaaacccatagccacgatcattctgaactggtaa
-aagccggaaccattccctttcagaactgcaacaagacaaggatgcccactctcaccatgc
-ctattcaacatagtactggaagtgctactagagcaatcaggcaagaaaaagaaataaaag
-gcatccaaataggaaaagaagaagtcaaactatccctcattgctgatgatatgattctac
-acctggaaaaccccaaatactctggcaagaggcttataatactgatgaacaacttctgta
-aagtctcaggatacaatatcaatgtcaatgtacatttctatacacaataaccttcaacct
-gagagtccaatcaagaacacaatcccatttataatagccataaaaaatgaaaatccctag
-gaatacagctaaccaaggaagtgaaaggtctccacaaggagaactacaaaatacttctgc
-aagaaatcagagatgacacaaataaatataaacaattccatactcatatatcaaaaagat
-caatgtcatttaaatggctatacattccaaagcaatctacagattcaatgctatttctat
-caaactacaaaaactgcttttcacagaattataaaaaaactattctacaattcatatgga
-atccaaaaagtacccaaatcaccaaagcaatcctaagcaaaaggaacaaagccagaggca
-tcacattatctgacttcaaactatattataaacccacagtaaccaaaacagctgatactg
-gtacaaaaataaacatatcactaatggaacagaatagacaacccagaaatgaagccacac
-acctacagacatctgatctttgataaagacaacaaaaataagcacagggaaaagaccccc
-tattcaataaacggtgcttgggtagctggctaaccatatgcagaagaatgaaagtggacc
-cctgcccttcaccatatataaaaattaactccacaaggattaaatatttaaatgtaagat
-cttaaactataagaatcctggaagaaaacctggaaatacccttctcaacatccacgttgg
-taaagaattcttggctaagtctccaaaagcaattgcaacaaaaacaaaaattggcaagtg
-ggacctaattaaactaaagagcttctacacagcaaaagaaactctcaacagagtaaacag
-acaacctacagaatgggagaaaatattcgcaaactatacatccaataaaggtctaatatc
-cagaatctataaggaaattaattcaataagcaaaaaaaaatcccattaaaaatgggcaaa
-agttataaacagacacttctcaaaagacatacaagtggccaaaaaacatgaagaattctc
-atcatcactaatcatcaaagaaaggcaaatcaaagcaattagataccatctcataccagt
-cagaatggccattattcaaaagtcaaataatagcagaagctagtgaagctgtagagaaaa
-ggaaacacatacactcttggtgggaacaaaaactagttctgccagtttggaaagcagttt
-ggagatttcttaaggaacttaaaaatagagctaccatttgacccagaaatctcattagtg
-ggtatctatgcaaaagaaaacaaatcattctaccaaaaagacacatgcagccctatgttc
-atcgcagcactattcccaatagtaaagacatgaaatcaacctatgtgctcatcaatcatc
-aatggtggattggataaagacaatgtgttacatattcaacatgaaatactatgcatccat
-aaaaaagaatgaaatcatgttttctgcagcaacatggatgcagctggagaccataattct
-aagcaaattaatgcaggaacagaaaaccaaatactgtatgttctcacttataagtaggag
-caaaacattgtgtagtcatcaacataaagaaggaaacaatagacaatgtggattactaga
-gggaggagggaggaaggggggcatgggctgataaactaactattgggtactatgctcact
-acccaagtgaaaggaaacataacccaaacgacagcatcacacaatatacccatgtaacaa
-acctgtacttgtatcccatgtatctaaaataaaagttgaagttataaagaaaaataagtg
-ttagagtttatttcttggctcacaattctactccattgttatatatgtttaGCTGTACTG
-Aggggtctccaagatcaccctcaagtttgatgactcactagaaaaactcaccagacctat
-aaaaacgattatactcatggttacagcttaatacagttaggagatacagattaaagtcag
-caaaggtaaaaggtgcacagagtgatgcctaggaaaaaacaggtatgagctttcagttgt
-actcttcctccagaatcacacgaatagaactcaattcttccaaccataaggtatgacaat
-aagtgcaaaatggtgccagccattttcagtgggagtcaatcacataagcatgaagcatcc
-ccaagactgaatttagctactcaatcttcagcccctaaccttaggagtcaagctaatacc
-gcttggcctgaagccccagtcatagaaaaaaatatatgatttattcaccataaatcacat
-tgttagcataaactatttggcatgggccaagtctcaggtatacaaagacactttatcagg
-caggataattaaagggctcagagattatctgccaggacctttgaaatatgcagggttagg
-acaaccccaaatcttctgagttaaccctttattacacaGTCCACCCCATACCCCTTAGCC
-TAGGCTGTCTTTCAGCAAAACAATTCTATATTTCTGAGCATCTACATTTAGTATAGCATT
-TATATAACAGATCTAGAAATAGTATCAGTATGAAGAAAGATCTCTAGTTATAGTAGATAA
-AATATAGCAGTGGAAGGCCCAGCATACCATGGTTGTGCTATGCTCAAAAACATTTGGAGG
-AGCTAGTGTGGGGTAGGGATAAAGATTTTAAAAACAACTAATCTATCTCATAAAGCCATT
-ACATACATTTTCATATTTTTGTACTGATTTGTTACTTGTTTCTCCCCTTGATCTACCACT
-TTAATCTTACAGCTGCAGAATTATTTAGCCTAGAAATTAGTTTATGGTTAACTAAATCCA
-ATTCTTCCTTAGGCTAGTCATTTTCCATTGGTAATACATCCTGAGGAGGCTTAACTCAAT
-CTCTCAATACATTTGATCATCAGTATCAGTACCATCCTATGACTTATTTAATAAGGTGGC
-TGAATCTTACCAACAATAATAGTGTCACACTGTATAGCAATATAGTCATGGAACAATTTA
-GTTTCATTCATAGAACAAATTAGTAAGGCTTACGTAAGTTTTGCTATGCCTTCCCAACAG
-AAACAGTCCTTGCTTATATACAAGATATACTTATGGACAAGCATTGTTATAATTGTTAGA
-ATGATTTGATTATTTCTGGCTTCCATGTCAACGGAGGACAAAGACAGCCACCCCGTTTTA
-GTTTTCAAGCTTGGACAGAGACTGGTTTCCATTGTGTGATTTTCTACAGCAGGACCTCCC
-CACCCTCCTATGGGAGGTCACAGGTGATATTCAGATAGCTTCAGTCCCTACTAACTGTAC
-TGCAGAATATGTCTTATTCTGAAGCTCTAATGGGGCAAGAATAATTTGTAGTGCATCAAT
-GCACATTTACAAATGCCCTGAGAGGTCTTTCATAAGTTTGAAGGCCCATGAGATTCCCAT
-AAGTGTGTCCCTTTTTCCTCAGCAACTAGGATGTAGTGCTATTTCCCCATGGTTACTTTG
-ACCTTCATCTGTAATTAAAACAGTCAAAAGGCACTGTTGGGTCAGGGTACAAGCCCTTTC
-CCAACGTTGGATCTTAGCATTATCTAGCATTATTTTTGAGTCTACTTGTTTCATTTTAAT
-AAAGCCTCATCACTTTCTCAGGATGACCCTCATCTTTTGCCTTCCTCCTAGAAAAGAATT
-CTCTCCAATCTGCTCATTTTAGTTCAGTAATATTTCCTCTAGACTTCACTAAAAGGGAAT
-TCAGCTTGTCCCATGATGCCTGAACTGACACCTAATGCCCCTAAAAAGTCTGTTTTATGC
-ACAAATGTAGTTTAATTCACCATGCATGTTGTTGGCATTGTATACTTATGGCCCAAGTGC
-AGTTAGCATATGTGGTTTTTACCCCAAAATGCGGGTTCTTCATATATAGATTAGATGAAT
-TGTAGTCAAACTAGATCTAATTTAGTTTTTAGTATGTTTTAATGCCTTTCATAATCTTTT
-TTGTCTCAGGGTGGGGCCATTACCCCAGGGGAATTCAAGTCACCGTGTAATGGCTACTGC
-TTTAATCCCATCATGTATTAATTGCCATTCTCTCttttttcaactttcattttagattca
-ggggatacatgtgcaagtttgttacctgggtatattgcatgatgctgaggtttgggatat
-gaatgattttgtcacacaggtctgagcatagtacccagtagttagtttatcaaaccttgt
-ccaccgcctacccagtagtacccagtgtctattgttttcatctttatgtccatcagtact
-caatgttcagcctccacttacaacatatggtgtttggttttctgttcctgtgttaattca
-cttagtattacaacatccagctgcatccatgttgctgcaaagagcataatttcattcttt
-attatggctgcatagtatttgatggtgtatatataacacattgtctttatccaatccacc
-atagatgggcatgtaggttgatttcatgtctttgctattgtgaatagtgctgtgatgagc
-tataactgcatctgtcattttggtggaatgatttgttttcttttgcatagatacccagta
-atgagattgctgggttgaatggtagctctatcattaagttccttaagaaatctccaaact
-gctttcaaactggctgaactaatttacattcccaccaagagtgtaaaaatgttcagtttt
-ctctgcaacctcaccaacatctgtttatttgtttttcatgtttgagtaatagtcattctg
-actgttgtgaaatggtatccagtcatggttttgatttgcattgctctgatgattagtgat
-gatgagcatttttttcatatgtttgttgagcacttatatgtcttcctttgagaagtgtct
-gtttgtgtcctttgcccattttttccatgagtttttttttcttattgaattgtttaattg
-ccttatagattctggatattagatctttgttggatgcatagtctgtaaatattttcttcc
-attctataggttatctgtttactctgttgagagttttgtggtgcagaagtttaattaagt
-cccactttccaatttttggtttttgtttttttcaattgcttttgagaacttagtcataaa
-ttattttccaaggtgatgttgagaatggtgttttctaggttttcttctaggattcttttt
-tctttcttttttttttttttttttttttttgagatggagtctcactctgttgcccaggct
-ggagtgcagtggcgtgatcttagatcactgcaacctccacctcctgggttcaagctgttc
-tcctgcctcaacctcctgagtagctgggattactggtgcatgccaccacacctggctaat
-ttttgtatttttactggagaccagatttcaccatgttggtcaggctggtctcaaactcct
-gacctcatgatccgcccacctcagcctcccaaagtgctgggattacaggtgtgagccgct
-gcgcccagctcttctaggattcttaaagttttggatcttacatttaaatctctaatcgaa
-cttgagtcaatttttatacatggtgaagggcaggggtccatttcattcttctgcatatgg
-ctagccagctatccaagcaccattactgaattattgaatagaattattgaatagggagtc
-ctttctccatgataatttttgttgtctttgttgaagatcaaatggctgcaggtttgtggc
-tttatttccaggttctccattctgttccattggtttatgagtctgtttttgtaccagtat
-catgctgttttggttactgttggcttatagtttgaagttaggtcatgtgatgcctccagc
-tttgttccttttgcttaagtttgctttgactattggggctcttttttggtttcatatgaa
-ttgtagaatagattttctaattctgtgaaaaatgataatggcagtttgatagaaatagtg
-ttgaatctatagactgcattgggcagtttggccatttaaatgatattgattcttccaatc
-catgagcatgggatattttttcatttgcttatattatttattatttcttttagcagtgtt
-ttgtagttctcccggtagaaatctttcacctccttggctaaatatttgcaatgtatttta
-tttttcatgtggctgtcatgaatgggattgtgttttgagactttgctgaagttgtttatt
-aaatctggaagtcttttggtggaatcattagggttttctaggcgcatagaatcacattgt
-cagcttagagagctaatttgactttctcttttcctatttagacaccttttatttccttgt
-cttgcctgattgtttgggctaggatctccaattctaacagctttcagtggagtctaggtt
-tttctaaatataagattatgctgtctgtaaacagggataatttttttcttttactgttaa
-ttttcagagttttatattttatttattatgtgtagtctgcaaatacattctgtaaggtta
-ttgcttgtctttttattttcttaacagggtcttttgcagagcaaattttaagactttgat
-gaagttaaatttgtcaattactttttatggattgggctttttgtgtcatgtctaaaacct
-cataaccaagcattaagctccatagattttctcctatgttttcttttaaaagctttatgg
-ttttacatcttacatgtgattctatgaccaattttgagggcttttttttcatgtatgtgg
-ggtgtttaggtaagttaattttttttaacctgtggatatgcaactgttccatcacctata
-tttaaaaagattattcttccttcatttaattggttttatatctttgtaaaaaaaatcaat
-tggctatactagtatggttctacttccggattctgtattcttttccattcatgtatgtgt
-ccattcctctgctaatacaaatcttggttactgaagctatacaacaactttcataattgg
-gtagaattaatttctccgactttattctattttttcaagattgactaatccattctagct
-attttgcctttccatataaattacagaataatctgtgtatatttagaaatatcttgatgg
-cagtttcaagatggctgactagaagcagctagcgtgtgctactctcacggagaggaaaca
-aagtagcgagtaaatagtggcttttcaagtggatcgtctgggagaccacatcaggattca
-ccaaggaagtgagggaatcctcagagagcagagagtgaagcctggcagcagccgctcacc
-cgggaccagtgtggagcaagagaaattccctaacatggggaaagggtgagtaagtgagag
-tcctcaggggatccacatggatctttgcaatcctgtgcacaggagaaccccttggcccct
-ataggcctctagatcgacacaacatcctggagtttgtgtagacgcactgctaagggccat
-gtggagccccacaggccctggatccctgatcaacctggtgccagctgccatagccctgat
-aggggctgcagtcatggtgctgaggagtggtcagactgccctgctcctcctcaccaggca
-aggctcggctttggcttccagtgcaacagtctgcctccacctgaactctgcatgtgggca
-cactctacactcccctgggaaccactcagatggcggattgtgtgactcccattcccctgc
-tgctccgagccaggcaaggctagctggtttgggcttcaacacagcacctctgcccctacc
-tgaacactgtagtgggttgcagctttccattcccctggggcaaaactcacagaggtaaca
-gatAATGCCTGGCACCTTTGTGTGTTGCTAATAGTGAAGTTCAACATTATTGGATAGGAG
-GGAGGTGCAAGCATGCCAGGCATTCCACAGCTTCCAGTCTCCATTGCCCCAGCTAAGGGA
-TGGCATGCTCTCCAGTTAAAGGCCCACAGCACAACTGTCCTGCCCCTGCCTGAACATTTC
-ACCTGCGACCCAGAGCCTTTCCGAAAACCCACCCACCACAGGCCTGTGATATTCTTCTGG
-GTTCCCACCACCCAAGAATCCCACcttcccctgcctgagagtttggctggtgacccaggg
-accagcctgaaccccacccccaccccattacagtcagcacctgaaatctgggatagataa
-ccccagtccagccccttcagggccatgcacactgtccagcaggccttctggaggcctgtc
-agctgagaaactatcaatacccttccagtgctgttggcacctgaccaatttcctcagggc
-ctgaggttgggcctacccaaccagcaaacaccaccatgaccaacaccgacctgcacggac
-cCAAAGGTGGAGACCTTCCTTCTCAAAAAGCAGCAGTAATGCCCCATCATagaataagtg
-agccttaaagctatctgtatcaggttgagtgatgaggttataccctgaacaactctcatg
-gagaatcataaaacaagtgttccctgtggccctcaaccacattgcagtccagagatagac
-tatagtgtgcatctgaactaggagtcatgagccctgaaacagggtgtgataaggaaacag
-atcacatttctacctacctaggatggggagctggtgcagtcttctcgcccacaagcccct
-acagagacctcagtgcaggagttgctcccagccacgctcatcagagctggtgcctgtgct
-tgccattggtatactaatgggcaagccaggggcaccagctcttctcagctctgtcccacc
-atccccacagaacaagaagctcagtacatcaggcacccccactgtccagcccttcacctg
-aaacaactgagagcccctaatagtaaaaaaagatcagatctatacccatctgtttatggg
-acagctggctgttacttgcaaatgtcatctaccagtctataggtcaaactggacagccca
-tcaaaaaacctgctggtagaagtgtgtaggactatagaaacaaagccaaaagccctaccc
-aacacaatcccctccagataagaaggaactagtataagaattctgctgtcatgaaaaatc
-tgaatgtgtgacaccaacaaggttcactctagctctccaggagtggtcctagccaaaata
-gaagctgagagatgacagatggagaattcaaagcatagattgcaggaaaattctttgaga
-ttcaagataaggttgaaaatcaacacaaagaaacctgtaaagcaatccagagaataaagg
-aagaggtaaactcttaaaaataaatctatcagagctactgaaagtgaaaaactcacttaa
-gacattccgaaattcaatgaaaagttttatcaatagactagatgtagcagaagaaagaat
-ttcagagcttgaagatcagtctttcaaactaacccagtcagacaaaataaagaaaaagtt
-attttgaaaaatgaaccaaatcttcaagaaatatgggattatgtaaagtgaccaaaccta
-tgaattactggcattctcaagagagaaagaggaaaaagtaaacaacctagaaagcatatt
-tgagggaataattcaagaaaatttcctttatcttgctagagaggtagacatccagataca
-ataaattcacagaacacctgcaagatgctatacaaagtgaacatcatcaagacatagggt
-catcagacagtctaaggtcaattctaaagaaaaaatcttgaaggcagcctagagaaaagt
-gtcagatgagttacaaaggtgagcccatctggctaacagcagacttatcagcagaaaccc
-tacaatcccaaagagactgggggcctatttaaagaattctcaaagaaaagaaactccaag
-caagaatttcataccctgccaaactaagctttataagtgaaggagaaataagatcttttt
-cagacaagcaatcactaaggcaatttattgccactagaccagccttacaagagatcctta
-agggagttggagttctaaacataaagatggaagaacaatatctgccaccacaaaaccaca
-cctaagtacatagcacatagaccctttaaagctattacacaataggaactataaagcaac
-cagcttacaatttcatgacaggatcaaaatctcacatatcaatattaaccttgaatgtaa
-atggtcttaacaccccacttaaaggcacagagtggcaagttggatcataaaataagaccc
-atccatctgttgtgttcaagagacccatctcacatgtaatgacTACTACACTAATTTTAT
-CGGGTTTTTTTCCCCATTGCTTATAAGTTTCATTTTATGGTATGTTATTTTGATTGTATG
-CCAAACATTGGGTAAATGGGTTTTGGAGACTCCAAGTGATGTTATCTTCAAACATAAAAG
-GTCCTCCCTTTCTCCAGATAGCAAAGAGATAAGGACATGACTAATTCAATATAACAAGGC
-ATTAAGCTGGTTCAGGGCTGGGTTTCAGTATTAGTAATGATTCCAACCACATCTAGTTTG
-GTCCTGTTTCTCAGGAATAGCCCTCCAGGCTTTTTCTTCAGGGTCTGTTTGGTCTCAGTA
-TCTTCAGCCCAAAAAAACAATGAGGGAATTCTAGCTCTGTTCTTTATGGTTTTCAAACAT
-TGCTCTTCAGCCTCCTGATTCAGGCACTTCTGTAATGTCTCAAGGGGGAGACTATCTGTG
-TGCTTGAGGTAGGCTCCATATCACTATCATATCTGTTTCCTAAGCACTACAAGAGTACAA
-GAAATCTCTTACTGCCTTTCGGAAGTTTCAGCTGAGCTTTCCAACCTCTCACAAAGCTCT
-ACTTTTCCAATGCTCCATTGGGGGGACTAAAATTTGGGGCACCTGAAATTCCAATTTGTA
-ATTCCTAGAATCTCTGCTACTTCTGCTGATTCAATTACCTCCCAGAAAGCCTTTCTTTCT
-GGGCCAAGCCTGATTTCCCGTCTGTCCCAAACTGACAAAGGCACCCATGGGGGAAATGGC
-TGGCAATTATTGACCTACTCCAGAAACAGAAAGCCTGTTCTGTTCTCTCTTTAGAATATC
-AACTCTTCTAGTACCAGTAATTTCTCTGGTTCTCTAATGCCTTGGaaatattattttaat
-aaaaatCAAGCTTTTCTAGGTTTTGTATCAAAGGCATTGCTTTTCTGTGATTTACTGATT
-TCTCCCCAAGAACAGAACTTCTCAGgcccatttaatcttaacttaattgctgttatgttt
-ggctttaaattggccattgtttaacgtgatttacattttcctgagttttctatatttctc
-ttttttctcctttcttttaatctttctgtataaaccagatgttctttaattccattttcc
-tccccactagtttttaatgtattctccttttctattcatcatcactctagaaatgaagac
-atacattcttaacctatcaatatctaatattaaccaaaaatgtgtatttctcctcagaca
-atgcatggaatacaactccatttcacctgcctccagtttatattctattgctttatttta
-ctttcatataatactaagacaatattattgcatgcgtgacaattataggtagttctattt
-tctgggtgactccaacaagttatcattataaagtaacccattttcctctaagataatttt
-tgccttaaatactattttgttcaatactaagaagtaagataacttccttttgttggtatt
-tgcatgttaagtttttttcccatatttccactttcaatcttctccgtatcttgtttttac
-atttatctgttgtaaatagcatctaatttttcatccagtctagcaactagagttaatcca
-taaatttaccaatctctgaataatatatggaacatagaccactttaattctatttaacgc
-tcccaattgattctattttcagaattttgatatttaattatgtttttaatcttataaaac
-atctttatttaattctGCCAGTTTAATCCACTtttatccctttttttgttgcttcttcat
-cacatactttccatgtgtggtcatttttttaaactaaagaacatcctttagaatttcctt
-tcatgagatctgctatctctatctgaaaaggttgtatttatattttcttcttaaaatatt
-tttgtggatatggatttctaggatgacatttactttgaaaaatacgttgaagagctcagt
-ccattggattatggcttctattgtttgtggtgaaaaatcacctgtcagtgtaacaattac
-tctatcaaaagtatggtttctgtttttccctctgactgtttcccacttttctctttgtcA
-TTTTATCTAGATGACAATTCTTATTTATTTTCTAGAATAGTATTTCTTAGATTATTTCTG
-AAAAAAAAGAAGATTTATTATCTTTTCAAATTTATGTAGCtttttgtaattctttttctt
-taattttctttctccttctctttgaaaatcttattaatcagatattggctctcctggatt
-gacactctgtgtcttatatattttgctcatactttccacttgtttttagacttcaaagat
-tttctcactttatcttcaaatgtgcctgctaaacaatcatttttctaatttccaaaagtt
-tactacttctccttacatagcatgatattattgctttatggatggaataCACTCTTGAAA
-CTCCAGCCCCTAAATAATAGTTATTCTAATGTGCCTTTCTTCATTTATTTTCAGTCATGT
-TAAAGATTTTCTCAAATAGATAGCCAGCCTAGATTGTTTATTCATATTTTACATATATAC
-TGAGCCATTTTATGTGTGCAAACTTGTCCACAGCTTTTGTTTTAAAATGCTTGaactgtg
-aagatagaaaagacatgtttgctggaatgcataatactgaagtttacttctcatagtctt
-tctttagaagttatcgcctaggcagaaaaagaaagtaactaaaaaaaaagaaaacacaat
-ttccaggtatatctgtgccaactcaggtgactagtaaaacaaaattctaagatgacatct
-gtatagcctacataggaagcaaccagttcacattatagaaggaagaatgaatgttccagA
-GACAAAATATAGTTACAATACACCCTCATCTATTGTAGTAAAAAAAAAAAAAAGCTGAAG
-TCTAAATTACACAAATGTAGCAGCATAATACTATTAAATAATAAGTAATTTAATATTCTA
-TTTCATGGCATTATTTTACAGGAGCACTATTTGATCATCTTCTCTTTATCACACATACTT
-CTTCCATTTATCTTACAGTATCTTTACATAAACACTAAAATAGTTATACTCAGATTGTAC
-ACTTTTGAAGGGAGTTAGCCTATTTGTGTCAATTATTTACTAAAACAAAGCTAAATAACA
-GCAACAAAAAAGCCTTGTTGGAACAGGGACCAGGGGAATGATCAGAGCAATAAGTAGCTT
-GCATGAAAATATTATTAACTCTGAATACTTTCTCATTAACATTAACAGTGTGTCCTGCCT
-GTATATTTAATCCATTTAGAATTAAACTATTAATATATTGTGTCCTAGGATGGCAGAGTT
-ATTAAGCAGCCCCTGTATGCTCCAGGGGATATAGGTTGATATTCTTCAGCTGTCAAAATT
-CTTCAGCTGTCAAAATTCTTCAGCTGACTTAAATCAGCAGTAGTGGCGTTTATCACCAGT
-CAACAAAGTTCTTCTATCCTTCACTTCTTTAGCCTACTCATCTAATGGATGTTGGCACGA
-ACATGAAGTTTCTCTCCTAAATATCTATGATGTTCCACAAATCATGGGATATGCCTGCAG
-GCTGCCAGCACAATCAGATCTTCATGTTCCAAGAAAGGGATCATTAGTTTGGCCCTGCAA
-GATGTGCCACCTTTCTTGGAGAACTGAGTGTGCCACATGCAATCTGCTGAGGCATGAACG
-TGCTCTTGGCATTTCTGTTTATTTGCTCCTTATTACACTATATTGTGTCAGAATGATGGT
-TTGGGTTCAACAGTATGCTCACGTAAGCCACTATTCCAAACTTCCTAAACGCACAGTTGT
-GGAATGTGACACAATTGTTGGCAATGATATTTAAACAGGATATGTGTTTTTGGTGGGGTC
-TCTGGGAAAAATTACTAAAGGGAGGGGTGGAGTGATCCAAATATTCAAGTGGTAGACACC
-CACTTGACTTTGGccttccacttcctcctgtttggaatatggtcataatgctggaggtaa
-tgctgccatctataacaatgaagcaaaaacactggataacagtatgtgaacagaagagta
-gagggtgactagcatggtgaagctgttatataatttctggactTTATGTTATGTAAGAAA
-AATAAAACCTGAATTTGTAATAAATGAACAAAATGCCTTTTTCATGTTTTTCTGTTTCAT
-ATTACAGCCTATTATACTTTCTAACTGGCACATCATGGATTATAGATAGAATGTGATTTA
-GGATTAAACTCTCTTAAGTTTAAAATGTGTAGTTTTCTTCTCTCTTGTTCATTCTCTTAC
-TGCCTCCAGTTCATTTCAGAGCATATGAAAAGAGACAATAAGGGACTTTTAGCTGGAAGT
-TTACACTACATTACTGAGTAGGAGGAAAGTAGCTTAATAGTTCTATAAAGAGTATCATTA
-CAATTTTAAAAATAAACAAAAACATAAATTATATACCTGTAGTCTATCCTGAAAATATTT
-CCTGAAGTCACAGATTTGGAGTATTGTCAACTTGTGCAtaaacttcatgagaccatggac
-tattgtttttctcactgctttattcctagctccttgatcagaacaggcagagagaagatg
-cacaataaatgaataaatataataaatgaatGTATCCTTTATTACCTACGCAAACACATG
-CACACAAACACATCTATGAAGTTTTACATGATAGTATAAACACTGCTTTGGTGGAGGAAG
-TTACTGATTTTCTTTTAGCTTGTTTTCCACTTTATTTTTCTTTACCAAATAAGTTTCACT
-TTTGCTATTAGAATATAATAAATAACAGAAACCACAAGAACAAAGTAGCAGCTGAAAAAA
-AGAAATGGAAAATTCTTAATTCATATATGATTGCCTCTGTGAAACAAtgaaaagtggtca
-tccaatttcagtttgaacacttTTTTCCTCATAAAGTCATCCTATACCTTTACTCAAATT
-TAGTTTTAGGTGCATTAGGAGTTAAAAATAAAACATAAACCCATTTAAGAACCAAGAGAA
-TTAGTAAGGTAAATTACTTTGGTAAAATGCCCAAGTTCCAGGCTCTGCTGAAGAGAAATT
-ATTGATTCAACCTTAAAATatttgaagtctctggtaaggtgactttagctaaagctgcaa
-ccagctcaactacaaatcagactgactcactactctagcaacttgacagaagaacaatac
-tagacagaatattaattaccttttggaggtaattatttattgaaaactctactgaacttc
-tatatgtctggcataaaataaaggttatgacatatttttaaaaagaaagaagacataact
-cattgtccagagaggaaatgatcaacacccagccaatggaattatcaaccagaaactcaa
-agtaactctgatagaaatatgctagagaatatagtgggaaaataaacagtactggtgttt
-actgataaaatagagaattttatctatgagccaaaacaaagtaatacaaattaaaaattc
-aatatcagaaatggataattcattcaatgggctgaacagcagactgggagaagcaaagaa
-aacaatcacttcacttgaaactcaaatgaacatttgaatagaaatttcccaaatgaacac
-aaacacaaaaaagtaaagaaaaattgaatacaacatcagagagatgtgagatattatcaa
-ataattcaacatggatttaattggctcccaagaagaagggaaggagagaatgaagcagaa
-gaaataagagctaatagcctcctacatagcaaaattgatccaagaacttcagcaaggtct
-aattaggacaaattcaaagaaaatttctagacatagtggatttcaaactgctgaaaatca
-aagacagagaacaaatcttaaaagtagccagagaaaaaggacatgttatctaggaaggaa
-caatgacacaaatGATGCTGAGCTATTTCCAGAAAAATAAAAACAGCgggtgacatcagc
-aagatggcagaataggaagtcccagatctcatttccacatggaaacaccagtttaacaat
-agatgaacaaaaatatctttattagaattccagaaGAGAAggaaagaaattcaaagattt
-ctcataagaaacttcgaagggcaggaggaagtggcacaatatttttaaagtgcttcaata
-gtaagtctcaatccagatatctatgtccaagaaaatatccttcaagaataaggaccaaat
-aaacacattctcaaatgaaggaaaactgaaaaaaaaagggggggtcactagtaggtatac
-ctaaaagaacagctaaaggaagtcctccacagtgaaagaaattatttttttttttttttg
-agaaaggagtcttggaacataaggaaaaaagaagagagaaaacaaaaacatcagaaatgc
-aataaactttttacctactttttagttttctaaattatttttgacagtaacagcaaaaat
-tatccctctatagtgattctcagcataggtagaaaaaatatttaagtcaatgatattaga
-aatggggggttatcatagagatataaagggagataaaatctttatctgatgtggttaaat
-gatgtaccagtagactgtaataagttatggatatataatgtagcacagacaacaatcact
-acaaaagctatacaaagagatacacttgaaaacactatagatgaatgaaaatggaattct
-aaattatggaaaaatatctcacaaaatggcaggaaaaataagacaaagaagcaaaaagga
-aacaaaaacaaaatgaaagatttaagcattaatatatcaataatttaattaaatttaaat
-gatctaaacacacaaatttaaagatgaatattggcaaagtatgtttttagatgacccagt
-aatatgctatatacaagaaactcacatcaaatataatgatataaataggttataagtaaa
-agaatggaaaaagatataccatacaaatattaataaaaagtttgcaggagtgactatatt
-aatgtcagataaagtagacttcagaacatcaaaaaaattaggatgattttttgtcacctt
-tacatagtgacaaaaggtccaatacaccaaaaagatgtggcaaacttaaatttgtgtgct
-ccaaaacacaaagctgcaaaatatgtgaagcaataacagagagttaaaagagagaaataa
-gcaaaaacacagtcgggatatcaccacccacttctttccagaattgatagaacaacaaga
-aagaaaatcagcaacagcaatagaagagctcaacaacattaactacaggatccacgtggc
-atttaaggagcatttccactcaactagagcagagtaaatattcctttcgagctcagagag
-tgtatactaagatagactatatcctaggcaaaaaaaaaaagaagaagaagaaaaaaggat
-attcaactaattaaaaagaatttaaactgcacaaagtttattctctatatgattgacaca
-gtgaaatcaaactaggaatcaataccagaaataaaacacaaaaatctccaaacacctgga
-aattacacaacatgcttccaagtcaaagagaagtctcaataagaataaaatatacataga
-attaaataaaaatgaacatataacatattcataatttgtgctaaagcagtgccaagagag
-aaatttagaacaacaaatgcttatattacaaaagaagaaaaatgtcaaatcaataatctt
-agctctcacctgaattagaaaaataagagcaaattaaatgcaaagtaagcagaagaaaga
-acataataaagataacagcacaaatcaatgaaattggaaacagaaaaacaatagagaaaa
-tcagtgaaatgaaaagctgcttctttgaaaagatcaataacattgacacacttttagcaa
-gactgacaaagaaagacacaaatttccagcatgcggaataaaacaaagaatatcactaaa
-gaccctatggaaataaaaatgataataagggaatacgataacctttttttttttttttga
-gacagagtcttcctctattgcccaggctggagtgcagtggcacaatctcagctcactgca
-acctctgcctcctgggttcaagagattctcctgcctcggcctcccaagtagctgggacta
-caggcatgggccaccatgcccagccagtttttgtatttttagtagagatggggtttcacc
-acactggccaggctggtctcgaactcctgacctcatgatctgctcgcctgggcctcccaa
-agtgctgggattacaggcatgagccaccgcgcccagccaactaactctctatacattgat
-ttacttttttattttaaaatatccttgcattcccagtagaaaccctagttggtAAAAAAa
-aattattgtttgtaaacccttcttctttgatgttacgcatctacagctaaagatttcccc
-ttaagcaaggcaggagctgcatttcacactttataaaatgttgtattttactatcttgcc
-gttcaaaatacatattaattattcctataattttatctttaacacatggcttttacataa
-ttttaaatagtactttttaaattttaaattaaattttaaatacttttaaataataaaagt
-atgctagttaatttcaaaatattatgtttcttaacatcttatttttattggtttccaact
-taatactgatgtttttctagatatcacatttttaattgattgctattttgcaattatttc
-tgcaatattttagtgttttgacatttatagggacttctttaaagaatcaacactgtccat
-ctcagtgagcattccatgtgcatgtgaaaaaaaaacgggtattctgtaattattggaggt
-agtgttctatacatgttaattggattgaggtggttattcagatttgctacattctttttt
-ttttttttcgagacagagtcttgctctgtcaccaaccaggctggagtgcagtggcacgat
-cttgggtcactgcaacctccacctcccgggttcaagtgattcccttgcattagcctcccg
-agtagctgggactacaggtgcgcgccaccatgcccggctaattttttgtattttagtaga
-gacgggatttcaccatgttggccaggctggtcttgaactcctgacctcgtgatctgcctg
-cctcggcctcccaaagtgctgggattacaggcatgagccaccacgcctggccatttgcta
-cattcttactaaatgtttggtctagttatgctatcaataaccaacagtgaatgataaaat
-ttccaactgattgaagatttttctgttttcaagttacttttgtccatctttacttcatgt
-atttttaagttatattattagatacatcatgtctttctaatgaattgaccctttcatcat
-tatgaaatggccttcattatctctagtaaatactgcttgccttggagtcaaatacatcag
-atattaatataatcacTCCACAATTAACAAAGCCATCAAAAGTAGCTTGTATATCCAACT
-TATTCTCTGTATCGATTTCTTTCACTTTTGGCCTGAAAAATCTTTACTCactgaaaagca
-aagaatataaagaaaaaaaaaaggtaaagaatccaaggactgtgggaaaactgcaaaagg
-tgtaacctacatgtaatgggaataccagaaggagaagaaagagaaaggaacagaaaaaaa
-tatttaaaacaacaattgaaaatcttcagtgggagtataattagttcaaccattgtggaa
-gacagtgtggtgattcctcaaggatctagaaccagaaatacctttgacccagcaatctta
-ttactgggtatatacccaaagaattataaattgttctactataaagacacatgcacacat
-atgtttactgcagcactatttacaatagcaaagacttggaaccaacccaaatgcccacca
-atgatagattggataaagaaaatgtggcacatatacaccatggaatactatgcattcata
-aaaaagaatgagttcatgtcctttgcagagacatggatgaagctggaaaccatcattctc
-agcaaactaacacaggaacagaaaaccaaacaccgcatgttctcactcataagtgggagt
-tgaacaatgagaacacatggacacagggaagggaatgtaacacactggggcctgccaggg
-gtgggggggcaatgagaaagcattaggacaaataatgcacgtggggcttaaaacctagat
-ggcaggtttataggtgcagcaaaccaccatggcacatgcatacctatgtaacaaacctgc
-acgttctgcacatgtatcccagaacttaaagtaaaataaaaagaaagaaaaaaaaacttg
-agtaaaatgaaaaagaaaaagaaaattttccccaaattaatatcaaacatcaaaccacag
-atccaagaagctcagagaatactaagtaggataaatgcaaaaaaaaaaaaaaaaaaaacc
-taatcatgtcatattcaagctccatgaaacaaaatataaagaaagaatcctgaaagaaga
-caaaggaaaaaaTCTTATcataataatagtgctcatttctccaacaagacataacaatcc
-ttaatgtgtatgtgtctaaaaacagagtcaaaCAATgttttgatttgcatttccctgttg
-actagtgatactgagcatttttccatgtatatgttgaccatttgcatgtcttttgagaat
-gtctatttttgttctttgctcatttttcaaggatatcatttgtttttgtttctgtttttt
-ttgctttcagttgagtcccttgtttattctagtttgatacagtcccatttgtctgttctt
-ggttttgttgcctgtgcttttaaggtcttaaaatatttgcctagaccaaagtcctggagt
-gtttcccctatgtcttcttctagtagttttatggttttgggtcttaggtttaagtctcta
-atctattttgagttgacttttgtatatgatgatagataggggtctagtttcatttttctg
-catataaatatccagttcccagcaccatttattgaagagtgtgtcctttccccagtggat
-gttcttggtgcctttgttgaaaatcagttggctgtaaatatgtgaatttatttctggatt
-ctttattctgttccattgatctatatgttcatttttataccaacaccatattgttttgct
-ataagtactatagccttgtaatatattatgaaggcaggtagtgtgatgccacaaactttg
-ttcttttgtctcagaattgctttggctattttggctcttttttggtttcatacacatttt
-aggattgatttttctatttatgtggaaaatgtcattggtattttgataagaattgaattg
-aatctgtagattgttttaggaaatatggtcattttaacaaaattgattgttccttttcat
-gagcatgggaggcatttccatttgtttgtgtcgtcttccattcctttcatccgtgtcttg
-gggtattccttgttgacatctttctcctccttggttaaatttattcttaggtattttttg
-tagctattgtaaatggaattgccttcttgatttcttttttggctagttcattattggcat
-ataaaaatgctactgattttttagcattgattttgcattctgcaactttactgaatttgt
-ttatcaattctaagaggtttttggtggagtcgttaggtttctttaaataaaattatgtca
-tctgcaaagagggataagttagtttcctgtttcccatttagatactgtttatttcttttt
-ttgtctaattgctctatctagcacttccagtactatgttgaatgggaatgatgaaagtgg
-acatcttcttgtcttattccagttcttaaaggaaaggcGACTCTTgggggaggagccaag
-atggccgaataggaacagctccggtctacagctcccagcgtgagcagaagacggcgattt
-ctgcatttccatctgaggtaccgggttcatctcactagggagtgccagacagtgggcgca
-ggccagtgggtgcgcgcaccggcaccgtgcgcgagccgaagcagggcgaggcattgcctc
-acctgggaagcgcaaggggtcagggtgttccctttccgagtcaaagaaagaggtgacgga
-cacacctggaaaatcgggtcactcccacccgaatattgcgcttttcagaccggcttaaaa
-aacggcgcaccacgagactatatcccgcacctggctcggagggtcctacgcccacggaat
-ctcgctgattgctagcacagcagtctgagatcaaactgcaaggcggcagcgaggctgggg
-gaggggcgcccgccattgcccaggcttgcttaggtaaacaaagcagccgggaagctcgaa
-ctgggtggagcccaccacagctcaaggaggcctgcctgcctctgtaggctccacctctgg
-gggcagggcacagacaaacaaaaagacagcagtaacctctgcagacttaaatgtccctgt
-ctgacagctttgaagagagcagtggttctcccagcacgcagctggagatctgagaatggg
-cagactgcctcctcaggtgggtccctgacccctgacccccgagcagcctaactgggaggc
-accccccagcaggggcacactgacacctcacacggcagggtattccaacagacctgcagc
-tgagggtgctgtctgttagaaggaaaactaacaaacagaaaggacatccacaccgaaaac
-ccatctgtacatcaccatcatcaaagaccaaaagtagataaaaccacaaagatggggaaa
-aaacagaacagaaaaacgggaaactctaaaacgcagagcgcctctcctcctccaaaggaa
-cgcagttcctcaccagcaacggaacaaagctggatggagaatgactttgacgagctgaga
-gaagaaggcttcagatgatcaaattactctgagctatgggaggacattcaaaccaaaggc
-aaagaagttgaaaactttgaaaaaaatttagaagaatgtataactagaataaccaataca
-gagaagtgcttaaaggagctgatggagctgaaaaccaaggctcgagaactacgtgaagaa
-tgcagaagcctcaggagccaatgcgatcaactggaagaaagggtatcagcaatggaagat
-gaaatgaatgaaatgaagcgagaagggaagtttagagaaaaaagaataaaaagaaatgag
-caaagcctccaagaaatatgggactatgtgaaaagaccaaatctacgtctgattggtgta
-cctgaaagtgatgcggagaatggaaccaagttggaaaacactctacaggatattatccag
-gagaacttccccaatctagcaaggcaggccaacgttcagattcaggaaatacagagaacg
-ccacaaagatactcctcgagaagagcaactcaaagacacataattgtcagattcaccaaa
-gttgaaatgaaggaaaaaatgttaagggcagccagagagaaaggtcgggttaccctcaaa
-gggaagcccatcagactaacagcggatctctcggcagaaaccctacaaaccagaagagag
-tgggggccaatattcaacattcttaaagaaaagaattttcaacccagaatttcatatcca
-gccaaactaagcttcataagtgaaggagaaataaaatactttacagacaagcaaatgctg
-agagattttgtcaccaccaggcctgccctaaaagagctcctgaaggaagcgctaaacatg
-gaaaggaacaactggtaccagccgctgcaaaatcatgccaaaatgtaaagaccatcgaga
-ctaggaagaaactgcatcaactaacgagcaaaatcaccagctaacatcataatgacagga
-tcaaattcacacataacaatattaactttaaatgttaatggactaaattctccaattaaa
-agacacagactggcaagttggataaagagtcaagacccatcagtgtgctgtattcaggaa
-acccatgtcacgtgcagagacacacataggctcaaaataaaaggatggaggaagatctac
-caagcaaatggaaaacaaaaaaaggcaggggttgcaatcctagtctctgataaaacagac
-tttaaaccaacaaagatcaaaagagacaaaggcggccattacataatggtaaagggatca
-attcaacaagaggagctaactatcctaaatatatatgcacccaatacaggagcacccaga
-ttcataaagcaagtcctgagtgacctacaaagagacttagactcccacacattaataatg
-ggagactttaacaccccactgtcaacattagacagatcaacaagacagaaagtcaacaag
-gatacccaggaattgaactcagctctgcaccaagtggacctaatagacatctacagaact
-ctccaccccaaatcaacagaatatacatttttttcagcaccacacaacacctattccaaa
-attgaccacatagttggaagtaaagctctcctcagcaaatgtaaaagaacagaaattata
-acaaactatctctcagaccacagtgcaatcaaactagaactcagaattaagaatctcact
-caaagccactcaactacatggaaactgaacaacctgctcctgaatgactactgggtacat
-aaggaaatgaaggcagaaataaagatgttctttgaaaccaacaagaacaaagacacaaca
-taccagaatctctgggacgcattcaaagcagtgtgtagagggaaatttatagcactaaat
-gcccacaagacaaagcaggaaagatccaaaattgacaccctaacatcacaattaaaagaa
-ctagaaaagcaagagcaaacacattcaaaagctagcagaaggcaagaaataactaaaatc
-agagcagaactgaaggaactagagacacaaaaacccttcaaaaaatcaatgaatccagga
-gctggttttttgaaaggaccaacaaaattgatagaccgctagcaagactaataaagaaaa
-aaagagagaagaatcaaatagacacaataaaaaatgataaaggggatatcaccactgatc
-ccacagaaatacaaactaccatcagagaatactacaaacacctctacgcaaataaactag
-aaaatctagaagaaatggatacattcctcgacacatacactctgccaagactaaaccagg
-aagaagttgaatctctgaatagaccaataacaggagctgaaattgtggcaataatcaata
-gtttaccaaccaaaaagagtccaggaccagatggattcacagccgaattctaccagaggt
-acaaggaggaactggtaccattccttctgaaactattccaatcaatagaaaaagagggaa
-tcctccctaactcattttatgaggccagcatcattctgataccaaagccgggcagagaca
-caaccaaaaaagagaattttagaccaatatccttgatgaacattgatgcaaaaatcctca
-ataaaatactggcaaaccgaatccagcagcacatcaaaaagcttatccaccatgatcaag
-tgggcttcatccctgggatgcaaggctggttcaatatacacaaatcaataaatgtaatcc
-cgcatataaacagagccaaagacaaaaaccacatgattatctcaatagatgcagaaaaag
-cctttgacaaaattcaacaacccttcatgctaaaaactctcaataaattaggtattgatg
-ggacgtatttcaaaataataagagctatctatgacaaacccacagccaatatcatactga
-atgggcaaaaactggaagcattccctttgaaaactggcacaagacagggatgccctctct
-caccactcctattcaacatagtgttggaagttctggccagggcaatcaggcaggagaagg
-aaataaagggtattcaattaggaaaagaggaagtcaaattgtccctgtttgcagacgaca
-tgattgtttatctagaaaaccccatcgtctcagcccaaaatctccttaagctgataagca
-acttcagcaaagtctcaggatacaaaatcaatgtacaaaaatcacaagcattcttataca
-ccaacaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaa
-agagaataaaatacctaggaatccaacttacaagggatgtgaaggacctcttcaaggaga
-actacaaaccactgctcaaggaaataaaagaggatacaaacaaatggaagaacattccat
-gctcatgggtaggaagaatcaatatcgtgaaaatggccatactgcccaaggtaatttaca
-gattcaatgccatccccatcaagctaccaatgactttcttcacagaattggaaaaaacta
-ctttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaa
-agaacaaagctggaggcatcacactacctgacttcaaactatactacaaggctacagtaa
-ccaaaacagcatggtactggtaccaaaacagagatgtagatcaatggaacagaacagagc
-cctcagaaataacgcccatacctacaactatctgatctttgacaaacctgagaaaaacaa
-gcaatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgt
-agaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatt
-aaagatttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacc
-attcaggacataggcgtgggcaaggacttcatgtccaaaacaccaaaagcaatggcaaca
-aaagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaa
-actaccatcagagtgaacaggcaacctacaacatgggagaaaattttcgcaacctactca
-tctgacaaagggctaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaa
-acaaacaaccccatcaaaaagtgggcgaaggacatgaacagacacttctcaaaagaagac
-atttatgcagccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatg
-caaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaag
-tcaggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttgg
-tgggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatcta
-gaactagaaataccatttgacccagccatcctattactgggtatatacccaaatgactat
-aaatcatgctgctataaagacacatgcacatgtatgtttattgcggcattattcacaata
-gcaaagacttggaaccaacccaaatgtccaacaataatagactggattaagaaaatgtgg
-cacatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgta
-gggacatggatgaaactggaaatcatcattctcagtaaactatcgcaagaacaaaaaacc
-aaacaccgcatattctcactcataggtgggaattgaacaatgagatcacatggacacatg
-aaggggaatatcacactctggggactgtggtggggtgtggggaggggggagggatagcac
-tgggagatatacctaaggctagatgacgagttagtgggtgcagcgcaccagcatggcaca
-tgtatacatatgtaactaacctgcacaatgtgcacatgtaccctaaaacttaaagtataa
-taaaaaataaataaataaataaataaataaaaaaggaaaggctttcagcttttcttcatt
-caatatgatgttagctgtgtgtttgtcacatatatgacctttatttattttatttatttt
-atttttttgagacggagttttgctcttgttgcccagggtgtagtgcagtggcacgacctc
-agctcactgcaacctctgccttctagtttcaagtgagtctcctgcctcagcctctcgagt
-agctgggattacaggggcccaccaccacacctggctaattttttttgtatttttagtaga
-gacagggtttcatcatgttggtcaggctggtctcgaactcctgacctcgtgatccgcctg
-cctcagcctcccaaagcgctgggattacaggcgtgagccactgcgcctggccatatgacc
-tttattatgttgaggtatgttccttctgtgcctagtttgttgagtttttaatcatgaagt
-ggtgttgaattttatcaaatgccttttcctgcatctattgagatggtcatattgtttatg
-tccttcattttgttgatgtgtcatgtttatcaactggcatatgttgaatcatttttgctt
-ctctgggataaatgccatttgattatgatatattacctttttgatgtgctgttggatttg
-acttgctagtattttgttcaggatttctgcaggatttcatcagggatattggcctgtagc
-ttctttcgttttgttgtgttcttgtcaggttttggtatctgagtaatgctggcctttaga
-atgctatagggagaattccttcttcaattttttggaacagtttgaggaggattcatgtta
-gttatttatacatttggtagaacttggtaaaccagtgaatccttctgatcctgggctttt
-cttcagagattttttattacgaattcaatcttatcacacattattggtctgttcaggatt
-tctgtttctttttgatttaatgttggtggctggtatgtgtgtgggaatttaccttttccc
-ctagattttcctgtcagtgtatacttgttcataatagtctctgatgatcttttgtattct
-gtgatatcatgtgtgatgtctccttttttcttttctgattttaacacacaaaagtataaa
-tcactggtacagcaaatgcataaatgaggaaaagacccaaatgttaccactacagaaaac
-cactaaaccataattataaataagagagaaaaaaaaggctatacaaaacaaccaaaaact
-aattaccaaaacgacaagaaaaagtcctcatatataaatagtaagtttgactgttaagtg
-gattaaatattccacttaaaacatataggctgtctgaatgaattttttaaaaaagtgacc
-cagtaatgtaatgcctacaagaaactcacttcaactgttaagacacatagactgataata
-aagggatagaaaaagatatctcatgcacacagaaaccaaaagcgagcaAAGAGACGATGG
-CAGTACGTTCAGGTAGgagataagcttccatgacctcagctgccaccattccccacaatg
-ccccagctacccaagagaccctgagcccactcaactagtacattacttgtacaagtagta
-cgttactactatagctggcatttgagagagccactacagtaaagctatttgcaaccaagg
-aaatcataaaaagtctacataactcctcgacacgcccatcagggctaatgattgtggttg
-ccattgggaaacctgagggcaagcctgccccatcgagctgtgcccaactttgcccccact
-ttggggctgagaatggagcccatgccactgtgcattccacagacagaccatttcctgaga
-caatactgtttctcccagtaaacaaagatcaaatataaactccctgctatcaccgcatcc
-agctcttaactgcaagtgccacctactggcctggaggtcaaactgcacaacccgatagaa
-gtgttgacataagcgtacagtgctcgagaaaaagataagcgtctcaggacctctgccact
-caagatctgcaggagactgtgagcctcatcacatgcctagtacatcactactacaactgg
-catttgagaaagtcaccgcatgaaggctatttataaccaaggaattcatacagagTATAT
-GCCATTCTCCCCATCATTACCACAAgtgctggtgtttgtgcctgccaatgagctatttga
-aggaaagtttgacagtttagctccacccagctttatcctccccttaggggctgagcaggg
-agctcaggccagtgtatattccatagactgtcccttgcctgaggcaacagagagcttctc
-cccgtaaacaaagatcaagcatacacccacctgcttctgcccagattttattcataagca
-ccacatagtagcctggaggtctaactacacaacccagtaaaaaactggcttacacaagtg
-cacagcacggggaaacaagttaagcttcctaagacttctgcactctagccctgcaggagg
-cagtgagcctagcccagcacatcactactacaaccagcatttgagaaagccaccacacaa
-aggctatctataatcaagaaactcatacagactctttgccactgaaagcacccagaacca
-aggccaaataaccctacacaatgtatattataatcacatcctcaagggggaaaaagtcct
-gaccaaatgaaagtaaatttaaaaataagaacagatagttgatccaaatgagaaggaacc
-caagaaacaattctggaagtataaaaaaaagagtgttacaacaccccaaaggattgcact
-aactcttccacaatgaaccctaaccaaaatgaaatctttgaaataccaaagaattcaaaa
-tattaattttaaagaatctcagtaaggtccaagagaaagtaaaaaatcaatacaaatcag
-aaatataactcaggatatgaatgaaaaatctactaaagagatggattttttaaaatagtt
-tttttgttgtttgtttgtttgtttgttgttgttgttgttgttgttgttgagatggagtct
-tgttctgttgcccaagccagagtgcagtggtgcgatctcggctcactgcaaactctgcct
-ccagggttcaagtgattctcctgcctcagcctactgagtagctggaattacaggtgtgtg
-ccactacgcccagataatttttttttttatttttagtagagacaaggtttcaccctgttg
-gccaggctggttttgaactcctgacctcaagtgatctgcccaccttggcctcccaaaatg
-ctgggattacaggtgtgagcccactgtgcccagcctaaatagttttttcaaatgaacttc
-tgtaattgaaaaattcatttaagaaattacaaaatatagttgaaagctctaacaatagac
-taaaccaagcagaagaaagaggttcagaacttgaagacaagtctcttatgaattaaccca
-gtcagacaaaaataaagaaaaaaattttaaaaatgaacagagctttcaagaagtatgaga
-ttatgtaaagtaactgaacctatgagtcacaggtattcctgaggaaaaagaaaaagtgag
-aagtttggaaaaactatttgaggaagtaattggggaaaacctctttagtcttgctagaga
-tttagacatctaaatgaaagaggctcaaagaatgccaggaagatacattgcaagacagac
-ttcatcaagatatgtagtcatcagactatctaaagtcaacatgaaggaaaaaaattctaa
-aatcagcaagagaaaagcatacagtcatctataaaggaaatcccatcagaataacaatgg
-gcttctcagcagaaaccttacaagccagaagagattggatctaatttttggacttcttaa
-agaaaaaaaaacctgtcaaacacgaatgttatgccctgctaaactaagcatcataaatga
-aggggaaataaagtcaagtctttcctgacaagcaaatgctaagataattcatcatcacta
-aaccagtcctataagaaatgctcaaaagaattgtaaaagtcaaaattaaagttcaatact
-caccatcataaatacacacaaaagtacaaaactcacaggttttataaaacaattgagact
-acagagcaactaggtaaaaaattaacattacaacaggaacaaaacctcatatatcaatat
-taactttgaataaaaagggattaaattcccccacttaagagatatagattggcagaacag
-atttaaaaacatgaactaactatatgctgtttacaagaaactcattaataaagacatgag
-ttcaggtaaaggggtggaaaaagatgttctacgcaaacagaaaccaaatgagagaaggag
-tagctatacttatatcagataaagcacactttaaatcaacaacagtaaaataaaacaaag
-gaggtcatcatacaatgataaaaagatcaattcagcaagaagatataaccatcctactaa
-atacatatgcacctaacacaagactacccagattcataaaacaaatactactagacctaa
-gagggatgagaaattacctaattggtacaatgtacaatattctgatgatggttacactaa
-aagcccatactttactgctactcaatatatccatgtaacaaatctgcgcttgtacttcta
-aatctataaaaaAATTAAAATTTAACAAAAGTAAATAAAACACatagctaaaactaaaaa
-agcaaaaacaaaaactatgctaagtattggtaaagatgtggggaaaaaagtaaactctca
-aatattgctagtgggagtataaattgttttccactttggaaaacaatttggtaatttcGt
-ttttttttttttcttttctcttttttttttttttttttttGCATGCCAGAAAAAAATATT
-TACAGTAACTATGGAACACAAAGGTTTATTACATCCATAATTAACATGGAACATTTACTT
-ATCAGTTTGACAAGGACAACACTGAGACCTCTTAGGACAGAGAGAAAGGGCAATTTTCAA
-AGGAAAAAAGCATAGTATATGCATATttaataagtaaaacatacacataccctgtgactc
-agccattgtacatctagctgtttatccaagagaaatgacagcatatggctacacaaagag
-ttgcacacaaattttcaatggcagttttatttgtaatagctaacatctgaaaacaatcat
-aatgttcattagggggtaaatggataaatgatcatatatgcataaaaagtaatacaagca
-ataaaaaggaatgaactattggtacacgaaacatatatgattcaaaataattgccttgga
-tggaaaaagacaagcggaaaagtatacatgctatattacttcatttatgtaatattcaag
-agaatgccaagaaagctacaagaacaaatagcaggtcagtcgttgcctgggtatcatgga
-ggtagagggagggaagggaagaggaaagagtggatgccaaagaggaatgagaaacatttt
-gagagtgaaggatatatacattatgttgattaaggtaatggtttcaccagtgcatctttt
-gccaagttcatcaaattatacactctaaataatgcagtttaatgtacatcaattatatct
-caataaTTTGGAATGAAAAAAAAAAACTCCTCACAAAGAACAAAACCTCTAGGACCTGAT
-AGCTTTCAGTCACAATATAGTCAGGCACTCAAAAAAAAACTTTAACACAATAAAATTCTC
-TTTGAATGCCACCTTAAACTCAATCCCATCCAGAGAAAACAACTTTTATTAGAATGACAT
-GTGATTTGCATTTTTAGTTCATGCATTTACTTATATACACATAAATATAGCTTTTTCACA
-TAAATTAGAATCATTGCTATGCATGTTGTTCTAAAATGTTGCTTTTTCACTCAAAAAATG
-TTTAGTAAGATAAAATCTGCTGCACTCTTTTTAACAGAAGCACAGAATTAAATCATATGG
-ATGCACTTCGTTTTATGCTACTCTACAGAGTGACAAGACTTCTTTGTGCATTTATCTTTG
-AGCACTTATTTATTTCTTTGTAAAAGGCTTTCTAAATTTCCAGATCATCAACAAAGCATT
-AATTTGGTCAGTTAAAAAACAATTGCTTATATCCTTCTCTGAAAAGAATGATGTACAGAA
-AAGAATTATATATATATATGAATAATACATCATAAGTGTTCAGAAAGACATTGTATTTTA
-GGTGGAGAGACAGGCAGGTGACCAGACTGCTACATGCAGTAAGATGAACCCTGATAGAAC
-TAACACTGGAGGCTGTGAAAAAACTGCTAGGAGCACCCAGCCTTGGTAGAGCAGCATAAT
-TTCTTCCTGTAATTCTTTCTCTCCAAATTGCCATACACTTCAGCAGAGTTTGCAACTTCT
-CTTCTAAGTCTTTATCCTTCCCCCAAGGCATGCCTAGCACAGGACTCTTGAACAGTGATG
-CCTCAATTAGAGTTGCTAGCCAATAGATTGAAGCTATGTTGGCACAATATCCTACATCCT
-CCCGATCTACTGGCTGAGCCCAACCCCACCTAAGAAGGACAATAAAGATCTGTGTTCAGA
-GTCATACTGAATAGAGACTTCTGGACTCTATAGAACCCACTGCCTCCTGATGAAGTCCCT
-ACTGTTCACCCTTGCAGTTTTTATGCTCCTGGCCCAATTGGTCTCAGGTAAACAGAATCT
-TGGGGAAGAAGAAACACTGGCCTGGAACAGGGTCCTGCACATGGAGTCCCTGTTTCTAAG
-TGGTCTGTGGAAATGGGGTCTGGCTTCTCACTGGGAGCAGGGCTGAGATTTGTCCTACTT
-CTTCAGACCACCTCTGTTCTAAGAAACTTGAAGGCTCTCAGGATAGAGCAGGATCTGTGA
-TCGGAGCTGGGGAGGAGGGTAAGGCAAATCCCATACAGTTGCCTCCAAAGGTAGAAATGA
-TCTTGAAATCCCAAACTTCTATCCTGTCACTTCGGGTCAGTCCAGTCAAGCCCTGCCTCA
-TTTCACTTTTGTTTTTTTTGCTGCCGATATTCCCTCCTGAGGTAACAATTATATAATATT
-ACTTCCCCCAGTTTTCTTGGTCTTACAGAGAGGTCTCTGATTTTTTGTTTGTTTGTTTGT
-TCTTGGATGTGGTTAACAGAACAGGAAAGGCTGTTTCTATATATGTATAGGACTGTAAAA
-TGGAAAATGAAAAAAAAAATTCTGTGTGGGAACTATTGGAAGTCTATATCAGATTTCAGC
-TCTGTTTGTGTAAGCATTTCTTATTTTTAATTTATTCTGTAGCTTATATTTACAAAACCA
-AGACAAGAACACTGAAAGTTATTTAGAAATAAATTGGCCACATTTCATCACTGCTTGCAT
-TTTTTCACTTGTAACCAactgatatatgagcttataacctgctttatttttttacctacg
-attctatcaggaaaattttcacaggtcttgaatattccttgaaaatacaatttgcagtag
-atgcttataattctgtcatatttttgtaccaatattaacttggaaagtccttaattgtgt
-gtcatttggattattttttctaatgtgtgagtactgtaaataacattgtacaaccttatt
-aatatatcattgtgagattctctgtttgtataggtaaattttagaagttccattgcttgg
-tacaagggtattatttcttctaagttaactggcacatattgccaaTGGTTACTATTGGAG
-TATTTGTATTTTTAACATTTGTATTTCATATTTCTTGCAAATATTTTCAAACATATTGGT
-TGCTTCTAAAATGCATTATTTATTTGAGACACATAATTTTCATTTTCATGTCAAATCTAT
-TGGTGTTTTCTTTGCATTCTTCCACTAACTTAGTAAGTCCTTCTCCGTGTTGAGAACAGT
-TATTCACCTATGATTTTGTTTTTTACACCGGACTCAATCCCACCTTTTTACATAAGGCAC
-AATGAAATAAACTAATATTCTTTAGTATAATTTCCTAATGGGTTATATAATAACTCCATA
-GCCCGCCTCTAGAGATAGTAGTTTATATTCCCTAATTTGCAGAAATGTTCAAATTGATAG
-TGGATAAGAGGAAATTATAATGCTCTCATGGTTGTCTCAAAAGATGTTTCAGGCCTATTG
-CATCCTTGAAATTCTATGAGTTTAAATTGCCTGATTTCTCCCTCTGTCTCTGGAACATTA
-GTGACATACATCGACATACATCACATACTTGTATGTTGTCCTTTTTCTACACTTTGTGTG
-TGTGTATATATATTCTAACATATACATATATATAATGTTAAAAACTCAATCATCAGAGGA
-GGATTAAACAGCTGATAAGGGATAATAGTAGTGGTAATAGCATTCAAAAACGTTTGCTCT
-GTTCACTTACTGTCAAttacctcatatttctttcatttattgtacttatcacaatctgta
-gttattttgtttattcatttacttgtttattttctttctccccctctccaatgtaaggtc
-ctcaaatcatgtctttctgttcattgttttattccctgcatcttgcagaattcttgacat
-ggtaggcactcatcatatacttgttgattaagtACAGTAATGAGTTAAGCAAGGTAAGAA
-AGAGCTCCAGCGTCACTCTAGGGCCTCTATGTGTTAAACCATGTGATGAGATATTTTCAT
-ATGTATATAATATGTACACATATATAGGCAAACCCTGCAGAATGTCTCCCTAATGAATAT
-ATTCCTAATGGAATGGCTTTTTTTATTCTCAAAATTTTGTAAAATGTACTTATATCTCAA
-TATCATATAGGTATATAGGTATAGATGAAAATTTTTTATTTATCTTTCCATAACTTGACA
-TGACATTTTTAACCAGATAATATGTAAGATAAGCCTAGAGTTATCTTCTAAATATAATTT
-TTAGGATCTCAGAAACATGTAAGGGACATTTTGAAAATCTCACCAATTGGCAACAAAAGC
-CATATGTGTTTCAGTAATGGTGAGAAAGATGACAGCAATTATTTTAGCATTTCTTATTTT
-TGAAATGATAGTTTTTACTTCTGTTTAGGTGTTTGTGTTTTAGCTACATTTTAGGAAATT
-GCTTGGGGATTTTGTGTTCATGTATAACAACATGCTATATATTTTCCCATTTAAAATCAT
-GGGGAATTGGCCCCTGGTAAGTGTTTGTATACAGAATTCTGATTTCAGAAATGAGAATCT
-CATACATATCTAAAGAATTCTATGTGTGTTTATAAAATTTCACTTAATCCTCAAAGTAGG
-TATTTATGATTAGGAAAAACATGCTAAAGCAACTGGAAAGGCACTTGAATAAACAGTGCT
-CAAAAACTATTGCTATTTTTTATCCTCCTGTGATAAATACTTAGGCTTAATAATCTATAT
-AATTCCTTTATTCAGGTAATTGGTATGTGAAAAAGTGTCTAAACGACGTTGGAATTTGCA
-AGAAGAAGTGCAAACCTGAAGAGATGCATGTAAAGAATGGTTGGGCAATGTGCGGCAAAC
-AAAGGGACTGCTGTGTTCCAGCTGACAGACGTGCTAATTATCCTGTTTTCTGTGTCCAGA
-CAAAGACTACAAGAATTTcaacagtaacagcaacaacagcaacaacaacTTTGATGATGA
-CTACTGCTTCGATGTCTTCGATGGCTCCTACCCCCGTTTCTCCCACTGGTTGAACATTCC
-AGCCTCTGTCTCCTGCTCTAGGATCCCCGACTCATTAAAGCAAAGAGGCTTATTCTGGTG
-TCAGTTTTCTCTCTACAGCCCCCTTCCCACTTTCCCTCCATTCAACAGTGTCTGGAAGGG
-CACCACAATTTCACTGCACTCGCATTTCTATGGTAGAAATGCAAATAAGATAGGGGCCAG
-GAACAAGGGAGGGTTAGTCCAAAACACCCACTCAGGAATGATAGATAGTAGCAATGTCCT
-CCTTGAAGACAGTTCTAGGCCCACAGCTTGCCATAGCAATTATCAtcaaacttcatgtac
-atcagaaacacctggagagatggctaaagcacagatttctagggctcacttttagtttcc
-aattctgcaggggagcttgagaatttgcactgctcacaagttcccaggtgatgctagggc
-tgctggtccaggcaccacactgtgagaacAATTAGCTTATAATATGAAAGGATTGAAAGC
-CGACTGTGAATGTGATTTTCTACAGATTGAAGGCTGCATTTCCTATGTAGTTTTGGAGTA
-GATAGTAATACAAAatcatcctacagaatcctccgacaacaacctgagaatgtaggtatt
-ataacctcactttagagaataggaaactTGATTTCTAAGCATTAGAAGACTGGGACAGAC
-TAAATTGACTACTGAGAACATTCTGTCACTGCACCATGAGGTTGCCCAATTTTCTTCTCA
-CCCTGGAAATCCTCATTCATAGCTTCCAACTTAAATATGATGAAAGGGAGATCAAGAGCT
-CTATAATGTGTCCTGAATGTTAGGACAGGCACTCATCCCAAGCAATAGAATGTTTTCCGT
-ACATTACATTACATTGATGCTCTGCCTGCACCAATAAGAGAATATGACTGGGTGTATCAT
-AGTCATCCATCCATGCCTCAGGCCCACTTCCCTGATAGTTGGACAGGGAGAATAGGGAAT
-GCAGATGCCTTCGCTTTCTGGACACTTACAGTAGCTGTGTTTGTCTTTGTCATCTCAGTT
-TGCTCACTTATGAAATGCTAGCGTTTTACTCAGTATCTTTCTCCCCACCCCTGTCATAGT
-ACATCTTTCTGATTCTGAAGATATAAGATTGGCTTATGTTTTGTGGGGTCAACTTCACCT
-TTGACCCCATAAGATCCTAGAGATTTAATGTAGATATATAAAAGTTGGAGAAAACATTGG
-TGGAAGGGTTTTCTCCACTATAGACACAAATCCATGAGTGTCATCACAGACTCCTTTTCC
-TTCTTCACTTGATTCCAGTGAAGATCCATGTTCAttctaccacctccaatatgtaccatg
-acctctatctccagctgctgctaggatgattgcaatagccttcccattgattgccctgca
-ttcctttcacactcacgcctaactatcctccacaatgagagccagaatcatttttctgaa
-acacagatctaatcattagactcccctctggcatcttttcccatagcatcctaagacaac
-tcttcagagcagccttcatcactcttggcattcagaacctgccttgcgtttccagtttta
-cctccaaagcactgtcacagggcatcttgctatcccaccaacatacctcttcgtgattgg
-tttgaactcactggattgcttctggttttgagtttttgtacatacttttctgtctCCATT
-TATAACTGCCTGGAAAAAAATCTTTATTTTCTTCTGGAGGACTTTGATAACCACACTGTT
-CTACCCACAATAGAACTACTGCCACCATTTGTGCTCCACTGTTATGACTTACCCAGAATT
-TTAAGTCATCATGTCACATGCCTCACTCTGAATATCTGCTTATGTCTTCTCCCCTACTGG
-ACTTTGAAATTTTATTTAGGAACAGGAACCATCTTATCTTCTCTTTCTCCTACCATCCCC
-TAACAAGATTCTATATTAATTCTTGTTGAATAAGTAAGAGGGATTCTCGAAGGCCAGAAA
-GATCTTTGGATGTTACTGAAATCTCATTTTTATTTATTTTAGATCTTCTCCAGGAAACAG
-GCTTCTGTCTCCTTTAGAAGACATATCTATGATCTATGTCATTACATAGTAGAGGAGTTT
-TGAGAGGTGGCTTGTCCCATGTGGTAGGACATCATTGCCTCTTACACCCATGCTTATCTT
-TGCAGGCAGAACTCATGAACTCACACAAGAAGGTGGGCAGATGGAAGCAAGTTACTTCAg
-cagaggagaatagtaggaaaaaaacataactttagagctggatgtatctgaggtcattca
-tgatcccaccatatatccactcttggaccacagacaaatgatttcccatcttcgagcctg
-ttactgaatttgaagaacagagaaaatactcactcccactcaaggtactttgagggttgc
-cagagtaatctattaaaatgttaatcataTCATAGGGATTCAGCTGTAACAGGTTGTTCC
-CTGGATAAGAAACAGTACAGCACATTTCCCCAGGGCCCTGCCCACTGGGCCTTGGCTGTC
-TTGCCTGAGTATGGGTGATTATAGCCTATGTTTCACCTGGGGGAAGACGCATTAGGCTGA
-GAAGAGTGTAACAGAGTTGAGGGTCATGGGATCTCTTTGAACAGCCAGATGAGATTTTAA
-AGGTTCTAGTAGAACTTGCTGTGCTTACTTTTCAATAATCACCTTGATCACTACCTTGGA
-AACATCTTAGAGCTATTATCACATTGATTCTAGACGATGAATATAATCTCAGTGCTGCAG
-CCTGAAACATTGTCCTCCTGTCCTCTTGCCTTATATCTCATCCGTCCTTCACGCAGTGCT
-GGAACTTAGGTGGCAAATATTCTTTTCCCACTTTGGAGTTGACTAATGGCATTAGGAGGC
-CAAGGGAAAAGGAATCTTTATGGTGAGAGAAACTGCAATGTGCCAAGCACATTAATACAC
-AATTTCTTAAACAAAAGCATTGTATGATAATtatgacaacatgattaaagctgaggaacc
-tggagtaaaatgtatctagggttacatctaggtttgttccttactacttttactcatcat
-gtggtctctatatcaatttcttcatttgcaagacaggtataatcatgcatctacctctta
-gaatcactctaaaaattaaaatagataaggcatataggtcaccgtgatctctagcaccaa
-tgaaattctaagaaatgtagatttTAAAAGGCATATGAGATATAGGTTATTCTGGTTTAA
-AATATGAAACGTTTAAAAAATAAAATATGTAAGTCCTGAGTTTCCGGGAGAAAAAGGGTC
-TTGCACAAGAACAACCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCCGCATCTCTA
-CCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCC
-GCATCTCTACCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTT
-CTCAAGGCCGCATCTCTACCCCATCTCATGCGAATCCTGACGACGTCCTCAAAGCTGAAT
-AAATTTTTGCCTTAAATAAATTAAACGAGATTTAGATTTCACCAGTCACTGATACTCAAT
-CCCAATTGGATATTCATTCAAAAGTCTGACTTCTCTCCTGAGGTGAGAGTAAGATTCCTG
-GGCACTTTTTCATAATACTTACCTTAACCTAGCTAAACACAATGGACACTCTTCTTTGAG
-gtgtcagtggaaattaagaggagagtctgaactcttacctcccacatggggcttgcagac
-aggtgaagatggcgctcctcccctttgttggtaatggagacctagaagaaaggctgggca
-tccagctcccacgcagtcatatgaagcagcccagagcaacattccccttcactgcctgtg
-cggtggcagtagagacctagcAGTAGAGACCTAGCTGGGAGTCAGATCTCCCATCCCTCA
-ACCAGTGGTAGTGATTGGCCTGGGgaggaatcccttccctgctggtgccatgtcagtgaa
-aactgaggggagactgaaattgcccttccttccaatagtataaaaggcctgaagcagact
-tcccttcccagccagtacattaccattgaagaccaaggggtggtctcaacttcaatccct
-aGGGAGCCGTGGCTGGCATCAACCCTCCTTCCAGTCAGTGAGGATAGAGGATAGGAGGGT
-GCTGGAAAATAGGTGTCTTTAAAACTGAATAATGTTGTTTTTACCACAATTTTAAAAACT
-GAATAAGAAGACATGGCAGACCCCTGAAACTGGATAACTACACACGGAACTAACCAGAAT
-TAACATGCAGAAGGTTTGAGAATAGAACTGCAGTGGGGAATACCACCTAGATTTTTAaaa
-taacaacttgtatatatttaaggatatatgcaatatgatgttttgatatacatagacata
-gtaaaatgattgctataatcaaattaacatatccttctcttcacatagttatcatttttt
-gaggagacagcacctgaaatccatcttcttagcaaatttctagtatacaacaccatatta
-ttaactagagtccccatactgccctttagctctctagactttatcctacacaacttcaac
-tttgtacccttcgacgagcatccccccatttcctccaccacccgccccacccctgataat
-cactggtctacactcttctatgtatttgaatttttaaattccatgtataagtgagatcat
-gctgtactttttttctgtgtctgtcttatttcacttagcataatgtcctctgggttcatc
-catgttgttctgaatggcaagctctcctttgtcaaggctgaataatatgccattgtatat
-atatacaatttatttagtgtgttcatctatcgatgtcgatagatgataatgtcttcatct
-atcagcttaggttgatttcatatcttggctattgtgaataatgctgagcacagatatctc
-tacatggtgccgatttcatttctttttggtatataccaagacgagggattgatggctcat
-atactagttctgtttttatttttttgagaagcctccatactgttttacatcattgttgta
-ctaatttacatttccaccaacagtgcgcaaaagttccctttacattctcaccaatacttg
-tgatctcttgtctttgtgataatagtcatcctaacaagtgtgaagtgatttctcattgtg
-cttttgatttgcatttccctgatgattagtgatgttgagcacctttccatacacttgtta
-gccacttttatttcttctccagaaatatttctgttcatgtctttgcccaattttcaagtg
-ggctctttgttttttgctactgagttgtgtatgtttcttatatgttttttatattaacct
-tatgtgatatatggtgggcaagtattttcctcccatcccataaactgccttctcactctg
-ttgactgtttcctttgctgtgcaAcaaatgatcttcaatgataatacaaagaatatgcaa
-tacagaaatgatagtcacttcaacagatggtgttgggaaaactggatttccacaggcaga
-acaaatgaaatggatccttatcttacaccacacacacacacacaaactcaaaatggattt
-aaagacttaaatgtgagcctggcaaacttaaaactcctaaaataaaacagaagggaatat
-ctttatgactttggtctaggcaacagttgcttgaatatgacatcaaaaccacaagcaaca
-aaagcaaaaatatattagtgggactatggatacatttgaaacaaactacaaactagtaaa
-atctcagcaaagaaatagaagatataggccaggcacggtggctcacgcctgtaatcccag
-cattttgggaggccgaagagggcggatcacgaggtcaggagatcgagaccatcctggcta
-acatgataaaaccccgtctctactaaaaaaaaaaatacaaaaaattagtggggcatggtg
-acaggcacctgtagtcccagctgcttgggaggttgaggcaggaggatggcgtgaacctgg
-caggcggaggttacagtgagccaagatcatgccactgcactccagcctgggtgacagagc
-gagactccatctcaaaaaaagaaaaacagaaaaaagaaaaagaaatagaagatatgaaaa
-taatcaaatggaaattataaatttatgaaatgtaatcaaagtaaaaaagaaaaagtcact
-gtataggctcaatagtagatggaacatgacagaggaaaaaataagacagatctatagaat
-tacccaatctaaaaacagagaaaaatagactgataaaaatgaacagagccacagatacct
-gtgggacataaaaagatctaatgttcatgtcatcagagtcctcaaggagagggagagtgt
-ggaactgaaaaaaatatttgaaggaataatgcctgaaaaatatcccaagtgtggcagaat
-acatacatctgtaattcaagatcttgaattaacccaaaacaagataaacccaaagaaatc
-catgccaagataaagtataatcaaactaaaactaatagctagagacagaaaaaaatcaag
-cgagcattcagaaacaatacaccacccatggtaaaacaatggtttgattgatgggatttg
-tcatctgaaaccatggaagcaaaaaagaaatgtcatcacatgtttcaaatgccaaaataa
-agaactatcaaatccaaatcctatatctagcaaaaaaaaaaaaaaaaaagttctctagga
-ataaacagggaaagaaaaacattctcaaacaagaaactattaagggaatttgtcactagc
-agccctatcctaaaaatatagtcaaagaaagttctctaaaccaaaatgataaccgggggc
-ttggaacttcagaaaggaagaagtcgaagtcaatagaatgggtaaaatgggaggtgaata
-taatagactatgcttttttttttgctttattttttttttatgctttcttttcttgagata
-gtgtctggctctgtcgcccggacaggagtgcagtggtacaatctcagctcactgcagcct
-cgacctcctgggatcaaaggatcttccctcctgagcccagtgagtagctgggaccacagg
-agccggctaatttttatatttttttgtagagacagggtttcactgtgttgcccaggctgg
-tctcgaactcttagactcaagcaatctgctgcctcggcctcccaaagtgagactatcttt
-ttattaaagagttttgaaatcatgtttggtagattgaagcaaaaattgtaacattgtctg
-atgtggttctaaatagatgtagaggaagtacttaaacattataagctgggtaaggcaaag
-aaatttaaagtgaggtaagtttttatacttcattcaaacttgtaaaactttgacaccgta
-gactgtgataagttaggtacagcaaccactaaaaaaaataaataaatacaataagaaatt
-atagctaaattatagtggaattctaaGgaacaaatagaaaacaaaatataaaatggtaac
-ttaatccctaacatgtatcaaaaagataccccatacaaatattaatcataagaaagtagg
-aatggctatattaacatcagttaaagcagacttcagagcaaaacaaattatcaaggacag
-agagggaaattatataatgccaaaagggtcaatcaaccaagaagacatggcagccctgat
-cgtccacaaactgaaaaccagagtttcaaaatacctgaagcaaaaactgataaaactaag
-aggagaaataaatttacaatatcaggccaggcgtggtgactcatccctgtaattccagca
-ctttgggaggctgaggcaggcaaatcacttgagcttgggagtttgagatcacctgaggca
-acatagtgagacccccctctctataaaagatacaaaaactaaggtgtggtggcccacgcc
-tgttgtcccagctactcaggaggctgacatggaaggcttgagcccaggacatcgaggctg
-ccgtgagctgtgcactccagcctgggtgacagagcgagaccccgtctcaaaaaaaaaaaa
-aaaaaaaaaattacaatatcaacttcaacagttgatagataggacaactagacataaaat
-ccacaagggtgtagaagaatttaaaaataccacaaagcaacaggatctaatagacattta
-taaaacatttcatccaacaacaatggaatacactccttggtgtttatgccaaggaaatga
-aagtgtttttctccacaactcccgggcaggaatatcaatggtagtgttatttataatagc
-ccaaaagagtaaacaaccaaaacgtcattcaacaggtgaatgactaacatagggtggtac
-atccatacaatggaatacttctcagcagtaaaaaaaaaaaaaaaaatgaattattgatac
-atgcaacagcttatatagattataagagcattatgctgagtgatgaaaaaagacaaaggg
-tcacatagtgtgtgactatattcacataacattgtctaaaaattatgaaatgtagaacaa
-attagtgctttccaggggttatgaatagtcaggagagggagggaaatatgccagtaagac
-aataagagagggagatcttttcataatgaataattctgtattttgatttgttgatggtta
-aatgaatctaAGAAGGATCTGATAATCTAGTATTAGACGCATAGTACAGTAGTGAACTTT
-CAGCCTCTAGAGAagtgctctccaatagaagtaactaaaaagatggaaatgttctaaatc
-tgtactatacaatatgttagccactggtcatgtggttgtaaagcacttgatatgtgCTCT
-ATAATattttgagcaagtttcttatgttttctgtgcctttgagtttctcatttgtagaat
-ggagataataatatctacctcaaagtgttgctgtaaaggtaaatgagtttatgtatgtaa
-gacaccgacaggagtgccagcacatagaaagtgttatacaagggttagccattTGTTATT
-GTCATTGTTGTGTTTTGTTCTCTTTCTAATGTCTGGACCTTCAAAtgattcagactcatg
-ggaccatacttcattctgtttttataactttaacctgtaagattctcattttaattggaa
-tttcatatttaggaattcttgggtgccttggatatatgaagaaaagattcacatctgctt
-ccactaaacaactagcgaattaacaactgagatttcttataattaaattatttacttgat
-ttttttaatccatataaatagcttgaacttaggttgaaacccatgagaatttgtggctac
-agttcatagggttaatatttaccttctccatccagagccaaggttaaTGCTGACAAAATA
-CAATCTAATACAGATTAATCTGTGTGTGTGTGTATGTATACACTCGTGTCAGAGAGAGAG
-ATTTCATTCTTCCTTAGGCTGAGATTGTTGCCTTTGAATCTCAGGTTTATATAAGGGTAT
-CAATTATATGTCTTCCCTAGGACTAGATCTTAGCTTTATACATCTCACATAGCCATCAAA
-ATAATGTTCAACTTATCTTTCAGGGTTTGCAATCTTAGTTTTTGGCCTGTGCAGATTCCT
-TTCATTTTTGACGGTTTCTCAATGCAGTAATTTCCTTTTTACATTTACCCAACTTTTTTG
-GTTATTTTCACCAGATACATTGTTCAATATATCTATTCTACTATATTCTATTAATAACAG
-TCTACTATATATGTGTCTTATTGTCTAatattgctgaaatctttttttaatccaataatg
-aatctctgtcatctaatcagtgagtttaagccatgtgaatgtattataactactgatcta
-ttaggacttttttctgccCTCCAGTTGTGACTTATCTATTCCTCATTTTTTTTAGTTTCT
-GTTGGATGGATCATATGTTCTTCTGCTAATATGaatattataattttatttttatttgtt
-ttattaaaaatttGTCCTTGCTCTTAGGACCCATTCCTATCCTTATATTTATTATTACTA
-ATTTAACATCCAGCTTCAGAAATACAACTTTAATAGGAAGGCTTTTTGTATTTCTCCTGA
-CTGCTCAGACTTAGGGTCTTTATTTGATGCTCCACCACCAAGTCACCTATAAGGAAAGTT
-TGCATTCACAGGAAGACTATAAATAATAAAACCAATCCCTTGACTAGGACTTAAACCATG
-TAAAAGCTGGTGGCAAAAGTAAAGGGAGGTGACCCTTGAGACCTCTGAGGTAACTGCTCT
-TAAATTTACATTTGCCTCTAAAAAGGATTTCTTATATGTCAACATCTCTCTGTTTAAACA
-TATTCTTGTGTAAAACCACTACGTGACCTGAATAATGGCCATAGGGCTCATCTCTAAGCC
-AACTGGCTTATTTATTTAATGCATCTCAGTGGTTAACAGGGTTGAAATTTTTTGAAAACT
-GCAATCAATGATCAAAGAATGATCTAGGTAAACATCGATTCCTTGTGGCAACATTTTAAT
-ATTTTCAAAGACAAGGTACAACTGGTAGAAAAAAAATACCCTCATGCATCTTTttcttct
-aattgtggtaaaatatatgacataacattggccattttagccatttttCCttttattttt
-agttgacacataattgtacttatttataggatacaaagtgatatttcaatacatgcatat
-aatgtgtaatgatcaaaccagggtaattagcatatccgtcacctcaaacatttatcattt
-gtattgggaacattcaaaatcctctcttctagccttttaaaagtatacaataaattgtag
-ttaaccatattcaccttacagtgctacaacaccagaagtcattcctcctatctataattt
-tgcatccattagccaatctctctccatcctcccctctccctaatcattaccagcctctaa
-tattaatatctgcaacactactctctacttccatgtgctcaacttttttagctcccatat
-ataaataggaacatgtggtaatctttctgtgcctgacatttcacataacataatgtcctc
-caggctatccatgttgttgcaaaggacagaatttcattatttttatgggtgaatagtatt
-ccattgtgtGTGTGTGTGTATATATATATATATATATTCCATTGTGTGTTATGTATGTAT
-AGTATTCCATTGTGTGCatatatatgtatatatgtgtgtacatatatatatacataatat
-atattcttctgcacatggaaatccagtttctccagcatgatttattgaagagggtatcct
-ttccccagtgtatgttcttggtgcttttataaaaaatcaggtgacCTCAGATCAGACCCA
-ACTACATCATACCTTCTTTCGAAATGTGCAAGAAACCTACTAGAAATTCTTATTGTTAGA
-GTTTCAGATTTATGTCCTGGTTTATACTGCCACATTCATTCTTGGAGGTGAGTACATTTC
-GATCTTGGTCCGGCTGCGCAGAGAGTCAAAGCAGGAAAATCACAGATTCTTCCCAGCAGT
-CTACAGCCTACACAGCGGCATTTGGTGCGATGGGATGGAACATGCTGTATCTCTATTCCA
-TGTGGGGGTAAAGTGGGTGGCCTGAAATTTCCTGTGTCTGCCTGCATGATGCAAAGCTCA
-CAGTTCAGAAGCTTAAGGACACACTTCATATCATCCCATCTGTTCTGGTTCAGTGCATAA
-GAATCTAAGTCTCTGAGGAAGGTAGCATAGTGTGCAGTTCACTGGACCAAAAGCTTTGGC
-TGCACCTCTTCTGGAAAGCCTGGCCATGGGGCTCTTCATGATCATTGCAATTCTGCTGTT
-CCAGAAACCCACAGGTAAACCAAACCAGAAGCTCACTCAAATCAACAGTGGGATGGAGCA
-TTTTCAGGAGCCAAAGGGAACTTCATAATCCACACTAAAGGGAAATAGAGCCCCCAAAGA
-TGGCTAAAGTTTATCCAACATCATCAGAAATTTCCTCTTTCTGGAGCCTTATTCCATGTT
-ACTATCCTTAAAGAGGAGTACTCACTGAGCTAAAAAGAGGTCATAATTTCTTCTGGGAAA
-GATGTGTTGTTATAGAAAGGAATGATGCCAATATCTAGGGATACCTTTATGTCTTTGGAT
-ATGGTTTTTACTCTGATGCTCAGCTATATTTCCTTTTACTCAAATATATATAtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgCATGAatagaggaagaagcaaattttggagttaggt
-ttaagaaacatgccttcaatatctactagtttgtcaactttaagtagtgaagactctagg
-agcctcagtttcctcatctatggagataatgacacctggttaacaggggttttattaaat
-gatataacctatgtgaagcttggcacatactgagaactcaaaaatTAGAGTTTCCTTTCC
-TCTTTCAAAACCAGATTTCTTACATGTGTCCCTTATTATAAGAATAGTAATGGCCTATTC
-CTGACCCTCTACATTCCTAAGACCCAATAGACTACTACCTTACTGGATAACATGAAAGTC
-ATTCTTGACCCTGATAGTGGGTTTGAACTCAGGAGAACAGTTTGATTCAGACATAAACAC
-ATAGTAACAATACATTGTTCTCTGGGCATCAGAGGAGGTGCAGTAGAAGGTAGTGCTCTG
-GGAGCATTCAGGATGCAGGCAGATTTGCTGAGGTTCCTATGTAGAGCATAGTTCCATAGC
-CTAGAATCAAGGGTTCAGCTCCTTTATTTTCTCAGATAAGATCTTATGTTCTTGGCAGAG
-TCTATCAGATGTTAAGGGAGGCCTAAAACCTCACAGGACCTAAATATAAGTGATCCAGTT
-AAATACAAACACTGAGGTTGACCTTGTCGGAAAATCCTCTTCAGAATATATGAGGGTCTG
-CCTTGTGGATACCCCATACCCCTAATTCCTACAAGCCTCCTCTGTCTTCCCCAAAACCAA
-CGTGCCTTCAGTCTCAAACACTGATATTGTTCTATTGCTCCTTTCTGTGTATAGTAACCG
-AACAACTTAAGAAGTGCTGGAATAACTATGTACAAGGACATTGCAGGAAAATCTGCAGAG
-TAAATGAAGTGCCTGAGGCACTATGTGAAAATGGGAGATACTGTTGCCTCAATATCAAGG
-AACTGGAAGCATGTAAAAAAATTACAAAGCCACCTCGTCCAAAGCCAGCAACACTTGCAC
-TGACTCTTCAAGACTATGTTACAATAATAGAAAATTTCCCAAGCCTGAAGACACAGTCTA
-CATAAATCAAATACAATTTCGTTTTCACTTGCTTCTCAACCTAGTCTAATAAACTAAGGT
-GATGAGATATACATCTTCTTCCTTTTGGTTTCTTGATCCTTAAAATGACCTTCGAGCATA
-TTCTAATAAAGTGCATTGCCAGTTTTCTGTCTCATTTTGTTCTTTAACCAGGGGTTGAAC
-ACTCATTATATACTAGGTAATGAATTGATAAGAACTCAGAACCTCTCCTTGAAAAGGGGA
-TATGACAAGTACACTAAAAAAAAAAAGTCCTATAGTGTGGAAGTCTGGAATAAGAAACTC
-AGAAACACTGACATGTAATTTAGGAGAGGGAAAGGTGAAGCAAATATTCAGGGGAAATTC
-ATGAGTAAGTTTAGGAATAAAGCAGTGTCTTGTAGTAAATAAGTAAATAGTAAAGCAGTA
-AATAAGTAGGATTTCCATGGATGAGGTTTGGTAGGGAAGGCAATTTGAGTGAACAGAATG
-GGAGGAAATTGGAAAAGACAGAACATTTCAAGACACTATACATGCACTTTGTTTGGATGA
-AGAACAGAGCACTCAAAGTTGAACTATGGGGGAAGTCTGATTTCCTAAGCTCCTGTGTAC
-CAGCAGTGAACTGGGAAGACGGAGATAAATAAGATTCCACTGTTGTGGAGCTCAACAGTG
-GAGCTCAACGCTTCCTCTATGAAGTGGAGAAGACCTAAGTAAATAACTCCAACACAAAAG
-TTTTTAGGTTTTTGCTttgttgttgttgttgttgttgatgtGTTCATCTTTTTTGTTATT
-GGGGCCCTGTGGAGTTTAGGGGAAATGTAAAAGATCTAGGAATTGGTCCAAATTGTAGTG
-CTTTCATTGTCTTGATATGCAAGAAGAATAATCCATGTACATACTCTGCTGAATTCTTAA
-AGATGTACCTTCTGAATATGATTAACATGGAAAGTTTCTTCTTCAACTACATTTCAAAGT
-CATTTGCTAGTTTTGTTTCTTATATCATTTCACCATAACAATTACAAGCATTTTAAAGAT
-TTAGTTCATCCACTATAACATTTACCACTAATGTGTGGCATGTGTTCTCTTAATCTCTCT
-CTTTCTGGTGttctagggctggtatagggagcacctaaaacaagcctaaaatatcttgtg
-gtgccagaaagtaagcaattgcttaataatcaaaggatagggtctgcaaacacggacaat
-ttgacttcctcttttcctaattgaataccctttatttccttctcctgcctgattgccctg
-gcgagaacttccaacactatgttgaataggagtggtgagagagggcatccctgtcttgtg
-ccagttttcaaagggaatgcttccagtttttgcccattcagtatgatactggctgtgggt
-ttgtcatagatagctcttattattttgaaatacgtcccatcaatacctaatttattgaga
-gtttttagcatgaagggttgttgaattttgtcaaaggctttttctgcatctattgagata
-atcatgtggtttttgtctttggctctgtttatatgctgcattacatttattgatttgcgt
-atattgaaccagccttgcatcccagggatgaagcccacttgatcatggtggataagcttt
-ttgatgtgctgctggattcggtttgccagtattttattgaggatttttgcatcaatgttc
-atcaaggatattggtctaaaattctctttttcggttgtgtctctgcccggctttggtatc
-agaatgatgctggcctcataaaatgagttagggaggattccctctttttctattgattgg
-aatagtttcagaaggaatggtaccagttcctccttgtacctctggtagaattcggctgtg
-aatccatctagtcctggactctttttggttggtaagctattgattattgccacaatttca
-gatcctgttattggtctattcagagatgcaacttcttcctagtttagtcttgggagagtg
-tatgtgtcgaggaatttatccatttcttctagattttctagtttatttgtgtagaggtgt
-ttgtagtattctctgatggtagtttgtatttctgtgggatcggtggtgatatccccttta
-ttgtatatgtagaaaaccccattgtctcagcccaaaatctccttaagctgataagcaact
-ttagcaaagtctcaggatacaaaatcaatttaccaaaatcataagcattcttatacacca
-acaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaaaga
-gaataaaatacctaggaatccaacttgcaagggatgtgaaggacctcttcaaggagaact
-acaaaccactgctcaaggaagtaaaagaggatacaaacaaatggaagaacattccatgct
-catgggtaggaagaatcaatatcgtgaaaatcgccatactgcccaaggtaatttacagat
-tcaatgccatccccatcaagctaccaatgcctttcttcacagaattggaaaaaaactact
-ttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaaag
-aacaaagctggaggcatcacactacctgacttcaaactctactacaaggctacagtaacc
-aaaacagcatggtactagtaccaaaacagagatgtagatcaatggaacagaacagagccc
-tcagaaataacgccgcatatctacaactatctgatctttgacaaacctgagaaaaacaag
-caatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgta
-gaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatta
-aagacttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacca
-ttcaggacataggcatgggcaaggacttcatgtctaaaacaccaaaagcaatggcaacaa
-aagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaaa
-ctaccatcagagtgaacaggcaacctacaaaatgcgagaaaattttcgcaacctactcat
-ctgacaaagggttaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaaa
-caaacaaccccatcaaaaagtgggtgaaggacatgaacagacacttctcaaaagaagaca
-tttatgcaaccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatgc
-aaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaagt
-caggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttggt
-gggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatctag
-aactagaaataccatttgacccagccatcccattactgggtatatacccaaatgactata
-aatcatgctgctataaagacacatgcacacgtatgtttattgcggcattattcacaatag
-caaagacttggaactaacccaaatgtccaacaataatagactggattaagaaaatgtggc
-acatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgtag
-ggacatggatgaaataggaaatcatcattctcagtaaactatcgcaagaacaaaaaacca
-aacaccgcatatcctcactcataggtgggaattgaacgagatcacatggacacaggaagg
-ggaatatcacactctggggactgttgtggggtggggggaggggggagggatagcactggg
-agatatacctaaggctagatgacgagttagtgggtgcagcacaccaacatggcacatgta
-tacatatgtaactcacctgcacaatgtgcacatgtaccctaaaacttaaagtatttaaaa
-aaaaaaaaaaggatagggtcatattaaaagaacacaggagtcggtctaaaagagcttcaa
-atgaccaaagctgcgacaatttgagcaataaaataaataagatagcattggattataata
-caacatataataaatatctatgagtccatgatgatatgaataaataattgaataaattgg
-aaaattggtgagaacagatgtgccatatagaataattcccaataattcatacagatactc
-cctgctgaagaaggtggagcttgacctccctctcccttgagcatgggctgtatttagcta
-cttgtttccaaagagaagtgtgtggaaaggagttaaaaaataatttcacctggataaacc
-tgataaggtcatgtttcagattttatggagaaatcatattgataacatgaacctgtgata
-tgatctgatgagaatggcacttcacttctgttttcttcctcccaaaaccctgcgacccaa
-gacaaacaatgaaaaacatcagaaaaactcaaattcagtggcattctaaacaatatttga
-ccagtatttctaaaaactgtcaaatttatcaaaaaggaagaaattctgagccacagtcaa
-agaccagagaagcctaaagagacaggacaactaaaggtaatgtggtatcctggatggact
-cttggaacaggaaaagaacattaaggaaaaactagtggtgataatagtaataataataag
-tgtagagtcatttagtagcaatgtatttagctgtgatggctgcattgtggtaatataaga
-tgttaacaatagcagaaactgggtgaatatttgggagctctctgtattatctttgcaaca
-tttctataaatctaaaactattctaaaactgaaaatgtatttAAATTTTAGAAAACTGAC
-CACAAAATCAATTTGGCACATTCCTTTTCTTCTTATTTACGAAAGAGCTTCTCatttctt
-cattgaatgcttggtagaatctaatggtaaattcaactggaacggaactctttacaggaa
-gtattgttatagattaagtttattgcaggttaaaaggcaattcagttttctatgccttct
-agtcaactgttgtatttggcatatatacttttcccatgttctaagatttttatacttgct
-atcctaaaactcttgtaatatcttctttttatcttattaatgcctgtaagatatgtaatg
-acaccttctttttcatttttgacatctattatttgttttattttctcttttttcttgata
-agtctcacattcacttattaatttgatttatctttacagaaaacaaattttcttcattaa
-ttttAGTTTAGTTTCCATTTCTTAGACtgtgacttgcattgcccaattgaaagtgattga
-aagtgacaggttcacttccaagtggaaacttaagagccagtgtgtccatgtgcagtggct
-cacacctgtaatctcagcactttgggatgctgaggcgggcagatcacctgaggtcaggag
-tttgagaccagcctggccatggtggtgaagccctgtctctactaaaaacacaaaaattag
-ccaggcatggtggcagggcctgtaatcccagctatttgggaggctaaggaaggagaatca
-cttgagcccagaaggcggaggttgcaatgagctgagatcatgcctctgcactctagccta
-ggtgacagagccagactctttctcaaaagaaaaaaaaaaagagccagtgtgcagtttaac
-cgtctctcatctctctgccaaggtgattgtggaagcactgttgacatagagcctctgtca
-gcctgaagccccgagtgaccatgaaagcagggtcattcttttgacctaaaatagacatct
-agcactgccagaaataaccttttgggaagttactctatgagagctgaggtttgtttttta
-ttTTGttttatatatattttttaaatCAGGAATAACTTAGACCAGGGTGAACAAACTACT
-GCTGTCAGGGCAAATCCAGCCCATAGCCTGCTTTTGGAAATAAATTTGTATTAGAacaca
-cacacacacacacacacacacacacacacacacacatacacacatacacacaAATATATC
-TTCACTAATGTTCTTTTTTTCTTGTTTTTCAAAAACTtttacataccataaaattcacct
-gttttaagtgcacaatttagtgTCATTTCTATTTTTTATTTTCGgtatgcttttcttttt
-gtaactttgttaggtgcatgtttatctttataaaagaaaagccttccttcttttcaaata
-tgagagtttaaagttgtaagtttctctctatacacagcctgagcaccatcccacaaattt
-tcaatatagagtatgttcattgttacattataaaccttctcatttctcttAAACCATGAG
-CATATAAATAACATATAGATTATATAAAGACTATGGATACAAATGTTAATCATGCAATTT
-TGTCAACTAGTTATAATTACATATACAGTAACATTACTTTGGTGATATGTAAACCAAAAT
-GTAAACAAAACTTGAAAGCAAACAGAAAATATCATATGCAAAAACTTGTACACACTTGTT
-CTTCATACAGTTTGTTTTCAAATATGATCTTCTATCTTGTTATAGGTTTTCTATGGCTTT
-AAACTGACATTTATTTTTCATTTATATTGTCCTCTGTTATGATTCTTCCAGTCCTGAACT
-TCCTGCATCAGTAATTTTTAAAGATATTTTTGGTTTACAGAAGTTTACCAATTATTACCA
-TAATTTATCATCAATTTATTAACTCTCACCATCATTTCAAAAGTGAAAGAAATTTCACTA
-CCTAAAAATATGTATGTATGACATTTTAGAAGAAAACAGACTTTTAACTAAATGCATTCA
-TGTCTCTTAAAATTTAGTTCTATCATTTTAATTTTTTTCATTTTATTACAGACCAGTTTA
-AACTTTGTCAGAACCCCATTAGGGCCCATGTATCCATTTAACAACAAAATTCTGTAATTC
-TTAAATTCTCAAATTCATAATTTATATAACCACTGATACCCAATTGGTAGTAGTCTTCTG
-AGGAATGTTTCTATTCCATTATTCCTTGTCTTCTCTAATCACTCTCTGAATCTAAACTTC
-TCTTTAGTTTTTTTTCCCTATAATTAGATGTTGAGGTGTTTGGCTTACTTATCTTCTTTA
-TTAGAATAAATAATATGTATCCCATCCCTAATGATTAGCACTTTGTCAATTTTTATATGT
-TTATGACAGGTGGACTCACTCTTATTCTAAACTCTGATATTAGTGATATCCAATGCCCCA
-TTCAGAGACCATTAAATTAAAAATGCACTTATTACTTCTGGGACTTTCTAGACAATTTCC
-TTCATCTTTAAAAGATCTGGGACAAACACCACAAGCTTTGTCCCACATGAAAGTTCTCTG
-CCCAAGTAATGAAGCATCTAAAAATGCTAGTAaagatattagattttaatataacacatc
-aataattatatttaatataaatgatctaaatcaggggtccccaccccccaggccatggac
-cggtataggtttgtggcctgttaggaactgggccacagagcaggaggtgagcagcagtgg
-gagtgagcattaccacctgagctctgcctcctgtcagatcagctgtggcattagattctc
-ataggagtttgaaccttattgtgaactgcacatgcaaaggatctttgcgtgctccttatg
-agaatctaatgcctgatgatccaaagtggaacagtttcatcctgaaaccatcttcccatc
-cctgccagtttatggaaaaattgactgcattaaaccggtccctggtgccaaaaaggctgg
-ggaccactgatctaaatacaccaataaaaagaaaaagattgtaagattggattttaaaag
-acctgactctatactgaccacaaaaaaAAACCCTCACTTTATTCTTTattgcatatattt
-atggtgtacaacatgatgttttgatacatgttgtgaaatggttaatatagtcaggcaaat
-caacacgttcatcatctcacatagtttccctttgtgtgtgtgtcgcaagagcacactact
-tttttaacaaaaattccaagtaaaatataatattatcatagacctcacgttgtacattag
-acctctagacttttttaatcttacgtatctgcaattttttatcctttgacctacatctct
-ccatttccttcccctccaaccacacccctggtaacgaccacattattctctatctccttg
-tattcagctttccttttttttcttttaagattccatgtataagtgaaatagtgcagtatt
-tttctttctgtgtcagtttatttcatttagcataatgttcttcatgttcattcatgcctt
-ggcaaatggcaggatctcctttttgaagagtaaataatattccattgtgtgtgtgtgtca
-cagtttatccattcatctatcaacagttcacttgtttcaaaattttgactattgtgaata
-atgctgcaataaatatgaaagtacagatacctctatgaagttaagtggtgatttcatttc
-atttttttttttaaagacagggtgtcacagtgttactctgtagcccaggctggaatgcag
-tggtgcaatcatagctcactgtaaatctcaaactcctaggctcaaggaatcctgcctcag
-tctcctgagtagctgggactacagacacacaccatgcttagtcaatgttttttaggtaca
-gggtcttgctgtgtagcccaggctgggctcaaagtcctgacctcaagcaatcctcctgct
-ttgacttcccaaattaccgggattacaagcatgaaccacctcactcagcctggtagttct
-atttctaattcctttagaagccttcatactgactccacaatggctacatctgtctacatt
-cccaccaagaatgtacaaaggttcccttttctccacaccctcattaacaattgttatatc
-ttgtctttttggtaatagttatactaacaggcatgaggtgatgtctcattgtggttttga
-tttacatttccctaatgattagtgattttgagccccttttcacatacttcttggccattg
-ttatgtcttctttggagaaatgtcttttcaagtctttgtccatttttttaattgggtttg
-gtttttttttactgctactgagctgtatgagttctttatatattttatatattaatccct
-tatcagatatatttaatataaaGACAAAGAAAAGCTATAAGACTTTATATCTTAAaaagc
-tggagtggctatattaatattgaacaaaatagatttcaaaacaagaaatactaccaggga
-tcaagacgcacagaaagaagtcaattcaccatgaaaatataacaatactaaatgtgcatg
-caactaacaatagaacttcaaaataaaagcttgtagaactaaaaaagagaaatagagaaa
-tcttcacctacaactggagatttTTAgactgacattagcaagatggcagaataggaggtt
-ccaagcatccctcctctcaacagaaaattcaactggcagatatccatgacaagagcactt
-tggtaaaaatcccaaaacttggaaataagccaaagacacccatgttgaccacagaactga
-ataaaaaccacattagaagggggaagagaaaaggtctcactttgaccaggccacccctcc
-tccactccctcgcccaagttggcacaccactatgcagacaggattgccctaggcctacag
-tttctccagtgggaaaagaaaactaaagatgaacattcagcttccttagccattcctgga
-atattctcagaaagcccatttcagtctcagttcacagggaaagcaggggataacggtgtg
-gttagatcacctgggttcagatagaaaaaaagaaaagggggcattgctcacagtgaccag
-tatgaagatactgttggtagctctgtgtcactgccagcagaggtaccagccaacagcata
-agccacctgcaaagccaagctggtcactcccagaagcacagtggaaatttccatctggct
-tgagtccctagatggccagcctccacagccagcctcaaatccctccccaaggccccacgc
-agaaatggagatacctgcaacaaagcatttcaaacaaaagaaacaactgagacttgtgcc
-ccagggcatttaaacagtggctcagactcaaagctcactcaaggagggagatgcccacca
-cagcacctttcagcaaagcccagaggctggactagccacacccagaagtataaatggtgg
-ctcacctcagcctcaaagcccaccccaagtctctgcctaggcaagggggcaagcctcaac
-catgcatttcaacaaagcatagcagctggtcccaactaccctgaacaaaacctatctaac
-ctcaggacccaaacagtggtagtgcccggccGGGGAAAATACCATGTCTGTTAAGGGTTC
-TTACCATGATTTTAAAAAAGAAAGaaaacctatacacagacattcccaacagctttattc
-ataattgccagaaattgaatacaatctgaatatccttcactgtgtggcttttaaaaaatc
-gcatttatagtacatccatagcatggaatattacttagcaataaaaagaaacaaagtatt
-catacaagttggagggatcttcaaggaacactaagagtaaaaatgccaatttaaaaagat
-tacatatctatgattccatttatatggcattcttgaaatgacaaaattatagagctagag
-aacagattcctgtttacccagggttagggaaggagggagaaggctctcactggaaaaggg
-tagcacaaggagtctatgtgataaactgttttgtgtcttgactgtaatggtggtcacaaa
-aatcaaagcatgtcataaaattgtgtaaaactaaatacatacctacatgcacacacacaa
-acaaatgactacatacatgtaaaactgatgacatctgattaagaccaatggagtatatca
-atgtcaatttcctgattatagttaaacaagatgtaaccattggagggaaaaggtatatgg
-gatttctctgcatgtaggtaagtctaaacatatctcaaaatTATTTTAAATGTCAACTTT
-TAGGAACAGCTGATATTTTCTCTGTATTTATCCTAAATCACTAAGGCTTTCACAAGATCT
-CTGCTCCAAAGACCACCATATTTCTTTTTAAATGACATATCTATTGTGAAATGCATTTAT
-GATAGTCAGTATTCTCATGCTGTGGAAATATACTTTAAAAAGAATATAGTCTTTATCCTA
-TACTGAAGCTCTTGTCCCATCCTGTCCTTTTCAAACACTCAGCAGTTCAATTGAGCTTTA
-CAACTTCCATGCACTTCACAAAAAGAAATAAAATAGTGGAGGCTACGCTGATCTCAGCTG
-GTTTTCATATATTTGGGGGTCAGAtggctatagactgatataagctagcctctgctggga
-caactgggttcttctccaaaatgtctctcttgtccttcctgcagactagactggtcttgt
-tcacctgactgaggcagggttccaatggagaaggcaaaggcacacaggccttttgaggca
-taggcttggaaatagcacaatttcatttgtgccatattctCTCTTTTTATGACTTTATTA
-TTTGAATTTGTATATTGCACAAGACTTCCTATTGTTCAGATTTCATTTGCTTTCTTTCTC
-TTGTATTTTAACATCCTTCACAATTCTCACATCATTATTAAAAGTTGCACTTAACCTAGT
-AATAGATAAGCATTAGCTGAAATTAGTAATTGCTTAACTTCTATCCTACACTACTTTATC
-ACATACTAGTGTGTCATGTTTCATAGTATAGGAACAAAGTAATCTTGCACGATGATATCT
-CTGATGCATACCACTATATTTTTGCTCATGGAATGACAGCAAAATTAATTTTTCTGCTGC
-CAAACTAATATTCAGCCAATCTTTTATTCATCAAATCTAACTACTTAGACCAGGGGCAGT
-TTCCTTTAGAGTTAGACTGTAATTTGTGTACTAATTTTTTTTTGGTTTTTTGTTTGTTTG
-CTTGTTTTGCTAAGGGAAAAATTTATTTTCCTGATGTAtttattattttttagcttttat
-tttagttttagttttaggaatacatgtgcaagtttgttatataggtaaattgcatgtcat
-gggtgtttggtgttcacattcttttgtcagccagataaCCATATTCTCTCTTTTAACGCC
-TATTTaaaattatatatttttaagctatacaatgtgatgttttgatatacatatgcatAT
-TTAAGCTATACAATGTCATGTTTTGTTGTACATATGCATATTTAAGCTATACAATGTCAT
-GTTTTGATGTACATATGCatatttaagctatacaatgtcatgttttgatgtacatatgca
-tcttgaaatgaatactatagtcaggctaattaacatatcagtctcttcacgtagttacca
-ttgtgtgtgtgacaagaatgcttaagatctactctgatagtaaatttcaactatataata
-cagtattatCTCTTTTTTAttttttacttttatttgtttatttttttgagacagagtctc
-tctgtgtctcccaggctggagtgcggtggcgccatctcggctcactgcaagctctggctc
-ccaggttcacgccattctcctgcctcagcctcctgagcagctgggactacaggtgcccac
-caccacgcctggctagtttttttgtatttttagtagagacggggtttcactgtgttagcc
-aggatggtctcgatctcctgacctcgtgatccgcccacctcggcctcccaaagtgctggg
-attacaggcgtgagccaccacgcccagcctttatttatttatttattttgagatagagtc
-tcgctctgtggcccaggctggagtgcagtggcagcatctcagctcactgaaatctctgcc
-tcccaggttcaagcaattctcctgcctcaacctcccaagtagctgggactacaggcaccc
-tccaccacacccagctaatttttttatttttcatagagacggggttttgccatgtcggcc
-aggctggtcttgaactcctgacctgaagtgatccacctgcctcggcctcccaaagtgctg
-ggattacaggcatgtgccaccatgcctggctGatttttgtatttttagtagagacggggt
-ttcaccatgttggacaggctggtctcgaactcctgacctcaagtgatctgcttgcctcag
-cctcccaaagtcctgggattacaggcgtgaaccactgcttccggccacagtattatcaac
-tgaggtccccatgctgtgcattagatctcaaaaacttaatcatcctacaatactggaacg
-tactctttgaccaacatcttttgattctgccaccattgcttctgataatcactattctct
-ctccttctatgaatttgacttttcaagattctacatgtaagtgatatcatgcagtatttt
-tcttcctgtgcctggcttattttacttagtataatgtcctccaggttcatgcacattgca
-caaacgacaggatttctttgttttaagactgaataatatttcatATtggatacaacctaa
-gtgttcaacagatgaatggataaacaaattgtggtatatacCACCTGTTCTCCCTTGTAA
-GTGGAAGCTAAAtgtcaggcctctgagccgaagctaagccatcacatcccttgtgacctg
-cacctatacgcctacatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggcc
-tgttcttgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgc
-cttaactgatgacattaccttgtgaaatcccttttcctggctcatcttggctcaaaaagc
-tcccccactgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttga
-ctgtaattttcctttacctacccaaatcttataaaacggccccacctctatctcccttca
-ctgactctgttttcggactcagcctgcctgcacccaggtgaaataaacagccttgttgct
-cacacaaagcctgtttggtggtctcttcacacggacgcgagtgaAATtttggtgccgtga
-ctcggatcaggggacctcccttgagagatcaatcccctgtcctcctgctctttgctccct
-gagaaagatccacctacgacctcaggtcctcagactgaccagcccaaggaacatgacacc
-aattttaaatcaggtaagcggcctttttgtactctcttcttcaatctcactatccctcaa
-cctctttctcctttcaatcttggcgccacacttcaatctctcccttctcttaatttcagt
-tcctttccttttctcctagggacaggagacgcattttatccgtgaacccaaaactccggc
-gtgggtcacggactcagcaaggcagacttcccttggtgtttaatcattgcgggaatgcct
-ctctgaatattcacccacatttcagaggtgtctgaccacatggggacgcctgccttggtc
-cttcacccttagcagcaagtaccgcttttctagggagcaaacaccccccaccccttctct
-ccatgtctctactctctcttttctctgggcttgcctccttcactatgggcagccttccac
-cctccattcctccttcttctcccttagcctgtgttttcaagaacttaaaacctcttcaac
-tcacacctgacctaaacctaaatgccttattttcttctacaatgccgcttgacctcagta
-caaactcgacagtggttccaaatagccagaaaacagcacttttggtttttccatcctaca
-agatctagataattcttttcataaaataggcaaacggtcggaggtgtttgacatccaggc
-attcttttacacattgttccctccctagtctctgttcccaatgtgtctcgtcccacatcc
-tccttctttccctcccacctgtcctctcagtcccaatcccaagcattgctgagtctttct
-aatcttcgttttctgcagacccctctgacctcttacctcctccccaggctgctcctcgcc
-aggccgagccaggtcccaattcttcctcagcctctgctcctccaccctataatcctttta
-tcacctcccctcctcacacctgctagccctaccccacttgcccagcaatttcctcttaaa
-aaggtggttggagctaaaggcatagtcatggttaatgctcctttttctctatccgaactc
-tcccaaaatcagttagcgtttaggttctttttcatcaaatatgaaaaacccagcccagtt
-catggctcattcggcagcaaccctgagatgctttacagccctagaccctaaaaggtcaaa
-aggccgtcttatcctcaatatacattttattgcccaatctgccccgacattaaataaaac
-tccaaaaagtaaattccagccctcaaaccccacaacaggacttaattaacctcgccttca
-aggtgtacaataatagagtagaggcagccaagtagcaatgtatttctgagttgcaattcc
-ttgcctccactgtgagacaatccccagccacatctccagcacacaagaactccaaacgcc
-tgaaccgcagctgccaggagttcctccagaacctcctcccccaaagtccgtccccttctt
-aatcaatacggaagctacccactccacattaccttcttttcaagggcttgtttcccttgc
-ctccataactgttgtaggtattgacggccaggcttctaaacctcttaaaaactccccaac
-tctggtgccaacttagacaacattcttttatgcactcttttttagttatgcccatctgcc
-gaattctcttattaggccaagatattttaagtaaattatctgcttccctgactgttcctg
-gactacagccacacctcattgctgcccttttccccagttcaaagcctccttcgcatcctc
-ctctcatatccccccaccttacccacaagtataagatacctctactccctccttggtgac
-tgatcatgcaccccttaccatcccattaaaacctaatcacccttaccccattcaatgcca
-atatcccatcccacagcacgctttaaaaagattaaagcctgttatcacttgcctgttaca
-gcatggccttttaaagcctataaactctccttacaattcccccattttacctgtcctaaa
-accggacaaggcttacaggttagttcaggatctgcaccttatccaccaaattattttgcc
-tatccaccccgtggtgccaaacccatatactctcctatcctcaatacctccctccacaac
-ccattattctgttctggatctcaaacatgctttctttactattcctttgcaccctacatc
-ccagcctctcttcgctttcacttggactgaccctgacacccattaggctcagcaaattac
-ctgggctgtactgccgcaagccttcacagacagcccccattacttcagtcaagcccaaat
-ttcatcctcatctgttacccatctcggcataattctcataaaaacacaggtgctctccct
-gctgatcgtgtccgactaatctcccaaaccccaatcccttctacaaaacaacaactccct
-tccttctaggcatggttagtgcagtcagaattcttacacaagagccaggaacatgccctg
-tagcctttctgtccaaacaacttgaccttactcttttagcctggctctcatgtctgcgtg
-cagcggctgccgccgccctaatacttttagaggccctcaaaatcacaaactatgctcaac
-tcactctctacagttctcataacttccaaaatctattttcttcctcatacctgacacata
-tactttctgctccccagctccttcagctgtactcactcttttttgagtctcccacaatta
-cccttgttcctggctcagacttcaatccggcctcccacgttattctggataccacacctg
-accctcatgactgtatctctctgatccacctgacgtacaccgcatttcccccattatttc
-cctcttccctgttcctcaccctgatcacatttagtttattgatggcagttccactaggcc
-taatcgctacacaccagcaaaggcaggctatgctatAGtacaagccaccagcccacctct
-tagaacctctcatttcctttccatcatggaaatctgtcctcaaggaaataacttctcagt
-gttccatctgctattctactactcctcagggattattcaggccccctcccttccctacac
-atcaagctcagggattttcccctgcccaggactggcaactcttaactccctcttagagtg
-gatagatgctctttgctggcaggggaccctccaatcttttcaccctgatgaagttctatt
-ctttacttttatactcactcttattctcattcccattcttatgccaccctctacctctcc
-ccagctatctccaccacactatcaaccttacccattctctcctagccgtttctaatccct
-ccttagtgaacaaccgctggctttgcatttccctttcttccagcacctacacagttgtcc
-ccaccttacatgcagactaggcaacatctcctatctccttacacctccaaacttccttta
-acagccctcacctttaccctcctgaagaactcatttactttctagacaggtccagcaaca
-cctcctgagacatctcacatcagcaagctgccgccctcctccgcacttaattaaaaaacc
-tttctccttatatcaactctactcccccaatatttggacctctcacaacacaaactacta
-ttcctgtggccgctcctttatgtatctctcggcaaagacccactggaattcccctaggta
-acctttcaccttctcgatgttcctttattcttcatctccaaagcccaactacacacatca
-ctgaaacaataggagccttccagctacatattacagacaagccctctatcaatactggca
-aacttaaaaacattagctgtaattattgcttaggaagacacttaccctgtatttcactcc
-atctttggctgccttccccttgctcatcagactctcctcccaggccctcttcttgtttac
-ttatacccagccctgtaaataacagtgaaagtttgcttgtagacacttgacgttttctca
-tacaccatgaaaatcaaacctccccctctatgcagttaccccatcagtccccattacaac
-ctctgatggctgccaccccagctggatccctaagagtctaggtacaagacactcctttca
-gcattccttctcatctttttactttgcatctccggttttgcctcacacaaggtctcttct
-tcctctgtggatcctctacctacatgtgtctacctgctaattggacaggcacatgcacac
-tagttttccttactcccaaaattcaatttgcaaatgggaccgaagagctccctgttcccc
-tcacgacactgacacgacaaaaaagagttattccactaattcccttgcttgtcggtttag
-gactttctgcctccactattgctctcagtactagaatagcaggcatttcaacctctgtca
-cgaccttccatagcctgtctaatgacttctctgctagcaccacagacatatcacaaactt
-tatcagtcctccaggcccaagttgactctttagctgcagttgtcctccaaaaccaccgag
-gccttgacttactcactgctgaaaaaggaggactctgtatattcttaaatgaagagtgtt
-gtttttatgtaaatcaatctggcctggtatatgacaacataaaaaaactcaagaatagag
-cccaaaaacttgccagccaagcaagtaattacactgaacccccttgggcactctctaatt
-agacgtcctgggtcctcccaattcttagtcctttaatacctatttttctccttcttttat
-tcagaccttgtatcttccatttagtttctcagttcatccaaaaccgtatccaggccctca
-ccaatcattctatacgacaaatgtttcttctaacaaccccacaatatcaccccttaccac
-aaaatcttccttcagctcaatctctcccactctaggttccatgacccaatcctgctcaaa
-gcagccctgagaaacatcacccattatctctccatgccagccccccaccaaaaatatttt
-tttcgctgccccaacacttcaatactattttatgttatttttcttattaatataagaagg
-caggaatgtcagacctctgagccgaagctaaaccatcgcatcccctgtgacctgcatgta
-tatgcccagatggcctgaagtaactgaagaatcaccaaagaagtgaaagtggcctgttaa
-tgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgccttaac
-tgatgacattaccttgtgaaatcctttctcctggctcatcctggctcaaaaagctccccc
-actgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttgactgtaa
-ttttcctttacctacccaaatcttataaaatggccccacccctatctcccttcactgact
-ctcttttcggactcagcccgcctgcacccaggtgaaatagccttgttgctcacacaaagc
-ctgtttggtggtctcttcacatggatgtgagtgaAATTaatattaggtacacacagacat
-aaagatgggaaaaatagacagtgaagattttaaaggggataaggaagggagaggagcaaa
-tgttgaaaaactatctattctgtactatgtttgctacttgggtgacagggtcattagaag
-cccaaacctcagcatcacacaataagcccatgtaacaaatctgtacatttatcccctgaa
-tctaGATTTTAAAATAAggctgggtgtggtggctcacacctgtaatccaaacactttggg
-aggctgaggcaggaggattgcttgagcccaggagttcaagaccagcctgggcaacataga
-ccttgtctctacaaaaaataaacaaaatcagcaaaatgtggaggtgcgcctgtagtccca
-gctgctcaggagactgaggcaggaagattacttgagcccaggagctcaaggttgcagtga
-gctgagatcgtgccactgtactccagcctaggctaccaagtgagattttgtctcaaagaa
-aataagataaaaTTTTTTCTTACATTGTGATATATATGCACAATGGaattttcaaatata
-tagtatattatcactaactgtagccaccatgatgtaaatagagctcttgaattttttttt
-tcttcttttgaaaacagagttttgctcttgttgctctggccagagtccaatggtgcgatc
-ttggctcattgcaacctctgcctccccagttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattacaggcacatgccaccacgcctggctaatttttgcatttttagtcaag
-gcggggtttcaccatgttggccagactggtcccaaactcctgacctcaggtgatctgcct
-gcctcagtgtcccaaagtgctaggattataagcatgagccaccgtgcctgaactctcttg
-agcttatttttcctgtctaagtgatttccccacccctagcctctgataactaccatttta
-ctctttgtttctatgaattcaacttttttacactctacatagaagtgagatcatgtcttt
-ctgtgcctggtttatttcatttagcttactgtcctccaggttcatccatgttgttgcaaa
-tgacagaatttacttcttttttaaagctgaaaagtattccattgtgattatgtaccacca
-ttttctttattaattcatctattaatgggcacttaagttgattccatgccttggttattg
-tgaataatgctgaaattaacatgaaagtgcagatatcttttcaacatgctgattttattt
-ccattagctatatacccagtaatgggattgctggatcatatagtagttttcattttaatt
-ttttaaggaacttccatacagttttccataatagctatactaatttttattcccaccaac
-agtgtgcaagggttcccatttctccacatcctttccaacacttattctctttcatagtat
-attttgaagtcaggtagtgtgatgccttcagctttgttctttttgctcaagattgttttg
-gctattcaaaatcttttgtggttcaatccaaattttaagatttttttctgtttcagtaaa
-aaatgtctttggaattttgatagggattgcattaaatctatagaccactttgggtactac
-agatattttaacaatattaattttttactttcatgaacatgggatatctttccatctgtg
-tcttcttcaatttcttccatcaaagttttatacattttagtgtagaggccttttacctct
-ttgttaaatttattcctaagtatttttgtagctattgtaaaaggatcatttacttgattc
-acttctcaggtgttcttgttagtattcagaaaagctgctgatttttgtatgttgaattta
-tatcctgccactttactgaattcatttattagttctaatagttatttggcaaagtcttca
-ggattttctgtatatacgattatgtcatctgcaaaaagaaacaatttcacttcttccttc
-ccattttaatgctctttttattgcattttcttgcctaattaatctggctagaatttccag
-tactacattgatagaagtggcaaaagtgggcattattttgttctttatcttaaagaaaaa
-gcttttgactgttcaccattgagtatgatgttaaatggggcttgtcatatatgatcttta
-ttgtgttgagatcattctttctgtatctaatttgttgagttttatcacaaaaggacgctg
-aatgttgtcaagtgttttttctgcatctgttgagatgatcatatggtttttacccatcac
-tctgttaatgtagataaatctcacttgatcatggtgaataatccatttaaagtattgttg
-aattcaatttgctagtattttcttgaggtttttgtatctctgttctagggacatcgacct
-ataacttttttttcttgtatgcccttgctctggctttattataagggtactgctACccca
-gcatgatttccaaatggctatgaaccagtgactgctgtgtacaaccaacttttcctcctt
-tcaaatgggagtgttgtggttatAACATTATAAAACAAATCTTGCAAagttagatagaag
-gcatcagttctagtgtttgatagcacagcagagtggctattgttaacaacaatttattgt
-atatttcaaaatagctaaaagagaagttttgaaatgttcccaacacaaagaaaggacaaa
-tgtccaaggtgctggatatcctaaataatctgacttgattattacacattatatgcatgt
-atcaaaatatcacatgtgcccagaaatatgtacaaatactatgtatcaataaaaaaGttt
-ttaaaaaataaatattacatataatatatgaattatataataaaactagaatataatata
-aaaaggaaaaaatatatgtaaaataaatCTTCATaataaaataaaataaaataaTTTGAA
-AGAGTCTATGAATAAGATTTTGGAGACTACTCTAAGACAGATGCAAGAGCAGGTACCAAT
-AATTCTGTCTGTACCAAAAGAGTGAATAATAAAAATATACAATTTCAACTTAATTTTGCA
-TAAAAAAAAGTGAACAAATAAACATGCATCTAACAATACTGACCACATCCACGTCTTCTA
-TGAGTATGGAGGGGATAAAAGAATAAAAGAAAAAAGTCAAAGCGAAGATTAGATCCCCCC
-AGTCAGAGCAGAATTCAAGGGTTAATTTATCTGTTCAATTAAGTATATCCCTCACCCCCA
-ACTCAGAAGACACTTCTCTGATTTATCTGACACTAAGCCAAAATGGATTCTCTTATCTAA
-TTTATCAGTAGAATCATATAGAGTAGAGGACACATGTAGATTAAAGACAGTGAGCCAGAC
-CCATCTTCACTGTCACAGTGACAGAATGGACCCTCCTTTAAAATACCCCTGGTGACATTG
-TAATGAAAGACTAAAAAAGAAAGGGGCTTATAAAGTGCTGCAGTGAAAAAAAGGGCTTCT
-TATGTGAGCCTTACTTTTAAAGTTCCCTAAGAATTAGGTTGAAAAAGGTCATACATTGAC
-TTTCATAGTGCTGAAATCATCAACAAAAATTTCTAAAATTCTGCAAAGTCCAGTCACTGT
-TACCTGTGCACTTCTCCAGAATTTTCAAAAGCCAAACTACTAAAAGGAAGGTTCTTGTAT
-GCTCTTGAAACTTTAATATATCCAGCTAAATATTTTTCTCCTTCCTCCCCCTGAAACAAG
-GTGGTGAGCTGCTCATGGAGTAATAAGGTTCATTGATTTCTTTATCTCACATGAGTAAAT
-ATTAGCTCTACAAAAGTTATTTATGACCAGTGCCTTAAATTAAGCAGCATCAACAAATGT
-CACCACAAAATTTCTCTTCTGTTCATCTGGACAGCATTTTCTACCATCATGACCTACTAC
-AATTTCATCTATCTCATGAGGAGCTTCTTAAGTACGTCCCCCTCATTTATAAGACTTTAA
-ATTTCATACTGAAACAAATGATATGCAATGCTTTTAGAGATCTTAAGATAATCTTTGTCT
-AAAAATTCTGTCAACTAGATGTTCAAATTGCTACTGAAAATGGAGATGGAACACATACAT
-TAAATGATTCAAATGATATATCGGAATTACCAGTAGCTGTCATGTTTGCCCATCAGATCT
-GCCCTCAAAAAAGTGTTATGAAAATATTCAAACATTTTTTCTCCCTCTAACTAATTCCTA
-GCTGTTAGCAGAACCCTCTGTacacacacacacacacacacGGCATTCAGATCTAATTAG
-ACAAAAGAAATTTCATTTGTGAAACAGGAGAAATACCTGAAATTCTGTGAAATATTGTCT
-CGCATAGAAAATGGAGTTGttacaagccaggagagattgggtgcctattttcaaccttct
-taaagacaagaaattccaaccaagaatttcatatcctgtcaaattaagattaataaatga
-aagagaaataaaatcttttccagacactccagtactaagagaaatccttattattaaagg
-cagtcttacaagagacccttcagggagttctaaatatggaaacaaaggaacgatatttgc
-atttacaaaaacatacttaagtacgtggcccacagaccctaataagcaaccacacaatag
-aaactacaaagcaaccagctaacaactccatgataggatcaaaacctcacatattaacat
-taaccttgaatatgaacactctaaatgctccacttaagaggcacagagtagcaagttgga
-aaagaaaagaaaagaaaagaaaagaaaactcatctgtctgcagtcttcaagagaccaata
-tcacatatatgacacccataggctcaaagtaaatggttggagaaagatctaccacataaa
-caaaaaacagaaaaagaggaggggtcattattcttagataaaacaaactttaaaccaaca
-actacttagaaagataaaaaagggcattacgtgacaataaagggttaaattcaataagaa
-gacttaactatcctaaatatatatgcacccaatattggagcatctagattcattaaaaaa
-actacttctagacctatgaaaagacttagccacatgattatattgggggacttcaacacc
-ccactgacagcattagatagatgattgaggcagaaaactaacaaagaaatcctggactta
-aacttgacacttgaccaattcaacttaatagacatctacagaatattccatccatcaacc
-acagaatatatattcttcacatctgcacatggaacagactccaagattgaccacatgcta
-ggccatggaataactatcaacaaattcaaaataccaaaataatgccaaccaaactctcag
-accacactggaaaaaaatagaaatcaataccaagaaccttcaaaaccacacaattacatg
-aaaattaaacaacttgctcctaaaccacttttggataaacaacaaaatgaaggcagaaat
-ttaaaaattcattgaaataaatgaaaacagagacatagcataccaaaatatctgggatgc
-agtgaaaacagtgttagaaagaaagtttatagcactaaacactgaccttgaaaagctaga
-aagatctcaaattaatgatattacgtcacacctacaggaactagaaaaacagaaacaaac
-taaccaccaagctagcagaagaaaaaaaataactaaaatcagtgtagaactgaatgaaat
-tgaggctcaaaaatccatacaaagacacagtgacattacaagtttgtttttttaagggat
-aaacgagatcaatagaccactattttttgttagtagattaacaaaagaagtgagaagatc
-caaataagcacaaatagaaacaacaaaagtgacattacaacagatcccacagaaatatga
-aagagactattatgagcacctctatgcacacaaactagaaaatctagaggaagtggataa
-attcctggaaacatacaatctcccaagattaaaccagaaagaaactgaaaccctgaacag
-accaataacaggttccaaaattgagtcatcaattaaaaacctattaactaaaaaaggccc
-tgaaccagatggattcacagcccaattttactagacataccaattctactaaaactattt
-caaaaaagcaagaagaaagatacctccctaactcattctacaaagtaggcatcaccctgg
-taccaaaacctggcaaagacacaacaaaaaaagaaaactacaggccaatatccctgatga
-aaaaaatgcagaaatccttaagaaatactagcaaactgaatcaaagaatactaaaaaaag
-acagttaattcgccatgagcaaacagacctccctcttgggatgcaaggttggttcaacat
-atgcaaatgaacaagtgtgattcaccatataaacagaattaaaaacaaaaaccatatgat
-catctcaataaatgcagcaaaccttttgataaacccaacatcccttcatttaaaaacccc
-tcaacaaactaggcatcgtaggagcatactcaaaaataataagagcccctatgacaaacc
-cacagccagcatcatgctgaatgggcaaaaactgaaagcatttcccttgagaactgggaa
-tgctttctggaacattccagttttctggaacattcccaggaatgcccactctcaccactc
-agattcagcctattactggaagtgcttgccagagcaatcaggcaagaggaagaaataaaa
-ggcatccaaataggaaaagaagaagtcaagctatctttcttcattgacagcagattatat
-gcctagaaaaccttaaagcctccaccaaaagactcctggaactgataaacgacttcagta
-aagtgtcaggatacaaaagtcaaagtataaaaattaacagcatttctatacaccaataat
-gttcaagctgagagtcaaatcaagaatgcaatcccattttcaataaccacacactcaaaa
-aaaaagcctaggatttttttctaactaagaaggtgaaagatctcttcagattcagggaga
-attataaaacattgctttaaaaaattatagatgtcacaagcaaatggaaaaacattccat
-gcccatgggttggaaaaatcaatatcatttcaacagtcattctgcccaaagcaatctaca
-gattcaatgttattcctatcaaactaccaaagccatttttcacagaattagaaacaacta
-tcctgagttcttatggagccaaaaaaagagcctgaataggcaaaacaattctaagcaaaa
-agaacaaagccagaggcatctaattacccatctcaaactacacgataaggttacagtaac
-tgaaacagcataatactgatacaaaaacagacatatagaccactggaacagaataaagaa
-tccaaaaataaagctgcatgcctacagccatctgatctttgacaaagtcaacaaaaatac
-gcaatgggaaaagggctccttattcaataaatggtgctgggatagctggcaagccacata
-tagaagaataaaactggacccctcctctcaccatataaaaaattaactcaagctggatta
-aagatagaaatgtaagaactcaaattacaagaatcctagaagacaacctagaaacaccat
-tctggacataggtcttgggaaataatttatgactaagtcctcaaatcaattgcaacaaaa
-acaaaaattgacaagtgggacctagttaaactaaagagcttctgcacagcaaaagaaact
-atcaacagagtaaaaagacaacatacaatggtagaaaatatcacaaactatgcctctgac
-aaaggtctaatatcaagcatctataaggaacttaattcaacaagcaaaaagaaaatagcc
-ccattaaaaagtgcgcacaagacatgaacagacacctctaaaaagaacacgtacaagtgg
-gcaacaaatatatgaaaaaatgttcagcatcactgaacaccagagcaatgcaaatcaaaa
-tcacaatgagataacctctttacaccacttagagtagctattactaaaaaatcaaaaaac
-aacagatgctggcaaggccgcagagaaaagggaatgcttatacactgttagtggaaatgt
-aaatttgttcagccactatggaaagatgtttggagacttctcaaagaacttaaaacataa
-ttaccattcaactcagcaatcccattactgggtatatatccaaaagaaaataaattgttc
-taccaaaaagatgtatgcacgtgtatgttgatcgcagcactattcataatagcaaagaca
-tggaatcaacctaggttcccatcaacagtggattggataaagaaaacgtggtacatatac
-acaatggaataccatgctgccataaaaaaataaaattacctcttttgcagcaacatggat
-gcagctggaggccattatcctaagcgaattaacacaggaataggaaacctaataccatat
-gttctcactaataagtgggagctaaacattgggtacacattgacataacgatgggaacaa
-tagacactggggactaatagaagagggaaggaggagaggagaaagggttgaaaaactaac
-tgttgggtactatattcaggacctgagtgatgggatcagttgtaccccaaacctcaacaa
-cacacagtacaccaatgtaacaaatctgcacatgtacccctgaggctaaaataaaagttg
-aaaTTATTTTCTTAAAAATGGAAAGGCTAAATTCCACCTCTACCAATATGTTTACTTAAT
-TTTTATATCCCCCATCTTACTGGTATAAAACCAGGAACATGGCAACCATTCATTTATGTT
-TGAAGTGTTCAAAAAATGAGTGACTACATCAATAAATGTACTCAGAGGAAAGCACAGGAC
-TTTATTATGTGGGGAATCAAGTTCACAGAAGGAAGCAGATGAATCTTTTGCTGCAGGCTG
-CTGGATTAGGCAGCACTTTTTATTTAGGAAGAGTGGAGACCAGCGAGACAAGGGCTAGAT
-TTAGGATTAGACTGTGAAAATGGTGATGGTGGGTAAGATGATGTAATCCTGCAGCACACT
-CAGCTTCTCACCAGAATGTTGATGTGGCTTCTTAAATGACACATGTTTTTTCTCTTCTTC
-ATCATTAGCACAACATAATTTCCCACTTAGACATCCTATTTCATATCTTTCTCCTACCTT
-GCATTTCTTCCTGCAATAGCCTGTTACTTTATTGAAGCATTTTTTGAGTCTTGCCCCGTC
-TGTGCATAGGAAACAACATTGAACCAAGGTTAGTGCGTAAGGAAGAGCAGAAGAGGTAGG
-TATGTGGTTCCCCACAAGTCATGGCCTCCTATGGTCCCAAGTGAACATTATGCTGATAAA
-AGGAAACTCAGAGGCCCCTCCTTGAAAAATATCCCAAATTAAGGACATTCAAAAGCCCAG
-GCTCTCAGCCAATGTCCAGTTGCCTCTGAGAACATTAGAACTGATATGACAAAAGAGAAG
-AGAGAACTCAATTCCTGGTTATCAACCAGAGCCAAGTCCCACCCCTAGGACCATGGCAAA
-GCTGACTCTCTCCACCAAGCTCCAAAGTCAGCACTCTCTCAGCTCCATCTCAGTCTCATG
-TCCCCAGAGACGGCTAACATGTCACCATGTGCACAAGACATGTCACCATTGGCACAACTC
-AGCCAAAGCAACTTTTGAAAGAACATCACAAACAAGACTTTTTAACTTAATTCGGTTTCA
-CACTCACTGATATGGGCAACAGAAATCTCCCTTTGACAAGATCTCATGGGTCTCAGCAAC
-AGGTGCTATTGAGAACTCCTTCCCTTAACCTGGCTCCTCCTGTCTGTCACTCATCACACT
-CCCCTTGATCTCAGATAAATGTGTTGCCCAGGGATCAAATTCAATTCCATGAATTTGGCT
-CTAGAGAGCTACATTGTCACCTTCTCAGAGTAATGCACTGAAATTCTAAGTCTCTTGTTT
-CTAATCCTTATTTGCCCCTCTACCCAAAATTTGAACAAGCCCAAAGAATAAGGTTGGAGA
-AGAGAGACATACTCTCCCTATCCTAAACTTCAGAATCAGGGAACATCTTTGAGGGTTAGA
-GGAGTATATTTTGGGGCCATAAAAATACAATATGCCTTCTTCCTAGCAAGAGAGAAGGTA
-ACTCTCACTGACAGGGCTTCTACGATGAACTTTgtgcttcgtgcttgtaagttcatgtaa
-cctgtacatcaaatagaatcatgaaatatagtaattatactccttcacagatgagaaaat
-tgagattaaaaggaaataatgtgcttaattcatacaacccgtcaatgatgaagacatatt
-ttaacctcacattgacatgactccaaaatgtgtgctattttaattactgtTGTAGTACAG
-GCTGAAAATGAATTTGAATGGAAAAGGGAATGGCCAGGCTCTCAGGTGAAAACTGTGTCC
-AGCATTATAAAGATAATTCTAGATGATGAGTTCATGGATACTTTTGAAAAGGACTCCTGA
-GAGTCCACTATAGCCCTGACCTCCTCTTACCTCCTTGGGTGCCTCTCTTCTAAGGCATAG
-ACTCAAGTCAGGCAACCAGGAGAATGGGTACTTTTTTATGATTTTGGCCAAATATAAATA
-ATCTTGAAAGTCCTGTTCCCACTCTTACAAATAGTAATATCTCTTAGGATGTTATAGTAC
-ATTTGGACAAGTTACCTGTGAGTACCTCAAACAGCAGAATAATGAGAACCAGAAACAGCT
-TCATATTTACAGACTTCCCAAGAGAAAGAGGCAGCAGAACTTTGTCCAGTGGTCTGTGTG
-CCACAGGTCTTTAAAGATGATCCAGAGTTTTGAGAGCTATCAGCGCTCGGAGCTCTCATT
-TTAACCCACACAGACAGAGAGGAATTCCAAGTCCACCCCCGTAACACACACACCTACATC
-CCCAAATATGGAGCTCACAGTCCCAGAATGTTCCACCATATCATCCCTCCTCCCCCTTCC
-TCAGGATATGCGCCCCTAGAGAGCAGGAACTATGACTTTCCGTCTGAGCTTCCAACCCAT
-TTGGGTCAAGGTTGGTTGGTCGTGGGCCTTGGGTTGTGTGGGATAATCCTGTCTTATTCC
-TATTGTTCCAATGTTCCATCCGGCTACTGCTGCCTCTAACAAAACTAACCCAGTTTGGAA
-GATAAATTAAGTCATTAGTCGACACAGAAGCATATTCAACAATAATTTTTTTAATGTATA
-AAGCTTCCAGATAGTCATTCTAGGAGTAAGATTGCTTTTAGGTTTGGCTAGATAAATTGA
-TATTATTTGAGAGTTTCCCATAAAGACTTGTCCATCTAGTAGAGCAAAATTCAACAACTG
-AAAGTTTTCAAAAGATCAAATCTCCTTAGCACAGCACTCAACTTATTATAAACTGGTCTC
-TGCTCTCCTCTCTTGGGACATTTTATGGAACCATCTATGTTTCTCCCAAACTAGTGGGTA
-CACCTTCCTGAACTTTTACTTCCTTAATCTGTTTCTTTTCACATTTAAATCCCTCCTTAC
-AGATTATATTACACTCCCCATCCCCTCCATATAATTGGTGCTAGTGAACTCCTGGTTTTC
-CTTCAAAACCAAGTTCAATCATCTCTATATAAGTGAAAGTTTCCCTGACCCAACTAAACA
-GAGCTGCAAACTCTCTTCTTCGCACCATCACTGTATTTGTACATATTTTTGTTGATGGTC
-ACACTATGTCATGTTCCAATTATTTGTTTATCTGCAATAGTCTGCAGACCCATAAAGGGC
-AGGTCTCTGGTCTTATTAGACTTGGAGttctttttctttttttttttttttttgcagttg
-caagatttaatagagtgaaaatggagctcccatacaaagggaggggacccaaagaggtta
-gccgttgccggctcgaatgcctgggtttatatcccaatcattgtccctcctgctgtgctc
-tcaggcaatagatgattggctatttctttacctcctgtttttgcctaattaccattttag
-tgagctctctttcctacctgattggtcacatgtgagctaagttgcaagccccgtgtttaa
-aggtggatgcggtcaccttcccagctaggcttagggattcttagtcggcctaggaaatcc
-agctagccctgtctctcagtaccccctctcaacaggaaaacccaagtgctgttggggagg
-ttggccgacgaccgctctaactgcttcctcctgaattggggcatagtaggggttgtgcag
-ttgagatttcctcaggaggggtgccttcgatgtcattaacattggagcatgggctagcag
-gccggtccaatggtccacggtagctcttagtcatggacggcatctgtggctccatttgaa
-gaatgatttgtagttttacagctttgattctggaaaagacaaacttaacaaggaggttaa
-agatacagggattgaaatgtatggcctgcagtgcaggggattatttctttggcacacttt
-acaggccctgactatctatttgatagttttgaaaaggcctggtccagtaaataataattt
-agccatctgatagttgctatcaatgcctaagtgaaaggtttggtaaagggttttaagtaa
-tttcaattggttagctgcaggcaaaagtattttttcttctttggtggctagccatcctga
-ggggaggaaagtatgtcctcttgaggttctccattctatttcttctgctgagtactgggg
-cttggtttcctggagggggttaccccacactaggggtccttctataagcatttctaatgg
-agggtcctgtcttgtggctcttttggcttcaacatctgcttggcagttcccttctacttc
-cctttccttttttttttttttttttatgaccccggcagtgtaagactgccacctctttag
-gtttctgtacagccaataataatatcctaatggcttcttgatgtttgataggtgttccct
-tggaagttaggaattccctttctctccatattgctgcatgggcatggagaactaggtaag
-catacttagagcctgtatatatatttaccctttttccttctcctaattctagtgccctag
-tgagggctattagttctgccagctgaacactagttcctggagtgaggggattactttcaa
-gtattccattatcactgaccactgcataccccacttttcgaagtcctttttctacaaagg
-aacttccatcagtacataaggtgaggtcaggatcagtcaagggaacctctaaaggatccc
-cttgagcagcgtaggtttgaacaattacttgctgacagttatgttctatcttttctttat
-tgtctggaagaaatgtggctgggttaagagttgcacaagtgcacagtcgcagcactggcc
-cttcaagtaatagagcctgatatttaagtaaatggttgtctgacagccacaagtctcctt
-tagcagtgagtatgccattcacatcatgagatgtccacacagtaagatctcttccctgta
-ttagtttaactgcttcagatactaagactactactgctgccactacccgtaaacaatgag
-gccaaccctttgccattacatcgatttccttacttaggtatgccacgggttacaagctca
-tccctcagacctgtgtaaggactcctagagctattcctgtttttttctgtgacttataaa
-gaaaagtcttgcccctttgacaagcttaacactggggcttgggttagggccttctttagg
-gcctggaaagctgcttctgcttcaggtatccatcttactaatgggtatttgctttctgag
-tttccttaattgtgtatataatggtctggctatttcgccatacctgggaatccatattct
-gcagaaacctgttacgccaaggaagcttttagttgctttagggttttgggatgaggatca
-gccagtataggctggatatgttcctcactgagggccctggtgcctttggataatttgagc
-cctaagtatttaacctgctgtgagcagagctgagcctttggtttggaaaccttatagcca
-caggtggcgaggaaatttaagagtgcttgggtggcttgattgcacaaggtttctgaacgg
-gcagctaaaattaaatcatccatgtaccaaaggacaagagtgtccaggtatgagaactgg
-ctcaagtcttaggctaatgcctggccaaatagatgggggttatccctgaacccttggggt
-aaaacagtccgggtgagttgagatgttgggttcgaaggatcttcaaaggtaaacaagaat
-tgaaggtcaggatgtacagggatgcagaaaaaggcatccttaatgtccaggactataaac
-cactctgcttcctctggtgtttgggaaagcagagtatacgggttaggtataggtgggtat
-ggagcgacaatggcctcattgataatcctgagatcttgcactaacctccactgtccgctg
-agtttctgtactcctaaaattggagtattgcaggggctattgcatggttttactaggcct
-tgggcttttaggtccttaaaaatattttagagtccttgttgggccttgggtgtaaggggg
-tactgcctttggtagggaaaggaggtgaaatcctttagtttaactcaaacagaatgggca
-ttctttgctcgtccatgttgtccttctgttgcccagacttcaggattaattccttcctca
-agcagggggacaataaacgggtgttctttctcctatgttcaggtgtataatggcccctgc
-tttcgctagaatgtctctccctaacaagggagtggggctttcaggcataattagaaaagc
-atgtgaaaagtataaagttccccagtcacaacttagtggctgggagaagtatctagtgac
-tggctgtcctaggaccccttggatagtgacagatctggaggacagttgtccgggacagga
-cagtaagactgagaaggctgcgccagtgtccaggagacagttagcctcctggctctcaat
-ggtcaagcatacccgggactctgtgagggtgatggcatgggctggagcttgccctgggca
-ccctcagtccttctgctggatcatctggttagtggcttctgactcagaggaccttcgtcc
-cctggggcagtgggccttccagtgattcccttgacataaggggcatggatgagagggtgg
-cttatttctacttggacaatcttttttaaagtgtccttgtagaccgcactggaagcaagc
-cctattaggcattcgatttgcccagtttttcccttttccaaagcctccTCGACTAGGAGT
-TCTTAACTCATAGCACAAAATTCATGCTATATGCTCAATACATAATCACTGAATGGCTGA
-AAAGTACTGAACAAATTACTGCTAGATAAAATACTCCAACACAGCAATAAAGTTAATTAT
-GGCATTTCCTTTAAAAATGCTGTTTACCACTTTTTGCAATTTCTAGGCACCTAATTATAG
-TAATGAGGTCCCATCTAATCCAAATATCTTTCTGTGACAGTATCTGGAAGAATGTTGGAA
-TTTCTGAAAGCTGTAGAAGTAGCCGTTGATGATTAAACTCTTATCACAACATAGTCAGGG
-AAAGAGTAAGGTTAGGAATTAGTATTGTATATAGCTTACTATGGATACCAGTAACCAGAG
-CCCTTATCCCCCTCAGTTAGTAGCTGTATACCTTGTAATCCTGGAGTGGCACAGAAAATA
-AAGATTGGTGAGGCTTACAGAATCTCATCAAATCATATTTATCATATGAAGACAGCTAAG
-TTAATGGGTGCAGGAAATTTAGCCGCACGAAGATCAGATGTGTGAATATTTATTAAGGGC
-TAGGTGCagtggctgggattacaggcgtgcaccatcatgcccagctaatttttgtatttt
-tagtagagatggggtttcaccacgttggccagtctggtcttgaactcctgacctcaggag
-atccacccacctcaacctcccaaagtgctgggattacaggcatgagccaccacgcctggc
-tTGTTtttttgtttttgtttttgttttAATTTTCTAAGTCTTTCTTGCTGAGGGTCTGTG
-GATCAAGGAAATACTTATTCAAAAAACAGGTATTAAGTTCCTGTTAATAAATACAAGAAG
-AAAAGTGCTAACTGAATCACCTGTGGGTTTAAAGACCACCATCAAAGCTACAATTTTGGA
-GGACAGCCAACTGCTCCCTTGTTCTGTAATTCAATTTTACTCATTGCTGTAAGGGAGTTG
-GTTCCATTTCTAAATAAATTAAACAGAGATAACCCAAGGATTAGATGAATATAAGTCCAG
-CTATGCAGGAAATCGTTTGCCACCTTAGTGCACAATAAGAACTAAGAAGTTGGACTCCAG
-ATTAGTGTATGGGATTTCTTTTAGCTTTTTCTAACTAGAATCAAGAAAGATGAGATATTT
-GACTGTTCTAAACCTTTACTTCAGCCAAGTATGGTGCTCTGGAAGCTTCTCAACCCCACT
-CCCACTGCCTCCATGTTCAAGACCATCAAATAAGAGGGAATTTCCTCTCCAAGTAGATGT
-CCATCTTCTACAACATTTTTTCCTACGTCTGATAGATACACTCTAGCAGAACTCCAGTAG
-CATATTTCACCCAGGATACAAAGGTGTATTTGTCAGCACCAGTCCTGCTGATGTTTTTCC
-TCAAATTCTGCATTGTTTCTTTCCAAATCTCAAAACCTCCCAGAaaatccttcttgtctt
-ttaaggctcagataaaaataagacctcctctgtgatgtcttcctaactcctctgatagac
-ttgattaattactattttgaacccccacagctctttccATTTGTATTTGTAACACTAATC
-CCATTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtctgtgtatgAAttttt
-ttagcttttattttaggttcaggagaacatgtgcaggttagtcacataggtaaattgtat
-gtcacagggatttggtgtacaggttatttcatcacccaggtaataagcatagtacctgat
-aggtagtttgttgattcccaccctcctcctacctcaagtaggccccggtgtttgtttcct
-tttttgtgtccaggtggactcaatgtttagctcccattataagtgagaacacgtggtatt
-tggttttctgttcctgtgttaactcacttgggatacaggcctccagctccatccatgtcc
-ctgcaaaaaacatgatttcattttttatggctgtgtagtattcgatggtgtatatgtacc
-atattttatttatccagtgtaccattgatgggcatttaggttgattccgtgtctttgcca
-ttgtgaatagtgctgcaatgaacatacacgtgcatgtgtctttatggtggaatgatttat
-attcctttggctatatacccaataatggaattgctgggtcgtatggtaattctgttttaa
-gttctttgagaaattgccaaactgttttccacaatggctgaactaatttacactcccacc
-agcagtctaaaagcattcccttttctccacaacctcgccagcatctgttattttttcact
-ttttaataatagctattctgactggtgtgagatagtatctcattgtggttttgatttgca
-tttctctaatgataagtgatgttgatctttttttttctttcaaatgcttcttagccgagt
-atatatcttgttttgaaaagcgttccccattgcttgtttttgtcaggtttgtcaaagatc
-acatagttgtaggtgtacagtcttatttctgggatctctattctgttccactgatctatg
-tgtctgttcttgtaccagtgtcatgctgttttggttactgtggccctgtagtacagtttg
-aagttgggtagtgtggtgtctccaactttgttctttttgcttagaattgccttggttatt
-caggctcctttttggttccatataaattttaacatagatttttctacttctgcaaagaat
-gtcagtggtagttaaatgggaatagcattgagtctataaattgctttgggcagtatggcc
-attttagtgatattgattcttcctaccaatgagcatggaatgttttttcatttgtttgtg
-tcatctctggtttctttgagcagcactttttagttccccttgtaggtagaaatctttcac
-ttcccttgtaagctgtattcctatgtattttattctttttgtggcaattgtgactgggag
-ttccttcatgatttggctcttgtgttgaaggttataggtgtataagaatgctagtgattt
-ttgcacattgattttgtatcctgcgactttgctgaagttgtttatcagattaagaagttg
-cctagccatgtgcagaaaattgaaactggaccccttcattacaccatataatacaaaaat
-taactcgagatggattaaagacttaaatgtaaaacccaaaagtataaaaaacctggaaga
-caacctagataataccattcaggacacaggcacgggcgaagattttagggtaaagatgcc
-aaaagcaattgcaacaaaagcaaaaatggacaaatgggatctaattaaactaaagagctt
-ttgcacagcaaaagaaactatcaacagagtaaacagacaacctacaggatgggagaaaat
-ttttgcaaattatgcatccaacaaaggtctaactaatatccagcatctataaggaactta
-aacaaatttacaataaaaacaaacaaccccattaaaaagtaggcaaagaaaacatgaacg
-gacacttctcaaaaaaagacatacatgcagccaacagtcatatgaaaaaaagctcaacat
-cactgaccattagagaaatgtgaattaaaaccacaatgagataccatctcccaccagtca
-gaatggctattaccaaaaagtcaaaaataacagatgctggccaggtacagtggctaacac
-ctgtaatcccaccactttgggaggcctaggcaggcagatgacctgaggtcaggagtttga
-taccagcctggccaacatggcgagaccccgtctctactaaaaatacaaaaattaatcagt
-catggtggtgggcacctgtaatcccagctacttaggaggctgaggcaggagaatcactgg
-aacccaggaggcggaggttgcagtgagccaaggctgcaccattgcactccagcctgggca
-acaagagcgaaactcccatctcaaaaaaataaataaataaaaataacagatgctggcaag
-gttgtgaagaaaaaaggaatgcttatacactattggtgtaaattagttcaatcattgtgg
-aagacagtgtggaaactcctaaagacctaaagacagaactaccatttgacccagcaatcc
-cattactgggtctatacccaaaagaatataaatcattccattataaagacacatacatgc
-ccatgttcattgcagcattatttacaataacaaagacttggaatcaattcaagtgcctgt
-caataatagactggataaagaaaatgtggtaaatatatgtcatggaatactatgcagcca
-caaaaaagaatgagatcacgtcctttgcagggacatgaatggagctggaagctattatcc
-ttagcaaactagcacaggaatagaaaaccaaataccacatgttctcatttacaagtggga
-gctaacttatgggaacacacagaaacacagaggggaaaaaccacacactggggcctcttg
-gagggtggagggtggggggagggagagaagcagaaaaaataactaatagacactaggctt
-aatatctgggtgatgaggggcgggcacagtggctcatgcctgtaatcccagaactttgga
-aggctgaagcaggcagatcgcttgaggtcaggagttcgagaccagcctggccaatatggt
-gaaacctcatctctactaaaaatacaaaaattagccaagtgtggtggcatgtgcctgtaa
-tcccagcttctcgggaggctgaggcacaagaatcacttaaaccagggaggtggaatttgc
-catgagccaagatggcgccactgcactccagcctgggtgacagaacaagactctgtctca
-aaaaataataataataataaatctgagtgatgaaataacctgtacaaccaacccccatgt
-cacacatttacctatgtaacaaacctgtaccccctgcacacataacctttgatcttaaaa
-taaaagtgaaaaaaaAAAGTGTCTGTTCATGATCTTTGCCtttttttttttttttttttt
-tttgacagagttttgctcttgttgcccagcctggaatgcaatggcatgatcttggctaac
-tgcaacctccacctcctggattcaagcaattctcctgcctcagcctcccaaatacctggg
-attacaggtgcccaccaccTCAAAGtaaatttctttgagtttcctcaacacagctattgt
-gaattatctgtcagaaaagtcacatatctctgtctctctggaatggcccctcctgcctta
-tttagtccatttggtgaggtcatattttcctggatggtgttgatgctagtagatgttctt
-cagtgtctgggcattgaagagtagggtatttattgcagccttcactgtctgagcttgttt
-gtacctgtccttcttgggaagtctttccgaatattcaaaaggtcttgagtgttgtgatct
-aagctatatctgctttagggggtaccccaaacccagtaatactgtggttcttgcagactc
-ttagagataccaccttgatggtcttagacaagatctgagaaaattctctggattaccagg
-cagaggttcttgttctcttcccttgctttctcccaaacaaacggagtcagtctctctctc
-tctctctcttttctgagctacctaaagctgaggatggagtgacataagcatccctgtggc
-caccaacactatgactgcactgggtcagacctgaagccagcacagccctaggtctcaccc
-aaggcctgctgcaaccactccctggctacttctcaaggccctgaggctctacaatcagca
-agtggcgaagccagccaggactgtgtccttcctttcagatcataaaggtaccccaggccc
-aggatggatacagaggttcccatggggactccgagactagagtaacaaaccttagaaatc
-tacctggtgttctattgtactgcagctgagcttgtactcaaaccacaagactcagtcctc
-cccactcttccctctcctttccaaaagcagaggagccttacttcgtggccaccaaaacca
-caggccacaaggaatactgccaggctactgctgatgttccctttaagccccaagggttct
-tacgtcagcttgtggtgaatgctgcctggcctgggactaatccttcaagaaggtaggctc
-ccctctggcccatgacaggtccagaaatattcaagagtcaagtcctagaatcgaggaccc
-caagagcccacctgatgctctacctccttgtggccaagctggtacctaaggtgtaagaca
-aagttcccttcattttttctctgcttttctcaagcagaaggagttctgccctatagccac
-cacagatggggatgtgttgagtgtcacctgaagccagaaagtctcatgggttcacccaag
-gccatcagtgtggaacctggttatcactgctggttattcagggcacaagggctctttagt
-tagcaggtgattaatgctgccaggactgggtccttcccttcaaggcagtgggttcccttc
-tggcccagggtgtgtctagagatgtttttcaggagctacgtcctggaagagggtctgtca
-actatctggtgcctgatcctgctgtggctgagctggtatccaagatgcaagacaatgttc
-ttcctactcttctctctcttctcctcaagtggaaggaaatggtctcttttggagctatga
-gttgcgcagcctggggttaggggaggatgatgttagaactcccttagctgccctagctac
-tgttttagtaggtcatgtgccccccagtccactgtctctaggcccagttcagcactagga
-cttgcctaagagttgcagtccttggggtttagactgcctttcaagtttgcttagagaccc
-aaagcccacagtggaaagctttgcatgtattcaagttccgaccactgagatcagcaattc
-ccctctggttagggctggtttaaatgcttcctctgtgggtgggcctcagctgcatttggt
-ccagttttcctttctgctctaactgggcagcactgagttcactgcctcacaattgccgag
-ttttccatccctcctccagcacccagagattatctttgcatgctgctaccgacagggcag
-tgggagtggggagtgcagggtggcagctgtgattgaggactgtgttttctatttcttcag
-tgcctcattcagtggtaggaactaaaatcaagtgctatgattcttattcttatgaaggtg
-ttttttgtgtagatagttgttaaattggtgcctttgcataggggagggaggacgatcagc
-ggagccttccattcaggcatcttgctctgcctcctttttccataaataatttttgggagt
-ctagtatgttccaggaactctttcaggtcctgaaaattagacatgcattcatggagcata
-cattcaaaagtgggaagcagataaaaaatcatatgaataaatatatagtatgtcagatgg
-tgacagggctctggagcaaaagaagatatagaaagaagatgacaaggccaggcacggtgg
-ctcacacctgtaatcccagcactttgggaggctgaggcgggcggatcacctgaggtcagt
-agtccaaggccagcctggccaacatggcgaaacaaaatacaaaaattatccaggaatgat
-ggcgggtccctgtaatcctggctacacaggaggctgaggtggaagaatcacttgaaccca
-gaggtggaagttgcagtgagccaagatcatgccattgcactccagcctaggcaaaagagg
-gagactccatctcaaaaaaaaaaaaaaaaaaaagtgctgagcaaaaaagagtacagtttt
-aaatgaggtatctgtgaaaagactccttgaggcagtgacatttcaggaaggatgtaaaag
-ttatctggggcaagagagtgtcaggcaatgagaagagcaagtgcaaaggccctgaggtgg
-gaccatgcccagtgtgttcaagaagtagcaagaagaccacatggataatgtgaagcaatg
-aggaaagagaaaaaggggattatatcagaaaagtaatgggggtgcacatttggggttaca
-ataaagaattagacttttcctctaagatggaggttattggacagtgctgacatgatctga
-tgtattttcaaaagatgcctctggcttctgtggtcaaaacagattgagagggagggaaag
-tataaaagtggaaaacctgttgcatgggcattacaaaatctaagtgacagctaatagggc
-ttagatagagagcatcagagaagagggtgggaaatggtcagactcttacatacctattga
-aaatacagtcactcgtagattgaagagaaaggaagaagtcaagataacatcacagtttta
-gtctgagtaactgaaagaatgaagttgtcactgacagagatggatataacaggagaaagt
-tcagattggtctttttgcttgagggaggataaaaacctttgtttgggatacgtttgcttt
-ggagtgctatagacatctaagtggaattgtcttgtaaacaggagagatttttaagccatg
-agactgaatgggattgtcaaggctatgactgcagaaaagagcctaatgcctgagacctag
-aactccccaatgttgatgaataagaagcagcaaaggacactgagaaggttcattccagtg
-aggtcggaggaaaaccaagagaacatgatgctctgggagcttaattaaattaagttcatc
-aaggaggataaagcaccaaatgctgctgatacatcaagatgaggcatgagaattgatcag
-tggCCTACCAGAATCCCAGCTCCAtgacctcttaccagatgccaagtagatgacaaatgc
-atttcaaatgcattgcttactttaatcatcacaagaacactatgaagcagaaattaatat
-acctcaatttttaaaactggaaaactacaatttagggagctaataatgtgcccaatgtca
-cacagccaataaggaattaactgggatcaacacaggtctgcatgaacctaaaattaaagg
-ccttagccactatgctaagctgcctctcCAGCTGCCTTCCATGGGTCAATTCTAGGGAGA
-CTGAAGACAAAGTATTCAAATAAAAGATGTTGCTTTATTCAAAAAATGTATTGGCCATGT
-GCTTGGCTGGACATTCTTCCATGACCTACTCCTTTATACTCTATTCATCACTTACAGGGC
-AGCCTGTTTTAAGAGAATTCATATTTCTTATTTCTGAAGATGACATTATTACATCCTGGA
-AGAAATATTGATTGCCCATTTCAGTATATTCCTAAGTCTTTTTGTTCCTCTGTGTCAATT
-Ctttttcttttattattatactttaagttctagggtacatgtgcacaaagtgcaggtttg
-ttacataggtatgcatgtgccatgttggtgtgctgcacccgttaactcatcgtttacatt
-aagtatttctcctaatgttatccctcccccctcccaccaccccacaacaggtcccggtgt
-gtgatgttccccacctgtgtccaagtgttttcattgtttaattcccacctatgagtgaga
-acatgcagtgtttggttttctgtccttgcgataatttgctcagaatgatggtttccagcg
-tcatccatgtccctacaaaggacatgaactcatccttttttatggttgcatagtattcca
-tagtgtatatgtgctacattttcttaatccagtctatcattgatggacatttgggttggt
-tcgaggaagtcaaattgtccctgtttgcagatgacatgattgtatatttagaaaacccca
-tcatctcagcccaaaacctccttaagctaaccaacttcagcaaagtctcaggaaacaaaa
-tcaatgtgcaaaaatcacaagcattcctatataccagtaacaaacagagagccaaatcat
-gagtgaactctcattcacaattgcttcaaagagaataaaatacctaggaattcaacttac
-aagggatatgaaggacctcttcaaggagaactacaaaccactgctcaacgaaataaaaga
-ggacacaaacaaatggaagaacgttccatgctcatggataggaagaatcaatatcgtgaa
-aatggccatactgcccaaggtaatttatagattcaatgccatccccatcaagctagcaat
-gactttcttcacagaattggaaaaaactactttaaagttcatatggaaccaaaaaagagc
-ccgcatcgccaagtcaatcctaagccaaaagaaaaaagctggaggcgtcaATTCTTTAAT
-GTCAAGCAGCCTTTATGCAATCTTGGATTGGGCACAAGAAGCACACAATCTCCTCATTTT
-CAAAGCCCTTCATGGCTAAGCAATAGAGTTCCTCTTGAGTAGGCTGGAACAGATAATGAA
-ATGTTGCTTTTTAGATGTGGTCAGTTAAAAATAAAATCACCTATCAACATTTGTTACTGT
-ACCTCCAGCTGTGATCAATAGTACAAATTGCTTTTAATATCTTACTTATAAATAGACTTT
-AAGTATGTTTCATTTCTGAGAAATGTTCTCTGAATTCTACTTAAGATGTTATCTTTCCAA
-ACTGCTGGACGGGCTGAATCCAGGCAAGAAATGGGATTGCAAATTCCCTTGCACGAAGAC
-TTGATGGGTGAGTCAAAGCAAGATTCCCTTGCCATTCTTTGTTTAGAGGTGAGAGGAAGG
-TTAACTAGCATTTTATGCTATAAAAATCAGACACAAAGATAAGCAAAAAGAATACAACAG
-AAGCCACTCATTATTTCAGCTCTCTGTTAACACTTTGATGTTCACTTCTAAATATGCTTC
-CTCAAAGTAATTTCTTTTCACAACTGGGTAGGAGATAAGATAAAGCAAAGTGAGCTTGCT
-TGCTTTTCATCCACTCAGTTAAAAACAGTCTTCCAGTTGACACTCCCTGATACATGCACA
-CTCAGGCACACACAAAAGTCTGCACTCATCCATTAACCTCAAGAAAGAGACCTGTTGACA
-AAATAGACATACACCAGTTCAGAGGAACCTATGTCACCTGTCCCTAGTAATCTACTTTTA
-AGCCTAAATATATCAACAGTCAATTTCAGGAAAATTAACATTAAAAAAATTTAGATGAAC
-AATAGGAATGAATGAACTTAAAGGAAAAGAAGCTAATATCAAGGACAGAAGATAATTATT
-TAAAATGATGAGTGACAAACTTGACTAAAATGCACAACCTCTTCATAACAAAAAGCATGC
-AGGAGAAGGTACAAGTCAGCACAAGgttaaaagacaatcagagtagaacaaaaattctat
-gtgcatgataccacaaaaagattgctatccataatctatatgaagaataactacaaatca
-ataagaaaatgacaaatgacccagaggaaaataggcaaaCAATAGTATAGCAGCAAAACA
-TTGTAAGCACTCGTTTCAGAAGGTTGATATAGATTCAGAAATATGATATTCCCTTTAAGA
-GAATCTGCTTTTAATCCATAAATTGTCTTACAAACTAGTTTTATTAGTTTAATATTAAAG
-GAcccattagtgggtatatatccagaggaatataaatcattgtattataaagacacacac
-ctgaaaatgttcattgcagtactattcacaatagcaaagacaaggaatcaacctaaataa
-ccatcaatgacaggttggataaagaaaatgtggtatgtatacaccatggaatactgtgta
-gccataaaaaagaacaagatcgcatcttttgtgggaatatggatggaactgcagaccatt
-atccttagcaaactaacgcaggaacagaaagccaaataccacatgctgtcacttataaat
-gagagctaaatgatgagaactcgtgaacacaaagacgggaacaagagacactggggtatc
-cttgagggtggagggcgggaggagggagaggagcagaaaagacaacaaacctctgtgaca
-caagttttcctatgtaaccaaccttcttatgtcctcccaaacctaaaacaaaagttaaaa
-aaaaaAAAAAGACCCAATTGGAGTTGCAATTTGCTCTTTCCCATTCTACTGCATTTCTGA
-AACCCAAAGTGTACAAAGAATGTGTCTTATGTTTTATGAAATGTACATTTGGGCCCCCAT
-TTTTTTATTTGTATAACAATTGTAAAACACTATCTAAAGGCATAAAATGGCTAGGATGAG
-AATTACTATTGGTTCATAATTATATTTGCTTAATTACTGAAGATGTAACTGTACTCGCTT
-TAAGTATGCCATTTGACTATTGCCCTTCTTTTTGTCCAGAGCCATCAAAAGATTAAAGTA
-TTTGAAATGAATAATGTAATGGTTTTGTCTTCCTGCTACAGTGTGTTTCAGGTTATTTTC
-TAAAATCATAATGAACCCTGTTTTTTTGTTGTTTTTATTATTTTTTGATAAGTAAATAAT
-GCCACGATTGGTAGATCTAAAACTGAAGAAGGAGACCCTATGGCCTCAATCCAGAATGCC
-ATAGCATGCTAAAATGAGAACTTCCTCCAGGTGTGTATGTGTGTGTTCAGGGCCACCTAT
-GTATGCCCGATACGTCCAGTCTTCGTTGATGAAAATTGTTAGAGGTCAGTATTACAGAAG
-ATAAAACAGAAAGGCCATATGTTAATAATGAGAAATAAGTGGTTAATTCATAATTAGTGA
-ATCTGGTTTCAGCACTTTGGCCTTCGAGGTGGTCAAAACAGGTCTCCAATATGAACTAAG
-GATTGAAAAGattaaaattatttttttaacaaaaattaaGCTCAAAGAGTCTTGGATGCT
-TCAGATTGACTCTGCTTCTGGCATAACTTGAATAGAAAATCATATAAGGGTCTATGATGG
-GCACCATGCCCAGAGCTAGTTGGTTTAAATGTCATTCTATTTTGGACCCTAAAGATAAAC
-ATGGCCTACTGTGATTCCGTCCTGCGTGGCTGTTCTCTGGAGCAGTAGTCATTAATCTTT
-GCCTGCCTTCTCTCCCACCTAGGTGTGTGCCACCACCCCATGGTGACATGAGCTTCatta
-attaaaaaaaaaaaaaaCtttttctctcttttcttaatagaaatgaccttggaaaatttc
-tattggtctgtcttcaagttcatttctctttccatatcatatctacatggctgttaagtc
-caaagtttattatttaaataaataaataaaattgataaaactctagccagttgatcaaga
-aaaaagagacaattaccaaattttcaatatcaggtataaaaagaggacatcattacatta
-aaagttttgtgagagatgattctatatgccaaaatttttgacaacctatatgaaatggat
-aagtttcttaaaagatacaaattaccaaaactgacctaagaggaaacataaagtttaaac
-gatgctgtatcaattggagaaattgaatccatagtttagtcttctcacaaagaaactttc
-atgccttgatggcttcactggtgaagtataccaagaaataataatggcaattctacacta
-actctttcagaaaataaaggaggagacacttctcaaatcattcttcgaggccaatattac
-cttggttccaaaaatatgcaaagatatcacaagaaaagagaactatgagccaatatcctc
-atgaacataatttcagaaatctataataaaatattagcaaattgaatgcggtgaagaata
-gaaaggatcatagaacaggacaatatgatgtttatccccagaatgcaaagttgatgtaac
-atcaaaaaatgaatcaacgtaattcaccatattgatggactaaaggggaaaaacatatga
-ttatttcaataaatgcaagaaaagcatttgacaaaattcaaagccctttaaaaaaaactc
-atcaaactaggagagatggtaacttcaagctgaataatgctagctacaaaaaagtaacta
-cagataacatcacctttaacttagaaggctcatgtctttctactttaattaggaacaaat
-ggtaagttgaccacaaccacttttacttaacgtcatactgaaggtcttagctactccaaa
-aaggctagaaataggaataaaatgcatgcatttagaaaaggaagatacagcagattctat
-ttttagtttttaatttttataggtacatagtagatgtatacatttatggggtacaaagtt
-attttgatacaggcatacaatgtgtaataatcatattagggtaaatggggtatccatcac
-ctcaaacatttatcttttctttgtgttatcaacattctaattatactcttttagttatat
-ttaaatgtagaataaattaattttgactgtagtcaccctgttgtgctattgaatactaca
-ttttattcattctgtcttactatattttcatacccattgaccatcccctcctcccagacc
-cccctactacccttcccagactctgatcatcatcattctactttccgtcttcatgagctc
-aattagtaaaactttccttttttgcagataacatgatcatgtacataggaaaccctaaag
-aatccttggaaaagctattacatctaataaatgaatttagcaaagttttgaatgaaagtc
-tgtatacaaaaatatatatgtgcatattttagcaaaaaattagaaaaagaaattttgaca
-aaaactaccctttccataatagcatcaaaaatgaaatatttaggGGCCGGGCATGATGGC
-TCACCAATCTTGTACCCCAACAACCAGAATGATTATTTTTTATAGTTTTATGTATAGTCT
-ATTTTGGTTTTAAAATGGCAAAATACTATATGATTTTATATAAAAACTAAACTAACTTAG
-AAGTATGCAGTAAGAACGTGAAGGTCAAACACGCTGTCCATAACACTTAGGAAAATGAGA
-TCAACAGTAAATAGAAGACTGGTTACTCATCCTACAAGAAATGGTGATGAATAGGCCTGC
-AAAATATCCTGTAACTCCTCTAGAGGGTGCTCACTAGCAGGACATTCACATGCTACTCCA
-TGTGATGTTAGATTATTGTAAAGCATTATGTTCCTATAAAGGGTGGCGTGACAGTCCATT
-ACCAAGCACGAGACCCTCTGCTGATCTGTCCTAACAAGTGGAATTATGATATGCAGCAAC
-ACAGGAACCAGGCTTACGCTAGCCACATTGCAGAGAGACATTGCCAGAATCTCACTTGTA
-GAGGCCACCATCATATACATCAGTAAGCCTCTCTCCCTGGATCCACATCTCCCTCTATAA
-GGAGCCCTGTTAACCCCATCATTTAAGGGCTTCATACATTTGCCTTATATTTCTCTCATA
-AACAAATCAATGAGTTCCAGACTTTTGGTACAAATGTATGAAGACAGAAGAAATCATATT
-TCAGtcttaaaagcctaatcccagaagtgacacccatcacttcacattccattgccaaga
-gcaaatcacatgaccacacagatgcaaggggaatgagacattggcaaccacttcccagtg
-aCCATTATATATTATAGAAGGGGGGCATGCATGTAAGAGGAAAGTTGGTCTTCTCTGACA
-GAGACGTAGAATTCTACAAACATAGGGGAGGACGTTAAAAGGTGCTGAGCAGATAAAGGT
-CAAATGTCTGTTACAGAAGGACACAGGCACCAAAAGATAAAGagatactcctcaatttat
-gagggagttatgtcccaataaactcaccataaattgaaaatatcatacgtcaaaacttca
-tttaatacaactaacctacctaacatcatagcttagccaagcctgccttaaatgtgctca
-gaatatttatttgagcacatagttgggcaaaatcatctaataaaaagactattttataat
-aaagggttgaatatttcctgtaatttattgaatactgtattgaaagtgaaagatggaatg
-gttgtatgggtacttgaagtatggtttctactgaatgcatatggctttcacaccatcgta
-gagtcaagaaatcatgtcaaccatcataaataggggactatctgTATGACAGTAAAAACC
-ATTTTGTTACACAAATAGCAATCATCAAAAAAGAAAACACAGCAATTTCTGTTGCATATA
-TCCAAGCATTCAACAACAAAAGACCTTTCATTTTAATCAtttttttaagacacacggtct
-gactctgttgcccaggctggagtgcaatggtacaatcatagctaactgcagccccgacct
-cctgagctcaagcgatcctcctgcctcagtctcttgagtagctgggactacaggtgcgca
-tcactatgcctggctagttttttctagaggcagagtcttgctatgttcctcagactggtc
-tcaaactcttggcctcaagtgatcctcccaccttggcttcccaaagtgctagaattacag
-aggtgagccacagcacctggccAAGAATAGACATTTTATATCAAAGTAATTCAAGTATCT
-ATATGAACAAGTAATCGTGCAACTAGGTAATCAGGGCTTTGACCAATTTTGAATTACACA
-ATTAAAGTGCTAATATGTATTGTATTATACTGTATTTGCTGTAGCAATGCAAAAACTTCA
-TTGTTCTTTGTCCCCAAATACAACTGTCACTTATATTTCACTGTTTATGCTGCTAGTACA
-TAGCTTTATAAATTAATCTATCTTGTTTCTGACACTTATACATATTTCATCCTCTGGGGA
-CCTGGAGGAGCATATTCTTTGCCCCACCTCACAATTACCTATGCATATTTCTCAGTAACA
-GGCATAAGGCACGCTGCACAATCTTAGCTGATGAGATAAGAAGTCTCTCCTAAGGCTTTA
-CTCGCTGGACCATGGCAGAAATGTGGACAAGAGTGGTTGCAGAACATGCTGTGCCTGGGG
-CAAGGACCCTCTAATAGAACTAGAAGAGATAAGTCACAGGTACAAGGAGTGTGCAATCGG
-TCTGTTCAGCCACAGTTGCTATTAGAGGCCCCTGAAGAATTTGTTGTACTTTCCACGCTA
-GGCTACCTCGATCACAGAAATCAGCCTAGAGTCATATAACCCAAAGGGGGAGCTGACATT
-GCTGCTAAGCCCTCCTCCTGAGGGCCTTTTATCATCTCGTCCTGTAACCTACCTTTGCCA
-AGACAATTCCTTCAATCTTTGCTTTGTTTCAGGGAACAGTAATCCTACTAAGACTCTAAC
-AGTAGGGACGAGAGAAAGGGATGGAACAAAGGAGTGAGGCAAGGAGGCATCAGATGAAAG
-TGAGCTAATAATCTGTTGGCACCCATCACAtgctgagtacttccacttacattatcacac
-ttaagatgcacaatactttgggcatgatgtcactgccagcaaatctgaaattaggaaact
-caggcccagaagatatgaagtgacttttccggggtatcattaatgcaccagcagtgtaag
-ctaaattgaatccattctgcctgacaccaaaatcgtattcctttcCTTCCCTCCCACAAT
-TGTTTCCATTGGTGTATAAAACCTCTAAAGATCAAGATGTGGCTTCCTTCTTTAAAGAAA
-TAAAGCTGAGGCTAGGTAGTGACAGGTGGGGGCAAGTATGACCATCTATGAATGTTAAAT
-CTCACCCTCAATCCCACCTTGTAGTTTACCATCTATAGACTTGGCCTTCTTTAGATGAAG
-CAGTGTTGTAGGGgcctttctcaactggtgttcctcattcgaaccacagaacacagaaaa
-tgacttaggtgactattttcccaattcttccaaagatgatacatatgaataccattctag
-gtgcttagaagaaaggttaatccaaacacaatggatgtgtttggttgttaggatttaatt
-tgcttgcagaaacccaattgagacatgctgGTAGGGAATCTCTAACATTGGTCCACTGTA
-GAAGACAGAGGAGACGATCAATTTATTTTGTCTATCAACCTGCAGAAATAAAGAGTTTTG
-GTGGAACTGTAGGTAGAGAAAGAAGGAGGTACCTTCCCATGGCCTTGATGAGCCTGAGTC
-TTTCTAAATGCCAGGAAGGAAAACTACTCAAATTAGCTGTAACAGGGAGTTATCACAACA
-ATTTTTATTCTCTTGGGAAGTGCTAAAACAAATATATATGGAAATCTTACAGCCAACAGA
-AACGAatttcccactgctttcctccctcccaaactttcccactgtccctaattgaaaccc
-cattggaaggtaactaaatcctgtacaaccagaatctcctcatctaacttttcatttctc
-cctgtgttaaattaatcctgtttctccctcatggattcaccatcaacttgtactctcaag
-ctgatgctgttcattttcccacttttcatgactcaaggccaaaaggttggtatggcagct
-tcctcccttcccaatgttattttgaaaacattgcttctgtagtgtaaaatccccaactag
-tcaagactcaagtcagctcttttcaatgcctcttcaaccatctttattgttatattttaa
-aaagcagccccccatttattgaggactttggcactttgtttagaatgtatctattctgat
-tattgcctttattattggtgacttcagcatccatatggaaacactatccagttctacaaa
-tgttcagttatttgtcctccttaatgtcaataatttacctgctattctactcctgatttc
-tggccatagagctgtccacgtcatcatcaatgaccactccacacatgaactctgaactcc
-taccaccttctctgatcacacccaggcaccttttcagctccctcattttattatagaaca
-tgcatccgccagacgcttcctccttcacttttctattttttttttttttttttttttttg
-agatggagtcttgctctgtcgcccaggctggagtgcagtggctcgatctcggctcactgc
-aagctccacctcccgggttcacgccattctcctgcctcagtctcccaagtagctgggact
-acaggtgcccaccaccacgtctggctaatttttttgtatttttagtagagatggggattc
-accgtgttagccaggatggtctcgatctcctgactttgtgatccacccgcctcagcctcc
-caaagcctccttcacttttctttattagcctcaaccccatgattcaccactccaagtact
-cccttgccagcatcctcaaatcccaataccatttttaaaattttttaaagaatttctgca
-cccacctgtgtgaaaagttcaacccccagatccttttaactgtttgtcttctccacagac
-aaattcaggctgatgagcagtgctggaaaaagtgcacagctgcgcagattagtggcacct
-gcattcatgatctccagttttcacaaagccctcaGCAGCAGCCACTTGGTTCCCTGTGTG
-CAGCGTTCAGTGGAaaactccatgagggcaagaacaatatctgcttttactcattatttt
-aacccacttgaatgttaagctccatgatgacagggactttctgcggtatagattattacc
-ggcccctaagacagtttctggcacataatagacgctcaataaatactcagtgaaggaata
-aaATAAATAGGAGGTTAAAATTAAGTGATCAACAGTAGTCCAGGGTATTAAAGagactcc
-ccttaaaagctgcaattaagcagagtcatgagaggtgagtaggagctagcctgagaggaa
-atggaaaagacagtattaaaggcaggttgaacagcGCCTCTGTGATCCCTCCCTCATGCT
-TTACACACAATCGTTCTGAGTATTCTGTACTCAAAGCCCTTCCATTCTCTCCAGTTCCAC
-TGCCGCTCCTATGCACCCTCAGATGCAGCCTCTGTATTTCAGCCAGAATGGTAGCTCTAA
-AAGGTAATTCTGCTCATTATTTTCAGCTTCTATTTGGAACTCCTCTCAGAGCTCTCTAAA
-TTTCCTCAAGATATCTATCAGTTAAATGTGTTCACCcagtggtcttccatgtggtttgta
-tatgccaaggtatccccaaaaccctttgaaggagtctgcaaggtcaaaattattttcata
-acaatatttttaaaataactagtttcataataatattttgccttttcacaaaattgacat
-tggctctgaaaatgcaaactgaagcagataaaatagctagtgcctcaccacaaatcaaag
-caggggcacaagtctataattagaagttggattctttatcaccaagcacttgtaattttt
-ttaaatgccactcttaagaatatacttgacaaagtataaaaatttttaattttattgaat
-cccttgagtaGATTTTGTTCTAAGgttaaagtaaattaaagtggaaaccaggcctggaga
-atccatgagcagacaaggcctcttaagtgctcataacttttcttgatttgcaaacgtaag
-caaaacttaattggagctatttcttgtaaatgcctatattaaagaaaaatagaacttaat
-ctcaaccaatcaaaagcagctaactaactcgtaattatataagaaggtacttcccagcag
-gatagaccaaataagacaaaatttgtaactataaccaatcaaatattttatttgtattat
-ttccacacttactgcataaaagcgtgttccttacCACttttttttttttcttgagacagg
-gcctcactctttcacccaggctggagtgcagcggcatggtaatggctcattgcagcctcg
-aactccggggctcaagcaatcctcccacctcagccttctgagtagctgggaccacaggca
-cccaccatcatgcctggctaatAtttttttttttttttttgagatggagtctggctttgt
-cacccaggctggagtgcagtggcgcaatctcggctcattgcaagctccacctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacaggcacccgccactacg
-cccatgcccggctaatttttttttcttttttttcttttttggtagagagaagggtgtcac
-catgttgctcaggctggtttcaaactcctaggctcaagcaatcctcccaccttggcctcc
-caaggtgctgggattactggcaggagccaccatgtccagctTccttaccacttcttaagt
-gaagaccccgaaccacttctggtttggagttgcccaattcatgcattgctgtttgctcaa
-ataaactcttttaaaaatttttattatgcctcagtttaccttttGACACTatgttctgag
-taatacaaggaaaagtacatataaagcacttctgcagtataacaagctatgatggttgtc
-gccagaaaaatcacttaaataactatttggattttaaactgaactaggcacttttttatg
-aaacatcatttttatttgaaagaatgatggaaaaagtatggttattcagacttacatact
-tggcagaaattttctcaaaaattaacaaagtgaacttgtcatttcaaagaaaatagctag
-caatattagttaccaatctattcttataatgtgtggctgacaacaagaagtgaagtcact
-gctccctttccttgaacctgggaagatctttgtaaccaacctgaccagtacaatgcagtg
-gaagaaatatcaggtgatttccaaggcagaacagcttctgactggccctctgtctccagc
-caccatgttagaaggaagttcaggccacatggagacagcaaggcctctagctcacagtca
-gcatcaactgccagacatgtaagtgaatgggcctccagatgattccagtccccagtcttt
-gaggcttcccagctgacgtcactgacattaccatgcagagacaagccatctctgctaagc
-cttaatttttaacccatagagaccatgaaagaataacaaatgatgattgttttgaagcca
-ctacattttggggtaattcattatgcagcaatgggtaaGTAATCCTGGCATCACATGTTT
-TTCAAGAATGGGAATATGTCTTTTTCTTCCTGTCTTTCATGTCTAAGCCCTCTATCAGTG
-GTGCTTGTTGTGTGGAGTTTGGAGCCCAGGAGTAGTCAGAAAAGACTTTGATGACACAGG
-GTTGCTTGTAGAACATCTAATATGAGCAACTCCTACCTTGTGCTCACTGACCAGGCCCAC
-AGAAAAGTCAACAAGGGCAAAAGTTCTTTGCCTCACAGCACAGAACTGCTCCTTCCTCTC
-TGGTGCCTCTCCAACCACAAAATTCCTTGTCCCTGTCTTTGCCAGTCTCATGTTAAGAAA
-CCCCATAGACCCAGGTATTCTCCAATCTTGATGATAGAAGGGGAAACTGAGGAAGAGGTC
-CAGCTCACAACATTCTTACCAGCCCAGGGGGAAGGCCAAGATCTCCACAGAGTCATAAAC
-TCTAGGCCAAGACTATGCCTCTCCCAGGAATATCCAAGTTGGATATACCATATATTTTAT
-GCAgataaaatagctagtgccttaccacaaatcaaagcaggggcacaaatctgtaactag
-aagttggattctttatcaccaagcacttgtaattttttaaaatgccacttttaagaatat
-acttgacaaagtataaaaattattaattttattgaatcccttgagtaGATTTTGTTCTAA
-Ggttaaagtaaattaaagtggaaaccaggcctggagaatccatgaaaagacaaggcctct
-taagtgaTAAAACCTGTATTATTCCTACAGAGTCTCCTCTAATGTCAGCAACTGTCCTGG
-TGTCTCAACCTGTCTTTACCACCTTGATTTAGCCATCATGAAAGATCAGCCAACTCTATG
-TTATTGTATTTTTATTTCCATCTCTACTTTTTATTACAACAAAGGTCCTACTTCGTTGAA
-TTTTCCCTTGCTTTTAAAAAAACGGAAGGTCTTTAACTTGTTCTGAAGAAACCTCCTGTG
-AATTTCAAAAGGGCTCCCTATCTGTTGCATGTGGGGAAGGGCCACGCACATCCACATTCC
-CTTCGTTCCAGGGCACTGGATTTTCAAATATTGAGTTCTTGCTGTCTTCAGTCTTTGAAT
-AAAGCTCACGTGGACAACTATGAAGTTTAAAAGCATAGGTTGAGTTTGGGGTATAGTCAT
-GAGAATAGAGAGGAAAGAGCAGAAGTACAGCTCATTGCAGAGGACAAGCATCATGATATT
-CAGAACATTTGATATGGAGTGATATGGGGTAAGAGTGAGCTGGGTTTTATTCTGGGAAAT
-CACCCAGccctgaaaaagctatttatattcttttgttcactttccttatctgtaacacag
-agaccgttatgccaggtttcctagctactttagttgttgtgaagCAGCATATTATAAATA
-TCATAAAAGATTATCCAGTgctaggtgccatggtgcacagctgtaatcccagctacttgg
-gaggcagagtcaggaggatcacttaagcccaagagttcaaggctgtactgcactgtgttc
-acacctgtgaatagccactgcactccaacctgagcaacacagtgCCTCTTAAATAtgtat
-atgtatatatatatatatgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtATAT
-ATATATATATATACTCTTTTAAATTTACTCTGTTTTAAATATTTTGAGGCAGAAGCAAGA
-CGTTTTGATACAGAAAGCCAGCAGGTTGCTGAATTACAAGACTGAAGCTGAGGAAACTGT
-GTTTATCAATAGAGATGCACCGCTCATTCTTATAGAGGGAAGAtacaaagtaactctatt
-aagtcaagaatttctatatgttttatttactgcaatatcctcagtacatagacagcagtt
-gacatatagtattgatcatagtatctaatgttcaatagatatctgctgaatgaactgaaA
-AATTAATAATGTTGAGCAATAACAGGTAATCACTGTAAGATAACATTCTGAGGAGACTAA
-AATTTGAAGAATGCCTACAAGAGAGGGAGATGCAAAGGGAAAACATATCCTAAAAAATGA
-AATGAAATTATCCTTAAGAGAAAAAAGAAACACCAGTATGATCAAAGATTGCAAGAGGTA
-GAAGACAAAACTGCATAAAGTAAAACAAAATGCTGAACTCTTGAAATGCAAAAATCCAAA
-AATCCTGTTGCCTGTtttttttttgtttgtttgtttgttttttttgagatagagtttcac
-tcttgttgcccaggctgaagtgcaatggcaccatctcggctcactgcaacctccacctcc
-ttggttcaagtgattctcctgcttcagcctcccaagtagctgggattacaggcgcccacc
-accatgcccagctaattttttgtatttttagtagagacgggtttcatcatgttggccagg
-ctggtctcgaactcctgacctcaggtgatccacccatcttggcctcccaaagtgctggga
-ttacaggcatgagccactgcactcggctGTATTTTTTTTTTTCACTTATTTAGAAGGCTG
-ATTTATTATCACCTCCTGCCAGTCACGGGAATGAGACAGAATCACCTTGAGAGTATCTAC
-AGGGAGAATCTGGAGTCCAAATCCCTTCTTAATCAAGAAATGCTCTTTAATCAACTCCCT
-ATATATAGGGAGGTTGATGCTGGGACAAGAGGGGCTGAATAACTTGGGGTTCTAGTCTTG
-GATATGGAATGGGGGCAAGTGTGTACAATCTCTTTGATTTTCCCCAGGGCTTCCATCAAT
-ATTCCAAAAGACTAGAAATTCTGGACAGCAGCTTTTCCCTTCTCTCCCTTTCACACTTCA
-GTGACTTCTGTCTTCATCTTAAGACACTAATCTACACCCAATTTTCTCTCCTTCCTTTTT
-GCAGGAATGCTATTCATTCAAAAATGCTGGGATGAAAGAGCAAACTTGCAAGGATATCTG
-CTACAATAATTAAAGAGAAATAGATGCCTATAATTAAAAACATTGCTGCTTGTCTCTGAA
-ATTATTTGAACACTGTATACATCATAATGTACATAATCAGTTTCCATCTGATATCCCAGA
-CATCTAATCCTGGAAACAACGTCTAATATCTCTACCCCAAAGCAATAGAATTAGAGCTGG
-AAGGGGCAGGTAAGCAACAGTGTGGACCTTTctcagcagcagtgaacttggggtgctcac
-aacctgtgcaaaaccagctgtggtggctaaggattgcctatgtcacctctcccccaactc
-taggcaatgcagcttggggatagactccttccacttgggggaagaagagggaagagtaca
-gagggctttgccttgcaacttgggtaccagctcagccacagtaaagtaaagtatcAAAAG
-TTacccagcatggtgccagctgtggtggccactggacttgcccttcccccaactccaagc
-agcctggcacagagagagagactccttttgtttgggggtaaatgagggaagagaagaaga
-aactctgcctggtaacccagggaatttggccaaatttaaaccccagcccactaaggtggt
-tcctctaggactcagcgagagttgcagtgtttctgagcttagggcaccctctagtgctga
-tatagtttcaataatcacaggctcaaatcacaacactcaatctccttcaaatacctgaaa
-agccttcccaagaaggatgggtgcaaacaagcccagattgtgaaggctacaatatgtatc
-taactcttcaatgcccagacatcaacaaccatcttcaagagttaagaacatccagggaaa
-tatgacctcatcaaatgaactaaataaggcatcagtgaccaatctgagaatgatggagat
-atgtgactttttagacaaataattcaaaatagctgtcttgatgaagctcaacaaacttca
-agacaacacagagaaagaattcagaattacatcagagaagtttcacaaagaaattgaagt
-aatttctaaaaaatcaagcagaaattctggcactgaaaagtttgattgtcaaagtgaaaa
-atgcataagagtctttcaacggcagaattgatcaagcagaaggaactggtgagaactggc
-tatccaaatatacacgaagccaaaaaaagaattaaaaaagaataaagtatgcctacaaaa
-tgtagaaaatagtctcaaaagggtaaatccaagagttattggtcttaaagaggatgtaga
-gggagagaaaagggtaaatagagagatcttttcctcagcacatggaacattttgagagat
-cagggtagaaaggtcagagaaataaaaacaaacaaccttccaaacctcaagaaagatata
-aacatccaggtacaaaaaggtcaaaaaacaccaagcagattcaacccaaataagactacc
-tcaaggcttataataatcaaactttcaaagatcaaagataaagaaaggatcctaaaagca
-ccaagagaaaagaggcaaataacatataaaggaactccaatacatctagcagcagacttt
-tcaacagcaactttacaggccaggagggagtgggaaaacatatgaaaactgctgaaggaa
-aaccaaccttcaacctagaatattatctccagcaaaattatcctctaaacatgaaggaaa
-aatagtctcccagacaaacaaaagctgaggaatttcatcaataccagatctgtcttacaa
-gaaatgcccatgggagttctccaacctgaaataaaaggacattaactaacaacaagaaat
-cgtctgaaggtataaactcactggtgatagtaagtacacagacaaatacaaataccctaa
-cactgtaattctggcatatgaaccgttcatatctttagtagaaagactaaaagacaaacc
-aatcaaaaataataatgacaacaactttttaagagattgtataaaaagatacagagacaa
-taaaaatcaaaaagagtgtagagtgtagagtggttgtctctttgcttgttagtctgtttt
-tcttttctttttaatcaggattaagttgtcatcagtttaaaataagtggttataagatgt
-tatttgcaagcttcatggtaagtacaaaacaaaaacctgtaacaaatatgcaagaaatta
-aaacatactaccacacaaagtcaactttacacaaagaaagatggaaggaagggagggagg
-gagggagggagcagggaagggaaggaagggagggaagggagggaatggagggaaggagga
-aaggagggaaggagtgagggagggagggaaggagtgagggagggagggaaggagagagga
-gaaaaggagggagagaggagaaaaggagggagagaggagggagggaggaaagggagggaa
-ggagggaggaagggagggaaggaaggaaggagggaaggaaggaaggaaggaaggaaggaa
-ggaaggaaggaaggaaggaaggaaaaagaggaccgatgaagcaaccagaagataaatttt
-taaatggcagttgtaagtccttatctattaataagaacattgaatgtaaatggactgaag
-tctccaatcaaaagacatagagtggttgaatggataaaagagcaagacccaactacatgc
-tgcctatgagaaactcacttcacctataaagaaactcatagactgaatataaaggaatga
-aaaaagaaattctatgcaaatagaaaccaaaaaagaagttattatacttatatcagataa
-aaatatctttcaagacaaaactgtaaaaagagacgaaggtcgttgtttaataataaagga
-gtcaatttttgcaagaggatataacaattataaatatatatgcacccaacactagggaac
-acagatatataaagcaaaaattattagttctaaagagagaggtagaccccaaaacaataa
-tagttagggacactaacaccccactttcagcattggacagatcatcaagacataaaatcc
-acaaagaaatatcagacttagtctgcactataaaccaaatggacctaacagacatttata
-gaacatttcatccaacagccatggaatacacattattttcctcaccatatgaacattctc
-aaagataaaccacttgttaggccacaaaacaggtctcaaaagaatctaaataattaaaac
-catatcaagtatcttttatgaccacagtggaataaaagtagaaatcaataacaagaggaa
-ctttgaacactatacaaacacatggaaattaaaaaacataatcctgaatgaccgttgggt
-cattgaagaaattaagacagaaattttaaaatttcttgaaacaaatgaaaatggaaatac
-aacattccaaaacctatgggatacagcaaaagcagtactaagagggaattttatagcaat
-aaatgtgtatatcaaaaaagtagaaaaaatgatcaataaagcagtctCAGTATCAAAAAT
-TATGCCATATGTCATTCCCTTCCCCAATATAGAAATTATTTAGAAATCAATAAcaaaaag
-ttcaagaaaatgtatattatgaaaaaaatcatgtaagaatttcaaaatgttttgcaccaa
-aataaactaatactaactggttataaaatgtttgaacaagatctagtttcagacactaaa
-aaagataagacatcagtctgaaaagagcccctatcagagcaacatgaattctgctaaaat
-tgaagcaagaacaaacatcaaatgtacagtgaagcttgggtagaagaatgatgaaatcat
-tgatgctttacaaaaagtctatgggacgatgccccaaggaagtcagcagtttgcaaatgg
-ataactcattttaataagggatgagataatattgaagatgaagccaccagcagcagacca
-cccacatcagtttgggaggaaaaaattaatcttgttcatgccccagttgaaaaggactga
-taattaacagtaaaaacaattgtcaacatcatagacttctcagttggttcagttaatgga
-aatctgactaaaaaattaaagaagaacaaactttccacttgatgggcgccaaaaccattg
-tgccaaaatcagctacaaacaagagcacagctttcaatgaaactttaaacaagtgggatc
-aagatcctgaagcatttattcaaagcactgtaacaaaagttggaatctggctttaccagt
-atgaccctgaagacaaagcaaaatcaaagcaaagagatggaagtgatccagtccaagcaa
-aagctgaccagttaagaacaaaagtcatgtcaacaatttttgggggtgcacaaggcattt
-tgcttgttgactttctggagggccaaagaacaataacatctgcttattatgagagtgttt
-tgagaaagttagccaaagctttagctgaaaaatacccaggaaaacttcaccagagagtcc
-ttctccaacatgacaatgctcctgctcattcccctagtcaaacaagggcaatttttcaag
-cgttttgatggaaagtcattaggcatccacattgccatcctgacatggctccttttgact
-tctttttatctcctaatcttaaaaaaaaatctttaaaggacaccaatttttcttcagtta
-ataatgtaaaagaacactgatgtggttaaattcccaggaagctcagtccttcagggatag
-actaagtggctggtaccattgcttacaaaagtgtcttgaacttgatggagcttatgttga
-gaaataaagtttatatctttatatttttatattttaatgtcatcttccacaaactgtttg
-aagttccctcataactaaaatgtccccacatgctcagataagaaacacatttctcaacca
-atgtttctcagatattaaagtacatacaaatcacctgaggatcttcctaatacgcagatt
-ttgattgactcattctgagatgaattgaaatcctgcatttctgacaagctctccggaagt
-gttgatgcttctggtctttccaccacactgtgaatagcaaggttcaaactaattcatatg
-tcagaaaagatgacacagtggaaattgaagtgtttatttttaagtgaatgattatgataa
-caaaacactgcaaataaaaacttatgaagtccagctaaagctgcatataaagggaaaatt
-agagtcttacccacttggttatactgaagaaaagctgaaaatgtatgagataacaacaca
-aataataagttagaaaacaataacagaataaaatgaaattttattcaaagaagttcaaag
-aaaggaagataaagctgagaggagaaaataattaaatattttttaattttcataatattt
-aaaataaaatataattaaataaaaatcaaacatagaatcaacaaaaccaaaagctgattt
-tgaaaagaccaattaattaattcactataggaataacaaagaaaaaattgaaaacacatt
-acccatatgaagaataaaacacgtagccatcactacaaactctatagatagtaaagagat
-caaaggacatattgtgagtgaccttatgccaaaaatgaaatttagaagaaataaacatta
-cttgatgtgacccaagaagaaattgaaaatttgacagttctaaattgttagggaaattaa
-atctTAAATCTTTAAACTCAGTTGAGTTTTTCTGCTACATTCCAATGTCTGATCCCTAGC
-TCTATGGGTTTCAACAGACAGTTGTAGAAGCAGCAGAAAAATATCCTTGCTCTTATATTA
-CAGCTACCGTGGTGTGTTCTTGAAGTCCAGCATGTCTAATCATGGGATCCTGTCACCCTA
-CTTTCCTGACTATGAAAGAACTAGCAGATTCTCTGCTGGGCCAGTTTGTTGGAATGTTCT
-GGAAGTCATTCTGGGAGACCAAGCCCACAGTCAGCTTCTGTAGAGAGTTTATAAGCACAT
-AATTCTGAGTATTAAAAATATTTCTGTTGAAAATAGCTAGTGTTTTTCATTTCCCAACTG
-ATACACATAAATGCAACACTTTGCACATGTGAATAATTTGTCTTTTTACAAAATTATGCT
-ACACTGTTGATAGATTCATTCCATATATACATGCAACATACTTAATTTTTCATAACTTTC
-CAATTCTTATTAACTCAACTTTTTGTTCCATAATAACTGTGCTTCTCTTTGTACCAGTAC
-TTTCCATATTCTTATTGCTTTGGGACTAGCAAGACACAATGAGGTGAATAATGTTATTTC
-AATGCATCTTAAAACACCAGAAACCAATTAATATGCGATATTCAGGATTAACTGATTCCA
-AAGGGCTGTTAATTCCATCTCTTGATATTGACAAGTAGTAAGTAAATATGCCTAAGCTTG
-ATTATTTTTGTTCATAGAAGTAAAATATACATTTCATAAAGTGAAAGTTCATAAGATTTG
-CTTTTATTGTTTTAAAAAATAACAGTTAATTTAAACAAAACTGAGGAGTCATTGGATACT
-ATAGTAGCTAATGAAATCCTAAGAAGACATGAATTTCAGGAAGGCGAGGAACCAGGGAAA
-CTCTTGAAACTTGAACAATTAATAATATTCAGAGCCAATGAGCTTCAATATCTGAGTTTC
-TTAGGAAATGTCCCAAATTAGCAGGGGAAAGCATCTGATTGGTAGGCTTGGTTCTATTGT
-TACACCTGGATCAATCAGCTACGACCAAGGAATCTGAGCAGTACACTATAAAAATTGCTG
-CTTTTaattatttcaaccattgtggaagatagtgtggcaatccctcaaaaacctaaagtc
-agaaataccatttgacctagcaatcctattactgggtatatgcccaaaggaatataaatg
-gttctattataaagacacatgcatgcatatgttcactgcagcgctattcacaataacaaa
-gacatagaatcaacccaaatgcccatcatttggccatttggataaagaatggataaagaa
-aatgtggtacatatataccacggaatactatgcagccataaaaaagaatgagatcgtgtc
-ctttgcagggacatggatggagctggaggccattatccttagcaaatgaaggcagaaaca
-gaaaaccaaatactgcatgttctcacttataggtgggagcaaaatgatgagaacacatgg
-acacacagaggggaacaacacacactggagcttactggagagtggaaggtgggaggaggg
-agaggatgaggaaaaataactaatggacactaggcttaatagctgggtgatgaaataatc
-tatacaaccaacccccatgacacacattacctatgtaacaaaccagcacatcctgcacat
-atacccgcgaagttaaaaaagttTTTTTTTAGTTGCTACTTTAAAAGGATGTGGGAATCA
-TTGTAAACTCAAAAGTTAAAGATGTGCCAAGAGCTGTCTCCCACGAACTTGTTTAACAAA
-CGTACTGACTTTGTATGTTGATCCAATACCCATGCTGGCCACTGGACATACCAGTACAAA
-CAAGGCAGAATCTTCACTCTCCTCTAGCTCTTCTAATTCTCATGCACTAAGTGCCAACCT
-TAGCATAACTGGGCTGACAATCAGTGAATCAAATATCTAACTCTTATCCTACTCCAACGT
-TAAGAAAGAGACATGCgactgggtgcggtggctcatgcctggaaccccagcactttggga
-ggccaaggtgggcggatcacttgaggtcaggagtttgagaccagcctggccaacatggtg
-aaaccccgtctctactgaaaatacaaaagttagctgggcatggtggtgcatgcctgtagt
-cccagatactctacttgggaggctgaggcaggaggattgcctgaacctgggaggcggagg
-ttgcagtgagtcgagatcacgccactgcactccagcctgggcaacagagtgagactccat
-ctcaaaaaagcaaaaGAGAGACACATGCAAAGGGCTTGCTCTTTCTTTCTCATCTTACCT
-ATCTTATGTTTTCCTCCAGGATCAAGAGCAAGGAATTTGTTGCATAGAGGTGTTCAAGAA
-AGGGTGTTTTCAAACAGAGTCAGAAAAAACACAACTATACTGCGAGCAGCATACAAACCT
-GCTTTGGCTGCACTTCACTGCTCATGGCATAAGGCCACGAAGAGGCCAATAAAGGCTGGA
-GCTCAGGAGCATCAACCCAGATTCAAGGCTTCCTCTCTGGCACCCAACCATGAAGCTCCT
-TTTTCCTATCTTTGCCAGCCTCATGCTACAGTACCAGGTGAACACAGGTAATGTGGATTC
-CCAAGTTTAAGATGGGTAGATGAGAGGAACCAAGGATTTGGCTGCCCATGACAATGGAAA
-CCCAAAGAGAGGAGACTGAAAGATTAGCTGTTCAAAAAGATGGCTAAAGAGCTTACCTAT
-TGTATCAGTCATGCACTGATACATTCTCATAGGCCCCAACTGCCAGATTGTGTCCAGTGG
-AAACACCCAGGAAGCTACAGAGAAAGCAGGGTATTTTTTGTCTATTCAGAAACTATCCAA
-AATATAATGCTGCCTTCCTGCCCTGTATATGTCTATCATGCTAAGACTAAGCCCAGGTCT
-ACCTCCTTTTAGCTCTATTTCTATCTTAAAAGCCCTTTTTTTTTAAAAAaagtcctgggg
-tacttgtgcaggatgtgcggtttgttacataggtaaatgtgtgtcatggttatttgctgc
-acctaccaacccatcgcccaggtattaagcccaggatgcattagctatttttcctgatgc
-tctccctccacccaacaggccccagtgtgtgttgttccccttcctgtgAAACCACCTCTT
-GAAGCAAAGTTTCCTATCAGTTTGTGCTTGGTGTAGAAAGGAGGAAGTTCTTCCCTCATG
-CTCAAAAAAAAACCCTTTCAAGATCAAGTAAACAGGCCTGTGTTCTCCATCTTGAATTCT
-TTCAGGTTTTCCAGAGCCTTTATCGCTTCTCTCAGACTTTGTCTTCCTGAAAACCCCCAA
-ACTACCATAAGGGCATCTAGGAATGCATTATAGCAAAAGGCTAAGCCAGGGGATTAACCA
-TTGTTTTTGGAAAAGAAAGGAGAAGCACTGAGATTTGTTTCAGAATACAAGAATCATCCA
-GCTATTTGAAAAAATTAGCAAAGGGTTTCGGGGCAGGGAAAGTGGAAGTGTCAAAGATGC
-TTCTAATGTTTTTATCTTCTAATGTTTTTATCTTGGGACCCTAGGAAAAGGGTAGTACCA
-TAAGCAAGTAtggctgtgtcatcttgggtaaagtcacttaaccactttgaacttcaattt
-cacatgagtataatggggttaatcaatgcAGCTGATTCCAATATAAGAATTTTTCTGTTT
-CCCGTTTGATGAGAAAACAATGTGGAAATGTATGCAAATATGCTTTGAAAATTAGCAGAT
-GCTACATAAATCTCTTGTAATTTAGGGAAAATCATTGGGTTATTAAGATGAACAAGGGAG
-AAAAGCTTTCTTGATTCAGAAAAAAGAAACACGAGACATTAGGATGGAAAAGTCATTCAG
-CAGATAAAGATAAGGTACTAAGCCGAGCAGGAAATTTAGAATTATAGATAACAATACAGA
-AGTTACCTTGGTGGATATGAGGTTAAGGCTAGGATAATGAATGAGACTTCTGAGAGATAG
-AGTGTCCAAAGAGGCTAGAAGAGATAGAACACCATGCTTCAGGAATCACAGATCTAGTGA
-TTGTTGAGAAGAGAGAAGTCATGGGCTACTGAGTTTGGTGAAAAGATAAGACTCCTGAAA
-ATTCTATTGATTCTCTTTTGAACTTCTTTCTTAAATTAGTTTTATGATGGACTTGGCTCT
-CATTGGTATTTCCCAAGATTATGGAGATGGGATAGTGATGTCTGACAAGTACCTAAGATG
-CTAAGTTGAAGGTCTAAAATTCCATCCTAAAAGCAAATAATTACTCTATCATCTACGTGC
-CCTTTGCTTCTTAAAGTTACTCAAGGAAGGCAGACTAAACAGGAAATTTACTTTGGATTC
-AAGAGGGGCATAGAGACGCTCTCAGCCTGCCCATTTGCCTTCATCAACATTCCTAAACAC
-TGGGCTTAAAATGTAGTATGAGTAAACTCTCTCTTAGTCTATCCATCTCCCACTAGCAGT
-TTTAACATCATCTCTAGTTATTAACCTTGGCTCAATGGCTTTCTCTTTTTTTATACAGAA
-TTTATTGGCTTGAGACGCTGTTTAATGGGTTTGGGGAGATGCAGGGATCACTGCAATGTG
-GATGAAAAAGAGATACAGAAATGCAAGATGAAAAAATGTTGTGTTGGACCAAAAGTGGTT
-AAATTGATTAAAAACTACCTGCAATATGGAACACCAAATGTACTTAATGAAGACGTCCAA
-GAAATGCTAAAACCTGCCAAGAATTCTAGTGCTGTGATACAAAGAAAACATATTTTATCT
-GTTCTCCCCCAAATCAAAAGCACTAGCTTTTTTGCTAATACCAACTTTGTCATCATTCCA
-AATGCCACCCCTATGAACTCTGCCACCATCAGCACTATGACCCCAGGACAGATCACATAC
-ACTGCTACTTCTACCAAGAGTAACACCAAAGAAAGCAGAGATTCTGCCACTGCCTCGCCA
-CCACCAGCACCACCTCCACCAAACATACTGCCAACACCATCACTGGAGCTAGAGGAAGCA
-GAAGAGCAGTAATGTGGATCTTTCCCTTAAAACTCCAAGTTCCTCTCTATTTTTGCTATC
-TATAAAATGACATAGAACTGTTTCCTCTGTCATCAGTCATTCAATAAACACTGTTTGAGC
-ACCTACAGTTTATGTAATATTATCATTCTCACAAGAGCCTCACAGAGGGGGTAGAGCTAG
-GGAGGGATGGAATTGTTTAAGTTTAGATGCCCAGGAGAAAGTAAGCCTCAGGAGGGTGAC
-TACAGCATCGAGTTTGTCCCAAGCATGGCCTAGATTAGGCCTCTGTAGCAAGCATTTATG
-TCTCTCATATGGTGTGTTTTTCCTGGAGCAACAGTAAGGAAAGCATCAGGAGATGTATTT
-TCTTTTCTCATGTATTTGGGAGGAAAGGCCCAAATGCAAAATAGAATATGTAGGAATCag
-aaaaaggttaaattaattgtaataatatatttttgtttcgttttgttttgagacggagtc
-tcactcagttgcccaggctggagtgcagtggtgtgatctcagctcactgcaactccacct
-cccgggttcaagcaattctcctgcctcagcctcctgagtaaccgagattacaggcgcaca
-ccaccacacccagctaatttttgtatttttagtagagacggggtttcaccatgttggtca
-ggctggtctcgaactcctgacctcgtgatccgcctgcctcggtctcccaaaatgctggga
-ttacaggcatgagccaccacacccaaccaataatgtgttttattgaatgcaatatatcca
-aaacatgatcatgttgacatgtaatcaatgtaaaaattatttatgagagagtttaccttt
-tttggactacatctttgaaatctcatatgtgtaattacacatagagcacatttctattca
-tactagccacatctcaagtgctcatagtcatatatgaatagaggatttcatagcatattg
-aacagcAACAAGGCTAGAGAGTTTTAGGGCACAAGTAATTATAGTGACTCTTAGGCATAG
-GGGATGCCCCTAATCCAGAGGAGACAGGCATATTTCTGAGGGCtgtggcatataatttaa
-gagtatagaaattcaggtctgatatgcccggactagcatcctagattctggcacttttta
-gctgtgtggtcttgaacaaatcatttatccacacataagcatcagtttatttattcataa
-aatggagatGTGAACATTATATTATATCCCAGAAATCAGCAATCTCAGATCACTCTTCCT
-CTTATTGCCCAAATTACAATGGCACAGCCACCTATTCTAGttttttaatagctttattga
-agcataattgatatacagagaattgaacatatttaatgtgaataatggcatgagtttggg
-catatgcaaaatcctgtgatactatcaccacaatcaaggtgatagacgtatacatcacct
-cccaaagtAacatgaccatatttgtagaaaaccctgaaaacttcacgaacacacacacaa
-aaatgtagaactaagaaatagattcaaaaaagtcaacatacaaatatcagtggcatttct
-atacacttaacaatgaaccattccaaaagaaaatcaaggaaacaatctatttacaaaagc
-aacaaaaagaataacataggaataaacttaaccaaagaagtgaaagaggtacattaaaaa
-cttaaaaatattgatgaaaaaatcaaaggaaacacaaataaatggaaagatattccatgt
-ttaggtattgaaagacttaacattgttaaactgttcattctgtctaaagcaatctacaga
-tataatacatctccccccttccaaatcccaatggcattttttaaagaaatggaaaaaaca
-atcctaaaattcacagggtaccataaaagacccagaatagcaaaatcaatcttgagtaaa
-aagaacaaagctgaaggcatcacactttcttatttcaaaatatattacaaaggtatagta
-attaggccaggcgcagggactcacgcctgtaatccagcactttgggaggccgaggcgggc
-ggatcatgaggtcaggatatcgagaccatcctggctaacacggtgaaacctcgtctctac
-taaaaacacaaaaaacaaaaaatagccgggcgtggtggcgggcgcctgtagtcccagcta
-cttgggaggctgaggcaggagaatggcgcgaacccgggaggcggagcttgcagtgagccg
-agattgggccactgcactccagcctgggcgacagagccagactctgtttcagaaaaataa
-ataaataaataaataaataaataaataaataaataatggtgttgggaaaactggctaccc
-acatgcagaagaatgaaattggatccttatctcaccccatataaaagaaatcaactcaaa
-acggattaacgacttaaacataagacctaaaactgtaaaactactagaagaaaacacagt
-actgttctgtatttaagctccatgacatcgttctgggcaatgatttcttgcatatgaccc
-caaagcacaggcaacaaaagtgaaaataggtaactgCATCCAGATTTTTTAACATATTCT
-TCTCTGCTACATATCACCTACCTCCATTCAAAGGTCACCTTTCCCCATCCTACTCATTTT
-TTAATACAGTGTCACTCTAAGAAAGACAAAGATTTTTCATGATGCCCCACAGTGATTCTA
-GAATATAACTAAAAAATATTTTCCTGGAAGTTTTTGCACAACAGAAAGGAGTTGCAATAC
-AAAGCATAAGTTTAACACCTGCTAGATATGTGTTCTCTGAGGAACCCCAAGCCTACCTGA
-TGGGTGTCAGATTCTCTCCCTGCTACAGCTATTTGTCAAACTCTTGAAAGTCCAGCTTTC
-CTTCCCATGGAAGGAAAATTCCCACGGAATGCTCTCTTCCGTGTTTACCCACAGAAAGGA
-GAGAAAGGTTCTTTCTCACACAAGTCTAAGGCCTTCCTCTAAGTCACCTTTTCCTATCAT
-AGAACTCACCCAGCACTTCTCAGGATAAATGATACTGCAGAATATGAGTTTGCTTCAGGG
-AAATCCCATACCCACTGTGAAAAATATGGTAACTctccaatatcagttctccccctttgc
-taagtaatagaaccctccaaatattaggttgacacaaagccgaccagagaaaaggctgaa
-tttcccaTCTAGAACTGGTCATTCTTCAATTCAGACCAGCCATAACTGGACACTTTTGCA
-AATATTCATTAATAGTCTTGGTGAAAACCTCAGATTTCCATTTTGCCAAAGTTTCCAAAG
-GAAAAGAGGGCCTTTTTCTAAGCCCTGAGAGCCCCACAGTGACAGTAAGTTCTCCCTTGG
-AATTCACCCTGGCATACCTCGGTGCTACCCCAGATCCTTTCCCTCAGGGGCTATGAGATT
-AGGTTTCATggccgaatgtgacggttcatgcctttaatcccaacactttgggaggccgag
-gcaggaggatggcttgagcccaggagtttgagaccagtctgggcaacatcatgagactct
-gtctatgtaaaaaataaaaattaaccaggtgtcatggtacataactccagtccctgctac
-tgtggggcaggggctgtgggggctgaggagggaggattgcttgagcccagaaggttgagg
-ctgcagtgagctgtggtcgtaccactgcactccagcctgggcaacagagcaagaccctgc
-cttttaaagaaaaagagaaaGGAggttgggcatggtggctcatgcctataatcccaccac
-tttgggaggccgaggcaggtggatcacctgaggtcaggagttcgagaccagactggacaa
-catggtgaaaccccatttctactaaaaatacataaattagctgggtgtggtggcgggcac
-atgtaatcccagctactcaggaggctgaggcaggagaattgcttgaacctgggaggcgaa
-ggttgcagtgagtcgagattgtgccactgcactccagcctgggtgacaaaagcaaaactc
-catctctaaataaataaataaaaataaaaaaGAGAGAGAGTGAGATTAGGACTCACCCTG
-GCCATCCCAGGTCCTGCCACTCCAGGTCCTGCCACTCAGGGACTGTGTGACTCTATATTT
-TTTTTAACTTCTCAGGCCAATATTAGAACCCAATCTGATCAAATTAGAAACCTATGAACA
-TTCCACTTACTAGCAGTGCATTCATGGAGCACTTCACAGGGAGTCACCAAAGTATCAATC
-AATCAATAAACTACTACCCTACCCTGAACTAttaggttggtgcaaagtaattgcagtttt
-tgcattgttggaatttgctgtttgatattagaatgcgttcttaaataaatgtggttatgt
-tacactttttttttttttttttttgagatggagtttcgctcttgttgcccaggctggagt
-gcaatggtgtgatcttggctcaccgtaacctcctcctcccgggttcaagctattctcctg
-cctcagcctccctagaagctgggattacaggcctgtgccaccatgactgactaattttgt
-atttttagtagagacggggtttctccatgttgatcaggctggtctctaactcctgacctc
-aggtgatgcacccgcctcagcctcccaaagtgctgggattacaggcatgagtcactgctc
-ccggcctatacatcattttaataggcatttctcactttatgttttttgataatgacttat
-tacttgctgttgattttatgtttattttagactatggaaatgatgtcagacaaaaagaaa
-attcaagcgattttcttattcaagttcaaaatgggtcgtaaagcagcagagacaacttgc
-aacatcgactgcgcatctggtccaggaactgctaacgaacgtacagtgcagtcgtggttc
-aaaaagttttgcaaaggagaggagaacctcgaagatgaggaatgtagtggccggccgttg
-gaagttgacaaccaccaattgagagcaatcattgaagctgatcctcttacaactatacaa
-gaagttgctgaagaactcaaccttgaccattctatggtcgtttggcatttgaagcaaatt
-ggaaagatgaaaaagctcgataagtgggtgcctcatgagctgagcaaaaatcaaatcatc
-attttgaagtgtcgtcatctcttattctacgcaacaatgaaccatttctcaattggattg
-ggacatggcaatgaaaagtgtattgtatgtgacaacctgctacaagcagctcagtggttg
-gaccaggaagctgcaaagcacttctcaaagccaaatttgcaccaaaaaaaaaggtcatgg
-tcactgtttggcactgtgatccactacagctttctgaatcccagcgaaaccattacctct
-gataagcatgctcagaaaatgagatggaaatgagatgcaccgaaaactgcaatgcctgca
-gccggcactggtcaacagaaagggcccagttctttacgacaaggcctgacctcatgttgc
-acaaccgacacttcaaaagttgaatgaattgggctacgaagttttgcctcatctgccata
-ttcacctgacctctcgccgatcgactaccacttcttccaactttttgcagggaaaatgtt
-tccacaatcagcaggatgccgaaaatgcttccaagggtttgttgaatcccaaagcacaga
-tttttacactacaggaataaacaaatttattcctcattggcaaaaatgtgttgattgtaa
-tggttcctaatttgagtaatcaagatgtgtttgagcctagttatagtgatttaaaattca
-cggtctgaaatcgcaattacttttgcaccaacctaaTATGTATGCAGGTGAATTCTGTCT
-GTCTTTGCTAAGCAGTGAGGTGATCCCGTGCTTAATGATGTTACTGCAAGCATGACAGCG
-GATAGAAGCGGGGAGGGCCAGTGATGAAGATAACTATTAGAGAGGGCATCCCAGTTGATT
-AGAAGCCCATCCCTAACTAACTACATCACTTCTAAAGGCCTGATTTCCAGTCCAGAACTA
-CTTTGAAAATGTTGTTTATGAACTCAAATTGTTAGTTGTAAAAATTATGAAATGAAAGAC
-TATTATGAGCATATATAAAATAAATTAGCCAGTAAATAACCTAAGATGATGAAGAAAAGA
-GCACTAAATAAAACCATAAATAAAAAGTTGGGAGCTTGGTAATGTCCAGAAAAAAATATA
-TATTTACTGTAACAAAGCAAAGGCCTTTTGTTAGTACATGAGACTCAGAATGCCTTAAGG
-AATGTGCTGGGCTCTAGAGGGCAGGGCAGGCACACAGCAGCTGGCACTGTTTGTCCAGAC
-TCCTGCCTGGACAAGTTGAATTAGAAAAATCCAAGCAAGAAACAGTGTCACTACTGGCTT
-CCCTGCTCTCTACTCATCTGCTCAGAGAGCTGCATGCTAGTTTGGCCTGTCCTGCACCCG
-TAGAGGACAATAGGTTATCTACATCCTTCACCACTAAGTGAGCCAatgggctgaactgtg
-ttcccctcaaaattcatatgctaaagccataacccacaatgtcactgtatttggaggtaa
-agcctttaaagaggtaattaaggttaaaagaggtcatatgagcaggatcctatccaacat
-aattggtatctttgcgagaagaggaaaagataccaaggatatgcatacacaaagaaaagg
-tcatgttagggcacagcaagaggtcagccatctgcaagccaaggaaggaggtctcaggag
-aaaccaaacctgccagcaccttgatcttggacttctcgtcttcaggactgagagaaaatg
-agtatctgctgtttaagccacacaggctgtggtattctgcgatagcagccctagactaat
-acaGGCCATAAAAAAGATAATATCCTTTCTTCCTTCTTTCTGAGCTCTGGGTAAATGGAG
-GTCAGATAAAgccaggtgtgatggcacatgcctgtattacccgctactcaggaggctgag
-acaggaggattgcttgagcccagtagttctaggctgtagtacactgtgattatacctgtg
-aatagccattgcactccagcctgggcaacatagtgagaccctgtcccctccccaaccaaa
-aaaaaaaaaagaaaGGAGGAGGGGGAGGAATGAGGTAGGAACAATAGGAACAACAGATGC
-tttttttttttttttttttttgagacagagttttgctcttttcacccaggctggagtgca
-atggcgtaatctcggctcactgcagcctccgcctcccaggttcaaacgattctcctgctt
-cagcctcccgagtagccaggattacaggcacccaccaccatgcctgactgatttttgtat
-ttttagtagagatggggtttcaccatgttggccaggctggtctcaaacacctgacatcag
-gtgatccacctgcctcagccttccaaagtgctgggattacaggcgcgagccaccgtgccc
-ggccAACAGATGCCTCTTAAAACACCCTGAGCCTCTGCCTTTATTCTAAATTTGTCAGTC
-ACAGGCCCGGGAGAAAGCTGAGCAACTTCAATAGGATTTTTAACTCAAATCTAAGACAGA
-AGTTTATATAAAGTTGTAGTCAGACTCGGCTGTGTTCAGAAAGTATATTTCTTCCATTGC
-TCAGCAATTATTTATTAGCATCTATTCTGGTCTCTGGGCAAACATTAAGGACTAAGAAAT
-GAATGAACTCTAATCATTTTCATTCTTTAAAAATTGTGCAGCCAAGAAAGAGAAATAAAT
-AGGCAAATGACCACATAACAGCAAGACATGTATAGTGAAAGTCATGCTCACTGCAATAAA
-AAGAACCTCTAGCTCTGAGTGAGGAAGGGGGAGTGGGTGCTGAGGTTGTGGGAAAGAGGA
-AGCGTGGGTAGAGTGAGGCAGACTGCTGTGGAGTGGAGCTGTGGGAGTGGCTTAGAGCTT
-GCAGGAGTAAGGGAATGAGGTGAGAGTGGAGGAACGGCAGAGTGCATATTCTCAGTTGCC
-AGAGATTCTGGGCAGCTTCTTTCGATCTTTGAGGATTTGGGCAGGAAAGGGTGAGAAAGG
-CCCATCTAACAATCCTGCGCTTCATAATCCCCTGAATCCTTGAAATTATTACTAAAGCTT
-AATGCTGGGAAAGATCTCTGATTCCCCTGAATCTGATTTGGCAAGCCAATCAATCATTTG
-TGTTAATTGGGAAAGAAATCAAATATTTCTGTGTGAATATACTCATCTCAAAACATTTTC
-AAGATAAAGTGTTTTACAAACTATGCTTCTGAGTCAATAGGATTCAGCTGTTTCGTTTTC
-ATTTCAGCAACTTAGAGGAAGTTTATCTTCAGAAAAAATTGCTATAAGAcacttcctata
-agccagccctgtgccaaattatttacatgaatcaccttctctagtctttaaacagcccta
-ttatgaatggacaattatctcaatttgacagatgatgaaactgaggcttgaagagattaa
-gttacctaagatcacacaATATGCCTCCAAAATTCGAAGAGGGCCGAAGGTTGTAATTGT
-GCAAGAAGAAGCAAATTTTCTATCTCTTTGAACCATAGACTGTGGATCCACTGCAACCTT
-GCTGAAATGGAAGTCTTTGTTGTTTCATGGGGGTTTTGCTGAATCTTCTGGCTTGTAGCA
-AGAAACTACTTTATCTTCACCAGATCTTATCAGCACATTGTATACCTGTGTGATACTCTG
-TGTGCTAATAAAATTATCAAGCTTCCTGTGGGTCCAAATTATGGCAAAAACGTAAGACAA
-AATGAtaatcccagcactttgggaggccgaggtgggtggaacacaaggtcaggagttcaa
-gaccagcctggccaacatggtgagacccccgtctctactaaaaatacaaaaattagctag
-gtgtggtggtgcgcacctgtagtcccagctactcaggaggttgaggcaggagaatcgctt
-gaacatgggaggcggaggttgcagtgagctgagatcacaccactgcactctagcctgggt
-gacagagctagactccatctcaaaagaaaaaaaaaaagaaaaaGCACACGACTAGTTATC
-ATAGATACTGTTGGCTACTGTTTCCTCTCTGTTGTGTGGGTCTGAGCAAAGAGAGGGAAT
-GGGATGCACCGTGCTTTCAGCTCTCTATAGTCTCTTCTGGATTTCAGTGTTTCAGCACAG
-CCCTAAAAACTACCACATGATTATGCCCCACGTAACAGTCAGATCACCTTGTCTCTAGAG
-AGACCACGCATCCATAACGAAGAACCTCTTATAACCATGGGTTCCACATCTTTACGGCTT
-AATCACTGATGCTCTCAGTGAACCTGAAAATTGATCCTGCTGAACAAGATCAATAAACAG
-AGTTTTGATTCAAAGGCAGCCCAATGAGTTAATAAGTGCTCCATGACAATGCCAAAGAGG
-ATTAAGGAAAGAATAGCAACCTGGAGGAAGATGTATAGAAAAGCAGAccaggtgcggtgg
-catgcgcctgtagtcccagctacccaggaggctgaggcaggtgaatcatttgaacctggg
-aggtggaagttacagtgagccgagatcacgccactgcactccagcctgggagacaaaacg
-agactctgtcaaaaacaacaacaaaaaaaaaCCAATATTAATAATGCAAATATTTGAGtt
-acagggcatttttaagagccagatacagtactgggaaccttgagtatattatctcattta
-gtccttaaaacaaccccatagactttatataaataatacaactgaaagtttaacttaagt
-tgctgaagttcacagataagcagtagaatcaggattggaacccatgtctcatcatatcag
-agaccctacgcttaagtgctatgctTCCTTGACTCTCACTGGCAACAGCTTTGGTGCATG
-TACCTAATGCCAGTTATATCATAAAGGATCTACATGGATAAGCTTATTTCATACTCTTAG
-AAATGGTTTGGAAGAggccaggcgtggcggctcacacctgtaatcccagcactttgggag
-gcctaggcaggcagatcacgaggtcaggagatcgagaccatcctggctaacatggtgaaa
-ccccatctctactaaaaatacaaaaaattagccaggcatggtggcatgcacctgtaatcc
-cagctactcaggaggctgaggcaggagaattgcttgaacctgagaagcagaggttgcagt
-gagccaagatcacgccactgcactccagcctgggtgacagagtgagacttcgtctcaaaa
-aaaaaaaaaaaaGTTTGGAAGAAGCTATAGAAGTCTCGATATTACTGGTGACCCAGTATA
-AGGAGGAGTGGTGAATATCCCTATTCTAAAGGATTTCCTAATCCTGAAGGATTTGGACAG
-CTCCTGCAATTGCCAAATGTAAGCGGCCTGAAAAGTTCACACTTAGATTATTGCCTTTAT
-TTTTGGCTCCCACACTGTAAAAGAAATTAGAATTAGAGCACAGATACAAAAGCTATGATA
-ATGAAAGTCCTAAAAAAAATTCCATTAAGAAACACACACATATAAGTCAGAAATTCATTG
-GGAATACCTTTGCATTTTAAGAGATGAGAAGGAAAGAGTTAACAGTAGTCCTGAAATCAA
-TTCTCTCCCTTTAACAGGAGATACTTCTGGCAGGAAAGAAAAAAAAAAAAAAAAAACTTG
-ACTCTGACTCTGTCAGATCTCCTTATAACATGCTAATAAGAGACCTTCTGGTAAATATGC
-TAATGATATTCACTAGCAGAGGGGTCTTTATGTAGCAGAATGCATCTGCTCAGTCCTCAA
-TTGCTTCTGGTAAACAAACTTAGAGTCTATGAATTTACAGGGCATGGCTCCTTGAAAAAT
-GTCATGTGTTTGTAATGCTAAGTAATTGCCAGAGAATAAAATGGAGATGTTTCTAGCTAA
-AATAGCCCCTTTGGGTAGCTGATGGGCACCCATGCATCACAGACATCACTTAGAGATCTT
-TCATGTTAAACCTATCCCATGGCTTATTTTCATGAGGCAAGAAAGGACCTGGGAAGTGGT
-GTGGACATCCCAGACTTTTGCATTTTTACCTGCTTCGTAATTACCCGTATCCTTGAAATT
-ATTACTAAAGCTTAATGCTGGGAAAGATCTCTGATTCCCCTGATTCTGATTTGGCAAGCC
-AATCAATCTTTTGTATTAATCAGGAAAGAAAGCCAATATTTCTATATGAATATACTCATC
-TCAAAACTTTTCAGAAAAGATATTTTCCATACATGGAAATAGCTTAATTAACtttttctg
-attatgaggttacttatagtcattttgaacactcagacaaaacagaaaactttatggaag
-ataaaataagaataacaaaatctttcccaaagagaaagaccattaaatttttgtatatat
-ccttccagagaatacacaaattatatgtatatatattttacatgtatacatatataacaa
-agactagcttatactacccacgctttcctgtcatttttcttttctacctaagatatcact
-gacagtcttttatataataaggatagtcctcaattatcatcattgtttaaatggaattct
-aatgtgttaagtgccataaattagcagattctctattgatagacatttagcttacttttc
-acattctcactatgagtaatgctAAGAAGGCAATATAGTTCTTGCACCTTCATGAACATA
-TTCTTTTATGCTATGTGCATTATTTTGGGTCAAAGGGCAAGCAGAGTTTCATTTAATTTT
-GTTTTAGACATGGGCTATATATTGACAAATTGCCCTCCCAGGAACAGTACACAGTTTTTC
-TTATGTTGCCTCACCCATGCCAGCAGTAGCTAGAAAATGCATTTCCAAAGACTGGTGCTA
-ATTTTCTGTGCATTCTGTGAGTGCTCAGTCAATTTAAGCAATAACCACTTAGAGTAACAA
-AATCTATTCACCCTAATAGCAGAGATTTCTACTTCATCCCTGGCTCACTGCCCAACTTTT
-GATCTCATCTAAGGCCAATAAATGTAGCTCCAGACAAGTGACACAGGTAGCTCTGTCCCC
-ATCCAATCTACCCAGCTACTTCTCTTAAGGCACGTTCTGATCCTTCAAGCATGAAGTTCT
-TGCCTCTGGCTTTTGTTTCTCTCTTGTTTCTGGCTTCAGTGACCTTGAGTACCCTGGAAT
-CTTCCATATTGAGAAAGAAATGATAGAGGGGAGGGGACATGGAAAAAAGAATTAAATATA
-TCTATTTTTAAAAAGAAAGAAAATTTTAGAATGGACATGTCTagaaggaggaggaaacag
-aggagggggacaggtataaaaactggacttctctgaatatactctgctttgaaggtttga
-ctttggaatcatctacatattttatctaatacaagaatatcgaaacttaaatggcaatcc
-caaaaatctaaaaggaatagaaatcaaattagcctctgtaataaatgggttgtataacca
-cacaaaggACTATTTGAAATGACTTTCAAAGAGTAATTTGAGAATACTTCCTTATTGGAA
-TATAACCTAAAAACAGAAGAATTGCAAACTGTTTTCAATGTTTTCAGTAATCATATTGAG
-ACTTTAATACATATATTGTGGGATAAAGGAAATGAATGTTGGTGTCACTGATAGAGATAA
-GAAATAAAAGTTCAGGTAAAAATTCTGTAAATCCTAAATTTGAATTGGAATTTTATATTT
-TATTTTTaaaatacctttttctacccccatccactgaaaagccctagaaatattggccaa
-cctagtagaaatgatttccctctcacccgggatattatctctaaatataatttaccaaag
-tcttattgaagaaattgctgtttctgagcttgaagcaactatacaaatgtacctggaaga
-ttttaccatactggaaaaaagcagcttgacaaagactactgaagtcatgtcaaaaaaaac
-aaagaagtcaacttgaaggggctttctcttggcaaagatgggaaaatgtgaaccttgata
-aaaaataattgcatgcattattcacagtaaccaagatatgtaatccacctaggtgtctat
-ggatggataaatatataaagaaaatgtgatatacacaatgaaatattattcagcctttaa
-aaagaaagaaatcctgccatttgtgacaacacagatgaacctggaggacattatgctaag
-tgaaataagccagacacaggcagacaaatactgaatgatctcacctatgtgtggaatctt
-aaaatgtcaaactcatggacacagagagtaggatggtggttaccaagggagttgagggaa
-atgaagaagtactagtcaaagggtacaaagtttccgttatgcagggtgaataagttcggg
-agcttactgcatagcacagtgactacagttaataatactgtgttgtatacttgaaatttg
-ctaagagtagatcttaaatattgttaccacagaaaaaaatggtgactatgagaggtgatg
-aatatgttaattagcttgatagtggtaatcatgtcacaatgtatatgtctatcaaaacat
-cacattgtacgtcttaaatatgtacaattattatttgtcaattatacctcaataaagctg
-gaaacataaaaataaaataactacaattaattgaaacatatcaaacatgtccaaaactga
-taaagaaaggtaaagaatttggcctggcacagcggctcacacctgcaatctcagcagttt
-gggatgccaaggcaggcggatcacctgaggtcaggagtttgagaccagcctggccaatat
-agcaaaaccccatctctactaaaaatacaaaaattagctaggcgtggtagcgggcatctg
-tagttccagctactactcaggaggctgagatagagaatcacttgaacccagaggtggagg
-ttgcagtgagccgagatcacgccactatactccagcctgggtgacaaagtgagactctgt
-ctcaaaaaaaaaaaaaaaagaaagaaagaaaagtgaagaatttatcctggcttttctgta
-aaaactgcacctcagaagaaccaaattattgataaggaattttgctctttagaaatattt
-ccagctaataaatgaaggaataatagcattgagacaaatcgccattttgtaatctcaggt
-gaatttacggatctaggcaatgatcattaatggctgagaaaatcacaacaaaaagaacaa
-ttagacatttgtgcctcctgatagaagtatacaatatcaccttcaaagctattttgccaa
-aaaagaaaaaaaaaatcaacccaaatctaatcaaggctcccactctaactcccaagctct
-aggatataccaaggacaaaggaagatcatgaaataccaccatggggattcaatcagcaaa
-ttcTGAAATGCAACATTATCCTTCACCCTGCTTGGCCTAAAAGTACAAAATAACACGAGG
-AAAAATTAGTTTCCAGAGCCTGTTATATTTTGAAAAATCATCAGAAAACTGAGAATCAAG
-GATAGAATTTCTAGAAAGTTCCTTCCCCTAAAGCTTTCACACTTGCCTCAGTGTATATAT
-GTGGCTATACCACTGACAGGCCGCCAGTCATTAAATTCAAGCTCCAAGAGACAAACTCTT
-GAAAAAAAGGCAGCCTAGGAGAAAGCAACATGATTTTTCACATATTTTAACTTGGTTTTT
-CTCATAAAATGGTTTCTGAATGTTTCTTAGCTTTCAATGGGCAATAAATAACTTTTAGGG
-AAATAGATGTGAGCCAATCTGAGGAAGTATTTGAGATGAAGAGAAGGCTTTGCTGTCTAT
-GAGGAGTGCATTAGAATAGAATCGCTCCAGGAAAAGGTCACCTGTGTTGATTGCCTTTAT
-GAGGTGACATTTAAATAAAAGTACTCGTTCAGTTTTCATTGAAAAACATTAAAAGACATC
-TCCAAAAATTTTTTTGGGAATGTGAGAAACTCTGCTGCACAAATGATCATGTTTTGTCAA
-ATAAGATGAAAAGAAAAAAAACACACACAAAAATgaaaaaacagatggaggggtaacata
-aattaagaaactcagaagacacatctacaaattacaatttatggatcatatttgaatgct
-gattctaaaaatttgaaaaaatatgcatttgagaaaatgaatgctgacttcatagtttat
-aatatgaagTCatattataaaatataataagaatgaaatattaataatttatCAGGTATG
-ATAATGGTTTTAAGGATGTGttttttgtttgtttgttttttgagacagagtctcattctg
-ttgcccaggctagactgcagtggcgcgatctcggctcactgcaacctctgcctcttgggt
-tcaagcgattctcatgcctcagcctctcgagtagctgggattacaggcatgcaccaccat
-acctggctgatttttgtatttttttattagtagagatgggcttttgccatgttggccagg
-ctggtctggaacttctggcctcagttgatccacctgcctcggcctcccaaagtgctagga
-ttataggcatgagccaccacgcccagccTAAGAATGTGTTTTTTaactgtatatatttaa
-ggtgtgcaacatgatgtgtgtatgtatatatatatatatatatatatatatatagagaga
-gagagagagagagagagagagaaataatttctgtggtcatgcaaattaacatatccatca
-tctcacagctacaatttttgtgtatgtgtggcaagagcacctaaaatctactcttagcaa
-aaatcctgaatacaatacgatattattaactattgtacattagacctctagacttgtttc
-tcttacatatctgcaactttgtgtcctttgacctacatttccccatttcctacccctcca
-ccacaccccagtaataaccactttattctctatctctgcattcaactttgttttttctag
-tttttaaactctgcatataagtgagatcatgcagaatttctctttctgtgtctggtttat
-ttcacttagtacaatgtcctccagattcactcacgttgccccatatggcagaatctcctt
-cttttttaaggctgaaaaatattccattgtatatataccatagtttctttgcccatttat
-ccttcaatgaatacttcagttgtttccacacctcggctattgtgaataatgctacaatga
-acgtaggagtacagatattttatgaggtgatgatttcacttcctctaggtatatacccag
-aggaggaattgctgggtcctatggtagtgctatttttaatttatttaggaaccttcatac
-tgttttccttaatggctccactaatctacattcccaccaaaagagtatacaggttccttA
-AGGGTGTATTTTTCAAAAGGGTCGCCGagagatacctattaaaatatatacaagagaaat
-cttataatatcagggatttgcttcaaaggaggggaaatccaagaaggggaaagtaaattg
-ggttatataagaaacaagattggccatgagttaatgttgaatttggatgatgaatacatg
-ggggctcattatattattgcttgacttttacacacatttaaattgttcAATAGTAtgtat
-tagtccattctcacactatataaagacatacctgaaattgggtactttataaaggaaaga
-ggtttaattgtctcacagttctgcagggctgtagaggcctcaggaaacttacaatcatgg
-tggaaggggaagcaaacacatccttcttcacatggtggcagcaagaaaaaatgcagcaca
-aaagggggaaaagccccttataaaaccatcagatcttgtgagaactcacacactatcacg
-agaacaggatggggaaaccactccgtgattcaattatctccacctggtccctcccacaaa
-acgtggggattatgggaactacaattcaagatgagatttcggtggtgacgcagcaaaatc
-atatcaAGTAATAAGCTGAAAATACCCTTTATATAAATAATGATAACACTGCATGGAAAT
-AAAGAAAAATCTTTAGGATGCAGCCTAACTGGTATTTACGATTTTTTAAACCCTGGATTA
-AACGCATCTTTTTATAAATGGAAATAATTAATGAAGAACTGAGATGGAATCAAAATAGCA
-AATCATGcacacacacacacacacacaAATTCTGTTTAGAGAACTAAAACAATATGTCAG
-AAACGTTGAAGAGTTCATGtgcatcagttagttcctgccatgtaacaaaccacaccaaaa
-tttagtagcttaaagcaaaatcatttatgtatgtcataattctatgagttacaaattgag
-gctgggctcagctgagaggttcttctcttcacttttgggctcatgcatgtgaggattaat
-gggagctggcaggtctagggtggactccactggaatagtctgtctctgttccaaaaggtt
-agctgaagcttgttttcctggcaacagagcagagttctgagagagcgtgagtatgcaagg
-cctcttgaggcccaagcctaggttcagaacaggaatcacttctgatatactctattggcc
-aaagttagtcccaagtccagatccagGCTTGCTCAAAACAGTGGCCCATCTCTCTGGCCC
-CAATCTCCATAGTTCTGGTAAACaaaaaaaaaagaaaaagaaaaagaaaaagaaagaaag
-gaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggCTGAGATAACA
-TTGGGTTTTTCCAATGATAAAACCTAGAATTAATGAAGAGCTAAAATTAGTAAATTTTCA
-AAAATAcaaaacacataaaatgtaaaactgctgaaaagataagaagaaatgaataaatct
-ataattaagacggaaatctttaataggccataggcctcaggagtcctcaaagtaaacaaa
-aaatgcacaagcatgcttatcttaaaggattaaataggtatttttaaaatattgatttaa
-tacacatgtagaactattaagtaacaaaatagatacatacaattttaaagcatagctaaa
-aaatggctaaaaattgattattataatacatgtgtatttcaaatattccaaaagaagtca
-gtccactcatataaactaaccacaatataacaacattagaacttccaaaaaaggtatgtg
-tatatgaggtggggttttttcaaccttctaaataattgtgggttaaaaaaacataaaaac
-tacaagattttggaaatgaatcaaaatgagagttctacatataaaatcttcatgaaaatg
-gttaaagtggaaattagatgaaagatttaaaggcatttactagaaaacaagaaaTTTTAC
-ATTTTTAAATTAAAAGCTAATTAAACTCAAAGTTAAATTTAGTTAATTAAACTCAAAAAG
-CTAACAGACCTGAACTTGCTCAGCAGCCTTACCTAAGAATCATCTATTTTACCGATCTTT
-TCAAAGAAATGTTTTGTTTTTATTGATCAATGCCTCCatatttttgaaatttttatagtt
-ttcatttattatattgacaaatttttttaaattattaatGTGGCGCTGGCAATACACTTG
-TGAAGCATTTAGTTATTTATCCTTAAAATATATTAGTACTTggcggagtgcagtggctca
-cgcctgtaatcccagcactttgggaggctgaggtgggcaggtcacaaggtcaagagatgg
-agaccatcctggccaacatggcgaaaccccgcctctactaaaaatacaaaaaatagctgg
-gcgtggtagtacacacctataatcccagctactcaggaggctgaagcaggagaatcactt
-gaacctgggaggcggaggttgtagtgagccaagattgggccactgcactccagcctggat
-gacagagcaagaccctgtctcaaaaaaaaaaaaaaaTTAATCCATGTGCACAAAGAGGCA
-TAATCAGAAATAATCATTTCCAATTTTggctgggcgcagtggctcatgcctgtaatccca
-gcaatttgggaggctgaggcgggtgaatcacctgaggtcaggagttcgagaccagcctgg
-ccaacatggtgaaaccccgtctctacttaaaataccaaaactagcctggagtggtggtag
-gcacctgtaatcccagctactcggggggctaaggcaggagaattgcttgaacctgggagg
-tggaggttgcagtgagccgagatggtgctatcacactccagcctggggaacaagagtgag
-atgtcatctcaaaaaaaaaaaaaTCATTTTTATTTTGTTTTTAAAAAGAAAAAATGggcc
-gggcgcggtggctcatgcctgtaatcccagcactttgggaggccaaggcgggtggattac
-ctgaggtcaggagttcaagaccagcctggccaacatggtgaaaccacgcctctactaaaa
-atacaaaaattagccagaagtagtggcacgtgtctgtaatcccagctactcaggaggctg
-aagcaggagaatcgcttgaacctgggaagcagagtttccagtgagccgagattatgccat
-tgcactccagcctgggtgacagagcaagactccatctcataaaaaaaaaaaaaggaaaaa
-TTGGAAAAATAAAGTACATGCAGTTTATTTGACAGAGGGATGTTTAACTGAACCACACTA
-CATCCATATATATGAAGTTATGCAGCAATAGAAAAGAATAATGGACATTTATATTTTTAG
-ATATAAAAAGAGCTGTTGAACCTATCATTGAAATTTTAAAAGGAAGCTGAAGAACAAGTA
-CAGTGTAATAAATTATTTGTTTTTtacaatttaattatagagtaaatgtgatctttcttg
-gtatatagttctatagattttaataaatatttggattcatgtaaccaccaccacaaatag
-gacacacaacagtttcatcaccctaagaaaagttcccggatgctcacccctctgtagcca
-aaccgtcaccccacccataatccctggcaaccactgatctattttccatcactataattt
-tgccttttccaagaatgtgacataaatggaatcatgtagtatttaacgttttgagaccag
-cttctctcagcatgtgatatggtatgtacctgtgtctccacctaaatctcacgttgaatt
-gtaatccccgatgttggaggtagagcctagtgagaggcgattggatcatggggacagatt
-tctcatgaatggttcggtatcatccccttggtactgtcctaaggatagtgagtgagttct
-gcagagacctggtttaagcgtggagcacctccccactctcttgctcctgctctggctatg
-ccatgtgcctgctcacccttaaccttccaccatgattgtaagtttcccgaagcctccccg
-gaagccaagcagatgccagcatcatgcttcctatatagcctgctgaacagtgagacaact
-aaacctcttttttttttagcaaatgacccagtcccaggtatatctctataacaatgtgag
-aacgacctagtaacagcatgtctttgagattcatccaagtttctaccagtatcaataact
-cattcctttttactgctgagtatgattgtattctatggatgtggtacatctgtttatcca
-ttcattcattgaagggcatttgggttgttttcagcttttggctatcacaaataaagtttc
-taagatggccaggcatgatggctcacgtctctaaccccaacactttgggaggctgagatg
-ggcgttgaggtcaagagtttgggaccagcctggccaacatggtgaaaccctgtctctact
-aaaaatacaaaaattagctaggtgtggtggcacacacctgtaatcccagctactcaggag
-gctgaggcaggagaatcacttgaacctgggaggtggaggttgcagtgagccaagattaca
-ccactgcactccagcctaggcaatagagagagactctgtctcaaaaacaaataaataaat
-aaataaagttgatatgagcagtttttacagatgtttgtgtgaccgtaagttttcgtttca
-ctagggtaaataccaggttcaggattgctaggtcctgaggtacgtgtatgtttacctttc
-aaataaactgacaaaccattttctagagtgactgcaatttccagttgttctgcaacctca
-ccagcaattggtgttgtcagaaactttttattttcataattcttatcaatgtgCACAATT
-GTTTTTAAAATTCACAGAATTAAAGGAAAATATATTGTGCACTATTTGTGTAATTaaagc
-aaaacacaaacacataaacggaagacaaaaataagaaactaattcaagaaactaaagaaa
-gaaaaacaaaaTTAACTTTTTAAAATTAGAATAAAGGCATATATATGTAATAGGGATAGT
-TTGAAACACTCCCAAACATCTGCTCTGAGCCAACAACAATCGGATAGCgtgagggcagat
-acaaattaaatatgagacttaactctccccgttaaaaataaggaaagagacttacccaac
-acccctcccccccgcccttctctttctctgtctctttgaaatgtatgtaaatctttttaa
-aatgtaaataggcctctagccagttttacaacccaggaatatctttgtcaaatacctagg
-agccatctctttgaaatgtaagcatccagaaaggtagtgctcctatctctgaatttatat
-gagtgggtaggtctctaactttggcaagttccttgcttcaagttgcaaagccacttcctg
-tcacaaggatgtgagaattttgtttttcctttggttaaagccaaccagcgaacacagatg
-gccactccaattatcaggtgaatctaggatgaactatgtgtatgtcaaatggtacttcta
-agttctcctatttgagaaccagttattgtttgtcttgagagcatatctgtaatgggtttt
-atcttcttcaggatataaacaagtaggatttctttctgtctttgcaaactctttgtgaat
-tgcctgtgatgtgtctcacattctggttcaatgcttattcaatggcaattgttttctttc
-tcttctacctttgtggagaggttttctaggttgagagaagattttgtttttaattatatt
-tcccccacaATAGCAAACACATCCCCAACcacatacacacacacacacacacacacacac
-acacacacacacaacaggtaattagacaggcctgagcagggcaggagagggctcttcccc
-cacccactacgaatgtcagtgatggttccaaaattatcacattgcctctctaaaagtgat
-aaattggGCAgcgcagtggctcatgcctgtaatcccagcactttgggaggctgaggtgga
-cagatcacttgaggtctggagttcaaaaccagcctggccaacatggtgaaaccccatctc
-tactaaaaatacaaaaaatagctgagcatggtagtggacacctgtaatcccagctactca
-ggaggctgaggcaggagaatcgcttgaacccagaaggttcaggtttcagcgagccaacat
-tgccccactgcactccagcctgggcaacagagtgagactccatctcaaaataaataaata
-aataaaataagtgagaacatatggtacttatctttctgtgtctgacttgcttcacttaag
-ataatggcctccagttatatccatgttgctgcaaaagacatgatttttgtggagggattg
-tattccattgtatatatagaccataatttctttatccaatcatctgttgatggacactca
-gttgattccatacctttgccatcatgaatcatgttgtaataaacatacaagtgcaggtat
-cttttgatgtgattatttcttttcctttgggtagatacctagtagtgggattgctggatc
-aaaAtggcaggtgcctgtaatcccagctactccagagactgaggcaggggaatcgcttga
-aactgggaggtggaggtttcagtgagccaagatcatcccactgcactccagcctgggtga
-cagagcaagactctgtctcaagaaaaaaaaaaaaaTgctgtgtgattacccttatatggg
-tttcctggatgagccatttgttaaattaatttttgttggaaatttccccgcagagctgtt
-gcacattgtggggggttaatccccagacactcccatgaggccccagtcacccaggggtgc
-ctttggctgggaggagcaagtgccctttctcctaggagctgaaaaactcagtctcttatt
-tatctatgaaaacaacagttcagtttctcacataaatgtgtacagataaaccgaatttag
-acagattttaggagaaaaagcaattgagaattccttttagaatgcatctcccaactagaa
-ttaggatccttaaacaaccacttcttaggagaaaaccagctcagaataaatcaaggacca
-tcaaccaaagggaggtctggggctcaggaggacttaccagttccaccagaggagaagctc
-gaagcttcaatgggcccctgctggcaccttagctctggttttgggcaactcctttagggt
-cctgagtcttccctgaggcctcacgtgtttgggcaccaaattattgttgacgaaaagagc
-caaactctgtaaaatattttaagagatttattctgagccaaatatgagtgaccatggccc
-gtgacacagccctcaggaagtcctgagaacatgtgcccaaggtggtcggggtgcagcttg
-gttttgtgtattttaggaaggcatgaaacatcaatcaaatacatttaagaaacacactgg
-ttacttggaagtccccgcggggctgggggcgggtatcaatggaaaggaatgttcaggtta
-acataaaggattgtggagaccaagttttattgtgaaaagaaatctctcagatagcagact
-tcagagagagagcagattgtaaaatgtttcttatcagacctaaaagggtgcctggctctt
-agttgattatctcctggatctggaaaggaaggggaaaaagggggtgggtgggtgtggggg
-tatagaatgtggatctttttccaccaaagattttgtaaggcaatttcaaagtatggcaag
-gcaatatattttgtgataaaacattgtgattttttttttttttttgtgagacagagtctc
-actaggtcccccaggctggagtgcagtggcgccatctcagctcactgcaaccttcgcctc
-ccgggttcacgccattcttctgcctcagcctcccgagtagctgggactacaggcgcccgc
-caccacgcccggctaactttttgtatttttactagagacagggttttactgtgttagcca
-ggatggtctcgatctcctgacctcatggtccgcccgcctcagcctcccaaagtgctggga
-ttacaggcgtgagccactgcacctggccaaaacattgtgattttcttccttgttatgcca
-gagtcagattgaaaagtaagtcacaatatacagggtcaaataaaacccatcttgtaagaa
-tttatggtttgtagggcataactccctagaccccttaggtaggaatttgggcaagataaa
-aaatcagagtttagtcctcaattccttaagataaatctctttctctatatatatctctct
-ctatctcatatctccatcctattctctggaaaactctgactaatgcaAGAAATTAAAGAG
-ACAAAACACATAATACAATATCTtaaacaacaaaatactattcagccataaaaaagaatg
-aaatcctgtcattcatggcaacatggatgagctagagcagtggtccccaacctttttggc
-accaggcactggtatagtggaagacaatttttccatggtcggaagggggtgggaggatgg
-ttttgggaagaaactgttccatctcagaccatcaggcagtagttagattctcataaggag
-tgtgcaacctggatcccttgcatgcgcagttcataatagggtttgtgcttccatgagaat
-ctaatgcttctgcacatctgacaggagatggagctccggggtaatgctcacctgccactc
-acctcttgctgtgctcccagttcctaacaggccatggtccccataccaatctatagccca
-ggggttggggacccctggcctagaggacattatgttaagtgaaataagtcaggcacagaa
-acataaatgctgcacattctcacttatatgtgggaactaaaaaagttgagcttacaggcc
-cggctcggtggctcacacctgtaatcccaacattttgagaggccaaggcgggtggatcac
-ctgaggccaggagtttgagaccagcctggccaacatggtgaaatcccatctctactaaaa
-atacaaaaattagccgggtgtggtggcgggtgcctgtaatcccagctgctcaggaggctg
-aggcaggagaatcgcttgaacctgggagacagagttgcagtgcaccaagattgcaccact
-gcactccagcctgggagacagggtgagactccatctcaaaaaaaaaaaaaaaagttgagc
-tttcagaagtagagagtaaaataatgtagcaggtagaagaggatacggagaggttggttt
-taacaaatacaaaatcacagctagataggaggaataagttctagggttccatagctctgt
-agggtgactgtagccaacaatcacttattgcatattttcaaatagctagaagagaggatt
-ttgaatgttctcgcacaaagaaatgagaaatgtttgaggtaccctgatttgatcattaca
-cattgtgtacacgtattgaaatatcactctgtatcccataaatatgtataattattatgt
-caattaaaaataaaattttaatttaaaaatacattttaaaaatCAATACAATATCTGACC
-TGACACTGCAATCTCAACTCAAGGAGGAAATGAAtgctgtaaaaggcattattaggtcaa
-ttggcaaattggaatacagatatatatatatatatatatatatatatggatagatgatag
-actagataaaagtggtgtccatttaaatttatggagttagtaactatactgtcatacagg
-agaatatccctattcttaggaaatacacactgaattatttgggagtaaaaggccacgata
-atataaggccatgaacatataacttatgctcaatagattcaaagaagaaaatatacaaat
-atagagagactaatatagATATATATATATCCATAGATAGAGAGAGGTGGGGCAAATGCT
-AAAGCAAGAAAGATAAAATGTCAACAATAGGCAAATCTCAGGGGAGCTGGGGAAAAGGTA
-TCGTACAATTTGTATTTTGCAGCCGGTATGttttaaattatttttaaatgaaaagatttt
-ttaatGGGTTGAGGAAATTGGAGTGACTTATATTTATGACATCCAATGGACTGTGCATGC
-TGTATGGAAACAAGGAGAAAATAAATGTCATCATTGCTTAACAAGTGAAGGGTAAAAAGA
-CAATTAACTCACTGAAGACTACGCACAGAAACACAAAAGCCTTTGCTTCTGTGGTTATAG
-GTTTACCAAAGGCACAAAGGGATTTGTATTTATTTTAGGATTATAATTTACATCACTTAG
-TTGGAAAAATTACAGATTTTAAGATATTTTTACAAATCTGAGTGACTGTAAAGACTGCTA
-AAGTCTTGGGACATATTCTTACCAAGTCCCAGATCttttgttttgttttgttttgtGCCT
-GAAATCAAACCAGGTTTTTTAGACCAGGAAAACGTGAGAAGCTAGAGCTGCTCTACTCAG
-TTGGCCCAAACCAGGACTCCGGAGATTATTCCCTTATACAGCAGGCACCACATTAGAGAA
-AGGATTCTGGAAAAGTGAGCTGGAACAGAAAAGAACTGTCTCAATGGGAAACAGACTCCA
-AAGGACGCTATTGGGGGGAGGAAAACACAAAATATTTCTTGAGAAGAATGTGGAAATGGC
-AAAGTCTCTAGCCTCCAGAAACCTTAAACTCTAGGGAAAGAAAGCAAAAATTTAGAGGTA
-AGAGTGTTCATATTAAAATTCAAACAATAAGTAGTTTTTCTATAAACTCTCTTTTTTTCT
-AATCATGAAAGTACACATAATCATTCTCTCCAAACTCAGACATTTtagacagatagatag
-atagatgacagatagatagatagatagatagatagatagatagatagatagataCacatg
-catacatactacatacatatatacctacataTGTTGGCACATAGATGTTCCTTTACCACA
-GATTAAGTTATTCTAGATGCATATCTTGTAGCCTACATTTTTATACATTTTcatcatttt
-aataactgcatactgctctattatattctgtattttctatattagattagatccatgttt
-tatcaccatttaggtagcttttggttttctgttactgtaatgttgagataaacgtcttta
-tgtacttgttcaattattcccattaaacaaaagcccaaggtacaaagtttctgagtaaaa
-aaataggcacattttaaggcttctgatatatattgccaaattgtgctacaaaagaaaaac
-tgtaccaattaacactcccagcaacaacgccaagagaatgctagtttccccacatctcac
-caacactgtctaGAACGCATAGTTTTAGAGATGAACGCTGGGAACCGACGCACTGTTTGC
-TCTACCTCTCCCCCTCCTAACAGTCTAGAACACAGGCGCTCAATAAATCAATCCAGGCTC
-CAGTCCAGTAGACATTCTGATCTAATCTGACTGCTCTGGGTAACAGAAAAGTCTCCCTTG
-GTTCACTGCCCAGTATCCTGGCATCATGTGGATCCTATAAAGGCAGTAGCTCCAAGCACA
-TTACAGAGGGACCCAACTCCATTAAACCACCACCAGCTCCCCAAGCCACCCCTTCAGCCA
-TGAAGTTCCTGCTCCTGGTCTTGGCAGCCCTCGGATTCCTGACCCAGGTGATCCCAGGTA
-AACTGGATAAATAGGAGGAAAGGAAAACTGGGAACGAGGAACACTAGCATATCTGGTTGC
-TCTGGTGATAGATGAGCCAGGTTGGGTGGAGGCAGGGCTCACCCCACTGAGTTCCAGTCT
-AAGGTAGAGATCTCCTAACAACCACCACTAGCCTTGATATCCCACACCCAAACACCACCC
-TATATAACCTTTACAAAAATTTGTTTTCTATTCTAAAATGATAGTCACCCTCAACCTAAA
-CCAAAATATCTTCTTTCACTTTATGTGAGCTCCTTATATCTAACCTCCTAAGACACACTG
-AAGGCTTCTGTCATCACCATGTGCATCCATTGAGATCAGCCCGGGTTGGAGCTCAAAGGA
-GATTTTGAGCCTAGAAGGAAGAGATTGAGGTTCCCATCCCTATGCTCAACAGACAGCTGG
-CAGGTGGGGGATGGAAGCAGACCTCTTAGAGGGCTAGTTCCCACAGGATGGTAAGCAATG
-GGTTCAGCTCAAACCCTGGGGCTAGGAGATAATGCAGGGTCagaaagagagagagacaga
-cacacagagagcagggagagagagagaTCAGAGGAGGGCCAGGCAACGGATGTGAAGAAA
-GCCAAAGAGGCTTGAGGGTGCTCCGAAGAGGCCCCTGCTGTGAGCCAATGGCAGACACAG
-AGCACTGAGGCAAACAGATTTCAGCAGATGGTGAAATGGTGCACAGCACTGGGTGAATGC
-AAAAATGCCCTGTCACTGGCAACCGTTATTTTCTTTTTAATGATTTTGGAGAAAGATTTG
-ACTCCTCCCACTTTGCCCCAGGTTGACTCATATTTACAGTTTTAGAGTCTATGAAAACAA
-GTAAGGTAGAAACACCTTAAAAGGGAGCCTGTGGGGTGAGTGAGACTAGCCCCATTTCTC
-CCTTTTGAGTATCCAAGCTCCTCCCTGACCGTGAAGACCAGGCTCCCCACCCCTGTTTTT
-ACCCATACATCCTATTCTGTAGTATCAAATTTAGCAAAAAGCTTCAAAGATGCAGATACT
-GGCAAAGAAGAAGAGCTCGTCAGACAGAGTTCCCCAAGGCCATCAATCCAGGAAGATTTT
-TGTCTCCTCATCACTGGCTTTCCCAAGTCTCATTTGCACAACATCCTAAGGATACACCTC
-AGAACAAAAAGCCAAACACTCCCATCTGGCGCTGACGCTTTAGTAGCCCTGTGCTGCTTC
-TAACCATGACTTCTCTGTCTTGTCCTCTCCCATACAGCCAGTGCAGGTGGGTCAAAATGT
-GTGAGTAACACCCCAGGATACTGCAGGACATGTTGCCACTGGGGGGAGACAGCATTGTTC
-ATGTGCAACGCTTCCAGAAAATGCTGCATCAGCTACTCCTTCCTGCCGAAGCCTGACCTA
-CCACAGCTCATCGGTAACCACTGGCAATCAAGGAGAAGAAACACACAAAGGAAAGACAAG
-AAGCAACAAACGACCGTAACATCATAATAACCACTGCTATCGCCTCCACCAACTCAGAGA
-AATATCATTTCCACAGTTCCAATTCCTCCTACATTGCTGAGTACTAGCCAAGGCTCCTCT
-TTATGGGGCAGATATCTATAGCCAACCCCAAAACTTCTGTCTTCTATCATTCTGTCATTC
-ATCTAGTAACTAATTTGGAGTTTGTATCTATCTTACGAGAACAATCATCATGCAGATTCG
-TCCACAGGGGATCtgtcagtttgggtcctccaaatgaaaaatgtcaagacagaattggac
-atgcaaaagattgactgggagaacacacctctgatggacaaaggtgagacagagcagcca
-caggcagggagagccttcagactgcaacgctggcctgatacgtgtcaaaggagagaggga
-tagaggaggattgaatagaaggagactaagactgcagctctaagaaagtctcagccaaac
-agatggggaggcccaaagcaaggcttgcccctcagaggagctcacgcagggcaggaatag
-ccaggttctcatatcccaggggttcagactttggctgagaacagcccctggagaacatgg
-ggtgactgctaccataggtctggaagtatgaggctgtccaccaactatccccttgaagca
-agttctcttgaaaggaaatctaaacagtgcacccccatggctgccacGGAGTATAAGGAG
-GGAGAGAAAGGAGCTGAAAGTCTAGGTTTGGCCAGCTAGGTAGACTGACTTGTGAGGTAT
-TTATTTATTCATTTGAGTAACAAAGCAGACAGAATACATAGCCACCATTGGTAGTACACC
-CCAAAAGCAAGGATGGCATGATGCTGGTGACTCAAACGTGCCTACTCATGGTGTCAAATT
-GGCATAATCCTCTTGGGAAGCTGTGTGGAAATAAGCACAGAGAAGCAGAACTCTAATTGC
-TTAATCCACTAAACATTACTTCTGGGAATTGGCTCATCATAAATTATCCAAGAGAAGCAC
-AAAGTTATGGGCACAAAGGTTTTCCATATAATATTATTTAAAATGCTGAGAAAATGAAAA
-AATCTAAATGGTGAAATATATACTAATGCCATCTATAAATACAAACAAATAGAATGTTTA
-TAGAATAATGGAACATAATAACATTATTCAAAATTGCATTTATGCTATAGTTGTCAAAAT
-TGTCTCCTTATATGATACAAAACTCATGAAAATTATGACTTTTTTGTTTGGTTGGAAAGC
-AGAATTATGCATAAATTTCCTCTTACAGTTCGATGCCCATTAGTTTTATATAACATTTAT
-TTGACACGTACTGACTTCTATCTGAGAAGAACAAACCAAAACACTCAGGCCTAAATAATT
-AAAAACGGTCCTAAAAACTAGCAAAccagataagaaaagatgttaatgcccattccctaa
-cttatgtcttagaccaaaattaattctagatggttttaaaatgacagtgtaaaagtaaag
-tattaaaagattgtgtggtcaaatattcaatttaagagcaaggaaattcttataaatata
-acaatagaggcagaactcatgtaagaataaattgattaggtggtattaaatattaagttc
-ttatgtatgtcaaaagatatcattttgaaattcatccatcttattgggtattgcaggagt
-tcattcctttttgtttataaatactcttccgtcatatgaatagtattcatttgtatactg
-gtttgttgatggacatttgggttgttcccagtttatggctattacaaataaagcttctat
-gaacatttatgtacaaatctttgtatggatgtatgctttcatttccctaaggtaaatacc
-taggagtagaacgtctgaatcatatggtaggtgaatgtttagcttttttgtttgtttgtt
-tgtttgtttgtttgtttgtttgttttttgagatagagtttcgctcttgttgcccgggctg
-gagtgcaatggtgcgatctcagctcactgcaacctccgcctcctgggttcaagcaattgt
-ccttcctcggcctcctgagtagctgggattacaggcacgcaccaccccccgaccccggct
-aatttttgtatttttagtagagacggggtttctccatgttggtcaggctggcctcgaact
-cctgacctcaggtgatccgcccgccttggcctcccaaaatgctgagattacaggcatgag
-aatgtttagcttttaaaggaaatacaaaattgttttccaaaatggttgtgccagtggatg
-tgcccatcagcaggatgtgaaagttccagccgttcctcatcctcaccagcatgtgatatg
-gtcagtcttttgcattttcatcattctaatagatgtgtagtggtatttcattatgctttc
-aatttgcatttttttaataactagttatcaaaaaagtatattctgtatgattctatttac
-ataaagttcttTAAATTCTTTTAAAATTGCATAcaattatttaaaatagaaagtaagaat
-ctaacgacagaaagcagatcactggttgtcaggggatgtgaaaggtgcatggagagggct
-gaaagaatgtaaagggacctgaggacactttgaggggtgatcagtcaagacacattcata
-ggccgggcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggtgga
-tcacgaggtcaggagatcaagaccatcctggctaacacggtgaaaccccgtctctactaa
-atatgcaaaaaattagccgggtgtggtggtgggcgcctgtattcctagctactcgggagg
-ctgaggcaggagaatggcgtgaacccaggaggtggagcttgcagtgagccaagatcgcgc
-cactgcactccagcctgggcgacagggcgagactgtctcaaaaaaaaaaaaaaaaaaaga
-tacattcataatcttgattgaggtaatggcttaatgggggtgtacataagtcaaaaaatt
-acaaaatggtaaactttaaatgtgttcagtttattgtatgtcaatttaaacttccaaaaa
-aGCtattattttaataaaataaataaatCTCACAGTGAAACAGAAATATTAAAGTATCAT
-AAATAGTTTAAAGACGTATGACAAACTGAGACATGTGATGAAGTATCGATACCAATAAAA
-TATAACAAGTTAACATGAAGcaacagggaaaacatgaaacccctagcagaaaatgaaaaa
-gtaacatgaactagctttttaactctataaacggcctgaaaaatgggaaaaaatctgtgt
-gactgtgatcaaataaatgcagattaaaactacaatgagatcttgttttttacctatcgg
-attgtcagagaattaacaaacccaagtctgacaaggcataaatagaaataagtctcatca
-tcagatgctccggtttataactaaatatgtccattctggaagacatttatctatacagct
-ttcaaaacccttaaaaatgttcatgttctgtggctcagagactctacttttagggatata
-ttctggggaaataattagagttcatatcaaaaagattaatgtatatacagcacaatcata
-gcagcatagtttaaagtagtgaagaggcagtggggtaagatggctgaacagaagcctcca
-ctgatcatcctccccactagaacaccaaatttgacaactatctacacaaaaaagcacctt
-cataagaataaaaaatgaggtgagtgatcacagtacctagctttaacttcatatcaccta
-aagaggcactgagaaggtaggaaagacagtcctgaattgctgacaccgcctctccccagt
-cctcaggcagcagctgtgtggtgtgcagagacaatatgtgtacttgcaggagggagagca
-cagtgattgtgggatttcacattggaactcagtgctgctagcaccaggcagaacccagca
-ggtgcctaaaagggatcatttagaccatccctagccagggggacatcacccatcccagag
-gtcggaactccagtttccgcaagcctcaccaccgtgggctaaagagctctggggtcctaa
-ataaacttgaaaggccgtataggccacaagaactgcaattcctaggcaactgctagtgct
-gtgctgggctcagaggcagtagatttagggaccactcaacctagtgagacaccagctggg
-gtgtgtgtgtgtgtgtgtgtgtgtgcgtgtgtgtgtgtgtgtgtgattctcgtgcctcag
-cctcccaagtagctggtgatggcagtggcagcccatctggagtggacgctgccatcaagc
-cagctgcagcagggagggacagctggggctgcacattccacagagctgcagagctgggga
-caatgagagccccacaccttccaagctggtgcagcaggagctccccaggtgcaactgcag
-ccactcaagtcacggctgtgaaccccggcctccctgtgttcttgtgggtgctgggagcag
-gcaggggtcctgcacttttgggtgcagctgcaggcgcccaaaccatggctgcggaaccag
-acatctctacactcttgagggtcagggaagtccccactgccctcacaagcttagaagtgc
-ctgctcccacagcctggcgcctccctgctgtcggtgcccgctctaatcttggagcaaagt
-tgaggccaagcccaggtgctgtcatagcctgttgggtgtgcacacgcttggggcagtgct
-gacataccagccccctgccgcctcggacccctacagacctcgggtgctgacgagcatagg
-aggaaagccgaggtggggctgagggcagctcggcacctacagcctgggtgccatgaatgg
-cagtaggagTCTTCTCAGTTCTGTCTCCCTCCCTTCAGTGTGGATGAAGGGGTAGAAATG
-AGGTACAGCATCCTGTCTTTCCCAGGGGTCGTGTTGCATCCTTTAATAGTTTACCACTGA
-CAGCACTACCAACGATTTGGGGATTGTGTCTCGAGGAAGCAATTGACCTAAATTTCATGT
-ATCAATGAAACTGTTTTTCCTTATGGttttaattatttatttattttataaaataaaata
-aataGGCTTTTAATATATAATGAAAGCCTTTTAATGTTAACATGCAAGGACTGAAAGAAT
-ACCTGTTGGACTGCAAGATGGCTGCTCCCTCTACCCTCAGCTTCAACTGGCCTGTCAGCC
-AAGCTTTGATTTCCTAGGCAGAATATAAAAGAATTCCTCTCTGTGGTGGTCCAGGAGACC
-AAGGGAATTTGGGGAGGTGATAGAACTGCACCCTGATCATGCTGGTGGTGAAAACTCGTG
-CAACCGTACACCCAAATGTCATCTTTTTTACTGTATGTTAATTTTAGAAATCAGAAAGTA
-AAAGATGCAATCACAAAAATATCATTTGGTAGGACAAACTTATTCAGTATATGAAGATAA
-TAGAGAACTTTTATACAAAAGTGGCTCTTACaaaatattaatataaaatattaaaatata
-aattCTCAAGAGCTATAACTTAAACTTCTATGTTAATTTAGGTAAGCAATTCTCCTATGA
-AAAGACTTAACGAATTCTTTCCTTTTCTTTTCCTCTTGTCTTTTCATTTTGCTGCAAGGA
-GCAGCCTTAAAGCTGACTGAAACAGTTATTGTGACCAGCATGTAATGCTTGAAAAGATGA
-AAATCCAGCTTTAAATATGCTCAATCTCAATAACttttttggtttttttttttttttttt
-tttttgagacggagtcttgccttgtcacccaggctggagtgcaatggcacgatctcggtt
-cactgcaactttcgactcccagattcaaatgattctcctgcctcagcctcttgagtagct
-gggattacaggcaccggccaccatgcccagctattgtttgtatttttagtagagatgggg
-tttcaccatgttggcaaggctggtctcgaactcctgacctcattatctgccgccttggcc
-tcccaaagtactgggattacaggtgtgagccaccgcgcctggccTCAATAACTTTTTAAT
-AGGTATATGCTTAGTTTATTCATGTTTCTTTGCTAGTTTTTTTTCCCTGCAAAGAAGAAG
-AAGAAAAATAATTTTAAATCTTATTTGAAGGATGATTGTACACTGTGTTATTGGCCTTGG
-AAAGGAGAGAAGGAGGAAAAGGAGTAGGAAAAGGGAAAATATCTTAAGAGGTTGTACTGT
-TAATCTACTTCCAGGCAGATTTTAACCACTAAAGCTAAAATGCTATTATGAAATTGAATA
-TTTCAATTGAATATTGAAAATGGTATAATGATgccgggtacggtggctcatgcctgtaat
-ggtagcactttgggaggccaaggtgggtgcatcacttgaggtcaggagttcgagactagc
-ctggccaacatggtgaaactctacctctactaaaaataccaaaaaaatagccggaaattg
-cttgaacctgagaggcagaggttgcaatgagctgagatcatgccactgcacttcagcctg
-ggcaagagagcaagactccatcttaaataaataaataaataaatgaaAATGGTATAGtgg
-cttgaagatgcaggggcccatgaggaagaacatggatggcccctagaagctgaaagcagc
-ccccaggtggcagccagcaaggaagtggggtcttcaattctacacgtgcaaggaactgaa
-ttctatcaacaacctgaatgagcttggaagctgattcttccccagaagccgcagataaga
-gctcagccTGCTAGGGGCTTGAGAAAGGGGAAAGTGACTTTAAAAATGTAACTCGAGGGA
-GTTCCAAAAGGCTAAGCGATTCGGTGAATCTAATAAACATGTTAAAATGCATAAAGTTCG
-GGTGTGGGGGAAAGGGAAGGGAGAGCATTAGGACAAATAGgttcttttctgagttctggc
-caggaggcttcttgatcagttcaaattgttacaaagttcagctggaggtttccttctccc
-tgtggccgctctgggcctctggcagccctcctcaaggagcaatccgtttccttcagaggg
-tctgtgggttctcctggcttccctaatgcgttcctgcagtccttctgaagcaaaacttaa
-tgatgcgagcctccacacgctgctctgaccgtccgagtgggagctgcaatctagtcctgc
-ctcccgtctgtcatgatcccTGGTGGTTTTTGACTACagctcaattgttttagattccat
-gtgtaagtgagaacatgaagtatttgtctttctgtgtttgactcatttcacctagcagaa
-tgtGTaataaacattaacaaaatgaatgtgtaaaatcaggtagtgatcacagctacaaag
-aaaataaaacagagtgatagatggaaagtgatggggaggaagaacctggttagaaatggt
-ggtcaggcaggacctctctaagaagggaaaagagctgtgactgcacgataagccggccac
-gtgaagaccttgaggacaacatgcaaagctgatgacccaccggccctgcaaagaccgggc
-gggagataagcttggctggcgcgaagaaagaaggctggagggagtagaaatggggacagg
-agctgaacgctgggagagggggctcaaagCCAGCTCGCGTAGGCAGGGACTGGGCACTCG
-CAATGCGCGCAGAACAAAGGCCTCTCTCTCTCTTTCGCCACACTAAGGGCCAACATGGTC
-ATCTCCAGGTGCGGATTCTGCCGTAAAATGCGCCCCTGGCGACTCACGACCAGGACGCAT
-TCCGCACCGCTCCCCCACGCCCCGCAGCCCGCCCTCGAGGCTGATTGATTTGTGCCAGTC
-TCTACCGCCATCTGCCGGCAGCACTCGGTACACCCGCGCCCTGGAGGTCGCACGCGCTGG
-CCAAACGGGCGCACCAGACACTTTTcagggccctgccaaagacctcccaatgtctactgg
-cgtcccagacacaagagatccaggccaagactcacacttcacaagatacacagacacggg
-ccttagggaacaggaaattccatgaaacttccatttacccaattagccggactcactgag
-ccccagaatagggttttcaaccaactcctactaaaattAAAAAGTAATGTGTGGtataga
-ttggaataatagacattggaggctacaaacgatgggaggcggagaggggtgagggttgaa
-aaattacctattgggtgcaacattcactatccgggtaatggggcactagaagcccactcc
-accactatgcaatatatgtatttgtaccccgtaaatctataaaaataaaaaCTACATTAA
-AAATAATAATAATGTCTGGTCATCTAAATAGTACCTCTACAGCTTATTAAGTGCTCTGGA
-GACGTCCCAGTTGCCTGTCCTTCCCATTAAAGGTGATATCCAGTGCTGATTTCCCCTTCA
-ACCTCGGGTTCCCATAAACCTCTTCTTTCTCACTCCTGCTGCCCTCCGGTACTCCAATAA
-AGAATGATAGATGggccgggagcagtggctcacgcctgtaatcccagcactttgggaggc
-caaggcggatggatcacctgaggtcaggagttggagaccagcctggtcaacatggtgaaa
-ccccgtttctactaaaatacaaaaattagctgggcatggtggcgggcctcagtaatccca
-gctactcaggaggctgaggcaggagaatcgcttgaacccgggggcagaagttgcagtgag
-cagagattgtgccactgcactccaacctgggcgacagagcaagactccgtctcaaaaaag
-aaaaaaagaaaagaaaCAGTCCCAGTATGCATCCATGTGCATGTGCATGCAGGTGTATCT
-GCCTGTGAGAGCTGCGCACGCGGCTCTGAGTACCTGGGAAGACACCCATGTACAGATGCT
-GTACATGTGCGGGGTCACTCTCTGGCGCATTCGGAGGCATGAGGGCTACGTGCAATGCGA
-GGGAACCTATGTCCAGGCTTCCTTTCTTGGTTTTCCTCCTCTGAACTCATGCATCCCTTC
-ACAAACagtccagctcctggctaaaaacctatgtgtgatttttcagcccaaacacaggca
-atgacaggttttacctggcaggcctcacagctgagtcgtgcacagctgatgcgttgcagt
-ctttaaagacagttgcagacacagactcaggcctcctggacagtcgacctctcacacaca
-tctccgctcccaacccaagtcttcattcagacacgtcttcattgcagtggggtaggcctt
-cggccaggacctccttatcttggggagtggagaatccttgaagacactttcctccatgct
-gactcagaagttttcccactctcccttccccaccccatccctggcccccaggtccgtaca
-acttcaggagcctttttgttggaagcttttctgcagtgagaccaaccccacacctgtgct
-catccacccgaccccagttggcatcattctatgaggaaattagaacaggtggatctgtgt
-tctacaaaataaaacaaaccaggttctctggtttagcctctttcttgtactgtaataata
-agagatttggggcttggctattacttgctttgactttttttgttttgagacagggtttcg
-ctctgtcacccaggctggagtgcagtggtgcgatctcggctcactgcaacctccgcctcc
-tgggctcaagcaatcctcccacctcagtctccctagtagctaggactacaggtgcacacc
-atcatgcccagctaatttttatattttttatagagatggggtttcaccatgttgtccagt
-ctggtctcaaattcctgagatcaagcaacccactggcctcagcctcccaaagtgtgagga
-ttacaggcctgagccaccatgccgggccatcattaatcagctactccagcacttagcagt
-tcagctctctcctgctcagctgagctcctgaTTGTACAGTGGTTAAGAGCAAActgcctc
-tgccacttagtaacctggtgacttgaaaaatcactttgccttttcatcctttggtttctt
-catctgtaaaatgaaaataacaataaacaatacctacttcacagggtggttgttgtgagg
-gtgtagtgagttgatgtatgtaaagcATAACGTAGGTTCCATTGAAGTGTTTGCTATTGT
-GTTCAACAGGGTCCATTTCTGCTTGGAGATCCACATGGCTCTGGGGAGTACCTGTTGGCT
-CAGCCTAGGTCACGTGTTCCACCTTAACCatcccttccctgctccaaggtagagcccgtg
-acctgaactaaaccagcaggcacgctccacctccaacaccggctcaaggtgggcgtgtaa
-tataagctggttcaattagaatgaatcttttttttttttttttaaagacggagtctcatc
-ccccatcacccagactggagagcagtggcacaatctcagctcactgcaacctctgcctcc
-caggttcaagcaattatcctgcttcagcctcctgagtagctgggattacaggtgcctgct
-gccacgcccagctcatttttgtatttttagtagacacagggtgttgccatgttggccagg
-atggtctcgaactcctgacctcaagtgatccacccacctcggcctcccaaagtgctagga
-ttacaggcgtgaaccactgtgcccagcccaattacagtgaatcttaatacactggctgaa
-aattctgggacacagccagtctctctctttccaacaggacatgtacaaggacctgtacaa
-ccctgggagatgctggcatattggggccacaagcagtgctgacctgaagaaaagggcaac
-acctcagaaaacaaagtagataaatagaaaccaagtccttggtgccatcacttgatttct
-ggacaaagcctcacctaagctatttattgacctgagcccttcatagtttaggccaatGTG
-ATTTGGTTGTTTTGTTACCTGTAACCAAGTATCTTAACACAAAGTGGATCTGTGAGTGAC
-CAGAGCCTCTTGGGGGTTGTAGCAATCTAGTAgttggcccagaaaggccaactctgagat
-ggagtgtagggtgcagaatgttgagtaatgagtgctcttggaatcaacaactgaggaaga
-cagaaatatgcaggattgggcacagggagaagttcagctgcagtgcaggcccaagggtag
-ttgcagctgagccttcaggaagttctggagccagagtagcccttctgagttgttccaagC
-ACTGAAGGCCTAGCAAGTTCCAGGGGTATTAAAATCAATAAGCCTGTCAGCCCCGACAAT
-GCCCTCAATAGGTCTGGGCACAGATTGGAGAGAAGCTGGGCTCCCACTGCACCAGGAGGG
-AGTGGCCCAGAGCCACTGAGCCATGGAGACTCAGGCAGGGGGTTGCTCCAGCACTTCTTC
-TGGAGAAGTTTTGAGCCCCAGATGCAGTTAGCACAGTTGCCCGCCCCTTATCATAAGACG
-AAGTCCGTTCCCACCACATCTTCTGCAAGACCTAGCTGGGGACCCCGAGACACTGGCAAA
-AAAGCAAATGTAAATCCAGCTTTATTGGTAAAAAAGGAATAGCAGATTTAATCAGAAATT
-CCCACCTGGCCCAGCAGCACCAACCAGAAAGAAGGGAAGAAGAGAGGAAAAAACCACAgg
-aagaaagaaaggagggagggagggagaggaggaaggaaggaggagggaagggaagggggg
-aagaagggagggagggagggagggaaagaaagagggaggaagggCAGAGGGAGCAGGGAG
-ACTGTAGATCAGGGTCTGAATGGAGATCCGGTCCTGGAAGTAAATGATCCAAGGCTCCAG
-GTGCTGGGAAGAGAGCAGGAGGGGAGGGCGGCCCATGGCACTGCCATCTAGAAGGGTAGT
-GGCTCTTCCACAGGAATGTTGAGGATGACATCCATGTCTGGGGTGCACCTGGTGGGAGGC
-AGCACAGAAGGCCATGAGAGACCAGAGGTGGCGGTGTGGGAGCACCCACTCAGAGGAGCC
-CTGCTCTTTAGAACTCTGGTACGTACTTGGGTTGGGGGGCAATCCCAAAATACAATCTGT
-GATCTATCTGTGACCTCAAAGCCCAACTGTGcatacacaagcatacacacacacacacac
-acacacacacacacacacacatacacacacaTCAAAAATGGAAAAGAAATGAGTTTGGCA
-GGACAAATGTTCCCCTGACAAGTCTGAGGTCAAGAGGGAGCAGGAACTCAGCTCTGAAAT
-GCTGAGGGCCCTCAAGATgatcactggctttggagtgaggatgacaggtttgataacttt
-gacctgtgtcaccttgagcaagctatttctactctcccagcctcactccttcagttgGCA
-CTTAAGTGAAAAGCACTCATTAAGTCCCAGACCCCAAGtgagcctcagtttcctcatctg
-tcaaatgggtttaatattctaacctcagtcattggtggaaagattaaatgagaccatgcc
-agcaggtaataagtgctcagtaaatgacaggcaTTATTATTTCCATGAAAGTAGCAAGAG
-AGATGGATTCCCATCAGCAATATATTCCCCATTGCAGGGACCAGCACAAATATTTAAGAG
-GCTGAAGGATTACATTCTGTTTCACTCTCTTTTCTCTCTTCCAAGGAGACCATCCTCTCT
-CATGGTTTCAATAATCTGCTGATACACATGAAGTATTTAGGCAGGAAATGTCAGGATACT
-TGCAATTTACAAATACTATTAAAAAAATGAACatgaaaccaacatagaaaaaaaaaaaat
-ttctaaatctagatgggcaaaactggctattcattatatcattctctcttctttatattt
-gaaatttttcataataatagtaaaaaaaaaaaGTTcatctctatgctggcaacacctaaa
-tttctacttccagccaatatctgtcctctgaggtctacactcatcttgtcaattgcccac
-ccaatgactccaccttggcacctcatataaatcaaacttactgtccaagtcaactgtatg
-gtttttgttttgttttgttttgtttgagacatggtctcactcggtcacccaggctggaat
-gcagtggtgcaatcacagctcactgcagcctggaactcctcaatcgatcctcctgcctcc
-caaatagctgggaccacaggcacgtgccaccacatctggctaattttttaattttttgta
-gagatggaggtctcactatgttgtccccctggtctcgaactcccagcctcaagcgatcct
-tcttcctcatcctcctaaagcactgggattacaggtgtgagccaccatgcctgcctccaa
-ataaactttttgactgtgcctacatacacatccctcaccccgccccagccttcccaatct
-ctgcatttgacatcaccaccaccccattataaaagtcaggaacccaggggttattcttga
-tacctccctttcctgtacttcccaagtcatgcaagtccttcttactttcctaaatatttc
-tccaatctatctatttctcccatttcttctgccacactcttggccaggccacttcccatg
-ttcccctggacaactgccctcacacccactagaattccagctgccattctggctccttgc
-caatctcatccccatgctcttttcttttcttttaagaaagagtcttgctctattaagcag
-gctggaaggcagtagcaccatcttggctcactacaacctctgtctctagggctcaagcaa
-tcctcctgccttagccttcactgcagctgggactacaggcgcacgccaccacgcctggct
-aacttttgtattttttgtagagatggggtttcaccatgttgcccaagctggtcttgaact
-cctgggctcaagcaatcctcccaccttggcctcccaaaacgctgagattacaggcatgag
-ccaccacacccagcccaccatgctcttttcaaactgacttttttggaatacaaatctgat
-catgtggcttaagatcctttgcttctgggatcaggcagaacatctgggcctacagggcac
-tgcatggaggtccctaggggctgagttgccctgctcccttcccgccactctccctgtcac
-tctgcattccaaccactctggcctcactcagctccgtgtcaatgccaagttccttccaac
-catagctccttcacaGCTCAAGGCTCAACATGTGGTtggttcatagagcagtaacataag
-catcaccgggtagcttcttagaaatgcagaatcAggctgggcatggtggttcacacctgt
-aatcccagcactttgggaggccaaggcaggcagatcacttgaggtcaggagtttgagacc
-agcctggccaacatggcaaaaccccgtttctactaaaaaacataaaaattagccaggcat
-ggtggtgcacacctgtaatcccagctactcgggaggctgagacaagagaatcacttgaac
-ccaggaggcggaggttgcagtgagctgagatggtgccagtgcactccagcctgggagaca
-gagctagactctgtctcaagaagaaggaaggaagaaaggaaggaagggagggagggaggg
-agggagggagggagggaggggaaagaaagaaagaaggaagaaagaaaaagaaagaaaaga
-gaaagacagagagagaaagaaagaaagaaaaagaaaagagagaaaggaaggaatgaagga
-aggaaagaaagaaaagaaaagaaaaaagaaatgtagattcatgagccccactgagaccta
-ctgacttggaatctgctttttaacgcgatctccaggtgtttcctgggcatgttccagttg
-gagaggcTCTGCTTAACAGTGTGCCATTTCTACTTTTTAGGAGGGAAAATGTGCTTCCTT
-GCTCCTGGTGTTCCCTTCCACGTGGAAGGGCATCCATGAGTGTATTGCTCCTGGCCTCTC
-TCTGCCCCCTTAAATTCTGCTTTTGGAAAGGGGGTATGACCACCAGAATGGTGAGTGTGA
-GGAGAGGAAGGGGACACAGGGAGCCCAGTCCCTTTCTCTCTCAGCAGCAAGAAACCCGAA
-AGGACTCCACTCTTCTCTGCCCCAAGGCCTGGCTCCACGTGGGTCCAGCTCCACCATGAT
-CGGGTGGTTCAATTTGCCTAATTCTGGGTTCACTATTCAGAGGCCAACACAGTCTCTAAA
-ATCAGCTTTACCAGAATAAAGGTGATAACCTGGCCCACATGCACCTTACCCCTTTCAGTC
-TCATTCACTGTGTTCAGAGTTCAGGTAAAGACAAGTGACTATTTATTACGTCCCCCGGAG
-ACCCTGGCAccaccgcctagaattgctcttccttcagctcccccatcagtctctttcacc
-tagtgaatttctatgcatccttcaagcctcagttcaaatgtcacatcctcaggaaaacct
-tccttgactgcccagacTTGCTGTCCTAACAGTTGCtttcttttttcttttttttttaat
-taaaaaaaaatttttttttagatggagtctcgctctgtcacccagactggaatgcagtgg
-cacaatctcggctgaccgcaacctccgccttccaggttcaagcaattctctgcctcagcc
-tcccgagtagctgggattacaggcacccgccaccatgcccagctagtttttgtattttta
-gtagagacagggtttcatcatcttggccaggctggtcttgaactcctgacctcgtgatcc
-accggccttggcctcccaaattgctgggattacaggcgtgagccactgcacccagctCCT
-AAGAGTCACTTTTGCAGTGGCATGTACTCTACTCAGCAGCTCTGGGCTCTGCTGCAACTC
-CACATTTATTTGTGGCTCATTATCGACTCATGTCCAGTTCCCTCTTTAGTTCCATGAGGG
-CGGGACCAAGGACTGTTCTCATTCACATGGTGCCTGGCATTCAGAGGCACTTCATAAATC
-CAATAGTATTTTGTTTTGGGGGCGGGGGGCGGTTTagaaatagaagaaaaggaagaaatg
-gcgataggagaggagaaggaaggaaaacgacaggagggagagacagatgaagaagaaaaa
-TTAAAGAATTTGCAAATGCTAGGCTCTGCCACACATGGTCCTGTGGTGTCATCAAGGAGA
-GGTAAGCCTGGGGGACCCCCAACCCAACCGCAGAGGGCTTGCCCCAAGGAAGGGCAGGCA
-AAGAATTGGTTTCTGGGGCCCAGAAACCTGCCAAGTGAACAGGACAGACTTCTCTCCTTG
-TAGAGTGTCTTCCAGGCTATTCTTCCCTGAAGCCAACCACCCCACTCAACTCTGCCTTCC
-TCAAAAACCCAGAAGTGGAAGGCTGTACCCACTTGGTTGACAcatgggatctgggaacta
-gaagggcccttagagattacaccacccagcctgctgtgtacagatgggaattggaggcct
-ttgcagagatgggaaaggtcacatctgcccctggtcagtggcagatccaaggtggaaacc
-caggaccgcccctccctccctgtacagggttctgccatccacACCAGGCTGCCTTCCCCA
-AGAACAGAGAGCCTCCGTGAGCTCAGAGTGTGACTGGTTTAAGAGGCAGTGGCAAAAAGA
-TCACATACTTGGGTCTCCGAAGCAGAACATCCTCAAATATGACCTCTCGGGGTTCCCGGG
-TCTGGGCTTGGAGCTCTTCCACCTCGGCCCTTAATACAGGCATGTTCTCCTCAAACTGGT
-CAATAATCTGAGAGGAAAGGCACAGCAGGGGAGAAGGGAGAGGCAAATGGCCCCCAACCA
-AAGGGAGAAAGGCCAAAATGAACGAGGAGCAAAGCTATCTGGGGAAATGGTATGGGTTCT
-GTCACTGGGACTTGCTGGACTCCAGGGAGGGGACTTCCCCATGCAAGGTGCGGCTGGCTT
-CCAAGTTAGTGACAATATTCAGTGGTGCTGAAACAGGTGAGGGATCATGGAGAATGGAGA
-CAGGTTACAAAGTGGCGGGGAATGCTCAATCATGGGAATGAATGGAGGCTGGCAGAGATA
-GTGAAGGGCATACACATTAAAAACCAGTGAAGAGGCAAGATAATGAAAATTAATTCAAGA
-AGGCAGTGATGGTGAAGTTCATTAACACTGATAATGGGTGGTGGGCAGTAACAAGAATCA
-AGGGGTAAAGATGCACGGTGGTTAATGGCTGAATAGGTGATGTTTGGTGATGGTTGTAAA
-TGGGTCATTAGCCAGCATTGCTGGCTAATGAGGCAAGGCCTAGGTCAGTGCCAATCGCCT
-TCCCAGATGAAAGACAAGTGACAGTAATGGCACCGGCAAGGAGGGAGGCCAACACCAGAG
-TCAGAGACCTCCTGAGCGCCAGATCAGGAGAAGCCTGACTCATTCCCACAGGCCGTGGGG
-ACTGCCCATCCACTGCTTCCCTACAGGGACCACCACCTTCCTTGCCCACGCACTTCTCTG
-AACCTTTGCATGCATTTCAGGAAGTCCTGGCTTTCCCACATCTTCTGTAGGAGAGCCTCT
-TCATAGGGACGCTGGGTTTCCTGTGGAGGAAGAAGAGGTCTGGCCCCCAGGTGCCTCTTC
-CTGGGCAGCAGAACATGGTAGAGACCGATGGGGCTGCAGTGGGCCTGGAGGCAGAGGATG
-GGGAAGAGGGCGGGGTGGGGGTGAGACCTGGATCCCCGCTCCCACACAGCAACTGGCTAC
-TCACCGCCACCACAGAACTCAGAATTTTTTTCTTCTTCTTCTGAATCTTGTCAGACAAGG
-ATTCCAGGACCTTTCTGCGCATCTCACCGAGGTCATCCAGCTCATCCTGGGAGCCAGCAG
-AAGGGTGTTGGTCACCAGTCCTGCCTCCCACACAGTCTGGTGGGAGAGGGGCAGGGGCTC
-CCCTACCTGCTGGCTGTCCTTAACCTGCTGCAGCTGGCGCATAAGAGTGGAGATCTGGAC
-AGACTTGATGGAATACTCATGGTCCATGTAAGTGCTCAGGAAGTTCACTTCCTCCTGGGT
-CTTCTCAATCTTGGCATTCAGCTGCTCTGCCTGCTGCTCAAGATCTGGGGAGGGGTTAGG
-GAGGTCAGCAGGGACAGGAGGCAAGACCTTCCCTCAAGCACCTGGGCCCCAGGAGGCCCA
-GGAGGCAAGGTCTCCTTGGCCAGTAACTGGGGTCTGGGCTGAGGTGAGCTCACACAGGGC
-TGGGAGGTGGTTAAAAGTTAAGGCTCTAGACGGTTTTCCACCCCTGCAGGAGAAGAGGCA
-ATgctgggtaggaaaaaggaagggaattggtgcatgatccctagactagtccccactctg
-ccactgacttgccgggtggctctcgccaagactgtccctctccagacttcagtctcctca
-GAGACACACTCAAGGAAGTGAGACCAGGCAGATGGGGTGACAGTGGCTCCCAAGACACAA
-CCCATGGCAGGATTAAGACAAAGTCTATCCTGTCTTCCTCCAGAGAGACCCCCAATGTCT
-GGGGTTGACTGATCCACCACCCCTCTGCTCAGCAGGTGTGTAGTCTGCTCAGGGAAAAGG
-AACCACAGGCCAGGCAGGAtggaagccaggagacccaggttctagcccagccactgactc
-ccagaaggaccttggCAGGAAACAgagccaggctaggattggattctggctcctagctat
-ataaccttccacaagctactgcacctctcttagcctcggtttcctcatctgtaaaatggg
-aggacagcttccctgcctccaagtagttgcaatgactgagtgtgtgcctgtaaCAATGCA
-GACATTGGTAGAGACCCAGATACGGGGCCTGGAAAGAGCTAAGTGTTGGGTAACTATGCT
-ATTCGCTCTGTATCTTAGCATTCCCATCTGCCAAGAAGAGAGCCAATGGGGCTGAGGGTT
-TCTGAATGGCAAGTACAAGGTGAATGCTCTGCTGCTGACCTCCCCAAGGTGCCAGGGGGG
-AGGGTCAAGGAATTTGCCAGGGATTCTTACAGCTCATCTTGCATTTCTTCTTTTCTTCCC
-ACTCCTGAAGCTCAGATTTCAATTGCTGCAGCCTCTTCTTGTTTGAGTACTCCAAGATGT
-CGATGATGGTCTGCGGGAGGGGTGGAGTCAACTCACCCACAGGCTCTGCTGGCTCTCAGA
-GGCGGCCACCCAGCACTTCCTCAGAGGAGTCCCCAGTCCCAACCTCACTCCCAGAAACCT
-GACCAGAGGCTaatcgggacagtaacagtgtccacccatagggttgttgtaaggactata
-taaagacatacagatcgcttGCTATTACACGTAGAGGTGTTTGCAAATGCTGTTGGTGGT
-AGCAGCGACCTCTGTCGCACCGGTACAGTATGTGCCCGGTGAACCCCCTCTGGGACGGGT
-GCTATGGTGCCGCATTTCACAGAGCTCGGGGAGGCAAAGTTAACTAAAAGTCTCCCGGCC
-AGTGAGTGCTGGCGCGCTGGGATGAAACCCATCTCGGTCCTCTTGCAAAGCCCAGGTGAG
-GGGAGTGAAGGGTGAAGAAATGCGTCTTCCAGGTGGAGGAAGCACCACGTGCAGTGGGCG
-GGGAAAGGCAGGAGAGGGCGCGCGAGTGCGcggagggagggcgggacggagggagggagg
-gcgggacggagggagggagggagggacggagggcgggacggcgggagggcgggacggagg
-gacggagggagggcgggacggagggcgggagggcgggacggagggagggagggagggagg
-gacggagggcgggacggagggacggagggagggagggagggacggaggttgggacggagg
-gacggagggCGGGCGGATGCCGCGGGTCTCACCGCCAGGGTGTCCTGCTGCTGCAGCAGG
-GCCCGCACGTGCAGGGTCGTGCTGTTCTCCATCTCCTGGATGGTCTCGATCAGCTCCCGG
-TTGAGCTTGCTGAGGAAGTTCTCACGGCTTCGGAGCTCTCGCAGAGCGGCCCTCCCGCTC
-CTGAGCGAGGTCTGCGGGCGGAGGGAAGAGCAGAGAGGCGGCGCTGCGCCCTGCCCGGCC
-TGAGCCCCCGAAAGCCCGTGGAcccgccgccccggccccgccagacgcccgcccccgTGC
-GGCCTCCTGCTGGTAAACGCGGCCCAAGCTGGGCGGTTCCCCATTGTCTGCGCCGCCCGG
-GAGCTCCGGGACtctcatccgttcggaaacgcacgtgtacccatcatctcacatccctga
-ggtgcgggtgcatctacagttggtggcgtgtcaccaactaatcaacaaatatattattag
-tgggtaaataaagatgtgccttcatatcaatggcttctcagaatcaatgaaatatagAAA
-TAATAGTAAGggccgggcggggtggctcacgtctataatcccagcactttgggaggccaa
-ggtgggccgatcacgaggtcaagagttcgagaccagcctgaccaacatggtgaaaccccg
-tctccactaaaaatacaaaaattagccgagcgtggtggcgcgtgcctgtaatgccagcta
-ctggggaggctgaggcaggagaatcgcttgaacctgggaggcggaggttgcagtgagcga
-gatggcgccactgctctccagcctgggcgacagaggaagattccTGTCCCaataataata
-ataataataaACGCCCCAGGTAGGTTAAGAAGGTGGCAGAGCGACCGCCATGTCTGGAGG
-AGAAGCAGGGGAGGCAAAATGGATGATAAACGTCAGCATTTCCGGGCAGGCCGCGGAGTC
-AATGAGTACTCTCATTTCACACAACAGCCCCCAGTGGAACAAGgagggtctgagggttaa
-gtgactcgcctaaggttacacccagcaggtgcataaaaccTACAGTAACAACAACAACAA
-CAATTGTACTTCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAATAACA
-ACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAAT
-AACAACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTaa
-caataacaacaacaattgctgagggccctctacatgccaggccaggtgctgtgccttgct
-ctgcaggtggcacatggtatctgttcaccctccaacagctttatgtttactaactctatt
-ttgctgataaatggaggctcagagagtttaatgacttgcccagtgtcacacagtcaagaa
-gtggcagggctggaactggaaagccagacttctgaatcccaatgtctgtctttccgttat
-gctaAAACAAGAACTGAGTAGCCTTAAAACTGCAAGGCATGGCTGAACCAcgtagtgact
-aagacttggatgttgaacctagacacaccttggttcaaatcccagctcagccacttacca
-tctaagagaatctgggcaagttagttaatgtctcagagcctccttatactcattctaaag
-gtaaggaaactagtatctgttttagagaactgccgtaaaatataaatgagATTggacagg
-tgcggtgactcacgcctgtaatcccaacactttgcgaggcccagatgggaggatcactca
-aggccaggagttcaagaccagcctgggcaacatagtgagacctcatttctacaaaaagta
-aacaaaattcgctgggtgtggtggtgtacacctacagtcctagctactcaggagtctgag
-gtgggaggaatgtttgagcccagaagatcgaggctgcagtaagtcaagattatgccacca
-cactccagcccgggtaacacagcaagaacttgtctctaaaagtaaataaataaataaata
-aataCAATTTTaaaaaattaaaatgttcgctgggcatggtggtgtgcacctatagtccta
-gctacttgggaggctgaggcaggaggatctcttgagcccaggagtttacggctgcagtga
-gctatgattatgccatttcactttagcctgggtgacagagcaagaccctgtctttaaaTT
-CACAATCAAGCCACTTAGTGAGAGTGCACTCATGTGCACTCAGTGAACAATAGCTGATAC
-TACTGTCTCTGGCTCTAACCCTCTACCCCTGCCATAAATATTTGCTCTTTCATTTGTTCC
-TGTACTTCCTCATTTCTCCGTCCTTTACTAAAAACGACCCCTTCCTAGCCCTCAGCTCCT
-TTATTTCTCATATaacagtaatcatgctgatgtgctgagtgcttgccatgtggctgatac
-tgtactaagcacttcatgcgcactgcagcacatcaccctcacagcaagactaagagatgg
-gcactattattaggccaactttataaaagtggacagcagtcgggcacagtggttcacacc
-tgtaatcccagcactttggaagagcaaggtggaaggactacttgagcccaggagttagag
-ccctgggcaacaaagggagatcccatctctacgaaaattagctgggcatgatagtgcatg
-tctatagtcccaactactccgagaggctgaggtgggaggatcacctgggctcggaaggtc
-caggctgcagtgagccatgatcatgccactgcgctccagcctggatgacacagcgagacc
-ctgtctcaatcagtcaatgtggacagcaaggattaaattcagtaacttattcaaggtcac
-acatagcagagctgTCATCCTTGAAGTCTTGCCTCCTAGCCACTCCACTACCTTGTCTCC
-ACATCTCCAGACCAAAATACCCAGAAGTATCTTGTGAAAAATGTTATTCTCCAAGTCCTG
-GGCCCACTGAAACAGCAGCACTAGggtttcagttcaaatgtcacccaccttagcagcctc
-tcgttagcacctaaacaattactgccacactctcctccgtgcctccagccccctaacctt
-attcttaggcttctctttagctcttatcatcatttcaaatatctttctcttgttgattgt
-cagtctcccccatccaatagaatggaagtcccctaagatcagaggtcacattactggtga
-accctcatactcagaatagaacctggcacatggtaggtgctcaatcaatatttgttgatt
-cattaaatgaatGAAAGATTGCAAGAGACAGTATTAAGAACTGGACtggttaggagcaca
-agttttagagccaaattgtccacgttcAGCTTCTACATCAATCAAAAACACCTAAACCCC
-TCTAAAGTTAGGATAAAAATAACAGAAATggctggaagcggtggctcacacctataatcc
-cagcactttgggaggccaaggcgggcagatcacctaaggtcaggagttggagaccagcct
-ggccaatatggtgaaaccccatctctactaacaatacaaaaaattagctgggcgtggtgg
-tgggcgcctgtaatcccaggtactcaggaggctgaggcaggagactcactcaaacctggg
-aggtggaggttgcagtgacctgagatcttgccactgcactccagcctgggtgacggagtg
-aaactctgtctcaaaaaaaaaTTTTTTTAAAAACTAAGAGAAATATGAGTTCCTCCTTTA
-AGAATACTGGGCTACCTCTAAACCATTTTGCAAGATAAAAGGTTAAAGGGGAAAAAAAGG
-TTTCAAAGCAAATTATATTTTCCCTTGTTCTTTATATAGTAGTCATTGTTCATTGAGCTA
-TTAAAAATTTTCTTGAAGAATTATTCTATAGTATTTTGTAGTCTTTATAATACTTAGTAT
-TTTACTTTCTGCTATGTATGCTAAGGACTTGTCTTCCTTTAGGCATTTCAAATACTTTGA
-GACATTGTTCAGATAATTACAGAAGCCATAAAACAATGTATAGCGAGGAAATTAATTACC
-TACAATTGTAGCGATTGATGTGAAAATTTTCATTGTCAGTTTCTAAGGCTTGCTTCAAAG
-TACACTGTAAGAAAATTTAATTTACTGGAAttttttttttttgagatgaagtctcactct
-gtctcccaggctggagtgcagtggcaccatctcagctcactgcaacctctgcctcccagg
-ttcaagccggtctcctgcctcagcctcccgagtagctgggactacaggtgcgtgctacca
-cacccagctaatttttgtagtttgagtagaaacggggtttcaccacgttggccaggctgg
-tctcgaactcctgacgtcaaatgatccacccacctagacctcccaaagtgctgggattat
-aggcatgagccaccacacccggccAAGTTGCTGCAAATTTTAAGATAAATAAGCCACTAG
-ATCGTGTTCCTAATGCAACAAAATAACAAGCAATTCTGATTATTTCTTGAGTCTTAAACA
-GAACAGCAAACGCTTTGTTTAActggctttgacccctgatcctgccatttcctggctgtg
-tgacctggtgcatgtcatttatctccctgcgcctcagtttcccggtttgtaaaataggaa
-caaggataagcgtgctcacacagttcctgtgaggaagaaatgagtcaagtctggcaccca
-caaagttctcagcacatgtttgctacaGCCATCATCCCCGTCCCTGTCCTGGGCCCAGTG
-TCCAGGGAAGATGTGCCTCATACCTTCATTAACCAGATTTTGGCATGCATCTTCCCAGGG
-TCCAACTTCCGCCTTCTATGTAGTTCTCTTGGATTCTTCGGCTGGCAGCTTGTCACCACC
-GTAGTGGGCTTGAAGTGAAACACTAGGGGTAGACAGGAAAGGACAGGGAGAGAGTGAGGG
-TCCCGGAAGGCCTGAGGCCAGGTTCCCGGGAGTGCACCATTAATGAGAGGAGGGCCAGAC
-CCCAGCTCCACCCTCTGACTGCCTTATAATGTGACACTAGACCGAGGGTGAAATTCACAC
-CCTTCACTAAGCTCCCAGGACAGACTCTGGGCCTCAATATGAGGGAGGGACAAGCCCAGG
-TGAAAGCAGTAACTATGGACATGGACAGAGGGGAGGGCAGGGCAGCCAGGAACCCCGCTC
-TCAAATGTCCAGTCAGAAAGAGAGTCGGGAACTCCCACTCCTTGTGTCTTTCCAGTAGCT
-ACTgcagcacaggacagcagaaagaccagagtctggcaggcctgaatccaaatccctgct
-gtcccaccaacctggctgGCAGAAGGCCTGatggggtaggggttaagagcaagaactaat
-gagccagacagtccaagtttaaatccaggctctTggccaggcatggcggctcacgcctgt
-aatctcaacactttgggaggccaaggcgggcggatcacctgtggtcaacagttcaagatc
-agcctggccaacatggtgaaaccctgtctctattaaaaatacaaaaaatgagatggacat
-gatgatgggcgcctgtaatcccagctacttgggaggctgaggcaagagaatcgtttgaac
-tcgggaggcggaggttgcagtggtgcgagatcccgccactgcactccagcctgggtgaca
-gagactctatctcaaaaaatatatataatcataaaaataaatttttaaaaattccaggtt
-ctgccttctactagctgcgtgaccttgagcaagtcaaatgacctctgtgtccctccattc
-gtccacctataaaatgggaataatcatcacgcccacctcatagagtcttcctgaagatga
-aagaagttactataccttaaaggtgtttggaatagtgcctgatgcatattcagtgctgga
-tacacattaccagttgttactCTTACTTCTAGTGACCTGAGAAGTGGGACCACAACACCA
-GACGAAGGCACAGCAGCCACGCAAAACTCCAACTGGCTGTCTCTGAAACACTCTAAGGGC
-TGTGGTTCTGCCAGATAAGAGTACAGGCATTTGGGGGGCATATTCTCAGAATCCCTGTTT
-CCTCTCTGCCTGTCGTGCAATGACATGGGACAAATCGCCCAGGTGGATCCAGCTGTACTC
-TCAGTCCTCACCAAAATCCCTGCTTCAGGTACAACCCAGCTCATCTGGGAGAGATACTAA
-TCTCTTTAATAGATCAATGTCCTTCATCCTGAGAAATGCTGGCATTAACTATGGAGATGA
-TTAAGTAAATTAATTTTGTGTTTAATTTATAAATTACCTGTATATATCCGGTTTTTAGTT
-GTATTGTATAAGAGATAGAATGATTAATAGGTTAATCTTGTGATTCTAATTTTAAAAGTG
-TAAGTGGGATTTTGATTTAGATTTAAGTTGAAAGGTTTAATACACTCTTATTAGCTCCgt
-tgcccaggctggtgttcaatggcgagatctcggctcactgctacttctgcctcccagatt
-caagcaattctcctgcctcagcctcctgaatagctgggataacaggtgcccgccaccaca
-cccagctaattttttaatttttagtagagatgcggttttgccatgttggccaggctggtc
-ctgacctcaggggatccacctgcctcagcctcccaaagtgctgggattacaggtgtgagc
-caccgcgcccggccAGATTACCCATATTTAGAAGTTTAAGTATTAGATATACAAGAATTA
-TGTAAATACCCAATGGTTTTTGTTAATCAGACAAGTGAACCATTTGAAAATGAAAATGAA
-TACGTTAAAATTTAAGATGTGGCTTAAAAGGTTTAGGAGAATTTAATTAACCAAGTTCCA
-AAACCCCCTTACAAGTGTTTATAAAAATTGTAAGATTCTTAAGTTGAATTTAAATGCTTA
-AGGAAGATTTGCAGTTTTAATAATGAGGATTTATTTTCATTATTGGTAGTAGCCCTAATT
-TATCtttttttaaattaaatcttttattacaagatagttcagattcacaagcagttttaa
-gaaataatacggagGggctggccgtggtggctcacgcctgtaatcccagcactttgggag
-gctgaggcatgtggatcacctgaggttaggagttcaagatcagcctggcgaacatggtga
-aaccccatctctactaaaaatacaaaatttagccaggtgtggtggtgcacgcctgtaatc
-ccagctacttgggaggctgaggcaggggaatcgcttgaacccgggagttggaggttacag
-tgagctgagatcacaccactgtactccagcctgggtaagagagacagagagagagagaga
-ctctgtctgaaaaaaaggaaaggaaaggagaggagaggagaggggaggggaagggagggg
-agaggaAAAGGAAAAGAAAAAGAAAAAGAaaaagaaaggaaagaaaaggaaacagaggta
-gtctatgtaccctttacccagtttctcccagtggcaacatcctgcaaaagtacggtacaa
-tatcacaaccaggatattgacattaagatgagcaagatataggactttcccataaccaca
-aggatcctgcctgtcgccttctacaaccacacccacttccctccccttaccaccctcctc
-acaactctgtccctaacccctgcaatcactaatctgctctccatttctataattttgtga
-tccccagaaggttatataaatggaatcatccagtatgtaactgtggggattggctttttt
-ttacttggcataattctctggagattcatccaagttgttgaatatatcaatagttctttc
-ctgtttatcgctgtatagttttccacggtggggatacaccataggttgtttaaacattca
-cccactgagggacttcaaggttgtttccagttttgaggaattatgaacgaggctgctatg
-aacattcacatactggcttttgtgtgaatataagttttcatttctctggaataaatgccc
-aagagtaaaactgctgggtcggattactaggaagtgcatgtttcatgttgttagaaatgg
-ccacacttgtttccagagaggctgcatcattttaccttcccaccagcaattgcgcacaat
-ctgacgtctcctctttgctagcatttggtgttatcactatttttttattttagccatttc
-gataggtgtgcagtgatatctcactgtggcttaatttgcattgccccaatggctaatgat
-gttgaacatctttttaatgtgcttatctgacatctgtatatctgctttggtgaaatgtct
-cttcatgtctttttcccattgcctaactgaattgtctgtttcactgttgagtttttactg
-ttactgatatattctacatagtagtcctttgtcagatacatggtttgcaaatattttctc
-caagtctatagcttgtcttttcatcctcctaaaaaggtctttcataaggccaggtgcagt
-ggctctcacctataatcccagcactttgggaggctgaggcgggcagattacttgaggtca
-caagttcgagaccagcctgtctctactaaaaatacaaaaattagccaggcatggtggcac
-acgccttcagtcccagctactcgggaggctaaggcaggagaatcgcttgaacccgggaga
-cagagtttgcagtgagctgagatcgcaccactgcaccctggcctgagcaacaaagcgaga
-ctccttctcaaaaaaaaaaaaaaaaaaaaaagtctttcacagaacaaaatttttaatttt
-gatgcagtccaattcatctatttttcttttatgggtcaagcttttggtgtgatacctaag
-aactcttcacttggccctaggccccaaagatttttctctcctgttttcttctaaaagttt
-ttcagtttcacattttacatttaatttctattttattttatctttgagctaatttttata
-ttcgttgttaaatcatttctttctttttctttttctttttttttttttttttttttttgc
-ctatgggtgtccaattgctccagcgccacccatggaaaaggctttcttcctccactgaat
-tgtttttccactttctgaaaaacccattgggaatattggtatggatttattccCTTTTCC
-TCACTGGGAAGTGTTGGCAGTGTCCAGCAGGTAGCTGATCCTTCATTCCCTGCTTGGTGG
-TGCTGATTccccaactgggatagtgctggcagggatgagtggggaggtcatcttctaacc
-cccacctggcagaagacagtgctctgactctctctctagggtagtgtcaacagagtctag
-cagtgacaagatttcatgaagtgtcatgaggtgggactcatcacctctgggcttcactcc
-cctcccccagcctacctatgtcagtagagcctggtgggagcctgagcctctatccccacc
-cagcatcagtgaggtAAAATAAGGTAGTGAGATGCAGGGCAACTTGGCATTCTACTCTCC
-CATCTCCTTTCTGTGTTTCAGTGTTGCCCACAGGGGAGCTGATCTAACATTACTTACTCA
-GAGGCAATGAGGTGGTATGAGTGATTTTATACATAGAtgtatacataagtatgctagatt
-gtctatgaagttcatttcaggataccaaagaaatattacaaaatatttgttattaattct
-cacaacaatcctaggtggtattagtgtccccatttcacaaatgagaaaaccaaggctcag
-agagatgaatgatttttccaagtgagtaaatggcagagccaaaatctgaccccatgtctg
-cctgagcctgacccaaggccTCGGAACTCCCCTGTAAAGCATGATAATGAtgtggcagag
-tttattctacgatttcaccaaaccttgttttcttttcctcctggaaaaacagatggacta
-catttcccaccttcccttgtggttagcagaggtcatgtggctaaattatggcccctgaaa
-catgagtaggagtaacatttgtcacttcaaatctggaccccccccaaaaaaaatgcccac
-ataattgtccatgttcttgttctctctcttccctctatgccagctggatgcaaaagtatc
-cagcagaagacttcaagaccttacaaaatatcagacccacaaggtcaaaggaacctggat
-ccctgaatgaccatgtggaacagaatccctccttcctcagatccacaaatgtactgtggc
-ataaatgagatataaacttctatatcaatacttgcaatttgggcattgtttattacatca
-gttagcctaccctaaTATAAGTGGTGTCACCAAGAGCCAAAAGCAGCCACTCTATCCTGT
-CTCCAACCCCCACACCAGCTCCCAGGTGCCTCCGCCCACCTGGTTGGACCCTAGTCAAAG
-TCTTCATTTTGCTTGTATGAAGGCTGTTGGCTTGTTGGACTGGAGGCAGAGTAGATGGCT
-TGGTTTCCTGCTTGGACTGCTGCCATGGAACATAATCCTACAAAATATACAATCagtcac
-atagcaccatgagtttatatcccagctctacccttttcagatatctgtgaccccaagcaa
-gtgacttgacctctcctgagcctcaatcttctcatctgtaaagtggatctaataataaaa
-cctacttctgtggattggcgcaagaattctgagagatatttatgaagcatgtggtaagtg
-ctccataaatgttagctatcactTTTTTAAATCAGCCAGCCAGAATTTACTAAGCACATC
-CAGGCTGTGAGGTGCTAAGAACTGTGAGAAACAGAAGGCATGGAAAAGACGCAGACATCC
-ACCCTCAGGAAACCAGAGCAGCAATCAGATGAATAAGAGAGCAGCATAATATACCCTTAC
-ATTCTGATAAGACAGTGagaggagaaaaatgaggttctgaggcttgctctgggtcccaca
-gcaaagtgtgacccggctgggactggaattcgggtctccagcctATATCCGCGGAGCAGT
-CACGACCGTGAGAGTGGAGAGCAGGTGGACTGCAGGGCCAGCGAGCCTCCCACCCCAGCC
-CTAGTCCCCCAAGACTCACCGGAACCTGGAACTCCTGGACTATGGAGTGAGTCCCAGAGT
-GCTTGGGTCTGGAAAGAGTTGGGAAGGGAAAGAACTTCCATTATCCCCAGCCCAAGGGGC
-AGCAAGCAGCAATTCGAAACAGGATTGGAGTCTCGAACCAGAAACTGCAGTTTACCGGGG
-ACAATAGCCCCGCGGGAGTGGGGCGGGGCCAAGGAGATGTGGGCGGGGAGAGGACGGGGG
-TCAGAAGACCGAGGGCGACCTCGAGGCGAGGGCGGGACAGCGGCGGGGTGTGAAGTACGC
-ATGCGTATTCCGCCTTTCTTCCAAtttttttttttttttttttttACCTACTTTTGTAAG
-ACATGCGCCATTGGGGAAAATGGAAGAGAAGTTGCGAGTCTGTGAGACCCTGATCTTCTG
-GTATAACTACTCGGCTTTTCCAACTTCCTTGTCTCAGTGTAGATCGCGCGGTAACCCAGG
-CCACTCAGAAGTCCCGAGACCCGATGCTTTCGCCAGCGTCTCGGTCTCCAAGGAAACGCG
-ACGCCGCCTACCGAGCGCCTAAAGGGACTAACCTCTCAAGGCAAAATCTAGTTCGGCCCG
-CTTTTCAATTTTCAAAttcccttcagtttgctctgcccataatcctaaaatatgatatca
-tatttctccactctcatcaaacttccaccatttccttcgccatcttcactcttggctaat
-gagtttgcttccaattttactaagaaaattgtgggaatcagtaaacccacaagttcatgg
-catcatttactcgcctacttgcctccctcccgtaactacgtataaactgcctactaagac
-caattcctacatttatgcaccgaatcctatcctctcacgttttctcaaagatattggccg
-agcagttctccccgttttttcctcctcttttctctctcctttgtatcatcagtataccaa
-cgtatttttaaatttcttctatttaaaaagattgtccacagccggacacggtggctcatg
-catataagcatgagagcactttgggaggccagaggtgggaagatcgcttgagccagaaag
-gtccagtctgcagtgagccacgatccagccactgcattccagcctggttgacagagcaag
-accctatctctaaataaataaacaaaccacttcccctccagccagctcccatttctgctt
-cattttaaagcaaaactcctagagaggtttgcctactctgtttcccatttttttccctcc
-tctcaatcaggctttcactccccactgaaactgccctcgtcaacatcattggtgacctcc
-actttgctaaaccccatggtcacttctaggtcctccctttatttggcctgtctgcagcat
-ttgacacaacagatcactccctcccctgaaacactttcttaacttagtatccaggaaacc
-actcttgagttgcttcctgcctccttttcagtctcctttgctggttcctcctcttctccc
-tttatcattgtagtatcccaggactcagtcccagccccctcccttccagtctcatggttt
-tgaataccatccgtacccagatgcctctcagactcacgtctccatcctccccctgaattc
-cagccatgtacatccaactgcctgcttgggccccttataagcaactctaatgtgcaatat
-ttttccagaaacatttttcccgaacttaaaatagggcatctctcttcttggaatcatcct
-taactcatctcttatcccacatccatcagcagatcctgttgcaataacttcaacgtatat
-ctggaataggaccacACATACACACACACACACCCCTCTTTCCTTTTGTACCCCAACTAA
-AGTACTAGTTCCCACCCTTGCCCTACACCAATTCTCTCTCTACACACCAGATTTGCTAGA
-TAGAGCACGGATTTAAAAGAGAATTCCAGTTTAAAAGATAATTGGGCGGGAGCAATAATT
-TTAAATCACTTAAACTTCAATAGGGGAACATTGCTATAGAATACCATGTCAGAGCTCCCA
-ACCTTTTCTGCCTCTTAAAAATCACAGGAGAATGTGTTTAAATGCACTGTGGTAAATAGA
-AGCAGCTGCTAGGATAAAAAGCAATTAGCCCAGGTACTCTGGCTATTCAGGCCCCTCCTG
-GCTGACCCTAGAGCTGAGGGAATCACTGTGTTGGGTACCCTCATTTGCAGAGCACACCAT
-ATGACAGCACTCTTGCTGGGCAACTCTGTACCAGGAAACCATTAAAAAGTAAAAGATAAA
-ggccgggcacggtggctcacgcctgtaatctcagcactttgggaggccgaggcagatgga
-tcacctgaggtcagaagttcgagaccagcctggccaacatgatgaaaccccatctctact
-aaaaatacaaaataggattagccaggcgtggtggcgggtgcctgtaatcccagctacttg
-ggaggctgaggcaggagaattacttgaagcagggaggctgatgttgcagtgagccaagat
-cacgccactgcactccaacctggacaacaataatgaaactccatctcaaaaaaaaaaaaa
-agtaaaaGATAGGAATACAtgacagatccaggtagtgacttactcaacagccattcctcc
-ccatcatcgcaactattggatcctgatcttgtccatgtatgcacttgccttaatggaggc
-aggccccaggtccagccctagtcctagtcccagctccaatagtcatgactgtctgaggct
-ggacttggtgagccaatttccctttccagttagaggtctagtcatagatacatgatgaaa
-gtctggctaagaagacaggatgagaaatctactcaaaggcttttgggaaaggttttcatc
-acacttttaaaaaaaggcattgcagaaaaacattccttcatctgctggtagacattgtca
-tatctgtgtgggattcctggaatcgcggaactgtgaggggagttggccaaagaggatata
-cagtgaatggtagagaggaaaatgtaaaaaccttcttccttgatagcactgttgagccat
-taaattaaccaaccctagcctggcacaatagtatgtgcctgtaataccagctacttggga
-agctgacgcaggagcatcgcttgaggccaggcatttgagatcagtctgggcaacatagtg
-agaccacatctcagaaaaaaaaaattttgttttaattagccagatgtgatgatgtgcacc
-tgtagtctcagctacttgggaggctgtggtgggaggattgcttgagcccatgagtttgag
-actgcagtgagctatgattgtgccactgcacgccagtctgggcaacagagtaagattctg
-tctctaaaagaaattaattaattaaattaacctttcacctatctagaaaatacttgagat
-taaataagaaatcacattactgggtgagcaaatttgagttgagttttctggtacttgcag
-accaaaagcattttactgaACCCTACGTCtggaggaacaacaagatagaaggaacctggg
-tgggtccctgacaaccttgcaggagaaagtcacctacctgtccttactgcctgccaaatt
-ccgagctgcttcatcaaagagaaataaacctccaccttgtctgagaccctgtatttgaga
-gtccctttgttacagtagcttaacctgtaccttgattaatacaAAGAAGAGCTTGGCCAC
-TGTCAGACAGCCTTCCTCATCAGACATGCTGACCCAGCATGGACACCCACTGAGAGCTGC
-CTGTGCCCCACATCTCAGGTACTTAACCAGTAATATTACTGCCTCCCACTTCAAtttttt
-tttgtttttgagacagagtttcgctcttgttgcccagactggagtgcaatggcatgatct
-tggctcaccacaacctctgcctcccgggttcaagtgattctcctgcctcagcctctcgag
-tagctgggactacaggcatgcgccaccacaaccggctaattttgtatttttagttgagac
-ggggtttctctatgttgctcaagctggtctcgaactcctaacttcaggtgacccgcccgc
-cttggcctcccaaagtgctgggattacaggtgtgagccaccgcacctggccCCACTTCAA
-ATTTTTAAAAAAAATACATAAAAACATTTGCAAAAATGCTGCCATCTTAATCAAAGCCAA
-AACACACTTGAGGGGCCACTGACAATCACCTGTAACAAAGCTGTTGGAACTGGGATTGAA
-TCAGATGGGGTCCATTTGCACTTACACCTGTTCAGGTGGCATTTCTGTGTTCACGAACAC
-CTGATGGAACTTCCTGCCCCCAGGATAGGTGGGCAAGATGAGCTGGCCTTTCCTCCCTGC
-ACATGTGAGGTGATAAATGTGATAGAGGGCCTCTCAGGCCTGCTTGGCTCCAGGCTCAGC
-AATGGCAACCTGGGCTCTGATTCCATCAACATCTTGCTGAGAGGTGGACTAGGCTGAGCA
-GGCAGTCTCGGGCTTCCATCCATGTCATTTGATGTGCTGGCTTTGTGGCAAATGTGCACA
-GCATCCTAAACCCACAATCCCTACTGTTGTCACTGGGTAAGATGCCGTGGTTCTTGTGGA
-GACACCTGCTATACTCGACATAACAAGATCCTAGACATTCCTTCTTATCATCTGCACAGC
-CCTCCAGAGCTGCTCTCTCCATACGGCCTCAGTGCCCATCCGGACTGCTCTCCTTGCAGG
-GTACCTGCCTGGCCCCTGTAGCTCCTGATGTAATAATCTCTGCAAAATTTGACCTGGAAA
-AAATGAAACTGACCAAAAGGATGGCCCTACACATACCAATGAAATTGTACAACAGAAGAA
-GATATGATTAGCAAAATTGGACATGGAGCCAGAACCTAATCCACAAGTCAAATATTTTCA
-AAATACAGACAGATGCCTTTAAAGTCCAACACAAAACAAAAATGCTCAAAATACGTTGat
-tatatgagagttcctgactagtgcagtaagacaagaaaaagtataagatttgaaaaaaga
-gacaaaaccttcattattcacagacgatatgattggcaatacagaaaagtaaagagattc
-caaaaaccactggaaattttttaaggtttcaactttgttgccagatatggggtcagtaca
-caaaattcaatcgtgtttcctctaacggacaccaacaaaccatatgtaacttctgattta
-caataatttcacttacaatagcagtcaaaccacgtggtactttggaataaatccccaaaa
-gtatgtaagacctttatgaagaaaactataatattttattgaaattcataaaataaggcc
-taaataagtgagaaatcaagtggggtcattgatggaaagactccgtgttataaagtggta
-attctgtacaaatgcagtgcaacgccaattaagatctcatagtttcctggaacttagtag
-gcaggttgtgaaatttatatggaggttccaaatatagctgagaccatcttaaagaagacg
-aaAGAGAGAGAAGAATGtttcccataaaagaagaaactggagttcagatttctctttgga
-aactgaaagatccccccacagtggaccctcacttctggagaggaatattcagctacagtt
-gactagcagttgccccttcagatagaatattcgatctccagttcacccagtatatcttct
-acttaaggcacctgcctgacccttgcagatatttgattatgtgaTAGTTACCTGGAGTGA
-GGGCTTAAGATAAGAGGAATGGAAGAGATTGTTTAAAATACATCTATTGTTTGGTTGTGT
-AAGTATTCTCCTCATGGTGAAACTTGACCAGGCAAGTAGAAAGAATAACAGAGAAGTATG
-TGAATCTAagacattgatgtttctggtaatggtgaagttccgagtatgatcacgggaatg
-cgtggctgagaagggataaaggaaatggtgcctgaggatataaagtgagaggactggaaa
-gTGCAAACGGCCCAAGTCAGTGGCTCCCCTGAGACCAATACCAGCAGTTGGGATGAAGGG
-AATCTGCCTGTTAACAAGGTTTCCTAGGATCTGATGCACAGTTCTTGATCCACGGCGTCA
-GAAATAAAGTGGTTAAATAAATATAAGCTACCggccgggcgcggtggctcacgcctgtaa
-ccccagcactttgggaggccgaggcgggcgatcacgaggtcaggagatcgagaccatcct
-ggctaacacggtgaaatcccgtctctactaaaaatacaaaaaattagccaggcgtggtgg
-cgggcgcctgtagtcccagctactcaggaggccgaggcaggagaatggcgtgaacccggg
-aggcggagcctgcagtgagccgagattgagccactgcactccagcctgggcgacagacca
-agagtccgtctcaaaaaagaaagaaagaaagaaaTATAAGCTACCTATACGTGGGGCTGC
-CTATTAACTCCGCcaagtgacttaactcctgcctctttatctgtaaaatgggcataatta
-cagcattgtttttggaagattccatgtaataaagtctgaagtgtgcttaacacagtactg
-ggaacttaagcagcactcaCACTTCATCCTAAATACGACGAAAGTCTTTTCAAAAAAATA
-AAAATTAATGCAATATGACTTACTTGGAAATGTATCAAAAAATAAAGACCGATGAATGGA
-TCGAGGCGTAGTGTGACAGAGTAAAATTTTAATGATAAAAAGTTAATGGTAAAATGTTCA
-CTGTAAAACTTTCAACTTTTCTTCTTGAAAACGTGCATAATCCGACGTGGGAAAAAAAAT
-AACGCATTGCAGTCAGTTCTGGGGAAACGGAAAGCTAAGTTTTAATTTTGCTATTGCTTT
-TGCTTTTTTAACAGAAAAGGTACAAAAAAGAAAAAATGGGAGAGATGTTGCCGAACTCCG
-TCCCGCCTGTGGGCTGTGGGCCGTTAGCAAAGCTGCTAGCATGAAATCGTCGAGCACCGC
-TTGCGAAACGCCAAATCCTCGAGAGCGAGGCCGGAGGCTGCCAAACCCGCGCTGGGGAAA
-GGGCCGCCTCCGGGCGCCCCATCCCGCTGCGGACGGAGGTGAGGTTGGAGCGAGCGCTGG
-CGGAAGAGAGGCTCAGCGCAGGGGGCGCAGAGCCGGCGCTGGCCAATATGCGCCGCATGT
-GATACCTTTGAGGGCGCGGCGGGGGAGGGTAGCGTCAAATTTCAAAAAAAAAAAAAAACC
-AAACCCACACAgccccggcgggcgggcgcgcgcgATGGGCGCCCTTTGGCTGCGGGAGCG
-AGTGGAGGATGCTGGGAAGGAGGTAAAATGGCCACCGGCGGCGGCGCGGAGGAAGAGAGG
-AAACGGGGGCGGCCGCAGCTTCTgccccccgcgcggcccgcggcccggggcgAGGAGGCC
-GACGGCGGCCGCGAGAAGATGGGCTGGGCCCAGGTGGTGAAGAATCTAGCCGAGAAGAAG
-GGCGAATTCCGCGAGCCGCGGCCGCCGCGGCGGGAGGAGGAAAGCGGCGGCGGTGGAGGG
-AgcgccgggctcggcggccccgcgggcctggcggcgccggACCTCGGCGACTTCCCACCG
-GCTGGCCGCGGGGATCCGAAGGGCCGTCGGAGAGATCCGGCCGGCGAGGCGGTGGACCCC
-CGCAAAAAGAAGGGCGCTGCGGAGGCGGGCAGGAGGAAGAAGGCCGAGGCGGCGGCGGCC
-GCCATGGCGACCCCGGCCAGGCCCGGCGAGGCCGAGGACGCGGCCGAGCGGCCCCTCCAG
-GATGAgccggcggcggcggcggcaggcccgggcAAGGGTCGCTTCCTCGTCCGCATCTGT
-TTCCAGGGAGACGAGGGCGCCTGCCCGACCCGGGACTTCGTGGTAGGAGCGCTTATCCTG
-CGCTCCATCGGCATGGACCCGAGCGACATCTACGCGGTCATCCAGATCCCGGGCAGCCGC
-GAATTCGACGTGAGCTTCCGCTCAGCGGAGAAGCTGGCCCTGTTCCTACGCGTCTACGAG
-GAGAAGCGGGAGCAGGAGGACTGCTGGGAGAACTTTGTGGTGCTGGGGCGGAGCAAGTCC
-AGCTTGAAGACGCTCTTCATCCTCTTCCGGAACGAGACGGTGGACGTGGAGGACATTGTG
-ACTTGGCTCAAGCGCCACTGCGACGTGCTGGCCGTGCCGGTGAAAGTGACCGACAGGTTT
-GGGATCTGGACCGGGGAGTACAAATGCGAGATCGAGCTGCGCCAGGGGGAGGGCGGGGTC
-AGGCACTTGCCAGGGGCCTTCTTCCTGGGGGCCGAGAGGGGCTACAGCTGGTACAAGGGG
-CAGCCCAAGACATGCTTTAAATGTGGTTCCCGGACCCACATGAGCGGCAGCTGCACGCAG
-GACAGGTGCTTCAGGTGCGGGGAGGAGGGGCACCTGAGCCCTTACTGCCGGAAGGGCATC
-GTGTGCAACCTCTGTGGCAAGCGAGGACACGCCTTTGCCCAGTGTCCCAAAGCAGTGCAC
-AATTCCGTGGCAGCTCAGCTAACCGGCGTGGCCGGGCACTAAACACCCGCCTGCCTGCCA
-GGGTGAACACACAGCCAGCTTATCCCTCTTAAGTGCCAAAACTTTTTTTTAAACCATTTT
-TTATCGTTTTTGAAGGAGATCTTTTTAAAACCTACAAGAGACATCTCTCTATGCCTTCTT
-AAACCGAGTTTACTCCATTTCAGCCTGTTCTGAATTGGTGACTCTGTCACCAATAACGAC
-TGCGGAGAACTGTAGCGTGCAGATGTGTTGCCCCTCCCTTTTAAAATTTTATTTTCGTTT
-TTCTATTGGGTATTTGTTTTGTTTCTTGTACTTTTTCTCTCTCTCCTTGCCCCCCTCCCG
-CCCTCCCCGCCCCATACCTTTTCTTCCCCTGGATTTTCACCCTTTGGGctgccttgctca
-tctttatgccccagcactaggtacggggcccaacacgtggtaggcactccatcagtgttt
-gctgaatTGAAAACATTGTTGACTGTGGCTTCTATCAGAGTGTCTACCTTTTGCAGCTCT
-TCCCCTCCCTCATTTAATTTGCTGCTTTTAATCTACGTGGTCTGAGAATTTGTGAAACCA
-GTGTTGTTAGAAGTGTATATAATCTGAATCAATAAGCTCTGAATGGTGGCCAAGGGCCTC
-TCTTATGGCACAAAGATGCATGGACTTCATGACAGCTCTTTTGGTGGCTCAGAAGCCATT
-TTTTATAgaatcatggaatctagaatattcctgctggaaagaacctgagagttggtttgg
-accaattccctggttttccagcagatgaaacaggcccaaagaggttaaatgactgggtga
-aaatcacatagctgtctggtgccagagccagcctatagtagagtcccctgaccccaagcc
-cggtgctcattccactACCTCTCACACTTCACAACAATTTCCTCAACACTTGAGGGCCCA
-GAAAGTCTGATCTCTCCAGAATGATCAGCCCAGAGGAATGCTGAGAAATCACCTGGAGGA
-GGGAGCAGAAAGAGAAGGTTTTTAAGGAGGGGCTTCTGAATACTTGGGAGATACGGAACG
-GACCAAGGACCACACTCCAGGGTGCATTCGTTGCTCCCTGGGGCACCACTTCTGGATTAC
-AGTGTGCCAGGTCCTTTGGAGGCCCTACCCCTTCCCCATTCATTGCCACCAGTGAGAAAT
-GGGGGTGCCCCTGTGTAAAGAAACCTACCAAAGGTTTACATTTGCACCTTAGCCTCAATA
-GCTACGAACCCTAGAGAAGCAGCTAGCTGGAGCTCATGTGCAACTCCTGATTCTCAGGAG
-AAAGATGGATTTTAACCCAAAATTATGAGTGAGCTGTTAACTCTAAAATGTACTTGGGAG
-ATAGGCCAAGCGAGAGGTCATGGGCCAACTAAGTGTTATCCAGTAGAAAAGACAGTACAC
-TGCTTTTCTTTTAGTGTTTGCTTTTCCTTTGCTATATGTTTTGCTATTTCCTTGTGGCTT
-AGAATGTAAAATTGATTGTTAAAAGTTTTGTTCTGAATAAATATTTATCTTTTGTATTGC
-TAAAACTGGTGCACTATTTCCTTTCAAAGTGTTAGATGCACAGTTACCCAGCTCCAGACC
-GTATTTCAATCCCACTTCCCCTACACTCCATTTGTTTACCTTGCTAAATACATTTCCCAC
-CCCTGCAGGCAACACTTAGCACCTACTACGTTGTGCCGGTCCCTTTGCATCACAATCAGC
-ACACTGTTAAAACGGGTTTTaagtcctaacacagttccaataaatcagaatcactgttag
-aggaagtgaaacattttagttaatcatcctcaagcaattctgatgggcagccaggtttga
-gaCCAGAGTATAAGATGTGTGAGCTGAAccctgccctcagggagattacagacctgtggg
-aaagagagGTGGTTTGCCAGCTTCCTCGTCTTTCTGTTACTGTAAGCGCGCGCTGTGGAT
-GGGATGCAAAATATTCTTGGGTTCTGGGAAAATGCCATTTCTTCCAGCTGTTGAAAAAGC
-GGGATCCAGGGAGCTGACTTCTCCAAGTTAGCCCCCACTGGAGACTGGGCCTGCAGGCAG
-AATAGGGTCAAGGTCCCTGGACTTCAGGTCCAATACCCTGCAGACCCCAGATACAACTCT
-CTGAAGGATTTTCCAGCTGGTGATGCTAGGATGATCTGATCCTGAGAGTTAAACGTTCCC
-AGTATATTGACTCTGACTCAGTGATTTGAGGATATTTCCAGAGCTGATCTGGAGTTGGGA
-CCTGGTAGGCTCTTGGGAATCCTGTCTTTCAGAGCCAGTTCAACCCCTCTCCTTGTCTCC
-CAAAGCAAGCAGACTCTCCCCTCCCTCCCATCCCTCTTTCCCGTCTTTGCCAGCGGTTTC
-CCTCCCTCTCACAGAGCTGGAGGCCAGGGGCCAGGAGAAAGCCTGCATTCACCATACTCT
-CCACTCCGTTCCTCAAAGCAGGCACTGTGCCAGGGAGCCTCCTTGAAGGAACCTTCCCTC
-TCCTGGCCCCATCCCCCCACTCTCCAGGAGGGAGGAGAGGAAGAAACTGTTTCCCTGCCC
-ATCCCCCACAGGATCTGCTTCAAGGCCTCCTGCCTGGTGGCCCAGGGACAGCCAGGGGCT
-GGAGCTGAACAAACCTCCCCCAGCTTCCTTTCCTGATCAAGCAGCCCTCAAATTACAATT
-CTTCACTGTTTTTGGGCTCCTGGAAAGTGTGCAGAGATGCCCGGACTGAGGCTGGTTGAC
-TAGGGGACATTGattcattccacttcaacaaatacggagggcattagagctgggccccat
-gcaaggccctctgcataggctgccttgaacaagacagTGCACTTGCAATGGAAGGTACAG
-ATAAGTAACAGTAGGCAATGTTTACAATCATATATTTAACAAtttttttttgagacagag
-tctcactctgttgcccaggctggagtgcagtggcatgatcttggctcactgcaacctcca
-cctcccggattcaagcgattcatgtgcctgagccttccaagtagctgggattacaggcac
-gtgccaccacgcccggctaatttttgtatttttagtggagatggggtttcagcatgttgg
-ccaggctggtctcgaactcctgacctcaggtgatccacctgcctcagcctctgaaagtgc
-tgggattacaggcgtgagacaccgcacccagccAACATTTGTCCTGTatagaattgtctg
-aagtaaaggtttccctagaagagaaaacgtcctgactgaaacctgcaagatgagtaagaa
-ccaggctaagagtgaagagacagccaagcagcagaaatagcagatgtagaggcctggagg
-ccagagagcacacagcgtgttcggactggccaagagtcaggggaagatgtggctgggaga
-aaacgccgagaagagGTGTCACAGGGCTTACCAGCCATATTTAAAAACGTGGATTTTGTC
-CTCAGAGCCTCCAATCAGGCCTCCTCCATTCCattcattctttcaacacatgcctgttaa
-gcgccaactctataggggccttttctaagcgatggaacacagcatggagcaggataatca
-agtccctgaagctcagattctagagtcacacaagtacataattacagacgatgatgcact
-aaaagaaacatacagggtgagatccctgtttaacaagcaaagctgatccagtcttaagga
-tcagagaaaatgtttgaactgagatggaaaagacataaaaggagttaatcgagagatggg
-gctggggattaagggatggcaagggtattaacctaggcaagagggatagcaagtaaaaca
-accctatagtgggaggaggcatgaccacttctagagacTAAATGAATCAGTCTAAGTTTA
-GAAACAGAAACCACTCTTGCTGTTGAAGAAAATGCTGGTCCCTGGGCTGGGTATTAGGAA
-TGACTCCTAGAACACCATAGAACTGCCAGGGGAGTTACTACCTCTCACAGTCAGAAAGAC
-AGAAGCCAGGAGGCCACCACTGGAAAGGCTGAGCATGAGGACACAATGGTGAAGCTGCCA
-CCCAAAGACAGGATCCTGGGATCAGAAAGTCACTGCCAATGCCACTGGCAGGACAGTGAA
-ATGCCAAGTCCTTTCCCTGCCTCTACAAAGCCAGGGACTGTGCACTACTGTCTCCGCAAC
-CATTTACAGGTAAAAACAGCCCAAACTGTCTGGCTTACTTATGCCTCCCTTCCATCTTTT
-ATGCAAATACATCTAAGTGCTAGAGCCCTAGCTGCAAGGGAGTTGGGAGATGTTTTAGCT
-TTCCAGCATCCGCAACATAGGAAGGCACATAGAATGGGGATGGGTGCTGTCTGTCAAAAG
-ACAATATCCAGCACAAAAAATGTGACTGCAGTGCAGAGAAGAGGAGCTCGTGGGagcatc
-tggtaggccatgttaagaatgtgggtctaagaacgatgtgccattgaaggacttgcaagc
-aagagagtaacatgattagattggttatgttttacaagcatcattcaggatagttggtgg
-agactgggtcagaggagagcccaaggggaaatacagtatagttcacccaggtctctcgag
-agatgaggacatcttaggcatggaaggcggagatgtacagagagaaacagccgagtaaag
-aaatctttcagagtttaagtcaacaagatttggagctatatttgacatgggctgggagaa
-agttaagtaccaaggatgttgcccaggtttctagcttctgcagttggatggatggtgggg
-cttttccctgagatgcgaaacagaagagaaaatccaagtttagggtgaagggcttgaatt
-tgattttggatatattgagtttaaggtctccgtagaggatatctaagaggagatgtggag
-taggcggttggatacacacagatcttacattcctaggagaattctggccctgagaaataa
-acacaggagttgtacagcTgtggctttcaaactgttttaccacatcccacagtaagatat
-atattttacattgcagccatcatacatatgcatgtgtgtatttatatctaaatctgaaat
-aagcttcctcaaacaatatttgccctgtgcatgatgcaccttgacactttctattccatt
-gcttcatccttttgtcaatgcttatatgacgtgttaaactgatttcacactctcctaatg
-gTCAAGAGAGAAAGCAGAAGGAAAGATTATACCAACTAAGATTGTGCCTCAAGCAACTTT
-GACACAGTTTTCCCTGATGgaaaaggagatggtgaaaaactaataagggacagccagaaa
-gggagaaggaaaaccagaacgtgcagaaacacataaaccaagggaggacatttcaggtgg
-taggggttaacaattgtgtcaagggctgcaagaaatcaagtaaaatcagctctaagaaat
-gtcaattgAggccgggcgcggtggctcatgcctgaaatcccagcactttgggaggccgag
-gcgggcggatcatgaggtcaggagattgagaccatcctggctaacacagtgaaaccccgt
-ctctactaaaaatacaaaaaattagttgggcgtggtggcgggcgcctgtaatcccagcta
-ctcgggaggctgaggcaggagaatggcgtgaacccaggaggcggagcttgcagtgagctg
-agattgagccactgcactccagcctgggcgacagagcgagacgccgtcaaaaaaaaaaaa
-aaaaTgtcaattgagatcagaactgaagagtgccctaggattgagtagtgtggaggttat
-caataagggccttttagaggaaagtgatgggggcagaTTAAGGAGCAAATGATCTTTCTA
-AGATGTCAATCTGGCACGCTGACCATTTTATTCCCATGTCACGTCCTCTGGGACTCCCTT
-GTGCACTTGGAACCCAGCCTGGTACCCGATCCCTTTCACAAGAGGCTCCTGGACTCCTTT
-CCAACCTTACTCTCAGCCAGATTGCCCATTACATCCCTTTATGTCAACTCCAGTTACGGC
-TGACAAACAGCAACCAGAAAGAATTTTGGAGTATGGAGTGGTACAAGACCAAGCTAAGGg
-gccaggtgcaatggttcatgcctgtaatcctagcactttgggaggcctaggcaagtggat
-cgcttgaggtcaggagttcgagaccagcctggccaacatggtgaaatcctgtctctacta
-aaaatacaaaaaaaaatagccatgtatggtggcatgcacctgtagtcccagctactcagg
-aggctgaggcaggagaactgcttgaacctggTGATACAGGAAGGGAAGTGCTGGGAAGGG
-AAGGGCACAGTCCCTTTAAATGACATGGAAGGGAGAAagggcgtggtccctggctagggc
-tccaccccagcctgtgcccatggacctaggtgaggacaggcatttttgttttcctgccca
-aatgttgcatttcccaagaccaccctggccggccacgcccccatcctgtgcctataaaaa
-ccctagcaggcagacacacaggtaactggacggctagaggagcacatcagtggaggaaca
-cacaagcggctggacgtcgagaggaacgcaccgacaggcactgacaaaccagcacaccac
-aggccatcgaccaacagaactatgcagagtttggctggggcagtcggaggggagcctggg
-ccactgaacagtccaactccaggggaaaaccttctcactccatccccttctggcttcctc
-catctgctgagagatacctccactcaataaaaccttgcactaattcttcaagcccaggtg
-tgatccaattcttctggtacaccaaggcaagaacccaggatacagaaagccctctgtcct
-tgcaacaaggtagagtgtctaattgagctggttaacacaagccacctatagatggcaaaa
-ctaagagcatacggtagcataagcccattggggcttcaggagctgtaaacatccaccact
-agacactcgtggggtcggagccccacaacctgcccatctgtatgctcccctagaggtttg
-agcagcgggacactgaagaagtgagccactccccttgtcacacgccctgggacggggaca
-agggaacttttcccgtttcaGTgggaggcagaggttgcagtgagccgagattgtgccaca
-ctgcactctagcctgggcaacagagcgagactccatctctaaataaataaataaaaGGAC
-CAAGCTAAGGGTGAGGAGACGTCAGATCATGCTGAGTTGAGGGTGGGGGCGCCACAGGAG
-TGCACCAAACGTGTACAAAGGCACTGATACATACAGCCCCATTTGCTGGCTTGTCAATGT
-GACTAAGATTTGGGGTAGGACATAGTAAAAGAAAATAAACACAGATATATTATGGAAAAG
-AATGTAAACTTTGCAGAGTTTTAAATAAAATATGACtttttttttttttgaggcagggtc
-tcactttgttaaccaggctggagtgcagtggctcactgcgtggctcgctacagcctacaa
-ctcctgggctcaagcaatacttctgccccagcctcctgtgtaactgagactacaggcaca
-caccaccacacccagctaatttttTCTttctttctttttttttttttttttttttttgag
-acggagtctcactctgttgcccaggctggagtgcagtggcacaatctcggctcactgcaa
-cctctgcctcccgggttcactgtggatatatcccctcccgggatatatccatcactgtgc
-ctggcacagctgcagcctcccaagtagctgggactacaggcacccgccaccacgcccggc
-taattttttgtatttttagtagagatggggtttcaccgcattagccaggatggtctcaat
-ctcctgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgag
-ccaccactcccagcctctctctttctttctcctctttcttctctttctttcttttctttt
-tcttttcttttctttcttccttccttcctcctttccttcctttccttccctttctctctc
-tccttccttctttccttccttccttccttcttctttctttctctttcttttctttcttca
-gggtctcaatatgttggccaggctggtcttgaactcctgccctcaagtgatccttccacc
-ttggcttctcagagtggtaggattacaggtgtaagccaccacacccagcccaagaaagat
-tttattttatttttttatacagacagggtcttgctatgttgcccaggctagactcaaact
-cctggacaacatagcaatcttcctgcctcagcctcccTAGTAGCCAGGTGTGCACGGAAC
-AAATTAtatgtattaatatggaacaatctctaagacacattattaaatgaaaaaaagcaa
-gatatggtatcctacagtttacattttttaatgttggaataaatacatacataccctcag
-caccataggaaagattttaaaaaagaaaaaatatatatacatatgcttatttttgtacaa
-atatgtaacactggaaggatattaatgaaattcgtaatttgtaACTTTGGAGAACTGGAT
-ATTTGGGGTTTGGGATAAAAGGAAAGTTTATTTTCCACTGTGTATCCCTGCTTTTAAAAA
-AATATTTCATCTATTATCTCTAACAACAACAAAAACAACTTTTAACAACAAAAATAAATG
-CAAAACACAAGACTTCAACGAAATTCCTATAGACTTTAGAGAGACAGGAGTCCATCTCCT
-CTATCTTTAAAAGTAAAggccgggcttagtggctcatgcctgtaattccaacactttggg
-aagccaaggcaggaggactgcttgagcccaggagtttgaggccagctgaggcaacacagg
-gatatcctgtctctacaaaaaaaaaacaaatcgttgggtgtggtggtacatgcctgtggt
-cccagctacttgggaggctgaaacaggaggatcacttgaggttgaggctgcagtgagccg
-tgatggcaccactgcactccagcctgggccgcagagtgagaccctgtctctaaaaataaa
-ataaaataaaataaaaataaaaAATAAGAACTTTGATGGAAGAGTTTAAGAAATTCTATA
-GCAGACAACACATTGGTCTCCCTGCTTCCAGGCTCCCTCTCCTTCCAACCATGGAATCCA
-CCCCAAAACAAAACTTGATCACATTTCTCCCCCGCTTAAAGAACTTCAAAGATTTTGCGT
-CCTCCCTGGTGTTCACCAGGGCCTGCCTGACCAGCCCTGCCTCCTCTGGGCCTCCTCTCT
-TGTCGGGCCTCCCCCTCTTACCCTGGCTTGGCTTCCCcttctgctccagctggtcattcc
-tggaagcagatctcttcctcccctacccatggttaatccttacctgcctggggcactcag
-ctctaatgctgcttcctaactagagcctaccctaacatcctgtatcagaccctcttacac
-cgtccgttacctccctggcctctccttcagcagttactcgggtgcaatgatatacttatt
-tgtgccatggtttgattgatatctgcctctgcctctccactttgagctccctgagggcag
-gaaccagtctcttttggctcacggttatagcttgagcaattagcactatgcctggcacag
-agtaaagcctaataaatatttattgcatgcatgaTCTAGAATCACTTGGCTGAGGTTACA
-GATTAAGACACGTGTCTACTTGTCCTTCTTTAATATACTTAACATACCTTAGCACTCTGT
-CATTGACACATACTGAACAAGGGCTTATTCATTCATCTTTTAAAAGCTAACTCACTCTTT
-TAGTTTTCCCACCTTTGATAAGGGAGGATAGGACCTGGGAGGTCAGGCCCTCGGTTTACT
-AGCTCATCCTCCTCTATTTCTCTGAGAGCATAAAATCACTGGAAGTCAGCCAGCATGCCC
-CATGGCACTGTGAGGCACAGGGGAGAAGCACCAGGCTCCTGGATTCTGAATGCGTGGCTT
-TGAAGCCTGGCAAGAGTGGCCCCTTCCCTGAGTCCCCCACCAcccctccccttggggcga
-ggattctgcaggcatgagaagtgcccacccagagtctgtgcctatgccttctagaacacg
-ctctgatacccgataattcccttccaaaatgtcactaagttaattcacagggctctttgt
-gggcctcatccctggcttcatctcacctgagggcaaactatactgcctgatgcacatctt
-atagacctgagccttgggcctcaagatagctgtttgcaggtgacagctaggtgttgaccc
-atgcatgctagctccatcactgatgggatgagaggtagctggataagggatggatacagg
-ttccaggggacaggtctccttgggcctacacattctggcacataactccaagggtcttag
-aattctaatttgaacatggccttccaggttgttagaggatatatccatcaaggaagaaaa
-cagaacatatttcatttaacacttgctggactgttgtataatttctaactatagagacat
-atggtatatgggcctccaactctactcttgttctgagccccacaaatgCCCATTtggttc
-tgtcatttctttgcatagacaagctacataacctctctgaacttcagtttcctgagcagg
-aaaatgggtctatggtaataactacattatcagggctggtgagaaaatgaaataaaataa
-tccatgtcaagggcttgagaagaatgccCTCTGGCTGTCGTCTCCTATGACTTCCTGTAT
-GATCTCCAAACTGCTCTCTTTGCAGGGTTTCAACACGGCTGCTCCCTCCTGCCTCCTTAC
-CCACAGCCAATAACCTCCCCATTCTCTCCACCTAGTCAAATCCCACCGTCTTCAATTGTG
-ataatagctggttgattgcacgtttactacgtttcaggcattgtattaagaactttccat
-gcattaactcagttctgacaccaactcgatgaagcaggcactgtttattattccccaaac
-acaaagacacagggatctggagactggaagcactggcggctgcaagtggcagggctggcg
-gggtgtgaagccggagaggagtctttctgcagTCAGGCCTCCCAAATCCCGGGATGGAAT
-CAAGGAGCCTTTGGCTGTCCCACCCCTCCTCCTCCAAGCCCCCAAATCCAAGTCTGTTAT
-ATCCCGTCAGCTCTGCGGGCCTGCCTGTGACTTTCAGCCCAAGGGGGCGGGCACTTCGTG
-TCACGCCACGTTGTCCACATCATCGAccctccctccccttctccccttccttccttccct
-ccctctcttcctcccATTGAGTGCCAGTTCTGTGCCAAGCTTTGCTGTTCAAAATGTTAC
-GAGTGGAGAAGTCAGGGAAGGATGGAATTATAGGTGTTTCTTCTTCATACCTTTCTGTTT
-GGCTGATTTTTTTTCAAATGAGCACGCAGGCCCGGTTCCTCAAACCCACTTCCAATGTGG
-CATTGCTGGGTTGGTTTGGTCCAAGGAAAGCCCTGTCTCCTTAACTCCCAGCCCCCACGC
-CTCCTCCGCCGGCCCCCAAATCCAGGCCGCCCTGCCCCCTCCGGAAAGGGGAGTTGGGGG
-CGAGCGCCGAAATCTGAGTGGCTCTTTCAAGCCTCCGTTGCCATAGAAACCGGCCGCACA
-GGCCGATGCTGTCCATTACACCATCCTCTAGCCTCGCAGCCAATGGACTCCGAGCTCCAT
-CGCCAGAGGCCCCGCCCCCCAGCTCTGGGGAGTCCACCAATCAGCAGGTCCCGTGACTTA
-GAGCCCTGCCCTCGGCCCAGGGACACCACCAATGCGCTTCGACCCTGCCCTCCTTCTCTT
-CGGTGTAACAAGAAGACTCGatatttttttttttttttttaGGAATTCTCCAGATCAGAA
-GGAATTGGCAGTAAGGCCTCTGTCAGCTGCACCCTGAATAATCTTTGGCTGCTATTTTAT
-TTAAGGAGAGCAAAACTGTTTCAATTACGCAACAATATATACCATTCTCTACTAAAACAA
-TTTTAGGAAATGAAAATGTAGGCAATGGGATGATATAGTCTGCTCTATATGAATGTCTTT
-CATTATAGGTATTTTAATTTAACTTAAAATGATCAAGGAACTAGTCATCTTTCCTTTGTA
-TTTCAAATGCATACAAAATTAAAGATACCGAGTTTTTTGATGCAGAGTTCATGAGACATT
-GACTTAATTAGTTGGTAGGCAACTTTTACTGAACCATCTAATTCCTGGTTCAGAACATTA
-CAACTGGAGGATAAATGAATATTTCTCTTAATCCATGGAAGAAATTCTGTTTTTGAGGCG
-GGCTGCGTAAATGGCTCTGACACTCTGGAGTCTAAATAAACCAAATGTGTTTTTAAAACC
-CGTTTGCCATTACAAaaaaaaaacttcaattttttagaacacttttagatttacagaaaa
-attgtgaatataaagttcccgtctaccccagccacccaCCCTGtttctttcattattatt
-attattattgagacagggtcccgctctttcacccaggctggagtgcagtggcgcgatctc
-ggctcactgcaacctccgcctcccaggctcaggcgatcctcccacctcagcctcccaagt
-agcagagactacaggggcatgccaccaagcccagctgatttttgcatttttcatagagat
-gaagtctcgccatgttgctcaggctggtgtttctgctattaacatcacatatggtattgc
-agacgcatggtatatttgttccaattaataaaccaataatgatacattatttattaatta
-gagttcacagtttattcagatttccttcgtttttacccaacgttctttttctactccatc
-tttttctactccaggatccatccagcatgcctcatcgcactagctgtcgtgtctctctgg
-gctcctcttggctggggcggtttctcaCATAGCAACATGACatcactgttggtgctgcgt
-caggtttctctactggaaagtcagtcttcttttgccccttttcatactgtactctttgga
-aggaagtcactatgctcgggccacacttaagtgaggagttatgctctatctccttaaggt
-tggaatagctacatagattatttgggatttttctacactgaagatttgtctcatttattc
-agtaatttatttatatcagtatggattcacagataattatttaatactttaggttataat
-ccaatactatttgattttgttgctcaagttgttccagctttggcttttgggagctctttc
-ggttggctcccgtctccctttgacacacccctatttttgtggggttttctcgttgccgtc
-aagcacttccttactttctggcactacaagatgcctcaggctcatctttcgtatttcctg
-ccccagtcctcaaatcagccatttcgcaagagctttgattgtttcggagaagggtattta
-ttagaaaccaagaactgggcgctaggtgcactcattgctactagggtgtcatttattTcc
-ttcctccctccctccctccctcccttcctttttgagacagagtctcactccatcacccac
-actggagtgcaCACTCATGGCTACAGCCACGTAGCCATGGTAATGAAGCCATAACCTCAC
-GAAGCTTCCAGTTTACACAATTAGAGGGTTAATTACCAAGTTGCCCAGCACTCTGCAGTG
-TGCTgtgtaggcaatgcgggggtaaattatctgaagagaatttaaagacaataaAAactg
-cagcctagacctcctgggctcaagtgatcctccctccttagcctcctgagtagctaggac
-cacaggtgtgtgccaccacactcagctaattttaattttcaatttttttttttgtagaga
-taaggtcttgccatgttgcccagactgatacaactcccggcctcaagccatcctcctgcc
-ttggcctcccaaagtgttgggattacaggcgtgagccaccacacctggccTtggggtatc
-atttcttttaagccttctcaactgacagaacaaagaaatatatctgtatataccaatgtg
-tatatatatacacacatatctatatttccatttgtaaccatctgtatatatattaagcta
-aacatgagttcctgtttatatttaccacttgaatccagggatcatttggcttgcttcctg
-cttgcttatctctaaattcccactccaataacgggaaacctggttcccatcatccacatc
-caccatccatttacttaattgttcaagtccagtatacatgtgtaggattatcaaaattgt
-taacccatacccctgtgggaaactttatcaagtagagtacattcttctgaacactttctt
-ttgcctttagtgttccagcagactccacttgtttcttttttctttttctttttttttttt
-ttttgagacagagcctcactctgttgcccaggttggagtgctggagtgcagcggggccat
-cacagctcacagcagccttgacttcccagtcttaagtgatcctcctgcctcagcctccca
-agtagctgggactacaggcatgcgccactacacccatctaattttttaaaatttttgtag
-agatgggatctcactatgttgcctaggcttgtctccaactcctgggctccagtgatcctc
-ccgcctcagcctcccaaagtcctgggattaaaggcatgagccaccacgcctggcccactc
-atttctaaagttacttaggtcagcacgttttcctctatcctcttcatgaggtcatttcac
-acatttgtaatacggtgaagatgtttgtcatattctgcatgacattttggaattatctaa
-atgtcctaagtgatttttttaactttgcatgcattaaggttcactttttgtgctattaag
-tttaatggatatcaaccaatgcacagtcatatacccacatttcttcaccctaaaaaaccc
-cctgtgctcacttattgaaccctctccccgccaaacactggcaaccacacatccgtttac
-tgtatctatggttttgcctttttgtgccattattaaaaaaaagaaagacgcacaatattt
-ttgttgttgctcttgtcacAGCTGCCacccattgaatccttactatgtcccaggtccaga
-attacactgtcccattttgaagatgaggaaacagatgcaaatgagttgaagtactcccta
-gagactcataacaataagcaaagtttgacttcTATGATTAACTTCTGAGTCACCTCTGGG
-AATATTTGTAATATGTCTAATAGCCACACttcttttgtttgttttgatacaggggtcttg
-ctgttgcctaggctggagtacagtggctactcacaggtgcaatcatagggcactacagcc
-ttgaactcctgggctcaagcaatcctcctgcctcaacctcaaaagtggctgggactacaa
-tgtgtgccactgtgcccagcTATattagccacatttcaagtactcaatagccgctgtgca
-gtttatactattatattggTTTCTGAGttttgtttttgagactgcgtcttgctctgtcac
-caggctggagtgcaatggcacaatctcggctcactgcaacctccaccacctgggttcaag
-cgattctcctgcctcagcctcccaaatagctgagactacaggtacgtatcaccaagacca
-gctaacttttgtatttttagtagagacatggtttcaccatgttggccaggatggtctcga
-tctcttgacctcgtgatctgcccgcctcggcctcccaaagtgttgggattacaggtgtga
-gccaccgtgcctagctATATTGTTTTTTAAAAGATCTCTTATTATTTAGTGAAAAGAAAG
-GAcctgtagtctcagttactcaggaggctgaggtgggaagatcatttgagccccagagtt
-tgaggtagcagtgagctatgatgatgccactgcactccagcctgggcaacagagggagat
-gccatctcacacacatacaaaagaaaagagaCCTTGTAATGCACACACTATCATAATCTC
-TGAtttttctttttttttttttttttttgagacactgtcttgctctgttgcccaggctgg
-agtgcagtggggtgatcactgctcactgcagcctcaacctcctgggctcaagtgatcctc
-ccacctcagcctccccagtggttgggaccacaaatgtgcaccaccacaactggtaaattt
-tttatttattgtagagatgtgggtctcaatattttgcccaggctggtctcaaactcctag
-gctcaagctagcctcccaaagtgctgggattataggtatgagccactgGCTttttttgtt
-tgtttgtttgtttttgtttttgatatggagttttgctcttgttgcccaggctggagtgca
-atggcgctatcttggctcactgcaacctctgcctcccaggttcaagtaattctcctccct
-cagccttctgagtagctgggattacaggcatgcgccaacacctccagttaattttgtatt
-tttagtagagacggggtttctccatgttggtcagactggtctcaaactcctgaccgcagg
-tgatctgcctgcctcagcctccaaaagtgctgggattacaggtgcgagccactgcccctg
-gccTGACTTTTTTAAAATCAGGAAATTTAGATGAATCAAAAAAGAAATTACCTTGTCCCT
-ATTGTTCTCTTCTCATTATGAATGTCTTTGAGGACCATGCCAGTTGGCAAATAGGTATTT
-TGGAGCTAGACACAGTTAGGGTGAGTGGAGTAACACGACAGTACCTACAACAGCCACACC
-CACACCTGAGTTGGCTTCATCCTGCCTTCAGGTATCATTAAGAATAGGtattattattat
-tattattattattattattttgagaccgagtctcactctgtcgcccaggctggagtgcag
-tggcacaatctccgctcattgcaacctctgcctcccaggttcaagcgattctcctgcctc
-agccttctgggactacaggcccgtgccaccacgcccggctaattttttgtatttttagta
-gagatgggtttcatcgtgttagccaggatggtttccatctcctgacctcatgatcctcct
-gcctcagccttccaaagtgctgggattacagatgtgagccaccacacctggccATATATA
-TAtttttttctttgagacagttccactctgtcacccaggctggagtgcagtggtgtgatc
-atggctcactgcagcctggaactcccaggctcaagagatcctcctgactcagtctcccaa
-gtaactaggactataggcacacaccaccaggcccagttaatttttctatttttagagacg
-gggtctcactatgttgcccagactcgtctcgaactcctgggctcaagcaatccttccaac
-ctctacttcccaaagtgttgggattgtaggcatgagacaccacatctggcctataatgga
-atattatttggcaataaaaaggaagttctgatacatgctacaacatagatgaacctagaa
-atcatgatgctaagtgaaagaagccaggcacaaaaggccacatgttgtatgattctcttt
-acatgaactgtccagaagagacaaatccatggatacagaagcagattaatggtggcctag
-ggctggggattagagggaaggcagagcagatgggagagtgactgctaatgagtactgatg
-ctaatggtttcttttggggatgatgaaaatagtctaaaatccattgtggcaacagttaca
-caactctgtgaatgcactgaaagccactgaattgtaaactataaatgactgaatagtgtg
-gtatgtgaattacatctcaacaaagctgttTTTTTTTTTTTTTAATGTTCTGGAAGAATC
-AGGATAGACATTACCTCAGGTGAAGGAAGGCAGGAGATGGGATGGTAAAGGAATTCATTG
-GGGAAAACAGGTTATCAATGTTCCAGTTCTTGTGTCAGATTGCTGACTCCACAGATTTTT
-ATTATGTTATGTAAAAATAAATACACACAGggccaggcatggtggctcacacctgtatcc
-cagcactttgggaggctgtggtgggaaaatcgcttgagcccaggagttcaagaccagcct
-aggaaacatagtgagaacctgcctctacaaaaaaaatttttcgaaattagccagccatgg
-tggcatgcatctgtagtcctaactacttgggaggctgaggcaggaggatcacttgggccc
-agaagttccaggatgcagtgagctatgatcgcaccactgtactccagcccaggcaacaga
-gcaagaccaggtctctaaaaaaaaCCCACACAAGCATAAAGTGAGGGAATCACAGGCAAC
-AATGAGAATGTGTCGCAGATGAAGCGATTCTGTATACCTGAGACAGAGGGAGATGAACGG
-GAAACGGCAGagagtggtcaggacagtcctctctggggagcccgtttgagccgaagctag
-gatgagtagatgctccagcccatgtggggatgggggtgaaaagagttccagacaaaggag
-acagcatgaatgagggccctgaggtaggcccaagcctgttgtgtttgggggacagccagT
-TTAAATGTCTGTTCTGTTATATTGTGGAGTCTCTGTGtatgaatttttcctaaagaaata
-acagacaggccgggtgcagtggctcacgcctgtcatcccagcacttcgggaggctgaggc
-aggcagatcatgaggtcaggagatcgagaccatcctggccaacatggtgaaaccccatct
-ctattaaaaatacaggtcgggcacggtggctcacgcctgtaatcccagcactttgggagg
-ccaaggcaggcagatcacaaggtgaggagatcgagaccatcctggctaacacggtgaaaa
-cccagctctactaaaaatacaaaaaaaaaaaaattagccgggcatggtggcgggcgcctg
-tagtcccagctactcgggaggctgagacaggagaatggtgtgaacccgggaggcagagct
-tgcagtgagccgacatcaagccactgcactccagcctgggtgacaaagcgagaatccgtc
-tcaaaaaaaaataaaaattagctgggtgtggtagcgcacacttgtaatcccagctactca
-ggaggctgaggaaagagaatcgcttgaacccaggaggtggagattacagtgagccaagat
-tgcgccactgcactccagcctggcgacagagcgagactccatctctaaataaataagtgg
-ccaaaaacatacatacaaaggtgttcactgccatattgtttataatagcaaaaaggggta
-aaacaatcaaaatgtctttcaagaaggaactgattcactttgggaggccgaggtgggcag
-atcacctgaggtcaggagttcgagaccagcctgaccaacatggtgaaaccccatctctaa
-taagaacacaaaattagccaggcgtggtgatgcacgcctgtaattccagctacttggaag
-gctgaggcagcagagtcatttgaacccaggaggcagagtttgcagtaatccgagatcacg
-ccattgcactccagcccaggcaaaaagagtgaaactccgtctctaaaaaaaaaagaactg
-attaaatgaattacaatataCTCGGCAGACCTGGACGAGAACCTACGCACTACATGGAAA
-GAGAAAAGAGATGTGAAAAAAGCAGGTTACTAGAAATTACATATAGTAACATTCCACTTG
-TGTAAAAAAAACTATGTGTGCATGTGATTATAAGCATTTAAGTTTCTGGATggccaggtg
-aagtggctcatgcctgtaatcccagcactttgggaggccaaggtgggcagaccgcttaag
-cccaggaatttgagaccagctcgggcaacgtggcaaaactcagtctctataaaaaataca
-aaaaattagccctgtgtggtggtacgcgtctgtagtcccagctacctgggacactgacgt
-gggaagatcacttgagcccaagaggttgaggctgcagtgagctgtgattgcgccactgca
-ccccatcctgggtgacagggagagaccttgtcgaaaaaaaaaaaaggccgggcacggtgg
-ctcacgcttataatcccagcactttaggaggccaaggcgggcagatcacaaggtcaggag
-ttccagaccagcctggccgatatggcgaaaccccgtctctattaaaaatacaaaaattag
-tcgggcgcagtggtgggcggctgtagtcccagctacttgggaggctgaggcaggagaatc
-gcttgaacgtgggaggcagaggttgcggtgagccaggatcgcgtcactgcactccagcct
-gggcaacagagtgagactccgtcccgtctcaaaaaaaaaaaaTTCTGGAAAATTACATTA
-AAATTTAAAATTTACTCATTATAATGCCATTTTTCTAGATTACAGGAGACGTTCACTTTT
-CGCCTTATATAATTCAGTATAAggccgggcgcagtggctcatgcctgtaatcccaaaact
-ttgggaggccgaggcgggcggatcacttgaggtcaggaattcgaggccagcctgaccaac
-atggcgaaactccgtctctactaaaaatacaaaaattagccaggcgtggtggcacgcacc
-tgtagttccagctactcaggaggctgaggcaggagaatcgcttgaacctgggaggaggaa
-gttgcagtgagctgagatcacgccactgcactccagcctggtgacagagcgagactccac
-acacacacacacacacacacacacacacacacaaacacaaacacCATATATATACATATA
-TAACTTTTGTAATAATAAAAAACATACTTCTACTTAAAGAGAATATCAATAAGCCCTAAA
-GTTTTTCATAGTGAAAGCCCTTCAAAATTGCTTGACAAATAAATTCTAAGTATACTAACT
-ATGGGAAAAATGTATGCTTGCGAAGACTTTGTTAGACACATTTTCTTAAATGCTGAAGCT
-ATAATTTAAAAATGAAGATTTCAGGAGACAAAATAAAGTCAGCTGGATAAAAAATGTGCA
-GAGAGAAAAAATATACCAAAATGTTAAGAGTGAGTGTCTCggccgggcgcagtggctcat
-gcctgtaatcccggcactttgggaggctgatgcgggcggatcacggggtcaagagtttga
-gatcagccggccaacatagtgaaaccccgtctctactaaaaatacaaaaattagccgggc
-atggtgatgcatgcctgtagtcccagccacttgggaggcttagggaggagaatcacttga
-acccgggaggcagaggttgtggtgagctgagatcgtgccactgcccttcagcctgggcaa
-cagagcaggactctgtctcaaaaaaaaaaaaagaGTGGGTGTCTCTTGGCACTGAGACAA
-TGAATCCCAACAAATTCCCAACAAATGATATTTTTTCCTTAAATTTCAGAATTTTTGAAG
-TTTTACACAATGAATATTTTGTGATCTGAAAATTTTTTCTTCCCCTCCTCTTCCAATTCA
-ACAGCTGAATAATAATCTtgtgttcattgtctgctactgcttaagacattctttccagac
-ttagaggcttaacaaagcaaacagctaccatctcacagtttctgtgggtcatgaatccac
-gcagagtttagttgcatggttctggctcagggtcattcacgaggttgcagttgagatgct
-ggtcagggctgcagtcatctgaagacttgactggggctggaggatctgattccaggatgg
-atcgatcactcagatggctgttggaagtaggtctcagttccttgttggtgttggcaggag
-gcttcagtttctcaccacgtagagctttccacagggctgcttgagtgccctcgcatgaca
-gctgacttctcccagaataaatgatacaaaataagacagccaggaggaaaacatagagct
-ttctatgtccaatcttagatatcacaaaccatcacttctgccatattctattagttagag
-gcaagttcacacttaactgggaaggggaggaggaattaggctcttccttttgaaggaagg
-aacattaaagaatttgtgaaGggccgggcgcagtggctcatgcctgtaatcccagcactt
-tgggaggctgaggggggcggatcatgaggtcaggagattgagaccatcctggctaaaacg
-gtgaaaccctgtctctactaaaaaaatacaacaaaaattagcagggcgtggtggcaggcg
-cctgtagtcccagctactggggaggctgaggcaggagaatggcgtgaacccgggaggcgg
-agcttgcagtgagccgagatggcgccaccgcactccagcctgggtgacagagcaagactc
-catctcaaaaagaaaaaaaaaaaaagaaTTTGTGAACATGTTTTTGAAACACAAGAAAAT
-ttccagctgatctttccccccaaatttccctcctccaatccaactacaacacatgaaact
-ccttaatcttgctgaagcgtacctctgatcatgtcatcctgcaataaaaaaactgtccct
-ggctccccacaacccagggaactccataacttggcttctgaggaccaactaccgtattgc
-ccttcagctccagctcaacataaacgcatcgtattcctcatgtacactcccccatctctg
-gtcttggcacctatccatgccctctcaatacctcgtcccagtctccttcccatctccagt
-cccttgcacttgctgtttcctctgcctggaatgttttacatggatggttcttcgtcatct
-tgagatctaaactctcccccatctctatcatcccccgtcccagtcactcactctctcatt
-accttgttttcttttcattgtcgtttgagacagggtctcactctgtcccacaggctgggg
-tgcagtggtacgatcacagctcactgcagcctcaacttcccgggctcaaacgatcttcct
-gcctcagcctcccaagtagctaggactaaaggcacaggccatcacacctggctgttttgt
-attttttgtagagacaggcttttgccatgttgcctaggctggtcttgaacttctaggctc
-aagcatctgcccacctcagcctctcaaagcgctgggatttcagatgtgagccaccttgcc
-cagcccctccctcccttctttccatcacccagtctggggtgcagtggcaccatcatagct
-cactacagcctcaaaatctctggcttaagcgttttcccacctcagcctccccagaagctg
-agatgacaggtgcttgctaccatgcccggctaatttttgaatttttgtggaggtgggatt
-tctctatgttacccaggctggtctgaaactcctgggctcaagcgattctcccgccttggc
-atcccaaagtgcagggattacaggcgtgaaccaccacacccagcccagctttattttctt
-tatagcagtcacaactatctgaaattatcttatttgtttacctgctcttttctgttgccc
-tcacttgctccttaagaacagggacctctgtcttggtcactgctgtaacccagtagcccc
-agttccaagttcactgcctggtgcacagtaggtggccaataaattgttgaattaaATGTC
-CTCTCTTCCAGGGAGTTGTTTTAGAAAGAATCACACACTGCATAAATGTCTGTTGAGGAA
-GAAAATGAAAAAAACAAAAGTGAAGACATTATCTTCTCGGCTGAACTTCCCACACCATCT
-TCTCTGTCATTAATAAGTCCTGGTGTCTACACTGGGGAAGGCAGTCCAAGGTTCTTCCAG
-GGCCTAGGTTCAGCCAGACTTTAACCATCTCTAGCTCCTCAGAGTCCGTCAAAGGGCCTA
-AGGAATGGTAAGTATTAATAATGtttgtttatgtatttatttatttatttattttgagat
-aaagtctctgtctcccaggccggagtgcagaggtacaatcattacaacttccacctttcc
-ggctcaagcaatcctcctgcctcagcctgccaagtagctaggactacaggcaggcaccac
-cctgcccagctaatttttgtacttttttttgtagagtaagggtttcaccatgttgcccag
-gctggtcttgaactcctggccttaagtgatctgcctgcctcagcctcccaaagtgctaag
-actacagctgtgaaccactgtgcAGGGTCAAATGTTTATTAATGGATGCATGCATGGATG
-GAAGAAGGAAAGGAGGCAGGTGTGAATAATGAATGCAGCATTTTCACTGCTGAGAATAAA
-GAGTGAAATCCTGGTCCAAATCAGTTTGGCAGTGAGTAAGGTTAGGAACTATTCACATAC
-ATTGGAATAATAATAGCAGCAGCAGCTACAGGGTCAGAGACAGATCTTTGAGAGGCCATA
-AGCATTGAAAAGATTGTGGTACCTATCACACACCGTCTAAAATAAAACAAATATTTTATT
-TATGGGAAAAGTGTTAAGGTGTTGATAATTCCAAGAAAGCTTTTATTTGTCCTACAATCA
-TTACTTTGATACCTTTTCTGAAATCCTAGAGCTGTCCCCACTCTGCCCATTTTTTTTTCT
-CATTATGGTGATGTCTCTGGGTTGCTGGTGACCTGCGTAACTATTGGGAAATCTAGTTTC
-TCAAAACttttagtttttttttagacagggtctcactctgtcactcaggctggagtgcag
-cggctcactgcaacatccgcctcctaggttcaagcgattctcatacctcagtctcctgag
-tagctgggattacaggtacgcgtcaccaagcctgactcattattttgtacttttagtaga
-gacaaggtttcaccatatcggccaggcggatctcgaacttctgacctcaaatgatccgcc
-cgccttggcttcccaaagtgctgggattacaggtgtgagccaccgcgtccCGTCTATCAT
-AAGTtttattgaacattgcctaggtatcaggatgtgtttacatgcattatctcatttaat
-ctgtaaaaccaccatgtgagggagaaactgaattatccccattttcaggataaggaaaag
-gaggGACTGGGAATGTGAACTCAGGAAGTGTGACTCCATCGGGTAGACTGCTCAGGCTGC
-AGATGTAAAGGTTTTACACGTAGGCTTTTCCAGATCTCAGCTTCTGAAAGGCGGAGGGAC
-CGTTTGGACGGGAGCAGGGCCTCCTCTTCCAAGCACCCTGTGCCTTTAAGAGTCGCCCCC
-TCCCTCCAGGGATGCTCCAATTTCTTTCTCCCCACCACCCCCACCCCGCCCCCCGCGCCG
-CGGAGCCGCACCTCGGTCCTTCCTCCCCGCCCCACACCCTCAAGCTCGGCTCTTGGCCTT
-CGCTCGTCCAGAAGTGGGTGAGCTGTACCGCCAGAGGCGCATTCTCCTAGCCCCAAACCA
-TGCCCGCTACGCCCCAGCGGAATGCCACCTTAAAGACCCTAATCCGGGCACCTCCCAGCT
-CCTGCTTCCCAAGGGCGAGGCCTCAGCGCCCCCTCCCATCGCCCATGCTCACGACGCCGT
-GAAGGTGACCTCCCCCAGGGGCGGCACACGCCCAGTGGTGCCCGAACTGGCTCACACGTG
-GTGAGCCGGGAGCGCGCGGCCCCTCCCCGCCACGCGCCTCGTGCCGGCCACCCGGCCACG
-CCCCCAGGACTGGCTCCGCCCCGTGCCCCTGCACGCTTCTCCAGGCTTGGGTGGGGCGAC
-GCGCCCAAGTCGGGCACCGGGCAGGCTACGGGGTGGGGTAGGACCTGGGAATGGCGCACC
-CACGCATCCTCGAATGTCGCCTGCGGTTTGTGAAAAGCGGGAAGTCCGCCCAGCTCAGGA
-CCTTTGGCTGGCAGGCGAGGTGCCCCGCGGCCCTTGGTGCTGAGCAGGGGAGAGACAGCT
-GGGACCGCGAGCCTGGGAATCGAATCCTAGTCTGCGTGTCCTCGGTGCTTCCTATTTGGA
-AACTGGGCATCATATTATCATATTCCCTTCTCCCTCCGGATTCTTATGGAGCTTCGAACG
-AGATTAAATATACATATATATGAGAAAGGGATTTGTTCACTAGGTCCAAAAGCATTTGCT
-GGTCCCATATGTGGTCGGACCCTGTGTGTAGTAGGCGGGGGGCAACATCTACGACAACCT
-GAGTTCGTCCCCTTAAGAAGCTTTCCTGAGTCTTGGGCCCCCCAAATTCTCTTCTGGGAT
-GGTCCGAAAAGACGTCCCTGAAAGAGGAAAGGGCGGAAATCCTACCTGACGGCAGGTGTC
-TCGGAATGAGCTAAAATTTAAAAGGCAACGCGGGGCAGGGACAAGCGTCCAGCGTCAGAT
-GGAAGCAGGCTCGCGTCCCCTACCCTTCCTCCAACCCCTAACCTAAGAAAAGAAACCGAT
-CTCGCCGGTCTCCCCCAATCCTAGCCGCGAGACCGCCCAGCCCCGCAGCCCGAGCCCCGC
-CCCGCTCCGGCGGCCAGCGATTGGGAGATGCAAATACCGGCTTCTCTGCCCAGCAACGGG
-TGACGCGGCGCCCGAGCGCGAGGCGGGGCCCGGCCGCAGCCCAAGCGGGCACCTCGGTGT
-TTACAcggggcggccccgcgcgcgccgcagcggcccgcagacggcgagggggaggggtgg
-tgcgcgcgccggcggggccgcgcggggAGAAAGACACTGAAAGGCGTcggcggccgggcg
-gggagcggcgcgcgcgggccgcggcggAGCCAGAGGCTGCAGGAAGAGCCCGCGGGGGCC
-CGGAGGGTGCGATTCCTCGGCCCCCGCAAAACAATGTGTGTTGTGAGCCAGGACGCAACT
-TGCCGGAGGCGGCGGGGGCGCGCCGAGCCCGCCTGAGACCGCGCTGACCTTCTCCCCCCG
-CCGTCCGTTGGGCCCGAGCGCCCAGCTCCTCGCTCCCCAGTTcgcgggggccgggccgag
-ccgcggggcggggccgccccTCCGTCGCCGCTGCCTCCTCCCCCACCCCCAGCCGCGGAG
-GATGCGGACGGCCCCCGGCGGCGTCTAGCGGCCCCGGGCCCAGGCGCGATGGTGCAGCAG
-CGGGGCGCGAGGGCCAAGCGGGAcggcgggccgccgcccccgggacccgggccggccgag
-gagggggcgcgcgagcccggcTGGTGCAAGACCCCGAGCGGCCACATCAAGAGGCCGATG
-AACGCATTCATGGTGTGGTCGCAGCACGAACGGCGGAAGATCATGGACCAGTGGCCCGAC
-ATGCACAACGCCGAGATCTCCAAGCGCCTGGGCCGCCGCTGGCAGCTGCTGCAGGACTCG
-GAGAAGATCCCGTTCGTGCGGGAGGCGGAGCGGCTGCGGCTCAAGCACATGGCGGATTAC
-CCGGACTACAAGTACCGGCCGCGCAAAAAGAGCAAgggggcgcccgccaaggcgcggccc
-cgcccccccggTGGTAGCGGTGGCGGCAGCCGGCTCAAGCCCGGGCCGCAGCTGCCTGGC
-CGCGGGGGCCGCCGAGCAGCGGGAGGGCCTTTggggggcggggcggcggcgcccgAGGAC
-GACGATGAAGACGACGACGAGGAGCTGCTGGAAGTGCGCCTGGTCGAGACCCCGGGGCGG
-GAGCTGTGGAGGATGGTCCCGGCGGGACGGGCCGCTCGGGGACAAGCGGAGCGCGCCCAA
-GGGCCGTCGGGCGAgggggcggccgccgccgccgccgccTCCCCGACACCGTCggaggac
-gaggagccggaggaagaggaggaggaggCGGCAGCGGCTGAGGAAGGTGAAGAGGAGACG
-GTGGCGTCGGGGGAGGAGTCGCTGGGCTTTCTGTCCAGGCTGCCCCCTGGCCCGGCCGGC
-CTGGACTGCAGCGCCCTGGATCGCGACCCGGACCTGCAGCCTCCCTCGGGCACGTCGCAC
-TTCGAGTTCCCGGACTACTGCACCCCCGAGGTTACCGAGATGATCGCGGGGGACTGGCGC
-CCGTCTAGCATCGCAGACCTGGTTTTCACCTACTGAGCCCACCGTCAGCGGGGCGCGCAC
-GCCCCCAAACCAGCTGTTTACATACAGGAATCAGGTATTGGGGCCCCTCGGAGGCCGAGG
-CTGGCACCCCATCTCCCGCGCAGCCTGCCCCCTCCTGGACGTGCCCATCCCCCCTCAGAT
-CCAGACATGCCCCTCCCCCGCAGACACACCCCAAGGCAGCCCAACCCCCACCCCTTCCCC
-GACACCCAAGCCCCTCCCCACGTCGCCCCCTCCTGCACAGCCACCAGCAGCCAGCCCCCT
-CCGATACACCTCCCGTCCTCTCCTACAGACCTGCACCCCTCCCCCCTTTTGCACACGCCC
-CTCCTCGTGGCCGGAGGACCCGCCCCCTCCTTTGCTCCGGAATCTCTCCTCCCTCGCCCG
-GCCCGCCTTCTCTGGGTTAGGGGGGCGATGCGGCCGGGTGGCAACGCACGCGCCTCCTGC
-GCCCCTCCCTTCCCTGGGGGGAGGGGCGCACCCCTTTTATCCCCGGAGCGCTAGGGCCCG
-CCCCTCCGCTGGGGCCCACCCCCTTCGTGCGCATGCTTAATGCTTCTGGGGAGGAGGGGG
-CTGGTCCCAGCGGAGCCGCACTCTTCGCCCGCTCCGGGCAAAAGCGGGGGCGAGTGTAGA
-GCGATCCTGGGAAATCCTTTGATCCGGGAGCCCTAGGTTTCCTCTCCAGCCAACGGGGCG
-TCGCTGCCTTAATGGGAGGAGCACTCGGAAGGGTTGGTTTGGGCCTGAAACTCTCCCAAG
-TGGCATAGCCCCTTTTCCGGTATGGGGTCTCCTACACCCACGCGCACCACCTCTCCGGTC
-GCGTGGCTGCCTCTACAGCCTACCTATACGTCCCTTTTTCCCCCCAACTGGGAATTGAGA
-GGTAAGGTCTTTCTCTGGAAATCCAGCAGTAGAGGAAGGGACCACCCAAGAAAACTAAAA
-ACCAAGGCACCTTACCAGTCTGTCTGGGGACAGGATCCCTGCTGCACCTTCCCCACCCCC
-TCCTGGGAAGTGCCCCCTCACCTCAGGGCACCCGCAACCTGGGCTCCTCCCTGAGCGCAC
-CGGCCCTTCCTGTCACCCAGGTCCACCCTCAGTACTCAAGCTGCAGTATACAGCGGGAAA
-AACTGAGGCACTTTGGTGCTAGGGGTTTGGGACTGAGGCGTGGAGAGCAGATGTGATGGC
-AGGAAGACTCTCGCTTTTAAACATCTGGTTTGGGAGAGACCATCGACTTGGCCAGTGAGA
-CTGAGAATGGATTCCGAGTAGTGATGGGCCGTTTGCACCTCGGTTTTTCCACGTGAGAAA
-TGGGGAGAACGCTGCTGTTAGGAGGAAGTTGTGTCCAGTTCAGGGTGCCCTCGGGAGCCC
-TGTCCCTGTTGCTGTGGCCCCTCTCACGCCGCCATCTCTCTGCCCCGCCCCGCCCCTCCG
-GCCTCCCCACACCCCCCTTGCCCTCACTACCTGTATCTCACCGGCGTGTGTTCACCCTCC
-CGGGTGGCTCACACACTCTCATTCACACACACAAATCTCAGGAACAAACGGTCCCAGAGT
-CCTCCGGACCCCTGCCCAGGGTCTCTGCAGGTCTCTGCCCCACGCGTTCCCGTCGCTGAC
-AAAGCCACCAGCTGCCTCCTTTAAGCTTGGTGCTCCGGCTCTGGGCCTTTCTTGCGCTCT
-AttttttttttttttttttttAAGAAAAACAACAACAACAAAAAAAGACAATGAAAAAAA
-AAACGTCATGTGAGTGAAGAGATGTCACTGTCTGTGGTCTTGGAGAACTAGTCTCGTAGC
-TGAGGGGTGGGGTCCCTCTGTCTGGGGCACTGGCACCCACAGCAGGACTCCGCCAGTCTG
-ATGCCAGGACTGAATAAAGTGTATTTGCCCCGACCTTGCCCTGTGGTTCTGCATGTCTGT
-GCTCTTCCTCAACCCTCCCTAAACAGTTTGCCAGATTCAAGTCCGTGTGATTTGGGCCCG
-AGCTGGGTGTCCCAGGGCAAGCCACCTTGCCTGTCTAGGCCTCTATGTCAGGACTCCCTG
-GCCTTCATGaagaatagcaaactcatccctgtagggaccaggcaggtaacatagacgagt
-gactctgggtggacagtggtgtcatgacccacttcaaggggcctacctcctgccagttgt
-gaccctgtgggaatgcagtccacagtggccaggtggccagatttttcaagaaaagctgga
-tggatgtttctgagtcatcttaatttcaaaatgagactcatattttaaaatttctgtggg
-ccaaatgaaacaagtatgcaggcaggtctggtccgagggGGCTGGCTTGGCCATGCCTTT
-CTGTGCCTTTAATGAGgactaagaagcaagattgggccacactgtctggactcaaagccc
-agctccaccactgagcacccgtgtgactctttccatatgtataacgtggggataataata
-atagctgcttcacaggatGAAATGAAGTTTGAGGTGAGAAGCATTCACCATGGTGCCCAT
-CGTGTTACTCCATTGTCAGAGGAGGAAACGGGGTCAGGCAGGAAAGCAACTTAAAGGAGG
-GCCTGCAAGCAGCCAGGGTCAGAGACAGGGCTTGGTTCTGCTTCCTGGTGAAGCATGGCT
-TCGGGGTGCTGCCTCTCCCTCCCTGTTTGAATCTGCAGATTGTGTTAGGCCCCCAGCTGA
-GGGCCTGGAGTGGTGGGATTGGTCCCAGTGCCTGGCGCACATTGGCCTGCAGAGTAGATT
-AACTGAATGACCAAAGAGCAACAGAAGTCTAGTGATTCTTGTCTTTGAGGTTCTGACTGG
-TGTTTTACAACTGAGTCCAAGGCTTTTCCCTCCTTTGTCCCTCTGACACCCCTCCCCCTA
-ATTCTCATCTGTCAGATCCAGTGTATTCCTAAGCTGGGACAAAGCCTCTGTTTTCCCAGT
-AGGAGCCAGGGCTGAGTGTGGAAATTACAGTGACTGCTTCTTCTCAGCTTCTCTGGTTGA
-AAGCAAGCTGGCGAAGTAAGAGGAGGTAGAGTTGAGAAGGTGTGGAAGATAGGGACAGCT
-GCCCCCAGAACTCCCTTCAAGGGAGGACTTccccagctatgggaagtgccatcagggtgg
-ccgcagctgcagagagccacttcacctgagaccacgcccttcctggggcagcctgtatct
-ggtgtctgagtgaggcatggtataaacacctggtcatttcaatccaacatgggacggaca
-ctgacagacagtactcccagcaggcccaggccagccagggcttcgtcaggcctgcagcac
-aatttgacttcctatgcccaggcctgcttcctcttcttcctcttcttttcacaggtgctt
-attcctaataaacatcttgcaacccaaactcagtctcattgtctgtttctagagaaaccc
-agtctacaacaGAGGGTTCAAGAGACTGGACAAAGGGAATTGGGTCAGTGGCCCAGCAAC
-TGCAGCTAGGCCGGTCGGATGTATCCTAATGTCAAGAGTCTGTTCACCGATGCCATCAGC
-ACCAAACTAGGGGCTGCACACTTTCCTAGTCTGCACACCAGTCACGTCAATTAGAGACTC
-CAGCCTCAGCCCGAAGGCCTTCCAGGGCCCCCTGCTGATGCCATTCTCACTGCCAGTCCG
-TCCCCTGGTAAAAGCAGGTGGGAGGGAGGTCGTCATCTGAGTTTGTCTTACAGAATAGCC
-TGGAATGGGGTGCACGGTAAAATGCCTGACCGGAGATAATGCTAGAgctgtggaaccttg
-ggcaagcctcttcccctttgtgggcTGTACTGGGAGTCGGTAATAGGACTAGAAGAGGGA
-CCATCTCATTTTGGTTCCTTCCATTTCAGATGCTGACCTGAAAGGTCGGGGAGACAGCTC
-CTTATGGGGTCTCTGGGGCCACCTAGTGGCTAAGAGGAGTAGAACCAAGGTTCTGTGCAG
-TTGGGAGGTGGGAGTCGGGGTGTGTCCCAGGCCAAGGAACTGAGTCCCACTCGAGTCTCA
-CTCCATTCATGCATTGACTCATTGCTGGGTCATGCCCCTTGCCTGGGTGGTGTGAGCCAC
-CCTGCTTCCAAGGCTTTCAAAACACCATACGCTGAtgtattgtttctcatctattgctgc
-gtaacaaattgccacaagcttagcagtgtaaaacaacatgcatttgttatttcagtctcc
-atgcatcaggagtccagcatgccttagctgggtctctgctcaggatctcacaaggcagca
-gctggggtgctggtggcccgcattccttcttggagctcagcagccttttccaagctctca
-cggtagtgggcagaattcagttctttgtgcttataggacagagatccctgttctattgct
-ggctgtcagttagtaccactcttgattactacaagctgctcagtttcttgccacatggcc
-cccacagggcctccccagccttctcacaatattgcaacttattttgtcaaggccagagga
-gaatttttctgctgcttggagtcacttggctcagggaaggtttaagctctcttttaaaag
-cctctcctggctgggcatggtgtgttcatgcctgtaatcccagcactttgggaggccaag
-gtgggtggatcacctgaggtcagcagttcgagaccagcctggccaaatggtgaaacccct
-tctctactaaaaatacaaaaattagcctggcgtggtggcagtcgcctgtaatcccagcta
-cttgggaggctgaggcaggagaatcactcgaacctgggaggcggaggttgcagtgagcca
-agaccaagccactgcacttcagcctgggcgacagagcaagactctgtctcaaaaaaaaaa
-aaagaaaaaaaaggaaaaagagagagagaaaaaaaaagccttccctaattaggtcagact
-cacccaggaaaatctcctttttgattaggcatcaactaatgtgggattttatatctgcaa
-aaaatcccttcacctttgcagtatattgtagccttataagagtgacagctgtcatactag
-atttgcccacactcaaaagggaggaggctgtctagggcagctacaccagagactgggaat
-cttgggggccatcttagaattctgcttatcacacacctgtaatcccagcacttcgggagg
-ccaaggtgggaggatttcttgagtccaggagttcaagaccaacctggccaacatagcaag
-acctaatctctagtaaagttttttttaaaaaaattagccaggcacggtggtacacacctg
-tagtctcagctacttgggaagctgaagtaTCATAgctgagaattctcaggtctacatctc
-catcccagacatgactagactagctgccttcttgtcatctccactgatatatctaattgg
-cacctcaaactggacatgccaaaaaatgaactgtttccacagtgctcccaagcctgcttc
-cacagaccacatctgcacagctgatgtgaaatgaaaggctaaagcctctcagttatcctt
-gatgcctcttttcctcccagcgccatctcccttataccctgttggctctaccttcaaaat
-atgccctgtgtcttgtcacttctcacatcttccatggcctctgggtccaggatataaggg
-catacgaagggctccttgcgttttcctttgccccactcatagtcttattgtccacacagc
-agccggagtgatctggttaaactgtaaatcccagcacaccctgccactgttcaaaattct
-ccaaagactctcattcagtagaagccagagtcctcagcatggcctgcaaagccccataag
-aagtagcctgtggctcagcctcggcttcatcttctactttttctgtttctcacatgccca
-gtcacactggtcttgctgttcctcaaaagtgccaatcacacttccgcctgaaggcttttg
-cacatgcttttccctctgcttaagatacccttcctccggctgggcgaggtggctcacgct
-tctaatcctagcactttgggaggtccaggtgggtggatcacctgaagtcaggagttcgag
-accagcctggccaacatggcgaaaccccttctctactaaaaatacaaaattagctgggcg
-tggtgacacatgcctgcagtcccagttactcaggaggctgagacaggagaatcacttgaa
-tccaggaagcagaggctgcagtgagctgagatcgcatcactgcactccagcctgggcaag
-acaaagcgagacttcacctcaaaaaacaaacaaaaaaatacccttcctccagatagccac
-atgtcttacttccttcaggtctcagctcccagggcgccctagagtaggcacagggagtac
-ctcacagtgtcctccctgaccatccatataaagtaacatcctccataaactatcctgtta
-ctttgctttatttttctgaatagcatttatcactatctggcatttatcacctgtagtttt
-tactttttgtctctctctctctaatttgtatgtaagcttcataaggaaggaatgactctg
-GACTGGACTCCATGCCTCAGCACATTCACCCACCCATTCAACAAACATTCTTAAGGGTCT
-Aggctgggcatggtggctcatgcctgtaatcccagcactatgggaggccgaggtgggagg
-atcacttgaagccaggagtttgagaccagcctgggcaaggaaacaagaccctgcctctaa
-aaaatacaatttaaaaaagtatccaggcacagtggcgtgagcctatagtcccagctactc
-gggaggctgagctgggaagatctcttgtgcccaggagttcaaggctgcagtgagccatgg
-tcatgccactacactccagcctgggtgacagagttagaccctgcctgtaaaaaaaaaaaG
-GTGGGGGGCAGGGTGGGgaaggtttgccttgaccaggccgcgtgctaggtgccgggcata
-caaaagtgaaaaacgtgatttgtcctcagtgagctcacaggtctgaggagacacataaac
-ccaggaatggaaatgctttgctggcgatggacagtgagtctgggagaacattgaggagat
-gtttaacccagacaatggagtggggtgtggtcaggtcattccctggaggaggtgatgttt
-aagctgtggcatgaaacctcagtaggatgtgatgaccttagaacatggctacacgttctt
-tgacattcctcctttaaattaccttccctttgaatctgggctgggccttcatgatccatt
-tgtaaccaacaggacacagcagacatggtgctgcaggatttccaaggctaagtcacgctg
-aaccgccatgttgaaaggccaacagccaagactgccatgtggagaagcagcccgggccac
-gtgggaagaccatgtgtaggtagctgctccagttgacagctgagcccaggcaccagactt
-atgagttgagaagcttccaggggattccagcccctcataattcaactcactcccagctgt
-tggagggccttcccagcagaggcccagccatcacagagcagagacaagccatcccttcta
-tatcctgtctgaattcctgacccagagtccacgaacataatgagatggcagttgtccaca
-ctattaggttttggggcagtttgttatgaaggaataactggaacaataggataaggaaga
-gtgaggtgaaggaaaggactttacagatgccagcaacagtacatgggaagacctggtaag
-agtggctgacacagaagctaaccagcttgcggggaaggtgtggagagaggagggtgacag
-gcaagagtgagaaggaCCTTGAAGGTATTTGGACTTTATCCCGAGTCTTCACACTGCAGC
-CCAAGGGGTCAAGGAGTCtttttttttgtatggtaaacatggggtcttgctatgttgccc
-aggctggtcacaaactcctggcctccagagatcctcctgccttggcctcctaaagtgctg
-aaattacaggtgtgagacactgtgcccagccTCCAAGGGGtcttctcttttttttgagac
-cgcgtctcgctctattgcccaggctggagtgcaatggcgcaatctcagctcactgcaatc
-tccgcctcctaggttcaagcgattctcctgcctcagcctcctgagtagctgggactacag
-gcatatgccaccacacctggataatttttgtatttttagtagagacagggttttaccatg
-ttggtcaggctggtcttgaactccttacctcatatgatctgcccacctcatcctcccaaa
-gtgctgggattacaggcgtgagccaccatgcccagccGGggtcctttgaaaacacaaacc
-tgaccactgctgtaaacctttcgatggccccttactaccctcaggataaaCTCTTGAAAT
-TCAAGGCATTTTGCAGTTGACTCCCTCACTCTTTTATAGATTTATCTTCGGTCACTTTAT
-CCTCAGCTACGCCAGGCCACTCTCCAGTGACAATGCTTCCCGCCTCACCCATGCTATTTA
-TCTTTGCTCATGTGGAGGAATTAgtgggactttgggctaatcaccttgcctttcgaggcc
-tcagtttccccatctgtatgattaggtggttggactagaagtttttgttttgttttgttt
-ttgtttttgtttttttgagaccgagtttcactctgtcgcccaggctggagtgcagtgctg
-tgatctcggctcactgcaacctctgcctcccgggttcaagtgatttttctgcctcagcct
-cccaagtgactgggattacaggcatgcaccaccaggcccaggtaatttttttgcattttt
-agtagaaacagggtttcaccatgttggccaggctggtcttgaactcctgacctcaagtga
-tccacctgcctcggcctctcaaagtgctgggattacaggtgtgagccacgacacccagcc
-ttagatgtctcttaagagcatatctagcctggcattctaggagtctatgaAAAGGAGGGA
-GAAAGGTGTCTGTAGCCAAACCTGCCTGTCTGGCTTCTTCTAGGTTGCCTAGCAATGGAT
-GCCAACCCTCTCCCCCATCCTTGGGGGTTTCTTAGCAACCCAGTTTCTCACCCTCTGCTG
-TTTTCAGGGTTTCCTTTTAACTAAATGTCAAGTTTTGCTCTTTCTCCTCCAGAAAACCTG
-AGGCCAAGGGTCTCTGTGTAGAGCTGGATACAACCCAGAATACACAGAGACCTGGGTTTG
-AGGTCAGTGGAGGATTTGCTGTGTGACTTGGAGGTCTTTGACCTCTCTGGCTTTCATTTC
-AGACTGTGATTCCCTGTCATATGCTCCTCAGAGttcttcttcttttcttcttcttcttct
-ttcctcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttc
-ttcttcttctcttcttctttcttcttcttcttctttcttttcttcttcttcctcttcctc
-ttcttcttcttcttcttctcctcctcctcctcctcctcctcctcctccttctccttcctt
-ctttcttcttcttcttcttcttttgttttttgagacctagtctcactctgtcgcccaggc
-tggagtgcagtggggcgatcccggctcactgcaacctccgcctccctggtacaagcagtt
-ctcctgcctcagcctcccaagtagctgggattacaggtgcacgccaccatgcccagctaa
-ttttgtatttttagtagacacagggtttcactatgttagccaggctgatctcgaactccc
-aaactttgggattacaagcatgagccactgtgcccagccTGttcttttctattttttgag
-atggagtctcactctgtcacttaggctggagtacagtggcacaatctcagctcactgcaa
-catccacctcccaagttcaaacgatttttctgcctcagccaccaaagtaagctgggatta
-taggtgaacaccaccacaccgggctaattttttgtattatttggtagagacgggttttca
-ccgtgttacccaggctggtctcagactcctgacctcaagtgatccgccagcatcagcctc
-ccaaagtgctgggattacaggcatgagccactgtgcccagccctctgtattgttctgatt
-ttagtatatgtgtgctgaaatgagcacTTCCCTCTTCTCTTGTATGCGTTTGGTTTGACT
-ACCAAATTTattcacttttgcaataaaccgtcactgagcacctactatgttccaggcact
-gtcttaaggactggggattcgtcagtgaataaagcagacatagtcccttccctcacagag
-cttatactctagtagatggaaacgtataatgaataaacagataagtgcacataatgatat
-catgcagtgaAGGGGACAAAGTGTAAGGAAGGGCTACTATTTTAGATGAGGAGGTTGTAT
-CAGTCAAGATGGGCTAGGGaagtcagagatggttgggaagaaaaagcctggcttccccct
-ttctccctccaacttcctgtgggtgcctcaccttgggtgacctcagctagaggccagctg
-acaaaggaggctgagtagcttccaggggtcagctctgcaaagcaggaaagagcaaggaat
-ccactggaagcaagaaggcCCAAAAGTACCTTGGGAGGTACGCCGCTTTTTCAGCTCACT
-CACTGCCTGTAAACTGTCAGGGACCCTAGGATCATTAAAAAATATTTTGAGggccgggcg
-tggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggatcacttgag
-gtcgggagatcgagaccagcctgaccaacatggagaaaccccatctctactaaaaataca
-aaattagccaggcgtggtggtgtgtgcctgtaatcccagctactcgggaggctgaggcag
-gagaatcacttgaacccaggagacagaggttgcagtgagctgagatcacaccattgcact
-ccaccctgggcaacaggagcgaaactctgtctcTCTCTCTCTCTCTCTCTCTATCTATAT
-ATATATAGATAGAGAGAGAGAGAGAGAgtagtaaaatacagatagcataacatttaccat
-cttaaccatctttaggtgtacaactcactggatattaagtatagtcacattgttgtgcaa
-ccatcaccatcatccatcttgagaactcttcatcgtgcaaaactgaagttctggatccac
-tatgcactaactctccatttccccctccccctagctcttagcaaccaccattctgctttc
-tatatgtatgaatttgactatggtatatgtctcatataagcagaatcatacagtgtttac
-ttttcgtgactggtctatttcacttcacatcatgtcctcaaggtttatccattgcagcat
-gtatcagaatttccttctttttaaagctgagtaatattctattgcatgtgtatatcacat
-cttgcttatccattcatctgttgatagacacttgggttgcttccaccttttagctattga
-gaataatgttgctatgaaaatgggtttggaaatttctcttcaagatacactgctttcagt
-tcttttttttttctctctgagacagtctcactctattgcccaggctggagtgcagtggca
-caatctccgctcactgcaacctccacttcctgggtccaagcaattctcctgcctcagcct
-cccgagtagctgggattacaggctcacaccaccgcacctgatgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtctgtgtgtgtttagtagggatgaggctttgccatgtttgtca
-ggctgctctcaaattcctgatctcaggtgatccgcctgcctttgcctcccaaagtgctgg
-gattacaggagtgagccaccacccctggcttcagttctttggggtatataactagaagta
-aaattgccagatcatgtggtaattctatttttactttttcaaggaatcactatgtgtttt
-ccatagcatctgcaccatttttcattgttatcaacaattcacagggttccagtttccccc
-tatccttgccaaaacttgttattctgttttgttttatggtagtcatcctaatgggtatga
-agtgACTAGGATCATTTTGAGACCCAAACAGTCACAGGCTTTTTTGTTGTtgttgcccag
-gctggagtgcagtggtgcaatcatagttgaccgcagcctcaacctccttgggctcaggtg
-aacctcccacctcaggctcccaaggagctgggactacaggcacacaccaccacatccagc
-taatttttgtgtattttgtagagacagggttttgccatgttgaccaggctagtcttgaat
-tcctgggctcaagcaatccacctgcctccagcctcccaaagtgctaggattataggcACC
-CAGCTTCATAGGctttttagcccaggcttgtgatttctttgtcagtataattctctgaaa
-aacttaggtttctggcagggggcagtggctcacgcctgtaatcccagcactttgggaggc
-cgaggcggacggatcacctaaggttagaagttcgacaccagcctgaccaacagggtgaaa
-ccccatctctaccaaatacaaaaaattagccaggcatggtagcatatgcctgtaatccca
-gctacttgggaggcggaagcaggagaatcacttgaacccaggaggtggaggttgcagtga
-gccaagattgtgccattgcactctagcctgggcaacaagagtgaaactccatctcaaaaa
-aaatcttaggtttcttatcgatttgactgtagttaatggtactaaaaccatacccacaat
-acttttcaatataTTGTCCTCAAGTCTGCTTTTTCCCTTTGCTTTCTATCCTAAAGCTGT
-CACTCTCAATGTAATGGCAATTAGCAAGAATAACAGGTGGCAGAGTTGCACCTCTAAAGT
-GATCTTGGCTCTGAGAGTTTTTACAGGACATTTTTCACTCAAAGCCTTTTAAAAATCCAA
-TCTCATACTTTAGTTGATTCTAGCCTTGAAGTACTTTAATTGATAAAAAAGAAAGTTCAT
-AAGGTCATTGGGAAGATTAATTATCCCAGCATATAGTAAATGCTCTATAAATGATACCCA
-TCTTTGTCACttttttttttttttttgagacggagtctcactctgtcgccaggctggagt
-ggcacaatcttgtattactgcaacctccgcctcctgggttcaagcaattctcctgcctca
-gcctcccaagcgagtagctgggactacaggcagcatgctgccactcccggctaatttttt
-ttttttttttttttcagtagagctggggtttcaccatattttctttctttctttctttct
-tttctttctttctttctttctctttcttttcttttcttttctttttctttctttcttttc
-ttctcagagtctctctctgtcacccaggctggagtgcagtggcatgatcttggctcactg
-caacctctacttcaagtgattctcctgcctcagcctcaagagtagctgggactacaggca
-tgtaccaccatgtccagataatttttgtatttttagtagagacagagtttcaccacgttg
-gccaggctggtctcaaactcctgacctcaagtgatccacccacctcagcctcccaaagtg
-ctgggatcacaggtgtgagccaccatgcctggACAAATTTTCCTATTTCTTAATAGATAA
-TCCATCTTGTTTTTCTCAAAAGTAGACAGTTTATCAGGTGTCGTGTCTCTCACCTTCCCA
-CCCTACTCACCTATAAACTAATATAACAATAACAGTaacaataaccataatttgctgagt
-tctaattttgttccaggtactttggataagtgtcttatatgcacatctcatttcactctt
-tcaacccctctgagaggcaagtacttaaattatcttcattttacagtcagggaaactgag
-gcacagagtgtttaaatcatgtaagcagtaagtagtggagctaagattcaaacgcagatc
-tgctggactccagagttcAACTTACAGACACTACATTGTGGCTCTTCTTGGTGGCCCCCT
-CCCCTCCTCCCCAGGCTCTCAGAGGATACAGGATCCCTCCTTTGCTAGTCAAGGCCAGCC
-CATCCCCCTGTATATTTGACTTCATCTCTTCCCACTGCCCCAGGATTTCATCCACCCCTG
-CTCTGATATCAGGGGCCCCCTCCCCTTCTGTCCATGGTGTGGGGCTTTTTGCACTTcaca
-cacacacacacacaggtgcacatacatacacacCCCTTCTCCAAACCACTCCACAAAGGG
-CCCCTGCCTCCTCActttcttgccttccacatcacaccctaaattctcctggccaaggtt
-cccactgacctccttgttgccaaacctaagtcctgttgtcccgctgtgtgtctcttatgc
-acttggcaaggctgagcaggtccttcttggaaatgtgtttctttggtttctatgacacAA
-TGCACCCCCACTCCAAAACACACATACACACATCCCAGATTCTTGCCCCCACCCACCACC
-ACCCGCTATCTCTCTAGATGCTTCTGTGGTTCTTTCTCCTCCTCTGACCTCTTCAAATGT
-AGtatggtggttttaaaacatgtccataatttttttttttttttttgagatagagtctca
-ctttgttgcccgagctggatacagtggtgcgatcaggtgcgtgccaccatgctcagctaa
-ttttttttaacttttaagttttttggagagataggggctccctgtgttgaccaagctggt
-ctcgagctcctgggctcaagcgatcctcccatcttggcctcccaaagtgctaggattaca
-gacttcagccatcgtgcccaaccatgtctataaattctttaagactcctcccactgagta
-acagagtctgtttcttccccttgaatctgagccaaacttagtgactcagactacagtaga
-aatgattctatggtgacttgtgaggctgggtcataaaggcaatgtggcctgactcatggg
-agtcctgagctacagtgtaagaggtgtcaacactctcagctgccatgctgtgaggaagcc
-caactggctcatgcagagagacaacatggagaggccttgaggctatatgaagagagatgc
-ttggccagctcccagctgctccagctccccagtgctccggcttccactgtaaccacaaaa
-gagacaccaaggcagaaccacccagatgagcccttcccaaattcctgacccacagaaatt
-gtgaaagatgataaaaatcattggatttggagtggtctgttatgcagccatagacagcca
-aACAGAGGCAtcttaatctgcttgggctactataacaatttagcatggagcaggtggctt
-gacaacacacatttattcctcaggtctgcagggtgaagagtctaagatcaaggtgctggc
-aaattccattctgctggcaaccaagggcctgacttctggtgtacagacgaccatcctatt
-gtagccccaaatggcacagagaagaagcaagctctcaagtctcctcttatcaggctgtaa
-tccctcccaaaggcccacttccaaataacatcaccttaggacttcaacatatgaatatga
-gggagatacaaacattcagtctgcagcaGAGGGCTTCGTTAGAGCTCTGACCTGAGCACG
-CTTCATCTCAATGTCAttgtttttgccagctctacatccactgccctttttttttttttt
-tttttttttttttttttttgagacagagtctcactcttatcacccaggctacggtgcagt
-ggcacgatcttggctcactgcaacctccgcctcccagcttcaagtgattctcctgcctca
-gcctccggagtagctgggactacaggtgcatgccaccacacccggctgatttttgtattt
-ttagtagagacagggtttcaccatgttggtcaggctggtctcaaactcctgaccttgtga
-tccacctgcctcagcctcccaaagtgctgggattacaggcatgagccactgggcctggcc
-ccactgccctttcttacagtaacagtatttcaatttccctttagggaagctcttcaagca
-ggttctcagtccaagaggtttctctgggttaagcactgccagccacccaaagggtgagca
-agtaaccagccaatcagagacactccagtgggttcagtaaatgacatattatctaactgg
-ggtgaggggaatcaacatcagggcttttcctgagactataaggagaaacagattcttttc
-ccagcagttaaatttgaagtctgtggccattttgctaccatatagggaaaatctgcctga
-cattgaagccaacacagatgagggaagagccaagagataaagagaaagatcctgagcatc
-tggatacagccatgcctgaagccagtatcccttgacttctcaattatgtgagcctttata
-ttccctttgtttaaagccagttcaagttTAAAACTGCCATTTCCAGTGAGAACAATTCCC
-TATGTTGTATCTAAGGCCAAGACCTTGCCCCTGACTCTAGGCCAGAATGTCCTGTACAGT
-GCCATTCAACTCTGCCAAAAGCAAAGGGCATCAACTTCTCCACAACCTGGCTTTCCCTCA
-TCTATTTTACATCTCTGTTAATGGGAGCATCACCCACCTGACCTATAAACATAAAAGTCA
-GCCTCTATCctctctgtctctctccctctctctgtctctctctctctctctcAATCCCTG
-TCACTTCCCTTACTTCTTAGTAACCAAGTTCTGCCAACTTAACTTTATGGACATTTTTCA
-CACCTGCACCCTCCTTTCCATTTTTCCTGCCCACTCCAATTCTTCATCATTTCTCACCTA
-AATTTTTACAAAATCAATAGATAACTAACATAGAGGTGTATAGTAAAAAGTGAATTTCgg
-ccgggcacagtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcagatc
-atgaggtcaggagatagagaccatcctggccaacatggtgaaacctcatctgtactaaaa
-atacaaaaaaaaattagctgggcatggtggcatgtgcttgtagtcccagctactggggag
-gctgaggcaggagaatcgcttgaacccgggaggcggaggttgcagtgagctgagatcgca
-ccactgccctccagcctggtgacagagcgagactccatctcaaaaaaaaaaaaaaaaaGT
-GAATTTCATTCCCACCCTTGCCATCAGTTACCCTCCCCCAAGGCATCTACTGTTACCTCT
-TTCTTGTCTATTTTCCCAGAAGTTCTCTATATGTGCCATCTTTTTGAGAATTTcaaatgg
-aggcatactatcaagacttttcagaacactgcatccttcttcacttgaagtgtgattaat
-ataaataattatagactaatttcttctttctaatggatgcatagtattccacaaagacat
-ataatgtacataactcgtcttccattgatggatatttaagtggtgtcccagttatctgtt
-agcacagaacaaaaccccccaaacctagtggtataacacaataaccacttgaatatgctt
-gtgggttctgtgtgtcaggaattcaggcaggacacagtgaggccagcttgtttctactct
-gcaatgtttgagtcttcagctaggaagatttgaagatttgaaggctgaagctgattcaaa
-tggctggccactggaatcatcttgttcttccccttccccttcgccttctacagtgcaatg
-gcatgatgtcggctcactgcaacctctgcctcccgggttcaagcaattctcctgcctcat
-cctccctagtagctgggattacaggtgcacgccaccatgcccggctatttttgtattttt
-agtagagacggggttttgccatgtggccaggctggtctcgaactcctgaactcagggtat
-ccacccgccttggcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggcct
-catctggttcttcttcactcacttcttttatgcttgaactgggatgactcaaagctaagc
-ttagctgggactgtggtgccttcatgtgtcctctcctgatggtcttggcatcctgacagc
-atggcagcctctaagcagacatggagccctaggtaggcatggtgcctcaggctccaagag
-ctagagttctagcagaagttgcctgtacttttatgtctggaccttagaagtcagagtgtt
-acttccaccgtactccattggttgaagcagtcatcagctcacccaagattcagagagggt
-acaaggatcccacctctctacagaggagtgctaaagaatttgtagctatattttaaaacc
-accacaggttgtttccaatctgtagctattcctgtagttcattttacaggctaacatctc
-ttgaatgtcttcatttctctgcaccaggccaagacactgtcatctctgatctctttgctg
-atctcttgctgtcactcttgtgctcaacatgctgttctcttgacagcagccagaggtctt
-ttcagaatgaaaatcagatcacatcccacccctcttcataacccttccatggctccccac
-tacccttgggctgaagctcaaactccttaccttggcttatgaggccccacaaggtctcac
-ttctgcctgcctctccaatgccatctcctgtcacCATTTGGGGCCTTTAGTTTTGAGCTG
-CAAGAGTTCCTCCCATcacacacacacacatacacacacacacacacacttaaatgagta
-agtaaatagaacatacaaaacgcttaaacactttgcacatagtgagcataataagtttgc
-tactattATTAGACTGTCttcagtaaatatttactgggctgcctactcagtgccaagcac
-tatgggaggctcacagatacaacacgaacaagaAATATGTGGCCTTggccagacgcggtg
-gctcacgcttacaatcccagcactttgggaggccgaggcaggtggatcacttgagctcag
-gagttcaagaccagcctgggcatcatggcaaaaccctgtctctattaaaaatacaaaaaa
-ttagctaggcatggtagtgcgtgcctgtagtcccagctcctcaggcgactgaggtgggag
-gatcacctgagccttgggagatcgaggctgcagtgagccgtgatcatgccaccgcactcc
-agcctggacaacagagtgagacgctgtctcaaaaaaataaaaattaaaaaaaaagaaaaa
-GAAAAACTAAAAAGGAAGATGTGGCCCTATCTTGccgagctcattcttctgtgtgtcccc
-agcccctagcacaaggagaaacagaatagatgctcaaGACACAAAGGCATGTCTGTGCAA
-GGGTGCTTGAtgacggttggaggggcacaatgactttcccaagatcacacagcaaatgtg
-ggacaaaatcaagGCTGACAGCTCATGACAGGGTGGGAGGCAGATGCAGCTGCCTGGCAC
-AGGCTGGCTCTCCAGGGAGATGGGCAGTGGGCACGCATTGCCCAGGGCAGAACTGGGGCT
-AGGGGAGGAAACAACAAGGGAGGCTGTCATTAGCTCCTTCCAAAGTGGAGGTCACTTCTC
-TCCCAACCCCGAGTCCTCCACCCAAACTCCCTTCTCAAGGTACAAGGGCTGATCCCGTAC
-CAGGGATGGGTAGGGACTCAAAGAGGAAAAGAGGATGAAAAGAGGATGGGGACTGAGTGA
-GATGTGAGGACTCCAGAGGGATTAGCGGCTCTCAAGGCAAGTGGGAGGGGACTTCCCGGT
-AGGAGCCCGGAGACAGATGGGAGCCTGTGAAGAGGGCGGGGGCCCGGCGAGGAGAAGCGG
-TTTCTACGCTGGGGTGGGGCTCCATGAGGGGGATGGAGACCTGGAAAAGGGACTGACGGT
-GCAGCGAGGAGAGGAAGGCTCGGTTAAGGGATGGGTCTTCCACGGGAGGGGTGGGGAACT
-GCGGGAGTGACGGCAGCTTCGGTGAGGAGTCTGAGGGGCTGCGTGAGGGGCTGGGGCCCA
-GGGAGTCCGAGGGGTCTCTGTGAGGGCGCTGGGGTGTCCGAGCGAGCAGGGAACTCTGGA
-AGGGGACAGGAGCCGGGGGAGCTGCAGGCGGCCGCCGTCTGCAGAGCCAGGCCCTGAggc
-gggccggcgccccctcccccgccccgAACTGCGGCGCAGGCGCGAACCGGACCCGCCTTT
-GCTCGGCGGAGACAGCAGGCAGAGAGGTGAGCTTAGCCCTGCCCCACGCGCGGCCAGGCC
-CCAGCCCCAGCCCCTGGAGAACCCCCGCGCTCTGCCCGCATCCTCAGCCCGGGCCGTGTC
-CCGCCAGGGCCGGGACCTTTGCGCCTGAGCCTCGGCTTTGGGAGGTGGGGGTCCCAGGGA
-AGCAGCAGGGGCGGGAGACAGAAACAGCCCCATCGCCCCTCGACGCCTCAGGGTTGATAG
-GCTGGGTAGAGGCTTCAAAGGACACCCCCACCCCCGCCAACACTTCAAAAACCCATTCCT
-ACCCCTCTCTGCCTCAGTTTCTCTCTAGGGAAAAGGACGCAGTTGGTGTGGAGCAGGGCA
-TCGGTGGTCCTGTCAGGAAGAGTGGCGCGGGTGCCGGTGGGGAAGGGAGGCGGGAAATGG
-CCTGATTTCCCCGGCCGACACCCCCTACCCATCCCCCCCGGGAGGGCGCCCCTTCTCCCC
-CGCCCGGGCAGCGCTGGACGCTGTAGTGGGCGAGTCTGAGGGTCTGGGAAGGACACAACT
-GAATGAGGCTGTGCAGAGGCGACAGATTCCGTCCATCTTCGGGCCCTGGCTTCCGTCACT
-TCCGCCCGTGCCTGCCGCCCCTCGCCTCCTCCCTCCGCCGCAGTCTCCCCACGTCGGACA
-GCGCAGCCCCCTCCGCCTCCCGCTCCCCTCCCACCGAGCTCCTCCCGGCTCCCGGGCTGG
-GGACGCCTCCCTAGCGGTTCCCATGGCAACCCTCGTCCCGGGTGCCTgcgccccgccccc
-cgcccgccAGACCTACTCCGTGCAGCCCTGAAACGCCAGGCGGAGGGGCCAGGCCGAGCG
-GGAGGCAGCGTCAAGGTCACCTTCCCTCTCCAGTAGCAGCAGGACTGAGTGATTCCATCT
-ATTTGGAGTCGCGGAAGCGGTGAATTGGAGGGGAGGAGCTGACCCAGGTCAACAGCCCCG
-AAGCCCCCTCCACACCTCCTCACCTGTGGCCTTGAACAGTGGTCTCCGCACGGAGGCTCC
-TACCGTCCCCCAGGCCCCATTTCTTCTCCCCACCCGGGCCTCCCCAGCGCCTCGCCGGGG
-CGGGTACCGCGCTGGCCGCACCCTCCGCACAGCCCGCCCCGCCCGCCTCCTCCGGCGAGC
-CCTCCTCTCCAGACCTCTCGCCCTCCTCCTCCGACGGTCCTTCGCTTTCAGTCTCTGCCT
-TTTCCCGTTCTCTGTCGTGGCTTTTGTTGTTGTTGTTTTTCCTCCTTTCCTTCCCCGCTC
-TTCTTTTCCCTGAATTGTAAGTGAGGAGGGTGTACAGCCACTATTTATGGACAGGCTTTC
-TTGACAGCAATCTTGTGTGCCGTGTGACTCCAAGCAGAACCTCCAACCgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtCGTACCTATCTGGGTATGTCTCTGTATG
-CTTTGTGAGTATGTCTGTGTGTTTCTCTGTGCTGTTTCGGTGAGTTTCTCTATGCAGGGA
-TTTGAGGACCACATCTGATTGGAAGTGAGGGGCAGCTGTCAGGACCTTTATCTTACCCTT
-TGGAACAAGCACATTGTTTCATTTTGCAGGAGGCTGCTAATTAAGGCTGAGGGCCATCAT
-GGAGACTGGGGTAGAAGCCCAGTCCTCCCCCAACACCTCCTGGCTTTGGTTCGGGCCAAA
-CCTGTATATGGATATACAAGTACCTTCCATTCCCAAGATCCGTGTCCACTTTTGTGGAAA
-AAAAAAAAAAGGTTATTTGATAGGTTTCTCTGGAAATCTAACAGCCCTTAAGCCTAAGAG
-TCTTTAATCCTGAGGGACCCTGACTTTCACTTCCAATGGAGTCAAAATTCATTGGAATCT
-GGAGGCTTTCAGGGGCAGTCCTGGGGAGGACCTTTTTATAGCCTTGCAGCTTGGGAACTC
-CAGCCCAAGTGTCAGCCATGACAATTACCCCCAGGAGGGGGTCTGAAGGGGAGCGGAGGG
-TGAGGCTCTCTCATTCCAGATATGGAGACTAAAAAGTTCAAGATGGAAGTAATAGCAAAA
-AAATTACAGTACTAATCACAACAGCTACCATTTCTCAGCATTAGAcacagtaactgtatg
-aaagaagtatgattattaggtctgttttacagatgaggaaactgagacccagaaaggtgg
-aagcacttgtctaaggtcacgcctccaggaagcagtgtgtccacgactccagtccaagtg
-gtcaggctccagagcccacagtcccaggtactGGGTGGCCTCCAGAGTAAACATGCAcat
-ttattgacacctccaattgccaggcactgggctaaggccttcagtgcattggctcattCG
-CAGTGTGCTTTGGGAAGGACAGGCTGGGATTCCAAAAGGCCAGACTGTGCTATGCGTGTA
-GGGTGTCTCGAGTGGGAGGAGAAGCGGGTGGGGCACAAAGATTTAGGGGGCTTATGAAGG
-TCACCATGAGCAGCTCCCACTAATCCCTCCCTCCGTCAGCTGCACCTTACCTGCTCCCCA
-GGGGTCCATGATGCCGAGCTGCAATCGTTCCTGCAGCTGCAGCCGCGGCCCCAGCGTGGA
-GGATGGCAAGTGGTATGGGGTCCGCTCCTACCTGCACCTCTTCTATGAGGACTGTGCAGG
-CACTGCTCTCAGCGACGACCCTGAGGGACCTCCGGTCCTGTGCCCCCGCCGGCCCTGGCC
-CTCACTGTGTTGGAAGGTAAGGCCAGATGAGCACCTCCCATGATTCCTCTGCCTTGATGG
-AGGAAATGAGTCTGAATTTGAGGCTCAGAGGAAAAAAGAAGAGATAGCgtagtagttagg
-agtcttgcacagtcaagcaacagaaaacccaattcaaatgggtttaaataatgaagggag
-ccttcattgTATTTGTATTTACAtacaaattatttacataattatttacatatttattGT
-ATGTAAATAATggtggctcatgcctgtaatcccagcactttgggaggctgaggtgggcag
-atcacctgaggtctggagttcaacacctgctctgtcagcatggcgaaaccctttctctac
-taaaaatacaaaaatggaccgggtgcggtagttcacgcctgtaatcccagcactttggta
-ggcggaggctgaggctggtggatctcgaggtcaggagttggagaccagcctggccaacat
-agtgaaaccctgtctgtactaaaaatacaaaaattagctgggtgtggtggcgggcgcctg
-taatcccggctactcgggaggctgaggcaggagaatcacttgaaaccaaaaggtggaggt
-tgcagtgagctgagatcaatccattgcactccagcctgggtgaaagagcgaaactccctc
-taaaaaaaaaaaaaaaaaaaaatgagccgggcgtggtggcaggcgcctgtaatcccagtt
-acttaggaggctgaggcaggagaattgcttgaacccaggaggcagaggttgcagtgagcc
-aagtttgcaccattgcactccagctgggcgacagaacaagactctgtctcaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaagaaaaaaGAAGGGAAAATGTTGCTCATTTTTTAGAAGAGA
-CCCAAGGTCCAAGGTTGCATACTTTCAGGCAAAGTTTGATCCAGCAGTTCAACCCTTTAT
-ACCAAGGACTTTGCAAGTTTTCTTAGTCTTCAGCCTCCTCATGGTGCCCCTACCCTGGTA
-GCCTGTTAGCTTCAGACTCTCCCCACATGTTCCCCAAATGGCCACTACTGTGTGGACTCT
-CAGGTCTTCACTCCACACCATCTAAGGGAAGTCAGCATTTCCTGTGGTATTTCCTTCAGA
-AAAGAAAATAgcctgtaatcccatcattttgggaggccaaggtgggtggatcacctgagg
-tcaggagttcgagaccagcttagccaacgtggtgaaacctcatctctactagaaatacaa
-aaattagctgggtgtggtgatgggcgcctataatcccagctactctggaggctgaggcag
-gataatcactagaacccgggagacagcagttgcagtgagcagagatcgtgccgttgcact
-ccagcctgcacaacaagagtgaaactctgtcttaaaaaaacaaacaaacaaaaaaTGGCC
-ACAGGTACtggcttacacctgtaatcccagcactttgagaggctgaagcaggaggattgc
-ttgagcccaggaattcaagatcagcctgggcaacatagtgagacttcatctctactaaaa
-ataaaaaattagctggatgtagtggcgcgggcctgtgatgcctactactcaagaggctga
-gccaggaggatcgtttgagcccaggaggttgaagctgcagtgagccatgattgtgccact
-gcactccagcctgggcaacagagtgagactctgtcaagaaaagaaaagagagaagaaagg
-aagaGAGAAAGCAAAATAGTAAgatattaaaaacatgttaccatttaccttagcaccaaa
-gaagagagaaatacttaggtgtaaatctaacaaaatatctgtaatatgagaagaactaca
-aaactcaaaagatatcaaataactaaataaatggagaaatagttcatattcgtggattgg
-aatagtcaagatgttagttcttcccaacctgatctttgattcaatgcaatgccaatcaaa
-accccagcacgttattttgtggacgtcaaAATGTCACCTCCTCAGGGAGGAGATCCCTGG
-ACTGAGTCGGGTCCCTTGCTTTACTCTGGGCAAACTCTGTGCCCATTCATTCTTCAATAC
-ACTTACCACTTTGCACACTTGTAGTTTATATGGAGAGGTAAAAGATTCAGAAATTTAAAA
-ATCATTTATAagaaacaatgcttttaattcccagaagtcctgacaagcattgtgttggct
-ctcattgggtcacttgccagccttgaactaattactatggttaagagatggactatgctg
-actggcAGGAAGTGAGGTTCATCTCACTTAAATCTTACTGTGGTTTCTCAATGGTAGACT
-GGAGTACCTTGCCAGGGCAGAGAAAAAATGTGAAGAATTGATGTCTTTAACAGCCAAGGA
-GACTAGTCGGCCAGGGTGCACCAATGGGTCAAGGTGTAGAGGTGGCAATGAGCTGAGTGC
-CTGCTATGGGCATAGCTCTTTGCTAAATATTCTCGGGAGACTGAGGCAGAGGGTCCCTTC
-TTTTGCTTTCAAAGGACTTCACTCTAGTGAGGAGGTAAGGTGCCAACCTCTGCAGAGAGG
-CCAACTTACATAACTTCAGGTCAGGTCTGTAGGGAACACCAGGAGAGGAAATGATCAAGG
-AAGACTTCCAAGGAAAGGTTAGTGTGTATTTaaaatttttaagcatcttcttattgcgag
-gcactgtgctaggctcttgggaacacagaatttaagacatgaggtccctgtcttcgagga
-actcTTTTAGCTGTGGTTTatttaatcattcagcaaacatttattcagcctttgctctgt
-gccggcacgtgctaggcacagaagactcctagtgagccaaaacaggcacagtctgctctc
-atggagctctcagtactgcgggagaggcagacgtcacttacatagcaaccaaaatacatg
-tccaagtgtgcacaatggtaagtgtattgaagaatgaatgggcacagtttgcccagagta
-aagcaagagacctgactcagtccaggggtcttctccctgaggaggtgaggtttgagatga
-gatctgatggtgcataggagttaacccaacagagacaggaaggtagaaaggATAAAGAGA
-TGAGTTGGGATGGAGGGAAACACAGGGTTGGCCGGAGAAACCCACTGCTAGGTGGGAGCT
-GGGAAGGAAATTAAGAGGCCTCAGGATTCCAAATAAAACATGACAGTTTATGCCTCCTGT
-CAGTTAGACCCCAGCAAGTGTGTTCTGTGATTCCCATCTCCTGAGGATGGATCAAGGGGT
-TACCCTTAAGTCTGGTGAGGATCCAAGGTGATCCCTTGGCCAGGGGCCCCTGGCTGACCC
-TGACTGCTTCCTGGTCTGTCTGCTTCTCCCTAGATCAGCCTGTCCTCGGGGACCCTGCTT
-CTGCTGCTGGGTGTGGCGGCTCTGACCACTGGCTATGCAGTGCCCCCCAAGCTGGAGGGC
-ATCGGTGAGGGTGAGTTCCTGGTGTTGGATCAGCGGGCAGCCGACTACAACCAGGCCCTG
-GGCACCTGTCGCCTGGCAGGCACAGCGCTCTGTGTGGCAGCTGGAGTTCTGCTCGCCATC
-TGCCTCTTCTGGGCCATGATAGGCTGGCTGAGCCAGGACACCAAGGCAGAGCCCTTGGAC
-CCCGAAGCCGACAGCCACGTGGAGGTCTTCGGGGATGAGCCAGAGCAGCAGTTGTCACCC
-ATTTTCCGCAATGCCAGTGGCCAGTCATGGTTCTCGCCACCCGCCAGCCCCTTTGGGCAA
-TCTTCTGTGCAGACTATCCAGCCCAAGAGGGACTCCTGAGCTGCCCACATGGCCTAAGAT
-GTGGGTCCTGGATCCTTCCCCCCTTCTCACCATAACCCCCTCTCAGTGTTTCCCCAACTT
-CTCCCTTTTAGCAGGGTCCCTTTAGAGCCCAACTCCAGGTCAAATCTGGAGCTCAAATCC
-CAGTGCTCCCTCCCCAGGAGTGGGGCCCCAACTCTTCCAAGATACCAGCATTCCTCAAGT
-CCTCCCAAAACTTCCTACCCACACCCTCTTCCCAAGGCCCTCAGGGGCAGAAAACATCTC
-CTTCAACCCGTCCCCACTCCTTCCTctgcatgaccttgggcaaacccttgccctttcaag
-ccatcagctcctgcctctctgccatgagggctttggatcagatTCCTCTTCTCGCCAGGA
-TGAGGACACGCACTGCCCTCCATAGACACAGATGAAGGGGTGGGGGTCATTCAGCTCGAA
-TGGGTCCCAGATGCTCACTTGGCCTTTCCCTGCAGGATGAGTGAAGACGTTTGCCTCTCA
-CAGTGTGTCTtctacctgcattttggcatcagagccccccagcccacccaccacaggcaa
-ttactagccctagttgataggtgaggtgggtgaagaaggctggaggtgacatgtccgagg
-tcacacaacaaagcagcatgcaggaactagaaacacatcttcagcctccTCCTGGGCCAG
-CTCTTGTGCTACAGGTGGGGCGGAGCCAGCCCCTCACCTTCCTGGTTCCCTGAGGGTCCT
-CAGGGTGGAGGACAGGTTTGGCCCAGAAAGACTAGCCAGAGGCCTGATGGTCCCAGGTGG
-CTCTGGATATACTTTGGATATGGATTTAAATGGTCTCTAAGAGCCGGGGGTAGGGGGCAG
-GAAAAGTGGGTTGTCTTTGCCCCTCAAAGTCCACCTACCTAGAAACCAAGCCCACGGTCT
-TGGCCGTGACCCTGATAATAAATGGGCTCTCTCAGAGGCGCCAGCCCCTCCCTCCCCAGC
-CGGAGGCGTCATCTCTCTTCTGTACCACTAGAGGGAGCTCTGATGCAGCTGGAGAGCAGC
-GCTCAAGGCTCTCGCCCCTCCCCTCCCTAACCCTTACCTTCAGTCTCCACCAGCCTGAAG
-GGCCTCCTAGGGGATCCTCAGGCGGCCCCCACCAGGGCACACCCTACTGTCCTTGTGCCT
-CACGCCCCCTCCTCATCCTGCACCCCTTCCATCCCACCTTCCCTTTCAATAAACAGCTGG
-GATGGATACTGACTTTGTTTCCTTTCTCCCTGGCCACTGGGGCGTGGGGAGGAGAAAGAC
-ACAGACTCAGgagcacctactgtgtgctgggcacgacccattatttctcattcgctcctc
-aggataacctgttgagaaaggaattattgtcttcttttttttttttttaagatgttgtct
-cgctctgtcgcccaggctggaatgcagtggggcgatcttggctcactgcaacctctgcct
-cctgggttcaaccaattctcctgcctcagcctcccaagtagctgatattacaggtgcacg
-ccaccacgcctggctaatttttgtatttatagtggagacggggttttaccatgttggcca
-ggctggtcttgaactcctgacctcaaatgatccgcctgcctcggcctcccaaagtgctgg
-gattaccgggtgagccaccttacccagacttattgtcttcattttacagatgcggtaact
-gatgatcagagaggtgagtgatttATTTTTTAtttttatttttaattcttttttattttt
-ttcgagacggagtctggctctgtcacccaggctggagtgcagtggcacgagctcagctca
-ctgcaagctccgcctcccgggttcatgccagtctcctgcctcagcctcccaagtagctgg
-gactatgagtagctgggactacaggtgcctgccaacacacccagctaattttttgtattt
-ttagtagagacagagtttcaccatgttagccagcatggtctcaaatctcctgacctcgtg
-atccgcccgcctcggcctcccaaagtgctgggattacaggcgtgagccaccgcgcccggc
-cTATTTTTAATtctttttatttcagtagcctttggggtcaaagtgggttttggttacatg
-aattagttctatagtgattctgagattttagtacacctatcacctgagcagtgtatactg
-tacccaatacgcagttttttatccctcatcccctcccaacctccctggactcagtcccca
-aagttcgttatatcactctgtatgcctatgcatcctcatagcttagcttccgcttatata
-agtgagaacctaccgtatctggatttccgttcctgagttacttcacttaggataatggcc
-tccagctccacccaagtcctgcaGTGGATTTAAATGCTCAGCCTAGGGCCTGGAGGGGTG
-GCTGggccaggcgaggtggctcacgcctgtaatcccaggactttgggaggccgaggtggg
-tggatcacctgaggtcaggagttcaagaccagcctggccaacatggtaaaaccccataac
-tactaaaaatacaaaaattagctgagcatggtggtgcatgcctgtaatcccagctactcg
-ggagactgaggcaggagaattgcttgaacccgggtggtggaggttgcagtgaaccaagtt
-cacaccattgcactccagcctgggcaacagagcaagcctctgtctcaaaaaaaaaaaaaa
-aaaGTGCTTAGCCTGATTGGCCTATTGCCTGAGTGTGGAGCTCCTGTCTTTGGGTGGGAA
-GGAGATTTCTCAGCCACCTTGAGAACACACTTCCTCTAGTTCTGAAAGGAATGTGAGGGC
-CAGGGTGTGGGAGAGGGGGCTGAAGCCAAAGGTAAGATCTTTTCCAGGCCTGGaagagta
-attaaccccttttggcactcaccaggggctgggccttgttcttagtgccttacagaattc
-gggaattcatttaaccaggacgacaacctctgaggtggcggctattattctcaaacctag
-tttttcctaaactccaggcttgcgttcccatctgcattcacctggatgttgaatttaaac
-tcaactatctcaaactgttctccttgttaccacccctccctgaccaaacctgcctctact
-atgctgcccacgtcttagagagtagcgtccccattcttctggctgctccagccaaaacct
-cctctctttcctcacaccctgtatccaatccatcagcaagtcctgtcaactcaaccttgg
-aaatatatcctgtacccaactacacctcgacatccccgtggctgattccatggtctgaac
-caccagcgaccagcgcctcgatctggatcattgcaccagcttcccccggtctcctggctt
-ctgagttttgaaccccaccctactccacgccttgactccccaagtctaattactacacag
-tagccagacagatcttgttagaacataaactaggtcatgttcctcctccgctccaaacct
-tcccatggctcccacctaactcagagtagccaaaaccctccctgtggcctccaaggccct
-acacaatttgctgatttccactccccccgcactttcctctgtaaccccaactcccaccac
-tctccaggttcctgtgtcctctccagccaggatcctgactcagggcctttgcctcactgt
-tccctctgctggggtactcctccccagttgacgacatgggcagttccttcaagtcgttgc
-tcaaacatcaccttctcagcaaggccttccctgagcagcctattagaattgcaACCAggc
-caggcgcagtggctcaagccagtaatcccagcactttgggaggccgaagcaggtggatct
-cctaaggttgggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaa
-aatacaaaatcacccaggcatggtggcacatgcctgtaatcccagctactcgggaggctg
-aggcaggagaatcacttgaacctgggaggcggagattgtggtgagctgagatcgcaccat
-tgcactccagcctgggcaacaagagcgaaaccccatctcaaaaacaggaaaaacaaaaaa
-caaaaaaaTGCAACCATGCCggccaggtggagtggctcacacctgtaatcccagcacttt
-gggaggccaacgtgggcagatcacctgaggtcaggagttggagaccagcctgggcaacat
-ggtgaaaccctatctctactgaaaatacaaaaattacccaggcatggtggcacgtgtctg
-taatcccagctacttgagaggctgaggcatgacaatcacttgaactcgggaggtggaggt
-tgcagtgagccaagatcgcgccattgcattccagcttgggcgacagagcgaaactccatc
-tcaaaaaaataaaaggaaGCTAACACAGAGTATAAATGGTGCAggcagtttgacaatatc
-aaaatagaaaatacacatgccctttgatttctccctcttatgcaggtggatctatagatt
-caactctacatgttggaacactatagtattatttgtaattaaagcatttggaaacaacct
-aaatgctcatggtaggggactattaataaaatacggtaAggctgagtgcagtggctcacg
-cctgtcatcccagtactttgggaggccaacgcaggaggatcacttgaggccaggagttca
-agaccaacctgggcaacatagggcaacatagcaaggccccatctctacaaaaaattaaaa
-attagctgggcatggtggcacacgcctgtagtctcagctattaatatttgggaggctgag
-gcaggaggatcacaccactgcactttagcctgaatactgagtaacaaagcaaaaccctgt
-ctctcttaaaaaaaaaaTTGGGGGGAAGGACAAGTCTTttttcttttcttttcttttctt
-ttctttttttttttttttttgagatggaatttcactcttgttgcccaggctggagtgcaa
-tggtgtgatctcggctcacggcaacctccgcctcctgggttcaagcaattctgcttcagc
-ctcccgagtggctgggattatagtcatgcgccaccacacctggctaattttgtattttag
-gtagagacggggtttctccatgttggtcaggctggtcttgaactcccaactcctggcctc
-ggcctcccaaagtgctgggattagaggtgtgagccaccgtgcccagccAGGacaagtctt
-cttacagaagaattccaattagtaaatgtagaaggattgagagaaattgaaaaatcatca
-ttagaacaccggaataataattgctgcaggcaacatctaccaatgaacaataaaatgagt
-gggtgaaactttaaggagaaacaaggttttttttttagaaacgggatcttactacattgt
-ccaggctggtctggaactcctaggctcaatgggatcctcccacctcatgctccccagtag
-ctgctactacaggcacataccaccccaccaggcttgaaacaaaatatttgcatagcctca
-aagtatctatccccaaatatgtattaattagtatggtggttttaacatatgcatacatgt
-tctttgatgctctgccatctaggaaatggagcttaatttttctcctcttgagtgtgggct
-ggactcagcaacttgcttctaacaagtagaatgtggaaaggcaaaaacagtgacttcaca
-gtggaaaaatctggcagacaccaccttaaccaaatgaaggctggcaccaccagtcaaaag
-tcttgttgatatcacagcctctgaaatgatgtggtgagaagggcacttggcctgagtggc
-attcttcccccaaatccgtaacgtcagcctaatcatgagaagacccattctacaaaagat
-ctgaccagcactcttcaaatgtgtccaggtcacgaaagacaaggaaaggacaagaaacgg
-tctcaggttggaggagactaaggagacgtggctgaaggatacacaggatctccctgtact
-gtccatgtaactcttcaataaatctacaattatttcaaaatagcaaaaaatacgattGCT
-ggccgggcacagtggctcacgcttgtaatcccagcactttgggaggccaagaagggcaga
-ttacttgaggtcaggagtttgagatcagcctggccaacatggtgaaaccctgtctctact
-aaaaatgcaaaaattagctgggcgtggtggcatgtgtctgtaattccagctgctcgagta
-gctgaggcaggagaatggcgtgaacccgggaggcggagcttgcagtgagccgagattgcg
-ccactgcactcccgcctgggccacagagcgagactccgtctcaaaaaaaaaaaaaaaaaa
-aTTACTGTGGTCAAGATGGAATAACAGGGATCTGGTTTAACACACCCCAAAAAGGACCTA
-AGAAAGGACCATTCCCTCTCCTCTCTGAGGTGGGAAGATCTGGGAAGGAGAGGAGGCTGA
-CCAGTGGGGTCTACCTTCTGCTCCACCCCTCTTCTATCCAAGAGTCTGAGCACCCAACCC
-CCACACCACCCTGGAGGCTCCCGCCCTCGTGCTGAGTCTGGCATGCCCTCCCCATCCCTA
-CTGGCCCAGGGGACTAGGTTAGCTCAGAGAAGCCCTTCTAACTCACCCACAACTGGACCA
-AAGAAGGATTGATCTGGGGCCACTGCCTGGTCCCTGGGAGCACTGTGCTAGGGCAGGGGG
-CTGAGATGCCCCAGGGTAAGAGACAGAACAGTGAtttttttttttctaagacagagtttc
-gctcttattgcccaggctggagtgcaatgcgcgatcttggctcaccgcaatctccgcctc
-ccaggttcgagcgattctcctgcctcagcctcccgagtagctgggattacaggcatgtgt
-caccacgccccccggctaattttgtacttttagtagacacagggcttctccatgttggtc
-aggctagtctcaaactcctgacctcaggtgatcctcccaccttggcctcccaaagtgctg
-ggattacaggcatgtgccaccgcacccggccAAAAACAGTGATATTCATATAGATGGGGG
-AGGGATTAATGGGGGTGGAGTGAGAGAGAGCCTGCTGGAGCAGTCCGAAAGGCAGGCATT
-CCTTCTGTTCAGCAACATTCCTGCCCCCACAATCTCCTCCCACAACTTATATCTAGTgca
-ggctgagagtgaatctgtctgccagtgttcaagccactgtgtgaacctgagtttcttaac
-cgttctgagtgtcaggagtttttttcatctccaaaataggagcaacaaggataccaatcc
-cttgagattgtatgaagcttaatgcacttaacacagcacctggcacgtagacatgctccc
-taaatgccagctgttattatGAAAGAGAGAAGTCTGAGGTTCAGAACTAGCAGGCAACAC
-ATAATCtataatgatggatggctcagacagggtcctgtcctatagggactcacagtctag
-tggaaaggacagtcctgtggacagcaaatggcaaTATACCTGGGTAAGTACTGTAATAGA
-ATAACAAAGTAATATCCTATCACGGGGCAGTCACGGGGGCAGTGAGAGACAagcgcttgt
-ccatgccaggctctgtactcagtccatcacatacattaggtcttgcagtcctcataccac
-cataaggtggttaccattatctccaattcacagaaaagcaaacagtatggagtgtttaag
-cgtcctgtccgagatggcatagctagtggagctgaaatttgaacccaagtaatccaggtc
-cagaatGCCCCGGATGCAGAAATGACCACACAGATTCTACCAATGAACTAACCTGATAAG
-GTTGGAGGTCATACTCATAACCCCTCACACAGGTCCACACAGACACAGGCAAGCACACCC
-ATGTCTATTCAGATACACACCAATTCCTGTCTATGACGAGCGCTCAGAAAATCCTCCACA
-ACACCACACCAGGAATGATGTGCATTTTGAGAAAAAAAAAAATCAGCTCTGAAGACCTCA
-CAGACACATGCAGTGAAATGTAAATGGAGGGACCCACCCAAGTTCTTGAATAGCACATTA
-CATGCCTGGATGCACATCAGCGGGCATGTAAATGATGACGAGGAGGTCTGCAGACACTGA
-CACGCTGCATTTGCACTCACTCTGCTACTGAATTTTTTAGCagctacatttactgagcac
-ctactgtatgtaaggAAAGATAAAGCagccgggagctgtggctcacgcctgtaatctcag
-cgctttgggaggccaaggcaggtggatcacctgagctcaggagaccagcctggccaacat
-ggtaaaaccttgtctctactaaaaataatacaaaaattagctgagtgtggtggcatgcac
-ctgtaatcccagctactcaggaggctgaggcaggagaatcgcttgaacccaggaggtgga
-ggttgcagtgagccaagatcacgccattgcactccagcctgggtgacagaatgaaactct
-gtctcaaagaaaaaaaaaaaaaaaagtaaaaaagataaagctcagagaagtgaagtggct
-tgcccaaagtcaaatggctgagattcaaaccctggccctataatattaggcaacggtgtc
-tccctccaccactgtgcAGATGCATCCATGAGTGAAGAGATGTGCTATGGCTGGATTCCC
-TCATTGACATTCCCTGTGACCTTGGACATGGCATGGCCTTGTCTGGCCCACATTCTCATG
-TTGAGTCCATTCACAGGTGTGCTCCATGGATGTGCATGGATGGGACCGGCAACCCTGGCC
-TTGCTCTGAGTCTCAGCTTGGCTTGGTGTCACCAGGGCTGTGAGCTTCCAATCCCAGCCT
-TGCCATGTCCCAGAGCACATGGCTCAAAACCAAGCTCTGGGCATCAGGCCAGCAGGGCCC
-CTGTGATGGAAGAACTGACAGGATTTCATAAGCATCCGGCCCGGGACACGTGGTCAGGGC
-AGGGAGAAGGGAGATAAACAGGATGTCCACCAGGGTGTGCACCTGGGCAGGGTCCATGGA
-CCAGGTGTGGCAGGGGAAGAGCTGTCAGGACTTGGCATCTGATGGGCACTCAGCAGATAT
-AGGCTGTGTGAGGGGAGGAGTTTGTGGGGAGGCAGGGCTGCAGCTTTGCTTCCATCCTGG
-AGGCCAGGAATGAGGGAGTAAGTGAGCCATTGACTCaatgaatgaatgaatgagcgagtg
-agtgaaggaaggaaggggtaagtaaataagtgaagaatgGAATGGGGGAGGGAGTGAatt
-tatttatttatttatttatttattttgagacagggtcttgctctgttgcccaggctggag
-tgcagtctcagctcactgcaacctctacctctcaggctcaagggattctcccacctcagc
-ccccagcatagctgggactacaggcgcatgccgccacatcccgctaatttttgtattttc
-tgtagagatggggtttcgctatgtcggccaggctggtctcaaactcctgggctcaagcga
-tctgcctgcctcagcctctgcagtgctgagattacaggtgtgagccaccgtgcTGAGCTG
-TGAatttattttttacacaaatctgagtgctcactctgtgctggccctggacgggtctct
-gtggatgtctggtgagcaggatggacacagcccggtcattgcaacgctaaaagCTTGAAT
-GACACCAGTCAGGCTGGGGAACTGGGAGGGCCCTTGACATGCAGAGTGACTCAGCCAGTG
-TGAGCAGGGGTTGTCAGCATGCCTAGGGGAGCAAGAGACTGTGAGAGAtgtgtgtgtata
-cttgtgtgcctgtgtgtgtccgtgtgtacacatgtgtgcgCCGACACAGCCAGGTGTTGG
-CCAATGCAGGTGTGGTGTCCTCAAGAGCACAGTGCATCCTGATTCTTCACCCTCCCAGGC
-CTCCCCTGCCCCTGTTGTGTGCCAGCTGGGCCTGCCCCATGTTATGCCTGACGCCCACGC
-AAAAGCTGCTTCTTCCAGTCACAGGACAAAGGCATCCTCAGCCCAGACCCTGTACCCCAG
-GGGTAAAGACCTCTCAGACCCCTAGTGCTCCTCAGCATGGACCTCTCCACCAGGAGCCTC
-AGAGTTGTGAGAAGCACAGGCACCCAAAGCCCACCGCCCTGTGTCCATGTGCATGGAGTG
-TGCCCAGGTACACGCAAGGGCTGGAGATGCCCCAGGGCGGTCCAGACAGACGTGCAGATG
-ACACATTGGCCACTGAGTTTCCACAGACACTGAGCTAAGTGCTTTCGAGACACActgggt
-gaccttaggcgtatcaccctctctgagcctcagtttctaatctaaaagtagggtaattat
-actcacttccagtcttgttagaataactcaatgCATGATCAGCTCAACACATCATGATTA
-TTTTTCCTGAGTTCCTGCCTTCCCAGCTATATTGTCTATTCCTCAACAGTACCCACTGAG
-TCTTATATCCCCGTTTCTCCTATGATACTCCATTACACAGGACTCAAATAACTACCTGCT
-CTAAGAATTGCTGAGTGACATGTAGTCCTCATAAATAGCAATAATAGTCACTAACATTTA
-TATAACaacaagagccagcaattttgattttttattgtgtcaggcattgtgctgaacact
-ttacattccttcattcatttgacaaacattcactgaacacctggtaggtgctgggctctg
-tgctagacctgcagatgcagcatctctgccctcaaggttcttacattctgatggggaaga
-agagacagacaaaagacagtttggcggggcacagtggctcacgcctgtaatcccagcact
-ttggtaagccgaggcaggcagatcacttgaggtcaggagtttgagaccagcctggtcaac
-atggtgaaacccctgtctctactgaaaaaatacaaaaattagccaagtgtggaggtaggc
-atctgtaatcccagctactcgggaggctgaggcacaagaatgacttgaacctagaaggtg
-gaggttgtagtgagcagagatcgagccactgcactccagcctgggcgacagagcgagatt
-cagcctcaaaaaaaaaaaaaagataatttaatacataaatgggataatttcaaaccttga
-caagtgctacaaataaaataaggaagagttatggattagagacaaactgcagggattagg
-tggggcatgatgcttgatgagtgatcagggagggcctctctgaggagcaaatatttgatc
-tgagacctgaagaagaaggaagagcctggaaagatacaggaaaagttccaggcagatggc
-atagcaagggcaaaggccctggggcaggaagaacttggtaggttcgaggactaggagaaa
-gggaccatagctggagGATGATTCAGCAAACCTGGCAGGTCTGTCCTGGATGACTCAGCA
-AGCCTTGCAGGTCTGTTCTGGTTTCAGAACCCAGGCATTTTGTCCTTCACTCCAGGCTGC
-CTCAGAGACATGCATCCCTGCCATACACAACAATGTGTGCACGCTGGCACACATGCACAT
-GCATGCACACACACACTCTGCATGCTGACACACAACTAAGGGCCGGACCAGCCATGATAG
-TCTAAGACACTAACATTTTTCTCTAGTGTCTTGTGGGGCCAAGTAGAAGGGCCAGATGTC
-ACCTTTGCCCAGCCTTCCAGAAGTTCTGGGCCAAAGAAAGATTAAATGGCAGGAAGAGAA
-AAATGGCTTAATAAGGAGGTGACGGGGAACTCGGGTGGCCTGTGGGGGTGCGGAGATGGG
-GGGAGATGATAGAGATGTGAGAGCCCATGGGCACATCCCCTCTGGGGAAGTGAGGGAGCA
-CCGAGAACAGAGAAGCAGAGGGAGTGGAGACGGTTCTCAGAAGCACAGGGCCTCCACACT
-CACCACAGCCCCTACTCAGCCGACATGCCTTGCTTCCTCTCACCTCCCCTGGTTCACCTC
-AGAGATGGGACACTCATTGCCCACCAGGGCAGCCTGGGTGGTGCCAACTGTGAGAGAGCT
-CCCCTTCCACATCTGCCTTTGTGGCTGTAAAATGTGGAAAGaataagagaaatacctatg
-aaatctgcaggaagatactttcttttttttttttttttttttttgagatggagtttagtt
-cttgtcgcccaggctggagtgcagtggagcgatctcagctcactgcaacctccgcctccc
-aggttcaagcaattctcctgcctcagtctcccgagtagctgggattacaggtgctcgcca
-tcacacccagctaatttttttgtatttttagtagagatggggtttcgccatgttgggcaa
-gctggtctcgaactcctaacctcaggtgatccacccacctcagcctcccaaaggaggctg
-ggattacatttttctaaatcagttcggtaaaaatcaaaaattttgagaacacctggtgtt
-gtagttctgggaagcaggtactcacatgctttgctggcaggaggtagattgataacaatc
-tctatagaggaggagccagagatctctcttaaaagtgcaaatgcacaaacttttgactta
-gaaattctgcttctgggCAGGGCGCGGTGGCTCACGCCTGTGATCCCTGCCTCCCaggcc
-aaggttgcagtgagctgagatcgcaccattgcactccagcctgggcaacaagagcgaaac
-tctgtctcaaaaaagaaagaaagaaagaaagaaaaattctacttctaggaaattagctca
-gaacttctctccacacccccatgtatgaacactgcagcattttttgttatagcaaaagac
-tggaaataattaactgttcattgacaagggatggtttaaataaaccagtacattcctaac
-catggaataggaccaagctgtaaaaactgaccaggcaggtctttctggactgacacggaa
-gagtccccaagataaattgttaaataggaaggaaaaaggcaatctgaaggacatggagtg
-tgctcccatctgtgtaaaaaagtgacaaTAAATCCTCATATTTTATGTCTTGAAGGAAAC
-ACGAGAAAATGGCTTGACCCCAGGAAGATGAACTAGGAGCTGGGGATAGGAGTGGGAGGG
-AGACTTCTCAAGTATTACTCTTCTGTGCCTTTGAATTTTGAGCTAAAATATTTAaataaa
-atattaatataattaatataatacaattaataattaatattgaataaaataaaatatCTA
-AAAATCTGCTCCccgggtgcggtggcccacgcctataatcccagcactttgggaggccaa
-ggctggtggatcacctgaggtcgagagttagagaccagcctgaccaacatggagaaaccc
-cggctctactaaaaatacaaaataattagccgggagaggtggcgcatgcttgtaatccca
-gctactcagcaggctgaggcagaagaatcgcttgaacccggaagacggaggttgcagtga
-gccaagatcgcaccattgcactccagcctgggcaacagaagcaaaactccgtctccaaaa
-acaaacaaaaaaacaaaacaaacaaacaaacaaaacCACAACTGTCTGCTCAAAAGTGCC
-ATCCTCCTACACACTCCTTGCCCTCAGCTAAGTTCTGTCCCCATGGAACTCTCCCTGGAA
-GAGACAATCTGTCTCCCAAGAGAgcaggcctatgtgtgagtcctggttccatcactgacc
-ctaagtgtgacctcaggcaagacactCCCACCCCTGACTTGTACTAGACAGTTCTCCCCA
-GCACTGACATTCTGTCTCTCCTGCTGGAGGGGCAGGAGGGCAGGCACAGTGTCTTCTTGC
-TCTGTGATTCATTCAGTTCACTTAAACTGAGTTACCTACTCCAGGCCAGAGTTTGGGTTC
-ATCCATTTCTTGCCCTCCATGCCCACCCCAGGGTCTGGCATGGGAGTTGGTACCCTATAG
-GAGTTCTGAACAGACTCAGCTTACGGATGAGGAACAGACGGTGGGTCAGATGCGCGGTAA
-GGAGGGTCAGGTACACGGCCCATGGGATCGAATAGATTCATGGGTGGGtctttaagacaa
-ccgccttcactcaatcctaagccctccccacagctaccaccctattttttctcccctttg
-cagaaaagggctttgagaaaattgtctatcctcgctgtttttaattagtcttctctctct
-ctctccctctgagacaggatctgctctctcacccaagctggagtgcagtggcgtgatcat
-ggctcactgcagcctcaacctcctgggctcaaacgatcttcccacctcagcctcctgagt
-agctgggactacaggtgtgcactaccatgcctggctaatttttgtattttttgtagagac
-tgggttttgccatgttgcccaggctggttttgaactcccaggctcaagtgatccatccac
-ctcagcctcccaaagtgctgggactgcaggtgtgagccaccacacctggccctcttgtct
-cttaagtccatttaatcatgcttctacctgtcacttccctagttgaaactgctcttgtca
-atttcaacacattgctaaatccaatgtgttcagttctcattcttcatctttttttttttt
-tttttttgagacagagtcttgctctgtcacccaggctggaatacagtggcacgatcttgg
-cccactgcaacctctgcctcctgggttcaagcgattctcctgcctcagcctcccgagtag
-ttgggactacaggcacaagccaccaaacccagctaatttttgtatttttagttgagacgg
-catttcaccatgttggccaggatggtctcaatctcttgacctcgtgatccgcccaccttg
-gcctccaaaagtgctgggattacaggtgtgagccaccgcacccggcccattcttcatctt
-cttaactgatcaacagtttgacacagctgaccactccctgctctttgatgtacttctttt
-cacttggtggccaggcctccactctctgctggttttcctccttctcaggctccctgcttc
-tcccattcctgttggagcagtgaggacttggtccctggagctctcatccagtctcacgtc
-tatgactcccaacactgtatcctcagcccagacctctcccctgaactccagcccatacat
-tcaaatacctacctgatgtctctttgaggatgtcaaaagacatgacagactccacagaac
-caaagctgaacctgggcttcccccaaacacctcgctccatgtcatttgatggcagttcca
-tacctgtcaccgttcaggccaagaaaccttggaagcaccttgacacctccttttccctca
-aactccacatctagaccatcagcaatcctgttggctccacctttaaaatatacccagaat
-ccagtcacagctcacctctagcatggccactgccctgctctgagccactggagtttaaga
-gaattattgcaacacctgctcccttgtcttcctgtccttgcctcattcagtctattccaa
-gtacagatccctaaatgattttattttaaaagtaagtcaaggctgggcatggtagctcat
-gcctgtaatcctagcgcttgaggaggccgaggaaggaggatcacttgggtgtaggagttt
-gagacccacctgggcaatgtggcaaaaccctgtctgtacttaaaaaaaagaaaaaaaATg
-gctgggcatggtggctcaccctgtaatcttagcactttgggaggctgaggcgggtgaatc
-acctgaggtcaggagttcgagaccagcctggccaacatgatgaaaccccatctctactaa
-aaatacaaaaattagccgggcaaggtgatgcacgcctgtagtcccagctactcaggaggc
-taaggaagaagaatcactggaacccaggaggtggaggttgcagtgagccaagatcgcgcc
-actgcactccagcctgcatgacaggagcgagactccatctcaaaaaaaaaaaaaaaaaaa
-aaaaggtaagtgagatcacttccctcctctccttaaaccctcccctgcctccccatgact
-cctcagcgtcctttcaaaggcctccaaagctccagattatctgaaccccctttacctctc
-tgacctcatctcccaccgcctccctgtcactggctgcactccagccacattgaccttctc
-cgatggcacaccagtcagctagtcagcttccttttggagcttttgcatgagctgttcctc
-ttcctgaagaatttgcccttcggatagtctcagggcatccactgaacactccactcaata
-cagccactgcctgcccacccaacactcctcatctctgtacttactctttttttcccttgc
-attcgtcaccccctaacatgtgctacaatgtacttattatggtaattatttcttgcatgt
-ttctttctttttttttttgagacagggtctcactctgttgcccagtctggagtgcagcag
-catgatctcagctcactgaaatcttggcctacctggctcaggccatcctccctcctctgc
-ctcctgagtagctgggactacaggcactcaccaccatgcctggctagttgttgtactttt
-ttgtagagatgaggtttcaccatgttgcctaagctagtctaaaactcctaggctcaagtg
-atcctcccgcctcagcctcccgaagtactgggattgcgggtgtgagccgctgtgcctggc
-tgcacttttccttctaatggaatgtaagcgccacttttgtctgttattttcactgtagta
-tccctagcctttggaatgttgcctggcaagtagtaggtactcagtaaatatttgttgaag
-aaacggatGATTCTATAAATAGCATGGATTGATATGGGAAAGCTATGTAGGTGGATGGAT
-GGATGCTTGTCGGATGGAGGGTAGATGAAAGAACAGCGAGAAATTCGAATGGCTAGATGG
-TGGGGATGCATTATAAAATAATAATTCATAGATGGAAAAGGAATGAATAGATGGGTGGAG
-GGATttaatctcttcaactactatttactgaccacttgccgtgtgccaggcactgtatga
-ggtgctagagacactggtgagccacacaggcaaggtgcctgtcctaagggagcctgtagt
-tcagtgggtgaggcagacactaaacaaataacaaatacatacataattccaattatagtt
-aagtgttctggtggaaaagaaCAGGATGCTCTGGGAGAGAATAATATGGATAAGTGATGG
-AAAAATGGACAATAAATGGGTAGATGGAGATGGATAGGATCGGGGTTATTTGCCTTAAAG
-GGCCTGGCTTCAGGACTGGAGCTGCTTTACCTTAAAGGGCCTGTCGGACCACATGTACCA
-TCCCACATCCCAGACCAGCTCTGCACTCAGAGACTGTCCCTCTCTCCCTGCCCTGACTCA
-GCACCTGCCTGGCCTATCCCCAGTGGTCCTGCCTGACTCTACCTCCAGCTCCCACCCTGC
-TGAGTCACAGTCAGGCTGGTCAGGGGGCTGTCCCATGTTCAGTCCAGCCCCTCAGCCTTC
-CTCGACCTGGGGGGGTATGGGGAGCAGCCCAGAGGGGAGGGGAGCAGGTGCCAAGCTCTT
-GATTCCTGTGCCTGAGCACTGCCCTGTTGAGACCAGAGAGAGAATCTATGGCTAGGGTAT
-CTGGGGCTACAGTTGGGGTTTATCTGGGGCCTGGGGTCACACATGATGGATTAGAGCTAA
-ATCTATCTCCAGGGTTATAACTCAATCAGGAGCTAGAATTCAAATTCAGTTTATGGATCA
-TGTGGGGAAAAAGTGACCAAGACACCGTTCAGTTTGGGACCTGTGTCGGCGTTAGCTGTG
-GCTACGGCCCAGGGCTTAGTGATCACAGGTCAGACCATGTTCAAGGTTTCAGGCCAGAGT
-GCAGTTGAAGTGCAAAGTCAGGCAATAGGGTTCACCCTAGGACCACAGTCAAGGATCTGG
-GTCAGTTAGTGTCCAGGGCACTGGCCTTGTCTCCTCTTCTTTGGGAGAGAAGCCAGGTGG
-ATGAGTTGGATCTAAATGTCCTGAGGAGCAACTTCCAGCTCAAGTTCCTTCACCCAGGCG
-GCCTAAGCCCTCTCAGCACTGGCCCCAAAGCCTTCCTTCATCCCTCAACTTCCTCCATCA
-CTCCCTGACAGCCTGGCCTTGCTCAGTGTCCCTCGCAAGGCTGAACAGTCCTCATTCTGG
-CACCTCAGGGGACAGGGTAGGGGTGGGGACTATGGGACAGGGCTCAGTGCTGGACCCAGG
-AGGGCGCCTTGCGCAAGGTTTTCTGATGCAACTGGCTGAGTGCTTCAGCATTCCACCCCC
-ACCCCCCAAGCTTTTCTCAGAAAGGCAAGGCCTGGGCAGTTATCCAGACTGAACATATAA
-TCCCCTTCCTTCTCTGGCCTTTGATGGCTTCAGGACCTGCAGGCAAaaggaaggcaggaa
-ggcaggcaggaaggaaggaaggTCAGGTGACTCAGCAATGCGTCCAGCACTGGGAGCTGG
-CAGATCTGGGGCTCCCTCATCCTCCAGCTGAGAGGCGAGAAAGAGAATCAGGATCCCTGG
-AAGTTTGGAGATCCTAACCCCTTATACATACAAAGCAGCAATTATGTGCCTAAGCCCAGG
-GAGAGACCTGTAGCTGCCCAAGGTCAGAGGCAAGGTCAGAACCAGACCAGCTGTCTTCAG
-CCCATGGCTATGATCTAGCTATTTCCACTACACAGAAAGAGAGAACCCTTCACCCTTGAG
-GAGGACACGGGACTTCCCCAGGAACCTCCCGTCAATCCTGTTGAGGCTCCTGAAATGgtg
-gaatgacgtggactttggaaccacgcagacctgggtttaaatcccaggccaggcacggtg
-gctcatgactgtaatcccaacactttgggaggctgaggcaggcagatcacttgtggtcag
-gagtttgagaccagcctggccaacatggtaaaaccccatctctactaaaaatacaaaaac
-tagccaggcgtggtggcacacgcctgtaatcccagctactcaggaggcagaagcgtgaga
-atcgcttgaacccgggaggcggaggttgcagtgggctgagatcatgccaccgcactccta
-ggtgagagtgagactccgtctcaaaaagccacactggctagctgtgtaacgctgggcagg
-ttactttcactctttgacactggatttgctcacttgcaaagtgggcgtaaatgcatcctt
-agctcacagggctgtggtgaggctgacatgaggaagcactggaaggcacagcttagGCTC
-CACATGGGCCACTCTCAGGAAGTGTGTCCCCACCTCCCCCTTTATCCTCAGCTCTCACTG
-GGTGTGTTTGCTGGGGAAGGAGGTGCAGCAGCCCTGGGGCCTTGGAaataataatagcca
-ctcaccctccagtgcttaccatgtgctgggaactctcctaagcgtgaacttaacctgtat
-tagcccatttaaccctcCATTTAATCCAATAACAGTTCCCAGgccaggcatggtggtgca
-tgcccatagtcccagctactcaggaagctgaggcgggagtatcgcttgagcctgggaggt
-tgaggctacagtgagtcatgatcaccctactgcactgcagcctgggcaacagagtgagat
-cttctctcaaaagaaaagaaaagaaaagaGggaaggaaggaaggaagggagggaggGAAA
-TCCCAATGACAATAAGCAGTTcaataaccctacaggaaaacactgtcatcaatcccactt
-tatagatagggctgtgggtctgagtagctaagtgactttgtccaagacagtggacaagag
-accacacggattttgagccaggccagctggctctgaatcccactgtctcctccctcctta
-aactagtgatgtcactgctctgagccctggtttcctcatctgtctccagggataaaaata
-gcagcttcatggggaagtttgaggatgacacaagatgacgtaagggaggtccccacacag
-ggctccacccacagGCATGAGAAGAGCCTTTCTCAGGAAGAATCCCAGGCCGCCCCTGGG
-GCAACCGCCGGGCTGGCCTTCCTGCCTCTCCTTAGGCCCAGCCTAGCGTGATCTGGATGG
-TGAGAGATTTCTGCAAAGCCCCCAGGGGCCTCCAGAGAAGGGAGGTGCCCGGTCTCCTAG
-ATAAGGGCTCCCAGAGAGGATCACAGCCCTGGAGTTGCCATTCTTGAATCACCCACTGTC
-TTCCCCAAGTTGATTGGTCTGAATCCATGTACTTATTTTTTAtattagttccataatgtc
-ttccttccaaccagctcatcttttacttatttatttatttatttattttatttatttttt
-tatacagagtcttgctctgtcacccaggctgaagtgcagtggtatgatctcggctcacgg
-caatctctgcctcctgggttcaagcgactctcatgcctcagcctcccaagtagctgggac
-tacaggtgcatgccaccacgtccagctaatttttgtatttttagcggagataggtttttg
-ccatgttggccaggctggtctcaaactcctgacctcaggtgatccactcacctctgcctc
-ccaaagtgctgggattacaagcatggaccactgtgcttgaccacaaccacctcattttaa
-aaaacttatctaaatttatttaacatggaaattttaaatcactgacctcaaatagaaaac
-tactatgatttgccataaagaagaggtaagcatacaattacatacaaaaaaagcagaacc
-aggttattccattccagctaaatcctgtttcttgctgaaggctccaagctgaactctgct
-gtctcattcttaacaagagaggtgttaaaaacatagaagctgtgaggccgggcacggtgg
-ctcatgcctgtaatcccagcactttgggaggccgagcgagtggatcacgaggtcaggaga
-tcgagaccatcctggctagcacggtgaaaccccgtctctactaaaaacaataacaacaac
-aacaacaatcagccgggcgtggtggcgggcgcctgtagtcccagctgcttgggaggctga
-ggcaggagaatcgcttgaacccgggaggcagagattgcagtgagctgagatcataccact
-gcatttcagcctgggtgacagagcaagagcaagactccgtctcaaaaacaaacaaaacaa
-caacaacaaaaaaaaaaaccatacaagctgttggccgggcgcggtggctcacacctgtaa
-tcccagcactctgggaggccaaggtgggtggatcacgtggtcaggagatcaagaccatcc
-tggccaacatggtgaaaccctgtctctagcaaaaatacaaaaattagctgggtgtggtgg
-cacacgcccatattcccagctactggggaggctgaggcaggaggatggcgtgaacccggg
-aggcggagcttgcagtgagctgagatcacgccagtgcactctagcctgggtgacagagcg
-agactccgtctcaaagaaaaagaaaaaaaaaaaaagaagctgttaaatgagactttctcc
-ctgagtctttggagaaacagcaagaaaactgaaagggtttaagtgtatcacaattatgat
-tcaaagttatgtcatacggtatctggagaccctaaaaccctctggcactcagccattgtt
-gtacatggtatatttcagaaaacactgACCTCACTGacctactccaactttctcttctta
-ttttacagataagaaatttgaagcccccgcaaagggaggtgacttgtccacaatctcaca
-ggctcagtggcttcagccagacttggaacgcaACCAGAAGTTCTAAGGCATCATGTCACT
-TTTGTGGGGGAAATGTATGAAGATGAAAAGTTTCAAGGACACCTATGGTGGAATTTTAGG
-CATATGGCAATCACTAGGGACACCCATGTGGAAGGAAAGGAGGCAGGCATGGCTCATGTC
-ATTGCTGTGGGCCCCACATCAGTGCTGGGGGTCAGAGACGGAACTCATCAGAACTATAGC
-AAAGAggccgggcacagtggctcacgcctataatcccagcagtttaggaggccaaggtgg
-gcggatcatttaaggtcaggagttcgagaccagcgtggccaacttggtgaaaccccgtct
-ctactaaaaatacaaaaacattagccaggtgtggtagtccacacctgtaatgccagctac
-tcagggagctgaggcaggagaattgcttgaacccgggaggcagaggttgcagtgagccaa
-gatcacatgccacttccctccagcctgggcagcagagcgagacactgcctcaaaaaaaca
-aacaaacaaacaaaaaaCCAAACCTATAGGAAAGAGAAAAGCAGCCTTCTGGGCTCAGAA
-ATCTGAGTAGAAAGATGTTCTGAGCCTGGAGAAAGAAATTCATAAAAGCCTGACTCTCTC
-TCCAGAAAAGAGTACATTTCTGCATTTAATTTTGGGAGGTTGGTCACCATTCTTTTCCTC
-GCTTCTAAATAAATGCTTATATAGCATTTAtattccagtcactttacaaatattgtcatt
-taattctcatgcaaaccaacgaggtaggaactattgttatccccattttacagatgggga
-aactgaagtacaaagagctgaagtaacttttccaaaatAGATGTGGTTTTGAACCCAAGA
-AATGTGATACAACTATGACATGAGGCAGTCCCAATGcattgaatccttatgactgcaatg
-caagggaggtataattaactgcattttatagatgcagaaactgaggcttgaggctatttg
-gtgtttctggtgtagatctaggagccaaactccagcctacctagactctttgcctctgct
-gtacccctggaccatgTGTTAGGAATTCTTGGTACAGGGTGGTAGTGCTCAATATGGTAG
-TGgttttagtctgttttctgttgcttataacagaatgtctgaaactgaacaattttgaaa
-gaaaaggaatttattccttacagctatggaggataggaagtccaagattgagggggcact
-tctggtgagggccttattcctggtctctgaagtgtctggaggtggcacagggtatagcgt
-ggagaggggactgggcatgctgacatgctatgctttggtctctcttcctcttcttataaa
-gccaccagttctcctcctgtgaaaacccacaaatccattaatccatgagtgggttagtcc
-attcataagggcagaggcttcatgatccaatcacttcttaaaagtcccaaccgctcagta
-ctgccacattgggggattaagtttccagcacatgacatttgggggacacatttaaaccat
-agcagtagccatttgccacatgtggttattgagcacttcaagtatggctaatgtggctag
-tgtgactgagaattttttattttattgaatattttaatttttttttttttttttgagatg
-gagtctcactctgtcgcccaggtcagagtgcagtgtcatgatctcggctcactgcaacct
-ccgcctcccggggtcaagtgattctcctgcctcaacatcccgagtagctgggattacagg
-tgtgtgccaccatgcccggcaaatttttgtatttttagtagagacagggtttcactgtgt
-tagccaggacgatcttgatcttctgacctcatgatccacccacctccgcctcccaaagtg
-ctgggattacaggcatgagccactgcgcccagcctcacattatatttctattggaacaca
-gaaTGGTCTAGAGAATTGGGATTTGACAAACCCAGCTGTGACAAGTCACCAAAATTTGGG
-GGCCATACCCAGGGTGCCGTTCCTGTCACGATACCCATAGGTCCATGTGGAGGCTGCAGG
-GATACAAAGCTCGTGAAATATCCCAGGATGgcatgggcactggagtcagctgccccaagt
-tcaaatctgaaatcagtctttttgttttttttttttttttgagatgcagtttcactcttg
-ttgcccaagctggaatgcagtggcgcaattggctcactgcaacctccgcctcctgggttc
-aagcgattctcctgtctcagcctcccgagtagctgggattacaggtacatgccatcacgc
-ccggctaaatttttgtattcttagcagaaaccgggtttcaccaccttagccaggctggtc
-tccatctcctgacttcaggtgatccgcctgcctcagcctcccaaagtgttgggattacag
-gcgtgagccaccgcgcccagcctgaaatcagtcttatacgaccagctgggtggtcttggg
-taggtcccttaccttaactcttcttgtctgcagaatggaggtgacttactgtttttctct
-gtctccctttcacatctttgcactcttcaccccttctcttccctcagcttttagtttaaa
-catcacctttctgataagccctgctgaaaatggccaccctcagtcatgacggagaacaag
-tctttcctattttattcaagaaaatgcatgatgcaatctattttaaatgatcatggtttt
-aattttattttcctgataatggtctatctctccactgatttataagatttgtaagagcag
-gggtggatcattctggtcactgctgagtccccagcatttagaacaggggctgacacaGCA
-CAAAACAACGTTAGTTGGGAATGTACAAGCAAACCCAGCACACCTTCAGAGGGGTGCTCA
-GGAAACAGCCCTCCCAcctttcttcacccctcacagctgtgggatcttcctaaccatttc
-ggtgtcccaggatagaggatgagtttattcacccctccccagcaggggagttgccaggat
-taaatgagatCCCAGAATGCCCTGGTATACCCTGAAGGCTCTGGGACACAGGTGAGCTGG
-TCCCCAGGGATTTGGAAACAGGAAAACAAATATGACTCCACCCTGCCTCCCATCCAGCCT
-CTGCCTAGAGGAGTTATtttattttattttactttttttttttttttgagacggagtctt
-gctctgtcgcccaggctggagtgcaatggcgcaatctcagctcattgcaactcctgcctc
-ctgggttcaagcgattctcctgcctcagcctcccgagtagctgggactacaggtgtgttt
-tttgtatttttagtaattttttgtacttttagtagaaacgggtttcaccgtgttagccag
-gatggtcttgatctcccgacctcgtgatccacctgcctcagcctcccaaagtgctgggat
-tacaggcataagccaccacgcccagccTCTAGAGGAGttattttacttacttacttattt
-atttattacacaggatctcactctgtcacccaacctggagtgcagtggcacaatcacgtt
-tcactgtaacctgaactcctgggctcaagtgatcctcctacctcagcttcctaagtagct
-gggaccacaagctcgtaccaccatgcccgctatctttttctctttgtaaagacagggtct
-tactatgtcatccaggctgttctcaaactcctggcctcaagcaatcctcccgtcttggcc
-tcccaaagtgctaggattacagacatgagccagctcacccagctGAGGAGTTATTTTTTG
-ACACTGGTGAATTCAGATCAAAAGGGATTTCTAAGAAAGGTGCTGGACCCAggccgggcg
-cggtggctcatgcctgtaatctcagcactttgggaggccgaggcaggtggattatctgag
-gtcaggagttcgagaccagcctgaccaacatggagaaaccctgtctctactaaaaataca
-aaattagccaggcatagtagcgcatgcctgtaatcccagctacttgggaggctgaggcag
-gagaatcgcttgaacccgggaggtggaggttgcagtgagccgagatcgtgccatcgcact
-caatcctgggcaacgagtgaaactctgcctcaaaaaaagaaaaaaaaagaaaGGTGCTGG
-ACGCCTAGGACGCAGAGGGGTGTTTCACCCCAAATCAAGTAGCACCAAGCCCTCCCAGGC
-CTTGGGTGCAAGCATATTAAAGGCCTCTTTCCCTCTCTGTCTCCATTGTTTACACTCCac
-tgagcatccgcaatgtgccacacactgttctaagcgtcttacacatattaaattatttaa
-tcctcacaacaactttatgaagtgagcgcaattatgagcccattttatggagcaggaagt
-tgaggcagggttttaggtagcttttctggggtagcactgtgggttggagcggaggtggag
-tgcactcttaggccagctggctctaggggctcttcaccactaggccgcactgCCTCTAGC
-AAAGGGACGCGGGGAAGCTCAGCAGACCTTAGGCCTCCCAAGGGCGCCACGGTGGTTCCT
-TTGAGCCCAGAGTCAGCTCTTAAGTCCATAGGCCTTCCTGAAGCTTCTGAACCACTTGCC
-CATAGCTGGGCCTCAGGCTGGCTCTCAGTAGAATGTGGAGAATGGAGATTCCCGCATGTC
-CACTTCTCCTAAAGGTTTTATAAGGCAGTGCTGGGAATGTGCTTTATAAAAAAGGGGAAG
-CACCCCGACAACAGTCACTGTTTGctcttttaagcaccatcctgagaaggaggaatgttc
-ttcccatttcataggtggggaaaccgaggctcagaagagcaaatttttggccgggcgcgg
-tggctcacgcctgtaatcccagcactttgggaggccgaggcgggtggatcacgaggtcag
-gagatcgagaccatcctggctaacaaggtgaaaccccgtctctactaaaaatacaaaaaa
-ttagccgggcgtggtgcgggcgcctgtagtcccagctactcgggaggctgaggcaggaga
-atggcgtgaacccgggaggcggagcttgcagtgagccgagatcgcgccaccgccctccag
-cctgggcgacagagcaagactctgtctcaaaaaaaaaaaaaaaaagagcaaatttttttt
-ccaaggtgatagggagagtccgtggctgaTGTCTGCACTGACCAGACGCCCCTAGGGGGC
-CAGCGAGGGCGGGTCCCAGGTGCAGCGGATGCAGAGGAGAGAggcccgggcgcggcgcgg
-gggATGGTGCGATCCCGGGCCCGAGGGCATCAGACGGCGGCTGATTAGCTCCGGTTTGCA
-TCACCCGGACCGGGGGATTAGCTCCGGTTTGCATCACCCGGACCGGGGGATTAGCTCCGG
-TTTGCATCACCCGGACCGGGGGCCGGGCGCGCACGAGACTCGCAGCGGAAGTGGAGGCGG
-CTCCGCGCGCGTCCGCTGCTAGGACCCGGGCAGGGCTGGAGCTGGGCTGGGATCCCGAGC
-TCGGCAGCAGCGCAGCGGGCCGGCCCACCTGCTGGTGCCCTGGAGGCTCTGAgccccggc
-ggcgcccgggcccACGCGGAACGACGGGGCGAGGTACTCGGCGGGGTGCGGCCTGCGGAC
-TcgcccggaggccggggggcgggagggggcggccggggAAGGGGGCGCCGGAAGCCTCTG
-GGCGTCTGCGTGTTGCCGCGTGTTACACGCACGCACGCCCCTTACACACCTTTTCACAGA
-CCCCGCCGTCGGGGCGCGGCCAGGTCAGATCCCTTTTGATCCGGGCCTGGGCTGAGTGCT
-CCCCCCGGGCTTCAGGTGACGCGGCCCCGCGGAGCGTGGGGTCGCCCGAGTTGGGCTGGG
-GAAGCCAGGGACGGAGGTGTCCGGCCGTCACCCCTAGAGGAGGGCGTGCGGGGGTCTGTT
-TTGCGTGAGTGCGGGATAGGGGAGTCGTGTGGTGCGGTGAGGGGCTTGTGGGGGGCACTG
-GAGGACTCTGGGGGTGGCGGGGGATCCGAGGGGGTCCTCGTGAACCCGCAGGGGAGAGTC
-CTGGGTGAGGGTGGGTCCCGAGCACCTGTGTCTCAGGAGATGGTGAGAGCTGTCTGGAGG
-GCTGGGCACTTGGTGGCAGGGGTTGGCGGTGCAGGGGACACCGCCGGGACAGGGCTGGGG
-TGCCCTGGAGCGGGGGAGCCGAGGGAGTGGGAGCGGGGGCGCAGCGCGCGATCTCTGGCC
-CGGCAGGGCCGCTGGTTCTCCCCAGTGCGCGGCTCCGGGTTTGCAGGTGGACGGTGCGCG
-CGTGTCTGCGGTGTGTGCTGTGCCTGCAGACCGGGGAGGGCGGGGGACGACAGCCACCTC
-CTTCCCTCTGCCTCACCCCCCTCCTGTCCCAGGGCCGCGCTTCAATTTCCGCTGAAACTT
-CTGACTCGGACACCCGCCGCCTTTCGCTTGGGCTCCCACGGGAGGGGCCTGGCTGCGGGG
-GGCGGGGCGGGGTGGGGGTGCGGCCTTGCTCGGGTAGACCATGGGTGTGACAGCTGGGAG
-GGCtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgtgCGCGCGCGCGCTTGCGCTTGATGTA
-ACCCGCCCTCATTTCCCTGGGTCCCGAGTGTGGCAGGGAACAGCAAGAGGTAGATATTAG
-GGGCTGCTTTCATTCCACATCACAGATTCTATTCTGCAGTGTGGTCTGCAAAATGCCTTG
-CCCAAGATGTATAGACTCAGTTACCGCATCTGTCCCCATCTGGGTGGAGCTTATCCCAGG
-CCCCAACAGGCTCTGAGGGATGGCCGGGGCCAAGGCAGCCTGGACTACTGATGTGGCACA
-GGCCAGAGGGACTCCAGGCAGTCTCCTGCTGCACAGGGCACAAAGCATGTGCACAGCCAG
-GTATCATCCTGCGTGACTCAGAACAGCCTTGAGATGTAAGGAGTGTCATCCCAGCCTCGA
-ACCTGGGGAGCTTTCTAAGACTCCCAAGGATGGTACTTATGCATCTTGCTGTGAAGAATA
-ACAGGATGAGTGCtaataatgaccatttcctgacacctacctggcaacaggtccataagc
-tctacatgcttcatttgtgttttcatttcatcatcacgaaaaacctgtaagctttgcatc
-ctgttcccactttacaggaactgaggctcagaaagcttgaggaacttgaccaggggtacc
-ccccagctagaaagggtttgagacaggattagaacccaggaatatctgactacagccact
-ccttactgcaTTCTTACCAAGCCAAAGTCATGACCTTTCACTCATGTGGGGAGGCCTTCC
-CTTCCAAGGCAGCTCTTCCATTTGGGAGCAGCGTACTTGGAGAGGTGGGCCTCTGTCTGG
-TAACTGACTCATGTTGCCTTGTTAATCCTGCCTTGAACTGTTGGGAAGGTCTTTAACCAG
-GCTGAGGTCTCTCGCACCAATGCCCATACCTGGGCATGCACCTCCTTGGAATGGAGTTTA
-AGTGGGTGGGCAGATGGGTTCTAGAGAGAACCCGTCTGCCCTGACCATGCCCTACTGCCC
-TCTCCTTCAGCCACCACACACACAGTCACACAGCTGCGTGAATGGTGgctttcctttcac
-ttaacagttcactctggagatccttccaattaccctataaagagcatcctcaacctttta
-aatggctgcacattgttccgttgtgtggatgaagtataatttatgtaaccagccctgtaa
-ttatagacagccaattatttctgtcaaaagggctgcaggaataactgtgtatttgcatgc
-ttacacacacacacctctacagaataaattcttagcaatgggattaattgctgaatcaaa
-gctcacacgcttttcatcgttgtttttgttttgttttgttttgctttgttttgagacagt
-ctcactttgttgcacaggctagagttcctgaccatggctcactgaagcctttaccttctg
-ggctcaagtgattcccctacttcaacctcctgcatggctgggactacagctgtgtgccat
-catgaccagataattttttttttcttagggacagggtctcgctacgttgcctaggctggt
-cttgaactcctgggctcaagtgatcttcctgcttcagcctcccaaagtactgggattaca
-ggcatgaagcactgcacccagcctgtttttcattttgatattgtcaaaatgcactcctca
-gaggtggtaccttttatcctcccactagcactgtCTTCATTGTTAGTGGCTGCACTGCCA
-CTATTCCACAGTATAAACCCACTTTTCATGACACTGCCAAGACATAAGGGTCTGAAATAC
-TTAACAGTTTTCTTCCACAGTCCCCAAAATACAGGCTtctcccccagctcaggacatgaa
-gccatcatccctcctcattgcaggagccaaaggctggacctcacctcgattccaccctct
-ccttcacccctcacatccaatccatccagtccatccagtctgccactgagtcctcttgat
-cttcctcctatgagcccttaacttcgcgtctccatctagcaccccctagtccaggtcacc
-ttctcctgcctggactcgtgcttgtgtgggcctcctagctagtctcactgccccgtcttg
-tactttcaaatccaccctaaaagcatgatgttcccctgctgaaatccttcagtggctccc
-cactgcctttggataattccaaatcctattgtgtgttaattaggattaggctcagctgta
-atatagaaacagccacttaatagctaaaatgaaatagacgtttttttcttctttttctct
-ttttttgagacagagtcttgctctgtccccaggctggagtgcagtggcgagatctcagct
-cactacaacctctgcctcccaggctcaagtgattctcctgcctcagcctcccgagtagct
-gggactacaggcatgcaccaccatgcccacctaatttttgtatgtttagtagagatgggg
-tttcaccatgttggccaagatggtctcgatctcctgaccttgtgatctgcctgcctcggc
-ctcccaaagtgctgggattacaggcatgagccactgcgcccagccttcaatagatgttta
-tttctctcctgtgtaaaaaacctggaggtctggcctgacaactccatgtgtcagggacct
-aggctcctctcttgctctactgtatgtggtacttctgaagccaaggtagatgctggagct
-ccagcagttaggtccacattccagcatacaggaaaggaggaaatgaggaagttgggccct
-ccctttaagaacactgtcctgggcattgtacacaacacttccacttgtgtcctactagcc
-atatgctgatacaaggatacaagggagacaggaaatgcagtttattctaggtgtccttgt
-gctcagctgaaaatctcaggttctaatcctatgtaaggaggggagacctgaaactgggga
-ccactaaccacctctgccatatgatgctcgtagagcccttcacaatagggcctctactaa
-cctcaccttatttttatttatttatttatttttgagacggagtttcactcttgtcgccca
-ggccggagtgcaatgacactatctcagctcaccgcaacctttgcctcctgggttcaagca
-actctcctgcctcagactcctgagtagctgggattacaggcgtgtgccaccacgcccggc
-taatttttgtagttttagtagagacggggtttcaccatgttggtcaggctggtctcaaac
-tcctgacctcaggtgacctgcctgcctcggcctcccaaagtgctgggattacaggtgtga
-gccaccacgcccggcctattttttttttttttttaacttttcacttttttttgcagtcac
-gctcattctccaccgtgttcttggggaacatgcagcatgttcttttgcctcTTCCCTCAC
-CCCAGAACAGGggttactggacagcggcatcaacttcacctgggaactggatagaaatgc
-agattcagaccttctgaatgagctactttgggagtagggcccagcaatgtatgttgaaac
-aggcctccagatgatctcaatgcttgctcaagtttgagaaccactgAACCGCAGTATGAC
-TCTCCGTGTCAcctggctaactctgcctcactttcaggtctcagtgtagacaccacctct
-tctaggaagacctctcttgacccaccagcccaggagagaggcctctctgggttcctagag
-gcccatgcttctctgTATAGTAGGGCTGATCACACTGTATGTGAtttttttttttttttt
-tgagagagtctttactctgtcaccaggctggagtgcagtggcacaaacatggctcactga
-agcctcaacctcccaggctcaagcaatcttcccacctcagcctcccaagtagctgggact
-acaggcatccaccaccacacccagctaattaaaaaaaaatttttttttgtagagacaggg
-tctcactatgttgcccaagctggtcttgaacttttgggttcaagcagtcttcccaccatg
-gccttccaaagtgctaggattacaggtgtgggccactgcacctagccTTGGACGTGATTT
-TATTACTCATCTGCCCTCCAAATTGACTGGAAGATCCTGACGGCAAGACTGCTGTCTAAC
-CTACTTCTCTTCCTAGCACCCAGTGTTAAGTGAATGAACAAGATCATATCTCTCATCTGT
-GAATGTACGAGAGCCATGGATTATGAGATTAGTTGATTTTCTTAACTATAATTTTTAGAA
-ACAAGCTGTGTTTTTAAGCAGGTATTTATTTCCTTAAATGTACATTTCTGATTACAAAAT
-ACttttttttgagacagagtcttgctctgtcacccaggctggagtgtagtggcacaatct
-cggctcattacaacctctgcctcctgggttcaagcgattctcctgcctcagccttcccag
-tagctgggattacaggtatgcaccaccacgcccggctaattttttttttctcccgtgacg
-gagtcttgttctgttggccaggctgaagtgcagtggtgtgatctcagctcactgcaacct
-ccacctcccgggttcaagtgattctcctgtctcagcctcccaagtagctgggattacagg
-cccacgccaccacgcctggctaatttttctatttttagtagagatggggtttcaccatgt
-tggccaggctggtctcaaactcctgacctcatgatccaccaccttggcctcccaaagtgc
-tgccgtgggctgcactttggcattgccttggtcacgtgctgctacctgggattacaggca
-taagccactgcgcctggcctaatttttgtattttttagtagagacagggtttcaccatgt
-tggccaggctggtcttgaactcccagcctcatgattcgcccaccttggcctcccaaagtg
-ctgggattacaggcgtgagccaccacgcctggccAGGAAATACATTTACATGGCTCAAAT
-TCAAAACTATAAAAGTCggccaaacatggtgactcacatctgtaatcctaacactttggg
-aggctgaggcaggaggattgcttgagctcaggtgagaccagcctaggcaatgtagggaga
-cccccatctctacaaagaataaaaaaaaattagtcaggcatcatagtgcacacctgtagt
-cccagctacttgggaggctgaggtggaagaatcacctgaaccctgaggtcgaggctgcaa
-gtgaactgtaatAGTAAGAGTCTCCTCCTAATCTTGTGCATCCTTTCAGAGAGAGAGATG
-atagatattcaaacaaatacatacatatatataacatatttatatatattctttttaaca
-taaaagtatagccaggtgtggtggttcactactagagtcccagctacttaggaagctgag
-gtgggaggttcacttgaggccacgagtttgagaccagcgtgggcaacatctcttggggaa
-aaaaaaaaaaaaacccaccataaaagcattctataacacgtaattctgtgtttgtctttc
-ttctcttaatacatcttggagatcagtacgcatcagtatatagagagcttccttgtcctt
-tttcagggctgtgtagtattctgctgtatggctataccatgatgttttcactagctttct
-actgcctgacatttgggatatttcctgcttttgctattggacacaaggctctgatgaaca
-gcctttactatatttaatttttttgtgagaagtttaactggaagataaattcccagaagt
-ggggcacccagttaaggatatgtgactttgtcattttaacacacactgccagatcacccc
-ctataaatgttgtgccacgtatcctcccaccagcaGGGGAAAGGAGGGGCCACCAAGCAG
-TCTCACTTTAGTGCTTTTCTCTCCTTTTTACCAGATGCGAGCCACCCCTCTGGCTGCTCC
-TGCGGGTTCCCTGTCCAGGAAGAAGCGGTTGGAGTTGGATGACAACTTAGATACCGAGCG
-TCCCGTCCAGAAACGAGCTCGAAGTGGGCCCCAGCCCAGACTGCCCCCCTGCCTGTTGCC
-CCTGAGCCCACCTACTGCTCCAGATCGTGCAACTGCTGTGGCCACTGCCTCCCGTCTTGG
-GCCCTATGTCCTCCTGGAGCCCGAGGAGGGCGGGCGGGCCTACCAGGCCCTGCACTGCCC
-TACAGGCACTGAGTATACCTGCAAGGTACGTGCCCATGGGCGGCTGTCCCCCAGCACCAC
-AGGAGGCCTGGGAAGGAGGCCTCCAAAGGATTGCCAGGGTGCAGAGGGGTCCTTATGTTC
-ATTCATTCTTGTGTTTGTTTAGTGGGGAAGCATCCAGGGAGCCCCTGCTGGACTGATACT
-AGAGAGGTAAACCAGAGGTCGTCCCAGTCCTGGGGGAGTTCACAGCTTAGGCCCTACAGT
-GTGATAAATGCTGCAGGGGTAGAACTTAGGGATCATGGGCGCAGAAaaggccgagcagaa
-gttagccaggtagaagtgggagatgggagttgcaggcagggggaacagctgttcaaaggc
-ctagaaaagtgaggggatagcactttagagaatgaaaaggacttctctgtggccagagtg
-gagaggatgtgcagaaaggggcaggagatgaagGTTGGCAGCAGCTGGTCATGAAGGTGT
-TAACAAGGGGCCTCCACTGGGCTGTGCGGAGCTACTGAAGATGTTTGCACAAGAGAAGGG
-TAGGGCATGGTAGACATCAAAACTCCTgggacctcggaggtgatcgagcctaacctgggg
-ccattttacagataggaagactgagatgaagacaggagaagggccatgcgtgaagtcaca
-tagcACTGGGCCTGGCTCCTGGGGTAAACTAAGGGGTAGAAAAGTCTGAGGATTCCTGGC
-AGAAACCAGGAAATGGACAGGGTCAAGGCCCCTGAGGGTCAGCCCATGCAGGACACTGAC
-AAGTGACAGTCCAAGAAGACAGAGATGAGAATAAAAAGTGTAACAAtaggtattcactgt
-gcaccaggtactatgatgattgcttagtgtgcacaatctcttttaatcttgacacaacca
-atgaggtggtttctatcattgtgccccttttatagatagaggacactgagactcagaaag
-ccatggttacttgccacatgacagagccaggtggtatcagagctgggattgggcccagga
-ggctgagcccagagagtcctgtgcccGTGCTAGGATAAGCGTTTCACACAATCAGGGCAG
-GCTGCCCTGGCAGGCAAGCATAAGGAAGATAAGGGGGACCTGGAAACCCAAGGGAGAGTA
-GCGGGGGCCTGGGTCCCTTGGGAATGCACAGAGAAGCAGAAGGACTTAAGCCTCCTCCTG
-GGGCAGCAGCAGAGCTTTGCTCTGTTGACGGAGATGCAGTGAACAGCGGGGCAGATCCAG
-ACAGGGTCCAGCCCCTAGCTTCACCTGGCCTCTTGTGCACAGATCTCCAGCGCCCTTACC
-AGGTGCCCTAAGGAGCCCAGAACTCTGGGTCCCCTTCCTGCAGCATCACAGGCTCTTTTC
-CACTCCCGCTGGGGAGGTGAGTCCATGATAAGAGGAATAACCCAAGCAGGCTCAGGAGAG
-AAGCGCCATGCGTTCACAGGGCCCTGATTCTCAAGAAACATTTGGGAAAATCCACTGGAA
-CATACTCACCCCTATGCCAATGTGCACCATGGGTGCTGAATGGTCATTTCCACACTTCCT
-CAGCTTTTCTGGTCAGTGTGTAGAAAGATCAAAATCTTGTCTTTGTAAATGATCAACTTa
-ttcattaattcaacacaacttcattgagcacccgtatttgccatgtaccatgctgtggtt
-aaaaaacaaagttctgttctcatcaagctgacgttctagtgggagatacagacactaaac
-aagcgaataagtaaaatacgtgtcaggtggccgggcgcggtggctcacacctgtaatccc
-agcactttgggaggccgaggtaggcagatcacctgaagtcaggagttcgagactatcctg
-gccaacatggtgaaaccttgtttctattaaaaatacaaaaaattagccgggcatggtggc
-aggggcctgtaatcccagctactcgagaggctgaggcaggagaatctcttgaacctggga
-ggtggaggttgcagtgagccgagatcacaccactgcactccagcctgggcaacaagagca
-aaactccgtctcaaaaaaacaaaaaacaaacaggaaaaCCCTTATTCCAGCATCTTTCTT
-GGTTCCTTTGCAATGCTTATCAGCATTTGTCAATATTTGGTTTCTGGGCATGTTTGCATG
-GCCTCCCAGTGGGCACCGGAGAGCAGAGCCCATGGCTGTCAGTCTAGCTGGACATGTGGC
-TGGCCCGTGCAGGCCCAGGGCCAGCATACTGAATGAATGAAAGCGTGGGTGGGCAAAGAG
-GACGGGAGCTGTGACGGTGATGAGCATCAGGTGCCTTCTGCATCATCCGCCCTTCCGGAT
-TCCTCCTGCTTTGTGGGTTATTTTTCTGTTTGGGTGACCTGTTACTTTTCAGTTATCCGA
-TGTTTGAGGCCAtatagcgtagcagttaagagcacagacaaaaggccgggtgcagtggct
-cacacctgtaatcccagccctttggaaggctgaggcgggaggatcacctgaggtcaggag
-ttcgagaccagcttagccaacatgatgaaaccccatctctactaaaaatacaaaaattag
-ctaggtgcggtggcacatgcctgtaatcccagctacactgggggctgaagcgggagaatc
-acttgaatccaggaggcggagtttgcagtgagctgagattgcgccagtgtgctccagcct
-gggtgacagagcgagactccgtctcaaaaaaaaaaaaaaaaaaaaaaagcacagacagtg
-gagtgcatacgtgcaaatctcagccgtgctgtttgctggctgtgtggcctctcagcttcg
-ttaaccgtaaaatggagcaagtcatcctaccttataggaccatggtcagggctgagtgac
-tcggtcagtgaagcgcttggtgcgatgcctagcacatggtagtgtctaataGGTCAGCTG
-TGACTGTTTGCAATGCCAGCCTCAGCTCCCGGGAGTCCCCAGCTGTGCTAACACCATGCT
-CTGCCCACAGGTGTACCCCGTCCAGGAAGCCCTGGCCGTGCTGGAGCCCTATGCGCGGCT
-GCCCCCGCACAAGCATGTGGCTCGGCCCACTGAGGTCCTGGCTGGTACCCAGCTCCTCTA
-CGCCTTTTTCACTCGGACCCATGGGGACATGCACAGCCTGGTGCGAAGCCGCCACCGTAT
-CCCTGAGCCTGAGGCTGCCGTGCTCTTCCGCCAGATGGCCACCGCCCTGGCGCACTGTCA
-CCAGCACGGTCTGGTCCTGCGTGATCTCAAGCTGTGTCGCTTTGTCTTCGCTGACCGTGA
-GAGGTGAGTGTGGTCTCAGAGACCCCAGCCACAGACACACCCAGGGGGTGGGCCATGATG
-GAGAGAAACCGAGGCCCAGGAAGGCAAGGTAACTTAGGCAAGAAGTGGGAGAAACTGAAG
-TAACCAGCAGCCCCTGTTTAGTTCCCTGAGAAGAGTTGACTCAggccaggtgcagtggct
-cacgcctttaatcccagcactttgggaggccgaggtgggtgaatcacttgaagtcaggag
-ttcgagaccagcctggccaacatggtgaaactccgtctctactaaaaatacaaaaattag
-cctagtgtggtggcgcacacctgtaatcccagctactctgaaggctgaggcaggagaact
-gcttgaacctgggaggcggaagttgcagtgagccaagatcacgccactgcactccagcct
-cggcaacagagtgagattccatctcaaaaaaaaaaaaaagaGTTGACTCAGTCCTCTTGG
-GAGCCCCTTGGGATTCTGGGATGGAGCACTGAGATGTGAAAGTCATAGTAGCCGACAGTG
-ACGAAAGCATCGCCACATTATCTAACGTGGTCttccatccttacaaacacgaggcaggta
-ctgttattatccccatatgatcaaggaaactgaggcccagagagctcaagtaacttgccc
-aagatcccatagcagaataaatggtagagctgggatttgaacctagatctgactccagag
-cctgggtcttaaTTCAATCTGAGCTTGAGAGGCAGGGGcctggctgggcttaccaactga
-ctttgggtgacctagtgtctctgagcctcagtttctccgttggtaaggaaaagggctgga
-ttGTTAGGGTGTTTTCAGGATTCCAAGACCACAGCCAAAATAGGGTCTGAGGTTCCCCAC
-ACGGGAACGTTTTCTGTGAAACTGAGAATTAGCACTTTTTGGTTAAAAGAATCTTCCTTC
-TCTAGGTTGGGATGCTAAGAAtttttttttttttaattgagacagagtctcactctgtca
-cccaggctggaatgcaatggcgcgatcttggctcactgcaacctctgctgcctgggttca
-agtgatacgcctgcctcagcctcccgaatagctgggactacaggcatgcgccaccatgcc
-tggctcattttttctatgtttagtagaaacggggttttgccatgttggccaggctggtct
-tgaactcttgaccttaggtgatccgcctgcctcggcctcccaaagtgctgggattacagg
-tgtgaggtactgcacccagccTAGACGCTAAGAAAAATTTTTAAAAGATAATTCTGGGGA
-GAAGGGCAGAGAGACTCGCCTCCTGTTCCCTCTCCAGATTCCTGGGGGCAGTCAAGATGT
-GTCAGGGAGTGCACTAAGCTGCCAGTTACACAGGAGTTTTCTGTGGAGAAAGGAGTGTGA
-CCCCATGGCATTTTAAAAAACtttttatcttgaaataattttagacttttagaaaaccta
-caaaaatagttcaaagagtttctgcatatcctttaaccagtgctctccaatgttaacacc
-tgacgtagctatggtacaattacccaaactattaactaagccacagattgattcccactt
-cccgagtttcccactaacaccccttgctgtgcaggatccagtgaggatcccaatttagtc
-atcagtggtttccttggtctcttccaatctgagacagttcctcagtctttccctgtcttt
-gaagacccatgaccttgacacttttttttttttgagacagggtctcactctgtcacccag
-gctggagtgcagtggtgtgatcacagctcactgcagcctcaacctcccgggctcaagtga
-tcctcccacctcagcctcctgagtagttggttctacaggtgtgtgccaccccacctggct
-aattgagatggggtcttgctatgttgcccaggctggtctcagactcctgagctcaagcaa
-tctgcctgcctcagcctcccaaaatcctgggattataggcgtgagccactgctcctggcc
-ataaccttgagacttttgaagagtactgatcagttactttgtatgtccctcaatttggat
-ttgattgatgttttctcacagttagattgcagttatgtatttttggcaagaacaacacag
-aatcgataggcccctctccacatcatatcaagagatacttgagctgatagtcattcctat
-gtcgtgaccttgatcacttggttagggcaggacctaccaggtttctctactgtaaggtcc
-taatttaccctttgtaattgacaaataccttgggggaggtaagctaggcatataaatatc
-ctgtttttcctcaactttcacccactaattttagcagccatccatcttgcctatagcagt
-tattattgtggtgcttgcctaagtctaattttctttttcttttttttctttctttctttt
-ttttttttttttgagacagagtctcgctctgttgcccaggttggagtgcagtggcacgat
-ctcggctcactgcaacctccacctcccgggttcaagtgattctcgtgcctcagcctcttg
-agcagctgggattacaggcacacaccaccacacttggctaatttttgtatttttagtaga
-gatggggttttgccatgttggccaggctggtctcgaaatccgcctgccttggcctcccaa
-agtgctgggattataggcatgggccgctgcgcccagccCCCAAGGCTGATTTTCTGTTAA
-TATTTCCTTCTACATTTTATATTAGAACAAGCATGCCTTTTTTAAAGAAGTAACATTTAT
-AATGATGTTTAAGCTAGTACATAACTTCAAACACATTTTAGGCTTAGGGTAGATACAACT
-ACCCCGGACCTCCTGGAGGAGACAGCGTGCTTCCTGCTCTTTTCAAGAAGTCACTTgatg
-gcccacacctgttatcccagtgcttcgggaagccaaagtaggaggactgcttgagcccag
-gagttcgaggccagcctaggcaacacagaaaaccccatctgtacaaaaaatttataaaaa
-ttagccaggtgtggtgatgcacacctgtgatcccagctacttgggaggctgaggcaggag
-gattgcttgagcccagaagtttgaggctgcagtgaactaggattgcaccactgcactcca
-gcctgggtggcagagtgagaccctatctctaaagaaaaaaaagaaaaaaaaaaagaaaaA
-TCACATGagagtcattggtagaagagggaccgtgagttagatagacctgtgtttaaatcc
-tgggttctgcttcttacctgctttttggccctgagcaaatgacttcacctgcctgagcct
-ttgtttcttcatctgtaaaatgggctaataatgctgacACCCCTTGTCCCCCAATACTGT
-GATTCATAGGATTGGTCAGTATTTGTGAAATGCCACTGGACACCCAGGAAGTAATGCCAT
-AAAGAAGAAACTAATAGCAGTGGTAATAGAATGATTACTATTAAAGTCATCTTTGAGTGC
-TCAGTGGAAGTTGTTTAAAGTAGAAATTGCAAATGGCAGGACACACtttttttttttttt
-tgagacagggtctcactctgtcacccaggccggagtgcagtggcgcgatctcagctcact
-gcaaccgccacctcctgggctcaagtcatatccttctgcctcagcctcccaagtagctgg
-gactacaggtgcgaatcaccatgcctgctaattttcgtattttttgtagagataggtttt
-taccgtgttgcccaggctggtcttgaactcctgaactcaagtgatccccctacctcggcc
-tcccaaagtgctaggattaccggcatgagccaccgcgcccagccTTACACACTTTTTTTT
-TTGCCCTGCTTACCTGTTTGTGTTTTTTATATAAACTGGTTGCCAATATTTTTTAAATGG
-GGACCTTTTCATTAAAATACAATTCCTGGCTTCTCTTGGGGAAAACAATGGGAATGTGGG
-GCCATCTTGGGAACTGCGAGGGTGGGTCACAGCACTGGCTCTGAGTATCTGCCAGCCAGC
-GTTCCCATCCCAGGCCCATGCtctacagctgtaaaatggtgtcttccttgcaggctgtag
-cctagatagaatgaggtgagccaggtaatgagctgggtcaagggccaggaacacagcagg
-cacttggtaaaCCCTAGAATGCGTTGTGTACCCTTTTTAGGTAGCGCTTGTGCTGAGATG
-TCAGGCACACTTCCTGTTTCTCTCATCTTATTACCTGCCTGGACCCTAAGTTTGTAGCTG
-GTTTAAGAGAGGCTTAACCCTCTCAGCCCCATCAGCCCCCTCCCCAAGGGACTCTGTTGA
-AAAATGTATTCCTTTCAgaattttagtttaaatttaattgctctgtggccttaaatgact
-taacctctctgagcctgggcttgggtatctgtaaaacaggATCAGACATCACAGGACTGG
-CTTGTGTCTGTCAAAGGCCAGCAGGCACTTGGAAAGTGGGTGCCACAAGGGTGATAGCAT
-GGGGTGGTGGCATGGGGGTTCTGGGTAGGACCTGACCCTTCTGTTTCTCCCCATGTCCCA
-GGAAGAAGCTGGTGCTGGAGAACCTGGAGGACTCCTGCGTGCTGACTGGGCCAGATGATT
-CCCTGTGGGACAAGCACGCGTGCCCAGCCTACGTGGGACCTGAGATACTCAGCTCACGGG
-CCTCATACTCGGGCAAGGCAGCCGATGTCTGGAGCCTGGGCGTGGCGCTCTTCACCATGC
-TGGCCGGCCACTACCCCTTCCAGGACTCGGAGCCTGTCCTGCTCTTCGGCAAGATCCGCC
-GCGGGGCCTACGCCTTGCCTGCAGGCCTCTCGGCCCCTGCCCGCTGTCTGGTTCGCTGCC
-TCCTTCGTCGGGAGCCAGCTGAACGGCTCACAGCCACAGGCATCCTCCTGCACCCCTGGC
-TGCGACAGGACCCGATGCCCTTAGCCCCAACCCGATCCCATCTCTGGGAGGCTGCCCAGG
-TGGTCCCTGATGGACTGGGGCTGGACGAAGCCAGGGAAGAGGAGGGAGACAGAGAAGTGG
-TTCTGTATGGCTAGGACCACCCTACTACACGCTCAGCTGCCAACAGTGGATTGAGTTTGG
-GGGTAGCTCCAAGCCTTCTCCTGCCTCTGAACTGAGCCAAACCTTCAGTGCCTTCCAGAA
-GGGAGAAAGGCAGAAGCCTGTGTGGAGTGTGCTGTGTACACATCTGCtttgttccacaca
-catgcagttcctgcttgggtgcttatcaggtgccaagccctgttctcggtgctgggagta
-cagcagtgagcaaaggagacaatattccctgctcacagagatgacaAACTGGCATCCTTG
-AGCTGACAACACTTTTCCATGACCATAGGTCACTGTCTACACTGGGTACACTTTGTACCA
-GTGTCGGCCTCCACTGATGCTGGTGCTCAGGCACCTCTGTCCAAGGACAATCCCTTTCAC
-AAACAAACCAGCTGCCTTTGTATCTTGTACCTTTTCAGAGAAAGGGAGGTATCCCTGTGC
-CAAAGGCTCCAGGCCTCTCCCCTGCAACTCAGGACCCAAGCCCAGCTCACTCTGGGAACT
-GTGTTCCCAGCATCTCTGTCCTCTTGATTAAGAGATTCTCCTTCCAGGCCTAAGCCTGGG
-ATTTGGGCCAGAGATAAGAATCCAAACTATGAGGCTAGTTCTTGTCTAACTCAAGACTGT
-TCTGGAATGAGGGTCCAGGCCTGTCAACCATGGGGCTTCTGACCTGAGCACCAAGGTTGA
-GGGACAGGATTAGGCAGGGTCTGTCCTGTGGCCACCTGGAAAGTCCCAGGTGGGACTCTT
-CTGGGGACACTTGGGGTCCACAATCCCAGGTCCATACTCTAGGTTTTGGATACCATGAGT
-ATGTATGTTTACCTGTGCCTAATAAAGGAGAATTATGAAATAATTTTATTTTTCTCTGCA
-ATTTCTTCCATCCTTTCCAACGATCTCTTACCAGTTTTTCCTGCCTTCAAAACTGGCCCC
-CATGGTGAAAGGCCGTAGAGTTGTGTCTTAACCTGGGCTGAGTGGTTTGTGAGAACAGAT
-TACCTGGAGCCCAGTGGGTCTTCCTGCACTCCTTCTGTTTCTTCTGGCAGCAGCAGTGTC
-TCTATTAGGGTACTTTCTGAGTCaaaatggcttcaacaagatggaaatatgtttcacaca
-aaacaagaagtcagcagatagggtgggcttcagtgctggtccattcaactcccaaagctg
-cgcacagggaccccggctctccaggctccttctgtctctTGGCTGTATTGTCTCGAGACT
-GCTGGCCCAATGGCTACAGCAGGTGTCACATTAAAGAGGTCCATGACCAGAGGAAGAAGC
-CAGGGGTCATTGtagtacctgagaactcagaactctggagtcaggctgcctggaattaaa
-tcctggctccagcactcaatagctgtttgacccttggcaagtttcttaaccactctatgc
-ctcagattcttcatctgtgaaatgggggacaatgatagtacctaacttatgagaactaaa
-tgacttattttgtataaagcaattagaacaagcagcgcctggcataataagcccacaata
-aaagttACTCCCggctgggcacggtggctcacgcctgtaatcccagcactttgggaggcc
-gaggtgggcagatcacaaggtcaggagttcaagaccaacctgaccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaatttttagtagagacggggcgtggtggtgcgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaattgcttgaacccgggaggtggacgtt
-gcagtgagccaagatcccgccactgcactcagcctgggcaagagagcgagactccgtctc
-gaaaaaaaaaaaaaTGGTGCTCCCACATTTCTTTCTTGGGATGGAGGaagctttcccaga
-agcgctcctgaccgactttcccacacatctcactggtcagaactgcatcacttgccgttt
-ctgaccaatcaccagcTTACATTCATGGGGCACGTGCTTACACTAACCATGGCACTCCTC
-GAGCTAAGTGGAGCTCATGCGTCATATGGAGGGGTAGTGACTCCTGAGCAAAACCAGGTT
-CAAAGAGGGAGGGGATCGTAGGGAAAAGAATGTGCGGAAGTgcggaggcccagccaacag
-cctgctaactgcagatactcgagagcggccaccctagatcatctgacccaggctggccca
-cgctagaattgcccagtgacccgcaaggtcatgagctaattgagctaaataaaatcattg
-tgtttttttgtttgtttgttttgtttttgttgttttgttttttgagacagagtctcactc
-tgtcacccaggctggagtgcagtggtgcgatcttggctcactgcaacctctgcctcccgg
-gttttcaaacgattcttctgcttctgcctcagcctcccgagtagctgggattacaggcac
-gcgccactacacccggctaatttttatatttttagtagagacgggggtttcgccatgttg
-gccaggctggtctccaactcctgacctcaggtgataggcccacctcggccacccaaagtg
-ctggtattacaggcgtgagccgccgcacccggccaatcattgtggttttaagtcactaag
-tttgaggctattttgttttacagcaaaagctaactgatgcaGACAGGGACAAGTCAGTCT
-CATCTCTGTGCACCCAGCATTGCCCAGAACAGGGCCTAGTTGTGTCTAGGGTCTCATGGG
-GCAGCCCCTGACCTCTATCTTGCCCCTCCCAGCTTCCAACAGACCCTGTCCCAGCTCCCT
-CCAAGCTGAGTGTTGGCCTGATACCTACCAGTGGAGCGAGGGGAACACGAGGACTGCCAA
-GGGcaggtaccgtgccaacccttcactccattccacaaagagactcatttactcctcatg
-acaatccagtgaggcagatgttcctgtcactttacagataagacaaatgagctttagaga
-gagcagaagactcatccaagacctcacaacAGAGAAAAAGACTCCTCTGGTTTTTGCCTT
-GGAGCAGGAACTTTTGACAAGGCTGCGCAGATGCAGCCACATGAAAACCGCCCATTAAAA
-ATGTAATATCggcccggagcgggggctcacgcctgtaatcccagcactttgggaggccga
-ggcaggcagatcacttgaggtcaggagttgaagaccagcctggccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaaatagccaggcgtggtggcatgggcctgtaatcccagc
-tactcgggaggctgaggcaggagaatcacttgaacccaggaggcagagattgcagtgagt
-caagattgcaccactgcactccagcctgagcgacagagcaagactctgtctcaaaataat
-aataaaaTGTAATATTCACTCTTATCAAATAATGGATGTCACCACACCCCGACCCTAATT
-AGTGAGGACTTTCATGTTCTACTTGTCTTCATTTAATCATCATTGTATAAGAGTTTTACA
-ATATCAAATTAGTAGATGTATATTACTGAAAGGGAAGGACTGTTAGAAATTTACTTGAGG
-AATGTCTGCCACTGGGGGCTGAACACAAAAGATCCTATTGTGACCTGCCAGATTATTCat
-tcacttagcaattcaacaaccatcgctgaatgcctactataggccaggtgccatgcaaga
-cagatgtgctcccaccctcaagggttcacagtctaatagaggagagagatgttaaacaga
-taactgtacagatggcaTAGCTAATTATATTCGTGGAAGTTCGTTGTGGCAAAGACAGGC
-ATCTCAATATTTCAGGAGCTCCCctatattttctagcctcccttacagtcacatgactag
-ttctgaccagtggggtgtgtgtaggagtgGCAGGCTGAAGCAATGGAGAGCTGGTGAGCC
-TCATCCCTCTCTTCCCCTGCCACAGCCACCTTGCGCCCACAAGTtcccttagctacaagc
-tggaggagagccaccagatccaccttagatttcactgagcaagaaataaagcttcttgtg
-ttaagtctttcagatttggagtttgtctggtagatagtgttaattaccatgactaaGGAA
-AATTTGCCATTAGTGAAGGGAGGAAAAATATTCTCCACCAGTAACAAGGCCATGTCAGTC
-TGCTGCATTATAAACCCCAAACAGtagtttatgatcctctgggctggcaatttgggctga
-attcagctgggtcactcctgcagctgcaggcagcaagcagctcgaatgtctaccttgcca
-ggaaggctcttctctgctccacatggcctcgtcctccaataggcatagcctactccttcc
-tatggtggtctcagggtttcagaaagcaacaagagaggacaaattccagtgttcaagctg
-cactagtgtcaaagcatatcaaatagcatgtcaaattccacatcaaattcaggatgcagg
-caaattgattctttctcttgatgggaagagctgaaaaTAATGTGTGGTCTTGTTTTTCAA
-TGTAcagtggtcccatttatccaggggggatacattccaagacccccagtggatgcctga
-aaccacagatagtacagaattctgtatataccatgttttttactatacatacatacctac
-gataaggtttaatttgtaaattaaactcttacaaattaagagttaacaacagctgggcac
-agtggctcacgcctgtaatcccagcactttgggaggccgaggtgggcggatcacgaggtc
-aagagatcgagaccatcatgaccaacatggtgaaactccgtctctactaaaaatacaaaa
-attatctgggtgtagtggcgcatgcctgtaatcccagctacttgggaggctgaggcagga
-gaatcatttgaacccgggaggcggaggttgcagtgagctgagatcgcgccactgcactcc
-agcctggtgacagagcgagactccacctcaaaaaaaaaaaaaaaacaaaaaaaacaaaca
-gttaacaataaatagaacagttataacagtatgttgtaataaaagttatgcgaatgtggt
-ctctccctcaaaatgtcctattgtactgtactcacccttcttgtgatgatgggagataat
-aaaatgcctacatgatgagatgaaggtaaatgaatgacatgggcattgtgatctagcgtt
-agactactactcacctgatgatacgtcagaaggagaatcatctcctttgggtgatccagg
-atcatgaagccgtgacaatgtccatgattggatgtcaggagcagatgatgttaatgatta
-accgtgggtaatgtctacaatatggatacagtgcaaaagggatgattcacatcctacgtg
-gaatagtgcaggattgcatgagatttcatcatgtggttggctgcaggtaactgacattgc
-agaaagcaaaaccacagatcatgggggTGGGGGTGGGGAACTACTGTACAACATGAGATA
-TATTTGATCAAATAAGATGAGGTGCACCTAAAACTTTCCCTACAGGTTGTATGCCCCTGA
-GTAAATTGCTTGGTGTCTCTGGATCTCCAGCTGTTCCCCTTCTCTCTGCATGGCTAAGCC
-CTGTCCGTCACTTGGGGCTGGACCTAGAGCCCTGCCTGGCCACTAAGCCCTCAGAACAGG
-GTTTCTTTTTTAAAAAAGACAGGGTcgggaggtggaggttgcaatgagccaaggtcgcac
-cattgcactccagcctgggtgacaagagtgaaactccatctcaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaagacagggtctcactctgtcacccaggctggagtacagtggt
-gtgatcatggctcgctgcagccttgaacacctgggctcaagctgtcccccaacctcagct
-tcctgagtagctgggagtgccaccacgcctagctagttttttaaaaaattgttttgtaga
-gacaggggcctcactattttgcccaggctggtcttgaatgcctggcctcaaatgatcctc
-ctgccttggcctcccaaagcactggggttacaggtatgaccacTACCCACAACCAGAACA
-Tttctcaaatgtgattggttgatctcctgcatccatccctggggtgcttgtttaaaatgc
-agagccctggatcctcccccaacctagagagtcagaacatctgggcttctgcatcttaac
-aagctccctgggtgatgctgctgggcctccaagttggagaacctctgTATTTGAAGAAAT
-CCGGACTCCTTGGGGACTCAAATCTTATTTCAGCTCTTCTCTGGACTAGTTTGACTTTAG
-CCTTGGTGTAAAATGGGTATACATTTTACACGCCTGTGACGCCAGGATGCGCTCACAGGG
-GAGGGAGGGCTTTATCAGAGGTCAGAATCTAAGCCACCACTACAGTTGTACTAGATCCAA
-GGAGAAAGACTCCCAGGCCTCATttcctcatcgttctctcttctcttacctggctttatg
-gttcttcatagcactgagcaccaccaggcagtgtattttatgttttttttgagctttata
-atgccagggactatgttttgtttataactgttcacccagttcctagaacagtgcctggta
-cacaggagtgctcaataaatgtttgtggaatgactgaatAAAAGTTGTTCCTGTACAGAT
-TCCACCTGCCTAGAGCAAAGCCAGGACACTGATTGGGAtgaacacatagcacatgccaga
-catggctttgagtgctttacctggatcatctcactttatatgtgacagccaaatggtccc
-cagtgaccttcaccagctgctattcacgcctttgtacagtttcctcccatcctaagctgg
-gctgaccagtgtaatgaatacaatattgtgaaatgagaaagtatgacttttaagattagg
-tcataaaatatgttatggcttctgccttgctcttctggatcatctgctctggggacagcc
-agctgccatgttgcgaggacactcaattacccctgtggaaacttacatgtggtgaggatc
-gtaggcattctgcaaataaccagcaccacccaggcacataaaagagctttcttgagtcaa
-tcctccagccccagtcaagccttcagatgactgcagccccagccgacatcttaactacaa
-cctcatgagtgaccctgagccagaaccatctatgtagctgctccccagttcctaacccac
-agaaactatgtgatagcatacatgttgattgcttttttaagcaattaattttgggaaatt
-tgccacatatcaataattaataacttgtacagattctcacaacagcctatgtgggaggag
-ccatcataattaccattgaacagagaaagaaactgaggcccagatagggggaatctttgt
-ccagggtcacacagatagtgaactgtagcactgagattggaacccaagtttgaatgacta
-gagtcTACCCACTGAGGTGAAGGTGTTCAAGTTGAATGCCAGCTCTTCCCCTGAAGGGCC
-AAGGCTGAGACCAGAAAACCTGAAACAATATAGCTGCACCCaatataaatatatgcaggt
-aactcagggctgatggtacatgaccataataaatcagcagggtcatcaggagaaaacaag
-acaacaggagcgaaaacagatagaaacaaatatgcccagagtttgtatatcagtattatc
-agacgcagattataaaacaaaatgttggccgggcacgggggctcatgcctgtaatcccag
-cactttgggaggccaaggcgcatggatcacctgaggtcaagagttcaagaccagcctgac
-caacatggggaaaccccgtctcaaataaaaatacaaaaaaattagctgggcctggtggca
-ggctcctgtaatcccaggtacttcaggaggctgaggtaggagaatcgcttgtacccggga
-gggagaggttgcagtgagctgagatcgcaccatctcactccagcctgggcaacaagagcg
-aaactctgtctaaaaaaaaaaaaagtttactgcgtttaaataaataaataacctagaaac
-attgccaaagtatagaaaattatatcacatgacaacaaattttaaaataacctaacagaa
-cttctaaaataaaataatacaataatcaaaatttttaggccaggcacagtggctcacacc
-tgtaatcccagcactttgggaagccgaagtgggtggatcacttgaggtcaggagttcgag
-accagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaaattagccagg
-agtggtggcagacacctgtaatcccagctactcaggaggctgaggcaggagaatcacctg
-aacccgggaggcagaggttgcagtgagctaagatcgtgccatttgcactccagcctgggc
-aacaagagtgaaactctgtcacacacacacacacacacacacacacacacaaattaaatt
-taaaagatgggctaaacagcaaactagatatggctaaagagggaattagtgagacagaaa
-tcagaCaccaatcacagattcaagaaactccataaattttacacatagacacatcatagt
-aaaagtgcaaaaagccaaagattttttttaaaaaactcttaaaagcactcagaggaaaag
-aatcagagattctaaaaacaaaaaacaaaACAAAACAAAAAAACCCCAAAACAACAACAA
-CAaaaaacaaacaaaaaaccagtactacaacatggataaacctcaaaaacgttatgtcaa
-gaaaaaccccaaagttatgccaagtgaaagaagccagtcacaaaggttcacatattgtca
-aaatctaattttctttttgagacagggtctcactctgtcacccaggctggagtgcagtgg
-gacgatcactgctctacaggtgcacgccatcacactcggctaatttttgtattttttgta
-gagatggggtttcaccatgttgcccaggctggtcttgaattcctgggctcaagcgatcca
-cctggcttggcctccccaagtgctgggattactggcatgagccactgtggcccatcagta
-agatctaatttctataaaatatcaagaagaggaaagtctatagagacataaagtatatta
-gtgctgtcagttggaggatgggaaacagggaatgtctgctaatgagtacaggtctatttt
-ggggtgataagaatgttctttctttctttttttttttttggtctgagacagagtctcgct
-ctatcacgcaggctggagtacaacggtgcgatctcagctcactgcaacctctgcctccca
-ggttcaagccattctcatgcctcaggctctgcagtagctaggattacagatgtccgccac
-cacacctggctaatttttgtatttttagtagagacagggtttcaccatgttggccaggct
-ggtctcgaactcctgacctcaagtgatccgcccacctcggcctctcaaagtgctgggatt
-gtaggtgtgagccaccatgctcagccaaaaatgtcctaaaatttgattgtgatgatgggt
-gtacaattctgtaaatgttactaaaaactattgaattgtatattttaggtgggtggattt
-tatggcatataaattatatctcaataaagctgtttataaaaaGAACAGCAGTTAGATTGA
-CAGGTGATGATATCTCAATAAAGCTGTTTATAAAAAGAACAGCAGTTAGATTGACAGGTG
-ATGATATCTCAACAGCAACCATTtcccagcattttgggaggccgaggtgggcagatcatt
-tgagcccaggagttcaagaccagcctgggcaacatgaccaaaccctgtctctacaaaaat
-tagccagctgtggtggcacgtgcccgtggtttgcagctactcgggaagctgagcccagga
-gttggaggctgtagtgagccatgatcacgccactgcactccagcctgggcaacaagagtg
-aaactccatctcaaaaaaaaaaaaaaaaaaaaaaaaGGCTtccccaggccattcaaatgt
-acagccaaagttaagaaacattgtctaaagggatgtgtttccggcaaaagaaaaattatc
-ccagatgaaggtctgaggttcattccttcattcaacatatggagcctccattatgtgttt
-ggaactgttctagacaccaggaacacagcagtgagcaaaacaaaccaaagtccctgccct
-ctaggagaggaaaacagacccagaataacataaataagtaaaacatgctccgttagacag
-taatagatgctgagaagaaaaaatgaagccaggaaagcggatgtgaaatgctggatacgt
-gtgtctgtgaaatttcagatggagtaactagggaagatttttgggtaaagaccaaaataa
-agggaaggagggagccatgcagacgtttgggttatggcaggtgcaaaggccttagggcgg
-gagtgtgtctgacttactccaggacccagcaggtcaatgggacttgagtggaatgaggca
-ggggcagggcagtcagctacgaagacagagatcgggaggcaatttgcgagccctgggaca
-gatctcggattttgctttaagtgagatgggagtacttgggtcggggagtggcatgggttt
-gatttacattttaacaggactctccggcagctaggtggaaatggacggtagggggcaaaa
-agagaagcaaggaggcccaggaggaggctggttcaagacccctgagatgatggagcactg
-atggagctggagcgggatggggccggaggaggtgagggatgagattctgcaagtggagcc
-cgcaggatctgctgatcgatgggacgaggaacgggagaaaaaTTAAAGCGGCGCATGAGG
-CAGACGAATGCAAACTTCACCAATAGCTCAACGAAAAGACAGACGGTGACCGCTgagagg
-cagcgtcggatctgggtaagggcgggttcctgagcctgccaggcctggattcaaacctcg
-gctgagtggccttggacaggtcatcaacaaacagagccttcgtttattcatgtgcaaacg
-gggccaaggaccgggcctgccccgaggtatgcctgaggcttgggtgagCAGGCGCCGGGC
-TCGCAGGGCGCGCTCCTAACCCGTCCCCAGCGGCTCGACGCTGTGGATCCCGCCGCCCTC
-CAGCCCCGGCTCCGGCGCCGACTCCTGCTCAGgctcctgctcctgcccccggccccgccc
-ccggccccggccccggcccccggcccaccccggccccgcccccagcccccggcccccccg
-gccccgcccccggccccgccccggccccgCCCACCCCGCCTGCGGCCCAGCTCCTTCCCG
-CGGCTCTGCGATGCGGCCCGCAGGGTGACCCGGGCGGGAGTCCGGGGACCCGCGATCAGC
-CCCGGAGGACGGGGTGGGGTCGCCCCAAACAGGAGCGCCGGGACCGCTGGGACCCCGCAC
-TCGGCGTCCGCCGCCGCCGGGTAGCCGGGCAGTGGAGGTCCCGGATGAGGCGACAATTTT
-TCCGGCCCCCCCTCCCAGTCCCGCCCCACTTCCGGGGCCGCCACTTTCACTTTCTCTTCC
-GCCGAAGCCGCTCCCCTTGCGAAGAACTGGGGCCTCCCGGGAGGAGAGAGGGCTTTGCCT
-TGAAACCCGGGACGCCAGGGGCGCTCCCGCAAGTGGGGGTCCTCCGGGACTTGGAACGCC
-CCGGCTGGGTGGTGTCCGGGCGTCCTTTCCCCGCTTCTTCCCACCTCGGCTGGTCCCGTT
-TCCTCCTGCGCCCAGTGCGGACCTGTCTCGGCGCCCGCTGCCCTCTCACCGCCCCACGCA
-GGATCCCGGCCTGGTCACCGGGCAGTGTGATGCTTCCCGACTGCCGCGGGGACAGCGAGG
-CACACACAGGGCTTGGGCCGCGCCGGAGGCCACACGGCCTGGCTGAGTTGCTCCTGGTCT
-CCCGCCTCTCCCAGGCGACCCGGAGGTAGCATTTCCCAGGAGGCACGGTCCCCCCCAGGG
-GGATGGGCACAGCCACGCCAGATGGACGAGAAGACCAAGAAAGGTGGGCACAGGCTGGAG
-GTGGCTGGGGAACTTCCGGTGGGAAGTGGGCCCCGCAGGACCTGGCCTTGCCCCTGGCCA
-GAAGGGCCTTGGAGAGGGGGCTTTAGCCTGCCCTCCCTCTACCCTCCTCCCCATCAGTTT
-CCTCCTTTGGTACCTGCTGGCTTCCAGAGCCATCTTGGGGCCCTGAGAACTCCTTGGGCT
-GGCTCTGTGCTGAGATGGGGCTAGGGGACTCGCAGAGGACACAGGGCATTGAACTTGGAG
-ACCTCCTGGGCTGGTGGGAGACAGACGTCAGTTGACCTGAGAAGCAGGGGTACTTGCCTC
-TTCTCTTGTCCCCTGCACCTAGGGttgtagaacggaagtcagtcactgccttgctggaaa
-ccctcccatgcccctctgtgttctccaaacaaaacccagaggccctgggtggcccacagg
-atatctgtcctcagtcaccccgccatgctcactctactggagccccactggcttccttcg
-gttctcatccaaccattttttggccaaggcccttactcttccttccacctggaccactct
-tccccactggagcttgacacgtgcagcttctcctccttcaggtcttagcttcagtgttac
-cccctcccagaggcctcccctggtctccttaacctgtttatttccctgccagcaaggatc
-gcaatctgactttttttttttttcttgttaaacttgttcattgtctccccactgggcagg
-gagatccataaggagaggggccctgtttataaatctctgtgggattccagttcctgggac
-agtgggtggcacacagtagaagctcaataactgcttgttggataaatgaatAGAAATATG
-AGGGACCCTGGGAATGGGAAGGACAAACAACCAAATGAGCCTAGTGTGAGGAGGAGTGgg
-gaatattagagaacccctcccggagaaagggacttttagtctgggtgctgaaggatacgt
-aggagttcaccaggaagacagagaaagCAGCACACACAAAGGATCGCCTCCTTTCCTACC
-CCATTACTCTCAGCTCCTGAAAATAAACCCTGTGCTAACTGGCTCCTGCTGTACTGGCTT
-TCAGCAGAGGAAATGGCCCTGAGCCTCACCCGAGCAGTGGCGGGCGGGGATGAACAGGTG
-GCAATGAAGTGTGCCATCTGGCTGGCAGAGCAACGGGTGCCCCTGAGTGTGCAACTGAAG
-CCTGAGGTCTCCCCAACGCAGGACATCAGGTGAGGAGTGCATGGCTGGCCTGAACCCAAG
-GGACAGCAGGACAGGATATTCTTGCCTGTAGAACAGTTCTTCCtaatggcacgttctggc
-ttcaggaggcctggcttctaaccctagttatgtcattaatcaactgtgaaatacagagca
-ggtcacttcacctctcagtgtgtcctcattttaaaaatcagaccgtaacagtagctatct
-catagggttgttaggaggTGTACTGTATTAGGATGTTAGGCCTTATACAACAGAAGAAAA
-CGGAACAGTGacgtaaacaaatttgatggcagggagtccagatagggaggttctgctccc
-gacagtcctcagaggctcatattgtttctctcaccattctgccattcattcccagattcc
-tcatggtgcaaaatggccattccagctccatccagccatcacatcacaggaggaagggaa
-gaaagacacccctccacactcttctaaagagcatagctcaaaaattgtacacacttcttc
-cgttaattcctgtggaccagaactgattcccacagctacagttcagcttgaggggagact
-gtatagccaagatattcagctagaattcaggggttcgcttggtaagggaagggaagagaa
-tggatactgTCGGTCTGTGCTCCAGgagacttaaactcaatgctgaaacactttgcacaa
-tgcctggcgtgttatgcactcaataaTAAACATTAGTGTCTATCGTTATTTTTTGACTGC
-TTTTTCATTACTGGATAGTAAGGCAATAGTTTTATGGTTTCTGATTTTTGGTTCTCTTGG
-TGGGTCCCATTTGGTTTttcttaaaacagttttatttatttatttatccttacagttcga
-ccatttaaagtatacagttcaatggcttttagtatattcaaggttgtgcaaccattgcca
-caatcaattttagaacattttcatcatcctgtaaagaaacctggtactcattagcagcca
-gtcctcatctctctaccttttccctaactccccaaccttaggcaaccactaatctacttt
-ttatctctagggatctaccttctggaaattccatataagttgaatcatgcaatatgtggc
-cttttgtatctggcttctttcacttaggatcgttttcgagattcatccatgttgtagcat
-gtctaacaacttcattcccctttttttttttgacatggggtctcttgtctaggttgaagt
-gcagtggtgccatcatcgctcactacagcctcaacttcctggattcaagcagtcctcctg
-ccttggcctcccaggtagctgggactactggcatgtaccaccacacccggctaatttttt
-ttttctttgagatgggagtctcactctgtcccccaggctggagtgcagtggcgcgatctc
-agctcactgcaagctccacctcccaggttcacgccattctcctgcctcagcttcccgagt
-agctgggactacaggcgcccgccaccacgcccagctaattttttgtatttttagtagaga
-cggggtttcgccgtgttaaccaggatggtctccatctcctgacctcgtgatccgcccgcc
-tatgcctcccaatgtgctgggactacaggcgtgagccaccacacccagccacacctggct
-aatttttagaaagtctgtagagataaggtcttgctttgttgtctgggctggtcttgaact
-tctggcttaagcagtcttcccacctcagcctctcaaagtgctgggattacaggtgtgagc
-caccatgcccaaccagaactttattcctttttattgccaaataataatctattgtataga
-catatctcattatctttactcattaaatcagttgatggacatttgggtgtttctattttt
-tggctattataaacaatgctgccgtgaacatttgtgtccaactttttgtgtggacacgtt
-ttcatttctcttggatacacactagcagtggaattgctgggtcatacagtaactctatgt
-tactttttgaagaaatgccagacagttttccaaagtggctgcaccattttacattcccac
-cagcatatatgagggttctagtttctccacatcatctctaatacttgttgttgtttatct
-ttttgattatagccatcctagtaagtttgaagaggtatctcactgtggttttgatttgca
-atttcctaaccatttgatgacaaatgatgttaagcatcttttcatgcacatattttcttt
-ggaggtttgcctattcaggtcttttgcccattttaaaattgggtttatcttttttttttt
-ttgagatggagtctcgctctgtcacccaagcaggagtgcaatggtgcaatctcggctcac
-tgcaacctccgcctcccaggttcaagtgattctcctgccccagcctcctgagtagctgga
-ttacaggtgcccaccactacactggctaatttttgtatttttagtagagacgggtcttac
-catgttggccaggctggtcttgaactcctgacctcaggtgatccacccaccttggccttt
-ccaaagtgttgggattacaggcatgagccactgcacccggctgggtttatgtttttatat
-tgagttgtaggagtactttattcattttagctagaagtactttattcattttagcttatc
-agctacatgatttgcaaaaattttctctcattctgtggattgtcttctcactttgttgat
-ggtatcctttgaaccacaaaagttttaaattttgatgatgtccagttagtctatgtttta
-ttttgttgtttgtgcttttggtgtcatatctaagaaatcgttgcctcatccaaggtcatg
-aagatttacctctatattttcttctaaagattttatggttttagctcttacatttaggtc
-tttggtccattttgatttaatttttatataaggtgtgaggtaagggtccagcttcattct
-tttgcacgtggatattgagttgtgccggcactatttgttaaggctgttttcctctgttta
-atcatcttaaccctttttggaaattaattgaccataaatgtgagtgcttatttctggact
-ctcatttctataccattgaactataatatatatctgcccttacgccagtaccacactaat
-tactatagcttcatagtatttgaaatcaggaaatacaagttctccaacttttgttctttt
-tcaatattgttttggttattgcaagtctcttgaatttccatataaattttacgatcagct
-tgtctgtttctgcaaaaaaaaaacaacaacaactgggaattttggtagggatttcattga
-atctgtagatcattggccacttgattttaaacaaaatattgagatatctacttcttgaaA
-TGATTGCttgagacagtacctgtgtactccttgctatgaaaaatgaggaagttaacatac
-tcatcttccacctttccttttccttactttttttgttGAAGTATCATTGTGGACACTTTC
-CCAGTTGACTTCCACTTGATCCCCTGAATTAACTAACTGGCACTGGCGTTTCCTTTGTAA
-AATGTACAATGTCAGCCACCATCTtgctactaaagtgtggcctgtggaccacaacatggg
-gggaatctcaggtctcacctcagacttgctgggtcagaacctgagttttgagaggctcTG
-GGCAACCGGCACCTCTCAGACCTGCTGTTGGGTTCTCATCGATGGACCCGATGCTTCCTA
-GCAAATGATACCTGTTGTATGTGTTATTGGTAATAACATAGTTTACTTAGCTATTACATT
-AATTAATAAAACATGAGCGCTGAAAGAGTTGTTTCTGTGAAAATAAGCTGATTGCTTTAA
-AAAGATAAGAGACAAATCACCAAAAAAAAAAAAAAAAAAGATTAACACTTTTGGGTGAGA
-CAGTAGTAAGGAAATACAGTAAAAATCCAGAAGGGCTCTGTGCTCTGATGCTTCAGGAGT
-GTGTCTAAGTTCTTGCTCGCTTTAAAGAAGCTGCTACTAGAAATTATAGATCATGATTAT
-CGATGTGGTTCATACAAAAAAAAAAAAGAAAAATCCCTGGGAAACTCCAATGAGCAGGTA
-TAAACTCACgctgggcatggcggctcagcactttggaaggctcaggcaggagaatggctt
-gaactcgagtttaagaccagcctgggcaacatagtgagaccttgtctctgcaaaaaataa
-aaaaaattagccaggctgggtggcacacacctgtagtcccagctatttgagaggctgaga
-tgagaggattattagaccctgggtggttgaggttgcagtgagccatgatcatgcctgagt
-gacaaggtgaaaccctgtctcaaagaaagaaagagagaaaaGCCATTGGCTGTACACCTA
-GAGACTGGCCAGTGAATATGCATTTATAGTATGTAAGTTAAAATTAAGTGTTTAAGCTTT
-GTCTGCAGCTGTTTTTGTGATTCTCTGCTGTTCACCAGCGATCCTGATGTCACATTGGAT
-GAGAGAGCTCCAGCTGTATTTTTTTGTTGATAGTGTTAAGATTATAGCTTTAAAAAATTT
-TGTTTTCTAACATAATTAAGGCCTTTATGCTTTGCCTCTAGGTTGATTCTAAAAGTGTAA
-CACTACTAGAAAGGATTTATAGTATTTTGATTATGGAAATATTATTCACTATAGAATAAC
-TAGTGCAGTTGAAACCATATGCACTTTTATGTTTCAAAACCCTTATTGCTGGAAGAACAT
-TTTGGGGTTAAGATCCAGTCCTTTTCATTTTTTACTTTTCTTCTATTCTCCTGTATCAGA
-CTCATCTATTTTTGTTTTTCAAGAACTTTTCACGTGGAAAATGTggtaaacttttagagt
-ctttgcatgtttaaaaatttctatattttgctctgtcaattcattgatagttgactgggt
-attcaaattgtttacctgaagaattttgagagcattttctggactgcttttaaataaatt
-tcagatattattttatccttaaatactttagtatgtgtcttcaaaaaattaggacttggc
-ggggcacgatggatgatgcttgtaatcctagcactttgggaggctgaggcaggtggactg
-cttgaacccatgagttcaaaaccagcctgggcaacatagtgaaaccttgtctctacaaaa
-cattagctaggcatggtggtgcgcccatctagtcccagctacccaggaggctgaggtggg
-agggtcacctcagtccaggagattgaagctgcagtgagccaagatcatgccactacactc
-catcctgggtgacagaagtgagaccctgtctcaaaaaaaacaaaaacaaacaaaacccct
-caatactattatcacaccttagaaaaggaataagaattccttaaaatccgctaatgccct
-gtttatattcacattttcctatttcattagtgctttttacaattggtttcttcaaatcag
-gagccaaacaagatctacatgtagcatttcttactatgtcttaagtcccttttactctcc
-tctatttttatgccactagttttttttttaagaaacctggtcttttgacctctagaattt
-tccccatattctggatctatccattacctcttcatggtatgtattagaccactctagcat
-tgctacaaagaaatatctgagactgggtaatttgtaaagaaaagaggtttaattgactca
-gttctgcaggtggtgtaggaagcatggtcctgacatttgcttggcttctggggaggcctc
-agtgaacttttactgaagcgggagcaggcacttcacatggtgagagagggagcaagagag
-agagttggtggggaggtgccacactttacaacagccagatctcacgaggactcactatgg
-cgagaagtcactacagtgagcgcagcaccaggctgtgagggagctgcccctatgacccaa
-acacctcccaccaggcctcaccttcaacactgaggattacagttcaaggtaagatttggg
-cagggacaaatacccagactatcatggtgtcatttactatctcccgtttttcctgtaact
-ggtagttagagataaagtttcaattagtcagCAGTCACtttttttttttttttttttgag
-acagagtttcactctgttgcccaggctggagtgcggtggcgcaatcttggctcactgcac
-ggtccgcctcccgggttcacaccattctcctgcctcaatctcctgagtagctgggactac
-aggcgcccgccaccgtgcctggctaatttttttttttgtatttttagtagagacgggttt
-tcaccgtgttagccaggatggtctcgatctcctgacctcgtgatccacccacctcggcct
-cccaaagtgctgggattCAGCAGTCacttttaatgtgcaggaactcttcctcattttttg
-gttgcttcatgcctttccttgctttctgaatgcagtgttttcccaaatctctctgaaggt
-actagttagacttcactgttgcttattgttccataccctaaatgatctctgtttcctttg
-gggtcggttctgttttttcatcttttcatgcttttgattttccaaacatgttggaggatc
-ctcaAGAAAGTTAAAACCACTTTCTCTGGAATAATACCATGTAGATTTAAATCCTGCCTC
-Tggctgaacacagtggcttactcctgtaatcccacttcgggaggccaaggcaggaggatc
-acttgaggccaagagttcaagaccagctttggcaacatagtgagaccctgtctctacaaa
-aacttaaaaaattagccaggcatggtggcatgagcctgtggtcccagctacttgggaggc
-tgagatgggaagagcccaggaggttgatactgcagtgagccaaggtagcactactgcact
-ccagcctgggccacagaaagagagcctgtgtcttaaaaTTAAATCAAGACATACAAATga
-atcctgcctctaacagttattagttgcttagtttggcagagtcactggaacctatctgtg
-cctcacatttttatctgtaaaacagggatacagcagtacctgtctgatgggttggttgag
-aggattaaatgagttaatacacatgaagtgcattaaatagtcttagcacgtagttaacaa
-caacttctggtggttTCACTAAGgagcaggggagagaagacagaagaggttggagaggtc
-agggaggtgccagatcatggaggccctcgtgtgctgccacgagttgattctaagagtagc
-gtggagccattggagggGCCTAACTGGTGGGTTCTAATAAAGGAAGAAGCATGGGTGGGG
-CCTACCCCAGACTGGGGTTtgtgtgtgtgtgtgtgtgtgtgtgtgtgCATGGCCATGTGC
-CTGTGTGCAAATATGTACATGTCTGTAGCCGGTGGCTGAGGCTGGACCCCTGGCCAGAGC
-CCATGCTGAGCCCCTGCTGTTCTCTGCAGGCTGTGGGTGAGCGTGGAGGATGCTCAGATG
-CACACCGTCACCATCTGGCTCACAGTGCGCCCTGATATGACAGTGGCGTCTCTCAAGGAC
-ATGGTGAGTGAGGAGGCGGAGGGCGACACTGGGGTGAAGGctctccctttcactcctgct
-tcctctctctcctctggccctcccttcccactctccctctctttgccccCACCAGGTTTT
-TCTGGACTATGGCTTCCCACCAGTCTTGCAGCAGTGGGTGATTGGGCAGCGGCTGGCACG
-AGACCAGGAGACCCTGCACTCCCATGGGGTGCGGCAGAATGGGGACAGTGCCTACCTCTA
-TCTGCTGTCAGCCCGCAACACCTCCCTCAACCCTCAGGAGCTGCAGCGGGAGCGGCAGCT
-GCGGATGCTGGAAGGTGAGGCTCTGCCCTGAGCACCGCCGGACCCAGCGGGGGCCCTGGA
-CTCACTTGAGGGCATAGGGCAAGCAGGGGCAGAGCCCCTGGGTTTTTAGTCAGGGACTCA
-CCCAGAGGACCCTATCCAAGTGGGGAAGAGAGGACCTAAGACACATGGGAGGGAGCATTT
-CAGGGACCCATCATGAGAACAGCTGGCACGGGGAGGGGTGGACTCCGtccaggctccggc
-attcccagctgtgtgaccttgggcaaggttgctcctatctgctgcccagtttgctaaaat
-cataaattgggtatgacagtgatCGTGATAACTAGTGTTTATTCTTAAtttttaacttct
-gaaatgtttcagacctacagaaaagttgctaaattttacaaagtagtacataaagaattc
-ccatgtacctttcatgtgggttttaccacatgtgctttctttttttttttgagacggagt
-ctcgctctgtcgcccaggctggagtgcagtggcacaatctcggctcactgcaagctccga
-ctcccgggttcacgccattctcctgcctcagcctccggagtagctgggactacaggcgcc
-cgccaccacgcccggctaattttttatatttttagtagagacggggtttcaccgtgttag
-ccaggatggtctcgatctcctgactttgtgatccgcccgcctcggcctcccaaagtgctg
-ggattacaggcgtgagccaccacgcccaacccacatttgctttcttttatcattctcttt
-ctatataaaattattttttttctgaaccattttgagagtaagttgcagacatgatgtctc
-tttcccctaaataattcagtgtgcatttccttgaaaagaaaggtcattttcttacattac
-tgggtataacaatccaactcaggaaactaacgctgatacagtactggtatccagtctaca
-gatcttactcagattttaccagttgtcccactattgtcatttatagcaaaagacttggca
-ttctgctgtcatgtctcagtccctttcaaagagtccaggccagtttcttttttttggcgg
-gggttgggggctgatgtttcctccggagtggatcaagtcactgttttggcaggaccgcct
-cagcggtgctcttgggtccctcttggtgcatccttcaggaggcacGGAAGGGCTGGTGTT
-GTGCTGGGTTTTGAAGCTCAAAGGACATAGAAGCATTTATCGGTGGAATAGGGACCCTGA
-CCCTGGGGGAGCCAGGATGCCCACTTGGCCAGATGGAAGCTGGAGGTACCCCCAGGGAGG
-AGGGAGAGGATAGGGGGAGGGTCTGCCTGGCTGGCTCAGGGAGACCCACCCCCATGGGTG
-TGGACCAAGTGGGCCGCGTGGAACCACCACCCTTTAACCCTCCTCCACAGATCTGGGCTT
-CAAGGACCTCACGCTGCAGCCGCGGGGCCCTCTGGAGCCAGGCCCCCCAAAGCCCGGGGT
-CCCCCAGGAACCCGGACGGGGGCAGCCAGATGCAGTGCCTGAGCCCCCACCGGTAAGCTG
-TCCTTGGCCTCAGTATCCTCTTCTGTGCCCCTCCCTTGCCTCACCCTGCCCAGTCGGGCT
-CACAGCACCCTCTGCTCCCAGGTGGGCTGGCAGTGCCCCGGGTGCACCTTCATCAACAAG
-CCCACGCGGCCTGGCTGTGAGATGTGCTGCCGGGCGCGCCCCGAGGCCTACCAGGTCCCC
-GCCTCATACCAGCCCGACGAGGAGGAGCGAGCGCGCCTGGCGGGCGAGGAGGAGGCGCTG
-CGTCAGTACCAGCAGGTGGGCGGGAAAGTCCCTGGACAGACACCTGCAGACCGCACGGGG
-GAGGTGTAGGCCAGGAAGGGAGACACCTGCGCACTGCCGCGCCTCTCCGTTACTGCCTTG
-CCCCTCCCAACCATGCTGCTGGCAGTGACCCTGCACCTGGCTGTGACCCTGCACCTGGCT
-GTGACCTGCCCTCTCTCAAAGGTCACCCTGTGGCTGAGACCCGCTCCCTGGCTGTGGCGC
-ACATCCAGGTTCACATGCCCCACTCCCACGTGGGCTGTGGCTCCATCCCCAGCTTTGACA
-CACCACACGAGTATGGCTGGCCATGACCCCAGCACCCTAGCCATGACCCCAGCACCCTAG
-CCATGACCACACCTCAGCTCGGACCTCACCCCCACCCGTCTGTGACCTAAGCCTGCTCCA
-CCTCGCCGTGACCTCACCCTGGACTCTCCTACTCCTGACCTCTTCCCTCTCGGGCTGGGC
-CCACCCCTGACTTCCTGAGAGCCTGGCCTGGACCCTCGCTGCGCCCTAGGGGGATGACCC
-CCGACCCCGGTCCTACGCCTTAGCCCTACCCCGCCCCCATCGTGACACACGCACTAATGA
-CACAGACATTGATCCCCGAGTGCTCCCCATTCTGATCTCACCCCTGGCCCCACCTGCATT
-CCCCTTGGACCCGGTGCTGCCCCTGGCCACCCCACTCCTGTTCCCGTCTCAGCTCCTCGG
-CTTCGTCACTTCCCCACCCCTGACGTTGAGTGGCTCCACCAGCCCTGGCCCGGGCCCTGC
-CCTGCTACCTGACTCACCACTCAGACCCCGGCCCCCTTCCTTACCTTGCTGCCATTGCTG
-TCTCACCTGGCGCCTTCCGTGGCTACCTGGCCGGCCTCCCCTCCCTTGGCTTCCCCACCT
-CCACCTGGCCTCACTCCCAGCCCCGCCCCTCCCAACCTGCCTGCTCCTGcccatccccca
-ccccccaccccccatcccccagccccacccccatcccccacccccgtcccccatccccca
-tccctacTGGCTCCCAGCTTTGCCTGTGGCTGGTCTGACCCAGCCCTGACCACGCCCCCT
-GGCCCTTCCCCCTTCGGGGTCTGACCCGCCCCCGAGGCCCTGACCCGCCCCGTGGCCCCG
-CCCCGTGTGCCCAGCGGAAGCAGCAGCAGCAGGAGGGGAACTACCTGCAGCACGTCCAGC
-TGGACCAGAGGAGCCTGGTGCTGAACACGGAGCCCGCCGAGTGCCCCGTGTGCTACTCGG
-TGCTGGCGCCCGGCGAGGCCGTGGTGCTGCGTGAGTGTCTGCACACCTTCTGCAGGTGCG
-GCCCCCAGTCCCACCCCCGGCAATGCAGCTtaatcaaagccgccaattacgcagggctgg
-acgtgggtggggccctgtgctctgatacctcattggacgcccgcgaaaacctacgaggta
-ggctccgtctccccatgttgcggacgaggaacctgagggaaagagaggcccagcgcctta
-ccccaggcccacggctcatgagagaagcagcctagacgtgagcgcaggCGTGGGGGGAGA
-CTCCCTTCCCCTCTACCTTTCGCCGCCCGGGCTCCTGCAGCCACGCTGCTCTCAGCCTCG
-CTGTGGGCATCTGCCAGTTTCTGAGTCTCCTGTCATGGCCCCCCCACCCCTGAATGTGGG
-GAACACAGACCCGCTCACCACAGCGGACCCTTGTGGAGCCGCCCCTGGGTGacaggctcc
-gtgcctgcctcctgcagcttacattccagcagagaggctgatgagaatcggataatcgct
-ggttgatgtctttgtgaattgtgtcaaatgctacatacagtacattaagagacaacagga
-gtccttcccagagagggtggtctggaagcttccaaggaggtagccccagagcagggaccg
-gaaggcctgctgtaggtgtggggtgtgggcctggcctgttggaggagactgaggaggtct
-cttggtggctggagcagagggatgaagggggtaatcagagcaggatagagaggtgttggg
-tacgtgagcagcagtgaggagttgggatttgttctgggtaggatgggagtcactggggag
-acatggctgctgttctgagatagactctaggggccagatggatgcagggagcccagcgag
-gaggctcctggagtcacccaggtgggggatgtggggcctggaccagagaatcagagcggc
-agtatggaggcagggtggagGCCTTGGTGATGGGTTGGTGAGAGGGATGGGAAGGAAGGA
-GATATTGAGGAGAAGTCCACCTGGGGTGACTGAGTGAGGCCCCTGGGGTCAGGCCTTGCC
-ATGTGAGGGATGGAGTCCCCAGTGAAGGGGGTTCCTATGATCCTAACTCTTTTCCCCTCC
-CCTCCCCTAGGGAGTGCCTGCAGGGCACCATCCGCAACAGCCAGGAGGCGGAGGTCTCCT
-GCCCCTTCATTGACAACACCTACTCGTGCTCGGGCAAGCTGCTGGAGAGGGAGATCAAGG
-CGGTAAGGCCTCAGGGTGGGAGACATACCCCAAGTCCCAACTCCTAAGGAACTGGGCCCT
-GAGCAGGCAGCAGACATCtttcttttctttcttttttttttttggagatggggtctcact
-atgttgtccaagctggtctcaaactcctgggcttaagcgatcattcatcctcagcccccc
-agaCATTTTTCAAGAGCTTTGTCCATGTGGGGTGTTGAGACCCCAAGCAGAAAAAGAATT
-GAGGGGAGTAGCTAGTCAAGAAACCACATCTATGAAGGAaggacagcagagttgttaaga
-atcagggactcggctgggcgtggcagctcacacctgtaatcccagcactttgggaggatg
-aagtgggcagattgcttgaacccatgagttccagaccaacctgggcaacatggcaaaaaa
-tattcaaaaaatagccaggcgcgggggcatgcgcctgtagtcctagctacttgggtgggg
-tctgggatgagtgggctgaggtgggaggattgcttgagcctaggaagtaaggttgcagtg
-agctgtgattgtgccactgcactccagcctgggcaacagagtgagaccttgcctcaaaaa
-aagaaaaaaaaaattagtcagggaactctggagcctggtggcctgggtgtgtgaccacaa
-gtcagatatttaacctctctatgcctctatctcatctctgttagagtcagagttacagct
-tctatttccaggattgcaaagattacagtagaggatatgtgtatagaattcatagtagta
-cATccaggcgcagtggctcattcctgtaatcccagcgctttgggaggccaaggcgggtgg
-atcacctgaggtcgggaattcgagatcagcctgactaacatggagaaaccccatctctac
-taaaaatagaaaattagccgggtgtggtggcgcatgcctgtaatcccagctactcaggag
-gctgaggcaggggaatcgcttgaaccccggaggcggaggttgtggtgaactgagatcgcg
-ccattgcactccagcctgggcaaccagagcgaaactccgtctgaaaaTATATATATATAT
-ATTTAGAGTAGTGCTTGTCACATAGTAAGCCTTtgttgttgttagcgcttactgtgtaac
-aaatcactgcaggctcaaaacaacagtcatttattcagctcataaatctgcaagttagga
-cagttggccctctgtatctgtgggtaccacactggagaattcagcaacggtggatagaac
-atattcttacaaaaaaaattacaataaaaaacaaatttaaaaaacaatacagcataaact
-atttgtataacatttatgttatattaggtattataaataatctacagatgatttaaagtg
-tatgggaggatgttggtaggttgtatgcaaatactgcactattttatataaggggtttga
-gcatccatggatttgggtatctgcaggggtcttggaaccaattctctggataccgaggga
-tgactataatttgggctggacttacctggatggttcttctggtctgggcagggcctcgct
-gatttcacctgggcctggctggtgggtcagccgcggtggcctggtttataatggtctcat
-ctgtgatgactgggatgactggggcctccttccacttcaatgtctcacccaccagcaggc
-tgcccgggccttctcatgtcatggtggtctcaaggttccaagagcagccatggggagccc
-cagtgcatgtgtactttctaagtctgctcatttctcacttgacactgtcccattggccaa
-agcaagtcccatgctcaagcacagagtccattgggaagggaccacccaaaagtgtggaat
-cggggagacagaaacaaattggagtcaccaCTCCGCCAGTCTGTCACAGCGTTATGTGTG
-TCTGCATACGTGTGTGCTTGCCGCTGGCGCTCTTCATGAATTCGTTAGCAGGTTctctgc
-ctggctgctggtgatctcgagcaagttgtttcccttctgtgggactccatttccttatct
-gaaaagtggacagttgggcttgatTCATGGTTTTCAAACTGCTGGGAAATGACCTTCCCA
-GACTTGGGCACTGTGGGTTCCCAGGCCAAAACATGGCAGCCGAGGCCCAAATGGGAGATC
-CCCACAAAACACATACACAGACCTCCTCTTTATTTCTGTCCCCCCTGCCTCTCTCCTATG
-CCCCTATTTCTCCTGAGAATGCTCCCAACTTCACCAAGTGTTTATGGAGCCCAAGAGGTT
-CTGCCCCTGGGGAAAAGGGGGAGGCAGAAGAGGTAGAACTTTGGGAGTTCACAGCTCTGA
-TATCAGGAGCAGCCCCATTTTTCTCTGTTGTCTCTGGGTGGTTGCTGAGGCTCCTTCGCT
-CTGGCCTGGAGAGACCTCATGACCAGTCATTCCATATGTCCCCAGCACCCATAGCCATTT
-GCTTAGAGGTTTCCCTGTGGAGTCCACCCCAGCCAAGGGGCATTATGCTGGGGCCAGGTT
-CATGCCAAAGGGCTGCATGAACTTCCCTGGAGCCCACTGGAGTTGATGTGAGTCTCAGAA
-AATGGTCAAGTGTGACAGAGAGAAGGAGGCAGGGATCAGCCAAGTAATGTAGTGGAGGTT
-GTTTTTACAAAAACAGAAAAATATGCCTCACCACATAGAACCAGAGCAGAAATCAGAGAG
-AAAATCACCCACAAACCCAGGAAATCCTCCAATTGCATTTTATCTTATTTCCTTCAGTAT
-CTCTGGGCAAAttttttttttttttcctttttgagatgaagtctcactctgtcatccagg
-ctggagtgcaatggcgcgatctcagcccactgcaagctccgcctcccgggttcacgccat
-tctcctgcctcagcctcccaagtagctgggactagaggcgcacaccgccatgcccagcta
-atttttgtattttcagtacagacgagttttcaccatgttggccaggctggtcttgaactc
-ctgacctcaggtgatccacccacctcggcctcccaaagtgctaggattacaggcgtgagc
-caccgtgcccagccAGATATGATTTTTTAAGTCAACtttacttaagtatactttgcacac
-aataaaatgtactcattgtaagtatgcagtcaggtaaattttaacaaatgtaactctcgt
-aaccaccaaccactgttacatataacatAGGCATGATTTCTGCCTCATTGTAACCAGCAT
-GGATACAATCGCTTTAGCTTTTGTTATTTTGCTATAGAATTTTTCTAAAGATTATTACAA
-ATCTCAATAGCACATATACTGTTTATACCTCTTAGTTCTAGTTTCTCAGTTTGTAATACT
-CCTTCAAGGAATGTTTTGCATGGTGTAttcttttttttttttttttttgagacgaagtct
-cactctgttgcctaagctggagtacattggtgtgatcttggctcactgcaacctccacct
-cccgggttcaaacgattctcctgcctcagcctcccgagtagctgggactacaggcagatg
-ccaccacacccagctaatttttgtatttttagtagagatggggtttcactatgttggcca
-agctagtcttaaactcctgacctcgtgatgcgcccgcctcggcctcccagagtgttcaga
-ttacaggcgtgatccatcattcctggctGGTGCATCTTATATattattttcttgggataa
-agttaaagaagtgggatgggtaccaaagggtcagaaaagtttgggatggttgaaacgtta
-ttgccacattgctttctcagtgctacgtactagcttactagtttgtttaatttttatttt
-ttatttttgcgggtacatagttggtgtatatatttctggggtacatgaaatactttgata
-caggcatgcaatgcgtaataatcacatcatggagaatggggaatccatcccctcaagcat
-ttatcctttgtgttacagacaatccagttaacctctcttagttattataaaatgtacaat
-taaattattggctacagtctgttgtgctatcaaatactaggtcttactctatttttttgt
-accaatttgccatccccactcccctgccacgcctcactaccctttgcagcctctggtaag
-catccttttactgtctgtcctcattagttcagttgtttcgatttttagcacctgcaaata
-agtgagaacatgtaatgtttgtttgtctgtgcctggcttatttcatttaacataatgacc
-tccagttcttccatgttgctgtaaatggcaggattgcattcttttttgtggccgaatagt
-actccattgtatatatgtgccacgttttctttataggatactagtttaatcatgtctttc
-ccaacattgcttattatttATGTTCttttctttattgtgagaaaatagacataacattta
-ccattttaaccagtttttagtatacagttcagtggcattaagtacattcacactgttgtg
-caaccatcaccaccatccacctccagaacttttAGAAATTCCCCCCACTTTCTTTCACTT
-TCTTTTTACTTTTCTTTTCCttttttttttttttttttttttttttttagctaggatttc
-attctgtcacccaggttggagtgcagtgcatcagtcatggctcactgcatccttgacctt
-ctgggctcaagcgatcctcacaacccagcctcccaagcagctgggactacaggtgtgagc
-accacacctggttattttattttttaaaaaaattttttggtagagatgaggtctcactgt
-atttctcaggctggtctgaaactcttggcctcaaggaatcctcctgccttgactgacctc
-ccaaagtgctgggattacaagtgtaagccaccacacctggccTAAAATCCACTCTTTGAA
-TGGAGTTTTTCAACACTATGAGGATTACATGAAGAAAAGAGCCTGGGGCTGGGTTGGAGT
-TTCTGGGCTGGGGGCTTTCTGGAGGGTATTTAGTGGTCAAGGGTCATATGTCAGGTGTTC
-TGAATCCTGAGCAGCAAGGACATGGTGTGTTGGCAGCTCCTGACCCCTGAGGATTACCAG
-CGATTTCTAGACCTGGGCATCTCCATTGCTGAAAACCGCAGTGCCTTCAGCTACCATTGC
-AAGACCCCAGATTGCAAGGGATGGTGCTTCTTTGAGGATGATGTCAATGAGTTCACCTGC
-CCTGTGTGTTTCCACGTCAACTGCCTGCTCTGCAAGGTGGGGCCTGCAGGGACTCCCCCC
-ACCTAGTCACTGTCATCTTGCCTGGAGCTCACCACACTGCAGTGCGTGTTCTCCTGGGAA
-GGGAGCTGTGACACTGGCCTGCTGGTCATGACTTAGAGCTACATGTCAGTGGGAGAGTGT
-GGCTTGAGCCTGAACTGagccctggccccacagacggagtcccagccccagccccagatg
-gagcctcaaacctaggcagccctggttcacaatggagccccgaccctgggccagtctgac
-cccagtcacagactgaatcccagtcccacattgagccctgatcccatccAAGTCCATAGA
-CTTGGCCTCTGACCAAACCTGACCCTGCACTTGTCACTTAAGGTGGTCCCATATTCAGCT
-CAGACCCTGAACCGAGCTCTGACCCTGGCTTCTGACTGAATCTGTGACAGACTAAGGCCT
-GACCCTGGCCCTATACCACGTCTCCACCCGTGTCCTCAACTGAGTGCTGACCCCAAACCT
-AGACAGCCCTACCTGATCCTTCCCCCAGGCCTGTCCCCGCCGCTTCATCTCAAAAGTTGA
-AGGTGAGGAGCCGGTAAACAGGTCTGGAGCCTGGTCTCAGACTCAGCCTGAGCAAGCTCA
-GTCTGGGGTCATTGGGCCTGTAACCCCGGGCAGGCCCTTGTTAGGGATGCAGGGTCTCAC
-CCTAGGGGTATAAGGGATTTCTGTGCCCATCAGAACTTaaataagctgggtgtggcagca
-catgtcagtggtcccagctactcaggaggctgaggtaTATTTTGCTGTTAGCATAtgtga
-tgaccttgacttcacctccctggcgccaatatcctcttctgtaaaatgGCTTATGCATTA
-CAAAGTGAGGTCCTGCCAGTGACTACACCTAGAGGCATTAAGTGCCTTTGTGGACTCCTG
-CCCTGCACCTCACCTCTCCCAGCTTCTTAACCCCCTGAGGAACCTTCTTACCTTGAGTCC
-CTCACCCGCTACAGGCCATCCATGAGCAGATGAACTGCAAGGAGTATCAGGAGGACCTGG
-CCCTGCGGGCTCAGAACGATGTGGCTGCCCGGCAGACGACAGAGATGCTGAAGGTGAGGC
-TGGGACAGGGCCGAGGCCTAGGGATTTTAAGTTCTGGGATCCAGGTGGGGGCTGGGGGCT
-TCCCAGTAAGGGCTGTGCTCACACATCCCTGGAGGCTCTGACCTCCCTTCTGGCTGTCAC
-TCCCATCCGGAGGTGGGACTTAGGCCGAATGGTCATGTCAGGAAGAGCGTCTGGGTGGAG
-GGTGGAGACCACAGGAATGAAGAGGGGGTTGCTGGATGGAGCCTGGCCTGGCAGAGCCAC
-ACAGGAGAGACTCCACAGCTCTAGAGGGTCACCACCTTCTCCCTGCCATGGGGAGGGGCC
-AGGCTGGGTGACTGCCCCAGCCCCGCCCCAGGGCCAGCACCTGCCCCACTCCAGGTGATG
-CTGCAGCAGGGCGAGGCCATGCGCTGCCCCCAGTGCCAGATCGTGGTACAGAAGAAGGAC
-GGCTGCGACTGGATCCGCTGCACCGTCTGCCACACCGAGATCTGCTGGGTCACCAAGGGC
-CCACGCTGGGGCCCTGGGGTGAGTCTTTGCTCGTGGTGGTGTGGAGAGGGTGCCCTTGTG
-GGCTTTGCCTTAGAGGagggctgggaaaactacagcccatgggccatatccaacccagca
-cctgaatttgtacagctcccgaggtaagaatttttttttttttttttgaaacggagtttc
-actcttgttgcccaggctggagtgcaatagcacaatctcagctcactgcaacctctgcct
-tccgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcatgcg
-ccaccacgcccggctagttttgtatttttaggagagacggggtttctccatgttggtcag
-actggtctcaaattcccgaccgcaggtgatccacctgcctcggcctcccaaagtgctagg
-attacaggcgtgagccaccgggccgcaagaatgttctttacatctttaaatggttgaaaa
-aataccagaagatgactattttgtgacgtgaaaattacatgaaatccacgtttcagtgtc
-cgtaggtaaagtgctttggagcacagccgtgttcattcattcacatgttggctgtggttg
-cttttacactacagaggcagaggccgtatggctgcccggcccaaaatgactggccctttg
-cagaaaaggtttgcccactcctgCCCtagaggacagcaagtaaaggttcgatctggagtc
-agaggtggattggcccctggctctggcacatactgactgtgtgattaggctgcctgccac
-tcacctctgtcagccccatttcctctgtgaaatggagatgatagctgggcttatctcagg
-cttgttgtcagaatcaagtggaaaaattgcaagagaagtgcttagagagcctgtcacttg
-gtgagcacccttgcagatggtagctgtcgttattAGGGGTGTGCTCTGGAATTGGGGGCC
-TGTTGCTACGTTCAGGTAGACTTTCAGACAGGTGGAGGCAGAGGAAACTGCCCTCTCGCA
-TGCTGACATGTCTAGAATATGCAGAGTGGTCAGATCCTCTCCCTGGCCTGTTCCCGGATC
-TAGGCGTGGGTAGACTGAGTGCTGTGGGAGCCCAGAAAAGGCCTCAGTGACTCTCCATCA
-GGTAGCTGAGGCTGACCAGGCCATTCTTGCAGGAGGACCTGCAGAGGCAAAGGCCCGGGG
-TGGGAGAGCGCTCGGCTGTGGGGGCAGTCTCTGCACTGCGCTGACATTCTCTTCTCTTCC
-TCCCATCCTCTAGGGCCCAGGAGACACCAGCGGGGGCTGCCGCTGCAGGGTAAATGGGAT
-TCCTTGCCACCCAAGCTGTCAGAACTGCCACTGAGCTAAAGATGGTGGGGCCACATGCTG
-ACCCAGCCCCACATCCACATTCTGTTAGAATGTAGCTCAGGGAGCTTCGTGGACGGCCTT
-GCTTGCTGTAGCGTTGTAGGGGCCCTGCCTGCACTGCGGTTGTCCACGGTCACATCTGCC
-CCAGTGCCTTTGTCCTTCCCTTGGGGCTTGCCGGCCAGACTTCTCTCCCCTGCGGCTCCC
-ACCTCTGCCTGACCCCAGCCTTAAACATAGCCCCTGGCCAGAGGCCTTGCTGGGTGGAGC
-CTCTGTGTGACTCCATACTCCTCCCACCACAACACTCATCTGTCAAACACCAAGCACTCT
-CAGCCTCCCCGCCTTCAGCTGTCAGCTTTCTGGGGCTAACTTCTCTGCCTTTGTGGTTGG
-AGGCCTGAGGCCTCTTGGAACTCTTGCTAACCTGTTCAGAGCCAGGAAGGAGACTGCACA
-GTTTTGAAAGCACAGCCCGTCAGGTCCGGCTCTGCGTCTCCCTCTCTGCAGCCTGTGTAA
-GCTATTATAATTAAAATGGTTTTCCGGGAAGGGATGAGTGTGATGTCCTTGAGAGGAAAT
-GAATGTCCTGGCCTGGGACTCTACACACAGGCAGGATCCTGAGGTCTCTGGGAACTGCAT
-CAGAAAGTTGACTTGTCAGTCCATCTGTGGTAGAATGAGGCTGTGACTGAGCACTGGGAC
-CTTTCTACCAGATGTGGACCCCATGCCCAGCCTCAGGGGCAAGGATGCTCTTGGGTCACC
-GTCAGCCAGGACAGGTGGAGTGTGCAGTGTGTCAAGTCTGCAGAGAAGGATGGGCTTAGG
-GGCGGGAGGGGAAGTCTTGCCACTCCTGCTCCCTTTTGACCTCTCAGCAGGCATCTAGGG
-TTGGCAGGTAGATAGTTCAAGAAGGAACGAAGCTGCTGCAGTTGAGGGGTGGGGTTGTCC
-ATCCTATTTTCTCGTCTCAAGCAAGATGGCACAGTATCGATTCAGCAGTATTTACTAGAA
-CCCACTCTGTGCTGGTCGGAGGTTACTAAGACAGGGTCCTGGGATGTTCATTCTCTAAGT
-CTTTCCTCCGCTCTGTGACCCACCCTCCTTCCCCTTTTGAGATCTGGTATTTGATGCCCA
-ACACATTGTCCACGCTGTGACGTGACCATCATCATAGCAGGCAGAGGGCGCCTCTGCTGC
-TGAAGGCCTGTGATTTTGTGGGGAAGGGCCTGTTCTAGCAACTGGAAAGGCACTGCCACC
-TGCCGTTGGATGCCAGGACTCAAGAGCTGGCCCCAGTCACTGTGCGCAGAGCTGTCTGAG
-AATGTGTGAGTGGACTGGGTCCTTCGGCACTGCCTGCATTGGCTCAGGGCAGTCAACCGT
-CGCAGAGGATGAGGGGCACACTCAGGCAGCCTCCCCGGCCCTGGAGGCAGAAAGGCCCAG
-GCAGAACCACTGACTGGGAGGAAACAGAAAAAGCAGAGGAGAGCCAGGCTGCAGGCGTGT
-GGATGGGACCAGCTCAGGCAGACGCTGTCTCATACCCACTCTCCCCTCTCTTGCCAGGGC
-CTGGCCTGGTGTCTCTCAGGAGCCTGGGCATGAGACAAAAGCAGAGATTGTTCTCTTGTG
-GTACCACAGGCTGTAACCAgtccacccagtgttgttttagaaatttaaatcggttgccca
-tctttttaaattggcaacatcgtttaccacattaaaatctagatgccctgcttctcttga
-aaatgtcaaagcttggtaatgccaggtcctcacttctacctggggggaatggagtcacag
-agatgtcaaatctcttcatggggtgtacaccctccagtttgccacagtcctcaccACCCC
-AGGACTCACGCCGAGGCCTTTCCAGTGCCCTTGCACCATCCTTTTTCTCGTAAGAGGAAG
-ATGAAGTGGGGCTCTACGCGCGGCGTATCACAGGTGAGGGCGAGACCAGCAGAGAGGGCT
-GTGCTGGCTGTGGCTTTGCTCGGCCTGCCCCATCCATGCTGCAGTGGTGCGGAGGAGCAG
-GGAGCTGTGTAGGGCCAACCCCGGTTCCTGCCTCAGCTCCACCCGCCTTGCACCTGCAAG
-TGAAAGGTCTTAAGACGAGCAGGCCCAGGGCACCCTCTACTGCAGGGTCAGGTGGAGGTG
-CCTCCACCTCCCAAGGCTCACCCATGCCAGGGGCCCAGAACTTGAGAGGCCAGCACCAAC
-TCTCCAGGGCCGAACGAAAACCAAACCCCAGGGCTTTGGACTCAAACCATCGAGAGGAAG
-CAGCAAGAGGTCCCAAAGGTACTTGAGTGACACAATGATCATCATTCTCTCCTCAGGGGC
-AGGACAGGGGCAGGGGAAGGTGAGTGGAAGCCCATTGCTCAGATAAAGAGCAGCTGCCAC
-GGAGGGTAGCCCGTCGGCCTATGCCGGCGCTCACTGGTGTCTTCCTCTAGTGCTTGGGGC
-TGGCATGGAATCTGCTCAAATGCAGGCAGCTGAAGGTGAGCCCGCAGCCTGGTGATCCCA
-AGTGCCAACCATGAGGAAGTCTGGAGAAAAGACCAGGGAGCAGGGGCCCTCGTGAGGAGC
-AGGAATTGGCAGCAGGGGCCACCAGCAGAACACCAGAGGGGACAGTGGCAGGGGGAGGAA
-GATACAGCCAGGCTGGGTCTCAGCCCCAGCTGAGGGTCTCACCTCTTAGCTGGTGAAGGC
-TCCGGCCTGTTCCTGCTTTCGGTCACCACTTCATCCCTGGGTGATCGTGGGCCCGGTGCA
-GGGCTGGCTACAAGTGTTTGTTGATTGGTAACTGCTCATGAAAATGGCAACAGCACTAGC
-ACAGCTTCACAAATAGAAACACATTTCACCAACACCCTTGCAGGAAGCCCTCCAGGAGGG
-CCAAGACCATCCCTGCTTTACTGTTATGGACGTGAGCCTCCGAGAGGCAGTGACTTAGAT
-GCTCACCCAGCCAGGAAGGAAGGAACACACTCGACCCTCAGTCTAAGACCCCATCAGGCC
-ACTAATAATTCTCCCTCCAAACCCAGCTCAGGTCAAGGCCTATCTTCACCCCCAAATCAT
-CCCTAAGGCAGCCTCAACTCTCCACAGCACTACAGCCATCCTGCCCGGCCCCAGTGCTCC
-ACAGACCCTAAACCCGAGCCCTCCCGGGCTTTGTTGGCCCCAAACCACCTACACTTGTTA
-CGTGTTATTTTTACACTGGCGTTTCCCCTCAGCCTTGCATACTGTGTGGTGTTGTCTGAC
-ACCACTTTTCCAGCTCtctgacaccaactggggctagtgtcaggttccacagattaaagg
-gctcagtcccacacttccgatggagtcacagatggggtgcccaggctacccacacttcct
-gggctacccacacttcctgggctacccacacttcctggccaactacacattcaggggttc
-ccatgactccaccccctcaggttcaataatttgcctgagtgactcagaactgaagatcac
-cctgccctgacgcttcctggtgtggtgtcctcaaggatgcagtgtgggcaggaacagcca
-cgcttgagatgaacagggttagggatgggagCGACTGGCAGCCACTGCAATCTCAAGTTT
-TGGGGttttttttgttttttttttgagacggagttttgctctgttgcccaggctggagtg
-caggggtgcagtcttggctcactgcaacctccgcctcccaagttcaagtaattctcctgc
-ctcagcctcccgagtagctgggattacaggcacccgccatcatgcccggctaatttttgt
-attttagtagagacggggtttcaccatgttggccaggctggtctcgaactcctgacctca
-ggtgatccacctgcctcggcctcccaaagtgctggaattataggcgtgagccaccgcgcc
-cagccCTGAATCTCAAGTTTGTAAAGTGCTCCACCTCTGTCACTCCAACTCCCAGGAGTC
-ACTGCTtgggattgaaagtttccgccctcgaatcacctggtctttctggtgcaggagcaa
-ccccgaggcaatctaggggccctgctctaacgaattcattagcatgaactcaaatgggct
-ggaaaggggttatgaataacaaaagacactcaccactcacgaaattccaagggttgtagg
-agacccgtgttaggaacccaggagaaagaccaaatatttcttagtatcccacaCATACCC
-TTCCTTTAGTTCTCCAATTATCATAATTCTATTCATCCTTCACATTCCACCCTCACCTTC
-TATGAAAGTGCCCTGAATTTGCTGCAGGATAGATTGCTCCTGGAGTGCAGCTCTGGTGTG
-AGCTTTCAGAGGCAGCGCAGTGCCCTGGGCAGCCTGCGTAATCCACGACTGTCAGATCAA
-AGGGCAGTGTGACCCTGGCCCACAGTGGCAGGAGCTGAGTGCCACTGGCTTGGCCCCGGG
-AACCTGCGCATCTCCCCTCTGAGCCAAGGAAACAAACAACACAGACAACAGTGTCTCCCC
-GATGGCCCCATCCCCAGGGTGGAGGCCCTGCACCGGGCACTGCTCTGCGCGCGCGCTCCC
-CAGCAGCCAGCAGTGTCTGGAGGATACTGGAAAGCTTGGCAAGAGTAGGCTGAGCAGCTC
-CTCTGTGGACAGAAAGGGCATGTGGAGAAGCGGCACATCAAGCTCTGGTTAGGATCCAAA
-ACCAAATGCCAGCTCCTAGGATCCCCAGACCAGGGTGTGAAACACACCAAGAGCACCCCA
-GACCCGCACCAGTTGTGTCGACTGTGACAGTACCCAGAGTGGAAAAAACATGAActcaaa
-ctgtgttttcctccactgctctctcaataccaacagacatctgtggccaaatgtgttggg
-gatttctcccctgacaccaagcaagcaagcaattctgcagcctacatcagctgggtatcc
-tccaattcaattcagtgctcaccctacctatagtatctggaaatggaatccacaggttca
-aggctctgtcccacaagaccgccgcctctgccacaacattggactgaccaccctctttgg
-gtggcatgatttgccaagagtggctcacagaactcagggaaacttatgtttaccagttta
-ttacaaacattattagaaaaggatacaaataagtaaacagccagatgaagatacacacag
-ggtgaggtctggacgggtcctgggcaaatgctggagcttctgtccccatggagtgggggt
-gcgccaccctcttggcacatggacaagttctcgttcccctccctccacatgttcagctct
-tcagaagctcccgtgttcctgggccttttatggagacgtcattggataggcatggctgaa
-gcatggcagctgtgttgagatgaaactggacaaaaagcataaggtctaaacccagcaagg
-cctgtctgtccagatgcttcttggcctctctgtgcagcgttcctccttccgggtatgggg
-cagcaccctctctggaatgagggtcttatgagctacagtcagattaaagtctggtgttga
-gcaagtgaaatggggcaggagaaggtcacagacagagattccgttttctgaggcctgcag
-tgtcccaacattataacaaagggttatgggagtgatgaaccaggaactgtggacaaaaac
-atctacacacgtataaaatatcacaGTGCCCTGGGCTGCAGCTGGAGTGTGTGGGTCATA
-ATtcttgcagatgaaacagaaacagcaagactgtaggtactgcccaaggtctcctagcca
-gtcaaggctgaccaggagtcCACAGACCATGGCACAGTTCTGGGCCTGACATGGAAGGTG
-GGAGCATCCAGATCAGAGACCATTCCCACTGAGCGGTGGCCAAGGACGGAATGACAGAAG
-AGGTGATTAGTAACCACATATGGCTGTTTATTTGATACAGGGCTCTGTACAAAATATTTA
-CACATATTCTTTACAGAATAAGTAAACCACCTGAAGGTAATTAGATAATGCTTTCTTCTC
-AATGACAGGGAGAATCCTGGTGTCAGCAAAGTTAGAAAACAGATAAACATTCTCCTTCCG
-AGGCCACAACTCAAGCAAATGCCACTTGCTTCCTAGGATCTGAAAAGCTGTGGCCTTGGG
-ACCCTGGTCACATGCACCTCCTTTCCTCAACCCCATCAATTCCTTCAGTATTTACAAACA
-GGCTTGAGTACTTGTGGAAGGAGGGGCAGCTGGTGCCGCCCACTGAGAGGATGACAAGAG
-GGCCAGCTTGCTTTGGGAGAGCACTGGGAATATCTGCCGCATCATCACCTCTGGAAGAAT
-TTCCTTTGCCCTGATGAATACACCACTGTCTAAATTAATCCATCGACATCACACTTACCC
-CACAGTGGGGCTCCTGAGCCATGGACAATGATCCATCCCTTTGAGCTTTTTTTGGTTTTA
-AAGTGCGTAGTGGTggctgggcgtggtggctcacacctgtaatcccagcactttgggagg
-acgagacgggcagatcacctgaggtcaggagttcgagaccagcctggccaacgtggcgaa
-accccatctctactaaaaatacaaaaattagtcaggcgtggtagcaggtgcctgtagtcc
-cagctactcgggaggctgaggcagcgagaattgcctgaacttgggaggcggaggttgcag
-tgagctgagactgcaccactgcactccagcctgggcaacagagtgagactccatctcaga
-aaaaagaaaataataataaaataaaTAAAAATAAAGTGCTTAGTGTAACTCAGCGGACAG
-GGCTCCCAGCTGCTCTGGCACGTGGGACACCCTCCACCCTGCACACAACAGGCATGCAAA
-GAGGACTGGATATGGTGGGGTAGAGTGCTTCTGGTGTGTTCACTTTAAGAAAACATCTGC
-CAAGAGAGAAGAGTGCCCAGGAAAGACCAGGAAAATACAAGTACATGGCTGCTTCATACC
-ATATACCCCAATTCTTTAAAGCAGCAAAAGGCACTTTTTTTTTCAGGCCAGAGTGAATCT
-AAAACAAACCTGGCTTTGCTTACAGGGAAGCTGTCCCAGAAGGACTGAGTGATGCCTCTT
-GTTCCCTAAGGTCTGGAGAGTCTTTGCAAGTTTCCAACGACATTTCCAACCAGGTGGGAG
-AGACCAGCAGTTGACGAGTCAAGTCAGACCCAAAAAACGACGCCAAGGTAGTGAGTGGGT
-GCCTATTTGGGAGTAGGATGATTTGAGGAAAACAGGAAGAAAAACCGGTCAGAAAGTGGC
-ACTTTGGAAGTGGAAAGCTGTTTGCAAATAGCAACTCTGGCTAAAGCGAAAATGTTAATC
-AAGTAGAAAGTAAAATTCAGGATCTTAGAAGCTCATCCTTCTGATGAGAACTATTTTTTT
-TTCCGTGAAGGAACTATTATTACTTTAAAAGTGAGGGTAATTTACATATGGGGTGTATAT
-ATTCTAAAAATAGTAATAAAAGTACCTTTTATAAGCAATGTTGTGTGGCTTGTAGAAGAA
-AGCAGGGAGGAAAAAAAGGCAGGCAAAACTAGTCTAGGTCTAGGCCCTAAAAATGAGCTT
-CCTTCCCACTTGACTGGAAACGCCCATGTGATTTCTAGGCTGAAAATAGGTAGGATTTAA
-CGAGTAACCTAGTTCCCTTCTGTCTCTGATTTCTGATCAGCTGATGGAGCTGCTAGTAAG
-AGGGGCCGATCATGCTCCCAGACGAGTCCTTTGGCCTCTTGCTCTCCATCCCAAGCCTGA
-CTCCTTCAGCAGCAGCCCCCTCCTTCTGTGTCCATCTGATGCAGGCAAGCAGGAGCAGTA
-AGAGGGCATCCCATGTTCCAGTTCACCTTCTATGGGGTGACTAGGAGGTTCCCGGTAACT
-AGGGCAGCCCAGGCCCAGCAGGTTGCAAAAGCAGCTGCAAGCTTCAGAAACCCACTTCCT
-CCAACACCAGGGAGGTGGCAGAGAGCCCATCCAAAAGCCCACTGGGAGAGGCATAAGATT
-CTGTGCCAGGCCCCCAGGTCCCCTCTGTGTCAGGTAGGCTCTGCTACTGGCCTCTGAAGT
-AAAGGCAAACACAAACGGGCAGGGCAGGGTGGCAGGAATAAAAAACTCTGGACAGAAACC
-CTTTTAATAAAGGAAATTCCACCCCTCCCAATCCTTCCATGGAAGGGTGAGACCTTAATG
-TGATGTAAGAGGAAGGTCTTCTCTGGCTTTCAGGGAAACAGCTGCAGCTGAAACTTAGGG
-GCCCATTCCAGGGCACTTTTCACCACAGCCAGTGCAGCCGCTCCAAGTGCCACTGTCAGC
-CCCATCACTGCCAATTTCACAAAGCGGTTGGTCCTTGGCTTGGTCAGGACATCTTTTGTT
-CGATCTTCAGGCCGCAGAAGTCCCCGAAACCGCTGCCGCAGCACCATATCAGGCCTCTGC
-TGGGCTGATGCCAGCTCAAAGTCTTTGAAAGTAGAGGCTGCCGTCCTGCAGGGGAAAGAG
-ACGGAAGGAAGGAAGTGGTATGAAAGAGGAGGAGGAAAGCAAAACTACACCACATAGGCT
-GCGGGCAGAGCCTTTCATTGCTGGGAAAGCTCTTTATGATAAAGACCCATATGTCTACAG
-TGGGGATTCCACTGGCCTAAGCTCAGATCTCTGGAAACATGCCCCAACCCTATCCCACCA
-GACACAAACCTTCCCTCGCTTCTGCTCATTTACAGCCACCCCCATTCAACCAGTGTCCCA
-GCCTTGCTCACCTCTCAGCTTGCTGTTGGGCAGCGGCCTCCCGAGCAAGTTCGGATGGGG
-GAAACTGAACAAAAAGGTCTCCTGCTCTGCTGATCAGTGTCTCATAGGGCAAGTCCTGAG
-GGATCTGGGACAACAGGTGGTGGACCGAGGCCATGTCACAGTCACAGTCCAGGACTTCCT
-GCTCGCGATACAACACAATCTGTGGGGAGGTAGTAAAGCCTTGCAGTCAGAGGCCAGACA
-CACAGGGCCTGGGCCACCTGCACTCCATTATCCTTGCAGATGAATTTAAACTGGTAACAG
-ACAGGACTCAGCCCAAATGTTGAGCAAACTCTTGTATCCATCAAGGAAGTAATAACATAT
-ATACGCTCAGTGCTACTCCTACTCTCTGGCCCTTCCTGCAAACTTCCACCACATGACATG
-AAAGGCTGACCAGTTACAATCTAAGTCCTTCGGGCATGCTGGGCTGCTCAGGTGTCCCTT
-TAAGTCTTGAAAGAAATGAAGGAGATTCTTTTAGGAGAAAGTAGGAGAATTATTGGGAGA
-TTCCTGGAGCTCCAGCATAGAAGAAATGGTTCAAAACAGTAGAAAGAACAGTCTTGCTCC
-CTTTAAGCATCTTCCTTCTGACTGTTGGTCCACAAATCCACAGATGCTCAAGGGACCAGT
-GGTCATTGAAGGACTTCCCTGAATTCCCATCTCCACCCCATCCCTCAAGACCCTTCTACT
-AACTGAAGCCCCTACCCTCCACCGCAAGCCGCCTCCCTTGTCTGTCATGACACCAGATCT
-CTTCTTTTCTTAAATCTGGAGTTGACAGCTTACGCTACTATTTCCCTAATTGTGTTCATC
-AGCTGAACATATATTCCAGACAATGTCAACAGGAACCCTGACAattcacaatgcagatta
-gcattttaaaggttcagaagtgtcatgcagcaaaaaaaatctgattttgtttatacccag
-catttcccaacttactATTTTTTGTGTGTGACACCCCCATTAATACTGCACAGAATGGTG
-TCCAGGGACACCAGCCTGGGAAGTGCTGTCTTTTGCATCTTTCCATAATCCCCAGGTTTC
-CCTTCAGGGAAAATGACCACAGTGGGATGGGTGATGGTGAACCCAGCTGCTGGCTCGTGG
-CCTGTACCTACCACGGCTGCAAAGTAAATCGGCATCAGTGGGTGGCAGGCCAGGAAGAAG
-TCATATAACCGCACGACGTGCCTGAAGTCAGACAGGACATGCCCAAACCAGGTGATGAGC
-CAGCTGAGGGCAAAGATGGTCCCTACCTCAGCACTAGAAACAAAGGAAAGGCAGGTGTCA
-GGTCCTGTGGGCCATCCCTTCCCTCTCTCTGGGCCTTATAGCGCTGGTGAGAAGGAAGCA
-TTTAGGAATAAGATTTCTGGAAAATTCAGTTACCTAGGAATTCAGCATCTTCTCCTTACA
-AAATATTTAATACAAAGTCTTTAAGGTGTACCACAACACTAACACCACAACAGGGTCCTG
-GCTGCTTTATCTCACTGGGTGCTCGCCTACTGGCCAACAAATGTCAACTACAGGAACGAG
-AAGCAGTTGTTTTCAGAGAACTACGCCATGATTCTCCTTCTGACTAAGTCTTACCCTTCT
-GGGGGGCACAGGTACATATTCCCAAGCCTGAAAACATGACTGCATTAATTTTTCTGTTAA
-CATGAGACAACTGAAATATCTTAAGATGTAGCTgccagacacggtgagtcacgcctataa
-tctcagcactttgggaggccaaagcgggcggatcacctgacatcgggagctcgagaccag
-cctgaccaacatggagaaaccctgtctctactaaaaatacaaaattagccgagcgtggtg
-gcgcatgcctgtaatcccagctacttgaggctgaggcagaagaatcgcttgaacccggaa
-gatagaggttgcagtgagccaagatcatgccattgcactccagcctgggcaacaagagaa
-aatactccatctcaaaaaaaaagaaGGCATAGCCATTACCttttaaaaaattttaaaaaa
-aGAGGCATTGGCCAAGAACACATTTCCAACTAAACAGAGAAGAAACAAAACATCACATGG
-GATTTGCAAAAAAATATTTCTTCTCTTTGGTACTTGGGAAATAAAACAACCCATTGTTGG
-CCTTCCCCTTCTCGCCACTGGATCCCACAGGACTTTGTGTTTCTCTTGTGGCAATAACCT
-CAACATCTTACCTTGGCATACATACCTTATCCACCTCTCCCCACTAGATGTAAACTCAAG
-GGATGGGCTATGTCCCCCAAAGAGCACAGTCCCCAAAAATGCTCCAAGAACTGAATTACC
-CAGATTGCTGGTGACTGGAACAACTGGGGAGAACTTAACAAATCCACCCAAGACAATGAG
-GAAACTGCGCTCGGCTTGTGAGGAGTGTTTCAGGTGTGGGGGGGTGTGGGCGTGTGTATG
-CATGCACACAGAAATGCAGACACATATGTACCTCTGCATGAAGTCATGGAGCTCTGGATT
-CACCTGGTCAATGATGGGCATCAGATAGTTTAATATATGCTTGGTGTTGTCCATTGTTGG
-ATCCATAAAATCCCTGGAGGGAGACAATTCAATAAGCCTGGTTACCAAACACTTAGATCA
-GGGCTCAGGGTGGCGAGGGCTCAAACTCCTAAAAAAGCTGACCAGAAAACAGGCCAGTGA
-GTTATCCCCAGGACGGCTGAGGAGTGATGCCCGTCGTCTTGTGTTCCTCTCTACTGGTAC
-CTGAGGTGGTGGGTAGATAATTTTTCTACCAGGGATGTTGCCAGCCTCTCGCCTACCACC
-AGCAGAAATGTGACCACAATGTCATGGTAGCCCTGGTAGTAGTGCAGCTGAGGGTTGCGC
-TCCAAGATGAGGAGGATGATGTCAATCAGTTCTTCCTGGAGCCCTTCTCTCTGTTCCTCT
-GGCATGCCTGGGGACAGGAACAGAGATGCCTTTGAACATACCAAGCAGCCTAGTTAACAA
-GGAGGTCGAAGAAGGCCAGCAATGAATTTTCAGAGAAAAAAGGAAAATGAATTACAAATA
-ATTTGGCAACGCATATCAAGATCCACTGTTGATACCACCTGGCATACAGGAAAAGGCAGC
-TGCtagctttccagtaggggaagctgcagatgccaccctaaccaagttgctgcagttaat
-actgctgggacacagtatttaactgcagaatttcaactatgggagccacagacggcctct
-gcctcccgaggtgatgcactgacagagctcagcatcatgtctgcaggatttctatcaaca
-gcgcacagacctcaatctcacaatgaagaaatacccaatatccccaaaggaagagaaatt
-taactctcatacaatacaaaggaactgttccagattaaaaatggctaaagatataggaca
-acagcatgagaaacgcataaatctatatttccttttccagtgaagcacattactcgaaga
-aatggtgaaatgtgaataaaatctgtggattaattagttaactatttttcagtgttgtta
-ctgatgttgctcagtgtactgtgattacatgagagccttatatttaggaaatatgtcctg
-aaacacttggggtaaaaagatgtcatgtttgcaacttactcttaaatagttcagagaaaa
-agtgtatgtctatgtgtaaagcgaaggaaagacagaaagcagctaaaaaagcaaatgtag
-gccaggcgcggtggctcacgcctgtaatcccagcactttgggaggcagaggcaggtggat
-cacgaggtcaggagatcgagaccatcctggctaatatggtgaaaaaccccgtctctaata
-aaaaatacaaaaaattagctgggcgtggtggcaggcgcctgtagtcccagctacttggga
-ggctgaggcaggagaatggcatgaacccaggaaccagagcttgcagtgagctgagatcgt
-gccactgcactgcagcccgggcgagagagcaagactccgtctccaagaaaaaaaaagcaa
-atgtagtaaaatgtgaaaacaaaaggaaatctgggtaaaaggtatctggggaattctttg
-tcctatttttacaacctttcagtaagtatgaaattatataaaaataaaaaAATTTTAAAG
-TTACACGGTCCCCTTTAAACCAAAGCAAACGTTACAGGAAAAACTGATCCTCTTGATCCA
-AAGATGTATTATAGCTGGAAATAGGGAAGCCTGTCTCAGGAGTTCTTTCAGGGAGTTCTT
-TTACTGCTGGAGCTAGTGCTGCCAGCAGTAAAAATGCCTTGGCCTTATGAGCCAGGTTAG
-AAGAATGGCACATGCACAGCTTCTCCACACCATTAGCTTTCAGTTACAAACACATACTCA
-GAGAGAGAAAGCAGCTAATGTAAGGGCCCAAACTAAACCGGACAAAGGATTGCAGGTAAG
-AGCAAAACTCACCTCTTGCCCATATTTACCCCACCCCTTCTCAAATAAAAAGCATACCCT
-AAAAGATAAATAAGGAAACGAAGCAAACCCAGGGCTGCTGATAGGTGAAGCAGTGAAAGG
-AGTGAGAGTAAAAATTAAACCCTGTGTGAATTTTCAGCAGAAAAGCAGTGAGCCAAGCCC
-AGAAGACCATGAATGGAAAAAGAATATGAAGCCACACTGTAAGTTCAGCCTACAGAAAGC
-GTATCACAGATATTACATCAATGGAAGAGGAATAAAGGGTTCAGAGGGAAAACAGGTTAC
-CTAGGAAAAAATGGGggtggctcttgcctgtaatcccagcactttgggaggctgaggtac
-gtgcatcacctgaggtcaggagttcgagagcagcctggccaacatggtgaaaccccatct
-ctattaaaaacacacacacacaaaattagctgggcgtggtggcgggcacctgtaatccca
-gctacttgggaggctgaggcaggagaactgcctgaacctgggaggcggaggttgtagtga
-gctgagacagtgccattgcactccagcctgcaacaagagtgaaactctgtctttaaaaaa
-aaaaaaaaaaGGGAGGCATCTGTCCTATATGATCTCATCCAAACCAGCAGGCTAGGAAAA
-GGGAATGGACCGTGGGCATGTGCTTTTATCAAAACCACGCTGGCAGGCTACTGCTACCTG
-GGTATTGCAAGAATCTGTCCAGGGAGCAAGAATGCCAGCAGGAAAGCAGCCCCTTCAACA
-ACAAAAGCCAGGCCAGAGCACAGTGCAGAAGAGGGAGGCAGCCAGCTTAGAGGCTCCTGT
-TCCCTTTAGCAATTCTCCTCTCTTCATGACCTAAAGGTGGAGTTGCCAGAGGAAGAAAAA
-TAGGTCATCCATGTGAGGTTTGTTGCCCAGTTCCCTTCACTGTGAAAATTGAGACAACGG
-TCCTTCTTTTCTTTCTTCCTGAAATAAAGAGGTAATTTTAGGAATACATTCTTTtttgtt
-tgtttgttttgtttttatttatttatttttttatctattGCTGCTTAATTTGTTAATTAA
-GGAATATACTCTTACACAAACAGGGAATGGCCTCTCTTCCCTCTAAGGAATCTTACATAT
-GTATGCGCAAGGTACCATCGTTTTTAAACCTAATTAAGATATTACTCATTCTTGTTGGTG
-CCCAATTCCACACCAATCTGCTCTTTAATGCCAGACTGATGGCTCTAACAATCCTTATTA
-ACTCCTTTTTGTGGCTTCAAGGAAAAACAAAAACCTCTTCTCTCATTCACCACCTCTAGG
-CCAGGAGAAATTATTTTTGGTTCAGGCTTTCACAGTGGGGGTCTGAAAGTGACCAGTCAA
-GAAAAGGATGACTCAGCAAAAGGAGAGCTCTGAAGGTCCCTGAGGCGGCAGGGTCCAGCA
-TATTAGGTCACATGGTATGACCTGGAACAGATACAGTCTTTCCAAATGTGGCAGGACCGG
-GAGAGCTTCTCACCAGGAGGGAACCGCCGCAATGACCGCCGGACGTCCAGCAACACTTGT
-TGGTAGTCCTTGCTCATCTGCCGTAGGTTCTTCCCTATTGAAGGAAAAGGCACGTTATTG
-CAGGAATGCCTGAGAAGCCAGACCAGAAGCAAAACATTCTGGGATGACACAAAAGGCCTA
-GAGGGCACATGTCAGCTTCTCCTGAAGAGGATGATATGACTCAAGATACAACATTTGGCA
-GGGAATCCCTAGTTTGGTTCCAAACATTATGTTTCCTGCAAGTCACAATGACCCTAAGAG
-AAGGGAGCACAGACTGCCCAGGAGACAATACAGCAGGGTGGGAAGGAGAGCAAAGACGTA
-AGGAGGCCAGGCGCCTCGTGCAGAAGGCCACTGTGCATCACTGGGAACTGCTCTGAATTT
-CAAAGTCCACAGCTACAAAATGAGGATATTCCAAGGATCAAATAAAATCATGAATGTGGG
-AACAACAGACCACTGAAAAAAACCCTAACGCCTATAAAGTTGTGGGAGCACTAAGCTGTT
-TAGAAAGGTATATTGAGACTCACATAAAGAACCACCTAACAACTCTTGACCCAGCAATTC
-TAAAACTAAAGAGCTGCAAAGAGGAGACAGTCCTTGTGTTCAGCTGCTAAGTCCAATACA
-GCATGAAAGGAGGCAGTCTCTAGCCATTATACATATAACAAGTGTACATTTCCTCCAACC
-AAACCAAGTGCTGTATAATAAGCGTACATTTCTCTCACAACCCAAATCCAAAGCTAGTAA
-GGCTGGGCAACACTTCCTCACACGTAGGCTTCACGGTATAAAAAGATGAGGGAAGTTTGG
-AACCTGATAGAAGAACATCATCTCAGGATTCAGGGTGTGAACATGGCACTGCCTTAGCCT
-TCCAACAAAAAGCTGACTGCTCTGAAGCAGCCAATTCCAAGGATAATAACAAGTGGCAAC
-TCAACACCTACTGGGTGACATCATGACGCTGTGAACTTTTTGGTGGCAGAAGTCCTGTTT
-CAATCATCTCCAGTACCTGGCAATCATAGCACAACTAATATTTGCCAACTGAAAGAATCC
-TCAGCACTTGGCATTTTGCCATGATGGCAGGAAAGCTACAAGGTGAGTGCACTGAGTGAA
-TGAGCAGCAGAGTGGATTCACTGTTCTACAGGACTTTTACTATTTTGAACTTCATTCCAA
-GGAACTCTTTTCACCACATGGGCCTTGCACATTAGTTAGGTAACTCTTTTCACAGAATTA
-CAGGATTTTAGAACTCCAAAGGATTTCAGTATTTCCCAATAAAAAGAGGGTGttttcttt
-ttttttgagtatctcactctgtcgcccaggctggagtatactggcgcaatctcggctcat
-tgcaacttccgcctcctcggttcaagcgattctcctgcctcagcttccctagtagctgga
-attacaggtgtgtgccaccatactcagctaatttttgtatttttagtagagatggggttt
-caccatgttggccgggctggtctcgaactcctgacctcaagtgattcacctgcctcagcc
-tcccaaaatgctaggattacaggcgtgagccactgtgcccggACAAAAGAGGGTGTTTTT
-GTGTGTGTTTAAttttactttacttttagagattggatcttgccatgttgcccaggctgg
-cctcaaactcctgggctcaagtaatcctgcctcatcctcccaagcagctaagactacagc
-cgtgcaccaccatgtctggctagtttttaaatttttgtagagacagggtttcgcaatgtt
-gcccatgctggcctcaaacttccagtctcaagtgaccctcctgcctcagcctccgaaagt
-gctggaattacaggtgtgagtcacctcgcccagccACAAAATACGCAttttttttttttt
-tttttttttttgagacggagtctcactctgtcacccaggctggaggacagtggtgcaatc
-tctgctcactgcaacctccaccttccaggttcaagcaattctctgctgcagcctcctgcg
-tagctgggattacaggcacctgccaccatacctggctaatgttcgtattttttttttttt
-tttttagtagagatggggtttcaccatcttggccaggctggtcttgaacttctgacctca
-agatccacctgcctcagcctcccaaagtgctgggattacaggcgtgagccaccacacccg
-gccCAAAATATGCATTTTTAAAAAACACTTGCCAAGCAAGTATGCAGAACAAAGCATATG
-CATTTTTAATAAATTCACTTGCCTAGCCAATATTTTAATCCCTAATAAAAAAAGAACTTG
-Cctgggcgtggtagctcatgcctgtaatcccagcactttgggaggccgaagcaggctgat
-cacttgaggtcaggaattcgagaccagcctggtcaacatggcaaaaccccatctctacta
-aaaatacaaaaattagccaggcatggtagcgcatgtctgtaatcccagctactaggaagg
-ctgaggcaggaaaattgcttgaacccagggggcagaggttgcagtgagctgagattgtgc
-caccgcactccagcctgggtgacagagcaagactccgtctcaaaaataaataaaataaaa
-acaagtaaaaaaaGAACTCATTCCACTTTTGAATAAAATTCTACTTATCGGTTTGGCCTT
-ATTTTCAGAGTGGGCCCAAGCATTTCCCAAAACACCCTAGATTTATTCATATACCCTTGG
-TTTGAAAGGACCATAAAAATTAAAGATCCTGGAATTCTTTTCCCCCTGTCTCCTAGATAA
-GCTCCCCTCACAGCCTCCCCCACTCCCCTTACCTGATATAGGAGGTGGGTCATTGGCATT
-GACATTGAGGAGCTTGGGCCACACTTTTCGTCTGATCTCATCAGTCAGGAGCCCTCCTTC
-ACTGATAGCCATGCGTCTAAGGGCAGCCACATCAGTGGGATCACTGTTCAGAGCCTGGTG
-TATCTCTGCCACTTTCTTTTTCCTTTTGGCGTTAAAGTCTGAAGATAAGGATAGGGAAGA
-ATTAGGCGCACATTCAGCACGTGCATATTTTCTGCCTAGGACTCAAGCTCCTTTTTGATA
-TGAGGTACAGGTAAGTATCTCCTCTTAGCTCTAAGACTGCCTGCTGGCATAAAGTCTCAC
-AGCCAGATGCACTATTCATTTCGGGCCCAGTCTACTGGACCTCATGGTGGGAGGCTTGGA
-GAGCCCACTATAAAACAGATTTTAAATCACCGATTTTTAAAAAGATAGTCTCTTTTTATA
-GGTCTGAACCAAAAATCATAGGCACAGACTGGAAATAATTATTAGTTGTTGTTGTTTTTA
-AGAGACAGTGTCggctgggtgtggtggctcatgcctgtaatcccagcactttgggaggcc
-gaggtgggcggatcacaagttcaggaattcgagaccagcctggccaatatggtgaacccc
-cgtctctcctaaaaatacaaaaattagctgggcatcgtggtgctcgcctgtagtcccagc
-tactcaggaggctgaggcagaagaatcacttaaacctgggaggcggaggttgcagtgagc
-cgagatcgtgccactgcactccagccaggatgacagagcgagactccgtcttgaaaaaaa
-aaaaaaaaaagagacattgtctctctaagttgcccaggctggcctcaaactcctaggcaa
-aaccgatcctcccacctcagccttccaaacagctgggactacaggtgcatgccaccatgc
-ctggTCCAGAAATAATTACACGTACttttttttttttttttttttgagacggagtctcgg
-tctgtagcccaggctggagtgcagtggcgcaatctcagctcactgcaacctccgcctccc
-gggtcccggttcaagcaattctgcctcagcctcccaagtagctgggatttcaggcacgca
-ccaccatgcccagctatatttttgtatttttagcagagatagcgttcacaacgttggcca
-gggtggtcatgaactcctgacgtcgtgatcctcctgcctcggtctcccaaagtgctagga
-ttacaggtgtgagccaccacgcccagccTATATGTACttttttttttttttttttgagaa
-ggactcttgctctgtcgccaggctggagtgcagtggcacgatctcggctcactgcaacct
-ctgcctcccgggttcaagtgattctcctgtctcagcctcccaaTACATTaaaaaaaaaaa
-aaaaaaaaaGGTAAGTGAggctgggcacggtggctcatgcctgtaatcccagcactttgg
-gaggccgaagtgggcagataatgaggtcaggagttcgagaccagcctggccaacatggca
-aaacctcatctctactaaaaatacaaaaattagccaggcgtggtggcatgcacctgtaat
-cccagctactcgggaggctgaggcaggagagtcgcttgaaacccaggaggctgaagttgc
-agtgagccaagatcgtgccactgcactccagcctgggcgacaaagtgagactccgtctca
-aaaaaaatgataagtgaaaaaagaaaTGTGttaaaatcagacagatcttggttcaaatcc
-tggctctgccacttatctgatccataatcttggacagatgacttccctgctctgggcctc
-TGGACTGACACCCTCTTGTCAGGATAGTTACCATGGTACACAGTAGATACTTACTAAATA
-TTAGCTCCCCTCCTCACTCTGAAACAACATGTATTTTACAAATCAACCTACAGATATTTA
-ATTAGTACGTAATATGCAAAGCACTAAGGAGATATACTGTGTAAGTAACAAGCAAGGAAT
-TACAACTATAATAAACGCTCAGTAAATTCAGGCATATCTAGCAGTTAGTGTCAATGTTTT
-CATACAAGAATGTCCATTCTTAATTCCCAAACTTCACAGAGCATATACATCTCTTACTGT
-AACAATTTTTTCCTGTTGTTTAAATAGGAAAAATGCATGTCACCAAAACTCGATACTACA
-TTGAAAACATAACCACATGAAAAGGTCTCCTGTTACACGCTACTACAACTGGTAAAAACA
-TTAGAATCACATAGAGAtttttttttttttttgagatggagtctcactgtcgcccaggct
-ggagtgtaatggcgcgatctcagctcactgcaacctccctgtcccaggttcaagtgattt
-tcctgcctcagcctcctgagtagctgggattacaggcatgcaccaccacgctttgctaat
-ttttttttttttttagacagggtttcaccatgttggccaggctggtctcgaactcctgac
-ctcaagtgatccacctgcctcagcctcccaaagtgctgagattacaagcgtgagccacca
-cgcctggccAACACAGAGATGTTTTCAAAACCAGTGTCAAAGGGTACTTGGGTTTCCAGT
-GTGGCTGGTGACACTGCCACCAGACACTGCCACAGAGAGGCTGTGACACTGCATACAAAG
-GAACTGTTTCTTAAAAACCATAGTAAGTAATGTTTTAAGCATCTTACATCCTTATGTGAT
-AGTCTGTTATTCATAGACATTTTGCCATGTTTAAATTACTTTTTAGgactggtccctgag
-tggtgctatttacaactcattgattacaatcagttagatttctttgttccttttccacgc
-ccactgcttcacttgactagccttCAAATAAATAAATAAATAACTTTTTTGGGAAATTGG
-TTGGGAATTTGTGGTTAGTAGCTATCATATCATTTTTCTATGTGAAATAACAGAGTATTG
-CTTTTTGGCCTTTGGCTGAGATCAGGGGAGATAAAGGAGTAAAAGGCTCTGAAAGTTTGC
-ATGCAGAATGTCTGCTTTTAGGGATGGCTTGTGGAAGTTAAATGGATGATGCCTGTATTT
-CAGTTCTTTCTAGTTGCCAGTACCATTGAGAAAATATGTCAAAAACACAAGAAATGTTAC
-ACAAGACAACACCAAACGTCACAAGGCAGTAGACTATAATTGTCAAAAAAGGTGCATGCA
-GACAATAATGGCCAAGAGCTCAAAGAGACTGCAGTGGGTCAGGGCCAAGCTAACCTGAGA
-AGTGTACCTTAAAAAGGAAGAGGAGCAAAACTCTCTTGACATGCTTAATTGTGATGTTTA
-ATGAACATCCTTGCAGTGTAAGACGACCTTTTTAAAATACATTCTTggccggggacggtg
-gctcacgtctgtaatcccagcactttgggaggccaaggcaggcagatcacctgaggtcag
-gagttcgagaccagcctggccaacatggtgaaaccctgtctctactttaaaaatacaaaa
-aactagccgggcatggtggcaggcgcttgtggtcccagctactcaggaggctgaggcagg
-agaatcgcttgaacctgcaaggtggaggttatagtgagccgagatagcgtcactgcactc
-tagcctggacgtcagagcaagactctgtctcaaaagaaaaataaataaataaataaatTC
-TCTCGGCTTCAGACCTACCTATCTTTGGTGTCTCAAGTTAAACCCAAAGCAGCACCCATC
-ACATCTGCCTTTTCTTTACTTTTGTCTCCTATTGCTTCCAGATACCTTCTTCCTTTTCCT
-GCAAAGCCCATTCTGCTGGAGTGGAAAAGTCCAATGCCttgatgccagggtcttgttcag
-tcactcaagatggagtgtagtggcacagtcatggctcactgcagcctcaaccATATATAT
-ATAGTTTAAATAAATCAATAAACCAATAAATTCTCTCTTAATGATGGTTTGAGCCTCACC
-ACTTGATTAGGACAATCAGCATAACCTGTAGAATCTTATTTGGAATTGAATTCTGTATTG
-TAATTTTGTTCCTGTTCATTTTTAAATTTTATTTTTCTTTCACTGTAAAGATGATACTCT
-GCTTTAAATGTTAAAAGTGTACAAGCAAAAggccgggcacagtggttcacacctgtaatc
-ccagcactttgggaggctgaggcaggcagatcacgaggtcaggtgttcgagaccagcctg
-accaacatgaggaaaccccgtctctactaaaaatacaaaagttagcctggcctggtggcg
-cacgcctgtaatcccagctactcatgaggctgaaagaggagaattgcttgaaccccggtg
-gcagaggctggagtgagccaagatcgcacaactgcactccagcctgggcgcgacatagcg
-agactccatctcaaaaacaaacaaacaaaaaaaaGTGTACAAGTTAAGGAagccaggtac
-aatggctcacacctgtaatcccagtgctgtggagggccaaggtgtgagaatcacttgagt
-ccacaaaatcgagaacagcctgggcaacaaagtgagaccctgtctctacaaaaagtacga
-aaagttagccaggcatggtggtcccagctactcaggaggctggggcgagaggatcacttg
-agcccaggagtataaggctgtggtgagctatgatagcaccactgcacttcagcctaggtg
-acagagcaataccctatTATCAAGGCACTGGACTTTTCCACTCCAGCAGAATTCTAAATT
-TTATTTAAACTATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATGTGAAGTGGAAG
-ATATCACCAGAAGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTA
-GAAGGGACACCAAGCATCTTCCCCAGCAATGTTCTAGTCTGAGGAAAAGGAGGAAGGTGT
-CCTGGTGACCTGTCTCTAAAAACAAAAACAAggctgggcacggtggttcatgcctgtgat
-cccagcattttgggaggccgaggcgggcagaccacctgagattgcgagtttgagaccagc
-ctgaccaacacggagaaaccccatctctactaaaaatacaaaattagccgggcgtggtgg
-cacaggccggtaatgccagctactcaggaggctgaagcagaatcgcttgaacccaggggg
-cggagattgaggtaagctgagattgcagatcgcgccattgcactccagcctgggcaacaa
-gagcgaaactccgtttcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCAggctgg
-gcgcagtggctcacgcctgtaatcctcgcactttgggaggccgaagtgggcagatcatct
-gaggtcaggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaaaat
-acaaaaaattagccgggcgtggcggcgcatgcctgtaatcccagctactcgggaggctga
-ggcaggagaattgcttgaacctgggaggcagaggttgcagtgagccgagatcatgctata
-tgccactgcactctagcctgggcgacaagagcgaaactccgtctcaaaaacaacaacaac
-aaCGACAGCAACCACGGAcggtggctcgtgcctgtaatccagcatttttttttttttttt
-tttttttgagacggagtctcgccctattgcccagactggagtgcagaggcgcaatctcgg
-cttactgcaacctccacctcccaggttcaagtgattctcctgcctcagtctcctgagtag
-ctgggattacgggcacgtgccaccatgcctggctaatttttttttttgtatttttagtag
-agacagggtttcaccatgttggtcaggctagtctcaaactcctgacctcgtgacccgcca
-gtctcagcctcccaaagtactgagattacaggcgtgagccaccacacctggcctatccca
-gcactttgggaggccgaggtggatggatcactgaggtcaggagattgagacgagcctggc
-caacatggtgaaactccatctctattaaaaatacaataattaggccaggtgcggtggctc
-acgcctgcaattccagcagtttgggaggccgaggtgggcagatcatgaggtcaggagatc
-gagaccatcttggctaacacggtgaaaccctgtctttactaaaaaaatacaaaaaaatta
-gccaggcgtggtggcgggcgcctgtagtcccagctactcgagaggctgaggcaggagaat
-gaggtgaacctgggaggcggagcttgcagtgagctgagatcacaccactgcactctagcc
-tgggtgacaagttctgtctcaaaaaaaaaaaaaaaaggcagaaagaaCATGGATTCACCT
-GCTTATACAAGAAAAAAGGAAAAAAAAAAGTGTACGAGTTGCCTTGTTACAATAAAACTA
-AATGTGTATACACACAAAGGAAATGGAGGACATTCAGGGGCTGGGATGAAGGGTACAGAA
-GAAAGGCCAGGAGATACGGCCCTTCCATTTGACAGTAAATAGACTAATTAAAAAATATTT
-ATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATTTGAAGTGGAAGATATCACCAGA
-AGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTAGAAGGGACACC
-AAGCATCTTCCCCAGCAATGTTCTAGTCTGAGACCATTGTGAGTCTACAAACTGTTTCTA
-TGACAAAGCTGTACattattattattattattattattttatttttattttttgagacag
-agtcttgctttgtctcccaggctggagtgcagtgaagcaatcttggctcactggaacctc
-tgtctcttgggttcaaaccattctcgggcctcagcctcccaggtagccaggattacaggc
-gcatgctgccaccacacctagctaattttttgtatttttagtagagacagggtttcacca
-tgccaggctggtctcgaactcctgacctgaagtgatctgcctgcctcaggctcccaaagt
-gctgggattataggcatgagccatcaggtctggccCATTATTAACATAAATTAAAGTTGG
-TACTAATAAGTCACAGGTGAGCTACCTATGAGACCTGAAACGTAAAACCCACATAAACAG
-AGGCACTAGCTGGTTTGGAGCCATGTGCAATTGGAAGTGCGACAGAAAGATAATAGGAGT
-AACTTTTCACCTCGGTAAACCTGTCCTCCTGGCTTGACTGCTGTTTCCTGGTAACCTAGt
-agggtgaccatttgtcctcatctgtctgagatcttcctggtttatacctagagtcctggc
-acaattgttcacagcaaaccctttctgctccctgtattctcaaatatgtcccagtttgga
-agccaaattaaatggttaccTACCTAGAAATCATTAAAAATAAAACCCCTTCTGGGcaca
-cctataatcccagtactttgggaggccaaggtgggcagattacctgaagtcaggagatcg
-agaccagcctgaccaacatggtgaaaccctgtctctactaaaaatataaaaattagccgg
-gtgtggtggtgcacgcttgtagtcccatctactcaggaggatgaggcaggagaatcgctt
-gaacccgggaggcggaggttacagtgtgccgagatcatgccactgtactccagactgggc
-aacagagtgacactctgtctcataaaataaataaataaaaaataaaataaaATAggccag
-gcgtggtggctcatgcctgtaatcccagcactttgggaagtcgaggcgagcggatcacct
-gaggtcaggcgttcgagaccagcctgaccaacatggcgaaaccccgtctccactaaaaat
-acaaaattagccaggcgtggtggcaggtgcctgtaatcctagttacttgggaggctgagg
-caggagaatcacttgaacccaagaggcggaggttacagtgagctgagatcacgccactgc
-actccagcctgggcaacgagagcaaaactccgtctcaaaaaaataaacaaaataaaaata
-aaaaTATAATAAAATAAAAACCACTGCCGGGCATGGTTTTTAGTCCAGACgtggctcatg
-cttataatcccagcactttaggaagccgacgtgggcagattgcttgaccccaggatttgg
-agagcaaccagcctgcacaacatggcaaaaccttgtctctacaaaaaataggtgggcgtg
-acggcgtgcacctgtaattccagctgcttaggaggcagaggcgggttgtagtgaggcatg
-attgtgccactgcactccagcctgggtgatagagtaagactctgtctcaaaaacaaaaaa
-aaaTCTCCAATTTCTTCTGTCAGCATAACACCTAGTCAATTGTTCATGAGATGTGTCAAG
-CTCTTGACTCAGGTGTGTCCTttcatccattcatccattcatccattcatccGCCTGCCC
-ATTTGtccagtcattcatcagtctgtcacttaatgggtgtctacttgtactaagcactgt
-actggggataaaaagatgaattactccctcccagcccttgaagggctcacagtagggaca
-caaacaattattatatataatagaatctgagggattatgaaaatccagaggaaagaatga
-ctttttttcttcttctttttttttgagacggagttacgctctttgttgcccaggctggag
-cgcagtgttgcgatctcagctcactgcaacctccacctcctgggtttgagcagttctcct
-gcctcagcctcccgagtagctgggattacaggcattcaccaccacgcctggctaattttt
-tgtatttttagtggagacggggttttgccatgttggccaggctggtcttgaaatcctgat
-ctcaggtgatctgcctgcctcggcctcccaaagtgctgggattacaggagtgagccacca
-cacctggccaagaatgactacttctaaagcagtcaggaaaggcttcaccaagaatatatt
-ctggatccttcttttaattttttttttttttttttttgagacagagtttcactcttgttg
-cccaggatggagtgcaacggcacgatctcagctcaccgcaacctccacctcccaggttca
-agcaattctcctgcctcagcctcccgagtagctgggattacaggcatgcaccaccatgcc
-tggctaattttgtatttttagtagagacagggtttttccatgttggtcaggctggtctcg
-aactccccacctcaggtgatccgcccaccttggcctcccaaagtgctaggattacaggca
-tgagccaccgcatctggccCttctttttaatttttatttatttatttagacagggtctca
-ctctgttgccttggctggagtgcagtggcacaatcatagctcactgcagcctcaacctct
-agggctcaagcgatccttccacctcagccttctatgccaccatgcctaattttaaaaaaa
-ttttttgtagaggtggggtctcattatgttgcccagactgatcttgaactcctgggctca
-agcaatcctcttgcctcaacctcccaaagtgctaggatcgcagatgtgagccaccacact
-gggctctggtacgttcttaaagaaaattttgccacagggaagagtgtgttaaggggaaag
-tactccaggcagaagagttatgtgcaaagaccttgtcacatgaaagaaacaccatgtcca
-ggaaacaaagagttctatgaagctgaagtgccaggtaaagggagagAACAGAAGCAGGTA
-GCACCGCAGTAAAAGAGGCTGGGCTGGATTCATCCCGCAAAGGAGTCTGGGTTTATCCTG
-TACTCAGGAGGAAGACAGGGAGGGATTTTACTTTGGGCCTGAGGGCCATCCTTTGGAAGA
-CCAGGCTGTACGTTTTCAAGAGGGGTCAAAAACATGCAGGAAACAGAGAAGCCTTTTTAT
-ATAACATCGGTGGAGGCAAACCATGAGAAGAATTTAATTTCCAACAAAGAGAAAAAACCT
-AACATATTTAATTTTTTTTTAACTTGGGAGTACCCCTGCACTTTCCACACATCACAAATT
-GACAGCACTTGAGTGGCAATACTGAATACTGCTTGAGGGAAGCTGATATTCAGAAGTCTT
-GTTAACCTATTTGCTAAGAGTATGATAATTTTTCTTCAGTTTGTTTAGACATACATCCAC
-CCCATCTCTCTTTCTAAATAAGCTATTCGGCAATCTGGGAGAAAGGAAATCTTGTATCTT
-GGGGAAAAAAACCACTATGCAGTCAACTGAATTTCCATGAGGTTTTGGCAAACCATTTGC
-CAGAATGTTACTTAATTCTGAACTCAAATCCTCAAATCATACCTCCCATAACTCATTTCT
-CTTAAGACTCTGTTCCAAttttttttttttttttagagacagggtcttactctgtcaccc
-aggctggagaatagtggcacgatcatggctcactgcagcctcaaccttctgggctcaagt
-gatcctcctgccttagcctcccaggtagctgggaccacagacaagctccactggcccagc
-taatttttgcgtatatatattttgtagagaaaaaaagtgttgcccaggctgatctcaaac
-tcctgggctctagtgatccacccacctcgacctcccaaagtgctgggattacaggcgttg
-agccaccatacctggccTCCAATTCTACTTTTAATCCTGCATTTCAAAATTTACTTACTA
-TTTCAAAATTTTTGGCACTCTGTGGGAACGCAACAAATACGTGCAGAATATAGTAAGTGA
-TTTAGTTTAGTTATTGTTCCTCTGGAAAAAACTGGCTTGCAGTAAATGACATTATTTTTC
-CCATACTGTTAAGGTGATGCTCACTGCAGAACTCTCTAAACAGATCTGCAGACTCTTTGG
-CCTGTTTCTAACACTACCGGTGTTTCCCAGAGGAGGATGCTGTCCCAACGTGGATTTCGG
-CTGCTGTTTTTTTCAGGCCCCAACACCACCCTCCTCAACCCCACAGCCTAGTGATTAAAT
-GTCAGTGGCAGATGGAGAAAGCACTCCCACGTGTGCCACTCTGACAAATACTTTATTCCA
-ACTAAATGTATAGGCTCTCACTGTGACATAAAAAGGGAAGAGGAAACAGAAAATTCAAGT
-GAGCTAAAGATGTATGAATTACAGAGTGAGATCAACTGCTAGACGACACAGGGAGGGAGT
-TAGCAGCGTCTCCACTGAAAGACAAATTCACAGACATCCTGTTTATTTCCGAAAGAGAAA
-CATCATAGAGCTATTCTTGGGATGTTCAGGAAAAGATTAAAATAAATGCCTATTATCTAT
-TGTATTTCGAGATAAACTTTATAGATTTAGAGCAGGACACACATTTCTGGACTTGAGAAC
-GCTGTATCTGGCTTGGAATAAAAGCCCACATTTCATCTAGAGGTAGAATGTATGTCATTC
-TAATCTCCCTCAATCCTTTCTTCTCCAATTTCTTTATTGCCCCACTTACAAGATAGTGCA
-CTATTATTCCAAAGCTGATACCTTCCAAATTCCTTTATAGTAGAGGTCTTGGCTATCATA
-ACCATGATGGAACGAATGACCGTCCTACAGCTGGCTGCAAAATATAAGACTGCTATAAAT
-AAATCCCTGATGCCTGAAAAGTAATTCATTCAACAAAGGAAGATAGGTATGACTTTGGCC
-TACTCTTCATTAGAACGCTTATTtttatttatttatttatttatttataaagagggcaaa
-gcagactttatttgaggggcaccacagcaataggtatagcaacaactgcaacagggtttt
-gtagtcagggagggagatcagactcaactccCTAAAATGCTAATTTTAACAATGGGACAC
-TTCATCTGAACTGTGGTTCTTAATGGTTCAGATAAAGATGACACAACCCACTATTGGCTT
-AAACTTCTCCCAACTCTGGCTACAGAATCCAGGTAAAGATTTCTGCCCCCTCAGAGTAAT
-AGGCATGTCCAAAATCACCTGGATTAGGGCACTTAATACACTGGGAAGGGACGATAACAA
-CTAAAGATGACCACTATCCATGCCTCCTCTAAAAGTTTTTTCATATATTTTTTCATATCA
-CCAAAACAAATACTAACTTGGATCAACTAATTTATATAATGGAATCTCGTGTGAGCGTAC
-AAAATTCCATACTGATTATTTGGTTTAAGCCTGCATTATCATAAAGGCTTTACAGTCTTT
-AAACTGAAATTAAGCTCAAATTAAGAAATGCTAGTCTTAAAACAATGGAAGGGGGGGGCC
-GTTTTGTGTGGAGGGAGGGAGACAGACATACCCCTACACCCACCCACAACTACTGATATT
-GACATTGGAAATTAACTTGAAAATTTATgcctgtagtcccagctactcaggaggctgagg
-tgggaggagcacttaagtccaggagttgggagatgacagtgagctttgactgtgacactg
-cactccaacccgggtgacagggcaagatcccatctctcaaaaaaaaaaaaaaaaaaTGCT
-TTAACTCCACGTCTGTACCAGAAGACCACAGCAGGAGAGGAAAACCTTATTTCAGTCTGG
-GTAAGAGTTCTATTAAACACAAAATAAAACAAACTAGCCTCTGTTTCTGGAGGTCTTCAT
-TAGTAGTTTCTACAAAACAGTATCCAAATTAGCAAAGATTCTGTTAACTACCTGGAAAAA
-GCAGGTACCAAGAAAGAATGTTTCACTACAATGGAAAAAAACAGTCTAGTAAGTAAACCA
-ATCTGACTATAAACGCTACAAAAGAGGGATTCTAGCATTAGTAACTTTGCCAACAATACT
-CTGATATGATTAAAAAACAAAACAATAACAAAAACAAAAAACCTCATCTTTAAATTTGTC
-CCATTCATCCAGAGAAGCAAAATCAAGGAAACTAGAGGGGGTAAAGTCTTGCAACAGATA
-CACAGCTGCACTGCCAACAGGTCACAAGACCCATGCTGCCTAGGGCATTGACTGTTATGC
-CATGAGGACAGACATCACACAAACACCAGTAATTAAAGGGTTACGGTGCCAAAGGGTTCA
-GAGCTCCACTTCCATTCAGTATCAGAACATAAGAAAAAGGGAAAAACAGAAAATGAGCCC
-aaataaaatataaaataaaatataGATACCAGGAGCTTCCTCAAAATATGTGGGTTGTAT
-TAATAACGTGTTTGGCTCTGTTACGGGCACCATCCATCAGAGGACTGGAAATAGGGAAAG
-TCACCTTAGTCTTCCTCAAGGAAAAAAGATTATTTAACTTGGTTCACGGTGTACATTCAT
-AATTTTAACTGTCATGTATTTATTGAATGAAAAACATTTGAGAACATCATGTGCAACAAA
-AACATGATTTCACAGAAATTGTCCAAACTAAAAGAGTATAAAAATAGAAGCGCTTTTTAT
-ACAAttatttacttattattattattgagatagggtctccatctgtcacccaggccggag
-tgcagtggcgcaatcatagagtagcctctaagtcctgggctcaagcgatcctcctgcctc
-agcctccagagtcgttgggatcacaggctcgagcctccacacccgactaacttttaaaaa
-ctttttgtagagatgaggcctcgctgtgtttcccagcctgatctcgaaatcctggcctca
-atcgatcctccaaccatggcctcccaaagcgctgggattacaggcgcgagccatggtgcc
-cggccGCTTTTACACAATTGAATAACATTAAAATAGGTGGCAGAAGACagacagaaagtc
-gattcgtggttgccaggcgtcgtgaataccggggaacgcggagtgcctattaatgggtaa
-gggtttcgttttggaatcagacagcggcgatggctgcacaactttgtgaattttctaaga
-atcactgaactgtgcaccttaaaggaagaactgtgtggtaattacatcGGCGGTACGCGG
-GCAGCGCGTCAATCAAGCCGGCGACGGTGAATGCAGTTCGGGAGAGCTGATACCCCTCGG
-GGAGGCGGCTCCGGGAGCCTGCGGACGTGGCGGACGCCTGGGACGGGGTGGGCCTGGCCT
-CCGCGCTCGAGGAGTCCCAGTCCTCTCCAGATGGAAGAAAGCCGGGGCGCGAAGCCGCCG
-CCCGCTCTTCTGCCTGGGGACGCGACTCTGCCGCCAGGCTCCCTCGGGTCAGCTCGGCAC
-CCGCCCGAGCCCCCCCAGTTCCAGGCCCTCTCCTCATCAGACGTGCCCTGGGCCCTCAGC
-CTGTTCCTCTCGccgcccggaaccccgcagcagccccgggtccccagcccgcgcccctcc
-ggcgccgcctccgccagctgcccctgccccccgggccgccctcgcaggccgctcccggcg
-ccccggtcggcttccgtacctgccttctccgcgccgccgtcccAGTGGCCGGAGGTGGGG
-CCGTCGCCCTGCGCACTCCGGAGGGCCATgccccggggccccgggcccccACCCGAGCCC
-CGGCTGGTGGCGGAGCCGGGAGAAGACGCGGCTCCGACCGCGGGACGTAGCACCCGCTCG
-GCATCGGCAGGCTCCCCTCCGTCGGCCAgcggcgcgcaggcgcgcaggcgccccgctggc
-cccgccccgcgccggcACGTGACCCTGCGCTACGCCCGGCCGGCGGCGGGGGAGGCTGCG
-GAAAGAGCGCGGTGAGCGCTCTGAGGAGTTGGCTTCGTCTGCGCTGTAGACTCTACGGTG
-TAGAgtgtggcgctcttgagcgagtgtgctcgagaccagctgtcgtttcctttgcttctt
-tcatctgtaaaatagtattgatgataataaaaatattgaactcacaaggttattgagagt
-gtttagaacatcaccaagcatatagtaaatactccacaattatGACCAATTTTTGCTTAC
-CAAGGATTATTTTTTTACCTCCTGTCTCGTCTCCCCACACGAACTCCTGTCATCAGTTCT
-TGGGTACTTGGGGATCTAGCAGGTTCATGTCAtacgggtccgcaggttatgcactgcaca
-aggcctgggagcgccatttacgtagacgttcacgtgaaccgtgcccccttaagttgtgcG
-AAATAGTGGCCACTCATCTAAAGCAGCGctctggcttatcaggtctgatttccttctcgt
-cttcagtgatattcctttctttccaattagacatccattcccttggttatatccctgata
-ttgtgattgtggcctcccgaatttctagtgctaggtcttcatgctgaagttcccataatt
-ccagttgcttgatgactctcttccacctcccacccccaaccacaacagttctttattatc
-ctgagacctccagcccatGAaactcctgacctcgtgatccgcccgcctcagcctctcaaa
-gtgctgggattacaggcgtgagccaccgcgcacagcCAAGTTTTACAGTTCTATTCATAA
-ATCTAGTAAATTATATCAGTTATTTGGTCCCATTAATAAACTAAGCTAATTAAAATCCTT
-TGAACATTTGAAACTGCATTTATAAATTCAATTCGTTTTTCTAAGTATCACAGGTTTCTA
-ACAAAGCCTTTCAAGTCCTTGTGTAATTCTTGTAAATGTAATACATTTATAAGAATACTG
-AGTCATGAGTGCTTTCAAATGTGTCAATACAAACGAGATTTCATCTTAAAATCAAAAGTC
-TAAATCTATTCAAATACATATTTGTAATTAGTACAAGAATAATCTGTTAGAATTCTCAAA
-Attatcttttttttttttttgagacagagtctcactctatcacccagactggagtgcaat
-agcgatcatagctcactgcagcctcaagctcctgggctcaagctagcctcctgttgcagc
-ctcccgagtagctgagactgtaggtacacactaccatgcctggctagtttttttagtttt
-tatagagggggtggggaatctccctatgttgcccaggccggtctcaaactgccttcgcct
-cccaaagctctgggattacaggcgtgaatcacagtgccAAGCTCTTGAAATTATCTTGAA
-CATTATAGGAATTTAAAGTATCACATTTACACAGATGCCTTAATGCAAAATTATTAATAC
-TAGAAGTTTGAAAACATTTCTAGTCTTTGTTCTAAATCATCTGTGAggctcatgcctgta
-atcccagcactttgggaggtgaagggctgcagatcacttgaggtcaggagttcaagacca
-gcctcaccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcatgg
-tggtgcctgcctgtaatcccagctacttgggaggctgaggcaggagaattgcttgaacct
-gggaggcagaggttgcagtgagccaagattgcgccactgcactccagcctaagagacgga
-gtgagactccatctcaaaaaataaataaataaaatgaaataaaTCATCATTGAGGTTAAA
-AGATGCTTAGTGCCCACTGAAGGAAGATTTAAGTCATCCCAGTTTAAGAGTAACGTGCTC
-AAGCAATTTGAGATATTTATTCCCTTCTCAGTTTACTGCGCTGGTCATCCAGCCAGCTGG
-ATTCTTGCTTTTGGTAGTGATGGAACAGTGACCCCCACCCCATTCCCACCACCACAACTC
-TAGGACTAAACAGTTGTGTGGTCGTTGTGAAGCTTGGGCcagaatttactttcaaaaaat
-gtcccgcttcatgtataatataaagaccttacaataaattcccatttcttccctcctgtt
-cttcttgctgttgtcctacattttactttttaaaatcccttccttctcttgctttctccc
-ctctacccaccaaccacttgcaaacaaccactgatctacatcctgtcactatagattggt
-tttcattttctggaattttttatggacggaatcatatagtatgtagtcttttttgtctgg
-cttcttttactcagcgtaattattttataagcaatcatgttgcattaatcaatagttcat
-ttgtttttgttgttaagtagaatttcatcttagaaatataccacgattcattttatcaGT
-ATTTTAAATTTTTGCATGTGCTGCAAGTACACAATTCATTGCTAATATGCTTGCCTTAGA
-CCAGGCGGTTAGCAAAAAAGATGGTCTGCCCAcctgcaagccaaaaccactctactgcct
-gattttgcacggctcatgaactaagaatggcttttaccttgataaatgttgaaaaatcac
-aacttaattgtagcacattaaaactatatggaatttaaatctcagtgtccataaaccttt
-actgaaacagagtcacgctcattcatttacctactgtctatggctgttttcatgctgcaa
-cggtagagttcagtggttgcaacagagatatggcctacaaaacctaaaatatttattatc
-tgctcctttatgtatttatttattttatgtgtgtatgtatgtatgtatttttttgagatg
-gagtttcactcttgttgcccaggctggagtgcaatggcgcaatcgcagctcactgcaacc
-tccgcctcccaggtccacgtgattctcctgcctcagcctcccgagtagctgggattagcc
-cgccaccatgcctggctaatttttttgtatttttagtagagacggggttttgccatgttg
-gtcaggctggtctcaaactcccgacctcaggtgatccgcccgcctcagcctcccaaagtg
-cctgggattacaggcatgagccaccgcacccggccTATCTGCTCCTTTATAGAAAAAGAT
-Tggcaggacgtggtggctcacacctgtaatcccagcactttgggaggccgaggcaggcag
-attacatgaggccaggagttcgagaccagcttggccaaagtggtgaaaccccgtctttac
-taaacatacaaaaattagccaggcatagtggcacaggtctgtaatcccagctactcagga
-ggctgaggcaggagaatcacttgaacccaggaggcggagactgcagtgagccgagatcac
-accattgcactccagcctgggtgacagagtgagactccacataaaaaaaaaaaaaaaaaa
-aaaaaaGTTTTGTGACCCTCTAttgtagagatggaggtattggggctgttgcccaggctg
-gccttcaactcctggcctcaagggatcctcctgcttcagcctcccaaaaatgatgggatt
-tcaagtttgagccccatgcccagctCACTTCAGTTATTTCTAAGGTAATTTAAaaaagat
-tttaattgtacttaccttcattcaatttccagtgctcttaatttcattgtgtagacccag
-gtttttttctggtatcatattccttttgcctgaaaaacttcctttagtatcttgtagaag
-gagcaatgaattccgtttttctttatctgaaacagggtttatttctcctttattttgaaa
-gacactttcatttgggtataggattccggaattttgggtgagcagtttttgtgtgtgtat
-gtgtttttcccctatcagcatcagcaataaggtcactccattggcttctagcttgcatag
-tttctgacgtctccataattcttagcttcctctgtatgcaatgtcttctttttccttgct
-gcctttaagattttcttttgttttagcatttcgagtatatctaattttatatgtgtgtgt
-gtatatatatatatatatatatatatatatatatatatatgagtttattctgcatgttct
-ctgagcttcttggattttgtggtttgctctgtccttaatgttgaaaagttctcagccttt
-aattcttcaaatgtttcttttcctgttctctctcctttcttctgggaatctaactataat
-atgtttgagtgtttgatattgtcccacaactcttggatgttctcttttgacggttttttt
-tcccttcaccctttttccccagtgtttcagtttgaataatttctcttgacctatctttga
-gttcattcattctctccttggctgtgtcaaatccactgacgagctccatgaggcactctt
-catctctgcatctctgttagtgtgtttcttttttttttttttttttgagacagagtctcg
-ctctgtcctccaggcgtgcagtggcgcaatctcggctcactgcaagctctgcctcccggg
-ttcacaccattctcctgcctcagcctcctgagtaggtgggactacaggctcccgccacca
-tgcccggctgattttttgtatttttagtagagacggggtttcaccgcgttagccaggatg
-gtctcaatctcctgacctcgtgatctgcccgcctcggcctcccaaagtgctggaattaca
-ggcgtgagccaccgcacctggccattagtgtgtttcttattttgaccagttccatttggt
-tctcatagcttccatctctctactgagattgcacttttgatcttgcatattgtctacttt
-tactgttagaccttttaccatattagttatttgaaattctgtatcacatagctctgacat
-ctgtgtttggttctgaagattgctttgtctcttgggagtatgtcatttatctcttgcttc
-ataagtgttggtgaaagttggacatcttgtgtaggatagtagaggcccagggaaatgggt
-tttgtgtagaaatgggcacacttttccttctgttaggtctttagcgtgggggtttgaatt
-aacctagttaggagttgTGATAggctgggtgggtggctcatgcctgtattcccagcactt
-tgggaggccaaggcaggaagattgcttgaacacaggagtttgagatcagcctggacaaca
-tagtgaaaccccatctctacaaaaaaaataaaaattatctaggcatttttggtgcatgcc
-tgttgtcctagctactgggaaggcttgccgagtctgtcctgcagactctgcccaagcgac
-ggatgaaaggagtactcagatacagatatccagtgaaagagcaggataggggactgccag
-cactaggggccgaagagaattagcagttcccctaagccggcagccctcgcatttgtttgg
-tacagatttaatgacaaaggcttggagcaaacacaatttgtgggtaataaacattgttga
-ccccccgagtagagagcagtcctgcatgcaaatgattaaaggttggtttctggagacagg
-agtagacaaatttatctagataagtttctttacattcccttgttatctgccctttgctct
-caggctccagatgagacaatttggctgccttcagccataatttccttccaaagcttttgt
-aaaacctcctggcctttcaagaaggtttgtgtctttactataatttctcccaccaccctg
-accaatctcctacatctcccccttttctgttttttgcatcagcttttgttaattgaagag
-tacagatgtgcagcaacaggtttttcaggtgtagtggtcactgcttgtatttcggctttg
-catcctagaattagtaaataacataagataaacgtgaatataatcagtaacattcttttc
-caatcaaggagtgacatgtagtgttacttgccacctcagttcagtgtgtgcccttactaa
-ggaaccccactgggggtatgttaaccccttccagccaagcagttacgttattagaggctg
-ggaagggggtgtccacccaggtaatagggtggaagaaaagcagatttagaagatgggccc
-aatagagtgtagcaggtactggttgcaggcagagtgagggaattaaacaaggttaataaa
-gcatagtaaggaataaattatctggagtgaatggtgtttgtgtccagagcaggattcgtt
-cagcctcctgagttgtcttcttcagcatcccccaggtaatgtctggggcttgtgtcgtct
-gaggaagctgcatcatccagggctgtgggtcctgcagggacatttccttcatttctggta
-ccaggttgggtcctagccacaccatgttaaggtttgatgcgttgtgctggaatccaaaga
-ggacctgaggtgatgtgaacacaaccatatcctcttccccatgttggcaactcatttgga
-ccacaccatacattactgtttacatctttccataaaactgtgggttttatgtcttgagag
-gttttagcaaagtgcttttctatagctgattgaaatttatcatttaaatttaagaaatta
-agggtaaataaggcttttgctagtagtgttgcagggtccttactcatactcccccttttt
-tgttttttgagcatatttttaagagtggacacgttctactatggcctgtccttgggggtt
-atacgggatgcctgtggaatgctggatgttccacgtgtgacaaaattgttgaaattgtga
-gctggcatgagccagaccattatcagttttaatttttgtgggccgccccataaatgcaaa
-agttaagagaagagtttaataacatatcaggtggactttccaggaagagcattgtgctaa
-ttaggtgagaataggtatcaatggatacttgtacatatcttagttttccaaattcaggga
-cgtgagtaacatctgtttgccataactgattaggttctagtcctctagggttaacgcctg
-ttgaaggaggggacatgcctgtgagctggcaatccgggcattgcaggataatttgtttag
-ctagtctttgggtaagttgaaattgttcagttaagttccttcaattttggtggaaaaatt
-gacgcaactgcatggcttggtgaagcagtgacatcataacttgcaggtctgcttgttcat
-tgccataagccagtgggccaggcagtgagctgtgggctcgaatatgtgtgataaaaatag
-gatgtgtacgttgatccagcaattgctgaagttgaagaaaaagtgcacacagggtgagct
-tgagagtggacttaatgagggctgttttaaggttttgcaataaataaacagagtaagcag
-agtcactaatattgataggcagagtggaaaagttctccaggggcaatattaaggctccaa
-cctcagctctctgagtgctagtaaatccagaatgagtgaggaaattatgcagtctccacc
-aaacaggcgcttttctgtttttaccagagccatcagtaaaaagtgttaaagtgttggggt
-atgggggagtgaactacttttgtaggcacaactacaggagtacgagataagaactgaatt
-acgttgtcagcaggaagggcatgctctatatggcctgtgtaatcagagattgctatctga
-agatctagagataggggcaatactgatccaaattgccttttactcaaaggaattcttatg
-acatcataacctagcaactgattgcactatctgcggcctgtatagatgactttactaact
-agctggatataggaagatagtgttttagtctcggtatgtgagcaaaaaacccattctagg
-aagcgtagtcctggggtcatctctcctattaatactgttggggaatgtttagtaggaaaa
-acaaacaattgaactgactatcggggtgtctatgtgatatagttgcctctgagaaatagc
-ttgctctatttcctcaatttccctttttgctgcaggagtcaaatacctgggagagtctag
-ggctgtattgccctttaggatagaaaacagttttgtaacttatcagtagttatgcccaac
-gtggggtgaagtcaattaatattgcccagtaacttttgataatcatttaaggtgtgtaaa
-tcgctagtatttaaccttttgaggtcttactgaccagaagttagtatgtatccaagatat
-ttccaattgtactttttcaggtgctatgattaaacctcttaactgtgtattctttatgac
-agaggcatataaacttaaaagcactggctctgttggggctgctaggaaaatatcatccat
-aaaatgaataatcttgcaactaggaaattcttttctactggggagcaaagcctgatttac
-atgatactgacacatggtaggactgaacagcatcccttgaggaagtactttccaatgaaa
-tcagcgagctggcctctcattactgataactggtattgtaaatgccaatttttctctgtc
-ctgttctacaaggggaatagtataaaagcagtcctttaagtcaataatgactataggcca
-atcttgaggaatcgcctcaaaggggaagggaggtcccgttgaaggggccccataggttgc
-aaattagcattgatagcctgtaagtcatgcaaaagtctccatttgccagaccttttggga
-atgatgaaaatgggcgaattccaagggctgtttgacagttctatatggccagcttttaat
-tgttcttccactaattcatgggctttttgtaatttctctctctttaaaggctactgtttt
-acccaaataggattttgagagagccatgtcaggggtaggggaggaataacagtggccatt
-attagaaaggtttgctgttcacacaatttatcaaattctgccctccagaggaggtactga
-ctggcctttaaagttgttttagctagcactgaccagtcccatggggtgatatggaagttg
-tctgctatggtttcaattattccttttgtaaatgggctagtggctccgtttaatgctttt
-tcttaccactttataagcgtcaaaagaagttgtctgctatggcttcaattattcctttca
-taaatgggctagcagctccattttctttaacgtttttttcttatctctttataagcgtca
-aaagaaatgggttcatatacctgatcgccttgtcgatcttgcattactgggcaggctaag
-agctccccttctgatgccgcttggctaagacagggtcccaaagctgtagtgtatcccttg
-tctttttccaatttattggaggagggggctcaggcaaaacctctgtttcctctttgttat
-ttttgcctgttaatggctgggctgagggagaaggaggagacggtagggtaggtgacggtt
-ccatctcccttacttttttaggcttttctgtgtagagtgggaccaaagcagtcctaacta
-aagcccataacgttaaagatgttactgagacccattgcccttgctcatgatgttaaaatt
-tcttcccagagctctacgtctagtgtaccttcttccgagagccatgggttatgggaaaca
-acagtttgcattaggtcccataattgagcctgtctgaggctctgctaactttcagcattt
-gttttactacttttatatactgttgctgttgagctgacaactgttgtcccatgatgacaa
-ctgtcatcccatgatgatcgtccctagcttgagcaattcctttgaacttggaaatgctga
-acaggcaccaatgacttactgactgcgcagtctcttcaccttcattttcgagggttccgt
-cgtgatctgttgcagcattcctcacacagggaatcacctgccgagtctgtcccacagact
-ttggccgagtgacagatgaaaggagtactcagacacagatattcagtgagagagcaggct
-aggggactgccagcactaggggccgaagagagttagcagtccccttaagctggtggccct
-cacatttatttagcacaaatttaatgacaaaggcttggagcaaacacaatttgtgggcaa
-taaacattgtcaacatcccaagtagacagcagtcctgtgtgtgaatgatcaaaggttggt
-ttctggacacaggaataaacaaatttatctaggtaagttcctatacaactcccctgttat
-ctgccctttgctctcaggcttcagataagaatttggctgccttcagccataatttctttc
-tgaagcttttgcaaaacctctcggccttccaagaaggtttgtgtctttcctataatttct
-cccaccaccctgaccaatctcctacaAaggctgaagcaggaggattgcttgagcccagga
-gtttgaggctgcagtgagctgcgatcacaccactgcacttcagcctgggcaacagagcaa
-gaccttgtctctaaaaagtaaataaaaaaaagagttgggctaggtttgaggtttattgtt
-gctatggttacccccaatgcagcagcttccagttcctccaatgacaccttggactgaggg
-tgcaggctggcctgccagagggattttctccttccatgtgtgctccctgctcagctttag
-gtcctccctttgtgaccctcagaaagggtcttcttcccatactcttgtctctctcctgta
-acatttttacttctaactcaaggcttgtcagcttaccattggcaggtgggggaggaggga
-attctctgttctgatcaagtctcagtctctgtcaggccctttgtgtctctgattttgggg
-ttatgtcctccttagtgctcctgttcctcccccAGTTCTGGGCCCAGTGTGTATTCCTGC
-CCCTGCCCAGGGAAAGTTTTGTTTTGTTCCTGTTTCATTCCCCCAGATGCAAGGGAGCTT
-CATCCAAGGGGGTGACAGGATTTGGTGTCCTTCCCTCCACAGACTAAGGCTTTTGTCCGG
-TAGGGGATACAGGGAAGGGTCTGGGTGGAGCACTGTGATCCTTTCACAGTAGCTGCCATT
-GTCTTCTTCCAGATCTTGAGACATTTTATTAAAACTTTCTCCAATCTTCTGTGTGCTCCC
-AGTGGGGTTCATGGTGAAAAACGCTGAAAAGGGTAAAGACTACTGCAGTCTCCATGACCC
-AGTCCCTCACCAGTGTCCACTTGTGTTTACCAGGTAACCAGTGCCCATGTCATCTCTTCC
-ATTTTGTGCCTGTCTCTCCTTAGATTTGAAGCCAGTTGATTGTCTTCTGATCTCAGCTCT
-CCAGAAGACCTTTTCCAGAAGACCTCTCCCTGTGTATCCACTTCTAAACCAGTCACAACT
-GCCCGAGTCTCACAGCAGCATGGTGGATATCCCGCTGTCCCTCAAACTGGGGCTCTGTCA
-ACAAAGAGGAAGGGAGGAATGACTCCCTTGGGAGGAGACAACAACATTGCAAGTGATCTa
-gtctttgaaaggcttttaagcaagggactgagataaaatttatttattatttttaagaga
-gaggttctcactctgtcagccaggtctcactgagagcaatgtgatcatagctcactgcag
-cctccaactcctgggctcaacgtatcctcccacccagcctccccagtagctagcactata
-gtcacacaccaccacactagttaatgttttcattttttgtagaacagaggactcgctgtg
-ttacccaggcctcaagtgatcatcgggccttggcctcccaaaatgctggggttatagata
-tgagtcactgtgcctggactagaatatttatttttgaaagatctttggttgcaggtgtca
-gatgaatcaggaattgagacgagatgggaaggcatcaagaccagttatctgctatgatac
-tccaagcaagagaggatggtggctgggatgaggaatttggcaacgggaatgggaggaagt
-ggatgcattcaagataaatATCCATTTATTAAAAGTAGTTGCTTTTTCACCAGAGTAATA
-CATAAATATAGTTTTAAAAGTAAATACTGCTACTATCTTAACAATAATTTAAAAAatctc
-aaaataacatgcaactgtttgatttttcagttttaggcattagttccccttataaatgat
-gagagtttagagcttagaccgcttgtcctgttaccaacaccaccacacatgccagcattt
-cccatcactcctctttccattgtcatcatactgtaatcctggttagaccagtattcagtg
-tttccattatgactacgtaaattctaatcacagctgaaccagcagtatgatatttagttt
-tccctcctttcataacttttcccattcctgctgagttaatacttttttggcttgtcttac
-tctgctcagttttcATTTTGTAAActtttaaacatttgaactctagcaaatatactgaga
-agtgccccaaacgtaaatggagagtttaacaaataattatagagcaaatacaacatttag
-gtaccaccccaataaacacaacaccgaggacccccagaagcaccctgtgtATAGTGGAAT
-GTTGTGTTGTTTCTGGCCATGGAGTCTCAAAGACTGATTCTCAATTTTTGTTGCTTGAAA
-ACAAGTAAACAAGTATTCTCagccgggcacggtggctcacgcctataatctcagcacttt
-tggaggccgaggcaggcagattacttgatgtcaggagttccagaccagcctggccaacat
-ggtgaaaccctgttgttttgtaaaaatacaaaaactatctgggtgtggtggcatgtgcct
-ataatcccaactacttgggaggctgaggcaggagaatcgcttgaacctgggaggtggagg
-ttgcagtgggctgagatcatgccaccgcactccagcctgggtgacagagttaagactctg
-actcaaaaaaaaaaaaaaaaaGTTGGTGTAATCCTTTCCACACACACATATATATATACA
-TAGATGTTATATGTGGTTGCCTTCTGTTCCTACTGATATATATGAATAGTATGGCTGATT
-GCATTATTGGTTTGTTTCTTCATTCCCCTGTAATAAGACTAAACatacacaccctttgcc
-atataacctcataaagttttcccaacacaggctctatgcttccctactgcactgatgttg
-ggcttggctatgtgatttgctttcgccaatgggatgatggtgcttgtgacacagcagagg
-cttgaaatgtgcttgtgtgattccatttggtctcttCTAAGTTTCTGTGATTCATGAGAA
-GAGCACGCCCTGAGTAGCTGCTGCAACTTCTGCCACATTGGGCAAACCTGAATCCAATTC
-ACATGGAGGTGTCCAGCCCAGCCGACCCACAACCTGAAAAACAGCTGCTTGGGCTGAACT
-TGATCTAGATCAGCTGAACTACATACAGTTGCCTTAGAAATTTGTGAGACTAAGACTAGA
-CAGAGAACAAAAGCAAAAGAAAGAAAAAATTTGTCTGCAATGACTGGCTAGGAACCTGGA
-CAGATTCCTGGCAACATAGCTGTGCAAAAGCAGCCCCACAAGCAAAATTGAGCCAGGAGA
-CAGGGTTCTGATCCCAGGCATGGGCCTTGGCAGCTGAAACTTGTTAGGCTGGGCCTCTCC
-CTCGCCAGTTCAGGCAGCCCCTCCTCTGAGGCCTCATGGACCATTCTCTCTTCTCCAAGA
-CTTCAAGATTCCTTCCTAGTGAGtttttcttttttacttttagatggagtctggctctgt
-cacccaggctggagtacactgacgtgatctcagctcactgtaaccgccacctcccaggct
-caagcaattctcctgcctcagcctcccaagtagctgggactgcaggcacacgtcaccaag
-cccagctaatttttgtattttttagtagaaacagggtgtcaccatgttgttcagtctggt
-ttcaaactcctgacctcaggtgatccactcgccttggtctcccaaagtgttggattacag
-gcgtgagccaccatgcccggcACCTAGTGAGtttttctgttacttttttttttggaggcg
-gggtctccctatgttgcacaggctggagtgcagtggtgaaatcatggctcactgcagcct
-caacctcctgggctcaattgattcctccatctcagcctcccaagtagctgggactacagg
-catgcaccaccatgcccagctaatctgtgtattttttgtagagagggtttcatcatgttt
-cccagaccggccttgaattcctgagctcaagtgagtcgcccgcctccacctctcaaagtg
-ctgagattacaggtgtgagccactgcacccagccTGTTAAATCTTTTTTTCAATTAATAA
-CAACttcttttacagacagggtctcactctgttgctcagtctggggtgcagtggcactat
-catagctcactgcagccttgaacccctgggctcaagtgatcctcctgcctcagcctccag
-agtagctagcactacaggcatgtgccaccacatccagctaatttttaattttggtagaga
-cagggtctccctatgttgcccaggctggtctccaactcgtggcctcaagcaatcctcctg
-cctcagcctcccaaagagctgagattacaggcatgagccaccacgcccagctTCTGTGAC
-TTTAAAAAAATCtttttagacagggtcttgctctgtcacttgggcttgagtactgtggca
-caatcacacctcactgcagccttgacttcttgggctcaggcaattaattctcgtcctttg
-gcctccccagtagctaggacacaggcgcacaccaccacactcagctaatctattttttgt
-agaggtgggttttcgccatgttgtccaggctggtctgggactcccggctcccaaagtgtt
-ccAACCACAGGTGTGTGGGCCTTCCGTGGTATCTTAACCTCATCACCCAGAGGCAACAAC
-AGCTAGTATTCTTCTAGTTTTTACCACCCCCACCACCTCAATCCTGCCCCTGTAGCCTTT
-CCAAGTGCCACAGCATTGTTTCAGTTTCTATCTTAGAAAGCCCGGGAGTCTGTGTCCTAT
-CTCCCTGGGGGCATTCAAACCCTAGTCCATAGCCTGAGGCCCACCTATACCCAGACCCAG
-TGTCTTGGAAGCACTGACTTTAATACCCACTTAggctgggcgcagtggctcacgcctgta
-atcccaccactttgggaggcttgggcgggcggatcacctgaggtcgggagttcgagacca
-gcctgaccaacatggagaaaccccgtctctactaaaaatacaaaattagctgggcgtggt
-ggtgcatgtaatcccaTGCCTGTCTCAaaaacaaaacaaacaaacaaaacaaaacaaaac
-aaaaAAACCCCAGTTACATTCAGGATGAATTCTGCCTTCCTTTTTGCCACCTTGGGATTT
-CCATTTCTTTCTCTGAAATAGGCATTTGCATTTTTCCTAGGATTTTTTTTTTAAAACAGT
-TGGAATTATCCCATATACACAATTTTTTCACTTTTCTAATTAACATACATTTCCCCATGG
-Gcttgtgtctcacctctcaatccccagtgtatagcaaagaccaggctcaggggcacttac
-aaatgtttgttgaaACCAAAGACATCCTATATTACAGAAATGAACTTTGGAAAGACCAGT
-CAGCGTGGGTGGGTGAGGAATGCCAGAGACGGGAGAACAAAATGAGGTATACCGTCAGGT
-TTGAAGGGTTGAGGGTTATGGAGGGTTCTTCATAGGAAGTTCACCATGGAGTTCTTGGAA
-CTGTTCAACACACAGAAGCAAGGTCCTCTCCTTCTAGGTATGGCTAGAAATGTTTATCAA
-TAGCTGAGACTCTGATTCCCAGGGTGGGATCAGGAAGCCAGCCCCAGCTGCTGCAGCATT
-TTTTTCCCTTTTTCTCATTACAGGAGCCAAGAAAACTGTCAAAGCAGATGATGCAAGAGT
-GAAGCTGACTCAGAAATACTCAATCCCCCCAGGAACTTCTCTAAGAAATGGACTGACCAT
-CCTGTAAGCTTCCATCTGGAGGTACCTGGGGAAGGGCTTCTCACATTGAGGCCAATAAGA
-ATCCCTAGTGggccaggtgtggtggctcatgcctctaatctcagcactttgggaggccaa
-ggcgggtagactgttgagctcaggagttcaagaccagcctgggcaacacggcaaaacttc
-atctctaccaaaaaaaaaaaaaaaaaaattagccaagcatgatggctcgtgcctgtagtc
-cctggaaggctgagttgggaggatcacctgagcctgggaggttgaggctgcagtgagctg
-tgatggcgctactgcactctagcctgggtaacagagcaagacccgtatcaaaaaacaaaa
-caaacaaaaaaCTTCTAGTGAGTAGAGCGACAGGGAGACAAATCCAGTTTGTAATTTGCT
-ACAGTGCAAAATATCTGGCTTTCCATAGAGGGAGTGGGAACAAGGCAATGCTGGCCTTCA
-TTCAATCAGAAACTTGACTTGTACCCGTTGAAAACCTGTCATGTTTAATGCTTGGATATT
-TTTTCTTCTAGTAaagacactttactgccacctgctggaaaagagtcagaaattttccaa
-atgcaaacatctatggcctccctataatgtagcatccttttactgtacatagtctgcaca
-actgtacaATTTAGAAGAGAAACCAACATTTGGTGTAACTCTACCATATACCAGGCATCT
-GTCATAGAATCTGAACAACCGCTCTATGAAATCAGTACTTATACCCCAATTTAACAGATA
-GGAAATATTGGGacctctggggaagggaggaagaagagggtatcaccaaaaaagggcaaa
-aagggggcttggtctgtattggcaatggaaattcaacttgggtggtaggattatggatgt
-gttacagctttctttataattTGGTACATGCCTAAAATGTTTTACAATAACAATTTAAAT
-CACCTGTGAAGAAAAGATTCAGAGAGGTTAACTGATCAAAAAAATCACACTGCCAGACAG
-AACTCTGTTAGAGGTAGACCACTTGCAGTAACATTACATTGCTTCTCTAATGGTTAAATT
-TAGCACAGAATCAAAGGAGAGCTATAAAGTCTAGGAAGTACTTATTTACATAGGATTGAG
-TCCAGAACATCTTGTGACACCATCTACATATGTTTTACTTGGAGAATAGTCTGAATTTCG
-TATTAcacgttgagcatttctaatttgaaaatacaaaatcctcaaaaatctgaaattttt
-taagcatcaacatgatgcctaaagtaaatgctatttggaatatttcaaatttcagattag
-gaatattgaactggtatgtattccgcaaatattccaaaaatccaaaaaaattcaaaacac
-ttctggtcccaaccattttggataggggatattcaacctATATTACACACAGGTAATACA
-GCAGGGGAAAAGCAGGGAGACTGCAGCATCTAAGTCTACTAAATTGGCCAGGATCATTCC
-TTAGTCTTCAGATACCTATTTATCAGGGTCTCATTAAATAAAGTTACTTGTCATGTTAGT
-TCAGTCTGGCCTGTGGCTTGTAATTATAGCTGCAAACTCAAGGGCAAAGTTCTTAGGATT
-TTGAGATGCTCTTTATGCAACAATACTTCCATTTACTTtgtgtgtgtgtgtgtgtgtgtg
-tgggtgggtgggtgtgtgtgtgtAGGGAGAGAAAGGGGGCAATGGAGTGGAGagtggaac
-tacaatttattaagcacctattattacaagccaagtagggtgttaaatattttcctcgtg
-ccattccattcaatactcTTCGATCCTGAGGGAAAACGAACCCACTTAAAAAAAAAAACA
-AAAGGTTTTAATGAGGATTGCATAAGACATGCAAGGTCACCAGGGAGTTTACATGCAAGT
-GGGGAGATACAAAATAATACAACAAAAGTTCAGGTGTTCTGAGGAAAAAGAAGGGCAAGG
-GTAAGTGATGACAGTGGGGGAAGTCGGATTCAGGATAAACCAATTTTAGACTCATTTTTT
-GAGGAAGGAACTGAGCATGACCTTACCACACAGCCTTTTTAGTTAAGTGTTTCTTTAACT
-AGGAAAAGGCCCTGGGAAGACAGGCTCTCTACTATGCAAACCCAATTCCAGTCTTGGGAG
-AGAATTTGCTGGTGGGACAAAATCAGGTTTTTCAAGAGATGCTTAAATGGTCAATTCTAA
-TTATAACCATACTTGTCAAAAGGTGAAGCAAAGATGAAAGTTAAAAACTAAGAAGAAATT
-AAAATTCCCAAATCTGTCAACCAATCTCTAATTTTCTCTGCTACTTTAGGACTATAGTAA
-TTAGCCATACCCTGAGGATCTACTTTACAAGATATATTCCTCTGACAGTCCCACTCTAAC
-AATTTAATCTATCTTATGTAAGCTGGACAGGCATTTCAAGTACAAGAAACAGAATTCAAA
-ACGTGAAAACGGAGCCATCTATCACACACGGTGTCGGTTGGAGAAGCATATTGCTCAGGC
-TGCAGGGACATTTCatttatttaaatgtttttattaaaaaaaattaaaGACCTTCATGGC
-ACAACTTCTTCCCAGCACAGTTATGGTTTAGTCATACCAATTACAATACAATTACAACCA
-ATAAAGCAAGGTGGGGAGGGCCTTCTGGCTTCAAACTTAAAAAAAAGCAGAGGAAGAGGG
-GAGGGACCACTTCAAACAAAGTTTAAAAATACTTTAAAAAATCTTTCAGAGTAATTGCCA
-ACATAACCTTTCATGTTGGCCATTCCATTTCCTGCCATCTAAGCAATGCAGACACAGGTA
-GTGCTGAGAAATAGTGTCCCAATACAAGGTATACAGATGAGGTAATTTACAACAACACGT
-AAGTTGTTACTCTGTAAACCCTTGCCTCCCCCCCACCCCCCACCCAATTGGGTCTTTTTT
-TTTTTTCTCTCTCTCCATGCTTCTGCAGTGACTCTTAAGTAGCATTTTTAAAAACTTCTA
-TTTATTTTAAAAGGCTCTTGGGTGGCACCTCAGAGTCCTCTGCATTCACCTTCGGTTTAT
-TCCAAGGTCTGATGGGTGTAAGGAGGTCCAGCTGTCTGCAGCTCTCCGCATCAGCCTAAG
-CTACACCTCAATTTCCGAGCTACAAGGATAGGGTATGAAGTCTTGATTTACAACCCTCTC
-CCCACCTCAAAAGAAAGAACTCATTAGTTATAAGTGTCCTGTTCAAATCACAATCCAGTG
-CAAACATAATCACAAATTGCATCTCTGGCACATCTGGTGCTTTTAGCTTCTGCACAAATT
-CAACATGGTAACCCTCACAGCATTCTAGGGCATAAAAGGGTCAAGTACAATAAATATCCA
-CTGTAAGTGGTCATAAGGAAGAAAATCACCCTGCCACACAGTCAGAATGTTTTCCCTTCA
-GCTCTCCCTACCGTTGAGAAGCGCTATAAAAGGAGGCTTTAGCGTCCTCTAAAGTTTACC
-ATTATATTCACTAAAGCCACCACCTTGATAAAGTTACTAAAGCCAAGATGGGTTACAAAG
-TTAGATAAGTTCATTAAATTCAACTCCCCAAACAATTACGTTTATCTATGATGCCTAGGC
-GAGAAAGGCCTGTGAATCTATAAGGTAGGAGAATGGGGAACTAAGATTTTAGGCCTTAAA
-ATATGTTGGAAGAATTTTTCCTAGTTCCCACAAGCAGCTACTGTAATGAAATAACAGGAG
-AAAATACAGAGCTGATGGTTTTGCTATTGTGCTTAAAAAACTAGGCTTCCTCAGTGAAGC
-ACCTGATAAACTTAGGTGGTTGGATTACAGTGGAAAGTCCACTTTACACACACACACAAA
-CACACAAAAACTGGCGACTTTTTCCATCCCCAATCCCTGCACTGCTGAGACACAAAATGA
-GTTTTATGGCAAAGGATCCTTAATCCCCAGAGACGCTTTGGCTTGTGGTGCTTTTTTTTT
-AAGGCCTCTCTGCTCTGCCCGGTACCATGGGTCGAACGAGGGGTGTATAAAATGGGGGCC
-TTGGGAAGCCTCCACGGTACAGGGCTGCAGGCCCCTCAGATGTGAACATGAGACACCCAC
-CCAGCAAGACCTTTACACAGGGAACTTAAATCTAACCTTGATAAATAAAACCAAACGTTT
-ATTTACACCAAAGAATTCCAACACTGGATCTTTCACATATGAAGGACAAAGTATTATATA
-TATACACACAGCAAGGGGTGGCGGGGCTGTAACAAGAGAGTTTATAGTTTTCCCACAATT
-ACAGGTCTACCATTTCAGCTTCAATGGAGATAGTGGCTCTGCTCCTACCTCTCAAGATAC
-ATTTACAAGACTGAGGAGCAGGTCTTCTCACTGGATGGCATGTGAGGGAAGGGGACGGTC
-GGAGGAAAAGAAGGTAGAAAGCTTAAAATGGAAGTCAGTGTGGCCACATCTCCCATTAGC
-TCTAGCATGAAACCTGTACAGACAATGTTTGTTTCTTTTGTAAAAAGCAGTAAGTTATGC
-CCAGTAACTAAATGAATTCAAAATGGCCAAGACAAAGAAAACTAAGAAAGATTTTGCCTT
-CCCTCTCCTACCAGCTATGGAGCACAGCATGTTGGGAGATGAACAGGGAAAAGACCAAGG
-TAAGGAGCCTGGGAGGGAAGGTATCAACATTTTAAACTGAACTAAAAATAAAAGTATAAA
-TGAGTTGGATTTAGGGTTAGATCAGTAAGACATGATTCTTACTGAACAGAAGTTTTTAGT
-ATCTGTCTGCATTTTGGGTAGATTTTCAACATCTTGATGTAACTAAGACACACTTCCACA
-AGAGCCACTAGGATAACCCCACTGAAGCGCTTATGGAGTAAAGTGATGTAAGCGACCAGC
-AAGCAGTCCACTGCTCCTATAGATTGGGtcctcccttccttctttccttccttcctttct
-tcctgcctcccCTGAGAAGCTACATTTTTGTAATCTCTGGAGAAGAGCACGAGATACCAA
-CCCCCTAAAGTGTGGGACGGTGGAGGAACAATGGTGGGAATGGGAAGAAGTCTCCACCTA
-AATGCAGCAGCCGGGATTGAGGCTGGTTTATCTTTGTTCTTTTGTGATGAGGAACTAAAT
-TTGGGAGGGGAGAAAAAAAAATTTGTCCATGAAATATTCCACCTGCAGGTAATTTTTCAG
-GGAATCCCCTGAGTTATGAAAAGTTCGAGTTAAAAAAAAAAAGAAAAAAGAAAATCAGCC
-TATTATAATTTTTTTTTTATGACTGAACTACTATAAATCCACAAGCAACGGTTCAGACAC
-GGTGCTTCTGAAGTGTTTCACCCCTCCCCGCCAGGCGCAAGCTGCATCAAGGAGAGGGTG
-GACTCCCCCACCTCTGCTCAGGCATCAGGAGACAGATAGGGCCGTTACTGCTGAGCGCCA
-GCGGCAGCTGGAACAGGCATCCCAAGGGGGTTGGCAGCAGCAATCACTGGTGAGCCTGCC
-AGAGGTCCAAGGGGTGAAGGGGTTGGCACTGAAGAAATCCCTGAAAGAAAAGAGCTGTCA
-GTGAGCCAAAGACACCAACCATGGCAATCTTACCAGTTTCTCATAGCACTCACTGCAAAA
-GGAACACAATAATTCTTTACTGAAGACTTCCTCTTAGCTGGATTtttacatatacttcaa
-gtctgaccctcacaaattcaagttaaagtggcaagtcctaatcaatttaagagacaggta
-aagaaatctaggcttggacaatttaaggagtttgtccaaagtacacgattaagcaagtgg
-caaccatggttggattctaacccaggcctgtctagGGCAGAGATGTCCACCCTGGTGACc
-agtagccaaccacatgtggctgctgagcacttgaaatatggctagtgcaactgaggaact
-acattttaaattttattcaattgtaattaaatagcctcacgtggctagtcactaccatac
-tgaacagcacaTGACTGCAGTCAAAGCTCATGTGCTCTTACACCATGCTGTCTTGATAGC
-TGGCAGCTTTCAAAATTACTGAAAGTCAATTTGAATGGGGAAAGAGCATTTTCTAAGATA
-AAATTGTGTTTTGGAATTTATTTCCATTTGATTTCTTCCACCTCTCTAATCATGTTTTtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtACACACAGGTAATACATTCACATGGTTCAAA
-ATACAAAAGGTTCAAAAAAGTATACAAAggccaggtgcagtgtctcacgcctgtaatgcc
-agcactttgggaggccaagttgggcggatcacctgaggtcaggagttcaagaccagcctg
-gccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcgtcatggcg
-ggcgcctgtagtcccagctacctgggaggttgaggtgggagaatcgcttgaacccgggag
-gcggaggctgcagcagctgagattgtgccactgcactccagccttggccacagagcaaga
-ccttgtctccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatatata
-tatatatatatatatatatatGAGAACATTATTATACATTCTTCTCCACTCCTCTTAGAC
-ATGGCTCTGCATCTCACtttttcttttgagacagagtctcactctcacccaggctggagg
-gcaacggtgcgatctcggctcactgcaacctctgcctcccaagttcaagcgattatcttg
-ccttagcctccaagtagctgggattaaaggcgccgccgccacgcccagctaattttttgt
-atttccagtagagacagggtttcgccatgctggccaggctggtctcgaactcctgacctc
-aagtgacccacccgcctcagcctcccaaagtgctgggattacaggcatgagccactgcac
-ctggccctgcatcttgcgttttaaatttcacattattatattggagttggagatctaaca
-gaacatgaaactcttattctactggctgcaccacattccattaaatggatataccataac
-tgatttaaccagtttcctactgatagctattctcaatgttttgttattacaaataaggct
-acaagtaagtttggatatacattactctgtacagaggtaggatactcaaggggtaaattc
-tagaagGCAGTTAGTTCTTTTCTTAAAAAAGAGGAGGGCAACAGCAATTATTTGAGGATA
-TGTAAGTAAATGCCTTCACTACCAGATATGCACCCACTTGGATGTTGCCTATATGTATAA
-TTCTTATGCTATGTGCCTGTAGTTCCTTTGGAATAACTGGGTACTCTATAAAAATTCACT
-GTGCGTCACAATGATCCAATAATGGAAAACCATTTTACTTATGTTTTTACAACTGATAGG
-CACTCTATAGTTGCTCTGGCACATGTCACGGAACTGTCCTTGTACACATACACACCTATG
-TATAAACCCCACCTCTATACCCCATTTCTTAACATTGTTTCTAAGGGCCATGTAACTACT
-GTCATTTCAAACTATAAGATGAAATGGTGTATTTTTCCTTTTCATGGCTTGGCACTTTCA
-AGCCCCTATGCCAAAAATTTTCAGCCAGGAATGCTGAGATTCTAGCCTAGAAGGGGATAC
-CCTACTCAAGACAGTATCACTAAAGTATACCAAATGTCAAGCATGCTGAAACCTGGTTAA
-AAAAAAGTCACAAGGCCACCAGTACGGAGAAGAGAAGGTATACAAGAAATCAGACCACAA
-AGCTAAGAACAGTAATTGACTTCCACATTTTTTTAAAGAAAATTTACCAATGAACTGACC
-TGACATCATATTGGCGCTGCTGACGGGCGTACTGCCCCCTGGCATGCTAGATGAACCCAT
-TCGAGCCTGGTCCTTCACAACAGTGTCTAGAAAAGAGACAAAAAGGCTAGGTTCTGTTTT
-GCTTGAAAGATTAAACTAATGGTCTGGAAGCCTGAAAGCAGCCAGCTTCATTCTTTGCAA
-TTTATATATACTCTACATTATTCCCCAAAGAACTTAAGGTGGCAATTGCCTTCACCATGA
-ATTAGACAAGTGGTAAAAAGCAGAAATAGCTTTCCTATCAAACTGTGGTAAAAGCTAACC
-TTTCAATCAAATGGTAGAAAGATGAGGTAATTATTTATAGCAGAGCGAATTTAATGAAGC
-CCTGGTCCTGTTGAGGTTTAATGGAGACAAGACACTGTAACTCGGCAAAGACGGTAATAT
-ATTACCAGTGTGTCCACAGCCCAGTACCAAGTAGGCCAAAGCTATAGGTCCATGTAGCTT
-AGGGCTATGACCACATTCTCTATCCCAATCAGCCTATCTATCTGCTTCAGGTATTGGGCA
-AAAGTATAAATGATTCAGTACAAAACCATCACACCGAAGGAAAAATGTCATGTTGCAGCT
-AACATCACAGTGCAGATGGGGTGGGTCTCAGTGGTATTTTCACTTAGGATGGCACAGGTG
-GCTATACTCACAAATCTAAGTCAAGGTGTTCATACAATTTTAAGATTTGTAAGCCTCATT
-AGCTCTTTCCAACGAATGATTACTAGGGACAGGAAAGATACAGGGCTGTGTATTCTAATT
-CAACCATTCCAGACTGAGGCACTGAGAAGTGTCATCCTCACAGTATGAAAAGAGTTTATT
-TAGGAATGCTCTTGTGTCATGTATTCTGTTACAGAAGaattcttccagtaattctgcaat
-gtagttgccatcactatccccactggaagaatctgaggctcagtgtgggtgaattaactt
-TGCAGCAAGCTGACAGGAGCTGGGATTACGACTCTGTTCTATAGGACTCTGCGCCTGCAC
-AAACTCTGTGGGCTAGATATCTGGACTCACAGAAATAGGGGTGCTCCATTGCCTCTCTTG
-CAGTAAGCCGTGACTGGTGGTCATATCGCAGCAGTTTGTCCAGGAAATCCAAGGCCTCAG
-GGCTGACAAGGTGCTGATTTTCACTGTGGACAAAGCGTTCCCATCGCTTTCGAGAGTGTC
-TGCAGGACCAAAAGAGGGCATGAGAAATGGGCCACGTGGGCACAGAAGCCCAACATTTCA
-TTCCTACATTTTTCTTAGTGGCTAACAGCCCAGACAAAAGCAAAGAGGGATCCAAACTCA
-AGAGGGTAGTCTTGCACCGCTCTGCCACTGAGTGGGACAACAAAGCTAACTGGAGACTGG
-AAACAACATAGCTAGAGTGAAAAAAGACATCTGAGTCCTCTCAATTTTAAGAAACATAAT
-TCAGGTTACTTGACAGGACGTGACCGCTTCTGTGTAGCAAGGAGGGTCAGGTGGCTGAGC
-TCACCAGGCCTATTTCCCATCCCCACACATATTCCTGGCATCTCTGCCAATTGGCCAGCA
-AAAGCCTTTGCATCAGGAAAGTCCATCTCCTCCTGTTGAGTGGTTAAGTGTATAAGTACT
-ATATCTAGTCACTACTGTTAAGAGTCGGTTGTCTGCATATAGCCtttttttttttttttt
-tggagacagggtctcactctgttgcccagactggagcgcagccacatgttcattgctctc
-tgtagcattccctcctgggctcaagggaagctcctgcctcagcttcctagtagtctggac
-tactgccacacatcaccatgcatggagtcgagggtctcattatgttgtccaggctggtct
-ccaactcctgggctcaagtgatcctcctaaagttctgggattacagatatgagccaccgt
-gcccagccTGCACATCAGTCTTAAAGCATGCATTTTCTACTTCAATTTCTTTCTCTTGGA
-GAGAGGTTTTTCACTTAAAGAAGCAAGGTAAATTTTGATTTTTGCCTCAACTGTAACCCT
-TCTACTAGAATCTACATTCATTTTGTAGGAATCCTCTAGCTATAACCCCTCCATCAGACT
-CCTGTAAGTTAATTTGAATAAAGGGCCATTCAATCCAATGCCTTTATCAGAGGCCTGCTC
-AATGCAGCATCCTGTGGCACTGGACCACTGACATCCTGACAGTGCTGGCAAAGAAAACAT
-AACTATTTTGAAGATCCTAAGTGCCAGTTCACTCTCAAAGTGCTTAAGCCACAGATGCAC
-ATATTTTGTTTCATGACTTACCTGCCCAAGATATCATTGAAACGTGGATCTAATTCAATG
-TTGTATTTGTCAATATAGTCATATAAATCTTCTGTCCCCAGAACCTTGGCTATCCTCACC
-AACTAGTATTAAAGAAAGACAAAAACCCATATCACAAGCATATTATATTAACAAATCAAC
-AATTAACAATGATTGAATTTACATAAACGGGTCATCATGTCTACAGGTATGAATGCTACC
-TCCTAACAGTTTAGACTTCAACTCAATGTGATAGTGTTAGAAAAAGCAAACTACTTTATA
-AACTGGTTTCTTCCTCTTGAAATGtcaccctggtgaacccttatttttctcccctcaaaa
-cccaattgaagatgtcacttcttttgggaagctcccattgcacactcaaactactcacca
-ctactgccttttgtgccttgtccacatttctactctgaagttatgactgtaacctatttt
-gttgtatgtttgactcccttacaagatcagctatgaactatctgaggggaagaaaactat
-tctttcttttttctgtattcctcagtactgcatgcacttgatacagagTTATTGACTTTA
-ATGGAATTCAGGTTGTATTCTTTGACTCATTAAAATTGGACATGGTGCTCAAAGGGAACA
-AGACAATGGTACCTTCCACAAGGTCCTAGAATCATTCCAGGTTCTTGTGAATGAAAGAGC
-CCTTTGATCTTCAAGGGGGAAGTGGAGTTAGTTTAAGAAACATCTGTAACTCAACCCATA
-TAAAGAGCCAAAAGGATCACAGAAATACCACATATGGGCTCACATATTGGAGAAAACACC
-ATATTGGAGATAAGGGTTTATTAGGAGAATTCTAAGGTAATGTCCTATTTTAAAAATCTG
-GATGACAATTTATATGTATTCTTCACAATAAAATAAGCAATGCAAATGACAAAGACTAGG
-GGGGAATGTCTGATTTCAAAAGGCTAAGCTGGTAGCTCCCGAAACATCAATCTAAGGATC
-AATATCGGGGTGGCTGAATAAACAGTGAACTGAAAGTTACAGGCAGTGCTGGCTATCATT
-GCATTAGGCCAGTACATTTTTCAATGGGTATAACATATATTACCTGATCATAATTGTCAT
-GTCCATGGAAAAATGGCTCCTTCCGAAAGATCATACTTGCCAGCATACAACCCAAACTCC
-ACATATCCAAACTATAATCGTACATCTGCATAAAAGTAAACTCACTGTTATTATCTGTGA
-ATCCTCAGGCTTGTCACTTCaaaataaaaaattaatttttaaaattaaaaaaaaatCACT
-CCACTGACTCAAAATCAAAACACTAATAACATCTTCATATAtttctttttagtctttctt
-ttttttttttttggagacagagtctcactctgctgcccatgctggagtgcagtggcgcaa
-tcttggctcaccacaacctccgcctcccgggttcaagcaattctcctgcctcagcctcct
-gactagctgggactacaggcgcgtgccaccatgcctggctaattttgtatttttagtaga
-gacggggtttcactacgttggccagtggtctcaaactcctgacctcatgatctgctcgcc
-tcaggttcccaaagtgctaggattacaggcatgacccaccgtgcctggctAGttttttct
-tttttttttttttttagttttttttttagttttttcttttATGCATCTTTCACTCGGTTT
-TAAAACAAtttttactttttttttttttttttgagacagagtcttgctctgtcgcccagg
-ctgcaggggtgtgatcttggctcattgcaactcagcttcccaggttcaagcaattctctg
-cctcagcctcctgagtagctgggattacaagcgcccaccaccgcgcctggctaatttttt
-tgtatttttagtagagacagggtttcaccatcttggccaggctggtcttgagctcctgac
-cttgtgatccacttgccttggcctttccaagtgctgggattataggcgtgagccactgtg
-cctggctCttttttttttttttttaaagacacagggtcttgctctgttgcccaggctgga
-gtgtagtggcgtgatcatagctcactgcagcctccaactcctgggcttaggcctcctgag
-taggtaggattacaggcatacaccactatgctcagctaatATACATACTATTTTGAATTG
-TTTTCTTCACTTACATGAAAAAAAAAAAAAAAAAACCTCCAAATTGTTAGCCCATGGAGA
-CCATCTAATGTGTATCATTAGTATTTTATTACATAAATGTTTCAGAATTCAATCTTTAAT
-TTTCCTATAATAGGACAGTGTTCTGTTTTTCACAATTATTAGTAATACTGTAAAAACTAT
-TTTTATGCATAAAATGCTTTTTGAACTCAGGGCTATAGCCTTAAGACCCCAAGAAAGAAA
-TTCCTACAAGAACAAAAAGTCTGAAACTTTTAAAATCAACTGATAATAACCTGGAAAGAC
-TGGGCATAAAAGATACTCCCAAGAAAACTTCAGATTTTTAAACACTTGGCAAATCTATTA
-TTAATTTGGTTCCTTTCTCCTTTTTCTGTGAGGAGAAAGAAGGCTTTTTGGGGGAGCTGG
-GGAGAAGACCTTTTTATTTAGTATACAATTCAGAAGAACAAGAAAACATTCTTGAATTTA
-CTCTGAAGATTGGTTAAACTTAGTTACAGGATgggcatggtggctcatgcctgtaatctc
-agcactttggggagccaaggtgtgaggatgggttgtgcccaggagtttgagatcagcctg
-ggcaacatagtgagactttctctctacacacaaaaaaattaaaaattagctgggtgtggt
-agtgcacgcctgtagtcccagctactcaggaggctaagctggaaggatcacttgagccca
-gaagttcggggctgcagtcagctatgatcatggcattgcactccagcctgggcaacagag
-caaaaccctgcctcagaaaacaaacaaaaggccgggcgtggtggctcacgagggcaggag
-atcgagaccatcctggctaacacagtgaaacccagtctctactaaaaatacaagaaaaat
-tagctggggtggtggtgggtgcctgtagtcccagctacttgggaggctgaggcaggagaa
-aggtgtgaacctgggaggcggagcttgcagtgagccgagatcatgccactgcactgcagc
-ctgggcgacagagtgagactccgtctcaaaacaaaaacaaaaacaaaaacaaaaCAGCTT
-ACAATTCAAAACAGTTCTGGAACTGCTGATTATAGAACATATCTTTGGCTACTTTCCCTC
-AAGTCAGGATCAAATGCAAACCTATTCATATTCTACCGACATTATGACAATAAAAGTAAT
-GTAAGTCATGGTACATGAATTAAGGTGATTTATATTTTACATTTCATATAAAAAGGACAG
-CTGTGAATGTGCATTAAGTGGCCTACCTAAATGCACAAAATGATACTTTTTTTTTTTTGG
-TAAATTATGTGCGAAATAAACACAGGATCAAAACTGTGCCTGCCCTTCTGTTCTTACCTG
-ATAGTCTACAAGTAGCTCAGGACCTTTGAAGTATCGGGAAGCAACTCGGACATTATATTC
-TTGGCCAGGATGATAAAACTCAGCCAAACCCCAGTCTATTAGTCGTAGCTGAAAAAGAAT
-AAACCATGAGCAATCTTATCTTTCTCTAAGCTACCCACACTGTGCCATTAGCATACTCTT
-GAtaaaatataccagacacgtcactctttactgaaacccctccactgactacttatagcc
-tttagaatgaaaataaaacttcttagcttgacaaacctctttctccatgattttgttccT
-GGAAGACACAATCTCACCTGTGCTTTTACAAATTTCTTAAACTGCTCAATGACTAAAATG
-TCCCTACTACCCAGCCTATAATCCTATTGGTAAGCATTTCCTTAACTTTTGGAATATTTA
-AGTCAGCTTCTCAATGAAGTCTGATCATTGCCTTCAGCCCCCTGAATTTTAGATATATTT
-CTTTAACAGAACCTAAACTCTTTATGTTTTCTACCTTtctttttcaatatggacgacaag
-ctccttaggggtagggactgttttattcacctttgtaattttcagaattcaacataatgc
-ctggtatacaggagaaaaatgaataaatatttgctggatagatgaaATAACAGAAAAGTC
-ATACAATACAGCTTTTACCAAAATGCATCCTAAACATGGAAAAAGGGGTAAGAGGCAAGC
-TTATCTGCCCACTGTGCATAGCATGACCATGATCTGAAGTGCCAGCAGTAGGCCCTGAGG
-AAAAACATCGGACTGCTCTGGCACTAAGTTTACTGCCTGTATCTcaaaactaaacctttg
-attactccctgcaaaagcacctccactcagtctccccctgttcggttaaaggtgatactc
-atcctgtcatacaagccaaaacttaagattcaccctggattcttgattccctcagacctc
-acatttaatctgtcaaaaaattctgaaggttctatcatattgtgaccattatcatcacct
-ccactgccactgccccgatccaagccaccaccacctcttgtttgatatattgccatagcc
-ccttctcctaactggtctcactgctttcactcttgccctctagtctaAACAGtttaataa
-atactaaatagtttaatagttattttaaaaataattaaatatttaaaaataaatataaaC
-AGCTTTTTAAAAGGATTGTTCAGGTTGCTATGGAGAGattatagattcacaggaaattgc
-caaagtagtagagattctctgcaccctttacccagtttcccctaatagtaacatcttaca
-taactacagtacaatatcaaaatcaagaaactgacactggcacaattcagaaagatctta
-ttcaggtttcaccagttttacatgcacgcatgtgtttgtgtgtgtgtttctatgcaattt
-catcacatatgtaagttgatataatctcctcaacaagatatagaactgttccatcaccac
-acacatgtcctgtgtgttagcccaacccctggcaacccctctgctctttatctctatcat
-tttgagaatgctacaaaaatggagtcattggcatataactttttttgagactgccttttt
-tcactaagcatgagatccatccaagttgttgcatgtgtcatacttctttcctttttattg
-ctgagaaatactacttcataataatattatatggtatggatatgccagtttgtttaacca
-ttccctcattgaagggcacttttccccatttttttttttttttttttttgagacgcagtc
-tcgctctgtcacccaggctggagcacagtggcacgatctcggctcactgcaacctccgcc
-tccggggttcaagcaattctcctgcctcagcctcctgagtagctgggattacaggtgcat
-gccaccaggcccggctaatttttgtatttttttagtagagacagggtttcaccatgttgg
-ccaggctggtcttgaactcctgaactcgtcatctgcctgccttggcctcccaaaatgatt
-acaggtgtgagccactgcacccagcttttccccccaattttaagctattacaaatatagt
-tgcattcatatataggcttttgtgtggacctaagattttgttgctctgagataaatgcca
-ctgcaggattgtatggtaagcatatgtttagcttttcaagaaaccaaccaactataaaac
-aatagttaagcattttccaaaatgccaaactttgcattcctaccagcaatgtatgagaga
-tcaagtttcttcacatttttgccagcacttggtaccatcactattttttattttagctgt
-tctaataaatgtgtagtTAActtttaaatttcaagtgagaacatgctaaagcttagaata
-tgcaaaagctctctatcttcagagaaaaggcctaacaatgaccaataaggttttacatga
-tttggttttacctctttgatttcatttcctccttctttccccgcattcattctgtcccag
-ctttatccttgctgctgctcttccaacatgccaaacatatccttacctgaagggcttttg
-tacttgctatttactctgccttgggacatgtttcttcataagactgcatggctgggtccc
-tcccagtgctctctaaaatgtcacctttccaatgaaaccttcccttataactggtttaaa
-actgcaaataccctcttgccattccctattcgttttttcttctacatcaaaataactttc
-tatcccaccagcctccctaaatgtagctcctaaaagacaagcatttattgtatgttgagt
-tcacttacatatccccagccctagggtggtgcctctgacatggtgtgtgtctaaaagtaa
-ttcagttgcataaataaatCACCTGCCTCCCCAGAGACCACAACAGGCAAGTCATCACAG
-CTTGTCACCTTAAAAAACTGAAATGCTAAAGCATGTGGCCATTACAGCTCTCATGTAAAA
-GCATTTGCAGACAACAGGGCCCTTATGACATCCAATAAACAGAAACAGCATTTTCTGTAT
-ATCTCGTCCACTTAACTGTGCAcatttaattctcacgaatacctagtcgcctgcagggct
-attattacccacactgtacacgtaagaaaaagaaggcaaatggagagaaagtagtttCTC
-AGGAAACCAGTTACTCAATAAATAAGGCGAGAAGCCACGTTTCCGGGCTTAGAAGATGAA
-CATTTTGCCCACTTTACTCATGTTTCCTTCTTGGGAATATTCTTAGGAATATAAATAATG
-GTTCAAACATGTTGACTTGTAAATTCGTAcattcattcaccaaatatttctcaactgccg
-aataggtactagggcctgtgacaacacaagggataaagtgttgaaGATGGGCAATTAGCT
-ACATCATGTAGATAAATAACACTTGTCAGCCTATCACTTTACCTTTCTGTGCTCATGATC
-AATCATGACATTATGGGGCTTGACATCTCTGTGCATAATTCCCATGCTGTGACAATAATC
-CAGGGCCTGTGGGATGAACGGGTCAGAAAGGAGTTAGCCTGAATAATACGTAAGAGTCCT
-TTACTTTTCCCTCCATGTAAATTTTCCTTTTAGCCTCACAATACCCCTGGGATTCAAGCT
-GAGGACACAGTCACTTCCACAGCAATGCTTCAGAGACTTGTTCATGATCTCACAGTCAAG
-CAAACTCAGCTCTCTGAGCTTAGAGATCTTTTTCTGACACAGTTGTTTCAACATGTTTTC
-TGTCCTAAAAGACCCAAAGTATACCCAAATTGCACCACTTCAAATTTTTCTGTCTTGTCC
-AGATCCTAGATTATTTCCACAGACCCCTCAAAGAAAGAAAACAGATCTTTACTACAAACC
-TCTTATTCTAAGAACAGTAATTCTTTAGCCATTAAGAGTCTGTAAcagaggttggcagac
-cacaggccaaatttggcctgatgtctgcttttgtaaataatgttttattgcaacatagcc
-atgcctatttgtttgcatattgtttatggttgctcttgtgcaacaacagcagacttgaat
-agtgtgacaaacactacatggcccacaaagcctaaaatatttactatttggccctttaaa
-gaagtttgccaatgcctgATTTAGGTCATCAAATCCAATCTGAAATGTTTCCAACCTCAA
-ACTAAAGGGAACTGAGTAGTATAATCTTTGGGGTTTGTTAATCCCAGCCTTTCAGTCAGC
-CGACGTTGTTGGCCAAATTCTTGTCCTTCCTGAAGGGCAACTTGGGTTCCTACAGTTCCC
-AGGGCTGGGCAATCATATCTGTAACTTTCTAAAGCCTTGCTTGCCACAAACTGCATGAGC
-CAATGGAAAGATCAAGTATCTCTGCTGGCACAATCTCCTCAGGGGATTTCTAAGGCTCCA
-ACAGCAGGCTTTATGTCAACTCTTGTTTAGTAAGAAAGCTTAGCCAACTTTTAGCAATTC
-TCTCTTCTAGGAAGCTGATCTTGTGGCTACTGGGAACAAGATATTTGGTGACCCCACTTT
-AGAAATGTAAGTAAATTTTCAATTAGCATCTATAAGCAGAAATTTACACAATCCTTAGGA
-CAATTACCCTTTGAGAACTGAGTTAAAGTTTACTGTTTTATTTGCTGACTCTTAAGTGAG
-ATAAAGTATACCAGAAGCTAGCACGTCAGGTGTTTTCACGAGTTTTGAAAATTTAATATT
-AACTTACATAGGGGCCACAGAAATTACAAATATTTGTTAAGGGGTCAGTCCCAGCTATCT
-TACAAATACCCTTTTTCAAATTGTTCTAAATTATACTCCCACTAGACCCCATTCCATAAC
-CCTTAGCACAAGGGTTCTGATACTATTATTATTAAtttttatttatttatgtatttagag
-acagggtcttactctgtgctactgcactccagcctgtgcaacaatcatagctcactgctg
-cctcaaattcctgagatcctcctgtcacagcctcccaagtagctggaattacaagcataa
-gccaccatacccagctaatttttaaattttttgtagagacagggtctcactatgttgctc
-aggctggtcttgatctcctggcctcaagcaatcctcctgccttggcctcccaagtagctg
-ggacttacaggtgcacaccaccatgcccagGTAATTAAACAAtttttttttgtagagatg
-gggatctcactatgtcacccaggctggtcttttgatctcctggcctcaagcaatcctcct
-gcctcagccttccaaagtgctgggattacaggtatgaTACTATTAACTTATTAAAAACTT
-ATATAGAGGTCCCTTCTTTCAACATACTTTACAAAGTTAATCTGCTGGCTTTTCTACCAT
-CAATTGACTATTTAACAAAAAGAAGACCAATTTAAAAAATATTTAGTATTCAAGGTTCAC
-TTACCTTCAGAATCTCATACATGTAAAATCGAATATCATAGTCTGTTAACGTCTGGTACA
-ATTGCTGTTAAAGACAAATGTTTGAGCCATGAAATAATGCTGACAGAAAGGCATTTTTCA
-CCCTCACTCACAGTAATTCAAACCAAGACTTGGCTCATTTACCGTTGTTCCAAGATCTGT
-CCATTCACTGCCCTCTATTTCTCCAACATTACATTAACTTTAAAGAGATACTTTGGGTCT
-TCAACTCTTAAAAATGAAGAATTACTTAAACATATATTGCGGAAGCTATAATCCACTGTC
-AGAAACATACTGATCTAGATACGTTAATATGCACTGACACCCACCTATAATTTAGTTTGC
-TTTTCATGTATCTTCAGACCTTCTCAAAAGAGGCATTTTGGCAAATATACTGCCTCCTTA
-GTAGGGAACTAACTCATCTTTGCCTTACATAGTTGGCCCTGCAGATCACCAGTGGGTATG
-CAGATGGCATGATACCAAACCTGTTGAGTCAATTTAACAAAACTATTCTTGTTCCAATTG
-GAAAGTAAACTCTGAACAACTGTTATGTATCCTTTCCAGTTTCCAAAGAGTTGCAGAATG
-TTTTTTACATGGACATATCttttttttttttttttttttttgagacagggtcctcactct
-gctgcccaggctggagtgccgtgctgcaatcataactcactgcaacctcaaactcctggg
-ctcaagcgatcctcctacctcagcttccccagtagctaggactacaggcgaaagccacca
-tgcccagcCACAGGTACGTCTCTTTAATGGTTAGCAACGTCTTCTGACAAAGTTTTTCTT
-GAAATTATCATTCTGACTCTAAAGCAGTTCCTCTTCCTTTCTCCCTATCTCTGCAACAGA
-ATTCACTAATTTATTAATATATAACATTCTGGATACTGGACTGGTGGAAAGGCAAATCGA
-AGATTTTTACTTTTACTCCAAAAGAGTAGCTATATTCTTCTGTAAAATTGGAACTGTGTG
-AAATAAGTAGGCCACTGGATAGACTGGAATTCTGAGATATCTCTTATAGAGGTTTGTGTT
-ATGGCAGAATTTGACATTATCCTTCCTCGATCCCTGCCTTTTAAGATCTATAGCCCACAG
-TTTATGAGGAATCCTAAGAAATAAGCAGTCCCTACTTTTATACATACAATATATTTCTTC
-CTGAACACTATTGTTTAAAGCGAATTGCCATATGGCCAGATCCTAAGTGAACGTGTGTTA
-CTGCCTTCATTAGGTTGGACATCAGCAGAAACTGTCAACTAAGTAGTGAGAAGTCAATGT
-GTTGGTCATTAAAAAGAACATTAAACAAATGGGCAAAATATCAAGATGCAGAAAGTGGGC
-ACTGCTTATATAGGAGTTCTTCTATCTTAAAATTTGCACTGTAAGGATGAAAAGCTTTTT
-AAAAACAAATGCGAAGCAAGCTCTTCTAACAGCATCATCCCCAAAGGCTATGTGGTCTAA
-AAACCCACTAGCCCGAAACAGTTGGTTATATATTATACCTTGAAGTCTGTGTTGTTTACG
-TGTTCAAAAACCAAGGCGGGGGTTCGTGACTAGGGGAAAAGAACAAAAACAAAAACACAC
-ATTAGCAATAGCCCTGACAGCTTTAATGGGGACAATGTTTGCGGATGCTGCGTGGTGAAA
-TTTGGCAGTCCTCGCCTCAGTAGTAAGAAACCCTCTATTGCTACAAGCCCTCCCCGCTCT
-GATCATCACCGCACTTAGGTCATTTTTGGGATGGATTTCAAACAGAAGACATGGAGCTGA
-AGTCTCACCAGGCTCTAGGCAGCCCGACAATGCGCCCATCGCCCATCGGCATCGGACCTG
-AGTTTGCAAAATGGATTAACACATTTCAGTTTCCAGTGCTATCAGTCTCTTAGCCTAGAA
-GAATAAGAAATAGTCTGTGGGTGGAGGTCTCTTTGAAAGAAAGACCCAAGCTAGTTAAAT
-GGTATATCTGATTAAGCACTTTCAAAGCAGGACTTAATGATGAGGGTTGGGGGAGGGAAC
-AAAAAGAGGCCAGTTGTGCTCCAGGTCAAACACCATCTCAGCTCTGGCGGGCCTTGCTAA
-CACCTACTATACTCACCACAGGGTCTTTTACAATGTCTGCCAGTGTGATGATGTTGGGAC
-CTCCTCTCAAATTCTCCAAAATCTTTATTTCACGCTTAATTTTCTTCTTTTTTACTGGCT
-GAAAGGGGAAAAGTACATCAGCaaaaaaaaaaaaaaaaaattttttCAGAGTATTTCAAC
-ACGTAGTGTAATACATAAATGATAAATGGCTTACTtatgagcacaccttgaaggaagaaa
-atgtgtcacattcgtctctgaatccttctcctagcactgtgccaggtattctgcaggtac
-ttacaaatgttgaattgaaagaaAAAAAGATTTCTATTCCAAAGACCAGACACTTCTGCA
-GAATTAGCATTTCAATCATCAGTCTTGATGTTAATGTTTTAAAACATGTTAAACATGTTA
-ATGTCTTAAAACCTTACAAAGTAGCAATTTAAATCGTTAGTAATACTAAAGTATATCAAA
-CTTTTTATCAATTAGGATGAAACATGGGCCCTTTCCATTTCTTCCTCTAATTAGGGCCAA
-CAACAAGGATGGCCAAAACATCTTTGTgtagcacaaccctgagggtaaagggtgagtctt
-ggagtcacaatgcccaatgtgaaacctacctttactacctgctggctgttaatggcaaac
-tacataacctctctaagcctttcattaagtgtaaaatgagtaacaagagtacccatctca
-taagattgttgcaagaatcaaatgaggtaTTCGAAAGATTTCGGAATATGGCTGAAACAT
-AACATAATAATAACTGTCTAGCCTGATCACCAATGCTCtttttttttttttttttttttt
-gagacagagtcttgctctgtcacccaggctggagtgcagtggtgcaatcttggctcactg
-caacctccgcctcctgggttcacgccattctcttgcctcagcctcccgagtagctgggac
-tacaggcacccgccaccaggccaggctaatttttgtatttttagtagagacggggtttca
-ccgtgttagccaggatggtctcgatctcctgacctcgtgatctgcctgcctcggcctccc
-aaagtgcCAATACTCTTATAAATGAACCCCTCCATTCTAAAGAGTATTCTGCAGAGCATA
-TCTTAAACATTCCTTTGTCCTTACCCATTCTTTCCACATCTGTTCTAGTATGGAATCCTT
-TTCATTTTTTTCTGAGGAGGGCCTTGGTCCCACTGCACCTCCTTTATAAAGCCttttttt
-ttttttgagacagagtcttgctctgtcgcccaggctggagtgtagtagcatgatctcagc
-tcactgcaacttccgcctcccgggttcaagcaattctcctgcctcagcctcccgagtagc
-tgggattacaggcgccagccaccatgcccagctaatttttgtatttttagtagagacagg
-gtttcatcatgttggtcaggatcgtctcgaactcctgacctcatgatccgcctgccttgg
-ccttccaaagtgctgggattataggcatgagccactgtgcctggGCTTATATTATAAAGC
-CTTCTCCTGAATAGTCTAAAAcagtgctggcccaaaggaaatataatacaaaccacatgt
-gtaattttaaatgtgttagtagccacatcaagaaaattttaaaaaggacaaaattaatgt
-actttattaatctaaaatcttaacatataaatcaatataaaaattattaatctattttac
-ctttttttgtattaaacccttgaaatctaatgtattttactcttacagcatatctcaatt
-cagcccagccatatttcaagtgcttaacagcctcatgtggcctgcgtgcctgctgtactg
-gactgtgcagGTCTTTTCCTAGGGTGTTGGTCACCTCAGACTAGATGCACTGCATATAAC
-TCTTAGAAGTTAAGTACATCTCATCTCTTCATTAACAAGATTGgtggttactaaagtttg
-atgaccaacaatcacctggatttttttaatatacagactcacagaacccaccaagattca
-ctaaatcaaaatcttgagagggaaacgggggatttatttttagatactttccaggctgat
-GATCCAGGTCCAGAAACTACCAAATAATACTATAAATTCTTTTAACTTTGTCTTAAGCCT
-CAAGCACATGATAGCAGAAAGCAAGCAGATTTTGGAAACATTGACAGTTCTCAAAACCTG
-GCTTTGTGGTTGTGCAGTGTTCAGAAAAGCATTTAAATGTTTCTCACTGCTGAAAGGGAC
-TATACTCGCCTGTTAGTGATTTACATACCACAGTTAGAACAGGTCCAATGCAAAGTGGTA
-CCCAATAAACAGAAGCTATTTTACTAATGACTTCCATGTAGTCCATTGAATTCAACCCAC
-GACCTCTTACCCAATACAATATCTACCTAAGAAACAAGATAATATAAGTCTTCTCTTCCT
-GCTTCAACTATTCAGATCTTTATAAACTGTTATATTATCTGGGAGATCTTTCCACCCTGC
-AGAGACTAACCCAACAACTTACCTCCTGTTTTCCATTAACCCAACTGCTGGTTTTTTAGT
-GGAAAAAAAAAGCTTCTGGTTGACAAAACTACTCTACAGAATGCTTCAAATCTATAAACT
-TAAAAAGCTGGTTTGTGACAGACCAGGCAGCTGACTCAGGCCCGAATTTAATGCGATCAA
-TGCAACTTTTGTCTTATTAAATAGGGGAGATTAAAAATTTTAAATATGGTTTACAAAGGA
-AATTCATCTATACTTACACCACCTACCCACAGTTACAGTAAAATATACAATACAGTTAGA
-AAGACTGAGCTGAAAAAAATCTTTCTAAATCACCCTTCATTCAAAATCATCAAGGGCTCA
-CAATTACCTAGAAGAGATAGTCATATAATTTTAAGACTGCAAGGAAATGCAGAGATTATT
-TTTTCCAGGCCTTCGCCAACTTAATCTCTCTTTCCAAGTTCAACTCCTATGTATGGTCAC
-ATAACATCTTTCACATGAAATATTTCTCTCACTTTTCCCTCCTCCTCTTTTCTTATCTTG
-GTGCACTCTACAGCCTGCTTCCCTTCACCACTTCCACCCAACACCTATCCAAATCCTCCT
-CCCATTCAGCCTGAAGACAGCTCCTGGGAGCTTTTCCTAACTACTACCCTCTTCTGAACT
-GTAGACCCACTATGCATGCTTTTCATGTGGCTCTAAATAATAATATATCACCTCATTCTA
-TCATATACCTTTCCATATGAATATCACCATACAATCACAAAGAACTCCAGTCTCCAACGT
-ATGTATATATACACACAATTTTGTGTTTGATCCtttttgttttttgagacagggtctcat
-tctcatcgcccaggctggagtgcagtggtttgatcatagatccgtgcaaccttcaacttc
-caggctcaagcgatcctcccactttagcccctcgaggacctgcgactaaaggcacatgcc
-accatgctcagccaaCATTCTTTTTAATAGATGGATAAACATGTCCTAGGTTAAAAGGAC
-TACTATGGCTAGTCACCCACATGTTTTGATTTCCAACCTAGTTCTCTTTCTACATATTTC
-AAGACAGATATAAATACTTAAACTCTCTGGTTCTCAAAGGGCATGTgaagcaccccagca
-atgcacaggaatactgtggaacactttacatttttgaggaagacacatcaacccatcgtt
-gaatctgccagacactgggtgcactgccagcttgaggtggttcgtagtttcaacattaga
-ttgtgttacactcctcgtgatggattgtgttatactcctcgcgatggcatatttttgtga
-agctgggtttgcagtagttgctgtggtaaaaagcaagtactgcacaaaaatcaatgacag
-gaaatgagggtggtggtgtccaaccaatgacaacatttgaaaagctatgcagcaacaggt
-ctacataacccaacagtaacaaattatagttatataagaacaaatttaacttttttcttt
-taatttatgtgaataactttttaaatggctaccaagttgctaagatataaatacttagcg
-ggcaggcgcagtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcggat
-cacctgaggtcaggagtttgagaccagcctgaccaatatggtgaaaccccgtctctatta
-aaattacaaaaattagccgggcattgctggcgtgcatctgtagtcccagctacttgggag
-gctaaggcaggagaatcgcttgaacccaggaggcggaggttgcagtgagccgagatcgcg
-ccactgcactccagcctgggcgacagagcgagactccttctcaaaacaaaaacaaaaaca
-ataaaaaaaacaaaacttacttagctatttggaccttgctacttaatacagagaactatg
-aggtatttcttgacttaggagtaccgtgaaaaattaaagacagtataagtgttataaatt
-gagaaagtttggaaacttctACTTTTCAGTGTCAAATATGAAAAAGTTCCTGTGGTAAGG
-AACTATATGCTAAGTTCCCAATATATGACAGTGCACAGCATAGTTATAACTAAATTAAAA
-GTTGTATATTGGTCTCCCAGAGGCCAAATCtggcctgtgcattgtttttttaaaatcttg
-agccaacacttaaaagtcaggaaaattcatatacaaatataaatttctggcttttatttg
-caaaacagagtatcaagcaacaatggacttgcattactgcagggcaatcatcagcttcag
-ctgagaagcagctaactccttttgaagaggcatgtgtttcccagtttgtttcagtcccta
-ccactcacatcacCTAAGCAAGGGCAATTACACCCGACTAGCTGCACTAATATCATCTGT
-CTGTCCCCCTCGAGTCCTGTGACTCCTCATCTTTACAAAGTAGAGGCAATGATTTATTTA
-TTGAAAACAAAAGCCTCATTATATAATGAAAAGTAAAGGAAATAAGTATTAGgcaataac
-tgggagagaagagactgtacctttgctcccttactctgccacaacctagctatatgagtc
-aactcaaatcacttctcttgcttcagtttcccgatctgtcaaataagcagaacttgttct
-attgagttcataggatACAATAAAATTTTATTTATTTGCTTTGGCACCAAAAACCTTTTA
-AATGCTGTTTTAAAAAAGTCTTCAAAACTACTTTTAAAAATCTATATTCCAAATACCTCT
-GAAATTATCTCTTGTACTCACCTTGAGAATTTTAACAACAACTTTTTCATTATTTGTGAT
-GTTGATGGCTTCAAATACTTCACTGTATTTACCTCGGCCTAATTTTCGAACCAGCTGGTA
-GTCATCTTGATTTCTGTGGACACAAACAAAATGACTTATAAACGGTCAAATTATCAGCAT
-CAATTCAAATTACAGGAATCTATTACCAGCAGCTGTAATAGAAATAAGAAGTATTTCAAA
-CAATTCCCAAATAGGtttttttttttttttttttttttttggagatggagtctcactctg
-tcgcccaggctagagtgcagtggcgcgatctctgctgactgccagctccacctcccgggt
-tcacaccattctcctgcctcagcctcccgagcagctgggaccacaggcgcctgccaccat
-gcccggctaattttttgaatttttagtagagacggcgggtcctcaccgtgttaaccagga
-tggtctcgatctcctgacctcgtgattcgtccgcctcggcctcccaaagtgctgggatta
-caggcgtgagccaccgcgcctggccCATTGtattttttttttttttaaattaGGCCAATT
-AAAATACGTGTGTTTCAAATCCTAGAATTAGAAAAACTTATACCTTTCAATTATTCTTTC
-TAATCCCAAACTGTTTACATCTTTATTGGCACATGACATGGAGCTGGCTTGTATTAAGGT
-TTGTTCTAAATACGTTTGTCTCCAACAAGAGACAGCTTTCCCCAAGAGAATAAttttttt
-ttttttttttttttttgagacggagtcttgctctgtcgcccaggctggagtgcagtggcg
-tgatctcggctcgctgcaagccccgcctcccaggttcacgccattctcctgcctcagcct
-cccctagtagctgggactacaggcgcccaccaccacgcccggctaatttttttgtatttt
-tagtaaagacggggtttcaccgtgttagccaggatggtctcgatctcctgaccttgtgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgcacccggccG
-GAGAATAATTTTTATATATTCTTGTCCCTTAGTGCTTGGTCCAGTGTTGGCACTTAGCAG
-GAACTAAAAACATTTTGCAAGACTGTTTCAATCTAGCCACACTTTGGCAGCAGCTGATTT
-TTAACAGGCCTCTTTGAAGGTAAATGGCTTTCAAATGTATAGGCTTAATCTATTTGCCCT
-CCAGGGCAAGCTCTGGGGATAGTCCATGCGTAGTACGAAGCACATTATAGATTGTAAACT
-ATAATCAGCGATCCCCTCCTCTACATATACCCATATTCTGTGACCAATAAGCAACATCAG
-AGGTAATAAACAGAGGTAGAATAAGGGAAATGCCAACATTTTCCTCCTGCCCCTGCCTGC
-TTCCAATGTAGAGCGCTTTGCTCTGAAGAATGACAAACACAGTTCCAATAAGGCCTAAAT
-TCTATCCTACTGGATAGAATCCTCTGGACCTACTAAGTATCCAATATGAACCAAATCAAC
-CACCTCAACCATTCATTTTCCTCAAGTAGCTAAAAAGAAAGTGAATGAAAAGACAAAAGG
-TACTAAAAACAATGGACAACATAATAATCATGGCAGGTGTAGGGGAAGAATGCTCCTACT
-TCTGGTTGAGTTCTCTTCCTATGGGAGGGCATACAAAACAAATGCCAGCAAGCAAACAGA
-ACCATGCCAAAAGCCCAAAAGGGCTCTTTAGTGCCATTTAAGCAGAACCAAGTGCAAAGC
-ACTCAATTTGAAGATAGCGGCTGAAATTCCTATAGTAAACACAGTGTCACCTAGAGTCCA
-AAGCCTGTGACATAAGAGGAGAATTGTTAGATTATCAGTAATAACAACATTTATTGGTAC
-TAAACCACACTGGCATTTAATGGTGTCTTTACAGCATACAGTGCCTCTGTATTCAGAGGC
-AATGTATTTACTGTTAAGAATCATGGCATACTCaaattagctgggtagggtggaaggtgc
-ctgtaatcccagctactcgagaggctgaggtgggagaatcacgtgaacccaggaggcgga
-ggctgcagtgagccgagatcacaccactgcactgcagccagggcaacagagcaagactcA
-TTTCCACACACACACATACACAAATTCATGGCATACTCAAGATTAAAAATACGCCCTATG
-ACAATTTAGGGAAGCCATCCACTAACCACTTACAGGTTACAGAAATCACATGCAGTCAGA
-TATAAAATACAGCATACAGGAGCTGTAGCTTTAGTTTTCAAATTGCTTTCTTTTGCACTT
-GAATGTCAAAATGCTTTTATCACAAAAGTATGATCTGAACAATTAAATGTCTACCACATT
-GGGACAGGAAATGCAAACATCCAAATGAGTCTGCACAGAGAATTAGGAGGGCAAACACAG
-CTGTTCAGGCAGACTACAACTGTTCAAGATAGAATTTGGGCTGAATTCCATGCTAAGACA
-TGCCTAGTCTCAGGATAAGGGCAAATGTTTAAGAATTTAATTGTTTCTCATCAGAAAGAA
-GTTACCTCTTTGGAGAACTGTTTCGTCCTCCTGTATTAACACGAAACAACATTCTCTACC
-TCAAAAATACTTTATATAAGACTTTGGTGTTTTCAAAGTCTCTCAAGTATCACTTCTCAC
-TGATCTGCAATGCCCTTGGCTTGATAAGCAAGCTGATAGGTAACTTTTTGTTGCCAGGTG
-CCCATACAGAATACCgtcatgcgttatttaatgacattctgagaaatgtgttaaacatca
-gagtgtttacacaaacctacatggtatggcatattacatacctagggtatggcctacggc
-tcctaggatacaaatgtgtaccgtaataaatactttaggcaattgtaacacaatggtatt
-tgtgtatctaaacgtagaaaaggtaatgaatgcactgttgatgttacgatgacatcacta
-ggccacagacatttttcagctctcttataatcttatggaaccactgtcctacatgtggtc
-tgtcattaattcaaactttgttatgtggtgcacgactgCATATACATCATAGAAAAGGAT
-AAGAAACTAAAATGATTTTTAAATGGTAAGCCCATTAAAATTGTTCACTTGCCAAAGCAA
-CTCTGCTTCCTCACTGCAAAACCAAATTTTCAGCTCAAAAGAAAACACAAATTGGGCTTT
-GATCCTGAGGTATACACATACAGAGTCACGGAGGTTTTCTGACAAAAACTACTCAACAGA
-TCCACAAGATTCAGCCCTTTGAGTGAGTATAATGAAGTCAACAAAAACAATTACCCCCAT
-TCCACCACATGTGACTCGTAATCCCAGTATTCTCGAGGTCTGTGTGTATTAACATCTGTG
-TAAACTCTGGCCCTGCTTGGCACGGGTCCCGACATGTCAGACAGGTTGGCGGACAAAGCT
-GGACTTGATGTTTGGAGATCTGGCAGTCACTGTGTTCAGAAGCAGCTGGGGGTAAGACCT
-TGTTTCAGACCTGTTTTCTTCAAACTGCAGAAACAAAATGCACAAAGTCCAAGGAATCAT
-TTACAGAAGGTATATGGGAAGGAAATAATCTTACAAATAATAATGGCCTGAAATATACCT
-CTGGCTCTCCTACCTACAGCCAATAAATATAGCTCAACTGTGTTAACCAGTGCTTCCTAT
-AACATGAGAAGAAAAATCCCAAGAAATACAGTAAACTGATATTTGCTTTAATCATATTTT
-GCCAAATATCCTGTTACCTCTGCAGGCAAAATTTGAATGATTTTTGTAAGACAGCCTGGA
-AGAGAAAAATGGCATTGAGGATAGATACATCAGCATTACCACTAGTTATATATTCTACAA
-AAGGTATTGGCAAGAAAAATACTTTCTTTTCAGCAGCTTTCTGTAACTTAAGTAGGGGTG
-CTAAAAGGTTCTAGAATGGCGGCAAAGCTAAGAGTACAACTTGCCATTCTGACTCATATT
-TGATGAAACCAGGAAGAGAATAAAGGCTTGTTCTCATACATCAAAGCTCCATGTCATCTT
-ATACCAATCCAAATCTTTTGGGGGAACCTTAAGGTAATAATCAGTAGAACCTTGATCACC
-ATTTGAAAGACACACTTGGTTTCATTAAATTTAAAAACAGAAATCAGTAATATTCTCTTT
-ATATTTAATACAGGAGCTTAAAAACTGGTATAAAACAGTAATACAGATTAGCTGAGCTAA
-TGCAAAATTTGACACCGGGGGAAAATAAGTAAGATGTTAGAAATATGCTATCAAATCAGG
-TTCCTTTCCAATGATGTCTTCCCTATCTCCTACAGCATGTGCTGATTCCCCTCATTATGC
-ATTTAGATGAAATTGTATTGAGTCTCCAGATTGTGATAACGTGAGAAGGATATAACACGT
-ATGCAAGTCTCCTGGCTGAGACAGCATAACTTCAATTTGTATGTGTGTATGTGttttaag
-acagggtcttattccactgcccagactggaatgcagtggtgtgatcatggctcactgaag
-cctcaacttcctggactccggtgattctttcacctcagcctcccaggtagctgagactac
-aggcacgcaccaccaccctcagctaattttctgtattttcagtagagacggtgtttcacc
-atgttgcccaggctggtcttgaactcccaggctcaagcaatcctcccacctcagcctccc
-aaagtgctgagatcacagatgtgagccaccgcacccagccATAACTTCAATTCAATTACC
-AGGAAACATTCAGAAAAAGAGGAAGTGTCTATTTAAAAAGGGGGAAGGGGTACTATACTT
-CTAAAACATGTCCACAGCATAAAAGACAAATGGAGGCTAAAGAGACATTGCATAAATGCA
-ATACTCTAGACTGTATCCCATACTGCAGGAGGTGGAGGGGGAtgctataaaaaacaatat
-cgacagaactggaattcagagggtattaaattattgtatcaatgtaaatttgtgaagttg
-gtacataatcacaatagttaagagaatatacctattcttttttttttttttttgagatgg
-agtttcgctcttgttgctcaggctggagtgcaatggcgtgatcttggctcaccacaacct
-ctgccgcctcccaggttcatgtgattctcctgcctcagcctcccgagtagctgggattac
-aggcatgcgccaccatgcctggctaattttgtatttttagtagagatagggtttctctat
-gttggtcaggctggtctcaaactcccgacctcaggtgatccgccctcctcggcctcccaa
-agtgctaggattacaggcgtgagccacctcgcccagcccaagaatatgtctattgttaag
-aaattttcctgaagtaattagaagtaaacagccatgatgcatataatctaccctaaaatg
-attcaggaaaaaaatgtgcccacacgtttacatgtgtatatatatagcacacatgactgc
-acactcacaaatgataaaacaagctgggtaaaatattacaataggtaaacgtgcgtaaag
-ggaatagagatgccctttgtactatttttatttactttttgttgaaatcttcttatttga
-aacaaggtctccctctgtaggccaggctagagtacagtggtctgatcacagctcactgca
-gccttgacctcccaggctcaatcaatcctcccacctctgcctcccaagtagttgggacca
-caggcgtgggctaccacagctggctaattaaataaattttttttttgtaaagatggggtt
-tccctatgttgcccaggctggtctcaaactcctgggttcaagtgatgctcccaccacagc
-ctcccaaagtactgtgattataggagtgatccaccatacccagctTGTTGAAACACtttt
-ttaaattgtggtaaaatatacataacataaactttatggccaggcacagtggctcacttt
-gggaggcttaagagggtggatcgcttgaacccaggagttcgcaaccagtctgggcaacat
-ggtaaaaccccatctctactgaaaatacaaaaaattagccaggtgtgatggtgtctgcct
-gcagtcccagctacttgggaggctgaggcaggagaatcaccagagaccaggaagtcgagg
-ctacagtgagctgtgattgcaccactgcactccagcctgggtgacaggagagagacctca
-tctaaaaaaaataaaaactgccattttatccacatttaaacctaaagctcagttgcatta
-agtatattcacattcttgtgcagtaatcaccagatcatccatttctacaaatttttacca
-tcccaaatgaaaactatgtatccactaaacactaattttccctcccccaactctttgcaa
-ccactattctattttctgcctgagctggctattctaggaacctcatataagtggaatcag
-acaatatttgtcctttgttttgtttatttaatttagcataatgtcttcaaggctgatcca
-tgttgtagcatgtgttagaattccaatccttttaaaggctgaatgatattgcactgtgta
-tatatatacacacacacacacacacacacacacaccacattttgcttatccatttatctg
-ctgatggacacttgagttgcttccacagcttggctattgtaaataatgctgctatgaaca
-taggtgtacaaacatctgtttgagacctcgctttcaaatcttttatgtatatatccagaa
-gtggaactgctgaaccatgtagtaattctatgttaattttttgaagaaccagcatattgt
-ttcaacaagctgggcacggtggctcactcctatacagcaactgtatcattttacactccc
-aggaacagtgcaaaggctacaacttctctacatccttactaacacttgttattttctgtt
-ttttGCTTGtttttatagagacaggggtcttgcttatgcccaggctggtcttgagctcct
-ggcctcaagggatcctcccacctcggcctcccaaagtgctCTCAAAATAGACTGTGCCTG
-GCCTATTTTTTGGTTTTCTTTTCTTCTTCTTCTTttttttttttcagtaacagccctcct
-aatgagtatgaagttgtatctcattgactgtgattttaatttgcatttccctaatgatta
-atgatgttgagcatctttttacatgcttattggccatttgtatatttgttttggagaatg
-tctattcaaagctgttgtccattttttgattgggttgttttgtttgttGACGATGCATTT
-GTTAACTATACTGTTTTTTTGTTGCTTACAAGCTGCTCATCTTTCCAAGGTAAGCTGTAA
-CTTAGCTACCACACCCAAAGAGAAGCCAGAAGAGATACCTCCTTATGCCCATGGTGTCGG
-CAGCTAAAGGCTTTCAGAAGAATAGCAAGACTGGGATGGAGATTAATTCTCTATTCCTTA
-ACCGTGACAAACACAATTAATGACATTCCACTCCAAATATATGAGATCAAAAGATTCACA
-TGCTGACTTATGAATTCTCCCACCCAAAAAACTGCTGTAACTTGCCTCTGTTCAACTCAA
-ACCTTCTGAGGTTCCATAAATGTACTAAATGACCAGAAAACAACAAAGTAATTCAAGTAC
-CAAAAGTCTTTAAAATTATTTCTATTTCTTTGATTTTGTAAAACCTGGGTGACATTAATC
-TATCTTCACTTAATATCAGTTAAAACTGTAAACGCACACACACACAAACACATCAAACAT
-GCAAAAACCAGATGTTTTCTTGTAATTTTTCTTCTTCCCAAAGAAATAAGGTCATCTATG
-TTGTAGGATTGGTGACTCTGTGACTACTATGCCTGCCTTGACAGCAATGAAAGACACTAG
-GAAAACCGTAGAGAAAGGTGTAGGTGTGAATATGGCCAAAATAGTAGAAACAGCAGCATG
-AACCCAACAGAAATGCTGTCCCCAGAAATTTATTACTTTTAATATACTAAACTTTTAAAT
-TCTCAGCCTCTCCTCTGACAGGAAACAGTATCTTTCTCTACATAACCTTTACAGCCACTT
-TACTCTTCTGGTTAACATTTTATACGTGTAAGACAGCCTTCGTCTGTGGATCTCAAAGCC
-CTTTTCCTATGCTTAAAAGTGATCTCTCTGTTGGGCTTTTCCCAGCTTTGGTTCATCACT
-TATAAAACCTGTCTAACTGTGCTTGCAGACTGAAGGGAAGATGAAGTGAGATGATCTTCC
-AGAAAGGGCTTAGAAACATGAAATGCATGTAAATTTGTATTAAGTAATTACTATCCCCTA
-GCTCCTTAGTGAAAGCTAATAAGCAGAAACCTATCTTTACAGGCTGGAACCTTCATTCTT
-TAAAATACAAAAATTATAGTAGCCGTGGTTAATTCCCGGCCACTGAGGGCTAACTCCCAA
-GTATACATGACATTACAAAATGAGTCCTCATTTCTCCCTGGAAACCATCTGACATATGGA
-GAATAGCCAACTCCTATTACTAGTCATGTACATTCTCATCACCCAGTCTTCTTCTGCTGT
-TTCAAGGCCCTGGCATCCTCTGTGAGGAGTGGGAAAAGACTAATAACTAATGAAACTCTT
-GAGATTCTCCAGTACTTGTCTGAATGACCCTTGAAGCTTTGGGGCTCATCAACTGGGACC
-TAATTTATGAACTAGCAGATCTGATTCTCCACTGGGAAGACAACAAGCTAACTATTTTTG
-CAGTACCCCCAAAGAGGTGCTTCACCTTACTGTCACGCATACCAAATAATCTGCTTATAG
-TAAGAAAGGTATTCACATGAATTTCAAATGGCTGGCCTTCATTAATTATACGGGAAAATA
-AAACAGAGGATTCTTCAACTGTGACTCTGTAATCTCAGATAGATAAAAGGGTACTAAGAG
-ATTGGGGGTTAAGGGATGGTGATAAAAAGGGGATGTGAagcccagtgtggtggctcatac
-ctataatcccagcactctggcaggatcacttgagcccaggagtttgagaccaccctgggc
-aacacagcgagacctcctctctacaaataacataaaaatgagctgggtgtagtggagtac
-aactgtggtcccaggtacttggtaggctgagatggaaggatcacttgagcctgggaggtc
-aaggttgcagtgagccatgatctcaccactgcactccaacctgggtgacagagcaagacc
-ctgtctcaaaaacaaacaaacaaacaaacaaaaaacaaaAACAAGAGGGGATGTGAAAAG
-ACAGAAAAGGGAGGTCAAAGACCAAATATTATCATTATTATTTTTTTGAGACAGgagaca
-gggtcttgcgctgtcacccaggctggagtgcagtggtgcaatctcgctcggctcactgaa
-acctccacctcatctcctgggcttgagcaatcctcccacctcagcctcctgagtagttgg
-gactatagctatgcgccatcaggcccagctaatatttgtattttttgtagagacaaggtt
-ttgtcatgatgcccaggctggtctcaaactcctggactcaagtgatccaccagcctcagc
-ctcccgaagtgctgagattacaggtgtgagccaccatgcccaaccAAGATAAACATTATC
-TTATTTAGAAATAGTATTTCACTTATACCTCTGCAAATGCATATGTATATCACATGTAAG
-CTAACAGGAAGAAAACACACAGCCTACATTTCTCAATTTTTGGTTTGATTCTTCCCTACA
-TTCCTGATTTTGTCCATCCCTTAAATAGAtaaccatctactatgaaaaagtactatccta
-ggccttaggaatataagtgagcaaggcagaACAGGGGTGAGACAAgtatgccattgaaga
-ttttacctatggactaagggtaacagaaattcattgaaaagttttaagcagaaaagtgac
-ccatacatattgtttttaaaatttttactctggctgagtgtgggacaggacttagggaga
-aggctgttaacagtagcacacgtgagagaaatgatgacctaaggtggtggcatgtggaga
-tcagtggactaatatgaggaacaaaatttatggtgtaaaatcaatagctctgagtgaact
-ggaaaatgctgtatgaagtgggaggtgactcttggatttcttgcttgacagactgttggt
-gccattcatggagataagagtgcacaagataggttttggacttaaggttaaaatggcttt
-gaatcattcaaacgaagattctgaataggcagttagatattacaagtctggaactaagag
-tttctcagctttaagtatctaactcttccaacaactctacgaggcaagcattagtttctc
-taatctacaaataagaacagcctaagttcagtagcttgaccaagaatatccaatacagtt
-acagctgggattcaaagacagtgagttggcctccaaggttcaagtcttctcactCCTACA
-GAACACAATCACTTTCTACTGCACATTCACACACACACACACCAGTCTTCAAATCTTAAT
-ttctcaattggaccctaagttctacaaagttaagaaccatgtttaatttacctttttaat
-ttatagtacctagcctaaggcttgcattttgtagcacgttcagtaaacactatttggtga
-tcaaattaatCTTGGTTTATTTTTTAAAAATGAAATGAAAATGAAGTTGCATCCAAAGTA
-TAGGGTGTTCCTAAATACTTCAGGTCATCTGGTACGCAACTAGGAGAACTGGAAAACCAA
-GTCAAAGGTTCTTGAGTAATTGTTCCCTTCCCTCTCTCTCTTTCCCAATACTACAGCTTC
-TATTAAATCACAGGACTACAACTAGGATTTGTCTTTTTCCCCTCGATAATTCAAATTAAG
-AGAATACTGAAGAAACTTGATTTTACCAATTTTTATAGCAGCTTATTTGGAAGATGGAAA
-AAGTGCCTGAGTCCTAGATATTTGGAAGATCAATTCTCCTCTCCACTGTTCATAATACTA
-GTATATCTTAAGGCAATCTAACAAAATGCACTGCCTTTCTTATTAAGTTCCATTTTAAAT
-TGTCTTACTTAGTGCTTACTGTTCTCATGTAATTGCATAAAAGGAGGTGTAACTTTAGTG
-GCTAACCATTTCAGACCACTACATCTACCTTAACACCGTCAGAATGACTTTGAAGACATG
-GCTAGGTCTTGTATGCTCAACGTTTAGCCTAACAGAAGCCAATTAATCAGCTACGAAAAA
-AGTATCATGTCAATGAATTTTTCCCGACTGAAGTAAGATCACATCGAAGCCAACTGCATG
-GGTCTGCATGACCTATTCTTTAATAAAGTATAAGTAAATAAAAAGAAAATGCCATTAAAC
-CATAAGGAAAAATTGTCCATTGCCAAAATCATAAGTTTACTGATATACACTGAATACAGC
-AGAATTAATTTCAATAAAAACTCCTCTTGCCCTTAGCTAGTCCCTCCTTCTAATCTCTTA
-TGTTCAGTTGTTATTTTTCAATTTGGCAACTAAAAAGAAAACTAGAGGCTTAGTAACAGT
-CCAATACCAGAAAACTATACAAACAAGTTTGCTTAGTCATTTCTGCTAATGTATTTTTAT
-TGATGAATTTCCTAGTATCAGAAATGGAAAAGATCATTCTAGAACTTTAAGTCAATTTTT
-GAACTGTAATATAATTAGTTCTTTTTAACCCTAATGTTTATTAGTCTCCATCTTAAAAGG
-AAAAAAAAAATCTCCTTCTCATCCCTAAATGAACCATAGCAAATGAACAAGATCTCATCA
-TCATCCCGACAGGACAAAGATTTCTATAGCAAAGAATGAGGAATGTGCTTAGATTGCACT
-GACTGCATGGTTTAGGACTGCTTGTTTAGAGGAAAAGCAGCTATACAGGAAGACACCTTT
-TATGCACTGCTGCAGAGAATGAACTCTTTTTCCAAGCAATCAGGCAACATAAACTGGTAA
-GAGACAAACAAGACTTGTGGAACTCAGCGAGACCTTAAATATGTATACTTTTCTACCTTG
-CTACAGAAGCAAAGAGAAAAATTCAGTCAAACTTGCCCATTTCCCTTTACAAAAGGGGCA
-CTGATTAGAAGGCCAACTTAATACAAAAAAGCACAAGTAGCTAATGTTACCTGAATTACT
-TATTTCAAATGTCCATACTTAACCTTAATTTCTTTCTTCCTTTCCAATCAAGAGCAGAAT
-GCTCATACATCAAGcatttactgaacgtttactatgtaccaggaaatgtgtgcctgactg
-ccagaaaggcattctttctcttggtcctGGAGAAAGTATCTCTGCCCTCAGACAAAGAAA
-ACAGACCATTACAATCTCAAGTGATCAGTGCTTGAAACAATTAAGTCATGGTGGTGTACA
-GACGTTGAAGGGTATTTAAACTATCACCAACCCAtcattcattcaacaaatatttatgga
-gtacctaAAATGGGGAAAAACTGTAAGAGAAAAAAAAAACTGCACTTAAAGTACGCACAG
-GAATTATTCAGATGGAAAACATTAAAACAAGAAATTGCAAAGCGTAACACTTTAAAGCAA
-GTTAAGAATTTTAAAGACCTATAATTTTGCACCCTAAAATGACCAAAGGCTGGCACATTT
-TGTTATCTTCTATAAGAAACACATCATTGGATGCCACATGCAACGTGGCATCAGGTGTAA
-AAAAGCACCTGATGTGCTTTTTTTGCACATCAGGTCAGCAACCTTTTTATATCTGATTTG
-GAGACTATTAGTTTACTCGACTGTTACCATTTTGTGCTTAAAACAAACAGTATCATTAAT
-TCACAAGCTTTGGAATTCTTTCTCTTTATTTTCTTTTCTCTACTTCCAACACTAATCAGT
-TCCTtgttgcccaagctggagtgcagtggcacaatcgtagctcactgccacttcaaattc
-ctgggctcaagtaatcctcccacctcagcctcccaagtaactgaggctacaggcatgtgt
-caccacacctggcCCACTCATCTTTAAATAAGACAGAGAAGTAATTATAGCCAAAAGGGA
-ATAGAAAATGCAAACCCAGAGATATAAGCAAGCAAGGAAGCCTGGAAAGCCTTTGTTGAT
-CCTGAAAATTAGAATTTTGTTCTCACATAAACCAAAGCCCAGGGCTCTCACAAGACAAAA
-AGTCTAATAGGAGGCCCTCTTCATAAGGTGGGACTTCAGAGGCATACTTCCTAATGGTGA
-GAGTGACTAGGGAGTGGAAGATCCAGGGAGGAATTAAAGCCCTACTGAAGGGAATATCAT
-ATCTTAAGCTTGTTTTAAGGTGGTCTCTGGATTAGTGCCCATGCATACCTGATATAAGCA
-AGCTCTCCATGGAGGAAAGTACCTTACTGTGGGCCTCAAATGATCACTACAAATATCTAt
-ttttatttttattattttttatttttttgagacagagtctcgctctgtcacccaggctgg
-agtacagtggcctgatctcagctcactgcaagctctgcttcctgggttcacgccattctc
-ctgcctcagcctcccgagtagctgggactacaggagtccgccaccacgcccggctaattt
-tttttttttttttttttttaagtaaagacggggtttcaccgtgttagccaggacggtctc
-gatctcctgacctcgtgatccacccgccttggcctcccaaagtgctgggattacaggtgt
-gagccaccgcacccagccAATTATTTATTTTTAAATACAATGTCCTAGCAGATCTCAAAA
-AACAAGAGGAAAAATATAGTGAAATCGTTGGATATACttttttttttttttttttttgcc
-acaaagtcttgttctgccacccaggttagagtgcagtggcacgatctcagttcattgcaa
-cctctgcctcccaggttcaagtgattctcctgcctcagcctccagagtagctgggactac
-aggtgcatgccaccatgcccggctaatttttgtatttttagtagtgagggggttttgcca
-tgttttggccaggctggtcttgaacttctgacctcaagtgacccgcccatcttggcctcc
-caaagtgctgtgattataggcgtaagccaccgtgcccagccAGTTTGATATACTTTTAAT
-TGGTACTAGCAGAAAAGAGAATGGGATAAAGGCAGTAACTGAAGACAGTTGAAAATATCC
-CAGAAGCAATCAGACACAATCAAATTCCAGAAGCAAACAATTTccaaacaagatcaataa
-aaagaaatccaaaaccaaacatataattacaaaatagcaggaaaaaacaaagatgagttg
-ggtgtaatggcacaggcctatagtcccagctatttgggaggctgatacaggaagattgct
-tgtgcccaggagttggaggccagcctgggcaaaacagcaagaccttgtctcaaacaaaaa
-caaaaaactaaagacaagcaagtacagaaaaaggcagattatattcaaagagcaacatta
-gaacagctgatttttcaaaaccaacaatgaagccaagtagtttaatacctgcagtgtgct
-gaaaaaaataaatagccgccaaattaaaattctgttatcaagcaaatgtctctaaagaaa
-aaagaaaaataatcccattttggaaggtctgagttgaaagaaaaaataaagagcaaaaaa
-gaggaaaatttacagacagctccaaacaaacactgattatacaaaagaataacaatacct
-tgaggagctttaaaacatagaatacataacaataaaaacacagtgtattgaggagatttc
-aaagtattctttctaaaggtcttttattatatgaaaagaagataaaattataatatcagg
-ttttgctaagttatagctgcaagtcacaagatgtatgacaactaattacagaataaaaat
-agcatatatttccaaaccagaaagagggaaaagtaaaatcataaaaagaatccaaaagaa
-tgttaagaagggagaagaaaaaaatctagaacataagaagcataggggaagaaagttgaa
-ttggaatatgattaattatattaaatataagtggaataaattatccaggtaaaagacaaa
-gactatcatatcagactggattaaaaaagaaatccaaatgaaccagaataatccaaacaa
-ttctgaaaaataataaagctggaagaattatactaactgatcttaaacttattacaaagc
-tatagttgtcaaaacagtgtattggcaaaaggataatacatagatcaagggaacagaata
-aagagtacagaaatacactcacacaaacaaggccaattaatttttgacaaaggtacaaag
-gcagttcaatggagaaaggacatatatacatatatatataaatatattatgtattttttt
-cgagatagggtctgcctctggtgcccacgctggagtgcaggggcatgatctcaactcact
-gcaacctccgcctcctgggttcaagtgattctcctgcctcagcctccaaagtagctagga
-ccacaggagtgtgtcactatgccctgctaatttttgtatttttagtagagacagggtttc
-accatattgcctaggctggtctcaaatttctgagctcaactgatccacctgccttggcct
-cccaaagtgctgggattacaggcataataatcttttctataaattgttttggaagacttg
-gagatcaatatgcaaaatcataaactttaatctaaatctcacactttatataaagataat
-tcataatgaatcacagatatcaatgtaaaacttgggtcagatgcggtggctcatgactgt
-ataatcccaggctgggtgacaaggcaagactctacctctgggggggaaaaaaaaagatat
-aaatgtaaaattatcaaaccttcttgcaaccaggggttaggcagagtttgaagacatgac
-actaaaagcatgggctgtaaaactgataaactgaacttcatcaacgttaaaatatttctg
-ctctgtgaaagacactattaagaaaataagccagacacaagaagaatgtatttgcaaatc
-acaaatcgaataaagaacttgtatctgtaacattaaaaaactcaataagaaaacagctca
-atttaaaaatgggcaaaagacgtgaacatacacaccacaaaagaagatatacacataagt
-atatgaaaagatacacaacactgccagacagcagggaaaatgaaattaaatcatacaact
-accactacagatttattaaaatggctaaaatttaaaaaaacagaaaacaaaactatacca
-aaagctggtgtggatgcagagtaacagtaactaatacattcctggtaggaatgcaaaatg
-gttttggaaaacagtttggcagtttcttatagagttaaacatgtacttaagcatacaacc
-agcattcccactcctaggtatttactcaagagaaacggaaacccgtatctacacaaaaac
-ttatacacaaacatttaaggcagctttattcataattgtgaaaaaacagaaacaaccaag
-gtgtccaacagttacatgaacaaacaaatggtttgccatgtgatgcttagcaataaaaag
-gaacaaattactgatttgtgcaacaaaatggatgaatcGtttttctttttttggtagaga
-cagggtctcgctttgttgcccaggctggtctcaaacgtctagcctcaagtaatcctttgg
-cttcagtctcccaaagtgctaggattacaggtgtgagctgctacacctgaccaacatggt
-gaatcttaaaagtgaagaagccagaaacaaaagcctacatattgtatacttccatttata
-tcaggggtccccaatccccgggccatgggcctgtaccagttcatggcctgttaggaacca
-ggctacacagcaggaggtgagcagcgggagtcactcgcattactgcccgagctctgcctc
-ctgtcccatcagcaacagcattagattctcataggagaaccctattgtgaactgcacatg
-tgaggaatctaggAGGTGGAGCTCAATTTTTCTCCTTTAAGGAAAGGAAATAAGTAAGCA
-TGGAAAGAGAGCCTAAATTTCTCCCTTTCCATGCTTATTCATTACAAGGGTATTCCTAAG
-TCCAATGGGCTtggaaagggagaaatagcaactctacagtagaaaaacctggcagacttt
-actgaaatatcactagtgttaagtcactttgacatcatatgcccctgatataatgtgatg
-agaagggcacttcacctctgtggtagtcttctcaaaaatccataaccacaatttaatctt
-gagaaaacatcaaacctgtattgaaggacattctataacatacatcaccagtcttcttca
-aaagtttccaagtaatgaaaattaaagacagactaagaagcttcacagactggaggatac
-taaggagacatgatgactaaattaatgtggtatcctggactggctccttgaacagaaaaa
-ggatacaactggtaaaatccaaacaaagcctgtagtttagttaatagtattataccgatg
-ttaatttcttaattattttatttatttatttatttttagagatggggtctcactttgtca
-cccaggctggagtgcaatggtgtgatcctagctctcccagttcacagcagcctcaaactc
-ctgggctcaagcgatcctcctgccccagcctcctaagtagctaggactacaggcacatgc
-caccatgcccacctaacttctgagaaccaggttggtctcaaacgcctggcctcaagcaat
-cctccccaccacggcctccagagttactgggataacaggtgtgagccaccatgactggcc
-cagtttcttagtgttgatgacatatcacggttatggcaagatgtgaacattaggatatac
-tgagggaagcatatatggagattctatctgtaacttctgtaaacctaaaattttcaacat
-tacaagttAAATACTGCCAATATTTAACTTGAAATGCTAAAGAGGATGAGAtgctagaga
-agatgaggaaaaactgaaactcatacattgctagtgtgaacgcaaaatagtactgtatag
-ccattctagaaaacagtttggcaacttctttataaataagttaaatgtacatttttcata
-tgacccagcaatccaactcacagttatttaccctagaaaaatgaaaacttaggtccacaa
-aagcctataatgttatgttcacagcaactgtattcataatcaccaaagaatgaaaaccaa
-aatgtccttcaaggagtgaatggataaaaataactatagtctatccataaatggaatact
-actcagtaataaaaaggaactaaccatttacacacacaataactttgatgaatctcagag
-gcagtatgctgaatgaaataagccagtctcaaaatattacataatgtttgatttcattta
-tatgacattcacgaaaagataaaactgtagtgaggttgggcacggtggctcacgcctgta
-atcccagcactttgggaggccgaagcggatggatcacaaggtcaggagatcgagaccatc
-ctggctaacacggtgaaaccccgtctctactaaaaatataaaaaattagccgggagcggt
-ggtgggcgcctgtagtcccaactactcgggaggctgagcttgcagtgagctgagatcacg
-ccaatgcactccagcctgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaaa
-aaaaactgtagtaactcagaacagaacagtggttgctagagattaggggtgggaggctag
-gtatgttaccaagggtaacatgcagaaggtgatataactattctatgtcccagttgtgat
-ggtagttacttgaatctatgtatgtattaaaattcatagaacagtatacacaaaaaggag
-tcaattttactgtgtattaatttaaaaaaaaATTTAAAAAAAGGAAAAAAATTCTATCAC
-ATGCTGTCTAAAAGAGATACATCTAggccgggtgcagctgctcacgcctgtaatcccagc
-actttgggaggctgaggtgggcagatcacctgaggtcaggagctcaaaaccaccctggcc
-agtacagtgaaacccatctctactaaaaatacaaaaatgagctgggtgtggtggtgcgtg
-cctgtagtcccagctgctcttagaggctgaggcaggggaatcgcttgaaactctcgagag
-gcgaaggttgtagcaagataacgccattgcattccagcctgggagacagagggaggctcc
-ttctcaaaaaaaaaaaaaaaaaaaTTAATAAACAAATAAATAAAAGAGATACATCTaggc
-caggtgtggtggctcacttgaggtcaggagtttgagaccagcctggccaacacagcgaaa
-cctcatctctacttaaaaacaacaacaacaacaaaacacaaaaattagctgggtgtggtg
-gcgggtgcctataatcccagctactcaggaggctgaggctggagaatcgcttgaacctag
-gaggtggaggttgcagtgggcactccagcatgggtgacggagactccatctcaaaaaaaa
-aaaaaaaaaaaaaaGAGATACATCTAAAACATGGGGTATATATTATAtacacgatgtata
-catgcactgaaacatcacaatatatcccataaatatgtacaattatgtatcaattagaaa
-tTAAGAGCTGGGCACAGCTCAGGGGtccctgcactttgggagactgaagaggaaagatgg
-cttgaggctgagttcgtgaccagcctgggcaacacagcaagactaccatctctacagaaa
-aatttaaaagttagctaagtatggtgcatgcacctgtgtcctagctactcagaaggctga
-agtgatcatgtgaacctaggagtttgaggcttcagtgagctatgatcacagtgttgcact
-ccaacctggctgacagacactctgcctcaaaaTCAATCAATCaataaattttaaataaaa
-aaaaaCATAGGCTATAGAGAGTTTGTTCataaaaatacgatatttcaaaacgtgggatac
-aattaaagcaggacttagaaatttataaacttaggccaggtgtggttgctcatgcctgta
-atcccagcactttgggaggctgaggtgagtggattacttgaatctaggagttcgagacca
-gcctgggcaacatggcgagacctcgcctctataaaaataaaaattTTAAAAATCggctgg
-gcgcagtggctcacgcctgtaatcccagcactgtgggaggctgaggcgggcggatcacga
-ggtcagaagatcgagaccaccctggctaacatggtgaaaccccgtctctactaaaaatac
-aaaaattagctgggcatggtggcgggcgcctgtaatcccagctactcaggaggctgaggc
-aagagaatggcgtgaacccgggaggcagagcttgcagtgagccgagatcgtgccactgca
-ctccagcctgggcgacagagcgagactccatctcaaaaaaaaaaaaaaaaagaaaaaaaa
-aaTAATAATAATTAggctgtgcacagtggctaatgcctgtaatcccaacactttgggagg
-ctgaggccaaggtgtgaggattgcttgagctcaggagtttggagaccagcctaggcaaca
-tagtgagaccctgtctctatttttttaacttaaaactattaaaaaaaaaaaaaaaaaaaa
-aaagccaggtgtggtggcatgcacctgtggtccaactattcaggagtctgagatgggagg
-aacacttgagcctaggaggtggaggctgcagtgagctgtgattatgccactgcactctag
-cctgggcgacatagcaaggccctgattcgaaaataaaaaTTCATAAACTTGAACttagaa
-aagcaaactaaaaattaagaacttacacatatctcaataaatttgaaaacagaagcccag
-agaaactagaaggaaaaaaacgggaaaagcagcaatcaaagaaatatgaaacaaagaGGA
-TCCACAATACCAATTGAGTCTTTAAAAATGCTCGTgctgagcccgtggctcatgcctgta
-atcccaacactttgaaaggccaaggcaaaggattgtctgagtccaggagtttgagatcag
-cctgggcaacagagtgcaacccccaatctctacaaaaataatttaaaaattaggccaggc
-atggtggctcatgactgtaatcccaatacttaggaaggctgaagcgggaagactgcttga
-gcccaggagtttgagaccagcctgggcaatacagtgagactccatctcaaaaaaattgtt
-tttaataataaaaacaatggaaaaaattagctgagtcccagctactcaggaggctaaggc
-aggaagatcacttgagcccaggagtttgaggctgcagtgagctatgatcatgtcactgca
-ctctagccagggcgacagagaaagaccctgcctcTGCAGGTGGGGGGGAAGAAATTAAAA
-ATGTAAGTGTGCTTGATTTAAGAAAAAAAAAAAGAAGggccaggtgtgatggctcatacc
-tgtaatcccagcactttgggaggctgaagcaggcggatcacaaggtcaggagctcgagac
-cagtctggccaatatggtgaaaccccatctctactaaaaatataaaaaattagctgggtg
-tggtgccacacgcctgtagtcccagcaggaggataaggcaggagaatcgcttgaacccgg
-gaggcggcagaggttgcagtgagctgagatcatgccactgcactccagcctggcgacagt
-gagactctgtctcaaaaaaagaaagaaagaatgagagagagagagagaaagagagagaga
-cagacagagagagagagagagagagagagagagagagagagagagagaATGAATATTAGG
-GTAAATGTCCAATATCAAGAATGGAAATGAGGGAGTGAGGGATGAATTAGGGTAAATGTc
-cagtatcaagaatggaaatgatacatcactacagatcctacagatggtaaaaagataaga
-caatatcacgaacaactttgtgcccacaaacttgaaattcccagaagaaaaataatttat
-caaaactgatacaagaTCCCAGTCTGATTCTCAGGGAGAAAAAACAAAAACTGACACAAA
-AAATGAAAACCATAAATAGTCCCATAACCAATAAATTCAATCAGTATTGTTTCAACCTGT
-TCTATTCTAATGTCTTTGAACTGCACAGATTAACATTTTCAAAACATTTGTTTAAACTGA
-CTGAACTTGCTTCCCACTCCTCTCCAGGTCTCTGTGCTTTTATACATTGATTATGCCTTC
-CAATAGTGCTTGCTAGGGGAAATCCTACTCACCCTTCAAGAATCAGCAAACTTTACATCC
-ACTATGAAGCACACTATGAAGCATTCCCATCTTTCTCCAAAACAGGCCAAGTACCTCTTC
-TACAGGGCCAAAGCAACCCCATATACTCTCTGACATTGTCACACTGAATGTGTTTTGTTT
-ACATACACCTCTCTCCTCAGATTATGAATTCAAGTACTTGGACTTTGATTTATTTCTCTT
-GGTGGATGCCCCGTgtttcaccacactgcccaggctggtctcaaactcctgacctcaggt
-gatccaactgtttcagcctcccaaagtgctagggttacaggcatgagccactgtgcccgg
-ccTGTGGTTTTTAAAATGCTCCTCAGTCTTACCTATAAATGTTATTGCATCCATCCTTTT
-TAAACCAGGGGAAAAAGGTTTCCTACTATCACTTACCAAAGAGATGTGAAACTAGTCAGT
-ATGGGTGAATGATGTTTCTTGGAGATTTTATGAGGTTCCACGCTGCATGATTTACCATGT
-GATGAGCACACTGCTTGACAAGCCTTGATAGAGCTACAAAAACAGTTCAGTACTCCGTTA
-CTGAAAGGATCTTGGATTTAAAAGACATCATAAGGTTGCAGAAAGAATAAGTACACTAGA
-ACCACTACAACCTACATCTGATGTTGGATATGTTATTTAACCTACCTGATTAAAGTGAGA
-AAACTGCAGAATATAAGGATTATCACCCTTCCCCCACTCCCTTCTTTACTGCCATGGTGG
-CAGGTTACATAGCAGACAACCATCATCTCCGCAGGTGATCAATAACCAACAGCTAATAAG
-GTAGGTTGTCCTAAAACTGACAAAAATAGAATAGGCTGGAAGTAAGGGCAGTAAAAACTG
-GTTGCCTTTCAATTCTGAAGATATTATGTGAATGCCTATGTCAGTCACTGATTCTTGGGA
-TTTATCAtttttgtgtgtgtaacagggtcttgctctgtcacccagggtgggtgactgcag
-ccttgacctcccaggctcaagcaatcctcctccttcagcttccttagtagctgggaccat
-aggcatacactactgtcccctgctaattaaattttttcttttttttctttctttcttttg
-tttttttttctgagatgtcttttgtttttgttctgaggtcttgttatgttacccaggctg
-gtctggaagtcctaagctcaagcaatcctcctaccttggcctcccaacgtgctgggatta
-taggcatgagccaccatgcccagccAGATTTATCACTGTTAAACCAGCAAGTCCATGACC
-TAAGTAATGTCTTTCTCATTTTACAGAAGGCAAAACTGCATAACCTTCCCAATGTCAGAG
-GTAGTGATTGGAAAACATTCGTCTAGATTCACAGCCTATTCTTCTGTTCTACAGCAAGGG
-ACTGTAAACTGGTGACCACAAACACAGCCAACCCCCATACccatggtttcagttacccgc
-agtcaactgcagtctgaaaatattaaatggaaaattccagaaataaataagtcataagtt
-ttattttccatgtttgtttttagagacgaggattcactcagtcacccaggctggagtgca
-gtggtgcaaccgtagctcactgtagcagcctctacctcccatctcagcctcccttgtagc
-tgggaccacgggcatgcaccaccactcctggctattttttttttttttttgtaaagaagg
-tttctcactatgttgcccgggctagtcttgaactcctgggctcaagcaatcctcccgcct
-taccctcccaaagtgctgggattacaggcatgagccattgcacccagccatgttttaaat
-tgtacatggttctgagtaatgtgatgaaatcttgcaccatctagtaccatccagccctgg
-atgtgaatcatccctttgtccagctgtatatgccacctgctcattagtcacttggtagcc
-ttcttggttacttgaatgttgcagtattgcagtgcttgtcttcaagttacccttatttta
-cttaagaaatgccccaaagtgcaagagtagcgatgctgagaatctggaaatgccaatgtg
-aagctgtaaagtgcttcctttaagtaaaaaggtaaaagttcttgacttaatatggaaaaa
-aaaatcatatgtggaaattgctaagatctatggtaagaacaaatcttctatcagtgataa
-tgtgaagagggaaaaataaattcacatttgttttgctgttgtacctcaaactgcaaaagt
-tatgaccgcagtatgtgataaatgcttagttaaaatggaaaaggcattaaatttgtgggt
-agaagacatcaacagaaaactgtgttccaactgatgataatcaggtttggtattatctgt
-ggtttcaggcatccactggggatcttggaatatatttcccacagatggctgggaacagga
-ctactCTGTGTGTATATCTCCTATTTGGCTCACATATTACTTTTAAAAattgagataaaa
-tccatgtaacataaaactcatcattttagggtacaatcagtaccctaaaatggtgtgttt
-tcgtatattcacaatgctgtggaaccatcaccactatctgattccagaacacttcatcgc
-cccaaaaagaaacccagtacctcagaggattaactcccaatagcctcttcctacaatcct
-ctggcaaccaataatctgctttctgtcttcatgtatttgcctattatggacatttcacat
-aaatggaatcatgcaatatgtggcctcttccacttagcaaaatgtctacaagtttatcca
-cgttgttgcaagtatcagtaattcatttccttttacagctgaattcactgtataaataca
-tcacattctggttgtccattcactgacagatatttggactgtctccactttttggctact
-atgaaataatgtcgctaggtgcatatgtgtacaagtttttCACtttttttcctttttttt
-tttttttttagagtcaggaccttgctctgtcacccaggctggagtgcaatggcatgatca
-tagttcacttcactgcagcctcacactcctgagctcaagtgatcctcctacctcagtctt
-ccaagtagctgggactatgggtgtgcgccaccacgcccagttaattttctgcatttttag
-tagagacagggtttcgccatgttgcccaggctggtctcgaactcctggattcaagcgatc
-atcccatcttagccttccaaagtgttgggactacagtatgagccacagtgcccagccTTC
-ACACTGTTTTTAAAAAGTAAATCAGGggccaggcatagtggctcacacctgtaaccccac
-cagtttgggaggctgaggcaggcggattacctgaggtcaggagttcatgacagccttggc
-caacatgatgaaaccccatttgtactaaaaatacaaaattagccaggtgtggtggtgggc
-acctgtaatctcagctacttgggagcctgagacaggagaatcacttgaacctgggaggca
-gaggttacagtgagctgagatcgcgccattgcactccagcctgggtgaaaagagtgaaat
-tccgtctcaaaaaacaaaagaaaaGGTATTAAGGTGAATTATGTATTAAAATTTTTCACA
-ATTAATATTTTTCAAAGTGACAGTTACCAAAATTAAAAAAAAATTTAACTTTCTATTTCT
-TAAAAGAAATAAAGCAGGAGGGAGGGCAGGTAGGTCTGTCTGTCTGGTAACAATGACTCT
-TCATTCCTGCACTGACAAAAACCTGCTGGATATGCTAAGCTGTGACTGTCCAACAACTGG
-CTCTTTTAACAGACACCCAATGGAGATACCACACGTAAACCTGGACAACTCTTCATTTAC
-CTTATTGACTCGACTCCTGAAGGCATTTGAGCAATCAATCCCTGGTTTATACTAAATATA
-TAAATTTACAAATAATAAGATGGGGGAACTCTTATTTAGACTACACAAATTTTGGAACTG
-AAAATGCAGCTCAACAATGAGATCAGTGGCCATGAACTCTCTGGTAAATGTATATAAAGC
-AGCATGTACATGTACATTTTTTTTTGAAGAAAAAAATTATTACAGGCTCAGGAAATCTGT
-AAACTCCAGCAAAATTAATAATTCCTGAGTTAGACAAACAGAAACTCATCTAAGAAGGCT
-AACTTGGTGATTTACATAAATATTAAAAAATTAAACTGCTCAAACTAAGTATATGCCATT
-CTTTCCTGAAGGAAGACAAGAAGACAATGTATCCTAGGCTTCAGAGTATGAGACCCAAGC
-TTGATGAATGATTAACAAAATGTCAGCCTCAGAAAAGATACAGTAGCATTCAGAGTTAGT
-CAGGTAGAGATAACAGTTTTACAAAAGGGAACTTTACTTCTGCCTCACATTACTGCTTAG
-AAAATAAGAACTTGAATTTCTTCACTACTGTCCAACCTTAAATTGTTCACAGTCTTGTAT
-TTTAAAGCATATCCTTTGAATCATGTGTCCAAAGAGAATTACTTGTGGGTCAGAGAGGTA
-CCTTAAAATGGCTTTAAAAACTTAAAACCAAGATTATTTTCAGATTGTTTACCCCCTTGA
-ATCTTAAAACTGTTCAGATATCCAATTACTGAGCTTTCTAAATTAGTGCTCCCAGTTTTT
-CTAAACTTTTAACtttttttttttttgagatggagtctcgctctgtcgccaggcctggag
-tgcagtggcacgctctcggcttactgcaacctccgcctcctgggttcaagcgattccccc
-gcctcagcctcctgagtatctggactacaggcaagcgccaccatgcccggctaatttttt
-tttttttttttttttgtattttagtagagacagggtttcaccatgttggccaggatggtc
-ttgaactcctgatcttgtgatctgcccgcctcggcctcccaaagtgctgggattacaggt
-gtgagccactgctcccagtcTTTTTTACAGTCAAGACAGAAAATAATATTTGTATGGCAC
-AATGGGGTAAATGATCAAGACTGCTCTGGATCTGAGGTCATTAGTTTGGATGCTGTATCC
-AAACTATATTCTGCATGAATGGCCAGAGGTGTGAGGGGACCAGTATCTCAACACATCTGT
-AACGCACCCTAACACAATACACTGGTTGAGAAATTCTAGTTTAAATAACTTGTGGAGATC
-ACGACCTGAATAGTCAAAATCCATGCAGCAGGTTGAGAAAACTATTTCACAATTCCTCTT
-ATTTCAAGAGATACGCAATCACCTTTTGCAGCTTTCAAGTATAGACCAGATGTACTAACA
-GGCAACCATTTCGTCTGGAAGATCATCTATTTGGAGGTCACTGACACAAAAAAACAAAAA
-CAACAAAGACAAAACAAGCCTCCTTACCCTAGCTCAGAAGGATAAGCCAAAAGAAAACAG
-GTTAACGGTAAAAATGTATGATTAAATGAAGTTATTGTTTTTTTTCCTCCACTTCATATT
-GATTCTCTTTTCCCATGTCAATTTAAGGTGGTAACCATGGCCAACAACATTCTCTCTCAC
-CTATCATACTAATGCCATATAAGTAGTAGTGTTTTTGTTTTTTCAAGTGGGGAAATATAT
-ACAGCTCAAAAAAACAAAAAAATATCTAGCAACTAACTCCTTGGCAGTTCCCTTGACTCT
-CTGACCTTTAAGTCCCAAGGTTCTAAGTATACAATGAATAAGAAAACTACCTGTTCAAAC
-CCAACAGAATATGTTTTTTTCTGGTTTGATTAAGGCTTCGAATTTGGAACATAAATACTC
-TCAGTAATACTTAGTAATTCATGAAGTTACTGCTTGTGTAAACTTGCAGAATATTTAACT
-TTAGGAGATTATAAATCCTAACATGCCCCTAGGGGCCTTCTGCTTTTATTCCTACATACA
-AAACATACAACATGTTTGTTTTTAAAAACAATGCACATAGgccaggtgtggtggcacaca
-cctgtagtcccagctacttgggaggctgaggcagaagcatcacttgaacccaggaggcag
-aggttgcaatgagccgagatcatgtcactgcactccagcctgggtgacagagcgagacgc
-tgtctcaaaataaaTACATACATACATACAAAAAAATTAAACCAATACACGGAAGTATTA
-CTTCCATAAAACAAACCAGGAAGTACAGTAAAACAGAAAACATTAGCATTTGGGCCTTTT
-GTGTGAATTACATTTCTCCACCTTCAACCCAGAAAAGGGATCTGAGTGTCAATGTGACAT
-AAATGACATAGCAACAGTGTGAGGTCTCCCAATGAAGGGAGGTATTAGAAGAAAATCCAA
-GCAGTTTGATTTGGATTAATAGTTCTACCCCAAACACCTAAGAGAAATCGGAATTCCAGT
-ACTGTCTCTTACAATATAGTCATCATCTATACACCTTTTTACCACGCCATATAAGCAAAA
-TAAAGTCACAATGTGAAACTTTACTCCACTGGCTATTACCCTCTGGAACCAAAAGATGGA
-AAACTTCATTTGGGATATACAGTAATCTAAAGAAAAATTCAGCACTTATGAATGTAATAA
-CTACTGTTACCATTTGAATGCCTCTTACAAACCAGGCACAGTATCAGATGCAtattctga
-ttttagaaataaacagattcagaggttaaataatctgccaaaaacaacaggattactaag
-tggtggaagccagatctgtttaggatccaaagcctaaataggttcttttcactAAATTTA
-ATACTATTTCCTTAGTTCTCCAAACTGATTTATTAACAGCCTATCCAAAACACTATAATA
-AAATGAACTGCTTTAAATTTGGAGGCAAGGTAGGGGTGGGATACTGAGTTTCAATAATCA
-GGTTTCTTCATTATTCTTTTACCTGAATGGGCTGGCCACCAGGCCACAATTGTATAAAAA
-TCAGATTTTAAATGATGGAAAAGCTTTTCTGTGTGGCTACTGAAGGGAGAAAGGAAGACA
-ACTGAGACATGCCCCACCTTGCTGGCTGGGGGCTGGTGACATCTGTGGGCCTCAGTGTTG
-GACTCCAGATGCAACAAAGCCTAAAGTTTTGAATATGTATGAAGGTCAATGTGATGTTTT
-CCAAAAACAGTCATAAAAGATGGCTGTGAAAAACCCCCTAGTATAACAACTGTATGTAAC
-AAGAGCATATAGGTAGCTGCAGATGAATGCTCAGGTCCTTAGCTGTGGTGTTTAAAAATT
-CTTCAGACCAggctgggtgcagtggctcacacctgcaatcccagcactttgggaggccga
-gatgggtggattgcctgagctcaggtgttagagaccagcctgggaaacacagtgaaaccc
-catctctactaaaatacaaaaaaaaaaaaaagccaggcgtggcagcgtgcgcctgtagtc
-ccagctacttgggaggctgaggcaggagaattgcttgaacccgggaggtggaggttgcag
-tgagccaaggtcgtgccactgcactccagcctggcaacagagtgagatgctatctcccaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTTTCTTCGGACCAgtgtggtggctcatgag
-tgtaatctcagcactttgggaggctgagttaagaggactgcttgagcccaggagtttgag
-accagcctgggcaacatggtgagaccttgtctctacaaaaaaAATTaacaactacccaca
-aagaaaaccctagctcaagatggcttcactggAAGGAAAAATGAACTGGTCAGGAAGACA
-GACAAATAGAAGCAAATAATGAAAGCATTTTATTTGACATTGATAACCTTCTCACAATAA
-ATTATGTGGCAAAATACATGCTTGAATACTTAATTGCTAGGCAATAGTCTATTTTCATTT
-TTTCACAAAAGGTAGACAACTCCAAAGCAGATGGCCATTTGTAGCCATTCTATATAATCA
-TAAATACACAAAACACTggccgggcgcggtggctcacgcctgtaaccccagcactttggg
-aggctgaggcgggtggatcacctgaggtcaggagtttgaggccagcgtggccaacatggc
-gacaccccgcctctactaaaaatacaaaaattagcccggtggggtggcatgcacctgtaa
-tcccagttacttaggaggctgagagaggagaatcacttgaacccaggaggcagagattgc
-gccactgcactccagcttgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaa
-aaGTTTTAAAGTGCCGATAAATACAAGTTCCTGGTCTGCCTACAGTTTATCACTTAATAA
-TACAAAGCAAACAAGAAAGCAAGTTAGTGGATTACCTGAGAGAGCAAGACATAGAGAAGA
-TGTTAATGCAGGGAGCTGGCCTTCTCCAAACATATCCCTAACACACAATATTCAAGCAAT
-TCCCAAACTGTGATCAGAGAACCACTGGGAGTAAGACCTCTGATCTATATTTACAAGTCT
-ATAGGTGAGCAAAGGTAGACCTTTTCCTGAGTCTGAGATGGGAATATTACCTTCTCTATC
-TAGAAGCAAAAGAATCCTAGACTCACCAGGACTAGGTAATAGACACTGTACACGAGTAAT
-TGAGGTAATCTACACTGGGCGTGACTTACATACTGATCCACCCCTAGGCAGCAATTCATA
-CCTCACCCACCCAACAGGCTACATTAGAAACAAGGAAGTACAGGTCAAAAGTCTCATTAA
-AAAAATAAGAACTCTTGGCAGCAGAAAATGAAAATAAAGAATGAAGAATGACAGCACTGG
-CAATAAACACATTCTTTTCTCCGAAAGGGAAGGGAAAGAACTAATGTTGGGCACCCACAT
-GCCAGACATTTTATCAATTTTCTCCTTTAATCCTCAATAATCCTGAGATAATACTAGCTA
-GTACTCTAGTTAttaatcctcacaaaaatcctgaggtaggtactactaattcccatgtta
-caggtgaagaaaccaaaagttagtaagttgcccaaggtAGttgttatccgaactgtagag
-acaagaactcccagacttgaagaggttaagtaaacttccccaaactcaAAGTGGGAGTTC
-TTTCCCACTAACCTATTGCCTTCCCCTCCCTACCCGCAATCTCAATTAATTCTCTATTCT
-ACCCCCTTCTCATTTCTGCAGCTGTTTCAAAAACTACACCTAAGATACAAAGCAAATAGG
-AGTTATTATAAGAAAACACCTCCAAAATCTACTAAGTTGTGGTATGATATGCCTGTTATC
-AGAAAACGTCACTCAATTTTGAGCTTGGAGGGCAGTGACAGTTTGGAGATCTTtagcaca
-acgcctgccagaaacgtggcaggcgctcaggatctgctgaatgaaCAACATCTTCTGAGT
-GGTTATGAATTCAATAACCCAAAATGACCATCTCGTATTTCTGGATATGACATGATACCA
-TTTTTTGGAAAATAATTTACCCATTCATTTTAAACAGGGTAGCTTTCTTAAAATTTATAG
-AACATTGATGAGATAGCTAAACTGAGAAATGCCCATTAAAGCATTAGTCATAACTTCAGG
-AAAATTTCAAATGTTCACTTTTCCAAGCAAATTAAAATGTTTCAGCTAATAAAAACCTGT
-CAGAAAAACCCACAAGACAAGAAAGTATAAAAAGAAAAGAGCAGCCAATATAAGGGCATT
-TAAGATGTCACACATAAAAAATTATAAAACATTAATCTAACTTGTACCTTGGTATTTAAC
-CCTAAAACTGTCACCTCAGATAACACAATATTTTCTATGCAAGAAAACATTATCACCACG
-AATGTAAAGAAGCTTGCCGACCATAGCAACTGTTGCTACGTAGGGTTTTTTAATGTCTAA
-GACTGAAAGACAGAATTTGTAGAAACCAGTTAAAATGCCACTCTTAGCAGTATCTTGTGA
-TACTGTGAATGCTTTCACCTTAAACTTTTTAAAAGACTCAATCTTTGACTTCTACATGTG
-AAAAAAAAAAAGTACATCTGGGAGCACTCAACGTAAGAAAACTACCAATTGTCTATAACC
-CAATGAAAATACATCCTTTGTTACAATGACAGCAGCTACTTTTCCTTAATAATCCTAGAG
-GAATTTCTTCATTTGAAAAGCTGGCTGGCCTAGATTTCTCTATAAACTAAATGACATGCT
-ACTTTCGAAATTATCCATTTCAGAAGTTCAAAGAAATTCAGGTATAAGAACACATTAATA
-CTCTCATGAAACAAACCTTATCCAGGTTACCCACGAATTGTGACAGATCAAAACCCAGTT
-TCTCATTTCAAATCAAGTATCACATTATTTATTACCTTAAAATACTAAGCCCTTACCTAA
-TTCAATGGCAAATCATATTGGTTTTCAGTTTCTGAACTTGTACAAATCATACTGTAATAT
-TTATGCAAAAGTTGTCATATAGTTGAATATTATAGACAGTTAACATCttttttttttttt
-tttgagacggagtcttgctctgtcccccaggctggagtgcagtggcgtgatcttgactca
-ctgcaaccaacctccgtctcccaggttcaagtgattctcagcctcctgagtagctgggac
-cacaggcacgcacctccacactcagctaattttagtagagatggggttttaccatgttgg
-ccaggctggtcttgtcctgacctcaagtcatctgcccacctcggcctctcaaagaactgg
-gattacaggtgtgagccaccatgcccggccAACAGTAGAAAAGGGTACTCAGGGAACATA
-GTTCAAAAGTCATGATTCTCTATTGGCTGGACCAGGATTCTAGACTAGCTCTAGGGCTGA
-GATATCTTAGTAGACCAGTTAACATTCATGTGGCCCAATTTCCCTTACTCTAAACCCAAA
-GTCAAACATAACCTCTAAAGTCTTTCATACCCTGAAATGCTAATCTTGTAATCATCTTTC
-TATTCAGGTAATAACTCAAAAGAAATGGTCTCACTTCCTTCATCCTCTGACTAAAGTTTA
-GTTAGTCCATATTTTATGAATCCAATTAATAGGATACTTTAAAGAACAAAAAGAAAAGAC
-TTTTCTTAAAAGCTAGAAACTCCATTCTGTAGTGATGATTCCCAGATCTGACTCTTAAAC
-TCAACAACCTCAACAGACAATGACAGGGAGAAAAGATCTTACAAGTTTGAGCTGAGCTGG
-GGTGGGGTGGGAGGTGTGAGAGAACAGAGAGACAGTTACAAATTCACAAAAATGTATCAC
-CCATTTCCATCTCCTCTAAAAAAATATGAAATAAGCCTTAAAAGGCTGTCATAGAAACCC
-ATTATTAAGCCAATAAAAACTAATGAAGAAATTATGTCATTTATCCAAGATATGGAAGAA
-CCACCTATTTACAGAAATCCTACCAATGTCCTAGACCTTCAGAAACTACATCTCACTAAG
-CTGACCATCAAGCCCCTTCAAACTGCATCTAAGGACAATAATAATATTCAAACATCAAGA
-AACAGGCACAGGTTCCACTCAACACCATTATTCCGTGGAGTCTTCCAGGACTAAATTGTT
-TTATAGAATCTTTGCTATCTTTGTTCTCTAGAAAATGATATCCCAAAGACTCTAAAATAA
-AACCAGCAAAACCCCtgtatttgttttccattgtgtcataacaaattatcacaaacaaaa
-caacacaaatggattatcttacagaagtcagtgggcttgactgggtctcacaagggctaa
-atgagggtatccagtgggtgggttccctgctggaaactctggggaaaatttgcttccaca
-ttcattcaagctattggctgaatttagttccttgcagctgtaggactgagttcccacttc
-cttgctggttgtcagctgggactggcctttcctactagaggctgcctgcattccccgtct
-cacactttcaatctggtcccctccagtaacggcaggctgagtccttctcatgcttcaaat
-ttgacttccccttctgcctcatctctgacaccagccagaaaaagttctctgcttttaagt
-gcttatgtgagtagaataaacccacccagaaaatccaagataatctacctaagatcctta
-actttaattaaatctacttaacatattcatgttccagggtttatagtatggaaatcgtag
-gggagccattctgcttaccgcagtctgccttctggtttccaaggattcatctctctctca
-aatgcaaaatacatccatcccatcccaaggtcccaaaggtttcccatctaaagcttatca
-tttcagaagtcccaaatctcattcatctattcaggtgtggatgaggttctggggacaaaa
-cagtaagtccaattcctggggcacaattcctaaagaaacaagttctctactcccaacata
-ccactgtgagacatgtagagaataacagttagacattccagttcaaatgggcaaaatgta
-aaagaaaacagagcctccggtccaaagcagtttcaaaatctagggaatctccattccatt
-tcaaagcctgggaaaaatcctctccagcttttagctccacccctctgggctctcctatct
-ccgtctgagtcaccctgattcttttatgaaaagcaacacattcacatgtgagtagtttta
-tcagcctgcttcctatcagtagaatttggggggtccaacagccctattactttctgtctc
-tttcaatccaaactagaactgtttatgttggcataaaattctcaagaacctaatgggctg
-tggaagtattccacatgggtccactccattaaagttcacattcacaaataaaccaggctg
-cacatttaatactttgcttggaaatctcagctaaatatacaagttcatcacttgcaaatt
-tggctttccatataaccataggatacaattctgctaaacttagttgctactatgtaacaa
-ggatcccctttctgccagtttccaataagaaagacctcacttctgtctgggccctcacta
-gcagagtcattaacatccatattgctactaaaagtatgtccTAGGCCttttcttttttga
-cagggtctcactctgccacccaggctggagtgcagtggtgccattaccgctcactgcagc
-cttgacttcctgggctcaagcgatcctcctgTGTtccaggccttttctatcatgcccctc
-aaaacaattctaacctttatctactgccactttcatttttaggtaatagtaccccactcc
-tggtaccaaaatctatactagtgttctactgctgccataacaaattaccacaaatgtagt
-agctaaaaataacacaaatttgttatctcacagttattgtaggtcagaagttgggtgggc
-ttggctagctaggtcttttgcttagggtctcacgaggccaaaaatcaaggtgtctcaagg
-ttgcattccttggtggaaactgggaaattcacttccaagctcaatcaggttgttgaccaa
-attcaggttccttctggttgcacaactgaggtccccatttctttctggttgtcagccagg
-gactggtctttgccactagaggctgcccacattccttctgataaactttccatgtggtcc
-tctctagcaaaggcaaatggagtccttctcatgcttcaaatctctgatttccttttctgc
-ccatttctctgatcccagttggagaaagttctctgcttttaaggacttaagtgactagat
-tcggcccacccagaaaatccaggataatttttctattttaagattcttaaccttaattac
-acctgccaagttccttttgccatgtaacacaggatagctacagattctggggatcaaggt
-atggcaccttgggaagagggagatgtaattctgcctactacaAATCCAAGTCCTATGGAA
-GGGTTTAAACTCACTTCCTAAAGAAAATCATCCCTTTCTTTAACAGAGTGTGAAGTAAAG
-ATGTATATATTTTACTTATGTGAAGTAAAGTATATATACATACATACATATGTCTTTACT
-TATGTGACACAAAGATGTATGTTCAGAGATAGAGACAATAGTAAAAACAAGGACTCACTC
-TGGATGAGTGAGTAGGAAAAGGACGCGCAGTATGGAAAAGGAGTTGCCACCTGTTTCATC
-CTCAAATTGCAAGGCACTTCACCCATAACTACTTAGAAACTAACCCATGCTCCTCCTTAA
-ATGTGTATTTCTCTTCTCTGTATTCCACAAAGGAGTACATAACTAGGCTTTTTTTTATTT
-TTAAAGAAAAGTCACCTCACGGGGACCTAACTGTATAATCAGTTGATTAATCAATCTAAG
-CAAATTTCCAATCTTGCATTCTTTCTTCAAGTCATACACCCTCCCGCAATAGCAAACCAA
-AGCCAAGTATTTCAAAGTCACAGAAGGACAAAAACATGCCCTGCTAAGACTGCAGGTGAA
-CTTTTGAGAATACCACGGAGGAGAACTAGTATTGGTACTGGACTTTCAGCCCCAGGTCCA
-CCAAGCCAGTAAAGCCAAATGACTTACAACAAAACCCTACAACAACTACAAAGATACTAC
-TCTAAAGCCCTGTCTACAGTCAAATTCTTGACTATAAATTTTACTTAGAACAGAAGAGCC
-CCAAATATACCAGCTAGTCCCTTTACAGTGACAGGTAAAAGCTACTTACTAcacttacta
-cctgccagacactgtagtaagcacttgacacaaattgtcttatttactcttctccgtaaa
-ctcacaagctagaaaataccatcatcccccttttacagacgggaaaactgaggcttagag
-agtttaggtcacacagctaagtagcaatggccctgatatttgagaacctaggcagtctgg
-tttttaaccactgggcctacactgCACTCCTCAGATGGAATGAAGTCTCCAATTCTTGGA
-AAAATCTTCCCTTCTTAGttttcttttttctttttgaggcggagtctcgctctgtcgccc
-aggctggagtgcagtggcggatctcagctcactgccacctccgcctcccaggttcaagcg
-attctcctgccttagcctcccgagtagctgggattacaggcgcgcgccaccaagcccggc
-tgatatttgcatttttagtacagacggggtttcaccgtgttggtcaggctggtctcgaac
-tcctgacctcgtgatccacccgcctcggcctcccagagtgctgggattacaggcgtgagc
-cacacgcccggccTCTCTTCTTAGTTTTCATTTCCTCTCCCCATGTCCCATTCTCGTAGA
-ATTAAACAGCTGAAAAGTAATCAAGTCTTCCCAAATAATTTGCCACCTTCTTTTCAAAAC
-TCTTTCCTCCACACAAAGCAATAGCCAAGATGCAACTTCTCCTGACCCTGACTCTGCTTC
-CCCAAAACAAACTACAGAAGCTCCACCCATCACCTGCTTAATCTAGCAATGTTCCAACAC
-TGCAAAAAACACACAACGAAAAACAAAATTGAAAAGTCCTACTCTTTCAAAAGGTCACCA
-ACATATGTATACCCTTAGCCAAGCTTTCTCTCCATACCTCTTTTTCTATCCAGGCTCCTA
-ACTAGTCCTTAACTCCAACTCCAGACGTTCTGCCCCACGTCTTGGTCCCTTCCCCCTTTC
-GCCCCAGCAACCCCGCCTGGGGTTCTCTCCACCTCGCACCCACTCTGCAGGTGGGAAGCT
-CAGCCCCGCCCAGAGGGACCCTAAGAAGGCCCCTACTCCAGCTGCCCAGTTTCGCGGGAG
-GGTTCACTGCACACTACCCAGCAGGCACCACTCCCTCCGCACCCTCCCCCAGCACCCCCC
-TGCGGCCCCACCCCTCAAGTTCCCTTCCCCCTCTGACGACCCCCTCCTCCAAGTTGTCCC
-CTAGTCCCCACCCAGTTCAGTCCTCTCCTCTGCAATAAGCTGGACTCCGGCAGCCGGTTC
-CCACCCTCACATCGGCCTCTGCCCCCAAACCTCGCCCTCCGCCCTGAGGGGTGGCCCCTG
-GGCCTCCCCGATGGGCTGCAGGGGCCTCGCTTGGTTTATGTGTGAAGGTGGGGGCAGGGG
-AAGGCGACGGGCCGCTCAGGAGTCTGCTGGAAGCGTGAGGGTCGGCCGCGCTCCGCTGCC
-CTATCCTGGGCCCACCCCACCCGCCAACGACCTCGCCTGGCTGCTCCCTAGGTACCTGTG
-GTGGAAGCGGCAGCGGCGGCGGCCGCTCTCCCCTCTGCTCACACAGACAATATGGCGGCG
-ATGGAGGAGGAGACACACGGCTCGGCCGCCAGCCGCAGGGACCAGAGCGAGGCTGCAGCC
-GCTGCTGCCGGAAGCGGAAACCCCCTCCTACCAGGAGGCGGGGCGAGACAGCTTCCGACT
-CCGCCCCCAGAGGAATCTCTCTGAATGCGGCCATGCTGGGATGTCCTATTGTAACCTTAG
-GGATTCAGTTCTGGCCTAGGGTGCAAAATGGAAGGAATCCCCAACGCAAAGCAGAATAAG
-GAGACTTGCAATAGTTAAGCGCATTTTATTTCAATAGTGTTAACAAGTGACAACAGAGAG
-AACACGAACCTCCCATTAGGTGAACAGTTGGTTTGACCCAAGTTAAGATGGCGGTACCCA
-GGTTTCCCACACTTCACCCAGCTGGCCCCCCTTTCTTGAAAAGAACCATGCGCGACCTGC
-AGAGCTGTAGAGCCAAGCATTCTGGGAGCTGAAGTCTCTTTTGCTCTGACCCCTCGTTTT
-AAATTAGGGTTTCAGCAACACTTTCTATTCAAACTTGGAGTTCGGAAGAAGTGAATGAAA
-GTTGGACCCTAGGAAGGGCATGGCGCAGGAGTCTGAGAAGTGAGGATACTAGCTCTCAAG
-AGACCAAGGCCCAATTCCTTCCTCCTACAGGAGTCCTGCCAAGAGCTGTGCGTCCAAAAT
-ACAGTGTTTTTTTTTCCTtctatctgcctcccacccctgctctccttgcccgagctacct
-ccccaaaacagccacaaagcactttctaccatgcagagctcatcatggtctccctatggt
-caaaaatctcccatggacctctttatgcaccaaagatagcccaaactcttcacttgacat
-tcagagtcctccataatttggccaaaccctcctttccagcctcctattctgccactctct
-tctcaaattccggaagattccacccacaagactgcaaacaattcctggaacttagctgtg
-ttgcctccctccctttacactggcagttacttctCTTACTGTCACCTCATGGACTGGATA
-ATTTCTGTATGCCGATTGAACTAAttcagggatcctttcctctaggggtctcctctctgt
-ttaactccctccaacccagacactatcagtcagtaacctgaggacctcagtctgtctcct
-ccatcagactgggagcccccagtggacagggctccatctgATGATCAACCTCTCCTTTGC
-AGGCCCTGATAAAAGCTGAAGCGTCTAAGAGTTGCTGAAAGGAGTTCAAGTATTAGTCTC
-ACCTCTGGTGGGACAGAGGTGTGAGCACTGGAACGAGGGTGAGGAGGCCAGGTTCTTTCA
-GTACCAACCATTATCCCTAACTGTCTCAGAATAGCTGGTTGTCTCAGGAATGGGCCTCTC
-CACCCTCCACAGCCCTGCCTTCACAGTTTGTCAGCTGACTAGCACCTCTGCTCCCAAAGA
-GGCACCTCTTCCCCATGTGGGGTTAGGGCTGGTGGTGGCTGCAGACTTATAGTGATGGCC
-TCAGGGAGGTGGCTGTGGCCTTCTCTGGACCTCATCTGCTAGACAGCTTGTGACATCTGA
-TCCCAATTGCCTGGGAACCCACAACAGTTTTTCTCTCAGTGTCCTGTAActgggcctcaa
-tttccccacttgtggactgaggaggttatacaagataatcccaaagtttctGGGAAGCCA
-TCTTCCAGGAAATGATACCCTTCTACCTACCTCTCGAACGTATCTTTTTGGCTCTTGTGG
-CTTTGTTTTTCCCAACTGTATTCAcatttgtttaactcacaacaattcatcatttgctat
-gagccagacactgtgctaggtactggggatgtgttatgaggaagacatacaccagttgct
-cactggtggagcttaccttctaaagtgagaagcaagtaatgcacaggtaaacaaatgcat
-aaacaaagtaatttcaggtagcaataagtgctacgaaaggaaaagataagtagctgtgaa
-gtatagagctttagcttgagtggttcagaaggtccctttgagaaggaaacagtaagtgca
-aacgtcccaaggcaggaaagagcatcacaagtttgaagaaggaggccatggtggctgaag
-cactgcaaataaagggaagaagaggaagaaatatggtgggagaggtgggcagggcattca
-ggtcatgataaggaagctgggttttcatctgagtgtagtgaggaTATTTCCCATTGCTTA
-GCCTTCATGCCTTTCCAATCTCAGCCTCTCTCACAGCATTAGTTCTTCATTCTTCTTCCT
-AGTTCTGGCCTCTATCCATGACTTCATTCAGAGGGCTCACCTGGGCACACATATACAACC
-CTCATACTCATGCAGGACATAATTGAAACCCAACTCCTGCCGTCTACTACGCCAGCCTCA
-TGTAGGTCTCCGGTCTCAAGAGGCTTCCCATCCCAAGTGTTCACCTAGTTGTAGACTTAA
-CATTTATCCTTAACTCTTACTGTCTCTGATCCCCCACATCACACCTCTCAGGCTAGTCTT
-TCTGCAAACAACAGCAGCAGAAGCAAGAGTTAAGATGTTGAGAGTACTTgcactgtgcca
-cacactgaatgttcatcatctcacttaatcctcatgtcaacctgatgaggtagaaaccaa
-aagtatctcaccgtacagatgaggagactcaggttcacagagatcacaggccatgcccaa
-ggtcacatgccggagatggagcttgcatttcaacctgggccATTAGAGTGActctctctc
-tctctctctcttttgagacaggatcttgctctgttgtccaggctggagtgcagtggcatg
-atcacagctcattataaccttgaactcctgtgcttaagcgatcctcccaccttagcctcc
-tgagtagctaggactacagacatgcaccaccatgcctggctcatttttaatttagtagta
-ttattattactattattattattgtacagatggggtcttgctatgttgccagggctggtc
-ttgaactcctaggctcaagcagttcccctgccttggcctcccaaagtgctagaattacag
-gcAAAAGTTTTAATCATGCACTAAGAACCTAAGtgtatttgctttctattgctgcttaac
-aaaatcaccccacaatatagtggcttaaaacaacaatattttatgtttgtgtggattggc
-agtttggacatgtctcagccaggacagctcttttctgctccaagtggtctttcctggctt
-actcttacgtttgctgtcagtgaacaggccagcaaactggttagaactccatggcctcat
-tcacatgtctggcagttggttggggttgttggcttgagtgccttggttctcctccatgtt
-gcttcttcagtaagctaactcaggcttacttacatgacggcccccagaagaaagaaaaca
-aaagcagcaagatctcttcagatctaggcttagaaatgatatagcatcattttcactgta
-ttatatcgatcaaaggcagtcatatggccagctcagattcaaggagagtagaaatagatt
-ccatctcttcatgagaaaaacatcaaatcatactgcaaggagtcatgtgtataaggaggg
-tggaattgttgtggccacctttgcaaacattatatcacaTAAGTAATCGTAGGCATggaa
-ctggttaaagaaattatggtacagccagacatggggctattcacagcaatgagaactaac
-atttttgagcacttaatatgtgtcagacactgtacaagatgctttacatctattaactca
-tttaatcctcacaacagctctctgtggccagtacatttttaatccccattttagagatta
-agaacaccaagtctcagagaggttaaacaactagtccaatgtcacacagcaagtgacaaa
-gccATTGAAAAGAATGAAGACAGTATTATGTCCTGACATAGAAATCTGGCCCTGACATTC
-TGTTATACGATACAAAGCAAGAGACAAACAGTAGTTTGATCAGAAAACATTTAAAAAGCA
-CATTTAAATAATTAGGAGATGTGTGTCttttttttttctgagatggagtttcactcttgt
-tgcccagggtggagtccaatgatgccatcttggctcactgcaacctccgccttctgggtt
-caagcgattctcctgcctcaacctcccgagtagctgggattacaggtgcccaccatgccc
-agctaatttttgtatttttagtagagatgggatttcaccatgttggccaggctggtcttg
-aactcctgacctcaggtgattgcctgtcttggcctcccaaagtcctgggattacaggcat
-gagccactgcgttcagctGGAGATGTATGTCTTATAAAAATTAGTAGAATAAAAATTTTT
-ATGTCTTATAAAAATTAGTAggccgggcgcggtggctgatgcctgtaatcccagcacttt
-gggaggccaaggcgggtggatcacaaggtcaggagatcgagaccaccctggctaacacgg
-tgaaaacttgtctctactaaaaatacaaaaattagccgggcatggtggtgggtgcctgta
-gtcccagctactcaggaggctgaggcaggagaatggcgtgaacccgggaggcagagcttg
-cagtgagctgagattgcaccactgcactccagcctgggcaacagagcgcgactctgtctc
-aaaaaaaataaataaatacaataaaTTAGTAGATCTATATGTCTTATAGTTTTAGATAAA
-TTCAGGAAGAATTTACTACAAACTATTAATGGAGCTTATCTTTGAAGAGGAGAAAAGGAG
-AAAACTTTTATTTAAACACCTCTGTTTGTGTTGCTTGAATAttttttttttttttttttt
-ttttttgagacagattcttgctctgttgcccaggctgaagtgcagtggcaatggtcacag
-cttgctgcagcctcaacctccagggctcaagtagtccttgcacctcagtctcccaagtag
-ttgagaccacaagtgtgtgccatcatgcctggctaatttatttttatgttttgtagagat
-agggtctccccatgctggccatgctggtcacaaactcctgggttcaagtgatcctcccgc
-cttggcctcgcaaagtgctggaattacaggcACAAAGCCTGGCCTTCTTTGAATTTTTTT
-ATAGCAATCATAAATTTTTATTTCAATACCTTATAAAGAAGAAAATGCTTTTAAAATGTC
-CTTCAACTTGGCTCCCACCTATGTCtttttctatttggttttatttttattgttttttgt
-tttcttttttgATACCACCCCAGCCCAACCCCTTATCAATTCTGACCCGAAGTTTTGTGG
-CTACCTTGAGGGCCCCTCCTCTCTCCCTCTGTAGTTCATCCTGCCTGCTGCTGGGGGAAA
-GCTCATTAACCATCATGTTCCATTTTTGTCTAAGAGTTTTCAATGGTATTGCATTGTCTA
-CACAGAAAGTCCAAACCCTTTGGCCTTGTACATTGGGTGTTTGTAAGTTTGACTCCAact
-tggttggattccagctctgtcacttactagcagcatatagttggataagttattagatct
-ctctgagcctcaatttccacatctttttttaaaaaaatgaaagAAAAgaccaggtgtggt
-ggctcatgcctgtaattccagcactttgggaggctgaggtgggtggatcacctgaggtca
-ggagtttgagaccagcctggccaacacagagaaaccctgtctctagtaaaaatacaaaaa
-ttagccgggcatggtggcacatggctgtaatcccagctactcgggaggctgaggcaggga
-gaattgcttgaacctggaaagtggaggttgcagtgagccgagattgtgccactgcactcc
-agctgagtgacagagcaaaactctgtctcaaaggaaagaaagaaagaaataaagaaagaa
-agaaagaaagaaagaaagaaaaaggaagagagagagagaaagaaaaagagaaaagaaaga
-aaAGGATATAGCATTACATATTTTGTGGCAAATTAGATTACTGTTCAGTGACTGTTCACT
-TTCTCACCCAGCCAGGGGCAATTAAtattttcctgccccattaatattaggcttggccat
-atggtttgctttggctagtggaatatacatatcagttacaatgtgcaaattccagcctag
-gccttaagaggtctCTCTTGTTTTCAATTGGCTGTCTTAGAATTTTCACCTCTTCCTTGA
-AGGGCGAGCTGTCATTGGTGCCTTACATCTTTTGAAACAGACTTCCAATCAAGGCTGTAG
-TAGGCAAGTCTGAGATAAGAATAGTTCTTTACTCTTTAGTTTTAGTTTGCattaattaaa
-ttataatttataGTTTTTCGTGAACTCCATATTTTTGAATGAGCGGAAGCTAAAGAGGTG
-GGAAGAGAATGCTCTGTCTCAATTTGGGAAAGCAGTAGCTTCTGTCCAATCCTCCAGCAT
-CAAACAGGCTAGTCCTAGAAGAATAAAGGACACACATAGTAGATCTGAAATTGAGTCAAC
-CCCAGCAGAACCCAGCCAAGATCAGCCAAACCCAAATGACTACATATGAGAGAGGGAGAA
-ATCAATGTTTGCTTCTGTCAGCACAGAGTCTTGGGGCAGTTTGATATGCAACATTATTat
-aggaatagccaactaacagattcacatcatagggcttttttcagggttaaataaatgaat
-acaggaaacgccttaaaaatacactggcatatagcaagggtgtaatgcatgagaactact
-attATtgggggtgcaactgtgaacaaaacaagcccctgttctcaaggatcttatgttctg
-cggagagatgtatggaatggcagctggtgatgagtgttatggaagaaaataaagcaggga
-aggagagggagtgctgaggtaaaatttcaaatgtgatcatcaacaaaacttcaacggaag
-gtgaaacttgaccaaatccaagaggaagtgaggcggggagccagaaagtatgtgggagaa
-gattgtcccaagcagagagaattcggatgggcaaagaccgtgaagtaggctcatgcctgg
-tgaatttcaggaatggtcagtagatagggcagctgagccgagggagtgGCTGATCTCGTC
-TCGGCTCTGCTGGGGTTGACTCAAATTCAGGTCTACTGCATGTGTCTTTTGTTCTTCTGG
-GACCAGCCTGTTTGATGCAGGAGGTTTGGACAGAAGggggacaatgtctcagaggttcac
-aaggtactggattgtgcacagccatgtagggctatcgtgaggacttgcttctgctctgaa
-tgaggtggggagctatgggagggttttgaccaggtggagagcaggctctgctatgcattt
-ttataggatttgtccagctgctaagtgtggactagatggaccgggaatgagggctgaagc
-agggagaaaagataagaagctactaccacaagccagacaagagatggtgttgctttgaac
-caaagttggactccgaggttcttttcaaagtaaaatcaaaagaatttactgataggtgtg
-gtatggggtgtttgaggaaaaaaagaattgaggatgactccaaggcttctggcctgagga
-actgaaagaaggaatttgccagtaactgagatgaagaaggctatagaagagaacttcttg
-gggcagggggagaaagagaggaggaattagcagttccatttgcgacttgttaaatttaag
-tgagctatgagacttccaagtgcagatgactaatcagaagttagatgtatgaatctgagc
-ccaggagagaggtccaagctggagacgtaatttttgggagttactatgtactaaattttg
-tcctccccaaatttatatattgaaaccctaacacccaatgtgacactatttggagacagg
-gtctttaaaggaggttaaaagagatcatagagtgggccctaattcaacaggactattgtc
-cttacaggaagatgagatatcagagctcattctctccccatgcaggtgctcagaggaaat
-gctgtgtgaggacacagcaagaaggcagccatttacaagccaggcagagagccttcacca
-gaaaccctccctgacagcaccttgatctcagatttccagcctctcagtgagaggctgaac
-tgtgagaaaataaatttctgttgtttaatcctctcagtctgtggcattttgttatggtag
-tttgagcagactactactgagtcatcaacagagaaatggtttttaaagccatgaggggcc
-aggcatggtggctcacacctgtaatcccagcactttgggaggctgaggtaggcagatcac
-ttgaagtcaggagtctgagaccagcctggccaacatggtaaaaccccgtctctattaaaa
-atacaaaaattagctgggtgtggcggtgtgtgcctgtaatcccagctacccaggaggctg
-aggcaggagaattgcttgaacccgggaggcggaggttgcagtgagctgagatcgagccac
-tgcactccagcctgggcgacaaggaagaaactgtctcaaaaataaataaataagtaaata
-gccataaggctgggtgaaattgcccagggaatgagtgtagacagagaaggaggaccaagg
-actgcgccctggggcatccaacagtaagagacaagcaaccagcaaaggagcctgagaagg
-agcagccagtggggtaagtgtcctggggaccaagtgaaaaacgtgtttcatggaaggagt
-gttgatcccctgatcccctgtgtcagatgctgctgaggggtcagaaaagaaaagaacaaa
-gagctgatttacaaagtggaggacattgttttgacaggagagagtgtaggtaggttggtg
-ggaacaaaagtctgattggagtgggattaagagagaataggagaaaatataaatatagac
-aTagaaaggaaggaaaaaaggaaggaaggaaggaaggagggCTCtttttttttttttctt
-tttgagatgggttctcactctgtcgcccaggttggagtgcagtggtgtgatctcagctca
-ctgcaacctccgcctcccaggttcaagcgattctcctgcctcagcctcccgagtagctgg
-gattacaggtgcgtgccaccacgtctggctaatttttgtatttttagtagagatggggtt
-ttgccatgttggccaggctagtctcaaactcctgacatcaggtgatctgcctgcctcagc
-ctcccaaagtgctgggattagaggtgtgagccaccacacctggccTggagagctcttttt
-aagagtagaaagctgggccaggcgcagtggctcatgcctgtaatcccagcactttgggag
-gccgaggcaggcggatcacctgagatcaggagtttgagaccagccgggccaacatggtga
-aacccagtctctactaaaaatacaaaaagttagccaggtgtggtggtgcatgcctgtaat
-cccagctcctcaggagactgagctaggacaattgcttgaacctgggaggtggaggttgca
-gtgagctgagatagtgccattgcactccagcccgggcaatgagagtgaaactctgtctca
-aaaaaaaaaaaaaaaaaaagtaggaagcaaatgactaaatgtagaagaataggagttggc
-aaccaccataggagacaatcattaatggacactgcagtagtggattaaagtttgatgaga
-aatagggcatttgcacagtctgagaatatctccccccaagatacttattaattacaaagg
-gtaaaatagtaactttacatggagaaacacagccaacaccacttgaccaagtgataaagt
-gaacatcaccagtagcagggcaaattgacatcatgtggcttccgggatgatgcactgagt
-gggacgtcgcgtcacgtcagtgatatttctgccaaagaggcataattgactcatgaggaa
-gcattagaaaagcccaaagtggccaggcacagtgactcacacctgtaatcccagcacttt
-gggaggctgaggtgggcagatcacgaggtcaggagttcgagacaagcctgaccaacatgg
-tgaaaccctgtttctactaaaaatacaaaaattagctgggcatggtggcgtgcgcctgta
-gtcccaactactcaggaggctgaggcaagaaaatcgcttgaacccaggaggcagaggttg
-cagtgagccgagattgcaccactgcactctagcctgggcaacagagcaagactccgtcta
-aaaaaaaaaaaatgtccaaagtgaggatatctttgcaagagaaccttactctttaaaaat
-gttgaagtggtaaaagacaaaggaagactgaggaatagttttagatgaaggagaataaag
-taattacaactactgaatgcaatgtgagatcctagattaagaaaaaatcattttcactta
-ctacaaaatatattaactagatgagtggtgaaatttgaataagatctgtagattagataa
-tggttttgcatcagtgtaaaacgtcccgattttggttattataagagaatgtccttcctt
-ttaggaaatgtgtactggtttttaggcctgtaacttaccataaaagagttcagggttgga
-ggaaagaaaaataaatgataaagcaaagatggtaaaatctgggtaatgggtatttggcta
-ttctgtttttgtttttgagacagggtctcactctgttacccaggctggagtgcagtggtg
-tgatcatagctcactgcagcctcaacctcccaggctcaagcaatgctcccacctcaacct
-cctgagtagctgggaccacagttgcgcaccaccacacctgactcatttttaaatattttt
-tagagatggggtctccctgtgttgcccaggctggtctcaaattctaggctcaagcaatcc
-tcccatctcagccttccaaaatgctgagattttaggtgttagccattgtggctggtgaga
-tttgagtgttctttgtactactttgtaacttttctgtaagtgacattatgtcaaaataaa
-TTCTAACaagagagaatagaaggaaaggaagtagagacatggaggcagtgagtccaggta
-actttttgaggagttttgctatagaactgaggacaggtggcaggtggagagcaaaatggg
-gtcaagataagttgttcaaaggcagaaattgtagcatgtttttatgctgatgagagagat
-tcagtagattggaaaaaaaagtaataatgcagacagagagagagaagagagtggctagaa
-tggtgtctctggagagaaggatgggatctagtatacaaatgggggctttgaccttggagc
-acagatggctcatccatggtcacagaagggagggcagagtatttgggtaccagattggta
-ggtaggtagctgtgcagtggaaatgtgtggaaatgctttctgattgctaccattttccct
-gtgaaataggaagcaaggtccttggctaagagtgagaatgggggagaaggtgatggaggt
-ttgaaaagataggaaggaagtgtgtagggaaaatgaatggatctactgtgattgtcaggc
-agaacaaaagacaccactgaagctatcatcattcaagtaaagtgaggccagtctacatgg
-tggtgtgtttttctccagccacattccactgcagggggacaaacacagagggatgtggag
-ttggcaccaactaacaggtgtttagtcagagagggtcagggggatcttgggagtatgcag
-cacagtggggataaagttatatcatggctgtaatccacaaagaaggaagtgaggacaagg
-aaacaccaaggttcagagaggtttagtgacttacccaagcttgcacagctagtgaataat
-gagttggtctctgcatccaggcagtgtggctcaaagcttattctctcaccaacccagtat
-acacaggctgtccccagggtgtagcatagcatttggcacatgtagCCTCTGCTAACAAGT
-GAATTAAATTGTACCTGGGGTTCTCTCTGCCTTTCATTCTATGCCTCCGAAGAATACTaa
-ataaaataaaataaaacaacaacaacataaaaACCTAGCTTCTTCCTTGCCTTCAAGCTG
-TCTTTGATGTCTTAGTGTGCACGATGAAGGAGATGTACCATCAGTCTCCTTTGGGTGGCC
-ATTGGTTCATGCCTGCAGTCTGGCTttcagcaggtcattctcagcacatactctggggca
-gacactttctcaggttctcagtacacagcgggaaacaagtcagtattcctggcctggtgg
-agctcagtcaagtggggagaagataagcagacaaatctagcattgcaaactgggattatc
-gccaggagagacaagtgggcggggtatgagagtgcatgagagtaaagccgacctagtgga
-gggcgggaagaagagtttacccaaggaaggtcaggaggggtggcccatggggctgactga
-agaggagaaacagcatgggcaaaggtcctaagataggaacatgcctgttaatggcatatc
-aaggaggccaatgtggtccagacgtatatggagagggtggagggtgggagggaacatagt
-gggaaatgagatgggagaggttggcaggatccactacaccctgtagaggaatctgattta
-agaacaatagggtttaagcaggggaatgatttcgtaaggttttacatttatcagccaggt
-gcggtggctcacgcctgtagtcccagcactttggaaggctgagatgggcggattgcttga
-gctcaggagttcaacatggggaaaccccatctgtaaaaaaatatacaaaaattaggctgg
-gcgtggtggctcatgcctgtaatcccagcactttgggaggctgaggagggcagattatga
-ggtcaggagatggagaccatcctggctagtagtgaaacccctggctagatggtgaaaccc
-catctctactaaaaatacagaaaaattagccgggcgtggtggcaggcgcctgtagtccca
-gctactcgggaggctgaggcaggagaatggtgtgaactgggagatggaacttgaagtgag
-ctgagatcatgccactgcactccagcctgggtgacagagcgagactccgtctcaaaaaaa
-aaaaaatatatatatatatatataaaatacaaaaattagcagggcgtggcatcatgcacc
-tgtattcccagctacttgggggctgaggcaggaggattgcatgaacccaaggagttgagg
-ctgcagtgagccgagatcaccccactgtgctctagcctcaatgacaaagtgagatcctgt
-ctcaacaacaacaaaaaaaattttttttatttataaaagacctctttggctgctgggcca
-ggagcagggaggacaggaggcaggggtaggagtggaggtgtgggaggagaggaagcagga
-gaggagtggaggtgtgggggcaggggaggcagtgggtgggccaggagagaggtgatgtgg
-catgggctaagatggaagcagtgcagataaagagaggtggattgacttgggacatatttt
-ggagctggagttcacCACAGGGAAACTGAGGCCCAGTGCTTCCAAGGATAGCGCTCCAGC
-TCTCCCAGCCCAATGGAAGCTTTTAGATACTTCTGCACTGTGGGGGTCACTTGTGGGTGG
-TTGCATTGGGGGACGAGTGGCCAGGACAGGTGACCTCTGACTTTTGTCTGGTGATGCGTG
-AGTCTCAGATTGGGCTTTGAAGGAGCCATGGGTACCTTGCTGGGCAGGTGGAGCATGTCC
-TTAGAGGATCATCCCACCATCCTCACgtaaccctgcaggtctcttctctctgagtcatag
-ttctcacacttgtaacatgaagagggacagtacccacttAGGCGACATCACCCCCTTCTT
-ACAGATGAGACAACTAggccaggtacagtagctcatgcctgtaatcccagcactgtggga
-ggctgaggcaggcagatcgcttgagcccacacatttgagaccagcctgggcaacatggca
-aaactctgaatctacagaaaatacaaagattagctgtgtgtggtggcatgcgcctgtagt
-cccagctacttgggagactgaggtaggaggatcacttgagcccaggaggtggaggttaca
-gtgagctgagatccaccactatactccagcctgggagacagattgagactttgtctcaaa
-aaacaaaaacaaaaacaaaaCCACCACCACCACCACAACAAAAAAACCCAAAAGAAAaca
-gatgagacaactgagcctcagtgaagggaagtggctctttagggtcatacaggagtaaag
-acacagccaagactagcacccaggctagagcctgggctgttgacctttctgcttcatcat
-ttgccTCCCATACCTTTCCTGGGCTCGTCAGTCCTGGGGATGCTCAACTCACCCAACACT
-GTGTTTCAAGCCCAGGGAATCCAGGATCGGTtagttcagtggttaggggtatgggctgct
-tggattctatttccagcgccaccaaggggccttattctgtctgaaccttggttttctcct
-ctgcaaaatggggctaacagtgcatacccttgtagcactgttacaaggtaggggaactgt
-acagatgtaaTGATTTGTGTATGTGAGTCATTTACAAGCCTTTGGAGTGGCTGGCACCCA
-TCATTGTTTGCTGTTGCTGTGATTATCATGCCATTGGACTgtggcttgaaaccctacagg
-cccaaggctccctttaatagtagttataatgcttcttttctaaaataaaatacatgaata
-acataacctgctgacgcacataattttttttttttgagaccgagtctcactctgtcatcc
-aggctggagtgcagcggcacaatctcggctcactgcaacctccgcctcctgggttcaagt
-gattatcctgcctcagcctcccgaataggtaagattacaggcgcatgccaccatgcccag
-ctaatttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcgat
-ctcttgacctcgtgatccttccgccttggcctcccaaagtgctgggattacaggagtgag
-ccaccgcgcccggccatgcatagttttaaacataaataatgtcctagttgtaatttaaaa
-gaaaataaagtgaaaataatttagaataaattaatatgtaaatgttccaggacaatgtgt
-agaaaccatcacaaagtagttgggtgggctctgctctgggtggaatcattgagaatctgc
-aggctgaattggtaacgccgcactggcggcacatgcactgtgactgcatggctgtgatag
-tctgaaatgtgagcagtctaggtaaagttctgaaccaaacacaatccattctgttcccaa
-tcgctacagactaaatgtttgtctcccccaaaatcttacgtcaaagcctaatccccagcg
-tgatggtattaggagatggggccttttggaggtgattaggttatgagtgcagagccctca
-tgagtgggattagtgcccttataaaagaggccccagagagctctgctgccccttctacca
-tgtgaggacacggtgagaagccatctatgaaccaggaagcggtcttcaccagacatggaa
-tctgccagctcctggatgttggacttgccaggcttcggatctgtaagaaataaatttctg
-ttgcttataagccaccagtctgtgtaatttgttacagtggcctgaactgactaagacacc
-aatttatgtgaaggttgctttcctggcagagtcgctgttattaaaaccaagcaaaCACac
-attgtactggaaaaggcaaaactatagagacaatgaaaagatcagtggttgccagggctc
-aggggaggggagagagggatgcacaggtggagcacagggcatttttagggcaggggacct
-cttctgtatgatgctgtaatggtagataaaggatgtatgtacttgtcaaaacccagcatg
-ggccgggcgcggtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcgga
-ttgcctgagctcaggagtttgcaaccagcctggcgctacagaaatcctgcttcaaatcca
-gaaaccccgtctctactaaaaaacacagaaaattagctgcgcgtggcggcatgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaatttcttgaacccgggaggtggagggt
-gcagtgagccgagatcgtgccactgcactccagcctgggtgacagagcgagactctgtct
-caaaaacaaaaaacaagcaaacaaaaaaacaaaaaaaaacaaaaaatccccagcatggta
-gaactgtgcaacacaaagagtgaactgtaaggtaactgtggatttcagttaataattgtg
-tgtcaaaattggtttatcaattgtaacagatgcaccatgcatttgcactaatgcaaaatg
-ttaataacaggagaaactgcatgtttggagaaggagtacaagggaactgtctatgatttc
-tgtgtcatttttctttttcttttctgagagagggtcttgctctgtcccccaggctaaagt
-acagtggcacgattagagtccactgcagcctcaaactcctaggttcaagcaatcctttag
-cctcagcctcccaagtagctaggaccacacacatgtgccaccatgctagggaaattaaaa
-aaaaaaattgtggagacaggttcttgctatcttgctcaggctggtctcaaactcttggcc
-tcaagcaatctccccatctcggcctcccaaagcactgggattacaggcgtgagccagtgt
-gcccagtctctgcacagttttgctctaagtctaaaacttctctaaaaaagtagtctatta
-aACATAAAAAACAAAATGAAAACCCCCacacattgtgtttatatgtaaaatagaattcgg
-tccttggctcagataattaaaaacaaggtttttacctacactaattaccaaagggagatt
-tgaaaatcatgACTTGAGATGCACTGCAGGATGTCTGCACCCTTGCTCCCCTCCTGCATG
-GCCGGGGCACCCCCTGGTCACTGGGAACTCTCCAACACTCTTGGTGACATTGCCCCCTTG
-AGGATCTCTGCACTGGATCTTTGCTCCCTCTCCTGCAGAACCCACAACTGCTGACTTACT
-GATCTTGGGTGATGTCTGATTAAAAAGTCTCCCCAGGCTTAGGAAACTCAAGGTGCCACT
-GTGGACACAGCTCCCACATTTCAGCTTccagaaatcctgcttcaaatccagatcccagca
-ctccctcattatgtggacttgaatgagtcacatcaatttattgagcttcagtttccccat
-tgatgggaaaaagggtgattgataatacctgccatactttatattcataatgaatataat
-gagtatattcattaactcagtaaatatatattgaacacctactgtctgtgctgagaattc
-aacagcgagcagaacaaacatctctgccttattggagcttatggtctcgtgatggggaca
-gacaaaaatcaaacaaatatatgagataatgtcagtgataaataaaaataaggcagagtc
-acagatggaaagagggtagggcaagggatccttggtaagtgtcgtcctggatggcttccc
-agaggagatggcatttgaacagggctgggaatgaagtgaaggaacgtgccacgaaagtct
-cagggcgaagaggcaacagcaaacaccaaaaccctgaggtgggaatgtgcttggtgaatt
-cgagaaacagcaaggaggccagtgaggccggtggggagtaagagggaagagaaagtgagg
-acagagagatctggagaagccagactctgtaAGGAATTGGGGGTTTATCCCAAGTGCAGC
-AGGGAGAAAACTTGAAGAGTTATTTACTGGGGAAGGCTTCCTGTGTTGTGTGCCCTTGCA
-GGTGAGAAAAGGTGATGAGCCCACTCTAAAGCCAACTCTATGGCCCATGACCGTGGTCTG
-GGACACTTTGAGCAGAAAGCGTCCTGTTCTCCTTGGAGTCAAAGGATTGGTGACAGTGTC
-TGCCATGCTGTAGTTTCCACAAAATACCACCAGGTGACGACTCTGGGTCACGCTTCTAAC
-TTGTGGGTTCTTGATTcctggagggcttttgctaaaacacagactgctcctggccccagc
-cttccaaagcgctggattacaggtgtgagccaccacacctggccTGACAGCCATGTTTTT
-AGCTTTTAAAAGCAAAACTTTGGCATTAGCACTATctctgtgagaggggccgatcattcc
-tgttttccagatgggtctatgaggctcagagaggagaaatcattgtctccatgagcaaaa
-gtgataaaactggcactcggcccccatgtctgcctgacttcaaggcccccaatccttcAG
-GGATGCCACACccatgtgcccagtgaggctctgggaattttaaaaactcatccaatttaa
-tccttacaactgaacaaatcccatgcaacgttaatgtctccattttagagatgagaaaac
-tgaggactagaactgagaaataagtcacctgatgtcgctgagctGTTCTAAGGCTGACAT
-catgcattttggagtcagagagacctgaatctcaactctagctcacactctccctagcta
-tgttcacctgatttctctgagccacagtttaagatgggaataagagcccctcctgcttgg
-tagctgtTGGTAATATTTATGAACAAATCTAGGCCTGGGGCCTCTTAGGCTTACAGTGGC
-ACCAGCCTCTTCTGTTCTGGAATCAGGAGGGAAAGTGATTGACCCGGCATTGGCCATCCC
-TGGCCTGGCTGGGATCAGAAGGGTCCTGGAAGGATAGGCAGTACCCGGCAAAGACTGGGG
-AGGGAGCTTGCTTAGCAGAGGTGTGAGGGACCTCACAGGAGTCCCCACAGGGTGTCCAGG
-TAGGCATAGGTATGGACGGCTGGACAGGGACTCCAGTTGGCCAACCAAGAACAGGGATAG
-AGCTTGGGCTTTGGGGTCAGGCAGCTTGAAGctctgggttccagctcccagatctgtaaa
-gtggaacagtaatgactcttccctgttttggattattgagaggaCCCCGGGGAACAGTGG
-GCTCAGCTGGAGGGATGACATTCTAAAGTGTTCTCTGGGACCTTAACCCCAGTCTCACAG
-GAGATGGGCCTTTGACTGTGGCCTTTCTGAAACCTGAGAATGTTAATGGTCACATAACGT
-TAGTAACAGTGATGGCAGATAACATCTGTCATGGATTAGAGGCCACTGGGAGGTTCTCCC
-TCACAGTTCTGGGTTCTTTGGATCAGAAACATGGCACAAACACACAGCCAAGGGTGGTTT
-AGGGCCTTGCAACTTACAAAGTCCTTCCATAGCATTGCACTGCACCCTGTGTTAAGATAA
-ATTCTCCAAGCTTTaagcactctgctaagtgcttgacaggccttattttattcttccaaa
-acactttgaagtgggtgttgccttgacccccattcttcagctgaggaaatgggaggcata
-gtgaggtcaagtgacttgcctaaggctactcagctggaacgtagagcgcctcatcccatg
-cttgactctgaGTAGAGCAAGGGTTGCACAGCAAGTCAGAGGCTGAGAGGGCCTTGGAAG
-GACCCGAGGCTCCCCTAGCCACTCCTGCCTGGCACCGATTCCTCCAATCCCACCTGGAAG
-TGGCTGGAAGTGAGAGGGAGAGGCGGTAGGGGTGCTGAGCCTGAAGGGAGGTTTCAGGAC
-TCAGGCTAGGAAGGCAGAGAAGGAGAGGAGGGACGGAAGTGCCCCTTCCCCCTAGAGCCA
-CTGAGGGGAGAGATAAAGGCATGAGGAGATGTAGCTGGGGCCAAGACAAGGAGGAAGAGA
-AGAGCTCAGGAGCTAGAAGGAACAACTATCTGGGGAGGAAGCCCCGTTCCAAGAGAGAAG
-GCCAGGGATGGGAAGGGGTGGGCCAGGCCCTTGGGCTGGGGTCCTGGGTCCCAGTTTTAG
-CAGGTAGCAAGACCCCGAACTGGATAGAGGGTTGCCTTCAGTAGATACCCTATCATTCCT
-GTGTTATGAGAGGTTGGGGCCACTTGAGGTGAGCCCAGGATTCAGCCTTCGAGGCTCAAC
-ACACTTGAGTCCAGCTGAATGACAGAATGAGCCATAGGACACTGTCCCAGGCCTGACttc
-cttccttcaacaaatatctatggaggattcaccaagggccaggctgggctcccagcagga
-aacaaagtccctctgaagagagactaacaccttcgttaaggagcccccaatctcatagga
-gagatggacaaaaagcagaaaatgaattggtatccagtatcacttttggctgtaaaggtg
-atcaggggaaaatgaatggattggagtctacctattttgtgatggcggtcagggagggcc
-cctctgagaaggtgtcatctgcacagaggcctgaaggagatgaggcagtagctatgaatc
-tgggggaagagcatttcaggcaagcgcaaaggccagggcaaaggccttgaggcaagaaga
-tgctgctgtggaggaaggagggcaccaagcaaggaggccagtgtggctgctggtgagaga
-taagagagtgaaggaagatgagggtagagtccggggggcagatcacatagggcctcaaag
-gccactctatggattttagctgcatctcatgtgacatggacattgaaggaTTTTTATGTG
-TGTGTGTTTGTTTGTTTGTTTGTTTttgagagggattctcgctctgtcacccaggctgga
-gtgcagtggcacatctcggctcactgcaacctccacctcccacattcaagcgattctctt
-gcctcagcctcccaagtagctgggattacaggtgtgtaccaccacgcttggctaattttt
-gtatttttagtagagacagggtttcaccatgttggccaagctggtcttgaactcctgacc
-tcaactgatccacctgcctcggcctcccaaagtgctgggactacaggtgtaggccactgt
-ggcctgtgacattggaaggttttgagcagaggtatgtgttgtgacctgactcaggtttta
-ccagaatccccctgagagatgttctggccaccactgaagaagactggagggtagagcagg
-caagggctgatgcagggagcccagtgaggaggctGGTCAATGAGCACAGCAGTTTGGCCA
-ACGATCTGGGGTGCTAAATATCAACAGAAACAAAaatatttattgcatgctttctgtggg
-tcacaaactattctaagtggttgcttgacatggaatgcttttaatcttcagtacagattt
-taggtagatcatatttttgtACATTTATGTCTATTTGTCTCTGGACTGATTtttttttaa
-ttgagatgaaattcacataatataaatcaaccatttgaaagtatacatctcagcggcatt
-tagtatattcacgacattgtacagccacacttctgtctagttccaaaatattttcaacac
-cccccccaaagaaactttgtacccatcaaagatagatgatatttttatcctaattttaca
-gatgaacaagcagaggcgtggacaagcagagtcacgtgccccaggtcacacagccaggaa
-atggaacaagctggCCACAGGTGTTGGGAGGAACATGTTGACAAGCTGCCCAGGATGGCC
-TGGAGGCCCCTTCGGGGTCCCCCAGGTAATAGCACCAAACTGCCttttatttttatttat
-ttattttgagacagaattttgttcttgtcacccaggttggagtgcaatagtgcaatcttg
-gctcactgcaacctccgcctcccgggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgtgccaccatgcctggctaattttttgtatttagtaaagacag
-ggtttcatcacgttggtcaggctggtctcgaactcctgacctcaggtaatccaccgcctc
-tgcctgccaaagtgctgggattacaggcgtgaaccatcatgtccagccCAAATTGCCTTT
-TAAGAAGGGCATGTCagccgggcgcggtggcttacacctgtaatcccagcattttgggag
-gctgaggcgggcggatcacctgacgtggtgagtttgagaccagcctgaacaacatggaga
-aacccgtctctactgaaaatacaagattagccgggcatggtggtttatgcctgtaatccc
-agctacttgggaggctgaggcaagagaatcacttgaacctgggaggtggaggaggttgcg
-gtgagccgagatcacgccattgcactccagtctgggcaacaagagtgaaacaatgtctca
-aaaaaaataaaaataaaaataaaaataaaaataaaaaAAAGAAGGACATGTCCTCACTTC
-TGGGCTTTTGTTTTGTGGAAGGGGTGGGATACATTTGAGGCCAGAAAACAGAAAGCACTG
-GGAAGGCTGAACAGTGGCCCCTGCACCCTCTCTcaggatggtgcacagaggagaatgggg
-actctggagccaggctgttgagttcaattcccttctcccacctttcttccatgttgtgaa
-gttgggataataagagcaccaatctcatcagtgttgggggaaagtgaatttcccatcagt
-agagctcagcactgcccgtagtatttgctcaatcaaCAGCAGCCTGCATTCTCTTTGCTG
-CCCTCTCCACTCCAGGAAATAAGTTAAGCAGGTACCTAAATGCAATCTCAGTGTTGGGCC
-TCGTAAAACATCTGGGACAAGACATCCTCCATTACCAGAAAAAATGCAGTCATAAAAATC
-TCAAGGTTGACAGGATAGTGCCCAtttttatttatttattattattattattattttgag
-agaaagcctcactctgtggcccaggctggaatgcagtggcacgatcttggctcactgcaa
-cctccacctcccaggttcaagcgattctcctggctcagcctcccgagtagctgggattac
-aggcacctgccaccacgcctggctaatttttgtatttttaggagagacagggtttcacta
-tgttggccaggctggtctcgagctcctgacctctagtgatctgcccgcctcggccaccca
-aagtgctgggattatagatgtgagccaccgcacccggccCTGATACCCATTTTTAAAAAT
-CACATACAATCAAAATTCAGGATATAATTTACATAAAAACAAAAGCACTCATTTTGTCCA
-TCCCTTGCTTTGGGTTTATCTACCGGTCTTGTTGACTCCATTGCTAATATACATCCAGGT
-CCCATCCCATCTTCCCAACCTTTCCCAGTCTTTCATCCTTCAGCTGCACCTCTATGGCAA
-GGAGCCACCTCATGAACATCAGTTTCAGACTTGACAGCTGATGGCCGGGGGTGCAcatgg
-gcttgtggagacacggtcagggagccctgggtctacacctgagtctgcctgggccgctgt
-ccgttgtgtaatcttcatcaggccacatcctctctctgagtctcagttttcttttcctta
-aattggagatgaaaaagtctgtctcacttggcagtcaagaaggtccaacaggataaCTTC
-ATCCATGGTGAGAGAGTGGAGGAGAGGCCCCCAGGAGGAGGCAGGGATCTCATTCTGCGG
-GTACTGTACTTGGTTCTGGGAGTGGGATGGCAGACAAGCGTGTCACTGTCTTTGTTCTCA
-GAGCTTTGGTTGTGGAACGGGAATGGGAAGGTAAGGGAGGGTACCCCTGGCAGGGGCACA
-GCATAAACCAGGGTGTGGAGATGGGATGGCGAGGCAGGACTGCCCCAGAACTCTGTCCCC
-AGGGGCTGGCAGTGCTGAGAGGGACAGAGGGAGAAGCGATTGTTTATTCTCAGCCTCAGG
-AGGACGCAGGAGAATCTCAGGCATCAAATTTAGTGCAGCACACCTGCCTAGGCAAAACTG
-GACAGCTCCACCTCAACTTTGTAGAGGGGCAGAGAAAGCTGTGGGGAACCACCTTCCTGC
-TCTTGTCATGAAGTCCTCCTCAACTGGAAGCCCAAGCTTCAGGCCAGGAACTTCCCCAGC
-AGAGGCAGCCTTCCCCAGGGGGCCAAGACCTTGGCAGAATGTCTGGGGTGCTCATGGCAG
-CGCCTCTCACCTGGCCCCTGCCAAATCAGTTTCTGCTTGGCCTCTGCAGGATCTGACCTC
-GTTGAGTCCCCAGGGCCCAGTTCTCTGCCTCTGAGGCTAAAAGTGAGATCGTTTCCTGGT
-TGAGGAGTGACTAAAAGACTTCTGTGTgtagagactgggttttgctgtgttggccaggct
-ggtctcgaactcctgaccccaagtgattcaccTTAAGGTGAATGTGTGGCTGTGTACGCG
-CACGTGCAGAGCAGAACCATCACTCTGCTTGGGCTAGGCAGCTGGACTAATCGTCCATTT
-CCCCCCGCCCGGAGGCCTCTTCCAGGCCCCCAGCTGCCCTGATGGGCCAGGTCAGCCCCC
-CCCACAGGAGCCCCCAGCCGCTCCCCATTCGGCTTTCCTTGTATTGTGCGCTGCCTGGTT
-TCTCGAGGAAATGGGGCGGCTGCTGGGTGCGGGGGCGGCCGCCAGCAGCCCCACCCCCTT
-CCCCCCATTGTCACTCCTGGCTTCTGCCCCTAGCCCCTGCTGCTGACACTAAAAATAGAC
-CTGTTCACAGGGAGACGGCCCCACCCCTGAGCGGGGCCCCAGGCTCAGTGTCAGGTTGGG
-TTTGCCAAGACAGAGCTGCCCTGGGGACTGAGGTGGCTCAGCTGAAAGACCGGGGTCGAA
-ACACGTTAGGgctgtgtgaccttaggtccccttttctcctctctgagcctcaatttcctc
-acctttaaaatggggtaaggctacctacctgctaaggttgctCTTGACAATGAACAGAAG
-CTGGGTGAGTCACAAGCGCACTTCGTTCTCGTCCTGCCCGTGGTTTGGTGCTGCCTGAGC
-GGCTTGAGAACCTGGAGGACAGATGGCATAACACACGCCTTCATCTTCAATCTGCCTTGA
-ATGATTGCCAAGGACTTCCAAATCCCCCTAAACAGAGGAGCTGGAAGAGCCCACTTGGGA
-ATCCAAAAGTGTCCGCAGCTCTGCTGTGTGAGCCCGGGTAGGTGCCTCCTCTCTGGCATC
-CATGagctcacacgtgaagtatgcagccaggctgggactcgaacctgtgtctgcagcctc
-tgaagactgttttttccgctttaaggggctgcctcCATGCTGATGACTCCAAGGACTTCC
-TGGCTGGGATAACCCTGCCTTTTCGTCTACAAACACATGATTCATGGTGAAGGAAGATGC
-TGGGCGGTGGGCATGGAAGCCTGAGCTGGGGGCTGGGTAGTTCCCCTTGAGCCCATGCAG
-ATGGGCAGCTGTCCTCAGATGCCACCCGCAGCCATTGGGTTGGGCCCTGCAAAGGAGATA
-CTGGCATGTGTCTGTCTACCAGGCTCTTTTTTGTTGTTGTTCCTTTGTCCTTTTTTTTAA
-ACCATGGAATATTTCAAATATGGGTCTTTCATATACATTCAAAACCTTGAACTCTTAGAA
-TTACTTTTGTCACAGTTGCAATTTTTTTTTAAAtttttatttcatttgtctatttatttt
-ttgagacggagtctcgctctgttacccaggttagagtgcagtgacctgatcttggctcac
-tgcaaccttcgcctcccaggttcaagcaattctcctgcctcagccttccaagtagctggg
-attacaggcacgcaccaccatgcccagctaatttttgtatttttagtagagacagggttt
-taccatgttggccaggctggtcttgaactcctaacctcaggtgatcggtccaccttggcc
-tcccaaagcgctgggattacaggtgtgagccagcgtgcctggccTGCAATTTGATATATG
-TCTATGTAATTACCTATCTCCCATTAATCCTGGGCCCTAGAACAGGGACTGAGACTTTAT
-TATTAATCCATGTATTCCCCCCCAAAACAAATACAGTACTGTTATTCTCCCACACAGACC
-CTGAGAGCAAGCAGACTTGTCTCTATTGTTTGTGTTTTGGGATTTGTGGGGACACCTTGT
-GACCCAGTTTTGTTGTAAATCTTGTCCATGGGGTTTTGGTTTTGCTACCTAATTGCTTTG
-CCAATTTTTATGTGGGGATTTAGAAAGATTTAAAAGCTGAGTTTTCCACTGCAGACATAC
-CCATATTCCCGAATCTTGACTCTTTCTAAATACATATGTACATGAGAAAAAAAAAATCAG
-CACTCAAGGTATTCAGTGACAGGTTTCTCTCAGAACCTGGAAATGCTGGAAATGACCACT
-GTTGCTTAGTCGGGGCTCCtttctttcttttttttttttttttgaggcagagtcttgctc
-tgtcgcctaggctggagcgcagtggcgcaatcttggctcactgcaacctctgcctcccgg
-gttcaaggaattctgcccaagcctcctgagtagctgggattacaggtgcatgccatgact
-cccggctaattttcgtatttttagtagagatggtgtttcaccatgttggccaggctggtc
-tcgaactcctgacctagtgatctgcccacctcggcctcccaaagtgctgggattacaggc
-gtgagccaccgcacccagccTGAGGCTCCTTTCTTATATTTTATGTGTATCAAGCAAACT
-TAGGTACCTGGTCTAGTTCTTACACAAAGAGTGTACTTCCCCACTTAAAAACGGCTACAT
-TGggctgggtgtggtggctcatgcctgtaatcccagcattttgggaggctgaggcgggtg
-gatcatttgaggtcagaagttcgagaccagcctggccaacatggtgaaaccctatctcta
-ctaaaaatacaaaaacattagcccggtgtggtggcagatgcctgtaatcccagctactct
-ggaggctgaggtgagagagtctctcgaacccaggaagcggaggttgcagtaagctgagat
-cacagcactgcactccagcctgggtgacagagcaagactctatctcaaataaataaataa
-ataaataaataaataaataaaataaaATGGCTACATTAAAAGTAggatttttagcttttg
-ttccatagacctcttcggcatatggtgaagtggggatggaccccttctcaaaatgtggtt
-tttttttaattagtctttttttttttttttttcaatagaggtggcgtctgactatgatgc
-ctagcctggtctccaactcctgggctcaagtgatcctcctgccttagccttccagacagc
-agggattacaggcatgagctactgcacctggatttttttttaatgttttataaatgcata
-aaataaaatgcacgatattacaaaggaaaccaattatactgaaatgctattactgcaata
-taaacaagggtttgtgatgcagtgatgaggtgaacttctttattagtacattaaataaca
-agatggggaagcaggttgcaggtcaccatgaacgtaaacaatatgtaatgttatctgcaa
-ccactgtgatatgaaatgaaagtatctttgacttctgttgtaacagtcactgctaaccct
-accatgcttcttgatccacattcatacttgaaggaaatgctgcatttcaattagaggtta
-gtgaatataaagttattttttcccacctaagttcatgaagtttctgagttctagatcagg
-taaagaacccctgCTAAAAATTGTGGCTGTCCCTCACTTGATTCAACCAGTCTCTTATTG
-AAAAGTCACCCCacctcagcatttcttcaaatctcatccttatgcagttggggaaactga
-ggcccaggctggagaacaaacttgggtcattctgccctggggggattgcagaatccagtg
-tcctgattcccggctcaggttattttccagctcctcccctaccagGCGGGTGGCAGGGAC
-CCCCCCTCGGCCCCACCTCCCTGCTCGCCAGGAGCAGCTGGCGTCCTGTCCCGAGAGTGA
-CCCAGCCCCGCCCCGCCCTCGCCCCACCCTGGCCGGCCAGCTGTGGATGTGACAGGAGGC
-TTGGCTCTGGCTCACTCCGGCACATTCCTGGCCCAGCCACTGTTTTCCTCTTCTTCTTTT
-TTTTTTTGGTGGTGACTTTTTCTCCCATACCCCTCCCACTCCTTTTCCTCAAAAATGCTG
-TGTCTTTCCCCAGAGGGTCCCTCTGGGCGGCTCCGGGAGGGAAATGTGGCCTGGATTTCC
-TGGAACGCGTGGAGCTGGAGTCTCAGCGCTGGGAGGAGGGAAGCTGTTGGCAGCAGGGCA
-CCCCCCCAACATAACTGGGCCTCCCTGGAGAAAGAGGGTGAGCGGAGCCTCAATATTCCC
-TTTGCACTGGGCCCTCTGAGCAGTGGCACCCGCAGCTGCAGCGAGTGGGCTGCTGCCTCG
-GGGATAGTGAGACGCCTCTAGGAAACCGCGgctctgtgatcttggggaagctgggcattc
-tctctgagcttgggtttccttgctccttagaactgaggatgtgatctggatctgccacag
-ctggtgggacagtccagtgaggcgatggctgtaCATGGTCCCTTTCCAAACAGGGAACAA
-GAAGCGAGGTGTTGGGGGCATCTGGGGATGCAGGTTTGGGGGCTGCATTTGGGGCAGCAG
-GGGTGGAACAGAGAATTTCCATCCTTCCTTCTTACCTTCATTCATTCATGAGACAAACGT
-GTATCAGACAATTACCATTGTGCCTCTCGGGGCTCacaataagagacaagtaaatgtctc
-ctgtaggggcaggtgcagatgagtgctctaagaaaaagtgaagcagggtGCAGGGATAGA
-GTTTCTGAGGGTGCTGGGGGGAGCTGCTCTGCTGGGGCACCACATGAGCccaggcagagg
-gagcagtgggtgctgaaggctctgaggtgggagcaagcaaggaagggaagagaaggcaag
-gtttgtgtggagtgggggagacagcagagagggctgtggggacttctgggtgaggcgagg
-actttggctcgattcatgggaagctacgaagggctttgagcctgcagtgacacagtctgT
-AAAGGACCCACGGGGCTCTACAGGAGGTgcgcacgtggaggagtgacttggaggccaagc
-agctggggtcctggcttcagctcctccctggctctgtgagcgtggacaggatgcttctcc
-ttgagcctcattttcctcctcagtagagtgggctcatggagctctgaagactaagaggaa
-gggTCATCAAAGTGATGACCCTTTGCCATCACTTTGCCTGTGAGCTACAGGTCTCTATAA
-GTGGGAGCTGTTTTTTTCTATGAGCCTCTGAGGATTGGAGCCACTTGCTTAGGGGGAGGC
-TTTGGGGACAGAGCCAAAGGCTGGTTCCGAGCCCAGGTAGAGCAGTGGCTGCTCAGATTT
-TGGGGACATGTGGTGTCATGATCTGGGAGGGGGATATTCTTGAGTTGTCTGCAGCCCTTT
-TCCCCTTATGGGTACGTGGCTGGATTTAGGGAACCCTAGGGCAAGGGAAGAAGGGCTAGG
-AGCTGCCCCTGAGATCTGTGAGATGGGAGGTGGCCGGGTGTTCAGAGGTTCTCTGAGGTT
-GCAGAATGCCCTGTCAACCACTCTCCCATACCCAGAGGGGGCTGGACGCATCCCTCTCtc
-ccttgtcctcagtctcgattttctcatctgtgaggtgggcacaacaagtcctaatcctgg
-cagTGATAGGAACGTTTGGGGAAGCAGTGATTTGTCATGCATGATGCGGTCGGACAGGAC
-CCTGCCCTTAAGAAGGAGGGAGCCCACCTGCCCAGGCACTGTGCTGAGCTTCTGTGCATT
-AGCTGAAAGTGGACAGGATGACGTCACTTCACTGGAACTTTCTGTGGCTTCTCTTTGCTC
-TCCTATGGAGGTTCCATGGGAGGTAGGAGCTGGGGGCTAAccctgcataccttataaacc
-tcaactctcacatcctcctggctttctgtgtccaggttcacaggcctcctgaatctccct
-ccttaatgcccacgttgttctggcctctgagacattgtgttactccctgaattccttcct
-cttgccctagtaaactctccctccctgctcagctcagtttaactatctcttcctagagga
-agcccaccctgtcctgtagactaggctgagtctcacattgcggcatcttaaggtgctgcc
-tcctctcctggtaacacctgtcgctgttgtaatttcacaggtgttgctgcaattacctgg
-ttgctgactctccccacattaggactgtgtgttccatgagggcagggacgttttctcgat
-cacagccatatccccaacagtaatagcaaattgcagatgctcaataaatgctttctggat
-aaatggaGGGGTGAaatcattttgacaatcagaagaagaaggtgccccccttttacagat
-aaggaaccaaaggtacagagagattaagtaacatgccccgaggtcacacagccagaatca
-gatggTGTCTGTCTGGGAATGTGTCCCTGCAAGCCAGGCCTAGAAGGTGGGCAGATGGGG
-TTACGCAGAGAGGAGCTAGGACCATCTGGATAAGGGAGGGTTGTGGGGGCAAGCCCCACC
-CATCCTTGTTTTCTCCATTCGAATAGTGGTTTGTGGCTGTTTTCCTCAAGGGCGACTCAG
-GTGACCTTCAGGTTGGGGCCTCCTGGGTCCCAGGGGCCTGCTGGGTGGAGGGCCCGGTCT
-GGCTGGGCTGCTTTTCTCGCCCCTTTGCCGGCCCGCTGGCTTCACGCACAGATTACAACT
-TCCCCTCTTCGGCCGTCTTACGCAGGCCACCTCCGGCTCGCCATTGTCTCATTGTTTGCT
-GAGGGAAGCTCCAGGAGGAAATCAACCTGCTGCTCACCCCAAGCAGGGAGTTTCACCCCC
-AGCCCCCACCCAGGGAATGCCTGGGGGGAGGGCAGGAGGGGTGGGGGCAGGTAGCAGGCa
-atgcaacaggcagccttgaagggagtgagctccctggccgggaagtatgcaagcagaagc
-tacatTCACAGCACCTATTTACTAGGTCCTCTCCCAGGCTGCACGTCAGGCAGCTGGAGA
-CACAGATGCTAGAAAAGGGTCTTGTCCTTAAAGACCCTGTAGCCTAGAAGAGATGCTGGG
-CAGGGCCTCAAAGCCAAATGCCTTAGGGGCCAGACAGGTGACAGAAATCTGTAGGCCTGC
-GAGCAATGCTGAGTGGTCGGGACGTTAAATGAAAACTATGGTGCGAAGGAAGGCTTTTAG
-ATTCCAATTTTATTTTAACATGTTGCTAATCAAACAAATGAGTCCTCCAGCCTGATGTAG
-ACTGCGGAACCCCAGCCTAGCCCTTTAGAAAGGAATTCTTGTTCTGGGGTGAAATTGGAT
-CAATAGTTATTGGTGTCTGCCCCTATGCCTTTAGCTATAGCTGTGATGGGCAGTTCCCAG
-CACACTGACAGCATCCCTTTTCAAACACCCAGCAGTCATTTGGCTTCTCTGAAGACTTGG
-GAACTCTCTCAGGGACCTGGgaggagttgatgccactaggggcacccctcagtcaatggg
-gaatgggagttagtgggtaaatgccccatcctcttatccattggaagttcctggtcactc
-aaaggtctgcagtgagttgggggcactggttgcccatactggaaactggctcaataactc
-actttttatccgtttcccctcttcgctgtcactctcccagatccctctggcttcctgggc
-taccggctcccaaattcttgtctcaggctctgcttttaggggaacccaaactaaaacaGT
-CTCTAATATTCTTTCCAAATAGCTTATGATTGTACACTTAGGTGATTCTAATATCCAATG
-ACTTTAACTCTGTGATTATAAGTTTTCATAAGTAAACCCAACTGTGATTCCAGAATGATG
-TCATTCTAATATGGCCGAGATACACCTATCAGAACTGGAATGCTCCATTTTGTACAACTG
-AATTTTGCTTCTCTTGAGCTCCTATTTTTTTTTTCCGATGCCAGAAAATGCAAACTTCAA
-AAAAATCTAGACAAAAACCAATTATTTCAGATTTGAACTCAGTTGGGTGAATCAAGCTTT
-CCCTGGCATCCCTTTTTTCCCGGATTCATTTAAGTCCTGGAAGGGTAGAGGCATCTTGGC
-ATTGGTTGAGGGAAGAAGGGGTCTGTGACTGGTGTTTCTCAAGCTATACCAACCCATCTG
-GCTCTCCAGCATGCTTCTGCCCCCTTGGCATTCACTGGAGATGACCCACTCATGTTGATG
-CTTTGATCTCTAGGGTCAAAGAAGCATAGCTTTCTCCTCCTGGACCATACACTGTAAGAG
-TCACGTCCACTCCATTCAGTCATCTGAAAAGATGTGTTCACTTTTTACACCTCACAAGGC
-CCTGTATACAAACTCGtcattcaatcaaatgtacttgctgagtatccggcatgtgttggc
-attgagccaggcactgaggatacaaagatgaaaagacaggtccctttcctcaagtcattt
-gcaagccaaataatgtataaatattttcaacttacatattgtgatgtccattatgaagga
-accaaatagggtaggcagagaaagcctctttgaagagctgtcattggagccaaagtctaa
-agtcaggggaagccacaaaaaggtttagcaagaaagaCATGTCTGATTATATCTGTAACT
-GTAAAACATTTTCtttttctctttctttcttttattattattttttggagacagggtctc
-actttgtcacacaggccagagggcactggtgcgattttggttcactgcagcctcaaccta
-cggggctcaagcgatctccttcctcagccccccaagtagctgggattctaggcacatgcc
-accatgcccagttaatttttttgtattttttgtagagatagggtttcaccatgttgccca
-ggctggtctcgaactcctgagctcaagtgatatgcccaccttggcctgccaaagcattag
-gattagaggtgtgagccatcacgtttggccGGTAACTGTAAAACTTTTTGTAATACTGAA
-GGCATCTCCTGCATTTTTTCATACATTTTACTTTTCCCCTATTTATTGGTGGCCTCCATC
-ACCTTAGAGATTCACGTCTCAAAGGACAAGAGTCATGGAAATTTAGTCAAAGCCCTGAGT
-AATTTGAGAGTGTACAATTTATGCCATAAATAATAGATTGAGAAGAATAGATGAGTCAAA
-TTGGTTTTCCTCTTTAGGAAACGAGATAAAGATTATCGGGAGGTGGGGAGAAGGGAAGtg
-tagcagagatgtccagctgtcatgcaattacccgacttccccttcttctatagctgcaga
-tggccatgtatctacactgcatttcgctgtctcccttgcagtttaggcgtggccacgtga
-ccaggctctggcaaaggatatgtgaaccgaatggtgtgtgcaacttctgggtcatgcatt
-gaaagaaaaaaaggggcatcctcttcccacacctcttcttcccttcctgccagctagaat
-ttggcatggtggcaggagcagtagcagccgtcttagaccacaagactgaagccacacgtt
-gaggatgtcagaacaacaaaatggaaggatcccaggtatctgacgtcatgggactcatag
-cggcctagactgcttgccccctactggttagtgagagagaaatcaaTAGCTGAGTTAGCA
-TCCCAAGTAATACAGAGGGTCAGAAATATAGGAAATTagcctgttgctgtggctcacgcc
-tctaatccctgcactttgggaggctgagttgggcagatcacttgaggtcaggttttgaga
-ccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaactagctgcggc
-atggtaggacatgtgcctgtaatcccagctactcaggaggctgaggctggagaattgctt
-gaacccgggaggcagaggttgcagtgagctgagattgtgccactgcactccagcatgggt
-gacagagcaaggctctgtctcaaaaaaaaaaaaaaaaagaaaggaaagaaaTATAGGAAA
-TTAGTGTGCATAGACACTGGTGTAACCCTGAAAAAAGAATAGAAACTTCGTGTGGTCTTG
-AGGGGTCTAAGGTCTGGGCCCAGAGCCTTAATTCTGGGTAGAACCCAAGGAAGCCATGAA
-CCTAACTGCCTGAGTGTGTGTGCAGGCACCTGGAGCAGGACACTTCAGGGGAAGGGAGGT
-GAACTGAGGGGAAAAAGCAAAAGAAGACACCCAGAATTGACCAAGATTAAGTTTCTCCTA
-CCTAGTGGAATGGAGGCTATTTATTTTGGGTGTGAGCTGAGAGTTGTACCTGCTTCCCAT
-TTTATTATTATTGTATTATTATTCCTGGATCCCAGCCCAGCAGTTAACAGGAACCTGAGT
-GGAGGCTGAGTTTTATCAATAAATTTTTGCTGAGCACCAaggcccaggctcaggtcccag
-cctagctccctacttgctgggtggccttgagcatgttacttctcttttctgagccttggt
-gatctcattgggaacataaaggggttgaactccaggatgctcaaggtggctctttttgca
-ttgatgtcctgtggttttTCTCTGGGTCTGGCAATGAGGGCAGTTCAGGAAAAGTGTGAT
-AAAATAGCTCTACTTTAGTTCATAGAGGGACAAGACACAGTCACATGGGcacacatgtac
-acacacacacacacacacacacacacacacaAATGTGATTAACCAAACATCATGGTAGCC
-AAGAAGATATGTAGCATTAAGGTTTagaatacaggctttgaagtcaaacagaccagagtt
-aacaacctcattttgtttttattTTCTTTTTTAAAAtttttttaaaattatactttaagt
-tctagggtacatgtgcacaacgtgcaggtttgttacatatgtatacatgtgccatgttgg
-tgtgctgcacccattaactggacatttacattaggtatatctgctaatgctatccctccc
-tcctccccttaccccacaacaggccccggtgtgtgatgttccccttcctgtgtccaagtg
-ttctcattgttcagttcccacctatgagtgagaacatgcggtgtttggttttttgtcctt
-gcgatagtttgctgagaatgatggcttccagcttcatccatgtctctacaaaggacatga
-acacatccttttttatggctgcatagtattccatggtgtatatgtgccacattttcttaa
-tccagtctatcaatgatggacatttgggttgcttccaagtctttgctattgtgaatagcg
-ccgcaataaacatacatgtgcatgtgtctttatagcagcatgatttataatcctttgggt
-atatacccagtaatgggatggctgggtcaaatggtatttctagttctagatccctgagga
-attgccacactgtcttccacaatggttgaactagtttacagtcccaccaacagtgtaaaa
-gcattcctttctccacatcctctctagcacctgttgtttcctgactttttaacgatcgcc
-attcttactggtgtgagatggtatctcattgtggttttgatttgcatttctctgatggcc
-agtgatgatgagcattttttcatatgtctgttggctgcataaatgtcttcttttgagaag
-tgtctgttcatatccttcgcccacttgttgatggggttgtttgtttttttcttgtaaatt
-tgtttgagttctttgtagattctggatattagccctttgtcagatgagtagattgcaaaa
-attttctcccattctgtaggttgcctgtttactctgatggtagtttcttttgctgtgcag
-aagctctttagtttaattagatcccatttgtcaattttggcttttgttgccattgctttt
-agtgttttagtcatgaagtccttgcccatgcctatgtcctgaatggcattgcctaggttt
-tcttctagggtttttatggttttaggtctaacatttaagtctttaatccatcttgagtta
-atttttgtattaggtgtaaggaagggatccagtttcagctttctacatatggctagccag
-ttttcccagcaccatttgctaaatagggaatcctttccccatttcttgtttttgtcaggt
-ttgtcaaagatcaggtggAGCaaccccattttcatcactaactagctggtgaccttggat
-aagtcactttatttctctgagtcttgggtttctcccatttaaaaggaggatgataatacc
-tatatttagggctttcatgtaataaaataaggtaatttatgtgcagctccaagatcacgc
-tgggcacgttacagatactcagtaaatggtggttattCTGATGAGGATTGTGAGCCATGG
-TGAGAATCAAGTGAAAGGTGGAGAAGGGCAGAGCTGGTGGGTCTTGAGTATGGACTAGGA
-AGATCCATGAAGTCCAGGGTGTAGGGAGGCTCTTGGAGAAGGCAGGACATGAGCAGTGCA
-GGGATGTGTAAAAGCGTGACCAGATGGGATGAAATACCCTTTTAGGAGAAGGAGAAAATA
-GACCCAGAAGCGAGGTAGAGCCAGGcttgagaaaattacttcctctttctgagccttatt
-tttcctcttggtaaagcgagtgtaacaatatctgccttgcaatgttgttatagcgattat
-tgagatgttagaagtcaagctcccattaagatgcctggctcatgtaaggcatcaaatatt
-agtttcattCCTTTCCCAAGAGAGGGTACTCACAAAATATCATCAGGGCTAgtaacacag
-aggataaatatttgaggggatggatacctcattctccatgatgtgattatgtcacattgc
-atacctatatcaaaacatctcatgtaccccataaatatatacaccgaatatgtaccccaa
-aaattaaaaATAAACAATTTTTAAAAAAATCCCCCAAAACAAAAACAAATGAACAAACAA
-AGACAAAATGTCAGGGCTAGAGTGACCCTCAACGCCTTTCTATGGTAACATACACATCTA
-TTCATGAACTGTTCACACAtcattcatcaatctatacagctatcacttatgcatttttca
-tatatccattcaaacaccaacaattcattcatcacccattgttcattcatctagccaaaa
-gtccattcatccttcactcaccatctatccttatccatcatcatgcattcatcagcaacc
-ttccatctgtctacctatcatctattctatattcatccttcatcaatctatttcatatcc
-atacacccattcagccagctactcaagcagccatcattctttcatctgtctatccattta
-tcatttatccatcatccacctatccacctgccattagttagccatcaccatctctcatga
-atttatttgttcctcaactatccattcttcatgcatctatccatctatttatcactcaat
-gatccatccatccattatttcattcatCATTTATGCACCCACCATTTTTCACGCATGAAA
-TATTCATCCAAAATCTATTCTTCATTTCTTCATAGCTATCATTTACAAGCCAAACATCAA
-CCCACCAATTTACTCTTCCTCCCTTCCTCTTCCATGCATCATCCATCCTTCATTCACTCT
-TTCACTAAACATCTGTCATCTATTAGCCATGCCTATCATCATCTATGTATCTTCCATCGA
-CATAACCACCTACGATCTATGTAATTTCATCATCCATCTGTATATGTTTatccagtcatt
-cattcatttatgtttcatcttccatattgcctgtcaggtaacatacaccagagatacaga
-ctaaataagctacaacctgtcctccagttgttcagagtctagtggagaaagataaataag
-cctatgatagctgctgtaccagaggaatgactgtaccaagcaccccaggggagaccacac
-aggagagagccacagactctgagggaactggggaaggactcacaaaggaggtggcagttc
-attaaactgggtctcgaagaatgattagaagGTCCACTGttttttttttttttttttttt
-ttttgagacagagtctcactctgtcccccaggctggagtgcagtggcatgatcgtggctc
-actgcaacctctgccttccaggttcaagcaattctcgtgcctcagcctcccgagtagcta
-ggactacaggtgcccgccaccaggcctggctaattttttgtatttttagtagagatgggg
-ttttaccgtgttggccaggctggtctcgaactcctgacctcaagtgatctgctcctgacc
-tcaagtgatctgcgcgacttggcctcccaaagtgctgggattacaggcgtgagtgagcca
-ctgtgcccagccCAAAGGTCCCCTGGTATttttatggggggaaatgagtcctaagagggg
-aagtgactgtgcataatcatactaagagttaattaacaggacagagacttgtaaccaagt
-ctctagcctactatactagttctgtttccactTCTTATGGGAAACAGTAAGTTACTCAAG
-GGAAGACAAGTAAGCAAAGAAAACCTGCCTCGAAGCACCAGAAGGCTGCTGTTTTAGGAT
-CTGGTTGTAGATGGGGTGGAGAAGGGGATTTTCCTAGACCTCAGCTTCTCATTCAGGGAG
-AGGTAACAGCAGAAGCCCCAGGAATATTTGACAAAGGGCAGGAAAGAAGGAGGAGGAGAG
-ACAGAGCACAGTGAGGTGAGGAGAAAAACAggtcaggcacagtggggctcatacctgtaa
-tcccagtgttttgagagatcgaggtgggaggatcacttgaggccaggacttggagaccag
-cctgggaaactccatctctaccaaaaaaaattaaccgggtgtggtagcatgtgcctgtag
-tcctggctgaggcaggaggatccccttgagcccaggagtttgaggctggctgcagtgagc
-taagatcgtgcctctgcactccagcctgggtgacagagcgagcccctgcttcaaaaggaa
-ataatataataataaaaaaaCCCCACCTACTATTTTCTTGTTACCTTTACTTGGGTAATT
-AATAATAATATTGTTACTGCTTggcacggtggcttatgccagcaatcccagcactttggg
-aggccgaggtgggtgggtcatttgaggtcgggagtttgagaccagcctggccaacatggt
-gaaaccgtctctactaaaaatatgcaaattaaccaggtatggttacacatgcctgtagtc
-ctagctacttgggaggctgaggcaggagaatcacttgaatccaggaggtggaggttgcag
-cgagccgagatcatgccattgcactccagcctgggcaacagagcgagagtccatgtcaaa
-aataaaaataataataaTGTTGTTAATATTCTAGCagccatgttttattgagcacagact
-acgtgctgaacagtgtgctatagatttttcatgcatcataccattttatacctcaccctc
-agcagccccaagaagcagttattactcttgtccccattttgtgaatgaggaaactaagtt
-cctgagaaggtaagctaggatttaaatatggtctgtgtgactacaaattccatgtccttt
-ccactcctctttgctgcctctctCATCGTTCTTTGGGTATGGTATATAATAAGTGACTCA
-GACATACATGTGCATTCACTAAGATATATGCTTCATTTTACTGGAGATTTTCTCTGTATC
-CTCAGACTCTGAAATAGTGGACATAGTAGGAAAGAAAAAATTTGTTGAATTTTCATAGCT
-ATCATTTACAAGCCAAACATCAACCCACCAAGAAATATCTTCTATTTCTTGTTGAATTAT
-CTTGCAAAGAAAATGGATAATCAATTAGAATATAGGGTATACAGGTTTGTCTATTCTGAC
-ACAAGTCCAAAGttttttgttttttttttttgagataagagtcttgctctgttgcccagg
-ctggagtgagtgcaatggcacgatcttggctcactgcaacctccgcctcccaggttcaag
-cgattctcctgcctcagcctctcaagtagctgggattacagctgcctgccaccatgccag
-ctattgtttttttgtatttttagtagagatggggtttcaccatattggccaggctggtct
-cgcacttctgacctcaagtgatctgcttgccttggcctcccaaagtgctgggattacaga
-cgtgagccaccgtgcctggGCAAATCTGAAGTATTAATAGCATAAAGATATAATTATTTT
-TCTCCCAGGTCCAGGAGTAGgctgggcatggtagctcatgcctgtggtcccggctacaca
-ggaggctgaggtgggcggattgcttgagctcaggagttcgaggttgcagtgagctatgat
-tgtgctgctgcactccagcctgggtgacagagggagatgctatctcaaaataataataat
-aataaTCCAGGacaagcttgtttgggtcccaggcttcttctgtcatgcagctctgccacc
-cccagggtgttgccctagtccccgtggtctcagatgccacccacatatctacaccacagg
-cagtaggcagtggaaaaggcatgaggcaactatgacttgcaggttgctctccccacttct
-gttcacctaccactggtcagaatttagtcatgtgatagtaaccagctgcaagggaggctg
-ggcaatgtagtctttattctgagaggctatgtgttcaggtaaaagtgagaggttttattt
-ccacaggagaaggggaaaatgggtatgaggggcaagtaggggtctctgGCGTAGATGAGA
-AGAAGATGTATGGACACCAATATTCTCTATCATGTGAAGACTCCTAGGGTCAcatatcat
-ctctcccattagacagcaagctccctgagggcagggggctagattaatcaccctggtgtc
-cctgaaagcttctagctcagACTTAAGGAAGAAGACTTTTTCAGTCCCGGATAGAGGTCT
-AATGATCTGATGGAACCAGAGCAAGTAGGTTAGAGGCCTTTTGCCTGGTGACGACCAAAG
-TGGAGAGGCCAGGCGTCTGGGAGGCGGCCAGCAACAGTAGAGAGAGACGCAGGAAAGCGA
-CTTGCAAGGGGGCTGGAGTGGGTGAAAGGTCAGAGGAGAGTCTGGAAAGGAGGATGCAGT
-GTTGCAGGGCGGGCAGAGCTGGGGGAAGGAGGGGATAATTTAGTAATCACAGCTCTTCCC
-TCAATAGAATGCTCAAGGGCTCACAAAGCATCTTGGCCTCCATGTTCTCACTGGTGAGGA
-TAGATGGTACATGAAGTTAGGTGGCAGATGGGGGGGTGCTTCGGATTGCCACCAGCCCAT
-TCCTATCTAGAGAACTGTCACTGGTttccttcttcgtttcccatgtgcttcctttctcct
-tccctgtctcccttccttcttccttccttgatttctctcttcttcctCTGTATGTGTGGa
-tatacacatgtataacacacacacacacatagacatacatatatatgtatatctgaatgt
-atgtctctgtatgtacagatatacacatatacatatatgtatatgtgcatacacatatGT
-GATGACCAAAGTGGAGAGGGCTAAAAGATGAGGCCAGGTGTCTGGGAGGCAGCCAGCAAC
-AGTAGAGAGAGACGCAGGAAAGCGACTTGCAAGGGGACTGGAATGGGTGAAAGGTCAGAA
-AAGAAgtgtgtatatgtgtgtatgtatatgtgtgtatatgtatatgtacatatatgtgtg
-tacatatgtatgtgtgtgtgtgtgtgtgtgtatgtataatcacctactatgtgccaggag
-gtattgtgaaagttattgagaaacacactggtgagcaaaccagacaagatccttgccctc
-atggagcttatgcttaagagagagagatattacacaaataaatgcacaaatagctccata
-accgttaaatgtgaccaacgactagcgctatgcagaagtgcagaatgctgtgagaGCATA
-TTCGTTGTGTATTCCAGCATTTATTAAACAAATATTTAATAAAGCAAATTATATGTATTA
-GAGAtttgcttttttttttttttttttttgagatggagtcttgctctgttgcccaggctg
-gagtgcagtggcacgatcttggctcactgcaacctctgctgcccaggttcaagcgattct
-cctgcctcagcctcccgagtacctgggattacaggtatgtgccaccacgtctggctaatt
-cttgttttttagtagagacggggtttcagcatcttggccaggctggtcttgaactcctga
-cttcgtgatccacctgtcttggcctcccaaagtgctgggattataggcatgagccactgc
-gcctggccTAGAgataatttttagaaaggaataaaatcacgctcttgttcaaatataaaa
-tgaacatgtgtcaaagattttatttaactcattaatttatgaggtaaccaataaggtgtt
-aaaaaatagttcaaaggagaatccaaagagaagaggcatacataggtaatgaggattgct
-tacattaatttgctaaagatgcaaaactgttttcttccaagagtactggggggaatgaat
-tgcatctttattattattattttgagacagggtctctctctgttgccaaagggctagaat
-gcagtggtatgatcatggctcactgcagcctcaacctcctgggctcaagcgatcctccca
-cctcagcctcctgagtagttgggactatagacaagtgatatgtgacaccttgctagctaa
-tttttaaataattttttgtagagatggggtttctctctgttgcccaggctggtctcaaac
-tcctgggctcaagtgttcctgccacaggctcccaaagtgctgggattacaggcgcgagcc
-accgcatctggcctcaactgcatcttgagcagaagaaatttgtttgcatctctgtgacga
-gaattgtttttattatcatcaatcttgttacaacatattgaagtgtacgctagctcaaaa
-atgtgaaatgcgtcggcaaccatagaatcagctaacctgaaatgatgtaaagacaattca
-taCCATTCTGGAGGACTTCCAGTAATCTTTGTGGACTTTTTTTTTTCAGCTTCAAAGTAT
-TTTACAGTTTTTcctgatgtgagtcagatcggtactagatactaataatacagaggtaaa
-ccatacagacacaatttctccctcaaggaCAATATTCCCTTATGTTCTAACTGGGGTGGA
-GAGCCGGGGAACAGTTTTTGGAAGCCAAACTGAGTCTTTGCCATTTATAcagtcatatgt
-taattaacaacaggaatatgttctgagaaatgtgtcgtcaggtgatttcattcttgtgca
-aacgtagaatgtactgtcacaattctagatggtacaacctactaggcacctagtctctat
-tctataacctatttcttctaggttacaaatttgtacctcatgttactgtactgaatattg
-taggcaattgtaacacaatggtaagtatttttgtatctaagcatagataaatatagaaaa
-gatacagaaaaaatatgtagaaaagattttttttaaaaaagacacacttgtatctttact
-gtgaatggagcttgcaggactggaagttactcttggtgagttaggaagtggtgactggat
-gtgaaagtctaggacattactgcacactactgtagactttataaacactgtacacttagg
-ctatactaaatttatttttaaaatttgtttctttcttcaatagttaactttagcttactg
-taactgttttgttctataaacaaaaaaattttaaaaacactttttgtattattttgtaat
-aacacttagcttaaaataggaacacattgtacagctgtataaaaacattttctttcttta
-tatccttattctataagcctttttctacttttaaatgttttttccttaaattttgttgtt
-gttgttgttaaaaactaagacacaaacacacacattagcttcagcctacacaaggtcagg
-atcatcaatatcactgtcttccacctccacgtttcgttccactggaaggttttcagggca
-gtaacacctgtggggctatcatatcctgtgacaacaataccttcttttgaatacctcctg
-aaaaacctacctgaggctgttttacagttaacttatttttttttaataagtagaaggagc
-acactgtaaaataacaattaaaaagtatagtaaacatgtaaatcaataagttgtttattg
-tcattatcaagtattatgtactgaacattttttttttttttttttgagatggagtttcgc
-tctggttgcccaggctggagtgcaatggcacaatcttggctcactgcaacttctgtctcc
-caggttcaagcgattcttccgcctcagcctccggagtagctgggattacaggcatgcacc
-accacgccgggctaattttgtatttttagtagagatgggCACACCAactaaagaacatca
-aagcccagagcgagaaccttcctccctttcccattttccttcaacttgttattaaggaga
-aagtctctgttcaatgctggtgtgtttttaacacctctcttaacacttacttcccttttt
-aacagagaataggcctccagagcctttggcaggccaccggatctggctagaatgtgatga
-cattgttttgttttcattgtacttatttttatggctaccttctatttatggcacgagata
-ctggttttccatttagggagggccctaaactttccttttgacataatatatttatgtttt
-tagaagaaggaccatttaaagaaaaaatattatgtaatattaattacataatatttgcag
-cacaggtggtactgagacagggaaaaaattataaagaggtatgtaaTGTGCTGAAAAGGA
-GGACATGCTTCTCAGGCTAATGCCTCtcccagcccctacttaacagaagggaccactgag
-gcacagagaggagaagggactttgtcaaggtcacacTGATGATGTGGACTAAGAACTGAC
-AGCCTCTTGATAGCCCTGTGGTGGGGGATATCTTGTGTCAGATGGGGAGGGCAGAGGTCA
-GGGACTGTGTGCAGCCCCATTGGTCAGTCCAGTGCACTGATCCGCTAGTCAGACAGAGTC
-CTCCAAGGTTGACCAAGTCATGGACTGAAGGCAAAAAGGACCGGGGGACCTGGAGGGGAG
-GAGAGAAGAATGCTGGTGTTTATCACGCACTAACTATGCTAGATGCTCGGGTGCCGGACG
-TCACCCCTAGGGAATTCACAAATTTGGGGGCAGACACGTCCTACAAAAATAACTCAAGTT
-TCTGGCGAAAGTGTGGTAAGTGTTCCAGCAGAGGCCTCTCtagtgacatctaggtttttg
-tctgctcactggtcatttccccatattcttttgggaaaccacctcttcaccactcttgat
-tcttgtagctcagaccaggcaaaccccacacccacttcagaggtgggcacatgaccagac
-ctggccaattagaacactttatccctcttgccacagagactggcacatggttgggcgcgt
-gacccaaggcaggccagagggggccttccccaggaatttgctggaactactggagaaaaa
-tcccacttcatagggtttttaaaatggatacactgtaagccagagttgctggcagctatc
-tttgccaccaaaagagagaggttctctgaaaatgaagctgacaggaaagcagggatgaca
-gatggagagacagctagagtcctaatgctactgtatggtcacctcctggacccagccgtg
-aaatcagtgaccctgaacACAGTTCTATTTTGCTTTGTTACCCAGGCTGGAGCtttttat
-ttttgtaattaaattaaattaaattaaattttaatttttagagacaaggtctcgctttat
-cacctagactggagtgcgtggtgcaatcacagctcactgcagaatcagcctcctaggctc
-aagtgatcctcctgcctcagcctcccatgtagttgggactacagttgtgtgccaccacgt
-ctggctaatttttaatttttattattatttaatttaatttttaatttttattttttgtag
-acatgtggtctcactatgttacccaggctggtcttgaactcctggcctcaagtgatcctc
-ctacctttatctcccaaagttctgggattccaggtgtgagccattgtgcctggctCGttt
-ttatttttatagagatggggtctctctatgttgcccaggcttgaactcGGTTCTAGAAGG
-CAATAacacacacacacacacacacacacacatacaTAtttgcattagccactttgagat
-gggtttctgtctcttaaaaccaaaaagagacctgtctaatTCCAGGCAGAAACAATATCA
-TGGGAATGTTGGCAAGGGAGAGGGATTGGAGTGTGTGTAAAGATTTATCTGGGAGTCCTT
-CCTCGTGGAGGTAGGTTTTGAGCAGGGTTTTGAGAAATGGAGAGGATTTTGATATATAAA
-GAAGGTGAAGAAACAGTATTTCCAGGGAGGGGAACATCCTGGGCAAAGGCTTGGTGGTGG
-AAGAGGGCAGGGAAGTGGCGCCGTCCAGTGTGATTGGAGAGAGGATGGGGATAGAGAGGA
-GGTGGGAGAAGAGCTGGCAAGAAGGGATGTGCCCTAATCGTGCAGAGATCCAGTCTGCTC
-CTTCACCTGCATCCTCCTCCTCTGGAGGCGTGCCCTTCATCAGttaattcatccacagcc
-atttactgaacaccagcatgcgtcaggcactgtcaaagggctggcgagagagctgtgggc
-cacaccaccaagtccctgccctcttgtagcttcttttgtaggtgaaggacacaggtggta
-aacatgagcaagaaataaacaagtatcatagtgtcagggagcagtaactgttatctagaa
-aaattaagacgagtaaagggaatacagactagtggagaggTGTTTGGGAtgaaaacggat
-aatactgatggttgaccgacatcgtgagtgcactcaatgccactgaactggtaaaatggt
-taaaatgataaattttacattaggtatttttctgttctttatattatgtacattttacca
-caataaaaaaCAGGATTggcagaggggtgctattttagctagggtggtcagggcatgtct
-ctctaaggaggtgtcgtttgaacagaatggaggggaattagcaagccttgaagagattgg
-ggggaaggtattctgggtggagggaattgccaggacagatcctgtggggccagagtcggc
-ctggtgtgttctaaggacagcaagtgggcccctgtggctggagcccagagagcaaaggga
-gagggggaggaagatgagtacagggatcagcaggggcttgtatgccaggagagaactttg
-gatttggttgtatgagtgatgggaagccatcggagggctgagcagggaagggatatgaat
-cagagtttctgttCAATTCTCCCTCTGCCCACACTCAGTCCTGCTCTTAATCAGGTTGGT
-AATCTTGCCTCTGCTTCTGACTATCTCTCTCTCCTGGCTGCTACCCTCTTCTGCACATCT
-TCATGACCACTATCTTGCTGAGGTCATCttttttttttttttttgagacagagtctcact
-ctgtctcccagctgaagtgcagtggcacaatctcggctcgctacagcctctgcctcctgg
-gttcaagtcattctcatgcctcagcctcccgagtagctgggattcaggcgagcaccacca
-tacccagttaatttttgtatttgtagtaacgatggggttttgccatgttggccaggctgg
-tcttgaacacctggcctcaagtgatccacccaccttggcctcccaaagtgctgggattac
-aggtgtgaaccaccacacccagAGAGGTCATTGTTTTTATATGGCTGACCCAAATGGCCT
-CCAACTGGCCTCCCTGCCTCCTGCCGACCCAGCCTCCACCAGTCATCAGGGTCTCTTTCT
-ACCCGCAGCTCTGACCAGCCCTTGCCTTGGTGAGAGCCACAGCCTCCCAACTTCCAGTCC
-AGCCCCATCTATCTTCTTTTCTCCTCACCCCAAAGCCCACACTTAGTCACTCAGAGCCTC
-CATGGGGTTCCCCTGCTGCCTGCCGTAGGCTTGCCCTCCTCAAGGCTGGTGTATGGCTCT
-CTGCTCTACTCGGGTTCCTTTTCACCTAGACAGCCCCCTCCCATCCTTCAACAGCCTCCC
-AGCATCACTCCTCTGTGAAGCCTTCCTTGGCTGTCCCACCCGCAGGCTGGCTTAGCTAGC
-TCCTCTTCAGTGCTCCCTAAACCACTCACATCTTCCACTTTCAGAGCCCCGAGCATGTGG
-CATGCAAAGCACATTggtttggtttggttttgtacaaacctttccctttcctcagctccc
-tgaaccccccagttccctgttcatagtatgttcgcaacaaatgtttattgaataaatgaa
-tGAGTTTGGAATTTATCTTGCAGAAACAATACTCCCACCACCACTACCAGCACCTCCACC
-AACGAAaataatatccaacccaagttgatgacttgctatgcatcgggcactgtgctacac
-acttccaaatctggatctgatttctatttcataatattaggaggaaatcactgtgttagc
-cccactttagagatgagaaaactgaggcatggtgaaattaatcaattttcctaaggctac
-ataactcagaagcaggagagccgacagtccaaAGTGTGCAGCCCAAAGCCGTGGGCACCG
-CATGCAGCTGGAGGAGGTGTCTTGGCATTACTGCATCCACGGACGGGGTTTCCAGGAGTC
-CTGGAGTTCCATATGAAGATTGATTGTCCATGAACTTTTTGGGCATGGGGGCAGGTCCAT
-TACTTGTAttttttttttttttgacagggtcttgctttgttacccaggctggagtgcagt
-ggtatggtcatagctcactgcagcctccatctcctgggttcgagagatcctctcacctca
-gcttcccaagtagctgggaccacaggcatgcatcaccatgtctgcattatatatatatat
-atatatttttttttttttttaagagatggtgtctccctgtgttgtgcaggctggtctcga
-actcctgtgctcaagtgatcctcctgccttggcctcccaaagtgttgggagtacaggtgt
-gggccatcgtgcccagccGTGATCCATTACtttttttttttttttttttgagacggagtc
-atgctctatcacccaggctggagtgtagtagtgagatctcggctcactgcaacttctgcc
-tcctgggttcaagcgattcttctgcctcagcctcctgagtagctgggattacaggtgtgt
-gctacctcgcttgactaatttttgtttttttagtagagacagggtttcaccatgttgacc
-aggctggtctcgaactcctgacctcaagtgatccgcccacctcggcctcccaaagtgctg
-agattataggtgtgggccaccgcacccggctGGTCCATTACTTTTACCAGGGTCTTAGAG
-GGGCTCTTGATAATTCCTATATTTAAGATGCTCCTCTGCACATAAGGGGGAAAGATGGAG
-AGTTTTCGAGTATTGGACTGTTGCGGTTCAACCTATGCTTTAGAGAGATCACGTTggcta
-tccattgcagtgtaatgcagggagaagagattggaaatatccctaagattcaccaagagt
-ggatgtgttaatcatatcatggtacctccttccacagaagggaataatacgcagccataa
-agatgaatgaggagtctctttatgtaccaatgtgaaatgattcctaagatatttatgtca
-gagagagagagacagggtCTgggtctcactctgtctcccagactggagtgcagtagtgtg
-atctcggttcactacagcctccatctctgggggctcaagagatcctctcgcctcagcctc
-ctcagtagctaggactacaggcttgcaccaccacgcttggctaattaaaataaaattttt
-ttttggagagactaggtctcactatattgcccaggctggtctcaaacttctgggccaaag
-agattctcgcacctcagccttccaaagtgctgggattacaggcgtgagctaccctgcctg
-gccTtccaagacatagtttaagtaaatacagcaaggtgcaggccagcatgtataattagc
-ttctatgtatgttttttaggaagggaggggttaagattatagatctagatgtgcttctat
-atgcataaaaaaTCTTTGGCAATATTCACTGTTAAATAGTCAGTGGAAACcctacctcat
-agggtttttatgagggttacatgagttaatattagataattgcttagaagagtacctggc
-acacattaagcactacagaagattttatttaataAAATAAAAAAGAgtggcgggcgcctg
-tagtcccggttacttgggaggctgaggcaggggaatggcgtgaacccgggaggcggagct
-tgcagtgagatgagatcgcgccactgcactccagcctgggcgacagtgtgagactctgtc
-tcaaaaaaaaaaaaaaaaaaaaaaGAGGGTCCCTTAGGGGATGGAGACCAGGTGACTAAG
-GGGCAGGGAGAGAGACTTATTTTTCATCTGAGGCCTTAGACGCCTTTTGAATTTGGTACC
-ATGGGTAAAttttttttatttttatttattaatttatttttgagacagagtctcactctg
-tcacccaggctggagtgcagtggcacgatctcggctcactgcaacctccacctcccgggt
-tcaagtgattctcctgcctcagcctccctcgtagctgggattacagttgtgcgccaccac
-acctggctaatttttgtatttttagtagagttggattttcgccatgttggccagcctggt
-ctcgaactcttgacatcagatgatctgcctgcctcagccttccaaagtgctacgatgaca
-ggcgtgagccaccacgcccggccTATTTTTTTGAAGTTGAAATTCAGTGTATCTTggcca
-ggcgtggtggctcatgctgtaaccctagcactttgggaagctgaggcaggtggattgctt
-gagctcaggagtttgagagcagcctgggcaacatagtgagaccctatctctcaaaaaaat
-gcaaaaattagctgggtgtagtggcgtgcacctgtagtcccagctacttggggggctgag
-gtgggaggattgcttgagcccaggaggcataggttgcagtgagccgagctcacaccactg
-cactccagcctggacgacggtgagaccctgtctcaaaaaagaaaacaaaaaacaaaaaac
-aaaaaaaaaaaaAGAGAAAGAAAGAAATTCAGCATATCTAGATAGCTAAGAGATCATCTG
-AGGGGGTCAGGGCCTGGAAGGAGATCCCACCCAGAATCCCCGGGAATTCGCTGTAATTGG
-TCAAAGGCCACATTGTGTAGTGTGAGAAATCAGGACGTGAGGAAAAGGCGGACAGGAGAC
-ACCAAAACACCCACGCCCCAGGGCCCACTATAAAAAGCACATTTAAAAACACCAGACTGG
-AAAAGTTttattattattattattattTTTTAAATAGCAAAAGCGAGTCCCCCCAGGAGG
-CGCACTGCAGCTGCGGCTGTGGCGGTTCCCAGGTGATGTCAGTCCTGGCCAGGCGCCAGT
-CCCGGCCCCTTGGAGACGGTCTTGGTGGGTTCAGCTTGACTGTTTTTCCTTCCTGAGACT
-TGAGGACACCTTCCTGTCTCAAAGAAGGAAGCCTTTCCAGGGCTTTCTGAAAGCCAGGGG
-CAGGGGAGGCGGTGGGCCTGGGCTGCAAGGGCAGAGAGAGGCAGGGAAGGTGGGTGGGGG
-TGGGGAGGAGCGGGGGCTGCCTCTGGGAGGAGAGTGAGGGTGGAGAGAGCAGAAGACAAG
-CCTGGCTCCTGGGTGGCTCTTTAGCCCTCCCACCCGGGGGCGCGAGGGGGTCTGCTTCTT
-GGGAATCCAAGGCCCGCCTCCCTGGCCCCATTGCTTCTCAGCCCTGGCTGCTTCCTGGGG
-AGGCCCCTGGGTGGGGTGAGGTTGTGGGGTGAGAGAGGTTCCCACAGAGTTCCCAGTTGG
-TCAGTGTCTTTTCTCCCTCCCTGAGCCCTGGGCCCACCCTTTCTTCTCTATGGTTAAAGG
-CTCTTTGCCAATATCTTCCAggccaagcgcggtggctcacgcctgtaatcccagcacttc
-gggaggctgcagcaggcagatctcctgaggtcagaagtttgaggccagcctggtcaatat
-ggtgaaaccctgtctctactaaaaatacaaaaattagccaggtgtggtggcacgctcctg
-aatcccagctactctggaggccgaggcaggagaatcgcttgaacctgggagacggaggtt
-gcagtgagtcgaatcatgccactgcactccagcctgggtgatggagcgagactctgtctg
-aaaacaaaaacaaaaacaaaaacaaaacaaaacaaaacaaaacaCCCAAGATTCTGCCAA
-TATCTTCCAAACTGGGTTTTCTGCAGATGGGACGATCCAcagagctgggtttgaggtcca
-actctgcactcctagccgtgcgacctcaggctggtcactgcttttctttgagtgccacct
-ctgaaatggattaggttggccttacagggtggttatgcagagtgagtgagacaGAACAAT
-GCCTCTTGGTCCTTCCCGAGTATCTGCTAGGCACCCACAACGCGCCGGTGCCACCAGGCG
-CTCGGGATGCTCAGCATTTGGCACAGAGGcagcagagcagggaggtgaagagagtgggct
-ctggacccagcctcagtccacatcccggttctgtcctttgatggccgtgtgaggatagtg
-acagcctgtctcactgggtcgtagaggagtaaatgagttacaggccgtggaacagtgcct
-ggcactgaggcggtgctaggtaagtgtttgcttttattTTCGACTTCTGTCCAACCAGCC
-TTCTGTTGCTTTGACAGCTTCATGGGGCTGCTCTGGGCACTCAAAGGAGATATGTTGGGG
-ATTCAGGGGTTGTGTTTAGGGGAGACCCAGGTCCTGCAGGTGCCCCATCATTCATACTGA
-TGCAGGGGTGGCCTGGAAGCTGCAGAACCATTCACACTCGGCAAAGCCTTCTCTCACCTT
-GGAAGCATCATTCCTAATGACGACACAGGTCTCCCAGCCATGCGTTCCCACATAACTTAG
-AAGCACCCATCCCatttttattatttgctcagagcctgctttttcagtaggccgtaaact
-ccatgaggtcaggtactacatctggcttattctctgatcatccctagagccttgtgtggt
-tcatggagaagttcaaaacatgtttgttgaCGGACTTACTGACTGACAAAGTCTGCCAGC
-CTTATGTTGGTCTACAATGTTACACTCTATCCCATGCCTCCTGCTGAGTTTTACCCTCCT
-GCTGTGATGCAGGCTGTGGGAtctggagctagaccccctcagttggaatcctggctgtgc
-cattgcctagctgggtgcccttgggcttggttttctagtctgtgaaatggggatagcaac
-agtacctacctatgtggcttgttgcaagtgaggccatctctgtatgtcactcagagaagt
-gccttggattagtcagTTCCATCAACATCAGGACTAGGCACGCACCTGGTGAGGTCATGT
-GGGGGtggtggttgagagcccagtggggctctgcagctagaacatctgattcaaatccac
-cagccactgtgtcaccttggccaagttctttaacctccttgtgcctccgtttcctcatct
-ataaaatggagcaataataatacatatctaaccagcttttgagcaagctgtatgtatgta
-tgtatttatttatttagagacggggtcttactctattgcccaggctggagtgcagtggtg
-caatctcggctcactgcaacctccaactcctgggttgaagggattttcctgcctcggcct
-cctgagtagctgggattacaggcacgcaccaccatgcccagctaatttttgtatttttag
-cagagatggggtttggccatgttggccaggctggtcttgaactcctggcctcaagtgatc
-tgccctcctccgccttccaaagcactgtgattacaggcatgagccactgccccccgcgaa
-gctgtatttattttatgtaaagtgcatagcctaggcctgacacgtagtaggtcctcaaaa
-gagtcaggcatttttCCAAGCCATTCAGAAAAAAACAACTCCTAGATTTTATCAGCCTTC
-CCTCCCACAAGGCCAGTGTGTCCCAGCTGACAAAGTTGCTGGCCGTGCTGACGtgaggaa
-aagcaagggccagagagggccagacgcctaccctgggtcacacaggagcagtggccaacc
-tagaataggctaggtcttctgtctcgcagcctgtTCATCCTGAGTGCCTCCCTGGTTTCC
-AGGCCCTGCTGGCCTGCCCTCTGACCCTAGCCCCCTGGGAGCTCTATCCCAGGCCCATGG
-GGTCTGCAAATCTGGTCTGGATTAGACACGCTGAGAAGCAAACGCCAGCCCCCCCAGCCG
-GCTGCCCAGTGGGACCTGTGCTCACAGCTGCTGAGGCTCATAGGGACATAAATCATGGTG
-GCAGGAGACTCGGGGGATGGGACCACCTTAGCCTCCTAAGGGGCACAGGGGCCTGAGAGT
-CACGAGCAGAGGCACCTGGGTCTGCTGGGGATATTTTCCATCGTCTGTTGGACAAGCTAA
-AGCCAGGGTGCATCAGAGGGGGCCAGGACACCATTTGGCAGCCCTCGCATCACAGTAGGC
-CAAGATCCCAACTTCTTTTTAACttttcattttgcaatcatttacaacatgcagaaaagt
-gacaaaagtggtgcagagaactcccatataccctgtactcagattcaccacattttaagt
-ttgtcatatttactctatccttttctctcacacatatattatttctcttctgaaccattt
-gagagagcacgttacctacatcatacttctccttaatagtacttcaggatgtattttttt
-ttttttttttgagacggagtctcactctgtcacccaggctggagtgcaatggtgcgatct
-tggctcactgcaacctctgcctcccgggttcgagcagttctcctgcctcagcctcccgag
-tagctgggattacaggcgcctgccaccacagggtttcaccatgttggccaggctggtctc
-gaactcctgacctcaggtgatgcgcccacctcggcctcccaaagtgctgggattacaagc
-tgagccaccacgcccggcctaggatgtaattcttaagcacaaggatatcctctgacacaa
-tcagggtgctgttagcaaatacagaaaatttaactttgatgcaataccttaatctattgt
-tcatatcccaattttgtgtgaccatgtctcaaaaaaaaaaattgtcaactctaccaagaa
-ggtcccctgtcacattttcccctctgcagtacaggatccagttcaaagtcatgtatcgca
-tttacctgttcaggtctATACTTGATATCACAACTACACGAGGTAAAATATACAGTCGTA
-AGAGACACAGATGGGGTTGAACAAAGACATCCAACTTCATATGTACGTCCCATGAACCAA
-TGTTTCTATAAATCCTCTAATTATATGGTGTTCCACAATAATGCATCACGCTCCTGACTG
-TGTGGAGGTAGTTAAGAGTTAACTTGCCAggccaggcacagtggctcacacctgtaatcc
-cagcactttgggaggctgaggctggaggattgcttgagcccaggaatttgagactagcct
-gggcaacatggcgaaaccccctcaaaataaaaaattagctgggcatcatggtgcacacct
-gtagtcccagctactcaggaggctgaggcgctaggactacctgactccaggaggtggagg
-ctgcagtgagccatgatcgtgccacctgcactccagcctgggtgacagggtgtaaccgtg
-tctcaaagaaaaaaaaaaGTTAACTTACCAAATATGCCATAGTCTTCAGCACTCTCTTTT
-TGTAGTGCTTCATTTTTTAACCTAATAAAAGCCTCATAAAATGGGAGTGGCCTGGGACAA
-TGAGGGGAACCTGAAGTGCTGtgggtgcaagaggtcctgtgttctcagccctgctcagct
-ccagatgctgtgcaaccgtggcccatcaccgctcctctctgagcttcaggttGCCATGGG
-TGACCTCTGAGGCCTTCCTGCTCATAACTGTGGAGTCAGAGAAAACAGCCCTgcatggca
-aggagggagatttgtgttcttggtgtcccaacagggccaaggacctgctggggaacccca
-ggcaggttgccctctgtcttgtctcactttcttcattgtgaaatgaTGAACTCTGAGATT
-ATTCTTGTGCTGCTGCTTCATGTGTCAAGACTTGCAGGGAGAGTGTAACCCTTTGGGGTC
-CAAGGTGGCCTGGCTGAGTCGGTCATTCCAACCCCTTCAGTCCTGGATTTCTTCTCCCTG
-AGCAGCTTTACTCCTGTGGCCTCAAGTTGGCCTGGAGAAGCTTGGCTGGGCTGGACCATC
-CCGGAGGCGACAGGCATGCTGGGGGAGCGGACAATGTTACAAAATGTTCCCCAGAGGAGC
-TGCCTATATATGCAGACCACACCTGTGCTTCTCCCCGGTCACGTGTGTGGGCTGACCTTG
-CAGCTCACAAAGGCTCATGGGCATtaactgtccattaccaggaagatagcaagctgcaaa
-atatgcataatggagcactatgcagctatgaaaaggtgtgaaacagctctgtaagcaacc
-aagggtctccaagaagtacagttaagaaaaaaaaatccagtgcagagaggagtgtgtgaa
-atgctaccacttgtgtggaaaaacaatatctatgtaatttgcctatatatgcagaCCATC
-TCTGCCGGAATCCATAGGATCCTGGTTACCTTAACATAGCAATTGCCTCTGGGGACTGGA
-GCTGGTGGCTGGGAGAGAAGGAGACTTATTGTCAGTTTATTCTTTTTTGTGTCTCATTCA
-AAGGAAAGAACCGGTATGTGTAGATGTGcaagaggggctggctcctgggaagctgctaat
-tgcatttcttgatctccatgctgggtgtacaggtgtgctcagcttgtgaaaatccattga
-gctgtacccttacaccctgtgcactttcctgaatgtgtcttatacttccataaaaagtgt
-aaaCTTggccgggcgcagtaactcatgcctgtaatcccagcactttgggaggccaacatg
-ggtgggtcacctgaggtcaggagttcgagaccagccttgccaacatggtgaaaccccgtc
-tttactaaaaatacaaaaattagccaggcgtggtggtgcacgtctgtactcccagctact
-caggaggctgaggcaggagaatcgcttgaacccgggaggtggaggttgcagtgagccaag
-atcacgccactgcactccaacctgggtgacagagtgagatccatcttaaaaaaaaaaaaa
-aaGCGTAAACTTAGCATGGTTTAAATGATTTGTTAAGCGTATGTGTGCTAGTTTAACAAA
-AACGCTGCAGagctgggcgcagtggctcatgcctataatcccagcactttgggaggctga
-ggtggatcgcttgagcccaggagctggagaccagcctgcataacatagtaagaacctgtc
-tctacaaaataaacaaataaataaaattagccaggcctggtggtgtatgcccgtatttcc
-agctactccgcaggctgaggtgggaggatcacttgaggacaggaggttaagcctgcagcg
-agctatgactgtgccactgcactccagcctgggtgacagagtgagaccctatctcaaaca
-aaacaacaaaaaaTACTCGGTGGGATTATCGTCTTCACTGTGGCTGTCTCTGGGATAAGT
-GATATTTCTAGAGTCTTATAGCATTTTGAATTTGTTTTACAATGAAAGCACAGGCAGAGA
-AACCTATAAATATTTTTTCAGAAACAGTTATCAGTATAGAAGCTTTTTTGGAAGGACACT
-CAGGAAGCTGCCTCTGGGGAGGGGCCTGAGGAGGTCTGTACTTTTCACTGCATACCATTT
-GATACAACTTGGATTACTTACCAGTGCATACAGGGTCTATTAAAAACTATCTCACAAAGC
-AAAACAAATACTTATCTTTCTGTTCTAGCTGCTCTTACTAGTTAGAGACTGAGCCAGGga
-ggcccagaggggtcaagcaacatctctggggtcacccagcaaatctggtggcggagtggg
-cctccagccagagcacccaagtgtctgctctgcccccactcccaggcttcctgccattga
-caaggccacagtccttttcCTGTGGCTTTGCCAGAGGCTGGCTGTACCTGGGAGGGTAGG
-CGCAGGGGGAGCAATGTGCTTTCCTAATCAGCTCCCAAAGGGGGAAGCACAGCCACGCTG
-GGACACAGGATAAGCACGACCAGTGTTCCTGAAACAGCGGGGAAGTGAGGTAGAGGGTGC
-TTGGAAAGCTCTCCTGGGTGGGGGACCCCGGCCCCCTGGGGCCCTCCTTCCTCTACTTCT
-TACACCAAAGGAATTAAGCATGGTAATTTCATGGCCTGCTCCAGCCTAGGGACTGGCAAT
-TCCAcaactcccttgatctccctgggcctcggttttcatctgtgaggaagaccaggttgg
-tcgggctcattcctgtggcatctggcacagtgcctgccacacagagggtattgacaatct
-gtttgtcaaTTTGCAAAATCGGAGCCACAATTCAGGCTCAGATGGTCAAACGCAGGGGAG
-TGGGGTAGAGGCAGAACAGAGGGGATACGAACGTGGACTCTGGGGCCAGAGTGCAGTCAG
-TAAACATGAAATAgatcacttgagctcaggagtttgagaccagcctgggcaacatagtga
-gaccctgtctctaaaaaaataaaaataaaaGTGTTTGTTAAATAAATAAACTGTTGAAAT
-AGGCATATGAATGTACCTTGCTGAGGAGAGGGTGGCTGCCTGGCTGCCCTGGCCTTTCCC
-TGGCTCTCCCACCCTCGGGCCTCTCGAGCTTCTCTGATCCTGACCTCACAGGGACACAGC
-CCCAGCCCGAGAGCCAAGAACTCCTAGCTGCACTGATCAGCTGACGCATCGCTGTCTCTG
-CTGGGTCTGCAGTGGGGAAGACACCAGCTCTCACCTCCCAGGGCTCCTGGGAGTGTAATT
-GGGGTAACAGGTGCTGGCTTTCCACTTGGGGCATCTCCAGGGCAAGGAAGGAGCTGCTCT
-GGGCTTCAAAGGTGGACGGACCTCAGGGTGTCACCCTGCCACGTGCCTCTGGGTGTCATC
-GGTCTTCTAAAGCATTTCAGCTAACACAGGGGTAAGAATATTCCCCTTTAGCATGCACTC
-ATTTGCACTTGTGGAAAACCACATGGCTTGTTGGTGATCGcatcaaagagggatgggtta
-aaggatggcatgttcacaaaatggaataataagcagctcaggaagaaatgaaataccctt
-taggtactgacttgggatgataccaagctagattaaggaaaaaaagaaggagccaaaagt
-gtgtacgatgtgctgtcatttgtgtaTTTGCCTGATCATTCATAGTGAATGGGACATCAC
-AGGAAACTGGTGCCCTAGGCTGCTTGCAGAGAGGAGAGCTGGTGGCTGGAGGACAGGGGC
-ACGGAGACTTTTCAACACATACCCTCTGGTACCTTCTGAGTTTTGAACCATGTGAATGAA
-ATGAACACAGGCCTTATTCAAAAATAAGTAAAATTAAGATTTCTTTACCAACCATATCAG
-ACACCTAACAGTTGTTAAGAACATCTGATAAACAGCAGACTGAGGAAAGTTTGGTTATGG
-CGCCCGGAGAGGGGGCTCTGCCTGCCTTCCCCCGCCCCACCCCCACCCTTCCAGGGCTCA
-GGGCAGCCCCCAGAACATCTGTGCCTCTCTCTAGGTCCAGGGGAGGGCCCACCTCTGACC
-TCCGATGTCCACGGGACTCTCCTCAGCTCAGAACGACGTCTTTTATTTAAAAATAGCTTT
-TATTTTAAACTCACCAATTCTCTCTcacacacactcacactcacgcacagatacacacac
-acCCTGTCACCAACAGTCTTTGTTTTTCCAAAAGTTCTGCCTTGTCTCTGACCAGCCAGA
-GCTGGGCAGGCTGAATGGATCCTCACAGCTCTCCAGGATCGGGTGGAGATGTCCCGAGGG
-CCCTGCCCAGAGTGTCCCGGAACAGGCCATGGTCCCCCGGTCCCTACACAAAGAAGGGGT
-GGGCTTGGCTCCTGGGGTCTTCTTCCCTGTCCAGCCAGTGGCTGGCTCCTGGCCTCCTTC
-TCCAGGGTCCAGGCTCATCTCCGTGGCCCTCGAAGGGGGGCCACCCCCCTCACCTTCAAG
-CAGCTGCCCCCCAGGTCACGACGGCCACCCTGCAGAGGGGGAGAAAGAGTATAAAGAGGT
-TCGATTAGGCCAGTGTGaacactggaactaacctctgtatccctcaagagggatcctgat
-caataaatcacagttcagccacacgatcaagttctctgcaacagaaagcagaagaaaccc
-tttctggactgatacagactgctgccaaatgacaatgtttagggacaaaagcaaggggca
-gGCTGAATGCGCCTGTGTGCTGTGATTGCTGGGGAGAAGCACACACGGGAAATTGTGAGT
-GGGTTTCTTCAGAGAGGAATTTGATGATGGAGAGAGGATGGGAGGGAGGCTCTCTCATGC
-TATACTGttttttgagatggagtcttgctctgttgccaggctggaatgcagtggcacaat
-ctcagctcactgcaacctctgcctcccgggttcaagtgattctcctgcctcatcctcccg
-agtagcggggactacaggggcccaccgccacacccggctaatttttgtattCACGCTATA
-CTTTTTTACCTTTTCTACTTCTTTCCCATATGATCTGTTGCTTAAAAAAAATCCAATATA
-TTTTAAAGCATAATATTTTACACGGGCAAAACAAGCACACCCCACAGTGGTCCTCCCCCT
-GCCTGACTGCATGCCTAGCGGCTCACTCGTCCACCTTTAAAAGGGGACTCGGTTTCTGGC
-CTCCTTGACTTCCCTCAGGGCGTCCCCTTTCCCAGGAATGTGCTCTCAGGTCTTGTCTCC
-CTGGAAAGGTTTCTCTGTTCCTGAAATTGCCTAGCACTTCCTGCCTTTCTGGGGACATTC
-CATGGGGATGAATCTCAGAAGGACAAGGCAGGGTCTCTCCTTTGTCTCCCCATCTGGACT
-GGGATCTCAGGGAGTGGTAGGGAAAAGGAGTTCTTCACTCTGTGGTCCCATTTCCAGCCT
-GGGCTCTCTTGGCCCAGGACCTGACTTGGAGCAGGCACCAATCAAGGCCGCCTGAATTAA
-GTGGCAGCCATTGGAAGATGGGCTAATGGCGGCAGTCCCTGAAACCATCAGTCCTTACAG
-GGGCTGTCTCTACCAGCTCTTCTCATTGATATTTTCAGACTGGACACATGGGtttcatcc
-tcaccgtaagccagagaggtcacagatgttaaagcaccccctcttttgaggcctccagcc
-actgaatgactggcccagaggcacccagccagttgtaaaagagctgggctagaaatctat
-gttgtccaacaatctgtcctgtttccaGGACATGATAGTGTCTGAAATCCCACTGTAAAT
-GCTCATCACCCTGAGCCTGGCTAGATGATGGAGGAACAGGCAGCTTTCTCAGCCCACTTA
-GAGAAACAGCTGACCATCTGGGAGCTCTGTCCCCTGCCCCCTCCACCCCCAGGTCCAGGT
-TGGGGCAGATCCATCCAGATGCGAGCCCAGCCTCCCTCGAGGCTCTTGCAGCCCAGGGAC
-AGCATGTTCACTCACAGGCAGGGCTATTTTGAGGGCTGAGGCCACAGTCCCAGCAGAGCC
-TGGGGCTTGGGCTTCTCAGACAAACTCTGGCAGGAGTGGCTGAGAAGGGCAGATAGGGGA
-GGGGGTGCAATATTAAGGTTGAATTAGAAAACTGGCCTTCCTCTCTTTTACTCTGTAAGT
-GCTCAGGGACAGGGAGAGCCGCCCCCTCCCACCCCAAGTCTGGAGGTCAGCTGGAGACCT
-AGGGTCCCAGAAGAATGCTGGGACTGttcacctccctgaacctcagtttcttcatctatg
-aaatggggacaaaatgattttacttgccatctcaaggtGCAGTCGAATGTGAATGCAGCT
-GTGTAAGCTGCTAAGTGTACTTAGAAGAGGTCTTGACggccgggtatggtggcttatgcc
-tgtaatcccagcacttttgggaggccgaggcaggcggatcacctgaggccaggagttcga
-gaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaaattagccag
-gtgtggtggctggcacctgtaatcccagctacttgggaggctggggcaggagaactgctt
-gaacccgggaggcggaggctgcagtgagttgagatcgtgccactgtactccagcctgggc
-gacagagcgagactccatcgcaaaaaaaaaaaaaaaaaaGTCCTGACAAGACCCCAGTTT
-GTTTGTCCCTTAGGAACTCAGCACCAAGGGTCTTCGGGAagcaccatggttaggagttag
-gctcaagtgagacagacctaggcttcgatccctactttgccaagggccaactactggacc
-tcaggcaagtgatttcatctcactgagcctcagtttcccccccgtaaaggggaattactt
-tacaggatcacacaagctaatctaggtaaagccttggcacagtgttgggaacaaagtaaa
-tgttcaataaatgttcataagtattattatCAGCATCATCTATGGACAGTGCCTCCTGGT
-CCCAGCTACCCTCTGGGTATACCAACAGGGGAGAGCCTTACAAGATGATCCTGTCCAATC
-CTCACCCCCAGGTGACAAAGGGAAAACAGGGCAGAGACAAGAACCCCCTTTCCACCTCCC
-ACGTGCTAATTCTACCACAGAGGGCCACACCTAACCCCTCCTTCAACAGAAAGATGCTAC
-AGGAAACTGTTTCCACGGCAACCCCAACTCCAGACTGGCCAGGATGGGAGGGAGGTGGTG
-GCTCAGGGTAAAGGAACGGGGTCTTGGGTCTTAAAGCTCTTCTGGCCCACAAAGCTCAGA
-AGGGAGCAAGAGCTCCCCAAGCCAGCCAGTTTTCTTCCAGCAGAGTCTTCAAGGGGCCAT
-AGCTGGCCAGGATTGCCCCTCTCGCCTATTCCCAGAGGAGACCGTGGGGTTGAGAGCATG
-GTTTCTACAGCCAAATTTGGCTGAGTTCTTGGTCCCATAGACAGATCCCAGGGAAGCGGC
-CAGGCCCAGGGGAGGCCCCTGTGAGCTGTGGGACAGGCCTGAGACCTGCAGAGAAGTCCC
-CCAGCCTGCTTGCTATGGGGGTGGACACATGACAGTTACAGGGACTTCCCTCTGTAACCT
-ATCCCACGTCCCaaccaggcaggcctgagtttgaatcctggttccatcactgactgtgtg
-tctctgcgccactggcagcacctctaagcaagtggggataaccacagcgcctcattcctg
-gctgttgcaggattttaatgataaatcataaagagcgcttagcacagATCAGTGCTCATG
-AAGGCTGCTGTCACTGCTGTTATTGGCCATTGTGCTCCCCCTCTGCACTCCTGCCACTTT
-TAACCTCTTCCCTCTTCCTTCTCTAGGCCTGAGCTCTTGCTGTATGCCCCAATCCTAGAA
-CACCCTTTCCTACCCCTTCATCGGCCTGCCCCTGTTCTAAAGCATCCTTCAGAAATGAGA
-CACAGAAACCCTGTCAGCACTCACCCTGGGTTGGAGGCTTTCTCTGGGCTCTGAGAATCC
-CTTTGTGCTTCCCCTCCCCCACCATCAGACCACAGCATCCTCATCTTCATCTCCCTGCCC
-TGACCCTGGGGCTGTACTGTCAGGTCCTGACTGGTGGAAGGGTGGGGACCTACAACCTGC
-TTCTCTGGGGTTCTCAGAGCCAACAGAAGGCAGCTGTTGGGTAGCTAAGGGTTGCTAACT
-GGAATGAATGGGTGAAAGGCAGTCAGGGAGTATCCCTGAGAGCCCCTTCAGGCCCTCCCA
-TCCCAGGAAGCCTTAAAGGCCCACTCCTGGCTTCTCAGCCCAGCCTGGGGCACTGACAGG
-GGCCCACAGCTGGGAGCAGCAGGGACCCTGGAGAGGGCACAAGCCTGAGGCTAAGAAGAC
-CGACGATTCAGGGCAACTGAGGCAGCCAAGTGTTGAGCAACCAGGCTGGATATCTGATGA
-GCCAGACAGAGGGTGGTCTCAGGCCAAGATGCAGAGGCCTCCGCAGAACAGGGTGGAGCA
-AGGGACCAACGGCAGCTGTGAGAACCAAACAGCAGGGAGTCAGGGGCCTAACTCCAATTC
-CCCATGCCCTTCCACTTGGCCACCAAAAGTCAGTACTCTCTCAGCCTCAGTTTCCCCGGA
-TGTAAATGGTAGCTGCTGGAATACAAGTTGTTAGACAGGCTTCTTTACTGTAGGAAAAGC
-CCAGGCCAGAAAGGCACACGGTCGGGGGATGAAGCAGGTTCCTTGGAGCCTGGGCAAGGT
-TTCAGCCAAGAGGCCACCTCTGCTGCCACACAGCCCCCGCCCACCCCTACCAGCCTGATC
-CACTTTCTTGCCCAGGACACATTGCAGGAGCTGCACACCAGCTCCCTCCAGCTGACCCAA
-GAGTGCCCTCTCCCAACACCACGTCCTTTTGGGGGCTGGGGACTCTCAGAGGGCCCCTTC
-TTCACTCCTACTGCTCATCCGCTGGGTACCTCAGGCTCTCGGTTGGCGGTTTGTGGCCTC
-CTTTCTTCTCAGTCTCCTGCTCTTGGGTTAGATCTTAGGACAGGGGACAATTATTTCAAG
-GTGGGGGCAACACACACCGGGCAAGCCCAGGGCCAGCGCCCCGGcttcccagctgagtaa
-atgtgggcaggtgatcccatctctgatgctcagatcctcatcaggataaaatgggcagaa
-aaactacctgcctgaagggattcttgtgaaggcaaaaaagtggatgtggagcgcatcggc
-acagaggaagactccataaaagatgggtctttgttACTCAGTCCTCATGCCGTCTTCCCA
-GCAGGAAGGAAGTTCCAGCACACCTTTCGTTGGAGGGGATATCCCACACTGAGCAGTTAA
-ATCAGACCCGAACTCTGGGTTTTCCCGCATCCTTCTGTTTGGGGGCCTGGGCATTAAGTC
-AGTGGTTCTGGGCTTGGGGTGCCGCACCCAGCACGAATTCCACGTCGCTTCCCCCTGGCC
-TCGTTGGGGACCCCTGCACCTCTCCGGTTCCCGCAGAGGCGCTGCCCCCCGCCTACCCCG
-ACCTGGCGGCCGCAGCGAGGGACGCAGCACACTCACCCCCTTGCGCTGGTTGCTGAGGCA
-GAAGGTGCAGATGGAgcgcggctggcggccgccgtcggcggcggcggggacggcgcccTT
-GGCACTGCCCGCGGCACGGAAGCACGGCTGCCCGTCGTCGGCCGAGTCGCCCAGCAGCAG
-CACGTTGGCCAGGTGCGCGATGTAGCTGGACGCCAGGCGCACGGTCTCGATCTTGGACAG
-CTTGCGGTCCACCGGCTCGGTGGGGATGAGCGTGCGCAGCGCCGTGAAGGCCGTGTTCAC
-GCTCTGAGTGCGGTCCCGCTCCCGCGCGTTGgccgcctgccgctgtcgcaccaccaccac
-ggggcccgcgccgccgccgccgcccgcccgccgcccgcccccggggcccgggccgcgccg
-cgccgcctccgggccctcgcagcagccgAACGACTGGTCCGACGCGTCGCTCTCGCTGCG
-GTTCTCCTCGTCCTCGCTCAGCAGCCGCACGTCCGGGTACAGCACGTGCGCGCCGACGGG
-CCGCAGCAGCGCGAACGCCATGGGCGCCGGCCGCGTCCCTCCGTGCGCCGCGTCCCAGCG
-TcggccgcgccccgccgtgcgctcccgcgcgctcccacggccccgccggcccccgccTTA
-TAGGCGAGGGAGGGGCCAATGGCAAggccgccccggccgggggcggagggctccgcccgg
-ccAATGGGGAGGCGTCCGCCCGGCCAATGGGGAGGCGTCCGCCGCGCCCTGGCCAATGGC
-GACGCTCCCACCGCCTCCGTCCCCCAGGTTGAAAGCGGCCCGGGAGCCGGCGGCCCACCC
-CGAAGGCCCCCGTTCCCGGCTGGCTAGCCCGGCAGATGCTGGAGGTCTGGGAGGGTCGGC
-CGGggtgggcccagatccgaactttttgtctccagcctggaccacctgggagacgcgggc
-agatccctttctcctctctgggcctcagtttcctcgttcggaaCGTTCAGATTGCAGAGA
-AACAGCTAGTGTCTGCCTGCCCTCCAATTCTAATCCTgtagttctgcagctttcacgtgc
-gtaagaactggggaaggggcttttgctattacagagtcccaaattgctcccattctgatt
-gagcagttctggaacgggcccaggaacctacattttgtaacaagccattggtgatagtgg
-tggtgtccgtggagaacacttggagaaAAGCTATAATCTTTCCAAATGAGGATTCGACAG
-TGTCTTGTCCCTGAAGACAAACTTAAAAAGAAGAAGAAAAAAAAAAGCAAAACAAAACCA
-CAATACACAAACACCAGTAGTTCGttcgttttttcaacaaatattcgttgggtccctact
-atgtgtcagacatggttttaggtctgaggatacagccattaacaaaataaattcttcacc
-ctcacggaactgacgttttggttaaggaACTACTGTGTACCAGACTCGGTGCTATATACT
-CTATTGCGCCCAGCTGAGGCTGCAGGATGGCAGCCCTGAGTTACAGGTCAGAGAGCTCCG
-GCCTTCAGTCGTACAGGTGGGAGTGGCGGCGCTAGCTCCAGCCTGTCCGGTTTCACTACC
-TCTTGGAATCCTACCACCACCATCCCATCACACACACACGGGCTATCTTTCCTCAATGCC
-TGCTTGCCTTCTAGAAACCTTAGATTGTTCAGCCTGACGTGTCCTCTTCAGAGAATTGCT
-GAGCCAAAGGTGGTTGCCGGGGTCTCGATCTCACTCGTGCCTGCTGCTCAGCTCTCTCCA
-GGCACTAGCTAAACCAGCATCCACTTGGCCTTGAAAATAAGCCCGAGTGGCAGCCGGTGT
-AGCAGACAGAGCGCAGGGAGTGGAGTTGAAAGGCTTCTAGGTGCATTTTGGCTCCTCTGG
-GCGTCTGTTTTCCTGACGATGCCTGCAGCTCTGCCATGCTGTGCTTTCCTGGCTTCCCTG
-ATCCAGGCCAGAATTAGGGGAAGAAGAGGGAGCGAGGGATTTCCCATGACTGCCGGGGGA
-GGAGCCCCTTAGGACCCAGGGTCTGCGGGAGAGTCTGTTCCCACACCTGGATCCCCCCAC
-CGCCAGCATTTGACCGTGACCCCAGCCAGGCTGGGCTTTGGGGAGGAGGGAAACAGCCAG
-CATGGGCCCCCTCCCCGCAGGGCTGGTCCCACACACAGCCCCAGACCAGGCTGCTGCTTC
-CTGAGCCGATGAATTATTACCGGGAGATTTCCTTCCCTGTCTGCGCCTCCTCACAGGGGC
-TCCCAGCTCACTTCACTTTCGCTTTCTCCCCCTTCTCCCCCTCCTCTCTGCTTCTGACCC
-TCAGGCAGCTTGAAATTCCTCTGTCCAGCCCCCTCCCAATTCCACCTCCAACTGGAGATG
-CCAACCAAGGCGTGAACTGGGCCCGGAAGGCGAAGAGGGGCTTGCCTTGTAGGCTCATTC
-ATTTATTTGCTCCTTAGGCATATTTTGACACTTGGGACCCTGGGAGTAGAAGAAAACCAT
-GAATGAGACTGAGACAGGCCTTCTGCAGCCGAGAGGGGAAGGCGAGCTGTAAACAAAGGA
-TTTCAAGACAATGTGGTAGGAGCAAGCCAGGGTCTGGTATCAGAGAGACCCAGTTCCGGT
-TCCAAGGTTAGCTGcttcccagagtctcagttgcctgctctgaaaatgagataataatag
-tacccattcccagggctggtgatggttccatgagtttgtgccagtagagctgggcttggc
-acacaggagtgctcagtaCCTGAGAGGAGTTTGTGCTACTGTTTTTAGGGGCTGGCCCCA
-GCCAACTGCCTGGGAAAGGGCTGAGCAGCATTGACTTTTCTAGGTCTTGTCCCTGGGAGT
-GCGGAGGGGACTCCTACCACATTCTCAGCTCACCTACACAGGGgacctcagcttccccca
-ttctctgtccctcactctgctccagccacactggcctccccactaaatctggagcccact
-tcttcctggcccccctggcccctgatagtctcatagtttgttcactcatttccttcaaat
-cttcactcaaatcttatctcagggaggcccttcctgaccaccagcactaacagtaatggc
-ttctccaacctgccagcacccccagctctccctttccccttatcctgctttatttctttt
-tatagcatttgtcactgactttcattcattcacttattcattctacaaatattaactgag
-cacctgctatgtgctaggcacagttctgggtactgcggatacagcagtagaGacattaca
-tatttatttgtctaccacctgtctccctccactagagtataagctccatggggcaggtac
-tttgtgtattttgctcatctcacttccttcccaacacaaccttctgaggtaggtattgtc
-attattcccattttacagatgaagatacggaggttcaaagaggggaaagtgacttgcccg
-aggtcacacggtgggccaatgtgggagctgagattggtctgactccaaagccattgctcc
-ttccctaaccacatggcttctGAGGCAGCCTAGAGGCCTGTGAGGGCTGAGTAGGAGTCT
-GCCAGGTAAGAGGAGACAGGTGTCACAGGCTGAGAGGGTAGAGGCTGGTCCCTGCCTCCC
-TGACCATGGGCACCCTTCACTTCTACAAAAAGCATTTGTTTCTCAGAGGCACCTGCTGTG
-CACAACTCTGAGCCTGTGCTCCAGCTGTCCTTCCTGCTTGGAATGCTGCCCCTTTGGGTC
-TGACCAGACATCCCTAGTCCTCTGCCAGTGTTCAGAGTAGCAGATGGTGAAGGCCTCTTT
-GCCACTTTTTGCCAACCTTGCTGCAAAGTCTTGTTGTGTTCATCACACCATATTTTGACT
-TTTCTCCCTTCATCCCTGATTCTCACTTCCATTTCCCTCCCCTAACAGGGCACCCACTCC
-CATATCTTTGACGCATGCCTTTGGATATATGTGTGTCTTTATAAAATGTGCATGGCGTTG
-ATTTGTGTGTGGAGGTTTTTAATGTATATAAATAGTGGTTTCAATAGATCTGTGTCATAG
-GCTATTTTGTTTCCTCGACACTGCTCTGTGtgctgagtccagctcaagtcccttggttcc
-cactgctgctaagcatgcacggtgtgcgtgtgccaccatgcctccttttcccaccgcttt
-agtgatggatgctggctacctccagttcccacctccccaagcaaagctgtgatggacttg
-cagtgtgtgactctcatggactcccgtgtgtatttctctgggatgtacactcgggggcag
-gatccctggggtggagagaatacatacagttactgcactctatgacggctgcctcagtct
-acatgcccagcagcagggcatgagggaccactttctccacatgcaccctagcacttggaa
-ttatctgACTTCCCAATGATGGAGATATGGGTTGTTTTCCATCTCCTTGTGCTTGCCTCC
-ATCACGGTGTGGGCAATAATGAATACTTGTTgcactttgggtggccgaggcgggtggatc
-attgaggtcaggagtctgagaccatcctggccaacatggagaaaccccgtctctagtgaa
-aatacaaaaattagccaggcgtggtggtgtacctgtaatcccagctactcaggaggctga
-gtcaggagaatcgcttgaacctgggaggcagaggttgcagtgagccgagatcgcgccact
-gcactccagcctgggtgacagagcaagactccAtctctctctctctctctctctctctat
-atatatatatatatatatacatatatatatgtatatatatgtatatatatgtgtatatat
-gtgtatatatatgtatatatgtgtatatatatatgtatatatatatataATGAATACTTG
-TTGAACAAATGAATGAAAAGGCTAATACACAGCCTCCCACACCTACCTTGTACCAAACCT
-CAGTCTAGAAGGTGGCGGTATATGTGTGTATGTTTGTGTGTAGAGAGGGGAATATAAGAC
-AAAGTCTTATGCCTCAACCTGCTTAGAGAAAAAGACTaatgacagttagcatttattgag
-ggcttactttgtgtcaagaattCATAGGTGTATATTCACAACCTTAACTTCAGTGAGACA
-AGTAAAATGCATTTCTCTCTCATTCAAGGCCTTTGGAGGTAGGGCTGCTCTGGCATTCCA
-CAGtgtggtcgccagcttccaagattgccagcaatgatccttgcctcctagtattcatct
-gcgtgtgtagaaccctcccccattgaatcagatttgactcatgtgaccaaaagaatatga
-cagaagtgacggtatgtgacttctgaatgtagctcataaaggcattgagctcctgccttg
-ttctcttgagtcatttactctggggacagcagccaccatgccatgaggacactcaagccg
-tctgtggagagagaccaaggtccctagcctacagccatcaccaatttgccagccaagtga
-gtgagcctccttggatgtggatcctgaattcctgacctgcaggacctgtgaaaaagaaga
-aagataatacagaaagacaaagaaaaaagataataaataattattggctgggcgcagtgg
-ctcacacctgtaatcccaggacttcacaaggctgaggccaaaggatcgtttgaggccagg
-agtttgagaccagcctgggtaacatagtgagaccctgtctctaaaagaaaaaaaaggaaa
-agaaatttgctggatgctctggtgcatgcctgtgttcccagctactctggaggctgaggc
-aggagggtcgcttgagcccaggagtttgaggctgcagtgagccatgatcacaccactgca
-ctccagcctgggcaacagagcaagaccttgtctctaaaaacacaaaaattatcaatgttg
-taatcccgtaagtttagggtgttttgttatgcaacattagataactaaaacaGATGGTgc
-cggggacccaggctctgtctatctttttactgcaccatacatagctttcacttcctagtt
-ctcttacagagccacatggccacaggagccattctatctgcattccaactggcaaaaagg
-agaaagaggcagaaggaagagcatgctttaatctgtagaacaccaacctcactccgttca
-catcccgttggcaagatcttgtcatttgaccatacttaactgaaaaggaggctgagtata
-tagtcttttgcaggtaggtgtccgtgtgtgcagctgaacactgggtttctgttagtgagg
-aagaagggaagaatggctattgaaaacaactaacCATAGGTGTTATATACCATAGGTGTT
-AACTCTGGAGATAATAATGTCACAtggttaagtttgcacatttgggagcctgactgcctg
-gtttcagttctcagttaggccacttaccagatgtgtgatcttgggaaatttaccaaactt
-ttctgggcctcagtttcctcatctgtaaacagggctcacagtaaagcctgcctcataggg
-ttgttatgaggattaaatgagtcaatgtatgtagcgtttataacagtcctggcacatggt
-atgtgctGTGTGTTAGCTGTTTTCATTATATAATCCTTACAAGGGttttttttttttttt
-gacagagtttcacaattattgcccaggctggagtgcaatggtgcgatcgcagctcactgc
-aacctctgcctcccaggaggattctcctgcctcagcttcccatgtagctgggattacagg
-catgcaccagcatgcctggctgattttgtatttttagtagagactgggtttcaccacatt
-ggtcaggctggtcttgaactcctgacctcaagtgatccaccctctttggcctcgtaaagt
-gctgggattacaggcatgagccaccgcgcctggccACAAGGGGTTTTCTTAAGTTCTCAC
-AACCAGCAAGTGATGGAAGCAGAATTTGGCCCAAAAGCATTTTTTTCCACTTGCGTCATC
-CCATAGAAATTCGTAGAGTGCAAGATCAAGAcccagatcagtacaccgcacataatacgc
-atccagaaatatctgtcgaatgagtgagtTAAATAAACACGTAAACTGTCCTTACATAGA
-GATGCTAGGTTTTGTTTGGTTTTGTTTTATGTTCAGTTAATGAGAATGCTCCATTGACCC
-CATCTGGTTCCTCTAGTATGGGGCTGATGCCCTTGATACCATGCTAGAACTCAGTCCCTC
-CAGGGTCCCTCCAAGCCATCATTTTTAAGGGTGAATTCCTGGGAACACTTGTTCTTGCGG
-ATGCTCAGGATTCCATGATTTTTTttaaaaaaagtcagagaagctgcattttatatcccc
-ctcctagcgacctgcaacaacattagcatgttaaagagtcggagaaatcctgcaacaaaa
-aagcttgttgggcttcatttcaatctgcattttgttttcttatttttttgagacgaggtc
-ttactctgttgcccaggctggagtatagtgatgcaatcatggttcactgcagcctcgacc
-tcccaggctcaagcaatcctcccacctcagcctcccaaataactaggactacaggcatgt
-gacaaacccagttaatttttaatttttttgtagagatttaatttttttttttgtaggcaa
-ctatgttgcctaagctagtctctaattcctggactcaagcaatccttctgccttggcctc
-ccaaagtgctgagattacaaacatgagctaccgtgcctggtctcaatctgcattttctga
-gcttatttTAGGCTTACTTGATTAAAGACTCACTTCCTGCCCCCAACACCAGACACCTAA
-TAGAGAATACAGTTTAGCAGACATTTCTCCGGGCTGTTGCCACTGACATCTACCTCAGTG
-TGAGTGGGTATCCATTCTTTCTAGACAGCATGTTTGATAGGAGTGAAGTGGAAGTGAGCA
-GGTGGGTGCTGGTTACCAGGAAGAGACAGGGTAAGAGAGGGAACATACAGGCATATGTCC
-GAGCCCCACTTTCTAAGGGACATAAAAATATCATTGAAAATATAATAGGTGGAGAAAAGT
-GTATTTCGTGGTACTTCTTTCAGGGAAAATGCAATGTAAATTGAaataataatattattg
-aggggtaacaatatgccaggcactctgctaggaacttatttaatcctcacagcagtctca
-tgagctaagtactattaatattcccgttctataggtgagtagactaaagagcagaaaggt
-taagtaatttgcttaaggtcacatagctagggagtggacaggaattcTTTGATAAGTTGC
-TTGTGGTGAGGATAACAAGGGAAGACCCTCCCCCGGGGTAGTTTAAGCTCAGATGCTCAC
-AAAACTCTGCTCCAGGGAGAGTGAGCCTACTTGGTTGAAGAGCACTGATTTTGTTGAGTA
-GAGGATGCAAGTTTGGGCCAGAGTGGAATTGTTCAAGAATAGAGAGGAGGTTGGTGCTGC
-CATGGGTGCCCTCCTTCAGCTCCATCGCTTTAAGGAAAGGATGAGCTCATGTTTAAAGAC
-TTTTAAGTTGAAGGCAGTGCTAAATAATTTAGTGTGGTCAGGTACCCACCTGACTCAGGT
-TGACCCTGACACCAGTGCCAGGTGTGGCAGAATCACCAAAATGGTGTGGAAGATCAAGAT
-AATGCTAAAtgaaactaccatttaagtctgctttgaaaactcaaggagtttggagctcag
-agttgccaagaacaagttggaatggcctgaggctgccatgctatgaggaagcccaggcca
-catggagaggccacatgcttttgactggtcgttctggtctttcaattctcccagctccag
-gaacagacacatgagtgaagaggctttcatacaattccagccccagttatcgagtctttg
-ccattgaagcctcagacatcatggacagtgacaagtcttcactgctctacccattctgaa
-tcctgaactacagaatccgtgagcataaggaaatgcttaagacaccaaattgtggggtaa
-tttgTCACACAGCAACACTAATTGTGACTGTAGCTCACTAAAATGCCTCCCAAATATTAT
-CTTCACAACTAAAAGCACCAAAAAACCTGAAAGTAcagttgaatttcatgatttgctata
-attatattctagaaagtcactgcaaacactgaattagcaaatactgaaccactgctccta
-ggagaaatacaggcttaggttcctgtgaaccattctgttcccaacatgttcatcaactca
-tcaatacttaagcttgttttatgcatgtttctgttgaaagacaccatgtttaatacatat
-tgttgattcactcacattgcactcatggccaacagcactgtaactcacgcctgaatgaag
-cttatctaactcacatgatcttctctgtaaggcacatcaaagccttctggtgcttaggaa
-cattagacagcacctcagcaccatgcccggggccattgtcaacagtacaatcaccagcgg
-aagacacaaaaatttgtaaaatgtggcactgaatagactgaaaaggacagttgtttacag
-tgtgagagctgaaagaagaaggcagcgtgtcactttgtatgatctcacctggaaacatgc
-atcaagtgactcaaaaaaaattttttttttcgagacagggtctcactctgttgccaggct
-ggagtgcagtggtgggatctctgctcactgcaacctccgcctcccgggttcaagcagttc
-tcctgcctcagcctcccaagtagctgggactacaggcacacgccaccacacctggctgat
-ttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcaatcgctt
-gaccttgttatctgcccacctcggcctcccaaagtgctaggattacaggcgtgagccact
-gcgcccaactggcaactcaaatttttcatgactcctcaagtatccatcaatgaccatgag
-agctccagcgagtgttgattttgaggttacaaatttagtgagtagatgaatccacgactc
-cacaatcagtgactaataagaattgactgCATTATTTAATAAGTTCAGGGCTTGCCGTCG
-TGATTCACAATTGGAGAAAGCGAGGCATGGAGCAAGTCCAGGGGTGTTCCAAAAGGCCTC
-ACTTTTCTCCTTTGCAAACTGTGGCTGATGAGGGCCATCCTGCGGGGTTTGTGGAGAGAA
-GGGATAGTAACAACAGCTGCATTGTATGGTGCTAtgtgctgcacactttgcacacctgat
-catttaatactcacaatgatccctagcagatggatcctattaccaagttcattttacaga
-tgaggaagcttagacccagcaaggttaaggggctgtgctcaaggtcttaccttctaggag
-aggcagagctggatctgaagccatttctgttctcagcccctgctGTGTGCTTTCCTACCA
-TCCTCTCCAGACTCGCCCTGAGCCCAAGTTGCtgaggcatgtggcacggtgcctggcaca
-cagtaggctcacagtagtggctgctttGATGATGACCATAAACTGGGATCTGGGGTCCTT
-GAGATGATTCTACCAAGGGGACCCGGGGGAAGCTGAGCCCTGGGGCAAAGTGGGGGCCAG
-CACAGGAGCTGCTGGGGAAGGAACAGAGCCTGTGCGGTGGGAAGATAGGACATGGAGCAA
-AGAGGATCTTGAATCAGACCCCGTGGTCCCCTCCTACAGAGGGTTAAAGCAAGCCAGCCT
-CCTTCCGGCTGAGCGGAAATCAGATTTTGAGAGCTGAGCAGGGCTCTGGAGGGATGTTTT
-TCTTCTCCATTTGTCTGCTTGTGGCTGGCCCATAAAATCCACCGGAACTCCATGCTGGAC
-TGAGGAATTCCTGCTGAACAGGGACATGGAGAACGCAGGCTGGGAGGGGGCATAGTGTGG
-ATCCTTATCAGAGCAGAGACCACCCCATCTTCAAGGCCCCACCTCCAGGTTGGGTGATCC
-CCTCTGGAGGCCTCATAGGATTCCTGGGTAAGGGGAGGGACCAGGATCGACAGGGTGGGG
-GAAAGTCCAAGGAACAAGTGATACCCCCTCCCACCTTTTCAAAGTGAACTTGTGGGGTGA
-GGAATGAGAGGAGACAGGGAGGGTCAGGCTGTGGCAGGTCAGTGAAGTGtgatgcaggtt
-ccaccttctacgctgtgtgacattgggcaagtctctgcccgtttcctcatcattgcaacc
-agggggctggagctagatgaccaccatgtgtaattttctaatcagagctgacagtctgag
-gctctTTCTGTCTAGTTTGCACCTTGCATGCATGTCCTCCCCTGAAGGCAGTGCAattat
-tataacccctattttaaaggtaaataaaccaaggctcactgaggcaaggtgacctgagca
-attttgcccttgaagggctgggacaggatgcaaacctagacaattggtgccagaattcat
-ctctcaagcattcgctctcctgCCTCCCAACACGAGTTTCTACttctctttgccctggga
-tgacctctcctttgtctcttggcttgatgacctcatttttaaagattcggctcatgcatc
-acctcccccaagaagcctgtcctgactaactaagctcggttggggctcctctctgtctgc
-tcatgcctctgggaagtagctgtctcttttggtcactgggctgtgagccctggatgagca
-gagccacttctcattccttcctgtgcctcctgcatcAGCCAACATAAAAAGCTTTCAATT
-TTCCTTGAAGATTCTAAGTGCTTGTGGTGGTTTTAGAACATGGCTGCCTTAAGAAGTGGG
-GTCCATTggtagctcatgcctgtaatcccagcactttgggaggctgaggcaggaggattg
-cttgagcccaggaagctgaggccagcctgggcaacacagcaaaatcccgtctctacaaaa
-aatacaaaaattagccagatgtggcagcatgtgcctgtgggctcagccccttgggaggct
-gtggcaggaggatcacctgaacctggggaggtcaaggctgctgtgagctgtgattgcacc
-accgcactccagcctgggtgatagagggagaccctgtctcaaaaaaaaaatggggtttat
-gtctcctcctcttgagtctgggtgggctcgtaacagctttaaccaatagaatatgtcaga
-agtgactctgcgactactgagactgttcactggcactctgtttttggagccctgagctgc
-cgtagaagatgttcaaatactctgggactaccatgctgtggggtcacatgtaggccctcc
-tagtcttcaagtcatcctggtctggggactccagatgattccagttcttagttgtttcat
-atccagcctttgagtcctcccggctgaggaccaagacaccacggagcaaaaacaagccat
-ccccaccactcctggcccgaattcctaagcataataaaatggtggctgcttaaagccacg
-gagttttggggtagtttgttacacagaggtggtaacgggaacaGtgcgaccaccctgggc
-atgtcaccttcctctctggccagccagaaggtgcagcagccacaaagctctctgcctcct
-cccttccctcagcggtgtgctgctgacacagcagtcagagatgccccataaatgcttcaa
-acagaccatgtccctcctttgctcaaaaccgtctgttggctcccagctcactcagaggaa
-atgccagattcttaccatggcccacgggccctacatgatgggacccctctccagcccatg
-gcctctctgtcctgtctcccaccctctcccttctccagccacaccacctccttgctactc
-cttgaacaccacatacgccctgtctcagggcctttgcgcttgccaaggacagtgctccat
-tgcctggaacattctttctccaggtgttgcttggttcagtccctcatcttgttcatgtcc
-ctgctcagatgtcatcttctcagtgaggccctctcttcctactcccaaaccccttgactt
-gctctattttcctctcgccatggcccttagaactacctaacacactatgcactttactta
-ttgtgtttccccgcccaccccgtccaccctagaatgtcaataccacagggcaggaatctt
-ggttattctttaatgtctccccagtgcctgtaagagtacccaacactcacagtggtttgc
-tgaatgaatgaatGAATGAGCTGTAGGAGCCCAGAAGGGGTTCGTTGCCTTCCCTAGGAC
-TATGTATGTGGGGAAGCAGAGTGGGTGAGGAAAGGGCAGGATTGGAGTGACTGGGTTGAG
-CCAGTGTGGCCAGGGCTGGAGGACATTTCTTGGAAGTGACAACTCACTGCCCAGCTGGGG
-AATCCTGAGGATGGGAGAGTGCAGGGCAAGCCTTTGAAGATGCAAACATGGGTCGTCTCC
-GGGGCCTCCCTCCTTCCTGGTCTTGTGTGTCTCCGGCCCTGCCAGTAAACAGGATCTCTG
-GGCAACTGCCTGAGAACCCTGCCCAGTGCCCCAGAGGCCCTGACGTGCTCCTTCCTGAGC
-TATAAATCAGGTACCTTCCAGCTGTGTGACATCCTGGATTTGATGGGGAAGGCAGAGCAG
-ACAGATTTGTTGCAAAGAGCTGTGCActgcaccttgatttccttgttagcaaaataggaa
-ggataggagcgttgacttcaagctgtggctgtgaaatcgagtgagataatgcatgaaaTT
-CCTCTGTAAACAGAGATGCTTCAAGGACGCATTAGTGGGTGGAGGCACAGGgagcaaatc
-ccaactctgccgctgagctctgtgtcttcacctgtaaaatggggttaatgtgaatcacta
-acttcctagggctattgagggattcaaaaatggagagaaaagtcttagtacccaatgaac
-gtgcaatagatattagctgttattaATGGTAACTATTACCATAATGATAAAGAATCAGAT
-GTTATTGATAAGCCATTTGGGAGACCGAGAGTCTCAGTTCATACCCCAGAGGGGACCATG
-GACTTGGCACAGCACGATTTCAACCCTGTGCCTTTTGTGTATATTTCAATCTGGTCAGAG
-ACTATCTCCCACTCACAGGCCACCTCCTCCCCCTACCCCCAGAAAGGCTATACTTGTGAG
-CACACCACTTCCCTAAAATATGCCACAAGAGTCGACATCTagccaggcacagtggctcat
-gtctataatcccagcaatttgggaggccaaggtaggaggatagcttgaatccaggagttc
-gagaccagcctgggcaagatggtgaaaccatctctactaaataattttttaaaaattagc
-tgggtgtggtagtgtgcacctgtagtcccagctacttgggaggctaaagtgggaggattg
-cttgagcccagaaattcaaggctgcagtgagctgtggttgtaccattccacttcagcctg
-ggcaacagggcaagaccttgtctctaaaaaaatttaaaacaaacaaacaaacaaagaATA
-AATATCTAGCCTTGAAGCCAGCCTTGGGGGTGGGGTGGGAGGAGGACTATTTGTGtgcag
-gagttcaaacccaggccccatcactccccagatgtggaaacttagacatgttatttaatt
-gtcctatgcctcagttccctcaactgaaaaagagaataataatagtacccatctcttcta
-gttgcattgaggactgaatgagttaaAAAGTACCcaacacaccatatgagataatgctat
-tttcattctaccaatgggtaaactgaggctcagctaggagaaagaacttggttcaagCTA
-TCAGTCGTGTTGTTTATTGGCCCTAAGTTGTGACGAGTTTCATTATACCATTAGAAGCCC
-CCGAACAGTGAACTCATTGTTTGTGAGGTATCTCTATCTCTTAGTGATTTTTTAGTTAAA
-TGAGAGTCCATGCTAATCATTTATAAAAAATGGATAAGATAAAAACTTAACATTGAAACA
-TCCATGGGCTTCTTTCCATAAGAAATGGAGAAACTCTTGCTCCTAGTATTAAAAGGTCGT
-GGGTTCCAGTTTGAGATGCACCAAGCAAGGTAATAGGAAGTCCTTGAAGGTTCTTGAGCA
-GGGGGAAGCATGAACTTAAAGCATATGAACCATGTGTTTGGGTCAATTCAagttactgag
-acttagacattgctggtgggatgcaaattgctacaatctctgtggagggtgattgagttc
-cacaaatatttaagataaatgtaagagctcctaccAAAtgccaggtgctgttcaggtgct
-aaggatttgcagcaaataaatccaaccaagtccctctgcctggtgcttattttctggaga
-ggagacacacaatgaatgaatatacaacttagtatagcgtgCACTGGGGAAAGAAATAAG
-AGCATTTCTACAATAATGTTTACTGCAGTGTGAAGGGGGATCTGAAGAGGCTGGACAGAG
-CCAAGTATGGGTGAAGATGTGGAGATAGCGCTGGGGGTGTGTGGACTGGAGCTGCCATCT
-GGAGAGCAATCTGTCCAGTTAAATCTGTACATTGggtgcataaattatggccaccaatta
-tttgacattcctcccatctagatgtaggtctatgtatctgctctctgaatctgggctggc
-ctctgactgctttgacaaacaactatggtggaagtgatgatgtgtcagtttccaggccta
-ggctttaaaagattggcagcttctacttcctctttcttggaacaattacttgaggggaag
-ccagctgccatgaagaactccagccaccccaagactgccattctgtgaggaagtcccgcg
-aacaatggaaagaagtcctctaggatgagacaccatgtgatggagagagaggccaggaac
-atcaaggctgtagacatgagtgaagatgccatcttgaaagggaacctccagccgtagctg
-tttcagttgataccacaaggttcagaaaggagccacccagctgagtccttcctaaattcc
-tgactcacaaagtaatgaacaaagtggttgctttaagcctctaagttgagggtagtttat
-tgtagtgcaaaagataaccagaataGATatatccgatgacccagcaattatactcctggc
-tatatgtccagacaaaatTCTCTTATCAGCCCATAGAGGATATGGCCATATTGTTGTGGC
-AACAGAGAGTTAGAGGCCACTCAGGTATCCATTACTGGGGTGGTAGAAAGGAATACATGG
-TAGGTGCAAAGAGCTCTAGGCAGCAATCAGAAGTCACAGGTGAAGCCACACATACAAGTC
-TGTTATGTTCTACGTGAAGACTTATACACCACAGAATGCACAAAGAACCCATCAGAATCT
-ATGGAGGTGCAGAAAATATGAAGGGGAAATGGGATAAAAAGGAATAACTAGAGAGAGAGA
-AACAAAACCAAACAAAGGAGGGTGCACAGGGGTAAGTTATGATAATCTGCCATGAATTGA
-GGTCTTATTAAACTCAACGCTCTACATTTAAAATCTAAAAAgtaataacaaaggccaaca
-aaattaatgtgtgtgaatagggggttggttaaataaattgtagcacatccacatgaggga
-gtactgtaaagccataaaaaagagtggcagagcttgctatgtactaacatgtaagagtcc
-caaagtatgtcgaaaaggctataagaagggtattgaaaaggatgcataataggcttccat
-ttgGGGGGAGATACCAGTGTGTGTGGTTGTGGATATGTTTATAGACAAATGGTATATCTG
-TGGAAGGATGCTCCTGGGGAAAAGAGCCAGATGTCAGGGGAGAGGGGTGGATGGCACTTC
-AGAAGAGCAGGCACCCAGGAGCTGTGTTCAGAGAAGGAATTGCCACTAACACTGGGACCA
-CCTCCTCCAGGCCAGGATCACGCCAGGTGTGGGGGCTCAGAGTGGGCAGAGAGCCTCTGC
-TGCTTCCAAGATGCCCAGGGTCCTGACTGTGTCCATGATGCAACCTCAGCCAACAAGTTG
-GTTGGGCACTGCCCACTGCTGTGCCCTCATCAGCCACTGTCCTCACTTCATTGCCACTCA
-CCATCACCACTCTCCTTCATTCTGCCTGAAACACTCCTCCCCACTGCCCGTCTCCCTCTG
-TTACTTAATACTCAAACTAGTACAGAGAATAACAGAATAAAATCCCATGTACTCACTGCT
-CAGTTTAAGGAATAATACttttcttttcttttttgagatgaagtctcgctctgttgccca
-ggctggggtgcagcagcgtgatctcagctcactgcaacctccgcctcccagattcaagtg
-attcttctgcctcagcctcctgagtagctgggattacagggatacgccaccacacctggc
-taatttttgtatttttagtagagatgggatttcaccaagttggtcaggctggtctcaaac
-tcctgacctcgtgatctgcctgccccggcctcccaaaatgctgggattacaggcatgagc
-cactgcgcctggccTAAAACTTTTCAAAAAGAATTGAGAGTGAAtggttttaaatatgtc
-cacaaattcttggacactcctctcttcaaaaagtagagttacattctccttacctttgag
-tatgggctgagctcagcaactcatgtctaatgaagaggatgtggtgaatgaggatgggtc
-acaaaagggatacaacttctgcttaattgtccatctgtccgtctatctctccatgctcac
-ttttggaatccagccaccatgttgtgatagaacccaagatgcatgggcgggcccacatgg
-agaggaactgaggccctctcccctcttcccagtccctgatcaacaaccatcacaaatttg
-ctagccacccagatgaaccccctttggcttggcagcaaattctccagcttaccctccaac
-tccccaacccgataggccttcagatgactgcaggcccagctgacagctgaatttagcttc
-ctgaggaccagaaccacccagctaaaccatgcccatattcctgccttcagaaactgtgag
-atataaaaaatgactgttagtactttgaaaacattatgttttgggatgatttctaatgca
-ggatcgattgctaatacaGAGGGTCCCTGGTATCCCTCCCCACCATCCCCATCCACCCTC
-TTAGAAGCCACAATCCTGATGTTTATTATTTCCATGAATGTTTTACCTTTTACTACATAT
-AATAAATCCTTACCCAATACATAGGACTATAtttccttcttttttaaagaattttttctt
-tttgagatggagttttgctcttgttgctcaggctggggtgcaatggcgcgatctcggctc
-actgcaacctccgcttctcgagttcaagcgtcattctTAAAAATGtatagaagtgcatat
-atattgtatggattctgtgcatcctacctcgcatgctcttttccttgcacagtgtgcatt
-ggcgacccatctgcattgaggcaggcagctgccattcgttggcactgctgggcattcttc
-ccttatatgaatatgttaataccacgatatagtatctgaagtccatgttgatgaacattt
-ggatggtttttattttttgctattacaaacaacagcgctggtaacatccACTTGCCCTCT
-TCCCTCTTTCACATGGCACCTTCTTGTTCTTGGAGGTCTCAGCTCTAACAATGTAACCCC
-ACCAACCCCCCGCTCCAGCTAATGGGTTCTCTGTCCCCACATGTGCCTCCCAAGCTGGCT
-TTTGATGGTGctccctctgtttttccttctggcatctactccgtgtggtcaacattcagt
-tatcttttcctgtctggagctagagggtaagccccatgaaggcaggcagagtagtgggtt
-tttttccccagtcccctccatccctgatgctttgcacagggcctggcacacagtaggttc
-gcaagaaaaattgttggatcaggaatgGCTGAGAATTAGcttcctctctttgggcttcag
-ttttcccatctgcacagtgaaaactttagataatttcGGGGTGATTTTAGGTTTAGCCTT
-TGAGAGGTGCCTCAGTGGCCGCCACAAAATATCGGAAGACCCCAACTTTCAGCAGAGCTG
-GCCTTGTTTCCCTTGTGTCTTAGATTGGTCTCTATGGCAGATTATGTTTAAAaagaatag
-ccaccatttattgagcgctcactacgtgataggcatgctgtcagctggcagatgcatttc
-ctcattttggccactcattaaccctcagaagtagcactgttactatgctctttataaaga
-ggggtaaactgaggcaaagagaggtgaagtcacttgtcagaggactagcaaaggagggag
-ctgggatttgtagcacaagagactatcagagcccattcgccaaccctggtgcagccctgc
-cccactgGTACCACAGCTTTAAAGAAGTGGGGTGGGAGGCAGAGGAGGAGGACGGTGAAG
-GACAAGGGTGAAGAGAAATGTTTGGATAAGTTTGACAGCCACTCTTCTGAAGGGCTTTGC
-CAGCCGCAGCATTCGGGTGTCCCTAGTCACGGGGGCTCCGTCACTTCCCTATCCCCCTGT
-TTCCCGGCCCTGATgggtcttgctctgtcacccaggaggctggagtgcagtggcgtgatc
-acagctcactgcagcctggaactcccgggctcaagtgatgttccccatcagccttcctag
-tagctgcgactacaggcgtgcaccaccatgcccagctaagttttaaatgtttatatagac
-acagggtctcactatgttgcccaggctggtctcgaactcctggcctaaagcaatcctcct
-gtcttggcctctcagagcactgggattaaagtgtgagccactgtgcctggctGAGattta
-ttgatcacatagatacctatattattctaagtgtttttcaagtgacaactcatttaatct
-tcataactgtcctgtgacgtagatagtatcagttttatcagtattttatggagattaagt
-aacagaagcacagaaaggtcaagtaacttgcacagagtcacacagctggtaagatgtgga
-cccagctttgaatccaggcagtccagctccagaatccttgtgcttcacATCACCACACGC
-TGCCTTCACCATCACGTGTCAGTTCCACACAAGTGGATGCCCACAATGGTTGGGAGTAAG
-GGGAAAAGGAGTAGGGCTTGAGGAAAAAATAAAAGTGAAGCGTGTGATGATAATGAGCTA
-TGCTTGAGAAATGGGATTAACTCAGCTCTCTGTACTTGATAGAaaaaagaaggagaagga
-ggagaggaaagaagaagaaggaaaTATTTAACTGGACTCTCCGGGGCTTAATTATAACAA
-CTGTCTGGCACCTAAGGTCCTTCCCTAGCTGGGcttgctgcttctctaatctcatttccc
-tacgtttctcacggtgctccagtcactccaggccacacctgatcccagaaacctacttgt
-tcctactttgagcctttgcttgtgctgtttcttccattaagggtgccctttttgccaggt
-gcagtggctcatgcctataatcccagcactttgggaggccgaggtgggacaatcacctga
-ggtcaggagttcgagaccagcctggccaacatggtgaaaccccgtctctactaaaaacac
-aaaagttagccaggcgtggtggcaggtgcttgtaatcccaactacttgggcggctgaggt
-gggaggatcgcttgaacctgggaggcagaggttgcaatgagctgagatcatgtcgctaca
-ctccagcctgggcaacagagctagagactccgtcacaaaaaaaaaaaaaaaaaaaaaaaa
-agagtgctcctttccccattttaggaactcctacacatccatcaaaacctggcctaaagg
-ccctctcctcaatggaaccttttccagcctttcacttcttggggttcccacagcccttta
-catgtctctattctggttggctcacctgctagccagtgagctcctggaggacagggatgg
-gtctggctcatctctttaaccgccatgctgagcccagagcctggtaaatggtgggtgctc
-tataaGCTCGTGCCCAGTCACTCACCTTTACAGCTCcagtgtctggctgacagtgggtgc
-tcagtacatgtggttggacagatcaatGAGTGAATATTTGACGGAAGGGTGAATAATGAC
-ATCAAGGCTGCATTCCAATAACAGCACAATCCCAGTGCTGAGAAAACAATTCACAGCCCT
-GGATTCATATCATGGAATTCTGATTCCTAGGCCCCTTTGTTCCCAGAGCTATCCGATGAT
-GCTGAAGAAGAGTCCCTGGGCATCATCTGTTccagctgtgtgaccttgagcaagttgttt
-aaccaccttgtgccccaagattctcatctgcataaagaagagaaatagctacaccttcct
-catgggctagttacaaggatgaaatttgatcatatgtgccaagcacttaacacaacacat
-gaacatCACGGCATTGGCATGTCAGCTATGCCAATGACTCTATTTATACCTGAAttttta
-tttgaaataatttcagacttacagaaagtttgcaataataatacaaagaattcctacata
-ccatcacccagattccttaaatgttaacattttgcattctttgctttttcattctctctc
-agcatatatttttgtccagtgcctgaattgttggaaataagttgcagacatgttgactct
-ttacctctaagttaattatcccatgtatatttctaaaaacaagaatattctcttacaaaa
-tcgcaggacagatagaaaaatcaggacactgatacaatgctattgtctatcttatagacc
-tattgaaattttttcagttctactaatgtcctttgtagcaaataaacaaaaagatttcta
-cccccccaccccacccactcagtaaccagtccaggacacatgttgtatttaatgtttatg
-tctctttagtcttctttttagtcttatctggagcagtttcttttttttgagacagagtct
-tgctctgttgcccaggctggagtgcagtggtgccacctcggctcactgcaacctctgtct
-cccaggttgaagtgattctcctgcctcagtctcccgagtagcaggaattacaggcgcctg
-ccaccacgttcagctaatttttgtatttttttagttttaccacgttgaccaggttggtct
-cgaattcctggcctcaagtgatccacctgcctcggcctcccgaagtgctgggattacagg
-cgtgagccactgtacccagcgtggaacagtttctttggcttttatggctgacattatttg
-aagagtttaggccagttttttgttttgttttgttttggtttTTGAagatggagtttcact
-cttattgcccaggctggagtgcaatggcaccatcttggctcactgcaacctccgcctctg
-ggttcaagcgattctcctgcctcagcctcctgagtagctaggattacaggcgctcgccac
-tatgcctggctaattttttgtatttttagtagagacagggtttcaccatgttggccaggc
-tggtctcgaactcctgatctcaggtgatccatctgcctcggcctctcaaagtgctgggat
-tacaggtgtaagccactgtgcccagcctggaacagtttctttgacttttatgatcaacat
-tatttgaaaagtttagaccagttgttttgcagattgtccctctgtttggatttttgtgtt
-atttctttatgcttggattcagatcaggcacttgtggcaagaacaccgcatcagtgacgc
-tttgtccttcacagtgcgtcccatcagggggcccatgatgcctgccgacttgccccacta
-ttagcaatgttcactgtgatcatttggtgaaggtggtgtctgccagttttccctactgta
-aagttaccatttttctctttgtaattaacgaataccttataggaagatacactgatacta
-tgtaaatattctgtttctctttatatttcctgcccatatatttcctagcaggatgatcta
-ttttgcaatagatgcaattattatttgatAAAGGAATACATAAACATGGACCAATATTCC
-AACAGTATAAAAGAGTGTAAGGCAAATctcccacccactccgtccccagccaccccgatc
-ctctccccaagccatccctagtctcactgtttcttgtgtccttccagaaatgttctatgc
-atagacaagcgaatccactcatccatcttcttctcgagttatgtgcatgcagaaggtagc
-taaatagacacatgatctgcatcttgttttatttcatttaatattttggagaccatttca
-tatttgaacacaaagaGAGATCTCTTGCTGATTTTAGAAACTTATGTCCATCTGAGGTGC
-AATCCCAGGGtagtcaatctctttcaggttcacaaataaggaagctgagactcagagtgg
-ggaagggacaggtcccaatgtcagaggcaaaacagacTTGGAAACCAGCCTGGAACCCCT
-GAATAAGAGAGTTGACAGGTCTTACTATTGGGGAACCAGTCCTTCCAAGGGCCTTTTCAA
-CAAAATGCCAGACCCAGGCTCATGCCCCCGTTCTCAGCCTGGCTTCTCCCTCCTTCCCCC
-CTCCTCCCCTGGGTCCCTTCTTAACTCTCGTTAGGGACTCCCCTCCAGCTCCCTGCTGGG
-CCAGGCCTTGGGAGCCCCATTGATCCTCTGACAGCCCAAGACAGATTGGTGGGGAGTGTG
-TATTCAGGTGCAGGCGCCAGCACATGGAGGCCAGATGAGAATGGGGTGGAGGGGGTCAGG
-GGCCTGCTGGGGTGGGGGGATTGAGGATTGAGGAAGGCCAGGATAGTGCATCCCACAGAC
-ACCTGCCTCCCCTCTTTCTCCCCCACCAATTCCTGCCCTTCTTGGGGCTTCTGTTCCTCC
-CGCCTCCTCTTGCCAGGCGTGGGCAGGCCAGAGGGGCTGGGGCAGGGCCTGGGAGGCCTG
-GGggtgtagcagagagaagtcgggatggggagtgagccttgcttggtttgatctcagctc
-aggccctcttgtgagactcaggcagatgacatctcttgagcctccgtctcctcggggcaa
-taagaaggaaataaACTTCATACAGCGTCCAGCAGCCAGTGAGGCATGGCCAGTAAAGGT
-CTCCATGTCCTTCATTGGCCTCTTAAGGCTCCCACTGCATTGTTCCTGTCTGATTATGGA
-AGCCCCCAAGCCAAGGCGGCCCCTCGGCTCTGCCTGCGGAAAGTTTTCCCTTCACCTGCG
-CAGACCAGGCCGATGTGGCCTCCAGAATGGAGGGGTCAGCCTAGGTTGCCTGTGACAACT
-CTGAAAGGCCTTAGGAGGCACAGCATCTCAAGTGCACACCCGAGTATGGCGTGATCTGCA
-AGGGGAATAGGGGCTGGGGGGAGACATAGGCTTTGAAGATGAATCAGGCTGGAGCAGGGT
-GGAAGTGGGCTCAGGGAGATGGAGCAGGAGGGGTTGGTCAGGGAAGAGGGAGCTCAAGGG
-AGGAGACATAAGCGCAGAGAGTGAGATAGATAGGGACCCAGCAGCAAGTGGGCTCAGAGA
-GGGGCTGTGGTGCAGAGAGAATGAGACTCAGATGGGGGCTGTAGACTCAGAGAGAGAGAT
-GGGGACAAAAGGGGAGTGGGGGCTCAGGCAAAGGGATGAAGGCAGAGATGGGAAAATTGG
-GAGGGAGGGGAGCATCCGTTTTGGGAGGGAAGTGTCAGTTTTGAGCACACACAGTCCTCT
-GCAGCTTGAGGAGGAGGAAGGCTGGGTCTGTGGAGGGTGGGGAGCGGGTGGCACCAGAAC
-AAAGCCCCGGGGGTAGCAGCCTGGGCCCTGCAGCTCCTTCGCAGCTGACAGTCCCTGAGC
-TAATTACCATTAATGAGCAGCTGGGCCCAGTTTCCCGGGATTTGCATTCACTGTGCTAGT
-CAGCGCCACTGTGGATGGAAGCCAGCGCCAGCCTTCTGGGGTGGGGGTGACTCAGGGAGC
-CGAGGTAAGATCGCTGGCTTCATGTGGGGCTGAAGAAGGTGTGGCTTTGCCTTTCCTGCA
-GGTTAGGAGATGGCCGAGGTACAATCGTGCCTGGAGGCAGGGCACTGGCATCATCCACCT
-GTCCTCAGCCAGGGCCGGGGTAAGGGTCTTGGGGAAGGAACAGGTCTTGTGGCCCTCAGA
-AGCCCTCAGACATTTGGTTGCAGGGGCCCTCAGATTGTGCAGCCAGCTGTCCACTGCGGA
-GTTGAGGGAATAGACCACAGAGGAGCAACGTGCTGCTCAAACTCATACCAAGACAGCATT
-GCTCGTTAAGCGTGCCtgtgtcagacgctgtccaaagcactttactgaatcttcactacc
-aaccccatgtggtggctgttattagcaatcccattttacagatgaggaaactgaggcaca
-gagcggtcacacagccagggaccagcagggctggcatttgagcccagtcctcctgactGA
-TCCCTGCTGGGCAATAGGGCTGAGGAGCTCTCAGACCTGGGTTTTCCCTTGTGATGGGGG
-CTAACAGTGCCTCTCTCCCCCTAATTCCACTCTCTGCAGGGATGCCGGTATGTTTGGTGC
-CCCTGGCAGGGTTGGGAGGTGAGACTTAAGTACAAATAAATAAACAGGGAGCAGATGGTT
-GTGGGGGGAGTGGTGGTGCTGGGAGGGATAGGGCCAGGGCCTCCCACTTCTCCTTGGGAA
-AACATTTCTGGGCTGGAGCAAATGGATTCCAGACTCAGGACCTGGGAGCCCCTTCCCCAG
-GCCTGCCCTCCTGCCTGCTGGCCTCAGACCTGGCCCAGCCCTTGGgagaaatggtgggct
-ggggtcccgagtcttgggttctgcccatccctcatttctctctcttcttcctgtgtggcc
-ttgagcaagtccctttacctttctgtgcctctatttcctcatctgtcaaatgagtggaag
-gagaatgaactttatcaagtttctgttcaagggccacctcccctgggaagcctttcttga
-ttgctccaggcAGCTTCTGTTAGAGCAACAGCCTCGAGTATCAAGGAGAACATAGGTATT
-TGTGTTTTTCATTTCACAACAatccattcaacagatactttctcagggtcacctatgtgc
-ctggcacgatgccaCACTCCAGGCTGACTCGTAGTTTTTCTCTGTAGCTCcagtgctggc
-ccagagtagccactaataaacatgtgtcatgtgcatgaatGATGAGTGGGTGACTGAAAG
-GGAGCATGAGGAGCTGcagtgtttcccaaacgtggtacttgtatcttgggggtgggagtg
-gggagtggataaaagatgatacgggtgaacagcaacaagttattaaataacaataaatca
-acagtgaaaaagttattcctttttcattacctcccagtccttcttacaggccaaggagaa
-ggtctccgatgatgccaggaacgtgtttctagcacctgtggatctctctttctctctctc
-tctcccccaactcccgcaaaacccaccccaagaaggctggtcttgggctcagagcttcta
-cagacaacactatctagaatttgagaatgttgtttggtttccattttattcattttggtc
-agttaccttttatttgtgacaagggattttgatttttcctttgtTTGGACATGGCCAGTG
-GGAGTTGGAAGTGTTTGGCACTTTCTGATGAAGTGATCAGGACCAgggtggggaagaggg
-ctcgactgaaaaggggcacgagagcacttgtggggtgatggaaatgttctgtgttttgct
-tgtggtcgtagttacatggctgtgtacatttttcaaaatgcattgcacgataacacttaa
-aataggtgcattttattgtatgtaaattatacctcaaAGTTGATTTAGAAACACATATTG
-AGggctgggaatggtggcttacgcctgcaatcctagcactttgggaggccaaggtgggtg
-gatcacctgatgtcgggagttcgagaacagcctggccaacttagcaaaaccctatcttta
-ctaaaaatacaaaaaaattagccgggcgtggtggtgcatgcctgtaaccctggctactca
-ggaggccgaggcatgagaattcttgaatctgggagacagaggttgcagtgagctgagatt
-gcactactgcaccccagagcgagactctgtctcaaaaccaccaccaccaccagcaccacc
-accagcaccaccaccaccaccaccaccagcacATGTTGAGGatattaagtagataataat
-acagatggcatgtaggtgtggccaaagtcatgaaggtTGCCCACCACACGGTAAACTTTG
-TAGTCagtgaataaatggatagataggagatagaatggaggaatgcatgaatgggtaaat
-gagcaagcgaatgaatACCTATCTCatccattctacacagccccagcacattgggaggtt
-gtcctatctcaacttgcatagctcctagaatgggggaactcactaccttatgacatagcc
-ctttccacatctgaaccactaggagtgtgtaaaagacattttctcatattaagtttatct
-ttctggagatcctgtgctctctggggccccacagacacatctgcttccctgtctggggac
-agcccaaacacttgCCCTCCCCAGGCTGCCCTTCTCTGGGCCCTTCTGCCCAGATGCTTG
-GCTGCTGTGCCCACCaggtcctgcttgcacagagcttatatcctagtgggcggcaggaca
-aagaacaagcacacaggcacacaaacacaatgattccatgctatgaaggaaatgcagagt
-gagactgttgggaagagcatggcggggtgtggagaggcaaggggagtctctctaggaagg
-taatatttgagctgggacctgaagaatgcaacaaagccagaagaacaagagaaagggcat
-tccagatagaggcaagagcaagtgcaagagccctgagatcacagagcaattggaaactag
-gaagcagccagcctggctggaCATGGACATTTTGGGTATTGATGGTGAAGAGCCTGGAAT
-TGTTTTCTAAATTTGATCTCCAAACACTTTTAAGCAAGAGGTGATATGATATGACATATT
-TTAGCAGACAATGAATATTTCCTGAATTAAAATTGAAGACCCTTCTAGTTCCAATAGTTC
-CATGCTTCCCAAAGTGATACTGAAATGACTTCAGGAGAGAACAggctgggcgtggtagct
-cacatctgtaatcccaacgctttgggagggtaaggcaggaggattgctcgaggccaggag
-ttcaagaccagcattggcaacatagtgagatccccatctctacagaaataaaaataaaaa
-taaaaaaattaaggccgggcacagtggctcaagcctgtaatcccagcactttggaaggcc
-aaggtgggtggatcatgaggtcaggagttcgagaccagtctggccaacatggtgaaaccc
-catctctactaaaaatacaaaaaatttagctgggcatgttggcgtgtgcctgtaatccca
-actacttaggaggctgaggcaggagaatcacttgaacctgaaaggtggaggttgcagtga
-accgagatcacaccactgcactccagcctgggcgacagaatgagactctgttaaaaaaaa
-aaaaaaaaaaaagctggacatgatggaacatacctgtggtcctagctactcagggggctg
-aggcaggaggatcacatgagcccaggaggtcaaggctgcatgagctgtgatcttactact
-ccacctcagcctaggtgacacagccagaccttgcctcaaaaaaaaTTTTTTTTTAAAAGA
-AAAGAGACAATCATGtgatggttgccagaatggcctccagagagggcctccctaggctga
-atcctggctctgcctcatccttgccgtatgactctgggccaaggaccttgcctctttgag
-cctcagtttttacatctgcaaagtgggggtcataattgtccctgtcttattggcttgttg
-tgaggattaaatgactttatattggagaacagggcccagcatgtcaaaagtactTTCTGT
-TTGTTAAATACAATGAAAAAGGGTGAGGACATGCAGAAGCAAGATTAATCCTTTTTCAAT
-CTCTTCCAGTCCTGATTCCTGCAAGGAGAGTCAGGGTTGGTGGGGATGTGTATCTCTAAC
-ACCAGCCCAATCTGGAGGAAGTTAGTAACAAGGTTATATTTATGTTGTTTATATTTACAG
-CTACCTTTATTTGTGCCACATGATACAAtttttttttttttttgagatggagtctcactg
-tctccaggctggagggcaatggcacaatcttggctcactgaaacctccacctcctgggtt
-caagcagttctcctgcctcagccacccgagcagctgggattatgggtgctcatcaccatg
-cccggcttattctgtagttttagaagagacggggtttcaccgtgttggccaggctggtct
-tgaactcctgacctcaggtgatccacccatctcagcctcccaaagtgctgggattacagg
-cgtgagccaccgcgtctggccCAAATTTTCCATCTACCCTGGCTATTTCAAGTTTCCTTA
-TTTTTTTTTTTTAAAGTAAAACAAAAGCAAATAGATTTAGAAATTCAAGGGCCATGGTCC
-CTGAGGTAATGGCAAGCCCTCCTGTCCCAAATGGCCCAAATTGTGCAGGTGGTCATTGAG
-CCATTGATGGGACTTTAGGAAGCATGGttttatttttatttttattttttagatggagtc
-tcgctctgttgcccaagctggagtgcaatggtgcaatcttggctcactgcaaccttcacc
-tcctgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcgccc
-gccaccactcccggctgatttttgtatttttagtagagatgggatttcaccatcttggcc
-aagctggtcttgaactcctgaccttgtgatccacctgtcttggcctcccaaagtggtggg
-attacaggcatgagccaccgcgccccgccCAGAAACCTGTTTCTAAGCTCAGCACAGGGA
-ATAGCTCCTTTTTCAAGTTATGTCCTGATCCGGATCACTTCTTTCTACCCGTGTGCAATC
-CACCAAGCATCACCTGGGGCTCTGGTGACAGCAGCATCCCCTTCACCTTCTTTCTCTTCC
-TGCTCCACTCGGCAGCCAGagccagaccatgtccttcctctgctcaaagcctcacaaggc
-tcccagctcacttggagaaaaagccgaagtcctcacccagctatgaggcccctcccaagc
-tgatgaccctcacccctcctcacccctccagcctcgtcacctgcccagccacagcccttc
-tcccacctccactgaccccaccacactggcctccttgctgcttcttgaacactcactctg
-tgcaggctccagctcaggacttttgcatatgctgttccctctgcctggaacacatccctc
-tgacacccacagggcatttttcctctcattgcccaggtcaatgccccctctcagagaggc
-ccatccaccttacctaaatatttcctagctcattcttcctccctcccctgcttttccctc
-agagcatatatcactaccagacatcacattttacctttgatacatatgttgtgtgtgtca
-tcgcctgtctcccagagtggacttcaagaggacagaagtttgcgtctgttttgtactctg
-atggctccagtgcctggaatggtacTGATTTGCAGAATGAATGTCCAGGGGTGTGTGTGA
-AGGGTGGAGGGCAGTCACTCCCAGCCCTGCCCAGCCTCACTGTGGCCCCTCAGTCCCCTC
-TCCGGATATAGCTTTTCTCTCTGCCTGCCCCACCCTCTGACCCTCAAGGGCAGGCCAGGG
-CAGCAAGCTTGTCCCTTAGGAGGGAGGTTTCCAGCTGCAGGGCAGACCTTCCTCCTATAC
-CTCCATCCCAGGTAAGCCCAACTGGAGCTGCCCTCTCGTGGAGGGTACTCCAAGGATGAA
-GGGCCTTAGGGGAAGAGCCACCCTGAATGTCTCTGGGCAGCCAGGAACCTGCTCACAGCC
-TCCGCGACCTCATCGGGAAAGAGGCAAGACTCATGAGAGTGAATGGcccacggggagtta
-ctatgcttgtccccttttacagatgagaaaactgaggctcagagaggtgaaTCTGTCTCT
-AGGGCAGCTGGAgcctctgtcccctcctctgtaaaatgaggagaataactcctccctcct
-aaggttaccttgaggattaaatgagctaaataaagcctttaaacacagagctgtgtctgg
-cacataggaggtgctcaataaatgttgggtactcttGTTgttctgacaggtgaactaact
-ttccaaggtctcacagttagtaagtaacacaaacaaattcaaacccagatctgtctgaat
-ctaaagTGATTCCCAGAGGgggggcagtggctcacaccagcactttgggaggtcgaggca
-ggaggatcacttgtgcccaggggttcgggactagcctgggcaacgtgacaagacattgtt
-tgtctccgcaaaaaacttacaaaattagccaggcatggtggtacgtgcctgtggtcccag
-ttacttgggaggctgaggctggaggatggtttgagcctgggagttggagactgcaatgag
-ctgtgatcacaccactgcactccatcctgggtcagagagctagacctggtttcgaaaaaa
-agtcaaataaataaagaaaGTGACTCCTGTGCacaaccacaaaataataacaataacagc
-gacgacaacagcaacaacaCCTCCGAGCAGTAACAGCATTTTCCACTGCAGACGGCGGCG
-CTGAGGGTACAGGGATAAGATCATCCGGTGACAGGGATCATCATCCCTGCCTGGCATAGA
-AACCCGGACATCGGACCCTGCCCTCCCGCTGCTTCCGCAGGGACAGGGGGCAGCCAGCAG
-AGCCTCCCTCTGGGGGTGCCCCCCAATCTGGTTGCCTGGGACGGGGGCCCAGCGGGGGTG
-GAGTTGCCTGGGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGAGGCCCAGCGG
-GGGTGGAGTTGCCTGGGGGGGGGAGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGGTGC
-CCAGCGGGGGTGGAGTTGCCTGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGTGGGGGGA
-GGCCCAGCGggggtggagttgcctggggggggcccagcgggggtggggttgcctgggggg
-ggaggcccagcgggggtggagttgcctgggggggggaggcccagcgggggtggagttgcc
-tgggggggggtgcccagcgggggtggagttgcctggggggggcccagcgggggtggagtt
-gcctgtggtggggggccagcgggggtgaagttgcctggggggggccagcgggggtggagt
-tgcctgggggggggccagcgggggtggagttgcctgtgggggggggccagcgggggtgga
-gttgcctggggggggccagcgggggtggagttgcctggggggggCCAGCGGGGGTGGAGC
-ACCCTGGACGGCCCCGCGGAGCCCCCTGCGGGAGGCGAGGGCGGCCCTCGGGCTCTGGAA
-GGGGCCGCGCGGCCTGGAAGACATTACACGGCTGTCGGGCGGGGGGCGGCGCTCGCAGTT
-CCGGAGGGGGGTCCCGGCGGCGGACGCGCGGGGTGAGGGGACCGCCCGGCCACAGAGCGC
-GCTTTGTTCTGCGCCGCCCCCGGGAGCTGGAACCAATGGATTGGCGGCAGCTGAGGTCAT
-CTGTCAGGCGGAGCCGGGGGGTCAGGCCCGGGGAAGGGGCCGCGAGGGAGGGCGGCGCGC
-GTGGGCCGGCGGGGTGCGGGTGGacgagccgggggccctgcggcaggtggctacgctgct
-tcggtcctcagtttacccgtctgtccaacaggaaagatcatttctgccctgtccacctct
-gggggctaatgtgagagttaaaGTAGGGGAGCTACAGTGATGATGATGATGACGACGGAG
-GATGACAGCCTTCCCCTAATCGCAGTCTCTACTTCGGGTACCATAGAAGTGCTAAGTCAG
-GGGCTGGACGCAAATGTGCTTTGTAGCCTATAGTGCGTGCCTGTGTGGGAAGCGGGATGG
-ATGTTTCACCCCACCCTCTTTCAGCCCAGGGAAGTCAGTGGCTCCCCCTGATTGCCTGCC
-TTGACCCTGGGTGCCAGGCTTGGTCTGCCTTCTCCAGGGGTGATAGGTGCAGCTGCCCAA
-GCCTGAGCCCAGGAACCCATTGCAGCCTGTCCTTGGAGCCTTCTGGTCCAGGGTAGGGCG
-GGACTGGAGTGACCCAGATAGGTGGGGTTTTTTTTTCTGACTGGGGGTAGGTCAGGGTCT
-CAAGGCTCTCCTTTGCCTCCTACAAAAGGACAGCCCTttctttcatcaattcactcattc
-attcattcaCACTGCCACCTGCCTGTGCCTCACAGTTCCCATCCATGAGATAATGAGGCT
-TCTAAACATTTGATACAGGGTCCCCCAGGGAAGGAGATCATCAAATACAGGGAGGCCCAG
-AAACGGCCCAAAATGCGTGTGTGTGTATTTTTGGGGAAAGGACTCATGGCTTTCTTGTGT
-TCTCAACCACGTTCATGATCCcaaacaaggctaagaagtactggttggagtgcagggaag
-gcaaataggctcccaaactccaccggagagggtggcacttggaacaaccactttggagag
-caatttgccagggtcttagaagatggaaatgggcgtatgcatcagccaggcagctccact
-cctgggtatacagttgaaagaGCAGGGTGATGGCGGGGGCCGTTCGCAGCCGCAAATAAC
-TGTAAGCCCCCATGCTTCCATGAACATGATCACGACTAACAAACGGCTACATTCACAGCC
-TGGAACACCACGCAGCGGTGAAAAAGAATGAGATAGACTCAGCTGGAatttattcatttg
-acagatattgattaacactactatcttttaggcactgttcttagcactgaacctacagtg
-ataaacaagacagattgagtcctgccttaagaacgtacatttggccaggcacggtggctc
-acacctgtaatcccagcactttgggaggccaatatgggaggactgcttgaggccgggagt
-tgaaaatcagcctgataaacattgtgagacctcatctctacaaaagaaaaataaaaaatt
-agctgggtgtggtgacacacacctgtaatcccagctactcaggaggctaagtgggaggat
-tgcttgaacccagaagttggaggctgcagtgagccacgatggtgccactgcatactccag
-cctgggtggtagagcaagatcctgtcttaaaaaaaaaaacaaaaaaagcagacacagaag
-aaaatttgggagagtgtgacaaatgccatgaagaaaataaaactggataaagggacggaa
-tgatgggggagggggctgttttagacgctatggttgggaaggcccctgaagaagtgacat
-ttgggcacagaccagaatgagggagactgggagacaggcacgCACGAATGGGATGGACGG
-CTGGGGCACAGTGCCAAGGGAGAAAAGCAATCCACAAAACAGCGCAAAAAAAGAAAACAT
-TTTTTACTTAAACGCACATTCATTACTATTAAATTAGATAAGAGTCTGGGAGGCTCTATG
-CCAAATTCATAAAGGTAACTGTCCCAAGAGGGCAAAGGAATAATCAGGACTAGGTTTTGT
-GGTGGGCTTCCGCTTGCCTCTAATACtttaaatttctaatatttaattatttaacatttt
-aatattttaatGTTTAAACGGTAAATATggctgaatgcagtggctcatgcctgtaatatc
-atactttgggaggccaaggcgggaggatcacttgaggccaggagttggagaccaaccacc
-ccaggcaacagagcaagacctggtctctataaaacgttaaaaacaaaattagctgggtgt
-ggtggtgcctgtagtcctagctactcgggaggctgaggcaggaggatggcttgagcccag
-gagtttgaggttgcagtgagctataatcagaacattgcgtgccagctttggtaacagagc
-aaaaccccatcacaaacaaacgaacaaaCACATTTTAAAAAGTAAATATACTTATATAAA
-ACTTGTGAAATggctgggcatggtggctcacacctgtaatcccagtgcctcgggaggccg
-aggcggacagatcacctgaggccaagagttcaaggtcagcctggccaacatggtgaaacc
-ccatttctactaaaacaacaacaaCAAAAAGCCTTGTGAAATGAAAACAAAAAAAAAAAA
-AAAAAGGAAATTTAAATCTACCACGGTCAAGTGGGTGGGTTCCAGGGCGGTGAAGGCACA
-TACTGCCTTTCACTGGAGCCAAGTTCCTGGGGGCAGAGGTTTTTTTGGGGAGGGACACTG
-TAGGTCATGGtagcccagccagtaggagcccagaagcttcttggaggaggtaccaccttt
-gctgagcctgaGATTCTCTGGCCCAGCACCCCCAGTATAGACAGGAATGGGTAGACATGT
-GCGCAAGGTTACAGAACAAGAGCTGATAAATAGAACCTGAACTCCAGACTCATCCCGGCT
-GAACCCGGGTTAACTATCCCGCCTCTTTCAGCCCTGCGCGTGCATCCAGCCCCTTCCCAC
-AGCTGTAGCTCTTGCAGGCCAGAGGGACGGCCCTGCCGCGGGGGCCGGAGAGCAGCGCCA
-CCTGCTGCTGTAAGAGGGAAACGCAACTTCCGGCTACCAGCAGGTTACACCCTTTAAAAC
-CCAGCTCCTCTTCCTTAAATGATCAAGCAGTACCCCTCTACTCCGAATCTGTTCTGCACC
-TCCTTCGCAGTGCCTGGCAGGGCCCTTAGCGCTGTCTGGTTGGGTCTTCTCTGCAAGAAG
-GAAAAGTTGTTTCAGGAGGGGGCGACCATCTTCACTCTCATTCCAGCCCAGCGGGCACAG
-GAGGAGTTTACTCACAGAAGACAGGGGcacctcaccttcgctacaaaccttaggggtaca
-caatccatttgacagcctggaagaagtccccagggaagggacagaaccgcccaaggtcac
-acagttaatgagtagacaagctgggGGGAATGAGTAGACTCATTCCACTGGGGATGGAAG
-TGGGGAAGTCACCGTATTTGAAAATAACTGACGCAGTTATTagcagctcttagcatgtgg
-tccctgaacagcagcatcagcaacatctgggaacttgttagaaaagcaaattatcaggcc
-ctgccccaactcgcctcaatcagaaactctggggggccgggggcagtggccatgtctgta
-atcccagcactttgggaagctgaggcgggagaatcgcttgtgcccaggagtttaggacca
-gcccagagaacacagcaaaaccctgtctctacaaaaaaatgagaagggcgcacctgtagt
-cccagctactcaggaggttgacgtgggaggatcacttaagccccgggaggtcaaggctgc
-agtgagtcatgatcgtgccactgcactccagcctgggtgacagggcatgaccctgtctca
-aaaaaaaaagaaagtgggggtggggcccagcaatctggtatttagcaaacAAGCTTGAGA
-CCCTGAACCATTGGTCTAAAGGAATTGCACACCCCCCCTTTTTTTTTTTAAAttaaataa
-acttttattttggaatgatactagatttacagagaagttgcagagatagtacaaagagtt
-cctgtatacccttcacccagcctaccccaaggtcaacatcttacatcaccatggtacatc
-tgtcaaaaccaagagactgaaattggtatattaactaaaattcagacttttttcagattt
-ccaattttcccactaatgtcctgtttttgttccaagacccaatccaggatgccacattgc
-actGAAGACACTCTCCCTTTTCAATTCTATTACTGGTCACCTCAGTCAACTTTCCCGGGG
-AAAGAGAATGCATGGGAAAAGCTCTTGTCCTTATTATTGAACTGGAGAAACTGAGGCTTA
-AAAGTGCCGAGTGACCAAGTTCCCTTAGAGGGCAGTGAGAACAAGGCCTGCCTTACTCTG
-TTCCCTTTCCCCAGGGACTCTTGGTTTTCAGAAGCCCCTCTGGAATGTCCTACCTGGCCT
-AACCCCATACCAGCAGTGCAGACAAGGAGGCACTCCTACTACAGTGGGTCCAGCCCATGG
-AGAGACTCACTTCCTGCCCCAACACCTCTTCCCCTAGACCCTGAGGGCCAGGACAATGTC
-TTAGTGCCTTCCAACTTGGCAGAGTGAGGCCCCATGAGACAGAGAGAAAGGGGGAAGAGG
-GAAATACCTTTATCCAAATAAATACCCATCCAAAATTATTTGTGATAGGTGAAAAATGGC
-CACAAGCTctttgtggttcccctcatcaagacatgtagtctgtttctcatcccttgaatc
-tgggtaaagccttgtgatttgctctgaccaaaagaacttagcagaagtgacactgtccta
-gtcccagttccaggccaagaactcaagaagtctttcagcttctactctcactctctttgg
-aatcctgaagccatcatgtgaataagcctgagctagcctgctggagaggccacatggagg
-agaaccaagcaattccagccaacagcctgtcacctgccaggcaagtgagtaaggctatcc
-tagaccatccaggcccagctgaggtaacagctgaccttagctccatgagggatcccaggt
-gtgagcagcagaactgccctgttgagcccagcccaaattgccaacccataggattgtggg
-aaaatacagggtttgtttctagctgccaagtttggggatggtttgttacacagcaaaagc
-taactggtacaCAattctgcatttctctcttggtaatgggatcccagttttattgcagga
-ggcagtgtgccagtctcagtagatggaacacgattggtctattcagccatgacaattctg
-ttccctgctgtcttagctttgtttgcagctagaggtgcaatggtagctggctcgggccaa
-gggcatctaagtgaagatatgcagagggagagagcaggaaacagacttctgacgaggttt
-tactttctgatagaaggtgacgggtccagctagtttggcccttcctcttcctccacccct
-ccttccttgaacgcagacatgattcttggggatacagcagccatcttgggaccatgaagt
-aacgagcactgagattaaggcaaaaggatccaagacgtgacccctaccttcgtggagttg
-ttgaaccaataccattagccacccatctccagaatccatgctatgtggaaaaacaatctt
-ctgtttgtttaaaccactgcaatcaaggttttcctttccttgcagctgaatgtagtccAT
-ATAAGAGGTTACATAGACAAAAATGCAGAGGGATCCTTGTCCTTGGGAATTTGGAGCCGG
-CAGCACGTGgctcttcaagcccatctctgttctccttctcggtaatgcttcaagggtaag
-gccatgatcctattgtcacagaggtgggaactggggctcccacactgtacagtgagtcca
-aggccttgtagctggtgagaggggtgcccagagtcagacccTCTCGCCAGGTGCAAAGAG
-AATGCACCCCTGCTATCCCTTCTGCATGGCCCAGCCTGCTGGAGGCCAGGTGTGTCTTCT
-GGGCTCTTGAAGGTGGCAGCAGGTGCCAAGGAGGCTGCTACTGCAAGTCTGGTGTGGATG
-CTCCCAGGTACACCCTTAGGTCTGAGAGAGTGGACTGGACAAGCTTGGCGGGGATGGTCT
-CTCGCTGCAGTTGCTGGTAGGCCGCGTAGCGGTGGCAGCCCCCAAAGGAGTAGAAGTAGT
-CACCTCCCTGGGCCCCTTTGATCCAGAGGACATCGATGGGGGGCACGCTGTCTGGGTCCT
-CCTGGGGAGAAGAGGCACAGAGTCAATGGACATGGTACAAGGCTTGAGAGTTTGTAAAGC
-AGACTTTGTCCACTTGTGCTGAGCTCCTTATAAGGTGATCACACTGGACTACTGTGAGAG
-ACAACTGTTAATTATCAGGAATTTTGTGAGCTGTTCgacatcaccttgtagcttgaaaat
-cagccatgggagagtatttacaccagagaaatggacagatgctacaaatcagggatttct
-cccacacatgtatcagcacaccacATGCACactatccagctggccctgttgtagaccctg
-ggaatacggtacagctggaatgtgactgaatcaggccctggcttcaaggggctccagtct
-agtggggcagatggaacaagaagtaaatattagagtgacaaatgctataatgacaataac
-acaggtgacaggacagagatgggGTCCACGAGGCCTCTCTGAGGTAAGAATGAAGCAGAG
-TACTTGGAAAGATAGAGAAGTGGggccgggcacggtggctcatgcctgtaatcccagaac
-tttgggaggccgaggcgggtggatcacctgaggtcaggagtttgagaccagcctggccaa
-aatggcacaaccctgtctctactaaaaatacaaaaattagctgggcatggtggtgtatgc
-ctgtaatcacagttactcaggaggctgaggcaggagaatcacttgaacccaggaggcgga
-ggttgcagtgagctgagatcgcaccattgcactccagcctcggcgatggaacgagaatcc
-atctcaaaaaaaaaaaaaaaagagagaaGTGGAATAGTTTCGATTAAgagctcaactgcc
-tgggttcaaatctagctctgctgcttaacagctatgtgatcttgggcaattcatcttttt
-gtgcctcagttgccccatctatcaaattggatggagataacagatccatctcatagaatt
-tttgggttaaatgggttaatatatataaagcacttcaaaccatgcttggcacacggaaag
-tgctcagtaatgtatgctgtgtatGACCTgagggaagaacgttccatgcaaagggaacag
-caaacgcaaaggacttgaaaccagagcacgttcactgtgtaggaggcacagcaaggagtt
-cactagagtggactccagggctccaggaatggtcagaaaggccagcaggagccagatggt
-gcaggtctgcttctgagagcagtgggtgggccctggagtgttggcaacaggggagggtga
-catgatctgatgcatgttctagaaagttgtcacaggagaacagacttggcagggtggaca
-gggcacagggctggaaggcagaggggaggcctctgcaggtattcagcagaagatgctggt
-ctggatgatggtgtggtggggacagggagaggtagacaggtttgggacacatttacgggg
-caggcccaaggggtctggcagaaggggtgaatccaagggcaagagaaaagggagaatcta
-agttgacttcctgttaggggcccacacagccaggtggagagtaggtcatcctctaaacag
-ggaaagtctggggcaggacgggtgcagggtagagCACTCTGGGGAGACCCCATTAAGTGT
-GAGCGGCGTGGAAGGCCTCCTGCTGCTGGTCCACGGGTTCTCTCTCATGATTCCACAAAT
-GATTATTCAgcagtaaggtgcagcagtcacaagcctgagctctggaacctggcacacctg
-actttggatctcagctcctctccacagcagctggggcacacagccctctgaacaccattc
-ctcacctgtaaactgggaataaaacatcctagagggctgctgatgaagagtcagtgagct
-gatgcCTACCGGGCATTAGTGGAGCACTAAGGAGGGCAGCCGTGCCAGGCAGGCCTTGTG
-CCGGGTACTGGAGGCACGATGGTGgatggccagaatgatggctcccaaagatgtccacgc
-ccgaatgcttctgaatgtgttaccttacatgggagaagggacttggcagacagaattaag
-gtaaggatcctgagatgcggaaattatccaaggttatctagatgggtcgaatgccattat
-cagggtccttaaaactggaagaggaagtagaggaagaggtcagagtgatgcgatgtgaga
-aggccttggcctgatgttgctggctttgaagacagaggaagaggccataagccaagcagt
-gtgggtggcgtctggaagctgggaaaggcgaggaaatggattctcccctagagcctacag
-aaagtagtgcagccctgcttggtgttagcccagtaagacccattttggacttctgaccat
-aaataaacctgtgttgttttaagccatcaactttgtggtaacttacagtggccccagaaa
-actaatacaGGTGTATGTAAGCAAAGGCAGAGCTGGTTCTGGCCCTCAGAGCCTACGGTT
-CTAGCACGGAAGGCAGGTGTCTAGACAGGACGTTAAAAGCCAGTGGGctgtaatcccagc
-actttgggaggccgaggtgggcagatcgcttgaggtctggagtttcagaccagcctggcc
-aacagggtgaaaccccatctctactaaaaatacaaaaattagccaggcgtggtggtgggc
-gcctgtaatcccagctacttgggaggctgaggcaggagaatggcttgaacccgggaggcg
-gaggttgcagtgagccaagatcgtgccactgcactccagccagggtgacagacccagaca
-acgtcttaaaaaaaaaaaaaaaaaGCCAGTGAGATCAGAGCTATGCAGGTGGGCACACAG
-GTGGCTGCAGGCCCACAGAAGCTCCTAACCCGGTAGGGATGGTCAGGGAAGATCCTGACA
-CTGAGACAGGAAGACCGAGAAAGAGTGAGAAACGACAAGGCAGAGATAGAAGAGGTTCTC
-AACGGGAGAAAAAGCCCAGTGGTGGGACAGGGCATGCATGGCAGATCCCTTCCCATCTCA
-gccaggcgccgtgctactattgtggcaacagataagatgggacgaggtcctcgcccttgt
-ggagtgcacgtgaggtcaggaagacagaaaataaaatgcaacacaaatagatgtataata
-taatttctggtggacataagtggtatcctgaaaaacatctcgggctaaggggagagctag
-agaggccagtgactctgaccaagggtgatcaaggaggcagagagctgaaccaggcagggg
-agcaggccctgtggttgtctggggaagtggctccaggcagtgaggacactagtgtaaaTA
-CTAGGACTGAAAGTTATCGGGGGTGGCTGTAGAGGTGCTGGGTGGGGCTTAGGGATCTCA
-TGTGCTCACCTTCCAAGGGTCGGGGGAAGGGGACACAACGTTATGTAGGCCTAACCTGAC
-ACCTGTTCTTGCGGGGCCCCCAAGTTCCTGCCAGAATCACTCCGGTATTCTTAACACCCT
-TCCTCAGTGGTGGAGCTGACCCTTGACCTCTCCCACTTCCCATTCAGACAAGGGCCTCCC
-AGCAGATATGACACACCTAGTCCCACTGTCACTGACTGTCACAGCCATGAGAGCCCACGG
-CTTATCTCCGGgtagtgcggtggccatgtgctgggcagtggggcccaggctgcctgggtg
-tgaattccagccgtgtcactttttaagcgcctgatcttagtcaagccgctgaaatcttcc
-ctgcctcagttctcgtctgcaaaagagccactatctacctcctagggttggcataggaaa
-ctgagggacttcctgcagttcctggaccactgcaagcactAGCGTTATAAGCGTTATCAT
-CACTactttaattatctcgcccaattccctccttgctcaagtgaggaaacagaggcccag
-agaggcccagctacttgctcaaggtcacacagcagaggctgagctccggctgggcccgga
-accagtccgtctcgcgtccaTCGCAGCGACCTCCCTCCTCCGGCAACCTCCCTCCTCCGA
-AGCCCTCCCTCCGGTTGGCTGGACTCCCCGAGGCCTCACCCGGATCGTGTCCACGAGGCT
-CTGCACCTTGGCGGGGTCCAACACGGACGGCAGCGGCCGGATGAGCACGCTCAGCGGCAC
-GTTGTGCACCGCGGCGATGCGGCCCGAGTGGATGCTgccgccctgcgcgccgccgctcgg
-cccgggcccctcgggcgccccccgacccgcgccggcccTGCCCAGCGTTCCTCCTGCACG
-CAGCCCCATCGTCGCCGCCGCCGCGGGACTCGCCGCCTCCCCCCGGCCTTAACTCCGGCC
-GGGCCATACCATTccgcgcggccgggggggggggcccgTGCCAGGGCAGCGCGCGTTTCT
-CCCCCGACCCCGCCGCGGTCCGGCCTCGACCCCGCGGTCCCCAGCCCGACTCCGGCTCCG
-CTCGCCAGGTGCCGCCAGACTCGCGCGGGGCTCAGGCTCTCCACCGGGGGGCGCCTCTCG
-CCTCCCCTGCGCCGCGCGGCGTCCGGGGAGTGGAAACGCCCGGGCGGGCTGACTCAGGGT
-GAGTTTGCAGGTCGCGGGGCGGGAGGGGCGCGGGTGACGCACCGGCCGGGCCGACTTAgg
-ccgcgggggcgggggcgggggAGAGCGCGGCGGACCTGCCCAGCCAGGGTGAGTCGGCAA
-AGCCCGCGGTGCGCTGCTGCCCCGCTGCTGGGGTTCCTAGCCAGCGAGGTTATGATCCCC
-ACCAGCGGTTCCACTTCCAGTCTGGCGCCGGCtgtgtctggagtcgttccgaacattttg
-cacgtgtattaacgtatctgaacctcaaaacaaccctgcaaggaaggtatgactgttatt
-cccattttacagaagaggagactgagacacaggtttaagtgatgtacccaagatcacgga
-actagtaagtggccgaatccgcgttcaaatccagacggtctggctccagagtccgccttc
-tACCCCACCGTTGGCTGCCTTGGTTCAGCAACAGTGACTGTCACACGGAGCCCTCAGGAG
-TCGCGCTGACAATGGGTGGGCCCTGCCTTCAAGTTCCACACTGTCTGTTTGTGTCATTAC
-AACACTACTGGAAGTAGGTGCAGTTATAGACCCGCTGTTCAAGGTCAGCTGAAATGAAAG
-TCAGGTCACACGAGTCCAAACTGTGGGGCCACTTAACCACCAACTCCAAGCAGGAAGGTG
-GACGATCCCAGACTCGGTCGAAGACAAGCATGTCTGGTTTGCTTGTCTTCCTTCTCAACC
-TGAATGGCACGAACATGGAGAAATGCATACTTACCCTGCCAGCTGGAGAAAACTGGAGAC
-GAAGGAGGGAGCCAGGAGTTTCTACTTTGccttccaccagttgctgacactttctgaacc
-ccgtctgtaaaatgaagtcatgctgcccatcactcaaagttgtgtgaattgagagagtgc
-tcatagtgctctgtgaattgcataacaTCCATTTTGCTGTTGAAGATCATTTATTTTGGG
-TTCTTAGTCTCTCACAAAACCTTAGAACACTGACACCAAGACTCCAGCCTTTCCCTTTCG
-AAACATAATTCCCGTGCGCACCTAAATGATACTTTATTTCAAGAAGTAGAACTGACACCC
-ACACCTCAGCCCCAGAATTATTCAGAATTAGAGAATTTCATCAAGAGGGAAGTTATCCCT
-TCTAAAACATCTTCCTCATTACAGGAAGTAAGAATGGCAGGATAACAGTTTCTAGAGTGG
-AAAAGTGGAGCTCTGGCCTGATTCTATCATCATGGTGTACCCAGGGAGGCCTCATTTCCT
-GGTATCAAATTCTCTGTGTTAAGATATCTATGGcccaattcaaaatggcttaagcaataa
-gaaggtttgttttctcacataataaaatgtttggaggtaggtatgtccaaggttggtaaa
-gaggcagttgaacaatgtgaccaaagactccagttctggctgggcccggtggctcacacc
-tgtaatcccagcactttggaaggctgaggcaggcgaatcacttgaggccaggagttcgag
-accagcctagccaacatagtgaaaccctgtctctaccaaaagtacaaaaattaggcaggc
-atggtggcgcgcgcctgtagtcccagttactccagaggctgagacaggagaattgcttga
-aaccgagaggcagaggttgcagtgagctgagatcatgccgttgcactacagcctgggtga
-gagagtgagactctctcagaaaaaaaagaccctggttctgtctatccttttgtgccatca
-tccttggtgttctgttatcctgcggtgtgcccctcatggtcccaagatggctactgtagc
-tcaaaacatcacatcattacatgcgaatgtccacaagtggaagttaggacatcccttcga
-gcctctttttaagagtgaagaaaccttcccTGGCTGGATGCAGTGGctcacaccttctga
-ccttccactcctcaagccccggagtcaactctagtcacactggcctccttgctgtgcctc
-ttccacagcgaatgtgtcctggcctcagaccctttacatttgctgttccctgtgcatgga
-acgctcttccctcaggtCATACatagcatacattactgagtgctctccatgtgcccagca
-tggtttgatgcgctttacatatattaactcatggaacctaacagctttatgagacgagtc
-tgttatctccatccccatttgatagatggggCATCCCTGTGGGAGCTCTGCCCATTCCAG
-AGGTGCCAGGCCATTCACTAATGGGGGCAGGAGCCGGTGAGTAAATGCCAGTCTTGTGCT
-GTCACAGGTGGACGATTCAGAGAGGTGTTCTAGACCATTCAGATCTTTCTGGAACCTTCT
-CAGAGACCAGAAGTACTCAGCCCTATTGCTACAACTGACTTCACTAACACACCctctgtc
-ccattcctcccaccccttacttctgcttccagggatcacctcccacataaacgacttaca
-ctcaagtctcagacttgctatcagggaaccaaaactaaaacaAAAGGGAAACTTGATACT
-GGGTCATCCCCTATAGTTCTGTACCTtgcctgggttaaaattgcactattttattagatg
-tgtgaccttgggccagtcacctgtctgtgcctgtttcctaatctgtaaaacggacataat
-gtcacctaattcacaggggtgttggaagagtgaagagagatggtgttaggtgaggtcctt
-aaaacagtgcacaacgcattataagtgctcaataaatgtttgctgttTGATTGCATTTTA
-AATTGTAACAGAGCTTGAACGTCTCTCCGTGTCTTCACTTTCAGACTAGGCTTGAtgtat
-tagtcaagacttttgtttgcaagtgacagaaagccaaagtgaattagcttaatgaaaatg
-gggatgcttggctattcccgtgactgaGGTGAAGCGGAGCCTCAGGGGAAAGTAAGTTGA
-GAGATTTCTTTTCTCTGCCCTCACTCAGCAGAGGGATTATCTCTACATGTCAGGAACATG
-ACTGTCAACAGCgatgatatttggctttaaataagggaaacctgacaacagagacttcat
-acaacttaaagtgtttcctctttaaaaaaaaaaacagtcgaggtaggaagtccatggctg
-ggatggctgctccatggtcactagtggcataggccctttctatcttgccgctccatcatt
-ttccagcagagttttcattctcagggtcacctcctattcaggattgctgctgaagtgcca
-gccgtctcatccaaattccaccctggaaagaggtggagaaatggaaaggcaaaggatatg
-acccctccccttttgaggatgctatctcagaagttttgtataacacttccccttgcatgt
-cattgactagaaattggtcacacggccacccctggctgcaagggcagctggatatgttgt
-cttcatccgtagcggtaatgtgctgagctaaaactggagttctcttactaaggaagaata
-gagattgataagtagctagcaatcggggccacaGCTCTCAAGTTACAGGCCTTATGGCAC
-AGAGACAGGGAGAGAGAGAAAATTTCCAAGTTCTAGTCAGATGCCTACATATGGACAAGC
-CAGCTATGGCATTGGGGGACACAGACTTTCTTAAAAGCATAAGCCACCATTATTTATTAT
-AATGACTTAAAGGTAAGGAGttcatttaaagataattactggtcacctgctattggctag
-gctagacccaggggatttagtgatcagcaaaaagacactaccaatctctgcattatgagg
-cttacagtgtagtggaggattcagataatgaccaaataatcacactggttaatggaaagt
-atacattggtagtgggtgctgcaaaagaaTGGCATGTGGTTCTGAGGAAGtgttttagtc
-ctttttggctgccatagcaataccatagactgggtggtttataaacaacagaactttgtc
-tcttacagttttaggggctgagaaatccaagatcaaggtgACtttgtatctccccaacat
-tcatatgttgaaatcccaacctccaggtgatggtgttgggaggtgggcctttgggaagtg
-attatgtcacggggttcatgggggtagagccctcatgaatgagattagtgtcctttttct
-ttcttttgagacagggtctcactttgtcacccaggctggagtgcagtagaactgtaaaga
-aaacttctaatttttaaaatcaggaacctgataataactaaggaatcctgaacagagtgt
-tggtagaaatacagatgaaaaaggccatttggatgaggaaatgaggaagatattattgga
-caatggaaaaaaggccatgttgttataaaatggcaaagaacttggctgaattatgtccac
-gttctagtgttttataggaggtagaacttgtgagcaatgaaacggaatatttagctaaag
-ctatttctaagcaaagtgttgaagctgtggcttggctcctcctgactgcttatagtaaaa
-tagaagcagaaagaaatgagttaaagatgtgacttttaagcgaataggaagcaaaacgta
-aagatttgaaaaattttcagcctatccatattgcaaagaatgagaaagaatgtttgggag
-aaaacaccaTAGTCTCCATAAGGAGACTGTAATGGTGATGAACGTAATCAGCCatcccag
-caggaaaactgccgtcttgaattgaaggggaaggagatgggaagggatgaggaaggaAAG
-CTGTCTGACTTCTTGGATTTTTCAGGACAAGACCAGAGTGCAAactcttcaagacaaggg
-aagaatgaccctgaaggcaattcagagatcatcaaggctatctcCTTGCTTTCAAAAGTC
-GGGAGCATTGCCTTGCATTCAGCAGGTTAGAGGGCCTCTGTCCAAAGCCATGGAGGAAGA
-GCTGCCCAGAGCTGTTGGTGTGGGGCTACCCAGAGCCCTGGGAACATGACTTCTGCGGGA
-TAGAGCTGGAGGGACAGGACCACCACCCCAGAGGGTACAGAGGGTGGGACCACCACCATT
-GTGGATCTGGAAGGCTGcctcagtgggcctggaagcagagcatttaatgaactaaaaatg
-atttttcttgagccttaagatctcatggagtttgccttgtagtttggatgtaatttggat
-ctgctattcctttcttctttcctatttctcccttttggaatggtctatcctatgcctgtc
-tcaccattgtattttggaagcagataacttgcttgatttcacaggctcaccgctggagaa
-caatttgccccaggatgcatcacaccttgagtctcagccatatctgacttagatgacact
-tagataataaaactttggattttagacttcagagttaatgctggaatgagttaaggcttt
-tggggctgttggaatgtaaggaatgaatgtattttgcatgtgagaaggatgtgaatttgg
-cggggGATGGGGACGGAGGCAGAAtgctatagactgaatgtttgtgttcctccaaaattc
-atgttaaaatcctaacccccagtatgatggtattaggaggtgggcttttgggaggCACGT
-TAAGGCCAGTTCATTTCATGGTCACAAGATGACATGCTTTTCTGTTCACACTGGAGGGGA
-AGAGGAACTGGACTTCCTTTCCTCTTAAGAAAAAGGAagcagcaaagttttccataccct
-tccagcaaccctctccttaagtctcattggccagaattgggtcatgtgcccatttctgaa
-cGATGGGAGATGTTAGTATTAGACCAGTAAAGACTACCTCTTAAGCTGATGTTCAGTCCC
-CAGATTGCGTGGTTGCTAATCCAGGAGAGAGGGGTGGGGTGGAATGGTTATTGGACCCAC
-ATAACTGGGCTGGATATGGCTGATGGAGACCCAGCATTCTTTCCCACCTCCCTCTAGGGT
-GCCTTCTAGATTGCCTAGTTGGAGAGTTAAAAACTCTATTTCTCAGATCTCTTTGCAGCA
-AAGATACTAACAGGGAATTAAGTTCTACCAGTTAGATGTACTTTCATGAGACATGGATGG
-CAGAGGTGGGCCGGGGCCATCTTCCATCTTTTGACTCTTGCTACTGTCAAGATTGTCTTG
-GAGGTGTTAAGATTTTCTGTAGCAGTGTTCCAGCATTGTGCCACCAGCACAGTGGGAGAC
-AGGAGATAGTTATAGAGGCAGTGGCAAGGGCCTGCTGATCCCTGGCTTGCACCTATGATG
-CGGTGTTCTGTATCTCAATAGTTCCAGGGCACCTTATTGACCACCACCAACCCCCACTCC
-GCACCCTCTCCCACCACTGACTGTGGAAGAGGCAGGTGCTGTCTCAGTGGCAGCAGTTCT
-GCAGTGGGGTTCTGGGGTCCAGCAGATGGCTCACTTCAGCCCTTACACAAATTTTGTCAG
-CAGCCAATTATTGAAGTATTAAATCCTTTCTCCTTCAAAGGAATTTAATACTTGTTTATA
-AAATCCTGTCTAGAGTGGTTTCTGTTCCTGGCACCTAAAACAAACATAATGGATCCAACA
-GCCAGTCACGGGCAGTGTATGTGGGTGGTTAAGGGATGCAGCAGATGCCTGGGTTTCTCA
-AAACCCCACTGGcgaggcgggcagatcacttgaggcaaggagttcgagaccagcctggcc
-aacatggcaaaaacctgtctctactaaaaatacaaaaattggctggacgcgggggctcac
-gcctgtaatcccagaacttggagaggccgaggcgcgcggatcacaaggtcaagagatcga
-gacaatcctggccaacatggtgaaaccctgtctctaccaaaaatagaaaaattagctggg
-catggtggcacatgcctgtagtcccagctacttgggaggctgaggcaggagaattgcctg
-aacccaggaggcggaggttgcagtgagccaagctcacaccactgcagcctggcaaggcag
-cgagactccatctcaaaaaaaaaaaaaaaaaaccaaaaacaaattagccgggcgtggtgg
-cacatgcctgtaattccagctacttgggaggctgaggcaggagaactgcttgaacccaga
-aggcagaagttgcagtgagctgagattgcgtcactgcactccagcctgggtgacacagca
-agactctgtctcaaaaaaaaaaacaacaagaaaCCACTGGAGATTTTGCAGAGTTGTGGG
-GAGGTTCCCACAACTGCTGCTGTCAAAAACAGCTAGCACATTGCTCAGGATGCAGCTGCT
-TGTCCAGAGGGGTGTGAAGGGAAGGCGGACAGGCACCAGGGAGGCAGTCTACAAACTGAG
-TGCACTGCTTACACAGGAGGAAACTGACAAAGAGGCCCCAGAGGAGGCAGATTCTAGCCT
-GCAGCTTCCCCATCCCTCAAAGCATGCAGGTTATGCTTCTTGGTAAGTCTGAGTTGAGGG
-TAGGTGGCAGGGGTTGGTGGTCCCCAGTGAAGTTTTTAGTAAGGTGAGACAGATTTGTAT
-CTTGAAGGATCACTAAGGCAGCTATCGAGGATGATGGATTGGTTGCcttgaacacttttg
-gtgacaggcagctcagaagctctaggggcaagtcactgtttttggacaactttccagctg
-agccaaagtcaacctttttgcctgcttccactcactgaATATGTGACCATATATGACTAG
-GCAGAGCAGTAGGGGGTGAACTGGGGAAGATTATAGGGGTTGTAAACTGGCTGTCAACAG
-ACACATGTGGACCACAGTTTTAACTGTTTGGTGGGTGTAGTTAATTTGAATCCTATTTCT
-CTAAGGTGAGACACTCTTTCCAATTAGTCACAGGCTTCACCTTCCCTAATGTCTTAAGGC
-AACTGGCTTCACTCACATGTTATTAATCTGGTTTTTAAACCCTTATTTGAGGAGTATTAA
-GGATTGAGGATGCCTGAGAACTTGTAAATGCCAAGGGACCCTTGGGGCTGTGTGACCCTT
-GGTGGCAGCTACAGGCTGGTCAGGCTACAGAGAGGAAAATGGAGTGGAAAAGTAGTATCT
-CTCAGATGCCCTCCCCTTCGTCTCATTCCCCCCCTTCATCCCCACCCCTTGCTCCAATCA
-GAAGGTCTAGAGGCGATGGTGAGTGGCCAAAGTCCCTTTAATATCCCTGAATTGCGTTAC
-AAGTAATACTGCTGGAGGTGGGGAAGGGATGGGGGTTTGGGGGTGAGTTGGGATAGGACG
-GAGGAGGAGCGCCAAGCGCTCATACAAAATATGGCCAAAAGGCTTAGCATGCATGGAAAA
-TTATTGCTGTCAGAAGTTGCTATTTACAGGGTCAACGCCTCCATAATTGCTTCTGCTACC
-CCTCTCCCTCCCACCATCCCTGCAGCCTCCCTTCCCGCTGGGCCTGGAGCTGAGCAAAGG
-CCCATTCACCCCTCTGGAGCCCTAGGGAAGTGCCCCTGCTGCAGGGGTGCCTCCAGTCTC
-CCCCCTCTTTTGTGGCTAAGAGGAGGGGAGAGGAGGATCTGAGAGTCCAGGACTCCTGCC
-CCCAAGCTGGCTGCAGAGCAATGGGGCAGAGGCGTGTGCTTAAAGCGGAGGGGGCCAGGG
-CCCGTGCGCGTGGAGGTGTGTGCTTCGGTCCTCGCCCGGGCATGCAAAAGCGCAGCGGAG
-GAGGTAGTGGCGGCCAACGGGCGGGTGGCTGGCAGCCCGGCCCCTCTGTCCGGGAGAGTT
-GCATAGACATGGCCGGGAGAGAGCGCCCCTCCCGGGGAGCAGGCCAGAGGCCCCAGCGGG
-TCCGGGGCTCAGTCGGTCCCTGGAACCTGGGGTCCCTCGGGAAGAAGAATAAACAGGAAA
-CAAATCGAAGAGGCTCCTCTCTCCGGGCCGCCTGGAGTGGCAGGGGAAGGTTCAGGAAGG
-TGGGGACCTGCCCCACGCCTGGACCTCCTGATGCTCCCTCACCCCCCCAGTTGAGGGTCA
-GCAAGCTGCCCCCCCATTCTCGAGTCCCCTTCCTTAGCGAGTGCAGGCTCTGAAGAGGGT
-GGGTTTCTCCCGAGACGCGGGGGTGTGTGTGGTGGGGGCAGCCCTCTGTGGCCTGTGCTG
-TCCCTCTCCTTGCCTGGCTTCCTGACCTCCCAGTCCAGCTGGGGAAGCCAGACGGTCCCT
-GGGTGAGGCCAAGAGATtaaatagaataataaatagataaataaataaatacacaaataa
-ataaCTGGAAGGACCCAGCCGGATGGGGGAAGGGCATTGGCGAGGTGCTCCAGACCTCCC
-CCCAACAAGTAAGGAAGGGGATCTGTGGCCCTGGGGATGGGGGAAAGTGCTCAGAGAATC
-TGGGGGTAGGGCAGCTCCAGACTGTGGAAGCCCAGGTTGTGCCGGGGTGAGAGAGGGGTT
-ACATTAGGGGGCAGGGCCCTGAAGTGCCCCTCAAGCCCCCTCCAGGTTAGGTAGACTCAG
-AGGGGTGAGAGCTGCTAGAGAGGTGAGGGCAGCTGGAGCTGGGGCTGGGAGTGGGTGATG
-AGATCCCCATGGACTGAAGACAGTAGGAACTGTGTGTGGGAGTGGGGTGTGGGGGTGTGT
-GTGTGTGTGAATGGCCAGACCTAAGGCCTGAGCATGGATGGGATCAGGGACAGATCGGAG
-ACTTCAAGAAGGGTGAAGATTAGATCCCCAGATGGACACACTCTGGGAGATTCAGCAGAG
-GCCAGAGGGATGGTCTGGGGTTGGACTGTGGTCTCAGGGCGGCAGGGCCTGCGTCCAGGT
-GTGGATGGGGAAACTGAGGCAGGTATGGGCGTCAAGGGTATAGGTTTGCGGCTTTCATTG
-GGGGCTCCAGTAGAGGAATGGTCAGAGAGATTCAGCTGAGAAGCGAGAGAAAAGATCTAG
-AAGTTAGAAGAGCAGCGCGGGGTCTGGGAGGGAGAAATTTCCGGCTCTGGGGCGCGGGAG
-AGGTGCGGACCTGGTGCCTGAGTTGGGAGCCTTGAAGGCGCGGACAGGGGGGTCAAGGTC
-CGAGGGATGGCCGGAAAGGATGAAGTGGGTCGGGGGACGCTGGGGAAGACGGTGTGGAAG
-TGAGTCGTGGGTTTGGGGGTTGGGGAGAAAAGTTCCGGGCCGGGCCGGGGGTCCCCACGA
-GAGGGTCATGGGCAGGGAAACGCAGCCGGGGCTGGGCGAGGGCGCTGCGGGCGCAGGTAG
-GGGGCCCGGGGCGCGTGGAGAGCGAGTTCCGGGCGCGAGGGCGAGGCGGAAGGCTCAGCT
-GGCCGGGCCGGCGGGGGTCGGCGGGGGTGGCTCGGCCGCCTTGGCGCAGGCCGCCTCGCA
-GTGCTTGTGGAGGTAGGACTTGAGCGCGAAGCTCTTGTCGCACTGGCGGCAGCGGTAGTG
-CTTGAAGGCCGAGTGCGTCTGCATGTGCGCGCGCAGGTTGGAGCGGTCGGCGAAGGCCTT
-GCCGCAGTGCGCGCAGCCGAACGGCTTTTCGCCGGTGTGCGAGCGCATGTGACCCTGCAG
-CAGCCAGGGCCGCGAGAAGGCCTTGCCGCAGACGCCGCACTTGTGGCGCAGGTTGTGCGT
-GAGCAGGTGCATGGCGAGCGCGGGCATGGACACGTAGGCCTTGCCGCACGTCGGGCATTT
-GCGCGCCAGCTGGCTGTCCAGGCTGCGGTGCGTCTGCTTGTGGCGGCTCAGGTTCGACGA
-CGTGGCGTAGGTCTTGCCGCACTCGGCGCACGCGTGCCGGTGcccgccgcccgcctgcgc
-ccccgcgcgccccgcgcgccccccggcgccccccgcgtctcccgagccccccgcgtcccc
-gccgcccccgccccgccgccgccGCGAGCGCCCGTCCGAGATGAAGAAGGCGTCCATGGA
-GTAGCTGTCGGTCACTGCCGCCTCCCCTCGGAAGTAGCGCGCCGACAGGCTCGACTGCGG
-GCTTTCGGGGTCGCTGTACTCCTCCGGCGCCGCCGGCGGGTACGCGGGCTCGGCCGGGGC
-CAGCTCCAGGCCCGGCTTCTGGTCCGCATCGTAGCTGCTCGGGGGCAGGCGGTGCGGGGC
-GTACCCTGGAGGGGGCGAGAAGTGGAGGGGCGGTGAGAGGAGGCGCCGAAGAGGGTTTCC
-CGCTTTGAGCGCGTCACCCTTTGCGCCTTCCAGCTTGGCGCCCCTGTGGCAGCTCCGACA
-GTGGTGGTCTCCGACCTGCACCTCAGCTCTTCCTGTCAGGCAGCCTGGGTTCAATTCCTT
-CCTCCATCGACGGCAGTGCAAATAGCCGCCACCCCAACCCACGGAGCATGGGGCCAGCAC
-GGTtgtacagagcgtaccttcactatccagtgctcacaaccgcggagtgatggtcttata
-atacccacgctacaggtagagaaactgaggcgcagagagatgcagcagtctaaccttaca
-gtcaggaagtgatggagcccttgccagtgtgaccctgaagcccatgctgtctctattcca
-acaacatgctgccGTTGCAGCCCTGtaacttctctggatctcagttttctcatctgcaaa
-atggagcttgtgattggacacctccttccagggtcgttggaaggactgagtaaagtgacg
-ataataagcgtgtgttaagctcttactgtttgccagactctgcctcggtgctttacgcat
-gttaactctaatcgtcacagacccaaggaagtcggcactattgtaatccccatttgatgt
-gtaaggaaatgaacaaagGTGGGGGAGCATACAGTAATTGCTATATAAATGTTAGCTATT
-ATAATTATGCTTTTTACTTGCTTGGAGATAGTTTCctcccccaccacactgtgagctccc
-catggttggatctgtgtgcccagcacatgcctggctcaaagtaggtgtgcgatgaataga
-tgttgcatgaaggaatCACAATCCAGTTAGACCCACCTGCCAGGGTTGCTGAAGCATTTA
-ACAGGGGTCAAGTGTGTGGCATGTAATAGGTGCTACAGAAAGGGGACTTCCTCGCACCTG
-CTCCCAAGCCTGCTCTAGAAGTCGTCGGAAGTCCGCAGTGAGAATTCCCCTCCCCCTCCT
-CCTCCCACTTAGCTGGAGTTGGACCAGGAATCCTGTCTGCCAAGGGTTTGAGTGATTGGT
-GGGTGGGCAGGCTGGGGTCTCCCTGGGGATTCCGTAGGGGATTCTCATGGGCAGGGGCCA
-TTCTGATTTGCCTCTGCCTCCCATGGCCTAGGCTGGTCCTAGCACCTTCCCTGAGACCCT
-GGGGGCTGGGCTCCCTGGAGAGTTTCTGGCAGACAAACTTTTCATCCTGGCACTTGATGG
-GCAAGTGATTCCATTGTTCTGTGATTCCACAGAACAATGAAGGTTAGGTCCGTTTGGGAG
-GTTTCCCACCTGGGGAGTGGGATTTGACCTTCTCCTGGTGACCCCTGAGACCTGTAACCA
-CTCCTCCTTCCCTCCTCCCCTAGCCTCCTTCACTGAAGTGAGCAGGTGGAGGAGGGTTTT
-GTAAGGGGAAACAGGGTTCAAGATGTTCAGACTTTTAGCTGGGTACTCTGGTCAGCTTTC
-GTTTCCCACACAGCCTGGCTGATTCAGCctccaggcctttgcctctcatctggagtttgg
-gatggacacagggtgaagtctgtgtgcccctgaaggcaagggtgtgcccttatttttacc
-tctgtcccttcagcagccagcacagggccctctgcacacagaagtcattgtggattatgg
-aagtggatgaCTCGGAAGCGGGGGGCTCTGTGGTTGGATGTAAAGGGGGATAGTGATAGT
-GGCAATTTTTTAATCTGGGGAGAGGAGATGCCCAGCCTCTCCGCACCCTATGTCTCCCGT
-CCCATCTGCCTGTGGTCTGGAGGTCCCCCTGCTTCCCACTCCGGGAACCAGGCCTGGTAC
-TCAGGTCCCAGAACATTCAGGAGTGTTGTTTCAGACTGAGTTAAATACCCGTCAGGCACT
-CCCAGACCCCCCTCCTTCTCCTTCTGTATTTCCTCACGTTGTAATTCCTGGTGATGataa
-taatagctaatattcactgagcacttactgtgtgcaccaggctctgtgctaagtgcttcg
-ctcccatcatctcactgaatcatcacaaaactactctcatcacagataaggaaactgagg
-gacagtgtggtgatggcacttgctccaggggtggagcaaggattggaatccactgccCCC
-TTGgtttcccacatactgggaggtcctccaggagggggctgtggctgagctgttcacctc
-ccattcccagggccctagctagtgggcacttaataagtatttgtggaatgagtgaTGATG
-ATTTGCGAGGCCAGCCTCACTCCCCAGCCTAGCAGGACCTGGTATAGACAGTCCTGTTCA
-CCTGGTCTCAGGGCAGGTCTGCATCTCATGTGTCTGGGGCCATGGAAGGGGAAGGGTGGT
-TTGGTTCTCCAACACAGATTCCAGCTGAGTGCCTTTGGGTGGGTTGTGCTTCAGGTCCTT
-TTTTTTTAAAATGGGATTTATCTGGAGGGGTGACTGATCACGTAACCAGTGCTTTGAGTT
-CTATTATTAAaggatgacatattggataagagtaaaactttggtgccagacggcctggat
-tgttttggctctaccattcccagcagtgtgaccttggccaaacgatttggcctctgtgtg
-actcTACCGTTTCAGTAAGGGGTCTGCCAGTAAACAGTATATAAACAaatgataaccagc
-actctcagagcactcctgtgtcaggcactcttacaagggctttccacacatgaaagcatt
-ctacccccatgacacacaaggtggtaggtacccttttatagaagaggaaaccaaggcaca
-aggaagctaagtaacaagcctaagattgtgcagctgataagttagagccaggattccagc
-tcagTGGCTGGCACATTTTAAATCCACCACGCATGTTGGCTGTTATTATGAACAATAATA
-ACAATCTCCCCAGATGGGTTTCTGTGCTGCAGCTTTCTTGGCATCTGCCCCAACACATCG
-TGCTGCTCCTCTCTGGGCCTCTGTTTCCTCACCCGGGATGTGTAATTTCTATTTCACGTT
-CTGATGGGAAAATATCTGGTGCATAGTAGGAGCTCCATCAGTGAACCAGAGCGTTCTCCA
-TGAGGTGCTCTGCCCATGGCGCCCTCTGCTGGTGGCCCTCAGCGCTGTTGACTTTCCTCC
-TGTTGCAAGGGGCTCTTTATGAAGAAATAGGGGTGCCTTCAACAAAGGCTGCTCATTTGC
-CTAGGGAGGGCTGCAGAAGTGTCTTCAGGATAGGAATTGTGAGCCCAGACCAGACACCCA
-GTCAGTGGATTTTGGCATGGGTTGAGAGCATCCTGTGAGAGTTTGTGTGGTCATGTTAGG
-AGGAGGTGGTTctaacttgctttgtgactgtggccaggttgcttaacctttctgggcgga
-atctatacatgacaaagatggactggaatggtctaaagaccctttctgcATCATGGCTGA
-ATCAGTCCCTCCATGATGCTCTTTGTCCCCTCCACTCCCAGCTCCTCCAATTCCACCCCG
-TTTTCCTCAGATTCACAGACATCTCCctaggcaaccttgggcaagttacttaacatcttt
-ctgccacacctgtataagggagttcataataaggctgaataaatgaatgcatgtaaagtg
-cttaggacaatgcctgacacataatagctgccctcttgagctgttattattGTTACTGGT
-AGTATTCCTGTGTTTCCTGGTGATATATCCTTCTAATCTGCCAGAGAGTAGGAGATACAC
-ATGGGTGTCTTAGGCTgctgtgtgaccttgagcaaaccacctcacctctctgagcctcaA
-CCCTGGAGACTCCTTTAGGACACTAAAAGCCATACTTTAACCTAATGCATGGAACCCAGA
-CAGGTACCTTCCTCTGCCCTAAGAGTGACTATAGAAGGCTGAGATACCTATCCTGCAACT
-GACAGGGTGAGACAGGACTCTTGTTTGGGTTCCCAcagagatagggatgagctgggattc
-agagaaaagagaatctcaggtgagatctctcatcctagcccttgaattcaggccgtagcc
-atgtgaccttgggtaagtcgcataacttatctgggctcaaatcctccatttgaggaatgt
-ggaccagaggcacccctgtcatgtagggatatggggaggGCCCAGAAATACTTTGGAGAT
-GTGCACATGTCACCTGGAAATGACTTTGGTTTTCCCTGCCCAAGAGTCTTGATATTTTAG
-ACTGAAGGTCCAGAATCTGTCTTTTTAAAAATCGGTACTCAAAGGAGTGGTGAAAGGGAA
-ATTTATGAGAACTAAGGTGCTGGGCCCTCTGCAGACACTGTCTCATTTAGCTGCCTGACC
-CCCTGCGGGGATGGAGGGGGATGTGTAACAAATACTGCTACTGCTACTGCTGGTGCTTCC
-AACTAGCACCAGCCTCCCTGTGAGCCAGACATTGCCCTGTGCCCAgaggcccagagaggg
-gagaggatttgcccaaggtcactgagagggaggcggcaggtttgaaaccctccaaggcct
-gtgttttttccaaaacaccaGAGAGGGCATGGAGACTTGCTGGGGAAGAGATCTTCAATT
-GGTAGGGGAAGGGGTGGTGCGTTTCCTCAAACACTCCCTAGTTAGCCTGTGGTGGGGTGG
-GTGGGGGCACGGGGTGGTGGGGGCATGGAGAAGCTGTTGTGGAAAATGCTTCAGCCTCTT
-GTAAGTATTTGTAAATCATACTTAATaacagtaatgcctatcacttactgagcacttact
-tggtgcaaggcatcctgctaaatgctttgtgcacattagctcatgtctaaggtcacttcc
-ctccatgcccttgttctgcagaagctgaagcccagacaaaggccttgacccacctcaggt
-cacaaaacaagttctcatcagagctgggttggcctccttttctttcctttttttcagtcc
-aggactcctttccccagtctctcccagACTCCCAAGGTGCCAAACTTTCTCCAGGGAATT
-CCTAGCCTCAGCCTCACCTCTCTGTCCTAAAATGGGCAGAAAAAGACAGGGGCCTGGTGG
-GGGGCCAGCTTCCCCGGCGGCCCACTTTCCTGAGGAGGGCTGGGCCCTGCTGGGTGGTAG
-GGGCTGGAGGAGCTGCTGTATGGGTATATTTAGAGCTGCTTCTTGCTGTGCCAGGGCCTC
-GGGCCTCGAGAATCAGCTCCAGCCAGCTGAGCAGAAAGCCAGGTCTGTCAGCAGCAAAGC
-GGGATAAAAATAGTTTCTCCTGTCTGCTCACAGAGCTGGGCAAAGGGGCTGGGTACCTCC
-CCCTCCCCTTATTATAGCATCTTTGTTAGCGGTTCCCTGGGCACTGGACCAGAAATGACA
-CCCACCTCCTCCAAAGGCCTGGCAGCTGGTACATCTGCCCACGGGGAGGAGGTCCCTGTG
-CCCAAATGAGCAGGGGACAGAGTGAGGTCTGGCCCAACATGACCAACGCTGCATGGCTTG
-GGGCTGATGCCCACTGACCCAGGCCCAAGGAACTTTGAGAGAATTTCAAGGCTTTTCCCC
-ACCACCCCCATCTCTTGGAATTCCCCACATTCTGGTCTTTCCTGACTGTGACCCAATTCC
-TGTGGCCTACAGGGAGGTCCAGAGCTCTGCAGGAATCAATAGGAAAGATTTTTCAGGGGG
-GTATGGAGATGAGAGTGAGTGGCTCAGGGTCTTCATTTGCCCAGCCTGGGTTCGTAGAGT
-TGCCTCCTGCTCCCTCGGGGGGGATCTCCAGTGGGCCCTTTCTGGGCCTCGTTCCGGAGA
-CTGGGTGTGTTGTGCAGTGCTCCACCTCTTCCCCCGGCCTCCTACTTTCTGCTCTGCCGC
-CTCTCTCTCTAGAAGGGTGCACTCAGAGGGCCCATTCCAAACCCCTCCCTATCCAAAGGC
-TGGCCTGGCAGTAGACGCTTCACTTCAGGGGAGTCCACAGCTGGGAAAGAGACCAAGAGG
-CCCGAGGGACCCCATCTCTCCCGGCAGAGGGCCTCCAGGCTGTGGGGGCCCCTAAAACCT
-GTGGATGTAGCACCCACTAGGGAGGTGTGACAGGGTGCACCGTTTATGCTCTtgtgactt
-tgggcaagtcacggcctctctgtgacctcagttttgcctctgtaggttggagtgaatCCT
-CCCCTGCCCCCCGCTGCCCTTTGCCCACTGTGGATTTGTGTGGCCAGAGAGTGCCTTTGG
-GATGTGTAGATTGCTGTACTGACATAAGGGACTTGGTGTACTCTCTGGCCCTCCTTCAGC
-AATCAAAGACTGAGACTATCTAAAGTGTGGAAGCTCAGCTCAGGACCCTCACGTCCCTCT
-CGTAACCCCAGGCTTTAGAGGAAATCAGGGGTTCCCAGATTCCATATCTCACATGGGCCT
-CATCATTCCACACTTCCACTGAGCCCTGTTAATTCACAGGAATATTAGATTTCTGGGTCC
-Ctagaaggtcaaagctgaaagagatcatattcaaccgtttgatattatgaaaggaaaaca
-gaggctgggaggagaggggagactaggccaaggccacacagaaggctaatggtgagtcta
-agacttgaactcagCCCAGCCTTGAGAGCGGATCTGGACAATGACCTTGGACTGGAAACT
-GGGCCTGAATCTTGATTCTGGACCCAGCACTTTGCCCTGGACCTGTTCATAGGTATTGAA
-ATTTGAAATTGGACATGGATTTGTCCTGGATAGCAGACCTGGACCTATAACCTCAGACAC
-TGACCTTGGACCTAGTCCTTGGACCTGGTCCTATACCTGAAGTTTGACGTAGGCATTGGA
-CTTGGACCTCAGATCTGTACTTGGATGTTGGACTGAATGTTGGACCTTGACCTAGACTTT
-GAACCTGGGCCTCTGACATGTCTTTAACCTGGACCTTGGACCTGGACCAAGGCCAAGTTA
-CCAGGGAAAGGGGTGGTTAGAGAAGACTCAGATGGGTCTGCTGTGTGTCCATGGGCACCT
-CCCCAGCCTTCTCTGTGCTTGCTCTTCCAAAAGACTGGGGAAGCCCTTTTGCATTGCTGC
-TCCCCAGAGGAGCTTTCTGAGGTGTGGAATGGATGTGTGGCAGCTGGGGACATTGGGCCG
-GGCTCCCGGGCTTGGCCTGGAGCGACTACCCGGCACCATCAGAGGGAGTGAGAGGAAGTG
-GGCGCTGGTTTAATGTGGTCAGCTAGATAAGCCCATGGGTAGAAGTAGGAGAGTTTCCTC
-AGCTTGCTGGGGGAGGCTTAATGTAGCTGCAGAGGGCAGACAACTGTGTTATTGGATTGG
-CATTGATCCCTCATCTGCCTGGGTTGGATGCACTCTGAGAGGGCAGGAGGGCAGGACAGG
-GCGGGGATGCAGAGGAAGGGGGGCCTGGCTCCAAGCTGGGGTTCGGAGTTAAGGTGGAGG
-GGAGGCAGACACTCCAGAAGATATTCTTGGCAGGGGCCCACAGAGACCACTGACATGCAT
-GTGGGTGGGCCACCTTCTTTGGGGTGGCTGAGAGTCCCAGTATCCTTCAGATGGGGGCCC
-CGGTCTGTGGGGAGGGCCTGGTGGAGTTGGAGGGTGAGGTTAGCAGAGGGTTAGGATGAT
-GTAAGTTGGCATCTCCCAGAAAGACTGAGTCTGTGCTCAGAATCACCCAGGGGAGAAGAG
-GGGAAGGGAAAGCAGTGGAGGAGCAAGAGAGGCATCTTACTTGAGGGGACAATGAAATTA
-GATCTATTCCCACTTATCAGGGAGCTCTGCAGAGAGACCTGGTGCTTTCTTCATTTGAGG
-GGCTCCCCTTCCCTGTTTAGGAGTTCTGTGGGCTTGGGGGGACCCTGGAGCACAGACAGA
-CTTGCTGCACCCTCTGTTCTGCCTGGCGGTAGAGGCTGAAAGGGAGTAGGAAGGCAAAGA
-AGAGCATTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgcgcgtgcgtgt
-gtgtgtatgGAGGAGGAGCAGGAGTCCTCCAGGAATTCTCCAGCATTCTCAGGCATTCCC
-AGAGCTGGGGTACACCTCTTTAATTTGGGGTTCTGCATCTTTATCAGCTAGGAGCTTGTG
-GTTTCTCTGACCTCCACATTCACAGGCTCCCCCAACCCCTGCTCCCCCGACCCAGGTTTC
-CCTCCCGCCAGCCTCATCCTGACCCTGCAGCCCGAGCTGCAGGAATGGCTTGTAAGAAGA
-TCTTTCTAATAACTGGAACTATCTCCAGCCCCAGGCCTCCcccgccctccctccctccct
-ctctccttccctccctcccttgcttctcctccctccctctcctcatcttccccccctccT
-CTCTTTCTCCTTGTTTACCCAGCACACTTACACACGCTGAGAGAGAAAAACGTCGGCTCA
-GCAATTTTTCACACTTCCCTCAAATGCTCAGCAAGGTTATTTCCGGCAGAGCGGAGACAA
-CGGGCCACCAGGAGCCGGCGGGCTCTCAGCAGACCCCCAGCACCCTCCACCCGCCCAGGG
-AATAAGGGATCCCTCACTGCCCAGTCTGGCCGCACCCCAGGGAGGGAAGAGGCCCCTGAA
-AACAAGACAAGGCAGACTTTGTATTTCCCAGTCATACCTAGGCTTGGTCTCTGGCACTGA
-CCGTCCACTGCAGACACTGCCAAGGTGGCCAGGCCAGGGTGCCTGTCCTCACTATGGGGT
-AGCCTACAGAGACCAAAGCCAAGAAAAGTGCCCGATCCCAGAAATGCCGCTACCCTCAGC
-CAGGTGGCGTATGTTCAGTGGAGCCCTAAGGAAACCCTGACAGTGGCCTCCCAGCATCCT
-GTTAGACCCCTGTGCAGGCATCTCCAGTGCCTGACATTCCATAGTTGACCTtcacagaag
-ctgagcttgtcaaagttggaaggatgcttagtttatgccatcaaaactctttcactgctg
-gggaggctgaggaccagagaagggaaggcacttgcccaaggtcacacagcatgtgagaga
-tctagagcccaggcctccaaatttcaggccaggtttctggctatcagcacagccTCAGGA
-TTCCTGAGAGGTGAGGGAGTTGGTCTGGAGACCCATGGGGAAGGGGACAAAGACAGAGGT
-GGTTCTAGGGTGTTAAACCCGGTGGAACCTCTGCAGAAACACCCTGCTGGTGGCTCTGCA
-CCCGCCCTGCTTCCCACTATTCACTCAGGGGCTCCTTTCAAAGCTTTTTTTTGGACTGAA
-TTCAAGGCAAGGCATTCTCTTGCCTCCCTCCTGAGGAACAGCCTGCAGTTTTGGCTGTGC
-ATGGGAAATTCTCTGGGCTTCTCTGGGTTTCCTCAGCTGGCCTGGGGACAGGACCAACGG
-GGCTTCAGGGGGTGGAATCCCAGAGCTTTGTGTCAGTGTCAGTCCCTTAAGAGATCCATA
-TCCCAAGCTTGCAGATATTTCAGTTTCTACCAGCTTTGAGCGCACACTCTCCAGCTTTGG
-CATGGCCCCAGGTCCACCCTCTGTCCTGCCAGCCCTCAGCCCTGCTCAGCCATGTCCCTG
-GGCTTCTGACCTCCACCTCAAGAGGCCCTGTGATCAAGAAAAGAGGACAGTAGAATAAGG
-GACATGTGGGCAGAGGAGAAGGGGTTTCTGTTAAGGGTCTGGGGGATGCCAGTGGATGAG
-GGGCTGTAGCTGTATCCCTGATCACTCTGTAACTTCTTTGACCTTGATGAGGTCACAAAG
-CCCTTTGCCCAGCACTCTCTCTCTCTCTACCTGGTGTGGCAGAGTGATGGAATGTGGGTG
-AAGTGCTTGGAAATCCCAGAGGTGGAAGCCCCCATCCTCCCAGGCTCCTGTCTTTGCCAT
-CTCAGTTCCCCCCTCATCCTCAGTCCTTTCTTTTCTCctctctcaatctccctctttctc
-tctctctctttccccacccccatctctctctctctctctctctcacacacacacacacac
-acacacacacacacacacacacacaACCCAAAGCTGCCACATGTGATGTCAGATCTCTCA
-CTACCAAAGGGACACCTCCTCTTCAGACACCTGCCCTGGTGGGGGCCATCAGGGGAGAAC
-CCCTTTGTGATCCCCTTGGTGGAGGATGGGATCCACAGAAGCAGTCTCCACTTTCCCCTG
-CCTTCCAGAGATCACCCCCTTCTGCACCTGAATGACTTCTCTTGTTCCTCAAACCCTTGT
-CCCTGCAGGAACTTGTTCTGAGAAGAGATGGAgtgtgtgtgtgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtatgtgtAGTGAGGAGGGGGCTTACGAGGAGCAGCAGGGTTGGTT
-CTGGAGGGGGTTGAGAAGCTGGGGATGGGGAAGGAGTGCAATCCAGGGGACCAGGAGCCA
-CTTTGGGGGAACCCCTCCCAGAAATCCTCTCTTTCTTGCAGTCCCCAGGACAGGCCCAGC
-CTTTGGCAGGCATGTGGCTGAGGGTAACAAAAGAGTTATTGAGAGAGGGGGTCTGAGAGC
-ACTTGTGTGACATCGGCAGGGGAGCAGGTTTGAAGGGAGGGAGGGCGCCCCCAGCCACCC
-CCAGGGAACCAACCCTGTCTCTCCAGGGACTGAACATCCAGGGCTCTTTACCTTCCCCCT
-TCCCGGGCAGCCAGCTTCTCTTCCTCAACGGGGGAGAGGGAACCCTCAAAGTGCCTTGTG
-CCTCAGTGCCCAGCGCTGGCCTTTCACGAGCAGCCCCGTCTGTGTTCTCTTGCCACCCCC
-TCACTCTAGCCCTATTTGAGGGCCACAACTTTCAAAGTCCCGGCTGGCGCGTGGCTGCGG
-GATGGGCCGACCCCGCGACTTTCCCTTTGTACGACCTAGCCCCTGCCCCGCCCGCACGGC
-CCTTGGAAAGCCCGGGAGGAGCCCACGGCCAGAGAGATCTCCTCCCGGGGGTTTCCTGTC
-GCACGCGCCCCTCCTCGTGGCCCAAGCTGGGGAGGGCCCCAGCTCCCCTCGCCTCTTCTC
-CCAACCCCCCGCCCCCGCCGGGTCCCACTCACCGTTGTCCCCGGGAGGCCCCCGGGCGCC
-AGGCAGCACGTAGGCTGTCTCCAAGGGGTGGTAGGTGGGGGCCGGCACCCCGCTGCACTG
-GAAGCCGTCCCCTTTGATCTTCTTTACCAGGAAGGAgcgcggcatggcgcggccggcgcg
-gggctcggtgcggggaggcggccggccgggcgcgATCGGCTGTGTCCGCGCGGGTTTTCA
-GCACTGGACAGCTCCCAGCGGGCTGGAGCGCGGGAGGCCGCTCGGAGCCGGCACCGGTGG
-CGGCGGCCCCGGCTCGGGCTCGGGCTTGGCGGCGGCGGCGCGCAGACAGGGGATCGCGGG
-AGCTGCGCTCAGCACTCCGGCTGCCGGCTTTATATGGGACGCAGGCTGGAGATCAGGTGG
-TCCCCTAGCAATGGAACCGCTCGGCGCTCTAATCCATCAAATGTCCCCCAGGACAATCGC
-TCCGCACACGTTCCCCTGAACCGGCGGCGGTGGGGGCAGGCCCGGAGCaggcaggagggg
-agaaagtgagggcgagaaaggcgcagagacagagagggacggagaaaggggagtgagggg
-ggcggggagaagaagagagactcggagaaagacagagacatacagggaaagagagacgca
-cacgctgagagaggtagaaatagaagcagagagaccaagataaggacaaaaagacacaag
-agagaaacagagagagaagaaagacagagaTGGAGAGAAGTAGCAACACACACACACCCA
-CGGGAGGAAAAGAGAAATCCAGGCACACAAAAAGGAAACCCCCCCAGGGATGCAAAGAAA
-GGGAAAGAAAAGTGCAAAAGAGAGGGGGAAGCCGAGGGGAACGGAGGGAAAGCGGTCCCG
-AGCAGGCGGGGTTCAGGCACATGGGGCCGCAGGGAAGGGGATGCAGAGGAAAGAGTGCGC
-ACTGGCCAGCGGCCACCCTCCCGCCTCCAGTCCTCTCCCTCTCCCCCAGTTCTGAAGTGG
-CCAGGGTGGACGCTCAGCTTTCACTAGAGTAAGTCTCCCCTCCCCCCTGCTCGGGCTCCC
-ACTGGAGCCCCCTGTTGGGTTTGGGGTTCAACTTTCTTCTTCCAGAACTGGTGGGGGGAG
-CAAGTCCCCCACGCCGATGCCTGGCCTTGCTCGGTTGGTCCTGTTCCGGTGCCTAGCTCA
-GGCGGGCGCTGCAAGAGGAAGTGAAAATCGTCCAGTAATTAATTTTCCTGCTGCCGGGGG
-GTGGTGGTTTTGACACATCCGAGGCAGTGTCTTTCCCTGAAGCGGGGAGCAGACAATAGA
-GACACGTGGACTgggaagggagaggggggaagggagggggagcgggGCTCCTGCTGGAAC
-TCTTTGCAGGTCAGCTCCTTTGTCTCTAAAAGGATCTGAGCAGACCCGCCACCCCCAGTC
-CGACCCAAACCTGGGGGAGCCCCCATATCTTGGCAGGACCAAGGAGCAGGAGAGCTCAGC
-CCCCTGCCCAGAGGGTGCTGGGCAAAGCCCCATGGTGGCGGACCTGCTTTAGCAAGTGTG
-GGATGGCCAGTGCACAAGAGTCCCAGAATCAGACTCTAGGAATTCCAGGCTCTCGCTGTC
-AATGGAATTCTGGTTATGAGATGCAAGGCTGGTGGAGTGGGGATGTCCTTTTGGGACTGG
-GTCATCCAATACCAGTTTGCAGGCTAAGACCTAGAGAGGGCTTGGAGGTGCTTGAGGTCA
-TGCAGTGAGTCAGCAGCAATTGCCAGAGACCTCAGTGGCCTCTGGGCACCACTGAATCAG
-GGCCTATCATGGTCCTTGAGGTGTAGCCCAGAAGTCTCAGAATAAAACTGGGGCCCCTcg
-tggtggttcaagcctgtaatcccagcattttgggaggctgaggcaggaggatcacttgag
-gtcaggagtttgagaccagcctgggcaacatagtgagaccttgtctctacaaatagttaa
-aaaaaaaaaaaaaattagccaggtgtggtggtgcacacatgtggccttagctacttggga
-ggatgtggtgggaggatcgcttgggcctgggagttcgaggctgcagtgagctgtaatggc
-accactgcgctccagcctggatgaaagagcgagaccctatctccaaaataataataataa
-taataataaGTTAGAGTTTCCAATGCAGGATCTGTTGGCCTTGAATATTTTCAAAAGACA
-TAAAGATGCAAGGATGTGGAAGCAGAAGGTTTGCCATTGAATTTGCCCTGTATGGTTTTA
-GATTGTTTTCCCTGACCGAAATAAGGAATTAAGGCAGTTTACTCCCTATATATAAACATT
-GAAAAACATTGCAGGTCCAAAACAATGGGGGCCCCTGATCTTGCCAAGGCCCTGCATGGT
-CTAGAGGTCCCCCACCATCTTTCCTGTTGCATTGCCTCATATCTTGCCCATGGGAAtttt
-ttttttttttgagatggagtttcgctctcgttgtccaggctggagtgcaatggcgcgatc
-acagcccactgcaacctccgcctcccaggttcaagtgattctcctgtctcagcctcctga
-atagctgggattacagggtgcgccaccatgcctggctaattttttgtctttttatcagag
-acggggtttcaccatgttgcccaTGGGACTTTTTTAAACCTCTGTCACTGAGAGTTGAAG
-TGACCACACCCTTGACTCATGGCACGcccatgcattctctgctccagccataggtgccta
-ctggtgctttgggcttgcagctctcttgacctgtataccatttccactgcccagagtcct
-tccctgcacttcaccctaggaaacccctacttgttctcaagactcagccgaggggtcact
-tcctccaggaggtgtccctgacttccatcattgcagactgggccaactcacccactggtc
-cctgagcttcatgaggacaaagactctgtcccatgtatggcttaacacACTCTTAACAGT
-GTGCATGAGGGTCttctagctcccctacttattagccataggtccttggacaagttactc
-aaccgctctgtgcctcaatttccccacttataaaatgggaataataattgtcactaccta
-agtgttgttgggagtgttagaagagttactacatataaagggcttggaatggtgactggc
-atatggtaggagttcaatGCTTGAGGGTTCTATATATGCAGTTTTGCCTGTAGCATGCAG
-CGCTCATTTGTTACATGTTAGTGGGATTctgtggaatgagtggtgaactaggcatctctg
-gtccctgctttcttgcagctgatcttgcagctgtccattcattgagtggatggacaccaa
-gcaagaaaatccttaaatcaacaatatattttcagatagttgaccagtgctgtgaggaac
-ataaaacagggtgagatgatggagagtgatggtgcctttaggcagggtgaccagcaaggg
-tctcctgggagaggtggcatgtgcacctagacttgagccagccatggaaggagcccagga
-aagagtgctccagccagaggcttcacaagttcaaaggctctgaggcaggaatgagcttga
-gcagctgaggacagcaagaaggGAAGGAAGATGAGTTCAACATGTTAGCAGGGCCAGACC
-CAGAGATTACTCCATAAATCCCAaatgaatgagtgaatgaaagaatgaatgaTTGTAGGG
-GTGAGATTCAGCCTATAACTATAGCTTACAACTGTGACTAAGTAGACCTATTGGTTGGAG
-AATAACTTTTCACTGTTTACATAGAGGAAGTTGCTTATTTGTTCAGTCATTGACAATTGT
-GGTATAGCCATATTTTTTAGTTTGTGCTGGGTACTTGGATCTCTGTCCTCTAGGGGTGCC
-TAGTTCACTGTGGGTAAATAAGGCAAGTGGGTGTCATCTAGCTCACCTCCACCTGCCTGA
-TGGTTCTACCTCTCCAACCTCACATCTAAGAGATGGCAAAACGGATCCCAGAGTCCTTAA
-AAAGGAATATAGGTCACAGCAACTTTTGACAGAGCTGGGACTGGACTGTTCTCACTGGGC
-AAGATAGTGATCCACCCCTTAACTGATCAAAGGAAGCCCCACAGAAATGGTGTATTAATA
-GGTCCTGCAGCCCACTAGTGTCGGGTTGAGGATAGAACCCCAGGTCTCTGACCACAGGTT
-GGAAGGTGGTGTGGGTGCATTTAGCATATGAGAAGAAGCCTTGAGCCCTGAAGATGAGGT
-TCCAAAATACCTTCAGAGGGGAGGAGGCCTTAAGTATGGATGAAATACACAATGGCCAGC
-AGAATTTCATCACTAGGACACCAGGAAGGGCCTTCTGTCCCCCAAACCTCCCCCCACCCC
-AGCTTACTGGTTTcaggaagttcactgtggggaattaatttctctaagtcacatgaaata
-aggaaataacttttattcccaaggatgttcgctgcagcatcagagatggtaataaaaacc
-ctgggttggagaaagcaaggagagggttgtgaagaagacgttcactccatgtagtattct
-gcagccattaaaaattctcatttggggagaaaagctcataaaatgtgttaagtgaggggt
-gcagaatacagaaacctctcacagcacgttcacaaccatgaaccaaaacaaaaataaaca
-cacacAAAAGAGTGAAATAAGGGTCTGGAACTATGGGGTTTCCCTCTCCCTTCTTTTTGT
-GTTTTCCAAAAAGATCATAAAATATTTCAGTTCagccaggtgcagtggctcacgcctgta
-atcccagtactttgggaggctgaggcgggtggatcacgaggtcaagagattgagaccatc
-ctggccaacattgtgaaaccccatctctactaaaaatacaaaaattagttgggcatggtg
-gcgcgcgactgtagtgtcagctactagggaggctgaggcaggagaatctcttgaacccag
-gaggtggaagttgcagtgagctgagatcgcgccactgcactccagccttgtgacagagca
-agactccatctcaggaaaaaaaaaaTAGTTCAACAAATATTTATCTTGAGCACTTGCTAA
-CTGTCACTTACTTCCAAATAGAAGAAATGCTGAAGTTTAGTAAACCATGTCAGGATATTC
-ACTATTCATTCTTCTGACTTTTGGGAAGTTGGCATTGTGAATTTCCCCAGTGGCAATAAT
-AATTATTAGTACATCGCCAGCAACATTACAGAGCCACCCCACAGGCCTGGCAGTGTGCTA
-AGCACTTTCCCTTTGAAGAAGGTGACCTTgcctggggctttagattgagggatttggagt
-cagcctattttcagtttaaattcctgctctgccatttcccgactgtgtaattctctgtgc
-ctccattttctcatctgtaaaatgggtgtataaattgggcctgtctcacaaggttgcagt
-gaggattaaatgataatataggcatcaagtgcttagagcagtgcctggcacacaataact
-tgataaatgttgacagttgctatttacatatcctcacttatctaagccttaccatggcct
-catgggagaaggtgctgttattGAAATGACTGGTTCATGGCTACATAGTCACTGTACAGA
-GGAGCTAAAGAGTGTCCCATGTCTTCATGGCCTACTGCCTTCCTGCCCAGGAGCCCCAGG
-TCTTGGCATAATAGGTCTAGCTGGCTGCAGGCTTAGCCCTCTCTGGCCTACCTCGTCTGC
-TCTGGCATCTTCCATATTTCAACTGTGCCCTGCCCATCAGGAAGAAGGGCAGTTCCCAGG
-GTCTAGGTGTGAGTCTCAGGGCTGTGTGACCCTAGGTGGCTGGCAGAGCCACCCTGGGCC
-TCACCCTGCACATCCATAAAGAGGGGTTGGGGCATCCTATGATTCACTGGCTTCACTCTA
-TGGGGTCAGgaaggagcactgacctgggagtcaggagcccagttccagccctgcttctgc
-tccctttgccctcccctttgggccccagctttcttgtctgtcaaatgggaatgggacaag
-atggtccctgagctgctgtccagACCCGGTAATGGAATTCTGTATGAATTCCAAGGAGGA
-GAGTAGCCACAAATGCATCCGCTCCACGCTGATGGGGCTCTCTCTCCGGTAAGCTTCACT
-TACTCTGCCATTTCTCCAGTGTATTTTATCAGACCCACCTCCTCTGAGCCAAAGAAAAGA
-GGGTAGGAGCAGGATGAAACAAACTCACAGCTCTGTTCATTCAGGCTCATCACAGAGATG
-ACTTGCCCAAGGGCATGTGGCAGGTCCTCTGAAATTTGAGGAAGGCTGTGTTTTCTTTtg
-tgtcactttggtcctccgggaagcagatgtgaaaatggaggtgtaagtgtaagagattta
-ttgagaaaacaccgtgagaaatggaggagagccttcagagagggatgcaggtctgatact
-gtgaaaggagaggtggaataaagaaagattggggaagaggagcctcaggccatggtgcag
-gtctaaggaagtcctagccaacccaacagggagctcctgtgcaaagatttcctgtagagg
-agtcccgtgctcgacagaagggcagaccctagtttcccaccatgctcagtcatcagccgg
-cctgtcctggaagagtggctgtgctgacaactatggcagattgcaaaggtgttgcagctg
-gaggctctcagtgactgtagtccagagaagatctgagtggcacctccctaaggctgccac
-aTGTTTTTCTTTATTCATTtaatagacacttacagaactctgggccatgtgccagttact
-gatctatgcactttacaaatattaccttagttaatccttaccctcgccttttgagacaga
-tggtatttttagccccattttatagagggagaaactgagcacaaagaggttaagtaagtt
-gcccaaggtttcacagccagtaggtgataagccacaaatccaacccaggcaagctgcttg
-gaggctctgctctgaccactccaccacactgCCTCCTCTCCAGCTGCAAATGCCTTGGTG
-GCAATTTCTGGGACCATTTCCATTTTCATTTTTCATTGGCTCAGGACCTCACAGCCTTAA
-CAGGAAGGGGCCTACTGTGGTGGCTGGGGGCATAGCAGGGTCCCAGCTCCCCCTGAAGCT
-TCTAccttgctccctcaaagacttccacctcaaagcctttgcatatattgttcccactgc
-ccagagcactcttccacccccttccttgcctaggtaacccctcctcCCATCGCTCCCTTG
-CCTGACCCCAGGATCTAGCCCAGGATAGGGGTGATATGTAGTGGAAAGGAGCTagttgac
-atttattgagcacttattatgtgctaggagccaagtccagccctttacatagattgcctc
-acttaaccatcataacaacctgtgagtgtggcccatggctatccccattttacagatgag
-gaaaccaaggctcacagatgcaaggtgacttgcccaaggagacccagctaggaatcagtg
-gtgtcagtatttaaaccaggctgcctggctacaaagtcctgatcttAAACCATGAGTCCT
-TCCCTCTAAGAGGGCAAAAGATACCAATGCTAGGGTGGGTAGGTGAGGGCCCTCCAAAGA
-ATGTCCCTCCCCTtccccctgccagggctgacagctccttgagtgggattccggatctgc
-tccattcattgccgcacctccatcgtctacccagagccgggtaaatagtaagtgctcagt
-aaatacatcaattgaatgaataaaCTAATGAGTGAAAAACCTTCTTGCGACCCGCAGTCA
-CCTTGGTCCCCTTTGACCAGAGCCAGGTTGACGTGTCAACCGTCAAGATATCCCTCTGTT
-TTGGGTGATAATTAGATTTCTATCTTGACTGTTACAGACATTGGTATTCCTCCATTAAAA
-TGTCTTTCTTTCAggccaggtccggtggctcacgcctgtaatcccaacactctggggggc
-cgaggcgggtggatcacctgagttcaggagttcgagaccagactggccaacatggtgaaa
-ccctgtctctactaaaaatacaaaaatcagctgggcatgatggggcgtgcctgtgatccc
-agctactcaggaggctgaggcatgagaatcgcttgaacctgggaggaggaggttgcagtg
-agccaagactgcgccactgcactccagcctaggtgatggagtgagactctgtcttaaaaa
-aaaaaaaaaaagaaagaaagaaaaGAAAAAAAGTCTTTCTTTCAAAGTTGGAGACATCCC
-TAAACATTCTAACTCCTGTCCCTGACAAGGTCCCATCTTAAGCAGGTCTCTGAAACCTCT
-GGAAGAAGGAATTGGCTATCAGGAGTCTGATCACCAGGCTGCCTGCGGGGTCAGGGTATT
-TGGGGTGGGCCTCTGGCATGGTTTAGCGGTGGGCTGGCCAAAAGCCCCTAGACAAGAGCC
-CACCATTCAAGCAAGTGGGATAACTCAGCGTTTGGGCCTGGGTCACCCTGAGCCAAGttt
-tattttttatttttattttgtagaggtagggtcttgctctcatccaggctgtagtgcagt
-gttgtgatcatggcttatggcagccttgaactcctggggtcaagtgatcctcctccctca
-gcctcctgagcagctgggactacaggtgcatgccaccatgccctggctaatttttaaact
-ctttgtagagatgggattttgctatacttcccagactggtctcaaactcttggcctcaag
-tgatcctcacgcctcggcctcctaaagtgctgggattatagatgtgagccactgtacctg
-gctgagccaaattttaatcctggctctgcctcttcaagctggttggccctgggcaagtta
-ctttgcctctttgcagctctatttcatctctgtaaacagaggccagtgggagcacctgct
-aagtagggctgtAGGGGGCTTCATGTATAGTCAGCCCTTGGTAAGTGGGAGCTCTActtg
-aagggcctttgagataacagcattgtctcctccccacccccatttgacagttgtggaacc
-tgaggcatgggacagggaaatgctttccctggaacattcaggctccctgccaagtcagga
-tgggcttcctcactccaaggtggcctctctTGCCTCCCTCTCTTCCCCACCAGCCGAGCT
-CAGAACCATGCCTGGGAGATGCTGAGGTGGCAATGGAGCTGCAGAGTTGGCATTTCCAGG
-CTCCCAGGACTCCTGGCACAGAGGAATCAACCCCTCTCAGCAGCCCCGGCTCTGCCTCCT
-GCTCCCTGCCTCTGCTCATATACCAGCTGGGACTCATCAGCTTCTAGAGAAAGCCAGGAG
-GTGGCCCAGGTGCATGGAGGCAGGGGGCTGTCAATATTGACCTGTGCTTGACCGCAGACT
-TTGCCAGTGGACAGGTTGCTAAGGAGTCAGAATGTCCACATGCCCCTAGTGCTCATCTTC
-CTAGCCTCCCATCTCACCTAGCTGCAGAGGGGGAGGGGgagcacaagagttgaaagcgtg
-gatgatctgggttcacttcggctgcttaccaacaagttacccagcctggggaagtttccc
-atcctctttttatctcagtttcttcaactgttacatgaggatgttgatactaatggctta
-tcttgaagggcagatggaagatgagtgaggtgtttgcacacagccagtgctcaataatat
-tggccattgttAATTCTGAGGCTATCCTCTTACAGTGACCTCTTGGGCCTTTCAGCCCCA
-AGGAGCCTCTCCTCTCTCTGACTCCTGTGGCTCTGTCAAGATCCTGCAATGAAATTCTTC
-TGGAACCCTATCCAGATGGTGAACTCTTCAAGGGCGGGGACCCCATACAGGTGCCCCATT
-ATAGGCCTGGTACACAACAGGTGCTCATGAAAAGGCCTGCTTGGCTGTGATACtacatga
-acttacagaaccctcacaactacttttggaggcatatgacatgattatccccttttataa
-aaagggggacagtgggtaacatcgaggtgaagaaattgcccaagcagctgggcgcgatgg
-ctcacgcctatagtcccaacactttgggaggctgaggtgggtggatcatttgaggccagg
-agttcaaggccagcctggccaacatggcgaaaccccatctctgctacaaatacaaataca
-aataataataataataataataataataataataataataataataatagccaggcatgc
-tggcatgcacctgtaatcccagctactgaggctgaggcatgagaatcatttgaaccggga
-ggcagaggtaagagggagccaagatcgggccactgcattccatcctgggtgacagagtaa
-gactctgtctcaagaaacaaacaaacaacaaacaaacaacaacaacaaagaaaaagaaag
-aaaaaaattgcccaggggctcacagctataaatctgcagatacttattgtgacctgccat
-gtgccagacactgtgctaagagctggggacacagcaatgaacaagacagagacctgctct
-catgtggcttacatcctgctgagccaagagtaggtagatatgccaatgtcctgtcataga
-aagcaccaggcagggaaatgggcaaagacagagagaggtggaggccgggcgcggtggctc
-acgcctgtaatcccagcactttgggaggccgaggcgggcggatcacgaggtcaggagatt
-gagaccatcctggctaacacggtgaaaccccgtctctactaaaaatacaaaaaatcagcc
-gggcgtggtagcaggcgcctgtaatctcagctactcgggaggctgaggcaggagaatggc
-gtgaacccgggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgg
-gcgacagagatagactccatctcaaaaaaaaaaaaaaaaagagaggtggagcgagagcca
-ttttagatagggtagtcaaggaagacctctctgaggaggtgacttttgtgtagagtccag
-aatgCAGCAAGTGCTGGGTGAAGCCTCAGGAAATCTGCTTTAGCATTGCTGTGGCAGATT
-CAGGGTGGAATCCAGGAGATCCCAGGACTGGTGGTGCCTAGAGCCCAGTTGGCTAGATCA
-ACTTCAGTGTGGATAAATGACTCCCCTGCCCCCGCGAACTTACCTTCCTGGAGCAGTTAA
-AAGAACGgggcacatgacctagattctctgagcttcacttttctcatctgtaaaatgggg
-attgaaaagcatagcttacaattctgagagctgagttgattaacagagatggtccatgta
-aaatgctgggctcagagctgggcTGACCAGATTCACCTAGTCCTTGGTGGCTGGAGTGGG
-CAGGTGACCTTCCTTTTGGCCGTCCAGCACCCTCCAACTCCTTGCTTCTGAGACCTCACC
-TCCCACTCATGGTATCATTGCTGGCCTTCCCAGCCCCGTCTTGGCCAGGGGGCAGTCAAG
-TGACCCAGATTAGCCTCGTGccattctgttgagggtgtggtggttgctacattgagtgtc
-cagaggtagcaaggactaaagtcctggtgtcagcatccagcgttggtgtcagcagcacga
-gctctgtcttggggacccgtggtgtcagcagtgaagtctccctcaggccagggctttggt
-ctgatttgagggcttttttcttttctggatatgaagcctgtaagccttctgaccctcctg
-gagatcctTCAGGCACGTCTGCAGCCATGGGTCCTGGATGATTTAGCAGCTCACGCCATT
-GTCTGGAAACTCCACTGGTACTATTTTTCTCATGTTCAGCTCTCTGTGCACAGACTCCAT
-CCTTCTGGCCCAGATGGCCCCTTGGGGATATGCACATACCAAGTTCTTTCCACTGTCCTC
-ACTTtgagggcaggggcctgggttgttcatttttgtgtccccagatcctagcacagagcg
-gctcagaggaaaggctcaatgcatgtccatggtgtcaacaaatCAGTGGcacaggataca
-gtttccacacatctccccatcctggttgcttccccgaaccattttccagtctgtcagtgt
-tcttctgaatatacaggatccagaactgagcacaaaactccagaaataggtgaatggagc
-tgagcagaatgaaactgtcacctcccttaccgtagataccggacttctaattacatgacc
-agacatttaataagcttgttttgTTTCCCTGGGTGGCATATATCAAGCTACTAGCAAGCG
-TTTTGTTTTCATGGTCCTCTACCCACATATTGTTGCAAAACCTCACTTTACTGCCCTTCT
-CCCTTAATTTCACGCTTATAATAGTATTGCCCCTCTCTCACTTCCcaggaatgccaagtc
-gattacagctcaagagcccaatcttgactggtccgtagcctggaacatggtgctgagata
-gatgctgtaactgagtttgggctcactgagaaagactgctgcaattgattaacgatgtct
-gccaAGCTGTGTAAAGTGAAGTAATGTCATTCCCTATCACAAGtcctaacctggggtcca
-tggaaagaatttagttggtctgtcattaacttggatagggaaagtattacatctttaatt
-tcattaacctctatctgaaacttatcattccttcaattatgaatgcaggcaacagaccac
-agtggtattagcaggacctgtgactttgtcaccaatagaaatcacagattttttaaaatg
-acattacagacgttccgcatatcttgaaatataatttacatgcactgtgacttggaaatg
-ataagttattTGCTAAGTactcatttacttactcacatttgtttagcgcctagtcaatag
-cctggtgacgtgccaggacctgggctgggtgctataggcaaaaggcagatgcgtaaggct
-cagtccttccctcaaaagagaaaagcagacagtgacaatggaaaggcttgatgctttgat
-gggggaagtacctgaggcccccaacccagcccagagggatcagggaaggcttcccagagg
-aagtggcctctcagatgagtaggaagtaaccagacccctgagtgctgagaaaaagtgttc
-agggagcagaaacagcatgagtaacgaagctaggaaagaaagagGACACAGGGCTTACAA
-AGTATTCCATGGCGGGGATGGGGAGGGGAGGAGAGAAGCGGGGAGATGGCTGGGGGGGTC
-AGGCAGGCCCCTGGAAGTCATGCTTGGCGGTACCCTGGTCGTGGGGGGGAAGGGGTGCTG
-GCGCTTGCTGCCCCATCTGTCTCAGTGGCATTGAGCTGTGACTTCAGTGGCCTGGGGAAG
-TTCAAGGTCACCTCTGGGGTGGAGGAGGTGGAGACATCTCACCAGGGCTGGCAAAGGCCA
-ACTGGGAAGCTGGGGCCGATACCTGCCCCTCACGGCAGCCACCACAAGGGGCCTTCTGCT
-CCGAAGGCCCAAGCACGCCCTGTTCCTTTATTTATGGGCCGTGTGAGCAATTTGCTGCTT
-GCTGGCCGGCTGGCTGGGTGTGCGATGCGGGGATTACTCACGCCCCAGTTGTGGTCCGGC
-CTCTGCAGGCTGCGGGGTAGTGAGTGAGGTAATTAAGTGTAAAAGATGGAGCAGGCAGGG
-GAGGGCTGAGGGCGGTGAGCAGTCACTGGTTCTTTTCAGGAGCAGGGGAGTGAGATAATG
-TAGGATAATAGCCTAGCCAAACCCTGCCCAGGCAGCCCGGCCTGTGCTGAGAGGTGCCCC
-CCAAACGGCCAAGACAATTCAGCCTTTTCAGGGAAAATGGGGGGGCTTGGGCAGGGCCTG
-GCTCCCAGGGACAGCTGTATGGAAATGACAGCTCCTCTCCTTCGTCCTGTCCTGTGTTGG
-CTCAGGGTAGGGGCAAGTGTAAGTGTCTTCAGCTGGGGATGAGGCCAGGGCAGGGGGCAG
-TAGATGGGACCAGGAAAGCTGGTGGGTGAGAGGAGGGATCCATGCGGGGCTGGGAGACTG
-ACCTGTGTATGTGGCACAGgcacagtggttcgtggcagcagactccagggcctgactcac
-ctggtggaaactgtggtgtggctttggctagctgtgtgacatcagcctagttgtggtcct
-tctctgagcctcaggactctcatctgtcaaatggggctgtcaaacaattcctacttcccg
-ggggtgtttggagaatGGTTCGTAGCGCCTGATGCACAGGGGCTACGAAATGCTTGACAT
-GGTGAAGTCCAGAATCAGAGTGCATTAGTCattcactcattcagtggataaatgtttatt
-gagtgcctaccatgttctaatggttcctgggaaagcagcagtgactagaacagagtccct
-ttcctcttggagatgacattctaagaggggagacagaccattaatcgtgaaacacataaG
-CATAAAAGGTCATAccagcaatcccacttctgaaaacttattctatagacatgtttgcat
-acatgtggaatgaatgcattcatggttatttattgcaattttgtttggcatagcaaaatc
-ttagtaatgatctaaatgcctgttacacatgggctgactgaagtatggaatattatatag
-ccattaaaaagggtgagaccatttctatTTCTgtttatttttatttactttttttagaga
-tgggatctcactatgttgaccaggctggtcttaaactcgtcactggtgaGACCATTTCTT
-ATGTACTGATATAGAAAGCTCCCTAAGATGTTTTGACAAATAAGAAAAGGAATGTGAAGG
-ATAGTTTCTGTAAAAGAGGAGACAATTTGAAAAATGTATTTCTATTAGCTTGTGTATATA
-TGAAACTAATAATAGTTGTTACCCAAGGAGAGGAGTAGGGTTGGAATGAGAGACAGGAAG
-GGGAGAGTTTCACTGTATACTTTTCTATAACTTTTATTTTTGTATGAAGTGAATGTATTA
-CTAGTTCAAAAAAGAGAAAATAAATATTCAGCTTCCTCTTTCCTCCTTTCCTTCCTCAGC
-ATTTGTTGGAGGTAGCTGTTGAGATTTGGGACTAAGCAACAAAGGCAGCTGAGTGAGGTG
-GTGGCTCAGTGTGCCTGGggattgaacaaacaggttcatatatcaaggataatgagagcc
-aggttgctcagcatcagagaagggaattacaagtatgaaaacaggaaaggctagaaagaa
-ccctgtggtgttagattggagttagaggaatcagtgtaaactcatagcttttgatatata
-tagttacataagcatgcatgcaagtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtg
-tgtgtgtgtgatgcatatgtgcatttcccagttctgtccaaaaagacagcaataatcaat
-acaccatgtagccacgaatacacctaacacctagatcttgggttttaaatactattctcc
-actgaaaggaactggggcttgggaaaatagtagatttgagggctggagcaggaaaagtgc
-cctgtgcctggtaccatggtacatgaaacatctagctgtgccatatgataggcaagtgct
-caagtaatgctgaggacatgtcaaaagaccaaggtgccaacttaaagggactcccaatgg
-ccaaatctgggacaacttgagtatcaaaataatgacagtaacagattataagccatgaaa
-tataaatagtcctgatatacagacacatacacgtattacatacacacatacatacataca
-cacatgtgcagaaagagaaagctctttcttacactagaatgcccaataataggtgtggaa
-ggaaggatgcaactagtatggtaataattgattcaaacaagaagcattactagatgctaa
-aactaaagccattgtgtgaaaatttgttgaggagtaggatatttacatagtcttaaagag
-tctttccacaagatacaatacctgcaaaaggaaggagagtgactttatagcgaagaaaca
-tggcagagactatcttagtcgagtgatcaaaggctgcatcactgttactggacaaactga
-catgaggctcctgatgggatgcacagggaagagtgaaaaatcacttctgtgatgttcctg
-ccagagatgcaaaactgaaatctaatcacgaggagccgtcacataaacccaatttgagga
-accttctacaaaacaactggcctgtaacctgggtaagtatcaaggtaatgaaaggcaaag
-aaaaactgagggaccgtcacagattagaggagactaaagagataagacaatgaaatacaa
-tgagtaattctggatggatctttttgtttattataaaggacattattattgagacaatgg
-acaatatttgactgggctctgaagattggatggtagtaatatatcaatgtcaatttcctg
-attttgatgattttattgtggttatgtaggagaatatacttgcttttaggaaatgtacac
-taaagtattccaggataacagggaatcaaattgacaatttactctcaaacaattcaaaga
-aaatctctctatatataaatctctaagagagaatgataaagcaaatatgtttaaatgtca
-atatttggggattctgggtaaacaatatatgagaattctttgtacaatgtttgcaactct
-tctgtaggtttaacattattttacaataaaGTTATTTACATGAAACTGaaaccatatgat
-gtcaagtaatgataagtgatatatagaaaaatcaagtgggcagaggaacagaaaatgagg
-gggtggtgctattctagatggtatggtccaggcaggcctctctaggggaggacctttgag
-cagagacctagtgggagggagggagtagctccatggatacttggggagagtctcaaaggc
-cgagggacccatctgagaaaaggcccagagtgggaccagcttggcctgtgtattagtgtc
-tattgctatgtaacaaatcatcaccaacttagtggcttcaaacaacagccatttagctca
-cagttctgtaagtcatcgtctggcacagagcaactgagttctttgctcaggatattacaa
-ggtagaaaccaaggtgtaggttgggcttagttcttatgtgaaggctctggggaaaaaatc
-cacttccaatttcattcttttcttttcttttttttctttttctttttttttttGTGCAGT
-TGCagagaggaaaggaggaaatttttcgatagaaaaatcttggagatcctgttgctgtca
-cccatcgggctgttggaagctggggttagtccagaagtcttcaggtaatgccagggtgtt
-gccctggccaggaactctcagttgcctctgaacttcttccagccccacatgatggctaag
-ctctccatgaaaggagaccagttggaaacaaagccaacattcccagcaccctgagggcac
-tgaaggattggctaagttctccccggcaagcctgttccctgagaaaatggaggacagagt
-ccttaaaatgaaagagctggggtctgtgcctatactcactctttcaatgaatctacgtcg
-gatcccaggcaggcccccacaatgaagtggtgttgttcaactgaggtaatacccaaggtt
-cgttgtctcatggccacagaaaactaggactcggacacaccagagtgaggttaagagcag
-aagtttaataggcaaaagaaagagaaaagctctctctgttgcagagagaggggtcctggc
-gaaaatgggttgcccccaagttcattcttgttgttcgcaatgttcagcgtcttgcggttg
-tgggactgaccgtaacagacgatttttttgttggctagaagccacctgcattccttgatg
-tgtggcccctccatcttcaagtgagcaatggtgttttgaatcctccttatgcttcatgtc
-tttgacttcctcttctgtgaccaaccgggaaaaactcactgctttaaaagggctcttagg
-attagatcaggtactgtgttagttcacttttgcattgctataaagaaatacctgaggctg
-ggtgatttataaagaaaagtggtttaattggctcatggctctgcaggctgtaccagcata
-gctctagcatctgcttctggtgaggcctcgggaagcttctaatcatggtagaaggtgaag
-ggagagcaagtggtgtcacatggtgagagccagagcaagagagagaaggggagggtgcca
-gattcttttattttttatttttgttttttgagacagagtcttgctctgttgcccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctccacctctcgggttcaagtgactcc
-catgcctcagcctcctgagcagctgggactacaggtgcacgccaccatgcccagctaatt
-tttttgcatttttgttagagatggagttttgccatgttgctcaggctggtctcgaactcc
-tgaactcaggcaatctgcccaccttggcctcccaaagtgctgggaattcaggcatgagac
-atggcgcctggccccagactcttttgaacaagcagatctgtgaactaaccgggtgagaac
-tcacttattaccaaggggatggtggtaaaccattcatgaggaatccgccccggtgatcca
-atacctcccgccaggcccacctccgacactgggaatcacatttcaacgtgagatttcaga
-agacacacatccaaaccgtatcaagcatacccagagattttccgtatcttaaggccattt
-atgccaaataacataagctgatcacaagagtaaacgccaccatattcacagcgcagggta
-ttttacaggacatgtacacaggatggggaggactgggctgaaatcctggaggccatctta
-gaatctgcctatcataGTtgccggggttgagaaacaagaaagccagtgtggctggagcac
-agtgaacaagggggtgcagggaggagagacagcagagTATCACAGGTGGAGAGACACATA
-TATACCACCTAGCCTGATGGGAGGCTGAAGGCCTGAAAGTCACCTTGTGCAATTTTGGTT
-CCTGAGGAAGGGGAGGGTCATGCGAGTTCCTCCATGGATTCACTTGCACTAAAAAGCACC
-CCTGGGGTGGGACCCAGTCGATGATGGAAGTCAATGGAATGCGTGTTGAAGAGTAGCCCT
-TGGAGAACCAGTGGGCTGCTGGGCATAGGTGATAAGTTCTGCTCTGTGCATTTGGCCCAG
-TAGGCACAATGCCAAGAAGCCATGGGCTCGTCAAGGATCCATGGAGAAGTCTGAAATCTA
-AAAAAGCTGGCTGGAAAAATATTTTAAAACTTTCCAAACTTGAAAGACTTAGTGAAGTGC
-CTACCAAGTAGCATTGTGTCAATGGGTCATGAGCAACGCCCAAGTCTCCTAATAGTTACA
-TATGCGTTCTATGTGATGTGACTGCATTTTGTTTCCATTTTAACATTATTGTATTTATTT
-TTTCGTAGTATCATGTGCAATGTACAAATAAAAAGGAACAAAAGGAGATGCCCTGAAAAG
-CAAGTCTCTCTCCCACCTCTGACCCCCAGCCACGCACCCTCTCCCCACTGAGGCGTttcc
-tgtactcaaaggtattttgtgcacatgctaatgaacatgtatatatacacctgactcctc
-cccttttcacaatggtggctgttctgcctgctttttttcttttttcttggcagtacatct
-tggagatgtttcctattggctcatgtggagctgcccattcttttgtacagcagcagagca
-gtctgttatttggatgaactgtcatttattaactagACATGCCCACAACCCTGCCACCTC
-TTTTCCTAACACACTGGGCAGTCTTGGCCTCTCCCAGGCTCCCTGGGAGGGTCACTACTT
-TCACAAAGATGATGCCCACTTCTGCCcatggaatctggcttgcccagtgactacctgaca
-gggttgagtgacaccacccagaagtgcaaagAAGGCAGTAAAGAAGAAAGAAGAATTTAT
-TAGGTGCCCGAGGAAGGGCTcaatcctgccagtctaaacattgttgtacatacctcctga
-tatgtttttctagaatgtctccaggaagggattgctgggaataagtgcaaaataatgccc
-aattgttctccagagtggttgtacaactgactcccttatcaccagtgtcaaggagtcctt
-gttccacataattgatcacatttggacttgtctagctttttaagttttgccaattgagta
-gacaggaaatgagcttttaatttggatttctctaattactcagaggttgagcatcttttc
-aaatgtttgttggctattcatgttttcgcttctctatgtctgtccaaatctttagtccat
-ttttctttttgattgtttgtccttgtcttattgaattgtaggggttctttatatatttgg
-gtgctaatctttgtcagttaaattgttacggacatcttctagcttgtgacttgtctttcc
-acttttaaaaaatggtgaactttgatgaacggtatcggttgtaatgtaactaatttatta
-atatatgcctttatggtttgtcctttctgtttcttgcttcaggaatcctttccaacccaa
-agccatCCCCATGtttctatgatgcacatgtatatatattatttatttatttattttttg
-agatggagtctcgttttgtcccccaggctggagtgcagtggcgcaatctcggctcactgc
-aagctccgcctcctgggttcacgccattctcctgcctcagcctccggagtagctgggact
-acaggcgcccgctaccatgcccggctattttttttgtattttttagtagagacagggttt
-caccatgttagccaggatggtctcgatctcctgacctcatgatctgcccacctcggcctc
-ccaaagttctgggattacaggcgtgagccaccacgcctggcacatgtatatatatatttt
-aaaaagatcatatgtgcatcctgttttgtagctacttttccacttacctaacatgaagga
-acattttttccatgtttaaatagtctacaacatctttggtaaatggttgcatagttttcc
-attgtatggaatatacagtctttatttactgaatcccctgtgatgaacatttaagttgct
-ttcagctttcatatgatcaataatgctgccaagaatatcctgaagctgttggggtccaca
-ttcatgatcatttctcttagataaagtcatagaaatgaaattgcccatagaatttaaggc
-ttcggatacatttgaccaaatttgccagaGGATCCACTTTTGATTCCTTTCCAAGAAGCA
-ATATGCCATTGTGTTCAATTGCCCTTCCCAAGAGTCTGGAATCAGCAAAGTAGGGGTCCT
-GGAGATGATGTTTTGAACTGGAGCTGTTAGCAGGCATGTTCTGTTGTGTGCAGAAATAGT
-TACTGTAGCAGTTAAAGATTTTCCCTGTCCTCTTCCTTCCTACCCTCTCCTGACTCCTGA
-CAGGTAAGATGCCATTATTAGTACTATTAAGAGAAAAGAGCCAAGAAATTAGGCCTGCTT
-TGGTAATGATTCTTGGCTAATTAATTGCATTTCCAATGGCCATAAGCTCCTGCTTCAACC
-AGCACCTCTATGTGTTGAAGGCAAGAAAAGGGGTCCACTACAGCTGCTACCTCCTGGGCT
-GGGCACATAACATTCTCATAAAAATGTTTGTCCAGTCAATGAAGGATTTCGGtttttttt
-aagagacagggtctcattctgttgcccaggctggagtgcagtgtcacgatcacggctcac
-gcagtcttgacctcctgggctcaaatgatcctcccacctcagcctcaaatgatcctccca
-cctcagcctcccgagtagctcggaccacgggcacatgccaccatgcctggctgatttttg
-tattttttgtagagatggggtttcgccatgttgatgaggctggtctcgaactcctggctc
-aagcaatccacgtgcctcggctttccaaaaagattacaggcatgagctaccgtgctcCCG
-GTCAGGAATCTTTTAAAAGTCTCCTGGGTTGTCTTGGATGAGAAAAATAAAAAGAAGTCT
-CCCAGAGAACTTGAAAGCCTTAGATCAGGATTCCCTTCCTTCAGAGGGGTAAGAGGTGGG
-TGCCAAGCATTTAATTCTTAAGCATTTATTTTAGCAAATATCAACATGTATAGTAATTGA
-TACTtttatagtaattgatattaattttcatgtatggcagcacaaagtttcccattagcg
-tgaactggctttttgtttttttaaatgaggctatttaaagaaaaatattaagtaaattgg
-tggaagatagcctgcagatgggggtggggaggaggtggtgtgattccgcccaaacttcga
-gaaacactgCTTCGGTGGAAACCGCTCCGTGAGGAAGGCCTTAAGCCAGGGCTGGGTTGG
-GTCAGGAGAAAGCAGGGCCTTGGGATTCCAGGCGGAGGGCACTGGGAGGCTCTGGAGGGT
-GCAGTGAGGCTGCCACAGTCAAAGGCCGGGCGGCTGGGAGGGGCTTTCGGAGCTCTTCCT
-GGTATTTAAATCATATTTAGGGATTATAAAGTGTGATCCTTCTCATTGTGtcatttgaca
-ctcacagcaactttgtggagtttcaggcaataaggagattgccttgtcagtttacagaag
-gaaacggaggcagagagagacgcagcaatttgcccagggtctcaggtgagtaaaaggcCT
-CAGTGGTGGGTGTGGGCAGCATGGCTGGAAGAAGCGGAATTTGGTGTGGAATTTGTGGAG
-ATGTGTCAGGAGTTGCACCTCTGGGACTAGGGCACTCACAGCCCTCTCCTAATAACaata
-acaaccaccattagcatttatggagtgctcgctgcgggctggctctgtgctgagcaactc
-tggctgtctcactgcacactttacactaacgcaatgggaggggaggtgtcattatccccC
-AGAAAGTGTCAAGGGCAGGAGTTATTGATTCATGgtgtctgctcttgtagaaatttgaat
-tccagtaagggagaggggagccagaaaataaccacgggaagacatcaatgaatgagataa
-tttcacataacgataaatgccagggagaaaaaacccacagggcaatgtgatatggcctct
-ggaggtggagaaggaactgctccagatgaggccatccgtgaaggcttctctgaggaggtg
-acattagagcCAGAGCCAGTAACGTCTGGACTTGAACCTGGGCTTGCGGCATGGGAGAGT
-CCTGCATCTGACTCCAAACTTCCCCTCCTCTGTCTCCTGTGGATCACAGAATGCTTTTGC
-CAGAGACTCAATCCCTTGTTAAGAATCATGGAGTTggccgggcacggtggttcatgcctg
-taatcctagcactttgggaggctgcggcgggtggatcacttgaggtcaggagttcaaaac
-cagcctggccaacatggtgaaaccccgtctctactaaaaatacaaaaaattagcagggca
-tgatggtgcgagcctgtaatcccagctgctcaggaggctgaggcaggagaattgcttgaa
-cctgggaggtggaggttgcagtgagccgagatcccaccactgcactccagcctgggtgac
-agagctagactctgtctcaaaaaaaaaaaaaaaaaaaaaaaaTCATGGAGTCCTGGCTTA
-GGGAACGGAGTGTCCAGGAACTAGGGATGAAAGGATGGTAAGATATCCAAGCTGGAGAGA
-CCTCACCTGTGGTGCTGCCTTGTCCAACTCCAGGAGCTTCATGCACTTGCCGACAGTGGA
-GTTATGCCACGTTAGGGGTCACTCTAGATGATTCCCCTGGCCAAAGGGAAACCAAGTCCC
-AGAGACGAGATGGGTCCTGCCAAAGGCTGTAGCTTACAGCTGTGCAAGTTGTGCTGGGCT
-CCAGGGAGCCCAACTGGAGGCTAAGGGGATgccttgcatcccaccagggggctgcaccag
-gaagaaagggtacctgtttctaattcacacaaaggaatgctatgggctaggggtggccct
-gAGCCTCGTGGAGGATGGGGGCAGAGGTGAGATCCCCACATCGTTGTGCCATCCTTTTTC
-CCACCTCTCCTGCTTCCTGCTTTGTTCCTGCCAGTCCCTGGAGGGCAGGCGGGTGAGCAT
-CTTCACCATTGAGGGATGCCCCCTCCTTAATTGTGGCAAGGGGGGCCCTTTGCAGCCCAG
-TGCAGGCCTTATGGGACAGTGAAGAGGAAAAGAAGCAAGCTGGCCAGGATTCCCTGGGGT
-TTTTGTGGAGCTGACAGGCTGAGGAGTGGTTGGTTCCGGGGGCGGGGGTGGCCCAGAAGT
-GCCTTATCTCCTCTGGGCCAGTGTCAGCTCCTGTCCCCAGCCTGCAGCACAGGCTGGAGC
-TGCCAGCCTGGGGACTGCAGCAAATTTGCATTTATATTGGAGACTTCTGTTTCCAGGGCT
-TGGGGGGAGGAGGGGTGGCCACCACCATCAGCTGAGCAGAGATGCAGGAGAGGAGGGGCC
-TGCAGCCCTGTCCTGCCAGGGGCACAGGAAGTGGCCGATGGGCCCAGTCTGCCTGGCTGA
-GGGAACAGTGGCACAGAAGGTTCTCTGGGCACGCGGCCGGCCCCGACAGCCTGCCTGTCC
-ACCCTCCCAGACGCTCGCCAACATCAGCTGGGAGTTGGCTCTGCCCCCAGGCCTGGGAGA
-AAGGTCAGAGGCCGGTGCCAGCAAGGGACTAAGCAAGGCCAAAGCACTCCTGTGACAGGG
-TGCAACTGCGTGTCACCCGGTCTCAGCCCCACAAAATTGTAAATTGttttagccaagaaa
-acggaggctcagaggggcttagccattagctcaaggtgatccagctTATCATCCATGCCC
-CATGAGCCTCCCAGGAACACCCGGGATACTCACACACCCTGGATGCCATCTATACTTAGG
-GGACAAAGAGGAGTTGACACCCCTTTTCCAGCTAAGTTCTGGAGGGTCAAGGGAAGTTAT
-TGCAGGCTCGTGACACTGTTAGGGCTGGTTTTGTGACAGCTTAGGAATCATGTTTCTTTC
-TCtcttttctttcttttttttttttttttttagagacagtctcactcagctgcccaggct
-gaagtgtagtgcagtcatggctcactgcagcctcagcctcccgggcttaagagatcctcc
-cacctcagcctcctgagtagctgggaccacaggagcatgccaccatgcctggctaatttt
-ttaattttttattattagtagagactgggtctcgctctattgcccaggctggactggaac
-tcctggcctcaagggatcctctcgtcttggcctcccaaagtgctggTGTAAGTCATGGCT
-CCTGGCCTCATGTTTCGTTTTATGGTGAAATCCATAAAATGGGTTTTTTTAGGGCCAGGT
-TCAGGCCAGGTTTCCCCTTGTCTTTGGAGAATGTAGCTTCTCCCATCTGTGAGGTTCCAT
-GTGaagaaggaatggaaggaaggagagaagacaagaagggaaggaggggggacaggagga
-gggagaaatagggagtgaagTATAGAATAAATAAATAGAAGAGGGGggccgggcatggtg
-gctcatgcctgtaatcccagcacttcgggaggccaaggtgggcggttcacctgaggtcgg
-gaccagcccgaccaacatggagaaaccctgtctctactaaaagtacaaaattagccaggt
-gtggtggtgcatgcctgtaatcccagttactctggaggctgaggcaggagaatcgcttga
-actcgggaggcggaggttgctctccagcctgggcaacaagaatgaaactctgtctcaatc
-aatcaatcaatcaatcaGTAGAAGAGGGGATAgaaggaaggagtggaaggagggaaggaa
-gggagAGGGAGTAGATGAGAAGAGAAGATAGAGTCATCCTGCACCCCGCCCCCCAGGTGT
-GCTTGTTGCTGCTGGAAGTGCCCCCTCTGTGCCCTTTCCCTGGCTGTTGTATGGAATGGT
-GGTCCTCTCCCCATCCTCCTCACCCTACAGCTGAGACCTCCTGACCTCCAGTAGCAGGTG
-AGCCCTGCTCCAGGTGGGGGACCAGTGACAAGCTGGTTGGGGCTCCAGGAAGCAGAAGTT
-GGGGCCCTGTTGTGATCCCTGGGCTTTATTTCCATCCTCAGGGCTCAGCTGCCTCTGGAG
-GGGGCTCTGCCTTGCTCTTTGGGTTCTCTCCACACACTCCCTCCCCCACTCTTCCAGACG
-GAGGTCTTGGCCCCATTCCCCCAGCCTGTGGCTGTAGGCTTGCAGCTGACAAACCTCCTG
-GTCCTGGCTCTCCGTCCAGCAGAACAAGCCCTCCCTGTCTGTCACCAAACAGTCAGGACG
-GCCTGTTCCACCTGGCAGGCTGGACTATTGCCcagcttagtcttgggaagtgaggaccag
-ggctgacaacccactgcctgagttcaaatctttgctgtgcctctttctggctgtgtggcc
-ttgggcaagacccgttacctctctgagcttctggcttctcatccgtcaatgggcataatg
-ttaggatctgcctcttggattactgtatgaatgatacgagatcgttcatggaaagtgctt
-ggcttggtgcctggcacCAAGACATTTCAGCTTATATTATCCTAGCTGTATCCTTCAGTG
-TCTGTCTGGCCTAGGTGGGATGTCAGGTTCCAGGGACCTGTCCCCATGCTTCCTCCATTA
-ACCCCTTTATGACTAGTGTCACCTGATATGACTATTTCAACACACATAGGATTGAACCCT
-GGTACTATTATACCATTACTACTTCTCCTAGTTGTTGTATAAGTGCTTATGGGATCAGGC
-ACTGTTCAAGCCAttttaaaatatgactccacattcctttaaattcctctaatcaagaag
-tggggcctatgtcccctctcttgattgctcccaggaataaaatatggttagaaatgacca
-tgctggctgcgtgcggtggctcacgcctgtaatcccagcactttgggaggctgaggtggg
-cggaccacccgagggcaggagtttgagaccagcctggccaaccaacatggtgaaacccca
-tctctactaaaaatacaaaaaaattagccgggcgtggtagctgtaatcccagctactcgg
-gaggctgaggcgggagaatcacttgaacccgggaggcagaggttgcagtcagcctagatc
-gtgccactgcactctagcctgggcaacagagtaagactccttctcaaaataaataaataa
-ataaataaTAAAAAAAAtgaccatgccacttctgcttgagtctctggggacactcactct
-tggaactgttggaacccagcctgcatgctaggaggaagcccaggacccacggagaggcca
-ggtgtggatgttctggcctgcagtctccactgtgccactcctaactgccacacatgtgag
-gggaagacaattctagatgattctagtcccctgccttcaactcttttcagctgaggcccc
-agatactgtagaacagaaggaagccacccccatgtgctctgtctgaatctgtgagcataa
-gaaaatggttaacagtactacacgttggggttgttatgccacagtaaatcaccagaaTCC
-Ctgtgctgactcatttaagcttcacaacttaggaagtagctgttcttatcatctccattt
-catagatgaggaaattaagacccaaaatgctttagcaagctacctgagtccacagatctt
-ctaagaggaagagctgggattcgtgcccaTGGGTTTGAGCATTGAAGAATCAAGCAGGGC
-CCATGTCCTACAGGGCCTAGTGGGCCACATAGGTGACTGGATGTCATCTTGAGGGCCTTG
-GAGGGCTGTGGGAAGACACTGATGTGTGGAATTCACGAGGTCGGGAGAGGGCACTAAGAA
-GCTTGCTTAGGTGCAACGTGGAGGGTGGGTGAGAAGGGGCTGGAAGTGGCCCACGAGGAT
-GGACAGTGCCACCCTGCCATGGTCCACCATCCTCTCCATGTCCTGCTCCTCAAAGTTACG
-AGGGCAGCAGCAGGAGGCCTGGTCTCAGGCCCTAATGAGCTCTGCACCTATCAGAGCTTG
-GCCTAGCCGGAGATCCCAGCCAATTCCTTTGGGCTGACTTAGGCTGTGCCCTTGGACGGA
-CAGAGCTGGGCAGTCAGGGCTGGGAGCCTGACAGTGTGAACAGGAAGTTGACGGCCCAGG
-AGCATCCTCTGTTCCCTGCACATCAAGGTGGGCCACATAGCTCCAAGATCATCTGTGCCA
-ACtggatctactgggtttggagttggctgagagtggaagggagcccacaagaagagtgac
-ctaaagaggacagacactgatttctttttcttattaccaatctggaagcaggcagtcccg
-ggctggtataatggctctttgatcctcagggacccagactccttctatcttgttgttcca
-ccctcaacacttcatagtccaaggtggccgctcattctctggccatcatgtccacattcc
-agccagagggaaagaggaagaggcaaagaatgctctggtctctttaaggacccctcaccc
-ccaccgctcagaagttgtactcggtactccgtttacctcttcatggcaggaatgcagaca
-catggccacccctaactgcaagagaggctgggaagcgtggtctctgttctgccatccatt
-cacccagctaTATCGGTGGGGAGGGGGTTCTCATACTGCGGGACATGGCAAATCGCTTGG
-AATGCCAGCCACACCTGGCACCTGGAagccagagtgagtgttttgaaacttgaatcattt
-aacttcgttgcttaaaatgatcctgtagcactcactgctcccatgataaaggccaaatcc
-tcatctgacccccagggctgcctgatctcaccgtggctcacctctccagcctcatgccct
-ggttcccccagccccatcctccccaactcaccctaacATTGAAATTAAACCATGCCCACT
-CCATCCTCACCTTGGGTCTCCCTTTGTGCTCTGATATTTGGGTTCTCTTCATGCCACAGC
-TCCACCCAATGTGTGCTCTGCTTCCTTAGCTGTAAAAGGAGCTCCCCATAGTACCCACTG
-GGCACATAATAGGGTCACTTGCTTGGGTACAACGTGGCGGGTGGGTGAGAAGGGGATGGA
-AGTGGTCCACAAATAATGATTTGGGAGAACACAAATAATCAGACATAAAGAGCCACAGAG
-GCACTTACTGACTCTAAGGACTGTGGTTATAAAGCCCCTGCAATGTGCCAGGTTGGTACT
-ATGGGGAGCTCCTTTTATAGATAAGGAAACAGTGCATGCTGGGCGGAGCTGTGGTGTGAG
-GTCCTGCTGCACTGCCTTGCTGATGAGAAAAAACACTTATGGGCAGAGCGCTTTACACTG
-AGCAACTCTGTGCCTGCCTTTGTCTCAGGCAGTCCTCTAGCCATTGTGCCCCCCCCtttt
-tttttctgagatggagttttgctcttattgcccaggctggagtgcaatcgtgcaatcttg
-gctcaccgcactctccacctcccaggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgcaccatgacacctggctaattttgggtttttattagagacgg
-agtttctccatgttggtcaggctggtctcgaactcctgacctcaggtgatccacccactt
-cggcttcccaaagtgctgggattacaggtatgagccaccacacctggccCactgtgcccc
-ttttgcacatgaggaaatgggagagggactgtgattctgtaaggtcatatagccaggtag
-tagccatgccttgactggaacccagctctgcctgccccttccctgctggcagttgcatca
-cctgccttctctgGGGAGTGAATGAGGACAAGCCAcacttgaccttccatggtcctgtag
-cagagattttaaagtccagcttttagagaggaacgtgaaagcccagagaggaaggaactt
-gcccttggtcctatactccatcaagcacaatgctgggaagggactcaggtctcctgactc
-ccagtccagagctcttgcacactttgctccttcatgcaacaaatatttattgagcatcta
-ctgtgtaccagcacagtgctagcccttgagaacacagcagcaaacacaacagacacaaaa
-ccctggccctgtggagtggacattccagggctgggtggaggagTGGGAGACCAATACGGA
-CCAAGTAAGTCAGCTGCAGCACTGTCTTTCCTCTTATTTATTTCCGGAAACAAATAATTA
-TGGAGAACTTTATTGCTataagacagacatggtcctgactctcctacagtgagaatatag
-tgttggagacaggcactcaatgagagacacataaataagcaaagttcagattgtgatcat
-agctgagaagaaaacaaggttgaagtgctagagagtaatggggatgcggtactggtagtt
-aacttcagatggggtggccaggaaaagcctctccaggaagtgactcttgagctgagaccc
-aaagcatgcaatggggcccaacagtgttccaggtggagggaacagcaagtgccagggtgc
-agaagtaggacagagcttggtgggagaaaggaacagagagaaggccaaggtggctggagc
-agggcgagagggggaggttggcaagagggagggggctggagaAAGTCCAGAGTGTCGTGG
-ATAGACACTGAATAAAGAGAAGGGATGACTAGCCCCCTACAGTTCACCCCTGGGTGGGGG
-TTGGGTAGTCGTCTTTGCATCTGATAATTTCCCAGCTAGACCCCCAAGGGGTGGGGGCCA
-AACACCTGCTGGCCTGGCACTGCCTGTCTCTGCAGAGATAAAGTTCCCTGCCCCCCGTTC
-ACCAGGACCCCGCTCTGTGGTGCCTCCACCTGCACAGTCAGGCAGGGCATTGTGTGTTCC
-GGCCGGCACACCTGGCATTCACCAGCCTGCTGGTTGCCTGATTTAGGGGCTCATCCTGCC
-TGGCTCAGGGGTCTGTTCCCTGGAGTCTACCAGCTGGGACTAGGCTGGCTGAGGAGGAAG
-ACACAGGCGCTGGTGGTGGCCACAAAGAAGGCACCCTTTACCGTTGCACGCCCATTGGAC
-CATGTTTGAAACCCCAGGCCTCCCTTTTCCAGCCATCCTTCCCTGGGTGGCAGAGTCTGG
-GCTTGGGCAGAAAGGTTCAAGGGGCAGTTTCACTgctgtgcttagaaattttctctccct
-ctctgggcctgtttcctcatctgtgcaacggaagggttgacctggataaactcATGGTGT
-Agactctagagccagactgcctgggtttgaacctttaccacgtagtgaccatatgaattt
-agctaagttactcaacctttcgttctcagtttacctacatgtaaaatggaggtacaataa
-taacacctatttcaagggctgcgggaggattaagtgaattatatatgtctggtgcttcaa
-acagtgcctgctctatggtaagtgctatatattttaactctgatcattattATTAACGTC
-TTTGGAAAACATTGCACTGGAAAGACTCAGTGGAGAAATCTGAGTTCATTTGTTTGCAAA
-CTTTTTGGTCTTTGTTTTTAACAGAGAAGCTCTGCATTGGTCAGGAGAAATTTTACTCAG
-AGCCCCAGCTGTTAGCAGGGGATTGAAGGGGGGCGCCTGCCCCACCTGCTTCCCCGTCTC
-TGTGTCTGCAGCCCCCAAGAGGCCTActggagcataacttgaaaatccctgctcagttta
-tctccttcagctcacagtcagggaaactgagactcagagaggagcagggatctgcccagt
-gagtggcccagcctagactagaacccagatctcctATTTTTCTCAATACAAGACAAGGGG
-CAGGGGCTAAGAGAGAAGCTAAGACCAGAAGCCTCTTAGGGGACTGGGTGCATTGTGTCG
-TCAAGTCATTAGCATGCAAATGATATGCAAATGAATGCAAAACAGCATGTTTTATGCTAA
-TTTGCAGAGTCGAGAGCGACGACATTTTTGGTAATAGGGCGGCAGTCCTGGTCCCTGGGC
-ATTGCCGAACACGCGTCCTTTTTTTCTTTTCTTCTTTCATTATTATGATCGGGCCCATAA
-ATCTTGGTTTGGCTGTGACTCCGCCCCTTCTTGCTTGAAAGCCTGGCTCCTATCATTCTC
-AAGGGCTCCCTTGCCAGTCCTCTGGTCCGGCCTGGGCCCAGGGACAGGCCTGAGCAGTGG
-GTCAGAGAACCAGGACTCAGGAGCCACCAGTCAGAGCTAGAGGGTGACCCCAGCTCTGGC
-CTGGAAGCCACTTCTGAAGGAGGGGACCGTGGCACTTCCTCTGAGCTCCCACAGCCACTG
-TGGCTTCTGTGCCATTGTCTGTTTGGGGCTGGCTTGCTCCTTTTCTTGTCAGGGCGCCCA
-GTACCTGGAACACAGGTTCAGGATGTGTTTGGTGTTTGAAGACTGAATCCATATATGGAG
-AGCTGGTGgtgtaccctagtgatgagcctgcagtctctgaaaacatgcagcttgagttaa
-aaccctggcaccactactttctGAGAAAATAGTAGTATGTACTCACAGCTAACCttttgt
-ttttgttttgttttgagacagggtctcattctgtggctcaggcatgagtgtagtggcatg
-attgcagctcactgcagcctcagccttctgggctcaatccatcctcccacctcagcctcc
-tgagtagctggcactacaggtgcacactgctaccatgcccagctaatttttttttttttt
-tttttttgtagagatggggtcttgccatgttgtccaggcaggtctcgaactcctgggctc
-aagccatccttctgcctcggcctaccaaagtgcagggattacaggtaagagccatcacac
-caggccCATAGCTAattgagcacctaccatgttccagggctctgctttgtaattgttgtg
-aacgctgtcactgataagagtatcctagaaggtgagtatcgttatcattgctctcatttt
-acagagagggttaaatgatttgcctgaggtcacacTCCCCAGGGTAATGGTAAAGGGGTA
-TTTATATTTACTAAGGATGAGTGCTTCATCAGGCAGGGGCCTTTAAGGCACTCAGCAAAG
-CTTCTGTCACAGGGTACCAGGGTCTCCACCTGTGCTATCAAGCCACTCTTTtgacaatgt
-taaactttacctgagccctgtgctcctgaaaaacagcgatggtccagaaatccccccaac
-tttttgttttctgaagtctccctaccttttctgttcagggaaatggcttagcaaaacgag
-ccacccttccccatatgactcagataagacgtagtcccctctttctagtgtatcctgtaa
-gactggaggatgactcccttgctggcctgtgatctttccccttttgctggaacctgctga
-caaggccaaggccaaggaccctcccacttcccattctttgtctcatggttgattagctga
-gatgagaactgtgtgtcctctctgaaactagctagacacagagatgaacatttcctcttc
-aatggactgatggagatatcccctatttgtaagacaatccccactttaaatccctcctgc
-tgtaacctgtctcctcacccctacaaaagtcaaaggcaaatccatcctgtccagacactc
-tgattttgggatctgggatgctctccctgttgcaatagcatgaataataccatcaacccc
-aattcttccgtgtattttgtctttGACCCTTTCCACCGTGCTGTTTTCCACCTAAggctc
-tgagctaggtaagagccctgtgaccttggagtacttctcgggcttctctgtaccttaggt
-ttaaaacggatgcgcacaggcgttatgtcctcaggttgtgagataaaaggagacgacgcc
-agggaaacgctcggtcgcttggcactgtgcccagcagcgtgagtgctccagaaatgtcaa
-ccattgtGAGTCCAGGAGAGGAGAGTGGCGCTCAGAGAGGGAACGGGACCTGCCGGGAGA
-CTCACAGCGGGAGGAAGGGGGAGTAGGGCGCACGTCTGGTGACCTCCGCCCCCAGCTGTG
-GGAGTGTGCCCTGTGACCCCCTCATCCTGCCTTTGGATCACGAGCTGGGGTCGGGGGAGG
-GGATGGTGGGGGGGACACTGCTCGGTCCTCCACTCCGTGTGCCCTGTGACCCCCTCATCC
-TGCCTTTGGATCACGAGCTGGGGTCGGGGGAGGGGATGGTGGGGGGGACACTGCTCGGTC
-CTCCGCTCCCCTCCGCCCGCCTTTGATTGTGGTGAGCAGCGAGTCGCGGAGCAAATTAAC
-TTTTCGCACACTTCATTATGCGCCGTCCCGCGTcccccggggccgaggcccgcgcccccg
-ccccgcgccgACAACTTGATTGGGCAATTAATCTTCGCGCCCCCCACACCCCCTCCCGGC
-CCCGGGCCTTTGTGCGCCCGAGCGTGGGCCGTgggcgccccccgggccgcccggTCTGCT
-GGCGCAGATAAGGCGCCCCTCGCCGCGCGGCCCCGCCTTTGTCAGGGCGCCCGCAGGCCC
-GGCCGCCGCGCTGCCGTCTCGCACCCCATCCGCGCGCCCCCGCCCCTTGGCTCGGTCCAT
-CTGTTTGAGCTTCACAATCCTCCAGCGGCCGGGGGCTGGGGGCGGGGTCTCGCTCTTGGG
-CAGGCAGCCAGCACCCCCTCCCCCCGGCCCCCCCACCCAGCCCCCAGACACGCGCGCGCA
-CGCCCACTCGCACGCGGGGCCGCCCTGTCAAGCAGTGCGGTATTAATTAAGAAGGTGGGG
-GGGAAGCACAGCAGCAGTTTGAAGAATTGTGGGGCGGAGGGTTCCCAGCGGTGTCCAGAA
-AAGAGGGGGACCCTGCCACCCATCTCGTACCGCAGGTGCTTAACGCCTGGTTATTGGCTT
-GGGGATCTACAGGCTCCCATGGCTGGGGGTGGGGGTTAGGGGAGGTGGGAGGTGGGAGGG
-AGAGGCCTGGGAATTTGCCTGACAGTGTCTCTTTGTGCATTTTTCTGGGGTTTTGCCAGC
-AGTTGACCCAGCCTCAGAAAGGTAGCCTGTGATTCAGGTAGTGTTGAAAACCAGAGGCCC
-AAAGGCAGGATAAATCTGGGCCTATTTTAGAGGCCAATAGCGTGGTGGTTCAGAAAGGGG
-TTCCAACAGTTCTCCCTACTCGCCGTTGAGGATTTGCGTCAGGTAACCACCCTGCGCCCG
-GGGCGGTGGAGGTGATGGGCTGAGACCGTGTTGGCGCAGTGCTGGGTACACGGTGAGTGC
-TCACAAGTGCTGGTTCTTGCTGTTTTCTGTGATTTTCCTTGGAGGGGCACAGGGAAAACC
-AAAAATGGCTGGTGCTGGAAAGAGGCCCTTGAGTTTCATCTCACAGCTGGCGGTAGGGTG
-AAGCTTGGCAAAAAACCTGTGGTCTGTGCTGAGCTTGGGGCTGGgtgtgtgtgtgtgtgt
-gtgtgtgtCTATGGTCTTTGAGAAGTGTCTTCATCAGCATATGACTTGTGTGAGTTTTTG
-GGTAGAGAAGGCACAGCCTTCACTAGTTTCTACAAGAAGGGTGTGATCCAGTGTGCGAAG
-AATCCCTGTGTGCAGGGCTGGGAAATCAGCTTCATCTCTTCCATCCAAGAACAGCATGGC
-TGGCACGCTTATTGTGTGCGGAGTCCACGGTAGCGTCCCTAGGTGCTAGGGACAACCGTG
-AGCAGAGCAGAGTTCTTGGCTGCCTTCACAGACTCGCAGTCTCCTTCGGAAGATGAATGA
-GAAATAAAATAAACATGTAAGACATGAGGTAGGTCACTAGGTGACATGAGCTTTAGATAA
-AAACAAAGCAGGGCACCTGATTAGGAGGGTGGGCCCTACTTGCCAGACCCCTACCCTCAT
-CCCCAATACAGTGTGTATCATTGCCTGGGCAGGAAAGGGCCACACTCCTGGGTCTAGGGA
-ACTAGGTCCCTAAGTAGCCTCATGTCCCCACCCACTAGGACCCAGCCTCCAGCCAGTTCT
-GTTGCATGGGGCAGGGTCCCTGGGAAGATGGGCAGGCCTCAGACTGCTGCAACCTCTGCC
-CCTAGCCCTGAGGTGGTGGCAGTAGTGTTTCCCTCTGATAATGACATACTCCAGTCTTGC
-ATGACCACGATGCCTCATGAGCCCACAGTCCAGAAGGGGCCTGGTGAGCAGGAGCTGAAT
-TAAAATGGAAAATACGGCCTCCCTTCCCCCCTTCCTGTTCCTCCCCACTTACTCCCTTCA
-TTCCTGCTGCTCCTGAAGCCATGGGTGAATAGTTTCTCAGTCTCTTTGCCTTGCTGAGCT
-GGGTTAGTTGGGTTAGCAGGATGGACATCTCCTTATGGATACTAGAGTTAGGAGACACCC
-AGAACCAGCAGGTGGGATTTTAGAAAGTGCTGTTTGGCTCTGACCAACCCCTACTCCCAC
-CCCATGCATAGCAGGGTTAGTTTCCTCATCAACTCTGGTCTCTGATTCTGATGTTCTGCC
-CCTAAGCATCCTACATTCTAACATTGTATTCTTCTGACTTTTTAGAATTTTCCCATCCTA
-TGCATCTTACACGAATATGGTGAAGTTCTGATTTCCGCCCTTATGTTCTAGATTGAGTCT
-TCAGTATTAATTTTGTTGGGGTCTACCCATTCAAATAACAATAGAGAAAGACTATGTGCA
-GAGTCACATAATACTAGTCATGATAGTAGCAATTAACATCCTTTTGACCTTGGTTTTATT
-TAACAGTTTTTTTTTTTGAGAATTTTCTAAGCGCCAGACACCATTCTAGACATTATACaa
-ataaatagataaaaatgaataaataaataaatGTTATTTTAGAAGGTGCAATTGAAATTG
-AGAGTCAAGGCAGGACTCACTAAGAAAGTGACAATattttctttctgctttcagttatgg
-agatttgaaatctcagttgataaggtggatttatttctccttgcaggtcattcacttttt
-ccttcatgtattttgaatctctgctattgggggcataaatatttagaattgttatatgct
-catgattaactgaccttttttttttttttttagatggagagtcttgctctgtcgcccagg
-ctggagtgcagtggcgcaatctcgactcactgcaacctccgcctcctgggctcaagagat
-tctctggcctcagcctcctgagtagctgggattacgggtgtgcaccaccacgcccagtta
-atatttgtatttttagtagagatggggtttcaccatgttggtcaggctggtctcaaactc
-ctgaccttgtgatccacctgccttggcttcccaaagtgctgggattacaggcgtgagcca
-ccgcacccagccttgacctttttaatcattataaaatgaccttatctttcctggtaatat
-tctttgctctgaaacaaacattgtctgatatgaaactagctactcctccagtgttatttt
-gattactgttactttccatctttgtacttttaacttgtgtgtttacacttaaggtgtgcc
-gttttgaaggttgggtcttattttttttttttaaaaaaaacaatatttgggtcttatttt
-tttaaaaaaatccaatctaacaatctctgctttttaattgagggtatttagaccatttac
-atttgatgtgatcattgacgtggttagatttaagtctatcatcttgctatttgttttatt
-tttgtcccatctgttctttgcttcctttttcttctttttctgtcttcttttgtataagct
-cagttttttttactatttcattttaactcctccttttttattatatcgttttaccttctc
-tgttggtttattaactgtaatgttttgtttgttatcttagtagttacattaggccttata
-agcctgggtacggtggctcacacctgtaatcccagcactttgggaggctgaggtgggcgg
-atcacctgaggtcaggagtttgagaccagcttgccaatatagtgaacccctgtctctact
-aaaaatacaaaaattagccaggcatggtggtgcatgcttacagtcccagctactcgggag
-gctgaggcaggagaattgcttgaacctgggaggcagaggttgcagtgagctgagatagca
-ctactacactccagcctgggtgacagagcaagactcaaaaagaaaatcatgtaatagtat
-actttcatttccttcctggccttcttgctgttgttgtcatacatacatatgtgtgacaga
-ctccacaaaatgttattatttttgtttaaatgctaagttatctttttttaaattaaataa
-tcagaaaagattttatatatttaactcatgtagttaacacttctggtgacctccattccc
-ttatgtagatccagatttccatctggtatcattttccttctgcctgaaggatttccttta
-tcacttcttgcagtgcagatctgttggtgacaaatgcattcagcttttgtatgtctgaaa
-tcatctttatttcatcttcatttttaaaagatattttaactgggtatagaattctagatc
-ggcaggttttttctttcattagcttaaaagatgttgttgcttcactattttcttccttaa
-attgtgtccaacaagaaatctgccattatccttatctttgtttctctatactttacaagg
-cttttctttctctgactgtttttaatatttatctgtttgtcactggttttgagcaattcg
-ttcatggtgggtaatttccttcctgtttcttgtgcttgaggttcgttaagcttcttggat
-ctgtgagtttatagtttatatcagatatgaaatattctcagccattaattttctatttcc
-tctcctttggggacttcaaagacacatatattaggcttcttgaagttgttccatagctcc
-taatactcttggttttttggattctttctttttctctgagtcgtcgattttgggtagttt
-ctattgctacatcttaaaattctctaatcttttcttctgtcacatcagcatatttttcat
-ttcagacatgtagttatcatttctagaagttcagtttgggtcattttatatcttccaagt
-ctctccttaacctttgaacatgcagaccatgaaatacaatttgaatacttattttaatgc
-tcttatctcctacttctgtatcagttctgggtcagtttcaattgattgattattattctt
-gtatgggccatgttttcttgcttatttacgtgcatggtaaactttggatgccaggcattg
-tgaacattacccttgttgggtgctgtacacttttatatttctataaatctccttcagttt
-tgctctaagatgcaattaagttacttggaaacagttttatccttcctagtcttgctttta
-taatttgttgagtgggtccagagcagtgctatctgttgagggctaattatataccactgt
-tgagaaaagaccttcctgagcactctacccagtaccccagaaattatgagggttttttct
-gtttattaatatttctggttttgtgtgagtgctgagcactgttctctaatcttatcagat
-gattttcacccctacttcagtgtagttttatcatacaaaagcaccaaccagtactcagtc
-taatactcaagggggactttcttcatatctctggaatagtctctctgtgcaactctttcc
-tcccaatactgtgtcctgcaaactctgccctctttgtccttcctggactctcaactctat
-ttccttaactcaggaagcctcctgggtgctgcctgggttcctcctccctgcactaggttc
-tgaaaactctctccaagcggcaaactgaggccatgatagggttcatcttatttcccactt
-ctcagggatcatgatcctttattgcctgttgcctagagtcttaaaaattacagtttcatg
-tattttgcctggtttggtttgtttgtttgattgtttcaagcaggagagtaaattcagttt
-ctgatactccatcttgggtggaagcagaTAtgagaaggtgacatttgaacacaaacttga
-aggagttgatggagtgaaccaagaggatatgggagtggggagaggaaggagattctaggc
-agtgtgaacagcaagtacaatggtctcctgcgtgtatagctgagagtgcgggtagtgtgt
-ttgaggaaggaagggagcacgtatggctggagcagagagttatgtggggaaagtggggag
-agggagggatgaggtgtcagcttgtgtaggaccttgcaggccatggagaggattttggct
-tttacaccaaatgaaatgggagccatgggaggattttgagcagagggaggacatctttta
-caggatctctgaatcgattggattaactgaaagggataagagggcaagagagaaagccag
-agacttgctgggaaccagtgcactaagccaggtgaatgctagtgactcagacACATGAAA
-GGACACACTACCAagggggtgaataactaggagcggggatgaaggaggcttctggggtgc
-tgtcggtgtcttgtatcttgatctgagggaggttacatcatctgctcactgtgtgaagat
-tcattgagctggatgtacacgtctaaattgtgTTCACAATTGAATTGAATACATGAATAT
-ATTACTATATAAATATACTATATACATATAAAACTTAGAAAACAAAGTAgggagatgaag
-gtggcttggactagactgttatcagtggaggtgggaagaactgtatgcattctagatctc
-ttttatatgtagatccaataagatttgcaaacagatctaatgttagatgtgaagacagag
-aatagtccaggataatgtcaagttctctggctgagctacagcaaagactgaggacctgct
-gtgtaccagagcttgggctaagctctattaacttctttaatcttcatgacaattctagga
-agtaagtCTGGCAAGAGCTGCTTctgaggtttttgtggggctactgggagcctttccacc
-agaagtgtagtttgtgtgatggattccagaggtagtggtggccacctttgcctccatgag
-gttacaggctgcctgagagtgaggcctacaagaaagaaatcaaagccatgatagagagag
-agacaggatcctcacagtaacatgtcagcacctggattcagccataacagaagccagtgc
-cctgggcttctcagttatataaattaataattacttttttttttatttctttcacttcta
-actgaagagtccagactgatacaACTTCTTCATATGTGTCCCCTGTCTGCACCATCCAAT
-GGACCATCAACAGCAGCTACATCCTCTCCTTACCGTTGCTTGCTTGCtttttttgagaca
-aggtctctttctgttgatcagactggagtgcagtggcataatcacagctcactgcagcct
-tgacctcttgggctcaagcagtccttctgcctcagcctcctaagtagctgggtctatagg
-tgcttgccatcatgcccagctatttttttttttttcatagagacagggtctcactatgct
-gtctaggctggtcttgaactcctggactcaagaaatcttcctgccttggcctcccaaagt
-agtgggattacaggcgtgagccaccgtgtttggccGTCCTTACCATTTCTAATGCCTGCT
-CTGCACTTTCTCTCTCTGGACCTTTGCTCCTACAGGTCCTCCTTTCCAGAATGCCTTTCC
-TCCCTTACCTTCTGCCCTCACATCAAAACCAGCCCCCTACTCAAAGCCATCCTAACTCCA
-CCAGCTGAAGGATGGAGCTGGCAGAGTGCTTAGATATCAATCCATTTTACAGATGGGAAT
-ACCAAGGTCACTGTGAGACAGGGCAGATTTGTGGTCAGGACTCCCGCGTTCTGACTCTCT
-GAGACTCTTTCCATGATCCTCCAGGACAGCCTTTTCTGTGCCCTCCCTTGCGTGGGGTTG
-AACAGTACTTTTCACAACAATTTACActctcccataccccaacccttgcacgtgctgttt
-cctcagtctgggatgccctattccattctgtccttccggaaagggtgccacttgaacttg
-gagattcaactcaaggatcagacttccagaagccttctctttttcccagggtggctctgt
-gtcctgcctggtactcccACAGCTGCCTCTGGTACCTCCATGAACCCATTTATCCATTTG
-TTTTTTAGGTGTCTGTTTCTTGTTTGCCTCACCTGTTAGGTAGGGGAACTGAGGCAGACC
-TCCTGGCCAAAGAAGGCTCCCAACTGATGTTTGTGAATCAACATAGAGTGAGAAAGAGCC
-CCGTGGAGTGGGGCGGGGGgtggagagccagcgctgggcgtggaggcaggacgcctgggc
-tccagtccagccaccaccactctagtgtgtggcctcatgcaagtcatgtcctctccttga
-gcctcaggcttttttggcagtaaaaagggcagaacatcatagtagttaatacctcaggca
-gcctggatttgaatcttggctgtgtgactttaggcagtttactccagctctctgtgcctg
-tttcctcatttgcaaaatgggggcaataaacatatctgcatcatagggtatttgtgagca
-ttaaatgagttaatgtttacaaagctttcaaaccatgcttgcttggcacatcataTAAGC
-ATCCCAGAGTGAGAACCATTAAACAAAAGAAACCCTTCCCTTCCTGAGAGGAGAGGAGAG
-CTTGACAAACTCTAAAGTGGCGTGTGAGTGAACTATGGTCACTctcagggggtaagctgc
-ctggaaaaggctgactctgacactgactagtgtgtgtctttggagaaatcatgtcacctc
-tctgggactcagcttccccatctatcaaatggaggagttggtctagcgcagttggagtta
-aagtgctttgtctctttgagttttatgtccatgtcagtagagtgggctgagagctgcatg
-tctgtcatgcgctcctggtgagaatgaaatacgatgatgggccggacgcggtggctcatg
-cctgtaatcccagcactttgggaggctgaggcgggtggatcacttgaggtcaggagttcg
-tgaccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaattagccgg
-gtgtggtggcgggcgcctgtaatcccagctacttgggaggctgaggcaggagaatcgctt
-gaacccgggaggtggaggttgcagtggaaccaggattgagccactgcactccagcctggg
-caaaaaagtgagactctgtctcaaaacaaataaataaaataaaaaatataataataaata
-aataaatacaatgatgtctggagcacttgccagtcatgcctgccacatagcaagtaatcT
-GTCATAACTGTCACTGTTATTCTGGCCCTGACATTCCAGGGTTCCTTGAGGTGGGGCAGG
-ATGAGGGATGGGCTGGGCATCATGAAGGAAGGTGCTGATGTATCACCTACTGACAGTTTA
-GAAAAGGGAAGGCAGCCATGTGACCCACAGGCAGTGTCCCCCTGCCTGAGCCTTATTTGC
-AGGGCTGTGGCATCGGTGAGCAGGACAGGGACCACCACGCCCACTAGAGAAAGAAGCACG
-TGCTGCTTTTGTGAGTTCACAAAGGTCTTGGTTTTCCAGGGCCAACAGTGTCCCCGCCAC
-ACGTGACCACCTCAGAACCATCACCTGCCACCTGCCAGGGCCTGGGAGTTGGAATCTGAG
-Gtggaaggagagagcaggggccaactcctggctgctcccctctcttggtatgtgaccctg
-ggcaagcctctgcacctctgtcccctttgtcctctcttgtcacataatgaggttttgagt
-gtcttagatagggaggatgtcTCCCTATCTAAGGATAGGATAGGATagaaatggccaggc
-cctggtgcctctgctagctcagtctggctgggacgacctgggaagaacatggcctcagtt
-ccaaagccaaggcggctcctgggggagctgcagctggaggctgtcagcttgctgccctcc
-ttgctgctgaaggacaagctttttcttgaagataggatggataggatgtctcctatccat
-caGGAGATGCGATTATTGGCCTAGACTGGGCAGGGTCTCCACCTGGGCGACGGGTTGGGA
-GGCGGAAGTGAAGCTGGTGGCATGAACCATTCTCAGTGACCTTTCACCAGGGTGAGTGGG
-AAGTAGTTGGGAGCATCGAGGCCTCACTCTCCATCCTGAAGATGGAGCACAGACTGGCTG
-GCTGAGGCCGGGAGCTCATCACGGGATGGAGACAGATTGGCAGACAAAGAGGAGGCGGGC
-GGTTGGGGCTGGGTGCCCCTGGGGAGGAAGGCGGGGAGAGAGCGTAGGAGCAGGAGGAAA
-GAAGGCTGGGCTTATGTGCAGCCTCACAGACTGGGCCTGCAGAGTCTCCAGCTGGAGGTT
-GGGACTGGACCTTCCTCCTGAATGGGCAGGGAGGGAGGCTTGTTGGCCTAGCCCTCGGGG
-TTCTTGAAATAAATGAGGGAGGGCCTTGGGGGGTGGTAAATTGCTGAGGCTGTGATAAAC
-ATTCTCCCCTTCCCACAAAacacacacaggcacgtgtgcgtgcatacacatacacacaca
-cacCCTGGCCACACTGCTGTGCATATCTTACTGATTGTTGTCCTCTGTGAcagcagttct
-ccaagttgagtgcattggaaggatcagttaaaatgcagatttccaggcatttccatctct
-aaatgtagggtgtggcctgagaatgtgtatgtcttacaggatcctggttgatgctgatgc
-tgggggttctgggacacactttgagaaccactgCTCCATTGAGCAGCCtttcagtttggg
-tgcccctcggtgctggtgctgggagagagttaggagggcaagggggttagtgagggctgc
-tacctgtgaaacacaaagcaggagggaatggaattggccaggagagcctcagaccacagc
-ccgggcctgcagagtcaccctctaggggtctctggagtaaagattatccacagagaagcc
-ccacatggggcagaaatggccaggccctggtgcctctgctagctcagtctggctgggacg
-acctgggaagaacatggcctcagttccaaagccaaggcggctcctggaggagctgcagct
-ggaggctgtcaccttgctgccctccttgctgctgaaggacaagctttttcttgaagagag
-aCTGTGTCCCATCCACAACTGCCCCAGgcatctaccacatgccaggctctgtgcagagtg
-tttacctggatgaatgcagtttcagatcagagcaacctggccaagcaaatataatcgtcc
-ccatctaatagatggggaaaatgagggattaagtcatctgcccaGTGGTGGAGTCAAGAT
-TTATCCCCTCTTGTGCCTTAGcactcatccctgtcagcttccctgggtggtgaagaacat
-tagctccttttacacctgaggaatctgaggtgtggagaggtcagtgacttgcggtagagg
-tgggtagaggatccgggattccaaccctgctcatgccCCTCTTTTTAAATTTCAAGATGC
-TGTCCCTTGAGTACTTCTAGGGGGATGTAATGGCAGAAACTTGGGGCTGGAAGAAGCctc
-cctggcatttgacaggtgggtacactgaggcccagggaggcaaTCAGCCGTGCCTCAGTG
-CCTCTCTCTGCCCTGAAGGGGCTCCCTGTTGTGTGTGGGGTATAACCCCCCCGTAATTCA
-TGCATTCAGCACACACTGGTGGGCACCCATTGTGGGTCAGTCCCCCAAGCCAGAGTACTG
-TTGGTGAGTGGGAAGGCAGACGTGGGTGCAGAGGGTCTGTGCAGTGATTGGGGATGCACT
-GGGGATTGGAGGGGGCAGTTGACATGTGTGGGGTGCATGCAGGGAGGCTTCCTGGAGGAG
-ATAGTCTGAGAGAGGAGGAGGTGAGAAGGGTACTCAAGGATGAGAAAAGAACAGAAACAA
-AGGCTTGGAGGTGGGGGAAGTGATATTGCCTTTAGGAAATTGATAGAAAATCTGTAGCTG
-AGATAGTGTGGGGAAGGTATGGCCAGAAATGAGGTGGAAAGTGGAAGCTTGGCCTGGGGA
-AGTGGTGGAAAGCTCTGGACTTGAACCATGACCCTGGTTCTGTTCAAGGCAGGGCTACTC
-TCTGCAGGGCTCTGAATTCTCCAGATTTCCCTCTTACCTTTCCGAACTTCCTGCGGTGGC
-CAACCCCTAAAATAGCCCCCAGTAATCTTTGAGTCCTAAtaaccagtaggattttgtgga
-aatgacagagtgtgacttccaaggctggatcatagagtgtgttgcagcttctgccttggt
-ctctgggtttgatccccccggagaagccagctgccgggctgtgaagtcactcaagcagcc
-tgcagaaaggccacatggagagaaactgaggtcctgcctgcagccagcatggacttgcta
-gtcatatgactgagccaccttggaagtggatcctccagccccaggcaagccttcagatga
-cagcagcccagaatcacctagccaggcctgttctatattcctgacccagagaaactgaga
-cacactaaatgatcattgtgttgtacgtcactaagttttggggtcatttgccgtgcagca
-tcagataaTGAGGGCTTCTCTGTGCCCTTTCTTGGCTTCTTCTGTTGCTTCAGCTGCCAT
-CTGATGAAAGTCTGATGAAAACCAAAGGCCCTCCTCCAGAAAAGTTCAGGTACACCCAGA
-AAGAAATGGGGGTGCAATTTCAAAGGGATCACAGGCCATCTAAAACTAAACCTCAGACCT
-TCAGATCCCGGCCCCCAGTGGACATGGAACCTGAGTGAGGAATGAACAGTGTCTCAGTTG
-CTGAGCTGTGGGACATGGTGGCTGCTGCGGGGTCTTCAGCTTGGTCATGGCAGGGTGCCC
-ATGGCCTACATTCCTTTCTCCTCCTCTTCTCTGTGTCCTTGGCAGGCTGCCCCTGCAGAG
-GAGGACCGTGGGTGCCCAGACTGAGTAGGTAAGTTTAGCTCTAAGAGAACAGGTTGAGAG
-AGCCCATCGGTTGTGTACAGGCAACTTCTCAGCCAAGCTCTGCCAGTTGCTGGTGTTCAT
-ACTTGGCTGATGTCTCCACTTCAATACAGAGCCTGCAGGGGATGCAGGCTGTGAATGCAG
-TCCCTGGAACCAGACTGTGGGCTCagccatgagacctgggggatgtacttcaccttcctg
-acttgggcttttcaacttggaattggaggccagaagtccaccctgaagcgtggctgtggg
-gTGGAAACAGGCCCTCCAGCAGGGCAACAGCAGGGGCTCCTTGCCTGGCAGCCCCTCCGG
-TTCTTCAGCCCTTAGCCTCCCCTCTCTGGCTGTGGTCAGTGGCTGGCTCACCAGCCCCTC
-TTATGGCAGTCACTGCTCCAGAGTGCCAGGATTTCCCAGTATGGTGGCCAGGGCTGTCCG
-GAGCCCAGCACGCAGCTCAGGAAGCAGCTCAATGCAGGTGGGACGTCAGTGGGAGCAGAG
-GGCAGCCTCCCTCCCCAGACCCCTGAGGATGAGTCTGTCTCCCTCCTTGGTGCTAActtc
-tctctccttcttacatctccacttctttcttcttcctttatcttctctacctccttctct
-cttctaccttttcccttcttttccgctttttccttttttcatcttcattcttctcttttc
-tttcgtctttctcttcccctttcctcctctctttgtctagtccttcttccccctcacctc
-tccttttcctcctcttcCGTTTcataatgattaagagtatggcttctgatgtcagcctcc
-ctgggttcgaatccctgctgtgccacacactggctgcgtggcgttgggcaagccacttaa
-tttctctgtgctttggcttcctgagctgtacagtgggatgctaacagtgtctctcttgaa
-gggtGCCATGGGTGCCAGGTGAGCGTTAGCTGCTTATCATTCGTGTTCCTTCCTCCCCTC
-CTCTTCTTCTCCTCCTGGTCTTAGAAGTCTGTCTCCCTCCCTCTCTCCAAGCCCTGTGAC
-TCGCCTCTTACGTCTCTCTGCCCAGCATCTTGGGCCTGTCTCTGGCCCCTGCCCTGCTGC
-TTCATCCTCTCACTGCACGCACAGGAAGGAGAGCCCAGGCCTGGGGCCAGGTTGCCCCAT
-GAACAGTTGCTGAGCCAGGTGGCTGGAGCTCTTCCCTGGGGCCCCGCCCACGATGAGTTC
-AGGAGCTGCCTTTGTGCACCCGTGACAGCCTCTCCTGGCGCCTCATTTGGCAGAGCTGTG
-CATCTGGCCCAGTTACTGTGGTAGCCTTGGAAGGCAGAGTGCTCTGGGGCTTCCTTGTCA
-TCTACCTGCGTGACCCTGCATGAAGGGTATGCCCAGCCCTCAGCTGGACTGCCAGCCCCA
-CAGGCACCCTTGGTGCCCACCACACAGCAGGAGCTCATCCACAGATGGGCACAAATAGTG
-ATACCAGACAGTGCCTCtgagtccttgctgtgctaggcactgttctaagtgcaaattccg
-ttcatcttcacagcaacccttgcagtgggggctgttaaccccattttagagatgagcaaa
-ctgaaacacagaaaagcataggaaattgcccaaagttgaatgaatgaatgaatgaatACA
-ATGACAACTTAGGAAGGAAGGCATTTTACTGAAGagtgacaggcccacggtcacacagat
-agtaagtggaaaaaaatcagggctggaactcatgactccaaCATCACCTCCCACCTGTCC
-ATAAGCCCAGTGACAGCAAGGCTGGCACTCCCTCACACTTGGGGTTGAGGCCAGTAagag
-ctgcatttgtggaacactggccaaagcaaaccctctgtgctgagggcacttcagccagtg
-tctcaagcctgtctgcacttcttcttttttttttttttgagacagactctcactctgttg
-cccaggctggagtgcagtggcgcaatctcggctcactgaaacctctgcctccccggttca
-agccattctcctgcctcagcctcctgagtagctgggattacaggcacgtgccaccatgcc
-cggctaatttttgtatttttagtagagatggcattttgccatgttggccaggctggtctc
-aaactcctgacctcaggtgatctgcctgccttggcctcccaaagtgctgggattacaggc
-gtgagacaccatgcccagtcaactgaagttctttgagagtactgttcccattttccagat
-gaggagcctgaggcccagcgaaggcgagcaacatggccaaggtcacacagccagtaggtg
-TGATTCCAAAGTCCCACTTTCTGTCTTCCATCAGGTAGTACTATCTGCCTTCCACTATGG
-AGGGAATGTCCCATTGGGAGACGCCTAGGATGGGGGCTAAAGAAAGACAGGCAGGCCCGA
-CACCAGCCTCTCTCTCTTCTGTCTGCTGTCAACACTATATCTTGGTGCCATTCTGCCCAC
-TATTTGTAGAGAGGCCTGGGTACCAGCCTCTTCACTTTGTCCTGGAGGCCAGGCCAGGCA
-AGGATCACTGTACCCACTTttctttccttccttccttccctccctccctctctttctgcc
-ttTTTATTAAGGTATAAACCACACAAAATAAAGTACATAGagccaggtgtggtggctcac
-gcctgtaatcccagcactttgggaggccgaggGACCCCCCAGCCAAAGCCTGGAGCTCAG
-AACACAAATGCTCCCCTTGTTGAGAGTGGGGAAAAAAATCTCTTTTCAGGTGCCAGCCTT
-AAAAAGAAAGAACAAAAAAGGTAACTCACAGATGACCGTGATATGTGACGTGCATCTGAG
-CCCTTCACACAACCACAGAACTAACTGTCTGCAGCTGCCACAACAGCTGACCCCTCTGCC
-AGGCAGAGTTTGCTATCAACCAGTAACAGCTCCCAGAGGTTTTGTTATCCCTCTGTAGAA
-ATGGAGGCTTGAggccaggtgcagtggctcatgcctgtaatcccagtactttgggaggct
-gaggcaggcggataacctgaggtcgggagttcgagatcagcctgaccactatggagaaac
-cctgtttctactaaaaacaaaaaattagccaggcgtggtggcgcatgcctgtaatcccag
-ctaccagggaggctgaggcaggagaatcacttgaacctgggaggcggaggttgtggtgag
-ccgagatcgtgccattgcactccagcctgggcaacaagagcgaaagtccatctcaaaaaa
-aaaaaaaaaaaaaaaaaaagaaaTGAAGTCTTGATTGACTGAAGTAGGAGGAGCCAGCGC
-ACAGGCTTTGGAGGCAGAAGAGCTGGGACCAGCTCTGGAGGTTTGGGAACATGACTCCAC
-CTCCCCGAGCCTCGTACTGCTGACCAGATTGCTtttgcaagcattgtactacatcttcac
-acaatgctgggaggcagctgttaccaaccccatcttacagccggagaccctgaggctcag
-ggaggtaagggatgtgtgcagagacatgcaCAAAGTGGAAAAATGTGAAAACAGACCTCA
-TCGTGCAGTGTTATTGTGCAATTTGAATTGAATGAGGGATAAGAATGTGAATGGAtgcag
-tccacagtaggtgcttaagtcttgcatggggtctaatagccggtgagtggcaaaaggaga
-acttgtacccagatctgcctcaccccagagcccacctctgagcctctTCATCCATGGGAA
-GCCATCAtcagcatggtgcctggcaccgagtgagcctttgagaaagggtaactGGgtcaa
-aaattattttcagaaagttgaaaacatggatcttatacaaatgtatagtgagcacatgtc
-aaagtgttatttaactcattaaggatggaaccggtaggatggcaaagctgactcaaagga
-ggataaaatggcaaagttagctacgacataggttaatgtcttacagggcaccaaaaccat
-aagctttagcgttatttcttctacaggtcagaaatcatttgcaactcgtgcactttttac
-aagttaccaggtaactttgcttaggatcaggtgacccaggctcatcggacactgccttcg
-cttgatattgaaagggcacacagacaccctttttgtcttatttccaagttttggatattt
-tttctttaCAGTTATTATCATTCCACTTCTCTCTGACGAAAGGCTGTTCACAGGCCTCAC
-AGGTTCCCAGGAGCCCAGGGACACGCAGACCCCACCCCACCCATTCACACAAGGACTCAA
-GGACAGAGCCTCTACCCACAGATGAACTTGGGTGGTGCACAGGCACACGAGCTTGATGGC
-AGGGCACGCCCAGGCTGAAGGGGCCGGGTGGGAGCTAAAACGTGTGGTCTATGGTAGCCC
-AGCCTCTTTCCTCAGCAACCACGCCATGAAAAGATCCCTACATTATTTGTCAGGTAAAAT
-AAAGCGACCCGTAGCTAGTGGCGCGAGATTCTATCCAGCTTAATACGTGTGTATGTGCAG
-ACACATTTATGAGTGTGCATGCAGAGAAAACTCTCTGGGGAAATACCCCCTGAACTGACA
-GCCATGGGGAGTGAGGGTGAAGCGGAAACAATCTTGTAAAAGAAATTCAAAAACCGAAGC
-CCACTGCATTGTTTAAATTGGTTACGTCCAACTTGTTTTCCTGTGTTATCTGTCGCCTGT
-TAATACACACACACAAACACACACATAATAGAATGGGATAGAatatctatatatatctaa
-tatatataatatctaatatatataatatctaatatatataatatctaatatatataatat
-ctaatatatataatatatatatagagagagagagagagcgagagagagagagagagggag
-agacggagtttcgctcttgttgcccagactggagtgcaatggcgcgatctcggctcaccg
-caacctccgcctcccggcttcaagcgattctcctgcctcagcctcccgagtagctgggat
-tacaggcgtgcgccaccacgcctggctaaattttttttttttttttttaatttttagtag
-agacggggtttctccgtgttggccaggctggtctcgatctcccgacctcaggtgatccgc
-ccgcctcgacctcccaaagtgctgggattacaggcgggagccaccgcgcccggcGGGATA
-TTATATTTCCATAAGGCCCTCCGGGGGCCTGGGAACGGACTGGTGCTTGCGTGCGGGGCT
-TTTCCACTGGTTCCCTTCCGTACTCGGGCTTCCCCCGCTGTTGTTACTCCCTCAACGGGA
-ACACAACTCCACCGCCGCCTCCGGGACACACCCCCGCCGCGTGGGCCGGGGTCCGGGACG
-CGCGCTCAGCTCGGCCCCGCGGGGGCGGCGCAGGAGGGAAGGGGGTGCGGACCCCGGAGG
-CGCCGCAGGAAGCCCTCGCCCACCCTTCCCGGCCGGGCCGGGTCCGCAGCTGACGGTGGG
-GGTGGGGAGCAGACGGGCGGGGCGCCGGCCGGCTTGGGGGTCCCCTGGTCCCGTCCAGGG
-GGCTCGGGCCGACTCCGGGCCAGCTGCGGAGGCGGGGGAGGGGACCCCGCTTTCCATGGC
-AGTGCCGAGGCGGCGCGCACAAAGGCGCCGCGATCAGCGCTTCATCGGTTCGAGTCAATT
-ATCTGAGGCGCGGAGGCGGCGGGCGGGGCGAGGCGATTCCCCGGTGGGGCTGCGGAGCGC
-GGCGCCGAGACTCAGAGGAGGGGGCGCTGGGGAAGCGGCTTCTCCGTCTCCTGCTCCGCC
-CCGGGCTTCGTGGCGAGGCGCCGTCGCCCCCTGGTGGGGCCTCATCCATTCCTCGCTCAC
-TCGCTCGTTCACCTTTTTCTCAACCTTACAGCGGGTGGCTCTACGGTACGAGCTGAGGGT
-GAAGTGCTGAGAACAGGGCAAGCGGGCCGTACCTTTAAATGCCCTGTCGGGAGCTGGGCC
-CCTCTGAGTGGCCAACCTCACCAGGAAAGGGCGCTCAGCCTCGCGCTGCAGATGGACTTG
-GAAGCAGACCGTCAGAATGCAGCCCTCCCTGCACGTGATAGAGTAAGGGCCGCACAGGGG
-ATGAGGGCCCGGGGAGGCCCTTCGGGAGAGGAAGAGTCCCAGATGGCTCTCTGGAGGAAG
-TCTGGCCTAAGATGACCAGGTGAAGGGGTGGGGGTCCAGGGAGATGAGGGCGTTGCAGGT
-AGAGGTTTCAGCTATTGCAAAGGGGTTGCAGTACGGGCAAGTAAGGTGCACTCTGGGGAG
-AGTAACCTGTACTTACTGTGCGAGGGGAAGGGAGGTGATCAGTGAGGTAGGTAAGTGGGC
-CAGGGCCAGATGGCACAGGGCCACCTGCAAGCGTGGGCTGAGGGTGGGTTGTCAGGTCGT
-TTCATCATTTCCAGTTTATCCTTCTCCCCTTTAGATTTGGAGAGGATTTGGctgccctca
-cccttgtaagggtttaggcatcattcgcccttgactcctgtccagttgtctcactggtct
-ccctgtatcccttattttgcccttcaatctgcctgcacccatcctccaaaatgacctttt
-taaaagcaaagctcggtggcactacttttcaaaatcACAAATGCACAGGATCTGTAACCT
-GCTGGTTGCACATGACAGAAACCGCATAATAATCATGGGTTAggccgggtgtggtggctc
-aagcctgtaatcccagcactttgggagcctgaggcaagcggatcacttgagatcaggagt
-tcgagaccaggctggccaatatggtgaaaccctgtctctactaaaatacaaaactttgct
-gggcgtggtggtgtacaccagctactcaggaggctgaagcacgaggagaatcgcttgaac
-ccaggaggcagaggctgcagcgggctgagatcacaccactgcactccagcctaggtgaca
-gagcgaggctccttctaaaaaaaaaaagaaaataaaaaaaaaGTCCTGGTGTTAGAGGCA
-TTTTTCTTTtcctcctcctcctcctcctgctcctcctcctcctcctcttcttcttcttct
-tttctgagacagagtctccctttgtcacccaggctggagtgcaatggtgtgatcttggct
-cactgcaacctccacctcttgggttcaagcgattcttctgcctcagcctccagctaattt
-ttgtatttttagtagacatggggtttcaccatgttagccaggctggtcttgaactcctga
-cctcaggtgatccacccgccttggcctcccaaagtgctaggattacaggtgtgagccacc
-acactcagccAatagaggcatttttctgtcatgtaaataaagtctaaagcaggcagtcta
-aaactggcatggtgctctacggttcaggaacctaaactccttttgtcttattatgctacc
-ccctcagtacatggtttccacttcatggcccaacatggctgctcaaacagcagccctcac
-atctgcatccccagatggagagtctttttttttttttgagatggagtctccctctgtcac
-ccagcctggagtgcagtggcctgatcttcgctcactggaatctctgcctcccaggttcaa
-gtgattcccctgctcagcctcctgagtagctgggaccacaggcacgtgccaccacacctg
-gctaattttttgtatttttagtagagatggggtttcactgtgttagccaggatggtctcg
-atctcctgaccttgtgatccacccacctcggcctcccaaagtgctggggttacaggtgtg
-agccaccgcgcccagcccccagatggagagtcttttagtcattagaaaggagaaaggagc
-caaggagggagggaggttcccttaaagactctttcggaagtcacatacaatcttcttgtt
-gatgttccattggctaaacttgatcacatcactacactaagctacaaaggaggctgagaa
-atatgatctgtgttctaggcaccatgtgtccagatgaaaattgaggctcttatttcaaag
-aaaaagTTCAGTCCATggccaggcgtggtggctcatacctgtaatcccagcactttggga
-ggccgaggctagtggatcacctgaggtcaggagttcgagaccagcctgggtaacatggaa
-aaaccccgtctctactaaaaatacaaaaattagccgggtgtggtggcatgtgcctgtagt
-cccagctgctcaggaggctgaggcaggaaaattgcttgaatttgggaggcacaggttgca
-gtgagctgagatcacgccactgcactccagcctgggtgacagagcagaactctgtctcaa
-aaaaaaaaGTATCAGAAAAAGCGCAGTCTGGATATTGGGAAATGACCATCAGTCTATGCA
-TGctcaggagttccatgtctagcagtgtgtcctataggtttgcttaacccatgtgacatt
-tgacacgtttacaaggttattcactgcagcattgtgacagcaaaagactggaaacaacct
-aagtgtcctgtaataggggactggttaaacaaattatgggacatttatacaatggagaat
-gatggccacaaacacacatgaggaaactctcaatgcagtgatatgaaatggtatttaaga
-tgtTTcactttggaaaacagtttggcagtttcttatagagttaaacatacatctctccta
-tgacccagcaagttcacctctaggtttttgctcaaaataaaaatatatatgtatatatag
-ctccacaaggacttctatgcaaatgttcaacagagtttaacatgtgatagacaacaattg
-gaagtgacccaagatcgaacagccaatgaatggataaactggtgagtcaaatattacact
-ggagtttaaatgagtgatccaatgtctgcaaccacatggatgaatctcaaaacatgctga
-atgaaaacaagctggatacaaaaaatagcatgttgtaatgatgccgtttatatgaaattc
-tagaagaggcaaaacagaccaatctatgatgacagaaagcagagcagtggctgcctctgg
-ggtggagggatggactgggaaggagcataaaagaatttcttgggatgctggaaatgttct
-gtatcatgattggggtgttgattacacaggtgcatTTCACTGCATGTAAATTATACCTTG
-ATATTTTTAAAAAGCAGGGTGCAGAACAATGTTTAAATTATGGAATCCGGTATGTTTAAA
-AAGCAAGGAAATTTGCTTGTATCTGCATTGACTGTCTAGAAGAGACTTGTAATAGTGATT
-GTCGGTGGGAGAGGAACTGGGTAGCTGGGGGCTGGGGAAAAGGGACACTTTGGGCCATAC
-CCTGTTATACCTGTTGAATCTTAAACCAGTTGAATGTACTACCTAATTAAAAACTAAAAC
-TGAAAAGATCAGTTAGATGCACACGTGACATCACCACATTCATGTTTTAAATCTCCTAAT
-GGCTCTTCCCGGCAATCTGGACGAAGTTCAGACTCTGAGCTGTCCTGGCCTTATGTGGCC
-CCACTCAGGCAGCATCCTCTCCAACCACTTTTCTGTTCCCTGCAGAGACAGCTCAGTGCC
-TGGCTCCCTCTGGTTGGCCTAAGTGCATATGTGCCATTCCCTGAGTGCTCAGCTCCTCGG
-TGAATTCTCCCCAGCCCCCTGCCTGAGTTGGTCCCTCGGGTCTCACTGGACCTGCTGCAC
-TTTGCCTTCCCCCTTCCTCATCTATCAGATCAACACGTGTTTCCCAGAGCTCTCTGTGAG
-CTGGACCCCAGAGTCCTGGAGATGTGTGGGAGCCACTTTTATGGGGGAACCTGCTTCCTT
-GTTTCTGCTTCAGACAGCAGGCTTCTCCTGCCCTGAGACTCCCAGCAGCGTCTCCTCTTC
-CCAGGCCCAGATCTGGCCTGGGGTAGAAACTTTGATAAAATGTGCTGTCTTTAAGTTAAA
-TATGGCTCCATAAAGAATGCATTCCATGacaagaaccaacagagccctggtttcttagaa
-gatacagagaaaacacactgttgtgggagaattgtgtctgccaaaaagatacatcccagc
-tctaaccctgggacctgtgattgtgaccttatttggaaacagggtttaggcagatgtagt
-caggtcagggtgaggtaatactggattagagtgggctactccaatgactggtgcccttaa
-agagggaaacagacagaggagaacaccacgtgaccacagaggcgaagatgggagtgatgc
-atccacaagccaaagaaggccaaggaggcttgcagtcataaaagctggggagaagcgagg
-aagtgtcctcccttagggctttcagagagagcatggccttgccagcaccttgatttcaga
-cttttagcctccagcactgtgagaatacatttcagttgtcttaacctacctggtttgtgg
-ttatttgttctttttttaaattttttatttatttatttatttttgagacagagtctcact
-ctgtcacccaggctggagtgcaatggtgtgatcttggctcagtgtgacttccaccttctg
-agttcaagtgattctcctgcctcaggctctggagtagctgggattacaggcacctgccac
-cacacctggctaatttttgtattttcaatagagacgtggttccactgggttggccaggct
-ggttttgaactcctggtctcaactgatccgcctgtcttggcctcccaaagtgctgagatc
-acaggcatgagctaccgcacctggcctgtggttgttaactgtagtcccaggaaatgaata
-cacacacaaaaccagttaatacctaagacaattccagctagtggcaagtgctttggaaaa
-acaaaacaaaacaaaacaaaacaaaacaggtgagaagggcgtgggatagagagggactgg
-gaacggtgccacattagccagggtggtcagggaagccctcttggaggaggaggcatttca
-gtggagaGGAGAAGCCCAGCATGTGAGGACCAGGCAGAGGTGCTGGTGAGGGGGCACTTG
-GTGGGCGTGAAAGCTACTGGATGCAGCTCTGACGATGGAGGATACCTGACTGGGATTTTG
-GAGGAAGTCTCCAGGAATGAACCGGGAAGGGGCTATCCTCTCTTTGCCTCTGCAGGTCTC
-AGAACCTGCTGCATGGCTGCTGCAGGCTGTCCCTCGGCCTAGGCCGGCTGGCAGCCGATG
-AAGGAGGCCAGCCTCGCAGCTGACATGCTGCTCTCTAATTGTGATTAACTACCAAGTCCT
-CTCCTGCTCCGGCCTGAGGCCGCTGGTGTGACAGCTGCAGAGTGAATCAATGAGGCCAGG
-AAGGGGTTAATGGGCAGCCCCTCCATCTGAGCCCTTCAGACAATAAGGGGAGGTGGGGAG
-GCCTCTGGTGGGGGTGTGTGGCATCAGCTGGGGTGAGTGAATGGAGGGGACAGAGGCCTT
-GTCCCTGGGGACAGGGTGTGAGTGCTCTGTGGGGAGAGGGGTCAGACCCCCCTCCCATTA
-TTTTCATCCACCTCCATCGTCCTCTCCCCTCCCCCACCCAGCCAGAGCATCCCAGACAAC
-TGCCCTCTTGGCTCCAAAGTGTGCAGCATCTTCAGCCTTACGGAATTCTGAAGCAGAAAT
-TCTAAAAGCCAAAGAACTGCAGAATCGTGACATGTCACCGCTGTGGGAGAGTCCGTCTAG
-TCCTGTCATTCTGAAACTTTCTTTTGCAGTGGAACCCACAACTCCCACCCCAGCTCATTT
-CCCCCCAAAATAATAGTGCATTGATAACATTGAGAACAGACCCTGGTACCAGCCGGCCTC
-ATTCATCCTTCATTCAGCCCCGGTTCTACCACGTACAACTAGGGTAACTTGGGGGTATAA
-TGCATAGTTTATAGgtgtgtgtgtgtgtgtgtgtgtgtgtgtCTTCCCtagagacagagt
-cttgctatattgcccaggctggtcttgaactcctgggcacatgcagttctccagccttgg
-ccttctgagtggctggCTCACACCACCGTATTCAGTagttccgtaggttttgacaagttt
-gtaagttatgtaaccaccaccacaattaatatatagaacatttccatcgctgaaaaatgt
-tgcctcatgccccttgtagtcaatacccttcccTGTGTTACCTGATATGGTAGCATGAAT
-AAAGGTCATCTAGAGTTAGTGACTCTAggccgggcagggtggctcatacctataatccca
-gcattttgggacgccaaggtgggtggatcacttgaggccaggagtttgagaccagcctag
-ccaacatgacaaaaacccatctctactaaaaatacaaaaatgagccaggtgtggtgatgc
-acgcctataatcccagctactccggaggctgaggcaggagaattgcttgaacccaggagc
-tggaagttgcagtgatccgagatcacatgactgcactccagcctgggcaacagcaaggct
-ccgtctcaaaaaaataaaaaaaataaaaaaaTTAGTGAttctaatccttgaactgtgtaa
-atgttaccttatttggataaaggatctttgcagatgtaattaagaggcagaggttggagt
-gatgtggcccaaagcaaagaacaccaggaggctcccagaaccagaaggggcaaggaatgg
-attctgctctagagcctccagaggtagagtggctctgccaacaccttgatttcaaatgcc
-tggcttcagaactgaaagagaatacacttctgttgttttaagcctctcagtgtgtggtac
-ttttttacagtagtctttacaaacaaatatacctagcaaccaccatgccttgttttctat
-ctgtataagttttgcctttgcaaggatgttacatagacagaatcctgcagtatgaagctt
-ttgtgagtttggcttctttcactcagcataacacagttgagatgcatccatgctgttgca
-tgcatcagaagtctgttccttttggatgctgagtagtatttcactgctggatacaccaca
-gcttatccattcaccagttgaaaggcatttgggtcactcctaattgggagcattataaat
-aatgctgctatgaacatgtgtgtatagatctctgtgtggacatacactgtcatttctcca
-gagtagataccctggagtagaattactgggtcatattgtaagtgtatttataattttatc
-agaaattattacccgggcatggtggcatgcacctatagtgccagctacttgggaggctga
-ggcaggagaatcccttgaacccagtaggtggaggttgtagtgagccgagatcatgccact
-gcactccagcctgggcaacagagtaagactctgtctaaaaaaacccaaaaaaccaaagaa
-caaaaCTACAAAGAATCTGATgtggctcatgcctgtaatcccagcactttgggaggccga
-ggttggaggattgctggagctcaggagtctgagaccagcctgggcaacatggcaaaaccc
-gatctccactaaaagtacaaaaattagttgggcgtgatggtgagtgcctgtagtcccagg
-tacttgggaggctggggtaggaggatcacttgagggtgggaggcggaggttgcagtgagg
-tgagattgtgccaatgcactctagcctgggtgacaaagtgagaccctgcctaaaaaaaac
-cccaaaaaacagaaagaaactgacaaactgttttccagtgtagctataccattttgcatt
-ctctccagcaCTTAGTATTGTCAGGTTTTTAAAAATTTAGATATTTTAggccaggcgctg
-tggcttatgcctgtaatcccagcactttgggaggcagaggtgggcggatcacttgaggtc
-aggagttcgagacgagcttgaccaacagggagaaccagatacttgggaggttgaggcagg
-agaattgcttgaacctgggaggcagaggttgcagtgagctgagatcacaccattgcactc
-cagccctccagcctgggcatcaagagtgaaactctgtctcaaaaaaaaaaaaaaaTTAGA
-TATTTtaataggtatgtaacaatcatagggttattgtgagaatgaaatgaacatatctga
-gaatactgcctagcacatggCTCCTGGCTTGGAAGGGTAAGCTCCTCTTATTGCAATCAC
-TATGGGGTTATGTCCTGTCCAGGACAAAACCAGAGGTGAAAACTCAAAAAAAAACTCAGG
-TGGGCCAGGAGGAGGCTGTGGGGACCAGTGAGCTCATGTCCCATCttgaaggtcaaggtc
-ccgggaagcagctcctgagatggaaatctgcatgtgggtggttttccaggtagtgctctt
-aggatcttggaggagccagggaagcaggctcgggcagttgcaatagaggccttgaccagt
-cccatcaggagctgggccagcccttaggacatgtcacagcctgagacagggaggtcatgc
-ctctgtactctgcaagatcagactttggagtggttgcccacaggagagatgttattaata
-tcttgggtgaagcagcccttttaagctgGTGCCTTGATCCGGGTGATGGCTTTGAGGTgg
-aaaacaagcctgagtggtttcagctttcaacttttcaagagaagctatgtatctagattt
-tgatgttaactctccaaacttttttaaaatgctggaaattctagacttttcaaacctgct
-gtgaggggctcacatgccaggcacaagggctggagggggcctgaggctgcctgtCGATGC
-CCCTTGATATAAAACCAggctgggtgcagtgccttatgcctgtaatcccagcacttcggg
-aggccgaggtgggtggatcacttgaggtcaggagttcgagaccagcatggccaaagtggt
-aaaaccccgtctctactaaaaaatacaaaataataataataataataataataataataa
-taattagctgggtgtggtggctcacccctgtaatcccagctactcgggaggctgaagcag
-gagaattgcttgaacccgggaggcggaggttgcagtgagccgagatcgcgccattgcact
-ccagcctgggcaacaagagcaaaactctgtctcaaaaacaaaacaaaacaaaaacaaaaa
-caaaaaAGGAAAACCAAACAAAAAAACCCCCAAAACCTGCTGTGTCATCTGACATCACGC
-TAGTgtctggttgccgcactggagaggacaccccatggggcaggaatctttgggttttga
-tctccaccacatccccagcatgtagggcagggtccagGCCTGGATGCAGCACGAGAGAAG
-GAACGCAGGGCCCGAATGAGTAATTTGCCTCAGTGTGCAGGTCATTTAATTGCAAAGAGA
-GGAAAAACGACAACCAAaaacaaccaaatgaaaaaatgagcaaaggatttgaatagacat
-ttctccaaagatgtacaagtggccaataaacagaggaaaagatgctcagcgtcagtaatc
-attagggagatgcaaatcagaattgcaagcacgagataccgcttcacacctattaggatg
-cctattaaaaaacaaaaacaaaaaACAAAACAAAACAAAAAAATCAggcagagtgctgtg
-actcacacctgtaatcccagcactttgagaggctgaggtgggcggatcacctgaggcagg
-gagttcgagactagcctgaccaacatggagaaatcccgtctctactaaaagtacaaaatt
-agccgggcgtggtggcgcctgcctgtaatcccagctactcgggaggctgaggcaggagaa
-tcgcttgaacccaggaggtggaggttgcagtgagccgagaccacgccattgcactccagc
-ctgagcaacaagagcgaaactccgtctcaaaaaaaaaaaaaaaaaaaaaaaaaTCGCAGA
-Tctgactgtgtgaccttgggcaagttgcttgacctctcagtgcctccatttcctcctctg
-taacgtgagagtaaaaatactactcatacctacctcgtagggctgtcatgaggactgaat
-aagtgcataggtacagacatgcttaggacagtatcagcacatgcaggaattacatgggag
-ttggctgttaATATTATTACAGGAGTggatcaaatccatctctgccatggacttgctgtg
-tgacctagtgcaggtcactttgcctctcttggtccagttttctcacttgtaaaatgggac
-catactgccactctccatagggcaagtgtgcggattcgaggagctcatatgtgaaaggcC
-TCCTTCAGGCGCAAGGTTGGTCCTTGGTTATGCACGTATGTGAGCCTCTTGGCGTGCCTT
-CATATGTGGGGCATAGGCAAGCACTCAAGTGGCCTGGACTCCTATCTCGGCTCTCAATGT
-CCCCGCTTCCTGGCCTGGGATCAGCAGGACCTCAGTGGATCCACCATCCAGGCACATCCC
-TTTCTTTCCCTGCTTTTTTCCTGCTTCTTGGGCGGCACCACCACCTACTGGCCTAAAGCT
-ACATTGCAGCCAATGTGCACAGCGGGGCGGAGGGAAGGGAATATGGCCTTGGGCAGCTGC
-TGTGCGCAGAATATTTACCTCTGTACACGCTTAGGGTGCTGAGGCTTAGGGAGCTCACAC
-GGAGAGAGCCAGCTGTGAAGCTGGGGTTAGAATCCCTGTCTCCCTTTCACCTCACTCCAA
-ACACCCTCTTAGAATGGGAACTCAGTTCAGGTTCTGCCTTGGGCCCTAGACGATCCACCC
-CTCCCTTCTGAGCAGGGAGCCAGGAGCTGAAGTCCAGGGTCCTTGGAAGTATGTCAGGGT
-TGTCCCCCCAGGGTCCTGATTACAGAAGAAAGAACACTGGACTCAGAGTCCAGAGGTTGG
-GGGTCTAGCTTTGCCTTCCCTATCCCCAACTATCAGCAAAACAGCCTTTGGAAAATCCTC
-ACCCATTTATTCTAGCACTTGTCATTTCGAAATATATTTACTGTGGGAGAGCATTTAATG
-TGAGTGTTAGGTTCTAACGCAAGGAGAAAATTATAAAAATAAACAAAAACTTTTAAAGAA
-CTCCTAAAAATCCTTTAAGTCACTCATAAAGTATAATATGGGCAGTTTTCTAAATATAGT
-CCTTTGCAGCAATAAATGCACGGACCATAAAGAACAGCAGTATATGGTGGTGATTGCATG
-CATTTGCGAACTGTAATTTTAGGTTCTGTTCTCTCTCAGGGGTGTGTGGGATTCCGAGCT
-GTGGATCCACACCCCCACATCTCTCTCACAGCTGGGATCATGTCCAGGCAGAATCGCCCA
-CATTGTGTACATCATTCTCCCTTCTCTCTCTCTTTCTGAGCGCACATAGCTGCATTTCCG
-AAGTTACATAATaaaaacagctaacatttattgagctttcattatgtattaggcctgctc
-gcagccctttgctcacgcattaattcattaattcagataatcctcctaagaatgttatga
-ggtaggtatattattatctcttctctttacagatgaggaaactgaggcactgaatggtta
-agtaactagcccaaggtcaaatagTGTACCACCCAGCCCGAAGGCGTTCACCTTgttccc
-gggtaggatcgcagaactggttaagctaggttaccgatccgggtggtgtcagctgatccc
-tcagctgctgtagtgcaagatctgcaaaatatctcaagcactgatcttaggttttgcaat
-agtgacactgtccccaggaacaacttggggaggttcagacccttgctgtcagaggctgca
-cagcccctaaaccttgatttctaatcttgtagctaatttgttagtcttacaaaggcagac
-tggtccccgggcaagaagtggatcttttcaggaaagggctattgtcataatttcctcagt
-tacaatttttgcaaaggtggtttcaatagccagtgagtggtacagcctgaatttgaaggc
-aggaagtccgggacgagaacccacactcttgactggcatactTGCCACCTGAATGGAGGC
-TCCATAGAGCCACGCGTGCATGCTTGTGTACCTGTTGTCAGCCCGCAAGCTCCGTTAGGC
-AGGCTAGAACCTGATCCAGGTTAACTTTGCATCCTTAGTGCTGGTTCTTTCCATCCAGGG
-CCCCACTCAGGGTATATGCTCAGTGACTGTTGTACAAATGCATAAAGCTCAGTTTGCATA
-AAGCTCACTTCAGCTTCTGTATCTGTAAGACAAGAATCAGagccaggcacagtggttcat
-gcctataatcacagaactttgggaggctgaggcgggcggatcacgaggtcaggagttcca
-ggccagcctgtccaatatggtgaaaccccgtctgtagtaaaaatacaaaaattagccagg
-tgtggtggcacgcatctgtaatcccagatactcgggaggctgaggcagaagaatcacttg
-aacctgggaggcagagtttgcagtgagccgagatcatgccactgcactccagcctgggcg
-acagagcgagactccatctcaaaaaaaaaaaaaaaaaaagaaTCGAAATCAGCTCTTCAG
-ATTGCTGGAGGCTCCGACAAGCCCATTGGTGGGAAAATTCTCTTTAAAGACACTGATGTG
-ggctgggcacaatgactcatcctgtaatcccaacactttgggaggccaaggtggatggat
-cactagaggtcaggagtttgagaccagcctagccaacatggtgcaaccttgtctctacta
-aaaatacaaaaaattagccaggtgtggtgacatgaacccataatcccagctactcgggag
-gctgagatgggagaatcgcttgaacccaggaggcggaggttgcagtgagccaagattgca
-catctgcactccagcctgggcgacagagcaagactccatctgaaaacaaacaaacaaaca
-aaaCACtgatatagtttggatttgtttcccctcccaaatctcaggtggggttgtaatccc
-cagtgttggaaaaggggcctggtgggaggtgattggatcttgggggcaaacatccccctt
-gctgttcttgtgatagtgaatggattcttacgagatctgcttgtttaaaagtgtgtggca
-cctcctcctaccccgctccagccatgtagaacgtgcctgcctccccttcgccttctgcca
-tgattgtaagtttcctgaggcctccccagtcatgcttcctgtacagcctgcagaaccgtg
-agccaattaaacttctttttttaaatgaattacccagtctcagttcattataccaatgtg
-agaacaaacgaatacaGACACTAAATTCTCCTTTGCCCACCTCCTGCTTGGTCCCTTCTT
-GAATTTTCAAGCTGCTCAACCAAGTggcctgcaccagcttgggagagctaatcgtgtgta
-tctgtacccaactctacattcagtaacatcatgtttgtagctcgaaatcagcaatggtga
-gtatttacactatggcaattggcaaatgcttcaaacaggagttttcccctctagagatgt
-taaacgtttgccagGAGGAAATCAATCCTCTAATGGCCACCTTcaaggaggcaacacagt
-ggagtgatcatgcttgttggctctggagccagaacacctgggttcaaagtccagctctat
-cacttaccagctgtgtgaccttgttcagttacttaacctctctgagcctcattagtctca
-ttcatgaTTACGTATTTCATTGGGGACTCAATGCCATCTTCCATATAAGTGCTCTCTCAA
-TTAATGTTATATATTAATATTATCAATCAGCTTAAGAGGTGGGGAAACTTTCTTGTTTTC
-CATCCTAGGAAAGGGAGTGCTGAGGACAGGACTTGCAGTGTCAAAAAGGAACCTCAAAAA
-CGGCAATGTGTAACTGCAGGTCTGGGCCATTTTTGAGGGTCTCTTGAGCATTGGCAGACC
-AGATCTTTATGCCAACACAGGTTGTGCGTGTGGGGGTTAGAGGAGGAGAGGCCTTCTCAG
-TTCTTTGCAGGAAAGGCTACTGTTAGCTCTAGAGCCCAGAACAGATTTAGGGGGAGAGAT
-GATCTAACCAAACTTTCCCTCTGCCCTCGGCTTGCCAGTCTTCTCGCTAGTGAACACTCC
-CAGTGTGAGGTAGAGGGTTCCCTGTTCCACCTCCTTCCTCCCTCTGTAGAGGAGGTATGC
-ATTGGGGCAGGTGTGTGTAAGGCCCTCCTGGGGTACCCCTCCAGGGAATCTTCCCATCTT
-CTCCAGTACTGCCCCATCTGACATCCTGCCTGAAGCCACAGGTTTCCCTTGCAATCACTA
-AAGAAGCAGGAGGGAACCAGCAGAACTCCCTGCCCATGTGCACAGGAGGTGATCCAGAAA
-CTTCAAGGGGAAAAATCCTGCTCTCCACCCCAGCAGGCATTGATTTTTGGCTGCGAAGAT
-TACAGtctctctctctctctctctctctctctctctctctctctctctcacacacacaca
-cacacacacacacacacacTCCTGTGTGCCAGGAGGTTCCTAGAAGGTCCTCACTCCTCG
-CACTCAGGTGCTCCAGGGCTAGCCCACTCCTGGGAGGTGCCCACAACTGACCACGATGCC
-CACAAGACTGTGGGAAGGGTTGCCCCATGTGCCTTCGTGCCCCTCCCACTGGATCCCAAC
-gaaggctcttttcacaacaggaatcagagcatgtcactcccaacctgcctaaaccctcca
-atggctcccaccacttttgatcaagacctaaatcctttctgagtccaccccatccttaca
-gggtctaaccttgcttccatccctgtcttcaccccttattcctccctctgggctcctctt
-caggcccttgaggtgccaagctcactcctgccctgggcctttgctgctgctgtccccttg
-gcctggagcactcttcccTGTCCTTTTTGCCCATGTGAGGCTGAGAGGCAGACGGAATCA
-TGGTTGCTAGTGTAGAgaggccacactactggagtttgtatttcagttctgtcaccttga
-actgggtgacctcacccatctctgcctccctttcctccctctatacagtgggaaagataa
-tagcacctacatcttagggtgttgtgagactgattgagataatCTGTATGGTTTTtggca
-gtttctgaaatgcactgtaaactgtctggttctcctcccatcggaaggtgagaatctgac
-tgctccccttgactctgggtgagagggtagggcaacagcaatgctccatgatttcagagg
-ctgggtcataaaaacggtctgcaggggattcacttccagaacagtggagtgaggaacact
-gcagactgctttctggtgaaaacaactgatgatgatttctaaaaaacaatcatttgaagt
-ctctggaaattgtcctaagagcatacagcaagtgaagaaacacttattcaagaaaatcta
-ctaaatctaggtaagaacagtgagtttgtagaacttgagacacaatccactctctttctc
-ccctccattccattttactgttatggaaactcaactgtgagcagccagggccaagaagat
-gggagtcatttccccccaagctcctagtcgatggggtacagcatctccccaggaagggaa
-ggctgccagcatttgtcatcctcccaacagctatatcttacagaggctaaactccaggta
-ggtgtggctgggagactgggatcttccttcctctacccagtccccactcatagggtggtg
-gccacgccaagtgcagcaggctaaaaatattgaagccccagttgcttttgtcttagctta
-cttgttaaagcagaggttccatgcctggagatgcaagctgagaagaccagagactaagaa
-tactgccccaactcagccctgctcataaagcaagaaggttactctgggagaagtgaactg
-ttgtccctgcctccagctccagagcagtgtcacagatgctttgcccaagagagaggcagg
-tcataacaacacagatctttaaagttgtccataaaggaactgactttctttagaacagag
-tatgcagaaatttaagcctaagagtgccctcagaagcagtggcgattttggtagtgatca
-gggacccaaagttgctatactatatcatcttaaatgttcattttccagcaaagaatttca
-agacttgcaaagaaataaacacatgtgacccatacacagggaaagaccagtcaacagaaa
-ctacctgtgagagtgctcagaggtcagacttgcacggacttcaaagcaaccactgtaaat
-atgttcaaagaaataatggaagccatgcttaaagaataagggaaggtaggctgggtgcag
-tggctcatgcctgtaatccccgcactttgggaggccaagaggggtggatcacctgaggtc
-aggaatttgagaccagcctggccaacatggtgaaaccccatctctactaaaaatacaaaa
-attagctgggcatggtggcaggtgcctgtagtcccagctactcgggaggctgaggcatga
-gaatcacttgaacccaggaggcggaggttgcagtgagctgagattgtgccactgcccttc
-agcctgggtgacagagagagactccatctcaaaaagaaaaacaaaaacgaaaatcaagaa
-taagggaagcggtgatgactgtgtctcatgaacagagaatgtaaacaagaagatactatt
-ttaaaaaacttaatggaaattctggagttgaaaagtgcaaaagaaaaattcactagaggg
-gctcaacagtagacttgagccagcagaaggaagattcagtgaatctgaagacagatcaat
-agagatttcgcagtctgaagaacagagagaaaaatatgaagaaaaatgaacaaagccttg
-gagaaatgtgggacacagctaggtgcaccaacatatgcacaataacatatataacagaag
-gagagcaaagagagaaaggaacagaaaaaaatgtgcaaaaataatcactgaagcctttgc
-aaatttgatgagaaacatgaattatgcattgaagaagcttaatgaactccgagtagaaca
-aatgcaaagtggtcaacaaccagatacataaaaggaaaatgttgaaacccaaagataaaa
-agaaaatcttgaaagcaacaagagaaacacagctcatcacatataagggaacaccaaata
-agaccgacagcagatttctcatgtgaaacgatggaggccctaaggcagtgggacaacata
-ttcaaaatgcataaacaaaaactaccaagcaagaatcttacatccagcaaaattatcttt
-caaaagtgatgatgaaagagatatttccagataaacataaactgagaatttgttgccagg
-aaacttaccttacaataaatactaaaggaagttcttcagacagtaatttgaatccacaca
-cacaaaagccaaagtgctctgggaaaggcaagtagatcgttatgaaaggcagtaagaatg
-catatttattcaccttctcttaacagatttttaaaaataatttgtatataattgtattgt
-ggggccaagacatatagaaatgtaatatattttgataataatagcacacaggaggtgagt
-gggagcagagctgtattggattaagaaagtgagaccagatgggaactggaatccacagga
-acaaatgaagagaaccagaaattataagtaagaaagttaataaaacaaagtcttttaata
-tatacttgctctcctttcttctctcagcttcttcaaaagacataaaactatataaagtaa
-taattataacaaagtactgttggttttgtaacatatgtagatgtaatacatataaaaaga
-atagtgcaaagaggaagaagagagaatagtgctatataggagtcaccgggcacggtggct
-cacaactttaatcccagcactttgggaggccgaggcaggccagtcacttggggccaggag
-ttcaagaccagcctggccatgtatctctacatataatagattgaaaccatgtatctctac
-gtataatacaaaaattagccaggtgtggtgtcatgtgctggtaatcctagctactgggga
-ggctgaggagaattgcttaaacccaggaggtggaggttgcagtgaaccaagatcacgcca
-ccacactccagcctgggcaatagcacaaaaatctgccaaaaaaaaaaagatagaaatata
-taggagtaatatttctatatatcactggaattaagttactgtaaatctgaagtcaattct
-gataagttaaaacctatatagtaagcctaaactggtcattaagacaaacaaacagaacag
-tgaaaaagctattaaagaaatttaaggctgggcacggtggctcacacctgtaatctcaac
-actttgggaggctgaggtaggtggatcacctgaggtcaggagttcgagaccagcctggcc
-aacatggtgaaaccccctccctactgaaaatacaaaaaattaggtgggtgtggtggcagg
-cacctataatcccagctacttgggaggctgaggcaggagaattgtttgaacctgggaggt
-ggaggttgtagtgagccgagatcatgccattgcactccagcctgggtgacagaatgagat
-tctgtctcaaaaacaaaaacaaaaacaaaacaaacaaaaaatccaaaaaacagaaattta
-aataatacactagaaaatattcgtttagtgtaaaagatgtcaaggaagaaaagaggaaca
-aaaaagacatgagacatatagaaaataaaaagtcaaatgacagacataaatccaacttct
-ctcaatgatagcattaaatgtgattggatcaagtcaaaagggagagatttcctgactaaa
-taaaaagccaagatcaactatatactgtgtgcagaagatacactcaagattcaaaggtta
-aaagtaggttgggcgttaaaggctgaacaaaatatatcacgcaaacagcaaccataagaa
-aacttgatttgctatattaatatcaggaaaaagactttaaaatgaaatatgttacaaaag
-ataaagaggaacattttataatggtaaaaggatcaatcgatccattgggaagacataaaa
-attatagacagatatgcccctaacaacaaagccccaacatgtgtgaagcaaaaacagaaa
-gaattgaaggggcaaatagacaattcaaaaataatatttggagacttcaaaaccccactt
-ttaataatgaatagaacaactaaacagaagactaaagaaggcaatagaggctgggcgtgg
-tggctcatgcctgtaatcccagcactttgggaggcccaggcgggcagatcacctgaggtc
-aggagttcgagaccagcctgaccaacatggagaaaccccgtctctactgaaaatacaaaa
-ttagccaggtgtggtggcgcatgcctgtaatcccagctactcaggaggctgaggcaggag
-aatcacttgaacctgggaggcagaggtttccgtgagcccagatcacaccactgcagtcca
-gcctgggcaacaagtgcaaaactccgtctcaaaaaaaaaaaaaaaaaaaagaaaaaaaaa
-agaaggcaatagaagacttgaacaacactaaaccaacaagacctaaaagacatctataga
-acatttcacacaacaacaagataatacacattcttctcaagagtacgtgaaaaattattt
-aggacagactatatgttagaccacaaaacaaacatcaatgatttttttatcttttatttt
-tttttttaatatggagtcttgctctgttgcccaggctgaagtgcagtggcatgatctcag
-ctcactgcaacttcagcctcccgggttcaagcaattctcgtgcctcagcttccagagtag
-ctgggattacaggcacccaccactatacccagctaatttttatatttttgtagagacagg
-gtttcaccatgttcgctaggctggtcttgaactcctgacctcaagttatctgcctaagtc
-ggcctcccagagtgctgggattacaggtgtgagcaaccgtacctggacaataaattttaa
-aagattgaaatcatacaaagtaccttctctgactaaaatggaatgaagctagaaatcaat
-agaagaaaaccaagataattcacgaatatgtgaaaattaaaaacacactcaaacaactaa
-tgtgtcaaaatagaaatcacaagggaaattggaaaacaccatgagggaatgagaataaaa
-atataacataccaaaacttacgtgattcagtgaaagcagaaaaatttatagctgtaaaga
-cctgcactaaaaagggagaaaggggccaggcgtggtagctcactcctgtaatcccagcat
-tttgcgaggctgaggcaggcggatcacttgaggtcaggagtttgagaccagcctggccaa
-catggtgaaaccccatctctactaaaatataaaaattagctgggtatggtggcacatgcc
-tgtaatcccagctacttaggaggctgaggcgggagaatcgcttgaacgcaggaggcagag
-gttgcagtgagccgagagcgtgccactgcactctaacctgggtgacagagtaacactccg
-tctcaaaaaaataaaaaataaataaaaaaatttttttaaaaaggagaaaagtctcaaaac
-aaccacctaactctacaccttaaagaactaCAGAaagaatacaaaaattagccgggcatg
-gtgatgggcacctgtaatcccagctactctggaggctgaggcagagaatggcatgaacct
-gggaggcagagcttgcagtgagctgagatcgtgccactgcattccagcctgggcaacaga
-gcgagactccgtctcaaaaaaataaataaataaataaaaaataaaaagaactagagaaag
-aagcacagactaaacccaaagctagcagaagaaagaaaataattaagattggagtggaag
-taaacaaaatagagtatagaaaaacagtggtaaaaaaatcactgaagctgggcatggtgc
-cacatgcctataatcccagcactttggaaggcagaggcaggtggatcacttgaggccagc
-agttcaagaccagcttggctaacatggtgaaaccccatctctactaaaaacacaaaaatt
-agctgagcctggtggtggacacctgtaatcccagctatgcgggaggctgaggcaggagaa
-tcacttgaacctgggaggcagaagttgcagtgaactgagatcatgccactgcactgcagc
-ctgggcaacagagcaagaccctgtctcaaaaaaataaaaaataaaaaaataataaatcaa
-agaaacaaaaaattgatcaatcaaattgacaaacctttagctaaactggctaagaaaaga
-agattcaaattactaaaatcagaaatggaagttcggacagtactactgaacttacagaaa
-taaaaataattataagaaaatactatgaacaattgtgtaccagcaaattggagaacctag
-atgaaacggacaaattctggccaggcgtggtggctcacgcctgtattcccagcactttgg
-gaggcaaaggcaggcagatcacaaggtcaggagattgagaccatcctggctaacatggtg
-aaaccccgtctgtactaaaaatacaaaaaattagcctggcatggatggcacgtgcctgta
-gtcccagctactcaggaggctgagacaggagaattgcttgaacctgagagatggaggttg
-cagtgagccgagattgtgccactggactccagcctgggtgacagagcaagattctgtcaa
-aaaaaaaaaaaaagaaagaaaggaaagaaagaaagggacaagggacagattcctagatac
-acatgatataccaaaactgagtcatgaagaatggaaatctttatagacctgtaatgaagc
-agtgatcaaaagccatccaaaaaagaaaaacctttgacaagtccctggtgaattctacca
-gacatttaaagaagaactaacatcaatctttctcaaactcttccaaaaaatttaagagga
-gggTCGGGGGGCTGGGAGATCCAACATGACctcatccacatgactggcaattggtgctga
-ttgtcagcaggaatgtctgtgttctcctccttgcggtcactcttgctctgttaggtcaga
-catcatcccttacatagaggcccaagggtccaacggtccaagtccaagactgaagctgca
-aggtctcttgaggcagaggctctgaaaaccacatgatgtcacttctgtcacacgctattg
-gtcaaagcaagtcacatgcctcactcagcttcaagtcagtggagaaacagactccacctt
-ggatgggaagaatagcagagtcacattgcaaaggggtgtggataagggttgggaggaatg
-tgtagccattaatttacaCCAGATAATGTGAGTGTTTGCACTTTACAAGGTCCACAGGTC
-CACtgatacagtttggctctgtgtccctacccacatctcaccttgaattgtaataatacc
-cacgtgtcatgggagggaccccatgggaggtaattgaattatggggcgggtttttcttgt
-gctgttctcgtgataatgaagacatctcaagagatctgatgtttttatcggggggagttc
-ccttgcctgccaccatggaagatgtcccttgactcttccttcatcttcagccatgattgt
-gaggcctctccagccatgtggaacagtgagtccactaaacttgtttcctttataaattac
-ccagtctcaggtatgtctttattttattttattttattttattttattttattttatttt
-attttatttttgagacagagtcttgctctgtcacccaggctgaagtgcaagggcaccatc
-tcggctcactgcaacctccgcctcccacgttcaagagattcccctgcctcagcctcctga
-gtagctgggactacagtgcacgcctccacacccggctaatttttgtattttagtagagac
-agggtttcactatgttggccaggctagtgtcgaacttctgatctcatgatccacctgcct
-cggcctcccaaagtgctgggattacaggcatgagccaccatgcccggcctcaggtatgtc
-tttattagagcgagagaatagactaatacaTCCACCAACCCTAGGAAGTCAGTGGAAGGG
-TATTTCCGTATTTCATATGGAAGTCATTTCCATATGAAAATTTAGCCAGAGGATTTCATG
-CTGGTTGTCTGAAAGCCAGGAGCTTCTAAAAAACTTTCAGGGTAGCTGTCTAAGCATGac
-ctcatgtcatcctgttgtgagtactaaattagttaattcaggggaggcactcagaaaagt
-gAAGAAAGGGAAATCTTTCTTATATAAATCTTAGAAATCTCATAGAAATCTTAGGAAAgt
-gcctggcgtgcagtaaacacgtgatacatttcagttgttattatcttcacaataattttt
-ttgggtcaggcttgttattttccctgttttacagattaaggggcagagactcagagatgc
-gcagtaagtcgcctgagggttacgcagcaaataagcagggaagccagatgagaacctaCA
-TGACAGAGTCACCCATGTGTGAGACTCCAAAGCCTCATTCAGGTGCACAGAGAGGCGGTT
-GTGAGGACGttcactgctgcgttgccttcagtagcttaacatcagaaacagcgcagatgt
-ccaccaacaggggccacccagtaaaccccagcatgcccagccaaggagtgctttgtgctg
-gttacaagaaatgaggtcacgctatacataggacatgggatcatctccaagacattctgt
-tcagtaaaaagaacaTCTGAAAAAAAAGTTCCATAACCCACAGAAAATACTGCCAAATAT
-TCCAAAAAATCTAAGTCCAAGTGTGTGTGTATGTGACCTCTGGAGGCTGATCTGAAGCAA
-ATGTAGGTGAATTAAACAATAGGATCTATTTATAGGACTCTTCTTTTCCTACTTTTCTTT
-ATTTTTGTTGGATTTTGAAACATGTTCAAAGAAAAATTCAGAGTACAATAAAGTACCagt
-cgggcatggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggacca
-cctgaggtcaggagttcgagatcagcctggccaatatggtgaaaccctgtctctgctaaa
-aatacaaaaattaggtgggtgtggtggcaggcacctgtaatcccagctactcgggaggct
-gaggcaggagaattgcttgaacccaggaggcaaaggttgcagtgagctgattgtgccact
-gcactccagcctgggcgacaagagtgagactgtgtctcaataaataaatgaaagaaagaa
-agaagaaagaaagaaagaaagaagaaagaaagaaaagaaagaaagaaagaaagaaagaaa
-gaaagaaagaaagaaagaaagaaaaagaaaaagaaccaagaagaaaaaataaTCACCGGA
-GATTCCtcccctcccctagagctaactaggctaacattttggtatatatctttccagtcc
-ggatcctgtgtgactgagtgtgtatatgcatatgtattattttCAACTGTtggctttctc
-cttgtggtccaagacagctgctccagatttagccattacatctgtttcctgccagcaaga
-aagggaaaatgggaagtagagggccttttaagtatacaacctagaatttacacacattat
-tctttatcacatctcatttctctaaatgtagtcgcatggccatcctggccagaaggaagc
-ctgggaaatgtggtctttcctctgggctgccttgtgcccagtgaaaagtcaggggttcta
-tgactatgaaagaaacaggagaatggatattgtggcaactagcagtGCTATTCACCTTTA
-TTCTCTCAATGGTAATATTTTTCCCCATCAAGAGGGGAAAATTTGTGTCTTACATTCTAA
-CCACTGAACTCCGAGAGAAGACACTGGCCTGTGCCAttctcttgcgatggagtttcgctc
-tgtcgcccaggctggagtgcagtggggtgatctcagctcactgcaacctccacctcctgg
-attcaagcaattctcaggcctcagcctcccgagtagctggaattacaggcacctgccagc
-acacccctttttagaccacatagggtagcttccgactgttgccatggcatttgtgaattg
-tcatgtgctggtgggagtgtctcttagcatgctaatatattataattagcatatatatta
-taatgagcagtgaggaggaccagaggttgctttcatcaccatcttggttttggcgggatc
-tggccagcttctttactgcatcctgtttgttttatcaataaggtctttgtgacatgtacc
-ttgtgAAACCAGTCCTGCCTAAGGGAGCGGGGCTGGCGGTTGTTCAGAGTGAACAATTCA
-AAGTCAGGTCCTCCCTCTTGGAGCTCAGAGACTTGAAGAGCAAGGACCACTGTCAGGACA
-CAACCCCATTTGCAAGGCCGGGGACACACATACAGACCCACAGGCCATTGTAGAGAAAGT
-GTTAAAAGATGGAAGTCAAGCCACGGCCACTGGAAGTGGTGTGCCCTGAGAGGCAGAGGG
-TTCTCCCTAAGCCAGGGAAGGACAAGGCAGGGCAAGACAGAAACTGGGCCTGGGGCCAGG
-ATTCCTGAGCTGGGGCTAGATTTGCCCAAATCTAGGGCAGGGCTGACTGGGTCAAGCACA
-GCAGGGAGCCAGGGTGGGTCGATCCCCCTGCCACAGGCTTCACTCTTCTGGCTCTGGTTT
-CCAGGCAGTTCTAAAAGCCTCCCAGTggcccagtgcagtggctaacgcctgtattcccaa
-cgctttgagaggccttaggcgagcagatcacttaaggccaggagttcgagaccagcctga
-ccaacatgtcaaaaccccgtctctactaaaaatacaaaaattagccaagcgtggtggcag
-tgcctgtaatcccagctacttgggaggctgaggcaggagaacccaggaggtggaggttgc
-agtgagctgagattgtgccactgcactccagcctgggtgatagagcaagactgcatctca
-aataaaataaaataaaaaaaTCAAATCAAATAAAATGTCTCCCAGAATACACCACCCCAG
-CAAAATGGCAGGAGGGAGTGTCACCTGGGGACCTCCACTTTGGAGGTTTGAGTGGGCAGC
-TTTAAGCTGGAACAGTCACTCTTGCTGTGGGTTCTCAGGGCGGAGACTGAGCCCCCACCC
-TGCCTCCTCAAATGCATTTCCTCTCAGCTCCCACCTGCCAGCCCAGGAGAGAGGGAGGGC
-CATTCTGTCCTTTTCCTGCAGAGTCCCTTTGTTCAGTTGGTGACCAACATCCTGAAAAAC
-ATTCTCAGGAGATCAAAAAGAAGAACATTTTGGTCTATGTGGTAGGTTGGCCCAGTGCAC
-CACGCCCAGTGCAGGTCCCTCTTGAAACCACCTTTGGGAAATTATGACTGAgacaccacc
-tttgcaaaattatgactgagacaatgagagatctttttttttttcctttgagacagagtt
-tcgctcttgttgcccaggctggagtgcaatggtgtgttctcggctcactgcaacctccac
-ctcctgggtttaagcgattctcctgcctcagcctcccgagtagctgggattacaggcacg
-cgccaccatgcctggctaatttttgtatttttagtagagacaggtttctccgtgttggtc
-aggctggcctcgaactcccaacctcacacctgaggttgcctcagcctcccaaagtgctgg
-gattacaggcgtgagccaccacgcctggcccacagtaagaggtcgaacttaacctactct
-atcttgcttctaacctccaagctgtccttgttcattcctgggcataagctgaactaacct
-tgggagaaacttagtttatactttaaacagccctttcccaaagcagacctccttcttgcc
-tggggactaagctgcctttgtaggactaacattagccacaaaattagaaattttggttta
-ggagtcatgcagctggaggctacaagatcctgaccctccctaaactactcctgacatcag
-ggcttgagatatttttcagaccctgcacttgatggatcagctggcatcacccacgtcaat
-aaactggctcatctgatcttgtggcccccacccaggaattgattcagctcaggaagacag
-cttggactccctgtgatttcaaccctgaccaatcagcactcctggtgcactggcttctcc
-ccacccaccaagttatccttaaaaactcttctccccaaatgctcggagagacagatttga
-gtcataaaactccagtctcccacgcagctggctctgtgtgaattactctttctctattgc
-atttctcctgtcttgatgaatcggctcttgatgaataggcagcctgcaaggtgaacccct
-tgggcggttccaCTCTTTGCCCAGGGTGATGTTATTTCTCTCCAGGATGGCTGCAGCGGC
-TTCTGAGCCTGCTTGCATCTGGTGTGGTCCCTTTCAATGTCACGCAGGCCAAAGCAGCCC
-TCCATCTCTCCATGATCTTGGCTTCCAAGGTACTCTGTCTCTCTCTCTGGGTCGCCATAC
-TGGCTTCCATCAGGCCCTGGAATGCATCCTGCTGGTTCTATCCCTTGGCCTTCAAAAGTG
-CGGTTTCCTCCTGGAAGGCACCTTCTGCCTTACCTCACACTTCCTTCCCTCCTACCTGCC
-TTGAGATACCAGCTTGCAGGGGCATTCTTGGGAAAGCCGACCCCTTGGACTGAGTCTGGA
-GTTTTGATCTCTCTCTCTCttttttttttttttggagatggagtttcactcttgataccc
-aagctggaattcaatggcgtggtctcggcttaccacaacctctgcctcccaggttcaagt
-gattctcctgcctcagcctcccaagtagctgggattacaggcatgtaccaccatgcctgg
-ctaattttgtatttttagtaaagatggagtttctccatgttgatcaggctggtctcgaac
-tcccaacctcaggtgatctacctgccttggcctcccaaagtgctgggattacaggcatga
-gccaccgtgcctggccttttttttttttttttttttgagatggcatctcactttgtcacc
-caggctggagtgcagtggcaccatcatggctcactgcagcattgaactcctgggctccag
-caatcctcccacctcagcctcttgagtagctgggatcacaggcatgtgccaccatgccta
-gctaatttttgtatttttttttgtagagacagggtctcattatgttgcccaggctggtct
-caaactcctgggctcaagcaatcctcctgcctcaacctcccaaaatactgggattacacg
-tgtaaaccaccacatccagccCTGATCTCATTCTTCAGAGAATTTACCTAGCTGGTCACT
-TGGTGTCTGTAGGAGCATCGCCTCTCAGGCCTGCCTCAAAACTGCATTTCAGTTGGGAGT
-GGGGCGGGGGGAGGGAGAGTGTAGTTTGGGGACATCAAGCGTCTGTGGTGGATCTCCTCC
-CAAAGTGAGACTGCTTTTTAATGatatttattgagcacttactgtttgccactgcggtgc
-taagcactttgcacatactagctcagtgcatccttacagcaatcctgggagggaggtgct
-tttctcatccgcatgtgctgacaaggctgagAAGAGCTGGGTCTTGCACGGTACCTTAAG
-GGCTAAAGACCTGCAAGGATGGTGCATGAAAGCAAAACCAGAGAGGCGCCTTTTCCAAAT
-GCCAATGCGCCCTCCACCCAGTCCTTCACAAACCACATCAGCATGGATAGCACCACACTC
-CACAGGCTTTTCTGCATCTCCTTTGTGTGTGTGCACATGTGTAATTAATTCTGGGGCAAC
-TTCCTACATCAGTACAGAGAAACTCCTTGATCATTATCCACTCCAACATCCTTCCTGGGA
-GGGACTGACTGGAAACCCAAATGCCCTtgtaagggcaaatacaaaaactaaaataattct
-ccctggtgcagaaaaaggaaagaaacctcccgtttcctgttcttaaacactctagagcaa
-acactttagaaaacttctcaattatttctctgttcctttaagatgtgtctttttaaaagc
-caggtgagcctcctgccagttttacaagccagggatgttttcccaaggacctaggagcca
-tctctttggaaggtaaacatcaagattgcacccttctcatccagtctccatgggcagata
-ggagcctaacttcagtgcttggctccaagttgcaaaacaatccatcgtctatcataaaga
-tgtgagtttatattttctctggataaagacaattagctaacacagatggccactccaatt
-accaggtgaattcgggatgaaataagttgcaaattgtgttgtgcagtcatctgactcgag
-aactatttttttttttttgagacagagtctcgctctgttgtccagtctggagtacagtgg
-tacgatctcagctcgctgcaacctctgcctctcaggttcaaacaattctcctgcctcagc
-ttcccgagctgggattacaggcgtgcactaccacacctggctaatttttgtatttttagt
-agagatggggttttgccatgttggccaagctggtctcgaacttctgactttaagtgatct
-gcccaccttggcctcccaaagagttgggattacaagcatgagccaccaccccggccctag
-ttattatttgaggacatgtatgcaataggttatacctgcttggttatataggaggacgaa
-atgtatttctctttgtaatctcttttgtggattgcctgtgatgcccactgcagtctggtt
-taacgcttatttaataataaaactgttttctcttctacttttgtggaaaggttttctgga
-ttagATCTTTAATTTTGTCTCCAGCATCTTCaaatgtctttctacagagggttggttaaa
-taaatgtggcatctccacaaaagagaatactgcacagtcatggcaaaaaaacaaggagcc
-tgttttcgttgttgaatgaaaagtgcaaggtgcacaacagtttactactttttctgtaaa
-aaaagaggTCTGAGAAGGCTGTATTTGCCATTTGTATAATCTCTGGAAGGGTAAACAGCG
-ACTGATAAAAGTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTAAGAGAAAC
-TGGGCAGATGAGGGAGAGGAAAGGGATGAAAACCTTTCTCTGTACACCTTATATTTTCTG
-ATTTTTTGAAACACGTGACTGTATTACCTATTCACAGTAAGTTAACAGGGATGGGAAGCA
-TGGTGGTGGCAAGCAAACGAAACCTCTAAAAAGAAGTCCCAGGggccgggcgcagtggct
-aactcttatgatcttagcgctttgagaggccaaggtgggcagattgcctgaactcaggag
-ttcgagaccagcctgggcaacatggtgagacctcgtctctactgaaaatacaaaaaatat
-gccaggtgtggtagtgcgcacctgtagtcccagctactccggagactgagaggcaggaga
-gtcacttaaacctgggaggcagaggttgcagtgagccgggatcacaccactgcactccag
-cctgagcaacaggcaggactctgcttccaaaaaaaaaaaattagccaggtgtggtggtgg
-gcacctgtaatcctagctactcaggaggctgaggcaggagaatcacttgaacctgggagg
-cagaggttgcagtgacctgagattgcgccacggcactccagcctgggtgacagagcaaga
-ctccatctcaaaacaaaaaaaGCCCCAGAACCAGACATCCTTAAGCACTTGATTCTGTTC
-ATTTCTGAGCTCAGCCTTGAGCTTAGAACCAAGTGAAAACTAATTACACATTTTCGGAGT
-TCACATTAAACttcttctttttaaaattattatttttgagacagaatcttgctctgtcac
-ccaggctggagggcagtggcacgatctcagctcactgcagcctccacctctggggttcaa
-gcaattctcagtctcctgagtagctgggactacaagcatgtgccaccatgaccagcaatt
-ttttgtatttttagtagagatgggtttttgccatgttggccaggctgatctcaaactcct
-ggcctcaagtgatctgcccgccttggcctcccaaagtgctgggattacaggtgtgagcca
-ctgtgccATGCCTGAACTTCTCCTTTGAAGGAAGATCTGAGTGTAAAAGCAGGGAATGCC
-TTTATTTAAAAAAATGAAAAACAGAAACTAAAACAAAATAACAATCACCTCTGTTGCCTC
-CATTTGAGAGAATACTTCCAGGGGCTCTGCATGTCTGGTCCCCAACCTGGTCGGGGAGTT
-CACTTTCAGAGGCTCAGGGATGGGCCTTCCCCAGCCCCACCAGCAAATCATCTCTCCCGG
-CTTCCAGGAGGGTACTTACTCTCCAACTAGTGGGCTTTATGGGCCAGGAAGGATGACAGG
-AAGGGGTGTGTGGGGTACTACGTCCCTCCACACTGAGAATCCGAAAGCCAAGATGCCCAA
-GATTCTATCGTTATCTGCTTGTCTTGTAGAAGCCCCTCTGTGAGACTGAGGGGCAAAGGA
-GAGAGGGCAGGGGCGTGTCTCAACCCTTCTGGCCACTTCTAGGTTGTGCAGACTGCCACT
-CTTGTTACTACGATGGACTGTCAGATCAGCAGGTGGCCCAGGAGGGCTTGCTTGATGCGG
-GCTGCTTTTTCCTTTTGCCTCCGTGCCATGcctgtgaggtagttggtacttactggaatc
-cccactgcatgcatgaagaaacaggcacagagaagccaaatgactttcccaaggtcacac
-agcctgaagggacagccggctgtcccagctgtttcccttctaacacccttgggcctgcct
-ccagctagatgctgcAAATCAGTCCTCTCTTGAGAGTCAAAGCAAAGGAGATCTGAGCTG
-GTCGTCACAGGTAGTGTGACACAGAGTTGGGGATAGAGCCGCACCTTGCATTTCCAGGTG
-CCATCTTCCCCACAGTCCCCAGTGGGCACTTGCGTTCATGATTCAATTACTCAGGCTCTG
-TCTCTCTGTTCCTGCCCCTTGCTCTGTGACCTGGCCTCTCTGGACCCCAGTTCCGTCCGT
-GAGCGATGGGGGCGGGGTCGGCGGCCTGCCTAGGCTGGACAGTGCAGATTGCAGAAGTCC
-GCGGACGAGAAGAGCCGCAGCACGTTGACCAGAGGGAACATGAGCAGCGCTCCGAGCAGC
-GAGCCCAGCTGCACCGCCGCCCCGCACCACAAGAGGGCGCTGCGGCTGAGGTCGCGCAGG
-ACCACGCCCAGCATCACCTTGACGTAACTGAGGCAGCCGCTGAAAAGCACCCACGAGGCC
-ACCTGCGGGGCCGGGAGGGAAGAGGTGCAGAGTCACGGGGCTTGCGGGGCGAGCGCCGGA
-GCAAAGAACTCTCACAGGGCTCAGGGGAACCCACGGAATACTCTCTAGGTGCGAGGAGCG
-CCTTCTGGGAGTGAGCCTGCGGGGCCGACGGGTCCCATGAGTTGGCCGCCCGGGGGCGAA
-GGAGAATCCAGTGGCTTTTCTGGGTTCACGTGCCCATGATCAGGGCAAGGGCCCTTGAGA
-GAAGGCCCCTGCTGAGGTACACATGGTGGGAAGAGGCCTACCAGTCACCTCGATTCCCTA
-AGCCTCCACTCCCAAATGAGGAAGGGGCGCTTCCCCCACCTGGGGCTTCCCGGGAGGGTC
-CCACAGACCCCGCTCGCTGGAAAGGGCCGCGCCCAAGCTCTCCCAGGCCTTGGCTAGGGG
-TGAGGGGTACGCAGCGGGAGCAGCCCCACCGGCCGGATACTCACAATGAGGACTTCCCCA
-CCCCAGTGGCCCTGCAAGAGGGGGCAGGGGCTCATCACCGCCATGGCCATGTTGTAGCCC
-CCAAAGCAGGTCCCAAGCACGGAGAGGACCCCCAGGAACAGCAGAGACCTAGAGGAAAGT
-AGGGGAGGTGAGTGGAGGTGAGAAGCCTGACCTCTGACCCCCCCGCCCCACTGGGCGGCA
-TGTGGATGGCCAGTGTCTCCATAGTTAGTTTAGACCCATGTGGAAAATTCCAGGTTGCCT
-GGCTCAAGTGGGTCAGGGAGGCTCCTGAGCAGGCAGGGCTGGCCTGAGTCATCCCCAGCA
-TTAACGGCAGGGCCTGGCACCCCGgcaagaaaaacataatggactctggcaccggatggt
-cctggttcaaatcccagttctactgtttaagctgAGACTCGCCTCTGAGCCTCCAAATCG
-GAGTTTTGCAAGGCTGCATGACCTCCAGGAGCAGAGCATGCAGGCCTGGCGCCGCTGTGG
-GCCCACCTGGTGTTTACCTGCTGGCATTTCCTCCTGCAACACACCCTCAGCCTCAGCCAG
-GAAGCTGAGTTGAAGTGAAGATGGCTGGATCGGGCATTGGCACAGTAGGGTTTGCTGTGC
-CTCCTCAGGAGACCCCTCCCCTTCTGGCCTCAGCTACCTGCCTCTGCAATGTGGAGTGTG
-CTGATCTCCAGGGGTCCTGGCAGCTGGCTTGTTGCTGCTAGGAGCATCTCTCTACAGGTG
-GCCTTCCATGCAAACCTACATCTGGGACCACTGTCCTTCCTCACAGGTCCTTGTCCCTGG
-GGTCCCAATCTCTAGAACCCCAAGACTGGTCCACGCCCTGGGTAAGAACAGACAGAGGTC
-TGCCTATACCCTTAAAGACTCTTTCTGCTCCAAGATTCTTGGATTCCATGACTCAGATTC
-TGTAATTCTAACATTTGGGGTTTCTTGGATTTGCAGGTCTGAGCCTTTGGTCCTGCTTCC
-CTCAAATCCTCCATCCTCTTTCCAGTTTCTAGGTCCCAAGGTAGAAAATCCAGCTTCCTG
-GCAAGCTTTCTGTCAAGCTCTTCTGTCCTCACTGTCCTTCTTCTGGGCTGGGAGAGTGGG
-TGTAAGCAGGCCAGTGAGGACAGGCAGGCCAGCGTGGATACGAGGCTGTAGGACCCACCT
-CAAATGTCAAGATCCCAAGGTGGTAGTTCTCCTACAGGGGTCTGAAGCCCCTGCCTCAGA
-ACCGTCTGGTTTCCTTACTAAAAATTGAAATCCCAGGTCCCAGTCTAGGCTGGTTCAATC
-TGCATTTTATCAACTTGCCCAGCCATTCTTCTAGAACTGTGGCTCTAAGGGAACCAGCAG
-GAGGTTAGAGGCAGGAAGGCAGGGCCGAAATCCTGGGAATTAGACCAGGTCAAGCTCTTT
-CTCCAAGCCTCAGGGTTTCCCCTTATAAACGGGAACCTCAGTGGCTATCTGCTCCTCCTC
-ATGGACTGATGACaatgatggtcaacgcttaggctggacctgccacgtgccaggcaccgc
-tccaagagctttatagaatcagctcatatcatgcttccagcagtcctaggaggtggaatg
-ttacactcccattttccgataaatatccctgaggcacagagaactgaagtgacttgtctt
-acacacagctgacaggtggcagagctgggatttggaccagggtgctccccaaacatgttc
-ttaaccactaCATGTACAGCCCAGTAGGTGCGTTTGGAATTCTGGGTTCTGAAATGAAGT
-GTTCCCCCACTAGGATTCCCTAGGACCAGATGAGGGCACACCTGTTAGGCAGGAACATGG
-AGACCAACGAGGCAAGAGGGTTGGCCACAATGCTGAGGGTGGCAGCCAGGTGGTAGGCAA
-CTGGCCCATAGGACAGGCAGGAGTAGGTCTGCACAGAGGGCAGCATGCCGTTGGTGAGCG
-CGTTGACGAAGGCCACCAGGGTATAGATGAAGGCCAGGTGCGCCGGGCAGCAGGGGGCTG
-CTTTCTCCTCTAGATACCCCTGGCCCTGGCTGCTGTCCACCGTGCCTGCAGGGCCCAAGT
-CATTCTCTTCCCGCGGCCGGATGGAGTGGAGGGTGACCTGGTCATTGAGGAGGTCTTCCA
-CGGAAGCCTCCCAGCACCTGGGTTGACGCTGGAGGACAAAGAACGCCACGAGGCAGCAGG
-CCATCATGATGGATAGGAGGAGGAAGAAGACCAGGGGTGAGAAGTGGGCGGGAAGGTAGC
-GGCTCTCCAGGTGGGACAAGGGTGCTTCCATTCCGGGGAGGGCGGACACCAAAGCTCTGG
-GAACTCCCTGCAAAGGACAAGACAGATCCCTGGTCAGGGGAGGGGATCAGGCTGCAGAAC
-AACAATCATGACAGTGATAACAGAATACAGATCACCTGTTATTATTAATGGATAATGAAT
-AAATAAACATAACTAACAAGGTGGCAAtaatgactgctcatactgactgcccactgagca
-cgggcactgtgcatggataagcccctatgcctcctaacagggctgcacagtgggcaccat
-catcccccattttagagggaactgaggtatcagaatgcttcgtcccttacctgagggtca
-cagggagaatgtggcaaagccagactccacctggtgctttctgacttggaagctacacct
-tttatcaccccacAGCAGTGGCAACCACAAACATGTTCAGAGGAGGAGCTAGCTGGAGAC
-TGAGCAGTGGAGCCGCCCACCTAAGAGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACC
-TAAGGGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACCTAAGGGGAGAGCCCCCACCTA
-AGGAAGAACACTGCTCCACCCATCGTCTAGGAAATAAGGGCCTTcaggacatgccatccc
-aaaatatgactgtaggaggccagaatatgccaccccaaaattgacctattggcatatttt
-ttatttctagctggttattttgaaaaattgcaggctaaggagtagctctgaaaagttgcc
-attttgtaagataaatttacatctaaaggaaatttttattagtaaagctatcttatctgt
-accaagaaaaggtatctgtaccacgaaggggtatctgaaccaggaagagaaaggtgatgg
-cctttatcacccgaggaacttttatctgcataacagtgcaatgtttattcaccataagtt
-tcctcccttcactctcccataatttgtctccaccatcctgcagtagcctcaagcccctat
-tcccttttgtagctcaggatgctatagaagctgaaatcatctggcccttttttgagtctc
-atattttttggggactcccatgcgtatgtatgtaagtaattaaaatgagtttcctgctgt
-tgatctgccttatgtcagtttaactcataggccgaccaaagaacctagaaggatggaggt
-gagcagtttttccctcccctacaTTTGTGATAAAGCCAAGTGCTGAGATGGCTCCGGGTG
-ATGCTGGGTACCTGTGCGATGTCAGTCTCCCTCGTGGGTACAGGGCTTGGTACGCTGTCT
-GATATCTCAGTGACATTGACGCAGGTAGTGAGACCGGAGCCCTGGGCAAGAGCCACCAGG
-GCGGGCAAGAGGCCGCTGAGTCCTTCACCCACAAAGAAGGTGGTGAGGTAGTAGGTGGGC
-AGCCGGCTCATGAACGGCAGGAAGGTCACTGAAGAGGTGCAGTCCACCAGGGCCAGGAAG
-AAGGTGAGGACCAAGAAGGCGATGCTGTGGTGGCCGTCCAGCACCCAGGAGGTCATATTC
-CAGAGGAAGGCAAAGATGATGCAGGTGACGGTTCCCACGCCCAGCAGGGTGAAGATGATG
-GGCACTTCGGAAAGGCAGCTGGGCCGGAAGTGATGGAGCAGGGTGACCAGGAGGGGCCCG
-ATGTTGGCCAGCTGGATGACCACCGTGAGGTAGGAGGGCAGGTACCAGCCCTCGGGCAGC
-TCCATCACCAGCAGGGGCAGCTCTACCCAGAGCCCATTGATGGTCACCCAGGAGCCCATT
-CCGAAGACGCAGACCAGCAGGTGCATCAGGAAGGCCATGGCGGTATCTGCCCTGGGCCAG
-AGGCTTTCTCAGATCAGCCTGCAGCGGGGCTGGCAGAGAAGGACACCAGGTGAGTAATTC
-CAGCTTCACCACCTAGCAAGATGCTGGGACCTGGGGCCCAGAGTTTTCTCTTATTACTCC
-CCTTCCTGTGAACAAGCTGGCttttttttttttcctttgagacatagtttcactctttta
-gtccaggctggagtgcaatgggatgatctcggctcagtgaccctctgcctcctgggctca
-agtgattctcctgcctcagtttcccaaatagctgggattacaggtgcatgccaccatgcc
-agctaattttgtatttttagtggaaacagggtttccccacgttggtcaggctggtctcga
-actcctggcctcaggtgatccgcctgcctcggcctcccaaagtgctgggattacagtgtg
-agccaccacgcctggccCAAGCTGTCTTTTTATTAGCAGAAAACAAGAGAAGCCTTTCCT
-AACCGTGATTCATGAAAGAAAAGTTCAATCCGACACACAAAAGCaaacaaagcagcttct
-gcaaaagataccaacagcaaggtcaaaagttaaatgaaaacacggggaaaacatttgcca
-cataaatcacagacaaagggctcatcttccttgtcaggcctctgagcccaagcctgcgcg
-tgtacatccagatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggccggtt
-cctgccttaactgatgatattaccttgtgaaattccttctcctggctcagaagctcccct
-actgagcaccttgtgacccccacccctgcccgccagggaacaaccccctttgactgtaat
-tttccactacctacccaaatcctataaaactgccccacccctatctcccttcgctgactc
-tcttttcggactcagcccgcctgcacccaggtgaaataaacagccttgttgctcacacaa
-agcctgtttgatggtctcttcacatggacgcgcgtgacattcctaatatataaagagttt
-ttaaaaatcaagaacaaagagaccccatatagaagagggccaaggatatgaacaattcag
-agaaaaaggtacaaataagctttaaacacatgaaaatattatcaccttcattcacaatag
-gaaaactactccaggtgccatttctcaccatgagattgtcccaaagcctgacaaaatgac
-tcatgttcaaggttattatagattgcgatcttgttggtaatagcaagttatgggaaattt
-tctcctgggtggctaccaacagagagggggctaattaaagggacctgctggaataccaca
-tacctgtttaaaggaataagaaataaggaaagcagatcttggtgactgataaggaaaggt
-ctccaggctataataataatcttgaaacaaaatcaaggcaggtaaatggaaccaggaaaa
-agtgtactgccttttggtcatagaagaggaggaaaaacaTGTTTTCTTTGCTTGTACTTG
-CACAAAGCAACCCTTGAAGGACACACAGGGACTGCAGGGATGTTGGTGATGCCTCTGTAT
-ATCttttttttttttcttgtgacagagtcttactctgtcaccaggctggagtgaagtggc
-acaatctcagctcactgcaacctctacctcccgggttcaagtgattctcctgcctcagcc
-tcccaagtagctgggactacaggcgcccaccactacgcccagctaattttttgtattttt
-attagagatggggtttctccgtgttagccaggatggtctcaatctcctgatcttgtgatc
-caccctcctcagcctcccaaagtgctgggattacaggcatgagccaccgctcctggccCT
-GCCTCTGTATATCTTTTAATAAGAGTTTTGATTTGTGAACCATGTAAACATATTACCTGA
-TGCAAATATATGGTTACCTGAAATAAGATTTCAATCTGGCTTTTTTTCCTCCTGAAATTA
-TATCACTCTCTACGTGGCCTTTGGAGACCACTTCCTCTAGCCCTCCAGAGCCATTCTGCC
-ATCTGTTTACCCCTTTGTCAGCTACCAGTGGCAGCCCACCTGTGCTGTTACTAACAACTT
-TCTTCTATCTATCCTTAGTCTGAGCAGTAATATGGGAGATGCCAGGAGTGAggctctgga
-gccagctgtttgagtttgaccctggctctgctgcttacaatctgggtgaccctgggcaag
-tggctttgcctctctctgcctcatctcctcatctgtaagtaggggatagtgatagtatga
-actccgtggtttgttgtgagatataaggatgctggtgagtttatgctgtttccaacagtc
-ccagcatagggtaagcacctctaagggttactgatcattATCGTGAAATGGCAGGTTTGG
-TGACATCGTTATTTTTGTCTAATTCACATGAGAATTAATACATGACTATGAAAATTTAAA
-AAAGGAAAAGATTCCCCTACTAGGTATCAAGTGAACTCACCAGTGGTATATGCACCTTTT
-TGTAGAGACACGCTAACTGGGCCAATCTTCACGTTTTGTAGATGGGAGACGAGGTCCGAA
-GGGGCAGAGGGGCTCTCCTGGGATCTGGACTGGATCCTCTGCAGCAAGCGGCCTGTCCGG
-GACTCCTCAGTTCACGCTGCAGTCTTTAACTCCATACTTCTTCCTTCTAGTACAAAGCAG
-GAGTGTCCGTTGTGGCCACGCCTCACCCAGGAAACTCCTGAATCCTGGCAGCTCCTCCCC
-ACGGTTCCCACACACGGAATTCCCTCACAGGGCTGGGACTTCCTTCCTCATACCTTCACT
-GAGCGAACCCAATGCTCAGTGGCCTTTCTGGTCACCTCCTTTTCCTCTCTGGGAGGAGCC
-ACTCCTGGGGTGTAACGCAGTCAGATCCCCTAGCAGTCCCGCTCTGCCCCCTCCCTTCTG
-GGGGCCTCAGACTCCATTCCCTCCCTTAGGAAGCTGACTTGACTAATAGCACAGGTGAGG
-CCCACTCCAGGCGTGCCAAGAGGACCCAAGGAGGGAGGGGAAGCTCCCAGACAGCAGTGG
-CACAcctttgcctgtgctgtcctcccagcctggagcaccagccccctctgctgtccacat
-ccaagctttctacaagactccgtcctccaggagacctctggctgcctcaccttctcaggc
-gtcctcaccagggcccatgaccccttcatttcaggttgttcttgtgtgggtgcatgcagg
-cacataccttgagactgaagctttttgagggcaggggctgCTTGGGAATCTGACATTTTG
-AAGGTGGAAGGGCCTTTCTCAATGACTTAGCTTAGGATTTGTAAATTGTTAACTCACTGG
-CCACTGCCAGACAGCAGATATATTACTTTGGTTTGCCCAGTGTGTTTAACAATTTGTTAC
-TGTAATCAGCAGTGGAGGGGATGGCAAGCAACCTTCAGCATTTCTGGCTTCTCAGGAATA
-TTTTGGAAGAAGTGGCCCCCCACTTTGGCCTCTTTCTCTGTTCTAGACTCGGGCCATCTT
-GGAGCTCTCCCCTGCGGTAACAtctggaaccagttgcctgggttcaaatcccagcttcaa
-cccttacaagctgagcaagtgacctaacctcctgtgcttcagagtcttctcttgcaaaac
-agctataggctgtcagtaccaacatcagaactgttgctaggaacatgcactaaagtgcta
-aaactgtgcctgccacatagtgagggctcaatgaaCCATCATTATAAGATTACTATTTCA
-GCAAACGTATCAGTTGCATTCAAAAACATGTAGTTATTggccaggcgcggtggctcacgt
-ctgtaatcctagcactttgggaggatgaggcgggcggatcccttgaggtcatgagtccga
-gactggcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaattagcccag
-catggtggcgcacacctgtaatcccagctactcaggaggctgaggccggagaacggctcc
-aacctgggaggtggaggttgcagtgagccgagatcatgccactgcactccagcctgggca
-acagagcgagactccatcttaaaaaagaaaaaataaaaaaaaGGCGCAGtttttgttaga
-caaatggccactcaactaaaggactacatttcccagccttctttgtagctgcacatggcc
-atgtcatcaagcacaggccaatgaattcaaatgcgactttgagtagtctccttagcccgt
-ttcctgtttagaaaaaaaagtgcagctcgttgccagcactcatttaattttatgtaaacg
-tgctatttgaggctgaagcaaatctgattctgactgctgttttttttttttttcttttga
-gacagagtcttactgtgtagcccaggctggactacagtggcttgatctcggctcacagca
-acctccgcctcccgagttcaagcagttctcgtgcctcagtctccttagtagctgggatta
-caggcgtgcaccacaatgtccggctaattttttatatttcttagtagagacggggtttct
-ccatgttgccaggctggtctcgaactcctgggttcaagtgatccccacgcctcagcctcc
-cagagtgctgggattgcaggcgtgagccaccaagcccagccctaaatctgactgattttc
-aatgtgaaaataacatgtaaaaactgtttttgaagttatttctaaccagaactaacatca
-gactcatctatttcagaaaaactggattcatcaaacgaatctttggtcaacaactgttca
-agaacaatgttaacatcacacataggaatgctaggatttgctattttcagcgatcgagaa
-ttactttgttttgtaaatggaaataccacgactaaaaccagaatgctacaaatagagtga
-tgtcttttgtttccaaagtcaatatactagagcaaggcaaaaataataataaaagcgagg
-tattttgtggcaaagttatcttggggtaaacactgcagtcacaagtgggtattccttctg
-gcaaacagggaaagagttaacaataagggagtgtgcccttctgctcttcctccatttggc
-tgtctggaatcagatgtgatggccagaactccagcaacgattttgtgctatgaggcatgt
-ggtgggggttagatgcatactaggctcctttgggattttgtggcagagagcacccatacc
-agccctgttttgcctgtgttgaactgttttgtttgtttgtttaatgttgttgttaaattg
-taaaagaaacttctatgttgtttaagtcactcttattttATGTACAACAAAAGTACTCAG
-Aggctgggtgcagtggctcactcgtataattccagcactttgggaggctgatgttggcag
-atcacttgaggtcaggagttcaagaccagcctccaactggtcaacatggtaaaaccctgt
-ctttaccaaaaacacaaaaaattagccaggtatggtggtgggcacctgtaattctagcta
-ctcgggaggctgaagcaggagaattgcttgaactcgggatgtggaggttgtagtgagcca
-agagcacgccagtgcactctagcctcggcgacaaagcaagactcttgtctcaaaaaacta
-aaagaaacaaacagacaaaaaCTACTCCATACTAAGTGCACAGAGATACACATTCCAGGA
-TATATATTGAAAGATTATAGTAACCAAAAACTAATGAATACATTTATCTCCTTTACCACC
-TACTTTCTGACTCTGAAACTTAGGTCCTGTCCCAACCAGGATTTGATCAAAAATCAAAAT
-TTAACAAAAGTAGTTGTTTAGACCCTTGGGGGCAAATGTCTTGCAGAGATATGAAAAAAA
-AAAAAAAAAGGAGAAGAGAGAAAGAGGGAGGAACAGAGGAACACAGAACCCTCCATATAG
-CATTTGGTACCAAAAGTATAAATTGAGACCAAGAGTCATTTCATATATCAAAACTCTAAT
-TCATAAAGGAGTCAAAATTGTAGTGACTATCTGTATTCTGAATATTTCCTGAAATAGCCT
-CAGACATTCCAGGAGAAATGGACAGAAGCACAGTCCAGCAGTACAGGCCTGACTCACCCT
-TCCAGGTCAAGACAGCAGACGAAGGTGCAAAATAAACAAGGATATAGCAAAAGCAATAAA
-TGATATACCTAGTAAAGAGGGCTAAGTCAGTAGTTAAGGGGAGTAGGCGAATTTGCAGAT
-GATGGTGACCTTTGCCATATGAAAAGCTATTAAACTAATGAGAGTGTCCAGTTAAACATT
-TACAAACATCAGTAGCTTTCCCACAGAGGGCTGGATGGGGAGATGAGGGCAGACAGGGCA
-GAAGTAGCCTCACTTTCTTGTATGTTCGACAACTCCTAAGCTCTGAACGCCTAAATCCCT
-GCTCCCCACAAAGACGAATTCTCTGGTTTTGACCCAGGTGCTACCACGGCTGTGTCACTT
-GAGGGATGGGATTTGGCTCCGGGGGTCTGTTTCCTTGTCTGGAAACCAGGCACAGTGGGG
-GTGTGTCCCCACGTGACCCATCTGCCCTATGGCCCTGGCCCACTCCCAAATTATCTCCTT
-CCTCAAAAGTGAGGTGTGCTTTTGGACCTCGGGGACACAGTGAGGAACAGTCATTAATGT
-CAATGAAGGGGATGTCTTAGGCAGAGGGAACTACATGTGCAAAAAGGCCCCAGAGAAAAG
-GAGAGACTCAGAATGGCTGGTGTTCGGAATGTGTTGGGATACTTTTAAAAGATGCATATC
-TGTATtttctgttttttttttttttgttgttgttgtttgtttgtttattttACAGTGACC
-TTGCAGTTCTTatttattcattttaaccagtatttcttgggcaccaactgtgtgctcaac
-cacAATCCCTGCTCTCAGGAAGTTGGAGGAAGCATTCACGAAGCAGAATAAAAAACAGAA
-ACATAGAGCAGGTCAGATGGTGGCAAGGACTCCGGAGGAAAGCAAAGCTCCTGAATGGGG
-AATGTGCCGCTGTCAAGGAGAGgacatgaagggagtgtgggagtgagctgtctgcagaaa
-gcacggtccaggggagaaaacagcaagtgaaaaggccctggggtgcggccacacctgctc
-tgtcccagaagtggattttgctgttcaaaggacagctaggaggccagtgtggccgcagca
-gcgggagccaggttggaggggaggagacagggcaggtcccctgtggccctgtggtgacag
-cttgggtgttttctctagagcaaaaagctccgtgagtgggcagaagagaccagctctaat
-ctagtttttaacaggatcgtgctggctgttgtgaggagaaacatgaggcgccagggagga
-agcaggagtaaaccttcggagggttaggaagctgtagcaAAAGAGCTAACAATCACCATG
-ACAACAGTGACAACCATagctgccactcctcagctatttattgtgccagaccctgtgcta
-agctctttgaacacattacctgtcaaatcttgttccacaatcctgaggctggcattatga
-ttatctccattttacagatgaggaaactgaggtttaaaagggaaataaatttgcctaggg
-tcatacagctgggagctgagctttacatccaggcatgcttgactGTGGACCCAGCCCTGA
-GAAAGGCCTCAGGGTGAAGGGGTTCTGAAGGGGCCATGGGGGTCAAGCTGAGCAGGATCT
-CTTTCTGCTCACAGATGGCCTCCCAAGACTTGGGCCAGAGAAAGAGAGAAATGGGGTACA
-GGCTCAGGAGAAGCTGAGAGAGGCTCTGAGACATATCTGCTTCCCAAGGATCCAGGACCC
-CTTATGTGATCACCAGAGACCAGAAACCTAAGGCTTCGCATGAGACAGTTAAGATGCCCC
-ATAATGCGTGGGCGACAGATAGAGAAGCTAGAAGGATCAGTTCCAGGCAAAGGTTTCTCT
-TTTGCATTCTTGCATCAAAAGCTGTGAGCCCCCAGCCCAAGAAAGTGAAGAGAATTGGGA
-GTGGGGTTCTGACCAGGGCCAGTGCACCGTCATTGTGTGGGCTGGGCCATCTCCTCCAGG
-GAGCTCAGGCAGCTTCCATCCCACCCAATGTCCCCCGCCCCCCTCCACATTCTCCTGCCC
-TCTGTTTTCCTCCATCAAAGTATTACTGACACCAGCTCAGTTACGGGAGTTTATCTGTGT
-CTATCTGTTGAGCGCTGGTCTCTCCCATTGGAGTGTAATCTCCATGTGAGCGGGGGCTTG
-TCCTCTCCCCCAGTGCCCAGGTGACCATCTGGCTTGCCACGGGCTGGGCCACCTGAGCTC
-CTGGCACCATGGCTGGGTTCTCGCTCTGCAGGGATAATCTGCCAGCTGGTAGGCACCTAG
-CCCTGTGGGCCAGACTGGAGGAAACCCGCCTCAGCTATGAGGGTTGTGTTGGCCAGGGTG
-ACCCCTGGGGCAGTGCCAGGTGGCAGCCTGACACTGGATACATCTCACTCCTGGGCAAGG
-GTCTGAGCCAATTCTTTCCTGGGTTCCAGGCTCCTGGAGAACTTAGTGAGGCCTGTAGGC
-GTCTACTTAGGGCCTGGCCTCACCCTCATGAGAGTGGGTAGGAATGGACTGACTTTGAGC
-CCATGAAGAAGGGAGGCTGAGAGGTCAAACCACAAAACCCACagggagagatgggggaga
-tgaaggggagtgagagagaagagactgagacaaagagacagaaagaaccgaaagctagaa
-gcagaaatggggagaaaggacaacagaggcacagagacagggaaaaatgagaAGCTGCGG
-CTGAGAGGGAGGCAGGGAGGTGCCAGGAGGCAGGAGGCAGCTGGGGCGCTGGGAGCCTGG
-CCTCAGCCACCCTCACTGTTCACAGCCACATGTAGCAGAAGGCCATCTCTACCTCTTGTT
-GCTGGGACCTCAGAGTTCccctgaaactcatcccaactcaatgtccctattgcacaggtg
-gggaaaccaaggcccagagaggagatagtgcttccccgaACCCTGCCCCACCCCTGATCT
-CAGGCTGTGGCAGACattcaggcctgtgctcaccggctgtgcaacctcaggtcagctgct
-caccctctctaggccttggtttctccatctgtgaaagggTCTGGGAATGCCCAGCCTTTC
-TGGGCTCAGCAGACCAGGAAAAAGGGAATGAGATAACAGGCGCTCAGCCTGGCCAGTAGA
-AGCGGACAGTGAGTTCTCTTCCCCCTTCTCCTCCCTCCCAAGGCCAGGAAGGGCTTCAGG
-CCTCCCATGGGGCTGACCTTGGTGGAGCAGCCTCCCCCAGGCCAGTTCCCCTCCCCTCCA
-CGTCCATCCCAACTCCCAGCCTCCTTCCCAGGCTCCTGCGGCTTCAGCCTGGTCAAGTTG
-TTCCGAGATAGCATGGAGATGGCCCTGGGTAAAGTCAGTGGGGGCCCAGTCttttttttt
-tttttttttttttttaagacaggatgtcgctctgtcacccaggctgaagtgctgtggcat
-gatctgagctcactgcagcctcaaccttcctggctcatgcgattctcccacctcagcctc
-tgagtagctgggactattaacccatgccaccacgtccgacctgggtaatttttgtatttt
-ttgtatagatggagtttcgccacgttgcccaggctggtcttgaactccctgagctcaagc
-gattcacctgcctcagtctccagaagtgctgggattacaggcgtgagccatgacacccag
-cATGGGCCCAGCCTTTTGGTCTGGAGGCACCAGGGGTCTGGAATTCACCTGGATGGCTCA
-GCCTGTCCCGACTCCAACATGCCAGCTGAGGAGGAAACCTTTCTTCCCTCCTGTCCCTTT
-GATCTTTCACCTGGATGGCTCAGCCTGTCCTGACTCCACATGCCAGCTGAGGAGGAAACC
-TTTCTTCCCTCCTATCTCTTTGGACTCTCCCGACATGGCAGCCTGAAACTAGGGGAAAGG
-CCACGGGACACCTGCTGGCTCCAGATAAGTGCCCCTGCCATATCCTGGTCAGTGTCCCAT
-GCTCCTAGCTAGCAGGCAGCCTTGGTAGCTGCAGCTGCACCCTCACAGGCCTGAGCCGCC
-CCGCTTTGCCCACTTACCTGCTGGTCCAGTTCCCCAGCCGCTCTGCATGGGAGGGGCCAG
-AGGCAGCTCGTTTTGTATAAAGCTGTCCCCGCCCAGAGCTCGGGGAAAGGCAGGCGGAGG
-GTGGGTGTGGCTCCCGGCAAGACCAGGCGCCTACTATGTGTCTCTGATCTGCCCTACAGC
-CCAGCTAGGAGGAGGATCCAGATGGTAGAACTGTATAATAAAGGGCTTGCTTTATTGAGG
-CTCTCTGCCACCCAGATTTCATGAGGGTTGATCCCCAGTTGACAAAAGCTATGTGCAAAC
-AGTTGGTTCTGGCATCACCCTGAGATCTCCATAATTCCTTTCACACAGGAAGAGAGTTCC
-CTGGAGCAAAAACAGTTCAAATACTGgtgcttcagtaagtcatgtggaaagcggggataa
-taatagtgccctcttcataggACAGAAATCCTAACTGCCAGTGTGCACTGAgctgactca
-gtgtcaggcatgttcttggggcttgagagaaattaatgcatttaatcttcatggcctttt
-ggagagatgctattactatccctattttccagatgaagaaacaggcccagagaagtcgag
-agccttgtgtaggtcacacaccttgtatatggcagaactggTCTCTGATGCACACTGAGC
-TACCCTGACAAATACtgtaaccacctgaggggttctttctgcccactgcataaagaaaga
-ccatgaggctggccatgccacaggggaaatgagtttgttcccaaatcatcttcaaagctt
-gtaggtgaggggtttttcaaaggcagtataggggaagagttgggggtggccaggtaacag
-gtgcttgctgctgattggttggggtggagatgaaatcatagggggttgaagctgtgctcc
-tacaggctgaatcgcttttggggggggggccacaggagcagggttggcggtcctggtgga
-gacatcaggtttaggtggagccatgggtgtcaaatctgcaaaaaacctggaaagatggcg
-gggcgtggtgggtcatgcctgtaatcccagcactttgggaggccgaggcgggtggattac
-ctgaggtcaggaattcaggaccagcctgaccaaaatggcgaaaccctgtctccactaaaa
-atacaaaaattagccgggcatgatggcggacacctgtaatcccagctactggagagactg
-aggcaggagaattgcttgagcccgggaggcggaggttgcagtgagccgagatcgcgccgt
-tgcactccagcctggacaatagagcaagactctgtctcaataaaaCAAaaacaaacaaac
-aaacaaacaaaaaacaaaaaaaaaacaccaactggaaagatatctcaaaaggccaacctg
-caacagtggtgttatttgcaggagtaattggggaagttgcatatcttataacctccagaa
-taatggctggcaatcatttatgtctacaccttaggaggacccaggctcctcttctttccc
-cagcctgatggcctctcattaactttacaaaagtggttGCTCACAGTGCTACGGCCTGTA
-AGTGCAGGGCCAGGATGTGAATGCAGACTCAAATTGGTGCCTCCatggatgtaaaacata
-ttgcacagattctgacacctagtaaatgctcagtGCATATTGACTTCTACAAATAATTCT
-GGCCTGCCTGTTGTGTTATTTTCCAAGACATTCATTTACTTAACAAGCAATCAATCACTC
-TCCAGGCTAATGCTTGGGGCGAGAGGTGAGCAGGCACTAGGGAAGGGGCCAGACCCCTCG
-CTTAGCAGGCAGGTGTTCAGGAAGTGTTGCCACtgttggggctcaggacatacacacccc
-caaaatatgactctgggaaaccagaatgtgccacccccaaatacacctctttgacatact
-ttgagctggttattcagagaaactgcagacacaggagtagctctggaaagctattctttg
-gtaaaagaaatttacatctatcaaggaaatctacattagtaaaggtgcctgtatcaggaa
-aaaggctgctccagaagaattaccctagagactttcttttttttttttttttttaagata
-caatttcacttttttttgcccaggctggagtgcaatgctgcaatctcggctcactgcagc
-ctccgcctcccgggttcaagtgattctcctgccacagcctcccaagtaactgggattata
-ggcgcacgccaccatgcccagctaattttgtatttgtagtagagacaaggtttcaccatg
-ttggccaggctggtcccgaactcctgacctcaggtgatcttcttgcctctgcctcccaaa
-gtgctgggattacaggcttgagccactacactggccaccagacagacttttatctgcaca
-ggaagacaaccattatttaccatacaataattcttcccctcaccctcccataactgtgtc
-tccgccaatcccccaaagccctaagaccctattccttaaacttcaatcatctgacccttc
-tttgagtctcatattttgtgggatttccacgcacagatatgtaattaaatatggtttctc
-tcctgttactcagtttcatgtcaatttaattcatagcccagccaaagaaccatgaaaggt
-ggagggaagccatgtttcccttctctataGTACCAAATACTTTGGATCTGTtaaaaaaaa
-attgcaggactctaaatttatgatgccaagggagaagttaagccttgcagagtgTGAGTT
-ATGTGGCTTGCAGGATGGCCACTTTCTtcttctttttttttttttttgagacggagtctc
-actctgtcgcccaggctggagtgcagcggccaggctggtctcgaactcctgacctcaggt
-gatctgcctgccttggtctcccaaagtgctgggattacaggcatgagccactgtgcctgg
-cCAcaatttcatacttatctctgccaaatactataaggtgtcaaaatttggcatagaggg
-tacaaaactataactcaatccaaacagaataatctttgcttgtataattttttaataatg
-aaacatcaatattggtttaataaaggcagctatatcttgaactatttagttaaataccct
-aacttctaatcctgtggccttaggaagtctagtctacagacgtgaaggaagtttctttag
-ggaaaggacttatcatctttgatattaaagaaaagagaatttatataaaaataatcttat
-atggtaaattcttgttctaaagtaaatgaattggttgtttaaaaagaaggatgtttacaa
-cgagtcagaaagttgaggcatgtcagagattgtgtaaattgtaaaaattttataaaaggg
-aatttatgcaagaaatgttgtacagtttaaaagtgatgagggggccgggcacggtggctc
-acgcctgtaatcccagcactttgggaggccaacgcgggtggatcacctcaggtcaggagt
-tggagaccagcctggccaacaagatgaaaccctgtctctactaaaaatacaaaaaattgg
-ctgggcatggtggtgggtgcctgtaatcccagctactcgggaggctgaggcagaatagct
-tgaacccagaggcagaggttgcagtaagctgagattgcaccactgcactccaggctgggc
-gacaagagtgacattccatctaaagaaaacaaaaacaagagcgactaggcctcctgaatg
-ctttataaaatgccaccataactcttaactgtacaacttgcctgctttgtagctgggtaa
-gacctagcacacatggagttaaatgctggaataagtcagaccttatctgcacttctgtct
-aggtcctaggctctacatctagtacataattacaatctcaaactgactaacaaaagtaaa
-agttgctaaaagttaacagtgtaacatgtattgttccatagaaagaatctaagataagac
-tgtaaagctgaggctagccgtggaattgtaccattaaatacctatgagtttcctcttgag
-gttgcaagataacctagggttcccggcctctcagaaagggcattctttgcttaccacaga
-tcagaagccctatacagggactgtgtacacaaaatataaggccagtttccaagggctttc
-ttggcttcgtaaatcaagtttgattccttaaaggaaagcataccattccagtcaaggcct
-tggtaaaaaaaccagtttttccaattgtgtcctgttacaaaagaaaacagattcttatta
-cacttgtgcaaataactatatcgccataacttaagaatactcacagatagtttccaaatt
-ctggagaaaatcagggagagagaaacaagtatgctacaaattttgttcatgggagtatac
-taaattgttaaaagctgttaatagctcaaaagaaaaatttcgaggccggatgcagtggct
-catgcctgtaatcccagcactttgggaggccgaggcgggcggatcgcctgaggtcgggag
-ttagagaccagcctgaccaacatggagaaaccccatctctactaaaaatgcaaaattggc
-tgggtgtggtggtggcacatgcctgtaatcccagctactcaggaggctgaggcaggagaa
-tcgcttgaacccaggaggaggaggttgtggtgagccgagactgcaccattgcactctggc
-ctgggcaacaagagcgaaactccgtctaaaaataaaataaaataaagaaaagtttctttg
-actttgaaaagcaaaacaaagtattagcaatattttaagcaaaatatcaaaaagatcact
-ccagtctcctattagttcagttcgtgcagttaattcctgtcctgcttgatattaatgaac
-attttagctaagagtcctaaccatttttcctgtattctgatgtcacaatctccaaattta
-tcagaaacctgcattcaagaacacctgttagagctttatagctgagtataaaacccttct
-aaagaggatcaaaacaagacaacaattgtttatggatgaccaaaagttttagggtagcca
-tagttaaagacacaattgacaaggaaatctgttacttctgtggcacacaataattttaac
-ataacaattataattactactgataacacacactaagacatatcagaattataggagtct
-cccataactttggaacacataccaataacatatttatacaaatatggcccaaagaaagcc
-aaacattattttatatttgacaatgcttcctgtatgacttcataccaaataagccaaatt
-ttacctttatattagtgtgttattaatgttaaactcaattttaatgttttgatcataagg
-tcagattttcatggacccttttttttttttgagacagagtctcgctctgtcgtgggcgac
-agagtgcagtggagcaatcttggctcactgcaacctccacctcctgggttcaagctattc
-ttctgcctcagcctcctgagtagctgggactacaggtgcccaccaccatgcctggctaat
-tttttgtgtttttagtagagatggggtttcaccgtgttagccaggatggtcttcatctcc
-tgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgagccat
-tgcggctggcctatagaccatttttaaccctttataatttttgtcaaagagcaggttagt
-gctttaagaaaaacccattgtgcttttattttaatactcaatttacagaaaaactggatg
-atacacctttaactttagccaagatgtttacacacagtatttcctttacaattaaccttc
-caaaagttgcttaaaccttcatttttattttattcaacttaaaacaattctttaaccttt
-taatctaggtaaaaatccacattctcatgcctccttataatctttttaccaaaagtatat
-gtaaactgttttttcaatagtcttaaatacatgttacactgttaacttttTTTTTTAAGG
-CCTACGTAACAAATAATTATTCTTggctgggtgtggtggctcacgcctgtagtcccagca
-ctttgggaggccgaggcaggtagatcacctgaggtcaggagtttgagacaagccttgcca
-acatggcaaaaccctgtctctacaaaaatacaaaaattagctgggcgtggtggtgggtgc
-ttgcaatcccacctactcgggaggctgaggcaggagaatcacttgaacccgggaggcaga
-ggttgcggtgagcttagattgcaccactgcactccagcctgggtgacaagagcgagactc
-catctTGGGGGGGAaaaaatgggaaactggagagagaaaattacatttcagaaactataa
-cacacctgttattaaattccagtgttgcctaatgttgttcaatttttattactttaaatt
-aaattctaatttttctgactacgagtttccaaaataagctttgttttcttaaagccctat
-gaactgaaaactagacgtttcagcaggcactgcctctaaacgccccccagccatcacagg
-aggaaacctcttcactgctggagctgacaactaataactgagcgtgcctggaatcctttg
-cccccacatctaataagtccatggaacccagggtaattgagatggcatctcttacaagaa
-tcaacttctgggtcaggtgcggtggctcacgcctgtaatcccaacactttgggaggccaa
-ggtgagtggatcacttgaggtcaggagtctgagaccagcctggccaacatggtgaaaccc
-catctctaccaaaaatataaaaaagttagctgggcatggtggtgcatgcctgtaatccca
-gttattcgggaggctgaggcatgataatcacttgaacccaggaggtggaagttgtggtga
-gccgagatcgcgccattgcactccagactggcgacagagcgagactccatcttaaaaaac
-gaaacaaaacaaaaaaacaggaatcaacatctggatacattacactcgagtcaaagcctg
-gaaagctgaggaagcaacccctgatagccaaaggaacatcctaaatatcagtgtaaagaa
-ataggaaattttaagctcataaaaggtaagtaactgagtgagaactacttatcttactca
-gtctcacccctacctcaccaaatacttttagatgttcctacctctccttttaagacaaat
-attaaaactttttaatggaaattattcactacaccaccattgtgggaactgctttacaca
-ctctattatttgcagtgggactatgtactacagcaccctcaggatggaatatcagacaga
-gaatctcaattatggtaccattttgcttaattattatcctcatagcaggaataacagtta
-ctaacagcaaataacacatgggcctttccagacatgtgcctctgcctgtcattgggtgag
-gaatgttgtttctatatcaaccaattaggcctagtaagaggtgctgttgaaaaacttaag
-gaaagggctataccaaaacaaccaaatagattcttggtttaggaacaaaatcatagcatg
-ggtcatcccattcctgggacctttcctaataatatgcctaggactaatgttcttaccctg
-cctaattaacctttttcaaagatttttaactgacaggatcatggccatttcacagacaac
-tacccaaaaacatccacagacagcgttactgctacagttaatccaagaccagaaaactct
-gtcccctcatcagcaggaagtagccagaaagaacaccctgcctttcatcctttttataac
-tataaggtctggattgacagagcaggagcattgccatcttggacaagcactgccattcta
-aagttccccttgatcaaaaaccacctaaatccaaagggcatcagcctaatggctaaggtc
-agcatgaccataaaccacaaatgacatctctgaccagaaacattccaaccataagttaaa
-gccctccccgaccagagacgtgccagccccaagataacctcccctccaggtggagagatg
-tcagccccaagataccgtcccttccaaccagagacattccaaccctcaatagacttctcc
-cctacacaggaacattccaagcctgtgataagctctcttacccagaaaccagtaaatacc
-cttagtatgtaagagagagcattcctgactgaaattggacagaggcccctctcaggttta
-ttcttcaaaataaacctgtctttgactgttgagcctcttttcatgtttctttcctctttc
-ttgaactcttacaACACCTTTGTTAGGCGCAAATtttcagtgctgcaaaagaaatagcac
-tcgaacataaatttaattttctcagcaaggcaattttacttctatagaagggtgtgactt
-gtggatggaacaatggtgagagcacacctgaacaagggaggggaaggggtttttattcct
-gatgcaggtagcccctactgctgtgtggttcccctgttgactaggattggaccacacagt
-ctaagctaattccgattggctgttttaaagagagcaggggtacgagtcggagtagcggag
-tgagtagtttggcgggaaggacagttaggaacaggtgactaaaggtgactcaggtcagtg
-caggtgaccaggggtgactcaagaaggagcaggtgatcaggggaatagatgtgaactact
-gattagaactggtggaaaaggttgtttactgaaactaggggcaaggaggcaaagagaatg
-agaaagttaaactttaaaatggagaacaaagaacaggggacctgaatatactcatacatt
-ggttccttggagaggatctcagaactcattgtacttaacaATTTACAGGCTGAAACATTT
-GAAAAGGAATTTGTTATATCCTACAatttccccctttcaattttcatagtacttcctctt
-caaactttttaaacatgtcttggcttagctgctcgacttaatcctctaaaagaaaaagct
-tatctgaataaggtggaggtgagttaaggaagattttagtaagtgctgcttttataagtc
-tttgcactagcccacagatgcatggtatgacataacacctaacaagaatgagtacagcta
-ttacggctgcaagagaagtaagaattgaggctgtgatttctttccatttactgaaccccc
-tttctagccaccctgagaaagggttatcgactccagaattttagctagttcattggatag
-agtggtaagtctttataaggcccttgttatgttcccagtgtgggcagtgttatttgggat
-aaaggtacaacactgagttttaatcataatacaaacaccactttttctgctaatatcata
-tctggtgccattctgttttcccaggccatctggctagtgggccccaattgttctgctatc
-cctttgacagcatccctggtgtaattaataaactgctgctgattataatagatgtaattt
-atccagtctacatttttattaatcgtcacccatgaaaatattgacttaaatcctgcagct
-atttgatctcgggctttaaattcatctggtactcctagtggaactccagtaatgtttata
-taaacatgggggtcaaacgactcatgtaaggcacttcttttacaattttcttttttatca
-tgttgacggaatgctagagtgaaagggatggccaattggactagagcacgagtgctgctc
-taattgcttggcagagtatccagcaatagtgcccctcaatgccaccacacacctgctcag
-ggatgaacaagggcagactgatgggtaagctcttgaaaaggcttggtttcaccgcaccct
-gttaagtctccaaggaatgctaacttttccccctgccgtgaaagggacaggtgaacttaa
-catcaggggctggaggctggatggccctccgggctgacccacagggctcttgacctcggg
-gaagagcagtgaaagcgaacagcagtgaaagagttttgcctgactcattgccccggctgt
-ggggttctggaagagagctaccatacagctcatgccctgtccatgagaggaccactcgag
-gggaaaggggacaatttgggtctctggcctgcctgtcgcacaagcagtcacttttgttta
-gcatgcgaacagaatatttaatccatttcagccaagcatttacatcctggtactctgttt
-caattgctatagtttgttttaaatctataacttctacaacagctactttggttttatcat
-tgggtatataacgaaagaagatctggttagtggagaacttaggagtgggagaagggggtg
-caggagttgaggaggcaatgaagcacatttcaaaggatcctctggggtccttccctgaga
-cttctgctcctataccatagaaacggtactctggggagcagaggtggtaatctgtactgg
-attacattggttcatctgacaatggggtggtccatccttgctccttggtagtccataagc
-cattagaccagctaaaagttctgttctaggagggcaagattcctagttcatactgggacc
-atcatcaatatcttcccagactaactgatcccagttaacagattttcagtctgaggagag
-ccaggaaggacaaagatacttttctgaaggggagagttgcctctggtttggcagatctcc
-acaggtcatcccaaggcaagcatcaaaagtaatagtttggggcgaacttgttacataaag
-aacgagaagactagcaatagaaggggaaaagaaagagatggaatgtaagaggatcaaacc
-cgttttagctttagcttggttggagttggccctggaatagctgtccatgattctggaggg
-ggtggtgctcttttgacctaggtgtgatgagtccatcctctttctgctgtttgaactgtg
-gtctcggtggttagaagcaacaggtagggtccttcccaagccagttcgagtttcccttcc
-ctccaacttttgacaaggacacagtccttaagctgatgttggtgtactggaaactgtagg
-ggtggtacctgttctaaaagacctttagttctgagggaagagaaagtggaaaataaacca
-agtatataatttctgagaaactcatcttttgttttgaacataggaatgtcagcagtggag
-tgtaaacagggcaacctacacaacatttcataaggggataagccaacatctctctgagga
-gcagttcagactctcaagagggcaatgggagagcatctatccatggcaaccgagtctcta
-agactaatttggttaggtggccttttttttttttttttttttttttttgagagggagtct
-cgctctgtcgcccaggctggagtgcaatggtgccatctgagctcactgcaacctccacct
-cccgggttcaagtgattcttctgcctcagcctccctagtagctgggactacaggcacgcg
-ccaccatgcctggctaatttttgtatttttagtagagatggggtttcaccatattggcca
-ggctggtctcgaactcctgacctcgtgatccacccgccttggcctcccaaagggcttttt
-ttttttttttttgacagggtctctctccgtagcccaggctggagcgcagtggcgcgatct
-cggctcactgcaagcaccgcctcccgggttcacgccattctcctgccaaagggctttttt
-aaaaaatagtttggttcattctttccactcttcttgatgaaggtaggtgccagggagtat
-gatattcccatgttatatccagtatctgggctaatttcttaatgacatgtacagtgaaat
-gagtcttattatctgaatcaatgttttctattaatctaaacttgagtataagattttcaa
-ctaatgccctgtctatgttattatcagttgtacttgaaaaggaaatagcttctatccaat
-gagtaaggtgatctactatactaataaatacttcagatgatcagttggaggcatctctgt
-gtagtcagtctggatactttggaatggccttaagcctggactccttcccccaaggggtaa
-tgttttactaaacaactgtctgtaacctgtttggccagggtataaatcctatgcacccat
-aaactctgatgaatgtgtcacacgaggcttggggcctccaatgggtcctttaatgcagtt
-ggaataagacttccctcataaggggtttggataacatttctctctggtctagcaatatcc
-attttccttctgaattctctttagcacctatttttattagtttttaaaccaaagaaagcc
-aaacaccattttatatttgataatgcttcctgtgtgattttataccagataagctaaatt
-tcacctttatattagtgtgctattaatgttaaactcaattttaataaaatcttgtagaca
-tatttattcaattttaatgtctgaccataaggtaaaattgttatagactctttctaacgc
-ttcataatttttgttaaagagcaggttagtactttaagaaaaacctgttgtgcttttatt
-ttaatgtccagttcacagaaaaactggatgacacccctttaactttagccaatatgttta
-cacacagaaattcctttacaattaacatttcaaaacttgcttaaaccttcaaaacaattt
-tttaaccttttaatgtaggtaaaaatccacattcttatgccttcttataatccttttacc
-aaaagtatattttactttccttacacgccttgaacataaactgtttcttcaatagtttta
-cattcaggaggcctaattacttttaaattatacaacatttcttgcataaattccctttta
-taacattttccacgactttcacagaccatctttgacatgacttaaatttctgacttgtga
-acattcctttctttaaacaaccagttaatttattttaggatgagaatttaccgtataaga
-ttctttttacataaattctccTTTTTTCTTAATGTcaaagatgataattgttttttccca
-aagcaaacttccctcatgtctgtggactagactgcctaaggccacaagattagaagttag
-gataatacatgttacactgttaacttttagcaaattttacttctgttgaaaaccttgtaa
-gtttggaattttaattaaaggaaggcttttttggtgtccggggacatggacaatagttat
-ttttttggcaactgaaggttatttaatacttgggtgattaattcctcgtggaccgggtct
-tgacctttgctattaataagacctggttcagtccaaatttttccacatgcatgagccact
-ccaaaggcacactgaaaattggtatagatggttccttcctggttctgtaagtactttaag
-gcttggctgagtgcaaacagctcacacgtttgagcagaccaattattaggcaattttcct
-aactctatctctacACCTTTAACCATTGTTCCCTATTTCTCATTCAAACTTGGACATAAC
-GGTATgtgaaaaagagcctcttgtgactgttacctctttacaatggaatgttaagcaacc
-cctcagaaagtagggagtagcaaatcaaatctttgtaactacatttcagcctttgccggt
-tgaaatgtcagagccccggcatcagaaagtggtcaactcaagggctgataagaagaattt
-accaacaacagtataggtttgaaaagtaaagttttattagaaagaaagaacattgcagaa
-gagtgcagcgaggtgcctcagcaagaggggactgagagggctgtggtggatattccttag
-gcgcatatatgaaccttaaggcaaaagcttgagggtaatttggagcatactagccacgta
-ggttatgataaatggttacatttgtagttattttggtgccttaatgtcagcaaggattgc
-acagtgagtttcgcatagaaattctggttactacaaaatttttgaaagacccctggaacc
-agatgccaactttagatatgtcgatgaagagtcaaactctgtaaaatatttgaagagatt
-tattttgggcgaaatacgagtgaccatggcccatgacacagcacttaggagatcctgaga
-acatgtgcccaaggtggttcgggcgcagcttggttttatacattttagagaggcacgagg
-catcaatcaaatacatttaagaaacacattggtttggtccagaaaggtgggacaactcaa
-agtgggaacttccagactataggtaaatttaaacattttctggttgacaattggttgaat
-ttgtctaaagacctgggatcaataggagggaaatgtttaggttaagataaaacattgtgg
-agaccaaggttcttttgaagtcttatagtggctgtccttagagacaatagatgacaaatg
-tttcctattcagacttttaaaagctgctagactcaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaggctgccagactcttagttaatctcagagggcctggaagaaaaagatctagctatat
-taatagagattatttacagatgcagatttccccccacaaaggacagctttgcagggccat
-ttcaagatatggcaaagaaacatgtttttgggtaaaatatttttgctttcttctttgtca
-cataatgttatgccagagtcagattggaaagcaagtcagatatataggtttaaataaaac
-ccatctgatgagaatttatggtttgtagggcatgactccccagaccccttagataggaat
-ttcagcaaaataaaaagatcagagcttagtcctcataatcaagaaataaccataaaaatg
-ggcaaccctatggagtagccattcttttattcctttactttactaataaattttcttttg
-ctttgcactgtgaacttgccctggattctttcttgtgtgagatccaagaaccctcttgtg
-gggtctggattgggacccctttccggtaacGATTAtacttctaaattcctcagataagga
-gtttttgtctcgggctgcttcagggtcaccaggtgatttttgctctcctcaCCCCTTTGT
-TCAGCTTCTCTGTTTTTGCCTATGTACACAACTCTCAGATTTGGCCACtggggagagcaa
-agttatacctggtgaccatcaagcagaccattcagagacaaaactccttatcagaactcc
-ttattcagaagcaattagacttccctattatctaaagcaggcatctcattccaggcttct
-ttcccccaaatttataagtaactagaatttctatgcatctctggaatgcatgcatatcaa
-aactcacggtgcTgaaaatttgcatctgtaaagaatctctattaacatagctggatcttt
-ttcttccaggccctcccaatcctgaagagattaactaagagtctaacaccttttgatggt
-ctgaataggaaacatttgccatctgttgtctctaagggcagcgaacataagacttcaaaa
-gaaccttggtctccacaatcttttatcataacctgaacatGAGTCTCTTGCTGATATTAA
-GGCATTGAAACCACCTTTGCAAAATTATTACAGACAGcatcattgcaggaatccaggaca
-ctggagtagaggatgttccatacctttgggttacaagccacccccaggaccttgtcctca
-ttgcaaacaagagggtcattgtgatatggaaggggggcaggggagtgctgggtacagaaa
-tgcagggttcctggtgagggctccacccttgggcctgtgcccacagacctaagtaagaac
-aggcactcctgttttcatgcctgaatgttgtattttccaagaccactctggcccaccaca
-tccccttcctgtgtccataTtgttaaatatgaattctaaatttctcttcaaagaattaat
-atgtcagtatgttcaattctttgacttctgcttttaaatttaacttcctcgtaaagcaac
-ctttttcgattacctgctccaccctgactcattccgattacctgctccaccctgactctt
-gcaggttacttgctacctgctccaccctgactaattattctccaccctgcataaccattt
-ttttttcccgccaaagcactcatcctgtcacactctttaaatctgccaattggaattagt
-ttagcctgtgcagtctaaccctagccaataggggaacgacacagcagcaggagccttgtg
-cattagggataagaacccctttccctcccttgtccaggtgtacactcaccattgctctac
-ctgtgagggtgcacccttctatagaagtaccttgccttgctgagaattaaaaagaaaatt
-ttatattcgagtgctatttcttttgcggcactgaaactttatatgtaacaatttgggggc
-tcgccctgattacatttccctctggggcagtctctggttctctcttgtgaggagcgctcc
-gccccctgtggcggcctcagccgggagaaatcagaacccacccagtgcgaggaacaaccc
-gagctgtcagcaacaggggggaagaaaactggccggcaacctagcttaaagaatcctcac
-atactgcagcgacgactctgcgcacagagcaaggaaggagaagccgcgggagctggtaaa
-gtatttccttggtggtcgggaccaaggtaagaaagccacgggggtggtgggcggtgaagt
-actccttggtcagggtggcttagaggttaaaaagaggtgagacatccccattggcggaga
-ttgaacctcacacaaacctccagtagtagaaaaggcaagaaatttccagtggggaaattg
-agcctcaccccaaaaggtaagaaatttccagtaagggaaagtgaaccttgaaccttatcc
-caaaaccatcaagatgggaaatatcccaagcaagacagggagcaagggggataaacatgg
-taacaaagatatccctccagatggccccctaggtctcatgctaaaacactggaaggataa
-tgaaaggatacacataggaaaaagcaacaaatggtaaaatattgctgttttatttggagt
-cagggacccatcctcagtccctcaatcttctggtcaaagtttgggtcaaatgagaatgta
-atgtgtcagcttctaatccgatacgttaatgataaaagtccagtgtctcaagaagaacta
-ggctatgccctttgttggaggcaaggacctgccctcctatttctcttaaaaataaatagg
-gaagaacccaatctggcacctcaaaatgaaaagtcagaggagccagctctcatgcctaaa
-gactccagtgctgcatggtatcccctagaccatcttcccccactcagtgtccccaaactt
-tcccctcagacagccactgccacctcagatcaccactgccacctcagatcctgttccaaa
-ttccccctctactcacgctatccctcctccttataaccctgactgttgggaattaccatc
-ccaccagcctgttctctcccaacctaaagacccctctctaaaaagactccagcgtgaggt
-agaacaatgtaaaaaagatattcagaatttcctatttccctccgtacctaagaggtcagc
-ccctaccctcttccctttgaaagaggtaccacaagttgggggcgggggggggggcattga
-ctttgtaaatgctcccttaatcagttcagaagtccagaattttacaaaggagcttaaact
-gctgctggacgacccttacagagtggcagaccaaattgaccaattcttagaacctcagtt
-atacacttgggtcaagttaatgtccatcttgggcatcctcttttcagggtaagaaaggag
-tatgattcttaggtctgctatggtagtttgggaatgtgagcaccctcccaatgaaaacgt
-tcctaccacggaccagaaattccccgcccaggaccccccatgggaaaataacaatgcaga
-tcaccgggaaaatatgcaggacctaagggagataataaaaggaattcaggaatcagtacc
-ctgaacccaaaatctttctaaagcatttgatatacaacaggaaaaagatgaagggcctat
-gagattcctagacagactgagggagcaaatgaggcaatatgcaggcctcaatttggatga
-tccccttgggcaaggaatgttgaaactccaatttttcactaaaagttggccagacatttg
-aaaaaaaaagttacaaaagatagacaattgggaagaccatcccttaagtgagcttctcag
-ggaagctcagaaagtgtatgtgaaaagggacaaagtaaaacgaaacaaaagacaaaactt
-atgtttttcaccttccaacagatggctccaaacccaggtacttctagatagagtttccag
-ggagccagaaactataaagggtccgaatcctcttttaaagaaccccagcctccatctgga
-ggaccagggtccttgtctaccaagccccctaaagagtatgggggagaagggttaaagaat
-cccagaactaaggggaggaaggacaaaataggtgctatagatgtggaagagcagaccact
-tcaggagaggatgttctgaactaagaaaggagaaagaagccctttcactcatgactttca
-aggaagaatagcggggtcaggggctctgtctcttttatcttgagtcccaccaggagccct
-tgataaatttgggggtgggacctaaacatgagcttatcacctttttagttgattcggggg
-ctgctcgctcctctgtttccccccatctaatgttgtctccttcttagaggaacttttagt
-ctccagggtaaaaggtgtaggattaagagcaaaaattttagaaagcactgaagttagata
-ccaggatcgctcagcttatattcagttcttgtttatccctgaagcaggaactaatttact
-ggggaggaatttaatgttaaagttgggcataggtctacaagtcagcccaagaggattcct
-cacctcattaaacctactcaccaccgcagatgaaaaatatattaatcctcatgtcttgac
-caaagaaggaaaccaagggaaactctaagtccctccgatccacatcaagctaaaaaaccc
-aggggaagtagtaagaaggaagcaataccctattcccctagaaggtaggatagtgttgaa
-acctataattgaaggccttatttaggatgggcttcttgagccctgtatgtctccttataa
-catcccaatcaagaatcaagaaatcaagactgctaccagccagtcaagaaattagatggg
-tcataccagctagtacaggaccttagagctatcaaccaaatagtccagagtacccaccct
-gttgtcaccaatccttacaccattcttagcaagattccatataatcatcaatggtttact
-ataataaatttgaaggatgctttttgggcatgtcccctggctgaagatagctgagatata
-tttgcttttgagtgggaggatccatactcagggtggaaacaacaatatcgatggaccgtc
-ttgccccaagggttcacagactcccctaaactttttggccaaattttagaagaagtacta
-gaaaaagttgtcatcccagaacaaatatgccttcttcagtacctggatgacattcttata
-tctggtgaagatctagagaaggtaactgacttctctacacatattcttaaccatctgcag
-tttgaggggctatgagtctcaaaaagaaagcttcagtatgtagagcctgaagttaaatat
-ttaggccacttaataagtgtaggcaagcgaataatagggcctgaatgaattgagggaatc
-gtgtccctacccttgcctcaaactaaacaagaactcaggaaatttttagggtcagtcaga
-cactgtcgctaatggattgactcatatacactgccccgtaaactgttctatcaaaaactt
-gcccaggagaagcctaaccgtctcctgtggacttctgaggaagttgatcaaatcgagagg
-ttggaggaaaggctcataactgcccctgttttaggcttaccctccctagaaaagccattc
-cacctttttgctaatgtggacagtagggtaccttcgggagtgctgactcaagaacacaga
-ggccgccagcagcccgtagccttcccatcaaaggtcttagacccagtcacttgtggatgg
-cctcaacgcatccagtccatcgctgctatggcaatactaggtgaggaaagcagaaaatta
-accttcggaggaaaattgacattaaacacgcctcaccaagttagaactatcttaaaccag
-agagcagtgagatggcttactgacttgagaatcttaaagtgtgaggccattctgttagaa
-aaggatgatttaacattgaccactgataattcactcaacccagcaggtttcctaacaggg
-aatccacatctaaggagggaacacacatgtttagatttaattgattaccatacaaaggtt
-tgaccagacctgggagaaacccccttctggactggacggcacttactcatagatggttcc
-tcccaggtgattgagggaaaaagacacaatgggtattcagtgattgttggagaaactctt
-gtagaaataaagtcaggaaaattgcccaacagttgatctgctcaaacgtgtgagctgttt
-gcactcagccaagccttaaagtacttacagaaccacatctatacagattccaggtatgcc
-tttggagtggcccatacatttgggaaaatttggactgaacgaggtctcattaatagtaaa
-ggtcaagaccttgttcacaaggagctgttcacccaagcattgaataatcttcagttgccg
-gaagaaatagctattgtccatgttcccggacaccagaaaagcctttcttttgaaagttga
-ggaaataacctagcagatcaggtagccaagcaggctgctgtgtcttctgaaatgcgtgtt
-tttcacttaactccctacctccctcctcctaccataatccccattttctcttccaccgaa
-aaagagaaactaataaaaataggtgctaaagagaattcagaaggaaagtagatactgcca
-gaccagagagaaatgttgtctaaaccctttatgagggaagtcgtatcccaactacatcag
-gggacccattttgggccccaggccatgtgtgacgcagttctcagagtttatggttgtata
-ggaatttataccctggcaaaacaggttacagatagttgcttagtatgtaagaaaactaat
-agacatactataaaatgattacctctcaggggaaggaatccaggctaaaggccattccaa
-agtatctaagttgattacacagaaatgcctctgatagatcatctaaaatatttactagtg
-atagtaggccacctcactccctgggtcgaagctatccccttttcaaatgcaacagccagt
-aatgtagttgaggccctaattgaaaatatagtacccaggtttcgactaacggaaaatact
-gactcagacaatggaactcatttcaccacacacattattaaaaagctattccaaaatatt
-agacattagatgggaacaccatactccctggcacccaccctcatcagggagagtagaaag
-aatgaattagactctaaagaaccacttaaccaaattagtcttacagacttggttgccatg
-gaccaagtatcttcctatcaccctgctgagaatttgaactgcaccatggaaagacattgg
-tctttctccttatgagatgctctatggattaccttatttgcactccactgttgatattcc
-tacctttgaaacaaatgatcaattccttaaaaattatatacttggtctatgttctacttt
-ctcctctcttaaaactaaaggtctattagcacaggcaccacccttggagttcctggtgca
-tcaacattagcctggggatcacgtcctcatcaagagctggaaagaggagaagcttgagcc
-agcctgggaaggtccttacttggtgctcctaactactgaaaccgcagtccgcacagcaga
-gagaggatggactcaccacacccaagtcaagaaagcaccgccccctccagagtcgtgggc
-catagtcccaggggaaaaccctactaaactaaagctaagaagaatttaactccctttcat
-ctattctattactcttttttctttcctcactctattgctgaccatatagttattaacata
-accaagtcaatttcacctcaactattgcatttgatgcttgccttgttatatcctgtgggg
-atttgtcaagccaaagaaagctctctacttcagatacctctgtccctcctggctctcctc
-agactaggcattagtgaatcgggaccatttaatctggggagatttctataaagatcccag
-tggcaaccaggagtcttcccccagtgatgtagagcttttaagccatagttggtccaaagt
-tctgtggaccattaaagagcaaggatggattgccccaaccagtttttgtaatttcctaaa
-ttcatacattcgttttactaaagggacagtgcccactaactctcagctaaaccagtgcaa
-ccctatacaggttattattttgagcccacaaaattcttcctcttttctaagctggttccc
-ttctttaagccagttttatggtatgggggctgaagtttcagggacagaccctattggatt
-ctttgaaatgcacttctttgatcccctgctgtctgcacctgcctctgagcctttttccaa
-aacctctcacaacggaaccattgttcctcctctatctaacgacaaggccaagatagcgat
-ggtagaagttaaagacttaaaacaaactggcaattgagacaggataccaagatgtaaatg
-tttggttggaatggatcaaatatttcatccacacgttaaacaaaagcaattgttatgctt
-gtgcgcacagcaggccagaggcccagattgtcccctttccactagggtggtcctccagtt
-gaccgggcatgggctgcatggtagctcttttccaggattctatagcctggggtaagaagt
-tgtgccaagctctctctctgctatatcccgaagtttgacaccttgtgggtcagcccccaa
-gggccatccagcttccatctcccaacactaagtttacttcgtgtctctcatgacagggag
-gaaacttagtgttccttggagacctgaagggatgcagtgagcttaagaacttttggccag
-gcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcggatcacaa
-ggtcaggaaatcgagaccatcctggctaacacgatgaaaccccatctctactaaaaatac
-aaaaaaaaaaaaaaaaattagccaggcgtggcgtcatgcgcctgtagtctcagctacttg
-ggaggctgaggcaggaggatggcgtgaacccaggaggtggagcttgcagtgagccgagat
-cgtgccactgcactccagcctgggcgacagagcgagactctctctcgaaaaaaaagaaaa
-agaactttcaaaagcttaccaatcagccagcccttgttcatcccctagcagaagtgtggt
-ggtattgtggtggacctttactggacactctgccgaataactggattggcacttgtgctt
-tagtccaactagctatccctttcaccctggcatttcatcaaccagaggaaggaaaaataa
-gacatcgtaaagtgagagaagccccttatgggtctttagactctcacttctgtttagacg
-caattggggtcccatggagaatacaagatcaatttaaagtctggaatcaaatagctgcag
-gatttgagtcaatatcttggtgggtgacaattaataaacatgtagattggataaactaca
-tctattacaaccaacagtgatttagtaactacactagagatactgttagaggaatagctg
-agcaagtaggggctacaggccagatggcttgggaaaataggacagccttagacatgatat
-tagcagaaagaggaggggtttgcatcgtgactaaaactcaatgttacaccttcatcccaa
-acaacattgcccctaatggaagtataacaaaggcattgcaaggtctcactgctctatcca
-gtgagttagccagcagctcaggggtaaatgatccctttacaggatggctagaaaaatggt
-tcggtaaatggaaaggaataatagcctcaattcttacctccctcgtagctgtaataggtg
-tacttattcttgtcgggtgctgtgtcataccatgcatccgtgggttggtgcagaggctcg
-tagaaacggcacttgctaaaacctcccttaactatcctccaccttatccagagaagcttc
-ttcttttggaaaatcaagcagaacaactaagtcaagacatgttaaataagtttgaagaga
-aagccgtaagaaaaatgcaagaggaggaagttgttaaatatgaattctaaatttctcttc
-aaagaattagtatgtctgtatgttcaattctttgccttctacttttaaacttaatttcct
-cataaagcaacctttttcgattacctgctccaccctgactcactccgattacctgctcca
-ccctgactcactccgattacctgctccaccctgactcactccgattacctgctccaccct
-gactcattccgattacctgctccaccctgactcattattctctgccctgcataaccatta
-ttttcccgccaaagcactcaccccatcactctctttaaattagccaatcggaattagttt
-agcctgtgtggtctaaccctagccaataggggaatgacatagcagcaggggccacatcct
-tcagggataagaacccctttccttcccttgtccagatgtgtgctcaccattgctccatct
-gtgaggttgcacccttttatagaagtaccttgccttgctgagaattgaacagaaaatttt
-atattcgagtgctatttattttgaggcacagaaactttatatataacaatataaacccga
-gaccttggcgggcacacacacaagcagctgaatgtcaagaggaGTGGAGGAACGGAGTGG
-CAGAGAATGGCAGAGAGCGCTGGAGAGTGGCAGAGCAGCATGGCAGAGAGGGAGGGAAGA
-GGCGTCTGAACTTtggaagacacctccactcctcaataaagtctccgcatgtatcacttt
-tcaaacagttcatgtgacctgattaatccaggatgccagacaagaatctgggGAAgttaa
-cattcaggcatccctggatggcaaggctaaaggagcacactgtaacatatgcccacttgg
-gctccagcacctgtccatctgtgtgttcccccttccctcaggggtttgagcagtggggtg
-accaaacagacgagccacaccccctgttgcatgtcctgcaaggagaatcagggaactctc
-ctgtttcaGttggaagagcaagtgtccctctctctctcgtggtggggagacatctcttcc
-ttctgggctgtcacagccccaacctcaccaacctacctgacaagggagtctggcagaaca
-agggcaagggcagggagaagcacctctaactctattcctggataataatcaagtctctaa
-aagtcatcctggagccgggcacagtggctcatgcctgtaatcccagcactttgggaggct
-gaggcgggtggatcacctgatgtcaggagttcgagaccagcctggccaacatggtgaaaa
-cctaactctactaaaatacaaaaaaaattagctaggcatggtggcaggtgcctgtaatcc
-cacctacttgggtggctgaggcaggagaatcacttgaacctgggaggcggaggtcgcaat
-gagctgagactgtgccactatgctccagcctgggtgacagagagagactctgcctcaaat
-aaataaataaataaataaataaataaataaataaataaataaataaagtcatcctctagg
-gctttgaggccgttcaagcccctattttttccatctctgtggatgagcctctgttaaatc
-tgattgtggctgaacaagagataatgttcctaatagatacagggaccagttattcagctt
-taagtgtttattacagcccaatgtgctagtcctccatttcattacgggtattgataaact
-tcagtgaggctgtttcacactgccactcccttataaaatgaaaggctattcctttaccca
-ctcttcagtcctgccaagctgccctgtttctttattaggtcacaatttgctcacaaaatt
-acaagcgaatttacagttaagacctcacattctagctgtaattaactcacacttcaccaa
-aaaagttgctgcagtctatagaacatcacattttaaaacaagtgccggccaggcgcagtg
-gctcacgcctgtaatcccagcactttgggaggccaaggcgggtggatcacttgaggtcag
-gagtttgagaccagcctggtcaatatggcgaaaccccatccctactaaaaatacaaaaat
-tagctgggcatggtggcacacacctgtaatcccagctactcaggaggctgaggcagggga
-atcacttgaacctcggaggtggagattgcagtgagccaagatagtgccattgcactccag
-ccctggcaacaagagtgaaacgctgtctcaaaaaaaaaaaaaTTGTTCTTTTGTTTGCTT
-TTCTTTCACCCTGATTCCTCCTTCCCCCTTTGCCGTCTTCAGTACCAAGCTACAAAGCTA
-GGGGTGGCTGAGGACAGTAAACAGAGTGTGGtcttagctggctttttccctcctgggaag
-ttgttgtttaggatcctaattctagttcagaggtgcattctaaatagtcttctccattgc
-ctttccccccaaaattaatctcacacgttggcttgtgtgtgcattcacgtgaggaactga
-actgtcattttcatagataaataagagactgagtttccttagctccaaagagaaagggca
-ttttgctcctcccagcagaaaggtacccgagtgactggggggccttgcgggagtgttggg
-gggttgagcccccagcgacatgaagtgattctgcagggaactcacaacaaaattagtttt
-aaaaaggctcgtccaggaagcacatataggaactggtcactctgagttttgagccctctt
-ggaggtgctagacctccggagaaaacactgagacacctaagagggtggtggcaaggattc
-agtggtgacacactgtggagtctcatctgcaaccattacacttcgacctactccacaaaa
-accctaggccacagctcagttactccttaaaagaaagtgggaaacaaataatctaagaat
-aaggaaaaacaaggtgttgacgaaaagagttaaactgtgtaaaatagttgaagatattta
-ttcagagcccaatatgagtgactatggcccgtgacatagcccttaggaggtcctgagaac
-acgtgcctaaggtggtcggggctcagcttggttttgtatattttaggaaggcatgagaca
-tcaatcaaatacatttaagaaacacattggtttgattcagaaaggcgggacaattcaaag
-caggggtcagggtgagggtggcttccaggctataggctataggtaaatcggtaaatttaa
-actttttgttttgttttgtttttttgttttgagacagagactcactcttccacccaggct
-ggagtgaagtggcacaatctcaactcactgcaacctccgcccccatgggtttcaagtaat
-tctcctgcctcagcctcctgagtagctgggattacaggcacccaccaccacgcctggcta
-atttttgtatttttagtagaggcagggtttccccatgttggccagagtgatcttgaactc
-ctgacttcaggtgatccaccggcctcggcctcccaaagtgctaggattatgggtgtgagc
-caccttgcctggtctaaatttaaacattttctgattgacaattggttgagtttgtctaaa
-gacccgggatcaatagaaagtaaatgtttaggttaagataaaagactgtggagtccaagg
-ttcttttgaggtcttatattggctgcccttagagacaataggtgacaaatgtttcttatt
-cagacctttgaaaatgtgctagactattagttaatctcttcaggattgggagggcctaaa
-ataaaaagatctagctatgctaatagagattctttacagttgcaaattttcccccacaaa
-gtacagtttggcaggaccatttcaaaatatggcaaagaaacatgttttggggtaaaacaa
-ttgactttcttcttggtcatgtaatgttatgccagagtcagattggaaagtagtcatcat
-atataatgttaaataaaatccatctgatgagaatttatgatttgtagggcatgactcccc
-agaccccttagataggaatttaggcaagatagaaaaaatcagagcttagtcttctcacaa
-gagaatgaccctcttttaggtaccccattgattttacggcatctctactttgcaagtgtt
-tgtgtaaatggacatattatggtctctttgtgcacaattatgtcaaagacaatttagagc
-ttgaaggttgacctccagctgtaaagttcctaagttctctatctctctgctttcttttct
-gcctgttttaagtctgctattatttttctttctttttttgagacagagtcttgctctgtg
-cccaggttggagtgcagtggtgcaatctcagctcactacaacctctgcctcccaggttca
-agcagtcctcccacctcagcctcctgaatagctgggactacaggcatgtgccaccactct
-tggctaatttttttttttttttgagacagagtcttgctctgttgcccaggctggagtgca
-atggcatgatctcagcaaaccaacgagtttctattaatatctcatggctagagttctgag
-ataatagctataggatctttggttgtatgagtatgtatgtgtgtgtttatgcatacatac
-acttatttcattgtgttttctagccacaggtactgaattggcttaaagttaaagaatatt
-cataaattaataagcctaaatgcttttcaagttcatgtgacttaagtaaaatctttaata
-agctagctttaaaattattggtaaagtaatattagaaatgtcttaaaaattgttagcata
-aatttttgtttgcatttattgatcaagggacttcatatactgccaaatactgtaaggtgt
-caaaatttggcatagggtttgtaaaactacaaaaccgttcaaaacagaatgatttttgct
-tttgtaatttttgataaataagacattgatattggtttaatgaaaacagctaaatcatga
-attatttagtgaaataacaatatatttaatcttaaggtttttacttagcaaacacctgaa
-attcacaggctatcaaatgtttgacagggaaataactttaaatgatgactatcacagttt
-tcataactaacctgggtaaactattaaaataaaatatttaggtaaatgtaatgggataaa
-tacttgtagacaaagttgtcataatttaggatctaaagttatgttaaattaaacaataga
-tatttcattaactgggtttttttaattaaaaaagatattgcaggaaatcattttttttct
-aaaaaatgtgttcttgttaaaaggaggataatttttgtctaattcaaagcttatttaaag
-gttatatataaaataaggtaaaaagaaacaagaaaatatataaagaagttatagaaataa
-aaaagaatttttggtaagaaagcttaaagaaaaataattttacatgagaaagaaccttgt
-atggtacatttttgtcctagaataaaatgactggttgtttaagaaagaggaatgttcata
-caaaccagaaagtccaagcatgtcgtgaatggtctgtttaagttataataagagcattta
-tggaaaaagacccacaaactttcatataatcaagttgtctataattaaagggaaattatt
-tataatgatcttttgagagattgggttttgatattaaaaaacatttatacactaaagaat
-tcattagaacaacattttcttaaggtattgatttacttttaataaattacaagactatat
-atataatatattttttcctgcaaagttcaacttttattgcatctcactgttttcagcttt
-ctctccccttttaaagtacctgaaataataactctatctttcaactcatttttagctcct
-gtaagtttttttattttctcctttgtgttctaactgttgtggcctgacgctaataaatgt
-tttatctttgtggtctaaaggaaacattccttccaacataatatttcctgtagggaacag
-cggttgaaatgcagaaggtgttttgttttccctttgggaaattggcctaataaacagagt
-ttatgctttattgaaataattcctatgtcattattactaagttttggtttgtttagaaaa
-aaacccgagattaaattttttttaattaagattattacatacatgtaaccctctgtatgt
-gcttttaaagtccttgtgccattaagttacagagctttgagtccttggtctaaaaagaac
-accaagtcctgctaaatattaaacactgacagcagttaaaacctcattttctgacctggt
-agaagatgccaatcaaaataaactgtgttcatgagacagaaggccggaaattaaaacgat
-tcaactcctcaaggtctggagactatcaaagaagaggtgggtgcatgagattgtaagggc
-cgattttgagagatcaaatgattataaggccaattttgagagataaaataattgagtttc
-tctataaattaaccattaatctcaaaggcacactgatgcaagactagcatatgggctgct
-gtgtcacgttaacaaggttttcttggagaattaacccactccttaataaaaggttataaa
-agaggttataaaggttataaaaaaggcttgtggaatttttatcttgtggtcaggatgatt
-aaaattttatagattgtttatacattttgaaaaacaaatttaattggcctcgtttttatt
-agggcttattgtttaggcaattaagtcttctctctcaaagaatcaaggtttttgcctttt
-ttttgaaatctttgagttatcaagttgagtaaatgaaagacttattttacaatgacttga
-tctgtgatcctattttgtgatatcaagcattttatttatttatttatttatttttgagat
-ggagtcttactctgttgcccaggctggagtgcagtgctatgatcttggctcactgcaacc
-tccacctcctgggttcaagcgattctcctgcctcagcctcccgagtagctgagattacag
-gtgcctgccaccacacccggctaatttttgtatttttcatagagacagcatttaccatgt
-tggccaggctggtctagaactcctgacctcaggcgatccacccaccttggcctcccaaag
-ttttgggattacaggtatgaaccactgtgcccagccaaatcaagcattttaaacttttta
-tttttatttttaaaattttaatattttgagatggagtctctctctgtcactcaggctgga
-gtgcagtggtgcaatcttggctcactgcaacctctgcctcccaggttcaagcaattctca
-tgcctcagcctcatgaatagctgggattacaggcacttgccaccacacccagctaatttt
-tctatttttagtagtgacagggtttcaccatgttggccaggctggtcttgaactcctaac
-ctcaggtgatccacttgccttggcctcccaaagtgctgagattacaggtgtgaaaggtgt
-ttaaaggccactgtgcctggcctttaaactttttatatttgacaaactttccaaagtcaa
-attctaacttggttcctcaatgattttttgatattagtcccctgaagtccaaaagagaca
-cagtcagcttatttggcataaaaatcatacaggaagcattgtcaaatatgtaatagtgtt
-tggctttctttgggctgtatttgtataaatatgttattggcatatgttccaaaattatgg
-gaaaatcctataattatgaatgacttagtatatgttattaatcattatcattattatgta
-aaattattgtatgctacagaagtaaccaagtttctttgtcaattgtgtctttaagtatga
-cttttctaaaacttttgtcatccacagttgttttacttttatccttttcaaaaggatgat
-tttacaatcagcataggactctgacagttgctgttgaatacaggttttggagatagtgac
-actaaaatagagaaaaaaaatccaacactcccatagagagctgaaatatacatgaatagc
-aagcagaagaggagttaactgcatggactgaactaatagaagactgaaataatccttcta
-tgactttttgcttaaaacattgctaatcctttctttgtttttcagagccaagaaaacatt
-tattttgagcttttaaaaaatttattattattattattattaacaaataaataatcttct
-ttctttttttcttttatctttctctgcagggcaagttctgtatttatagcttttaacaat
-tgaggaaattatactcctataaacaaaatttggagcatatttctctctatctggtttctc
-taaaatttggaaactagttgggagtattcttaacttatagcaatatagttatctgcacaa
-gtacaataagaatctgttttcttttgtaagaggacataattggggacagtggtgatttta
-ccaaggttttgactggaacaacatgctatcagatgcagactcctttaaggaatcaaagtt
-gacttacagagctaataaaagcatcttgggaaagctggcctcctatcttgtctacacagt
-ccctgtacaggttcctgacctgtggtaagtaaagagtgtcactttctaacaggcccagga
-gcccaaagtcttcctgaggtgaggaattcatccaattaatacaggtatttgcaggcacag
-gccgggcttaagacattaaagtcgaatgtgagattacttatggaataaagttccagcaaa
-gccaattaaaaaaaaaacaaggagcctatatggcaaataattattcttgatgattttatg
-caaatactccagccaaatataataagacagaaacttattttgcaaatgaattttgttcta
-taatttgtcctcagtgaaaggggactggagagagaaaaaattatgtttcaaaatcaccta
-tagtacacctgttgttagattttagtctcacttagtgtttttaaatttttattattttct
-atagtttggactaaactctaaaatttttcctggtcacaagtccccaaaataatttttttc
-attttttttcttttttcctttccttttccccccacattttttcctgattagaaatcacca
-aacattaaactgtgctttcctaaagccctgtgaactaaagctagacaatctatttacata
-cataagctactttcatacctgcctactggtgtatgaacttcagagtaatatggcctatat
-tgatttcccaggattattgttgttgttgttgtttttctcctttcctcccccattttctct
-taggacgtgagacttcacaacctgctaaagcgagctttcctaataatgtggaacctacct
-gtctatgaataaactgtcctagtcatgagagatcagacaaaacctgagaccagaggctaa
-ttttcttctaaaatgcttttaaaaagaaaaggggggaaAtgtgaaaggaaaataaacttg
-ggaccctcaaatcactaagccaaaacgaaaagtcaagctgggaacggcatcgggcaaacc
-tgcctcccattctaatgggatagctaaataagatagctacaaagattttaaaaagctaca
-tacctccctcacaattttcccacaaggaaattccttgtgtacctagaacagacagaactc
-aaagtcatccctctgctcatgggagacaaatgcacatctgatggcttcctttgccctatt
-gcttcgctaagccagactaaggcataagtgactattcctgcaagttgcatattcagtgga
-gggctaatcagaaactcaaaagaatgtaacaatttgtcctttatctacctatgacctgga
-aaacccctccccacttcaggttgtctcacctttctggatggaattgatgtacatcttacg
-tatttgctgactgatgtctcatgtctccctaaaatgtataaaacctagctgtgccccaac
-taccttgggcacatgttatcaggacctcctatggctgtgtcactggtgtgtccttgacct
-tggtagaataaattttctaaattgattgagacttgtctcagataactcttgatttgcagt
-aagtagcatttctaaacatctctggaatgcatgcatattgaaactcattatgcaaccctt
-gctgacatcaaggcaggaaaatgtctacaaatgtaatcatttagcgtgacctatgtggct
-aatgtggaccaaattatccttaagctcctgctttaaggtgcataaatgcccctgaggaaa
-aatccaccttggcactctccatcctatcttgctgagattcttgcctgcactcttctacag
-agttctttctttctaataaaactttccttttttcaaaccaatactattatccataaattc
-ttcttctttttttgtttttttgaaacggaatctcactttgttgcccaggctggagtgcag
-tagcatgatcttggctcactgcaacctccacctcctgggctcaagtgagtctcctgcctc
-agcctccagagtagctgggattacagacgtccaccaccacgtccagctaatttttgtatt
-tttagtagagatgaggtttcaccatgttggccaggctggttttgaactcctgacctcaaa
-tgatccacctgccttggcctcccaaagtgctgggattataggtatgagccaccatgccca
-gcagtaaattctccttactaatccacgagtggaccactttccaatgctgaggctctgaca
-cctcgctgggcaGCCACTTTTGATTATTTTGGGTTGTCAGGGCTCAGGGACACAAGAACT
-TGCTCCTTAGGGGAGCTGGAGGTCTAGTAGGGATTGCTTGTTCTCCATCAGGCCCCTAGT
-AGGGAGGCCTCTCCTGTCCCCAATCCCTGACTCCCAGGGATGCTCCCCTCCAAACCACAG
-caggaagttcctccttaggtcagacccacagccctgatgctgtggtctCACTGCAGGTCA
-TAGTCTCACAGGGGCCTCTTATAttattttaattttaattttaattaaattaaattaatt
-ttttttttttagatggagtctcgctcttatcgcccaggctggagtgcggtggtgtgatct
-tggctcactgcaacttctgcctcccaggttcaagtgattctcctgcctcagccacctgag
-tagctgggattacaggcatccgccaccatgcctggctaatttttgtatttttagtagaga
-cagggttttgccatgttgaccaggctggtctcgaaatcctggcctcaagtgttctgcctg
-cctcagcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggtcttatatta
-ttttaattttaaatttaaGAATACATTCTTAATATCAACCTTCAAAGACTCCCTGTTGCT
-TACCAAGTTAAGAAAACTACTTAAACCTCACATATAATTCCTTTCTCAACTGGGACCAAT
-AAACCGTGACAGCTTTATtgaagggggccagccccttcacacctgtgggtatttctcgtc
-aggtgggatgagagactgagaaaagaaatagacacagggacaaagtacagagaaagaaca
-gtgggcccagggcactggcgctcagcatacgaaggacccgcaccggcgccagcctctgag
-ttccctcagtatttattgatcatgatctttactatcttagcaaggggagtgtagcagggc
-aacaggtggggagaaggtcagcagggaaacatgtgagcaaaggaatctgtatcatgagta
-agttcaaggaaagatactgtgcccggatgtgcacgaaggctagatttatgtttctcttta
-cccaagtatctcagtgtagcaaagagcaacagagcagtattgctgccagcatatctcgcc
-tccagccacagggcggttttctcctatctcagaatagaatgaatgggaatggtcggcttt
-acacagagacattccattcccagggatgagcagagaagccttcctcttatctcaactgca
-aagaggcctccctctttcactcctcctcctcagcacagaccctttatgggtgtcgggctg
-ggggatggtaaggtctttcctttcccatgaggccatatctcaggctgtctcagttggggg
-aaacgttggacaatacccaggctttcttgggcagaggtccctgtggctttccacagtgca
-ttgtgtccttggttaacagagaatggagaatggcgatgacttttaccaagcatactgcct
-gcaaacatattaacaaggcacatcctgcacagtcctaaatccattaaactttgatccaat
-acagcacatgtttctgtgagcacagggttggggataaagttacaagttaacagcatctca
-aagcagaaacaatttttcttaatacagatcaaaatggagtttcttatgtttccttttcta
-catagacacagtaacaatctgatttctctttcttttccccacaCTTTCTCACGTGttctt
-tctttctttctttcttttcttttttgagatggagtctcgctttgttgcccaggctggagt
-gcagtggcgtaatctcagctcactgcaaactctgcctcccaggttcaagtgattctcgtg
-cctcagcctcccgagcagctgggattacaggcatgcaccatgacgcccagctaatttttg
-tattttcagtagagacgggtttcaccatcttggccaggctggtctcgaactcctgacctc
-aagtgatccacctacctcagcctcccaaattactgggatcatatgaatgagccaccatgc
-ctggccCATGTTTTTCTTGTACTTTAGGCTTTGCTACTTACAACCAGAACTGCTTACCAT
-TCtgtcagaagccttccaaccagggcaactccatcttgaataggggctgggtaaaataag
-gctgagacccactgaactgctttcccagaaggtcagacattcttagtcacaggatgggat
-aggagtttggcaggactggtatcacaagtacaggtcacaaagaccctgctgataaaacag
-gatgcagtaaaagaagccggccaaaatccaccaaaactacgatggggatgaaagtgacct
-cgattcgtcctcactgctcattatataggaattataatgcattcgcatgctaaaagacac
-tcccaccagcaccatgagaatttaccaatgccatggcaacgtcaggaagttaccctacat
-ggtctaaaaaggggacgaaccctcagttctgggaattgcccatccctttcctggtaaaac
-aatgaataatccaccccttgtttagcatacgatcaaggagtaactataagtatgttcagc
-tgagcagcccatgccactgccctgcctatggagtagccattattttattcctttactttc
-ttaaataaacttgctttcactttactctatggattcaccccaaattccttcttgtgtgag
-gtccagaaaccctgtcttggggtctggtttggtacccctttctggtaataATTCTGTAAG
-TATTTGTAGTACGTCTGAGCCACCAAAATTTCcatactgatccttccattagaatatcct
-ttctgcctgtctctttctggcaggatctgatccatatttcaaagccagtctcaaatgcca
-ccttttccaaagaaacctatcctTATATCTTTATCTAATACAAACAGTATATATTGGGAG
-CCTAAGAAATGCTTGTTGCATACATCAATGAATGAACCCCAAACCAATGTATTTCTCCCT
-TCCTTGTAATCTCCAGAAATGTTTATAAACTTTGTTGTTGTTTAtttgtttgttttattt
-ttatttttattttgagatggagttttgttcttgtcacccaggcgggagtgtaatggcgcg
-atctcggctcaccacaacctctgcctcctgggttcaagtgattctcctgtctcagcctcc
-cgagtagctgggattacaggtgtgcactaccatgcccagctaatttttgtggttttagta
-gaaatggggtttcaccatgttggtcaggctggtctcaaactcctgacctcaggtgatcca
-cccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgtgcccggccTGTT
-GCTATTTATTTAATATACTTTATTTTTTTGAGCGATTATAAGTTTATTtttatttattta
-tttatttatttatttatttttgagacagggtctcattgtcacctcttgcccaggctggag
-tgcagtggcacgatgttagctcactgcaacctctgcctcccagagtcaagtgatcctgcc
-acctcagcctcctgagtagttgggaccacagatgtgcaccaccacgctgggctactattt
-ttatatttttagtgcagatggggttttgccatgttgctcaggctgatcctgaactcctga
-gctcaagcaatctgcctgccttggcctcccaaagttctggaattacatgcgtgagctact
-gagcccggccTTAGGTTTACAGAACAGCATTCCACCCATGTTATTTATGCAGGGGAGCAC
-ACCACACACATCACTTTGCAGCTTCCTTTCTCCTCTTATATGTCTTACAGATCTTTCTGT
-GTTCTGTACATTGAGACACTCATTCATTGGCTTCACTCATTCATTTGAATTCattccttt
-gttcaacagatatttatcgtcagctctatgtcaggcactatgagaagtgcttgggatata
-aaactgaacaaaataaacaaagtcctttccattggagagatgacattctagtgtaaggag
-atagacaatagataataaatacaacaaataaataaatacatggtttagtatgttataaga
-tgctttctgtaggaaaaaagtgagagggacctggagtggagggaggaccgagtggggaca
-ggtgcagggtgggggcagccagtagagcccctctgaggaggAGTGGATCACAGGAGGATG
-ACTGGCAAGACCTAAAGGTGGCAAGCTGTCTCTGGTGCTGGCTCTGAGAGCAGGATAGCT
-GGAGTAGAGTGAGGGAAAGGCGAGGTCAGAGGTGAACCTGCAGGGCAGGTGGGGCTCCTT
-CCGCTAGCgcatggtgttccattatccagatgcaccaggacaaatgtcgcccactgccat
-tactaggtgcttaccatgtgccatcaagaacaataccgcaggccgggtgcggtggctcac
-gcctgtaatcccagcattttgggaggccaagatgggtggatcacttgaggtcaggagttc
-gagaccagcctggctaacatggtgaaacctggtctcgactagaaatctaaaattagccta
-gcgtggaggcgcactcctgtaaacccagctacttgggaggctgaggcaggagaatctatt
-gaacccaggaggcagaggttgcagtgagcctagatttcgccattgcactccaactgggca
-agagcaaaaatctgtctcaaaaaacaaacaaaaacaatactgcaataaacattctgtcag
-tctgtcattttgcccatggacagaatatctgcagaattaattcccggcagtgaacttgAG
-AGAGATCACCCAATTGCCTTCCAAAGGAGCTGTGCCTGGACCATGGGTTTCAGCACAAAG
-TGCTGCTCCCTCCAACTTGTAGACTCTTCTGGCAGGTCACGGTGGAGCTCACATTCTAGC
-GGGAGAGTGTCCAGGGCAGAGATATTCCATTCCGTGTCTTTTCTCCCAGGGCTCGCACAG
-AGAGGGTTCACGCGGTAGTCAGTAGGTGGGCAGTGCTTGGTGAAGGCATTGATGGGTGGA
-GGGATTGAAGGATGAATGAATGGATTAGGGGCTGACAGTGCCGCTGCAGTTACTCAAAGG
-AGCCACCAGGAGGCGCAGGGAGCCCACATTCTGGAGACAAACCTTTTAAAAAAAGCATCT
-GGTGACTTAACGACCTTTTCACCAATGGCTTGTGTGGGGCCTTAATGCTAGGGTGAGAAA
-AAGGTGGGAGATGGAAGAAAGGGGAGTGGGTAAAAGGACATGTGGGAGAAGAAGGCAGAG
-AGAGGGCCTTCTGAGGGGGCCTCCACGCCAGGTAAGGACCGTTTAGCTCCCCTAAGAGCC
-TGCAGCATTGATGCAGATCCCAGCAAAGCCAAAACCCCCTTATGCCCACAGTTGAGCCCA
-AAAGCCCAGAACAGAGGGGAAAAATAAATTTCAGGATAggccaggtgaagtggcttacgc
-ctgtaatcccaaaacttggcgaggtcaagtaatcccaagtactttgggaggctgacaggg
-gaaactctatctaaaaaaaaaaaataaGAAAAGGAATTTCCAGGATAAATATGTACAGTA
-TAATCCCATTTATGTGAAAAAAAAAATCTCCACAAATAAATTCCTTtgtgcgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtttgtgtgtgacggagtctcagtctgtcgcccaggctgaagt
-gcagtggcacgttctcggctcactgcaacctccggctcccaggttcaagcaattctcctg
-cctcagcctcctgagtatctgggattacaggcgtgtgacaccacacccagctaatttttg
-tatttgtggtagagacggggtttcaccatgttggtcaggctggtctcgaactcctgacct
-cgtgatctgcccgcctcagcctcccaTAAATTCTACATATTAGTTTGGGGAGTGTGTATT
-TACCACATACACATCTACAGGGAAAATCTGGAAAGGTAAATGTCGAATTGACAACAGTGG
-TTACTTTTGTTATTGTGTGTGTAGAGAGGGGCAGGGGACAAAAAGGAAAATGAGGAGTGA
-TCAAAGGGGACTTTAATTTTCTTTTTTTTTTTTGAGACAGAGtctcagctcactgcaacc
-tctgtctcccaggttcaagtgattctcctgcctcagcctcccaggtagctgggattacag
-gcacccgccaccacgcctagctaatttttgtattttattttagtagagacagggtttcgg
-tttcaccatgttggccaggctggtctcaaactcctgacctcaggtgatctgcctgctgcg
-gcctcccaaagtgctgggattacaggcgtgagtcactgcaccgggccCCCAAAGGGGACT
-TTAGACTAAACTGAAACATTTTAACTTTCCAGGAATCTGTAACCCTGCTATTATATAACC
-ACAAATTAAAAATTACTTTaaaaaatgaaaaaaaaaaaaaaaaaaaaaaggctgggagcg
-gtggctcacacctgtaatcccagcactttgggaggctgaggcaggaggatcacgaggtca
-ggggtttgagaccagcctggccaaaacggtgaaaccctgcctctactaaaaagacaaaaa
-ttagcagagtgtggtggcacgtgcctgcagttccaactactcaggaggctgaggcaggag
-aatcgcttgaacttgggaggcagaggttgcagtgagcctagactgcgccattgcactcca
-gcctgggcaacagagcaagactccggctcaaagaaaaaaaaaaaaggaaaagagaaaaaA
-AAAGGAACAATAACAACAACaaaaattaaatgctatcttgtgttgcatcaatagaagtct
-tacgtgcagctcaagggaggtgacagccccctctgctctgctcagaccacacctgggacc
-tcctttcctcttcttggccctgtcccgtgagaagaataatgacagcctaaggcatgCTGG
-GGGTTGGAGATGGGGGGAGGCTGGGGCCATCTGCACATGATACAGATCCAGGAATAGTCC
-CTTTACCCAAGCGGGAGAAACTGGGCAGGTGAGCAGCTTCCAGGTGTGTGGATGGCAAAT
-GGATGCCAGACTTTAGGATAGGAATCCAGGGGTGCAGCGGATGGAAAGTCCAGCCCAGGA
-TGGGGCATAGTTTTCCCACCCAGCTAGGGAGGGAGGGTAGGGGCTACTCTGGGGTGTCAG
-GAGTGCCGAAGCCTGAGGTAGGCGCAAGCCAGGCAGCATGGCAGCATCCTTCCAGAGGGT
-GTTGTGCAGCTGTGGAAAACAATTGCTGGGAGGCCGGCAGGGGCAGTGGTGGAGGAGACC
-AGAGCTTAATTCTAGGTGAGTCACAATAGCCTCATCTGTAGAATGAGTGAGGGGTGGGGC
-GTAGTTTCAGAttttttttttttttttgacacgtagtttcgctcctgttgcccaggctgg
-agcgcaatggcgcaatctcggctcaccgcaacctccgcctcccgggttcaagcgactctc
-ctgcctcagcctcctgagtagctgggattacagccatgtgccaccatgcccggctaattt
-tgtatttttagtagagacggggtttctccatgttggtcaggctggtcttgaactcttgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtcagccaccgtgcccCACCA
-GTTTCTGACTGAttttcttttttttttttttttgagacggagtcccgctctgtcgcccgg
-gcgaagtgcagtggcgcgatctcggctccctgcaagctccgcctcccgggttcacgccat
-tcccgggcctgggaccacaggcgccgccaccacgcccggctagtatctttttttattttt
-attttcaatagagacggggtttcaccgtgttagccaggacggtctcgatctcccgacctc
-gtgatccgcccgcctcggcctcccaaagtgccgggatcacaggcgtgagccaccgcgccg
-ggccCAGCTTCTGATTTTATGCAGCTGGCGGGATCTTGTTCTTGGTCCTTTAAGGCGACC
-GGAGGGATTGCAGTTTTAAAAACTCGCCAGCAGAGGTCGCCTTCTGACGGATTTGACCAA
-AAAATCCATTCCGGTGGGAAAGGGGAACCTGCGCCTGCGATtctctctctctccccctct
-ctccctctctctttctctccccccctctctctctctccctccctccctctctcctcctac
-tcctccctccctccctctctctgtctctccctccctccctcccgctctctcccccctccc
-cctctccccctccctccctcccttcctccctctctGtctctttctttgagacaaagtttc
-actctgtcacccaggctggagtgcagtggcacgatctccactcactgcaacctctgcctc
-ccggggttcgtgattctcatgcctcagcctcccgagtagctgggattacaggcgcccgcc
-accacgcccggctaatttttgtatttttagtagagacggggttttgccatgttggccagg
-ctggtctcaaactcctgacctcaagtgatctgcctgcctcggcctcccaaaCTAAGATTC
-ATTTGTTGACTAAGTGAATAAAAGGGGAGACATTGAAGAGGGGGACCCgactggatttgg
-gggtgaaggtggagttgagagtgactttgaggcttctgcttgagcaatgagtggagggtg
-cctctcctgagctggggaaactggggcagCACTGACGGAGGGGACACAGCTACAGAGGGG
-AGAACCCTCTCCTGCCGGGGCTGCGGGTTACAGCCTGCACTGCGATTCTCTGATCTCAGG
-GACCTCAGACTTCTGGGGCCCTGTCCCCTACCTCTGTGTATGACCCTAGCTGGCTGAGGG
-CTGAAGGCTTGCTGTTGGCTCTTTCTGCACCCTCAGCCTTCTCCTTCCTCTTCCCTCTGC
-AGGACTCTGTCCTGGGTCCTTAGGAAGAGTCCAGGCCCCAGGACAGGGAAGTTGGGTCAG
-GCCTGGACCTCACATTCCCTGCCTGTCCCATGAGGTGGACAGTGAGAGGACAAATGCCTG
-GACCCCTGGCCCCAAACCCAAGAGCAGATGTACCGGAGAAGAGCTTCTTAGAGCACCAGG
-TGCCAGGGCTGCGGTGGAGAATCAGGGGGGCCCAGGGGAAGGGGCTGCAGATGAGGGAGG
-AGATAGATACGGAGGGCCTGTGTGCCTCCCAGATACAGGGCTGGCTTTCCCAGCCCAGAA
-GGTTCTTTCTGCCTTTCCCAGTCTTCTTCCATTCTCATTTCATGTTCACACTTTTGGCCA
-TACCCAGGGTCAGCCATGAAGATTGTTCTCAGAATGTtttctttcttccttcctttctct
-ttcttttctttctttcttcctttctttctttcctttctttttctttcttctctttctttt
-tttcttttcttctttctctctctttctttctctctctctctctccttccttccttccttc
-ttttctttctttcttctttctttttttgaaacagagtctcactatgtcacccaggctgta
-gtgcattggcacgatcactgctcactgcagccttgacctcctgggctcaagtgatcctcc
-cgcctcagcctcctgagtagctgggaccacaggtatgcaccaccatgcccagctgatttt
-ttaattttttgtagagatgggggtctcactgtgttgctctggttggtcttaaactgctgg
-gctcaagtgatcctcccgccttggccttccagagtgttgggattacaagcaggagcagca
-cacctggccAATGTTTTATTTAAATCAACTCACTTAGGTTGAAttagaataattttagac
-acacagaagagtgtgtctatataattttgaattatatacccaacactcagatataacatt
-agcattttgccatatttgcttcatctatttctttctgaaatattttaatgtaaattacag
-atatcatgaattttcatccccaaatactttagtctgcatCAGTCAAAGATATCTAATATT
-TAATCCACAATGGATTTCCCCAGTGGCAATTCCCCTAAATTGTGTTTTACAGTTGACAGT
-GGatttattgtaaaaggaaactcgatataccaagtgacaagcaagttatcttctgttata
-aatagaaaggatccctggaaatggacacagtgtcaggcccagagctgtgggtggagacct
-gctctctgtttgacataaataggagatcagtggctactaaatctgaagacagggcagcag
-caaagaacattttctcacggatgtgatgagacttgaaagggactcagaaagggggtcact
-ttctccaggttggggtaactgttatttaagccagggttcatCTGCAGCGTGGGGAGCCAG
-AGGGTGACCCCTTCCCTAGGTGATGGAGGTGGCTGAGGCTCCAGAAGTTTCCAGAGAAAG
-ATCTGGTGTTCCTACAAGGCCAGTGGCAGGGGGAAGGGCACTAGACAGTGGGGCTGGAGG
-GTGTGGGCCTGTCCCTGCTCTGATTTTGGGCACTGCACTTTTGCCTGTAAGAAGGGGATA
-TGTGAGGCCAGGACAGGGTCTCCTACTCTGTCCCCACTCCCACGCCAAACAGGGCCTTGA
-GGACTCTCGCGACCTCCATGACCCAGCTTCCCTCCTACCCCAGCCCCAAGCCTGTTTTTG
-TTCCCCTCCCTCCctcctgcttgatctttgagcctcagccaggatgttacctcctcctag
-aagcctgccttggtccctggaatggattaagggactctctcctgggccccacagctgccc
-aggatcactcagcactgtagtgccctgttggcctttgcctccctccagctgtggacgtac
-aaagcagacagcgaatctgtcttgctcaccactgtacccccatcccctactgcagcacct
-ggcacatagcagtagtgcggcacacttgttgaatgaataaGGGATCATTACTACTACGCT
-TCCCACTCATAAATGTCTGCCTCTTCGGGGGGCTCAGAATGCACATTTGGTCCTTCATTA
-ACTCATTTACTCACAAttttttttttttttttttttttgagacggagtttcactcttgtc
-gcccaggctggagtgcaatggtgtgatctcggctcactgcaacctctgcctctcaggttc
-aagcgattctcctgcctcagcctcccgagtagctgggattacaggcgctagccaccatgc
-ctggctaatttttgtatttttagtagagatggggtttcaccatgttggccaggctggtct
-cgaactcctgacctctcaggtgattcacccacctcagcctcccaaagtgctgggattaca
-ggcatgagccaccgtgcctggctcatttactcacaaatatttactgagcacctactatgt
-cccaagcagtattctaggcactggaaatggggcaaggctgctgcctctgtggaacttata
-ctggggtgtgggaggcaaagaaaaacaagcaaacatacatatgaaataatttaagatgcc
-actcgtggtgggagggactgacaggagctgctgtggaagagagcattaggagggccttgc
-tgaggggtgactttatttcagctgagaggtggatgagaaggcacctgcaggggaagaaga
-accaggggaagggtgttcctgatggagcaacagcctgtgctaaggccccaaagtgagcac
-cagctgggcgctgagggacagaaccaggcacaggctcggttagaggaggtctgaggtccc
-agaggagacaagagaggggaaggatgggagggcaggcctgagccgcagaaggccagtgga
-aggttctgagtgggaagaggatgggataggagttatattctgaaaggtccgcctgtgctg
-ggtggaggatgggtggggacaggcaggagcagcccaggctctgatgcagcctccaggcag
-agatgGACCAGGGGAGCCCATTTCATATCCGGCCCCTGTGGAGGGTCTGAGGGTGTTGAG
-CAGACAGGCCCTGGCTTTGGAAGTCCTGGGTGTCTGGACCCGCCTGCCTGTGGGGCCCCA
-GCAGAGAGGAAGGGAGGCGGGGCTCCCAGTGCCTGTTGACTCATTTGCATCTGATTTGCA
-TGTGAAGCAGAGAGTCAGGTTGAAAGCTGGGAAGGCCTGTGCCAGCCCTGGGTAGAGGGT
-CTTGGGTGTTAGTTCCCACAAAGACTCTGTCCCAGGCCATGACCTTCCTGTTCAGGAGGG
-GCTCTGCCTTCCCTTGCCTCCAACGCCCCTCTGGCCTGGCCCTGCCATCTGGGGCTGGGC
-AGTGCCCACGGGGACAAGGTCGTTTCCTTTTAGGAGAGGTCTGCATGCTATGAGGACAAA
-GGCCAAATCCCCACCCTCGGGAACCTCCTTCCCCAGCAAAATCCCATCTGTCAGGCTCAG
-CCTCTGACCTTCGACCTCTCTGTCAGCACAGGCTGCAGTGTTGGGGAGGGGAGGGTCCCC
-ACCCCCAACCCTAGGGGAGACCCAAACCTCTCCCCCCAGCCTTCTCCATCTGTCCCCTTC
-GGCTtctgccacctgctccgtgtgatccaggccaggtcacctccgctttctgggccttgg
-ttcccccacgtgtccaatgtgggTTTCCCAAATACCAGTGACTTGTGTCAGTCCACTTTT
-GTAATTGTAGCCAACTCCacttactatttcttaagtgaacttactctccttcacttaaat
-agatttaatttaaaaagaaatgttataccagctctgtaaatggaaaaccagtttcatctg
-ccacaagtagaaacataataggaaaaaataatgaaatggaaataaaacaatgttactcta
-gtctagcCTCaagtgaaaaaagtcagacacaaaaggttacatttatatgattgtctagaa
-aatgcaaaactagagagaaagaaaacagaccactggttgccagggttggggagagggagc
-tgacaatatcaaggggtgcagaaactttttagggtgatccaaactgttttttgatgatga
-tggtggttacagattgtatacatttgccaaaaatcaccaaagtgtacattcaaagttggt
-gagttttattttatgtataaaccacctcaaaaagacaaaTTTTAGAGAAGAAAACAAAGA
-AAAATGCCGGTTTAGCCCCAAGTCTGAGGCTTCCTCTCTGTTAAACAAATTAGCAAATAG
-AAggccaggcatggtggctcatgcctgtaatcccagcactttgggaggctgaggcaggag
-gatcacttgaggtcaggagttcaagaccagccatggccaacatggtgaaatcctgtctct
-acaaaaaatacaaaaattagctgggcgtggtggcgcatgcttgtaattccagctactcag
-gaggctgaggcaggagaattgcttgaacctgggaggcggttgcagtgagccgagattgca
-ccaccgcactccaccctgagtaacagagcaagagactccatctcaaaaaacaaacaaaca
-aacaaggaagagaaAGAGGGATTTCTCTCTCTGTCTCTCACCAACTCTCTAACCCTCCCT
-AGTTCcatgcaccaaggaaaagctatgtgaggacataggagaaggtggccagccacaggc
-caagaagagagccttcaccagggactgaatcagctggcacctccatctggtacctctagg
-ctccagagctgtgagaaatagatgtgtgctgtttgagccacatagtctctgatattttgt
-tttggcagccggagcagactcatgcCCTCTGATCTCATCATTAGCATAATGCctgtttat
-agaaccatgctgtgggcaggctctgtgctaaaagctttgccagcatcatttcagagactt
-gatgtgacatcttacatcgtaggggaaattattgttcccattaaagatgggCCCACAGTG
-TGGCTAAGCCAGTGGGGCATGTCCTCAGACCTGGAGTGCTCCCATAGGAAGCTGGGCCCG
-ATTCTTTCTGAAGGTGTGAGCTGGAGGCAGTGATGGTGGTTTGAGAGGCACGGGCTGTGG
-GGAACTGGATACTGAGGGCAGTCCCTGTGTCCCAGGGGAAGCACTCTGTGCTTTCAAGGG
-GGGCACTGGCAGAGAAGGAAGTGTCCCTCATCACATCCTGGAGACCCACCCTCTGGAGAC
-AGTGTTTTCACGAtttcttttctttcttttttttttcagacagggtctcactctgtcacc
-caggctagagtgcagtggcacgatctcagctcactgcaacctctgccttctaggttcaag
-taattctcctacctcagcctcctgagtagctgggattacaggcacccgccaccacgccca
-gctcatttttatttttttatttttcgtagagacagggtttcaccacgttggccaggctgg
-tgtcaaactcctgacctcaaatgatctgcttgctttggcctcccaaagtgctgggattac
-aggcatgagccatcatgcctggccATGTTTTCACTATTTCTATGGACCGTTTCATAAGTG
-TTGTGTGGACATAGGgctccagggttaaatgtgtttgggaaatgtggtgtaagcaaagag
-aaagaagtttccactctaatacttctcagagactttaatgtggagataggcatggcgaat
-ctcTCACTGCGGGACAAgtgggcaagagaagtgtggatgctgccttctgggcactcacag
-ttggtggaggagacagccaacatgcaagcaggggccacaccacatgtctggaggttggaa
-cgctatgcagagagaccacaggaaccatgggggaagtggggagggatttcccagaggaga
-tgacatttgaacaaagatgcaaaggaagtgtggaaggaggtaagggagagctgtatgact
-gtctgggggaagagaaacccaagcagagggaacagcaagcacaaaggttctgaggctcaa
-ggttgcttggtgcatttgacaagcagaccagcgccattggctggagctagctgggccgag
-tgggagggtgataatggatgaggtTGACCACGGTCCGCTCCCAAAGGCCATGGAATTCAG
-AGCATACTGGAGAGCCCTTAGTGGGTTTGGACAGACAGTGATACCTTGGGACACACAGCC
-TCATGAGCTCATACTGACCAAACAAACCACCCAAAATAGCAGCAGAAACAACAGCCACAG
-GGTGCAGAGGGTCATTCAGGGTGcctctcacaagcctgggaagtaggcatgtgatatggt
-ttggctgtgtccccacccaaatctcatcttgttttgtaactgcttcaattcccatgtgtc
-gtgggaggaacccggtagggggtgattgaactgtgggggcaggtctttcctgcgctgttc
-ttgtgatagtgaaaatgggtctcacgagatctgatggttataaaaatcggagtttccctg
-cacaggctctcttttttgcctgccgccatccacgtaagatgtgacttactcctccttgcc
-ttcggtcatgattgtgaggcctccacagccttgtggaagtccattaaacttctttcattt
-gtaaattgcccagtctcgggtatgtttttatcaacagcgtgaaaacgaactaatacagca
-cggttaactcccattttacaggcgaggaagctgaagcttagaaagatgaaagaatttgcT
-TGTGACCCCGAACGTTCCCTCTGGCTGATGCATTGTTCCTACCTGCTCTGTTTCCTTGTT
-TATGAAGCTTGCAGGCTCCAtggtcctcaaccctggctgctacacactggaataacctgg
-ggtggcagactgtgtctccccaggatggccacaccaatacatctcacatcccacatgctt
-ggccaatagcatatgacagatgtgactgtgggttacttctaaagctaggccataatagcc
-atcgcaaccccaccgtgatctctgggattgctagttctgagggaagccagctgccatgtc
-ctgaggttactcaagaagccctgtggagtaggccatttggggagggactgaggcccccag
-gcaacatctgtcccaacttgccagtcatgttagtgaactacccttgtccagccttcagat
-gacACCTCATGAGAGGCCCTGAGAGAGTCTTATTGTCCCGTTCACCATTCCTGTTGCCCT
-GTGGCCAGCTAATCAGCTTGTGGTGGTTTTCATTTCTTTTTTCTTTTTGCCATTAATAGC
-AATGCCAggctgggctcagtggctcatgcctgtaatcccagcactttgggaggccgaggt
-gggtggatcacctgaggtcagaagtttgagacaagcctggctaacatggtgaaaccctgt
-ctctattaaaaatacaaaaattagccaggtgtgatggtgtgcgcctgtaatcctagctac
-ttctcccaagtagaagggcgtgattcttctcatgcctcatgctgaggcatgagaatcact
-tgaacccgggaggctgaggctgcagtgagcggtgtttgtgccactgcacttcagcctggg
-cgacagagtgagactatctcaaaaaaaaaaaaaaaaGTAGCAATGCCATAGTAAGTATTC
-TTCTAATTAAGCCCTTCTGAATCAGCTTAATTATTTGCTTAGGGTCAATTTCTAAATGCA
-CAGTTGCTGGATCAGAGTACAAGTCCACTGATACAGCATTTAATTTTTTCAAAGAATTGT
-GACTGggccgggcacggtggctcatgcctataatcccagcactttgggaggccaaggcgg
-gcggatcacctgaggttgggagttggagaccagtctgaccaacatggagaaaccccgtct
-ctactaaaaatacaaaattagctgggcatggtggtgcatgcgtgtaatcccagctacacg
-ggaggctgaggcaggagaattgcttgaacccgggaggcagaggttgcggtgagctgagag
-ggtgccagcttgggcaacaagagtgaaactccgtctcaaaaagaaaaaaaaaaaaaaaag
-aaTGTGACTATagctggccgtggtggctcatgcctgtaatcccagcactgtgggaggcaa
-gatggtcagattgcttgagtcaaggagtttcagaccagcctgggaaacatggcaaaaccc
-tgtctctacagaaaaattagctgcgcatgggggcagacacctgtagtcccagctacgtgg
-gaggctgaggtgggagcatcacctgagcctgggaagtcgaggctgtagtgagctgtgttt
-gcaccaccgcactccagcctgggcaacagagtgaggccttgtctcaaaaaaatttaaaaa
-ataaataaaTGTAACTATATTCTCCTTCAGTAGCAACATCTCAATTTACCTTCTCATGCA
-CAGTGTTTGGAAGGACATATTTTGGGATGAGTTTTCTTTTACTTCACTACCTTATTTTGT
-TCTTTCATAGAATGCCTTTAAAATGTTACTTTAAAAAAATAGATAATACCTTTACAAGGT
-ACAAAATCCAAAAGGTATAAAAATGttttctttttttttttggagacagagtttcgctct
-tgtcgcccaggctggagtgcaatggtgcgatcttggctcgctgaaacctccgcctcccgg
-gtttaggtgattctcctgcctcagcctcctgagtagctggaattacaggtgcccaccacc
-atgccctgctaatttttgtattattagtagagatggggtttcaccatgttggccaggctg
-gttttgacctcctgacttcaggtgatccacccaccttggcctcccaaagtactgggatca
-caggcataagccaccacgcccggccAAAAATATTTTATAAAAGTCTTTCCCCCACCCCTT
-TCCCCTCAGTCAGCACAAGTAGCCACCACTGGGACCAGTTTCTGGTGGATAAATCCAGAA
-AAGTTCAGGTGCAAGTAAACACACATAGAGAGAACACCCTTTAAATTAAATGAAACTAAA
-GAAAACAGAGCCATAGGTGCACAGGAGACAGAGAGCTGACATCTGGGGCTGATTGCATCT
-TGGTTTCGAGCTGAGTGGCAAAAATACTGCTAAGGTCAACGTTCTGAAGGAGGCAAAACC
-CACACGCAGAACCAGCCATAGGCCTGTCAACAAGGCGAGATGTTATCATTGCTCATGTGC
-TGGGTCAGGATAAGGCCATACAGACCGCCCAGTTCTCTCTGATCTGGGTGTAGTTAATGA
-CAGTTTATCCGCCTTTTTCTTCTCTCTCACCACTCCCCATGGTGGGGGAGGAGAAGGACT
-GGGAGGACTTGAATACTCTGAATTGGCACCAGGTGCTTAATATAGTCCTGAAAATAGAAG
-ACCAATATGCTGTTGGCACATAAAGATGCCCACAATTCTAGAATCTGAGTGCGCCCAGAT
-GATCTCTCTTTACATGGCCTAATTTGGGATCCTGACAAGTTCCTTCTGCCCTCTGCCTCA
-CTTTCTCAATCTAGGAATGGGCCTCTCGGTTTTTGTTTTGTCTAATTTTAAGCTCTCGGC
-TGTGCATGGCAGAGGCAAACTTGAAGACGCAAGGGTCAGTGAGCAGGGCCTTTATCCAGG
-TATCTCAAATATCTCCCAACCCTGATTAAAGTTACATATCTCAGAGAAGAATTTGGTCAA
-CACCATTGTTGTCATTCCTGGTTAATAACAGGGAAGTTGAGGTctgggaagcaccctagt
-gatgtgttcacatggccatgtgcttctgtaaaatttaccaatgtaaggcatcttaacctc
-attctgttaaaaccactatctcctttcattccaacttccctttgcatcagatgatgttgg
-ggttggtgtgagcagtttgggcatcttgctaaaaggaccttaacatttactttgggttta
-gtgggatatatttatattgtttccagtcacttttgtgaaaaattattactaactgacctg
-gtattgaaatggcttccaggaatatatccataccgagcatactgagctgactcaacttgt
-cgtggcatcaagattcaggatcagaggttatatctcaagatatatgaatggtcctacagc
-actcagttccacaagactgtgaaggagaggtttgaatgtatacacggagccagcagctag
-tttatggaaagtattacagatgtgtttgagacaggcagctaataaaaagaatgttatttt
-tctgcgttttgtaacgtttgtgcaatttctcttttttttttttttttttttggagacaag
-gtcttgctctgtcatctaggctggaatgcagtggtgaaatcatggcttactgcagcctca
-acctcctggtctcaagcaatcctccctctcagcctcctgagtagctgggactataggcac
-gtgccaccatgcctgactaatttcttttttccttttttttttttttttttgagacggagt
-ctcactgtcgtccagcttggagtgcagtggcacaatcttgactcactgcaacctctgcct
-cccagattcaagtgattctcctggctgagcctcccaagtagctgggattacaggtgccca
-ctaccacgtccagctaattttttgtatttttagtagagatgaggttctgccatgttgtct
-agattggtctcaaactcctgagctcaggtgatccaccagcctcggcctcccaaagtgcta
-ggattacaggtatgagccaccatgcctggccagctaatttctttttaaaatttttttgta
-gagctggggatctcgctttgttgcccaggctggtctgaagcccctgggctcaggcactcc
-ttccacctcgacctcccaaagtggtgggattacaggcatgagccaccttattgtggtttc
-ttgtctctttctaaccaaatcttcactttattacttaatttcatatctgtaattttttct
-taaagaggtctccctaGggctggacgtggtggctcacgcctgtaatcccagcactttggg
-aggccgaggtgggtggatcgcctgaggtcaggagttcaagaccagcctgaccaacatact
-gaaaccctgtctctactaaaaatacaaaaaattagcgggtatggtggcgggcacctgtaa
-tcccagctactcaggaggctaagacaggaaaatcacttgaacttgggaggcagaggttgc
-agggagctgagatcgtgccattgcattccagcctgggcgataagagtgaaactctgtctc
-aaaaaaaaaaaaaaaaaaaaaaaaagaaGTCTCCCTAGGCTGAAGCTACCTGCTCAATCT
-TCTCTTGTGTCTTATAGGATCACAGGATCCCCCTTGCCTTACCTCACTGTTACTCCCAAA
-CAGTTCTCACATGTTTACAAGGGAATGTAACAGAGTGGATCAGAGAATTCATTCTGGATC
-CAGACCGAccttagttttctcatctatataatgggaataatagcaggatctctcgcctta
-gatagtcatgaagtccaatgagatgatgtgtataaagccctaacacaatgTAGCAGAGGG
-CACAGGGCCAGGATTGATATTTAGCTGGTCCTCACGGATACAGCAGACTCCCTGTTTATG
-ACAGTGGTTGGCTCTGATTTGGTTGGTGTCCATGCCAGAGTGTACAATCATTATTAGCTA
-TTGATATATTATTAGCTCCCTCCCCTGCCCACCCAGGGGTTTACGCAGTAAGTTCTCAAT
-TATTGGCAATCCAAACAAAGAATAAAAGACACCAGCTGGAATGAAACAGAGAAGCTGGTT
-CCAAATTGAGCAATTCAGACTGACTGCTATAAAATTTCCTCACCTTAAAGGCCCTTAGAG
-TTAATTCATTCTAATCCCCCTAAAAATATACTTTTTTGACATGTTCAAGTATTGGAAATT
-TGGAAAATTCACAAAAACACAAAGAAGAAATTAACTGCTGTGATTATAGATGATTATACA
-CATATACATATGTATTTAATACATATTTATGCTGTACATAGTGTTTTGAAGCATACTGTA
-CTTCAAAAAAATTTGGGAGgggtgcattggcttatgcctgtaatcctagaaattcaggag
-gccaaagcaggaggatcacttgaggccaggagttctagactggcctggggcaacatagcg
-agacccgtagcttgacatggtgatgcgggcctgtagtcttagttactctggaggctgagg
-tgtgaggattgcttcaacctaggttacagtgagctatgattgcaccactgcactccaccc
-tgggcaacagagctagaccctgtctctaaaaaacataaataaaCCAATGTTTAATACTTA
-GCATTTCCCCCTATCTTTAAATATCTTCTAGCTACTTCACttttatttttatctttttga
-gatgatctcttgcccaggttggggtgcagtggcatgatctcagcttactgcatcccccac
-atcccaggttcaatctattctcctgcctcagcctcctgagtagctgggattacaggcatg
-tggcaccacgcctggctaatttttgtatttttagtagagacgaggtttcaccacgttggc
-caggctggtcttgaactcctgacttcaggtgatctggtcgcctcagcctcccaaagtgct
-gggattacaggtgtgagccactgctcctggTAGCTACTTCACTTTTAATGGCTGCATAAT
-ATTCCTCATCAGAAAGTGGGAAAAATTAggctaggtggcgtggctcatgcctgtaatcct
-agtactttgggaggctgagttggtagaattgctagagctcaggagtttaagatcagtctg
-ggcaacatggcaaaaccccatccctacaaaaaatacagaaaataccgggtgtggtggtgc
-acacctgtagtcccagctacttgggaggctgaggtgggaagattgcttgaccccaggaga
-ttgaggctgctgtgagctgagatcctgccactgcactccagcctgggcgacagagtgaga
-ctccatctcaaaaaaaaaaaaaaaaaaagaaaagaaaaaGATAAAGAAATAAATAAAGTG
-TTAATAATTAAAAGTACTTTTAGAGGGTTATGTCATAAGCCTTGACAAGACTTGTTCTGT
-AAAGCTACCCGGCATGCAAAAAGCTCAATTAAGTTAGCTCCTCCACAGGATGGAAttata
-taaccaatccctttcaagaggcattgaagttgtttccattattttgctatgatgaataag
-gctgagcaatattaatctttgctcatatctttggtcatttcctttgtaaatttcgggact
-gctgggtATGCACATTTTAAAATTAActcactcatcatcatgcagttaggagaacagaga
-aaggaaggggcttgcaccgggtcacatagggagttagcgtcaaagtcaggactaggaacc
-agccagggccctctaactGGAGCTCTTCCAGCTGGGGTCCTAGAGGAAGTCCCAGCTGGC
-CGCGGGAGGGAGGAGGAGGAAGGGAAAGAACCAGGCGCCGGGGCTGAAGCGGCGGCAGGA
-AGAAGGTGGGGCCGGCTGGGAGGAGCGGGCGGAGCTGCTGAGCAGCGCCTCTCCTTCGGG
-CGGGGGAAGCTAAGCGGTCGCCTGGCAACCCTGGCGGCGCGCCGTTCGAACGGAAGCGAG
-GAACCAATCAGGAAGTCCGGGGCGAACCATTCTGGTGTGAAGGGGGGCGGCGTGCTCACT
-TCCCCTTCCACGGCGCCCCAGGGACTTTCCCTGCGGTGGGGGCCTTCGACAGTGAGGGCC
-ACCCGCTCAGCTCGACCGCGGAGGGCAGCTCCAAAGGGGACCCCAAAGGTGCCCACGCGG
-GGCTGGGGCCTCCTGGGCGTCGTTGGGAGCGGCCACTACCGGCCCGGGTCCGAGCTGTCA
-GCCTCTCCAAAGCCTGCGCGAGAGGAGCCGGGACACGCCTAGCGCGGGCTCCAGGTGAGG
-GCGCGGGTGGGTCCGGGTGCGACCCCGGGTCTGGGGGCCCCGTTCCCCGAGCGTCTGCTG
-TCTGCTTTCTCCCCGCGTCGTACCTGCGTGTcatttcacagatgaggactctgaggctca
-gagaggcaagtgTCCCGGCCCGGCGAGCTCTGGCGGAGAATCCAGTTCAAGTCTTTCTGC
-CCCACCTCGCAGCCCCCTAGTCTAGTCACATCTGGACTTGCCTTGAGAGGCCCAGACGGG
-CAACTGGTAGTCATTTTCCCAGCGTTTTATCGGCAGGGACCTGTAGACCCCTGGCTGGAT
-CACATATCCCCGCGCCCCACACTGTCCTCGGGATACCCCCTTTGGGCGTCTGTCTTTCCT
-TCTCCGCAGTCCGGGGTTGGACTCGGCTCATTTGGCGCCTTTCTGTCTACGGGGACAGAG
-GACCACTCTTTGGGGATCGGACGGGACTGACATTTCTGGGCTGGATGCAGGGGCAGCAGA
-TTCTCCAGCCCCCAGAGCCGCTGCTGGCCTCTTGGGAATCATCCCCAGTTTGGGGAAGGG
-AATAGAGCCAGTCCCTAAACCAAAGCCACTAGTCACCAGAGACTTTGGAATTGGGAGTGG
-GGCCGGAATCCCCCCAGGTGGAGCAGCTGACCTAGGCCAGACCCTGCTGTGTCTCCtggg
-gacaccccctgccccctaggttgctattgtcagtctccttttgtaggtggggaaacggag
-gttctaagaagttaagccccttttcgaagtcacagtcagacaatgcagtggttagctcct
-agtccctctggcttcAATCTTAGAATCCTTGACACACAGAATCATGCATTTTGAGAGTCT
-TCAATCTCTTCATAAGGGAGTTACATATCCTCTCTCCTCTGGAGCCTGCCCCTGGCTTTG
-GGGGACAGGATCTCCGAGGACTCAGAAAGAAAACAAGGCTTTCTTTTATTCTTTCAACAA
-ATATTATTTATTGACTTCATAAGCCCTGCTCTGGTTCTTGCATGTTTTGGTTTTTTTACT
-TATTAGCAAATGTATCATCTTCTCCCACTGTGATGcaaggcaggggctgaggcaattgag
-ccagtgcaaaatttagggatgcccaaaacctcagtaatcaagaCTGAAACTAACGTTCAT
-GGACCATTTGTGTGTTCTGCAGGCAGGAGGTTAACTCACACAGCCTTCATGAAGTGCAGT
-CCTCCCAtctctctctctctctctctctctctctctctctctctatatatatatatacac
-acacacatatatacacacacacatatatgtatatatatgtatgtgtgtatatatgtatat
-atgtgtatatatatgcatatttataAATCATGAAACCACTgccctgtccctgagttgctc
-tgtgacattgagtaagtttcttcagtctctgggcTGAGCTAAGAAGTCATGATGGTGCAC
-TCAGGCCTGGGCAGAGGGCAGTCTAGGATAGGAAGTGGGCTTGGCTGTGGATCTGCCTCC
-CCCTCCCCTTTCTAATCctgcgtgccaggcccttccccaagaccttgcatgtgttatctt
-ccattctgtcctcactgcaaaatccttcatccccattttgcaacctcaagtgcagaccta
-ggcctagaagatcaaCTTGGTATCAGTGGGCCTAGATGTCCACATCCACACCCATTCCAC
-AGCCTACTCCCTTCTCCCTTCCTAATGTTAGTGCAAGGCCACCCTGAGCAAGGCTGACTC
-CTGGGCAGGCCAGGGCACCAGCGTCTGGGAGGCCTCCAGAAATAGCTCAGGGCCTGGTGT
-GGCTCTGGAGGTGGCCCAGCTGGGTGTCCCTGACCTGGACAGCTGGGCTGAAATTGAGCT
-GGGGCTGCCCTGCTGGCTGGCCCCTTGCCACTGCCTGGAGCCTTCCCAATCTCCTCTGGG
-GCAGGCAAGGGCCTCCCCAAATCTAGGCCAGGCTTCTGCTGAAGGGAAAGAAAGAAGCAG
-GTGGGAGGAAGGGGGCGGGTTGGGTGTAGAATGTCATGAAAATTATAACCTTTGGAAACC
-ACACCTCCCACCCCCTCACCAAAGAATaaaaatcactaacacctcttgagcatttactat
-gttctaagtactttacaagtatgaactcatttaattccctcaactctgtgatataaggta
-attactgctgttcttatttccatcttgcagaggggaaactgagcacaagagaggtttaat
-aatttgcataagataacctagaggtggagtttgaacccagagagtctggctctaaatttt
-acatttttTGGGGGGGGGGGTGGGGTGGGGCAGTGAATGAATtaaaatgtatataaaata
-aaatttaccattgtaaccacttttaagtatacagttcagtggcattaagtacattcccca
-ttgcctctccccccagtgcctggcaatcaccattctactttctgtttgagtgaatttgac
-tactttgggtacctctaggtattataaatggaatcataacagtatttgtcttgttgtgtc
-tggcttatttcacttagcataatgcctttaagtttcacccatgttgttgtatgtgttaga
-attttcttttttatggcggaataatctattctaatattctatgtatatgccacattctgt
-ttatccattcattccttgatggacacttggattgcttttggctgttgtgactaatgctgc
-tttgagcatgaatgtacaaatatctgtttgagttcctgtttttaattgttttgggtatac
-actcagaagtggaattgctgggtgatcctatggcaattctgtttaattttttgaggaact
-actttactgtgtttcacagtgactgcaccattttatgtgtccatcagcagtgcacaaagt
-gctaatttctcaacatcttcaccaacacttgttattttctgtttgtattttttttttggt
-aatggccatcttcaggggtgtgatgtggtgtctcattgtggttttaatttacatttccct
-aatgactaatggtgttgagcatcttttcctgtgcctgttggccatttgttatctttggag
-aaatgtctgttcaagtGACTCTGCAttgttttttttttttttttttttttttgagacaag
-agtttcgctctgtcgcccaggctggagtgcagtggcgccatctcggctcactgcaacctc
-tgtgtcccgggttcaaatgattctcctgcttcagcctcctgagtagctgggattataggc
-ccccgccaccatgctgggctaatttttatatttttagtagagacggggtttcatcatctt
-ggccagtctggtcttgaactcctgaccttgtgaaccacctgcctcagcctccaaagtgct
-gggattacaggcttgagccactgcacccagtcATGACTCTGCATTCTTAACCATTACCTG
-TGCTTCTCTTAGATTTGTAACCTCTGAGAATAGTGGATCAGCTTTCTGGGCTGATGAAGC
-CCTCCCTCAGGAGCTGGGCACTGGATGATCTATTTGGTTGAATAGTTATCATAGCCTGCA
-CTTTGGTGACATTTGTCATGCATGGACCTCATGCAGAgagggaggcactgttgtgagtcc
-tgttttgcagttagggaaactgagatatggagaagttgagtattttatccaaggtctcat
-agctaatcattggtggagctaggatttgaatgggttctggagtccatgctATACCTTACA
-GATAtggccagggggatggagtagtgaagaccactgcaggcagcagaaccagtgtgtgca
-gaggTTTGTATATGGTGGCTTTGGAGAAAGAACAGGACTTGGGTAGAAGTGGTCAGAGCC
-CAGCTTGAATGGGGGTGACTTGAAGTTGGAGGAAGAGTAGGACAGGTCTGGAAAGGCCAG
-GAGCACGGTGAGGGTTTGGGGAGGAGGCTTGGTGCTTAGGGACCCTGTCCTTTTTTTTTT
-TTCtcttctcacaagatatttattaattacaaagggaaaataataactgtacagtggaga
-aatttggcagatactgccttaaccaaggaattggctgatcactaagattaagacaaactg
-ttgttatgagtgggtgtggtaatgtacctatagtcccagccactcaggaggctgaggtgg
-caggattgcttcagcccatctatttgaggctgcagtgagctatggagtgcactccaacct
-gggcaacacagtgagacctcatttctaaaaaaagaaaaaagaagccttctgataccatgt
-actaagaaggacacaacatcacttttgtgttattcttgacagatatgtttaacttTCTCT
-CctttctttcttcctctctttctttcttctctctttcttACTGATATAAGAAAAAGCTTT
-ATACATTTAATATATACCTCTTGATGAGTGGCCTTGGCCTTTGAGGTGGGCTGGGTCCAG
-AACAGCCGGTTGTTCAACGGTATTTCCTCGTGTTTGGTCCCTGAAGGAAGAAAATTGGAA
-GGGTGTGATggagctcatggtccagtgggagagacaggaaacgagttatatttcctatcc
-tagataagagtatctaaaatgacaggatgtaatgagtgctcggaagggaataaaatgggt
-gaaattgctgagggggtctcttggaggagatgacatttgaaatgagatctgaagggggtg
-agggaagaggttccagacagagaacagctggtgcaaaagccctgaggcaggaaagacctt
-atgttcaggaacagcagggagggctttgtggccagagcaggaaagaggttggagataaga
-tgggagatttggacaaggactgagtcctggaaggcctgagggccaagtggggagcttggA
-ttttttttttttttttttttgagacagagtcttgctctgttgtccaggctggagtgcagt
-ggctcaatctcagctcactgcaggGAGCTTGGATTTTATTGTAAGGGAGCCACAGGAGGG
-TTTAAACACAGCAGTAATGAGACTTTATTTCTGCTGGGAAAACATtgccgttattgcccc
-cattttacagcagaggaaaccgagactcagaaccatgaccagggagtgcttcctaaggtG
-GTTTCTCCCTCTGGGGTCCAGCCGACGAGGCAGTAGATTCCTTGGGACTTCCTTGGGGGG
-CACATCTGGTGAGTGGCCAAAGCCCAACACTGAAAACACCGTCTCTTCCACCTCCCCTCC
-CCAGATGTGAgcctgggttccaatcctggctctaccattaatcagctgtgtaattttggg
-cacgtggccttacctcttggagcctcagttttctcatctgaaaatgggcataataatagt
-agccctcacagggtaggtgtgaggattaaattagttaacattttgtagagcttagaacag
-tgtctggtacaaagaaagtgctcagatgagatttgttcttTTCTTTTTTGGCTGTAAGTT
-TATTCAATGTGAAATAATCCTCTCCAATTTTATTGAGGTGGCTGACCACGTCCACGACCA
-CATCTGCCTCTAAACTGGAATTCGGTTGCTGACCCAGCCCCAGCCTCGGCTTTCTTGTCA
-GCACCAGGGGGCACAGAACACCGTCTGTAGGTATCTCTGTCAGCTTCCCGTCTTGTGAGT
-CTTGCAGGTCGCTTACCCTCCAGACCTTTAGGCCGAGGCCTGCCAGTCTCTGGACGGCTG
-CGGTGTAGGGTGGCAGGAACAATCTCCGGGGGCAGATGTAGGGTGGCAGGAACAATCTCT
-GGGGGCAGATGAAGGTAATCACGGAGATACTGGCTACCCTCATTGGTAAGGTACCAGTAG
-AAATGTCTCCAGGCAAACTGTTCCTTCACGCAGCCCCGGGACTTGAGAGACTGCATGGCC
-TTCATGACGTGAAGGTTGGGCACATTCTTGTCTGCCAGCTCCGGGTGCTTAGGCATGTGG
-ACATCCTTCTTGGCCACCATGACTCCCTCCTTAAAAAGGAGTTCATGAATGGCAATCCGG
-TTCTTCTTAGGCATCAGCATCTTGGCAGCTGTAGGGTCCGGGGCTGGGGCTGGAAAGGAA
-GGACTGTTCTTTTCTTTGCTATTACGAAAATCATTATTGTTGCTTTGCTGTTACTACTAT
-TAGCGCCTGAAGGAGCCTTCCCTCCCCATCCCCCATTTCTGCCTCCGTGGAGGGCTAGGC
-AGGGCTCAGCAGGCCATTTGGAGGATGAAGGACTTGTTGCCCCGTCCCCTGTAAAGTCAG
-GGACTGGAGGAGGCTGCAGTGCTGAGGGGGAAGGAAAGCTGATGTGCATCACTGCCGGTC
-TCCTCATGCCCTGTACCCTAGTCCTGGCCCAGCTCCCACAGGCACAGACATGGAACAGGA
-GCCTCTTCAGCCTGAGTGTGGCAGAGGGCTGGGGCTGAGGCCTGGGGGACAGCTCCTTCT
-CTGGGCCTCAGGATTCCCATGAAAAAATGGCCTATCAAATGTTCCTACCTGCAGTGAGTT
-ATAGGACTTGGGGTGGAAGAGGTGACAGTCACCTCCCTCTGGGAATTCCTTCCTGCAGGG
-CTGCAGTCTCATGGGATTAAATGAGGGGGCTCTGGGGATTTAAATGAGTATGGTGCCTGG
-CACCCCAAAATTCTAGTTATTGTTGTTACTATGACGGCTGTTGTTGCCGATGTTAACCGT
-TTTCACAAGGCAGCTGAGGCATGCTCAGGCTCAGCCTGTTCCAGAGGGATGGACTCTACA
-CGTGACAGCATGGAGCACCAGGAGGGTCCCGCAGCCTGGTCAGGGACACACAGCTAGAAA
-GTGGTGGCGTTAAGCCTTGGTCTGGAGGGAAAGTGCGCAGGCTGGACTCCCCAGAgtgat
-tttgggctagtgactcagcctctctcagcctcagtttaccattagtcaaatggggtaaca
-atagaactcaccagatagtgattgttgggaagattaaaatgggttacccgataccaagaa
-aaacactttcccgtgcctggcacaGTGAACATCACCTGGCGGTCGTTCTGAGTGTCAGGG
-AGCGGGGCTCAGTTTGTCCATCTCTAAGGTGGGTGCGCTTGCCTGCCAGAGCCACGGGGA
-CCCCGCGCGCCAGGTGTGCGGTGGGCGGGTCTCGGCTCCCGGAAGAACTTCCCTGGGTGG
-TCCTGGAGCGGGTCGGACCCAGTTCCTGAGCCAGGCCAGCTGCCGGCGGCCGGGGCTCGG
-GTTCTGGCCCCTGCCTGGCTTTCCTTACCCTTTTCGGGTAGTACCTGGACCAGCGGGTTC
-ACTTGCCCGCGGCCGCCGGAAGTTGCGCAAACTCAGCTTGCCGGAGCCCCAGGTGGGCCG
-GGCCGGAGGAGCGCAGGCCAGCGGCGCGGGCGCAGCCGGGTACGTGCGGACCGCGGCGGG
-GGGCGCCCAGCCGGGGTAGGGGGCGGCCCGAGCACCCCTCCACCCCAGGACGGCGGGAAC
-GGGGCAGGGATCTACCTTTCGGCTTCAAGAGGACCGCGGGGATGGTGCCGCTCTCTCCCT
-CATTTGAGAGCCAGGAGGGGCGGCGAGGGGCAAGGGTCACACAGCGCCCTGCTAGCCGAC
-CCCCCATCCCCCGCCACCGGGAGTCCTCAAGCTTTTCCGGAATTGAGGGAGAGCAAAAGC
-CAGCCTGGGGATCTGAGTTCCCCCCAGCCCTGCCCCGCGGCCTCTGGAGGCTGACGCTGG
-GGAGCTAGTGGGGAGGGGGCCAGGTGGGGATGCGCGCCCCCGGGATGCAAGCCAGAAGGG
-CCGGCGGTTGGGGGCATCCGTGGGAGGCATTTGAATCCGTGGGTGGGGCATTGGGCGGTG
-AGAGGAGGCCTCAGAGGGGACATTGAGTCGCGCTTGGGGACTTGGGACCCTGGCTTCACC
-TGGCGGGAGCCGCTGCACCTCCGTTTGCCCACCCGTGACGTGGGGCTGTTGAGGTCAGCT
-CACCGATCAGCCTCTGTCTTGGGCCTGCTTTGTCCGCGGTGTGGGCTGGGACAGACCCTC
-GTGGGGCTTGCTTAGAGACCCCTGCGTGGGGGTGGTCTGTGGACTTGGTTAGTCGAAATC
-TTCTTGAAGACCAGGAGCCTGGTTCGTGGCTCCGCctttttgccagatgccgaggaaagc
-cctcgacctgtttgatctctccatccttatcgtgacctggaggctcaggaaggtctattt
-ttaacctcgtttcacggataaggtaaccgagtctgtaaagaggcgaagctgcttgcgcaa
-ggcgcacagcgggcgggtgggcgagccGAAggccggcgggcccgcggcgccAAACCCGGG
-GTTGGCTCTCGCATCTGTCCCGGCCCCGCCAGAGGGGACCTCAGGGCCAGCAGATGGGGC
-CAGAGGGGCTGGGGGCCCGATCGGGGTCGTGCACGGGGTTTCTGCCCCGGCCCCGCCCGT
-CTGACCTCCTTCTCCCTCTTTATCCGGATGGTGCCCGCAAGGGAACTGCCACTGCGGACG
-GGTTGGACTGGTTTGGGAGGTGGCGGCCTGGGGGTGGGGCAGAGTTTGGCTGGCTCTGCT
-GTGCTCCTTTCCTGTCAGGTCCTTCCCACCTGAGGTCTCCTGGGGGTCGGCCCTGGTGGA
-GCGAGGCTTCCTTTCCCATCCACTCCATCTCTCCTGCCTTGGGAGCAGCACCCAAGGATC
-TATTCCCAACTCATGGCTGCTGCAGAGGTCTCCAGCTGGTGGTTGGGGGCCAGATGGAGG
-AGGAGGGGACAGATATGTTCGCAGACATATTTTGTTTGCTGTATATGCAATGTTTTAATC
-ATTATTATCGAATATGCTGACAGTTAAGAATCTAGAGTTTTTATGTACTCCTGGATTTCC
-AGCTTCCTGGAACAATACACCTACCACCTTGGACCCATATGCCTGCAGCAGGCAGGGTAC
-CTAGATGTCTAGTTCATCCCTGATCACCCAGTTCACATCTGGCTCCCATAAATATttcag
-ttcaataaatttttattgaatattctgccctagtatgtgtctagggcagtatcttgaaac
-tggggtatagtgaacaaaatagccaacccccgcccctacacacacacgcctgccctcatg
-gagctgatattttagggggatagagacaacaaagagtaaaacaaccatacacaaatagag
-tacttgtgcaggggataaggagaaaaggaatagtgccgggagggggtcaggagtgccggg
-gagaaacaggacgtggtattGAGATCAGTGCCTTatttatctattctgggacctgggaaa
-gccacttctctgagtctcagtttctccatctgcacaacgACCCACAGGCTTGTGGGAGGT
-TATAGGGAGGATGGCACCCAGCAGAGATCCCTGCCTCCCCACCCCAATCCAGACTCACTC
-CCTTCTGGATTTTTGGATGTCTAGGTGGGgctgtccaatgtagcttcctaccatggatgg
-aaatgctgtactctgtgctgccaaacacagtggcaactggccacatgtggctattgagaa
-cttgaaatgccactagtgtagctcaggaactgaattttatgtttttatttcatttaaatt
-taaagttaaggttgaatagccacatgtggctgctggctattgagctggacagcacggGTC
-TAGATGGCTTGAACTGTAAGCCTTCTTGGGGAACACCCAGATTAAGTACCCGCCCCCTCC
-ATTTTACAGATGAGAATGTTTGGGACTTGGTATGTGGGTTTTCTTCTGTCCCATCTCCAA
-GGGGCCTTGTGGGGTGACTCTGTGGGCTTGGCCCTTCCTTGGAAACAGGGTCAGGGTTGG
-CTTGATGTCTGGGGCATCAGGTCCTGACACTTGGGTGACCACGTAGACACTTGTGCATCC
-AGGTGTATGCCCTCCTCCCAGGTGAGTACCCATTCCATGGCTGCAGGCAGATCGAGGGTC
-TGCCGGATGCCTCCATGCAGGGCTGTGTGATTTTGGACATTTCCAGCTTCTCTCAGCACA
-GCATAGCTCAGGGCTGATGTTTCCACGTGACAGGCATTTGTGGATCACCGTGGGCCATCC
-AGTTCCATGCAGGAAGCTGACGGATGTCTGGACTCCACTGGGGCGCGGGTGGAGATTTTC
-TTTGCTCCTTCCCTATAAGCTCTGCCCTTTGCCTGGGGCCTGGCATGTCTAGGCGGGTGG
-ATGGCACAGGGCAGCTTCCTGCCTGGATGGGTGAGGGGTAGAGGTGGTACCAGGCTCCCT
-GTGGGGAGTCCAGGTGGGGTGTGGGGCTGGAGCCCTTTTTCTTGGTCATTTAACCCTACG
-CCCCGGTGCCAGCACCTTCCTTTTTGGTGGTCAGGGGCAGAgccacctactcgctgggtt
-aacttaagcaagttgtttgcctctctgggcttcagtttctccatccaaaaaacggggctg
-ttgagaggacctGAGGTTGAGTTGACTGGTGCGTAGCACAGAGCCTGGAGCCTCCCTTGC
-TCCCTTTAGCGCGTGCCTTGCCCTGTCTTTTCTGCTCAGGTTGCCCAGGTCGCCCAGGTC
-TTTTTTCTCTAGCACCTTTTTTCCTCTCTTGGTCTCAGCTGGGCCTGGTTCTCCCGGGGC
-AGGAGGGAGGGGGTGTGGGTGGGGCCTGAGGCCCCGCAGCTGCTGCCTTGTGCCTGCTGA
-TTGGCTCCTTGTGGAGGGGCGTGGTCTCTACCTTATAATAGGGAGGGCGTCTTATCCTCT
-CAGCCGCGGCTGAGCCTCTTTGTCTGAGCGCGCTCGGCTTTTTTTTTTTTTTCTCTCTCC
-TTCCCTGCAGCAGTGGCCGGTGTCCAGCTGCCTACTTTCTGCCCGGATCTCTGGCTCCTC
-ATCTCTCCGGTCTCCGCAGACTAAAGCCCTCGGGATATGCAGCAGCCATGCCTGTGCACA
-CGCTGAGCCCCGGAGCCCCGTCCGCCCCCGCCCTACCTTGCCGCCTGCGGACCAGGGTCC
-CTGGCTACCTGCTACGGGGGCCGGCAGATGGTGGAGCCCGGAAACCGAGCGCTGTGGAGC
-GCCTGGAGGCCGACAAGGCCAAGTACGTCAAGAGCCTGCACGTGGCCAACACCCGCCAGG
-AGCCTGTGCAGCCCCTGCTGTCCAAACAGCCGCTCTTTAGCCCTGAGACTCGCCGCACAG
-TGCTCACGCCCAGCCGCCGAGCCCTGCCTGGCCCCTGCCGACGGCCCCAGCTGGACCTGG
-ACATCCTCAGCAGCCTCATCGACTTGTGTGACAGCCCCGTGTCCCCTGCCGAGGCCAGCC
-GCACTCCTGGACGGGCCGAGGGAGCCGGCCGTCCTCCCCCAGCCACCCCTCCGCGACCGC
-CGCCCAGTACCTCTGCGGTCCGCCGGGTGGACGTccgccccctgcccgcctcgcctgccc
-ggccctgcccatcacccggccctgccgccgcctccagcccagcccggccGCCGGGTTTGC
-AACGCTCCAAGTCGGACTTGAGCGAGCGCTTTTCTAGGGCAGCCGCTGATCTCGAGCGCT
-TTTTTAACTTCTGCGGCCTGGACCCGGAGGAGGCGAGAGGGTTGGGTGTGGCCCACCTGG
-CACGGGCCAGCTCGGATATCGTGTCCCTGGCAGGGCCCAGTGCTGGGCCGGGCAGCTCTG
-AAGGGGGCTGCTCCCGCCGCAGCTCGGTGACTGTTGAGGAGCGGGCCCGGGAGCGCGTTC
-CCTATGGCGTGTCGGTGGTGGAGCGCAATGCCCGCGTGATCAAGTGGTTGTATGGGCTAA
-GGCAGGCTCGGGAGAGCCCAGCAGCTGAAGGCTAGGCGCCACTGGGCCTGGAATTCGCCA
-CAGGACGGATCTTACAGAGGCAAGTGGTCCCTGGACCTCTCTTGCATCCATTCTCTAGAC
-GGCCGTGTCAGAGGCTCCACCCTGTTGTGAACTTGGTATGGAGGCAAAGGCTTAGAGGCT
-GGACCAGCATTGTTGGGCAAGGACTGACTCTCCAAGGGTTTTGTTCTTGGCTTTGGACAC
-CTGAGAACCCCCTCCTCCCCTCCCCCAATACAAGGTTTTTGACATGAGTGTACTCCTGCT
-TAGTTCCTCTTGTGGGGCTGCATTTGCGGTGCTTTGCCCTCCCCACTGTGAGTGAGGGGC
-CAAGGGATCTCCTCAATCCTGTCTCCCCAGCGGCTCTGTTTCCTCCTTCCTTCCTTGGCC
-TCTGTCCTTTGCTGACTTCCTCTTCCTTACCCAGCAGAACTCACCCTGGGGTCGGGGCAG
-TGGGGAGGGGCCTATCCACTGCTCTTCCTAGTCCTTGGCAGCTGGCCTAGGTGGGCAGAC
-TATAGGAGGGACTGGTTAGGAGTCTGCATTGCTTTGACTTCCCTCTCCTTGGTTAATAAA
-CACAAATGCTTGTTTCTCAAGGGCTGGGCCTTCAGACTCTTCTGTGTTCACAAGAGAAAG
-GGTGAGAGAAGTCTTGGGGTGGGGCCATCAAAACAGTAATTGTTCACCCCGAGGTCTAGT
-GGTGGGGCATGATGATAGCGGCTGGCCTGGCTGGAGACATGTCCCCGTGGTGGGTTCTCA
-TAACTCTCCTGGAAGGCTAGCAGGCCTGCCTCATCGAGGAGGAAACTGAGATCCAGCCAT
-GAGTGAGCTGGAATAGAGCTGGGAGTAGGAATGGGGTCTTTCCCCTGCACCAGAAAGGGA
-GCCTGCAGGGGAAAGGCCGATGGGGTGCATAGACTCTCCCCAACCAGGAGTGTTCCATCC
-AAGCCCTGCCCAGTTCCCAAGGGGGCAGGAAGCTCGGAGAGGGCAAATCCTGAACTTGAG
-GTCACACAGACCATAGAGTGAGGATGAGAAGTGGGAGTTTTGGAGGAAGAGAGACTTGGG
-GTGGACGGCACAAAATGAGTGGCctccctggcgatcttggacaagccagtttccctctgg
-gcctcagtGGGAGAGTTAGGCAGCACAGTCCTCCTTGGGTTGGGGCACTGGTGCATTCTG
-GGCCCTTCATGCTATATTCCAATACCTGGGGAGAGGGGAAGGAAGGGGCTGGCACTGGGC
-TTCGAGGCCTCAGCTTCTTCCAGTCTCCCTCCAGGTCAGTTACCTACTAGGACACCCCAC
-CTTGGCTAGTGGAGCAGCTAGGGCTAGAGCTGGGCCTACAAAGGGCGAAAGCGGGGGTGG
-CCTCTCTGGTGCCCCACGGTGGGCGTGGAGAGGGGGTGGGTGGCGCTTCCTTTCACAGGC
-TGCCTTGGCTGCAGCACTCAGAAACAGGAAGCTCTAATGGGGGCCCTGGTGACAGGTTTG
-ATGTAGGTTTTATTTTAAGCATAAAGAGGAGATTTCCGTTGGACTGTTGACAAACATCCA
-CATCAGCCCAGCTGTCCATCTCTCTGTCTGTCTGCCTGTCTACAACTAGCCCCCAGGGGC
-CTGGGATGGGCCTGGGCAGTTTGGGGAAGGAAGGGAAAATTGGGTTCTAGAAGAAGATGG
-TGTTCCAGCTCATGAGACTGGAGCTCATGATACTGGTGGGGAGACAAGCATGAGGAGGGT
-GGTGACCTACCCACAACCCCCCATGGTGCCCAGCAGTTTTGACAATGCAGGAGCTGGGCC
-TCCAGGGTCCCCATGCTGAAGGAGTGATGGTGTCAGGAGAGAGAATCCAGGCAGGATCTG
-CAGACGTGGTGCCCTTTGAGGTGTCAAAGACTAGATTTCCTAGGCAACCCTGCTAGAATT
-CAGGGCTAGTCATTGCCCCTTGCTGTGACCTGGCAGcctccgagtaacccaagaaggtgg
-atgggctggctgcattttacatgtgaagaaattgaggttcagGTCACAGGACTGGTGGGT
-GACACCTTGTTTCTGAAGGAGGGTACAGTGCttgaatcctcaaggtagccttttgaggac
-cagatatattgtcagagcaggaggttgagctcagggaaggatagcgacttgtatactgtc
-acatagcaggtctgcaggacagcctggggtcacactcttgcctgccagacACATCGCAGT
-CTGGATTCCTGGTTCTCCCAGCATGTACCCCACCACTCTTCCTCATCTTGGCAGCCTTTT
-CTTCTGGTCACTTTATTACTGAGCATCTActgggtgcccagcagtggataagacagacat
-ggcccctgtcctagtctggagaagagaatgggcaactaaacattcagcacataaataatc
-atagaatgtAAAGCAGGTATACTTAGGGACTTCTGCCCTAAAACCAGAGCTGTTCCCAGG
-AGCTGGACCAGGGGATAGCTGAAAAGAGAACGCCTTTCCATAAATCCACTGGGAGGGTCT
-GTTGGGGAGAGAGCAGGGAGGGATTCTTGGAAGTGGGGAAGGTGCCAGATTGAGTCTTCT
-CCAATGGTTATGGCTTGGTCTTGGGAGGGCTCCCCCTGTTCCAGGATTCTGGAGCCTCCC
-GCCTTCCCTGCAGGCCTCTGTGGAGGGAGCAGGGCGGGGGGCTTTTGCACTCCTCCCTCC
-CCCAACCCTGCAGCCTTGGGGATCTGTGGAAACAGCCCCTCTATTGTTCTGCCTCCAGTT
-GGAGTGTGAGCCCTCGGAGGGCCTGCAGCTGCTGCCCTGTCTCCTGGGGCTGCCCAGCCC
-TCCGAAGCAGCTCCCCCAGGCCAGCCTGGCCCCAGCTGCCTAGCCCCTAATTAGGCAGAG
-ATGGGATCTGCTCTCTGATCCATTTCCCACCAGCTAATTATATACACGTGGATTtgggaa
-ccaggcaacctggctgctcacttctatcatgaaggtggatgggccctgggaaaggcagcc
-ccccccccacagacctcagtttacccttttggcagaggatggagtGTAGCTGCAGAGGCC
-TGTTCCCTGTCCTTGGTTAAATAGTTCTGTTCCTGCTACTGAAACATTTAAGGAGACCCC
-CCACCCCCATCTTACCTGATATCCTGTGTACAGGGGACCAGGAAAGGGTTGAGGAATTTG
-GCTATAGGTCCTTGACTCTAGGACCCCAGGGTAGGGTCATAGGATATAGATGAGAGCATG
-GCTGCAGCTGGCTGCCAATTAGATGTGCATATAGGAGGGCTTACAGTTGTGCTGGTCCAT
-CTGGGTGGCCTGAACACCCggccgggtgcggtggctcacgtctgtaatcccagcactttg
-ggaggccaaggcaggcggatcacttgaaaccaggagtttgagaccagcctggacaacgtg
-gtgaaatcccgtctctactaaaaatacaaaaattagctaggcatagtggcggacacctat
-aatcccagctacttgggaggctgaggcatgagattcgcttgaaccctggaggtggaggtt
-gcagtgagccaatatcatagcactgccctccagcctgggtgacaaagaaagactccctct
-caaaaaaaaaaaaaaaGGAGTGAACACCCCATCCAGGTTTTTAAAAaggtaatattggtt
-gatgggtacagcaaaccaccgtggcacatacatatctatgtaacaaacctgcacattctg
-cacatgtatctcagaacttaaagtagaataaaaataaaataaaaGGTAATATTATTTTTC
-AGATAATTCACTCATATATTTCTTCCAACAttttattaagaaaaatttcaaacatagagt
-tgaaagaattagacagtgaacattcatatacccacctactaatgcacacttgttaatatt
-tcactatatttgctctatcaggaatctacccatctctccatccATTAATACAACTTATTT
-TTTTAATACAACTTATTTTTTAATAAAGCTTTTCAAATTAAGTTGCATATATCAGTACAC
-TTCCCTTAAAGTCACTTTAGTGTGCATGCCATTAGCTAGAATTCAATATTTGTTTGTCTT
-GTTCCTCTCTaggtaacatttacatggaatgaaatgcacagatcttaaaggtgccatttg
-ctgaatttagacaaatgcatactgtaccccaaacccctatcagggtatcaagcattatca
-cctcagaaagtttccttgcatcgctctcctgccgattgctgcctgcccaCCATGGACATA
-TTTTTATATCCATATATATCAGTACTAACaagcagcatcccttgtcctttcctctacatc
-agcctcgctccccaaaagcaaccacttacaacttcttaaactatttcttctggtactttc
-ctccatatttttaaataacttgcttttcctgctgttttcttgatcaattttaggcataca
-cacacacacacacacacacacacacacacacacacacaTATATAtttattttttttttga
-gacagaatcttgctctgttgccccggctggagtgcagtggtgtgatcttggctcactgta
-acccctgcctcccaggttcaagcgattctcctgcctcagccacctaagtagctgggacta
-caggtgtgtgccaccacgcctggctaatttttgtattttttgtagagatggggtttcacc
-atgttgaccaggctggtcttgaattcctgacctcaagtgatccacccaccttggcttccc
-acagtgctgggattacaggcgtgagccagtgtgtctgaccAATTTTAGGCACATATTGAC
-TGACTTTCTGGTCTGATGTTttcatagtgtggcctccactgcctggctgcctggctttgg
-atcccagcccttcctctttctggctgtatgaccttgggcagtaacttaacctccttgggc
-ctcagttttctcatttgtaaaatgagggtgataataatagtgctgaggttattggattgt
-tatacggattcaagatgtaaaaggctgagaataatgaacatcacccagtgagtagtcaaA
-CTTTTTCTTCTCATAATCATTATTATCAAGAAAGATTTAGCTTTTGGTTCCCCCCTTTCA
-ATTGGCATTtatcacaattttttgtgaagtggattttagtgttatttatattatgactat
-gtaaatactgtttcctttcaagccaagtcatatattttggttacatttcctttcttgtac
-aactctttgttcttcctggagttactactcgctttgctttttttcatttgctgtttcctc
-ttaacccatccttaattcTCTTAATTCTTTGACACCCTCAGTCTCCCCATAGTTAACATT
-ACACATCCTGAAACTCTTCAAGTGCTTTTAAAGAAGCATCCCCATCCATTTAAAAAAAAC
-TGGAGCCAATTTTTAAAATAGAATCTCAAATACAATCTGTAAaataaagatttgtgagca
-tccactatgtgccaggagctgtgctaggcagagtgggaaggtagccaaataggggatatc
-cctgcccatgtggGTTTCCAAGAGGGATGAAAACTGAAGCTCCACACCCCCAGCCTCTGC
-ATTTACCGGGGAACACCTCAGCACCTCTAGGAATCTCAGGACCTCAGGGAGCCCAGATTT
-ACTTATTTGTAAAATGAGGATCATTTTGTCATTCTGCAATCACTCCTTAACCATGTTGTC
-TGGGGCTGTGTTGTGGCTGCTGGGTATAGAGCAATGATCTCCCCATCCCTTGAGGGGCTC
-ACAAGAGCTGTGGGATAGAGCGGAGGCTGTGGATTGCAGCGGAGCAATGGGAGCTGGGGA
-GCGGGTTTCCCAGAGGAAGTACCATAGGACGAAGAGGGTCTTGGTGGGTAAGGGCAGtaa
-acggctgttatgttccaagggctgtgcgaagaacttccatgtattgtcccatcaaatcct
-cccaaagacccattgaaaggggtcatatttttatcacaatttcatagatggggaaactaa
-ggccaggagagtccaaggccagggtcacacagctaataagcggcagaggcagtatttgaa
-cctatgcagttgggttcttaaccacacactgcactgtCTCTCACATCCAGATGCCCAGCT
-CCTGTCCCCACCTCATCCTGTATCTGCCTCGTCCTCTCCTGTCTACCCACTGGTGCTAAC
-CTCTGGCTCATTCCATGCCCTTCGCTTTATTCatccattcattcaacacaaatctactgg
-gcgccttttccacgcccaaccctgggctgggcagtgccagggacatagAGCTTGGGCAGT
-ATTGACTCACCCATTCCCAGATAGGCATTGACATTGACATGCAAGCGGCCAGGAAAGTTG
-TCTAAATAAAGGGGTGTTTGGGGTTGAGTGATGGCtgtgtgtatgtgtgtgtgtgtgtgG
-CCTGCAAGGGGTGTGTGTCAGTGTGGCAGCAACAGACTTTCTGTGGAGGCCATTTATGAA
-GGCATATCTGTGTACCCTTGAGAGTGTGTTGTCTGCAGAGGGTGTGTCCACCAGGTATGt
-ggatcagtgaggctctgctgcataacaaaccactctaagcccagaagcctaaaaccactt
-attagcctgtgtgaagtggcagtctggcctgggcttagctgggcagttctggttttacct
-gggttcacttgccttgctgcagtcagctgagggtgggggctctgggagggcttcactcac
-atgcttagcagttggcaggctgtttgctggggtgcctccatttgctttgatgaggctggc
-ttgggctcatgcttatggtgacctcagggttccacattcagcaagagaagataagctcca
-acgcacagtgcattttgagcctctacttgtgtcaagattataaatgtcctaatagcccaa
-gtgacatgtcaagtcagattcaaaggatggagaaatagactctctctctCTCTCTCTCGG
-TTGTGTTTTTGTTCTTTGAAAACAAGCCCGGCTTGCctggctccatcgcccaggctggag
-tgcagtggcgcgatcttggctcggtgcaacctccgcttcctggttcaagcaattctcctg
-cctcagcctcctgagtagttgggactacaggtgcgtgtcaccacgcccagctaatttttg
-tatttttagtagagatggggtttcaccatattggccagactggtctcgatctcttgacct
-catgatctgcccgccttggcctcccagagtgctgggattataggcatgaggcaccgcgcc
-tggctTAGAATCCATCTCTTagtcacattacacagggcatgagtacagatatggaggaat
-tattgtagctgattttcaaacaacttaccTGTGTGTGCAGGTAAAGAActagggacagtt
-ctcagttttggaaataaaaaaaactctgggctgcagtcctggctcttccgtccttgctgt
-ctgaccttagtcaagttgtctcattctctgagcttccgtaaattggataaaattgaatga
-aacgagatgatctttaTAAAGTGCTTGTGCTACTCATTTGTTTACAAACGcagcacatat
-ttattgaggcctcctatataccaactactggtcccaccccgaggatattgcagtgaacaa
-aatggaccaaaacacctgctcttgtgaagctcacagcctaggttgtagacagatgttaat
-tgatcatcctaataattgtatgaccattgagagtagattccggaaggagagattgctgac
-ctggccaggttgatctgagaagccaaagatatttaagctgagatgtgaagggtaggtagg
-agacaacgaggagaagaaagataggagtggaaaatgattctagatggagggcatgtgcaa
-aggccctgtggtgggaggagtagattccaggaacacagagaaggtgggtggggctggGCC
-TGAAGCACCAGGGCCAGATGGTGTGGGGCTGCTGGAGCCTTTGAACAATGTGAGGGTCTG
-TCTTGCCAGGCAGcctaaaataaaaccgaaaggcctaactgctccacaaggccctcatga
-tcggggaccttgttactcctccagtctcccctttacctactctgctgcagccatgctgcc
-tccttcctgttccaggaacaccctggacacattcccacctcagggcctttgcacttgcca
-ttgcctttactagtatcgaccctacccagatattctgatgactcattctgtcacttcatt
-tccatctctgcctcttcaaaggggccttccctaccaacccaccacaacccccctgcccct
-ccagctaagcagtcagcatccagcagtctctacttccctggcctggtttatttctcttcc
-tagcacatatcacctcctggcttatattaaccagaggccacattgtctgtttctcttctg
-gatctctcaccagagtgcagctcagcaggcagggacttggccttgctctaggctgtgtcc
-tcagcctcaggggaagagtaggcattccataaacatttgtgaataaagaaatGAGTGAAA
-ATGAGTGAGTGAATGCTGGAAAGAACTAGCTCctggaaattaggaggtctgggttcaagt
-tctagctGGGCGATCCTTTCTGTTCCTTGGTTTCTCCAGTTGAGCTGTGAGGCATTTGTG
-GTCTCTAGGGAGGTTCTAGGACAGGAAAGGAGTACTCCAGGCTGTGGAGGGGGCCTATGT
-AGGAAGAAGGGAGCTGGGGCCTTCCCTTTGGCCTTCTGGCGTTTGAAAATAGCCTAGCTC
-AGCCCCTAGCTTGGGCCCCTACCCTCCCTGGGGTGCCAAGCTGGAGCCAGGGGGCTCTGT
-CTGGAGCCTGCCAGCCTGGTGCCGGGCTGGGATCAAGGCCACCTGACAGCTGGGCCAGGC
-AGTCCTGGAAGGTTCTTAAGGGCAAACAGGGCATGCTGGATGTCCCAGACCTCCCTCCCC
-ACCTATTGTCCCTCCTCCCTCAGTGTCCACCGGCAGGATAAATCCCTTCATCCTCTACAG
-GCCTGCAGCCCTTGCAGCTTGCAAATCTTTTTCTTGGTTTGTTTCTAATTTCACCCCTGC
-TCAGTAGctactttactggtgaggacactgaggctcagagatgacaactgcctcactgag
-gttacgttgcagttatgattcaggcccaagtctTGCCCAGCCCTGTCCTGTCACCGCGTG
-CACgtgtgtgtgtttgtgtttgtgtgtgtgtgtgtgtgtgtgtgtgGTCTCACTATCAAA
-CAGTGCCCTCCCTTAACCACCAGTGCCCCGGGTCTCTGATAAGATGtgatgactatgagc
-acctggagccaggtggcctgggttcaaatcccacctttgctacttctatactgtgtgGAT
-TGCTGGGCCACCCCCACCTCAGTGTCTGCTAATAGGACAAATCCCTTAATCCTGGGCACT
-GGGGCACTATCAGGACTAGCATTGTATACATTGCACAGGTTTTAAAAAATGTAATCTGTA
-ggctgggcacagtggcttacacctgtaatcccagcattttgggaggcccaggtgggtgga
-tcatgaggtcaggagctcaagaccagcctggccaacatggtgaaaccccgtcactactaa
-aaatccaaaaattcaccaggcatggtggcgggcacctgtagtcccagctactcgggaggc
-tgaggcaggagaatcgcttgagcccagaagctgaggttgcactgagccgagattgtgcca
-ctgctctccagcctgggcaatagagcaagactccgtctcaaaaaaaaGGTAATTTGTTGT
-CAATATTTACACATCTAAACCATTGGAAGAATAATGTATATATAAACTAGCTAATGAACA
-CCTACCAAGCCCCAAGCACCAACTGTATGTCCAGTACAGAGCCAGCTGCTCCAGGGGAGT
-TCGTTCCTGGGAGGGGGCATCATGATGAAGTGGGCGTGGTTCCCATTTCCTCCAGCGTAG
-TCTCAGAAGCGGGAAGCCATGTGACTGAGGTTACAGCCAGGGAGGGCAGAGGCCCCCGGC
-ACTCACCCCTCTGGGGTCCAAGCCCCGCTGGCATGTGTTGTGTCCCTGGGTAGGTGTGTC
-ACTCCCTGTCTGTGTCTCCAGTGTTCCTGTTGGCAAATCAGGGGTGGGACGGAGGTAAAT
-GGAGAGGCCCTGCCCAGTCTGCTGTAATCCAGGATCTCGGACTTAGTGGGGCCAAAGCTT
-CCAAGTTCTCCTGATTAGTGAGGCTGCAAAAAATGTTTGGCATGTTATTCTCTCACCGTT
-TAAATGTGGGCAAGTAACAACTTACATGTAAAATTACCCCCATATACCAAGCATTTaagt
-tatttattatatcattgcttacaatagcaaataattggaaattatttgagaaatggctaa
-agaaactcaggcccaggtacgcaagggaatcctaggcagccctcaaaagatgtcctgcaa
-acacctgatgtggaatcacaagatacacaacacaggtcagtgaacaaaacaagttgtggc
-atgatacccacagtgtgctgctgcttgtggaagcaggaaCACATGTCCATGTACTCTTGT
-ACTGGCACAGAACCCTGGAGAATTATCCTGGGAACCCTGCATGCTGGCTGCCCCTGGGGA
-GGGGAACCCGAGGGTTGGGCTCAAGGGTGGGAGGCAAGACTCACTACTTTGCACACCTTT
-TGAATTTTGAATCATGTGAATGTGTTATCTGTGCAGAAAAAATAAAAATACATTTAAAGT
-AAAGTGAAAGTAGACAAGAAACCTGAAACAGAGACGGACAAGCAAGCCTGCAGGCCCAGC
-CAGCTACCGCCCCCGGGCAACCTCATGCCACACTGTGGGCTCTGCCCAGCTTGGTTTTGT
-GGCTCCACCCTCTACGGTCATATTTGGGTTTCCACACACACAGCACCCAAAGGAAATCCC
-AGCTAACGCACATCAGGTTCTGGGCTGGGCCACCCGCCAAGGTGGTTGGTGGGCATGACA
-CCGCCCCGGGAATGGCGTCGTCCAAATGCCTGAGCAATGACACGGCCTCAGATGGAATGA
-TGCCACTGCCCACAGTCTCACAGGCCCTCCCATCTCGCCTTTGTTCTGCAGCCTCCAGGT
-GGGTGTATGGACACTCCAAAACAGCCATCCCTGTCAATGAATCAGCCTGCAGGGACTGAA
-TTCattccttcattcatcaatatccattgagcacctactgtgtgccaaacactcttctag
-gaactgaagatgcaacagaaaacaaaacagataaaaatccctgccctcgaggagctgaca
-ttccagaggggacacagacaatacttgccagagtgaaaatgctaaggagaaaaatgaagc
-agggaaggatgggGAACTAGAGATTTTTTTTCCtttttttattgaggttgaattgataaa
-caataaaattggcccattttaggtgtacagttggatgcattttgacagttgtatggcact
-acagacaagtgctagaattcctgtatcatcccaccatgttccttcacgccccccacagtc
-agcccctgactcccacccgctcccacccgaagaaactacagatcagttttctttcactgt
-agatcagctttgtctttcccagagttcatgcaaatggaatctggcttctctcagtcagca
-tcatggacttggttgagattcgcccgtgttgctgagtgtatctgtagcttgttccttttt
-actgacgagtagtattccacagtgtggatgcactgtattttgtttattcatccaacttgt
-tgacggacatacaggttgttcccatttcttggctattacaaataaagctactataaacat
-ttgtgaacaactctttgtgtggatgcatattttcatttctcttgggtaactaccacggag
-tggaattgctggacctcgtggtaagggtagctttaTTAGAAGCAGATCTCATGCttttaa
-acaggatggtcagataaggtgtcaccggctcggtgatatttcaggagaggccagaaggag
-gtaaggggtgtctgcagggaagagtgttctgggctgaggaaacagagtcagtatgtgcct
-ggagtgtttgaggaacagcatggaggccatcaaggagggagtgaaggacgtgaggggaga
-gggctaggaggtgtgctccatgtggaatgaggctagatggtatagggtcacatacatcat
-ggtgaggacattggtatttttttcttttgacatggagtctcgctctgtcacccaggctgg
-agtgcagtgacacaatctcggctcactgcaacctccgcctcctgcattaaagtaattccc
-cggcttagcctcccaagtagctgggactacaggcacgtgcccccacgcccattttatatt
-tttgtagagatggggttttgccatgttgtccaggctggtctcaaatgcctgacgtcaggt
-gatccgcccacctcagcctcctgaagtgttgggattacaggtgagagccactgcacctgg
-ctgaggacattggtttttcctctgagaacccgtgggaggaatctgagcagaggtgggaca
-ggatcagacttgcattttaacaccttcccccatctccagctaccaagtggagaatgggct
-gcagggctgcagggaggaggctactgtaatagtcctggcaggagatgaaggagttggact
-ggggtggaggcggtgggggctgaggggtgtgggattctggatctttctggatctaccccg
-aatgtggagccaacaggggatgtattggacgtgggatgtggggaaagtagggacatgaaa
-gaaggctAGGACCCAAggtgacctctaggaactgagagtggccctccagctcccagctgg
-caaggaaacatgcatctcagaccggcaaccacaagaagttgaactgtgctgacaaccaaa
-ggaacttagagtggaccctgagccgcacaaaggatcacagcctagctgacacggtgattt
-cagcctggtgagacctaagcagagaagccaatcatttcatgccaggacttctgacctgca
-gaaactgtaagaaaataaatgggtgctaagtcactaagtttgtgataatttgttatgtag
-caatagatgactgatacGGGCATACtagaatcctacagtgtgagagctaaaagagtgctt
-agcaaccactaagcccaccccccccatgtacatatggggaaactgaggctcagagagcac
-agaggacttgAGGCGTGGTTCCTGAAGGGAGGCGACATCAGGCAGAAACTGTCCCAGCTC
-TGGAGGTGTCGCGAGTCCCAGCCTCTCCTCTCTTAGGAGGCTGTAGTACCTGCCCCTCTG
-CCAACCCCTGCTCATCAGGACTCCCAGAGAGCCAGCTCCTGGCTACCCACTATCTACCCT
-CGGCTCCCCAAGCAGCGAGTTCAGGCAGGCTCCCCACTGGTGCAGGCCCTCACCCCCACA
-GCAGAGCATGGGCCAAGGGTGCACGAGCCAGGCCTGAATCTGAGACCCCAGGGAAGagag
-gaaaaatcacaaccttgggcctggctagaatcccaactctgccactcaccagctatgtga
-ccctggttgagggactcccctttgctgagctgcagtgtccacatgtataagatgggagta
-gggatgctttcctccaatggtcaatgagctaatgaaggtgaaactcttggcGGGAGCACT
-GTAAATGCATGTATCCAACCTcttcctctgcatgggcctcagcttccccatctgctaaag
-ggtcttgtgttcttgatgtgtttgggggggcccttgcagctctaactatatgaggattca
-aattccggctctgcttctcactagctgtgtgaccttgaatatgttactcaagctctctga
-gtcccagttttctcacccataaaacggggctattaataatacctcctattacaggagaga
-tgcaggtcagatacctagtagagtgactgAGAAAATGTTAGCTAGTTGTGTTATCATCAT
-GATCACCATTTCTAGTGTGTGAGTTTGGTTGTGCCTGCTGGAAGGGGCAACAGGGCCGAG
-CCTCCCAGGGTGAGAAAGTTTGGTTTTCTTAGAGACAGACGTTTGTAGGCTGAGCAAGGC
-ATGCGTGCATTTCTGGGAAAACAAAATTAGTTCATTTCCCTCCAAATCCCTGCCTGTGCA
-ACCACCTAAAGCCAGGCTCTGAGTATCACAGTGCTTATAAGTGGTAAACCCACAGGCAGG
-TTTGTGAAAATGAAAATATGCATTTATTTCTGTTCCCAGTTCTGAGAACTACTTCCTGTT
-TCCCTCTAGAGGAAGGCAATGGCTTGTGCACATGCCTGGAGGTGGGAATGTGTGTCATGG
-ACACAAACTGGGGTGGTTATCACTGTGATGTTCCCACTGGCCATGTCTGAATTGTGCACG
-CAATCCTCTGACCATAGCTGATTCACTGGTGTTAACAGACACCTGACGGCAGGCTGGGCA
-CTCAACAGTCTCTATTGGAAATTTGAAACTTGAATGGGGCACACAGACAGAGAGTGGCTG
-GAGATGCATCATTCCTGGCCAGCACCCTAGAGAGGAAAGCCACAGGCCCTGCCCCTGAGC
-TCCCCAGAGATGCCTTTTCCTGTTCTTCCCACAAGAGTACTCGTTTTGGGGGTTTGCTCT
-TCCCTCATCCTGGAAATGCCTTTCAATAAATCCACTGCTGGGCTCCTTGGTTAGTCAGTT
-TTTCGGTGTTTGCCACCCAGTTCACCTTGGCCAATGTGGTGACTAGGGAGACAGCACTGC
-TGGGGGTTAAGGGGAGACTGTGCAATGGAGCAGTGGCCCTCTgtggagtagttctgggca
-gaaagagcactggacccagagtctggttcttcatgatgtactgccatgtgaccttgggca
-aatcacttaacttctctgTCTGGGATGGAACCAGGGGGCACCTTAGTAAGcagatgggga
-cactaaggatcagagagaggaaaggctttacttaaagccacacaacaggtttaggacaga
-cccgggagagctgggccctgcaaatcccagcccTCAGAGGGAAAATTTCCTGGGTTAGGA
-AGCTTATTTCTAATTATCACCAGGACCTGTTTACCCCAGGTGAACAGGGTCCCCAGGCAC
-TTGGCAGATCACAGATTTCTTTCCCAACCAATTGTCACATTTGGCCTTGGCAACAGCATC
-AATGGCCCAGGAGGGGGCtgagtaaactgagcccagagagggacagagtcttgtgcaggg
-tcataccacaagttcatggcagaactagagtctgggccagatctAAAAAAGTGTTGCTTT
-TTGCTCTAAATTTAAGGAGGGTGAATTGGGGGTAGTGGCTAATGAGTTCTCCAGAGGAAT
-TTTTAAACTGTTTGCTTTCATTTTGATGATAATCCTAAACATGTAACTCAAGCATATCAT
-GAATCATCTGCAGAGCCACAGGTAAGTCCTGCCTGAGCTTGCGTTTGGACTTGGGATCAC
-ACTGGCAGCAaataatagcatttgttgagaactaactatggcccaggcactacgctttgc
-attttttatctattttttaaaattttatttaatcctcacaacaaccctataagataaatg
-ccatcagcatccccatttcacagatcaggcagtcaaggtgcagagaggttaaggttaagt
-aacttgaagcaatgttaacagcgagCCTGTGATCTTGCCCACTACACTTTACCATTGTAA
-TCGGAGGAGAAAATGGCAGAGGTGGCTTTGATATGTAAAGATGAATTCCTGCTAAGTGAA
-GGCCAGTGATGCAGAAGTACAGGGTGGGGAGAAATTTCACCATGGGTGAAATGGTGCCAA
-ATGGTGGGAGAACAAAGCCATCATCAGCATGCAGAGTTGGGTGGAAGTGCGTGACAAACC
-CAAACAAAATGGCATCGCAATTGAGTGTCCCACATTCACACTGCTGGTGGCAACTCTGGT
-TTAGCAAAGCAACATCAACCATATCATTAATTAATTAATATTGTTGCATTGATGATATGG
-cagcatagcttaatgcttagggatgcaggcttaaaactcataatttctgacttcaaatgt
-gttttcctcttggcctagtcctcagactatgggcaaatcactcaacctctctaagcctca
-gttttgttcatctttaaaatggaattgtaatagcacctGATagactgctgattgcctatg
-caattcccttcttttcctgttttttgttgaccaaaccctgattttattcccgatggtgat
-atatctagctaagtaagactttattcccagcctctcttacagctactggtggccagcgag
-tggaagttattcagtgagagacttctgaggactatccctagagggggccaatgcatctgg
-gaggaaagcccatatactcttctttctccttcttcctatatggaactcaggcattatggc
-agcagccccagcagccatctaggatcaagaagtgaccttcaggatgaagacacatgataa
-ggatgaagcaacatgaggctggaaggaacctgaaacattgatgataccatagagactgca
-gcagccctgggctgactcttccctgacttttttttttttttttttttttttttaagtcag
-ccttttattttaggacaattttagatgtaagaatcattgcaaagatagtacagagagtgc
-ctgcataccccacacccagtttctcctattattaacatcttataggccaggcgaggtggc
-ttacacctgtaatcccagcactttgggagtccaaggtaggaggatcacttaaggccaaga
-gtttgagaccagcctgggcaacagagcaaggccctcttcctacaaaaataaaaataaaaa
-attgagctgggtgtcatggcataccagtagtcctagttactcaggaggctgaggtggaag
-gattacttgagcccaggagtttggggcttcagtgagctatgatcacaccactgtactcca
-gtgtgggtgacagagcaagaccctgtctgtaaaaaaacccgaaaaccaaaaccagaaaat
-cttatattagggtatgatacatattaaaaccaaaaaatcttatattagggcatggtacat
-atgtcacaatgaatgagccatactgtcattattaactgaaaagcccatacttcattcaga
-tttcctcagtttctccctaataccccttttctgttccaggatcccatccaggctcccaca
-ttacatttagttgtgtctccttaggctccacctggttgtgacggtttcaaagactttcct
-tgtttttgatgaacctcatagttttgaggacaactggtcaggtattttgtaacatgttcc
-tcaatagggatttttctggtgattttcttgtgattagacaggggtgatgtgtttagggag
-gaagaccgcagaggtgaagtgtcaatgtcatcgcttcagatggggggacattctatcaat
-acgacttctcactgtggatgttgaccttgattgctggcacgtttctccactgcaaaatca
-ctgtttctgtcctccattcaacgccatactctttggaagaaagtcactccatgcagcccg
-tgcttaaggagtgggagttatgttccacctcctggagggtgacgcacttaAGCTACTTAA
-GCTAATAAGTATTTTTTATGTAGCAAAAGCTAACAGATAAACAAACCCTTTTGTTTCGTA
-GATCTATGTTATTTGGGTTTTCTATTACATGCAGTCAAACCCAATTTTAAATGGATGCAG
-AATTTATTTCTCAGGGAGGTTGTGATAATTGAATCAGAGAGGCAGGGACAGTACCTACAG
-CAGTGTTTGGGTGAATAAACAGTAACAATAATCATCGTTggccaggtgtggtggctcatg
-cctataatcccagccctttgggaggccaaagccagtggactacttgagcccaggagtttg
-agaccagcctgggcaacttggcaaaaccctgtctctacaaaaaatacaaaagttacctgg
-gcatggtggcacatgtctctagtcccagctacttgggaggctgaggtgggaggatctatt
-gagcctggaaggcagaggttacagtgagctatgattgcatcactgcactccagcctgggt
-gacagagtgagaatctgtctcaaaaaaaaaaaTCATGattattaataacttaattataaa
-taataataattattattagttttataGTGCATTAGTATTTGATTGATAATTTTGTTTCAG
-TCTTTTTAGTTGTTTGGGAACTATAAGCCTAAGGAGTTGATAGCTCACTTCATGAATGCA
-CACAAATAAGTAGTTTACCgtcaatgccctcctaagggcctaagatcaacaggaatgcac
-ctgtagttaaacaagtggttctattactcactgggacaagaaagtgcacagcatggggaa
-ccttggaatgtcttagtgagagtgttagaaaaggcttattataggattggtctcgtgtta
-ggtgacttgaatagggtttgaggatgtggggtttttcttcagattggatgctctcaggaa
-gtgagggtaattatgcagttgcgatcttaacaagtcttgtctatagagaaggcagactct
-ggcaaggctaatgctgtcattgggaaagaagcagcggtcacttgtattagctgggactga
-ggggtgtttggtcattttcgtggcttggaaatgtgcatgatttgtctttgttcagacatg
-attacagagtgttccacttttcgtcttgattcatcaatcactgaggacctcatctgatgt
-tggtgttctggggaatcattaacattggacaggacataagctgttctctgtgcatgttgg
-gctgacttgcagcaacacccagtcctagctgatgactatccaggatggcccctggatgtc
-agggctgctttcctctttctcaATTTCAGTCAACATTAGTGGGTCTGAGAGGATCCCTTC
-CTCCTTTTAAAGCTCTCCATATATTAAGTTGGAGCAACAAGCTCATTCCTGCTCAAACTG
-GGCAGGCATTTTTAGATTCTTTTCTGCTCCCAGAAGTTTTCCTTTCCCATTATTTGGTCT
-TGAGCTGGTCTCAGGAAGAAGTAATGAAGGTGAGAGATCTGCAGTGGGATCCTGGGAAAG
-GTGGCACATGTGGATCACTGAGGCCTGGGCTCGGATGGTGAGGATTTGAAGATTCCCAAA
-GGCCACACCTAAGGGTCACCAGAGGGTgtccagcccccattatccagatgggggaactga
-gacccaggagggaagGGCTCTGTGTTGGGTCCCAAGGTGTGCCATTCCAATTATCAACTG
-CCCTCCCTTACCTGACTGGCAGAGTCCCTTTCTTCCAGTTTGACGGAAAATACTGTTTGG
-CTCTTTTTTTGTGGGATGGAGTGTAGAAATTGGGGAAAAGAAGAAAATATAAAATCTTAC
-ATTAAGCATCCTAAGCCAATTCATGTGGTCGAAGAagcagaaaagcagcagaaaagcagc
-agaaTGCGATGCCAAACACATCCTCTGTAGGCACGTGTGTTATACCAGGTTGCTGCGAGG
-GCCCAGAGGACACATCTGTTGTAGCTGAATAAGTTCCAGTGTTGAACCTCAGCACACACA
-TGCGCATCTGGGCACCTGTGCACAGAGCTTGTATGCACAGAGCAGGAACACATGCATGCT
-ACAAAAGGATCAAGAGTCAAACTCCAAACTGGCTGCCCTTATTGATAACTTCCAGCTGAT
-GGAAGGTGGAAAGGCGAAGGTAGATGTGTTTTGGATATAAAAGGTctgtcttctctgttt
-actgtctatgtgaccttgagcaaattgattgacctctctaagactcagttttctgcaata
-taatatggTTCTCTTCTCTCAGAGTAAGGATGGAGTTCAGTGAGGAAACAGAAATGTAAG
-CATtgcatcattcggaatgctctgggctgcaagtaacagaacaccaactccactggctta
-aatgaaaaagaaattgatcatctAGAGACAGGACTCAGGACCTCAATGATGTCAGTAAAG
-CTCCAGGCCCCTTCTGACCCTCCACTCAACCACTCACTCTCCCACCTCCCTGTCAGATTG
-GTCCCAAATGTGGTTCTCCTGGTGGTCCACACTGGAGTAGCATCCATGCTGTGTAGTGTC
-TTCTCCATCAACAGAAGAGAGAATCTTTGTttttcttttctttcttctttcttttttttt
-tagacagagtcttgctctgtcttctaggctggagtgcagtggtgcgatctcagctcacta
-taacctctgcctcctgtattcaagcaattcttgtgcttcagtctcccaagtagctgggat
-tatgggtgcctgccaccactcctggctgatttttgtatttttagtagagacagggtttca
-tcgtgttgaccaggctggtctcaaactcctgacctcaggtgatccacccgcctcagcctc
-ccaaagtgctgagattacaggcatgagccaccacgcccagccAGCAGAAGAGGTAACTTT
-TCTGTATCCCTGAAACGCTAAGTCTTCCTCTTTAGTATGAGTGAACTAATTGAAGTCACA
-TGACCAGCCCTGGCAGTAGGAACCATGGCCAGGGGAATATCATGTGCTGACTGGCTGCAG
-TTTTGGTCCCTGAACACATCAGTGGCTGGGGGACCCCTTCAGACTAAAGGACCTAGCCCT
-GCAGCTGGGGACTGATATTAGGAAGGGAAAGGGAAAGGGCATGATTCATGTCCCTCACTG
-CTCAGGGTCTTGCTGTGTAGCATCTCTTCTGAGATGTGGGTCAGACAGGGTGTTGGCCAT
-CGCTAGAAAGGACCCCTCCTACAAGGACAAGACTTGAACAGGGATCCTGAAGACTTCTGG
-GGTTTCTATCTAGAGTCCAAATGGGTCTCTAGAGTCAGCCTGTTGACAGGCTGAGTTGAG
-TGGCAGCATCTCTAGTGGATCTGGCTCTCTGCCTGTGACCACTTGTGTGCATGAGCAAGT
-GCCTCACAGACCTGCATGTGTACATGGAAGATGTATTTTTACCTCCATGTTTGCGTCTGT
-AGCAACAAGTATGAAATGCACATACATGTTCATGCACATGTCAATGTACGTGGCTACCAC
-ACAGTAGGTATACTGTACAGTGTAACCATACAGTGTTTCAAATAtgcatatatgttcata
-tatgtgcatatatgCAATATCTGGATAGATGTATATGGCATAATGGCATATTTATATATT
-AATAAATCAATCATTTTAGAGTATTAACTATATATGAGTTATATTATGCCTAAGATATAT
-Taataaaaacaatgtttgtcaagtacttgctatatgccaggtactattctaagcacatat
-gttctaaattaATATATGTATTACTTTAAGGATACATAACCTAGTGTCTTTTTGGGGTCC
-ATGGATGAAGTGTATCTTCACTCACCTTTAATTAAATTCGGTTGTTTCATTCTTCATTTG
-TGAATGTAGGGCATTCACAAATTCACaaattcattctttcaattgtgaatgtagggcaca
-agccacagtagtgtcaggagtgcctggaactttgtcaccattagaaatcatagctatttt
-tgtatcttgttataatgattatagatatctcaaaatattaacagtcatcatttgttttga
-cctaccactgatcttgttatttaatgtattagcaaagaagcatatatagtacaatatcaa
-aactgtgttctttaaAAAAAAAAAAAGTATATATATATATAtgtatatgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgatgaagtcttgctatgttgcccaaggt
-ggccttgaccccctgggctcaagtgatcctctcacttcagcctcccaagtaactgggacC
-CAGCTTAAAATATTTTGATGACAGTATATATATAttttttgagacagagtctcgctctgt
-cacccaggctggagtgcagtggcacaatctcagttcactgcaagctctgcctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacagttgcccgccaccatg
-cctggctaacctttttttgtatttttactagagacggggtttcaccgtgttagccaggat
-ggtctcgatctcctgacctcgtgatccgcccgcctcggtctcctaaattgctgggattat
-aggcgtgagccaccgcgcccggccAatgactgtgtttttaatataatttgtttcattcat
-aatccaatgcatttaattttattttaagcatgtgaagacaccattctgaggaggggtcca
-tggcttcaccagatgccaaagacgcccatgccacagcaaagAAAaattcattgatcaatc
-cttcaatgaccccatgaagcagcagtgttaccagtttgctacagaggggaacctgaggca
-cagggaggttgtgcaacttgtttaaggtcacatagatatcgagtggTTGTGCATTATTAT
-ATCTGTCAGTTGTTTTTATAGCCTATGGGCTGATGTGGGCTTGTCCTTTGTGTCACATCA
-GAAAGCAAGTCTGGTCAATTATTTTCTTTCTCAAGGTTAAGTGAGATCAAGAAAAATAAT
-ACACATATATTGCATGGATTATTTGTGGTCATCATTTGCTAATCCTTATACCTGTGCCAT
-GTTGGATTAATTATTACAGCTTTGTGAGCTGCTTTATTAAGGAGGGGAAGTAGAGTGAAC
-AAATCATGGCAAGTCACTTCACCTCATCTTCTCATTTAAGGATGCTGATACTGGTGTTGC
-CAAGGCGACGCTGTCAGCTTTCGGAAGCATCTTTAAATGGGAGAGGCGAAGGCCCACACA
-GATCGAGGCGGAGGAAAACTCAGAAAAAAGGCTCAAATCCCTCGGCCGCAGAGACAAACC
-ATCCTGGTGGGGACCATCCCTCACCCCCCGCACATGGCCACTTTCTACCTCACCTGTGGT
-GGTTGTCTCTGGGGTGTACTCAGGGAACTCTCTCCCCAGTGTGGAAACTGCCTTTGCTGG
-GAACAACGCAGAGATCTCAGAAATGATGGATCCATCAAGTGCCAGTGGGAGAGACTGAGT
-GGTCTTGGAGGCCTTTCCAGGAAGTTCCTCCTGCCCTTGGTACACGAGTTTGGTGGTAGA
-TGCCCAGATGCCCAGAGTGCTCTGGGAGAGGAAGGCAGCTCACAAATGCAAATGCGCTGG
-AGGTGGTGCTtggctgtgctgccttggatgagaccctttccctctctgagccctaatttc
-ttttttctttttctttttcttttttttttttttttttgagacagagtctggttctatcgc
-ccaggctggagtgcagtgacaagatgtcggctcagtgcaacctccgcctcccggttcaag
-caattcttctgcctcaggctcctgaggagctggggctacaggcatgtgtcaccatgccca
-gctagtttttgtatctttagtagagatggggtttcaccatgttgcccagggtggtcttga
-acttctgagctcaggcaacccaccagccttggcctcccaaagtgctaggattacagacta
-ggagccactgtgcccggTGCCTAATTTCTTCATCACTGAAATGGGAAGAAAACTAACCTG
-GTGCAGGGAGAGGTGACAAGTGTTTTCCATAGGAACCCGCAGATGCAGGTATCCTAGAGG
-CTGGCACCTATGAGCTGTGGCCCCCAGGAGACCCAGTCTAGGCTCGAGACCACACCAGCC
-GTGCCCTCTACAGTGCCTTGTGCTGCCCAGGATCCTCAGGTTGGTCTTGTCTGCAGCCAT
-TGTGAGTCAGCCTCACTGTCAGAAGGGCTTTCAGAGGTTGCTAGGTGCTCTGTCCATGGG
-AAACTGAGGTTCAGAGAGGGCCAGGGGCTCTGATCCAATGGCAGAGCCAGACTGATAACA
-GGGTCTAATATTCCTGGGCAGGACACAGCTGTGCCCTTGATAGTCAGAGGCAATCTGGGA
-TGAACTGGATCCTGGGGTCAGGACCTGGGGACAGGGAGGCCGAGAGAGGGCACAGAGGTG
-GAGAGAAGAGAGATGAGAGCCAGGGACAGGGAACGAGGGAAGGCTGCCTAGCATCCCTGT
-TTCCTGAAGTCAtgacttgggtgtcactgaccccactgctggtgccaggcatgatcatga
-gaccgaggtctggtcaagcagagtaagagtgataagcatagggatggacacaagaccaat
-cctggctgcagaaaatcattcctttactggaatcatggagacgagggagctccccgggtc
-agggatgctgagctgggaggacatgagcctggggctgccagagccttcttgtgaggaaag
-atcctggctgagaatgaagtcaacggggcagatggaggggctgagaggtggagctgacat
-catttgagcctctggatctaacctcacttgcctttacccttagactttccagttatgtga
-gtcaatttattccttAGGGCTAGAATTTCTATCCCTTATACCTGAGTCCTGGCATGGAAG
-AGGAAGGAAGGTAAGAAAGAAGGATGAATATTTAAGAACAGGTGTCTGAggctgggtatg
-gtggctcatgcctgtaatcccagcactttgggaggctgaggcaggtggatcacatgaggc
-caggagtttgagaccagcctggccaacatggtgaaaacccgtttctactaaaaatacaaa
-agttttccgggcgtggtggtaggcgtctgtaatcccattactcaggaggctgaggtagga
-gaatcacttgaaccaggaggcagagattgcagtgatctgagatcatgccactgcactcca
-gcctgggtgacagagtgagactctgtctcaaaaaaataaaataaaaTTACATAAAGAACA
-GGTGTCTGAGGATAACTCAAATCAGCTTCCTGCCCCCTTATAAAATGGGAGTAGAGAGGG
-ACTTGGGCCTTCAACCCACCCAGAGGAGTTCTGTCCCTGGGCCTCACAGCTTTGCCCTGT
-CTCCTCTCTAGCTTGCAGTCAGCCTAGAAACTACAATAGAAAAATAAATGATGTGGATAC
-AAAAATAAAATGCCTTTTCCTCACCTGAGTGCAGGAGAAGGGGCGGCATGTGCTGGGGAA
-TGCCTTCCTCACCCCATTCTCCTCTTTGaggacaaacatttattaggcacctgcttcatg
-ccaggctctattaagaagatgacatacatggtctcatttcctccttgccatagcccagcc
-aggaaggaatattatcatctccattttacagatgggaaaactgaggctttgatgatgtga
-agataactggtgccttgagaggctgagccactggaccaaagtgtcagagctggagcaggt
-ttgtccgactccaaagccctgcccaccacaccacactgcACACAGTAGAGGCTAAATAAA
-GGTCTGCTGGGCAAATGCTGCTTAAGGCGATTTGAGCTCTCTGGGCAGCAATCTGCCCCT
-AAAGATTTCCCATCATGCCTGAAATGCCACCATTAGCAACCATGTCCTTTGAGTCTTGAA
-GGGGAAGAGTGCTAATTCCCAGGAATGAGATCAAAGTCAGTCTGTGCTGGGTTTACTCAG
-GGATCGGCTGAGAGTGGGACTCAGGGCTGGGGCGAGCCAGGGGGATGAAGGGGTCCCATT
-CCCATTGGCTCAGTCTCATCCAGGAGAAAACCTTCTGAGGACAGAGGTGTATCCTGGCGG
-TAGGGCAGGTGGGCTCCTGGCTATGCCTGGGTGTTGGCTGATGACAACAGGGCAGACAGC
-ATGACACAGTGATGGGGGCAGGTGACAGAGTAGCTGTGGATCCTTTCTGACTCCATCCTC
-TGAAAGAAGCTATGAGGGCCCTGGTCTCCCAAACTCAGGCAGAGGCCTTATCTCCTCCCC
-TGCAGCTCCCCACCTACCACCACAGAGGCAGCATCACTGCTGGATGGGGAAGGGAGGGAG
-GCTAGGGGTTAGGGCTTGGAGGCAGAGAGGATCTGGACTTGGAGACAGATGTCCTGCCTA
-ACAGTCCCTGTAATTGAGCCTGGGGGAGTTGAGGTTACAGGGAGTCCTAAGGGAAGCCAC
-CCAGGTAGAGATCAGCTTCCTGGGACTTGAAGGAGCCTTGGAGGACATGAGCCTATAACA
-CAGACAGGGACCTAGTTCTAGACCCTTCTTCAGGGATGGTATCTGTTTTAACTGAAAGGT
-TATTTCCAGTTGTTTTTAGAGGTTGTTTGAGGCTGTCACTGTGGCCCTTGTAGCCAAAAA
-GGGTGAGTATAGCTGGGGTGGGGATGGGGTCGTAGGGCTCCTCCTTATGCCAGGGGAGCA
-CTAGCTTTGTCCAAGAGCATCTACAGTCCTGTGAGATGCTCTGGGACAAACCGAGCCCAT
-TTTCAAATaagtaaatttggagaaagctgcccactctagccccttcatgggtagtcacaa
-ggcacttggccatattaaaggctctgatcagtcctgcagtgaagagtgcctgttcacttt
-gacttaacctgctgtttccTTTTCTCATTGCTCATAGGTACTTTTAGAGACAAGCCATAG
-TTATTCCCTGTGACACATCCTCTAGGACATGCTGGAGGTGAAGGAGCATGTCCTTTTGGG
-TCTCCTAAAGACCCTGAGCTCCAAACATTGGAGCCTAGAAGTGGTGAAGTGGTAAAGCCT
-AGAAGTGGTGAAGTCTAAAGACCCTGAGATCTAGGGTCATTAGAACCTAGAAGTGGTGAA
-GTGTGAAGGGGAAATAATGATTAACCCACCCACTAAGGGGTGGATGCAGCCCCTTCAGAC
-TTGAAAAGAAAGTTCAAGGACATCTCAAGACTAGAAAATCTTGGAACAGGAGCTTAGAAT
-GGGAGATGGCCTTCTTGCCAATCCAAGGGAGAGAACCTGGGCCATCTGGGCAGCTTCCGA
-TGTGCAAATACATTCCCACCTGCCTGCAACCCCACCATTGGTCATGGGAATCAAGTTTGG
-TCTGTTCTCAGCCCATTCAAGGTACTGTGACCCTCAGGCAGGGAGCCCCTGAAGGGGGAG
-GGAGAGAAGAGGGGCGAGGACTACATCAGAGGGATGGGCCCCGAACACCCTCCATGTCAC
-AGACGGAGGGGAGTTGGGGGGCAGATGACCCTTCTGGACTTCTGGGTCAAGGAGGGCTGG
-CTCAGGAAGCCCAGGGTGTCAGGGAAGGCGGTGGCACAGTGTCTTGCATCTGGGTCCAGG
-TTGTCCAGGAGTGCCAAGTCCGAGCTTCTCCTGTGTGGTCCAGCCTCTGGCACAGCTGCT
-CGTTAGATGTCCAAAGGCCGTATCATCATGCGAGAGGCACGCAGTGAGTAGCTGGGGCCC
-TTGAAGTAGTGCCAGCGGATGCCGTCCATCTTGTACTTGTTGTCGGGAGCGTGGTAGTAG
-ACGCCGTTGAGGTTTGACAGGCCACAGGCGTCAAACCACCACCCTGGTGGAAGAGGGAGG
-ACAGGCGCTTGGTGGAGGTGGGAGCCCAGCCAGTGGCAAGAGGGCAGCCCCTGTGTCCCA
-AAGAGAACAAAGACTAATCGGGGCTGTTGCCTCCTCTGGGAAGCCAGCTggctggggatg
-gggctgggtgggagtgggggtggggTGGACAACAGACCCTCTGCTCAGCCGGGGCCTCTA
-GAGGGCAGCAAGGGGCTCTGGCCACTCCTCGAGCCCCCTTGCTCCTCCCGGCCTTCTCCC
-TGAGCCCTTGGCGTCCCTGTCTTCCTCCCTCACTGAACCTGTCTTTCCAGCTCCCCAACC
-TCCCCTCATCGCTCTGCTCACTGCTTTCTAGTGgtctctgtcactctctctgagtctctc
-actctccaggttcatctctttctctcttatggtctctgtgcgtgggtctgtctctgtgtg
-tcccattgtgttcatctttctctgatggtctttgtccctctctgcctttcgtgtctctgg
-ccctCCCTTCCTCTGGGCCCCCATCTTTCACATGCTGTGTTTGTCTCCCGGCCTCTCCTT
-GGGCTAAGTCTTTCTCCCCCATCTCCCTCTGTACTTCTCTGCCCCAGTATAGCTCTCCAT
-CTGCTGCTCAATGACTCTGACAGCCTTGGtgtctctctctttctccatctgtcctctgtg
-tctcagaaggtctctccccctgtctctgttcttcttactttgtctctgtctcCCATTCAC
-CCCACTTCCTGTTCTCTGACCTCTGTGCCTACCAAGGAACACTGCCTGAGCCACAGCTGG
-TGTGGAGCTGCCCCTCTGCCTCCCTCTGGTCTCCTGATCCTGGTTCGGCTTGCCTGGGGT
-TGGGACTGATAGGGTATAGGGTGCCTCCCCCCCGGGGCCCTGCACTCAGTGTTTCTTTAG
-CCTTGTCTCTGAGGAAAACTGGTGGTGCCAGCTTTAGGAGGAGGTGAGACCTGGAGGGGA
-CTTCAAGGACTCAATGGGGGAAGGCACCGAAGGGGCACAGCCAGGTGAGCTTATGGGTGG
-GCAAGGCCCAGACCTGCACCCATCCTCCTGACAGCACCTGGGCGCACAAGAACCTGGGGA
-GGGAATGGGAGTGTCAATCTGGGTGAGCCTGTGGGTGGGCGGAGCTTCACCCCACCCTGC
-ACCTACCTCCAGACATCACTTGGGCACACTTGCAGAGACAGTGGTCGTTGTCTGAGTCAA
-GGGTGCTAAAGCTGGTGTTCTGCAGGACCAGGCTGCTCTGGCGCCCTGCTGAGCCGCTGT
-ACCCGACCACAGAAAGCCTGGAGGCCACCCAGAGGTGGTGGTGGCAGAAGGGCCCAGAGT
-CAGGTTGGGGCTGTGTCGAGCAAGAACTTCCCCAGTGGCTTTGTCCCAGGCTGGGCTTCC
-CCTCCAGGTGTTCTTGGAGGGACAGCCCCAGCCTGGGTGGAGTGCTTGGGCTGTTTCCCT
-TCCTGGATTGCCTTCCCTGCCTGCTGCCTCCCAGGGACAAAGCACTTACTGTATGCCAGG
-CCTCCCCTATCTCACTGAACCTGAGTCTTGGAGAGAAGTGATAATGGTCACAATAATGAT
-AATAATGGCTAATACATATACAtttttttctttagagacagcaacttgctctgttgccag
-gctggagtgcagtggcacaatcacggctcattacaaccttgacctcttgggctcaagcaa
-tcctcccacctcagtctcctgagtaaatgggacaataggcacgggccaccatgcccagct
-aatgtttgtattttttgtaaaatacaaacatagggtctcactatgttgcccaggctggtc
-ttgaacacctgagctcaagcagtctgcctgccttggcctcccaaagcactgggattacag
-atgtgagccaccgtgcccggcAACGTTTCTTTTTCTTTCTTTTTTTTCTATTCTTTGCAT
-CTACTATGtgttcaaagtgctttgcataggttaactcattctcctttaatcctcacaaca
-ccctatttccattttacacatgcgaaaacagaaatcccaagagccaaagaaacctgctca
-agtctcagaatgaatgagggtcagagccacatgccagcctagtgtggcctgacttgggag
-tctacgtgcatttTGTTCCCCAGCTGATGATGATCTGGCAACCCCAGCCCCATCGCACCT
-CCTCACATTCACCCACCTCTTCCAAGAAGCCTTCCCTGACTACACCAGCCCCCATGGATC
-TGGGCTCCAGGGCACCCCAGCTCTGCAGCTTCGACATCTGCTGCCAGCCAGGTGAGGATT
-TCTATTTCTTTGCCAGGCTCTGTGGCCTTGGTGGGCATGTCCAAGCCTgcctggtgatga
-agaccatgagatctgggggcagaaagcctggattcaaattccagctctaccacttagagc
-tgcatggccttggaggattggctcaccccactgagcctcagtttcttcatctgttccagt
-ggtaatgatagtgaaattagcagtgctgccctcgtttattattgatttggtgatgtcagt
-gtgtgaagtgtgcagagcagtgtcacggggtgagtgctcaacattcagtgcttgttatta
-ttTGGCCCTTGGCAGATGGCTGGGCCTGGTTGGAGAGAATGCGGGGTGTTTGTATGGCAG
-GGTTGGGGGAGGCTGCACTGGCAGCTGAAGTAGGGAGCCAATTTGGGAGCAATTAAGAAG
-GTCCTGCTGAggctgggtagggtggctcacgcctgtaatccccgcactttgggaggctga
-ggcaggctgattgcttgagcccaggagttcgagatcagcctgggcaacatagggaaaccc
-tgtttctataaaaaatacaaaaattagctgggcatggtggtgcatgcctgtaattccagc
-tacttgggaggctgaggtgggaaggtcactggtcactggagcctgggaggtctgggaggt
-cagggctgcagtgagctgtgatcatgccactgcactccagcctgggcaacagagtaagcc
-ctgtctcaaaaaaaaaaaaaaaaaaaaagaaGGTCTTGCTGGGTGGAGGCAAGTGGGTGG
-CAGATGTGGCCAGGGCAGCTCAAGGAAGCTCTTGTACCCTCAGGGCAGGGCCTGAGAAAT
-TCCCCAGTGGGAATTCAGAGGGAATACAGAGCCTGGGTATATGGTTGGCTCAGTCCCCAC
-ACCTCCAGTCATAGATTGTGTCTGTCGCCAGGGAAATGAGACTTAATTATTCTCTGTGTA
-GAAAAGACTTGGGAGGCTCCCTCAGCTTCCTTTTAGGCACTTACTATGTCTGGGGATGGG
-AACAGCCGTGCTCCCAGAAAGCAGTCCAGTCAAGGGTGTGAAAGGCTGCCACGAGACAGT
-GATCGTAAtattgtttgctgagcgtttactacatgccaggcactgtgttaatgcttcatg
-tgcagtatctcattcaggcctcatcacaccctttttgaggtaggtatgcctaaagcaccc
-attctacagatgaaaccgtgaagggacttgctcagggtcactcagggaagtagggatgga
-gtcgggatttaagccTTTGCTTTAGTGGCCAGTGGCTTAAATGGGACTCAGCATAGTGTT
-GTAGCTACTCACTGGTCAGGTGTGAGGAGTAGGGGGACATCCAGGGAATTTTTCATTCAG
-CTCTGGACCTTGCATTATCAGGTTGGTATGGATCCCATAAGGAGGGATGTCAGaacctgg
-gcaacatagggaaaccctgtttctataaaaaatacaaaaatcagctgggcatggtagtgc
-atgcctgtaatcccagctacttgggaggctgaggtgggaaggtcactggagcctgggagg
-tctgggaggtcaaggctacagtgagctgtgatcatgccactgcactccagcctgggcaac
-agagtgagaccctgcctcaaaaaaGCCTTTGCTTTGGTGGCCAGTGGCTTAAATGGGACT
-CAGCTGGAGGAAACAGTGGGGGCATATCACTGAGAAGTTCCCAGAAGTGGAATCAGGCAT
-AAAGTTCAGGAGGACAGAGAGTCATTCAGAGATTccttgtggggaagcgaccttcccacc
-agtggaggtattccagcacggctggatgatgattgcaactatggagggaatctatgaaga
-accagatgacacgtgagattttttgcagccctgtgagtgtgaatcCTGGTTCAGAGATAG
-CCAGGACCCAGGCTTATCTAAAAGATCCTTAAATTTCTCTgagaggcaatatcatgttgt
-ggagacatcatgagttttgacagcagggagatctgagttcaaattccagctcatttaact
-tgtaactttgggcaggatacttaaacttggcatctcagtttccatattactaaagtaggt
-acagtaatgcctacttcaaagtgttgtggggaagattaaatggaataatggtgcctggaa
-cacagtaggtgctcaataaatgctagttcCTTTTCCCAAATATACCAAGAACCAGGCTGA
-GGAAGGGGTGAGAAACCTTGATgatcttacaagatcgtcatgtttaagctcatcctgcta
-ttgaagaagcagaagctcagagaagccagactgacttgtccaagttcccaaagcaagctg
-gagcaaggccacaatgagtgcaggaatttcaacttctggcccagggacccttccacccag
-ccCCAGGGCATAGGACAGGCTGGGCAAGTCACCTCCTTTTGCTTCTGGGTCTCTGTAAAA
-AGGCTGACTTGGGGTGACTGACCTTGGAAGACCCCTTCTTGCTCCTCGGATGGCAGCACC
-AATGACATTCTTTCCACTCCACCCAGTGGCTAGGACATGCTGAGTGCTAACCAGCCACCT
-CCAGATCCCATGACGTGCACCCAAATGGGGGACAGATGGTAGGAACAGGAGACACCCAGA
-GACTGACCGTTGGAGCAGACTCTGTAGACACTAGCCTGGGGACCCCAGCCCGCCCACTAG
-CTGAAGACCCCAGCCCCCACAACGGCCTGGGCCCCGAACCCACCTGTATAGCTGGTTCTC
-ACTGCCCAGGTGGAAATGTTCGTACTGGGCATAGGCCTCGTGGCCTTCCCAGTCTTGCAG
-CTCCACACGCAGAGAGTAGGCTGCCCTTCTGGTGAGCTGGTGCACCACTTCATTGCCCAG
-CCAGTGCTCCCCAGCTGGGTCTCCGAAGCCCTATAGGGAGGGGAGCGTGGGGTGAGACTC
-ATGCTGAGGAGGAGGCCATGTCCCTGGCTGAGGAGCTGGGCTGGGCCAGGCTCCAGGGCT
-ACTTATACAAAACCACTGTGCTTAATGATCGAGTTCATAAGTACAGTGTAGGCAGGACTG
-GGAGTAGGAGCCCTCCACCTGCTAGAGGGAAAAGACTAAGGCTTTTGTAAGTGTAAAAGC
-CTGTTAAAAGTTATTGAAATCAcattcctctgaagttcaagaacaggaaaaagtaatatt
-tggtgactacctttggtggagtattgactgggagggggcacaaagtgggcttctggggtg
-ctgggagtgttgtacatctagcactgaatggtggtcacgtggttaaatacatatctaaag
-gctcactgagccttacactttatttgtgcgcttagacacatgtacgttaaacctcaacaa
-aaaTTAAATAAAATATTTCAATCAGCTACATAAATAGTAGAGCAAACTTTGTTCAGTGAC
-AGCGCAGCCACTGCAAGATTTCAGCAACACAGAAATGTAAAACTGAGAGTGTGGGGAATG
-TCATGTCCCAATGCCCTTGGACAGAACAAGAATTCAGCACCAAGGACAGGGGCACACCCA
-AGGCCCGCTCCCCAATTTAGTCACGATGCAATGCGGGTTAGCCTGATGGTTAATATTCAG
-GGTTCTTTTGTGTATTTCTGCACCTGGACACCCTATTCCTCCTTGCCATTTTAATGGTTG
-TTTAAAGCCCAATTAGTTCAAAACACTCATAACTTAATTTGGTATTTATTTTTAAGTATT
-CCTTAAATGAACAGCAAGCAGACGCAAATAATAGAACTGCTGTATCACTTTGTGGGTATC
-TTTTTCTATTTCTTTGGCTTTGAAAACTTTAAGAGCTTTTAAGTATTTTAAGTCAGCTTG
-GCAAAAAATCCTTTATTCAAAACCTAATTAAAAAATTGGAAAACAATCGGGCTTCTCATC
-TGATAAAATACATGTGATCTTTGGGCCTGCAATTCCTCGTTAATGAATCTCTCCTGCAGA
-TATGATCATAGACGTATGAAAAGACAAGAAACTTCATTAAAGCAACGCAGTCAGGGTTGA
-CTGGGGGGATTTTTATTCTGTCTCCTCCTTTGTATTCtttaaaaaattagaaatgtatat
-gtatttttttaaaaaaaattaaaacaaaaataaaGCTAAACTTTTTTTCTTAGAACATAT
-GTCAGAACTTTCAGAAAGAACATTCAAATTCAGGTGATGGGGTCCCATAAAGCAGATGTG
-CACTGTCAGCTTTAGATGAGTTGATTTTTTCTGGGGGAGGAATGAGGGCAAAGCAGTCCC
-CTTCCAACAGCCCAGCCCCAGCCCCAGGTTTCAGAGCAGAATGGCCCCTCCCCAAGGCAG
-CAGGGCTACCTGTTTGTAATCCTTCCAGTTCCGCTGAAAATTCACGGTGCCATTCTCACG
-GCGCTGGATGAGGGTCCACCTGCCTCCACTGCTCTGCAGGTCACAGAACACCTGGAGGGG
-GTGGGCAAGGCACAGCTGGGAGCCCTTGGAGGTAGCCAGAGGCCAGGCCTGTGCTAGCCC
-AAATGTGGCTAAGCAGACAGACCCCCACAGAGCAACAGGTgagcctgggggtcctgggca
-tcagaaagatccaggcttaaattccccacccattgtcatcatttttctaaagtggtgggt
-aaggaatgacctctcagagccttcctctcatttgtaaaatggagattcataccttaacct
-ctttgtgcctcagtctctcatctaccaactggggttgtgaaaattaaacgagatgagtca
-cgtaaagtgtttagaacagtgcctggcagtactaggtaaacggaagctcGACCTCTTTTT
-GTTGAAAGGAGAGGTTAGCAGGTGTGTGAGAAGTGTAAAAGACAACCTGGAGACAAACAG
-AGGCATTCTCCTTAGTATATTAAGAGGGGGTGAAAGGAAATAGAGCAATGgtaatactag
-caatttgagggccgaggagggaggatcgcttgagctcaggagtttcagaccagcctggga
-aacacagggagactttgtccctacaaaatgtttaaaaatattagccaggccatggtggca
-tgtgtctgtggtcccagctacttgggaggctgaggcaggaggatcactcgagcccaggag
-gtcaaggctgcagtgagctgtgatcatgccattgcactccagcctgggcaccagagcaag
-accctgtctcaaaaaaaaaaaGGGAATTATGAAGTAGGAATCTGCTAGTTGTTTCCcttc
-taggcctggctctcagaccctccctcctgacatccgtgctcttctctgtcacccttctta
-tcggatgacttgaccttaaattttaggacaaccttgggagccactgattgaaaatggtgg
-cacctctattagccctggtttctaatttcccacatggagcagaaccccaactcctgcctt
-caactggactatatgtaaactagaaagaaacgtctttgggctaaggccctggaattttgg
-gggttgtttgtaatatcagctatcatcatcttaaccaacacTGAACTATTTTGTGCTGTT
-CCAGTTAAAGCACCTCTGAAGTGATGCTGGTTAAGGATGCACTTCCAACTTTGGGAACTT
-CTGCTTATCCCCACAATCTGATCCCTGACTGCTGGGAAGTCAAAGCCACCCCTACACCTC
-TGGTATTTCAGATACTGGACAAAGCCTGATCCCGATGGGGTGCGGGGTGTCTGTTTGGGA
-AGCCCTTGGCTCAGCACCCTCTAACAGCCACAGTTCCCAGGGAGCCCCCTAACCTTCCTG
-GGCTTCGTTGCATTGGACACCTGGATGGTGTAGACACCACTGGCACTGGCCCCAGAGCGC
-TGGATCTCTGCACAGTCCTGGAACACCTGCTCACCTGCCATTATGAAGGCTGCAAAGGGA
-CAACACAAAAGTCAGTTGGAGGTGGGCAAGGAAAGAGAGAAGGGGCCAAGTGGGCATGCC
-TGCCTGCTTTGTGCCAGGTTCTGGGTTGGGAGGTGCTGGGGACAGGGAGATGAGTCAGAC
-CTgggaagatttcgtagaggaggtgacagtaagctggaacctgtgtaatgagcaggagtt
-gcccagtggagaaggggaaggtgttccaggcggaagaaacagcatatgcaaaggccccaa
-ggtaggaagggccctagtgtgtgcagaggacagGGCATGGGGAGGGGAACTAAGGCTGAG
-GCCAAGGAGAGGAAATGACTCACACCGTGAGAGAGGAGTTGAGACCAGGGAGGCTGCTTG
-CTGTATGATGCAACTGAGAGGGTAGAACAAGGCTGGCACAGAGAAGGTGGGGAAGGAAAA
-GGAGAGACGAAGCTGAGATTTCAGCAGGGCCAAGTCAGCCGTGAGTGCCAGGCTGCGGAG
-CCCAGATTCTCTGGGCTGagaaagagcactctgtccagagtgtggaggggggcctggagg
-ggatgagactcaaagctgggaggccagagaggaggctgctagagttttctgggagagagt
-tactggggcctgaacTCCAGTGAGGCActtcccatttcacagaccaggaaactgaggccc
-aagagtgaggcaactggcccaagggcacacagccaggtaaggcagaacCTTCCTTCTTTG
-GAGCTCCCTTGGGTGGGAAGCTGTGGGCTCCCCTTCATAGCCCACCCTTTTGGCTGTATC
-TCCCTGCTGCCCTGGGCATATGCTCCCTTATTCTGTCCTCCCTTGAAGCTGACTGCTGGC
-CTTAAAGGGCCCCTGTTTCTTCCCTCTGGACTACATGAGATCGGGATAGTATTAATGACT
-AAAACCTACCAGGGGTTTCTAGGCCTGGCCTGGAAAAAGTGACTGTTGACAAACAAAGTG
-CAGAGATTTAAAATCTCCTCTGTCTCAATTAGTGGAATCCAGTTAGAGGTTTGAACTATG
-ATTCTACCAGAATCCAATCTCTCTGGGTAGCCAGGTACCCAGGATGGGGCTAAAATTCCA
-GATGGATAGGTTGTCAACACCAGTGAGGAACCAGGAGGCTACCACAGGGTGGGACTTCCT
-GGTTTGGCTTTACATCTGAACTTCAGGGATCCCAGATCCTGGATCTGGGGCACTTGTCCA
-GAGAAGGCTATTGCTCTCATGTCACAAATGAGATGACTAAGACCCCCAAATCAATTCCAG
-TTCACTCACAAGCATTTCCTGGGCAGTGGAGACCCCTGCCCCACCTGTTGGCACCCCCTC
-AGCTCCCCACAGGGAATTGGAGTCCAGCCAAGCATGAGGAGGCTGTTGGCCTCAAGGTGA
-GCAGGGATGGGCTGAACCTCACCCAGTAAGGCAAGGACAGAGCCAGGGTTGGCCTGAGAT
-TTCCAGCCACCCTTTCCAAGGCTCTGCTCACTGTTATTTTCCTTAGTCTacaacaatatc
-aataacaataacaacaataatatcaacaCAAAAAGTGAAATACTCACCATGTATTGTAGT
-GTTTCCAAGGTGTCATGTAATGCCAGGGGTAGTTTGGGGCCAGGAAAAATATTTTTGGGA
-GGCATAAGAATAGGATGGACTGATATTGATATGCAACAGTTTGATCTGGTCCTCCTCTGA
-ATATCTGGGCTGGTAATTTGTACCAGTTTCCCTCGCTTTtgtgcataggcactgtgctga
-acccttttgtatgcatgaactcatccgattctctgtgcaagaactctatgagattattat
-tcccgttttacaagtaagaaaaattgaggctctgagaagttaaataaatgacttgtatga
-agttccagtgctaattaataagtgaaggagccagggcttgaactccggcccatctgactg
-caaagccagtgcccttcctcctacacATCTTCCTTTGGATTTCCACCACTGAGCATATGT
-AAGGTTGGGCAAACAGCCTGCATGAACAATCGCTGCTTTTATATCATGCACAAGTTTGGT
-CTTTTCTGCCTGTGCCCATGTCCTTGTAACCTTCTGAACCAAACTCCCCAGTGCCTGGGA
-ACATCAGAAGACTTGACTCTCTTCTCCTTTCACTAGCCTCCACCTGACTGGGACAAAGCC
-ATGCAGAGAGCTAGTGCTCCCTTCCTGCTAGACTTCAAGGATGCCTGGTTCCTGTGCCCC
-ATCTCCATCCAGCCCTCTCTTCTACACCTGGTGACTGAGCCTCTCCTTCAGTTTCTCCAT
-CCAGAAGGGGGTGAAAGCAACTGCCTAGTGTCCTTCCCTGGTGATAGTGGAGCACGGGGG
-ACAGGGTGTTTGGGCAAAAGGTGCCCAAGGTGAGGTGCCCAACACAACCTCCTACTCAGA
-CGATTGAGCAGACATTCAGCCTCATCTGGGGACTGGGTTACCAGTGGGTTAGTGGGAGGC
-ATTGGGCCCAGGCCCTGTGCCTTGGGCTGAGCTACAAGAAACCCACACATGGGATGAATT
-CAGGCAGCTCAAGGCCAGGTCTGTGCATACGCCAGTAATAGGTTCAGGTTAATCCACATG
-TCGCGATTTGGAAGGTGTCTACTTTTCCTACCTGTAGCTTCCTTAGGCCTCAAACCCCTA
-CTCAGCTGGGTCTGCCAGACTGAGATGGAGCCAGGGTGGAATCTTCTGCCCTCAAATCCC
-TGTCAGCCCTGGTGGTGCCGGGAGCGCCATCACTATTGGGTCTTAAAGGCTTTCCAGCCT
-TCCACTATGGATCCAGGAGCAGCAGTAGCCCCTTTGGTCTTTCTCTCTCATCAGGACATC
-TCCACTCATGGTTCCAGTCAGAGCTTCTTGAAAGTAGTCCCACTCTGTTCAAAAGCCTCC
-CATGCCCCCTGCTAGCCTCAGGCTAAGAGCCCTTCTCCTTCGCACAGCCTTTGGACCTGT
-CTATTTTTATGGTCTGGAAACTTCAGGAACACTGATAGCTGAGCATCTGGCACATATTAT
-GCACTCAAAAACCATGTATTTCTTTCTCCTTCCCTTTGGGACCCGTAAACCAGGGactgg
-acatttttgcaagagacaggagctgtgactgtgcattcactgctgtatccccagcaccca
-gcactgggcctgccacacagtaagtgcttagtaaatgtttgttgactgagtgaTTGCAGC
-TGGGGCCAAGAATGCCTTGGACACCCCAAGTAGGCCGTGTTAGAAGGAGTCAGTGAGAGC
-CTGGGAGCCCAGCCCAGAATTGTTTTCTTGACCCAGAAGCCAGGGCCAGGGATGCCTCTT
-CACTTCTGTTTGGCCCTCTTGGGCTTAGGGGCAGGGGCATTAAGATGAgagaggtccttg
-gggtgcattgagtctaacctcccagttcctcccattctacagccaggaaaactgaggccc
-agggaggggtaggacaagcccaagAAAGTGGGGCTGGAGAATGAATCCTGGAGACCAAAC
-TTGTCAGTCTGGATTGCTGTTGCCCTCATCCTCGCCTCCAAAACCCatgggtaaactgag
-gccaagagaggggcaggggcatgcccaaggtcacccatggaatcaggggacagggcctgg
-attgggaTTGTTGTTGACGCCATTATTACTGTTTATTGTTGTTTCTATTTCACAGATGGT
-CGGGGAGGGTGGGGCCCGCAATGGCTCCCAGGCGCCCAGAGACCCTGGAGGGTGAGCAGG
-GTCTCCCCTCCCCTCTCCTGCCCGTCTTTAGCCACACTGGGGCGCACACCGCTCACTCAC
-CCGGGGCCGAGGCGTTAGCCCTTTCTTGCACCAGGTGCCGCAACAACACCAGCAGCTGGC
-GCAGGCTGTGCTGCTGGTCCTGCAGGAGGCTGGAGTTGTGCCTGACACCGCGCAGGCCGC
-GCTCGATGTTGGTGAGGGCGGCGCTCTGGCGGCTCAGCGTGTTCAGCAGCTTCGCCTTCT
-TGCTGAGGATGCTGGCCAGCTCCTCCTGCTGCTTGGTCTCCAGGGCCTGCAACCGCTTCT
-CGAGCGCGCTGCGGGGTAGGGGGCGCACAGAGGTGAGCCTGGCATCCTCGCGAAGCACGC
-ACCCCCGCGCGCCTCCCCGGCCCTGGAGTCCCTGCAGCCCGACGATGAGACTCAAGTGTG
-GTGGAACGTCCTGTGCCCACTGTAGGCACAGATTGAGGAGGGGAGAAAAGAGATACCCGG
-CCCTGGAGTAATATAGATTGAGGTTTAGTGGAAGAAAGAGGTGGTGTGGGAGGGACACCA
-GCAACTGGGTAGCTATTATCAAATCCCAACTGTGCTTGCTTTTTGACCCAGCAGTCTACT
-CTCAGGAGTTATCCTCTAGGGAGCATGGTCAAGAATGGCCCTGGGGACTTGCTTGTAATA
-GAAAAACAAACTAACCAACCAACCAAAAAAGATATAGCCTAGATGCCCAAAAGCCAGGAC
-TGGCTGAATCCGTTGCGTTTTGGCGTCCCTGGAAATGTTCCGCAGTCATGAAGGAGGAGG
-CATTTGCACAGAATTGGAAAGATGCCCAGGACTTGGGGCACATCAAGCCTAACCCCATGT
-GTGGCAAGAGAAGAAAGAAAGTATTAATGTAAATAAAGAGAAATGGGGTGAACATATAGG
-AGAAGGCTGGAAAGACCGCAGTGGTGCCTGTGTTTGGGAAGAATATGAAAGAAATTCCCT
-CAAGTGCTGTGACTTCTGCAGAGCAGGTTTGAGTGGATGAAGATGGAGAGGAGGAAGATG
-GGGGCAGGATGGAGGGCCCAACTTTCACTTTTATTTTGTACAGGTTCCTGTTGTCCGATG
-ATATTATAATAATCAAGAGACATTTTTTGTAATGGATTTAGAAGCAAAGAGGAGTTTTTC
-AAAAGAAAGCCTTAGACTCAGCTCTTTCTTTTTGGACATTTTATCCTCCagatttactca
-catgtgtgtgaaatgagatatggaaatgttactcatcgtatcactggttggattagtaaa
-aggctggaagcaacctcaatatccattaactggggactggaggaataaaagcagggacca
-catatggtggagcattataaaggtggagaaaaaaatgagcaagcatgtcATGCAGTTATA
-GAATCTTTCCAAGGTAACTGAATAATAATTTGTAGAAACAAGGTATAAACAAGTAGTAGG
-CTACATTTGGGCTTAAAAAGGATAAAAATGGGAATGTAcagatgctccaaaatgtatgat
-ggggctatgtcctaataaagccatcgtaagttgaaaatgtcctaagtcaaaaactcattt
-aatacacctaacctgctgaacatcctagcttagcctagaccatcttaaacatgcttagaa
-cacttacattagcctgtgattgggcacgatcatctagcacaaaacctattttataacaaa
-atgttgagtagcttatgtaaggtattgatattgtactgaaagagaaaaaccgaatggttg
-tatgggtactcaaagtacggtttctactgcatgtgtatcactttcataccactgttaagt
-cacaaaattgtaagcccaaccattgtaagttagcaatcttctgTATGTATGTGTTTGCAT
-ATTCATAAGAAACCCTGGAATGTCAGCTTAtaggatgtcagcttcacgaggacaggggct
-tttgtctctttgttcacttctgtatccacagtgtctacaatagtgcctgacacatgaaaa
-gagtttgaaaaataattgttggttgaatgaatGGAAGGATACACAAGAAACTAGGAACAG
-TGGCTACCTCTGGCTTGGGTGGGTGGCTGAGAGACAGGGCTGGGAGGGAGACATTTTACT
-GTATATCCACTTGTGCCAACTCATTCTGCAGACTAAGAAATTGAGTCCAGCTAGGGCAGA
-AGAAATTTCCTCTGGACTCCCAATTATGCTGCAGGAAAAGAGAGAATTGGGGCACACTGA
-AATTCTAGAATTCCTGCCCTGTCTTCATGGGCCAAGAGTTTACCGATGACATCCTCCATC
-CTCACTGATTTCTAGACACCTAGTGTTAATTTAGAGTCATTGAAAGTGTCCCAGTCCTTG
-CCACTGAGACCTTGGGTTGGGAGAATAAGAAGATGGGCAGATTGTCATTAATTGCACCCA
-GATTAGAGAGAGCTGGGGGATCTTATGGCCTTATCCTGAACCGGCATGTGAACAACAACA
-TCTTGCCTGATTCACAGGCCTGTGGCTTGTTCAGTGGGTAGATTTTGCCTTCTCCAGAAC
-CCTGACTTTGGCAGCTTTTTTTCTTCACTCAGCTTGAAACTGAGGTGAAATCAGCCTTAG
-CTGCCAGATTTTTCTGCTTTATCTAAACCTCATGACCGCttttttttttttttttttgta
-atttaaaGGGTGTTCCCCTGATGCCCATTTGCTTATAAATGCAAAGACTCTCTGATAGTG
-TGGACAAGAACCTGGTAACTGTGGTTGTTTCTGGGAAAGGAATCGTAGATAGCACCAGAT
-TTATTTATTTGCAAAGAAGTAAAGCCAATAAAGTTTACCggatgaatagtatggtgggtg
-aattagatctcaataaagctgttaaaaTTTACGAGATAAATAaaagaaggaggaaggaag
-gaaggaaggaaggaaagggaaagaaagaaTCAGGGTGTCCTGGGCCCCAGGAAGATGCCT
-ATCCCCTGTCCCACCCAGTGCAGGGGCCAGGCAATGTGTTTGCCTGGCTCCTAGcccagc
-cccgtatccactctcatttccagcctcagtctagactccaaccctggtttcagtccttcc
-ccagcaggggctattcccagctctagtttcagccctaactccCAGGATACCTccttgccc
-caatcctaatccaagctcctaggtctggctgcaggccctatcccagacaccagcccacgt
-ccagcttccggtcctggctccagccccagtcctagccctggctctggtgcctgccctagg
-tcctaaacttgactccagccccagcccctgtcctagtcTGGTGCCAGGTGCCACACCCAC
-CTGTTTTGGCCCTGAAGCTGCTGGAGCTTCTGCCTCTGTAGCAGCAGCTGGTTCTCCAGC
-TTGTTGGTGGACAGAAAGGTCTCTGGCATCTGGGCATCCATTCTTGATGTCTGGTTCAGG
-AGCTGCCCCAGCAAGCAGAAGCAGGTAGGGGGCTGCGTAAGCGCTACAGGAGCCCTGCCC
-AACCACCCACCTGCCCACAGGCCCTGCCACTCCAGAAACTTACCCATTTCCACTCTCCCA
-GTCGTAGTTCCTGTGGTTACTCACTCACAGGCCCTGACTTAAGCTTATTacctgcttcct
-aaatttgcctttctccatcactgcaatggcagctccattctccctgatgcttaggcccca
-ggagctgtcaaccctgtcccccacatccaactcatctgcaggtcctgtcagccttgcctt
-ccaggtggcccctgaccacctctctcctgctctgtggccctcactctggccctggactgc
-tccctcattgcttgcaatctattctctactcagtagcctggggctgcctcttaaaacatg
-tttgctctgttcaaaagcttcctgtggctcccatctcatgtagcggaaatgccccagttc
-tcaccatggcctgcaaggccctatggtgtgatctgtccctatcacttctccagctccttg
-cctgccactctcctcctggtcactccagcatagtggtctcctgatgttcttgaacctgcc
-agcacgtccatcctccctccgggcctttgcacatgctgcatcccttgtctggagcactct
-ctgcagtaagcctggctgcagccctaccttctccatggcccttcctggccttgctgtatg
-agcttgcagctctcatccccccccaccactcccaatgcaccccctctcttgctctctctt
-ccatgctattttctccttagcgctgtcactggctaacatatgcagacatgtgttgcttaa
-tgacggaaagatgttgtaagaaagtcgtcatcatgcaatttcgtcattgtgcaaacatca
-tagtgtgtacttacacaaatctagatggtatagccgcctgcatacctaggctatatgaga
-cagcctattgctcctaagctacaaatccatacagcatgtgactgcacccaatactgtagg
-cagttataacacagtgggaagtatttgtgtatgcatatctaaacacagaaaaggtacaat
-aaaaacagcatacgatactcttatgggactgctgttgtctatgtggcaagttgttgactg
-gaacattaagcagtgcataaccatatatgtcacttatcttttcattttcaggggaagctt
-cacaggagtaggaatgtatgcctgctttgtttcctgctgtatactagacaccagtcttct
-caagcagtgcctggcacaCGGGGGATCAAACAAACAAATGGGCACAAACTTGTGTCTATT
-TGTTATTCACTTTTTCATCCACTGACTTCCCTACCCTTCATTTATTCACTAGTTCCTTCC
-CTGCTCTTTGCTGCTCAGATACCTCTTCTCTCCAAGTCCTTGGCCCCAGAGGCCCAGTGA
-Attgtttcttatccatcttcccctggcacattgtaagtcctctgagggcaagggagctgt
-gctactatacccctcattccagtgcccagcacagacccaggcactgaagttacagaggca
-gaaaagccaagcccagcatccaccccccagggctcatagcttggagagagatagttttat
-gacaagttcatcagggaggagggacccggggggctacaggcccagaggaggccttgaccc
-tactcagggtcagagatcaaggtaagatgactggggCTACGAACCAGCCTGGCCAGCCAC
-AGGCCCTCAGTGCCCACTCAGTCACCCTCTGTTACCTGAGCCTCCATGTCGGTCAGCTTG
-CGGATCTGGGCAGTGGTCTGGTTCAGGAGGCTGGTGCCCAGCTCTAGCATGGGGGCCGTC
-TGATTCTGGGCCATTTGCTGCTGGACCTGCTCCAGCTTCGACCTCAAGATCGTCTTGATG
-GCCCTCTCTAGCTGTGGGAGACCATGGGCTGGGGTCACGGGGGAGGGGCGGGGGAAGCCC
-CCTGTCCCTCCCACGTGTCACCATGGGAGGGCACTGAGCAGCCACTTGAGGCCTCCCTGG
-CTCAGAACATGCCGGGccaggtcaggccaccattacgtcttgcctggactatcccagtag
-atttttccctgggagggatttatatgcctgttttgtctgcctctctgcttccatctttgt
-cccctgcacagtccatcccccactaggcagccagagggatcctgctaaacctaagtcaag
-tcacactcctcctttgctcaaaatctttccagggttcctatctcacgcagaggaaaagcc
-atgactgcaggttcctccgtgactgggcctgccaccacactctcattcctctcctattcc
-cctctccctcactcacttcaatcccgatgcaatggctccatgacatccctctaacgaagc
-aagcatgtgcccacagctgttccctcactgttccctctggaatcctcccccAACCCTGAT
-CCGCATCTGCGTGGCACAcctcctcatgctgtttcagctttcttcataccacttatcacc
-acctgactttttaaaatcactatctctctttttatctgtctgttgtctgtttctctctct
-agaatgtcaattccatgaagccagggacttggttttgctcactgccttgtttctatgttt
-agcacaatgcatggtgcacagtgagtgctcataaatgcgcgttcaatgaattgatGAAAA
-AGGGGAAACAGCAAGGGTCAGAGCACAGCGCCCAATCACATGCCCCTTCACCAGCTTCCT
-CAGGGTGAGTCAGCCAGCAGGGAGTGGGAATGCATCTCTCCCTTGTACAAAGAGTTTGCA
-GGTCCAttggccaagctgtgttttctatcttcagatcccctctatctgccaaatggggct
-ggactggccagtctccaagggttctcccagctctgatgttctgggatcccaCATGCAAAT
-GTTCATTTCTTTGACAGGGCTGCTCTCTTTCCCAAGGGCAGGAGAGCTGGTCTGGCATGA
-CACCAGTATGCTGTTGTAAAGGTGAACAGTGTGTTCTCAGGGCTCGGTGCCTGCAGGCAG
-AGAGCCAGCTCCCCTCCACCATTGCCTCTCCATTCGGCACACATGCTGGCCTCTCACCAT
-GCCCCCCACCCCTGTCCCTGGCTCCTTCCCTTGCCCTCTCACTCAGTCTTTCAGAAGCCA
-GCTGGACAGCTCTCAGGGTCCTTGGGAAGATGGGTGCTCCCCAGGAGAGGTGGTGACCTT
-GGCTCGGGCCAGGCTCCAGCCACTTCCTCCTTCATCTCTTCTCCCTTCTTCCATCTTGAC
-TGTTCACTCCCATCCCTTCCTCACCCTGGAGTGTTTCAAAGGGAGCAAGTTCCATTATCA
-CATCCTGGAGCGGGTGCTTGTGGGCGGTAGTAGTACTGGTTAGAGCTgtgtttctccaag
-tgtggttcttccgtcagcatcagctgagctcattaaaaatgtgaatttccaggtcccacc
-gcagacctcctgaaccagaaactcttaatggtgcccagccaactgtggttaacaacaccc
-ctggctgagtcagatgcctgctcaagtgtgagagcccttgATGCAGAGTAGCAGCAGGGA
-CTGAAGACCAGAGAGACCCCCCTCCTTCTTTCCCTGCATCATCAGCCCACCCCCTCCCTG
-CAGCACACAAACATGCGCTAACAGCTTCCATCTAAAAACTAACTCCACAGCCTCTCTGGC
-TGCTTCTCCAGTTTCTCTGATCTCATCAACACAAAACTTCTACAAGTTGTCTCCATTTTC
-TCACCTTCATACCCACCCTCACTTAAAAAACAACAACAACAACATAACGTTAATAATAAA
-ATGATGTTACGTTTCACACATACAAAAAAGCATAGAggccaggtgcggtggctcacacct
-ataatcccagtactttggaaggctaaggagagtggatcatttgagcccaggagtttgaga
-ccagcctgggcaacatggtgaaactccatctctactaaaaatacaaaaattagccagcca
-tggtggcataagcctgtggtcttagctacccaggagactgaggcaggaggatcgctggag
-cctgggaggtggaggttgcggtgagctgagatgcaccactgcactccagcctgggtaaca
-gagtgagaccgtgtctcaaaaaaaaaaaaaaaGTATAGAGAATAAATATAGCCCATAGTG
-CTCATCCTCCTGTATACCTCCAGTCATGTCTCTCCATCCTGGGAGGTCCCTTTGCCTTTT
-GGCgtctcactgttgcccaggctggagtgcagtgatgtgatcacggctcactgcagcctg
-aaactactggcttcaaacaatcctcccacctcccaaatagctgggacgacaggcgagcac
-caccacgcgcagttCCCCCCTTCGCTCTTTAATTCACCTTGTCATAGATAGCCCTCCTTG
-ACACTGCCCTCAAGGGACActccatcttgcttgacatctcaggagcaatcacctggatgg
-ccactccctgttgctggacgacttccccccaatcctggtttcctcctagcccctaaccac
-ccactctctgactcctcctttacagactcctacacggcagggcccccatggcccagtcct
-gggtccttgtctctatgtacattcactctctaggtcaggggtccttaatgaagaagccac
-aggctccatgaacttgagtgagaaaaaaagatcacattttttgtccactaatctgcaatt
-aaaatttggcatttccttcaattatgagcctaggtcacaaaccacagccatactagcagg
-tcctgagagtcattaccaatagaaatcccaaatattttcatatcacaacacactcttacg
-gtatcttaaaacattgtttttactcaccgggactttggaattatagacatcacacccacc
-actggataatgctatgcctgatcacagattttatttttcatattttgcttatgatttcca
-tattactgagtgttcttatgctttgattttatgcatttctgagaaaggattattaagctt
-caccaggaccagatgccaagaggTCTGAGGATCCAAATGCATCAGGGCCCTGCCCCAGGG
-GCTGAGATCGGTCTTTGGACTTCCACATCCctctgtgctaatggagccatcaccatctcc
-cacccagacttctcccctgcatgtccccaactcgccatctctgcatggtttccaatgagc
-atctcaagcccagtgtgaaactcttcattcctcagctcccatcgcccctgtccctgtaac
-tcccaccccatgcttcgaaatctttcccatctcaggaaatggctccacccagttctgaag
-ccccaaacccagacctcaatcttaacttctctttttcttagcggccacactcaacccact
-agtaagtactgcccactgtgatcccaatttggatttcaaatctgtttactcgccttattc
-tgggccaggctgccctcctctcCATGGGTCTGCCTTTTGTGCCTTCCTGTCTTTAACCCC
-TCTGTCAGCTCCCAGGAGATTCTTTTTTTTTTTtgcagttgcaagatttaatagcatgaa
-atagagtgaaaacagagctcccatacaaagggaggggacccaaagggggttgctgttgct
-ggctcgaatgcctgggtttatatgccaatccttgtctctcccactgtgctctcaggcaat
-agatgattggctatttctttacctcccatttttgcctaattagcattttagtgagctctc
-tgattggttgggtgtgagctaagttgcaagccccgtgtttaaaggtggatgcggtcacct
-tcccagctaggcttagggattctaagttggcctaggaaatccagctagccctgtctctca
-GTccccctctcaacaggaaaacccaagtgctgttggggaggtcagctgatgaccgcacta
-actgcttcctgctgaattagggagtagtaggggtggtgcagttgagatttcctcgggagg
-ggtgccttcgatgtcattaacatcagagcatgggctagcaggctggtccgggggtccgtg
-gtaaatcttagtcatggactgcatgtgagctccCAGGAGATTCTAATGTGTGGCTGGCTG
-GGCCCACCAGCATGGATGAGGACAAATATAGCTGTATCGAGTTTGGTCTCAGACTTTTTC
-ATGCATCATTGACCTCCTAGAACCTAAATTAAAAAGCAGACATCCAGGTACTGAGCACCT
-GCTCCAAGTAGTCAAACAGCATATTCATGCCTGAGGTGAGACTTTCCCAGGcatcttccc
-caagcttctcatttgcctgaacatagacaaactgaggcccagaagtcttgcccaaggtca
-ccatctggcaggCTAGGCTCTAAGACTCCTTGCCTGAGGGCTGCAGAGCTGAGCTGGTGA
-TTCAGGGCAGCTCAGGGTCCCCTCAAGTGACTGGAGCTCCCCAAGCACCTCACTGGTCCC
-CCACTTGTCCTGTGGTTGCAAGTGGCTGGGCAGGGCAAAGGTTACCCACAGCTGGATCCC
-ATCACCCAGTTTGCCACACCCGCCCACCAGCACAGGCCCTGGGATGGATAATCTGGGCCA
-GATGGGCTCAGTTAGGCTGGGCTGGGCTCTGGAGACTAATATTGGCCTGGGTGGTGGGAG
-CTAGGTCTGGCCCATGGCTGAGGCACCAGCTGGAAGGGCAGGGAATGGATCCCAGTGGAG
-GAACTCACCCAGCGTGGGATCTACTTCTCTTGTTTTTTTGGATCTACTTCTCTCTATGCC
-GTGCACCGACTCCAGGATTAGACCTGCCCCTTCTCCATCACTCTCAGGCTGCCGAATTCT
-CAGGCCTATGATGGGGTACAAAGGCCTGACCTTTTGTCACCCTTCCAGCTGGCAAAGAGA
-CTGAGTTTTGGTCCCTGGTCTACTGCCCCATCCCCTTGGCcctgggtttgagttctggct
-ctgccacactttcattgtgggcccttggagactactgtgtttctctgagccccactttac
-agatctgggtcatgggTCAGCACACCCTGCTCCTTGCTGGGGAGAGGGCATTTGCAAAGG
-GTCTTGAAGGAAAAGAAAGAAATTTTCACAGGCAGGGGCTGGGGGAGAGGGGGTGATTCA
-GACAAATAACAGGTGCAGATCCGTGGATGAGCAGCCTCCGTGGCCGAGGAGATCTGCTCA
-AGCCTGCTTCTCTCCTGCATTATTTATATAaaatggacatcaattggtgaatggagaaac
-tgcagtccatccatgcagtggactccattgagcaataaaaaggaaagaaccattgatgtg
-tgcaaacacacagatgaacttcagatggatcatgagtgaaaaatatgcaactccaatggt
-tccatactgtaggagtctatttgtatgactctctaaaaatgtcagaatctgtgattgcca
-gggcctgggtccggggagggggtggggattgattgttaaaggacacaggggagctttttg
-ggatattggcaatgttctatgtcatgattttgctggtggttacataactgtatatgtctg
-tcaaaactcatggaactatatgtgaaaagggtagattttgctgtacgtgggtcatacctc
-agtaaaaaaCAACGCCCCCAACACAAGGTTCTATAAAATGCCGCAGATATACATATGTAA
-CATTAAATAGATCTCCTCCAGTGAACCCCCTCACCCTCTCTGAGTTTCATTCATGTGttc
-attcaggaattatttcttgagcacctactatgtgctcatcctgtattaggtattagataa
-tcagaaatgagcaaaattcgtaaagtttctgattccagggcacttctactaaatatatca
-gttgcattgaaatcttgatgaatgctatgaagaaaataagacagggtaatatgtggggtt
-ggaggcaagtttagccagtatgatggagaaagccccaccagagagggccatctgggctga
-gaggctgagaagaagcaaggtctgggagagtcaggagggagggaattccaggcagaggaa
-aaggcaagtgcagaggccttgaagtgggagcgtgtctggtatttgaggatcaaaatgaag
-ATGGTAACAATGATATGCCCTGCAGCTATCTCTCTTCCATGGAAAATGGTGCATGAGGTT
-CCTGTTTGGGAAATGCATCTTGTCAACTGCAGATAAAAATCAATgcagagagagtagtgc
-tttgtatggatgaagctgtgtgtgaatcacagctcttagcttactggctgtgtgacctta
-ggctggggcctctactggtgtctgagccttttctctaaaatgaagataatcatagctcct
-tcccctgggttgtagggagcattcctgagataaCTCTGGTTGTAGTTACATAATGAACGC
-ATGATAAATTCTGGTATGTCTGGGCCATATCTTACTATGtgtcaggactctgagcccaag
-cctgcgcgtatacatccagatggcctgatgcaactggagaaccacaaaagaagtgaaaat
-ggctggttcctgccttaacggatgacattaccttgtgacattccttctcctggacaataa
-gtctccgtagctccccaccaagcaccttgtgacccctgcccctgcccgccagagaacaac
-cccctttaactgtaattttccactacctacccaaatcctataaaactgcccaccccatct
-cctttttcagactcagtccacctgcacccaggtgattaaaaagctttattgctcacacaa
-agcctgtttggttcacatggacgtgcatgatatttggtgctgaagacccgggacaggagg
-actccttcaggagaccggtcccctgtccttgccctcattccatgaggagatccacctatg
-acctccgatcctcagatcaaacagcccaaggaacatctcaccaatttcaaattgagtaaa
-cggtcttttcactctcttcttcagcctctctcactacccttcaatctccctgtccttcca
-attcgggttcctttttctctctagtagagacaaaggagacacattttatccatggaccca
-aaactgcagcaccggtcatggactcaggaagacagtcttcccttggtgtttaatcactgc
-agggatgcctgccctgatcattcacccacattccattggtgtctgatcaccggggggaca
-cctgccttggtcattcacccACATTCCCTTGGTGGCATGTCAATTGCAGGGACACCTGCT
-TTGGCTGCTCACCCATATTACAGCCCAGGGCTGCTCACCGcccgcttctccgtgtctcta
-gctttctctttaaacttacctcttcactgtggtcaaccttccaccctgcattcccccttc
-ttctcccttagcctgtgttctcaagaacttaaaacctcttcaactcacacctgaactaaa
-acctaaatgccttattttcttctgcaatactgctaggccccagtacaaactcgacaattg
-ttctaaatggccagaaaacagcacttttgatttctccatcttacaagacctggatgattt
-tttgtcaaaaaatgggcaaatggtctgaggtgcctgatgtccaggcattctttcacacat
-tggtccctccctagtctctgctcccaaagcgactcatcccaaatctttttttttctctcc
-tgtctgtttccttccatctccaccccaagctctgagtcctttgaatccttcttttctacg
-gactcatctgacctctcccctcctccctgacgctgctcctcgccaggctgagccaggtcc
-caattcttcctcagcatctgctcccctaccctataatccttctatcacctcccctgctca
-cacccagtctggcttacagtttcgttctgcaactagccctcctcacctgcccaaaaattt
-cctcttaaaaaggtggcttgagctgaaggcacagtcaaggttaatgctcctttttcttta
-tctgacctctcccagatcagttagcatttaggctctttttcatcaaatataaaaacccag
-ccccgttcatggcccacttagcagctaccattagatgcttcacagccctagacccagagg
-ggccagaaggccaccttatccttaatatgtattttattacccaatctgctcccaacatta
-gaaaaagctccaaaaatgagattccggccctcaaaccccacaacaggacttaatgaacct
-tgccttcaaggtgtacaataatagagaagaggcagccaagtggcaacatatttctgagtt
-gcaattactcgcctctgctgtaagagaaaccccagccacatccagcacacaagaacttca
-aaacgcctaagccgcagcagacagttgttcctccaggacctcctcccacaggatcttgct
-tcaagtgctggaaatctggccactgggccaagaaatgtccacagcctgggattcctccta
-agccgtgtcccatctttgcgggaccccactggaaatccaactgtcccactcgcccaccaa
-ccacacccagagcccctggaaatctggcccaaggctgtctgactgactccttcccagatc
-ttctcttcttagctgctgaagactgacactgcctgattgcctcagaagcctcctggacca
-tcacagatgctttaggtaactcttacagtggagggtaagtctgtcccctttttaatcaat
-acagaggctacccactccacattacctacttttcaagggcctgtttcccttgcctccata
-actgttgcgggtattgacggccaggctgctagactccttaaaactccccagctttggtgc
-caactgggacaaaattttttttttttttgagatggagtctctctctattgcccaggctgg
-agtgcagtggcgcgatctcggctcactgcaagctccatctcccaggttcatgccattctc
-ctgcctcagcctcccgagtagctgggactacaggtgcctgccaccacgcctagctaattt
-ttttgtattttttttttagtagagacggggtttcaccgtgttagccaggatattctcgat
-ttcctgacctcgtgatttgcccgcctcggcctcccaaagtgctgggattacaggcatgaa
-ccaccgcccccggcctgggacaacattcttttatgcactcttttttaattatccccacct
-gcccagtacccttattaggccaagacattttaacccggacaagtcttacaggctggtcca
-agatcttcgccttatcaaccaaattgtcttgcctatccaccctgtggtgccaaacccata
-tactctcctatcctcaatacgcccctccacaacccattaatctgttctggatctcaaaga
-tgctttctttactattcctttgcatccttcatcccagcctctcttcggtttcacttggac
-tgaccctgacacccatcagcctcagcaacttacctgggctgtactgccacaaggcttcag
-ggacagcccctattacttcagtcaagccctttctcatgatttactttctttccatcactc
-ccacctactctcccactgaaacttccacctatcaatctcttcccacacaaggcaaatggt
-tcttggactaaggaaaattcctccttccagcctcacaggcccattccattctatcgtcct
-ttcataacctcttctatgtgggttacaagccaccagcccacctcttaaaacctctcattt
-cctttaagacatttaccttgtatttcactccatccttggctaccttccccttgctcttca
-gactctcctcccaggccctcttcttgtttgcttatacccagccctgtaaataacagtgaa
-tggttgcttgtagatactcgacgttttttcatgcaccatgaaaattgaacctcctcctct
-aggaagttaccccatcagtctccattacaacctctgacggctgccaccctagctggatcc
-ctaggagtctgggtacaagaaacctttagtactccttctcatctttttactttgcatttc
-cagttttgcctcgcacaaggtctcttcttcctctgtggatcctctacctacatgtgtcta
-cctgctaattggacaggcacatgcacacaagttttccttactcccaaaattcaatttgca
-aatgagaccgaagagttccctgttcccctcatgacaccaacaGTTCACTACTATTTTGTT
-TTGTTTTTCTTATTATTAATATAAAAAGACAGGAATaggccttgacttactcactgctga
-aaaaggaggactctgaatatttccaaatgaagaaggttgttttcacctaaatcaatctgg
-cctggtatatgacaacataaaaaaactcaaggacagagcccaaaaacttgccagtcaagc
-aaataattacactgaacccccttggacactctctaattggatgtcctaggtcctctcaat
-tcttggtcctttaatacctgtttttctccttctcttattcggaccttgtgacttccattt
-agtttctcaattcacacaaaactgcatccaggccatcaccaatcattctatacgacaaat
-gctccttctaacaaccccacaatgtcaccctttaccccaaaatctttcttcagtttactc
-tctcccactctaggttccgacattgctcctaatcctgctcgaagaagccctgagaaacat
-cacccattatctctccataccacctccaaaaattttcgccaccccaacacttcacctcta
-ttttgttttgtcccaacacttcaccactattttgttttgtttttcttattaatataagaa
-gacaggaatgtcaggcctctgagcccaagcctgcacgtgtacatccagatggcctgatgc
-aactggagaaccacaaaagaagtgaaaatggctggttcctgccttaactgatgacattac
-cttgtgacattccttctcctggacaatgagtctcagaagctcccccactgagcaccttgt
-gacccctgcccctgcccacaagagaacaaccccctttaacgtaattttccattacctacc
-caaatcctataaaactgccccaccccatctccctttgctgactcctttttcggactcagt
-ccacctgcactcaggtgattaaaaagctttattgctcacacaaagcctgtttggtggtct
-cttcacacggacgcacgtgacaCTATGTAGCTGTTAAAAACAATGAGGTTGATggctggg
-catggtggctcacacctgtaatcccatgactttgggaggccaaggtgggtggatcgctta
-agctcaggatttggagaccagcctgggtaacatggtgaaaccttgtgtctactaaaatca
-gaacaaaattagctgaaggtggtggtgcatgcctctagtctcagctacttgcggggctga
-ggcaggaggatggctttagcctaggaggtggttgcagtgagctctgatcatgccactgct
-ctccagcctgggcgacagagcaaaaccctatcttaaaacaaaacaaacaaacaagcaaga
-aTGAGGTTGAGCTACATCAGATGCTGATCTGAAAAGATGTCCCTGTCATGCTTATGAGTA
-AAAAAAGAAACCAAGAGGCAGAACACTATATACAATGTGGATCCATTTGTGTGTAAGAAT
-GATCCAAATGATGTATTTTTATACAAAAACCGAGAAGATCAAACTATTAACAGTAGCGAT
-TTGCTTCAGGGGAGGGGGTTTCAATAGGGTGATGGTGATGGCGTTTTCTTTTTACATTAC
-CTATATTGAAATTGTTTGGATTTTAAAAGTAGAATGAGAGTGTATACAGGTATAATTAAT
-AGAATATTTAACAACTAGTATATAAACACTAGGAGTCCCTAACTGATGTCCTGGACCCcc
-agggatctgtgaatagaattcaaggaacctgtaaacttgcattaaaaaaaaaaggacatg
-cttttcccactagtctctaactgatattaacttttcctgtggtagtgagtatatgccaca
-ggctattacagtggtgatagcagggcctgcagctttgtcactagtagaaaccgcagatac
-tctaatatctcattgcagtgattgcggatatctacgacacattgtgtatactcacctcag
-cctcaaaattatggaaggtacttgacccaccactcagtcttgttattttgtgcattaata
-cagaaataatataggactatatcagaaacctgttttctgttatgttgacatttgcatctc
-aaggcaatttgtttcctttataaatctatgcatttaattttacatttcaaaaaaaaattt
-ttttttctgagagagggtcaccggatgccaaaggaccccaaggtacaggaaaggttaaga
-cccctgAAGGCCTGTCCCACACAAGGTTCCTCACTGGTGTccccagtaggctaccaactc
-tgagagtgcaaggactttgcctgccttCTGGGGCCTGGAAGACTGTCTGGATATTTgtag
-gctctgctgttgaccccaattatagatgggcaaatggaggttcaggctcagagtcacttc
-cctgaggtcacccatcaagttgcagatgctagattcctcctcatgtctactgatttggaa
-ggctgGGAGGTCAGGTCTTGTGGGTGTAAGAGGGTCAAGGCGGGGGCTGGGCGGGTGAAA
-GTGGTGCTTCCCTCACCCAGGGTACGACCCAGGCTTTAGCCTTGCAGCCAGTGAGCCCAG
-AGGATGGGGTGAACCCTGCTGCTGGCTTCTGCCTGTTGACCCAGTTCCTGGGTCTCTGCC
-CAGACTTGTTCCAGAACCAGACCCAAAGCACCAAGGTTTCTGTGAATGGGGGTGGCAtta
-aggaaacttacccttctagttggtcagacccagcctctcagagctgccctgctttccttt
-gtctctctcacatcctgcatccaatctgttgtctctaccctcgggcgcatgcagaatctg
-accacttctgcccaaccttgccacttccaccccagtcccagcccccattgtctctagcag
-ggatcaaagcttccttgatactgtcagcatctgtcattgctccctgggcccccaggctat
-gctccacacatagccagtgacgtcctggtcaacctgtcagattatgaccccctctgctct
-aaaccctgccttgggtcccgtgtggcttagagaggaccaggactccttgcagATTCCTTT
-AGTGAAGAACAAAATTCTTTGCTTTGGAAACAGGTAAAACAGTCCCCAGTGAACAGAGTC
-CAAACCAGGCTGTACTGGGATGGTGTGGGAATTGGGATGAAGCCTGTTCTAGGTCCTAGG
-CTGAACCAAAGCCCCATGGCTGGGGTGGTGCAGGGTGTGGAGATTTGAGCCCGGCCTGAC
-GGTAAAAGGAAACGGGCTTTAGCAGGGATGCCCCAGGGGTAGGAGCCCAGGCAGGGAGAC
-ATCTGGGGAGCAAAGACTTAGTGAGGGGGAGACCTAAATGATGCTCTCagggacctctca
-gctcccatcccctccatttcacagatgggaaaactgaggtcccaatcaggaaaataaagt
-gccagaggctgtacacaggagctaatggccagatctggTGCAGACGTATGAAAATCTGGA
-GGGTCAGATCTTACCTAGCTGTGTGTGTGTGTTTCAACTTAAATGTAAATCTTTGTAATT
-TTATTTTTCGAATGGGTGATATAAACACATTGTTCAAAATTCCAAGGAACAAAAAGGAGT
-GAAGTGAAAAACAAATTTTTCTGTCCCTGCCTCAACCCACAGTTCCCTCCCTACAGGCCA
-CTGAGGGAGGTTCCTGGGTTTCCTTCCAGAGAAACGCTATGCATACTTCTACATCTGCAG
-TAACTGTGTTTCCATCCCACCACCTGCCCTTCAGGCTACAAAAACCTCAGCTTGccattc
-cacacctggcttccttttgcttaacattgttcatagcatgttccacattcatccaggtag
-acttgcctcagcattgtaagctgcttgaaattccatctatgggcctccattgtttgctca
-tctagtcccctctagctgggcctgtaggatgtttccaggctttaacatcaaaaacagggc
-tgctacaaatatccttgtacacctgtcacttaacattcccacaagtctatgtggggaata
-aatcctctgaagtagaattgcttcaaagtagagtgaaatcacacgtttttttggtccttt
-gttttttgaggcagagtcttgctttatcacccaggctggagtgcaatggtgtgatcatgg
-ctcactgcagccttgaattcccaggctcaagcgatcttcccacctcagcctcccaagtat
-ctgggactataggcatgtgccaccaggcccagccaatttttcagtatttttttgtagaga
-ccagggtcttgctttgttgcctcaggctggtctcaaactcctgagctcgagtgatcctcc
-cacctcacctcagcctcccaaaacagttgtgattttgactatcgttaacaaactgccctt
-ggcagaggttatgccTAGTGGTTTCTGCCCCTTTGGAGGAGAGGCCCTAGGGTCTGCAGA
-GGTGGCCACAGGAGCCACAGAGTTGCTTATTGCACCCCCTCCCAATACGCATCCACACCT
-CCCAATCTCAGTAGCACCAAAGCATCTCCCACCAGCTtccttctgacttctaggtctccc
-tgaaaatgtcacctcctctgagaagcattccctgaccacccccactctactccacctgtt
-tatcacagtgtgcactctggcttctacacagtacttcatgccatctgaaatcactttagt
-catttgtcatttgtccaattcccccacgagaagagccccaggagtgcagaggtttgtctg
-ccctgttcatgagcacatcctctatgcctagaatagggctaggcatatgagaggtcctcg
-ataaatatttgtggaaagagcagatGGGTCAGTTTTGTGTAAGGGGCACGAGATTTCCAC
-TGAATAGTTGTTTGGCAGCTAGAAGCAAGTTAGGAGCCTCGAGCCCAGGCCCAGCCACTG
-CTGGAGCCTGTGAGAGGCAAAGGCAGTGGAGACCACAGAGACCAGAGAACAGAGAGCTAA
-CTGGTGCCAGGGCAGAAAGAAAGGGGAAGAAACACCAGCACAGAGATGGGAGGGGCAGGA
-AGGAGGGTTCCCAGGAGGGAGGCCCATGGCAAGGGAGGGAGTCAGCTTGGGGTATCTGCA
-GGAGGAATGTTCTAGAAATGAACAAGACATAGTCTTGGTGCTCATttccttcctccaacc
-aactcattcagatgtgccgagacctgggcatggtgctggggatagagcagctaccagaac
-aggccaggctctgcactGCTGCTGCGGTCTCCCAAGGAAGATATCTAAAGGGCtactctg
-tcccaggcatgaccccaaggccctacaaatacagctcatttagtccttggtgctcccatt
-gtcaccattttacagatgaggaaaggaaggcattgagaagatgagcatcttgcctaagtg
-gcaaagactggatttaaatataggcctttggtctccagagaccacacccttagccactCG
-GTGGGCTGCTtgtggcagctagccttcaggatgaccccagggatcctggtgctcatgccc
-ttgtgtagtcccctctctcaacaagtcaggactggctggcatgactaattagatattgta
-gaaacgttagtgtgacttccttggctaaaccattgcattgtgtcttctgtcttgccctct
-cttggaccacacgctttagaggaagtaggccactatggcctgaggacccttaagcagccc
-ttgggaggaagccatctggaggggaactgaggccttctactcacagccagcgccagctca
-ccagccacaggaggccgagccccagcccaggtcaagccttcagatgagtgcagccctagc
-tgatacctgagtgcaaccacatgaaaaaaaccccaagtcggaactaccttgttaagttgc
-ttcagaattcctgaccctcagaaactatgaaagataagaaatgtttgttgttattttaag
-ctgctaaatgttttagggtaatttgttatgccacaatagataactaatataCTGCTTTTC
-CAGAGCTTATAGAGGTTTAACCCTCTTGCTTCTCTTCTCTGCCATCCCCAGGCCTCAGTT
-TCCTCATTTTGACAATGGGCTGACTTGTGATTTATGAGGGTTGGCCCCTCCTCCTCTGCC
-TTGCTTCTGTCCCCTGGGCCTGCACCAGGCCCTCACCCTGTGGCTCAATGCAGACTGAAA
-TGGTTTGTCTTGTCCTGTCTGAGCAGCTGGGCCCAAGCCTTCCTCATTGTTTTCCTCTCT
-GCAAGACATACTATTGCTTTTCTTCTGGGTCAGGCTCTGGGCAAGCACAGCCAGTGGGCT
-GAGAGCCAGGGGTAGAGAGACTTGGGGACCAACGGGCTCTCACGGAGGGATGAGCTTCTC
-AACCCTAGCTCAACCCTCAATTCTTTGACACAGGCCCAGCGTCTCCAAACATCcagtgtg
-gtctgggcctggagcactgcactgagagtcagcaagcttgctcaatagctttgccatttc
-ctttctctgccagtgatgagtttctctgaacctcagtggcctcattgtttcctccttgca
-gagcgcctggaaggaatagggaaatggccactgggacctgtgttctgtggatctgggcta
-ggattcttgtctgtctggttcatgaggcctagcacagtgcctggcacacagtagtgcctc
-ccatatttgtggaatATTTGGGACTTCCCTGGCTCCTGAGCCTCACCTTTCATGGGGTGG
-CAGGTCCAGTGTTCATCCCAGGTGAAAGGCCACAAGGAGAAGATGAGGAGTGTGGCGGAA
-AGGGCTGCAGAGGGAGGGGAGCAGGGCCTGCCTCTGCCATCTGGACTTGGGAGGGGCTGC
-CAGGGTCCCTGCCTCCTCAGGCTCAGGTATGCCTTTGGTGGTCGTCTATATTTCAACCTT
-GATCTTGGGAGGTGTTTGCGATCGCTCACCTCCCTGACACTTGAAAGTCACAGAATGGAG
-AGGTGTGTCCATTTTGCTTGGcaacatgcttattgaacagttattatgtggtcagcactg
-ttctaaccactaggtatatgaagtccttgcagccaccctccaaggtaggacctgttatcg
-acctattttacagacgaggcacagagaggttaaacaacttgtccaaggacaggtagctct
-tcacaggtgtaaccaggCGGTGCTTCTGCAAGGCCTCTTGGCTAGAGTGATCATGTGACA
-GCGCCCCTGCCCACCCCCCAACCTCACCTCAACTTTGGGAAAATAGGGCAAAGTATGTTC
-TAGACACAGGGAGGCTTTGCTGGGGTATCTCCCCACGTGGCACCAGGCCTTTCTGCCTGT
-ACGACTCCAGTGTGTACCTCttctcttattggatccccagcagcctggaggaaaagggtg
-attgttccccacacaaatgagtaaactaaggcccacaaaggccgagcattactcacagct
-ggtaaaggaagaTTTTTAACTTAATGGCTGAGCTCTTTCTATGTGCCTGTCTTGCCTTCT
-TGGTGGCTGAGGCTGATCCTGCAGATGGGGTGACAGGGATAAGATTAGGGTCAGACAAAG
-ATGGTGGAAGCTGGCTCAGAGGTCCACAGTCTATCAGAGAATGATCCTCAGTGAGGACAG
-GACAGAAAAGTGGCCACATCTCTTCCCAGTCTCCATGGTCCTCCACGGAGAACAGGGTCA
-GGACCAGGGACATCTGtctggctcctggtgagcactccagtctcatcttggccatgctct
-cctcgctctctgcactgtagacacactgaatgccttttgcttttggcccattctaccccc
-agggcctttgcacttgctgtcccgtgtgcctggaatgcttttgcttcctttccctgtctc
-gccactgccaacccagcctttagatctcagctctgtccttcttcctagtgcctccctccc
-tcaaggtcaggcacccattatccacccctagcatctctcggtccctccttcatggcacat
-atcatgattgatcgttgcacatgggaaatcactaggttagttacacccactgctccaggg
-gcaagggggaaggatggtcttccttgctcactactaaatccttgtcacttgcatggcgcc
-tggcgcattgtaagccctcaataaacagtggtggaagggacaaTTAAATGAATGCAGGAA
-TGAATATTCTTACCTGACAAACTAAGTTCAGAGTTGTGTATACACATTTGTGTTTGTGTG
-TGGTGGGGGGCAGGAGTCGGGGGTTGCACATCTACACATAGTCCCAGAATTGAAAGGATG
-CATGATTTTTTCATGACATTTATGGCATGCTATGTATCTTGTTGCCTCTGGAGAGGAGAA
-ACAGGGGTCTCAGctgggtgtcaggaaccctgggttctgggccaactcctgccaccgacc
-cttgggtgaatgtgattgagtcactcccttgcccaggcttagtgttcccatctgtaaaTG
-GTGGGCACAGAGAGGTGGTCTgtgtagtggttaagactgtgggttctggagccagtctgc
-ccgggtacgaactcacctccctcacttcttagctgtgtaaactccctgggcctccgtttc
-cccgcaataaatggggatcataacagtccccaccttttaggatgccacgaggtttatgag
-tcaatgtttataagacacatataaagtgcctggcccagagaaagTCCCATATGTGAATTC
-ACCCCAGCAAAGCACTTATCCCAGAAGACAGAGGAaacaatagtagcatctcctggttct
-ctgtgctggagcagtgccaggcacatcccctgaccagccatttgagcctcacagcaaacc
-caggcgatgtgtgtatcatcacctcaattttatagattgaaaaactgaagctcaggtctt
-tctcatagttacacagctaataaTCTCACAGATGTAAAGTTGAGGGAACAAAAGGAAACT
-ATAGTAAGATATGGATGGTACGACAGGATTCCTTCCTTGCACCGTGAATCCTGGAGTCTT
-Gacgtttactgagcacttactctctgccaggccctgtactgagccccacatgtgcattgc
-ctcatttaatctcctcaataacctgcaaagtagcttctgttagtgtcctcacttcacaga
-taaggaaaccgagtcacagagtggaaaagcaatggtctgagaaggcacagccagtaagca
-gtggagctgggattcagactgagtcaactgggactcagggcctacactcGGCTTCTGTGG
-GATTTGCCCCCAGGCCCTGGGCCAAGAATGGGGTGTGTAATTGTGGGGACACCCAGACTG
-AGCTTCTGGAGCCCCTTAGCTTTTCAGAACGGCCACAGCTGCCTGAGGCCCTACCTGAAT
-CATCCCTGGCAGAAAAGCCCTAGGGAGCCTTGGGCCAAGGGTTCCTGGGGGAAGAAAAAT
-CTAGTAGCTATGGATCTCCCCTTTGGGGACCAGGGTCCTCTATATTTTCCAGGTCCCAGC
-TAATGCCCAGGGACCCATCCACCATGGACATGGCTTATTTATTGGACAGAAAACTGGCTT
-AAGTTCtgagataataggttccggcatcagatggctgaatctgactttgcccttcttggc
-tgtaagatcttgggcaagtcacctaatctcttggtgcctcagtttcctcatctgttagtg
-gacaagcaatcttacttcactgggtcatggtgagaattaaatgccgtaacataaagcacc
-taggacagtgtgtggcatacagtaaatgctcactaaatgagtgcttactcattACGTCAT
-AACTGCTTtttcatcctccactcattctgggaggcacgagtattttgagttccactttag
-agaggagccaattgatatatgtggcttccccgggttcccatagctttgagtggtacccct
-gggacttgacctcctgaccccaaCTTGGTCCTCCCCAGACCCCACAGCCAACTCTCAGGG
-TTCATTCCTGACATTTCAGAGCTGGCTCTGAGGTTATGCAAACAAACTGCGGCCAGAGTC
-TGACTGGAGGTGCAGGCTTAGGGGGCAGACCTGGGGCCCGTTTTCTAACATTTCCTGCCC
-AAGGAGAAGGAGAAGAAGGTCTGTGTACATCCCAGCCTGGCTGAGCTCTAAGGCCAGGGA
-GGAGAGAACTAGAAACATGTGGCCCTGCCCTCTGTGGGATGGCTGGCCAAGCCAGTTGAA
-CAAATAAACCCGTCCTTTTGGGGGAAGTCGTCAGGGGGTCTGCTGCTGCTGGTGCCTGCC
-CTGCACCCCCACCTCATCCCAGGCATGAGCCAGCTGGTCATCCCCAGGCCGAGGGTATCT
-GTGCCAGCTGTTTCCAGGCCCCCTTCTTGGAAAAATCATCCCATTCCTCTAAGAAGCAGA
-TGCTGTTTCCCCCATCCCCCAGTCCCAAACTGCTTAGAAAGGAGCCAGCAGTGAGGTTAG
-GAAATCAAACCCCAAGATATTTTGTTCGGCACCGAGACTCATTTCTTGTTTGGATAACTG
-AAGGCTGAAAATGCCAAGAATTTGTGGGCAGCCTGGGAAGGCTGGGGCAACTGGAACCCT
-GACTCCCAAACCAGGTCAGTTTGGGAGGGTCTCAGGCTGGGCAAGGACCCCACCCTGGGT
-TCCTCCTTGGTGCTCTCTTGACCCACACCCAGTTAGGCAGGGCCTCACAACTGCCAGGCC
-GAGGGGCCCAGTTATTCTGAGGTTTGATGTCAGAGACCTGGAGCAAACAGCAGAGGCTGG
-GGCAGTGCCAGGTTGGGAGGCCCCTGCCCAGCCCCTGACCCCTCTCTGCTTGGCTTTGGG
-TGCAGAGGAGGAAGAGAAAGAGGCCTCGGCTGAGCAGCCAGCTGCAGGGTGGGCATTGGT
-CATTTGGCAGATGTGCCCTGGGTCTTCAGTGTGGACACTCGGGGAGGTAGAGGTGGGAGG
-GATGGCCTTGGGGTGAGAAAAGGAGGAGCTGAGAAAGAGACAGGAAAAGATGCAGGGAGT
-CACTTTGATAGCCAACCAGGAGAGAGAATCAGAGACAGAGACACCCACAGAGTTAGCAAC
-AGTGAGTCAGGGCCACCGCGAGAGCCCCAGGAGAGATCCACAGAGGCAGAGAGACTCAGA
-AATAGAGACAGgctgaccacagtggctcgtgtccgccgtcccagctacttggaagactga
-ggcgggaggatcgcttgagctcaggagttcaaggctgcagtgagctgtgattgcaccatt
-gcaccccagtgtggttgagagagtcagaccttgtctttaggagagagacagagagaggga
-gagagggacagagagagggagagagagacagagagagggagaaagagacagagacagaca
-gagatagacagggagataggcagagagagGGCTGCCATGGACCCCAGGCCAGCAGCTGCT
-GGCTGCTCCCTAAAGGTGAGAAAGTAGTTCTCACCTGCAGTTTCCAGGTGGGGTCAGCCC
-TGCCTCTGGGAGCTCAGAGACTGGGGAAGATGTGCTGCCCTCAGGTGGTGGGGGTGGGCC
-AGAGAGGCTGGGGCTTGTGTCTGGCCCTGGTTTTcctcattctcctcatctgtataatgg
-atcattctgtggggccatgaagagaaggCAGAGTATGGCACTTCTTGGATGGGACACCTG
-GGGCAACTGGGGGAATGGCAGTCACACACGGGAGCCCttattgagcacctgctgtgtgca
-gaggctttctctgctctgcttctcttgaccccacatcaaaggtcaggggtaggtgctgtc
-attctcctcccagcctccggattaggcactgagAGGGAAGGGCCAGCACTGGGTCCTAGA
-GGGAGGGCATGGTGGACAGAGGAGGTCATGTGACTAGCCACTGAGCTGCCCAGCCCAGCT
-AGAGATGCCTGCACTGCAGCCGGCTCTGTCCCCCAACCTCCTCAATATTCCTGCCTGCAG
-CTTCTCATCCATATGAGCGGGGTGGAGCAGAGCCCAGAGCTGACGTGCAGCCCCAGGAGC
-TGGCTCCAGATGGGAGTTACTGGGGCAGGGGCTTTCCaggagcgaggaggaggagagaga
-gggaggcagaaggagggggagagcagggagaagaaagggaaggggagtgcaggggaggag
-gagagtatgaaagaggagagagagagaagaggtgaggCCGGGGCTCTCCCCATGCCTGAT
-GAGCACTGGCAGTAGGACACAGCAAGCTGTATGCTAGGAAAGAGTGCGTATCTGGGGACT
-TGGAAACTCTGCAGTAGAAGGGAGCACCAAGAGCATCCCATCCTCTCTAGATCTTGCTTC
-CCTTGCCTCCTTGACACCTTCCAgagtcaggaaaaagtacctgcagtttgtagtgagaat
-ccagattggctttcactgctacatggctctggcaagtcactttccctctctggcctgttt
-cctcacctgtacactgggggaacaggaGGGGAGTTGGGGGCACAGGCTGAGCAGATGATG
-GCTTCTGGGATTCGCGACAGGAAGGATCTCCCCTGTGTCTGTCTAGATGAACAGAATCTT
-GCTGAGAGCTTGTTCATCCCTAATGGCAatggtgatgatggtgatgatgatgctgatggt
-gCCATTAGATGAGTATTTTAAAACTCTTTTTTTAACTTTTCTGAGATGTTAGAGAAAAAG
-CCAAAAAAAGGCTTTGAGTTTCAGAAGATCTGAGATATGCCTGGACCAAGAGAAGAACCA
-GAGGAAGGTCACAGCCACAGCCACAGAAGGTAGCAAGCACTCCCCACTGGGGACCAGGAG
-TGTCAGAGGGGGCAGAGAGAAATTATTGTTTACATGAACCAAGGGAGACCGAAACCTGCT
-CATCTGTAGCCATTTGGTAAGGAAGTACCTGCAGCCAGGTCAGCTGAACTCCCATATCAG
-AGATCTTAGGCCCTACGGCACTCTACGGTGACCTGACTGACCCTAGCTCAGAATTTTCAG
-GCTAGGTGAATGGATGCCTGGAGAGGACATTCCACCCCAAGCTGAGGCACTGGACCAGGT
-GACCTTCTGATCCTGCAAGCCATCAGTTCAAGCCATCAGCTCTCAGCCAATGTTTCCCAA
-GCATCCGACACCCAGGGGATTCAAAGATGGATGAGAGTGAGAGGTGAGACTTGGGGTAGG
-AGGCCCAGTGGGAGGTGATGACAGCATCCTGGGAAAGATGACGAGGCCTAAGCCAGAAAG
-ATGGACCATGAGAGAAGCCTAGGCCACAGGATGGGCTGGGCCAGCTGCCTGGGGGATAGG
-TGGGAGCCACAGGAAGCCCCCAGGGCACAGCCTGTGGCTGGGTGGTGGTGTCACCCTAAA
-CAGAGACAGACAGGCAGGAGGAGGGTGTTTGGAGAAGAGCAGGGAGTCGTCTCAGGCAGC
-TTTGGAGTTGAGACACCCATGGACCCTCAGGGAGGTGTTGGGGGAGATCCAGGTCATGGG
-TTTTGGGCTCAGGATCCCATCAATGCCAATTTTGTGTCATCACGGAGCAGGATGGAGACC
-TGGGACCTGAGAGATTGGAAGGACATTTATGCATTCATGCattcactcatgctacagaca
-tttattgagtacctactgtgtgttcggcactattctaggccctgggaacccagaagtgag
-caaaagagacatggcgcctgccctctgggagctcacacaccaaaagaaatgtttttaaga
-acattaggtagggataagttctaagaaaaaaaaacacaacaaagccagcagagggacaaa
-gggtggaagaggaaggtggttatttcgtacggggaggacaaggagggcctctggggagat
-ggcgctggagaggataggaggctggggtaagcaaagtgggagtctgggagagggaactcc
-agggagtaagggttcttgcttttattcggatgcatggttagccctgggaggagggagagg
-atgtaacttaggttttgatggggattctttggtctgctgcatggagaacaggaggtgggg
-gccgagtgttagcagggagccaggggggcagccaggacagctatcctgcctggagccaga
-ggtggttGTCAAGCTTGTCTGCTGTTTAATACCTTCTAAAACTCCAGGAATTAGTTCGCA
-TCCTTCATTCCTCAGTCATCGCCCAGACTGTCTCCTGGGTCCCTCTCCCTTTCCTTGGTA
-GCTCTCACTTAGGGACTCTGAAGAGTCCCATCTCAGACCCCCCAGGATGTCTCCTGTACC
-CTCATGCCCCGCCAGGGCCAAGCCTGCTTTGCACACCTCTGTAGTCAGTGCTTCTCCGAG
-GGTACACAATAGGTGCTCACACTGCTGAAAGACGAAAGCATGACAGGGCATTCTACAGCA
-GCCCTGGTcttgggccaaaaccacagtggcatcctcagctccttgcttcctcccactccg
-catccaattcaccagcagagctgatgggctctacctccagaacccaccagaatcttactg
-gccacaccccctcctagccccgttctgctccaggcctccggtaccttgcacctgatggct
-gcagcggccacctctttgggcttcttccttccaccctgcctcctacagtctatgctgttg
-aaatcgaatcacgggtgtctgtctctgctcacaaccttgcagtggctcccatgacactca
-gaacaaaagctgaagtccttccagtggccccccccccagctgcatggcctgccctgctgt
-cacctctcagacctccccgcacccttgctccctctcctctgctccagctacacaggcctt
-cgccccatggttctccaggcacacaccgctgcggatgcattccctcctcacggtcaaaat
-acatgcagctccctttgcagaacgttccctcaaatacctgcctggcccactctatcattt
-cccttgttctctgggttcaaatgtcacctcctctgagaagtactctctaatgatctgacc
-tcaagcagccacccagggccgccacttgccctctttcttcttcattttgcttcaccatct
-gacatagtagattatctcttactgcctctttcccctactagtccagagggagacatacta
-tactgtcgtatccccagcacccaggaaggcttggtccgttcagcccttggtcagggctga
-atggatttctgttggatgaatgaaGGGACGGCAGTTAAAGAGCCAGGTTGCCAGCTGACA
-TTGCCCAATCTTGCTGTGTGGCCTCAGACCCACCCCTGCCCCTCTTTGTGCAGCTCAGAG
-ACAGCCCTCTGTGCTCAGGGAAGGCCTCTTGGATGGACACTCCACCTGCTGATTGTGACA
-GACCCCAAAGCCGCCCTCTGCCCCCTGCAAACCTCCCATGCCCCGTACCTTCTTCAGCCA
-CTGCGTGTTGTTCTGCAGTGCCTGCTCCAGCTGTTTCACCTGCTGGGTGGGCAACTTCCC
-CAGGTGCAGTGGGTTGGCCAGTGATTCTCTCTGGAGGGTGTTGGAGTCCCTGGAGACCTC
-AGGCCCCGGAGGGCAGGGCTCAGACTTGGGCAGCAAGAAGGTGTAGCTACAGTGGCCGTG
-CTGGACTACAAGTGTCTCGCAGCCCCTATCCGCCTCCTGCCTTGTCTGTTGAGCCACAGA
-CATGGTGGCAACCACAAGGAGGAGGCTGCCCTGCAGCATGGCTAGCTGGGAGAGCATCTG
-AAGATGTGTCAATGGCGAGGGATGTCTGCTCAGAGCCCTAGGGGCTGTGCCTGGGATGTC
-CTGCTGCAGCCAACAGTGGCCAGGCTTGCCTGCAGCTGCAGCTACAAACCTCTGTCTGGC
-CGAGCTCTGTCCAGGCAGCTATTTATACTTGCTCTGAATACCACGGCTGCTCTGCTTGCT
-TCCTCTCACCGCCTCCCTCCGGCCCCACCCGACACCCTCTCACCTCTATTCTTCACTCCT
-TCCCTTCCTCCTTCCTCAGTCTTGGTGGCACGTCGCCCTTACCCTAAGCGTGCACCAACC
-TTGCTCTGTCTGCCTCACCTCTGAGCCCTCTGATTATCCAGTGAGGCCTGGCTTCCCTGC
-TGGAGGGGAGGGAAGAAAACAGcacacagacacgcgcacacactcatgcacacactcacg
-agcacacactcacacgcacgctgacacgcacacacattcatgtacacacaAACGCCAAGC
-TCCAATGCTGCCCGCTTTGGAAAACCAAATGCAACTTAACTCTCCCTTCCTGTCTCTGTC
-TTGGTCTCCCTCTTTCCCTCCACCCCCATCCCCTGCCCCCCAAGTCTAAGATCTCAAGTT
-TCAGTCCCGCTGCCATCCCCTTCTCTCCCCGCTGCACCTTCCTCCCTCTGGTTCCATGTT
-AGCGCTTGGAGTACAAGTGACCCCCGGAGAGAGCAGAGGGAGGGGAGGAGGCAGAGGGGT
-GAGGCTGGGGAGGGCCCAGCGAATCCACTTTGCCTCTGGAGACACAGAAAATCCTTCCAA
-GGTGGGGCAAGTGAGCAACCCAGCTGGGAGTTGCTTCCTGTCCTCTCTTCTCCCTCAGGG
-CCAGGGGAAAGTGGTATGCCCCAGGATGGCCCTGGCTTGGTTGCTTGTAACAGTAATGAG
-AAGTTGTCATGTCCTGGGGCAGATTGTCCTGGGGCTGCTGGAGTGGGGATGTGGAGAGGA
-Ggcagtggggagaggaggttggagtgccaggaggctaaccctagatctcgctccccgaca
-gctggccacgagacctagggtgggcagctgtgcctctctgggcctccacaccctgatctg
-taaactgggtaaaccttatctcttgcaggAGGAATGCGTGTGAGTCCTCAGCATGGGGAT
-GGAGAAGTTTTCAGCTTctgggttcaaatcctggctctaccatctaccagctgtatgact
-ttgagtaagtcacttaacctctctgtgccttcatttcctcctgaatgaggaaaataatac
-cacctacttcacatggcatgaaaattaggtgagttagagcaaggttggcacagagcgagc
-actaaataaatattTTCCGTTGTCAATgttatagttgtcattgcacctcccctcccacga
-cccactggagcataaactcctctagggcagggatttgtcCCTGGGGGACATGGTCTCCAG
-GCAGAAGGTGCCCAGGAGTTGGTGGGGCCTTTCCTGCATGGGCTGCCTTTATGTTCTGCC
-AGCTGTTTGGGCTTTTCCTCTCTCCCTGCTTGTTTCCTCAGAGTAGGGGCCAGTCTGGCT
-GTTTAGTATTTTCCTTTTTGTTCTCTCAAATCCCGATAGAGTTTTGAATTGGGGCAGGCT
-GCTTCTGGGCAGCTGTGAACTGTGGTCTCATCTGGGGACTGAGAACATTATACCAGGTGT
-GGGGCTTTTGCAGGCAAAGGAAAAGCAGCTGGTTATCAGCCTCCAGCCTCCCCTGAGCCT
-TCCCACATGCTCTGAGCTCTGCGTGCCCCGCTTGGCCCCAGTTGCCTCAGCTGTAAATGG
-GGTCATAGCACCCTGACCATGTGAGAGTAATGTGGACTGATAGCTTATCACAGCTCTGGG
-TGCAGAGAAGGGCAGTGTGAATGGTGGTCGTCATTATGATTGTCTTGACTGAGCTGCTTG
-ATAATCCCAACGAGgcagttacaccaggccccaagcttagatgggccccatgcttggttt
-acactctgccagcactgtcttgaaattcttaatacatttggaacaaagtactcagcactt
-gcattcttcattgagttccacaaattaggtagcaggccctgCCTGGGAAACATGAGGCTT
-CCCTCATCCCTCACTCTGCTCCTGACCTTACCATCCAATCAGACCTGTTCTTCCAACATG
-ATCCTTTAGATATTTCCCCCTCTGTCACCTCTTCACTACTCAGAATGCtggagccagcac
-atctggatcggaatcttggctttcctgaccccctatttgtgtgccttttgccaagttgcc
-taacctgtctctcagtttcctcttctgtcaaaatagtgatgttacagtggctaaaagacc
-gattcctgcagtgaggttaacacagagcctttcacataatacatgctcaaccagtgacag
-ctgtcatcattACTCCCtgctatgatatgaatgtttgtgtgcccccaaattgatctattg
-aaacttagtcaacaaggtgatggtattagaaggtggggcctttgggagtgaatagctcgt
-gaggactctgccttgggaatgagattaacgctcctatcaaacatgtcctagacagctggc
-cttcccttttgctaggtgacgttgcagtaagaaagcaccgtctatgaagcagggagctct
-caccagacaccagatcggctggtgccttgatcttggaattcccagcctccagaactgtga
-gaaataagtttctgttgtttataagccccccagcttagtgcattttgttatagcaacctg
-aatgggctaagacaCCCCACCATCACTCTCTTAGACCGGGGTGCTTCCTCTCTTGTAGGG
-AGAACAACAGCCTCAGAAGTGAACTCTGGTTAATTGGCCTTTGCTATTGCAACCAGAGTG
-Accttccttccttccttccttccttttttctttctttctttccttcttctctttctttct
-ttctttctccttttttttgacagagtcttgctctgttgtccaggctatagtgcagtggca
-tgatcttggctcactgcaacctccatctccccggttcgcgtgattctcctgcctcagctt
-ccccagtagctgggattacaggcatacgccaccatgcccaactaatttttgtatttttag
-tagagacggtgtttcactatgttgcccaggctggtctcaaactcctgacctcaggtgatc
-cacgcacctcggcctcccaaagttctaggattgcaggtgtgagtcaccatgcccagccca
-gagtgatttttctaagacacaatccagccctgacttctttgtttaaaattcttcagtttt
-gaactccaactctttctgtggtttacaagcccctgccggatgtggcctccattctcatca
-ctgtttccctggcactttataccttatcattTGGAATTGGTTTTACTCCCCCGCATGCTT
-TCCGCCTTCTGAGGCCTCAGTGTCTATGCTCCTAGCAGGAAACTtctgcttaaaaacttc
-cccccacctgtattgtcccagcttcgttctgcctgtcttttgatcttatctcagggatca
-cctcctctgggaaggctttctgcatctgtccctcccacttcaatgggagtaggccttctg
-cctctgggagctcaaaggcccctgcctgcctgtccctcaccaaagcactcatcctgcatt
-agaaaggcttgtttgcaggccttggtcaccgtctagactgaacactcttctaggtttgct
-gtcacactttccatttctgtgtttgttgcctgtcctaaggttaggctcacagtgggtcct
-catgagtgttatgttgaatgaatAGGAGCTGCAGGCCCAAAGCAGAGAGGAAGGCAGTCC
-CCTTTCCTCTCCAGCAGGGGCAGCAGGAAGTTCTGTGTGAGTTGTTCTGAGTGTCTGGCC
-TCCAAATCCTAAAAACAAACCAACCCATGTTGATTTTCCCATTGTCTGCTGCTACCATGG
-AGGTAGAGAACGGAGAATAAACTTATATCCACCTGGATACTTTGGCTTTTGTtcaaatag
-cttgggtaaaaagggaatttattggccaatttaactgaaaattttaggggtatcgagctt
-caggcatggctggatccaggtgctcaaatgatattagattttttttttttcctccaactc
-caggctcttattttccttcatttccttattttcctttgggttcattctgtaagagttccc
-accataatcaccaccactactggcaacagcagctccaatctatcaactcagtaacctctt
-ttaagagtgcctctttcctaatagttcttggaaaagttccagcttgagccgtacagtcat
-tcctgaaccaactattatagccagaggaaggagctactgtggatggtcaggctggatcct
-gtgtccaggcctggagccttggagcaggtcaacctcacaggatcggaagggactaagggt
-ggggtacagtgacgctcaagaaaacctggagtagaatgatcaggaggcgggtggagttgt
-tgggcaTAAAGCACCTGCCTGCCTGCACCCTGACTCTCCATCCCGCCACCCACCAAGTGA
-ACCCACCTCCCGCtcagagctgatggactcttggagtaactagagatgccatggaccctt
-accttgcatttcactcatgaggaaactgatactcagagagggaggccacttgcccagtgt
-tacaTGCTGGAATCTATTTTCCTGGAAGAACAGAACTTCCTGCTCCTAGGAGTGAAGGGT
-GGGAAAACAGGGTCATTCCGGGAGGACCACTTGCCAATTTGGGGTCCTGAAGTACCTGGA
-TCCAAAAGAAGAAGACTGTCCCCAGTCTGAATCTCCCACTCTGGGGAGAGGGTCACTCCT
-GGGTTGTTCCCACAATCCAGCCCTTCTGCCAGCCCCTCCCTTGGCAACTCCTTGCATTTC
-AACACCCTGGATGATCATTGAGGGTTGCACGTGGGGCAGCTGAAACAGACCCCAGGCCTC
-TGGTCCTGTGCTGCTCATGCCCCTGAGGACACTGCCTGGGCATCTCCCAGAGCTACTGAT
-GGCAACATGGCAAGAGCCTGGTGGGAAGCTGTGGGGCCATCGACAACCCCGGGGGATGGT
-CTGTGTGTCCTCAGAAGGTCTGGTGGTGAATCTTGTGCAGCAGACATCATGGTGGCCCCG
-TGAGCCTTTCCACCCAAGACAGAAGTCGGTTGACTGCCCTCCTCCACTTTCTACCAACCC
-AGACCTAGAGCCAAACAGAATTCCTGGATCACAAGGGGCCTAGGGTGGGTTTTGAGGTCA
-CCCTGTGACCCAGGCCCAGCTGTTAAGAGCCCCACATTCCTGATGCTCAATCTTGACTTC
-CCTTCAGTAGAtgagactcagtttcctcatctataacatggagaaaataatccctcactg
-ggaaggcggtggtgGTGGGGTCttccagttactgatactgtgtaacaaagtatccccaca
-tctagtggtttaaagcagtggcaacatctactttactcacaaatctgcaattgtggccag
-gttccctgggaaaagctcaactgtgctccattccgtgtcagctggagcaacttgcaggct
-ggggtttgcatccaaaactcatccactcacatatctgaaacctcagctggggcactcagc
-aaggacaactgcatatggcctcttcatgtggctaggggcttcctcatggcatggtggctg
-cttcccagagcaagcatctcaggagagagatttgggcagaaggtaggtgatctttatgac
-ctagcctcatggatcatgcagggccaagtcctctgtatctagtcaaagaagcaaccacaa
-agtcccactcaagttccaggggaggaagaacagactctacctcttgatgaggaggatcaa
-ggtttcagaagaaggtataggatgggggatagtgttgtggccatttttatttatttattt
-tgtttatttttaaatttttatttatttatttatttttgagaaagagtctccctctgttgc
-ccaggctggagggcagtggtgtgatctcagctcactctaacctctgcctcccgggttcaa
-gcaatgcccgtgcctcagcctcccaagtagttgggattacaggcacatgccaccaagtct
-ggctaatttttgtatttttagtagagacagggtttcaccgcattggccaggctggtctcg
-aactcctgacctcaagtgatccacctgcctcggcctcccaaagtgctggggttacaggta
-tgagccatagtgaccggccTGTTATGGCCATTTTTAGAAAATACAACTGGCCATGGGAGG
-GTCGGATGAGAAAATGCCATTTAAGTGTTTAGCATGTAAGTGCTTGATAGTTGGTAGCTG
-TTATTATTATCTTTGCGATTATTGGAAAGACCCAGCATCTCTTTGCATAAAAATATCCTT
-CAGAACCTGTGAGAGCTAAAGGTGCAGGAGGAAGCAGGATAATTTCCATCAGGGCTGCTG
-GAGAAATTGGCCCAGAAACCCACTGGATTTGTCCCAAGTCACCCAGTGTATCAGCAGCAC
-CCAGTCTGAGCAAGACTGGCCTGGGACATAGCTGCTTCTTCTGTTAGTAACGCTGTTACT
-ACTTCCTGGGGTATCTTCCTTGGCCTCAGCTTCCTCTCTGAACCATGAGAGCATCCTGGC
-TCTGCCTCCTCAGAGGCTGAGGGGATAAGGGCGGAGGACATGCATTCTCTTGGCTGTGCC
-CAGTCTGGGCCACCAGCCATGCCTGTTCTTTCTCAGGCCTGGGGAGCTCGGTTGCCTCTG
-AACCCACATCTGGCACTCCCTCCAGGATATGAAGAATAAGCCTGCCAGGTCAGAGGGCAG
-ATCTATTTTGGAACCTGGGACCCCATAAAGACCCAGAGGACCCTGTGACCGAGAAAACCA
-ACAGGCCCCTCTGTGttttgttttcattaaacaagcacaacatgtccctcatagaaaagc
-cagaaaatacatattggcaagaaagcgaaaataaatgttgcctgtgctctcaccagccag
-aggcaaaaaccatagctaacattttggagttttttccccccaaataattttcctctgcat
-atagatgcatattttttttggtagattttctagcaaaAAAAAAAAAAAATCAACAAACAA
-AGGAATATTGTCTCAACAATTTTTTAATTTTCTTTTACTTACTTTGGATTTTTCTTCTGG
-AAAAAAATTTAGAgccaggcacggtggctcatgcttggaatcccagcactttgggaggcc
-gaggtgggaggatcgcttgagctcaggagttcgagaccattctggccaacatggcaaaac
-cctgtctcttaaaaaaaaaaTACTGAAATCTCCAGACTTCCAATTGGAATTTATGTTggc
-cgggtgtggtggctcatgtctgtaatcccagcactttgggaggccgaggcaggtggatct
-attgaagccaggagttcaagaccagcctggccaacatggtgcaaccctatctctactaaa
-aatacaaaattagccaggcttggtggtacacgcctataatcccagcgactcagaagactg
-agacacgagaaatgcttgagcccaggaggcggaggttgcagtgagccgagatcatgccat
-tgcactccagcctgggagacagagggaaactatttctcaaaaaaaaaaaaaaaaaaaTCA
-GACAAGTGCACAGGATAACAAAATACACCCCCATATAGTCATCACTCCAAGTGGGCCCAT
-GTTAACATTTTGCATATTTGTCTTCGATTGTTAAAACAATGAAATATTACAGGAAATGTC
-AGTATTCCTTATAACTCCTTCTTGGTCTCATTTTCTCTCCCACCCTGCCCataggttcat
-atctaggtatataaataatgtataatatttttgtgttctcaaaacttaagtatatgctgt
-tatactgaatgcgacgtcctgcttatattatattttccagattgatataaatgacacata
-tagatcttgtgaccaaggacattttcttttcactgctgtgcagcattgcattatgtaatt
-tttaactctttatccagtttttggcagatggatatttaaattaattcagttatcttgtta
-ttcctgacaatactgctattaccatcttatatgggaatacttgtgcttacaagcaagggc
-tcctctggggaactaatccaggcatgctcctcctgggtcgtggaatatatgtgctgccag
-cctgaggcagttgccaaattgtgctccaagtctctctgtcgagttaattccagtagggtg
-ccggggtctccatcgctccgcacccctgccatcccttgagatggtcatgctttacctttg
-ttccaatctgatggctgtgaaatcgtacatgtaattacatagcctgctttccctacttaa
-tagtatattacggaactattttcctgtgcagaatattgttctatatgtgggtgtttcaag
-gtggcataagctgaaagcctccattggggtgttgctgggattttcttaaccaattcccta
-ttgttggacaacagggtttgtttTtgtggtaggattgcaaaactgaccacagatgctacc
-cacccctataagcatgctcctttgcagtgtgactctgcagttctccctattaagaggcaa
-agttcacttctccactcccttaatgctgacttgggccatgtgacttgctttggccaatgg
-gacattttcaagcagaggcttgaaaagggcttgtgctctggggcttgctctcttgctgca
-cctggggccctgagaccaccatgtgaatgagtcctggctagcctgagggatgatgagaca
-cacttggccaagtcatcctgtcatcccagctgatactaaaccatccaccagatttgtgag
-tgaggccatcctagaccatctatctagcccagccaaactggtgcggaccagaagcaaagt
-ccagttggcctgcagagatgtgaaaaataaatgttttaagccactaaattttagaggtgg
-tctgttagacagcaagcctgatacaGTTCCACCCAGCATTTtctttgctcaaccagttac
-tggctgggaaccttgggcaagttgctgagccttagttttctcctcagtacaatgggggat
-tacatacgcactcctcaaagtcgttgtgaagattggatgagatggcacctgtCAGTATCA
-CATGGCGGGGACCCCATAACCAGGGGTTCCTCTTTCACATCACGGTGGTCTTAGATGTGA
-CCTGTGACCTTTCTTATTGCTTCTTGGTTCTCCCTGCTGCCTCTTTCTCAAAAATGTACT
-CATCCTTCCAAGTTTTCTGGAGAGTATCAACATGTAAGTGTAAATCACAATCCCTAGTGC
-TCTCCAAGACTTGCAGGTATCTCCTCCTTCCAGGGCCTTCCCTCTTGAAATTAGGCATAG
-Tggctgtgtgcagtggctcatgcctgtaatacaagcactttgggaggccgaagcaggccg
-atcccatgaggccaggagttggagatcagcctggccaacagggcgaaactttgtctctac
-taaaaatacaaaaattcaccgagcgtggtggtgcatgcctgtaatcccagctactcagga
-ggcggaggcatgagaatcgcttgagtctgggaggcggaggtttcagtgagccaagatggc
-accactgcactccacactccagcaagacccggtctcaaaaaaaaaaaaaaagtaaggaaa
-agaaaaAGAAAAGaaaaggagtctccatccagaccccaagagagggtttcgtggatcttg
-cacaggaaagaattcaaggtgagttgcagagtgcactgagaagagatagtttattgaaag
-ctactcagttacagagaaggatgtcctcagaaagcaagaggaagaacgcactgtctttgt
-tttaaactcttctaatgtaggagtcttatctaagtaaaagctaagttatgtctttgtgca
-gacagaccgacagtgtgacagaatccattaccgttgacttaaagaaagttatccttggca
-ttttagtaagtacatcagatcacgacagtaattgttttgaaagcataaattgttatgtga
-tattggaacatctgggcattttgctgtcgtaagagtttactcttgcaggcattattgagc
-agcttccttagccataaacatcttatgactgtgggctgtgattagcaaggaatgtgtctt
-gctagttttaagatagagttgattttaaaatggtgtcaccctagctctcctatgctcctg
-tttcccaaacaTAAtcccccctctacttaagagagaaccctaaatcttaaggggagatga
-aaggtgaaggtcatttttctgtaacttattcctgctgacagtggACGTTGTTGACCTTTG
-GGAGAGAGTTCTCTCATAAGAGTTTGCAGAGAGCCTTGTAGGGAGCCGGGGAAACTCTTC
-ACTTGAATGACATCCCGATGATTTGGTTTAGTAAGTGTAGGGGCAGATAAGCTGCCAGAC
-TATTttatctccgtaatcccatgcaataagtgcaacagaagtaaaaagcacaataaccaa
-tagcaataagtgtgacaacacgaagcatgctaaaaaggaatgccttccaagtgctgggga
-gctggccaaactgtgctgttatgacaggaagtcaattgctgaggtatgagtctctaggga
-gttcatggcctgagatatattatgagagtgaccaggaatatagacacagtgttcagtctt
-gatcaatgcacagattttcccagggctgctgttaatatgtttaaagccatatggctttgt
-aaggacatttgtcttattcgggacgtttcttctgtcagacgggtgatcaccagatgagtg
-ttgttgaaagccacagcagtatgttttgctagggctcccacctgcgattcaacgtctata
-gatgttgcttaaagacagaatatgggcacaggatataaccaccaaaaagtttgtttctgt
-tgcctatcacagaccttgactacttcccagttggtggagagggaatccagatgtgtaagg
-atacatcctagaaggtagggatgaccccaagtgcatcatccagtcaaattgtaaggtgag
-tatggccaactatgagacccacatgcccataaccattcccaaggggaaggatagtcacct
-aaccatagagattcattttgccatcccatccacatttggtcaattgaaaggagagtctga
-ttgcattgttggggtggcagccatccgatactatagatgttggtttgggggtggttactg
-ttgatgaaaagagtcgaactctgtaaaatatttgaagagacttattctgagccaaatatg
-agtgaccatggcctgtgacacagccgtcaggaggtcctgagaacatgtgcccaaggtggt
-tggggcacagcttgattttatacattttagggaggcatgagacatcaatcaaatacattt
-aagaagtacattgatttagttcagaaaggcgggacaactcaaagcggtggggggaaggag
-aggcttccaggctataggtgaacttaaacattttctggttgacaattggttgagtttgtc
-taaagacctacgatcaatagaaaggaaatgtttaggttaagataaaagattgtggagacc
-aaggttcttttgaagtctcatagtagctgccctcagggacaatagatgacaaatatttcc
-tatttagacctttaaaaaggtgctagactcttacttaacctcttcaggattgggagggcc
-tggaagaaaaagatgtagctatgttaatagagattctttacagatgcacatttgtcccca
-caaaggacagctttgcaagaccatttcaaaatatagcaaagaaacatgttttcgggtaaa
-atattttaattttcttccttgtctcataacattatgccagggtcaggtcggaaagtaagt
-cacaatatgtagggttaaataaaacccatctgaggagaatttatggtttgtagggcatga
-ctcccagaccccttagataggaatttggacaagaaaaaaaaaaatcagagcctagtcctc
-ataaccattatgccttccaaggcataagggtactttgcctgataactgaatttggatacc
-tgtcaaccaactgagtccatcatgtatggtatagcctaaggtagggatgctattaagtta
-tttGGGATTAAATGAAGAAGGAATTTCTTGGTTTCGGTGGAGGAAGGGAAGAAAGAGTGG
-TGTGTGTCCTTTTGGAAAAAGGAGAGTACATATTTTCTGTACTCAAATTAGCTGATTGGA
-TATGCCAAGGTAAGCCCGAGGTTGACAAAGTTTGTACCCATTCTGCAAACAGATATCCTC
-CAACTCTATAATAGAGCAAGCTCAACATTAAAACCAGTGGTCTTATTTTCAGAGCATCAC
-TTATCCACTGGATAgctttttctggaagagaagccgtagatccactattggctcacagga
-gtattctggaatggtgatccctgcaccagatgcctgtgggacttcatgagagacaggttt
-aacttgggataaatgtacccaaatatgtaatcccttaagtttaactgtagtaggagtgcc
-tggaagtacatggtagggctctttctattttggggaaagctgatctgcaggggatccctc
-cttccaaggtttcaatagcatgaaatctcctggTCAAacaggagagaatatttatgaaga
-tggtcctgacacatgtatactgaacaaacatgcatgtaacatatgactctgttcacctta
-aggtggagacttaatccttgccaggcatggtcttagatcctgtttataatttgaaatctt
-cttgctataaagtttctattctatcagtcttatgatctctgttttaatgttaatgctggt
-tggttgtgcccgaattccaagagggagaattgtacagcaaggtgtgtttgaccccccagt
-ccctcttcccatcatggccagaaccagttgttcaggatttttaaaaaattattatttcct
-tttgccaagagagaggtccattctgttgggtggcttaggatatttgtttatttattagtt
-taGTTTATGGTATcccattttgtcgaggtgccagaggcagtattgaaggctaagctttta
-ttgtgtcccatatcaatgctggggtggtgtcctacttgccctggtccattacctcccttg
-gtggaacacttatggtcaaggaacttagagtcaaaagacttatagccaatcaaatgttct
-aggccagatgggaatggaggtgagcaggcactcattaaccttaaagcctctttaagcaac
-ataagagccaaaaatcaaaagccagaaggcaaggtataaaattggcttatttagaaattc
-tatgcaagagctactataatcttggtttgtggcaattagctatacaaactcaagaattat
-gtttagctatttagggatctgtgtgcctgtccttgatttggagtgtcagaattaatttta
-ttcctcaaaactggcccttacaatctcatgtgatagtccctgggcatggaggaattgaat
-agtttcaAATTTTGGAGGTAAAACAAAACATAAGGCATTAACAACATTTTAAACAAAAGG
-TCATAAGCCCTGCCTAGTTTTGAGAGTGACAGGAAAGGAAGTTCACAGGTAGCTAAACAT
-TTAAATTATTTAGTATCAAGACATAGAATAAATTATATTATTTCAGATAAAGGCAAAATT
-ATTAAATGAGTCTTAATGTTTTTGAATACAGGActgcctctgtgtcttatggaagcagtt
-tattttgattgtcacttttgtctaggtctaaagatgagactttggtcaacttgagtttgg
-tgtcagatactggcagaagtcagtgccttcttcttttttgggacagagtctcactctgtc
-acccaggctggagtgcagtggcatgatcctggctcactgcaacctccacttaccagcttt
-aagcaattctcatgtctcagccacgcaagcagctgggattacagatgtgcacgtaccacc
-acacctggctgatttttgtatttttagtagaaatagggtttcaccacgttggccaggctg
-gtctcaaactcctggcctcaagtgatctgtctgcctcagcctcccaaagtgataggatta
-taggcatgagacactgtgcctggcagtcagtgccttccttagatgagatattggacccag
-aagtcaaagccctgtaacttaacagcacaaggattagttaatagCACCTGATAAGGATAC
-TTTTGAGGGGGATAGAGTGAGCCCTTTAATTGATGTTCTTCCAATATATGTAATTATCAG
-GCTGGAGGTGGTGATCCTGGAGTTCATGGTCTGACTGGAAGCTGTGAAGACTTACAATCT
-TCAGTGCTTAATTTTTATGGCTTTAGTAAGCCCCAGCAATATGACtaagtcagagactta
-atttaggattttgattttgaagatgtttgttaaagatgttaaaaggctcaaaacatttga
-tcaaaacagaagcacagatcatggtaaaatagcatttactcatttacccaaagtgatcat
-cgaaatactttaaaggcaatacagaaggttacatggatgtaaaaaccttaacccttttaa
-aatctcagtttctttagcaatgaaaaacctaataaagacagcatagaaattatcttgata
-atacataaaatctcagttttttaagccatctactaaaaaagcaaaaaagccctactgcat
-tgtgactacttttacttattggaagctcatttagataaccaggaagtcaaacttgatgaa
-aaaagtgcttgaatttaatcagacacaggaagactgttttcaaggttatgaatatagcag
-gggaatacacgactcctaggaacagcatgagaagttttctgattgcatcaaaaatttaga
-catatcaagaaaagccagtgtacagaatgcagttatactagaggaaaacattgcttttct
-agacctccaagatgcaatatgttagcatttggccataataacagttagaaccagagcagg
-gagaaagttatagaagctgacagaaaaattaaaggagagagttgttatctcaagcattct
-caaagggagaaacagctgaaagctgtttttttcaacagcacagcaacagttgaacttttg
-agatatgattctgagaagttttaaaaagaaaaaggttataaaattaaaggtaagatttcc
-tataatttatttaaagagcatatcaatatcttaagaaaaccttgttttgatgtaagggac
-caatttttagacaaattattataaataatttttttataactaatgatatgcaaaatccct
-tttacaaattcccctttatgacttacatagaccatctacgacatgcttggactctctgac
-ttgtcctgaacttccctctttgctaaacaatcagtcattttactttaggacaaaaattta
-ccatataagactctttttcatataaaattattctcttttctttataacctttcttaccat
-aaatacatcttcatatttataactttctttacatctctctctctcccctacctactggtc
-cctttctaccttgtttcataagtaaacattttcaagttcgtaatttgaattgaccttcaa
-ttcagataacttctgaattagacaaaattatttttttctcagtaatactagatcttGGCA
-GGCTTTTGGCCTCTAACATCACCCAGAGAGAAGCCAAATTAAACAACCTAAGAAGCAAAA
-ATCATCAAGACCAGAAGGAAAATGTTAAGTGTAAACTTCAAAGCATGTGAGCGTAGGGCG
-ACATGTGTCACTACTGAGGCACAGACAGCAAATATGTAGTCATCAAAAGGGACAAGGGGA
-TCAAGAAGCAGTAGGTGCTGGAAAATATCCCTCTGAGCCTCAAACAGTTTATGCATCAGG
-GTGACACTGCAACCCTGGGCCCCTAATGGCAGAAAAACGCCACACAACAGGGTGGCAGCT
-GACCAGAAGGATCCCACAACTCCAGGCTCCCTAGCAGACACAGCCCAAAGGATCCAACAA
-CTCTGAGTGGGGGGCTCCAACCCCTGGGCCCTGAGAATATAAAGGAACATGAGTGTCCCT
-GTGTCTCCTGGGGCTCAGAAGGCTAGGCTGAAAAGTGACAACAAAGGGAAGGGCACTCAC
-CTGCCTGTGAATCCaaaactggaaaaagcaagaaatcctgagctgtttgtcagatgttag
-cattttatagataaagccattctataattttagaaacatgctttcccatatcataaactt
-ttcttaattggaaataacccagacatctgatgagtaatctaaggaaagctgtggaccaaa
-attttgggtaaagtggtctttatggaagttaaaaaaaaaaagatttaaaaaaagatttaa
-agattttttttttaaaGCCTggctgggcatgatggctcctgcctgtaatcccagcacttt
-gggaggccgaggcaggtggatctcttgagaccaggaatttgagagcagtatggggaacat
-agtgagactctgtctctataaaaaattaaaaaaattagctgggtgtggtggtgtgcacct
-gtggtcccgaatacttgggaggctgaggtaggaggatcacttgagcccaggaggttgagg
-ctgcagtgagctgtgattgtgccaccgcattccagcttgggtgacaaagcaaaaccctgt
-ctaaaaaaaaagagaaataaagaataaataaaaGAATACATGAaattaaattttaaaaaa
-gccttttccactttttttccttcagtgtcaaatgaacttctaatgtttccatttcatcta
-gaactgactgaactgcgttaagaaaaataaaatctccaagtagacttgaattagtaatac
-ataaacagtgagtcttatctcaacaccagcagcttaataacagcagatttaaagcaggca
-gaaaagaaaagggagaaatagataagagagctttagaagCAATAATCAGAGGCAAGCATG
-GAAAGTGAAAGTAGCAAACTTCTGGGCTGGCCATACAGAGCTGTCATAAGCCTGCAGTAA
-AGCAAAGGTAACAAGCTGGGAAACGATGAGAATTACAGCATTCCCATACCTGGCAAAGGG
-GACAATATGGATTAGTTCATAGCAAACATCTTGCAAAGCTACTTCCATTTTTCCAAATAT
-ACCCCAGGGGCTCTAACCCCATGGGTCTTTGGGCCTCTGATCTGAGTATTATACCCCAGG
-GCCTCCAACCCTGTGAGTTGGGCCTCTGACTCCATGGGCCAGGCCTCTAGCCTGAGTTTC
-TAGGCAAGTGTCCTTGCCTAAGCCTGACATAGTACACCaagatggacctcacttaccaga
-agcggccaattggtgctgcagactgaatttcttttgcatagggtctcgtcttatgcttcc
-ttcatggtcgctaggaagatgttgccagaaaaggggccatgattcaaaccttaaaaaagg
-gttcttaggcctcacacaagatggaagtcaaggcgagtctcaaagtgcattgagaacaga
-tagtttattgaaagctactcagttacagagaagggtgttctcagaaagcaagaggaggaa
-cacattgtctttgttttaaactcttcttatatatgagtcttattcatgtaaaagctaagc
-tatttctatgtgagtggactgacagtgtgacaaaatccatgactctgttgatttaaagaa
-agttatccttggcattttaatgtgtaagtacaccaaagcatgactataattattttaaaa
-gcacacattgttatgtgacatggaaacatctggacattttgctgtctaggagtttgtcct
-tgcaggtattattaagtggcttccttagctgtgaatatcttatgatcatgggttgtgatt
-gggaaggaatgtgccttgctaactttaagatagagttgattttaaaatggcatcaccctg
-gctctcctatgcttctgtttccctaacaAAGGAATGCCCCTTCCCTCCACACCCCAAGCC
-CCAACCAGCGGGACCTGGAGGTAGGGAAGACAGCATGGGAAGCCCAGCCTGGATTGGAAG
-CAGCAAACATTTGACCATCCCAGCCACAGGGCATGCCTACCCTCTTCTCTCCCTGGACCC
-TGGCCTCGCCTACCGTGGCCATCCTGCTCCCACACTAATCAGAAACTTTCCCCTGGAAAC
-CCGTCCTGGGCCCAGCCTTTGTTTCAGGTCCTCCTCAAGCCAAAGACTTCCTGATGCAAG
-CGCTTCCTCCCTCCAGCCAGGGTGAATTCTGCCCTGTCCTTAGTTGGCTTTTCACATTCA
-CGTTTCCTTGTGATGCTGCTACTCCGGCTATCAGAGTCGGGGGCAGCAGTGCTGAGGCCT
-CCCACCCAACCCCAAGGTGGCAGCAACATCCTTCAAGTTCCCTCCTTCCAGGAAACCATC
-TCTGGCCCCTCACTTCACAGCGTCCTCCCTCCTGTTCTGCACCTGGCATTTAACACATAC
-TGCCCCAATCACTGAGGATGTTGTCACTGTTGGTAATACAAGGAATAACAGCACTGACAA
-CAATCACAGGGTCAACTATGGGAGAGCAAGAGGTTGAGAAAAACAGACTCTGCAGTGATT
-GGATCTGGCTCAtctgagcctgagttttctcacctgtgaaatggggtcagtgtagcatct
-accagccttgtgtagctgctggcagataaaattagatcaatatatatcaccatcagcact
-cagagggctcagtccctggGGACAATTGTGGTTATTATTATTATTATTGTTGCTGCTACT
-ACAGGGAACACTTGCCAAGGCCTTCCTGTGGGCCACTAACTGTGCCCCCACTCTTCCAGA
-TTCACACCCAAAGGAACAGggtgctatgatacccattttgtggttgagaaaaactgagtt
-ccatcaaagtgaggagatgggttcaaggtaccacagttgggacctgaaaagccagCAATG
-CACTAAAGATGTGGGTGACACAAGGCTTGGACCCTAACAGAGCAGACTCTGAGCCCTGAG
-GGTGGAGATCCCAGCCTAGTTCACACTGCTGCACAACCTGGCTGCAGGAGGACAGCCAGT
-CTTGgggctctggcctcggacaacctgggctaatccttccaccttctagctgagtgaacc
-cgggaacatcacttaaccttcttgagctcagtttttgcctttggaaggtgaaataatggt
-ctctaccatgcagggggtgggggaggattagatgggtaagtggatggaaagcttgagccc
-agagcctatgcacagtgggctgctcaggaaggtagAATCATGCAAGCCCAGGCCTAGAAA
-TTCTAAAGGGCAGGCACAGGTTCCCCACAAACATGACCTTGGCAGAATCCGTTTCTGAGA
-GTTGGCAGCAAGAAGAAGTTGTATGGATGACAGAAATTCTCAAATTTGCCTATTTTCTTA
-AAGTGGACATTTAAAAAATTCCACATTGGGGCGGAGGAATGTTCTTAGCCCAGGGATTGC
-TATACATAGGTTCATGCATTTACTATGCGTTGGTTCATCTAAGCccaacctcagggtctt
-tgtatttgctgctccctctgcctggatcactgtttccccagtgggtctcttcctaacatt
-ctagtctaggcttaactatttgcccttcaagagatcttccctgggcaccctataaaaatg
-catccttcacataaactctttctccttttccctactttgtttattcatgctgcttttact
-atctggcatcatattctaaatttatttgtttatctgtttgttgactgccttcttgtctta
-gcctattcaggttggtataacaaattgtcatgaactgggtagtatataaacaacagaaat
-ttgggctgggcacagtggctcaagcctgtaatcccagcactttgagaggacaaggcttga
-ggtcacgagtttgagaccagcctggccaacatggtgaaactctatctccactagaataca
-aaaattagccaggtgtagtggtgcacacctggggtcccagctacttgggagggtgaggca
-gttgaatggcttgaacccgggaggtggaggttgcagtgagccaagatcgagccactgcac
-tccagcctgggcaactgagcgagactccatctcaaaaaaaaaaatttaaaaataaattta
-ttttcacagttctggaagctggaaagtctaaatcaggtcatgggtagattagatgcctac
-tgagggcctgctttctggctctgggagacttttagctgtgtctgcatatggtggaatggg
-taaggggctgctctggggcctctttcataagggcactaattccattcatgagggctccac
-tcccatgacgtggttccctcccaaagtccccacatcctaacactatgacatgggaattaa
-gtttcaacatataaatgttgggaagacgcaaacattcagaacatagcactttcccattag
-attgtgaggataaggactatatctaagccattcacttctatatccctgttgcccactata
-tacctagcatacagtaggtgcttaataaatgtttgaaaaatgggtgaatGAAATATTGTA
-CTTTCTAATTcaagcattttctgagcacctactgtgcaccagggcctgtgctatgggctg
-tatatacagaaatacatcagtgagagtcctcagccctAAGGCCATTGGTCTGAAGAAAAA
-AGAGAAATTGCAACAAGTGCCATAGCAAACACAGCTGGGAAATTCACtgatgtagtttgg
-aggtgtgtctctgctcaaatcatatattgaaatgtaatctgcagtgttggaggtagggcc
-tggtgggaggtgattggataatggaggaggatttctTTTTTTATATCTATcaggaatgca
-aaattaatttaataatcgaaaattactataattcacagactaagacaagaaaagccatac
-gattctctcaccagttgcagaaaaagcatatgatagaattaaacatctttttatgatttt
-ttaaaattatactttaaattctgggatacatgtgcagaatgtgtaggtttgttacatagg
-tatacatgtgccatgttggtttgctgcacccatcaacttgtcatttacattaggtatttc
-tcctaatgctatccctcccccagccccccaccccctgacaggccccagtgtgtaatgttc
-ccctccctgtgtccatgtgttctcattgttcaactcccacttatgagtgagaacatgtgg
-tgtttggttttctgtccttgtgatagtttgctgagaatggtggtttccagcttcatccat
-gtccctgcaaaggacttgaactcatccctttttatggctgcatagtattccatggtgtat
-atgtgccacattttctttatccagtctattattgatggacatttgggttggttccaagtc
-tttgctattgtgaatagtgccacactaagcatatgtgtgcatgtgtctttatagtagcat
-gatttataatcctttgggtatatactcagtaatgggattgctgggtcaaatggtatttct
-agttctagatccttgaggatttgccacggtgtcttccacaatggttgaactaatttacac
-ccccaccaacagtgtaaaagcgttcctatttctcatggaggaggatttctaatgaatggt
-ttcacaccatctccttggtactgtccccatgatagggagggagttcttgtaaaagctggt
-catttaaaagtgtgaggcccccaccgcctctttctcttgctcctgcttcaccaggtgatg
-tgcctgttccccctctgccttccaccaggattggaaacttcctgagacctccccagaagc
-tgatgccaccatgtttgctgtgcagcctacagaaccgtgagccaattaaacctcttttct
-ttataaatgacccagtctcaggtatttctttctggcaatgcaagaacagcctaacacaTT
-CACCTCCAGCTACTGCAAGCATTCATGGGGATGAGTGAAAGGAAGGAGAGAGGTGGCTGC
-TGTGTCGAGGGTTTGCTCTACGACAGGATGGTGCACTTGCCACCTCTGGCTCGATCCACA
-CACTAGcccattttacagattaggcattgggaactcagagaggtgaagtgacttgaccaa
-aagcaaactcatggcagaatgaagactgggaccagggaggcctaattccaaacattgtgt
-gttacctcctctaccacaaggcctctctTGCCCAAGAGAAAGAATAAAGTCCAGCTAAAG
-TGAGCTCAAGCAAAGAAGATATAGATATGTAATTATTATCATTGTTATTACTATTTTTTT
-ctcatgtaacagatacatcaaaaagtagaagccttcaggcatggctggatctagggtctc
-aaacactatcactagaactgctccattcttagAGAGGCTCTCAAGTCAAAGTGACAAGAC
-GGCTGCCTGCCATGCCAGCCTCCCCTCCCCTACTCCCAAAAGACCAAGTCCAGAGGGAAA
-AAGAATGCCTCATAGCAGGCCGTTGAGGTTGGCTAATCTGGCACCCATTCCCATCAGCCT
-CTTCCTGCTACAAAGGCTGTGCAGCCAAACGTccacctttctgaccctcctgcagctggg
-tggccacaggacacagttctggtcaatgagacataagctgaagtttgtggtgagggagag
-cttttgctcctctgataacaggagcagttgtggccagagctgccccttcccatgttgcct
-tgatcacagacatgatatttgaagcacagaccatcttgcaaccaggaggaaaggctgaga
-aaaaaaaagtcctcactattttttagccatgacattgttaagttgctggactcctaactt
-cagacttcttcctaagagaaaaataaacttccaatgttcaagccactgcattaaattcct
-tgttacttgtagctgaaagcattcctgactaatacaACTCTCTGTCTCAGGTCCCTATAA
-AAACCCTGGGAAGGCATCATATTGGTTCTAATGGGGTCATGCTGTCATTCTGCAATGGAC
-TGTGGTGGCCAGCAGAGATGGGATGTGCCAATTGACCACTCCAGTGGCCACCCTTACCAC
-ATAGGCTTCGAGTGGGTAGGGTTGTTCTCCAGCACAAAAGTTAGTAGAGTAGGGAAGTGG
-TGGCTACACTCCCTATACCTCTGAATCAGTGGAGGCAATAAATTCCCTGTTCTTGGCTTA
-AAGTTTCTTCCATCGTTTCCAGGAACATGAAGATATTGACTTATTTATCCTCCAGGATTT
-TTATTTGGAATGTGAGGGGAGGATAATTCAGTGAACAGTCCAAATAGGGGATCTTCCTGG
-GAAAAAAGGACAAGTCATAAAAACTGCATTGAATGCCAGTGTGCACAATGTCCTTTCTGT
-GCCCCAAGACAGTCTCCCTgcatgagttcttgagccagacagacctgagttcaaacccgt
-ctccatcatgcaagtgcgtgggcagcctcgccatgtcacctcacctctctgcacctgcgt
-ctcTAGAACCGGGGGTGGAAGGACCCACTTCAAGGACCCAGTCTTCAAGAAAGAGTGGAC
-CAAGTGCCTCCCCCATGGTGGCCCTTTGACCAGCAGCAACACCCAGAGTGCTTTCTCTGT
-GAACCCTTCCCTGATAATCCCAGAGTCCCAGGGAGAAAATCTGCTCCCATCTGAAGCAGG
-AACCATCCAGCAGTGAGTGaacccactgccatttcctcctgccatgtggctaggccatat
-tccacagcctcccttgcagtcaggagtggccacgtgccttagttccaatccactgcactc
-cttcccctttgatgggtttgatgcacacaggtctgaagacctcagcagccacagtggaag
-atggcagagctgcaggacaccaggagcttgggtcctgaaatctttgtgcgctagagctgc
-tcacttaccaggggcacccatgttgggcttttggtgagtaaggaaaaaacctctttggta
-tttggtgcatggtgcctcttgggcttACGAACGTTACCCACATGCACCGCTTGGGGGGCA
-CCTGTAAAAGTCTGCAGGACGGTCAGCCCGGGAGGACATTCCATGTGGGCACCAGCAAAG
-GCAGAGGGTGGGAGGTGAGGAGGCCTGAAGAGCCAACGGCAGCCACACTGTGGTGTTGGA
-ACCAGATTGTCCTTCAGTCCTCCCGCCTTGACTGCCAGAGAGCAGCCCATGATCACCATC
-ACATCAAGCCTGCAGGCAGGGTAAGAGATTAATAACAATACTAACAACAGTaataatagg
-aggctctgccaatattcaagagaacttaccactcaccagctgcgggctggtttcttccta
-ggcctgatctcatttaatcctcaccatggcccagcaatgaaggccctactgatgtcagtc
-ccattttacagacaagaatacagaggcccatgaggcgtcggaggacattctccaaagGGC
-ATGTTCTTGAGCTCAGCTTCCTTCCAGCACAGCCTTTCATCAGGGCTTGGACCTTCATcc
-cattatatgtccagcattattcataggctgaggacacagaagtgaacaaagtagatagaa
-atctggacctcgaggggctgcgactctagtgggagaaaatgggcaataaacacacaaaca
-cgtaaatatacaaaaggagtttggtgaaggatgagtgacatgaagacagcaggtcaggat
-gctgcggtgggtgaagggaggaggtggtgctgtgcatcttgaggttggaggaaacctctc
-tgacatggagctgaaagtgctgcagcaaacgagtgagccacgtgaagatctggggcaggc
-tgttcctggcagagggaacagcaagtgcaaagtgcaagtgctacggccctgaggctggaa
-ggagcttgtcatgttcaggaacagaaaggagagagcagtgtggctggagtggagtgatgg
-ggggtggggagggatgaggctgcagagggagtgggttgggacaagTGGCAAGTTTTGGTG
-GGCAATGGTGGCAGGGGTAGATGATCCTCCAAAAAGACTCATCTGGATGCCAGCTCTGGG
-GGGTGCAAGGAGGGTATTCCAATGAGGAGAGGAGACAGGGGTTTCAGCCCAAATTTGCCT
-CCCCACTCTCCACTTGACTTAAGCTGCTCCCctctcccttcctttctctcattccctctc
-tctttttctctctctcCAAGTGGAAGCTGGATCCCTAGGGAGGATGAGGCCCGGGCTTGA
-GTCCAGGCACCAACAAGAGCGCGTTCCCACCCTCCCGAAGGTCTGATGTGGAGCAGAGGA
-AAAGAATGGTCCTGATATCACcggaaaaagggtcttatcccatatcgcaagagtgggttc
-ttggatctcacatgggaaagaattcagggtgagttgcagagcatagtgaagttaagatag
-gattagagactaatcaatgacagagtagggcatcctcagaaagcaagaggagaacgtacc
-catttcaagtaccagtgcttgcttatataggcagttaagagtagtgtactctgggctcac
-ccctgtaatcccagcatgttgagcggccaaggcgggcggatcacttgaggctaggagttt
-gggaccagcctgaccaacataatgaaaccctgtctctactaaaaatacaaaaaactagct
-gggcatggtggcctgagcctgtggtcttagctacccaggaggctgaggcaggaggatcgc
-tggagccccgaaggtccaggttgcagtgagatggtgccactgcactccagcctgggtgac
-agagtgagactctgtctcaaaaaaaaaaaaaaaaaaaagaagagtagtgtattctgttac
-aaaggcttatgatcagcttgtgacaggctactagtattgctactttcctatgttactatt
-gattttagcaagaatttatgagtgtactattatctttaaagcaaaacctaTTATTTTATT
-TTTATTTATTTATTTATTTATTTtttgagatggagtcttgctccatcacccaggctggag
-tgcagtggcgcgctctcggctcgctgcaagctccacctcccgggttcacgccattctcct
-gcctcagcctcccgagaagctgggactacaggcacctaccaccacacctggctagttttt
-tttgtatttttagtagagacggggtttcaccgtgttagccaggatgttctcgatctcccg
-acctcaccatctgcctgcctcggcctcccaaagtgctggaattacaggtgtgagccaccg
-cgtccggccgaaacctgttcttaaactaagaatttttttttgttcttaagatattgggac
-attttcataagttctgcgtctttaagtaacatcattaactcgttccctcaaccatgaaca
-tcttgtaaccaagcacgtccacgcccctggaaatgtaacccagcaggtttggcttttctg
-cctttattcaatatggagtcagtctggttaggatgcctttgTCCctgagagtcagtgccc
-tcacagcccctgcccggcctctaacttgctgtgtgacctggagctgatcattcgctctgg
-gcttcccttttctcctctgtttgaggagggagctggtctggtgccaccattttccagctg
-tctgtccttaggcaaattattcagcatccctgtacctcagtttcctcatccatgaaatga
-ggatggcccagttccaggcttacggtgaggattaaatgCACAGTGCCTGGTCTCAGTGGC
-TGCTGGGAATTACCATCATTACTGTTGTTTTGCCATTCTATTGCTATTGCCAGTGTTGCT
-ATTAGTATTCAAAATGCAGATTGGTggctgggtgcagtggctcatgcctgtaatctcagc
-actttgggaggcagaggttagaggatcgcccaggggttcaagaccagcctgggcaacacg
-gtgaaacctgatctctacaaaaaaaaaaatacaaaaattagccaggcatggtggcacgta
-cctgtagaccttacctgaactcaggggggttgaggctgtagtgagctgtgatcgtgccac
-tgcactacagcctgggggacagagtgagacgctgtttaaagaggtttattctgagccaaa
-tgtaagtgatcaagacccgtgacacagccctaagagatcctgagaaaatgtgcccaaggt
-ggttgggttatagcttggttttatacattttatgggtacagaagttacaggcagacatta
-atcaatccatgtagggtgtacattggttttgtcgggaaaggcaggaagcttgaaaagtgg
-gcggcttccaggttataggtgaattcaaagattttctgatcagcaattggttgaaagagt
-taagttattatctaaagacctggaatcaataaaaaggaatgtctgggttaagataagggg
-ttttggagaccaaagttcttattatgcaaatgaagtctgcaggtagcagccttcagagag
-aatagagggtaaaggtcccagactctttgttaaatctctcctgcatcaggaaaagacctg
-gaaagggaaaaggattctctacaggatgtagattttctctacaagagacagagttgtagg
-gccatttcaaaaatatgtcaaagaaatatattttggggtaaaatacttcaatttctttca
-ggtcctgctatctgttgtgtgatgctatatgaggaatttggtatcttattgctacaaaga
-gcatgctttgtcagtcttaagctctctctctctttttttttttttttttttttgagacag
-tgtctctctctgttgcccaggctggagtgcagtggcactaccttggctcactgcagcctc
-cgcctcccaggttccagtgatactcctgcctcagcctcctgagtagctgggattacaggc
-gtgtgccacctcgcctggctaatttgtgtatttttagtagagatggggtttcaccatgtt
-ggccaggctggtcttgaactccgaccttaggtgatctgccgccgtcttggccttccaggc
-gtgagccaccacgacctgccaagctctctgttttcatgataatgctggtcaactgtgcct
-gaattccaaagggaggagggtatgaggcatgcctgatccccactttccatcatggcctga
-actagattttcagggtttgttgggtcccgttggccgagagggaggtccattcagtcagtt
-agggggcttgtaattttatttttggtttacaGTTCTGAGGCCCCTTCTGGCTTTCAGACT
-GGCCTGGTTGCTTCCCATCTGGTCACCTCTCTGTCAGTGTTGGGGATCAGCATTCATCTA
-CCCCACGGATGTTCTGCCTGGAGTGGGGGTGGGAAATGGGACTGGACCTCTCGCCATGGG
-ATGCAGCCAGGCCCTCTCTGCTCAAGCCTTCCAGTGCTCCTCACCCAGACACCCTTCTGC
-AGGGACCCCAGTTTTACTCCCCTGAAAAAGAAAGTTTCCATCAGTAGGAGAAGACAGGAC
-CTGAAATTGTCCCTGAGCCTACATGTCTACTAGGGTAGATATTTTGAAAGCCGGAGAGAG
-GAGGAAGCAGACAGGAAGGAGACGAAACCCCAGGACTGTCTGCTAACTCCAGGAGGACTG
-GTCTTCAGAACCCAGGGGCCCTCCGCATTCCTTCTGCCTCCCTATCTCATCGTAGCTCCT
-GCCCCATCCCCCCACCACTTCTCTCCCCTTTCCTAACTGCGTGCCCTTCTCTCCTCCAGT
-CCAGCCCAGCCCTACTGAAGAACAGCAACTTGAGCTGGTCTTTCTGTGCTCCGCTTGATT
-AAAATGTAGAAGGCACCTCTATCCAGAAGACTTGGCTTGGCCCTAATCACTCCCAGCCCC
-CTTGGCTGAGTGGCCACCCGCTGCTGGCTGCTGTCATCCCACATTGGAAGTGACGGAGGA
-GCAGAAGAACGAGTGGGTCACCAGCCGGTCTTCAGGCTCCCGGGCCAGCATTCAGACTGG
-GCAGGAGGTTTGTGGGTGGAAGGTGAGTTGGGCAGCCCGTCAGCCACTCCTCAGGGCTGG
-ACGGAAatagtgattaggagcatggggtttgatgtcagatggcctggggttgcagcctaa
-ctttgttatttactatctgtgagttaagccctctgggtttcagtttctccatttgtaaaa
-tgggactgatattggaagatgtcctacttagaatggcgcctgagccatcgtaagccctca
-gtgaatCCACTGTAAGACTTCAGCCCCCAGACTCCCACTGTTCCCTTGCCCCAGCTTCCC
-TGCACCTCTCCTGCCACTTCCCTCAAAGTTGCTCTCAGTCAGGCCTTGGGAGCCACAATC
-TGGGAACGAGGACCCTGACATCCCTCTTCACAGCTGTACCCAGCACCAAACAAGTCATCA
-GAGGTTCAAAACACGGAGCCCCTACCATGTGCCAGGCACGGCATGGCATGCCTGCTCTCT
-TTCTAATTTTGATACCGCAATGATTAATTCTGTGAAAAAAGTTCTAGAAGGATATAAGGC
-AAAGAATTAGGTTGTGTTCCGTCCATTCACTCACGGCTCTGCTCCCACGCATGGCTGCGc
-tatgcacactgccctgcagcttcctttgtctgctgcacaatgggctctggacggagccct
-gttggcgcaatgagtgagccctacatcaagcttcgtcatcgctgcatcgctttgcaccgt
-gtggctgggccgccatcagtacagccaactgcctctgatggacatctgggctgcagccag
-attcctcctaacagggcttcagggaaagtcctcctcagcgcctctttgtgcgcatggcac
-atttctctaaggcaggtttctggacatgagactgacgggcagcatgtgctccttacattt
-gggggtcctgtcaatcccctcctctcccgcaggctgttctagactccagcccccatgtga
-gaggatgcctgttgcccTCACTCTTCCATCCTGGCAGTCCCCAGCCTCCTTGCCTCTCTT
-GTTTTCTTGTTCCGATCAGTTCCAGGTGGCCAGAGGGTCGAGACTCATCTCACAGCCGTG
-CAATAGATGCGTGTCTCTCAGTCGGTCAGCTCTGGCTGGGATCAGTGTTTATCTTCATGT
-CGGTGGACACCATCACAGGCACCCGCAAGAATCAGCGATCGACGGGGAAGAGGTTTGGGT
-GCATGGAGGagtgctttgcagtgagggctttggagccttgtgccctgattcaaatcctgg
-ctgtgtcccctgccggttgtgtgacttcggataaattacttgatgtctctgagcataagc
-tgggtcatcagaaaagccaagctagtaagagcacgtagctcagaaggctgctgtaaagtt
-cagatgagttgatatatgctcagtgctggaaagggtgctgggcacattagctgttggtat
-tattTGGGCACCTCCAGCCCAAATAATAATAAAGAGACTAGGAGGGATGTTGGGAGATAT
-CAGATGTTGCTCATTGGAGGCTGTACTGAGTGTGCAGAGAGCTTCAGGGAACCTGGAGCT
-TTGAGAGGTAAAGGAACGTGCCAACTGGAACTAGAAACCCACTGCCGCCTGCAGCTCTCT
-GGGCTGTTTCTCCACATGCACCGTGGGGTTGTTCGGGTCCCACTGGGGAGGGTGGCTGGT
-ATGAGGGTGGCCTGGCCTGGATGTGAAGTGGGATTTCCAAGGCTGGCACTCAGTCCAGAG
-CACGAGCCTTGATGAGGAACAGATGCACTCACAGTCTGGGGTCGCCGCCCTCCCCTCCTC
-CACAGCCCAGGGTTGGGGTGGCGATAGCTTCCAGATGGGCTTGGCTCTTAGTGGGGCCTT
-AAATGACTCCCTCTGAGTCCCTGAGAGGTGGGACTTAGGGCCTCTTCCTTGGTTCTCAAC
-CCCCCTGGCCCTGGGGGATACCTGAGGTAGCTGGGTTCAGGCCAGgtgaccttgggaatg
-ccagccctgctccgagcctcagtttccccatctgagaaacaggcattCTCCATCAAGCTG
-GCTTGGCAGAGCCACTGTGTCCTGTGATAGCTAAAGAGAAACATGAAGGAGGACCAGGAA
-CCCCCAGGAAAGTAGGGTTTCTTTGGTTTTATTTTCTTTTTGTATTTACTTTCTGAATGT
-ATAGTACATATCCATAGCATAAAATTTCAAAGGTACAAAAGGGGTCATAGGTAACAGTAA
-GCCTGTCTCCCACCCCTGCCCTCCAGACACCCAGACCCCTCTTCCCCGAGGCAAAAACCC
-TGTCACCAATTTCTTGAGAATCTGCCCAGAGATACGGTATGCACACATAGGAAtttttta
-cccagtgatgacaaacttcacacacagtatttcacactgtccttttgttactttaacaat
-accctttagagatcttcctatgtcactccataaagtgcttcttttttttttttGGATGCT
-TGGCGAAGATGGTTTCAGAATATTACACAACTTTCAACTGACCAATCAGGATGGGCCCGA
-GCAGTGCACAACCCTACAGTAGTATATGGCTGCTAGCTGGATGCCAGCTCTGTGTCTTTA
-TGGTTCACCATTGCATAGATGGGCCAATTGCAGGGAtgggtaatttataaaggaaagagt
-tttaattgactcacagttccttgtaactggggaggcctcaggaaacctacaatcatggca
-gaaggggaagcaggcacatcttacatggcagcaggcgagagagtgtgtgaagaagcaaag
-ggggaagagccccttaaccagtcttcaagagatgagcaggggctgtttccaacattttgc
-tctttaaaggaaggttgcaatacatacccattttgtacatttgtaggagaatatatgtag
-aataactttctagaagtgaaattgcATTTTacatccatatgtttaaaaaaatatcaattt
-ccaccccctgccatatacaagaattaacttgaaatctaccataaatctaaacgtaaaact
-taaaactgtaaaacttccagacagcaacatggaagggaaatctttgtgaccttgagttag
-gcaaagatttttttaggtactacacaaaaagcataaaccgtaaaagaaaaaaagataaat
-ttgacttaatcaaaattcaaaacttctgctcttcaaatgatgctatcaagaaaatgaaaa
-gacaagccacagattaggtgaagatatttgcaaaagtcatatctgataaaagactcatat
-ccagaatatatattgagtgctttcacaactcaataataagaacaaataatccaataacaa
-atgagaaaaaggtttaaaaagacatttcacccaaaaacagatattgatggcaaaaacaca
-catgaaaagatactcaatgttatcagtcatcagggaaacatatattaaaaccacaacggg
-ctaccactacatacctgttagaagactaacatgaaaaataactgataatacctggagagg
-gtatctaacaactggaacttagaaaaacagtttggtaatttcttataaaatgacccagct
-gtcctactcttaggtacaaagagtaatgcaagagaagtttgtgttttaaaaagaaaaact
-gtaggcaaatatttacagcagcttttctcataatcaccaaaaactggaaataacTGCtgt
-atgagtctagtctcacacagctataaagagactactcgagatgggctaatttataaagta
-aagaggtttaattgactcatagttctgcatggctgggggggcatcaagaagcttacaatc
-atggcagaagggggaagcaggggaagcaggcacgtcttacatggcagcaggtgagagagc
-gtgtgaaggaggtgaaggggaaagagtcccttttaaaaccatcagatcttgtgagaactc
-actcactatcttgagaatagcatggaggaaactgcctccatgatccaatcacctcccgcc
-aggttccacccttgacatgtgggaattatggggattacaatttgagatgagatttgggtg
-aggcaggaggatcacttgaacccaggaggcagaggttgcagtgagctgagatcgtgccac
-tactctgcagcctgcagacagagtgagactgtctcaaaagaaaaaaaaaagaGGTaaaca
-ggtaaagaaaataattttagatcatgataagagttaggaagaaaacattttcaaggcact
-aaatagagaatgatttggagggggtacgatatttaaagaaggttatcagggaaagcctct
-ctgaagaggtaacatttgaactgagatgtagagggagagaaggaactagccatgtggaga
-tctgggggaggagcattccaggcagaggggatagcaagtgcatctgaagaggtaacattt
-gaactgagatgtagagggagagaaggaactagccatgtggagatctgggggaggagcatt
-ccaggcagaggggatagcaagtgcaagggccctgaggccagaatgagtttggtgttttta
-atgaaagaaaaaggccagtgggtggggcaaggaggagagggcaggaggtaaggtcagaga
-aggaatggggaaAGTCTAGCTTGCACCAGCCCTGACATGGGACGAGACACCCTCTATGCC
-CTCGGTCCTGGCGGCTCCTGCTTCCTCCTTTGTGTCCACTCAACATGATGGGTGGGCTTG
-GCCATCCGCAGACCCCTCTTGATGCCCCAGTACCTTCCCTGCCCCGCCCGACAGTGAGGT
-CCAGCCTCCTGAACAGCTCCTCTTGCTTGTCATTGGATTAATGGGCAGGAATTGCTTCTG
-CTTTTTCAAAGCCATTGCCCCCTACCACAGTCCCCTAAGATCATGAAGGTGCgagcaatc
-atacttgaactgttggatgatgaatgcatcactgttgatgtggaggaggctccccagtgt
-gaggactcagagcagggtctcggcctctcacagacctggctgtgtgcttggctccacctc
-ctacgacctagggccctgagcctcagttgcctcacctgtaaaatgcggcaaacaagcaag
-caacaagatgctcaacctcagtagtagtcggagaaacaagagctaaatagcagtgaggca
-caccctttacctccattccctggattagcaaatagtagagtcaggaacttccaagtattc
-atgagggtgtgggcgatgggaattccatgttctgctgctgggtgtttggactggtttagt
-acctaagagcctaagaaagagtatatctgatgacccaggcattttcctcttgagtgtata
-ccccagagaaattctcctgcagctccagaagGAGCCCATTCGAGGTCATGGGTCACTGTG
-ATGGTGTTTGAGGATGTGAGCAGTAGGTGAGAATCCATGTAGATGCCAGGAAAAGCAAAC
-TGCAGGGGCCTCTAAAAAATACCAGATAAGGGATgagtgcggtggctcatgcctgaatcc
-cagcactttgggaggctgaggcaggtgcatcatttgaggtcaggaattcaagaccaacct
-ggccaacacgatgagacccaatttctactaaaaatacaaaaattagccaggtgtggtggt
-gcgcacctattatcccagctactgaggaggctgaggcaggagaattgcttgaatctggga
-gactgaggctgctgtgagccaagatcacaccactgcactccagcctgggcgacagagtga
-gactccatctcaaaaaaataataaaaataaataaataaataaatacaagaataaaatgaa
-taaaaaaccagatgaaaaagaaaaccaaaaagtaaaaataaaaaACACCAGGTGCATGAG
-AGAAAAAAAAAATAGAAGACGGGGAAATCTGTAGCACACGACCATTTCTGTGAttttttt
-tttttttttttttttttttttttttttttgcgacagagtctcactttttcgcccaggctg
-cagtgcagtggcgcaatctcggctcactgcaacctccgcctcctgggttcaagcgattct
-cctgcctcagcctccggagtagttgagattacaggcatgcaccaccacgcccagctaatg
-tttgtatttttagtaaaaacggggtttcgccatgttggccaggctgaactcgaactcccg
-acctccggtgatccacccgcctcagcctttcaaagtgctgggatgacaagcgtgagccac
-caggcccggccCATTTCTATGAATGAAAAAAACTCACAAGCTACAGAACATCCCTACACG
-CGTTAAAAGGATTCACACACATTCAAGCCCAGAGAACAGACTCACAGGAGCAGATGCCTG
-GGGGGAGGGGGAGGGGAAAGGGCAGAAGAGCATCAAGAGCGAAATCCAATTCAATCCAAC
-TGTGCAACAGACAGTTTGCAGAATTGATGAGGATGTTTAACCCAGGTCTTGGCACCCTAA
-GTCCAAGTAAAAAAATAAATACGATACAGCAGGTAAAATGGGGGATGATGGAAGGGtggc
-gatagtagtgcctttctcatggggaaccctcgaggctccgatgagcgaaaccatgcagag
-tgctcagccaggtgcctggcacgcagcaagGTGTCCGGTGCACAGCAGGGCCGCCCAGCT
-GTGAGCGGTGCGTGTATTCTCTCCAGCCTTGAATTCAGGCCTGGCTCCTTCTGCTTCCTG
-GTCAGTGCCGCTCTCTTGTGGCCCATACAGTGACAGGACTTAGACTGAATAGAGATCTGC
-CATGGTCCAAGGTATCTGATGGCGCTTCGGAGGAGGGAAGGGAGGGAGTCACATGGGGGA
-GATAGGATCACCAGAGGCAGATGGGATCACAGGAGGGAGATGGGGTCACAGGAGGAAGAG
-TGACTTCCGATTGGGGAAGAGATGGCGGATCAGATAAGGCCTCCTGGAGAAGGAATGTCT
-AGGCTGAAGGACAGATTCGACTGGGGGTCAAGGGGATTGATGAGCAAATGAAAGAATGaa
-tggagttagaatattgagcatgagcattacttagccctactgtgtgccaaggctttacat
-gcctcatatcatttcgtcctctaccacccctgggaaggcgacttattgcttctgtctcct
-ttgcagctgcaaaaagggaggctcagtgggttagcgactcatccaaagtcaagccgccag
-ctgcacatagagctctgatacacacccaggtcgtgtgactTGCTGGGGGACTCTATCTTC
-TCCACTTTGGGGTGGACTGAGGGACCCCAGTGAGCATAGGTACAGACCACCCCTGAGTCT
-GTCTGGACCATGTGTTAGCAGAAGTTTAATACTACACCTGTGCAGCAGGTGGAGATGGGT
-GGGACCTGTGTGGACGAGAGGAAGTGGATCTTGGGACAGCTACAGCATGCAGCGGCTCAC
-CCCAGGGCTGGACCCTCACTCTTTGGCAGGCAGCTGGGGCACCACACCCAGGGGTTAAAT
-GTGGAGACTCACTTCTTAAGCTAAAGGATGTGTCTGTCTTCAAGGCACTCTCCGAAAAAT
-GCCTCATTTTGGAATTTATGTCAAAGCCATTTAAATCCTTATTAAGAGTATTTAAAGATC
-AGTTTTCAAAATGTCTCCTAAGTATTTCATTTTTGTTTTTCTCGACTTGGTAGTATATTC
-CCATGGCTAAAAATTCAAAAGGGACCAAAGATAAAGGTAAGcctcctctctttccatcca
-ctctaacctctccccacccagagccatcactgttactggtttctagagtgttttgtcacc
-tgtaggttttgtgcattcatgaatcgtacacacgtgtattttccctccttcccgtccccc
-cgcgtgggggcttactatgcgcgctgttctgcaacttgcttttttcacttggcaattcgt
-ctcagggactgccccgtcattgtgtcaaatccttcctcgtggtgcttctcggccatgcgg
-tgttgcactgagtgctgtgacattgtatcgcaatgcctgtcctctagatatttaggatgt
-ttccagcattttgtgatcatacacaggactgcagggaacagctgtgtaagcaggtacact
-tgttctgcagcatgtgggccaggctaattgttatttatttatttatttatttttgagaca
-gaatctcactctttcgcctaggcgggagtgcagtggcgctatctcagctcactgcaagct
-ctgcctcccaggttcacgccattctcctgcgtcagccttctgagtagctgggactacagg
-tgcccgccaccgtgcccggctaatttttttgtattttttaataaagacggggtttcacca
-tgttagccaggatggtctcgatctcctgacctcgtgatccgcctgcctcggcctcccaaa
-gtgctgggattacaggcgtgagccactgcgcctggccctgggccaggctaattggaggat
-gaatccctagaggtggattgctgggtcaggggacatgtgcgctgtgatttgaatagatgt
-caactcaccttctgtagaggctgggtcaagtcaccctctcctgaggaaggtaggggaggg
-tggcggcttacccccacccagcccaggccctgtggtttcattttctttttttttcttttt
-tatggctcttagccaatcagataggtggaaaatggtagctctgtgtggctttattgtcat
-ctaatttgagtaagggtgTTTGGAGTTCCTTTTCTGGATGAGGCATTTTTGCCACACGGG
-GACAGCGCTGAGCCGACGACACGGCAGTGCCGCTCTGGACACGCTGATTCTCCCTGAGGC
-TCATCTTCTCAGGCTGAGTGGGACTGTGCCTGTGGATGCCCGCTCATGGAGTAGTCGCCT
-GGTGGAGGGCAAGGGTTTTGAGTTCCCATTCCACtacttactttctgagcctcggattcc
-ccctctgtaaaaagtggaaagaataatagaacccacttcagatggctctgaggaggatga
-atttaagtttttaatgtgaaatgcttggcacagttcctggctcagagttagtgcttagga
-aatgtttgttGAATGAAGAAATGAAAGAGATataatcatcttaaaaattgtattgagtac
-ttattatgaagcctttctcatgtattcacgtattttaacttcacagtgacaccaagaggg
-gtacttttattatccccctttaaagacaagaaaactgggccgggtgcggtggctcacgcc
-tgtaatcccagcactttgggaggccaaggcaggcgatcacgaggtcagattgagaccagt
-ctggctaacacggtgaaaccccgtctctaccaaaaaatagaaaaaattagccgggcgtgg
-tggtgggcacctgtagtcccagctactcgggaggctgaggcaggagaatggcatgaaccc
-gggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgggcgacaga
-gcgagattccgtctcaaaaaaaaaaaaaaaaaaaaaaagaagatgagaaaactgaggcac
-agggagagatacaggatcttgcctaaaggctcatagctggcgtcactggcggcgacggga
-ttcgtgatcttctgtctgctcttacccacctcacttccctgcctcccactCTAGGAGAGA
-GGTGCCACCATAAACCCCAttccagctgtccattgcatgaaacaacctcctcaacctcag
-aggcataaacaaacaaccattttatcatgttcctgggttctgtggatcaggagttcaggc
-aggataaggtggacagcttctctctgctgggccttcgatgggaggactctgtggctggga
-gggttctgcagtggggggtaaggaggggcagcgggtaaaacagcaaggactagaagaccc
-acttgcgagaaggcttcttcagctacaagtctggCTGGAGGATCCATTCCACCTTGTGGA
-TGGTAGGTTGGCTATGGCTATGGGTGAGGGTGGGAGTCATGGGGGGCTGAGTGGGAGCCA
-TCAGACCCCAGGGCTGAGTCCACATGTTCCAGGATCTGACAGCTTAGGAGGCTTAGCAAT
-TCCAGGGCTGGCGCCCCCATGAATAGCTTctccaggattttgcaagtgctgtttcctccc
-cctccccacccatctcattaacacctcgcactctttaattctcagcttggctatctggtc
-ctggaggaggagctccctaacccctgtatgccttagacaggatatgctagatcctgtcct
-catggaaggtcttatcacattgttggaattgactgtctgcagactgaacgcttggaggac
-aaggcagggtctttatcaccagcacccaggacagtaccaggcacacagtaggcactttat
-gcatattcacggaatgaatgaatGGGTGAGACTGATGGATTTTGAATGACTTGAACTTGA
-GCCTCAGTTTTTCCTCCTAGAAGTTAGCTGGCAACGTAGCTGTGAAGGTGGCAGGAGATA
-GGTGGGAAATGCGAGGTTAGTAAGAGGAATTGGTAGAAAAATGGTAGTTATGATTTATGC
-TGAAGAGAGAAAAGCAAAGGaaattagatattgcacctgaaatgcttagctatgtttggt
-gcagaataggtgctccataaatATAAGATGACGTCATCATCCTCATCCTCATCATTACTA
-TTATTTGTATTATAAGAATGCACATTTCCTGAGTTAGAAGGTCCACATACGATGGCTTGA
-AATTTTCCTCTGggctgggtgcggtcgctcacacctgtcatcccagtactttgggagact
-gaggcaggaggatcgcttgagcccaggagttcaagaccagtctgggcaacatagcaagac
-tctttctctacagataattttaaacatagctgggtattgtggtgtgcatctgtagtccca
-gttacttgggaggctgaggtgggaggatcaactgatccctgcaggtcgaggctgcagtga
-gccgggatcatgtcaccgacctccagtctgggcgatagagctattacccatcttaaaaaa
-caaacaaacaaagacagaaaaaaGAAATTTTCTTCCAAGCGAAAATGGAGAGGTGTAATC
-CCCATAGGTCACCTGGGCCAGATGTCTGGGCAGGAGGTCATGCTCTGAGTCAGATTTCCC
-TTCTGTGCAAGGAAGGACCTGGGACAGGGACCTCTGAGTCTGACACTCTCTGCACAGCTG
-AGAAGGCCATTCAGCTGAAGTCCCCATTGCAACTGTTGTCCTTCAGCCTGAGGCAGTCAG
-TCCTTCGGTCTGAGGCAGCCTGTCCCTTGCCCTCGGCTACCCTCCACCCTGCTCCAGTCC
-TGCTAGGAGAGAACCGCAACACGACCCCGTTTCAGAAATGCGCTCCTTGACAAGCCTGGC
-TGCGACCTGTTCCTGGTTGACTGCCGTCATCCGGTGGCAGCATGTGGGAATGACATGCAG
-GGCTGTGGTGAGGATGAGGATGGAGTGAGCGGGTGGGGGGAACTGCAGAGAGGGCCCTAG
-TGTGGCCCAGTTGGAAGCGGTGACAGGAAGAACCCACCAGGGATTCCTCAGCTCTGGCCA
-AGGGGTTGTTCTCTCCCTCTGGCATAGCATCCAGAAGGCCAATAGCAGCGGAACCTCCCC
-CTGGGCTCTGCCCAGACTGCCTCTCTTTGGCTGTGTGACCTCACCCTGTTTCTGAGCTTC
-TCTGTGAACTTCTCCAAGCTTGGCTTGTAAGAAGGGAGTGGGCGATGCCCACCTGACAGC
-AGAGTCTCCTTCCCAGAGAGGCCCCTCAATCCTCCAGAGAATGTGGGAGAGGCTGGGATT
-TGAAAGGATTGGAGCTGGGGGCAGGGAACGTCTGAGATGGAAAGGTTATAGGAGGGGCTT
-AGGCCCTGAAGAAATTTCATCCTGTAATTTGAAAATATTAAAAAACCACCACAGCCCCCA
-GCTGAGGACAGAGGACCAGGCCCCCCAAGAAGAAAGAACATGGCCAGGGAATTGCAGTAC
-TGGAAACTTCTACCCTTATGTTGGTCTTTTAGAATTGTGAAAATTAGAACGTTCAGCATC
-CTAAAACTGGAATCTTAACAGAAAACACTATATAGtgtatgtatgtgtgtgtgtgtgtgt
-gtgtgtatatatatatatatttatatatatatttatttatataGGggctgggtacagtgg
-ctcatgcctgtaatcccagcactttgggaggctgaggtgggaggatcatttgaggccagg
-agttcaaaactagcctgggtaacatattgagacccccatctctacaaaaaataaaaaatt
-agctgggtgtggtggtgtacacctgtagtcccagctacttgggaggctgaggcaagagga
-ttgcttgaggccaggagtttgaggctgcagtgagttgtgatcgtaccactgcactccaac
-ctgggtgacagatcaagaccctgccaaaaaaaaaaaaaaattaaaaaGATacacacacat
-acacacacacatacaGACTAAACTCTGTAGAATCAGATCATTGAGCCTTGAGGTCAGAAT
-CAGAATTGCAGCTGCAAATCTAGACTCAGCCCTCTGAGCTGGAAGTCATCTGAGAGCCAC
-CTCTCCCCTCAGCTTGTCCTGGAAAGAATGTTTGCTCTCACTGCCTGCTCCTAAACTTGT
-TTGCAATGaatagatctgggggagggccccaaaacctgaatttctaaaaggctccccagg
-ggattctgttgtTGGGTCTTCCAGATTTCGGCAATAGATTTAATTTAGCCAGGCTTcctc
-ttcatcacattcatcacatgggaaaactgaggccccggaaggggaagtgacttgacctgg
-accccatcagatagctggtgacaggctggagctcccacctgtgcctcccaatgccaaggc
-cactctcaccagcagcccagggtgtttAGATGGCCCCGTGGGACTGTCAACCTCCTAGGT
-ACCCCTGGTCCCTGAGACATCTGGTTCGTGAAACTGCGAGGTTCTGGGGATCGAGGTGTC
-ACCCTCTTCTGCCTCTGGCTGAGTCTGCTTCTTGAGAGTAGCCTGGAGGGGCTGAGGGCC
-CCTCCTCTTTTATCAGCTCCCCCCAAGCTGAAACCCCACCCCAATCCCCAATACACTCTG
-ACCCCTCTCAGCCCCAAGCATTCCTGTGAAAACCACTCCACATGTTTTAAATTCTGCTAC
-TCCAAACTCAGCAGTATCATGGTTTTGCAACACCCTCTTGATGCTCAAGAAGCATTTACA
-AGTTTCTTTTCCCTTTATTAAGAAAGTTTTAAAAAAAAGTTAGGGTCTTGAAACAATAAC
-AACGGAGCATTTCAGAGGCACAAACGTTTGCAGAAGAGAAGCTGGTGGCCTGGCCAGGCG
-GAGGAGGGGGCTCTAGCTGTTCTCGGGGAGGTGAGAGCAGGGAAGTCAGAGAGAGGGTGG
-GCCTGCTGGGAGGGGGGGGTTCAGGCCAGGGCTCCCCAGCTGCCAGGTGGAGGGCAGGTC
-TGAGGGTGGGTGCTCTCTTGGGGTCGGGAATGTAATATTTCATCACCTAGAGCCTCTCCC
-CCAGCCTGCTGACCATCTTCCTTCCCCAGGCCACCCCTGGGCCCCTTGGAGCTCCGACTC
-TTGCTTCTCCTGCCCATTCCTGTCCCAGTCACGGAGCCCTACGTGTTCAGGCCAACCAGT
-CACGGCAAATACAAATCCCGTTTCTGAGGATTCCGGGGAGCAGAGCAGGAAGGGGGTGTT
-ATGATGGCAGAAGGATAGGCAGTGAGGACAGACTTGCTTCCAAGCTGGGTCTGACCTGGA
-GACTCCTCCCAGCGTCGTTCCTGCCTAGGGCGAGGGGCGTCACAGCGAAGCACAGATGCT
-CAAGTCACtggtggtgggtgtgggcgagtgtggtggtgggtgtgggggagtgtggtggtg
-ggtgtggggcagtgtggtggtgggtgtgggcgagtgcggtgatgggtgtgggcaagtgtg
-ggggtgggtgtcagcgtgtgggggtgggtgtcagcgagtgtggtggtgggtgtggACGAG
-TGCACGGATCTTCCCTTGCTCCCCACCCACAATTCCCTACATTTCCCCCCTCAAGTGACC
-CCCAAATTCTCCTCTCCACCGTGAATGTGCTGAGCAGAGCCATCAGGCAGAAGCAGAGCC
-TGAAGGCTTCctgtgtgaccctgggcaagccccttccttctcagacctgtttccccaCAT
-GGGCAGGAAGCGCTGAGGTGGGGAACAGAGCTGCTGGATAATCTCAGCTTTCCTTTCCGT
-TTCAGTGGCCTCTTCTGGGCTGGGCAGGTGGATCCCCCAGCAGTGACAGCTCACCTGATC
-CGGCTTGGGAAAAAGGGGCATGGAACCCATGAGAGGGAGGCCTGTGGGGGAGTGCCGATG
-AGGGTGGCAGGCAGCTTGCAGAGGATGCCCTCCAGGGCTGGCTGCCCACCCAGAGGCCAG
-GTTGTGACCCTCCACGGCCAGCTGGGGGAGGTGTCCAAGCCAGGCCTCTGGAAGCCCTGG
-AGCCTTGTCCAGCCAGCTCCTCGGGGTGGCTGGTGGCTGAAGGCTGTGGAAATGGCCTCT
-GGGGACTGTCCAGAGAACCAGGTGCTCACAGCTCAGGGTCCTGGAGCCTCCCCCAGAGCA
-GAAGCAGGGCCTTCAGGATTCACCTGTGCTGTGTCCCAGCTTTGCCCTCTGGAAACCCTT
-TCTCTGCAAAGATGGGGTCAGGGAAAGGCCTGGGAAAAGATGTTTGCTTTCTTTAAGTTG
-TAGATAGAGAAAGCTGCAGGGGAGGGCACAGGCTCATGGTCCCTCTTAAAGTGTGTGTga
-gagggagacaagaggagggagagagagaaggatgcggtgaaggacaggaagaaacacagg
-aagaaagaaaaggaaagataaaagataagtgagaaagaagaggaaggaagggaaggaggg
-agggagaaaggAGAGGAGAATGGAGGTggaagaaataaaggaaataaaaaagaaaaagaa
-agggaaggtagactgacagaaaaatgatagaagggtggaaagaaagagaggaCAAATGGA
-GAAGACAgaggagaaagagtaagaggagaggaggagaaggagcaggaggaggTGTGCAGG
-GGCCGAGGACTAGGACCAGAGAGTCGGGAGAGCCGGCGGTCAGGGCTGCAGGCCGGGCTG
-GCGCGGCCTCACGTCCAGCCTGCGGTCCAGCTTCCTGTCCTTGCGTGGGCGCCGGTCCTT
-CCTGCCCTTCTTCTGGCCGGGGCTCCTCTCTGCAATGAGAGGACAGAGCCCGGTGACCAA
-GGCTGCAGGGCCAGTTAGGTCCTGGGAGCCTCCTCAGTCCTGAAAGACAAGGGTGCCCCA
-CCCACTCCCCAACAACGGGGCTCAGAACATTTGGGCACTGACCTTGCAGTCCCTCCTGTT
-GAGAGTTTGGACCGTGGGCTAAGGTACCCCAAACTGAACCTTTCTCTCTAGGTCTTCAGG
-GAGTGGCGAGGGCCACTAACTTGTTCAGGGCCTTCTTGTGCTGGACATCTGGCTCGGCCA
-GGCCTGCAGGTTCACCTGGGGCCCCCCAATCAGCATGTCGGGTGGCCTCATGGGAGTCCC
-CATGGCTTTCCCCGGCACACTCCTTCCATAGCTGAGCAGGCTCTGTGCTGGACGCTGGAC
-ACCTTTCATCTGTGTCCCTGCACCAACTTCTGCATAACACTGTGGCaacaatacttcagc
-atttagcaagcgctcactgtatgcaggccacagccccaagtgctttatgtatacgaaact
-cacaacagccgagagaggcaggtaGGGTCTGAGCCACACCCAGTCCCGTCTTCTCCAATT
-GTCCTCTCTTTCTCTCCACCCTTCTATCATTTTTCTGTGCCAGGCTACCTTTCCTTTCTT
-TTTCTTCTTTATTTCCTTTATTCCTTCCACCTCCACTCTGGCTGTGCCCGCTGCCCAGGG
-AGTTCTTCTGAGCAGTTGCCTGTCATTGTTATGGACAGGTGAGAAGACCACAGCATGGTT
-GGGAGCAAGGCCAGCCCTAAGTTTCTGCTTTACAAAGTGTCTCCACACCCAGGACATTCT
-CCTACATTGCTTGGGCCCCATTCAGTTCCCCGCAAGGAGCTGTGTGTCCATTTGAACACG
-ATGAACCTGAGGCTCCATGAGTCACTTTCTGAAGGTGCGCAGCGAGGCTGTTAGAGACCC
-TCTGAGCCTAGTGGCAAGGGGAGGGCAGTTTTATTCCTTGGGTGTCAACTATGTGCCCGT
-CTCCCCAAGAGTCAGGGCTGTGGCTCCAGTCCTGGCTCCTTCCTCTGCAGAGCAGAGTCA
-AGGAGCTAAGACCAGGCTACCCACCTCTGGGGCTCCCCACGCCCACTCTGAGCTCTTGGG
-GAGCACTGAGGCCAACTCCCACTCTGAGCTGCAGAGCTGACTGTGCAGGCCTCAGGTAGG
-ACAGCATCTGGAGATGGGGTGTGGGTGCTGCCTGAGTGGCCCTGCCGGCTCTGATGTGGG
-GGTGTGGGGGCCAGTGGCTTTGTGTCCCTACCCCTTCCCTAGGCCTGCCTGCCAGCTGCT
-CATGTacccatccagtcacccacccatccctccacctatttacccacctacacactcacc
-cacctattcacccatctactcacccacctCCATACCCAATGacccatccatccacctagg
-cacccacccatcacctatccatccacctgttcacctatctacctacctacccacccacct
-aatcatccacctacctactcatccacccacctaccctcccatctaccctcctatccaccc
-atctacctacccactcacccaccTGTGCATTCAGCCATCCatccactcatccaacaaata
-ttaactggataccgactatgtgccagactgtgttagaggcactagagagacagctgtgaa
-caaggcagataaagcccttgccgtcactggagatcacactccagtaaggaaaacagacgc
-tgaacaagcaaacacgagaatgagaaggctcatttcagaagggtgcaagtgctaccatgt
-gatatgatggaaaatgactccggggagggggactcctgggaagcctctctgaggaggagc
-cactgcagccaagacctgggtgatgcagggagctacagcggggttgttgcgaggattaga
-gtcatgtttcacagcactaagcacagccagcacatggtagatgctttatgaatgtttgca
-gttattgtGATTATTATTATCCAGGGGAAAAGCTTTCCCCTCATGATTCCCCAACAGCCA
-TTCACCCCCAGCTCTTGGAGCCATGAGAGGTGCCATGTGGTAATGAGTGCAGAAGAACTG
-TCTGCCTCCTGTGTGAGTCCTGCTCTGGCTCTGGGGTCTCTTAGGTTCTCTGGTTCCACC
-TCAACCTCACTCTGTCCTCACCTGCCCAACATGACTCCCAAAGGCTCCTATCTCTGCTAG
-CTGCACTCCCAACCCAAATAGCACAAGTCCTTCTGAAAGAGGAGTGTCcctgagttcaaa
-tcctggctccactatgtcccagctgggtgccccgggtggcctggttccaggtccctcatc
-cttcatcatgactttagattcctctttgcaTGACGAGTTACgtttgaattctaggtctac
-agctccctggctttgtgacccttaggtgagtgactcaacctttctgggcctcagtcccct
-catctgtaaaatggggatagtgctaataacacctaccgcatagcatcactgcgaagatta
-catgagttaacgattatagagaattcggcacagtgcccagTCAACACTGCCAATACTACT
-CACCGTTCACATCTTACCAAGCACACCCTGTGGCCTCTCTTCTATGTAAATCAGTGGTCC
-TTCATAgcccccagaaacattttggaaatacgtgtagtggtcttgaatggcacagtgaag
-ggggttcctgtggcattcagtggacggcaatcgggatccagcgtgggacagtcccccgca
-aagacgagctgtccccctgttccatccagttctctcacatcgtgccccaccctcacgtag
-ctgaaaagtctgcttgctgggagctgaattctgtttgactcatgaataccaattggtttc
-gaacacttccattcactgaagattctagggcactgtgagtgtggtgtcaatcagagatca
-attgggttggaccttactaatcattggtcactgttgggaaatcgcatctctgatggcgat
-gTGGCCACGTACTTGGGGCGCTGACCACGGCCGCGGTCCTCACTGGGATTGTACTTCCCT
-AAGTGTCTGTTGGTATGTTGGGCCAAGCGCTTCCATCAAGAAAtttcttttctttctcct
-ctatattacagttaggacactatactgataaaaaaaaattacctttgcaagtaggccaca
-ttctccatgaacttcattaagaatgataaagagggtattcccaaatccttcttattaaaa
-ggggggtgttcagtttgagagggttgggaactcctgGCCAGCTCAATTTTCCTAATGTAT
-TTGGGACTGAACCCAGCAAGGAAGGCCCTCCTTTGAAAGGACACCAGGGAAGGTGATGTG
-TACTCCACATGATAGTATGGCTAATGGTGGCCTTTCAGGCAGTCTCATAGATACTATTTG
-TGGGGCAGTGATCTGAGTCCGCCCTGTCCCTGTGGGCCTTTCCCACCGCAGCCTCGTGTG
-CCTGTCCTGGGGCTCACCTCCTGGGCAGGGCCTCTGGATGGGACATTTCCTTGACTCAGA
-AAGCACCTGGCAGGTGGCTGCCTCCTCATGCCCAGCCCGGCCAGCCTCTCGTACCCGGCT
-CTCCAGGCCCCAAGCCGAGCCGCAGGTCTTTCCATTGTGTGTGCAGGGGCTCCAGCCGCC
-CCAGGGACCCAGTTCACACTCCCCTGTGGGGTGAAAGGAGagacagacagacagacagac
-agGGTCAGCCGGCAGTGAGGGTCCTTCAGATCCAAGGGCAGGGTTTGAGGGGTTCAGTCC
-TCTGAAGACTGAAGACACCACTTCCACCTGCTAGGAGCAGAGTTATTTATAAGAGCCTGG
-AATGAGAGCGAAACGAATGCATGCACAGACTAATATGGGCCTGAAGCCAGAGCGGCCGAC
-TGTCTAGCTTTAAaggaaaggcttcctggaggaggtgatgtatgagttaaagggagagag
-gggagctcgtcaggtgagaagaaggaagcccattccaggcaggtgtgcaaagccttggga
-gcccggcccaccatgtttgggagatggggcagcctgagttgggagtcaagtctcaggaag
-gcggggacaggagaggaggctggaaggttgcctgggaaGCCCTCAGGACCAGGACACAGG
-TTTTAAACTTGATCATGTGTCTTTGATCAACTTTGGAAGGAAGAAAAAGGAGGCCATGGA
-CATAAAAGTTCTTCATAGGGGGTAATAAAAatacatatatacatgtatatatatatatac
-acacacacacacatatatatatacacatatatatacacacacacacatatatatacacat
-atatatacacacacacacacatatatatatacacatatatacacacatacacacacacac
-acacacacacacacatatatatatatatataCTTTGATTATTTTAAAAGTCCATGAGAAG
-TAGGCACAGAATATGggtagctatgaatactcctattttgtagatttggacactgagacc
-tagagcagaggtttgctaagggaacgcagcaagaggctcacacagcagacacagcaagct
-caagacacagtgggacccagaccttgctAGatacacacatttgacaagtaaagactgagc
-acccagtgtatgccaggtgctattctgggtgctgagggagcagcagcagacaagacagcc
-cagggtctgcaggcctcctggaattcaccatctggacaccgccgtgatgagggaagtgca
-ggcaccgtgggagcccagaagcagcatgggttgggttgtaggggaggaaacccctggact
-gggtcttgaagtgggggtgggatggcggggaaggggagcctagccaggctcagggaggga
-cgggaggtgctccaagtgagggcataaccccagcagagtcccCAGGATGATTTGGCCTGG
-AACTGGGCAAGCCGGAGAATAAGCTCAAACTGAGGAGGAAAAAAATGATGGGGGTGGAAA
-GGCTGGCAGATGGGACAGATTGCCCAGGGCCTGGGTGGGCTCCGCCCAAGGGCAGTggga
-gccactgaagggtcctgggaggaaaagaaattgagcagactatcattgtgaaatactccc
-tctgctgttgagtggagactgggctggagggactgagaaccaaggcgggagacgggcagg
-agctgtggccagaaccctggcgataggcagggggtggcaagagggtgggaagagggcggC
-ACAGAGGACAGAAACAAATGGGTGGGGAGAAAGGGATGAGCTGAATGGTGTGGGTTTGGG
-AGCTTCGTGctgcttcattttcaccccaaagttcttcctaccacccaaaatattatgcat
-ttgttctcaggtgtcgcttctgtctctccactgaaatgtcatgtccttgagtgcagaggc
-tttgtctgttttgttctgtaatgtgtctccagcacctaggaaagtgcctggccatagcag
-atgctctagtagatattttcagagtgaataaatGAACAGATTGGATTGAATATAGGGTGA
-GGGAGAGAGAAGAGTCAACAGCGATGTCTGCATCTCGCGCATGCCACCCAGGGATCAGGG
-AGCTGGTTATTGAAACCCAGAGGAAACCCAGAGGGAGCGTTAGGTGGGGGATGGTGGCAG
-TGGGAGTGGAAAGAAGGCACCCAGAGGGCAGTGGAGGTGAGGATCAGCTGCTCAGGGAGG
-CTGGAGACACGGAGTCAGGGGCCATCAGCAGCTGGAATGACCATGAATGTGAGCCCGGAG
-GGAATGCGTGGGCAGAGAGGCACAGTGTAGATGAGAATGCCAAGGAGCAGCCTAGTGCAG
-GAACGGGAGGGCTCACAGGCAGGAGTGTGACAAGGAGCTGTTAGGAAATAATCAGAGCAG
-TAATAACACTGATactgacacgtactgagcatctactgtgtgctggctgctgtactgagc
-actttaaattgtactaattcactttatcctcataacaattcctccccatgaggtaggctc
-tatgttctattgtctttttttttttctaacgtttggagaaaccgaaggacagagagctga
-ggtggtttgcttaagatcactaaagggtaaggtttagagctaggattggaccccaggcct
-gtcctattccaaaatcagtgctcagccaggtgtggtggctcatacctatactcccaatgc
-tttgggaggctgaggtgggaagaccgcttgagcccaggggcagcctgggcaacatagcaa
-gagcctgtctttacaaaaacataaacgcatagccagctgttgtggtacatgcctgtggtc
-ccagttactcgggaggctgaggcgggaggattctctgagcctaggagtttgaggctgcag
-tgagctatgatcatgccactgcactccagctgggcaacagagtgagaccctatctcaaac
-aaaacaagcaaacaagcaaacaaacaaacaaataaacaTCAGCGCTCTTCTTCTGCACTC
-TGCTGATTCCCTTGGCATTAATAACAATGCCAGTGTTGGTTGTAGTAGTAATCATAGTAA
-TGGCGGTTATGTTGGCTCTAGTGTTTTGCAGTTACTATGTGGAGGTACCCAGTGTACCTG
-ACATGGTGGTGCTGGGCCTTCCCTCACCATATGGCATTCTACTGTAATTTCTTCCAGGGC
-CCCTAACATCTCTCACCAAGCCCCCGCTCCAGGGAGAGGGGAGGGGCAGGGGCAGGGCGG
-GGAGGTCCCCACTCACCCTGGCACTCCCGTGTGTTCTGGTGGGCCAAAGTGCCCGGCGGG
-CAGGTGGGCAGACACTTCCCCTTGTACAAGTAAAACTGCCTCTTGCACCGGATGCAGAAG
-TCCTGGCTGAAGCAGCTCTCACAAGTGGCCCCACATTCTGTAATAGAGCCAGGGACACCC
-CAGGTGAGGGAGACTGCCAAGGATGGGGCCCACTGGGTCTGCCCGAGGTGGAAGGCCCTC
-TGGGTAGCTCCAGGCTTGGTAGCATTTGGGTCAGGACTCAGTGTCTCCTTTGAAGCCCAG
-ACTTGGCCAAGGTCAAACTGGGCTGCATGTGAAGAGAACActccctttctcatttgaggg
-gaggctcagagagagcgagtgacttgcttgaagtcacccgcaaaccagggctggagtgag
-gactccctgcttcttttTCACCTCAGAAATAGTGATAATTTGCCCAAAGTTACAGCAAAA
-ATTAGAGCTTGGAATTAGGACTCCTTTTCCTATTTGagctaagaccagagaaggtgagtt
-acatgcctaaggccacaccacaaactagggtagaAGTGAAAGTTGCCTGTTCTATTAGTG
-CTAATTAAGGCTGAGAGCGGACTGACTTGCCTCGGGCTGCGGAGTCAGCCTGGACACAGG
-CAGGTATCTCAGAGTCTGGGCTTAGACATGCACCTACTTCCCCTCTGTCTGTGCTGGGGT
-GAAAGGGTGGGATCTAAGCCCATGGTGTCTAGGAGCCCAGCACTAGCATAGAACAAGGGA
-GAAGCCACGTACTTTTGCACCTGTTGACCTCCTGGCCGCGGATGCCGAAGTACCCAGGGG
-GACAGTCGTGCAGGCACTTGCCGTACTGGCGGATGCCTTCCCGGCGGATGAACAGGAAGA
-GCCTCTGCTGGCAGGTGGAACAGCCGTTCTCCTCTGAGCAGATGATACAGCCTGTGCAGT
-TGCCCCCCAGGCCAGTGCCCACTGCCCACAAGACCAGGGCAGAAGGAGGGGGAAAGGGAG
-AGAGAGATGGTCAAACCATATATGCGAGCAGCTGAGATGGTCTCATTGGGATAGtaactg
-ggcacatggccacccaaacaaaagactacatttcccaccttcccttacaactagatatgg
-tcatgtgaccaacatctggccaatcagatgtaaggtaaagcagcatgtgacacttcaaga
-aagctgccttaaagggcaggggtgtgccccttgtcgtcccctcatcctttctgttgggtg
-gaatgtgaacgatggctggagcacaagcagccatttcagatcatgaggtggaaactatgt
-cccgtgaggcggtggaaaaatcagataaaaagcacctgggtgcctgaggaaggcagaact
-gctgtaccagctctagcctgcctgtgtagactgttacatgagagagaaatcaacatctat
-cttgcttaaatcactgttatttgaagttttccatcactcacaagcaaacttaatctttac
-CAAAGTAATGTGAATTTTTGAGTGTGTGTGGGTGCACATGATGAGTGGGGTGGGGTGAGA
-CCCTCACCCTCCTGCTGGGTTCCTGAACAATACTCAGCAATACTCCATTTCTCACTGTCA
-CCATCAGCAAGGGCTCCCACCATCATCAGGAATAGCAATGGGAGAAATTTTTTTAAGGAG
-AAAATTTTTTGTTACCCCAGAATTGGCACCCAGGAGCCAAAGCTGGGGAAAAAAGAGGTG
-GAAAATGCTCTAGAATCTTAAGTGAGCCTCTCCCAGGCTCATAAGGAGTCTCTGTTACCC
-TGACCATCACCCCAGGACCCTGATTAAGCTGAACACTTGCAGGGAGGGACTCATGGGAGT
-TAGGGATTGTCAGCCTggccaggcacagtggctcatgcctgtcatcccagcattttggga
-ggccaagatgggagaattgcttgagtccaggagtttgagaccagcctggacaatatggcg
-aggccctgtctctacaaaaaatacaaaaattagccgggtatggtggcacacacctgtagt
-cccagctacttgggaggctaaggtgggaggatcgcctgagcggggaaggctgcagtgagc
-tgtgtttgtgccactgtactccagtcggagagacagagtgaagccatgtttccaataaag
-aagaaaataaaaagaaGTGGACAGCCTAGGGAAGTGAGTTGTGGTGCTGTGACTTTTCCT
-CTGTTCCCAACCCTGCCAACGAAGTGAGGAGATGCCAGAGAAACTCACAAAGACAGGGGG
-TGCCTGCAAGAAGGTGCCAGCATCTCATGCCCTGCTTGGACATAAACTCATGTCCATAGC
-CCTGCGAATCTGCCCCCTTCCCATTCCTCTTTGAACAGAGAAAGGAGACCAGGAGACAGA
-AGGGCAGAGCTGAGGGGAAGAGTGTGATAGAAGAGCCTGCACATCCTTCCCGGCACGTGT
-GAGGGAGTTCTCAGTGGTAAGGGGCACCTTGGGAGCAGCCAGGCTTAGGTGGTATTCCTG
-CTGCCTGGCACAAGAAGGCTGGTTGCTGGGAGGTGCCCCAGCAGTAAGAGGCAGCAGGGG
-AGACCACTGGGAGTAGGAGGTGGGGGAGAGTCAGAAAATGACCAGGTGTCACTAAGTGAC
-AGGAAAGGATAGGGCAGCTTTTGAGAGGCAGCAATTGGGGAAACAGTAAATGGTTTCATG
-TTTATATGTCATTAGGGTCAGACTGGTTAATAATCCGGTTATACACCTTGATTCACCTGA
-GCCCCAAGACCACCCGGCAGGAAACATTCTTGGCTCTCCAGCTCTCAGATGCTCCCCTCT
-TCCTATTGGTGCCCCATCTCCCTTTTAGAGGAATTCCCCATTGTGCAAGGTCCTGATGAA
-ACACATCCTGGCACCTTCCCCCTGGAACAGAAACCAAAAGAGTTCTGGCCCTCCTTTAAG
-TTGGCAGCAGGTGAGAGCTAACGAAAGCCCGGTCAGATACACATTCTGGTGACTCCAGTC
-CTGGGAGTGGGACACAAGAGTGAGGGTCACACAGAAATGGGGTTCATGGTGGAGGCAGGG
-CAGGCTCTCTGCCCAGCCCTGGCTGAGGcctttctctctcccttccatccctcagtccct
-ctgttccttcctccctGCTCCAGCTCTCGGATGAGTACTGCTACTTCCCCAGTCCTCACC
-TTCTGTTCCTTAGATTCGGTGAGGCCCCACATCCTGCTGATAACCCTCTTTCTGTTGCTT
-ATAACTCAGGAGGCTTACTGATCCAGGGTCGTACGGAAGCACACAGTAACTAAAGTGTAC
-CCTGGGATGCTGTTCCCAAGCAAAGTTGGCATTGCCCTCAATTTTCTTGCCCTGGGATAA
-GAAACTGCAACAGGAGAGCAGAATAAAGATTTTTGTGCCTCTGGAGCTGTATACCTGGCA
-GGGATCTGAGGGCAGAGAGCAAGTGTGATGTTGTAAGGGAGATTCCCAGAGCCAGAGAAA
-TAAGAACATCCACTGAGAATTTAGCAGAGTCCGGACTTCTCACTCAgcaaaagattcaga
-ttctgatactacccagagctggcaagaatgagaggaaaccttcgctttttcaccttagat
-aggagtgtaaacttcggggaaaaatctagcagtacctaataaatttggagatGTCTCTTT
-TCTTTTTGTGTTAAAAAGtttttttgtttgttttgttttgttaagacaggatcttgctct
-gtcacccaggctccagtgcagtggcatgatcctaagctcactgcagcctcaaattcctgg
-gctcaagcaatcctcctgcctcagcctcctaagtagctgggactacaggcatgtcccacc
-acaccaagataattttttaaaaacttttgtacagatggtctctctctgtttcccaggctg
-gtcttgaactctggcctcaagtgatcttcctgcctcagggtcccaaagtgttgggattat
-aggcatgagccaccacgactggccTGATGTCTCTTCTAAATGTAACAATTTAGCTTCTGG
-TATATACCCTAGAGcggcagttctcaaactctggcgcacaacagcagctcctagagagct
-tgttagaatataggtccctgggttccacccctggtacgtctgattcagtaggtctgagaa
-tttgtatttctaacaggttcccaggtgatgctgatgctgctggtccagggaccatgctct
-cagaaacactgAcctagagaaacccttgtatatgtgtagaaagagacaaagatatttatt
-gcagcattatttaatagcaaacaactgcaaaaagctaaccctctgccaaaggaatagata
-aatacattgtggtatattcatacaccacagccagataccacatacacaacccagccatga
-taaatgactgaggtagctacagttatcattgtgggcacagctcaaagacggggctgagag
-gaaaaaagcaaggtgcacgatgaatcatatagtaagagccatttatataaagttcaagga
-cctgcaaagcaatattttgtAGCATTTGTGACTTGTAAATATGCATTCAGAGCAGAAGAC
-ATGGGACTAACCAACACTGAATTCAGGATCATGGCACACAAATGtttattatattatttt
-aaattCTTGACTGTAGGTTTGAAATAGTTCACCCTAAAAATGCATAAAGAACAAAAGAAT
-TTAGCCTCTACTGTGTCCTGGGGCAGGAGGAGGCCTACATTCTTTCTTCTCCTTCTCCAC
-TAGCTCCCCTCCCAAGCCCTGTCCCATCCTCAAGCTGAGGTCTTGAGCAGGGGAAGGTGA
-CAAATTCTGAAGACGTGGGACCCGGGTTCCAAGAGCAGTGGAGACTCGTGCCTCTGCACA
-CTttgcccctcgtccactctcccctcatcctcagtagtggaatcctgatttttattttat
-tttttgaggcaaggtcttgctctgccccccaggctgaagtgcagtggcacgaccttggct
-cactgcagcctagacttcccgggctcaagcaatcctccctcctcagcctccctagtagct
-aggactacaggcgtgcaccaccatgcccagctaatctgtgtatttttttgtagagaaatg
-gtttcaccatgtttcccaggccggtctaaaactcctgggctcaagcaatcctcctgtctc
-agactcccaaagtgctgggattacaggcctgagccacagcgcccggctggaaccctgata
-ttaagcggagtttatgtcctctaagactatatttcccaggccctttgcagctatatgtgg
-tcatgtgcttatgccctgaccaatgggatatgagcgggcatgccctgtacagcCCCTTAG
-GAAACGCTGGCACTGTTCTCCTCCCATTTTCCCTTATGCCTGCAGGAGTGCAGGCTTAAG
-AGTGGAGCCATGGCAGATCCAGGAGGCAGAGGGATCTTATAGAAAgacagcttggcgtgg
-ctgtattaacccagggctgcccaccgccgagattctttcctggggaagggaggaaagcat
-tgcccatcttgtttaggtcactgGGCCTTTCTGACGCACACATTGACTGATGATGTCGGG
-TTTTCCGCCATGCAAGGCAGCACAGAGTCATATCAGTGGAGACCAAGTTGCCCTGCGCTG
-TGCCTTGGCGCTGTGTAAGCCCACTGGGCCTGAGAGGCGACCCCACTACCAAAGAGCAAG
-GGGACCCTCAGTTGACTTGTGGTGATCTTTATCACCTGGCAGAATAGGACTTCAAATTAC
-AAATTAATTTAAATTACAGAAAAACAAAGTAGCATTTCCTGAAaaacgaatctgtggaca
-cagactcacaccctgacatggcgttgctgcccattttgcagctgagaaaaaccgagaatc
-aaggaggtgaaacgacatgtccagggtcacacagaattggcaggggtggacccacatcac
-tctgccccacgctgccctctTAGAGCATCTGTCCAGGGCCTCCTGTGTCAGGCAGAGCCT
-GGGGCCATGGGGGTGAGCCACGCATGGCCCCTACCCCTATAGGACAAACAGCCTGGTGGG
-AGGAATTGAAGCCCACAGAAGTGACAGCAAAGCAGGATGAGATAAGGGGTCAAGATGGAG
-ACAAAGCAAAGCTCTTACCACTCTtagaagagcttagaggtcactcagcacaactcctgc
-agtttcactggggacactgaggccagaaggggtggagctttccccaaagtcaggcagcca
-actGCAAAGAAGCCTCAGTCCTCAGTTAGAGTTATAGCACTAtttgttttttgtttgttt
-tattgtttgtttgtttgtttgtttgtttgtttttgagatggagcctcactctgttgccca
-gactggagtgtagtggtgcgatctcagctcactgcaaactccgtctcccaggttcaaacg
-attctcgtgcctcagtctcccgagcagctgggattacaggcacccccaccaagcctagct
-aaatttttttgtatttttagtagagacggggtttcgccatgttggccaggctggtctcga
-cctcctgacctcaAAAAGCTACAGTATATGCTGAAGGCCAAAGAACCCAACAAGCCCCTC
-CCAGGCCTCATAGAGTGCTGGCCCACTGGATGGTGCTTAGCATCCTTCAATACCCTGGTC
-TTTGAAGGTCAATACCCTGGTCTTTGAAGGGTAGTGGCTGTTTCTGGCCTCATCCTCGAC
-CCTGGCAGTTGGCTAGGATGCCCTCTTGTGCCTCTATGTTGTAATGGCACCTCTTGCTTT
-TTGACTTCCGGTAGCCTGTCTGGTGTTTCGTCATGTCTCTGTAACTCATTAGAAAAAGCA
-GTGCTACTGCCTCTCTCTACCCCCTGCCCTAAAGTCACGGGTGCAGGCGCTTGAATGTTC
-ATTCTGTGAATCATCAGTGATGACAAGAGTCTGTAGAGTGCTGCTCTAGAAAGATCCAAA
-CTTGAAGGTTCTTAAACTTGACTGTGATAACAATCTCCAGAGAGGCTTGTAAAGCGTCTG
-CTGTGGGCCAGGAATGTGCACTTTAACAAGTCCAAAATAAATGTAACAGAATTTTGGAAG
-TGTCTTCCCTGTTCACAGTTTCCTTTCCCTGAGAACTGGCCCCAGTAATCCTGTTTGTAG
-GGCATGACTCTGACCCTAACCAATGGCTGTCTCTTCCAGGATGGGCCAATTAGACCATCT
-CTCTCTGGGCTGATGGACAATGGTCTGCGCTGGCCTTGACCTAAGGCGATCTGCAGGTGG
-GAGGGTAGCCTGTTCCAATGCACATGTGTGAGAAGCCTTGGTGGGCACTAGCTAACAGAG
-GCTCTGCTCCTCTGcactctctggcattgaggttcgtgtgctgccatatccacccagatg
-cacttaacctgggcttggccaatcagagcatcaggtccccttgactacagtggttgtagg
-ttcagacacaggctcacatccccacaagagctagtcttggggtttttgctgaggtcaatg
-gatgtgtgtggagatgtgtgtgttttcctttcctctctttggatctaggaggatatagat
-cagagctggtgggtgccacatgagggaagagcctctggagaatggaggccatacagcaga
-aacagagccaagagacacagacaaagaccaaaaagagtcatctgtgcatgtggatccacc
-ctggggatccataaattctctttttttctcaggtcacattgagttaggttttctgtcact
-tgcaaccagatgattcccgactaatacaGAAGTAGAGAGAGAAAAATAAATCAGATGCAG
-AGAGAGAAGCAGCAACCAGAACCTCACGGGCTCCTTGAGACAGAAAAAATTTCTGACTGC
-CTCCCAGTCCTTCCCAAAGCTTGGCTTGTCCCATAGCTCCAAATCCAGTGACTTTTTCAC
-TTGAGCTGGTTTTCTTCTGTCAAATTACAATAAAAATGGATGTAGCTCACTAGACAGCGA
-ACAGATCACGGTGGAGCAGCGCTGCTTTGGCGCGGATGAGGAACCTGGAGCACCACCTAT
-CCAACCTGATCACCCTGGTGCTCCAGGGGACACTGAGGTTCCAGGGAGCACACTTTGAAA
-CCCCCTGGGTCCTTCTACACATCTTGGCCTCTGTCGCTGTCCTCTCCCAGCTGAGATGCA
-CATTTTAAAAGCATTCAAGCTCTAGTTGCAACCTCCCCAAGTTTTCTTGGGCCATCACAG
-TGGATGGCAGGCACCCCATGTAACTTCCATTAACAACTGTCTCCCATAATCAAGACCATC
-CTCCCTCAGTCAAAACACCAGTAGGCCACAAAAGCATGGCCCTGTGTTGCTCCAGCAGCT
-GGAGAGGCTTAGAATGAAATCTGAGTCACTCCATGTTTCCCCAAGCACCCGAGGGATGAG
-TCCAGATTTGGATGTCCATTTTATGGAGAATGAGAGTGGAATCAAACACACCAGATTTGA
-CAGTTTGCAAAGTGATAAAGGCTTATGACAACTCTGAATGCGTGCATTAACCCAGGGTTG
-AGTGATCCATTCATTCATTCATCGACCcattcattcaacaattactgagcccctattctg
-ggtaaggtccagtgctaggACTCAATGGTTATGAGCTTTGGGGCagttgtgtgaccttgg
-gcaaggtactttacctctacaagcctcagtttttccagctgtaaatggggataataatgc
-ttatcttgcagggctgttgtgattaaaggagatggtacgtgaaaaactgttagctcagac
-cacctgcagcaggcatctgataaactgaagctaccattattATATTGAGAATGATGTGTT
-TTCTGCCCTCAAGGGACTTAAAAATCTAAAGACGTGTAACAATGCAGGTTcccaggttga
-tatcctggccccatcactcattgaatgagatccctcgtctctgtgggcctcagtttcccc
-atctgaaaaattgtggcagcaattcctacctccacgtgatttgttatgagggatgtgcaa
-accagcaagcactggcacacagtaggtgctcCTCTGTAAACCTAGGTTCCCTCCCTGTTC
-CCTCACCATCATGACACACAGTGGGACTGTCAACCAACATCTGGACCCTTGTCCTCTTTC
-CCAGGTGAGCAAACAAAAGCCAGAGATGTTGGTGAGGCTGGAAGGAGGCCAGCAGGGTCC
-AGGGACATGGTCTTTTGCCCTCTGGATGGTGAAGTGCTCAGGGCAGAGATACTAGCCAGC
-AGCTTTGGTCCTAGGTGAAGGGCAGGCTTATTCCTTCTTTTGGGAATAGGGAATAACCTG
-TGCCCTTCAAATAAGGGTCCCTAAGCTCAGGTTCACCCACATCCTGAGAACTGCCCCAAG
-CACCTTGTTTCAACAGGAGTCAACGGCTCAACATGTGCAAGTGATCGCTGTATTTTTTTT
-TTCCATTTCAGGGTTTTGAGTGAACTTAGGGTCATCTCTGCCATATCATGCCTTCCATCT
-GCCTTCACTCTGCAGAACTTCCCTGAGGGGTCAAAAATGCAGGGTGACATCTGGGACGCT
-GAAAATGTCATGTTCTCCTAGGCAAGCTCGTCTCCTCAGTAGCCCAGTGAATCTGTCATT
-GAAATTTCCTTAATACCCAAGCCAGAAAGCCTAGCCCCATACATTTTTTTTAAAAAAAAC
-AAGACTAAtttggatagatttctagcatttaaaaaatcaagagatttcacattaaaaagc
-tggaatttgaacttctctggaaaaagtcagaacatctaccaacactgggtctgctgtcac
-agggcagtgagtggttagagttacataaataaggcatatgttccccaggttactgcagac
-cctaccCCTCCCTATTGTATTTCAGATACTGAGGGAAAAGGTCAGCTGCCCTATGTTATC
-ATCCTTGAGCTACATCTTAACACCCACTTCACTCACTCACAATAGAAAACAATGTAGAGc
-aggggttctcaaacttgggcatgcatcagattcacctagagagcctgttaaaaacacagg
-ctgctgggccttaccctagagttgctgattcattaggtctgggcagggcctgagaatccg
-cattgctaacaggttcccaggtgatgctgacctttgctggtcctgggcccacactttgag
-aactactAGTGTGGAACAGGGTTAAgagccagactggttggattgaaatttcagctctgc
-cccttacctttgccatgtgaccttgacccagtgccttaacctcactgtgcttcagttttc
-tcatctgtaaaacaagaatcctcctggctgacctcacaggtgtgctgtggggGCCTGGCA
-GGGCTGACAGTCAAGCGGGTCTCCATGACATCACTGTTACTACCATTATTATCACCACCT
-GCCCTGCCTGTGTTGGCATTTGTGATCCTGGAACTGCTTTGACAATCAGTGCAGAGTTTT
-TGGTTTTGATGCCAACATTTTTGGGGGTAGAGTTTCTTCATAATTGGGGTGTGCCCTGGG
-AAGTGTGTCTTGCATGAGAACATCATGTCATGGTGAACTAAGGATTTAATACAGCTGTCC
-TGGAGGACTCCCCAGGGCTAAGAAGGATGGGGAAAGAGAGAAAGACACCACTGCCCCTGC
-TGAGGTCCCTGCTCTGTCCTTGGGGAGGACCCAGAACCATGCAGGAGGGCCCTACACAGA
-CAGTGCTGGGCAGCGCATCCTCCGATGCCCGCCTGGCAGTGCAGGACGCATGTCACCGAT
-GACCAAGGGAAATAAAAAACATCTGGGCACCCGCCTGCCCACTCAGGCCTCCACATATGG
-GAGGCAGTCGCCACTGCTGGAGGCTTGCTCAGAAGATCCCCCAGCACATTTCTGCCTAGG
-GGTAGATTGCACCATCTCTAGCAAGGGGGTGGGCCCTGGAGATGACTCCCAGCTTAGAGA
-CTCCCTGGGATCAGGGCTAGAGGTCGCTAGCCCACTGGACCCTTCTCAGCACTCAGGAGG
-TGGGGGGACCAGCAGGGCAGAACATTCAGCAGAATGTTGaggttgccttggctttggggc
-ctgacaaaccaccacttcctagctgggtgatattgggcaagtggctttactgttctgagc
-cttggtcttctcttctgtaaaatggggacgatagtagcaaccacctcccaggcagttgtg
-gggatgccatgaactcatctgcgcaaagtgcttagcacagctcacggcagatgaatgagc
-actccattactacttgattCATGAGAGATGCTCCTTTGAGGGCTGGGCCCAGCTTGGCTT
-GCTCACCTTTAAATCCCCACGGCCCTGCACATTGTAGGTGCCCACTGACTACCCATTTGT
-GATTATACCCATTATGCCCATTCATTATTTCTTAAATGAATGCATGAACGGTGGCTCAAT
-AAAGGTTCTCAAAAACTGCTCTCAGGGGGCTCACAGCCTATTTGGGAGGACCAGGCCCAT
-ACGAATGTGGAGAAAGCTGATGACCTCTGCCCAGCAGGGCTCAGAGACAAGTGAAGGACC
-CAGGCAAGGTGGGAGTGAAAGTCCAGAGACTGGAGACATCAGGGGTGGTTTTCTAGGGAG
-GCAGATGTGGGGACAGAAGCTGAGGCCAGGAGCAGGACTAGTTTGTGTAGATGGAAGAAA
-GGTTTCTAAGAGAGGTGAGTACAAGATGATATTGTACTCATTTGGTAGAAAGGGAGGGGC
-TTGAGCAAGGAGCAGATGGCAAATCCCCGCTAAGGTGCCAATACAGGACACCTAAGGGGC
-TAATGGATAAGACCCTCAAAATACAGTAAGAATAGGCacacatccaaaatggaaactttt
-catcctttgccctccaaacctgcttctcctgtccatttcagtcaatggctactccactca
-gggccaaagacttcagcggcatccttgtctcttctctctccctcatatcctactattggc
-ccatcaggaatccggtcagttccacttctgaaatatgtctgggaataatttctccacctt
-tcctgtccctaccccgttccctgctcctgccctgtttccccaccactcaccttccctggc
-catgctggcctcatcctccatgttccccatctgccaagaccactcccaccacaggacctt
-tgcacttgctcttccttttgtctggaatgcccttcccacattcacccgcaaggctccctc
-cctcaaatgtctccttgtggggacaagagtgattccttcttagatactaatttgccacgt
-caactcctgactaaccctgagtccagtaatgcctccaagatgtctagctgaagcattact
-ctctacgtagaaacacttatttgctgcgggtttcacttttcctccaaaacaaaccttgat
-gctgctgcaggaagcataggctatgacacccatagcacaatgtcagtcacctgtgcactc
-ctcccagagcacgcagacctttctccccaagatatgtaagccctgggtctggagagttac
-agcttggagatctacctatcttgaggctgcccaaatcttgctctgttcaaaagttcccca
-actaataaccctttaccaacaaattggaattggctgcctcattctttggtttcccagctc
-cttctgcatttggggtcgctttatgtatacggccctttcacagaacaccccttccctgtg
-atgcccccagacctcttgcctgcagcagcaccacacctacaccctattcctctcccacgt
-cgctatgttcttcatgccatttattcccacctgataggttctaaatttggcaagtgctgt
-tgtctctttcccaccagtgaaagatgagttccaggaaggcagggaTGAGCCACGGCACAC
-TGGACCTTCTCACTTATGCAGCACCTGCCTTCTCACTTAACCAATTCTTTGTTTTATAGC
-TGCTTACCATTCCGCATAGaggggctgcaaaactcatttaggtgctattatcacacccat
-ttcagaaaggaggaaactgaggttcagagcaatgatgctgcttgcccgaggtcacttaat
-aagtggagcagatattcaaacccaggcagtgtgactctgaacctgagggttatcctcagg
-ttgccacactgcAGCCTGGCTACTCAACATATCCCTGTGCGCCTCCTCAGTCCTCCATGC
-AGAGTCCCTTACCTACTGACGCCTTGCTAAGTTCCCAGTGCTGTGCTGAGGCCTTCTTCG
-GTGTCCGCTTGACCTCACCTGAGACAGGAAATTGGCCAAATGGTGGCAGTGCAGGCTGCC
-CCAGGACTGAACATGCCCCCTCTGCATTCCTCATCCATCCTCCCCTCACCCCCAGTAGAG
-AGTGAGCAGATCAATAGGTGTGTGTTCAATCAAGGGGTGAAATGCCCACTCCGTCTCTCA
-AATTCTCCAGGAGTGAGTCTCCTGCCTCGCAGCTGGGACTTGGGGAGGATGAAGAAAAAT
-TACCTGCTAAGTTGCAGCCTCTGCTGGACATTCTGGCCAGAATCCTTTTTAGACGTTGAC
-CTATATGGGCTGGTTGCAGGGGTGGAGAGGGTGGTGGTAAAACCGGGGTTCAAACTCACA
-TTTGTTGATTTCATGGCcagtggtgatctcagatttcaatccccatcagaatcacctgag
-gctgcttattaaaaACAAGAGGTGCTGTCGCCTCTCGACACATGCGGTTGTTTTAACGTT
-TATGGTGTGCCCAGGGTTGTACGTGCATGAACTCAGAGATCTTCAAAAACTGTCCTGTGA
-GATCAGCCAGGgcttcccaaactgtaatatgcacacaaagggatttaactcagggatctt
-gggttaaaatgtagattttgatgctaaagttctggaatggggccagaggtgctgGCCCGA
-GAACTCACTTTAAGAAGCGAGGCGGgagatgctgttatcattcctcattttacggttcag
-gaagtgaaggctcaaagaccaacaattataggtggtggcattagatttaaacccacagct
-gatgaaaccccagactcattctactgtgtcacactgccTTACCCTGTTGGTCTGATGATG
-AACGTGGAGCGGGAAAATGGGAGTGATACTCAAAAGGGGCAACCTggccaggcacagtgg
-ctcacgcctgtaatcccagcacttagggaggctgaggcaggtagatcataggaggcccgg
-agttcgagaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaatc
-agctgggcgtggtggtgcacacctgtaatcccagctactcaggtggctgaggcatgagaa
-acgcttgaatccaggatgcggaggttgcatgagccaagattgcaccactgcactccagcc
-tgggcgacagagtgagacgctgtctcaaaaaagataagatataaaataaaataaaataaa
-aataaaataTCAAATGGGCAACCTGACTCCTTTCGCCACTCATAGGAGGGGCATTTCCCC
-AAGCAGCCTGAGTTGGGGACAGTCCCTGCCAGGCCCAGCATGGCAGAAAAAGGAAGGGCT
-GGGTTCATGTGTGCCCGACATGTGTGTGTTTGGGGGACAGGGGCAGGTATGTGCCGACAC
-ACGAGACCCCTGTCTAAAGGATCTGCCTGTCCCCACATTAAAGCATAGAGAAGGCCTGAG
-CCCCTGCCCTATGCTGGTCCTGCAGGGCTCGGCTGGGGCCCAAATCAGGGGTTGACACAG
-TGAGAACAGGCTGCTGGTGCCTGGCATCCCCCACTTCCCACCCCACATCAACCAAATCTC
-TGCTTCCCCATTCTCCTGGACCTGCCCTGGACCACATCTATTCTGCCCTCCATTAGCTAC
-TCATTAAGAGAAGTTACATTTGTGTTTCTGGTGGGAGCCCTGGGGGTGCTGAGCAGCCCA
-GAGCAACCACTGGTGACCTTCAGAAAAATCATATTAAAGAAAAAAGGGTTGTTTTTGGAT
-TCCTCATCATTCGGCAAGCTGTGCTGGGGGTAGAGCAGCCAGATGAGTTCGGGACCGGGG
-CAGAGAGTCTACCCTCCAGCTGGCTTCTCCAGACCCACCTGCCCAGAGCTAGTGCCCTGT
-TAGCCAGGAACACAGAACTGTCACAAAGCTGTCCTGAGCATGAAACTGTTACCAACCAAT
-CTGTCCGTGGAGTTGTTACAAAACTGTCTTGTGTGTGAAGGTGTCACAATGTTGTCAAGT
-ATGTGACCTTGTATAAGAAATTGTCATGCAATTGTCCTATAGGTAAAACTGCCATGAAGT
-TGTCAAGCATATGCAGTTGCCACTCATTTGAAAAACTACTGGAGAAGAGTTTCTTTTCTT
-TTCATGTATGAGGGACAGGTTTGCTGTGTGGGTGACTTTGAAAAAGTTGCTGACAGGCAC
-TGTGCTTGGCTGCTGCTCCTGTAATAacagcgcccggcacccagtaggtgctcagtgagt
-acttgccgaatgTCTCCTCAGGGCTGCAAAGTAGACTCAGACAGGTTCTGGTTCTTTCAG
-GTGCTGGCTTTGTCCCGTAGTGGGCTGGTCTGATGTGACCTCGGGTAGGTCTGTTGCCTC
-TCGCATCCTCTCTGAGCCTACTTTGGTTGTTGTAAAGTGCCCTGAGGCCTGTGTATGACG
-TGCCCAGCAATACTGGGGACAATAAATGCTGGCTGCTAATTCCCTCTCCCTCTTGTCGGG
-GGTTTATGATTCCTCAGGGCTCTTGATGGTAGCAGAGGCCTCTCGTGGCTCTTTGGGAGG
-CTGTGGAAGCTTCAGCTTTGGCTGAGTAGGACGTCTGCAGTGGCAGGACACCTCCAGCCA
-ATCAGGATGCTCAGTGTCACAGGGATTGGGGGCAACGCCCACCGCTACAAACCCAGGAGG
-CCTCCTCTGGGGAGGATGTGAGCTCCAGGATTCCAGGAAGGGTGGGAGGAAACCTTCTAA
-GGGGAGCTGAAAGCTCGTTGATTCCTAAGATGAGCCCGAGTGAGAAAGGTACCAGGTTTT
-GAAGTTTGTTCTGCAAACGACCTTCTTCACTTTTTTGTGAAGTCCTGCaatcaacagagc
-tcagggctaggaattaggacctttgctcctgtcccaccttggactcagactcattgtatg
-acctttggcagagcacctggagcttcCAAGGGGTGGCAGAGAGTTGGGAATGCAGTTTCC
-TATCGGAAAAGCAGAGCCTTGGTCTTGATAAAGAACTTTTGAACTTTTTCTTAGCCAAGG
-GAGCCTTCCTTTTTGCAAGATGAAATGTGACATGAGAGATCGATTCCTAAAATGAATGAG
-TTGAGCTGCTTTGGCTGAGGCCAGGATGGGGGTGAGGGTGAGCATCTTGAGCTGTCTTTT
-TGGTTTCCTTTGCCTACTTCTAGAGGCAGCCTCTGAGAGCTTGGATACCCCCTAAGGAAC
-CTTTGAACCCCAGAGTTCCACAGTGCTAATGGCTGCAAGGCAGGTGATATAATTTTGTGG
-GACTCTGGAGCCTGGGTTCATTCCCACACtagcttctctgagcattggttttcccgtctg
-taaatggggataacgactatgctcacatgttgtgacagtgtggtaagctggttttgtgtg
-tggcatgccaaaacagggtttggctgacatggggtgcacagcaatgtgggAGCTGCTAGC
-AGTTGTGGATCTCTTCTTTCACAGGCCAGACTGCCTcaacaatcctgcaagatgggtagt
-attatctggtcttgcggacaaggaagctaaggcacagagaaggtaagtaagttgcccaga
-tcccatagctggtgagtggcaaactcaaagccaggcagtctTAGTAACAGATAGTTATTA
-TTATTTTAAGTACTGGGGAGAGTCTAGGCCCCAGAATAGGTCCAAAATAAATACCCTCCT
-CACCTTACATAATTAAGCTCTAAGAAAGCTTAGAAATAggccaggcacggtggttcacac
-ctgtaatcccagcactttgggaggctgaggcgggtggatcatgaggtcaggagttcaaga
-ccagcctgaccaagacggtgaaaccccgtctctactaaaaacacaaaacacctgcaccag
-gtgtggtggtgcgcacctgtaatcccagctacttgggaggctgaggcaggagaatcactt
-gaacctgggcagcagaggttgcagtgagccgagatcatgccactacactccaccctgggc
-gacagagtgagactctgtctcagaaaaaaagaaaGCTGAGAAATATAATCAGCTCCCAGT
-GCTGAGAAGACTTGGGGCCCCACTGCCAGTGAGCATCAGGAAAGGGGGCCAGGTCTAAAA
-GTCAGCGCTGACTGAGGCAGGTCCTTGGTCAGTGTGTCCCTGCCAGTGTTCCTGGGAAAG
-CCCCAGTTCTTCTCAGCCAGCACCCTGGGTACCTGGAGCTTCCAAGGGGTGGCAGAGAGT
-TGGGAATGCAGTTTGGGCCTCCAGCCCAATGCTCCATGCTCCTTGCCCAGTAATCACACC
-TGGCACAAAGTGAGCATCTTCAAGGACCCTATTCTGGGTCTGGTCTCTCCCCATGGGCCT
-TCTTCAACACTCAAATCCTAGTAGTACAAGGGAGAGAGCCCCAGATGTGGACTcttgtcc
-agttctgtgtgtcctcaggcaagtgtctccctgtctctgggcttcagtttctccatctgt
-caaatggatggttaaactcagtgtttctaaaggcccACTGTTCACccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccccatccatccatccatccatccatccatccacccacccacccatctatccatcca
-ctcacccacccatctatccatccatccatccacccatccatccatccaccaacccatcta
-tccatccaatcacccacccatctatccatccaccaacccatctatccatccactcaccca
-cccatctatccatccatccatccacccacccactcatctatccatccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccacccacccatatatccatccactcacccacccatctatccatccatccacccacc
-cactcatctatccatccatccatccatctatccacccacccacccatcatccacccaacc
-atctatccgtccatccatccattcagcagatatttcttgaatatcatctatgtgccaggA
-TCCTTTATTTATTAAAGTTAAAAGACAAATCACAGACCTGTAGAAACATTTTAGAAAGAC
-ATACAAAATCATACTGGATTGGAAATGTAAATTTCCCCAGGACttttgttcaccagtgac
-tctccaatgccatgcatggggccacatgtctactaggtgctctgtaaaatgtttattgga
-tgtaagaatGAATAGGACATATTTTGCTGTTCTAAAGAGAGCTGCCTCCGAGTCTGAGAT
-TGGAGTCAGACATCCTCTCTAGGACTTATTGAGAGGGGGCCAACTATCTTTGTCACCCCC
-ATCCCTGACCTGCCCCACTGCCTCCCCAGCCCATATAAGCCAGTTTCTAAAGAGGATCTA
-AGGAGGATTGGCCAGCAGTGACTGGGGCAGGGTAGGGCACGGCATGCCCCCAACTCCCAA
-GCCCAGGTGGGCTCATGGTTTGGAGGGGAGAAGCTATGAACCAGAGGGAAACAGGCATTC
-CATCCCTTGATTGAACTCACTCTTGTTGATCTGCCCTGTGTCCATTGGGAGTGAGTGGAG
-AATGAATGAGAAATGCAAAAGGGGTGGGGTCTGGCAGAGGCAGCCTGCATTGCCACCATT
-TGACCAATTTCCTGTCAATTTCCTATATTTGGTCAAGTGGACATTGAAGGAGGCTCTTGA
-GCTTAATCTAAGCCATGGTTTTCCAGCCCAAAGGGGCATGAGGCTGTTGAAGTGGGGATG
-GGGTAGTGAGGAAGCTAGGGTGATCTGAAGAGGTCAAGCTCGTGCTCCTTGCTCAGTAAT
-CACACCTGTGTACCAATTAGGCACCTGCCACACGTGGGAGAAAGGGGAGGGCATGGATGG
-AGGCAGAGGAACATTTAGTCCCAGTCCCTCCCTGCTGCTCACTGGTGATGGCCCCAGAGT
-TTTCTAACACCGGGAATTGTGGAGGCCACAGCAGCATCAGGGTAGTGACAGCTGTCTCTA
-TCCCCATTCCTTCTTCTGCTCCCCAACATACAGGGGAGAAATCAACCCAGAGGGAGGAGA
-GAAGAGAATGAGACAGCATGACATATCTCCCTACAGGGCAAATCAGTGGAGTCAGAAGCT
-GAGTCAGGCAGTGATGGGGAAGCAGTGATGGGAAAGGAGAGCTTCAAATCAGACCTGTAT
-TTTAAAAATTCAGCACTGGACTAGGCTTTTTAATAGCTGAAAGTTACCAGAAAGCTTTGA
-GATCTGCCCAAAGTTATTAAGGATTGGAGTTTAAAAATACGACTGTGCATTGGGGGTGGG
-GGGTGGGGGGTGCATGGAAAGCATGCCATGTTTGTAACCCTCTGTTACAACTTCAGTATC
-ATCATTAAGCCAGTTACACACAAAGTAAGCCAAGAAtatccttaatacacaacgagctcc
-tataaatcaataagaaaaaggggaatgatccaagtgtgtggagggagaatgggcaaagac
-attacaaggaatttaaaaaagaaagacaaataggacaataaccatacgcaaagctgttct
-acttccctaagaattttcaaattgaagatgagaacaagaatgaaataccaccatgaccta
-caagatacggaaactgtaaaagactCCGGCACCCTCTTTTGAGAAGGCAATTAGGCAGAG
-TCTATTATCTGTAGCCTGAGGTAGTAACAGcattttacaggaagtgtcctgagttgagag
-aggggtaggcacttgttagaagccacacagtgagtcatgggaggggaggagctagaactc
-agacctctggaTGGGCACCTTTGATTCTTTATCTCCAGCCAGCTGGTCCTCTCTGTCTGG
-GCTAGTGCACAGCCTGGCCCCTGGCCCCTGTCTGGGTAGCCCAGGTCTGCTACATCCATT
-GCTGCACCCTGCTCTGGGCCTGAGGATGGTTGGGGCACTGCTATTCCAAATGACACATCT
-CTTATGATTACCCTGTCCTTCCTAGACAGGAAGCTTTCAATTAGTCCTGCTGGGCAGCAG
-CCTTAGAGGgtagaggtaggactccaaggtttgggatgagacaaacctgttctcaaatcc
-cagccccacctttactccctgggacagttacttaacctcagtttgctcatttgtaaaaGG
-AACACTGTccaggtgcggtggctcacacctgtaatcccagcactttgggaggctgaggtg
-ggaggattacttaaggccaggaatttgagaccagcctgggcaacatagtgagacccttat
-ctctatgaaaataaaaaaaaaaaattagccaggcatggtgatgcgtgcctatagtcccag
-ctactcaggaggctgaggtgggaggactgcttgagcccaagaggtcaaggctgcaatgag
-ctaagatcgtgctattgccctccagtctgggtgacagagagagaccctgtctcaaaaaca
-aacaagattaaaaTGGACACAATCACCCACCCACTGAAAAGCttgttccttccacagata
-tttattgagggcctactatgtgccaggcacttttcaaggcactgcagatacatcagtgaa
-tgagacagaccttcccctcatgaagtttacatcctaagtgggagagggagatcatttcag
-agaacgacagggaattgaatttgggtacacagagtggcaggagggagggcctgggctgcc
-tggaagggcatctctgagatacacaagaaagcactcttggcggagggaccagtgggtaca
-aaagcccagaagcggcaaagaacgtggtgtggaagagagcagcaaggccagagtgcagtg
-actgaggggagagtggtgggtggtgaggtctggaggcagaggggccagacccccaggaca
-catggatgagtttggatggtgctggattttcctggaagtgagttgggaagccactgtggg
-ttgcaagccgaggagtgtctgccaccttgaaagcttctctggtgctgaggggaatggact
-gtggggcaggagtagaagctgggagctcagggtgtatgggctgtggtcattctggtggcc
-tggacgaggctggcagctatgagaagtgggtggatccagggagggtggacagacaagctc
-tgctcatgggttATCATGAAGATTAAAGGGTAAGTGACTCAGTCCACAGTGCAGCACATA
-GCACATGCTAGACAGATCTTAGCTGttttatttatgtatttatttatttttgagacacag
-tcttgctctgtcactcaggctggagtgcagtggtgtgatctcgactcagtgcaacctctg
-cctcccaggttcaagcaattctcctgcctcagcttccctagtagctgggattacaggcac
-ccaccaccatgcctggctaatttttgtaattttagtagagatggggtttcaccatgttag
-tcaggctggtcttgaactcctgacctcaagtgatccacccgactcagcctcccaaagtgc
-tgggataacaggcgagagccactgcgcccagccAGATCTCAGCTTTTAAGAGGCCTAGAC
-CTAGAATCCCATGACTGTGTCTACCCCACAGCCTCCTCCATAAATGCCCCAAATCGCTTC
-TGCCTCTCCTGGTCATTGGTTCAAAATGTGATTCCTTGACCTCTTGTTGCCTCTTGACTT
-TTGCAGCTGCTGGGATGAAGTACTTGTTCTGAGTTCCTCTAGTTGCTATTTTAAGCAGAC
-TGCATACCCTCCGGCCCCCATCTCCCAAGCTGGTGTGAAACCCAAGGCAGTATCTGGGTG
-GCTCCCTAAGTCGTTTTCCAAGTTGAGAATAGGTAGTAGAGTCACCTATTCTCACAACCG
-TGACATTCCACCCAGTCCAGGCTCCCAGACTAACTGCCCAGCCCCTGGAagtagagagat
-gggaggcagcaccaggcagcagggaacccaggtttgagtcccagctctgccaccttgacc
-ctaggaaggccctttgacctctctgagtctctgcacctcttctgcaaaataggaatgatg
-atattaaagaattgcttgcagggtaaagtgaggtaataacctgcggagcacctggctgtg
-tgcccagctcatatggcaaacactcaccaggtaggagGATCCTAAGGTTGTGGGCaatgc
-atacaaagcctctggtgcattgtaggtgctcaataaatggtagGATGCCAGTAGGGAGGA
-GTTGAATGAGAAAAGGGGAAAGAGACCCAGTGCATGGTGGGGGTGGCAGGAACACAGGGA
-GTTGGGGGCTCCACCTTGGAAACCTCTCCTGGCCCTGGGGGCACTATCTCCACCAAACCC
-AAATCCAGGCAGCTAGAGGGACCTGGGCCTGCACAGGCATGGAAATTCTGCACTCACTGT
-TAGtgggcctcagtttcctcatccgcgaagtggaaaccataacccttcttaccCAGTTAT
-AACCTGGATTCTGGGCTGGAACCAAGATAAGCAGCTACAGGCTGTCCTACCCCACCCCCA
-GCTGGAGACGCGGGCCTCTGGGAGCTCTGGCCGATTTTCAAAGGGACCAGAACTGCAAAA
-AACAGAACTAGGCTAATGCTGGCtgagtgttcacagtgtgccaggacctgtgccacccag
-gtccttgtactaaatcattaaaacttgccataaccccacaaggtgggggctacacttact
-ccattggcagggatgagaaaactgaggctcggagaggtaaagggcttggcccaagcattc
-acaggaggagccaggaggaatgcaaaactgagcccagctcctaactACTGGAGAGGAGCC
-TGCCTTGTGGTCCGTCACCCCTCCCTGCCAACCCCTGCCAGCTGGGCTTCCAAAGGCCGA
-CAAATGCTATTTAAAGTCATACGTCTCTCAGGTCCCGAGGCACACCAGGGATGGACCCTA
-AACTGTTTGTGGGGGCAGACAGGAGTTATATCAGCCAAGTGAAGGCAGGAGGGGAAGGCT
-ACTCCAAGTGCCTTTAGTCTGGAACTGTTTGCATTGCAGGGATGGAGCCCTTAGTAGCAA
-CCTCCAGACAGTCAAAAAAGCTGGCTTTGCACACAAACATCCCAAGTGTATGTTttcctt
-cattctttctctttctcttttctttttccttccttccttccttctttccttccttccctc
-cttctttccttcctccctccctccctccttccttcctttctttttctttcttctttcttt
-cTCAGtctctctctctctttccctctctctcttcctGGGGTGGGGAGTTGTTGATGCAAG
-AGAATGAGATGATCCACAAACTGAACTGGTTCAGCCAAAGCAGCCCTCAGCCAGGGGCGA
-GCGGGAAGTGTAAGCTGTTGGCTGAGGATTCTCCTTGTGGGGGATTTTGAGCCCCTGTGG
-GGTGTTGTTCAAGCCAATGTCACTCGCCTCCAGGGGCAGGGAGTCTCCAGCTGATGTCTC
-TCTTAGAGGAAAATTCACTGCTGTTGAGCTTACTACCTCCATCAGAGTAGGGGAAAGGGG
-ACCCCAAGGACAGGGTCTGGCTAGCAGCACATGCTCCGCAGATGCGTGCCAACTGCAGGC
-TGTGATCCTAGGGCACAGTCAGGAAGGGGCGTGGACAGAGGAGCATTGTCGCAACTGAGC
-GTCCCACTAGCGTCCTCAGGAAGGCCCGAGGGCTGCTGCAGCAGCACTAACACTTGGAAG
-AATCCCTCGCGGGAAGGGTGGTCCAATGTTGAGGAGTAGCAGATCCAAGCTCACACTCTG
-GAGTGTGACtttgcttgtttattttaaaagaaggggtctcaccacattgcccgggctggc
-ctcgaactcctgggctcaagccatcctcccacctcagccccgtgagtagctgggatttca
-ggcgagagtcaatgcacctggcTCTGGGGTGACTTCTTGTAAGACCTTCTCATACAGACT
-TTTTAATAAGATCAGAAAACCCAGACCATAAGGCAGAACAAGCCCCCTCTCCCCACTCAA
-AAACCAATGGATTTGACCACACTGACAGCATGGTAAGCAATGATTTCTACTCTCCAAAGG
-TGaggactctacaaagtcagattaaaaaagattttttttgtgtcaaaatgaacatgggat
-tgatatctaggtaatacaaggaagccctacaaattgacaagaaaaattcaggaattccaa
-ttttaaaagtgggaaaaataaaaataaaatgtttaaaaagtgaaaaaataaaatttaaaa
-ttaaaaatcaggtgaataagaattacatgattaaaacaaatttaaacagttaaaataaca
-ttcaaaaacgaaattaagtaacaaaataaaaatttaaaaataaggtataaaaataaagtg
-taaaaatccattcaaataaaaaatacatttgtaaaataatttaaatacattaaaattaat
-aaaaacaaaaatgttaaaaataaaagtaaaatgtttaagtgaaataaaatttaaaaatgt
-aagaatacatgaaagaatttttacgagtaaaataaaaaatcagctatttttaacaatcta
-aagaataaagaaaAACTAATAGAAACATCAAAGGAGAGCAAGGTCTTGCTAGATGGATGC
-TGATGATGTGCTGTGAATTAAGGAGTCCGATTGGCTCAAATGCCTGCAGGGAGGCGGGGG
-AAGTGAATGACGGGGGTGGTGTAGGGAGTGAGAGGGGACGAGGAAGTAAAAGCATGCCCG
-CAGGCAGCATCTGATTCGGTTTTTCCAGCCCGCTGTGGGCAGAGGGCAGGAAGTCAGGCC
-CCATCATGGCTTCCCCCCAAAATAGCCATCACATCATTTATGCATTTGTAATGTGCTGGC
-AACATACGCACACGCACACGGATGCATGTTACATCATCCCATCCTCACTGCCCCATCCTC
-ACTGCTGTCCTCTGAGGTCCACTTTCttttttttttttttttttttgagacggagtttcg
-ctcttgttgcccaggctCTGAGGTCCACtttcatagaggagtgaacagagactcagagag
-ggtgggtcactgtgccacagtcacacagcACTTAGGACCACCCTATCCTCTGAATCTGGC
-ATGCTCAAAATGACCTTCTTTGGATGAGTTAGGTCTGCTGAGCACTTTCAAACAGAGGCA
-GGGCCATCTCTGACATCAGGCTCGAACGTTCTGTACACTAGGAAGAGCCCAACCTCTCCC
-CCCATGACGCATGACAGTTATCaccattaaagaaacactgactgtcttccaggggcgtca
-catgcatagtcatcttgaaaaccatatgaggtagatgctcttattgtccccattgtattg
-acagacaacatcgagattcaggagtcaaatactgtcacccaagcatggcagtaacagaac
-tgggagctgagcccaggactgtccacagcccaaatctcacactccctgcgtggcaccagg
-cCCTTTTAACCGTCATTGATGAGCACTCCCTATGTACCAGCAATGCGTTTGTCTATGTTT
-CATGcctcattttgcaaattagccaacgggggcacagaagggagagatgacctgcccaag
-gtcactcagccagtaagtggcagagccCACAGCCTTCGTGACAGCCTGCCAAGCCCCCAG
-TGCTCATCCGGGACTTGCTAGAGACAGCTGTGCCCACTGGCCAACCCCAGATCAGGCTCA
-GAAGGGCAACTGTGACATTCCTTCTCTTCATGTCTCCACCCTGGCGGATGTGGGCTCTGC
-CATCGGGCTCCAGGGAAAGTGGAGGCTTCCAGTGAAAGGGAGTGGTTTCCCCATGTGGCC
-TGGGTCCTCTGGGCTTGGGAATGCCTCTGTTTTGAGCTGGTGAAACAGAATTTCCCACCC
-CCTCCGCAATGGCACATCAGAGCCCCCACTATGGGCCACAGAGCAAGGGCCCTATGAATC
-ATGCTGCATTACTGCAAGAAATCATTCCAGGGCAGGCAGTGGCGGCCCAGCATGGGACAG
-CAGTGTCCGGGTGGAGTTGGCGTCACCCATCCGGAGATGGGAAGCAGACCATTCCCGAAG
-GGATCTGGAAGAATCTCCGAGGGCGGGGCTGAGGGCAAATGTGTCCTGGATGCTGCTGTT
-CCACCgggctaggaaaaaaagctccagcccacagagacctgggagcacatcacgaccttt
-ccccagcctggctgtgtgtccttggcaagttgattcccctccctgaatgtggaaggcctc
-atctgtagaagagggagaataatagggtcaagccacttcatggggctataatgtgggtAG
-CCTGGGAGGAGGGCtggcatggtggttatggactcaggctttggaatcaattgtctggat
-ggaatcctggtttttgccaaacttactctgccaagctgtgGggtagaaacatgaaattgc
-taatatttggctgtttatgacctagaaaaatggcaactgcatatacttcaaTGAATGTGC
-CTctcttttaactgcttcctcctctgtaaaatgtgggtaataacaggcccctcagagggg
-tgctgtgaggatgaaataagGCTgggaggcaattaagttcagtagttagagctgggctct
-ggggcaaggaaggatttgaaccttggctgagtggccttgggcaaagttacttaaccttcc
-tgtgcctcagttttcttgtctgtaaaataggaatgctactgcccactgcacaggtttatt
-aaggtaatttaatcaattaatacatacaaagtacatagaacagtgtctgAAATTGTTACA
-TAAAAGAATGCAGGTAACATCTGGCATCTCCTGCACCCTCATGTCTACTCACATAAATGC
-TCAACCACGAAACAAAATCCAAAGTGACTTTTGTAAACCTTTGATGCCAATGAAAGTTAA
-GTATTTTTAAAGAAAAAATATGTTTTGGGGAACATACATGTGTGTAGAGATGTAGGTGAG
-GAGTGTGCTCCCCAGGGTCCACCCCCAGGGCTGTTCTATGTCCTGATGGTGCCTATAGCC
-CAAGACTCTGAGGACAGGACTAGCCTTGAGGCCATGATGGCCCCGTGGCTTGGTCTCTTT
-CACAAAATCACACAGCCAAACCTCAGACCCTATGGAGAGGCTCCACTTGCCTAGGTAACT
-CTAGAGGCCCTTAAGAGGCACCCAGCCCTGGGCTGGCCTCTGATTATTAAGAAATTCCTG
-CAGACAGCCTTGGATGTGCGAAAGCCCTCCAGCTTCCATCCTGTCTTAAtttttttttag
-acgaagtcttgttctgtcacccaggctagagtgcagcagtgcaatctcagctcactgcaa
-cctttgctttccaggttcaagtgattctcatgcctcagcctcctgagtagttggtagttg
-ggattacaggtgtgcactaacacacccagctaatttttgtatttttagtagagatggggt
-ttcaccatgttggccaggctggtctcgaactcctggcctcaggtgatctgcctgcctcag
-ccttccaaagtgctgggattacaggcgtgagccactgcgcctggctCCATCCTGTCTTCT
-GACATTTGTCCCAGCCCTGGGAAAAAAGGCAAAGCACACTGAGCATTTCCAAGTCACGCG
-GGGGGAAACTGAGGCTCTGAGAGGCTCTCAACCTATCAGGCTCTGGAGCAGGCTGCCTTC
-CTCTACCAATTCAAGTTTTGCCTTCACCGCTAGTCTCCTgaaccctcacttctactcaca
-gctgggtgaccttgagtaaggtacttccctgcttgagtctccaattttacaaggattggt
-ctcaaaggtctcacttggcctttttggccttatcacttcattattctaGAACCCTTCTCC
-AGAATTTCAGAGAGAAAATGAAAGCTGAATTGCTCTGCAAACTATAAAGTGCTACACAAA
-CAAGAAGGTGGTTAATGGCAGCATTAGATGGGTTTTCAGAAGTCTACCGTAGGCAGGATT
-TGCTGTgggttttggaattaagaagacccagctcacacatgtatttgcgacgttactttg
-gataagccagttcccctctctgaaccaacttccctcttctgtaagctggcggtagaggca
-tatccaccaggcaggactggggtgaggaccaaaggaaaggagcgtgcaaTGTCTGCCACG
-CCCTGGCCGAGCAGAGGTGTTTGATGCAGGAGGAGATTTAGGGCCCCGACACATCATTCC
-ACCTTCCAGGAGCTAAAATCCACACACCTGGGGAATGATGTAGCTGTCAGATTCAGGGCG
-ATTAGAAACAAGCATCTGAACTAAGGCAATTGTTTGgagctccagagacagactctctgg
-gcttacatcccagcacccctgtctgttgctataccacccactgggcctcagtctcctcat
-ctataatataaagatcctcctggaatctgccccttacagctgtcaggagggcctccatta
-ggccatgactgaaaggggctgagcacagAAGATGGGCTCAGCTGGTCCAGCAGCCTCCAC
-ACTATTTTGACAATGGTATCAGTAGACACAGTAGTacacacgtgcacatgcatgcacaca
-ctcacatacatccacatatatgtgcatgcacactcacCCactcatacacccattcacata
-tatgtgtaaactgaaacacatttctcaaaataatagttttcacacttgcaatgcactctg
-atatattctaaaaaggaggttggcaaaaatcgcagcctctggaccaaatttggatgtttt
-tgtgttgcctgtgagctaagaagagtggagtacatgacagattgtatgtggtttgcaagg
-cctaaagtatttactatctgacccttcgcaaaaaatgtttgctgaccccactctatttta
-gtcagtgctattccattccgttctgttccgttccattccattccgttaccattccattcc
-atttcattagaaaatgctggctattgctaaatttattgtcctcacctgctgatgcattgt
-aaacctcagcttggaaaacTTTAAACTAATGGGAGCTTCAGTTTTTTCACCAGATGGGAG
-GATGGATGAACAAACCGTATCCATGTGACACCTTAGCCAAGCAACCTCCCCTCTTTGTCT
-TGGATTCCTCGGCTGAGGCTGAGACCACCACCACCAGCCTGCTCTCAAGGGTGTGTTGAG
-GTGCAGCCTCAGAGGTCTTGTCCATGATGTTCTCATTGACGGATCTCaagagcccaatag
-taaatactttaggctttttgcaccacatacgatctgttgcctattcCAGTATTCTTAGCT
-TGAAGGCCATACAAAAATAGTCCTGTGGCGGCAGAAATGGAGGAACACCCAtctctgctg
-tccttttcaatacccagcccagggcctggcccacaggaaggacccaataagtatttcttC
-ATGGTGATGGTGACTGGAGAGTGGCACCCAAGGCCCTCCATGACGGGACTCTGGCCCAAT
-CTGCAATCAGAACTTCACTTCCTTCGGCCACGCAGTCCCTTGTCCCCTCCACCTGGCCAC
-ACTCTCTCCTCATCCTGCAGAGGTCCTCACCTTACTGCCACCTCTGCCTGACAAAATCCT
-AAATCCTACTCCCCCCGATGGGGTTCCTCTCAGACACTTACACCTTGCAGCCCTGGCAAA
-TCACTGGCATGATTCATTTCTATATCTATTgcacgggcttcggagcctccaaaactctgg
-gtccaggtcctggctcagcagctgtgagctctttggcaggccattgatgctttctgagcc
-tcagttcccgtgtctgggaaataggcataacaCAAGGCAGTGGCAGAGTGAGGACGCGCA
-GCCCCACCTGCACAGCTCCTGGCACATGGCCCGCCTCCCTCCTTCCTCAGTGGCCTCAAT
-CTCAGTGGCCTGAATCTCCTTCAGTGGCTGGGCAGGGGGGTTGGATGGTTTCCGTCCACA
-GGAGAGGGAGGTGGGGCCCCCCGTGGTGGGGCAATGGGATGGAAAAGCAGCATCTCTTTT
-GCACCCAGGCTTGGCTTCAGAACGCTGAGTGGAAGAAGGATGGCAAATGGAGCTCAATTG
-ATTGACCACCTACTATCTGCCAAGCATTCAGATTTCCATTTCTCAACCAGCCCCTATGCT
-ATGAAGAAACCGAAGCCGAGAGACCCAAGGTTACATTCTATTAAGACTCAGCGCCATTCC
-CTCAGCCCTCAATGTCCAGTCATTACCCACCCCTGCCCTGTAGGAATCCCTTTCAGAACT
-ACCCCTGCATCTAAACCTGGCTTCACCTGGATGCCAGCACTCAGGGGACATACTTTGTTC
-GTGCCCAGCGATGGCGCCTGCTTGCCCAGGGCCTGGTGCATCTGTCTGTGTACAGGAGAC
-AGtgctgtctgcctggccctccacaaggggctttgcaatttaaacggaagcatcatattc
-actccacataacaggcctctggagtgggcactgccacagtcaatttacaataaagaaaaa
-caagctcagagagaggagaaggtttgctccggatgcaccacaagcaagaggcagaggtga
-gcttaacccacgtgagaccccactcccttccggtccagggcatgtctgctctgcTGTAAA
-ATGGGAAGGGAAAGTGGTCAAATCCttatgaagcccctactgtgtgcctttggccccctt
-ccctcttggactgcagtaaatcttcccaattgctcagagaggtaggtgtaagttttccca
-tttcacagatggggaagcacggacgggagaaggcatgtggcctgcttaatgtcacatatc
-tagggcaggagagggctcaaggtttgatcccagggctcttcactTTGCCCCTTGCTTGCT
-CAGGTCTAGAAAGATCCAGAAGCTCCATGTGAATGTGGGGGTCCCTCCCCAGAAGGCCTT
-GGATGTCAGGGAAAGTCAGTCACAGGCTGGCATCTCCTCCTTGCCCAAATGGACCTCCAG
-ATCTAGGGATGCGAACCAGGGCCCCCTCACTCTGCCCTACTGTCCCATTGCCAGGACacc
-ccagcatgtttcaaaaaaatgtccccatctggttctgattcatttacacttcattaatca
-acatgctgttttgtaagagacacttgagatccaagaatctttctcaagtcttttacttca
-ttctttcttagaaacagaaaaattgggcttcattaagaCGCAGTGACGCCGGAGCCTGAG
-GAAGGATGGGCCTGTGGGAACCAGGCCTCAAGCAGGCTCAGAGAGGGCAGATGCCAGCCC
-AGCACCTCATTCCTCGGGATTGTGCAGACCTGGCCAAACGCTAAGGCCAAAGACTCAGGC
-ATGGGGGAGGCTGGAGAAAGGTGGGAAAGGGTCATccctctatgttggcagctccccaag
-gacaggcccagggctgctcacctgggtatctccaaggtccccaacacagagcctggcaca
-gaggctgccctgtgaaatgaacaagtgaatgaatgaaGCACTGCCAATACCCAGGTGTTT
-TCAGGACACATTCTCCTGCCAAAGTTAGATAAGGTCAAAGCTGGTAGGACCCTGAGGGAT
-TGTGTACAGAATTTTCCAAGCAGATGCCTTATGAGAAATGGTCTCTGATGTGTAATATGT
-TTGGGAAAGGTCACTCTCTCTCGCtctctttttttttttttttttttgagacagggtctg
-ctctgtcgcccaggctggggtgcagtggcacaatcacggctcactgcagccttgatgtct
-ttcctgggctgaagcgatcctcccacttcggcttcctaagtagctgggactacaggtgtg
-caccaccaccaacatgcctggctattttttgtatttttttatagagacaaaaaatgtatt
-ttttgtagagttttgccatgttgcccaggctggtctcgaactcctgagctcaagctatcc
-tcccatcttggcctcccaaagtgccaggattataggcttgagccatcgcacctggGTTAC
-ACTGTCTGTCTCCACCTCTTCAGCATgctctgataagtctcacagccaagaaatctgcta
-aacccagcatttcccaatctatttgaccagaactCCTGTGGCTGCCTTGCAAAATATGCT
-ACAGGAAGGGTTTATCTAGCTCTGGTCCCCACTGCAGTGCCAGTGGGAAACTGAGGCTAT
-GGGCGGGGGACAGAGAAAATCCACTCACCCAAGGTCACATGATACAACTGGGTCAGGGGT
-GTGACTGAAATCCAAGGCTATCTCCATTGTACCCCAACAAATAAATGGAGCCCTAAGCCT
-CTTCTGAAGATGCTAGGCAGGTGTGTGTCCCAGAGGCAAGAGATCAGGTACTGGAGGAGG
-GATGCTGAGAGCCCCTCACCAAATTGCGGCCATATCCCTACCTCCTCACTGAGCTCCTGG
-GGAGGTGGTGGTGAGCTGTAGATGGGGCGGGGGGCAAAAGGGGCAGGATAGGAATTTTTC
-ATTTTTCTTTAATTTTTTTGTCTTTTTTgagctgagaagcatcttaaagtcttctaaacc
-agctcctttttgttgttgttgttgttgttgagacagagtctcactctgacacccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctctgcctcctgggttcaagcgactct
-cctgcctcagcctcccaagtagctggaattacaggcgcccgccaccacacccagctaatc
-attgtatttttagtaaagacagggtttcatcatgttagccaggctggtctcaaactcctg
-atctcaaatgatccgcctgccttggcctcccaaagtgctggtattacaggcgtgagccac
-cacacctggcctaaaccagctcctctttagatgaggaaactgaggctctgagaagggaag
-ACCAGCACACCTCAGAAGATATCTTCTCAGCATTATgtcaggcagattgggattcgagcc
-tgctttgctactcacctgctgtgcgaccttggacaagtcagtttccttctctgaacctca
-gttccctcatccagaaaacaagcatCTCTCCCCTCCCTCCACTAAGCCACTGTGAGTAGC
-CAAAGACACAGTGGACAGGAAATGAGAATGATTAATACTTACGAGCACCCATTAGGAGCC
-TGTGTCCTTAGCTACTCATCTTGCCCACAATCCTCCTTATGAGCAGGATACTTAAGTAAA
-AGATGGGTTGATGAAGGGAAAGGGGGTTTGTTTGATTTTTTGGTATTGTttagaatggag
-aaagatctcagagatcttctaaaggaccctcagatgggtaaagtgaggattggacaggca
-aagtgacttatccaaagtcactcagttggtaactggggaagctgggatttgaactcagtt
-gacctggctccagagcccatgcccctaactactaAACAAAGGCCATTCACAAAGGAGTGT
-CCCCATAGAGTCCCAAACTCACCCCAGCTCAGCTGAAAACCACACGCCTCTCTAGTCCCT
-TGTCCCACTGTCACAGCAAGAACTGGAGCCTCTTGGGCCACAGTCTCCCCAACCCCATCC
-AATCCCACCTCCCAATTCTCCCACAGCCTCTGTCTGCTTCCTGCTCCGTTCCAGGAGTGA
-CTGTGTCGCTGTAGGGCTTTCACACAAATGGAAGGCCCCAGAGGGCAACCCATCCTCTCT
-CATTTTCCTTCCCCTTTATCCTTGCTCAGACCCGATGCCAGGGCTGGAAAGAGAGAAGAC
-accagctggacaattcagcagttatttaaaccagtctgagccttggaatcccaggcttta
-ttaaaactggacgacccctatgtcatgagcatatagttgggatttgatgagctaggacat
-gaaaaacccgtggcatagtggctggcaTTCGGCTGCTGATCTTAAGAGTGGCACCTGGAG
-GCCAAAGGGCTGCCCAGCTCAGGCAGGCGATTTGCTCACTTGCTCACCCGCTTACCCTTC
-TCTGAGGCACAGGCTCTACCAACTCCTGCTCTGCAGGGACAGCCTCCAACCCACCTTCTG
-AGGATGTTCTGACTCTCACAGCGAGGCTGTGGCATAGGACTCCCAGGTGAGAGCGCATGC
-GGCCCCTGGTACATTTATAATCTGAACCTTGGCTCATCTTCCTAGTGGCCTGAGAGGTGA
-agatggaaaagctgaggctctctgaggggctggacttcttctaggtcatcccctattaga
-ataagtgaacctgaactcaggtctcaggtctggctgaactcaaCATAGGGGGGCCATGGA
-GGATCACTGCCCTCTGGGAGGTGACACCAGGAGTCAGGGTGAGTGATGAGGCTGGGACTG
-GGGCCTCTGGACGCCCAGCCCAAGGCTCTCTATGTCACTTCCTGGCCGAGCATGGATGCT
-TGGAATGGCTTCTACGCCACTGAGTCTGTCTCCTAGTCCCTGTGCCCCGCAGGCTGGCTC
-TTGAGTCTTCTGTCTCTGCACGAAGCCATCCTCCTTTCTGCTGACCATGCGGCTACTACA
-GAGAGCCCTGCTACCCTCTCCCTTCTGGGTGAGTCTCCTTGGCCCACCCTACTCAATGGC
-TCGCTCACTGGGTGCCCTGGAGCCTCAATCTCCCCATCTTAAGTGAGGTTGAGACTCGTC
-TGGAGGAGCGAAGGACCCAGGGCGCCAGGCACCAGGCAGATGCCCCCAGAGCCGCCGCCC
-CCGGTCCTCCGGCCCCCGGTCTGCCCCGCAGCGCCTGCCCGGCCGCCCTGCCCAGCCACC
-CCTTGTACCTTGCTTCTTCCTTCGGTTCAGGGCGAGCATGTCCACGGCGTGGGCGACGAG
-CAGGAGCAGGCAGAGTGGCGCCCGCATCTGGGCAGCCGGATCCGGGCTGGCGCTCCCCAG
-GCGGCCCGACGGCCCAAGGGCCCCACGTcccggcggcggcacggcgggcgcgggggcTGC
-TGTGGGCGCGCCGGGCGCATCCGCCAGGCGCGGGTCGGTCCGGCCGCCAGGTCTAGTGAG
-GGCGTTGGCGGAGCCGGGGCACTGCCCTGGCGGGGAGGAgccggcgcggcgggggcggcg
-cgTTAACCAGCTcggggcccgggagcgcgcgcggggagggggcgggggTCACCCGGGTCG
-GGGCCCTCGAGTTCGATCTGTCCCGCAGCCGGCGGTCTTGCGTCTTTCCCGCCCCCAGCA
-CTGCCCCCGAGCACGTGCACGTGCCCACCGCCAGCCACAGGTACGCACGCGCGCGCAGGT
-ACAGATGCGCGGACACCCGGAGACCCGTACGGTCCCCCGCGCCCTCTCAGCGCCTGTGAT
-TTTCTTTCCCTCCCCCCAGTCCCCTTTCTCTGTCTGTTCCTCCTTCTGGCCCTTAAGGAC
-AACTCCTTGTCTCCTGCTTTCTCGGTCTTTCCGCGGCCCGCGCTCCCCTGCTCTGCCCCC
-GACCCTGCCTGGCTGTTCCTGCATCCTTTACTCTTGCCGGCCGTCTCTCTCTCAGGCTCA
-CTGTCTGTGTCCTCCTGGCTGGGCCTCTGGTTCTCCCTTTTCTCTGTCTCTCCCTTCAAC
-CCCATCTCTCCCCTTCTCCCCTCCTGCAGGGTGGGGTGTTTGCGGGGCTCCTGCTGCCTG
-GCTTTCTCTTTTTCTCTCTACTCTGTCTCATTCTTTTAACAGAGGCCTGAGCCCCTTCTG
-GCCACTAACCCTGAATGTTTCCTGTGCAGTCTGCGGGGATCATCTACTCCGACTCAAAGT
-GACCAGCACCTCATAAATCCACTTGTGACAGGGCTGGGGACCTGGACTGTGTTTCCTCCA
-ACCTTATCACCAGGACTGGGAGCAGCTGGTTCAAGTTTAACCCTTTCAGAGCAAAATTCC
-TCCTTCAACCCGACAGCATGCTCACCTCTCCTGTCACTATAACCACCAAAAACAACAACA
-ATCATGCTagctatcatttgtgaggcatatatggtgggcattgctaagaacttgacatat
-actagagtcttcaaaacaacccaatggtttgggtttgtattctgagtaattccacttttc
-tggggagcaaagggaagctcagagaggccaagtgacttgcccaaggccacacagcaggtc
-agtggcCATTCTGGTCCAGTGCCTGCCCCTCTTAGCCACTTCTCAGGCACAGACTCATCA
-GAATGGAAGAGGCCTTGGAGGGAGGCCTAGAGAAACTTACAGTTGACACTCTCTTGCTGA
-ACAATTGTCCTTCCtttttcttttcttttttttttcttttttttgagatgggttttcact
-ctgtcacccaggctggagtgcaatggcgccatctcggctcactgcaacctctgcctcctg
-ggttcaagtgattctcctgcctcagcctcccaagtagctgggattacaggcacctgccac
-cacacccagctaatttttgtagtttttagtagagacggggtttcaccatgttggccaggc
-tggtcttgaactcctgacctcaagtgatccacctgcctcagcctcccaaagtgctgggac
-tacagacgtgagccaccccacccagccTGTCCTCTTTTTTCCTACATGTGGAGCTTGCTC
-CAAAAGAAATGGAAGGTAAATGCTGGTATCTCCTCCAGCTCCTTCTCCCAGTGCAATGAG
-GGACACTTGAAGGCATGGCAGGGGCAGGGGAAACACACAGAGAGTGTGGCAGCTGAAGGT
-ACAGCCCTGGCCTGGCCATTCTTTCTGTGGGGCCCCAAGAACGCTGGCAGACAACACGGa
-gaacttggtggaatgtcagagacagcccacccaaagtgctccatttcacagatgaggcca
-ctgagccttcaggactggggggtgcctagattaggccacccagtgagtcaaggactgagc
-tgacatgggcatccaggtgtccCATTGTGgtcatcaccatggcctgcaaggacctcttgt
-tctgatatctctgatctcagtctttcccactgccccacccctctctctttagccttagag
-atttcagcccttgaatatttcacaaacaccacaggcctctcacacctctgagcttttcat
-gttgtggggcctctccatggaataccatcctatatcctacctccttcttcactgcctctg
-ctccaggaagccttccctgattctcaggccaggtccagtgcctcctctgggcatccacaa
-tctctttatcacagctctgatcacatcaggtggtaacaatggatgtgtctgttctccttc
-caaactgccatctctttcaagccagagccagacacacagcggtgctcagaatgtttgcat
-aatgagtgcataaataaatgaatggtgaatgaatgaatTCTCCAGATGCACAAGTCTCCC
-AGCCTGTACATGGAATGCAGGTACTTGGAGAAATGAGGTGACCCCAGAAGATCAAGCCTT
-AGGAAAGCGGAGGTCATTCCCTTCCCCACTACCCCCAGTACTGGAGTCTCCAAAGTCCAA
-AGGGGACAGCTTCCATGTGAGCAGGGCCAGAGAGGTCCAATGTGCATTGTGAATTGacag
-ccagccacacggctctgcaggatgaagctgcttaccccttcttgaattttttcccctatt
-tattccccactgcctctgctctagctagcctcgtgtttctcagactcttgtcactcatcc
-tgcggtttttgctgttctctctgcctggaaagtctttccccagatttggggcttgtctcc
-cctcgatgttgcctcctcagagaggccccctgtgaccactccagtaaaacgcaccaccat
-gcactttatcctcttgtcttgctttaccctccgtagtacctgttcatgtctgtcagttcc
-tgtttgcttgtttgtgagttccatgaggacaggaatcttctattttgtccctatgtgcct
-tacactgcagtgattaagacatacttgtggaatggatttttttaaaaaatgagtgaatga
-atAAGCACTCATTCATccatagattcattgtgggacctcaagtactttctgttctcttag
-gctcaatttccccagttgttcaatggcacagatgggattttgtgttctgtgagagcccct
-ttagtgcttccagaattggatatttctagggttcTAAGGCCCAGAACTCAGGGCCCTTCA
-TACCCCAAGATGCTCAGAGGGTGTTTGGTTCTCTAACTATGGGGGCTGTCTGGGCATCTT
-GGCCTGTTATCCAGTTCCCCTACCCCAATACAGGTGCCCAGGGAGGCTAGTGATGCTGAT
-GGCATGCTCTGGCGGGGGGCGGGGAGGGGTGCACCCAAGGGTGTCAGTTAAGGCACCATT
-GTCACAAATAGATGAAGACAGGTATAATGGCTGAAACACACTAAGCTCACAGCATGTGTT
-CCTGATCAGCAGATCCTTCTCTGTGGGATAGCAGGAACTCAGATTCCTTTCAGCTTGTGT
-TCTGCCCTGTTCAGTACCTGGTTTAAAGCTCACCGAGaagggcagggcttatgggaagta
-cagagcctgtctacctatgtcccattggccagaactcagacacacggccacacctacctg
-caagggtgactgggaaatgtagtccagccatgtgccagacaacacacaggaggaaaagca
-agaatttggtgaacatctggccCATTGACCAACGTTGGgccaccctcatttcttgcccca
-gtcatgcagtagctccttcctgtgtctgctctgacccctacaagctcttcttaagcagcc
-agagGACATGTATTATTCATCGGGTGAAGACCAAATTTCTCCTCAGAGATGCAAGGGCTA
-CGTGATGGCCCCTACTAGGGGGCCATCTGCtagggtgaccagctgtctggtttgccaggg
-attgaggggcttcctaggatgCAACGTTGACCTGTGTGTAGCCTTGtataatacaaccac
-aatcaagatatttaaacatacttaaacaagatactaaaacatcatcacaagactccttca
-tggtatccatttatggctccaccctccctctccacttccagtcctaatccctagcaaccg
-ctaatctgttctccatctctgtaatgttttattttttgagacagggtcttgctgtgtcac
-ccaggctgaagtgcagtggcacgatcatggctcactgcagccttgacctcctgggctaaa
-gcttctcctgcctcagctgtgtagcctggactacaggtgcatgccaccatggctggctaa
-ttttttattttttgcagaggtgaggtttcgccatatttcccaggctggtcttgaactcct
-gggctcaagtgattcttccacctcggcttcccaaagtgctgggattataggtgtgaatca
-ccacgcctggcctcccatctctataactgtttttacataaatattgtataatggagtcat
-gcagtatgcatctttttgagatttggctttcttcactcagcacaatttgtttggagattc
-attttagttttgcatgtattagttatttgctttttactgctgagtagtattccaccgtat
-gaatgtaatatagtttgtttaaccattcacccactgaaggacatttgggtattttctagt
-ttttcattattaagaataaaggtgccatgctcacttgtgtataggtttctgtgtatcctc
-tttggtgaaatgtctgtgcatatctttcacacattttaaattggatttttacattactat
-tgtgttttaagagttctatgtatatattctatatagaagttctttgttggttacgtgatt
-tgcaaagcgtgagatttatgtcaaggttcattttgtatttttgtttatttttttatgttt
-ttgtttgtttatttttatgttcgtttttaatttttgtttatttcgaggttcattttttat
-ttttcgtctgcggatgtccaattgctccagtatgctttgatgtaaaagctttatcaaaaa
-ttaattgggcatattggcatggatttattttggggctgtctcctgtattccatgggctat
-gtgtctttctgtctaccaatactacactgtactgattactgtaactatataataaatctt
-gaaattgggtagatggatccttcccactttattcttctttttcaaaattattttagctat
-tctagttcctctgccttttcatatatattttagaataatcttgtttatatctaccaagaa
-tcttgctgtgagtttgattagaattgcattaaacatgtatatgaatttgggaagaattca
-catctttactatattgagtctttcaatccaaaaacatagtatgtctctccatttgtttag
-atcttctttgacttttttaaataaatgttttgtcattttcagcatacaactcctgtgcat
-gttttgttagatttatacctatttccttttttctcccttagaaattatacatggtattct
-attttaaattttgctgtccgtgtgttcattgctagcagatagaaatacaactgatgttcg
-tgtgttgatcttgtatcctagcaccttgctgaactcatatattagttctaggagtatttt
-tgtagatttttttgggttttgcaacattgacaatcatatcaactgcaaatagcgacagtt
-ttctttccttctgatcttgtgccttttgtttcctttacctgctttatcaaacttgctaga
-acttccagccatatgccgagtaagtgtgatgagcatagacatccttgttctcaatcttgc
-ctggttcccaatcttagtgggaaagcattcagtcattcactatgacattagactgtagga
-cttttgtagacactctatatcaccttgaggaagatcctctctattgctacttttctgagc
-attttttaaaattatgaatggctgttgaattttgtcaaatgtttttcctgcacattggta
-taatcatttaatgtttattctttagtctactgatacgatgtattacattgattgattttt
-aagtataaaaccaacctttcttcaatggaataagccccacttggccatggtgtaccattc
-tccattatatactgctgaattctacctactaatattttgctgaggatttttgtgtctaaa
-tccattaagaatattggtctatatttctcttttttgttctgtctttgtctggttttggta
-gcagggtaatgccagccccagtagcaccagaagaacaaggcttactagaatagaattgca
-agggttccaggccaagtgcggtggcctatgcctgtaatcccagcattttgggaggctgag
-gtgggcggatcacttgaggtcaggagttcgagaccagcctggccaacatggtgaaacccc
-atctctattaaaaatacaaaaattagccacgtgtggtggtgcatgccagtaatcccagct
-acttgggaggctgaggcaggagaatcacttgagccctggaggcagaggttgcagtgagcc
-aagatcgtgccattgcactccagtctgggtgacaagagcaagactcctctcaaaaaaaaa
-aaataaataaataattgcaagggttccaacaagtttactgtcattggacctaaagcccac
-aaaagtaaacgagaactcacatgctacatttaaacagggaaactgctgcctgctaaacta
-aagtatgaaataagacctgaagttccaactgatgctaatactaaaatgactcagatgttg
-aaattgtctgacaaggattttaaagcagtcatcataaaaatgctttggcaaggaattatg
-aaatctcttgaaacaaatgaaaacagaaaatctcagcaaagaaatggaagttatataaaa
-ggatcaaacagaaattttagaaatgaaaaataccataactgggggaaaaaactttgctaa
-tggactcattagtacagtggagaagTTCAGtgatggacaaataccccaactctctattga
-atgggcaggatggccggacacataaaacatgccacgctgtctcctgccacaattccccag
-ccctgccatgctgacttcagagggactgagcttcagttgcccacggtgctgtctgggtaa
-cctgtccttcatgggctgcctgcccttcctgtttcactccttatgctccatgctatgctt
-cttgggatcaattctcaaatcaatttcttgaactcaaatccttgtctcagggttggcttc
-tggcaaccccaaaccaagacTAATTCTTACTAATTCTCATGACAACCTATAAGGTATTAC
-AGGTAAAACATGGAACAGCACCTAACCCAGAGTAAGTTCTCACTGGTAACTTTCATGATT
-GGTGCCTCAGTTTTGTTATGTATAAGACAGAGGCATCGAACCCCTCACCCTCTTCCTCTG
-GACTTCTTCTTGTTCTCCTCTTAAATCAAAATCTCTGCAAACCCACCTTTGTTCTTTGTT
-TTACCTGTTCTTTCCCAAGGGAAGGCAAACAGCCTTCTCCCTGTAGGATGCTCAGGCAGA
-CAAAGGAGCTGCTTCAAGCCAGCGCCCCTCCCTCACCAACCCCAGTGGAATCCCAGCCTC
-CACAGTCAGTTGGGTTGTTGTTTTTTATAATACCAGTGTGAAATAAATTGAAAAATTACC
-CATAAAATACAGGTTTTCAGCAGCTGGCCTGAAATTTCTTTCCATAAACAAACAAGTTTA
-AAGAGATGCCTGATGCCACCCGCCAATCCCAAACTTTTATGTCCCCATGTGGCAGTGGGG
-TCTGCCGGGAGATTTGGCCTCCTGGGCAAAGGCAGGCTGCTGGGGGCCACAAGTCACCCC
-TAGGTCTTTGGGGCTGACTTGTACTTCTCAACCGTATCTGTCTGCTCCATGAAGAATCCC
-CCAGACTCATCCCTCATCCCCCAGCTCCTACACTCagcatagacttgggagccaaactgc
-ctggatttgaatcagagatttccacttattcagtgtgacttcaagcaagttacttaatct
-atctctgcctcagtttccccaactgataatgctgataatagtagtacctacttcatagga
-ttgtttgtggattaaattagttaaatatacatgaagttcttaggacatggcacaagacca
-tgctgtataactgttagctattattAGTCGTCCAGGAGGAAGAAAAACTAGGATGGAAGC
-TACAGCAGGAGGCCTAGTGACATTTTGATTTTCCCACAATAAGCTTTCTCTGGAGTTTCC
-TTCAGGGTGTTTACATAAATGCCTGTCCAACACTCTgcagtttgcaaagcttgctacatc
-tgctatctcatttggatcaacatttaagccatggaaggagttaggacagaggttgtgatt
-atccccattacccctagtttacagaagaggaaactgaggcccagtaggtgaattgacttg
-ctcatgatctcaagaaggggtagagccaggaCCCCATTTCTGTAGCTTGAGGATCCGGGA
-CGCATCTTGATTCTTGTCACACACTGAAAGCAGGTCAGAGCCCTCCTGATCCTGCATCGC
-ACACTGAAGCTTGAACCTCATCCTAGACCACAACATAACCCTGGTCTCAGGTGGGGCTCT
-GACCCCATGCTTGACCACAGACTGAAGCCCAGATTAAGCCTCAGTATCGGTTTGAGTCAG
-AACTCTGAATCTCGCTTCACACTAGGCCCTGACTCCAGCCTCAGACTGATTCCTGATCTT
-TGTTATAGGCTGAGTCCTAATCCAGGTCCCATATTGACTCATGATCGTGATTCCACACTG
-TGCCCTAACTCTGGCCCCAGACTGAGCCCCCAGTGGGAGCCTCTAACTTGGAACTCCATC
-TCTAACCCCATCTTGAATCTTTTGTATAAATCCAATTGCCCATCTTCCCCAGGCTTTGGT
-CCATCTACCTGAAAAACAGAGTAGGGAAGAAAGTGCTCAGCACCCTTTGGAGAAGGCCCA
-GGCACCAGAGCAGAATTTACAATCCACCACAGGAAGCAAGACCCTCATCTCATCTCCTGT
-GTTTGCAACTTCCTCCAACTCCACCCCAGCTGGGACAGCCTCAAAGACCCCAGTCCTCCT
-GACGCCAGAACTCTGAGGAGTTCTATTGTTTAGGTGGTTTTCGGTTTTGATTATTTAATA
-CAGTCATTTCTGGTTTTATATTCACAGCTTTGGTCAGCTGGGATAGGGTTTTTCTTCTTC
-CTGTGGTTGAAGTTGTAACACTATTTCAAACAAAGGAAAAATTTTAAAAACAACAGTGAA
-AATATTTTCAAAATATGTTCACAATCAAGTTAATTTCTTGGTAATTGGCTGGGGAAGAGA
-AGGGAAGGACAAAGAGAGATTTTTCATAATGAAGGGACAGCAGTTCTCTGGTGGGCTGGG
-GGACAGCAGGGTGGGGGCCAGCCTTGGGTCTCAGTCTACACAAAGGTGGTAATGGGCTGG
-GGGAGATAGGGATTGGGAGCTGGACCCAGGACAGTGGATGAGAAAAGCCAAGGTCAGGCC
-TCTAAATGTCCCACTCTGGAGGGAGTTAGGACCCGGAGCCTATTTTTCTCTGTGTGCCct
-taattctgggcctcacttttttcatctgtgaaatggattcaataacacctgcccaaggag
-gactcttgaaattaaaagacaaggtggctgcaaagcacccagcacaaggcctgacactga
-ggtgtacaagtaatagtagttGATGCCATCATTATTATTTGTATTCATGGTTTGCCAGCC
-CAGAGGCTgtagaacctggtggtacagggaagcctgagtcagacaacctggattcaagcc
-ccagttgtgccacttactacttatgtgacctccggcaagttgctgagcctctctgacctt
-tggttttctcatccataaaatggggatagtaactgagttgttgtgaggatcgaatgcatg
-actgcatgcaaagcacttagaactgtgcctagtgcatagtcagtgccaagtgtcagctac
-tactATCTGCTCAAAAATATTTCATGCATACCTACTACTTGCAGGTTGTGAATTGATTGA
-TTCTTTTTTCATTACTAAGCACTAACTGTGTGCCAGAGAGCAGTGAGAACCGAAGACACA
-GTAGCTTCTATCAAGGCCCTCATCGCCTGGTGGGAGACTGAGAAGGAAAGAAGGCAATGA
-TGACAAGGTCAAGTAAGTTCTAAAATCCAGGCACAGGGGAGGAGCTGTGGGAGCCTAGGG
-GCAAGGCCAGAGAAGGGTTCACAGGAGTTAAACattcattcattcaacaagtatctactg
-agcactggcccaaggctgaggattcagccaccaccaccacaggtccacatctggccttcc
-tggagcttgcagcctagccggggagacaggaacaatgaagacacacacacttagataaca
-tgatggtggtgatggtgagtgccgcgatgaaaaccaaagccaggggaggggatagagaat
-gacagacatggtcaggggaggcttctctgcaaggtgagcagagatttggataaagtgggg
-gaacgagtcctgtggaggtctggggagggcattccaggtggaggggcagtaaatgcagag
-gcccagaggcctctccatgggctaacgagggaggcagagggagggagggagtggagggag
-caagggtatgtgtaggagggaagcagggcagGAGTGGGAGCACAGTGACTCGCCTGCATG
-TATTCCCAAGGAGATGGGAAGGAGAGGCGAGCAGAGGGGTAAAGGAGAGGAAGCAGGAGC
-TGCCACTTTTGAGAAGCACTGAGAAGAGAAGCAGAGGTGGGTGGGGAGGGGGATGCAGGG
-CCAGGACTGGTGGGCAGGGGCCCTGCAAGCCCTGCTTACTGGAACGGGAGAAGGCTGGGG
-GAGGTGTTCCAACCTTCACAAGCCACAGGCAACCACCGAGTGACATTAGACAGGGAAGGG
-ATGAGATCAGACCCTGGCATTAGAAAGGCTGGAGTTCTGGGTCCTTCATGCTCTCTCCCT
-TAATTCTTACAAGAAcccatttcacaggtggggaaaatagaggtcccagagaggttcagt
-gacttgctccaggtcactctgaaaggacacagatctggctgcctccagctccccctgctc
-cttgagttccctgctgtcttccctggcctctgcctctGGGCCCAAGAACTCCCAGCCCTC
-AGCATCCATGGCCTCCCCCTGGCCCACGAAGTCCTCAGCCACCTCCTTCCTGGAGGGCTC
-AGCCAAAATCAGACTGAGGAAGAAGTGGTGGGCACCCACCTTCTGGCCTTCCTCAGCCCC
-TTATTCCTAGGACCAGTCCCCATCTAGGGGTCCTCACTGCCTCCCTGCAGCCCCTTGAAA
-CTTCTGATCATTCAGCTCCTGGGATGTCCTGGGCAAAGTTATCCAGGCCCAGGTCCCTGG
-CTCGTGGCTCTCCTCTCATTCCCTCAGTGGGTGCCCTGCCCACACCAGGATTGCATTCAC
-CATCCAGGTGCTTGCTGACTCGGgggcaggctgagtgctgatgagttaatgccccccagg
-agcacccctgagtggatgaggatgggagttggtggaaaaacatttcagtcccctcgcccc
-ttgggtgggacagttctgttgccagagttcccagtgggagggatgcccagttgccaacTT
-GATCCTTATCACACCTGTGCTTGCTTCTTTGGGACTGGCTTCCAGGGAATCTATTTGGAC
-GGGAATTCTTGTTTCCAGGTCTGCCAAGATAACTGCCAAGCCTAGTCCATTCTACCTGCA
-AAATAGCTCTCCAACCCTTGCCTCTGTGACTGCCAGGTCTGCCGCAGCCTCCTGCATCTC
-TGTTTGTACTCGTGTAAAGGCCCCCCAAGCTGTCCTCTTGTTTTGCCCTTGCAGTCTACC
-CCTCCTCCCTCCCAAGGAGCCAAAGGGGTTGGGTTTTAAGGAAAACCTGACCATGGCTGC
-CTGCTGTTCTCAGGCTAAACAGCACCCCTGCAAGGCCCACAGGCAGCCCACCTAACCGTT
-TCTCTACATctctgccccaagccacactggtcaccttcccatttttcaaacacatctact
-tatcaccttctcagggcctttgcacttgctgtctcctctggatggaacactcccagtctc
-ccatggttagctcattccaggcttcagttcaaatgtcacctcctcaaagaggccttccct
-gaccatgcgatggaaactcccatccttcaccactacgcttggcttagccctcttagcttt
-gcttcctctcctttgaactgtttcccatgatctgaactagccttgtttgtttgttGTGAT
-GACGATTGAGCCCCCCAAAGCAGAGAACTTGTCTGCACACACTGGGCATCTGGCTGGCTG
-CGGGTGTTGAGCTGTGAGATCGGCTATGTTCTTGCCCTGCTGCAGTTGACCGTCTGGTTG
-GACAGGGGCTGGAGGGATGAACCAGTTGTGGAAAATGCCACAAAGGAAGAGGAGTAACCG
-GCTGCAGGGAGAGTGGGAGGGCACACTCACTTGGGTGGGTGGATTCTGTGTAAGAACAGG
-GACCTAccaaggtgggcagatcacttgaggtcaggagttcaagaccaccctggccaacat
-ggtgaaaccccgtctccactaaaactacaaaaacattagctaggcgtggtggggcacgcc
-tgtgatcccagctacacgggagactgaggcaggagaatcgcttgaacctagaaggcagag
-gttgcagtgagccgcgatcatgccgctgccctccagcctgggtgacaagagtgaaactct
-atctcaaataaataaataaataaataaataaataaataaataaataaaataaaGTGCGGC
-TGCATTTGCCTCCCAGGGCAGCCCAGGTGTAAGCTATACAGCTTGGTGGAATGTCTCCAT
-GGCTTCTAGGGGATGGCCCAAGAGAGTTCCAAACACATCATATTCCAGTGAATGGGactg
-gtcagcccacagccacatggccatgtccagctgcaagggaggctgggaaatgtaatattc
-tgcaggccacccatgtgctcagataaaaataaagagaatattattcaagagaaagggaga
-cagagtgtgggggatgactgatgatccttgccataAGCATCAGCAGGAAACCACCAGCCC
-CCACTTCCCTGTTTCTGCATGTCTGTTATTTGGTCCTTCCTGTGTGTGATGGAGGGAAAG
-ATGGCTGTGTGTGATGGAAAAAAAGATGGTCCTGAATGAGCCTGATTCCACTTCTGGGTT
-CCCACACCCTCTGGTAATTCCCTCCTTTCCCCCGTTTCTGCCCTGTATCTCCTACAGTGT
-CTCCAGCCCTCCTTCACTCCATTTCTCCCTCTCATCATAGACTGTCTTGGAAGTTCTGCC
-TACAAATGTGGCAGCTGCTGTCCCACTCTTCTCTCCATCCCCTCTGGAAGCCTGGCCTCT
-CCCCAACTTCCTGCTCTGTTCTGTAGCTCACTCAGCGAGGACCAGTCCCTCTCTGTCATG
-AGATCCACTTTTTCTCTCCAACCTCCCTGTGGGCCTCTGTCCTGTCAACATCCCTCCTGA
-CACTCTCTGTGACATTTGACCACCTGCTGGAATCAAAGAATGTGGGCTCTGCAATCAGGC
-AGGACAGAAATGaagatgcttcccctttctcagcctcaatgatctcatctgtaaaatggt
-gtgaagaatgtccacTAACTAATTGAAACAAATTTTTATTTGCAGCCATGACATACCATG
-CATTTAAGTAAGCCCATATGAGCACATCTGAAGGCAGTGATAATACAATCAATAATACTA
-CTGGGAGTGCCTAGCTCTTACTGAGTGCTAAGCTCTTCAGCACGTCAGCTCAGAAATGTG
-GCCCCTCCCATGGCCCCGCCTGCACTCTTTTCTCCTTTTTTGCTTAACTTCCCTTTTGTT
-GCTTCTTTCTTGAGTCCATTTTTGGCTCTGTTCTCTCCTCATCTCTGCAGCTTTCCCAAA
-TTCTTTTTTAAAtttttatttatttatgtatgtatttattttgagactgagtttcactct
-tgttgcccagactggagtgcaatagcatgatctcggctcactgaaacctccacctcttgg
-gttcaagtgattcttctgcctcagcctcccaagtagctgggattacaggcgcacaccacc
-ctgctcagctaattactgtatttttagtagagacagggtttcatcatgttggccaggctg
-gtctctaactcctaacctcaggtgatccactcgcctcagcttcccaaagtgctgggatta
-caggcatgagataccacatccagccAGCTCTcccaaatccttttcccagctctgacatgt
-tgccacacttcatctacctggctggacacctccacttgaagtcctgtggacatctcaaac
-ccagggtgtctaaaatagaactcagcctcttcccctgcaggcttCCAACTCTGGAAAGGG
-CCCAACCACCTACCCGCTGGGTCTGTGAGCCAGGccttcctctcaggcccctcctctctt
-cccctggccccagcctccttccccacttccccacccttccccaccccAATGCACATACAG
-TTGCTCAATTGCTAGTCCTCACATACTGCATTGTGTCACCCCACCTGGTCATTGTCCTGC
-CCATGTCCTCTCAGCACTCACCTTTCCATGTCCAAGGAGTCTTCTGCAAACATCTGCAAC
-TGTCTGaagccaaggtgctggagaactaagagagagtccccaagcagccctcagccaatg
-accgatgggaggtggtggataaataccagccccctgccctgagttgggagacctgaggtg
-tgctcttcactgtctcaagaggacctcaatggggctgagctcccgttgcccatattagca
-attcacttattatgcatcagtggcttcagtggtttactgcagtgtcttcattgtctcTGG
-GCCACATAATTTTATGGAAGTCACAGCCCTTCTCTCTAAAGTCCATCTATGAAGCCACTT
-TACCTCTGTTTGAGAAGCACTGGTCTCCAGGATGACATCTATACCCCTTACCTGGCATTC
-AAGGTCAACCTGCTGACTCCACCATGTGTCTACCCTTCCATGctttgctcatgctcttcc
-ctcctgcctgaaatattcatcactttgcttaatgcttgtctgagttgcacctatccttca
-agactcagctcaagttcacttcctccgggaagcctttcAGACCACATTAATCCTTCGAGT
-GTTCCCCACAGCCCCAAGAATCTGCTCCCCACATGTGGCACAAATAGTGCCTTGGGTCTT
-ACCTGGtttgttccttcagcaaaccaaggttaagttagcattttctctgtgcaaggccct
-gagagctgggagagctggagacatgaggtgagtcaacacagaccctgctctgaggtctgg
-gcagtccagtcgaaagacGTCCAGGACATGGGGTTGGGCATTCCAGGCAAGACCATCAAC
-TCTACGAGGAAAGGGATGATTTTAATTCACTATGAGAAATGAGTGAATCATTTATTTTCT
-TAGCTTAAAACAGGGGGTGGACAAGAGACTGACtctggcccaccatctgtttttataaat
-aaagttttattgaaacacaactatatttcttcatgtatcacctatggcctttacactaca
-atgtacgagtaattgtgaaagagaccacgtggaccacaaacactaaaatatttactgttt
-ggacccttatagaagttccctggccctggcttgaaacactaatacttgtttattatttca
-cacagtttctgaaggccagaaatttgggagtggtttagctgggtggttctggctgagggt
-gtctcaggaggttgcagtccgcagggctgtctgagtctcatcataacacagcagctggtt
-tccccAGTGAAGACTTccatgctaggcacctcacacacagcctcatttaatcctcataaa
-catccttaaaggacagctatgattattacctacatttctcagctgaggaaaccagagctc
-agagagaggaagttatttccctaaggcaaggacagacctaggactggagctcaggttcct
-ctgcctccaaagccccgctcctaaccactgggctgtccttctgAGCACCACGGGGTCCCA
-GCAAATGATCTGTGGCTGGGGATCCAGGATCATTGTGATTTGACTCAGATGTCCCTTTGC
-CAGGGATATGGTCCTACTCTCCCTCCAGTTACCTGCTCCACAGGTGGGGTCCACCTTCTT
-TCAGACCCTCTATCAAGTGAGTCAATGGTACTGTCCAATTCCTTCCCAATATCTTTGCCA
-TCCACCCCCACTCTTTTCCAGCCCCACTGCTTCGGTCTTACCTCTGGCCGTCTGGGCTCC
-CATCTAGAGACAAAGTCAGGGGAGGTGATGCTTTCTGCTGATATTCCTTGATTTTTTCCA
-CCTGATTCACTTTCAGCTCTCCTCTGCCCATCCTCTCAGAAGATGGATATGCAAAAAATG
-ACCCCAGAGCCATAGGAAGGCCCCAAATGCATCCCAAAGTACTGCAGATGATACCTCCTG
-ATCAAGCCCTGCTGCTAATCAATCAATAGAATTAATATAATTATACAATTTCATTTATTC
-AGCCTTCTACCTTCACaaatgcctggaccttggtttcaggtaaactggctcgagttcctg
-cttggtctttgccaacatgtgtccatgggcaggtcttagtctttcctttggcctcagcct
-cctcatctcaggattgctagagggggttaaaGGACATTGCATTGTAATTTGCTTGTTTTC
-ACACTTGGTACATAATACTTGCTAGAACCATGATGCAAAGAGCAGTCAGTCCGCATGCTT
-ATAAGGGAAGCAAAGATGTTCAGCATTATAGAATGCATGGCTAACATGGCCCCAAGATGG
-TCCAATGGAAAGCTCTTCTTCTAATCAAATAGTGAACAATCCAGGAATAACCAAAGAAAA
-AGTtcatcttattatttgttttcacagcagctccatgaggcagaattaattttgtgtgtt
-ttgcagatacgggaacagtaggtgagagcatgagtaactcagctcaggtcacacagcagg
-tgggagagaactggaacaagaacccagtgctctttctgctctacccactgacccATCCTC
-TCACGCATCATACACCCATACTCccatccacccaccttcccattcatgcattcacccatt
-cacccaccttccatccatctaccatccaCCACGTACCTACACTCCCATCTACCATCCAAC
-CACATTtccattcacccatcctcccatccatcaaccctccaatccaccacccacagacct
-tcccatccattcatttacccatccacatattcacccaccctcccatccatccatcTACTG
-TCTATCACCTACTCATTTTCCCATCTGCTATTCACCCCCACCCTCCTatccatccattca
-accatccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccat
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-accctccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccac
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-acccTCCACCcatttatttgacagttgctgagagcctactaaccaccaatcactattcca
-ggcactgagatatgactttgagctagacaaagtcttgcttcatggagctcacattttggc
-tgtgaatggcagcaacagacaaataaatacgtagtttacgtgaggtactgcaaagaaaaa
-ataaagcaggggagtgatgtcaggagtaactaaggcaggatggtagtcagggaggtcgtc
-tctgaaacgggacatttgagcagaagcctgaaggaagtgagctccctgacaacttgggag
-aagagaatttcaggcagagagaacagttgtacaaaggcccagtggtaggaatagaaacag
-cttgatgggattaagaatcaacaaaaaggtcattatggatgaagcagaatgagggaggaa
-acccaagccagctcgggcttgatcatggcaggctttgtcagtcactgtgagtaaccagac
-tttatttcaagtgagttggCCAACAGTGTCTCCCCAGTAGTAGAGTGATTGCTCGTCTGC
-CAGAAAAGGGGCACAGAGCTCTGGACATCAATACTTGCCGATCTCTCCTTCATCAGCCAC
-CCAACCCTGGCAACAGTTTTCAATTACACCTGTGAAAACTTGTGGGTTAAACAGCTGAGA
-TCCATGCCTCAGCTTCTATAGGTGATAAGCCTGTCCTTCCTTAGGTAAAGAAAGGAAGGG
-GCGAACCGTCAGtgagcaccattcacataccttagccggttcagcttcaccaccctctga
-aggtgccatcagcagctcccttttgctgaagagtaagcggaggcccagagaggtcatgtg
-gtgtgtgcttgaggtcacatggctgagaggtggcaccagatttgcccaactctcaagtcc
-catagtctaacgtttcactccacTCAGATTCAACCTCCcaagaaattatttgtttgagta
-cctactaggcaccagactcagagtgagaggcagttgcagattcactcagggccagttttg
-gaggccagcttcacaatcacccagcacagcccatctttctacttgtgaggaaacagaggc
-tcagtgaaggaatgcctttcagatcacagagaggatgaagccaggatattcaaacccagc
-ttattttACTACAACTCTATATGGTAGGAAAGAGAAAAGCGCCCATACAATTTCAGTGGC
-TTGACGTGGAGCCTGGCAACAGATGTGTTCTTGGACTGTTGGCTATAAGACAAACCAGCT
-TTCCCCACTGACTGTCACCGTGTTTTGGGAGACAAAGCCTAGGACTTTGGTGTGTCCACC
-GTGGGTCAATAAATGCCCCCAAACAAGCATATCTTGCAAAAGTGGGGACTTATTAATTCA
-TTGATTCGTTTCTTGATTGATCAATTGATTTATATGTCCCTGTTGGACAAAGGGTTTGAG
-GCAGCCTGGGAAGGAAGTGAAGTGTGGAAACTGGTCATCTTCTGTGCTTCTTACATTCCA
-CTCATTGGGAACATCAAAAAATGAAAAAAAAATCCAGCTGCTACATAGCTGGGGAACAAA
-TTCTTGGTATGGAAGTAATTCTGCTAAGGCTAGCCTCCTCAGAGTAATTCCAAATGCTTT
-TCCTATTTTCAAATTTAATTAGGAGACATTTCTGTAGTGTGAGTCATCATTTAATAATGG
-GGGGTGTTTATTAGGGAATGagtggaaagagaacaggacagctggataattcaaatccca
-gttcttcaagtctctggctgtgtgatcttgggtgagccacttcacctctctgaacatcag
-ttttcttgtctttaaattgatatttacctggcaaggtttggggaaggtctcaactagatt
-atgtacataacaagcttgccagtgttagtacataataggtgtttaataaatattaactGC
-CTTCTCTTCCCATTTATTTTCTTATTTGGTCTTCTAAACAACCTTGGGGACCATGATAGG
-TATGTTGTTTGCTTTCTCTAGCATGAAAACAGCCTCCCAGAAACTACTCAGCCAATCCTC
-TGAAATGGTATTTCCGGTCAAATCTGATGCACCTTCTGAGACTTTTTTTTTTTTGTCTTT
-TCCAGTAAAGCCAAGCACATAGTCATTGTTAGTTTTAAAAAATGTATTTGGATGGGGTAT
-GAAGTTCAGAAGAGAAAGACATTCCTGGTTGGGTTATTCAAGCAAGGATCCCTGAAGAAG
-AGATGCTAGCATTTGGCTAGGTGATAGGAAGGGGACAGGAAACAGCAAAAGGCAGGATGT
-GGAGGCAGAATGAGTTGAAAGATGCTGTTATTGAAGGCGATGGTGGTAGTTTATCCCTGA
-AAGCCACCAAGAGCTCAAGAGCAGGAGGGAAGAAGATGAGTTTCTGTTGAAGAAAGACCA
-AAGTCACTCACTGGCTGATTTGTGCTTGGGAGGAGCATCTCTTTCCCCTGCTGATTGGGA
-GTCTTTTGTTTCCCTGGGACAATAGGCACTGGTCACTGAAGAGTGTGTCTGTCCTCCACA
-CTTTCCCATGTTCCTGTCTCTGGGGAACTCCTCCCTGACTCCGAGAGACAGGATGGAGTT
-GTCAATCAAGATGTCTGTCACTTTGCCTACCAGGGGAGAGCTTTCCAAGTGGGGCCCTGT
-TTTTCTGCTGGGGCTATAGGGGAGGGTCTCCATCTTCATGtgtcaggatgtagccttggg
-gctgctggtgtcatatttatgccacatggaatgaagctgtctgaagcaggaaaggatgat
-attaccaagcaaaaagagatgcaaagctgagtgtggacggaggcctgcttctgatcctgt
-ccatgtacttggatcaaaccatgcctgaactccatttggtttgcaccttatggggcaata
-agggaataagtaattctctttgtttattcaacaggatttctgtcacttggcaattctgat
-taatacaGACTTCTGATTAATACAGTTGGCAAATGAGAGACAAGTGATCTCTTcagaaat
-ggacagagcaggaaaggaacccaccaagcatggagaggttgaatgagagtctcttcttcc
-ccattgactcactgcagccctggatcaggttgctgcccttctctgggactcagttttatc
-atctgtgaaatgggCTGCAGTGAGTGGGAAACAAAAtcatttatttatgcccaaccttgt
-tgcaaaaatgatttaagacagcttacaaatgtattaaagccagagattaggaaaagaaag
-agataatgaaattgtgagaagggggagaaaaggtgaactcaaggatgaggttaggttatt
-gaatgcctgctgtaaagttctggacagttgctaaaggtgaacagacaagtttgttctgag
-attctttgtagccaaagcaagaaaaagaaaatgcagttacgtggatttgtaggaaaaaaa
-aaaaaaacaacccggttcctgagaagaagcccaacttttcttagaataaaagtctgaaac
-aattttccttgtggttccccatcaaaaggactttgtgaaataccatgagcaaATATAAAA
-ACCAGAcaggttgagtatcccttatctggaatgcttggaaccagaagtgtttcagataac
-agattcttttggattatggaatatttgcatatacagtcctacctcgggtataggacccaa
-gtctaaacacagaattcattcatgtttcgtgtataccttatacaagttacctgaaggtaa
-ttttatttttctgtgtgttgtgcacctgcattttgactgcaacctgtcacgtgaggtcag
-gtatagagttctctacttgtggcatcatgttggtactcaaaaattttggattttggagca
-ttttcaatttcagattttcaaattacaggtgctcaacATTTAacaggctggggtaaatag
-ttgcaacatatttaatagtcggaggattaaaatccacaataaaataagagctcccacaaa
-tcaataaggacaaaggaaaaaaacactccatcaataaaatgggcaaaaagggataagaac
-acaattcacaataggggaaatAGctatcaaattagaaaaaaatatcagaagaatgggtaa
-tatcagtgttggtcacagtgtggggaaataggcatgctcagacacCttaacttactttta
-gcgtttctcgtcacctgacacaccatatatatacgtctctacgtgttggggatctctctc
-tctgaccagattgcaagttccatgagagtaaggactacctcctcatcactgctgaattcc
-cagaacctagaacagtgtgcccagaacagagtagatccttgataaatatttatcaagtat
-gtgagtCAATAAATAAATGAGTGAATGAATGGACAGTGTGTAAACTGGGGTCATATAttt
-ggcaggcaatttggcaacatttattagaatgaaaatgcacaaacactgatgcagacattc
-ctcctttagccatacgctcgactgagacatacaaatattcaaaggaatgggtcaaagagt
-gtttttgtagtgctgtttaaatggcaaaagttggaaatgacctaaatgccaaacaatact
-acactaataaagttatggtttattctgactgtgaaatattgtgtgttcttctttaaaaaa
-atagtgttttcatactgatgtggtcagatctccaagatacattatcaaaagaaaatagca
-agtcacagaacaataatatgtaacatttacggtaaaaaCAAAACAAACTTTccaggcgca
-gtggctcacgcctgtaatcctaacactttgggaggctgaggcgggtggatcacgaggtca
-ggagattgagactatcctggctaacacggtgaaacctgtctctactaaaaacacagaata
-tcagccaagtgtggtggcacgcacctgtaatcccagctactcgggaggctgaggcaggaa
-aatcacttgaactcgggaggcggaggttgcagtgagtcgagatcacgccactgcacccca
-gcctgggcgacagagagagactccatctcaaacaaacaaacaaaaacaaacaaacaaaaa
-acaccacaaacaaacaaacTCAGTCTGTCTGGTTAGCTAGCTActatctatccatctatc
-tatccatccatccaCTCGCTTACATTGGTCAACCTATCAGTATAAACAAATAGAAACATA
-TCTAGAAGGAAATACCAAGCTGTTAACAGTTCTTCAGAACAAGGGAATAAAATGTGGAGG
-TTTACACAAAGGGCTATTTTTACTTTAAAAATAtatttcagtataatatgcacttaatgt
-gcatagataggttggcaaatgataaagctttacaaactgtatttatccctgtcagcatca
-ctcagatgaagaaagagatatgaccagcaccccagcagccctactgttatcctctcaagg
-aaaactatcactgcccttctattacttttatcaccctagactagttttgctaatttttgg
-actttatataaatagaatcaaaaagtggatacaattttgtatctttcatctttggtgcaa
-tattctgtttatgtgaATATTGCCAAATGGCCTGACACTCCAACCAGTGTGGCAGAAGGC
-CTGTTCCCCCCATGCAGCCACCcaatacattttaactaacctgtagtctgtattttgttc
-agtcccagtaatgtcctttacagctttttttctagtttgggattacatgttgcatgtagt
-tgtcatgtctctttagtatcctttaatctggaacagtttctcagcctttctttgtctttc
-atgatgttggcctttaagaaaaatataggttagttgttttatggaatgtcacatccctca
-ctttgggtttgtgtgatgtctcctcatgattagactgaggttatgcattttgggcaggaa
-tatcttgtaaatgatgctgtgttcttctcagtctatcacattaagaggtacacaatgtca
-atttgtccctttattagtgttaactgatcatttggttaaggtgacatccagtttctccac
-tgtaaagttgtttactttttcttttgtaattaaaaagtaattttaggaagctactttaat
-atctttatctattaaatatccttttccttgtcaaaGCCATGGTATGTTTAAAATGTGaat
-ttctttctaagttcaggggtacatgtgcagatttgttacacaggtaaacatgtgccatgg
-gggtttgttgtacagattatttcattgcccaggtattaagcctagtacccattagttatt
-tttcctgatcctctccctcatcccacgctccaccctccagtaggccccagtgtgtgtcat
-tctcctctgtgtgtccatgtgttctcataatttacctcccacttatgagtgagaacttgt
-ggtatttggttttctgttcctgcattagtttgctaaggataacggcctccagctccatcc
-atgtccctgcaaaggacaggatctccccttttttatggctgcatagtattccatggtgta
-tatgtaccacattttatttatctagtctatcattgatgggcatttaggttgattccatgt
-ctttgatattagtgctgcaatgaacatacagttgcatgtgtcttcatcatagaacaattt
-atatttcttctttttttttgtttgagacagagtcttgctctgttgcccaggctggagtgc
-aatggcacaatctcagctcactgcaacctctgcctcttgggttcaagtgattctcctgca
-ccaccctcccaagtagctgggattacaggtgcccaccagcacttccggctaatttttgta
-tttttagcagaaacggggtttcaccatgttggccaggctagtctcaaattcctaacctca
-agtgatctgcctgccttggcctcccaaagtgttaggattacaggcgtgagccaccgcacc
-tggcctttacattcctttgggtatatacctagtaatgggattgctgggtcgaatgatctt
-tctgtctttaggtctttgaggaatcgccacactgtcttccataatggttgaactaattta
-tactcccaccaacagtgtactgagcattcctttttcttcacaaccctgctagcatctgtt
-attatttgattttttaatagtaaccatcctgactggtgtgagatggtatctcattgtggt
-tttgatttgcatttctctaatgagcaatgatgttgagctttttttcatataattgttggc
-tgcatgtatgtcttcttttgaaaaatgtctgttcatcttctttgctcacttttttaatgg
-ggtagttttcttgtaaatttaagatcctcatagatgctgggtattagactgtggtcagat
-gcataatttgcaaaatttttctcccattctgtaggttgtcactttgttgatagtttcttt
-tgctatgcagaagctctttagtttaattatgtcccatttgtcaatttttgctttcattgc
-aactgcttttggtgtcttcatcatgaaatacttgcccgtgcctatgtcctgaatggtatt
-gcctaagttgttttccaggatttttatagtttgtgttttataAAATGTGAATTTCTTAAT
-TGAGAGTAATGGGAAGCATTTATTCCTGTGCTCCTGAGTCACCGGTTTTCCTTTTTGATG
-AATTTTGATAATCATTTTTTCTCACTAAAATTTAAAGGTTTAATTTTTAAAAACTGAATG
-GTTTAAGCTTAGCCCTATAGTTCTTGAACCATGATTTTAATAATAATGATTTTTTAATCT
-TCATTGCTCTAGCACCTTTAAGAAGGATTCGTTTGAAAATTCACCTGTGTCTCAACCCAG
-GAATAGGCTTGGCCTTCCTTCTCTGATGGCAGCCAGGGAGCTTCCTCCCATATACCGTGC
-CCACGGGAAGGAACAGAAATGCTTCCTGTCACTCCCAGGGGTCTCCAGCTGTCATAAGCT
-GCCAGCTGGAGGTGGTCCAAGCCAAGATTACAGCCGGCCTTTATCCTATAGTTATCACCC
-ACAAATCACCCCCTATCCCCAACCCAGGGGAGTCTCTCTGTCCATTCCATACCCCGGATA
-CTGAACTCAGCTCCAGAACCAGGGACCTCCTGCCCATTCACGATGGCCTTGAGCTCCCAG
-TGCTGTCCCCACCACTCAAGATTGTCCCATACCACCTTTCCCACCCAGCCCAAACCTCAC
-AAGCCAGGTGCATGTGGTGGCCTCTAGGGAAATGAGGTTTCAAGGTATTTTAGCCACAGA
-TCTCTTTGCTCAAATAAAGCCCTACACAGAACCCCAGCCCATTCAACATTTCAAGGTGGA
-GCTGAAATCCTTTGTGGGTTCTATTTTTCTCTCTTTGCAAAGCATTTCCAGCTTGTGGGC
-TGATTGTCATATAATCTAGACAAGTGTTAATTAAAGAAATCACTCAGAGCCTGTATATAC
-AAAAGGTAAAAATTTTAAAATCTTTACAGCTAAAAATATATTTAATGTGGTACATTTAAA
-AATATTTGATACAAGGTGGGGATCCCAAACAAAGAGTGCCAGGGGCCTATGGTGAGCCAA
-CCTCCCACACCTCCCAAATAAATCAGTCATCTGGCTTTGTCTATCTCTACGCTCTTCCTA
-TGAGTGTTATCACACTCAAATTGCATATTGATGGGATTAACCCTTTAAGGTCTCTTTCAC
-TCCACCATTGGCTTAGTGAGGCAATCTAGTCCATCATTGTCTCCCCAGCTCTGAGAAGCG
-AGCACTATCATAAAAGAAAAGAACTATTATACAAGAAAAGATTGCTACAGTGAACTAGAT
-TAATGTTAACAGGCTCCTTGAGGTAAGATGCTAAAAAGCATCAGAATGAATGAGTGAGTC
-GATAAATGAGTGAATCCACACTGTTGCTTATGAGGTCTGTGGGTGATGACGCCCCATGTG
-CATGGCAGTTTCAGAAGGGCTTTCAGGGTTTAGATTCTGGGGAAAGGAATCCACTTCACA
-GACCCTGCTGGTGCCGAGCCACTTCTAAGAGACCAAGGAGCCTGGAGCCACCCCATTCCT
-CCCAGGGGGTGGGGTTAGTTGATGCTGTCTGGTGAGTGACCAATCGCATCAGCACCTCTG
-CTGACCCCATGGGACTCCGCTACCTTCTCTCCTGGACTCCTAAAACTGCCATTTCTCTGA
-GAGGGGGAGGAGGGCTTCTTGCTTCCAAAAGGACTAAGCAGGGTTCTGGCAATGGGGACA
-GGATAGTCGTTCCCTGTGGCAGGCTGATGTACAATGGGATGGTCCTGGGGCCACATCTGG
-GCACAGACCCCCATTATCTTTAATGGTGCTCTTGCCAGGGGGACACTGCAGAGAGGAGTC
-TACCACGAGGAGACCTGCTCTCCCCTCCCAAGCACTGGAGCAACCTTGGCCCTGCCCAga
-aaaaggcagctgtagggaaatggagctgagtttaaatgcccactgggcacttagtagcca
-tgtgaccttgtgtaggtgactcctcctcttcctctctgggcctgagtttcctcctccata
-aaatgaggcagtcatctttgcagctctgcacccacaaagtgccattgtgagggtcaaata
-agtggatgtaaaagggcttgcagagaaccctgcagatggaaggtgGACCTTTATAAGGGA
-GAAATAAAATCTTATTAAGGAGAAAATAAATTCCCAAGAATGAGCTGCCCAGCATCTTTA
-AAAGAAGACTGCAGAGTGGACAGTGCTCAtacctgaaatgttttttttattcctctacca
-gtcagcctcctacacatcccagaggaggcagtgccttccccagaaagccctgccaggctg
-cactctgtcctcccatcctgctgcctccagcacaatgctcatatctgactgtctgtctac
-ctgacatctcccccactggtctggtgctcctttgggaaggaactgtatctgatgcaacca
-ggaatttcagctcttagggcagagtctggcgcatctgaggcacacatcaatattCTGAGC
-CAGACTGACTGGCTAGAGTAGAGCTAATGGTAGAATGTCGGGGGCTGGTGCCTAAGGTTG
-GGGTAACTAAAGACGCAGGCAAGCCTCACACTCCCTTCCTAGAACCTTATCTGATTACTT
-TCTCCATCTAGGTTTGAGACGAGGTCTAGCCGATCCTGCCTACAGGCTGAGTGAAAGCTC
-TTTAAGGTAGgggtgaccagcttttcctggtctgctcaggactttcctggtttgagttct
-aaaacgtcccatttcccaggtaaaccagggcagttggtcatgctaCCTTAGTTACTAATT
-GATTCTCATAGTAGACATTGTAATTACTCACTGATTGTATATTACGCTTCTCCTTCCTCC
-CCCTTTCCCAGGCTGGCAGAGcccatctcttaggacagaggctgaaaacggaagatagtt
-tcccagcctctcttgtggtgaggggttgccatgtgaccgagttttggccaatgagacaaa
-agggaaagtctgctgggaacttctgggaaggggttttttctctctatctaccttcacccc
-ctctttcttcctgctttcggtcgtgagaatgtgatgattagagctgtgacagccatcttg
-tgaccacaaggaaacatccttaccacactctgaggggtaaaacgaaggacagtaaaagct
-cgacactttgatgacattgttgatcctctgaaCGACCCTAGGACttgaacaacattaaaa
-tgttacatgttgtttatcaaaagacatcattagaataacaaaaaggcagcctctgtgctg
-ggagatgatatttgaaatctctccttgaaaaggactcgtatacagaatactcaatgatag
-ataactcagttgttaaaaattggggcaaaacttgaaaagaaactctagaaaagagaaaat
-taaaatggccaataagcaaagcacacaaaaaggtctgaacatcattattcatcagggaaa
-tgcaaattaaaactacagtggggcccgggcctgttggctcatgcctgtaataccagcact
-ttgggaggccgaagcaggcatatcacctgaggttgggagtttgagaccagcccgaccaac
-ttggagaaaccctgtctctactaaaaatacaaaattagctgggcgtggtggcacatgcct
-gtaatcccagctacttgggaggctgaggcaggggaatcacttgaactcgggaggcagagg
-ttgcagtgagctgagatctcaccattgcactccagcctgggtaacaagagcaaaactcca
-tctaaaaaaaaaaaatacaatgggatacaatctcacacttaccagagtggctaaaattaa
-aaacactgaaaatacaaagtgtcggtgaggatgtggagaaactggaactctcatactcta
-gtaatactaataataggagtgtaaatttggacagttgctttggaaaactgctaagcaata
-gctactaaaactaaacacagacttacctgatgaccaggtatttacccaagaaaaataaaa
-acatgtccacaagaagatgtgtatgtagatgatcatagcagctttattcagaacagcaaa
-acacaagaaacaccgccaacgcctgtcaacaaaagaacagaaaagtaagttgtgatatat
-ccatacaatggatgtatatgttattttatgaatatataaaatggatatattggaaatact
-acatggataaaatagttactttttaaactacatagcagtgaaaaagaataaactactgac
-acgtagcaatatggatgaatcttaaaattatattgtgcaaaagaagctagacacaaaaga
-gtacatacagcatgattcatttctatgaagtttaagaatgggcaaaaccattctatgctg
-ttagaagttggttagtggttaccctttgcaatggcaggtggagcagtggggagcagtagc
-tgggaaggaggtatggggatgccaaatgggatgtcaagaatgttctacatcttgatctag
-atcatatacttgcaaaaaattccttcagccattacagctcaagattcgtgtgctttattt
-atgcaatacagcaatctaaaaCATTAAAAAATGAATAATCTCTATGGTTTAAGGCACATT
-TAATCGAGTATTCTGTTACTTGTAGCGAAAAGCACTCTAACACTCCTCAACACAATTTGG
-CGACAGAGGATGTTTGTTGGGTGAGTGATGGTAATACCCGTGGAATAGCATTCTTACAGG
-GAACAGGGCACATTCACGCcattaacacctgtcactctcacttcagtcccaccagggagg
-gtttgttagtttcctctaacagatgaggaaactgaggtccagagaatcgcactgacctgc
-tcagagtcacacaacgagctttttttttttttttttttgagatggagtctcactgtgttg
-cccaggctggagtgcagtggcatgatcttggctcactgcagcctccgcctcccaggttca
-agcaattctctgcctcagcctcccaagtagctgggattacaggtgcccgccaccatgccc
-agctattttttttttcttagtagagagaggttttgccatgttggccaggctggtcttgaa
-ctcctgacctcaagcaatccacctgcctcggtctcccaaagtgctgggattataggcatg
-agccactgtgcccagcctacacagtgagcttttgaccaatctagaatttgggcccaagat
-tgtttaatcccaaacccagtgctctttccgctacacttctctcaccctGGGCACATCCAC
-CAACAACATTTGTTGAACTCCTATTCTGTATACTTCAGGGAAACTTTATCTGGTCTCTAC
-TTCCACTGAGCTTGTGGTCTAGGAGAAGAACAAGAGTTTTATCTAACAATAATAATTGTA
-TTTTTAAGTGCTTACGTTTATTAAATACTTACTATCTCCTAGACCAGCCTTTTTCagtgg
-agtccatgtattgcagagtatactccactgggttgcaagaaaaacaattagtaattctat
-ctgtatatttgatctcatcttttaaaaattttcattttgtgtatatcatataagatgata
-atatattgattgataatatattatgtttttactttgtaaatgtacatattaaatatattg
-ggggcaatgttcaCTGACAAGAATGGGACACCTAAATCTTTAAAGACCCATTGGTCGCCT
-GATCACATGATCCCATCTGGCCCTCATGACACTCCTGAGGACCAGAttttttttgttgtt
-tttagagacagagtttgctatgtcactcaggctgggatgcagtggtacagtgatggctca
-ctgcagccttgaactcctgggctcaaatgttcttcctgcctcagcctcccaaagctctgg
-gattacgggcatgagccaccatgcGTGACTGAGAACCCGATGTGTTGCCCCATGTTACAT
-ATGAAgatacatctttaaggtaatgaatatcccaatcacccagatttaattcttaagcgt
-tgtatacaggtatcaaaatatcacatataccccccaaatatggccaactattgcatgatt
-aaaaaataaaagaaaaaaGAAAAAGAAACCATCTTTAGCAATACCCTTTTAAAAAGTgct
-ttttgtttgtttagctttctttgaacatttgacccaagtcttccctcactcagaaaacca
-ctctgtaaaacatccctcaacatgatttcctcacagacaaacctgtctgataatttaatg
-ctgctgccatttttttttctggagctctgaactttgatgcctatctggactagttttgct
-ctagacttggggcacagataccattaggaattcctttGTCTCTCCTGTGTTGAAACCACA
-GACTGCTATATCTCAGTTCATCATAGAAAATTTACAAAATAAAAGCCACAGAGATTCATT
-Cccctgcctgtgtctaagctcttgtccaagcccctctcacattgactctgggcttggtca
-cgtgacttgctttggccaatggcataatggcaaacatgacacaagcagcagctggaaaat
-tacttgtgcatatgagcctttgccctttcagctctggggaaccctgtgaccacaaccagg
-ctggcagcaaacccaggctggtttgctgaagtataagagaccgatggctaaatcatctct
-gttaccccagctgtgccaagccaaccagcatatatatgtgagtgaggccattgacgacca
-gctgacggcagacacaggagagaagccagccaagaccacatggagcccagcccacgccac
-tactgggctataggttcataagggaataaatggtggccgttttcaggcaatttgttacac
-aggaaaagctCATGGttcctcttcttggtttagttcctctttttggtggagcacagcccc
-tggtagcATGGAAGttttaaaacatgtgcaccaatcctttgacacttgtcccatcagcag
-atagggttcatgacaccttcccttgcttgggcctgtaccttagtaatgcagcaaaagtga
-catggcataacttctgaagataagttagaaaaggccctacagtttccacctggttctcct
-gggacactcactccggggtaagccagccattgaggaagaggtatgagatcaccgtgctgg
-aaaagctacatgtcaacacaccactcaacaatccagtcgagacagccttccagccatctg
-ggccaaaggagccagactggtgagtgatgtcatcttgggccctccagaccagctcatcca
-ccagctgaagaccactaagtgagctccatcaacaccacgtggaacagaatcatcacccag
-ttgcaccctccctcagtttttaacccacaaaattaatccactaattttggtgatggtttg
-tcatgcaacaatagataaccagaTTCTATGCCATGATGGGAAGTTCTGCAGTTTCATTGG
-GAAGTGGCAGGCATTCTGGGACAGAAAAAACTTGGGGTCATTTGTGCAATCTACTGCAca
-gatttttaatctctggtttcttactctctgttccttccagagagcttcttgttcacattt
-tactgctgcaatatctttatcactcaagggatattaattgtaggatttattttaagtttt
-ctcttgttccctggattcttttcttgaagaccttttaccccgccctcatggtttgctttg
-atctctgcacttcatgatagaaatttctaatgatccttggctgtctactcacattaccac
-tctggctggaaactgggtggggagggtggactggtaggcttttgtgtagggtccatgcag
-ggtggttgcatagggctggtgcaaaggggctggttggctttttctgtgatgcactctcct
-cccacccccaattaccgtatctttaggtctttgtcctggaagtggttctccagataattt
-tctgcctggggttggacattctagaatgagacgggtgaagggggctgaagatctcACCTT
-CTctgggcctgatgtttctagttttggagtttctttgttgcctttttttcagagaataaa
-cctccctttgcttgcccagaagtgagtggggttactacctggctgggcaggatgggggtt
-ggggacgtggaggtcccatgctccttgtacagattgctttcaatccccacttcaccagca
-gctcctccaagacctagtagcttcaatttttgaggcctttaggCAAATTGGCTTGTTTCT
-CTATGCAGCAATCCACCCACACAGCAGTCACCTACCCCATCCATTTAGCTTTGACTTTCT
-TCCTCTCGGTTATGTCACTGGCCACTTCATCCATTTCCCTCCTTTGTAGTTCAGGGTTAC
-AAATGTCTCTCGATTTCCTCAAAGACAGAGTTTTTGTTTCTGCTCCTTATTCTTGTTTTG
-GGGAAGTTTTTTGTTTGTTTTTTTCTTTTTTAAGAAGAGAAAAGGAATAGAAATGTCTTT
-AGTCTACTATCTTAAAGCCACCATTTCATTAGAGTTTTAAATGGAAAAAGCACCCTCTTA
-TATTGGACAGAAGTGTGTCAGCAATGTGGGTTTTGTGACTCTTACTGGAGTAAGAGCCTA
-CATTATACGCCAAGGTGGCTTCATGTTCTAGTTTTACAAATGCATTTGATACAGTTAATA
-AAATAGCAAATTATGTATTAAGGAGAATACAGATAAGTCATTGCTGGCTTGGCAGAGAGT
-GGAGAGCAGCCTTGACCAAAAAGCTTAGAGGAGGAAAAGTGGGGTGGAGGCATGAGGTTG
-ACCTGTCCCTGCTAAGTGCCACTGTTTTCAgctcacccctttccacctgcaggtccctgc
-tcagatgccacctccttggaggatccccacccacctgtcactttctctctactaacttgt
-tttatgtctgactgcctgccaatggatttgattgacttatttatctttaggtttgtcgac
-cccactagatcatgggctccatgaccagggggagctttgctttttcacctccatacactc
-ggtgcctgtgagcacctggtacatcagtagatgctcaataaagagttgttgagtgaacaa
-atGAATGAGCCAGTGATTGCGTGGATCCATGTTTTCTATGAGAAGGCAGAGCTCTGAGGA
-CAGACAGAGGCCCAGTGTGCATGAGAAAGTCCTGCTGGCCCAGGCAGTGGCCTAAGAGCT
-GCCTACCATGGCGGTCACTGTTCTTGGGGAACCACAGATGTTTCCCCTCTAATCCCTCCA
-TGGGGACCAGGGGGGCATGAGAATGGGAGAGAACACAAAGTCCCTTTATTCAGGGGAGTG
-GATTCCATCTCAAGACAAATTGTTACCTCCAAGGCCACCAGCCGCCCAGCCGGCCCATCA
-CCATGGCCTCCCTCTTAAGGATGTGGGCACAGGCCCGGCCAGAGCTGAAATTGCCCTGGA
-AACTAGTCTCCCCTTTAATTAACAGGGAGGGCGACCAGGCCTGCTAACGGGGTGGGGTAT
-GGAGTCGGGGTGGGGTCAAGTTCATAAAGTCCCCAAAGAATCAAGGCCTCCTTGTTTATT
-TTCCCGAAAATGTTCCCCATTACCCAGAACAGCATAGGGGCCAAGCAGGCCGCAGGCAGG
-GAAAAAGCTTTAACCTCCCCGCTGCTCAGCTCAGCACATCACTATTTGACTTGCATTTTA
-AAAATAATTACAAACTTAATGAAAAAATAACCTAACCCCCAAACAGGCCAGGGACTCATG
-GCCAGCATTGGCAGGAGCAAGCCCCTGGCAGCTGTGAGGATGAGATGCAAAGGGTATAGA
-GGAACCACTGGAAGACAGGGGACACCCTTTAGATGGACACTCCCTCTCTCTAGCGCCAGC
-TTTGGCTCCCTATTGCCCTTTGTGTCATGCCCAAATGTCTCAGCCCATGTCTTAGAGCCA
-GTTTTACTCAGGCCCTATGTGGAAGACACTGGAACCCAAAGAGGAAAGGAAGTTGCTCAG
-GTTGTGCATTGTGTGGGACCTGATGCAGGTAGTGAGGCTGGTTGGGATGGGTTCTCGGGG
-AAAGAGTGGAGGAAAGTGAGAATGTGTCTCTGTTACCATCTGAGCCCTGGCTGGGTATGG
-CCAACATGCCAGGTAAGCAGCCTTGGGAAGCAGGCACGATGATTATCCATCTTTAATATC
-CCAGGACTTGAGTCCAGGTCTGTCGGGCTTTTAGCCACCACACTAAGTGCTGTAAAAGGA
-GCTGGAGGTAGAAATGAAGTAACAACAATAATaataataagcagctttcatggattgtag
-actatgtgccgtgcactgtgccaagctctttaccatctcttttaatctttgcaataactt
-tatctggtaggtagtgttattgacccattttacaaacgacgcccagagcattggttcaag
-gttgtgcagctgggaaatggcCTGTACTCTTCTACCCTGAGAATAATGCTCTACAGTGAG
-TCAGGGAGTCTtgtgaggtctcaagaacagggaccttgtctgtcttattcacttgtgtgt
-cctcagagcccagaagagagactggcatataatagatatttaatatctgtgttgtgaata
-agaatgaaCAAATGCACCTGGACCTAGAAGTAACTTCCGATGAACCATCCCAGTTCTCCC
-TTCCCCATTCCGGATTATCTTTACTTACCTGGAAGTGAACAAGATATTAAGGGGCTCCAA
-AAGAACTGAGAAATAGAACTTGGTTTGAAAGACAGTAGGGAGCCACAGCAGGTCCTTCAG
-GAATGGAGTTCCAAGCTAGGGGAGTGATGGTCTTCCTGTGTCTTTATGGATTCCAGGAGC
-TAGTCAAGGTCAATGAGCCTTTAGCCAGAAGGTCAAGTTATCCCCAGTGGTAAGTGTTGG
-GGGAAGAGGAGGGCACTTCTCAGGAGTTGAGGGTCCCAAACTTGTCATGCTCATTGGTTT
-TGTGGCTGAGAGTGGCAGGTTCAGGCTGGCCAGCCAGCCTCTTCAGCTTGCCCATGGTAA
-ATCCCATGATCCTGGGTCAAGGACGCCCAAACATGGTATGTCCATAGCCAGCTGACAGAA
-TTCGTATGTCATTGAATCTTTCAACAATGGATTCTTTGAAACTTACAACTCTGGGGCCTT
-TGAGGTCCATCTCAGATTCTGAGGCTGTAGAAACTGTTCATTTTAGAATAATGATAGGTA
-CAAaacatttactgagtacttactactccagacattgtttacaaatatcaacgcctttaa
-tcctcacaaccaccccagaaggtagtaacaatgtgaccccccacttcacagatgtgaaga
-cggaggcactgaaaggtgtaacttgcccagggtcacTGGCCGCCTGGCTCTAAAGCACAC
-AGCACTGCCTCACAGACACTTAAAGTCGTTGAGACTTACACTCTTCAAATTTTAGAATCG
-TAGAAAGTCACAAGGTCAGGATCTTCAAGCCACAGAGTCTTAAAATCATAGCACTTTAGA
-ACCTGCCATCATTGACTCATCAAATTCTGCCGTCATAAAATCTGGGCATGTTATAATCCT
-GGAATTCCAGATTCTTGGGGACTTTTAAGTCAGAGAAGTTTAGatcctgggatattaggc
-ttggattacagaccctagcccagtcctctcatatagcacagggaaactgaggcccacaga
-agtgaCAGAAGTCCAAGAGAGGCAGAGCCTGGTGGATTCAGTGTCATGTTTGGAGGGAGA
-AATCGGAGTGAACAAAGAAAGCCCCTGGGCAGGCAGGAATCTGTTTGTGATTAGCAGTGG
-GTTTTAGTGTTGCCGAGGAATGTACCCAACGTTACCGTTACCCCCGCAGGTTGCTGCCTC
-CTTTCTTCCCCCTCAGATGCCCTCCTCAGAGCCCATCCTGGCCAGACTCAATATCCTGTT
-TCTACCACCAGCAAATTGAATTTTCAGAAGTTGGCCTCCTAACGAAGCCAGCTTAATACG
-TTGGAGGTTTTCTTTGCCTGCATTGCTATTTCTTGGTAGGATGCCTGCTCTTCAGGAGCC
-CAGAGAGGTTTTGCACACTCAAATCACAACGCCAGGAGGGATGAGGGACAGGAACTATGG
-GACAGGTGGCTGGGGGCTTAGATAGACCCAGAGGTGGGaatagaaatggcgtgtctcaag
-ggggaggtgacaggtccacagggacctccgtactgctcaggccacacctgggaatttggg
-ggccttcagtctttcagaaacattaaccaaatggggtttgtttagaggagggatggggag
-agatgggtgggaatcccatgCTCTGGGAGACCTTGAGCGTGGACTAGATGGAAAGAAGCA
-TGAATTCTAAAGTTCAGCCTCTCAGCTACTGCCCCCTTGAAGACAGACATGGGTGGAGCC
-CTGGGGTATAGACCTAAGATTGAATGGTGGAAACTCCATGAAGATTTTGGTTTTATCAAA
-ATCAGTGGTTCTCAggctgggcatggtggctcacacctgtaatcctgaggcgggcaggtc
-acttgagatcaggagttcaagaccagcctggccaacatggtgaaaccccatctctactaa
-aaatacaaaaattagctgggtgtggcatcagacacctgtagtcccagctgctcaggaggc
-tgaggtaggagaattgcatgaacatgggaagcagaggttccagtgagccgagattgcacc
-actgcactccagcctgggcaatagagcaagagcctgtctaaaaaaaaaaaaaaaaaaaaa
-Gcaatggttctcaaagtacagtacagtccagaatctgtggggttcctgagaccattccag
-ggcatccacatggtcaaaactatattcacaacaacactaagacattatttgttcttctaa
-ccctcagtggggttgtccaaagttgatatgacatgtgatgccaccatcactctgatagca
-atgaaaaaaattaatgcaaaaacattcatgatgaacaaaatactaaaactgtaaataaag
-agaagactaatactactgatttttcctttcatctcaggcttcagtgtgaatttttcaaaa
-tattgcattaaaatgtcctaattactgatatttttggcacacaaattttaaacctgaggc
-aagtgcctcgtttaactcactctagtcctggcTGtggatataatccacatcaacagaagc
-ttgttggggtcctcaataatttttaaggatataaagtgtgctgagatgaaaacatttgag
-ggtcactgataaaagggataatgttccatcagctcaaactatccaacaatggaggggatt
-atattccaaggtactgagttcccatcacaaggtgtgtacaaatgggggGATTAAAGGATT
-GGGTGTGGGGAAGAGGCCTAATGTGCAGCATCTCTTGCCCAGGTGCCTCCTGTGGTCCCA
-CCTACCTGGCATCCAATagatcttctcattttcccacttgaaagcttgcaatggtacccc
-actgtgctctgagcaaaaacccacctcttctccatggcctaccaggctctatgtgtcctg
-gccctgtctcccactcttttgcccctagcttgctctgctatccccaacctagcctctttc
-tatttcttcagcatgccaaactctttcttacctagggattttgcacacgctgttccctct
-gcctggaacatcttcctcttcactcttctcatggctgttccttgtatcttctgagtttca
-acttgactgttgcctccaggaaggcttccctgatcaccctatagtaagtaggatttctct
-gacatcatctctcaacctcttttttgcttccttcatggaagtcatcactgcttttttata
-tttacttgttggcatggatggttctcatctattctctccatgagaccatgagctcctcca
-gggcaggaagcctgactgttcagacatggggcctcagcacctgacccagcacctggcatg
-gaggaggcccttgagaagtgtttgttaagcaaataaaCAAATCCTTTatgaattagtgaa
-tgaatgagtaaatgaatgaaAGATTAAACAGAAAAGGCCTCTGACTGCTGATGCTCAGGC
-ACTCACCAGGAAACCCAAAGTAACACAGGTTGTTACTTTGATGAAACATCAGTAACCATG
-GCTGGATAGTGTGTGATGAAGTATTAAGCAGTAAGTGTTTGCCCACTACCCATCAGCGCT
-GATCAAGTTGGAGGAGAGGGAGACTGGCCTGGCTGCAGAAATCTTGGATGAGTTGGGGCT
-TGAACACAAGCCTTCAGGGCTTTGCCAAGGCAGGTTCCCCTGCCTAGTTTCTCTGAAGAT
-TCACATTGTATTCACTGTGAGGGCTCGGCTCAAATAACCCTGCCTCCTATGGCTCTTCCC
-TGACTCTTCTTGGGTAGGGTCGGAACACACCATCCTTGTTCTGGGTGTTATTGTATTAGG
-ATAACCACCCTTGTCTATCACTGATTTGAAGACATTAGCTTATAGAAATGTCCCGACAGT
-ATAGATGTTATCCCAGTTTAGAGATGAGAAAAGTAAAGGTCCCAGAAGAACTTACATTCC
-AGTGGAGGAGACTCATCACGGGCAAAAAACCAAACCCACGTGTTGTGAGTGATAAGAGTT
-AAGGTGAAGAATGTTGCCGCGGAAGAGGAGTGGGGAGACCTCTCTGAGGGATCAAAGAGA
-TGTGGGTACAAATTCCATCTAATAGTGTCAGCTAAAGTTCAGTTAACTGTTACCACTAAC
-AATGAGTTAGCtgttgcttccaggatgtctgtttcacgaggacagggactatgttcactt
-ttctgtccccagcacctagaacagtgaacaacacatagtaggtgttccatgtatggtgtg
-aggtgaataaaGGCCTGCctgcatcaggcgttgtatatgaattattttatttaatctcca
-tggtcagagaggtaagggttatcatccccattttgtagataaggaaatgagggcacagtg
-aagttaaagtctaatgacttacccaagaacacccagatagtaaatggtggagcccgagtt
-ggattcgaatccagtccaatctgtctcgtatcttagccactctcctacacAGccttattc
-tgctcactcactgtgtgaccagggcatattgcctaacctctcatccactgaggatgtcat
-tttctttagcttttgaaataatacccatgtcatagggttactgtgaaagtttggttcagg
-tagagctcttagattcctgtctggcacacagtgaCACCTCTTTTCAGGTGACCCATTCTC
-GTTTGATATTGTCAGCCATTGTGAAATAAGAGGGTATAGAGCAAAGCTTTCCAAATGGAA
-AAACCTGCTATGATTTCTAGAAAGTCTTGGGAAACTTTCTAGATCAGTTATGGAGGTTGC
-AGAGCAGAAGGCCTCAAGGACGAGATGCAAAAACAGCACCCATGCAAGTTGACTTGTAAA
-CTGCTTTCTTCATCCTTTAGGAGGAATTGCCCAagaggcagcatttatggggcatgccca
-gggtctccaggcactgtgctgagggctctgtatcccgtctgtcaatttttcccaactcta
-ttatacagatggcaccactgaggctcagagaggtgaagggacttgcccaaggcctcatag
-tgcatcagaaacagtcaggactcagctcaagaaaaggccccaaagcaagcactcccaacc
-acatgatctaAGACCAGGGAACAAGGGGACAATGAGAGTGAGGGCAGGAAAAACGCTGGA
-AGATGTACCAGAGACTTAGCACTTGACTGATGGCATCTTTCCAGGCCAGTGCCCACCCCT
-CCTCTCCTGGCCTTCTCTTCCACCTCCCACCCTCCTGGGTTCCTGCACCATTTTCTCACT
-GGAGCTCCTGCCATGCCTGTTATCTTCTgttggttcttgggaaaagactctgagatggag
-attggcgtgcagtgggtttattggggagagtgctcaggagtaagaccaatgcaggagtga
-ggaaaacaggcctgggaggagtgaacagctggcacaatggagttacaacagaaatctcag
-tgatcccacaggagctctggagcagagatggcccttcggagctgaaggatcgggtcaggc
-attttttatcatacaccaaccactctttggccacaggctgcacctggaacgaacgtgtcc
-ttgggcagggcaagtccctacagctgagggccattcccggctgggaaatatcagcagctg
-gcagtcccatcagctgggAAGGGTGTCTGATGAGGGAATCCATGCTAGCCCCCAGCCTCC
-TTTCCACCTGTCCACTGTTATCTGACAATAGCGATCATGCCACACTAGCTCACACCGGCA
-GAGCACTGTCTACCTCTCAGGCTCCCTACCACGTCGTGTGGTGTGtggattccctcattc
-catcctcatgacaaccatgagagggggacactttccacatgaggaaacggaggctcagtg
-agatgaagagcttgcccagagtcccaaggtgcaagaatgctgtagctggtattctcaccc
-aagcagtGGGACCTATGGGTCCTATCTTGGTCCCTTATAGAAACTCCTTCCTTTAATCCA
-ACTCGGCACTGAGTCCCCTGGagtcaaagctcctgccctccaaaagttcatcatccagtg
-ggggaagtcaagacatatacactggaaagataagggctggtaagtgctgtgatgagaggt
-gacctgagggtgggtgacagggatgtcctgcccaggaaggcaggtgagacaaagtcagtg
-agttcagcctcagtggatgaggagagtgctgtgggaaggatcggggcagggtgggcttct
-aggcagtgggagcacaggtgcaaagacagagagggtgaaagagAGGGGCCCTCCAGAAAT
-AGGGAGTGGTCTCCTGAGATGACATAGGGGTTTGGGGGAAGGAAAACAAGGTCATCAAGG
-TGGAGGGGCTCCAGCCTCAGGGCCCTGCATGATACAGTCCCTGCCCTTCCGTGAATATTT
-GCTGAACGAATGAATGGTTGGATGGGTGAATGAATCGCTGCTGTGGAGGGTGGATTGGAG
-GTTACAGAGACGGGCAGGGAGACCAGTGGGGGGTCCACAGCAAATGTCCAGGTAAGAGGA
-AATGGGCCCAACTTTGCAGGGACCACAGGGGTGAAGCGATGAGAGAGAGAAAGAGAGAGA
-GGAGCGGAACGCCGCTGGGTGTGGTGACCTAGAGCTTCTGTGGCCCATCTCTCAGTCTCA
-CCCTGTTCCACCTCCATGCCCTGCACCATGCTGCATCCCCTGCCTGGCAGCTTTTTCCTC
-TCCCTCTGCATCTGCAAGTTGCACTGGCTGCCCAAGCTCTGCTTCCTCTAGGAAGTCTTA
-TTGACCAATGCAGCTCTCCCTTACCGTGCAAGGTCACTTCCCATCTCCCTCACAGTTTAA
-CCCTAGCAAACTCCATTTGCAGAGGCCGGTGTTCAAAATGCAATTCTCCAATTTTTGAAT
-GCCAGGCCAACAGGGAAGCATTTAATGCCCTTCAGCAGGGGTATGATGGGATAAGTGTGA
-ATCCATGTATCCCGTACAGGTAGGACCTCTCTGCCCCCATAGTGCCTGCTCGTTAGCCCT
-CTAAGGGAGGCATCTGGTAAATCTGGGCTTGGAGTTTGGAGGATCGGAAACAGGAACGAC
-CTCTCTGGGGACAGTTCTTAAGTTCTAATGGAGCAACTCTTCACAGAGGGACTTGCAAAG
-CTCTTAATTAAAGTTACCATCAGAACAAAGACTCTCTGAAGCAAGAATTTGGACCCCAAT
-GGAGTCCTGAATCCAGGCAACCAAGCTTGCATAAGTGTGCAACACAAAGGCAAATGAGTC
-CCCAAGGAAGAAGAGGCTCCATCCTCAGCTTGCTGCCCTTGTCTGAGGGAAGCACCATGC
-CCTACAGCTGACATTTACTGAGTTTGCATCCGTTgactcttttggttgcagaaaactggc
-tcagacaaaaaggggatttgctggactgaaaaggccaggctggagctatggtgcagcagg
-atctaagggcttaagtgatgtctttagggtggggtttctctccatttttttctgctcagc
-atccttcagaatccacttcattcccagAGTCTATGAAGGTGGGGTGCACAGAGAGAGTCT
-GTTGGACCAGTGTGGTCACACACACACCCTGAACCAAGGAGCACAACACCTGAGTGGCTG
-AGGCTGCAGGGCACGTCCCAGATTACACTGACCAAAGAGTAGGAAAATGTTCCCCATCAG
-AAATTGGTAGAACAGGGAATGGATTCTGGGGAAGTAAGCAATGAACATTATCCGTAAGGG
-CCTActatatggtaagcagctattaatcgctttgccaatttatagttgaggaaacagcct
-cagagaggtgaagtcactctgacagccaggaagtagggaaaagcaagcttggaacgcagc
-tctgtctggtaccagagcTGAGGGTCTGGGGAGCTCCACCATCCTGCTTTCCAGGCAACA
-TCTTTACCCATCTCTGTTTTGGTCCAAGGCACAAAGCTGGTGTCAGATGGCTCTTGGATA
-AGCCTGTGTGGGAAGGACAGATAGATGGGGGTGTGTatggatgaatggattggtgaatgg
-atgaacagcggggtggatggatgggtaggtagaagggtggatggattgctggctgtgtgg
-tttactggctaggtgggtgggtaaattggtatatggttaggtggaagggtggatgtatgg
-ataggtgggtggatgCTTGGGTGAATAAATGAAATGGCAACTGAAAGGACAGGTGGAAGG
-ATGTGTGGGTAACTAGATGGGAGGGTGAATAGAATAATGCTGACATAAGCATTAACAATT
-ATGTCTAGCCTCTTGCCCCTCTCTTCCCAACTGCCTTTTCCAGTGGAAAAATTGAAAATC
-ATGGACCCGGGGAACACATTCCCCTGTGGTCTGTTAATAGAGGCCCAGCAAGGCCAGCCG
-AGGCTGTCAACTCACCCCCCACTAGGACCCTGTCATTAGCCACACTCCCCCAACCCTGCC
-CTTGGGTGGAAGTATGATCTGGTGGGCACTGAGGGGCTGGGCCCATCCAGGCCCCTTATT
-AAGCCTTATTAAGCCCACAGACGGGGAGCAAAAAGGGGAGAAGAACTTTCTCCCAAAGGT
-CAGCTGTTGGAAAAAGAAGGTACAGATGTCTCTGGGGTGGTCGTCTACTCtcaggccaca
-aggaatgtgaaagtttgcctggcccaatctgctctgctgtcttcttgcaggctgggaaac
-tgaggcccatacaggagacaggagggacacacagaagtcgggacagagccagactcaaac
-ctcaggccggctcacagaccatAGCCCAGCCTTTCCCTGAAACAGCCTCAGCATCAACAA
-TGGGGAGGGAAAGGAATGGGCATGAATGGGGCTCCTGCTATATGCCAGGCCCTTGAGCAA
-AGCATTTTCTGTTCATGGAGCCACTGGTCTCCTCTGTATCCCCATGAGTAAAATGGAAGT
-TATGCCTGTCCTGTCACGGattgaacaagcatttgttaaacatctgttatactgtgggcc
-aagcactggtctaggtgccaggaatatggcattaactagccaaacaaggtttctgctttc
-agagagcttactttctagacagtgatagagacagacaaataagtaggtagataaaatgtg
-atatgaagaaaattgaggagtggtatgagatgtacaaggatggaagggacgttctttgga
-tgagatggttgggaagggcctctctgagaaggtgaTCATGGTCAAGGTCATtaattgtcc
-accaagtccattctcccctttgctagtatgtgggcaaagcccacaagtggctgtccaggc
-agggtcaacatttcccagccctatttgcatgcaggtgtggccatgtgactagctcttacc
-aatagaatgggagcagaagtgatgagtgccacatccaggcctagcttttgagaagtgagg
-gagcttcccccatgttcttgttacttttcccctggctgaattcaaatgatggcaagaccc
-caagatagaggagccacaagattagaagagcctggattcctgcatcaccacatggaggag
-agccactcattgccctggcacatccattgcatgagtgagaaataaacttCAGGTGAGACC
-CAAAAGACATGTGATGAACTGGTTaggacattgcaggcagaggaaatagcatgtgcaaaa
-ggctcaaggcagaaccaagcttggcatgttggcacagaaaggataccaatgtggccagaa
-taaatggcacaagaggaggaaatgaggtgaaccatgcaggcagtggcctcagtcaggagt
-ctgtatttcaagtggccccagtggaggtggcgccatcagcagggaagaaataccatgtgg
-ttcatacttggaaaagatccctctggccactgtgcagagatgagttggaaggaggcagga
-atggacacaccagagaggagctggtgcagtcatcctagcctggatgaggctggggacata
-agagtgagtgaacagagtgggtttggatatattttcaagggcttgctgatgggttgtttg
-tggaaggtgaaggaaaCCAAATAACCCACAAGCCATTAAACAAAATCTAATGCAGAAGCC
-AATATATATTAGTAAACACTTTAGGGGTCTCTGTCTAGCTTCTAATCTTCCTTCCCTGAG
-AACCTCCCACTTATGCCTATCTGATAACTCTACTTATCTGATAAACTGGCCCCTCCCCTG
-CCCTAGCTCATGGAGCTGGAGATCGGTCCCTGACTGGGGCTCAGCCAATCAGATCATCCC
-TGGCTGTCAGACCCCAGTGTGTGGCTGGATGGGGAATAGGCTGGGCCCTAGCACTCTCTC
-CTTGATAGAGATGATGGGGTAGGGGGAAGGTCAGCAGCCCAGAAGCTGAGGAAGAATGAA
-CTCTCCAAGGACCACCTACCCATCCCATAGCAGGCGAAACATAGCTGCAAGTGGACTCAA
-CCACCCTCAACCACAATTGGAGCTGCCACCAGCCAAGTGTGGAAAGGGTTGGTCTTTGCA
-GAGCCCTGGACTGGAAGAGGAGAGTGGGTCTCCCAGGGCAGAAAATGGGAGTGGCCAGCT
-CCAATTCTGTGCCTCAGGTTGGGAGACATGATCCTCTGGGTTCTTTCCATACCCTAGACA
-AGGATATTCCTTGTCTGAGCCTAGACAAGTTATTCCCCTGGGAAGGAGGGAGGTGCTTCT
-GTTTCTCCATCTGTCAGGTGGCTGAGtataacagatttcatttccaaaaatggccacagc
-cccctgctcctcatgaaccctgccactctccatcaagagggagagtttatttctcctccc
-ctggagactggcaggactttgtgactgccttgatgaatagaacgcagcagaggtgactgt
-gtaacttccaagggtgggtaagaaaagacaatacagcttctctctggctctttgtcttga
-gacactcaccctgggaaccagacgaccacggtgtaaggaagcccaggccccctggaaaag
-ccagaggtaaatgttctggccgacatttacccagctggggtcccagccaacagtcagcat
-caaccaccagacccatgagggaatcagtccagcccctggccatcaagtcttccatctgag
-gccccagacaccgtggagcacagacaaatctacccactgtgcccttctggattcctgccc
-cacacaatatgtgaatgcaatgaatgactgtttgatgccagtgtgttcaggggtgatggg
-taacgcagcactagatacccagaacGCTGACTCAGGCAGACTCTGCCTCCATGACACCCT
-CCGTGCTAAGCATCTGTTCCATTTCCCCACTGTCCTGAAATTTCCAGACACTCCTCTTTG
-ACAAGCCAGGCTTGGCTATGAGCTGGGGCCTCTCAGGGATCTTCCAAAGATCAGCCGTGG
-AACAAGCCCTGCGGGGAGTTCACTCCCTGGTCAAGAACCTTTGCTAACTCCCCATTTCCC
-CCCATATCAAATCTCAGCTCTTCTACTAGGCTTCCCAGGCCTGTCCTAATCTCCTCCATC
-CTCATGTCTCCCTGAAATGGGCCACAATTCCTCCCTCTGCAGTGTATTAAGAGTGAGAAT
-GTGGGGTTAGATGAGGTGAGGGGAATCGCAGGCTCTGGGAGAGCTTTGAGAGCTAGGCCT
-GAAGCTTTAGAAGGCAGTCttccctcatttagcaaatattgagtcctagtgtgcactacg
-ttctatttacagtgctgggaatacacagctgcacctgctagacataatccctgtcctaaa
-cccatgaggatcatattctcttccacctcagggcctttgcacctgccattctcctaacct
-aaaatctatttcggaagatttgtgtacacctcatcctttatccttccagtctcaccttag
-aagggcctgcctggccaccctctctagtcatccccattgctaattccctttattattatt
-attttttttttgagacagagtctcactctgtcactgaggctggagtgcaatggcacaatc
-ttggctcactgcaacctctgcctcctgggttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattaccggcacatgctgccacacctagctaattttttgtattttagtagag
-acagggtttcaccgtgttcaaggctggtcttgaacttctgagctcaggcaatccacccac
-ctctgcctcccaaggtgctaggattacaggtgtgagccaccatgcctggcctaattccct
-ttactcttaattatatctccctgttcattttctccctaagtcttgaacaacagtatataa
-tctgtgatggctgatttacttgatgtttgtctgacttcccctactagaagtgtcagctcc
-ctgaggcagggactgtgtctgtctcattcactgctgtgtgccagggcatggcacagggcc
-tggcacccaggggtgctctatgactattAAATGTGTGCAGTGTGATGCTGGCTGCACAGT
-GCCTGCTTGCAGCTGGGAAGCTCGCAGTAAGGGGTGATCCTCTCTTTCTCTTCTGCCCTG
-TCTGTGGACATGCCCCATAAACACTCAACAGACTCCCCTCTGTGCCAGGTTCCATGTGGG
-CACCAGCAGCATGTAAGGGCTCAAACACAGTCGCTGGTACTGAAGCAGCTCCCAAATACT
-GGGGCAGGAGACAGATATCCAGCCTGTACTGGATATCTGGGGACATAGTGTAGCTGGTAG
-GGAGAGACGGCACAAAAGTCAGGGCACCAGAGGTCTGCAGTGCCAAATTAGAGTGGAGTA
-AGGACTCCATGCTGAGTAAGGAAAGAAGATCAGGCAGGCACTGGGGAGTACATTGAGGAT
-GGAAAGGAGGGCGATGGAGGCCATCTGGAAGGACGAAAGCGAGTGGTAGCAGGAGAGGCA
-TCTTAGgtatgaccccgggcatgacacgcaacctctctgaatctgtgtccCTGTTGgtat
-aacattctgtgaagcacacaggtcctggagccttcctgggttcaaatcccaccctctgat
-tactcatgaccctcaataagttctttcaacttggtttcttcatctgtaaaatggagatga
-caataatagcacctccccactattgtttcatcaggatcacatgagttaatgcattgaaaa
-cacttagatcggtgccaggcacatggtaagtggtcagtcaacgtGAGCTAGCACTGAAGC
-AGGAGTCACAGTTGCAAAGCACAGACCAGTGCCTGCACGCGCACACAGCAGGCACTCATC
-AGTGAGACGGACCTTCTATCTGCCTCTTACGCTGtaacacatatcaccacccaacatggt
-atttttttgcttatgtgattattgtcccttgcctccaccagaatgtgagctcaatgaggg
-caggggttctgtctcttttgttcccttgcattatccccagagcccagggcagtacttgac
-acatagtaggtgctcagtaagtagttgctgaatgaattcatttctaatttttagttttgt
-gcttggtgcacagcaaatgctcaacaaatgctggtcctcttCACCCCTACCAGCCTCTCC
-ATCCCGTTTCTACCTGCTCCAGGAAGCCCTCTTGGGCCTCGCAGCATCCACCAACCGTCC
-TTCATCCCAGGCTAAGTTCCCCACAGACCCCCTTGGCCCACCTCCCATCTGCTTTATCAT
-GCCTGTGGAGCCAAGGTTCACCTTGTTCCCCGGCACTCCCGCCAGCGTGAGTAAGCATCA
-GCCAGGACCTGGAGAGTAGAACCCACCCAGAGAAGAGCCCCTGCTTCTCTGCCCACCCCA
-GGCCAGAAGTGCTCTTGCCCCTGGACTGGTTTGTCCAGGGAGGTTTTCCAAGTCACTGAG
-AGCCCCATGATCAGATGTCACCAGATCCTCCCACCCCGGCTGCAGGGGCTGCAGTACCAC
-CAGGGCCAGAGCCATCCCCATGCGTGATTTCAACATCTGTAATACTTTCCCCTCTCCTTG
-TGGAATTCCCCCTCCAAATTCCTCCTGCTTCattattagtatatataaaaaataaaaaaa
-ttaaGCTGTCTTAATCATTTTCCATATTAGCTGACAGCCGGTTCCCATATGCCTGGGAGT
-GAGACCACACCTCCTGTTCCCCCCCCCTCCCCGCCCTCTCTGCTGTTCCAAAATGACTAG
-CCCCAAACAAGGCCCAGTTACTGAAAACCCTCTATCTTACAGACTCCGCAGCCCTGACTC
-CTTGGAGTCCTGTCTGGCTGGTGTGGCCCAAGCCAAAAGCAAAGCAGGAAGATTCTCTTA
-TGTCCCCAAAAAGTGCAGACCTCAGGGCTGGGCTGATCAAGGTGCAAATCTCAGTGTCAT
-CACCTACAAACTGGAACTCCACAAACTGCTTTGTCCTGTCCAAgaaagggcacaaattct
-gaagcagacggatctgagttccatctctggaactcagctctgtcaccttgggcgagccag
-ttcaccactctgagcctgagtttcgtcatctgtaaaacggcagaaacaacagcagttacc
-tctcagtgtcacagtgaaaatcaaggagaCTTTGataacagcagtgaacatccactgatc
-ccactgtgtgccaggcactgagccaagccctccctgcctccccctcattgcatctgcaca
-acaacctgctttgcagacagaaacaaagggaccgagatattaaaaatttctccaggacaa
-agaacagggaggtggaggagcaccctgacccaggcccgGCATTTTCAGTTCCACTCGAGA
-GCCTGACCCCCTGGAGATACTCCACAAGTCCTCACCCTTTTCCCCCAGTTTCACCTTGGT
-CTTTCCTCCTCTCATGGTCTTGAGCATGGGCATCAGGGATTGGCAGCACTGTTGTGTCCT
-GTCCCCACTGCCCAACCCCAGTGCCAGGGCTGTGAGCATCAGGAGGGTCGGTAGGAGCCC
-GTGGCCCATGCATGGCAGACTCAGGTGGCCCAGCACCTTGCGGCTGCTCCTAAAAGCACA
-GACACCTGTATTGAAGAGAGGGAAGTTCTGGGTTGAACTTGAACTGATTGAGAATTCCCA
-AGCCAGAGGAGATAGACAACTATGCCAGACCTCAAACTTGAAGATTGTTTTTGTTTTTAT
-TTAACTGAACCAAACTGATTTTTTTCTTCCCCCCGAATTACGAGTGAATCAGTTCATAAT
-AGAAGCCCCCATTATATCTCCTAGATTTTTAACCAAAATATCCAAAAAGAATTGGGCTAA
-CATAGCCACACCATCTTGGAATATGTATATTTATAGTGACATGTCATAAAGACTTCTAGT
-ATTTTGTCTCTACTCTTGATCCAAACTCCAGTGGTTCcggtttctctatattaagtattc
-acgtgctttgcatgtgtcacttttcatccttcagcccttagagggaagtatcattcatct
-tcaacttacagatgaggaaactgagactcaacgtagttaaatgatctgtaagacaaggtt
-ctgaatttgaacataggtctcagctgcagagccatgttattgctaacacagcctctgtat
-ggttctccagaaggcccctgatcCACTAAGAAACAAACCTGTCCCCCAATGCCAGCTGAC
-CCTATCCATGAACCCTCCTCCCTCCAGCCAGACAGGCCTCTGCCCGGAGAGGCAGCATCA
-TCTCCAGCTGcctgtactctcatcccagttcagccattcgccaagcatgacaactcggac
-aagacctttccctcctcagcctgtttcctcctgtgctgaggagaaataaaatcctccatc
-tcccacgctgttctgtgaaatgaagcaatcatgtacctaaagtgcgagcacaTagctggg
-catggtggctcacacctgtaatcccagcactttgggaggctgaggcaggcgtatcacttg
-agcttaggagttcaagaccagcctggtcaacatggcaaaaatccaccacttgagactagg
-atttcaagaccagccgggccaacatggcaaaaacccatacaaaattagctgggcgtggtg
-gcacacacctgtaatcccagctactcaggaggctgaggcacgagaatcacttcaacccac
-gaggcagagcttgcagtgagctgagatggcaccactgcattctggcctgggtgacagagc
-aagactgtctcaaaaaccaaaaacaacaataacaaaaaaaaGGGCTAGCACTTATTTTAC
-TTCTAAACTCTCCAGCCTCAACCCAACGTAAGTGAGGTGCATATAATAGGTGCTCAAGAA
-TTACTCATTGATGATAAAAGCAAGCCTGGAACAacaaaaataagagactgggcagaaata
-ttacaaaacatcagaagtagatccctctggggtggaattatgggtgattttattgtcttc
-ttggtgattttttttttctattttccaaactctcAGCTTGGAAGTATGTTATACTGTGTT
-TTCTAATTGTATGACACTATGAACTATACAATGCACTGTACACCTAATAGCAGTTTTTGA
-GAGGAAAGAACAAAACTACTTCATTGGATTGTAAGACTTGTTCTGATTTTGGTAAAGTTA
-AACTCTGCAGGGCAGGAAGAGTAGAGAGGTGTTTTAGAATCAAGGAAATACATTTGTAAT
-CAAGCAATCAAAGTGGTGGTCTTGGGGGGAGGAGGCTAATAAAATTATTATTGTTAATGT
-TATTATTAtttttgagatggagtctccctctgttgcccaggctggggtgcagtggcatga
-tcttggctcactgtaacctccacctcccgaattcaagcaattatcctgcctcagcctccc
-aagtagctgggactacaggcgcacgccaccatgcctggctaattttttgtattttaggag
-agactgggtttcaccgtgttgctcaagctggtctcaaactcctgagctcaggcaatccac
-ccgcctcggcctccgaaagtgctgggattacaggcatgagccactgaacctggccATAGC
-ATTACTTTTTAAAGGAGGAAGAGGATACAGGCAACTTTTCATTGCTTCCAGAACCTGGAA
-CATCAGCTTAACCTTGCCGGCACACCcagctcacctgggatatttgaaaataaacacaga
-tggccaggccctgtcctggtctgaatggccagcatctctaggctggggcctgggagtctg
-tgttttaaGTGGACACAGCAGATCCTGGGCACTGTATAGTAAATaaatctcctcatccac
-tttctgtctcatcttacagatgggaaatcagaagtccaaccaggggaggtgTTTAGCACT
-CTCCTGCCTGAATGGTGAGGGTGGCCAATCTCTTCCTTCACCCCAAGGGCCTTTCTCAGT
-CCCTGTCACCATCTTACCTCTCCCAGTCCTAGCCCCTTCCCCAGCCTTGCTCTGCCAGCC
-TGGAGCTGTTTCTTCCTTTTCTCCCTAAGGGAGTGTTCCCTGTTCTTAATTAGGGAGACT
-CTGGGTATTTTTGTCTCTTTGAGTACTGCGTTCTGTTGCCAGCAAATAACTTTAAATAGA
-AAAAATATGCCCAAAATTAAACTAGAAAACAGAAATAAATAGGAAGGGGGTGGGCTGAGT
-GTCAGCCTGCCCTTGGTGGAGAGGGTGGGctctgggcctcctttcctgcatctctgccat
-ggagaccatcacagtacccaccttctggggtgctgtgcacatcagacaagaagaggcaca
-cagtacactttgcacagggtgtctAAGTGTCCATTAATATCCAAAGTTACTGGGCACACT
-CGTTGCTTGGATTTTGAGATAATTATGTAGAGAAAATGTCAAGGGGCTCAAAGTCCCCCA
-GTTGACATTTCCCTACCAAGAGCTACTTTTATAACATGCTGCCGGATGTCATTTTCTTAA
-TAGGTACAATTTTAAGAGCAtctctccaccttcttccctaccctagtccaactgttcaca
-gctgaaagagtgaccttccaaaagcctaactcagatcatatgattctttgcctctgaaat
-ttttcaaagctctccattgtctacgaaatgccggcctcagagcctttcaggataggggcc
-atgaagggtctcaaatttcaaatttcatcttcctctaccatcctcctgtcaccctccagc
-cacacagacctgccccttggtccccaaaTGGATGCCCACTTCCTTTTTCCCTAATTGAAA
-GCCAGGGCAGAGTTAGGTTAATCACATGCCTTAGCTCCAGCCACACTTTTGGCACCAGAG
-TGAGACCCCTCCCTTATTTTATGTGTCCCTTTCATGCctcatccctactctcatcccacc
-tctcatccctccctcATGTGGATACCCCCCTAACGTGTTTGGCGTGTGTCTTTAAACATG
-CACGTGCCCTTGGAAAATGTGCAATGTTGTTGTCTGTGTGTATGATTTTAATTTACATAA
-ATGCTATTCATATTATGGCTTCTTACCTTTTTTCCTTGACACTGTCTTGAGATCTAGCCT
-GCATATGTGTGGAATCATCACTTCCAACTGCAGAAGAGTCAGCCACAGGGGGTGTCCTCT
-GTGCTTCCCTGCCCATCGTTCTGGTGCTGGTGGCCTAGGCTACCTCTGACTCCCCACAAC
-AAACCTCTGACTGCTTCTTATGTAAGAGAACACAACGACAGCTCCTGCTTTTTGCATAAC
-GAGCCGTTGTTTAGTAACAAGGGGCAGATGCCTCACTCAAGTGGATTTAGACACAGAGAC
-AAAGAAAGTGTAGATCTAGGTGTTCACTAACTCCTCAGGCAGCTGTCTTTCTCCATCTTA
-TCAATTCCAAGATCCCAGCCTCCCACCTTGGCAACTGCAGGGGAAAAGAAGCTCCCGAAA
-CAGTCCCAGGTGACTTTCTGGACCATAGCCTTTGTGCTGTTTCTTTGACGGTGGGATCTG
-GTTTTGTCCTGGCTTCAGCCTTCCCAGATCCATGTGTTTCAGAGGAAGTGAACTCCAGTC
-TCGGGGtgttatggactgaattcgaaattgtgttgaaaccctaaagcccaatgtggctat
-attagaagacatggtctgaagggaggtaattcaagttaaaggaggtcacgagggtggtat
-ccagtaggactggtgtccttataagaggaagagacatcagagctctctcttcacatagac
-acacagagcagatgccacatgaggacacagtgaggaggtggccatctacaggccagaaag
-gcctcaccagaaaccaaacctgatgacaccttgatcttgaacttccagcctccagaacca
-ggaggaaataaatttctgttgctgaagacacccagtctgcagtattttgttatggtagcc
-caagcagactaatacaGGGAATGAACTGTGATTGGTCTAAGGcaatatttctccattttt
-ttttcattattacccctcattattgacctcctgaagagttgttttaagaatttttttctc
-ctaagagtgcctcccacaaaatatatatatactacagacatatctatttatgtagtgtgg
-tttcttggagggtcacaaacggttgtcatatctaagattttgtcataccttaacctaagc
-taatttttacagccttaggagcaatattgccccattgagaatgcaCTGCCTAAGGCAATG
-TACTTGGTCTgtgattggttagaacatgggcatgtgaggctaatgtagaccatagatgtg
-agagccacagaggaagaaattgtcccttttcacctttggtctttattatggatggacata
-atgcctggatctgcggcagctattttgtgactatgaggacaggctgatatgctttaaatg
-gccaactagtagataaaacctaggccattgttcatatatatatatatatttgagatggaa
-tttcactcttgtcacccaggctgaagttcagtggctcgatctcagttcactgcaacctct
-gcctggttcaagctattcccctgccagagccttcagagtatctgggattacaggcaccca
-ccaccactcccagctaatttttgtatttttagtagagacgacgtttcaccatgttggtca
-ggttggtctcaaactcctgacctcaggtgatccacccacctcggcctcccaaagtgctgg
-gattacatgtgtgagccaccacacccggcccactgatcatatttttgagcaataaaagta
-accagccctgaaactgccctaccacaaactcctccttatgtgaaatgatgcattttcaca
-tttcagcctgttcagctgtgtagtttttgtaattgcagctgaagacattctaacagaTCC
-TGTtctttttcccgtaagttgtaccaaatgttctgaggcagactggcagtgatgggcctg
-gttagtccatgagttcatccccaaaccaatcttgtggccagacttgaatcctgtgcccac
-ccacctttgtagctcagggatgggaaggggtcaaccccacctggactgagaactgggggc
-tgttcctccgagggagatgagggagatacttcccaaagggattgtgaatgctgagagggc
-agaaatgacagctgGGTTTCACATTCACACCATCCCTTCTACATGAAATACCCCATCTCC
-AGCCCAATATACTCCCTCTAGTGCAGCTCAGCATCTCCCTCTTCTGAAAGGTCTCCCCAA
-GACCATGTTGAAATTATCTCTTCTCTTCCAGGTGATGCTCACTGGGGCATTTGTAGTCTA
-CCTCTGCCCTTAAGAGGCCAGTCTTCATGGCATGCAATCattcatgcatccatctaccct
-ccaatcttaattagcaccttctgtagccatccctaggccttggggtgctaagcaagaaaa
-aggcataatttccatcctcaaggatctcacagtccaggggaggaagcaaaactcataggc
-attcatTCGACACACATTTATTCTCTGTATAGATATGAGTAAAATATTGCATATCCTCAA
-GGAAAGGGGGAACTCCCCAGCTAATGGGACAGACAGATGAAGAACAAGTAAGTACAGTGT
-ATAATGAGGTGACAGAAGCCACCACTCATTGCTCTGACTAGGAGGAAACAACAAGATGCC
-TTAGACTCTTTTGGCCAAGGAAAGACACACTAGCTGTGTGAATGCCAGGTGAGCTGGCAT
-CATTTGTCTGGGATAGGGTGCAGTGGAGGCTGTTGAGGCCTGACAGCTTCCCCCTTCACC
-TTACTCCATTGTTTGCCAGGCTCATGCCTGGGAGAACCATATGCATAAGAAGACCTGGAT
-CTTATAGGAAGAAGAAGTGGAAAAGCCAATACCTGACCTCCAGGAATCAGAATTTGtgtt
-gcaggttgggttctatgcaggcagacacgaagacagagtttaggtgcaaggtgtttatta
-ggaatcaatatctggaaaagaaaggggcaggaatcagggttgaggaggaggagatactta
-actgcaatgtgacccagtaaagcgttggtcaacatggtgaggaagttgggagcaagaatt
-atccctcgatagacaccccgttctacatgatgtaattattatgaattacatgcctgtatc
-aaaacatctcatgtaccccataaatatatatatacctactatgtacccacaaaaattaaa
-attaaaaagagttacccctcagagaatcccaaaagatatcaaaatatccagacttttgtc
-tcagccccttcattttgatagttcactattcaccaaatacaggttgccccaggaagggca
-tggcctgggatgaagtggccctctcaagctgaggctaaccttgaaggggctgaagctgaa
-ggctctctgctgaccatgcttccCCCGCCTTCAGCTGTCAAGTCCTTCAGGGTCAGCTCA
-GTTCTGAGTGCCACTTTACTTGGGGTCACTTCTTTGATTCCAAGCAGTTTAACATAATGG
-CAACCACAGTTAGGGAGACCTGTCCTGGTGGATCAGGGTGGCCCAAGCTAAGGTCTGGAG
-GAAAGACGACCCTCAAGAAAAGATGTCTCCTCTGTCCCTCCACCCCATTCATACTAAGGG
-CCATGGGTTCATGGAGAGGGTTTCAGATGGGCACATTATAGGGCTGAGGCTAAAAGTCTC
-TTTGAACCAACTCACACTTGTACAGAAGTGATGCTGTGAGGACTAATGAAaacaagtagc
-atctactgcatgcttaacatacaccaggcactattccaaattttttacccacattagtca
-tttaattctcacattaccctatcagaggaacaatgatGAGCATGGGTATGTAGACCAGAA
-GGAGCTAAAACCCTAGAACACAAGCAGAGGACACCAGTGAGCCCAGGAAAGGCCCTGGGC
-CCCTGGAAGCAGTCTCCTCATCCGCCTGCATGGGCCAGGGTTCAACAGAGGCACCATGTG
-GCTGCAAGAGGCAGAAATGGCTGCAGACTGAGCTCTACTAGTTCCTTCCACTTGATGTTT
-GAATAAAGTCCCTGGAAAACTTGGGGAGATGGGATGAGTATCTCAGCTGGGAACACACCA
-AGACTTCTTAATAAGGCATGGAGAGGCTCAAGCAATTGATTGGAAAGAAAAAAAAAAAAC
-AAAACTAACTCAAGTTGGTAGATTTTACCTGCCATGAGATGTTTGTGAATAGCAGAGCAC
-AGGGTAGAGAGGTCACTGCCAAAGAGCAACTCCCAGTCACCCTTGACATGTGGCATCCCC
-TCTCATGCCTCCACGTCTGCATAAGCTTGGTAATCTTGTGCCCTCTGACACCATTCTCCC
-ACCTGTCACCCCACTCCATTCTGCCCATCAGGATAATGCTGCCACATCCTCCAGGAAGCC
-TTCTCTGGCTGTCCTTCTCCATGACGCTAGGCTCCCCTTCCATCTTCCCACAACTTCATG
-TACCTCCCTCTATCATTTTATTTATCAATCATTCTAGATTTTATGTGTTTATGACTGACT
-TTCCTCCTAGATTATGAGGCAGTATGATTATATTATTTACCTTTCCCACTGTCATGCATT
-CCCATTTATCTCACTCGGCGATTGTCACAACAatgctgcaaactaactaccactaagctc
-agtggcttaaaacaataacttcttctcactcatgggtctgtaggtcagctgggattctgg
-tggtctagactgggctgggctccaggcatgcatgcggatctgctccacgcgtctctcatc
-ctccttgacccacagaagacagctggaagcaggcaggacctcataggctttagctcagag
-ctggtgtgctgtcacttctgcccatgttccatcagccagagcaagtcacatggccaagct
-caacatcaattagatgtggagaaaattgatgagtcatgtggcaaagggcatggatatagg
-aaaaggtgaaaattAGGAATAGTATGATTTACTGTGACACAGATGCTTTCTGGTGAACAC
-CAacctctccaaactcatttcaagacccttcctcatcagcccagtgctcaaggtcaattc
-ctgcaaccttcagccctttgtagcctttcagtcttttgaacacactgtactttttgtctg
-acatacacctttcccatccctttcagatctcagctgagatgtcatctcctcaaagaTTTG
-CATGGCTGTAGGCTTTGCCACCAGGAGATAGTGACCCAACAAACAAGCTTGTATGGGTGA
-GTCCCTGAATCCAAACCCAACCCTGcctggccttgccactcactgctgtgaggccctaag
-aaaatcttatcttttttctactgctgttttcttatctgccaaaagtaaataaaaacaTCT
-TCCCAtatcagttagaaatgcttgcagctgcaagtagcagaacccctaatagtagctaaa
-acaataatatctcacaaactagatgcctggaagcaagaagctccagggctggtttattgg
-ctcagtgatgtaaggacTAAGTGCTCACTCATACCCTCTCATTTCTCCTCCTTCCCTTTC
-CCCATTCTACtaggttggtgcaaaagtaattgtggtttttgccattactttcaatggcaa
-aTTGtggtgcaaaagtagttgtggtttttgccattactttcaatggaaaaaacagcaatt
-acttttgcaccaacagcaaaaacagcaattacttttgcaccaacctTAATATTTCCACAG
-TGTCTTCCCTAAAGTCTCACAGAAGGTTCCCTTTACATTTTACTGGGCAGACATGGATCA
-TATGGCCACTCTAGCAGGAAAGTGAAGTGGGAATGCCAATATCAGGGTTTTGTTGTTGTT
-GTTGTTCAGCCTCCTTTGGGGGAAGCAGCAAACGAGAAGGGGGTAAGAATTGGCTGCTGT
-GTAATCAACTCACAATATCTACTCCTGATCTAACTTTCTACCTCACAGAATTTTTGTGAA
-AATTTGGATTGCCAGTAGCACTCTGAAGGCCACAAGCTTATAAAATAATAATCTACTTTT
-ATTATTATTCATGACTTATTAAGAAAAAATCAATATTGGAAGAGAATAATACTTCGCATT
-TGTTCAACAATGAACTTTCCGAAGGTGAAAGGAAAAGCAATTACTGTCTGAGCCCAGCCT
-GAGTCCCAAGTCCATGCCAAGCGCAAGCCTGCAAGACCATTTCCTCCTCCAGGGACTTGC
-TTCGATTGTGctaaaacagcttctgccaagccaaccaggattgcatgctgccaaatccag
-tactcattttcctgatcttattttatttgaattccctgagcattcaatccagttggcagc
-accctccttgatacatgatcctgtctgggcttctgtatgctcacagccctggttgttcct
-cagtctcctctgctggcttctccccatctacctggtttctagatgccagctgactcagga
-ctcacatgtgagctcctctcctccttcccaccccctatgctctttctgtctcaGGTttct
-caaaccttagcatgcatcaccgtcacagggagggcttgttaacacatagattgctgggtc
-tcactcccacagtgtctgatttcatcgctctagggtgaaacctgaacacttgcatttcta
-acaatttctaggtgatggtgatgatgctggtcctgggaccaccccttgagaacctctCAC
-TGCTCTatctcaaccagtgttgagagccttgtttctcagccttggctgcaaattggaatc
-acccggggtgctttaaaatatggacaccaggatctcatcccccagagattctgattttaa
-tggtctgcattatatcctgggtacctagagttaaaaacctcccccaggtgacttcaacat
-gcaggtaaagttgaaagcccctaatttagatactacttaactgctagtaacacctacatt
-tatttccctctcccagacttgtcctctgagttttagcccagtatgcccaattattcactc
-gatatctccacttacgtgactcacaagcatctgagagttaacacacccaaagtggaagtc
-tgaatcttcacttccaaattgctacttctctatcttccccatctcagcaaacagcaactc
-catccatgtgctgtagtttattggggtaaaaaccttggagttatctttggctcctctctc
-ccctccatgacccatatataatcctttgacatagtctatcggttccacctacaaaacata
-tccctaaattctcctctctgcctgaactgctaacacctacatcagaatatcatcaactct
-ttcctgggtggtctctgcagcatcctcacctccctacttctattctttactccctcgcca
-atgcatcctccaaacagcagccagaatggtctcttaaaatcataaaccagatcatgatac
-accccgatttaaagtcttgcaaaacttcctgtcaccttgggcataaaatctcagctcttg
-ctcatggccagtgagatcctgtcctcttctcaaccttgtctattccgctctctccctggc
-ttagatactccaaacacactggccttccttctgtcccttaaatacattcagttatttctt
-gcatttactatttcattaacctggatttctgttccctttggactctgcttggccagctac
-ctctcatctttcaggtctgcttaagtgtcactgccttaaagtgtctccctgacccgcctg
-ttatgttctatcataagactctatattcttcttagcgcctatcagagttggtgatcattt
-gatttgtaaatatattggtttattatttgtctctctcactagactgtgtgctttgtgagg
-gcaggaaccatgcctgttttggtcacggttgacacctcagtgcccagaagagtgaatgag
-acatagtgggtattcaaaacatacttagggagggagagaaaagaggaagaaaaaggaggg
-aggagaaaggaaggTCTAGTAATACTCAGAGCCCAGGAATTACACACCAGATACCCCTTG
-CTTCTACCCAAGAGGTGGTTCAGATTAGAGATTAGATTTCAAGGCTCCAGCTTGCTAGCT
-CATAACTGCTTCTACTCAAGACGGTCTATTCATGTAGCAAAGTCaaaatgtgaacatgct
-tttaagttccttgacgacaggaattgtggcttgtttactcttctacctggcatttgcaca
-gagcctgggcctgaatgaaagttcagtaaatggttcatgaatgaTTTGAATGGCATTTGC
-CTGAAGGAAATCTAAGAAAGTCTTGCCTTGGTTTCCCCATTAAATGGGGCAAGCAATTCT
-TATCTCCCCTTCCAGAGAGCTGCTGCCAACACAGGGAATCCATCCTGGAAGAAAAGATTG
-GTGGCCACCTGCACCATCAGGTGGAGGGCATCTCTCAGCTGCCCTTGCCACATCTGCAGC
-CCTAAGCTTCCAGGTGACCCCAGTGGACCAGTCTGCCCAGAGCATATCATTAGTTAGGGG
-CACTCTGCAGGAGGATGCCTGCCTTTGCTAGTGCATAGCTAATGTCCCAGGGGGCTTCCT
-CTAATTAAAACCCAAACTGCAATTATAGTTGTGCCAAAGCATGTGCACATGGCGCCACTT
-AAAAGGGACAGATTGACAAGGCGTTAACAACTCCAGAGGCAGCATTGTCCCAGCACCAGG
-TGCTACCAATCATCAAAATTAGAACCAAATGAGTCACTGGGGCTCAAGATACAGTATCCA
-GTGCAGACTAATGGGTGATTCCAAGAAACTTATGAGGATTATTTAAaacacactaactat
-gctccttctacagggcctttgcacttactagtccctgtacttcttcttgcctaactctat
-ttgatctctctcaattatcacctcttctgagacacctgctttgatcacatgaatctctac
-cctgctttatttttcttcttagtgtttattatcatctgatattatatatttgtttTGCGA
-TTGATAGCCCaaaatatgttttaatattgtataaatgtaaaacatatataaatacacaaa
-attttataattttCTGCAATACATATGTATCAAGAAGATACAGCATACACACTAAGGAGG
-GTGTCTTCTTGGGGTTGGGGGTGGTGAGGCAGGGGAATAGAAAGACTGATTCAGAAAGAA
-GAGAGGAACAATAAAAGAACAAATGAGAATATTTATATATCCTGATGACAATAGTGGGCC
-ATTATTTGAAGAGTATGATAAACTTGAATTTTCCTTCCTATCACTTGGTAAACTTGAATT
-ATTCCTCCCTGAAGTTCTGTACTCTGGGAAAAttttcttttttttttttttttggagaca
-gagtcttgctctgtcaccaggctggagtacagtggcacgatctcggctcactgcaacctc
-tgcctcctgggttcaagtgattctcatgcctcagcctcccaagtagctgggattataggc
-acatgccaccacacccagctaatttttgtatttttagtagagacagggtttcaccatgtt
-ggccaggatggtctcgatctcctgacctcatgatctgcccaccttggcctcccagagtgc
-tgggattacaggtgtgagccaccatgcctggccACTCTGGGATAATTTTATTTTGGTTTT
-TAGAAATAACTTTATTGAATATTTTAGTACCAGTAATCTTGCGATAAATTTCAGCCCTGG
-TTTGGTTGTTGTTgttgttgtttttggtctaaagccatcttgattttgcctttatttttg
-aagagtatttttactagatatagaattctaagttgtcaattatgtatattttttcagcac
-tttataaatgttatttcattgtcttctggctttcatcatttctgttgaaaagtctaccat
-cagtcttattgttgctcttctgtaggtaatgtcatttacctctgactacttttaagattt
-ttctctttatttttgtttttcagcagtcttactatgatgttcctatgtataattttctta
-gtatttaccctgcttgggattgtcagagcttcttgagtctgtgggttgatatcttttatc
-agttttgaaaaaattcttagctcttatttctgcaaatattgttaattttgtattcttatc
-ctcaccttctaggactccaaataaatgtatattttttttactaggtcccacatatctatg
-acacattcgtgtattttctattatttttctatgtatactttagtttggacacttttcatt
-tttttaagtgtgctaatcctatcttccactgtatcaaatctctgttaatcccatctgatg
-aatttttgatttcagatattatattttctcattctagaggtatcattttttcttttttat
-agacgctaattttctgatgaaattctccatcttttcaaatattttgtgcatatttttctg
-ttttttaaCATATTAATCTTAGCATGTCAAAGTCATTATCATATACCTGTTTCTATTGTC
-TATTTTATTCTGTTTGTTTTCAGATATGTCCTAGCTTTGGCATAACTAATAATGTTAATA
-GAATGCCACTTATTATACATAATGTAGAGACTCCAGATGATATATTCTTCTAGAGAAGAT
-TTACCCTCTGCTAGGCACAGAGTGGGGCTTATCATCATAAACCAGTCAGGGATTGTACTG
-AGTCAAGACTGTAAGGTAACCCCAGGAAGGTCAGTTTCCCTGTGCTTCAGTCAGTCATAC
-ACTGAACACCTCTTCTCAGAGGCTTTATGCCAAGGTTTATAGCCTCCTGCACCAGGTATC
-CCAGAATCCAGCAAGTGTCTTGAGGGATTAATGAGCCCTCAAGTCTGCCAAAGGCTCTGC
-TGGTTTCTTCCACACTAGTCCAGTGCTGCATAAAACTTGGATTCTCAGCATTCTGCTTTT
-GCCTAGAATTGGAAAATGGTCTGGGGTAAAGAAGCTATATAATTCAGCTTACTCCCCTGC
-TGTTCATTCCTTTCCAGAATTTTAGCAAGTAGTATATTTTTTTCCAATCCTatgatatct
-gacaatgctactatatttctctagtcaatttactcttccatttcctgggcaaccatttca
-ctttctcttatttcttcacatctttgacaccttctttctctcctcacttctaactgacgg
-cttacaaatgaaagcaagtggaatgacaataactttttataaaaacttctacactagtcc
-atcaacacgtctctctaatacttctccctccctctctttctctctctccctttctctctc
-tccatgtgtctgctggatcccatcattctcatctaatcaaggactttgctcctataatca
-tccctccatgaatcattttcctctctctgctaaattattcccataagtggacaaatatac
-cattagtctcccatcttctaaaaagtatataccctcccttgtctcaatatctctgtgcag
-ctacccccacattttgtttcttcccatttgaagcaaaactcctcaaaaattgtatatatt
-cactatcttcattttctttccttctatgccaaacaggttttcctccttcaaagctactct
-catcagggtcaccaaatacctctgcattgccaaatccagaggtcagttcacagacctcgc
-cttacctgattgctcagaagcatttgacactgttctctttgctggttcttcctcatgttc
-tcgacatctgagtgttggagacccccaaaatcagtcctaggactctttcttttccttcta
-tatattccttttacgtgctttccttattctctttgtatataatttaatacctctactggg
-taatttacaaagaaaacaaacttatttctcacagttctagaagctggaaagtccaagatc
-aaggcagcagcatgttcagacgtgtggtgagggctgccctctgcttcctagatggtgcct
-tgatgctgttgtcctccagaggagaggaaatctgtaaattcacatagtggaagatacgga
-attatgaaaaaggaacaaactccctccatcaagctcttttatcagtaccttgatccattc
-tgccctcatggcttaaacacctttcaaaaggccccacttcaacactgttgcattggcaat
-taagtttccaacacacacattttggggaacacattcagaccatagcaacccttttgttca
-gtctcatgattttaaatatcatttatattttatgactctcaaatgattctagccagaaat
-tatctcatgagctctagactctctctacatacccacattaacaGCAACGAAAGCACATTT
-AATCAATTTAACCCAAGGAAGTAATACGATGAGCTCAGGTAATACAGACTGAGACTTCAT
-CCAAGATCACAAGGATGGTATGTGCTAGACTCCAAAGAGATGCCCAAGATTTTGTAAATA
-CCCTTCCCTTCCACAAGAATAGAGTTGTTATTTGGTGTGATTTCTCAGGGAGTTGGGGAG
-ATCTCTTATCAAACTCCCAAATTGCTCTCCAATCTGCTCAAGTTTTCTGAAATGTTGTTG
-tttctgggtcatagcatatgcacatacttactttggttaagttcagccaaattatttctc
-cagaatggctgttccagtctacattctttccagccatgcctgtgggctcttatctccaca
-tctttgccaggtattactagccttttagtttttgcctggttaataaatgtaaagtgctaa
-ttctctgatgttttatttatcatattactaattaatttgagcatctctcacttacttgtt
-ggcttgtttctttttccataaattggtatccatttctcttgccagttttttattatggag
-tatatatatattgccaatttaaaggacttctttgaatattctagTGATTTGTCCCCTGTC
-AATTTTAGAAATTGCAAACATCTCCTAATTTGTCATTAGTCTATTATCTTTGTCTTTATG
-TCTGTCATTTAAGAGAAATCATTTTCCTGTAAATGTTTTAAAActttttattgtaaaata
-aaacacattaaaaatctcacacggcaaatgtttaacttagtaaattattataaactgaac
-cctttaaagtattactcaagtcaagaatataactttgccggccattcagaagcccctccg
-tatgttctatcccaattatagctccctctcccctccaaaagcaatattaccctgactttc
-atatcaatcactttcttgcttcttttatcatccaagtgtgcacccccagacactatggtt
-tagtcttgccATTTAAAAAAATgtttatatgtattttgagtctcttttaatctacaggct
-ccctttccatctcttctctttctttaatattcatctgttgaagaacccaggccatttgac
-ctgtacagagtcccatagtttggaatttgctgattgcaagtcttggtgaagttcaagatt
-cctctgtttaacgtctttactgtaaatggacagctggtccagaggcttcatcaggctcag
-acgctgtgttattttatcatgtggcacattcctatctgggtgcttctctttgagaaggca
-gtgacacttaaagattagatctattgattcattgcggattggaaaaaggggatgttctaa
-ttccattttttttttcattttttttaactggaataattttataaagagacacttttctca
-ctcgccattggttattgttacgaactgaattgtatccctccccaaattcattcattcgtt
-gaaacctagcccccaatgtcactgtacttggatatagggccgctagggaggtagttgagg
-ttaaatgaggtcagaagggtagggtactaatccaataagactggtacccttagcaaacaa
-agagactccagtggtctgtgtccttctctccatacctgcaaagaggaaaggccatatgaa
-gacacaatgagaagtcagccctctgtaagccaggaaggaagactcaccagaaaccacatt
-ttgtggcaccttgattttggacttcccagcctccagaactgtgagaaaataaatttctgt
-tgtttaagccacccattcggcggtattttattttggcagccctagcaaactaacaccatt
-acccaagtggtataattaatacataaaagagaagataactgcttgattctctttatttac
-caggtttcgagataatgaatttgttcctgttatcctccaaaggctaccatttaaattctt
-ttgttattattaaatcatggatttaagtatagtttgtggttttcaatccattgcattttt
-attctaattgacaatcaagttgttccatctttgaacagtaggaagctctttggcttggct
-cctgaggccttttgacttatctcccttagtccttgaagcttctttgtatcttgaatgaca
-aaatattccaggcttgtcctaccttcatatcctgctttaaacctagaatcagccatttct
-tcaaggagtcctgggtccttctaatgagaaattttatttcaagactataatatgaatgct
-agagatgttcactgctcctgggctgctcattaagtctaggcttcttgagtgggcaaagct
-aatatacatatatgtatgtgtgtgtgtgtgtatatatatatatataactcatgaattcat
-actggttcaatgagttcagttctaacttagaactcagattgttcacttaacttcttttac
-actatatttgaatcttttttcttacattctgagaattctggttcttaatatcACAGGGAG
-TGATATAATTAGGATGTCAATAGTCTTTAATTATTTAATTTATCCCATGTTGTACACACA
-ACAATACTACCAATCCTAATTACTGACAACAGTTTAAAAAGTTTTGCATATGCTATTCCA
-TTCCCTCCCCATTTTTATATTTACATAATCAAATAATAAAGCCTTTAATATATAGTCTCT
-ttctggtcttagttccgcaagtgggtatatataaaggctcaaaatcaatctttatattga
-catctctctacttatttgtgttgtctgatgctcatattgt
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta.fai b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta.fai
deleted file mode 100644
index 04a438b..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-chrM	16571	6	60	61
-chr20	1000000	16861	60	61
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta
deleted file mode 100644
index 9b75d10..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta
+++ /dev/null
@@ -1,16946 +0,0 @@
->chrM
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTT
-CGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTC
-GCAGTATCTGTCTTTGATTCCTGCCTCATTCTATTATTTATCGCACCTACGTTCAATATT
-ACAGGCGAACATACCTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATA
-ACAATTGAATGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCA
-AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGCCAAACCCCAA
-AAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAATTTTATCTTTAGGCGGTATGC
-ACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTA
-ATCTCATCAATACAACCCCCGCCCATCCTACCCAGCACACACACACCGCTGCTAACCCCA
-TACCCCGAACCAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCCTCA
-AAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGG
-TCCTAGCCTTTCTATTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGA
-GTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGC
-TCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAACCTTTAGCAAT
-AAACGAAAGTTTAACTAAGCTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACC
-GCGGTCACACGATTAACCCAAGTCAATAGAAGCCGGCGTAAAGAGTGTTTTAGATCACCC
-CCTCCCCAATAAAGCTAAAACTCACCTGAGTTGTAAAAAACTCCAGTTGACACAAAATAG
-ACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAACTGGGATTA
-GATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAG
-AACACTACGAGCCACAGCTTAAAACTCAAAGGACCTGGCGGTGCTTCATATCCCTCTAGA
-GGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATA
-TACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAA
-AGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCAAGAAATGGGCTACATTTTCTACCCC
-AGAAAACTACGATAGCCCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTG
-AGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCC
-TCAAGTATACTTCAAAGGACATTTAACTAAAACCCCTACGCATTTATATAGAGGAGACAA
-GTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACA
-CAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAAACC
-TAGCCCCAAACCCACTCCACCTTACTACCAGACAACCTTAGCCAAACCATTTACCCAAAT
-AAAGTATAGGCGATAGAAATTGAAACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGA
-TGAAAAATTATAACCAAGCATAATATAGCAAGGACTAACCCCTATACCTTCTGCATAATG
-AATTAACTAGAAATAACTTTGCAAGGAGAGCCAAAGCTAAGACCCCCGAAACCAGACGAG
-CTACCTAAGAACAGCTAAAAGAGCACACCCGTCTATGTAGCAAAATAGTGGGAAGATTTA
-TAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTT
-AGTTCAACTTTAAATTTGCCCACAGAACCCTCTAAATCCCCTTGTAAATTTAACTGTTAG
-TCCAAAGAGGAACAGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAAAATT
-TAACACCCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACC
-CACTACCTAAAAAATCCCAAACATATAACTGAACTCCTCACACCCAATTGGACCAATCTA
-TCACCCTATAGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAA
-GCCTGCGTCAGATCAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCA
-ACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAAGGAAAGGTTAA
-AAAAAGTAAAAGGAACTCGGCAAACCTTACCCCGCCTGTTTACCAAAAACATCACCTCTA
-GCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACC
-CTAACCGTGCAaaggtagcataatcacttgttccttaaatagggacctgtatgaatggct
-ccacgagggttcagctgtctcttacttttaaccagtgaaattgacctgcccgtgaagagg
-cgggcatgacacagcaagacgagaagaccctatggagctttaatttaTTAATGCAAACAG
-TACCTAACAAACCCACAGGTCCTAAACTACCAAACCTGCATTAAAAATTTCGGTTGGGGC
-GACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCG
-AACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAA
-CAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGAT
-CAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAACGATTAAAGTCCT
-ACGTGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTC
-CCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATG
-ATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTgttaagatgg
-cagagcccggtaatcgcataaaacttaaaactttacagtcagaggttcaattcctcttct
-taacaacaTACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGC
-ATTCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAA
-CGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCATAAAACTCTTCACCAA
-AGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGC
-TCTCACCATCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCT
-CAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTG
-ATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCA
-AACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGG
-CTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATC
-ATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTT
-CGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGG
-CCCCTTCGCCCTATTCTTCATAGCCGAATACACAAACATTATTATAATAAACACCCTCAC
-CACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTACACAACATA
-TTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCC
-CCGATTCCGCTACGACCAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCCT
-AGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCCCCCTCAAAC
-CTAAGAAATATGTCTGATAAAAGAGTTACTTTGATAGAGTAAATAATAGGAGCTTAAACC
-CCCTTATTTctaggactatgagaatcgaacccatccctgagaatccaaaattctccgtgc
-cacctatcacaccccatcctaAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCC
-GAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTAC
-TCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACCTGA
-GTAGGCCTAGAAATAAACATGCTAGCTTTTATTCCAGTTCTAACCAAAAAAATAAACCCT
-CGTTCCACAGAAGCTGCCATCAAGTATTTCCTCACGCAAGCAACCGCATCCATAATCCTT
-CTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGAACCATAACCAATACTACC
-AATCAATACTCATCATTAATAATCATAATGGCTATAGCAATAAAACTAGGAATAGCCCCC
-TTTCACTTCTGAGTCCCAGAGGTTACCCAAGGCACCCCTCTGACATCCGGCCTGCTTCTT
-CTCACATGACAAAAACTAGCCCCCATCTCAATCATATACCAAATCTCTCCCTCACTAAAC
-GTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGATTA
-AACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATA
-ATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATC
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTA
-TCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCC
-CTAGGAGGCCTGCCCCCGCTAACCGGCTTTTTGCCCAAATGGGCCATTATCGAAGAATTC
-ACAAAAAACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTC
-TACTTCTACCTACGCCTAATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAAC
-GTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATC
-GCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATACTAATAATCTTATAGAAATTT
-AGGTTAAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTG
-CAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTA
-ATTAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGC
-TAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCGGGA
-GAAGCCCCGGCAGGTTTGAAGCTGCTTCTTCGAATTTGCAATTCAATATGAAAATCACCT
-CGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTC
-AGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCAC
-AAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCT
-CTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCAC
-ATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCC
-ATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATG
-GCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTG
-CTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTA
-GCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTA
-GCAGGTGTCTCCTCTATCTTAGGGGCCATCAATTTCATCACAACAATTATCAATATAAAA
-CCCCCTGCCATAACCCAATACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATCACAGCA
-GTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGAC
-CGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGGAGACCCCATTCTATACCAA
-CACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATCCTACCAGGCTTCGGA
-ATAATCTCCCATATTGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGT
-ATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATA
-TTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATC
-GCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATG
-AAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGC
-CTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTAC
-GTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGC
-TTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATC
-CATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGC
-CTATCCGGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATC
-CTATCATCTGTAGGCTCATTCATTTCTCTAACAGCAGTAATATTAATAATTTTCATGATT
-TGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTG
-GAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGAAGAACCCGTATACATAAAA
-TCTAGACAaaaaaggaaggaatcgaaccccccaaagctggtttcaagccaaccccatggc
-ctccatgactttttcAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAA
-TTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACG
-CTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTT
-TCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTA
-ATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCA
-TCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACG
-ATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCG
-ACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCG
-ACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTA
-TAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAA
-CAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTAT
-ACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAG
-AATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATTTACCCTATAGCACCCCCTCT
-ACCCCCTCTAGAGCCCACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAA
-GAGAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCA
-TAATTACCCCCATACTCCTTACACTATTCCTCATCACCCAACTAAAAATATTAAACACAA
-ACTACCACCTACCTCCCTCACCAAAGCCCATAAAAATAAAAAATTATAACAAACCCTGAG
-AACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACC
-CGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCAT
-CAACAACCGACTAATCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGAT
-AGCCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTT
-TATTGCCACAACTAACCTCCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACT
-ATCTATAAACCTAGCCATGGCCATCCCCTTATGAGCGGGCGCAGTGATTATAGGCTTTCG
-CTCTAAGATTAAAAATGCCCTAGCCCACTTCTTACCACAAGGCACACCTACACCCCTTAT
-CCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGT
-ACGCCTAACCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCAC
-CCTAGCAATATCAACCATTAACCTTCCCTCTACACTTATCATCTTCACAATTCTAATTCT
-ACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGT
-AAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTA
-AAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTA
-GCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACA
-CTAACCATATACCAATGGTGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCAC
-ACACCACCTGTCCAAAAAGGCCTTCGATACGGGATAATCCTATTTATTACCTCAGAAGTT
-TTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAA
-CTAGGAGGGCACTGGCCCCCAACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTC
-CTAAACACATCCGTATTACTCGCATCAGGAGTATCAATCACCTGAGCTCACCATAGTCTA
-ATAGAAAACAACCGAAACCAAATAATTCAAGCACTGCTTATTACAATTTTACTGGGTCTC
-TATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGC
-ATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGC
-TCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACAT
-CACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTTTGACTATTT
-CTGTATGTCTCCATCTATTGATGAGGGTCTTACTCTTTTAGTATAAATAGTACCGTTAAC
-TTCCAATTAACTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCCTTAATTTTA
-ATAATCAACACCCTCCTAGCCTTACTACTAATAATTATTACATTTTGACTACCACAACTC
-AACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCC
-CGCGTCCCTTTCTCCATAAAATTCTTCTTAGTAGCTATTACCTTCTTATTATTTGATCTA
-GAAATTGCCCTCCTTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATA
-GTTATGTCATCCCTCTTATTAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTA
-CAAAAAGGATTAGACTGAGCCGAATTGGTATATAGTTTAAACAAAACGAATGATTTCGAC
-TCATTAAATTATGATAATCATATTTACCAAATGCCCCTCATTTACATAAATATTATACTA
-GCATTTACCATCTCACTTCTAGGAATACTAGTATATCGCTCACACCTCATATCCTCCCTA
-CTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAAC
-ACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAA
-GCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTA
-CATAACCTAAACCTACTCCAATGCTAAAACTAATCGTCCCAACAATTATATTACTACCAC
-TGACATGACTTTCCAAAAAGCACATAATTTGAATCAACACAACCACCCACAGCCTAATTA
-TTAGCATCATCCCCCTACTATTTTTTAACCAAATCAACAACAACCTATTTAGCTGTTCCC
-CAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTACCTGACTCCTAC
-CCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGCGAACCACTATCACGAAAAAAAC
-TCTACCTCTCTATACTAATCTCCCTACAAATCTCCTTAATTATAACATTCACAGCCACAG
-AACTAATCATATTTTATATCTTCTTCGAAACCACACTTATCCCCACCTTGGCTATCATCA
-CCCGATGAGGCAACCAGCCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCC
-TAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCAC
-TAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACT
-TAATATGACTAGCTTACACAATAGCTTTTATAGTAAAGATACCTCTTTACGGACTCCACT
-TATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAG
-TACTCTTAAAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGA
-CAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATAACAAGCT
-CCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACA
-TAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCA
-TTCTCATAATCGCCCACGGACTCACATCCTCATTACTATTCTGCCTAGCAAACTCAAACT
-ACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCAC
-TAATAGCTTTTTGATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTA
-ACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCC
-TACTTACAGGACTCAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAA
-CACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAA
-ACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCA
-TTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAACATCAGATTGTGAATCTGACA
-ACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCC
-CCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATTGGTCTTA
-GGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCACACTACTATAAC
-CACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTTAACCCTAACAA
-AAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCT
-CTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTG
-AGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACTACTTCTCCATAAT
-ATTCATCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATAT
-AAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATTTTCCTAATTACCAT
-ACTAATCTTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGG
-AATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGC
-CATTCAAGCAGTCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCTTAGCATG
-ATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCC
-AAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGG
-TCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCA
-CTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGA
-AAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGC
-AGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAG
-TCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCA
-CATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCA
-CAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCT
-CACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGG
-TTTCTACTCCAAAGACCACATCATCGAAACCGCAAACATATCATACACAAACGCCTGAGC
-CCTATCTATTACTCTCATCGCTACCTCCCTGACAAGCGCCTATAGCACTCGAATAATTCT
-TCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACATTAACGAAAATAACCC
-CACCCTACTAAACCCCATTAAACGCCTGGCAGCCGGAAGCCTATTCGCAGGATTTCTCAT
-TACTAACAACATTTCCCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACT
-CACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTAAC
-CAACAAACTTAAAATAAAATCCCCACTATGCACATTTTATTTCTCCAACATACTCGGATT
-CTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCT
-GCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACA
-GCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTT
-CCTCTCTTTCTTCTTCCCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCC
-GAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACCACTACTA
-ATCAACGCCCATAATCATACAAAGCCCCCGCACCAATAGGATCCTCCCGAATCAACCCTG
-ACCCCTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCA
-CCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAA
-CACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCCATCG
-CTGTAGTATATCCAAAGACAACCATCATTCCCCCTAAATAAATTAAAAAAACTATTAAAC
-CCATATAACCTCCCCCAAAATTCAGAATAATAACACACCCGACCACACCGCTAACAATCA
-GTACTAAACCCCCATAAATAGGAGAAGGCTTAGAAGAAAACCCCACAAACCCCATTACTA
-AACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGA
-CCAATGATATGAAAAACCATCGTTGTATTTCAACTACAAGAACACCAATGACCCCAATAC
-GCAAAATTAACCCCCTAATAAAATTAATTAACCACTCATTCATCGACCTCCCCACCCCAT
-CCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAA
-TCACCACAGGACTATTCCTAGCCATACACTACTCACCAGACGCCTCAACCGCCTTTTCAT
-CAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCA
-ATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACG
-GATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAG
-CAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAG
-TAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCT
-GAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCT
-TACCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACGGGAT
-CAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACA
-CAATCAAAGACGCCCTCGGCTTACTTCTCTTCCTTCTCTCCTTAATGACATTAACACTAT
-TCTCACCAGACCTCCTAGGCGACCCAGACAATTATACCCTAGCCAACCCCTTAAACACCC
-CTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGATCCGTCC
-CTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCC
-CCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTT
-ATTGACTCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCT
-ACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCC
-TAATACCAACTATCTCCCTAATTGAAAACAAAATACTCAAATGGGCCTGTCCTTGTAGTA
-TAAACTAATACACCAGTCTTGTAAACCGGAGACGAAAACCTTTTTCCAAGGACAAATCAG
-AGAAAAAGTCTTTAACTCCACCATTAGCACCCAAAGCTAAGATTCTAATTTAAACTATTC
-TCTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAAC
-AACCGCTATGTATTTCGTACATTACTGCCAGCCACCATGAATATTGTACGGTACCATAAA
-TACTTGACCACCTGTAGTACATAAAAACCCAACCCACATCAAACCCCCCCCCCCCATGCT
-TACAAGCAAGTACAGCAATCAACCTTCAACTATCACACATCAACTGCAACTCCAAAGCCA
-CCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAA
-GTCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCC
-CCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTG
-CTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGAC
-ATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATAAG
-ACATCACGATG
->chr20
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNGATCCAgaggtggaagaggaaggaagcttggaaccctata
-gagttgctgagtgccaggaccagatcctggccctaaacaggtggtaaggaaggagagagt
-gaaggaactgccaggtgacacactcccaccatggacctctgggatcctagctttaagaga
-tcccatcacccacatgaacgtttgaattgacagggggagctgcctggagagtaggcagat
-gcagagctcaagcctgtgcagagcccaggttttgtgagtgggacagttgcagcaaaacac
-aaccataggtgcccatccaccaaggcaggctctccatcttgctcagagtggctctagccc
-ttgctgactgctgggcagggagagagcagagctaacttcctcatgggacctgggtgtgtc
-tgatctgtgcacaccactatccaaccgatcccgaggctccaccctggccactcttgtgtg
-cacacagcacagcctctactgctacacctgagtactttgccagtggcctggaagcacttt
-gtcccccctggcacaaatggtgctggaccacgaggggccagagaacaaagccttgggcgt
-ggtcccaactcccaaatgtttgaacacacaagttggaatattgggctgagatctgtggcc
-agggcctgagtaggggagaagctcccactctcagaacactgagaaaagtgaggcatgggt
-ttctgggctggtacaggagctcgatgtgcttctctctacaagactggtgagggaaaggtg
-taacctgtttgtcagccacaacatcttcctaagggagccttgtgtccgggaaaaactgac
-agaccagtgatctgggtgcagaaggcttgagacaaaactagctggttgggccagctatgg
-ggcaaatgctggaaagaaacctggtcagggagcctgagctgagtggtccccacagtcatc
-tgcttggcaagaaaccctaggtcgcaggtgctagaccagctgcacacccacagcaacact
-gccatgcccaggatcctctgcccttgatcctgaatcaacagaccacttgcagatatactt
-cacagcccacgctgactctgccaagcacagacaaccactgggccccaggggagctgcagg
-tctcctggtcacctaatcttttttttttttatactttaagttttggggtacatgtgcaca
-acgtgcaggttacatatgtatacatgtgccatgttcatgtgctgcacccattaactcgtc
-atttaacattaggtatatctcctaatgctatccctcccccctccccccaccccacaacag
-gccctggtgccatggaatactatgcagccataaaaaatgatgagttcatgccctttgcag
-ggacatggatgaagctggaaaccatcattctcagcaaactatcaaactatcacaaggaca
-aaaaaccaaacactgcatgttttcactcataggtgggaattgaataatgagaacacatgg
-acacaggaaggggaacatcacacatcgggacctaatcttaagctaagtgtggctaagagc
-ctatctgctggcctttactattaagcactgcccactggattgcagcctgaattacaccgc
-caaacaaatactgtttcagcatacattaccagtgaaacccaatgcaggaacatagtcaaa
-aataaacacctggcatagagacttggccctctgaaaacacccagaaaaaagccagctata
-ttcaacatacatcactgtcaaaatatcaaggaaaatgaagaagaataaaacaaaaagtca
-aaaccaaatgataggaacttcaaaaagataaagtaacaccagctgtcttagatgagaaag
-aatcagcacacattcttgcaattcaaaaagtcagaatgtctccttacctccaaacaatca
-tactagctctcatcagattgaaatggctgaaatgacagacatagaattcatgatctggaa
-ggtaaggaagctcaagaacattcaggagaaagttgaaacccagtccaaggaagccagtaa
-agcaatccaagagtacagagataacatagccattttaagaaagaaccaaaagaaacttct
-gcaattgacaaattcattataggaattttgtaatacattcagaagcattaacaacagaat
-agatcaagttgaggaaagaatctcagagctcaaagatcagtcctttgaatcaacacagtc
-agacaaaactaaagaaaaaaatttaaaaataaaacctctaaaaaaatatggaattatgta
-aagataccaaacttacaacttatgggcattcctgaaagaggagaaagaataagtaacttg
-gaaaacatatttgaggatagtccatgaaaatttccccaatctccctagagaggctgacat
-gcaaattcaagaaatgcaaataacccctgtgagataactacaagataactatccccaaga
-cacatagtcataagattctccaaggtcaacgtgaaagaaaaaaatcttaagggcagctag
-agaaaagcctgaggtcacttatgaagggaagctcatcagactaacagcagacttctcagc
-agaaaccttacaaaccaagcaagattaggggcctatttttagcatccttaaagaaaagaa
-atttcagtgaagaattccatatcctgcaaaactaagcttcataaaagaaggagaaatagg
-ctgggcatggtggctcacacctgtaataccagcattttgggaggctcaggcaggaggatt
-gcttgagctcaagagtttgagaccagcctgggcaacatggcaaaaccctgtctcttctaa
-aaatacaaaaattacctgggcAAGACTCCATCACAAACAAACTAACAAACCAAAActatc
-aggtactatgctcactacctgggtgacaaaatcatttttacaccaaacccagtgacaagc
-aatttacccatgtaacaaacctgcatgtgtatcccctgaacctaaaataaaagttaaaaa
-aaaaagaaCTTTCATCAACatttcttgcagtgaaggtatgttagtgatgaacattctctg
-cttttattgcctgaaaatatctttattttgtattcatatttgacatatattctcactggg
-cataaaaattctaaattacaagtttttccccttttttgtattaaaaatttcattccaata
-tcttTCATATTGCCTTATTTGTAATGATGCCTTCTATCCTTCTTATCTTTGTTCCATTTA
-TAAGAAGTGTTCCCCAACCCCAGACTGATTAAAACCATTTTTTTAATTAAAAAAGCAAAA
-GAAAGAAACATTTTTATCTGAAGCTGTCTCAGACTCAGACACCACCCAATCTTCAGATTT
-CAAATAGCTTATACTCAAACATTTGGTAATATCAGCCCCTTAATGGTCTTCCTGGAGGGC
-AGATGCATTCTAGAGATGAGAACACGATCATGATTACGAATGCTACCACCACTACGAACG
-CACAAAAGTCACTGGTGTGATCCTTTCTCAGAACACTGTGGTAACTTCTGGACATTCTCT
-GCTGTTATCATTGCTTCTTCCTTCTGGGTTTTTTTCCCCCTTATATGGGCAGATAATTTT
-CTCCATTGGAATGAAAAAGTCTTGCTTCATGCTCTTtaactgtgtgaccttgggcgtatt
-actttactttggggcaaaccattttccttcttgaggaccaaatgtgctcttttataaaac
-gagcagttagaattagattgtctctctggacacggcttatgttgacaacctggatcacAT
-TAGAGGATCAcactgagacctttatgtcggcctcagttcctccatctgtaaagtagaggt
-tgggcttagattatAGATGATAAAGACACCAACTTTCctggaaaggattctggaaaggat
-tctgAACTTAGGCTCAGCCTCAGTAAGAAGGAGTTCTGTGATTAAACAGGGATGCCCACA
-CATCAGCAACAGAAATGGGCAGGTCAACCATGTATGCTGTGCCTCAGTGAAGATTTTATG
-CTATGCTGTGCATTTGATATCCATTCTCTATATTTGATATCCAATCTAAGATTATCTAGA
-AGGTCCTTTCCAAGACACTGATGAGATACATCTGTATAAATATATAACTCAGGATGAAAG
-CAACTTTTAACATTTAGCGTGTGCCTCTGCCTCTGATCTGATTACAGCCCACAGAGAAAT
-ATAAACAATACACAATACAGGCTAATGAAGAAGGGTGATAAGAtttttttttttttttga
-gacggaatttcactcttgtcacccaggctggagtgcaatggtgcaatcttggctcactgc
-aaccttcgcctcccggttcaagcgattctcctgcctcagcctcctgagtagatgggattg
-gaggtgcccaccaccacgcccggctaatttttgtattttttagtagagacagggtttcac
-catgttgtccacgctggtctcgaactcctgacctcaggtgatccgccagcctcagcctcc
-caaagtgctaggattacaggtgtgagccactgcaaccggccAAGGGTGATAAGattttaa
-aaatttatttaaaataCAGAAATTTCAAAAAGAGAGAAGTGCAGTGATAGCAAAATTGAT
-GCAAACTGTGCAAGCATGAAATCTATTTTATAGCTGAATCTACTTTTCTTGGTCCCAAGA
-TTCTATTTCCATTGGTTTTCAAATAGTTAATTCTATTGTTTTTTCAGGGAGATTACTAAA
-ATCACTAATAATTATTTTCCTACTGACACAAAATCTAAAAAGCACCATATAGACCTTCTC
-TCTCCATCTCCCCTTATCCTTATGTCACCTTACCCTACCCCAATACTCCAATGGCAGAGT
-ATCTACCCATGGCAGAGTAGAGAATATGTACACTAACAAAACCAGATGCACAGAGGTGGG
-GTATCCATCTCTGACTTGGCTGAGCTAGTCTAAGGAAGGAAGGCTCTGTGGCCATTGTCC
-TTGGAAGTCATTCTCACAGGTTGGTGGTATTCTCAAGTAGGTGGTGCTTGAGTGGCCCAA
-GAGCACCCACATGCTGCTATGCATTTTTCTGACAACCTCTTTATGATCTCTGACTTTGGC
-AGATCATCTTGCATCTCTCAATTGGAGAGTCACTTTTCTTATCTCCACAGAAAATTCTTA
-ATCAAGCTCCTGGTTTTCCTTTATAGCTTCTACTTTTTAAACTCACTTCTCCAACTTCAC
-CGCTACATCTCTGACAGATGAGAACATTAGAGATTCCCTGTTTTTCAAAAACAAAACAAA
-ACTCAGCAAAACTATAAATATACTAAGGGTAAGTCTGTATTATCTCCTGCCAAAATACAC
-CACCCTGCATTTTTTTAAATttttatcttttgtaggtacatagtaggtgtctatatttgt
-ggggtacatgagatgttttgatacaagcatgcaatgcataataaccacatcatggaaaat
-ggggtatccatcccctcaagcatttatcctttgtgttacaaattatctaattatacttta
-ttattttaaaatgtacaattaaattatttttgactatagtcacctcgttatgctattaaa
-taccaggtcttattcattctttctaactattttttgtacccagtaaccatcctcaccttc
-ccacacacgcccaccacctttcccagcctctgataaccatccttctactctctatctccc
-ttgaattcagtagttttgatttttagatttcacaaataagtgagaacatgcaatatttgt
-ctttatgttcctggcttatttcacttagcataatggcctccagttccatccatgttattg
-caaatgacagcatctctttcttttttatggctgaataatactccactgtgtataagttcc
-acattttctttatccactcatttgttgattgacacttacgttgcttctaaatcttggcta
-ttgtgaatagtgctgcaacaagcacaggtgtgcagatatctattcaatattcttatttcc
-ttttggaggggagtgtgtacctagcagtgggattgctggattgtatggtaactctatttt
-cagtttttttaggaacctccaaactgttctccatagtggttgtactatcttacgttcaca
-ccagtagcatacaagggtttccctttctccaaatccttgccagcatttgctattgcctgt
-cttttggataaaagccattttaactggagtgagatgatattccattgtagcttgattttc
-atttctctgatgatcagtgattttgagcaccttttcatctgcctgtttgccatttgtatg
-tcttcttttgagaatatctattcagatactttgcccatttttaagttggatcattagatt
-tttttcctatagaattgtttgagctctttgtatttcctgttattaatcccttgtcagaag
-ggtcgtttgcaaatattttctcccattctgtgggttgtcttttcactttgttgattgtgt
-gctttgctgtgcagaagctttttaacttgatgtgatcccatttgtccatttttgcttcga
-ttgcctttgtttgtgggttgctactcaagaaatttttgtccaaacatcctggagagattc
-cccagtttcttatagtagtttcatagtttgagatcttagctttaagtctttaatccattt
-gacttaatgttttgtatatggtgaaagacaggggtctagtttcattattctgcatatgga
-tatccagttttcccagcaccattttttaaagagactgtttttcccccaaagtatgttctt
-ggcaactttgtcaaaaatgagtttactgtagatgtgtggacttgtttctgtgttctctat
-tcttttccattgctctatgtgtctgtttttatactagtaccatgctgttttggttactat
-agctttgtagtataatttgaagtgaggtaatgtgattcctctagttttgttctttttgct
-taggatggctttggccatcctgcatttttAAcccttttcccattttcacccagaatactc
-gctggtggcacttgcagctgcagggtttaccctgagataactttgccacaaaatatctcg
-cctttattattattttcacatcgttctaatatatcgactttgaaaacacaaatcatcatt
-ctatttatagcatcttgttgttagcagtggtatttccatttacaaaatatagaaattctt
-gatcgctgaaaatgtcaaattctagaaagcatagcattcccatgttaacattgttctcaa
-acagttttgggccaaagagtcatttaatgaatccggttttttccaaaatagatgattctg
-attattcagatgattctgatgttagttctgtttaaaaataattccaagaacagtttgtat
-attttattttcacactgaacatcagtcagcctccagagcatgttaatgtaaaattaaatg
-aacatgggcagtgagctgcagttttttttctaaacagTGCAGCTGTTTAGAAAATTTTTT
-TAAAATTTTCCTGATTTCCTTGGTATTAAACATATGTGGGAGAAATACAGCTCAGCAAAC
-TCTTCCAGGAGATAAAATGCTGATCACTCCTACTGGGCAATTTCACAAATGTCTCCTATA
-TTTTTCTCCTTTGGTAGTGGGGATGGGGGGCATAATGTTACATTGGGCctctctcctctc
-tctctttctctctccctctcCTTTTAAAATGTTTCCTCTCTCTCAATATTTCATTTCTTA
-TTTGTATTTCTGAATGAGGGAAAAGAGTTGATGGGACAGCGGAACGGGAAAAAGAAGAGC
-ACCAATAAAACCTGTTTTCCTGTTTTCACTATTTTCATTCCAAATTCCTTCTGTCTCATA
-ATTGATGGAATCTTATGAACTTATTAGTTAAAAAGTGTCTTTCTTGTTTCACAGGAATTC
-ATATCGGGGTGATCACTCAGAAGAAAAGGTGAATACCGGATGTTGTAAGCTATTGAACTG
-CCACAAGTGATATCTTTACACACCATTCTGCTGTCATTGGGTATGTACAAAGTGCTGCAT
-ACAGACAGAGGAGAAGGACAATTGAGCCCATCTAAAGTTAACAAAAACTTCCTCTTGGGG
-CTGTTTCTTTCCATCAGACCTTACAGTTCTACGGGATAATAGCTTATCTCATAAGGCCTC
-AGCTTTCTTTAATAATTTCTAGAAGCAGACGTTATTGTGTCATGCACACTCAGTGTTGCA
-AATTAATGGTCTGGTGATCTGGGTGGCATGGCATTTTCCCCTTCTCTGGTTCATCACCCA
-TGATAGACCAGTAAAGGTGACCACTTAAATTCCTTGCTGTGCAGTGTTCTGTATTCCTCA
-GGACACAGAGCTTCCTCTCTCCCAGGAGCCATGAATATCCTGATGCTGACCTTCATTATC
-TGTGGGTTGCTAACTCGGGTGACCAAAGGTAATGGAACCCTATAAAGCAGAGATGATGAC
-TAGGATGAGTTGTTGCCCTTGGGCTCCCCTGGTATCATGATGGGAAGAGAGGGAATCTGC
-AGGAAAAATCTGGGCCAACAAAGAGCAGCAGAATGCTCTTATTTTGGCAGCTCCATGCCC
-CTAGTCTCTGAGAATCTTTCTGTTAGGGGCATCTAGCAAGCTGGGATGTCCTCTGAGGCA
-TTTCTCCAAAGACAAGAATTTCCTTAATGCTCTGAGCCACCCTATCTGTCTCTCTACATA
-ACTATCCAATGTTAGTTCAGCCTCACTTCACTTCCATTTCGATTATTCTGTTGTATCTAT
-TTCATTGTTGTGTCCTATTAGTTCTCCTACCATCTTGAATTCTTCTTTGCCCGGAGGGTA
-CCTTCAGAGGGAGGCCCTCACTTTCATGTTCTTAGATATGGTGAACAAGTCCATTGACAG
-TTTGTAGATTCTGTAGCACTATCATATGGAAGAGACAATATATATGTTTGGGGTAGAAGT
-GGAAATAAGTGGAGTGAAGACAGGATAGACAGACTAGTGACCAATGGGGAGCTTCTAATT
-TTAGATGAATAGGAACAGTCTGTTTCCACTATTTAATAATGCTACTTTTGAAAATTGTTA
-ACTTTTTATTAAAAAATAATACTTGCAATTGACTTATGTATCAAGCAATCGATGGATTTA
-TAGGGTTTAAGGAAAAGAAAAATGTTTGTCTGTCCAAGAATACCAGTTCTTCAGTCTTCC
-CCTTCAGAATCAATCAATGTTACCAATTTCTTATATATCCTAGCAAATACAAATATATTT
-ATATTTGCATGTGTATACCTTTTAGATTTTTAAAAAATGCAATTGCAAATGCACCATGTG
-AATTGTTCTGCAATGTACTAGCAATATATTAGAGACATCTTATCCATACATAAACCTAGT
-TCATTATTTTTAATCGATAAGTAAAACTTTGAGGAGGAGCAGATGAATTGCCTCACATTA
-ATTACTCCGCTACTGATGAAAAATAGGTCTTTAATTATCAAAAACAATTCAGCAAGAAAA
-ATTTGTAAACAAATGTATGTCTTTTCATTTATGACTGGACACGTGGacacacacacacac
-acacacacacacacagtcaaaccacctaccagaaaagctgaactattcttctctcctatc
-accagttgcaagagtgtcagcttcccacaccctcatcagtcctttttgttttttctacta
-cattcagttttctactacattcagttttacagtctaatatgtgaaaatgatgtcctgatg
-tttgaattcatgacactttagttataaatgagtttgaacatccagtccattagatttcta
-aactttcttAATTATCTTTATATACTAAGAAATTTGGCTTTTGTTAAATTTGGAGGTGTT
-ATATGTTGCCTAGAAAGATGCTATTCATGTCTATTAAATGGTTATAACTGTGCCTATGAT
-CTGTTATGTCTTGATTCACATGTTGATGTAATGTGAGTTACAGAATTAATATCTACATTC
-ATTTCTGATTATAAACTGCTGTATTTGTTGAAAATTTGGAAATTTTGAAATTGTAAAGAA
-GTAAAAAAATTGTAAAGAAGTTAAAAGAGACAAAATATTTTTGATCTATTGTTCTTCCTC
-AGTTTTCTTATTTGAATAAAAATGTATAGCATACTTATAAATTTTCTATTATACTATTAG
-TATTTTCCCATTTACTATTTTCAAAAACTGTATTTCCAATGACTGTATAAATTTTATAGA
-ATGGATACTGTTTAAATTACTTAGCCAAATTGTTTTTGCATAAATAAGTGCATTTACATT
-TTATAGACAAGGATGGCTAGTATAACCTTTCTTATACATAAATCATTCAGCATAAAATTC
-CTGGAGATGTACTTTTTTCTGTCTGCTTCATGTGTTATCAATTTTTGAATACTTGCCAAG
-TCCtaaaaatgaaatattatatataaatatttaatttttatttatGTCTGTGAGTAATGG
-GGAAGTCGAACTTCAAATACATGCTTAATGTATATTTAACTTTTCTACAAATTGTCTATG
-TCTCTCTTTCTCTTTTATTTTGGAGAGGTAGTTTTCATTTCTTTTGATTTAGAGATTTTC
-ATTTTTGTGTTCTCTTATAGGTTTTGTTTTGAAATTTAGCTATTTAGTCTCTCTGGGCTT
-TATATTATGTGTTTTCAAGTGAGATAGCACCTGATGGCTTGTGAAGCAACTTTTTACCAA
-GCCAAGCTATCAGTGGACTGGTATCCATAGATATATtttaagttgatgctagctgattat
-atatctggtatgttttagaaagaactccacacatgggataatgttttggctagatggctc
-cCCTACTTAGAAACATACAATTGCTAGTCATATTTCTAATTTTAGGATTTCGAGATACTG
-GTGATGAAGATCACATGTCCTAACAACATAATAGTTCCAGACTGAAGTTCTTTGAAAAAA
-ATGACTGTTGTCACTTTAGAAAAAAAAAATTATGAATTATTCCcaattgccatcattcta
-ctgctaaaaccaaattcttggaattatctatgatttttctatatcctatgacactcatat
-ctatcaggaagtctattacatctgcctgcaaattatatccagaatgcaattattctcgcc
-acctccattgctgccactctgattctagtcaccatcatctctcacctgtgttattgccat
-agcttcctcatgagatctgtccttctgctcttccctgccaccatcttgtgaagacacata
-gtgcatgatccgcttacactggaagtcagatcatgtacttttgctcaaaactctgctatg
-gccccctctatactcagagcggtaacaagagtccatacagtggctcacctggccctgcag
-gatctggcccttatgacctctctcacctcatctcctactattatagtccttgttcactcc
-actacagccacacaagccccagtgctcttccccaaacatatcagacttactcaacccata
-gagctttgtttgtttcctctgcctagaatgtacttgcctcagatactggtgtgactaatt
-cctttacctccttcaagctgtttaatcatcaccttgttacacaggcttgtgcaactcctg
-tttatgaatcttctattacccttaaatctattctcccttctttctgcaaaccatttgtca
-ccttttcatctacaaaataatgtacttttttattAAGGTAAAATATACATTTAAAAATTA
-CCATCCTTACCATGTTTTTACCATatttttatgtatacctgatggctgtttgtatgtctt
-ctgttgagaaatgtctattcaaatcttttgcctgttttaaaatcagattatttgtttttg
-tttgctatggagttttttgagctccttatattaatatactttttgttgttaattcctcgt
-cagatggatagcttgcaaatattttctcctactctgtgggctacatcttcactttgttga
-ttatttcctttgctgtgcacaagctttttagtttgatgtaatcctaattgcctatttttg
-ctttggttgcccgtgcttttgaggtcttacccaagaaatctttgccaagaccaacgtcct
-gaagtgtttccctaatgtttttttcaggtagttccatagtttcaggtcttagatttaagt
-ctgtaaAACCATACAGTCTAGCAGGGAGTGCatttactttttattatctgtctccctctg
-ctagaaagtcagctccatgtgatttttgtctgtttagttcacagatgtacctcaagggcc
-caggatagtgcctgtgccatagtaggggcccaaaactttgatgactgtgtgaCTATAGCC
-TAATTTAAGAATGGAGGGGATAATTTAAAAGCAGTAGGAAGGAATGTAAGTGAGAAACAA
-TTTTGAAGAATAATTGACAGAACAAGGCGATTCAAAGACAAAGGAGAAGAAGAGAGCCAA
-GATGACATATTTCAAGTATGGATAATGCTGGAGGAAAAAAATTAAGATATAAATCTTTGT
-AGATGTGAGGAACGAAGAAGCAAGGTTAGAGTCTGTCTTGCACAAAAGAAGTGGAAGGTC
-TAGACTTGAAACTTATAGAAAATTCCACGAAGTACAAAGTAAAATCGAGCCAGTAAAATA
-ACAAAGATAGAATAAATGACTCTAGAGGAGTGAAGGTAGAATAAATAATTGGTGAAGCTG
-GACTAGAGCCAACATTTCCCAGAGGATAAAATATAAACCAAATTATTGTGAGCCTAatat
-atacatacatacatacatctatatatgttttatatatatTATCACATTAAGTTCAAATAA
-GGTTGTTTAGAAAATTActtgctcttctgcacatataccaggcttcctcctccatagagc
-cttatctctagctgcttcctctgcctagaatacacttATCTAGGTACTCCTTGGGCAATT
-GTCTTGAGAAAGATGATCATGCCGTTTACTgcttgataaatgaacatacaatgcagcaca
-ctagtttccctttagatttatatcctcacccctcaaatgagtagtcacactgcttggaaa
-tcctactgcatttctcttgtaaatgaaccttccttcttttttttttttttttgagacaga
-gtctttctctgtcaccaggctggactgcagtggcccaatctcggctcattgcaaccgcca
-actccctggttcaagtgattctcctgcctcagcctcccgagtagctgggatcacaggcat
-gtgccaccacatccagctaatttttatatttttagtagagacaggttttcaccaggttgg
-ccaggatggtctcgatctcctgaccctgtgatccaccctcctcggcttcccaaagtgctg
-ggattacaggtttgtaccaccacacccagccatcttccctcttttttagacaactatttt
-gtcctgacctttatttgtcttttattttcctgctcctctcctctacatggctctccccct
-cagtttatcccatgccccatttatttaaacaattcaaataggaagttttcactcatttcc
-tctgtcccctttgccataaatggagaaacgtgtcttctccatctaaagatcagtctgctc
-tgtgtgaatttgtgactatgcccttctgtcatctcatcaccctattctatattaatctct
-ccttttctgcttttttttttttttttttgagatggagtcttgctcttgttgcccaggctg
-gaatgcagtggcacaatcttggcttactgcaaccttcgcctcccaggttcaagtgattct
-cctgcctcagcatcctgagtagctgggactacaggtgctcgccaccatgcccagctaatt
-tttgtattttttagtagagacagggtttcaccatggccaggctggtctcgaactcctgaa
-ctcaggtgatctgcccgcctcgatctcccaaagtgctgggattacatgtgtgagccactg
-cgcccagactgcttgtctcttttctcattgcttgcaagcaccatttggtatttctcgttc
-ttcaaaacaaacctgaaagctttcccttaaccttacattgctctctaacaagttatttat
-ttctctgcttttctttggatctaaacttcttaagagtttcatctacaggtcctgcattca
-cttctctctcattcacattttgaccaactgcaatttggtttcttttttcataccactcgg
-aagctgctctcctcagtatgaagttaccttcatactactaaaagcatggacattttcctg
-ccttcatcatttttttttaacctctcagcagtatttgactacaaaatgaccactctgtcc
-tttaagaaacagtctcctctcctgCTTAATGTAGTCACATCTGATACAACTTTCCCCATA
-ACCTTTTATGCATTTTCTGTTTTCATGCATATCAGCCCAACTTGCAATTGTCAGTATCTC
-CAGTCTTTCAACAACTGCTTGTGAAATACCCCTGTACAGGGCAATCCAGAAATGCCAGAA
-AATTATCAGCTGTCTCTGGATCATCTGTCAACTATGGGGGAAGCTGGATAAATAGTCCAG
-GTCCTTTGAGCCTCATGTAGAATAACTTTGAGGCTTGGTAATATTTTTTTTTTCCTGTGG
-TAATTCCCTTATTTGCAGTTCAAGGCTATTATGGGAAGAAAACATAAATGGATGTTAGTT
-CTTCAAGGTTTTTACTGTAACTGTGCACCCTTTCATTCTTCAAGGTTTTTCTGTAACACT
-GCACCTTCAGGACCTGATGCCCAATTAAACATTTTTTTAAGTTTTTTGGTTTTTTTTTAA
-TAAAAACTAAATGCTATTTTTTCttctacttttagttgatgtgtaataattgttcatatt
-tagaagatgcagagtgatattttgatacatgtatacaatgtgtaatgatcaaatcagggt
-aattagcatatctatcacctcaaacatttgtcatttttttatattgggaacattcagaat
-cgtctcttctagctatttgaaaatatacagtaaatgattgttaactaccgtcaccctaca
-gtgctatagaacagtggaccccttttggcaccagggaccagttttgtggaagacagtttt
-ttcgacgaggtgaaggtggtggtggggatggtttcaggatgaaactgttccacctcaggt
-catcaggcattagagtctcacaaggaacacacatcctagatccctcacatgcacagttca
-caatagggttcatgctcctatgagactctaatgccttggctgatctgacaagagatggag
-ctcaggtggtgatgcttgcacacctgctgttcaccttttgctgtgcagcctggttcctaa
-caggccatggaccagtacccattggctgcccaggggttggggacccctgctataggatgc
-tggaactttttcctcctatctaggtgtaattttctatctgttaaccaacctctctctatc
-ctcctttcccttcccagcctctagtaatcattattctacagtctacttctatgaactcaa
-cttttttagctcctgcttatgaatgaaaacatgtggtatttatctttttgtgtctatttc
-acataacggaatgtaacatgtcccccaggctcatccatgAGTCTGAGGCTTATTTGTAGC
-CTGGCTGCTGGGCTTCCCTGTGGGATTGTCCTCTGAGCAAACAGAACACAGCCATCCTGC
-TGGCCAGCAGTTGATAGATGATCTCATGATAATAACAGGTTATAACTCACCTTTTCTTGG
-ATTTCTTGCTTTCCTGATTTCTACATTTCTCCACTGATTTTTTTTAAGGAGGAATTGTCT
-CTCAACTAAACTATTATATTCAAATCTTTGCTGGAGCTCTGCTCTGCTGGGGGTCTGCTT
-TAAGACTCTAGAGTCTTattctcctgttttgatctgacttatcttattggtccttttaag
-tcgtttcctcttatctgatctcttatctcttaatattgaaactcactagaatttaattct
-agtcctctttttttctcatattattccaacccaccatggtttaccaatttctgtacttta
-aatgctatccataagcaatcacatttattgatttgcatatgtcgaaccaaccttgcattc
-caaggataaaggctacttgatcgtagtggataagctttttgatgtgctgctggattcagt
-ttgctactattttgttcaggatttttgcactgatgttcatcaaggatactggcctgaaat
-tttttttttcttgtgtctctgctaggttttggtctcaggatgatgctggcctcatagaat
-aagttaaagcggagtcctgccttctcaattttgggtgaatagtttcagtaggaatgatac
-cagctcttctttgtatatctggtagaattcagctgtgaatccatctggtcctgggctttt
-CATTTTCATCCTTTCTTTCTAGGTTTCGTATCAGTCTCAGTATGctctctctctctccgt
-ccctctctttttctacatttctccttttctcCATACAACTTCTTTGATGGCACATAGCAC
-AATTTTAATATACACTTTTTGTTCTCCTGTTTGTCTCTTACAATGGCTTTTTGTATTTGA
-CATCATATTAGTCTAGATGTCAGTCAGTGTAAATTTTTGAATGAATGAAAAGTTGTTATG
-TTGATGCCAGAGTTAAAAATTTGACCTATATTTTATTCTCTACAGGTAGCTTTGAACCCC
-AAAAATGTTGGAAGAATAATGTAGGACATTGCAGAAGACGATGTTTAGATACTGAAAGGT
-ACATACTTCTTTGTAGGAACAAGCTATCATGCTGCATTTCTATAATATCACATGAATATA
-CTCGACGACCAGCATTTCCTGTGATTCACCTAGAGGATATAACATTGGATTATAGTGATG
-TGGACTCTTTTACTGGTTCCCCAGTATCTATGTTGAATGATCTGATAACATTTGACACAA
-CTAAATTTGGAGAAACCATGACACCTGAGACCAATACTCCTGAGACTACTATGCCACCAT
-CTGAGGCCACTACTCCCGAGACTACTATGCCACCATCTGAGACTGCTACTTCCGAGACTA
-TGCCACCACCTTCTCAGACAGCTCTTACTCATAATTAATTAACATTTACTTCTGGTATGG
-AACAACTAGAAATACTGCTGGAAATAATATCCAAAGAGCTGATTCTACCAATCCAATTTC
-ACCAGGAAAATTCCATCAGGGATTGGATGACCATGGGGATGGACATAATTGCTACTACCA
-ACACAACAGCCAAGAGAGTTGCCTTACAATTAGAAATGTGTAGACAGAAATGTATAGAAG
-ATACAAGGATTCTCTTAATTGGACTTAAATTCTTTATCTGTCTTCCTCCGATGTACTCAA
-ATATATGAGCTAATTTTTGTCTTAAGTGAACATTTGTATATCTATGTATTTTTCCATGCC
-AAAAACAAAAACGAAGACCATTGTTTGGAGCTGCCTCTTATGACTAAGACAAGAATTTTT
-ACTTTAACAGTGCCTGGCCCACTACTATCGTATATAGGAGAACATATAAAAGCATATAGA
-AAGTTCCAGATGAATGTTCCCTTCTCTACCCTCCACCTTTTATTGTAAGTTCTGACCCTA
-AATACTTTTCTGTGTCATGACGTCAAATTTTGTTTAAGGTTCTAGCTGGTAACTAACAGA
-GTCAGAAGCTAATTCTTTCATTCAACACAAGCACTGATCTAACTGGATAGAGATAAAAGT
-GGGACTTGCCTTGAGAGTACATCATATTAAATTAAAAGCTGCATCTCAAATTCTACTTAT
-CTTTCCAATCTTCTTTCCACTTAGAATTCCAACTTCCAAGTATGGCAGCCTCATAACATG
-CCTCTTCAGGTCTCTGTGTTGTCCATGAATGTTAGTTGTGTGCAGTGTTTCTATGCTTTG
-TATGGCTGTACGCATGTGACTGCTGTTTGTATGGCAACAGGTGGGTCAGTAAGTGTCTTC
-TATGATACTACAGAGAAGCGGTTATTAACTATAAAGTTGATTAGGttttttttttttttt
-gagacagagtctagctctgtcgcccaagctggagtgcagtggcatgatctcggctcactg
-caagctctgcctcctgggttaacgccattctcctgcctcaggctcccgagtaactgggac
-tacaggcacccactaccacacctggctaattttttgtatttttagtagagaggggtttca
-ccatgttagccaggatggtctcgatctcctaacctcatgatccatccgccttggcctccc
-aaaatgctgggattacaggtgtgagctactgtgcccggctGATTAttattttttttaagt
-tccaggatagaagtgtagaacatgtaggtttgttacataggtatacatgtgccatgatgg
-tttgctgcacctatcaacgcatcatctaggttttaagtcccgcatgcattagctatttgt
-cttaatgctctgcctccccttccccacacaccctgactggcccccatgtgtcacgttccc
-ctccctgtgtccatgtgttcttattgttcaattcccacttatgagtgagaacacgtggtg
-tttggttttctgttcctgtgttagtttactgaagatgatggcttcgagcttcatccatgt
-ccctgcaaagagcatgatctcattcctttttatggctgcatagtattccatggtgtatat
-gtaccacattttctttatgcagtctatcattgatgggcatttgggttggttccatgtctt
-tgctattgtaaatagtgctgcagtaaacatacgtgtgcatgtgtctttataatagaatga
-tttatattcctttggatatatacccagtaatgggattgctgggtcaaatggtatttctgg
-ttctacatccttgaggaatcgccacactgtcttccacaatggttgaactaatttacattc
-ccaccaacagtgtaaaagtattcttatttctccacagccttgccagcatctattgtttct
-tgactttttaataattgccattctgactggcatgagatagtatctcattgtggttttgat
-ttgcatttctctaatgatcagtgatgttgagcttcctttcatacgtttgttggctgcata
-aatgtcttcttttgagaagtgtctgttcatatcctttgcccactttttgatgtttttttt
-ttcttgtaaatttaagttcttgtagattctggatattagacctttgttagctgggtagat
-tgcaaagcgttcctcccattctgtaggctgcatgttcaccctgatgatagttttttttgc
-tgtgcagaagctctttcatttaattagatcccatttgacaattttggcttttgttgcaat
-tgcttttggtattttcttcatgaagtctttgcccatgcctatgtcctaaatggtattgcc
-taggttttcttctagggtttttatggttttgggtattacatttaagtctttaatccatct
-tgagttaatttttgtataaggtgtaaagaaggggtcccgattcagttttctccatatggc
-tagccagttttctcagcaccatttattaaatatggatcaaattcacacataacactatta
-accttaaatgtaaatgggctaaatgccccaattaaaagacacagactggcaaattggata
-gagtcaagacccattggtgtgctgtattcaggagacccatcacacatgcaaagacacaca
-taggctcaaaataaagggatggaggaaaatttaccaagcagatagaaagaacaaaatagc
-aggggttgcaatcccagtctctgacaaaacagactttaaaccaacaaagatcaaaaaaga
-caagagcattacataacggtaaagtgatcaattcaacaactagagctaactatcctaata
-tatatgcacccaatacaggagcactcagattcataaaacaagttcttagaggcctacaaa
-gagacttagactcccacacaataatagttggagactttaacactcagtgtcaatattaga
-cagatcaatgagacagaaaattaacaaggatattgaggacttgaactcagctctggatca
-agtggacctaatagacatctacagaactctccaccccaaatcaacagaatgtacattcgt
-ctcagtgccacatgacacttattctaaaatcgaccacataattggaagtaaaacactcct
-caggaaatgcaaaagaactgaTTAGTTATTAATAAATTGGGCTGAGGCTTGGGCGCTACT
-GAAAGCCACAATATCAGATGCCAGAATGTCTCAAAATCAAAAAGGTTTTTTCCTCTAATT
-ATTTTTTATGTGATCCAAGCCAAGCTGCCAGTGACTATGGCTGTAGTTTGGATGTTGACC
-ATCAGACCACTGACCTTTCAGTAGACCTCATATTCTAATAGGTCTTAGACCACCAGTtag
-ggtgtccatcattcagatttgattgggactgaggggcttcccagaacatgggaattagag
-agctaaaatcaagaaaatccagagtaaattgggacaagttgatcaccctCACTTCAGTGT
-ACTTCTGTCTAGCAAGCTATTTTTCCATTTTTCATGGCTATACCTCATCACATAGGTCAT
-ACATTGGCTTTTCACAGAATCAGTCTAGGGTGCTCTTTTTCCATATTTTTGCCTCAACTG
-TCATTTCCTGAAACACACTCCTTGAGCATGCAGAACACCTTCCATTCTACTTTGTATTAT
-TTTCTTCCCATCATTTGAACTCTGAAATCATTTTGAGTATTTACTCTCTCTCTGATTTTT
-TTTACTAACTTATGGCCTAACACCCCTGCTATAATGTACATATAGTCCTCATCTCTTGgt
-cttgttgacctatgtgatccaaactgcaagaacagtgcgtcacacatgagaaatgctcaa
-taaaaatttgAGAACAAATTATTCAGGCAGTTATCTTAATATATATGAGAAGGTTATATA
-ATATAAAAcagtagtcttcaaactgcaatactggttacaaaaagatttttcaagctatac
-atattgatagtttaaaggaataaaatttcagaccctcaagttccaaatttcttatgatgt
-tttggagcattcttaacaggctcttcttttataactccaatttctcaattttccttctcc
-cactctgaaaagaaaacttacctctcacccaccctttatctgacaatcatggattgccct
-gagtgaacaaacctccagtggacaattgaaatactagtgctggTattcagaaagtgaata
-atcatagactttgaataaaaatcctttggaaataaaagtgtttttaatttttttgtttac
-aaaagcaatgatggggtgtcaatcaagttgatggttaatattaaatagatctttgaagat
-aaactttaataatagcctactatgaaattttttagcatatcacttggaagaggttaaaag
-aactgtgtaaacattagagtcttatgttcaaagagatttcacaataagctacaatgtatg
-tctatgttttgtcacagagaaatgtgatagaatgattaataaaagacttgcaaacacaaa
-aatatagtacattaggatcaaattttgcagagaagtttgaataaaaactaaagttttaaa
-aagaaaaaagatacaatgttcccaattgctaaaaaagagcttctttgcatatttattaaa
-tgaattattgtgattagcaaattgtcatgcattcatattccattggatgtatttagtatt
-tagttgttacatgtcaatatttgtaatatgctattagttatctttttatgattaaaattt
-aagatgaaatagtttatttcccaattttaaattgtattgggaaaatacacactttATTTT
-TATACCTAGCATAGACTTTTTGTTCCTTCTAATTGGAAAAAGGCTTTGCAATTTGCAATT
-GGTATATGTGTGACTTCTAGAAATGTGGTGTTCTttttttgttttttgtttttttgtttt
-ttttgagatggagtctcactctgtcgcccaggctggagtgcagtggcgccatctcggctc
-actgcaagctctgcctcccgggttcacgccattctcctgcctcagcctccctagcagctg
-ggactacaggagcacgccgccatgcccggctaatttttgtatttttagtagagacggggt
-ttcaccctgttagccaggatggtctagatctcctgacctcgtgatccgcccaccttggcc
-tcccaaagtgctgggattacaggtgtgagccaccgcgcccggccCAGGAATGCTCTTAAC
-CACTTCATCAAGCATCAAGGTTGGCACTGTCTAGATGTTGGTTTTGATTGCCAACCTACA
-AAAGAAAAGGGAAATTATAAAAGAGAAAATTAACAAGTGAGTACAGTTTCAAAATCTGTC
-CTGCAAATGTGTTTTAAACCAAAGAAATCATCTTTGGCATGGGCTATTTGCTTTATAGTC
-ATTCAGAATTGCTTGGTCTCTGTCTCCTGAAGACTGTGGCTAGGATTATTCCTGATGAAT
-GAGAAAGTTACCATAAATCAAAAATAAAATGAATAGAAAACTTAACAGTTGACTCTCAGA
-AGAAGGTATCTTCCCTCACTTTGCACTGGTtatatatatatatatacacacacatacata
-taATTGTATAATATGTATTAttttataaattgatttagaaggtacaagtgttgttttctt
-atatgcatatattacatagtggtgaagtctgggcttttagtttagccatcacccaaatag
-tgtacattgtacccattaagtaatttctcatttcttagcccccttctacccttccaagtt
-tccagtgtctattacccactccttatgtccatgtgtatacttagtttccacttgtgagaa
-catgtagtatttgactttctgtttctgagttatttcacttcagataatgAAAACATTCAC
-TTCAGATAATGAAAACACACTTTTCAAAATTCAAAGAGGTTTGAAAAGCTCATGGCCTAA
-TACCCCCACTATAAATTTTATTTTTAAACTGTTCATACTCCTAGAATGAACAGAGGCTTC
-AAACACTATCTGGTATAAACTGATGATGATTCTTCTACTACTGTGATCATTCTGTTTTTC
-TATGATTCCTGGATTTTCCTTTTCCATGAATGTGGGCTTTGCAGCATAACTTCTAGTTTG
-TTTATATCATTGCCCTTTAGGATCTCCTGTAGGCTCAGTAATCTATCACTTCCCTATATG
-GGACTGACCTCCAAATTACTGACTTTATATGTTCTCTCTCTCTCTCTCTCtgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTTAGTATTTGCATTTTG
-CCACATTCTTATATAGTTTCCAGCTCAAGTCTGAAATTCTCTACCtctttatctatgctg
-tccatattaggtatatgatttgataagttagacatgtgacatatatttcccccattctct
-gggttgttttttcattatatcaatggtgtcttttgaagtagagcagtttttaattttgat
-gaagttctcttttttaaaaacacttttctttttggtgtcatatctaagaaatcattccct
-aatttaaggtcataaaggcttattcttgtgttttcttctaagggttttagctttcacatt
-tagctgtacgatcctttttaatttaatttttttgtatgatgtaaggtaggggtccaaatt
-cattcttttgcatgtggctctccagtttctccaacactatttgataaaaagactatttac
-ccactgaattgtctggacacccttatagaaaatcaattaataataaatgtGataatttgg
-gcagatctttggagagaaagcaccaagagtggatggagaggcaacactgacaccaaagct
-gaagagagaggaagctggaatctctgcatgaggtgcctgaacattagggctagttcctga
-ccctgagtggctcctggggaaggggtaagtaaggggactaaggaacatcccgcttttgcc
-atggacctctgggatcatagctacagggtaccccatgtccctcatggatttgtaggctag
-cagggagcaggcagagacagggcttcagccagtgtgaagcccaggagcttttgtgcatgg
-ggcagctctggcagcgcatgaccgcaggtgcccatccccaagggctccccatcttcttct
-gagaggctgtagccccagctgactgctggacctggagagagtggcgccagctttgccatg
-ggactggggtgcatctgttctgcaggctctcctgcctgccagcccctcccatggcccctg
-cctagccaccctgcaggagcatgagcacagcacagcctccaccactaagccggagtgctt
-tgctccacctgagtacattcccagtaacctgggagcacttcagatccctcagtgcagctg
-gagcttgaccccaagccacagatcatccccgtgccccagggctgcagcacacagcttggg
-agcatgcagctgagatctgtggctgacaggcaagtagaggagaggcccccaatatcagaa
-cataaagggggcaagatgtgtgggttcatgggccagcttgggagcaaggtgtgcctccct
-ctgcagggttggtctggaaagggtgtggcccatctccctgccatggcctctgcccaagga
-agccccacagcctggaacacctaacgaaacacagaaatgatgccagtgatcagggtgggg
-tccctaaaggcccaagagcagatctggtgaggagttttctctcccactccactcaccata
-gaacatgcctgcaaatggaaggacatgcaaaagagctgagtaacagcctatgtaccagtc
-actacttaagcatcaatgactagatctcagccccaactacagcaccaaaaatgattctgc
-taatatacacccctgtgaaaccaagtgcaagactttgcccatacataaagatcctgtaca
-gagccacggacctctgaaaacatccagaaatgaactcaactgactatattcaacttacac
-cacatttaaaagaaaaccagcccccctcccaccagaagagaaagaatcaatgcaagaacc
-ccagcagttcaaaaagccagggtgtccccttacctcaaaatcagcccactatctccccag
-cagtggtccttaaccagactgaaatgacagacatagaattcagaatccaaatggcaagaa
-gctcattgagatttaggagaaagttaaaatccaatccaaggaatccagtaaaatgattca
-agagctgaaagatgaaatagccattttaagaaggaaccaaactaaacttctagaactgaa
-aaatttgctacaataatttcataatatgacagtataacagtattaacagaatagaccaag
-ctgaggaaagaatctcagagctcaaaggctggtccttcaaatgaacaaagtcagaaagaa
-aaaatctttaaaactgaacaaaaccaccaagaaatatgagattatgtacagaaacaaaac
-ttctgacacactagcattcccgagaggagggaaagagagtgaacagcttggaaaatatat
-ttgaggatatactccatgaaaatttccctaatctcactagagaggttgacatgcaaattc
-aagaaatacagagaaccccagctagataaaatacaacatgaccatcccaagaaacatagt
-catcagatttgccaaggtcagcatgaaggaaaaaaaatcttaaagccagctagaaagaag
-ggtcatgtcatatgtaaagagaaccccatcaggctaacaccagacctctcagcagaaacc
-tgacaaaccagaagagattaggggcctttttcagaatccttaaagaaaagaaattctaac
-caagaatttcaaatcccatcaaactaagcttaataaacaaagaggaaataaaatatttct
-cagacaagcaaatgctgaggaaattcatcacaaccagatatgcctccttacaagagattc
-ttaagggagctctaaacctacaatcaaaagaacaacacctgctacaaaaaaaaaaaaaaa
-aacatacttatgcacataaagacactataaagcaactacactatcaagtctacataataa
-ccagctaacaacacaatgacaggataaaaatctcgcatatcaatactaaccatgaatgta
-aatggactaaacaacccacttaaaggacacagtgtagcaagattgataaaaagacaagac
-ccaactatctgctgtctttaagagacctacctcacatgtaactacacccacaggctcaga
-gtaaagggataaagaaagatctgtcacacaaatggaaaacaaaaaagagcatgagttgtt
-attcttatatcagataaaacagactttaaatcaacaactatgaagagggacaaagaaggg
-cattacataataataaaggatacaattcagtgagaagacttaactgttgggcctggagag
-agtgggaccacctttgccatgggactggggtgcatctgttctgcaggccctcctacctgt
-agcccctccgaaggcccctgcctagccaccctgcagaagcatgtgcacagtgcagcctcc
-actgccaagcctgagtgctttgctccacctgaatatgtttatattctaaacatatatgtt
-cccaacattgaggcacccagattcataaaacaagttcttcttaacctataaaaagatgta
-gatagccatgcaataatagtgggagacttcaacaccctactgagagtgttagacaaatca
-ctgaggcagaaaattaaccaaaaaatcctggacttcaactcaacgtttgaccaactagac
-ctaacagacacctacaaaatattccacccaacaacaacagaatataacttccttcttctc
-tttggcacgtggaacatattccaagattgaccacatgctcagtcataaagcaagtctcaa
-taaatttaaaaaagtcatgctgagcccattctcaggccacagtttaataaaaatagaaat
-gaatatcaagaagatctcttaaaattacacaaatacatagaaatgctcctgatacctggg
-taaacatcaaattacagcagaaaattaaaaaattatctgaattttttattaaaataggga
-cacaatttaccgaaatatctgtgatacagccaaagcagtgttaagggaaatttatagtgc
-taaacgtcatcatcaagaagttagaaagatctcagattaaccatcaaagtttgcacctag
-aactagaaagaaaagaacaaaccaaccccaaagctagcagaagaaaaaaaaattactaaa
-attagaaaagaactgaaaaaaattgagatgcaaaattccatagaaaggaccaataaagcc
-aaaaggtggttttttgaaagaataaaaaaggttgatagactgctagctacataaccatga
-agaaaaaagaagaccaaaataaatacaataaaaaatgaagaagatgacattacaatgaat
-cccacagaaatacaaaagatactcagagatcattttgaacaactctatgcacacaaattg
-gaaaatctagaggaaatggataaattcctggaaatataaaacctcccaatattaaagcca
-aaggaacatgaaaacctgaacaatcaataaacaagttcctaaactgaatcaataataaaa
-acctaccagcccaaaaaaaccctggaagagatggattcacagcctaattctaccagacat
-aaaaagaactggtatcaattctactgaaactattccaaaaaaatctaggaggagaggctc
-ttccctaactcagtctatgaagccagcatcagccagataccaaaatctgtcagagacaca
-aataaagaaaacctcagaccaatatccctgattaacatagatgcaaaaattttcaacaaa
-atactaggaaaccaatcccagcaacagatcaaaaaattaatacatcagaatcaagtaggc
-tttattcctgggatgcaaggctggctcaatatatgcaaatcaataaatgtgattcaccac
-ataatcagaattaaaagcaaaaaaatatgatcatctcaatagatgcagaaaaggatttga
-aaacaatccaacgcaccttaatgataaaaacccacaacagactaggcactgaaggaacat
-accgtaaaataatgagccatctatgacaaacccatagccacgatcattctgaactggtaa
-aagccggaaccattccctttcagaactgcaacaagacaaggatgcccactctcaccatgc
-ctattcaacatagtactggaagtgctactagagcaatcaggcaagaaaaagaaataaaag
-gcatccaaataggaaaagaagaagtcaaactatccctcattgctgatgatatgattctac
-acctggaaaaccccaaatactctggcaagaggcttataatactgatgaacaacttctgta
-aagtctcaggatacaatatcaatgtcaatgtacatttctatacacaataaccttcaacct
-gagagtccaatcaagaacacaatcccatttataatagccataaaaaatgaaaatccctag
-gaatacagctaaccaaggaagtgaaaggtctccacaaggagaactacaaaatacttctgc
-aagaaatcagagatgacacaaataaatataaacaattccatactcatatatcaaaaagat
-caatgtcatttaaatggctatacattccaaagcaatctacagattcaatgctatttctat
-caaactacaaaaactgcttttcacagaattataaaaaaactattctacaattcatatgga
-atccaaaaagtacccaaatcaccaaagcaatcctaagcaaaaggaacaaagccagaggca
-tcacattatctgacttcaaactatattataaacccacagtaaccaaaacagctgatactg
-gtacaaaaataaacatatcactaatggaacagaatagacaacccagaaatgaagccacac
-acctacagacatctgatctttgataaagacaacaaaaataagcacagggaaaagaccccc
-tattcaataaacggtgcttgggtagctggctaaccatatgcagaagaatgaaagtggacc
-cctgcccttcaccatatataaaaattaactccacaaggattaaatatttaaatgtaagat
-cttaaactataagaatcctggaagaaaacctggaaatacccttctcaacatccacgttgg
-taaagaattcttggctaagtctccaaaagcaattgcaacaaaaacaaaaattggcaagtg
-ggacctaattaaactaaagagcttctacacagcaaaagaaactctcaacagagtaaacag
-acaacctacagaatgggagaaaatattcgcaaactatacatccaataaaggtctaatatc
-cagaatctataaggaaattaattcaataagcaaaaaaaaatcccattaaaaatgggcaaa
-agttataaacagacacttctcaaaagacatacaagtggccaaaaaacatgaagaattctc
-atcatcactaatcatcaaagaaaggcaaatcaaagcaattagataccatctcataccagt
-cagaatggccattattcaaaagtcaaataatagcagaagctagtgaagctgtagagaaaa
-ggaaacacatacactcttggtgggaacaaaaactagttctgccagtttggaaagcagttt
-ggagatttcttaaggaacttaaaaatagagctaccatttgacccagaaatctcattagtg
-ggtatctatgcaaaagaaaacaaatcattctaccaaaaagacacatgcagccctatgttc
-atcgcagcactattcccaatagtaaagacatgaaatcaacctatgtgctcatcaatcatc
-aatggtggattggataaagacaatgtgttacatattcaacatgaaatactatgcatccat
-aaaaaagaatgaaatcatgttttctgcagcaacatggatgcagctggagaccataattct
-aagcaaattaatgcaggaacagaaaaccaaatactgtatgttctcacttataagtaggag
-caaaacattgtgtagtcatcaacataaagaaggaaacaatagacaatgtggattactaga
-gggaggagggaggaaggggggcatgggctgataaactaactattgggtactatgctcact
-acccaagtgaaaggaaacataacccaaacgacagcatcacacaatatacccatgtaacaa
-acctgtacttgtatcccatgtatctaaaataaaagttgaagttataaagaaaaataagtg
-ttagagtttatttcttggctcacaattctactccattgttatatatgtttaGCTGTACTG
-Aggggtctccaagatcaccctcaagtttgatgactcactagaaaaactcaccagacctat
-aaaaacgattatactcatggttacagcttaatacagttaggagatacagattaaagtcag
-caaaggtaaaaggtgcacagagtgatgcctaggaaaaaacaggtatgagctttcagttgt
-actcttcctccagaatcacacgaatagaactcaattcttccaaccataaggtatgacaat
-aagtgcaaaatggtgccagccattttcagtgggagtcaatcacataagcatgaagcatcc
-ccaagactgaatttagctactcaatcttcagcccctaaccttaggagtcaagctaatacc
-gcttggcctgaagccccagtcatagaaaaaaatatatgatttattcaccataaatcacat
-tgttagcataaactatttggcatgggccaagtctcaggtatacaaagacactttatcagg
-caggataattaaagggctcagagattatctgccaggacctttgaaatatgcagggttagg
-acaaccccaaatcttctgagttaaccctttattacacaGTCCACCCCATACCCCTTAGCC
-TAGGCTGTCTTTCAGCAAAACAATTCTATATTTCTGAGCATCTACATTTAGTATAGCATT
-TATATAACAGATCTAGAAATAGTATCAGTATGAAGAAAGATCTCTAGTTATAGTAGATAA
-AATATAGCAGTGGAAGGCCCAGCATACCATGGTTGTGCTATGCTCAAAAACATTTGGAGG
-AGCTAGTGTGGGGTAGGGATAAAGATTTTAAAAACAACTAATCTATCTCATAAAGCCATT
-ACATACATTTTCATATTTTTGTACTGATTTGTTACTTGTTTCTCCCCTTGATCTACCACT
-TTAATCTTACAGCTGCAGAATTATTTAGCCTAGAAATTAGTTTATGGTTAACTAAATCCA
-ATTCTTCCTTAGGCTAGTCATTTTCCATTGGTAATACATCCTGAGGAGGCTTAACTCAAT
-CTCTCAATACATTTGATCATCAGTATCAGTACCATCCTATGACTTATTTAATAAGGTGGC
-TGAATCTTACCAACAATAATAGTGTCACACTGTATAGCAATATAGTCATGGAACAATTTA
-GTTTCATTCATAGAACAAATTAGTAAGGCTTACGTAAGTTTTGCTATGCCTTCCCAACAG
-AAACAGTCCTTGCTTATATACAAGATATACTTATGGACAAGCATTGTTATAATTGTTAGA
-ATGATTTGATTATTTCTGGCTTCCATGTCAACGGAGGACAAAGACAGCCACCCCGTTTTA
-GTTTTCAAGCTTGGACAGAGACTGGTTTCCATTGTGTGATTTTCTACAGCAGGACCTCCC
-CACCCTCCTATGGGAGGTCACAGGTGATATTCAGATAGCTTCAGTCCCTACTAACTGTAC
-TGCAGAATATGTCTTATTCTGAAGCTCTAATGGGGCAAGAATAATTTGTAGTGCATCAAT
-GCACATTTACAAATGCCCTGAGAGGTCTTTCATAAGTTTGAAGGCCCATGAGATTCCCAT
-AAGTGTGTCCCTTTTTCCTCAGCAACTAGGATGTAGTGCTATTTCCCCATGGTTACTTTG
-ACCTTCATCTGTAATTAAAACAGTCAAAAGGCACTGTTGGGTCAGGGTACAAGCCCTTTC
-CCAACGTTGGATCTTAGCATTATCTAGCATTATTTTTGAGTCTACTTGTTTCATTTTAAT
-AAAGCCTCATCACTTTCTCAGGATGACCCTCATCTTTTGCCTTCCTCCTAGAAAAGAATT
-CTCTCCAATCTGCTCATTTTAGTTCAGTAATATTTCCTCTAGACTTCACTAAAAGGGAAT
-TCAGCTTGTCCCATGATGCCTGAACTGACACCTAATGCCCCTAAAAAGTCTGTTTTATGC
-ACAAATGTAGTTTAATTCACCATGCATGTTGTTGGCATTGTATACTTATGGCCCAAGTGC
-AGTTAGCATATGTGGTTTTTACCCCAAAATGCGGGTTCTTCATATATAGATTAGATGAAT
-TGTAGTCAAACTAGATCTAATTTAGTTTTTAGTATGTTTTAATGCCTTTCATAATCTTTT
-TTGTCTCAGGGTGGGGCCATTACCCCAGGGGAATTCAAGTCACCGTGTAATGGCTACTGC
-TTTAATCCCATCATGTATTAATTGCCATTCTCTCttttttcaactttcattttagattca
-ggggatacatgtgcaagtttgttacctgggtatattgcatgatgctgaggtttgggatat
-gaatgattttgtcacacaggtctgagcatagtacccagtagttagtttatcaaaccttgt
-ccaccgcctacccagtagtacccagtgtctattgttttcatctttatgtccatcagtact
-caatgttcagcctccacttacaacatatggtgtttggttttctgttcctgtgttaattca
-cttagtattacaacatccagctgcatccatgttgctgcaaagagcataatttcattcttt
-attatggctgcatagtatttgatggtgtatatataacacattgtctttatccaatccacc
-atagatgggcatgtaggttgatttcatgtctttgctattgtgaatagtgctgtgatgagc
-tataactgcatctgtcattttggtggaatgatttgttttcttttgcatagatacccagta
-atgagattgctgggttgaatggtagctctatcattaagttccttaagaaatctccaaact
-gctttcaaactggctgaactaatttacattcccaccaagagtgtaaaaatgttcagtttt
-ctctgcaacctcaccaacatctgtttatttgtttttcatgtttgagtaatagtcattctg
-actgttgtgaaatggtatccagtcatggttttgatttgcattgctctgatgattagtgat
-gatgagcatttttttcatatgtttgttgagcacttatatgtcttcctttgagaagtgtct
-gtttgtgtcctttgcccattttttccatgagtttttttttcttattgaattgtttaattg
-ccttatagattctggatattagatctttgttggatgcatagtctgtaaatattttcttcc
-attctataggttatctgtttactctgttgagagttttgtggtgcagaagtttaattaagt
-cccactttccaatttttggtttttgtttttttcaattgcttttgagaacttagtcataaa
-ttattttccaaggtgatgttgagaatggtgttttctaggttttcttctaggattcttttt
-tctttcttttttttttttttttttttttttgagatggagtctcactctgttgcccaggct
-ggagtgcagtggcgtgatcttagatcactgcaacctccacctcctgggttcaagctgttc
-tcctgcctcaacctcctgagtagctgggattactggtgcatgccaccacacctggctaat
-ttttgtatttttactggagaccagatttcaccatgttggtcaggctggtctcaaactcct
-gacctcatgatccgcccacctcagcctcccaaagtgctgggattacaggtgtgagccgct
-gcgcccagctcttctaggattcttaaagttttggatcttacatttaaatctctaatcgaa
-cttgagtcaatttttatacatggtgaagggcaggggtccatttcattcttctgcatatgg
-ctagccagctatccaagcaccattactgaattattgaatagaattattgaatagggagtc
-ctttctccatgataatttttgttgtctttgttgaagatcaaatggctgcaggtttgtggc
-tttatttccaggttctccattctgttccattggtttatgagtctgtttttgtaccagtat
-catgctgttttggttactgttggcttatagtttgaagttaggtcatgtgatgcctccagc
-tttgttccttttgcttaagtttgctttgactattggggctcttttttggtttcatatgaa
-ttgtagaatagattttctaattctgtgaaaaatgataatggcagtttgatagaaatagtg
-ttgaatctatagactgcattgggcagtttggccatttaaatgatattgattcttccaatc
-catgagcatgggatattttttcatttgcttatattatttattatttcttttagcagtgtt
-ttgtagttctcccggtagaaatctttcacctccttggctaaatatttgcaatgtatttta
-tttttcatgtggctgtcatgaatgggattgtgttttgagactttgctgaagttgtttatt
-aaatctggaagtcttttggtggaatcattagggttttctaggcgcatagaatcacattgt
-cagcttagagagctaatttgactttctcttttcctatttagacaccttttatttccttgt
-cttgcctgattgtttgggctaggatctccaattctaacagctttcagtggagtctaggtt
-tttctaaatataagattatgctgtctgtaaacagggataatttttttcttttactgttaa
-ttttcagagttttatattttatttattatgtgtagtctgcaaatacattctgtaaggtta
-ttgcttgtctttttattttcttaacagggtcttttgcagagcaaattttaagactttgat
-gaagttaaatttgtcaattactttttatggattgggctttttgtgtcatgtctaaaacct
-cataaccaagcattaagctccatagattttctcctatgttttcttttaaaagctttatgg
-ttttacatcttacatgtgattctatgaccaattttgagggcttttttttcatgtatgtgg
-ggtgtttaggtaagttaattttttttaacctgtggatatgcaactgttccatcacctata
-tttaaaaagattattcttccttcatttaattggttttatatctttgtaaaaaaaatcaat
-tggctatactagtatggttctacttccggattctgtattcttttccattcatgtatgtgt
-ccattcctctgctaatacaaatcttggttactgaagctatacaacaactttcataattgg
-gtagaattaatttctccgactttattctattttttcaagattgactaatccattctagct
-attttgcctttccatataaattacagaataatctgtgtatatttagaaatatcttgatgg
-cagtttcaagatggctgactagaagcagctagcgtgtgctactctcacggagaggaaaca
-aagtagcgagtaaatagtggcttttcaagtggatcgtctgggagaccacatcaggattca
-ccaaggaagtgagggaatcctcagagagcagagagtgaagcctggcagcagccgctcacc
-cgggaccagtgtggagcaagagaaattccctaacatggggaaagggtgagtaagtgagag
-tcctcaggggatccacatggatctttgcaatcctgtgcacaggagaaccccttggcccct
-ataggcctctagatcgacacaacatcctggagtttgtgtagacgcactgctaagggccat
-gtggagccccacaggccctggatccctgatcaacctggtgccagctgccatagccctgat
-aggggctgcagtcatggtgctgaggagtggtcagactgccctgctcctcctcaccaggca
-aggctcggctttggcttccagtgcaacagtctgcctccacctgaactctgcatgtgggca
-cactctacactcccctgggaaccactcagatggcggattgtgtgactcccattcccctgc
-tgctccgagccaggcaaggctagctggtttgggcttcaacacagcacctctgcccctacc
-tgaacactgtagtgggttgcagctttccattcccctggggcaaaactcacagaggtaaca
-gatAATGCCTGGCACCTTTGTGTGTTGCTAATAGTGAAGTTCAACATTATTGGATAGGAG
-GGAGGTGCAAGCATGCCAGGCATTCCACAGCTTCCAGTCTCCATTGCCCCAGCTAAGGGA
-TGGCATGCTCTCCAGTTAAAGGCCCACAGCACAACTGTCCTGCCCCTGCCTGAACATTTC
-ACCTGCGACCCAGAGCCTTTCCGAAAACCCACCCACCACAGGCCTGTGATATTCTTCTGG
-GTTCCCACCACCCAAGAATCCCACcttcccctgcctgagagtttggctggtgacccaggg
-accagcctgaaccccacccccaccccattacagtcagcacctgaaatctgggatagataa
-ccccagtccagccccttcagggccatgcacactgtccagcaggccttctggaggcctgtc
-agctgagaaactatcaatacccttccagtgctgttggcacctgaccaatttcctcagggc
-ctgaggttgggcctacccaaccagcaaacaccaccatgaccaacaccgacctgcacggac
-cCAAAGGTGGAGACCTTCCTTCTCAAAAAGCAGCAGTAATGCCCCATCATagaataagtg
-agccttaaagctatctgtatcaggttgagtgatgaggttataccctgaacaactctcatg
-gagaatcataaaacaagtgttccctgtggccctcaaccacattgcagtccagagatagac
-tatagtgtgcatctgaactaggagtcatgagccctgaaacagggtgtgataaggaaacag
-atcacatttctacctacctaggatggggagctggtgcagtcttctcgcccacaagcccct
-acagagacctcagtgcaggagttgctcccagccacgctcatcagagctggtgcctgtgct
-tgccattggtatactaatgggcaagccaggggcaccagctcttctcagctctgtcccacc
-atccccacagaacaagaagctcagtacatcaggcacccccactgtccagcccttcacctg
-aaacaactgagagcccctaatagtaaaaaaagatcagatctatacccatctgtttatggg
-acagctggctgttacttgcaaatgtcatctaccagtctataggtcaaactggacagccca
-tcaaaaaacctgctggtagaagtgtgtaggactatagaaacaaagccaaaagccctaccc
-aacacaatcccctccagataagaaggaactagtataagaattctgctgtcatgaaaaatc
-tgaatgtgtgacaccaacaaggttcactctagctctccaggagtggtcctagccaaaata
-gaagctgagagatgacagatggagaattcaaagcatagattgcaggaaaattctttgaga
-ttcaagataaggttgaaaatcaacacaaagaaacctgtaaagcaatccagagaataaagg
-aagaggtaaactcttaaaaataaatctatcagagctactgaaagtgaaaaactcacttaa
-gacattccgaaattcaatgaaaagttttatcaatagactagatgtagcagaagaaagaat
-ttcagagcttgaagatcagtctttcaaactaacccagtcagacaaaataaagaaaaagtt
-attttgaaaaatgaaccaaatcttcaagaaatatgggattatgtaaagtgaccaaaccta
-tgaattactggcattctcaagagagaaagaggaaaaagtaaacaacctagaaagcatatt
-tgagggaataattcaagaaaatttcctttatcttgctagagaggtagacatccagataca
-ataaattcacagaacacctgcaagatgctatacaaagtgaacatcatcaagacatagggt
-catcagacagtctaaggtcaattctaaagaaaaaatcttgaaggcagcctagagaaaagt
-gtcagatgagttacaaaggtgagcccatctggctaacagcagacttatcagcagaaaccc
-tacaatcccaaagagactgggggcctatttaaagaattctcaaagaaaagaaactccaag
-caagaatttcataccctgccaaactaagctttataagtgaaggagaaataagatcttttt
-cagacaagcaatcactaaggcaatttattgccactagaccagccttacaagagatcctta
-agggagttggagttctaaacataaagatggaagaacaatatctgccaccacaaaaccaca
-cctaagtacatagcacatagaccctttaaagctattacacaataggaactataaagcaac
-cagcttacaatttcatgacaggatcaaaatctcacatatcaatattaaccttgaatgtaa
-atggtcttaacaccccacttaaaggcacagagtggcaagttggatcataaaataagaccc
-atccatctgttgtgttcaagagacccatctcacatgtaatgacTACTACACTAATTTTAT
-CGGGTTTTTTTCCCCATTGCTTATAAGTTTCATTTTATGGTATGTTATTTTGATTGTATG
-CCAAACATTGGGTAAATGGGTTTTGGAGACTCCAAGTGATGTTATCTTCAAACATAAAAG
-GTCCTCCCTTTCTCCAGATAGCAAAGAGATAAGGACATGACTAATTCAATATAACAAGGC
-ATTAAGCTGGTTCAGGGCTGGGTTTCAGTATTAGTAATGATTCCAACCACATCTAGTTTG
-GTCCTGTTTCTCAGGAATAGCCCTCCAGGCTTTTTCTTCAGGGTCTGTTTGGTCTCAGTA
-TCTTCAGCCCAAAAAAACAATGAGGGAATTCTAGCTCTGTTCTTTATGGTTTTCAAACAT
-TGCTCTTCAGCCTCCTGATTCAGGCACTTCTGTAATGTCTCAAGGGGGAGACTATCTGTG
-TGCTTGAGGTAGGCTCCATATCACTATCATATCTGTTTCCTAAGCACTACAAGAGTACAA
-GAAATCTCTTACTGCCTTTCGGAAGTTTCAGCTGAGCTTTCCAACCTCTCACAAAGCTCT
-ACTTTTCCAATGCTCCATTGGGGGGACTAAAATTTGGGGCACCTGAAATTCCAATTTGTA
-ATTCCTAGAATCTCTGCTACTTCTGCTGATTCAATTACCTCCCAGAAAGCCTTTCTTTCT
-GGGCCAAGCCTGATTTCCCGTCTGTCCCAAACTGACAAAGGCACCCATGGGGGAAATGGC
-TGGCAATTATTGACCTACTCCAGAAACAGAAAGCCTGTTCTGTTCTCTCTTTAGAATATC
-AACTCTTCTAGTACCAGTAATTTCTCTGGTTCTCTAATGCCTTGGaaatattattttaat
-aaaaatCAAGCTTTTCTAGGTTTTGTATCAAAGGCATTGCTTTTCTGTGATTTACTGATT
-TCTCCCCAAGAACAGAACTTCTCAGgcccatttaatcttaacttaattgctgttatgttt
-ggctttaaattggccattgtttaacgtgatttacattttcctgagttttctatatttctc
-ttttttctcctttcttttaatctttctgtataaaccagatgttctttaattccattttcc
-tccccactagtttttaatgtattctccttttctattcatcatcactctagaaatgaagac
-atacattcttaacctatcaatatctaatattaaccaaaaatgtgtatttctcctcagaca
-atgcatggaatacaactccatttcacctgcctccagtttatattctattgctttatttta
-ctttcatataatactaagacaatattattgcatgcgtgacaattataggtagttctattt
-tctgggtgactccaacaagttatcattataaagtaacccattttcctctaagataatttt
-tgccttaaatactattttgttcaatactaagaagtaagataacttccttttgttggtatt
-tgcatgttaagtttttttcccatatttccactttcaatcttctccgtatcttgtttttac
-atttatctgttgtaaatagcatctaatttttcatccagtctagcaactagagttaatcca
-taaatttaccaatctctgaataatatatggaacatagaccactttaattctatttaacgc
-tcccaattgattctattttcagaattttgatatttaattatgtttttaatcttataaaac
-atctttatttaattctGCCAGTTTAATCCACTtttatccctttttttgttgcttcttcat
-cacatactttccatgtgtggtcatttttttaaactaaagaacatcctttagaatttcctt
-tcatgagatctgctatctctatctgaaaaggttgtatttatattttcttcttaaaatatt
-tttgtggatatggatttctaggatgacatttactttgaaaaatacgttgaagagctcagt
-ccattggattatggcttctattgtttgtggtgaaaaatcacctgtcagtgtaacaattac
-tctatcaaaagtatggtttctgtttttccctctgactgtttcccacttttctctttgtcA
-TTTTATCTAGATGACAATTCTTATTTATTTTCTAGAATAGTATTTCTTAGATTATTTCTG
-AAAAAAAAGAAGATTTATTATCTTTTCAAATTTATGTAGCtttttgtaattctttttctt
-taattttctttctccttctctttgaaaatcttattaatcagatattggctctcctggatt
-gacactctgtgtcttatatattttgctcatactttccacttgtttttagacttcaaagat
-tttctcactttatcttcaaatgtgcctgctaaacaatcatttttctaatttccaaaagtt
-tactacttctccttacatagcatgatattattgctttatggatggaataCACTCTTGAAA
-CTCCAGCCCCTAAATAATAGTTATTCTAATGTGCCTTTCTTCATTTATTTTCAGTCATGT
-TAAAGATTTTCTCAAATAGATAGCCAGCCTAGATTGTTTATTCATATTTTACATATATAC
-TGAGCCATTTTATGTGTGCAAACTTGTCCACAGCTTTTGTTTTAAAATGCTTGaactgtg
-aagatagaaaagacatgtttgctggaatgcataatactgaagtttacttctcatagtctt
-tctttagaagttatcgcctaggcagaaaaagaaagtaactaaaaaaaaagaaaacacaat
-ttccaggtatatctgtgccaactcaggtgactagtaaaacaaaattctaagatgacatct
-gtatagcctacataggaagcaaccagttcacattatagaaggaagaatgaatgttccagA
-GACAAAATATAGTTACAATACACCCTCATCTATTGTAGTAAAAAAAAAAAAAAGCTGAAG
-TCTAAATTACACAAATGTAGCAGCATAATACTATTAAATAATAAGTAATTTAATATTCTA
-TTTCATGGCATTATTTTACAGGAGCACTATTTGATCATCTTCTCTTTATCACACATACTT
-CTTCCATTTATCTTACAGTATCTTTACATAAACACTAAAATAGTTATACTCAGATTGTAC
-ACTTTTGAAGGGAGTTAGCCTATTTGTGTCAATTATTTACTAAAACAAAGCTAAATAACA
-GCAACAAAAAAGCCTTGTTGGAACAGGGACCAGGGGAATGATCAGAGCAATAAGTAGCTT
-GCATGAAAATATTATTAACTCTGAATACTTTCTCATTAACATTAACAGTGTGTCCTGCCT
-GTATATTTAATCCATTTAGAATTAAACTATTAATATATTGTGTCCTAGGATGGCAGAGTT
-ATTAAGCAGCCCCTGTATGCTCCAGGGGATATAGGTTGATATTCTTCAGCTGTCAAAATT
-CTTCAGCTGTCAAAATTCTTCAGCTGACTTAAATCAGCAGTAGTGGCGTTTATCACCAGT
-CAACAAAGTTCTTCTATCCTTCACTTCTTTAGCCTACTCATCTAATGGATGTTGGCACGA
-ACATGAAGTTTCTCTCCTAAATATCTATGATGTTCCACAAATCATGGGATATGCCTGCAG
-GCTGCCAGCACAATCAGATCTTCATGTTCCAAGAAAGGGATCATTAGTTTGGCCCTGCAA
-GATGTGCCACCTTTCTTGGAGAACTGAGTGTGCCACATGCAATCTGCTGAGGCATGAACG
-TGCTCTTGGCATTTCTGTTTATTTGCTCCTTATTACACTATATTGTGTCAGAATGATGGT
-TTGGGTTCAACAGTATGCTCACGTAAGCCACTATTCCAAACTTCCTAAACGCACAGTTGT
-GGAATGTGACACAATTGTTGGCAATGATATTTAAACAGGATATGTGTTTTTGGTGGGGTC
-TCTGGGAAAAATTACTAAAGGGAGGGGTGGAGTGATCCAAATATTCAAGTGGTAGACACC
-CACTTGACTTTGGccttccacttcctcctgtttggaatatggtcataatgctggaggtaa
-tgctgccatctataacaatgaagcaaaaacactggataacagtatgtgaacagaagagta
-gagggtgactagcatggtgaagctgttatataatttctggactTTATGTTATGTAAGAAA
-AATAAAACCTGAATTTGTAATAAATGAACAAAATGCCTTTTTCATGTTTTTCTGTTTCAT
-ATTACAGCCTATTATACTTTCTAACTGGCACATCATGGATTATAGATAGAATGTGATTTA
-GGATTAAACTCTCTTAAGTTTAAAATGTGTAGTTTTCTTCTCTCTTGTTCATTCTCTTAC
-TGCCTCCAGTTCATTTCAGAGCATATGAAAAGAGACAATAAGGGACTTTTAGCTGGAAGT
-TTACACTACATTACTGAGTAGGAGGAAAGTAGCTTAATAGTTCTATAAAGAGTATCATTA
-CAATTTTAAAAATAAACAAAAACATAAATTATATACCTGTAGTCTATCCTGAAAATATTT
-CCTGAAGTCACAGATTTGGAGTATTGTCAACTTGTGCAtaaacttcatgagaccatggac
-tattgtttttctcactgctttattcctagctccttgatcagaacaggcagagagaagatg
-cacaataaatgaataaatataataaatgaatGTATCCTTTATTACCTACGCAAACACATG
-CACACAAACACATCTATGAAGTTTTACATGATAGTATAAACACTGCTTTGGTGGAGGAAG
-TTACTGATTTTCTTTTAGCTTGTTTTCCACTTTATTTTTCTTTACCAAATAAGTTTCACT
-TTTGCTATTAGAATATAATAAATAACAGAAACCACAAGAACAAAGTAGCAGCTGAAAAAA
-AGAAATGGAAAATTCTTAATTCATATATGATTGCCTCTGTGAAACAAtgaaaagtggtca
-tccaatttcagtttgaacacttTTTTCCTCATAAAGTCATCCTATACCTTTACTCAAATT
-TAGTTTTAGGTGCATTAGGAGTTAAAAATAAAACATAAACCCATTTAAGAACCAAGAGAA
-TTAGTAAGGTAAATTACTTTGGTAAAATGCCCAAGTTCCAGGCTCTGCTGAAGAGAAATT
-ATTGATTCAACCTTAAAATatttgaagtctctggtaaggtgactttagctaaagctgcaa
-ccagctcaactacaaatcagactgactcactactctagcaacttgacagaagaacaatac
-tagacagaatattaattaccttttggaggtaattatttattgaaaactctactgaacttc
-tatatgtctggcataaaataaaggttatgacatatttttaaaaagaaagaagacataact
-cattgtccagagaggaaatgatcaacacccagccaatggaattatcaaccagaaactcaa
-agtaactctgatagaaatatgctagagaatatagtgggaaaataaacagtactggtgttt
-actgataaaatagagaattttatctatgagccaaaacaaagtaatacaaattaaaaattc
-aatatcagaaatggataattcattcaatgggctgaacagcagactgggagaagcaaagaa
-aacaatcacttcacttgaaactcaaatgaacatttgaatagaaatttcccaaatgaacac
-aaacacaaaaaagtaaagaaaaattgaatacaacatcagagagatgtgagatattatcaa
-ataattcaacatggatttaattggctcccaagaagaagggaaggagagaatgaagcagaa
-gaaataagagctaatagcctcctacatagcaaaattgatccaagaacttcagcaaggtct
-aattaggacaaattcaaagaaaatttctagacatagtggatttcaaactgctgaaaatca
-aagacagagaacaaatcttaaaagtagccagagaaaaaggacatgttatctaggaaggaa
-caatgacacaaatGATGCTGAGCTATTTCCAGAAAAATAAAAACAGCgggtgacatcagc
-aagatggcagaataggaagtcccagatctcatttccacatggaaacaccagtttaacaat
-agatgaacaaaaatatctttattagaattccagaaGAGAAggaaagaaattcaaagattt
-ctcataagaaacttcgaagggcaggaggaagtggcacaatatttttaaagtgcttcaata
-gtaagtctcaatccagatatctatgtccaagaaaatatccttcaagaataaggaccaaat
-aaacacattctcaaatgaaggaaaactgaaaaaaaaagggggggtcactagtaggtatac
-ctaaaagaacagctaaaggaagtcctccacagtgaaagaaattatttttttttttttttg
-agaaaggagtcttggaacataaggaaaaaagaagagagaaaacaaaaacatcagaaatgc
-aataaactttttacctactttttagttttctaaattatttttgacagtaacagcaaaaat
-tatccctctatagtgattctcagcataggtagaaaaaatatttaagtcaatgatattaga
-aatggggggttatcatagagatataaagggagataaaatctttatctgatgtggttaaat
-gatgtaccagtagactgtaataagttatggatatataatgtagcacagacaacaatcact
-acaaaagctatacaaagagatacacttgaaaacactatagatgaatgaaaatggaattct
-aaattatggaaaaatatctcacaaaatggcaggaaaaataagacaaagaagcaaaaagga
-aacaaaaacaaaatgaaagatttaagcattaatatatcaataatttaattaaatttaaat
-gatctaaacacacaaatttaaagatgaatattggcaaagtatgtttttagatgacccagt
-aatatgctatatacaagaaactcacatcaaatataatgatataaataggttataagtaaa
-agaatggaaaaagatataccatacaaatattaataaaaagtttgcaggagtgactatatt
-aatgtcagataaagtagacttcagaacatcaaaaaaattaggatgattttttgtcacctt
-tacatagtgacaaaaggtccaatacaccaaaaagatgtggcaaacttaaatttgtgtgct
-ccaaaacacaaagctgcaaaatatgtgaagcaataacagagagttaaaagagagaaataa
-gcaaaaacacagtcgggatatcaccacccacttctttccagaattgatagaacaacaaga
-aagaaaatcagcaacagcaatagaagagctcaacaacattaactacaggatccacgtggc
-atttaaggagcatttccactcaactagagcagagtaaatattcctttcgagctcagagag
-tgtatactaagatagactatatcctaggcaaaaaaaaaaagaagaagaagaaaaaaggat
-attcaactaattaaaaagaatttaaactgcacaaagtttattctctatatgattgacaca
-gtgaaatcaaactaggaatcaataccagaaataaaacacaaaaatctccaaacacctgga
-aattacacaacatgcttccaagtcaaagagaagtctcaataagaataaaatatacataga
-attaaataaaaatgaacatataacatattcataatttgtgctaaagcagtgccaagagag
-aaatttagaacaacaaatgcttatattacaaaagaagaaaaatgtcaaatcaataatctt
-agctctcacctgaattagaaaaataagagcaaattaaatgcaaagtaagcagaagaaaga
-acataataaagataacagcacaaatcaatgaaattggaaacagaaaaacaatagagaaaa
-tcagtgaaatgaaaagctgcttctttgaaaagatcaataacattgacacacttttagcaa
-gactgacaaagaaagacacaaatttccagcatgcggaataaaacaaagaatatcactaaa
-gaccctatggaaataaaaatgataataagggaatacgataacctttttttttttttttga
-gacagagtcttcctctattgcccaggctggagtgcagtggcacaatctcagctcactgca
-acctctgcctcctgggttcaagagattctcctgcctcggcctcccaagtagctgggacta
-caggcatgggccaccatgcccagccagtttttgtatttttagtagagatggggtttcacc
-acactggccaggctggtctcgaactcctgacctcatgatctgctcgcctgggcctcccaa
-agtgctgggattacaggcatgagccaccgcgcccagccaactaactctctatacattgat
-ttacttttttattttaaaatatccttgcattcccagtagaaaccctagttggtAAAAAAa
-aattattgtttgtaaacccttcttctttgatgttacgcatctacagctaaagatttcccc
-ttaagcaaggcaggagctgcatttcacactttataaaatgttgtattttactatcttgcc
-gttcaaaatacatattaattattcctataattttatctttaacacatggcttttacataa
-ttttaaatagtactttttaaattttaaattaaattttaaatacttttaaataataaaagt
-atgctagttaatttcaaaatattatgtttcttaacatcttatttttattggtttccaact
-taatactgatgtttttctagatatcacatttttaattgattgctattttgcaattatttc
-tgcaatattttagtgttttgacatttatagggacttctttaaagaatcaacactgtccat
-ctcagtgagcattccatgtgcatgtgaaaaaaaaacgggtattctgtaattattggaggt
-agtgttctatacatgttaattggattgaggtggttattcagatttgctacattctttttt
-ttttttttcgagacagagtcttgctctgtcaccaaccaggctggagtgcagtggcacgat
-cttgggtcactgcaacctccacctcccgggttcaagtgattcccttgcattagcctcccg
-agtagctgggactacaggtgcgcgccaccatgcccggctaattttttgtattttagtaga
-gacgggatttcaccatgttggccaggctggtcttgaactcctgacctcgtgatctgcctg
-cctcggcctcccaaagtgctgggattacaggcatgagccaccacgcctggccatttgcta
-cattcttactaaatgtttggtctagttatgctatcaataaccaacagtgaatgataaaat
-ttccaactgattgaagatttttctgttttcaagttacttttgtccatctttacttcatgt
-atttttaagttatattattagatacatcatgtctttctaatgaattgaccctttcatcat
-tatgaaatggccttcattatctctagtaaatactgcttgccttggagtcaaatacatcag
-atattaatataatcacTCCACAATTAACAAAGCCATCAAAAGTAGCTTGTATATCCAACT
-TATTCTCTGTATCGATTTCTTTCACTTTTGGCCTGAAAAATCTTTACTCactgaaaagca
-aagaatataaagaaaaaaaaaaggtaaagaatccaaggactgtgggaaaactgcaaaagg
-tgtaacctacatgtaatgggaataccagaaggagaagaaagagaaaggaacagaaaaaaa
-tatttaaaacaacaattgaaaatcttcagtgggagtataattagttcaaccattgtggaa
-gacagtgtggtgattcctcaaggatctagaaccagaaatacctttgacccagcaatctta
-ttactgggtatatacccaaagaattataaattgttctactataaagacacatgcacacat
-atgtttactgcagcactatttacaatagcaaagacttggaaccaacccaaatgcccacca
-atgatagattggataaagaaaatgtggcacatatacaccatggaatactatgcattcata
-aaaaagaatgagttcatgtcctttgcagagacatggatgaagctggaaaccatcattctc
-agcaaactaacacaggaacagaaaaccaaacaccgcatgttctcactcataagtgggagt
-tgaacaatgagaacacatggacacagggaagggaatgtaacacactggggcctgccaggg
-gtgggggggcaatgagaaagcattaggacaaataatgcacgtggggcttaaaacctagat
-ggcaggtttataggtgcagcaaaccaccatggcacatgcatacctatgtaacaaacctgc
-acgttctgcacatgtatcccagaacttaaagtaaaataaaaagaaagaaaaaaaaacttg
-agtaaaatgaaaaagaaaaagaaaattttccccaaattaatatcaaacatcaaaccacag
-atccaagaagctcagagaatactaagtaggataaatgcaaaaaaaaaaaaaaaaaaaacc
-taatcatgtcatattcaagctccatgaaacaaaatataaagaaagaatcctgaaagaaga
-caaaggaaaaaaTCTTATcataataatagtgctcatttctccaacaagacataacaatcc
-ttaatgtgtatgtgtctaaaaacagagtcaaaCAATgttttgatttgcatttccctgttg
-actagtgatactgagcatttttccatgtatatgttgaccatttgcatgtcttttgagaat
-gtctatttttgttctttgctcatttttcaaggatatcatttgtttttgtttctgtttttt
-ttgctttcagttgagtcccttgtttattctagtttgatacagtcccatttgtctgttctt
-ggttttgttgcctgtgcttttaaggtcttaaaatatttgcctagaccaaagtcctggagt
-gtttcccctatgtcttcttctagtagttttatggttttgggtcttaggtttaagtctcta
-atctattttgagttgacttttgtatatgatgatagataggggtctagtttcatttttctg
-catataaatatccagttcccagcaccatttattgaagagtgtgtcctttccccagtggat
-gttcttggtgcctttgttgaaaatcagttggctgtaaatatgtgaatttatttctggatt
-ctttattctgttccattgatctatatgttcatttttataccaacaccatattgttttgct
-ataagtactatagccttgtaatatattatgaaggcaggtagtgtgatgccacaaactttg
-ttcttttgtctcagaattgctttggctattttggctcttttttggtttcatacacatttt
-aggattgatttttctatttatgtggaaaatgtcattggtattttgataagaattgaattg
-aatctgtagattgttttaggaaatatggtcattttaacaaaattgattgttccttttcat
-gagcatgggaggcatttccatttgtttgtgtcgtcttccattcctttcatccgtgtcttg
-gggtattccttgttgacatctttctcctccttggttaaatttattcttaggtattttttg
-tagctattgtaaatggaattgccttcttgatttcttttttggctagttcattattggcat
-ataaaaatgctactgattttttagcattgattttgcattctgcaactttactgaatttgt
-ttatcaattctaagaggtttttggtggagtcgttaggtttctttaaataaaattatgtca
-tctgcaaagagggataagttagtttcctgtttcccatttagatactgtttatttcttttt
-ttgtctaattgctctatctagcacttccagtactatgttgaatgggaatgatgaaagtgg
-acatcttcttgtcttattccagttcttaaaggaaaggcGACTCTTgggggaggagccaag
-atggccgaataggaacagctccggtctacagctcccagcgtgagcagaagacggcgattt
-ctgcatttccatctgaggtaccgggttcatctcactagggagtgccagacagtgggcgca
-ggccagtgggtgcgcgcaccggcaccgtgcgcgagccgaagcagggcgaggcattgcctc
-acctgggaagcgcaaggggtcagggtgttccctttccgagtcaaagaaagaggtgacgga
-cacacctggaaaatcgggtcactcccacccgaatattgcgcttttcagaccggcttaaaa
-aacggcgcaccacgagactatatcccgcacctggctcggagggtcctacgcccacggaat
-ctcgctgattgctagcacagcagtctgagatcaaactgcaaggcggcagcgaggctgggg
-gaggggcgcccgccattgcccaggcttgcttaggtaaacaaagcagccgggaagctcgaa
-ctgggtggagcccaccacagctcaaggaggcctgcctgcctctgtaggctccacctctgg
-gggcagggcacagacaaacaaaaagacagcagtaacctctgcagacttaaatgtccctgt
-ctgacagctttgaagagagcagtggttctcccagcacgcagctggagatctgagaatggg
-cagactgcctcctcaggtgggtccctgacccctgacccccgagcagcctaactgggaggc
-accccccagcaggggcacactgacacctcacacggcagggtattccaacagacctgcagc
-tgagggtgctgtctgttagaaggaaaactaacaaacagaaaggacatccacaccgaaaac
-ccatctgtacatcaccatcatcaaagaccaaaagtagataaaaccacaaagatggggaaa
-aaacagaacagaaaaacgggaaactctaaaacgcagagcgcctctcctcctccaaaggaa
-cgcagttcctcaccagcaacggaacaaagctggatggagaatgactttgacgagctgaga
-gaagaaggcttcagatgatcaaattactctgagctatgggaggacattcaaaccaaaggc
-aaagaagttgaaaactttgaaaaaaatttagaagaatgtataactagaataaccaataca
-gagaagtgcttaaaggagctgatggagctgaaaaccaaggctcgagaactacgtgaagaa
-tgcagaagcctcaggagccaatgcgatcaactggaagaaagggtatcagcaatggaagat
-gaaatgaatgaaatgaagcgagaagggaagtttagagaaaaaagaataaaaagaaatgag
-caaagcctccaagaaatatgggactatgtgaaaagaccaaatctacgtctgattggtgta
-cctgaaagtgatgcggagaatggaaccaagttggaaaacactctacaggatattatccag
-gagaacttccccaatctagcaaggcaggccaacgttcagattcaggaaatacagagaacg
-ccacaaagatactcctcgagaagagcaactcaaagacacataattgtcagattcaccaaa
-gttgaaatgaaggaaaaaatgttaagggcagccagagagaaaggtcgggttaccctcaaa
-gggaagcccatcagactaacagcggatctctcggcagaaaccctacaaaccagaagagag
-tgggggccaatattcaacattcttaaagaaaagaattttcaacccagaatttcatatcca
-gccaaactaagcttcataagtgaaggagaaataaaatactttacagacaagcaaatgctg
-agagattttgtcaccaccaggcctgccctaaaagagctcctgaaggaagcgctaaacatg
-gaaaggaacaactggtaccagccgctgcaaaatcatgccaaaatgtaaagaccatcgaga
-ctaggaagaaactgcatcaactaacgagcaaaatcaccagctaacatcataatgacagga
-tcaaattcacacataacaatattaactttaaatgttaatggactaaattctccaattaaa
-agacacagactggcaagttggataaagagtcaagacccatcagtgtgctgtattcaggaa
-acccatgtcacgtgcagagacacacataggctcaaaataaaaggatggaggaagatctac
-caagcaaatggaaaacaaaaaaaggcaggggttgcaatcctagtctctgataaaacagac
-tttaaaccaacaaagatcaaaagagacaaaggcggccattacataatggtaaagggatca
-attcaacaagaggagctaactatcctaaatatatatgcacccaatacaggagcacccaga
-ttcataaagcaagtcctgagtgacctacaaagagacttagactcccacacattaataatg
-ggagactttaacaccccactgtcaacattagacagatcaacaagacagaaagtcaacaag
-gatacccaggaattgaactcagctctgcaccaagtggacctaatagacatctacagaact
-ctccaccccaaatcaacagaatatacatttttttcagcaccacacaacacctattccaaa
-attgaccacatagttggaagtaaagctctcctcagcaaatgtaaaagaacagaaattata
-acaaactatctctcagaccacagtgcaatcaaactagaactcagaattaagaatctcact
-caaagccactcaactacatggaaactgaacaacctgctcctgaatgactactgggtacat
-aaggaaatgaaggcagaaataaagatgttctttgaaaccaacaagaacaaagacacaaca
-taccagaatctctgggacgcattcaaagcagtgtgtagagggaaatttatagcactaaat
-gcccacaagacaaagcaggaaagatccaaaattgacaccctaacatcacaattaaaagaa
-ctagaaaagcaagagcaaacacattcaaaagctagcagaaggcaagaaataactaaaatc
-agagcagaactgaaggaactagagacacaaaaacccttcaaaaaatcaatgaatccagga
-gctggttttttgaaaggaccaacaaaattgatagaccgctagcaagactaataaagaaaa
-aaagagagaagaatcaaatagacacaataaaaaatgataaaggggatatcaccactgatc
-ccacagaaatacaaactaccatcagagaatactacaaacacctctacgcaaataaactag
-aaaatctagaagaaatggatacattcctcgacacatacactctgccaagactaaaccagg
-aagaagttgaatctctgaatagaccaataacaggagctgaaattgtggcaataatcaata
-gtttaccaaccaaaaagagtccaggaccagatggattcacagccgaattctaccagaggt
-acaaggaggaactggtaccattccttctgaaactattccaatcaatagaaaaagagggaa
-tcctccctaactcattttatgaggccagcatcattctgataccaaagccgggcagagaca
-caaccaaaaaagagaattttagaccaatatccttgatgaacattgatgcaaaaatcctca
-ataaaatactggcaaaccgaatccagcagcacatcaaaaagcttatccaccatgatcaag
-tgggcttcatccctgggatgcaaggctggttcaatatacacaaatcaataaatgtaatcc
-cgcatataaacagagccaaagacaaaaaccacatgattatctcaatagatgcagaaaaag
-cctttgacaaaattcaacaacccttcatgctaaaaactctcaataaattaggtattgatg
-ggacgtatttcaaaataataagagctatctatgacaaacccacagccaatatcatactga
-atgggcaaaaactggaagcattccctttgaaaactggcacaagacagggatgccctctct
-caccactcctattcaacatagtgttggaagttctggccagggcaatcaggcaggagaagg
-aaataaagggtattcaattaggaaaagaggaagtcaaattgtccctgtttgcagacgaca
-tgattgtttatctagaaaaccccatcgtctcagcccaaaatctccttaagctgataagca
-acttcagcaaagtctcaggatacaaaatcaatgtacaaaaatcacaagcattcttataca
-ccaacaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaa
-agagaataaaatacctaggaatccaacttacaagggatgtgaaggacctcttcaaggaga
-actacaaaccactgctcaaggaaataaaagaggatacaaacaaatggaagaacattccat
-gctcatgggtaggaagaatcaatatcgtgaaaatggccatactgcccaaggtaatttaca
-gattcaatgccatccccatcaagctaccaatgactttcttcacagaattggaaaaaacta
-ctttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaa
-agaacaaagctggaggcatcacactacctgacttcaaactatactacaaggctacagtaa
-ccaaaacagcatggtactggtaccaaaacagagatgtagatcaatggaacagaacagagc
-cctcagaaataacgcccatacctacaactatctgatctttgacaaacctgagaaaaacaa
-gcaatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgt
-agaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatt
-aaagatttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacc
-attcaggacataggcgtgggcaaggacttcatgtccaaaacaccaaaagcaatggcaaca
-aaagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaa
-actaccatcagagtgaacaggcaacctacaacatgggagaaaattttcgcaacctactca
-tctgacaaagggctaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaa
-acaaacaaccccatcaaaaagtgggcgaaggacatgaacagacacttctcaaaagaagac
-atttatgcagccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatg
-caaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaag
-tcaggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttgg
-tgggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatcta
-gaactagaaataccatttgacccagccatcctattactgggtatatacccaaatgactat
-aaatcatgctgctataaagacacatgcacatgtatgtttattgcggcattattcacaata
-gcaaagacttggaaccaacccaaatgtccaacaataatagactggattaagaaaatgtgg
-cacatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgta
-gggacatggatgaaactggaaatcatcattctcagtaaactatcgcaagaacaaaaaacc
-aaacaccgcatattctcactcataggtgggaattgaacaatgagatcacatggacacatg
-aaggggaatatcacactctggggactgtggtggggtgtggggaggggggagggatagcac
-tgggagatatacctaaggctagatgacgagttagtgggtgcagcgcaccagcatggcaca
-tgtatacatatgtaactaacctgcacaatgtgcacatgtaccctaaaacttaaagtataa
-taaaaaataaataaataaataaataaataaaaaaggaaaggctttcagcttttcttcatt
-caatatgatgttagctgtgtgtttgtcacatatatgacctttatttattttatttatttt
-atttttttgagacggagttttgctcttgttgcccagggtgtagtgcagtggcacgacctc
-agctcactgcaacctctgccttctagtttcaagtgagtctcctgcctcagcctctcgagt
-agctgggattacaggggcccaccaccacacctggctaattttttttgtatttttagtaga
-gacagggtttcatcatgttggtcaggctggtctcgaactcctgacctcgtgatccgcctg
-cctcagcctcccaaagcgctgggattacaggcgtgagccactgcgcctggccatatgacc
-tttattatgttgaggtatgttccttctgtgcctagtttgttgagtttttaatcatgaagt
-ggtgttgaattttatcaaatgccttttcctgcatctattgagatggtcatattgtttatg
-tccttcattttgttgatgtgtcatgtttatcaactggcatatgttgaatcatttttgctt
-ctctgggataaatgccatttgattatgatatattacctttttgatgtgctgttggatttg
-acttgctagtattttgttcaggatttctgcaggatttcatcagggatattggcctgtagc
-ttctttcgttttgttgtgttcttgtcaggttttggtatctgagtaatgctggcctttaga
-atgctatagggagaattccttcttcaattttttggaacagtttgaggaggattcatgtta
-gttatttatacatttggtagaacttggtaaaccagtgaatccttctgatcctgggctttt
-cttcagagattttttattacgaattcaatcttatcacacattattggtctgttcaggatt
-tctgtttctttttgatttaatgttggtggctggtatgtgtgtgggaatttaccttttccc
-ctagattttcctgtcagtgtatacttgttcataatagtctctgatgatcttttgtattct
-gtgatatcatgtgtgatgtctccttttttcttttctgattttaacacacaaaagtataaa
-tcactggtacagcaaatgcataaatgaggaaaagacccaaatgttaccactacagaaaac
-cactaaaccataattataaataagagagaaaaaaaaggctatacaaaacaaccaaaaact
-aattaccaaaacgacaagaaaaagtcctcatatataaatagtaagtttgactgttaagtg
-gattaaatattccacttaaaacatataggctgtctgaatgaattttttaaaaaagtgacc
-cagtaatgtaatgcctacaagaaactcacttcaactgttaagacacatagactgataata
-aagggatagaaaaagatatctcatgcacacagaaaccaaaagcgagcaAAGAGACGATGG
-CAGTACGTTCAGGTAGgagataagcttccatgacctcagctgccaccattccccacaatg
-ccccagctacccaagagaccctgagcccactcaactagtacattacttgtacaagtagta
-cgttactactatagctggcatttgagagagccactacagtaaagctatttgcaaccaagg
-aaatcataaaaagtctacataactcctcgacacgcccatcagggctaatgattgtggttg
-ccattgggaaacctgagggcaagcctgccccatcgagctgtgcccaactttgcccccact
-ttggggctgagaatggagcccatgccactgtgcattccacagacagaccatttcctgaga
-caatactgtttctcccagtaaacaaagatcaaatataaactccctgctatcaccgcatcc
-agctcttaactgcaagtgccacctactggcctggaggtcaaactgcacaacccgatagaa
-gtgttgacataagcgtacagtgctcgagaaaaagataagcgtctcaggacctctgccact
-caagatctgcaggagactgtgagcctcatcacatgcctagtacatcactactacaactgg
-catttgagaaagtcaccgcatgaaggctatttataaccaaggaattcatacagagTATAT
-GCCATTCTCCCCATCATTACCACAAgtgctggtgtttgtgcctgccaatgagctatttga
-aggaaagtttgacagtttagctccacccagctttatcctccccttaggggctgagcaggg
-agctcaggccagtgtatattccatagactgtcccttgcctgaggcaacagagagcttctc
-cccgtaaacaaagatcaagcatacacccacctgcttctgcccagattttattcataagca
-ccacatagtagcctggaggtctaactacacaacccagtaaaaaactggcttacacaagtg
-cacagcacggggaaacaagttaagcttcctaagacttctgcactctagccctgcaggagg
-cagtgagcctagcccagcacatcactactacaaccagcatttgagaaagccaccacacaa
-aggctatctataatcaagaaactcatacagactctttgccactgaaagcacccagaacca
-aggccaaataaccctacacaatgtatattataatcacatcctcaagggggaaaaagtcct
-gaccaaatgaaagtaaatttaaaaataagaacagatagttgatccaaatgagaaggaacc
-caagaaacaattctggaagtataaaaaaaagagtgttacaacaccccaaaggattgcact
-aactcttccacaatgaaccctaaccaaaatgaaatctttgaaataccaaagaattcaaaa
-tattaattttaaagaatctcagtaaggtccaagagaaagtaaaaaatcaatacaaatcag
-aaatataactcaggatatgaatgaaaaatctactaaagagatggattttttaaaatagtt
-tttttgttgtttgtttgtttgtttgttgttgttgttgttgttgttgttgagatggagtct
-tgttctgttgcccaagccagagtgcagtggtgcgatctcggctcactgcaaactctgcct
-ccagggttcaagtgattctcctgcctcagcctactgagtagctggaattacaggtgtgtg
-ccactacgcccagataatttttttttttatttttagtagagacaaggtttcaccctgttg
-gccaggctggttttgaactcctgacctcaagtgatctgcccaccttggcctcccaaaatg
-ctgggattacaggtgtgagcccactgtgcccagcctaaatagttttttcaaatgaacttc
-tgtaattgaaaaattcatttaagaaattacaaaatatagttgaaagctctaacaatagac
-taaaccaagcagaagaaagaggttcagaacttgaagacaagtctcttatgaattaaccca
-gtcagacaaaaataaagaaaaaaattttaaaaatgaacagagctttcaagaagtatgaga
-ttatgtaaagtaactgaacctatgagtcacaggtattcctgaggaaaaagaaaaagtgag
-aagtttggaaaaactatttgaggaagtaattggggaaaacctctttagtcttgctagaga
-tttagacatctaaatgaaagaggctcaaagaatgccaggaagatacattgcaagacagac
-ttcatcaagatatgtagtcatcagactatctaaagtcaacatgaaggaaaaaaattctaa
-aatcagcaagagaaaagcatacagtcatctataaaggaaatcccatcagaataacaatgg
-gcttctcagcagaaaccttacaagccagaagagattggatctaatttttggacttcttaa
-agaaaaaaaaacctgtcaaacacgaatgttatgccctgctaaactaagcatcataaatga
-aggggaaataaagtcaagtctttcctgacaagcaaatgctaagataattcatcatcacta
-aaccagtcctataagaaatgctcaaaagaattgtaaaagtcaaaattaaagttcaatact
-caccatcataaatacacacaaaagtacaaaactcacaggttttataaaacaattgagact
-acagagcaactaggtaaaaaattaacattacaacaggaacaaaacctcatatatcaatat
-taactttgaataaaaagggattaaattcccccacttaagagatatagattggcagaacag
-atttaaaaacatgaactaactatatgctgtttacaagaaactcattaataaagacatgag
-ttcaggtaaaggggtggaaaaagatgttctacgcaaacagaaaccaaatgagagaaggag
-tagctatacttatatcagataaagcacactttaaatcaacaacagtaaaataaaacaaag
-gaggtcatcatacaatgataaaaagatcaattcagcaagaagatataaccatcctactaa
-atacatatgcacctaacacaagactacccagattcataaaacaaatactactagacctaa
-gagggatgagaaattacctaattggtacaatgtacaatattctgatgatggttacactaa
-aagcccatactttactgctactcaatatatccatgtaacaaatctgcgcttgtacttcta
-aatctataaaaaAATTAAAATTTAACAAAAGTAAATAAAACACatagctaaaactaaaaa
-agcaaaaacaaaaactatgctaagtattggtaaagatgtggggaaaaaagtaaactctca
-aatattgctagtgggagtataaattgttttccactttggaaaacaatttggtaatttcGt
-ttttttttttttcttttctcttttttttttttttttttttGCATGCCAGAAAAAAATATT
-TACAGTAACTATGGAACACAAAGGTTTATTACATCCATAATTAACATGGAACATTTACTT
-ATCAGTTTGACAAGGACAACACTGAGACCTCTTAGGACAGAGAGAAAGGGCAATTTTCAA
-AGGAAAAAAGCATAGTATATGCATATttaataagtaaaacatacacataccctgtgactc
-agccattgtacatctagctgtttatccaagagaaatgacagcatatggctacacaaagag
-ttgcacacaaattttcaatggcagttttatttgtaatagctaacatctgaaaacaatcat
-aatgttcattagggggtaaatggataaatgatcatatatgcataaaaagtaatacaagca
-ataaaaaggaatgaactattggtacacgaaacatatatgattcaaaataattgccttgga
-tggaaaaagacaagcggaaaagtatacatgctatattacttcatttatgtaatattcaag
-agaatgccaagaaagctacaagaacaaatagcaggtcagtcgttgcctgggtatcatgga
-ggtagagggagggaagggaagaggaaagagtggatgccaaagaggaatgagaaacatttt
-gagagtgaaggatatatacattatgttgattaaggtaatggtttcaccagtgcatctttt
-gccaagttcatcaaattatacactctaaataatgcagtttaatgtacatcaattatatct
-caataaTTTGGAATGAAAAAAAAAAACTCCTCACAAAGAACAAAACCTCTAGGACCTGAT
-AGCTTTCAGTCACAATATAGTCAGGCACTCAAAAAAAAACTTTAACACAATAAAATTCTC
-TTTGAATGCCACCTTAAACTCAATCCCATCCAGAGAAAACAACTTTTATTAGAATGACAT
-GTGATTTGCATTTTTAGTTCATGCATTTACTTATATACACATAAATATAGCTTTTTCACA
-TAAATTAGAATCATTGCTATGCATGTTGTTCTAAAATGTTGCTTTTTCACTCAAAAAATG
-TTTAGTAAGATAAAATCTGCTGCACTCTTTTTAACAGAAGCACAGAATTAAATCATATGG
-ATGCACTTCGTTTTATGCTACTCTACAGAGTGACAAGACTTCTTTGTGCATTTATCTTTG
-AGCACTTATTTATTTCTTTGTAAAAGGCTTTCTAAATTTCCAGATCATCAACAAAGCATT
-AATTTGGTCAGTTAAAAAACAATTGCTTATATCCTTCTCTGAAAAGAATGATGTACAGAA
-AAGAATTATATATATATATGAATAATACATCATAAGTGTTCAGAAAGACATTGTATTTTA
-GGTGGAGAGACAGGCAGGTGACCAGACTGCTACATGCAGTAAGATGAACCCTGATAGAAC
-TAACACTGGAGGCTGTGAAAAAACTGCTAGGAGCACCCAGCCTTGGTAGAGCAGCATAAT
-TTCTTCCTGTAATTCTTTCTCTCCAAATTGCCATACACTTCAGCAGAGTTTGCAACTTCT
-CTTCTAAGTCTTTATCCTTCCCCCAAGGCATGCCTAGCACAGGACTCTTGAACAGTGATG
-CCTCAATTAGAGTTGCTAGCCAATAGATTGAAGCTATGTTGGCACAATATCCTACATCCT
-CCCGATCTACTGGCTGAGCCCAACCCCACCTAAGAAGGACAATAAAGATCTGTGTTCAGA
-GTCATACTGAATAGAGACTTCTGGACTCTATAGAACCCACTGCCTCCTGATGAAGTCCCT
-ACTGTTCACCCTTGCAGTTTTTATGCTCCTGGCCCAATTGGTCTCAGGTAAACAGAATCT
-TGGGGAAGAAGAAACACTGGCCTGGAACAGGGTCCTGCACATGGAGTCCCTGTTTCTAAG
-TGGTCTGTGGAAATGGGGTCTGGCTTCTCACTGGGAGCAGGGCTGAGATTTGTCCTACTT
-CTTCAGACCACCTCTGTTCTAAGAAACTTGAAGGCTCTCAGGATAGAGCAGGATCTGTGA
-TCGGAGCTGGGGAGGAGGGTAAGGCAAATCCCATACAGTTGCCTCCAAAGGTAGAAATGA
-TCTTGAAATCCCAAACTTCTATCCTGTCACTTCGGGTCAGTCCAGTCAAGCCCTGCCTCA
-TTTCACTTTTGTTTTTTTTGCTGCCGATATTCCCTCCTGAGGTAACAATTATATAATATT
-ACTTCCCCCAGTTTTCTTGGTCTTACAGAGAGGTCTCTGATTTTTTGTTTGTTTGTTTGT
-TCTTGGATGTGGTTAACAGAACAGGAAAGGCTGTTTCTATATATGTATAGGACTGTAAAA
-TGGAAAATGAAAAAAAAAATTCTGTGTGGGAACTATTGGAAGTCTATATCAGATTTCAGC
-TCTGTTTGTGTAAGCATTTCTTATTTTTAATTTATTCTGTAGCTTATATTTACAAAACCA
-AGACAAGAACACTGAAAGTTATTTAGAAATAAATTGGCCACATTTCATCACTGCTTGCAT
-TTTTTCACTTGTAACCAactgatatatgagcttataacctgctttatttttttacctacg
-attctatcaggaaaattttcacaggtcttgaatattccttgaaaatacaatttgcagtag
-atgcttataattctgtcatatttttgtaccaatattaacttggaaagtccttaattgtgt
-gtcatttggattattttttctaatgtgtgagtactgtaaataacattgtacaaccttatt
-aatatatcattgtgagattctctgtttgtataggtaaattttagaagttccattgcttgg
-tacaagggtattatttcttctaagttaactggcacatattgccaaTGGTTACTATTGGAG
-TATTTGTATTTTTAACATTTGTATTTCATATTTCTTGCAAATATTTTCAAACATATTGGT
-TGCTTCTAAAATGCATTATTTATTTGAGACACATAATTTTCATTTTCATGTCAAATCTAT
-TGGTGTTTTCTTTGCATTCTTCCACTAACTTAGTAAGTCCTTCTCCGTGTTGAGAACAGT
-TATTCACCTATGATTTTGTTTTTTACACCGGACTCAATCCCACCTTTTTACATAAGGCAC
-AATGAAATAAACTAATATTCTTTAGTATAATTTCCTAATGGGTTATATAATAACTCCATA
-GCCCGCCTCTAGAGATAGTAGTTTATATTCCCTAATTTGCAGAAATGTTCAAATTGATAG
-TGGATAAGAGGAAATTATAATGCTCTCATGGTTGTCTCAAAAGATGTTTCAGGCCTATTG
-CATCCTTGAAATTCTATGAGTTTAAATTGCCTGATTTCTCCCTCTGTCTCTGGAACATTA
-GTGACATACATCGACATACATCACATACTTGTATGTTGTCCTTTTTCTACACTTTGTGTG
-TGTGTATATATATTCTAACATATACATATATATAATGTTAAAAACTCAATCATCAGAGGA
-GGATTAAACAGCTGATAAGGGATAATAGTAGTGGTAATAGCATTCAAAAACGTTTGCTCT
-GTTCACTTACTGTCAAttacctcatatttctttcatttattgtacttatcacaatctgta
-gttattttgtttattcatttacttgtttattttctttctccccctctccaatgtaaggtc
-ctcaaatcatgtctttctgttcattgttttattccctgcatcttgcagaattcttgacat
-ggtaggcactcatcatatacttgttgattaagtACAGTAATGAGTTAAGCAAGGTAAGAA
-AGAGCTCCAGCGTCACTCTAGGGCCTCTATGTGTTAAACCATGTGATGAGATATTTTCAT
-ATGTATATAATATGTACACATATATAGGCAAACCCTGCAGAATGTCTCCCTAATGAATAT
-ATTCCTAATGGAATGGCTTTTTTTATTCTCAAAATTTTGTAAAATGTACTTATATCTCAA
-TATCATATAGGTATATAGGTATAGATGAAAATTTTTTATTTATCTTTCCATAACTTGACA
-TGACATTTTTAACCAGATAATATGTAAGATAAGCCTAGAGTTATCTTCTAAATATAATTT
-TTAGGATCTCAGAAACATGTAAGGGACATTTTGAAAATCTCACCAATTGGCAACAAAAGC
-CATATGTGTTTCAGTAATGGTGAGAAAGATGACAGCAATTATTTTAGCATTTCTTATTTT
-TGAAATGATAGTTTTTACTTCTGTTTAGGTGTTTGTGTTTTAGCTACATTTTAGGAAATT
-GCTTGGGGATTTTGTGTTCATGTATAACAACATGCTATATATTTTCCCATTTAAAATCAT
-GGGGAATTGGCCCCTGGTAAGTGTTTGTATACAGAATTCTGATTTCAGAAATGAGAATCT
-CATACATATCTAAAGAATTCTATGTGTGTTTATAAAATTTCACTTAATCCTCAAAGTAGG
-TATTTATGATTAGGAAAAACATGCTAAAGCAACTGGAAAGGCACTTGAATAAACAGTGCT
-CAAAAACTATTGCTATTTTTTATCCTCCTGTGATAAATACTTAGGCTTAATAATCTATAT
-AATTCCTTTATTCAGGTAATTGGTATGTGAAAAAGTGTCTAAACGACGTTGGAATTTGCA
-AGAAGAAGTGCAAACCTGAAGAGATGCATGTAAAGAATGGTTGGGCAATGTGCGGCAAAC
-AAAGGGACTGCTGTGTTCCAGCTGACAGACGTGCTAATTATCCTGTTTTCTGTGTCCAGA
-CAAAGACTACAAGAATTTcaacagtaacagcaacaacagcaacaacaacTTTGATGATGA
-CTACTGCTTCGATGTCTTCGATGGCTCCTACCCCCGTTTCTCCCACTGGTTGAACATTCC
-AGCCTCTGTCTCCTGCTCTAGGATCCCCGACTCATTAAAGCAAAGAGGCTTATTCTGGTG
-TCAGTTTTCTCTCTACAGCCCCCTTCCCACTTTCCCTCCATTCAACAGTGTCTGGAAGGG
-CACCACAATTTCACTGCACTCGCATTTCTATGGTAGAAATGCAAATAAGATAGGGGCCAG
-GAACAAGGGAGGGTTAGTCCAAAACACCCACTCAGGAATGATAGATAGTAGCAATGTCCT
-CCTTGAAGACAGTTCTAGGCCCACAGCTTGCCATAGCAATTATCAtcaaacttcatgtac
-atcagaaacacctggagagatggctaaagcacagatttctagggctcacttttagtttcc
-aattctgcaggggagcttgagaatttgcactgctcacaagttcccaggtgatgctagggc
-tgctggtccaggcaccacactgtgagaacAATTAGCTTATAATATGAAAGGATTGAAAGC
-CGACTGTGAATGTGATTTTCTACAGATTGAAGGCTGCATTTCCTATGTAGTTTTGGAGTA
-GATAGTAATACAAAatcatcctacagaatcctccgacaacaacctgagaatgtaggtatt
-ataacctcactttagagaataggaaactTGATTTCTAAGCATTAGAAGACTGGGACAGAC
-TAAATTGACTACTGAGAACATTCTGTCACTGCACCATGAGGTTGCCCAATTTTCTTCTCA
-CCCTGGAAATCCTCATTCATAGCTTCCAACTTAAATATGATGAAAGGGAGATCAAGAGCT
-CTATAATGTGTCCTGAATGTTAGGACAGGCACTCATCCCAAGCAATAGAATGTTTTCCGT
-ACATTACATTACATTGATGCTCTGCCTGCACCAATAAGAGAATATGACTGGGTGTATCAT
-AGTCATCCATCCATGCCTCAGGCCCACTTCCCTGATAGTTGGACAGGGAGAATAGGGAAT
-GCAGATGCCTTCGCTTTCTGGACACTTACAGTAGCTGTGTTTGTCTTTGTCATCTCAGTT
-TGCTCACTTATGAAATGCTAGCGTTTTACTCAGTATCTTTCTCCCCACCCCTGTCATAGT
-ACATCTTTCTGATTCTGAAGATATAAGATTGGCTTATGTTTTGTGGGGTCAACTTCACCT
-TTGACCCCATAAGATCCTAGAGATTTAATGTAGATATATAAAAGTTGGAGAAAACATTGG
-TGGAAGGGTTTTCTCCACTATAGACACAAATCCATGAGTGTCATCACAGACTCCTTTTCC
-TTCTTCACTTGATTCCAGTGAAGATCCATGTTCAttctaccacctccaatatgtaccatg
-acctctatctccagctgctgctaggatgattgcaatagccttcccattgattgccctgca
-ttcctttcacactcacgcctaactatcctccacaatgagagccagaatcatttttctgaa
-acacagatctaatcattagactcccctctggcatcttttcccatagcatcctaagacaac
-tcttcagagcagccttcatcactcttggcattcagaacctgccttgcgtttccagtttta
-cctccaaagcactgtcacagggcatcttgctatcccaccaacatacctcttcgtgattgg
-tttgaactcactggattgcttctggttttgagtttttgtacatacttttctgtctCCATT
-TATAACTGCCTGGAAAAAAATCTTTATTTTCTTCTGGAGGACTTTGATAACCACACTGTT
-CTACCCACAATAGAACTACTGCCACCATTTGTGCTCCACTGTTATGACTTACCCAGAATT
-TTAAGTCATCATGTCACATGCCTCACTCTGAATATCTGCTTATGTCTTCTCCCCTACTGG
-ACTTTGAAATTTTATTTAGGAACAGGAACCATCTTATCTTCTCTTTCTCCTACCATCCCC
-TAACAAGATTCTATATTAATTCTTGTTGAATAAGTAAGAGGGATTCTCGAAGGCCAGAAA
-GATCTTTGGATGTTACTGAAATCTCATTTTTATTTATTTTAGATCTTCTCCAGGAAACAG
-GCTTCTGTCTCCTTTAGAAGACATATCTATGATCTATGTCATTACATAGTAGAGGAGTTT
-TGAGAGGTGGCTTGTCCCATGTGGTAGGACATCATTGCCTCTTACACCCATGCTTATCTT
-TGCAGGCAGAACTCATGAACTCACACAAGAAGGTGGGCAGATGGAAGCAAGTTACTTCAg
-cagaggagaatagtaggaaaaaaacataactttagagctggatgtatctgaggtcattca
-tgatcccaccatatatccactcttggaccacagacaaatgatttcccatcttcgagcctg
-ttactgaatttgaagaacagagaaaatactcactcccactcaaggtactttgagggttgc
-cagagtaatctattaaaatgttaatcataTCATAGGGATTCAGCTGTAACAGGTTGTTCC
-CTGGATAAGAAACAGTACAGCACATTTCCCCAGGGCCCTGCCCACTGGGCCTTGGCTGTC
-TTGCCTGAGTATGGGTGATTATAGCCTATGTTTCACCTGGGGGAAGACGCATTAGGCTGA
-GAAGAGTGTAACAGAGTTGAGGGTCATGGGATCTCTTTGAACAGCCAGATGAGATTTTAA
-AGGTTCTAGTAGAACTTGCTGTGCTTACTTTTCAATAATCACCTTGATCACTACCTTGGA
-AACATCTTAGAGCTATTATCACATTGATTCTAGACGATGAATATAATCTCAGTGCTGCAG
-CCTGAAACATTGTCCTCCTGTCCTCTTGCCTTATATCTCATCCGTCCTTCACGCAGTGCT
-GGAACTTAGGTGGCAAATATTCTTTTCCCACTTTGGAGTTGACTAATGGCATTAGGAGGC
-CAAGGGAAAAGGAATCTTTATGGTGAGAGAAACTGCAATGTGCCAAGCACATTAATACAC
-AATTTCTTAAACAAAAGCATTGTATGATAATtatgacaacatgattaaagctgaggaacc
-tggagtaaaatgtatctagggttacatctaggtttgttccttactacttttactcatcat
-gtggtctctatatcaatttcttcatttgcaagacaggtataatcatgcatctacctctta
-gaatcactctaaaaattaaaatagataaggcatataggtcaccgtgatctctagcaccaa
-tgaaattctaagaaatgtagatttTAAAAGGCATATGAGATATAGGTTATTCTGGTTTAA
-AATATGAAACGTTTAAAAAATAAAATATGTAAGTCCTGAGTTTCCGGGAGAAAAAGGGTC
-TTGCACAAGAACAACCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCCGCATCTCTA
-CCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCC
-GCATCTCTACCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTT
-CTCAAGGCCGCATCTCTACCCCATCTCATGCGAATCCTGACGACGTCCTCAAAGCTGAAT
-AAATTTTTGCCTTAAATAAATTAAACGAGATTTAGATTTCACCAGTCACTGATACTCAAT
-CCCAATTGGATATTCATTCAAAAGTCTGACTTCTCTCCTGAGGTGAGAGTAAGATTCCTG
-GGCACTTTTTCATAATACTTACCTTAACCTAGCTAAACACAATGGACACTCTTCTTTGAG
-gtgtcagtggaaattaagaggagagtctgaactcttacctcccacatggggcttgcagac
-aggtgaagatggcgctcctcccctttgttggtaatggagacctagaagaaaggctgggca
-tccagctcccacgcagtcatatgaagcagcccagagcaacattccccttcactgcctgtg
-cggtggcagtagagacctagcAGTAGAGACCTAGCTGGGAGTCAGATCTCCCATCCCTCA
-ACCAGTGGTAGTGATTGGCCTGGGgaggaatcccttccctgctggtgccatgtcagtgaa
-aactgaggggagactgaaattgcccttccttccaatagtataaaaggcctgaagcagact
-tcccttcccagccagtacattaccattgaagaccaaggggtggtctcaacttcaatccct
-aGGGAGCCGTGGCTGGCATCAACCCTCCTTCCAGTCAGTGAGGATAGAGGATAGGAGGGT
-GCTGGAAAATAGGTGTCTTTAAAACTGAATAATGTTGTTTTTACCACAATTTTAAAAACT
-GAATAAGAAGACATGGCAGACCCCTGAAACTGGATAACTACACACGGAACTAACCAGAAT
-TAACATGCAGAAGGTTTGAGAATAGAACTGCAGTGGGGAATACCACCTAGATTTTTAaaa
-taacaacttgtatatatttaaggatatatgcaatatgatgttttgatatacatagacata
-gtaaaatgattgctataatcaaattaacatatccttctcttcacatagttatcatttttt
-gaggagacagcacctgaaatccatcttcttagcaaatttctagtatacaacaccatatta
-ttaactagagtccccatactgccctttagctctctagactttatcctacacaacttcaac
-tttgtacccttcgacgagcatccccccatttcctccaccacccgccccacccctgataat
-cactggtctacactcttctatgtatttgaatttttaaattccatgtataagtgagatcat
-gctgtactttttttctgtgtctgtcttatttcacttagcataatgtcctctgggttcatc
-catgttgttctgaatggcaagctctcctttgtcaaggctgaataatatgccattgtatat
-atatacaatttatttagtgtgttcatctatcgatgtcgatagatgataatgtcttcatct
-atcagcttaggttgatttcatatcttggctattgtgaataatgctgagcacagatatctc
-tacatggtgccgatttcatttctttttggtatataccaagacgagggattgatggctcat
-atactagttctgtttttatttttttgagaagcctccatactgttttacatcattgttgta
-ctaatttacatttccaccaacagtgcgcaaaagttccctttacattctcaccaatacttg
-tgatctcttgtctttgtgataatagtcatcctaacaagtgtgaagtgatttctcattgtg
-cttttgatttgcatttccctgatgattagtgatgttgagcacctttccatacacttgtta
-gccacttttatttcttctccagaaatatttctgttcatgtctttgcccaattttcaagtg
-ggctctttgttttttgctactgagttgtgtatgtttcttatatgttttttatattaacct
-tatgtgatatatggtgggcaagtattttcctcccatcccataaactgccttctcactctg
-ttgactgtttcctttgctgtgcaAcaaatgatcttcaatgataatacaaagaatatgcaa
-tacagaaatgatagtcacttcaacagatggtgttgggaaaactggatttccacaggcaga
-acaaatgaaatggatccttatcttacaccacacacacacacacaaactcaaaatggattt
-aaagacttaaatgtgagcctggcaaacttaaaactcctaaaataaaacagaagggaatat
-ctttatgactttggtctaggcaacagttgcttgaatatgacatcaaaaccacaagcaaca
-aaagcaaaaatatattagtgggactatggatacatttgaaacaaactacaaactagtaaa
-atctcagcaaagaaatagaagatataggccaggcacggtggctcacgcctgtaatcccag
-cattttgggaggccgaagagggcggatcacgaggtcaggagatcgagaccatcctggcta
-acatgataaaaccccgtctctactaaaaaaaaaaatacaaaaaattagtggggcatggtg
-acaggcacctgtagtcccagctgcttgggaggttgaggcaggaggatggcgtgaacctgg
-caggcggaggttacagtgagccaagatcatgccactgcactccagcctgggtgacagagc
-gagactccatctcaaaaaaagaaaaacagaaaaaagaaaaagaaatagaagatatgaaaa
-taatcaaatggaaattataaatttatgaaatgtaatcaaagtaaaaaagaaaaagtcact
-gtataggctcaatagtagatggaacatgacagaggaaaaaataagacagatctatagaat
-tacccaatctaaaaacagagaaaaatagactgataaaaatgaacagagccacagatacct
-gtgggacataaaaagatctaatgttcatgtcatcagagtcctcaaggagagggagagtgt
-ggaactgaaaaaaatatttgaaggaataatgcctgaaaaatatcccaagtgtggcagaat
-acatacatctgtaattcaagatcttgaattaacccaaaacaagataaacccaaagaaatc
-catgccaagataaagtataatcaaactaaaactaatagctagagacagaaaaaaatcaag
-cgagcattcagaaacaatacaccacccatggtaaaacaatggtttgattgatgggatttg
-tcatctgaaaccatggaagcaaaaaagaaatgtcatcacatgtttcaaatgccaaaataa
-agaactatcaaatccaaatcctatatctagcaaaaaaaaaaaaaaaaaagttctctagga
-ataaacagggaaagaaaaacattctcaaacaagaaactattaagggaatttgtcactagc
-agccctatcctaaaaatatagtcaaagaaagttctctaaaccaaaatgataaccgggggc
-ttggaacttcagaaaggaagaagtcgaagtcaatagaatgggtaaaatgggaggtgaata
-taatagactatgcttttttttttgctttattttttttttatgctttcttttcttgagata
-gtgtctggctctgtcgcccggacaggagtgcagtggtacaatctcagctcactgcagcct
-cgacctcctgggatcaaaggatcttccctcctgagcccagtgagtagctgggaccacagg
-agccggctaatttttatatttttttgtagagacagggtttcactgtgttgcccaggctgg
-tctcgaactcttagactcaagcaatctgctgcctcggcctcccaaagtgagactatcttt
-ttattaaagagttttgaaatcatgtttggtagattgaagcaaaaattgtaacattgtctg
-atgtggttctaaatagatgtagaggaagtacttaaacattataagctgggtaaggcaaag
-aaatttaaagtgaggtaagtttttatacttcattcaaacttgtaaaactttgacaccgta
-gactgtgataagttaggtacagcaaccactaaaaaaaataaataaatacaataagaaatt
-atagctaaattatagtggaattctaaGgaacaaatagaaaacaaaatataaaatggtaac
-ttaatccctaacatgtatcaaaaagataccccatacaaatattaatcataagaaagtagg
-aatggctatattaacatcagttaaagcagacttcagagcaaaacaaattatcaaggacag
-agagggaaattatataatgccaaaagggtcaatcaaccaagaagacatggcagccctgat
-cgtccacaaactgaaaaccagagtttcaaaatacctgaagcaaaaactgataaaactaag
-aggagaaataaatttacaatatcaggccaggcgtggtgactcatccctgtaattccagca
-ctttgggaggctgaggcaggcaaatcacttgagcttgggagtttgagatcacctgaggca
-acatagtgagacccccctctctataaaagatacaaaaactaaggtgtggtggcccacgcc
-tgttgtcccagctactcaggaggctgacatggaaggcttgagcccaggacatcgaggctg
-ccgtgagctgtgcactccagcctgggtgacagagcgagaccccgtctcaaaaaaaaaaaa
-aaaaaaaaaattacaatatcaacttcaacagttgatagataggacaactagacataaaat
-ccacaagggtgtagaagaatttaaaaataccacaaagcaacaggatctaatagacattta
-taaaacatttcatccaacaacaatggaatacactccttggtgtttatgccaaggaaatga
-aagtgtttttctccacaactcccgggcaggaatatcaatggtagtgttatttataatagc
-ccaaaagagtaaacaaccaaaacgtcattcaacaggtgaatgactaacatagggtggtac
-atccatacaatggaatacttctcagcagtaaaaaaaaaaaaaaaaatgaattattgatac
-atgcaacagcttatatagattataagagcattatgctgagtgatgaaaaaagacaaaggg
-tcacatagtgtgtgactatattcacataacattgtctaaaaattatgaaatgtagaacaa
-attagtgctttccaggggttatgaatagtcaggagagggagggaaatatgccagtaagac
-aataagagagggagatcttttcataatgaataattctgtattttgatttgttgatggtta
-aatgaatctaAGAAGGATCTGATAATCTAGTATTAGACGCATAGTACAGTAGTGAACTTT
-CAGCCTCTAGAGAagtgctctccaatagaagtaactaaaaagatggaaatgttctaaatc
-tgtactatacaatatgttagccactggtcatgtggttgtaaagcacttgatatgtgCTCT
-ATAATattttgagcaagtttcttatgttttctgtgcctttgagtttctcatttgtagaat
-ggagataataatatctacctcaaagtgttgctgtaaaggtaaatgagtttatgtatgtaa
-gacaccgacaggagtgccagcacatagaaagtgttatacaagggttagccattTGTTATT
-GTCATTGTTGTGTTTTGTTCTCTTTCTAATGTCTGGACCTTCAAAtgattcagactcatg
-ggaccatacttcattctgtttttataactttaacctgtaagattctcattttaattggaa
-tttcatatttaggaattcttgggtgccttggatatatgaagaaaagattcacatctgctt
-ccactaaacaactagcgaattaacaactgagatttcttataattaaattatttacttgat
-ttttttaatccatataaatagcttgaacttaggttgaaacccatgagaatttgtggctac
-agttcatagggttaatatttaccttctccatccagagccaaggttaaTGCTGACAAAATA
-CAATCTAATACAGATTAATCTGTGTGTGTGTGTATGTATACACTCGTGTCAGAGAGAGAG
-ATTTCATTCTTCCTTAGGCTGAGATTGTTGCCTTTGAATCTCAGGTTTATATAAGGGTAT
-CAATTATATGTCTTCCCTAGGACTAGATCTTAGCTTTATACATCTCACATAGCCATCAAA
-ATAATGTTCAACTTATCTTTCAGGGTTTGCAATCTTAGTTTTTGGCCTGTGCAGATTCCT
-TTCATTTTTGACGGTTTCTCAATGCAGTAATTTCCTTTTTACATTTACCCAACTTTTTTG
-GTTATTTTCACCAGATACATTGTTCAATATATCTATTCTACTATATTCTATTAATAACAG
-TCTACTATATATGTGTCTTATTGTCTAatattgctgaaatctttttttaatccaataatg
-aatctctgtcatctaatcagtgagtttaagccatgtgaatgtattataactactgatcta
-ttaggacttttttctgccCTCCAGTTGTGACTTATCTATTCCTCATTTTTTTTAGTTTCT
-GTTGGATGGATCATATGTTCTTCTGCTAATATGaatattataattttatttttatttgtt
-ttattaaaaatttGTCCTTGCTCTTAGGACCCATTCCTATCCTTATATTTATTATTACTA
-ATTTAACATCCAGCTTCAGAAATACAACTTTAATAGGAAGGCTTTTTGTATTTCTCCTGA
-CTGCTCAGACTTAGGGTCTTTATTTGATGCTCCACCACCAAGTCACCTATAAGGAAAGTT
-TGCATTCACAGGAAGACTATAAATAATAAAACCAATCCCTTGACTAGGACTTAAACCATG
-TAAAAGCTGGTGGCAAAAGTAAAGGGAGGTGACCCTTGAGACCTCTGAGGTAACTGCTCT
-TAAATTTACATTTGCCTCTAAAAAGGATTTCTTATATGTCAACATCTCTCTGTTTAAACA
-TATTCTTGTGTAAAACCACTACGTGACCTGAATAATGGCCATAGGGCTCATCTCTAAGCC
-AACTGGCTTATTTATTTAATGCATCTCAGTGGTTAACAGGGTTGAAATTTTTTGAAAACT
-GCAATCAATGATCAAAGAATGATCTAGGTAAACATCGATTCCTTGTGGCAACATTTTAAT
-ATTTTCAAAGACAAGGTACAACTGGTAGAAAAAAAATACCCTCATGCATCTTTttcttct
-aattgtggtaaaatatatgacataacattggccattttagccatttttCCttttattttt
-agttgacacataattgtacttatttataggatacaaagtgatatttcaatacatgcatat
-aatgtgtaatgatcaaaccagggtaattagcatatccgtcacctcaaacatttatcattt
-gtattgggaacattcaaaatcctctcttctagccttttaaaagtatacaataaattgtag
-ttaaccatattcaccttacagtgctacaacaccagaagtcattcctcctatctataattt
-tgcatccattagccaatctctctccatcctcccctctccctaatcattaccagcctctaa
-tattaatatctgcaacactactctctacttccatgtgctcaacttttttagctcccatat
-ataaataggaacatgtggtaatctttctgtgcctgacatttcacataacataatgtcctc
-caggctatccatgttgttgcaaaggacagaatttcattatttttatgggtgaatagtatt
-ccattgtgtGTGTGTGTGTATATATATATATATATATTCCATTGTGTGTTATGTATGTAT
-AGTATTCCATTGTGTGCatatatatgtatatatgtgtgtacatatatatatacataatat
-atattcttctgcacatggaaatccagtttctccagcatgatttattgaagagggtatcct
-ttccccagtgtatgttcttggtgcttttataaaaaatcaggtgacCTCAGATCAGACCCA
-ACTACATCATACCTTCTTTCGAAATGTGCAAGAAACCTACTAGAAATTCTTATTGTTAGA
-GTTTCAGATTTATGTCCTGGTTTATACTGCCACATTCATTCTTGGAGGTGAGTACATTTC
-GATCTTGGTCCGGCTGCGCAGAGAGTCAAAGCAGGAAAATCACAGATTCTTCCCAGCAGT
-CTACAGCCTACACAGCGGCATTTGGTGCGATGGGATGGAACATGCTGTATCTCTATTCCA
-TGTGGGGGTAAAGTGGGTGGCCTGAAATTTCCTGTGTCTGCCTGCATGATGCAAAGCTCA
-CAGTTCAGAAGCTTAAGGACACACTTCATATCATCCCATCTGTTCTGGTTCAGTGCATAA
-GAATCTAAGTCTCTGAGGAAGGTAGCATAGTGTGCAGTTCACTGGACCAAAAGCTTTGGC
-TGCACCTCTTCTGGAAAGCCTGGCCATGGGGCTCTTCATGATCATTGCAATTCTGCTGTT
-CCAGAAACCCACAGGTAAACCAAACCAGAAGCTCACTCAAATCAACAGTGGGATGGAGCA
-TTTTCAGGAGCCAAAGGGAACTTCATAATCCACACTAAAGGGAAATAGAGCCCCCAAAGA
-TGGCTAAAGTTTATCCAACATCATCAGAAATTTCCTCTTTCTGGAGCCTTATTCCATGTT
-ACTATCCTTAAAGAGGAGTACTCACTGAGCTAAAAAGAGGTCATAATTTCTTCTGGGAAA
-GATGTGTTGTTATAGAAAGGAATGATGCCAATATCTAGGGATACCTTTATGTCTTTGGAT
-ATGGTTTTTACTCTGATGCTCAGCTATATTTCCTTTTACTCAAATATATATAtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgCATGAatagaggaagaagcaaattttggagttaggt
-ttaagaaacatgccttcaatatctactagtttgtcaactttaagtagtgaagactctagg
-agcctcagtttcctcatctatggagataatgacacctggttaacaggggttttattaaat
-gatataacctatgtgaagcttggcacatactgagaactcaaaaatTAGAGTTTCCTTTCC
-TCTTTCAAAACCAGATTTCTTACATGTGTCCCTTATTATAAGAATAGTAATGGCCTATTC
-CTGACCCTCTACATTCCTAAGACCCAATAGACTACTACCTTACTGGATAACATGAAAGTC
-ATTCTTGACCCTGATAGTGGGTTTGAACTCAGGAGAACAGTTTGATTCAGACATAAACAC
-ATAGTAACAATACATTGTTCTCTGGGCATCAGAGGAGGTGCAGTAGAAGGTAGTGCTCTG
-GGAGCATTCAGGATGCAGGCAGATTTGCTGAGGTTCCTATGTAGAGCATAGTTCCATAGC
-CTAGAATCAAGGGTTCAGCTCCTTTATTTTCTCAGATAAGATCTTATGTTCTTGGCAGAG
-TCTATCAGATGTTAAGGGAGGCCTAAAACCTCACAGGACCTAAATATAAGTGATCCAGTT
-AAATACAAACACTGAGGTTGACCTTGTCGGAAAATCCTCTTCAGAATATATGAGGGTCTG
-CCTTGTGGATACCCCATACCCCTAATTCCTACAAGCCTCCTCTGTCTTCCCCAAAACCAA
-CGTGCCTTCAGTCTCAAACACTGATATTGTTCTATTGCTCCTTTCTGTGTATAGTAACCG
-AACAACTTAAGAAGTGCTGGAATAACTATGTACAAGGACATTGCAGGAAAATCTGCAGAG
-TAAATGAAGTGCCTGAGGCACTATGTGAAAATGGGAGATACTGTTGCCTCAATATCAAGG
-AACTGGAAGCATGTAAAAAAATTACAAAGCCACCTCGTCCAAAGCCAGCAACACTTGCAC
-TGACTCTTCAAGACTATGTTACAATAATAGAAAATTTCCCAAGCCTGAAGACACAGTCTA
-CATAAATCAAATACAATTTCGTTTTCACTTGCTTCTCAACCTAGTCTAATAAACTAAGGT
-GATGAGATATACATCTTCTTCCTTTTGGTTTCTTGATCCTTAAAATGACCTTCGAGCATA
-TTCTAATAAAGTGCATTGCCAGTTTTCTGTCTCATTTTGTTCTTTAACCAGGGGTTGAAC
-ACTCATTATATACTAGGTAATGAATTGATAAGAACTCAGAACCTCTCCTTGAAAAGGGGA
-TATGACAAGTACACTAAAAAAAAAAAGTCCTATAGTGTGGAAGTCTGGAATAAGAAACTC
-AGAAACACTGACATGTAATTTAGGAGAGGGAAAGGTGAAGCAAATATTCAGGGGAAATTC
-ATGAGTAAGTTTAGGAATAAAGCAGTGTCTTGTAGTAAATAAGTAAATAGTAAAGCAGTA
-AATAAGTAGGATTTCCATGGATGAGGTTTGGTAGGGAAGGCAATTTGAGTGAACAGAATG
-GGAGGAAATTGGAAAAGACAGAACATTTCAAGACACTATACATGCACTTTGTTTGGATGA
-AGAACAGAGCACTCAAAGTTGAACTATGGGGGAAGTCTGATTTCCTAAGCTCCTGTGTAC
-CAGCAGTGAACTGGGAAGACGGAGATAAATAAGATTCCACTGTTGTGGAGCTCAACAGTG
-GAGCTCAACGCTTCCTCTATGAAGTGGAGAAGACCTAAGTAAATAACTCCAACACAAAAG
-TTTTTAGGTTTTTGCTttgttgttgttgttgttgttgatgtGTTCATCTTTTTTGTTATT
-GGGGCCCTGTGGAGTTTAGGGGAAATGTAAAAGATCTAGGAATTGGTCCAAATTGTAGTG
-CTTTCATTGTCTTGATATGCAAGAAGAATAATCCATGTACATACTCTGCTGAATTCTTAA
-AGATGTACCTTCTGAATATGATTAACATGGAAAGTTTCTTCTTCAACTACATTTCAAAGT
-CATTTGCTAGTTTTGTTTCTTATATCATTTCACCATAACAATTACAAGCATTTTAAAGAT
-TTAGTTCATCCACTATAACATTTACCACTAATGTGTGGCATGTGTTCTCTTAATCTCTCT
-CTTTCTGGTGttctagggctggtatagggagcacctaaaacaagcctaaaatatcttgtg
-gtgccagaaagtaagcaattgcttaataatcaaaggatagggtctgcaaacacggacaat
-ttgacttcctcttttcctaattgaataccctttatttccttctcctgcctgattgccctg
-gcgagaacttccaacactatgttgaataggagtggtgagagagggcatccctgtcttgtg
-ccagttttcaaagggaatgcttccagtttttgcccattcagtatgatactggctgtgggt
-ttgtcatagatagctcttattattttgaaatacgtcccatcaatacctaatttattgaga
-gtttttagcatgaagggttgttgaattttgtcaaaggctttttctgcatctattgagata
-atcatgtggtttttgtctttggctctgtttatatgctgcattacatttattgatttgcgt
-atattgaaccagccttgcatcccagggatgaagcccacttgatcatggtggataagcttt
-ttgatgtgctgctggattcggtttgccagtattttattgaggatttttgcatcaatgttc
-atcaaggatattggtctaaaattctctttttcggttgtgtctctgcccggctttggtatc
-agaatgatgctggcctcataaaatgagttagggaggattccctctttttctattgattgg
-aatagtttcagaaggaatggtaccagttcctccttgtacctctggtagaattcggctgtg
-aatccatctagtcctggactctttttggttggtaagctattgattattgccacaatttca
-gatcctgttattggtctattcagagatgcaacttcttcctagtttagtcttgggagagtg
-tatgtgtcgaggaatttatccatttcttctagattttctagtttatttgtgtagaggtgt
-ttgtagtattctctgatggtagtttgtatttctgtgggatcggtggtgatatccccttta
-ttgtatatgtagaaaaccccattgtctcagcccaaaatctccttaagctgataagcaact
-ttagcaaagtctcaggatacaaaatcaatttaccaaaatcataagcattcttatacacca
-acaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaaaga
-gaataaaatacctaggaatccaacttgcaagggatgtgaaggacctcttcaaggagaact
-acaaaccactgctcaaggaagtaaaagaggatacaaacaaatggaagaacattccatgct
-catgggtaggaagaatcaatatcgtgaaaatcgccatactgcccaaggtaatttacagat
-tcaatgccatccccatcaagctaccaatgcctttcttcacagaattggaaaaaaactact
-ttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaaag
-aacaaagctggaggcatcacactacctgacttcaaactctactacaaggctacagtaacc
-aaaacagcatggtactagtaccaaaacagagatgtagatcaatggaacagaacagagccc
-tcagaaataacgccgcatatctacaactatctgatctttgacaaacctgagaaaaacaag
-caatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgta
-gaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatta
-aagacttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacca
-ttcaggacataggcatgggcaaggacttcatgtctaaaacaccaaaagcaatggcaacaa
-aagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaaa
-ctaccatcagagtgaacaggcaacctacaaaatgcgagaaaattttcgcaacctactcat
-ctgacaaagggttaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaaa
-caaacaaccccatcaaaaagtgggtgaaggacatgaacagacacttctcaaaagaagaca
-tttatgcaaccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatgc
-aaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaagt
-caggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttggt
-gggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatctag
-aactagaaataccatttgacccagccatcccattactgggtatatacccaaatgactata
-aatcatgctgctataaagacacatgcacacgtatgtttattgcggcattattcacaatag
-caaagacttggaactaacccaaatgtccaacaataatagactggattaagaaaatgtggc
-acatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgtag
-ggacatggatgaaataggaaatcatcattctcagtaaactatcgcaagaacaaaaaacca
-aacaccgcatatcctcactcataggtgggaattgaacgagatcacatggacacaggaagg
-ggaatatcacactctggggactgttgtggggtggggggaggggggagggatagcactggg
-agatatacctaaggctagatgacgagttagtgggtgcagcacaccaacatggcacatgta
-tacatatgtaactcacctgcacaatgtgcacatgtaccctaaaacttaaagtatttaaaa
-aaaaaaaaaaggatagggtcatattaaaagaacacaggagtcggtctaaaagagcttcaa
-atgaccaaagctgcgacaatttgagcaataaaataaataagatagcattggattataata
-caacatataataaatatctatgagtccatgatgatatgaataaataattgaataaattgg
-aaaattggtgagaacagatgtgccatatagaataattcccaataattcatacagatactc
-cctgctgaagaaggtggagcttgacctccctctcccttgagcatgggctgtatttagcta
-cttgtttccaaagagaagtgtgtggaaaggagttaaaaaataatttcacctggataaacc
-tgataaggtcatgtttcagattttatggagaaatcatattgataacatgaacctgtgata
-tgatctgatgagaatggcacttcacttctgttttcttcctcccaaaaccctgcgacccaa
-gacaaacaatgaaaaacatcagaaaaactcaaattcagtggcattctaaacaatatttga
-ccagtatttctaaaaactgtcaaatttatcaaaaaggaagaaattctgagccacagtcaa
-agaccagagaagcctaaagagacaggacaactaaaggtaatgtggtatcctggatggact
-cttggaacaggaaaagaacattaaggaaaaactagtggtgataatagtaataataataag
-tgtagagtcatttagtagcaatgtatttagctgtgatggctgcattgtggtaatataaga
-tgttaacaatagcagaaactgggtgaatatttgggagctctctgtattatctttgcaaca
-tttctataaatctaaaactattctaaaactgaaaatgtatttAAATTTTAGAAAACTGAC
-CACAAAATCAATTTGGCACATTCCTTTTCTTCTTATTTACGAAAGAGCTTCTCatttctt
-cattgaatgcttggtagaatctaatggtaaattcaactggaacggaactctttacaggaa
-gtattgttatagattaagtttattgcaggttaaaaggcaattcagttttctatgccttct
-agtcaactgttgtatttggcatatatacttttcccatgttctaagatttttatacttgct
-atcctaaaactcttgtaatatcttctttttatcttattaatgcctgtaagatatgtaatg
-acaccttctttttcatttttgacatctattatttgttttattttctcttttttcttgata
-agtctcacattcacttattaatttgatttatctttacagaaaacaaattttcttcattaa
-ttttAGTTTAGTTTCCATTTCTTAGACtgtgacttgcattgcccaattgaaagtgattga
-aagtgacaggttcacttccaagtggaaacttaagagccagtgtgtccatgtgcagtggct
-cacacctgtaatctcagcactttgggatgctgaggcgggcagatcacctgaggtcaggag
-tttgagaccagcctggccatggtggtgaagccctgtctctactaaaaacacaaaaattag
-ccaggcatggtggcagggcctgtaatcccagctatttgggaggctaaggaaggagaatca
-cttgagcccagaaggcggaggttgcaatgagctgagatcatgcctctgcactctagccta
-ggtgacagagccagactctttctcaaaagaaaaaaaaaaagagccagtgtgcagtttaac
-cgtctctcatctctctgccaaggtgattgtggaagcactgttgacatagagcctctgtca
-gcctgaagccccgagtgaccatgaaagcagggtcattcttttgacctaaaatagacatct
-agcactgccagaaataaccttttgggaagttactctatgagagctgaggtttgtttttta
-ttTTGttttatatatattttttaaatCAGGAATAACTTAGACCAGGGTGAACAAACTACT
-GCTGTCAGGGCAAATCCAGCCCATAGCCTGCTTTTGGAAATAAATTTGTATTAGAacaca
-cacacacacacacacacacacacacacacacacacatacacacatacacacaAATATATC
-TTCACTAATGTTCTTTTTTTCTTGTTTTTCAAAAACTtttacataccataaaattcacct
-gttttaagtgcacaatttagtgTCATTTCTATTTTTTATTTTCGgtatgcttttcttttt
-gtaactttgttaggtgcatgtttatctttataaaagaaaagccttccttcttttcaaata
-tgagagtttaaagttgtaagtttctctctatacacagcctgagcaccatcccacaaattt
-tcaatatagagtatgttcattgttacattataaaccttctcatttctcttAAACCATGAG
-CATATAAATAACATATAGATTATATAAAGACTATGGATACAAATGTTAATCATGCAATTT
-TGTCAACTAGTTATAATTACATATACAGTAACATTACTTTGGTGATATGTAAACCAAAAT
-GTAAACAAAACTTGAAAGCAAACAGAAAATATCATATGCAAAAACTTGTACACACTTGTT
-CTTCATACAGTTTGTTTTCAAATATGATCTTCTATCTTGTTATAGGTTTTCTATGGCTTT
-AAACTGACATTTATTTTTCATTTATATTGTCCTCTGTTATGATTCTTCCAGTCCTGAACT
-TCCTGCATCAGTAATTTTTAAAGATATTTTTGGTTTACAGAAGTTTACCAATTATTACCA
-TAATTTATCATCAATTTATTAACTCTCACCATCATTTCAAAAGTGAAAGAAATTTCACTA
-CCTAAAAATATGTATGTATGACATTTTAGAAGAAAACAGACTTTTAACTAAATGCATTCA
-TGTCTCTTAAAATTTAGTTCTATCATTTTAATTTTTTTCATTTTATTACAGACCAGTTTA
-AACTTTGTCAGAACCCCATTAGGGCCCATGTATCCATTTAACAACAAAATTCTGTAATTC
-TTAAATTCTCAAATTCATAATTTATATAACCACTGATACCCAATTGGTAGTAGTCTTCTG
-AGGAATGTTTCTATTCCATTATTCCTTGTCTTCTCTAATCACTCTCTGAATCTAAACTTC
-TCTTTAGTTTTTTTTCCCTATAATTAGATGTTGAGGTGTTTGGCTTACTTATCTTCTTTA
-TTAGAATAAATAATATGTATCCCATCCCTAATGATTAGCACTTTGTCAATTTTTATATGT
-TTATGACAGGTGGACTCACTCTTATTCTAAACTCTGATATTAGTGATATCCAATGCCCCA
-TTCAGAGACCATTAAATTAAAAATGCACTTATTACTTCTGGGACTTTCTAGACAATTTCC
-TTCATCTTTAAAAGATCTGGGACAAACACCACAAGCTTTGTCCCACATGAAAGTTCTCTG
-CCCAAGTAATGAAGCATCTAAAAATGCTAGTAaagatattagattttaatataacacatc
-aataattatatttaatataaatgatctaaatcaggggtccccaccccccaggccatggac
-cggtataggtttgtggcctgttaggaactgggccacagagcaggaggtgagcagcagtgg
-gagtgagcattaccacctgagctctgcctcctgtcagatcagctgtggcattagattctc
-ataggagtttgaaccttattgtgaactgcacatgcaaaggatctttgcgtgctccttatg
-agaatctaatgcctgatgatccaaagtggaacagtttcatcctgaaaccatcttcccatc
-cctgccagtttatggaaaaattgactgcattaaaccggtccctggtgccaaaaaggctgg
-ggaccactgatctaaatacaccaataaaaagaaaaagattgtaagattggattttaaaag
-acctgactctatactgaccacaaaaaaAAACCCTCACTTTATTCTTTattgcatatattt
-atggtgtacaacatgatgttttgatacatgttgtgaaatggttaatatagtcaggcaaat
-caacacgttcatcatctcacatagtttccctttgtgtgtgtgtcgcaagagcacactact
-tttttaacaaaaattccaagtaaaatataatattatcatagacctcacgttgtacattag
-acctctagacttttttaatcttacgtatctgcaattttttatcctttgacctacatctct
-ccatttccttcccctccaaccacacccctggtaacgaccacattattctctatctccttg
-tattcagctttccttttttttcttttaagattccatgtataagtgaaatagtgcagtatt
-tttctttctgtgtcagtttatttcatttagcataatgttcttcatgttcattcatgcctt
-ggcaaatggcaggatctcctttttgaagagtaaataatattccattgtgtgtgtgtgtca
-cagtttatccattcatctatcaacagttcacttgtttcaaaattttgactattgtgaata
-atgctgcaataaatatgaaagtacagatacctctatgaagttaagtggtgatttcatttc
-atttttttttttaaagacagggtgtcacagtgttactctgtagcccaggctggaatgcag
-tggtgcaatcatagctcactgtaaatctcaaactcctaggctcaaggaatcctgcctcag
-tctcctgagtagctgggactacagacacacaccatgcttagtcaatgttttttaggtaca
-gggtcttgctgtgtagcccaggctgggctcaaagtcctgacctcaagcaatcctcctgct
-ttgacttcccaaattaccgggattacaagcatgaaccacctcactcagcctggtagttct
-atttctaattcctttagaagccttcatactgactccacaatggctacatctgtctacatt
-cccaccaagaatgtacaaaggttcccttttctccacaccctcattaacaattgttatatc
-ttgtctttttggtaatagttatactaacaggcatgaggtgatgtctcattgtggttttga
-tttacatttccctaatgattagtgattttgagccccttttcacatacttcttggccattg
-ttatgtcttctttggagaaatgtcttttcaagtctttgtccatttttttaattgggtttg
-gtttttttttactgctactgagctgtatgagttctttatatattttatatattaatccct
-tatcagatatatttaatataaaGACAAAGAAAAGCTATAAGACTTTATATCTTAAaaagc
-tggagtggctatattaatattgaacaaaatagatttcaaaacaagaaatactaccaggga
-tcaagacgcacagaaagaagtcaattcaccatgaaaatataacaatactaaatgtgcatg
-caactaacaatagaacttcaaaataaaagcttgtagaactaaaaaagagaaatagagaaa
-tcttcacctacaactggagatttTTAgactgacattagcaagatggcagaataggaggtt
-ccaagcatccctcctctcaacagaaaattcaactggcagatatccatgacaagagcactt
-tggtaaaaatcccaaaacttggaaataagccaaagacacccatgttgaccacagaactga
-ataaaaaccacattagaagggggaagagaaaaggtctcactttgaccaggccacccctcc
-tccactccctcgcccaagttggcacaccactatgcagacaggattgccctaggcctacag
-tttctccagtgggaaaagaaaactaaagatgaacattcagcttccttagccattcctgga
-atattctcagaaagcccatttcagtctcagttcacagggaaagcaggggataacggtgtg
-gttagatcacctgggttcagatagaaaaaaagaaaagggggcattgctcacagtgaccag
-tatgaagatactgttggtagctctgtgtcactgccagcagaggtaccagccaacagcata
-agccacctgcaaagccaagctggtcactcccagaagcacagtggaaatttccatctggct
-tgagtccctagatggccagcctccacagccagcctcaaatccctccccaaggccccacgc
-agaaatggagatacctgcaacaaagcatttcaaacaaaagaaacaactgagacttgtgcc
-ccagggcatttaaacagtggctcagactcaaagctcactcaaggagggagatgcccacca
-cagcacctttcagcaaagcccagaggctggactagccacacccagaagtataaatggtgg
-ctcacctcagcctcaaagcccaccccaagtctctgcctaggcaagggggcaagcctcaac
-catgcatttcaacaaagcatagcagctggtcccaactaccctgaacaaaacctatctaac
-ctcaggacccaaacagtggtagtgcccggccGGGGAAAATACCATGTCTGTTAAGGGTTC
-TTACCATGATTTTAAAAAAGAAAGaaaacctatacacagacattcccaacagctttattc
-ataattgccagaaattgaatacaatctgaatatccttcactgtgtggcttttaaaaaatc
-gcatttatagtacatccatagcatggaatattacttagcaataaaaagaaacaaagtatt
-catacaagttggagggatcttcaaggaacactaagagtaaaaatgccaatttaaaaagat
-tacatatctatgattccatttatatggcattcttgaaatgacaaaattatagagctagag
-aacagattcctgtttacccagggttagggaaggagggagaaggctctcactggaaaaggg
-tagcacaaggagtctatgtgataaactgttttgtgtcttgactgtaatggtggtcacaaa
-aatcaaagcatgtcataaaattgtgtaaaactaaatacatacctacatgcacacacacaa
-acaaatgactacatacatgtaaaactgatgacatctgattaagaccaatggagtatatca
-atgtcaatttcctgattatagttaaacaagatgtaaccattggagggaaaaggtatatgg
-gatttctctgcatgtaggtaagtctaaacatatctcaaaatTATTTTAAATGTCAACTTT
-TAGGAACAGCTGATATTTTCTCTGTATTTATCCTAAATCACTAAGGCTTTCACAAGATCT
-CTGCTCCAAAGACCACCATATTTCTTTTTAAATGACATATCTATTGTGAAATGCATTTAT
-GATAGTCAGTATTCTCATGCTGTGGAAATATACTTTAAAAAGAATATAGTCTTTATCCTA
-TACTGAAGCTCTTGTCCCATCCTGTCCTTTTCAAACACTCAGCAGTTCAATTGAGCTTTA
-CAACTTCCATGCACTTCACAAAAAGAAATAAAATAGTGGAGGCTACGCTGATCTCAGCTG
-GTTTTCATATATTTGGGGGTCAGAtggctatagactgatataagctagcctctgctggga
-caactgggttcttctccaaaatgtctctcttgtccttcctgcagactagactggtcttgt
-tcacctgactgaggcagggttccaatggagaaggcaaaggcacacaggccttttgaggca
-taggcttggaaatagcacaatttcatttgtgccatattctCTCTTTTTATGACTTTATTA
-TTTGAATTTGTATATTGCACAAGACTTCCTATTGTTCAGATTTCATTTGCTTTCTTTCTC
-TTGTATTTTAACATCCTTCACAATTCTCACATCATTATTAAAAGTTGCACTTAACCTAGT
-AATAGATAAGCATTAGCTGAAATTAGTAATTGCTTAACTTCTATCCTACACTACTTTATC
-ACATACTAGTGTGTCATGTTTCATAGTATAGGAACAAAGTAATCTTGCACGATGATATCT
-CTGATGCATACCACTATATTTTTGCTCATGGAATGACAGCAAAATTAATTTTTCTGCTGC
-CAAACTAATATTCAGCCAATCTTTTATTCATCAAATCTAACTACTTAGACCAGGGGCAGT
-TTCCTTTAGAGTTAGACTGTAATTTGTGTACTAATTTTTTTTTGGTTTTTTGTTTGTTTG
-CTTGTTTTGCTAAGGGAAAAATTTATTTTCCTGATGTAtttattattttttagcttttat
-tttagttttagttttaggaatacatgtgcaagtttgttatataggtaaattgcatgtcat
-gggtgtttggtgttcacattcttttgtcagccagataaCCATATTCTCTCTTTTAACGCC
-TATTTaaaattatatatttttaagctatacaatgtgatgttttgatatacatatgcatAT
-TTAAGCTATACAATGTCATGTTTTGTTGTACATATGCATATTTAAGCTATACAATGTCAT
-GTTTTGATGTACATATGCatatttaagctatacaatgtcatgttttgatgtacatatgca
-tcttgaaatgaatactatagtcaggctaattaacatatcagtctcttcacgtagttacca
-ttgtgtgtgtgacaagaatgcttaagatctactctgatagtaaatttcaactatataata
-cagtattatCTCTTTTTTAttttttacttttatttgtttatttttttgagacagagtctc
-tctgtgtctcccaggctggagtgcggtggcgccatctcggctcactgcaagctctggctc
-ccaggttcacgccattctcctgcctcagcctcctgagcagctgggactacaggtgcccac
-caccacgcctggctagtttttttgtatttttagtagagacggggtttcactgtgttagcc
-aggatggtctcgatctcctgacctcgtgatccgcccacctcggcctcccaaagtgctggg
-attacaggcgtgagccaccacgcccagcctttatttatttatttattttgagatagagtc
-tcgctctgtggcccaggctggagtgcagtggcagcatctcagctcactgaaatctctgcc
-tcccaggttcaagcaattctcctgcctcaacctcccaagtagctgggactacaggcaccc
-tccaccacacccagctaatttttttatttttcatagagacggggttttgccatgtcggcc
-aggctggtcttgaactcctgacctgaagtgatccacctgcctcggcctcccaaagtgctg
-ggattacaggcatgtgccaccatgcctggctGatttttgtatttttagtagagacggggt
-ttcaccatgttggacaggctggtctcgaactcctgacctcaagtgatctgcttgcctcag
-cctcccaaagtcctgggattacaggcgtgaaccactgcttccggccacagtattatcaac
-tgaggtccccatgctgtgcattagatctcaaaaacttaatcatcctacaatactggaacg
-tactctttgaccaacatcttttgattctgccaccattgcttctgataatcactattctct
-ctccttctatgaatttgacttttcaagattctacatgtaagtgatatcatgcagtatttt
-tcttcctgtgcctggcttattttacttagtataatgtcctccaggttcatgcacattgca
-caaacgacaggatttctttgttttaagactgaataatatttcatATtggatacaacctaa
-gtgttcaacagatgaatggataaacaaattgtggtatatacCACCTGTTCTCCCTTGTAA
-GTGGAAGCTAAAtgtcaggcctctgagccgaagctaagccatcacatcccttgtgacctg
-cacctatacgcctacatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggcc
-tgttcttgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgc
-cttaactgatgacattaccttgtgaaatcccttttcctggctcatcttggctcaaaaagc
-tcccccactgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttga
-ctgtaattttcctttacctacccaaatcttataaaacggccccacctctatctcccttca
-ctgactctgttttcggactcagcctgcctgcacccaggtgaaataaacagccttgttgct
-cacacaaagcctgtttggtggtctcttcacacggacgcgagtgaAATtttggtgccgtga
-ctcggatcaggggacctcccttgagagatcaatcccctgtcctcctgctctttgctccct
-gagaaagatccacctacgacctcaggtcctcagactgaccagcccaaggaacatgacacc
-aattttaaatcaggtaagcggcctttttgtactctcttcttcaatctcactatccctcaa
-cctctttctcctttcaatcttggcgccacacttcaatctctcccttctcttaatttcagt
-tcctttccttttctcctagggacaggagacgcattttatccgtgaacccaaaactccggc
-gtgggtcacggactcagcaaggcagacttcccttggtgtttaatcattgcgggaatgcct
-ctctgaatattcacccacatttcagaggtgtctgaccacatggggacgcctgccttggtc
-cttcacccttagcagcaagtaccgcttttctagggagcaaacaccccccaccccttctct
-ccatgtctctactctctcttttctctgggcttgcctccttcactatgggcagccttccac
-cctccattcctccttcttctcccttagcctgtgttttcaagaacttaaaacctcttcaac
-tcacacctgacctaaacctaaatgccttattttcttctacaatgccgcttgacctcagta
-caaactcgacagtggttccaaatagccagaaaacagcacttttggtttttccatcctaca
-agatctagataattcttttcataaaataggcaaacggtcggaggtgtttgacatccaggc
-attcttttacacattgttccctccctagtctctgttcccaatgtgtctcgtcccacatcc
-tccttctttccctcccacctgtcctctcagtcccaatcccaagcattgctgagtctttct
-aatcttcgttttctgcagacccctctgacctcttacctcctccccaggctgctcctcgcc
-aggccgagccaggtcccaattcttcctcagcctctgctcctccaccctataatcctttta
-tcacctcccctcctcacacctgctagccctaccccacttgcccagcaatttcctcttaaa
-aaggtggttggagctaaaggcatagtcatggttaatgctcctttttctctatccgaactc
-tcccaaaatcagttagcgtttaggttctttttcatcaaatatgaaaaacccagcccagtt
-catggctcattcggcagcaaccctgagatgctttacagccctagaccctaaaaggtcaaa
-aggccgtcttatcctcaatatacattttattgcccaatctgccccgacattaaataaaac
-tccaaaaagtaaattccagccctcaaaccccacaacaggacttaattaacctcgccttca
-aggtgtacaataatagagtagaggcagccaagtagcaatgtatttctgagttgcaattcc
-ttgcctccactgtgagacaatccccagccacatctccagcacacaagaactccaaacgcc
-tgaaccgcagctgccaggagttcctccagaacctcctcccccaaagtccgtccccttctt
-aatcaatacggaagctacccactccacattaccttcttttcaagggcttgtttcccttgc
-ctccataactgttgtaggtattgacggccaggcttctaaacctcttaaaaactccccaac
-tctggtgccaacttagacaacattcttttatgcactcttttttagttatgcccatctgcc
-gaattctcttattaggccaagatattttaagtaaattatctgcttccctgactgttcctg
-gactacagccacacctcattgctgcccttttccccagttcaaagcctccttcgcatcctc
-ctctcatatccccccaccttacccacaagtataagatacctctactccctccttggtgac
-tgatcatgcaccccttaccatcccattaaaacctaatcacccttaccccattcaatgcca
-atatcccatcccacagcacgctttaaaaagattaaagcctgttatcacttgcctgttaca
-gcatggccttttaaagcctataaactctccttacaattcccccattttacctgtcctaaa
-accggacaaggcttacaggttagttcaggatctgcaccttatccaccaaattattttgcc
-tatccaccccgtggtgccaaacccatatactctcctatcctcaatacctccctccacaac
-ccattattctgttctggatctcaaacatgctttctttactattcctttgcaccctacatc
-ccagcctctcttcgctttcacttggactgaccctgacacccattaggctcagcaaattac
-ctgggctgtactgccgcaagccttcacagacagcccccattacttcagtcaagcccaaat
-ttcatcctcatctgttacccatctcggcataattctcataaaaacacaggtgctctccct
-gctgatcgtgtccgactaatctcccaaaccccaatcccttctacaaaacaacaactccct
-tccttctaggcatggttagtgcagtcagaattcttacacaagagccaggaacatgccctg
-tagcctttctgtccaaacaacttgaccttactcttttagcctggctctcatgtctgcgtg
-cagcggctgccgccgccctaatacttttagaggccctcaaaatcacaaactatgctcaac
-tcactctctacagttctcataacttccaaaatctattttcttcctcatacctgacacata
-tactttctgctccccagctccttcagctgtactcactcttttttgagtctcccacaatta
-cccttgttcctggctcagacttcaatccggcctcccacgttattctggataccacacctg
-accctcatgactgtatctctctgatccacctgacgtacaccgcatttcccccattatttc
-cctcttccctgttcctcaccctgatcacatttagtttattgatggcagttccactaggcc
-taatcgctacacaccagcaaaggcaggctatgctatAGtacaagccaccagcccacctct
-tagaacctctcatttcctttccatcatggaaatctgtcctcaaggaaataacttctcagt
-gttccatctgctattctactactcctcagggattattcaggccccctcccttccctacac
-atcaagctcagggattttcccctgcccaggactggcaactcttaactccctcttagagtg
-gatagatgctctttgctggcaggggaccctccaatcttttcaccctgatgaagttctatt
-ctttacttttatactcactcttattctcattcccattcttatgccaccctctacctctcc
-ccagctatctccaccacactatcaaccttacccattctctcctagccgtttctaatccct
-ccttagtgaacaaccgctggctttgcatttccctttcttccagcacctacacagttgtcc
-ccaccttacatgcagactaggcaacatctcctatctccttacacctccaaacttccttta
-acagccctcacctttaccctcctgaagaactcatttactttctagacaggtccagcaaca
-cctcctgagacatctcacatcagcaagctgccgccctcctccgcacttaattaaaaaacc
-tttctccttatatcaactctactcccccaatatttggacctctcacaacacaaactacta
-ttcctgtggccgctcctttatgtatctctcggcaaagacccactggaattcccctaggta
-acctttcaccttctcgatgttcctttattcttcatctccaaagcccaactacacacatca
-ctgaaacaataggagccttccagctacatattacagacaagccctctatcaatactggca
-aacttaaaaacattagctgtaattattgcttaggaagacacttaccctgtatttcactcc
-atctttggctgccttccccttgctcatcagactctcctcccaggccctcttcttgtttac
-ttatacccagccctgtaaataacagtgaaagtttgcttgtagacacttgacgttttctca
-tacaccatgaaaatcaaacctccccctctatgcagttaccccatcagtccccattacaac
-ctctgatggctgccaccccagctggatccctaagagtctaggtacaagacactcctttca
-gcattccttctcatctttttactttgcatctccggttttgcctcacacaaggtctcttct
-tcctctgtggatcctctacctacatgtgtctacctgctaattggacaggcacatgcacac
-tagttttccttactcccaaaattcaatttgcaaatgggaccgaagagctccctgttcccc
-tcacgacactgacacgacaaaaaagagttattccactaattcccttgcttgtcggtttag
-gactttctgcctccactattgctctcagtactagaatagcaggcatttcaacctctgtca
-cgaccttccatagcctgtctaatgacttctctgctagcaccacagacatatcacaaactt
-tatcagtcctccaggcccaagttgactctttagctgcagttgtcctccaaaaccaccgag
-gccttgacttactcactgctgaaaaaggaggactctgtatattcttaaatgaagagtgtt
-gtttttatgtaaatcaatctggcctggtatatgacaacataaaaaaactcaagaatagag
-cccaaaaacttgccagccaagcaagtaattacactgaacccccttgggcactctctaatt
-agacgtcctgggtcctcccaattcttagtcctttaatacctatttttctccttcttttat
-tcagaccttgtatcttccatttagtttctcagttcatccaaaaccgtatccaggccctca
-ccaatcattctatacgacaaatgtttcttctaacaaccccacaatatcaccccttaccac
-aaaatcttccttcagctcaatctctcccactctaggttccatgacccaatcctgctcaaa
-gcagccctgagaaacatcacccattatctctccatgccagccccccaccaaaaatatttt
-tttcgctgccccaacacttcaatactattttatgttatttttcttattaatataagaagg
-caggaatgtcagacctctgagccgaagctaaaccatcgcatcccctgtgacctgcatgta
-tatgcccagatggcctgaagtaactgaagaatcaccaaagaagtgaaagtggcctgttaa
-tgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgccttaac
-tgatgacattaccttgtgaaatcctttctcctggctcatcctggctcaaaaagctccccc
-actgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttgactgtaa
-ttttcctttacctacccaaatcttataaaatggccccacccctatctcccttcactgact
-ctcttttcggactcagcccgcctgcacccaggtgaaatagccttgttgctcacacaaagc
-ctgtttggtggtctcttcacatggatgtgagtgaAATTaatattaggtacacacagacat
-aaagatgggaaaaatagacagtgaagattttaaaggggataaggaagggagaggagcaaa
-tgttgaaaaactatctattctgtactatgtttgctacttgggtgacagggtcattagaag
-cccaaacctcagcatcacacaataagcccatgtaacaaatctgtacatttatcccctgaa
-tctaGATTTTAAAATAAggctgggtgtggtggctcacacctgtaatccaaacactttggg
-aggctgaggcaggaggattgcttgagcccaggagttcaagaccagcctgggcaacataga
-ccttgtctctacaaaaaataaacaaaatcagcaaaatgtggaggtgcgcctgtagtccca
-gctgctcaggagactgaggcaggaagattacttgagcccaggagctcaaggttgcagtga
-gctgagatcgtgccactgtactccagcctaggctaccaagtgagattttgtctcaaagaa
-aataagataaaaTTTTTTCTTACATTGTGATATATATGCACAATGGaattttcaaatata
-tagtatattatcactaactgtagccaccatgatgtaaatagagctcttgaattttttttt
-tcttcttttgaaaacagagttttgctcttgttgctctggccagagtccaatggtgcgatc
-ttggctcattgcaacctctgcctccccagttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattacaggcacatgccaccacgcctggctaatttttgcatttttagtcaag
-gcggggtttcaccatgttggccagactggtcccaaactcctgacctcaggtgatctgcct
-gcctcagtgtcccaaagtgctaggattataagcatgagccaccgtgcctgaactctcttg
-agcttatttttcctgtctaagtgatttccccacccctagcctctgataactaccatttta
-ctctttgtttctatgaattcaacttttttacactctacatagaagtgagatcatgtcttt
-ctgtgcctggtttatttcatttagcttactgtcctccaggttcatccatgttgttgcaaa
-tgacagaatttacttcttttttaaagctgaaaagtattccattgtgattatgtaccacca
-ttttctttattaattcatctattaatgggcacttaagttgattccatgccttggttattg
-tgaataatgctgaaattaacatgaaagtgcagatatcttttcaacatgctgattttattt
-ccattagctatatacccagtaatgggattgctggatcatatagtagttttcattttaatt
-ttttaaggaacttccatacagttttccataatagctatactaatttttattcccaccaac
-agtgtgcaagggttcccatttctccacatcctttccaacacttattctctttcatagtat
-attttgaagtcaggtagtgtgatgccttcagctttgttctttttgctcaagattgttttg
-gctattcaaaatcttttgtggttcaatccaaattttaagatttttttctgtttcagtaaa
-aaatgtctttggaattttgatagggattgcattaaatctatagaccactttgggtactac
-agatattttaacaatattaattttttactttcatgaacatgggatatctttccatctgtg
-tcttcttcaatttcttccatcaaagttttatacattttagtgtagaggccttttacctct
-ttgttaaatttattcctaagtatttttgtagctattgtaaaaggatcatttacttgattc
-acttctcaggtgttcttgttagtattcagaaaagctgctgatttttgtatgttgaattta
-tatcctgccactttactgaattcatttattagttctaatagttatttggcaaagtcttca
-ggattttctgtatatacgattatgtcatctgcaaaaagaaacaatttcacttcttccttc
-ccattttaatgctctttttattgcattttcttgcctaattaatctggctagaatttccag
-tactacattgatagaagtggcaaaagtgggcattattttgttctttatcttaaagaaaaa
-gcttttgactgttcaccattgagtatgatgttaaatggggcttgtcatatatgatcttta
-ttgtgttgagatcattctttctgtatctaatttgttgagttttatcacaaaaggacgctg
-aatgttgtcaagtgttttttctgcatctgttgagatgatcatatggtttttacccatcac
-tctgttaatgtagataaatctcacttgatcatggtgaataatccatttaaagtattgttg
-aattcaatttgctagtattttcttgaggtttttgtatctctgttctagggacatcgacct
-ataacttttttttcttgtatgcccttgctctggctttattataagggtactgctACccca
-gcatgatttccaaatggctatgaaccagtgactgctgtgtacaaccaacttttcctcctt
-tcaaatgggagtgttgtggttatAACATTATAAAACAAATCTTGCAAagttagatagaag
-gcatcagttctagtgtttgatagcacagcagagtggctattgttaacaacaatttattgt
-atatttcaaaatagctaaaagagaagttttgaaatgttcccaacacaaagaaaggacaaa
-tgtccaaggtgctggatatcctaaataatctgacttgattattacacattatatgcatgt
-atcaaaatatcacatgtgcccagaaatatgtacaaatactatgtatcaataaaaaaGttt
-ttaaaaaataaatattacatataatatatgaattatataataaaactagaatataatata
-aaaaggaaaaaatatatgtaaaataaatCTTCATaataaaataaaataaaataaTTTGAA
-AGAGTCTATGAATAAGATTTTGGAGACTACTCTAAGACAGATGCAAGAGCAGGTACCAAT
-AATTCTGTCTGTACCAAAAGAGTGAATAATAAAAATATACAATTTCAACTTAATTTTGCA
-TAAAAAAAAGTGAACAAATAAACATGCATCTAACAATACTGACCACATCCACGTCTTCTA
-TGAGTATGGAGGGGATAAAAGAATAAAAGAAAAAAGTCAAAGCGAAGATTAGATCCCCCC
-AGTCAGAGCAGAATTCAAGGGTTAATTTATCTGTTCAATTAAGTATATCCCTCACCCCCA
-ACTCAGAAGACACTTCTCTGATTTATCTGACACTAAGCCAAAATGGATTCTCTTATCTAA
-TTTATCAGTAGAATCATATAGAGTAGAGGACACATGTAGATTAAAGACAGTGAGCCAGAC
-CCATCTTCACTGTCACAGTGACAGAATGGACCCTCCTTTAAAATACCCCTGGTGACATTG
-TAATGAAAGACTAAAAAAGAAAGGGGCTTATAAAGTGCTGCAGTGAAAAAAAGGGCTTCT
-TATGTGAGCCTTACTTTTAAAGTTCCCTAAGAATTAGGTTGAAAAAGGTCATACATTGAC
-TTTCATAGTGCTGAAATCATCAACAAAAATTTCTAAAATTCTGCAAAGTCCAGTCACTGT
-TACCTGTGCACTTCTCCAGAATTTTCAAAAGCCAAACTACTAAAAGGAAGGTTCTTGTAT
-GCTCTTGAAACTTTAATATATCCAGCTAAATATTTTTCTCCTTCCTCCCCCTGAAACAAG
-GTGGTGAGCTGCTCATGGAGTAATAAGGTTCATTGATTTCTTTATCTCACATGAGTAAAT
-ATTAGCTCTACAAAAGTTATTTATGACCAGTGCCTTAAATTAAGCAGCATCAACAAATGT
-CACCACAAAATTTCTCTTCTGTTCATCTGGACAGCATTTTCTACCATCATGACCTACTAC
-AATTTCATCTATCTCATGAGGAGCTTCTTAAGTACGTCCCCCTCATTTATAAGACTTTAA
-ATTTCATACTGAAACAAATGATATGCAATGCTTTTAGAGATCTTAAGATAATCTTTGTCT
-AAAAATTCTGTCAACTAGATGTTCAAATTGCTACTGAAAATGGAGATGGAACACATACAT
-TAAATGATTCAAATGATATATCGGAATTACCAGTAGCTGTCATGTTTGCCCATCAGATCT
-GCCCTCAAAAAAGTGTTATGAAAATATTCAAACATTTTTTCTCCCTCTAACTAATTCCTA
-GCTGTTAGCAGAACCCTCTGTacacacacacacacacacacGGCATTCAGATCTAATTAG
-ACAAAAGAAATTTCATTTGTGAAACAGGAGAAATACCTGAAATTCTGTGAAATATTGTCT
-CGCATAGAAAATGGAGTTGttacaagccaggagagattgggtgcctattttcaaccttct
-taaagacaagaaattccaaccaagaatttcatatcctgtcaaattaagattaataaatga
-aagagaaataaaatcttttccagacactccagtactaagagaaatccttattattaaagg
-cagtcttacaagagacccttcagggagttctaaatatggaaacaaaggaacgatatttgc
-atttacaaaaacatacttaagtacgtggcccacagaccctaataagcaaccacacaatag
-aaactacaaagcaaccagctaacaactccatgataggatcaaaacctcacatattaacat
-taaccttgaatatgaacactctaaatgctccacttaagaggcacagagtagcaagttgga
-aaagaaaagaaaagaaaagaaaagaaaactcatctgtctgcagtcttcaagagaccaata
-tcacatatatgacacccataggctcaaagtaaatggttggagaaagatctaccacataaa
-caaaaaacagaaaaagaggaggggtcattattcttagataaaacaaactttaaaccaaca
-actacttagaaagataaaaaagggcattacgtgacaataaagggttaaattcaataagaa
-gacttaactatcctaaatatatatgcacccaatattggagcatctagattcattaaaaaa
-actacttctagacctatgaaaagacttagccacatgattatattgggggacttcaacacc
-ccactgacagcattagatagatgattgaggcagaaaactaacaaagaaatcctggactta
-aacttgacacttgaccaattcaacttaatagacatctacagaatattccatccatcaacc
-acagaatatatattcttcacatctgcacatggaacagactccaagattgaccacatgcta
-ggccatggaataactatcaacaaattcaaaataccaaaataatgccaaccaaactctcag
-accacactggaaaaaaatagaaatcaataccaagaaccttcaaaaccacacaattacatg
-aaaattaaacaacttgctcctaaaccacttttggataaacaacaaaatgaaggcagaaat
-ttaaaaattcattgaaataaatgaaaacagagacatagcataccaaaatatctgggatgc
-agtgaaaacagtgttagaaagaaagtttatagcactaaacactgaccttgaaaagctaga
-aagatctcaaattaatgatattacgtcacacctacaggaactagaaaaacagaaacaaac
-taaccaccaagctagcagaagaaaaaaaataactaaaatcagtgtagaactgaatgaaat
-tgaggctcaaaaatccatacaaagacacagtgacattacaagtttgtttttttaagggat
-aaacgagatcaatagaccactattttttgttagtagattaacaaaagaagtgagaagatc
-caaataagcacaaatagaaacaacaaaagtgacattacaacagatcccacagaaatatga
-aagagactattatgagcacctctatgcacacaaactagaaaatctagaggaagtggataa
-attcctggaaacatacaatctcccaagattaaaccagaaagaaactgaaaccctgaacag
-accaataacaggttccaaaattgagtcatcaattaaaaacctattaactaaaaaaggccc
-tgaaccagatggattcacagcccaattttactagacataccaattctactaaaactattt
-caaaaaagcaagaagaaagatacctccctaactcattctacaaagtaggcatcaccctgg
-taccaaaacctggcaaagacacaacaaaaaaagaaaactacaggccaatatccctgatga
-aaaaaatgcagaaatccttaagaaatactagcaaactgaatcaaagaatactaaaaaaag
-acagttaattcgccatgagcaaacagacctccctcttgggatgcaaggttggttcaacat
-atgcaaatgaacaagtgtgattcaccatataaacagaattaaaaacaaaaaccatatgat
-catctcaataaatgcagcaaaccttttgataaacccaacatcccttcatttaaaaacccc
-tcaacaaactaggcatcgtaggagcatactcaaaaataataagagcccctatgacaaacc
-cacagccagcatcatgctgaatgggcaaaaactgaaagcatttcccttgagaactgggaa
-tgctttctggaacattccagttttctggaacattcccaggaatgcccactctcaccactc
-agattcagcctattactggaagtgcttgccagagcaatcaggcaagaggaagaaataaaa
-ggcatccaaataggaaaagaagaagtcaagctatctttcttcattgacagcagattatat
-gcctagaaaaccttaaagcctccaccaaaagactcctggaactgataaacgacttcagta
-aagtgtcaggatacaaaagtcaaagtataaaaattaacagcatttctatacaccaataat
-gttcaagctgagagtcaaatcaagaatgcaatcccattttcaataaccacacactcaaaa
-aaaaagcctaggatttttttctaactaagaaggtgaaagatctcttcagattcagggaga
-attataaaacattgctttaaaaaattatagatgtcacaagcaaatggaaaaacattccat
-gcccatgggttggaaaaatcaatatcatttcaacagtcattctgcccaaagcaatctaca
-gattcaatgttattcctatcaaactaccaaagccatttttcacagaattagaaacaacta
-tcctgagttcttatggagccaaaaaaagagcctgaataggcaaaacaattctaagcaaaa
-agaacaaagccagaggcatctaattacccatctcaaactacacgataaggttacagtaac
-tgaaacagcataatactgatacaaaaacagacatatagaccactggaacagaataaagaa
-tccaaaaataaagctgcatgcctacagccatctgatctttgacaaagtcaacaaaaatac
-gcaatgggaaaagggctccttattcaataaatggtgctgggatagctggcaagccacata
-tagaagaataaaactggacccctcctctcaccatataaaaaattaactcaagctggatta
-aagatagaaatgtaagaactcaaattacaagaatcctagaagacaacctagaaacaccat
-tctggacataggtcttgggaaataatttatgactaagtcctcaaatcaattgcaacaaaa
-acaaaaattgacaagtgggacctagttaaactaaagagcttctgcacagcaaaagaaact
-atcaacagagtaaaaagacaacatacaatggtagaaaatatcacaaactatgcctctgac
-aaaggtctaatatcaagcatctataaggaacttaattcaacaagcaaaaagaaaatagcc
-ccattaaaaagtgcgcacaagacatgaacagacacctctaaaaagaacacgtacaagtgg
-gcaacaaatatatgaaaaaatgttcagcatcactgaacaccagagcaatgcaaatcaaaa
-tcacaatgagataacctctttacaccacttagagtagctattactaaaaaatcaaaaaac
-aacagatgctggcaaggccgcagagaaaagggaatgcttatacactgttagtggaaatgt
-aaatttgttcagccactatggaaagatgtttggagacttctcaaagaacttaaaacataa
-ttaccattcaactcagcaatcccattactgggtatatatccaaaagaaaataaattgttc
-taccaaaaagatgtatgcacgtgtatgttgatcgcagcactattcataatagcaaagaca
-tggaatcaacctaggttcccatcaacagtggattggataaagaaaacgtggtacatatac
-acaatggaataccatgctgccataaaaaaataaaattacctcttttgcagcaacatggat
-gcagctggaggccattatcctaagcgaattaacacaggaataggaaacctaataccatat
-gttctcactaataagtgggagctaaacattgggtacacattgacataacgatgggaacaa
-tagacactggggactaatagaagagggaaggaggagaggagaaagggttgaaaaactaac
-tgttgggtactatattcaggacctgagtgatgggatcagttgtaccccaaacctcaacaa
-cacacagtacaccaatgtaacaaatctgcacatgtacccctgaggctaaaataaaagttg
-aaaTTATTTTCTTAAAAATGGAAAGGCTAAATTCCACCTCTACCAATATGTTTACTTAAT
-TTTTATATCCCCCATCTTACTGGTATAAAACCAGGAACATGGCAACCATTCATTTATGTT
-TGAAGTGTTCAAAAAATGAGTGACTACATCAATAAATGTACTCAGAGGAAAGCACAGGAC
-TTTATTATGTGGGGAATCAAGTTCACAGAAGGAAGCAGATGAATCTTTTGCTGCAGGCTG
-CTGGATTAGGCAGCACTTTTTATTTAGGAAGAGTGGAGACCAGCGAGACAAGGGCTAGAT
-TTAGGATTAGACTGTGAAAATGGTGATGGTGGGTAAGATGATGTAATCCTGCAGCACACT
-CAGCTTCTCACCAGAATGTTGATGTGGCTTCTTAAATGACACATGTTTTTTCTCTTCTTC
-ATCATTAGCACAACATAATTTCCCACTTAGACATCCTATTTCATATCTTTCTCCTACCTT
-GCATTTCTTCCTGCAATAGCCTGTTACTTTATTGAAGCATTTTTTGAGTCTTGCCCCGTC
-TGTGCATAGGAAACAACATTGAACCAAGGTTAGTGCGTAAGGAAGAGCAGAAGAGGTAGG
-TATGTGGTTCCCCACAAGTCATGGCCTCCTATGGTCCCAAGTGAACATTATGCTGATAAA
-AGGAAACTCAGAGGCCCCTCCTTGAAAAATATCCCAAATTAAGGACATTCAAAAGCCCAG
-GCTCTCAGCCAATGTCCAGTTGCCTCTGAGAACATTAGAACTGATATGACAAAAGAGAAG
-AGAGAACTCAATTCCTGGTTATCAACCAGAGCCAAGTCCCACCCCTAGGACCATGGCAAA
-GCTGACTCTCTCCACCAAGCTCCAAAGTCAGCACTCTCTCAGCTCCATCTCAGTCTCATG
-TCCCCAGAGACGGCTAACATGTCACCATGTGCACAAGACATGTCACCATTGGCACAACTC
-AGCCAAAGCAACTTTTGAAAGAACATCACAAACAAGACTTTTTAACTTAATTCGGTTTCA
-CACTCACTGATATGGGCAACAGAAATCTCCCTTTGACAAGATCTCATGGGTCTCAGCAAC
-AGGTGCTATTGAGAACTCCTTCCCTTAACCTGGCTCCTCCTGTCTGTCACTCATCACACT
-CCCCTTGATCTCAGATAAATGTGTTGCCCAGGGATCAAATTCAATTCCATGAATTTGGCT
-CTAGAGAGCTACATTGTCACCTTCTCAGAGTAATGCACTGAAATTCTAAGTCTCTTGTTT
-CTAATCCTTATTTGCCCCTCTACCCAAAATTTGAACAAGCCCAAAGAATAAGGTTGGAGA
-AGAGAGACATACTCTCCCTATCCTAAACTTCAGAATCAGGGAACATCTTTGAGGGTTAGA
-GGAGTATATTTTGGGGCCATAAAAATACAATATGCCTTCTTCCTAGCAAGAGAGAAGGTA
-ACTCTCACTGACAGGGCTTCTACGATGAACTTTgtgcttcgtgcttgtaagttcatgtaa
-cctgtacatcaaatagaatcatgaaatatagtaattatactccttcacagatgagaaaat
-tgagattaaaaggaaataatgtgcttaattcatacaacccgtcaatgatgaagacatatt
-ttaacctcacattgacatgactccaaaatgtgtgctattttaattactgtTGTAGTACAG
-GCTGAAAATGAATTTGAATGGAAAAGGGAATGGCCAGGCTCTCAGGTGAAAACTGTGTCC
-AGCATTATAAAGATAATTCTAGATGATGAGTTCATGGATACTTTTGAAAAGGACTCCTGA
-GAGTCCACTATAGCCCTGACCTCCTCTTACCTCCTTGGGTGCCTCTCTTCTAAGGCATAG
-ACTCAAGTCAGGCAACCAGGAGAATGGGTACTTTTTTATGATTTTGGCCAAATATAAATA
-ATCTTGAAAGTCCTGTTCCCACTCTTACAAATAGTAATATCTCTTAGGATGTTATAGTAC
-ATTTGGACAAGTTACCTGTGAGTACCTCAAACAGCAGAATAATGAGAACCAGAAACAGCT
-TCATATTTACAGACTTCCCAAGAGAAAGAGGCAGCAGAACTTTGTCCAGTGGTCTGTGTG
-CCACAGGTCTTTAAAGATGATCCAGAGTTTTGAGAGCTATCAGCGCTCGGAGCTCTCATT
-TTAACCCACACAGACAGAGAGGAATTCCAAGTCCACCCCCGTAACACACACACCTACATC
-CCCAAATATGGAGCTCACAGTCCCAGAATGTTCCACCATATCATCCCTCCTCCCCCTTCC
-TCAGGATATGCGCCCCTAGAGAGCAGGAACTATGACTTTCCGTCTGAGCTTCCAACCCAT
-TTGGGTCAAGGTTGGTTGGTCGTGGGCCTTGGGTTGTGTGGGATAATCCTGTCTTATTCC
-TATTGTTCCAATGTTCCATCCGGCTACTGCTGCCTCTAACAAAACTAACCCAGTTTGGAA
-GATAAATTAAGTCATTAGTCGACACAGAAGCATATTCAACAATAATTTTTTTAATGTATA
-AAGCTTCCAGATAGTCATTCTAGGAGTAAGATTGCTTTTAGGTTTGGCTAGATAAATTGA
-TATTATTTGAGAGTTTCCCATAAAGACTTGTCCATCTAGTAGAGCAAAATTCAACAACTG
-AAAGTTTTCAAAAGATCAAATCTCCTTAGCACAGCACTCAACTTATTATAAACTGGTCTC
-TGCTCTCCTCTCTTGGGACATTTTATGGAACCATCTATGTTTCTCCCAAACTAGTGGGTA
-CACCTTCCTGAACTTTTACTTCCTTAATCTGTTTCTTTTCACATTTAAATCCCTCCTTAC
-AGATTATATTACACTCCCCATCCCCTCCATATAATTGGTGCTAGTGAACTCCTGGTTTTC
-CTTCAAAACCAAGTTCAATCATCTCTATATAAGTGAAAGTTTCCCTGACCCAACTAAACA
-GAGCTGCAAACTCTCTTCTTCGCACCATCACTGTATTTGTACATATTTTTGTTGATGGTC
-ACACTATGTCATGTTCCAATTATTTGTTTATCTGCAATAGTCTGCAGACCCATAAAGGGC
-AGGTCTCTGGTCTTATTAGACTTGGAGttctttttctttttttttttttttttgcagttg
-caagatttaatagagtgaaaatggagctcccatacaaagggaggggacccaaagaggtta
-gccgttgccggctcgaatgcctgggtttatatcccaatcattgtccctcctgctgtgctc
-tcaggcaatagatgattggctatttctttacctcctgtttttgcctaattaccattttag
-tgagctctctttcctacctgattggtcacatgtgagctaagttgcaagccccgtgtttaa
-aggtggatgcggtcaccttcccagctaggcttagggattcttagtcggcctaggaaatcc
-agctagccctgtctctcagtaccccctctcaacaggaaaacccaagtgctgttggggagg
-ttggccgacgaccgctctaactgcttcctcctgaattggggcatagtaggggttgtgcag
-ttgagatttcctcaggaggggtgccttcgatgtcattaacattggagcatgggctagcag
-gccggtccaatggtccacggtagctcttagtcatggacggcatctgtggctccatttgaa
-gaatgatttgtagttttacagctttgattctggaaaagacaaacttaacaaggaggttaa
-agatacagggattgaaatgtatggcctgcagtgcaggggattatttctttggcacacttt
-acaggccctgactatctatttgatagttttgaaaaggcctggtccagtaaataataattt
-agccatctgatagttgctatcaatgcctaagtgaaaggtttggtaaagggttttaagtaa
-tttcaattggttagctgcaggcaaaagtattttttcttctttggtggctagccatcctga
-ggggaggaaagtatgtcctcttgaggttctccattctatttcttctgctgagtactgggg
-cttggtttcctggagggggttaccccacactaggggtccttctataagcatttctaatgg
-agggtcctgtcttgtggctcttttggcttcaacatctgcttggcagttcccttctacttc
-cctttccttttttttttttttttttatgaccccggcagtgtaagactgccacctctttag
-gtttctgtacagccaataataatatcctaatggcttcttgatgtttgataggtgttccct
-tggaagttaggaattccctttctctccatattgctgcatgggcatggagaactaggtaag
-catacttagagcctgtatatatatttaccctttttccttctcctaattctagtgccctag
-tgagggctattagttctgccagctgaacactagttcctggagtgaggggattactttcaa
-gtattccattatcactgaccactgcataccccacttttcgaagtcctttttctacaaagg
-aacttccatcagtacataaggtgaggtcaggatcagtcaagggaacctctaaaggatccc
-cttgagcagcgtaggtttgaacaattacttgctgacagttatgttctatcttttctttat
-tgtctggaagaaatgtggctgggttaagagttgcacaagtgcacagtcgcagcactggcc
-cttcaagtaatagagcctgatatttaagtaaatggttgtctgacagccacaagtctcctt
-tagcagtgagtatgccattcacatcatgagatgtccacacagtaagatctcttccctgta
-ttagtttaactgcttcagatactaagactactactgctgccactacccgtaaacaatgag
-gccaaccctttgccattacatcgatttccttacttaggtatgccacgggttacaagctca
-tccctcagacctgtgtaaggactcctagagctattcctgtttttttctgtgacttataaa
-gaaaagtcttgcccctttgacaagcttaacactggggcttgggttagggccttctttagg
-gcctggaaagctgcttctgcttcaggtatccatcttactaatgggtatttgctttctgag
-tttccttaattgtgtatataatggtctggctatttcgccatacctgggaatccatattct
-gcagaaacctgttacgccaaggaagcttttagttgctttagggttttgggatgaggatca
-gccagtataggctggatatgttcctcactgagggccctggtgcctttggataatttgagc
-cctaagtatttaacctgctgtgagcagagctgagcctttggtttggaaaccttatagcca
-caggtggcgaggaaatttaagagtgcttgggtggcttgattgcacaaggtttctgaacgg
-gcagctaaaattaaatcatccatgtaccaaaggacaagagtgtccaggtatgagaactgg
-ctcaagtcttaggctaatgcctggccaaatagatgggggttatccctgaacccttggggt
-aaaacagtccgggtgagttgagatgttgggttcgaaggatcttcaaaggtaaacaagaat
-tgaaggtcaggatgtacagggatgcagaaaaaggcatccttaatgtccaggactataaac
-cactctgcttcctctggtgtttgggaaagcagagtatacgggttaggtataggtgggtat
-ggagcgacaatggcctcattgataatcctgagatcttgcactaacctccactgtccgctg
-agtttctgtactcctaaaattggagtattgcaggggctattgcatggttttactaggcct
-tgggcttttaggtccttaaaaatattttagagtccttgttgggccttgggtgtaaggggg
-tactgcctttggtagggaaaggaggtgaaatcctttagtttaactcaaacagaatgggca
-ttctttgctcgtccatgttgtccttctgttgcccagacttcaggattaattccttcctca
-agcagggggacaataaacgggtgttctttctcctatgttcaggtgtataatggcccctgc
-tttcgctagaatgtctctccctaacaagggagtggggctttcaggcataattagaaaagc
-atgtgaaaagtataaagttccccagtcacaacttagtggctgggagaagtatctagtgac
-tggctgtcctaggaccccttggatagtgacagatctggaggacagttgtccgggacagga
-cagtaagactgagaaggctgcgccagtgtccaggagacagttagcctcctggctctcaat
-ggtcaagcatacccgggactctgtgagggtgatggcatgggctggagcttgccctgggca
-ccctcagtccttctgctggatcatctggttagtggcttctgactcagaggaccttcgtcc
-cctggggcagtgggccttccagtgattcccttgacataaggggcatggatgagagggtgg
-cttatttctacttggacaatcttttttaaagtgtccttgtagaccgcactggaagcaagc
-cctattaggcattcgatttgcccagtttttcccttttccaaagcctccTCGACTAGGAGT
-TCTTAACTCATAGCACAAAATTCATGCTATATGCTCAATACATAATCACTGAATGGCTGA
-AAAGTACTGAACAAATTACTGCTAGATAAAATACTCCAACACAGCAATAAAGTTAATTAT
-GGCATTTCCTTTAAAAATGCTGTTTACCACTTTTTGCAATTTCTAGGCACCTAATTATAG
-TAATGAGGTCCCATCTAATCCAAATATCTTTCTGTGACAGTATCTGGAAGAATGTTGGAA
-TTTCTGAAAGCTGTAGAAGTAGCCGTTGATGATTAAACTCTTATCACAACATAGTCAGGG
-AAAGAGTAAGGTTAGGAATTAGTATTGTATATAGCTTACTATGGATACCAGTAACCAGAG
-CCCTTATCCCCCTCAGTTAGTAGCTGTATACCTTGTAATCCTGGAGTGGCACAGAAAATA
-AAGATTGGTGAGGCTTACAGAATCTCATCAAATCATATTTATCATATGAAGACAGCTAAG
-TTAATGGGTGCAGGAAATTTAGCCGCACGAAGATCAGATGTGTGAATATTTATTAAGGGC
-TAGGTGCagtggctgggattacaggcgtgcaccatcatgcccagctaatttttgtatttt
-tagtagagatggggtttcaccacgttggccagtctggtcttgaactcctgacctcaggag
-atccacccacctcaacctcccaaagtgctgggattacaggcatgagccaccacgcctggc
-tTGTTtttttgtttttgtttttgttttAATTTTCTAAGTCTTTCTTGCTGAGGGTCTGTG
-GATCAAGGAAATACTTATTCAAAAAACAGGTATTAAGTTCCTGTTAATAAATACAAGAAG
-AAAAGTGCTAACTGAATCACCTGTGGGTTTAAAGACCACCATCAAAGCTACAATTTTGGA
-GGACAGCCAACTGCTCCCTTGTTCTGTAATTCAATTTTACTCATTGCTGTAAGGGAGTTG
-GTTCCATTTCTAAATAAATTAAACAGAGATAACCCAAGGATTAGATGAATATAAGTCCAG
-CTATGCAGGAAATCGTTTGCCACCTTAGTGCACAATAAGAACTAAGAAGTTGGACTCCAG
-ATTAGTGTATGGGATTTCTTTTAGCTTTTTCTAACTAGAATCAAGAAAGATGAGATATTT
-GACTGTTCTAAACCTTTACTTCAGCCAAGTATGGTGCTCTGGAAGCTTCTCAACCCCACT
-CCCACTGCCTCCATGTTCAAGACCATCAAATAAGAGGGAATTTCCTCTCCAAGTAGATGT
-CCATCTTCTACAACATTTTTTCCTACGTCTGATAGATACACTCTAGCAGAACTCCAGTAG
-CATATTTCACCCAGGATACAAAGGTGTATTTGTCAGCACCAGTCCTGCTGATGTTTTTCC
-TCAAATTCTGCATTGTTTCTTTCCAAATCTCAAAACCTCCCAGAaaatccttcttgtctt
-ttaaggctcagataaaaataagacctcctctgtgatgtcttcctaactcctctgatagac
-ttgattaattactattttgaacccccacagctctttccATTTGTATTTGTAACACTAATC
-CCATTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtctgtgtatgAAttttt
-ttagcttttattttaggttcaggagaacatgtgcaggttagtcacataggtaaattgtat
-gtcacagggatttggtgtacaggttatttcatcacccaggtaataagcatagtacctgat
-aggtagtttgttgattcccaccctcctcctacctcaagtaggccccggtgtttgtttcct
-tttttgtgtccaggtggactcaatgtttagctcccattataagtgagaacacgtggtatt
-tggttttctgttcctgtgttaactcacttgggatacaggcctccagctccatccatgtcc
-ctgcaaaaaacatgatttcattttttatggctgtgtagtattcgatggtgtatatgtacc
-atattttatttatccagtgtaccattgatgggcatttaggttgattccgtgtctttgcca
-ttgtgaatagtgctgcaatgaacatacacgtgcatgtgtctttatggtggaatgatttat
-attcctttggctatatacccaataatggaattgctgggtcgtatggtaattctgttttaa
-gttctttgagaaattgccaaactgttttccacaatggctgaactaatttacactcccacc
-agcagtctaaaagcattcccttttctccacaacctcgccagcatctgttattttttcact
-ttttaataatagctattctgactggtgtgagatagtatctcattgtggttttgatttgca
-tttctctaatgataagtgatgttgatctttttttttctttcaaatgcttcttagccgagt
-atatatcttgttttgaaaagcgttccccattgcttgtttttgtcaggtttgtcaaagatc
-acatagttgtaggtgtacagtcttatttctgggatctctattctgttccactgatctatg
-tgtctgttcttgtaccagtgtcatgctgttttggttactgtggccctgtagtacagtttg
-aagttgggtagtgtggtgtctccaactttgttctttttgcttagaattgccttggttatt
-caggctcctttttggttccatataaattttaacatagatttttctacttctgcaaagaat
-gtcagtggtagttaaatgggaatagcattgagtctataaattgctttgggcagtatggcc
-attttagtgatattgattcttcctaccaatgagcatggaatgttttttcatttgtttgtg
-tcatctctggtttctttgagcagcactttttagttccccttgtaggtagaaatctttcac
-ttcccttgtaagctgtattcctatgtattttattctttttgtggcaattgtgactgggag
-ttccttcatgatttggctcttgtgttgaaggttataggtgtataagaatgctagtgattt
-ttgcacattgattttgtatcctgcgactttgctgaagttgtttatcagattaagaagttg
-cctagccatgtgcagaaaattgaaactggaccccttcattacaccatataatacaaaaat
-taactcgagatggattaaagacttaaatgtaaaacccaaaagtataaaaaacctggaaga
-caacctagataataccattcaggacacaggcacgggcgaagattttagggtaaagatgcc
-aaaagcaattgcaacaaaagcaaaaatggacaaatgggatctaattaaactaaagagctt
-ttgcacagcaaaagaaactatcaacagagtaaacagacaacctacaggatgggagaaaat
-ttttgcaaattatgcatccaacaaaggtctaactaatatccagcatctataaggaactta
-aacaaatttacaataaaaacaaacaaccccattaaaaagtaggcaaagaaaacatgaacg
-gacacttctcaaaaaaagacatacatgcagccaacagtcatatgaaaaaaagctcaacat
-cactgaccattagagaaatgtgaattaaaaccacaatgagataccatctcccaccagtca
-gaatggctattaccaaaaagtcaaaaataacagatgctggccaggtacagtggctaacac
-ctgtaatcccaccactttgggaggcctaggcaggcagatgacctgaggtcaggagtttga
-taccagcctggccaacatggcgagaccccgtctctactaaaaatacaaaaattaatcagt
-catggtggtgggcacctgtaatcccagctacttaggaggctgaggcaggagaatcactgg
-aacccaggaggcggaggttgcagtgagccaaggctgcaccattgcactccagcctgggca
-acaagagcgaaactcccatctcaaaaaaataaataaataaaaataacagatgctggcaag
-gttgtgaagaaaaaaggaatgcttatacactattggtgtaaattagttcaatcattgtgg
-aagacagtgtggaaactcctaaagacctaaagacagaactaccatttgacccagcaatcc
-cattactgggtctatacccaaaagaatataaatcattccattataaagacacatacatgc
-ccatgttcattgcagcattatttacaataacaaagacttggaatcaattcaagtgcctgt
-caataatagactggataaagaaaatgtggtaaatatatgtcatggaatactatgcagcca
-caaaaaagaatgagatcacgtcctttgcagggacatgaatggagctggaagctattatcc
-ttagcaaactagcacaggaatagaaaaccaaataccacatgttctcatttacaagtggga
-gctaacttatgggaacacacagaaacacagaggggaaaaaccacacactggggcctcttg
-gagggtggagggtggggggagggagagaagcagaaaaaataactaatagacactaggctt
-aatatctgggtgatgaggggcgggcacagtggctcatgcctgtaatcccagaactttgga
-aggctgaagcaggcagatcgcttgaggtcaggagttcgagaccagcctggccaatatggt
-gaaacctcatctctactaaaaatacaaaaattagccaagtgtggtggcatgtgcctgtaa
-tcccagcttctcgggaggctgaggcacaagaatcacttaaaccagggaggtggaatttgc
-catgagccaagatggcgccactgcactccagcctgggtgacagaacaagactctgtctca
-aaaaataataataataataaatctgagtgatgaaataacctgtacaaccaacccccatgt
-cacacatttacctatgtaacaaacctgtaccccctgcacacataacctttgatcttaaaa
-taaaagtgaaaaaaaAAAGTGTCTGTTCATGATCTTTGCCtttttttttttttttttttt
-tttgacagagttttgctcttgttgcccagcctggaatgcaatggcatgatcttggctaac
-tgcaacctccacctcctggattcaagcaattctcctgcctcagcctcccaaatacctggg
-attacaggtgcccaccaccTCAAAGtaaatttctttgagtttcctcaacacagctattgt
-gaattatctgtcagaaaagtcacatatctctgtctctctggaatggcccctcctgcctta
-tttagtccatttggtgaggtcatattttcctggatggtgttgatgctagtagatgttctt
-cagtgtctgggcattgaagagtagggtatttattgcagccttcactgtctgagcttgttt
-gtacctgtccttcttgggaagtctttccgaatattcaaaaggtcttgagtgttgtgatct
-aagctatatctgctttagggggtaccccaaacccagtaatactgtggttcttgcagactc
-ttagagataccaccttgatggtcttagacaagatctgagaaaattctctggattaccagg
-cagaggttcttgttctcttcccttgctttctcccaaacaaacggagtcagtctctctctc
-tctctctcttttctgagctacctaaagctgaggatggagtgacataagcatccctgtggc
-caccaacactatgactgcactgggtcagacctgaagccagcacagccctaggtctcaccc
-aaggcctgctgcaaccactccctggctacttctcaaggccctgaggctctacaatcagca
-agtggcgaagccagccaggactgtgtccttcctttcagatcataaaggtaccccaggccc
-aggatggatacagaggttcccatggggactccgagactagagtaacaaaccttagaaatc
-tacctggtgttctattgtactgcagctgagcttgtactcaaaccacaagactcagtcctc
-cccactcttccctctcctttccaaaagcagaggagccttacttcgtggccaccaaaacca
-caggccacaaggaatactgccaggctactgctgatgttccctttaagccccaagggttct
-tacgtcagcttgtggtgaatgctgcctggcctgggactaatccttcaagaaggtaggctc
-ccctctggcccatgacaggtccagaaatattcaagagtcaagtcctagaatcgaggaccc
-caagagcccacctgatgctctacctccttgtggccaagctggtacctaaggtgtaagaca
-aagttcccttcattttttctctgcttttctcaagcagaaggagttctgccctatagccac
-cacagatggggatgtgttgagtgtcacctgaagccagaaagtctcatgggttcacccaag
-gccatcagtgtggaacctggttatcactgctggttattcagggcacaagggctctttagt
-tagcaggtgattaatgctgccaggactgggtccttcccttcaaggcagtgggttcccttc
-tggcccagggtgtgtctagagatgtttttcaggagctacgtcctggaagagggtctgtca
-actatctggtgcctgatcctgctgtggctgagctggtatccaagatgcaagacaatgttc
-ttcctactcttctctctcttctcctcaagtggaaggaaatggtctcttttggagctatga
-gttgcgcagcctggggttaggggaggatgatgttagaactcccttagctgccctagctac
-tgttttagtaggtcatgtgccccccagtccactgtctctaggcccagttcagcactagga
-cttgcctaagagttgcagtccttggggtttagactgcctttcaagtttgcttagagaccc
-aaagcccacagtggaaagctttgcatgtattcaagttccgaccactgagatcagcaattc
-ccctctggttagggctggtttaaatgcttcctctgtgggtgggcctcagctgcatttggt
-ccagttttcctttctgctctaactgggcagcactgagttcactgcctcacaattgccgag
-ttttccatccctcctccagcacccagagattatctttgcatgctgctaccgacagggcag
-tgggagtggggagtgcagggtggcagctgtgattgaggactgtgttttctatttcttcag
-tgcctcattcagtggtaggaactaaaatcaagtgctatgattcttattcttatgaaggtg
-ttttttgtgtagatagttgttaaattggtgcctttgcataggggagggaggacgatcagc
-ggagccttccattcaggcatcttgctctgcctcctttttccataaataatttttgggagt
-ctagtatgttccaggaactctttcaggtcctgaaaattagacatgcattcatggagcata
-cattcaaaagtgggaagcagataaaaaatcatatgaataaatatatagtatgtcagatgg
-tgacagggctctggagcaaaagaagatatagaaagaagatgacaaggccaggcacggtgg
-ctcacacctgtaatcccagcactttgggaggctgaggcgggcggatcacctgaggtcagt
-agtccaaggccagcctggccaacatggcgaaacaaaatacaaaaattatccaggaatgat
-ggcgggtccctgtaatcctggctacacaggaggctgaggtggaagaatcacttgaaccca
-gaggtggaagttgcagtgagccaagatcatgccattgcactccagcctaggcaaaagagg
-gagactccatctcaaaaaaaaaaaaaaaaaaaagtgctgagcaaaaaagagtacagtttt
-aaatgaggtatctgtgaaaagactccttgaggcagtgacatttcaggaaggatgtaaaag
-ttatctggggcaagagagtgtcaggcaatgagaagagcaagtgcaaaggccctgaggtgg
-gaccatgcccagtgtgttcaagaagtagcaagaagaccacatggataatgtgaagcaatg
-aggaaagagaaaaaggggattatatcagaaaagtaatgggggtgcacatttggggttaca
-ataaagaattagacttttcctctaagatggaggttattggacagtgctgacatgatctga
-tgtattttcaaaagatgcctctggcttctgtggtcaaaacagattgagagggagggaaag
-tataaaagtggaaaacctgttgcatgggcattacaaaatctaagtgacagctaatagggc
-ttagatagagagcatcagagaagagggtgggaaatggtcagactcttacatacctattga
-aaatacagtcactcgtagattgaagagaaaggaagaagtcaagataacatcacagtttta
-gtctgagtaactgaaagaatgaagttgtcactgacagagatggatataacaggagaaagt
-tcagattggtctttttgcttgagggaggataaaaacctttgtttgggatacgtttgcttt
-ggagtgctatagacatctaagtggaattgtcttgtaaacaggagagatttttaagccatg
-agactgaatgggattgtcaaggctatgactgcagaaaagagcctaatgcctgagacctag
-aactccccaatgttgatgaataagaagcagcaaaggacactgagaaggttcattccagtg
-aggtcggaggaaaaccaagagaacatgatgctctgggagcttaattaaattaagttcatc
-aaggaggataaagcaccaaatgctgctgatacatcaagatgaggcatgagaattgatcag
-tggCCTACCAGAATCCCAGCTCCAtgacctcttaccagatgccaagtagatgacaaatgc
-atttcaaatgcattgcttactttaatcatcacaagaacactatgaagcagaaattaatat
-acctcaatttttaaaactggaaaactacaatttagggagctaataatgtgcccaatgtca
-cacagccaataaggaattaactgggatcaacacaggtctgcatgaacctaaaattaaagg
-ccttagccactatgctaagctgcctctcCAGCTGCCTTCCATGGGTCAATTCTAGGGAGA
-CTGAAGACAAAGTATTCAAATAAAAGATGTTGCTTTATTCAAAAAATGTATTGGCCATGT
-GCTTGGCTGGACATTCTTCCATGACCTACTCCTTTATACTCTATTCATCACTTACAGGGC
-AGCCTGTTTTAAGAGAATTCATATTTCTTATTTCTGAAGATGACATTATTACATCCTGGA
-AGAAATATTGATTGCCCATTTCAGTATATTCCTAAGTCTTTTTGTTCCTCTGTGTCAATT
-Ctttttcttttattattatactttaagttctagggtacatgtgcacaaagtgcaggtttg
-ttacataggtatgcatgtgccatgttggtgtgctgcacccgttaactcatcgtttacatt
-aagtatttctcctaatgttatccctcccccctcccaccaccccacaacaggtcccggtgt
-gtgatgttccccacctgtgtccaagtgttttcattgtttaattcccacctatgagtgaga
-acatgcagtgtttggttttctgtccttgcgataatttgctcagaatgatggtttccagcg
-tcatccatgtccctacaaaggacatgaactcatccttttttatggttgcatagtattcca
-tagtgtatatgtgctacattttcttaatccagtctatcattgatggacatttgggttggt
-tcgaggaagtcaaattgtccctgtttgcagatgacatgattgtatatttagaaaacccca
-tcatctcagcccaaaacctccttaagctaaccaacttcagcaaagtctcaggaaacaaaa
-tcaatgtgcaaaaatcacaagcattcctatataccagtaacaaacagagagccaaatcat
-gagtgaactctcattcacaattgcttcaaagagaataaaatacctaggaattcaacttac
-aagggatatgaaggacctcttcaaggagaactacaaaccactgctcaacgaaataaaaga
-ggacacaaacaaatggaagaacgttccatgctcatggataggaagaatcaatatcgtgaa
-aatggccatactgcccaaggtaatttatagattcaatgccatccccatcaagctagcaat
-gactttcttcacagaattggaaaaaactactttaaagttcatatggaaccaaaaaagagc
-ccgcatcgccaagtcaatcctaagccaaaagaaaaaagctggaggcgtcaATTCTTTAAT
-GTCAAGCAGCCTTTATGCAATCTTGGATTGGGCACAAGAAGCACACAATCTCCTCATTTT
-CAAAGCCCTTCATGGCTAAGCAATAGAGTTCCTCTTGAGTAGGCTGGAACAGATAATGAA
-ATGTTGCTTTTTAGATGTGGTCAGTTAAAAATAAAATCACCTATCAACATTTGTTACTGT
-ACCTCCAGCTGTGATCAATAGTACAAATTGCTTTTAATATCTTACTTATAAATAGACTTT
-AAGTATGTTTCATTTCTGAGAAATGTTCTCTGAATTCTACTTAAGATGTTATCTTTCCAA
-ACTGCTGGACGGGCTGAATCCAGGCAAGAAATGGGATTGCAAATTCCCTTGCACGAAGAC
-TTGATGGGTGAGTCAAAGCAAGATTCCCTTGCCATTCTTTGTTTAGAGGTGAGAGGAAGG
-TTAACTAGCATTTTATGCTATAAAAATCAGACACAAAGATAAGCAAAAAGAATACAACAG
-AAGCCACTCATTATTTCAGCTCTCTGTTAACACTTTGATGTTCACTTCTAAATATGCTTC
-CTCAAAGTAATTTCTTTTCACAACTGGGTAGGAGATAAGATAAAGCAAAGTGAGCTTGCT
-TGCTTTTCATCCACTCAGTTAAAAACAGTCTTCCAGTTGACACTCCCTGATACATGCACA
-CTCAGGCACACACAAAAGTCTGCACTCATCCATTAACCTCAAGAAAGAGACCTGTTGACA
-AAATAGACATACACCAGTTCAGAGGAACCTATGTCACCTGTCCCTAGTAATCTACTTTTA
-AGCCTAAATATATCAACAGTCAATTTCAGGAAAATTAACATTAAAAAAATTTAGATGAAC
-AATAGGAATGAATGAACTTAAAGGAAAAGAAGCTAATATCAAGGACAGAAGATAATTATT
-TAAAATGATGAGTGACAAACTTGACTAAAATGCACAACCTCTTCATAACAAAAAGCATGC
-AGGAGAAGGTACAAGTCAGCACAAGgttaaaagacaatcagagtagaacaaaaattctat
-gtgcatgataccacaaaaagattgctatccataatctatatgaagaataactacaaatca
-ataagaaaatgacaaatgacccagaggaaaataggcaaaCAATAGTATAGCAGCAAAACA
-TTGTAAGCACTCGTTTCAGAAGGTTGATATAGATTCAGAAATATGATATTCCCTTTAAGA
-GAATCTGCTTTTAATCCATAAATTGTCTTACAAACTAGTTTTATTAGTTTAATATTAAAG
-GAcccattagtgggtatatatccagaggaatataaatcattgtattataaagacacacac
-ctgaaaatgttcattgcagtactattcacaatagcaaagacaaggaatcaacctaaataa
-ccatcaatgacaggttggataaagaaaatgtggtatgtatacaccatggaatactgtgta
-gccataaaaaagaacaagatcgcatcttttgtgggaatatggatggaactgcagaccatt
-atccttagcaaactaacgcaggaacagaaagccaaataccacatgctgtcacttataaat
-gagagctaaatgatgagaactcgtgaacacaaagacgggaacaagagacactggggtatc
-cttgagggtggagggcgggaggagggagaggagcagaaaagacaacaaacctctgtgaca
-caagttttcctatgtaaccaaccttcttatgtcctcccaaacctaaaacaaaagttaaaa
-aaaaaAAAAAGACCCAATTGGAGTTGCAATTTGCTCTTTCCCATTCTACTGCATTTCTGA
-AACCCAAAGTGTACAAAGAATGTGTCTTATGTTTTATGAAATGTACATTTGGGCCCCCAT
-TTTTTTATTTGTATAACAATTGTAAAACACTATCTAAAGGCATAAAATGGCTAGGATGAG
-AATTACTATTGGTTCATAATTATATTTGCTTAATTACTGAAGATGTAACTGTACTCGCTT
-TAAGTATGCCATTTGACTATTGCCCTTCTTTTTGTCCAGAGCCATCAAAAGATTAAAGTA
-TTTGAAATGAATAATGTAATGGTTTTGTCTTCCTGCTACAGTGTGTTTCAGGTTATTTTC
-TAAAATCATAATGAACCCTGTTTTTTTGTTGTTTTTATTATTTTTTGATAAGTAAATAAT
-GCCACGATTGGTAGATCTAAAACTGAAGAAGGAGACCCTATGGCCTCAATCCAGAATGCC
-ATAGCATGCTAAAATGAGAACTTCCTCCAGGTGTGTATGTGTGTGTTCAGGGCCACCTAT
-GTATGCCCGATACGTCCAGTCTTCGTTGATGAAAATTGTTAGAGGTCAGTATTACAGAAG
-ATAAAACAGAAAGGCCATATGTTAATAATGAGAAATAAGTGGTTAATTCATAATTAGTGA
-ATCTGGTTTCAGCACTTTGGCCTTCGAGGTGGTCAAAACAGGTCTCCAATATGAACTAAG
-GATTGAAAAGattaaaattatttttttaacaaaaattaaGCTCAAAGAGTCTTGGATGCT
-TCAGATTGACTCTGCTTCTGGCATAACTTGAATAGAAAATCATATAAGGGTCTATGATGG
-GCACCATGCCCAGAGCTAGTTGGTTTAAATGTCATTCTATTTTGGACCCTAAAGATAAAC
-ATGGCCTACTGTGATTCCGTCCTGCGTGGCTGTTCTCTGGAGCAGTAGTCATTAATCTTT
-GCCTGCCTTCTCTCCCACCTAGGTGTGTGCCACCACCCCATGGTGACATGAGCTTCatta
-attaaaaaaaaaaaaaaCtttttctctcttttcttaatagaaatgaccttggaaaatttc
-tattggtctgtcttcaagttcatttctctttccatatcatatctacatggctgttaagtc
-caaagtttattatttaaataaataaataaaattgataaaactctagccagttgatcaaga
-aaaaagagacaattaccaaattttcaatatcaggtataaaaagaggacatcattacatta
-aaagttttgtgagagatgattctatatgccaaaatttttgacaacctatatgaaatggat
-aagtttcttaaaagatacaaattaccaaaactgacctaagaggaaacataaagtttaaac
-gatgctgtatcaattggagaaattgaatccatagtttagtcttctcacaaagaaactttc
-atgccttgatggcttcactggtgaagtataccaagaaataataatggcaattctacacta
-actctttcagaaaataaaggaggagacacttctcaaatcattcttcgaggccaatattac
-cttggttccaaaaatatgcaaagatatcacaagaaaagagaactatgagccaatatcctc
-atgaacataatttcagaaatctataataaaatattagcaaattgaatgcggtgaagaata
-gaaaggatcatagaacaggacaatatgatgtttatccccagaatgcaaagttgatgtaac
-atcaaaaaatgaatcaacgtaattcaccatattgatggactaaaggggaaaaacatatga
-ttatttcaataaatgcaagaaaagcatttgacaaaattcaaagccctttaaaaaaaactc
-atcaaactaggagagatggtaacttcaagctgaataatgctagctacaaaaaagtaacta
-cagataacatcacctttaacttagaaggctcatgtctttctactttaattaggaacaaat
-ggtaagttgaccacaaccacttttacttaacgtcatactgaaggtcttagctactccaaa
-aaggctagaaataggaataaaatgcatgcatttagaaaaggaagatacagcagattctat
-ttttagtttttaatttttataggtacatagtagatgtatacatttatggggtacaaagtt
-attttgatacaggcatacaatgtgtaataatcatattagggtaaatggggtatccatcac
-ctcaaacatttatcttttctttgtgttatcaacattctaattatactcttttagttatat
-ttaaatgtagaataaattaattttgactgtagtcaccctgttgtgctattgaatactaca
-ttttattcattctgtcttactatattttcatacccattgaccatcccctcctcccagacc
-cccctactacccttcccagactctgatcatcatcattctactttccgtcttcatgagctc
-aattagtaaaactttccttttttgcagataacatgatcatgtacataggaaaccctaaag
-aatccttggaaaagctattacatctaataaatgaatttagcaaagttttgaatgaaagtc
-tgtatacaaaaatatatatgtgcatattttagcaaaaaattagaaaaagaaattttgaca
-aaaactaccctttccataatagcatcaaaaatgaaatatttaggGGCCGGGCATGATGGC
-TCACCAATCTTGTACCCCAACAACCAGAATGATTATTTTTTATAGTTTTATGTATAGTCT
-ATTTTGGTTTTAAAATGGCAAAATACTATATGATTTTATATAAAAACTAAACTAACTTAG
-AAGTATGCAGTAAGAACGTGAAGGTCAAACACGCTGTCCATAACACTTAGGAAAATGAGA
-TCAACAGTAAATAGAAGACTGGTTACTCATCCTACAAGAAATGGTGATGAATAGGCCTGC
-AAAATATCCTGTAACTCCTCTAGAGGGTGCTCACTAGCAGGACATTCACATGCTACTCCA
-TGTGATGTTAGATTATTGTAAAGCATTATGTTCCTATAAAGGGTGGCGTGACAGTCCATT
-ACCAAGCACGAGACCCTCTGCTGATCTGTCCTAACAAGTGGAATTATGATATGCAGCAAC
-ACAGGAACCAGGCTTACGCTAGCCACATTGCAGAGAGACATTGCCAGAATCTCACTTGTA
-GAGGCCACCATCATATACATCAGTAAGCCTCTCTCCCTGGATCCACATCTCCCTCTATAA
-GGAGCCCTGTTAACCCCATCATTTAAGGGCTTCATACATTTGCCTTATATTTCTCTCATA
-AACAAATCAATGAGTTCCAGACTTTTGGTACAAATGTATGAAGACAGAAGAAATCATATT
-TCAGtcttaaaagcctaatcccagaagtgacacccatcacttcacattccattgccaaga
-gcaaatcacatgaccacacagatgcaaggggaatgagacattggcaaccacttcccagtg
-aCCATTATATATTATAGAAGGGGGGCATGCATGTAAGAGGAAAGTTGGTCTTCTCTGACA
-GAGACGTAGAATTCTACAAACATAGGGGAGGACGTTAAAAGGTGCTGAGCAGATAAAGGT
-CAAATGTCTGTTACAGAAGGACACAGGCACCAAAAGATAAAGagatactcctcaatttat
-gagggagttatgtcccaataaactcaccataaattgaaaatatcatacgtcaaaacttca
-tttaatacaactaacctacctaacatcatagcttagccaagcctgccttaaatgtgctca
-gaatatttatttgagcacatagttgggcaaaatcatctaataaaaagactattttataat
-aaagggttgaatatttcctgtaatttattgaatactgtattgaaagtgaaagatggaatg
-gttgtatgggtacttgaagtatggtttctactgaatgcatatggctttcacaccatcgta
-gagtcaagaaatcatgtcaaccatcataaataggggactatctgTATGACAGTAAAAACC
-ATTTTGTTACACAAATAGCAATCATCAAAAAAGAAAACACAGCAATTTCTGTTGCATATA
-TCCAAGCATTCAACAACAAAAGACCTTTCATTTTAATCAtttttttaagacacacggtct
-gactctgttgcccaggctggagtgcaatggtacaatcatagctaactgcagccccgacct
-cctgagctcaagcgatcctcctgcctcagtctcttgagtagctgggactacaggtgcgca
-tcactatgcctggctagttttttctagaggcagagtcttgctatgttcctcagactggtc
-tcaaactcttggcctcaagtgatcctcccaccttggcttcccaaagtgctagaattacag
-aggtgagccacagcacctggccAAGAATAGACATTTTATATCAAAGTAATTCAAGTATCT
-ATATGAACAAGTAATCGTGCAACTAGGTAATCAGGGCTTTGACCAATTTTGAATTACACA
-ATTAAAGTGCTAATATGTATTGTATTATACTGTATTTGCTGTAGCAATGCAAAAACTTCA
-TTGTTCTTTGTCCCCAAATACAACTGTCACTTATATTTCACTGTTTATGCTGCTAGTACA
-TAGCTTTATAAATTAATCTATCTTGTTTCTGACACTTATACATATTTCATCCTCTGGGGA
-CCTGGAGGAGCATATTCTTTGCCCCACCTCACAATTACCTATGCATATTTCTCAGTAACA
-GGCATAAGGCACGCTGCACAATCTTAGCTGATGAGATAAGAAGTCTCTCCTAAGGCTTTA
-CTCGCTGGACCATGGCAGAAATGTGGACAAGAGTGGTTGCAGAACATGCTGTGCCTGGGG
-CAAGGACCCTCTAATAGAACTAGAAGAGATAAGTCACAGGTACAAGGAGTGTGCAATCGG
-TCTGTTCAGCCACAGTTGCTATTAGAGGCCCCTGAAGAATTTGTTGTACTTTCCACGCTA
-GGCTACCTCGATCACAGAAATCAGCCTAGAGTCATATAACCCAAAGGGGGAGCTGACATT
-GCTGCTAAGCCCTCCTCCTGAGGGCCTTTTATCATCTCGTCCTGTAACCTACCTTTGCCA
-AGACAATTCCTTCAATCTTTGCTTTGTTTCAGGGAACAGTAATCCTACTAAGACTCTAAC
-AGTAGGGACGAGAGAAAGGGATGGAACAAAGGAGTGAGGCAAGGAGGCATCAGATGAAAG
-TGAGCTAATAATCTGTTGGCACCCATCACAtgctgagtacttccacttacattatcacac
-ttaagatgcacaatactttgggcatgatgtcactgccagcaaatctgaaattaggaaact
-caggcccagaagatatgaagtgacttttccggggtatcattaatgcaccagcagtgtaag
-ctaaattgaatccattctgcctgacaccaaaatcgtattcctttcCTTCCCTCCCACAAT
-TGTTTCCATTGGTGTATAAAACCTCTAAAGATCAAGATGTGGCTTCCTTCTTTAAAGAAA
-TAAAGCTGAGGCTAGGTAGTGACAGGTGGGGGCAAGTATGACCATCTATGAATGTTAAAT
-CTCACCCTCAATCCCACCTTGTAGTTTACCATCTATAGACTTGGCCTTCTTTAGATGAAG
-CAGTGTTGTAGGGgcctttctcaactggtgttcctcattcgaaccacagaacacagaaaa
-tgacttaggtgactattttcccaattcttccaaagatgatacatatgaataccattctag
-gtgcttagaagaaaggttaatccaaacacaatggatgtgtttggttgttaggatttaatt
-tgcttgcagaaacccaattgagacatgctgGTAGGGAATCTCTAACATTGGTCCACTGTA
-GAAGACAGAGGAGACGATCAATTTATTTTGTCTATCAACCTGCAGAAATAAAGAGTTTTG
-GTGGAACTGTAGGTAGAGAAAGAAGGAGGTACCTTCCCATGGCCTTGATGAGCCTGAGTC
-TTTCTAAATGCCAGGAAGGAAAACTACTCAAATTAGCTGTAACAGGGAGTTATCACAACA
-ATTTTTATTCTCTTGGGAAGTGCTAAAACAAATATATATGGAAATCTTACAGCCAACAGA
-AACGAatttcccactgctttcctccctcccaaactttcccactgtccctaattgaaaccc
-cattggaaggtaactaaatcctgtacaaccagaatctcctcatctaacttttcatttctc
-cctgtgttaaattaatcctgtttctccctcatggattcaccatcaacttgtactctcaag
-ctgatgctgttcattttcccacttttcatgactcaaggccaaaaggttggtatggcagct
-tcctcccttcccaatgttattttgaaaacattgcttctgtagtgtaaaatccccaactag
-tcaagactcaagtcagctcttttcaatgcctcttcaaccatctttattgttatattttaa
-aaagcagccccccatttattgaggactttggcactttgtttagaatgtatctattctgat
-tattgcctttattattggtgacttcagcatccatatggaaacactatccagttctacaaa
-tgttcagttatttgtcctccttaatgtcaataatttacctgctattctactcctgatttc
-tggccatagagctgtccacgtcatcatcaatgaccactccacacatgaactctgaactcc
-taccaccttctctgatcacacccaggcaccttttcagctccctcattttattatagaaca
-tgcatccgccagacgcttcctccttcacttttctattttttttttttttttttttttttg
-agatggagtcttgctctgtcgcccaggctggagtgcagtggctcgatctcggctcactgc
-aagctccacctcccgggttcacgccattctcctgcctcagtctcccaagtagctgggact
-acaggtgcccaccaccacgtctggctaatttttttgtatttttagtagagatggggattc
-accgtgttagccaggatggtctcgatctcctgactttgtgatccacccgcctcagcctcc
-caaagcctccttcacttttctttattagcctcaaccccatgattcaccactccaagtact
-cccttgccagcatcctcaaatcccaataccatttttaaaattttttaaagaatttctgca
-cccacctgtgtgaaaagttcaacccccagatccttttaactgtttgtcttctccacagac
-aaattcaggctgatgagcagtgctggaaaaagtgcacagctgcgcagattagtggcacct
-gcattcatgatctccagttttcacaaagccctcaGCAGCAGCCACTTGGTTCCCTGTGTG
-CAGCGTTCAGTGGAaaactccatgagggcaagaacaatatctgcttttactcattatttt
-aacccacttgaatgttaagctccatgatgacagggactttctgcggtatagattattacc
-ggcccctaagacagtttctggcacataatagacgctcaataaatactcagtgaaggaata
-aaATAAATAGGAGGTTAAAATTAAGTGATCAACAGTAGTCCAGGGTATTAAAGagactcc
-ccttaaaagctgcaattaagcagagtcatgagaggtgagtaggagctagcctgagaggaa
-atggaaaagacagtattaaaggcaggttgaacagcGCCTCTGTGATCCCTCCCTCATGCT
-TTACACACAATCGTTCTGAGTATTCTGTACTCAAAGCCCTTCCATTCTCTCCAGTTCCAC
-TGCCGCTCCTATGCACCCTCAGATGCAGCCTCTGTATTTCAGCCAGAATGGTAGCTCTAA
-AAGGTAATTCTGCTCATTATTTTCAGCTTCTATTTGGAACTCCTCTCAGAGCTCTCTAAA
-TTTCCTCAAGATATCTATCAGTTAAATGTGTTCACCcagtggtcttccatgtggtttgta
-tatgccaaggtatccccaaaaccctttgaaggagtctgcaaggtcaaaattattttcata
-acaatatttttaaaataactagtttcataataatattttgccttttcacaaaattgacat
-tggctctgaaaatgcaaactgaagcagataaaatagctagtgcctcaccacaaatcaaag
-caggggcacaagtctataattagaagttggattctttatcaccaagcacttgtaattttt
-ttaaatgccactcttaagaatatacttgacaaagtataaaaatttttaattttattgaat
-cccttgagtaGATTTTGTTCTAAGgttaaagtaaattaaagtggaaaccaggcctggaga
-atccatgagcagacaaggcctcttaagtgctcataacttttcttgatttgcaaacgtaag
-caaaacttaattggagctatttcttgtaaatgcctatattaaagaaaaatagaacttaat
-ctcaaccaatcaaaagcagctaactaactcgtaattatataagaaggtacttcccagcag
-gatagaccaaataagacaaaatttgtaactataaccaatcaaatattttatttgtattat
-ttccacacttactgcataaaagcgtgttccttacCACttttttttttttcttgagacagg
-gcctcactctttcacccaggctggagtgcagcggcatggtaatggctcattgcagcctcg
-aactccggggctcaagcaatcctcccacctcagccttctgagtagctgggaccacaggca
-cccaccatcatgcctggctaatAtttttttttttttttttgagatggagtctggctttgt
-cacccaggctggagtgcagtggcgcaatctcggctcattgcaagctccacctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacaggcacccgccactacg
-cccatgcccggctaatttttttttcttttttttcttttttggtagagagaagggtgtcac
-catgttgctcaggctggtttcaaactcctaggctcaagcaatcctcccaccttggcctcc
-caaggtgctgggattactggcaggagccaccatgtccagctTccttaccacttcttaagt
-gaagaccccgaaccacttctggtttggagttgcccaattcatgcattgctgtttgctcaa
-ataaactcttttaaaaatttttattatgcctcagtttaccttttGACACTatgttctgag
-taatacaaggaaaagtacatataaagcacttctgcagtataacaagctatgatggttgtc
-gccagaaaaatcacttaaataactatttggattttaaactgaactaggcacttttttatg
-aaacatcatttttatttgaaagaatgatggaaaaagtatggttattcagacttacatact
-tggcagaaattttctcaaaaattaacaaagtgaacttgtcatttcaaagaaaatagctag
-caatattagttaccaatctattcttataatgtgtggctgacaacaagaagtgaagtcact
-gctccctttccttgaacctgggaagatctttgtaaccaacctgaccagtacaatgcagtg
-gaagaaatatcaggtgatttccaaggcagaacagcttctgactggccctctgtctccagc
-caccatgttagaaggaagttcaggccacatggagacagcaaggcctctagctcacagtca
-gcatcaactgccagacatgtaagtgaatgggcctccagatgattccagtccccagtcttt
-gaggcttcccagctgacgtcactgacattaccatgcagagacaagccatctctgctaagc
-cttaatttttaacccatagagaccatgaaagaataacaaatgatgattgttttgaagcca
-ctacattttggggtaattcattatgcagcaatgggtaaGTAATCCTGGCATCACATGTTT
-TTCAAGAATGGGAATATGTCTTTTTCTTCCTGTCTTTCATGTCTAAGCCCTCTATCAGTG
-GTGCTTGTTGTGTGGAGTTTGGAGCCCAGGAGTAGTCAGAAAAGACTTTGATGACACAGG
-GTTGCTTGTAGAACATCTAATATGAGCAACTCCTACCTTGTGCTCACTGACCAGGCCCAC
-AGAAAAGTCAACAAGGGCAAAAGTTCTTTGCCTCACAGCACAGAACTGCTCCTTCCTCTC
-TGGTGCCTCTCCAACCACAAAATTCCTTGTCCCTGTCTTTGCCAGTCTCATGTTAAGAAA
-CCCCATAGACCCAGGTATTCTCCAATCTTGATGATAGAAGGGGAAACTGAGGAAGAGGTC
-CAGCTCACAACATTCTTACCAGCCCAGGGGGAAGGCCAAGATCTCCACAGAGTCATAAAC
-TCTAGGCCAAGACTATGCCTCTCCCAGGAATATCCAAGTTGGATATACCATATATTTTAT
-GCAgataaaatagctagtgccttaccacaaatcaaagcaggggcacaaatctgtaactag
-aagttggattctttatcaccaagcacttgtaattttttaaaatgccacttttaagaatat
-acttgacaaagtataaaaattattaattttattgaatcccttgagtaGATTTTGTTCTAA
-Ggttaaagtaaattaaagtggaaaccaggcctggagaatccatgaaaagacaaggcctct
-taagtgaTAAAACCTGTATTATTCCTACAGAGTCTCCTCTAATGTCAGCAACTGTCCTGG
-TGTCTCAACCTGTCTTTACCACCTTGATTTAGCCATCATGAAAGATCAGCCAACTCTATG
-TTATTGTATTTTTATTTCCATCTCTACTTTTTATTACAACAAAGGTCCTACTTCGTTGAA
-TTTTCCCTTGCTTTTAAAAAAACGGAAGGTCTTTAACTTGTTCTGAAGAAACCTCCTGTG
-AATTTCAAAAGGGCTCCCTATCTGTTGCATGTGGGGAAGGGCCACGCACATCCACATTCC
-CTTCGTTCCAGGGCACTGGATTTTCAAATATTGAGTTCTTGCTGTCTTCAGTCTTTGAAT
-AAAGCTCACGTGGACAACTATGAAGTTTAAAAGCATAGGTTGAGTTTGGGGTATAGTCAT
-GAGAATAGAGAGGAAAGAGCAGAAGTACAGCTCATTGCAGAGGACAAGCATCATGATATT
-CAGAACATTTGATATGGAGTGATATGGGGTAAGAGTGAGCTGGGTTTTATTCTGGGAAAT
-CACCCAGccctgaaaaagctatttatattcttttgttcactttccttatctgtaacacag
-agaccgttatgccaggtttcctagctactttagttgttgtgaagCAGCATATTATAAATA
-TCATAAAAGATTATCCAGTgctaggtgccatggtgcacagctgtaatcccagctacttgg
-gaggcagagtcaggaggatcacttaagcccaagagttcaaggctgtactgcactgtgttc
-acacctgtgaatagccactgcactccaacctgagcaacacagtgCCTCTTAAATAtgtat
-atgtatatatatatatatgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtATAT
-ATATATATATATACTCTTTTAAATTTACTCTGTTTTAAATATTTTGAGGCAGAAGCAAGA
-CGTTTTGATACAGAAAGCCAGCAGGTTGCTGAATTACAAGACTGAAGCTGAGGAAACTGT
-GTTTATCAATAGAGATGCACCGCTCATTCTTATAGAGGGAAGAtacaaagtaactctatt
-aagtcaagaatttctatatgttttatttactgcaatatcctcagtacatagacagcagtt
-gacatatagtattgatcatagtatctaatgttcaatagatatctgctgaatgaactgaaA
-AATTAATAATGTTGAGCAATAACAGGTAATCACTGTAAGATAACATTCTGAGGAGACTAA
-AATTTGAAGAATGCCTACAAGAGAGGGAGATGCAAAGGGAAAACATATCCTAAAAAATGA
-AATGAAATTATCCTTAAGAGAAAAAAGAAACACCAGTATGATCAAAGATTGCAAGAGGTA
-GAAGACAAAACTGCATAAAGTAAAACAAAATGCTGAACTCTTGAAATGCAAAAATCCAAA
-AATCCTGTTGCCTGTtttttttttgtttgtttgtttgttttttttgagatagagtttcac
-tcttgttgcccaggctgaagtgcaatggcaccatctcggctcactgcaacctccacctcc
-ttggttcaagtgattctcctgcttcagcctcccaagtagctgggattacaggcgcccacc
-accatgcccagctaattttttgtatttttagtagagacgggtttcatcatgttggccagg
-ctggtctcgaactcctgacctcaggtgatccacccatcttggcctcccaaagtgctggga
-ttacaggcatgagccactgcactcggctGTATTTTTTTTTTTCACTTATTTAGAAGGCTG
-ATTTATTATCACCTCCTGCCAGTCACGGGAATGAGACAGAATCACCTTGAGAGTATCTAC
-AGGGAGAATCTGGAGTCCAAATCCCTTCTTAATCAAGAAATGCTCTTTAATCAACTCCCT
-ATATATAGGGAGGTTGATGCTGGGACAAGAGGGGCTGAATAACTTGGGGTTCTAGTCTTG
-GATATGGAATGGGGGCAAGTGTGTACAATCTCTTTGATTTTCCCCAGGGCTTCCATCAAT
-ATTCCAAAAGACTAGAAATTCTGGACAGCAGCTTTTCCCTTCTCTCCCTTTCACACTTCA
-GTGACTTCTGTCTTCATCTTAAGACACTAATCTACACCCAATTTTCTCTCCTTCCTTTTT
-GCAGGAATGCTATTCATTCAAAAATGCTGGGATGAAAGAGCAAACTTGCAAGGATATCTG
-CTACAATAATTAAAGAGAAATAGATGCCTATAATTAAAAACATTGCTGCTTGTCTCTGAA
-ATTATTTGAACACTGTATACATCATAATGTACATAATCAGTTTCCATCTGATATCCCAGA
-CATCTAATCCTGGAAACAACGTCTAATATCTCTACCCCAAAGCAATAGAATTAGAGCTGG
-AAGGGGCAGGTAAGCAACAGTGTGGACCTTTctcagcagcagtgaacttggggtgctcac
-aacctgtgcaaaaccagctgtggtggctaaggattgcctatgtcacctctcccccaactc
-taggcaatgcagcttggggatagactccttccacttgggggaagaagagggaagagtaca
-gagggctttgccttgcaacttgggtaccagctcagccacagtaaagtaaagtatcAAAAG
-TTacccagcatggtgccagctgtggtggccactggacttgcccttcccccaactccaagc
-agcctggcacagagagagagactccttttgtttgggggtaaatgagggaagagaagaaga
-aactctgcctggtaacccagggaatttggccaaatttaaaccccagcccactaaggtggt
-tcctctaggactcagcgagagttgcagtgtttctgagcttagggcaccctctagtgctga
-tatagtttcaataatcacaggctcaaatcacaacactcaatctccttcaaatacctgaaa
-agccttcccaagaaggatgggtgcaaacaagcccagattgtgaaggctacaatatgtatc
-taactcttcaatgcccagacatcaacaaccatcttcaagagttaagaacatccagggaaa
-tatgacctcatcaaatgaactaaataaggcatcagtgaccaatctgagaatgatggagat
-atgtgactttttagacaaataattcaaaatagctgtcttgatgaagctcaacaaacttca
-agacaacacagagaaagaattcagaattacatcagagaagtttcacaaagaaattgaagt
-aatttctaaaaaatcaagcagaaattctggcactgaaaagtttgattgtcaaagtgaaaa
-atgcataagagtctttcaacggcagaattgatcaagcagaaggaactggtgagaactggc
-tatccaaatatacacgaagccaaaaaaagaattaaaaaagaataaagtatgcctacaaaa
-tgtagaaaatagtctcaaaagggtaaatccaagagttattggtcttaaagaggatgtaga
-gggagagaaaagggtaaatagagagatcttttcctcagcacatggaacattttgagagat
-cagggtagaaaggtcagagaaataaaaacaaacaaccttccaaacctcaagaaagatata
-aacatccaggtacaaaaaggtcaaaaaacaccaagcagattcaacccaaataagactacc
-tcaaggcttataataatcaaactttcaaagatcaaagataaagaaaggatcctaaaagca
-ccaagagaaaagaggcaaataacatataaaggaactccaatacatctagcagcagacttt
-tcaacagcaactttacaggccaggagggagtgggaaaacatatgaaaactgctgaaggaa
-aaccaaccttcaacctagaatattatctccagcaaaattatcctctaaacatgaaggaaa
-aatagtctcccagacaaacaaaagctgaggaatttcatcaataccagatctgtcttacaa
-gaaatgcccatgggagttctccaacctgaaataaaaggacattaactaacaacaagaaat
-cgtctgaaggtataaactcactggtgatagtaagtacacagacaaatacaaataccctaa
-cactgtaattctggcatatgaaccgttcatatctttagtagaaagactaaaagacaaacc
-aatcaaaaataataatgacaacaactttttaagagattgtataaaaagatacagagacaa
-taaaaatcaaaaagagtgtagagtgtagagtggttgtctctttgcttgttagtctgtttt
-tcttttctttttaatcaggattaagttgtcatcagtttaaaataagtggttataagatgt
-tatttgcaagcttcatggtaagtacaaaacaaaaacctgtaacaaatatgcaagaaatta
-aaacatactaccacacaaagtcaactttacacaaagaaagatggaaggaagggagggagg
-gagggagggagcagggaagggaaggaagggagggaagggagggaatggagggaaggagga
-aaggagggaaggagtgagggagggagggaaggagtgagggagggagggaaggagagagga
-gaaaaggagggagagaggagaaaaggagggagagaggagggagggaggaaagggagggaa
-ggagggaggaagggagggaaggaaggaaggagggaaggaaggaaggaaggaaggaaggaa
-ggaaggaaggaaggaaggaaggaaaaagaggaccgatgaagcaaccagaagataaatttt
-taaatggcagttgtaagtccttatctattaataagaacattgaatgtaaatggactgaag
-tctccaatcaaaagacatagagtggttgaatggataaaagagcaagacccaactacatgc
-tgcctatgagaaactcacttcacctataaagaaactcatagactgaatataaaggaatga
-aaaaagaaattctatgcaaatagaaaccaaaaaagaagttattatacttatatcagataa
-aaatatctttcaagacaaaactgtaaaaagagacgaaggtcgttgtttaataataaagga
-gtcaatttttgcaagaggatataacaattataaatatatatgcacccaacactagggaac
-acagatatataaagcaaaaattattagttctaaagagagaggtagaccccaaaacaataa
-tagttagggacactaacaccccactttcagcattggacagatcatcaagacataaaatcc
-acaaagaaatatcagacttagtctgcactataaaccaaatggacctaacagacatttata
-gaacatttcatccaacagccatggaatacacattattttcctcaccatatgaacattctc
-aaagataaaccacttgttaggccacaaaacaggtctcaaaagaatctaaataattaaaac
-catatcaagtatcttttatgaccacagtggaataaaagtagaaatcaataacaagaggaa
-ctttgaacactatacaaacacatggaaattaaaaaacataatcctgaatgaccgttgggt
-cattgaagaaattaagacagaaattttaaaatttcttgaaacaaatgaaaatggaaatac
-aacattccaaaacctatgggatacagcaaaagcagtactaagagggaattttatagcaat
-aaatgtgtatatcaaaaaagtagaaaaaatgatcaataaagcagtctCAGTATCAAAAAT
-TATGCCATATGTCATTCCCTTCCCCAATATAGAAATTATTTAGAAATCAATAAcaaaaag
-ttcaagaaaatgtatattatgaaaaaaatcatgtaagaatttcaaaatgttttgcaccaa
-aataaactaatactaactggttataaaatgtttgaacaagatctagtttcagacactaaa
-aaagataagacatcagtctgaaaagagcccctatcagagcaacatgaattctgctaaaat
-tgaagcaagaacaaacatcaaatgtacagtgaagcttgggtagaagaatgatgaaatcat
-tgatgctttacaaaaagtctatgggacgatgccccaaggaagtcagcagtttgcaaatgg
-ataactcattttaataagggatgagataatattgaagatgaagccaccagcagcagacca
-cccacatcagtttgggaggaaaaaattaatcttgttcatgccccagttgaaaaggactga
-taattaacagtaaaaacaattgtcaacatcatagacttctcagttggttcagttaatgga
-aatctgactaaaaaattaaagaagaacaaactttccacttgatgggcgccaaaaccattg
-tgccaaaatcagctacaaacaagagcacagctttcaatgaaactttaaacaagtgggatc
-aagatcctgaagcatttattcaaagcactgtaacaaaagttggaatctggctttaccagt
-atgaccctgaagacaaagcaaaatcaaagcaaagagatggaagtgatccagtccaagcaa
-aagctgaccagttaagaacaaaagtcatgtcaacaatttttgggggtgcacaaggcattt
-tgcttgttgactttctggagggccaaagaacaataacatctgcttattatgagagtgttt
-tgagaaagttagccaaagctttagctgaaaaatacccaggaaaacttcaccagagagtcc
-ttctccaacatgacaatgctcctgctcattcccctagtcaaacaagggcaatttttcaag
-cgttttgatggaaagtcattaggcatccacattgccatcctgacatggctccttttgact
-tctttttatctcctaatcttaaaaaaaaatctttaaaggacaccaatttttcttcagtta
-ataatgtaaaagaacactgatgtggttaaattcccaggaagctcagtccttcagggatag
-actaagtggctggtaccattgcttacaaaagtgtcttgaacttgatggagcttatgttga
-gaaataaagtttatatctttatatttttatattttaatgtcatcttccacaaactgtttg
-aagttccctcataactaaaatgtccccacatgctcagataagaaacacatttctcaacca
-atgtttctcagatattaaagtacatacaaatcacctgaggatcttcctaatacgcagatt
-ttgattgactcattctgagatgaattgaaatcctgcatttctgacaagctctccggaagt
-gttgatgcttctggtctttccaccacactgtgaatagcaaggttcaaactaattcatatg
-tcagaaaagatgacacagtggaaattgaagtgtttatttttaagtgaatgattatgataa
-caaaacactgcaaataaaaacttatgaagtccagctaaagctgcatataaagggaaaatt
-agagtcttacccacttggttatactgaagaaaagctgaaaatgtatgagataacaacaca
-aataataagttagaaaacaataacagaataaaatgaaattttattcaaagaagttcaaag
-aaaggaagataaagctgagaggagaaaataattaaatattttttaattttcataatattt
-aaaataaaatataattaaataaaaatcaaacatagaatcaacaaaaccaaaagctgattt
-tgaaaagaccaattaattaattcactataggaataacaaagaaaaaattgaaaacacatt
-acccatatgaagaataaaacacgtagccatcactacaaactctatagatagtaaagagat
-caaaggacatattgtgagtgaccttatgccaaaaatgaaatttagaagaaataaacatta
-cttgatgtgacccaagaagaaattgaaaatttgacagttctaaattgttagggaaattaa
-atctTAAATCTTTAAACTCAGTTGAGTTTTTCTGCTACATTCCAATGTCTGATCCCTAGC
-TCTATGGGTTTCAACAGACAGTTGTAGAAGCAGCAGAAAAATATCCTTGCTCTTATATTA
-CAGCTACCGTGGTGTGTTCTTGAAGTCCAGCATGTCTAATCATGGGATCCTGTCACCCTA
-CTTTCCTGACTATGAAAGAACTAGCAGATTCTCTGCTGGGCCAGTTTGTTGGAATGTTCT
-GGAAGTCATTCTGGGAGACCAAGCCCACAGTCAGCTTCTGTAGAGAGTTTATAAGCACAT
-AATTCTGAGTATTAAAAATATTTCTGTTGAAAATAGCTAGTGTTTTTCATTTCCCAACTG
-ATACACATAAATGCAACACTTTGCACATGTGAATAATTTGTCTTTTTACAAAATTATGCT
-ACACTGTTGATAGATTCATTCCATATATACATGCAACATACTTAATTTTTCATAACTTTC
-CAATTCTTATTAACTCAACTTTTTGTTCCATAATAACTGTGCTTCTCTTTGTACCAGTAC
-TTTCCATATTCTTATTGCTTTGGGACTAGCAAGACACAATGAGGTGAATAATGTTATTTC
-AATGCATCTTAAAACACCAGAAACCAATTAATATGCGATATTCAGGATTAACTGATTCCA
-AAGGGCTGTTAATTCCATCTCTTGATATTGACAAGTAGTAAGTAAATATGCCTAAGCTTG
-ATTATTTTTGTTCATAGAAGTAAAATATACATTTCATAAAGTGAAAGTTCATAAGATTTG
-CTTTTATTGTTTTAAAAAATAACAGTTAATTTAAACAAAACTGAGGAGTCATTGGATACT
-ATAGTAGCTAATGAAATCCTAAGAAGACATGAATTTCAGGAAGGCGAGGAACCAGGGAAA
-CTCTTGAAACTTGAACAATTAATAATATTCAGAGCCAATGAGCTTCAATATCTGAGTTTC
-TTAGGAAATGTCCCAAATTAGCAGGGGAAAGCATCTGATTGGTAGGCTTGGTTCTATTGT
-TACACCTGGATCAATCAGCTACGACCAAGGAATCTGAGCAGTACACTATAAAAATTGCTG
-CTTTTaattatttcaaccattgtggaagatagtgtggcaatccctcaaaaacctaaagtc
-agaaataccatttgacctagcaatcctattactgggtatatgcccaaaggaatataaatg
-gttctattataaagacacatgcatgcatatgttcactgcagcgctattcacaataacaaa
-gacatagaatcaacccaaatgcccatcatttggccatttggataaagaatggataaagaa
-aatgtggtacatatataccacggaatactatgcagccataaaaaagaatgagatcgtgtc
-ctttgcagggacatggatggagctggaggccattatccttagcaaatgaaggcagaaaca
-gaaaaccaaatactgcatgttctcacttataggtgggagcaaaatgatgagaacacatgg
-acacacagaggggaacaacacacactggagcttactggagagtggaaggtgggaggaggg
-agaggatgaggaaaaataactaatggacactaggcttaatagctgggtgatgaaataatc
-tatacaaccaacccccatgacacacattacctatgtaacaaaccagcacatcctgcacat
-atacccgcgaagttaaaaaagttTTTTTTTAGTTGCTACTTTAAAAGGATGTGGGAATCA
-TTGTAAACTCAAAAGTTAAAGATGTGCCAAGAGCTGTCTCCCACGAACTTGTTTAACAAA
-CGTACTGACTTTGTATGTTGATCCAATACCCATGCTGGCCACTGGACATACCAGTACAAA
-CAAGGCAGAATCTTCACTCTCCTCTAGCTCTTCTAATTCTCATGCACTAAGTGCCAACCT
-TAGCATAACTGGGCTGACAATCAGTGAATCAAATATCTAACTCTTATCCTACTCCAACGT
-TAAGAAAGAGACATGCgactgggtgcggtggctcatgcctggaaccccagcactttggga
-ggccaaggtgggcggatcacttgaggtcaggagtttgagaccagcctggccaacatggtg
-aaaccccgtctctactgaaaatacaaaagttagctgggcatggtggtgcatgcctgtagt
-cccagatactctacttgggaggctgaggcaggaggattgcctgaacctgggaggcggagg
-ttgcagtgagtcgagatcacgccactgcactccagcctgggcaacagagtgagactccat
-ctcaaaaaagcaaaaGAGAGACACATGCAAAGGGCTTGCTCTTTCTTTCTCATCTTACCT
-ATCTTATGTTTTCCTCCAGGATCAAGAGCAAGGAATTTGTTGCATAGAGGTGTTCAAGAA
-AGGGTGTTTTCAAACAGAGTCAGAAAAAACACAACTATACTGCGAGCAGCATACAAACCT
-GCTTTGGCTGCACTTCACTGCTCATGGCATAAGGCCACGAAGAGGCCAATAAAGGCTGGA
-GCTCAGGAGCATCAACCCAGATTCAAGGCTTCCTCTCTGGCACCCAACCATGAAGCTCCT
-TTTTCCTATCTTTGCCAGCCTCATGCTACAGTACCAGGTGAACACAGGTAATGTGGATTC
-CCAAGTTTAAGATGGGTAGATGAGAGGAACCAAGGATTTGGCTGCCCATGACAATGGAAA
-CCCAAAGAGAGGAGACTGAAAGATTAGCTGTTCAAAAAGATGGCTAAAGAGCTTACCTAT
-TGTATCAGTCATGCACTGATACATTCTCATAGGCCCCAACTGCCAGATTGTGTCCAGTGG
-AAACACCCAGGAAGCTACAGAGAAAGCAGGGTATTTTTTGTCTATTCAGAAACTATCCAA
-AATATAATGCTGCCTTCCTGCCCTGTATATGTCTATCATGCTAAGACTAAGCCCAGGTCT
-ACCTCCTTTTAGCTCTATTTCTATCTTAAAAGCCCTTTTTTTTTAAAAAaagtcctgggg
-tacttgtgcaggatgtgcggtttgttacataggtaaatgtgtgtcatggttatttgctgc
-acctaccaacccatcgcccaggtattaagcccaggatgcattagctatttttcctgatgc
-tctccctccacccaacaggccccagtgtgtgttgttccccttcctgtgAAACCACCTCTT
-GAAGCAAAGTTTCCTATCAGTTTGTGCTTGGTGTAGAAAGGAGGAAGTTCTTCCCTCATG
-CTCAAAAAAAAACCCTTTCAAGATCAAGTAAACAGGCCTGTGTTCTCCATCTTGAATTCT
-TTCAGGTTTTCCAGAGCCTTTATCGCTTCTCTCAGACTTTGTCTTCCTGAAAACCCCCAA
-ACTACCATAAGGGCATCTAGGAATGCATTATAGCAAAAGGCTAAGCCAGGGGATTAACCA
-TTGTTTTTGGAAAAGAAAGGAGAAGCACTGAGATTTGTTTCAGAATACAAGAATCATCCA
-GCTATTTGAAAAAATTAGCAAAGGGTTTCGGGGCAGGGAAAGTGGAAGTGTCAAAGATGC
-TTCTAATGTTTTTATCTTCTAATGTTTTTATCTTGGGACCCTAGGAAAAGGGTAGTACCA
-TAAGCAAGTAtggctgtgtcatcttgggtaaagtcacttaaccactttgaacttcaattt
-cacatgagtataatggggttaatcaatgcAGCTGATTCCAATATAAGAATTTTTCTGTTT
-CCCGTTTGATGAGAAAACAATGTGGAAATGTATGCAAATATGCTTTGAAAATTAGCAGAT
-GCTACATAAATCTCTTGTAATTTAGGGAAAATCATTGGGTTATTAAGATGAACAAGGGAG
-AAAAGCTTTCTTGATTCAGAAAAAAGAAACACGAGACATTAGGATGGAAAAGTCATTCAG
-CAGATAAAGATAAGGTACTAAGCCGAGCAGGAAATTTAGAATTATAGATAACAATACAGA
-AGTTACCTTGGTGGATATGAGGTTAAGGCTAGGATAATGAATGAGACTTCTGAGAGATAG
-AGTGTCCAAAGAGGCTAGAAGAGATAGAACACCATGCTTCAGGAATCACAGATCTAGTGA
-TTGTTGAGAAGAGAGAAGTCATGGGCTACTGAGTTTGGTGAAAAGATAAGACTCCTGAAA
-ATTCTATTGATTCTCTTTTGAACTTCTTTCTTAAATTAGTTTTATGATGGACTTGGCTCT
-CATTGGTATTTCCCAAGATTATGGAGATGGGATAGTGATGTCTGACAAGTACCTAAGATG
-CTAAGTTGAAGGTCTAAAATTCCATCCTAAAAGCAAATAATTACTCTATCATCTACGTGC
-CCTTTGCTTCTTAAAGTTACTCAAGGAAGGCAGACTAAACAGGAAATTTACTTTGGATTC
-AAGAGGGGCATAGAGACGCTCTCAGCCTGCCCATTTGCCTTCATCAACATTCCTAAACAC
-TGGGCTTAAAATGTAGTATGAGTAAACTCTCTCTTAGTCTATCCATCTCCCACTAGCAGT
-TTTAACATCATCTCTAGTTATTAACCTTGGCTCAATGGCTTTCTCTTTTTTTATACAGAA
-TTTATTGGCTTGAGACGCTGTTTAATGGGTTTGGGGAGATGCAGGGATCACTGCAATGTG
-GATGAAAAAGAGATACAGAAATGCAAGATGAAAAAATGTTGTGTTGGACCAAAAGTGGTT
-AAATTGATTAAAAACTACCTGCAATATGGAACACCAAATGTACTTAATGAAGACGTCCAA
-GAAATGCTAAAACCTGCCAAGAATTCTAGTGCTGTGATACAAAGAAAACATATTTTATCT
-GTTCTCCCCCAAATCAAAAGCACTAGCTTTTTTGCTAATACCAACTTTGTCATCATTCCA
-AATGCCACCCCTATGAACTCTGCCACCATCAGCACTATGACCCCAGGACAGATCACATAC
-ACTGCTACTTCTACCAAGAGTAACACCAAAGAAAGCAGAGATTCTGCCACTGCCTCGCCA
-CCACCAGCACCACCTCCACCAAACATACTGCCAACACCATCACTGGAGCTAGAGGAAGCA
-GAAGAGCAGTAATGTGGATCTTTCCCTTAAAACTCCAAGTTCCTCTCTATTTTTGCTATC
-TATAAAATGACATAGAACTGTTTCCTCTGTCATCAGTCATTCAATAAACACTGTTTGAGC
-ACCTACAGTTTATGTAATATTATCATTCTCACAAGAGCCTCACAGAGGGGGTAGAGCTAG
-GGAGGGATGGAATTGTTTAAGTTTAGATGCCCAGGAGAAAGTAAGCCTCAGGAGGGTGAC
-TACAGCATCGAGTTTGTCCCAAGCATGGCCTAGATTAGGCCTCTGTAGCAAGCATTTATG
-TCTCTCATATGGTGTGTTTTTCCTGGAGCAACAGTAAGGAAAGCATCAGGAGATGTATTT
-TCTTTTCTCATGTATTTGGGAGGAAAGGCCCAAATGCAAAATAGAATATGTAGGAATCag
-aaaaaggttaaattaattgtaataatatatttttgtttcgttttgttttgagacggagtc
-tcactcagttgcccaggctggagtgcagtggtgtgatctcagctcactgcaactccacct
-cccgggttcaagcaattctcctgcctcagcctcctgagtaaccgagattacaggcgcaca
-ccaccacacccagctaatttttgtatttttagtagagacggggtttcaccatgttggtca
-ggctggtctcgaactcctgacctcgtgatccgcctgcctcggtctcccaaaatgctggga
-ttacaggcatgagccaccacacccaaccaataatgtgttttattgaatgcaatatatcca
-aaacatgatcatgttgacatgtaatcaatgtaaaaattatttatgagagagtttaccttt
-tttggactacatctttgaaatctcatatgtgtaattacacatagagcacatttctattca
-tactagccacatctcaagtgctcatagtcatatatgaatagaggatttcatagcatattg
-aacagcAACAAGGCTAGAGAGTTTTAGGGCACAAGTAATTATAGTGACTCTTAGGCATAG
-GGGATGCCCCTAATCCAGAGGAGACAGGCATATTTCTGAGGGCtgtggcatataatttaa
-gagtatagaaattcaggtctgatatgcccggactagcatcctagattctggcacttttta
-gctgtgtggtcttgaacaaatcatttatccacacataagcatcagtttatttattcataa
-aatggagatGTGAACATTATATTATATCCCAGAAATCAGCAATCTCAGATCACTCTTCCT
-CTTATTGCCCAAATTACAATGGCACAGCCACCTATTCTAGttttttaatagctttattga
-agcataattgatatacagagaattgaacatatttaatgtgaataatggcatgagtttggg
-catatgcaaaatcctgtgatactatcaccacaatcaaggtgatagacgtatacatcacct
-cccaaagtAacatgaccatatttgtagaaaaccctgaaaacttcacgaacacacacacaa
-aaatgtagaactaagaaatagattcaaaaaagtcaacatacaaatatcagtggcatttct
-atacacttaacaatgaaccattccaaaagaaaatcaaggaaacaatctatttacaaaagc
-aacaaaaagaataacataggaataaacttaaccaaagaagtgaaagaggtacattaaaaa
-cttaaaaatattgatgaaaaaatcaaaggaaacacaaataaatggaaagatattccatgt
-ttaggtattgaaagacttaacattgttaaactgttcattctgtctaaagcaatctacaga
-tataatacatctccccccttccaaatcccaatggcattttttaaagaaatggaaaaaaca
-atcctaaaattcacagggtaccataaaagacccagaatagcaaaatcaatcttgagtaaa
-aagaacaaagctgaaggcatcacactttcttatttcaaaatatattacaaaggtatagta
-attaggccaggcgcagggactcacgcctgtaatccagcactttgggaggccgaggcgggc
-ggatcatgaggtcaggatatcgagaccatcctggctaacacggtgaaacctcgtctctac
-taaaaacacaaaaaacaaaaaatagccgggcgtggtggcgggcgcctgtagtcccagcta
-cttgggaggctgaggcaggagaatggcgcgaacccgggaggcggagcttgcagtgagccg
-agattgggccactgcactccagcctgggcgacagagccagactctgtttcagaaaaataa
-ataaataaataaataaataaataaataaataaataatggtgttgggaaaactggctaccc
-acatgcagaagaatgaaattggatccttatctcaccccatataaaagaaatcaactcaaa
-acggattaacgacttaaacataagacctaaaactgtaaaactactagaagaaaacacagt
-actgttctgtatttaagctccatgacatcgttctgggcaatgatttcttgcatatgaccc
-caaagcacaggcaacaaaagtgaaaataggtaactgCATCCAGATTTTTTAACATATTCT
-TCTCTGCTACATATCACCTACCTCCATTCAAAGGTCACCTTTCCCCATCCTACTCATTTT
-TTAATACAGTGTCACTCTAAGAAAGACAAAGATTTTTCATGATGCCCCACAGTGATTCTA
-GAATATAACTAAAAAATATTTTCCTGGAAGTTTTTGCACAACAGAAAGGAGTTGCAATAC
-AAAGCATAAGTTTAACACCTGCTAGATATGTGTTCTCTGAGGAACCCCAAGCCTACCTGA
-TGGGTGTCAGATTCTCTCCCTGCTACAGCTATTTGTCAAACTCTTGAAAGTCCAGCTTTC
-CTTCCCATGGAAGGAAAATTCCCACGGAATGCTCTCTTCCGTGTTTACCCACAGAAAGGA
-GAGAAAGGTTCTTTCTCACACAAGTCTAAGGCCTTCCTCTAAGTCACCTTTTCCTATCAT
-AGAACTCACCCAGCACTTCTCAGGATAAATGATACTGCAGAATATGAGTTTGCTTCAGGG
-AAATCCCATACCCACTGTGAAAAATATGGTAACTctccaatatcagttctccccctttgc
-taagtaatagaaccctccaaatattaggttgacacaaagccgaccagagaaaaggctgaa
-tttcccaTCTAGAACTGGTCATTCTTCAATTCAGACCAGCCATAACTGGACACTTTTGCA
-AATATTCATTAATAGTCTTGGTGAAAACCTCAGATTTCCATTTTGCCAAAGTTTCCAAAG
-GAAAAGAGGGCCTTTTTCTAAGCCCTGAGAGCCCCACAGTGACAGTAAGTTCTCCCTTGG
-AATTCACCCTGGCATACCTCGGTGCTACCCCAGATCCTTTCCCTCAGGGGCTATGAGATT
-AGGTTTCATggccgaatgtgacggttcatgcctttaatcccaacactttgggaggccgag
-gcaggaggatggcttgagcccaggagtttgagaccagtctgggcaacatcatgagactct
-gtctatgtaaaaaataaaaattaaccaggtgtcatggtacataactccagtccctgctac
-tgtggggcaggggctgtgggggctgaggagggaggattgcttgagcccagaaggttgagg
-ctgcagtgagctgtggtcgtaccactgcactccagcctgggcaacagagcaagaccctgc
-cttttaaagaaaaagagaaaGGAggttgggcatggtggctcatgcctataatcccaccac
-tttgggaggccgaggcaggtggatcacctgaggtcaggagttcgagaccagactggacaa
-catggtgaaaccccatttctactaaaaatacataaattagctgggtgtggtggcgggcac
-atgtaatcccagctactcaggaggctgaggcaggagaattgcttgaacctgggaggcgaa
-ggttgcagtgagtcgagattgtgccactgcactccagcctgggtgacaaaagcaaaactc
-catctctaaataaataaataaaaataaaaaaGAGAGAGAGTGAGATTAGGACTCACCCTG
-GCCATCCCAGGTCCTGCCACTCCAGGTCCTGCCACTCAGGGACTGTGTGACTCTATATTT
-TTTTTAACTTCTCAGGCCAATATTAGAACCCAATCTGATCAAATTAGAAACCTATGAACA
-TTCCACTTACTAGCAGTGCATTCATGGAGCACTTCACAGGGAGTCACCAAAGTATCAATC
-AATCAATAAACTACTACCCTACCCTGAACTAttaggttggtgcaaagtaattgcagtttt
-tgcattgttggaatttgctgtttgatattagaatgcgttcttaaataaatgtggttatgt
-tacactttttttttttttttttttgagatggagtttcgctcttgttgcccaggctggagt
-gcaatggtgtgatcttggctcaccgtaacctcctcctcccgggttcaagctattctcctg
-cctcagcctccctagaagctgggattacaggcctgtgccaccatgactgactaattttgt
-atttttagtagagacggggtttctccatgttgatcaggctggtctctaactcctgacctc
-aggtgatgcacccgcctcagcctcccaaagtgctgggattacaggcatgagtcactgctc
-ccggcctatacatcattttaataggcatttctcactttatgttttttgataatgacttat
-tacttgctgttgattttatgtttattttagactatggaaatgatgtcagacaaaaagaaa
-attcaagcgattttcttattcaagttcaaaatgggtcgtaaagcagcagagacaacttgc
-aacatcgactgcgcatctggtccaggaactgctaacgaacgtacagtgcagtcgtggttc
-aaaaagttttgcaaaggagaggagaacctcgaagatgaggaatgtagtggccggccgttg
-gaagttgacaaccaccaattgagagcaatcattgaagctgatcctcttacaactatacaa
-gaagttgctgaagaactcaaccttgaccattctatggtcgtttggcatttgaagcaaatt
-ggaaagatgaaaaagctcgataagtgggtgcctcatgagctgagcaaaaatcaaatcatc
-attttgaagtgtcgtcatctcttattctacgcaacaatgaaccatttctcaattggattg
-ggacatggcaatgaaaagtgtattgtatgtgacaacctgctacaagcagctcagtggttg
-gaccaggaagctgcaaagcacttctcaaagccaaatttgcaccaaaaaaaaaggtcatgg
-tcactgtttggcactgtgatccactacagctttctgaatcccagcgaaaccattacctct
-gataagcatgctcagaaaatgagatggaaatgagatgcaccgaaaactgcaatgcctgca
-gccggcactggtcaacagaaagggcccagttctttacgacaaggcctgacctcatgttgc
-acaaccgacacttcaaaagttgaatgaattgggctacgaagttttgcctcatctgccata
-ttcacctgacctctcgccgatcgactaccacttcttccaactttttgcagggaaaatgtt
-tccacaatcagcaggatgccgaaaatgcttccaagggtttgttgaatcccaaagcacaga
-tttttacactacaggaataaacaaatttattcctcattggcaaaaatgtgttgattgtaa
-tggttcctaatttgagtaatcaagatgtgtttgagcctagttatagtgatttaaaattca
-cggtctgaaatcgcaattacttttgcaccaacctaaTATGTATGCAGGTGAATTCTGTCT
-GTCTTTGCTAAGCAGTGAGGTGATCCCGTGCTTAATGATGTTACTGCAAGCATGACAGCG
-GATAGAAGCGGGGAGGGCCAGTGATGAAGATAACTATTAGAGAGGGCATCCCAGTTGATT
-AGAAGCCCATCCCTAACTAACTACATCACTTCTAAAGGCCTGATTTCCAGTCCAGAACTA
-CTTTGAAAATGTTGTTTATGAACTCAAATTGTTAGTTGTAAAAATTATGAAATGAAAGAC
-TATTATGAGCATATATAAAATAAATTAGCCAGTAAATAACCTAAGATGATGAAGAAAAGA
-GCACTAAATAAAACCATAAATAAAAAGTTGGGAGCTTGGTAATGTCCAGAAAAAAATATA
-TATTTACTGTAACAAAGCAAAGGCCTTTTGTTAGTACATGAGACTCAGAATGCCTTAAGG
-AATGTGCTGGGCTCTAGAGGGCAGGGCAGGCACACAGCAGCTGGCACTGTTTGTCCAGAC
-TCCTGCCTGGACAAGTTGAATTAGAAAAATCCAAGCAAGAAACAGTGTCACTACTGGCTT
-CCCTGCTCTCTACTCATCTGCTCAGAGAGCTGCATGCTAGTTTGGCCTGTCCTGCACCCG
-TAGAGGACAATAGGTTATCTACATCCTTCACCACTAAGTGAGCCAatgggctgaactgtg
-ttcccctcaaaattcatatgctaaagccataacccacaatgtcactgtatttggaggtaa
-agcctttaaagaggtaattaaggttaaaagaggtcatatgagcaggatcctatccaacat
-aattggtatctttgcgagaagaggaaaagataccaaggatatgcatacacaaagaaaagg
-tcatgttagggcacagcaagaggtcagccatctgcaagccaaggaaggaggtctcaggag
-aaaccaaacctgccagcaccttgatcttggacttctcgtcttcaggactgagagaaaatg
-agtatctgctgtttaagccacacaggctgtggtattctgcgatagcagccctagactaat
-acaGGCCATAAAAAAGATAATATCCTTTCTTCCTTCTTTCTGAGCTCTGGGTAAATGGAG
-GTCAGATAAAgccaggtgtgatggcacatgcctgtattacccgctactcaggaggctgag
-acaggaggattgcttgagcccagtagttctaggctgtagtacactgtgattatacctgtg
-aatagccattgcactccagcctgggcaacatagtgagaccctgtcccctccccaaccaaa
-aaaaaaaaaagaaaGGAGGAGGGGGAGGAATGAGGTAGGAACAATAGGAACAACAGATGC
-tttttttttttttttttttttgagacagagttttgctcttttcacccaggctggagtgca
-atggcgtaatctcggctcactgcagcctccgcctcccaggttcaaacgattctcctgctt
-cagcctcccgagtagccaggattacaggcacccaccaccatgcctgactgatttttgtat
-ttttagtagagatggggtttcaccatgttggccaggctggtctcaaacacctgacatcag
-gtgatccacctgcctcagccttccaaagtgctgggattacaggcgcgagccaccgtgccc
-ggccAACAGATGCCTCTTAAAACACCCTGAGCCTCTGCCTTTATTCTAAATTTGTCAGTC
-ACAGGCCCGGGAGAAAGCTGAGCAACTTCAATAGGATTTTTAACTCAAATCTAAGACAGA
-AGTTTATATAAAGTTGTAGTCAGACTCGGCTGTGTTCAGAAAGTATATTTCTTCCATTGC
-TCAGCAATTATTTATTAGCATCTATTCTGGTCTCTGGGCAAACATTAAGGACTAAGAAAT
-GAATGAACTCTAATCATTTTCATTCTTTAAAAATTGTGCAGCCAAGAAAGAGAAATAAAT
-AGGCAAATGACCACATAACAGCAAGACATGTATAGTGAAAGTCATGCTCACTGCAATAAA
-AAGAACCTCTAGCTCTGAGTGAGGAAGGGGGAGTGGGTGCTGAGGTTGTGGGAAAGAGGA
-AGCGTGGGTAGAGTGAGGCAGACTGCTGTGGAGTGGAGCTGTGGGAGTGGCTTAGAGCTT
-GCAGGAGTAAGGGAATGAGGTGAGAGTGGAGGAACGGCAGAGTGCATATTCTCAGTTGCC
-AGAGATTCTGGGCAGCTTCTTTCGATCTTTGAGGATTTGGGCAGGAAAGGGTGAGAAAGG
-CCCATCTAACAATCCTGCGCTTCATAATCCCCTGAATCCTTGAAATTATTACTAAAGCTT
-AATGCTGGGAAAGATCTCTGATTCCCCTGAATCTGATTTGGCAAGCCAATCAATCATTTG
-TGTTAATTGGGAAAGAAATCAAATATTTCTGTGTGAATATACTCATCTCAAAACATTTTC
-AAGATAAAGTGTTTTACAAACTATGCTTCTGAGTCAATAGGATTCAGCTGTTTCGTTTTC
-ATTTCAGCAACTTAGAGGAAGTTTATCTTCAGAAAAAATTGCTATAAGAcacttcctata
-agccagccctgtgccaaattatttacatgaatcaccttctctagtctttaaacagcccta
-ttatgaatggacaattatctcaatttgacagatgatgaaactgaggcttgaagagattaa
-gttacctaagatcacacaATATGCCTCCAAAATTCGAAGAGGGCCGAAGGTTGTAATTGT
-GCAAGAAGAAGCAAATTTTCTATCTCTTTGAACCATAGACTGTGGATCCACTGCAACCTT
-GCTGAAATGGAAGTCTTTGTTGTTTCATGGGGGTTTTGCTGAATCTTCTGGCTTGTAGCA
-AGAAACTACTTTATCTTCACCAGATCTTATCAGCACATTGTATACCTGTGTGATACTCTG
-TGTGCTAATAAAATTATCAAGCTTCCTGTGGGTCCAAATTATGGCAAAAACGTAAGACAA
-AATGAtaatcccagcactttgggaggccgaggtgggtggaacacaaggtcaggagttcaa
-gaccagcctggccaacatggtgagacccccgtctctactaaaaatacaaaaattagctag
-gtgtggtggtgcgcacctgtagtcccagctactcaggaggttgaggcaggagaatcgctt
-gaacatgggaggcggaggttgcagtgagctgagatcacaccactgcactctagcctgggt
-gacagagctagactccatctcaaaagaaaaaaaaaaagaaaaaGCACACGACTAGTTATC
-ATAGATACTGTTGGCTACTGTTTCCTCTCTGTTGTGTGGGTCTGAGCAAAGAGAGGGAAT
-GGGATGCACCGTGCTTTCAGCTCTCTATAGTCTCTTCTGGATTTCAGTGTTTCAGCACAG
-CCCTAAAAACTACCACATGATTATGCCCCACGTAACAGTCAGATCACCTTGTCTCTAGAG
-AGACCACGCATCCATAACGAAGAACCTCTTATAACCATGGGTTCCACATCTTTACGGCTT
-AATCACTGATGCTCTCAGTGAACCTGAAAATTGATCCTGCTGAACAAGATCAATAAACAG
-AGTTTTGATTCAAAGGCAGCCCAATGAGTTAATAAGTGCTCCATGACAATGCCAAAGAGG
-ATTAAGGAAAGAATAGCAACCTGGAGGAAGATGTATAGAAAAGCAGAccaggtgcggtgg
-catgcgcctgtagtcccagctacccaggaggctgaggcaggtgaatcatttgaacctggg
-aggtggaagttacagtgagccgagatcacgccactgcactccagcctgggagacaaaacg
-agactctgtcaaaaacaacaacaaaaaaaaaCCAATATTAATAATGCAAATATTTGAGtt
-acagggcatttttaagagccagatacagtactgggaaccttgagtatattatctcattta
-gtccttaaaacaaccccatagactttatataaataatacaactgaaagtttaacttaagt
-tgctgaagttcacagataagcagtagaatcaggattggaacccatgtctcatcatatcag
-agaccctacgcttaagtgctatgctTCCTTGACTCTCACTGGCAACAGCTTTGGTGCATG
-TACCTAATGCCAGTTATATCATAAAGGATCTACATGGATAAGCTTATTTCATACTCTTAG
-AAATGGTTTGGAAGAggccaggcgtggcggctcacacctgtaatcccagcactttgggag
-gcctaggcaggcagatcacgaggtcaggagatcgagaccatcctggctaacatggtgaaa
-ccccatctctactaaaaatacaaaaaattagccaggcatggtggcatgcacctgtaatcc
-cagctactcaggaggctgaggcaggagaattgcttgaacctgagaagcagaggttgcagt
-gagccaagatcacgccactgcactccagcctgggtgacagagtgagacttcgtctcaaaa
-aaaaaaaaaaaaGTTTGGAAGAAGCTATAGAAGTCTCGATATTACTGGTGACCCAGTATA
-AGGAGGAGTGGTGAATATCCCTATTCTAAAGGATTTCCTAATCCTGAAGGATTTGGACAG
-CTCCTGCAATTGCCAAATGTAAGCGGCCTGAAAAGTTCACACTTAGATTATTGCCTTTAT
-TTTTGGCTCCCACACTGTAAAAGAAATTAGAATTAGAGCACAGATACAAAAGCTATGATA
-ATGAAAGTCCTAAAAAAAATTCCATTAAGAAACACACACATATAAGTCAGAAATTCATTG
-GGAATACCTTTGCATTTTAAGAGATGAGAAGGAAAGAGTTAACAGTAGTCCTGAAATCAA
-TTCTCTCCCTTTAACAGGAGATACTTCTGGCAGGAAAGAAAAAAAAAAAAAAAAAACTTG
-ACTCTGACTCTGTCAGATCTCCTTATAACATGCTAATAAGAGACCTTCTGGTAAATATGC
-TAATGATATTCACTAGCAGAGGGGTCTTTATGTAGCAGAATGCATCTGCTCAGTCCTCAA
-TTGCTTCTGGTAAACAAACTTAGAGTCTATGAATTTACAGGGCATGGCTCCTTGAAAAAT
-GTCATGTGTTTGTAATGCTAAGTAATTGCCAGAGAATAAAATGGAGATGTTTCTAGCTAA
-AATAGCCCCTTTGGGTAGCTGATGGGCACCCATGCATCACAGACATCACTTAGAGATCTT
-TCATGTTAAACCTATCCCATGGCTTATTTTCATGAGGCAAGAAAGGACCTGGGAAGTGGT
-GTGGACATCCCAGACTTTTGCATTTTTACCTGCTTCGTAATTACCCGTATCCTTGAAATT
-ATTACTAAAGCTTAATGCTGGGAAAGATCTCTGATTCCCCTGATTCTGATTTGGCAAGCC
-AATCAATCTTTTGTATTAATCAGGAAAGAAAGCCAATATTTCTATATGAATATACTCATC
-TCAAAACTTTTCAGAAAAGATATTTTCCATACATGGAAATAGCTTAATTAACtttttctg
-attatgaggttacttatagtcattttgaacactcagacaaaacagaaaactttatggaag
-ataaaataagaataacaaaatctttcccaaagagaaagaccattaaatttttgtatatat
-ccttccagagaatacacaaattatatgtatatatattttacatgtatacatatataacaa
-agactagcttatactacccacgctttcctgtcatttttcttttctacctaagatatcact
-gacagtcttttatataataaggatagtcctcaattatcatcattgtttaaatggaattct
-aatgtgttaagtgccataaattagcagattctctattgatagacatttagcttacttttc
-acattctcactatgagtaatgctAAGAAGGCAATATAGTTCTTGCACCTTCATGAACATA
-TTCTTTTATGCTATGTGCATTATTTTGGGTCAAAGGGCAAGCAGAGTTTCATTTAATTTT
-GTTTTAGACATGGGCTATATATTGACAAATTGCCCTCCCAGGAACAGTACACAGTTTTTC
-TTATGTTGCCTCACCCATGCCAGCAGTAGCTAGAAAATGCATTTCCAAAGACTGGTGCTA
-ATTTTCTGTGCATTCTGTGAGTGCTCAGTCAATTTAAGCAATAACCACTTAGAGTAACAA
-AATCTATTCACCCTAATAGCAGAGATTTCTACTTCATCCCTGGCTCACTGCCCAACTTTT
-GATCTCATCTAAGGCCAATAAATGTAGCTCCAGACAAGTGACACAGGTAGCTCTGTCCCC
-ATCCAATCTACCCAGCTACTTCTCTTAAGGCACGTTCTGATCCTTCAAGCATGAAGTTCT
-TGCCTCTGGCTTTTGTTTCTCTCTTGTTTCTGGCTTCAGTGACCTTGAGTACCCTGGAAT
-CTTCCATATTGAGAAAGAAATGATAGAGGGGAGGGGACATGGAAAAAAGAATTAAATATA
-TCTATTTTTAAAAAGAAAGAAAATTTTAGAATGGACATGTCTagaaggaggaggaaacag
-aggagggggacaggtataaaaactggacttctctgaatatactctgctttgaaggtttga
-ctttggaatcatctacatattttatctaatacaagaatatcgaaacttaaatggcaatcc
-caaaaatctaaaaggaatagaaatcaaattagcctctgtaataaatgggttgtataacca
-cacaaaggACTATTTGAAATGACTTTCAAAGAGTAATTTGAGAATACTTCCTTATTGGAA
-TATAACCTAAAAACAGAAGAATTGCAAACTGTTTTCAATGTTTTCAGTAATCATATTGAG
-ACTTTAATACATATATTGTGGGATAAAGGAAATGAATGTTGGTGTCACTGATAGAGATAA
-GAAATAAAAGTTCAGGTAAAAATTCTGTAAATCCTAAATTTGAATTGGAATTTTATATTT
-TATTTTTaaaatacctttttctacccccatccactgaaaagccctagaaatattggccaa
-cctagtagaaatgatttccctctcacccgggatattatctctaaatataatttaccaaag
-tcttattgaagaaattgctgtttctgagcttgaagcaactatacaaatgtacctggaaga
-ttttaccatactggaaaaaagcagcttgacaaagactactgaagtcatgtcaaaaaaaac
-aaagaagtcaacttgaaggggctttctcttggcaaagatgggaaaatgtgaaccttgata
-aaaaataattgcatgcattattcacagtaaccaagatatgtaatccacctaggtgtctat
-ggatggataaatatataaagaaaatgtgatatacacaatgaaatattattcagcctttaa
-aaagaaagaaatcctgccatttgtgacaacacagatgaacctggaggacattatgctaag
-tgaaataagccagacacaggcagacaaatactgaatgatctcacctatgtgtggaatctt
-aaaatgtcaaactcatggacacagagagtaggatggtggttaccaagggagttgagggaa
-atgaagaagtactagtcaaagggtacaaagtttccgttatgcagggtgaataagttcggg
-agcttactgcatagcacagtgactacagttaataatactgtgttgtatacttgaaatttg
-ctaagagtagatcttaaatattgttaccacagaaaaaaatggtgactatgagaggtgatg
-aatatgttaattagcttgatagtggtaatcatgtcacaatgtatatgtctatcaaaacat
-cacattgtacgtcttaaatatgtacaattattatttgtcaattatacctcaataaagctg
-gaaacataaaaataaaataactacaattaattgaaacatatcaaacatgtccaaaactga
-taaagaaaggtaaagaatttggcctggcacagcggctcacacctgcaatctcagcagttt
-gggatgccaaggcaggcggatcacctgaggtcaggagtttgagaccagcctggccaatat
-agcaaaaccccatctctactaaaaatacaaaaattagctaggcgtggtagcgggcatctg
-tagttccagctactactcaggaggctgagatagagaatcacttgaacccagaggtggagg
-ttgcagtgagccgagatcacgccactatactccagcctgggtgacaaagtgagactctgt
-ctcaaaaaaaaaaaaaaaagaaagaaagaaaagtgaagaatttatcctggcttttctgta
-aaaactgcacctcagaagaaccaaattattgataaggaattttgctctttagaaatattt
-ccagctaataaatgaaggaataatagcattgagacaaatcgccattttgtaatctcaggt
-gaatttacggatctaggcaatgatcattaatggctgagaaaatcacaacaaaaagaacaa
-ttagacatttgtgcctcctgatagaagtatacaatatcaccttcaaagctattttgccaa
-aaaagaaaaaaaaaatcaacccaaatctaatcaaggctcccactctaactcccaagctct
-aggatataccaaggacaaaggaagatcatgaaataccaccatggggattcaatcagcaaa
-ttcTGAAATGCAACATTATCCTTCACCCTGCTTGGCCTAAAAGTACAAAATAACACGAGG
-AAAAATTAGTTTCCAGAGCCTGTTATATTTTGAAAAATCATCAGAAAACTGAGAATCAAG
-GATAGAATTTCTAGAAAGTTCCTTCCCCTAAAGCTTTCACACTTGCCTCAGTGTATATAT
-GTGGCTATACCACTGACAGGCCGCCAGTCATTAAATTCAAGCTCCAAGAGACAAACTCTT
-GAAAAAAAGGCAGCCTAGGAGAAAGCAACATGATTTTTCACATATTTTAACTTGGTTTTT
-CTCATAAAATGGTTTCTGAATGTTTCTTAGCTTTCAATGGGCAATAAATAACTTTTAGGG
-AAATAGATGTGAGCCAATCTGAGGAAGTATTTGAGATGAAGAGAAGGCTTTGCTGTCTAT
-GAGGAGTGCATTAGAATAGAATCGCTCCAGGAAAAGGTCACCTGTGTTGATTGCCTTTAT
-GAGGTGACATTTAAATAAAAGTACTCGTTCAGTTTTCATTGAAAAACATTAAAAGACATC
-TCCAAAAATTTTTTTGGGAATGTGAGAAACTCTGCTGCACAAATGATCATGTTTTGTCAA
-ATAAGATGAAAAGAAAAAAAACACACACAAAAATgaaaaaacagatggaggggtaacata
-aattaagaaactcagaagacacatctacaaattacaatttatggatcatatttgaatgct
-gattctaaaaatttgaaaaaatatgcatttgagaaaatgaatgctgacttcatagtttat
-aatatgaagTCatattataaaatataataagaatgaaatattaataatttatCAGGTATG
-ATAATGGTTTTAAGGATGTGttttttgtttgtttgttttttgagacagagtctcattctg
-ttgcccaggctagactgcagtggcgcgatctcggctcactgcaacctctgcctcttgggt
-tcaagcgattctcatgcctcagcctctcgagtagctgggattacaggcatgcaccaccat
-acctggctgatttttgtatttttttattagtagagatgggcttttgccatgttggccagg
-ctggtctggaacttctggcctcagttgatccacctgcctcggcctcccaaagtgctagga
-ttataggcatgagccaccacgcccagccTAAGAATGTGTTTTTTaactgtatatatttaa
-ggtgtgcaacatgatgtgtgtatgtatatatatatatatatatatatatatatagagaga
-gagagagagagagagagagagaaataatttctgtggtcatgcaaattaacatatccatca
-tctcacagctacaatttttgtgtatgtgtggcaagagcacctaaaatctactcttagcaa
-aaatcctgaatacaatacgatattattaactattgtacattagacctctagacttgtttc
-tcttacatatctgcaactttgtgtcctttgacctacatttccccatttcctacccctcca
-ccacaccccagtaataaccactttattctctatctctgcattcaactttgttttttctag
-tttttaaactctgcatataagtgagatcatgcagaatttctctttctgtgtctggtttat
-ttcacttagtacaatgtcctccagattcactcacgttgccccatatggcagaatctcctt
-cttttttaaggctgaaaaatattccattgtatatataccatagtttctttgcccatttat
-ccttcaatgaatacttcagttgtttccacacctcggctattgtgaataatgctacaatga
-acgtaggagtacagatattttatgaggtgatgatttcacttcctctaggtatatacccag
-aggaggaattgctgggtcctatggtagtgctatttttaatttatttaggaaccttcatac
-tgttttccttaatggctccactaatctacattcccaccaaaagagtatacaggttccttA
-AGGGTGTATTTTTCAAAAGGGTCGCCGagagatacctattaaaatatatacaagagaaat
-cttataatatcagggatttgcttcaaaggaggggaaatccaagaaggggaaagtaaattg
-ggttatataagaaacaagattggccatgagttaatgttgaatttggatgatgaatacatg
-ggggctcattatattattgcttgacttttacacacatttaaattgttcAATAGTAtgtat
-tagtccattctcacactatataaagacatacctgaaattgggtactttataaaggaaaga
-ggtttaattgtctcacagttctgcagggctgtagaggcctcaggaaacttacaatcatgg
-tggaaggggaagcaaacacatccttcttcacatggtggcagcaagaaaaaatgcagcaca
-aaagggggaaaagccccttataaaaccatcagatcttgtgagaactcacacactatcacg
-agaacaggatggggaaaccactccgtgattcaattatctccacctggtccctcccacaaa
-acgtggggattatgggaactacaattcaagatgagatttcggtggtgacgcagcaaaatc
-atatcaAGTAATAAGCTGAAAATACCCTTTATATAAATAATGATAACACTGCATGGAAAT
-AAAGAAAAATCTTTAGGATGCAGCCTAACTGGTATTTACGATTTTTTAAACCCTGGATTA
-AACGCATCTTTTTATAAATGGAAATAATTAATGAAGAACTGAGATGGAATCAAAATAGCA
-AATCATGcacacacacacacacacacaAATTCTGTTTAGAGAACTAAAACAATATGTCAG
-AAACGTTGAAGAGTTCATGtgcatcagttagttcctgccatgtaacaaaccacaccaaaa
-tttagtagcttaaagcaaaatcatttatgtatgtcataattctatgagttacaaattgag
-gctgggctcagctgagaggttcttctcttcacttttgggctcatgcatgtgaggattaat
-gggagctggcaggtctagggtggactccactggaatagtctgtctctgttccaaaaggtt
-agctgaagcttgttttcctggcaacagagcagagttctgagagagcgtgagtatgcaagg
-cctcttgaggcccaagcctaggttcagaacaggaatcacttctgatatactctattggcc
-aaagttagtcccaagtccagatccagGCTTGCTCAAAACAGTGGCCCATCTCTCTGGCCC
-CAATCTCCATAGTTCTGGTAAACaaaaaaaaaagaaaaagaaaaagaaaaagaaagaaag
-gaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggCTGAGATAACA
-TTGGGTTTTTCCAATGATAAAACCTAGAATTAATGAAGAGCTAAAATTAGTAAATTTTCA
-AAAATAcaaaacacataaaatgtaaaactgctgaaaagataagaagaaatgaataaatct
-ataattaagacggaaatctttaataggccataggcctcaggagtcctcaaagtaaacaaa
-aaatgcacaagcatgcttatcttaaaggattaaataggtatttttaaaatattgatttaa
-tacacatgtagaactattaagtaacaaaatagatacatacaattttaaagcatagctaaa
-aaatggctaaaaattgattattataatacatgtgtatttcaaatattccaaaagaagtca
-gtccactcatataaactaaccacaatataacaacattagaacttccaaaaaaggtatgtg
-tatatgaggtggggttttttcaaccttctaaataattgtgggttaaaaaaacataaaaac
-tacaagattttggaaatgaatcaaaatgagagttctacatataaaatcttcatgaaaatg
-gttaaagtggaaattagatgaaagatttaaaggcatttactagaaaacaagaaaTTTTAC
-ATTTTTAAATTAAAAGCTAATTAAACTCAAAGTTAAATTTAGTTAATTAAACTCAAAAAG
-CTAACAGACCTGAACTTGCTCAGCAGCCTTACCTAAGAATCATCTATTTTACCGATCTTT
-TCAAAGAAATGTTTTGTTTTTATTGATCAATGCCTCCatatttttgaaatttttatagtt
-ttcatttattatattgacaaatttttttaaattattaatGTGGCGCTGGCAATACACTTG
-TGAAGCATTTAGTTATTTATCCTTAAAATATATTAGTACTTggcggagtgcagtggctca
-cgcctgtaatcccagcactttgggaggctgaggtgggcaggtcacaaggtcaagagatgg
-agaccatcctggccaacatggcgaaaccccgcctctactaaaaatacaaaaaatagctgg
-gcgtggtagtacacacctataatcccagctactcaggaggctgaagcaggagaatcactt
-gaacctgggaggcggaggttgtagtgagccaagattgggccactgcactccagcctggat
-gacagagcaagaccctgtctcaaaaaaaaaaaaaaaTTAATCCATGTGCACAAAGAGGCA
-TAATCAGAAATAATCATTTCCAATTTTggctgggcgcagtggctcatgcctgtaatccca
-gcaatttgggaggctgaggcgggtgaatcacctgaggtcaggagttcgagaccagcctgg
-ccaacatggtgaaaccccgtctctacttaaaataccaaaactagcctggagtggtggtag
-gcacctgtaatcccagctactcggggggctaaggcaggagaattgcttgaacctgggagg
-tggaggttgcagtgagccgagatggtgctatcacactccagcctggggaacaagagtgag
-atgtcatctcaaaaaaaaaaaaaTCATTTTTATTTTGTTTTTAAAAAGAAAAAATGggcc
-gggcgcggtggctcatgcctgtaatcccagcactttgggaggccaaggcgggtggattac
-ctgaggtcaggagttcaagaccagcctggccaacatggtgaaaccacgcctctactaaaa
-atacaaaaattagccagaagtagtggcacgtgtctgtaatcccagctactcaggaggctg
-aagcaggagaatcgcttgaacctgggaagcagagtttccagtgagccgagattatgccat
-tgcactccagcctgggtgacagagcaagactccatctcataaaaaaaaaaaaaggaaaaa
-TTGGAAAAATAAAGTACATGCAGTTTATTTGACAGAGGGATGTTTAACTGAACCACACTA
-CATCCATATATATGAAGTTATGCAGCAATAGAAAAGAATAATGGACATTTATATTTTTAG
-ATATAAAAAGAGCTGTTGAACCTATCATTGAAATTTTAAAAGGAAGCTGAAGAACAAGTA
-CAGTGTAATAAATTATTTGTTTTTtacaatttaattatagagtaaatgtgatctttcttg
-gtatatagttctatagattttaataaatatttggattcatgtaaccaccaccacaaatag
-gacacacaacagtttcatcaccctaagaaaagttcccggatgctcacccctctgtagcca
-aaccgtcaccccacccataatccctggcaaccactgatctattttccatcactataattt
-tgccttttccaagaatgtgacataaatggaatcatgtagtatttaacgttttgagaccag
-cttctctcagcatgtgatatggtatgtacctgtgtctccacctaaatctcacgttgaatt
-gtaatccccgatgttggaggtagagcctagtgagaggcgattggatcatggggacagatt
-tctcatgaatggttcggtatcatccccttggtactgtcctaaggatagtgagtgagttct
-gcagagacctggtttaagcgtggagcacctccccactctcttgctcctgctctggctatg
-ccatgtgcctgctcacccttaaccttccaccatgattgtaagtttcccgaagcctccccg
-gaagccaagcagatgccagcatcatgcttcctatatagcctgctgaacagtgagacaact
-aaacctcttttttttttagcaaatgacccagtcccaggtatatctctataacaatgtgag
-aacgacctagtaacagcatgtctttgagattcatccaagtttctaccagtatcaataact
-cattcctttttactgctgagtatgattgtattctatggatgtggtacatctgtttatcca
-ttcattcattgaagggcatttgggttgttttcagcttttggctatcacaaataaagtttc
-taagatggccaggcatgatggctcacgtctctaaccccaacactttgggaggctgagatg
-ggcgttgaggtcaagagtttgggaccagcctggccaacatggtgaaaccctgtctctact
-aaaaatacaaaaattagctaggtgtggtggcacacacctgtaatcccagctactcaggag
-gctgaggcaggagaatcacttgaacctgggaggtggaggttgcagtgagccaagattaca
-ccactgcactccagcctaggcaatagagagagactctgtctcaaaaacaaataaataaat
-aaataaagttgatatgagcagtttttacagatgtttgtgtgaccgtaagttttcgtttca
-ctagggtaaataccaggttcaggattgctaggtcctgaggtacgtgtatgtttacctttc
-aaataaactgacaaaccattttctagagtgactgcaatttccagttgttctgcaacctca
-ccagcaattggtgttgtcagaaactttttattttcataattcttatcaatgtgCACAATT
-GTTTTTAAAATTCACAGAATTAAAGGAAAATATATTGTGCACTATTTGTGTAATTaaagc
-aaaacacaaacacataaacggaagacaaaaataagaaactaattcaagaaactaaagaaa
-gaaaaacaaaaTTAACTTTTTAAAATTAGAATAAAGGCATATATATGTAATAGGGATAGT
-TTGAAACACTCCCAAACATCTGCTCTGAGCCAACAACAATCGGATAGCgtgagggcagat
-acaaattaaatatgagacttaactctccccgttaaaaataaggaaagagacttacccaac
-acccctcccccccgcccttctctttctctgtctctttgaaatgtatgtaaatctttttaa
-aatgtaaataggcctctagccagttttacaacccaggaatatctttgtcaaatacctagg
-agccatctctttgaaatgtaagcatccagaaaggtagtgctcctatctctgaatttatat
-gagtgggtaggtctctaactttggcaagttccttgcttcaagttgcaaagccacttcctg
-tcacaaggatgtgagaattttgtttttcctttggttaaagccaaccagcgaacacagatg
-gccactccaattatcaggtgaatctaggatgaactatgtgtatgtcaaatggtacttcta
-agttctcctatttgagaaccagttattgtttgtcttgagagcatatctgtaatgggtttt
-atcttcttcaggatataaacaagtaggatttctttctgtctttgcaaactctttgtgaat
-tgcctgtgatgtgtctcacattctggttcaatgcttattcaatggcaattgttttctttc
-tcttctacctttgtggagaggttttctaggttgagagaagattttgtttttaattatatt
-tcccccacaATAGCAAACACATCCCCAACcacatacacacacacacacacacacacacac
-acacacacacacaacaggtaattagacaggcctgagcagggcaggagagggctcttcccc
-cacccactacgaatgtcagtgatggttccaaaattatcacattgcctctctaaaagtgat
-aaattggGCAgcgcagtggctcatgcctgtaatcccagcactttgggaggctgaggtgga
-cagatcacttgaggtctggagttcaaaaccagcctggccaacatggtgaaaccccatctc
-tactaaaaatacaaaaaatagctgagcatggtagtggacacctgtaatcccagctactca
-ggaggctgaggcaggagaatcgcttgaacccagaaggttcaggtttcagcgagccaacat
-tgccccactgcactccagcctgggcaacagagtgagactccatctcaaaataaataaata
-aataaaataagtgagaacatatggtacttatctttctgtgtctgacttgcttcacttaag
-ataatggcctccagttatatccatgttgctgcaaaagacatgatttttgtggagggattg
-tattccattgtatatatagaccataatttctttatccaatcatctgttgatggacactca
-gttgattccatacctttgccatcatgaatcatgttgtaataaacatacaagtgcaggtat
-cttttgatgtgattatttcttttcctttgggtagatacctagtagtgggattgctggatc
-aaaAtggcaggtgcctgtaatcccagctactccagagactgaggcaggggaatcgcttga
-aactgggaggtggaggtttcagtgagccaagatcatcccactgcactccagcctgggtga
-cagagcaagactctgtctcaagaaaaaaaaaaaaaTgctgtgtgattacccttatatggg
-tttcctggatgagccatttgttaaattaatttttgttggaaatttccccgcagagctgtt
-gcacattgtggggggttaatccccagacactcccatgaggccccagtcacccaggggtgc
-ctttggctgggaggagcaagtgccctttctcctaggagctgaaaaactcagtctcttatt
-tatctatgaaaacaacagttcagtttctcacataaatgtgtacagataaaccgaatttag
-acagattttaggagaaaaagcaattgagaattccttttagaatgcatctcccaactagaa
-ttaggatccttaaacaaccacttcttaggagaaaaccagctcagaataaatcaaggacca
-tcaaccaaagggaggtctggggctcaggaggacttaccagttccaccagaggagaagctc
-gaagcttcaatgggcccctgctggcaccttagctctggttttgggcaactcctttagggt
-cctgagtcttccctgaggcctcacgtgtttgggcaccaaattattgttgacgaaaagagc
-caaactctgtaaaatattttaagagatttattctgagccaaatatgagtgaccatggccc
-gtgacacagccctcaggaagtcctgagaacatgtgcccaaggtggtcggggtgcagcttg
-gttttgtgtattttaggaaggcatgaaacatcaatcaaatacatttaagaaacacactgg
-ttacttggaagtccccgcggggctgggggcgggtatcaatggaaaggaatgttcaggtta
-acataaaggattgtggagaccaagttttattgtgaaaagaaatctctcagatagcagact
-tcagagagagagcagattgtaaaatgtttcttatcagacctaaaagggtgcctggctctt
-agttgattatctcctggatctggaaaggaaggggaaaaagggggtgggtgggtgtggggg
-tatagaatgtggatctttttccaccaaagattttgtaaggcaatttcaaagtatggcaag
-gcaatatattttgtgataaaacattgtgattttttttttttttttgtgagacagagtctc
-actaggtcccccaggctggagtgcagtggcgccatctcagctcactgcaaccttcgcctc
-ccgggttcacgccattcttctgcctcagcctcccgagtagctgggactacaggcgcccgc
-caccacgcccggctaactttttgtatttttactagagacagggttttactgtgttagcca
-ggatggtctcgatctcctgacctcatggtccgcccgcctcagcctcccaaagtgctggga
-ttacaggcgtgagccactgcacctggccaaaacattgtgattttcttccttgttatgcca
-gagtcagattgaaaagtaagtcacaatatacagggtcaaataaaacccatcttgtaagaa
-tttatggtttgtagggcataactccctagaccccttaggtaggaatttgggcaagataaa
-aaatcagagtttagtcctcaattccttaagataaatctctttctctatatatatctctct
-ctatctcatatctccatcctattctctggaaaactctgactaatgcaAGAAATTAAAGAG
-ACAAAACACATAATACAATATCTtaaacaacaaaatactattcagccataaaaaagaatg
-aaatcctgtcattcatggcaacatggatgagctagagcagtggtccccaacctttttggc
-accaggcactggtatagtggaagacaatttttccatggtcggaagggggtgggaggatgg
-ttttgggaagaaactgttccatctcagaccatcaggcagtagttagattctcataaggag
-tgtgcaacctggatcccttgcatgcgcagttcataatagggtttgtgcttccatgagaat
-ctaatgcttctgcacatctgacaggagatggagctccggggtaatgctcacctgccactc
-acctcttgctgtgctcccagttcctaacaggccatggtccccataccaatctatagccca
-ggggttggggacccctggcctagaggacattatgttaagtgaaataagtcaggcacagaa
-acataaatgctgcacattctcacttatatgtgggaactaaaaaagttgagcttacaggcc
-cggctcggtggctcacacctgtaatcccaacattttgagaggccaaggcgggtggatcac
-ctgaggccaggagtttgagaccagcctggccaacatggtgaaatcccatctctactaaaa
-atacaaaaattagccgggtgtggtggcgggtgcctgtaatcccagctgctcaggaggctg
-aggcaggagaatcgcttgaacctgggagacagagttgcagtgcaccaagattgcaccact
-gcactccagcctgggagacagggtgagactccatctcaaaaaaaaaaaaaaaagttgagc
-tttcagaagtagagagtaaaataatgtagcaggtagaagaggatacggagaggttggttt
-taacaaatacaaaatcacagctagataggaggaataagttctagggttccatagctctgt
-agggtgactgtagccaacaatcacttattgcatattttcaaatagctagaagagaggatt
-ttgaatgttctcgcacaaagaaatgagaaatgtttgaggtaccctgatttgatcattaca
-cattgtgtacacgtattgaaatatcactctgtatcccataaatatgtataattattatgt
-caattaaaaataaaattttaatttaaaaatacattttaaaaatCAATACAATATCTGACC
-TGACACTGCAATCTCAACTCAAGGAGGAAATGAAtgctgtaaaaggcattattaggtcaa
-ttggcaaattggaatacagatatatatatatatatatatatatatatggatagatgatag
-actagataaaagtggtgtccatttaaatttatggagttagtaactatactgtcatacagg
-agaatatccctattcttaggaaatacacactgaattatttgggagtaaaaggccacgata
-atataaggccatgaacatataacttatgctcaatagattcaaagaagaaaatatacaaat
-atagagagactaatatagATATATATATATCCATAGATAGAGAGAGGTGGGGCAAATGCT
-AAAGCAAGAAAGATAAAATGTCAACAATAGGCAAATCTCAGGGGAGCTGGGGAAAAGGTA
-TCGTACAATTTGTATTTTGCAGCCGGTATGttttaaattatttttaaatgaaaagatttt
-ttaatGGGTTGAGGAAATTGGAGTGACTTATATTTATGACATCCAATGGACTGTGCATGC
-TGTATGGAAACAAGGAGAAAATAAATGTCATCATTGCTTAACAAGTGAAGGGTAAAAAGA
-CAATTAACTCACTGAAGACTACGCACAGAAACACAAAAGCCTTTGCTTCTGTGGTTATAG
-GTTTACCAAAGGCACAAAGGGATTTGTATTTATTTTAGGATTATAATTTACATCACTTAG
-TTGGAAAAATTACAGATTTTAAGATATTTTTACAAATCTGAGTGACTGTAAAGACTGCTA
-AAGTCTTGGGACATATTCTTACCAAGTCCCAGATCttttgttttgttttgttttgtGCCT
-GAAATCAAACCAGGTTTTTTAGACCAGGAAAACGTGAGAAGCTAGAGCTGCTCTACTCAG
-TTGGCCCAAACCAGGACTCCGGAGATTATTCCCTTATACAGCAGGCACCACATTAGAGAA
-AGGATTCTGGAAAAGTGAGCTGGAACAGAAAAGAACTGTCTCAATGGGAAACAGACTCCA
-AAGGACGCTATTGGGGGGAGGAAAACACAAAATATTTCTTGAGAAGAATGTGGAAATGGC
-AAAGTCTCTAGCCTCCAGAAACCTTAAACTCTAGGGAAAGAAAGCAAAAATTTAGAGGTA
-AGAGTGTTCATATTAAAATTCAAACAATAAGTAGTTTTTCTATAAACTCTCTTTTTTTCT
-AATCATGAAAGTACACATAATCATTCTCTCCAAACTCAGACATTTtagacagatagatag
-atagatgacagatagatagatagatagatagatagatagatagatagatagataCacatg
-catacatactacatacatatatacctacataTGTTGGCACATAGATGTTCCTTTACCACA
-GATTAAGTTATTCTAGATGCATATCTTGTAGCCTACATTTTTATACATTTTcatcatttt
-aataactgcatactgctctattatattctgtattttctatattagattagatccatgttt
-tatcaccatttaggtagcttttggttttctgttactgtaatgttgagataaacgtcttta
-tgtacttgttcaattattcccattaaacaaaagcccaaggtacaaagtttctgagtaaaa
-aaataggcacattttaaggcttctgatatatattgccaaattgtgctacaaaagaaaaac
-tgtaccaattaacactcccagcaacaacgccaagagaatgctagtttccccacatctcac
-caacactgtctaGAACGCATAGTTTTAGAGATGAACGCTGGGAACCGACGCACTGTTTGC
-TCTACCTCTCCCCCTCCTAACAGTCTAGAACACAGGCGCTCAATAAATCAATCCAGGCTC
-CAGTCCAGTAGACATTCTGATCTAATCTGACTGCTCTGGGTAACAGAAAAGTCTCCCTTG
-GTTCACTGCCCAGTATCCTGGCATCATGTGGATCCTATAAAGGCAGTAGCTCCAAGCACA
-TTACAGAGGGACCCAACTCCATTAAACCACCACCAGCTCCCCAAGCCACCCCTTCAGCCA
-TGAAGTTCCTGCTCCTGGTCTTGGCAGCCCTCGGATTCCTGACCCAGGTGATCCCAGGTA
-AACTGGATAAATAGGAGGAAAGGAAAACTGGGAACGAGGAACACTAGCATATCTGGTTGC
-TCTGGTGATAGATGAGCCAGGTTGGGTGGAGGCAGGGCTCACCCCACTGAGTTCCAGTCT
-AAGGTAGAGATCTCCTAACAACCACCACTAGCCTTGATATCCCACACCCAAACACCACCC
-TATATAACCTTTACAAAAATTTGTTTTCTATTCTAAAATGATAGTCACCCTCAACCTAAA
-CCAAAATATCTTCTTTCACTTTATGTGAGCTCCTTATATCTAACCTCCTAAGACACACTG
-AAGGCTTCTGTCATCACCATGTGCATCCATTGAGATCAGCCCGGGTTGGAGCTCAAAGGA
-GATTTTGAGCCTAGAAGGAAGAGATTGAGGTTCCCATCCCTATGCTCAACAGACAGCTGG
-CAGGTGGGGGATGGAAGCAGACCTCTTAGAGGGCTAGTTCCCACAGGATGGTAAGCAATG
-GGTTCAGCTCAAACCCTGGGGCTAGGAGATAATGCAGGGTCagaaagagagagagacaga
-cacacagagagcagggagagagagagaTCAGAGGAGGGCCAGGCAACGGATGTGAAGAAA
-GCCAAAGAGGCTTGAGGGTGCTCCGAAGAGGCCCCTGCTGTGAGCCAATGGCAGACACAG
-AGCACTGAGGCAAACAGATTTCAGCAGATGGTGAAATGGTGCACAGCACTGGGTGAATGC
-AAAAATGCCCTGTCACTGGCAACCGTTATTTTCTTTTTAATGATTTTGGAGAAAGATTTG
-ACTCCTCCCACTTTGCCCCAGGTTGACTCATATTTACAGTTTTAGAGTCTATGAAAACAA
-GTAAGGTAGAAACACCTTAAAAGGGAGCCTGTGGGGTGAGTGAGACTAGCCCCATTTCTC
-CCTTTTGAGTATCCAAGCTCCTCCCTGACCGTGAAGACCAGGCTCCCCACCCCTGTTTTT
-ACCCATACATCCTATTCTGTAGTATCAAATTTAGCAAAAAGCTTCAAAGATGCAGATACT
-GGCAAAGAAGAAGAGCTCGTCAGACAGAGTTCCCCAAGGCCATCAATCCAGGAAGATTTT
-TGTCTCCTCATCACTGGCTTTCCCAAGTCTCATTTGCACAACATCCTAAGGATACACCTC
-AGAACAAAAAGCCAAACACTCCCATCTGGCGCTGACGCTTTAGTAGCCCTGTGCTGCTTC
-TAACCATGACTTCTCTGTCTTGTCCTCTCCCATACAGCCAGTGCAGGTGGGTCAAAATGT
-GTGAGTAACACCCCAGGATACTGCAGGACATGTTGCCACTGGGGGGAGACAGCATTGTTC
-ATGTGCAACGCTTCCAGAAAATGCTGCATCAGCTACTCCTTCCTGCCGAAGCCTGACCTA
-CCACAGCTCATCGGTAACCACTGGCAATCAAGGAGAAGAAACACACAAAGGAAAGACAAG
-AAGCAACAAACGACCGTAACATCATAATAACCACTGCTATCGCCTCCACCAACTCAGAGA
-AATATCATTTCCACAGTTCCAATTCCTCCTACATTGCTGAGTACTAGCCAAGGCTCCTCT
-TTATGGGGCAGATATCTATAGCCAACCCCAAAACTTCTGTCTTCTATCATTCTGTCATTC
-ATCTAGTAACTAATTTGGAGTTTGTATCTATCTTACGAGAACAATCATCATGCAGATTCG
-TCCACAGGGGATCtgtcagtttgggtcctccaaatgaaaaatgtcaagacagaattggac
-atgcaaaagattgactgggagaacacacctctgatggacaaaggtgagacagagcagcca
-caggcagggagagccttcagactgcaacgctggcctgatacgtgtcaaaggagagaggga
-tagaggaggattgaatagaaggagactaagactgcagctctaagaaagtctcagccaaac
-agatggggaggcccaaagcaaggcttgcccctcagaggagctcacgcagggcaggaatag
-ccaggttctcatatcccaggggttcagactttggctgagaacagcccctggagaacatgg
-ggtgactgctaccataggtctggaagtatgaggctgtccaccaactatccccttgaagca
-agttctcttgaaaggaaatctaaacagtgcacccccatggctgccacGGAGTATAAGGAG
-GGAGAGAAAGGAGCTGAAAGTCTAGGTTTGGCCAGCTAGGTAGACTGACTTGTGAGGTAT
-TTATTTATTCATTTGAGTAACAAAGCAGACAGAATACATAGCCACCATTGGTAGTACACC
-CCAAAAGCAAGGATGGCATGATGCTGGTGACTCAAACGTGCCTACTCATGGTGTCAAATT
-GGCATAATCCTCTTGGGAAGCTGTGTGGAAATAAGCACAGAGAAGCAGAACTCTAATTGC
-TTAATCCACTAAACATTACTTCTGGGAATTGGCTCATCATAAATTATCCAAGAGAAGCAC
-AAAGTTATGGGCACAAAGGTTTTCCATATAATATTATTTAAAATGCTGAGAAAATGAAAA
-AATCTAAATGGTGAAATATATACTAATGCCATCTATAAATACAAACAAATAGAATGTTTA
-TAGAATAATGGAACATAATAACATTATTCAAAATTGCATTTATGCTATAGTTGTCAAAAT
-TGTCTCCTTATATGATACAAAACTCATGAAAATTATGACTTTTTTGTTTGGTTGGAAAGC
-AGAATTATGCATAAATTTCCTCTTACAGTTCGATGCCCATTAGTTTTATATAACATTTAT
-TTGACACGTACTGACTTCTATCTGAGAAGAACAAACCAAAACACTCAGGCCTAAATAATT
-AAAAACGGTCCTAAAAACTAGCAAAccagataagaaaagatgttaatgcccattccctaa
-cttatgtcttagaccaaaattaattctagatggttttaaaatgacagtgtaaaagtaaag
-tattaaaagattgtgtggtcaaatattcaatttaagagcaaggaaattcttataaatata
-acaatagaggcagaactcatgtaagaataaattgattaggtggtattaaatattaagttc
-ttatgtatgtcaaaagatatcattttgaaattcatccatcttattgggtattgcaggagt
-tcattcctttttgtttataaatactcttccgtcatatgaatagtattcatttgtatactg
-gtttgttgatggacatttgggttgttcccagtttatggctattacaaataaagcttctat
-gaacatttatgtacaaatctttgtatggatgtatgctttcatttccctaaggtaaatacc
-taggagtagaacgtctgaatcatatggtaggtgaatgtttagcttttttgtttgtttgtt
-tgtttgtttgtttgtttgtttgttttttgagatagagtttcgctcttgttgcccgggctg
-gagtgcaatggtgcgatctcagctcactgcaacctccgcctcctgggttcaagcaattgt
-ccttcctcggcctcctgagtagctgggattacaggcacgcaccaccccccgaccccggct
-aatttttgtatttttagtagagacggggtttctccatgttggtcaggctggcctcgaact
-cctgacctcaggtgatccgcccgccttggcctcccaaaatgctgagattacaggcatgag
-aatgtttagcttttaaaggaaatacaaaattgttttccaaaatggttgtgccagtggatg
-tgcccatcagcaggatgtgaaagttccagccgttcctcatcctcaccagcatgtgatatg
-gtcagtcttttgcattttcatcattctaatagatgtgtagtggtatttcattatgctttc
-aatttgcatttttttaataactagttatcaaaaaagtatattctgtatgattctatttac
-ataaagttcttTAAATTCTTTTAAAATTGCATAcaattatttaaaatagaaagtaagaat
-ctaacgacagaaagcagatcactggttgtcaggggatgtgaaaggtgcatggagagggct
-gaaagaatgtaaagggacctgaggacactttgaggggtgatcagtcaagacacattcata
-ggccgggcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggtgga
-tcacgaggtcaggagatcaagaccatcctggctaacacggtgaaaccccgtctctactaa
-atatgcaaaaaattagccgggtgtggtggtgggcgcctgtattcctagctactcgggagg
-ctgaggcaggagaatggcgtgaacccaggaggtggagcttgcagtgagccaagatcgcgc
-cactgcactccagcctgggcgacagggcgagactgtctcaaaaaaaaaaaaaaaaaaaga
-tacattcataatcttgattgaggtaatggcttaatgggggtgtacataagtcaaaaaatt
-acaaaatggtaaactttaaatgtgttcagtttattgtatgtcaatttaaacttccaaaaa
-aGCtattattttaataaaataaataaatCTCACAGTGAAACAGAAATATTAAAGTATCAT
-AAATAGTTTAAAGACGTATGACAAACTGAGACATGTGATGAAGTATCGATACCAATAAAA
-TATAACAAGTTAACATGAAGcaacagggaaaacatgaaacccctagcagaaaatgaaaaa
-gtaacatgaactagctttttaactctataaacggcctgaaaaatgggaaaaaatctgtgt
-gactgtgatcaaataaatgcagattaaaactacaatgagatcttgttttttacctatcgg
-attgtcagagaattaacaaacccaagtctgacaaggcataaatagaaataagtctcatca
-tcagatgctccggtttataactaaatatgtccattctggaagacatttatctatacagct
-ttcaaaacccttaaaaatgttcatgttctgtggctcagagactctacttttagggatata
-ttctggggaaataattagagttcatatcaaaaagattaatgtatatacagcacaatcata
-gcagcatagtttaaagtagtgaagaggcagtggggtaagatggctgaacagaagcctcca
-ctgatcatcctccccactagaacaccaaatttgacaactatctacacaaaaaagcacctt
-cataagaataaaaaatgaggtgagtgatcacagtacctagctttaacttcatatcaccta
-aagaggcactgagaaggtaggaaagacagtcctgaattgctgacaccgcctctccccagt
-cctcaggcagcagctgtgtggtgtgcagagacaatatgtgtacttgcaggagggagagca
-cagtgattgtgggatttcacattggaactcagtgctgctagcaccaggcagaacccagca
-ggtgcctaaaagggatcatttagaccatccctagccagggggacatcacccatcccagag
-gtcggaactccagtttccgcaagcctcaccaccgtgggctaaagagctctggggtcctaa
-ataaacttgaaaggccgtataggccacaagaactgcaattcctaggcaactgctagtgct
-gtgctgggctcagaggcagtagatttagggaccactcaacctagtgagacaccagctggg
-gtgtgtgtgtgtgtgtgtgtgtgtgcgtgtgtgtgtgtgtgtgtgattctcgtgcctcag
-cctcccaagtagctggtgatggcagtggcagcccatctggagtggacgctgccatcaagc
-cagctgcagcagggagggacagctggggctgcacattccacagagctgcagagctgggga
-caatgagagccccacaccttccaagctggtgcagcaggagctccccaggtgcaactgcag
-ccactcaagtcacggctgtgaaccccggcctccctgtgttcttgtgggtgctgggagcag
-gcaggggtcctgcacttttgggtgcagctgcaggcgcccaaaccatggctgcggaaccag
-acatctctacactcttgagggtcagggaagtccccactgccctcacaagcttagaagtgc
-ctgctcccacagcctggcgcctccctgctgtcggtgcccgctctaatcttggagcaaagt
-tgaggccaagcccaggtgctgtcatagcctgttgggtgtgcacacgcttggggcagtgct
-gacataccagccccctgccgcctcggacccctacagacctcgggtgctgacgagcatagg
-aggaaagccgaggtggggctgagggcagctcggcacctacagcctgggtgccatgaatgg
-cagtaggagTCTTCTCAGTTCTGTCTCCCTCCCTTCAGTGTGGATGAAGGGGTAGAAATG
-AGGTACAGCATCCTGTCTTTCCCAGGGGTCGTGTTGCATCCTTTAATAGTTTACCACTGA
-CAGCACTACCAACGATTTGGGGATTGTGTCTCGAGGAAGCAATTGACCTAAATTTCATGT
-ATCAATGAAACTGTTTTTCCTTATGGttttaattatttatttattttataaaataaaata
-aataGGCTTTTAATATATAATGAAAGCCTTTTAATGTTAACATGCAAGGACTGAAAGAAT
-ACCTGTTGGACTGCAAGATGGCTGCTCCCTCTACCCTCAGCTTCAACTGGCCTGTCAGCC
-AAGCTTTGATTTCCTAGGCAGAATATAAAAGAATTCCTCTCTGTGGTGGTCCAGGAGACC
-AAGGGAATTTGGGGAGGTGATAGAACTGCACCCTGATCATGCTGGTGGTGAAAACTCGTG
-CAACCGTACACCCAAATGTCATCTTTTTTACTGTATGTTAATTTTAGAAATCAGAAAGTA
-AAAGATGCAATCACAAAAATATCATTTGGTAGGACAAACTTATTCAGTATATGAAGATAA
-TAGAGAACTTTTATACAAAAGTGGCTCTTACaaaatattaatataaaatattaaaatata
-aattCTCAAGAGCTATAACTTAAACTTCTATGTTAATTTAGGTAAGCAATTCTCCTATGA
-AAAGACTTAACGAATTCTTTCCTTTTCTTTTCCTCTTGTCTTTTCATTTTGCTGCAAGGA
-GCAGCCTTAAAGCTGACTGAAACAGTTATTGTGACCAGCATGTAATGCTTGAAAAGATGA
-AAATCCAGCTTTAAATATGCTCAATCTCAATAACttttttggtttttttttttttttttt
-tttttgagacggagtcttgccttgtcacccaggctggagtgcaatggcacgatctcggtt
-cactgcaactttcgactcccagattcaaatgattctcctgcctcagcctcttgagtagct
-gggattacaggcaccggccaccatgcccagctattgtttgtatttttagtagagatgggg
-tttcaccatgttggcaaggctggtctcgaactcctgacctcattatctgccgccttggcc
-tcccaaagtactgggattacaggtgtgagccaccgcgcctggccTCAATAACTTTTTAAT
-AGGTATATGCTTAGTTTATTCATGTTTCTTTGCTAGTTTTTTTTCCCTGCAAAGAAGAAG
-AAGAAAAATAATTTTAAATCTTATTTGAAGGATGATTGTACACTGTGTTATTGGCCTTGG
-AAAGGAGAGAAGGAGGAAAAGGAGTAGGAAAAGGGAAAATATCTTAAGAGGTTGTACTGT
-TAATCTACTTCCAGGCAGATTTTAACCACTAAAGCTAAAATGCTATTATGAAATTGAATA
-TTTCAATTGAATATTGAAAATGGTATAATGATgccgggtacggtggctcatgcctgtaat
-ggtagcactttgggaggccaaggtgggtgcatcacttgaggtcaggagttcgagactagc
-ctggccaacatggtgaaactctacctctactaaaaataccaaaaaaatagccggaaattg
-cttgaacctgagaggcagaggttgcaatgagctgagatcatgccactgcacttcagcctg
-ggcaagagagcaagactccatcttaaataaataaataaataaatgaaAATGGTATAGtgg
-cttgaagatgcaggggcccatgaggaagaacatggatggcccctagaagctgaaagcagc
-ccccaggtggcagccagcaaggaagtggggtcttcaattctacacgtgcaaggaactgaa
-ttctatcaacaacctgaatgagcttggaagctgattcttccccagaagccgcagataaga
-gctcagccTGCTAGGGGCTTGAGAAAGGGGAAAGTGACTTTAAAAATGTAACTCGAGGGA
-GTTCCAAAAGGCTAAGCGATTCGGTGAATCTAATAAACATGTTAAAATGCATAAAGTTCG
-GGTGTGGGGGAAAGGGAAGGGAGAGCATTAGGACAAATAGgttcttttctgagttctggc
-caggaggcttcttgatcagttcaaattgttacaaagttcagctggaggtttccttctccc
-tgtggccgctctgggcctctggcagccctcctcaaggagcaatccgtttccttcagaggg
-tctgtgggttctcctggcttccctaatgcgttcctgcagtccttctgaagcaaaacttaa
-tgatgcgagcctccacacgctgctctgaccgtccgagtgggagctgcaatctagtcctgc
-ctcccgtctgtcatgatcccTGGTGGTTTTTGACTACagctcaattgttttagattccat
-gtgtaagtgagaacatgaagtatttgtctttctgtgtttgactcatttcacctagcagaa
-tgtGTaataaacattaacaaaatgaatgtgtaaaatcaggtagtgatcacagctacaaag
-aaaataaaacagagtgatagatggaaagtgatggggaggaagaacctggttagaaatggt
-ggtcaggcaggacctctctaagaagggaaaagagctgtgactgcacgataagccggccac
-gtgaagaccttgaggacaacatgcaaagctgatgacccaccggccctgcaaagaccgggc
-gggagataagcttggctggcgcgaagaaagaaggctggagggagtagaaatggggacagg
-agctgaacgctgggagagggggctcaaagCCAGCTCGCGTAGGCAGGGACTGGGCACTCG
-CAATGCGCGCAGAACAAAGGCCTCTCTCTCTCTTTCGCCACACTAAGGGCCAACATGGTC
-ATCTCCAGGTGCGGATTCTGCCGTAAAATGCGCCCCTGGCGACTCACGACCAGGACGCAT
-TCCGCACCGCTCCCCCACGCCCCGCAGCCCGCCCTCGAGGCTGATTGATTTGTGCCAGTC
-TCTACCGCCATCTGCCGGCAGCACTCGGTACACCCGCGCCCTGGAGGTCGCACGCGCTGG
-CCAAACGGGCGCACCAGACACTTTTcagggccctgccaaagacctcccaatgtctactgg
-cgtcccagacacaagagatccaggccaagactcacacttcacaagatacacagacacggg
-ccttagggaacaggaaattccatgaaacttccatttacccaattagccggactcactgag
-ccccagaatagggttttcaaccaactcctactaaaattAAAAAGTAATGTGTGGtataga
-ttggaataatagacattggaggctacaaacgatgggaggcggagaggggtgagggttgaa
-aaattacctattgggtgcaacattcactatccgggtaatggggcactagaagcccactcc
-accactatgcaatatatgtatttgtaccccgtaaatctataaaaataaaaaCTACATTAA
-AAATAATAATAATGTCTGGTCATCTAAATAGTACCTCTACAGCTTATTAAGTGCTCTGGA
-GACGTCCCAGTTGCCTGTCCTTCCCATTAAAGGTGATATCCAGTGCTGATTTCCCCTTCA
-ACCTCGGGTTCCCATAAACCTCTTCTTTCTCACTCCTGCTGCCCTCCGGTACTCCAATAA
-AGAATGATAGATGggccgggagcagtggctcacgcctgtaatcccagcactttgggaggc
-caaggcggatggatcacctgaggtcaggagttggagaccagcctggtcaacatggtgaaa
-ccccgtttctactaaaatacaaaaattagctgggcatggtggcgggcctcagtaatccca
-gctactcaggaggctgaggcaggagaatcgcttgaacccgggggcagaagttgcagtgag
-cagagattgtgccactgcactccaacctgggcgacagagcaagactccgtctcaaaaaag
-aaaaaaagaaaagaaaCAGTCCCAGTATGCATCCATGTGCATGTGCATGCAGGTGTATCT
-GCCTGTGAGAGCTGCGCACGCGGCTCTGAGTACCTGGGAAGACACCCATGTACAGATGCT
-GTACATGTGCGGGGTCACTCTCTGGCGCATTCGGAGGCATGAGGGCTACGTGCAATGCGA
-GGGAACCTATGTCCAGGCTTCCTTTCTTGGTTTTCCTCCTCTGAACTCATGCATCCCTTC
-ACAAACagtccagctcctggctaaaaacctatgtgtgatttttcagcccaaacacaggca
-atgacaggttttacctggcaggcctcacagctgagtcgtgcacagctgatgcgttgcagt
-ctttaaagacagttgcagacacagactcaggcctcctggacagtcgacctctcacacaca
-tctccgctcccaacccaagtcttcattcagacacgtcttcattgcagtggggtaggcctt
-cggccaggacctccttatcttggggagtggagaatccttgaagacactttcctccatgct
-gactcagaagttttcccactctcccttccccaccccatccctggcccccaggtccgtaca
-acttcaggagcctttttgttggaagcttttctgcagtgagaccaaccccacacctgtgct
-catccacccgaccccagttggcatcattctatgaggaaattagaacaggtggatctgtgt
-tctacaaaataaaacaaaccaggttctctggtttagcctctttcttgtactgtaataata
-agagatttggggcttggctattacttgctttgactttttttgttttgagacagggtttcg
-ctctgtcacccaggctggagtgcagtggtgcgatctcggctcactgcaacctccgcctcc
-tgggctcaagcaatcctcccacctcagtctccctagtagctaggactacaggtgcacacc
-atcatgcccagctaatttttatattttttatagagatggggtttcaccatgttgtccagt
-ctggtctcaaattcctgagatcaagcaacccactggcctcagcctcccaaagtgtgagga
-ttacaggcctgagccaccatgccgggccatcattaatcagctactccagcacttagcagt
-tcagctctctcctgctcagctgagctcctgaTTGTACAGTGGTTAAGAGCAAActgcctc
-tgccacttagtaacctggtgacttgaaaaatcactttgccttttcatcctttggtttctt
-catctgtaaaatgaaaataacaataaacaatacctacttcacagggtggttgttgtgagg
-gtgtagtgagttgatgtatgtaaagcATAACGTAGGTTCCATTGAAGTGTTTGCTATTGT
-GTTCAACAGGGTCCATTTCTGCTTGGAGATCCACATGGCTCTGGGGAGTACCTGTTGGCT
-CAGCCTAGGTCACGTGTTCCACCTTAACCatcccttccctgctccaaggtagagcccgtg
-acctgaactaaaccagcaggcacgctccacctccaacaccggctcaaggtgggcgtgtaa
-tataagctggttcaattagaatgaatcttttttttttttttttaaagacggagtctcatc
-ccccatcacccagactggagagcagtggcacaatctcagctcactgcaacctctgcctcc
-caggttcaagcaattatcctgcttcagcctcctgagtagctgggattacaggtgcctgct
-gccacgcccagctcatttttgtatttttagtagacacagggtgttgccatgttggccagg
-atggtctcgaactcctgacctcaagtgatccacccacctcggcctcccaaagtgctagga
-ttacaggcgtgaaccactgtgcccagcccaattacagtgaatcttaatacactggctgaa
-aattctgggacacagccagtctctctctttccaacaggacatgtacaaggacctgtacaa
-ccctgggagatgctggcatattggggccacaagcagtgctgacctgaagaaaagggcaac
-acctcagaaaacaaagtagataaatagaaaccaagtccttggtgccatcacttgatttct
-ggacaaagcctcacctaagctatttattgacctgagcccttcatagtttaggccaatGTG
-ATTTGGTTGTTTTGTTACCTGTAACCAAGTATCTTAACACAAAGTGGATCTGTGAGTGAC
-CAGAGCCTCTTGGGGGTTGTAGCAATCTAGTAgttggcccagaaaggccaactctgagat
-ggagtgtagggtgcagaatgttgagtaatgagtgctcttggaatcaacaactgaggaaga
-cagaaatatgcaggattgggcacagggagaagttcagctgcagtgcaggcccaagggtag
-ttgcagctgagccttcaggaagttctggagccagagtagcccttctgagttgttccaagC
-ACTGAAGGCCTAGCAAGTTCCAGGGGTATTAAAATCAATAAGCCTGTCAGCCCCGACAAT
-GCCCTCAATAGGTCTGGGCACAGATTGGAGAGAAGCTGGGCTCCCACTGCACCAGGAGGG
-AGTGGCCCAGAGCCACTGAGCCATGGAGACTCAGGCAGGGGGTTGCTCCAGCACTTCTTC
-TGGAGAAGTTTTGAGCCCCAGATGCAGTTAGCACAGTTGCCCGCCCCTTATCATAAGACG
-AAGTCCGTTCCCACCACATCTTCTGCAAGACCTAGCTGGGGACCCCGAGACACTGGCAAA
-AAAGCAAATGTAAATCCAGCTTTATTGGTAAAAAAGGAATAGCAGATTTAATCAGAAATT
-CCCACCTGGCCCAGCAGCACCAACCAGAAAGAAGGGAAGAAGAGAGGAAAAAACCACAgg
-aagaaagaaaggagggagggagggagaggaggaaggaaggaggagggaagggaagggggg
-aagaagggagggagggagggagggaaagaaagagggaggaagggCAGAGGGAGCAGGGAG
-ACTGTAGATCAGGGTCTGAATGGAGATCCGGTCCTGGAAGTAAATGATCCAAGGCTCCAG
-GTGCTGGGAAGAGAGCAGGAGGGGAGGGCGGCCCATGGCACTGCCATCTAGAAGGGTAGT
-GGCTCTTCCACAGGAATGTTGAGGATGACATCCATGTCTGGGGTGCACCTGGTGGGAGGC
-AGCACAGAAGGCCATGAGAGACCAGAGGTGGCGGTGTGGGAGCACCCACTCAGAGGAGCC
-CTGCTCTTTAGAACTCTGGTACGTACTTGGGTTGGGGGGCAATCCCAAAATACAATCTGT
-GATCTATCTGTGACCTCAAAGCCCAACTGTGcatacacaagcatacacacacacacacac
-acacacacacacacacacacatacacacacaTCAAAAATGGAAAAGAAATGAGTTTGGCA
-GGACAAATGTTCCCCTGACAAGTCTGAGGTCAAGAGGGAGCAGGAACTCAGCTCTGAAAT
-GCTGAGGGCCCTCAAGATgatcactggctttggagtgaggatgacaggtttgataacttt
-gacctgtgtcaccttgagcaagctatttctactctcccagcctcactccttcagttgGCA
-CTTAAGTGAAAAGCACTCATTAAGTCCCAGACCCCAAGtgagcctcagtttcctcatctg
-tcaaatgggtttaatattctaacctcagtcattggtggaaagattaaatgagaccatgcc
-agcaggtaataagtgctcagtaaatgacaggcaTTATTATTTCCATGAAAGTAGCAAGAG
-AGATGGATTCCCATCAGCAATATATTCCCCATTGCAGGGACCAGCACAAATATTTAAGAG
-GCTGAAGGATTACATTCTGTTTCACTCTCTTTTCTCTCTTCCAAGGAGACCATCCTCTCT
-CATGGTTTCAATAATCTGCTGATACACATGAAGTATTTAGGCAGGAAATGTCAGGATACT
-TGCAATTTACAAATACTATTAAAAAAATGAACatgaaaccaacatagaaaaaaaaaaaat
-ttctaaatctagatgggcaaaactggctattcattatatcattctctcttctttatattt
-gaaatttttcataataatagtaaaaaaaaaaaGTTcatctctatgctggcaacacctaaa
-tttctacttccagccaatatctgtcctctgaggtctacactcatcttgtcaattgcccac
-ccaatgactccaccttggcacctcatataaatcaaacttactgtccaagtcaactgtatg
-gtttttgttttgttttgttttgtttgagacatggtctcactcggtcacccaggctggaat
-gcagtggtgcaatcacagctcactgcagcctggaactcctcaatcgatcctcctgcctcc
-caaatagctgggaccacaggcacgtgccaccacatctggctaattttttaattttttgta
-gagatggaggtctcactatgttgtccccctggtctcgaactcccagcctcaagcgatcct
-tcttcctcatcctcctaaagcactgggattacaggtgtgagccaccatgcctgcctccaa
-ataaactttttgactgtgcctacatacacatccctcaccccgccccagccttcccaatct
-ctgcatttgacatcaccaccaccccattataaaagtcaggaacccaggggttattcttga
-tacctccctttcctgtacttcccaagtcatgcaagtccttcttactttcctaaatatttc
-tccaatctatctatttctcccatttcttctgccacactcttggccaggccacttcccatg
-ttcccctggacaactgccctcacacccactagaattccagctgccattctggctccttgc
-caatctcatccccatgctcttttcttttcttttaagaaagagtcttgctctattaagcag
-gctggaaggcagtagcaccatcttggctcactacaacctctgtctctagggctcaagcaa
-tcctcctgccttagccttcactgcagctgggactacaggcgcacgccaccacgcctggct
-aacttttgtattttttgtagagatggggtttcaccatgttgcccaagctggtcttgaact
-cctgggctcaagcaatcctcccaccttggcctcccaaaacgctgagattacaggcatgag
-ccaccacacccagcccaccatgctcttttcaaactgacttttttggaatacaaatctgat
-catgtggcttaagatcctttgcttctgggatcaggcagaacatctgggcctacagggcac
-tgcatggaggtccctaggggctgagttgccctgctcccttcccgccactctccctgtcac
-tctgcattccaaccactctggcctcactcagctccgtgtcaatgccaagttccttccaac
-catagctccttcacaGCTCAAGGCTCAACATGTGGTtggttcatagagcagtaacataag
-catcaccgggtagcttcttagaaatgcagaatcAggctgggcatggtggttcacacctgt
-aatcccagcactttgggaggccaaggcaggcagatcacttgaggtcaggagtttgagacc
-agcctggccaacatggcaaaaccccgtttctactaaaaaacataaaaattagccaggcat
-ggtggtgcacacctgtaatcccagctactcgggaggctgagacaagagaatcacttgaac
-ccaggaggcggaggttgcagtgagctgagatggtgccagtgcactccagcctgggagaca
-gagctagactctgtctcaagaagaaggaaggaagaaaggaaggaagggagggagggaggg
-agggagggagggagggaggggaaagaaagaaagaaggaagaaagaaaaagaaagaaaaga
-gaaagacagagagagaaagaaagaaagaaaaagaaaagagagaaaggaaggaatgaagga
-aggaaagaaagaaaagaaaagaaaaaagaaatgtagattcatgagccccactgagaccta
-ctgacttggaatctgctttttaacgcgatctccaggtgtttcctgggcatgttccagttg
-gagaggcTCTGCTTAACAGTGTGCCATTTCTACTTTTTAGGAGGGAAAATGTGCTTCCTT
-GCTCCTGGTGTTCCCTTCCACGTGGAAGGGCATCCATGAGTGTATTGCTCCTGGCCTCTC
-TCTGCCCCCTTAAATTCTGCTTTTGGAAAGGGGGTATGACCACCAGAATGGTGAGTGTGA
-GGAGAGGAAGGGGACACAGGGAGCCCAGTCCCTTTCTCTCTCAGCAGCAAGAAACCCGAA
-AGGACTCCACTCTTCTCTGCCCCAAGGCCTGGCTCCACGTGGGTCCAGCTCCACCATGAT
-CGGGTGGTTCAATTTGCCTAATTCTGGGTTCACTATTCAGAGGCCAACACAGTCTCTAAA
-ATCAGCTTTACCAGAATAAAGGTGATAACCTGGCCCACATGCACCTTACCCCTTTCAGTC
-TCATTCACTGTGTTCAGAGTTCAGGTAAAGACAAGTGACTATTTATTACGTCCCCCGGAG
-ACCCTGGCAccaccgcctagaattgctcttccttcagctcccccatcagtctctttcacc
-tagtgaatttctatgcatccttcaagcctcagttcaaatgtcacatcctcaggaaaacct
-tccttgactgcccagacTTGCTGTCCTAACAGTTGCtttcttttttcttttttttttaat
-taaaaaaaaatttttttttagatggagtctcgctctgtcacccagactggaatgcagtgg
-cacaatctcggctgaccgcaacctccgccttccaggttcaagcaattctctgcctcagcc
-tcccgagtagctgggattacaggcacccgccaccatgcccagctagtttttgtattttta
-gtagagacagggtttcatcatcttggccaggctggtcttgaactcctgacctcgtgatcc
-accggccttggcctcccaaattgctgggattacaggcgtgagccactgcacccagctCCT
-AAGAGTCACTTTTGCAGTGGCATGTACTCTACTCAGCAGCTCTGGGCTCTGCTGCAACTC
-CACATTTATTTGTGGCTCATTATCGACTCATGTCCAGTTCCCTCTTTAGTTCCATGAGGG
-CGGGACCAAGGACTGTTCTCATTCACATGGTGCCTGGCATTCAGAGGCACTTCATAAATC
-CAATAGTATTTTGTTTTGGGGGCGGGGGGCGGTTTagaaatagaagaaaaggaagaaatg
-gcgataggagaggagaaggaaggaaaacgacaggagggagagacagatgaagaagaaaaa
-TTAAAGAATTTGCAAATGCTAGGCTCTGCCACACATGGTCCTGTGGTGTCATCAAGGAGA
-GGTAAGCCTGGGGGACCCCCAACCCAACCGCAGAGGGCTTGCCCCAAGGAAGGGCAGGCA
-AAGAATTGGTTTCTGGGGCCCAGAAACCTGCCAAGTGAACAGGACAGACTTCTCTCCTTG
-TAGAGTGTCTTCCAGGCTATTCTTCCCTGAAGCCAACCACCCCACTCAACTCTGCCTTCC
-TCAAAAACCCAGAAGTGGAAGGCTGTACCCACTTGGTTGACAcatgggatctgggaacta
-gaagggcccttagagattacaccacccagcctgctgtgtacagatgggaattggaggcct
-ttgcagagatgggaaaggtcacatctgcccctggtcagtggcagatccaaggtggaaacc
-caggaccgcccctccctccctgtacagggttctgccatccacACCAGGCTGCCTTCCCCA
-AGAACAGAGAGCCTCCGTGAGCTCAGAGTGTGACTGGTTTAAGAGGCAGTGGCAAAAAGA
-TCACATACTTGGGTCTCCGAAGCAGAACATCCTCAAATATGACCTCTCGGGGTTCCCGGG
-TCTGGGCTTGGAGCTCTTCCACCTCGGCCCTTAATACAGGCATGTTCTCCTCAAACTGGT
-CAATAATCTGAGAGGAAAGGCACAGCAGGGGAGAAGGGAGAGGCAAATGGCCCCCAACCA
-AAGGGAGAAAGGCCAAAATGAACGAGGAGCAAAGCTATCTGGGGAAATGGTATGGGTTCT
-GTCACTGGGACTTGCTGGACTCCAGGGAGGGGACTTCCCCATGCAAGGTGCGGCTGGCTT
-CCAAGTTAGTGACAATATTCAGTGGTGCTGAAACAGGTGAGGGATCATGGAGAATGGAGA
-CAGGTTACAAAGTGGCGGGGAATGCTCAATCATGGGAATGAATGGAGGCTGGCAGAGATA
-GTGAAGGGCATACACATTAAAAACCAGTGAAGAGGCAAGATAATGAAAATTAATTCAAGA
-AGGCAGTGATGGTGAAGTTCATTAACACTGATAATGGGTGGTGGGCAGTAACAAGAATCA
-AGGGGTAAAGATGCACGGTGGTTAATGGCTGAATAGGTGATGTTTGGTGATGGTTGTAAA
-TGGGTCATTAGCCAGCATTGCTGGCTAATGAGGCAAGGCCTAGGTCAGTGCCAATCGCCT
-TCCCAGATGAAAGACAAGTGACAGTAATGGCACCGGCAAGGAGGGAGGCCAACACCAGAG
-TCAGAGACCTCCTGAGCGCCAGATCAGGAGAAGCCTGACTCATTCCCACAGGCCGTGGGG
-ACTGCCCATCCACTGCTTCCCTACAGGGACCACCACCTTCCTTGCCCACGCACTTCTCTG
-AACCTTTGCATGCATTTCAGGAAGTCCTGGCTTTCCCACATCTTCTGTAGGAGAGCCTCT
-TCATAGGGACGCTGGGTTTCCTGTGGAGGAAGAAGAGGTCTGGCCCCCAGGTGCCTCTTC
-CTGGGCAGCAGAACATGGTAGAGACCGATGGGGCTGCAGTGGGCCTGGAGGCAGAGGATG
-GGGAAGAGGGCGGGGTGGGGGTGAGACCTGGATCCCCGCTCCCACACAGCAACTGGCTAC
-TCACCGCCACCACAGAACTCAGAATTTTTTTCTTCTTCTTCTGAATCTTGTCAGACAAGG
-ATTCCAGGACCTTTCTGCGCATCTCACCGAGGTCATCCAGCTCATCCTGGGAGCCAGCAG
-AAGGGTGTTGGTCACCAGTCCTGCCTCCCACACAGTCTGGTGGGAGAGGGGCAGGGGCTC
-CCCTACCTGCTGGCTGTCCTTAACCTGCTGCAGCTGGCGCATAAGAGTGGAGATCTGGAC
-AGACTTGATGGAATACTCATGGTCCATGTAAGTGCTCAGGAAGTTCACTTCCTCCTGGGT
-CTTCTCAATCTTGGCATTCAGCTGCTCTGCCTGCTGCTCAAGATCTGGGGAGGGGTTAGG
-GAGGTCAGCAGGGACAGGAGGCAAGACCTTCCCTCAAGCACCTGGGCCCCAGGAGGCCCA
-GGAGGCAAGGTCTCCTTGGCCAGTAACTGGGGTCTGGGCTGAGGTGAGCTCACACAGGGC
-TGGGAGGTGGTTAAAAGTTAAGGCTCTAGACGGTTTTCCACCCCTGCAGGAGAAGAGGCA
-ATgctgggtaggaaaaaggaagggaattggtgcatgatccctagactagtccccactctg
-ccactgacttgccgggtggctctcgccaagactgtccctctccagacttcagtctcctca
-GAGACACACTCAAGGAAGTGAGACCAGGCAGATGGGGTGACAGTGGCTCCCAAGACACAA
-CCCATGGCAGGATTAAGACAAAGTCTATCCTGTCTTCCTCCAGAGAGACCCCCAATGTCT
-GGGGTTGACTGATCCACCACCCCTCTGCTCAGCAGGTGTGTAGTCTGCTCAGGGAAAAGG
-AACCACAGGCCAGGCAGGAtggaagccaggagacccaggttctagcccagccactgactc
-ccagaaggaccttggCAGGAAACAgagccaggctaggattggattctggctcctagctat
-ataaccttccacaagctactgcacctctcttagcctcggtttcctcatctgtaaaatggg
-aggacagcttccctgcctccaagtagttgcaatgactgagtgtgtgcctgtaaCAATGCA
-GACATTGGTAGAGACCCAGATACGGGGCCTGGAAAGAGCTAAGTGTTGGGTAACTATGCT
-ATTCGCTCTGTATCTTAGCATTCCCATCTGCCAAGAAGAGAGCCAATGGGGCTGAGGGTT
-TCTGAATGGCAAGTACAAGGTGAATGCTCTGCTGCTGACCTCCCCAAGGTGCCAGGGGGG
-AGGGTCAAGGAATTTGCCAGGGATTCTTACAGCTCATCTTGCATTTCTTCTTTTCTTCCC
-ACTCCTGAAGCTCAGATTTCAATTGCTGCAGCCTCTTCTTGTTTGAGTACTCCAAGATGT
-CGATGATGGTCTGCGGGAGGGGTGGAGTCAACTCACCCACAGGCTCTGCTGGCTCTCAGA
-GGCGGCCACCCAGCACTTCCTCAGAGGAGTCCCCAGTCCCAACCTCACTCCCAGAAACCT
-GACCAGAGGCTaatcgggacagtaacagtgtccacccatagggttgttgtaaggactata
-taaagacatacagatcgcttGCTATTACACGTAGAGGTGTTTGCAAATGCTGTTGGTGGT
-AGCAGCGACCTCTGTCGCACCGGTACAGTATGTGCCCGGTGAACCCCCTCTGGGACGGGT
-GCTATGGTGCCGCATTTCACAGAGCTCGGGGAGGCAAAGTTAACTAAAAGTCTCCCGGCC
-AGTGAGTGCTGGCGCGCTGGGATGAAACCCATCTCGGTCCTCTTGCAAAGCCCAGGTGAG
-GGGAGTGAAGGGTGAAGAAATGCGTCTTCCAGGTGGAGGAAGCACCACGTGCAGTGGGCG
-GGGAAAGGCAGGAGAGGGCGCGCGAGTGCGcggagggagggcgggacggagggagggagg
-gcgggacggagggagggagggagggacggagggcgggacggcgggagggcgggacggagg
-gacggagggagggcgggacggagggcgggagggcgggacggagggagggagggagggagg
-gacggagggcgggacggagggacggagggagggagggagggacggaggttgggacggagg
-gacggagggCGGGCGGATGCCGCGGGTCTCACCGCCAGGGTGTCCTGCTGCTGCAGCAGG
-GCCCGCACGTGCAGGGTCGTGCTGTTCTCCATCTCCTGGATGGTCTCGATCAGCTCCCGG
-TTGAGCTTGCTGAGGAAGTTCTCACGGCTTCGGAGCTCTCGCAGAGCGGCCCTCCCGCTC
-CTGAGCGAGGTCTGCGGGCGGAGGGAAGAGCAGAGAGGCGGCGCTGCGCCCTGCCCGGCC
-TGAGCCCCCGAAAGCCCGTGGAcccgccgccccggccccgccagacgcccgcccccgTGC
-GGCCTCCTGCTGGTAAACGCGGCCCAAGCTGGGCGGTTCCCCATTGTCTGCGCCGCCCGG
-GAGCTCCGGGACtctcatccgttcggaaacgcacgtgtacccatcatctcacatccctga
-ggtgcgggtgcatctacagttggtggcgtgtcaccaactaatcaacaaatatattattag
-tgggtaaataaagatgtgccttcatatcaatggcttctcagaatcaatgaaatatagAAA
-TAATAGTAAGggccgggcggggtggctcacgtctataatcccagcactttgggaggccaa
-ggtgggccgatcacgaggtcaagagttcgagaccagcctgaccaacatggtgaaaccccg
-tctccactaaaaatacaaaaattagccgagcgtggtggcgcgtgcctgtaatgccagcta
-ctggggaggctgaggcaggagaatcgcttgaacctgggaggcggaggttgcagtgagcga
-gatggcgccactgctctccagcctgggcgacagaggaagattccTGTCCCaataataata
-ataataataaACGCCCCAGGTAGGTTAAGAAGGTGGCAGAGCGACCGCCATGTCTGGAGG
-AGAAGCAGGGGAGGCAAAATGGATGATAAACGTCAGCATTTCCGGGCAGGCCGCGGAGTC
-AATGAGTACTCTCATTTCACACAACAGCCCCCAGTGGAACAAGgagggtctgagggttaa
-gtgactcgcctaaggttacacccagcaggtgcataaaaccTACAGTAACAACAACAACAA
-CAATTGTACTTCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAATAACA
-ACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAAT
-AACAACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTaa
-caataacaacaacaattgctgagggccctctacatgccaggccaggtgctgtgccttgct
-ctgcaggtggcacatggtatctgttcaccctccaacagctttatgtttactaactctatt
-ttgctgataaatggaggctcagagagtttaatgacttgcccagtgtcacacagtcaagaa
-gtggcagggctggaactggaaagccagacttctgaatcccaatgtctgtctttccgttat
-gctaAAACAAGAACTGAGTAGCCTTAAAACTGCAAGGCATGGCTGAACCAcgtagtgact
-aagacttggatgttgaacctagacacaccttggttcaaatcccagctcagccacttacca
-tctaagagaatctgggcaagttagttaatgtctcagagcctccttatactcattctaaag
-gtaaggaaactagtatctgttttagagaactgccgtaaaatataaatgagATTggacagg
-tgcggtgactcacgcctgtaatcccaacactttgcgaggcccagatgggaggatcactca
-aggccaggagttcaagaccagcctgggcaacatagtgagacctcatttctacaaaaagta
-aacaaaattcgctgggtgtggtggtgtacacctacagtcctagctactcaggagtctgag
-gtgggaggaatgtttgagcccagaagatcgaggctgcagtaagtcaagattatgccacca
-cactccagcccgggtaacacagcaagaacttgtctctaaaagtaaataaataaataaata
-aataCAATTTTaaaaaattaaaatgttcgctgggcatggtggtgtgcacctatagtccta
-gctacttgggaggctgaggcaggaggatctcttgagcccaggagtttacggctgcagtga
-gctatgattatgccatttcactttagcctgggtgacagagcaagaccctgtctttaaaTT
-CACAATCAAGCCACTTAGTGAGAGTGCACTCATGTGCACTCAGTGAACAATAGCTGATAC
-TACTGTCTCTGGCTCTAACCCTCTACCCCTGCCATAAATATTTGCTCTTTCATTTGTTCC
-TGTACTTCCTCATTTCTCCGTCCTTTACTAAAAACGACCCCTTCCTAGCCCTCAGCTCCT
-TTATTTCTCATATaacagtaatcatgctgatgtgctgagtgcttgccatgtggctgatac
-tgtactaagcacttcatgcgcactgcagcacatcaccctcacagcaagactaagagatgg
-gcactattattaggccaactttataaaagtggacagcagtcgggcacagtggttcacacc
-tgtaatcccagcactttggaagagcaaggtggaaggactacttgagcccaggagttagag
-ccctgggcaacaaagggagatcccatctctacgaaaattagctgggcatgatagtgcatg
-tctatagtcccaactactccgagaggctgaggtgggaggatcacctgggctcggaaggtc
-caggctgcagtgagccatgatcatgccactgcgctccagcctggatgacacagcgagacc
-ctgtctcaatcagtcaatgtggacagcaaggattaaattcagtaacttattcaaggtcac
-acatagcagagctgTCATCCTTGAAGTCTTGCCTCCTAGCCACTCCACTACCTTGTCTCC
-ACATCTCCAGACCAAAATACCCAGAAGTATCTTGTGAAAAATGTTATTCTCCAAGTCCTG
-GGCCCACTGAAACAGCAGCACTAGggtttcagttcaaatgtcacccaccttagcagcctc
-tcgttagcacctaaacaattactgccacactctcctccgtgcctccagccccctaacctt
-attcttaggcttctctttagctcttatcatcatttcaaatatctttctcttgttgattgt
-cagtctcccccatccaatagaatggaagtcccctaagatcagaggtcacattactggtga
-accctcatactcagaatagaacctggcacatggtaggtgctcaatcaatatttgttgatt
-cattaaatgaatGAAAGATTGCAAGAGACAGTATTAAGAACTGGACtggttaggagcaca
-agttttagagccaaattgtccacgttcAGCTTCTACATCAATCAAAAACACCTAAACCCC
-TCTAAAGTTAGGATAAAAATAACAGAAATggctggaagcggtggctcacacctataatcc
-cagcactttgggaggccaaggcgggcagatcacctaaggtcaggagttggagaccagcct
-ggccaatatggtgaaaccccatctctactaacaatacaaaaaattagctgggcgtggtgg
-tgggcgcctgtaatcccaggtactcaggaggctgaggcaggagactcactcaaacctggg
-aggtggaggttgcagtgacctgagatcttgccactgcactccagcctgggtgacggagtg
-aaactctgtctcaaaaaaaaaTTTTTTTAAAAACTAAGAGAAATATGAGTTCCTCCTTTA
-AGAATACTGGGCTACCTCTAAACCATTTTGCAAGATAAAAGGTTAAAGGGGAAAAAAAGG
-TTTCAAAGCAAATTATATTTTCCCTTGTTCTTTATATAGTAGTCATTGTTCATTGAGCTA
-TTAAAAATTTTCTTGAAGAATTATTCTATAGTATTTTGTAGTCTTTATAATACTTAGTAT
-TTTACTTTCTGCTATGTATGCTAAGGACTTGTCTTCCTTTAGGCATTTCAAATACTTTGA
-GACATTGTTCAGATAATTACAGAAGCCATAAAACAATGTATAGCGAGGAAATTAATTACC
-TACAATTGTAGCGATTGATGTGAAAATTTTCATTGTCAGTTTCTAAGGCTTGCTTCAAAG
-TACACTGTAAGAAAATTTAATTTACTGGAAttttttttttttgagatgaagtctcactct
-gtctcccaggctggagtgcagtggcaccatctcagctcactgcaacctctgcctcccagg
-ttcaagccggtctcctgcctcagcctcccgagtagctgggactacaggtgcgtgctacca
-cacccagctaatttttgtagtttgagtagaaacggggtttcaccacgttggccaggctgg
-tctcgaactcctgacgtcaaatgatccacccacctagacctcccaaagtgctgggattat
-aggcatgagccaccacacccggccAAGTTGCTGCAAATTTTAAGATAAATAAGCCACTAG
-ATCGTGTTCCTAATGCAACAAAATAACAAGCAATTCTGATTATTTCTTGAGTCTTAAACA
-GAACAGCAAACGCTTTGTTTAActggctttgacccctgatcctgccatttcctggctgtg
-tgacctggtgcatgtcatttatctccctgcgcctcagtttcccggtttgtaaaataggaa
-caaggataagcgtgctcacacagttcctgtgaggaagaaatgagtcaagtctggcaccca
-caaagttctcagcacatgtttgctacaGCCATCATCCCCGTCCCTGTCCTGGGCCCAGTG
-TCCAGGGAAGATGTGCCTCATACCTTCATTAACCAGATTTTGGCATGCATCTTCCCAGGG
-TCCAACTTCCGCCTTCTATGTAGTTCTCTTGGATTCTTCGGCTGGCAGCTTGTCACCACC
-GTAGTGGGCTTGAAGTGAAACACTAGGGGTAGACAGGAAAGGACAGGGAGAGAGTGAGGG
-TCCCGGAAGGCCTGAGGCCAGGTTCCCGGGAGTGCACCATTAATGAGAGGAGGGCCAGAC
-CCCAGCTCCACCCTCTGACTGCCTTATAATGTGACACTAGACCGAGGGTGAAATTCACAC
-CCTTCACTAAGCTCCCAGGACAGACTCTGGGCCTCAATATGAGGGAGGGACAAGCCCAGG
-TGAAAGCAGTAACTATGGACATGGACAGAGGGGAGGGCAGGGCAGCCAGGAACCCCGCTC
-TCAAATGTCCAGTCAGAAAGAGAGTCGGGAACTCCCACTCCTTGTGTCTTTCCAGTAGCT
-ACTgcagcacaggacagcagaaagaccagagtctggcaggcctgaatccaaatccctgct
-gtcccaccaacctggctgGCAGAAGGCCTGatggggtaggggttaagagcaagaactaat
-gagccagacagtccaagtttaaatccaggctctTggccaggcatggcggctcacgcctgt
-aatctcaacactttgggaggccaaggcgggcggatcacctgtggtcaacagttcaagatc
-agcctggccaacatggtgaaaccctgtctctattaaaaatacaaaaaatgagatggacat
-gatgatgggcgcctgtaatcccagctacttgggaggctgaggcaagagaatcgtttgaac
-tcgggaggcggaggttgcagtggtgcgagatcccgccactgcactccagcctgggtgaca
-gagactctatctcaaaaaatatatataatcataaaaataaatttttaaaaattccaggtt
-ctgccttctactagctgcgtgaccttgagcaagtcaaatgacctctgtgtccctccattc
-gtccacctataaaatgggaataatcatcacgcccacctcatagagtcttcctgaagatga
-aagaagttactataccttaaaggtgtttggaatagtgcctgatgcatattcagtgctgga
-tacacattaccagttgttactCTTACTTCTAGTGACCTGAGAAGTGGGACCACAACACCA
-GACGAAGGCACAGCAGCCACGCAAAACTCCAACTGGCTGTCTCTGAAACACTCTAAGGGC
-TGTGGTTCTGCCAGATAAGAGTACAGGCATTTGGGGGGCATATTCTCAGAATCCCTGTTT
-CCTCTCTGCCTGTCGTGCAATGACATGGGACAAATCGCCCAGGTGGATCCAGCTGTACTC
-TCAGTCCTCACCAAAATCCCTGCTTCAGGTACAACCCAGCTCATCTGGGAGAGATACTAA
-TCTCTTTAATAGATCAATGTCCTTCATCCTGAGAAATGCTGGCATTAACTATGGAGATGA
-TTAAGTAAATTAATTTTGTGTTTAATTTATAAATTACCTGTATATATCCGGTTTTTAGTT
-GTATTGTATAAGAGATAGAATGATTAATAGGTTAATCTTGTGATTCTAATTTTAAAAGTG
-TAAGTGGGATTTTGATTTAGATTTAAGTTGAAAGGTTTAATACACTCTTATTAGCTCCgt
-tgcccaggctggtgttcaatggcgagatctcggctcactgctacttctgcctcccagatt
-caagcaattctcctgcctcagcctcctgaatagctgggataacaggtgcccgccaccaca
-cccagctaattttttaatttttagtagagatgcggttttgccatgttggccaggctggtc
-ctgacctcaggggatccacctgcctcagcctcccaaagtgctgggattacaggtgtgagc
-caccgcgcccggccAGATTACCCATATTTAGAAGTTTAAGTATTAGATATACAAGAATTA
-TGTAAATACCCAATGGTTTTTGTTAATCAGACAAGTGAACCATTTGAAAATGAAAATGAA
-TACGTTAAAATTTAAGATGTGGCTTAAAAGGTTTAGGAGAATTTAATTAACCAAGTTCCA
-AAACCCCCTTACAAGTGTTTATAAAAATTGTAAGATTCTTAAGTTGAATTTAAATGCTTA
-AGGAAGATTTGCAGTTTTAATAATGAGGATTTATTTTCATTATTGGTAGTAGCCCTAATT
-TATCtttttttaaattaaatcttttattacaagatagttcagattcacaagcagttttaa
-gaaataatacggagGggctggccgtggtggctcacgcctgtaatcccagcactttgggag
-gctgaggcatgtggatcacctgaggttaggagttcaagatcagcctggcgaacatggtga
-aaccccatctctactaaaaatacaaaatttagccaggtgtggtggtgcacgcctgtaatc
-ccagctacttgggaggctgaggcaggggaatcgcttgaacccgggagttggaggttacag
-tgagctgagatcacaccactgtactccagcctgggtaagagagacagagagagagagaga
-ctctgtctgaaaaaaaggaaaggaaaggagaggagaggagaggggaggggaagggagggg
-agaggaAAAGGAAAAGAAAAAGAAAAAGAaaaagaaaggaaagaaaaggaaacagaggta
-gtctatgtaccctttacccagtttctcccagtggcaacatcctgcaaaagtacggtacaa
-tatcacaaccaggatattgacattaagatgagcaagatataggactttcccataaccaca
-aggatcctgcctgtcgccttctacaaccacacccacttccctccccttaccaccctcctc
-acaactctgtccctaacccctgcaatcactaatctgctctccatttctataattttgtga
-tccccagaaggttatataaatggaatcatccagtatgtaactgtggggattggctttttt
-ttacttggcataattctctggagattcatccaagttgttgaatatatcaatagttctttc
-ctgtttatcgctgtatagttttccacggtggggatacaccataggttgtttaaacattca
-cccactgagggacttcaaggttgtttccagttttgaggaattatgaacgaggctgctatg
-aacattcacatactggcttttgtgtgaatataagttttcatttctctggaataaatgccc
-aagagtaaaactgctgggtcggattactaggaagtgcatgtttcatgttgttagaaatgg
-ccacacttgtttccagagaggctgcatcattttaccttcccaccagcaattgcgcacaat
-ctgacgtctcctctttgctagcatttggtgttatcactatttttttattttagccatttc
-gataggtgtgcagtgatatctcactgtggcttaatttgcattgccccaatggctaatgat
-gttgaacatctttttaatgtgcttatctgacatctgtatatctgctttggtgaaatgtct
-cttcatgtctttttcccattgcctaactgaattgtctgtttcactgttgagtttttactg
-ttactgatatattctacatagtagtcctttgtcagatacatggtttgcaaatattttctc
-caagtctatagcttgtcttttcatcctcctaaaaaggtctttcataaggccaggtgcagt
-ggctctcacctataatcccagcactttgggaggctgaggcgggcagattacttgaggtca
-caagttcgagaccagcctgtctctactaaaaatacaaaaattagccaggcatggtggcac
-acgccttcagtcccagctactcgggaggctaaggcaggagaatcgcttgaacccgggaga
-cagagtttgcagtgagctgagatcgcaccactgcaccctggcctgagcaacaaagcgaga
-ctccttctcaaaaaaaaaaaaaaaaaaaaaagtctttcacagaacaaaatttttaatttt
-gatgcagtccaattcatctatttttcttttatgggtcaagcttttggtgtgatacctaag
-aactcttcacttggccctaggccccaaagatttttctctcctgttttcttctaaaagttt
-ttcagtttcacattttacatttaatttctattttattttatctttgagctaatttttata
-ttcgttgttaaatcatttctttctttttctttttctttttttttttttttttttttttgc
-ctatgggtgtccaattgctccagcgccacccatggaaaaggctttcttcctccactgaat
-tgtttttccactttctgaaaaacccattgggaatattggtatggatttattccCTTTTCC
-TCACTGGGAAGTGTTGGCAGTGTCCAGCAGGTAGCTGATCCTTCATTCCCTGCTTGGTGG
-TGCTGATTccccaactgggatagtgctggcagggatgagtggggaggtcatcttctaacc
-cccacctggcagaagacagtgctctgactctctctctagggtagtgtcaacagagtctag
-cagtgacaagatttcatgaagtgtcatgaggtgggactcatcacctctgggcttcactcc
-cctcccccagcctacctatgtcagtagagcctggtgggagcctgagcctctatccccacc
-cagcatcagtgaggtAAAATAAGGTAGTGAGATGCAGGGCAACTTGGCATTCTACTCTCC
-CATCTCCTTTCTGTGTTTCAGTGTTGCCCACAGGGGAGCTGATCTAACATTACTTACTCA
-GAGGCAATGAGGTGGTATGAGTGATTTTATACATAGAtgtatacataagtatgctagatt
-gtctatgaagttcatttcaggataccaaagaaatattacaaaatatttgttattaattct
-cacaacaatcctaggtggtattagtgtccccatttcacaaatgagaaaaccaaggctcag
-agagatgaatgatttttccaagtgagtaaatggcagagccaaaatctgaccccatgtctg
-cctgagcctgacccaaggccTCGGAACTCCCCTGTAAAGCATGATAATGAtgtggcagag
-tttattctacgatttcaccaaaccttgttttcttttcctcctggaaaaacagatggacta
-catttcccaccttcccttgtggttagcagaggtcatgtggctaaattatggcccctgaaa
-catgagtaggagtaacatttgtcacttcaaatctggaccccccccaaaaaaaatgcccac
-ataattgtccatgttcttgttctctctcttccctctatgccagctggatgcaaaagtatc
-cagcagaagacttcaagaccttacaaaatatcagacccacaaggtcaaaggaacctggat
-ccctgaatgaccatgtggaacagaatccctccttcctcagatccacaaatgtactgtggc
-ataaatgagatataaacttctatatcaatacttgcaatttgggcattgtttattacatca
-gttagcctaccctaaTATAAGTGGTGTCACCAAGAGCCAAAAGCAGCCACTCTATCCTGT
-CTCCAACCCCCACACCAGCTCCCAGGTGCCTCCGCCCACCTGGTTGGACCCTAGTCAAAG
-TCTTCATTTTGCTTGTATGAAGGCTGTTGGCTTGTTGGACTGGAGGCAGAGTAGATGGCT
-TGGTTTCCTGCTTGGACTGCTGCCATGGAACATAATCCTACAAAATATACAATCagtcac
-atagcaccatgagtttatatcccagctctacccttttcagatatctgtgaccccaagcaa
-gtgacttgacctctcctgagcctcaatcttctcatctgtaaagtggatctaataataaaa
-cctacttctgtggattggcgcaagaattctgagagatatttatgaagcatgtggtaagtg
-ctccataaatgttagctatcactTTTTTAAATCAGCCAGCCAGAATTTACTAAGCACATC
-CAGGCTGTGAGGTGCTAAGAACTGTGAGAAACAGAAGGCATGGAAAAGACGCAGACATCC
-ACCCTCAGGAAACCAGAGCAGCAATCAGATGAATAAGAGAGCAGCATAATATACCCTTAC
-ATTCTGATAAGACAGTGagaggagaaaaatgaggttctgaggcttgctctgggtcccaca
-gcaaagtgtgacccggctgggactggaattcgggtctccagcctATATCCGCGGAGCAGT
-CACGACCGTGAGAGTGGAGAGCAGGTGGACTGCAGGGCCAGCGAGCCTCCCACCCCAGCC
-CTAGTCCCCCAAGACTCACCGGAACCTGGAACTCCTGGACTATGGAGTGAGTCCCAGAGT
-GCTTGGGTCTGGAAAGAGTTGGGAAGGGAAAGAACTTCCATTATCCCCAGCCCAAGGGGC
-AGCAAGCAGCAATTCGAAACAGGATTGGAGTCTCGAACCAGAAACTGCAGTTTACCGGGG
-ACAATAGCCCCGCGGGAGTGGGGCGGGGCCAAGGAGATGTGGGCGGGGAGAGGACGGGGG
-TCAGAAGACCGAGGGCGACCTCGAGGCGAGGGCGGGACAGCGGCGGGGTGTGAAGTACGC
-ATGCGTATTCCGCCTTTCTTCCAAtttttttttttttttttttttACCTACTTTTGTAAG
-ACATGCGCCATTGGGGAAAATGGAAGAGAAGTTGCGAGTCTGTGAGACCCTGATCTTCTG
-GTATAACTACTCGGCTTTTCCAACTTCCTTGTCTCAGTGTAGATCGCGCGGTAACCCAGG
-CCACTCAGAAGTCCCGAGACCCGATGCTTTCGCCAGCGTCTCGGTCTCCAAGGAAACGCG
-ACGCCGCCTACCGAGCGCCTAAAGGGACTAACCTCTCAAGGCAAAATCTAGTTCGGCCCG
-CTTTTCAATTTTCAAAttcccttcagtttgctctgcccataatcctaaaatatgatatca
-tatttctccactctcatcaaacttccaccatttccttcgccatcttcactcttggctaat
-gagtttgcttccaattttactaagaaaattgtgggaatcagtaaacccacaagttcatgg
-catcatttactcgcctacttgcctccctcccgtaactacgtataaactgcctactaagac
-caattcctacatttatgcaccgaatcctatcctctcacgttttctcaaagatattggccg
-agcagttctccccgttttttcctcctcttttctctctcctttgtatcatcagtataccaa
-cgtatttttaaatttcttctatttaaaaagattgtccacagccggacacggtggctcatg
-catataagcatgagagcactttgggaggccagaggtgggaagatcgcttgagccagaaag
-gtccagtctgcagtgagccacgatccagccactgcattccagcctggttgacagagcaag
-accctatctctaaataaataaacaaaccacttcccctccagccagctcccatttctgctt
-cattttaaagcaaaactcctagagaggtttgcctactctgtttcccatttttttccctcc
-tctcaatcaggctttcactccccactgaaactgccctcgtcaacatcattggtgacctcc
-actttgctaaaccccatggtcacttctaggtcctccctttatttggcctgtctgcagcat
-ttgacacaacagatcactccctcccctgaaacactttcttaacttagtatccaggaaacc
-actcttgagttgcttcctgcctccttttcagtctcctttgctggttcctcctcttctccc
-tttatcattgtagtatcccaggactcagtcccagccccctcccttccagtctcatggttt
-tgaataccatccgtacccagatgcctctcagactcacgtctccatcctccccctgaattc
-cagccatgtacatccaactgcctgcttgggccccttataagcaactctaatgtgcaatat
-ttttccagaaacatttttcccgaacttaaaatagggcatctctcttcttggaatcatcct
-taactcatctcttatcccacatccatcagcagatcctgttgcaataacttcaacgtatat
-ctggaataggaccacACATACACACACACACACCCCTCTTTCCTTTTGTACCCCAACTAA
-AGTACTAGTTCCCACCCTTGCCCTACACCAATTCTCTCTCTACACACCAGATTTGCTAGA
-TAGAGCACGGATTTAAAAGAGAATTCCAGTTTAAAAGATAATTGGGCGGGAGCAATAATT
-TTAAATCACTTAAACTTCAATAGGGGAACATTGCTATAGAATACCATGTCAGAGCTCCCA
-ACCTTTTCTGCCTCTTAAAAATCACAGGAGAATGTGTTTAAATGCACTGTGGTAAATAGA
-AGCAGCTGCTAGGATAAAAAGCAATTAGCCCAGGTACTCTGGCTATTCAGGCCCCTCCTG
-GCTGACCCTAGAGCTGAGGGAATCACTGTGTTGGGTACCCTCATTTGCAGAGCACACCAT
-ATGACAGCACTCTTGCTGGGCAACTCTGTACCAGGAAACCATTAAAAAGTAAAAGATAAA
-ggccgggcacggtggctcacgcctgtaatctcagcactttgggaggccgaggcagatgga
-tcacctgaggtcagaagttcgagaccagcctggccaacatgatgaaaccccatctctact
-aaaaatacaaaataggattagccaggcgtggtggcgggtgcctgtaatcccagctacttg
-ggaggctgaggcaggagaattacttgaagcagggaggctgatgttgcagtgagccaagat
-cacgccactgcactccaacctggacaacaataatgaaactccatctcaaaaaaaaaaaaa
-agtaaaaGATAGGAATACAtgacagatccaggtagtgacttactcaacagccattcctcc
-ccatcatcgcaactattggatcctgatcttgtccatgtatgcacttgccttaatggaggc
-aggccccaggtccagccctagtcctagtcccagctccaatagtcatgactgtctgaggct
-ggacttggtgagccaatttccctttccagttagaggtctagtcatagatacatgatgaaa
-gtctggctaagaagacaggatgagaaatctactcaaaggcttttgggaaaggttttcatc
-acacttttaaaaaaaggcattgcagaaaaacattccttcatctgctggtagacattgtca
-tatctgtgtgggattcctggaatcgcggaactgtgaggggagttggccaaagaggatata
-cagtgaatggtagagaggaaaatgtaaaaaccttcttccttgatagcactgttgagccat
-taaattaaccaaccctagcctggcacaatagtatgtgcctgtaataccagctacttggga
-agctgacgcaggagcatcgcttgaggccaggcatttgagatcagtctgggcaacatagtg
-agaccacatctcagaaaaaaaaaattttgttttaattagccagatgtgatgatgtgcacc
-tgtagtctcagctacttgggaggctgtggtgggaggattgcttgagcccatgagtttgag
-actgcagtgagctatgattgtgccactgcacgccagtctgggcaacagagtaagattctg
-tctctaaaagaaattaattaattaaattaacctttcacctatctagaaaatacttgagat
-taaataagaaatcacattactgggtgagcaaatttgagttgagttttctggtacttgcag
-accaaaagcattttactgaACCCTACGTCtggaggaacaacaagatagaaggaacctggg
-tgggtccctgacaaccttgcaggagaaagtcacctacctgtccttactgcctgccaaatt
-ccgagctgcttcatcaaagagaaataaacctccaccttgtctgagaccctgtatttgaga
-gtccctttgttacagtagcttaacctgtaccttgattaatacaAAGAAGAGCTTGGCCAC
-TGTCAGACAGCCTTCCTCATCAGACATGCTGACCCAGCATGGACACCCACTGAGAGCTGC
-CTGTGCCCCACATCTCAGGTACTTAACCAGTAATATTACTGCCTCCCACTTCAAtttttt
-tttgtttttgagacagagtttcgctcttgttgcccagactggagtgcaatggcatgatct
-tggctcaccacaacctctgcctcccgggttcaagtgattctcctgcctcagcctctcgag
-tagctgggactacaggcatgcgccaccacaaccggctaattttgtatttttagttgagac
-ggggtttctctatgttgctcaagctggtctcgaactcctaacttcaggtgacccgcccgc
-cttggcctcccaaagtgctgggattacaggtgtgagccaccgcacctggccCCACTTCAA
-ATTTTTAAAAAAAATACATAAAAACATTTGCAAAAATGCTGCCATCTTAATCAAAGCCAA
-AACACACTTGAGGGGCCACTGACAATCACCTGTAACAAAGCTGTTGGAACTGGGATTGAA
-TCAGATGGGGTCCATTTGCACTTACACCTGTTCAGGTGGCATTTCTGTGTTCACGAACAC
-CTGATGGAACTTCCTGCCCCCAGGATAGGTGGGCAAGATGAGCTGGCCTTTCCTCCCTGC
-ACATGTGAGGTGATAAATGTGATAGAGGGCCTCTCAGGCCTGCTTGGCTCCAGGCTCAGC
-AATGGCAACCTGGGCTCTGATTCCATCAACATCTTGCTGAGAGGTGGACTAGGCTGAGCA
-GGCAGTCTCGGGCTTCCATCCATGTCATTTGATGTGCTGGCTTTGTGGCAAATGTGCACA
-GCATCCTAAACCCACAATCCCTACTGTTGTCACTGGGTAAGATGCCGTGGTTCTTGTGGA
-GACACCTGCTATACTCGACATAACAAGATCCTAGACATTCCTTCTTATCATCTGCACAGC
-CCTCCAGAGCTGCTCTCTCCATACGGCCTCAGTGCCCATCCGGACTGCTCTCCTTGCAGG
-GTACCTGCCTGGCCCCTGTAGCTCCTGATGTAATAATCTCTGCAAAATTTGACCTGGAAA
-AAATGAAACTGACCAAAAGGATGGCCCTACACATACCAATGAAATTGTACAACAGAAGAA
-GATATGATTAGCAAAATTGGACATGGAGCCAGAACCTAATCCACAAGTCAAATATTTTCA
-AAATACAGACAGATGCCTTTAAAGTCCAACACAAAACAAAAATGCTCAAAATACGTTGat
-tatatgagagttcctgactagtgcagtaagacaagaaaaagtataagatttgaaaaaaga
-gacaaaaccttcattattcacagacgatatgattggcaatacagaaaagtaaagagattc
-caaaaaccactggaaattttttaaggtttcaactttgttgccagatatggggtcagtaca
-caaaattcaatcgtgtttcctctaacggacaccaacaaaccatatgtaacttctgattta
-caataatttcacttacaatagcagtcaaaccacgtggtactttggaataaatccccaaaa
-gtatgtaagacctttatgaagaaaactataatattttattgaaattcataaaataaggcc
-taaataagtgagaaatcaagtggggtcattgatggaaagactccgtgttataaagtggta
-attctgtacaaatgcagtgcaacgccaattaagatctcatagtttcctggaacttagtag
-gcaggttgtgaaatttatatggaggttccaaatatagctgagaccatcttaaagaagacg
-aaAGAGAGAGAAGAATGtttcccataaaagaagaaactggagttcagatttctctttgga
-aactgaaagatccccccacagtggaccctcacttctggagaggaatattcagctacagtt
-gactagcagttgccccttcagatagaatattcgatctccagttcacccagtatatcttct
-acttaaggcacctgcctgacccttgcagatatttgattatgtgaTAGTTACCTGGAGTGA
-GGGCTTAAGATAAGAGGAATGGAAGAGATTGTTTAAAATACATCTATTGTTTGGTTGTGT
-AAGTATTCTCCTCATGGTGAAACTTGACCAGGCAAGTAGAAAGAATAACAGAGAAGTATG
-TGAATCTAagacattgatgtttctggtaatggtgaagttccgagtatgatcacgggaatg
-cgtggctgagaagggataaaggaaatggtgcctgaggatataaagtgagaggactggaaa
-gTGCAAACGGCCCAAGTCAGTGGCTCCCCTGAGACCAATACCAGCAGTTGGGATGAAGGG
-AATCTGCCTGTTAACAAGGTTTCCTAGGATCTGATGCACAGTTCTTGATCCACGGCGTCA
-GAAATAAAGTGGTTAAATAAATATAAGCTACCggccgggcgcggtggctcacgcctgtaa
-ccccagcactttgggaggccgaggcgggcgatcacgaggtcaggagatcgagaccatcct
-ggctaacacggtgaaatcccgtctctactaaaaatacaaaaaattagccaggcgtggtgg
-cgggcgcctgtagtcccagctactcaggaggccgaggcaggagaatggcgtgaacccggg
-aggcggagcctgcagtgagccgagattgagccactgcactccagcctgggcgacagacca
-agagtccgtctcaaaaaagaaagaaagaaagaaaTATAAGCTACCTATACGTGGGGCTGC
-CTATTAACTCCGCcaagtgacttaactcctgcctctttatctgtaaaatgggcataatta
-cagcattgtttttggaagattccatgtaataaagtctgaagtgtgcttaacacagtactg
-ggaacttaagcagcactcaCACTTCATCCTAAATACGACGAAAGTCTTTTCAAAAAAATA
-AAAATTAATGCAATATGACTTACTTGGAAATGTATCAAAAAATAAAGACCGATGAATGGA
-TCGAGGCGTAGTGTGACAGAGTAAAATTTTAATGATAAAAAGTTAATGGTAAAATGTTCA
-CTGTAAAACTTTCAACTTTTCTTCTTGAAAACGTGCATAATCCGACGTGGGAAAAAAAAT
-AACGCATTGCAGTCAGTTCTGGGGAAACGGAAAGCTAAGTTTTAATTTTGCTATTGCTTT
-TGCTTTTTTAACAGAAAAGGTACAAAAAAGAAAAAATGGGAGAGATGTTGCCGAACTCCG
-TCCCGCCTGTGGGCTGTGGGCCGTTAGCAAAGCTGCTAGCATGAAATCGTCGAGCACCGC
-TTGCGAAACGCCAAATCCTCGAGAGCGAGGCCGGAGGCTGCCAAACCCGCGCTGGGGAAA
-GGGCCGCCTCCGGGCGCCCCATCCCGCTGCGGACGGAGGTGAGGTTGGAGCGAGCGCTGG
-CGGAAGAGAGGCTCAGCGCAGGGGGCGCAGAGCCGGCGCTGGCCAATATGCGCCGCATGT
-GATACCTTTGAGGGCGCGGCGGGGGAGGGTAGCGTCAAATTTCAAAAAAAAAAAAAAACC
-AAACCCACACAgccccggcgggcgggcgcgcgcgATGGGCGCCCTTTGGCTGCGGGAGCG
-AGTGGAGGATGCTGGGAAGGAGGTAAAATGGCCACCGGCGGCGGCGCGGAGGAAGAGAGG
-AAACGGGGGCGGCCGCAGCTTCTgccccccgcgcggcccgcggcccggggcgAGGAGGCC
-GACGGCGGCCGCGAGAAGATGGGCTGGGCCCAGGTGGTGAAGAATCTAGCCGAGAAGAAG
-GGCGAATTCCGCGAGCCGCGGCCGCCGCGGCGGGAGGAGGAAAGCGGCGGCGGTGGAGGG
-AgcgccgggctcggcggccccgcgggcctggcggcgccggACCTCGGCGACTTCCCACCG
-GCTGGCCGCGGGGATCCGAAGGGCCGTCGGAGAGATCCGGCCGGCGAGGCGGTGGACCCC
-CGCAAAAAGAAGGGCGCTGCGGAGGCGGGCAGGAGGAAGAAGGCCGAGGCGGCGGCGGCC
-GCCATGGCGACCCCGGCCAGGCCCGGCGAGGCCGAGGACGCGGCCGAGCGGCCCCTCCAG
-GATGAgccggcggcggcggcggcaggcccgggcAAGGGTCGCTTCCTCGTCCGCATCTGT
-TTCCAGGGAGACGAGGGCGCCTGCCCGACCCGGGACTTCGTGGTAGGAGCGCTTATCCTG
-CGCTCCATCGGCATGGACCCGAGCGACATCTACGCGGTCATCCAGATCCCGGGCAGCCGC
-GAATTCGACGTGAGCTTCCGCTCAGCGGAGAAGCTGGCCCTGTTCCTACGCGTCTACGAG
-GAGAAGCGGGAGCAGGAGGACTGCTGGGAGAACTTTGTGGTGCTGGGGCGGAGCAAGTCC
-AGCTTGAAGACGCTCTTCATCCTCTTCCGGAACGAGACGGTGGACGTGGAGGACATTGTG
-ACTTGGCTCAAGCGCCACTGCGACGTGCTGGCCGTGCCGGTGAAAGTGACCGACAGGTTT
-GGGATCTGGACCGGGGAGTACAAATGCGAGATCGAGCTGCGCCAGGGGGAGGGCGGGGTC
-AGGCACTTGCCAGGGGCCTTCTTCCTGGGGGCCGAGAGGGGCTACAGCTGGTACAAGGGG
-CAGCCCAAGACATGCTTTAAATGTGGTTCCCGGACCCACATGAGCGGCAGCTGCACGCAG
-GACAGGTGCTTCAGGTGCGGGGAGGAGGGGCACCTGAGCCCTTACTGCCGGAAGGGCATC
-GTGTGCAACCTCTGTGGCAAGCGAGGACACGCCTTTGCCCAGTGTCCCAAAGCAGTGCAC
-AATTCCGTGGCAGCTCAGCTAACCGGCGTGGCCGGGCACTAAACACCCGCCTGCCTGCCA
-GGGTGAACACACAGCCAGCTTATCCCTCTTAAGTGCCAAAACTTTTTTTTAAACCATTTT
-TTATCGTTTTTGAAGGAGATCTTTTTAAAACCTACAAGAGACATCTCTCTATGCCTTCTT
-AAACCGAGTTTACTCCATTTCAGCCTGTTCTGAATTGGTGACTCTGTCACCAATAACGAC
-TGCGGAGAACTGTAGCGTGCAGATGTGTTGCCCCTCCCTTTTAAAATTTTATTTTCGTTT
-TTCTATTGGGTATTTGTTTTGTTTCTTGTACTTTTTCTCTCTCTCCTTGCCCCCCTCCCG
-CCCTCCCCGCCCCATACCTTTTCTTCCCCTGGATTTTCACCCTTTGGGctgccttgctca
-tctttatgccccagcactaggtacggggcccaacacgtggtaggcactccatcagtgttt
-gctgaatTGAAAACATTGTTGACTGTGGCTTCTATCAGAGTGTCTACCTTTTGCAGCTCT
-TCCCCTCCCTCATTTAATTTGCTGCTTTTAATCTACGTGGTCTGAGAATTTGTGAAACCA
-GTGTTGTTAGAAGTGTATATAATCTGAATCAATAAGCTCTGAATGGTGGCCAAGGGCCTC
-TCTTATGGCACAAAGATGCATGGACTTCATGACAGCTCTTTTGGTGGCTCAGAAGCCATT
-TTTTATAgaatcatggaatctagaatattcctgctggaaagaacctgagagttggtttgg
-accaattccctggttttccagcagatgaaacaggcccaaagaggttaaatgactgggtga
-aaatcacatagctgtctggtgccagagccagcctatagtagagtcccctgaccccaagcc
-cggtgctcattccactACCTCTCACACTTCACAACAATTTCCTCAACACTTGAGGGCCCA
-GAAAGTCTGATCTCTCCAGAATGATCAGCCCAGAGGAATGCTGAGAAATCACCTGGAGGA
-GGGAGCAGAAAGAGAAGGTTTTTAAGGAGGGGCTTCTGAATACTTGGGAGATACGGAACG
-GACCAAGGACCACACTCCAGGGTGCATTCGTTGCTCCCTGGGGCACCACTTCTGGATTAC
-AGTGTGCCAGGTCCTTTGGAGGCCCTACCCCTTCCCCATTCATTGCCACCAGTGAGAAAT
-GGGGGTGCCCCTGTGTAAAGAAACCTACCAAAGGTTTACATTTGCACCTTAGCCTCAATA
-GCTACGAACCCTAGAGAAGCAGCTAGCTGGAGCTCATGTGCAACTCCTGATTCTCAGGAG
-AAAGATGGATTTTAACCCAAAATTATGAGTGAGCTGTTAACTCTAAAATGTACTTGGGAG
-ATAGGCCAAGCGAGAGGTCATGGGCCAACTAAGTGTTATCCAGTAGAAAAGACAGTACAC
-TGCTTTTCTTTTAGTGTTTGCTTTTCCTTTGCTATATGTTTTGCTATTTCCTTGTGGCTT
-AGAATGTAAAATTGATTGTTAAAAGTTTTGTTCTGAATAAATATTTATCTTTTGTATTGC
-TAAAACTGGTGCACTATTTCCTTTCAAAGTGTTAGATGCACAGTTACCCAGCTCCAGACC
-GTATTTCAATCCCACTTCCCCTACACTCCATTTGTTTACCTTGCTAAATACATTTCCCAC
-CCCTGCAGGCAACACTTAGCACCTACTACGTTGTGCCGGTCCCTTTGCATCACAATCAGC
-ACACTGTTAAAACGGGTTTTaagtcctaacacagttccaataaatcagaatcactgttag
-aggaagtgaaacattttagttaatcatcctcaagcaattctgatgggcagccaggtttga
-gaCCAGAGTATAAGATGTGTGAGCTGAAccctgccctcagggagattacagacctgtggg
-aaagagagGTGGTTTGCCAGCTTCCTCGTCTTTCTGTTACTGTAAGCGCGCGCTGTGGAT
-GGGATGCAAAATATTCTTGGGTTCTGGGAAAATGCCATTTCTTCCAGCTGTTGAAAAAGC
-GGGATCCAGGGAGCTGACTTCTCCAAGTTAGCCCCCACTGGAGACTGGGCCTGCAGGCAG
-AATAGGGTCAAGGTCCCTGGACTTCAGGTCCAATACCCTGCAGACCCCAGATACAACTCT
-CTGAAGGATTTTCCAGCTGGTGATGCTAGGATGATCTGATCCTGAGAGTTAAACGTTCCC
-AGTATATTGACTCTGACTCAGTGATTTGAGGATATTTCCAGAGCTGATCTGGAGTTGGGA
-CCTGGTAGGCTCTTGGGAATCCTGTCTTTCAGAGCCAGTTCAACCCCTCTCCTTGTCTCC
-CAAAGCAAGCAGACTCTCCCCTCCCTCCCATCCCTCTTTCCCGTCTTTGCCAGCGGTTTC
-CCTCCCTCTCACAGAGCTGGAGGCCAGGGGCCAGGAGAAAGCCTGCATTCACCATACTCT
-CCACTCCGTTCCTCAAAGCAGGCACTGTGCCAGGGAGCCTCCTTGAAGGAACCTTCCCTC
-TCCTGGCCCCATCCCCCCACTCTCCAGGAGGGAGGAGAGGAAGAAACTGTTTCCCTGCCC
-ATCCCCCACAGGATCTGCTTCAAGGCCTCCTGCCTGGTGGCCCAGGGACAGCCAGGGGCT
-GGAGCTGAACAAACCTCCCCCAGCTTCCTTTCCTGATCAAGCAGCCCTCAAATTACAATT
-CTTCACTGTTTTTGGGCTCCTGGAAAGTGTGCAGAGATGCCCGGACTGAGGCTGGTTGAC
-TAGGGGACATTGattcattccacttcaacaaatacggagggcattagagctgggccccat
-gcaaggccctctgcataggctgccttgaacaagacagTGCACTTGCAATGGAAGGTACAG
-ATAAGTAACAGTAGGCAATGTTTACAATCATATATTTAACAAtttttttttgagacagag
-tctcactctgttgcccaggctggagtgcagtggcatgatcttggctcactgcaacctcca
-cctcccggattcaagcgattcatgtgcctgagccttccaagtagctgggattacaggcac
-gtgccaccacgcccggctaatttttgtatttttagtggagatggggtttcagcatgttgg
-ccaggctggtctcgaactcctgacctcaggtgatccacctgcctcagcctctgaaagtgc
-tgggattacaggcgtgagacaccgcacccagccAACATTTGTCCTGTatagaattgtctg
-aagtaaaggtttccctagaagagaaaacgtcctgactgaaacctgcaagatgagtaagaa
-ccaggctaagagtgaagagacagccaagcagcagaaatagcagatgtagaggcctggagg
-ccagagagcacacagcgtgttcggactggccaagagtcaggggaagatgtggctgggaga
-aaacgccgagaagagGTGTCACAGGGCTTACCAGCCATATTTAAAAACGTGGATTTTGTC
-CTCAGAGCCTCCAATCAGGCCTCCTCCATTCCattcattctttcaacacatgcctgttaa
-gcgccaactctataggggccttttctaagcgatggaacacagcatggagcaggataatca
-agtccctgaagctcagattctagagtcacacaagtacataattacagacgatgatgcact
-aaaagaaacatacagggtgagatccctgtttaacaagcaaagctgatccagtcttaagga
-tcagagaaaatgtttgaactgagatggaaaagacataaaaggagttaatcgagagatggg
-gctggggattaagggatggcaagggtattaacctaggcaagagggatagcaagtaaaaca
-accctatagtgggaggaggcatgaccacttctagagacTAAATGAATCAGTCTAAGTTTA
-GAAACAGAAACCACTCTTGCTGTTGAAGAAAATGCTGGTCCCTGGGCTGGGTATTAGGAA
-TGACTCCTAGAACACCATAGAACTGCCAGGGGAGTTACTACCTCTCACAGTCAGAAAGAC
-AGAAGCCAGGAGGCCACCACTGGAAAGGCTGAGCATGAGGACACAATGGTGAAGCTGCCA
-CCCAAAGACAGGATCCTGGGATCAGAAAGTCACTGCCAATGCCACTGGCAGGACAGTGAA
-ATGCCAAGTCCTTTCCCTGCCTCTACAAAGCCAGGGACTGTGCACTACTGTCTCCGCAAC
-CATTTACAGGTAAAAACAGCCCAAACTGTCTGGCTTACTTATGCCTCCCTTCCATCTTTT
-ATGCAAATACATCTAAGTGCTAGAGCCCTAGCTGCAAGGGAGTTGGGAGATGTTTTAGCT
-TTCCAGCATCCGCAACATAGGAAGGCACATAGAATGGGGATGGGTGCTGTCTGTCAAAAG
-ACAATATCCAGCACAAAAAATGTGACTGCAGTGCAGAGAAGAGGAGCTCGTGGGagcatc
-tggtaggccatgttaagaatgtgggtctaagaacgatgtgccattgaaggacttgcaagc
-aagagagtaacatgattagattggttatgttttacaagcatcattcaggatagttggtgg
-agactgggtcagaggagagcccaaggggaaatacagtatagttcacccaggtctctcgag
-agatgaggacatcttaggcatggaaggcggagatgtacagagagaaacagccgagtaaag
-aaatctttcagagtttaagtcaacaagatttggagctatatttgacatgggctgggagaa
-agttaagtaccaaggatgttgcccaggtttctagcttctgcagttggatggatggtgggg
-cttttccctgagatgcgaaacagaagagaaaatccaagtttagggtgaagggcttgaatt
-tgattttggatatattgagtttaaggtctccgtagaggatatctaagaggagatgtggag
-taggcggttggatacacacagatcttacattcctaggagaattctggccctgagaaataa
-acacaggagttgtacagcTgtggctttcaaactgttttaccacatcccacagtaagatat
-atattttacattgcagccatcatacatatgcatgtgtgtatttatatctaaatctgaaat
-aagcttcctcaaacaatatttgccctgtgcatgatgcaccttgacactttctattccatt
-gcttcatccttttgtcaatgcttatatgacgtgttaaactgatttcacactctcctaatg
-gTCAAGAGAGAAAGCAGAAGGAAAGATTATACCAACTAAGATTGTGCCTCAAGCAACTTT
-GACACAGTTTTCCCTGATGgaaaaggagatggtgaaaaactaataagggacagccagaaa
-gggagaaggaaaaccagaacgtgcagaaacacataaaccaagggaggacatttcaggtgg
-taggggttaacaattgtgtcaagggctgcaagaaatcaagtaaaatcagctctaagaaat
-gtcaattgAggccgggcgcggtggctcatgcctgaaatcccagcactttgggaggccgag
-gcgggcggatcatgaggtcaggagattgagaccatcctggctaacacagtgaaaccccgt
-ctctactaaaaatacaaaaaattagttgggcgtggtggcgggcgcctgtaatcccagcta
-ctcgggaggctgaggcaggagaatggcgtgaacccaggaggcggagcttgcagtgagctg
-agattgagccactgcactccagcctgggcgacagagcgagacgccgtcaaaaaaaaaaaa
-aaaaTgtcaattgagatcagaactgaagagtgccctaggattgagtagtgtggaggttat
-caataagggccttttagaggaaagtgatgggggcagaTTAAGGAGCAAATGATCTTTCTA
-AGATGTCAATCTGGCACGCTGACCATTTTATTCCCATGTCACGTCCTCTGGGACTCCCTT
-GTGCACTTGGAACCCAGCCTGGTACCCGATCCCTTTCACAAGAGGCTCCTGGACTCCTTT
-CCAACCTTACTCTCAGCCAGATTGCCCATTACATCCCTTTATGTCAACTCCAGTTACGGC
-TGACAAACAGCAACCAGAAAGAATTTTGGAGTATGGAGTGGTACAAGACCAAGCTAAGGg
-gccaggtgcaatggttcatgcctgtaatcctagcactttgggaggcctaggcaagtggat
-cgcttgaggtcaggagttcgagaccagcctggccaacatggtgaaatcctgtctctacta
-aaaatacaaaaaaaaatagccatgtatggtggcatgcacctgtagtcccagctactcagg
-aggctgaggcaggagaactgcttgaacctggTGATACAGGAAGGGAAGTGCTGGGAAGGG
-AAGGGCACAGTCCCTTTAAATGACATGGAAGGGAGAAagggcgtggtccctggctagggc
-tccaccccagcctgtgcccatggacctaggtgaggacaggcatttttgttttcctgccca
-aatgttgcatttcccaagaccaccctggccggccacgcccccatcctgtgcctataaaaa
-ccctagcaggcagacacacaggtaactggacggctagaggagcacatcagtggaggaaca
-cacaagcggctggacgtcgagaggaacgcaccgacaggcactgacaaaccagcacaccac
-aggccatcgaccaacagaactatgcagagtttggctggggcagtcggaggggagcctggg
-ccactgaacagtccaactccaggggaaaaccttctcactccatccccttctggcttcctc
-catctgctgagagatacctccactcaataaaaccttgcactaattcttcaagcccaggtg
-tgatccaattcttctggtacaccaaggcaagaacccaggatacagaaagccctctgtcct
-tgcaacaaggtagagtgtctaattgagctggttaacacaagccacctatagatggcaaaa
-ctaagagcatacggtagcataagcccattggggcttcaggagctgtaaacatccaccact
-agacactcgtggggtcggagccccacaacctgcccatctgtatgctcccctagaggtttg
-agcagcgggacactgaagaagtgagccactccccttgtcacacgccctgggacggggaca
-agggaacttttcccgtttcaGTgggaggcagaggttgcagtgagccgagattgtgccaca
-ctgcactctagcctgggcaacagagcgagactccatctctaaataaataaataaaaGGAC
-CAAGCTAAGGGTGAGGAGACGTCAGATCATGCTGAGTTGAGGGTGGGGGCGCCACAGGAG
-TGCACCAAACGTGTACAAAGGCACTGATACATACAGCCCCATTTGCTGGCTTGTCAATGT
-GACTAAGATTTGGGGTAGGACATAGTAAAAGAAAATAAACACAGATATATTATGGAAAAG
-AATGTAAACTTTGCAGAGTTTTAAATAAAATATGACtttttttttttttgaggcagggtc
-tcactttgttaaccaggctggagtgcagtggctcactgcgtggctcgctacagcctacaa
-ctcctgggctcaagcaatacttctgccccagcctcctgtgtaactgagactacaggcaca
-caccaccacacccagctaatttttTCTttctttctttttttttttttttttttttttgag
-acggagtctcactctgttgcccaggctggagtgcagtggcacaatctcggctcactgcaa
-cctctgcctcccgggttcactgtggatatatcccctcccgggatatatccatcactgtgc
-ctggcacagctgcagcctcccaagtagctgggactacaggcacccgccaccacgcccggc
-taattttttgtatttttagtagagatggggtttcaccgcattagccaggatggtctcaat
-ctcctgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgag
-ccaccactcccagcctctctctttctttctcctctttcttctctttctttcttttctttt
-tcttttcttttctttcttccttccttcctcctttccttcctttccttccctttctctctc
-tccttccttctttccttccttccttccttcttctttctttctctttcttttctttcttca
-gggtctcaatatgttggccaggctggtcttgaactcctgccctcaagtgatccttccacc
-ttggcttctcagagtggtaggattacaggtgtaagccaccacacccagcccaagaaagat
-tttattttatttttttatacagacagggtcttgctatgttgcccaggctagactcaaact
-cctggacaacatagcaatcttcctgcctcagcctcccTAGTAGCCAGGTGTGCACGGAAC
-AAATTAtatgtattaatatggaacaatctctaagacacattattaaatgaaaaaaagcaa
-gatatggtatcctacagtttacattttttaatgttggaataaatacatacataccctcag
-caccataggaaagattttaaaaaagaaaaaatatatatacatatgcttatttttgtacaa
-atatgtaacactggaaggatattaatgaaattcgtaatttgtaACTTTGGAGAACTGGAT
-ATTTGGGGTTTGGGATAAAAGGAAAGTTTATTTTCCACTGTGTATCCCTGCTTTTAAAAA
-AATATTTCATCTATTATCTCTAACAACAACAAAAACAACTTTTAACAACAAAAATAAATG
-CAAAACACAAGACTTCAACGAAATTCCTATAGACTTTAGAGAGACAGGAGTCCATCTCCT
-CTATCTTTAAAAGTAAAggccgggcttagtggctcatgcctgtaattccaacactttggg
-aagccaaggcaggaggactgcttgagcccaggagtttgaggccagctgaggcaacacagg
-gatatcctgtctctacaaaaaaaaaacaaatcgttgggtgtggtggtacatgcctgtggt
-cccagctacttgggaggctgaaacaggaggatcacttgaggttgaggctgcagtgagccg
-tgatggcaccactgcactccagcctgggccgcagagtgagaccctgtctctaaaaataaa
-ataaaataaaataaaaataaaaAATAAGAACTTTGATGGAAGAGTTTAAGAAATTCTATA
-GCAGACAACACATTGGTCTCCCTGCTTCCAGGCTCCCTCTCCTTCCAACCATGGAATCCA
-CCCCAAAACAAAACTTGATCACATTTCTCCCCCGCTTAAAGAACTTCAAAGATTTTGCGT
-CCTCCCTGGTGTTCACCAGGGCCTGCCTGACCAGCCCTGCCTCCTCTGGGCCTCCTCTCT
-TGTCGGGCCTCCCCCTCTTACCCTGGCTTGGCTTCCCcttctgctccagctggtcattcc
-tggaagcagatctcttcctcccctacccatggttaatccttacctgcctggggcactcag
-ctctaatgctgcttcctaactagagcctaccctaacatcctgtatcagaccctcttacac
-cgtccgttacctccctggcctctccttcagcagttactcgggtgcaatgatatacttatt
-tgtgccatggtttgattgatatctgcctctgcctctccactttgagctccctgagggcag
-gaaccagtctcttttggctcacggttatagcttgagcaattagcactatgcctggcacag
-agtaaagcctaataaatatttattgcatgcatgaTCTAGAATCACTTGGCTGAGGTTACA
-GATTAAGACACGTGTCTACTTGTCCTTCTTTAATATACTTAACATACCTTAGCACTCTGT
-CATTGACACATACTGAACAAGGGCTTATTCATTCATCTTTTAAAAGCTAACTCACTCTTT
-TAGTTTTCCCACCTTTGATAAGGGAGGATAGGACCTGGGAGGTCAGGCCCTCGGTTTACT
-AGCTCATCCTCCTCTATTTCTCTGAGAGCATAAAATCACTGGAAGTCAGCCAGCATGCCC
-CATGGCACTGTGAGGCACAGGGGAGAAGCACCAGGCTCCTGGATTCTGAATGCGTGGCTT
-TGAAGCCTGGCAAGAGTGGCCCCTTCCCTGAGTCCCCCACCAcccctccccttggggcga
-ggattctgcaggcatgagaagtgcccacccagagtctgtgcctatgccttctagaacacg
-ctctgatacccgataattcccttccaaaatgtcactaagttaattcacagggctctttgt
-gggcctcatccctggcttcatctcacctgagggcaaactatactgcctgatgcacatctt
-atagacctgagccttgggcctcaagatagctgtttgcaggtgacagctaggtgttgaccc
-atgcatgctagctccatcactgatgggatgagaggtagctggataagggatggatacagg
-ttccaggggacaggtctccttgggcctacacattctggcacataactccaagggtcttag
-aattctaatttgaacatggccttccaggttgttagaggatatatccatcaaggaagaaaa
-cagaacatatttcatttaacacttgctggactgttgtataatttctaactatagagacat
-atggtatatgggcctccaactctactcttgttctgagccccacaaatgCCCATTtggttc
-tgtcatttctttgcatagacaagctacataacctctctgaacttcagtttcctgagcagg
-aaaatgggtctatggtaataactacattatcagggctggtgagaaaatgaaataaaataa
-tccatgtcaagggcttgagaagaatgccCTCTGGCTGTCGTCTCCTATGACTTCCTGTAT
-GATCTCCAAACTGCTCTCTTTGCAGGGTTTCAACACGGCTGCTCCCTCCTGCCTCCTTAC
-CCACAGCCAATAACCTCCCCATTCTCTCCACCTAGTCAAATCCCACCGTCTTCAATTGTG
-ataatagctggttgattgcacgtttactacgtttcaggcattgtattaagaactttccat
-gcattaactcagttctgacaccaactcgatgaagcaggcactgtttattattccccaaac
-acaaagacacagggatctggagactggaagcactggcggctgcaagtggcagggctggcg
-gggtgtgaagccggagaggagtctttctgcagTCAGGCCTCCCAAATCCCGGGATGGAAT
-CAAGGAGCCTTTGGCTGTCCCACCCCTCCTCCTCCAAGCCCCCAAATCCAAGTCTGTTAT
-ATCCCGTCAGCTCTGCGGGCCTGCCTGTGACTTTCAGCCCAAGGGGGCGGGCACTTCGTG
-TCACGCCACGTTGTCCACATCATCGAccctccctccccttctccccttccttccttccct
-ccctctcttcctcccATTGAGTGCCAGTTCTGTGCCAAGCTTTGCTGTTCAAAATGTTAC
-GAGTGGAGAAGTCAGGGAAGGATGGAATTATAGGTGTTTCTTCTTCATACCTTTCTGTTT
-GGCTGATTTTTTTTCAAATGAGCACGCAGGCCCGGTTCCTCAAACCCACTTCCAATGTGG
-CATTGCTGGGTTGGTTTGGTCCAAGGAAAGCCCTGTCTCCTTAACTCCCAGCCCCCACGC
-CTCCTCCGCCGGCCCCCAAATCCAGGCCGCCCTGCCCCCTCCGGAAAGGGGAGTTGGGGG
-CGAGCGCCGAAATCTGAGTGGCTCTTTCAAGCCTCCGTTGCCATAGAAACCGGCCGCACA
-GGCCGATGCTGTCCATTACACCATCCTCTAGCCTCGCAGCCAATGGACTCCGAGCTCCAT
-CGCCAGAGGCCCCGCCCCCCAGCTCTGGGGAGTCCACCAATCAGCAGGTCCCGTGACTTA
-GAGCCCTGCCCTCGGCCCAGGGACACCACCAATGCGCTTCGACCCTGCCCTCCTTCTCTT
-CGGTGTAACAAGAAGACTCGatatttttttttttttttttaGGAATTCTCCAGATCAGAA
-GGAATTGGCAGTAAGGCCTCTGTCAGCTGCACCCTGAATAATCTTTGGCTGCTATTTTAT
-TTAAGGAGAGCAAAACTGTTTCAATTACGCAACAATATATACCATTCTCTACTAAAACAA
-TTTTAGGAAATGAAAATGTAGGCAATGGGATGATATAGTCTGCTCTATATGAATGTCTTT
-CATTATAGGTATTTTAATTTAACTTAAAATGATCAAGGAACTAGTCATCTTTCCTTTGTA
-TTTCAAATGCATACAAAATTAAAGATACCGAGTTTTTTGATGCAGAGTTCATGAGACATT
-GACTTAATTAGTTGGTAGGCAACTTTTACTGAACCATCTAATTCCTGGTTCAGAACATTA
-CAACTGGAGGATAAATGAATATTTCTCTTAATCCATGGAAGAAATTCTGTTTTTGAGGCG
-GGCTGCGTAAATGGCTCTGACACTCTGGAGTCTAAATAAACCAAATGTGTTTTTAAAACC
-CGTTTGCCATTACAAaaaaaaaacttcaattttttagaacacttttagatttacagaaaa
-attgtgaatataaagttcccgtctaccccagccacccaCCCTGtttctttcattattatt
-attattattgagacagggtcccgctctttcacccaggctggagtgcagtggcgcgatctc
-ggctcactgcaacctccgcctcccaggctcaggcgatcctcccacctcagcctcccaagt
-agcagagactacaggggcatgccaccaagcccagctgatttttgcatttttcatagagat
-gaagtctcgccatgttgctcaggctggtgtttctgctattaacatcacatatggtattgc
-agacgcatggtatatttgttccaattaataaaccaataatgatacattatttattaatta
-gagttcacagtttattcagatttccttcgtttttacccaacgttctttttctactccatc
-tttttctactccaggatccatccagcatgcctcatcgcactagctgtcgtgtctctctgg
-gctcctcttggctggggcggtttctcaCATAGCAACATGACatcactgttggtgctgcgt
-caggtttctctactggaaagtcagtcttcttttgccccttttcatactgtactctttgga
-aggaagtcactatgctcgggccacacttaagtgaggagttatgctctatctccttaaggt
-tggaatagctacatagattatttgggatttttctacactgaagatttgtctcatttattc
-agtaatttatttatatcagtatggattcacagataattatttaatactttaggttataat
-ccaatactatttgattttgttgctcaagttgttccagctttggcttttgggagctctttc
-ggttggctcccgtctccctttgacacacccctatttttgtggggttttctcgttgccgtc
-aagcacttccttactttctggcactacaagatgcctcaggctcatctttcgtatttcctg
-ccccagtcctcaaatcagccatttcgcaagagctttgattgtttcggagaagggtattta
-ttagaaaccaagaactgggcgctaggtgcactcattgctactagggtgtcatttattTcc
-ttcctccctccctccctccctcccttcctttttgagacagagtctcactccatcacccac
-actggagtgcaCACTCATGGCTACAGCCACGTAGCCATGGTAATGAAGCCATAACCTCAC
-GAAGCTTCCAGTTTACACAATTAGAGGGTTAATTACCAAGTTGCCCAGCACTCTGCAGTG
-TGCTgtgtaggcaatgcgggggtaaattatctgaagagaatttaaagacaataaAAactg
-cagcctagacctcctgggctcaagtgatcctccctccttagcctcctgagtagctaggac
-cacaggtgtgtgccaccacactcagctaattttaattttcaatttttttttttgtagaga
-taaggtcttgccatgttgcccagactgatacaactcccggcctcaagccatcctcctgcc
-ttggcctcccaaagtgttgggattacaggcgtgagccaccacacctggccTtggggtatc
-atttcttttaagccttctcaactgacagaacaaagaaatatatctgtatataccaatgtg
-tatatatatacacacatatctatatttccatttgtaaccatctgtatatatattaagcta
-aacatgagttcctgtttatatttaccacttgaatccagggatcatttggcttgcttcctg
-cttgcttatctctaaattcccactccaataacgggaaacctggttcccatcatccacatc
-caccatccatttacttaattgttcaagtccagtatacatgtgtaggattatcaaaattgt
-taacccatacccctgtgggaaactttatcaagtagagtacattcttctgaacactttctt
-ttgcctttagtgttccagcagactccacttgtttcttttttctttttctttttttttttt
-ttttgagacagagcctcactctgttgcccaggttggagtgctggagtgcagcggggccat
-cacagctcacagcagccttgacttcccagtcttaagtgatcctcctgcctcagcctccca
-agtagctgggactacaggcatgcgccactacacccatctaattttttaaaatttttgtag
-agatgggatctcactatgttgcctaggcttgtctccaactcctgggctccagtgatcctc
-ccgcctcagcctcccaaagtcctgggattaaaggcatgagccaccacgcctggcccactc
-atttctaaagttacttaggtcagcacgttttcctctatcctcttcatgaggtcatttcac
-acatttgtaatacggtgaagatgtttgtcatattctgcatgacattttggaattatctaa
-atgtcctaagtgatttttttaactttgcatgcattaaggttcactttttgtgctattaag
-tttaatggatatcaaccaatgcacagtcatatacccacatttcttcaccctaaaaaaccc
-cctgtgctcacttattgaaccctctccccgccaaacactggcaaccacacatccgtttac
-tgtatctatggttttgcctttttgtgccattattaaaaaaaagaaagacgcacaatattt
-ttgttgttgctcttgtcacAGCTGCCacccattgaatccttactatgtcccaggtccaga
-attacactgtcccattttgaagatgaggaaacagatgcaaatgagttgaagtactcccta
-gagactcataacaataagcaaagtttgacttcTATGATTAACTTCTGAGTCACCTCTGGG
-AATATTTGTAATATGTCTAATAGCCACACttcttttgtttgttttgatacaggggtcttg
-ctgttgcctaggctggagtacagtggctactcacaggtgcaatcatagggcactacagcc
-ttgaactcctgggctcaagcaatcctcctgcctcaacctcaaaagtggctgggactacaa
-tgtgtgccactgtgcccagcTATattagccacatttcaagtactcaatagccgctgtgca
-gtttatactattatattggTTTCTGAGttttgtttttgagactgcgtcttgctctgtcac
-caggctggagtgcaatggcacaatctcggctcactgcaacctccaccacctgggttcaag
-cgattctcctgcctcagcctcccaaatagctgagactacaggtacgtatcaccaagacca
-gctaacttttgtatttttagtagagacatggtttcaccatgttggccaggatggtctcga
-tctcttgacctcgtgatctgcccgcctcggcctcccaaagtgttgggattacaggtgtga
-gccaccgtgcctagctATATTGTTTTTTAAAAGATCTCTTATTATTTAGTGAAAAGAAAG
-GAcctgtagtctcagttactcaggaggctgaggtgggaagatcatttgagccccagagtt
-tgaggtagcagtgagctatgatgatgccactgcactccagcctgggcaacagagggagat
-gccatctcacacacatacaaaagaaaagagaCCTTGTAATGCACACACTATCATAATCTC
-TGAtttttctttttttttttttttttttgagacactgtcttgctctgttgcccaggctgg
-agtgcagtggggtgatcactgctcactgcagcctcaacctcctgggctcaagtgatcctc
-ccacctcagcctccccagtggttgggaccacaaatgtgcaccaccacaactggtaaattt
-tttatttattgtagagatgtgggtctcaatattttgcccaggctggtctcaaactcctag
-gctcaagctagcctcccaaagtgctgggattataggtatgagccactgGCTttttttgtt
-tgtttgtttgtttttgtttttgatatggagttttgctcttgttgcccaggctggagtgca
-atggcgctatcttggctcactgcaacctctgcctcccaggttcaagtaattctcctccct
-cagccttctgagtagctgggattacaggcatgcgccaacacctccagttaattttgtatt
-tttagtagagacggggtttctccatgttggtcagactggtctcaaactcctgaccgcagg
-tgatctgcctgcctcagcctccaaaagtgctgggattacaggtgcgagccactgcccctg
-gccTGACTTTTTTAAAATCAGGAAATTTAGATGAATCAAAAAAGAAATTACCTTGTCCCT
-ATTGTTCTCTTCTCATTATGAATGTCTTTGAGGACCATGCCAGTTGGCAAATAGGTATTT
-TGGAGCTAGACACAGTTAGGGTGAGTGGAGTAACACGACAGTACCTACAACAGCCACACC
-CACACCTGAGTTGGCTTCATCCTGCCTTCAGGTATCATTAAGAATAGGtattattattat
-tattattattattattattttgagaccgagtctcactctgtcgcccaggctggagtgcag
-tggcacaatctccgctcattgcaacctctgcctcccaggttcaagcgattctcctgcctc
-agccttctgggactacaggcccgtgccaccacgcccggctaattttttgtatttttagta
-gagatgggtttcatcgtgttagccaggatggtttccatctcctgacctcatgatcctcct
-gcctcagccttccaaagtgctgggattacagatgtgagccaccacacctggccATATATA
-TAtttttttctttgagacagttccactctgtcacccaggctggagtgcagtggtgtgatc
-atggctcactgcagcctggaactcccaggctcaagagatcctcctgactcagtctcccaa
-gtaactaggactataggcacacaccaccaggcccagttaatttttctatttttagagacg
-gggtctcactatgttgcccagactcgtctcgaactcctgggctcaagcaatccttccaac
-ctctacttcccaaagtgttgggattgtaggcatgagacaccacatctggcctataatgga
-atattatttggcaataaaaaggaagttctgatacatgctacaacatagatgaacctagaa
-atcatgatgctaagtgaaagaagccaggcacaaaaggccacatgttgtatgattctcttt
-acatgaactgtccagaagagacaaatccatggatacagaagcagattaatggtggcctag
-ggctggggattagagggaaggcagagcagatgggagagtgactgctaatgagtactgatg
-ctaatggtttcttttggggatgatgaaaatagtctaaaatccattgtggcaacagttaca
-caactctgtgaatgcactgaaagccactgaattgtaaactataaatgactgaatagtgtg
-gtatgtgaattacatctcaacaaagctgttTTTTTTTTTTTTTAATGTTCTGGAAGAATC
-AGGATAGACATTACCTCAGGTGAAGGAAGGCAGGAGATGGGATGGTAAAGGAATTCATTG
-GGGAAAACAGGTTATCAATGTTCCAGTTCTTGTGTCAGATTGCTGACTCCACAGATTTTT
-ATTATGTTATGTAAAAATAAATACACACAGggccaggcatggtggctcacacctgtatcc
-cagcactttgggaggctgtggtgggaaaatcgcttgagcccaggagttcaagaccagcct
-aggaaacatagtgagaacctgcctctacaaaaaaaatttttcgaaattagccagccatgg
-tggcatgcatctgtagtcctaactacttgggaggctgaggcaggaggatcacttgggccc
-agaagttccaggatgcagtgagctatgatcgcaccactgtactccagcccaggcaacaga
-gcaagaccaggtctctaaaaaaaaCCCACACAAGCATAAAGTGAGGGAATCACAGGCAAC
-AATGAGAATGTGTCGCAGATGAAGCGATTCTGTATACCTGAGACAGAGGGAGATGAACGG
-GAAACGGCAGagagtggtcaggacagtcctctctggggagcccgtttgagccgaagctag
-gatgagtagatgctccagcccatgtggggatgggggtgaaaagagttccagacaaaggag
-acagcatgaatgagggccctgaggtaggcccaagcctgttgtgtttgggggacagccagT
-TTAAATGTCTGTTCTGTTATATTGTGGAGTCTCTGTGtatgaatttttcctaaagaaata
-acagacaggccgggtgcagtggctcacgcctgtcatcccagcacttcgggaggctgaggc
-aggcagatcatgaggtcaggagatcgagaccatcctggccaacatggtgaaaccccatct
-ctattaaaaatacaggtcgggcacggtggctcacgcctgtaatcccagcactttgggagg
-ccaaggcaggcagatcacaaggtgaggagatcgagaccatcctggctaacacggtgaaaa
-cccagctctactaaaaatacaaaaaaaaaaaaattagccgggcatggtggcgggcgcctg
-tagtcccagctactcgggaggctgagacaggagaatggtgtgaacccgggaggcagagct
-tgcagtgagccgacatcaagccactgcactccagcctgggtgacaaagcgagaatccgtc
-tcaaaaaaaaataaaaattagctgggtgtggtagcgcacacttgtaatcccagctactca
-ggaggctgaggaaagagaatcgcttgaacccaggaggtggagattacagtgagccaagat
-tgcgccactgcactccagcctggcgacagagcgagactccatctctaaataaataagtgg
-ccaaaaacatacatacaaaggtgttcactgccatattgtttataatagcaaaaaggggta
-aaacaatcaaaatgtctttcaagaaggaactgattcactttgggaggccgaggtgggcag
-atcacctgaggtcaggagttcgagaccagcctgaccaacatggtgaaaccccatctctaa
-taagaacacaaaattagccaggcgtggtgatgcacgcctgtaattccagctacttggaag
-gctgaggcagcagagtcatttgaacccaggaggcagagtttgcagtaatccgagatcacg
-ccattgcactccagcccaggcaaaaagagtgaaactccgtctctaaaaaaaaaagaactg
-attaaatgaattacaatataCTCGGCAGACCTGGACGAGAACCTACGCACTACATGGAAA
-GAGAAAAGAGATGTGAAAAAAGCAGGTTACTAGAAATTACATATAGTAACATTCCACTTG
-TGTAAAAAAAACTATGTGTGCATGTGATTATAAGCATTTAAGTTTCTGGATggccaggtg
-aagtggctcatgcctgtaatcccagcactttgggaggccaaggtgggcagaccgcttaag
-cccaggaatttgagaccagctcgggcaacgtggcaaaactcagtctctataaaaaataca
-aaaaattagccctgtgtggtggtacgcgtctgtagtcccagctacctgggacactgacgt
-gggaagatcacttgagcccaagaggttgaggctgcagtgagctgtgattgcgccactgca
-ccccatcctgggtgacagggagagaccttgtcgaaaaaaaaaaaaggccgggcacggtgg
-ctcacgcttataatcccagcactttaggaggccaaggcgggcagatcacaaggtcaggag
-ttccagaccagcctggccgatatggcgaaaccccgtctctattaaaaatacaaaaattag
-tcgggcgcagtggtgggcggctgtagtcccagctacttgggaggctgaggcaggagaatc
-gcttgaacgtgggaggcagaggttgcggtgagccaggatcgcgtcactgcactccagcct
-gggcaacagagtgagactccgtcccgtctcaaaaaaaaaaaaTTCTGGAAAATTACATTA
-AAATTTAAAATTTACTCATTATAATGCCATTTTTCTAGATTACAGGAGACGTTCACTTTT
-CGCCTTATATAATTCAGTATAAggccgggcgcagtggctcatgcctgtaatcccaaaact
-ttgggaggccgaggcgggcggatcacttgaggtcaggaattcgaggccagcctgaccaac
-atggcgaaactccgtctctactaaaaatacaaaaattagccaggcgtggtggcacgcacc
-tgtagttccagctactcaggaggctgaggcaggagaatcgcttgaacctgggaggaggaa
-gttgcagtgagctgagatcacgccactgcactccagcctggtgacagagcgagactccac
-acacacacacacacacacacacacacacacacaaacacaaacacCATATATATACATATA
-TAACTTTTGTAATAATAAAAAACATACTTCTACTTAAAGAGAATATCAATAAGCCCTAAA
-GTTTTTCATAGTGAAAGCCCTTCAAAATTGCTTGACAAATAAATTCTAAGTATACTAACT
-ATGGGAAAAATGTATGCTTGCGAAGACTTTGTTAGACACATTTTCTTAAATGCTGAAGCT
-ATAATTTAAAAATGAAGATTTCAGGAGACAAAATAAAGTCAGCTGGATAAAAAATGTGCA
-GAGAGAAAAAATATACCAAAATGTTAAGAGTGAGTGTCTCggccgggcgcagtggctcat
-gcctgtaatcccggcactttgggaggctgatgcgggcggatcacggggtcaagagtttga
-gatcagccggccaacatagtgaaaccccgtctctactaaaaatacaaaaattagccgggc
-atggtgatgcatgcctgtagtcccagccacttgggaggcttagggaggagaatcacttga
-acccgggaggcagaggttgtggtgagctgagatcgtgccactgcccttcagcctgggcaa
-cagagcaggactctgtctcaaaaaaaaaaaaagaGTGGGTGTCTCTTGGCACTGAGACAA
-TGAATCCCAACAAATTCCCAACAAATGATATTTTTTCCTTAAATTTCAGAATTTTTGAAG
-TTTTACACAATGAATATTTTGTGATCTGAAAATTTTTTCTTCCCCTCCTCTTCCAATTCA
-ACAGCTGAATAATAATCTtgtgttcattgtctgctactgcttaagacattctttccagac
-ttagaggcttaacaaagcaaacagctaccatctcacagtttctgtgggtcatgaatccac
-gcagagtttagttgcatggttctggctcagggtcattcacgaggttgcagttgagatgct
-ggtcagggctgcagtcatctgaagacttgactggggctggaggatctgattccaggatgg
-atcgatcactcagatggctgttggaagtaggtctcagttccttgttggtgttggcaggag
-gcttcagtttctcaccacgtagagctttccacagggctgcttgagtgccctcgcatgaca
-gctgacttctcccagaataaatgatacaaaataagacagccaggaggaaaacatagagct
-ttctatgtccaatcttagatatcacaaaccatcacttctgccatattctattagttagag
-gcaagttcacacttaactgggaaggggaggaggaattaggctcttccttttgaaggaagg
-aacattaaagaatttgtgaaGggccgggcgcagtggctcatgcctgtaatcccagcactt
-tgggaggctgaggggggcggatcatgaggtcaggagattgagaccatcctggctaaaacg
-gtgaaaccctgtctctactaaaaaaatacaacaaaaattagcagggcgtggtggcaggcg
-cctgtagtcccagctactggggaggctgaggcaggagaatggcgtgaacccgggaggcgg
-agcttgcagtgagccgagatggcgccaccgcactccagcctgggtgacagagcaagactc
-catctcaaaaagaaaaaaaaaaaaagaaTTTGTGAACATGTTTTTGAAACACAAGAAAAT
-ttccagctgatctttccccccaaatttccctcctccaatccaactacaacacatgaaact
-ccttaatcttgctgaagcgtacctctgatcatgtcatcctgcaataaaaaaactgtccct
-ggctccccacaacccagggaactccataacttggcttctgaggaccaactaccgtattgc
-ccttcagctccagctcaacataaacgcatcgtattcctcatgtacactcccccatctctg
-gtcttggcacctatccatgccctctcaatacctcgtcccagtctccttcccatctccagt
-cccttgcacttgctgtttcctctgcctggaatgttttacatggatggttcttcgtcatct
-tgagatctaaactctcccccatctctatcatcccccgtcccagtcactcactctctcatt
-accttgttttcttttcattgtcgtttgagacagggtctcactctgtcccacaggctgggg
-tgcagtggtacgatcacagctcactgcagcctcaacttcccgggctcaaacgatcttcct
-gcctcagcctcccaagtagctaggactaaaggcacaggccatcacacctggctgttttgt
-attttttgtagagacaggcttttgccatgttgcctaggctggtcttgaacttctaggctc
-aagcatctgcccacctcagcctctcaaagcgctgggatttcagatgtgagccaccttgcc
-cagcccctccctcccttctttccatcacccagtctggggtgcagtggcaccatcatagct
-cactacagcctcaaaatctctggcttaagcgttttcccacctcagcctccccagaagctg
-agatgacaggtgcttgctaccatgcccggctaatttttgaatttttgtggaggtgggatt
-tctctatgttacccaggctggtctgaaactcctgggctcaagcgattctcccgccttggc
-atcccaaagtgcagggattacaggcgtgaaccaccacacccagcccagctttattttctt
-tatagcagtcacaactatctgaaattatcttatttgtttacctgctcttttctgttgccc
-tcacttgctccttaagaacagggacctctgtcttggtcactgctgtaacccagtagcccc
-agttccaagttcactgcctggtgcacagtaggtggccaataaattgttgaattaaATGTC
-CTCTCTTCCAGGGAGTTGTTTTAGAAAGAATCACACACTGCATAAATGTCTGTTGAGGAA
-GAAAATGAAAAAAACAAAAGTGAAGACATTATCTTCTCGGCTGAACTTCCCACACCATCT
-TCTCTGTCATTAATAAGTCCTGGTGTCTACACTGGGGAAGGCAGTCCAAGGTTCTTCCAG
-GGCCTAGGTTCAGCCAGACTTTAACCATCTCTAGCTCCTCAGAGTCCGTCAAAGGGCCTA
-AGGAATGGTAAGTATTAATAATGtttgtttatgtatttatttatttatttattttgagat
-aaagtctctgtctcccaggccggagtgcagaggtacaatcattacaacttccacctttcc
-ggctcaagcaatcctcctgcctcagcctgccaagtagctaggactacaggcaggcaccac
-cctgcccagctaatttttgtacttttttttgtagagtaagggtttcaccatgttgcccag
-gctggtcttgaactcctggccttaagtgatctgcctgcctcagcctcccaaagtgctaag
-actacagctgtgaaccactgtgcAGGGTCAAATGTTTATTAATGGATGCATGCATGGATG
-GAAGAAGGAAAGGAGGCAGGTGTGAATAATGAATGCAGCATTTTCACTGCTGAGAATAAA
-GAGTGAAATCCTGGTCCAAATCAGTTTGGCAGTGAGTAAGGTTAGGAACTATTCACATAC
-ATTGGAATAATAATAGCAGCAGCAGCTACAGGGTCAGAGACAGATCTTTGAGAGGCCATA
-AGCATTGAAAAGATTGTGGTACCTATCACACACCGTCTAAAATAAAACAAATATTTTATT
-TATGGGAAAAGTGTTAAGGTGTTGATAATTCCAAGAAAGCTTTTATTTGTCCTACAATCA
-TTACTTTGATACCTTTTCTGAAATCCTAGAGCTGTCCCCACTCTGCCCATTTTTTTTTCT
-CATTATGGTGATGTCTCTGGGTTGCTGGTGACCTGCGTAACTATTGGGAAATCTAGTTTC
-TCAAAACttttagtttttttttagacagggtctcactctgtcactcaggctggagtgcag
-cggctcactgcaacatccgcctcctaggttcaagcgattctcatacctcagtctcctgag
-tagctgggattacaggtacgcgtcaccaagcctgactcattattttgtacttttagtaga
-gacaaggtttcaccatatcggccaggcggatctcgaacttctgacctcaaatgatccgcc
-cgccttggcttcccaaagtgctgggattacaggtgtgagccaccgcgtccCGTCTATCAT
-AAGTtttattgaacattgcctaggtatcaggatgtgtttacatgcattatctcatttaat
-ctgtaaaaccaccatgtgagggagaaactgaattatccccattttcaggataaggaaaag
-gaggGACTGGGAATGTGAACTCAGGAAGTGTGACTCCATCGGGTAGACTGCTCAGGCTGC
-AGATGTAAAGGTTTTACACGTAGGCTTTTCCAGATCTCAGCTTCTGAAAGGCGGAGGGAC
-CGTTTGGACGGGAGCAGGGCCTCCTCTTCCAAGCACCCTGTGCCTTTAAGAGTCGCCCCC
-TCCCTCCAGGGATGCTCCAATTTCTTTCTCCCCACCACCCCCACCCCGCCCCCCGCGCCG
-CGGAGCCGCACCTCGGTCCTTCCTCCCCGCCCCACACCCTCAAGCTCGGCTCTTGGCCTT
-CGCTCGTCCAGAAGTGGGTGAGCTGTACCGCCAGAGGCGCATTCTCCTAGCCCCAAACCA
-TGCCCGCTACGCCCCAGCGGAATGCCACCTTAAAGACCCTAATCCGGGCACCTCCCAGCT
-CCTGCTTCCCAAGGGCGAGGCCTCAGCGCCCCCTCCCATCGCCCATGCTCACGACGCCGT
-GAAGGTGACCTCCCCCAGGGGCGGCACACGCCCAGTGGTGCCCGAACTGGCTCACACGTG
-GTGAGCCGGGAGCGCGCGGCCCCTCCCCGCCACGCGCCTCGTGCCGGCCACCCGGCCACG
-CCCCCAGGACTGGCTCCGCCCCGTGCCCCTGCACGCTTCTCCAGGCTTGGGTGGGGCGAC
-GCGCCCAAGTCGGGCACCGGGCAGGCTACGGGGTGGGGTAGGACCTGGGAATGGCGCACC
-CACGCATCCTCGAATGTCGCCTGCGGTTTGTGAAAAGCGGGAAGTCCGCCCAGCTCAGGA
-CCTTTGGCTGGCAGGCGAGGTGCCCCGCGGCCCTTGGTGCTGAGCAGGGGAGAGACAGCT
-GGGACCGCGAGCCTGGGAATCGAATCCTAGTCTGCGTGTCCTCGGTGCTTCCTATTTGGA
-AACTGGGCATCATATTATCATATTCCCTTCTCCCTCCGGATTCTTATGGAGCTTCGAACG
-AGATTAAATATACATATATATGAGAAAGGGATTTGTTCACTAGGTCCAAAAGCATTTGCT
-GGTCCCATATGTGGTCGGACCCTGTGTGTAGTAGGCGGGGGGCAACATCTACGACAACCT
-GAGTTCGTCCCCTTAAGAAGCTTTCCTGAGTCTTGGGCCCCCCAAATTCTCTTCTGGGAT
-GGTCCGAAAAGACGTCCCTGAAAGAGGAAAGGGCGGAAATCCTACCTGACGGCAGGTGTC
-TCGGAATGAGCTAAAATTTAAAAGGCAACGCGGGGCAGGGACAAGCGTCCAGCGTCAGAT
-GGAAGCAGGCTCGCGTCCCCTACCCTTCCTCCAACCCCTAACCTAAGAAAAGAAACCGAT
-CTCGCCGGTCTCCCCCAATCCTAGCCGCGAGACCGCCCAGCCCCGCAGCCCGAGCCCCGC
-CCCGCTCCGGCGGCCAGCGATTGGGAGATGCAAATACCGGCTTCTCTGCCCAGCAACGGG
-TGACGCGGCGCCCGAGCGCGAGGCGGGGCCCGGCCGCAGCCCAAGCGGGCACCTCGGTGT
-TTACAcggggcggccccgcgcgcgccgcagcggcccgcagacggcgagggggaggggtgg
-tgcgcgcgccggcggggccgcgcggggAGAAAGACACTGAAAGGCGTcggcggccgggcg
-gggagcggcgcgcgcgggccgcggcggAGCCAGAGGCTGCAGGAAGAGCCCGCGGGGGCC
-CGGAGGGTGCGATTCCTCGGCCCCCGCAAAACAATGTGTGTTGTGAGCCAGGACGCAACT
-TGCCGGAGGCGGCGGGGGCGCGCCGAGCCCGCCTGAGACCGCGCTGACCTTCTCCCCCCG
-CCGTCCGTTGGGCCCGAGCGCCCAGCTCCTCGCTCCCCAGTTcgcgggggccgggccgag
-ccgcggggcggggccgccccTCCGTCGCCGCTGCCTCCTCCCCCACCCCCAGCCGCGGAG
-GATGCGGACGGCCCCCGGCGGCGTCTAGCGGCCCCGGGCCCAGGCGCGATGGTGCAGCAG
-CGGGGCGCGAGGGCCAAGCGGGAcggcgggccgccgcccccgggacccgggccggccgag
-gagggggcgcgcgagcccggcTGGTGCAAGACCCCGAGCGGCCACATCAAGAGGCCGATG
-AACGCATTCATGGTGTGGTCGCAGCACGAACGGCGGAAGATCATGGACCAGTGGCCCGAC
-ATGCACAACGCCGAGATCTCCAAGCGCCTGGGCCGCCGCTGGCAGCTGCTGCAGGACTCG
-GAGAAGATCCCGTTCGTGCGGGAGGCGGAGCGGCTGCGGCTCAAGCACATGGCGGATTAC
-CCGGACTACAAGTACCGGCCGCGCAAAAAGAGCAAgggggcgcccgccaaggcgcggccc
-cgcccccccggTGGTAGCGGTGGCGGCAGCCGGCTCAAGCCCGGGCCGCAGCTGCCTGGC
-CGCGGGGGCCGCCGAGCAGCGGGAGGGCCTTTggggggcggggcggcggcgcccgAGGAC
-GACGATGAAGACGACGACGAGGAGCTGCTGGAAGTGCGCCTGGTCGAGACCCCGGGGCGG
-GAGCTGTGGAGGATGGTCCCGGCGGGACGGGCCGCTCGGGGACAAGCGGAGCGCGCCCAA
-GGGCCGTCGGGCGAgggggcggccgccgccgccgccgccTCCCCGACACCGTCggaggac
-gaggagccggaggaagaggaggaggaggCGGCAGCGGCTGAGGAAGGTGAAGAGGAGACG
-GTGGCGTCGGGGGAGGAGTCGCTGGGCTTTCTGTCCAGGCTGCCCCCTGGCCCGGCCGGC
-CTGGACTGCAGCGCCCTGGATCGCGACCCGGACCTGCAGCCTCCCTCGGGCACGTCGCAC
-TTCGAGTTCCCGGACTACTGCACCCCCGAGGTTACCGAGATGATCGCGGGGGACTGGCGC
-CCGTCTAGCATCGCAGACCTGGTTTTCACCTACTGAGCCCACCGTCAGCGGGGCGCGCAC
-GCCCCCAAACCAGCTGTTTACATACAGGAATCAGGTATTGGGGCCCCTCGGAGGCCGAGG
-CTGGCACCCCATCTCCCGCGCAGCCTGCCCCCTCCTGGACGTGCCCATCCCCCCTCAGAT
-CCAGACATGCCCCTCCCCCGCAGACACACCCCAAGGCAGCCCAACCCCCACCCCTTCCCC
-GACACCCAAGCCCCTCCCCACGTCGCCCCCTCCTGCACAGCCACCAGCAGCCAGCCCCCT
-CCGATACACCTCCCGTCCTCTCCTACAGACCTGCACCCCTCCCCCCTTTTGCACACGCCC
-CTCCTCGTGGCCGGAGGACCCGCCCCCTCCTTTGCTCCGGAATCTCTCCTCCCTCGCCCG
-GCCCGCCTTCTCTGGGTTAGGGGGGCGATGCGGCCGGGTGGCAACGCACGCGCCTCCTGC
-GCCCCTCCCTTCCCTGGGGGGAGGGGCGCACCCCTTTTATCCCCGGAGCGCTAGGGCCCG
-CCCCTCCGCTGGGGCCCACCCCCTTCGTGCGCATGCTTAATGCTTCTGGGGAGGAGGGGG
-CTGGTCCCAGCGGAGCCGCACTCTTCGCCCGCTCCGGGCAAAAGCGGGGGCGAGTGTAGA
-GCGATCCTGGGAAATCCTTTGATCCGGGAGCCCTAGGTTTCCTCTCCAGCCAACGGGGCG
-TCGCTGCCTTAATGGGAGGAGCACTCGGAAGGGTTGGTTTGGGCCTGAAACTCTCCCAAG
-TGGCATAGCCCCTTTTCCGGTATGGGGTCTCCTACACCCACGCGCACCACCTCTCCGGTC
-GCGTGGCTGCCTCTACAGCCTACCTATACGTCCCTTTTTCCCCCCAACTGGGAATTGAGA
-GGTAAGGTCTTTCTCTGGAAATCCAGCAGTAGAGGAAGGGACCACCCAAGAAAACTAAAA
-ACCAAGGCACCTTACCAGTCTGTCTGGGGACAGGATCCCTGCTGCACCTTCCCCACCCCC
-TCCTGGGAAGTGCCCCCTCACCTCAGGGCACCCGCAACCTGGGCTCCTCCCTGAGCGCAC
-CGGCCCTTCCTGTCACCCAGGTCCACCCTCAGTACTCAAGCTGCAGTATACAGCGGGAAA
-AACTGAGGCACTTTGGTGCTAGGGGTTTGGGACTGAGGCGTGGAGAGCAGATGTGATGGC
-AGGAAGACTCTCGCTTTTAAACATCTGGTTTGGGAGAGACCATCGACTTGGCCAGTGAGA
-CTGAGAATGGATTCCGAGTAGTGATGGGCCGTTTGCACCTCGGTTTTTCCACGTGAGAAA
-TGGGGAGAACGCTGCTGTTAGGAGGAAGTTGTGTCCAGTTCAGGGTGCCCTCGGGAGCCC
-TGTCCCTGTTGCTGTGGCCCCTCTCACGCCGCCATCTCTCTGCCCCGCCCCGCCCCTCCG
-GCCTCCCCACACCCCCCTTGCCCTCACTACCTGTATCTCACCGGCGTGTGTTCACCCTCC
-CGGGTGGCTCACACACTCTCATTCACACACACAAATCTCAGGAACAAACGGTCCCAGAGT
-CCTCCGGACCCCTGCCCAGGGTCTCTGCAGGTCTCTGCCCCACGCGTTCCCGTCGCTGAC
-AAAGCCACCAGCTGCCTCCTTTAAGCTTGGTGCTCCGGCTCTGGGCCTTTCTTGCGCTCT
-AttttttttttttttttttttAAGAAAAACAACAACAACAAAAAAAGACAATGAAAAAAA
-AAACGTCATGTGAGTGAAGAGATGTCACTGTCTGTGGTCTTGGAGAACTAGTCTCGTAGC
-TGAGGGGTGGGGTCCCTCTGTCTGGGGCACTGGCACCCACAGCAGGACTCCGCCAGTCTG
-ATGCCAGGACTGAATAAAGTGTATTTGCCCCGACCTTGCCCTGTGGTTCTGCATGTCTGT
-GCTCTTCCTCAACCCTCCCTAAACAGTTTGCCAGATTCAAGTCCGTGTGATTTGGGCCCG
-AGCTGGGTGTCCCAGGGCAAGCCACCTTGCCTGTCTAGGCCTCTATGTCAGGACTCCCTG
-GCCTTCATGaagaatagcaaactcatccctgtagggaccaggcaggtaacatagacgagt
-gactctgggtggacagtggtgtcatgacccacttcaaggggcctacctcctgccagttgt
-gaccctgtgggaatgcagtccacagtggccaggtggccagatttttcaagaaaagctgga
-tggatgtttctgagtcatcttaatttcaaaatgagactcatattttaaaatttctgtggg
-ccaaatgaaacaagtatgcaggcaggtctggtccgagggGGCTGGCTTGGCCATGCCTTT
-CTGTGCCTTTAATGAGgactaagaagcaagattgggccacactgtctggactcaaagccc
-agctccaccactgagcacccgtgtgactctttccatatgtataacgtggggataataata
-atagctgcttcacaggatGAAATGAAGTTTGAGGTGAGAAGCATTCACCATGGTGCCCAT
-CGTGTTACTCCATTGTCAGAGGAGGAAACGGGGTCAGGCAGGAAAGCAACTTAAAGGAGG
-GCCTGCAAGCAGCCAGGGTCAGAGACAGGGCTTGGTTCTGCTTCCTGGTGAAGCATGGCT
-TCGGGGTGCTGCCTCTCCCTCCCTGTTTGAATCTGCAGATTGTGTTAGGCCCCCAGCTGA
-GGGCCTGGAGTGGTGGGATTGGTCCCAGTGCCTGGCGCACATTGGCCTGCAGAGTAGATT
-AACTGAATGACCAAAGAGCAACAGAAGTCTAGTGATTCTTGTCTTTGAGGTTCTGACTGG
-TGTTTTACAACTGAGTCCAAGGCTTTTCCCTCCTTTGTCCCTCTGACACCCCTCCCCCTA
-ATTCTCATCTGTCAGATCCAGTGTATTCCTAAGCTGGGACAAAGCCTCTGTTTTCCCAGT
-AGGAGCCAGGGCTGAGTGTGGAAATTACAGTGACTGCTTCTTCTCAGCTTCTCTGGTTGA
-AAGCAAGCTGGCGAAGTAAGAGGAGGTAGAGTTGAGAAGGTGTGGAAGATAGGGACAGCT
-GCCCCCAGAACTCCCTTCAAGGGAGGACTTccccagctatgggaagtgccatcagggtgg
-ccgcagctgcagagagccacttcacctgagaccacgcccttcctggggcagcctgtatct
-ggtgtctgagtgaggcatggtataaacacctggtcatttcaatccaacatgggacggaca
-ctgacagacagtactcccagcaggcccaggccagccagggcttcgtcaggcctgcagcac
-aatttgacttcctatgcccaggcctgcttcctcttcttcctcttcttttcacaggtgctt
-attcctaataaacatcttgcaacccaaactcagtctcattgtctgtttctagagaaaccc
-agtctacaacaGAGGGTTCAAGAGACTGGACAAAGGGAATTGGGTCAGTGGCCCAGCAAC
-TGCAGCTAGGCCGGTCGGATGTATCCTAATGTCAAGAGTCTGTTCACCGATGCCATCAGC
-ACCAAACTAGGGGCTGCACACTTTCCTAGTCTGCACACCAGTCACGTCAATTAGAGACTC
-CAGCCTCAGCCCGAAGGCCTTCCAGGGCCCCCTGCTGATGCCATTCTCACTGCCAGTCCG
-TCCCCTGGTAAAAGCAGGTGGGAGGGAGGTCGTCATCTGAGTTTGTCTTACAGAATAGCC
-TGGAATGGGGTGCACGGTAAAATGCCTGACCGGAGATAATGCTAGAgctgtggaaccttg
-ggcaagcctcttcccctttgtgggcTGTACTGGGAGTCGGTAATAGGACTAGAAGAGGGA
-CCATCTCATTTTGGTTCCTTCCATTTCAGATGCTGACCTGAAAGGTCGGGGAGACAGCTC
-CTTATGGGGTCTCTGGGGCCACCTAGTGGCTAAGAGGAGTAGAACCAAGGTTCTGTGCAG
-TTGGGAGGTGGGAGTCGGGGTGTGTCCCAGGCCAAGGAACTGAGTCCCACTCGAGTCTCA
-CTCCATTCATGCATTGACTCATTGCTGGGTCATGCCCCTTGCCTGGGTGGTGTGAGCCAC
-CCTGCTTCCAAGGCTTTCAAAACACCATACGCTGAtgtattgtttctcatctattgctgc
-gtaacaaattgccacaagcttagcagtgtaaaacaacatgcatttgttatttcagtctcc
-atgcatcaggagtccagcatgccttagctgggtctctgctcaggatctcacaaggcagca
-gctggggtgctggtggcccgcattccttcttggagctcagcagccttttccaagctctca
-cggtagtgggcagaattcagttctttgtgcttataggacagagatccctgttctattgct
-ggctgtcagttagtaccactcttgattactacaagctgctcagtttcttgccacatggcc
-cccacagggcctccccagccttctcacaatattgcaacttattttgtcaaggccagagga
-gaatttttctgctgcttggagtcacttggctcagggaaggtttaagctctcttttaaaag
-cctctcctggctgggcatggtgtgttcatgcctgtaatcccagcactttgggaggccaag
-gtgggtggatcacctgaggtcagcagttcgagaccagcctggccaaatggtgaaacccct
-tctctactaaaaatacaaaaattagcctggcgtggtggcagtcgcctgtaatcccagcta
-cttgggaggctgaggcaggagaatcactcgaacctgggaggcggaggttgcagtgagcca
-agaccaagccactgcacttcagcctgggcgacagagcaagactctgtctcaaaaaaaaaa
-aaagaaaaaaaaggaaaaagagagagagaaaaaaaaagccttccctaattaggtcagact
-cacccaggaaaatctcctttttgattaggcatcaactaatgtgggattttatatctgcaa
-aaaatcccttcacctttgcagtatattgtagccttataagagtgacagctgtcatactag
-atttgcccacactcaaaagggaggaggctgtctagggcagctacaccagagactgggaat
-cttgggggccatcttagaattctgcttatcacacacctgtaatcccagcacttcgggagg
-ccaaggtgggaggatttcttgagtccaggagttcaagaccaacctggccaacatagcaag
-acctaatctctagtaaagttttttttaaaaaaattagccaggcacggtggtacacacctg
-tagtctcagctacttgggaagctgaagtaTCATAgctgagaattctcaggtctacatctc
-catcccagacatgactagactagctgccttcttgtcatctccactgatatatctaattgg
-cacctcaaactggacatgccaaaaaatgaactgtttccacagtgctcccaagcctgcttc
-cacagaccacatctgcacagctgatgtgaaatgaaaggctaaagcctctcagttatcctt
-gatgcctcttttcctcccagcgccatctcccttataccctgttggctctaccttcaaaat
-atgccctgtgtcttgtcacttctcacatcttccatggcctctgggtccaggatataaggg
-catacgaagggctccttgcgttttcctttgccccactcatagtcttattgtccacacagc
-agccggagtgatctggttaaactgtaaatcccagcacaccctgccactgttcaaaattct
-ccaaagactctcattcagtagaagccagagtcctcagcatggcctgcaaagccccataag
-aagtagcctgtggctcagcctcggcttcatcttctactttttctgtttctcacatgccca
-gtcacactggtcttgctgttcctcaaaagtgccaatcacacttccgcctgaaggcttttg
-cacatgcttttccctctgcttaagatacccttcctccggctgggcgaggtggctcacgct
-tctaatcctagcactttgggaggtccaggtgggtggatcacctgaagtcaggagttcgag
-accagcctggccaacatggcgaaaccccttctctactaaaaatacaaaattagctgggcg
-tggtgacacatgcctgcagtcccagttactcaggaggctgagacaggagaatcacttgaa
-tccaggaagcagaggctgcagtgagctgagatcgcatcactgcactccagcctgggcaag
-acaaagcgagacttcacctcaaaaaacaaacaaaaaaatacccttcctccagatagccac
-atgtcttacttccttcaggtctcagctcccagggcgccctagagtaggcacagggagtac
-ctcacagtgtcctccctgaccatccatataaagtaacatcctccataaactatcctgtta
-ctttgctttatttttctgaatagcatttatcactatctggcatttatcacctgtagtttt
-tactttttgtctctctctctctaatttgtatgtaagcttcataaggaaggaatgactctg
-GACTGGACTCCATGCCTCAGCACATTCACCCACCCATTCAACAAACATTCTTAAGGGTCT
-Aggctgggcatggtggctcatgcctgtaatcccagcactatgggaggccgaggtgggagg
-atcacttgaagccaggagtttgagaccagcctgggcaaggaaacaagaccctgcctctaa
-aaaatacaatttaaaaaagtatccaggcacagtggcgtgagcctatagtcccagctactc
-gggaggctgagctgggaagatctcttgtgcccaggagttcaaggctgcagtgagccatgg
-tcatgccactacactccagcctgggtgacagagttagaccctgcctgtaaaaaaaaaaaG
-GTGGGGGGCAGGGTGGGgaaggtttgccttgaccaggccgcgtgctaggtgccgggcata
-caaaagtgaaaaacgtgatttgtcctcagtgagctcacaggtctgaggagacacataaac
-ccaggaatggaaatgctttgctggcgatggacagtgagtctgggagaacattgaggagat
-gtttaacccagacaatggagtggggtgtggtcaggtcattccctggaggaggtgatgttt
-aagctgtggcatgaaacctcagtaggatgtgatgaccttagaacatggctacacgttctt
-tgacattcctcctttaaattaccttccctttgaatctgggctgggccttcatgatccatt
-tgtaaccaacaggacacagcagacatggtgctgcaggatttccaaggctaagtcacgctg
-aaccgccatgttgaaaggccaacagccaagactgccatgtggagaagcagcccgggccac
-gtgggaagaccatgtgtaggtagctgctccagttgacagctgagcccaggcaccagactt
-atgagttgagaagcttccaggggattccagcccctcataattcaactcactcccagctgt
-tggagggccttcccagcagaggcccagccatcacagagcagagacaagccatcccttcta
-tatcctgtctgaattcctgacccagagtccacgaacataatgagatggcagttgtccaca
-ctattaggttttggggcagtttgttatgaaggaataactggaacaataggataaggaaga
-gtgaggtgaaggaaaggactttacagatgccagcaacagtacatgggaagacctggtaag
-agtggctgacacagaagctaaccagcttgcggggaaggtgtggagagaggagggtgacag
-gcaagagtgagaaggaCCTTGAAGGTATTTGGACTTTATCCCGAGTCTTCACACTGCAGC
-CCAAGGGGTCAAGGAGTCtttttttttgtatggtaaacatggggtcttgctatgttgccc
-aggctggtcacaaactcctggcctccagagatcctcctgccttggcctcctaaagtgctg
-aaattacaggtgtgagacactgtgcccagccTCCAAGGGGtcttctcttttttttgagac
-cgcgtctcgctctattgcccaggctggagtgcaatggcgcaatctcagctcactgcaatc
-tccgcctcctaggttcaagcgattctcctgcctcagcctcctgagtagctgggactacag
-gcatatgccaccacacctggataatttttgtatttttagtagagacagggttttaccatg
-ttggtcaggctggtcttgaactccttacctcatatgatctgcccacctcatcctcccaaa
-gtgctgggattacaggcgtgagccaccatgcccagccGGggtcctttgaaaacacaaacc
-tgaccactgctgtaaacctttcgatggccccttactaccctcaggataaaCTCTTGAAAT
-TCAAGGCATTTTGCAGTTGACTCCCTCACTCTTTTATAGATTTATCTTCGGTCACTTTAT
-CCTCAGCTACGCCAGGCCACTCTCCAGTGACAATGCTTCCCGCCTCACCCATGCTATTTA
-TCTTTGCTCATGTGGAGGAATTAgtgggactttgggctaatcaccttgcctttcgaggcc
-tcagtttccccatctgtatgattaggtggttggactagaagtttttgttttgttttgttt
-ttgtttttgtttttttgagaccgagtttcactctgtcgcccaggctggagtgcagtgctg
-tgatctcggctcactgcaacctctgcctcccgggttcaagtgatttttctgcctcagcct
-cccaagtgactgggattacaggcatgcaccaccaggcccaggtaatttttttgcattttt
-agtagaaacagggtttcaccatgttggccaggctggtcttgaactcctgacctcaagtga
-tccacctgcctcggcctctcaaagtgctgggattacaggtgtgagccacgacacccagcc
-ttagatgtctcttaagagcatatctagcctggcattctaggagtctatgaAAAGGAGGGA
-GAAAGGTGTCTGTAGCCAAACCTGCCTGTCTGGCTTCTTCTAGGTTGCCTAGCAATGGAT
-GCCAACCCTCTCCCCCATCCTTGGGGGTTTCTTAGCAACCCAGTTTCTCACCCTCTGCTG
-TTTTCAGGGTTTCCTTTTAACTAAATGTCAAGTTTTGCTCTTTCTCCTCCAGAAAACCTG
-AGGCCAAGGGTCTCTGTGTAGAGCTGGATACAACCCAGAATACACAGAGACCTGGGTTTG
-AGGTCAGTGGAGGATTTGCTGTGTGACTTGGAGGTCTTTGACCTCTCTGGCTTTCATTTC
-AGACTGTGATTCCCTGTCATATGCTCCTCAGAGttcttcttcttttcttcttcttcttct
-ttcctcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttc
-ttcttcttctcttcttctttcttcttcttcttctttcttttcttcttcttcctcttcctc
-ttcttcttcttcttcttctcctcctcctcctcctcctcctcctcctccttctccttcctt
-ctttcttcttcttcttcttcttttgttttttgagacctagtctcactctgtcgcccaggc
-tggagtgcagtggggcgatcccggctcactgcaacctccgcctccctggtacaagcagtt
-ctcctgcctcagcctcccaagtagctgggattacaggtgcacgccaccatgcccagctaa
-ttttgtatttttagtagacacagggtttcactatgttagccaggctgatctcgaactccc
-aaactttgggattacaagcatgagccactgtgcccagccTGttcttttctattttttgag
-atggagtctcactctgtcacttaggctggagtacagtggcacaatctcagctcactgcaa
-catccacctcccaagttcaaacgatttttctgcctcagccaccaaagtaagctgggatta
-taggtgaacaccaccacaccgggctaattttttgtattatttggtagagacgggttttca
-ccgtgttacccaggctggtctcagactcctgacctcaagtgatccgccagcatcagcctc
-ccaaagtgctgggattacaggcatgagccactgtgcccagccctctgtattgttctgatt
-ttagtatatgtgtgctgaaatgagcacTTCCCTCTTCTCTTGTATGCGTTTGGTTTGACT
-ACCAAATTTattcacttttgcaataaaccgtcactgagcacctactatgttccaggcact
-gtcttaaggactggggattcgtcagtgaataaagcagacatagtcccttccctcacagag
-cttatactctagtagatggaaacgtataatgaataaacagataagtgcacataatgatat
-catgcagtgaAGGGGACAAAGTGTAAGGAAGGGCTACTATTTTAGATGAGGAGGTTGTAT
-CAGTCAAGATGGGCTAGGGaagtcagagatggttgggaagaaaaagcctggcttccccct
-ttctccctccaacttcctgtgggtgcctcaccttgggtgacctcagctagaggccagctg
-acaaaggaggctgagtagcttccaggggtcagctctgcaaagcaggaaagagcaaggaat
-ccactggaagcaagaaggcCCAAAAGTACCTTGGGAGGTACGCCGCTTTTTCAGCTCACT
-CACTGCCTGTAAACTGTCAGGGACCCTAGGATCATTAAAAAATATTTTGAGggccgggcg
-tggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggatcacttgag
-gtcgggagatcgagaccagcctgaccaacatggagaaaccccatctctactaaaaataca
-aaattagccaggcgtggtggtgtgtgcctgtaatcccagctactcgggaggctgaggcag
-gagaatcacttgaacccaggagacagaggttgcagtgagctgagatcacaccattgcact
-ccaccctgggcaacaggagcgaaactctgtctcTCTCTCTCTCTCTCTCTCTATCTATAT
-ATATATAGATAGAGAGAGAGAGAGAGAgtagtaaaatacagatagcataacatttaccat
-cttaaccatctttaggtgtacaactcactggatattaagtatagtcacattgttgtgcaa
-ccatcaccatcatccatcttgagaactcttcatcgtgcaaaactgaagttctggatccac
-tatgcactaactctccatttccccctccccctagctcttagcaaccaccattctgctttc
-tatatgtatgaatttgactatggtatatgtctcatataagcagaatcatacagtgtttac
-ttttcgtgactggtctatttcacttcacatcatgtcctcaaggtttatccattgcagcat
-gtatcagaatttccttctttttaaagctgagtaatattctattgcatgtgtatatcacat
-cttgcttatccattcatctgttgatagacacttgggttgcttccaccttttagctattga
-gaataatgttgctatgaaaatgggtttggaaatttctcttcaagatacactgctttcagt
-tcttttttttttctctctgagacagtctcactctattgcccaggctggagtgcagtggca
-caatctccgctcactgcaacctccacttcctgggtccaagcaattctcctgcctcagcct
-cccgagtagctgggattacaggctcacaccaccgcacctgatgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtctgtgtgtgtttagtagggatgaggctttgccatgtttgtca
-ggctgctctcaaattcctgatctcaggtgatccgcctgcctttgcctcccaaagtgctgg
-gattacaggagtgagccaccacccctggcttcagttctttggggtatataactagaagta
-aaattgccagatcatgtggtaattctatttttactttttcaaggaatcactatgtgtttt
-ccatagcatctgcaccatttttcattgttatcaacaattcacagggttccagtttccccc
-tatccttgccaaaacttgttattctgttttgttttatggtagtcatcctaatgggtatga
-agtgACTAGGATCATTTTGAGACCCAAACAGTCACAGGCTTTTTTGTTGTtgttgcccag
-gctggagtgcagtggtgcaatcatagttgaccgcagcctcaacctccttgggctcaggtg
-aacctcccacctcaggctcccaaggagctgggactacaggcacacaccaccacatccagc
-taatttttgtgtattttgtagagacagggttttgccatgttgaccaggctagtcttgaat
-tcctgggctcaagcaatccacctgcctccagcctcccaaagtgctaggattataggcACC
-CAGCTTCATAGGctttttagcccaggcttgtgatttctttgtcagtataattctctgaaa
-aacttaggtttctggcagggggcagtggctcacgcctgtaatcccagcactttgggaggc
-cgaggcggacggatcacctaaggttagaagttcgacaccagcctgaccaacagggtgaaa
-ccccatctctaccaaatacaaaaaattagccaggcatggtagcatatgcctgtaatccca
-gctacttgggaggcggaagcaggagaatcacttgaacccaggaggtggaggttgcagtga
-gccaagattgtgccattgcactctagcctgggcaacaagagtgaaactccatctcaaaaa
-aaatcttaggtttcttatcgatttgactgtagttaatggtactaaaaccatacccacaat
-acttttcaatataTTGTCCTCAAGTCTGCTTTTTCCCTTTGCTTTCTATCCTAAAGCTGT
-CACTCTCAATGTAATGGCAATTAGCAAGAATAACAGGTGGCAGAGTTGCACCTCTAAAGT
-GATCTTGGCTCTGAGAGTTTTTACAGGACATTTTTCACTCAAAGCCTTTTAAAAATCCAA
-TCTCATACTTTAGTTGATTCTAGCCTTGAAGTACTTTAATTGATAAAAAAGAAAGTTCAT
-AAGGTCATTGGGAAGATTAATTATCCCAGCATATAGTAAATGCTCTATAAATGATACCCA
-TCTTTGTCACttttttttttttttttgagacggagtctcactctgtcgccaggctggagt
-ggcacaatcttgtattactgcaacctccgcctcctgggttcaagcaattctcctgcctca
-gcctcccaagcgagtagctgggactacaggcagcatgctgccactcccggctaatttttt
-ttttttttttttttcagtagagctggggtttcaccatattttctttctttctttctttct
-tttctttctttctttctttctctttcttttcttttcttttctttttctttctttcttttc
-ttctcagagtctctctctgtcacccaggctggagtgcagtggcatgatcttggctcactg
-caacctctacttcaagtgattctcctgcctcagcctcaagagtagctgggactacaggca
-tgtaccaccatgtccagataatttttgtatttttagtagagacagagtttcaccacgttg
-gccaggctggtctcaaactcctgacctcaagtgatccacccacctcagcctcccaaagtg
-ctgggatcacaggtgtgagccaccatgcctggACAAATTTTCCTATTTCTTAATAGATAA
-TCCATCTTGTTTTTCTCAAAAGTAGACAGTTTATCAGGTGTCGTGTCTCTCACCTTCCCA
-CCCTACTCACCTATAAACTAATATAACAATAACAGTaacaataaccataatttgctgagt
-tctaattttgttccaggtactttggataagtgtcttatatgcacatctcatttcactctt
-tcaacccctctgagaggcaagtacttaaattatcttcattttacagtcagggaaactgag
-gcacagagtgtttaaatcatgtaagcagtaagtagtggagctaagattcaaacgcagatc
-tgctggactccagagttcAACTTACAGACACTACATTGTGGCTCTTCTTGGTGGCCCCCT
-CCCCTCCTCCCCAGGCTCTCAGAGGATACAGGATCCCTCCTTTGCTAGTCAAGGCCAGCC
-CATCCCCCTGTATATTTGACTTCATCTCTTCCCACTGCCCCAGGATTTCATCCACCCCTG
-CTCTGATATCAGGGGCCCCCTCCCCTTCTGTCCATGGTGTGGGGCTTTTTGCACTTcaca
-cacacacacacacaggtgcacatacatacacacCCCTTCTCCAAACCACTCCACAAAGGG
-CCCCTGCCTCCTCActttcttgccttccacatcacaccctaaattctcctggccaaggtt
-cccactgacctccttgttgccaaacctaagtcctgttgtcccgctgtgtgtctcttatgc
-acttggcaaggctgagcaggtccttcttggaaatgtgtttctttggtttctatgacacAA
-TGCACCCCCACTCCAAAACACACATACACACATCCCAGATTCTTGCCCCCACCCACCACC
-ACCCGCTATCTCTCTAGATGCTTCTGTGGTTCTTTCTCCTCCTCTGACCTCTTCAAATGT
-AGtatggtggttttaaaacatgtccataatttttttttttttttttgagatagagtctca
-ctttgttgcccgagctggatacagtggtgcgatcaggtgcgtgccaccatgctcagctaa
-ttttttttaacttttaagttttttggagagataggggctccctgtgttgaccaagctggt
-ctcgagctcctgggctcaagcgatcctcccatcttggcctcccaaagtgctaggattaca
-gacttcagccatcgtgcccaaccatgtctataaattctttaagactcctcccactgagta
-acagagtctgtttcttccccttgaatctgagccaaacttagtgactcagactacagtaga
-aatgattctatggtgacttgtgaggctgggtcataaaggcaatgtggcctgactcatggg
-agtcctgagctacagtgtaagaggtgtcaacactctcagctgccatgctgtgaggaagcc
-caactggctcatgcagagagacaacatggagaggccttgaggctatatgaagagagatgc
-ttggccagctcccagctgctccagctccccagtgctccggcttccactgtaaccacaaaa
-gagacaccaaggcagaaccacccagatgagcccttcccaaattcctgacccacagaaatt
-gtgaaagatgataaaaatcattggatttggagtggtctgttatgcagccatagacagcca
-aACAGAGGCAtcttaatctgcttgggctactataacaatttagcatggagcaggtggctt
-gacaacacacatttattcctcaggtctgcagggtgaagagtctaagatcaaggtgctggc
-aaattccattctgctggcaaccaagggcctgacttctggtgtacagacgaccatcctatt
-gtagccccaaatggcacagagaagaagcaagctctcaagtctcctcttatcaggctgtaa
-tccctcccaaaggcccacttccaaataacatcaccttaggacttcaacatatgaatatga
-gggagatacaaacattcagtctgcagcaGAGGGCTTCGTTAGAGCTCTGACCTGAGCACG
-CTTCATCTCAATGTCAttgtttttgccagctctacatccactgccctttttttttttttt
-tttttttttttttttttttgagacagagtctcactcttatcacccaggctacggtgcagt
-ggcacgatcttggctcactgcaacctccgcctcccagcttcaagtgattctcctgcctca
-gcctccggagtagctgggactacaggtgcatgccaccacacccggctgatttttgtattt
-ttagtagagacagggtttcaccatgttggtcaggctggtctcaaactcctgaccttgtga
-tccacctgcctcagcctcccaaagtgctgggattacaggcatgagccactgggcctggcc
-ccactgccctttcttacagtaacagtatttcaatttccctttagggaagctcttcaagca
-ggttctcagtccaagaggtttctctgggttaagcactgccagccacccaaagggtgagca
-agtaaccagccaatcagagacactccagtgggttcagtaaatgacatattatctaactgg
-ggtgaggggaatcaacatcagggcttttcctgagactataaggagaaacagattcttttc
-ccagcagttaaatttgaagtctgtggccattttgctaccatatagggaaaatctgcctga
-cattgaagccaacacagatgagggaagagccaagagataaagagaaagatcctgagcatc
-tggatacagccatgcctgaagccagtatcccttgacttctcaattatgtgagcctttata
-ttccctttgtttaaagccagttcaagttTAAAACTGCCATTTCCAGTGAGAACAATTCCC
-TATGTTGTATCTAAGGCCAAGACCTTGCCCCTGACTCTAGGCCAGAATGTCCTGTACAGT
-GCCATTCAACTCTGCCAAAAGCAAAGGGCATCAACTTCTCCACAACCTGGCTTTCCCTCA
-TCTATTTTACATCTCTGTTAATGGGAGCATCACCCACCTGACCTATAAACATAAAAGTCA
-GCCTCTATCctctctgtctctctccctctctctgtctctctctctctctctcAATCCCTG
-TCACTTCCCTTACTTCTTAGTAACCAAGTTCTGCCAACTTAACTTTATGGACATTTTTCA
-CACCTGCACCCTCCTTTCCATTTTTCCTGCCCACTCCAATTCTTCATCATTTCTCACCTA
-AATTTTTACAAAATCAATAGATAACTAACATAGAGGTGTATAGTAAAAAGTGAATTTCgg
-ccgggcacagtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcagatc
-atgaggtcaggagatagagaccatcctggccaacatggtgaaacctcatctgtactaaaa
-atacaaaaaaaaattagctgggcatggtggcatgtgcttgtagtcccagctactggggag
-gctgaggcaggagaatcgcttgaacccgggaggcggaggttgcagtgagctgagatcgca
-ccactgccctccagcctggtgacagagcgagactccatctcaaaaaaaaaaaaaaaaaGT
-GAATTTCATTCCCACCCTTGCCATCAGTTACCCTCCCCCAAGGCATCTACTGTTACCTCT
-TTCTTGTCTATTTTCCCAGAAGTTCTCTATATGTGCCATCTTTTTGAGAATTTcaaatgg
-aggcatactatcaagacttttcagaacactgcatccttcttcacttgaagtgtgattaat
-ataaataattatagactaatttcttctttctaatggatgcatagtattccacaaagacat
-ataatgtacataactcgtcttccattgatggatatttaagtggtgtcccagttatctgtt
-agcacagaacaaaaccccccaaacctagtggtataacacaataaccacttgaatatgctt
-gtgggttctgtgtgtcaggaattcaggcaggacacagtgaggccagcttgtttctactct
-gcaatgtttgagtcttcagctaggaagatttgaagatttgaaggctgaagctgattcaaa
-tggctggccactggaatcatcttgttcttccccttccccttcgccttctacagtgcaatg
-gcatgatgtcggctcactgcaacctctgcctcccgggttcaagcaattctcctgcctcat
-cctccctagtagctgggattacaggtgcacgccaccatgcccggctatttttgtattttt
-agtagagacggggttttgccatgtggccaggctggtctcgaactcctgaactcagggtat
-ccacccgccttggcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggcct
-catctggttcttcttcactcacttcttttatgcttgaactgggatgactcaaagctaagc
-ttagctgggactgtggtgccttcatgtgtcctctcctgatggtcttggcatcctgacagc
-atggcagcctctaagcagacatggagccctaggtaggcatggtgcctcaggctccaagag
-ctagagttctagcagaagttgcctgtacttttatgtctggaccttagaagtcagagtgtt
-acttccaccgtactccattggttgaagcagtcatcagctcacccaagattcagagagggt
-acaaggatcccacctctctacagaggagtgctaaagaatttgtagctatattttaaaacc
-accacaggttgtttccaatctgtagctattcctgtagttcattttacaggctaacatctc
-ttgaatgtcttcatttctctgcaccaggccaagacactgtcatctctgatctctttgctg
-atctcttgctgtcactcttgtgctcaacatgctgttctcttgacagcagccagaggtctt
-ttcagaatgaaaatcagatcacatcccacccctcttcataacccttccatggctccccac
-tacccttgggctgaagctcaaactccttaccttggcttatgaggccccacaaggtctcac
-ttctgcctgcctctccaatgccatctcctgtcacCATTTGGGGCCTTTAGTTTTGAGCTG
-CAAGAGTTCCTCCCATcacacacacacacatacacacacacacacacacttaaatgagta
-agtaaatagaacatacaaaacgcttaaacactttgcacatagtgagcataataagtttgc
-tactattATTAGACTGTCttcagtaaatatttactgggctgcctactcagtgccaagcac
-tatgggaggctcacagatacaacacgaacaagaAATATGTGGCCTTggccagacgcggtg
-gctcacgcttacaatcccagcactttgggaggccgaggcaggtggatcacttgagctcag
-gagttcaagaccagcctgggcatcatggcaaaaccctgtctctattaaaaatacaaaaaa
-ttagctaggcatggtagtgcgtgcctgtagtcccagctcctcaggcgactgaggtgggag
-gatcacctgagccttgggagatcgaggctgcagtgagccgtgatcatgccaccgcactcc
-agcctggacaacagagtgagacgctgtctcaaaaaaataaaaattaaaaaaaaagaaaaa
-GAAAAACTAAAAAGGAAGATGTGGCCCTATCTTGccgagctcattcttctgtgtgtcccc
-agcccctagcacaaggagaaacagaatagatgctcaaGACACAAAGGCATGTCTGTGCAA
-GGGTGCTTGAtgacggttggaggggcacaatgactttcccaagatcacacagcaaatgtg
-ggacaaaatcaagGCTGACAGCTCATGACAGGGTGGGAGGCAGATGCAGCTGCCTGGCAC
-AGGCTGGCTCTCCAGGGAGATGGGCAGTGGGCACGCATTGCCCAGGGCAGAACTGGGGCT
-AGGGGAGGAAACAACAAGGGAGGCTGTCATTAGCTCCTTCCAAAGTGGAGGTCACTTCTC
-TCCCAACCCCGAGTCCTCCACCCAAACTCCCTTCTCAAGGTACAAGGGCTGATCCCGTAC
-CAGGGATGGGTAGGGACTCAAAGAGGAAAAGAGGATGAAAAGAGGATGGGGACTGAGTGA
-GATGTGAGGACTCCAGAGGGATTAGCGGCTCTCAAGGCAAGTGGGAGGGGACTTCCCGGT
-AGGAGCCCGGAGACAGATGGGAGCCTGTGAAGAGGGCGGGGGCCCGGCGAGGAGAAGCGG
-TTTCTACGCTGGGGTGGGGCTCCATGAGGGGGATGGAGACCTGGAAAAGGGACTGACGGT
-GCAGCGAGGAGAGGAAGGCTCGGTTAAGGGATGGGTCTTCCACGGGAGGGGTGGGGAACT
-GCGGGAGTGACGGCAGCTTCGGTGAGGAGTCTGAGGGGCTGCGTGAGGGGCTGGGGCCCA
-GGGAGTCCGAGGGGTCTCTGTGAGGGCGCTGGGGTGTCCGAGCGAGCAGGGAACTCTGGA
-AGGGGACAGGAGCCGGGGGAGCTGCAGGCGGCCGCCGTCTGCAGAGCCAGGCCCTGAggc
-gggccggcgccccctcccccgccccgAACTGCGGCGCAGGCGCGAACCGGACCCGCCTTT
-GCTCGGCGGAGACAGCAGGCAGAGAGGTGAGCTTAGCCCTGCCCCACGCGCGGCCAGGCC
-CCAGCCCCAGCCCCTGGAGAACCCCCGCGCTCTGCCCGCATCCTCAGCCCGGGCCGTGTC
-CCGCCAGGGCCGGGACCTTTGCGCCTGAGCCTCGGCTTTGGGAGGTGGGGGTCCCAGGGA
-AGCAGCAGGGGCGGGAGACAGAAACAGCCCCATCGCCCCTCGACGCCTCAGGGTTGATAG
-GCTGGGTAGAGGCTTCAAAGGACACCCCCACCCCCGCCAACACTTCAAAAACCCATTCCT
-ACCCCTCTCTGCCTCAGTTTCTCTCTAGGGAAAAGGACGCAGTTGGTGTGGAGCAGGGCA
-TCGGTGGTCCTGTCAGGAAGAGTGGCGCGGGTGCCGGTGGGGAAGGGAGGCGGGAAATGG
-CCTGATTTCCCCGGCCGACACCCCCTACCCATCCCCCCCGGGAGGGCGCCCCTTCTCCCC
-CGCCCGGGCAGCGCTGGACGCTGTAGTGGGCGAGTCTGAGGGTCTGGGAAGGACACAACT
-GAATGAGGCTGTGCAGAGGCGACAGATTCCGTCCATCTTCGGGCCCTGGCTTCCGTCACT
-TCCGCCCGTGCCTGCCGCCCCTCGCCTCCTCCCTCCGCCGCAGTCTCCCCACGTCGGACA
-GCGCAGCCCCCTCCGCCTCCCGCTCCCCTCCCACCGAGCTCCTCCCGGCTCCCGGGCTGG
-GGACGCCTCCCTAGCGGTTCCCATGGCAACCCTCGTCCCGGGTGCCTgcgccccgccccc
-cgcccgccAGACCTACTCCGTGCAGCCCTGAAACGCCAGGCGGAGGGGCCAGGCCGAGCG
-GGAGGCAGCGTCAAGGTCACCTTCCCTCTCCAGTAGCAGCAGGACTGAGTGATTCCATCT
-ATTTGGAGTCGCGGAAGCGGTGAATTGGAGGGGAGGAGCTGACCCAGGTCAACAGCCCCG
-AAGCCCCCTCCACACCTCCTCACCTGTGGCCTTGAACAGTGGTCTCCGCACGGAGGCTCC
-TACCGTCCCCCAGGCCCCATTTCTTCTCCCCACCCGGGCCTCCCCAGCGCCTCGCCGGGG
-CGGGTACCGCGCTGGCCGCACCCTCCGCACAGCCCGCCCCGCCCGCCTCCTCCGGCGAGC
-CCTCCTCTCCAGACCTCTCGCCCTCCTCCTCCGACGGTCCTTCGCTTTCAGTCTCTGCCT
-TTTCCCGTTCTCTGTCGTGGCTTTTGTTGTTGTTGTTTTTCCTCCTTTCCTTCCCCGCTC
-TTCTTTTCCCTGAATTGTAAGTGAGGAGGGTGTACAGCCACTATTTATGGACAGGCTTTC
-TTGACAGCAATCTTGTGTGCCGTGTGACTCCAAGCAGAACCTCCAACCgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtCGTACCTATCTGGGTATGTCTCTGTATG
-CTTTGTGAGTATGTCTGTGTGTTTCTCTGTGCTGTTTCGGTGAGTTTCTCTATGCAGGGA
-TTTGAGGACCACATCTGATTGGAAGTGAGGGGCAGCTGTCAGGACCTTTATCTTACCCTT
-TGGAACAAGCACATTGTTTCATTTTGCAGGAGGCTGCTAATTAAGGCTGAGGGCCATCAT
-GGAGACTGGGGTAGAAGCCCAGTCCTCCCCCAACACCTCCTGGCTTTGGTTCGGGCCAAA
-CCTGTATATGGATATACAAGTACCTTCCATTCCCAAGATCCGTGTCCACTTTTGTGGAAA
-AAAAAAAAAAGGTTATTTGATAGGTTTCTCTGGAAATCTAACAGCCCTTAAGCCTAAGAG
-TCTTTAATCCTGAGGGACCCTGACTTTCACTTCCAATGGAGTCAAAATTCATTGGAATCT
-GGAGGCTTTCAGGGGCAGTCCTGGGGAGGACCTTTTTATAGCCTTGCAGCTTGGGAACTC
-CAGCCCAAGTGTCAGCCATGACAATTACCCCCAGGAGGGGGTCTGAAGGGGAGCGGAGGG
-TGAGGCTCTCTCATTCCAGATATGGAGACTAAAAAGTTCAAGATGGAAGTAATAGCAAAA
-AAATTACAGTACTAATCACAACAGCTACCATTTCTCAGCATTAGAcacagtaactgtatg
-aaagaagtatgattattaggtctgttttacagatgaggaaactgagacccagaaaggtgg
-aagcacttgtctaaggtcacgcctccaggaagcagtgtgtccacgactccagtccaagtg
-gtcaggctccagagcccacagtcccaggtactGGGTGGCCTCCAGAGTAAACATGCAcat
-ttattgacacctccaattgccaggcactgggctaaggccttcagtgcattggctcattCG
-CAGTGTGCTTTGGGAAGGACAGGCTGGGATTCCAAAAGGCCAGACTGTGCTATGCGTGTA
-GGGTGTCTCGAGTGGGAGGAGAAGCGGGTGGGGCACAAAGATTTAGGGGGCTTATGAAGG
-TCACCATGAGCAGCTCCCACTAATCCCTCCCTCCGTCAGCTGCACCTTACCTGCTCCCCA
-GGGGTCCATGATGCCGAGCTGCAATCGTTCCTGCAGCTGCAGCCGCGGCCCCAGCGTGGA
-GGATGGCAAGTGGTATGGGGTCCGCTCCTACCTGCACCTCTTCTATGAGGACTGTGCAGG
-CACTGCTCTCAGCGACGACCCTGAGGGACCTCCGGTCCTGTGCCCCCGCCGGCCCTGGCC
-CTCACTGTGTTGGAAGGTAAGGCCAGATGAGCACCTCCCATGATTCCTCTGCCTTGATGG
-AGGAAATGAGTCTGAATTTGAGGCTCAGAGGAAAAAAGAAGAGATAGCgtagtagttagg
-agtcttgcacagtcaagcaacagaaaacccaattcaaatgggtttaaataatgaagggag
-ccttcattgTATTTGTATTTACAtacaaattatttacataattatttacatatttattGT
-ATGTAAATAATggtggctcatgcctgtaatcccagcactttgggaggctgaggtgggcag
-atcacctgaggtctggagttcaacacctgctctgtcagcatggcgaaaccctttctctac
-taaaaatacaaaaatggaccgggtgcggtagttcacgcctgtaatcccagcactttggta
-ggcggaggctgaggctggtggatctcgaggtcaggagttggagaccagcctggccaacat
-agtgaaaccctgtctgtactaaaaatacaaaaattagctgggtgtggtggcgggcgcctg
-taatcccggctactcgggaggctgaggcaggagaatcacttgaaaccaaaaggtggaggt
-tgcagtgagctgagatcaatccattgcactccagcctgggtgaaagagcgaaactccctc
-taaaaaaaaaaaaaaaaaaaaatgagccgggcgtggtggcaggcgcctgtaatcccagtt
-acttaggaggctgaggcaggagaattgcttgaacccaggaggcagaggttgcagtgagcc
-aagtttgcaccattgcactccagctgggcgacagaacaagactctgtctcaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaagaaaaaaGAAGGGAAAATGTTGCTCATTTTTTAGAAGAGA
-CCCAAGGTCCAAGGTTGCATACTTTCAGGCAAAGTTTGATCCAGCAGTTCAACCCTTTAT
-ACCAAGGACTTTGCAAGTTTTCTTAGTCTTCAGCCTCCTCATGGTGCCCCTACCCTGGTA
-GCCTGTTAGCTTCAGACTCTCCCCACATGTTCCCCAAATGGCCACTACTGTGTGGACTCT
-CAGGTCTTCACTCCACACCATCTAAGGGAAGTCAGCATTTCCTGTGGTATTTCCTTCAGA
-AAAGAAAATAgcctgtaatcccatcattttgggaggccaaggtgggtggatcacctgagg
-tcaggagttcgagaccagcttagccaacgtggtgaaacctcatctctactagaaatacaa
-aaattagctgggtgtggtgatgggcgcctataatcccagctactctggaggctgaggcag
-gataatcactagaacccgggagacagcagttgcagtgagcagagatcgtgccgttgcact
-ccagcctgcacaacaagagtgaaactctgtcttaaaaaaacaaacaaacaaaaaaTGGCC
-ACAGGTACtggcttacacctgtaatcccagcactttgagaggctgaagcaggaggattgc
-ttgagcccaggaattcaagatcagcctgggcaacatagtgagacttcatctctactaaaa
-ataaaaaattagctggatgtagtggcgcgggcctgtgatgcctactactcaagaggctga
-gccaggaggatcgtttgagcccaggaggttgaagctgcagtgagccatgattgtgccact
-gcactccagcctgggcaacagagtgagactctgtcaagaaaagaaaagagagaagaaagg
-aagaGAGAAAGCAAAATAGTAAgatattaaaaacatgttaccatttaccttagcaccaaa
-gaagagagaaatacttaggtgtaaatctaacaaaatatctgtaatatgagaagaactaca
-aaactcaaaagatatcaaataactaaataaatggagaaatagttcatattcgtggattgg
-aatagtcaagatgttagttcttcccaacctgatctttgattcaatgcaatgccaatcaaa
-accccagcacgttattttgtggacgtcaaAATGTCACCTCCTCAGGGAGGAGATCCCTGG
-ACTGAGTCGGGTCCCTTGCTTTACTCTGGGCAAACTCTGTGCCCATTCATTCTTCAATAC
-ACTTACCACTTTGCACACTTGTAGTTTATATGGAGAGGTAAAAGATTCAGAAATTTAAAA
-ATCATTTATAagaaacaatgcttttaattcccagaagtcctgacaagcattgtgttggct
-ctcattgggtcacttgccagccttgaactaattactatggttaagagatggactatgctg
-actggcAGGAAGTGAGGTTCATCTCACTTAAATCTTACTGTGGTTTCTCAATGGTAGACT
-GGAGTACCTTGCCAGGGCAGAGAAAAAATGTGAAGAATTGATGTCTTTAACAGCCAAGGA
-GACTAGTCGGCCAGGGTGCACCAATGGGTCAAGGTGTAGAGGTGGCAATGAGCTGAGTGC
-CTGCTATGGGCATAGCTCTTTGCTAAATATTCTCGGGAGACTGAGGCAGAGGGTCCCTTC
-TTTTGCTTTCAAAGGACTTCACTCTAGTGAGGAGGTAAGGTGCCAACCTCTGCAGAGAGG
-CCAACTTACATAACTTCAGGTCAGGTCTGTAGGGAACACCAGGAGAGGAAATGATCAAGG
-AAGACTTCCAAGGAAAGGTTAGTGTGTATTTaaaatttttaagcatcttcttattgcgag
-gcactgtgctaggctcttgggaacacagaatttaagacatgaggtccctgtcttcgagga
-actcTTTTAGCTGTGGTTTatttaatcattcagcaaacatttattcagcctttgctctgt
-gccggcacgtgctaggcacagaagactcctagtgagccaaaacaggcacagtctgctctc
-atggagctctcagtactgcgggagaggcagacgtcacttacatagcaaccaaaatacatg
-tccaagtgtgcacaatggtaagtgtattgaagaatgaatgggcacagtttgcccagagta
-aagcaagagacctgactcagtccaggggtcttctccctgaggaggtgaggtttgagatga
-gatctgatggtgcataggagttaacccaacagagacaggaaggtagaaaggATAAAGAGA
-TGAGTTGGGATGGAGGGAAACACAGGGTTGGCCGGAGAAACCCACTGCTAGGTGGGAGCT
-GGGAAGGAAATTAAGAGGCCTCAGGATTCCAAATAAAACATGACAGTTTATGCCTCCTGT
-CAGTTAGACCCCAGCAAGTGTGTTCTGTGATTCCCATCTCCTGAGGATGGATCAAGGGGT
-TACCCTTAAGTCTGGTGAGGATCCAAGGTGATCCCTTGGCCAGGGGCCCCTGGCTGACCC
-TGACTGCTTCCTGGTCTGTCTGCTTCTCCCTAGATCAGCCTGTCCTCGGGGACCCTGCTT
-CTGCTGCTGGGTGTGGCGGCTCTGACCACTGGCTATGCAGTGCCCCCCAAGCTGGAGGGC
-ATCGGTGAGGGTGAGTTCCTGGTGTTGGATCAGCGGGCAGCCGACTACAACCAGGCCCTG
-GGCACCTGTCGCCTGGCAGGCACAGCGCTCTGTGTGGCAGCTGGAGTTCTGCTCGCCATC
-TGCCTCTTCTGGGCCATGATAGGCTGGCTGAGCCAGGACACCAAGGCAGAGCCCTTGGAC
-CCCGAAGCCGACAGCCACGTGGAGGTCTTCGGGGATGAGCCAGAGCAGCAGTTGTCACCC
-ATTTTCCGCAATGCCAGTGGCCAGTCATGGTTCTCGCCACCCGCCAGCCCCTTTGGGCAA
-TCTTCTGTGCAGACTATCCAGCCCAAGAGGGACTCCTGAGCTGCCCACATGGCCTAAGAT
-GTGGGTCCTGGATCCTTCCCCCCTTCTCACCATAACCCCCTCTCAGTGTTTCCCCAACTT
-CTCCCTTTTAGCAGGGTCCCTTTAGAGCCCAACTCCAGGTCAAATCTGGAGCTCAAATCC
-CAGTGCTCCCTCCCCAGGAGTGGGGCCCCAACTCTTCCAAGATACCAGCATTCCTCAAGT
-CCTCCCAAAACTTCCTACCCACACCCTCTTCCCAAGGCCCTCAGGGGCAGAAAACATCTC
-CTTCAACCCGTCCCCACTCCTTCCTctgcatgaccttgggcaaacccttgccctttcaag
-ccatcagctcctgcctctctgccatgagggctttggatcagatTCCTCTTCTCGCCAGGA
-TGAGGACACGCACTGCCCTCCATAGACACAGATGAAGGGGTGGGGGTCATTCAGCTCGAA
-TGGGTCCCAGATGCTCACTTGGCCTTTCCCTGCAGGATGAGTGAAGACGTTTGCCTCTCA
-CAGTGTGTCTtctacctgcattttggcatcagagccccccagcccacccaccacaggcaa
-ttactagccctagttgataggtgaggtgggtgaagaaggctggaggtgacatgtccgagg
-tcacacaacaaagcagcatgcaggaactagaaacacatcttcagcctccTCCTGGGCCAG
-CTCTTGTGCTACAGGTGGGGCGGAGCCAGCCCCTCACCTTCCTGGTTCCCTGAGGGTCCT
-CAGGGTGGAGGACAGGTTTGGCCCAGAAAGACTAGCCAGAGGCCTGATGGTCCCAGGTGG
-CTCTGGATATACTTTGGATATGGATTTAAATGGTCTCTAAGAGCCGGGGGTAGGGGGCAG
-GAAAAGTGGGTTGTCTTTGCCCCTCAAAGTCCACCTACCTAGAAACCAAGCCCACGGTCT
-TGGCCGTGACCCTGATAATAAATGGGCTCTCTCAGAGGCGCCAGCCCCTCCCTCCCCAGC
-CGGAGGCGTCATCTCTCTTCTGTACCACTAGAGGGAGCTCTGATGCAGCTGGAGAGCAGC
-GCTCAAGGCTCTCGCCCCTCCCCTCCCTAACCCTTACCTTCAGTCTCCACCAGCCTGAAG
-GGCCTCCTAGGGGATCCTCAGGCGGCCCCCACCAGGGCACACCCTACTGTCCTTGTGCCT
-CACGCCCCCTCCTCATCCTGCACCCCTTCCATCCCACCTTCCCTTTCAATAAACAGCTGG
-GATGGATACTGACTTTGTTTCCTTTCTCCCTGGCCACTGGGGCGTGGGGAGGAGAAAGAC
-ACAGACTCAGgagcacctactgtgtgctgggcacgacccattatttctcattcgctcctc
-aggataacctgttgagaaaggaattattgtcttcttttttttttttttaagatgttgtct
-cgctctgtcgcccaggctggaatgcagtggggcgatcttggctcactgcaacctctgcct
-cctgggttcaaccaattctcctgcctcagcctcccaagtagctgatattacaggtgcacg
-ccaccacgcctggctaatttttgtatttatagtggagacggggttttaccatgttggcca
-ggctggtcttgaactcctgacctcaaatgatccgcctgcctcggcctcccaaagtgctgg
-gattaccgggtgagccaccttacccagacttattgtcttcattttacagatgcggtaact
-gatgatcagagaggtgagtgatttATTTTTTAtttttatttttaattcttttttattttt
-ttcgagacggagtctggctctgtcacccaggctggagtgcagtggcacgagctcagctca
-ctgcaagctccgcctcccgggttcatgccagtctcctgcctcagcctcccaagtagctgg
-gactatgagtagctgggactacaggtgcctgccaacacacccagctaattttttgtattt
-ttagtagagacagagtttcaccatgttagccagcatggtctcaaatctcctgacctcgtg
-atccgcccgcctcggcctcccaaagtgctgggattacaggcgtgagccaccgcgcccggc
-cTATTTTTAATtctttttatttcagtagcctttggggtcaaagtgggttttggttacatg
-aattagttctatagtgattctgagattttagtacacctatcacctgagcagtgtatactg
-tacccaatacgcagttttttatccctcatcccctcccaacctccctggactcagtcccca
-aagttcgttatatcactctgtatgcctatgcatcctcatagcttagcttccgcttatata
-agtgagaacctaccgtatctggatttccgttcctgagttacttcacttaggataatggcc
-tccagctccacccaagtcctgcaGTGGATTTAAATGCTCAGCCTAGGGCCTGGAGGGGTG
-GCTGggccaggcgaggtggctcacgcctgtaatcccaggactttgggaggccgaggtggg
-tggatcacctgaggtcaggagttcaagaccagcctggccaacatggtaaaaccccataac
-tactaaaaatacaaaaattagctgagcatggtggtgcatgcctgtaatcccagctactcg
-ggagactgaggcaggagaattgcttgaacccgggtggtggaggttgcagtgaaccaagtt
-cacaccattgcactccagcctgggcaacagagcaagcctctgtctcaaaaaaaaaaaaaa
-aaaGTGCTTAGCCTGATTGGCCTATTGCCTGAGTGTGGAGCTCCTGTCTTTGGGTGGGAA
-GGAGATTTCTCAGCCACCTTGAGAACACACTTCCTCTAGTTCTGAAAGGAATGTGAGGGC
-CAGGGTGTGGGAGAGGGGGCTGAAGCCAAAGGTAAGATCTTTTCCAGGCCTGGaagagta
-attaaccccttttggcactcaccaggggctgggccttgttcttagtgccttacagaattc
-gggaattcatttaaccaggacgacaacctctgaggtggcggctattattctcaaacctag
-tttttcctaaactccaggcttgcgttcccatctgcattcacctggatgttgaatttaaac
-tcaactatctcaaactgttctccttgttaccacccctccctgaccaaacctgcctctact
-atgctgcccacgtcttagagagtagcgtccccattcttctggctgctccagccaaaacct
-cctctctttcctcacaccctgtatccaatccatcagcaagtcctgtcaactcaaccttgg
-aaatatatcctgtacccaactacacctcgacatccccgtggctgattccatggtctgaac
-caccagcgaccagcgcctcgatctggatcattgcaccagcttcccccggtctcctggctt
-ctgagttttgaaccccaccctactccacgccttgactccccaagtctaattactacacag
-tagccagacagatcttgttagaacataaactaggtcatgttcctcctccgctccaaacct
-tcccatggctcccacctaactcagagtagccaaaaccctccctgtggcctccaaggccct
-acacaatttgctgatttccactccccccgcactttcctctgtaaccccaactcccaccac
-tctccaggttcctgtgtcctctccagccaggatcctgactcagggcctttgcctcactgt
-tccctctgctggggtactcctccccagttgacgacatgggcagttccttcaagtcgttgc
-tcaaacatcaccttctcagcaaggccttccctgagcagcctattagaattgcaACCAggc
-caggcgcagtggctcaagccagtaatcccagcactttgggaggccgaagcaggtggatct
-cctaaggttgggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaa
-aatacaaaatcacccaggcatggtggcacatgcctgtaatcccagctactcgggaggctg
-aggcaggagaatcacttgaacctgggaggcggagattgtggtgagctgagatcgcaccat
-tgcactccagcctgggcaacaagagcgaaaccccatctcaaaaacaggaaaaacaaaaaa
-caaaaaaaTGCAACCATGCCggccaggtggagtggctcacacctgtaatcccagcacttt
-gggaggccaacgtgggcagatcacctgaggtcaggagttggagaccagcctgggcaacat
-ggtgaaaccctatctctactgaaaatacaaaaattacccaggcatggtggcacgtgtctg
-taatcccagctacttgagaggctgaggcatgacaatcacttgaactcgggaggtggaggt
-tgcagtgagccaagatcgcgccattgcattccagcttgggcgacagagcgaaactccatc
-tcaaaaaaataaaaggaaGCTAACACAGAGTATAAATGGTGCAggcagtttgacaatatc
-aaaatagaaaatacacatgccctttgatttctccctcttatgcaggtggatctatagatt
-caactctacatgttggaacactatagtattatttgtaattaaagcatttggaaacaacct
-aaatgctcatggtaggggactattaataaaatacggtaAggctgagtgcagtggctcacg
-cctgtcatcccagtactttgggaggccaacgcaggaggatcacttgaggccaggagttca
-agaccaacctgggcaacatagggcaacatagcaaggccccatctctacaaaaaattaaaa
-attagctgggcatggtggcacacgcctgtagtctcagctattaatatttgggaggctgag
-gcaggaggatcacaccactgcactttagcctgaatactgagtaacaaagcaaaaccctgt
-ctctcttaaaaaaaaaaTTGGGGGGAAGGACAAGTCTTttttcttttcttttcttttctt
-ttctttttttttttttttttgagatggaatttcactcttgttgcccaggctggagtgcaa
-tggtgtgatctcggctcacggcaacctccgcctcctgggttcaagcaattctgcttcagc
-ctcccgagtggctgggattatagtcatgcgccaccacacctggctaattttgtattttag
-gtagagacggggtttctccatgttggtcaggctggtcttgaactcccaactcctggcctc
-ggcctcccaaagtgctgggattagaggtgtgagccaccgtgcccagccAGGacaagtctt
-cttacagaagaattccaattagtaaatgtagaaggattgagagaaattgaaaaatcatca
-ttagaacaccggaataataattgctgcaggcaacatctaccaatgaacaataaaatgagt
-gggtgaaactttaaggagaaacaaggttttttttttagaaacgggatcttactacattgt
-ccaggctggtctggaactcctaggctcaatgggatcctcccacctcatgctccccagtag
-ctgctactacaggcacataccaccccaccaggcttgaaacaaaatatttgcatagcctca
-aagtatctatccccaaatatgtattaattagtatggtggttttaacatatgcatacatgt
-tctttgatgctctgccatctaggaaatggagcttaatttttctcctcttgagtgtgggct
-ggactcagcaacttgcttctaacaagtagaatgtggaaaggcaaaaacagtgacttcaca
-gtggaaaaatctggcagacaccaccttaaccaaatgaaggctggcaccaccagtcaaaag
-tcttgttgatatcacagcctctgaaatgatgtggtgagaagggcacttggcctgagtggc
-attcttcccccaaatccgtaacgtcagcctaatcatgagaagacccattctacaaaagat
-ctgaccagcactcttcaaatgtgtccaggtcacgaaagacaaggaaaggacaagaaacgg
-tctcaggttggaggagactaaggagacgtggctgaaggatacacaggatctccctgtact
-gtccatgtaactcttcaataaatctacaattatttcaaaatagcaaaaaatacgattGCT
-ggccgggcacagtggctcacgcttgtaatcccagcactttgggaggccaagaagggcaga
-ttacttgaggtcaggagtttgagatcagcctggccaacatggtgaaaccctgtctctact
-aaaaatgcaaaaattagctgggcgtggtggcatgtgtctgtaattccagctgctcgagta
-gctgaggcaggagaatggcgtgaacccgggaggcggagcttgcagtgagccgagattgcg
-ccactgcactcccgcctgggccacagagcgagactccgtctcaaaaaaaaaaaaaaaaaa
-aTTACTGTGGTCAAGATGGAATAACAGGGATCTGGTTTAACACACCCCAAAAAGGACCTA
-AGAAAGGACCATTCCCTCTCCTCTCTGAGGTGGGAAGATCTGGGAAGGAGAGGAGGCTGA
-CCAGTGGGGTCTACCTTCTGCTCCACCCCTCTTCTATCCAAGAGTCTGAGCACCCAACCC
-CCACACCACCCTGGAGGCTCCCGCCCTCGTGCTGAGTCTGGCATGCCCTCCCCATCCCTA
-CTGGCCCAGGGGACTAGGTTAGCTCAGAGAAGCCCTTCTAACTCACCCACAACTGGACCA
-AAGAAGGATTGATCTGGGGCCACTGCCTGGTCCCTGGGAGCACTGTGCTAGGGCAGGGGG
-CTGAGATGCCCCAGGGTAAGAGACAGAACAGTGAtttttttttttctaagacagagtttc
-gctcttattgcccaggctggagtgcaatgcgcgatcttggctcaccgcaatctccgcctc
-ccaggttcgagcgattctcctgcctcagcctcccgagtagctgggattacaggcatgtgt
-caccacgccccccggctaattttgtacttttagtagacacagggcttctccatgttggtc
-aggctagtctcaaactcctgacctcaggtgatcctcccaccttggcctcccaaagtgctg
-ggattacaggcatgtgccaccgcacccggccAAAAACAGTGATATTCATATAGATGGGGG
-AGGGATTAATGGGGGTGGAGTGAGAGAGAGCCTGCTGGAGCAGTCCGAAAGGCAGGCATT
-CCTTCTGTTCAGCAACATTCCTGCCCCCACAATCTCCTCCCACAACTTATATCTAGTgca
-ggctgagagtgaatctgtctgccagtgttcaagccactgtgtgaacctgagtttcttaac
-cgttctgagtgtcaggagtttttttcatctccaaaataggagcaacaaggataccaatcc
-cttgagattgtatgaagcttaatgcacttaacacagcacctggcacgtagacatgctccc
-taaatgccagctgttattatGAAAGAGAGAAGTCTGAGGTTCAGAACTAGCAGGCAACAC
-ATAATCtataatgatggatggctcagacagggtcctgtcctatagggactcacagtctag
-tggaaaggacagtcctgtggacagcaaatggcaaTATACCTGGGTAAGTACTGTAATAGA
-ATAACAAAGTAATATCCTATCACGGGGCAGTCACGGGGGCAGTGAGAGACAagcgcttgt
-ccatgccaggctctgtactcagtccatcacatacattaggtcttgcagtcctcataccac
-cataaggtggttaccattatctccaattcacagaaaagcaaacagtatggagtgtttaag
-cgtcctgtccgagatggcatagctagtggagctgaaatttgaacccaagtaatccaggtc
-cagaatGCCCCGGATGCAGAAATGACCACACAGATTCTACCAATGAACTAACCTGATAAG
-GTTGGAGGTCATACTCATAACCCCTCACACAGGTCCACACAGACACAGGCAAGCACACCC
-ATGTCTATTCAGATACACACCAATTCCTGTCTATGACGAGCGCTCAGAAAATCCTCCACA
-ACACCACACCAGGAATGATGTGCATTTTGAGAAAAAAAAAAATCAGCTCTGAAGACCTCA
-CAGACACATGCAGTGAAATGTAAATGGAGGGACCCACCCAAGTTCTTGAATAGCACATTA
-CATGCCTGGATGCACATCAGCGGGCATGTAAATGATGACGAGGAGGTCTGCAGACACTGA
-CACGCTGCATTTGCACTCACTCTGCTACTGAATTTTTTAGCagctacatttactgagcac
-ctactgtatgtaaggAAAGATAAAGCagccgggagctgtggctcacgcctgtaatctcag
-cgctttgggaggccaaggcaggtggatcacctgagctcaggagaccagcctggccaacat
-ggtaaaaccttgtctctactaaaaataatacaaaaattagctgagtgtggtggcatgcac
-ctgtaatcccagctactcaggaggctgaggcaggagaatcgcttgaacccaggaggtgga
-ggttgcagtgagccaagatcacgccattgcactccagcctgggtgacagaatgaaactct
-gtctcaaagaaaaaaaaaaaaaaaagtaaaaaagataaagctcagagaagtgaagtggct
-tgcccaaagtcaaatggctgagattcaaaccctggccctataatattaggcaacggtgtc
-tccctccaccactgtgcAGATGCATCCATGAGTGAAGAGATGTGCTATGGCTGGATTCCC
-TCATTGACATTCCCTGTGACCTTGGACATGGCATGGCCTTGTCTGGCCCACATTCTCATG
-TTGAGTCCATTCACAGGTGTGCTCCATGGATGTGCATGGATGGGACCGGCAACCCTGGCC
-TTGCTCTGAGTCTCAGCTTGGCTTGGTGTCACCAGGGCTGTGAGCTTCCAATCCCAGCCT
-TGCCATGTCCCAGAGCACATGGCTCAAAACCAAGCTCTGGGCATCAGGCCAGCAGGGCCC
-CTGTGATGGAAGAACTGACAGGATTTCATAAGCATCCGGCCCGGGACACGTGGTCAGGGC
-AGGGAGAAGGGAGATAAACAGGATGTCCACCAGGGTGTGCACCTGGGCAGGGTCCATGGA
-CCAGGTGTGGCAGGGGAAGAGCTGTCAGGACTTGGCATCTGATGGGCACTCAGCAGATAT
-AGGCTGTGTGAGGGGAGGAGTTTGTGGGGAGGCAGGGCTGCAGCTTTGCTTCCATCCTGG
-AGGCCAGGAATGAGGGAGTAAGTGAGCCATTGACTCaatgaatgaatgaatgagcgagtg
-agtgaaggaaggaaggggtaagtaaataagtgaagaatgGAATGGGGGAGGGAGTGAatt
-tatttatttatttatttatttattttgagacagggtcttgctctgttgcccaggctggag
-tgcagtctcagctcactgcaacctctacctctcaggctcaagggattctcccacctcagc
-ccccagcatagctgggactacaggcgcatgccgccacatcccgctaatttttgtattttc
-tgtagagatggggtttcgctatgtcggccaggctggtctcaaactcctgggctcaagcga
-tctgcctgcctcagcctctgcagtgctgagattacaggtgtgagccaccgtgcTGAGCTG
-TGAatttattttttacacaaatctgagtgctcactctgtgctggccctggacgggtctct
-gtggatgtctggtgagcaggatggacacagcccggtcattgcaacgctaaaagCTTGAAT
-GACACCAGTCAGGCTGGGGAACTGGGAGGGCCCTTGACATGCAGAGTGACTCAGCCAGTG
-TGAGCAGGGGTTGTCAGCATGCCTAGGGGAGCAAGAGACTGTGAGAGAtgtgtgtgtata
-cttgtgtgcctgtgtgtgtccgtgtgtacacatgtgtgcgCCGACACAGCCAGGTGTTGG
-CCAATGCAGGTGTGGTGTCCTCAAGAGCACAGTGCATCCTGATTCTTCACCCTCCCAGGC
-CTCCCCTGCCCCTGTTGTGTGCCAGCTGGGCCTGCCCCATGTTATGCCTGACGCCCACGC
-AAAAGCTGCTTCTTCCAGTCACAGGACAAAGGCATCCTCAGCCCAGACCCTGTACCCCAG
-GGGTAAAGACCTCTCAGACCCCTAGTGCTCCTCAGCATGGACCTCTCCACCAGGAGCCTC
-AGAGTTGTGAGAAGCACAGGCACCCAAAGCCCACCGCCCTGTGTCCATGTGCATGGAGTG
-TGCCCAGGTACACGCAAGGGCTGGAGATGCCCCAGGGCGGTCCAGACAGACGTGCAGATG
-ACACATTGGCCACTGAGTTTCCACAGACACTGAGCTAAGTGCTTTCGAGACACActgggt
-gaccttaggcgtatcaccctctctgagcctcagtttctaatctaaaagtagggtaattat
-actcacttccagtcttgttagaataactcaatgCATGATCAGCTCAACACATCATGATTA
-TTTTTCCTGAGTTCCTGCCTTCCCAGCTATATTGTCTATTCCTCAACAGTACCCACTGAG
-TCTTATATCCCCGTTTCTCCTATGATACTCCATTACACAGGACTCAAATAACTACCTGCT
-CTAAGAATTGCTGAGTGACATGTAGTCCTCATAAATAGCAATAATAGTCACTAACATTTA
-TATAACaacaagagccagcaattttgattttttattgtgtcaggcattgtgctgaacact
-ttacattccttcattcatttgacaaacattcactgaacacctggtaggtgctgggctctg
-tgctagacctgcagatgcagcatctctgccctcaaggttcttacattctgatggggaaga
-agagacagacaaaagacagtttggcggggcacagtggctcacgcctgtaatcccagcact
-ttggtaagccgaggcaggcagatcacttgaggtcaggagtttgagaccagcctggtcaac
-atggtgaaacccctgtctctactgaaaaaatacaaaaattagccaagtgtggaggtaggc
-atctgtaatcccagctactcgggaggctgaggcacaagaatgacttgaacctagaaggtg
-gaggttgtagtgagcagagatcgagccactgcactccagcctgggcgacagagcgagatt
-cagcctcaaaaaaaaaaaaaagataatttaatacataaatgggataatttcaaaccttga
-caagtgctacaaataaaataaggaagagttatggattagagacaaactgcagggattagg
-tggggcatgatgcttgatgagtgatcagggagggcctctctgaggagcaaatatttgatc
-tgagacctgaagaagaaggaagagcctggaaagatacaggaaaagttccaggcagatggc
-atagcaagggcaaaggccctggggcaggaagaacttggtaggttcgaggactaggagaaa
-gggaccatagctggagGATGATTCAGCAAACCTGGCAGGTCTGTCCTGGATGACTCAGCA
-AGCCTTGCAGGTCTGTTCTGGTTTCAGAACCCAGGCATTTTGTCCTTCACTCCAGGCTGC
-CTCAGAGACATGCATCCCTGCCATACACAACAATGTGTGCACGCTGGCACACATGCACAT
-GCATGCACACACACACTCTGCATGCTGACACACAACTAAGGGCCGGACCAGCCATGATAG
-TCTAAGACACTAACATTTTTCTCTAGTGTCTTGTGGGGCCAAGTAGAAGGGCCAGATGTC
-ACCTTTGCCCAGCCTTCCAGAAGTTCTGGGCCAAAGAAAGATTAAATGGCAGGAAGAGAA
-AAATGGCTTAATAAGGAGGTGACGGGGAACTCGGGTGGCCTGTGGGGGTGCGGAGATGGG
-GGGAGATGATAGAGATGTGAGAGCCCATGGGCACATCCCCTCTGGGGAAGTGAGGGAGCA
-CCGAGAACAGAGAAGCAGAGGGAGTGGAGACGGTTCTCAGAAGCACAGGGCCTCCACACT
-CACCACAGCCCCTACTCAGCCGACATGCCTTGCTTCCTCTCACCTCCCCTGGTTCACCTC
-AGAGATGGGACACTCATTGCCCACCAGGGCAGCCTGGGTGGTGCCAACTGTGAGAGAGCT
-CCCCTTCCACATCTGCCTTTGTGGCTGTAAAATGTGGAAAGaataagagaaatacctatg
-aaatctgcaggaagatactttcttttttttttttttttttttttgagatggagtttagtt
-cttgtcgcccaggctggagtgcagtggagcgatctcagctcactgcaacctccgcctccc
-aggttcaagcaattctcctgcctcagtctcccgagtagctgggattacaggtgctcgcca
-tcacacccagctaatttttttgtatttttagtagagatggggtttcgccatgttgggcaa
-gctggtctcgaactcctaacctcaggtgatccacccacctcagcctcccaaaggaggctg
-ggattacatttttctaaatcagttcggtaaaaatcaaaaattttgagaacacctggtgtt
-gtagttctgggaagcaggtactcacatgctttgctggcaggaggtagattgataacaatc
-tctatagaggaggagccagagatctctcttaaaagtgcaaatgcacaaacttttgactta
-gaaattctgcttctgggCAGGGCGCGGTGGCTCACGCCTGTGATCCCTGCCTCCCaggcc
-aaggttgcagtgagctgagatcgcaccattgcactccagcctgggcaacaagagcgaaac
-tctgtctcaaaaaagaaagaaagaaagaaagaaaaattctacttctaggaaattagctca
-gaacttctctccacacccccatgtatgaacactgcagcattttttgttatagcaaaagac
-tggaaataattaactgttcattgacaagggatggtttaaataaaccagtacattcctaac
-catggaataggaccaagctgtaaaaactgaccaggcaggtctttctggactgacacggaa
-gagtccccaagataaattgttaaataggaaggaaaaaggcaatctgaaggacatggagtg
-tgctcccatctgtgtaaaaaagtgacaaTAAATCCTCATATTTTATGTCTTGAAGGAAAC
-ACGAGAAAATGGCTTGACCCCAGGAAGATGAACTAGGAGCTGGGGATAGGAGTGGGAGGG
-AGACTTCTCAAGTATTACTCTTCTGTGCCTTTGAATTTTGAGCTAAAATATTTAaataaa
-atattaatataattaatataatacaattaataattaatattgaataaaataaaatatCTA
-AAAATCTGCTCCccgggtgcggtggcccacgcctataatcccagcactttgggaggccaa
-ggctggtggatcacctgaggtcgagagttagagaccagcctgaccaacatggagaaaccc
-cggctctactaaaaatacaaaataattagccgggagaggtggcgcatgcttgtaatccca
-gctactcagcaggctgaggcagaagaatcgcttgaacccggaagacggaggttgcagtga
-gccaagatcgcaccattgcactccagcctgggcaacagaagcaaaactccgtctccaaaa
-acaaacaaaaaaacaaaacaaacaaacaaacaaaacCACAACTGTCTGCTCAAAAGTGCC
-ATCCTCCTACACACTCCTTGCCCTCAGCTAAGTTCTGTCCCCATGGAACTCTCCCTGGAA
-GAGACAATCTGTCTCCCAAGAGAgcaggcctatgtgtgagtcctggttccatcactgacc
-ctaagtgtgacctcaggcaagacactCCCACCCCTGACTTGTACTAGACAGTTCTCCCCA
-GCACTGACATTCTGTCTCTCCTGCTGGAGGGGCAGGAGGGCAGGCACAGTGTCTTCTTGC
-TCTGTGATTCATTCAGTTCACTTAAACTGAGTTACCTACTCCAGGCCAGAGTTTGGGTTC
-ATCCATTTCTTGCCCTCCATGCCCACCCCAGGGTCTGGCATGGGAGTTGGTACCCTATAG
-GAGTTCTGAACAGACTCAGCTTACGGATGAGGAACAGACGGTGGGTCAGATGCGCGGTAA
-GGAGGGTCAGGTACACGGCCCATGGGATCGAATAGATTCATGGGTGGGtctttaagacaa
-ccgccttcactcaatcctaagccctccccacagctaccaccctattttttctcccctttg
-cagaaaagggctttgagaaaattgtctatcctcgctgtttttaattagtcttctctctct
-ctctccctctgagacaggatctgctctctcacccaagctggagtgcagtggcgtgatcat
-ggctcactgcagcctcaacctcctgggctcaaacgatcttcccacctcagcctcctgagt
-agctgggactacaggtgtgcactaccatgcctggctaatttttgtattttttgtagagac
-tgggttttgccatgttgcccaggctggttttgaactcccaggctcaagtgatccatccac
-ctcagcctcccaaagtgctgggactgcaggtgtgagccaccacacctggccctcttgtct
-cttaagtccatttaatcatgcttctacctgtcacttccctagttgaaactgctcttgtca
-atttcaacacattgctaaatccaatgtgttcagttctcattcttcatctttttttttttt
-tttttttgagacagagtcttgctctgtcacccaggctggaatacagtggcacgatcttgg
-cccactgcaacctctgcctcctgggttcaagcgattctcctgcctcagcctcccgagtag
-ttgggactacaggcacaagccaccaaacccagctaatttttgtatttttagttgagacgg
-catttcaccatgttggccaggatggtctcaatctcttgacctcgtgatccgcccaccttg
-gcctccaaaagtgctgggattacaggtgtgagccaccgcacccggcccattcttcatctt
-cttaactgatcaacagtttgacacagctgaccactccctgctctttgatgtacttctttt
-cacttggtggccaggcctccactctctgctggttttcctccttctcaggctccctgcttc
-tcccattcctgttggagcagtgaggacttggtccctggagctctcatccagtctcacgtc
-tatgactcccaacactgtatcctcagcccagacctctcccctgaactccagcccatacat
-tcaaatacctacctgatgtctctttgaggatgtcaaaagacatgacagactccacagaac
-caaagctgaacctgggcttcccccaaacacctcgctccatgtcatttgatggcagttcca
-tacctgtcaccgttcaggccaagaaaccttggaagcaccttgacacctccttttccctca
-aactccacatctagaccatcagcaatcctgttggctccacctttaaaatatacccagaat
-ccagtcacagctcacctctagcatggccactgccctgctctgagccactggagtttaaga
-gaattattgcaacacctgctcccttgtcttcctgtccttgcctcattcagtctattccaa
-gtacagatccctaaatgattttattttaaaagtaagtcaaggctgggcatggtagctcat
-gcctgtaatcctagcgcttgaggaggccgaggaaggaggatcacttgggtgtaggagttt
-gagacccacctgggcaatgtggcaaaaccctgtctgtacttaaaaaaaagaaaaaaaATg
-gctgggcatggtggctcaccctgtaatcttagcactttgggaggctgaggcgggtgaatc
-acctgaggtcaggagttcgagaccagcctggccaacatgatgaaaccccatctctactaa
-aaatacaaaaattagccgggcaaggtgatgcacgcctgtagtcccagctactcaggaggc
-taaggaagaagaatcactggaacccaggaggtggaggttgcagtgagccaagatcgcgcc
-actgcactccagcctgcatgacaggagcgagactccatctcaaaaaaaaaaaaaaaaaaa
-aaaaggtaagtgagatcacttccctcctctccttaaaccctcccctgcctccccatgact
-cctcagcgtcctttcaaaggcctccaaagctccagattatctgaaccccctttacctctc
-tgacctcatctcccaccgcctccctgtcactggctgcactccagccacattgaccttctc
-cgatggcacaccagtcagctagtcagcttccttttggagcttttgcatgagctgttcctc
-ttcctgaagaatttgcccttcggatagtctcagggcatccactgaacactccactcaata
-cagccactgcctgcccacccaacactcctcatctctgtacttactctttttttcccttgc
-attcgtcaccccctaacatgtgctacaatgtacttattatggtaattatttcttgcatgt
-ttctttctttttttttttgagacagggtctcactctgttgcccagtctggagtgcagcag
-catgatctcagctcactgaaatcttggcctacctggctcaggccatcctccctcctctgc
-ctcctgagtagctgggactacaggcactcaccaccatgcctggctagttgttgtactttt
-ttgtagagatgaggtttcaccatgttgcctaagctagtctaaaactcctaggctcaagtg
-atcctcccgcctcagcctcccgaagtactgggattgcgggtgtgagccgctgtgcctggc
-tgcacttttccttctaatggaatgtaagcgccacttttgtctgttattttcactgtagta
-tccctagcctttggaatgttgcctggcaagtagtaggtactcagtaaatatttgttgaag
-aaacggatGATTCTATAAATAGCATGGATTGATATGGGAAAGCTATGTAGGTGGATGGAT
-GGATGCTTGTCGGATGGAGGGTAGATGAAAGAACAGCGAGAAATTCGAATGGCTAGATGG
-TGGGGATGCATTATAAAATAATAATTCATAGATGGAAAAGGAATGAATAGATGGGTGGAG
-GGATttaatctcttcaactactatttactgaccacttgccgtgtgccaggcactgtatga
-ggtgctagagacactggtgagccacacaggcaaggtgcctgtcctaagggagcctgtagt
-tcagtgggtgaggcagacactaaacaaataacaaatacatacataattccaattatagtt
-aagtgttctggtggaaaagaaCAGGATGCTCTGGGAGAGAATAATATGGATAAGTGATGG
-AAAAATGGACAATAAATGGGTAGATGGAGATGGATAGGATCGGGGTTATTTGCCTTAAAG
-GGCCTGGCTTCAGGACTGGAGCTGCTTTACCTTAAAGGGCCTGTCGGACCACATGTACCA
-TCCCACATCCCAGACCAGCTCTGCACTCAGAGACTGTCCCTCTCTCCCTGCCCTGACTCA
-GCACCTGCCTGGCCTATCCCCAGTGGTCCTGCCTGACTCTACCTCCAGCTCCCACCCTGC
-TGAGTCACAGTCAGGCTGGTCAGGGGGCTGTCCCATGTTCAGTCCAGCCCCTCAGCCTTC
-CTCGACCTGGGGGGGTATGGGGAGCAGCCCAGAGGGGAGGGGAGCAGGTGCCAAGCTCTT
-GATTCCTGTGCCTGAGCACTGCCCTGTTGAGACCAGAGAGAGAATCTATGGCTAGGGTAT
-CTGGGGCTACAGTTGGGGTTTATCTGGGGCCTGGGGTCACACATGATGGATTAGAGCTAA
-ATCTATCTCCAGGGTTATAACTCAATCAGGAGCTAGAATTCAAATTCAGTTTATGGATCA
-TGTGGGGAAAAAGTGACCAAGACACCGTTCAGTTTGGGACCTGTGTCGGCGTTAGCTGTG
-GCTACGGCCCAGGGCTTAGTGATCACAGGTCAGACCATGTTCAAGGTTTCAGGCCAGAGT
-GCAGTTGAAGTGCAAAGTCAGGCAATAGGGTTCACCCTAGGACCACAGTCAAGGATCTGG
-GTCAGTTAGTGTCCAGGGCACTGGCCTTGTCTCCTCTTCTTTGGGAGAGAAGCCAGGTGG
-ATGAGTTGGATCTAAATGTCCTGAGGAGCAACTTCCAGCTCAAGTTCCTTCACCCAGGCG
-GCCTAAGCCCTCTCAGCACTGGCCCCAAAGCCTTCCTTCATCCCTCAACTTCCTCCATCA
-CTCCCTGACAGCCTGGCCTTGCTCAGTGTCCCTCGCAAGGCTGAACAGTCCTCATTCTGG
-CACCTCAGGGGACAGGGTAGGGGTGGGGACTATGGGACAGGGCTCAGTGCTGGACCCAGG
-AGGGCGCCTTGCGCAAGGTTTTCTGATGCAACTGGCTGAGTGCTTCAGCATTCCACCCCC
-ACCCCCCAAGCTTTTCTCAGAAAGGCAAGGCCTGGGCAGTTATCCAGACTGAACATATAA
-TCCCCTTCCTTCTCTGGCCTTTGATGGCTTCAGGACCTGCAGGCAAaaggaaggcaggaa
-ggcaggcaggaaggaaggaaggTCAGGTGACTCAGCAATGCGTCCAGCACTGGGAGCTGG
-CAGATCTGGGGCTCCCTCATCCTCCAGCTGAGAGGCGAGAAAGAGAATCAGGATCCCTGG
-AAGTTTGGAGATCCTAACCCCTTATACATACAAAGCAGCAATTATGTGCCTAAGCCCAGG
-GAGAGACCTGTAGCTGCCCAAGGTCAGAGGCAAGGTCAGAACCAGACCAGCTGTCTTCAG
-CCCATGGCTATGATCTAGCTATTTCCACTACACAGAAAGAGAGAACCCTTCACCCTTGAG
-GAGGACACGGGACTTCCCCAGGAACCTCCCGTCAATCCTGTTGAGGCTCCTGAAATGgtg
-gaatgacgtggactttggaaccacgcagacctgggtttaaatcccaggccaggcacggtg
-gctcatgactgtaatcccaacactttgggaggctgaggcaggcagatcacttgtggtcag
-gagtttgagaccagcctggccaacatggtaaaaccccatctctactaaaaatacaaaaac
-tagccaggcgtggtggcacacgcctgtaatcccagctactcaggaggcagaagcgtgaga
-atcgcttgaacccgggaggcggaggttgcagtgggctgagatcatgccaccgcactccta
-ggtgagagtgagactccgtctcaaaaagccacactggctagctgtgtaacgctgggcagg
-ttactttcactctttgacactggatttgctcacttgcaaagtgggcgtaaatgcatcctt
-agctcacagggctgtggtgaggctgacatgaggaagcactggaaggcacagcttagGCTC
-CACATGGGCCACTCTCAGGAAGTGTGTCCCCACCTCCCCCTTTATCCTCAGCTCTCACTG
-GGTGTGTTTGCTGGGGAAGGAGGTGCAGCAGCCCTGGGGCCTTGGAaataataatagcca
-ctcaccctccagtgcttaccatgtgctgggaactctcctaagcgtgaacttaacctgtat
-tagcccatttaaccctcCATTTAATCCAATAACAGTTCCCAGgccaggcatggtggtgca
-tgcccatagtcccagctactcaggaagctgaggcgggagtatcgcttgagcctgggaggt
-tgaggctacagtgagtcatgatcaccctactgcactgcagcctgggcaacagagtgagat
-cttctctcaaaagaaaagaaaagaaaagaGggaaggaaggaaggaagggagggaggGAAA
-TCCCAATGACAATAAGCAGTTcaataaccctacaggaaaacactgtcatcaatcccactt
-tatagatagggctgtgggtctgagtagctaagtgactttgtccaagacagtggacaagag
-accacacggattttgagccaggccagctggctctgaatcccactgtctcctccctcctta
-aactagtgatgtcactgctctgagccctggtttcctcatctgtctccagggataaaaata
-gcagcttcatggggaagtttgaggatgacacaagatgacgtaagggaggtccccacacag
-ggctccacccacagGCATGAGAAGAGCCTTTCTCAGGAAGAATCCCAGGCCGCCCCTGGG
-GCAACCGCCGGGCTGGCCTTCCTGCCTCTCCTTAGGCCCAGCCTAGCGTGATCTGGATGG
-TGAGAGATTTCTGCAAAGCCCCCAGGGGCCTCCAGAGAAGGGAGGTGCCCGGTCTCCTAG
-ATAAGGGCTCCCAGAGAGGATCACAGCCCTGGAGTTGCCATTCTTGAATCACCCACTGTC
-TTCCCCAAGTTGATTGGTCTGAATCCATGTACTTATTTTTTAtattagttccataatgtc
-ttccttccaaccagctcatcttttacttatttatttatttatttattttatttatttttt
-tatacagagtcttgctctgtcacccaggctgaagtgcagtggtatgatctcggctcacgg
-caatctctgcctcctgggttcaagcgactctcatgcctcagcctcccaagtagctgggac
-tacaggtgcatgccaccacgtccagctaatttttgtatttttagcggagataggtttttg
-ccatgttggccaggctggtctcaaactcctgacctcaggtgatccactcacctctgcctc
-ccaaagtgctgggattacaagcatggaccactgtgcttgaccacaaccacctcattttaa
-aaaacttatctaaatttatttaacatggaaattttaaatcactgacctcaaatagaaaac
-tactatgatttgccataaagaagaggtaagcatacaattacatacaaaaaaagcagaacc
-aggttattccattccagctaaatcctgtttcttgctgaaggctccaagctgaactctgct
-gtctcattcttaacaagagaggtgttaaaaacatagaagctgtgaggccgggcacggtgg
-ctcatgcctgtaatcccagcactttgggaggccgagcgagtggatcacgaggtcaggaga
-tcgagaccatcctggctagcacggtgaaaccccgtctctactaaaaacaataacaacaac
-aacaacaatcagccgggcgtggtggcgggcgcctgtagtcccagctgcttgggaggctga
-ggcaggagaatcgcttgaacccgggaggcagagattgcagtgagctgagatcataccact
-gcatttcagcctgggtgacagagcaagagcaagactccgtctcaaaaacaaacaaaacaa
-caacaacaaaaaaaaaaaccatacaagctgttggccgggcgcggtggctcacacctgtaa
-tcccagcactctgggaggccaaggtgggtggatcacgtggtcaggagatcaagaccatcc
-tggccaacatggtgaaaccctgtctctagcaaaaatacaaaaattagctgggtgtggtgg
-cacacgcccatattcccagctactggggaggctgaggcaggaggatggcgtgaacccggg
-aggcggagcttgcagtgagctgagatcacgccagtgcactctagcctgggtgacagagcg
-agactccgtctcaaagaaaaagaaaaaaaaaaaaagaagctgttaaatgagactttctcc
-ctgagtctttggagaaacagcaagaaaactgaaagggtttaagtgtatcacaattatgat
-tcaaagttatgtcatacggtatctggagaccctaaaaccctctggcactcagccattgtt
-gtacatggtatatttcagaaaacactgACCTCACTGacctactccaactttctcttctta
-ttttacagataagaaatttgaagcccccgcaaagggaggtgacttgtccacaatctcaca
-ggctcagtggcttcagccagacttggaacgcaACCAGAAGTTCTAAGGCATCATGTCACT
-TTTGTGGGGGAAATGTATGAAGATGAAAAGTTTCAAGGACACCTATGGTGGAATTTTAGG
-CATATGGCAATCACTAGGGACACCCATGTGGAAGGAAAGGAGGCAGGCATGGCTCATGTC
-ATTGCTGTGGGCCCCACATCAGTGCTGGGGGTCAGAGACGGAACTCATCAGAACTATAGC
-AAAGAggccgggcacagtggctcacgcctataatcccagcagtttaggaggccaaggtgg
-gcggatcatttaaggtcaggagttcgagaccagcgtggccaacttggtgaaaccccgtct
-ctactaaaaatacaaaaacattagccaggtgtggtagtccacacctgtaatgccagctac
-tcagggagctgaggcaggagaattgcttgaacccgggaggcagaggttgcagtgagccaa
-gatcacatgccacttccctccagcctgggcagcagagcgagacactgcctcaaaaaaaca
-aacaaacaaacaaaaaaCCAAACCTATAGGAAAGAGAAAAGCAGCCTTCTGGGCTCAGAA
-ATCTGAGTAGAAAGATGTTCTGAGCCTGGAGAAAGAAATTCATAAAAGCCTGACTCTCTC
-TCCAGAAAAGAGTACATTTCTGCATTTAATTTTGGGAGGTTGGTCACCATTCTTTTCCTC
-GCTTCTAAATAAATGCTTATATAGCATTTAtattccagtcactttacaaatattgtcatt
-taattctcatgcaaaccaacgaggtaggaactattgttatccccattttacagatgggga
-aactgaagtacaaagagctgaagtaacttttccaaaatAGATGTGGTTTTGAACCCAAGA
-AATGTGATACAACTATGACATGAGGCAGTCCCAATGcattgaatccttatgactgcaatg
-caagggaggtataattaactgcattttatagatgcagaaactgaggcttgaggctatttg
-gtgtttctggtgtagatctaggagccaaactccagcctacctagactctttgcctctgct
-gtacccctggaccatgTGTTAGGAATTCTTGGTACAGGGTGGTAGTGCTCAATATGGTAG
-TGgttttagtctgttttctgttgcttataacagaatgtctgaaactgaacaattttgaaa
-gaaaaggaatttattccttacagctatggaggataggaagtccaagattgagggggcact
-tctggtgagggccttattcctggtctctgaagtgtctggaggtggcacagggtatagcgt
-ggagaggggactgggcatgctgacatgctatgctttggtctctcttcctcttcttataaa
-gccaccagttctcctcctgtgaaaacccacaaatccattaatccatgagtgggttagtcc
-attcataagggcagaggcttcatgatccaatcacttcttaaaagtcccaaccgctcagta
-ctgccacattgggggattaagtttccagcacatgacatttgggggacacatttaaaccat
-agcagtagccatttgccacatgtggttattgagcacttcaagtatggctaatgtggctag
-tgtgactgagaattttttattttattgaatattttaatttttttttttttttttgagatg
-gagtctcactctgtcgcccaggtcagagtgcagtgtcatgatctcggctcactgcaacct
-ccgcctcccggggtcaagtgattctcctgcctcaacatcccgagtagctgggattacagg
-tgtgtgccaccatgcccggcaaatttttgtatttttagtagagacagggtttcactgtgt
-tagccaggacgatcttgatcttctgacctcatgatccacccacctccgcctcccaaagtg
-ctgggattacaggcatgagccactgcgcccagcctcacattatatttctattggaacaca
-gaaTGGTCTAGAGAATTGGGATTTGACAAACCCAGCTGTGACAAGTCACCAAAATTTGGG
-GGCCATACCCAGGGTGCCGTTCCTGTCACGATACCCATAGGTCCATGTGGAGGCTGCAGG
-GATACAAAGCTCGTGAAATATCCCAGGATGgcatgggcactggagtcagctgccccaagt
-tcaaatctgaaatcagtctttttgttttttttttttttttgagatgcagtttcactcttg
-ttgcccaagctggaatgcagtggcgcaattggctcactgcaacctccgcctcctgggttc
-aagcgattctcctgtctcagcctcccgagtagctgggattacaggtacatgccatcacgc
-ccggctaaatttttgtattcttagcagaaaccgggtttcaccaccttagccaggctggtc
-tccatctcctgacttcaggtgatccgcctgcctcagcctcccaaagtgttgggattacag
-gcgtgagccaccgcgcccagcctgaaatcagtcttatacgaccagctgggtggtcttggg
-taggtcccttaccttaactcttcttgtctgcagaatggaggtgacttactgtttttctct
-gtctccctttcacatctttgcactcttcaccccttctcttccctcagcttttagtttaaa
-catcacctttctgataagccctgctgaaaatggccaccctcagtcatgacggagaacaag
-tctttcctattttattcaagaaaatgcatgatgcaatctattttaaatgatcatggtttt
-aattttattttcctgataatggtctatctctccactgatttataagatttgtaagagcag
-gggtggatcattctggtcactgctgagtccccagcatttagaacaggggctgacacaGCA
-CAAAACAACGTTAGTTGGGAATGTACAAGCAAACCCAGCACACCTTCAGAGGGGTGCTCA
-GGAAACAGCCCTCCCAcctttcttcacccctcacagctgtgggatcttcctaaccatttc
-ggtgtcccaggatagaggatgagtttattcacccctccccagcaggggagttgccaggat
-taaatgagatCCCAGAATGCCCTGGTATACCCTGAAGGCTCTGGGACACAGGTGAGCTGG
-TCCCCAGGGATTTGGAAACAGGAAAACAAATATGACTCCACCCTGCCTCCCATCCAGCCT
-CTGCCTAGAGGAGTTATtttattttattttactttttttttttttttgagacggagtctt
-gctctgtcgcccaggctggagtgcaatggcgcaatctcagctcattgcaactcctgcctc
-ctgggttcaagcgattctcctgcctcagcctcccgagtagctgggactacaggtgtgttt
-tttgtatttttagtaattttttgtacttttagtagaaacgggtttcaccgtgttagccag
-gatggtcttgatctcccgacctcgtgatccacctgcctcagcctcccaaagtgctgggat
-tacaggcataagccaccacgcccagccTCTAGAGGAGttattttacttacttacttattt
-atttattacacaggatctcactctgtcacccaacctggagtgcagtggcacaatcacgtt
-tcactgtaacctgaactcctgggctcaagtgatcctcctacctcagcttcctaagtagct
-gggaccacaagctcgtaccaccatgcccgctatctttttctctttgtaaagacagggtct
-tactatgtcatccaggctgttctcaaactcctggcctcaagcaatcctcccgtcttggcc
-tcccaaagtgctaggattacagacatgagccagctcacccagctGAGGAGTTATTTTTTG
-ACACTGGTGAATTCAGATCAAAAGGGATTTCTAAGAAAGGTGCTGGACCCAggccgggcg
-cggtggctcatgcctgtaatctcagcactttgggaggccgaggcaggtggattatctgag
-gtcaggagttcgagaccagcctgaccaacatggagaaaccctgtctctactaaaaataca
-aaattagccaggcatagtagcgcatgcctgtaatcccagctacttgggaggctgaggcag
-gagaatcgcttgaacccgggaggtggaggttgcagtgagccgagatcgtgccatcgcact
-caatcctgggcaacgagtgaaactctgcctcaaaaaaagaaaaaaaaagaaaGGTGCTGG
-ACGCCTAGGACGCAGAGGGGTGTTTCACCCCAAATCAAGTAGCACCAAGCCCTCCCAGGC
-CTTGGGTGCAAGCATATTAAAGGCCTCTTTCCCTCTCTGTCTCCATTGTTTACACTCCac
-tgagcatccgcaatgtgccacacactgttctaagcgtcttacacatattaaattatttaa
-tcctcacaacaactttatgaagtgagcgcaattatgagcccattttatggagcaggaagt
-tgaggcagggttttaggtagcttttctggggtagcactgtgggttggagcggaggtggag
-tgcactcttaggccagctggctctaggggctcttcaccactaggccgcactgCCTCTAGC
-AAAGGGACGCGGGGAAGCTCAGCAGACCTTAGGCCTCCCAAGGGCGCCACGGTGGTTCCT
-TTGAGCCCAGAGTCAGCTCTTAAGTCCATAGGCCTTCCTGAAGCTTCTGAACCACTTGCC
-CATAGCTGGGCCTCAGGCTGGCTCTCAGTAGAATGTGGAGAATGGAGATTCCCGCATGTC
-CACTTCTCCTAAAGGTTTTATAAGGCAGTGCTGGGAATGTGCTTTATAAAAAAGGGGAAG
-CACCCCGACAACAGTCACTGTTTGctcttttaagcaccatcctgagaaggaggaatgttc
-ttcccatttcataggtggggaaaccgaggctcagaagagcaaatttttggccgggcgcgg
-tggctcacgcctgtaatcccagcactttgggaggccgaggcgggtggatcacgaggtcag
-gagatcgagaccatcctggctaacaaggtgaaaccccgtctctactaaaaatacaaaaaa
-ttagccgggcgtggtgcgggcgcctgtagtcccagctactcgggaggctgaggcaggaga
-atggcgtgaacccgggaggcggagcttgcagtgagccgagatcgcgccaccgccctccag
-cctgggcgacagagcaagactctgtctcaaaaaaaaaaaaaaaaagagcaaatttttttt
-ccaaggtgatagggagagtccgtggctgaTGTCTGCACTGACCAGACGCCCCTAGGGGGC
-CAGCGAGGGCGGGTCCCAGGTGCAGCGGATGCAGAGGAGAGAggcccgggcgcggcgcgg
-gggATGGTGCGATCCCGGGCCCGAGGGCATCAGACGGCGGCTGATTAGCTCCGGTTTGCA
-TCACCCGGACCGGGGGATTAGCTCCGGTTTGCATCACCCGGACCGGGGGATTAGCTCCGG
-TTTGCATCACCCGGACCGGGGGCCGGGCGCGCACGAGACTCGCAGCGGAAGTGGAGGCGG
-CTCCGCGCGCGTCCGCTGCTAGGACCCGGGCAGGGCTGGAGCTGGGCTGGGATCCCGAGC
-TCGGCAGCAGCGCAGCGGGCCGGCCCACCTGCTGGTGCCCTGGAGGCTCTGAgccccggc
-ggcgcccgggcccACGCGGAACGACGGGGCGAGGTACTCGGCGGGGTGCGGCCTGCGGAC
-TcgcccggaggccggggggcgggagggggcggccggggAAGGGGGCGCCGGAAGCCTCTG
-GGCGTCTGCGTGTTGCCGCGTGTTACACGCACGCACGCCCCTTACACACCTTTTCACAGA
-CCCCGCCGTCGGGGCGCGGCCAGGTCAGATCCCTTTTGATCCGGGCCTGGGCTGAGTGCT
-CCCCCCGGGCTTCAGGTGACGCGGCCCCGCGGAGCGTGGGGTCGCCCGAGTTGGGCTGGG
-GAAGCCAGGGACGGAGGTGTCCGGCCGTCACCCCTAGAGGAGGGCGTGCGGGGGTCTGTT
-TTGCGTGAGTGCGGGATAGGGGAGTCGTGTGGTGCGGTGAGGGGCTTGTGGGGGGCACTG
-GAGGACTCTGGGGGTGGCGGGGGATCCGAGGGGGTCCTCGTGAACCCGCAGGGGAGAGTC
-CTGGGTGAGGGTGGGTCCCGAGCACCTGTGTCTCAGGAGATGGTGAGAGCTGTCTGGAGG
-GCTGGGCACTTGGTGGCAGGGGTTGGCGGTGCAGGGGACACCGCCGGGACAGGGCTGGGG
-TGCCCTGGAGCGGGGGAGCCGAGGGAGTGGGAGCGGGGGCGCAGCGCGCGATCTCTGGCC
-CGGCAGGGCCGCTGGTTCTCCCCAGTGCGCGGCTCCGGGTTTGCAGGTGGACGGTGCGCG
-CGTGTCTGCGGTGTGTGCTGTGCCTGCAGACCGGGGAGGGCGGGGGACGACAGCCACCTC
-CTTCCCTCTGCCTCACCCCCCTCCTGTCCCAGGGCCGCGCTTCAATTTCCGCTGAAACTT
-CTGACTCGGACACCCGCCGCCTTTCGCTTGGGCTCCCACGGGAGGGGCCTGGCTGCGGGG
-GGCGGGGCGGGGTGGGGGTGCGGCCTTGCTCGGGTAGACCATGGGTGTGACAGCTGGGAG
-GGCtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgtgCGCGCGCGCGCTTGCGCTTGATGTA
-ACCCGCCCTCATTTCCCTGGGTCCCGAGTGTGGCAGGGAACAGCAAGAGGTAGATATTAG
-GGGCTGCTTTCATTCCACATCACAGATTCTATTCTGCAGTGTGGTCTGCAAAATGCCTTG
-CCCAAGATGTATAGACTCAGTTACCGCATCTGTCCCCATCTGGGTGGAGCTTATCCCAGG
-CCCCAACAGGCTCTGAGGGATGGCCGGGGCCAAGGCAGCCTGGACTACTGATGTGGCACA
-GGCCAGAGGGACTCCAGGCAGTCTCCTGCTGCACAGGGCACAAAGCATGTGCACAGCCAG
-GTATCATCCTGCGTGACTCAGAACAGCCTTGAGATGTAAGGAGTGTCATCCCAGCCTCGA
-ACCTGGGGAGCTTTCTAAGACTCCCAAGGATGGTACTTATGCATCTTGCTGTGAAGAATA
-ACAGGATGAGTGCtaataatgaccatttcctgacacctacctggcaacaggtccataagc
-tctacatgcttcatttgtgttttcatttcatcatcacgaaaaacctgtaagctttgcatc
-ctgttcccactttacaggaactgaggctcagaaagcttgaggaacttgaccaggggtacc
-ccccagctagaaagggtttgagacaggattagaacccaggaatatctgactacagccact
-ccttactgcaTTCTTACCAAGCCAAAGTCATGACCTTTCACTCATGTGGGGAGGCCTTCC
-CTTCCAAGGCAGCTCTTCCATTTGGGAGCAGCGTACTTGGAGAGGTGGGCCTCTGTCTGG
-TAACTGACTCATGTTGCCTTGTTAATCCTGCCTTGAACTGTTGGGAAGGTCTTTAACCAG
-GCTGAGGTCTCTCGCACCAATGCCCATACCTGGGCATGCACCTCCTTGGAATGGAGTTTA
-AGTGGGTGGGCAGATGGGTTCTAGAGAGAACCCGTCTGCCCTGACCATGCCCTACTGCCC
-TCTCCTTCAGCCACCACACACACAGTCACACAGCTGCGTGAATGGTGgctttcctttcac
-ttaacagttcactctggagatccttccaattaccctataaagagcatcctcaacctttta
-aatggctgcacattgttccgttgtgtggatgaagtataatttatgtaaccagccctgtaa
-ttatagacagccaattatttctgtcaaaagggctgcaggaataactgtgtatttgcatgc
-ttacacacacacacctctacagaataaattcttagcaatgggattaattgctgaatcaaa
-gctcacacgcttttcatcgttgtttttgttttgttttgttttgctttgttttgagacagt
-ctcactttgttgcacaggctagagttcctgaccatggctcactgaagcctttaccttctg
-ggctcaagtgattcccctacttcaacctcctgcatggctgggactacagctgtgtgccat
-catgaccagataattttttttttcttagggacagggtctcgctacgttgcctaggctggt
-cttgaactcctgggctcaagtgatcttcctgcttcagcctcccaaagtactgggattaca
-ggcatgaagcactgcacccagcctgtttttcattttgatattgtcaaaatgcactcctca
-gaggtggtaccttttatcctcccactagcactgtCTTCATTGTTAGTGGCTGCACTGCCA
-CTATTCCACAGTATAAACCCACTTTTCATGACACTGCCAAGACATAAGGGTCTGAAATAC
-TTAACAGTTTTCTTCCACAGTCCCCAAAATACAGGCTtctcccccagctcaggacatgaa
-gccatcatccctcctcattgcaggagccaaaggctggacctcacctcgattccaccctct
-ccttcacccctcacatccaatccatccagtccatccagtctgccactgagtcctcttgat
-cttcctcctatgagcccttaacttcgcgtctccatctagcaccccctagtccaggtcacc
-ttctcctgcctggactcgtgcttgtgtgggcctcctagctagtctcactgccccgtcttg
-tactttcaaatccaccctaaaagcatgatgttcccctgctgaaatccttcagtggctccc
-cactgcctttggataattccaaatcctattgtgtgttaattaggattaggctcagctgta
-atatagaaacagccacttaatagctaaaatgaaatagacgtttttttcttctttttctct
-ttttttgagacagagtcttgctctgtccccaggctggagtgcagtggcgagatctcagct
-cactacaacctctgcctcccaggctcaagtgattctcctgcctcagcctcccgagtagct
-gggactacaggcatgcaccaccatgcccacctaatttttgtatgtttagtagagatgggg
-tttcaccatgttggccaagatggtctcgatctcctgaccttgtgatctgcctgcctcggc
-ctcccaaagtgctgggattacaggcatgagccactgcgcccagccttcaatagatgttta
-tttctctcctgtgtaaaaaacctggaggtctggcctgacaactccatgtgtcagggacct
-aggctcctctcttgctctactgtatgtggtacttctgaagccaaggtagatgctggagct
-ccagcagttaggtccacattccagcatacaggaaaggaggaaatgaggaagttgggccct
-ccctttaagaacactgtcctgggcattgtacacaacacttccacttgtgtcctactagcc
-atatgctgatacaaggatacaagggagacaggaaatgcagtttattctaggtgtccttgt
-gctcagctgaaaatctcaggttctaatcctatgtaaggaggggagacctgaaactgggga
-ccactaaccacctctgccatatgatgctcgtagagcccttcacaatagggcctctactaa
-cctcaccttatttttatttatttatttatttttgagacggagtttcactcttgtcgccca
-ggccggagtgcaatgacactatctcagctcaccgcaacctttgcctcctgggttcaagca
-actctcctgcctcagactcctgagtagctgggattacaggcgtgtgccaccacgcccggc
-taatttttgtagttttagtagagacggggtttcaccatgttggtcaggctggtctcaaac
-tcctgacctcaggtgacctgcctgcctcggcctcccaaagtgctgggattacaggtgtga
-gccaccacgcccggcctattttttttttttttttaacttttcacttttttttgcagtcac
-gctcattctccaccgtgttcttggggaacatgcagcatgttcttttgcctcTTCCCTCAC
-CCCAGAACAGGggttactggacagcggcatcaacttcacctgggaactggatagaaatgc
-agattcagaccttctgaatgagctactttgggagtagggcccagcaatgtatgttgaaac
-aggcctccagatgatctcaatgcttgctcaagtttgagaaccactgAACCGCAGTATGAC
-TCTCCGTGTCAcctggctaactctgcctcactttcaggtctcagtgtagacaccacctct
-tctaggaagacctctcttgacccaccagcccaggagagaggcctctctgggttcctagag
-gcccatgcttctctgTATAGTAGGGCTGATCACACTGTATGTGAtttttttttttttttt
-tgagagagtctttactctgtcaccaggctggagtgcagtggcacaaacatggctcactga
-agcctcaacctcccaggctcaagcaatcttcccacctcagcctcccaagtagctgggact
-acaggcatccaccaccacacccagctaattaaaaaaaaatttttttttgtagagacaggg
-tctcactatgttgcccaagctggtcttgaacttttgggttcaagcagtcttcccaccatg
-gccttccaaagtgctaggattacaggtgtgggccactgcacctagccTTGGACGTGATTT
-TATTACTCATCTGCCCTCCAAATTGACTGGAAGATCCTGACGGCAAGACTGCTGTCTAAC
-CTACTTCTCTTCCTAGCACCCAGTGTTAAGTGAATGAACAAGATCATATCTCTCATCTGT
-GAATGTACGAGAGCCATGGATTATGAGATTAGTTGATTTTCTTAACTATAATTTTTAGAA
-ACAAGCTGTGTTTTTAAGCAGGTATTTATTTCCTTAAATGTACATTTCTGATTACAAAAT
-ACttttttttgagacagagtcttgctctgtcacccaggctggagtgtagtggcacaatct
-cggctcattacaacctctgcctcctgggttcaagcgattctcctgcctcagccttcccag
-tagctgggattacaggtatgcaccaccacgcccggctaattttttttttctcccgtgacg
-gagtcttgttctgttggccaggctgaagtgcagtggtgtgatctcagctcactgcaacct
-ccacctcccgggttcaagtgattctcctgtctcagcctcccaagtagctgggattacagg
-cccacgccaccacgcctggctaatttttctatttttagtagagatggggtttcaccatgt
-tggccaggctggtctcaaactcctgacctcatgatccaccaccttggcctcccaaagtgc
-tgccgtgggctgcactttggcattgccttggtcacgtgctgctacctgggattacaggca
-taagccactgcgcctggcctaatttttgtattttttagtagagacagggtttcaccatgt
-tggccaggctggtcttgaactcccagcctcatgattcgcccaccttggcctcccaaagtg
-ctgggattacaggcgtgagccaccacgcctggccAGGAAATACATTTACATGGCTCAAAT
-TCAAAACTATAAAAGTCggccaaacatggtgactcacatctgtaatcctaacactttggg
-aggctgaggcaggaggattgcttgagctcaggtgagaccagcctaggcaatgtagggaga
-cccccatctctacaaagaataaaaaaaaattagtcaggcatcatagtgcacacctgtagt
-cccagctacttgggaggctgaggtggaagaatcacctgaaccctgaggtcgaggctgcaa
-gtgaactgtaatAGTAAGAGTCTCCTCCTAATCTTGTGCATCCTTTCAGAGAGAGAGATG
-atagatattcaaacaaatacatacatatatataacatatttatatatattctttttaaca
-taaaagtatagccaggtgtggtggttcactactagagtcccagctacttaggaagctgag
-gtgggaggttcacttgaggccacgagtttgagaccagcgtgggcaacatctcttggggaa
-aaaaaaaaaaaaacccaccataaaagcattctataacacgtaattctgtgtttgtctttc
-ttctcttaatacatcttggagatcagtacgcatcagtatatagagagcttccttgtcctt
-tttcagggctgtgtagtattctgctgtatggctataccatgatgttttcactagctttct
-actgcctgacatttgggatatttcctgcttttgctattggacacaaggctctgatgaaca
-gcctttactatatttaatttttttgtgagaagtttaactggaagataaattcccagaagt
-ggggcacccagttaaggatatgtgactttgtcattttaacacacactgccagatcacccc
-ctataaatgttgtgccacgtatcctcccaccagcaGGGGAAAGGAGGGGCCACCAAGCAG
-TCTCACTTTAGTGCTTTTCTCTCCTTTTTACCAGATGCGAGCCACCCCTCTGGCTGCTCC
-TGCGGGTTCCCTGTCCAGGAAGAAGCGGTTGGAGTTGGATGACAACTTAGATACCGAGCG
-TCCCGTCCAGAAACGAGCTCGAAGTGGGCCCCAGCCCAGACTGCCCCCCTGCCTGTTGCC
-CCTGAGCCCACCTACTGCTCCAGATCGTGCAACTGCTGTGGCCACTGCCTCCCGTCTTGG
-GCCCTATGTCCTCCTGGAGCCCGAGGAGGGCGGGCGGGCCTACCAGGCCCTGCACTGCCC
-TACAGGCACTGAGTATACCTGCAAGGTACGTGCCCATGGGCGGCTGTCCCCCAGCACCAC
-AGGAGGCCTGGGAAGGAGGCCTCCAAAGGATTGCCAGGGTGCAGAGGGGTCCTTATGTTC
-ATTCATTCTTGTGTTTGTTTAGTGGGGAAGCATCCAGGGAGCCCCTGCTGGACTGATACT
-AGAGAGGTAAACCAGAGGTCGTCCCAGTCCTGGGGGAGTTCACAGCTTAGGCCCTACAGT
-GTGATAAATGCTGCAGGGGTAGAACTTAGGGATCATGGGCGCAGAAaaggccgagcagaa
-gttagccaggtagaagtgggagatgggagttgcaggcagggggaacagctgttcaaaggc
-ctagaaaagtgaggggatagcactttagagaatgaaaaggacttctctgtggccagagtg
-gagaggatgtgcagaaaggggcaggagatgaagGTTGGCAGCAGCTGGTCATGAAGGTGT
-TAACAAGGGGCCTCCACTGGGCTGTGCGGAGCTACTGAAGATGTTTGCACAAGAGAAGGG
-TAGGGCATGGTAGACATCAAAACTCCTgggacctcggaggtgatcgagcctaacctgggg
-ccattttacagataggaagactgagatgaagacaggagaagggccatgcgtgaagtcaca
-tagcACTGGGCCTGGCTCCTGGGGTAAACTAAGGGGTAGAAAAGTCTGAGGATTCCTGGC
-AGAAACCAGGAAATGGACAGGGTCAAGGCCCCTGAGGGTCAGCCCATGCAGGACACTGAC
-AAGTGACAGTCCAAGAAGACAGAGATGAGAATAAAAAGTGTAACAAtaggtattcactgt
-gcaccaggtactatgatgattgcttagtgtgcacaatctcttttaatcttgacacaacca
-atgaggtggtttctatcattgtgccccttttatagatagaggacactgagactcagaaag
-ccatggttacttgccacatgacagagccaggtggtatcagagctgggattgggcccagga
-ggctgagcccagagagtcctgtgcccGTGCTAGGATAAGCGTTTCACACAATCAGGGCAG
-GCTGCCCTGGCAGGCAAGCATAAGGAAGATAAGGGGGACCTGGAAACCCAAGGGAGAGTA
-GCGGGGGCCTGGGTCCCTTGGGAATGCACAGAGAAGCAGAAGGACTTAAGCCTCCTCCTG
-GGGCAGCAGCAGAGCTTTGCTCTGTTGACGGAGATGCAGTGAACAGCGGGGCAGATCCAG
-ACAGGGTCCAGCCCCTAGCTTCACCTGGCCTCTTGTGCACAGATCTCCAGCGCCCTTACC
-AGGTGCCCTAAGGAGCCCAGAACTCTGGGTCCCCTTCCTGCAGCATCACAGGCTCTTTTC
-CACTCCCGCTGGGGAGGTGAGTCCATGATAAGAGGAATAACCCAAGCAGGCTCAGGAGAG
-AAGCGCCATGCGTTCACAGGGCCCTGATTCTCAAGAAACATTTGGGAAAATCCACTGGAA
-CATACTCACCCCTATGCCAATGTGCACCATGGGTGCTGAATGGTCATTTCCACACTTCCT
-CAGCTTTTCTGGTCAGTGTGTAGAAAGATCAAAATCTTGTCTTTGTAAATGATCAACTTa
-ttcattaattcaacacaacttcattgagcacccgtatttgccatgtaccatgctgtggtt
-aaaaaacaaagttctgttctcatcaagctgacgttctagtgggagatacagacactaaac
-aagcgaataagtaaaatacgtgtcaggtggccgggcgcggtggctcacacctgtaatccc
-agcactttgggaggccgaggtaggcagatcacctgaagtcaggagttcgagactatcctg
-gccaacatggtgaaaccttgtttctattaaaaatacaaaaaattagccgggcatggtggc
-aggggcctgtaatcccagctactcgagaggctgaggcaggagaatctcttgaacctggga
-ggtggaggttgcagtgagccgagatcacaccactgcactccagcctgggcaacaagagca
-aaactccgtctcaaaaaaacaaaaaacaaacaggaaaaCCCTTATTCCAGCATCTTTCTT
-GGTTCCTTTGCAATGCTTATCAGCATTTGTCAATATTTGGTTTCTGGGCATGTTTGCATG
-GCCTCCCAGTGGGCACCGGAGAGCAGAGCCCATGGCTGTCAGTCTAGCTGGACATGTGGC
-TGGCCCGTGCAGGCCCAGGGCCAGCATACTGAATGAATGAAAGCGTGGGTGGGCAAAGAG
-GACGGGAGCTGTGACGGTGATGAGCATCAGGTGCCTTCTGCATCATCCGCCCTTCCGGAT
-TCCTCCTGCTTTGTGGGTTATTTTTCTGTTTGGGTGACCTGTTACTTTTCAGTTATCCGA
-TGTTTGAGGCCAtatagcgtagcagttaagagcacagacaaaaggccgggtgcagtggct
-cacacctgtaatcccagccctttggaaggctgaggcgggaggatcacctgaggtcaggag
-ttcgagaccagcttagccaacatgatgaaaccccatctctactaaaaatacaaaaattag
-ctaggtgcggtggcacatgcctgtaatcccagctacactgggggctgaagcgggagaatc
-acttgaatccaggaggcggagtttgcagtgagctgagattgcgccagtgtgctccagcct
-gggtgacagagcgagactccgtctcaaaaaaaaaaaaaaaaaaaaaaagcacagacagtg
-gagtgcatacgtgcaaatctcagccgtgctgtttgctggctgtgtggcctctcagcttcg
-ttaaccgtaaaatggagcaagtcatcctaccttataggaccatggtcagggctgagtgac
-tcggtcagtgaagcgcttggtgcgatgcctagcacatggtagtgtctaataGGTCAGCTG
-TGACTGTTTGCAATGCCAGCCTCAGCTCCCGGGAGTCCCCAGCTGTGCTAACACCATGCT
-CTGCCCACAGGTGTACCCCGTCCAGGAAGCCCTGGCCGTGCTGGAGCCCTATGCGCGGCT
-GCCCCCGCACAAGCATGTGGCTCGGCCCACTGAGGTCCTGGCTGGTACCCAGCTCCTCTA
-CGCCTTTTTCACTCGGACCCATGGGGACATGCACAGCCTGGTGCGAAGCCGCCACCGTAT
-CCCTGAGCCTGAGGCTGCCGTGCTCTTCCGCCAGATGGCCACCGCCCTGGCGCACTGTCA
-CCAGCACGGTCTGGTCCTGCGTGATCTCAAGCTGTGTCGCTTTGTCTTCGCTGACCGTGA
-GAGGTGAGTGTGGTCTCAGAGACCCCAGCCACAGACACACCCAGGGGGTGGGCCATGATG
-GAGAGAAACCGAGGCCCAGGAAGGCAAGGTAACTTAGGCAAGAAGTGGGAGAAACTGAAG
-TAACCAGCAGCCCCTGTTTAGTTCCCTGAGAAGAGTTGACTCAggccaggtgcagtggct
-cacgcctttaatcccagcactttgggaggccgaggtgggtgaatcacttgaagtcaggag
-ttcgagaccagcctggccaacatggtgaaactccgtctctactaaaaatacaaaaattag
-cctagtgtggtggcgcacacctgtaatcccagctactctgaaggctgaggcaggagaact
-gcttgaacctgggaggcggaagttgcagtgagccaagatcacgccactgcactccagcct
-cggcaacagagtgagattccatctcaaaaaaaaaaaaaagaGTTGACTCAGTCCTCTTGG
-GAGCCCCTTGGGATTCTGGGATGGAGCACTGAGATGTGAAAGTCATAGTAGCCGACAGTG
-ACGAAAGCATCGCCACATTATCTAACGTGGTCttccatccttacaaacacgaggcaggta
-ctgttattatccccatatgatcaaggaaactgaggcccagagagctcaagtaacttgccc
-aagatcccatagcagaataaatggtagagctgggatttgaacctagatctgactccagag
-cctgggtcttaaTTCAATCTGAGCTTGAGAGGCAGGGGcctggctgggcttaccaactga
-ctttgggtgacctagtgtctctgagcctcagtttctccgttggtaaggaaaagggctgga
-ttGTTAGGGTGTTTTCAGGATTCCAAGACCACAGCCAAAATAGGGTCTGAGGTTCCCCAC
-ACGGGAACGTTTTCTGTGAAACTGAGAATTAGCACTTTTTGGTTAAAAGAATCTTCCTTC
-TCTAGGTTGGGATGCTAAGAAtttttttttttttaattgagacagagtctcactctgtca
-cccaggctggaatgcaatggcgcgatcttggctcactgcaacctctgctgcctgggttca
-agtgatacgcctgcctcagcctcccgaatagctgggactacaggcatgcgccaccatgcc
-tggctcattttttctatgtttagtagaaacggggttttgccatgttggccaggctggtct
-tgaactcttgaccttaggtgatccgcctgcctcggcctcccaaagtgctgggattacagg
-tgtgaggtactgcacccagccTAGACGCTAAGAAAAATTTTTAAAAGATAATTCTGGGGA
-GAAGGGCAGAGAGACTCGCCTCCTGTTCCCTCTCCAGATTCCTGGGGGCAGTCAAGATGT
-GTCAGGGAGTGCACTAAGCTGCCAGTTACACAGGAGTTTTCTGTGGAGAAAGGAGTGTGA
-CCCCATGGCATTTTAAAAAACtttttatcttgaaataattttagacttttagaaaaccta
-caaaaatagttcaaagagtttctgcatatcctttaaccagtgctctccaatgttaacacc
-tgacgtagctatggtacaattacccaaactattaactaagccacagattgattcccactt
-cccgagtttcccactaacaccccttgctgtgcaggatccagtgaggatcccaatttagtc
-atcagtggtttccttggtctcttccaatctgagacagttcctcagtctttccctgtcttt
-gaagacccatgaccttgacacttttttttttttgagacagggtctcactctgtcacccag
-gctggagtgcagtggtgtgatcacagctcactgcagcctcaacctcccgggctcaagtga
-tcctcccacctcagcctcctgagtagttggttctacaggtgtgtgccaccccacctggct
-aattgagatggggtcttgctatgttgcccaggctggtctcagactcctgagctcaagcaa
-tctgcctgcctcagcctcccaaaatcctgggattataggcgtgagccactgctcctggcc
-ataaccttgagacttttgaagagtactgatcagttactttgtatgtccctcaatttggat
-ttgattgatgttttctcacagttagattgcagttatgtatttttggcaagaacaacacag
-aatcgataggcccctctccacatcatatcaagagatacttgagctgatagtcattcctat
-gtcgtgaccttgatcacttggttagggcaggacctaccaggtttctctactgtaaggtcc
-taatttaccctttgtaattgacaaataccttgggggaggtaagctaggcatataaatatc
-ctgtttttcctcaactttcacccactaattttagcagccatccatcttgcctatagcagt
-tattattgtggtgcttgcctaagtctaattttctttttcttttttttctttctttctttt
-ttttttttttttgagacagagtctcgctctgttgcccaggttggagtgcagtggcacgat
-ctcggctcactgcaacctccacctcccgggttcaagtgattctcgtgcctcagcctcttg
-agcagctgggattacaggcacacaccaccacacttggctaatttttgtatttttagtaga
-gatggggttttgccatgttggccaggctggtctcgaaatccgcctgccttggcctcccaa
-agtgctgggattataggcatgggccgctgcgcccagccCCCAAGGCTGATTTTCTGTTAA
-TATTTCCTTCTACATTTTATATTAGAACAAGCATGCCTTTTTTAAAGAAGTAACATTTAT
-AATGATGTTTAAGCTAGTACATAACTTCAAACACATTTTAGGCTTAGGGTAGATACAACT
-ACCCCGGACCTCCTGGAGGAGACAGCGTGCTTCCTGCTCTTTTCAAGAAGTCACTTgatg
-gcccacacctgttatcccagtgcttcgggaagccaaagtaggaggactgcttgagcccag
-gagttcgaggccagcctaggcaacacagaaaaccccatctgtacaaaaaatttataaaaa
-ttagccaggtgtggtgatgcacacctgtgatcccagctacttgggaggctgaggcaggag
-gattgcttgagcccagaagtttgaggctgcagtgaactaggattgcaccactgcactcca
-gcctgggtggcagagtgagaccctatctctaaagaaaaaaaagaaaaaaaaaaagaaaaA
-TCACATGagagtcattggtagaagagggaccgtgagttagatagacctgtgtttaaatcc
-tgggttctgcttcttacctgctttttggccctgagcaaatgacttcacctgcctgagcct
-ttgtttcttcatctgtaaaatgggctaataatgctgacACCCCTTGTCCCCCAATACTGT
-GATTCATAGGATTGGTCAGTATTTGTGAAATGCCACTGGACACCCAGGAAGTAATGCCAT
-AAAGAAGAAACTAATAGCAGTGGTAATAGAATGATTACTATTAAAGTCATCTTTGAGTGC
-TCAGTGGAAGTTGTTTAAAGTAGAAATTGCAAATGGCAGGACACACtttttttttttttt
-tgagacagggtctcactctgtcacccaggccggagtgcagtggcgcgatctcagctcact
-gcaaccgccacctcctgggctcaagtcatatccttctgcctcagcctcccaagtagctgg
-gactacaggtgcgaatcaccatgcctgctaattttcgtattttttgtagagataggtttt
-taccgtgttgcccaggctggtcttgaactcctgaactcaagtgatccccctacctcggcc
-tcccaaagtgctaggattaccggcatgagccaccgcgcccagccTTACACACTTTTTTTT
-TTGCCCTGCTTACCTGTTTGTGTTTTTTATATAAACTGGTTGCCAATATTTTTTAAATGG
-GGACCTTTTCATTAAAATACAATTCCTGGCTTCTCTTGGGGAAAACAATGGGAATGTGGG
-GCCATCTTGGGAACTGCGAGGGTGGGTCACAGCACTGGCTCTGAGTATCTGCCAGCCAGC
-GTTCCCATCCCAGGCCCATGCtctacagctgtaaaatggtgtcttccttgcaggctgtag
-cctagatagaatgaggtgagccaggtaatgagctgggtcaagggccaggaacacagcagg
-cacttggtaaaCCCTAGAATGCGTTGTGTACCCTTTTTAGGTAGCGCTTGTGCTGAGATG
-TCAGGCACACTTCCTGTTTCTCTCATCTTATTACCTGCCTGGACCCTAAGTTTGTAGCTG
-GTTTAAGAGAGGCTTAACCCTCTCAGCCCCATCAGCCCCCTCCCCAAGGGACTCTGTTGA
-AAAATGTATTCCTTTCAgaattttagtttaaatttaattgctctgtggccttaaatgact
-taacctctctgagcctgggcttgggtatctgtaaaacaggATCAGACATCACAGGACTGG
-CTTGTGTCTGTCAAAGGCCAGCAGGCACTTGGAAAGTGGGTGCCACAAGGGTGATAGCAT
-GGGGTGGTGGCATGGGGGTTCTGGGTAGGACCTGACCCTTCTGTTTCTCCCCATGTCCCA
-GGAAGAAGCTGGTGCTGGAGAACCTGGAGGACTCCTGCGTGCTGACTGGGCCAGATGATT
-CCCTGTGGGACAAGCACGCGTGCCCAGCCTACGTGGGACCTGAGATACTCAGCTCACGGG
-CCTCATACTCGGGCAAGGCAGCCGATGTCTGGAGCCTGGGCGTGGCGCTCTTCACCATGC
-TGGCCGGCCACTACCCCTTCCAGGACTCGGAGCCTGTCCTGCTCTTCGGCAAGATCCGCC
-GCGGGGCCTACGCCTTGCCTGCAGGCCTCTCGGCCCCTGCCCGCTGTCTGGTTCGCTGCC
-TCCTTCGTCGGGAGCCAGCTGAACGGCTCACAGCCACAGGCATCCTCCTGCACCCCTGGC
-TGCGACAGGACCCGATGCCCTTAGCCCCAACCCGATCCCATCTCTGGGAGGCTGCCCAGG
-TGGTCCCTGATGGACTGGGGCTGGACGAAGCCAGGGAAGAGGAGGGAGACAGAGAAGTGG
-TTCTGTATGGCTAGGACCACCCTACTACACGCTCAGCTGCCAACAGTGGATTGAGTTTGG
-GGGTAGCTCCAAGCCTTCTCCTGCCTCTGAACTGAGCCAAACCTTCAGTGCCTTCCAGAA
-GGGAGAAAGGCAGAAGCCTGTGTGGAGTGTGCTGTGTACACATCTGCtttgttccacaca
-catgcagttcctgcttgggtgcttatcaggtgccaagccctgttctcggtgctgggagta
-cagcagtgagcaaaggagacaatattccctgctcacagagatgacaAACTGGCATCCTTG
-AGCTGACAACACTTTTCCATGACCATAGGTCACTGTCTACACTGGGTACACTTTGTACCA
-GTGTCGGCCTCCACTGATGCTGGTGCTCAGGCACCTCTGTCCAAGGACAATCCCTTTCAC
-AAACAAACCAGCTGCCTTTGTATCTTGTACCTTTTCAGAGAAAGGGAGGTATCCCTGTGC
-CAAAGGCTCCAGGCCTCTCCCCTGCAACTCAGGACCCAAGCCCAGCTCACTCTGGGAACT
-GTGTTCCCAGCATCTCTGTCCTCTTGATTAAGAGATTCTCCTTCCAGGCCTAAGCCTGGG
-ATTTGGGCCAGAGATAAGAATCCAAACTATGAGGCTAGTTCTTGTCTAACTCAAGACTGT
-TCTGGAATGAGGGTCCAGGCCTGTCAACCATGGGGCTTCTGACCTGAGCACCAAGGTTGA
-GGGACAGGATTAGGCAGGGTCTGTCCTGTGGCCACCTGGAAAGTCCCAGGTGGGACTCTT
-CTGGGGACACTTGGGGTCCACAATCCCAGGTCCATACTCTAGGTTTTGGATACCATGAGT
-ATGTATGTTTACCTGTGCCTAATAAAGGAGAATTATGAAATAATTTTATTTTTCTCTGCA
-ATTTCTTCCATCCTTTCCAACGATCTCTTACCAGTTTTTCCTGCCTTCAAAACTGGCCCC
-CATGGTGAAAGGCCGTAGAGTTGTGTCTTAACCTGGGCTGAGTGGTTTGTGAGAACAGAT
-TACCTGGAGCCCAGTGGGTCTTCCTGCACTCCTTCTGTTTCTTCTGGCAGCAGCAGTGTC
-TCTATTAGGGTACTTTCTGAGTCaaaatggcttcaacaagatggaaatatgtttcacaca
-aaacaagaagtcagcagatagggtgggcttcagtgctggtccattcaactcccaaagctg
-cgcacagggaccccggctctccaggctccttctgtctctTGGCTGTATTGTCTCGAGACT
-GCTGGCCCAATGGCTACAGCAGGTGTCACATTAAAGAGGTCCATGACCAGAGGAAGAAGC
-CAGGGGTCATTGtagtacctgagaactcagaactctggagtcaggctgcctggaattaaa
-tcctggctccagcactcaatagctgtttgacccttggcaagtttcttaaccactctatgc
-ctcagattcttcatctgtgaaatgggggacaatgatagtacctaacttatgagaactaaa
-tgacttattttgtataaagcaattagaacaagcagcgcctggcataataagcccacaata
-aaagttACTCCCggctgggcacggtggctcacgcctgtaatcccagcactttgggaggcc
-gaggtgggcagatcacaaggtcaggagttcaagaccaacctgaccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaatttttagtagagacggggcgtggtggtgcgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaattgcttgaacccgggaggtggacgtt
-gcagtgagccaagatcccgccactgcactcagcctgggcaagagagcgagactccgtctc
-gaaaaaaaaaaaaaTGGTGCTCCCACATTTCTTTCTTGGGATGGAGGaagctttcccaga
-agcgctcctgaccgactttcccacacatctcactggtcagaactgcatcacttgccgttt
-ctgaccaatcaccagcTTACATTCATGGGGCACGTGCTTACACTAACCATGGCACTCCTC
-GAGCTAAGTGGAGCTCATGCGTCATATGGAGGGGTAGTGACTCCTGAGCAAAACCAGGTT
-CAAAGAGGGAGGGGATCGTAGGGAAAAGAATGTGCGGAAGTgcggaggcccagccaacag
-cctgctaactgcagatactcgagagcggccaccctagatcatctgacccaggctggccca
-cgctagaattgcccagtgacccgcaaggtcatgagctaattgagctaaataaaatcattg
-tgtttttttgtttgtttgttttgtttttgttgttttgttttttgagacagagtctcactc
-tgtcacccaggctggagtgcagtggtgcgatcttggctcactgcaacctctgcctcccgg
-gttttcaaacgattcttctgcttctgcctcagcctcccgagtagctgggattacaggcac
-gcgccactacacccggctaatttttatatttttagtagagacgggggtttcgccatgttg
-gccaggctggtctccaactcctgacctcaggtgataggcccacctcggccacccaaagtg
-ctggtattacaggcgtgagccgccgcacccggccaatcattgtggttttaagtcactaag
-tttgaggctattttgttttacagcaaaagctaactgatgcaGACAGGGACAAGTCAGTCT
-CATCTCTGTGCACCCAGCATTGCCCAGAACAGGGCCTAGTTGTGTCTAGGGTCTCATGGG
-GCAGCCCCTGACCTCTATCTTGCCCCTCCCAGCTTCCAACAGACCCTGTCCCAGCTCCCT
-CCAAGCTGAGTGTTGGCCTGATACCTACCAGTGGAGCGAGGGGAACACGAGGACTGCCAA
-GGGcaggtaccgtgccaacccttcactccattccacaaagagactcatttactcctcatg
-acaatccagtgaggcagatgttcctgtcactttacagataagacaaatgagctttagaga
-gagcagaagactcatccaagacctcacaacAGAGAAAAAGACTCCTCTGGTTTTTGCCTT
-GGAGCAGGAACTTTTGACAAGGCTGCGCAGATGCAGCCACATGAAAACCGCCCATTAAAA
-ATGTAATATCggcccggagcgggggctcacgcctgtaatcccagcactttgggaggccga
-ggcaggcagatcacttgaggtcaggagttgaagaccagcctggccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaaatagccaggcgtggtggcatgggcctgtaatcccagc
-tactcgggaggctgaggcaggagaatcacttgaacccaggaggcagagattgcagtgagt
-caagattgcaccactgcactccagcctgagcgacagagcaagactctgtctcaaaataat
-aataaaaTGTAATATTCACTCTTATCAAATAATGGATGTCACCACACCCCGACCCTAATT
-AGTGAGGACTTTCATGTTCTACTTGTCTTCATTTAATCATCATTGTATAAGAGTTTTACA
-ATATCAAATTAGTAGATGTATATTACTGAAAGGGAAGGACTGTTAGAAATTTACTTGAGG
-AATGTCTGCCACTGGGGGCTGAACACAAAAGATCCTATTGTGACCTGCCAGATTATTCat
-tcacttagcaattcaacaaccatcgctgaatgcctactataggccaggtgccatgcaaga
-cagatgtgctcccaccctcaagggttcacagtctaatagaggagagagatgttaaacaga
-taactgtacagatggcaTAGCTAATTATATTCGTGGAAGTTCGTTGTGGCAAAGACAGGC
-ATCTCAATATTTCAGGAGCTCCCctatattttctagcctcccttacagtcacatgactag
-ttctgaccagtggggtgtgtgtaggagtgGCAGGCTGAAGCAATGGAGAGCTGGTGAGCC
-TCATCCCTCTCTTCCCCTGCCACAGCCACCTTGCGCCCACAAGTtcccttagctacaagc
-tggaggagagccaccagatccaccttagatttcactgagcaagaaataaagcttcttgtg
-ttaagtctttcagatttggagtttgtctggtagatagtgttaattaccatgactaaGGAA
-AATTTGCCATTAGTGAAGGGAGGAAAAATATTCTCCACCAGTAACAAGGCCATGTCAGTC
-TGCTGCATTATAAACCCCAAACAGtagtttatgatcctctgggctggcaatttgggctga
-attcagctgggtcactcctgcagctgcaggcagcaagcagctcgaatgtctaccttgcca
-ggaaggctcttctctgctccacatggcctcgtcctccaataggcatagcctactccttcc
-tatggtggtctcagggtttcagaaagcaacaagagaggacaaattccagtgttcaagctg
-cactagtgtcaaagcatatcaaatagcatgtcaaattccacatcaaattcaggatgcagg
-caaattgattctttctcttgatgggaagagctgaaaaTAATGTGTGGTCTTGTTTTTCAA
-TGTAcagtggtcccatttatccaggggggatacattccaagacccccagtggatgcctga
-aaccacagatagtacagaattctgtatataccatgttttttactatacatacatacctac
-gataaggtttaatttgtaaattaaactcttacaaattaagagttaacaacagctgggcac
-agtggctcacgcctgtaatcccagcactttgggaggccgaggtgggcggatcacgaggtc
-aagagatcgagaccatcatgaccaacatggtgaaactccgtctctactaaaaatacaaaa
-attatctgggtgtagtggcgcatgcctgtaatcccagctacttgggaggctgaggcagga
-gaatcatttgaacccgggaggcggaggttgcagtgagctgagatcgcgccactgcactcc
-agcctggtgacagagcgagactccacctcaaaaaaaaaaaaaaaacaaaaaaaacaaaca
-gttaacaataaatagaacagttataacagtatgttgtaataaaagttatgcgaatgtggt
-ctctccctcaaaatgtcctattgtactgtactcacccttcttgtgatgatgggagataat
-aaaatgcctacatgatgagatgaaggtaaatgaatgacatgggcattgtgatctagcgtt
-agactactactcacctgatgatacgtcagaaggagaatcatctcctttgggtgatccagg
-atcatgaagccgtgacaatgtccatgattggatgtcaggagcagatgatgttaatgatta
-accgtgggtaatgtctacaatatggatacagtgcaaaagggatgattcacatcctacgtg
-gaatagtgcaggattgcatgagatttcatcatgtggttggctgcaggtaactgacattgc
-agaaagcaaaaccacagatcatgggggTGGGGGTGGGGAACTACTGTACAACATGAGATA
-TATTTGATCAAATAAGATGAGGTGCACCTAAAACTTTCCCTACAGGTTGTATGCCCCTGA
-GTAAATTGCTTGGTGTCTCTGGATCTCCAGCTGTTCCCCTTCTCTCTGCATGGCTAAGCC
-CTGTCCGTCACTTGGGGCTGGACCTAGAGCCCTGCCTGGCCACTAAGCCCTCAGAACAGG
-GTTTCTTTTTTAAAAAAGACAGGGTcgggaggtggaggttgcaatgagccaaggtcgcac
-cattgcactccagcctgggtgacaagagtgaaactccatctcaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaagacagggtctcactctgtcacccaggctggagtacagtggt
-gtgatcatggctcgctgcagccttgaacacctgggctcaagctgtcccccaacctcagct
-tcctgagtagctgggagtgccaccacgcctagctagttttttaaaaaattgttttgtaga
-gacaggggcctcactattttgcccaggctggtcttgaatgcctggcctcaaatgatcctc
-ctgccttggcctcccaaagcactggggttacaggtatgaccacTACCCACAACCAGAACA
-Tttctcaaatgtgattggttgatctcctgcatccatccctggggtgcttgtttaaaatgc
-agagccctggatcctcccccaacctagagagtcagaacatctgggcttctgcatcttaac
-aagctccctgggtgatgctgctgggcctccaagttggagaacctctgTATTTGAAGAAAT
-CCGGACTCCTTGGGGACTCAAATCTTATTTCAGCTCTTCTCTGGACTAGTTTGACTTTAG
-CCTTGGTGTAAAATGGGTATACATTTTACACGCCTGTGACGCCAGGATGCGCTCACAGGG
-GAGGGAGGGCTTTATCAGAGGTCAGAATCTAAGCCACCACTACAGTTGTACTAGATCCAA
-GGAGAAAGACTCCCAGGCCTCATttcctcatcgttctctcttctcttacctggctttatg
-gttcttcatagcactgagcaccaccaggcagtgtattttatgttttttttgagctttata
-atgccagggactatgttttgtttataactgttcacccagttcctagaacagtgcctggta
-cacaggagtgctcaataaatgtttgtggaatgactgaatAAAAGTTGTTCCTGTACAGAT
-TCCACCTGCCTAGAGCAAAGCCAGGACACTGATTGGGAtgaacacatagcacatgccaga
-catggctttgagtgctttacctggatcatctcactttatatgtgacagccaaatggtccc
-cagtgaccttcaccagctgctattcacgcctttgtacagtttcctcccatcctaagctgg
-gctgaccagtgtaatgaatacaatattgtgaaatgagaaagtatgacttttaagattagg
-tcataaaatatgttatggcttctgccttgctcttctggatcatctgctctggggacagcc
-agctgccatgttgcgaggacactcaattacccctgtggaaacttacatgtggtgaggatc
-gtaggcattctgcaaataaccagcaccacccaggcacataaaagagctttcttgagtcaa
-tcctccagccccagtcaagccttcagatgactgcagccccagccgacatcttaactacaa
-cctcatgagtgaccctgagccagaaccatctatgtagctgctccccagttcctaacccac
-agaaactatgtgatagcatacatgttgattgcttttttaagcaattaattttgggaaatt
-tgccacatatcaataattaataacttgtacagattctcacaacagcctatgtgggaggag
-ccatcataattaccattgaacagagaaagaaactgaggcccagatagggggaatctttgt
-ccagggtcacacagatagtgaactgtagcactgagattggaacccaagtttgaatgacta
-gagtcTACCCACTGAGGTGAAGGTGTTCAAGTTGAATGCCAGCTCTTCCCCTGAAGGGCC
-AAGGCTGAGACCAGAAAACCTGAAACAATATAGCTGCACCCaatataaatatatgcaggt
-aactcagggctgatggtacatgaccataataaatcagcagggtcatcaggagaaaacaag
-acaacaggagcgaaaacagatagaaacaaatatgcccagagtttgtatatcagtattatc
-agacgcagattataaaacaaaatgttggccgggcacgggggctcatgcctgtaatcccag
-cactttgggaggccaaggcgcatggatcacctgaggtcaagagttcaagaccagcctgac
-caacatggggaaaccccgtctcaaataaaaatacaaaaaaattagctgggcctggtggca
-ggctcctgtaatcccaggtacttcaggaggctgaggtaggagaatcgcttgtacccggga
-gggagaggttgcagtgagctgagatcgcaccatctcactccagcctgggcaacaagagcg
-aaactctgtctaaaaaaaaaaaaagtttactgcgtttaaataaataaataacctagaaac
-attgccaaagtatagaaaattatatcacatgacaacaaattttaaaataacctaacagaa
-cttctaaaataaaataatacaataatcaaaatttttaggccaggcacagtggctcacacc
-tgtaatcccagcactttgggaagccgaagtgggtggatcacttgaggtcaggagttcgag
-accagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaaattagccagg
-agtggtggcagacacctgtaatcccagctactcaggaggctgaggcaggagaatcacctg
-aacccgggaggcagaggttgcagtgagctaagatcgtgccatttgcactccagcctgggc
-aacaagagtgaaactctgtcacacacacacacacacacacacacacacacaaattaaatt
-taaaagatgggctaaacagcaaactagatatggctaaagagggaattagtgagacagaaa
-tcagaCaccaatcacagattcaagaaactccataaattttacacatagacacatcatagt
-aaaagtgcaaaaagccaaagattttttttaaaaaactcttaaaagcactcagaggaaaag
-aatcagagattctaaaaacaaaaaacaaaACAAAACAAAAAAACCCCAAAACAACAACAA
-CAaaaaacaaacaaaaaaccagtactacaacatggataaacctcaaaaacgttatgtcaa
-gaaaaaccccaaagttatgccaagtgaaagaagccagtcacaaaggttcacatattgtca
-aaatctaattttctttttgagacagggtctcactctgtcacccaggctggagtgcagtgg
-gacgatcactgctctacaggtgcacgccatcacactcggctaatttttgtattttttgta
-gagatggggtttcaccatgttgcccaggctggtcttgaattcctgggctcaagcgatcca
-cctggcttggcctccccaagtgctgggattactggcatgagccactgtggcccatcagta
-agatctaatttctataaaatatcaagaagaggaaagtctatagagacataaagtatatta
-gtgctgtcagttggaggatgggaaacagggaatgtctgctaatgagtacaggtctatttt
-ggggtgataagaatgttctttctttctttttttttttttggtctgagacagagtctcgct
-ctatcacgcaggctggagtacaacggtgcgatctcagctcactgcaacctctgcctccca
-ggttcaagccattctcatgcctcaggctctgcagtagctaggattacagatgtccgccac
-cacacctggctaatttttgtatttttagtagagacagggtttcaccatgttggccaggct
-ggtctcgaactcctgacctcaagtgatccgcccacctcggcctctcaaagtgctgggatt
-gtaggtgtgagccaccatgctcagccaaaaatgtcctaaaatttgattgtgatgatgggt
-gtacaattctgtaaatgttactaaaaactattgaattgtatattttaggtgggtggattt
-tatggcatataaattatatctcaataaagctgtttataaaaaGAACAGCAGTTAGATTGA
-CAGGTGATGATATCTCAATAAAGCTGTTTATAAAAAGAACAGCAGTTAGATTGACAGGTG
-ATGATATCTCAACAGCAACCATTtcccagcattttgggaggccgaggtgggcagatcatt
-tgagcccaggagttcaagaccagcctgggcaacatgaccaaaccctgtctctacaaaaat
-tagccagctgtggtggcacgtgcccgtggtttgcagctactcgggaagctgagcccagga
-gttggaggctgtagtgagccatgatcacgccactgcactccagcctgggcaacaagagtg
-aaactccatctcaaaaaaaaaaaaaaaaaaaaaaaaGGCTtccccaggccattcaaatgt
-acagccaaagttaagaaacattgtctaaagggatgtgtttccggcaaaagaaaaattatc
-ccagatgaaggtctgaggttcattccttcattcaacatatggagcctccattatgtgttt
-ggaactgttctagacaccaggaacacagcagtgagcaaaacaaaccaaagtccctgccct
-ctaggagaggaaaacagacccagaataacataaataagtaaaacatgctccgttagacag
-taatagatgctgagaagaaaaaatgaagccaggaaagcggatgtgaaatgctggatacgt
-gtgtctgtgaaatttcagatggagtaactagggaagatttttgggtaaagaccaaaataa
-agggaaggagggagccatgcagacgtttgggttatggcaggtgcaaaggccttagggcgg
-gagtgtgtctgacttactccaggacccagcaggtcaatgggacttgagtggaatgaggca
-ggggcagggcagtcagctacgaagacagagatcgggaggcaatttgcgagccctgggaca
-gatctcggattttgctttaagtgagatgggagtacttgggtcggggagtggcatgggttt
-gatttacattttaacaggactctccggcagctaggtggaaatggacggtagggggcaaaa
-agagaagcaaggaggcccaggaggaggctggttcaagacccctgagatgatggagcactg
-atggagctggagcgggatggggccggaggaggtgagggatgagattctgcaagtggagcc
-cgcaggatctgctgatcgatgggacgaggaacgggagaaaaaTTAAAGCGGCGCATGAGG
-CAGACGAATGCAAACTTCACCAATAGCTCAACGAAAAGACAGACGGTGACCGCTgagagg
-cagcgtcggatctgggtaagggcgggttcctgagcctgccaggcctggattcaaacctcg
-gctgagtggccttggacaggtcatcaacaaacagagccttcgtttattcatgtgcaaacg
-gggccaaggaccgggcctgccccgaggtatgcctgaggcttgggtgagCAGGCGCCGGGC
-TCGCAGGGCGCGCTCCTAACCCGTCCCCAGCGGCTCGACGCTGTGGATCCCGCCGCCCTC
-CAGCCCCGGCTCCGGCGCCGACTCCTGCTCAGgctcctgctcctgcccccggccccgccc
-ccggccccggccccggcccccggcccaccccggccccgcccccagcccccggcccccccg
-gccccgcccccggccccgccccggccccgCCCACCCCGCCTGCGGCCCAGCTCCTTCCCG
-CGGCTCTGCGATGCGGCCCGCAGGGTGACCCGGGCGGGAGTCCGGGGACCCGCGATCAGC
-CCCGGAGGACGGGGTGGGGTCGCCCCAAACAGGAGCGCCGGGACCGCTGGGACCCCGCAC
-TCGGCGTCCGCCGCCGCCGGGTAGCCGGGCAGTGGAGGTCCCGGATGAGGCGACAATTTT
-TCCGGCCCCCCCTCCCAGTCCCGCCCCACTTCCGGGGCCGCCACTTTCACTTTCTCTTCC
-GCCGAAGCCGCTCCCCTTGCGAAGAACTGGGGCCTCCCGGGAGGAGAGAGGGCTTTGCCT
-TGAAACCCGGGACGCCAGGGGCGCTCCCGCAAGTGGGGGTCCTCCGGGACTTGGAACGCC
-CCGGCTGGGTGGTGTCCGGGCGTCCTTTCCCCGCTTCTTCCCACCTCGGCTGGTCCCGTT
-TCCTCCTGCGCCCAGTGCGGACCTGTCTCGGCGCCCGCTGCCCTCTCACCGCCCCACGCA
-GGATCCCGGCCTGGTCACCGGGCAGTGTGATGCTTCCCGACTGCCGCGGGGACAGCGAGG
-CACACACAGGGCTTGGGCCGCGCCGGAGGCCACACGGCCTGGCTGAGTTGCTCCTGGTCT
-CCCGCCTCTCCCAGGCGACCCGGAGGTAGCATTTCCCAGGAGGCACGGTCCCCCCCAGGG
-GGATGGGCACAGCCACGCCAGATGGACGAGAAGACCAAGAAAGGTGGGCACAGGCTGGAG
-GTGGCTGGGGAACTTCCGGTGGGAAGTGGGCCCCGCAGGACCTGGCCTTGCCCCTGGCCA
-GAAGGGCCTTGGAGAGGGGGCTTTAGCCTGCCCTCCCTCTACCCTCCTCCCCATCAGTTT
-CCTCCTTTGGTACCTGCTGGCTTCCAGAGCCATCTTGGGGCCCTGAGAACTCCTTGGGCT
-GGCTCTGTGCTGAGATGGGGCTAGGGGACTCGCAGAGGACACAGGGCATTGAACTTGGAG
-ACCTCCTGGGCTGGTGGGAGACAGACGTCAGTTGACCTGAGAAGCAGGGGTACTTGCCTC
-TTCTCTTGTCCCCTGCACCTAGGGttgtagaacggaagtcagtcactgccttgctggaaa
-ccctcccatgcccctctgtgttctccaaacaaaacccagaggccctgggtggcccacagg
-atatctgtcctcagtcaccccgccatgctcactctactggagccccactggcttccttcg
-gttctcatccaaccattttttggccaaggcccttactcttccttccacctggaccactct
-tccccactggagcttgacacgtgcagcttctcctccttcaggtcttagcttcagtgttac
-cccctcccagaggcctcccctggtctccttaacctgtttatttccctgccagcaaggatc
-gcaatctgactttttttttttttcttgttaaacttgttcattgtctccccactgggcagg
-gagatccataaggagaggggccctgtttataaatctctgtgggattccagttcctgggac
-agtgggtggcacacagtagaagctcaataactgcttgttggataaatgaatAGAAATATG
-AGGGACCCTGGGAATGGGAAGGACAAACAACCAAATGAGCCTAGTGTGAGGAGGAGTGgg
-gaatattagagaacccctcccggagaaagggacttttagtctgggtgctgaaggatacgt
-aggagttcaccaggaagacagagaaagCAGCACACACAAAGGATCGCCTCCTTTCCTACC
-CCATTACTCTCAGCTCCTGAAAATAAACCCTGTGCTAACTGGCTCCTGCTGTACTGGCTT
-TCAGCAGAGGAAATGGCCCTGAGCCTCACCCGAGCAGTGGCGGGCGGGGATGAACAGGTG
-GCAATGAAGTGTGCCATCTGGCTGGCAGAGCAACGGGTGCCCCTGAGTGTGCAACTGAAG
-CCTGAGGTCTCCCCAACGCAGGACATCAGGTGAGGAGTGCATGGCTGGCCTGAACCCAAG
-GGACAGCAGGACAGGATATTCTTGCCTGTAGAACAGTTCTTCCtaatggcacgttctggc
-ttcaggaggcctggcttctaaccctagttatgtcattaatcaactgtgaaatacagagca
-ggtcacttcacctctcagtgtgtcctcattttaaaaatcagaccgtaacagtagctatct
-catagggttgttaggaggTGTACTGTATTAGGATGTTAGGCCTTATACAACAGAAGAAAA
-CGGAACAGTGacgtaaacaaatttgatggcagggagtccagatagggaggttctgctccc
-gacagtcctcagaggctcatattgtttctctcaccattctgccattcattcccagattcc
-tcatggtgcaaaatggccattccagctccatccagccatcacatcacaggaggaagggaa
-gaaagacacccctccacactcttctaaagagcatagctcaaaaattgtacacacttcttc
-cgttaattcctgtggaccagaactgattcccacagctacagttcagcttgaggggagact
-gtatagccaagatattcagctagaattcaggggttcgcttggtaagggaagggaagagaa
-tggatactgTCGGTCTGTGCTCCAGgagacttaaactcaatgctgaaacactttgcacaa
-tgcctggcgtgttatgcactcaataaTAAACATTAGTGTCTATCGTTATTTTTTGACTGC
-TTTTTCATTACTGGATAGTAAGGCAATAGTTTTATGGTTTCTGATTTTTGGTTCTCTTGG
-TGGGTCCCATTTGGTTTttcttaaaacagttttatttatttatttatccttacagttcga
-ccatttaaagtatacagttcaatggcttttagtatattcaaggttgtgcaaccattgcca
-caatcaattttagaacattttcatcatcctgtaaagaaacctggtactcattagcagcca
-gtcctcatctctctaccttttccctaactccccaaccttaggcaaccactaatctacttt
-ttatctctagggatctaccttctggaaattccatataagttgaatcatgcaatatgtggc
-cttttgtatctggcttctttcacttaggatcgttttcgagattcatccatgttgtagcat
-gtctaacaacttcattcccctttttttttttgacatggggtctcttgtctaggttgaagt
-gcagtggtgccatcatcgctcactacagcctcaacttcctggattcaagcagtcctcctg
-ccttggcctcccaggtagctgggactactggcatgtaccaccacacccggctaatttttt
-ttttctttgagatgggagtctcactctgtcccccaggctggagtgcagtggcgcgatctc
-agctcactgcaagctccacctcccaggttcacgccattctcctgcctcagcttcccgagt
-agctgggactacaggcgcccgccaccacgcccagctaattttttgtatttttagtagaga
-cggggtttcgccgtgttaaccaggatggtctccatctcctgacctcgtgatccgcccgcc
-tatgcctcccaatgtgctgggactacaggcgtgagccaccacacccagccacacctggct
-aatttttagaaagtctgtagagataaggtcttgctttgttgtctgggctggtcttgaact
-tctggcttaagcagtcttcccacctcagcctctcaaagtgctgggattacaggtgtgagc
-caccatgcccaaccagaactttattcctttttattgccaaataataatctattgtataga
-catatctcattatctttactcattaaatcagttgatggacatttgggtgtttctattttt
-tggctattataaacaatgctgccgtgaacatttgtgtccaactttttgtgtggacacgtt
-ttcatttctcttggatacacactagcagtggaattgctgggtcatacagtaactctatgt
-tactttttgaagaaatgccagacagttttccaaagtggctgcaccattttacattcccac
-cagcatatatgagggttctagtttctccacatcatctctaatacttgttgttgtttatct
-ttttgattatagccatcctagtaagtttgaagaggtatctcactgtggttttgatttgca
-atttcctaaccatttgatgacaaatgatgttaagcatcttttcatgcacatattttcttt
-ggaggtttgcctattcaggtcttttgcccattttaaaattgggtttatcttttttttttt
-ttgagatggagtctcgctctgtcacccaagcaggagtgcaatggtgcaatctcggctcac
-tgcaacctccgcctcccaggttcaagtgattctcctgccccagcctcctgagtagctgga
-ttacaggtgcccaccactacactggctaatttttgtatttttagtagagacgggtcttac
-catgttggccaggctggtcttgaactcctgacctcaggtgatccacccaccttggccttt
-ccaaagtgttgggattacaggcatgagccactgcacccggctgggtttatgtttttatat
-tgagttgtaggagtactttattcattttagctagaagtactttattcattttagcttatc
-agctacatgatttgcaaaaattttctctcattctgtggattgtcttctcactttgttgat
-ggtatcctttgaaccacaaaagttttaaattttgatgatgtccagttagtctatgtttta
-ttttgttgtttgtgcttttggtgtcatatctaagaaatcgttgcctcatccaaggtcatg
-aagatttacctctatattttcttctaaagattttatggttttagctcttacatttaggtc
-tttggtccattttgatttaatttttatataaggtgtgaggtaagggtccagcttcattct
-tttgcacgtggatattgagttgtgccggcactatttgttaaggctgttttcctctgttta
-atcatcttaaccctttttggaaattaattgaccataaatgtgagtgcttatttctggact
-ctcatttctataccattgaactataatatatatctgcccttacgccagtaccacactaat
-tactatagcttcatagtatttgaaatcaggaaatacaagttctccaacttttgttctttt
-tcaatattgttttggttattgcaagtctcttgaatttccatataaattttacgatcagct
-tgtctgtttctgcaaaaaaaaaacaacaacaactgggaattttggtagggatttcattga
-atctgtagatcattggccacttgattttaaacaaaatattgagatatctacttcttgaaA
-TGATTGCttgagacagtacctgtgtactccttgctatgaaaaatgaggaagttaacatac
-tcatcttccacctttccttttccttactttttttgttGAAGTATCATTGTGGACACTTTC
-CCAGTTGACTTCCACTTGATCCCCTGAATTAACTAACTGGCACTGGCGTTTCCTTTGTAA
-AATGTACAATGTCAGCCACCATCTtgctactaaagtgtggcctgtggaccacaacatggg
-gggaatctcaggtctcacctcagacttgctgggtcagaacctgagttttgagaggctcTG
-GGCAACCGGCACCTCTCAGACCTGCTGTTGGGTTCTCATCGATGGACCCGATGCTTCCTA
-GCAAATGATACCTGTTGTATGTGTTATTGGTAATAACATAGTTTACTTAGCTATTACATT
-AATTAATAAAACATGAGCGCTGAAAGAGTTGTTTCTGTGAAAATAAGCTGATTGCTTTAA
-AAAGATAAGAGACAAATCACCAAAAAAAAAAAAAAAAAAGATTAACACTTTTGGGTGAGA
-CAGTAGTAAGGAAATACAGTAAAAATCCAGAAGGGCTCTGTGCTCTGATGCTTCAGGAGT
-GTGTCTAAGTTCTTGCTCGCTTTAAAGAAGCTGCTACTAGAAATTATAGATCATGATTAT
-CGATGTGGTTCATACAAAAAAAAAAAAGAAAAATCCCTGGGAAACTCCAATGAGCAGGTA
-TAAACTCACgctgggcatggcggctcagcactttggaaggctcaggcaggagaatggctt
-gaactcgagtttaagaccagcctgggcaacatagtgagaccttgtctctgcaaaaaataa
-aaaaaattagccaggctgggtggcacacacctgtagtcccagctatttgagaggctgaga
-tgagaggattattagaccctgggtggttgaggttgcagtgagccatgatcatgcctgagt
-gacaaggtgaaaccctgtctcaaagaaagaaagagagaaaaGCCATTGGCTGTACACCTA
-GAGACTGGCCAGTGAATATGCATTTATAGTATGTAAGTTAAAATTAAGTGTTTAAGCTTT
-GTCTGCAGCTGTTTTTGTGATTCTCTGCTGTTCACCAGCGATCCTGATGTCACATTGGAT
-GAGAGAGCTCCAGCTGTATTTTTTTGTTGATAGTGTTAAGATTATAGCTTTAAAAAATTT
-TGTTTTCTAACATAATTAAGGCCTTTATGCTTTGCCTCTAGGTTGATTCTAAAAGTGTAA
-CACTACTAGAAAGGATTTATAGTATTTTGATTATGGAAATATTATTCACTATAGAATAAC
-TAGTGCAGTTGAAACCATATGCACTTTTATGTTTCAAAACCCTTATTGCTGGAAGAACAT
-TTTGGGGTTAAGATCCAGTCCTTTTCATTTTTTACTTTTCTTCTATTCTCCTGTATCAGA
-CTCATCTATTTTTGTTTTTCAAGAACTTTTCACGTGGAAAATGTggtaaacttttagagt
-ctttgcatgtttaaaaatttctatattttgctctgtcaattcattgatagttgactgggt
-attcaaattgtttacctgaagaattttgagagcattttctggactgcttttaaataaatt
-tcagatattattttatccttaaatactttagtatgtgtcttcaaaaaattaggacttggc
-ggggcacgatggatgatgcttgtaatcctagcactttgggaggctgaggcaggtggactg
-cttgaacccatgagttcaaaaccagcctgggcaacatagtgaaaccttgtctctacaaaa
-cattagctaggcatggtggtgcgcccatctagtcccagctacccaggaggctgaggtggg
-agggtcacctcagtccaggagattgaagctgcagtgagccaagatcatgccactacactc
-catcctgggtgacagaagtgagaccctgtctcaaaaaaaacaaaaacaaacaaaacccct
-caatactattatcacaccttagaaaaggaataagaattccttaaaatccgctaatgccct
-gtttatattcacattttcctatttcattagtgctttttacaattggtttcttcaaatcag
-gagccaaacaagatctacatgtagcatttcttactatgtcttaagtcccttttactctcc
-tctatttttatgccactagttttttttttaagaaacctggtcttttgacctctagaattt
-tccccatattctggatctatccattacctcttcatggtatgtattagaccactctagcat
-tgctacaaagaaatatctgagactgggtaatttgtaaagaaaagaggtttaattgactca
-gttctgcaggtggtgtaggaagcatggtcctgacatttgcttggcttctggggaggcctc
-agtgaacttttactgaagcgggagcaggcacttcacatggtgagagagggagcaagagag
-agagttggtggggaggtgccacactttacaacagccagatctcacgaggactcactatgg
-cgagaagtcactacagtgagcgcagcaccaggctgtgagggagctgcccctatgacccaa
-acacctcccaccaggcctcaccttcaacactgaggattacagttcaaggtaagatttggg
-cagggacaaatacccagactatcatggtgtcatttactatctcccgtttttcctgtaact
-ggtagttagagataaagtttcaattagtcagCAGTCACtttttttttttttttttttgag
-acagagtttcactctgttgcccaggctggagtgcggtggcgcaatcttggctcactgcac
-ggtccgcctcccgggttcacaccattctcctgcctcaatctcctgagtagctgggactac
-aggcgcccgccaccgtgcctggctaatttttttttttgtatttttagtagagacgggttt
-tcaccgtgttagccaggatggtctcgatctcctgacctcgtgatccacccacctcggcct
-cccaaagtgctgggattCAGCAGTCacttttaatgtgcaggaactcttcctcattttttg
-gttgcttcatgcctttccttgctttctgaatgcagtgttttcccaaatctctctgaaggt
-actagttagacttcactgttgcttattgttccataccctaaatgatctctgtttcctttg
-gggtcggttctgttttttcatcttttcatgcttttgattttccaaacatgttggaggatc
-ctcaAGAAAGTTAAAACCACTTTCTCTGGAATAATACCATGTAGATTTAAATCCTGCCTC
-Tggctgaacacagtggcttactcctgtaatcccacttcgggaggccaaggcaggaggatc
-acttgaggccaagagttcaagaccagctttggcaacatagtgagaccctgtctctacaaa
-aacttaaaaaattagccaggcatggtggcatgagcctgtggtcccagctacttgggaggc
-tgagatgggaagagcccaggaggttgatactgcagtgagccaaggtagcactactgcact
-ccagcctgggccacagaaagagagcctgtgtcttaaaaTTAAATCAAGACATACAAATga
-atcctgcctctaacagttattagttgcttagtttggcagagtcactggaacctatctgtg
-cctcacatttttatctgtaaaacagggatacagcagtacctgtctgatgggttggttgag
-aggattaaatgagttaatacacatgaagtgcattaaatagtcttagcacgtagttaacaa
-caacttctggtggttTCACTAAGgagcaggggagagaagacagaagaggttggagaggtc
-agggaggtgccagatcatggaggccctcgtgtgctgccacgagttgattctaagagtagc
-gtggagccattggagggGCCTAACTGGTGGGTTCTAATAAAGGAAGAAGCATGGGTGGGG
-CCTACCCCAGACTGGGGTTtgtgtgtgtgtgtgtgtgtgtgtgtgtgCATGGCCATGTGC
-CTGTGTGCAAATATGTACATGTCTGTAGCCGGTGGCTGAGGCTGGACCCCTGGCCAGAGC
-CCATGCTGAGCCCCTGCTGTTCTCTGCAGGCTGTGGGTGAGCGTGGAGGATGCTCAGATG
-CACACCGTCACCATCTGGCTCACAGTGCGCCCTGATATGACAGTGGCGTCTCTCAAGGAC
-ATGGTGAGTGAGGAGGCGGAGGGCGACACTGGGGTGAAGGctctccctttcactcctgct
-tcctctctctcctctggccctcccttcccactctccctctctttgccccCACCAGGTTTT
-TCTGGACTATGGCTTCCCACCAGTCTTGCAGCAGTGGGTGATTGGGCAGCGGCTGGCACG
-AGACCAGGAGACCCTGCACTCCCATGGGGTGCGGCAGAATGGGGACAGTGCCTACCTCTA
-TCTGCTGTCAGCCCGCAACACCTCCCTCAACCCTCAGGAGCTGCAGCGGGAGCGGCAGCT
-GCGGATGCTGGAAGGTGAGGCTCTGCCCTGAGCACCGCCGGACCCAGCGGGGGCCCTGGA
-CTCACTTGAGGGCATAGGGCAAGCAGGGGCAGAGCCCCTGGGTTTTTAGTCAGGGACTCA
-CCCAGAGGACCCTATCCAAGTGGGGAAGAGAGGACCTAAGACACATGGGAGGGAGCATTT
-CAGGGACCCATCATGAGAACAGCTGGCACGGGGAGGGGTGGACTCCGtccaggctccggc
-attcccagctgtgtgaccttgggcaaggttgctcctatctgctgcccagtttgctaaaat
-cataaattgggtatgacagtgatCGTGATAACTAGTGTTTATTCTTAAtttttaacttct
-gaaatgtttcagacctacagaaaagttgctaaattttacaaagtagtacataaagaattc
-ccatgtacctttcatgtgggttttaccacatgtgctttctttttttttttgagacggagt
-ctcgctctgtcgcccaggctggagtgcagtggcacaatctcggctcactgcaagctccga
-ctcccgggttcacgccattctcctgcctcagcctccggagtagctgggactacaggcgcc
-cgccaccacgcccggctaattttttatatttttagtagagacggggtttcaccgtgttag
-ccaggatggtctcgatctcctgactttgtgatccgcccgcctcggcctcccaaagtgctg
-ggattacaggcgtgagccaccacgcccaacccacatttgctttcttttatcattctcttt
-ctatataaaattattttttttctgaaccattttgagagtaagttgcagacatgatgtctc
-tttcccctaaataattcagtgtgcatttccttgaaaagaaaggtcattttcttacattac
-tgggtataacaatccaactcaggaaactaacgctgatacagtactggtatccagtctaca
-gatcttactcagattttaccagttgtcccactattgtcatttatagcaaaagacttggca
-ttctgctgtcatgtctcagtccctttcaaagagtccaggccagtttcttttttttggcgg
-gggttgggggctgatgtttcctccggagtggatcaagtcactgttttggcaggaccgcct
-cagcggtgctcttgggtccctcttggtgcatccttcaggaggcacGGAAGGGCTGGTGTT
-GTGCTGGGTTTTGAAGCTCAAAGGACATAGAAGCATTTATCGGTGGAATAGGGACCCTGA
-CCCTGGGGGAGCCAGGATGCCCACTTGGCCAGATGGAAGCTGGAGGTACCCCCAGGGAGG
-AGGGAGAGGATAGGGGGAGGGTCTGCCTGGCTGGCTCAGGGAGACCCACCCCCATGGGTG
-TGGACCAAGTGGGCCGCGTGGAACCACCACCCTTTAACCCTCCTCCACAGATCTGGGCTT
-CAAGGACCTCACGCTGCAGCCGCGGGGCCCTCTGGAGCCAGGCCCCCCAAAGCCCGGGGT
-CCCCCAGGAACCCGGACGGGGGCAGCCAGATGCAGTGCCTGAGCCCCCACCGGTAAGCTG
-TCCTTGGCCTCAGTATCCTCTTCTGTGCCCCTCCCTTGCCTCACCCTGCCCAGTCGGGCT
-CACAGCACCCTCTGCTCCCAGGTGGGCTGGCAGTGCCCCGGGTGCACCTTCATCAACAAG
-CCCACGCGGCCTGGCTGTGAGATGTGCTGCCGGGCGCGCCCCGAGGCCTACCAGGTCCCC
-GCCTCATACCAGCCCGACGAGGAGGAGCGAGCGCGCCTGGCGGGCGAGGAGGAGGCGCTG
-CGTCAGTACCAGCAGGTGGGCGGGAAAGTCCCTGGACAGACACCTGCAGACCGCACGGGG
-GAGGTGTAGGCCAGGAAGGGAGACACCTGCGCACTGCCGCGCCTCTCCGTTACTGCCTTG
-CCCCTCCCAACCATGCTGCTGGCAGTGACCCTGCACCTGGCTGTGACCCTGCACCTGGCT
-GTGACCTGCCCTCTCTCAAAGGTCACCCTGTGGCTGAGACCCGCTCCCTGGCTGTGGCGC
-ACATCCAGGTTCACATGCCCCACTCCCACGTGGGCTGTGGCTCCATCCCCAGCTTTGACA
-CACCACACGAGTATGGCTGGCCATGACCCCAGCACCCTAGCCATGACCCCAGCACCCTAG
-CCATGACCACACCTCAGCTCGGACCTCACCCCCACCCGTCTGTGACCTAAGCCTGCTCCA
-CCTCGCCGTGACCTCACCCTGGACTCTCCTACTCCTGACCTCTTCCCTCTCGGGCTGGGC
-CCACCCCTGACTTCCTGAGAGCCTGGCCTGGACCCTCGCTGCGCCCTAGGGGGATGACCC
-CCGACCCCGGTCCTACGCCTTAGCCCTACCCCGCCCCCATCGTGACACACGCACTAATGA
-CACAGACATTGATCCCCGAGTGCTCCCCATTCTGATCTCACCCCTGGCCCCACCTGCATT
-CCCCTTGGACCCGGTGCTGCCCCTGGCCACCCCACTCCTGTTCCCGTCTCAGCTCCTCGG
-CTTCGTCACTTCCCCACCCCTGACGTTGAGTGGCTCCACCAGCCCTGGCCCGGGCCCTGC
-CCTGCTACCTGACTCACCACTCAGACCCCGGCCCCCTTCCTTACCTTGCTGCCATTGCTG
-TCTCACCTGGCGCCTTCCGTGGCTACCTGGCCGGCCTCCCCTCCCTTGGCTTCCCCACCT
-CCACCTGGCCTCACTCCCAGCCCCGCCCCTCCCAACCTGCCTGCTCCTGcccatccccca
-ccccccaccccccatcccccagccccacccccatcccccacccccgtcccccatccccca
-tccctacTGGCTCCCAGCTTTGCCTGTGGCTGGTCTGACCCAGCCCTGACCACGCCCCCT
-GGCCCTTCCCCCTTCGGGGTCTGACCCGCCCCCGAGGCCCTGACCCGCCCCGTGGCCCCG
-CCCCGTGTGCCCAGCGGAAGCAGCAGCAGCAGGAGGGGAACTACCTGCAGCACGTCCAGC
-TGGACCAGAGGAGCCTGGTGCTGAACACGGAGCCCGCCGAGTGCCCCGTGTGCTACTCGG
-TGCTGGCGCCCGGCGAGGCCGTGGTGCTGCGTGAGTGTCTGCACACCTTCTGCAGGTGCG
-GCCCCCAGTCCCACCCCCGGCAATGCAGCTtaatcaaagccgccaattacgcagggctgg
-acgtgggtggggccctgtgctctgatacctcattggacgcccgcgaaaacctacgaggta
-ggctccgtctccccatgttgcggacgaggaacctgagggaaagagaggcccagcgcctta
-ccccaggcccacggctcatgagagaagcagcctagacgtgagcgcaggCGTGGGGGGAGA
-CTCCCTTCCCCTCTACCTTTCGCCGCCCGGGCTCCTGCAGCCACGCTGCTCTCAGCCTCG
-CTGTGGGCATCTGCCAGTTTCTGAGTCTCCTGTCATGGCCCCCCCACCCCTGAATGTGGG
-GAACACAGACCCGCTCACCACAGCGGACCCTTGTGGAGCCGCCCCTGGGTGacaggctcc
-gtgcctgcctcctgcagcttacattccagcagagaggctgatgagaatcggataatcgct
-ggttgatgtctttgtgaattgtgtcaaatgctacatacagtacattaagagacaacagga
-gtccttcccagagagggtggtctggaagcttccaaggaggtagccccagagcagggaccg
-gaaggcctgctgtaggtgtggggtgtgggcctggcctgttggaggagactgaggaggtct
-cttggtggctggagcagagggatgaagggggtaatcagagcaggatagagaggtgttggg
-tacgtgagcagcagtgaggagttgggatttgttctgggtaggatgggagtcactggggag
-acatggctgctgttctgagatagactctaggggccagatggatgcagggagcccagcgag
-gaggctcctggagtcacccaggtgggggatgtggggcctggaccagagaatcagagcggc
-agtatggaggcagggtggagGCCTTGGTGATGGGTTGGTGAGAGGGATGGGAAGGAAGGA
-GATATTGAGGAGAAGTCCACCTGGGGTGACTGAGTGAGGCCCCTGGGGTCAGGCCTTGCC
-ATGTGAGGGATGGAGTCCCCAGTGAAGGGGGTTCCTATGATCCTAACTCTTTTCCCCTCC
-CCTCCCCTAGGGAGTGCCTGCAGGGCACCATCCGCAACAGCCAGGAGGCGGAGGTCTCCT
-GCCCCTTCATTGACAACACCTACTCGTGCTCGGGCAAGCTGCTGGAGAGGGAGATCAAGG
-CGGTAAGGCCTCAGGGTGGGAGACATACCCCAAGTCCCAACTCCTAAGGAACTGGGCCCT
-GAGCAGGCAGCAGACATCtttcttttctttcttttttttttttggagatggggtctcact
-atgttgtccaagctggtctcaaactcctgggcttaagcgatcattcatcctcagcccccc
-agaCATTTTTCAAGAGCTTTGTCCATGTGGGGTGTTGAGACCCCAAGCAGAAAAAGAATT
-GAGGGGAGTAGCTAGTCAAGAAACCACATCTATGAAGGAaggacagcagagttgttaaga
-atcagggactcggctgggcgtggcagctcacacctgtaatcccagcactttgggaggatg
-aagtgggcagattgcttgaacccatgagttccagaccaacctgggcaacatggcaaaaaa
-tattcaaaaaatagccaggcgcgggggcatgcgcctgtagtcctagctacttgggtgggg
-tctgggatgagtgggctgaggtgggaggattgcttgagcctaggaagtaaggttgcagtg
-agctgtgattgtgccactgcactccagcctgggcaacagagtgagaccttgcctcaaaaa
-aagaaaaaaaaaattagtcagggaactctggagcctggtggcctgggtgtgtgaccacaa
-gtcagatatttaacctctctatgcctctatctcatctctgttagagtcagagttacagct
-tctatttccaggattgcaaagattacagtagaggatatgtgtatagaattcatagtagta
-cATccaggcgcagtggctcattcctgtaatcccagcgctttgggaggccaaggcgggtgg
-atcacctgaggtcgggaattcgagatcagcctgactaacatggagaaaccccatctctac
-taaaaatagaaaattagccgggtgtggtggcgcatgcctgtaatcccagctactcaggag
-gctgaggcaggggaatcgcttgaaccccggaggcggaggttgtggtgaactgagatcgcg
-ccattgcactccagcctgggcaaccagagcgaaactccgtctgaaaaTATATATATATAT
-ATTTAGAGTAGTGCTTGTCACATAGTAAGCCTTtgttgttgttagcgcttactgtgtaac
-aaatcactgcaggctcaaaacaacagtcatttattcagctcataaatctgcaagttagga
-cagttggccctctgtatctgtgggtaccacactggagaattcagcaacggtggatagaac
-atattcttacaaaaaaaattacaataaaaaacaaatttaaaaaacaatacagcataaact
-atttgtataacatttatgttatattaggtattataaataatctacagatgatttaaagtg
-tatgggaggatgttggtaggttgtatgcaaatactgcactattttatataaggggtttga
-gcatccatggatttgggtatctgcaggggtcttggaaccaattctctggataccgaggga
-tgactataatttgggctggacttacctggatggttcttctggtctgggcagggcctcgct
-gatttcacctgggcctggctggtgggtcagccgcggtggcctggtttataatggtctcat
-ctgtgatgactgggatgactggggcctccttccacttcaatgtctcacccaccagcaggc
-tgcccgggccttctcatgtcatggtggtctcaaggttccaagagcagccatggggagccc
-cagtgcatgtgtactttctaagtctgctcatttctcacttgacactgtcccattggccaa
-agcaagtcccatgctcaagcacagagtccattgggaagggaccacccaaaagtgtggaat
-cggggagacagaaacaaattggagtcaccaCTCCGCCAGTCTGTCACAGCGTTATGTGTG
-TCTGCATACGTGTGTGCTTGCCGCTGGCGCTCTTCATGAATTCGTTAGCAGGTTctctgc
-ctggctgctggtgatctcgagcaagttgtttcccttctgtgggactccatttccttatct
-gaaaagtggacagttgggcttgatTCATGGTTTTCAAACTGCTGGGAAATGACCTTCCCA
-GACTTGGGCACTGTGGGTTCCCAGGCCAAAACATGGCAGCCGAGGCCCAAATGGGAGATC
-CCCACAAAACACATACACAGACCTCCTCTTTATTTCTGTCCCCCCTGCCTCTCTCCTATG
-CCCCTATTTCTCCTGAGAATGCTCCCAACTTCACCAAGTGTTTATGGAGCCCAAGAGGTT
-CTGCCCCTGGGGAAAAGGGGGAGGCAGAAGAGGTAGAACTTTGGGAGTTCACAGCTCTGA
-TATCAGGAGCAGCCCCATTTTTCTCTGTTGTCTCTGGGTGGTTGCTGAGGCTCCTTCGCT
-CTGGCCTGGAGAGACCTCATGACCAGTCATTCCATATGTCCCCAGCACCCATAGCCATTT
-GCTTAGAGGTTTCCCTGTGGAGTCCACCCCAGCCAAGGGGCATTATGCTGGGGCCAGGTT
-CATGCCAAAGGGCTGCATGAACTTCCCTGGAGCCCACTGGAGTTGATGTGAGTCTCAGAA
-AATGGTCAAGTGTGACAGAGAGAAGGAGGCAGGGATCAGCCAAGTAATGTAGTGGAGGTT
-GTTTTTACAAAAACAGAAAAATATGCCTCACCACATAGAACCAGAGCAGAAATCAGAGAG
-AAAATCACCCACAAACCCAGGAAATCCTCCAATTGCATTTTATCTTATTTCCTTCAGTAT
-CTCTGGGCAAAttttttttttttttcctttttgagatgaagtctcactctgtcatccagg
-ctggagtgcaatggcgcgatctcagcccactgcaagctccgcctcccgggttcacgccat
-tctcctgcctcagcctcccaagtagctgggactagaggcgcacaccgccatgcccagcta
-atttttgtattttcagtacagacgagttttcaccatgttggccaggctggtcttgaactc
-ctgacctcaggtgatccacccacctcggcctcccaaagtgctaggattacaggcgtgagc
-caccgtgcccagccAGATATGATTTTTTAAGTCAACtttacttaagtatactttgcacac
-aataaaatgtactcattgtaagtatgcagtcaggtaaattttaacaaatgtaactctcgt
-aaccaccaaccactgttacatataacatAGGCATGATTTCTGCCTCATTGTAACCAGCAT
-GGATACAATCGCTTTAGCTTTTGTTATTTTGCTATAGAATTTTTCTAAAGATTATTACAA
-ATCTCAATAGCACATATACTGTTTATACCTCTTAGTTCTAGTTTCTCAGTTTGTAATACT
-CCTTCAAGGAATGTTTTGCATGGTGTAttcttttttttttttttttttgagacgaagtct
-cactctgttgcctaagctggagtacattggtgtgatcttggctcactgcaacctccacct
-cccgggttcaaacgattctcctgcctcagcctcccgagtagctgggactacaggcagatg
-ccaccacacccagctaatttttgtatttttagtagagatggggtttcactatgttggcca
-agctagtcttaaactcctgacctcgtgatgcgcccgcctcggcctcccagagtgttcaga
-ttacaggcgtgatccatcattcctggctGGTGCATCTTATATattattttcttgggataa
-agttaaagaagtgggatgggtaccaaagggtcagaaaagtttgggatggttgaaacgtta
-ttgccacattgctttctcagtgctacgtactagcttactagtttgtttaatttttatttt
-ttatttttgcgggtacatagttggtgtatatatttctggggtacatgaaatactttgata
-caggcatgcaatgcgtaataatcacatcatggagaatggggaatccatcccctcaagcat
-ttatcctttgtgttacagacaatccagttaacctctcttagttattataaaatgtacaat
-taaattattggctacagtctgttgtgctatcaaatactaggtcttactctatttttttgt
-accaatttgccatccccactcccctgccacgcctcactaccctttgcagcctctggtaag
-catccttttactgtctgtcctcattagttcagttgtttcgatttttagcacctgcaaata
-agtgagaacatgtaatgtttgtttgtctgtgcctggcttatttcatttaacataatgacc
-tccagttcttccatgttgctgtaaatggcaggattgcattcttttttgtggccgaatagt
-actccattgtatatatgtgccacgttttctttataggatactagtttaatcatgtctttc
-ccaacattgcttattatttATGTTCttttctttattgtgagaaaatagacataacattta
-ccattttaaccagtttttagtatacagttcagtggcattaagtacattcacactgttgtg
-caaccatcaccaccatccacctccagaacttttAGAAATTCCCCCCACTTTCTTTCACTT
-TCTTTTTACTTTTCTTTTCCttttttttttttttttttttttttttttagctaggatttc
-attctgtcacccaggttggagtgcagtgcatcagtcatggctcactgcatccttgacctt
-ctgggctcaagcgatcctcacaacccagcctcccaagcagctgggactacaggtgtgagc
-accacacctggttattttattttttaaaaaaattttttggtagagatgaggtctcactgt
-atttctcaggctggtctgaaactcttggcctcaaggaatcctcctgccttgactgacctc
-ccaaagtgctgggattacaagtgtaagccaccacacctggccTAAAATCCACTCTTTGAA
-TGGAGTTTTTCAACACTATGAGGATTACATGAAGAAAAGAGCCTGGGGCTGGGTTGGAGT
-TTCTGGGCTGGGGGCTTTCTGGAGGGTATTTAGTGGTCAAGGGTCATATGTCAGGTGTTC
-TGAATCCTGAGCAGCAAGGACATGGTGTGTTGGCAGCTCCTGACCCCTGAGGATTACCAG
-CGATTTCTAGACCTGGGCATCTCCATTGCTGAAAACCGCAGTGCCTTCAGCTACCATTGC
-AAGACCCCAGATTGCAAGGGATGGTGCTTCTTTGAGGATGATGTCAATGAGTTCACCTGC
-CCTGTGTGTTTCCACGTCAACTGCCTGCTCTGCAAGGTGGGGCCTGCAGGGACTCCCCCC
-ACCTAGTCACTGTCATCTTGCCTGGAGCTCACCACACTGCAGTGCGTGTTCTCCTGGGAA
-GGGAGCTGTGACACTGGCCTGCTGGTCATGACTTAGAGCTACATGTCAGTGGGAGAGTGT
-GGCTTGAGCCTGAACTGagccctggccccacagacggagtcccagccccagccccagatg
-gagcctcaaacctaggcagccctggttcacaatggagccccgaccctgggccagtctgac
-cccagtcacagactgaatcccagtcccacattgagccctgatcccatccAAGTCCATAGA
-CTTGGCCTCTGACCAAACCTGACCCTGCACTTGTCACTTAAGGTGGTCCCATATTCAGCT
-CAGACCCTGAACCGAGCTCTGACCCTGGCTTCTGACTGAATCTGTGACAGACTAAGGCCT
-GACCCTGGCCCTATACCACGTCTCCACCCGTGTCCTCAACTGAGTGCTGACCCCAAACCT
-AGACAGCCCTACCTGATCCTTCCCCCAGGCCTGTCCCCGCCGCTTCATCTCAAAAGTTGA
-AGGTGAGGAGCCGGTAAACAGGTCTGGAGCCTGGTCTCAGACTCAGCCTGAGCAAGCTCA
-GTCTGGGGTCATTGGGCCTGTAACCCCGGGCAGGCCCTTGTTAGGGATGCAGGGTCTCAC
-CCTAGGGGTATAAGGGATTTCTGTGCCCATCAGAACTTaaataagctgggtgtggcagca
-catgtcagtggtcccagctactcaggaggctgaggtaTATTTTGCTGTTAGCATAtgtga
-tgaccttgacttcacctccctggcgccaatatcctcttctgtaaaatgGCTTATGCATTA
-CAAAGTGAGGTCCTGCCAGTGACTACACCTAGAGGCATTAAGTGCCTTTGTGGACTCCTG
-CCCTGCACCTCACCTCTCCCAGCTTCTTAACCCCCTGAGGAACCTTCTTACCTTGAGTCC
-CTCACCCGCTACAGGCCATCCATGAGCAGATGAACTGCAAGGAGTATCAGGAGGACCTGG
-CCCTGCGGGCTCAGAACGATGTGGCTGCCCGGCAGACGACAGAGATGCTGAAGGTGAGGC
-TGGGACAGGGCCGAGGCCTAGGGATTTTAAGTTCTGGGATCCAGGTGGGGGCTGGGGGCT
-TCCCAGTAAGGGCTGTGCTCACACATCCCTGGAGGCTCTGACCTCCCTTCTGGCTGTCAC
-TCCCATCCGGAGGTGGGACTTAGGCCGAATGGTCATGTCAGGAAGAGCGTCTGGGTGGAG
-GGTGGAGACCACAGGAATGAAGAGGGGGTTGCTGGATGGAGCCTGGCCTGGCAGAGCCAC
-ACAGGAGAGACTCCACAGCTCTAGAGGGTCACCACCTTCTCCCTGCCATGGGGAGGGGCC
-AGGCTGGGTGACTGCCCCAGCCCCGCCCCAGGGCCAGCACCTGCCCCACTCCAGGTGATG
-CTGCAGCAGGGCGAGGCCATGCGCTGCCCCCAGTGCCAGATCGTGGTACAGAAGAAGGAC
-GGCTGCGACTGGATCCGCTGCACCGTCTGCCACACCGAGATCTGCTGGGTCACCAAGGGC
-CCACGCTGGGGCCCTGGGGTGAGTCTTTGCTCGTGGTGGTGTGGAGAGGGTGCCCTTGTG
-GGCTTTGCCTTAGAGGagggctgggaaaactacagcccatgggccatatccaacccagca
-cctgaatttgtacagctcccgaggtaagaatttttttttttttttttgaaacggagtttc
-actcttgttgcccaggctggagtgcaatagcacaatctcagctcactgcaacctctgcct
-tccgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcatgcg
-ccaccacgcccggctagttttgtatttttaggagagacggggtttctccatgttggtcag
-actggtctcaaattcccgaccgcaggtgatccacctgcctcggcctcccaaagtgctagg
-attacaggcgtgagccaccgggccgcaagaatgttctttacatctttaaatggttgaaaa
-aataccagaagatgactattttgtgacgtgaaaattacatgaaatccacgtttcagtgtc
-cgtaggtaaagtgctttggagcacagccgtgttcattcattcacatgttggctgtggttg
-cttttacactacagaggcagaggccgtatggctgcccggcccaaaatgactggccctttg
-cagaaaaggtttgcccactcctgCCCtagaggacagcaagtaaaggttcgatctggagtc
-agaggtggattggcccctggctctggcacatactgactgtgtgattaggctgcctgccac
-tcacctctgtcagccccatttcctctgtgaaatggagatgatagctgggcttatctcagg
-cttgttgtcagaatcaagtggaaaaattgcaagagaagtgcttagagagcctgtcacttg
-gtgagcacccttgcagatggtagctgtcgttattAGGGGTGTGCTCTGGAATTGGGGGCC
-TGTTGCTACGTTCAGGTAGACTTTCAGACAGGTGGAGGCAGAGGAAACTGCCCTCTCGCA
-TGCTGACATGTCTAGAATATGCAGAGTGGTCAGATCCTCTCCCTGGCCTGTTCCCGGATC
-TAGGCGTGGGTAGACTGAGTGCTGTGGGAGCCCAGAAAAGGCCTCAGTGACTCTCCATCA
-GGTAGCTGAGGCTGACCAGGCCATTCTTGCAGGAGGACCTGCAGAGGCAAAGGCCCGGGG
-TGGGAGAGCGCTCGGCTGTGGGGGCAGTCTCTGCACTGCGCTGACATTCTCTTCTCTTCC
-TCCCATCCTCTAGGGCCCAGGAGACACCAGCGGGGGCTGCCGCTGCAGGGTAAATGGGAT
-TCCTTGCCACCCAAGCTGTCAGAACTGCCACTGAGCTAAAGATGGTGGGGCCACATGCTG
-ACCCAGCCCCACATCCACATTCTGTTAGAATGTAGCTCAGGGAGCTTCGTGGACGGCCTT
-GCTTGCTGTAGCGTTGTAGGGGCCCTGCCTGCACTGCGGTTGTCCACGGTCACATCTGCC
-CCAGTGCCTTTGTCCTTCCCTTGGGGCTTGCCGGCCAGACTTCTCTCCCCTGCGGCTCCC
-ACCTCTGCCTGACCCCAGCCTTAAACATAGCCCCTGGCCAGAGGCCTTGCTGGGTGGAGC
-CTCTGTGTGACTCCATACTCCTCCCACCACAACACTCATCTGTCAAACACCAAGCACTCT
-CAGCCTCCCCGCCTTCAGCTGTCAGCTTTCTGGGGCTAACTTCTCTGCCTTTGTGGTTGG
-AGGCCTGAGGCCTCTTGGAACTCTTGCTAACCTGTTCAGAGCCAGGAAGGAGACTGCACA
-GTTTTGAAAGCACAGCCCGTCAGGTCCGGCTCTGCGTCTCCCTCTCTGCAGCCTGTGTAA
-GCTATTATAATTAAAATGGTTTTCCGGGAAGGGATGAGTGTGATGTCCTTGAGAGGAAAT
-GAATGTCCTGGCCTGGGACTCTACACACAGGCAGGATCCTGAGGTCTCTGGGAACTGCAT
-CAGAAAGTTGACTTGTCAGTCCATCTGTGGTAGAATGAGGCTGTGACTGAGCACTGGGAC
-CTTTCTACCAGATGTGGACCCCATGCCCAGCCTCAGGGGCAAGGATGCTCTTGGGTCACC
-GTCAGCCAGGACAGGTGGAGTGTGCAGTGTGTCAAGTCTGCAGAGAAGGATGGGCTTAGG
-GGCGGGAGGGGAAGTCTTGCCACTCCTGCTCCCTTTTGACCTCTCAGCAGGCATCTAGGG
-TTGGCAGGTAGATAGTTCAAGAAGGAACGAAGCTGCTGCAGTTGAGGGGTGGGGTTGTCC
-ATCCTATTTTCTCGTCTCAAGCAAGATGGCACAGTATCGATTCAGCAGTATTTACTAGAA
-CCCACTCTGTGCTGGTCGGAGGTTACTAAGACAGGGTCCTGGGATGTTCATTCTCTAAGT
-CTTTCCTCCGCTCTGTGACCCACCCTCCTTCCCCTTTTGAGATCTGGTATTTGATGCCCA
-ACACATTGTCCACGCTGTGACGTGACCATCATCATAGCAGGCAGAGGGCGCCTCTGCTGC
-TGAAGGCCTGTGATTTTGTGGGGAAGGGCCTGTTCTAGCAACTGGAAAGGCACTGCCACC
-TGCCGTTGGATGCCAGGACTCAAGAGCTGGCCCCAGTCACTGTGCGCAGAGCTGTCTGAG
-AATGTGTGAGTGGACTGGGTCCTTCGGCACTGCCTGCATTGGCTCAGGGCAGTCAACCGT
-CGCAGAGGATGAGGGGCACACTCAGGCAGCCTCCCCGGCCCTGGAGGCAGAAAGGCCCAG
-GCAGAACCACTGACTGGGAGGAAACAGAAAAAGCAGAGGAGAGCCAGGCTGCAGGCGTGT
-GGATGGGACCAGCTCAGGCAGACGCTGTCTCATACCCACTCTCCCCTCTCTTGCCAGGGC
-CTGGCCTGGTGTCTCTCAGGAGCCTGGGCATGAGACAAAAGCAGAGATTGTTCTCTTGTG
-GTACCACAGGCTGTAACCAgtccacccagtgttgttttagaaatttaaatcggttgccca
-tctttttaaattggcaacatcgtttaccacattaaaatctagatgccctgcttctcttga
-aaatgtcaaagcttggtaatgccaggtcctcacttctacctggggggaatggagtcacag
-agatgtcaaatctcttcatggggtgtacaccctccagtttgccacagtcctcaccACCCC
-AGGACTCACGCCGAGGCCTTTCCAGTGCCCTTGCACCATCCTTTTTCTCGTAAGAGGAAG
-ATGAAGTGGGGCTCTACGCGCGGCGTATCACAGGTGAGGGCGAGACCAGCAGAGAGGGCT
-GTGCTGGCTGTGGCTTTGCTCGGCCTGCCCCATCCATGCTGCAGTGGTGCGGAGGAGCAG
-GGAGCTGTGTAGGGCCAACCCCGGTTCCTGCCTCAGCTCCACCCGCCTTGCACCTGCAAG
-TGAAAGGTCTTAAGACGAGCAGGCCCAGGGCACCCTCTACTGCAGGGTCAGGTGGAGGTG
-CCTCCACCTCCCAAGGCTCACCCATGCCAGGGGCCCAGAACTTGAGAGGCCAGCACCAAC
-TCTCCAGGGCCGAACGAAAACCAAACCCCAGGGCTTTGGACTCAAACCATCGAGAGGAAG
-CAGCAAGAGGTCCCAAAGGTACTTGAGTGACACAATGATCATCATTCTCTCCTCAGGGGC
-AGGACAGGGGCAGGGGAAGGTGAGTGGAAGCCCATTGCTCAGATAAAGAGCAGCTGCCAC
-GGAGGGTAGCCCGTCGGCCTATGCCGGCGCTCACTGGTGTCTTCCTCTAGTGCTTGGGGC
-TGGCATGGAATCTGCTCAAATGCAGGCAGCTGAAGGTGAGCCCGCAGCCTGGTGATCCCA
-AGTGCCAACCATGAGGAAGTCTGGAGAAAAGACCAGGGAGCAGGGGCCCTCGTGAGGAGC
-AGGAATTGGCAGCAGGGGCCACCAGCAGAACACCAGAGGGGACAGTGGCAGGGGGAGGAA
-GATACAGCCAGGCTGGGTCTCAGCCCCAGCTGAGGGTCTCACCTCTTAGCTGGTGAAGGC
-TCCGGCCTGTTCCTGCTTTCGGTCACCACTTCATCCCTGGGTGATCGTGGGCCCGGTGCA
-GGGCTGGCTACAAGTGTTTGTTGATTGGTAACTGCTCATGAAAATGGCAACAGCACTAGC
-ACAGCTTCACAAATAGAAACACATTTCACCAACACCCTTGCAGGAAGCCCTCCAGGAGGG
-CCAAGACCATCCCTGCTTTACTGTTATGGACGTGAGCCTCCGAGAGGCAGTGACTTAGAT
-GCTCACCCAGCCAGGAAGGAAGGAACACACTCGACCCTCAGTCTAAGACCCCATCAGGCC
-ACTAATAATTCTCCCTCCAAACCCAGCTCAGGTCAAGGCCTATCTTCACCCCCAAATCAT
-CCCTAAGGCAGCCTCAACTCTCCACAGCACTACAGCCATCCTGCCCGGCCCCAGTGCTCC
-ACAGACCCTAAACCCGAGCCCTCCCGGGCTTTGTTGGCCCCAAACCACCTACACTTGTTA
-CGTGTTATTTTTACACTGGCGTTTCCCCTCAGCCTTGCATACTGTGTGGTGTTGTCTGAC
-ACCACTTTTCCAGCTCtctgacaccaactggggctagtgtcaggttccacagattaaagg
-gctcagtcccacacttccgatggagtcacagatggggtgcccaggctacccacacttcct
-gggctacccacacttcctgggctacccacacttcctggccaactacacattcaggggttc
-ccatgactccaccccctcaggttcaataatttgcctgagtgactcagaactgaagatcac
-cctgccctgacgcttcctggtgtggtgtcctcaaggatgcagtgtgggcaggaacagcca
-cgcttgagatgaacagggttagggatgggagCGACTGGCAGCCACTGCAATCTCAAGTTT
-TGGGGttttttttgttttttttttgagacggagttttgctctgttgcccaggctggagtg
-caggggtgcagtcttggctcactgcaacctccgcctcccaagttcaagtaattctcctgc
-ctcagcctcccgagtagctgggattacaggcacccgccatcatgcccggctaatttttgt
-attttagtagagacggggtttcaccatgttggccaggctggtctcgaactcctgacctca
-ggtgatccacctgcctcggcctcccaaagtgctggaattataggcgtgagccaccgcgcc
-cagccCTGAATCTCAAGTTTGTAAAGTGCTCCACCTCTGTCACTCCAACTCCCAGGAGTC
-ACTGCTtgggattgaaagtttccgccctcgaatcacctggtctttctggtgcaggagcaa
-ccccgaggcaatctaggggccctgctctaacgaattcattagcatgaactcaaatgggct
-ggaaaggggttatgaataacaaaagacactcaccactcacgaaattccaagggttgtagg
-agacccgtgttaggaacccaggagaaagaccaaatatttcttagtatcccacaCATACCC
-TTCCTTTAGTTCTCCAATTATCATAATTCTATTCATCCTTCACATTCCACCCTCACCTTC
-TATGAAAGTGCCCTGAATTTGCTGCAGGATAGATTGCTCCTGGAGTGCAGCTCTGGTGTG
-AGCTTTCAGAGGCAGCGCAGTGCCCTGGGCAGCCTGCGTAATCCACGACTGTCAGATCAA
-AGGGCAGTGTGACCCTGGCCCACAGTGGCAGGAGCTGAGTGCCACTGGCTTGGCCCCGGG
-AACCTGCGCATCTCCCCTCTGAGCCAAGGAAACAAACAACACAGACAACAGTGTCTCCCC
-GATGGCCCCATCCCCAGGGTGGAGGCCCTGCACCGGGCACTGCTCTGCGCGCGCGCTCCC
-CAGCAGCCAGCAGTGTCTGGAGGATACTGGAAAGCTTGGCAAGAGTAGGCTGAGCAGCTC
-CTCTGTGGACAGAAAGGGCATGTGGAGAAGCGGCACATCAAGCTCTGGTTAGGATCCAAA
-ACCAAATGCCAGCTCCTAGGATCCCCAGACCAGGGTGTGAAACACACCAAGAGCACCCCA
-GACCCGCACCAGTTGTGTCGACTGTGACAGTACCCAGAGTGGAAAAAACATGAActcaaa
-ctgtgttttcctccactgctctctcaataccaacagacatctgtggccaaatgtgttggg
-gatttctcccctgacaccaagcaagcaagcaattctgcagcctacatcagctgggtatcc
-tccaattcaattcagtgctcaccctacctatagtatctggaaatggaatccacaggttca
-aggctctgtcccacaagaccgccgcctctgccacaacattggactgaccaccctctttgg
-gtggcatgatttgccaagagtggctcacagaactcagggaaacttatgtttaccagttta
-ttacaaacattattagaaaaggatacaaataagtaaacagccagatgaagatacacacag
-ggtgaggtctggacgggtcctgggcaaatgctggagcttctgtccccatggagtgggggt
-gcgccaccctcttggcacatggacaagttctcgttcccctccctccacatgttcagctct
-tcagaagctcccgtgttcctgggccttttatggagacgtcattggataggcatggctgaa
-gcatggcagctgtgttgagatgaaactggacaaaaagcataaggtctaaacccagcaagg
-cctgtctgtccagatgcttcttggcctctctgtgcagcgttcctccttccgggtatgggg
-cagcaccctctctggaatgagggtcttatgagctacagtcagattaaagtctggtgttga
-gcaagtgaaatggggcaggagaaggtcacagacagagattccgttttctgaggcctgcag
-tgtcccaacattataacaaagggttatgggagtgatgaaccaggaactgtggacaaaaac
-atctacacacgtataaaatatcacaGTGCCCTGGGCTGCAGCTGGAGTGTGTGGGTCATA
-ATtcttgcagatgaaacagaaacagcaagactgtaggtactgcccaaggtctcctagcca
-gtcaaggctgaccaggagtcCACAGACCATGGCACAGTTCTGGGCCTGACATGGAAGGTG
-GGAGCATCCAGATCAGAGACCATTCCCACTGAGCGGTGGCCAAGGACGGAATGACAGAAG
-AGGTGATTAGTAACCACATATGGCTGTTTATTTGATACAGGGCTCTGTACAAAATATTTA
-CACATATTCTTTACAGAATAAGTAAACCACCTGAAGGTAATTAGATAATGCTTTCTTCTC
-AATGACAGGGAGAATCCTGGTGTCAGCAAAGTTAGAAAACAGATAAACATTCTCCTTCCG
-AGGCCACAACTCAAGCAAATGCCACTTGCTTCCTAGGATCTGAAAAGCTGTGGCCTTGGG
-ACCCTGGTCACATGCACCTCCTTTCCTCAACCCCATCAATTCCTTCAGTATTTACAAACA
-GGCTTGAGTACTTGTGGAAGGAGGGGCAGCTGGTGCCGCCCACTGAGAGGATGACAAGAG
-GGCCAGCTTGCTTTGGGAGAGCACTGGGAATATCTGCCGCATCATCACCTCTGGAAGAAT
-TTCCTTTGCCCTGATGAATACACCACTGTCTAAATTAATCCATCGACATCACACTTACCC
-CACAGTGGGGCTCCTGAGCCATGGACAATGATCCATCCCTTTGAGCTTTTTTTGGTTTTA
-AAGTGCGTAGTGGTggctgggcgtggtggctcacacctgtaatcccagcactttgggagg
-acgagacgggcagatcacctgaggtcaggagttcgagaccagcctggccaacgtggcgaa
-accccatctctactaaaaatacaaaaattagtcaggcgtggtagcaggtgcctgtagtcc
-cagctactcgggaggctgaggcagcgagaattgcctgaacttgggaggcggaggttgcag
-tgagctgagactgcaccactgcactccagcctgggcaacagagtgagactccatctcaga
-aaaaagaaaataataataaaataaaTAAAAATAAAGTGCTTAGTGTAACTCAGCGGACAG
-GGCTCCCAGCTGCTCTGGCACGTGGGACACCCTCCACCCTGCACACAACAGGCATGCAAA
-GAGGACTGGATATGGTGGGGTAGAGTGCTTCTGGTGTGTTCACTTTAAGAAAACATCTGC
-CAAGAGAGAAGAGTGCCCAGGAAAGACCAGGAAAATACAAGTACATGGCTGCTTCATACC
-ATATACCCCAATTCTTTAAAGCAGCAAAAGGCACTTTTTTTTTCAGGCCAGAGTGAATCT
-AAAACAAACCTGGCTTTGCTTACAGGGAAGCTGTCCCAGAAGGACTGAGTGATGCCTCTT
-GTTCCCTAAGGTCTGGAGAGTCTTTGCAAGTTTCCAACGACATTTCCAACCAGGTGGGAG
-AGACCAGCAGTTGACGAGTCAAGTCAGACCCAAAAAACGACGCCAAGGTAGTGAGTGGGT
-GCCTATTTGGGAGTAGGATGATTTGAGGAAAACAGGAAGAAAAACCGGTCAGAAAGTGGC
-ACTTTGGAAGTGGAAAGCTGTTTGCAAATAGCAACTCTGGCTAAAGCGAAAATGTTAATC
-AAGTAGAAAGTAAAATTCAGGATCTTAGAAGCTCATCCTTCTGATGAGAACTATTTTTTT
-TTCCGTGAAGGAACTATTATTACTTTAAAAGTGAGGGTAATTTACATATGGGGTGTATAT
-ATTCTAAAAATAGTAATAAAAGTACCTTTTATAAGCAATGTTGTGTGGCTTGTAGAAGAA
-AGCAGGGAGGAAAAAAAGGCAGGCAAAACTAGTCTAGGTCTAGGCCCTAAAAATGAGCTT
-CCTTCCCACTTGACTGGAAACGCCCATGTGATTTCTAGGCTGAAAATAGGTAGGATTTAA
-CGAGTAACCTAGTTCCCTTCTGTCTCTGATTTCTGATCAGCTGATGGAGCTGCTAGTAAG
-AGGGGCCGATCATGCTCCCAGACGAGTCCTTTGGCCTCTTGCTCTCCATCCCAAGCCTGA
-CTCCTTCAGCAGCAGCCCCCTCCTTCTGTGTCCATCTGATGCAGGCAAGCAGGAGCAGTA
-AGAGGGCATCCCATGTTCCAGTTCACCTTCTATGGGGTGACTAGGAGGTTCCCGGTAACT
-AGGGCAGCCCAGGCCCAGCAGGTTGCAAAAGCAGCTGCAAGCTTCAGAAACCCACTTCCT
-CCAACACCAGGGAGGTGGCAGAGAGCCCATCCAAAAGCCCACTGGGAGAGGCATAAGATT
-CTGTGCCAGGCCCCCAGGTCCCCTCTGTGTCAGGTAGGCTCTGCTACTGGCCTCTGAAGT
-AAAGGCAAACACAAACGGGCAGGGCAGGGTGGCAGGAATAAAAAACTCTGGACAGAAACC
-CTTTTAATAAAGGAAATTCCACCCCTCCCAATCCTTCCATGGAAGGGTGAGACCTTAATG
-TGATGTAAGAGGAAGGTCTTCTCTGGCTTTCAGGGAAACAGCTGCAGCTGAAACTTAGGG
-GCCCATTCCAGGGCACTTTTCACCACAGCCAGTGCAGCCGCTCCAAGTGCCACTGTCAGC
-CCCATCACTGCCAATTTCACAAAGCGGTTGGTCCTTGGCTTGGTCAGGACATCTTTTGTT
-CGATCTTCAGGCCGCAGAAGTCCCCGAAACCGCTGCCGCAGCACCATATCAGGCCTCTGC
-TGGGCTGATGCCAGCTCAAAGTCTTTGAAAGTAGAGGCTGCCGTCCTGCAGGGGAAAGAG
-ACGGAAGGAAGGAAGTGGTATGAAAGAGGAGGAGGAAAGCAAAACTACACCACATAGGCT
-GCGGGCAGAGCCTTTCATTGCTGGGAAAGCTCTTTATGATAAAGACCCATATGTCTACAG
-TGGGGATTCCACTGGCCTAAGCTCAGATCTCTGGAAACATGCCCCAACCCTATCCCACCA
-GACACAAACCTTCCCTCGCTTCTGCTCATTTACAGCCACCCCCATTCAACCAGTGTCCCA
-GCCTTGCTCACCTCTCAGCTTGCTGTTGGGCAGCGGCCTCCCGAGCAAGTTCGGATGGGG
-GAAACTGAACAAAAAGGTCTCCTGCTCTGCTGATCAGTGTCTCATAGGGCAAGTCCTGAG
-GGATCTGGGACAACAGGTGGTGGACCGAGGCCATGTCACAGTCACAGTCCAGGACTTCCT
-GCTCGCGATACAACACAATCTGTGGGGAGGTAGTAAAGCCTTGCAGTCAGAGGCCAGACA
-CACAGGGCCTGGGCCACCTGCACTCCATTATCCTTGCAGATGAATTTAAACTGGTAACAG
-ACAGGACTCAGCCCAAATGTTGAGCAAACTCTTGTATCCATCAAGGAAGTAATAACATAT
-ATACGCTCAGTGCTACTCCTACTCTCTGGCCCTTCCTGCAAACTTCCACCACATGACATG
-AAAGGCTGACCAGTTACAATCTAAGTCCTTCGGGCATGCTGGGCTGCTCAGGTGTCCCTT
-TAAGTCTTGAAAGAAATGAAGGAGATTCTTTTAGGAGAAAGTAGGAGAATTATTGGGAGA
-TTCCTGGAGCTCCAGCATAGAAGAAATGGTTCAAAACAGTAGAAAGAACAGTCTTGCTCC
-CTTTAAGCATCTTCCTTCTGACTGTTGGTCCACAAATCCACAGATGCTCAAGGGACCAGT
-GGTCATTGAAGGACTTCCCTGAATTCCCATCTCCACCCCATCCCTCAAGACCCTTCTACT
-AACTGAAGCCCCTACCCTCCACCGCAAGCCGCCTCCCTTGTCTGTCATGACACCAGATCT
-CTTCTTTTCTTAAATCTGGAGTTGACAGCTTACGCTACTATTTCCCTAATTGTGTTCATC
-AGCTGAACATATATTCCAGACAATGTCAACAGGAACCCTGACAattcacaatgcagatta
-gcattttaaaggttcagaagtgtcatgcagcaaaaaaaatctgattttgtttatacccag
-catttcccaacttactATTTTTTGTGTGTGACACCCCCATTAATACTGCACAGAATGGTG
-TCCAGGGACACCAGCCTGGGAAGTGCTGTCTTTTGCATCTTTCCATAATCCCCAGGTTTC
-CCTTCAGGGAAAATGACCACAGTGGGATGGGTGATGGTGAACCCAGCTGCTGGCTCGTGG
-CCTGTACCTACCACGGCTGCAAAGTAAATCGGCATCAGTGGGTGGCAGGCCAGGAAGAAG
-TCATATAACCGCACGACGTGCCTGAAGTCAGACAGGACATGCCCAAACCAGGTGATGAGC
-CAGCTGAGGGCAAAGATGGTCCCTACCTCAGCACTAGAAACAAAGGAAAGGCAGGTGTCA
-GGTCCTGTGGGCCATCCCTTCCCTCTCTCTGGGCCTTATAGCGCTGGTGAGAAGGAAGCA
-TTTAGGAATAAGATTTCTGGAAAATTCAGTTACCTAGGAATTCAGCATCTTCTCCTTACA
-AAATATTTAATACAAAGTCTTTAAGGTGTACCACAACACTAACACCACAACAGGGTCCTG
-GCTGCTTTATCTCACTGGGTGCTCGCCTACTGGCCAACAAATGTCAACTACAGGAACGAG
-AAGCAGTTGTTTTCAGAGAACTACGCCATGATTCTCCTTCTGACTAAGTCTTACCCTTCT
-GGGGGGCACAGGTACATATTCCCAAGCCTGAAAACATGACTGCATTAATTTTTCTGTTAA
-CATGAGACAACTGAAATATCTTAAGATGTAGCTgccagacacggtgagtcacgcctataa
-tctcagcactttgggaggccaaagcgggcggatcacctgacatcgggagctcgagaccag
-cctgaccaacatggagaaaccctgtctctactaaaaatacaaaattagccgagcgtggtg
-gcgcatgcctgtaatcccagctacttgaggctgaggcagaagaatcgcttgaacccggaa
-gatagaggttgcagtgagccaagatcatgccattgcactccagcctgggcaacaagagaa
-aatactccatctcaaaaaaaaagaaGGCATAGCCATTACCttttaaaaaattttaaaaaa
-aGAGGCATTGGCCAAGAACACATTTCCAACTAAACAGAGAAGAAACAAAACATCACATGG
-GATTTGCAAAAAAATATTTCTTCTCTTTGGTACTTGGGAAATAAAACAACCCATTGTTGG
-CCTTCCCCTTCTCGCCACTGGATCCCACAGGACTTTGTGTTTCTCTTGTGGCAATAACCT
-CAACATCTTACCTTGGCATACATACCTTATCCACCTCTCCCCACTAGATGTAAACTCAAG
-GGATGGGCTATGTCCCCCAAAGAGCACAGTCCCCAAAAATGCTCCAAGAACTGAATTACC
-CAGATTGCTGGTGACTGGAACAACTGGGGAGAACTTAACAAATCCACCCAAGACAATGAG
-GAAACTGCGCTCGGCTTGTGAGGAGTGTTTCAGGTGTGGGGGGGTGTGGGCGTGTGTATG
-CATGCACACAGAAATGCAGACACATATGTACCTCTGCATGAAGTCATGGAGCTCTGGATT
-CACCTGGTCAATGATGGGCATCAGATAGTTTAATATATGCTTGGTGTTGTCCATTGTTGG
-ATCCATAAAATCCCTGGAGGGAGACAATTCAATAAGCCTGGTTACCAAACACTTAGATCA
-GGGCTCAGGGTGGCGAGGGCTCAAACTCCTAAAAAAGCTGACCAGAAAACAGGCCAGTGA
-GTTATCCCCAGGACGGCTGAGGAGTGATGCCCGTCGTCTTGTGTTCCTCTCTACTGGTAC
-CTGAGGTGGTGGGTAGATAATTTTTCTACCAGGGATGTTGCCAGCCTCTCGCCTACCACC
-AGCAGAAATGTGACCACAATGTCATGGTAGCCCTGGTAGTAGTGCAGCTGAGGGTTGCGC
-TCCAAGATGAGGAGGATGATGTCAATCAGTTCTTCCTGGAGCCCTTCTCTCTGTTCCTCT
-GGCATGCCTGGGGACAGGAACAGAGATGCCTTTGAACATACCAAGCAGCCTAGTTAACAA
-GGAGGTCGAAGAAGGCCAGCAATGAATTTTCAGAGAAAAAAGGAAAATGAATTACAAATA
-ATTTGGCAACGCATATCAAGATCCACTGTTGATACCACCTGGCATACAGGAAAAGGCAGC
-TGCtagctttccagtaggggaagctgcagatgccaccctaaccaagttgctgcagttaat
-actgctgggacacagtatttaactgcagaatttcaactatgggagccacagacggcctct
-gcctcccgaggtgatgcactgacagagctcagcatcatgtctgcaggatttctatcaaca
-gcgcacagacctcaatctcacaatgaagaaatacccaatatccccaaaggaagagaaatt
-taactctcatacaatacaaaggaactgttccagattaaaaatggctaaagatataggaca
-acagcatgagaaacgcataaatctatatttccttttccagtgaagcacattactcgaaga
-aatggtgaaatgtgaataaaatctgtggattaattagttaactatttttcagtgttgtta
-ctgatgttgctcagtgtactgtgattacatgagagccttatatttaggaaatatgtcctg
-aaacacttggggtaaaaagatgtcatgtttgcaacttactcttaaatagttcagagaaaa
-agtgtatgtctatgtgtaaagcgaaggaaagacagaaagcagctaaaaaagcaaatgtag
-gccaggcgcggtggctcacgcctgtaatcccagcactttgggaggcagaggcaggtggat
-cacgaggtcaggagatcgagaccatcctggctaatatggtgaaaaaccccgtctctaata
-aaaaatacaaaaaattagctgggcgtggtggcaggcgcctgtagtcccagctacttggga
-ggctgaggcaggagaatggcatgaacccaggaaccagagcttgcagtgagctgagatcgt
-gccactgcactgcagcccgggcgagagagcaagactccgtctccaagaaaaaaaaagcaa
-atgtagtaaaatgtgaaaacaaaaggaaatctgggtaaaaggtatctggggaattctttg
-tcctatttttacaacctttcagtaagtatgaaattatataaaaataaaaaAATTTTAAAG
-TTACACGGTCCCCTTTAAACCAAAGCAAACGTTACAGGAAAAACTGATCCTCTTGATCCA
-AAGATGTATTATAGCTGGAAATAGGGAAGCCTGTCTCAGGAGTTCTTTCAGGGAGTTCTT
-TTACTGCTGGAGCTAGTGCTGCCAGCAGTAAAAATGCCTTGGCCTTATGAGCCAGGTTAG
-AAGAATGGCACATGCACAGCTTCTCCACACCATTAGCTTTCAGTTACAAACACATACTCA
-GAGAGAGAAAGCAGCTAATGTAAGGGCCCAAACTAAACCGGACAAAGGATTGCAGGTAAG
-AGCAAAACTCACCTCTTGCCCATATTTACCCCACCCCTTCTCAAATAAAAAGCATACCCT
-AAAAGATAAATAAGGAAACGAAGCAAACCCAGGGCTGCTGATAGGTGAAGCAGTGAAAGG
-AGTGAGAGTAAAAATTAAACCCTGTGTGAATTTTCAGCAGAAAAGCAGTGAGCCAAGCCC
-AGAAGACCATGAATGGAAAAAGAATATGAAGCCACACTGTAAGTTCAGCCTACAGAAAGC
-GTATCACAGATATTACATCAATGGAAGAGGAATAAAGGGTTCAGAGGGAAAACAGGTTAC
-CTAGGAAAAAATGGGggtggctcttgcctgtaatcccagcactttgggaggctgaggtac
-gtgcatcacctgaggtcaggagttcgagagcagcctggccaacatggtgaaaccccatct
-ctattaaaaacacacacacacaaaattagctgggcgtggtggcgggcacctgtaatccca
-gctacttgggaggctgaggcaggagaactgcctgaacctgggaggcggaggttgtagtga
-gctgagacagtgccattgcactccagcctgcaacaagagtgaaactctgtctttaaaaaa
-aaaaaaaaaaGGGAGGCATCTGTCCTATATGATCTCATCCAAACCAGCAGGCTAGGAAAA
-GGGAATGGACCGTGGGCATGTGCTTTTATCAAAACCACGCTGGCAGGCTACTGCTACCTG
-GGTATTGCAAGAATCTGTCCAGGGAGCAAGAATGCCAGCAGGAAAGCAGCCCCTTCAACA
-ACAAAAGCCAGGCCAGAGCACAGTGCAGAAGAGGGAGGCAGCCAGCTTAGAGGCTCCTGT
-TCCCTTTAGCAATTCTCCTCTCTTCATGACCTAAAGGTGGAGTTGCCAGAGGAAGAAAAA
-TAGGTCATCCATGTGAGGTTTGTTGCCCAGTTCCCTTCACTGTGAAAATTGAGACAACGG
-TCCTTCTTTTCTTTCTTCCTGAAATAAAGAGGTAATTTTAGGAATACATTCTTTtttgtt
-tgtttgttttgtttttatttatttatttttttatctattGCTGCTTAATTTGTTAATTAA
-GGAATATACTCTTACACAAACAGGGAATGGCCTCTCTTCCCTCTAAGGAATCTTACATAT
-GTATGCGCAAGGTACCATCGTTTTTAAACCTAATTAAGATATTACTCATTCTTGTTGGTG
-CCCAATTCCACACCAATCTGCTCTTTAATGCCAGACTGATGGCTCTAACAATCCTTATTA
-ACTCCTTTTTGTGGCTTCAAGGAAAAACAAAAACCTCTTCTCTCATTCACCACCTCTAGG
-CCAGGAGAAATTATTTTTGGTTCAGGCTTTCACAGTGGGGGTCTGAAAGTGACCAGTCAA
-GAAAAGGATGACTCAGCAAAAGGAGAGCTCTGAAGGTCCCTGAGGCGGCAGGGTCCAGCA
-TATTAGGTCACATGGTATGACCTGGAACAGATACAGTCTTTCCAAATGTGGCAGGACCGG
-GAGAGCTTCTCACCAGGAGGGAACCGCCGCAATGACCGCCGGACGTCCAGCAACACTTGT
-TGGTAGTCCTTGCTCATCTGCCGTAGGTTCTTCCCTATTGAAGGAAAAGGCACGTTATTG
-CAGGAATGCCTGAGAAGCCAGACCAGAAGCAAAACATTCTGGGATGACACAAAAGGCCTA
-GAGGGCACATGTCAGCTTCTCCTGAAGAGGATGATATGACTCAAGATACAACATTTGGCA
-GGGAATCCCTAGTTTGGTTCCAAACATTATGTTTCCTGCAAGTCACAATGACCCTAAGAG
-AAGGGAGCACAGACTGCCCAGGAGACAATACAGCAGGGTGGGAAGGAGAGCAAAGACGTA
-AGGAGGCCAGGCGCCTCGTGCAGAAGGCCACTGTGCATCACTGGGAACTGCTCTGAATTT
-CAAAGTCCACAGCTACAAAATGAGGATATTCCAAGGATCAAATAAAATCATGAATGTGGG
-AACAACAGACCACTGAAAAAAACCCTAACGCCTATAAAGTTGTGGGAGCACTAAGCTGTT
-TAGAAAGGTATATTGAGACTCACATAAAGAACCACCTAACAACTCTTGACCCAGCAATTC
-TAAAACTAAAGAGCTGCAAAGAGGAGACAGTCCTTGTGTTCAGCTGCTAAGTCCAATACA
-GCATGAAAGGAGGCAGTCTCTAGCCATTATACATATAACAAGTGTACATTTCCTCCAACC
-AAACCAAGTGCTGTATAATAAGCGTACATTTCTCTCACAACCCAAATCCAAAGCTAGTAA
-GGCTGGGCAACACTTCCTCACACGTAGGCTTCACGGTATAAAAAGATGAGGGAAGTTTGG
-AACCTGATAGAAGAACATCATCTCAGGATTCAGGGTGTGAACATGGCACTGCCTTAGCCT
-TCCAACAAAAAGCTGACTGCTCTGAAGCAGCCAATTCCAAGGATAATAACAAGTGGCAAC
-TCAACACCTACTGGGTGACATCATGACGCTGTGAACTTTTTGGTGGCAGAAGTCCTGTTT
-CAATCATCTCCAGTACCTGGCAATCATAGCACAACTAATATTTGCCAACTGAAAGAATCC
-TCAGCACTTGGCATTTTGCCATGATGGCAGGAAAGCTACAAGGTGAGTGCACTGAGTGAA
-TGAGCAGCAGAGTGGATTCACTGTTCTACAGGACTTTTACTATTTTGAACTTCATTCCAA
-GGAACTCTTTTCACCACATGGGCCTTGCACATTAGTTAGGTAACTCTTTTCACAGAATTA
-CAGGATTTTAGAACTCCAAAGGATTTCAGTATTTCCCAATAAAAAGAGGGTGttttcttt
-ttttttgagtatctcactctgtcgcccaggctggagtatactggcgcaatctcggctcat
-tgcaacttccgcctcctcggttcaagcgattctcctgcctcagcttccctagtagctgga
-attacaggtgtgtgccaccatactcagctaatttttgtatttttagtagagatggggttt
-caccatgttggccgggctggtctcgaactcctgacctcaagtgattcacctgcctcagcc
-tcccaaaatgctaggattacaggcgtgagccactgtgcccggACAAAAGAGGGTGTTTTT
-GTGTGTGTTTAAttttactttacttttagagattggatcttgccatgttgcccaggctgg
-cctcaaactcctgggctcaagtaatcctgcctcatcctcccaagcagctaagactacagc
-cgtgcaccaccatgtctggctagtttttaaatttttgtagagacagggtttcgcaatgtt
-gcccatgctggcctcaaacttccagtctcaagtgaccctcctgcctcagcctccgaaagt
-gctggaattacaggtgtgagtcacctcgcccagccACAAAATACGCAttttttttttttt
-tttttttttttgagacggagtctcactctgtcacccaggctggaggacagtggtgcaatc
-tctgctcactgcaacctccaccttccaggttcaagcaattctctgctgcagcctcctgcg
-tagctgggattacaggcacctgccaccatacctggctaatgttcgtattttttttttttt
-tttttagtagagatggggtttcaccatcttggccaggctggtcttgaacttctgacctca
-agatccacctgcctcagcctcccaaagtgctgggattacaggcgtgagccaccacacccg
-gccCAAAATATGCATTTTTAAAAAACACTTGCCAAGCAAGTATGCAGAACAAAGCATATG
-CATTTTTAATAAATTCACTTGCCTAGCCAATATTTTAATCCCTAATAAAAAAAGAACTTG
-Cctgggcgtggtagctcatgcctgtaatcccagcactttgggaggccgaagcaggctgat
-cacttgaggtcaggaattcgagaccagcctggtcaacatggcaaaaccccatctctacta
-aaaatacaaaaattagccaggcatggtagcgcatgtctgtaatcccagctactaggaagg
-ctgaggcaggaaaattgcttgaacccagggggcagaggttgcagtgagctgagattgtgc
-caccgcactccagcctgggtgacagagcaagactccgtctcaaaaataaataaaataaaa
-acaagtaaaaaaaGAACTCATTCCACTTTTGAATAAAATTCTACTTATCGGTTTGGCCTT
-ATTTTCAGAGTGGGCCCAAGCATTTCCCAAAACACCCTAGATTTATTCATATACCCTTGG
-TTTGAAAGGACCATAAAAATTAAAGATCCTGGAATTCTTTTCCCCCTGTCTCCTAGATAA
-GCTCCCCTCACAGCCTCCCCCACTCCCCTTACCTGATATAGGAGGTGGGTCATTGGCATT
-GACATTGAGGAGCTTGGGCCACACTTTTCGTCTGATCTCATCAGTCAGGAGCCCTCCTTC
-ACTGATAGCCATGCGTCTAAGGGCAGCCACATCAGTGGGATCACTGTTCAGAGCCTGGTG
-TATCTCTGCCACTTTCTTTTTCCTTTTGGCGTTAAAGTCTGAAGATAAGGATAGGGAAGA
-ATTAGGCGCACATTCAGCACGTGCATATTTTCTGCCTAGGACTCAAGCTCCTTTTTGATA
-TGAGGTACAGGTAAGTATCTCCTCTTAGCTCTAAGACTGCCTGCTGGCATAAAGTCTCAC
-AGCCAGATGCACTATTCATTTCGGGCCCAGTCTACTGGACCTCATGGTGGGAGGCTTGGA
-GAGCCCACTATAAAACAGATTTTAAATCACCGATTTTTAAAAAGATAGTCTCTTTTTATA
-GGTCTGAACCAAAAATCATAGGCACAGACTGGAAATAATTATTAGTTGTTGTTGTTTTTA
-AGAGACAGTGTCggctgggtgtggtggctcatgcctgtaatcccagcactttgggaggcc
-gaggtgggcggatcacaagttcaggaattcgagaccagcctggccaatatggtgaacccc
-cgtctctcctaaaaatacaaaaattagctgggcatcgtggtgctcgcctgtagtcccagc
-tactcaggaggctgaggcagaagaatcacttaaacctgggaggcggaggttgcagtgagc
-cgagatcgtgccactgcactccagccaggatgacagagcgagactccgtcttgaaaaaaa
-aaaaaaaaaagagacattgtctctctaagttgcccaggctggcctcaaactcctaggcaa
-aaccgatcctcccacctcagccttccaaacagctgggactacaggtgcatgccaccatgc
-ctggTCCAGAAATAATTACACGTACttttttttttttttttttttgagacggagtctcgg
-tctgtagcccaggctggagtgcagtggcgcaatctcagctcactgcaacctccgcctccc
-gggtcccggttcaagcaattctgcctcagcctcccaagtagctgggatttcaggcacgca
-ccaccatgcccagctatatttttgtatttttagcagagatagcgttcacaacgttggcca
-gggtggtcatgaactcctgacgtcgtgatcctcctgcctcggtctcccaaagtgctagga
-ttacaggtgtgagccaccacgcccagccTATATGTACttttttttttttttttttgagaa
-ggactcttgctctgtcgccaggctggagtgcagtggcacgatctcggctcactgcaacct
-ctgcctcccgggttcaagtgattctcctgtctcagcctcccaaTACATTaaaaaaaaaaa
-aaaaaaaaaGGTAAGTGAggctgggcacggtggctcatgcctgtaatcccagcactttgg
-gaggccgaagtgggcagataatgaggtcaggagttcgagaccagcctggccaacatggca
-aaacctcatctctactaaaaatacaaaaattagccaggcgtggtggcatgcacctgtaat
-cccagctactcgggaggctgaggcaggagagtcgcttgaaacccaggaggctgaagttgc
-agtgagccaagatcgtgccactgcactccagcctgggcgacaaagtgagactccgtctca
-aaaaaaatgataagtgaaaaaagaaaTGTGttaaaatcagacagatcttggttcaaatcc
-tggctctgccacttatctgatccataatcttggacagatgacttccctgctctgggcctc
-TGGACTGACACCCTCTTGTCAGGATAGTTACCATGGTACACAGTAGATACTTACTAAATA
-TTAGCTCCCCTCCTCACTCTGAAACAACATGTATTTTACAAATCAACCTACAGATATTTA
-ATTAGTACGTAATATGCAAAGCACTAAGGAGATATACTGTGTAAGTAACAAGCAAGGAAT
-TACAACTATAATAAACGCTCAGTAAATTCAGGCATATCTAGCAGTTAGTGTCAATGTTTT
-CATACAAGAATGTCCATTCTTAATTCCCAAACTTCACAGAGCATATACATCTCTTACTGT
-AACAATTTTTTCCTGTTGTTTAAATAGGAAAAATGCATGTCACCAAAACTCGATACTACA
-TTGAAAACATAACCACATGAAAAGGTCTCCTGTTACACGCTACTACAACTGGTAAAAACA
-TTAGAATCACATAGAGAtttttttttttttttgagatggagtctcactgtcgcccaggct
-ggagtgtaatggcgcgatctcagctcactgcaacctccctgtcccaggttcaagtgattt
-tcctgcctcagcctcctgagtagctgggattacaggcatgcaccaccacgctttgctaat
-ttttttttttttttagacagggtttcaccatgttggccaggctggtctcgaactcctgac
-ctcaagtgatccacctgcctcagcctcccaaagtgctgagattacaagcgtgagccacca
-cgcctggccAACACAGAGATGTTTTCAAAACCAGTGTCAAAGGGTACTTGGGTTTCCAGT
-GTGGCTGGTGACACTGCCACCAGACACTGCCACAGAGAGGCTGTGACACTGCATACAAAG
-GAACTGTTTCTTAAAAACCATAGTAAGTAATGTTTTAAGCATCTTACATCCTTATGTGAT
-AGTCTGTTATTCATAGACATTTTGCCATGTTTAAATTACTTTTTAGgactggtccctgag
-tggtgctatttacaactcattgattacaatcagttagatttctttgttccttttccacgc
-ccactgcttcacttgactagccttCAAATAAATAAATAAATAACTTTTTTGGGAAATTGG
-TTGGGAATTTGTGGTTAGTAGCTATCATATCATTTTTCTATGTGAAATAACAGAGTATTG
-CTTTTTGGCCTTTGGCTGAGATCAGGGGAGATAAAGGAGTAAAAGGCTCTGAAAGTTTGC
-ATGCAGAATGTCTGCTTTTAGGGATGGCTTGTGGAAGTTAAATGGATGATGCCTGTATTT
-CAGTTCTTTCTAGTTGCCAGTACCATTGAGAAAATATGTCAAAAACACAAGAAATGTTAC
-ACAAGACAACACCAAACGTCACAAGGCAGTAGACTATAATTGTCAAAAAAGGTGCATGCA
-GACAATAATGGCCAAGAGCTCAAAGAGACTGCAGTGGGTCAGGGCCAAGCTAACCTGAGA
-AGTGTACCTTAAAAAGGAAGAGGAGCAAAACTCTCTTGACATGCTTAATTGTGATGTTTA
-ATGAACATCCTTGCAGTGTAAGACGACCTTTTTAAAATACATTCTTggccggggacggtg
-gctcacgtctgtaatcccagcactttgggaggccaaggcaggcagatcacctgaggtcag
-gagttcgagaccagcctggccaacatggtgaaaccctgtctctactttaaaaatacaaaa
-aactagccgggcatggtggcaggcgcttgtggtcccagctactcaggaggctgaggcagg
-agaatcgcttgaacctgcaaggtggaggttatagtgagccgagatagcgtcactgcactc
-tagcctggacgtcagagcaagactctgtctcaaaagaaaaataaataaataaataaatTC
-TCTCGGCTTCAGACCTACCTATCTTTGGTGTCTCAAGTTAAACCCAAAGCAGCACCCATC
-ACATCTGCCTTTTCTTTACTTTTGTCTCCTATTGCTTCCAGATACCTTCTTCCTTTTCCT
-GCAAAGCCCATTCTGCTGGAGTGGAAAAGTCCAATGCCttgatgccagggtcttgttcag
-tcactcaagatggagtgtagtggcacagtcatggctcactgcagcctcaaccATATATAT
-ATAGTTTAAATAAATCAATAAACCAATAAATTCTCTCTTAATGATGGTTTGAGCCTCACC
-ACTTGATTAGGACAATCAGCATAACCTGTAGAATCTTATTTGGAATTGAATTCTGTATTG
-TAATTTTGTTCCTGTTCATTTTTAAATTTTATTTTTCTTTCACTGTAAAGATGATACTCT
-GCTTTAAATGTTAAAAGTGTACAAGCAAAAggccgggcacagtggttcacacctgtaatc
-ccagcactttgggaggctgaggcaggcagatcacgaggtcaggtgttcgagaccagcctg
-accaacatgaggaaaccccgtctctactaaaaatacaaaagttagcctggcctggtggcg
-cacgcctgtaatcccagctactcatgaggctgaaagaggagaattgcttgaaccccggtg
-gcagaggctggagtgagccaagatcgcacaactgcactccagcctgggcgcgacatagcg
-agactccatctcaaaaacaaacaaacaaaaaaaaGTGTACAAGTTAAGGAagccaggtac
-aatggctcacacctgtaatcccagtgctgtggagggccaaggtgtgagaatcacttgagt
-ccacaaaatcgagaacagcctgggcaacaaagtgagaccctgtctctacaaaaagtacga
-aaagttagccaggcatggtggtcccagctactcaggaggctggggcgagaggatcacttg
-agcccaggagtataaggctgtggtgagctatgatagcaccactgcacttcagcctaggtg
-acagagcaataccctatTATCAAGGCACTGGACTTTTCCACTCCAGCAGAATTCTAAATT
-TTATTTAAACTATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATGTGAAGTGGAAG
-ATATCACCAGAAGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTA
-GAAGGGACACCAAGCATCTTCCCCAGCAATGTTCTAGTCTGAGGAAAAGGAGGAAGGTGT
-CCTGGTGACCTGTCTCTAAAAACAAAAACAAggctgggcacggtggttcatgcctgtgat
-cccagcattttgggaggccgaggcgggcagaccacctgagattgcgagtttgagaccagc
-ctgaccaacacggagaaaccccatctctactaaaaatacaaaattagccgggcgtggtgg
-cacaggccggtaatgccagctactcaggaggctgaagcagaatcgcttgaacccaggggg
-cggagattgaggtaagctgagattgcagatcgcgccattgcactccagcctgggcaacaa
-gagcgaaactccgtttcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCAggctgg
-gcgcagtggctcacgcctgtaatcctcgcactttgggaggccgaagtgggcagatcatct
-gaggtcaggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaaaat
-acaaaaaattagccgggcgtggcggcgcatgcctgtaatcccagctactcgggaggctga
-ggcaggagaattgcttgaacctgggaggcagaggttgcagtgagccgagatcatgctata
-tgccactgcactctagcctgggcgacaagagcgaaactccgtctcaaaaacaacaacaac
-aaCGACAGCAACCACGGAcggtggctcgtgcctgtaatccagcatttttttttttttttt
-tttttttgagacggagtctcgccctattgcccagactggagtgcagaggcgcaatctcgg
-cttactgcaacctccacctcccaggttcaagtgattctcctgcctcagtctcctgagtag
-ctgggattacgggcacgtgccaccatgcctggctaatttttttttttgtatttttagtag
-agacagggtttcaccatgttggtcaggctagtctcaaactcctgacctcgtgacccgcca
-gtctcagcctcccaaagtactgagattacaggcgtgagccaccacacctggcctatccca
-gcactttgggaggccgaggtggatggatcactgaggtcaggagattgagacgagcctggc
-caacatggtgaaactccatctctattaaaaatacaataattaggccaggtgcggtggctc
-acgcctgcaattccagcagtttgggaggccgaggtgggcagatcatgaggtcaggagatc
-gagaccatcttggctaacacggtgaaaccctgtctttactaaaaaaatacaaaaaaatta
-gccaggcgtggtggcgggcgcctgtagtcccagctactcgagaggctgaggcaggagaat
-gaggtgaacctgggaggcggagcttgcagtgagctgagatcacaccactgcactctagcc
-tgggtgacaagttctgtctcaaaaaaaaaaaaaaaaggcagaaagaaCATGGATTCACCT
-GCTTATACAAGAAAAAAGGAAAAAAAAAAGTGTACGAGTTGCCTTGTTACAATAAAACTA
-AATGTGTATACACACAAAGGAAATGGAGGACATTCAGGGGCTGGGATGAAGGGTACAGAA
-GAAAGGCCAGGAGATACGGCCCTTCCATTTGACAGTAAATAGACTAATTAAAAAATATTT
-ATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATTTGAAGTGGAAGATATCACCAGA
-AGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTAGAAGGGACACC
-AAGCATCTTCCCCAGCAATGTTCTAGTCTGAGACCATTGTGAGTCTACAAACTGTTTCTA
-TGACAAAGCTGTACattattattattattattattattttatttttattttttgagacag
-agtcttgctttgtctcccaggctggagtgcagtgaagcaatcttggctcactggaacctc
-tgtctcttgggttcaaaccattctcgggcctcagcctcccaggtagccaggattacaggc
-gcatgctgccaccacacctagctaattttttgtatttttagtagagacagggtttcacca
-tgccaggctggtctcgaactcctgacctgaagtgatctgcctgcctcaggctcccaaagt
-gctgggattataggcatgagccatcaggtctggccCATTATTAACATAAATTAAAGTTGG
-TACTAATAAGTCACAGGTGAGCTACCTATGAGACCTGAAACGTAAAACCCACATAAACAG
-AGGCACTAGCTGGTTTGGAGCCATGTGCAATTGGAAGTGCGACAGAAAGATAATAGGAGT
-AACTTTTCACCTCGGTAAACCTGTCCTCCTGGCTTGACTGCTGTTTCCTGGTAACCTAGt
-agggtgaccatttgtcctcatctgtctgagatcttcctggtttatacctagagtcctggc
-acaattgttcacagcaaaccctttctgctccctgtattctcaaatatgtcccagtttgga
-agccaaattaaatggttaccTACCTAGAAATCATTAAAAATAAAACCCCTTCTGGGcaca
-cctataatcccagtactttgggaggccaaggtgggcagattacctgaagtcaggagatcg
-agaccagcctgaccaacatggtgaaaccctgtctctactaaaaatataaaaattagccgg
-gtgtggtggtgcacgcttgtagtcccatctactcaggaggatgaggcaggagaatcgctt
-gaacccgggaggcggaggttacagtgtgccgagatcatgccactgtactccagactgggc
-aacagagtgacactctgtctcataaaataaataaataaaaaataaaataaaATAggccag
-gcgtggtggctcatgcctgtaatcccagcactttgggaagtcgaggcgagcggatcacct
-gaggtcaggcgttcgagaccagcctgaccaacatggcgaaaccccgtctccactaaaaat
-acaaaattagccaggcgtggtggcaggtgcctgtaatcctagttacttgggaggctgagg
-caggagaatcacttgaacccaagaggcggaggttacagtgagctgagatcacgccactgc
-actccagcctgggcaacgagagcaaaactccgtctcaaaaaaataaacaaaataaaaata
-aaaaTATAATAAAATAAAAACCACTGCCGGGCATGGTTTTTAGTCCAGACgtggctcatg
-cttataatcccagcactttaggaagccgacgtgggcagattgcttgaccccaggatttgg
-agagcaaccagcctgcacaacatggcaaaaccttgtctctacaaaaaataggtgggcgtg
-acggcgtgcacctgtaattccagctgcttaggaggcagaggcgggttgtagtgaggcatg
-attgtgccactgcactccagcctgggtgatagagtaagactctgtctcaaaaacaaaaaa
-aaaTCTCCAATTTCTTCTGTCAGCATAACACCTAGTCAATTGTTCATGAGATGTGTCAAG
-CTCTTGACTCAGGTGTGTCCTttcatccattcatccattcatccattcatccGCCTGCCC
-ATTTGtccagtcattcatcagtctgtcacttaatgggtgtctacttgtactaagcactgt
-actggggataaaaagatgaattactccctcccagcccttgaagggctcacagtagggaca
-caaacaattattatatataatagaatctgagggattatgaaaatccagaggaaagaatga
-ctttttttcttcttctttttttttgagacggagttacgctctttgttgcccaggctggag
-cgcagtgttgcgatctcagctcactgcaacctccacctcctgggtttgagcagttctcct
-gcctcagcctcccgagtagctgggattacaggcattcaccaccacgcctggctaattttt
-tgtatttttagtggagacggggttttgccatgttggccaggctggtcttgaaatcctgat
-ctcaggtgatctgcctgcctcggcctcccaaagtgctgggattacaggagtgagccacca
-cacctggccaagaatgactacttctaaagcagtcaggaaaggcttcaccaagaatatatt
-ctggatccttcttttaattttttttttttttttttttgagacagagtttcactcttgttg
-cccaggatggagtgcaacggcacgatctcagctcaccgcaacctccacctcccaggttca
-agcaattctcctgcctcagcctcccgagtagctgggattacaggcatgcaccaccatgcc
-tggctaattttgtatttttagtagagacagggtttttccatgttggtcaggctggtctcg
-aactccccacctcaggtgatccgcccaccttggcctcccaaagtgctaggattacaggca
-tgagccaccgcatctggccCttctttttaatttttatttatttatttagacagggtctca
-ctctgttgccttggctggagtgcagtggcacaatcatagctcactgcagcctcaacctct
-agggctcaagcgatccttccacctcagccttctatgccaccatgcctaattttaaaaaaa
-ttttttgtagaggtggggtctcattatgttgcccagactgatcttgaactcctgggctca
-agcaatcctcttgcctcaacctcccaaagtgctaggatcgcagatgtgagccaccacact
-gggctctggtacgttcttaaagaaaattttgccacagggaagagtgtgttaaggggaaag
-tactccaggcagaagagttatgtgcaaagaccttgtcacatgaaagaaacaccatgtcca
-ggaaacaaagagttctatgaagctgaagtgccaggtaaagggagagAACAGAAGCAGGTA
-GCACCGCAGTAAAAGAGGCTGGGCTGGATTCATCCCGCAAAGGAGTCTGGGTTTATCCTG
-TACTCAGGAGGAAGACAGGGAGGGATTTTACTTTGGGCCTGAGGGCCATCCTTTGGAAGA
-CCAGGCTGTACGTTTTCAAGAGGGGTCAAAAACATGCAGGAAACAGAGAAGCCTTTTTAT
-ATAACATCGGTGGAGGCAAACCATGAGAAGAATTTAATTTCCAACAAAGAGAAAAAACCT
-AACATATTTAATTTTTTTTTAACTTGGGAGTACCCCTGCACTTTCCACACATCACAAATT
-GACAGCACTTGAGTGGCAATACTGAATACTGCTTGAGGGAAGCTGATATTCAGAAGTCTT
-GTTAACCTATTTGCTAAGAGTATGATAATTTTTCTTCAGTTTGTTTAGACATACATCCAC
-CCCATCTCTCTTTCTAAATAAGCTATTCGGCAATCTGGGAGAAAGGAAATCTTGTATCTT
-GGGGAAAAAAACCACTATGCAGTCAACTGAATTTCCATGAGGTTTTGGCAAACCATTTGC
-CAGAATGTTACTTAATTCTGAACTCAAATCCTCAAATCATACCTCCCATAACTCATTTCT
-CTTAAGACTCTGTTCCAAttttttttttttttttagagacagggtcttactctgtcaccc
-aggctggagaatagtggcacgatcatggctcactgcagcctcaaccttctgggctcaagt
-gatcctcctgccttagcctcccaggtagctgggaccacagacaagctccactggcccagc
-taatttttgcgtatatatattttgtagagaaaaaaagtgttgcccaggctgatctcaaac
-tcctgggctctagtgatccacccacctcgacctcccaaagtgctgggattacaggcgttg
-agccaccatacctggccTCCAATTCTACTTTTAATCCTGCATTTCAAAATTTACTTACTA
-TTTCAAAATTTTTGGCACTCTGTGGGAACGCAACAAATACGTGCAGAATATAGTAAGTGA
-TTTAGTTTAGTTATTGTTCCTCTGGAAAAAACTGGCTTGCAGTAAATGACATTATTTTTC
-CCATACTGTTAAGGTGATGCTCACTGCAGAACTCTCTAAACAGATCTGCAGACTCTTTGG
-CCTGTTTCTAACACTACCGGTGTTTCCCAGAGGAGGATGCTGTCCCAACGTGGATTTCGG
-CTGCTGTTTTTTTCAGGCCCCAACACCACCCTCCTCAACCCCACAGCCTAGTGATTAAAT
-GTCAGTGGCAGATGGAGAAAGCACTCCCACGTGTGCCACTCTGACAAATACTTTATTCCA
-ACTAAATGTATAGGCTCTCACTGTGACATAAAAAGGGAAGAGGAAACAGAAAATTCAAGT
-GAGCTAAAGATGTATGAATTACAGAGTGAGATCAACTGCTAGACGACACAGGGAGGGAGT
-TAGCAGCGTCTCCACTGAAAGACAAATTCACAGACATCCTGTTTATTTCCGAAAGAGAAA
-CATCATAGAGCTATTCTTGGGATGTTCAGGAAAAGATTAAAATAAATGCCTATTATCTAT
-TGTATTTCGAGATAAACTTTATAGATTTAGAGCAGGACACACATTTCTGGACTTGAGAAC
-GCTGTATCTGGCTTGGAATAAAAGCCCACATTTCATCTAGAGGTAGAATGTATGTCATTC
-TAATCTCCCTCAATCCTTTCTTCTCCAATTTCTTTATTGCCCCACTTACAAGATAGTGCA
-CTATTATTCCAAAGCTGATACCTTCCAAATTCCTTTATAGTAGAGGTCTTGGCTATCATA
-ACCATGATGGAACGAATGACCGTCCTACAGCTGGCTGCAAAATATAAGACTGCTATAAAT
-AAATCCCTGATGCCTGAAAAGTAATTCATTCAACAAAGGAAGATAGGTATGACTTTGGCC
-TACTCTTCATTAGAACGCTTATTtttatttatttatttatttatttataaagagggcaaa
-gcagactttatttgaggggcaccacagcaataggtatagcaacaactgcaacagggtttt
-gtagtcagggagggagatcagactcaactccCTAAAATGCTAATTTTAACAATGGGACAC
-TTCATCTGAACTGTGGTTCTTAATGGTTCAGATAAAGATGACACAACCCACTATTGGCTT
-AAACTTCTCCCAACTCTGGCTACAGAATCCAGGTAAAGATTTCTGCCCCCTCAGAGTAAT
-AGGCATGTCCAAAATCACCTGGATTAGGGCACTTAATACACTGGGAAGGGACGATAACAA
-CTAAAGATGACCACTATCCATGCCTCCTCTAAAAGTTTTTTCATATATTTTTTCATATCA
-CCAAAACAAATACTAACTTGGATCAACTAATTTATATAATGGAATCTCGTGTGAGCGTAC
-AAAATTCCATACTGATTATTTGGTTTAAGCCTGCATTATCATAAAGGCTTTACAGTCTTT
-AAACTGAAATTAAGCTCAAATTAAGAAATGCTAGTCTTAAAACAATGGAAGGGGGGGGCC
-GTTTTGTGTGGAGGGAGGGAGACAGACATACCCCTACACCCACCCACAACTACTGATATT
-GACATTGGAAATTAACTTGAAAATTTATgcctgtagtcccagctactcaggaggctgagg
-tgggaggagcacttaagtccaggagttgggagatgacagtgagctttgactgtgacactg
-cactccaacccgggtgacagggcaagatcccatctctcaaaaaaaaaaaaaaaaaaTGCT
-TTAACTCCACGTCTGTACCAGAAGACCACAGCAGGAGAGGAAAACCTTATTTCAGTCTGG
-GTAAGAGTTCTATTAAACACAAAATAAAACAAACTAGCCTCTGTTTCTGGAGGTCTTCAT
-TAGTAGTTTCTACAAAACAGTATCCAAATTAGCAAAGATTCTGTTAACTACCTGGAAAAA
-GCAGGTACCAAGAAAGAATGTTTCACTACAATGGAAAAAAACAGTCTAGTAAGTAAACCA
-ATCTGACTATAAACGCTACAAAAGAGGGATTCTAGCATTAGTAACTTTGCCAACAATACT
-CTGATATGATTAAAAAACAAAACAATAACAAAAACAAAAAACCTCATCTTTAAATTTGTC
-CCATTCATCCAGAGAAGCAAAATCAAGGAAACTAGAGGGGGTAAAGTCTTGCAACAGATA
-CACAGCTGCACTGCCAACAGGTCACAAGACCCATGCTGCCTAGGGCATTGACTGTTATGC
-CATGAGGACAGACATCACACAAACACCAGTAATTAAAGGGTTACGGTGCCAAAGGGTTCA
-GAGCTCCACTTCCATTCAGTATCAGAACATAAGAAAAAGGGAAAAACAGAAAATGAGCCC
-aaataaaatataaaataaaatataGATACCAGGAGCTTCCTCAAAATATGTGGGTTGTAT
-TAATAACGTGTTTGGCTCTGTTACGGGCACCATCCATCAGAGGACTGGAAATAGGGAAAG
-TCACCTTAGTCTTCCTCAAGGAAAAAAGATTATTTAACTTGGTTCACGGTGTACATTCAT
-AATTTTAACTGTCATGTATTTATTGAATGAAAAACATTTGAGAACATCATGTGCAACAAA
-AACATGATTTCACAGAAATTGTCCAAACTAAAAGAGTATAAAAATAGAAGCGCTTTTTAT
-ACAAttatttacttattattattattgagatagggtctccatctgtcacccaggccggag
-tgcagtggcgcaatcatagagtagcctctaagtcctgggctcaagcgatcctcctgcctc
-agcctccagagtcgttgggatcacaggctcgagcctccacacccgactaacttttaaaaa
-ctttttgtagagatgaggcctcgctgtgtttcccagcctgatctcgaaatcctggcctca
-atcgatcctccaaccatggcctcccaaagcgctgggattacaggcgcgagccatggtgcc
-cggccGCTTTTACACAATTGAATAACATTAAAATAGGTGGCAGAAGACagacagaaagtc
-gattcgtggttgccaggcgtcgtgaataccggggaacgcggagtgcctattaatgggtaa
-gggtttcgttttggaatcagacagcggcgatggctgcacaactttgtgaattttctaaga
-atcactgaactgtgcaccttaaaggaagaactgtgtggtaattacatcGGCGGTACGCGG
-GCAGCGCGTCAATCAAGCCGGCGACGGTGAATGCAGTTCGGGAGAGCTGATACCCCTCGG
-GGAGGCGGCTCCGGGAGCCTGCGGACGTGGCGGACGCCTGGGACGGGGTGGGCCTGGCCT
-CCGCGCTCGAGGAGTCCCAGTCCTCTCCAGATGGAAGAAAGCCGGGGCGCGAAGCCGCCG
-CCCGCTCTTCTGCCTGGGGACGCGACTCTGCCGCCAGGCTCCCTCGGGTCAGCTCGGCAC
-CCGCCCGAGCCCCCCCAGTTCCAGGCCCTCTCCTCATCAGACGTGCCCTGGGCCCTCAGC
-CTGTTCCTCTCGccgcccggaaccccgcagcagccccgggtccccagcccgcgcccctcc
-ggcgccgcctccgccagctgcccctgccccccgggccgccctcgcaggccgctcccggcg
-ccccggtcggcttccgtacctgccttctccgcgccgccgtcccAGTGGCCGGAGGTGGGG
-CCGTCGCCCTGCGCACTCCGGAGGGCCATgccccggggccccgggcccccACCCGAGCCC
-CGGCTGGTGGCGGAGCCGGGAGAAGACGCGGCTCCGACCGCGGGACGTAGCACCCGCTCG
-GCATCGGCAGGCTCCCCTCCGTCGGCCAgcggcgcgcaggcgcgcaggcgccccgctggc
-cccgccccgcgccggcACGTGACCCTGCGCTACGCCCGGCCGGCGGCGGGGGAGGCTGCG
-GAAAGAGCGCGGTGAGCGCTCTGAGGAGTTGGCTTCGTCTGCGCTGTAGACTCTACGGTG
-TAGAgtgtggcgctcttgagcgagtgtgctcgagaccagctgtcgtttcctttgcttctt
-tcatctgtaaaatagtattgatgataataaaaatattgaactcacaaggttattgagagt
-gtttagaacatcaccaagcatatagtaaatactccacaattatGACCAATTTTTGCTTAC
-CAAGGATTATTTTTTTACCTCCTGTCTCGTCTCCCCACACGAACTCCTGTCATCAGTTCT
-TGGGTACTTGGGGATCTAGCAGGTTCATGTCAtacgggtccgcaggttatgcactgcaca
-aggcctgggagcgccatttacgtagacgttcacgtgaaccgtgcccccttaagttgtgcG
-AAATAGTGGCCACTCATCTAAAGCAGCGctctggcttatcaggtctgatttccttctcgt
-cttcagtgatattcctttctttccaattagacatccattcccttggttatatccctgata
-ttgtgattgtggcctcccgaatttctagtgctaggtcttcatgctgaagttcccataatt
-ccagttgcttgatgactctcttccacctcccacccccaaccacaacagttctttattatc
-ctgagacctccagcccatGAaactcctgacctcgtgatccgcccgcctcagcctctcaaa
-gtgctgggattacaggcgtgagccaccgcgcacagcCAAGTTTTACAGTTCTATTCATAA
-ATCTAGTAAATTATATCAGTTATTTGGTCCCATTAATAAACTAAGCTAATTAAAATCCTT
-TGAACATTTGAAACTGCATTTATAAATTCAATTCGTTTTTCTAAGTATCACAGGTTTCTA
-ACAAAGCCTTTCAAGTCCTTGTGTAATTCTTGTAAATGTAATACATTTATAAGAATACTG
-AGTCATGAGTGCTTTCAAATGTGTCAATACAAACGAGATTTCATCTTAAAATCAAAAGTC
-TAAATCTATTCAAATACATATTTGTAATTAGTACAAGAATAATCTGTTAGAATTCTCAAA
-Attatcttttttttttttttgagacagagtctcactctatcacccagactggagtgcaat
-agcgatcatagctcactgcagcctcaagctcctgggctcaagctagcctcctgttgcagc
-ctcccgagtagctgagactgtaggtacacactaccatgcctggctagtttttttagtttt
-tatagagggggtggggaatctccctatgttgcccaggccggtctcaaactgccttcgcct
-cccaaagctctgggattacaggcgtgaatcacagtgccAAGCTCTTGAAATTATCTTGAA
-CATTATAGGAATTTAAAGTATCACATTTACACAGATGCCTTAATGCAAAATTATTAATAC
-TAGAAGTTTGAAAACATTTCTAGTCTTTGTTCTAAATCATCTGTGAggctcatgcctgta
-atcccagcactttgggaggtgaagggctgcagatcacttgaggtcaggagttcaagacca
-gcctcaccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcatgg
-tggtgcctgcctgtaatcccagctacttgggaggctgaggcaggagaattgcttgaacct
-gggaggcagaggttgcagtgagccaagattgcgccactgcactccagcctaagagacgga
-gtgagactccatctcaaaaaataaataaataaaatgaaataaaTCATCATTGAGGTTAAA
-AGATGCTTAGTGCCCACTGAAGGAAGATTTAAGTCATCCCAGTTTAAGAGTAACGTGCTC
-AAGCAATTTGAGATATTTATTCCCTTCTCAGTTTACTGCGCTGGTCATCCAGCCAGCTGG
-ATTCTTGCTTTTGGTAGTGATGGAACAGTGACCCCCACCCCATTCCCACCACCACAACTC
-TAGGACTAAACAGTTGTGTGGTCGTTGTGAAGCTTGGGCcagaatttactttcaaaaaat
-gtcccgcttcatgtataatataaagaccttacaataaattcccatttcttccctcctgtt
-cttcttgctgttgtcctacattttactttttaaaatcccttccttctcttgctttctccc
-ctctacccaccaaccacttgcaaacaaccactgatctacatcctgtcactatagattggt
-tttcattttctggaattttttatggacggaatcatatagtatgtagtcttttttgtctgg
-cttcttttactcagcgtaattattttataagcaatcatgttgcattaatcaatagttcat
-ttgtttttgttgttaagtagaatttcatcttagaaatataccacgattcattttatcaGT
-ATTTTAAATTTTTGCATGTGCTGCAAGTACACAATTCATTGCTAATATGCTTGCCTTAGA
-CCAGGCGGTTAGCAAAAAAGATGGTCTGCCCAcctgcaagccaaaaccactctactgcct
-gattttgcacggctcatgaactaagaatggcttttaccttgataaatgttgaaaaatcac
-aacttaattgtagcacattaaaactatatggaatttaaatctcagtgtccataaaccttt
-actgaaacagagtcacgctcattcatttacctactgtctatggctgttttcatgctgcaa
-cggtagagttcagtggttgcaacagagatatggcctacaaaacctaaaatatttattatc
-tgctcctttatgtatttatttattttatgtgtgtatgtatgtatgtatttttttgagatg
-gagtttcactcttgttgcccaggctggagtgcaatggcgcaatcgcagctcactgcaacc
-tccgcctcccaggtccacgtgattctcctgcctcagcctcccgagtagctgggattagcc
-cgccaccatgcctggctaatttttttgtatttttagtagagacggggttttgccatgttg
-gtcaggctggtctcaaactcccgacctcaggtgatccgcccgcctcagcctcccaaagtg
-cctgggattacaggcatgagccaccgcacccggccTATCTGCTCCTTTATAGAAAAAGAT
-Tggcaggacgtggtggctcacacctgtaatcccagcactttgggaggccgaggcaggcag
-attacatgaggccaggagttcgagaccagcttggccaaagtggtgaaaccccgtctttac
-taaacatacaaaaattagccaggcatagtggcacaggtctgtaatcccagctactcagga
-ggctgaggcaggagaatcacttgaacccaggaggcggagactgcagtgagccgagatcac
-accattgcactccagcctgggtgacagagtgagactccacataaaaaaaaaaaaaaaaaa
-aaaaaaGTTTTGTGACCCTCTAttgtagagatggaggtattggggctgttgcccaggctg
-gccttcaactcctggcctcaagggatcctcctgcttcagcctcccaaaaatgatgggatt
-tcaagtttgagccccatgcccagctCACTTCAGTTATTTCTAAGGTAATTTAAaaaagat
-tttaattgtacttaccttcattcaatttccagtgctcttaatttcattgtgtagacccag
-gtttttttctggtatcatattccttttgcctgaaaaacttcctttagtatcttgtagaag
-gagcaatgaattccgtttttctttatctgaaacagggtttatttctcctttattttgaaa
-gacactttcatttgggtataggattccggaattttgggtgagcagtttttgtgtgtgtat
-gtgtttttcccctatcagcatcagcaataaggtcactccattggcttctagcttgcatag
-tttctgacgtctccataattcttagcttcctctgtatgcaatgtcttctttttccttgct
-gcctttaagattttcttttgttttagcatttcgagtatatctaattttatatgtgtgtgt
-gtatatatatatatatatatatatatatatatatatatatgagtttattctgcatgttct
-ctgagcttcttggattttgtggtttgctctgtccttaatgttgaaaagttctcagccttt
-aattcttcaaatgtttcttttcctgttctctctcctttcttctgggaatctaactataat
-atgtttgagtgtttgatattgtcccacaactcttggatgttctcttttgacggttttttt
-tcccttcaccctttttccccagtgtttcagtttgaataatttctcttgacctatctttga
-gttcattcattctctccttggctgtgtcaaatccactgacgagctccatgaggcactctt
-catctctgcatctctgttagtgtgtttcttttttttttttttttttgagacagagtctcg
-ctctgtcctccaggcgtgcagtggcgcaatctcggctcactgcaagctctgcctcccggg
-ttcacaccattctcctgcctcagcctcctgagtaggtgggactacaggctcccgccacca
-tgcccggctgattttttgtatttttagtagagacggggtttcaccgcgttagccaggatg
-gtctcaatctcctgacctcgtgatctgcccgcctcggcctcccaaagtgctggaattaca
-ggcgtgagccaccgcacctggccattagtgtgtttcttattttgaccagttccatttggt
-tctcatagcttccatctctctactgagattgcacttttgatcttgcatattgtctacttt
-tactgttagaccttttaccatattagttatttgaaattctgtatcacatagctctgacat
-ctgtgtttggttctgaagattgctttgtctcttgggagtatgtcatttatctcttgcttc
-ataagtgttggtgaaagttggacatcttgtgtaggatagtagaggcccagggaaatgggt
-tttgtgtagaaatgggcacacttttccttctgttaggtctttagcgtgggggtttgaatt
-aacctagttaggagttgTGATAggctgggtgggtggctcatgcctgtattcccagcactt
-tgggaggccaaggcaggaagattgcttgaacacaggagtttgagatcagcctggacaaca
-tagtgaaaccccatctctacaaaaaaaataaaaattatctaggcatttttggtgcatgcc
-tgttgtcctagctactgggaaggcttgccgagtctgtcctgcagactctgcccaagcgac
-ggatgaaaggagtactcagatacagatatccagtgaaagagcaggataggggactgccag
-cactaggggccgaagagaattagcagttcccctaagccggcagccctcgcatttgtttgg
-tacagatttaatgacaaaggcttggagcaaacacaatttgtgggtaataaacattgttga
-ccccccgagtagagagcagtcctgcatgcaaatgattaaaggttggtttctggagacagg
-agtagacaaatttatctagataagtttctttacattcccttgttatctgccctttgctct
-caggctccagatgagacaatttggctgccttcagccataatttccttccaaagcttttgt
-aaaacctcctggcctttcaagaaggtttgtgtctttactataatttctcccaccaccctg
-accaatctcctacatctcccccttttctgttttttgcatcagcttttgttaattgaagag
-tacagatgtgcagcaacaggtttttcaggtgtagtggtcactgcttgtatttcggctttg
-catcctagaattagtaaataacataagataaacgtgaatataatcagtaacattcttttc
-caatcaaggagtgacatgtagtgttacttgccacctcagttcagtgtgtgcccttactaa
-ggaaccccactgggggtatgttaaccccttccagccaagcagttacgttattagaggctg
-ggaagggggtgtccacccaggtaatagggtggaagaaaagcagatttagaagatgggccc
-aatagagtgtagcaggtactggttgcaggcagagtgagggaattaaacaaggttaataaa
-gcatagtaaggaataaattatctggagtgaatggtgtttgtgtccagagcaggattcgtt
-cagcctcctgagttgtcttcttcagcatcccccaggtaatgtctggggcttgtgtcgtct
-gaggaagctgcatcatccagggctgtgggtcctgcagggacatttccttcatttctggta
-ccaggttgggtcctagccacaccatgttaaggtttgatgcgttgtgctggaatccaaaga
-ggacctgaggtgatgtgaacacaaccatatcctcttccccatgttggcaactcatttgga
-ccacaccatacattactgtttacatctttccataaaactgtgggttttatgtcttgagag
-gttttagcaaagtgcttttctatagctgattgaaatttatcatttaaatttaagaaatta
-agggtaaataaggcttttgctagtagtgttgcagggtccttactcatactcccccttttt
-tgttttttgagcatatttttaagagtggacacgttctactatggcctgtccttgggggtt
-atacgggatgcctgtggaatgctggatgttccacgtgtgacaaaattgttgaaattgtga
-gctggcatgagccagaccattatcagttttaatttttgtgggccgccccataaatgcaaa
-agttaagagaagagtttaataacatatcaggtggactttccaggaagagcattgtgctaa
-ttaggtgagaataggtatcaatggatacttgtacatatcttagttttccaaattcaggga
-cgtgagtaacatctgtttgccataactgattaggttctagtcctctagggttaacgcctg
-ttgaaggaggggacatgcctgtgagctggcaatccgggcattgcaggataatttgtttag
-ctagtctttgggtaagttgaaattgttcagttaagttccttcaattttggtggaaaaatt
-gacgcaactgcatggcttggtgaagcagtgacatcataacttgcaggtctgcttgttcat
-tgccataagccagtgggccaggcagtgagctgtgggctcgaatatgtgtgataaaaatag
-gatgtgtacgttgatccagcaattgctgaagttgaagaaaaagtgcacacagggtgagct
-tgagagtggacttaatgagggctgttttaaggttttgcaataaataaacagagtaagcag
-agtcactaatattgataggcagagtggaaaagttctccaggggcaatattaaggctccaa
-cctcagctctctgagtgctagtaaatccagaatgagtgaggaaattatgcagtctccacc
-aaacaggcgcttttctgtttttaccagagccatcagtaaaaagtgttaaagtgttggggt
-atgggggagtgaactacttttgtaggcacaactacaggagtacgagataagaactgaatt
-acgttgtcagcaggaagggcatgctctatatggcctgtgtaatcagagattgctatctga
-agatctagagataggggcaatactgatccaaattgccttttactcaaaggaattcttatg
-acatcataacctagcaactgattgcactatctgcggcctgtatagatgactttactaact
-agctggatataggaagatagtgttttagtctcggtatgtgagcaaaaaacccattctagg
-aagcgtagtcctggggtcatctctcctattaatactgttggggaatgtttagtaggaaaa
-acaaacaattgaactgactatcggggtgtctatgtgatatagttgcctctgagaaatagc
-ttgctctatttcctcaatttccctttttgctgcaggagtcaaatacctgggagagtctag
-ggctgtattgccctttaggatagaaaacagttttgtaacttatcagtagttatgcccaac
-gtggggtgaagtcaattaatattgcccagtaacttttgataatcatttaaggtgtgtaaa
-tcgctagtatttaaccttttgaggtcttactgaccagaagttagtatgtatccaagatat
-ttccaattgtactttttcaggtgctatgattaaacctcttaactgtgtattctttatgac
-agaggcatataaacttaaaagcactggctctgttggggctgctaggaaaatatcatccat
-aaaatgaataatcttgcaactaggaaattcttttctactggggagcaaagcctgatttac
-atgatactgacacatggtaggactgaacagcatcccttgaggaagtactttccaatgaaa
-tcagcgagctggcctctcattactgataactggtattgtaaatgccaatttttctctgtc
-ctgttctacaaggggaatagtataaaagcagtcctttaagtcaataatgactataggcca
-atcttgaggaatcgcctcaaaggggaagggaggtcccgttgaaggggccccataggttgc
-aaattagcattgatagcctgtaagtcatgcaaaagtctccatttgccagaccttttggga
-atgatgaaaatgggcgaattccaagggctgtttgacagttctatatggccagcttttaat
-tgttcttccactaattcatgggctttttgtaatttctctctctttaaaggctactgtttt
-acccaaataggattttgagagagccatgtcaggggtaggggaggaataacagtggccatt
-attagaaaggtttgctgttcacacaatttatcaaattctgccctccagaggaggtactga
-ctggcctttaaagttgttttagctagcactgaccagtcccatggggtgatatggaagttg
-tctgctatggtttcaattattccttttgtaaatgggctagtggctccgtttaatgctttt
-tcttaccactttataagcgtcaaaagaagttgtctgctatggcttcaattattcctttca
-taaatgggctagcagctccattttctttaacgtttttttcttatctctttataagcgtca
-aaagaaatgggttcatatacctgatcgccttgtcgatcttgcattactgggcaggctaag
-agctccccttctgatgccgcttggctaagacagggtcccaaagctgtagtgtatcccttg
-tctttttccaatttattggaggagggggctcaggcaaaacctctgtttcctctttgttat
-ttttgcctgttaatggctgggctgagggagaaggaggagacggtagggtaggtgacggtt
-ccatctcccttacttttttaggcttttctgtgtagagtgggaccaaagcagtcctaacta
-aagcccataacgttaaagatgttactgagacccattgcccttgctcatgatgttaaaatt
-tcttcccagagctctacgtctagtgtaccttcttccgagagccatgggttatgggaaaca
-acagtttgcattaggtcccataattgagcctgtctgaggctctgctaactttcagcattt
-gttttactacttttatatactgttgctgttgagctgacaactgttgtcccatgatgacaa
-ctgtcatcccatgatgatcgtccctagcttgagcaattcctttgaacttggaaatgctga
-acaggcaccaatgacttactgactgcgcagtctcttcaccttcattttcgagggttccgt
-cgtgatctgttgcagcattcctcacacagggaatcacctgccgagtctgtcccacagact
-ttggccgagtgacagatgaaaggagtactcagacacagatattcagtgagagagcaggct
-aggggactgccagcactaggggccgaagagagttagcagtccccttaagctggtggccct
-cacatttatttagcacaaatttaatgacaaaggcttggagcaaacacaatttgtgggcaa
-taaacattgtcaacatcccaagtagacagcagtcctgtgtgtgaatgatcaaaggttggt
-ttctggacacaggaataaacaaatttatctaggtaagttcctatacaactcccctgttat
-ctgccctttgctctcaggcttcagataagaatttggctgccttcagccataatttctttc
-tgaagcttttgcaaaacctctcggccttccaagaaggtttgtgtctttcctataatttct
-cccaccaccctgaccaatctcctacaAaggctgaagcaggaggattgcttgagcccagga
-gtttgaggctgcagtgagctgcgatcacaccactgcacttcagcctgggcaacagagcaa
-gaccttgtctctaaaaagtaaataaaaaaaagagttgggctaggtttgaggtttattgtt
-gctatggttacccccaatgcagcagcttccagttcctccaatgacaccttggactgaggg
-tgcaggctggcctgccagagggattttctccttccatgtgtgctccctgctcagctttag
-gtcctccctttgtgaccctcagaaagggtcttcttcccatactcttgtctctctcctgta
-acatttttacttctaactcaaggcttgtcagcttaccattggcaggtgggggaggaggga
-attctctgttctgatcaagtctcagtctctgtcaggccctttgtgtctctgattttgggg
-ttatgtcctccttagtgctcctgttcctcccccAGTTCTGGGCCCAGTGTGTATTCCTGC
-CCCTGCCCAGGGAAAGTTTTGTTTTGTTCCTGTTTCATTCCCCCAGATGCAAGGGAGCTT
-CATCCAAGGGGGTGACAGGATTTGGTGTCCTTCCCTCCACAGACTAAGGCTTTTGTCCGG
-TAGGGGATACAGGGAAGGGTCTGGGTGGAGCACTGTGATCCTTTCACAGTAGCTGCCATT
-GTCTTCTTCCAGATCTTGAGACATTTTATTAAAACTTTCTCCAATCTTCTGTGTGCTCCC
-AGTGGGGTTCATGGTGAAAAACGCTGAAAAGGGTAAAGACTACTGCAGTCTCCATGACCC
-AGTCCCTCACCAGTGTCCACTTGTGTTTACCAGGTAACCAGTGCCCATGTCATCTCTTCC
-ATTTTGTGCCTGTCTCTCCTTAGATTTGAAGCCAGTTGATTGTCTTCTGATCTCAGCTCT
-CCAGAAGACCTTTTCCAGAAGACCTCTCCCTGTGTATCCACTTCTAAACCAGTCACAACT
-GCCCGAGTCTCACAGCAGCATGGTGGATATCCCGCTGTCCCTCAAACTGGGGCTCTGTCA
-ACAAAGAGGAAGGGAGGAATGACTCCCTTGGGAGGAGACAACAACATTGCAAGTGATCTa
-gtctttgaaaggcttttaagcaagggactgagataaaatttatttattatttttaagaga
-gaggttctcactctgtcagccaggtctcactgagagcaatgtgatcatagctcactgcag
-cctccaactcctgggctcaacgtatcctcccacccagcctccccagtagctagcactata
-gtcacacaccaccacactagttaatgttttcattttttgtagaacagaggactcgctgtg
-ttacccaggcctcaagtgatcatcgggccttggcctcccaaaatgctggggttatagata
-tgagtcactgtgcctggactagaatatttatttttgaaagatctttggttgcaggtgtca
-gatgaatcaggaattgagacgagatgggaaggcatcaagaccagttatctgctatgatac
-tccaagcaagagaggatggtggctgggatgaggaatttggcaacgggaatgggaggaagt
-ggatgcattcaagataaatATCCATTTATTAAAAGTAGTTGCTTTTTCACCAGAGTAATA
-CATAAATATAGTTTTAAAAGTAAATACTGCTACTATCTTAACAATAATTTAAAAAatctc
-aaaataacatgcaactgtttgatttttcagttttaggcattagttccccttataaatgat
-gagagtttagagcttagaccgcttgtcctgttaccaacaccaccacacatgccagcattt
-cccatcactcctctttccattgtcatcatactgtaatcctggttagaccagtattcagtg
-tttccattatgactacgtaaattctaatcacagctgaaccagcagtatgatatttagttt
-tccctcctttcataacttttcccattcctgctgagttaatacttttttggcttgtcttac
-tctgctcagttttcATTTTGTAAActtttaaacatttgaactctagcaaatatactgaga
-agtgccccaaacgtaaatggagagtttaacaaataattatagagcaaatacaacatttag
-gtaccaccccaataaacacaacaccgaggacccccagaagcaccctgtgtATAGTGGAAT
-GTTGTGTTGTTTCTGGCCATGGAGTCTCAAAGACTGATTCTCAATTTTTGTTGCTTGAAA
-ACAAGTAAACAAGTATTCTCagccgggcacggtggctcacgcctataatctcagcacttt
-tggaggccgaggcaggcagattacttgatgtcaggagttccagaccagcctggccaacat
-ggtgaaaccctgttgttttgtaaaaatacaaaaactatctgggtgtggtggcatgtgcct
-ataatcccaactacttgggaggctgaggcaggagaatcgcttgaacctgggaggtggagg
-ttgcagtgggctgagatcatgccaccgcactccagcctgggtgacagagttaagactctg
-actcaaaaaaaaaaaaaaaaaGTTGGTGTAATCCTTTCCACACACACATATATATATACA
-TAGATGTTATATGTGGTTGCCTTCTGTTCCTACTGATATATATGAATAGTATGGCTGATT
-GCATTATTGGTTTGTTTCTTCATTCCCCTGTAATAAGACTAAACatacacaccctttgcc
-atataacctcataaagttttcccaacacaggctctatgcttccctactgcactgatgttg
-ggcttggctatgtgatttgctttcgccaatgggatgatggtgcttgtgacacagcagagg
-cttgaaatgtgcttgtgtgattccatttggtctcttCTAAGTTTCTGTGATTCATGAGAA
-GAGCACGCCCTGAGTAGCTGCTGCAACTTCTGCCACATTGGGCAAACCTGAATCCAATTC
-ACATGGAGGTGTCCAGCCCAGCCGACCCACAACCTGAAAAACAGCTGCTTGGGCTGAACT
-TGATCTAGATCAGCTGAACTACATACAGTTGCCTTAGAAATTTGTGAGACTAAGACTAGA
-CAGAGAACAAAAGCAAAAGAAAGAAAAAATTTGTCTGCAATGACTGGCTAGGAACCTGGA
-CAGATTCCTGGCAACATAGCTGTGCAAAAGCAGCCCCACAAGCAAAATTGAGCCAGGAGA
-CAGGGTTCTGATCCCAGGCATGGGCCTTGGCAGCTGAAACTTGTTAGGCTGGGCCTCTCC
-CTCGCCAGTTCAGGCAGCCCCTCCTCTGAGGCCTCATGGACCATTCTCTCTTCTCCAAGA
-CTTCAAGATTCCTTCCTAGTGAGtttttcttttttacttttagatggagtctggctctgt
-cacccaggctggagtacactgacgtgatctcagctcactgtaaccgccacctcccaggct
-caagcaattctcctgcctcagcctcccaagtagctgggactgcaggcacacgtcaccaag
-cccagctaatttttgtattttttagtagaaacagggtgtcaccatgttgttcagtctggt
-ttcaaactcctgacctcaggtgatccactcgccttggtctcccaaagtgttggattacag
-gcgtgagccaccatgcccggcACCTAGTGAGtttttctgttacttttttttttggaggcg
-gggtctccctatgttgcacaggctggagtgcagtggtgaaatcatggctcactgcagcct
-caacctcctgggctcaattgattcctccatctcagcctcccaagtagctgggactacagg
-catgcaccaccatgcccagctaatctgtgtattttttgtagagagggtttcatcatgttt
-cccagaccggccttgaattcctgagctcaagtgagtcgcccgcctccacctctcaaagtg
-ctgagattacaggtgtgagccactgcacccagccTGTTAAATCTTTTTTTCAATTAATAA
-CAACttcttttacagacagggtctcactctgttgctcagtctggggtgcagtggcactat
-catagctcactgcagccttgaacccctgggctcaagtgatcctcctgcctcagcctccag
-agtagctagcactacaggcatgtgccaccacatccagctaatttttaattttggtagaga
-cagggtctccctatgttgcccaggctggtctccaactcgtggcctcaagcaatcctcctg
-cctcagcctcccaaagagctgagattacaggcatgagccaccacgcccagctTCTGTGAC
-TTTAAAAAAATCtttttagacagggtcttgctctgtcacttgggcttgagtactgtggca
-caatcacacctcactgcagccttgacttcttgggctcaggcaattaattctcgtcctttg
-gcctccccagtagctaggacacaggcgcacaccaccacactcagctaatctattttttgt
-agaggtgggttttcgccatgttgtccaggctggtctgggactcccggctcccaaagtgtt
-ccAACCACAGGTGTGTGGGCCTTCCGTGGTATCTTAACCTCATCACCCAGAGGCAACAAC
-AGCTAGTATTCTTCTAGTTTTTACCACCCCCACCACCTCAATCCTGCCCCTGTAGCCTTT
-CCAAGTGCCACAGCATTGTTTCAGTTTCTATCTTAGAAAGCCCGGGAGTCTGTGTCCTAT
-CTCCCTGGGGGCATTCAAACCCTAGTCCATAGCCTGAGGCCCACCTATACCCAGACCCAG
-TGTCTTGGAAGCACTGACTTTAATACCCACTTAggctgggcgcagtggctcacgcctgta
-atcccaccactttgggaggcttgggcgggcggatcacctgaggtcgggagttcgagacca
-gcctgaccaacatggagaaaccccgtctctactaaaaatacaaaattagctgggcgtggt
-ggtgcatgtaatcccaTGCCTGTCTCAaaaacaaaacaaacaaacaaaacaaaacaaaac
-aaaaAAACCCCAGTTACATTCAGGATGAATTCTGCCTTCCTTTTTGCCACCTTGGGATTT
-CCATTTCTTTCTCTGAAATAGGCATTTGCATTTTTCCTAGGATTTTTTTTTTAAAACAGT
-TGGAATTATCCCATATACACAATTTTTTCACTTTTCTAATTAACATACATTTCCCCATGG
-Gcttgtgtctcacctctcaatccccagtgtatagcaaagaccaggctcaggggcacttac
-aaatgtttgttgaaACCAAAGACATCCTATATTACAGAAATGAACTTTGGAAAGACCAGT
-CAGCGTGGGTGGGTGAGGAATGCCAGAGACGGGAGAACAAAATGAGGTATACCGTCAGGT
-TTGAAGGGTTGAGGGTTATGGAGGGTTCTTCATAGGAAGTTCACCATGGAGTTCTTGGAA
-CTGTTCAACACACAGAAGCAAGGTCCTCTCCTTCTAGGTATGGCTAGAAATGTTTATCAA
-TAGCTGAGACTCTGATTCCCAGGGTGGGATCAGGAAGCCAGCCCCAGCTGCTGCAGCATT
-TTTTTCCCTTTTTCTCATTACAGGAGCCAAGAAAACTGTCAAAGCAGATGATGCAAGAGT
-GAAGCTGACTCAGAAATACTCAATCCCCCCAGGAACTTCTCTAAGAAATGGACTGACCAT
-CCTGTAAGCTTCCATCTGGAGGTACCTGGGGAAGGGCTTCTCACATTGAGGCCAATAAGA
-ATCCCTAGTGggccaggtgtggtggctcatgcctctaatctcagcactttgggaggccaa
-ggcgggtagactgttgagctcaggagttcaagaccagcctgggcaacacggcaaaacttc
-atctctaccaaaaaaaaaaaaaaaaaaattagccaagcatgatggctcgtgcctgtagtc
-cctggaaggctgagttgggaggatcacctgagcctgggaggttgaggctgcagtgagctg
-tgatggcgctactgcactctagcctgggtaacagagcaagacccgtatcaaaaaacaaaa
-caaacaaaaaaCTTCTAGTGAGTAGAGCGACAGGGAGACAAATCCAGTTTGTAATTTGCT
-ACAGTGCAAAATATCTGGCTTTCCATAGAGGGAGTGGGAACAAGGCAATGCTGGCCTTCA
-TTCAATCAGAAACTTGACTTGTACCCGTTGAAAACCTGTCATGTTTAATGCTTGGATATT
-TTTTCTTCTAGTAaagacactttactgccacctgctggaaaagagtcagaaattttccaa
-atgcaaacatctatggcctccctataatgtagcatccttttactgtacatagtctgcaca
-actgtacaATTTAGAAGAGAAACCAACATTTGGTGTAACTCTACCATATACCAGGCATCT
-GTCATAGAATCTGAACAACCGCTCTATGAAATCAGTACTTATACCCCAATTTAACAGATA
-GGAAATATTGGGacctctggggaagggaggaagaagagggtatcaccaaaaaagggcaaa
-aagggggcttggtctgtattggcaatggaaattcaacttgggtggtaggattatggatgt
-gttacagctttctttataattTGGTACATGCCTAAAATGTTTTACAATAACAATTTAAAT
-CACCTGTGAAGAAAAGATTCAGAGAGGTTAACTGATCAAAAAAATCACACTGCCAGACAG
-AACTCTGTTAGAGGTAGACCACTTGCAGTAACATTACATTGCTTCTCTAATGGTTAAATT
-TAGCACAGAATCAAAGGAGAGCTATAAAGTCTAGGAAGTACTTATTTACATAGGATTGAG
-TCCAGAACATCTTGTGACACCATCTACATATGTTTTACTTGGAGAATAGTCTGAATTTCG
-TATTAcacgttgagcatttctaatttgaaaatacaaaatcctcaaaaatctgaaattttt
-taagcatcaacatgatgcctaaagtaaatgctatttggaatatttcaaatttcagattag
-gaatattgaactggtatgtattccgcaaatattccaaaaatccaaaaaaattcaaaacac
-ttctggtcccaaccattttggataggggatattcaacctATATTACACACAGGTAATACA
-GCAGGGGAAAAGCAGGGAGACTGCAGCATCTAAGTCTACTAAATTGGCCAGGATCATTCC
-TTAGTCTTCAGATACCTATTTATCAGGGTCTCATTAAATAAAGTTACTTGTCATGTTAGT
-TCAGTCTGGCCTGTGGCTTGTAATTATAGCTGCAAACTCAAGGGCAAAGTTCTTAGGATT
-TTGAGATGCTCTTTATGCAACAATACTTCCATTTACTTtgtgtgtgtgtgtgtgtgtgtg
-tgggtgggtgggtgtgtgtgtgtAGGGAGAGAAAGGGGGCAATGGAGTGGAGagtggaac
-tacaatttattaagcacctattattacaagccaagtagggtgttaaatattttcctcgtg
-ccattccattcaatactcTTCGATCCTGAGGGAAAACGAACCCACTTAAAAAAAAAAACA
-AAAGGTTTTAATGAGGATTGCATAAGACATGCAAGGTCACCAGGGAGTTTACATGCAAGT
-GGGGAGATACAAAATAATACAACAAAAGTTCAGGTGTTCTGAGGAAAAAGAAGGGCAAGG
-GTAAGTGATGACAGTGGGGGAAGTCGGATTCAGGATAAACCAATTTTAGACTCATTTTTT
-GAGGAAGGAACTGAGCATGACCTTACCACACAGCCTTTTTAGTTAAGTGTTTCTTTAACT
-AGGAAAAGGCCCTGGGAAGACAGGCTCTCTACTATGCAAACCCAATTCCAGTCTTGGGAG
-AGAATTTGCTGGTGGGACAAAATCAGGTTTTTCAAGAGATGCTTAAATGGTCAATTCTAA
-TTATAACCATACTTGTCAAAAGGTGAAGCAAAGATGAAAGTTAAAAACTAAGAAGAAATT
-AAAATTCCCAAATCTGTCAACCAATCTCTAATTTTCTCTGCTACTTTAGGACTATAGTAA
-TTAGCCATACCCTGAGGATCTACTTTACAAGATATATTCCTCTGACAGTCCCACTCTAAC
-AATTTAATCTATCTTATGTAAGCTGGACAGGCATTTCAAGTACAAGAAACAGAATTCAAA
-ACGTGAAAACGGAGCCATCTATCACACACGGTGTCGGTTGGAGAAGCATATTGCTCAGGC
-TGCAGGGACATTTCatttatttaaatgtttttattaaaaaaaattaaaGACCTTCATGGC
-ACAACTTCTTCCCAGCACAGTTATGGTTTAGTCATACCAATTACAATACAATTACAACCA
-ATAAAGCAAGGTGGGGAGGGCCTTCTGGCTTCAAACTTAAAAAAAAGCAGAGGAAGAGGG
-GAGGGACCACTTCAAACAAAGTTTAAAAATACTTTAAAAAATCTTTCAGAGTAATTGCCA
-ACATAACCTTTCATGTTGGCCATTCCATTTCCTGCCATCTAAGCAATGCAGACACAGGTA
-GTGCTGAGAAATAGTGTCCCAATACAAGGTATACAGATGAGGTAATTTACAACAACACGT
-AAGTTGTTACTCTGTAAACCCTTGCCTCCCCCCCACCCCCCACCCAATTGGGTCTTTTTT
-TTTTTTCTCTCTCTCCATGCTTCTGCAGTGACTCTTAAGTAGCATTTTTAAAAACTTCTA
-TTTATTTTAAAAGGCTCTTGGGTGGCACCTCAGAGTCCTCTGCATTCACCTTCGGTTTAT
-TCCAAGGTCTGATGGGTGTAAGGAGGTCCAGCTGTCTGCAGCTCTCCGCATCAGCCTAAG
-CTACACCTCAATTTCCGAGCTACAAGGATAGGGTATGAAGTCTTGATTTACAACCCTCTC
-CCCACCTCAAAAGAAAGAACTCATTAGTTATAAGTGTCCTGTTCAAATCACAATCCAGTG
-CAAACATAATCACAAATTGCATCTCTGGCACATCTGGTGCTTTTAGCTTCTGCACAAATT
-CAACATGGTAACCCTCACAGCATTCTAGGGCATAAAAGGGTCAAGTACAATAAATATCCA
-CTGTAAGTGGTCATAAGGAAGAAAATCACCCTGCCACACAGTCAGAATGTTTTCCCTTCA
-GCTCTCCCTACCGTTGAGAAGCGCTATAAAAGGAGGCTTTAGCGTCCTCTAAAGTTTACC
-ATTATATTCACTAAAGCCACCACCTTGATAAAGTTACTAAAGCCAAGATGGGTTACAAAG
-TTAGATAAGTTCATTAAATTCAACTCCCCAAACAATTACGTTTATCTATGATGCCTAGGC
-GAGAAAGGCCTGTGAATCTATAAGGTAGGAGAATGGGGAACTAAGATTTTAGGCCTTAAA
-ATATGTTGGAAGAATTTTTCCTAGTTCCCACAAGCAGCTACTGTAATGAAATAACAGGAG
-AAAATACAGAGCTGATGGTTTTGCTATTGTGCTTAAAAAACTAGGCTTCCTCAGTGAAGC
-ACCTGATAAACTTAGGTGGTTGGATTACAGTGGAAAGTCCACTTTACACACACACACAAA
-CACACAAAAACTGGCGACTTTTTCCATCCCCAATCCCTGCACTGCTGAGACACAAAATGA
-GTTTTATGGCAAAGGATCCTTAATCCCCAGAGACGCTTTGGCTTGTGGTGCTTTTTTTTT
-AAGGCCTCTCTGCTCTGCCCGGTACCATGGGTCGAACGAGGGGTGTATAAAATGGGGGCC
-TTGGGAAGCCTCCACGGTACAGGGCTGCAGGCCCCTCAGATGTGAACATGAGACACCCAC
-CCAGCAAGACCTTTACACAGGGAACTTAAATCTAACCTTGATAAATAAAACCAAACGTTT
-ATTTACACCAAAGAATTCCAACACTGGATCTTTCACATATGAAGGACAAAGTATTATATA
-TATACACACAGCAAGGGGTGGCGGGGCTGTAACAAGAGAGTTTATAGTTTTCCCACAATT
-ACAGGTCTACCATTTCAGCTTCAATGGAGATAGTGGCTCTGCTCCTACCTCTCAAGATAC
-ATTTACAAGACTGAGGAGCAGGTCTTCTCACTGGATGGCATGTGAGGGAAGGGGACGGTC
-GGAGGAAAAGAAGGTAGAAAGCTTAAAATGGAAGTCAGTGTGGCCACATCTCCCATTAGC
-TCTAGCATGAAACCTGTACAGACAATGTTTGTTTCTTTTGTAAAAAGCAGTAAGTTATGC
-CCAGTAACTAAATGAATTCAAAATGGCCAAGACAAAGAAAACTAAGAAAGATTTTGCCTT
-CCCTCTCCTACCAGCTATGGAGCACAGCATGTTGGGAGATGAACAGGGAAAAGACCAAGG
-TAAGGAGCCTGGGAGGGAAGGTATCAACATTTTAAACTGAACTAAAAATAAAAGTATAAA
-TGAGTTGGATTTAGGGTTAGATCAGTAAGACATGATTCTTACTGAACAGAAGTTTTTAGT
-ATCTGTCTGCATTTTGGGTAGATTTTCAACATCTTGATGTAACTAAGACACACTTCCACA
-AGAGCCACTAGGATAACCCCACTGAAGCGCTTATGGAGTAAAGTGATGTAAGCGACCAGC
-AAGCAGTCCACTGCTCCTATAGATTGGGtcctcccttccttctttccttccttcctttct
-tcctgcctcccCTGAGAAGCTACATTTTTGTAATCTCTGGAGAAGAGCACGAGATACCAA
-CCCCCTAAAGTGTGGGACGGTGGAGGAACAATGGTGGGAATGGGAAGAAGTCTCCACCTA
-AATGCAGCAGCCGGGATTGAGGCTGGTTTATCTTTGTTCTTTTGTGATGAGGAACTAAAT
-TTGGGAGGGGAGAAAAAAAAATTTGTCCATGAAATATTCCACCTGCAGGTAATTTTTCAG
-GGAATCCCCTGAGTTATGAAAAGTTCGAGTTAAAAAAAAAAAGAAAAAAGAAAATCAGCC
-TATTATAATTTTTTTTTTATGACTGAACTACTATAAATCCACAAGCAACGGTTCAGACAC
-GGTGCTTCTGAAGTGTTTCACCCCTCCCCGCCAGGCGCAAGCTGCATCAAGGAGAGGGTG
-GACTCCCCCACCTCTGCTCAGGCATCAGGAGACAGATAGGGCCGTTACTGCTGAGCGCCA
-GCGGCAGCTGGAACAGGCATCCCAAGGGGGTTGGCAGCAGCAATCACTGGTGAGCCTGCC
-AGAGGTCCAAGGGGTGAAGGGGTTGGCACTGAAGAAATCCCTGAAAGAAAAGAGCTGTCA
-GTGAGCCAAAGACACCAACCATGGCAATCTTACCAGTTTCTCATAGCACTCACTGCAAAA
-GGAACACAATAATTCTTTACTGAAGACTTCCTCTTAGCTGGATTtttacatatacttcaa
-gtctgaccctcacaaattcaagttaaagtggcaagtcctaatcaatttaagagacaggta
-aagaaatctaggcttggacaatttaaggagtttgtccaaagtacacgattaagcaagtgg
-caaccatggttggattctaacccaggcctgtctagGGCAGAGATGTCCACCCTGGTGACc
-agtagccaaccacatgtggctgctgagcacttgaaatatggctagtgcaactgaggaact
-acattttaaattttattcaattgtaattaaatagcctcacgtggctagtcactaccatac
-tgaacagcacaTGACTGCAGTCAAAGCTCATGTGCTCTTACACCATGCTGTCTTGATAGC
-TGGCAGCTTTCAAAATTACTGAAAGTCAATTTGAATGGGGAAAGAGCATTTTCTAAGATA
-AAATTGTGTTTTGGAATTTATTTCCATTTGATTTCTTCCACCTCTCTAATCATGTTTTtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtACACACAGGTAATACATTCACATGGTTCAAA
-ATACAAAAGGTTCAAAAAAGTATACAAAggccaggtgcagtgtctcacgcctgtaatgcc
-agcactttgggaggccaagttgggcggatcacctgaggtcaggagttcaagaccagcctg
-gccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcgtcatggcg
-ggcgcctgtagtcccagctacctgggaggttgaggtgggagaatcgcttgaacccgggag
-gcggaggctgcagcagctgagattgtgccactgcactccagccttggccacagagcaaga
-ccttgtctccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatatata
-tatatatatatatatatatatGAGAACATTATTATACATTCTTCTCCACTCCTCTTAGAC
-ATGGCTCTGCATCTCACtttttcttttgagacagagtctcactctcacccaggctggagg
-gcaacggtgcgatctcggctcactgcaacctctgcctcccaagttcaagcgattatcttg
-ccttagcctccaagtagctgggattaaaggcgccgccgccacgcccagctaattttttgt
-atttccagtagagacagggtttcgccatgctggccaggctggtctcgaactcctgacctc
-aagtgacccacccgcctcagcctcccaaagtgctgggattacaggcatgagccactgcac
-ctggccctgcatcttgcgttttaaatttcacattattatattggagttggagatctaaca
-gaacatgaaactcttattctactggctgcaccacattccattaaatggatataccataac
-tgatttaaccagtttcctactgatagctattctcaatgttttgttattacaaataaggct
-acaagtaagtttggatatacattactctgtacagaggtaggatactcaaggggtaaattc
-tagaagGCAGTTAGTTCTTTTCTTAAAAAAGAGGAGGGCAACAGCAATTATTTGAGGATA
-TGTAAGTAAATGCCTTCACTACCAGATATGCACCCACTTGGATGTTGCCTATATGTATAA
-TTCTTATGCTATGTGCCTGTAGTTCCTTTGGAATAACTGGGTACTCTATAAAAATTCACT
-GTGCGTCACAATGATCCAATAATGGAAAACCATTTTACTTATGTTTTTACAACTGATAGG
-CACTCTATAGTTGCTCTGGCACATGTCACGGAACTGTCCTTGTACACATACACACCTATG
-TATAAACCCCACCTCTATACCCCATTTCTTAACATTGTTTCTAAGGGCCATGTAACTACT
-GTCATTTCAAACTATAAGATGAAATGGTGTATTTTTCCTTTTCATGGCTTGGCACTTTCA
-AGCCCCTATGCCAAAAATTTTCAGCCAGGAATGCTGAGATTCTAGCCTAGAAGGGGATAC
-CCTACTCAAGACAGTATCACTAAAGTATACCAAATGTCAAGCATGCTGAAACCTGGTTAA
-AAAAAAGTCACAAGGCCACCAGTACGGAGAAGAGAAGGTATACAAGAAATCAGACCACAA
-AGCTAAGAACAGTAATTGACTTCCACATTTTTTTAAAGAAAATTTACCAATGAACTGACC
-TGACATCATATTGGCGCTGCTGACGGGCGTACTGCCCCCTGGCATGCTAGATGAACCCAT
-TCGAGCCTGGTCCTTCACAACAGTGTCTAGAAAAGAGACAAAAAGGCTAGGTTCTGTTTT
-GCTTGAAAGATTAAACTAATGGTCTGGAAGCCTGAAAGCAGCCAGCTTCATTCTTTGCAA
-TTTATATATACTCTACATTATTCCCCAAAGAACTTAAGGTGGCAATTGCCTTCACCATGA
-ATTAGACAAGTGGTAAAAAGCAGAAATAGCTTTCCTATCAAACTGTGGTAAAAGCTAACC
-TTTCAATCAAATGGTAGAAAGATGAGGTAATTATTTATAGCAGAGCGAATTTAATGAAGC
-CCTGGTCCTGTTGAGGTTTAATGGAGACAAGACACTGTAACTCGGCAAAGACGGTAATAT
-ATTACCAGTGTGTCCACAGCCCAGTACCAAGTAGGCCAAAGCTATAGGTCCATGTAGCTT
-AGGGCTATGACCACATTCTCTATCCCAATCAGCCTATCTATCTGCTTCAGGTATTGGGCA
-AAAGTATAAATGATTCAGTACAAAACCATCACACCGAAGGAAAAATGTCATGTTGCAGCT
-AACATCACAGTGCAGATGGGGTGGGTCTCAGTGGTATTTTCACTTAGGATGGCACAGGTG
-GCTATACTCACAAATCTAAGTCAAGGTGTTCATACAATTTTAAGATTTGTAAGCCTCATT
-AGCTCTTTCCAACGAATGATTACTAGGGACAGGAAAGATACAGGGCTGTGTATTCTAATT
-CAACCATTCCAGACTGAGGCACTGAGAAGTGTCATCCTCACAGTATGAAAAGAGTTTATT
-TAGGAATGCTCTTGTGTCATGTATTCTGTTACAGAAGaattcttccagtaattctgcaat
-gtagttgccatcactatccccactggaagaatctgaggctcagtgtgggtgaattaactt
-TGCAGCAAGCTGACAGGAGCTGGGATTACGACTCTGTTCTATAGGACTCTGCGCCTGCAC
-AAACTCTGTGGGCTAGATATCTGGACTCACAGAAATAGGGGTGCTCCATTGCCTCTCTTG
-CAGTAAGCCGTGACTGGTGGTCATATCGCAGCAGTTTGTCCAGGAAATCCAAGGCCTCAG
-GGCTGACAAGGTGCTGATTTTCACTGTGGACAAAGCGTTCCCATCGCTTTCGAGAGTGTC
-TGCAGGACCAAAAGAGGGCATGAGAAATGGGCCACGTGGGCACAGAAGCCCAACATTTCA
-TTCCTACATTTTTCTTAGTGGCTAACAGCCCAGACAAAAGCAAAGAGGGATCCAAACTCA
-AGAGGGTAGTCTTGCACCGCTCTGCCACTGAGTGGGACAACAAAGCTAACTGGAGACTGG
-AAACAACATAGCTAGAGTGAAAAAAGACATCTGAGTCCTCTCAATTTTAAGAAACATAAT
-TCAGGTTACTTGACAGGACGTGACCGCTTCTGTGTAGCAAGGAGGGTCAGGTGGCTGAGC
-TCACCAGGCCTATTTCCCATCCCCACACATATTCCTGGCATCTCTGCCAATTGGCCAGCA
-AAAGCCTTTGCATCAGGAAAGTCCATCTCCTCCTGTTGAGTGGTTAAGTGTATAAGTACT
-ATATCTAGTCACTACTGTTAAGAGTCGGTTGTCTGCATATAGCCtttttttttttttttt
-tggagacagggtctcactctgttgcccagactggagcgcagccacatgttcattgctctc
-tgtagcattccctcctgggctcaagggaagctcctgcctcagcttcctagtagtctggac
-tactgccacacatcaccatgcatggagtcgagggtctcattatgttgtccaggctggtct
-ccaactcctgggctcaagtgatcctcctaaagttctgggattacagatatgagccaccgt
-gcccagccTGCACATCAGTCTTAAAGCATGCATTTTCTACTTCAATTTCTTTCTCTTGGA
-GAGAGGTTTTTCACTTAAAGAAGCAAGGTAAATTTTGATTTTTGCCTCAACTGTAACCCT
-TCTACTAGAATCTACATTCATTTTGTAGGAATCCTCTAGCTATAACCCCTCCATCAGACT
-CCTGTAAGTTAATTTGAATAAAGGGCCATTCAATCCAATGCCTTTATCAGAGGCCTGCTC
-AATGCAGCATCCTGTGGCACTGGACCACTGACATCCTGACAGTGCTGGCAAAGAAAACAT
-AACTATTTTGAAGATCCTAAGTGCCAGTTCACTCTCAAAGTGCTTAAGCCACAGATGCAC
-ATATTTTGTTTCATGACTTACCTGCCCAAGATATCATTGAAACGTGGATCTAATTCAATG
-TTGTATTTGTCAATATAGTCATATAAATCTTCTGTCCCCAGAACCTTGGCTATCCTCACC
-AACTAGTATTAAAGAAAGACAAAAACCCATATCACAAGCATATTATATTAACAAATCAAC
-AATTAACAATGATTGAATTTACATAAACGGGTCATCATGTCTACAGGTATGAATGCTACC
-TCCTAACAGTTTAGACTTCAACTCAATGTGATAGTGTTAGAAAAAGCAAACTACTTTATA
-AACTGGTTTCTTCCTCTTGAAATGtcaccctggtgaacccttatttttctcccctcaaaa
-cccaattgaagatgtcacttcttttgggaagctcccattgcacactcaaactactcacca
-ctactgccttttgtgccttgtccacatttctactctgaagttatgactgtaacctatttt
-gttgtatgtttgactcccttacaagatcagctatgaactatctgaggggaagaaaactat
-tctttcttttttctgtattcctcagtactgcatgcacttgatacagagTTATTGACTTTA
-ATGGAATTCAGGTTGTATTCTTTGACTCATTAAAATTGGACATGGTGCTCAAAGGGAACA
-AGACAATGGTACCTTCCACAAGGTCCTAGAATCATTCCAGGTTCTTGTGAATGAAAGAGC
-CCTTTGATCTTCAAGGGGGAAGTGGAGTTAGTTTAAGAAACATCTGTAACTCAACCCATA
-TAAAGAGCCAAAAGGATCACAGAAATACCACATATGGGCTCACATATTGGAGAAAACACC
-ATATTGGAGATAAGGGTTTATTAGGAGAATTCTAAGGTAATGTCCTATTTTAAAAATCTG
-GATGACAATTTATATGTATTCTTCACAATAAAATAAGCAATGCAAATGACAAAGACTAGG
-GGGGAATGTCTGATTTCAAAAGGCTAAGCTGGTAGCTCCCGAAACATCAATCTAAGGATC
-AATATCGGGGTGGCTGAATAAACAGTGAACTGAAAGTTACAGGCAGTGCTGGCTATCATT
-GCATTAGGCCAGTACATTTTTCAATGGGTATAACATATATTACCTGATCATAATTGTCAT
-GTCCATGGAAAAATGGCTCCTTCCGAAAGATCATACTTGCCAGCATACAACCCAAACTCC
-ACATATCCAAACTATAATCGTACATCTGCATAAAAGTAAACTCACTGTTATTATCTGTGA
-ATCCTCAGGCTTGTCACTTCaaaataaaaaattaatttttaaaattaaaaaaaaatCACT
-CCACTGACTCAAAATCAAAACACTAATAACATCTTCATATAtttctttttagtctttctt
-ttttttttttttggagacagagtctcactctgctgcccatgctggagtgcagtggcgcaa
-tcttggctcaccacaacctccgcctcccgggttcaagcaattctcctgcctcagcctcct
-gactagctgggactacaggcgcgtgccaccatgcctggctaattttgtatttttagtaga
-gacggggtttcactacgttggccagtggtctcaaactcctgacctcatgatctgctcgcc
-tcaggttcccaaagtgctaggattacaggcatgacccaccgtgcctggctAGttttttct
-tttttttttttttttagttttttttttagttttttcttttATGCATCTTTCACTCGGTTT
-TAAAACAAtttttactttttttttttttttttgagacagagtcttgctctgtcgcccagg
-ctgcaggggtgtgatcttggctcattgcaactcagcttcccaggttcaagcaattctctg
-cctcagcctcctgagtagctgggattacaagcgcccaccaccgcgcctggctaatttttt
-tgtatttttagtagagacagggtttcaccatcttggccaggctggtcttgagctcctgac
-cttgtgatccacttgccttggcctttccaagtgctgggattataggcgtgagccactgtg
-cctggctCttttttttttttttttaaagacacagggtcttgctctgttgcccaggctgga
-gtgtagtggcgtgatcatagctcactgcagcctccaactcctgggcttaggcctcctgag
-taggtaggattacaggcatacaccactatgctcagctaatATACATACTATTTTGAATTG
-TTTTCTTCACTTACATGAAAAAAAAAAAAAAAAAACCTCCAAATTGTTAGCCCATGGAGA
-CCATCTAATGTGTATCATTAGTATTTTATTACATAAATGTTTCAGAATTCAATCTTTAAT
-TTTCCTATAATAGGACAGTGTTCTGTTTTTCACAATTATTAGTAATACTGTAAAAACTAT
-TTTTATGCATAAAATGCTTTTTGAACTCAGGGCTATAGCCTTAAGACCCCAAGAAAGAAA
-TTCCTACAAGAACAAAAAGTCTGAAACTTTTAAAATCAACTGATAATAACCTGGAAAGAC
-TGGGCATAAAAGATACTCCCAAGAAAACTTCAGATTTTTAAACACTTGGCAAATCTATTA
-TTAATTTGGTTCCTTTCTCCTTTTTCTGTGAGGAGAAAGAAGGCTTTTTGGGGGAGCTGG
-GGAGAAGACCTTTTTATTTAGTATACAATTCAGAAGAACAAGAAAACATTCTTGAATTTA
-CTCTGAAGATTGGTTAAACTTAGTTACAGGATgggcatggtggctcatgcctgtaatctc
-agcactttggggagccaaggtgtgaggatgggttgtgcccaggagtttgagatcagcctg
-ggcaacatagtgagactttctctctacacacaaaaaaattaaaaattagctgggtgtggt
-agtgcacgcctgtagtcccagctactcaggaggctaagctggaaggatcacttgagccca
-gaagttcggggctgcagtcagctatgatcatggcattgcactccagcctgggcaacagag
-caaaaccctgcctcagaaaacaaacaaaaggccgggcgtggtggctcacgagggcaggag
-atcgagaccatcctggctaacacagtgaaacccagtctctactaaaaatacaagaaaaat
-tagctggggtggtggtgggtgcctgtagtcccagctacttgggaggctgaggcaggagaa
-aggtgtgaacctgggaggcggagcttgcagtgagccgagatcatgccactgcactgcagc
-ctgggcgacagagtgagactccgtctcaaaacaaaaacaaaaacaaaaacaaaaCAGCTT
-ACAATTCAAAACAGTTCTGGAACTGCTGATTATAGAACATATCTTTGGCTACTTTCCCTC
-AAGTCAGGATCAAATGCAAACCTATTCATATTCTACCGACATTATGACAATAAAAGTAAT
-GTAAGTCATGGTACATGAATTAAGGTGATTTATATTTTACATTTCATATAAAAAGGACAG
-CTGTGAATGTGCATTAAGTGGCCTACCTAAATGCACAAAATGATACTTTTTTTTTTTTGG
-TAAATTATGTGCGAAATAAACACAGGATCAAAACTGTGCCTGCCCTTCTGTTCTTACCTG
-ATAGTCTACAAGTAGCTCAGGACCTTTGAAGTATCGGGAAGCAACTCGGACATTATATTC
-TTGGCCAGGATGATAAAACTCAGCCAAACCCCAGTCTATTAGTCGTAGCTGAAAAAGAAT
-AAACCATGAGCAATCTTATCTTTCTCTAAGCTACCCACACTGTGCCATTAGCATACTCTT
-GAtaaaatataccagacacgtcactctttactgaaacccctccactgactacttatagcc
-tttagaatgaaaataaaacttcttagcttgacaaacctctttctccatgattttgttccT
-GGAAGACACAATCTCACCTGTGCTTTTACAAATTTCTTAAACTGCTCAATGACTAAAATG
-TCCCTACTACCCAGCCTATAATCCTATTGGTAAGCATTTCCTTAACTTTTGGAATATTTA
-AGTCAGCTTCTCAATGAAGTCTGATCATTGCCTTCAGCCCCCTGAATTTTAGATATATTT
-CTTTAACAGAACCTAAACTCTTTATGTTTTCTACCTTtctttttcaatatggacgacaag
-ctccttaggggtagggactgttttattcacctttgtaattttcagaattcaacataatgc
-ctggtatacaggagaaaaatgaataaatatttgctggatagatgaaATAACAGAAAAGTC
-ATACAATACAGCTTTTACCAAAATGCATCCTAAACATGGAAAAAGGGGTAAGAGGCAAGC
-TTATCTGCCCACTGTGCATAGCATGACCATGATCTGAAGTGCCAGCAGTAGGCCCTGAGG
-AAAAACATCGGACTGCTCTGGCACTAAGTTTACTGCCTGTATCTcaaaactaaacctttg
-attactccctgcaaaagcacctccactcagtctccccctgttcggttaaaggtgatactc
-atcctgtcatacaagccaaaacttaagattcaccctggattcttgattccctcagacctc
-acatttaatctgtcaaaaaattctgaaggttctatcatattgtgaccattatcatcacct
-ccactgccactgccccgatccaagccaccaccacctcttgtttgatatattgccatagcc
-ccttctcctaactggtctcactgctttcactcttgccctctagtctaAACAGtttaataa
-atactaaatagtttaatagttattttaaaaataattaaatatttaaaaataaatataaaC
-AGCTTTTTAAAAGGATTGTTCAGGTTGCTATGGAGAGattatagattcacaggaaattgc
-caaagtagtagagattctctgcaccctttacccagtttcccctaatagtaacatcttaca
-taactacagtacaatatcaaaatcaagaaactgacactggcacaattcagaaagatctta
-ttcaggtttcaccagttttacatgcacgcatgtgtttgtgtgtgtgtttctatgcaattt
-catcacatatgtaagttgatataatctcctcaacaagatatagaactgttccatcaccac
-acacatgtcctgtgtgttagcccaacccctggcaacccctctgctctttatctctatcat
-tttgagaatgctacaaaaatggagtcattggcatataactttttttgagactgccttttt
-tcactaagcatgagatccatccaagttgttgcatgtgtcatacttctttcctttttattg
-ctgagaaatactacttcataataatattatatggtatggatatgccagtttgtttaacca
-ttccctcattgaagggcacttttccccatttttttttttttttttttttgagacgcagtc
-tcgctctgtcacccaggctggagcacagtggcacgatctcggctcactgcaacctccgcc
-tccggggttcaagcaattctcctgcctcagcctcctgagtagctgggattacaggtgcat
-gccaccaggcccggctaatttttgtatttttttagtagagacagggtttcaccatgttgg
-ccaggctggtcttgaactcctgaactcgtcatctgcctgccttggcctcccaaaatgatt
-acaggtgtgagccactgcacccagcttttccccccaattttaagctattacaaatatagt
-tgcattcatatataggcttttgtgtggacctaagattttgttgctctgagataaatgcca
-ctgcaggattgtatggtaagcatatgtttagcttttcaagaaaccaaccaactataaaac
-aatagttaagcattttccaaaatgccaaactttgcattcctaccagcaatgtatgagaga
-tcaagtttcttcacatttttgccagcacttggtaccatcactattttttattttagctgt
-tctaataaatgtgtagtTAActtttaaatttcaagtgagaacatgctaaagcttagaata
-tgcaaaagctctctatcttcagagaaaaggcctaacaatgaccaataaggttttacatga
-tttggttttacctctttgatttcatttcctccttctttccccgcattcattctgtcccag
-ctttatccttgctgctgctcttccaacatgccaaacatatccttacctgaagggcttttg
-tacttgctatttactctgccttgggacatgtttcttcataagactgcatggctgggtccc
-tcccagtgctctctaaaatgtcacctttccaatgaaaccttcccttataactggtttaaa
-actgcaaataccctcttgccattccctattcgttttttcttctacatcaaaataactttc
-tatcccaccagcctccctaaatgtagctcctaaaagacaagcatttattgtatgttgagt
-tcacttacatatccccagccctagggtggtgcctctgacatggtgtgtgtctaaaagtaa
-ttcagttgcataaataaatCACCTGCCTCCCCAGAGACCACAACAGGCAAGTCATCACAG
-CTTGTCACCTTAAAAAACTGAAATGCTAAAGCATGTGGCCATTACAGCTCTCATGTAAAA
-GCATTTGCAGACAACAGGGCCCTTATGACATCCAATAAACAGAAACAGCATTTTCTGTAT
-ATCTCGTCCACTTAACTGTGCAcatttaattctcacgaatacctagtcgcctgcagggct
-attattacccacactgtacacgtaagaaaaagaaggcaaatggagagaaagtagtttCTC
-AGGAAACCAGTTACTCAATAAATAAGGCGAGAAGCCACGTTTCCGGGCTTAGAAGATGAA
-CATTTTGCCCACTTTACTCATGTTTCCTTCTTGGGAATATTCTTAGGAATATAAATAATG
-GTTCAAACATGTTGACTTGTAAATTCGTAcattcattcaccaaatatttctcaactgccg
-aataggtactagggcctgtgacaacacaagggataaagtgttgaaGATGGGCAATTAGCT
-ACATCATGTAGATAAATAACACTTGTCAGCCTATCACTTTACCTTTCTGTGCTCATGATC
-AATCATGACATTATGGGGCTTGACATCTCTGTGCATAATTCCCATGCTGTGACAATAATC
-CAGGGCCTGTGGGATGAACGGGTCAGAAAGGAGTTAGCCTGAATAATACGTAAGAGTCCT
-TTACTTTTCCCTCCATGTAAATTTTCCTTTTAGCCTCACAATACCCCTGGGATTCAAGCT
-GAGGACACAGTCACTTCCACAGCAATGCTTCAGAGACTTGTTCATGATCTCACAGTCAAG
-CAAACTCAGCTCTCTGAGCTTAGAGATCTTTTTCTGACACAGTTGTTTCAACATGTTTTC
-TGTCCTAAAAGACCCAAAGTATACCCAAATTGCACCACTTCAAATTTTTCTGTCTTGTCC
-AGATCCTAGATTATTTCCACAGACCCCTCAAAGAAAGAAAACAGATCTTTACTACAAACC
-TCTTATTCTAAGAACAGTAATTCTTTAGCCATTAAGAGTCTGTAAcagaggttggcagac
-cacaggccaaatttggcctgatgtctgcttttgtaaataatgttttattgcaacatagcc
-atgcctatttgtttgcatattgtttatggttgctcttgtgcaacaacagcagacttgaat
-agtgtgacaaacactacatggcccacaaagcctaaaatatttactatttggccctttaaa
-gaagtttgccaatgcctgATTTAGGTCATCAAATCCAATCTGAAATGTTTCCAACCTCAA
-ACTAAAGGGAACTGAGTAGTATAATCTTTGGGGTTTGTTAATCCCAGCCTTTCAGTCAGC
-CGACGTTGTTGGCCAAATTCTTGTCCTTCCTGAAGGGCAACTTGGGTTCCTACAGTTCCC
-AGGGCTGGGCAATCATATCTGTAACTTTCTAAAGCCTTGCTTGCCACAAACTGCATGAGC
-CAATGGAAAGATCAAGTATCTCTGCTGGCACAATCTCCTCAGGGGATTTCTAAGGCTCCA
-ACAGCAGGCTTTATGTCAACTCTTGTTTAGTAAGAAAGCTTAGCCAACTTTTAGCAATTC
-TCTCTTCTAGGAAGCTGATCTTGTGGCTACTGGGAACAAGATATTTGGTGACCCCACTTT
-AGAAATGTAAGTAAATTTTCAATTAGCATCTATAAGCAGAAATTTACACAATCCTTAGGA
-CAATTACCCTTTGAGAACTGAGTTAAAGTTTACTGTTTTATTTGCTGACTCTTAAGTGAG
-ATAAAGTATACCAGAAGCTAGCACGTCAGGTGTTTTCACGAGTTTTGAAAATTTAATATT
-AACTTACATAGGGGCCACAGAAATTACAAATATTTGTTAAGGGGTCAGTCCCAGCTATCT
-TACAAATACCCTTTTTCAAATTGTTCTAAATTATACTCCCACTAGACCCCATTCCATAAC
-CCTTAGCACAAGGGTTCTGATACTATTATTATTAAtttttatttatttatgtatttagag
-acagggtcttactctgtgctactgcactccagcctgtgcaacaatcatagctcactgctg
-cctcaaattcctgagatcctcctgtcacagcctcccaagtagctggaattacaagcataa
-gccaccatacccagctaatttttaaattttttgtagagacagggtctcactatgttgctc
-aggctggtcttgatctcctggcctcaagcaatcctcctgccttggcctcccaagtagctg
-ggacttacaggtgcacaccaccatgcccagGTAATTAAACAAtttttttttgtagagatg
-gggatctcactatgtcacccaggctggtcttttgatctcctggcctcaagcaatcctcct
-gcctcagccttccaaagtgctgggattacaggtatgaTACTATTAACTTATTAAAAACTT
-ATATAGAGGTCCCTTCTTTCAACATACTTTACAAAGTTAATCTGCTGGCTTTTCTACCAT
-CAATTGACTATTTAACAAAAAGAAGACCAATTTAAAAAATATTTAGTATTCAAGGTTCAC
-TTACCTTCAGAATCTCATACATGTAAAATCGAATATCATAGTCTGTTAACGTCTGGTACA
-ATTGCTGTTAAAGACAAATGTTTGAGCCATGAAATAATGCTGACAGAAAGGCATTTTTCA
-CCCTCACTCACAGTAATTCAAACCAAGACTTGGCTCATTTACCGTTGTTCCAAGATCTGT
-CCATTCACTGCCCTCTATTTCTCCAACATTACATTAACTTTAAAGAGATACTTTGGGTCT
-TCAACTCTTAAAAATGAAGAATTACTTAAACATATATTGCGGAAGCTATAATCCACTGTC
-AGAAACATACTGATCTAGATACGTTAATATGCACTGACACCCACCTATAATTTAGTTTGC
-TTTTCATGTATCTTCAGACCTTCTCAAAAGAGGCATTTTGGCAAATATACTGCCTCCTTA
-GTAGGGAACTAACTCATCTTTGCCTTACATAGTTGGCCCTGCAGATCACCAGTGGGTATG
-CAGATGGCATGATACCAAACCTGTTGAGTCAATTTAACAAAACTATTCTTGTTCCAATTG
-GAAAGTAAACTCTGAACAACTGTTATGTATCCTTTCCAGTTTCCAAAGAGTTGCAGAATG
-TTTTTTACATGGACATATCttttttttttttttttttttttgagacagggtcctcactct
-gctgcccaggctggagtgccgtgctgcaatcataactcactgcaacctcaaactcctggg
-ctcaagcgatcctcctacctcagcttccccagtagctaggactacaggcgaaagccacca
-tgcccagcCACAGGTACGTCTCTTTAATGGTTAGCAACGTCTTCTGACAAAGTTTTTCTT
-GAAATTATCATTCTGACTCTAAAGCAGTTCCTCTTCCTTTCTCCCTATCTCTGCAACAGA
-ATTCACTAATTTATTAATATATAACATTCTGGATACTGGACTGGTGGAAAGGCAAATCGA
-AGATTTTTACTTTTACTCCAAAAGAGTAGCTATATTCTTCTGTAAAATTGGAACTGTGTG
-AAATAAGTAGGCCACTGGATAGACTGGAATTCTGAGATATCTCTTATAGAGGTTTGTGTT
-ATGGCAGAATTTGACATTATCCTTCCTCGATCCCTGCCTTTTAAGATCTATAGCCCACAG
-TTTATGAGGAATCCTAAGAAATAAGCAGTCCCTACTTTTATACATACAATATATTTCTTC
-CTGAACACTATTGTTTAAAGCGAATTGCCATATGGCCAGATCCTAAGTGAACGTGTGTTA
-CTGCCTTCATTAGGTTGGACATCAGCAGAAACTGTCAACTAAGTAGTGAGAAGTCAATGT
-GTTGGTCATTAAAAAGAACATTAAACAAATGGGCAAAATATCAAGATGCAGAAAGTGGGC
-ACTGCTTATATAGGAGTTCTTCTATCTTAAAATTTGCACTGTAAGGATGAAAAGCTTTTT
-AAAAACAAATGCGAAGCAAGCTCTTCTAACAGCATCATCCCCAAAGGCTATGTGGTCTAA
-AAACCCACTAGCCCGAAACAGTTGGTTATATATTATACCTTGAAGTCTGTGTTGTTTACG
-TGTTCAAAAACCAAGGCGGGGGTTCGTGACTAGGGGAAAAGAACAAAAACAAAAACACAC
-ATTAGCAATAGCCCTGACAGCTTTAATGGGGACAATGTTTGCGGATGCTGCGTGGTGAAA
-TTTGGCAGTCCTCGCCTCAGTAGTAAGAAACCCTCTATTGCTACAAGCCCTCCCCGCTCT
-GATCATCACCGCACTTAGGTCATTTTTGGGATGGATTTCAAACAGAAGACATGGAGCTGA
-AGTCTCACCAGGCTCTAGGCAGCCCGACAATGCGCCCATCGCCCATCGGCATCGGACCTG
-AGTTTGCAAAATGGATTAACACATTTCAGTTTCCAGTGCTATCAGTCTCTTAGCCTAGAA
-GAATAAGAAATAGTCTGTGGGTGGAGGTCTCTTTGAAAGAAAGACCCAAGCTAGTTAAAT
-GGTATATCTGATTAAGCACTTTCAAAGCAGGACTTAATGATGAGGGTTGGGGGAGGGAAC
-AAAAAGAGGCCAGTTGTGCTCCAGGTCAAACACCATCTCAGCTCTGGCGGGCCTTGCTAA
-CACCTACTATACTCACCACAGGGTCTTTTACAATGTCTGCCAGTGTGATGATGTTGGGAC
-CTCCTCTCAAATTCTCCAAAATCTTTATTTCACGCTTAATTTTCTTCTTTTTTACTGGCT
-GAAAGGGGAAAAGTACATCAGCaaaaaaaaaaaaaaaaaattttttCAGAGTATTTCAAC
-ACGTAGTGTAATACATAAATGATAAATGGCTTACTtatgagcacaccttgaaggaagaaa
-atgtgtcacattcgtctctgaatccttctcctagcactgtgccaggtattctgcaggtac
-ttacaaatgttgaattgaaagaaAAAAAGATTTCTATTCCAAAGACCAGACACTTCTGCA
-GAATTAGCATTTCAATCATCAGTCTTGATGTTAATGTTTTAAAACATGTTAAACATGTTA
-ATGTCTTAAAACCTTACAAAGTAGCAATTTAAATCGTTAGTAATACTAAAGTATATCAAA
-CTTTTTATCAATTAGGATGAAACATGGGCCCTTTCCATTTCTTCCTCTAATTAGGGCCAA
-CAACAAGGATGGCCAAAACATCTTTGTgtagcacaaccctgagggtaaagggtgagtctt
-ggagtcacaatgcccaatgtgaaacctacctttactacctgctggctgttaatggcaaac
-tacataacctctctaagcctttcattaagtgtaaaatgagtaacaagagtacccatctca
-taagattgttgcaagaatcaaatgaggtaTTCGAAAGATTTCGGAATATGGCTGAAACAT
-AACATAATAATAACTGTCTAGCCTGATCACCAATGCTCtttttttttttttttttttttt
-gagacagagtcttgctctgtcacccaggctggagtgcagtggtgcaatcttggctcactg
-caacctccgcctcctgggttcacgccattctcttgcctcagcctcccgagtagctgggac
-tacaggcacccgccaccaggccaggctaatttttgtatttttagtagagacggggtttca
-ccgtgttagccaggatggtctcgatctcctgacctcgtgatctgcctgcctcggcctccc
-aaagtgcCAATACTCTTATAAATGAACCCCTCCATTCTAAAGAGTATTCTGCAGAGCATA
-TCTTAAACATTCCTTTGTCCTTACCCATTCTTTCCACATCTGTTCTAGTATGGAATCCTT
-TTCATTTTTTTCTGAGGAGGGCCTTGGTCCCACTGCACCTCCTTTATAAAGCCttttttt
-ttttttgagacagagtcttgctctgtcgcccaggctggagtgtagtagcatgatctcagc
-tcactgcaacttccgcctcccgggttcaagcaattctcctgcctcagcctcccgagtagc
-tgggattacaggcgccagccaccatgcccagctaatttttgtatttttagtagagacagg
-gtttcatcatgttggtcaggatcgtctcgaactcctgacctcatgatccgcctgccttgg
-ccttccaaagtgctgggattataggcatgagccactgtgcctggGCTTATATTATAAAGC
-CTTCTCCTGAATAGTCTAAAAcagtgctggcccaaaggaaatataatacaaaccacatgt
-gtaattttaaatgtgttagtagccacatcaagaaaattttaaaaaggacaaaattaatgt
-actttattaatctaaaatcttaacatataaatcaatataaaaattattaatctattttac
-ctttttttgtattaaacccttgaaatctaatgtattttactcttacagcatatctcaatt
-cagcccagccatatttcaagtgcttaacagcctcatgtggcctgcgtgcctgctgtactg
-gactgtgcagGTCTTTTCCTAGGGTGTTGGTCACCTCAGACTAGATGCACTGCATATAAC
-TCTTAGAAGTTAAGTACATCTCATCTCTTCATTAACAAGATTGgtggttactaaagtttg
-atgaccaacaatcacctggatttttttaatatacagactcacagaacccaccaagattca
-ctaaatcaaaatcttgagagggaaacgggggatttatttttagatactttccaggctgat
-GATCCAGGTCCAGAAACTACCAAATAATACTATAAATTCTTTTAACTTTGTCTTAAGCCT
-CAAGCACATGATAGCAGAAAGCAAGCAGATTTTGGAAACATTGACAGTTCTCAAAACCTG
-GCTTTGTGGTTGTGCAGTGTTCAGAAAAGCATTTAAATGTTTCTCACTGCTGAAAGGGAC
-TATACTCGCCTGTTAGTGATTTACATACCACAGTTAGAACAGGTCCAATGCAAAGTGGTA
-CCCAATAAACAGAAGCTATTTTACTAATGACTTCCATGTAGTCCATTGAATTCAACCCAC
-GACCTCTTACCCAATACAATATCTACCTAAGAAACAAGATAATATAAGTCTTCTCTTCCT
-GCTTCAACTATTCAGATCTTTATAAACTGTTATATTATCTGGGAGATCTTTCCACCCTGC
-AGAGACTAACCCAACAACTTACCTCCTGTTTTCCATTAACCCAACTGCTGGTTTTTTAGT
-GGAAAAAAAAAGCTTCTGGTTGACAAAACTACTCTACAGAATGCTTCAAATCTATAAACT
-TAAAAAGCTGGTTTGTGACAGACCAGGCAGCTGACTCAGGCCCGAATTTAATGCGATCAA
-TGCAACTTTTGTCTTATTAAATAGGGGAGATTAAAAATTTTAAATATGGTTTACAAAGGA
-AATTCATCTATACTTACACCACCTACCCACAGTTACAGTAAAATATACAATACAGTTAGA
-AAGACTGAGCTGAAAAAAATCTTTCTAAATCACCCTTCATTCAAAATCATCAAGGGCTCA
-CAATTACCTAGAAGAGATAGTCATATAATTTTAAGACTGCAAGGAAATGCAGAGATTATT
-TTTTCCAGGCCTTCGCCAACTTAATCTCTCTTTCCAAGTTCAACTCCTATGTATGGTCAC
-ATAACATCTTTCACATGAAATATTTCTCTCACTTTTCCCTCCTCCTCTTTTCTTATCTTG
-GTGCACTCTACAGCCTGCTTCCCTTCACCACTTCCACCCAACACCTATCCAAATCCTCCT
-CCCATTCAGCCTGAAGACAGCTCCTGGGAGCTTTTCCTAACTACTACCCTCTTCTGAACT
-GTAGACCCACTATGCATGCTTTTCATGTGGCTCTAAATAATAATATATCACCTCATTCTA
-TCATATACCTTTCCATATGAATATCACCATACAATCACAAAGAACTCCAGTCTCCAACGT
-ATGTATATATACACACAATTTTGTGTTTGATCCtttttgttttttgagacagggtctcat
-tctcatcgcccaggctggagtgcagtggtttgatcatagatccgtgcaaccttcaacttc
-caggctcaagcgatcctcccactttagcccctcgaggacctgcgactaaaggcacatgcc
-accatgctcagccaaCATTCTTTTTAATAGATGGATAAACATGTCCTAGGTTAAAAGGAC
-TACTATGGCTAGTCACCCACATGTTTTGATTTCCAACCTAGTTCTCTTTCTACATATTTC
-AAGACAGATATAAATACTTAAACTCTCTGGTTCTCAAAGGGCATGTgaagcaccccagca
-atgcacaggaatactgtggaacactttacatttttgaggaagacacatcaacccatcgtt
-gaatctgccagacactgggtgcactgccagcttgaggtggttcgtagtttcaacattaga
-ttgtgttacactcctcgtgatggattgtgttatactcctcgcgatggcatatttttgtga
-agctgggtttgcagtagttgctgtggtaaaaagcaagtactgcacaaaaatcaatgacag
-gaaatgagggtggtggtgtccaaccaatgacaacatttgaaaagctatgcagcaacaggt
-ctacataacccaacagtaacaaattatagttatataagaacaaatttaacttttttcttt
-taatttatgtgaataactttttaaatggctaccaagttgctaagatataaatacttagcg
-ggcaggcgcagtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcggat
-cacctgaggtcaggagtttgagaccagcctgaccaatatggtgaaaccccgtctctatta
-aaattacaaaaattagccgggcattgctggcgtgcatctgtagtcccagctacttgggag
-gctaaggcaggagaatcgcttgaacccaggaggcggaggttgcagtgagccgagatcgcg
-ccactgcactccagcctgggcgacagagcgagactccttctcaaaacaaaaacaaaaaca
-ataaaaaaaacaaaacttacttagctatttggaccttgctacttaatacagagaactatg
-aggtatttcttgacttaggagtaccgtgaaaaattaaagacagtataagtgttataaatt
-gagaaagtttggaaacttctACTTTTCAGTGTCAAATATGAAAAAGTTCCTGTGGTAAGG
-AACTATATGCTAAGTTCCCAATATATGACAGTGCACAGCATAGTTATAACTAAATTAAAA
-GTTGTATATTGGTCTCCCAGAGGCCAAATCtggcctgtgcattgtttttttaaaatcttg
-agccaacacttaaaagtcaggaaaattcatatacaaatataaatttctggcttttatttg
-caaaacagagtatcaagcaacaatggacttgcattactgcagggcaatcatcagcttcag
-ctgagaagcagctaactccttttgaagaggcatgtgtttcccagtttgtttcagtcccta
-ccactcacatcacCTAAGCAAGGGCAATTACACCCGACTAGCTGCACTAATATCATCTGT
-CTGTCCCCCTCGAGTCCTGTGACTCCTCATCTTTACAAAGTAGAGGCAATGATTTATTTA
-TTGAAAACAAAAGCCTCATTATATAATGAAAAGTAAAGGAAATAAGTATTAGgcaataac
-tgggagagaagagactgtacctttgctcccttactctgccacaacctagctatatgagtc
-aactcaaatcacttctcttgcttcagtttcccgatctgtcaaataagcagaacttgttct
-attgagttcataggatACAATAAAATTTTATTTATTTGCTTTGGCACCAAAAACCTTTTA
-AATGCTGTTTTAAAAAAGTCTTCAAAACTACTTTTAAAAATCTATATTCCAAATACCTCT
-GAAATTATCTCTTGTACTCACCTTGAGAATTTTAACAACAACTTTTTCATTATTTGTGAT
-GTTGATGGCTTCAAATACTTCACTGTATTTACCTCGGCCTAATTTTCGAACCAGCTGGTA
-GTCATCTTGATTTCTGTGGACACAAACAAAATGACTTATAAACGGTCAAATTATCAGCAT
-CAATTCAAATTACAGGAATCTATTACCAGCAGCTGTAATAGAAATAAGAAGTATTTCAAA
-CAATTCCCAAATAGGtttttttttttttttttttttttttggagatggagtctcactctg
-tcgcccaggctagagtgcagtggcgcgatctctgctgactgccagctccacctcccgggt
-tcacaccattctcctgcctcagcctcccgagcagctgggaccacaggcgcctgccaccat
-gcccggctaattttttgaatttttagtagagacggcgggtcctcaccgtgttaaccagga
-tggtctcgatctcctgacctcgtgattcgtccgcctcggcctcccaaagtgctgggatta
-caggcgtgagccaccgcgcctggccCATTGtattttttttttttttaaattaGGCCAATT
-AAAATACGTGTGTTTCAAATCCTAGAATTAGAAAAACTTATACCTTTCAATTATTCTTTC
-TAATCCCAAACTGTTTACATCTTTATTGGCACATGACATGGAGCTGGCTTGTATTAAGGT
-TTGTTCTAAATACGTTTGTCTCCAACAAGAGACAGCTTTCCCCAAGAGAATAAttttttt
-ttttttttttttttttgagacggagtcttgctctgtcgcccaggctggagtgcagtggcg
-tgatctcggctcgctgcaagccccgcctcccaggttcacgccattctcctgcctcagcct
-cccctagtagctgggactacaggcgcccaccaccacgcccggctaatttttttgtatttt
-tagtaaagacggggtttcaccgtgttagccaggatggtctcgatctcctgaccttgtgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgcacccggccG
-GAGAATAATTTTTATATATTCTTGTCCCTTAGTGCTTGGTCCAGTGTTGGCACTTAGCAG
-GAACTAAAAACATTTTGCAAGACTGTTTCAATCTAGCCACACTTTGGCAGCAGCTGATTT
-TTAACAGGCCTCTTTGAAGGTAAATGGCTTTCAAATGTATAGGCTTAATCTATTTGCCCT
-CCAGGGCAAGCTCTGGGGATAGTCCATGCGTAGTACGAAGCACATTATAGATTGTAAACT
-ATAATCAGCGATCCCCTCCTCTACATATACCCATATTCTGTGACCAATAAGCAACATCAG
-AGGTAATAAACAGAGGTAGAATAAGGGAAATGCCAACATTTTCCTCCTGCCCCTGCCTGC
-TTCCAATGTAGAGCGCTTTGCTCTGAAGAATGACAAACACAGTTCCAATAAGGCCTAAAT
-TCTATCCTACTGGATAGAATCCTCTGGACCTACTAAGTATCCAATATGAACCAAATCAAC
-CACCTCAACCATTCATTTTCCTCAAGTAGCTAAAAAGAAAGTGAATGAAAAGACAAAAGG
-TACTAAAAACAATGGACAACATAATAATCATGGCAGGTGTAGGGGAAGAATGCTCCTACT
-TCTGGTTGAGTTCTCTTCCTATGGGAGGGCATACAAAACAAATGCCAGCAAGCAAACAGA
-ACCATGCCAAAAGCCCAAAAGGGCTCTTTAGTGCCATTTAAGCAGAACCAAGTGCAAAGC
-ACTCAATTTGAAGATAGCGGCTGAAATTCCTATAGTAAACACAGTGTCACCTAGAGTCCA
-AAGCCTGTGACATAAGAGGAGAATTGTTAGATTATCAGTAATAACAACATTTATTGGTAC
-TAAACCACACTGGCATTTAATGGTGTCTTTACAGCATACAGTGCCTCTGTATTCAGAGGC
-AATGTATTTACTGTTAAGAATCATGGCATACTCaaattagctgggtagggtggaaggtgc
-ctgtaatcccagctactcgagaggctgaggtgggagaatcacgtgaacccaggaggcgga
-ggctgcagtgagccgagatcacaccactgcactgcagccagggcaacagagcaagactcA
-TTTCCACACACACACATACACAAATTCATGGCATACTCAAGATTAAAAATACGCCCTATG
-ACAATTTAGGGAAGCCATCCACTAACCACTTACAGGTTACAGAAATCACATGCAGTCAGA
-TATAAAATACAGCATACAGGAGCTGTAGCTTTAGTTTTCAAATTGCTTTCTTTTGCACTT
-GAATGTCAAAATGCTTTTATCACAAAAGTATGATCTGAACAATTAAATGTCTACCACATT
-GGGACAGGAAATGCAAACATCCAAATGAGTCTGCACAGAGAATTAGGAGGGCAAACACAG
-CTGTTCAGGCAGACTACAACTGTTCAAGATAGAATTTGGGCTGAATTCCATGCTAAGACA
-TGCCTAGTCTCAGGATAAGGGCAAATGTTTAAGAATTTAATTGTTTCTCATCAGAAAGAA
-GTTACCTCTTTGGAGAACTGTTTCGTCCTCCTGTATTAACACGAAACAACATTCTCTACC
-TCAAAAATACTTTATATAAGACTTTGGTGTTTTCAAAGTCTCTCAAGTATCACTTCTCAC
-TGATCTGCAATGCCCTTGGCTTGATAAGCAAGCTGATAGGTAACTTTTTGTTGCCAGGTG
-CCCATACAGAATACCgtcatgcgttatttaatgacattctgagaaatgtgttaaacatca
-gagtgtttacacaaacctacatggtatggcatattacatacctagggtatggcctacggc
-tcctaggatacaaatgtgtaccgtaataaatactttaggcaattgtaacacaatggtatt
-tgtgtatctaaacgtagaaaaggtaatgaatgcactgttgatgttacgatgacatcacta
-ggccacagacatttttcagctctcttataatcttatggaaccactgtcctacatgtggtc
-tgtcattaattcaaactttgttatgtggtgcacgactgCATATACATCATAGAAAAGGAT
-AAGAAACTAAAATGATTTTTAAATGGTAAGCCCATTAAAATTGTTCACTTGCCAAAGCAA
-CTCTGCTTCCTCACTGCAAAACCAAATTTTCAGCTCAAAAGAAAACACAAATTGGGCTTT
-GATCCTGAGGTATACACATACAGAGTCACGGAGGTTTTCTGACAAAAACTACTCAACAGA
-TCCACAAGATTCAGCCCTTTGAGTGAGTATAATGAAGTCAACAAAAACAATTACCCCCAT
-TCCACCACATGTGACTCGTAATCCCAGTATTCTCGAGGTCTGTGTGTATTAACATCTGTG
-TAAACTCTGGCCCTGCTTGGCACGGGTCCCGACATGTCAGACAGGTTGGCGGACAAAGCT
-GGACTTGATGTTTGGAGATCTGGCAGTCACTGTGTTCAGAAGCAGCTGGGGGTAAGACCT
-TGTTTCAGACCTGTTTTCTTCAAACTGCAGAAACAAAATGCACAAAGTCCAAGGAATCAT
-TTACAGAAGGTATATGGGAAGGAAATAATCTTACAAATAATAATGGCCTGAAATATACCT
-CTGGCTCTCCTACCTACAGCCAATAAATATAGCTCAACTGTGTTAACCAGTGCTTCCTAT
-AACATGAGAAGAAAAATCCCAAGAAATACAGTAAACTGATATTTGCTTTAATCATATTTT
-GCCAAATATCCTGTTACCTCTGCAGGCAAAATTTGAATGATTTTTGTAAGACAGCCTGGA
-AGAGAAAAATGGCATTGAGGATAGATACATCAGCATTACCACTAGTTATATATTCTACAA
-AAGGTATTGGCAAGAAAAATACTTTCTTTTCAGCAGCTTTCTGTAACTTAAGTAGGGGTG
-CTAAAAGGTTCTAGAATGGCGGCAAAGCTAAGAGTACAACTTGCCATTCTGACTCATATT
-TGATGAAACCAGGAAGAGAATAAAGGCTTGTTCTCATACATCAAAGCTCCATGTCATCTT
-ATACCAATCCAAATCTTTTGGGGGAACCTTAAGGTAATAATCAGTAGAACCTTGATCACC
-ATTTGAAAGACACACTTGGTTTCATTAAATTTAAAAACAGAAATCAGTAATATTCTCTTT
-ATATTTAATACAGGAGCTTAAAAACTGGTATAAAACAGTAATACAGATTAGCTGAGCTAA
-TGCAAAATTTGACACCGGGGGAAAATAAGTAAGATGTTAGAAATATGCTATCAAATCAGG
-TTCCTTTCCAATGATGTCTTCCCTATCTCCTACAGCATGTGCTGATTCCCCTCATTATGC
-ATTTAGATGAAATTGTATTGAGTCTCCAGATTGTGATAACGTGAGAAGGATATAACACGT
-ATGCAAGTCTCCTGGCTGAGACAGCATAACTTCAATTTGTATGTGTGTATGTGttttaag
-acagggtcttattccactgcccagactggaatgcagtggtgtgatcatggctcactgaag
-cctcaacttcctggactccggtgattctttcacctcagcctcccaggtagctgagactac
-aggcacgcaccaccaccctcagctaattttctgtattttcagtagagacggtgtttcacc
-atgttgcccaggctggtcttgaactcccaggctcaagcaatcctcccacctcagcctccc
-aaagtgctgagatcacagatgtgagccaccgcacccagccATAACTTCAATTCAATTACC
-AGGAAACATTCAGAAAAAGAGGAAGTGTCTATTTAAAAAGGGGGAAGGGGTACTATACTT
-CTAAAACATGTCCACAGCATAAAAGACAAATGGAGGCTAAAGAGACATTGCATAAATGCA
-ATACTCTAGACTGTATCCCATACTGCAGGAGGTGGAGGGGGAtgctataaaaaacaatat
-cgacagaactggaattcagagggtattaaattattgtatcaatgtaaatttgtgaagttg
-gtacataatcacaatagttaagagaatatacctattcttttttttttttttttgagatgg
-agtttcgctcttgttgctcaggctggagtgcaatggcgtgatcttggctcaccacaacct
-ctgccgcctcccaggttcatgtgattctcctgcctcagcctcccgagtagctgggattac
-aggcatgcgccaccatgcctggctaattttgtatttttagtagagatagggtttctctat
-gttggtcaggctggtctcaaactcccgacctcaggtgatccgccctcctcggcctcccaa
-agtgctaggattacaggcgtgagccacctcgcccagcccaagaatatgtctattgttaag
-aaattttcctgaagtaattagaagtaaacagccatgatgcatataatctaccctaaaatg
-attcaggaaaaaaatgtgcccacacgtttacatgtgtatatatatagcacacatgactgc
-acactcacaaatgataaaacaagctgggtaaaatattacaataggtaaacgtgcgtaaag
-ggaatagagatgccctttgtactatttttatttactttttgttgaaatcttcttatttga
-aacaaggtctccctctgtaggccaggctagagtacagtggtctgatcacagctcactgca
-gccttgacctcccaggctcaatcaatcctcccacctctgcctcccaagtagttgggacca
-caggcgtgggctaccacagctggctaattaaataaattttttttttgtaaagatggggtt
-tccctatgttgcccaggctggtctcaaactcctgggttcaagtgatgctcccaccacagc
-ctcccaaagtactgtgattataggagtgatccaccatacccagctTGTTGAAACACtttt
-ttaaattgtggtaaaatatacataacataaactttatggccaggcacagtggctcacttt
-gggaggcttaagagggtggatcgcttgaacccaggagttcgcaaccagtctgggcaacat
-ggtaaaaccccatctctactgaaaatacaaaaaattagccaggtgtgatggtgtctgcct
-gcagtcccagctacttgggaggctgaggcaggagaatcaccagagaccaggaagtcgagg
-ctacagtgagctgtgattgcaccactgcactccagcctgggtgacaggagagagacctca
-tctaaaaaaaataaaaactgccattttatccacatttaaacctaaagctcagttgcatta
-agtatattcacattcttgtgcagtaatcaccagatcatccatttctacaaatttttacca
-tcccaaatgaaaactatgtatccactaaacactaattttccctcccccaactctttgcaa
-ccactattctattttctgcctgagctggctattctaggaacctcatataagtggaatcag
-acaatatttgtcctttgttttgtttatttaatttagcataatgtcttcaaggctgatcca
-tgttgtagcatgtgttagaattccaatccttttaaaggctgaatgatattgcactgtgta
-tatatatacacacacacacacacacacacacacaccacattttgcttatccatttatctg
-ctgatggacacttgagttgcttccacagcttggctattgtaaataatgctgctatgaaca
-taggtgtacaaacatctgtttgagacctcgctttcaaatcttttatgtatatatccagaa
-gtggaactgctgaaccatgtagtaattctatgttaattttttgaagaaccagcatattgt
-ttcaacaagctgggcacggtggctcactcctatacagcaactgtatcattttacactccc
-aggaacagtgcaaaggctacaacttctctacatccttactaacacttgttattttctgtt
-ttttGCTTGtttttatagagacaggggtcttgcttatgcccaggctggtcttgagctcct
-ggcctcaagggatcctcccacctcggcctcccaaagtgctCTCAAAATAGACTGTGCCTG
-GCCTATTTTTTGGTTTTCTTTTCTTCTTCTTCTTttttttttttcagtaacagccctcct
-aatgagtatgaagttgtatctcattgactgtgattttaatttgcatttccctaatgatta
-atgatgttgagcatctttttacatgcttattggccatttgtatatttgttttggagaatg
-tctattcaaagctgttgtccattttttgattgggttgttttgtttgttGACGATGCATTT
-GTTAACTATACTGTTTTTTTGTTGCTTACAAGCTGCTCATCTTTCCAAGGTAAGCTGTAA
-CTTAGCTACCACACCCAAAGAGAAGCCAGAAGAGATACCTCCTTATGCCCATGGTGTCGG
-CAGCTAAAGGCTTTCAGAAGAATAGCAAGACTGGGATGGAGATTAATTCTCTATTCCTTA
-ACCGTGACAAACACAATTAATGACATTCCACTCCAAATATATGAGATCAAAAGATTCACA
-TGCTGACTTATGAATTCTCCCACCCAAAAAACTGCTGTAACTTGCCTCTGTTCAACTCAA
-ACCTTCTGAGGTTCCATAAATGTACTAAATGACCAGAAAACAACAAAGTAATTCAAGTAC
-CAAAAGTCTTTAAAATTATTTCTATTTCTTTGATTTTGTAAAACCTGGGTGACATTAATC
-TATCTTCACTTAATATCAGTTAAAACTGTAAACGCACACACACACAAACACATCAAACAT
-GCAAAAACCAGATGTTTTCTTGTAATTTTTCTTCTTCCCAAAGAAATAAGGTCATCTATG
-TTGTAGGATTGGTGACTCTGTGACTACTATGCCTGCCTTGACAGCAATGAAAGACACTAG
-GAAAACCGTAGAGAAAGGTGTAGGTGTGAATATGGCCAAAATAGTAGAAACAGCAGCATG
-AACCCAACAGAAATGCTGTCCCCAGAAATTTATTACTTTTAATATACTAAACTTTTAAAT
-TCTCAGCCTCTCCTCTGACAGGAAACAGTATCTTTCTCTACATAACCTTTACAGCCACTT
-TACTCTTCTGGTTAACATTTTATACGTGTAAGACAGCCTTCGTCTGTGGATCTCAAAGCC
-CTTTTCCTATGCTTAAAAGTGATCTCTCTGTTGGGCTTTTCCCAGCTTTGGTTCATCACT
-TATAAAACCTGTCTAACTGTGCTTGCAGACTGAAGGGAAGATGAAGTGAGATGATCTTCC
-AGAAAGGGCTTAGAAACATGAAATGCATGTAAATTTGTATTAAGTAATTACTATCCCCTA
-GCTCCTTAGTGAAAGCTAATAAGCAGAAACCTATCTTTACAGGCTGGAACCTTCATTCTT
-TAAAATACAAAAATTATAGTAGCCGTGGTTAATTCCCGGCCACTGAGGGCTAACTCCCAA
-GTATACATGACATTACAAAATGAGTCCTCATTTCTCCCTGGAAACCATCTGACATATGGA
-GAATAGCCAACTCCTATTACTAGTCATGTACATTCTCATCACCCAGTCTTCTTCTGCTGT
-TTCAAGGCCCTGGCATCCTCTGTGAGGAGTGGGAAAAGACTAATAACTAATGAAACTCTT
-GAGATTCTCCAGTACTTGTCTGAATGACCCTTGAAGCTTTGGGGCTCATCAACTGGGACC
-TAATTTATGAACTAGCAGATCTGATTCTCCACTGGGAAGACAACAAGCTAACTATTTTTG
-CAGTACCCCCAAAGAGGTGCTTCACCTTACTGTCACGCATACCAAATAATCTGCTTATAG
-TAAGAAAGGTATTCACATGAATTTCAAATGGCTGGCCTTCATTAATTATACGGGAAAATA
-AAACAGAGGATTCTTCAACTGTGACTCTGTAATCTCAGATAGATAAAAGGGTACTAAGAG
-ATTGGGGGTTAAGGGATGGTGATAAAAAGGGGATGTGAagcccagtgtggtggctcatac
-ctataatcccagcactctggcaggatcacttgagcccaggagtttgagaccaccctgggc
-aacacagcgagacctcctctctacaaataacataaaaatgagctgggtgtagtggagtac
-aactgtggtcccaggtacttggtaggctgagatggaaggatcacttgagcctgggaggtc
-aaggttgcagtgagccatgatctcaccactgcactccaacctgggtgacagagcaagacc
-ctgtctcaaaaacaaacaaacaaacaaacaaaaaacaaaAACAAGAGGGGATGTGAAAAG
-ACAGAAAAGGGAGGTCAAAGACCAAATATTATCATTATTATTTTTTTGAGACAGgagaca
-gggtcttgcgctgtcacccaggctggagtgcagtggtgcaatctcgctcggctcactgaa
-acctccacctcatctcctgggcttgagcaatcctcccacctcagcctcctgagtagttgg
-gactatagctatgcgccatcaggcccagctaatatttgtattttttgtagagacaaggtt
-ttgtcatgatgcccaggctggtctcaaactcctggactcaagtgatccaccagcctcagc
-ctcccgaagtgctgagattacaggtgtgagccaccatgcccaaccAAGATAAACATTATC
-TTATTTAGAAATAGTATTTCACTTATACCTCTGCAAATGCATATGTATATCACATGTAAG
-CTAACAGGAAGAAAACACACAGCCTACATTTCTCAATTTTTGGTTTGATTCTTCCCTACA
-TTCCTGATTTTGTCCATCCCTTAAATAGAtaaccatctactatgaaaaagtactatccta
-ggccttaggaatataagtgagcaaggcagaACAGGGGTGAGACAAgtatgccattgaaga
-ttttacctatggactaagggtaacagaaattcattgaaaagttttaagcagaaaagtgac
-ccatacatattgtttttaaaatttttactctggctgagtgtgggacaggacttagggaga
-aggctgttaacagtagcacacgtgagagaaatgatgacctaaggtggtggcatgtggaga
-tcagtggactaatatgaggaacaaaatttatggtgtaaaatcaatagctctgagtgaact
-ggaaaatgctgtatgaagtgggaggtgactcttggatttcttgcttgacagactgttggt
-gccattcatggagataagagtgcacaagataggttttggacttaaggttaaaatggcttt
-gaatcattcaaacgaagattctgaataggcagttagatattacaagtctggaactaagag
-tttctcagctttaagtatctaactcttccaacaactctacgaggcaagcattagtttctc
-taatctacaaataagaacagcctaagttcagtagcttgaccaagaatatccaatacagtt
-acagctgggattcaaagacagtgagttggcctccaaggttcaagtcttctcactCCTACA
-GAACACAATCACTTTCTACTGCACATTCACACACACACACACCAGTCTTCAAATCTTAAT
-ttctcaattggaccctaagttctacaaagttaagaaccatgtttaatttacctttttaat
-ttatagtacctagcctaaggcttgcattttgtagcacgttcagtaaacactatttggtga
-tcaaattaatCTTGGTTTATTTTTTAAAAATGAAATGAAAATGAAGTTGCATCCAAAGTA
-TAGGGTGTTCCTAAATACTTCAGGTCATCTGGTACGCAACTAGGAGAACTGGAAAACCAA
-GTCAAAGGTTCTTGAGTAATTGTTCCCTTCCCTCTCTCTCTTTCCCAATACTACAGCTTC
-TATTAAATCACAGGACTACAACTAGGATTTGTCTTTTTCCCCTCGATAATTCAAATTAAG
-AGAATACTGAAGAAACTTGATTTTACCAATTTTTATAGCAGCTTATTTGGAAGATGGAAA
-AAGTGCCTGAGTCCTAGATATTTGGAAGATCAATTCTCCTCTCCACTGTTCATAATACTA
-GTATATCTTAAGGCAATCTAACAAAATGCACTGCCTTTCTTATTAAGTTCCATTTTAAAT
-TGTCTTACTTAGTGCTTACTGTTCTCATGTAATTGCATAAAAGGAGGTGTAACTTTAGTG
-GCTAACCATTTCAGACCACTACATCTACCTTAACACCGTCAGAATGACTTTGAAGACATG
-GCTAGGTCTTGTATGCTCAACGTTTAGCCTAACAGAAGCCAATTAATCAGCTACGAAAAA
-AGTATCATGTCAATGAATTTTTCCCGACTGAAGTAAGATCACATCGAAGCCAACTGCATG
-GGTCTGCATGACCTATTCTTTAATAAAGTATAAGTAAATAAAAAGAAAATGCCATTAAAC
-CATAAGGAAAAATTGTCCATTGCCAAAATCATAAGTTTACTGATATACACTGAATACAGC
-AGAATTAATTTCAATAAAAACTCCTCTTGCCCTTAGCTAGTCCCTCCTTCTAATCTCTTA
-TGTTCAGTTGTTATTTTTCAATTTGGCAACTAAAAAGAAAACTAGAGGCTTAGTAACAGT
-CCAATACCAGAAAACTATACAAACAAGTTTGCTTAGTCATTTCTGCTAATGTATTTTTAT
-TGATGAATTTCCTAGTATCAGAAATGGAAAAGATCATTCTAGAACTTTAAGTCAATTTTT
-GAACTGTAATATAATTAGTTCTTTTTAACCCTAATGTTTATTAGTCTCCATCTTAAAAGG
-AAAAAAAAAATCTCCTTCTCATCCCTAAATGAACCATAGCAAATGAACAAGATCTCATCA
-TCATCCCGACAGGACAAAGATTTCTATAGCAAAGAATGAGGAATGTGCTTAGATTGCACT
-GACTGCATGGTTTAGGACTGCTTGTTTAGAGGAAAAGCAGCTATACAGGAAGACACCTTT
-TATGCACTGCTGCAGAGAATGAACTCTTTTTCCAAGCAATCAGGCAACATAAACTGGTAA
-GAGACAAACAAGACTTGTGGAACTCAGCGAGACCTTAAATATGTATACTTTTCTACCTTG
-CTACAGAAGCAAAGAGAAAAATTCAGTCAAACTTGCCCATTTCCCTTTACAAAAGGGGCA
-CTGATTAGAAGGCCAACTTAATACAAAAAAGCACAAGTAGCTAATGTTACCTGAATTACT
-TATTTCAAATGTCCATACTTAACCTTAATTTCTTTCTTCCTTTCCAATCAAGAGCAGAAT
-GCTCATACATCAAGcatttactgaacgtttactatgtaccaggaaatgtgtgcctgactg
-ccagaaaggcattctttctcttggtcctGGAGAAAGTATCTCTGCCCTCAGACAAAGAAA
-ACAGACCATTACAATCTCAAGTGATCAGTGCTTGAAACAATTAAGTCATGGTGGTGTACA
-GACGTTGAAGGGTATTTAAACTATCACCAACCCAtcattcattcaacaaatatttatgga
-gtacctaAAATGGGGAAAAACTGTAAGAGAAAAAAAAAACTGCACTTAAAGTACGCACAG
-GAATTATTCAGATGGAAAACATTAAAACAAGAAATTGCAAAGCGTAACACTTTAAAGCAA
-GTTAAGAATTTTAAAGACCTATAATTTTGCACCCTAAAATGACCAAAGGCTGGCACATTT
-TGTTATCTTCTATAAGAAACACATCATTGGATGCCACATGCAACGTGGCATCAGGTGTAA
-AAAAGCACCTGATGTGCTTTTTTTGCACATCAGGTCAGCAACCTTTTTATATCTGATTTG
-GAGACTATTAGTTTACTCGACTGTTACCATTTTGTGCTTAAAACAAACAGTATCATTAAT
-TCACAAGCTTTGGAATTCTTTCTCTTTATTTTCTTTTCTCTACTTCCAACACTAATCAGT
-TCCTtgttgcccaagctggagtgcagtggcacaatcgtagctcactgccacttcaaattc
-ctgggctcaagtaatcctcccacctcagcctcccaagtaactgaggctacaggcatgtgt
-caccacacctggcCCACTCATCTTTAAATAAGACAGAGAAGTAATTATAGCCAAAAGGGA
-ATAGAAAATGCAAACCCAGAGATATAAGCAAGCAAGGAAGCCTGGAAAGCCTTTGTTGAT
-CCTGAAAATTAGAATTTTGTTCTCACATAAACCAAAGCCCAGGGCTCTCACAAGACAAAA
-AGTCTAATAGGAGGCCCTCTTCATAAGGTGGGACTTCAGAGGCATACTTCCTAATGGTGA
-GAGTGACTAGGGAGTGGAAGATCCAGGGAGGAATTAAAGCCCTACTGAAGGGAATATCAT
-ATCTTAAGCTTGTTTTAAGGTGGTCTCTGGATTAGTGCCCATGCATACCTGATATAAGCA
-AGCTCTCCATGGAGGAAAGTACCTTACTGTGGGCCTCAAATGATCACTACAAATATCTAt
-ttttatttttattattttttatttttttgagacagagtctcgctctgtcacccaggctgg
-agtacagtggcctgatctcagctcactgcaagctctgcttcctgggttcacgccattctc
-ctgcctcagcctcccgagtagctgggactacaggagtccgccaccacgcccggctaattt
-tttttttttttttttttttaagtaaagacggggtttcaccgtgttagccaggacggtctc
-gatctcctgacctcgtgatccacccgccttggcctcccaaagtgctgggattacaggtgt
-gagccaccgcacccagccAATTATTTATTTTTAAATACAATGTCCTAGCAGATCTCAAAA
-AACAAGAGGAAAAATATAGTGAAATCGTTGGATATACttttttttttttttttttttgcc
-acaaagtcttgttctgccacccaggttagagtgcagtggcacgatctcagttcattgcaa
-cctctgcctcccaggttcaagtgattctcctgcctcagcctccagagtagctgggactac
-aggtgcatgccaccatgcccggctaatttttgtatttttagtagtgagggggttttgcca
-tgttttggccaggctggtcttgaacttctgacctcaagtgacccgcccatcttggcctcc
-caaagtgctgtgattataggcgtaagccaccgtgcccagccAGTTTGATATACTTTTAAT
-TGGTACTAGCAGAAAAGAGAATGGGATAAAGGCAGTAACTGAAGACAGTTGAAAATATCC
-CAGAAGCAATCAGACACAATCAAATTCCAGAAGCAAACAATTTccaaacaagatcaataa
-aaagaaatccaaaaccaaacatataattacaaaatagcaggaaaaaacaaagatgagttg
-ggtgtaatggcacaggcctatagtcccagctatttgggaggctgatacaggaagattgct
-tgtgcccaggagttggaggccagcctgggcaaaacagcaagaccttgtctcaaacaaaaa
-caaaaaactaaagacaagcaagtacagaaaaaggcagattatattcaaagagcaacatta
-gaacagctgatttttcaaaaccaacaatgaagccaagtagtttaatacctgcagtgtgct
-gaaaaaaataaatagccgccaaattaaaattctgttatcaagcaaatgtctctaaagaaa
-aaagaaaaataatcccattttggaaggtctgagttgaaagaaaaaataaagagcaaaaaa
-gaggaaaatttacagacagctccaaacaaacactgattatacaaaagaataacaatacct
-tgaggagctttaaaacatagaatacataacaataaaaacacagtgtattgaggagatttc
-aaagtattctttctaaaggtcttttattatatgaaaagaagataaaattataatatcagg
-ttttgctaagttatagctgcaagtcacaagatgtatgacaactaattacagaataaaaat
-agcatatatttccaaaccagaaagagggaaaagtaaaatcataaaaagaatccaaaagaa
-tgttaagaagggagaagaaaaaaatctagaacataagaagcataggggaagaaagttgaa
-ttggaatatgattaattatattaaatataagtggaataaattatccaggtaaaagacaaa
-gactatcatatcagactggattaaaaaagaaatccaaatgaaccagaataatccaaacaa
-ttctgaaaaataataaagctggaagaattatactaactgatcttaaacttattacaaagc
-tatagttgtcaaaacagtgtattggcaaaaggataatacatagatcaagggaacagaata
-aagagtacagaaatacactcacacaaacaaggccaattaatttttgacaaaggtacaaag
-gcagttcaatggagaaaggacatatatacatatatatataaatatattatgtattttttt
-cgagatagggtctgcctctggtgcccacgctggagtgcaggggcatgatctcaactcact
-gcaacctccgcctcctgggttcaagtgattctcctgcctcagcctccaaagtagctagga
-ccacaggagtgtgtcactatgccctgctaatttttgtatttttagtagagacagggtttc
-accatattgcctaggctggtctcaaatttctgagctcaactgatccacctgccttggcct
-cccaaagtgctgggattacaggcataataatcttttctataaattgttttggaagacttg
-gagatcaatatgcaaaatcataaactttaatctaaatctcacactttatataaagataat
-tcataatgaatcacagatatcaatgtaaaacttgggtcagatgcggtggctcatgactgt
-ataatcccaggctgggtgacaaggcaagactctacctctgggggggaaaaaaaaagatat
-aaatgtaaaattatcaaaccttcttgcaaccaggggttaggcagagtttgaagacatgac
-actaaaagcatgggctgtaaaactgataaactgaacttcatcaacgttaaaatatttctg
-ctctgtgaaagacactattaagaaaataagccagacacaagaagaatgtatttgcaaatc
-acaaatcgaataaagaacttgtatctgtaacattaaaaaactcaataagaaaacagctca
-atttaaaaatgggcaaaagacgtgaacatacacaccacaaaagaagatatacacataagt
-atatgaaaagatacacaacactgccagacagcagggaaaatgaaattaaatcatacaact
-accactacagatttattaaaatggctaaaatttaaaaaaacagaaaacaaaactatacca
-aaagctggtgtggatgcagagtaacagtaactaatacattcctggtaggaatgcaaaatg
-gttttggaaaacagtttggcagtttcttatagagttaaacatgtacttaagcatacaacc
-agcattcccactcctaggtatttactcaagagaaacggaaacccgtatctacacaaaaac
-ttatacacaaacatttaaggcagctttattcataattgtgaaaaaacagaaacaaccaag
-gtgtccaacagttacatgaacaaacaaatggtttgccatgtgatgcttagcaataaaaag
-gaacaaattactgatttgtgcaacaaaatggatgaatcGtttttctttttttggtagaga
-cagggtctcgctttgttgcccaggctggtctcaaacgtctagcctcaagtaatcctttgg
-cttcagtctcccaaagtgctaggattacaggtgtgagctgctacacctgaccaacatggt
-gaatcttaaaagtgaagaagccagaaacaaaagcctacatattgtatacttccatttata
-tcaggggtccccaatccccgggccatgggcctgtaccagttcatggcctgttaggaacca
-ggctacacagcaggaggtgagcagcgggagtcactcgcattactgcccgagctctgcctc
-ctgtcccatcagcaacagcattagattctcataggagaaccctattgtgaactgcacatg
-tgaggaatctaggAGGTGGAGCTCAATTTTTCTCCTTTAAGGAAAGGAAATAAGTAAGCA
-TGGAAAGAGAGCCTAAATTTCTCCCTTTCCATGCTTATTCATTACAAGGGTATTCCTAAG
-TCCAATGGGCTtggaaagggagaaatagcaactctacagtagaaaaacctggcagacttt
-actgaaatatcactagtgttaagtcactttgacatcatatgcccctgatataatgtgatg
-agaagggcacttcacctctgtggtagtcttctcaaaaatccataaccacaatttaatctt
-gagaaaacatcaaacctgtattgaaggacattctataacatacatcaccagtcttcttca
-aaagtttccaagtaatgaaaattaaagacagactaagaagcttcacagactggaggatac
-taaggagacatgatgactaaattaatgtggtatcctggactggctccttgaacagaaaaa
-ggatacaactggtaaaatccaaacaaagcctgtagtttagttaatagtattataccgatg
-ttaatttcttaattattttatttatttatttatttttagagatggggtctcactttgtca
-cccaggctggagtgcaatggtgtgatcctagctctcccagttcacagcagcctcaaactc
-ctgggctcaagcgatcctcctgccccagcctcctaagtagctaggactacaggcacatgc
-caccatgcccacctaacttctgagaaccaggttggtctcaaacgcctggcctcaagcaat
-cctccccaccacggcctccagagttactgggataacaggtgtgagccaccatgactggcc
-cagtttcttagtgttgatgacatatcacggttatggcaagatgtgaacattaggatatac
-tgagggaagcatatatggagattctatctgtaacttctgtaaacctaaaattttcaacat
-tacaagttAAATACTGCCAATATTTAACTTGAAATGCTAAAGAGGATGAGAtgctagaga
-agatgaggaaaaactgaaactcatacattgctagtgtgaacgcaaaatagtactgtatag
-ccattctagaaaacagtttggcaacttctttataaataagttaaatgtacatttttcata
-tgacccagcaatccaactcacagttatttaccctagaaaaatgaaaacttaggtccacaa
-aagcctataatgttatgttcacagcaactgtattcataatcaccaaagaatgaaaaccaa
-aatgtccttcaaggagtgaatggataaaaataactatagtctatccataaatggaatact
-actcagtaataaaaaggaactaaccatttacacacacaataactttgatgaatctcagag
-gcagtatgctgaatgaaataagccagtctcaaaatattacataatgtttgatttcattta
-tatgacattcacgaaaagataaaactgtagtgaggttgggcacggtggctcacgcctgta
-atcccagcactttgggaggccgaagcggatggatcacaaggtcaggagatcgagaccatc
-ctggctaacacggtgaaaccccgtctctactaaaaatataaaaaattagccgggagcggt
-ggtgggcgcctgtagtcccaactactcgggaggctgagcttgcagtgagctgagatcacg
-ccaatgcactccagcctgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaaa
-aaaaactgtagtaactcagaacagaacagtggttgctagagattaggggtgggaggctag
-gtatgttaccaagggtaacatgcagaaggtgatataactattctatgtcccagttgtgat
-ggtagttacttgaatctatgtatgtattaaaattcatagaacagtatacacaaaaaggag
-tcaattttactgtgtattaatttaaaaaaaaATTTAAAAAAAGGAAAAAAATTCTATCAC
-ATGCTGTCTAAAAGAGATACATCTAggccgggtgcagctgctcacgcctgtaatcccagc
-actttgggaggctgaggtgggcagatcacctgaggtcaggagctcaaaaccaccctggcc
-agtacagtgaaacccatctctactaaaaatacaaaaatgagctgggtgtggtggtgcgtg
-cctgtagtcccagctgctcttagaggctgaggcaggggaatcgcttgaaactctcgagag
-gcgaaggttgtagcaagataacgccattgcattccagcctgggagacagagggaggctcc
-ttctcaaaaaaaaaaaaaaaaaaaTTAATAAACAAATAAATAAAAGAGATACATCTaggc
-caggtgtggtggctcacttgaggtcaggagtttgagaccagcctggccaacacagcgaaa
-cctcatctctacttaaaaacaacaacaacaacaaaacacaaaaattagctgggtgtggtg
-gcgggtgcctataatcccagctactcaggaggctgaggctggagaatcgcttgaacctag
-gaggtggaggttgcagtgggcactccagcatgggtgacggagactccatctcaaaaaaaa
-aaaaaaaaaaaaaaGAGATACATCTAAAACATGGGGTATATATTATAtacacgatgtata
-catgcactgaaacatcacaatatatcccataaatatgtacaattatgtatcaattagaaa
-tTAAGAGCTGGGCACAGCTCAGGGGtccctgcactttgggagactgaagaggaaagatgg
-cttgaggctgagttcgtgaccagcctgggcaacacagcaagactaccatctctacagaaa
-aatttaaaagttagctaagtatggtgcatgcacctgtgtcctagctactcagaaggctga
-agtgatcatgtgaacctaggagtttgaggcttcagtgagctatgatcacagtgttgcact
-ccaacctggctgacagacactctgcctcaaaaTCAATCAATCaataaattttaaataaaa
-aaaaaCATAGGCTATAGAGAGTTTGTTCataaaaatacgatatttcaaaacgtgggatac
-aattaaagcaggacttagaaatttataaacttaggccaggtgtggttgctcatgcctgta
-atcccagcactttgggaggctgaggtgagtggattacttgaatctaggagttcgagacca
-gcctgggcaacatggcgagacctcgcctctataaaaataaaaattTTAAAAATCggctgg
-gcgcagtggctcacgcctgtaatcccagcactgtgggaggctgaggcgggcggatcacga
-ggtcagaagatcgagaccaccctggctaacatggtgaaaccccgtctctactaaaaatac
-aaaaattagctgggcatggtggcgggcgcctgtaatcccagctactcaggaggctgaggc
-aagagaatggcgtgaacccgggaggcagagcttgcagtgagccgagatcgtgccactgca
-ctccagcctgggcgacagagcgagactccatctcaaaaaaaaaaaaaaaaagaaaaaaaa
-aaTAATAATAATTAggctgtgcacagtggctaatgcctgtaatcccaacactttgggagg
-ctgaggccaaggtgtgaggattgcttgagctcaggagtttggagaccagcctaggcaaca
-tagtgagaccctgtctctatttttttaacttaaaactattaaaaaaaaaaaaaaaaaaaa
-aaagccaggtgtggtggcatgcacctgtggtccaactattcaggagtctgagatgggagg
-aacacttgagcctaggaggtggaggctgcagtgagctgtgattatgccactgcactctag
-cctgggcgacatagcaaggccctgattcgaaaataaaaaTTCATAAACTTGAACttagaa
-aagcaaactaaaaattaagaacttacacatatctcaataaatttgaaaacagaagcccag
-agaaactagaaggaaaaaaacgggaaaagcagcaatcaaagaaatatgaaacaaagaGGA
-TCCACAATACCAATTGAGTCTTTAAAAATGCTCGTgctgagcccgtggctcatgcctgta
-atcccaacactttgaaaggccaaggcaaaggattgtctgagtccaggagtttgagatcag
-cctgggcaacagagtgcaacccccaatctctacaaaaataatttaaaaattaggccaggc
-atggtggctcatgactgtaatcccaatacttaggaaggctgaagcgggaagactgcttga
-gcccaggagtttgagaccagcctgggcaatacagtgagactccatctcaaaaaaattgtt
-tttaataataaaaacaatggaaaaaattagctgagtcccagctactcaggaggctaaggc
-aggaagatcacttgagcccaggagtttgaggctgcagtgagctatgatcatgtcactgca
-ctctagccagggcgacagagaaagaccctgcctcTGCAGGTGGGGGGGAAGAAATTAAAA
-ATGTAAGTGTGCTTGATTTAAGAAAAAAAAAAAGAAGggccaggtgtgatggctcatacc
-tgtaatcccagcactttgggaggctgaagcaggcggatcacaaggtcaggagctcgagac
-cagtctggccaatatggtgaaaccccatctctactaaaaatataaaaaattagctgggtg
-tggtgccacacgcctgtagtcccagcaggaggataaggcaggagaatcgcttgaacccgg
-gaggcggcagaggttgcagtgagctgagatcatgccactgcactccagcctggcgacagt
-gagactctgtctcaaaaaaagaaagaaagaatgagagagagagagagaaagagagagaga
-cagacagagagagagagagagagagagagagagagagagagagagagaATGAATATTAGG
-GTAAATGTCCAATATCAAGAATGGAAATGAGGGAGTGAGGGATGAATTAGGGTAAATGTc
-cagtatcaagaatggaaatgatacatcactacagatcctacagatggtaaaaagataaga
-caatatcacgaacaactttgtgcccacaaacttgaaattcccagaagaaaaataatttat
-caaaactgatacaagaTCCCAGTCTGATTCTCAGGGAGAAAAAACAAAAACTGACACAAA
-AAATGAAAACCATAAATAGTCCCATAACCAATAAATTCAATCAGTATTGTTTCAACCTGT
-TCTATTCTAATGTCTTTGAACTGCACAGATTAACATTTTCAAAACATTTGTTTAAACTGA
-CTGAACTTGCTTCCCACTCCTCTCCAGGTCTCTGTGCTTTTATACATTGATTATGCCTTC
-CAATAGTGCTTGCTAGGGGAAATCCTACTCACCCTTCAAGAATCAGCAAACTTTACATCC
-ACTATGAAGCACACTATGAAGCATTCCCATCTTTCTCCAAAACAGGCCAAGTACCTCTTC
-TACAGGGCCAAAGCAACCCCATATACTCTCTGACATTGTCACACTGAATGTGTTTTGTTT
-ACATACACCTCTCTCCTCAGATTATGAATTCAAGTACTTGGACTTTGATTTATTTCTCTT
-GGTGGATGCCCCGTgtttcaccacactgcccaggctggtctcaaactcctgacctcaggt
-gatccaactgtttcagcctcccaaagtgctagggttacaggcatgagccactgtgcccgg
-ccTGTGGTTTTTAAAATGCTCCTCAGTCTTACCTATAAATGTTATTGCATCCATCCTTTT
-TAAACCAGGGGAAAAAGGTTTCCTACTATCACTTACCAAAGAGATGTGAAACTAGTCAGT
-ATGGGTGAATGATGTTTCTTGGAGATTTTATGAGGTTCCACGCTGCATGATTTACCATGT
-GATGAGCACACTGCTTGACAAGCCTTGATAGAGCTACAAAAACAGTTCAGTACTCCGTTA
-CTGAAAGGATCTTGGATTTAAAAGACATCATAAGGTTGCAGAAAGAATAAGTACACTAGA
-ACCACTACAACCTACATCTGATGTTGGATATGTTATTTAACCTACCTGATTAAAGTGAGA
-AAACTGCAGAATATAAGGATTATCACCCTTCCCCCACTCCCTTCTTTACTGCCATGGTGG
-CAGGTTACATAGCAGACAACCATCATCTCCGCAGGTGATCAATAACCAACAGCTAATAAG
-GTAGGTTGTCCTAAAACTGACAAAAATAGAATAGGCTGGAAGTAAGGGCAGTAAAAACTG
-GTTGCCTTTCAATTCTGAAGATATTATGTGAATGCCTATGTCAGTCACTGATTCTTGGGA
-TTTATCAtttttgtgtgtgtaacagggtcttgctctgtcacccagggtgggtgactgcag
-ccttgacctcccaggctcaagcaatcctcctccttcagcttccttagtagctgggaccat
-aggcatacactactgtcccctgctaattaaattttttcttttttttctttctttcttttg
-tttttttttctgagatgtcttttgtttttgttctgaggtcttgttatgttacccaggctg
-gtctggaagtcctaagctcaagcaatcctcctaccttggcctcccaacgtgctgggatta
-taggcatgagccaccatgcccagccAGATTTATCACTGTTAAACCAGCAAGTCCATGACC
-TAAGTAATGTCTTTCTCATTTTACAGAAGGCAAAACTGCATAACCTTCCCAATGTCAGAG
-GTAGTGATTGGAAAACATTCGTCTAGATTCACAGCCTATTCTTCTGTTCTACAGCAAGGG
-ACTGTAAACTGGTGACCACAAACACAGCCAACCCCCATACccatggtttcagttacccgc
-agtcaactgcagtctgaaaatattaaatggaaaattccagaaataaataagtcataagtt
-ttattttccatgtttgtttttagagacgaggattcactcagtcacccaggctggagtgca
-gtggtgcaaccgtagctcactgtagcagcctctacctcccatctcagcctcccttgtagc
-tgggaccacgggcatgcaccaccactcctggctattttttttttttttttgtaaagaagg
-tttctcactatgttgcccgggctagtcttgaactcctgggctcaagcaatcctcccgcct
-taccctcccaaagtgctgggattacaggcatgagccattgcacccagccatgttttaaat
-tgtacatggttctgagtaatgtgatgaaatcttgcaccatctagtaccatccagccctgg
-atgtgaatcatccctttgtccagctgtatatgccacctgctcattagtcacttggtagcc
-ttcttggttacttgaatgttgcagtattgcagtgcttgtcttcaagttacccttatttta
-cttaagaaatgccccaaagtgcaagagtagcgatgctgagaatctggaaatgccaatgtg
-aagctgtaaagtgcttcctttaagtaaaaaggtaaaagttcttgacttaatatggaaaaa
-aaaatcatatgtggaaattgctaagatctatggtaagaacaaatcttctatcagtgataa
-tgtgaagagggaaaaataaattcacatttgttttgctgttgtacctcaaactgcaaaagt
-tatgaccgcagtatgtgataaatgcttagttaaaatggaaaaggcattaaatttgtgggt
-agaagacatcaacagaaaactgtgttccaactgatgataatcaggtttggtattatctgt
-ggtttcaggcatccactggggatcttggaatatatttcccacagatggctgggaacagga
-ctactCTGTGTGTATATCTCCTATTTGGCTCACATATTACTTTTAAAAattgagataaaa
-tccatgtaacataaaactcatcattttagggtacaatcagtaccctaaaatggtgtgttt
-tcgtatattcacaatgctgtggaaccatcaccactatctgattccagaacacttcatcgc
-cccaaaaagaaacccagtacctcagaggattaactcccaatagcctcttcctacaatcct
-ctggcaaccaataatctgctttctgtcttcatgtatttgcctattatggacatttcacat
-aaatggaatcatgcaatatgtggcctcttccacttagcaaaatgtctacaagtttatcca
-cgttgttgcaagtatcagtaattcatttccttttacagctgaattcactgtataaataca
-tcacattctggttgtccattcactgacagatatttggactgtctccactttttggctact
-atgaaataatgtcgctaggtgcatatgtgtacaagtttttCACtttttttcctttttttt
-tttttttttagagtcaggaccttgctctgtcacccaggctggagtgcaatggcatgatca
-tagttcacttcactgcagcctcacactcctgagctcaagtgatcctcctacctcagtctt
-ccaagtagctgggactatgggtgtgcgccaccacgcccagttaattttctgcatttttag
-tagagacagggtttcgccatgttgcccaggctggtctcgaactcctggattcaagcgatc
-atcccatcttagccttccaaagtgttgggactacagtatgagccacagtgcccagccTTC
-ACACTGTTTTTAAAAAGTAAATCAGGggccaggcatagtggctcacacctgtaaccccac
-cagtttgggaggctgaggcaggcggattacctgaggtcaggagttcatgacagccttggc
-caacatgatgaaaccccatttgtactaaaaatacaaaattagccaggtgtggtggtgggc
-acctgtaatctcagctacttgggagcctgagacaggagaatcacttgaacctgggaggca
-gaggttacagtgagctgagatcgcgccattgcactccagcctgggtgaaaagagtgaaat
-tccgtctcaaaaaacaaaagaaaaGGTATTAAGGTGAATTATGTATTAAAATTTTTCACA
-ATTAATATTTTTCAAAGTGACAGTTACCAAAATTAAAAAAAAATTTAACTTTCTATTTCT
-TAAAAGAAATAAAGCAGGAGGGAGGGCAGGTAGGTCTGTCTGTCTGGTAACAATGACTCT
-TCATTCCTGCACTGACAAAAACCTGCTGGATATGCTAAGCTGTGACTGTCCAACAACTGG
-CTCTTTTAACAGACACCCAATGGAGATACCACACGTAAACCTGGACAACTCTTCATTTAC
-CTTATTGACTCGACTCCTGAAGGCATTTGAGCAATCAATCCCTGGTTTATACTAAATATA
-TAAATTTACAAATAATAAGATGGGGGAACTCTTATTTAGACTACACAAATTTTGGAACTG
-AAAATGCAGCTCAACAATGAGATCAGTGGCCATGAACTCTCTGGTAAATGTATATAAAGC
-AGCATGTACATGTACATTTTTTTTTGAAGAAAAAAATTATTACAGGCTCAGGAAATCTGT
-AAACTCCAGCAAAATTAATAATTCCTGAGTTAGACAAACAGAAACTCATCTAAGAAGGCT
-AACTTGGTGATTTACATAAATATTAAAAAATTAAACTGCTCAAACTAAGTATATGCCATT
-CTTTCCTGAAGGAAGACAAGAAGACAATGTATCCTAGGCTTCAGAGTATGAGACCCAAGC
-TTGATGAATGATTAACAAAATGTCAGCCTCAGAAAAGATACAGTAGCATTCAGAGTTAGT
-CAGGTAGAGATAACAGTTTTACAAAAGGGAACTTTACTTCTGCCTCACATTACTGCTTAG
-AAAATAAGAACTTGAATTTCTTCACTACTGTCCAACCTTAAATTGTTCACAGTCTTGTAT
-TTTAAAGCATATCCTTTGAATCATGTGTCCAAAGAGAATTACTTGTGGGTCAGAGAGGTA
-CCTTAAAATGGCTTTAAAAACTTAAAACCAAGATTATTTTCAGATTGTTTACCCCCTTGA
-ATCTTAAAACTGTTCAGATATCCAATTACTGAGCTTTCTAAATTAGTGCTCCCAGTTTTT
-CTAAACTTTTAACtttttttttttttgagatggagtctcgctctgtcgccaggcctggag
-tgcagtggcacgctctcggcttactgcaacctccgcctcctgggttcaagcgattccccc
-gcctcagcctcctgagtatctggactacaggcaagcgccaccatgcccggctaatttttt
-tttttttttttttttgtattttagtagagacagggtttcaccatgttggccaggatggtc
-ttgaactcctgatcttgtgatctgcccgcctcggcctcccaaagtgctgggattacaggt
-gtgagccactgctcccagtcTTTTTTACAGTCAAGACAGAAAATAATATTTGTATGGCAC
-AATGGGGTAAATGATCAAGACTGCTCTGGATCTGAGGTCATTAGTTTGGATGCTGTATCC
-AAACTATATTCTGCATGAATGGCCAGAGGTGTGAGGGGACCAGTATCTCAACACATCTGT
-AACGCACCCTAACACAATACACTGGTTGAGAAATTCTAGTTTAAATAACTTGTGGAGATC
-ACGACCTGAATAGTCAAAATCCATGCAGCAGGTTGAGAAAACTATTTCACAATTCCTCTT
-ATTTCAAGAGATACGCAATCACCTTTTGCAGCTTTCAAGTATAGACCAGATGTACTAACA
-GGCAACCATTTCGTCTGGAAGATCATCTATTTGGAGGTCACTGACACAAAAAAACAAAAA
-CAACAAAGACAAAACAAGCCTCCTTACCCTAGCTCAGAAGGATAAGCCAAAAGAAAACAG
-GTTAACGGTAAAAATGTATGATTAAATGAAGTTATTGTTTTTTTTCCTCCACTTCATATT
-GATTCTCTTTTCCCATGTCAATTTAAGGTGGTAACCATGGCCAACAACATTCTCTCTCAC
-CTATCATACTAATGCCATATAAGTAGTAGTGTTTTTGTTTTTTCAAGTGGGGAAATATAT
-ACAGCTCAAAAAAACAAAAAAATATCTAGCAACTAACTCCTTGGCAGTTCCCTTGACTCT
-CTGACCTTTAAGTCCCAAGGTTCTAAGTATACAATGAATAAGAAAACTACCTGTTCAAAC
-CCAACAGAATATGTTTTTTTCTGGTTTGATTAAGGCTTCGAATTTGGAACATAAATACTC
-TCAGTAATACTTAGTAATTCATGAAGTTACTGCTTGTGTAAACTTGCAGAATATTTAACT
-TTAGGAGATTATAAATCCTAACATGCCCCTAGGGGCCTTCTGCTTTTATTCCTACATACA
-AAACATACAACATGTTTGTTTTTAAAAACAATGCACATAGgccaggtgtggtggcacaca
-cctgtagtcccagctacttgggaggctgaggcagaagcatcacttgaacccaggaggcag
-aggttgcaatgagccgagatcatgtcactgcactccagcctgggtgacagagcgagacgc
-tgtctcaaaataaaTACATACATACATACAAAAAAATTAAACCAATACACGGAAGTATTA
-CTTCCATAAAACAAACCAGGAAGTACAGTAAAACAGAAAACATTAGCATTTGGGCCTTTT
-GTGTGAATTACATTTCTCCACCTTCAACCCAGAAAAGGGATCTGAGTGTCAATGTGACAT
-AAATGACATAGCAACAGTGTGAGGTCTCCCAATGAAGGGAGGTATTAGAAGAAAATCCAA
-GCAGTTTGATTTGGATTAATAGTTCTACCCCAAACACCTAAGAGAAATCGGAATTCCAGT
-ACTGTCTCTTACAATATAGTCATCATCTATACACCTTTTTACCACGCCATATAAGCAAAA
-TAAAGTCACAATGTGAAACTTTACTCCACTGGCTATTACCCTCTGGAACCAAAAGATGGA
-AAACTTCATTTGGGATATACAGTAATCTAAAGAAAAATTCAGCACTTATGAATGTAATAA
-CTACTGTTACCATTTGAATGCCTCTTACAAACCAGGCACAGTATCAGATGCAtattctga
-ttttagaaataaacagattcagaggttaaataatctgccaaaaacaacaggattactaag
-tggtggaagccagatctgtttaggatccaaagcctaaataggttcttttcactAAATTTA
-ATACTATTTCCTTAGTTCTCCAAACTGATTTATTAACAGCCTATCCAAAACACTATAATA
-AAATGAACTGCTTTAAATTTGGAGGCAAGGTAGGGGTGGGATACTGAGTTTCAATAATCA
-GGTTTCTTCATTATTCTTTTACCTGAATGGGCTGGCCACCAGGCCACAATTGTATAAAAA
-TCAGATTTTAAATGATGGAAAAGCTTTTCTGTGTGGCTACTGAAGGGAGAAAGGAAGACA
-ACTGAGACATGCCCCACCTTGCTGGCTGGGGGCTGGTGACATCTGTGGGCCTCAGTGTTG
-GACTCCAGATGCAACAAAGCCTAAAGTTTTGAATATGTATGAAGGTCAATGTGATGTTTT
-CCAAAAACAGTCATAAAAGATGGCTGTGAAAAACCCCCTAGTATAACAACTGTATGTAAC
-AAGAGCATATAGGTAGCTGCAGATGAATGCTCAGGTCCTTAGCTGTGGTGTTTAAAAATT
-CTTCAGACCAggctgggtgcagtggctcacacctgcaatcccagcactttgggaggccga
-gatgggtggattgcctgagctcaggtgttagagaccagcctgggaaacacagtgaaaccc
-catctctactaaaatacaaaaaaaaaaaaaagccaggcgtggcagcgtgcgcctgtagtc
-ccagctacttgggaggctgaggcaggagaattgcttgaacccgggaggtggaggttgcag
-tgagccaaggtcgtgccactgcactccagcctggcaacagagtgagatgctatctcccaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTTTCTTCGGACCAgtgtggtggctcatgag
-tgtaatctcagcactttgggaggctgagttaagaggactgcttgagcccaggagtttgag
-accagcctgggcaacatggtgagaccttgtctctacaaaaaaAATTaacaactacccaca
-aagaaaaccctagctcaagatggcttcactggAAGGAAAAATGAACTGGTCAGGAAGACA
-GACAAATAGAAGCAAATAATGAAAGCATTTTATTTGACATTGATAACCTTCTCACAATAA
-ATTATGTGGCAAAATACATGCTTGAATACTTAATTGCTAGGCAATAGTCTATTTTCATTT
-TTTCACAAAAGGTAGACAACTCCAAAGCAGATGGCCATTTGTAGCCATTCTATATAATCA
-TAAATACACAAAACACTggccgggcgcggtggctcacgcctgtaaccccagcactttggg
-aggctgaggcgggtggatcacctgaggtcaggagtttgaggccagcgtggccaacatggc
-gacaccccgcctctactaaaaatacaaaaattagcccggtggggtggcatgcacctgtaa
-tcccagttacttaggaggctgagagaggagaatcacttgaacccaggaggcagagattgc
-gccactgcactccagcttgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaa
-aaGTTTTAAAGTGCCGATAAATACAAGTTCCTGGTCTGCCTACAGTTTATCACTTAATAA
-TACAAAGCAAACAAGAAAGCAAGTTAGTGGATTACCTGAGAGAGCAAGACATAGAGAAGA
-TGTTAATGCAGGGAGCTGGCCTTCTCCAAACATATCCCTAACACACAATATTCAAGCAAT
-TCCCAAACTGTGATCAGAGAACCACTGGGAGTAAGACCTCTGATCTATATTTACAAGTCT
-ATAGGTGAGCAAAGGTAGACCTTTTCCTGAGTCTGAGATGGGAATATTACCTTCTCTATC
-TAGAAGCAAAAGAATCCTAGACTCACCAGGACTAGGTAATAGACACTGTACACGAGTAAT
-TGAGGTAATCTACACTGGGCGTGACTTACATACTGATCCACCCCTAGGCAGCAATTCATA
-CCTCACCCACCCAACAGGCTACATTAGAAACAAGGAAGTACAGGTCAAAAGTCTCATTAA
-AAAAATAAGAACTCTTGGCAGCAGAAAATGAAAATAAAGAATGAAGAATGACAGCACTGG
-CAATAAACACATTCTTTTCTCCGAAAGGGAAGGGAAAGAACTAATGTTGGGCACCCACAT
-GCCAGACATTTTATCAATTTTCTCCTTTAATCCTCAATAATCCTGAGATAATACTAGCTA
-GTACTCTAGTTAttaatcctcacaaaaatcctgaggtaggtactactaattcccatgtta
-caggtgaagaaaccaaaagttagtaagttgcccaaggtAGttgttatccgaactgtagag
-acaagaactcccagacttgaagaggttaagtaaacttccccaaactcaAAGTGGGAGTTC
-TTTCCCACTAACCTATTGCCTTCCCCTCCCTACCCGCAATCTCAATTAATTCTCTATTCT
-ACCCCCTTCTCATTTCTGCAGCTGTTTCAAAAACTACACCTAAGATACAAAGCAAATAGG
-AGTTATTATAAGAAAACACCTCCAAAATCTACTAAGTTGTGGTATGATATGCCTGTTATC
-AGAAAACGTCACTCAATTTTGAGCTTGGAGGGCAGTGACAGTTTGGAGATCTTtagcaca
-acgcctgccagaaacgtggcaggcgctcaggatctgctgaatgaaCAACATCTTCTGAGT
-GGTTATGAATTCAATAACCCAAAATGACCATCTCGTATTTCTGGATATGACATGATACCA
-TTTTTTGGAAAATAATTTACCCATTCATTTTAAACAGGGTAGCTTTCTTAAAATTTATAG
-AACATTGATGAGATAGCTAAACTGAGAAATGCCCATTAAAGCATTAGTCATAACTTCAGG
-AAAATTTCAAATGTTCACTTTTCCAAGCAAATTAAAATGTTTCAGCTAATAAAAACCTGT
-CAGAAAAACCCACAAGACAAGAAAGTATAAAAAGAAAAGAGCAGCCAATATAAGGGCATT
-TAAGATGTCACACATAAAAAATTATAAAACATTAATCTAACTTGTACCTTGGTATTTAAC
-CCTAAAACTGTCACCTCAGATAACACAATATTTTCTATGCAAGAAAACATTATCACCACG
-AATGTAAAGAAGCTTGCCGACCATAGCAACTGTTGCTACGTAGGGTTTTTTAATGTCTAA
-GACTGAAAGACAGAATTTGTAGAAACCAGTTAAAATGCCACTCTTAGCAGTATCTTGTGA
-TACTGTGAATGCTTTCACCTTAAACTTTTTAAAAGACTCAATCTTTGACTTCTACATGTG
-AAAAAAAAAAAGTACATCTGGGAGCACTCAACGTAAGAAAACTACCAATTGTCTATAACC
-CAATGAAAATACATCCTTTGTTACAATGACAGCAGCTACTTTTCCTTAATAATCCTAGAG
-GAATTTCTTCATTTGAAAAGCTGGCTGGCCTAGATTTCTCTATAAACTAAATGACATGCT
-ACTTTCGAAATTATCCATTTCAGAAGTTCAAAGAAATTCAGGTATAAGAACACATTAATA
-CTCTCATGAAACAAACCTTATCCAGGTTACCCACGAATTGTGACAGATCAAAACCCAGTT
-TCTCATTTCAAATCAAGTATCACATTATTTATTACCTTAAAATACTAAGCCCTTACCTAA
-TTCAATGGCAAATCATATTGGTTTTCAGTTTCTGAACTTGTACAAATCATACTGTAATAT
-TTATGCAAAAGTTGTCATATAGTTGAATATTATAGACAGTTAACATCttttttttttttt
-tttgagacggagtcttgctctgtcccccaggctggagtgcagtggcgtgatcttgactca
-ctgcaaccaacctccgtctcccaggttcaagtgattctcagcctcctgagtagctgggac
-cacaggcacgcacctccacactcagctaattttagtagagatggggttttaccatgttgg
-ccaggctggtcttgtcctgacctcaagtcatctgcccacctcggcctctcaaagaactgg
-gattacaggtgtgagccaccatgcccggccAACAGTAGAAAAGGGTACTCAGGGAACATA
-GTTCAAAAGTCATGATTCTCTATTGGCTGGACCAGGATTCTAGACTAGCTCTAGGGCTGA
-GATATCTTAGTAGACCAGTTAACATTCATGTGGCCCAATTTCCCTTACTCTAAACCCAAA
-GTCAAACATAACCTCTAAAGTCTTTCATACCCTGAAATGCTAATCTTGTAATCATCTTTC
-TATTCAGGTAATAACTCAAAAGAAATGGTCTCACTTCCTTCATCCTCTGACTAAAGTTTA
-GTTAGTCCATATTTTATGAATCCAATTAATAGGATACTTTAAAGAACAAAAAGAAAAGAC
-TTTTCTTAAAAGCTAGAAACTCCATTCTGTAGTGATGATTCCCAGATCTGACTCTTAAAC
-TCAACAACCTCAACAGACAATGACAGGGAGAAAAGATCTTACAAGTTTGAGCTGAGCTGG
-GGTGGGGTGGGAGGTGTGAGAGAACAGAGAGACAGTTACAAATTCACAAAAATGTATCAC
-CCATTTCCATCTCCTCTAAAAAAATATGAAATAAGCCTTAAAAGGCTGTCATAGAAACCC
-ATTATTAAGCCAATAAAAACTAATGAAGAAATTATGTCATTTATCCAAGATATGGAAGAA
-CCACCTATTTACAGAAATCCTACCAATGTCCTAGACCTTCAGAAACTACATCTCACTAAG
-CTGACCATCAAGCCCCTTCAAACTGCATCTAAGGACAATAATAATATTCAAACATCAAGA
-AACAGGCACAGGTTCCACTCAACACCATTATTCCGTGGAGTCTTCCAGGACTAAATTGTT
-TTATAGAATCTTTGCTATCTTTGTTCTCTAGAAAATGATATCCCAAAGACTCTAAAATAA
-AACCAGCAAAACCCCtgtatttgttttccattgtgtcataacaaattatcacaaacaaaa
-caacacaaatggattatcttacagaagtcagtgggcttgactgggtctcacaagggctaa
-atgagggtatccagtgggtgggttccctgctggaaactctggggaaaatttgcttccaca
-ttcattcaagctattggctgaatttagttccttgcagctgtaggactgagttcccacttc
-cttgctggttgtcagctgggactggcctttcctactagaggctgcctgcattccccgtct
-cacactttcaatctggtcccctccagtaacggcaggctgagtccttctcatgcttcaaat
-ttgacttccccttctgcctcatctctgacaccagccagaaaaagttctctgcttttaagt
-gcttatgtgagtagaataaacccacccagaaaatccaagataatctacctaagatcctta
-actttaattaaatctacttaacatattcatgttccagggtttatagtatggaaatcgtag
-gggagccattctgcttaccgcagtctgccttctggtttccaaggattcatctctctctca
-aatgcaaaatacatccatcccatcccaaggtcccaaaggtttcccatctaaagcttatca
-tttcagaagtcccaaatctcattcatctattcaggtgtggatgaggttctggggacaaaa
-cagtaagtccaattcctggggcacaattcctaaagaaacaagttctctactcccaacata
-ccactgtgagacatgtagagaataacagttagacattccagttcaaatgggcaaaatgta
-aaagaaaacagagcctccggtccaaagcagtttcaaaatctagggaatctccattccatt
-tcaaagcctgggaaaaatcctctccagcttttagctccacccctctgggctctcctatct
-ccgtctgagtcaccctgattcttttatgaaaagcaacacattcacatgtgagtagtttta
-tcagcctgcttcctatcagtagaatttggggggtccaacagccctattactttctgtctc
-tttcaatccaaactagaactgtttatgttggcataaaattctcaagaacctaatgggctg
-tggaagtattccacatgggtccactccattaaagttcacattcacaaataaaccaggctg
-cacatttaatactttgcttggaaatctcagctaaatatacaagttcatcacttgcaaatt
-tggctttccatataaccataggatacaattctgctaaacttagttgctactatgtaacaa
-ggatcccctttctgccagtttccaataagaaagacctcacttctgtctgggccctcacta
-gcagagtcattaacatccatattgctactaaaagtatgtccTAGGCCttttcttttttga
-cagggtctcactctgccacccaggctggagtgcagtggtgccattaccgctcactgcagc
-cttgacttcctgggctcaagcgatcctcctgTGTtccaggccttttctatcatgcccctc
-aaaacaattctaacctttatctactgccactttcatttttaggtaatagtaccccactcc
-tggtaccaaaatctatactagtgttctactgctgccataacaaattaccacaaatgtagt
-agctaaaaataacacaaatttgttatctcacagttattgtaggtcagaagttgggtgggc
-ttggctagctaggtcttttgcttagggtctcacgaggccaaaaatcaaggtgtctcaagg
-ttgcattccttggtggaaactgggaaattcacttccaagctcaatcaggttgttgaccaa
-attcaggttccttctggttgcacaactgaggtccccatttctttctggttgtcagccagg
-gactggtctttgccactagaggctgcccacattccttctgataaactttccatgtggtcc
-tctctagcaaaggcaaatggagtccttctcatgcttcaaatctctgatttccttttctgc
-ccatttctctgatcccagttggagaaagttctctgcttttaaggacttaagtgactagat
-tcggcccacccagaaaatccaggataatttttctattttaagattcttaaccttaattac
-acctgccaagttccttttgccatgtaacacaggatagctacagattctggggatcaaggt
-atggcaccttgggaagagggagatgtaattctgcctactacaAATCCAAGTCCTATGGAA
-GGGTTTAAACTCACTTCCTAAAGAAAATCATCCCTTTCTTTAACAGAGTGTGAAGTAAAG
-ATGTATATATTTTACTTATGTGAAGTAAAGTATATATACATACATACATATGTCTTTACT
-TATGTGACACAAAGATGTATGTTCAGAGATAGAGACAATAGTAAAAACAAGGACTCACTC
-TGGATGAGTGAGTAGGAAAAGGACGCGCAGTATGGAAAAGGAGTTGCCACCTGTTTCATC
-CTCAAATTGCAAGGCACTTCACCCATAACTACTTAGAAACTAACCCATGCTCCTCCTTAA
-ATGTGTATTTCTCTTCTCTGTATTCCACAAAGGAGTACATAACTAGGCTTTTTTTTATTT
-TTAAAGAAAAGTCACCTCACGGGGACCTAACTGTATAATCAGTTGATTAATCAATCTAAG
-CAAATTTCCAATCTTGCATTCTTTCTTCAAGTCATACACCCTCCCGCAATAGCAAACCAA
-AGCCAAGTATTTCAAAGTCACAGAAGGACAAAAACATGCCCTGCTAAGACTGCAGGTGAA
-CTTTTGAGAATACCACGGAGGAGAACTAGTATTGGTACTGGACTTTCAGCCCCAGGTCCA
-CCAAGCCAGTAAAGCCAAATGACTTACAACAAAACCCTACAACAACTACAAAGATACTAC
-TCTAAAGCCCTGTCTACAGTCAAATTCTTGACTATAAATTTTACTTAGAACAGAAGAGCC
-CCAAATATACCAGCTAGTCCCTTTACAGTGACAGGTAAAAGCTACTTACTAcacttacta
-cctgccagacactgtagtaagcacttgacacaaattgtcttatttactcttctccgtaaa
-ctcacaagctagaaaataccatcatcccccttttacagacgggaaaactgaggcttagag
-agtttaggtcacacagctaagtagcaatggccctgatatttgagaacctaggcagtctgg
-tttttaaccactgggcctacactgCACTCCTCAGATGGAATGAAGTCTCCAATTCTTGGA
-AAAATCTTCCCTTCTTAGttttcttttttctttttgaggcggagtctcgctctgtcgccc
-aggctggagtgcagtggcggatctcagctcactgccacctccgcctcccaggttcaagcg
-attctcctgccttagcctcccgagtagctgggattacaggcgcgcgccaccaagcccggc
-tgatatttgcatttttagtacagacggggtttcaccgtgttggtcaggctggtctcgaac
-tcctgacctcgtgatccacccgcctcggcctcccagagtgctgggattacaggcgtgagc
-cacacgcccggccTCTCTTCTTAGTTTTCATTTCCTCTCCCCATGTCCCATTCTCGTAGA
-ATTAAACAGCTGAAAAGTAATCAAGTCTTCCCAAATAATTTGCCACCTTCTTTTCAAAAC
-TCTTTCCTCCACACAAAGCAATAGCCAAGATGCAACTTCTCCTGACCCTGACTCTGCTTC
-CCCAAAACAAACTACAGAAGCTCCACCCATCACCTGCTTAATCTAGCAATGTTCCAACAC
-TGCAAAAAACACACAACGAAAAACAAAATTGAAAAGTCCTACTCTTTCAAAAGGTCACCA
-ACATATGTATACCCTTAGCCAAGCTTTCTCTCCATACCTCTTTTTCTATCCAGGCTCCTA
-ACTAGTCCTTAACTCCAACTCCAGACGTTCTGCCCCACGTCTTGGTCCCTTCCCCCTTTC
-GCCCCAGCAACCCCGCCTGGGGTTCTCTCCACCTCGCACCCACTCTGCAGGTGGGAAGCT
-CAGCCCCGCCCAGAGGGACCCTAAGAAGGCCCCTACTCCAGCTGCCCAGTTTCGCGGGAG
-GGTTCACTGCACACTACCCAGCAGGCACCACTCCCTCCGCACCCTCCCCCAGCACCCCCC
-TGCGGCCCCACCCCTCAAGTTCCCTTCCCCCTCTGACGACCCCCTCCTCCAAGTTGTCCC
-CTAGTCCCCACCCAGTTCAGTCCTCTCCTCTGCAATAAGCTGGACTCCGGCAGCCGGTTC
-CCACCCTCACATCGGCCTCTGCCCCCAAACCTCGCCCTCCGCCCTGAGGGGTGGCCCCTG
-GGCCTCCCCGATGGGCTGCAGGGGCCTCGCTTGGTTTATGTGTGAAGGTGGGGGCAGGGG
-AAGGCGACGGGCCGCTCAGGAGTCTGCTGGAAGCGTGAGGGTCGGCCGCGCTCCGCTGCC
-CTATCCTGGGCCCACCCCACCCGCCAACGACCTCGCCTGGCTGCTCCCTAGGTACCTGTG
-GTGGAAGCGGCAGCGGCGGCGGCCGCTCTCCCCTCTGCTCACACAGACAATATGGCGGCG
-ATGGAGGAGGAGACACACGGCTCGGCCGCCAGCCGCAGGGACCAGAGCGAGGCTGCAGCC
-GCTGCTGCCGGAAGCGGAAACCCCCTCCTACCAGGAGGCGGGGCGAGACAGCTTCCGACT
-CCGCCCCCAGAGGAATCTCTCTGAATGCGGCCATGCTGGGATGTCCTATTGTAACCTTAG
-GGATTCAGTTCTGGCCTAGGGTGCAAAATGGAAGGAATCCCCAACGCAAAGCAGAATAAG
-GAGACTTGCAATAGTTAAGCGCATTTTATTTCAATAGTGTTAACAAGTGACAACAGAGAG
-AACACGAACCTCCCATTAGGTGAACAGTTGGTTTGACCCAAGTTAAGATGGCGGTACCCA
-GGTTTCCCACACTTCACCCAGCTGGCCCCCCTTTCTTGAAAAGAACCATGCGCGACCTGC
-AGAGCTGTAGAGCCAAGCATTCTGGGAGCTGAAGTCTCTTTTGCTCTGACCCCTCGTTTT
-AAATTAGGGTTTCAGCAACACTTTCTATTCAAACTTGGAGTTCGGAAGAAGTGAATGAAA
-GTTGGACCCTAGGAAGGGCATGGCGCAGGAGTCTGAGAAGTGAGGATACTAGCTCTCAAG
-AGACCAAGGCCCAATTCCTTCCTCCTACAGGAGTCCTGCCAAGAGCTGTGCGTCCAAAAT
-ACAGTGTTTTTTTTTCCTtctatctgcctcccacccctgctctccttgcccgagctacct
-ccccaaaacagccacaaagcactttctaccatgcagagctcatcatggtctccctatggt
-caaaaatctcccatggacctctttatgcaccaaagatagcccaaactcttcacttgacat
-tcagagtcctccataatttggccaaaccctcctttccagcctcctattctgccactctct
-tctcaaattccggaagattccacccacaagactgcaaacaattcctggaacttagctgtg
-ttgcctccctccctttacactggcagttacttctCTTACTGTCACCTCATGGACTGGATA
-ATTTCTGTATGCCGATTGAACTAAttcagggatcctttcctctaggggtctcctctctgt
-ttaactccctccaacccagacactatcagtcagtaacctgaggacctcagtctgtctcct
-ccatcagactgggagcccccagtggacagggctccatctgATGATCAACCTCTCCTTTGC
-AGGCCCTGATAAAAGCTGAAGCGTCTAAGAGTTGCTGAAAGGAGTTCAAGTATTAGTCTC
-ACCTCTGGTGGGACAGAGGTGTGAGCACTGGAACGAGGGTGAGGAGGCCAGGTTCTTTCA
-GTACCAACCATTATCCCTAACTGTCTCAGAATAGCTGGTTGTCTCAGGAATGGGCCTCTC
-CACCCTCCACAGCCCTGCCTTCACAGTTTGTCAGCTGACTAGCACCTCTGCTCCCAAAGA
-GGCACCTCTTCCCCATGTGGGGTTAGGGCTGGTGGTGGCTGCAGACTTATAGTGATGGCC
-TCAGGGAGGTGGCTGTGGCCTTCTCTGGACCTCATCTGCTAGACAGCTTGTGACATCTGA
-TCCCAATTGCCTGGGAACCCACAACAGTTTTTCTCTCAGTGTCCTGTAActgggcctcaa
-tttccccacttgtggactgaggaggttatacaagataatcccaaagtttctGGGAAGCCA
-TCTTCCAGGAAATGATACCCTTCTACCTACCTCTCGAACGTATCTTTTTGGCTCTTGTGG
-CTTTGTTTTTCCCAACTGTATTCAcatttgtttaactcacaacaattcatcatttgctat
-gagccagacactgtgctaggtactggggatgtgttatgaggaagacatacaccagttgct
-cactggtggagcttaccttctaaagtgagaagcaagtaatgcacaggtaaacaaatgcat
-aaacaaagtaatttcaggtagcaataagtgctacgaaaggaaaagataagtagctgtgaa
-gtatagagctttagcttgagtggttcagaaggtccctttgagaaggaaacagtaagtgca
-aacgtcccaaggcaggaaagagcatcacaagtttgaagaaggaggccatggtggctgaag
-cactgcaaataaagggaagaagaggaagaaatatggtgggagaggtgggcagggcattca
-ggtcatgataaggaagctgggttttcatctgagtgtagtgaggaTATTTCCCATTGCTTA
-GCCTTCATGCCTTTCCAATCTCAGCCTCTCTCACAGCATTAGTTCTTCATTCTTCTTCCT
-AGTTCTGGCCTCTATCCATGACTTCATTCAGAGGGCTCACCTGGGCACACATATACAACC
-CTCATACTCATGCAGGACATAATTGAAACCCAACTCCTGCCGTCTACTACGCCAGCCTCA
-TGTAGGTCTCCGGTCTCAAGAGGCTTCCCATCCCAAGTGTTCACCTAGTTGTAGACTTAA
-CATTTATCCTTAACTCTTACTGTCTCTGATCCCCCACATCACACCTCTCAGGCTAGTCTT
-TCTGCAAACAACAGCAGCAGAAGCAAGAGTTAAGATGTTGAGAGTACTTgcactgtgcca
-cacactgaatgttcatcatctcacttaatcctcatgtcaacctgatgaggtagaaaccaa
-aagtatctcaccgtacagatgaggagactcaggttcacagagatcacaggccatgcccaa
-ggtcacatgccggagatggagcttgcatttcaacctgggccATTAGAGTGActctctctc
-tctctctctcttttgagacaggatcttgctctgttgtccaggctggagtgcagtggcatg
-atcacagctcattataaccttgaactcctgtgcttaagcgatcctcccaccttagcctcc
-tgagtagctaggactacagacatgcaccaccatgcctggctcatttttaatttagtagta
-ttattattactattattattattgtacagatggggtcttgctatgttgccagggctggtc
-ttgaactcctaggctcaagcagttcccctgccttggcctcccaaagtgctagaattacag
-gcAAAAGTTTTAATCATGCACTAAGAACCTAAGtgtatttgctttctattgctgcttaac
-aaaatcaccccacaatatagtggcttaaaacaacaatattttatgtttgtgtggattggc
-agtttggacatgtctcagccaggacagctcttttctgctccaagtggtctttcctggctt
-actcttacgtttgctgtcagtgaacaggccagcaaactggttagaactccatggcctcat
-tcacatgtctggcagttggttggggttgttggcttgagtgccttggttctcctccatgtt
-gcttcttcagtaagctaactcaggcttacttacatgacggcccccagaagaaagaaaaca
-aaagcagcaagatctcttcagatctaggcttagaaatgatatagcatcattttcactgta
-ttatatcgatcaaaggcagtcatatggccagctcagattcaaggagagtagaaatagatt
-ccatctcttcatgagaaaaacatcaaatcatactgcaaggagtcatgtgtataaggaggg
-tggaattgttgtggccacctttgcaaacattatatcacaTAAGTAATCGTAGGCATggaa
-ctggttaaagaaattatggtacagccagacatggggctattcacagcaatgagaactaac
-atttttgagcacttaatatgtgtcagacactgtacaagatgctttacatctattaactca
-tttaatcctcacaacagctctctgtggccagtacatttttaatccccattttagagatta
-agaacaccaagtctcagagaggttaaacaactagtccaatgtcacacagcaagtgacaaa
-gccATTGAAAAGAATGAAGACAGTATTATGTCCTGACATAGAAATCTGGCCCTGACATTC
-TGTTATACGATACAAAGCAAGAGACAAACAGTAGTTTGATCAGAAAACATTTAAAAAGCA
-CATTTAAATAATTAGGAGATGTGTGTCttttttttttctgagatggagtttcactcttgt
-tgcccagggtggagtccaatgatgccatcttggctcactgcaacctccgccttctgggtt
-caagcgattctcctgcctcaacctcccgagtagctgggattacaggtgcccaccatgccc
-agctaatttttgtatttttagtagagatgggatttcaccatgttggccaggctggtcttg
-aactcctgacctcaggtgattgcctgtcttggcctcccaaagtcctgggattacaggcat
-gagccactgcgttcagctGGAGATGTATGTCTTATAAAAATTAGTAGAATAAAAATTTTT
-ATGTCTTATAAAAATTAGTAggccgggcgcggtggctgatgcctgtaatcccagcacttt
-gggaggccaaggcgggtggatcacaaggtcaggagatcgagaccaccctggctaacacgg
-tgaaaacttgtctctactaaaaatacaaaaattagccgggcatggtggtgggtgcctgta
-gtcccagctactcaggaggctgaggcaggagaatggcgtgaacccgggaggcagagcttg
-cagtgagctgagattgcaccactgcactccagcctgggcaacagagcgcgactctgtctc
-aaaaaaaataaataaatacaataaaTTAGTAGATCTATATGTCTTATAGTTTTAGATAAA
-TTCAGGAAGAATTTACTACAAACTATTAATGGAGCTTATCTTTGAAGAGGAGAAAAGGAG
-AAAACTTTTATTTAAACACCTCTGTTTGTGTTGCTTGAATAttttttttttttttttttt
-ttttttgagacagattcttgctctgttgcccaggctgaagtgcagtggcaatggtcacag
-cttgctgcagcctcaacctccagggctcaagtagtccttgcacctcagtctcccaagtag
-ttgagaccacaagtgtgtgccatcatgcctggctaatttatttttatgttttgtagagat
-agggtctccccatgctggccatgctggtcacaaactcctgggttcaagtgatcctcccgc
-cttggcctcgcaaagtgctggaattacaggcACAAAGCCTGGCCTTCTTTGAATTTTTTT
-ATAGCAATCATAAATTTTTATTTCAATACCTTATAAAGAAGAAAATGCTTTTAAAATGTC
-CTTCAACTTGGCTCCCACCTATGTCtttttctatttggttttatttttattgttttttgt
-tttcttttttgATACCACCCCAGCCCAACCCCTTATCAATTCTGACCCGAAGTTTTGTGG
-CTACCTTGAGGGCCCCTCCTCTCTCCCTCTGTAGTTCATCCTGCCTGCTGCTGGGGGAAA
-GCTCATTAACCATCATGTTCCATTTTTGTCTAAGAGTTTTCAATGGTATTGCATTGTCTA
-CACAGAAAGTCCAAACCCTTTGGCCTTGTACATTGGGTGTTTGTAAGTTTGACTCCAact
-tggttggattccagctctgtcacttactagcagcatatagttggataagttattagatct
-ctctgagcctcaatttccacatctttttttaaaaaaatgaaagAAAAgaccaggtgtggt
-ggctcatgcctgtaattccagcactttgggaggctgaggtgggtggatcacctgaggtca
-ggagtttgagaccagcctggccaacacagagaaaccctgtctctagtaaaaatacaaaaa
-ttagccgggcatggtggcacatggctgtaatcccagctactcgggaggctgaggcaggga
-gaattgcttgaacctggaaagtggaggttgcagtgagccgagattgtgccactgcactcc
-agctgagtgacagagcaaaactctgtctcaaaggaaagaaagaaagaaataaagaaagaa
-agaaagaaagaaagaaagaaaaaggaagagagagagagaaagaaaaagagaaaagaaaga
-aaAGGATATAGCATTACATATTTTGTGGCAAATTAGATTACTGTTCAGTGACTGTTCACT
-TTCTCACCCAGCCAGGGGCAATTAAtattttcctgccccattaatattaggcttggccat
-atggtttgctttggctagtggaatatacatatcagttacaatgtgcaaattccagcctag
-gccttaagaggtctCTCTTGTTTTCAATTGGCTGTCTTAGAATTTTCACCTCTTCCTTGA
-AGGGCGAGCTGTCATTGGTGCCTTACATCTTTTGAAACAGACTTCCAATCAAGGCTGTAG
-TAGGCAAGTCTGAGATAAGAATAGTTCTTTACTCTTTAGTTTTAGTTTGCattaattaaa
-ttataatttataGTTTTTCGTGAACTCCATATTTTTGAATGAGCGGAAGCTAAAGAGGTG
-GGAAGAGAATGCTCTGTCTCAATTTGGGAAAGCAGTAGCTTCTGTCCAATCCTCCAGCAT
-CAAACAGGCTAGTCCTAGAAGAATAAAGGACACACATAGTAGATCTGAAATTGAGTCAAC
-CCCAGCAGAACCCAGCCAAGATCAGCCAAACCCAAATGACTACATATGAGAGAGGGAGAA
-ATCAATGTTTGCTTCTGTCAGCACAGAGTCTTGGGGCAGTTTGATATGCAACATTATTat
-aggaatagccaactaacagattcacatcatagggcttttttcagggttaaataaatgaat
-acaggaaacgccttaaaaatacactggcatatagcaagggtgtaatgcatgagaactact
-attATtgggggtgcaactgtgaacaaaacaagcccctgttctcaaggatcttatgttctg
-cggagagatgtatggaatggcagctggtgatgagtgttatggaagaaaataaagcaggga
-aggagagggagtgctgaggtaaaatttcaaatgtgatcatcaacaaaacttcaacggaag
-gtgaaacttgaccaaatccaagaggaagtgaggcggggagccagaaagtatgtgggagaa
-gattgtcccaagcagagagaattcggatgggcaaagaccgtgaagtaggctcatgcctgg
-tgaatttcaggaatggtcagtagatagggcagctgagccgagggagtgGCTGATCTCGTC
-TCGGCTCTGCTGGGGTTGACTCAAATTCAGGTCTACTGCATGTGTCTTTTGTTCTTCTGG
-GACCAGCCTGTTTGATGCAGGAGGTTTGGACAGAAGggggacaatgtctcagaggttcac
-aaggtactggattgtgcacagccatgtagggctatcgtgaggacttgcttctgctctgaa
-tgaggtggggagctatgggagggttttgaccaggtggagagcaggctctgctatgcattt
-ttataggatttgtccagctgctaagtgtggactagatggaccgggaatgagggctgaagc
-agggagaaaagataagaagctactaccacaagccagacaagagatggtgttgctttgaac
-caaagttggactccgaggttcttttcaaagtaaaatcaaaagaatttactgataggtgtg
-gtatggggtgtttgaggaaaaaaagaattgaggatgactccaaggcttctggcctgagga
-actgaaagaaggaatttgccagtaactgagatgaagaaggctatagaagagaacttcttg
-gggcagggggagaaagagaggaggaattagcagttccatttgcgacttgttaaatttaag
-tgagctatgagacttccaagtgcagatgactaatcagaagttagatgtatgaatctgagc
-ccaggagagaggtccaagctggagacgtaatttttgggagttactatgtactaaattttg
-tcctccccaaatttatatattgaaaccctaacacccaatgtgacactatttggagacagg
-gtctttaaaggaggttaaaagagatcatagagtgggccctaattcaacaggactattgtc
-cttacaggaagatgagatatcagagctcattctctccccatgcaggtgctcagaggaaat
-gctgtgtgaggacacagcaagaaggcagccatttacaagccaggcagagagccttcacca
-gaaaccctccctgacagcaccttgatctcagatttccagcctctcagtgagaggctgaac
-tgtgagaaaataaatttctgttgtttaatcctctcagtctgtggcattttgttatggtag
-tttgagcagactactactgagtcatcaacagagaaatggtttttaaagccatgaggggcc
-aggcatggtggctcacacctgtaatcccagcactttgggaggctgaggtaggcagatcac
-ttgaagtcaggagtctgagaccagcctggccaacatggtaaaaccccgtctctattaaaa
-atacaaaaattagctgggtgtggcggtgtgtgcctgtaatcccagctacccaggaggctg
-aggcaggagaattgcttgaacccgggaggcggaggttgcagtgagctgagatcgagccac
-tgcactccagcctgggcgacaaggaagaaactgtctcaaaaataaataaataagtaaata
-gccataaggctgggtgaaattgcccagggaatgagtgtagacagagaaggaggaccaagg
-actgcgccctggggcatccaacagtaagagacaagcaaccagcaaaggagcctgagaagg
-agcagccagtggggtaagtgtcctggggaccaagtgaaaaacgtgtttcatggaaggagt
-gttgatcccctgatcccctgtgtcagatgctgctgaggggtcagaaaagaaaagaacaaa
-gagctgatttacaaagtggaggacattgttttgacaggagagagtgtaggtaggttggtg
-ggaacaaaagtctgattggagtgggattaagagagaataggagaaaatataaatatagac
-aTagaaaggaaggaaaaaaggaaggaaggaaggaaggagggCTCtttttttttttttctt
-tttgagatgggttctcactctgtcgcccaggttggagtgcagtggtgtgatctcagctca
-ctgcaacctccgcctcccaggttcaagcgattctcctgcctcagcctcccgagtagctgg
-gattacaggtgcgtgccaccacgtctggctaatttttgtatttttagtagagatggggtt
-ttgccatgttggccaggctagtctcaaactcctgacatcaggtgatctgcctgcctcagc
-ctcccaaagtgctgggattagaggtgtgagccaccacacctggccTggagagctcttttt
-aagagtagaaagctgggccaggcgcagtggctcatgcctgtaatcccagcactttgggag
-gccgaggcaggcggatcacctgagatcaggagtttgagaccagccgggccaacatggtga
-aacccagtctctactaaaaatacaaaaagttagccaggtgtggtggtgcatgcctgtaat
-cccagctcctcaggagactgagctaggacaattgcttgaacctgggaggtggaggttgca
-gtgagctgagatagtgccattgcactccagcccgggcaatgagagtgaaactctgtctca
-aaaaaaaaaaaaaaaaaaagtaggaagcaaatgactaaatgtagaagaataggagttggc
-aaccaccataggagacaatcattaatggacactgcagtagtggattaaagtttgatgaga
-aatagggcatttgcacagtctgagaatatctccccccaagatacttattaattacaaagg
-gtaaaatagtaactttacatggagaaacacagccaacaccacttgaccaagtgataaagt
-gaacatcaccagtagcagggcaaattgacatcatgtggcttccgggatgatgcactgagt
-gggacgtcgcgtcacgtcagtgatatttctgccaaagaggcataattgactcatgaggaa
-gcattagaaaagcccaaagtggccaggcacagtgactcacacctgtaatcccagcacttt
-gggaggctgaggtgggcagatcacgaggtcaggagttcgagacaagcctgaccaacatgg
-tgaaaccctgtttctactaaaaatacaaaaattagctgggcatggtggcgtgcgcctgta
-gtcccaactactcaggaggctgaggcaagaaaatcgcttgaacccaggaggcagaggttg
-cagtgagccgagattgcaccactgcactctagcctgggcaacagagcaagactccgtcta
-aaaaaaaaaaaatgtccaaagtgaggatatctttgcaagagaaccttactctttaaaaat
-gttgaagtggtaaaagacaaaggaagactgaggaatagttttagatgaaggagaataaag
-taattacaactactgaatgcaatgtgagatcctagattaagaaaaaatcattttcactta
-ctacaaaatatattaactagatgagtggtgaaatttgaataagatctgtagattagataa
-tggttttgcatcagtgtaaaacgtcccgattttggttattataagagaatgtccttcctt
-ttaggaaatgtgtactggtttttaggcctgtaacttaccataaaagagttcagggttgga
-ggaaagaaaaataaatgataaagcaaagatggtaaaatctgggtaatgggtatttggcta
-ttctgtttttgtttttgagacagggtctcactctgttacccaggctggagtgcagtggtg
-tgatcatagctcactgcagcctcaacctcccaggctcaagcaatgctcccacctcaacct
-cctgagtagctgggaccacagttgcgcaccaccacacctgactcatttttaaatattttt
-tagagatggggtctccctgtgttgcccaggctggtctcaaattctaggctcaagcaatcc
-tcccatctcagccttccaaaatgctgagattttaggtgttagccattgtggctggtgaga
-tttgagtgttctttgtactactttgtaacttttctgtaagtgacattatgtcaaaataaa
-TTCTAACaagagagaatagaaggaaaggaagtagagacatggaggcagtgagtccaggta
-actttttgaggagttttgctatagaactgaggacaggtggcaggtggagagcaaaatggg
-gtcaagataagttgttcaaaggcagaaattgtagcatgtttttatgctgatgagagagat
-tcagtagattggaaaaaaaagtaataatgcagacagagagagagaagagagtggctagaa
-tggtgtctctggagagaaggatgggatctagtatacaaatgggggctttgaccttggagc
-acagatggctcatccatggtcacagaagggagggcagagtatttgggtaccagattggta
-ggtaggtagctgtgcagtggaaatgtgtggaaatgctttctgattgctaccattttccct
-gtgaaataggaagcaaggtccttggctaagagtgagaatgggggagaaggtgatggaggt
-ttgaaaagataggaaggaagtgtgtagggaaaatgaatggatctactgtgattgtcaggc
-agaacaaaagacaccactgaagctatcatcattcaagtaaagtgaggccagtctacatgg
-tggtgtgtttttctccagccacattccactgcagggggacaaacacagagggatgtggag
-ttggcaccaactaacaggtgtttagtcagagagggtcagggggatcttgggagtatgcag
-cacagtggggataaagttatatcatggctgtaatccacaaagaaggaagtgaggacaagg
-aaacaccaaggttcagagaggtttagtgacttacccaagcttgcacagctagtgaataat
-gagttggtctctgcatccaggcagtgtggctcaaagcttattctctcaccaacccagtat
-acacaggctgtccccagggtgtagcatagcatttggcacatgtagCCTCTGCTAACAAGT
-GAATTAAATTGTACCTGGGGTTCTCTCTGCCTTTCATTCTATGCCTCCGAAGAATACTaa
-ataaaataaaataaaacaacaacaacataaaaACCTAGCTTCTTCCTTGCCTTCAAGCTG
-TCTTTGATGTCTTAGTGTGCACGATGAAGGAGATGTACCATCAGTCTCCTTTGGGTGGCC
-ATTGGTTCATGCCTGCAGTCTGGCTttcagcaggtcattctcagcacatactctggggca
-gacactttctcaggttctcagtacacagcgggaaacaagtcagtattcctggcctggtgg
-agctcagtcaagtggggagaagataagcagacaaatctagcattgcaaactgggattatc
-gccaggagagacaagtgggcggggtatgagagtgcatgagagtaaagccgacctagtgga
-gggcgggaagaagagtttacccaaggaaggtcaggaggggtggcccatggggctgactga
-agaggagaaacagcatgggcaaaggtcctaagataggaacatgcctgttaatggcatatc
-aaggaggccaatgtggtccagacgtatatggagagggtggagggtgggagggaacatagt
-gggaaatgagatgggagaggttggcaggatccactacaccctgtagaggaatctgattta
-agaacaatagggtttaagcaggggaatgatttcgtaaggttttacatttatcagccaggt
-gcggtggctcacgcctgtagtcccagcactttggaaggctgagatgggcggattgcttga
-gctcaggagttcaacatggggaaaccccatctgtaaaaaaatatacaaaaattaggctgg
-gcgtggtggctcatgcctgtaatcccagcactttgggaggctgaggagggcagattatga
-ggtcaggagatggagaccatcctggctagtagtgaaacccctggctagatggtgaaaccc
-catctctactaaaaatacagaaaaattagccgggcgtggtggcaggcgcctgtagtccca
-gctactcgggaggctgaggcaggagaatggtgtgaactgggagatggaacttgaagtgag
-ctgagatcatgccactgcactccagcctgggtgacagagcgagactccgtctcaaaaaaa
-aaaaaatatatatatatatatataaaatacaaaaattagcagggcgtggcatcatgcacc
-tgtattcccagctacttgggggctgaggcaggaggattgcatgaacccaaggagttgagg
-ctgcagtgagccgagatcaccccactgtgctctagcctcaatgacaaagtgagatcctgt
-ctcaacaacaacaaaaaaaattttttttatttataaaagacctctttggctgctgggcca
-ggagcagggaggacaggaggcaggggtaggagtggaggtgtgggaggagaggaagcagga
-gaggagtggaggtgtgggggcaggggaggcagtgggtgggccaggagagaggtgatgtgg
-catgggctaagatggaagcagtgcagataaagagaggtggattgacttgggacatatttt
-ggagctggagttcacCACAGGGAAACTGAGGCCCAGTGCTTCCAAGGATAGCGCTCCAGC
-TCTCCCAGCCCAATGGAAGCTTTTAGATACTTCTGCACTGTGGGGGTCACTTGTGGGTGG
-TTGCATTGGGGGACGAGTGGCCAGGACAGGTGACCTCTGACTTTTGTCTGGTGATGCGTG
-AGTCTCAGATTGGGCTTTGAAGGAGCCATGGGTACCTTGCTGGGCAGGTGGAGCATGTCC
-TTAGAGGATCATCCCACCATCCTCACgtaaccctgcaggtctcttctctctgagtcatag
-ttctcacacttgtaacatgaagagggacagtacccacttAGGCGACATCACCCCCTTCTT
-ACAGATGAGACAACTAggccaggtacagtagctcatgcctgtaatcccagcactgtggga
-ggctgaggcaggcagatcgcttgagcccacacatttgagaccagcctgggcaacatggca
-aaactctgaatctacagaaaatacaaagattagctgtgtgtggtggcatgcgcctgtagt
-cccagctacttgggagactgaggtaggaggatcacttgagcccaggaggtggaggttaca
-gtgagctgagatccaccactatactccagcctgggagacagattgagactttgtctcaaa
-aaacaaaaacaaaaacaaaaCCACCACCACCACCACAACAAAAAAACCCAAAAGAAAaca
-gatgagacaactgagcctcagtgaagggaagtggctctttagggtcatacaggagtaaag
-acacagccaagactagcacccaggctagagcctgggctgttgacctttctgcttcatcat
-ttgccTCCCATACCTTTCCTGGGCTCGTCAGTCCTGGGGATGCTCAACTCACCCAACACT
-GTGTTTCAAGCCCAGGGAATCCAGGATCGGTtagttcagtggttaggggtatgggctgct
-tggattctatttccagcgccaccaaggggccttattctgtctgaaccttggttttctcct
-ctgcaaaatggggctaacagtgcatacccttgtagcactgttacaaggtaggggaactgt
-acagatgtaaTGATTTGTGTATGTGAGTCATTTACAAGCCTTTGGAGTGGCTGGCACCCA
-TCATTGTTTGCTGTTGCTGTGATTATCATGCCATTGGACTgtggcttgaaaccctacagg
-cccaaggctccctttaatagtagttataatgcttcttttctaaaataaaatacatgaata
-acataacctgctgacgcacataattttttttttttgagaccgagtctcactctgtcatcc
-aggctggagtgcagcggcacaatctcggctcactgcaacctccgcctcctgggttcaagt
-gattatcctgcctcagcctcccgaataggtaagattacaggcgcatgccaccatgcccag
-ctaatttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcgat
-ctcttgacctcgtgatccttccgccttggcctcccaaagtgctgggattacaggagtgag
-ccaccgcgcccggccatgcatagttttaaacataaataatgtcctagttgtaatttaaaa
-gaaaataaagtgaaaataatttagaataaattaatatgtaaatgttccaggacaatgtgt
-agaaaccatcacaaagtagttgggtgggctctgctctgggtggaatcattgagaatctgc
-aggctgaattggtaacgccgcactggcggcacatgcactgtgactgcatggctgtgatag
-tctgaaatgtgagcagtctaggtaaagttctgaaccaaacacaatccattctgttcccaa
-tcgctacagactaaatgtttgtctcccccaaaatcttacgtcaaagcctaatccccagcg
-tgatggtattaggagatggggccttttggaggtgattaggttatgagtgcagagccctca
-tgagtgggattagtgcccttataaaagaggccccagagagctctgctgccccttctacca
-tgtgaggacacggtgagaagccatctatgaaccaggaagcggtcttcaccagacatggaa
-tctgccagctcctggatgttggacttgccaggcttcggatctgtaagaaataaatttctg
-ttgcttataagccaccagtctgtgtaatttgttacagtggcctgaactgactaagacacc
-aatttatgtgaaggttgctttcctggcagagtcgctgttattaaaaccaagcaaaCACac
-attgtactggaaaaggcaaaactatagagacaatgaaaagatcagtggttgccagggctc
-aggggaggggagagagggatgcacaggtggagcacagggcatttttagggcaggggacct
-cttctgtatgatgctgtaatggtagataaaggatgtatgtacttgtcaaaacccagcatg
-ggccgggcgcggtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcgga
-ttgcctgagctcaggagtttgcaaccagcctggcgctacagaaatcctgcttcaaatcca
-gaaaccccgtctctactaaaaaacacagaaaattagctgcgcgtggcggcatgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaatttcttgaacccgggaggtggagggt
-gcagtgagccgagatcgtgccactgcactccagcctgggtgacagagcgagactctgtct
-caaaaacaaaaaacaagcaaacaaaaaaacaaaaaaaaacaaaaaatccccagcatggta
-gaactgtgcaacacaaagagtgaactgtaaggtaactgtggatttcagttaataattgtg
-tgtcaaaattggtttatcaattgtaacagatgcaccatgcatttgcactaatgcaaaatg
-ttaataacaggagaaactgcatgtttggagaaggagtacaagggaactgtctatgatttc
-tgtgtcatttttctttttcttttctgagagagggtcttgctctgtcccccaggctaaagt
-acagtggcacgattagagtccactgcagcctcaaactcctaggttcaagcaatcctttag
-cctcagcctcccaagtagctaggaccacacacatgtgccaccatgctagggaaattaaaa
-aaaaaaattgtggagacaggttcttgctatcttgctcaggctggtctcaaactcttggcc
-tcaagcaatctccccatctcggcctcccaaagcactgggattacaggcgtgagccagtgt
-gcccagtctctgcacagttttgctctaagtctaaaacttctctaaaaaagtagtctatta
-aACATAAAAAACAAAATGAAAACCCCCacacattgtgtttatatgtaaaatagaattcgg
-tccttggctcagataattaaaaacaaggtttttacctacactaattaccaaagggagatt
-tgaaaatcatgACTTGAGATGCACTGCAGGATGTCTGCACCCTTGCTCCCCTCCTGCATG
-GCCGGGGCACCCCCTGGTCACTGGGAACTCTCCAACACTCTTGGTGACATTGCCCCCTTG
-AGGATCTCTGCACTGGATCTTTGCTCCCTCTCCTGCAGAACCCACAACTGCTGACTTACT
-GATCTTGGGTGATGTCTGATTAAAAAGTCTCCCCAGGCTTAGGAAACTCAAGGTGCCACT
-GTGGACACAGCTCCCACATTTCAGCTTccagaaatcctgcttcaaatccagatcccagca
-ctccctcattatgtggacttgaatgagtcacatcaatttattgagcttcagtttccccat
-tgatgggaaaaagggtgattgataatacctgccatactttatattcataatgaatataat
-gagtatattcattaactcagtaaatatatattgaacacctactgtctgtgctgagaattc
-aacagcgagcagaacaaacatctctgccttattggagcttatggtctcgtgatggggaca
-gacaaaaatcaaacaaatatatgagataatgtcagtgataaataaaaataaggcagagtc
-acagatggaaagagggtagggcaagggatccttggtaagtgtcgtcctggatggcttccc
-agaggagatggcatttgaacagggctgggaatgaagtgaaggaacgtgccacgaaagtct
-cagggcgaagaggcaacagcaaacaccaaaaccctgaggtgggaatgtgcttggtgaatt
-cgagaaacagcaaggaggccagtgaggccggtggggagtaagagggaagagaaagtgagg
-acagagagatctggagaagccagactctgtaAGGAATTGGGGGTTTATCCCAAGTGCAGC
-AGGGAGAAAACTTGAAGAGTTATTTACTGGGGAAGGCTTCCTGTGTTGTGTGCCCTTGCA
-GGTGAGAAAAGGTGATGAGCCCACTCTAAAGCCAACTCTATGGCCCATGACCGTGGTCTG
-GGACACTTTGAGCAGAAAGCGTCCTGTTCTCCTTGGAGTCAAAGGATTGGTGACAGTGTC
-TGCCATGCTGTAGTTTCCACAAAATACCACCAGGTGACGACTCTGGGTCACGCTTCTAAC
-TTGTGGGTTCTTGATTcctggagggcttttgctaaaacacagactgctcctggccccagc
-cttccaaagcgctggattacaggtgtgagccaccacacctggccTGACAGCCATGTTTTT
-AGCTTTTAAAAGCAAAACTTTGGCATTAGCACTATctctgtgagaggggccgatcattcc
-tgttttccagatgggtctatgaggctcagagaggagaaatcattgtctccatgagcaaaa
-gtgataaaactggcactcggcccccatgtctgcctgacttcaaggcccccaatccttcAG
-GGATGCCACACccatgtgcccagtgaggctctgggaattttaaaaactcatccaatttaa
-tccttacaactgaacaaatcccatgcaacgttaatgtctccattttagagatgagaaaac
-tgaggactagaactgagaaataagtcacctgatgtcgctgagctGTTCTAAGGCTGACAT
-catgcattttggagtcagagagacctgaatctcaactctagctcacactctccctagcta
-tgttcacctgatttctctgagccacagtttaagatgggaataagagcccctcctgcttgg
-tagctgtTGGTAATATTTATGAACAAATCTAGGCCTGGGGCCTCTTAGGCTTACAGTGGC
-ACCAGCCTCTTCTGTTCTGGAATCAGGAGGGAAAGTGATTGACCCGGCATTGGCCATCCC
-TGGCCTGGCTGGGATCAGAAGGGTCCTGGAAGGATAGGCAGTACCCGGCAAAGACTGGGG
-AGGGAGCTTGCTTAGCAGAGGTGTGAGGGACCTCACAGGAGTCCCCACAGGGTGTCCAGG
-TAGGCATAGGTATGGACGGCTGGACAGGGACTCCAGTTGGCCAACCAAGAACAGGGATAG
-AGCTTGGGCTTTGGGGTCAGGCAGCTTGAAGctctgggttccagctcccagatctgtaaa
-gtggaacagtaatgactcttccctgttttggattattgagaggaCCCCGGGGAACAGTGG
-GCTCAGCTGGAGGGATGACATTCTAAAGTGTTCTCTGGGACCTTAACCCCAGTCTCACAG
-GAGATGGGCCTTTGACTGTGGCCTTTCTGAAACCTGAGAATGTTAATGGTCACATAACGT
-TAGTAACAGTGATGGCAGATAACATCTGTCATGGATTAGAGGCCACTGGGAGGTTCTCCC
-TCACAGTTCTGGGTTCTTTGGATCAGAAACATGGCACAAACACACAGCCAAGGGTGGTTT
-AGGGCCTTGCAACTTACAAAGTCCTTCCATAGCATTGCACTGCACCCTGTGTTAAGATAA
-ATTCTCCAAGCTTTaagcactctgctaagtgcttgacaggccttattttattcttccaaa
-acactttgaagtgggtgttgccttgacccccattcttcagctgaggaaatgggaggcata
-gtgaggtcaagtgacttgcctaaggctactcagctggaacgtagagcgcctcatcccatg
-cttgactctgaGTAGAGCAAGGGTTGCACAGCAAGTCAGAGGCTGAGAGGGCCTTGGAAG
-GACCCGAGGCTCCCCTAGCCACTCCTGCCTGGCACCGATTCCTCCAATCCCACCTGGAAG
-TGGCTGGAAGTGAGAGGGAGAGGCGGTAGGGGTGCTGAGCCTGAAGGGAGGTTTCAGGAC
-TCAGGCTAGGAAGGCAGAGAAGGAGAGGAGGGACGGAAGTGCCCCTTCCCCCTAGAGCCA
-CTGAGGGGAGAGATAAAGGCATGAGGAGATGTAGCTGGGGCCAAGACAAGGAGGAAGAGA
-AGAGCTCAGGAGCTAGAAGGAACAACTATCTGGGGAGGAAGCCCCGTTCCAAGAGAGAAG
-GCCAGGGATGGGAAGGGGTGGGCCAGGCCCTTGGGCTGGGGTCCTGGGTCCCAGTTTTAG
-CAGGTAGCAAGACCCCGAACTGGATAGAGGGTTGCCTTCAGTAGATACCCTATCATTCCT
-GTGTTATGAGAGGTTGGGGCCACTTGAGGTGAGCCCAGGATTCAGCCTTCGAGGCTCAAC
-ACACTTGAGTCCAGCTGAATGACAGAATGAGCCATAGGACACTGTCCCAGGCCTGACttc
-cttccttcaacaaatatctatggaggattcaccaagggccaggctgggctcccagcagga
-aacaaagtccctctgaagagagactaacaccttcgttaaggagcccccaatctcatagga
-gagatggacaaaaagcagaaaatgaattggtatccagtatcacttttggctgtaaaggtg
-atcaggggaaaatgaatggattggagtctacctattttgtgatggcggtcagggagggcc
-cctctgagaaggtgtcatctgcacagaggcctgaaggagatgaggcagtagctatgaatc
-tgggggaagagcatttcaggcaagcgcaaaggccagggcaaaggccttgaggcaagaaga
-tgctgctgtggaggaaggagggcaccaagcaaggaggccagtgtggctgctggtgagaga
-taagagagtgaaggaagatgagggtagagtccggggggcagatcacatagggcctcaaag
-gccactctatggattttagctgcatctcatgtgacatggacattgaaggaTTTTTATGTG
-TGTGTGTTTGTTTGTTTGTTTGTTTttgagagggattctcgctctgtcacccaggctgga
-gtgcagtggcacatctcggctcactgcaacctccacctcccacattcaagcgattctctt
-gcctcagcctcccaagtagctgggattacaggtgtgtaccaccacgcttggctaattttt
-gtatttttagtagagacagggtttcaccatgttggccaagctggtcttgaactcctgacc
-tcaactgatccacctgcctcggcctcccaaagtgctgggactacaggtgtaggccactgt
-ggcctgtgacattggaaggttttgagcagaggtatgtgttgtgacctgactcaggtttta
-ccagaatccccctgagagatgttctggccaccactgaagaagactggagggtagagcagg
-caagggctgatgcagggagcccagtgaggaggctGGTCAATGAGCACAGCAGTTTGGCCA
-ACGATCTGGGGTGCTAAATATCAACAGAAACAAAaatatttattgcatgctttctgtggg
-tcacaaactattctaagtggttgcttgacatggaatgcttttaatcttcagtacagattt
-taggtagatcatatttttgtACATTTATGTCTATTTGTCTCTGGACTGATTtttttttaa
-ttgagatgaaattcacataatataaatcaaccatttgaaagtatacatctcagcggcatt
-tagtatattcacgacattgtacagccacacttctgtctagttccaaaatattttcaacac
-cccccccaaagaaactttgtacccatcaaagatagatgatatttttatcctaattttaca
-gatgaacaagcagaggcgtggacaagcagagtcacgtgccccaggtcacacagccaggaa
-atggaacaagctggCCACAGGTGTTGGGAGGAACATGTTGACAAGCTGCCCAGGATGGCC
-TGGAGGCCCCTTCGGGGTCCCCCAGGTAATAGCACCAAACTGCCttttatttttatttat
-ttattttgagacagaattttgttcttgtcacccaggttggagtgcaatagtgcaatcttg
-gctcactgcaacctccgcctcccgggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgtgccaccatgcctggctaattttttgtatttagtaaagacag
-ggtttcatcacgttggtcaggctggtctcgaactcctgacctcaggtaatccaccgcctc
-tgcctgccaaagtgctgggattacaggcgtgaaccatcatgtccagccCAAATTGCCTTT
-TAAGAAGGGCATGTCagccgggcgcggtggcttacacctgtaatcccagcattttgggag
-gctgaggcgggcggatcacctgacgtggtgagtttgagaccagcctgaacaacatggaga
-aacccgtctctactgaaaatacaagattagccgggcatggtggtttatgcctgtaatccc
-agctacttgggaggctgaggcaagagaatcacttgaacctgggaggtggaggaggttgcg
-gtgagccgagatcacgccattgcactccagtctgggcaacaagagtgaaacaatgtctca
-aaaaaaataaaaataaaaataaaaataaaaataaaaaAAAGAAGGACATGTCCTCACTTC
-TGGGCTTTTGTTTTGTGGAAGGGGTGGGATACATTTGAGGCCAGAAAACAGAAAGCACTG
-GGAAGGCTGAACAGTGGCCCCTGCACCCTCTCTcaggatggtgcacagaggagaatgggg
-actctggagccaggctgttgagttcaattcccttctcccacctttcttccatgttgtgaa
-gttgggataataagagcaccaatctcatcagtgttgggggaaagtgaatttcccatcagt
-agagctcagcactgcccgtagtatttgctcaatcaaCAGCAGCCTGCATTCTCTTTGCTG
-CCCTCTCCACTCCAGGAAATAAGTTAAGCAGGTACCTAAATGCAATCTCAGTGTTGGGCC
-TCGTAAAACATCTGGGACAAGACATCCTCCATTACCAGAAAAAATGCAGTCATAAAAATC
-TCAAGGTTGACAGGATAGTGCCCAtttttatttatttattattattattattattttgag
-agaaagcctcactctgtggcccaggctggaatgcagtggcacgatcttggctcactgcaa
-cctccacctcccaggttcaagcgattctcctggctcagcctcccgagtagctgggattac
-aggcacctgccaccacgcctggctaatttttgtatttttaggagagacagggtttcacta
-tgttggccaggctggtctcgagctcctgacctctagtgatctgcccgcctcggccaccca
-aagtgctgggattatagatgtgagccaccgcacccggccCTGATACCCATTTTTAAAAAT
-CACATACAATCAAAATTCAGGATATAATTTACATAAAAACAAAAGCACTCATTTTGTCCA
-TCCCTTGCTTTGGGTTTATCTACCGGTCTTGTTGACTCCATTGCTAATATACATCCAGGT
-CCCATCCCATCTTCCCAACCTTTCCCAGTCTTTCATCCTTCAGCTGCACCTCTATGGCAA
-GGAGCCACCTCATGAACATCAGTTTCAGACTTGACAGCTGATGGCCGGGGGTGCAcatgg
-gcttgtggagacacggtcagggagccctgggtctacacctgagtctgcctgggccgctgt
-ccgttgtgtaatcttcatcaggccacatcctctctctgagtctcagttttcttttcctta
-aattggagatgaaaaagtctgtctcacttggcagtcaagaaggtccaacaggataaCTTC
-ATCCATGGTGAGAGAGTGGAGGAGAGGCCCCCAGGAGGAGGCAGGGATCTCATTCTGCGG
-GTACTGTACTTGGTTCTGGGAGTGGGATGGCAGACAAGCGTGTCACTGTCTTTGTTCTCA
-GAGCTTTGGTTGTGGAACGGGAATGGGAAGGTAAGGGAGGGTACCCCTGGCAGGGGCACA
-GCATAAACCAGGGTGTGGAGATGGGATGGCGAGGCAGGACTGCCCCAGAACTCTGTCCCC
-AGGGGCTGGCAGTGCTGAGAGGGACAGAGGGAGAAGCGATTGTTTATTCTCAGCCTCAGG
-AGGACGCAGGAGAATCTCAGGCATCAAATTTAGTGCAGCACACCTGCCTAGGCAAAACTG
-GACAGCTCCACCTCAACTTTGTAGAGGGGCAGAGAAAGCTGTGGGGAACCACCTTCCTGC
-TCTTGTCATGAAGTCCTCCTCAACTGGAAGCCCAAGCTTCAGGCCAGGAACTTCCCCAGC
-AGAGGCAGCCTTCCCCAGGGGGCCAAGACCTTGGCAGAATGTCTGGGGTGCTCATGGCAG
-CGCCTCTCACCTGGCCCCTGCCAAATCAGTTTCTGCTTGGCCTCTGCAGGATCTGACCTC
-GTTGAGTCCCCAGGGCCCAGTTCTCTGCCTCTGAGGCTAAAAGTGAGATCGTTTCCTGGT
-TGAGGAGTGACTAAAAGACTTCTGTGTgtagagactgggttttgctgtgttggccaggct
-ggtctcgaactcctgaccccaagtgattcaccTTAAGGTGAATGTGTGGCTGTGTACGCG
-CACGTGCAGAGCAGAACCATCACTCTGCTTGGGCTAGGCAGCTGGACTAATCGTCCATTT
-CCCCCCGCCCGGAGGCCTCTTCCAGGCCCCCAGCTGCCCTGATGGGCCAGGTCAGCCCCC
-CCCACAGGAGCCCCCAGCCGCTCCCCATTCGGCTTTCCTTGTATTGTGCGCTGCCTGGTT
-TCTCGAGGAAATGGGGCGGCTGCTGGGTGCGGGGGCGGCCGCCAGCAGCCCCACCCCCTT
-CCCCCCATTGTCACTCCTGGCTTCTGCCCCTAGCCCCTGCTGCTGACACTAAAAATAGAC
-CTGTTCACAGGGAGACGGCCCCACCCCTGAGCGGGGCCCCAGGCTCAGTGTCAGGTTGGG
-TTTGCCAAGACAGAGCTGCCCTGGGGACTGAGGTGGCTCAGCTGAAAGACCGGGGTCGAA
-ACACGTTAGGgctgtgtgaccttaggtccccttttctcctctctgagcctcaatttcctc
-acctttaaaatggggtaaggctacctacctgctaaggttgctCTTGACAATGAACAGAAG
-CTGGGTGAGTCACAAGCGCACTTCGTTCTCGTCCTGCCCGTGGTTTGGTGCTGCCTGAGC
-GGCTTGAGAACCTGGAGGACAGATGGCATAACACACGCCTTCATCTTCAATCTGCCTTGA
-ATGATTGCCAAGGACTTCCAAATCCCCCTAAACAGAGGAGCTGGAAGAGCCCACTTGGGA
-ATCCAAAAGTGTCCGCAGCTCTGCTGTGTGAGCCCGGGTAGGTGCCTCCTCTCTGGCATC
-CATGagctcacacgtgaagtatgcagccaggctgggactcgaacctgtgtctgcagcctc
-tgaagactgttttttccgctttaaggggctgcctcCATGCTGATGACTCCAAGGACTTCC
-TGGCTGGGATAACCCTGCCTTTTCGTCTACAAACACATGATTCATGGTGAAGGAAGATGC
-TGGGCGGTGGGCATGGAAGCCTGAGCTGGGGGCTGGGTAGTTCCCCTTGAGCCCATGCAG
-ATGGGCAGCTGTCCTCAGATGCCACCCGCAGCCATTGGGTTGGGCCCTGCAAAGGAGATA
-CTGGCATGTGTCTGTCTACCAGGCTCTTTTTTGTTGTTGTTCCTTTGTCCTTTTTTTTAA
-ACCATGGAATATTTCAAATATGGGTCTTTCATATACATTCAAAACCTTGAACTCTTAGAA
-TTACTTTTGTCACAGTTGCAATTTTTTTTTAAAtttttatttcatttgtctatttatttt
-ttgagacggagtctcgctctgttacccaggttagagtgcagtgacctgatcttggctcac
-tgcaaccttcgcctcccaggttcaagcaattctcctgcctcagccttccaagtagctggg
-attacaggcacgcaccaccatgcccagctaatttttgtatttttagtagagacagggttt
-taccatgttggccaggctggtcttgaactcctaacctcaggtgatcggtccaccttggcc
-tcccaaagcgctgggattacaggtgtgagccagcgtgcctggccTGCAATTTGATATATG
-TCTATGTAATTACCTATCTCCCATTAATCCTGGGCCCTAGAACAGGGACTGAGACTTTAT
-TATTAATCCATGTATTCCCCCCCAAAACAAATACAGTACTGTTATTCTCCCACACAGACC
-CTGAGAGCAAGCAGACTTGTCTCTATTGTTTGTGTTTTGGGATTTGTGGGGACACCTTGT
-GACCCAGTTTTGTTGTAAATCTTGTCCATGGGGTTTTGGTTTTGCTACCTAATTGCTTTG
-CCAATTTTTATGTGGGGATTTAGAAAGATTTAAAAGCTGAGTTTTCCACTGCAGACATAC
-CCATATTCCCGAATCTTGACTCTTTCTAAATACATATGTACATGAGAAAAAAAAAATCAG
-CACTCAAGGTATTCAGTGACAGGTTTCTCTCAGAACCTGGAAATGCTGGAAATGACCACT
-GTTGCTTAGTCGGGGCTCCtttctttcttttttttttttttttgaggcagagtcttgctc
-tgtcgcctaggctggagcgcagtggcgcaatcttggctcactgcaacctctgcctcccgg
-gttcaaggaattctgcccaagcctcctgagtagctgggattacaggtgcatgccatgact
-cccggctaattttcgtatttttagtagagatggtgtttcaccatgttggccaggctggtc
-tcgaactcctgacctagtgatctgcccacctcggcctcccaaagtgctgggattacaggc
-gtgagccaccgcacccagccTGAGGCTCCTTTCTTATATTTTATGTGTATCAAGCAAACT
-TAGGTACCTGGTCTAGTTCTTACACAAAGAGTGTACTTCCCCACTTAAAAACGGCTACAT
-TGggctgggtgtggtggctcatgcctgtaatcccagcattttgggaggctgaggcgggtg
-gatcatttgaggtcagaagttcgagaccagcctggccaacatggtgaaaccctatctcta
-ctaaaaatacaaaaacattagcccggtgtggtggcagatgcctgtaatcccagctactct
-ggaggctgaggtgagagagtctctcgaacccaggaagcggaggttgcagtaagctgagat
-cacagcactgcactccagcctgggtgacagagcaagactctatctcaaataaataaataa
-ataaataaataaataaataaaataaaATGGCTACATTAAAAGTAggatttttagcttttg
-ttccatagacctcttcggcatatggtgaagtggggatggaccccttctcaaaatgtggtt
-tttttttaattagtctttttttttttttttttcaatagaggtggcgtctgactatgatgc
-ctagcctggtctccaactcctgggctcaagtgatcctcctgccttagccttccagacagc
-agggattacaggcatgagctactgcacctggatttttttttaatgttttataaatgcata
-aaataaaatgcacgatattacaaaggaaaccaattatactgaaatgctattactgcaata
-taaacaagggtttgtgatgcagtgatgaggtgaacttctttattagtacattaaataaca
-agatggggaagcaggttgcaggtcaccatgaacgtaaacaatatgtaatgttatctgcaa
-ccactgtgatatgaaatgaaagtatctttgacttctgttgtaacagtcactgctaaccct
-accatgcttcttgatccacattcatacttgaaggaaatgctgcatttcaattagaggtta
-gtgaatataaagttattttttcccacctaagttcatgaagtttctgagttctagatcagg
-taaagaacccctgCTAAAAATTGTGGCTGTCCCTCACTTGATTCAACCAGTCTCTTATTG
-AAAAGTCACCCCacctcagcatttcttcaaatctcatccttatgcagttggggaaactga
-ggcccaggctggagaacaaacttgggtcattctgccctggggggattgcagaatccagtg
-tcctgattcccggctcaggttattttccagctcctcccctaccagGCGGGTGGCAGGGAC
-CCCCCCTCGGCCCCACCTCCCTGCTCGCCAGGAGCAGCTGGCGTCCTGTCCCGAGAGTGA
-CCCAGCCCCGCCCCGCCCTCGCCCCACCCTGGCCGGCCAGCTGTGGATGTGACAGGAGGC
-TTGGCTCTGGCTCACTCCGGCACATTCCTGGCCCAGCCACTGTTTTCCTCTTCTTCTTTT
-TTTTTTTGGTGGTGACTTTTTCTCCCATACCCCTCCCACTCCTTTTCCTCAAAAATGCTG
-TGTCTTTCCCCAGAGGGTCCCTCTGGGCGGCTCCGGGAGGGAAATGTGGCCTGGATTTCC
-TGGAACGCGTGGAGCTGGAGTCTCAGCGCTGGGAGGAGGGAAGCTGTTGGCAGCAGGGCA
-CCCCCCCAACATAACTGGGCCTCCCTGGAGAAAGAGGGTGAGCGGAGCCTCAATATTCCC
-TTTGCACTGGGCCCTCTGAGCAGTGGCACCCGCAGCTGCAGCGAGTGGGCTGCTGCCTCG
-GGGATAGTGAGACGCCTCTAGGAAACCGCGgctctgtgatcttggggaagctgggcattc
-tctctgagcttgggtttccttgctccttagaactgaggatgtgatctggatctgccacag
-ctggtgggacagtccagtgaggcgatggctgtaCATGGTCCCTTTCCAAACAGGGAACAA
-GAAGCGAGGTGTTGGGGGCATCTGGGGATGCAGGTTTGGGGGCTGCATTTGGGGCAGCAG
-GGGTGGAACAGAGAATTTCCATCCTTCCTTCTTACCTTCATTCATTCATGAGACAAACGT
-GTATCAGACAATTACCATTGTGCCTCTCGGGGCTCacaataagagacaagtaaatgtctc
-ctgtaggggcaggtgcagatgagtgctctaagaaaaagtgaagcagggtGCAGGGATAGA
-GTTTCTGAGGGTGCTGGGGGGAGCTGCTCTGCTGGGGCACCACATGAGCccaggcagagg
-gagcagtgggtgctgaaggctctgaggtgggagcaagcaaggaagggaagagaaggcaag
-gtttgtgtggagtgggggagacagcagagagggctgtggggacttctgggtgaggcgagg
-actttggctcgattcatgggaagctacgaagggctttgagcctgcagtgacacagtctgT
-AAAGGACCCACGGGGCTCTACAGGAGGTgcgcacgtggaggagtgacttggaggccaagc
-agctggggtcctggcttcagctcctccctggctctgtgagcgtggacaggatgcttctcc
-ttgagcctcattttcctcctcagtagagtgggctcatggagctctgaagactaagaggaa
-gggTCATCAAAGTGATGACCCTTTGCCATCACTTTGCCTGTGAGCTACAGGTCTCTATAA
-GTGGGAGCTGTTTTTTTCTATGAGCCTCTGAGGATTGGAGCCACTTGCTTAGGGGGAGGC
-TTTGGGGACAGAGCCAAAGGCTGGTTCCGAGCCCAGGTAGAGCAGTGGCTGCTCAGATTT
-TGGGGACATGTGGTGTCATGATCTGGGAGGGGGATATTCTTGAGTTGTCTGCAGCCCTTT
-TCCCCTTATGGGTACGTGGCTGGATTTAGGGAACCCTAGGGCAAGGGAAGAAGGGCTAGG
-AGCTGCCCCTGAGATCTGTGAGATGGGAGGTGGCCGGGTGTTCAGAGGTTCTCTGAGGTT
-GCAGAATGCCCTGTCAACCACTCTCCCATACCCAGAGGGGGCTGGACGCATCCCTCTCtc
-ccttgtcctcagtctcgattttctcatctgtgaggtgggcacaacaagtcctaatcctgg
-cagTGATAGGAACGTTTGGGGAAGCAGTGATTTGTCATGCATGATGCGGTCGGACAGGAC
-CCTGCCCTTAAGAAGGAGGGAGCCCACCTGCCCAGGCACTGTGCTGAGCTTCTGTGCATT
-AGCTGAAAGTGGACAGGATGACGTCACTTCACTGGAACTTTCTGTGGCTTCTCTTTGCTC
-TCCTATGGAGGTTCCATGGGAGGTAGGAGCTGGGGGCTAAccctgcataccttataaacc
-tcaactctcacatcctcctggctttctgtgtccaggttcacaggcctcctgaatctccct
-ccttaatgcccacgttgttctggcctctgagacattgtgttactccctgaattccttcct
-cttgccctagtaaactctccctccctgctcagctcagtttaactatctcttcctagagga
-agcccaccctgtcctgtagactaggctgagtctcacattgcggcatcttaaggtgctgcc
-tcctctcctggtaacacctgtcgctgttgtaatttcacaggtgttgctgcaattacctgg
-ttgctgactctccccacattaggactgtgtgttccatgagggcagggacgttttctcgat
-cacagccatatccccaacagtaatagcaaattgcagatgctcaataaatgctttctggat
-aaatggaGGGGTGAaatcattttgacaatcagaagaagaaggtgccccccttttacagat
-aaggaaccaaaggtacagagagattaagtaacatgccccgaggtcacacagccagaatca
-gatggTGTCTGTCTGGGAATGTGTCCCTGCAAGCCAGGCCTAGAAGGTGGGCAGATGGGG
-TTACGCAGAGAGGAGCTAGGACCATCTGGATAAGGGAGGGTTGTGGGGGCAAGCCCCACC
-CATCCTTGTTTTCTCCATTCGAATAGTGGTTTGTGGCTGTTTTCCTCAAGGGCGACTCAG
-GTGACCTTCAGGTTGGGGCCTCCTGGGTCCCAGGGGCCTGCTGGGTGGAGGGCCCGGTCT
-GGCTGGGCTGCTTTTCTCGCCCCTTTGCCGGCCCGCTGGCTTCACGCACAGATTACAACT
-TCCCCTCTTCGGCCGTCTTACGCAGGCCACCTCCGGCTCGCCATTGTCTCATTGTTTGCT
-GAGGGAAGCTCCAGGAGGAAATCAACCTGCTGCTCACCCCAAGCAGGGAGTTTCACCCCC
-AGCCCCCACCCAGGGAATGCCTGGGGGGAGGGCAGGAGGGGTGGGGGCAGGTAGCAGGCa
-atgcaacaggcagccttgaagggagtgagctccctggccgggaagtatgcaagcagaagc
-tacatTCACAGCACCTATTTACTAGGTCCTCTCCCAGGCTGCACGTCAGGCAGCTGGAGA
-CACAGATGCTAGAAAAGGGTCTTGTCCTTAAAGACCCTGTAGCCTAGAAGAGATGCTGGG
-CAGGGCCTCAAAGCCAAATGCCTTAGGGGCCAGACAGGTGACAGAAATCTGTAGGCCTGC
-GAGCAATGCTGAGTGGTCGGGACGTTAAATGAAAACTATGGTGCGAAGGAAGGCTTTTAG
-ATTCCAATTTTATTTTAACATGTTGCTAATCAAACAAATGAGTCCTCCAGCCTGATGTAG
-ACTGCGGAACCCCAGCCTAGCCCTTTAGAAAGGAATTCTTGTTCTGGGGTGAAATTGGAT
-CAATAGTTATTGGTGTCTGCCCCTATGCCTTTAGCTATAGCTGTGATGGGCAGTTCCCAG
-CACACTGACAGCATCCCTTTTCAAACACCCAGCAGTCATTTGGCTTCTCTGAAGACTTGG
-GAACTCTCTCAGGGACCTGGgaggagttgatgccactaggggcacccctcagtcaatggg
-gaatgggagttagtgggtaaatgccccatcctcttatccattggaagttcctggtcactc
-aaaggtctgcagtgagttgggggcactggttgcccatactggaaactggctcaataactc
-actttttatccgtttcccctcttcgctgtcactctcccagatccctctggcttcctgggc
-taccggctcccaaattcttgtctcaggctctgcttttaggggaacccaaactaaaacaGT
-CTCTAATATTCTTTCCAAATAGCTTATGATTGTACACTTAGGTGATTCTAATATCCAATG
-ACTTTAACTCTGTGATTATAAGTTTTCATAAGTAAACCCAACTGTGATTCCAGAATGATG
-TCATTCTAATATGGCCGAGATACACCTATCAGAACTGGAATGCTCCATTTTGTACAACTG
-AATTTTGCTTCTCTTGAGCTCCTATTTTTTTTTTCCGATGCCAGAAAATGCAAACTTCAA
-AAAAATCTAGACAAAAACCAATTATTTCAGATTTGAACTCAGTTGGGTGAATCAAGCTTT
-CCCTGGCATCCCTTTTTTCCCGGATTCATTTAAGTCCTGGAAGGGTAGAGGCATCTTGGC
-ATTGGTTGAGGGAAGAAGGGGTCTGTGACTGGTGTTTCTCAAGCTATACCAACCCATCTG
-GCTCTCCAGCATGCTTCTGCCCCCTTGGCATTCACTGGAGATGACCCACTCATGTTGATG
-CTTTGATCTCTAGGGTCAAAGAAGCATAGCTTTCTCCTCCTGGACCATACACTGTAAGAG
-TCACGTCCACTCCATTCAGTCATCTGAAAAGATGTGTTCACTTTTTACACCTCACAAGGC
-CCTGTATACAAACTCGtcattcaatcaaatgtacttgctgagtatccggcatgtgttggc
-attgagccaggcactgaggatacaaagatgaaaagacaggtccctttcctcaagtcattt
-gcaagccaaataatgtataaatattttcaacttacatattgtgatgtccattatgaagga
-accaaatagggtaggcagagaaagcctctttgaagagctgtcattggagccaaagtctaa
-agtcaggggaagccacaaaaaggtttagcaagaaagaCATGTCTGATTATATCTGTAACT
-GTAAAACATTTTCtttttctctttctttcttttattattattttttggagacagggtctc
-actttgtcacacaggccagagggcactggtgcgattttggttcactgcagcctcaaccta
-cggggctcaagcgatctccttcctcagccccccaagtagctgggattctaggcacatgcc
-accatgcccagttaatttttttgtattttttgtagagatagggtttcaccatgttgccca
-ggctggtctcgaactcctgagctcaagtgatatgcccaccttggcctgccaaagcattag
-gattagaggtgtgagccatcacgtttggccGGTAACTGTAAAACTTTTTGTAATACTGAA
-GGCATCTCCTGCATTTTTTCATACATTTTACTTTTCCCCTATTTATTGGTGGCCTCCATC
-ACCTTAGAGATTCACGTCTCAAAGGACAAGAGTCATGGAAATTTAGTCAAAGCCCTGAGT
-AATTTGAGAGTGTACAATTTATGCCATAAATAATAGATTGAGAAGAATAGATGAGTCAAA
-TTGGTTTTCCTCTTTAGGAAACGAGATAAAGATTATCGGGAGGTGGGGAGAAGGGAAGtg
-tagcagagatgtccagctgtcatgcaattacccgacttccccttcttctatagctgcaga
-tggccatgtatctacactgcatttcgctgtctcccttgcagtttaggcgtggccacgtga
-ccaggctctggcaaaggatatgtgaaccgaatggtgtgtgcaacttctgggtcatgcatt
-gaaagaaaaaaaggggcatcctcttcccacacctcttcttcccttcctgccagctagaat
-ttggcatggtggcaggagcagtagcagccgtcttagaccacaagactgaagccacacgtt
-gaggatgtcagaacaacaaaatggaaggatcccaggtatctgacgtcatgggactcatag
-cggcctagactgcttgccccctactggttagtgagagagaaatcaaTAGCTGAGTTAGCA
-TCCCAAGTAATACAGAGGGTCAGAAATATAGGAAATTagcctgttgctgtggctcacgcc
-tctaatccctgcactttgggaggctgagttgggcagatcacttgaggtcaggttttgaga
-ccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaactagctgcggc
-atggtaggacatgtgcctgtaatcccagctactcaggaggctgaggctggagaattgctt
-gaacccgggaggcagaggttgcagtgagctgagattgtgccactgcactccagcatgggt
-gacagagcaaggctctgtctcaaaaaaaaaaaaaaaaagaaaggaaagaaaTATAGGAAA
-TTAGTGTGCATAGACACTGGTGTAACCCTGAAAAAAGAATAGAAACTTCGTGTGGTCTTG
-AGGGGTCTAAGGTCTGGGCCCAGAGCCTTAATTCTGGGTAGAACCCAAGGAAGCCATGAA
-CCTAACTGCCTGAGTGTGTGTGCAGGCACCTGGAGCAGGACACTTCAGGGGAAGGGAGGT
-GAACTGAGGGGAAAAAGCAAAAGAAGACACCCAGAATTGACCAAGATTAAGTTTCTCCTA
-CCTAGTGGAATGGAGGCTATTTATTTTGGGTGTGAGCTGAGAGTTGTACCTGCTTCCCAT
-TTTATTATTATTGTATTATTATTCCTGGATCCCAGCCCAGCAGTTAACAGGAACCTGAGT
-GGAGGCTGAGTTTTATCAATAAATTTTTGCTGAGCACCAaggcccaggctcaggtcccag
-cctagctccctacttgctgggtggccttgagcatgttacttctcttttctgagccttggt
-gatctcattgggaacataaaggggttgaactccaggatgctcaaggtggctctttttgca
-ttgatgtcctgtggttttTCTCTGGGTCTGGCAATGAGGGCAGTTCAGGAAAAGTGTGAT
-AAAATAGCTCTACTTTAGTTCATAGAGGGACAAGACACAGTCACATGGGcacacatgtac
-acacacacacacacacacacacacacacacaAATGTGATTAACCAAACATCATGGTAGCC
-AAGAAGATATGTAGCATTAAGGTTTagaatacaggctttgaagtcaaacagaccagagtt
-aacaacctcattttgtttttattTTCTTTTTTAAAAtttttttaaaattatactttaagt
-tctagggtacatgtgcacaacgtgcaggtttgttacatatgtatacatgtgccatgttgg
-tgtgctgcacccattaactggacatttacattaggtatatctgctaatgctatccctccc
-tcctccccttaccccacaacaggccccggtgtgtgatgttccccttcctgtgtccaagtg
-ttctcattgttcagttcccacctatgagtgagaacatgcggtgtttggttttttgtcctt
-gcgatagtttgctgagaatgatggcttccagcttcatccatgtctctacaaaggacatga
-acacatccttttttatggctgcatagtattccatggtgtatatgtgccacattttcttaa
-tccagtctatcaatgatggacatttgggttgcttccaagtctttgctattgtgaatagcg
-ccgcaataaacatacatgtgcatgtgtctttatagcagcatgatttataatcctttgggt
-atatacccagtaatgggatggctgggtcaaatggtatttctagttctagatccctgagga
-attgccacactgtcttccacaatggttgaactagtttacagtcccaccaacagtgtaaaa
-gcattcctttctccacatcctctctagcacctgttgtttcctgactttttaacgatcgcc
-attcttactggtgtgagatggtatctcattgtggttttgatttgcatttctctgatggcc
-agtgatgatgagcattttttcatatgtctgttggctgcataaatgtcttcttttgagaag
-tgtctgttcatatccttcgcccacttgttgatggggttgtttgtttttttcttgtaaatt
-tgtttgagttctttgtagattctggatattagccctttgtcagatgagtagattgcaaaa
-attttctcccattctgtaggttgcctgtttactctgatggtagtttcttttgctgtgcag
-aagctctttagtttaattagatcccatttgtcaattttggcttttgttgccattgctttt
-agtgttttagtcatgaagtccttgcccatgcctatgtcctgaatggcattgcctaggttt
-tcttctagggtttttatggttttaggtctaacatttaagtctttaatccatcttgagtta
-atttttgtattaggtgtaaggaagggatccagtttcagctttctacatatggctagccag
-ttttcccagcaccatttgctaaatagggaatcctttccccatttcttgtttttgtcaggt
-ttgtcaaagatcaggtggAGCaaccccattttcatcactaactagctggtgaccttggat
-aagtcactttatttctctgagtcttgggtttctcccatttaaaaggaggatgataatacc
-tatatttagggctttcatgtaataaaataaggtaatttatgtgcagctccaagatcacgc
-tgggcacgttacagatactcagtaaatggtggttattCTGATGAGGATTGTGAGCCATGG
-TGAGAATCAAGTGAAAGGTGGAGAAGGGCAGAGCTGGTGGGTCTTGAGTATGGACTAGGA
-AGATCCATGAAGTCCAGGGTGTAGGGAGGCTCTTGGAGAAGGCAGGACATGAGCAGTGCA
-GGGATGTGTAAAAGCGTGACCAGATGGGATGAAATACCCTTTTAGGAGAAGGAGAAAATA
-GACCCAGAAGCGAGGTAGAGCCAGGcttgagaaaattacttcctctttctgagccttatt
-tttcctcttggtaaagcgagtgtaacaatatctgccttgcaatgttgttatagcgattat
-tgagatgttagaagtcaagctcccattaagatgcctggctcatgtaaggcatcaaatatt
-agtttcattCCTTTCCCAAGAGAGGGTACTCACAAAATATCATCAGGGCTAgtaacacag
-aggataaatatttgaggggatggatacctcattctccatgatgtgattatgtcacattgc
-atacctatatcaaaacatctcatgtaccccataaatatatacaccgaatatgtaccccaa
-aaattaaaaATAAACAATTTTTAAAAAAATCCCCCAAAACAAAAACAAATGAACAAACAA
-AGACAAAATGTCAGGGCTAGAGTGACCCTCAACGCCTTTCTATGGTAACATACACATCTA
-TTCATGAACTGTTCACACAtcattcatcaatctatacagctatcacttatgcatttttca
-tatatccattcaaacaccaacaattcattcatcacccattgttcattcatctagccaaaa
-gtccattcatccttcactcaccatctatccttatccatcatcatgcattcatcagcaacc
-ttccatctgtctacctatcatctattctatattcatccttcatcaatctatttcatatcc
-atacacccattcagccagctactcaagcagccatcattctttcatctgtctatccattta
-tcatttatccatcatccacctatccacctgccattagttagccatcaccatctctcatga
-atttatttgttcctcaactatccattcttcatgcatctatccatctatttatcactcaat
-gatccatccatccattatttcattcatCATTTATGCACCCACCATTTTTCACGCATGAAA
-TATTCATCCAAAATCTATTCTTCATTTCTTCATAGCTATCATTTACAAGCCAAACATCAA
-CCCACCAATTTACTCTTCCTCCCTTCCTCTTCCATGCATCATCCATCCTTCATTCACTCT
-TTCACTAAACATCTGTCATCTATTAGCCATGCCTATCATCATCTATGTATCTTCCATCGA
-CATAACCACCTACGATCTATGTAATTTCATCATCCATCTGTATATGTTTatccagtcatt
-cattcatttatgtttcatcttccatattgcctgtcaggtaacatacaccagagatacaga
-ctaaataagctacaacctgtcctccagttgttcagagtctagtggagaaagataaataag
-cctatgatagctgctgtaccagaggaatgactgtaccaagcaccccaggggagaccacac
-aggagagagccacagactctgagggaactggggaaggactcacaaaggaggtggcagttc
-attaaactgggtctcgaagaatgattagaagGTCCACTGttttttttttttttttttttt
-ttttgagacagagtctcactctgtcccccaggctggagtgcagtggcatgatcgtggctc
-actgcaacctctgccttccaggttcaagcaattctcgtgcctcagcctcccgagtagcta
-ggactacaggtgcccgccaccaggcctggctaattttttgtatttttagtagagatgggg
-ttttaccgtgttggccaggctggtctcgaactcctgacctcaagtgatctgctcctgacc
-tcaagtgatctgcgcgacttggcctcccaaagtgctgggattacaggcgtgagtgagcca
-ctgtgcccagccCAAAGGTCCCCTGGTATttttatggggggaaatgagtcctaagagggg
-aagtgactgtgcataatcatactaagagttaattaacaggacagagacttgtaaccaagt
-ctctagcctactatactagttctgtttccactTCTTATGGGAAACAGTAAGTTACTCAAG
-GGAAGACAAGTAAGCAAAGAAAACCTGCCTCGAAGCACCAGAAGGCTGCTGTTTTAGGAT
-CTGGTTGTAGATGGGGTGGAGAAGGGGATTTTCCTAGACCTCAGCTTCTCATTCAGGGAG
-AGGTAACAGCAGAAGCCCCAGGAATATTTGACAAAGGGCAGGAAAGAAGGAGGAGGAGAG
-ACAGAGCACAGTGAGGTGAGGAGAAAAACAggtcaggcacagtggggctcatacctgtaa
-tcccagtgttttgagagatcgaggtgggaggatcacttgaggccaggacttggagaccag
-cctgggaaactccatctctaccaaaaaaaattaaccgggtgtggtagcatgtgcctgtag
-tcctggctgaggcaggaggatccccttgagcccaggagtttgaggctggctgcagtgagc
-taagatcgtgcctctgcactccagcctgggtgacagagcgagcccctgcttcaaaaggaa
-ataatataataataaaaaaaCCCCACCTACTATTTTCTTGTTACCTTTACTTGGGTAATT
-AATAATAATATTGTTACTGCTTggcacggtggcttatgccagcaatcccagcactttggg
-aggccgaggtgggtgggtcatttgaggtcgggagtttgagaccagcctggccaacatggt
-gaaaccgtctctactaaaaatatgcaaattaaccaggtatggttacacatgcctgtagtc
-ctagctacttgggaggctgaggcaggagaatcacttgaatccaggaggtggaggttgcag
-cgagccgagatcatgccattgcactccagcctgggcaacagagcgagagtccatgtcaaa
-aataaaaataataataaTGTTGTTAATATTCTAGCagccatgttttattgagcacagact
-acgtgctgaacagtgtgctatagatttttcatgcatcataccattttatacctcaccctc
-agcagccccaagaagcagttattactcttgtccccattttgtgaatgaggaaactaagtt
-cctgagaaggtaagctaggatttaaatatggtctgtgtgactacaaattccatgtccttt
-ccactcctctttgctgcctctctCATCGTTCTTTGGGTATGGTATATAATAAGTGACTCA
-GACATACATGTGCATTCACTAAGATATATGCTTCATTTTACTGGAGATTTTCTCTGTATC
-CTCAGACTCTGAAATAGTGGACATAGTAGGAAAGAAAAAATTTGTTGAATTTTCATAGCT
-ATCATTTACAAGCCAAACATCAACCCACCAAGAAATATCTTCTATTTCTTGTTGAATTAT
-CTTGCAAAGAAAATGGATAATCAATTAGAATATAGGGTATACAGGTTTGTCTATTCTGAC
-ACAAGTCCAAAGttttttgttttttttttttgagataagagtcttgctctgttgcccagg
-ctggagtgagtgcaatggcacgatcttggctcactgcaacctccgcctcccaggttcaag
-cgattctcctgcctcagcctctcaagtagctgggattacagctgcctgccaccatgccag
-ctattgtttttttgtatttttagtagagatggggtttcaccatattggccaggctggtct
-cgcacttctgacctcaagtgatctgcttgccttggcctcccaaagtgctgggattacaga
-cgtgagccaccgtgcctggGCAAATCTGAAGTATTAATAGCATAAAGATATAATTATTTT
-TCTCCCAGGTCCAGGAGTAGgctgggcatggtagctcatgcctgtggtcccggctacaca
-ggaggctgaggtgggcggattgcttgagctcaggagttcgaggttgcagtgagctatgat
-tgtgctgctgcactccagcctgggtgacagagggagatgctatctcaaaataataataat
-aataaTCCAGGacaagcttgtttgggtcccaggcttcttctgtcatgcagctctgccacc
-cccagggtgttgccctagtccccgtggtctcagatgccacccacatatctacaccacagg
-cagtaggcagtggaaaaggcatgaggcaactatgacttgcaggttgctctccccacttct
-gttcacctaccactggtcagaatttagtcatgtgatagtaaccagctgcaagggaggctg
-ggcaatgtagtctttattctgagaggctatgtgttcaggtaaaagtgagaggttttattt
-ccacaggagaaggggaaaatgggtatgaggggcaagtaggggtctctgGCGTAGATGAGA
-AGAAGATGTATGGACACCAATATTCTCTATCATGTGAAGACTCCTAGGGTCAcatatcat
-ctctcccattagacagcaagctccctgagggcagggggctagattaatcaccctggtgtc
-cctgaaagcttctagctcagACTTAAGGAAGAAGACTTTTTCAGTCCCGGATAGAGGTCT
-AATGATCTGATGGAACCAGAGCAAGTAGGTTAGAGGCCTTTTGCCTGGTGACGACCAAAG
-TGGAGAGGCCAGGCGTCTGGGAGGCGGCCAGCAACAGTAGAGAGAGACGCAGGAAAGCGA
-CTTGCAAGGGGGCTGGAGTGGGTGAAAGGTCAGAGGAGAGTCTGGAAAGGAGGATGCAGT
-GTTGCAGGGCGGGCAGAGCTGGGGGAAGGAGGGGATAATTTAGTAATCACAGCTCTTCCC
-TCAATAGAATGCTCAAGGGCTCACAAAGCATCTTGGCCTCCATGTTCTCACTGGTGAGGA
-TAGATGGTACATGAAGTTAGGTGGCAGATGGGGGGGTGCTTCGGATTGCCACCAGCCCAT
-TCCTATCTAGAGAACTGTCACTGGTttccttcttcgtttcccatgtgcttcctttctcct
-tccctgtctcccttccttcttccttccttgatttctctcttcttcctCTGTATGTGTGGa
-tatacacatgtataacacacacacacacatagacatacatatatatgtatatctgaatgt
-atgtctctgtatgtacagatatacacatatacatatatgtatatgtgcatacacatatGT
-GATGACCAAAGTGGAGAGGGCTAAAAGATGAGGCCAGGTGTCTGGGAGGCAGCCAGCAAC
-AGTAGAGAGAGACGCAGGAAAGCGACTTGCAAGGGGACTGGAATGGGTGAAAGGTCAGAA
-AAGAAgtgtgtatatgtgtgtatgtatatgtgtgtatatgtatatgtacatatatgtgtg
-tacatatgtatgtgtgtgtgtgtgtgtgtgtatgtataatcacctactatgtgccaggag
-gtattgtgaaagttattgagaaacacactggtgagcaaaccagacaagatccttgccctc
-atggagcttatgcttaagagagagagatattacacaaataaatgcacaaatagctccata
-accgttaaatgtgaccaacgactagcgctatgcagaagtgcagaatgctgtgagaGCATA
-TTCGTTGTGTATTCCAGCATTTATTAAACAAATATTTAATAAAGCAAATTATATGTATTA
-GAGAtttgcttttttttttttttttttttgagatggagtcttgctctgttgcccaggctg
-gagtgcagtggcacgatcttggctcactgcaacctctgctgcccaggttcaagcgattct
-cctgcctcagcctcccgagtacctgggattacaggtatgtgccaccacgtctggctaatt
-cttgttttttagtagagacggggtttcagcatcttggccaggctggtcttgaactcctga
-cttcgtgatccacctgtcttggcctcccaaagtgctgggattataggcatgagccactgc
-gcctggccTAGAgataatttttagaaaggaataaaatcacgctcttgttcaaatataaaa
-tgaacatgtgtcaaagattttatttaactcattaatttatgaggtaaccaataaggtgtt
-aaaaaatagttcaaaggagaatccaaagagaagaggcatacataggtaatgaggattgct
-tacattaatttgctaaagatgcaaaactgttttcttccaagagtactggggggaatgaat
-tgcatctttattattattattttgagacagggtctctctctgttgccaaagggctagaat
-gcagtggtatgatcatggctcactgcagcctcaacctcctgggctcaagcgatcctccca
-cctcagcctcctgagtagttgggactatagacaagtgatatgtgacaccttgctagctaa
-tttttaaataattttttgtagagatggggtttctctctgttgcccaggctggtctcaaac
-tcctgggctcaagtgttcctgccacaggctcccaaagtgctgggattacaggcgcgagcc
-accgcatctggcctcaactgcatcttgagcagaagaaatttgtttgcatctctgtgacga
-gaattgtttttattatcatcaatcttgttacaacatattgaagtgtacgctagctcaaaa
-atgtgaaatgcgtcggcaaccatagaatcagctaacctgaaatgatgtaaagacaattca
-taCCATTCTGGAGGACTTCCAGTAATCTTTGTGGACTTTTTTTTTTCAGCTTCAAAGTAT
-TTTACAGTTTTTcctgatgtgagtcagatcggtactagatactaataatacagaggtaaa
-ccatacagacacaatttctccctcaaggaCAATATTCCCTTATGTTCTAACTGGGGTGGA
-GAGCCGGGGAACAGTTTTTGGAAGCCAAACTGAGTCTTTGCCATTTATAcagtcatatgt
-taattaacaacaggaatatgttctgagaaatgtgtcgtcaggtgatttcattcttgtgca
-aacgtagaatgtactgtcacaattctagatggtacaacctactaggcacctagtctctat
-tctataacctatttcttctaggttacaaatttgtacctcatgttactgtactgaatattg
-taggcaattgtaacacaatggtaagtatttttgtatctaagcatagataaatatagaaaa
-gatacagaaaaaatatgtagaaaagattttttttaaaaaagacacacttgtatctttact
-gtgaatggagcttgcaggactggaagttactcttggtgagttaggaagtggtgactggat
-gtgaaagtctaggacattactgcacactactgtagactttataaacactgtacacttagg
-ctatactaaatttatttttaaaatttgtttctttcttcaatagttaactttagcttactg
-taactgttttgttctataaacaaaaaaattttaaaaacactttttgtattattttgtaat
-aacacttagcttaaaataggaacacattgtacagctgtataaaaacattttctttcttta
-tatccttattctataagcctttttctacttttaaatgttttttccttaaattttgttgtt
-gttgttgttaaaaactaagacacaaacacacacattagcttcagcctacacaaggtcagg
-atcatcaatatcactgtcttccacctccacgtttcgttccactggaaggttttcagggca
-gtaacacctgtggggctatcatatcctgtgacaacaataccttcttttgaatacctcctg
-aaaaacctacctgaggctgttttacagttaacttatttttttttaataagtagaaggagc
-acactgtaaaataacaattaaaaagtatagtaaacatgtaaatcaataagttgtttattg
-tcattatcaagtattatgtactgaacattttttttttttttttttgagatggagtttcgc
-tctggttgcccaggctggagtgcaatggcacaatcttggctcactgcaacttctgtctcc
-caggttcaagcgattcttccgcctcagcctccggagtagctgggattacaggcatgcacc
-accacgccgggctaattttgtatttttagtagagatgggCACACCAactaaagaacatca
-aagcccagagcgagaaccttcctccctttcccattttccttcaacttgttattaaggaga
-aagtctctgttcaatgctggtgtgtttttaacacctctcttaacacttacttcccttttt
-aacagagaataggcctccagagcctttggcaggccaccggatctggctagaatgtgatga
-cattgttttgttttcattgtacttatttttatggctaccttctatttatggcacgagata
-ctggttttccatttagggagggccctaaactttccttttgacataatatatttatgtttt
-tagaagaaggaccatttaaagaaaaaatattatgtaatattaattacataatatttgcag
-cacaggtggtactgagacagggaaaaaattataaagaggtatgtaaTGTGCTGAAAAGGA
-GGACATGCTTCTCAGGCTAATGCCTCtcccagcccctacttaacagaagggaccactgag
-gcacagagaggagaagggactttgtcaaggtcacacTGATGATGTGGACTAAGAACTGAC
-AGCCTCTTGATAGCCCTGTGGTGGGGGATATCTTGTGTCAGATGGGGAGGGCAGAGGTCA
-GGGACTGTGTGCAGCCCCATTGGTCAGTCCAGTGCACTGATCCGCTAGTCAGACAGAGTC
-CTCCAAGGTTGACCAAGTCATGGACTGAAGGCAAAAAGGACCGGGGGACCTGGAGGGGAG
-GAGAGAAGAATGCTGGTGTTTATCACGCACTAACTATGCTAGATGCTCGGGTGCCGGACG
-TCACCCCTAGGGAATTCACAAATTTGGGGGCAGACACGTCCTACAAAAATAACTCAAGTT
-TCTGGCGAAAGTGTGGTAAGTGTTCCAGCAGAGGCCTCTCtagtgacatctaggtttttg
-tctgctcactggtcatttccccatattcttttgggaaaccacctcttcaccactcttgat
-tcttgtagctcagaccaggcaaaccccacacccacttcagaggtgggcacatgaccagac
-ctggccaattagaacactttatccctcttgccacagagactggcacatggttgggcgcgt
-gacccaaggcaggccagagggggccttccccaggaatttgctggaactactggagaaaaa
-tcccacttcatagggtttttaaaatggatacactgtaagccagagttgctggcagctatc
-tttgccaccaaaagagagaggttctctgaaaatgaagctgacaggaaagcagggatgaca
-gatggagagacagctagagtcctaatgctactgtatggtcacctcctggacccagccgtg
-aaatcagtgaccctgaacACAGTTCTATTTTGCTTTGTTACCCAGGCTGGAGCtttttat
-ttttgtaattaaattaaattaaattaaattttaatttttagagacaaggtctcgctttat
-cacctagactggagtgcgtggtgcaatcacagctcactgcagaatcagcctcctaggctc
-aagtgatcctcctgcctcagcctcccatgtagttgggactacagttgtgtgccaccacgt
-ctggctaatttttaatttttattattatttaatttaatttttaatttttattttttgtag
-acatgtggtctcactatgttacccaggctggtcttgaactcctggcctcaagtgatcctc
-ctacctttatctcccaaagttctgggattccaggtgtgagccattgtgcctggctCGttt
-ttatttttatagagatggggtctctctatgttgcccaggcttgaactcGGTTCTAGAAGG
-CAATAacacacacacacacacacacacacacatacaTAtttgcattagccactttgagat
-gggtttctgtctcttaaaaccaaaaagagacctgtctaatTCCAGGCAGAAACAATATCA
-TGGGAATGTTGGCAAGGGAGAGGGATTGGAGTGTGTGTAAAGATTTATCTGGGAGTCCTT
-CCTCGTGGAGGTAGGTTTTGAGCAGGGTTTTGAGAAATGGAGAGGATTTTGATATATAAA
-GAAGGTGAAGAAACAGTATTTCCAGGGAGGGGAACATCCTGGGCAAAGGCTTGGTGGTGG
-AAGAGGGCAGGGAAGTGGCGCCGTCCAGTGTGATTGGAGAGAGGATGGGGATAGAGAGGA
-GGTGGGAGAAGAGCTGGCAAGAAGGGATGTGCCCTAATCGTGCAGAGATCCAGTCTGCTC
-CTTCACCTGCATCCTCCTCCTCTGGAGGCGTGCCCTTCATCAGttaattcatccacagcc
-atttactgaacaccagcatgcgtcaggcactgtcaaagggctggcgagagagctgtgggc
-cacaccaccaagtccctgccctcttgtagcttcttttgtaggtgaaggacacaggtggta
-aacatgagcaagaaataaacaagtatcatagtgtcagggagcagtaactgttatctagaa
-aaattaagacgagtaaagggaatacagactagtggagaggTGTTTGGGAtgaaaacggat
-aatactgatggttgaccgacatcgtgagtgcactcaatgccactgaactggtaaaatggt
-taaaatgataaattttacattaggtatttttctgttctttatattatgtacattttacca
-caataaaaaaCAGGATTggcagaggggtgctattttagctagggtggtcagggcatgtct
-ctctaaggaggtgtcgtttgaacagaatggaggggaattagcaagccttgaagagattgg
-ggggaaggtattctgggtggagggaattgccaggacagatcctgtggggccagagtcggc
-ctggtgtgttctaaggacagcaagtgggcccctgtggctggagcccagagagcaaaggga
-gagggggaggaagatgagtacagggatcagcaggggcttgtatgccaggagagaactttg
-gatttggttgtatgagtgatgggaagccatcggagggctgagcagggaagggatatgaat
-cagagtttctgttCAATTCTCCCTCTGCCCACACTCAGTCCTGCTCTTAATCAGGTTGGT
-AATCTTGCCTCTGCTTCTGACTATCTCTCTCTCCTGGCTGCTACCCTCTTCTGCACATCT
-TCATGACCACTATCTTGCTGAGGTCATCttttttttttttttttgagacagagtctcact
-ctgtctcccagctgaagtgcagtggcacaatctcggctcgctacagcctctgcctcctgg
-gttcaagtcattctcatgcctcagcctcccgagtagctgggattcaggcgagcaccacca
-tacccagttaatttttgtatttgtagtaacgatggggttttgccatgttggccaggctgg
-tcttgaacacctggcctcaagtgatccacccaccttggcctcccaaagtgctgggattac
-aggtgtgaaccaccacacccagAGAGGTCATTGTTTTTATATGGCTGACCCAAATGGCCT
-CCAACTGGCCTCCCTGCCTCCTGCCGACCCAGCCTCCACCAGTCATCAGGGTCTCTTTCT
-ACCCGCAGCTCTGACCAGCCCTTGCCTTGGTGAGAGCCACAGCCTCCCAACTTCCAGTCC
-AGCCCCATCTATCTTCTTTTCTCCTCACCCCAAAGCCCACACTTAGTCACTCAGAGCCTC
-CATGGGGTTCCCCTGCTGCCTGCCGTAGGCTTGCCCTCCTCAAGGCTGGTGTATGGCTCT
-CTGCTCTACTCGGGTTCCTTTTCACCTAGACAGCCCCCTCCCATCCTTCAACAGCCTCCC
-AGCATCACTCCTCTGTGAAGCCTTCCTTGGCTGTCCCACCCGCAGGCTGGCTTAGCTAGC
-TCCTCTTCAGTGCTCCCTAAACCACTCACATCTTCCACTTTCAGAGCCCCGAGCATGTGG
-CATGCAAAGCACATTggtttggtttggttttgtacaaacctttccctttcctcagctccc
-tgaaccccccagttccctgttcatagtatgttcgcaacaaatgtttattgaataaatgaa
-tGAGTTTGGAATTTATCTTGCAGAAACAATACTCCCACCACCACTACCAGCACCTCCACC
-AACGAAaataatatccaacccaagttgatgacttgctatgcatcgggcactgtgctacac
-acttccaaatctggatctgatttctatttcataatattaggaggaaatcactgtgttagc
-cccactttagagatgagaaaactgaggcatggtgaaattaatcaattttcctaaggctac
-ataactcagaagcaggagagccgacagtccaaAGTGTGCAGCCCAAAGCCGTGGGCACCG
-CATGCAGCTGGAGGAGGTGTCTTGGCATTACTGCATCCACGGACGGGGTTTCCAGGAGTC
-CTGGAGTTCCATATGAAGATTGATTGTCCATGAACTTTTTGGGCATGGGGGCAGGTCCAT
-TACTTGTAttttttttttttttgacagggtcttgctttgttacccaggctggagtgcagt
-ggtatggtcatagctcactgcagcctccatctcctgggttcgagagatcctctcacctca
-gcttcccaagtagctgggaccacaggcatgcatcaccatgtctgcattatatatatatat
-atatatttttttttttttttaagagatggtgtctccctgtgttgtgcaggctggtctcga
-actcctgtgctcaagtgatcctcctgccttggcctcccaaagtgttgggagtacaggtgt
-gggccatcgtgcccagccGTGATCCATTACtttttttttttttttttttgagacggagtc
-atgctctatcacccaggctggagtgtagtagtgagatctcggctcactgcaacttctgcc
-tcctgggttcaagcgattcttctgcctcagcctcctgagtagctgggattacaggtgtgt
-gctacctcgcttgactaatttttgtttttttagtagagacagggtttcaccatgttgacc
-aggctggtctcgaactcctgacctcaagtgatccgcccacctcggcctcccaaagtgctg
-agattataggtgtgggccaccgcacccggctGGTCCATTACTTTTACCAGGGTCTTAGAG
-GGGCTCTTGATAATTCCTATATTTAAGATGCTCCTCTGCACATAAGGGGGAAAGATGGAG
-AGTTTTCGAGTATTGGACTGTTGCGGTTCAACCTATGCTTTAGAGAGATCACGTTggcta
-tccattgcagtgtaatgcagggagaagagattggaaatatccctaagattcaccaagagt
-ggatgtgttaatcatatcatggtacctccttccacagaagggaataatacgcagccataa
-agatgaatgaggagtctctttatgtaccaatgtgaaatgattcctaagatatttatgtca
-gagagagagagacagggtCTgggtctcactctgtctcccagactggagtgcagtagtgtg
-atctcggttcactacagcctccatctctgggggctcaagagatcctctcgcctcagcctc
-ctcagtagctaggactacaggcttgcaccaccacgcttggctaattaaaataaaattttt
-ttttggagagactaggtctcactatattgcccaggctggtctcaaacttctgggccaaag
-agattctcgcacctcagccttccaaagtgctgggattacaggcgtgagctaccctgcctg
-gccTtccaagacatagtttaagtaaatacagcaaggtgcaggccagcatgtataattagc
-ttctatgtatgttttttaggaagggaggggttaagattatagatctagatgtgcttctat
-atgcataaaaaaTCTTTGGCAATATTCACTGTTAAATAGTCAGTGGAAACcctacctcat
-agggtttttatgagggttacatgagttaatattagataattgcttagaagagtacctggc
-acacattaagcactacagaagattttatttaataAAATAAAAAAGAgtggcgggcgcctg
-tagtcccggttacttgggaggctgaggcaggggaatggcgtgaacccgggaggcggagct
-tgcagtgagatgagatcgcgccactgcactccagcctgggcgacagtgtgagactctgtc
-tcaaaaaaaaaaaaaaaaaaaaaaGAGGGTCCCTTAGGGGATGGAGACCAGGTGACTAAG
-GGGCAGGGAGAGAGACTTATTTTTCATCTGAGGCCTTAGACGCCTTTTGAATTTGGTACC
-ATGGGTAAAttttttttatttttatttattaatttatttttgagacagagtctcactctg
-tcacccaggctggagtgcagtggcacgatctcggctcactgcaacctccacctcccgggt
-tcaagtgattctcctgcctcagcctccctcgtagctgggattacagttgtgcgccaccac
-acctggctaatttttgtatttttagtagagttggattttcgccatgttggccagcctggt
-ctcgaactcttgacatcagatgatctgcctgcctcagccttccaaagtgctacgatgaca
-ggcgtgagccaccacgcccggccTATTTTTTTGAAGTTGAAATTCAGTGTATCTTggcca
-ggcgtggtggctcatgctgtaaccctagcactttgggaagctgaggcaggtggattgctt
-gagctcaggagtttgagagcagcctgggcaacatagtgagaccctatctctcaaaaaaat
-gcaaaaattagctgggtgtagtggcgtgcacctgtagtcccagctacttggggggctgag
-gtgggaggattgcttgagcccaggaggcataggttgcagtgagccgagctcacaccactg
-cactccagcctggacgacggtgagaccctgtctcaaaaaagaaaacaaaaaacaaaaaac
-aaaaaaaaaaaaAGAGAAAGAAAGAAATTCAGCATATCTAGATAGCTAAGAGATCATCTG
-AGGGGGTCAGGGCCTGGAAGGAGATCCCACCCAGAATCCCCGGGAATTCGCTGTAATTGG
-TCAAAGGCCACATTGTGTAGTGTGAGAAATCAGGACGTGAGGAAAAGGCGGACAGGAGAC
-ACCAAAACACCCACGCCCCAGGGCCCACTATAAAAAGCACATTTAAAAACACCAGACTGG
-AAAAGTTttattattattattattattTTTTAAATAGCAAAAGCGAGTCCCCCCAGGAGG
-CGCACTGCAGCTGCGGCTGTGGCGGTTCCCAGGTGATGTCAGTCCTGGCCAGGCGCCAGT
-CCCGGCCCCTTGGAGACGGTCTTGGTGGGTTCAGCTTGACTGTTTTTCCTTCCTGAGACT
-TGAGGACACCTTCCTGTCTCAAAGAAGGAAGCCTTTCCAGGGCTTTCTGAAAGCCAGGGG
-CAGGGGAGGCGGTGGGCCTGGGCTGCAAGGGCAGAGAGAGGCAGGGAAGGTGGGTGGGGG
-TGGGGAGGAGCGGGGGCTGCCTCTGGGAGGAGAGTGAGGGTGGAGAGAGCAGAAGACAAG
-CCTGGCTCCTGGGTGGCTCTTTAGCCCTCCCACCCGGGGGCGCGAGGGGGTCTGCTTCTT
-GGGAATCCAAGGCCCGCCTCCCTGGCCCCATTGCTTCTCAGCCCTGGCTGCTTCCTGGGG
-AGGCCCCTGGGTGGGGTGAGGTTGTGGGGTGAGAGAGGTTCCCACAGAGTTCCCAGTTGG
-TCAGTGTCTTTTCTCCCTCCCTGAGCCCTGGGCCCACCCTTTCTTCTCTATGGTTAAAGG
-CTCTTTGCCAATATCTTCCAggccaagcgcggtggctcacgcctgtaatcccagcacttc
-gggaggctgcagcaggcagatctcctgaggtcagaagtttgaggccagcctggtcaatat
-ggtgaaaccctgtctctactaaaaatacaaaaattagccaggtgtggtggcacgctcctg
-aatcccagctactctggaggccgaggcaggagaatcgcttgaacctgggagacggaggtt
-gcagtgagtcgaatcatgccactgcactccagcctgggtgatggagcgagactctgtctg
-aaaacaaaaacaaaaacaaaaacaaaacaaaacaaaacaaaacaCCCAAGATTCTGCCAA
-TATCTTCCAAACTGGGTTTTCTGCAGATGGGACGATCCAcagagctgggtttgaggtcca
-actctgcactcctagccgtgcgacctcaggctggtcactgcttttctttgagtgccacct
-ctgaaatggattaggttggccttacagggtggttatgcagagtgagtgagacaGAACAAT
-GCCTCTTGGTCCTTCCCGAGTATCTGCTAGGCACCCACAACGCGCCGGTGCCACCAGGCG
-CTCGGGATGCTCAGCATTTGGCACAGAGGcagcagagcagggaggtgaagagagtgggct
-ctggacccagcctcagtccacatcccggttctgtcctttgatggccgtgtgaggatagtg
-acagcctgtctcactgggtcgtagaggagtaaatgagttacaggccgtggaacagtgcct
-ggcactgaggcggtgctaggtaagtgtttgcttttattTTCGACTTCTGTCCAACCAGCC
-TTCTGTTGCTTTGACAGCTTCATGGGGCTGCTCTGGGCACTCAAAGGAGATATGTTGGGG
-ATTCAGGGGTTGTGTTTAGGGGAGACCCAGGTCCTGCAGGTGCCCCATCATTCATACTGA
-TGCAGGGGTGGCCTGGAAGCTGCAGAACCATTCACACTCGGCAAAGCCTTCTCTCACCTT
-GGAAGCATCATTCCTAATGACGACACAGGTCTCCCAGCCATGCGTTCCCACATAACTTAG
-AAGCACCCATCCCatttttattatttgctcagagcctgctttttcagtaggccgtaaact
-ccatgaggtcaggtactacatctggcttattctctgatcatccctagagccttgtgtggt
-tcatggagaagttcaaaacatgtttgttgaCGGACTTACTGACTGACAAAGTCTGCCAGC
-CTTATGTTGGTCTACAATGTTACACTCTATCCCATGCCTCCTGCTGAGTTTTACCCTCCT
-GCTGTGATGCAGGCTGTGGGAtctggagctagaccccctcagttggaatcctggctgtgc
-cattgcctagctgggtgcccttgggcttggttttctagtctgtgaaatggggatagcaac
-agtacctacctatgtggcttgttgcaagtgaggccatctctgtatgtcactcagagaagt
-gccttggattagtcagTTCCATCAACATCAGGACTAGGCACGCACCTGGTGAGGTCATGT
-GGGGGtggtggttgagagcccagtggggctctgcagctagaacatctgattcaaatccac
-cagccactgtgtcaccttggccaagttctttaacctccttgtgcctccgtttcctcatct
-ataaaatggagcaataataatacatatctaaccagcttttgagcaagctgtatgtatgta
-tgtatttatttatttagagacggggtcttactctattgcccaggctggagtgcagtggtg
-caatctcggctcactgcaacctccaactcctgggttgaagggattttcctgcctcggcct
-cctgagtagctgggattacaggcacgcaccaccatgcccagctaatttttgtatttttag
-cagagatggggtttggccatgttggccaggctggtcttgaactcctggcctcaagtgatc
-tgccctcctccgccttccaaagcactgtgattacaggcatgagccactgccccccgcgaa
-gctgtatttattttatgtaaagtgcatagcctaggcctgacacgtagtaggtcctcaaaa
-gagtcaggcatttttCCAAGCCATTCAGAAAAAAACAACTCCTAGATTTTATCAGCCTTC
-CCTCCCACAAGGCCAGTGTGTCCCAGCTGACAAAGTTGCTGGCCGTGCTGACGtgaggaa
-aagcaagggccagagagggccagacgcctaccctgggtcacacaggagcagtggccaacc
-tagaataggctaggtcttctgtctcgcagcctgtTCATCCTGAGTGCCTCCCTGGTTTCC
-AGGCCCTGCTGGCCTGCCCTCTGACCCTAGCCCCCTGGGAGCTCTATCCCAGGCCCATGG
-GGTCTGCAAATCTGGTCTGGATTAGACACGCTGAGAAGCAAACGCCAGCCCCCCCAGCCG
-GCTGCCCAGTGGGACCTGTGCTCACAGCTGCTGAGGCTCATAGGGACATAAATCATGGTG
-GCAGGAGACTCGGGGGATGGGACCACCTTAGCCTCCTAAGGGGCACAGGGGCCTGAGAGT
-CACGAGCAGAGGCACCTGGGTCTGCTGGGGATATTTTCCATCGTCTGTTGGACAAGCTAA
-AGCCAGGGTGCATCAGAGGGGGCCAGGACACCATTTGGCAGCCCTCGCATCACAGTAGGC
-CAAGATCCCAACTTCTTTTTAACttttcattttgcaatcatttacaacatgcagaaaagt
-gacaaaagtggtgcagagaactcccatataccctgtactcagattcaccacattttaagt
-ttgtcatatttactctatccttttctctcacacatatattatttctcttctgaaccattt
-gagagagcacgttacctacatcatacttctccttaatagtacttcaggatgtattttttt
-ttttttttttgagacggagtctcactctgtcacccaggctggagtgcaatggtgcgatct
-tggctcactgcaacctctgcctcccgggttcgagcagttctcctgcctcagcctcccgag
-tagctgggattacaggcgcctgccaccacagggtttcaccatgttggccaggctggtctc
-gaactcctgacctcaggtgatgcgcccacctcggcctcccaaagtgctgggattacaagc
-tgagccaccacgcccggcctaggatgtaattcttaagcacaaggatatcctctgacacaa
-tcagggtgctgttagcaaatacagaaaatttaactttgatgcaataccttaatctattgt
-tcatatcccaattttgtgtgaccatgtctcaaaaaaaaaaattgtcaactctaccaagaa
-ggtcccctgtcacattttcccctctgcagtacaggatccagttcaaagtcatgtatcgca
-tttacctgttcaggtctATACTTGATATCACAACTACACGAGGTAAAATATACAGTCGTA
-AGAGACACAGATGGGGTTGAACAAAGACATCCAACTTCATATGTACGTCCCATGAACCAA
-TGTTTCTATAAATCCTCTAATTATATGGTGTTCCACAATAATGCATCACGCTCCTGACTG
-TGTGGAGGTAGTTAAGAGTTAACTTGCCAggccaggcacagtggctcacacctgtaatcc
-cagcactttgggaggctgaggctggaggattgcttgagcccaggaatttgagactagcct
-gggcaacatggcgaaaccccctcaaaataaaaaattagctgggcatcatggtgcacacct
-gtagtcccagctactcaggaggctgaggcgctaggactacctgactccaggaggtggagg
-ctgcagtgagccatgatcgtgccacctgcactccagcctgggtgacagggtgtaaccgtg
-tctcaaagaaaaaaaaaaGTTAACTTACCAAATATGCCATAGTCTTCAGCACTCTCTTTT
-TGTAGTGCTTCATTTTTTAACCTAATAAAAGCCTCATAAAATGGGAGTGGCCTGGGACAA
-TGAGGGGAACCTGAAGTGCTGtgggtgcaagaggtcctgtgttctcagccctgctcagct
-ccagatgctgtgcaaccgtggcccatcaccgctcctctctgagcttcaggttGCCATGGG
-TGACCTCTGAGGCCTTCCTGCTCATAACTGTGGAGTCAGAGAAAACAGCCCTgcatggca
-aggagggagatttgtgttcttggtgtcccaacagggccaaggacctgctggggaacccca
-ggcaggttgccctctgtcttgtctcactttcttcattgtgaaatgaTGAACTCTGAGATT
-ATTCTTGTGCTGCTGCTTCATGTGTCAAGACTTGCAGGGAGAGTGTAACCCTTTGGGGTC
-CAAGGTGGCCTGGCTGAGTCGGTCATTCCAACCCCTTCAGTCCTGGATTTCTTCTCCCTG
-AGCAGCTTTACTCCTGTGGCCTCAAGTTGGCCTGGAGAAGCTTGGCTGGGCTGGACCATC
-CCGGAGGCGACAGGCATGCTGGGGGAGCGGACAATGTTACAAAATGTTCCCCAGAGGAGC
-TGCCTATATATGCAGACCACACCTGTGCTTCTCCCCGGTCACGTGTGTGGGCTGACCTTG
-CAGCTCACAAAGGCTCATGGGCATtaactgtccattaccaggaagatagcaagctgcaaa
-atatgcataatggagcactatgcagctatgaaaaggtgtgaaacagctctgtaagcaacc
-aagggtctccaagaagtacagttaagaaaaaaaaatccagtgcagagaggagtgtgtgaa
-atgctaccacttgtgtggaaaaacaatatctatgtaatttgcctatatatgcagaCCATC
-TCTGCCGGAATCCATAGGATCCTGGTTACCTTAACATAGCAATTGCCTCTGGGGACTGGA
-GCTGGTGGCTGGGAGAGAAGGAGACTTATTGTCAGTTTATTCTTTTTTGTGTCTCATTCA
-AAGGAAAGAACCGGTATGTGTAGATGTGcaagaggggctggctcctgggaagctgctaat
-tgcatttcttgatctccatgctgggtgtacaggtgtgctcagcttgtgaaaatccattga
-gctgtacccttacaccctgtgcactttcctgaatgtgtcttatacttccataaaaagtgt
-aaaCTTggccgggcgcagtaactcatgcctgtaatcccagcactttgggaggccaacatg
-ggtgggtcacctgaggtcaggagttcgagaccagccttgccaacatggtgaaaccccgtc
-tttactaaaaatacaaaaattagccaggcgtggtggtgcacgtctgtactcccagctact
-caggaggctgaggcaggagaatcgcttgaacccgggaggtggaggttgcagtgagccaag
-atcacgccactgcactccaacctgggtgacagagtgagatccatcttaaaaaaaaaaaaa
-aaGCGTAAACTTAGCATGGTTTAAATGATTTGTTAAGCGTATGTGTGCTAGTTTAACAAA
-AACGCTGCAGagctgggcgcagtggctcatgcctataatcccagcactttgggaggctga
-ggtggatcgcttgagcccaggagctggagaccagcctgcataacatagtaagaacctgtc
-tctacaaaataaacaaataaataaaattagccaggcctggtggtgtatgcccgtatttcc
-agctactccgcaggctgaggtgggaggatcacttgaggacaggaggttaagcctgcagcg
-agctatgactgtgccactgcactccagcctgggtgacagagtgagaccctatctcaaaca
-aaacaacaaaaaaTACTCGGTGGGATTATCGTCTTCACTGTGGCTGTCTCTGGGATAAGT
-GATATTTCTAGAGTCTTATAGCATTTTGAATTTGTTTTACAATGAAAGCACAGGCAGAGA
-AACCTATAAATATTTTTTCAGAAACAGTTATCAGTATAGAAGCTTTTTTGGAAGGACACT
-CAGGAAGCTGCCTCTGGGGAGGGGCCTGAGGAGGTCTGTACTTTTCACTGCATACCATTT
-GATACAACTTGGATTACTTACCAGTGCATACAGGGTCTATTAAAAACTATCTCACAAAGC
-AAAACAAATACTTATCTTTCTGTTCTAGCTGCTCTTACTAGTTAGAGACTGAGCCAGGga
-ggcccagaggggtcaagcaacatctctggggtcacccagcaaatctggtggcggagtggg
-cctccagccagagcacccaagtgtctgctctgcccccactcccaggcttcctgccattga
-caaggccacagtccttttcCTGTGGCTTTGCCAGAGGCTGGCTGTACCTGGGAGGGTAGG
-CGCAGGGGGAGCAATGTGCTTTCCTAATCAGCTCCCAAAGGGGGAAGCACAGCCACGCTG
-GGACACAGGATAAGCACGACCAGTGTTCCTGAAACAGCGGGGAAGTGAGGTAGAGGGTGC
-TTGGAAAGCTCTCCTGGGTGGGGGACCCCGGCCCCCTGGGGCCCTCCTTCCTCTACTTCT
-TACACCAAAGGAATTAAGCATGGTAATTTCATGGCCTGCTCCAGCCTAGGGACTGGCAAT
-TCCAcaactcccttgatctccctgggcctcggttttcatctgtgaggaagaccaggttgg
-tcgggctcattcctgtggcatctggcacagtgcctgccacacagagggtattgacaatct
-gtttgtcaaTTTGCAAAATCGGAGCCACAATTCAGGCTCAGATGGTCAAACGCAGGGGAG
-TGGGGTAGAGGCAGAACAGAGGGGATACGAACGTGGACTCTGGGGCCAGAGTGCAGTCAG
-TAAACATGAAATAgatcacttgagctcaggagtttgagaccagcctgggcaacatagtga
-gaccctgtctctaaaaaaataaaaataaaaGTGTTTGTTAAATAAATAAACTGTTGAAAT
-AGGCATATGAATGTACCTTGCTGAGGAGAGGGTGGCTGCCTGGCTGCCCTGGCCTTTCCC
-TGGCTCTCCCACCCTCGGGCCTCTCGAGCTTCTCTGATCCTGACCTCACAGGGACACAGC
-CCCAGCCCGAGAGCCAAGAACTCCTAGCTGCACTGATCAGCTGACGCATCGCTGTCTCTG
-CTGGGTCTGCAGTGGGGAAGACACCAGCTCTCACCTCCCAGGGCTCCTGGGAGTGTAATT
-GGGGTAACAGGTGCTGGCTTTCCACTTGGGGCATCTCCAGGGCAAGGAAGGAGCTGCTCT
-GGGCTTCAAAGGTGGACGGACCTCAGGGTGTCACCCTGCCACGTGCCTCTGGGTGTCATC
-GGTCTTCTAAAGCATTTCAGCTAACACAGGGGTAAGAATATTCCCCTTTAGCATGCACTC
-ATTTGCACTTGTGGAAAACCACATGGCTTGTTGGTGATCGcatcaaagagggatgggtta
-aaggatggcatgttcacaaaatggaataataagcagctcaggaagaaatgaaataccctt
-taggtactgacttgggatgataccaagctagattaaggaaaaaaagaaggagccaaaagt
-gtgtacgatgtgctgtcatttgtgtaTTTGCCTGATCATTCATAGTGAATGGGACATCAC
-AGGAAACTGGTGCCCTAGGCTGCTTGCAGAGAGGAGAGCTGGTGGCTGGAGGACAGGGGC
-ACGGAGACTTTTCAACACATACCCTCTGGTACCTTCTGAGTTTTGAACCATGTGAATGAA
-ATGAACACAGGCCTTATTCAAAAATAAGTAAAATTAAGATTTCTTTACCAACCATATCAG
-ACACCTAACAGTTGTTAAGAACATCTGATAAACAGCAGACTGAGGAAAGTTTGGTTATGG
-CGCCCGGAGAGGGGGCTCTGCCTGCCTTCCCCCGCCCCACCCCCACCCTTCCAGGGCTCA
-GGGCAGCCCCCAGAACATCTGTGCCTCTCTCTAGGTCCAGGGGAGGGCCCACCTCTGACC
-TCCGATGTCCACGGGACTCTCCTCAGCTCAGAACGACGTCTTTTATTTAAAAATAGCTTT
-TATTTTAAACTCACCAATTCTCTCTcacacacactcacactcacgcacagatacacacac
-acCCTGTCACCAACAGTCTTTGTTTTTCCAAAAGTTCTGCCTTGTCTCTGACCAGCCAGA
-GCTGGGCAGGCTGAATGGATCCTCACAGCTCTCCAGGATCGGGTGGAGATGTCCCGAGGG
-CCCTGCCCAGAGTGTCCCGGAACAGGCCATGGTCCCCCGGTCCCTACACAAAGAAGGGGT
-GGGCTTGGCTCCTGGGGTCTTCTTCCCTGTCCAGCCAGTGGCTGGCTCCTGGCCTCCTTC
-TCCAGGGTCCAGGCTCATCTCCGTGGCCCTCGAAGGGGGGCCACCCCCCTCACCTTCAAG
-CAGCTGCCCCCCAGGTCACGACGGCCACCCTGCAGAGGGGGAGAAAGAGTATAAAGAGGT
-TCGATTAGGCCAGTGTGaacactggaactaacctctgtatccctcaagagggatcctgat
-caataaatcacagttcagccacacgatcaagttctctgcaacagaaagcagaagaaaccc
-tttctggactgatacagactgctgccaaatgacaatgtttagggacaaaagcaaggggca
-gGCTGAATGCGCCTGTGTGCTGTGATTGCTGGGGAGAAGCACACACGGGAAATTGTGAGT
-GGGTTTCTTCAGAGAGGAATTTGATGATGGAGAGAGGATGGGAGGGAGGCTCTCTCATGC
-TATACTGttttttgagatggagtcttgctctgttgccaggctggaatgcagtggcacaat
-ctcagctcactgcaacctctgcctcccgggttcaagtgattctcctgcctcatcctcccg
-agtagcggggactacaggggcccaccgccacacccggctaatttttgtattCACGCTATA
-CTTTTTTACCTTTTCTACTTCTTTCCCATATGATCTGTTGCTTAAAAAAAATCCAATATA
-TTTTAAAGCATAATATTTTACACGGGCAAAACAAGCACACCCCACAGTGGTCCTCCCCCT
-GCCTGACTGCATGCCTAGCGGCTCACTCGTCCACCTTTAAAAGGGGACTCGGTTTCTGGC
-CTCCTTGACTTCCCTCAGGGCGTCCCCTTTCCCAGGAATGTGCTCTCAGGTCTTGTCTCC
-CTGGAAAGGTTTCTCTGTTCCTGAAATTGCCTAGCACTTCCTGCCTTTCTGGGGACATTC
-CATGGGGATGAATCTCAGAAGGACAAGGCAGGGTCTCTCCTTTGTCTCCCCATCTGGACT
-GGGATCTCAGGGAGTGGTAGGGAAAAGGAGTTCTTCACTCTGTGGTCCCATTTCCAGCCT
-GGGCTCTCTTGGCCCAGGACCTGACTTGGAGCAGGCACCAATCAAGGCCGCCTGAATTAA
-GTGGCAGCCATTGGAAGATGGGCTAATGGCGGCAGTCCCTGAAACCATCAGTCCTTACAG
-GGGCTGTCTCTACCAGCTCTTCTCATTGATATTTTCAGACTGGACACATGGGtttcatcc
-tcaccgtaagccagagaggtcacagatgttaaagcaccccctcttttgaggcctccagcc
-actgaatgactggcccagaggcacccagccagttgtaaaagagctgggctagaaatctat
-gttgtccaacaatctgtcctgtttccaGGACATGATAGTGTCTGAAATCCCACTGTAAAT
-GCTCATCACCCTGAGCCTGGCTAGATGATGGAGGAACAGGCAGCTTTCTCAGCCCACTTA
-GAGAAACAGCTGACCATCTGGGAGCTCTGTCCCCTGCCCCCTCCACCCCCAGGTCCAGGT
-TGGGGCAGATCCATCCAGATGCGAGCCCAGCCTCCCTCGAGGCTCTTGCAGCCCAGGGAC
-AGCATGTTCACTCACAGGCAGGGCTATTTTGAGGGCTGAGGCCACAGTCCCAGCAGAGCC
-TGGGGCTTGGGCTTCTCAGACAAACTCTGGCAGGAGTGGCTGAGAAGGGCAGATAGGGGA
-GGGGGTGCAATATTAAGGTTGAATTAGAAAACTGGCCTTCCTCTCTTTTACTCTGTAAGT
-GCTCAGGGACAGGGAGAGCCGCCCCCTCCCACCCCAAGTCTGGAGGTCAGCTGGAGACCT
-AGGGTCCCAGAAGAATGCTGGGACTGttcacctccctgaacctcagtttcttcatctatg
-aaatggggacaaaatgattttacttgccatctcaaggtGCAGTCGAATGTGAATGCAGCT
-GTGTAAGCTGCTAAGTGTACTTAGAAGAGGTCTTGACggccgggtatggtggcttatgcc
-tgtaatcccagcacttttgggaggccgaggcaggcggatcacctgaggccaggagttcga
-gaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaaattagccag
-gtgtggtggctggcacctgtaatcccagctacttgggaggctggggcaggagaactgctt
-gaacccgggaggcggaggctgcagtgagttgagatcgtgccactgtactccagcctgggc
-gacagagcgagactccatcgcaaaaaaaaaaaaaaaaaaGTCCTGACAAGACCCCAGTTT
-GTTTGTCCCTTAGGAACTCAGCACCAAGGGTCTTCGGGAagcaccatggttaggagttag
-gctcaagtgagacagacctaggcttcgatccctactttgccaagggccaactactggacc
-tcaggcaagtgatttcatctcactgagcctcagtttcccccccgtaaaggggaattactt
-tacaggatcacacaagctaatctaggtaaagccttggcacagtgttgggaacaaagtaaa
-tgttcaataaatgttcataagtattattatCAGCATCATCTATGGACAGTGCCTCCTGGT
-CCCAGCTACCCTCTGGGTATACCAACAGGGGAGAGCCTTACAAGATGATCCTGTCCAATC
-CTCACCCCCAGGTGACAAAGGGAAAACAGGGCAGAGACAAGAACCCCCTTTCCACCTCCC
-ACGTGCTAATTCTACCACAGAGGGCCACACCTAACCCCTCCTTCAACAGAAAGATGCTAC
-AGGAAACTGTTTCCACGGCAACCCCAACTCCAGACTGGCCAGGATGGGAGGGAGGTGGTG
-GCTCAGGGTAAAGGAACGGGGTCTTGGGTCTTAAAGCTCTTCTGGCCCACAAAGCTCAGA
-AGGGAGCAAGAGCTCCCCAAGCCAGCCAGTTTTCTTCCAGCAGAGTCTTCAAGGGGCCAT
-AGCTGGCCAGGATTGCCCCTCTCGCCTATTCCCAGAGGAGACCGTGGGGTTGAGAGCATG
-GTTTCTACAGCCAAATTTGGCTGAGTTCTTGGTCCCATAGACAGATCCCAGGGAAGCGGC
-CAGGCCCAGGGGAGGCCCCTGTGAGCTGTGGGACAGGCCTGAGACCTGCAGAGAAGTCCC
-CCAGCCTGCTTGCTATGGGGGTGGACACATGACAGTTACAGGGACTTCCCTCTGTAACCT
-ATCCCACGTCCCaaccaggcaggcctgagtttgaatcctggttccatcactgactgtgtg
-tctctgcgccactggcagcacctctaagcaagtggggataaccacagcgcctcattcctg
-gctgttgcaggattttaatgataaatcataaagagcgcttagcacagATCAGTGCTCATG
-AAGGCTGCTGTCACTGCTGTTATTGGCCATTGTGCTCCCCCTCTGCACTCCTGCCACTTT
-TAACCTCTTCCCTCTTCCTTCTCTAGGCCTGAGCTCTTGCTGTATGCCCCAATCCTAGAA
-CACCCTTTCCTACCCCTTCATCGGCCTGCCCCTGTTCTAAAGCATCCTTCAGAAATGAGA
-CACAGAAACCCTGTCAGCACTCACCCTGGGTTGGAGGCTTTCTCTGGGCTCTGAGAATCC
-CTTTGTGCTTCCCCTCCCCCACCATCAGACCACAGCATCCTCATCTTCATCTCCCTGCCC
-TGACCCTGGGGCTGTACTGTCAGGTCCTGACTGGTGGAAGGGTGGGGACCTACAACCTGC
-TTCTCTGGGGTTCTCAGAGCCAACAGAAGGCAGCTGTTGGGTAGCTAAGGGTTGCTAACT
-GGAATGAATGGGTGAAAGGCAGTCAGGGAGTATCCCTGAGAGCCCCTTCAGGCCCTCCCA
-TCCCAGGAAGCCTTAAAGGCCCACTCCTGGCTTCTCAGCCCAGCCTGGGGCACTGACAGG
-GGCCCACAGCTGGGAGCAGCAGGGACCCTGGAGAGGGCACAAGCCTGAGGCTAAGAAGAC
-CGACGATTCAGGGCAACTGAGGCAGCCAAGTGTTGAGCAACCAGGCTGGATATCTGATGA
-GCCAGACAGAGGGTGGTCTCAGGCCAAGATGCAGAGGCCTCCGCAGAACAGGGTGGAGCA
-AGGGACCAACGGCAGCTGTGAGAACCAAACAGCAGGGAGTCAGGGGCCTAACTCCAATTC
-CCCATGCCCTTCCACTTGGCCACCAAAAGTCAGTACTCTCTCAGCCTCAGTTTCCCCGGA
-TGTAAATGGTAGCTGCTGGAATACAAGTTGTTAGACAGGCTTCTTTACTGTAGGAAAAGC
-CCAGGCCAGAAAGGCACACGGTCGGGGGATGAAGCAGGTTCCTTGGAGCCTGGGCAAGGT
-TTCAGCCAAGAGGCCACCTCTGCTGCCACACAGCCCCCGCCCACCCCTACCAGCCTGATC
-CACTTTCTTGCCCAGGACACATTGCAGGAGCTGCACACCAGCTCCCTCCAGCTGACCCAA
-GAGTGCCCTCTCCCAACACCACGTCCTTTTGGGGGCTGGGGACTCTCAGAGGGCCCCTTC
-TTCACTCCTACTGCTCATCCGCTGGGTACCTCAGGCTCTCGGTTGGCGGTTTGTGGCCTC
-CTTTCTTCTCAGTCTCCTGCTCTTGGGTTAGATCTTAGGACAGGGGACAATTATTTCAAG
-GTGGGGGCAACACACACCGGGCAAGCCCAGGGCCAGCGCCCCGGcttcccagctgagtaa
-atgtgggcaggtgatcccatctctgatgctcagatcctcatcaggataaaatgggcagaa
-aaactacctgcctgaagggattcttgtgaaggcaaaaaagtggatgtggagcgcatcggc
-acagaggaagactccataaaagatgggtctttgttACTCAGTCCTCATGCCGTCTTCCCA
-GCAGGAAGGAAGTTCCAGCACACCTTTCGTTGGAGGGGATATCCCACACTGAGCAGTTAA
-ATCAGACCCGAACTCTGGGTTTTCCCGCATCCTTCTGTTTGGGGGCCTGGGCATTAAGTC
-AGTGGTTCTGGGCTTGGGGTGCCGCACCCAGCACGAATTCCACGTCGCTTCCCCCTGGCC
-TCGTTGGGGACCCCTGCACCTCTCCGGTTCCCGCAGAGGCGCTGCCCCCCGCCTACCCCG
-ACCTGGCGGCCGCAGCGAGGGACGCAGCACACTCACCCCCTTGCGCTGGTTGCTGAGGCA
-GAAGGTGCAGATGGAgcgcggctggcggccgccgtcggcggcggcggggacggcgcccTT
-GGCACTGCCCGCGGCACGGAAGCACGGCTGCCCGTCGTCGGCCGAGTCGCCCAGCAGCAG
-CACGTTGGCCAGGTGCGCGATGTAGCTGGACGCCAGGCGCACGGTCTCGATCTTGGACAG
-CTTGCGGTCCACCGGCTCGGTGGGGATGAGCGTGCGCAGCGCCGTGAAGGCCGTGTTCAC
-GCTCTGAGTGCGGTCCCGCTCCCGCGCGTTGgccgcctgccgctgtcgcaccaccaccac
-ggggcccgcgccgccgccgccgcccgcccgccgcccgcccccggggcccgggccgcgccg
-cgccgcctccgggccctcgcagcagccgAACGACTGGTCCGACGCGTCGCTCTCGCTGCG
-GTTCTCCTCGTCCTCGCTCAGCAGCCGCACGTCCGGGTACAGCACGTGCGCGCCGACGGG
-CCGCAGCAGCGCGAACGCCATGGGCGCCGGCCGCGTCCCTCCGTGCGCCGCGTCCCAGCG
-TcggccgcgccccgccgtgcgctcccgcgcgctcccacggccccgccggcccccgccTTA
-TAGGCGAGGGAGGGGCCAATGGCAAggccgccccggccgggggcggagggctccgcccgg
-ccAATGGGGAGGCGTCCGCCCGGCCAATGGGGAGGCGTCCGCCGCGCCCTGGCCAATGGC
-GACGCTCCCACCGCCTCCGTCCCCCAGGTTGAAAGCGGCCCGGGAGCCGGCGGCCCACCC
-CGAAGGCCCCCGTTCCCGGCTGGCTAGCCCGGCAGATGCTGGAGGTCTGGGAGGGTCGGC
-CGGggtgggcccagatccgaactttttgtctccagcctggaccacctgggagacgcgggc
-agatccctttctcctctctgggcctcagtttcctcgttcggaaCGTTCAGATTGCAGAGA
-AACAGCTAGTGTCTGCCTGCCCTCCAATTCTAATCCTgtagttctgcagctttcacgtgc
-gtaagaactggggaaggggcttttgctattacagagtcccaaattgctcccattctgatt
-gagcagttctggaacgggcccaggaacctacattttgtaacaagccattggtgatagtgg
-tggtgtccgtggagaacacttggagaaAAGCTATAATCTTTCCAAATGAGGATTCGACAG
-TGTCTTGTCCCTGAAGACAAACTTAAAAAGAAGAAGAAAAAAAAAAGCAAAACAAAACCA
-CAATACACAAACACCAGTAGTTCGttcgttttttcaacaaatattcgttgggtccctact
-atgtgtcagacatggttttaggtctgaggatacagccattaacaaaataaattcttcacc
-ctcacggaactgacgttttggttaaggaACTACTGTGTACCAGACTCGGTGCTATATACT
-CTATTGCGCCCAGCTGAGGCTGCAGGATGGCAGCCCTGAGTTACAGGTCAGAGAGCTCCG
-GCCTTCAGTCGTACAGGTGGGAGTGGCGGCGCTAGCTCCAGCCTGTCCGGTTTCACTACC
-TCTTGGAATCCTACCACCACCATCCCATCACACACACACGGGCTATCTTTCCTCAATGCC
-TGCTTGCCTTCTAGAAACCTTAGATTGTTCAGCCTGACGTGTCCTCTTCAGAGAATTGCT
-GAGCCAAAGGTGGTTGCCGGGGTCTCGATCTCACTCGTGCCTGCTGCTCAGCTCTCTCCA
-GGCACTAGCTAAACCAGCATCCACTTGGCCTTGAAAATAAGCCCGAGTGGCAGCCGGTGT
-AGCAGACAGAGCGCAGGGAGTGGAGTTGAAAGGCTTCTAGGTGCATTTTGGCTCCTCTGG
-GCGTCTGTTTTCCTGACGATGCCTGCAGCTCTGCCATGCTGTGCTTTCCTGGCTTCCCTG
-ATCCAGGCCAGAATTAGGGGAAGAAGAGGGAGCGAGGGATTTCCCATGACTGCCGGGGGA
-GGAGCCCCTTAGGACCCAGGGTCTGCGGGAGAGTCTGTTCCCACACCTGGATCCCCCCAC
-CGCCAGCATTTGACCGTGACCCCAGCCAGGCTGGGCTTTGGGGAGGAGGGAAACAGCCAG
-CATGGGCCCCCTCCCCGCAGGGCTGGTCCCACACACAGCCCCAGACCAGGCTGCTGCTTC
-CTGAGCCGATGAATTATTACCGGGAGATTTCCTTCCCTGTCTGCGCCTCCTCACAGGGGC
-TCCCAGCTCACTTCACTTTCGCTTTCTCCCCCTTCTCCCCCTCCTCTCTGCTTCTGACCC
-TCAGGCAGCTTGAAATTCCTCTGTCCAGCCCCCTCCCAATTCCACCTCCAACTGGAGATG
-CCAACCAAGGCGTGAACTGGGCCCGGAAGGCGAAGAGGGGCTTGCCTTGTAGGCTCATTC
-ATTTATTTGCTCCTTAGGCATATTTTGACACTTGGGACCCTGGGAGTAGAAGAAAACCAT
-GAATGAGACTGAGACAGGCCTTCTGCAGCCGAGAGGGGAAGGCGAGCTGTAAACAAAGGA
-TTTCAAGACAATGTGGTAGGAGCAAGCCAGGGTCTGGTATCAGAGAGACCCAGTTCCGGT
-TCCAAGGTTAGCTGcttcccagagtctcagttgcctgctctgaaaatgagataataatag
-tacccattcccagggctggtgatggttccatgagtttgtgccagtagagctgggcttggc
-acacaggagtgctcagtaCCTGAGAGGAGTTTGTGCTACTGTTTTTAGGGGCTGGCCCCA
-GCCAACTGCCTGGGAAAGGGCTGAGCAGCATTGACTTTTCTAGGTCTTGTCCCTGGGAGT
-GCGGAGGGGACTCCTACCACATTCTCAGCTCACCTACACAGGGgacctcagcttccccca
-ttctctgtccctcactctgctccagccacactggcctccccactaaatctggagcccact
-tcttcctggcccccctggcccctgatagtctcatagtttgttcactcatttccttcaaat
-cttcactcaaatcttatctcagggaggcccttcctgaccaccagcactaacagtaatggc
-ttctccaacctgccagcacccccagctctccctttccccttatcctgctttatttctttt
-tatagcatttgtcactgactttcattcattcacttattcattctacaaatattaactgag
-cacctgctatgtgctaggcacagttctgggtactgcggatacagcagtagaGacattaca
-tatttatttgtctaccacctgtctccctccactagagtataagctccatggggcaggtac
-tttgtgtattttgctcatctcacttccttcccaacacaaccttctgaggtaggtattgtc
-attattcccattttacagatgaagatacggaggttcaaagaggggaaagtgacttgcccg
-aggtcacacggtgggccaatgtgggagctgagattggtctgactccaaagccattgctcc
-ttccctaaccacatggcttctGAGGCAGCCTAGAGGCCTGTGAGGGCTGAGTAGGAGTCT
-GCCAGGTAAGAGGAGACAGGTGTCACAGGCTGAGAGGGTAGAGGCTGGTCCCTGCCTCCC
-TGACCATGGGCACCCTTCACTTCTACAAAAAGCATTTGTTTCTCAGAGGCACCTGCTGTG
-CACAACTCTGAGCCTGTGCTCCAGCTGTCCTTCCTGCTTGGAATGCTGCCCCTTTGGGTC
-TGACCAGACATCCCTAGTCCTCTGCCAGTGTTCAGAGTAGCAGATGGTGAAGGCCTCTTT
-GCCACTTTTTGCCAACCTTGCTGCAAAGTCTTGTTGTGTTCATCACACCATATTTTGACT
-TTTCTCCCTTCATCCCTGATTCTCACTTCCATTTCCCTCCCCTAACAGGGCACCCACTCC
-CATATCTTTGACGCATGCCTTTGGATATATGTGTGTCTTTATAAAATGTGCATGGCGTTG
-ATTTGTGTGTGGAGGTTTTTAATGTATATAAATAGTGGTTTCAATAGATCTGTGTCATAG
-GCTATTTTGTTTCCTCGACACTGCTCTGTGtgctgagtccagctcaagtcccttggttcc
-cactgctgctaagcatgcacggtgtgcgtgtgccaccatgcctccttttcccaccgcttt
-agtgatggatgctggctacctccagttcccacctccccaagcaaagctgtgatggacttg
-cagtgtgtgactctcatggactcccgtgtgtatttctctgggatgtacactcgggggcag
-gatccctggggtggagagaatacatacagttactgcactctatgacggctgcctcagtct
-acatgcccagcagcagggcatgagggaccactttctccacatgcaccctagcacttggaa
-ttatctgACTTCCCAATGATGGAGATATGGGTTGTTTTCCATCTCCTTGTGCTTGCCTCC
-ATCACGGTGTGGGCAATAATGAATACTTGTTgcactttgggtggccgaggcgggtggatc
-attgaggtcaggagtctgagaccatcctggccaacatggagaaaccccgtctctagtgaa
-aatacaaaaattagccaggcgtggtggtgtacctgtaatcccagctactcaggaggctga
-gtcaggagaatcgcttgaacctgggaggcagaggttgcagtgagccgagatcgcgccact
-gcactccagcctgggtgacagagcaagactccAtctctctctctctctctctctctctat
-atatatatatatatatatacatatatatatgtatatatatgtatatatatgtgtatatat
-gtgtatatatatgtatatatgtgtatatatatatgtatatatatatataATGAATACTTG
-TTGAACAAATGAATGAAAAGGCTAATACACAGCCTCCCACACCTACCTTGTACCAAACCT
-CAGTCTAGAAGGTGGCGGTATATGTGTGTATGTTTGTGTGTAGAGAGGGGAATATAAGAC
-AAAGTCTTATGCCTCAACCTGCTTAGAGAAAAAGACTaatgacagttagcatttattgag
-ggcttactttgtgtcaagaattCATAGGTGTATATTCACAACCTTAACTTCAGTGAGACA
-AGTAAAATGCATTTCTCTCTCATTCAAGGCCTTTGGAGGTAGGGCTGCTCTGGCATTCCA
-CAGtgtggtcgccagcttccaagattgccagcaatgatccttgcctcctagtattcatct
-gcgtgtgtagaaccctcccccattgaatcagatttgactcatgtgaccaaaagaatatga
-cagaagtgacggtatgtgacttctgaatgtagctcataaaggcattgagctcctgccttg
-ttctcttgagtcatttactctggggacagcagccaccatgccatgaggacactcaagccg
-tctgtggagagagaccaaggtccctagcctacagccatcaccaatttgccagccaagtga
-gtgagcctccttggatgtggatcctgaattcctgacctgcaggacctgtgaaaaagaaga
-aagataatacagaaagacaaagaaaaaagataataaataattattggctgggcgcagtgg
-ctcacacctgtaatcccaggacttcacaaggctgaggccaaaggatcgtttgaggccagg
-agtttgagaccagcctgggtaacatagtgagaccctgtctctaaaagaaaaaaaaggaaa
-agaaatttgctggatgctctggtgcatgcctgtgttcccagctactctggaggctgaggc
-aggagggtcgcttgagcccaggagtttgaggctgcagtgagccatgatcacaccactgca
-ctccagcctgggcaacagagcaagaccttgtctctaaaaacacaaaaattatcaatgttg
-taatcccgtaagtttagggtgttttgttatgcaacattagataactaaaacaGATGGTgc
-cggggacccaggctctgtctatctttttactgcaccatacatagctttcacttcctagtt
-ctcttacagagccacatggccacaggagccattctatctgcattccaactggcaaaaagg
-agaaagaggcagaaggaagagcatgctttaatctgtagaacaccaacctcactccgttca
-catcccgttggcaagatcttgtcatttgaccatacttaactgaaaaggaggctgagtata
-tagtcttttgcaggtaggtgtccgtgtgtgcagctgaacactgggtttctgttagtgagg
-aagaagggaagaatggctattgaaaacaactaacCATAGGTGTTATATACCATAGGTGTT
-AACTCTGGAGATAATAATGTCACAtggttaagtttgcacatttgggagcctgactgcctg
-gtttcagttctcagttaggccacttaccagatgtgtgatcttgggaaatttaccaaactt
-ttctgggcctcagtttcctcatctgtaaacagggctcacagtaaagcctgcctcataggg
-ttgttatgaggattaaatgagtcaatgtatgtagcgtttataacagtcctggcacatggt
-atgtgctGTGTGTTAGCTGTTTTCATTATATAATCCTTACAAGGGttttttttttttttt
-gacagagtttcacaattattgcccaggctggagtgcaatggtgcgatcgcagctcactgc
-aacctctgcctcccaggaggattctcctgcctcagcttcccatgtagctgggattacagg
-catgcaccagcatgcctggctgattttgtatttttagtagagactgggtttcaccacatt
-ggtcaggctggtcttgaactcctgacctcaagtgatccaccctctttggcctcgtaaagt
-gctgggattacaggcatgagccaccgcgcctggccACAAGGGGTTTTCTTAAGTTCTCAC
-AACCAGCAAGTGATGGAAGCAGAATTTGGCCCAAAAGCATTTTTTTCCACTTGCGTCATC
-CCATAGAAATTCGTAGAGTGCAAGATCAAGAcccagatcagtacaccgcacataatacgc
-atccagaaatatctgtcgaatgagtgagtTAAATAAACACGTAAACTGTCCTTACATAGA
-GATGCTAGGTTTTGTTTGGTTTTGTTTTATGTTCAGTTAATGAGAATGCTCCATTGACCC
-CATCTGGTTCCTCTAGTATGGGGCTGATGCCCTTGATACCATGCTAGAACTCAGTCCCTC
-CAGGGTCCCTCCAAGCCATCATTTTTAAGGGTGAATTCCTGGGAACACTTGTTCTTGCGG
-ATGCTCAGGATTCCATGATTTTTTttaaaaaaagtcagagaagctgcattttatatcccc
-ctcctagcgacctgcaacaacattagcatgttaaagagtcggagaaatcctgcaacaaaa
-aagcttgttgggcttcatttcaatctgcattttgttttcttatttttttgagacgaggtc
-ttactctgttgcccaggctggagtatagtgatgcaatcatggttcactgcagcctcgacc
-tcccaggctcaagcaatcctcccacctcagcctcccaaataactaggactacaggcatgt
-gacaaacccagttaatttttaatttttttgtagagatttaatttttttttttgtaggcaa
-ctatgttgcctaagctagtctctaattcctggactcaagcaatccttctgccttggcctc
-ccaaagtgctgagattacaaacatgagctaccgtgcctggtctcaatctgcattttctga
-gcttatttTAGGCTTACTTGATTAAAGACTCACTTCCTGCCCCCAACACCAGACACCTAA
-TAGAGAATACAGTTTAGCAGACATTTCTCCGGGCTGTTGCCACTGACATCTACCTCAGTG
-TGAGTGGGTATCCATTCTTTCTAGACAGCATGTTTGATAGGAGTGAAGTGGAAGTGAGCA
-GGTGGGTGCTGGTTACCAGGAAGAGACAGGGTAAGAGAGGGAACATACAGGCATATGTCC
-GAGCCCCACTTTCTAAGGGACATAAAAATATCATTGAAAATATAATAGGTGGAGAAAAGT
-GTATTTCGTGGTACTTCTTTCAGGGAAAATGCAATGTAAATTGAaataataatattattg
-aggggtaacaatatgccaggcactctgctaggaacttatttaatcctcacagcagtctca
-tgagctaagtactattaatattcccgttctataggtgagtagactaaagagcagaaaggt
-taagtaatttgcttaaggtcacatagctagggagtggacaggaattcTTTGATAAGTTGC
-TTGTGGTGAGGATAACAAGGGAAGACCCTCCCCCGGGGTAGTTTAAGCTCAGATGCTCAC
-AAAACTCTGCTCCAGGGAGAGTGAGCCTACTTGGTTGAAGAGCACTGATTTTGTTGAGTA
-GAGGATGCAAGTTTGGGCCAGAGTGGAATTGTTCAAGAATAGAGAGGAGGTTGGTGCTGC
-CATGGGTGCCCTCCTTCAGCTCCATCGCTTTAAGGAAAGGATGAGCTCATGTTTAAAGAC
-TTTTAAGTTGAAGGCAGTGCTAAATAATTTAGTGTGGTCAGGTACCCACCTGACTCAGGT
-TGACCCTGACACCAGTGCCAGGTGTGGCAGAATCACCAAAATGGTGTGGAAGATCAAGAT
-AATGCTAAAtgaaactaccatttaagtctgctttgaaaactcaaggagtttggagctcag
-agttgccaagaacaagttggaatggcctgaggctgccatgctatgaggaagcccaggcca
-catggagaggccacatgcttttgactggtcgttctggtctttcaattctcccagctccag
-gaacagacacatgagtgaagaggctttcatacaattccagccccagttatcgagtctttg
-ccattgaagcctcagacatcatggacagtgacaagtcttcactgctctacccattctgaa
-tcctgaactacagaatccgtgagcataaggaaatgcttaagacaccaaattgtggggtaa
-tttgTCACACAGCAACACTAATTGTGACTGTAGCTCACTAAAATGCCTCCCAAATATTAT
-CTTCACAACTAAAAGCACCAAAAAACCTGAAAGTAcagttgaatttcatgatttgctata
-attatattctagaaagtcactgcaaacactgaattagcaaatactgaaccactgctccta
-ggagaaatacaggcttaggttcctgtgaaccattctgttcccaacatgttcatcaactca
-tcaatacttaagcttgttttatgcatgtttctgttgaaagacaccatgtttaatacatat
-tgttgattcactcacattgcactcatggccaacagcactgtaactcacgcctgaatgaag
-cttatctaactcacatgatcttctctgtaaggcacatcaaagccttctggtgcttaggaa
-cattagacagcacctcagcaccatgcccggggccattgtcaacagtacaatcaccagcgg
-aagacacaaaaatttgtaaaatgtggcactgaatagactgaaaaggacagttgtttacag
-tgtgagagctgaaagaagaaggcagcgtgtcactttgtatgatctcacctggaaacatgc
-atcaagtgactcaaaaaaaattttttttttcgagacagggtctcactctgttgccaggct
-ggagtgcagtggtgggatctctgctcactgcaacctccgcctcccgggttcaagcagttc
-tcctgcctcagcctcccaagtagctgggactacaggcacacgccaccacacctggctgat
-ttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcaatcgctt
-gaccttgttatctgcccacctcggcctcccaaagtgctaggattacaggcgtgagccact
-gcgcccaactggcaactcaaatttttcatgactcctcaagtatccatcaatgaccatgag
-agctccagcgagtgttgattttgaggttacaaatttagtgagtagatgaatccacgactc
-cacaatcagtgactaataagaattgactgCATTATTTAATAAGTTCAGGGCTTGCCGTCG
-TGATTCACAATTGGAGAAAGCGAGGCATGGAGCAAGTCCAGGGGTGTTCCAAAAGGCCTC
-ACTTTTCTCCTTTGCAAACTGTGGCTGATGAGGGCCATCCTGCGGGGTTTGTGGAGAGAA
-GGGATAGTAACAACAGCTGCATTGTATGGTGCTAtgtgctgcacactttgcacacctgat
-catttaatactcacaatgatccctagcagatggatcctattaccaagttcattttacaga
-tgaggaagcttagacccagcaaggttaaggggctgtgctcaaggtcttaccttctaggag
-aggcagagctggatctgaagccatttctgttctcagcccctgctGTGTGCTTTCCTACCA
-TCCTCTCCAGACTCGCCCTGAGCCCAAGTTGCtgaggcatgtggcacggtgcctggcaca
-cagtaggctcacagtagtggctgctttGATGATGACCATAAACTGGGATCTGGGGTCCTT
-GAGATGATTCTACCAAGGGGACCCGGGGGAAGCTGAGCCCTGGGGCAAAGTGGGGGCCAG
-CACAGGAGCTGCTGGGGAAGGAACAGAGCCTGTGCGGTGGGAAGATAGGACATGGAGCAA
-AGAGGATCTTGAATCAGACCCCGTGGTCCCCTCCTACAGAGGGTTAAAGCAAGCCAGCCT
-CCTTCCGGCTGAGCGGAAATCAGATTTTGAGAGCTGAGCAGGGCTCTGGAGGGATGTTTT
-TCTTCTCCATTTGTCTGCTTGTGGCTGGCCCATAAAATCCACCGGAACTCCATGCTGGAC
-TGAGGAATTCCTGCTGAACAGGGACATGGAGAACGCAGGCTGGGAGGGGGCATAGTGTGG
-ATCCTTATCAGAGCAGAGACCACCCCATCTTCAAGGCCCCACCTCCAGGTTGGGTGATCC
-CCTCTGGAGGCCTCATAGGATTCCTGGGTAAGGGGAGGGACCAGGATCGACAGGGTGGGG
-GAAAGTCCAAGGAACAAGTGATACCCCCTCCCACCTTTTCAAAGTGAACTTGTGGGGTGA
-GGAATGAGAGGAGACAGGGAGGGTCAGGCTGTGGCAGGTCAGTGAAGTGtgatgcaggtt
-ccaccttctacgctgtgtgacattgggcaagtctctgcccgtttcctcatcattgcaacc
-agggggctggagctagatgaccaccatgtgtaattttctaatcagagctgacagtctgag
-gctctTTCTGTCTAGTTTGCACCTTGCATGCATGTCCTCCCCTGAAGGCAGTGCAattat
-tataacccctattttaaaggtaaataaaccaaggctcactgaggcaaggtgacctgagca
-attttgcccttgaagggctgggacaggatgcaaacctagacaattggtgccagaattcat
-ctctcaagcattcgctctcctgCCTCCCAACACGAGTTTCTACttctctttgccctggga
-tgacctctcctttgtctcttggcttgatgacctcatttttaaagattcggctcatgcatc
-acctcccccaagaagcctgtcctgactaactaagctcggttggggctcctctctgtctgc
-tcatgcctctgggaagtagctgtctcttttggtcactgggctgtgagccctggatgagca
-gagccacttctcattccttcctgtgcctcctgcatcAGCCAACATAAAAAGCTTTCAATT
-TTCCTTGAAGATTCTAAGTGCTTGTGGTGGTTTTAGAACATGGCTGCCTTAAGAAGTGGG
-GTCCATTggtagctcatgcctgtaatcccagcactttgggaggctgaggcaggaggattg
-cttgagcccaggaagctgaggccagcctgggcaacacagcaaaatcccgtctctacaaaa
-aatacaaaaattagccagatgtggcagcatgtgcctgtgggctcagccccttgggaggct
-gtggcaggaggatcacctgaacctggggaggtcaaggctgctgtgagctgtgattgcacc
-accgcactccagcctgggtgatagagggagaccctgtctcaaaaaaaaaatggggtttat
-gtctcctcctcttgagtctgggtgggctcgtaacagctttaaccaatagaatatgtcaga
-agtgactctgcgactactgagactgttcactggcactctgtttttggagccctgagctgc
-cgtagaagatgttcaaatactctgggactaccatgctgtggggtcacatgtaggccctcc
-tagtcttcaagtcatcctggtctggggactccagatgattccagttcttagttgtttcat
-atccagcctttgagtcctcccggctgaggaccaagacaccacggagcaaaaacaagccat
-ccccaccactcctggcccgaattcctaagcataataaaatggtggctgcttaaagccacg
-gagttttggggtagtttgttacacagaggtggtaacgggaacaGtgcgaccaccctgggc
-atgtcaccttcctctctggccagccagaaggtgcagcagccacaaagctctctgcctcct
-cccttccctcagcggtgtgctgctgacacagcagtcagagatgccccataaatgcttcaa
-acagaccatgtccctcctttgctcaaaaccgtctgttggctcccagctcactcagaggaa
-atgccagattcttaccatggcccacgggccctacatgatgggacccctctccagcccatg
-gcctctctgtcctgtctcccaccctctcccttctccagccacaccacctccttgctactc
-cttgaacaccacatacgccctgtctcagggcctttgcgcttgccaaggacagtgctccat
-tgcctggaacattctttctccaggtgttgcttggttcagtccctcatcttgttcatgtcc
-ctgctcagatgtcatcttctcagtgaggccctctcttcctactcccaaaccccttgactt
-gctctattttcctctcgccatggcccttagaactacctaacacactatgcactttactta
-ttgtgtttccccgcccaccccgtccaccctagaatgtcaataccacagggcaggaatctt
-ggttattctttaatgtctccccagtgcctgtaagagtacccaacactcacagtggtttgc
-tgaatgaatgaatGAATGAGCTGTAGGAGCCCAGAAGGGGTTCGTTGCCTTCCCTAGGAC
-TATGTATGTGGGGAAGCAGAGTGGGTGAGGAAAGGGCAGGATTGGAGTGACTGGGTTGAG
-CCAGTGTGGCCAGGGCTGGAGGACATTTCTTGGAAGTGACAACTCACTGCCCAGCTGGGG
-AATCCTGAGGATGGGAGAGTGCAGGGCAAGCCTTTGAAGATGCAAACATGGGTCGTCTCC
-GGGGCCTCCCTCCTTCCTGGTCTTGTGTGTCTCCGGCCCTGCCAGTAAACAGGATCTCTG
-GGCAACTGCCTGAGAACCCTGCCCAGTGCCCCAGAGGCCCTGACGTGCTCCTTCCTGAGC
-TATAAATCAGGTACCTTCCAGCTGTGTGACATCCTGGATTTGATGGGGAAGGCAGAGCAG
-ACAGATTTGTTGCAAAGAGCTGTGCActgcaccttgatttccttgttagcaaaataggaa
-ggataggagcgttgacttcaagctgtggctgtgaaatcgagtgagataatgcatgaaaTT
-CCTCTGTAAACAGAGATGCTTCAAGGACGCATTAGTGGGTGGAGGCACAGGgagcaaatc
-ccaactctgccgctgagctctgtgtcttcacctgtaaaatggggttaatgtgaatcacta
-acttcctagggctattgagggattcaaaaatggagagaaaagtcttagtacccaatgaac
-gtgcaatagatattagctgttattaATGGTAACTATTACCATAATGATAAAGAATCAGAT
-GTTATTGATAAGCCATTTGGGAGACCGAGAGTCTCAGTTCATACCCCAGAGGGGACCATG
-GACTTGGCACAGCACGATTTCAACCCTGTGCCTTTTGTGTATATTTCAATCTGGTCAGAG
-ACTATCTCCCACTCACAGGCCACCTCCTCCCCCTACCCCCAGAAAGGCTATACTTGTGAG
-CACACCACTTCCCTAAAATATGCCACAAGAGTCGACATCTagccaggcacagtggctcat
-gtctataatcccagcaatttgggaggccaaggtaggaggatagcttgaatccaggagttc
-gagaccagcctgggcaagatggtgaaaccatctctactaaataattttttaaaaattagc
-tgggtgtggtagtgtgcacctgtagtcccagctacttgggaggctaaagtgggaggattg
-cttgagcccagaaattcaaggctgcagtgagctgtggttgtaccattccacttcagcctg
-ggcaacagggcaagaccttgtctctaaaaaaatttaaaacaaacaaacaaacaaagaATA
-AATATCTAGCCTTGAAGCCAGCCTTGGGGGTGGGGTGGGAGGAGGACTATTTGTGtgcag
-gagttcaaacccaggccccatcactccccagatgtggaaacttagacatgttatttaatt
-gtcctatgcctcagttccctcaactgaaaaagagaataataatagtacccatctcttcta
-gttgcattgaggactgaatgagttaaAAAGTACCcaacacaccatatgagataatgctat
-tttcattctaccaatgggtaaactgaggctcagctaggagaaagaacttggttcaagCTA
-TCAGTCGTGTTGTTTATTGGCCCTAAGTTGTGACGAGTTTCATTATACCATTAGAAGCCC
-CCGAACAGTGAACTCATTGTTTGTGAGGTATCTCTATCTCTTAGTGATTTTTTAGTTAAA
-TGAGAGTCCATGCTAATCATTTATAAAAAATGGATAAGATAAAAACTTAACATTGAAACA
-TCCATGGGCTTCTTTCCATAAGAAATGGAGAAACTCTTGCTCCTAGTATTAAAAGGTCGT
-GGGTTCCAGTTTGAGATGCACCAAGCAAGGTAATAGGAAGTCCTTGAAGGTTCTTGAGCA
-GGGGGAAGCATGAACTTAAAGCATATGAACCATGTGTTTGGGTCAATTCAagttactgag
-acttagacattgctggtgggatgcaaattgctacaatctctgtggagggtgattgagttc
-cacaaatatttaagataaatgtaagagctcctaccAAAtgccaggtgctgttcaggtgct
-aaggatttgcagcaaataaatccaaccaagtccctctgcctggtgcttattttctggaga
-ggagacacacaatgaatgaatatacaacttagtatagcgtgCACTGGGGAAAGAAATAAG
-AGCATTTCTACAATAATGTTTACTGCAGTGTGAAGGGGGATCTGAAGAGGCTGGACAGAG
-CCAAGTATGGGTGAAGATGTGGAGATAGCGCTGGGGGTGTGTGGACTGGAGCTGCCATCT
-GGAGAGCAATCTGTCCAGTTAAATCTGTACATTGggtgcataaattatggccaccaatta
-tttgacattcctcccatctagatgtaggtctatgtatctgctctctgaatctgggctggc
-ctctgactgctttgacaaacaactatggtggaagtgatgatgtgtcagtttccaggccta
-ggctttaaaagattggcagcttctacttcctctttcttggaacaattacttgaggggaag
-ccagctgccatgaagaactccagccaccccaagactgccattctgtgaggaagtcccgcg
-aacaatggaaagaagtcctctaggatgagacaccatgtgatggagagagaggccaggaac
-atcaaggctgtagacatgagtgaagatgccatcttgaaagggaacctccagccgtagctg
-tttcagttgataccacaaggttcagaaaggagccacccagctgagtccttcctaaattcc
-tgactcacaaagtaatgaacaaagtggttgctttaagcctctaagttgagggtagtttat
-tgtagtgcaaaagataaccagaataGATatatccgatgacccagcaattatactcctggc
-tatatgtccagacaaaatTCTCTTATCAGCCCATAGAGGATATGGCCATATTGTTGTGGC
-AACAGAGAGTTAGAGGCCACTCAGGTATCCATTACTGGGGTGGTAGAAAGGAATACATGG
-TAGGTGCAAAGAGCTCTAGGCAGCAATCAGAAGTCACAGGTGAAGCCACACATACAAGTC
-TGTTATGTTCTACGTGAAGACTTATACACCACAGAATGCACAAAGAACCCATCAGAATCT
-ATGGAGGTGCAGAAAATATGAAGGGGAAATGGGATAAAAAGGAATAACTAGAGAGAGAGA
-AACAAAACCAAACAAAGGAGGGTGCACAGGGGTAAGTTATGATAATCTGCCATGAATTGA
-GGTCTTATTAAACTCAACGCTCTACATTTAAAATCTAAAAAgtaataacaaaggccaaca
-aaattaatgtgtgtgaatagggggttggttaaataaattgtagcacatccacatgaggga
-gtactgtaaagccataaaaaagagtggcagagcttgctatgtactaacatgtaagagtcc
-caaagtatgtcgaaaaggctataagaagggtattgaaaaggatgcataataggcttccat
-ttgGGGGGAGATACCAGTGTGTGTGGTTGTGGATATGTTTATAGACAAATGGTATATCTG
-TGGAAGGATGCTCCTGGGGAAAAGAGCCAGATGTCAGGGGAGAGGGGTGGATGGCACTTC
-AGAAGAGCAGGCACCCAGGAGCTGTGTTCAGAGAAGGAATTGCCACTAACACTGGGACCA
-CCTCCTCCAGGCCAGGATCACGCCAGGTGTGGGGGCTCAGAGTGGGCAGAGAGCCTCTGC
-TGCTTCCAAGATGCCCAGGGTCCTGACTGTGTCCATGATGCAACCTCAGCCAACAAGTTG
-GTTGGGCACTGCCCACTGCTGTGCCCTCATCAGCCACTGTCCTCACTTCATTGCCACTCA
-CCATCACCACTCTCCTTCATTCTGCCTGAAACACTCCTCCCCACTGCCCGTCTCCCTCTG
-TTACTTAATACTCAAACTAGTACAGAGAATAACAGAATAAAATCCCATGTACTCACTGCT
-CAGTTTAAGGAATAATACttttcttttcttttttgagatgaagtctcgctctgttgccca
-ggctggggtgcagcagcgtgatctcagctcactgcaacctccgcctcccagattcaagtg
-attcttctgcctcagcctcctgagtagctgggattacagggatacgccaccacacctggc
-taatttttgtatttttagtagagatgggatttcaccaagttggtcaggctggtctcaaac
-tcctgacctcgtgatctgcctgccccggcctcccaaaatgctgggattacaggcatgagc
-cactgcgcctggccTAAAACTTTTCAAAAAGAATTGAGAGTGAAtggttttaaatatgtc
-cacaaattcttggacactcctctcttcaaaaagtagagttacattctccttacctttgag
-tatgggctgagctcagcaactcatgtctaatgaagaggatgtggtgaatgaggatgggtc
-acaaaagggatacaacttctgcttaattgtccatctgtccgtctatctctccatgctcac
-ttttggaatccagccaccatgttgtgatagaacccaagatgcatgggcgggcccacatgg
-agaggaactgaggccctctcccctcttcccagtccctgatcaacaaccatcacaaatttg
-ctagccacccagatgaaccccctttggcttggcagcaaattctccagcttaccctccaac
-tccccaacccgataggccttcagatgactgcaggcccagctgacagctgaatttagcttc
-ctgaggaccagaaccacccagctaaaccatgcccatattcctgccttcagaaactgtgag
-atataaaaaatgactgttagtactttgaaaacattatgttttgggatgatttctaatgca
-ggatcgattgctaatacaGAGGGTCCCTGGTATCCCTCCCCACCATCCCCATCCACCCTC
-TTAGAAGCCACAATCCTGATGTTTATTATTTCCATGAATGTTTTACCTTTTACTACATAT
-AATAAATCCTTACCCAATACATAGGACTATAtttccttcttttttaaagaattttttctt
-tttgagatggagttttgctcttgttgctcaggctggggtgcaatggcgcgatctcggctc
-actgcaacctccgcttctcgagttcaagcgtcattctTAAAAATGtatagaagtgcatat
-atattgtatggattctgtgcatcctacctcgcatgctcttttccttgcacagtgtgcatt
-ggcgacccatctgcattgaggcaggcagctgccattcgttggcactgctgggcattcttc
-ccttatatgaatatgttaataccacgatatagtatctgaagtccatgttgatgaacattt
-ggatggtttttattttttgctattacaaacaacagcgctggtaacatccACTTGCCCTCT
-TCCCTCTTTCACATGGCACCTTCTTGTTCTTGGAGGTCTCAGCTCTAACAATGTAACCCC
-ACCAACCCCCCGCTCCAGCTAATGGGTTCTCTGTCCCCACATGTGCCTCCCAAGCTGGCT
-TTTGATGGTGctccctctgtttttccttctggcatctactccgtgtggtcaacattcagt
-tatcttttcctgtctggagctagagggtaagccccatgaaggcaggcagagtagtgggtt
-tttttccccagtcccctccatccctgatgctttgcacagggcctggcacacagtaggttc
-gcaagaaaaattgttggatcaggaatgGCTGAGAATTAGcttcctctctttgggcttcag
-ttttcccatctgcacagtgaaaactttagataatttcGGGGTGATTTTAGGTTTAGCCTT
-TGAGAGGTGCCTCAGTGGCCGCCACAAAATATCGGAAGACCCCAACTTTCAGCAGAGCTG
-GCCTTGTTTCCCTTGTGTCTTAGATTGGTCTCTATGGCAGATTATGTTTAAAaagaatag
-ccaccatttattgagcgctcactacgtgataggcatgctgtcagctggcagatgcatttc
-ctcattttggccactcattaaccctcagaagtagcactgttactatgctctttataaaga
-ggggtaaactgaggcaaagagaggtgaagtcacttgtcagaggactagcaaaggagggag
-ctgggatttgtagcacaagagactatcagagcccattcgccaaccctggtgcagccctgc
-cccactgGTACCACAGCTTTAAAGAAGTGGGGTGGGAGGCAGAGGAGGAGGACGGTGAAG
-GACAAGGGTGAAGAGAAATGTTTGGATAAGTTTGACAGCCACTCTTCTGAAGGGCTTTGC
-CAGCCGCAGCATTCGGGTGTCCCTAGTCACGGGGGCTCCGTCACTTCCCTATCCCCCTGT
-TTCCCGGCCCTGATgggtcttgctctgtcacccaggaggctggagtgcagtggcgtgatc
-acagctcactgcagcctggaactcccgggctcaagtgatgttccccatcagccttcctag
-tagctgcgactacaggcgtgcaccaccatgcccagctaagttttaaatgtttatatagac
-acagggtctcactatgttgcccaggctggtctcgaactcctggcctaaagcaatcctcct
-gtcttggcctctcagagcactgggattaaagtgtgagccactgtgcctggctGAGattta
-ttgatcacatagatacctatattattctaagtgtttttcaagtgacaactcatttaatct
-tcataactgtcctgtgacgtagatagtatcagttttatcagtattttatggagattaagt
-aacagaagcacagaaaggtcaagtaacttgcacagagtcacacagctggtaagatgtgga
-cccagctttgaatccaggcagtccagctccagaatccttgtgcttcacATCACCACACGC
-TGCCTTCACCATCACGTGTCAGTTCCACACAAGTGGATGCCCACAATGGTTGGGAGTAAG
-GGGAAAAGGAGTAGGGCTTGAGGAAAAAATAAAAGTGAAGCGTGTGATGATAATGAGCTA
-TGCTTGAGAAATGGGATTAACTCAGCTCTCTGTACTTGATAGAaaaaagaaggagaagga
-ggagaggaaagaagaagaaggaaaTATTTAACTGGACTCTCCGGGGCTTAATTATAACAA
-CTGTCTGGCACCTAAGGTCCTTCCCTAGCTGGGcttgctgcttctctaatctcatttccc
-tacgtttctcacggtgctccagtcactccaggccacacctgatcccagaaacctacttgt
-tcctactttgagcctttgcttgtgctgtttcttccattaagggtgccctttttgccaggt
-gcagtggctcatgcctataatcccagcactttgggaggccgaggtgggacaatcacctga
-ggtcaggagttcgagaccagcctggccaacatggtgaaaccccgtctctactaaaaacac
-aaaagttagccaggcgtggtggcaggtgcttgtaatcccaactacttgggcggctgaggt
-gggaggatcgcttgaacctgggaggcagaggttgcaatgagctgagatcatgtcgctaca
-ctccagcctgggcaacagagctagagactccgtcacaaaaaaaaaaaaaaaaaaaaaaaa
-agagtgctcctttccccattttaggaactcctacacatccatcaaaacctggcctaaagg
-ccctctcctcaatggaaccttttccagcctttcacttcttggggttcccacagcccttta
-catgtctctattctggttggctcacctgctagccagtgagctcctggaggacagggatgg
-gtctggctcatctctttaaccgccatgctgagcccagagcctggtaaatggtgggtgctc
-tataaGCTCGTGCCCAGTCACTCACCTTTACAGCTCcagtgtctggctgacagtgggtgc
-tcagtacatgtggttggacagatcaatGAGTGAATATTTGACGGAAGGGTGAATAATGAC
-ATCAAGGCTGCATTCCAATAACAGCACAATCCCAGTGCTGAGAAAACAATTCACAGCCCT
-GGATTCATATCATGGAATTCTGATTCCTAGGCCCCTTTGTTCCCAGAGCTATCCGATGAT
-GCTGAAGAAGAGTCCCTGGGCATCATCTGTTccagctgtgtgaccttgagcaagttgttt
-aaccaccttgtgccccaagattctcatctgcataaagaagagaaatagctacaccttcct
-catgggctagttacaaggatgaaatttgatcatatgtgccaagcacttaacacaacacat
-gaacatCACGGCATTGGCATGTCAGCTATGCCAATGACTCTATTTATACCTGAAttttta
-tttgaaataatttcagacttacagaaagtttgcaataataatacaaagaattcctacata
-ccatcacccagattccttaaatgttaacattttgcattctttgctttttcattctctctc
-agcatatatttttgtccagtgcctgaattgttggaaataagttgcagacatgttgactct
-ttacctctaagttaattatcccatgtatatttctaaaaacaagaatattctcttacaaaa
-tcgcaggacagatagaaaaatcaggacactgatacaatgctattgtctatcttatagacc
-tattgaaattttttcagttctactaatgtcctttgtagcaaataaacaaaaagatttcta
-cccccccaccccacccactcagtaaccagtccaggacacatgttgtatttaatgtttatg
-tctctttagtcttctttttagtcttatctggagcagtttcttttttttgagacagagtct
-tgctctgttgcccaggctggagtgcagtggtgccacctcggctcactgcaacctctgtct
-cccaggttgaagtgattctcctgcctcagtctcccgagtagcaggaattacaggcgcctg
-ccaccacgttcagctaatttttgtatttttttagttttaccacgttgaccaggttggtct
-cgaattcctggcctcaagtgatccacctgcctcggcctcccgaagtgctgggattacagg
-cgtgagccactgtacccagcgtggaacagtttctttggcttttatggctgacattatttg
-aagagtttaggccagttttttgttttgttttgttttggtttTTGAagatggagtttcact
-cttattgcccaggctggagtgcaatggcaccatcttggctcactgcaacctccgcctctg
-ggttcaagcgattctcctgcctcagcctcctgagtagctaggattacaggcgctcgccac
-tatgcctggctaattttttgtatttttagtagagacagggtttcaccatgttggccaggc
-tggtctcgaactcctgatctcaggtgatccatctgcctcggcctctcaaagtgctgggat
-tacaggtgtaagccactgtgcccagcctggaacagtttctttgacttttatgatcaacat
-tatttgaaaagtttagaccagttgttttgcagattgtccctctgtttggatttttgtgtt
-atttctttatgcttggattcagatcaggcacttgtggcaagaacaccgcatcagtgacgc
-tttgtccttcacagtgcgtcccatcagggggcccatgatgcctgccgacttgccccacta
-ttagcaatgttcactgtgatcatttggtgaaggtggtgtctgccagttttccctactgta
-aagttaccatttttctctttgtaattaacgaataccttataggaagatacactgatacta
-tgtaaatattctgtttctctttatatttcctgcccatatatttcctagcaggatgatcta
-ttttgcaatagatgcaattattatttgatAAAGGAATACATAAACATGGACCAATATTCC
-AACAGTATAAAAGAGTGTAAGGCAAATctcccacccactccgtccccagccaccccgatc
-ctctccccaagccatccctagtctcactgtttcttgtgtccttccagaaatgttctatgc
-atagacaagcgaatccactcatccatcttcttctcgagttatgtgcatgcagaaggtagc
-taaatagacacatgatctgcatcttgttttatttcatttaatattttggagaccatttca
-tatttgaacacaaagaGAGATCTCTTGCTGATTTTAGAAACTTATGTCCATCTGAGGTGC
-AATCCCAGGGtagtcaatctctttcaggttcacaaataaggaagctgagactcagagtgg
-ggaagggacaggtcccaatgtcagaggcaaaacagacTTGGAAACCAGCCTGGAACCCCT
-GAATAAGAGAGTTGACAGGTCTTACTATTGGGGAACCAGTCCTTCCAAGGGCCTTTTCAA
-CAAAATGCCAGACCCAGGCTCATGCCCCCGTTCTCAGCCTGGCTTCTCCCTCCTTCCCCC
-CTCCTCCCCTGGGTCCCTTCTTAACTCTCGTTAGGGACTCCCCTCCAGCTCCCTGCTGGG
-CCAGGCCTTGGGAGCCCCATTGATCCTCTGACAGCCCAAGACAGATTGGTGGGGAGTGTG
-TATTCAGGTGCAGGCGCCAGCACATGGAGGCCAGATGAGAATGGGGTGGAGGGGGTCAGG
-GGCCTGCTGGGGTGGGGGGATTGAGGATTGAGGAAGGCCAGGATAGTGCATCCCACAGAC
-ACCTGCCTCCCCTCTTTCTCCCCCACCAATTCCTGCCCTTCTTGGGGCTTCTGTTCCTCC
-CGCCTCCTCTTGCCAGGCGTGGGCAGGCCAGAGGGGCTGGGGCAGGGCCTGGGAGGCCTG
-GGggtgtagcagagagaagtcgggatggggagtgagccttgcttggtttgatctcagctc
-aggccctcttgtgagactcaggcagatgacatctcttgagcctccgtctcctcggggcaa
-taagaaggaaataaACTTCATACAGCGTCCAGCAGCCAGTGAGGCATGGCCAGTAAAGGT
-CTCCATGTCCTTCATTGGCCTCTTAAGGCTCCCACTGCATTGTTCCTGTCTGATTATGGA
-AGCCCCCAAGCCAAGGCGGCCCCTCGGCTCTGCCTGCGGAAAGTTTTCCCTTCACCTGCG
-CAGACCAGGCCGATGTGGCCTCCAGAATGGAGGGGTCAGCCTAGGTTGCCTGTGACAACT
-CTGAAAGGCCTTAGGAGGCACAGCATCTCAAGTGCACACCCGAGTATGGCGTGATCTGCA
-AGGGGAATAGGGGCTGGGGGGAGACATAGGCTTTGAAGATGAATCAGGCTGGAGCAGGGT
-GGAAGTGGGCTCAGGGAGATGGAGCAGGAGGGGTTGGTCAGGGAAGAGGGAGCTCAAGGG
-AGGAGACATAAGCGCAGAGAGTGAGATAGATAGGGACCCAGCAGCAAGTGGGCTCAGAGA
-GGGGCTGTGGTGCAGAGAGAATGAGACTCAGATGGGGGCTGTAGACTCAGAGAGAGAGAT
-GGGGACAAAAGGGGAGTGGGGGCTCAGGCAAAGGGATGAAGGCAGAGATGGGAAAATTGG
-GAGGGAGGGGAGCATCCGTTTTGGGAGGGAAGTGTCAGTTTTGAGCACACACAGTCCTCT
-GCAGCTTGAGGAGGAGGAAGGCTGGGTCTGTGGAGGGTGGGGAGCGGGTGGCACCAGAAC
-AAAGCCCCGGGGGTAGCAGCCTGGGCCCTGCAGCTCCTTCGCAGCTGACAGTCCCTGAGC
-TAATTACCATTAATGAGCAGCTGGGCCCAGTTTCCCGGGATTTGCATTCACTGTGCTAGT
-CAGCGCCACTGTGGATGGAAGCCAGCGCCAGCCTTCTGGGGTGGGGGTGACTCAGGGAGC
-CGAGGTAAGATCGCTGGCTTCATGTGGGGCTGAAGAAGGTGTGGCTTTGCCTTTCCTGCA
-GGTTAGGAGATGGCCGAGGTACAATCGTGCCTGGAGGCAGGGCACTGGCATCATCCACCT
-GTCCTCAGCCAGGGCCGGGGTAAGGGTCTTGGGGAAGGAACAGGTCTTGTGGCCCTCAGA
-AGCCCTCAGACATTTGGTTGCAGGGGCCCTCAGATTGTGCAGCCAGCTGTCCACTGCGGA
-GTTGAGGGAATAGACCACAGAGGAGCAACGTGCTGCTCAAACTCATACCAAGACAGCATT
-GCTCGTTAAGCGTGCCtgtgtcagacgctgtccaaagcactttactgaatcttcactacc
-aaccccatgtggtggctgttattagcaatcccattttacagatgaggaaactgaggcaca
-gagcggtcacacagccagggaccagcagggctggcatttgagcccagtcctcctgactGA
-TCCCTGCTGGGCAATAGGGCTGAGGAGCTCTCAGACCTGGGTTTTCCCTTGTGATGGGGG
-CTAACAGTGCCTCTCTCCCCCTAATTCCACTCTCTGCAGGGATGCCGGTATGTTTGGTGC
-CCCTGGCAGGGTTGGGAGGTGAGACTTAAGTACAAATAAATAAACAGGGAGCAGATGGTT
-GTGGGGGGAGTGGTGGTGCTGGGAGGGATAGGGCCAGGGCCTCCCACTTCTCCTTGGGAA
-AACATTTCTGGGCTGGAGCAAATGGATTCCAGACTCAGGACCTGGGAGCCCCTTCCCCAG
-GCCTGCCCTCCTGCCTGCTGGCCTCAGACCTGGCCCAGCCCTTGGgagaaatggtgggct
-ggggtcccgagtcttgggttctgcccatccctcatttctctctcttcttcctgtgtggcc
-ttgagcaagtccctttacctttctgtgcctctatttcctcatctgtcaaatgagtggaag
-gagaatgaactttatcaagtttctgttcaagggccacctcccctgggaagcctttcttga
-ttgctccaggcAGCTTCTGTTAGAGCAACAGCCTCGAGTATCAAGGAGAACATAGGTATT
-TGTGTTTTTCATTTCACAACAatccattcaacagatactttctcagggtcacctatgtgc
-ctggcacgatgccaCACTCCAGGCTGACTCGTAGTTTTTCTCTGTAGCTCcagtgctggc
-ccagagtagccactaataaacatgtgtcatgtgcatgaatGATGAGTGGGTGACTGAAAG
-GGAGCATGAGGAGCTGcagtgtttcccaaacgtggtacttgtatcttgggggtgggagtg
-gggagtggataaaagatgatacgggtgaacagcaacaagttattaaataacaataaatca
-acagtgaaaaagttattcctttttcattacctcccagtccttcttacaggccaaggagaa
-ggtctccgatgatgccaggaacgtgtttctagcacctgtggatctctctttctctctctc
-tctcccccaactcccgcaaaacccaccccaagaaggctggtcttgggctcagagcttcta
-cagacaacactatctagaatttgagaatgttgtttggtttccattttattcattttggtc
-agttaccttttatttgtgacaagggattttgatttttcctttgtTTGGACATGGCCAGTG
-GGAGTTGGAAGTGTTTGGCACTTTCTGATGAAGTGATCAGGACCAgggtggggaagaggg
-ctcgactgaaaaggggcacgagagcacttgtggggtgatggaaatgttctgtgttttgct
-tgtggtcgtagttacatggctgtgtacatttttcaaaatgcattgcacgataacacttaa
-aataggtgcattttattgtatgtaaattatacctcaaAGTTGATTTAGAAACACATATTG
-AGggctgggaatggtggcttacgcctgcaatcctagcactttgggaggccaaggtgggtg
-gatcacctgatgtcgggagttcgagaacagcctggccaacttagcaaaaccctatcttta
-ctaaaaatacaaaaaaattagccgggcgtggtggtgcatgcctgtaaccctggctactca
-ggaggccgaggcatgagaattcttgaatctgggagacagaggttgcagtgagctgagatt
-gcactactgcaccccagagcgagactctgtctcaaaaccaccaccaccaccagcaccacc
-accagcaccaccaccaccaccaccaccagcacATGTTGAGGatattaagtagataataat
-acagatggcatgtaggtgtggccaaagtcatgaaggtTGCCCACCACACGGTAAACTTTG
-TAGTCagtgaataaatggatagataggagatagaatggaggaatgcatgaatgggtaaat
-gagcaagcgaatgaatACCTATCTCatccattctacacagccccagcacattgggaggtt
-gtcctatctcaacttgcatagctcctagaatgggggaactcactaccttatgacatagcc
-ctttccacatctgaaccactaggagtgtgtaaaagacattttctcatattaagtttatct
-ttctggagatcctgtgctctctggggccccacagacacatctgcttccctgtctggggac
-agcccaaacacttgCCCTCCCCAGGCTGCCCTTCTCTGGGCCCTTCTGCCCAGATGCTTG
-GCTGCTGTGCCCACCaggtcctgcttgcacagagcttatatcctagtgggcggcaggaca
-aagaacaagcacacaggcacacaaacacaatgattccatgctatgaaggaaatgcagagt
-gagactgttgggaagagcatggcggggtgtggagaggcaaggggagtctctctaggaagg
-taatatttgagctgggacctgaagaatgcaacaaagccagaagaacaagagaaagggcat
-tccagatagaggcaagagcaagtgcaagagccctgagatcacagagcaattggaaactag
-gaagcagccagcctggctggaCATGGACATTTTGGGTATTGATGGTGAAGAGCCTGGAAT
-TGTTTTCTAAATTTGATCTCCAAACACTTTTAAGCAAGAGGTGATATGATATGACATATT
-TTAGCAGACAATGAATATTTCCTGAATTAAAATTGAAGACCCTTCTAGTTCCAATAGTTC
-CATGCTTCCCAAAGTGATACTGAAATGACTTCAGGAGAGAACAggctgggcgtggtagct
-cacatctgtaatcccaacgctttgggagggtaaggcaggaggattgctcgaggccaggag
-ttcaagaccagcattggcaacatagtgagatccccatctctacagaaataaaaataaaaa
-taaaaaaattaaggccgggcacagtggctcaagcctgtaatcccagcactttggaaggcc
-aaggtgggtggatcatgaggtcaggagttcgagaccagtctggccaacatggtgaaaccc
-catctctactaaaaatacaaaaaatttagctgggcatgttggcgtgtgcctgtaatccca
-actacttaggaggctgaggcaggagaatcacttgaacctgaaaggtggaggttgcagtga
-accgagatcacaccactgcactccagcctgggcgacagaatgagactctgttaaaaaaaa
-aaaaaaaaaaaagctggacatgatggaacatacctgtggtcctagctactcagggggctg
-aggcaggaggatcacatgagcccaggaggtcaaggctgcatgagctgtgatcttactact
-ccacctcagcctaggtgacacagccagaccttgcctcaaaaaaaaTTTTTTTTTAAAAGA
-AAAGAGACAATCATGtgatggttgccagaatggcctccagagagggcctccctaggctga
-atcctggctctgcctcatccttgccgtatgactctgggccaaggaccttgcctctttgag
-cctcagtttttacatctgcaaagtgggggtcataattgtccctgtcttattggcttgttg
-tgaggattaaatgactttatattggagaacagggcccagcatgtcaaaagtactTTCTGT
-TTGTTAAATACAATGAAAAAGGGTGAGGACATGCAGAAGCAAGATTAATCCTTTTTCAAT
-CTCTTCCAGTCCTGATTCCTGCAAGGAGAGTCAGGGTTGGTGGGGATGTGTATCTCTAAC
-ACCAGCCCAATCTGGAGGAAGTTAGTAACAAGGTTATATTTATGTTGTTTATATTTACAG
-CTACCTTTATTTGTGCCACATGATACAAtttttttttttttttgagatggagtctcactg
-tctccaggctggagggcaatggcacaatcttggctcactgaaacctccacctcctgggtt
-caagcagttctcctgcctcagccacccgagcagctgggattatgggtgctcatcaccatg
-cccggcttattctgtagttttagaagagacggggtttcaccgtgttggccaggctggtct
-tgaactcctgacctcaggtgatccacccatctcagcctcccaaagtgctgggattacagg
-cgtgagccaccgcgtctggccCAAATTTTCCATCTACCCTGGCTATTTCAAGTTTCCTTA
-TTTTTTTTTTTTAAAGTAAAACAAAAGCAAATAGATTTAGAAATTCAAGGGCCATGGTCC
-CTGAGGTAATGGCAAGCCCTCCTGTCCCAAATGGCCCAAATTGTGCAGGTGGTCATTGAG
-CCATTGATGGGACTTTAGGAAGCATGGttttatttttatttttattttttagatggagtc
-tcgctctgttgcccaagctggagtgcaatggtgcaatcttggctcactgcaaccttcacc
-tcctgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcgccc
-gccaccactcccggctgatttttgtatttttagtagagatgggatttcaccatcttggcc
-aagctggtcttgaactcctgaccttgtgatccacctgtcttggcctcccaaagtggtggg
-attacaggcatgagccaccgcgccccgccCAGAAACCTGTTTCTAAGCTCAGCACAGGGA
-ATAGCTCCTTTTTCAAGTTATGTCCTGATCCGGATCACTTCTTTCTACCCGTGTGCAATC
-CACCAAGCATCACCTGGGGCTCTGGTGACAGCAGCATCCCCTTCACCTTCTTTCTCTTCC
-TGCTCCACTCGGCAGCCAGagccagaccatgtccttcctctgctcaaagcctcacaaggc
-tcccagctcacttggagaaaaagccgaagtcctcacccagctatgaggcccctcccaagc
-tgatgaccctcacccctcctcacccctccagcctcgtcacctgcccagccacagcccttc
-tcccacctccactgaccccaccacactggcctccttgctgcttcttgaacactcactctg
-tgcaggctccagctcaggacttttgcatatgctgttccctctgcctggaacacatccctc
-tgacacccacagggcatttttcctctcattgcccaggtcaatgccccctctcagagaggc
-ccatccaccttacctaaatatttcctagctcattcttcctccctcccctgcttttccctc
-agagcatatatcactaccagacatcacattttacctttgatacatatgttgtgtgtgtca
-tcgcctgtctcccagagtggacttcaagaggacagaagtttgcgtctgttttgtactctg
-atggctccagtgcctggaatggtacTGATTTGCAGAATGAATGTCCAGGGGTGTGTGTGA
-AGGGTGGAGGGCAGTCACTCCCAGCCCTGCCCAGCCTCACTGTGGCCCCTCAGTCCCCTC
-TCCGGATATAGCTTTTCTCTCTGCCTGCCCCACCCTCTGACCCTCAAGGGCAGGCCAGGG
-CAGCAAGCTTGTCCCTTAGGAGGGAGGTTTCCAGCTGCAGGGCAGACCTTCCTCCTATAC
-CTCCATCCCAGGTAAGCCCAACTGGAGCTGCCCTCTCGTGGAGGGTACTCCAAGGATGAA
-GGGCCTTAGGGGAAGAGCCACCCTGAATGTCTCTGGGCAGCCAGGAACCTGCTCACAGCC
-TCCGCGACCTCATCGGGAAAGAGGCAAGACTCATGAGAGTGAATGGcccacggggagtta
-ctatgcttgtccccttttacagatgagaaaactgaggctcagagaggtgaaTCTGTCTCT
-AGGGCAGCTGGAgcctctgtcccctcctctgtaaaatgaggagaataactcctccctcct
-aaggttaccttgaggattaaatgagctaaataaagcctttaaacacagagctgtgtctgg
-cacataggaggtgctcaataaatgttgggtactcttGTTgttctgacaggtgaactaact
-ttccaaggtctcacagttagtaagtaacacaaacaaattcaaacccagatctgtctgaat
-ctaaagTGATTCCCAGAGGgggggcagtggctcacaccagcactttgggaggtcgaggca
-ggaggatcacttgtgcccaggggttcgggactagcctgggcaacgtgacaagacattgtt
-tgtctccgcaaaaaacttacaaaattagccaggcatggtggtacgtgcctgtggtcccag
-ttacttgggaggctgaggctggaggatggtttgagcctgggagttggagactgcaatgag
-ctgtgatcacaccactgcactccatcctgggtcagagagctagacctggtttcgaaaaaa
-agtcaaataaataaagaaaGTGACTCCTGTGCacaaccacaaaataataacaataacagc
-gacgacaacagcaacaacaCCTCCGAGCAGTAACAGCATTTTCCACTGCAGACGGCGGCG
-CTGAGGGTACAGGGATAAGATCATCCGGTGACAGGGATCATCATCCCTGCCTGGCATAGA
-AACCCGGACATCGGACCCTGCCCTCCCGCTGCTTCCGCAGGGACAGGGGGCAGCCAGCAG
-AGCCTCCCTCTGGGGGTGCCCCCCAATCTGGTTGCCTGGGACGGGGGCCCAGCGGGGGTG
-GAGTTGCCTGGGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGAGGCCCAGCGG
-GGGTGGAGTTGCCTGGGGGGGGGAGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGGTGC
-CCAGCGGGGGTGGAGTTGCCTGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGTGGGGGGA
-GGCCCAGCGggggtggagttgcctggggggggcccagcgggggtggggttgcctgggggg
-ggaggcccagcgggggtggagttgcctgggggggggaggcccagcgggggtggagttgcc
-tgggggggggtgcccagcgggggtggagttgcctggggggggcccagcgggggtggagtt
-gcctgtggtggggggccagcgggggtgaagttgcctggggggggccagcgggggtggagt
-tgcctgggggggggccagcgggggtggagttgcctgtgggggggggccagcgggggtgga
-gttgcctggggggggccagcgggggtggagttgcctggggggggCCAGCGGGGGTGGAGC
-ACCCTGGACGGCCCCGCGGAGCCCCCTGCGGGAGGCGAGGGCGGCCCTCGGGCTCTGGAA
-GGGGCCGCGCGGCCTGGAAGACATTACACGGCTGTCGGGCGGGGGGCGGCGCTCGCAGTT
-CCGGAGGGGGGTCCCGGCGGCGGACGCGCGGGGTGAGGGGACCGCCCGGCCACAGAGCGC
-GCTTTGTTCTGCGCCGCCCCCGGGAGCTGGAACCAATGGATTGGCGGCAGCTGAGGTCAT
-CTGTCAGGCGGAGCCGGGGGGTCAGGCCCGGGGAAGGGGCCGCGAGGGAGGGCGGCGCGC
-GTGGGCCGGCGGGGTGCGGGTGGacgagccgggggccctgcggcaggtggctacgctgct
-tcggtcctcagtttacccgtctgtccaacaggaaagatcatttctgccctgtccacctct
-gggggctaatgtgagagttaaaGTAGGGGAGCTACAGTGATGATGATGATGACGACGGAG
-GATGACAGCCTTCCCCTAATCGCAGTCTCTACTTCGGGTACCATAGAAGTGCTAAGTCAG
-GGGCTGGACGCAAATGTGCTTTGTAGCCTATAGTGCGTGCCTGTGTGGGAAGCGGGATGG
-ATGTTTCACCCCACCCTCTTTCAGCCCAGGGAAGTCAGTGGCTCCCCCTGATTGCCTGCC
-TTGACCCTGGGTGCCAGGCTTGGTCTGCCTTCTCCAGGGGTGATAGGTGCAGCTGCCCAA
-GCCTGAGCCCAGGAACCCATTGCAGCCTGTCCTTGGAGCCTTCTGGTCCAGGGTAGGGCG
-GGACTGGAGTGACCCAGATAGGTGGGGTTTTTTTTTCTGACTGGGGGTAGGTCAGGGTCT
-CAAGGCTCTCCTTTGCCTCCTACAAAAGGACAGCCCTttctttcatcaattcactcattc
-attcattcaCACTGCCACCTGCCTGTGCCTCACAGTTCCCATCCATGAGATAATGAGGCT
-TCTAAACATTTGATACAGGGTCCCCCAGGGAAGGAGATCATCAAATACAGGGAGGCCCAG
-AAACGGCCCAAAATGCGTGTGTGTGTATTTTTGGGGAAAGGACTCATGGCTTTCTTGTGT
-TCTCAACCACGTTCATGATCCcaaacaaggctaagaagtactggttggagtgcagggaag
-gcaaataggctcccaaactccaccggagagggtggcacttggaacaaccactttggagag
-caatttgccagggtcttagaagatggaaatgggcgtatgcatcagccaggcagctccact
-cctgggtatacagttgaaagaGCAGGGTGATGGCGGGGGCCGTTCGCAGCCGCAAATAAC
-TGTAAGCCCCCATGCTTCCATGAACATGATCACGACTAACAAACGGCTACATTCACAGCC
-TGGAACACCACGCAGCGGTGAAAAAGAATGAGATAGACTCAGCTGGAatttattcatttg
-acagatattgattaacactactatcttttaggcactgttcttagcactgaacctacagtg
-ataaacaagacagattgagtcctgccttaagaacgtacatttggccaggcacggtggctc
-acacctgtaatcccagcactttgggaggccaatatgggaggactgcttgaggccgggagt
-tgaaaatcagcctgataaacattgtgagacctcatctctacaaaagaaaaataaaaaatt
-agctgggtgtggtgacacacacctgtaatcccagctactcaggaggctaagtgggaggat
-tgcttgaacccagaagttggaggctgcagtgagccacgatggtgccactgcatactccag
-cctgggtggtagagcaagatcctgtcttaaaaaaaaaaacaaaaaaagcagacacagaag
-aaaatttgggagagtgtgacaaatgccatgaagaaaataaaactggataaagggacggaa
-tgatgggggagggggctgttttagacgctatggttgggaaggcccctgaagaagtgacat
-ttgggcacagaccagaatgagggagactgggagacaggcacgCACGAATGGGATGGACGG
-CTGGGGCACAGTGCCAAGGGAGAAAAGCAATCCACAAAACAGCGCAAAAAAAGAAAACAT
-TTTTTACTTAAACGCACATTCATTACTATTAAATTAGATAAGAGTCTGGGAGGCTCTATG
-CCAAATTCATAAAGGTAACTGTCCCAAGAGGGCAAAGGAATAATCAGGACTAGGTTTTGT
-GGTGGGCTTCCGCTTGCCTCTAATACtttaaatttctaatatttaattatttaacatttt
-aatattttaatGTTTAAACGGTAAATATggctgaatgcagtggctcatgcctgtaatatc
-atactttgggaggccaaggcgggaggatcacttgaggccaggagttggagaccaaccacc
-ccaggcaacagagcaagacctggtctctataaaacgttaaaaacaaaattagctgggtgt
-ggtggtgcctgtagtcctagctactcgggaggctgaggcaggaggatggcttgagcccag
-gagtttgaggttgcagtgagctataatcagaacattgcgtgccagctttggtaacagagc
-aaaaccccatcacaaacaaacgaacaaaCACATTTTAAAAAGTAAATATACTTATATAAA
-ACTTGTGAAATggctgggcatggtggctcacacctgtaatcccagtgcctcgggaggccg
-aggcggacagatcacctgaggccaagagttcaaggtcagcctggccaacatggtgaaacc
-ccatttctactaaaacaacaacaaCAAAAAGCCTTGTGAAATGAAAACAAAAAAAAAAAA
-AAAAAGGAAATTTAAATCTACCACGGTCAAGTGGGTGGGTTCCAGGGCGGTGAAGGCACA
-TACTGCCTTTCACTGGAGCCAAGTTCCTGGGGGCAGAGGTTTTTTTGGGGAGGGACACTG
-TAGGTCATGGtagcccagccagtaggagcccagaagcttcttggaggaggtaccaccttt
-gctgagcctgaGATTCTCTGGCCCAGCACCCCCAGTATAGACAGGAATGGGTAGACATGT
-GCGCAAGGTTACAGAACAAGAGCTGATAAATAGAACCTGAACTCCAGACTCATCCCGGCT
-GAACCCGGGTTAACTATCCCGCCTCTTTCAGCCCTGCGCGTGCATCCAGCCCCTTCCCAC
-AGCTGTAGCTCTTGCAGGCCAGAGGGACGGCCCTGCCGCGGGGGCCGGAGAGCAGCGCCA
-CCTGCTGCTGTAAGAGGGAAACGCAACTTCCGGCTACCAGCAGGTTACACCCTTTAAAAC
-CCAGCTCCTCTTCCTTAAATGATCAAGCAGTACCCCTCTACTCCGAATCTGTTCTGCACC
-TCCTTCGCAGTGCCTGGCAGGGCCCTTAGCGCTGTCTGGTTGGGTCTTCTCTGCAAGAAG
-GAAAAGTTGTTTCAGGAGGGGGCGACCATCTTCACTCTCATTCCAGCCCAGCGGGCACAG
-GAGGAGTTTACTCACAGAAGACAGGGGcacctcaccttcgctacaaaccttaggggtaca
-caatccatttgacagcctggaagaagtccccagggaagggacagaaccgcccaaggtcac
-acagttaatgagtagacaagctgggGGGAATGAGTAGACTCATTCCACTGGGGATGGAAG
-TGGGGAAGTCACCGTATTTGAAAATAACTGACGCAGTTATTagcagctcttagcatgtgg
-tccctgaacagcagcatcagcaacatctgggaacttgttagaaaagcaaattatcaggcc
-ctgccccaactcgcctcaatcagaaactctggggggccgggggcagtggccatgtctgta
-atcccagcactttgggaagctgaggcgggagaatcgcttgtgcccaggagtttaggacca
-gcccagagaacacagcaaaaccctgtctctacaaaaaaatgagaagggcgcacctgtagt
-cccagctactcaggaggttgacgtgggaggatcacttaagccccgggaggtcaaggctgc
-agtgagtcatgatcgtgccactgcactccagcctgggtgacagggcatgaccctgtctca
-aaaaaaaaagaaagtgggggtggggcccagcaatctggtatttagcaaacAAGCTTGAGA
-CCCTGAACCATTGGTCTAAAGGAATTGCACACCCCCCCTTTTTTTTTTTAAAttaaataa
-acttttattttggaatgatactagatttacagagaagttgcagagatagtacaaagagtt
-cctgtatacccttcacccagcctaccccaaggtcaacatcttacatcaccatggtacatc
-tgtcaaaaccaagagactgaaattggtatattaactaaaattcagacttttttcagattt
-ccaattttcccactaatgtcctgtttttgttccaagacccaatccaggatgccacattgc
-actGAAGACACTCTCCCTTTTCAATTCTATTACTGGTCACCTCAGTCAACTTTCCCGGGG
-AAAGAGAATGCATGGGAAAAGCTCTTGTCCTTATTATTGAACTGGAGAAACTGAGGCTTA
-AAAGTGCCGAGTGACCAAGTTCCCTTAGAGGGCAGTGAGAACAAGGCCTGCCTTACTCTG
-TTCCCTTTCCCCAGGGACTCTTGGTTTTCAGAAGCCCCTCTGGAATGTCCTACCTGGCCT
-AACCCCATACCAGCAGTGCAGACAAGGAGGCACTCCTACTACAGTGGGTCCAGCCCATGG
-AGAGACTCACTTCCTGCCCCAACACCTCTTCCCCTAGACCCTGAGGGCCAGGACAATGTC
-TTAGTGCCTTCCAACTTGGCAGAGTGAGGCCCCATGAGACAGAGAGAAAGGGGGAAGAGG
-GAAATACCTTTATCCAAATAAATACCCATCCAAAATTATTTGTGATAGGTGAAAAATGGC
-CACAAGCTctttgtggttcccctcatcaagacatgtagtctgtttctcatcccttgaatc
-tgggtaaagccttgtgatttgctctgaccaaaagaacttagcagaagtgacactgtccta
-gtcccagttccaggccaagaactcaagaagtctttcagcttctactctcactctctttgg
-aatcctgaagccatcatgtgaataagcctgagctagcctgctggagaggccacatggagg
-agaaccaagcaattccagccaacagcctgtcacctgccaggcaagtgagtaaggctatcc
-tagaccatccaggcccagctgaggtaacagctgaccttagctccatgagggatcccaggt
-gtgagcagcagaactgccctgttgagcccagcccaaattgccaacccataggattgtggg
-aaaatacagggtttgtttctagctgccaagtttggggatggtttgttacacagcaaaagc
-taactggtacaCAattctgcatttctctcttggtaatgggatcccagttttattgcagga
-ggcagtgtgccagtctcagtagatggaacacgattggtctattcagccatgacaattctg
-ttccctgctgtcttagctttgtttgcagctagaggtgcaatggtagctggctcgggccaa
-gggcatctaagtgaagatatgcagagggagagagcaggaaacagacttctgacgaggttt
-tactttctgatagaaggtgacgggtccagctagtttggcccttcctcttcctccacccct
-ccttccttgaacgcagacatgattcttggggatacagcagccatcttgggaccatgaagt
-aacgagcactgagattaaggcaaaaggatccaagacgtgacccctaccttcgtggagttg
-ttgaaccaataccattagccacccatctccagaatccatgctatgtggaaaaacaatctt
-ctgtttgtttaaaccactgcaatcaaggttttcctttccttgcagctgaatgtagtccAT
-ATAAGAGGTTACATAGACAAAAATGCAGAGGGATCCTTGTCCTTGGGAATTTGGAGCCGG
-CAGCACGTGgctcttcaagcccatctctgttctccttctcggtaatgcttcaagggtaag
-gccatgatcctattgtcacagaggtgggaactggggctcccacactgtacagtgagtcca
-aggccttgtagctggtgagaggggtgcccagagtcagacccTCTCGCCAGGTGCAAAGAG
-AATGCACCCCTGCTATCCCTTCTGCATGGCCCAGCCTGCTGGAGGCCAGGTGTGTCTTCT
-GGGCTCTTGAAGGTGGCAGCAGGTGCCAAGGAGGCTGCTACTGCAAGTCTGGTGTGGATG
-CTCCCAGGTACACCCTTAGGTCTGAGAGAGTGGACTGGACAAGCTTGGCGGGGATGGTCT
-CTCGCTGCAGTTGCTGGTAGGCCGCGTAGCGGTGGCAGCCCCCAAAGGAGTAGAAGTAGT
-CACCTCCCTGGGCCCCTTTGATCCAGAGGACATCGATGGGGGGCACGCTGTCTGGGTCCT
-CCTGGGGAGAAGAGGCACAGAGTCAATGGACATGGTACAAGGCTTGAGAGTTTGTAAAGC
-AGACTTTGTCCACTTGTGCTGAGCTCCTTATAAGGTGATCACACTGGACTACTGTGAGAG
-ACAACTGTTAATTATCAGGAATTTTGTGAGCTGTTCgacatcaccttgtagcttgaaaat
-cagccatgggagagtatttacaccagagaaatggacagatgctacaaatcagggatttct
-cccacacatgtatcagcacaccacATGCACactatccagctggccctgttgtagaccctg
-ggaatacggtacagctggaatgtgactgaatcaggccctggcttcaaggggctccagtct
-agtggggcagatggaacaagaagtaaatattagagtgacaaatgctataatgacaataac
-acaggtgacaggacagagatgggGTCCACGAGGCCTCTCTGAGGTAAGAATGAAGCAGAG
-TACTTGGAAAGATAGAGAAGTGGggccgggcacggtggctcatgcctgtaatcccagaac
-tttgggaggccgaggcgggtggatcacctgaggtcaggagtttgagaccagcctggccaa
-aatggcacaaccctgtctctactaaaaatacaaaaattagctgggcatggtggtgtatgc
-ctgtaatcacagttactcaggaggctgaggcaggagaatcacttgaacccaggaggcgga
-ggttgcagtgagctgagatcgcaccattgcactccagcctcggcgatggaacgagaatcc
-atctcaaaaaaaaaaaaaaaagagagaaGTGGAATAGTTTCGATTAAgagctcaactgcc
-tgggttcaaatctagctctgctgcttaacagctatgtgatcttgggcaattcatcttttt
-gtgcctcagttgccccatctatcaaattggatggagataacagatccatctcatagaatt
-tttgggttaaatgggttaatatatataaagcacttcaaaccatgcttggcacacggaaag
-tgctcagtaatgtatgctgtgtatGACCTgagggaagaacgttccatgcaaagggaacag
-caaacgcaaaggacttgaaaccagagcacgttcactgtgtaggaggcacagcaaggagtt
-cactagagtggactccagggctccaggaatggtcagaaaggccagcaggagccagatggt
-gcaggtctgcttctgagagcagtgggtgggccctggagtgttggcaacaggggagggtga
-catgatctgatgcatgttctagaaagttgtcacaggagaacagacttggcagggtggaca
-gggcacagggctggaaggcagaggggaggcctctgcaggtattcagcagaagatgctggt
-ctggatgatggtgtggtggggacagggagaggtagacaggtttgggacacatttacgggg
-caggcccaaggggtctggcagaaggggtgaatccaagggcaagagaaaagggagaatcta
-agttgacttcctgttaggggcccacacagccaggtggagagtaggtcatcctctaaacag
-ggaaagtctggggcaggacgggtgcagggtagagCACTCTGGGGAGACCCCATTAAGTGT
-GAGCGGCGTGGAAGGCCTCCTGCTGCTGGTCCACGGGTTCTCTCTCATGATTCCACAAAT
-GATTATTCAgcagtaaggtgcagcagtcacaagcctgagctctggaacctggcacacctg
-actttggatctcagctcctctccacagcagctggggcacacagccctctgaacaccattc
-ctcacctgtaaactgggaataaaacatcctagagggctgctgatgaagagtcagtgagct
-gatgcCTACCGGGCATTAGTGGAGCACTAAGGAGGGCAGCCGTGCCAGGCAGGCCTTGTG
-CCGGGTACTGGAGGCACGATGGTGgatggccagaatgatggctcccaaagatgtccacgc
-ccgaatgcttctgaatgtgttaccttacatgggagaagggacttggcagacagaattaag
-gtaaggatcctgagatgcggaaattatccaaggttatctagatgggtcgaatgccattat
-cagggtccttaaaactggaagaggaagtagaggaagaggtcagagtgatgcgatgtgaga
-aggccttggcctgatgttgctggctttgaagacagaggaagaggccataagccaagcagt
-gtgggtggcgtctggaagctgggaaaggcgaggaaatggattctcccctagagcctacag
-aaagtagtgcagccctgcttggtgttagcccagtaagacccattttggacttctgaccat
-aaataaacctgtgttgttttaagccatcaactttgtggtaacttacagtggccccagaaa
-actaatacaGGTGTATGTAAGCAAAGGCAGAGCTGGTTCTGGCCCTCAGAGCCTACGGTT
-CTAGCACGGAAGGCAGGTGTCTAGACAGGACGTTAAAAGCCAGTGGGctgtaatcccagc
-actttgggaggccgaggtgggcagatcgcttgaggtctggagtttcagaccagcctggcc
-aacagggtgaaaccccatctctactaaaaatacaaaaattagccaggcgtggtggtgggc
-gcctgtaatcccagctacttgggaggctgaggcaggagaatggcttgaacccgggaggcg
-gaggttgcagtgagccaagatcgtgccactgcactccagccagggtgacagacccagaca
-acgtcttaaaaaaaaaaaaaaaaaGCCAGTGAGATCAGAGCTATGCAGGTGGGCACACAG
-GTGGCTGCAGGCCCACAGAAGCTCCTAACCCGGTAGGGATGGTCAGGGAAGATCCTGACA
-CTGAGACAGGAAGACCGAGAAAGAGTGAGAAACGACAAGGCAGAGATAGAAGAGGTTCTC
-AACGGGAGAAAAAGCCCAGTGGTGGGACAGGGCATGCATGGCAGATCCCTTCCCATCTCA
-gccaggcgccgtgctactattgtggcaacagataagatgggacgaggtcctcgcccttgt
-ggagtgcacgtgaggtcaggaagacagaaaataaaatgcaacacaaatagatgtataata
-taatttctggtggacataagtggtatcctgaaaaacatctcgggctaaggggagagctag
-agaggccagtgactctgaccaagggtgatcaaggaggcagagagctgaaccaggcagggg
-agcaggccctgtggttgtctggggaagtggctccaggcagtgaggacactagtgtaaaTA
-CTAGGACTGAAAGTTATCGGGGGTGGCTGTAGAGGTGCTGGGTGGGGCTTAGGGATCTCA
-TGTGCTCACCTTCCAAGGGTCGGGGGAAGGGGACACAACGTTATGTAGGCCTAACCTGAC
-ACCTGTTCTTGCGGGGCCCCCAAGTTCCTGCCAGAATCACTCCGGTATTCTTAACACCCT
-TCCTCAGTGGTGGAGCTGACCCTTGACCTCTCCCACTTCCCATTCAGACAAGGGCCTCCC
-AGCAGATATGACACACCTAGTCCCACTGTCACTGACTGTCACAGCCATGAGAGCCCACGG
-CTTATCTCCGGgtagtgcggtggccatgtgctgggcagtggggcccaggctgcctgggtg
-tgaattccagccgtgtcactttttaagcgcctgatcttagtcaagccgctgaaatcttcc
-ctgcctcagttctcgtctgcaaaagagccactatctacctcctagggttggcataggaaa
-ctgagggacttcctgcagttcctggaccactgcaagcactAGCGTTATAAGCGTTATCAT
-CACTactttaattatctcgcccaattccctccttgctcaagtgaggaaacagaggcccag
-agaggcccagctacttgctcaaggtcacacagcagaggctgagctccggctgggcccgga
-accagtccgtctcgcgtccaTCGCAGCGACCTCCCTCCTCCGGCAACCTCCCTCCTCCGA
-AGCCCTCCCTCCGGTTGGCTGGACTCCCCGAGGCCTCACCCGGATCGTGTCCACGAGGCT
-CTGCACCTTGGCGGGGTCCAACACGGACGGCAGCGGCCGGATGAGCACGCTCAGCGGCAC
-GTTGTGCACCGCGGCGATGCGGCCCGAGTGGATGCTgccgccctgcgcgccgccgctcgg
-cccgggcccctcgggcgccccccgacccgcgccggcccTGCCCAGCGTTCCTCCTGCACG
-CAGCCCCATCGTCGCCGCCGCCGCGGGACTCGCCGCCTCCCCCCGGCCTTAACTCCGGCC
-GGGCCATACCATTccgcgcggccgggggggggggcccgTGCCAGGGCAGCGCGCGTTTCT
-CCCCCGACCCCGCCGCGGTCCGGCCTCGACCCCGCGGTCCCCAGCCCGACTCCGGCTCCG
-CTCGCCAGGTGCCGCCAGACTCGCGCGGGGCTCAGGCTCTCCACCGGGGGGCGCCTCTCG
-CCTCCCCTGCGCCGCGCGGCGTCCGGGGAGTGGAAACGCCCGGGCGGGCTGACTCAGGGT
-GAGTTTGCAGGTCGCGGGGCGGGAGGGGCGCGGGTGACGCACCGGCCGGGCCGACTTAgg
-ccgcgggggcgggggcgggggAGAGCGCGGCGGACCTGCCCAGCCAGGGTGAGTCGGCAA
-AGCCCGCGGTGCGCTGCTGCCCCGCTGCTGGGGTTCCTAGCCAGCGAGGTTATGATCCCC
-ACCAGCGGTTCCACTTCCAGTCTGGCGCCGGCtgtgtctggagtcgttccgaacattttg
-cacgtgtattaacgtatctgaacctcaaaacaaccctgcaaggaaggtatgactgttatt
-cccattttacagaagaggagactgagacacaggtttaagtgatgtacccaagatcacgga
-actagtaagtggccgaatccgcgttcaaatccagacggtctggctccagagtccgccttc
-tACCCCACCGTTGGCTGCCTTGGTTCAGCAACAGTGACTGTCACACGGAGCCCTCAGGAG
-TCGCGCTGACAATGGGTGGGCCCTGCCTTCAAGTTCCACACTGTCTGTTTGTGTCATTAC
-AACACTACTGGAAGTAGGTGCAGTTATAGACCCGCTGTTCAAGGTCAGCTGAAATGAAAG
-TCAGGTCACACGAGTCCAAACTGTGGGGCCACTTAACCACCAACTCCAAGCAGGAAGGTG
-GACGATCCCAGACTCGGTCGAAGACAAGCATGTCTGGTTTGCTTGTCTTCCTTCTCAACC
-TGAATGGCACGAACATGGAGAAATGCATACTTACCCTGCCAGCTGGAGAAAACTGGAGAC
-GAAGGAGGGAGCCAGGAGTTTCTACTTTGccttccaccagttgctgacactttctgaacc
-ccgtctgtaaaatgaagtcatgctgcccatcactcaaagttgtgtgaattgagagagtgc
-tcatagtgctctgtgaattgcataacaTCCATTTTGCTGTTGAAGATCATTTATTTTGGG
-TTCTTAGTCTCTCACAAAACCTTAGAACACTGACACCAAGACTCCAGCCTTTCCCTTTCG
-AAACATAATTCCCGTGCGCACCTAAATGATACTTTATTTCAAGAAGTAGAACTGACACCC
-ACACCTCAGCCCCAGAATTATTCAGAATTAGAGAATTTCATCAAGAGGGAAGTTATCCCT
-TCTAAAACATCTTCCTCATTACAGGAAGTAAGAATGGCAGGATAACAGTTTCTAGAGTGG
-AAAAGTGGAGCTCTGGCCTGATTCTATCATCATGGTGTACCCAGGGAGGCCTCATTTCCT
-GGTATCAAATTCTCTGTGTTAAGATATCTATGGcccaattcaaaatggcttaagcaataa
-gaaggtttgttttctcacataataaaatgtttggaggtaggtatgtccaaggttggtaaa
-gaggcagttgaacaatgtgaccaaagactccagttctggctgggcccggtggctcacacc
-tgtaatcccagcactttggaaggctgaggcaggcgaatcacttgaggccaggagttcgag
-accagcctagccaacatagtgaaaccctgtctctaccaaaagtacaaaaattaggcaggc
-atggtggcgcgcgcctgtagtcccagttactccagaggctgagacaggagaattgcttga
-aaccgagaggcagaggttgcagtgagctgagatcatgccgttgcactacagcctgggtga
-gagagtgagactctctcagaaaaaaaagaccctggttctgtctatccttttgtgccatca
-tccttggtgttctgttatcctgcggtgtgcccctcatggtcccaagatggctactgtagc
-tcaaaacatcacatcattacatgcgaatgtccacaagtggaagttaggacatcccttcga
-gcctctttttaagagtgaagaaaccttcccTGGCTGGATGCAGTGGctcacaccttctga
-ccttccactcctcaagccccggagtcaactctagtcacactggcctccttgctgtgcctc
-ttccacagcgaatgtgtcctggcctcagaccctttacatttgctgttccctgtgcatgga
-acgctcttccctcaggtCATACatagcatacattactgagtgctctccatgtgcccagca
-tggtttgatgcgctttacatatattaactcatggaacctaacagctttatgagacgagtc
-tgttatctccatccccatttgatagatggggCATCCCTGTGGGAGCTCTGCCCATTCCAG
-AGGTGCCAGGCCATTCACTAATGGGGGCAGGAGCCGGTGAGTAAATGCCAGTCTTGTGCT
-GTCACAGGTGGACGATTCAGAGAGGTGTTCTAGACCATTCAGATCTTTCTGGAACCTTCT
-CAGAGACCAGAAGTACTCAGCCCTATTGCTACAACTGACTTCACTAACACACCctctgtc
-ccattcctcccaccccttacttctgcttccagggatcacctcccacataaacgacttaca
-ctcaagtctcagacttgctatcagggaaccaaaactaaaacaAAAGGGAAACTTGATACT
-GGGTCATCCCCTATAGTTCTGTACCTtgcctgggttaaaattgcactattttattagatg
-tgtgaccttgggccagtcacctgtctgtgcctgtttcctaatctgtaaaacggacataat
-gtcacctaattcacaggggtgttggaagagtgaagagagatggtgttaggtgaggtcctt
-aaaacagtgcacaacgcattataagtgctcaataaatgtttgctgttTGATTGCATTTTA
-AATTGTAACAGAGCTTGAACGTCTCTCCGTGTCTTCACTTTCAGACTAGGCTTGAtgtat
-tagtcaagacttttgtttgcaagtgacagaaagccaaagtgaattagcttaatgaaaatg
-gggatgcttggctattcccgtgactgaGGTGAAGCGGAGCCTCAGGGGAAAGTAAGTTGA
-GAGATTTCTTTTCTCTGCCCTCACTCAGCAGAGGGATTATCTCTACATGTCAGGAACATG
-ACTGTCAACAGCgatgatatttggctttaaataagggaaacctgacaacagagacttcat
-acaacttaaagtgtttcctctttaaaaaaaaaaacagtcgaggtaggaagtccatggctg
-ggatggctgctccatggtcactagtggcataggccctttctatcttgccgctccatcatt
-ttccagcagagttttcattctcagggtcacctcctattcaggattgctgctgaagtgcca
-gccgtctcatccaaattccaccctggaaagaggtggagaaatggaaaggcaaaggatatg
-acccctccccttttgaggatgctatctcagaagttttgtataacacttccccttgcatgt
-cattgactagaaattggtcacacggccacccctggctgcaagggcagctggatatgttgt
-cttcatccgtagcggtaatgtgctgagctaaaactggagttctcttactaaggaagaata
-gagattgataagtagctagcaatcggggccacaGCTCTCAAGTTACAGGCCTTATGGCAC
-AGAGACAGGGAGAGAGAGAAAATTTCCAAGTTCTAGTCAGATGCCTACATATGGACAAGC
-CAGCTATGGCATTGGGGGACACAGACTTTCTTAAAAGCATAAGCCACCATTATTTATTAT
-AATGACTTAAAGGTAAGGAGttcatttaaagataattactggtcacctgctattggctag
-gctagacccaggggatttagtgatcagcaaaaagacactaccaatctctgcattatgagg
-cttacagtgtagtggaggattcagataatgaccaaataatcacactggttaatggaaagt
-atacattggtagtgggtgctgcaaaagaaTGGCATGTGGTTCTGAGGAAGtgttttagtc
-ctttttggctgccatagcaataccatagactgggtggtttataaacaacagaactttgtc
-tcttacagttttaggggctgagaaatccaagatcaaggtgACtttgtatctccccaacat
-tcatatgttgaaatcccaacctccaggtgatggtgttgggaggtgggcctttgggaagtg
-attatgtcacggggttcatgggggtagagccctcatgaatgagattagtgtcctttttct
-ttcttttgagacagggtctcactttgtcacccaggctggagtgcagtagaactgtaaaga
-aaacttctaatttttaaaatcaggaacctgataataactaaggaatcctgaacagagtgt
-tggtagaaatacagatgaaaaaggccatttggatgaggaaatgaggaagatattattgga
-caatggaaaaaaggccatgttgttataaaatggcaaagaacttggctgaattatgtccac
-gttctagtgttttataggaggtagaacttgtgagcaatgaaacggaatatttagctaaag
-ctatttctaagcaaagtgttgaagctgtggcttggctcctcctgactgcttatagtaaaa
-tagaagcagaaagaaatgagttaaagatgtgacttttaagcgaataggaagcaaaacgta
-aagatttgaaaaattttcagcctatccatattgcaaagaatgagaaagaatgtttgggag
-aaaacaccaTAGTCTCCATAAGGAGACTGTAATGGTGATGAACGTAATCAGCCatcccag
-caggaaaactgccgtcttgaattgaaggggaaggagatgggaagggatgaggaaggaAAG
-CTGTCTGACTTCTTGGATTTTTCAGGACAAGACCAGAGTGCAAactcttcaagacaaggg
-aagaatgaccctgaaggcaattcagagatcatcaaggctatctcCTTGCTTTCAAAAGTC
-GGGAGCATTGCCTTGCATTCAGCAGGTTAGAGGGCCTCTGTCCAAAGCCATGGAGGAAGA
-GCTGCCCAGAGCTGTTGGTGTGGGGCTACCCAGAGCCCTGGGAACATGACTTCTGCGGGA
-TAGAGCTGGAGGGACAGGACCACCACCCCAGAGGGTACAGAGGGTGGGACCACCACCATT
-GTGGATCTGGAAGGCTGcctcagtgggcctggaagcagagcatttaatgaactaaaaatg
-atttttcttgagccttaagatctcatggagtttgccttgtagtttggatgtaatttggat
-ctgctattcctttcttctttcctatttctcccttttggaatggtctatcctatgcctgtc
-tcaccattgtattttggaagcagataacttgcttgatttcacaggctcaccgctggagaa
-caatttgccccaggatgcatcacaccttgagtctcagccatatctgacttagatgacact
-tagataataaaactttggattttagacttcagagttaatgctggaatgagttaaggcttt
-tggggctgttggaatgtaaggaatgaatgtattttgcatgtgagaaggatgtgaatttgg
-cggggGATGGGGACGGAGGCAGAAtgctatagactgaatgtttgtgttcctccaaaattc
-atgttaaaatcctaacccccagtatgatggtattaggaggtgggcttttgggaggCACGT
-TAAGGCCAGTTCATTTCATGGTCACAAGATGACATGCTTTTCTGTTCACACTGGAGGGGA
-AGAGGAACTGGACTTCCTTTCCTCTTAAGAAAAAGGAagcagcaaagttttccataccct
-tccagcaaccctctccttaagtctcattggccagaattgggtcatgtgcccatttctgaa
-cGATGGGAGATGTTAGTATTAGACCAGTAAAGACTACCTCTTAAGCTGATGTTCAGTCCC
-CAGATTGCGTGGTTGCTAATCCAGGAGAGAGGGGTGGGGTGGAATGGTTATTGGACCCAC
-ATAACTGGGCTGGATATGGCTGATGGAGACCCAGCATTCTTTCCCACCTCCCTCTAGGGT
-GCCTTCTAGATTGCCTAGTTGGAGAGTTAAAAACTCTATTTCTCAGATCTCTTTGCAGCA
-AAGATACTAACAGGGAATTAAGTTCTACCAGTTAGATGTACTTTCATGAGACATGGATGG
-CAGAGGTGGGCCGGGGCCATCTTCCATCTTTTGACTCTTGCTACTGTCAAGATTGTCTTG
-GAGGTGTTAAGATTTTCTGTAGCAGTGTTCCAGCATTGTGCCACCAGCACAGTGGGAGAC
-AGGAGATAGTTATAGAGGCAGTGGCAAGGGCCTGCTGATCCCTGGCTTGCACCTATGATG
-CGGTGTTCTGTATCTCAATAGTTCCAGGGCACCTTATTGACCACCACCAACCCCCACTCC
-GCACCCTCTCCCACCACTGACTGTGGAAGAGGCAGGTGCTGTCTCAGTGGCAGCAGTTCT
-GCAGTGGGGTTCTGGGGTCCAGCAGATGGCTCACTTCAGCCCTTACACAAATTTTGTCAG
-CAGCCAATTATTGAAGTATTAAATCCTTTCTCCTTCAAAGGAATTTAATACTTGTTTATA
-AAATCCTGTCTAGAGTGGTTTCTGTTCCTGGCACCTAAAACAAACATAATGGATCCAACA
-GCCAGTCACGGGCAGTGTATGTGGGTGGTTAAGGGATGCAGCAGATGCCTGGGTTTCTCA
-AAACCCCACTGGcgaggcgggcagatcacttgaggcaaggagttcgagaccagcctggcc
-aacatggcaaaaacctgtctctactaaaaatacaaaaattggctggacgcgggggctcac
-gcctgtaatcccagaacttggagaggccgaggcgcgcggatcacaaggtcaagagatcga
-gacaatcctggccaacatggtgaaaccctgtctctaccaaaaatagaaaaattagctggg
-catggtggcacatgcctgtagtcccagctacttgggaggctgaggcaggagaattgcctg
-aacccaggaggcggaggttgcagtgagccaagctcacaccactgcagcctggcaaggcag
-cgagactccatctcaaaaaaaaaaaaaaaaaaccaaaaacaaattagccgggcgtggtgg
-cacatgcctgtaattccagctacttgggaggctgaggcaggagaactgcttgaacccaga
-aggcagaagttgcagtgagctgagattgcgtcactgcactccagcctgggtgacacagca
-agactctgtctcaaaaaaaaaaacaacaagaaaCCACTGGAGATTTTGCAGAGTTGTGGG
-GAGGTTCCCACAACTGCTGCTGTCAAAAACAGCTAGCACATTGCTCAGGATGCAGCTGCT
-TGTCCAGAGGGGTGTGAAGGGAAGGCGGACAGGCACCAGGGAGGCAGTCTACAAACTGAG
-TGCACTGCTTACACAGGAGGAAACTGACAAAGAGGCCCCAGAGGAGGCAGATTCTAGCCT
-GCAGCTTCCCCATCCCTCAAAGCATGCAGGTTATGCTTCTTGGTAAGTCTGAGTTGAGGG
-TAGGTGGCAGGGGTTGGTGGTCCCCAGTGAAGTTTTTAGTAAGGTGAGACAGATTTGTAT
-CTTGAAGGATCACTAAGGCAGCTATCGAGGATGATGGATTGGTTGCcttgaacacttttg
-gtgacaggcagctcagaagctctaggggcaagtcactgtttttggacaactttccagctg
-agccaaagtcaacctttttgcctgcttccactcactgaATATGTGACCATATATGACTAG
-GCAGAGCAGTAGGGGGTGAACTGGGGAAGATTATAGGGGTTGTAAACTGGCTGTCAACAG
-ACACATGTGGACCACAGTTTTAACTGTTTGGTGGGTGTAGTTAATTTGAATCCTATTTCT
-CTAAGGTGAGACACTCTTTCCAATTAGTCACAGGCTTCACCTTCCCTAATGTCTTAAGGC
-AACTGGCTTCACTCACATGTTATTAATCTGGTTTTTAAACCCTTATTTGAGGAGTATTAA
-GGATTGAGGATGCCTGAGAACTTGTAAATGCCAAGGGACCCTTGGGGCTGTGTGACCCTT
-GGTGGCAGCTACAGGCTGGTCAGGCTACAGAGAGGAAAATGGAGTGGAAAAGTAGTATCT
-CTCAGATGCCCTCCCCTTCGTCTCATTCCCCCCCTTCATCCCCACCCCTTGCTCCAATCA
-GAAGGTCTAGAGGCGATGGTGAGTGGCCAAAGTCCCTTTAATATCCCTGAATTGCGTTAC
-AAGTAATACTGCTGGAGGTGGGGAAGGGATGGGGGTTTGGGGGTGAGTTGGGATAGGACG
-GAGGAGGAGCGCCAAGCGCTCATACAAAATATGGCCAAAAGGCTTAGCATGCATGGAAAA
-TTATTGCTGTCAGAAGTTGCTATTTACAGGGTCAACGCCTCCATAATTGCTTCTGCTACC
-CCTCTCCCTCCCACCATCCCTGCAGCCTCCCTTCCCGCTGGGCCTGGAGCTGAGCAAAGG
-CCCATTCACCCCTCTGGAGCCCTAGGGAAGTGCCCCTGCTGCAGGGGTGCCTCCAGTCTC
-CCCCCTCTTTTGTGGCTAAGAGGAGGGGAGAGGAGGATCTGAGAGTCCAGGACTCCTGCC
-CCCAAGCTGGCTGCAGAGCAATGGGGCAGAGGCGTGTGCTTAAAGCGGAGGGGGCCAGGG
-CCCGTGCGCGTGGAGGTGTGTGCTTCGGTCCTCGCCCGGGCATGCAAAAGCGCAGCGGAG
-GAGGTAGTGGCGGCCAACGGGCGGGTGGCTGGCAGCCCGGCCCCTCTGTCCGGGAGAGTT
-GCATAGACATGGCCGGGAGAGAGCGCCCCTCCCGGGGAGCAGGCCAGAGGCCCCAGCGGG
-TCCGGGGCTCAGTCGGTCCCTGGAACCTGGGGTCCCTCGGGAAGAAGAATAAACAGGAAA
-CAAATCGAAGAGGCTCCTCTCTCCGGGCCGCCTGGAGTGGCAGGGGAAGGTTCAGGAAGG
-TGGGGACCTGCCCCACGCCTGGACCTCCTGATGCTCCCTCACCCCCCCAGTTGAGGGTCA
-GCAAGCTGCCCCCCCATTCTCGAGTCCCCTTCCTTAGCGAGTGCAGGCTCTGAAGAGGGT
-GGGTTTCTCCCGAGACGCGGGGGTGTGTGTGGTGGGGGCAGCCCTCTGTGGCCTGTGCTG
-TCCCTCTCCTTGCCTGGCTTCCTGACCTCCCAGTCCAGCTGGGGAAGCCAGACGGTCCCT
-GGGTGAGGCCAAGAGATtaaatagaataataaatagataaataaataaatacacaaataa
-ataaCTGGAAGGACCCAGCCGGATGGGGGAAGGGCATTGGCGAGGTGCTCCAGACCTCCC
-CCCAACAAGTAAGGAAGGGGATCTGTGGCCCTGGGGATGGGGGAAAGTGCTCAGAGAATC
-TGGGGGTAGGGCAGCTCCAGACTGTGGAAGCCCAGGTTGTGCCGGGGTGAGAGAGGGGTT
-ACATTAGGGGGCAGGGCCCTGAAGTGCCCCTCAAGCCCCCTCCAGGTTAGGTAGACTCAG
-AGGGGTGAGAGCTGCTAGAGAGGTGAGGGCAGCTGGAGCTGGGGCTGGGAGTGGGTGATG
-AGATCCCCATGGACTGAAGACAGTAGGAACTGTGTGTGGGAGTGGGGTGTGGGGGTGTGT
-GTGTGTGTGAATGGCCAGACCTAAGGCCTGAGCATGGATGGGATCAGGGACAGATCGGAG
-ACTTCAAGAAGGGTGAAGATTAGATCCCCAGATGGACACACTCTGGGAGATTCAGCAGAG
-GCCAGAGGGATGGTCTGGGGTTGGACTGTGGTCTCAGGGCGGCAGGGCCTGCGTCCAGGT
-GTGGATGGGGAAACTGAGGCAGGTATGGGCGTCAAGGGTATAGGTTTGCGGCTTTCATTG
-GGGGCTCCAGTAGAGGAATGGTCAGAGAGATTCAGCTGAGAAGCGAGAGAAAAGATCTAG
-AAGTTAGAAGAGCAGCGCGGGGTCTGGGAGGGAGAAATTTCCGGCTCTGGGGCGCGGGAG
-AGGTGCGGACCTGGTGCCTGAGTTGGGAGCCTTGAAGGCGCGGACAGGGGGGTCAAGGTC
-CGAGGGATGGCCGGAAAGGATGAAGTGGGTCGGGGGACGCTGGGGAAGACGGTGTGGAAG
-TGAGTCGTGGGTTTGGGGGTTGGGGAGAAAAGTTCCGGGCCGGGCCGGGGGTCCCCACGA
-GAGGGTCATGGGCAGGGAAACGCAGCCGGGGCTGGGCGAGGGCGCTGCGGGCGCAGGTAG
-GGGGCCCGGGGCGCGTGGAGAGCGAGTTCCGGGCGCGAGGGCGAGGCGGAAGGCTCAGCT
-GGCCGGGCCGGCGGGGGTCGGCGGGGGTGGCTCGGCCGCCTTGGCGCAGGCCGCCTCGCA
-GTGCTTGTGGAGGTAGGACTTGAGCGCGAAGCTCTTGTCGCACTGGCGGCAGCGGTAGTG
-CTTGAAGGCCGAGTGCGTCTGCATGTGCGCGCGCAGGTTGGAGCGGTCGGCGAAGGCCTT
-GCCGCAGTGCGCGCAGCCGAACGGCTTTTCGCCGGTGTGCGAGCGCATGTGACCCTGCAG
-CAGCCAGGGCCGCGAGAAGGCCTTGCCGCAGACGCCGCACTTGTGGCGCAGGTTGTGCGT
-GAGCAGGTGCATGGCGAGCGCGGGCATGGACACGTAGGCCTTGCCGCACGTCGGGCATTT
-GCGCGCCAGCTGGCTGTCCAGGCTGCGGTGCGTCTGCTTGTGGCGGCTCAGGTTCGACGA
-CGTGGCGTAGGTCTTGCCGCACTCGGCGCACGCGTGCCGGTGcccgccgcccgcctgcgc
-ccccgcgcgccccgcgcgccccccggcgccccccgcgtctcccgagccccccgcgtcccc
-gccgcccccgccccgccgccgccGCGAGCGCCCGTCCGAGATGAAGAAGGCGTCCATGGA
-GTAGCTGTCGGTCACTGCCGCCTCCCCTCGGAAGTAGCGCGCCGACAGGCTCGACTGCGG
-GCTTTCGGGGTCGCTGTACTCCTCCGGCGCCGCCGGCGGGTACGCGGGCTCGGCCGGGGC
-CAGCTCCAGGCCCGGCTTCTGGTCCGCATCGTAGCTGCTCGGGGGCAGGCGGTGCGGGGC
-GTACCCTGGAGGGGGCGAGAAGTGGAGGGGCGGTGAGAGGAGGCGCCGAAGAGGGTTTCC
-CGCTTTGAGCGCGTCACCCTTTGCGCCTTCCAGCTTGGCGCCCCTGTGGCAGCTCCGACA
-GTGGTGGTCTCCGACCTGCACCTCAGCTCTTCCTGTCAGGCAGCCTGGGTTCAATTCCTT
-CCTCCATCGACGGCAGTGCAAATAGCCGCCACCCCAACCCACGGAGCATGGGGCCAGCAC
-GGTtgtacagagcgtaccttcactatccagtgctcacaaccgcggagtgatggtcttata
-atacccacgctacaggtagagaaactgaggcgcagagagatgcagcagtctaaccttaca
-gtcaggaagtgatggagcccttgccagtgtgaccctgaagcccatgctgtctctattcca
-acaacatgctgccGTTGCAGCCCTGtaacttctctggatctcagttttctcatctgcaaa
-atggagcttgtgattggacacctccttccagggtcgttggaaggactgagtaaagtgacg
-ataataagcgtgtgttaagctcttactgtttgccagactctgcctcggtgctttacgcat
-gttaactctaatcgtcacagacccaaggaagtcggcactattgtaatccccatttgatgt
-gtaaggaaatgaacaaagGTGGGGGAGCATACAGTAATTGCTATATAAATGTTAGCTATT
-ATAATTATGCTTTTTACTTGCTTGGAGATAGTTTCctcccccaccacactgtgagctccc
-catggttggatctgtgtgcccagcacatgcctggctcaaagtaggtgtgcgatgaataga
-tgttgcatgaaggaatCACAATCCAGTTAGACCCACCTGCCAGGGTTGCTGAAGCATTTA
-ACAGGGGTCAAGTGTGTGGCATGTAATAGGTGCTACAGAAAGGGGACTTCCTCGCACCTG
-CTCCCAAGCCTGCTCTAGAAGTCGTCGGAAGTCCGCAGTGAGAATTCCCCTCCCCCTCCT
-CCTCCCACTTAGCTGGAGTTGGACCAGGAATCCTGTCTGCCAAGGGTTTGAGTGATTGGT
-GGGTGGGCAGGCTGGGGTCTCCCTGGGGATTCCGTAGGGGATTCTCATGGGCAGGGGCCA
-TTCTGATTTGCCTCTGCCTCCCATGGCCTAGGCTGGTCCTAGCACCTTCCCTGAGACCCT
-GGGGGCTGGGCTCCCTGGAGAGTTTCTGGCAGACAAACTTTTCATCCTGGCACTTGATGG
-GCAAGTGATTCCATTGTTCTGTGATTCCACAGAACAATGAAGGTTAGGTCCGTTTGGGAG
-GTTTCCCACCTGGGGAGTGGGATTTGACCTTCTCCTGGTGACCCCTGAGACCTGTAACCA
-CTCCTCCTTCCCTCCTCCCCTAGCCTCCTTCACTGAAGTGAGCAGGTGGAGGAGGGTTTT
-GTAAGGGGAAACAGGGTTCAAGATGTTCAGACTTTTAGCTGGGTACTCTGGTCAGCTTTC
-GTTTCCCACACAGCCTGGCTGATTCAGCctccaggcctttgcctctcatctggagtttgg
-gatggacacagggtgaagtctgtgtgcccctgaaggcaagggtgtgcccttatttttacc
-tctgtcccttcagcagccagcacagggccctctgcacacagaagtcattgtggattatgg
-aagtggatgaCTCGGAAGCGGGGGGCTCTGTGGTTGGATGTAAAGGGGGATAGTGATAGT
-GGCAATTTTTTAATCTGGGGAGAGGAGATGCCCAGCCTCTCCGCACCCTATGTCTCCCGT
-CCCATCTGCCTGTGGTCTGGAGGTCCCCCTGCTTCCCACTCCGGGAACCAGGCCTGGTAC
-TCAGGTCCCAGAACATTCAGGAGTGTTGTTTCAGACTGAGTTAAATACCCGTCAGGCACT
-CCCAGACCCCCCTCCTTCTCCTTCTGTATTTCCTCACGTTGTAATTCCTGGTGATGataa
-taatagctaatattcactgagcacttactgtgtgcaccaggctctgtgctaagtgcttcg
-ctcccatcatctcactgaatcatcacaaaactactctcatcacagataaggaaactgagg
-gacagtgtggtgatggcacttgctccaggggtggagcaaggattggaatccactgccCCC
-TTGgtttcccacatactgggaggtcctccaggagggggctgtggctgagctgttcacctc
-ccattcccagggccctagctagtgggcacttaataagtatttgtggaatgagtgaTGATG
-ATTTGCGAGGCCAGCCTCACTCCCCAGCCTAGCAGGACCTGGTATAGACAGTCCTGTTCA
-CCTGGTCTCAGGGCAGGTCTGCATCTCATGTGTCTGGGGCCATGGAAGGGGAAGGGTGGT
-TTGGTTCTCCAACACAGATTCCAGCTGAGTGCCTTTGGGTGGGTTGTGCTTCAGGTCCTT
-TTTTTTTAAAATGGGATTTATCTGGAGGGGTGACTGATCACGTAACCAGTGCTTTGAGTT
-CTATTATTAAaggatgacatattggataagagtaaaactttggtgccagacggcctggat
-tgttttggctctaccattcccagcagtgtgaccttggccaaacgatttggcctctgtgtg
-actcTACCGTTTCAGTAAGGGGTCTGCCAGTAAACAGTATATAAACAaatgataaccagc
-actctcagagcactcctgtgtcaggcactcttacaagggctttccacacatgaaagcatt
-ctacccccatgacacacaaggtggtaggtacccttttatagaagaggaaaccaaggcaca
-aggaagctaagtaacaagcctaagattgtgcagctgataagttagagccaggattccagc
-tcagTGGCTGGCACATTTTAAATCCACCACGCATGTTGGCTGTTATTATGAACAATAATA
-ACAATCTCCCCAGATGGGTTTCTGTGCTGCAGCTTTCTTGGCATCTGCCCCAACACATCG
-TGCTGCTCCTCTCTGGGCCTCTGTTTCCTCACCCGGGATGTGTAATTTCTATTTCACGTT
-CTGATGGGAAAATATCTGGTGCATAGTAGGAGCTCCATCAGTGAACCAGAGCGTTCTCCA
-TGAGGTGCTCTGCCCATGGCGCCCTCTGCTGGTGGCCCTCAGCGCTGTTGACTTTCCTCC
-TGTTGCAAGGGGCTCTTTATGAAGAAATAGGGGTGCCTTCAACAAAGGCTGCTCATTTGC
-CTAGGGAGGGCTGCAGAAGTGTCTTCAGGATAGGAATTGTGAGCCCAGACCAGACACCCA
-GTCAGTGGATTTTGGCATGGGTTGAGAGCATCCTGTGAGAGTTTGTGTGGTCATGTTAGG
-AGGAGGTGGTTctaacttgctttgtgactgtggccaggttgcttaacctttctgggcgga
-atctatacatgacaaagatggactggaatggtctaaagaccctttctgcATCATGGCTGA
-ATCAGTCCCTCCATGATGCTCTTTGTCCCCTCCACTCCCAGCTCCTCCAATTCCACCCCG
-TTTTCCTCAGATTCACAGACATCTCCctaggcaaccttgggcaagttacttaacatcttt
-ctgccacacctgtataagggagttcataataaggctgaataaatgaatgcatgtaaagtg
-cttaggacaatgcctgacacataatagctgccctcttgagctgttattattGTTACTGGT
-AGTATTCCTGTGTTTCCTGGTGATATATCCTTCTAATCTGCCAGAGAGTAGGAGATACAC
-ATGGGTGTCTTAGGCTgctgtgtgaccttgagcaaaccacctcacctctctgagcctcaA
-CCCTGGAGACTCCTTTAGGACACTAAAAGCCATACTTTAACCTAATGCATGGAACCCAGA
-CAGGTACCTTCCTCTGCCCTAAGAGTGACTATAGAAGGCTGAGATACCTATCCTGCAACT
-GACAGGGTGAGACAGGACTCTTGTTTGGGTTCCCAcagagatagggatgagctgggattc
-agagaaaagagaatctcaggtgagatctctcatcctagcccttgaattcaggccgtagcc
-atgtgaccttgggtaagtcgcataacttatctgggctcaaatcctccatttgaggaatgt
-ggaccagaggcacccctgtcatgtagggatatggggaggGCCCAGAAATACTTTGGAGAT
-GTGCACATGTCACCTGGAAATGACTTTGGTTTTCCCTGCCCAAGAGTCTTGATATTTTAG
-ACTGAAGGTCCAGAATCTGTCTTTTTAAAAATCGGTACTCAAAGGAGTGGTGAAAGGGAA
-ATTTATGAGAACTAAGGTGCTGGGCCCTCTGCAGACACTGTCTCATTTAGCTGCCTGACC
-CCCTGCGGGGATGGAGGGGGATGTGTAACAAATACTGCTACTGCTACTGCTGGTGCTTCC
-AACTAGCACCAGCCTCCCTGTGAGCCAGACATTGCCCTGTGCCCAgaggcccagagaggg
-gagaggatttgcccaaggtcactgagagggaggcggcaggtttgaaaccctccaaggcct
-gtgttttttccaaaacaccaGAGAGGGCATGGAGACTTGCTGGGGAAGAGATCTTCAATT
-GGTAGGGGAAGGGGTGGTGCGTTTCCTCAAACACTCCCTAGTTAGCCTGTGGTGGGGTGG
-GTGGGGGCACGGGGTGGTGGGGGCATGGAGAAGCTGTTGTGGAAAATGCTTCAGCCTCTT
-GTAAGTATTTGTAAATCATACTTAATaacagtaatgcctatcacttactgagcacttact
-tggtgcaaggcatcctgctaaatgctttgtgcacattagctcatgtctaaggtcacttcc
-ctccatgcccttgttctgcagaagctgaagcccagacaaaggccttgacccacctcaggt
-cacaaaacaagttctcatcagagctgggttggcctccttttctttcctttttttcagtcc
-aggactcctttccccagtctctcccagACTCCCAAGGTGCCAAACTTTCTCCAGGGAATT
-CCTAGCCTCAGCCTCACCTCTCTGTCCTAAAATGGGCAGAAAAAGACAGGGGCCTGGTGG
-GGGGCCAGCTTCCCCGGCGGCCCACTTTCCTGAGGAGGGCTGGGCCCTGCTGGGTGGTAG
-GGGCTGGAGGAGCTGCTGTATGGGTATATTTAGAGCTGCTTCTTGCTGTGCCAGGGCCTC
-GGGCCTCGAGAATCAGCTCCAGCCAGCTGAGCAGAAAGCCAGGTCTGTCAGCAGCAAAGC
-GGGATAAAAATAGTTTCTCCTGTCTGCTCACAGAGCTGGGCAAAGGGGCTGGGTACCTCC
-CCCTCCCCTTATTATAGCATCTTTGTTAGCGGTTCCCTGGGCACTGGACCAGAAATGACA
-CCCACCTCCTCCAAAGGCCTGGCAGCTGGTACATCTGCCCACGGGGAGGAGGTCCCTGTG
-CCCAAATGAGCAGGGGACAGAGTGAGGTCTGGCCCAACATGACCAACGCTGCATGGCTTG
-GGGCTGATGCCCACTGACCCAGGCCCAAGGAACTTTGAGAGAATTTCAAGGCTTTTCCCC
-ACCACCCCCATCTCTTGGAATTCCCCACATTCTGGTCTTTCCTGACTGTGACCCAATTCC
-TGTGGCCTACAGGGAGGTCCAGAGCTCTGCAGGAATCAATAGGAAAGATTTTTCAGGGGG
-GTATGGAGATGAGAGTGAGTGGCTCAGGGTCTTCATTTGCCCAGCCTGGGTTCGTAGAGT
-TGCCTCCTGCTCCCTCGGGGGGGATCTCCAGTGGGCCCTTTCTGGGCCTCGTTCCGGAGA
-CTGGGTGTGTTGTGCAGTGCTCCACCTCTTCCCCCGGCCTCCTACTTTCTGCTCTGCCGC
-CTCTCTCTCTAGAAGGGTGCACTCAGAGGGCCCATTCCAAACCCCTCCCTATCCAAAGGC
-TGGCCTGGCAGTAGACGCTTCACTTCAGGGGAGTCCACAGCTGGGAAAGAGACCAAGAGG
-CCCGAGGGACCCCATCTCTCCCGGCAGAGGGCCTCCAGGCTGTGGGGGCCCCTAAAACCT
-GTGGATGTAGCACCCACTAGGGAGGTGTGACAGGGTGCACCGTTTATGCTCTtgtgactt
-tgggcaagtcacggcctctctgtgacctcagttttgcctctgtaggttggagtgaatCCT
-CCCCTGCCCCCCGCTGCCCTTTGCCCACTGTGGATTTGTGTGGCCAGAGAGTGCCTTTGG
-GATGTGTAGATTGCTGTACTGACATAAGGGACTTGGTGTACTCTCTGGCCCTCCTTCAGC
-AATCAAAGACTGAGACTATCTAAAGTGTGGAAGCTCAGCTCAGGACCCTCACGTCCCTCT
-CGTAACCCCAGGCTTTAGAGGAAATCAGGGGTTCCCAGATTCCATATCTCACATGGGCCT
-CATCATTCCACACTTCCACTGAGCCCTGTTAATTCACAGGAATATTAGATTTCTGGGTCC
-Ctagaaggtcaaagctgaaagagatcatattcaaccgtttgatattatgaaaggaaaaca
-gaggctgggaggagaggggagactaggccaaggccacacagaaggctaatggtgagtcta
-agacttgaactcagCCCAGCCTTGAGAGCGGATCTGGACAATGACCTTGGACTGGAAACT
-GGGCCTGAATCTTGATTCTGGACCCAGCACTTTGCCCTGGACCTGTTCATAGGTATTGAA
-ATTTGAAATTGGACATGGATTTGTCCTGGATAGCAGACCTGGACCTATAACCTCAGACAC
-TGACCTTGGACCTAGTCCTTGGACCTGGTCCTATACCTGAAGTTTGACGTAGGCATTGGA
-CTTGGACCTCAGATCTGTACTTGGATGTTGGACTGAATGTTGGACCTTGACCTAGACTTT
-GAACCTGGGCCTCTGACATGTCTTTAACCTGGACCTTGGACCTGGACCAAGGCCAAGTTA
-CCAGGGAAAGGGGTGGTTAGAGAAGACTCAGATGGGTCTGCTGTGTGTCCATGGGCACCT
-CCCCAGCCTTCTCTGTGCTTGCTCTTCCAAAAGACTGGGGAAGCCCTTTTGCATTGCTGC
-TCCCCAGAGGAGCTTTCTGAGGTGTGGAATGGATGTGTGGCAGCTGGGGACATTGGGCCG
-GGCTCCCGGGCTTGGCCTGGAGCGACTACCCGGCACCATCAGAGGGAGTGAGAGGAAGTG
-GGCGCTGGTTTAATGTGGTCAGCTAGATAAGCCCATGGGTAGAAGTAGGAGAGTTTCCTC
-AGCTTGCTGGGGGAGGCTTAATGTAGCTGCAGAGGGCAGACAACTGTGTTATTGGATTGG
-CATTGATCCCTCATCTGCCTGGGTTGGATGCACTCTGAGAGGGCAGGAGGGCAGGACAGG
-GCGGGGATGCAGAGGAAGGGGGGCCTGGCTCCAAGCTGGGGTTCGGAGTTAAGGTGGAGG
-GGAGGCAGACACTCCAGAAGATATTCTTGGCAGGGGCCCACAGAGACCACTGACATGCAT
-GTGGGTGGGCCACCTTCTTTGGGGTGGCTGAGAGTCCCAGTATCCTTCAGATGGGGGCCC
-CGGTCTGTGGGGAGGGCCTGGTGGAGTTGGAGGGTGAGGTTAGCAGAGGGTTAGGATGAT
-GTAAGTTGGCATCTCCCAGAAAGACTGAGTCTGTGCTCAGAATCACCCAGGGGAGAAGAG
-GGGAAGGGAAAGCAGTGGAGGAGCAAGAGAGGCATCTTACTTGAGGGGACAATGAAATTA
-GATCTATTCCCACTTATCAGGGAGCTCTGCAGAGAGACCTGGTGCTTTCTTCATTTGAGG
-GGCTCCCCTTCCCTGTTTAGGAGTTCTGTGGGCTTGGGGGGACCCTGGAGCACAGACAGA
-CTTGCTGCACCCTCTGTTCTGCCTGGCGGTAGAGGCTGAAAGGGAGTAGGAAGGCAAAGA
-AGAGCATTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgcgcgtgcgtgt
-gtgtgtatgGAGGAGGAGCAGGAGTCCTCCAGGAATTCTCCAGCATTCTCAGGCATTCCC
-AGAGCTGGGGTACACCTCTTTAATTTGGGGTTCTGCATCTTTATCAGCTAGGAGCTTGTG
-GTTTCTCTGACCTCCACATTCACAGGCTCCCCCAACCCCTGCTCCCCCGACCCAGGTTTC
-CCTCCCGCCAGCCTCATCCTGACCCTGCAGCCCGAGCTGCAGGAATGGCTTGTAAGAAGA
-TCTTTCTAATAACTGGAACTATCTCCAGCCCCAGGCCTCCcccgccctccctccctccct
-ctctccttccctccctcccttgcttctcctccctccctctcctcatcttccccccctccT
-CTCTTTCTCCTTGTTTACCCAGCACACTTACACACGCTGAGAGAGAAAAACGTCGGCTCA
-GCAATTTTTCACACTTCCCTCAAATGCTCAGCAAGGTTATTTCCGGCAGAGCGGAGACAA
-CGGGCCACCAGGAGCCGGCGGGCTCTCAGCAGACCCCCAGCACCCTCCACCCGCCCAGGG
-AATAAGGGATCCCTCACTGCCCAGTCTGGCCGCACCCCAGGGAGGGAAGAGGCCCCTGAA
-AACAAGACAAGGCAGACTTTGTATTTCCCAGTCATACCTAGGCTTGGTCTCTGGCACTGA
-CCGTCCACTGCAGACACTGCCAAGGTGGCCAGGCCAGGGTGCCTGTCCTCACTATGGGGT
-AGCCTACAGAGACCAAAGCCAAGAAAAGTGCCCGATCCCAGAAATGCCGCTACCCTCAGC
-CAGGTGGCGTATGTTCAGTGGAGCCCTAAGGAAACCCTGACAGTGGCCTCCCAGCATCCT
-GTTAGACCCCTGTGCAGGCATCTCCAGTGCCTGACATTCCATAGTTGACCTtcacagaag
-ctgagcttgtcaaagttggaaggatgcttagtttatgccatcaaaactctttcactgctg
-gggaggctgaggaccagagaagggaaggcacttgcccaaggtcacacagcatgtgagaga
-tctagagcccaggcctccaaatttcaggccaggtttctggctatcagcacagccTCAGGA
-TTCCTGAGAGGTGAGGGAGTTGGTCTGGAGACCCATGGGGAAGGGGACAAAGACAGAGGT
-GGTTCTAGGGTGTTAAACCCGGTGGAACCTCTGCAGAAACACCCTGCTGGTGGCTCTGCA
-CCCGCCCTGCTTCCCACTATTCACTCAGGGGCTCCTTTCAAAGCTTTTTTTTGGACTGAA
-TTCAAGGCAAGGCATTCTCTTGCCTCCCTCCTGAGGAACAGCCTGCAGTTTTGGCTGTGC
-ATGGGAAATTCTCTGGGCTTCTCTGGGTTTCCTCAGCTGGCCTGGGGACAGGACCAACGG
-GGCTTCAGGGGGTGGAATCCCAGAGCTTTGTGTCAGTGTCAGTCCCTTAAGAGATCCATA
-TCCCAAGCTTGCAGATATTTCAGTTTCTACCAGCTTTGAGCGCACACTCTCCAGCTTTGG
-CATGGCCCCAGGTCCACCCTCTGTCCTGCCAGCCCTCAGCCCTGCTCAGCCATGTCCCTG
-GGCTTCTGACCTCCACCTCAAGAGGCCCTGTGATCAAGAAAAGAGGACAGTAGAATAAGG
-GACATGTGGGCAGAGGAGAAGGGGTTTCTGTTAAGGGTCTGGGGGATGCCAGTGGATGAG
-GGGCTGTAGCTGTATCCCTGATCACTCTGTAACTTCTTTGACCTTGATGAGGTCACAAAG
-CCCTTTGCCCAGCACTCTCTCTCTCTCTACCTGGTGTGGCAGAGTGATGGAATGTGGGTG
-AAGTGCTTGGAAATCCCAGAGGTGGAAGCCCCCATCCTCCCAGGCTCCTGTCTTTGCCAT
-CTCAGTTCCCCCCTCATCCTCAGTCCTTTCTTTTCTCctctctcaatctccctctttctc
-tctctctctttccccacccccatctctctctctctctctctctcacacacacacacacac
-acacacacacacacacacacacacaACCCAAAGCTGCCACATGTGATGTCAGATCTCTCA
-CTACCAAAGGGACACCTCCTCTTCAGACACCTGCCCTGGTGGGGGCCATCAGGGGAGAAC
-CCCTTTGTGATCCCCTTGGTGGAGGATGGGATCCACAGAAGCAGTCTCCACTTTCCCCTG
-CCTTCCAGAGATCACCCCCTTCTGCACCTGAATGACTTCTCTTGTTCCTCAAACCCTTGT
-CCCTGCAGGAACTTGTTCTGAGAAGAGATGGAgtgtgtgtgtgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtatgtgtAGTGAGGAGGGGGCTTACGAGGAGCAGCAGGGTTGGTT
-CTGGAGGGGGTTGAGAAGCTGGGGATGGGGAAGGAGTGCAATCCAGGGGACCAGGAGCCA
-CTTTGGGGGAACCCCTCCCAGAAATCCTCTCTTTCTTGCAGTCCCCAGGACAGGCCCAGC
-CTTTGGCAGGCATGTGGCTGAGGGTAACAAAAGAGTTATTGAGAGAGGGGGTCTGAGAGC
-ACTTGTGTGACATCGGCAGGGGAGCAGGTTTGAAGGGAGGGAGGGCGCCCCCAGCCACCC
-CCAGGGAACCAACCCTGTCTCTCCAGGGACTGAACATCCAGGGCTCTTTACCTTCCCCCT
-TCCCGGGCAGCCAGCTTCTCTTCCTCAACGGGGGAGAGGGAACCCTCAAAGTGCCTTGTG
-CCTCAGTGCCCAGCGCTGGCCTTTCACGAGCAGCCCCGTCTGTGTTCTCTTGCCACCCCC
-TCACTCTAGCCCTATTTGAGGGCCACAACTTTCAAAGTCCCGGCTGGCGCGTGGCTGCGG
-GATGGGCCGACCCCGCGACTTTCCCTTTGTACGACCTAGCCCCTGCCCCGCCCGCACGGC
-CCTTGGAAAGCCCGGGAGGAGCCCACGGCCAGAGAGATCTCCTCCCGGGGGTTTCCTGTC
-GCACGCGCCCCTCCTCGTGGCCCAAGCTGGGGAGGGCCCCAGCTCCCCTCGCCTCTTCTC
-CCAACCCCCCGCCCCCGCCGGGTCCCACTCACCGTTGTCCCCGGGAGGCCCCCGGGCGCC
-AGGCAGCACGTAGGCTGTCTCCAAGGGGTGGTAGGTGGGGGCCGGCACCCCGCTGCACTG
-GAAGCCGTCCCCTTTGATCTTCTTTACCAGGAAGGAgcgcggcatggcgcggccggcgcg
-gggctcggtgcggggaggcggccggccgggcgcgATCGGCTGTGTCCGCGCGGGTTTTCA
-GCACTGGACAGCTCCCAGCGGGCTGGAGCGCGGGAGGCCGCTCGGAGCCGGCACCGGTGG
-CGGCGGCCCCGGCTCGGGCTCGGGCTTGGCGGCGGCGGCGCGCAGACAGGGGATCGCGGG
-AGCTGCGCTCAGCACTCCGGCTGCCGGCTTTATATGGGACGCAGGCTGGAGATCAGGTGG
-TCCCCTAGCAATGGAACCGCTCGGCGCTCTAATCCATCAAATGTCCCCCAGGACAATCGC
-TCCGCACACGTTCCCCTGAACCGGCGGCGGTGGGGGCAGGCCCGGAGCaggcaggagggg
-agaaagtgagggcgagaaaggcgcagagacagagagggacggagaaaggggagtgagggg
-ggcggggagaagaagagagactcggagaaagacagagacatacagggaaagagagacgca
-cacgctgagagaggtagaaatagaagcagagagaccaagataaggacaaaaagacacaag
-agagaaacagagagagaagaaagacagagaTGGAGAGAAGTAGCAACACACACACACCCA
-CGGGAGGAAAAGAGAAATCCAGGCACACAAAAAGGAAACCCCCCCAGGGATGCAAAGAAA
-GGGAAAGAAAAGTGCAAAAGAGAGGGGGAAGCCGAGGGGAACGGAGGGAAAGCGGTCCCG
-AGCAGGCGGGGTTCAGGCACATGGGGCCGCAGGGAAGGGGATGCAGAGGAAAGAGTGCGC
-ACTGGCCAGCGGCCACCCTCCCGCCTCCAGTCCTCTCCCTCTCCCCCAGTTCTGAAGTGG
-CCAGGGTGGACGCTCAGCTTTCACTAGAGTAAGTCTCCCCTCCCCCCTGCTCGGGCTCCC
-ACTGGAGCCCCCTGTTGGGTTTGGGGTTCAACTTTCTTCTTCCAGAACTGGTGGGGGGAG
-CAAGTCCCCCACGCCGATGCCTGGCCTTGCTCGGTTGGTCCTGTTCCGGTGCCTAGCTCA
-GGCGGGCGCTGCAAGAGGAAGTGAAAATCGTCCAGTAATTAATTTTCCTGCTGCCGGGGG
-GTGGTGGTTTTGACACATCCGAGGCAGTGTCTTTCCCTGAAGCGGGGAGCAGACAATAGA
-GACACGTGGACTgggaagggagaggggggaagggagggggagcgggGCTCCTGCTGGAAC
-TCTTTGCAGGTCAGCTCCTTTGTCTCTAAAAGGATCTGAGCAGACCCGCCACCCCCAGTC
-CGACCCAAACCTGGGGGAGCCCCCATATCTTGGCAGGACCAAGGAGCAGGAGAGCTCAGC
-CCCCTGCCCAGAGGGTGCTGGGCAAAGCCCCATGGTGGCGGACCTGCTTTAGCAAGTGTG
-GGATGGCCAGTGCACAAGAGTCCCAGAATCAGACTCTAGGAATTCCAGGCTCTCGCTGTC
-AATGGAATTCTGGTTATGAGATGCAAGGCTGGTGGAGTGGGGATGTCCTTTTGGGACTGG
-GTCATCCAATACCAGTTTGCAGGCTAAGACCTAGAGAGGGCTTGGAGGTGCTTGAGGTCA
-TGCAGTGAGTCAGCAGCAATTGCCAGAGACCTCAGTGGCCTCTGGGCACCACTGAATCAG
-GGCCTATCATGGTCCTTGAGGTGTAGCCCAGAAGTCTCAGAATAAAACTGGGGCCCCTcg
-tggtggttcaagcctgtaatcccagcattttgggaggctgaggcaggaggatcacttgag
-gtcaggagtttgagaccagcctgggcaacatagtgagaccttgtctctacaaatagttaa
-aaaaaaaaaaaaaattagccaggtgtggtggtgcacacatgtggccttagctacttggga
-ggatgtggtgggaggatcgcttgggcctgggagttcgaggctgcagtgagctgtaatggc
-accactgcgctccagcctggatgaaagagcgagaccctatctccaaaataataataataa
-taataataaGTTAGAGTTTCCAATGCAGGATCTGTTGGCCTTGAATATTTTCAAAAGACA
-TAAAGATGCAAGGATGTGGAAGCAGAAGGTTTGCCATTGAATTTGCCCTGTATGGTTTTA
-GATTGTTTTCCCTGACCGAAATAAGGAATTAAGGCAGTTTACTCCCTATATATAAACATT
-GAAAAACATTGCAGGTCCAAAACAATGGGGGCCCCTGATCTTGCCAAGGCCCTGCATGGT
-CTAGAGGTCCCCCACCATCTTTCCTGTTGCATTGCCTCATATCTTGCCCATGGGAAtttt
-ttttttttttgagatggagtttcgctctcgttgtccaggctggagtgcaatggcgcgatc
-acagcccactgcaacctccgcctcccaggttcaagtgattctcctgtctcagcctcctga
-atagctgggattacagggtgcgccaccatgcctggctaattttttgtctttttatcagag
-acggggtttcaccatgttgcccaTGGGACTTTTTTAAACCTCTGTCACTGAGAGTTGAAG
-TGACCACACCCTTGACTCATGGCACGcccatgcattctctgctccagccataggtgccta
-ctggtgctttgggcttgcagctctcttgacctgtataccatttccactgcccagagtcct
-tccctgcacttcaccctaggaaacccctacttgttctcaagactcagccgaggggtcact
-tcctccaggaggtgtccctgacttccatcattgcagactgggccaactcacccactggtc
-cctgagcttcatgaggacaaagactctgtcccatgtatggcttaacacACTCTTAACAGT
-GTGCATGAGGGTCttctagctcccctacttattagccataggtccttggacaagttactc
-aaccgctctgtgcctcaatttccccacttataaaatgggaataataattgtcactaccta
-agtgttgttgggagtgttagaagagttactacatataaagggcttggaatggtgactggc
-atatggtaggagttcaatGCTTGAGGGTTCTATATATGCAGTTTTGCCTGTAGCATGCAG
-CGCTCATTTGTTACATGTTAGTGGGATTctgtggaatgagtggtgaactaggcatctctg
-gtccctgctttcttgcagctgatcttgcagctgtccattcattgagtggatggacaccaa
-gcaagaaaatccttaaatcaacaatatattttcagatagttgaccagtgctgtgaggaac
-ataaaacagggtgagatgatggagagtgatggtgcctttaggcagggtgaccagcaaggg
-tctcctgggagaggtggcatgtgcacctagacttgagccagccatggaaggagcccagga
-aagagtgctccagccagaggcttcacaagttcaaaggctctgaggcaggaatgagcttga
-gcagctgaggacagcaagaaggGAAGGAAGATGAGTTCAACATGTTAGCAGGGCCAGACC
-CAGAGATTACTCCATAAATCCCAaatgaatgagtgaatgaaagaatgaatgaTTGTAGGG
-GTGAGATTCAGCCTATAACTATAGCTTACAACTGTGACTAAGTAGACCTATTGGTTGGAG
-AATAACTTTTCACTGTTTACATAGAGGAAGTTGCTTATTTGTTCAGTCATTGACAATTGT
-GGTATAGCCATATTTTTTAGTTTGTGCTGGGTACTTGGATCTCTGTCCTCTAGGGGTGCC
-TAGTTCACTGTGGGTAAATAAGGCAAGTGGGTGTCATCTAGCTCACCTCCACCTGCCTGA
-TGGTTCTACCTCTCCAACCTCACATCTAAGAGATGGCAAAACGGATCCCAGAGTCCTTAA
-AAAGGAATATAGGTCACAGCAACTTTTGACAGAGCTGGGACTGGACTGTTCTCACTGGGC
-AAGATAGTGATCCACCCCTTAACTGATCAAAGGAAGCCCCACAGAAATGGTGTATTAATA
-GGTCCTGCAGCCCACTAGTGTCGGGTTGAGGATAGAACCCCAGGTCTCTGACCACAGGTT
-GGAAGGTGGTGTGGGTGCATTTAGCATATGAGAAGAAGCCTTGAGCCCTGAAGATGAGGT
-TCCAAAATACCTTCAGAGGGGAGGAGGCCTTAAGTATGGATGAAATACACAATGGCCAGC
-AGAATTTCATCACTAGGACACCAGGAAGGGCCTTCTGTCCCCCAAACCTCCCCCCACCCC
-AGCTTACTGGTTTcaggaagttcactgtggggaattaatttctctaagtcacatgaaata
-aggaaataacttttattcccaaggatgttcgctgcagcatcagagatggtaataaaaacc
-ctgggttggagaaagcaaggagagggttgtgaagaagacgttcactccatgtagtattct
-gcagccattaaaaattctcatttggggagaaaagctcataaaatgtgttaagtgaggggt
-gcagaatacagaaacctctcacagcacgttcacaaccatgaaccaaaacaaaaataaaca
-cacacAAAAGAGTGAAATAAGGGTCTGGAACTATGGGGTTTCCCTCTCCCTTCTTTTTGT
-GTTTTCCAAAAAGATCATAAAATATTTCAGTTCagccaggtgcagtggctcacgcctgta
-atcccagtactttgggaggctgaggcgggtggatcacgaggtcaagagattgagaccatc
-ctggccaacattgtgaaaccccatctctactaaaaatacaaaaattagttgggcatggtg
-gcgcgcgactgtagtgtcagctactagggaggctgaggcaggagaatctcttgaacccag
-gaggtggaagttgcagtgagctgagatcgcgccactgcactccagccttgtgacagagca
-agactccatctcaggaaaaaaaaaaTAGTTCAACAAATATTTATCTTGAGCACTTGCTAA
-CTGTCACTTACTTCCAAATAGAAGAAATGCTGAAGTTTAGTAAACCATGTCAGGATATTC
-ACTATTCATTCTTCTGACTTTTGGGAAGTTGGCATTGTGAATTTCCCCAGTGGCAATAAT
-AATTATTAGTACATCGCCAGCAACATTACAGAGCCACCCCACAGGCCTGGCAGTGTGCTA
-AGCACTTTCCCTTTGAAGAAGGTGACCTTgcctggggctttagattgagggatttggagt
-cagcctattttcagtttaaattcctgctctgccatttcccgactgtgtaattctctgtgc
-ctccattttctcatctgtaaaatgggtgtataaattgggcctgtctcacaaggttgcagt
-gaggattaaatgataatataggcatcaagtgcttagagcagtgcctggcacacaataact
-tgataaatgttgacagttgctatttacatatcctcacttatctaagccttaccatggcct
-catgggagaaggtgctgttattGAAATGACTGGTTCATGGCTACATAGTCACTGTACAGA
-GGAGCTAAAGAGTGTCCCATGTCTTCATGGCCTACTGCCTTCCTGCCCAGGAGCCCCAGG
-TCTTGGCATAATAGGTCTAGCTGGCTGCAGGCTTAGCCCTCTCTGGCCTACCTCGTCTGC
-TCTGGCATCTTCCATATTTCAACTGTGCCCTGCCCATCAGGAAGAAGGGCAGTTCCCAGG
-GTCTAGGTGTGAGTCTCAGGGCTGTGTGACCCTAGGTGGCTGGCAGAGCCACCCTGGGCC
-TCACCCTGCACATCCATAAAGAGGGGTTGGGGCATCCTATGATTCACTGGCTTCACTCTA
-TGGGGTCAGgaaggagcactgacctgggagtcaggagcccagttccagccctgcttctgc
-tccctttgccctcccctttgggccccagctttcttgtctgtcaaatgggaatgggacaag
-atggtccctgagctgctgtccagACCCGGTAATGGAATTCTGTATGAATTCCAAGGAGGA
-GAGTAGCCACAAATGCATCCGCTCCACGCTGATGGGGCTCTCTCTCCGGTAAGCTTCACT
-TACTCTGCCATTTCTCCAGTGTATTTTATCAGACCCACCTCCTCTGAGCCAAAGAAAAGA
-GGGTAGGAGCAGGATGAAACAAACTCACAGCTCTGTTCATTCAGGCTCATCACAGAGATG
-ACTTGCCCAAGGGCATGTGGCAGGTCCTCTGAAATTTGAGGAAGGCTGTGTTTTCTTTtg
-tgtcactttggtcctccgggaagcagatgtgaaaatggaggtgtaagtgtaagagattta
-ttgagaaaacaccgtgagaaatggaggagagccttcagagagggatgcaggtctgatact
-gtgaaaggagaggtggaataaagaaagattggggaagaggagcctcaggccatggtgcag
-gtctaaggaagtcctagccaacccaacagggagctcctgtgcaaagatttcctgtagagg
-agtcccgtgctcgacagaagggcagaccctagtttcccaccatgctcagtcatcagccgg
-cctgtcctggaagagtggctgtgctgacaactatggcagattgcaaaggtgttgcagctg
-gaggctctcagtgactgtagtccagagaagatctgagtggcacctccctaaggctgccac
-aTGTTTTTCTTTATTCATTtaatagacacttacagaactctgggccatgtgccagttact
-gatctatgcactttacaaatattaccttagttaatccttaccctcgccttttgagacaga
-tggtatttttagccccattttatagagggagaaactgagcacaaagaggttaagtaagtt
-gcccaaggtttcacagccagtaggtgataagccacaaatccaacccaggcaagctgcttg
-gaggctctgctctgaccactccaccacactgCCTCCTCTCCAGCTGCAAATGCCTTGGTG
-GCAATTTCTGGGACCATTTCCATTTTCATTTTTCATTGGCTCAGGACCTCACAGCCTTAA
-CAGGAAGGGGCCTACTGTGGTGGCTGGGGGCATAGCAGGGTCCCAGCTCCCCCTGAAGCT
-TCTAccttgctccctcaaagacttccacctcaaagcctttgcatatattgttcccactgc
-ccagagcactcttccacccccttccttgcctaggtaacccctcctcCCATCGCTCCCTTG
-CCTGACCCCAGGATCTAGCCCAGGATAGGGGTGATATGTAGTGGAAAGGAGCTagttgac
-atttattgagcacttattatgtgctaggagccaagtccagccctttacatagattgcctc
-acttaaccatcataacaacctgtgagtgtggcccatggctatccccattttacagatgag
-gaaaccaaggctcacagatgcaaggtgacttgcccaaggagacccagctaggaatcagtg
-gtgtcagtatttaaaccaggctgcctggctacaaagtcctgatcttAAACCATGAGTCCT
-TCCCTCTAAGAGGGCAAAAGATACCAATGCTAGGGTGGGTAGGTGAGGGCCCTCCAAAGA
-ATGTCCCTCCCCTtccccctgccagggctgacagctccttgagtgggattccggatctgc
-tccattcattgccgcacctccatcgtctacccagagccgggtaaatagtaagtgctcagt
-aaatacatcaattgaatgaataaaCTAATGAGTGAAAAACCTTCTTGCGACCCGCAGTCA
-CCTTGGTCCCCTTTGACCAGAGCCAGGTTGACGTGTCAACCGTCAAGATATCCCTCTGTT
-TTGGGTGATAATTAGATTTCTATCTTGACTGTTACAGACATTGGTATTCCTCCATTAAAA
-TGTCTTTCTTTCAggccaggtccggtggctcacgcctgtaatcccaacactctggggggc
-cgaggcgggtggatcacctgagttcaggagttcgagaccagactggccaacatggtgaaa
-ccctgtctctactaaaaatacaaaaatcagctgggcatgatggggcgtgcctgtgatccc
-agctactcaggaggctgaggcatgagaatcgcttgaacctgggaggaggaggttgcagtg
-agccaagactgcgccactgcactccagcctaggtgatggagtgagactctgtcttaaaaa
-aaaaaaaaaaagaaagaaagaaaaGAAAAAAAGTCTTTCTTTCAAAGTTGGAGACATCCC
-TAAACATTCTAACTCCTGTCCCTGACAAGGTCCCATCTTAAGCAGGTCTCTGAAACCTCT
-GGAAGAAGGAATTGGCTATCAGGAGTCTGATCACCAGGCTGCCTGCGGGGTCAGGGTATT
-TGGGGTGGGCCTCTGGCATGGTTTAGCGGTGGGCTGGCCAAAAGCCCCTAGACAAGAGCC
-CACCATTCAAGCAAGTGGGATAACTCAGCGTTTGGGCCTGGGTCACCCTGAGCCAAGttt
-tattttttatttttattttgtagaggtagggtcttgctctcatccaggctgtagtgcagt
-gttgtgatcatggcttatggcagccttgaactcctggggtcaagtgatcctcctccctca
-gcctcctgagcagctgggactacaggtgcatgccaccatgccctggctaatttttaaact
-ctttgtagagatgggattttgctatacttcccagactggtctcaaactcttggcctcaag
-tgatcctcacgcctcggcctcctaaagtgctgggattatagatgtgagccactgtacctg
-gctgagccaaattttaatcctggctctgcctcttcaagctggttggccctgggcaagtta
-ctttgcctctttgcagctctatttcatctctgtaaacagaggccagtgggagcacctgct
-aagtagggctgtAGGGGGCTTCATGTATAGTCAGCCCTTGGTAAGTGGGAGCTCTActtg
-aagggcctttgagataacagcattgtctcctccccacccccatttgacagttgtggaacc
-tgaggcatgggacagggaaatgctttccctggaacattcaggctccctgccaagtcagga
-tgggcttcctcactccaaggtggcctctctTGCCTCCCTCTCTTCCCCACCAGCCGAGCT
-CAGAACCATGCCTGGGAGATGCTGAGGTGGCAATGGAGCTGCAGAGTTGGCATTTCCAGG
-CTCCCAGGACTCCTGGCACAGAGGAATCAACCCCTCTCAGCAGCCCCGGCTCTGCCTCCT
-GCTCCCTGCCTCTGCTCATATACCAGCTGGGACTCATCAGCTTCTAGAGAAAGCCAGGAG
-GTGGCCCAGGTGCATGGAGGCAGGGGGCTGTCAATATTGACCTGTGCTTGACCGCAGACT
-TTGCCAGTGGACAGGTTGCTAAGGAGTCAGAATGTCCACATGCCCCTAGTGCTCATCTTC
-CTAGCCTCCCATCTCACCTAGCTGCAGAGGGGGAGGGGgagcacaagagttgaaagcgtg
-gatgatctgggttcacttcggctgcttaccaacaagttacccagcctggggaagtttccc
-atcctctttttatctcagtttcttcaactgttacatgaggatgttgatactaatggctta
-tcttgaagggcagatggaagatgagtgaggtgtttgcacacagccagtgctcaataatat
-tggccattgttAATTCTGAGGCTATCCTCTTACAGTGACCTCTTGGGCCTTTCAGCCCCA
-AGGAGCCTCTCCTCTCTCTGACTCCTGTGGCTCTGTCAAGATCCTGCAATGAAATTCTTC
-TGGAACCCTATCCAGATGGTGAACTCTTCAAGGGCGGGGACCCCATACAGGTGCCCCATT
-ATAGGCCTGGTACACAACAGGTGCTCATGAAAAGGCCTGCTTGGCTGTGATACtacatga
-acttacagaaccctcacaactacttttggaggcatatgacatgattatccccttttataa
-aaagggggacagtgggtaacatcgaggtgaagaaattgcccaagcagctgggcgcgatgg
-ctcacgcctatagtcccaacactttgggaggctgaggtgggtggatcatttgaggccagg
-agttcaaggccagcctggccaacatggcgaaaccccatctctgctacaaatacaaataca
-aataataataataataataataataataataataataataataataatagccaggcatgc
-tggcatgcacctgtaatcccagctactgaggctgaggcatgagaatcatttgaaccggga
-ggcagaggtaagagggagccaagatcgggccactgcattccatcctgggtgacagagtaa
-gactctgtctcaagaaacaaacaaacaacaaacaaacaacaacaacaaagaaaaagaaag
-aaaaaaattgcccaggggctcacagctataaatctgcagatacttattgtgacctgccat
-gtgccagacactgtgctaagagctggggacacagcaatgaacaagacagagacctgctct
-catgtggcttacatcctgctgagccaagagtaggtagatatgccaatgtcctgtcataga
-aagcaccaggcagggaaatgggcaaagacagagagaggtggaggccgggcgcggtggctc
-acgcctgtaatcccagcactttgggaggccgaggcgggcggatcacgaggtcaggagatt
-gagaccatcctggctaacacggtgaaaccccgtctctactaaaaatacaaaaaatcagcc
-gggcgtggtagcaggcgcctgtaatctcagctactcgggaggctgaggcaggagaatggc
-gtgaacccgggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgg
-gcgacagagatagactccatctcaaaaaaaaaaaaaaaaagagaggtggagcgagagcca
-ttttagatagggtagtcaaggaagacctctctgaggaggtgacttttgtgtagagtccag
-aatgCAGCAAGTGCTGGGTGAAGCCTCAGGAAATCTGCTTTAGCATTGCTGTGGCAGATT
-CAGGGTGGAATCCAGGAGATCCCAGGACTGGTGGTGCCTAGAGCCCAGTTGGCTAGATCA
-ACTTCAGTGTGGATAAATGACTCCCCTGCCCCCGCGAACTTACCTTCCTGGAGCAGTTAA
-AAGAACGgggcacatgacctagattctctgagcttcacttttctcatctgtaaaatgggg
-attgaaaagcatagcttacaattctgagagctgagttgattaacagagatggtccatgta
-aaatgctgggctcagagctgggcTGACCAGATTCACCTAGTCCTTGGTGGCTGGAGTGGG
-CAGGTGACCTTCCTTTTGGCCGTCCAGCACCCTCCAACTCCTTGCTTCTGAGACCTCACC
-TCCCACTCATGGTATCATTGCTGGCCTTCCCAGCCCCGTCTTGGCCAGGGGGCAGTCAAG
-TGACCCAGATTAGCCTCGTGccattctgttgagggtgtggtggttgctacattgagtgtc
-cagaggtagcaaggactaaagtcctggtgtcagcatccagcgttggtgtcagcagcacga
-gctctgtcttggggacccgtggtgtcagcagtgaagtctccctcaggccagggctttggt
-ctgatttgagggcttttttcttttctggatatgaagcctgtaagccttctgaccctcctg
-gagatcctTCAGGCACGTCTGCAGCCATGGGTCCTGGATGATTTAGCAGCTCACGCCATT
-GTCTGGAAACTCCACTGGTACTATTTTTCTCATGTTCAGCTCTCTGTGCACAGACTCCAT
-CCTTCTGGCCCAGATGGCCCCTTGGGGATATGCACATACCAAGTTCTTTCCACTGTCCTC
-ACTTtgagggcaggggcctgggttgttcatttttgtgtccccagatcctagcacagagcg
-gctcagaggaaaggctcaatgcatgtccatggtgtcaacaaatCAGTGGcacaggataca
-gtttccacacatctccccatcctggttgcttccccgaaccattttccagtctgtcagtgt
-tcttctgaatatacaggatccagaactgagcacaaaactccagaaataggtgaatggagc
-tgagcagaatgaaactgtcacctcccttaccgtagataccggacttctaattacatgacc
-agacatttaataagcttgttttgTTTCCCTGGGTGGCATATATCAAGCTACTAGCAAGCG
-TTTTGTTTTCATGGTCCTCTACCCACATATTGTTGCAAAACCTCACTTTACTGCCCTTCT
-CCCTTAATTTCACGCTTATAATAGTATTGCCCCTCTCTCACTTCCcaggaatgccaagtc
-gattacagctcaagagcccaatcttgactggtccgtagcctggaacatggtgctgagata
-gatgctgtaactgagtttgggctcactgagaaagactgctgcaattgattaacgatgtct
-gccaAGCTGTGTAAAGTGAAGTAATGTCATTCCCTATCACAAGtcctaacctggggtcca
-tggaaagaatttagttggtctgtcattaacttggatagggaaagtattacatctttaatt
-tcattaacctctatctgaaacttatcattccttcaattatgaatgcaggcaacagaccac
-agtggtattagcaggacctgtgactttgtcaccaatagaaatcacagattttttaaaatg
-acattacagacgttccgcatatcttgaaatataatttacatgcactgtgacttggaaatg
-ataagttattTGCTAAGTactcatttacttactcacatttgtttagcgcctagtcaatag
-cctggtgacgtgccaggacctgggctgggtgctataggcaaaaggcagatgcgtaaggct
-cagtccttccctcaaaagagaaaagcagacagtgacaatggaaaggcttgatgctttgat
-gggggaagtacctgaggcccccaacccagcccagagggatcagggaaggcttcccagagg
-aagtggcctctcagatgagtaggaagtaaccagacccctgagtgctgagaaaaagtgttc
-agggagcagaaacagcatgagtaacgaagctaggaaagaaagagGACACAGGGCTTACAA
-AGTATTCCATGGCGGGGATGGGGAGGGGAGGAGAGAAGCGGGGAGATGGCTGGGGGGGTC
-AGGCAGGCCCCTGGAAGTCATGCTTGGCGGTACCCTGGTCGTGGGGGGGAAGGGGTGCTG
-GCGCTTGCTGCCCCATCTGTCTCAGTGGCATTGAGCTGTGACTTCAGTGGCCTGGGGAAG
-TTCAAGGTCACCTCTGGGGTGGAGGAGGTGGAGACATCTCACCAGGGCTGGCAAAGGCCA
-ACTGGGAAGCTGGGGCCGATACCTGCCCCTCACGGCAGCCACCACAAGGGGCCTTCTGCT
-CCGAAGGCCCAAGCACGCCCTGTTCCTTTATTTATGGGCCGTGTGAGCAATTTGCTGCTT
-GCTGGCCGGCTGGCTGGGTGTGCGATGCGGGGATTACTCACGCCCCAGTTGTGGTCCGGC
-CTCTGCAGGCTGCGGGGTAGTGAGTGAGGTAATTAAGTGTAAAAGATGGAGCAGGCAGGG
-GAGGGCTGAGGGCGGTGAGCAGTCACTGGTTCTTTTCAGGAGCAGGGGAGTGAGATAATG
-TAGGATAATAGCCTAGCCAAACCCTGCCCAGGCAGCCCGGCCTGTGCTGAGAGGTGCCCC
-CCAAACGGCCAAGACAATTCAGCCTTTTCAGGGAAAATGGGGGGGCTTGGGCAGGGCCTG
-GCTCCCAGGGACAGCTGTATGGAAATGACAGCTCCTCTCCTTCGTCCTGTCCTGTGTTGG
-CTCAGGGTAGGGGCAAGTGTAAGTGTCTTCAGCTGGGGATGAGGCCAGGGCAGGGGGCAG
-TAGATGGGACCAGGAAAGCTGGTGGGTGAGAGGAGGGATCCATGCGGGGCTGGGAGACTG
-ACCTGTGTATGTGGCACAGgcacagtggttcgtggcagcagactccagggcctgactcac
-ctggtggaaactgtggtgtggctttggctagctgtgtgacatcagcctagttgtggtcct
-tctctgagcctcaggactctcatctgtcaaatggggctgtcaaacaattcctacttcccg
-ggggtgtttggagaatGGTTCGTAGCGCCTGATGCACAGGGGCTACGAAATGCTTGACAT
-GGTGAAGTCCAGAATCAGAGTGCATTAGTCattcactcattcagtggataaatgtttatt
-gagtgcctaccatgttctaatggttcctgggaaagcagcagtgactagaacagagtccct
-ttcctcttggagatgacattctaagaggggagacagaccattaatcgtgaaacacataaG
-CATAAAAGGTCATAccagcaatcccacttctgaaaacttattctatagacatgtttgcat
-acatgtggaatgaatgcattcatggttatttattgcaattttgtttggcatagcaaaatc
-ttagtaatgatctaaatgcctgttacacatgggctgactgaagtatggaatattatatag
-ccattaaaaagggtgagaccatttctatTTCTgtttatttttatttactttttttagaga
-tgggatctcactatgttgaccaggctggtcttaaactcgtcactggtgaGACCATTTCTT
-ATGTACTGATATAGAAAGCTCCCTAAGATGTTTTGACAAATAAGAAAAGGAATGTGAAGG
-ATAGTTTCTGTAAAAGAGGAGACAATTTGAAAAATGTATTTCTATTAGCTTGTGTATATA
-TGAAACTAATAATAGTTGTTACCCAAGGAGAGGAGTAGGGTTGGAATGAGAGACAGGAAG
-GGGAGAGTTTCACTGTATACTTTTCTATAACTTTTATTTTTGTATGAAGTGAATGTATTA
-CTAGTTCAAAAAAGAGAAAATAAATATTCAGCTTCCTCTTTCCTCCTTTCCTTCCTCAGC
-ATTTGTTGGAGGTAGCTGTTGAGATTTGGGACTAAGCAACAAAGGCAGCTGAGTGAGGTG
-GTGGCTCAGTGTGCCTGGggattgaacaaacaggttcatatatcaaggataatgagagcc
-aggttgctcagcatcagagaagggaattacaagtatgaaaacaggaaaggctagaaagaa
-ccctgtggtgttagattggagttagaggaatcagtgtaaactcatagcttttgatatata
-tagttacataagcatgcatgcaagtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtg
-tgtgtgtgtgatgcatatgtgcatttcccagttctgtccaaaaagacagcaataatcaat
-acaccatgtagccacgaatacacctaacacctagatcttgggttttaaatactattctcc
-actgaaaggaactggggcttgggaaaatagtagatttgagggctggagcaggaaaagtgc
-cctgtgcctggtaccatggtacatgaaacatctagctgtgccatatgataggcaagtgct
-caagtaatgctgaggacatgtcaaaagaccaaggtgccaacttaaagggactcccaatgg
-ccaaatctgggacaacttgagtatcaaaataatgacagtaacagattataagccatgaaa
-tataaatagtcctgatatacagacacatacacgtattacatacacacatacatacataca
-cacatgtgcagaaagagaaagctctttcttacactagaatgcccaataataggtgtggaa
-ggaaggatgcaactagtatggtaataattgattcaaacaagaagcattactagatgctaa
-aactaaagccattgtgtgaaaatttgttgaggagtaggatatttacatagtcttaaagag
-tctttccacaagatacaatacctgcaaaaggaaggagagtgactttatagcgaagaaaca
-tggcagagactatcttagtcgagtgatcaaaggctgcatcactgttactggacaaactga
-catgaggctcctgatgggatgcacagggaagagtgaaaaatcacttctgtgatgttcctg
-ccagagatgcaaaactgaaatctaatcacgaggagccgtcacataaacccaatttgagga
-accttctacaaaacaactggcctgtaacctgggtaagtatcaaggtaatgaaaggcaaag
-aaaaactgagggaccgtcacagattagaggagactaaagagataagacaatgaaatacaa
-tgagtaattctggatggatctttttgtttattataaaggacattattattgagacaatgg
-acaatatttgactgggctctgaagattggatggtagtaatatatcaatgtcaatttcctg
-attttgatgattttattgtggttatgtaggagaatatacttgcttttaggaaatgtacac
-taaagtattccaggataacagggaatcaaattgacaatttactctcaaacaattcaaaga
-aaatctctctatatataaatctctaagagagaatgataaagcaaatatgtttaaatgtca
-atatttggggattctgggtaaacaatatatgagaattctttgtacaatgtttgcaactct
-tctgtaggtttaacattattttacaataaaGTTATTTACATGAAACTGaaaccatatgat
-gtcaagtaatgataagtgatatatagaaaaatcaagtgggcagaggaacagaaaatgagg
-gggtggtgctattctagatggtatggtccaggcaggcctctctaggggaggacctttgag
-cagagacctagtgggagggagggagtagctccatggatacttggggagagtctcaaaggc
-cgagggacccatctgagaaaaggcccagagtgggaccagcttggcctgtgtattagtgtc
-tattgctatgtaacaaatcatcaccaacttagtggcttcaaacaacagccatttagctca
-cagttctgtaagtcatcgtctggcacagagcaactgagttctttgctcaggatattacaa
-ggtagaaaccaaggtgtaggttgggcttagttcttatgtgaaggctctggggaaaaaatc
-cacttccaatttcattcttttcttttcttttttttctttttctttttttttttGTGCAGT
-TGCagagaggaaaggaggaaatttttcgatagaaaaatcttggagatcctgttgctgtca
-cccatcgggctgttggaagctggggttagtccagaagtcttcaggtaatgccagggtgtt
-gccctggccaggaactctcagttgcctctgaacttcttccagccccacatgatggctaag
-ctctccatgaaaggagaccagttggaaacaaagccaacattcccagcaccctgagggcac
-tgaaggattggctaagttctccccggcaagcctgttccctgagaaaatggaggacagagt
-ccttaaaatgaaagagctggggtctgtgcctatactcactctttcaatgaatctacgtcg
-gatcccaggcaggcccccacaatgaagtggtgttgttcaactgaggtaatacccaaggtt
-cgttgtctcatggccacagaaaactaggactcggacacaccagagtgaggttaagagcag
-aagtttaataggcaaaagaaagagaaaagctctctctgttgcagagagaggggtcctggc
-gaaaatgggttgcccccaagttcattcttgttgttcgcaatgttcagcgtcttgcggttg
-tgggactgaccgtaacagacgatttttttgttggctagaagccacctgcattccttgatg
-tgtggcccctccatcttcaagtgagcaatggtgttttgaatcctccttatgcttcatgtc
-tttgacttcctcttctgtgaccaaccgggaaaaactcactgctttaaaagggctcttagg
-attagatcaggtactgtgttagttcacttttgcattgctataaagaaatacctgaggctg
-ggtgatttataaagaaaagtggtttaattggctcatggctctgcaggctgtaccagcata
-gctctagcatctgcttctggtgaggcctcgggaagcttctaatcatggtagaaggtgaag
-ggagagcaagtggtgtcacatggtgagagccagagcaagagagagaaggggagggtgcca
-gattcttttattttttatttttgttttttgagacagagtcttgctctgttgcccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctccacctctcgggttcaagtgactcc
-catgcctcagcctcctgagcagctgggactacaggtgcacgccaccatgcccagctaatt
-tttttgcatttttgttagagatggagttttgccatgttgctcaggctggtctcgaactcc
-tgaactcaggcaatctgcccaccttggcctcccaaagtgctgggaattcaggcatgagac
-atggcgcctggccccagactcttttgaacaagcagatctgtgaactaaccgggtgagaac
-tcacttattaccaaggggatggtggtaaaccattcatgaggaatccgccccggtgatcca
-atacctcccgccaggcccacctccgacactgggaatcacatttcaacgtgagatttcaga
-agacacacatccaaaccgtatcaagcatacccagagattttccgtatcttaaggccattt
-atgccaaataacataagctgatcacaagagtaaacgccaccatattcacagcgcagggta
-ttttacaggacatgtacacaggatggggaggactgggctgaaatcctggaggccatctta
-gaatctgcctatcataGTtgccggggttgagaaacaagaaagccagtgtggctggagcac
-agtgaacaagggggtgcagggaggagagacagcagagTATCACAGGTGGAGAGACACATA
-TATACCACCTAGCCTGATGGGAGGCTGAAGGCCTGAAAGTCACCTTGTGCAATTTTGGTT
-CCTGAGGAAGGGGAGGGTCATGCGAGTTCCTCCATGGATTCACTTGCACTAAAAAGCACC
-CCTGGGGTGGGACCCAGTCGATGATGGAAGTCAATGGAATGCGTGTTGAAGAGTAGCCCT
-TGGAGAACCAGTGGGCTGCTGGGCATAGGTGATAAGTTCTGCTCTGTGCATTTGGCCCAG
-TAGGCACAATGCCAAGAAGCCATGGGCTCGTCAAGGATCCATGGAGAAGTCTGAAATCTA
-AAAAAGCTGGCTGGAAAAATATTTTAAAACTTTCCAAACTTGAAAGACTTAGTGAAGTGC
-CTACCAAGTAGCATTGTGTCAATGGGTCATGAGCAACGCCCAAGTCTCCTAATAGTTACA
-TATGCGTTCTATGTGATGTGACTGCATTTTGTTTCCATTTTAACATTATTGTATTTATTT
-TTTCGTAGTATCATGTGCAATGTACAAATAAAAAGGAACAAAAGGAGATGCCCTGAAAAG
-CAAGTCTCTCTCCCACCTCTGACCCCCAGCCACGCACCCTCTCCCCACTGAGGCGTttcc
-tgtactcaaaggtattttgtgcacatgctaatgaacatgtatatatacacctgactcctc
-cccttttcacaatggtggctgttctgcctgctttttttcttttttcttggcagtacatct
-tggagatgtttcctattggctcatgtggagctgcccattcttttgtacagcagcagagca
-gtctgttatttggatgaactgtcatttattaactagACATGCCCACAACCCTGCCACCTC
-TTTTCCTAACACACTGGGCAGTCTTGGCCTCTCCCAGGCTCCCTGGGAGGGTCACTACTT
-TCACAAAGATGATGCCCACTTCTGCCcatggaatctggcttgcccagtgactacctgaca
-gggttgagtgacaccacccagaagtgcaaagAAGGCAGTAAAGAAGAAAGAAGAATTTAT
-TAGGTGCCCGAGGAAGGGCTcaatcctgccagtctaaacattgttgtacatacctcctga
-tatgtttttctagaatgtctccaggaagggattgctgggaataagtgcaaaataatgccc
-aattgttctccagagtggttgtacaactgactcccttatcaccagtgtcaaggagtcctt
-gttccacataattgatcacatttggacttgtctagctttttaagttttgccaattgagta
-gacaggaaatgagcttttaatttggatttctctaattactcagaggttgagcatcttttc
-aaatgtttgttggctattcatgttttcgcttctctatgtctgtccaaatctttagtccat
-ttttctttttgattgtttgtccttgtcttattgaattgtaggggttctttatatatttgg
-gtgctaatctttgtcagttaaattgttacggacatcttctagcttgtgacttgtctttcc
-acttttaaaaaatggtgaactttgatgaacggtatcggttgtaatgtaactaatttatta
-atatatgcctttatggtttgtcctttctgtttcttgcttcaggaatcctttccaacccaa
-agccatCCCCATGtttctatgatgcacatgtatatatattatttatttatttattttttg
-agatggagtctcgttttgtcccccaggctggagtgcagtggcgcaatctcggctcactgc
-aagctccgcctcctgggttcacgccattctcctgcctcagcctccggagtagctgggact
-acaggcgcccgctaccatgcccggctattttttttgtattttttagtagagacagggttt
-caccatgttagccaggatggtctcgatctcctgacctcatgatctgcccacctcggcctc
-ccaaagttctgggattacaggcgtgagccaccacgcctggcacatgtatatatatatttt
-aaaaagatcatatgtgcatcctgttttgtagctacttttccacttacctaacatgaagga
-acattttttccatgtttaaatagtctacaacatctttggtaaatggttgcatagttttcc
-attgtatggaatatacagtctttatttactgaatcccctgtgatgaacatttaagttgct
-ttcagctttcatatgatcaataatgctgccaagaatatcctgaagctgttggggtccaca
-ttcatgatcatttctcttagataaagtcatagaaatgaaattgcccatagaatttaaggc
-ttcggatacatttgaccaaatttgccagaGGATCCACTTTTGATTCCTTTCCAAGAAGCA
-ATATGCCATTGTGTTCAATTGCCCTTCCCAAGAGTCTGGAATCAGCAAAGTAGGGGTCCT
-GGAGATGATGTTTTGAACTGGAGCTGTTAGCAGGCATGTTCTGTTGTGTGCAGAAATAGT
-TACTGTAGCAGTTAAAGATTTTCCCTGTCCTCTTCCTTCCTACCCTCTCCTGACTCCTGA
-CAGGTAAGATGCCATTATTAGTACTATTAAGAGAAAAGAGCCAAGAAATTAGGCCTGCTT
-TGGTAATGATTCTTGGCTAATTAATTGCATTTCCAATGGCCATAAGCTCCTGCTTCAACC
-AGCACCTCTATGTGTTGAAGGCAAGAAAAGGGGTCCACTACAGCTGCTACCTCCTGGGCT
-GGGCACATAACATTCTCATAAAAATGTTTGTCCAGTCAATGAAGGATTTCGGtttttttt
-aagagacagggtctcattctgttgcccaggctggagtgcagtgtcacgatcacggctcac
-gcagtcttgacctcctgggctcaaatgatcctcccacctcagcctcaaatgatcctccca
-cctcagcctcccgagtagctcggaccacgggcacatgccaccatgcctggctgatttttg
-tattttttgtagagatggggtttcgccatgttgatgaggctggtctcgaactcctggctc
-aagcaatccacgtgcctcggctttccaaaaagattacaggcatgagctaccgtgctcCCG
-GTCAGGAATCTTTTAAAAGTCTCCTGGGTTGTCTTGGATGAGAAAAATAAAAAGAAGTCT
-CCCAGAGAACTTGAAAGCCTTAGATCAGGATTCCCTTCCTTCAGAGGGGTAAGAGGTGGG
-TGCCAAGCATTTAATTCTTAAGCATTTATTTTAGCAAATATCAACATGTATAGTAATTGA
-TACTtttatagtaattgatattaattttcatgtatggcagcacaaagtttcccattagcg
-tgaactggctttttgtttttttaaatgaggctatttaaagaaaaatattaagtaaattgg
-tggaagatagcctgcagatgggggtggggaggaggtggtgtgattccgcccaaacttcga
-gaaacactgCTTCGGTGGAAACCGCTCCGTGAGGAAGGCCTTAAGCCAGGGCTGGGTTGG
-GTCAGGAGAAAGCAGGGCCTTGGGATTCCAGGCGGAGGGCACTGGGAGGCTCTGGAGGGT
-GCAGTGAGGCTGCCACAGTCAAAGGCCGGGCGGCTGGGAGGGGCTTTCGGAGCTCTTCCT
-GGTATTTAAATCATATTTAGGGATTATAAAGTGTGATCCTTCTCATTGTGtcatttgaca
-ctcacagcaactttgtggagtttcaggcaataaggagattgccttgtcagtttacagaag
-gaaacggaggcagagagagacgcagcaatttgcccagggtctcaggtgagtaaaaggcCT
-CAGTGGTGGGTGTGGGCAGCATGGCTGGAAGAAGCGGAATTTGGTGTGGAATTTGTGGAG
-ATGTGTCAGGAGTTGCACCTCTGGGACTAGGGCACTCACAGCCCTCTCCTAATAACaata
-acaaccaccattagcatttatggagtgctcgctgcgggctggctctgtgctgagcaactc
-tggctgtctcactgcacactttacactaacgcaatgggaggggaggtgtcattatccccC
-AGAAAGTGTCAAGGGCAGGAGTTATTGATTCATGgtgtctgctcttgtagaaatttgaat
-tccagtaagggagaggggagccagaaaataaccacgggaagacatcaatgaatgagataa
-tttcacataacgataaatgccagggagaaaaaacccacagggcaatgtgatatggcctct
-ggaggtggagaaggaactgctccagatgaggccatccgtgaaggcttctctgaggaggtg
-acattagagcCAGAGCCAGTAACGTCTGGACTTGAACCTGGGCTTGCGGCATGGGAGAGT
-CCTGCATCTGACTCCAAACTTCCCCTCCTCTGTCTCCTGTGGATCACAGAATGCTTTTGC
-CAGAGACTCAATCCCTTGTTAAGAATCATGGAGTTggccgggcacggtggttcatgcctg
-taatcctagcactttgggaggctgcggcgggtggatcacttgaggtcaggagttcaaaac
-cagcctggccaacatggtgaaaccccgtctctactaaaaatacaaaaaattagcagggca
-tgatggtgcgagcctgtaatcccagctgctcaggaggctgaggcaggagaattgcttgaa
-cctgggaggtggaggttgcagtgagccgagatcccaccactgcactccagcctgggtgac
-agagctagactctgtctcaaaaaaaaaaaaaaaaaaaaaaaaTCATGGAGTCCTGGCTTA
-GGGAACGGAGTGTCCAGGAACTAGGGATGAAAGGATGGTAAGATATCCAAGCTGGAGAGA
-CCTCACCTGTGGTGCTGCCTTGTCCAACTCCAGGAGCTTCATGCACTTGCCGACAGTGGA
-GTTATGCCACGTTAGGGGTCACTCTAGATGATTCCCCTGGCCAAAGGGAAACCAAGTCCC
-AGAGACGAGATGGGTCCTGCCAAAGGCTGTAGCTTACAGCTGTGCAAGTTGTGCTGGGCT
-CCAGGGAGCCCAACTGGAGGCTAAGGGGATgccttgcatcccaccagggggctgcaccag
-gaagaaagggtacctgtttctaattcacacaaaggaatgctatgggctaggggtggccct
-gAGCCTCGTGGAGGATGGGGGCAGAGGTGAGATCCCCACATCGTTGTGCCATCCTTTTTC
-CCACCTCTCCTGCTTCCTGCTTTGTTCCTGCCAGTCCCTGGAGGGCAGGCGGGTGAGCAT
-CTTCACCATTGAGGGATGCCCCCTCCTTAATTGTGGCAAGGGGGGCCCTTTGCAGCCCAG
-TGCAGGCCTTATGGGACAGTGAAGAGGAAAAGAAGCAAGCTGGCCAGGATTCCCTGGGGT
-TTTTGTGGAGCTGACAGGCTGAGGAGTGGTTGGTTCCGGGGGCGGGGGTGGCCCAGAAGT
-GCCTTATCTCCTCTGGGCCAGTGTCAGCTCCTGTCCCCAGCCTGCAGCACAGGCTGGAGC
-TGCCAGCCTGGGGACTGCAGCAAATTTGCATTTATATTGGAGACTTCTGTTTCCAGGGCT
-TGGGGGGAGGAGGGGTGGCCACCACCATCAGCTGAGCAGAGATGCAGGAGAGGAGGGGCC
-TGCAGCCCTGTCCTGCCAGGGGCACAGGAAGTGGCCGATGGGCCCAGTCTGCCTGGCTGA
-GGGAACAGTGGCACAGAAGGTTCTCTGGGCACGCGGCCGGCCCCGACAGCCTGCCTGTCC
-ACCCTCCCAGACGCTCGCCAACATCAGCTGGGAGTTGGCTCTGCCCCCAGGCCTGGGAGA
-AAGGTCAGAGGCCGGTGCCAGCAAGGGACTAAGCAAGGCCAAAGCACTCCTGTGACAGGG
-TGCAACTGCGTGTCACCCGGTCTCAGCCCCACAAAATTGTAAATTGttttagccaagaaa
-acggaggctcagaggggcttagccattagctcaaggtgatccagctTATCATCCATGCCC
-CATGAGCCTCCCAGGAACACCCGGGATACTCACACACCCTGGATGCCATCTATACTTAGG
-GGACAAAGAGGAGTTGACACCCCTTTTCCAGCTAAGTTCTGGAGGGTCAAGGGAAGTTAT
-TGCAGGCTCGTGACACTGTTAGGGCTGGTTTTGTGACAGCTTAGGAATCATGTTTCTTTC
-TCtcttttctttcttttttttttttttttttagagacagtctcactcagctgcccaggct
-gaagtgtagtgcagtcatggctcactgcagcctcagcctcccgggcttaagagatcctcc
-cacctcagcctcctgagtagctgggaccacaggagcatgccaccatgcctggctaatttt
-ttaattttttattattagtagagactgggtctcgctctattgcccaggctggactggaac
-tcctggcctcaagggatcctctcgtcttggcctcccaaagtgctggTGTAAGTCATGGCT
-CCTGGCCTCATGTTTCGTTTTATGGTGAAATCCATAAAATGGGTTTTTTTAGGGCCAGGT
-TCAGGCCAGGTTTCCCCTTGTCTTTGGAGAATGTAGCTTCTCCCATCTGTGAGGTTCCAT
-GTGaagaaggaatggaaggaaggagagaagacaagaagggaaggaggggggacaggagga
-gggagaaatagggagtgaagTATAGAATAAATAAATAGAAGAGGGGggccgggcatggtg
-gctcatgcctgtaatcccagcacttcgggaggccaaggtgggcggttcacctgaggtcgg
-gaccagcccgaccaacatggagaaaccctgtctctactaaaagtacaaaattagccaggt
-gtggtggtgcatgcctgtaatcccagttactctggaggctgaggcaggagaatcgcttga
-actcgggaggcggaggttgctctccagcctgggcaacaagaatgaaactctgtctcaatc
-aatcaatcaatcaatcaGTAGAAGAGGGGATAgaaggaaggagtggaaggagggaaggaa
-gggagAGGGAGTAGATGAGAAGAGAAGATAGAGTCATCCTGCACCCCGCCCCCCAGGTGT
-GCTTGTTGCTGCTGGAAGTGCCCCCTCTGTGCCCTTTCCCTGGCTGTTGTATGGAATGGT
-GGTCCTCTCCCCATCCTCCTCACCCTACAGCTGAGACCTCCTGACCTCCAGTAGCAGGTG
-AGCCCTGCTCCAGGTGGGGGACCAGTGACAAGCTGGTTGGGGCTCCAGGAAGCAGAAGTT
-GGGGCCCTGTTGTGATCCCTGGGCTTTATTTCCATCCTCAGGGCTCAGCTGCCTCTGGAG
-GGGGCTCTGCCTTGCTCTTTGGGTTCTCTCCACACACTCCCTCCCCCACTCTTCCAGACG
-GAGGTCTTGGCCCCATTCCCCCAGCCTGTGGCTGTAGGCTTGCAGCTGACAAACCTCCTG
-GTCCTGGCTCTCCGTCCAGCAGAACAAGCCCTCCCTGTCTGTCACCAAACAGTCAGGACG
-GCCTGTTCCACCTGGCAGGCTGGACTATTGCCcagcttagtcttgggaagtgaggaccag
-ggctgacaacccactgcctgagttcaaatctttgctgtgcctctttctggctgtgtggcc
-ttgggcaagacccgttacctctctgagcttctggcttctcatccgtcaatgggcataatg
-ttaggatctgcctcttggattactgtatgaatgatacgagatcgttcatggaaagtgctt
-ggcttggtgcctggcacCAAGACATTTCAGCTTATATTATCCTAGCTGTATCCTTCAGTG
-TCTGTCTGGCCTAGGTGGGATGTCAGGTTCCAGGGACCTGTCCCCATGCTTCCTCCATTA
-ACCCCTTTATGACTAGTGTCACCTGATATGACTATTTCAACACACATAGGATTGAACCCT
-GGTACTATTATACCATTACTACTTCTCCTAGTTGTTGTATAAGTGCTTATGGGATCAGGC
-ACTGTTCAAGCCAttttaaaatatgactccacattcctttaaattcctctaatcaagaag
-tggggcctatgtcccctctcttgattgctcccaggaataaaatatggttagaaatgacca
-tgctggctgcgtgcggtggctcacgcctgtaatcccagcactttgggaggctgaggtggg
-cggaccacccgagggcaggagtttgagaccagcctggccaaccaacatggtgaaacccca
-tctctactaaaaatacaaaaaaattagccgggcgtggtagctgtaatcccagctactcgg
-gaggctgaggcgggagaatcacttgaacccgggaggcagaggttgcagtcagcctagatc
-gtgccactgcactctagcctgggcaacagagtaagactccttctcaaaataaataaataa
-ataaataaTAAAAAAAAtgaccatgccacttctgcttgagtctctggggacactcactct
-tggaactgttggaacccagcctgcatgctaggaggaagcccaggacccacggagaggcca
-ggtgtggatgttctggcctgcagtctccactgtgccactcctaactgccacacatgtgag
-gggaagacaattctagatgattctagtcccctgccttcaactcttttcagctgaggcccc
-agatactgtagaacagaaggaagccacccccatgtgctctgtctgaatctgtgagcataa
-gaaaatggttaacagtactacacgttggggttgttatgccacagtaaatcaccagaaTCC
-Ctgtgctgactcatttaagcttcacaacttaggaagtagctgttcttatcatctccattt
-catagatgaggaaattaagacccaaaatgctttagcaagctacctgagtccacagatctt
-ctaagaggaagagctgggattcgtgcccaTGGGTTTGAGCATTGAAGAATCAAGCAGGGC
-CCATGTCCTACAGGGCCTAGTGGGCCACATAGGTGACTGGATGTCATCTTGAGGGCCTTG
-GAGGGCTGTGGGAAGACACTGATGTGTGGAATTCACGAGGTCGGGAGAGGGCACTAAGAA
-GCTTGCTTAGGTGCAACGTGGAGGGTGGGTGAGAAGGGGCTGGAAGTGGCCCACGAGGAT
-GGACAGTGCCACCCTGCCATGGTCCACCATCCTCTCCATGTCCTGCTCCTCAAAGTTACG
-AGGGCAGCAGCAGGAGGCCTGGTCTCAGGCCCTAATGAGCTCTGCACCTATCAGAGCTTG
-GCCTAGCCGGAGATCCCAGCCAATTCCTTTGGGCTGACTTAGGCTGTGCCCTTGGACGGA
-CAGAGCTGGGCAGTCAGGGCTGGGAGCCTGACAGTGTGAACAGGAAGTTGACGGCCCAGG
-AGCATCCTCTGTTCCCTGCACATCAAGGTGGGCCACATAGCTCCAAGATCATCTGTGCCA
-ACtggatctactgggtttggagttggctgagagtggaagggagcccacaagaagagtgac
-ctaaagaggacagacactgatttctttttcttattaccaatctggaagcaggcagtcccg
-ggctggtataatggctctttgatcctcagggacccagactccttctatcttgttgttcca
-ccctcaacacttcatagtccaaggtggccgctcattctctggccatcatgtccacattcc
-agccagagggaaagaggaagaggcaaagaatgctctggtctctttaaggacccctcaccc
-ccaccgctcagaagttgtactcggtactccgtttacctcttcatggcaggaatgcagaca
-catggccacccctaactgcaagagaggctgggaagcgtggtctctgttctgccatccatt
-cacccagctaTATCGGTGGGGAGGGGGTTCTCATACTGCGGGACATGGCAAATCGCTTGG
-AATGCCAGCCACACCTGGCACCTGGAagccagagtgagtgttttgaaacttgaatcattt
-aacttcgttgcttaaaatgatcctgtagcactcactgctcccatgataaaggccaaatcc
-tcatctgacccccagggctgcctgatctcaccgtggctcacctctccagcctcatgccct
-ggttcccccagccccatcctccccaactcaccctaacATTGAAATTAAACCATGCCCACT
-CCATCCTCACCTTGGGTCTCCCTTTGTGCTCTGATATTTGGGTTCTCTTCATGCCACAGC
-TCCACCCAATGTGTGCTCTGCTTCCTTAGCTGTAAAAGGAGCTCCCCATAGTACCCACTG
-GGCACATAATAGGGTCACTTGCTTGGGTACAACGTGGCGGGTGGGTGAGAAGGGGATGGA
-AGTGGTCCACAAATAATGATTTGGGAGAACACAAATAATCAGACATAAAGAGCCACAGAG
-GCACTTACTGACTCTAAGGACTGTGGTTATAAAGCCCCTGCAATGTGCCAGGTTGGTACT
-ATGGGGAGCTCCTTTTATAGATAAGGAAACAGTGCATGCTGGGCGGAGCTGTGGTGTGAG
-GTCCTGCTGCACTGCCTTGCTGATGAGAAAAAACACTTATGGGCAGAGCGCTTTACACTG
-AGCAACTCTGTGCCTGCCTTTGTCTCAGGCAGTCCTCTAGCCATTGTGCCCCCCCCtttt
-tttttctgagatggagttttgctcttattgcccaggctggagtgcaatcgtgcaatcttg
-gctcaccgcactctccacctcccaggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgcaccatgacacctggctaattttgggtttttattagagacgg
-agtttctccatgttggtcaggctggtctcgaactcctgacctcaggtgatccacccactt
-cggcttcccaaagtgctgggattacaggtatgagccaccacacctggccCactgtgcccc
-ttttgcacatgaggaaatgggagagggactgtgattctgtaaggtcatatagccaggtag
-tagccatgccttgactggaacccagctctgcctgccccttccctgctggcagttgcatca
-cctgccttctctgGGGAGTGAATGAGGACAAGCCAcacttgaccttccatggtcctgtag
-cagagattttaaagtccagcttttagagaggaacgtgaaagcccagagaggaaggaactt
-gcccttggtcctatactccatcaagcacaatgctgggaagggactcaggtctcctgactc
-ccagtccagagctcttgcacactttgctccttcatgcaacaaatatttattgagcatcta
-ctgtgtaccagcacagtgctagcccttgagaacacagcagcaaacacaacagacacaaaa
-ccctggccctgtggagtggacattccagggctgggtggaggagTGGGAGACCAATACGGA
-CCAAGTAAGTCAGCTGCAGCACTGTCTTTCCTCTTATTTATTTCCGGAAACAAATAATTA
-TGGAGAACTTTATTGCTataagacagacatggtcctgactctcctacagtgagaatatag
-tgttggagacaggcactcaatgagagacacataaataagcaaagttcagattgtgatcat
-agctgagaagaaaacaaggttgaagtgctagagagtaatggggatgcggtactggtagtt
-aacttcagatggggtggccaggaaaagcctctccaggaagtgactcttgagctgagaccc
-aaagcatgcaatggggcccaacagtgttccaggtggagggaacagcaagtgccagggtgc
-agaagtaggacagagcttggtgggagaaaggaacagagagaaggccaaggtggctggagc
-agggcgagagggggaggttggcaagagggagggggctggagaAAGTCCAGAGTGTCGTGG
-ATAGACACTGAATAAAGAGAAGGGATGACTAGCCCCCTACAGTTCACCCCTGGGTGGGGG
-TTGGGTAGTCGTCTTTGCATCTGATAATTTCCCAGCTAGACCCCCAAGGGGTGGGGGCCA
-AACACCTGCTGGCCTGGCACTGCCTGTCTCTGCAGAGATAAAGTTCCCTGCCCCCCGTTC
-ACCAGGACCCCGCTCTGTGGTGCCTCCACCTGCACAGTCAGGCAGGGCATTGTGTGTTCC
-GGCCGGCACACCTGGCATTCACCAGCCTGCTGGTTGCCTGATTTAGGGGCTCATCCTGCC
-TGGCTCAGGGGTCTGTTCCCTGGAGTCTACCAGCTGGGACTAGGCTGGCTGAGGAGGAAG
-ACACAGGCGCTGGTGGTGGCCACAAAGAAGGCACCCTTTACCGTTGCACGCCCATTGGAC
-CATGTTTGAAACCCCAGGCCTCCCTTTTCCAGCCATCCTTCCCTGGGTGGCAGAGTCTGG
-GCTTGGGCAGAAAGGTTCAAGGGGCAGTTTCACTgctgtgcttagaaattttctctccct
-ctctgggcctgtttcctcatctgtgcaacggaagggttgacctggataaactcATGGTGT
-Agactctagagccagactgcctgggtttgaacctttaccacgtagtgaccatatgaattt
-agctaagttactcaacctttcgttctcagtttacctacatgtaaaatggaggtacaataa
-taacacctatttcaagggctgcgggaggattaagtgaattatatatgtctggtgcttcaa
-acagtgcctgctctatggtaagtgctatatattttaactctgatcattattATTAACGTC
-TTTGGAAAACATTGCACTGGAAAGACTCAGTGGAGAAATCTGAGTTCATTTGTTTGCAAA
-CTTTTTGGTCTTTGTTTTTAACAGAGAAGCTCTGCATTGGTCAGGAGAAATTTTACTCAG
-AGCCCCAGCTGTTAGCAGGGGATTGAAGGGGGGCGCCTGCCCCACCTGCTTCCCCGTCTC
-TGTGTCTGCAGCCCCCAAGAGGCCTActggagcataacttgaaaatccctgctcagttta
-tctccttcagctcacagtcagggaaactgagactcagagaggagcagggatctgcccagt
-gagtggcccagcctagactagaacccagatctcctATTTTTCTCAATACAAGACAAGGGG
-CAGGGGCTAAGAGAGAAGCTAAGACCAGAAGCCTCTTAGGGGACTGGGTGCATTGTGTCG
-TCAAGTCATTAGCATGCAAATGATATGCAAATGAATGCAAAACAGCATGTTTTATGCTAA
-TTTGCAGAGTCGAGAGCGACGACATTTTTGGTAATAGGGCGGCAGTCCTGGTCCCTGGGC
-ATTGCCGAACACGCGTCCTTTTTTTCTTTTCTTCTTTCATTATTATGATCGGGCCCATAA
-ATCTTGGTTTGGCTGTGACTCCGCCCCTTCTTGCTTGAAAGCCTGGCTCCTATCATTCTC
-AAGGGCTCCCTTGCCAGTCCTCTGGTCCGGCCTGGGCCCAGGGACAGGCCTGAGCAGTGG
-GTCAGAGAACCAGGACTCAGGAGCCACCAGTCAGAGCTAGAGGGTGACCCCAGCTCTGGC
-CTGGAAGCCACTTCTGAAGGAGGGGACCGTGGCACTTCCTCTGAGCTCCCACAGCCACTG
-TGGCTTCTGTGCCATTGTCTGTTTGGGGCTGGCTTGCTCCTTTTCTTGTCAGGGCGCCCA
-GTACCTGGAACACAGGTTCAGGATGTGTTTGGTGTTTGAAGACTGAATCCATATATGGAG
-AGCTGGTGgtgtaccctagtgatgagcctgcagtctctgaaaacatgcagcttgagttaa
-aaccctggcaccactactttctGAGAAAATAGTAGTATGTACTCACAGCTAACCttttgt
-ttttgttttgttttgagacagggtctcattctgtggctcaggcatgagtgtagtggcatg
-attgcagctcactgcagcctcagccttctgggctcaatccatcctcccacctcagcctcc
-tgagtagctggcactacaggtgcacactgctaccatgcccagctaatttttttttttttt
-tttttttgtagagatggggtcttgccatgttgtccaggcaggtctcgaactcctgggctc
-aagccatccttctgcctcggcctaccaaagtgcagggattacaggtaagagccatcacac
-caggccCATAGCTAattgagcacctaccatgttccagggctctgctttgtaattgttgtg
-aacgctgtcactgataagagtatcctagaaggtgagtatcgttatcattgctctcatttt
-acagagagggttaaatgatttgcctgaggtcacacTCCCCAGGGTAATGGTAAAGGGGTA
-TTTATATTTACTAAGGATGAGTGCTTCATCAGGCAGGGGCCTTTAAGGCACTCAGCAAAG
-CTTCTGTCACAGGGTACCAGGGTCTCCACCTGTGCTATCAAGCCACTCTTTtgacaatgt
-taaactttacctgagccctgtgctcctgaaaaacagcgatggtccagaaatccccccaac
-tttttgttttctgaagtctccctaccttttctgttcagggaaatggcttagcaaaacgag
-ccacccttccccatatgactcagataagacgtagtcccctctttctagtgtatcctgtaa
-gactggaggatgactcccttgctggcctgtgatctttccccttttgctggaacctgctga
-caaggccaaggccaaggaccctcccacttcccattctttgtctcatggttgattagctga
-gatgagaactgtgtgtcctctctgaaactagctagacacagagatgaacatttcctcttc
-aatggactgatggagatatcccctatttgtaagacaatccccactttaaatccctcctgc
-tgtaacctgtctcctcacccctacaaaagtcaaaggcaaatccatcctgtccagacactc
-tgattttgggatctgggatgctctccctgttgcaatagcatgaataataccatcaacccc
-aattcttccgtgtattttgtctttGACCCTTTCCACCGTGCTGTTTTCCACCTAAggctc
-tgagctaggtaagagccctgtgaccttggagtacttctcgggcttctctgtaccttaggt
-ttaaaacggatgcgcacaggcgttatgtcctcaggttgtgagataaaaggagacgacgcc
-agggaaacgctcggtcgcttggcactgtgcccagcagcgtgagtgctccagaaatgtcaa
-ccattgtGAGTCCAGGAGAGGAGAGTGGCGCTCAGAGAGGGAACGGGACCTGCCGGGAGA
-CTCACAGCGGGAGGAAGGGGGAGTAGGGCGCACGTCTGGTGACCTCCGCCCCCAGCTGTG
-GGAGTGTGCCCTGTGACCCCCTCATCCTGCCTTTGGATCACGAGCTGGGGTCGGGGGAGG
-GGATGGTGGGGGGGACACTGCTCGGTCCTCCACTCCGTGTGCCCTGTGACCCCCTCATCC
-TGCCTTTGGATCACGAGCTGGGGTCGGGGGAGGGGATGGTGGGGGGGACACTGCTCGGTC
-CTCCGCTCCCCTCCGCCCGCCTTTGATTGTGGTGAGCAGCGAGTCGCGGAGCAAATTAAC
-TTTTCGCACACTTCATTATGCGCCGTCCCGCGTcccccggggccgaggcccgcgcccccg
-ccccgcgccgACAACTTGATTGGGCAATTAATCTTCGCGCCCCCCACACCCCCTCCCGGC
-CCCGGGCCTTTGTGCGCCCGAGCGTGGGCCGTgggcgccccccgggccgcccggTCTGCT
-GGCGCAGATAAGGCGCCCCTCGCCGCGCGGCCCCGCCTTTGTCAGGGCGCCCGCAGGCCC
-GGCCGCCGCGCTGCCGTCTCGCACCCCATCCGCGCGCCCCCGCCCCTTGGCTCGGTCCAT
-CTGTTTGAGCTTCACAATCCTCCAGCGGCCGGGGGCTGGGGGCGGGGTCTCGCTCTTGGG
-CAGGCAGCCAGCACCCCCTCCCCCCGGCCCCCCCACCCAGCCCCCAGACACGCGCGCGCA
-CGCCCACTCGCACGCGGGGCCGCCCTGTCAAGCAGTGCGGTATTAATTAAGAAGGTGGGG
-GGGAAGCACAGCAGCAGTTTGAAGAATTGTGGGGCGGAGGGTTCCCAGCGGTGTCCAGAA
-AAGAGGGGGACCCTGCCACCCATCTCGTACCGCAGGTGCTTAACGCCTGGTTATTGGCTT
-GGGGATCTACAGGCTCCCATGGCTGGGGGTGGGGGTTAGGGGAGGTGGGAGGTGGGAGGG
-AGAGGCCTGGGAATTTGCCTGACAGTGTCTCTTTGTGCATTTTTCTGGGGTTTTGCCAGC
-AGTTGACCCAGCCTCAGAAAGGTAGCCTGTGATTCAGGTAGTGTTGAAAACCAGAGGCCC
-AAAGGCAGGATAAATCTGGGCCTATTTTAGAGGCCAATAGCGTGGTGGTTCAGAAAGGGG
-TTCCAACAGTTCTCCCTACTCGCCGTTGAGGATTTGCGTCAGGTAACCACCCTGCGCCCG
-GGGCGGTGGAGGTGATGGGCTGAGACCGTGTTGGCGCAGTGCTGGGTACACGGTGAGTGC
-TCACAAGTGCTGGTTCTTGCTGTTTTCTGTGATTTTCCTTGGAGGGGCACAGGGAAAACC
-AAAAATGGCTGGTGCTGGAAAGAGGCCCTTGAGTTTCATCTCACAGCTGGCGGTAGGGTG
-AAGCTTGGCAAAAAACCTGTGGTCTGTGCTGAGCTTGGGGCTGGgtgtgtgtgtgtgtgt
-gtgtgtgtCTATGGTCTTTGAGAAGTGTCTTCATCAGCATATGACTTGTGTGAGTTTTTG
-GGTAGAGAAGGCACAGCCTTCACTAGTTTCTACAAGAAGGGTGTGATCCAGTGTGCGAAG
-AATCCCTGTGTGCAGGGCTGGGAAATCAGCTTCATCTCTTCCATCCAAGAACAGCATGGC
-TGGCACGCTTATTGTGTGCGGAGTCCACGGTAGCGTCCCTAGGTGCTAGGGACAACCGTG
-AGCAGAGCAGAGTTCTTGGCTGCCTTCACAGACTCGCAGTCTCCTTCGGAAGATGAATGA
-GAAATAAAATAAACATGTAAGACATGAGGTAGGTCACTAGGTGACATGAGCTTTAGATAA
-AAACAAAGCAGGGCACCTGATTAGGAGGGTGGGCCCTACTTGCCAGACCCCTACCCTCAT
-CCCCAATACAGTGTGTATCATTGCCTGGGCAGGAAAGGGCCACACTCCTGGGTCTAGGGA
-ACTAGGTCCCTAAGTAGCCTCATGTCCCCACCCACTAGGACCCAGCCTCCAGCCAGTTCT
-GTTGCATGGGGCAGGGTCCCTGGGAAGATGGGCAGGCCTCAGACTGCTGCAACCTCTGCC
-CCTAGCCCTGAGGTGGTGGCAGTAGTGTTTCCCTCTGATAATGACATACTCCAGTCTTGC
-ATGACCACGATGCCTCATGAGCCCACAGTCCAGAAGGGGCCTGGTGAGCAGGAGCTGAAT
-TAAAATGGAAAATACGGCCTCCCTTCCCCCCTTCCTGTTCCTCCCCACTTACTCCCTTCA
-TTCCTGCTGCTCCTGAAGCCATGGGTGAATAGTTTCTCAGTCTCTTTGCCTTGCTGAGCT
-GGGTTAGTTGGGTTAGCAGGATGGACATCTCCTTATGGATACTAGAGTTAGGAGACACCC
-AGAACCAGCAGGTGGGATTTTAGAAAGTGCTGTTTGGCTCTGACCAACCCCTACTCCCAC
-CCCATGCATAGCAGGGTTAGTTTCCTCATCAACTCTGGTCTCTGATTCTGATGTTCTGCC
-CCTAAGCATCCTACATTCTAACATTGTATTCTTCTGACTTTTTAGAATTTTCCCATCCTA
-TGCATCTTACACGAATATGGTGAAGTTCTGATTTCCGCCCTTATGTTCTAGATTGAGTCT
-TCAGTATTAATTTTGTTGGGGTCTACCCATTCAAATAACAATAGAGAAAGACTATGTGCA
-GAGTCACATAATACTAGTCATGATAGTAGCAATTAACATCCTTTTGACCTTGGTTTTATT
-TAACAGTTTTTTTTTTTGAGAATTTTCTAAGCGCCAGACACCATTCTAGACATTATACaa
-ataaatagataaaaatgaataaataaataaatGTTATTTTAGAAGGTGCAATTGAAATTG
-AGAGTCAAGGCAGGACTCACTAAGAAAGTGACAATattttctttctgctttcagttatgg
-agatttgaaatctcagttgataaggtggatttatttctccttgcaggtcattcacttttt
-ccttcatgtattttgaatctctgctattgggggcataaatatttagaattgttatatgct
-catgattaactgaccttttttttttttttttagatggagagtcttgctctgtcgcccagg
-ctggagtgcagtggcgcaatctcgactcactgcaacctccgcctcctgggctcaagagat
-tctctggcctcagcctcctgagtagctgggattacgggtgtgcaccaccacgcccagtta
-atatttgtatttttagtagagatggggtttcaccatgttggtcaggctggtctcaaactc
-ctgaccttgtgatccacctgccttggcttcccaaagtgctgggattacaggcgtgagcca
-ccgcacccagccttgacctttttaatcattataaaatgaccttatctttcctggtaatat
-tctttgctctgaaacaaacattgtctgatatgaaactagctactcctccagtgttatttt
-gattactgttactttccatctttgtacttttaacttgtgtgtttacacttaaggtgtgcc
-gttttgaaggttgggtcttattttttttttttaaaaaaaacaatatttgggtcttatttt
-tttaaaaaaatccaatctaacaatctctgctttttaattgagggtatttagaccatttac
-atttgatgtgatcattgacgtggttagatttaagtctatcatcttgctatttgttttatt
-tttgtcccatctgttctttgcttcctttttcttctttttctgtcttcttttgtataagct
-cagttttttttactatttcattttaactcctccttttttattatatcgttttaccttctc
-tgttggtttattaactgtaatgttttgtttgttatcttagtagttacattaggccttata
-agcctgggtacggtggctcacacctgtaatcccagcactttgggaggctgaggtgggcgg
-atcacctgaggtcaggagtttgagaccagcttgccaatatagtgaacccctgtctctact
-aaaaatacaaaaattagccaggcatggtggtgcatgcttacagtcccagctactcgggag
-gctgaggcaggagaattgcttgaacctgggaggcagaggttgcagtgagctgagatagca
-ctactacactccagcctgggtgacagagcaagactcaaaaagaaaatcatgtaatagtat
-actttcatttccttcctggccttcttgctgttgttgtcatacatacatatgtgtgacaga
-ctccacaaaatgttattatttttgtttaaatgctaagttatctttttttaaattaaataa
-tcagaaaagattttatatatttaactcatgtagttaacacttctggtgacctccattccc
-ttatgtagatccagatttccatctggtatcattttccttctgcctgaaggatttccttta
-tcacttcttgcagtgcagatctgttggtgacaaatgcattcagcttttgtatgtctgaaa
-tcatctttatttcatcttcatttttaaaagatattttaactgggtatagaattctagatc
-ggcaggttttttctttcattagcttaaaagatgttgttgcttcactattttcttccttaa
-attgtgtccaacaagaaatctgccattatccttatctttgtttctctatactttacaagg
-cttttctttctctgactgtttttaatatttatctgtttgtcactggttttgagcaattcg
-ttcatggtgggtaatttccttcctgtttcttgtgcttgaggttcgttaagcttcttggat
-ctgtgagtttatagtttatatcagatatgaaatattctcagccattaattttctatttcc
-tctcctttggggacttcaaagacacatatattaggcttcttgaagttgttccatagctcc
-taatactcttggttttttggattctttctttttctctgagtcgtcgattttgggtagttt
-ctattgctacatcttaaaattctctaatcttttcttctgtcacatcagcatatttttcat
-ttcagacatgtagttatcatttctagaagttcagtttgggtcattttatatcttccaagt
-ctctccttaacctttgaacatgcagaccatgaaatacaatttgaatacttattttaatgc
-tcttatctcctacttctgtatcagttctgggtcagtttcaattgattgattattattctt
-gtatgggccatgttttcttgcttatttacgtgcatggtaaactttggatgccaggcattg
-tgaacattacccttgttgggtgctgtacacttttatatttctataaatctccttcagttt
-tgctctaagatgcaattaagttacttggaaacagttttatccttcctagtcttgctttta
-taatttgttgagtgggtccagagcagtgctatctgttgagggctaattatataccactgt
-tgagaaaagaccttcctgagcactctacccagtaccccagaaattatgagggttttttct
-gtttattaatatttctggttttgtgtgagtgctgagcactgttctctaatcttatcagat
-gattttcacccctacttcagtgtagttttatcatacaaaagcaccaaccagtactcagtc
-taatactcaagggggactttcttcatatctctggaatagtctctctgtgcaactctttcc
-tcccaatactgtgtcctgcaaactctgccctctttgtccttcctggactctcaactctat
-ttccttaactcaggaagcctcctgggtgctgcctgggttcctcctccctgcactaggttc
-tgaaaactctctccaagcggcaaactgaggccatgatagggttcatcttatttcccactt
-ctcagggatcatgatcctttattgcctgttgcctagagtcttaaaaattacagtttcatg
-tattttgcctggtttggtttgtttgtttgattgtttcaagcaggagagtaaattcagttt
-ctgatactccatcttgggtggaagcagaTAtgagaaggtgacatttgaacacaaacttga
-aggagttgatggagtgaaccaagaggatatgggagtggggagaggaaggagattctaggc
-agtgtgaacagcaagtacaatggtctcctgcgtgtatagctgagagtgcgggtagtgtgt
-ttgaggaaggaagggagcacgtatggctggagcagagagttatgtggggaaagtggggag
-agggagggatgaggtgtcagcttgtgtaggaccttgcaggccatggagaggattttggct
-tttacaccaaatgaaatgggagccatgggaggattttgagcagagggaggacatctttta
-caggatctctgaatcgattggattaactgaaagggataagagggcaagagagaaagccag
-agacttgctgggaaccagtgcactaagccaggtgaatgctagtgactcagacACATGAAA
-GGACACACTACCAagggggtgaataactaggagcggggatgaaggaggcttctggggtgc
-tgtcggtgtcttgtatcttgatctgagggaggttacatcatctgctcactgtgtgaagat
-tcattgagctggatgtacacgtctaaattgtgTTCACAATTGAATTGAATACATGAATAT
-ATTACTATATAAATATACTATATACATATAAAACTTAGAAAACAAAGTAgggagatgaag
-gtggcttggactagactgttatcagtggaggtgggaagaactgtatgcattctagatctc
-ttttatatgtagatccaataagatttgcaaacagatctaatgttagatgtgaagacagag
-aatagtccaggataatgtcaagttctctggctgagctacagcaaagactgaggacctgct
-gtgtaccagagcttgggctaagctctattaacttctttaatcttcatgacaattctagga
-agtaagtCTGGCAAGAGCTGCTTctgaggtttttgtggggctactgggagcctttccacc
-agaagtgtagtttgtgtgatggattccagaggtagtggtggccacctttgcctccatgag
-gttacaggctgcctgagagtgaggcctacaagaaagaaatcaaagccatgatagagagag
-agacaggatcctcacagtaacatgtcagcacctggattcagccataacagaagccagtgc
-cctgggcttctcagttatataaattaataattacttttttttttatttctttcacttcta
-actgaagagtccagactgatacaACTTCTTCATATGTGTCCCCTGTCTGCACCATCCAAT
-GGACCATCAACAGCAGCTACATCCTCTCCTTACCGTTGCTTGCTTGCtttttttgagaca
-aggtctctttctgttgatcagactggagtgcagtggcataatcacagctcactgcagcct
-tgacctcttgggctcaagcagtccttctgcctcagcctcctaagtagctgggtctatagg
-tgcttgccatcatgcccagctatttttttttttttcatagagacagggtctcactatgct
-gtctaggctggtcttgaactcctggactcaagaaatcttcctgccttggcctcccaaagt
-agtgggattacaggcgtgagccaccgtgtttggccGTCCTTACCATTTCTAATGCCTGCT
-CTGCACTTTCTCTCTCTGGACCTTTGCTCCTACAGGTCCTCCTTTCCAGAATGCCTTTCC
-TCCCTTACCTTCTGCCCTCACATCAAAACCAGCCCCCTACTCAAAGCCATCCTAACTCCA
-CCAGCTGAAGGATGGAGCTGGCAGAGTGCTTAGATATCAATCCATTTTACAGATGGGAAT
-ACCAAGGTCACTGTGAGACAGGGCAGATTTGTGGTCAGGACTCCCGCGTTCTGACTCTCT
-GAGACTCTTTCCATGATCCTCCAGGACAGCCTTTTCTGTGCCCTCCCTTGCGTGGGGTTG
-AACAGTACTTTTCACAACAATTTACActctcccataccccaacccttgcacgtgctgttt
-cctcagtctgggatgccctattccattctgtccttccggaaagggtgccacttgaacttg
-gagattcaactcaaggatcagacttccagaagccttctctttttcccagggtggctctgt
-gtcctgcctggtactcccACAGCTGCCTCTGGTACCTCCATGAACCCATTTATCCATTTG
-TTTTTTAGGTGTCTGTTTCTTGTTTGCCTCACCTGTTAGGTAGGGGAACTGAGGCAGACC
-TCCTGGCCAAAGAAGGCTCCCAACTGATGTTTGTGAATCAACATAGAGTGAGAAAGAGCC
-CCGTGGAGTGGGGCGGGGGgtggagagccagcgctgggcgtggaggcaggacgcctgggc
-tccagtccagccaccaccactctagtgtgtggcctcatgcaagtcatgtcctctccttga
-gcctcaggcttttttggcagtaaaaagggcagaacatcatagtagttaatacctcaggca
-gcctggatttgaatcttggctgtgtgactttaggcagtttactccagctctctgtgcctg
-tttcctcatttgcaaaatgggggcaataaacatatctgcatcatagggtatttgtgagca
-ttaaatgagttaatgtttacaaagctttcaaaccatgcttgcttggcacatcataTAAGC
-ATCCCAGAGTGAGAACCATTAAACAAAAGAAACCCTTCCCTTCCTGAGAGGAGAGGAGAG
-CTTGACAAACTCTAAAGTGGCGTGTGAGTGAACTATGGTCACTctcagggggtaagctgc
-ctggaaaaggctgactctgacactgactagtgtgtgtctttggagaaatcatgtcacctc
-tctgggactcagcttccccatctatcaaatggaggagttggtctagcgcagttggagtta
-aagtgctttgtctctttgagttttatgtccatgtcagtagagtgggctgagagctgcatg
-tctgtcatgcgctcctggtgagaatgaaatacgatgatgggccggacgcggtggctcatg
-cctgtaatcccagcactttgggaggctgaggcgggtggatcacttgaggtcaggagttcg
-tgaccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaattagccgg
-gtgtggtggcgggcgcctgtaatcccagctacttgggaggctgaggcaggagaatcgctt
-gaacccgggaggtggaggttgcagtggaaccaggattgagccactgcactccagcctggg
-caaaaaagtgagactctgtctcaaaacaaataaataaaataaaaaatataataataaata
-aataaatacaatgatgtctggagcacttgccagtcatgcctgccacatagcaagtaatcT
-GTCATAACTGTCACTGTTATTCTGGCCCTGACATTCCAGGGTTCCTTGAGGTGGGGCAGG
-ATGAGGGATGGGCTGGGCATCATGAAGGAAGGTGCTGATGTATCACCTACTGACAGTTTA
-GAAAAGGGAAGGCAGCCATGTGACCCACAGGCAGTGTCCCCCTGCCTGAGCCTTATTTGC
-AGGGCTGTGGCATCGGTGAGCAGGACAGGGACCACCACGCCCACTAGAGAAAGAAGCACG
-TGCTGCTTTTGTGAGTTCACAAAGGTCTTGGTTTTCCAGGGCCAACAGTGTCCCCGCCAC
-ACGTGACCACCTCAGAACCATCACCTGCCACCTGCCAGGGCCTGGGAGTTGGAATCTGAG
-Gtggaaggagagagcaggggccaactcctggctgctcccctctcttggtatgtgaccctg
-ggcaagcctctgcacctctgtcccctttgtcctctcttgtcacataatgaggttttgagt
-gtcttagatagggaggatgtcTCCCTATCTAAGGATAGGATAGGATagaaatggccaggc
-cctggtgcctctgctagctcagtctggctgggacgacctgggaagaacatggcctcagtt
-ccaaagccaaggcggctcctgggggagctgcagctggaggctgtcagcttgctgccctcc
-ttgctgctgaaggacaagctttttcttgaagataggatggataggatgtctcctatccat
-caGGAGATGCGATTATTGGCCTAGACTGGGCAGGGTCTCCACCTGGGCGACGGGTTGGGA
-GGCGGAAGTGAAGCTGGTGGCATGAACCATTCTCAGTGACCTTTCACCAGGGTGAGTGGG
-AAGTAGTTGGGAGCATCGAGGCCTCACTCTCCATCCTGAAGATGGAGCACAGACTGGCTG
-GCTGAGGCCGGGAGCTCATCACGGGATGGAGACAGATTGGCAGACAAAGAGGAGGCGGGC
-GGTTGGGGCTGGGTGCCCCTGGGGAGGAAGGCGGGGAGAGAGCGTAGGAGCAGGAGGAAA
-GAAGGCTGGGCTTATGTGCAGCCTCACAGACTGGGCCTGCAGAGTCTCCAGCTGGAGGTT
-GGGACTGGACCTTCCTCCTGAATGGGCAGGGAGGGAGGCTTGTTGGCCTAGCCCTCGGGG
-TTCTTGAAATAAATGAGGGAGGGCCTTGGGGGGTGGTAAATTGCTGAGGCTGTGATAAAC
-ATTCTCCCCTTCCCACAAAacacacacaggcacgtgtgcgtgcatacacatacacacaca
-cacCCTGGCCACACTGCTGTGCATATCTTACTGATTGTTGTCCTCTGTGAcagcagttct
-ccaagttgagtgcattggaaggatcagttaaaatgcagatttccaggcatttccatctct
-aaatgtagggtgtggcctgagaatgtgtatgtcttacaggatcctggttgatgctgatgc
-tgggggttctgggacacactttgagaaccactgCTCCATTGAGCAGCCtttcagtttggg
-tgcccctcggtgctggtgctgggagagagttaggagggcaagggggttagtgagggctgc
-tacctgtgaaacacaaagcaggagggaatggaattggccaggagagcctcagaccacagc
-ccgggcctgcagagtcaccctctaggggtctctggagtaaagattatccacagagaagcc
-ccacatggggcagaaatggccaggccctggtgcctctgctagctcagtctggctgggacg
-acctgggaagaacatggcctcagttccaaagccaaggcggctcctggaggagctgcagct
-ggaggctgtcaccttgctgccctccttgctgctgaaggacaagctttttcttgaagagag
-aCTGTGTCCCATCCACAACTGCCCCAGgcatctaccacatgccaggctctgtgcagagtg
-tttacctggatgaatgcagtttcagatcagagcaacctggccaagcaaatataatcgtcc
-ccatctaatagatggggaaaatgagggattaagtcatctgcccaGTGGTGGAGTCAAGAT
-TTATCCCCTCTTGTGCCTTAGcactcatccctgtcagcttccctgggtggtgaagaacat
-tagctccttttacacctgaggaatctgaggtgtggagaggtcagtgacttgcggtagagg
-tgggtagaggatccgggattccaaccctgctcatgccCCTCTTTTTAAATTTCAAGATGC
-TGTCCCTTGAGTACTTCTAGGGGGATGTAATGGCAGAAACTTGGGGCTGGAAGAAGCctc
-cctggcatttgacaggtgggtacactgaggcccagggaggcaaTCAGCCGTGCCTCAGTG
-CCTCTCTCTGCCCTGAAGGGGCTCCCTGTTGTGTGTGGGGTATAACCCCCCCGTAATTCA
-TGCATTCAGCACACACTGGTGGGCACCCATTGTGGGTCAGTCCCCCAAGCCAGAGTACTG
-TTGGTGAGTGGGAAGGCAGACGTGGGTGCAGAGGGTCTGTGCAGTGATTGGGGATGCACT
-GGGGATTGGAGGGGGCAGTTGACATGTGTGGGGTGCATGCAGGGAGGCTTCCTGGAGGAG
-ATAGTCTGAGAGAGGAGGAGGTGAGAAGGGTACTCAAGGATGAGAAAAGAACAGAAACAA
-AGGCTTGGAGGTGGGGGAAGTGATATTGCCTTTAGGAAATTGATAGAAAATCTGTAGCTG
-AGATAGTGTGGGGAAGGTATGGCCAGAAATGAGGTGGAAAGTGGAAGCTTGGCCTGGGGA
-AGTGGTGGAAAGCTCTGGACTTGAACCATGACCCTGGTTCTGTTCAAGGCAGGGCTACTC
-TCTGCAGGGCTCTGAATTCTCCAGATTTCCCTCTTACCTTTCCGAACTTCCTGCGGTGGC
-CAACCCCTAAAATAGCCCCCAGTAATCTTTGAGTCCTAAtaaccagtaggattttgtgga
-aatgacagagtgtgacttccaaggctggatcatagagtgtgttgcagcttctgccttggt
-ctctgggtttgatccccccggagaagccagctgccgggctgtgaagtcactcaagcagcc
-tgcagaaaggccacatggagagaaactgaggtcctgcctgcagccagcatggacttgcta
-gtcatatgactgagccaccttggaagtggatcctccagccccaggcaagccttcagatga
-cagcagcccagaatcacctagccaggcctgttctatattcctgacccagagaaactgaga
-cacactaaatgatcattgtgttgtacgtcactaagttttggggtcatttgccgtgcagca
-tcagataaTGAGGGCTTCTCTGTGCCCTTTCTTGGCTTCTTCTGTTGCTTCAGCTGCCAT
-CTGATGAAAGTCTGATGAAAACCAAAGGCCCTCCTCCAGAAAAGTTCAGGTACACCCAGA
-AAGAAATGGGGGTGCAATTTCAAAGGGATCACAGGCCATCTAAAACTAAACCTCAGACCT
-TCAGATCCCGGCCCCCAGTGGACATGGAACCTGAGTGAGGAATGAACAGTGTCTCAGTTG
-CTGAGCTGTGGGACATGGTGGCTGCTGCGGGGTCTTCAGCTTGGTCATGGCAGGGTGCCC
-ATGGCCTACATTCCTTTCTCCTCCTCTTCTCTGTGTCCTTGGCAGGCTGCCCCTGCAGAG
-GAGGACCGTGGGTGCCCAGACTGAGTAGGTAAGTTTAGCTCTAAGAGAACAGGTTGAGAG
-AGCCCATCGGTTGTGTACAGGCAACTTCTCAGCCAAGCTCTGCCAGTTGCTGGTGTTCAT
-ACTTGGCTGATGTCTCCACTTCAATACAGAGCCTGCAGGGGATGCAGGCTGTGAATGCAG
-TCCCTGGAACCAGACTGTGGGCTCagccatgagacctgggggatgtacttcaccttcctg
-acttgggcttttcaacttggaattggaggccagaagtccaccctgaagcgtggctgtggg
-gTGGAAACAGGCCCTCCAGCAGGGCAACAGCAGGGGCTCCTTGCCTGGCAGCCCCTCCGG
-TTCTTCAGCCCTTAGCCTCCCCTCTCTGGCTGTGGTCAGTGGCTGGCTCACCAGCCCCTC
-TTATGGCAGTCACTGCTCCAGAGTGCCAGGATTTCCCAGTATGGTGGCCAGGGCTGTCCG
-GAGCCCAGCACGCAGCTCAGGAAGCAGCTCAATGCAGGTGGGACGTCAGTGGGAGCAGAG
-GGCAGCCTCCCTCCCCAGACCCCTGAGGATGAGTCTGTCTCCCTCCTTGGTGCTAActtc
-tctctccttcttacatctccacttctttcttcttcctttatcttctctacctccttctct
-cttctaccttttcccttcttttccgctttttccttttttcatcttcattcttctcttttc
-tttcgtctttctcttcccctttcctcctctctttgtctagtccttcttccccctcacctc
-tccttttcctcctcttcCGTTTcataatgattaagagtatggcttctgatgtcagcctcc
-ctgggttcgaatccctgctgtgccacacactggctgcgtggcgttgggcaagccacttaa
-tttctctgtgctttggcttcctgagctgtacagtgggatgctaacagtgtctctcttgaa
-gggtGCCATGGGTGCCAGGTGAGCGTTAGCTGCTTATCATTCGTGTTCCTTCCTCCCCTC
-CTCTTCTTCTCCTCCTGGTCTTAGAAGTCTGTCTCCCTCCCTCTCTCCAAGCCCTGTGAC
-TCGCCTCTTACGTCTCTCTGCCCAGCATCTTGGGCCTGTCTCTGGCCCCTGCCCTGCTGC
-TTCATCCTCTCACTGCACGCACAGGAAGGAGAGCCCAGGCCTGGGGCCAGGTTGCCCCAT
-GAACAGTTGCTGAGCCAGGTGGCTGGAGCTCTTCCCTGGGGCCCCGCCCACGATGAGTTC
-AGGAGCTGCCTTTGTGCACCCGTGACAGCCTCTCCTGGCGCCTCATTTGGCAGAGCTGTG
-CATCTGGCCCAGTTACTGTGGTAGCCTTGGAAGGCAGAGTGCTCTGGGGCTTCCTTGTCA
-TCTACCTGCGTGACCCTGCATGAAGGGTATGCCCAGCCCTCAGCTGGACTGCCAGCCCCA
-CAGGCACCCTTGGTGCCCACCACACAGCAGGAGCTCATCCACAGATGGGCACAAATAGTG
-ATACCAGACAGTGCCTCtgagtccttgctgtgctaggcactgttctaagtgcaaattccg
-ttcatcttcacagcaacccttgcagtgggggctgttaaccccattttagagatgagcaaa
-ctgaaacacagaaaagcataggaaattgcccaaagttgaatgaatgaatgaatgaatACA
-ATGACAACTTAGGAAGGAAGGCATTTTACTGAAGagtgacaggcccacggtcacacagat
-agtaagtggaaaaaaatcagggctggaactcatgactccaaCATCACCTCCCACCTGTCC
-ATAAGCCCAGTGACAGCAAGGCTGGCACTCCCTCACACTTGGGGTTGAGGCCAGTAagag
-ctgcatttgtggaacactggccaaagcaaaccctctgtgctgagggcacttcagccagtg
-tctcaagcctgtctgcacttcttcttttttttttttttgagacagactctcactctgttg
-cccaggctggagtgcagtggcgcaatctcggctcactgaaacctctgcctccccggttca
-agccattctcctgcctcagcctcctgagtagctgggattacaggcacgtgccaccatgcc
-cggctaatttttgtatttttagtagagatggcattttgccatgttggccaggctggtctc
-aaactcctgacctcaggtgatctgcctgccttggcctcccaaagtgctgggattacaggc
-gtgagacaccatgcccagtcaactgaagttctttgagagtactgttcccattttccagat
-gaggagcctgaggcccagcgaaggcgagcaacatggccaaggtcacacagccagtaggtg
-TGATTCCAAAGTCCCACTTTCTGTCTTCCATCAGGTAGTACTATCTGCCTTCCACTATGG
-AGGGAATGTCCCATTGGGAGACGCCTAGGATGGGGGCTAAAGAAAGACAGGCAGGCCCGA
-CACCAGCCTCTCTCTCTTCTGTCTGCTGTCAACACTATATCTTGGTGCCATTCTGCCCAC
-TATTTGTAGAGAGGCCTGGGTACCAGCCTCTTCACTTTGTCCTGGAGGCCAGGCCAGGCA
-AGGATCACTGTACCCACTTttctttccttccttccttccctccctccctctctttctgcc
-ttTTTATTAAGGTATAAACCACACAAAATAAAGTACATAGagccaggtgtggtggctcac
-gcctgtaatcccagcactttgggaggccgaggGACCCCCCAGCCAAAGCCTGGAGCTCAG
-AACACAAATGCTCCCCTTGTTGAGAGTGGGGAAAAAAATCTCTTTTCAGGTGCCAGCCTT
-AAAAAGAAAGAACAAAAAAGGTAACTCACAGATGACCGTGATATGTGACGTGCATCTGAG
-CCCTTCACACAACCACAGAACTAACTGTCTGCAGCTGCCACAACAGCTGACCCCTCTGCC
-AGGCAGAGTTTGCTATCAACCAGTAACAGCTCCCAGAGGTTTTGTTATCCCTCTGTAGAA
-ATGGAGGCTTGAggccaggtgcagtggctcatgcctgtaatcccagtactttgggaggct
-gaggcaggcggataacctgaggtcgggagttcgagatcagcctgaccactatggagaaac
-cctgtttctactaaaaacaaaaaattagccaggcgtggtggcgcatgcctgtaatcccag
-ctaccagggaggctgaggcaggagaatcacttgaacctgggaggcggaggttgtggtgag
-ccgagatcgtgccattgcactccagcctgggcaacaagagcgaaagtccatctcaaaaaa
-aaaaaaaaaaaaaaaaaaagaaaTGAAGTCTTGATTGACTGAAGTAGGAGGAGCCAGCGC
-ACAGGCTTTGGAGGCAGAAGAGCTGGGACCAGCTCTGGAGGTTTGGGAACATGACTCCAC
-CTCCCCGAGCCTCGTACTGCTGACCAGATTGCTtttgcaagcattgtactacatcttcac
-acaatgctgggaggcagctgttaccaaccccatcttacagccggagaccctgaggctcag
-ggaggtaagggatgtgtgcagagacatgcaCAAAGTGGAAAAATGTGAAAACAGACCTCA
-TCGTGCAGTGTTATTGTGCAATTTGAATTGAATGAGGGATAAGAATGTGAATGGAtgcag
-tccacagtaggtgcttaagtcttgcatggggtctaatagccggtgagtggcaaaaggaga
-acttgtacccagatctgcctcaccccagagcccacctctgagcctctTCATCCATGGGAA
-GCCATCAtcagcatggtgcctggcaccgagtgagcctttgagaaagggtaactGGgtcaa
-aaattattttcagaaagttgaaaacatggatcttatacaaatgtatagtgagcacatgtc
-aaagtgttatttaactcattaaggatggaaccggtaggatggcaaagctgactcaaagga
-ggataaaatggcaaagttagctacgacataggttaatgtcttacagggcaccaaaaccat
-aagctttagcgttatttcttctacaggtcagaaatcatttgcaactcgtgcactttttac
-aagttaccaggtaactttgcttaggatcaggtgacccaggctcatcggacactgccttcg
-cttgatattgaaagggcacacagacaccctttttgtcttatttccaagttttggatattt
-tttctttaCAGTTATTATCATTCCACTTCTCTCTGACGAAAGGCTGTTCACAGGCCTCAC
-AGGTTCCCAGGAGCCCAGGGACACGCAGACCCCACCCCACCCATTCACACAAGGACTCAA
-GGACAGAGCCTCTACCCACAGATGAACTTGGGTGGTGCACAGGCACACGAGCTTGATGGC
-AGGGCACGCCCAGGCTGAAGGGGCCGGGTGGGAGCTAAAACGTGTGGTCTATGGTAGCCC
-AGCCTCTTTCCTCAGCAACCACGCCATGAAAAGATCCCTACATTATTTGTCAGGTAAAAT
-AAAGCGACCCGTAGCTAGTGGCGCGAGATTCTATCCAGCTTAATACGTGTGTATGTGCAG
-ACACATTTATGAGTGTGCATGCAGAGAAAACTCTCTGGGGAAATACCCCCTGAACTGACA
-GCCATGGGGAGTGAGGGTGAAGCGGAAACAATCTTGTAAAAGAAATTCAAAAACCGAAGC
-CCACTGCATTGTTTAAATTGGTTACGTCCAACTTGTTTTCCTGTGTTATCTGTCGCCTGT
-TAATACACACACACAAACACACACATAATAGAATGGGATAGAatatctatatatatctaa
-tatatataatatctaatatatataatatctaatatatataatatctaatatatataatat
-ctaatatatataatatatatatagagagagagagagagcgagagagagagagagagggag
-agacggagtttcgctcttgttgcccagactggagtgcaatggcgcgatctcggctcaccg
-caacctccgcctcccggcttcaagcgattctcctgcctcagcctcccgagtagctgggat
-tacaggcgtgcgccaccacgcctggctaaattttttttttttttttttaatttttagtag
-agacggggtttctccgtgttggccaggctggtctcgatctcccgacctcaggtgatccgc
-ccgcctcgacctcccaaagtgctgggattacaggcgggagccaccgcgcccggcGGGATA
-TTATATTTCCATAAGGCCCTCCGGGGGCCTGGGAACGGACTGGTGCTTGCGTGCGGGGCT
-TTTCCACTGGTTCCCTTCCGTACTCGGGCTTCCCCCGCTGTTGTTACTCCCTCAACGGGA
-ACACAACTCCACCGCCGCCTCCGGGACACACCCCCGCCGCGTGGGCCGGGGTCCGGGACG
-CGCGCTCAGCTCGGCCCCGCGGGGGCGGCGCAGGAGGGAAGGGGGTGCGGACCCCGGAGG
-CGCCGCAGGAAGCCCTCGCCCACCCTTCCCGGCCGGGCCGGGTCCGCAGCTGACGGTGGG
-GGTGGGGAGCAGACGGGCGGGGCGCCGGCCGGCTTGGGGGTCCCCTGGTCCCGTCCAGGG
-GGCTCGGGCCGACTCCGGGCCAGCTGCGGAGGCGGGGGAGGGGACCCCGCTTTCCATGGC
-AGTGCCGAGGCGGCGCGCACAAAGGCGCCGCGATCAGCGCTTCATCGGTTCGAGTCAATT
-ATCTGAGGCGCGGAGGCGGCGGGCGGGGCGAGGCGATTCCCCGGTGGGGCTGCGGAGCGC
-GGCGCCGAGACTCAGAGGAGGGGGCGCTGGGGAAGCGGCTTCTCCGTCTCCTGCTCCGCC
-CCGGGCTTCGTGGCGAGGCGCCGTCGCCCCCTGGTGGGGCCTCATCCATTCCTCGCTCAC
-TCGCTCGTTCACCTTTTTCTCAACCTTACAGCGGGTGGCTCTACGGTACGAGCTGAGGGT
-GAAGTGCTGAGAACAGGGCAAGCGGGCCGTACCTTTAAATGCCCTGTCGGGAGCTGGGCC
-CCTCTGAGTGGCCAACCTCACCAGGAAAGGGCGCTCAGCCTCGCGCTGCAGATGGACTTG
-GAAGCAGACCGTCAGAATGCAGCCCTCCCTGCACGTGATAGAGTAAGGGCCGCACAGGGG
-ATGAGGGCCCGGGGAGGCCCTTCGGGAGAGGAAGAGTCCCAGATGGCTCTCTGGAGGAAG
-TCTGGCCTAAGATGACCAGGTGAAGGGGTGGGGGTCCAGGGAGATGAGGGCGTTGCAGGT
-AGAGGTTTCAGCTATTGCAAAGGGGTTGCAGTACGGGCAAGTAAGGTGCACTCTGGGGAG
-AGTAACCTGTACTTACTGTGCGAGGGGAAGGGAGGTGATCAGTGAGGTAGGTAAGTGGGC
-CAGGGCCAGATGGCACAGGGCCACCTGCAAGCGTGGGCTGAGGGTGGGTTGTCAGGTCGT
-TTCATCATTTCCAGTTTATCCTTCTCCCCTTTAGATTTGGAGAGGATTTGGctgccctca
-cccttgtaagggtttaggcatcattcgcccttgactcctgtccagttgtctcactggtct
-ccctgtatcccttattttgcccttcaatctgcctgcacccatcctccaaaatgacctttt
-taaaagcaaagctcggtggcactacttttcaaaatcACAAATGCACAGGATCTGTAACCT
-GCTGGTTGCACATGACAGAAACCGCATAATAATCATGGGTTAggccgggtgtggtggctc
-aagcctgtaatcccagcactttgggagcctgaggcaagcggatcacttgagatcaggagt
-tcgagaccaggctggccaatatggtgaaaccctgtctctactaaaatacaaaactttgct
-gggcgtggtggtgtacaccagctactcaggaggctgaagcacgaggagaatcgcttgaac
-ccaggaggcagaggctgcagcgggctgagatcacaccactgcactccagcctaggtgaca
-gagcgaggctccttctaaaaaaaaaaagaaaataaaaaaaaaGTCCTGGTGTTAGAGGCA
-TTTTTCTTTtcctcctcctcctcctcctgctcctcctcctcctcctcttcttcttcttct
-tttctgagacagagtctccctttgtcacccaggctggagtgcaatggtgtgatcttggct
-cactgcaacctccacctcttgggttcaagcgattcttctgcctcagcctccagctaattt
-ttgtatttttagtagacatggggtttcaccatgttagccaggctggtcttgaactcctga
-cctcaggtgatccacccgccttggcctcccaaagtgctaggattacaggtgtgagccacc
-acactcagccAatagaggcatttttctgtcatgtaaataaagtctaaagcaggcagtcta
-aaactggcatggtgctctacggttcaggaacctaaactccttttgtcttattatgctacc
-ccctcagtacatggtttccacttcatggcccaacatggctgctcaaacagcagccctcac
-atctgcatccccagatggagagtctttttttttttttgagatggagtctccctctgtcac
-ccagcctggagtgcagtggcctgatcttcgctcactggaatctctgcctcccaggttcaa
-gtgattcccctgctcagcctcctgagtagctgggaccacaggcacgtgccaccacacctg
-gctaattttttgtatttttagtagagatggggtttcactgtgttagccaggatggtctcg
-atctcctgaccttgtgatccacccacctcggcctcccaaagtgctggggttacaggtgtg
-agccaccgcgcccagcccccagatggagagtcttttagtcattagaaaggagaaaggagc
-caaggagggagggaggttcccttaaagactctttcggaagtcacatacaatcttcttgtt
-gatgttccattggctaaacttgatcacatcactacactaagctacaaaggaggctgagaa
-atatgatctgtgttctaggcaccatgtgtccagatgaaaattgaggctcttatttcaaag
-aaaaagTTCAGTCCATggccaggcgtggtggctcatacctgtaatcccagcactttggga
-ggccgaggctagtggatcacctgaggtcaggagttcgagaccagcctgggtaacatggaa
-aaaccccgtctctactaaaaatacaaaaattagccgggtgtggtggcatgtgcctgtagt
-cccagctgctcaggaggctgaggcaggaaaattgcttgaatttgggaggcacaggttgca
-gtgagctgagatcacgccactgcactccagcctgggtgacagagcagaactctgtctcaa
-aaaaaaaaGTATCAGAAAAAGCGCAGTCTGGATATTGGGAAATGACCATCAGTCTATGCA
-TGctcaggagttccatgtctagcagtgtgtcctataggtttgcttaacccatgtgacatt
-tgacacgtttacaaggttattcactgcagcattgtgacagcaaaagactggaaacaacct
-aagtgtcctgtaataggggactggttaaacaaattatgggacatttatacaatggagaat
-gatggccacaaacacacatgaggaaactctcaatgcagtgatatgaaatggtatttaaga
-tgtTTcactttggaaaacagtttggcagtttcttatagagttaaacatacatctctccta
-tgacccagcaagttcacctctaggtttttgctcaaaataaaaatatatatgtatatatag
-ctccacaaggacttctatgcaaatgttcaacagagtttaacatgtgatagacaacaattg
-gaagtgacccaagatcgaacagccaatgaatggataaactggtgagtcaaatattacact
-ggagtttaaatgagtgatccaatgtctgcaaccacatggatgaatctcaaaacatgctga
-atgaaaacaagctggatacaaaaaatagcatgttgtaatgatgccgtttatatgaaattc
-tagaagaggcaaaacagaccaatctatgatgacagaaagcagagcagtggctgcctctgg
-ggtggagggatggactgggaaggagcataaaagaatttcttgggatgctggaaatgttct
-gtatcatgattggggtgttgattacacaggtgcatTTCACTGCATGTAAATTATACCTTG
-ATATTTTTAAAAAGCAGGGTGCAGAACAATGTTTAAATTATGGAATCCGGTATGTTTAAA
-AAGCAAGGAAATTTGCTTGTATCTGCATTGACTGTCTAGAAGAGACTTGTAATAGTGATT
-GTCGGTGGGAGAGGAACTGGGTAGCTGGGGGCTGGGGAAAAGGGACACTTTGGGCCATAC
-CCTGTTATACCTGTTGAATCTTAAACCAGTTGAATGTACTACCTAATTAAAAACTAAAAC
-TGAAAAGATCAGTTAGATGCACACGTGACATCACCACATTCATGTTTTAAATCTCCTAAT
-GGCTCTTCCCGGCAATCTGGACGAAGTTCAGACTCTGAGCTGTCCTGGCCTTATGTGGCC
-CCACTCAGGCAGCATCCTCTCCAACCACTTTTCTGTTCCCTGCAGAGACAGCTCAGTGCC
-TGGCTCCCTCTGGTTGGCCTAAGTGCATATGTGCCATTCCCTGAGTGCTCAGCTCCTCGG
-TGAATTCTCCCCAGCCCCCTGCCTGAGTTGGTCCCTCGGGTCTCACTGGACCTGCTGCAC
-TTTGCCTTCCCCCTTCCTCATCTATCAGATCAACACGTGTTTCCCAGAGCTCTCTGTGAG
-CTGGACCCCAGAGTCCTGGAGATGTGTGGGAGCCACTTTTATGGGGGAACCTGCTTCCTT
-GTTTCTGCTTCAGACAGCAGGCTTCTCCTGCCCTGAGACTCCCAGCAGCGTCTCCTCTTC
-CCAGGCCCAGATCTGGCCTGGGGTAGAAACTTTGATAAAATGTGCTGTCTTTAAGTTAAA
-TATGGCTCCATAAAGAATGCATTCCATGacaagaaccaacagagccctggtttcttagaa
-gatacagagaaaacacactgttgtgggagaattgtgtctgccaaaaagatacatcccagc
-tctaaccctgggacctgtgattgtgaccttatttggaaacagggtttaggcagatgtagt
-caggtcagggtgaggtaatactggattagagtgggctactccaatgactggtgcccttaa
-agagggaaacagacagaggagaacaccacgtgaccacagaggcgaagatgggagtgatgc
-atccacaagccaaagaaggccaaggaggcttgcagtcataaaagctggggagaagcgagg
-aagtgtcctcccttagggctttcagagagagcatggccttgccagcaccttgatttcaga
-cttttagcctccagcactgtgagaatacatttcagttgtcttaacctacctggtttgtgg
-ttatttgttctttttttaaattttttatttatttatttatttttgagacagagtctcact
-ctgtcacccaggctggagtgcaatggtgtgatcttggctcagtgtgacttccaccttctg
-agttcaagtgattctcctgcctcaggctctggagtagctgggattacaggcacctgccac
-cacacctggctaatttttgtattttcaatagagacgtggttccactgggttggccaggct
-ggttttgaactcctggtctcaactgatccgcctgtcttggcctcccaaagtgctgagatc
-acaggcatgagctaccgcacctggcctgtggttgttaactgtagtcccaggaaatgaata
-cacacacaaaaccagttaatacctaagacaattccagctagtggcaagtgctttggaaaa
-acaaaacaaaacaaaacaaaacaaaacaggtgagaagggcgtgggatagagagggactgg
-gaacggtgccacattagccagggtggtcagggaagccctcttggaggaggaggcatttca
-gtggagaGGAGAAGCCCAGCATGTGAGGACCAGGCAGAGGTGCTGGTGAGGGGGCACTTG
-GTGGGCGTGAAAGCTACTGGATGCAGCTCTGACGATGGAGGATACCTGACTGGGATTTTG
-GAGGAAGTCTCCAGGAATGAACCGGGAAGGGGCTATCCTCTCTTTGCCTCTGCAGGTCTC
-AGAACCTGCTGCATGGCTGCTGCAGGCTGTCCCTCGGCCTAGGCCGGCTGGCAGCCGATG
-AAGGAGGCCAGCCTCGCAGCTGACATGCTGCTCTCTAATTGTGATTAACTACCAAGTCCT
-CTCCTGCTCCGGCCTGAGGCCGCTGGTGTGACAGCTGCAGAGTGAATCAATGAGGCCAGG
-AAGGGGTTAATGGGCAGCCCCTCCATCTGAGCCCTTCAGACAATAAGGGGAGGTGGGGAG
-GCCTCTGGTGGGGGTGTGTGGCATCAGCTGGGGTGAGTGAATGGAGGGGACAGAGGCCTT
-GTCCCTGGGGACAGGGTGTGAGTGCTCTGTGGGGAGAGGGGTCAGACCCCCCTCCCATTA
-TTTTCATCCACCTCCATCGTCCTCTCCCCTCCCCCACCCAGCCAGAGCATCCCAGACAAC
-TGCCCTCTTGGCTCCAAAGTGTGCAGCATCTTCAGCCTTACGGAATTCTGAAGCAGAAAT
-TCTAAAAGCCAAAGAACTGCAGAATCGTGACATGTCACCGCTGTGGGAGAGTCCGTCTAG
-TCCTGTCATTCTGAAACTTTCTTTTGCAGTGGAACCCACAACTCCCACCCCAGCTCATTT
-CCCCCCAAAATAATAGTGCATTGATAACATTGAGAACAGACCCTGGTACCAGCCGGCCTC
-ATTCATCCTTCATTCAGCCCCGGTTCTACCACGTACAACTAGGGTAACTTGGGGGTATAA
-TGCATAGTTTATAGgtgtgtgtgtgtgtgtgtgtgtgtgtgtCTTCCCtagagacagagt
-cttgctatattgcccaggctggtcttgaactcctgggcacatgcagttctccagccttgg
-ccttctgagtggctggCTCACACCACCGTATTCAGTagttccgtaggttttgacaagttt
-gtaagttatgtaaccaccaccacaattaatatatagaacatttccatcgctgaaaaatgt
-tgcctcatgccccttgtagtcaatacccttcccTGTGTTACCTGATATGGTAGCATGAAT
-AAAGGTCATCTAGAGTTAGTGACTCTAggccgggcagggtggctcatacctataatccca
-gcattttgggacgccaaggtgggtggatcacttgaggccaggagtttgagaccagcctag
-ccaacatgacaaaaacccatctctactaaaaatacaaaaatgagccaggtgtggtgatgc
-acgcctataatcccagctactccggaggctgaggcaggagaattgcttgaacccaggagc
-tggaagttgcagtgatccgagatcacatgactgcactccagcctgggcaacagcaaggct
-ccgtctcaaaaaaataaaaaaaataaaaaaaTTAGTGAttctaatccttgaactgtgtaa
-atgttaccttatttggataaaggatctttgcagatgtaattaagaggcagaggttggagt
-gatgtggcccaaagcaaagaacaccaggaggctcccagaaccagaaggggcaaggaatgg
-attctgctctagagcctccagaggtagagtggctctgccaacaccttgatttcaaatgcc
-tggcttcagaactgaaagagaatacacttctgttgttttaagcctctcagtgtgtggtac
-ttttttacagtagtctttacaaacaaatatacctagcaaccaccatgccttgttttctat
-ctgtataagttttgcctttgcaaggatgttacatagacagaatcctgcagtatgaagctt
-ttgtgagtttggcttctttcactcagcataacacagttgagatgcatccatgctgttgca
-tgcatcagaagtctgttccttttggatgctgagtagtatttcactgctggatacaccaca
-gcttatccattcaccagttgaaaggcatttgggtcactcctaattgggagcattataaat
-aatgctgctatgaacatgtgtgtatagatctctgtgtggacatacactgtcatttctcca
-gagtagataccctggagtagaattactgggtcatattgtaagtgtatttataattttatc
-agaaattattacccgggcatggtggcatgcacctatagtgccagctacttgggaggctga
-ggcaggagaatcccttgaacccagtaggtggaggttgtagtgagccgagatcatgccact
-gcactccagcctgggcaacagagtaagactctgtctaaaaaaacccaaaaaaccaaagaa
-caaaaCTACAAAGAATCTGATgtggctcatgcctgtaatcccagcactttgggaggccga
-ggttggaggattgctggagctcaggagtctgagaccagcctgggcaacatggcaaaaccc
-gatctccactaaaagtacaaaaattagttgggcgtgatggtgagtgcctgtagtcccagg
-tacttgggaggctggggtaggaggatcacttgagggtgggaggcggaggttgcagtgagg
-tgagattgtgccaatgcactctagcctgggtgacaaagtgagaccctgcctaaaaaaaac
-cccaaaaaacagaaagaaactgacaaactgttttccagtgtagctataccattttgcatt
-ctctccagcaCTTAGTATTGTCAGGTTTTTAAAAATTTAGATATTTTAggccaggcgctg
-tggcttatgcctgtaatcccagcactttgggaggcagaggtgggcggatcacttgaggtc
-aggagttcgagacgagcttgaccaacagggagaaccagatacttgggaggttgaggcagg
-agaattgcttgaacctgggaggcagaggttgcagtgagctgagatcacaccattgcactc
-cagccctccagcctgggcatcaagagtgaaactctgtctcaaaaaaaaaaaaaaaTTAGA
-TATTTtaataggtatgtaacaatcatagggttattgtgagaatgaaatgaacatatctga
-gaatactgcctagcacatggCTCCTGGCTTGGAAGGGTAAGCTCCTCTTATTGCAATCAC
-TATGGGGTTATGTCCTGTCCAGGACAAAACCAGAGGTGAAAACTCAAAAAAAAACTCAGG
-TGGGCCAGGAGGAGGCTGTGGGGACCAGTGAGCTCATGTCCCATCttgaaggtcaaggtc
-ccgggaagcagctcctgagatggaaatctgcatgtgggtggttttccaggtagtgctctt
-aggatcttggaggagccagggaagcaggctcgggcagttgcaatagaggccttgaccagt
-cccatcaggagctgggccagcccttaggacatgtcacagcctgagacagggaggtcatgc
-ctctgtactctgcaagatcagactttggagtggttgcccacaggagagatgttattaata
-tcttgggtgaagcagcccttttaagctgGTGCCTTGATCCGGGTGATGGCTTTGAGGTgg
-aaaacaagcctgagtggtttcagctttcaacttttcaagagaagctatgtatctagattt
-tgatgttaactctccaaacttttttaaaatgctggaaattctagacttttcaaacctgct
-gtgaggggctcacatgccaggcacaagggctggagggggcctgaggctgcctgtCGATGC
-CCCTTGATATAAAACCAggctgggtgcagtgccttatgcctgtaatcccagcacttcggg
-aggccgaggtgggtggatcacttgaggtcaggagttcgagaccagcatggccaaagtggt
-aaaaccccgtctctactaaaaaatacaaaataataataataataataataataataataa
-taattagctgggtgtggtggctcacccctgtaatcccagctactcgggaggctgaagcag
-gagaattgcttgaacccgggaggcggaggttgcagtgagccgagatcgcgccattgcact
-ccagcctgggcaacaagagcaaaactctgtctcaaaaacaaaacaaaacaaaaacaaaaa
-caaaaaAGGAAAACCAAACAAAAAAACCCCCAAAACCTGCTGTGTCATCTGACATCACGC
-TAGTgtctggttgccgcactggagaggacaccccatggggcaggaatctttgggttttga
-tctccaccacatccccagcatgtagggcagggtccagGCCTGGATGCAGCACGAGAGAAG
-GAACGCAGGGCCCGAATGAGTAATTTGCCTCAGTGTGCAGGTCATTTAATTGCAAAGAGA
-GGAAAAACGACAACCAAaaacaaccaaatgaaaaaatgagcaaaggatttgaatagacat
-ttctccaaagatgtacaagtggccaataaacagaggaaaagatgctcagcgtcagtaatc
-attagggagatgcaaatcagaattgcaagcacgagataccgcttcacacctattaggatg
-cctattaaaaaacaaaaacaaaaaACAAAACAAAACAAAAAAATCAggcagagtgctgtg
-actcacacctgtaatcccagcactttgagaggctgaggtgggcggatcacctgaggcagg
-gagttcgagactagcctgaccaacatggagaaatcccgtctctactaaaagtacaaaatt
-agccgggcgtggtggcgcctgcctgtaatcccagctactcgggaggctgaggcaggagaa
-tcgcttgaacccaggaggtggaggttgcagtgagccgagaccacgccattgcactccagc
-ctgagcaacaagagcgaaactccgtctcaaaaaaaaaaaaaaaaaaaaaaaaaTCGCAGA
-Tctgactgtgtgaccttgggcaagttgcttgacctctcagtgcctccatttcctcctctg
-taacgtgagagtaaaaatactactcatacctacctcgtagggctgtcatgaggactgaat
-aagtgcataggtacagacatgcttaggacagtatcagcacatgcaggaattacatgggag
-ttggctgttaATATTATTACAGGAGTggatcaaatccatctctgccatggacttgctgtg
-tgacctagtgcaggtcactttgcctctcttggtccagttttctcacttgtaaaatgggac
-catactgccactctccatagggcaagtgtgcggattcgaggagctcatatgtgaaaggcC
-TCCTTCAGGCGCAAGGTTGGTCCTTGGTTATGCACGTATGTGAGCCTCTTGGCGTGCCTT
-CATATGTGGGGCATAGGCAAGCACTCAAGTGGCCTGGACTCCTATCTCGGCTCTCAATGT
-CCCCGCTTCCTGGCCTGGGATCAGCAGGACCTCAGTGGATCCACCATCCAGGCACATCCC
-TTTCTTTCCCTGCTTTTTTCCTGCTTCTTGGGCGGCACCACCACCTACTGGCCTAAAGCT
-ACATTGCAGCCAATGTGCACAGCGGGGCGGAGGGAAGGGAATATGGCCTTGGGCAGCTGC
-TGTGCGCAGAATATTTACCTCTGTACACGCTTAGGGTGCTGAGGCTTAGGGAGCTCACAC
-GGAGAGAGCCAGCTGTGAAGCTGGGGTTAGAATCCCTGTCTCCCTTTCACCTCACTCCAA
-ACACCCTCTTAGAATGGGAACTCAGTTCAGGTTCTGCCTTGGGCCCTAGACGATCCACCC
-CTCCCTTCTGAGCAGGGAGCCAGGAGCTGAAGTCCAGGGTCCTTGGAAGTATGTCAGGGT
-TGTCCCCCCAGGGTCCTGATTACAGAAGAAAGAACACTGGACTCAGAGTCCAGAGGTTGG
-GGGTCTAGCTTTGCCTTCCCTATCCCCAACTATCAGCAAAACAGCCTTTGGAAAATCCTC
-ACCCATTTATTCTAGCACTTGTCATTTCGAAATATATTTACTGTGGGAGAGCATTTAATG
-TGAGTGTTAGGTTCTAACGCAAGGAGAAAATTATAAAAATAAACAAAAACTTTTAAAGAA
-CTCCTAAAAATCCTTTAAGTCACTCATAAAGTATAATATGGGCAGTTTTCTAAATATAGT
-CCTTTGCAGCAATAAATGCACGGACCATAAAGAACAGCAGTATATGGTGGTGATTGCATG
-CATTTGCGAACTGTAATTTTAGGTTCTGTTCTCTCTCAGGGGTGTGTGGGATTCCGAGCT
-GTGGATCCACACCCCCACATCTCTCTCACAGCTGGGATCATGTCCAGGCAGAATCGCCCA
-CATTGTGTACATCATTCTCCCTTCTCTCTCTCTTTCTGAGCGCACATAGCTGCATTTCCG
-AAGTTACATAATaaaaacagctaacatttattgagctttcattatgtattaggcctgctc
-gcagccctttgctcacgcattaattcattaattcagataatcctcctaagaatgttatga
-ggtaggtatattattatctcttctctttacagatgaggaaactgaggcactgaatggtta
-agtaactagcccaaggtcaaatagTGTACCACCCAGCCCGAAGGCGTTCACCTTgttccc
-gggtaggatcgcagaactggttaagctaggttaccgatccgggtggtgtcagctgatccc
-tcagctgctgtagtgcaagatctgcaaaatatctcaagcactgatcttaggttttgcaat
-agtgacactgtccccaggaacaacttggggaggttcagacccttgctgtcagaggctgca
-cagcccctaaaccttgatttctaatcttgtagctaatttgttagtcttacaaaggcagac
-tggtccccgggcaagaagtggatcttttcaggaaagggctattgtcataatttcctcagt
-tacaatttttgcaaaggtggtttcaatagccagtgagtggtacagcctgaatttgaaggc
-aggaagtccgggacgagaacccacactcttgactggcatactTGCCACCTGAATGGAGGC
-TCCATAGAGCCACGCGTGCATGCTTGTGTACCTGTTGTCAGCCCGCAAGCTCCGTTAGGC
-AGGCTAGAACCTGATCCAGGTTAACTTTGCATCCTTAGTGCTGGTTCTTTCCATCCAGGG
-CCCCACTCAGGGTATATGCTCAGTGACTGTTGTACAAATGCATAAAGCTCAGTTTGCATA
-AAGCTCACTTCAGCTTCTGTATCTGTAAGACAAGAATCAGagccaggcacagtggttcat
-gcctataatcacagaactttgggaggctgaggcgggcggatcacgaggtcaggagttcca
-ggccagcctgtccaatatggtgaaaccccgtctgtagtaaaaatacaaaaattagccagg
-tgtggtggcacgcatctgtaatcccagatactcgggaggctgaggcagaagaatcacttg
-aacctgggaggcagagtttgcagtgagccgagatcatgccactgcactccagcctgggcg
-acagagcgagactccatctcaaaaaaaaaaaaaaaaaaagaaTCGAAATCAGCTCTTCAG
-ATTGCTGGAGGCTCCGACAAGCCCATTGGTGGGAAAATTCTCTTTAAAGACACTGATGTG
-ggctgggcacaatgactcatcctgtaatcccaacactttgggaggccaaggtggatggat
-cactagaggtcaggagtttgagaccagcctagccaacatggtgcaaccttgtctctacta
-aaaatacaaaaaattagccaggtgtggtgacatgaacccataatcccagctactcgggag
-gctgagatgggagaatcgcttgaacccaggaggcggaggttgcagtgagccaagattgca
-catctgcactccagcctgggcgacagagcaagactccatctgaaaacaaacaaacaaaca
-aaaCACtgatatagtttggatttgtttcccctcccaaatctcaggtggggttgtaatccc
-cagtgttggaaaaggggcctggtgggaggtgattggatcttgggggcaaacatccccctt
-gctgttcttgtgatagtgaatggattcttacgagatctgcttgtttaaaagtgtgtggca
-cctcctcctaccccgctccagccatgtagaacgtgcctgcctccccttcgccttctgcca
-tgattgtaagtttcctgaggcctccccagtcatgcttcctgtacagcctgcagaaccgtg
-agccaattaaacttctttttttaaatgaattacccagtctcagttcattataccaatgtg
-agaacaaacgaatacaGACACTAAATTCTCCTTTGCCCACCTCCTGCTTGGTCCCTTCTT
-GAATTTTCAAGCTGCTCAACCAAGTggcctgcaccagcttgggagagctaatcgtgtgta
-tctgtacccaactctacattcagtaacatcatgtttgtagctcgaaatcagcaatggtga
-gtatttacactatggcaattggcaaatgcttcaaacaggagttttcccctctagagatgt
-taaacgtttgccagGAGGAAATCAATCCTCTAATGGCCACCTTcaaggaggcaacacagt
-ggagtgatcatgcttgttggctctggagccagaacacctgggttcaaagtccagctctat
-cacttaccagctgtgtgaccttgttcagttacttaacctctctgagcctcattagtctca
-ttcatgaTTACGTATTTCATTGGGGACTCAATGCCATCTTCCATATAAGTGCTCTCTCAA
-TTAATGTTATATATTAATATTATCAATCAGCTTAAGAGGTGGGGAAACTTTCTTGTTTTC
-CATCCTAGGAAAGGGAGTGCTGAGGACAGGACTTGCAGTGTCAAAAAGGAACCTCAAAAA
-CGGCAATGTGTAACTGCAGGTCTGGGCCATTTTTGAGGGTCTCTTGAGCATTGGCAGACC
-AGATCTTTATGCCAACACAGGTTGTGCGTGTGGGGGTTAGAGGAGGAGAGGCCTTCTCAG
-TTCTTTGCAGGAAAGGCTACTGTTAGCTCTAGAGCCCAGAACAGATTTAGGGGGAGAGAT
-GATCTAACCAAACTTTCCCTCTGCCCTCGGCTTGCCAGTCTTCTCGCTAGTGAACACTCC
-CAGTGTGAGGTAGAGGGTTCCCTGTTCCACCTCCTTCCTCCCTCTGTAGAGGAGGTATGC
-ATTGGGGCAGGTGTGTGTAAGGCCCTCCTGGGGTACCCCTCCAGGGAATCTTCCCATCTT
-CTCCAGTACTGCCCCATCTGACATCCTGCCTGAAGCCACAGGTTTCCCTTGCAATCACTA
-AAGAAGCAGGAGGGAACCAGCAGAACTCCCTGCCCATGTGCACAGGAGGTGATCCAGAAA
-CTTCAAGGGGAAAAATCCTGCTCTCCACCCCAGCAGGCATTGATTTTTGGCTGCGAAGAT
-TACAGtctctctctctctctctctctctctctctctctctctctctctcacacacacaca
-cacacacacacacacacacTCCTGTGTGCCAGGAGGTTCCTAGAAGGTCCTCACTCCTCG
-CACTCAGGTGCTCCAGGGCTAGCCCACTCCTGGGAGGTGCCCACAACTGACCACGATGCC
-CACAAGACTGTGGGAAGGGTTGCCCCATGTGCCTTCGTGCCCCTCCCACTGGATCCCAAC
-gaaggctcttttcacaacaggaatcagagcatgtcactcccaacctgcctaaaccctcca
-atggctcccaccacttttgatcaagacctaaatcctttctgagtccaccccatccttaca
-gggtctaaccttgcttccatccctgtcttcaccccttattcctccctctgggctcctctt
-caggcccttgaggtgccaagctcactcctgccctgggcctttgctgctgctgtccccttg
-gcctggagcactcttcccTGTCCTTTTTGCCCATGTGAGGCTGAGAGGCAGACGGAATCA
-TGGTTGCTAGTGTAGAgaggccacactactggagtttgtatttcagttctgtcaccttga
-actgggtgacctcacccatctctgcctccctttcctccctctatacagtgggaaagataa
-tagcacctacatcttagggtgttgtgagactgattgagataatCTGTATGGTTTTtggca
-gtttctgaaatgcactgtaaactgtctggttctcctcccatcggaaggtgagaatctgac
-tgctccccttgactctgggtgagagggtagggcaacagcaatgctccatgatttcagagg
-ctgggtcataaaaacggtctgcaggggattcacttccagaacagtggagtgaggaacact
-gcagactgctttctggtgaaaacaactgatgatgatttctaaaaaacaatcatttgaagt
-ctctggaaattgtcctaagagcatacagcaagtgaagaaacacttattcaagaaaatcta
-ctaaatctaggtaagaacagtgagtttgtagaacttgagacacaatccactctctttctc
-ccctccattccattttactgttatggaaactcaactgtgagcagccagggccaagaagat
-gggagtcatttccccccaagctcctagtcgatggggtacagcatctccccaggaagggaa
-ggctgccagcatttgtcatcctcccaacagctatatcttacagaggctaaactccaggta
-ggtgtggctgggagactgggatcttccttcctctacccagtccccactcatagggtggtg
-gccacgccaagtgcagcaggctaaaaatattgaagccccagttgcttttgtcttagctta
-cttgttaaagcagaggttccatgcctggagatgcaagctgagaagaccagagactaagaa
-tactgccccaactcagccctgctcataaagcaagaaggttactctgggagaagtgaactg
-ttgtccctgcctccagctccagagcagtgtcacagatgctttgcccaagagagaggcagg
-tcataacaacacagatctttaaagttgtccataaaggaactgactttctttagaacagag
-tatgcagaaatttaagcctaagagtgccctcagaagcagtggcgattttggtagtgatca
-gggacccaaagttgctatactatatcatcttaaatgttcattttccagcaaagaatttca
-agacttgcaaagaaataaacacatgtgacccatacacagggaaagaccagtcaacagaaa
-ctacctgtgagagtgctcagaggtcagacttgcacggacttcaaagcaaccactgtaaat
-atgttcaaagaaataatggaagccatgcttaaagaataagggaaggtaggctgggtgcag
-tggctcatgcctgtaatccccgcactttgggaggccaagaggggtggatcacctgaggtc
-aggaatttgagaccagcctggccaacatggtgaaaccccatctctactaaaaatacaaaa
-attagctgggcatggtggcaggtgcctgtagtcccagctactcgggaggctgaggcatga
-gaatcacttgaacccaggaggcggaggttgcagtgagctgagattgtgccactgcccttc
-agcctgggtgacagagagagactccatctcaaaaagaaaaacaaaaacgaaaatcaagaa
-taagggaagcggtgatgactgtgtctcatgaacagagaatgtaaacaagaagatactatt
-ttaaaaaacttaatggaaattctggagttgaaaagtgcaaaagaaaaattcactagaggg
-gctcaacagtagacttgagccagcagaaggaagattcagtgaatctgaagacagatcaat
-agagatttcgcagtctgaagaacagagagaaaaatatgaagaaaaatgaacaaagccttg
-gagaaatgtgggacacagctaggtgcaccaacatatgcacaataacatatataacagaag
-gagagcaaagagagaaaggaacagaaaaaaatgtgcaaaaataatcactgaagcctttgc
-aaatttgatgagaaacatgaattatgcattgaagaagcttaatgaactccgagtagaaca
-aatgcaaagtggtcaacaaccagatacataaaaggaaaatgttgaaacccaaagataaaa
-agaaaatcttgaaagcaacaagagaaacacagctcatcacatataagggaacaccaaata
-agaccgacagcagatttctcatgtgaaacgatggaggccctaaggcagtgggacaacata
-ttcaaaatgcataaacaaaaactaccaagcaagaatcttacatccagcaaaattatcttt
-caaaagtgatgatgaaagagatatttccagataaacataaactgagaatttgttgccagg
-aaacttaccttacaataaatactaaaggaagttcttcagacagtaatttgaatccacaca
-cacaaaagccaaagtgctctgggaaaggcaagtagatcgttatgaaaggcagtaagaatg
-catatttattcaccttctcttaacagatttttaaaaataatttgtatataattgtattgt
-ggggccaagacatatagaaatgtaatatattttgataataatagcacacaggaggtgagt
-gggagcagagctgtattggattaagaaagtgagaccagatgggaactggaatccacagga
-acaaatgaagagaaccagaaattataagtaagaaagttaataaaacaaagtcttttaata
-tatacttgctctcctttcttctctcagcttcttcaaaagacataaaactatataaagtaa
-taattataacaaagtactgttggttttgtaacatatgtagatgtaatacatataaaaaga
-atagtgcaaagaggaagaagagagaatagtgctatataggagtcaccgggcacggtggct
-cacaactttaatcccagcactttgggaggccgaggcaggccagtcacttggggccaggag
-ttcaagaccagcctggccatgtatctctacatataatagattgaaaccatgtatctctac
-gtataatacaaaaattagccaggtgtggtgtcatgtgctggtaatcctagctactgggga
-ggctgaggagaattgcttaaacccaggaggtggaggttgcagtgaaccaagatcacgcca
-ccacactccagcctgggcaatagcacaaaaatctgccaaaaaaaaaaagatagaaatata
-taggagtaatatttctatatatcactggaattaagttactgtaaatctgaagtcaattct
-gataagttaaaacctatatagtaagcctaaactggtcattaagacaaacaaacagaacag
-tgaaaaagctattaaagaaatttaaggctgggcacggtggctcacacctgtaatctcaac
-actttgggaggctgaggtaggtggatcacctgaggtcaggagttcgagaccagcctggcc
-aacatggtgaaaccccctccctactgaaaatacaaaaaattaggtgggtgtggtggcagg
-cacctataatcccagctacttgggaggctgaggcaggagaattgtttgaacctgggaggt
-ggaggttgtagtgagccgagatcatgccattgcactccagcctgggtgacagaatgagat
-tctgtctcaaaaacaaaaacaaaaacaaaacaaacaaaaaatccaaaaaacagaaattta
-aataatacactagaaaatattcgtttagtgtaaaagatgtcaaggaagaaaagaggaaca
-aaaaagacatgagacatatagaaaataaaaagtcaaatgacagacataaatccaacttct
-ctcaatgatagcattaaatgtgattggatcaagtcaaaagggagagatttcctgactaaa
-taaaaagccaagatcaactatatactgtgtgcagaagatacactcaagattcaaaggtta
-aaagtaggttgggcgttaaaggctgaacaaaatatatcacgcaaacagcaaccataagaa
-aacttgatttgctatattaatatcaggaaaaagactttaaaatgaaatatgttacaaaag
-ataaagaggaacattttataatggtaaaaggatcaatcgatccattgggaagacataaaa
-attatagacagatatgcccctaacaacaaagccccaacatgtgtgaagcaaaaacagaaa
-gaattgaaggggcaaatagacaattcaaaaataatatttggagacttcaaaaccccactt
-ttaataatgaatagaacaactaaacagaagactaaagaaggcaatagaggctgggcgtgg
-tggctcatgcctgtaatcccagcactttgggaggcccaggcgggcagatcacctgaggtc
-aggagttcgagaccagcctgaccaacatggagaaaccccgtctctactgaaaatacaaaa
-ttagccaggtgtggtggcgcatgcctgtaatcccagctactcaggaggctgaggcaggag
-aatcacttgaacctgggaggcagaggtttccgtgagcccagatcacaccactgcagtcca
-gcctgggcaacaagtgcaaaactccgtctcaaaaaaaaaaaaaaaaaaaagaaaaaaaaa
-agaaggcaatagaagacttgaacaacactaaaccaacaagacctaaaagacatctataga
-acatttcacacaacaacaagataatacacattcttctcaagagtacgtgaaaaattattt
-aggacagactatatgttagaccacaaaacaaacatcaatgatttttttatcttttatttt
-tttttttaatatggagtcttgctctgttgcccaggctgaagtgcagtggcatgatctcag
-ctcactgcaacttcagcctcccgggttcaagcaattctcgtgcctcagcttccagagtag
-ctgggattacaggcacccaccactatacccagctaatttttatatttttgtagagacagg
-gtttcaccatgttcgctaggctggtcttgaactcctgacctcaagttatctgcctaagtc
-ggcctcccagagtgctgggattacaggtgtgagcaaccgtacctggacaataaattttaa
-aagattgaaatcatacaaagtaccttctctgactaaaatggaatgaagctagaaatcaat
-agaagaaaaccaagataattcacgaatatgtgaaaattaaaaacacactcaaacaactaa
-tgtgtcaaaatagaaatcacaagggaaattggaaaacaccatgagggaatgagaataaaa
-atataacataccaaaacttacgtgattcagtgaaagcagaaaaatttatagctgtaaaga
-cctgcactaaaaagggagaaaggggccaggcgtggtagctcactcctgtaatcccagcat
-tttgcgaggctgaggcaggcggatcacttgaggtcaggagtttgagaccagcctggccaa
-catggtgaaaccccatctctactaaaatataaaaattagctgggtatggtggcacatgcc
-tgtaatcccagctacttaggaggctgaggcgggagaatcgcttgaacgcaggaggcagag
-gttgcagtgagccgagagcgtgccactgcactctaacctgggtgacagagtaacactccg
-tctcaaaaaaataaaaaataaataaaaaaatttttttaaaaaggagaaaagtctcaaaac
-aaccacctaactctacaccttaaagaactaCAGAaagaatacaaaaattagccgggcatg
-gtgatgggcacctgtaatcccagctactctggaggctgaggcagagaatggcatgaacct
-gggaggcagagcttgcagtgagctgagatcgtgccactgcattccagcctgggcaacaga
-gcgagactccgtctcaaaaaaataaataaataaataaaaaataaaaagaactagagaaag
-aagcacagactaaacccaaagctagcagaagaaagaaaataattaagattggagtggaag
-taaacaaaatagagtatagaaaaacagtggtaaaaaaatcactgaagctgggcatggtgc
-cacatgcctataatcccagcactttggaaggcagaggcaggtggatcacttgaggccagc
-agttcaagaccagcttggctaacatggtgaaaccccatctctactaaaaacacaaaaatt
-agctgagcctggtggtggacacctgtaatcccagctatgcgggaggctgaggcaggagaa
-tcacttgaacctgggaggcagaagttgcagtgaactgagatcatgccactgcactgcagc
-ctgggcaacagagcaagaccctgtctcaaaaaaataaaaaataaaaaaataataaatcaa
-agaaacaaaaaattgatcaatcaaattgacaaacctttagctaaactggctaagaaaaga
-agattcaaattactaaaatcagaaatggaagttcggacagtactactgaacttacagaaa
-taaaaataattataagaaaatactatgaacaattgtgtaccagcaaattggagaacctag
-atgaaacggacaaattctggccaggcgtggtggctcacgcctgtattcccagcactttgg
-gaggcaaaggcaggcagatcacaaggtcaggagattgagaccatcctggctaacatggtg
-aaaccccgtctgtactaaaaatacaaaaaattagcctggcatggatggcacgtgcctgta
-gtcccagctactcaggaggctgagacaggagaattgcttgaacctgagagatggaggttg
-cagtgagccgagattgtgccactggactccagcctgggtgacagagcaagattctgtcaa
-aaaaaaaaaaaaagaaagaaaggaaagaaagaaagggacaagggacagattcctagatac
-acatgatataccaaaactgagtcatgaagaatggaaatctttatagacctgtaatgaagc
-agtgatcaaaagccatccaaaaaagaaaaacctttgacaagtccctggtgaattctacca
-gacatttaaagaagaactaacatcaatctttctcaaactcttccaaaaaatttaagagga
-gggTCGGGGGGCTGGGAGATCCAACATGACctcatccacatgactggcaattggtgctga
-ttgtcagcaggaatgtctgtgttctcctccttgcggtcactcttgctctgttaggtcaga
-catcatcccttacatagaggcccaagggtccaacggtccaagtccaagactgaagctgca
-aggtctcttgaggcagaggctctgaaaaccacatgatgtcacttctgtcacacgctattg
-gtcaaagcaagtcacatgcctcactcagcttcaagtcagtggagaaacagactccacctt
-ggatgggaagaatagcagagtcacattgcaaaggggtgtggataagggttgggaggaatg
-tgtagccattaatttacaCCAGATAATGTGAGTGTTTGCACTTTACAAGGTCCACAGGTC
-CACtgatacagtttggctctgtgtccctacccacatctcaccttgaattgtaataatacc
-cacgtgtcatgggagggaccccatgggaggtaattgaattatggggcgggtttttcttgt
-gctgttctcgtgataatgaagacatctcaagagatctgatgtttttatcggggggagttc
-ccttgcctgccaccatggaagatgtcccttgactcttccttcatcttcagccatgattgt
-gaggcctctccagccatgtggaacagtgagtccactaaacttgtttcctttataaattac
-ccagtctcaggtatgtctttattttattttattttattttattttattttattttatttt
-attttatttttgagacagagtcttgctctgtcacccaggctgaagtgcaagggcaccatc
-tcggctcactgcaacctccgcctcccacgttcaagagattcccctgcctcagcctcctga
-gtagctgggactacagtgcacgcctccacacccggctaatttttgtattttagtagagac
-agggtttcactatgttggccaggctagtgtcgaacttctgatctcatgatccacctgcct
-cggcctcccaaagtgctgggattacaggcatgagccaccatgcccggcctcaggtatgtc
-tttattagagcgagagaatagactaatacaTCCACCAACCCTAGGAAGTCAGTGGAAGGG
-TATTTCCGTATTTCATATGGAAGTCATTTCCATATGAAAATTTAGCCAGAGGATTTCATG
-CTGGTTGTCTGAAAGCCAGGAGCTTCTAAAAAACTTTCAGGGTAGCTGTCTAAGCATGac
-ctcatgtcatcctgttgtgagtactaaattagttaattcaggggaggcactcagaaaagt
-gAAGAAAGGGAAATCTTTCTTATATAAATCTTAGAAATCTCATAGAAATCTTAGGAAAgt
-gcctggcgtgcagtaaacacgtgatacatttcagttgttattatcttcacaataattttt
-ttgggtcaggcttgttattttccctgttttacagattaaggggcagagactcagagatgc
-gcagtaagtcgcctgagggttacgcagcaaataagcagggaagccagatgagaacctaCA
-TGACAGAGTCACCCATGTGTGAGACTCCAAAGCCTCATTCAGGTGCACAGAGAGGCGGTT
-GTGAGGACGttcactgctgcgttgccttcagtagcttaacatcagaaacagcgcagatgt
-ccaccaacaggggccacccagtaaaccccagcatgcccagccaaggagtgctttgtgctg
-gttacaagaaatgaggtcacgctatacataggacatgggatcatctccaagacattctgt
-tcagtaaaaagaacaTCTGAAAAAAAAGTTCCATAACCCACAGAAAATACTGCCAAATAT
-TCCAAAAAATCTAAGTCCAAGTGTGTGTGTATGTGACCTCTGGAGGCTGATCTGAAGCAA
-ATGTAGGTGAATTAAACAATAGGATCTATTTATAGGACTCTTCTTTTCCTACTTTTCTTT
-ATTTTTGTTGGATTTTGAAACATGTTCAAAGAAAAATTCAGAGTACAATAAAGTACCagt
-cgggcatggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggacca
-cctgaggtcaggagttcgagatcagcctggccaatatggtgaaaccctgtctctgctaaa
-aatacaaaaattaggtgggtgtggtggcaggcacctgtaatcccagctactcgggaggct
-gaggcaggagaattgcttgaacccaggaggcaaaggttgcagtgagctgattgtgccact
-gcactccagcctgggcgacaagagtgagactgtgtctcaataaataaatgaaagaaagaa
-agaagaaagaaagaaagaaagaagaaagaaagaaaagaaagaaagaaagaaagaaagaaa
-gaaagaaagaaagaaagaaagaaaaagaaaaagaaccaagaagaaaaaataaTCACCGGA
-GATTCCtcccctcccctagagctaactaggctaacattttggtatatatctttccagtcc
-ggatcctgtgtgactgagtgtgtatatgcatatgtattattttCAACTGTtggctttctc
-cttgtggtccaagacagctgctccagatttagccattacatctgtttcctgccagcaaga
-aagggaaaatgggaagtagagggccttttaagtatacaacctagaatttacacacattat
-tctttatcacatctcatttctctaaatgtagtcgcatggccatcctggccagaaggaagc
-ctgggaaatgtggtctttcctctgggctgccttgtgcccagtgaaaagtcaggggttcta
-tgactatgaaagaaacaggagaatggatattgtggcaactagcagtGCTATTCACCTTTA
-TTCTCTCAATGGTAATATTTTTCCCCATCAAGAGGGGAAAATTTGTGTCTTACATTCTAA
-CCACTGAACTCCGAGAGAAGACACTGGCCTGTGCCAttctcttgcgatggagtttcgctc
-tgtcgcccaggctggagtgcagtggggtgatctcagctcactgcaacctccacctcctgg
-attcaagcaattctcaggcctcagcctcccgagtagctggaattacaggcacctgccagc
-acacccctttttagaccacatagggtagcttccgactgttgccatggcatttgtgaattg
-tcatgtgctggtgggagtgtctcttagcatgctaatatattataattagcatatatatta
-taatgagcagtgaggaggaccagaggttgctttcatcaccatcttggttttggcgggatc
-tggccagcttctttactgcatcctgtttgttttatcaataaggtctttgtgacatgtacc
-ttgtgAAACCAGTCCTGCCTAAGGGAGCGGGGCTGGCGGTTGTTCAGAGTGAACAATTCA
-AAGTCAGGTCCTCCCTCTTGGAGCTCAGAGACTTGAAGAGCAAGGACCACTGTCAGGACA
-CAACCCCATTTGCAAGGCCGGGGACACACATACAGACCCACAGGCCATTGTAGAGAAAGT
-GTTAAAAGATGGAAGTCAAGCCACGGCCACTGGAAGTGGTGTGCCCTGAGAGGCAGAGGG
-TTCTCCCTAAGCCAGGGAAGGACAAGGCAGGGCAAGACAGAAACTGGGCCTGGGGCCAGG
-ATTCCTGAGCTGGGGCTAGATTTGCCCAAATCTAGGGCAGGGCTGACTGGGTCAAGCACA
-GCAGGGAGCCAGGGTGGGTCGATCCCCCTGCCACAGGCTTCACTCTTCTGGCTCTGGTTT
-CCAGGCAGTTCTAAAAGCCTCCCAGTggcccagtgcagtggctaacgcctgtattcccaa
-cgctttgagaggccttaggcgagcagatcacttaaggccaggagttcgagaccagcctga
-ccaacatgtcaaaaccccgtctctactaaaaatacaaaaattagccaagcgtggtggcag
-tgcctgtaatcccagctacttgggaggctgaggcaggagaacccaggaggtggaggttgc
-agtgagctgagattgtgccactgcactccagcctgggtgatagagcaagactgcatctca
-aataaaataaaataaaaaaaTCAAATCAAATAAAATGTCTCCCAGAATACACCACCCCAG
-CAAAATGGCAGGAGGGAGTGTCACCTGGGGACCTCCACTTTGGAGGTTTGAGTGGGCAGC
-TTTAAGCTGGAACAGTCACTCTTGCTGTGGGTTCTCAGGGCGGAGACTGAGCCCCCACCC
-TGCCTCCTCAAATGCATTTCCTCTCAGCTCCCACCTGCCAGCCCAGGAGAGAGGGAGGGC
-CATTCTGTCCTTTTCCTGCAGAGTCCCTTTGTTCAGTTGGTGACCAACATCCTGAAAAAC
-ATTCTCAGGAGATCAAAAAGAAGAACATTTTGGTCTATGTGGTAGGTTGGCCCAGTGCAC
-CACGCCCAGTGCAGGTCCCTCTTGAAACCACCTTTGGGAAATTATGACTGAgacaccacc
-tttgcaaaattatgactgagacaatgagagatctttttttttttcctttgagacagagtt
-tcgctcttgttgcccaggctggagtgcaatggtgtgttctcggctcactgcaacctccac
-ctcctgggtttaagcgattctcctgcctcagcctcccgagtagctgggattacaggcacg
-cgccaccatgcctggctaatttttgtatttttagtagagacaggtttctccgtgttggtc
-aggctggcctcgaactcccaacctcacacctgaggttgcctcagcctcccaaagtgctgg
-gattacaggcgtgagccaccacgcctggcccacagtaagaggtcgaacttaacctactct
-atcttgcttctaacctccaagctgtccttgttcattcctgggcataagctgaactaacct
-tgggagaaacttagtttatactttaaacagccctttcccaaagcagacctccttcttgcc
-tggggactaagctgcctttgtaggactaacattagccacaaaattagaaattttggttta
-ggagtcatgcagctggaggctacaagatcctgaccctccctaaactactcctgacatcag
-ggcttgagatatttttcagaccctgcacttgatggatcagctggcatcacccacgtcaat
-aaactggctcatctgatcttgtggcccccacccaggaattgattcagctcaggaagacag
-cttggactccctgtgatttcaaccctgaccaatcagcactcctggtgcactggcttctcc
-ccacccaccaagttatccttaaaaactcttctccccaaatgctcggagagacagatttga
-gtcataaaactccagtctcccacgcagctggctctgtgtgaattactctttctctattgc
-atttctcctgtcttgatgaatcggctcttgatgaataggcagcctgcaaggtgaacccct
-tgggcggttccaCTCTTTGCCCAGGGTGATGTTATTTCTCTCCAGGATGGCTGCAGCGGC
-TTCTGAGCCTGCTTGCATCTGGTGTGGTCCCTTTCAATGTCACGCAGGCCAAAGCAGCCC
-TCCATCTCTCCATGATCTTGGCTTCCAAGGTACTCTGTCTCTCTCTCTGGGTCGCCATAC
-TGGCTTCCATCAGGCCCTGGAATGCATCCTGCTGGTTCTATCCCTTGGCCTTCAAAAGTG
-CGGTTTCCTCCTGGAAGGCACCTTCTGCCTTACCTCACACTTCCTTCCCTCCTACCTGCC
-TTGAGATACCAGCTTGCAGGGGCATTCTTGGGAAAGCCGACCCCTTGGACTGAGTCTGGA
-GTTTTGATCTCTCTCTCTCttttttttttttttggagatggagtttcactcttgataccc
-aagctggaattcaatggcgtggtctcggcttaccacaacctctgcctcccaggttcaagt
-gattctcctgcctcagcctcccaagtagctgggattacaggcatgtaccaccatgcctgg
-ctaattttgtatttttagtaaagatggagtttctccatgttgatcaggctggtctcgaac
-tcccaacctcaggtgatctacctgccttggcctcccaaagtgctgggattacaggcatga
-gccaccgtgcctggccttttttttttttttttttttgagatggcatctcactttgtcacc
-caggctggagtgcagtggcaccatcatggctcactgcagcattgaactcctgggctccag
-caatcctcccacctcagcctcttgagtagctgggatcacaggcatgtgccaccatgccta
-gctaatttttgtatttttttttgtagagacagggtctcattatgttgcccaggctggtct
-caaactcctgggctcaagcaatcctcctgcctcaacctcccaaaatactgggattacacg
-tgtaaaccaccacatccagccCTGATCTCATTCTTCAGAGAATTTACCTAGCTGGTCACT
-TGGTGTCTGTAGGAGCATCGCCTCTCAGGCCTGCCTCAAAACTGCATTTCAGTTGGGAGT
-GGGGCGGGGGGAGGGAGAGTGTAGTTTGGGGACATCAAGCGTCTGTGGTGGATCTCCTCC
-CAAAGTGAGACTGCTTTTTAATGatatttattgagcacttactgtttgccactgcggtgc
-taagcactttgcacatactagctcagtgcatccttacagcaatcctgggagggaggtgct
-tttctcatccgcatgtgctgacaaggctgagAAGAGCTGGGTCTTGCACGGTACCTTAAG
-GGCTAAAGACCTGCAAGGATGGTGCATGAAAGCAAAACCAGAGAGGCGCCTTTTCCAAAT
-GCCAATGCGCCCTCCACCCAGTCCTTCACAAACCACATCAGCATGGATAGCACCACACTC
-CACAGGCTTTTCTGCATCTCCTTTGTGTGTGTGCACATGTGTAATTAATTCTGGGGCAAC
-TTCCTACATCAGTACAGAGAAACTCCTTGATCATTATCCACTCCAACATCCTTCCTGGGA
-GGGACTGACTGGAAACCCAAATGCCCTtgtaagggcaaatacaaaaactaaaataattct
-ccctggtgcagaaaaaggaaagaaacctcccgtttcctgttcttaaacactctagagcaa
-acactttagaaaacttctcaattatttctctgttcctttaagatgtgtctttttaaaagc
-caggtgagcctcctgccagttttacaagccagggatgttttcccaaggacctaggagcca
-tctctttggaaggtaaacatcaagattgcacccttctcatccagtctccatgggcagata
-ggagcctaacttcagtgcttggctccaagttgcaaaacaatccatcgtctatcataaaga
-tgtgagtttatattttctctggataaagacaattagctaacacagatggccactccaatt
-accaggtgaattcgggatgaaataagttgcaaattgtgttgtgcagtcatctgactcgag
-aactatttttttttttttgagacagagtctcgctctgttgtccagtctggagtacagtgg
-tacgatctcagctcgctgcaacctctgcctctcaggttcaaacaattctcctgcctcagc
-ttcccgagctgggattacaggcgtgcactaccacacctggctaatttttgtatttttagt
-agagatggggttttgccatgttggccaagctggtctcgaacttctgactttaagtgatct
-gcccaccttggcctcccaaagagttgggattacaagcatgagccaccaccccggccctag
-ttattatttgaggacatgtatgcaataggttatacctgcttggttatataggaggacgaa
-atgtatttctctttgtaatctcttttgtggattgcctgtgatgcccactgcagtctggtt
-taacgcttatttaataataaaactgttttctcttctacttttgtggaaaggttttctgga
-ttagATCTTTAATTTTGTCTCCAGCATCTTCaaatgtctttctacagagggttggttaaa
-taaatgtggcatctccacaaaagagaatactgcacagtcatggcaaaaaaacaaggagcc
-tgttttcgttgttgaatgaaaagtgcaaggtgcacaacagtttactactttttctgtaaa
-aaaagaggTCTGAGAAGGCTGTATTTGCCATTTGTATAATCTCTGGAAGGGTAAACAGCG
-ACTGATAAAAGTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTAAGAGAAAC
-TGGGCAGATGAGGGAGAGGAAAGGGATGAAAACCTTTCTCTGTACACCTTATATTTTCTG
-ATTTTTTGAAACACGTGACTGTATTACCTATTCACAGTAAGTTAACAGGGATGGGAAGCA
-TGGTGGTGGCAAGCAAACGAAACCTCTAAAAAGAAGTCCCAGGggccgggcgcagtggct
-aactcttatgatcttagcgctttgagaggccaaggtgggcagattgcctgaactcaggag
-ttcgagaccagcctgggcaacatggtgagacctcgtctctactgaaaatacaaaaaatat
-gccaggtgtggtagtgcgcacctgtagtcccagctactccggagactgagaggcaggaga
-gtcacttaaacctgggaggcagaggttgcagtgagccgggatcacaccactgcactccag
-cctgagcaacaggcaggactctgcttccaaaaaaaaaaaattagccaggtgtggtggtgg
-gcacctgtaatcctagctactcaggaggctgaggcaggagaatcacttgaacctgggagg
-cagaggttgcagtgacctgagattgcgccacggcactccagcctgggtgacagagcaaga
-ctccatctcaaaacaaaaaaaGCCCCAGAACCAGACATCCTTAAGCACTTGATTCTGTTC
-ATTTCTGAGCTCAGCCTTGAGCTTAGAACCAAGTGAAAACTAATTACACATTTTCGGAGT
-TCACATTAAACttcttctttttaaaattattatttttgagacagaatcttgctctgtcac
-ccaggctggagggcagtggcacgatctcagctcactgcagcctccacctctggggttcaa
-gcaattctcagtctcctgagtagctgggactacaagcatgtgccaccatgaccagcaatt
-ttttgtatttttagtagagatgggtttttgccatgttggccaggctgatctcaaactcct
-ggcctcaagtgatctgcccgccttggcctcccaaagtgctgggattacaggtgtgagcca
-ctgtgccATGCCTGAACTTCTCCTTTGAAGGAAGATCTGAGTGTAAAAGCAGGGAATGCC
-TTTATTTAAAAAAATGAAAAACAGAAACTAAAACAAAATAACAATCACCTCTGTTGCCTC
-CATTTGAGAGAATACTTCCAGGGGCTCTGCATGTCTGGTCCCCAACCTGGTCGGGGAGTT
-CACTTTCAGAGGCTCAGGGATGGGCCTTCCCCAGCCCCACCAGCAAATCATCTCTCCCGG
-CTTCCAGGAGGGTACTTACTCTCCAACTAGTGGGCTTTATGGGCCAGGAAGGATGACAGG
-AAGGGGTGTGTGGGGTACTACGTCCCTCCACACTGAGAATCCGAAAGCCAAGATGCCCAA
-GATTCTATCGTTATCTGCTTGTCTTGTAGAAGCCCCTCTGTGAGACTGAGGGGCAAAGGA
-GAGAGGGCAGGGGCGTGTCTCAACCCTTCTGGCCACTTCTAGGTTGTGCAGACTGCCACT
-CTTGTTACTACGATGGACTGTCAGATCAGCAGGTGGCCCAGGAGGGCTTGCTTGATGCGG
-GCTGCTTTTTCCTTTTGCCTCCGTGCCATGcctgtgaggtagttggtacttactggaatc
-cccactgcatgcatgaagaaacaggcacagagaagccaaatgactttcccaaggtcacac
-agcctgaagggacagccggctgtcccagctgtttcccttctaacacccttgggcctgcct
-ccagctagatgctgcAAATCAGTCCTCTCTTGAGAGTCAAAGCAAAGGAGATCTGAGCTG
-GTCGTCACAGGTAGTGTGACACAGAGTTGGGGATAGAGCCGCACCTTGCATTTCCAGGTG
-CCATCTTCCCCACAGTCCCCAGTGGGCACTTGCGTTCATGATTCAATTACTCAGGCTCTG
-TCTCTCTGTTCCTGCCCCTTGCTCTGTGACCTGGCCTCTCTGGACCCCAGTTCCGTCCGT
-GAGCGATGGGGGCGGGGTCGGCGGCCTGCCTAGGCTGGACAGTGCAGATTGCAGAAGTCC
-GCGGACGAGAAGAGCCGCAGCACGTTGACCAGAGGGAACATGAGCAGCGCTCCGAGCAGC
-GAGCCCAGCTGCACCGCCGCCCCGCACCACAAGAGGGCGCTGCGGCTGAGGTCGCGCAGG
-ACCACGCCCAGCATCACCTTGACGTAACTGAGGCAGCCGCTGAAAAGCACCCACGAGGCC
-ACCTGCGGGGCCGGGAGGGAAGAGGTGCAGAGTCACGGGGCTTGCGGGGCGAGCGCCGGA
-GCAAAGAACTCTCACAGGGCTCAGGGGAACCCACGGAATACTCTCTAGGTGCGAGGAGCG
-CCTTCTGGGAGTGAGCCTGCGGGGCCGACGGGTCCCATGAGTTGGCCGCCCGGGGGCGAA
-GGAGAATCCAGTGGCTTTTCTGGGTTCACGTGCCCATGATCAGGGCAAGGGCCCTTGAGA
-GAAGGCCCCTGCTGAGGTACACATGGTGGGAAGAGGCCTACCAGTCACCTCGATTCCCTA
-AGCCTCCACTCCCAAATGAGGAAGGGGCGCTTCCCCCACCTGGGGCTTCCCGGGAGGGTC
-CCACAGACCCCGCTCGCTGGAAAGGGCCGCGCCCAAGCTCTCCCAGGCCTTGGCTAGGGG
-TGAGGGGTACGCAGCGGGAGCAGCCCCACCGGCCGGATACTCACAATGAGGACTTCCCCA
-CCCCAGTGGCCCTGCAAGAGGGGGCAGGGGCTCATCACCGCCATGGCCATGTTGTAGCCC
-CCAAAGCAGGTCCCAAGCACGGAGAGGACCCCCAGGAACAGCAGAGACCTAGAGGAAAGT
-AGGGGAGGTGAGTGGAGGTGAGAAGCCTGACCTCTGACCCCCCCGCCCCACTGGGCGGCA
-TGTGGATGGCCAGTGTCTCCATAGTTAGTTTAGACCCATGTGGAAAATTCCAGGTTGCCT
-GGCTCAAGTGGGTCAGGGAGGCTCCTGAGCAGGCAGGGCTGGCCTGAGTCATCCCCAGCA
-TTAACGGCAGGGCCTGGCACCCCGgcaagaaaaacataatggactctggcaccggatggt
-cctggttcaaatcccagttctactgtttaagctgAGACTCGCCTCTGAGCCTCCAAATCG
-GAGTTTTGCAAGGCTGCATGACCTCCAGGAGCAGAGCATGCAGGCCTGGCGCCGCTGTGG
-GCCCACCTGGTGTTTACCTGCTGGCATTTCCTCCTGCAACACACCCTCAGCCTCAGCCAG
-GAAGCTGAGTTGAAGTGAAGATGGCTGGATCGGGCATTGGCACAGTAGGGTTTGCTGTGC
-CTCCTCAGGAGACCCCTCCCCTTCTGGCCTCAGCTACCTGCCTCTGCAATGTGGAGTGTG
-CTGATCTCCAGGGGTCCTGGCAGCTGGCTTGTTGCTGCTAGGAGCATCTCTCTACAGGTG
-GCCTTCCATGCAAACCTACATCTGGGACCACTGTCCTTCCTCACAGGTCCTTGTCCCTGG
-GGTCCCAATCTCTAGAACCCCAAGACTGGTCCACGCCCTGGGTAAGAACAGACAGAGGTC
-TGCCTATACCCTTAAAGACTCTTTCTGCTCCAAGATTCTTGGATTCCATGACTCAGATTC
-TGTAATTCTAACATTTGGGGTTTCTTGGATTTGCAGGTCTGAGCCTTTGGTCCTGCTTCC
-CTCAAATCCTCCATCCTCTTTCCAGTTTCTAGGTCCCAAGGTAGAAAATCCAGCTTCCTG
-GCAAGCTTTCTGTCAAGCTCTTCTGTCCTCACTGTCCTTCTTCTGGGCTGGGAGAGTGGG
-TGTAAGCAGGCCAGTGAGGACAGGCAGGCCAGCGTGGATACGAGGCTGTAGGACCCACCT
-CAAATGTCAAGATCCCAAGGTGGTAGTTCTCCTACAGGGGTCTGAAGCCCCTGCCTCAGA
-ACCGTCTGGTTTCCTTACTAAAAATTGAAATCCCAGGTCCCAGTCTAGGCTGGTTCAATC
-TGCATTTTATCAACTTGCCCAGCCATTCTTCTAGAACTGTGGCTCTAAGGGAACCAGCAG
-GAGGTTAGAGGCAGGAAGGCAGGGCCGAAATCCTGGGAATTAGACCAGGTCAAGCTCTTT
-CTCCAAGCCTCAGGGTTTCCCCTTATAAACGGGAACCTCAGTGGCTATCTGCTCCTCCTC
-ATGGACTGATGACaatgatggtcaacgcttaggctggacctgccacgtgccaggcaccgc
-tccaagagctttatagaatcagctcatatcatgcttccagcagtcctaggaggtggaatg
-ttacactcccattttccgataaatatccctgaggcacagagaactgaagtgacttgtctt
-acacacagctgacaggtggcagagctgggatttggaccagggtgctccccaaacatgttc
-ttaaccactaCATGTACAGCCCAGTAGGTGCGTTTGGAATTCTGGGTTCTGAAATGAAGT
-GTTCCCCCACTAGGATTCCCTAGGACCAGATGAGGGCACACCTGTTAGGCAGGAACATGG
-AGACCAACGAGGCAAGAGGGTTGGCCACAATGCTGAGGGTGGCAGCCAGGTGGTAGGCAA
-CTGGCCCATAGGACAGGCAGGAGTAGGTCTGCACAGAGGGCAGCATGCCGTTGGTGAGCG
-CGTTGACGAAGGCCACCAGGGTATAGATGAAGGCCAGGTGCGCCGGGCAGCAGGGGGCTG
-CTTTCTCCTCTAGATACCCCTGGCCCTGGCTGCTGTCCACCGTGCCTGCAGGGCCCAAGT
-CATTCTCTTCCCGCGGCCGGATGGAGTGGAGGGTGACCTGGTCATTGAGGAGGTCTTCCA
-CGGAAGCCTCCCAGCACCTGGGTTGACGCTGGAGGACAAAGAACGCCACGAGGCAGCAGG
-CCATCATGATGGATAGGAGGAGGAAGAAGACCAGGGGTGAGAAGTGGGCGGGAAGGTAGC
-GGCTCTCCAGGTGGGACAAGGGTGCTTCCATTCCGGGGAGGGCGGACACCAAAGCTCTGG
-GAACTCCCTGCAAAGGACAAGACAGATCCCTGGTCAGGGGAGGGGATCAGGCTGCAGAAC
-AACAATCATGACAGTGATAACAGAATACAGATCACCTGTTATTATTAATGGATAATGAAT
-AAATAAACATAACTAACAAGGTGGCAAtaatgactgctcatactgactgcccactgagca
-cgggcactgtgcatggataagcccctatgcctcctaacagggctgcacagtgggcaccat
-catcccccattttagagggaactgaggtatcagaatgcttcgtcccttacctgagggtca
-cagggagaatgtggcaaagccagactccacctggtgctttctgacttggaagctacacct
-tttatcaccccacAGCAGTGGCAACCACAAACATGTTCAGAGGAGGAGCTAGCTGGAGAC
-TGAGCAGTGGAGCCGCCCACCTAAGAGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACC
-TAAGGGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACCTAAGGGGAGAGCCCCCACCTA
-AGGAAGAACACTGCTCCACCCATCGTCTAGGAAATAAGGGCCTTcaggacatgccatccc
-aaaatatgactgtaggaggccagaatatgccaccccaaaattgacctattggcatatttt
-ttatttctagctggttattttgaaaaattgcaggctaaggagtagctctgaaaagttgcc
-attttgtaagataaatttacatctaaaggaaatttttattagtaaagctatcttatctgt
-accaagaaaaggtatctgtaccacgaaggggtatctgaaccaggaagagaaaggtgatgg
-cctttatcacccgaggaacttttatctgcataacagtgcaatgtttattcaccataagtt
-tcctcccttcactctcccataatttgtctccaccatcctgcagtagcctcaagcccctat
-tcccttttgtagctcaggatgctatagaagctgaaatcatctggcccttttttgagtctc
-atattttttggggactcccatgcgtatgtatgtaagtaattaaaatgagtttcctgctgt
-tgatctgccttatgtcagtttaactcataggccgaccaaagaacctagaaggatggaggt
-gagcagtttttccctcccctacaTTTGTGATAAAGCCAAGTGCTGAGATGGCTCCGGGTG
-ATGCTGGGTACCTGTGCGATGTCAGTCTCCCTCGTGGGTACAGGGCTTGGTACGCTGTCT
-GATATCTCAGTGACATTGACGCAGGTAGTGAGACCGGAGCCCTGGGCAAGAGCCACCAGG
-GCGGGCAAGAGGCCGCTGAGTCCTTCACCCACAAAGAAGGTGGTGAGGTAGTAGGTGGGC
-AGCCGGCTCATGAACGGCAGGAAGGTCACTGAAGAGGTGCAGTCCACCAGGGCCAGGAAG
-AAGGTGAGGACCAAGAAGGCGATGCTGTGGTGGCCGTCCAGCACCCAGGAGGTCATATTC
-CAGAGGAAGGCAAAGATGATGCAGGTGACGGTTCCCACGCCCAGCAGGGTGAAGATGATG
-GGCACTTCGGAAAGGCAGCTGGGCCGGAAGTGATGGAGCAGGGTGACCAGGAGGGGCCCG
-ATGTTGGCCAGCTGGATGACCACCGTGAGGTAGGAGGGCAGGTACCAGCCCTCGGGCAGC
-TCCATCACCAGCAGGGGCAGCTCTACCCAGAGCCCATTGATGGTCACCCAGGAGCCCATT
-CCGAAGACGCAGACCAGCAGGTGCATCAGGAAGGCCATGGCGGTATCTGCCCTGGGCCAG
-AGGCTTTCTCAGATCAGCCTGCAGCGGGGCTGGCAGAGAAGGACACCAGGTGAGTAATTC
-CAGCTTCACCACCTAGCAAGATGCTGGGACCTGGGGCCCAGAGTTTTCTCTTATTACTCC
-CCTTCCTGTGAACAAGCTGGCttttttttttttcctttgagacatagtttcactctttta
-gtccaggctggagtgcaatgggatgatctcggctcagtgaccctctgcctcctgggctca
-agtgattctcctgcctcagtttcccaaatagctgggattacaggtgcatgccaccatgcc
-agctaattttgtatttttagtggaaacagggtttccccacgttggtcaggctggtctcga
-actcctggcctcaggtgatccgcctgcctcggcctcccaaagtgctgggattacagtgtg
-agccaccacgcctggccCAAGCTGTCTTTTTATTAGCAGAAAACAAGAGAAGCCTTTCCT
-AACCGTGATTCATGAAAGAAAAGTTCAATCCGACACACAAAAGCaaacaaagcagcttct
-gcaaaagataccaacagcaaggtcaaaagttaaatgaaaacacggggaaaacatttgcca
-cataaatcacagacaaagggctcatcttccttgtcaggcctctgagcccaagcctgcgcg
-tgtacatccagatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggccggtt
-cctgccttaactgatgatattaccttgtgaaattccttctcctggctcagaagctcccct
-actgagcaccttgtgacccccacccctgcccgccagggaacaaccccctttgactgtaat
-tttccactacctacccaaatcctataaaactgccccacccctatctcccttcgctgactc
-tcttttcggactcagcccgcctgcacccaggtgaaataaacagccttgttgctcacacaa
-agcctgtttgatggtctcttcacatggacgcgcgtgacattcctaatatataaagagttt
-ttaaaaatcaagaacaaagagaccccatatagaagagggccaaggatatgaacaattcag
-agaaaaaggtacaaataagctttaaacacatgaaaatattatcaccttcattcacaatag
-gaaaactactccaggtgccatttctcaccatgagattgtcccaaagcctgacaaaatgac
-tcatgttcaaggttattatagattgcgatcttgttggtaatagcaagttatgggaaattt
-tctcctgggtggctaccaacagagagggggctaattaaagggacctgctggaataccaca
-tacctgtttaaaggaataagaaataaggaaagcagatcttggtgactgataaggaaaggt
-ctccaggctataataataatcttgaaacaaaatcaaggcaggtaaatggaaccaggaaaa
-agtgtactgccttttggtcatagaagaggaggaaaaacaTGTTTTCTTTGCTTGTACTTG
-CACAAAGCAACCCTTGAAGGACACACAGGGACTGCAGGGATGTTGGTGATGCCTCTGTAT
-ATCttttttttttttcttgtgacagagtcttactctgtcaccaggctggagtgaagtggc
-acaatctcagctcactgcaacctctacctcccgggttcaagtgattctcctgcctcagcc
-tcccaagtagctgggactacaggcgcccaccactacgcccagctaattttttgtattttt
-attagagatggggtttctccgtgttagccaggatggtctcaatctcctgatcttgtgatc
-caccctcctcagcctcccaaagtgctgggattacaggcatgagccaccgctcctggccCT
-GCCTCTGTATATCTTTTAATAAGAGTTTTGATTTGTGAACCATGTAAACATATTACCTGA
-TGCAAATATATGGTTACCTGAAATAAGATTTCAATCTGGCTTTTTTTCCTCCTGAAATTA
-TATCACTCTCTACGTGGCCTTTGGAGACCACTTCCTCTAGCCCTCCAGAGCCATTCTGCC
-ATCTGTTTACCCCTTTGTCAGCTACCAGTGGCAGCCCACCTGTGCTGTTACTAACAACTT
-TCTTCTATCTATCCTTAGTCTGAGCAGTAATATGGGAGATGCCAGGAGTGAggctctgga
-gccagctgtttgagtttgaccctggctctgctgcttacaatctgggtgaccctgggcaag
-tggctttgcctctctctgcctcatctcctcatctgtaagtaggggatagtgatagtatga
-actccgtggtttgttgtgagatataaggatgctggtgagtttatgctgtttccaacagtc
-ccagcatagggtaagcacctctaagggttactgatcattATCGTGAAATGGCAGGTTTGG
-TGACATCGTTATTTTTGTCTAATTCACATGAGAATTAATACATGACTATGAAAATTTAAA
-AAAGGAAAAGATTCCCCTACTAGGTATCAAGTGAACTCACCAGTGGTATATGCACCTTTT
-TGTAGAGACACGCTAACTGGGCCAATCTTCACGTTTTGTAGATGGGAGACGAGGTCCGAA
-GGGGCAGAGGGGCTCTCCTGGGATCTGGACTGGATCCTCTGCAGCAAGCGGCCTGTCCGG
-GACTCCTCAGTTCACGCTGCAGTCTTTAACTCCATACTTCTTCCTTCTAGTACAAAGCAG
-GAGTGTCCGTTGTGGCCACGCCTCACCCAGGAAACTCCTGAATCCTGGCAGCTCCTCCCC
-ACGGTTCCCACACACGGAATTCCCTCACAGGGCTGGGACTTCCTTCCTCATACCTTCACT
-GAGCGAACCCAATGCTCAGTGGCCTTTCTGGTCACCTCCTTTTCCTCTCTGGGAGGAGCC
-ACTCCTGGGGTGTAACGCAGTCAGATCCCCTAGCAGTCCCGCTCTGCCCCCTCCCTTCTG
-GGGGCCTCAGACTCCATTCCCTCCCTTAGGAAGCTGACTTGACTAATAGCACAGGTGAGG
-CCCACTCCAGGCGTGCCAAGAGGACCCAAGGAGGGAGGGGAAGCTCCCAGACAGCAGTGG
-CACAcctttgcctgtgctgtcctcccagcctggagcaccagccccctctgctgtccacat
-ccaagctttctacaagactccgtcctccaggagacctctggctgcctcaccttctcaggc
-gtcctcaccagggcccatgaccccttcatttcaggttgttcttgtgtgggtgcatgcagg
-cacataccttgagactgaagctttttgagggcaggggctgCTTGGGAATCTGACATTTTG
-AAGGTGGAAGGGCCTTTCTCAATGACTTAGCTTAGGATTTGTAAATTGTTAACTCACTGG
-CCACTGCCAGACAGCAGATATATTACTTTGGTTTGCCCAGTGTGTTTAACAATTTGTTAC
-TGTAATCAGCAGTGGAGGGGATGGCAAGCAACCTTCAGCATTTCTGGCTTCTCAGGAATA
-TTTTGGAAGAAGTGGCCCCCCACTTTGGCCTCTTTCTCTGTTCTAGACTCGGGCCATCTT
-GGAGCTCTCCCCTGCGGTAACAtctggaaccagttgcctgggttcaaatcccagcttcaa
-cccttacaagctgagcaagtgacctaacctcctgtgcttcagagtcttctcttgcaaaac
-agctataggctgtcagtaccaacatcagaactgttgctaggaacatgcactaaagtgcta
-aaactgtgcctgccacatagtgagggctcaatgaaCCATCATTATAAGATTACTATTTCA
-GCAAACGTATCAGTTGCATTCAAAAACATGTAGTTATTggccaggcgcggtggctcacgt
-ctgtaatcctagcactttgggaggatgaggcgggcggatcccttgaggtcatgagtccga
-gactggcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaattagcccag
-catggtggcgcacacctgtaatcccagctactcaggaggctgaggccggagaacggctcc
-aacctgggaggtggaggttgcagtgagccgagatcatgccactgcactccagcctgggca
-acagagcgagactccatcttaaaaaagaaaaaataaaaaaaaGGCGCAGtttttgttaga
-caaatggccactcaactaaaggactacatttcccagccttctttgtagctgcacatggcc
-atgtcatcaagcacaggccaatgaattcaaatgcgactttgagtagtctccttagcccgt
-ttcctgtttagaaaaaaaagtgcagctcgttgccagcactcatttaattttatgtaaacg
-tgctatttgaggctgaagcaaatctgattctgactgctgttttttttttttttcttttga
-gacagagtcttactgtgtagcccaggctggactacagtggcttgatctcggctcacagca
-acctccgcctcccgagttcaagcagttctcgtgcctcagtctccttagtagctgggatta
-caggcgtgcaccacaatgtccggctaattttttatatttcttagtagagacggggtttct
-ccatgttgccaggctggtctcgaactcctgggttcaagtgatccccacgcctcagcctcc
-cagagtgctgggattgcaggcgtgagccaccaagcccagccctaaatctgactgattttc
-aatgtgaaaataacatgtaaaaactgtttttgaagttatttctaaccagaactaacatca
-gactcatctatttcagaaaaactggattcatcaaacgaatctttggtcaacaactgttca
-agaacaatgttaacatcacacataggaatgctaggatttgctattttcagcgatcgagaa
-ttactttgttttgtaaatggaaataccacgactaaaaccagaatgctacaaatagagtga
-tgtcttttgtttccaaagtcaatatactagagcaaggcaaaaataataataaaagcgagg
-tattttgtggcaaagttatcttggggtaaacactgcagtcacaagtgggtattccttctg
-gcaaacagggaaagagttaacaataagggagtgtgcccttctgctcttcctccatttggc
-tgtctggaatcagatgtgatggccagaactccagcaacgattttgtgctatgaggcatgt
-ggtgggggttagatgcatactaggctcctttgggattttgtggcagagagcacccatacc
-agccctgttttgcctgtgttgaactgttttgtttgtttgtttaatgttgttgttaaattg
-taaaagaaacttctatgttgtttaagtcactcttattttATGTACAACAAAAGTACTCAG
-Aggctgggtgcagtggctcactcgtataattccagcactttgggaggctgatgttggcag
-atcacttgaggtcaggagttcaagaccagcctccaactggtcaacatggtaaaaccctgt
-ctttaccaaaaacacaaaaaattagccaggtatggtggtgggcacctgtaattctagcta
-ctcgggaggctgaagcaggagaattgcttgaactcgggatgtggaggttgtagtgagcca
-agagcacgccagtgcactctagcctcggcgacaaagcaagactcttgtctcaaaaaacta
-aaagaaacaaacagacaaaaaCTACTCCATACTAAGTGCACAGAGATACACATTCCAGGA
-TATATATTGAAAGATTATAGTAACCAAAAACTAATGAATACATTTATCTCCTTTACCACC
-TACTTTCTGACTCTGAAACTTAGGTCCTGTCCCAACCAGGATTTGATCAAAAATCAAAAT
-TTAACAAAAGTAGTTGTTTAGACCCTTGGGGGCAAATGTCTTGCAGAGATATGAAAAAAA
-AAAAAAAAAGGAGAAGAGAGAAAGAGGGAGGAACAGAGGAACACAGAACCCTCCATATAG
-CATTTGGTACCAAAAGTATAAATTGAGACCAAGAGTCATTTCATATATCAAAACTCTAAT
-TCATAAAGGAGTCAAAATTGTAGTGACTATCTGTATTCTGAATATTTCCTGAAATAGCCT
-CAGACATTCCAGGAGAAATGGACAGAAGCACAGTCCAGCAGTACAGGCCTGACTCACCCT
-TCCAGGTCAAGACAGCAGACGAAGGTGCAAAATAAACAAGGATATAGCAAAAGCAATAAA
-TGATATACCTAGTAAAGAGGGCTAAGTCAGTAGTTAAGGGGAGTAGGCGAATTTGCAGAT
-GATGGTGACCTTTGCCATATGAAAAGCTATTAAACTAATGAGAGTGTCCAGTTAAACATT
-TACAAACATCAGTAGCTTTCCCACAGAGGGCTGGATGGGGAGATGAGGGCAGACAGGGCA
-GAAGTAGCCTCACTTTCTTGTATGTTCGACAACTCCTAAGCTCTGAACGCCTAAATCCCT
-GCTCCCCACAAAGACGAATTCTCTGGTTTTGACCCAGGTGCTACCACGGCTGTGTCACTT
-GAGGGATGGGATTTGGCTCCGGGGGTCTGTTTCCTTGTCTGGAAACCAGGCACAGTGGGG
-GTGTGTCCCCACGTGACCCATCTGCCCTATGGCCCTGGCCCACTCCCAAATTATCTCCTT
-CCTCAAAAGTGAGGTGTGCTTTTGGACCTCGGGGACACAGTGAGGAACAGTCATTAATGT
-CAATGAAGGGGATGTCTTAGGCAGAGGGAACTACATGTGCAAAAAGGCCCCAGAGAAAAG
-GAGAGACTCAGAATGGCTGGTGTTCGGAATGTGTTGGGATACTTTTAAAAGATGCATATC
-TGTATtttctgttttttttttttttgttgttgttgtttgtttgtttattttACAGTGACC
-TTGCAGTTCTTatttattcattttaaccagtatttcttgggcaccaactgtgtgctcaac
-cacAATCCCTGCTCTCAGGAAGTTGGAGGAAGCATTCACGAAGCAGAATAAAAAACAGAA
-ACATAGAGCAGGTCAGATGGTGGCAAGGACTCCGGAGGAAAGCAAAGCTCCTGAATGGGG
-AATGTGCCGCTGTCAAGGAGAGgacatgaagggagtgtgggagtgagctgtctgcagaaa
-gcacggtccaggggagaaaacagcaagtgaaaaggccctggggtgcggccacacctgctc
-tgtcccagaagtggattttgctgttcaaaggacagctaggaggccagtgtggccgcagca
-gcgggagccaggttggaggggaggagacagggcaggtcccctgtggccctgtggtgacag
-cttgggtgttttctctagagcaaaaagctccgtgagtgggcagaagagaccagctctaat
-ctagtttttaacaggatcgtgctggctgttgtgaggagaaacatgaggcgccagggagga
-agcaggagtaaaccttcggagggttaggaagctgtagcaAAAGAGCTAACAATCACCATG
-ACAACAGTGACAACCATagctgccactcctcagctatttattgtgccagaccctgtgcta
-agctctttgaacacattacctgtcaaatcttgttccacaatcctgaggctggcattatga
-ttatctccattttacagatgaggaaactgaggtttaaaagggaaataaatttgcctaggg
-tcatacagctgggagctgagctttacatccaggcatgcttgactGTGGACCCAGCCCTGA
-GAAAGGCCTCAGGGTGAAGGGGTTCTGAAGGGGCCATGGGGGTCAAGCTGAGCAGGATCT
-CTTTCTGCTCACAGATGGCCTCCCAAGACTTGGGCCAGAGAAAGAGAGAAATGGGGTACA
-GGCTCAGGAGAAGCTGAGAGAGGCTCTGAGACATATCTGCTTCCCAAGGATCCAGGACCC
-CTTATGTGATCACCAGAGACCAGAAACCTAAGGCTTCGCATGAGACAGTTAAGATGCCCC
-ATAATGCGTGGGCGACAGATAGAGAAGCTAGAAGGATCAGTTCCAGGCAAAGGTTTCTCT
-TTTGCATTCTTGCATCAAAAGCTGTGAGCCCCCAGCCCAAGAAAGTGAAGAGAATTGGGA
-GTGGGGTTCTGACCAGGGCCAGTGCACCGTCATTGTGTGGGCTGGGCCATCTCCTCCAGG
-GAGCTCAGGCAGCTTCCATCCCACCCAATGTCCCCCGCCCCCCTCCACATTCTCCTGCCC
-TCTGTTTTCCTCCATCAAAGTATTACTGACACCAGCTCAGTTACGGGAGTTTATCTGTGT
-CTATCTGTTGAGCGCTGGTCTCTCCCATTGGAGTGTAATCTCCATGTGAGCGGGGGCTTG
-TCCTCTCCCCCAGTGCCCAGGTGACCATCTGGCTTGCCACGGGCTGGGCCACCTGAGCTC
-CTGGCACCATGGCTGGGTTCTCGCTCTGCAGGGATAATCTGCCAGCTGGTAGGCACCTAG
-CCCTGTGGGCCAGACTGGAGGAAACCCGCCTCAGCTATGAGGGTTGTGTTGGCCAGGGTG
-ACCCCTGGGGCAGTGCCAGGTGGCAGCCTGACACTGGATACATCTCACTCCTGGGCAAGG
-GTCTGAGCCAATTCTTTCCTGGGTTCCAGGCTCCTGGAGAACTTAGTGAGGCCTGTAGGC
-GTCTACTTAGGGCCTGGCCTCACCCTCATGAGAGTGGGTAGGAATGGACTGACTTTGAGC
-CCATGAAGAAGGGAGGCTGAGAGGTCAAACCACAAAACCCACagggagagatgggggaga
-tgaaggggagtgagagagaagagactgagacaaagagacagaaagaaccgaaagctagaa
-gcagaaatggggagaaaggacaacagaggcacagagacagggaaaaatgagaAGCTGCGG
-CTGAGAGGGAGGCAGGGAGGTGCCAGGAGGCAGGAGGCAGCTGGGGCGCTGGGAGCCTGG
-CCTCAGCCACCCTCACTGTTCACAGCCACATGTAGCAGAAGGCCATCTCTACCTCTTGTT
-GCTGGGACCTCAGAGTTCccctgaaactcatcccaactcaatgtccctattgcacaggtg
-gggaaaccaaggcccagagaggagatagtgcttccccgaACCCTGCCCCACCCCTGATCT
-CAGGCTGTGGCAGACattcaggcctgtgctcaccggctgtgcaacctcaggtcagctgct
-caccctctctaggccttggtttctccatctgtgaaagggTCTGGGAATGCCCAGCCTTTC
-TGGGCTCAGCAGACCAGGAAAAAGGGAATGAGATAACAGGCGCTCAGCCTGGCCAGTAGA
-AGCGGACAGTGAGTTCTCTTCCCCCTTCTCCTCCCTCCCAAGGCCAGGAAGGGCTTCAGG
-CCTCCCATGGGGCTGACCTTGGTGGAGCAGCCTCCCCCAGGCCAGTTCCCCTCCCCTCCA
-CGTCCATCCCAACTCCCAGCCTCCTTCCCAGGCTCCTGCGGCTTCAGCCTGGTCAAGTTG
-TTCCGAGATAGCATGGAGATGGCCCTGGGTAAAGTCAGTGGGGGCCCAGTCttttttttt
-tttttttttttttttaagacaggatgtcgctctgtcacccaggctgaagtgctgtggcat
-gatctgagctcactgcagcctcaaccttcctggctcatgcgattctcccacctcagcctc
-tgagtagctgggactattaacccatgccaccacgtccgacctgggtaatttttgtatttt
-ttgtatagatggagtttcgccacgttgcccaggctggtcttgaactccctgagctcaagc
-gattcacctgcctcagtctccagaagtgctgggattacaggcgtgagccatgacacccag
-cATGGGCCCAGCCTTTTGGTCTGGAGGCACCAGGGGTCTGGAATTCACCTGGATGGCTCA
-GCCTGTCCCGACTCCAACATGCCAGCTGAGGAGGAAACCTTTCTTCCCTCCTGTCCCTTT
-GATCTTTCACCTGGATGGCTCAGCCTGTCCTGACTCCACATGCCAGCTGAGGAGGAAACC
-TTTCTTCCCTCCTATCTCTTTGGACTCTCCCGACATGGCAGCCTGAAACTAGGGGAAAGG
-CCACGGGACACCTGCTGGCTCCAGATAAGTGCCCCTGCCATATCCTGGTCAGTGTCCCAT
-GCTCCTAGCTAGCAGGCAGCCTTGGTAGCTGCAGCTGCACCCTCACAGGCCTGAGCCGCC
-CCGCTTTGCCCACTTACCTGCTGGTCCAGTTCCCCAGCCGCTCTGCATGGGAGGGGCCAG
-AGGCAGCTCGTTTTGTATAAAGCTGTCCCCGCCCAGAGCTCGGGGAAAGGCAGGCGGAGG
-GTGGGTGTGGCTCCCGGCAAGACCAGGCGCCTACTATGTGTCTCTGATCTGCCCTACAGC
-CCAGCTAGGAGGAGGATCCAGATGGTAGAACTGTATAATAAAGGGCTTGCTTTATTGAGG
-CTCTCTGCCACCCAGATTTCATGAGGGTTGATCCCCAGTTGACAAAAGCTATGTGCAAAC
-AGTTGGTTCTGGCATCACCCTGAGATCTCCATAATTCCTTTCACACAGGAAGAGAGTTCC
-CTGGAGCAAAAACAGTTCAAATACTGgtgcttcagtaagtcatgtggaaagcggggataa
-taatagtgccctcttcataggACAGAAATCCTAACTGCCAGTGTGCACTGAgctgactca
-gtgtcaggcatgttcttggggcttgagagaaattaatgcatttaatcttcatggcctttt
-ggagagatgctattactatccctattttccagatgaagaaacaggcccagagaagtcgag
-agccttgtgtaggtcacacaccttgtatatggcagaactggTCTCTGATGCACACTGAGC
-TACCCTGACAAATACtgtaaccacctgaggggttctttctgcccactgcataaagaaaga
-ccatgaggctggccatgccacaggggaaatgagtttgttcccaaatcatcttcaaagctt
-gtaggtgaggggtttttcaaaggcagtataggggaagagttgggggtggccaggtaacag
-gtgcttgctgctgattggttggggtggagatgaaatcatagggggttgaagctgtgctcc
-tacaggctgaatcgcttttggggggggggccacaggagcagggttggcggtcctggtgga
-gacatcaggtttaggtggagccatgggtgtcaaatctgcaaaaaacctggaaagatggcg
-gggcgtggtgggtcatgcctgtaatcccagcactttgggaggccgaggcgggtggattac
-ctgaggtcaggaattcaggaccagcctgaccaaaatggcgaaaccctgtctccactaaaa
-atacaaaaattagccgggcatgatggcggacacctgtaatcccagctactggagagactg
-aggcaggagaattgcttgagcccgggaggcggaggttgcagtgagccgagatcgcgccgt
-tgcactccagcctggacaatagagcaagactctgtctcaataaaaCAAaaacaaacaaac
-aaacaaacaaaaaacaaaaaaaaaacaccaactggaaagatatctcaaaaggccaacctg
-caacagtggtgttatttgcaggagtaattggggaagttgcatatcttataacctccagaa
-taatggctggcaatcatttatgtctacaccttaggaggacccaggctcctcttctttccc
-cagcctgatggcctctcattaactttacaaaagtggttGCTCACAGTGCTACGGCCTGTA
-AGTGCAGGGCCAGGATGTGAATGCAGACTCAAATTGGTGCCTCCatggatgtaaaacata
-ttgcacagattctgacacctagtaaatgctcagtGCATATTGACTTCTACAAATAATTCT
-GGCCTGCCTGTTGTGTTATTTTCCAAGACATTCATTTACTTAACAAGCAATCAATCACTC
-TCCAGGCTAATGCTTGGGGCGAGAGGTGAGCAGGCACTAGGGAAGGGGCCAGACCCCTCG
-CTTAGCAGGCAGGTGTTCAGGAAGTGTTGCCACtgttggggctcaggacatacacacccc
-caaaatatgactctgggaaaccagaatgtgccacccccaaatacacctctttgacatact
-ttgagctggttattcagagaaactgcagacacaggagtagctctggaaagctattctttg
-gtaaaagaaatttacatctatcaaggaaatctacattagtaaaggtgcctgtatcaggaa
-aaaggctgctccagaagaattaccctagagactttcttttttttttttttttttaagata
-caatttcacttttttttgcccaggctggagtgcaatgctgcaatctcggctcactgcagc
-ctccgcctcccgggttcaagtgattctcctgccacagcctcccaagtaactgggattata
-ggcgcacgccaccatgcccagctaattttgtatttgtagtagagacaaggtttcaccatg
-ttggccaggctggtcccgaactcctgacctcaggtgatcttcttgcctctgcctcccaaa
-gtgctgggattacaggcttgagccactacactggccaccagacagacttttatctgcaca
-ggaagacaaccattatttaccatacaataattcttcccctcaccctcccataactgtgtc
-tccgccaatcccccaaagccctaagaccctattccttaaacttcaatcatctgacccttc
-tttgagtctcatattttgtgggatttccacgcacagatatgtaattaaatatggtttctc
-tcctgttactcagtttcatgtcaatttaattcatagcccagccaaagaaccatgaaaggt
-ggagggaagccatgtttcccttctctataGTACCAAATACTTTGGATCTGTtaaaaaaaa
-attgcaggactctaaatttatgatgccaagggagaagttaagccttgcagagtgTGAGTT
-ATGTGGCTTGCAGGATGGCCACTTTCTtcttctttttttttttttttgagacggagtctc
-actctgtcgcccaggctggagtgcagcggccaggctggtctcgaactcctgacctcaggt
-gatctgcctgccttggtctcccaaagtgctgggattacaggcatgagccactgtgcctgg
-cCAcaatttcatacttatctctgccaaatactataaggtgtcaaaatttggcatagaggg
-tacaaaactataactcaatccaaacagaataatctttgcttgtataattttttaataatg
-aaacatcaatattggtttaataaaggcagctatatcttgaactatttagttaaataccct
-aacttctaatcctgtggccttaggaagtctagtctacagacgtgaaggaagtttctttag
-ggaaaggacttatcatctttgatattaaagaaaagagaatttatataaaaataatcttat
-atggtaaattcttgttctaaagtaaatgaattggttgtttaaaaagaaggatgtttacaa
-cgagtcagaaagttgaggcatgtcagagattgtgtaaattgtaaaaattttataaaaggg
-aatttatgcaagaaatgttgtacagtttaaaagtgatgagggggccgggcacggtggctc
-acgcctgtaatcccagcactttgggaggccaacgcgggtggatcacctcaggtcaggagt
-tggagaccagcctggccaacaagatgaaaccctgtctctactaaaaatacaaaaaattgg
-ctgggcatggtggtgggtgcctgtaatcccagctactcgggaggctgaggcagaatagct
-tgaacccagaggcagaggttgcagtaagctgagattgcaccactgcactccaggctgggc
-gacaagagtgacattccatctaaagaaaacaaaaacaagagcgactaggcctcctgaatg
-ctttataaaatgccaccataactcttaactgtacaacttgcctgctttgtagctgggtaa
-gacctagcacacatggagttaaatgctggaataagtcagaccttatctgcacttctgtct
-aggtcctaggctctacatctagtacataattacaatctcaaactgactaacaaaagtaaa
-agttgctaaaagttaacagtgtaacatgtattgttccatagaaagaatctaagataagac
-tgtaaagctgaggctagccgtggaattgtaccattaaatacctatgagtttcctcttgag
-gttgcaagataacctagggttcccggcctctcagaaagggcattctttgcttaccacaga
-tcagaagccctatacagggactgtgtacacaaaatataaggccagtttccaagggctttc
-ttggcttcgtaaatcaagtttgattccttaaaggaaagcataccattccagtcaaggcct
-tggtaaaaaaaccagtttttccaattgtgtcctgttacaaaagaaaacagattcttatta
-cacttgtgcaaataactatatcgccataacttaagaatactcacagatagtttccaaatt
-ctggagaaaatcagggagagagaaacaagtatgctacaaattttgttcatgggagtatac
-taaattgttaaaagctgttaatagctcaaaagaaaaatttcgaggccggatgcagtggct
-catgcctgtaatcccagcactttgggaggccgaggcgggcggatcgcctgaggtcgggag
-ttagagaccagcctgaccaacatggagaaaccccatctctactaaaaatgcaaaattggc
-tgggtgtggtggtggcacatgcctgtaatcccagctactcaggaggctgaggcaggagaa
-tcgcttgaacccaggaggaggaggttgtggtgagccgagactgcaccattgcactctggc
-ctgggcaacaagagcgaaactccgtctaaaaataaaataaaataaagaaaagtttctttg
-actttgaaaagcaaaacaaagtattagcaatattttaagcaaaatatcaaaaagatcact
-ccagtctcctattagttcagttcgtgcagttaattcctgtcctgcttgatattaatgaac
-attttagctaagagtcctaaccatttttcctgtattctgatgtcacaatctccaaattta
-tcagaaacctgcattcaagaacacctgttagagctttatagctgagtataaaacccttct
-aaagaggatcaaaacaagacaacaattgtttatggatgaccaaaagttttagggtagcca
-tagttaaagacacaattgacaaggaaatctgttacttctgtggcacacaataattttaac
-ataacaattataattactactgataacacacactaagacatatcagaattataggagtct
-cccataactttggaacacataccaataacatatttatacaaatatggcccaaagaaagcc
-aaacattattttatatttgacaatgcttcctgtatgacttcataccaaataagccaaatt
-ttacctttatattagtgtgttattaatgttaaactcaattttaatgttttgatcataagg
-tcagattttcatggacccttttttttttttgagacagagtctcgctctgtcgtgggcgac
-agagtgcagtggagcaatcttggctcactgcaacctccacctcctgggttcaagctattc
-ttctgcctcagcctcctgagtagctgggactacaggtgcccaccaccatgcctggctaat
-tttttgtgtttttagtagagatggggtttcaccgtgttagccaggatggtcttcatctcc
-tgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgagccat
-tgcggctggcctatagaccatttttaaccctttataatttttgtcaaagagcaggttagt
-gctttaagaaaaacccattgtgcttttattttaatactcaatttacagaaaaactggatg
-atacacctttaactttagccaagatgtttacacacagtatttcctttacaattaaccttc
-caaaagttgcttaaaccttcatttttattttattcaacttaaaacaattctttaaccttt
-taatctaggtaaaaatccacattctcatgcctccttataatctttttaccaaaagtatat
-gtaaactgttttttcaatagtcttaaatacatgttacactgttaacttttTTTTTTAAGG
-CCTACGTAACAAATAATTATTCTTggctgggtgtggtggctcacgcctgtagtcccagca
-ctttgggaggccgaggcaggtagatcacctgaggtcaggagtttgagacaagccttgcca
-acatggcaaaaccctgtctctacaaaaatacaaaaattagctgggcgtggtggtgggtgc
-ttgcaatcccacctactcgggaggctgaggcaggagaatcacttgaacccgggaggcaga
-ggttgcggtgagcttagattgcaccactgcactccagcctgggtgacaagagcgagactc
-catctTGGGGGGGAaaaaatgggaaactggagagagaaaattacatttcagaaactataa
-cacacctgttattaaattccagtgttgcctaatgttgttcaatttttattactttaaatt
-aaattctaatttttctgactacgagtttccaaaataagctttgttttcttaaagccctat
-gaactgaaaactagacgtttcagcaggcactgcctctaaacgccccccagccatcacagg
-aggaaacctcttcactgctggagctgacaactaataactgagcgtgcctggaatcctttg
-cccccacatctaataagtccatggaacccagggtaattgagatggcatctcttacaagaa
-tcaacttctgggtcaggtgcggtggctcacgcctgtaatcccaacactttgggaggccaa
-ggtgagtggatcacttgaggtcaggagtctgagaccagcctggccaacatggtgaaaccc
-catctctaccaaaaatataaaaaagttagctgggcatggtggtgcatgcctgtaatccca
-gttattcgggaggctgaggcatgataatcacttgaacccaggaggtggaagttgtggtga
-gccgagatcgcgccattgcactccagactggcgacagagcgagactccatcttaaaaaac
-gaaacaaaacaaaaaaacaggaatcaacatctggatacattacactcgagtcaaagcctg
-gaaagctgaggaagcaacccctgatagccaaaggaacatcctaaatatcagtgtaaagaa
-ataggaaattttaagctcataaaaggtaagtaactgagtgagaactacttatcttactca
-gtctcacccctacctcaccaaatacttttagatgttcctacctctccttttaagacaaat
-attaaaactttttaatggaaattattcactacaccaccattgtgggaactgctttacaca
-ctctattatttgcagtgggactatgtactacagcaccctcaggatggaatatcagacaga
-gaatctcaattatggtaccattttgcttaattattatcctcatagcaggaataacagtta
-ctaacagcaaataacacatgggcctttccagacatgtgcctctgcctgtcattgggtgag
-gaatgttgtttctatatcaaccaattaggcctagtaagaggtgctgttgaaaaacttaag
-gaaagggctataccaaaacaaccaaatagattcttggtttaggaacaaaatcatagcatg
-ggtcatcccattcctgggacctttcctaataatatgcctaggactaatgttcttaccctg
-cctaattaacctttttcaaagatttttaactgacaggatcatggccatttcacagacaac
-tacccaaaaacatccacagacagcgttactgctacagttaatccaagaccagaaaactct
-gtcccctcatcagcaggaagtagccagaaagaacaccctgcctttcatcctttttataac
-tataaggtctggattgacagagcaggagcattgccatcttggacaagcactgccattcta
-aagttccccttgatcaaaaaccacctaaatccaaagggcatcagcctaatggctaaggtc
-agcatgaccataaaccacaaatgacatctctgaccagaaacattccaaccataagttaaa
-gccctccccgaccagagacgtgccagccccaagataacctcccctccaggtggagagatg
-tcagccccaagataccgtcccttccaaccagagacattccaaccctcaatagacttctcc
-cctacacaggaacattccaagcctgtgataagctctcttacccagaaaccagtaaatacc
-cttagtatgtaagagagagcattcctgactgaaattggacagaggcccctctcaggttta
-ttcttcaaaataaacctgtctttgactgttgagcctcttttcatgtttctttcctctttc
-ttgaactcttacaACACCTTTGTTAGGCGCAAATtttcagtgctgcaaaagaaatagcac
-tcgaacataaatttaattttctcagcaaggcaattttacttctatagaagggtgtgactt
-gtggatggaacaatggtgagagcacacctgaacaagggaggggaaggggtttttattcct
-gatgcaggtagcccctactgctgtgtggttcccctgttgactaggattggaccacacagt
-ctaagctaattccgattggctgttttaaagagagcaggggtacgagtcggagtagcggag
-tgagtagtttggcgggaaggacagttaggaacaggtgactaaaggtgactcaggtcagtg
-caggtgaccaggggtgactcaagaaggagcaggtgatcaggggaatagatgtgaactact
-gattagaactggtggaaaaggttgtttactgaaactaggggcaaggaggcaaagagaatg
-agaaagttaaactttaaaatggagaacaaagaacaggggacctgaatatactcatacatt
-ggttccttggagaggatctcagaactcattgtacttaacaATTTACAGGCTGAAACATTT
-GAAAAGGAATTTGTTATATCCTACAatttccccctttcaattttcatagtacttcctctt
-caaactttttaaacatgtcttggcttagctgctcgacttaatcctctaaaagaaaaagct
-tatctgaataaggtggaggtgagttaaggaagattttagtaagtgctgcttttataagtc
-tttgcactagcccacagatgcatggtatgacataacacctaacaagaatgagtacagcta
-ttacggctgcaagagaagtaagaattgaggctgtgatttctttccatttactgaaccccc
-tttctagccaccctgagaaagggttatcgactccagaattttagctagttcattggatag
-agtggtaagtctttataaggcccttgttatgttcccagtgtgggcagtgttatttgggat
-aaaggtacaacactgagttttaatcataatacaaacaccactttttctgctaatatcata
-tctggtgccattctgttttcccaggccatctggctagtgggccccaattgttctgctatc
-cctttgacagcatccctggtgtaattaataaactgctgctgattataatagatgtaattt
-atccagtctacatttttattaatcgtcacccatgaaaatattgacttaaatcctgcagct
-atttgatctcgggctttaaattcatctggtactcctagtggaactccagtaatgtttata
-taaacatgggggtcaaacgactcatgtaaggcacttcttttacaattttcttttttatca
-tgttgacggaatgctagagtgaaagggatggccaattggactagagcacgagtgctgctc
-taattgcttggcagagtatccagcaatagtgcccctcaatgccaccacacacctgctcag
-ggatgaacaagggcagactgatgggtaagctcttgaaaaggcttggtttcaccgcaccct
-gttaagtctccaaggaatgctaacttttccccctgccgtgaaagggacaggtgaacttaa
-catcaggggctggaggctggatggccctccgggctgacccacagggctcttgacctcggg
-gaagagcagtgaaagcgaacagcagtgaaagagttttgcctgactcattgccccggctgt
-ggggttctggaagagagctaccatacagctcatgccctgtccatgagaggaccactcgag
-gggaaaggggacaatttgggtctctggcctgcctgtcgcacaagcagtcacttttgttta
-gcatgcgaacagaatatttaatccatttcagccaagcatttacatcctggtactctgttt
-caattgctatagtttgttttaaatctataacttctacaacagctactttggttttatcat
-tgggtatataacgaaagaagatctggttagtggagaacttaggagtgggagaagggggtg
-caggagttgaggaggcaatgaagcacatttcaaaggatcctctggggtccttccctgaga
-cttctgctcctataccatagaaacggtactctggggagcagaggtggtaatctgtactgg
-attacattggttcatctgacaatggggtggtccatccttgctccttggtagtccataagc
-cattagaccagctaaaagttctgttctaggagggcaagattcctagttcatactgggacc
-atcatcaatatcttcccagactaactgatcccagttaacagattttcagtctgaggagag
-ccaggaaggacaaagatacttttctgaaggggagagttgcctctggtttggcagatctcc
-acaggtcatcccaaggcaagcatcaaaagtaatagtttggggcgaacttgttacataaag
-aacgagaagactagcaatagaaggggaaaagaaagagatggaatgtaagaggatcaaacc
-cgttttagctttagcttggttggagttggccctggaatagctgtccatgattctggaggg
-ggtggtgctcttttgacctaggtgtgatgagtccatcctctttctgctgtttgaactgtg
-gtctcggtggttagaagcaacaggtagggtccttcccaagccagttcgagtttcccttcc
-ctccaacttttgacaaggacacagtccttaagctgatgttggtgtactggaaactgtagg
-ggtggtacctgttctaaaagacctttagttctgagggaagagaaagtggaaaataaacca
-agtatataatttctgagaaactcatcttttgttttgaacataggaatgtcagcagtggag
-tgtaaacagggcaacctacacaacatttcataaggggataagccaacatctctctgagga
-gcagttcagactctcaagagggcaatgggagagcatctatccatggcaaccgagtctcta
-agactaatttggttaggtggccttttttttttttttttttttttttttgagagggagtct
-cgctctgtcgcccaggctggagtgcaatggtgccatctgagctcactgcaacctccacct
-cccgggttcaagtgattcttctgcctcagcctccctagtagctgggactacaggcacgcg
-ccaccatgcctggctaatttttgtatttttagtagagatggggtttcaccatattggcca
-ggctggtctcgaactcctgacctcgtgatccacccgccttggcctcccaaagggcttttt
-ttttttttttttgacagggtctctctccgtagcccaggctggagcgcagtggcgcgatct
-cggctcactgcaagcaccgcctcccgggttcacgccattctcctgccaaagggctttttt
-aaaaaatagtttggttcattctttccactcttcttgatgaaggtaggtgccagggagtat
-gatattcccatgttatatccagtatctgggctaatttcttaatgacatgtacagtgaaat
-gagtcttattatctgaatcaatgttttctattaatctaaacttgagtataagattttcaa
-ctaatgccctgtctatgttattatcagttgtacttgaaaaggaaatagcttctatccaat
-gagtaaggtgatctactatactaataaatacttcagatgatcagttggaggcatctctgt
-gtagtcagtctggatactttggaatggccttaagcctggactccttcccccaaggggtaa
-tgttttactaaacaactgtctgtaacctgtttggccagggtataaatcctatgcacccat
-aaactctgatgaatgtgtcacacgaggcttggggcctccaatgggtcctttaatgcagtt
-ggaataagacttccctcataaggggtttggataacatttctctctggtctagcaatatcc
-attttccttctgaattctctttagcacctatttttattagtttttaaaccaaagaaagcc
-aaacaccattttatatttgataatgcttcctgtgtgattttataccagataagctaaatt
-tcacctttatattagtgtgctattaatgttaaactcaattttaataaaatcttgtagaca
-tatttattcaattttaatgtctgaccataaggtaaaattgttatagactctttctaacgc
-ttcataatttttgttaaagagcaggttagtactttaagaaaaacctgttgtgcttttatt
-ttaatgtccagttcacagaaaaactggatgacacccctttaactttagccaatatgttta
-cacacagaaattcctttacaattaacatttcaaaacttgcttaaaccttcaaaacaattt
-tttaaccttttaatgtaggtaaaaatccacattcttatgccttcttataatccttttacc
-aaaagtatattttactttccttacacgccttgaacataaactgtttcttcaatagtttta
-cattcaggaggcctaattacttttaaattatacaacatttcttgcataaattccctttta
-taacattttccacgactttcacagaccatctttgacatgacttaaatttctgacttgtga
-acattcctttctttaaacaaccagttaatttattttaggatgagaatttaccgtataaga
-ttctttttacataaattctccTTTTTTCTTAATGTcaaagatgataattgttttttccca
-aagcaaacttccctcatgtctgtggactagactgcctaaggccacaagattagaagttag
-gataatacatgttacactgttaacttttagcaaattttacttctgttgaaaaccttgtaa
-gtttggaattttaattaaaggaaggcttttttggtgtccggggacatggacaatagttat
-ttttttggcaactgaaggttatttaatacttgggtgattaattcctcgtggaccgggtct
-tgacctttgctattaataagacctggttcagtccaaatttttccacatgcatgagccact
-ccaaaggcacactgaaaattggtatagatggttccttcctggttctgtaagtactttaag
-gcttggctgagtgcaaacagctcacacgtttgagcagaccaattattaggcaattttcct
-aactctatctctacACCTTTAACCATTGTTCCCTATTTCTCATTCAAACTTGGACATAAC
-GGTATgtgaaaaagagcctcttgtgactgttacctctttacaatggaatgttaagcaacc
-cctcagaaagtagggagtagcaaatcaaatctttgtaactacatttcagcctttgccggt
-tgaaatgtcagagccccggcatcagaaagtggtcaactcaagggctgataagaagaattt
-accaacaacagtataggtttgaaaagtaaagttttattagaaagaaagaacattgcagaa
-gagtgcagcgaggtgcctcagcaagaggggactgagagggctgtggtggatattccttag
-gcgcatatatgaaccttaaggcaaaagcttgagggtaatttggagcatactagccacgta
-ggttatgataaatggttacatttgtagttattttggtgccttaatgtcagcaaggattgc
-acagtgagtttcgcatagaaattctggttactacaaaatttttgaaagacccctggaacc
-agatgccaactttagatatgtcgatgaagagtcaaactctgtaaaatatttgaagagatt
-tattttgggcgaaatacgagtgaccatggcccatgacacagcacttaggagatcctgaga
-acatgtgcccaaggtggttcgggcgcagcttggttttatacattttagagaggcacgagg
-catcaatcaaatacatttaagaaacacattggtttggtccagaaaggtgggacaactcaa
-agtgggaacttccagactataggtaaatttaaacattttctggttgacaattggttgaat
-ttgtctaaagacctgggatcaataggagggaaatgtttaggttaagataaaacattgtgg
-agaccaaggttcttttgaagtcttatagtggctgtccttagagacaatagatgacaaatg
-tttcctattcagacttttaaaagctgctagactcaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaggctgccagactcttagttaatctcagagggcctggaagaaaaagatctagctatat
-taatagagattatttacagatgcagatttccccccacaaaggacagctttgcagggccat
-ttcaagatatggcaaagaaacatgtttttgggtaaaatatttttgctttcttctttgtca
-cataatgttatgccagagtcagattggaaagcaagtcagatatataggtttaaataaaac
-ccatctgatgagaatttatggtttgtagggcatgactccccagaccccttagataggaat
-ttcagcaaaataaaaagatcagagcttagtcctcataatcaagaaataaccataaaaatg
-ggcaaccctatggagtagccattcttttattcctttactttactaataaattttcttttg
-ctttgcactgtgaacttgccctggattctttcttgtgtgagatccaagaaccctcttgtg
-gggtctggattgggacccctttccggtaacGATTAtacttctaaattcctcagataagga
-gtttttgtctcgggctgcttcagggtcaccaggtgatttttgctctcctcaCCCCTTTGT
-TCAGCTTCTCTGTTTTTGCCTATGTACACAACTCTCAGATTTGGCCACtggggagagcaa
-agttatacctggtgaccatcaagcagaccattcagagacaaaactccttatcagaactcc
-ttattcagaagcaattagacttccctattatctaaagcaggcatctcattccaggcttct
-ttcccccaaatttataagtaactagaatttctatgcatctctggaatgcatgcatatcaa
-aactcacggtgcTgaaaatttgcatctgtaaagaatctctattaacatagctggatcttt
-ttcttccaggccctcccaatcctgaagagattaactaagagtctaacaccttttgatggt
-ctgaataggaaacatttgccatctgttgtctctaagggcagcgaacataagacttcaaaa
-gaaccttggtctccacaatcttttatcataacctgaacatGAGTCTCTTGCTGATATTAA
-GGCATTGAAACCACCTTTGCAAAATTATTACAGACAGcatcattgcaggaatccaggaca
-ctggagtagaggatgttccatacctttgggttacaagccacccccaggaccttgtcctca
-ttgcaaacaagagggtcattgtgatatggaaggggggcaggggagtgctgggtacagaaa
-tgcagggttcctggtgagggctccacccttgggcctgtgcccacagacctaagtaagaac
-aggcactcctgttttcatgcctgaatgttgtattttccaagaccactctggcccaccaca
-tccccttcctgtgtccataTtgttaaatatgaattctaaatttctcttcaaagaattaat
-atgtcagtatgttcaattctttgacttctgcttttaaatttaacttcctcgtaaagcaac
-ctttttcgattacctgctccaccctgactcattccgattacctgctccaccctgactctt
-gcaggttacttgctacctgctccaccctgactaattattctccaccctgcataaccattt
-ttttttcccgccaaagcactcatcctgtcacactctttaaatctgccaattggaattagt
-ttagcctgtgcagtctaaccctagccaataggggaacgacacagcagcaggagccttgtg
-cattagggataagaacccctttccctcccttgtccaggtgtacactcaccattgctctac
-ctgtgagggtgcacccttctatagaagtaccttgccttgctgagaattaaaaagaaaatt
-ttatattcgagtgctatttcttttgcggcactgaaactttatatgtaacaatttgggggc
-tcgccctgattacatttccctctggggcagtctctggttctctcttgtgaggagcgctcc
-gccccctgtggcggcctcagccgggagaaatcagaacccacccagtgcgaggaacaaccc
-gagctgtcagcaacaggggggaagaaaactggccggcaacctagcttaaagaatcctcac
-atactgcagcgacgactctgcgcacagagcaaggaaggagaagccgcgggagctggtaaa
-gtatttccttggtggtcgggaccaaggtaagaaagccacgggggtggtgggcggtgaagt
-actccttggtcagggtggcttagaggttaaaaagaggtgagacatccccattggcggaga
-ttgaacctcacacaaacctccagtagtagaaaaggcaagaaatttccagtggggaaattg
-agcctcaccccaaaaggtaagaaatttccagtaagggaaagtgaaccttgaaccttatcc
-caaaaccatcaagatgggaaatatcccaagcaagacagggagcaagggggataaacatgg
-taacaaagatatccctccagatggccccctaggtctcatgctaaaacactggaaggataa
-tgaaaggatacacataggaaaaagcaacaaatggtaaaatattgctgttttatttggagt
-cagggacccatcctcagtccctcaatcttctggtcaaagtttgggtcaaatgagaatgta
-atgtgtcagcttctaatccgatacgttaatgataaaagtccagtgtctcaagaagaacta
-ggctatgccctttgttggaggcaaggacctgccctcctatttctcttaaaaataaatagg
-gaagaacccaatctggcacctcaaaatgaaaagtcagaggagccagctctcatgcctaaa
-gactccagtgctgcatggtatcccctagaccatcttcccccactcagtgtccccaaactt
-tcccctcagacagccactgccacctcagatcaccactgccacctcagatcctgttccaaa
-ttccccctctactcacgctatccctcctccttataaccctgactgttgggaattaccatc
-ccaccagcctgttctctcccaacctaaagacccctctctaaaaagactccagcgtgaggt
-agaacaatgtaaaaaagatattcagaatttcctatttccctccgtacctaagaggtcagc
-ccctaccctcttccctttgaaagaggtaccacaagttgggggcgggggggggggcattga
-ctttgtaaatgctcccttaatcagttcagaagtccagaattttacaaaggagcttaaact
-gctgctggacgacccttacagagtggcagaccaaattgaccaattcttagaacctcagtt
-atacacttgggtcaagttaatgtccatcttgggcatcctcttttcagggtaagaaaggag
-tatgattcttaggtctgctatggtagtttgggaatgtgagcaccctcccaatgaaaacgt
-tcctaccacggaccagaaattccccgcccaggaccccccatgggaaaataacaatgcaga
-tcaccgggaaaatatgcaggacctaagggagataataaaaggaattcaggaatcagtacc
-ctgaacccaaaatctttctaaagcatttgatatacaacaggaaaaagatgaagggcctat
-gagattcctagacagactgagggagcaaatgaggcaatatgcaggcctcaatttggatga
-tccccttgggcaaggaatgttgaaactccaatttttcactaaaagttggccagacatttg
-aaaaaaaaagttacaaaagatagacaattgggaagaccatcccttaagtgagcttctcag
-ggaagctcagaaagtgtatgtgaaaagggacaaagtaaaacgaaacaaaagacaaaactt
-atgtttttcaccttccaacagatggctccaaacccaggtacttctagatagagtttccag
-ggagccagaaactataaagggtccgaatcctcttttaaagaaccccagcctccatctgga
-ggaccagggtccttgtctaccaagccccctaaagagtatgggggagaagggttaaagaat
-cccagaactaaggggaggaaggacaaaataggtgctatagatgtggaagagcagaccact
-tcaggagaggatgttctgaactaagaaaggagaaagaagccctttcactcatgactttca
-aggaagaatagcggggtcaggggctctgtctcttttatcttgagtcccaccaggagccct
-tgataaatttgggggtgggacctaaacatgagcttatcacctttttagttgattcggggg
-ctgctcgctcctctgtttccccccatctaatgttgtctccttcttagaggaacttttagt
-ctccagggtaaaaggtgtaggattaagagcaaaaattttagaaagcactgaagttagata
-ccaggatcgctcagcttatattcagttcttgtttatccctgaagcaggaactaatttact
-ggggaggaatttaatgttaaagttgggcataggtctacaagtcagcccaagaggattcct
-cacctcattaaacctactcaccaccgcagatgaaaaatatattaatcctcatgtcttgac
-caaagaaggaaaccaagggaaactctaagtccctccgatccacatcaagctaaaaaaccc
-aggggaagtagtaagaaggaagcaataccctattcccctagaaggtaggatagtgttgaa
-acctataattgaaggccttatttaggatgggcttcttgagccctgtatgtctccttataa
-catcccaatcaagaatcaagaaatcaagactgctaccagccagtcaagaaattagatggg
-tcataccagctagtacaggaccttagagctatcaaccaaatagtccagagtacccaccct
-gttgtcaccaatccttacaccattcttagcaagattccatataatcatcaatggtttact
-ataataaatttgaaggatgctttttgggcatgtcccctggctgaagatagctgagatata
-tttgcttttgagtgggaggatccatactcagggtggaaacaacaatatcgatggaccgtc
-ttgccccaagggttcacagactcccctaaactttttggccaaattttagaagaagtacta
-gaaaaagttgtcatcccagaacaaatatgccttcttcagtacctggatgacattcttata
-tctggtgaagatctagagaaggtaactgacttctctacacatattcttaaccatctgcag
-tttgaggggctatgagtctcaaaaagaaagcttcagtatgtagagcctgaagttaaatat
-ttaggccacttaataagtgtaggcaagcgaataatagggcctgaatgaattgagggaatc
-gtgtccctacccttgcctcaaactaaacaagaactcaggaaatttttagggtcagtcaga
-cactgtcgctaatggattgactcatatacactgccccgtaaactgttctatcaaaaactt
-gcccaggagaagcctaaccgtctcctgtggacttctgaggaagttgatcaaatcgagagg
-ttggaggaaaggctcataactgcccctgttttaggcttaccctccctagaaaagccattc
-cacctttttgctaatgtggacagtagggtaccttcgggagtgctgactcaagaacacaga
-ggccgccagcagcccgtagccttcccatcaaaggtcttagacccagtcacttgtggatgg
-cctcaacgcatccagtccatcgctgctatggcaatactaggtgaggaaagcagaaaatta
-accttcggaggaaaattgacattaaacacgcctcaccaagttagaactatcttaaaccag
-agagcagtgagatggcttactgacttgagaatcttaaagtgtgaggccattctgttagaa
-aaggatgatttaacattgaccactgataattcactcaacccagcaggtttcctaacaggg
-aatccacatctaaggagggaacacacatgtttagatttaattgattaccatacaaaggtt
-tgaccagacctgggagaaacccccttctggactggacggcacttactcatagatggttcc
-tcccaggtgattgagggaaaaagacacaatgggtattcagtgattgttggagaaactctt
-gtagaaataaagtcaggaaaattgcccaacagttgatctgctcaaacgtgtgagctgttt
-gcactcagccaagccttaaagtacttacagaaccacatctatacagattccaggtatgcc
-tttggagtggcccatacatttgggaaaatttggactgaacgaggtctcattaatagtaaa
-ggtcaagaccttgttcacaaggagctgttcacccaagcattgaataatcttcagttgccg
-gaagaaatagctattgtccatgttcccggacaccagaaaagcctttcttttgaaagttga
-ggaaataacctagcagatcaggtagccaagcaggctgctgtgtcttctgaaatgcgtgtt
-tttcacttaactccctacctccctcctcctaccataatccccattttctcttccaccgaa
-aaagagaaactaataaaaataggtgctaaagagaattcagaaggaaagtagatactgcca
-gaccagagagaaatgttgtctaaaccctttatgagggaagtcgtatcccaactacatcag
-gggacccattttgggccccaggccatgtgtgacgcagttctcagagtttatggttgtata
-ggaatttataccctggcaaaacaggttacagatagttgcttagtatgtaagaaaactaat
-agacatactataaaatgattacctctcaggggaaggaatccaggctaaaggccattccaa
-agtatctaagttgattacacagaaatgcctctgatagatcatctaaaatatttactagtg
-atagtaggccacctcactccctgggtcgaagctatccccttttcaaatgcaacagccagt
-aatgtagttgaggccctaattgaaaatatagtacccaggtttcgactaacggaaaatact
-gactcagacaatggaactcatttcaccacacacattattaaaaagctattccaaaatatt
-agacattagatgggaacaccatactccctggcacccaccctcatcagggagagtagaaag
-aatgaattagactctaaagaaccacttaaccaaattagtcttacagacttggttgccatg
-gaccaagtatcttcctatcaccctgctgagaatttgaactgcaccatggaaagacattgg
-tctttctccttatgagatgctctatggattaccttatttgcactccactgttgatattcc
-tacctttgaaacaaatgatcaattccttaaaaattatatacttggtctatgttctacttt
-ctcctctcttaaaactaaaggtctattagcacaggcaccacccttggagttcctggtgca
-tcaacattagcctggggatcacgtcctcatcaagagctggaaagaggagaagcttgagcc
-agcctgggaaggtccttacttggtgctcctaactactgaaaccgcagtccgcacagcaga
-gagaggatggactcaccacacccaagtcaagaaagcaccgccccctccagagtcgtgggc
-catagtcccaggggaaaaccctactaaactaaagctaagaagaatttaactccctttcat
-ctattctattactcttttttctttcctcactctattgctgaccatatagttattaacata
-accaagtcaatttcacctcaactattgcatttgatgcttgccttgttatatcctgtgggg
-atttgtcaagccaaagaaagctctctacttcagatacctctgtccctcctggctctcctc
-agactaggcattagtgaatcgggaccatttaatctggggagatttctataaagatcccag
-tggcaaccaggagtcttcccccagtgatgtagagcttttaagccatagttggtccaaagt
-tctgtggaccattaaagagcaaggatggattgccccaaccagtttttgtaatttcctaaa
-ttcatacattcgttttactaaagggacagtgcccactaactctcagctaaaccagtgcaa
-ccctatacaggttattattttgagcccacaaaattcttcctcttttctaagctggttccc
-ttctttaagccagttttatggtatgggggctgaagtttcagggacagaccctattggatt
-ctttgaaatgcacttctttgatcccctgctgtctgcacctgcctctgagcctttttccaa
-aacctctcacaacggaaccattgttcctcctctatctaacgacaaggccaagatagcgat
-ggtagaagttaaagacttaaaacaaactggcaattgagacaggataccaagatgtaaatg
-tttggttggaatggatcaaatatttcatccacacgttaaacaaaagcaattgttatgctt
-gtgcgcacagcaggccagaggcccagattgtcccctttccactagggtggtcctccagtt
-gaccgggcatgggctgcatggtagctcttttccaggattctatagcctggggtaagaagt
-tgtgccaagctctctctctgctatatcccgaagtttgacaccttgtgggtcagcccccaa
-gggccatccagcttccatctcccaacactaagtttacttcgtgtctctcatgacagggag
-gaaacttagtgttccttggagacctgaagggatgcagtgagcttaagaacttttggccag
-gcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcggatcacaa
-ggtcaggaaatcgagaccatcctggctaacacgatgaaaccccatctctactaaaaatac
-aaaaaaaaaaaaaaaaattagccaggcgtggcgtcatgcgcctgtagtctcagctacttg
-ggaggctgaggcaggaggatggcgtgaacccaggaggtggagcttgcagtgagccgagat
-cgtgccactgcactccagcctgggcgacagagcgagactctctctcgaaaaaaaagaaaa
-agaactttcaaaagcttaccaatcagccagcccttgttcatcccctagcagaagtgtggt
-ggtattgtggtggacctttactggacactctgccgaataactggattggcacttgtgctt
-tagtccaactagctatccctttcaccctggcatttcatcaaccagaggaaggaaaaataa
-gacatcgtaaagtgagagaagccccttatgggtctttagactctcacttctgtttagacg
-caattggggtcccatggagaatacaagatcaatttaaagtctggaatcaaatagctgcag
-gatttgagtcaatatcttggtgggtgacaattaataaacatgtagattggataaactaca
-tctattacaaccaacagtgatttagtaactacactagagatactgttagaggaatagctg
-agcaagtaggggctacaggccagatggcttgggaaaataggacagccttagacatgatat
-tagcagaaagaggaggggtttgcatcgtgactaaaactcaatgttacaccttcatcccaa
-acaacattgcccctaatggaagtataacaaaggcattgcaaggtctcactgctctatcca
-gtgagttagccagcagctcaggggtaaatgatccctttacaggatggctagaaaaatggt
-tcggtaaatggaaaggaataatagcctcaattcttacctccctcgtagctgtaataggtg
-tacttattcttgtcgggtgctgtgtcataccatgcatccgtgggttggtgcagaggctcg
-tagaaacggcacttgctaaaacctcccttaactatcctccaccttatccagagaagcttc
-ttcttttggaaaatcaagcagaacaactaagtcaagacatgttaaataagtttgaagaga
-aagccgtaagaaaaatgcaagaggaggaagttgttaaatatgaattctaaatttctcttc
-aaagaattagtatgtctgtatgttcaattctttgccttctacttttaaacttaatttcct
-cataaagcaacctttttcgattacctgctccaccctgactcactccgattacctgctcca
-ccctgactcactccgattacctgctccaccctgactcactccgattacctgctccaccct
-gactcattccgattacctgctccaccctgactcattattctctgccctgcataaccatta
-ttttcccgccaaagcactcaccccatcactctctttaaattagccaatcggaattagttt
-agcctgtgtggtctaaccctagccaataggggaatgacatagcagcaggggccacatcct
-tcagggataagaacccctttccttcccttgtccagatgtgtgctcaccattgctccatct
-gtgaggttgcacccttttatagaagtaccttgccttgctgagaattgaacagaaaatttt
-atattcgagtgctatttattttgaggcacagaaactttatatataacaatataaacccga
-gaccttggcgggcacacacacaagcagctgaatgtcaagaggaGTGGAGGAACGGAGTGG
-CAGAGAATGGCAGAGAGCGCTGGAGAGTGGCAGAGCAGCATGGCAGAGAGGGAGGGAAGA
-GGCGTCTGAACTTtggaagacacctccactcctcaataaagtctccgcatgtatcacttt
-tcaaacagttcatgtgacctgattaatccaggatgccagacaagaatctgggGAAgttaa
-cattcaggcatccctggatggcaaggctaaaggagcacactgtaacatatgcccacttgg
-gctccagcacctgtccatctgtgtgttcccccttccctcaggggtttgagcagtggggtg
-accaaacagacgagccacaccccctgttgcatgtcctgcaaggagaatcagggaactctc
-ctgtttcaGttggaagagcaagtgtccctctctctctcgtggtggggagacatctcttcc
-ttctgggctgtcacagccccaacctcaccaacctacctgacaagggagtctggcagaaca
-agggcaagggcagggagaagcacctctaactctattcctggataataatcaagtctctaa
-aagtcatcctggagccgggcacagtggctcatgcctgtaatcccagcactttgggaggct
-gaggcgggtggatcacctgatgtcaggagttcgagaccagcctggccaacatggtgaaaa
-cctaactctactaaaatacaaaaaaaattagctaggcatggtggcaggtgcctgtaatcc
-cacctacttgggtggctgaggcaggagaatcacttgaacctgggaggcggaggtcgcaat
-gagctgagactgtgccactatgctccagcctgggtgacagagagagactctgcctcaaat
-aaataaataaataaataaataaataaataaataaataaataaataaagtcatcctctagg
-gctttgaggccgttcaagcccctattttttccatctctgtggatgagcctctgttaaatc
-tgattgtggctgaacaagagataatgttcctaatagatacagggaccagttattcagctt
-taagtgtttattacagcccaatgtgctagtcctccatttcattacgggtattgataaact
-tcagtgaggctgtttcacactgccactcccttataaaatgaaaggctattcctttaccca
-ctcttcagtcctgccaagctgccctgtttctttattaggtcacaatttgctcacaaaatt
-acaagcgaatttacagttaagacctcacattctagctgtaattaactcacacttcaccaa
-aaaagttgctgcagtctatagaacatcacattttaaaacaagtgccggccaggcgcagtg
-gctcacgcctgtaatcccagcactttgggaggccaaggcgggtggatcacttgaggtcag
-gagtttgagaccagcctggtcaatatggcgaaaccccatccctactaaaaatacaaaaat
-tagctgggcatggtggcacacacctgtaatcccagctactcaggaggctgaggcagggga
-atcacttgaacctcggaggtggagattgcagtgagccaagatagtgccattgcactccag
-ccctggcaacaagagtgaaacgctgtctcaaaaaaaaaaaaaTTGTTCTTTTGTTTGCTT
-TTCTTTCACCCTGATTCCTCCTTCCCCCTTTGCCGTCTTCAGTACCAAGCTACAAAGCTA
-GGGGTGGCTGAGGACAGTAAACAGAGTGTGGtcttagctggctttttccctcctgggaag
-ttgttgtttaggatcctaattctagttcagaggtgcattctaaatagtcttctccattgc
-ctttccccccaaaattaatctcacacgttggcttgtgtgtgcattcacgtgaggaactga
-actgtcattttcatagataaataagagactgagtttccttagctccaaagagaaagggca
-ttttgctcctcccagcagaaaggtacccgagtgactggggggccttgcgggagtgttggg
-gggttgagcccccagcgacatgaagtgattctgcagggaactcacaacaaaattagtttt
-aaaaaggctcgtccaggaagcacatataggaactggtcactctgagttttgagccctctt
-ggaggtgctagacctccggagaaaacactgagacacctaagagggtggtggcaaggattc
-agtggtgacacactgtggagtctcatctgcaaccattacacttcgacctactccacaaaa
-accctaggccacagctcagttactccttaaaagaaagtgggaaacaaataatctaagaat
-aaggaaaaacaaggtgttgacgaaaagagttaaactgtgtaaaatagttgaagatattta
-ttcagagcccaatatgagtgactatggcccgtgacatagcccttaggaggtcctgagaac
-acgtgcctaaggtggtcggggctcagcttggttttgtatattttaggaaggcatgagaca
-tcaatcaaatacatttaagaaacacattggtttgattcagaaaggcgggacaattcaaag
-caggggtcagggtgagggtggcttccaggctataggctataggtaaatcggtaaatttaa
-actttttgttttgttttgtttttttgttttgagacagagactcactcttccacccaggct
-ggagtgaagtggcacaatctcaactcactgcaacctccgcccccatgggtttcaagtaat
-tctcctgcctcagcctcctgagtagctgggattacaggcacccaccaccacgcctggcta
-atttttgtatttttagtagaggcagggtttccccatgttggccagagtgatcttgaactc
-ctgacttcaggtgatccaccggcctcggcctcccaaagtgctaggattatgggtgtgagc
-caccttgcctggtctaaatttaaacattttctgattgacaattggttgagtttgtctaaa
-gacccgggatcaatagaaagtaaatgtttaggttaagataaaagactgtggagtccaagg
-ttcttttgaggtcttatattggctgcccttagagacaataggtgacaaatgtttcttatt
-cagacctttgaaaatgtgctagactattagttaatctcttcaggattgggagggcctaaa
-ataaaaagatctagctatgctaatagagattctttacagttgcaaattttcccccacaaa
-gtacagtttggcaggaccatttcaaaatatggcaaagaaacatgttttggggtaaaacaa
-ttgactttcttcttggtcatgtaatgttatgccagagtcagattggaaagtagtcatcat
-atataatgttaaataaaatccatctgatgagaatttatgatttgtagggcatgactcccc
-agaccccttagataggaatttaggcaagatagaaaaaatcagagcttagtcttctcacaa
-gagaatgaccctcttttaggtaccccattgattttacggcatctctactttgcaagtgtt
-tgtgtaaatggacatattatggtctctttgtgcacaattatgtcaaagacaatttagagc
-ttgaaggttgacctccagctgtaaagttcctaagttctctatctctctgctttcttttct
-gcctgttttaagtctgctattatttttctttctttttttgagacagagtcttgctctgtg
-cccaggttggagtgcagtggtgcaatctcagctcactacaacctctgcctcccaggttca
-agcagtcctcccacctcagcctcctgaatagctgggactacaggcatgtgccaccactct
-tggctaatttttttttttttttgagacagagtcttgctctgttgcccaggctggagtgca
-atggcatgatctcagcaaaccaacgagtttctattaatatctcatggctagagttctgag
-ataatagctataggatctttggttgtatgagtatgtatgtgtgtgtttatgcatacatac
-acttatttcattgtgttttctagccacaggtactgaattggcttaaagttaaagaatatt
-cataaattaataagcctaaatgcttttcaagttcatgtgacttaagtaaaatctttaata
-agctagctttaaaattattggtaaagtaatattagaaatgtcttaaaaattgttagcata
-aatttttgtttgcatttattgatcaagggacttcatatactgccaaatactgtaaggtgt
-caaaatttggcatagggtttgtaaaactacaaaaccgttcaaaacagaatgatttttgct
-tttgtaatttttgataaataagacattgatattggtttaatgaaaacagctaaatcatga
-attatttagtgaaataacaatatatttaatcttaaggtttttacttagcaaacacctgaa
-attcacaggctatcaaatgtttgacagggaaataactttaaatgatgactatcacagttt
-tcataactaacctgggtaaactattaaaataaaatatttaggtaaatgtaatgggataaa
-tacttgtagacaaagttgtcataatttaggatctaaagttatgttaaattaaacaataga
-tatttcattaactgggtttttttaattaaaaaagatattgcaggaaatcattttttttct
-aaaaaatgtgttcttgttaaaaggaggataatttttgtctaattcaaagcttatttaaag
-gttatatataaaataaggtaaaaagaaacaagaaaatatataaagaagttatagaaataa
-aaaagaatttttggtaagaaagcttaaagaaaaataattttacatgagaaagaaccttgt
-atggtacatttttgtcctagaataaaatgactggttgtttaagaaagaggaatgttcata
-caaaccagaaagtccaagcatgtcgtgaatggtctgtttaagttataataagagcattta
-tggaaaaagacccacaaactttcatataatcaagttgtctataattaaagggaaattatt
-tataatgatcttttgagagattgggttttgatattaaaaaacatttatacactaaagaat
-tcattagaacaacattttcttaaggtattgatttacttttaataaattacaagactatat
-atataatatattttttcctgcaaagttcaacttttattgcatctcactgttttcagcttt
-ctctccccttttaaagtacctgaaataataactctatctttcaactcatttttagctcct
-gtaagtttttttattttctcctttgtgttctaactgttgtggcctgacgctaataaatgt
-tttatctttgtggtctaaaggaaacattccttccaacataatatttcctgtagggaacag
-cggttgaaatgcagaaggtgttttgttttccctttgggaaattggcctaataaacagagt
-ttatgctttattgaaataattcctatgtcattattactaagttttggtttgtttagaaaa
-aaacccgagattaaattttttttaattaagattattacatacatgtaaccctctgtatgt
-gcttttaaagtccttgtgccattaagttacagagctttgagtccttggtctaaaaagaac
-accaagtcctgctaaatattaaacactgacagcagttaaaacctcattttctgacctggt
-agaagatgccaatcaaaataaactgtgttcatgagacagaaggccggaaattaaaacgat
-tcaactcctcaaggtctggagactatcaaagaagaggtgggtgcatgagattgtaagggc
-cgattttgagagatcaaatgattataaggccaattttgagagataaaataattgagtttc
-tctataaattaaccattaatctcaaaggcacactgatgcaagactagcatatgggctgct
-gtgtcacgttaacaaggttttcttggagaattaacccactccttaataaaaggttataaa
-agaggttataaaggttataaaaaaggcttgtggaatttttatcttgtggtcaggatgatt
-aaaattttatagattgtttatacattttgaaaaacaaatttaattggcctcgtttttatt
-agggcttattgtttaggcaattaagtcttctctctcaaagaatcaaggtttttgcctttt
-ttttgaaatctttgagttatcaagttgagtaaatgaaagacttattttacaatgacttga
-tctgtgatcctattttgtgatatcaagcattttatttatttatttatttatttttgagat
-ggagtcttactctgttgcccaggctggagtgcagtgctatgatcttggctcactgcaacc
-tccacctcctgggttcaagcgattctcctgcctcagcctcccgagtagctgagattacag
-gtgcctgccaccacacccggctaatttttgtatttttcatagagacagcatttaccatgt
-tggccaggctggtctagaactcctgacctcaggcgatccacccaccttggcctcccaaag
-ttttgggattacaggtatgaaccactgtgcccagccaaatcaagcattttaaacttttta
-tttttatttttaaaattttaatattttgagatggagtctctctctgtcactcaggctgga
-gtgcagtggtgcaatcttggctcactgcaacctctgcctcccaggttcaagcaattctca
-tgcctcagcctcatgaatagctgggattacaggcacttgccaccacacccagctaatttt
-tctatttttagtagtgacagggtttcaccatgttggccaggctggtcttgaactcctaac
-ctcaggtgatccacttgccttggcctcccaaagtgctgagattacaggtgtgaaaggtgt
-ttaaaggccactgtgcctggcctttaaactttttatatttgacaaactttccaaagtcaa
-attctaacttggttcctcaatgattttttgatattagtcccctgaagtccaaaagagaca
-cagtcagcttatttggcataaaaatcatacaggaagcattgtcaaatatgtaatagtgtt
-tggctttctttgggctgtatttgtataaatatgttattggcatatgttccaaaattatgg
-gaaaatcctataattatgaatgacttagtatatgttattaatcattatcattattatgta
-aaattattgtatgctacagaagtaaccaagtttctttgtcaattgtgtctttaagtatga
-cttttctaaaacttttgtcatccacagttgttttacttttatccttttcaaaaggatgat
-tttacaatcagcataggactctgacagttgctgttgaatacaggttttggagatagtgac
-actaaaatagagaaaaaaaatccaacactcccatagagagctgaaatatacatgaatagc
-aagcagaagaggagttaactgcatggactgaactaatagaagactgaaataatccttcta
-tgactttttgcttaaaacattgctaatcctttctttgtttttcagagccaagaaaacatt
-tattttgagcttttaaaaaatttattattattattattattaacaaataaataatcttct
-ttctttttttcttttatctttctctgcagggcaagttctgtatttatagcttttaacaat
-tgaggaaattatactcctataaacaaaatttggagcatatttctctctatctggtttctc
-taaaatttggaaactagttgggagtattcttaacttatagcaatatagttatctgcacaa
-gtacaataagaatctgttttcttttgtaagaggacataattggggacagtggtgatttta
-ccaaggttttgactggaacaacatgctatcagatgcagactcctttaaggaatcaaagtt
-gacttacagagctaataaaagcatcttgggaaagctggcctcctatcttgtctacacagt
-ccctgtacaggttcctgacctgtggtaagtaaagagtgtcactttctaacaggcccagga
-gcccaaagtcttcctgaggtgaggaattcatccaattaatacaggtatttgcaggcacag
-gccgggcttaagacattaaagtcgaatgtgagattacttatggaataaagttccagcaaa
-gccaattaaaaaaaaaacaaggagcctatatggcaaataattattcttgatgattttatg
-caaatactccagccaaatataataagacagaaacttattttgcaaatgaattttgttcta
-taatttgtcctcagtgaaaggggactggagagagaaaaaattatgtttcaaaatcaccta
-tagtacacctgttgttagattttagtctcacttagtgtttttaaatttttattattttct
-atagtttggactaaactctaaaatttttcctggtcacaagtccccaaaataatttttttc
-attttttttcttttttcctttccttttccccccacattttttcctgattagaaatcacca
-aacattaaactgtgctttcctaaagccctgtgaactaaagctagacaatctatttacata
-cataagctactttcatacctgcctactggtgtatgaacttcagagtaatatggcctatat
-tgatttcccaggattattgttgttgttgttgtttttctcctttcctcccccattttctct
-taggacgtgagacttcacaacctgctaaagcgagctttcctaataatgtggaacctacct
-gtctatgaataaactgtcctagtcatgagagatcagacaaaacctgagaccagaggctaa
-ttttcttctaaaatgcttttaaaaagaaaaggggggaaAtgtgaaaggaaaataaacttg
-ggaccctcaaatcactaagccaaaacgaaaagtcaagctgggaacggcatcgggcaaacc
-tgcctcccattctaatgggatagctaaataagatagctacaaagattttaaaaagctaca
-tacctccctcacaattttcccacaaggaaattccttgtgtacctagaacagacagaactc
-aaagtcatccctctgctcatgggagacaaatgcacatctgatggcttcctttgccctatt
-gcttcgctaagccagactaaggcataagtgactattcctgcaagttgcatattcagtgga
-gggctaatcagaaactcaaaagaatgtaacaatttgtcctttatctacctatgacctgga
-aaacccctccccacttcaggttgtctcacctttctggatggaattgatgtacatcttacg
-tatttgctgactgatgtctcatgtctccctaaaatgtataaaacctagctgtgccccaac
-taccttgggcacatgttatcaggacctcctatggctgtgtcactggtgtgtccttgacct
-tggtagaataaattttctaaattgattgagacttgtctcagataactcttgatttgcagt
-aagtagcatttctaaacatctctggaatgcatgcatattgaaactcattatgcaaccctt
-gctgacatcaaggcaggaaaatgtctacaaatgtaatcatttagcgtgacctatgtggct
-aatgtggaccaaattatccttaagctcctgctttaaggtgcataaatgcccctgaggaaa
-aatccaccttggcactctccatcctatcttgctgagattcttgcctgcactcttctacag
-agttctttctttctaataaaactttccttttttcaaaccaatactattatccataaattc
-ttcttctttttttgtttttttgaaacggaatctcactttgttgcccaggctggagtgcag
-tagcatgatcttggctcactgcaacctccacctcctgggctcaagtgagtctcctgcctc
-agcctccagagtagctgggattacagacgtccaccaccacgtccagctaatttttgtatt
-tttagtagagatgaggtttcaccatgttggccaggctggttttgaactcctgacctcaaa
-tgatccacctgccttggcctcccaaagtgctgggattataggtatgagccaccatgccca
-gcagtaaattctccttactaatccacgagtggaccactttccaatgctgaggctctgaca
-cctcgctgggcaGCCACTTTTGATTATTTTGGGTTGTCAGGGCTCAGGGACACAAGAACT
-TGCTCCTTAGGGGAGCTGGAGGTCTAGTAGGGATTGCTTGTTCTCCATCAGGCCCCTAGT
-AGGGAGGCCTCTCCTGTCCCCAATCCCTGACTCCCAGGGATGCTCCCCTCCAAACCACAG
-caggaagttcctccttaggtcagacccacagccctgatgctgtggtctCACTGCAGGTCA
-TAGTCTCACAGGGGCCTCTTATAttattttaattttaattttaattaaattaaattaatt
-ttttttttttagatggagtctcgctcttatcgcccaggctggagtgcggtggtgtgatct
-tggctcactgcaacttctgcctcccaggttcaagtgattctcctgcctcagccacctgag
-tagctgggattacaggcatccgccaccatgcctggctaatttttgtatttttagtagaga
-cagggttttgccatgttgaccaggctggtctcgaaatcctggcctcaagtgttctgcctg
-cctcagcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggtcttatatta
-ttttaattttaaatttaaGAATACATTCTTAATATCAACCTTCAAAGACTCCCTGTTGCT
-TACCAAGTTAAGAAAACTACTTAAACCTCACATATAATTCCTTTCTCAACTGGGACCAAT
-AAACCGTGACAGCTTTATtgaagggggccagccccttcacacctgtgggtatttctcgtc
-aggtgggatgagagactgagaaaagaaatagacacagggacaaagtacagagaaagaaca
-gtgggcccagggcactggcgctcagcatacgaaggacccgcaccggcgccagcctctgag
-ttccctcagtatttattgatcatgatctttactatcttagcaaggggagtgtagcagggc
-aacaggtggggagaaggtcagcagggaaacatgtgagcaaaggaatctgtatcatgagta
-agttcaaggaaagatactgtgcccggatgtgcacgaaggctagatttatgtttctcttta
-cccaagtatctcagtgtagcaaagagcaacagagcagtattgctgccagcatatctcgcc
-tccagccacagggcggttttctcctatctcagaatagaatgaatgggaatggtcggcttt
-acacagagacattccattcccagggatgagcagagaagccttcctcttatctcaactgca
-aagaggcctccctctttcactcctcctcctcagcacagaccctttatgggtgtcgggctg
-ggggatggtaaggtctttcctttcccatgaggccatatctcaggctgtctcagttggggg
-aaacgttggacaatacccaggctttcttgggcagaggtccctgtggctttccacagtgca
-ttgtgtccttggttaacagagaatggagaatggcgatgacttttaccaagcatactgcct
-gcaaacatattaacaaggcacatcctgcacagtcctaaatccattaaactttgatccaat
-acagcacatgtttctgtgagcacagggttggggataaagttacaagttaacagcatctca
-aagcagaaacaatttttcttaatacagatcaaaatggagtttcttatgtttccttttcta
-catagacacagtaacaatctgatttctctttcttttccccacaCTTTCTCACGTGttctt
-tctttctttctttcttttcttttttgagatggagtctcgctttgttgcccaggctggagt
-gcagtggcgtaatctcagctcactgcaaactctgcctcccaggttcaagtgattctcgtg
-cctcagcctcccgagcagctgggattacaggcatgcaccatgacgcccagctaatttttg
-tattttcagtagagacgggtttcaccatcttggccaggctggtctcgaactcctgacctc
-aagtgatccacctacctcagcctcccaaattactgggatcatatgaatgagccaccatgc
-ctggccCATGTTTTTCTTGTACTTTAGGCTTTGCTACTTACAACCAGAACTGCTTACCAT
-TCtgtcagaagccttccaaccagggcaactccatcttgaataggggctgggtaaaataag
-gctgagacccactgaactgctttcccagaaggtcagacattcttagtcacaggatgggat
-aggagtttggcaggactggtatcacaagtacaggtcacaaagaccctgctgataaaacag
-gatgcagtaaaagaagccggccaaaatccaccaaaactacgatggggatgaaagtgacct
-cgattcgtcctcactgctcattatataggaattataatgcattcgcatgctaaaagacac
-tcccaccagcaccatgagaatttaccaatgccatggcaacgtcaggaagttaccctacat
-ggtctaaaaaggggacgaaccctcagttctgggaattgcccatccctttcctggtaaaac
-aatgaataatccaccccttgtttagcatacgatcaaggagtaactataagtatgttcagc
-tgagcagcccatgccactgccctgcctatggagtagccattattttattcctttactttc
-ttaaataaacttgctttcactttactctatggattcaccccaaattccttcttgtgtgag
-gtccagaaaccctgtcttggggtctggtttggtacccctttctggtaataATTCTGTAAG
-TATTTGTAGTACGTCTGAGCCACCAAAATTTCcatactgatccttccattagaatatcct
-ttctgcctgtctctttctggcaggatctgatccatatttcaaagccagtctcaaatgcca
-ccttttccaaagaaacctatcctTATATCTTTATCTAATACAAACAGTATATATTGGGAG
-CCTAAGAAATGCTTGTTGCATACATCAATGAATGAACCCCAAACCAATGTATTTCTCCCT
-TCCTTGTAATCTCCAGAAATGTTTATAAACTTTGTTGTTGTTTAtttgtttgttttattt
-ttatttttattttgagatggagttttgttcttgtcacccaggcgggagtgtaatggcgcg
-atctcggctcaccacaacctctgcctcctgggttcaagtgattctcctgtctcagcctcc
-cgagtagctgggattacaggtgtgcactaccatgcccagctaatttttgtggttttagta
-gaaatggggtttcaccatgttggtcaggctggtctcaaactcctgacctcaggtgatcca
-cccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgtgcccggccTGTT
-GCTATTTATTTAATATACTTTATTTTTTTGAGCGATTATAAGTTTATTtttatttattta
-tttatttatttatttatttttgagacagggtctcattgtcacctcttgcccaggctggag
-tgcagtggcacgatgttagctcactgcaacctctgcctcccagagtcaagtgatcctgcc
-acctcagcctcctgagtagttgggaccacagatgtgcaccaccacgctgggctactattt
-ttatatttttagtgcagatggggttttgccatgttgctcaggctgatcctgaactcctga
-gctcaagcaatctgcctgccttggcctcccaaagttctggaattacatgcgtgagctact
-gagcccggccTTAGGTTTACAGAACAGCATTCCACCCATGTTATTTATGCAGGGGAGCAC
-ACCACACACATCACTTTGCAGCTTCCTTTCTCCTCTTATATGTCTTACAGATCTTTCTGT
-GTTCTGTACATTGAGACACTCATTCATTGGCTTCACTCATTCATTTGAATTCattccttt
-gttcaacagatatttatcgtcagctctatgtcaggcactatgagaagtgcttgggatata
-aaactgaacaaaataaacaaagtcctttccattggagagatgacattctagtgtaaggag
-atagacaatagataataaatacaacaaataaataaatacatggtttagtatgttataaga
-tgctttctgtaggaaaaaagtgagagggacctggagtggagggaggaccgagtggggaca
-ggtgcagggtgggggcagccagtagagcccctctgaggaggAGTGGATCACAGGAGGATG
-ACTGGCAAGACCTAAAGGTGGCAAGCTGTCTCTGGTGCTGGCTCTGAGAGCAGGATAGCT
-GGAGTAGAGTGAGGGAAAGGCGAGGTCAGAGGTGAACCTGCAGGGCAGGTGGGGCTCCTT
-CCGCTAGCgcatggtgttccattatccagatgcaccaggacaaatgtcgcccactgccat
-tactaggtgcttaccatgtgccatcaagaacaataccgcaggccgggtgcggtggctcac
-gcctgtaatcccagcattttgggaggccaagatgggtggatcacttgaggtcaggagttc
-gagaccagcctggctaacatggtgaaacctggtctcgactagaaatctaaaattagccta
-gcgtggaggcgcactcctgtaaacccagctacttgggaggctgaggcaggagaatctatt
-gaacccaggaggcagaggttgcagtgagcctagatttcgccattgcactccaactgggca
-agagcaaaaatctgtctcaaaaaacaaacaaaaacaatactgcaataaacattctgtcag
-tctgtcattttgcccatggacagaatatctgcagaattaattcccggcagtgaacttgAG
-AGAGATCACCCAATTGCCTTCCAAAGGAGCTGTGCCTGGACCATGGGTTTCAGCACAAAG
-TGCTGCTCCCTCCAACTTGTAGACTCTTCTGGCAGGTCACGGTGGAGCTCACATTCTAGC
-GGGAGAGTGTCCAGGGCAGAGATATTCCATTCCGTGTCTTTTCTCCCAGGGCTCGCACAG
-AGAGGGTTCACGCGGTAGTCAGTAGGTGGGCAGTGCTTGGTGAAGGCATTGATGGGTGGA
-GGGATTGAAGGATGAATGAATGGATTAGGGGCTGACAGTGCCGCTGCAGTTACTCAAAGG
-AGCCACCAGGAGGCGCAGGGAGCCCACATTCTGGAGACAAACCTTTTAAAAAAAGCATCT
-GGTGACTTAACGACCTTTTCACCAATGGCTTGTGTGGGGCCTTAATGCTAGGGTGAGAAA
-AAGGTGGGAGATGGAAGAAAGGGGAGTGGGTAAAAGGACATGTGGGAGAAGAAGGCAGAG
-AGAGGGCCTTCTGAGGGGGCCTCCACGCCAGGTAAGGACCGTTTAGCTCCCCTAAGAGCC
-TGCAGCATTGATGCAGATCCCAGCAAAGCCAAAACCCCCTTATGCCCACAGTTGAGCCCA
-AAAGCCCAGAACAGAGGGGAAAAATAAATTTCAGGATAggccaggtgaagtggcttacgc
-ctgtaatcccaaaacttggcgaggtcaagtaatcccaagtactttgggaggctgacaggg
-gaaactctatctaaaaaaaaaaaataaGAAAAGGAATTTCCAGGATAAATATGTACAGTA
-TAATCCCATTTATGTGAAAAAAAAAATCTCCACAAATAAATTCCTTtgtgcgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtttgtgtgtgacggagtctcagtctgtcgcccaggctgaagt
-gcagtggcacgttctcggctcactgcaacctccggctcccaggttcaagcaattctcctg
-cctcagcctcctgagtatctgggattacaggcgtgtgacaccacacccagctaatttttg
-tatttgtggtagagacggggtttcaccatgttggtcaggctggtctcgaactcctgacct
-cgtgatctgcccgcctcagcctcccaTAAATTCTACATATTAGTTTGGGGAGTGTGTATT
-TACCACATACACATCTACAGGGAAAATCTGGAAAGGTAAATGTCGAATTGACAACAGTGG
-TTACTTTTGTTATTGTGTGTGTAGAGAGGGGCAGGGGACAAAAAGGAAAATGAGGAGTGA
-TCAAAGGGGACTTTAATTTTCTTTTTTTTTTTTGAGACAGAGtctcagctcactgcaacc
-tctgtctcccaggttcaagtgattctcctgcctcagcctcccaggtagctgggattacag
-gcacccgccaccacgcctagctaatttttgtattttattttagtagagacagggtttcgg
-tttcaccatgttggccaggctggtctcaaactcctgacctcaggtgatctgcctgctgcg
-gcctcccaaagtgctgggattacaggcgtgagtcactgcaccgggccCCCAAAGGGGACT
-TTAGACTAAACTGAAACATTTTAACTTTCCAGGAATCTGTAACCCTGCTATTATATAACC
-ACAAATTAAAAATTACTTTaaaaaatgaaaaaaaaaaaaaaaaaaaaaaggctgggagcg
-gtggctcacacctgtaatcccagcactttgggaggctgaggcaggaggatcacgaggtca
-ggggtttgagaccagcctggccaaaacggtgaaaccctgcctctactaaaaagacaaaaa
-ttagcagagtgtggtggcacgtgcctgcagttccaactactcaggaggctgaggcaggag
-aatcgcttgaacttgggaggcagaggttgcagtgagcctagactgcgccattgcactcca
-gcctgggcaacagagcaagactccggctcaaagaaaaaaaaaaaaggaaaagagaaaaaA
-AAAGGAACAATAACAACAACaaaaattaaatgctatcttgtgttgcatcaatagaagtct
-tacgtgcagctcaagggaggtgacagccccctctgctctgctcagaccacacctgggacc
-tcctttcctcttcttggccctgtcccgtgagaagaataatgacagcctaaggcatgCTGG
-GGGTTGGAGATGGGGGGAGGCTGGGGCCATCTGCACATGATACAGATCCAGGAATAGTCC
-CTTTACCCAAGCGGGAGAAACTGGGCAGGTGAGCAGCTTCCAGGTGTGTGGATGGCAAAT
-GGATGCCAGACTTTAGGATAGGAATCCAGGGGTGCAGCGGATGGAAAGTCCAGCCCAGGA
-TGGGGCATAGTTTTCCCACCCAGCTAGGGAGGGAGGGTAGGGGCTACTCTGGGGTGTCAG
-GAGTGCCGAAGCCTGAGGTAGGCGCAAGCCAGGCAGCATGGCAGCATCCTTCCAGAGGGT
-GTTGTGCAGCTGTGGAAAACAATTGCTGGGAGGCCGGCAGGGGCAGTGGTGGAGGAGACC
-AGAGCTTAATTCTAGGTGAGTCACAATAGCCTCATCTGTAGAATGAGTGAGGGGTGGGGC
-GTAGTTTCAGAttttttttttttttttgacacgtagtttcgctcctgttgcccaggctgg
-agcgcaatggcgcaatctcggctcaccgcaacctccgcctcccgggttcaagcgactctc
-ctgcctcagcctcctgagtagctgggattacagccatgtgccaccatgcccggctaattt
-tgtatttttagtagagacggggtttctccatgttggtcaggctggtcttgaactcttgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtcagccaccgtgcccCACCA
-GTTTCTGACTGAttttcttttttttttttttttgagacggagtcccgctctgtcgcccgg
-gcgaagtgcagtggcgcgatctcggctccctgcaagctccgcctcccgggttcacgccat
-tcccgggcctgggaccacaggcgccgccaccacgcccggctagtatctttttttattttt
-attttcaatagagacggggtttcaccgtgttagccaggacggtctcgatctcccgacctc
-gtgatccgcccgcctcggcctcccaaagtgccgggatcacaggcgtgagccaccgcgccg
-ggccCAGCTTCTGATTTTATGCAGCTGGCGGGATCTTGTTCTTGGTCCTTTAAGGCGACC
-GGAGGGATTGCAGTTTTAAAAACTCGCCAGCAGAGGTCGCCTTCTGACGGATTTGACCAA
-AAAATCCATTCCGGTGGGAAAGGGGAACCTGCGCCTGCGATtctctctctctccccctct
-ctccctctctctttctctccccccctctctctctctccctccctccctctctcctcctac
-tcctccctccctccctctctctgtctctccctccctccctcccgctctctcccccctccc
-cctctccccctccctccctcccttcctccctctctGtctctttctttgagacaaagtttc
-actctgtcacccaggctggagtgcagtggcacgatctccactcactgcaacctctgcctc
-ccggggttcgtgattctcatgcctcagcctcccgagtagctgggattacaggcgcccgcc
-accacgcccggctaatttttgtatttttagtagagacggggttttgccatgttggccagg
-ctggtctcaaactcctgacctcaagtgatctgcctgcctcggcctcccaaaCTAAGATTC
-ATTTGTTGACTAAGTGAATAAAAGGGGAGACATTGAAGAGGGGGACCCgactggatttgg
-gggtgaaggtggagttgagagtgactttgaggcttctgcttgagcaatgagtggagggtg
-cctctcctgagctggggaaactggggcagCACTGACGGAGGGGACACAGCTACAGAGGGG
-AGAACCCTCTCCTGCCGGGGCTGCGGGTTACAGCCTGCACTGCGATTCTCTGATCTCAGG
-GACCTCAGACTTCTGGGGCCCTGTCCCCTACCTCTGTGTATGACCCTAGCTGGCTGAGGG
-CTGAAGGCTTGCTGTTGGCTCTTTCTGCACCCTCAGCCTTCTCCTTCCTCTTCCCTCTGC
-AGGACTCTGTCCTGGGTCCTTAGGAAGAGTCCAGGCCCCAGGACAGGGAAGTTGGGTCAG
-GCCTGGACCTCACATTCCCTGCCTGTCCCATGAGGTGGACAGTGAGAGGACAAATGCCTG
-GACCCCTGGCCCCAAACCCAAGAGCAGATGTACCGGAGAAGAGCTTCTTAGAGCACCAGG
-TGCCAGGGCTGCGGTGGAGAATCAGGGGGGCCCAGGGGAAGGGGCTGCAGATGAGGGAGG
-AGATAGATACGGAGGGCCTGTGTGCCTCCCAGATACAGGGCTGGCTTTCCCAGCCCAGAA
-GGTTCTTTCTGCCTTTCCCAGTCTTCTTCCATTCTCATTTCATGTTCACACTTTTGGCCA
-TACCCAGGGTCAGCCATGAAGATTGTTCTCAGAATGTtttctttcttccttcctttctct
-ttcttttctttctttcttcctttctttctttcctttctttttctttcttctctttctttt
-tttcttttcttctttctctctctttctttctctctctctctctccttccttccttccttc
-ttttctttctttcttctttctttttttgaaacagagtctcactatgtcacccaggctgta
-gtgcattggcacgatcactgctcactgcagccttgacctcctgggctcaagtgatcctcc
-cgcctcagcctcctgagtagctgggaccacaggtatgcaccaccatgcccagctgatttt
-ttaattttttgtagagatgggggtctcactgtgttgctctggttggtcttaaactgctgg
-gctcaagtgatcctcccgccttggccttccagagtgttgggattacaagcaggagcagca
-cacctggccAATGTTTTATTTAAATCAACTCACTTAGGTTGAAttagaataattttagac
-acacagaagagtgtgtctatataattttgaattatatacccaacactcagatataacatt
-agcattttgccatatttgcttcatctatttctttctgaaatattttaatgtaaattacag
-atatcatgaattttcatccccaaatactttagtctgcatCAGTCAAAGATATCTAATATT
-TAATCCACAATGGATTTCCCCAGTGGCAATTCCCCTAAATTGTGTTTTACAGTTGACAGT
-GGatttattgtaaaaggaaactcgatataccaagtgacaagcaagttatcttctgttata
-aatagaaaggatccctggaaatggacacagtgtcaggcccagagctgtgggtggagacct
-gctctctgtttgacataaataggagatcagtggctactaaatctgaagacagggcagcag
-caaagaacattttctcacggatgtgatgagacttgaaagggactcagaaagggggtcact
-ttctccaggttggggtaactgttatttaagccagggttcatCTGCAGCGTGGGGAGCCAG
-AGGGTGACCCCTTCCCTAGGTGATGGAGGTGGCTGAGGCTCCAGAAGTTTCCAGAGAAAG
-ATCTGGTGTTCCTACAAGGCCAGTGGCAGGGGGAAGGGCACTAGACAGTGGGGCTGGAGG
-GTGTGGGCCTGTCCCTGCTCTGATTTTGGGCACTGCACTTTTGCCTGTAAGAAGGGGATA
-TGTGAGGCCAGGACAGGGTCTCCTACTCTGTCCCCACTCCCACGCCAAACAGGGCCTTGA
-GGACTCTCGCGACCTCCATGACCCAGCTTCCCTCCTACCCCAGCCCCAAGCCTGTTTTTG
-TTCCCCTCCCTCCctcctgcttgatctttgagcctcagccaggatgttacctcctcctag
-aagcctgccttggtccctggaatggattaagggactctctcctgggccccacagctgccc
-aggatcactcagcactgtagtgccctgttggcctttgcctccctccagctgtggacgtac
-aaagcagacagcgaatctgtcttgctcaccactgtacccccatcccctactgcagcacct
-ggcacatagcagtagtgcggcacacttgttgaatgaataaGGGATCATTACTACTACGCT
-TCCCACTCATAAATGTCTGCCTCTTCGGGGGGCTCAGAATGCACATTTGGTCCTTCATTA
-ACTCATTTACTCACAAttttttttttttttttttttttgagacggagtttcactcttgtc
-gcccaggctggagtgcaatggtgtgatctcggctcactgcaacctctgcctctcaggttc
-aagcgattctcctgcctcagcctcccgagtagctgggattacaggcgctagccaccatgc
-ctggctaatttttgtatttttagtagagatggggtttcaccatgttggccaggctggtct
-cgaactcctgacctctcaggtgattcacccacctcagcctcccaaagtgctgggattaca
-ggcatgagccaccgtgcctggctcatttactcacaaatatttactgagcacctactatgt
-cccaagcagtattctaggcactggaaatggggcaaggctgctgcctctgtggaacttata
-ctggggtgtgggaggcaaagaaaaacaagcaaacatacatatgaaataatttaagatgcc
-actcgtggtgggagggactgacaggagctgctgtggaagagagcattaggagggccttgc
-tgaggggtgactttatttcagctgagaggtggatgagaaggcacctgcaggggaagaaga
-accaggggaagggtgttcctgatggagcaacagcctgtgctaaggccccaaagtgagcac
-cagctgggcgctgagggacagaaccaggcacaggctcggttagaggaggtctgaggtccc
-agaggagacaagagaggggaaggatgggagggcaggcctgagccgcagaaggccagtgga
-aggttctgagtgggaagaggatgggataggagttatattctgaaaggtccgcctgtgctg
-ggtggaggatgggtggggacaggcaggagcagcccaggctctgatgcagcctccaggcag
-agatgGACCAGGGGAGCCCATTTCATATCCGGCCCCTGTGGAGGGTCTGAGGGTGTTGAG
-CAGACAGGCCCTGGCTTTGGAAGTCCTGGGTGTCTGGACCCGCCTGCCTGTGGGGCCCCA
-GCAGAGAGGAAGGGAGGCGGGGCTCCCAGTGCCTGTTGACTCATTTGCATCTGATTTGCA
-TGTGAAGCAGAGAGTCAGGTTGAAAGCTGGGAAGGCCTGTGCCAGCCCTGGGTAGAGGGT
-CTTGGGTGTTAGTTCCCACAAAGACTCTGTCCCAGGCCATGACCTTCCTGTTCAGGAGGG
-GCTCTGCCTTCCCTTGCCTCCAACGCCCCTCTGGCCTGGCCCTGCCATCTGGGGCTGGGC
-AGTGCCCACGGGGACAAGGTCGTTTCCTTTTAGGAGAGGTCTGCATGCTATGAGGACAAA
-GGCCAAATCCCCACCCTCGGGAACCTCCTTCCCCAGCAAAATCCCATCTGTCAGGCTCAG
-CCTCTGACCTTCGACCTCTCTGTCAGCACAGGCTGCAGTGTTGGGGAGGGGAGGGTCCCC
-ACCCCCAACCCTAGGGGAGACCCAAACCTCTCCCCCCAGCCTTCTCCATCTGTCCCCTTC
-GGCTtctgccacctgctccgtgtgatccaggccaggtcacctccgctttctgggccttgg
-ttcccccacgtgtccaatgtgggTTTCCCAAATACCAGTGACTTGTGTCAGTCCACTTTT
-GTAATTGTAGCCAACTCCacttactatttcttaagtgaacttactctccttcacttaaat
-agatttaatttaaaaagaaatgttataccagctctgtaaatggaaaaccagtttcatctg
-ccacaagtagaaacataataggaaaaaataatgaaatggaaataaaacaatgttactcta
-gtctagcCTCaagtgaaaaaagtcagacacaaaaggttacatttatatgattgtctagaa
-aatgcaaaactagagagaaagaaaacagaccactggttgccagggttggggagagggagc
-tgacaatatcaaggggtgcagaaactttttagggtgatccaaactgttttttgatgatga
-tggtggttacagattgtatacatttgccaaaaatcaccaaagtgtacattcaaagttggt
-gagttttattttatgtataaaccacctcaaaaagacaaaTTTTAGAGAAGAAAACAAAGA
-AAAATGCCGGTTTAGCCCCAAGTCTGAGGCTTCCTCTCTGTTAAACAAATTAGCAAATAG
-AAggccaggcatggtggctcatgcctgtaatcccagcactttgggaggctgaggcaggag
-gatcacttgaggtcaggagttcaagaccagccatggccaacatggtgaaatcctgtctct
-acaaaaaatacaaaaattagctgggcgtggtggcgcatgcttgtaattccagctactcag
-gaggctgaggcaggagaattgcttgaacctgggaggcggttgcagtgagccgagattgca
-ccaccgcactccaccctgagtaacagagcaagagactccatctcaaaaaacaaacaaaca
-aacaaggaagagaaAGAGGGATTTCTCTCTCTGTCTCTCACCAACTCTCTAACCCTCCCT
-AGTTCcatgcaccaaggaaaagctatgtgaggacataggagaaggtggccagccacaggc
-caagaagagagccttcaccagggactgaatcagctggcacctccatctggtacctctagg
-ctccagagctgtgagaaatagatgtgtgctgtttgagccacatagtctctgatattttgt
-tttggcagccggagcagactcatgcCCTCTGATCTCATCATTAGCATAATGCctgtttat
-agaaccatgctgtgggcaggctctgtgctaaaagctttgccagcatcatttcagagactt
-gatgtgacatcttacatcgtaggggaaattattgttcccattaaagatgggCCCACAGTG
-TGGCTAAGCCAGTGGGGCATGTCCTCAGACCTGGAGTGCTCCCATAGGAAGCTGGGCCCG
-ATTCTTTCTGAAGGTGTGAGCTGGAGGCAGTGATGGTGGTTTGAGAGGCACGGGCTGTGG
-GGAACTGGATACTGAGGGCAGTCCCTGTGTCCCAGGGGAAGCACTCTGTGCTTTCAAGGG
-GGGCACTGGCAGAGAAGGAAGTGTCCCTCATCACATCCTGGAGACCCACCCTCTGGAGAC
-AGTGTTTTCACGAtttcttttctttcttttttttttcagacagggtctcactctgtcacc
-caggctagagtgcagtggcacgatctcagctcactgcaacctctgccttctaggttcaag
-taattctcctacctcagcctcctgagtagctgggattacaggcacccgccaccacgccca
-gctcatttttatttttttatttttcgtagagacagggtttcaccacgttggccaggctgg
-tgtcaaactcctgacctcaaatgatctgcttgctttggcctcccaaagtgctgggattac
-aggcatgagccatcatgcctggccATGTTTTCACTATTTCTATGGACCGTTTCATAAGTG
-TTGTGTGGACATAGGgctccagggttaaatgtgtttgggaaatgtggtgtaagcaaagag
-aaagaagtttccactctaatacttctcagagactttaatgtggagataggcatggcgaat
-ctcTCACTGCGGGACAAgtgggcaagagaagtgtggatgctgccttctgggcactcacag
-ttggtggaggagacagccaacatgcaagcaggggccacaccacatgtctggaggttggaa
-cgctatgcagagagaccacaggaaccatgggggaagtggggagggatttcccagaggaga
-tgacatttgaacaaagatgcaaaggaagtgtggaaggaggtaagggagagctgtatgact
-gtctgggggaagagaaacccaagcagagggaacagcaagcacaaaggttctgaggctcaa
-ggttgcttggtgcatttgacaagcagaccagcgccattggctggagctagctgggccgag
-tgggagggtgataatggatgaggtTGACCACGGTCCGCTCCCAAAGGCCATGGAATTCAG
-AGCATACTGGAGAGCCCTTAGTGGGTTTGGACAGACAGTGATACCTTGGGACACACAGCC
-TCATGAGCTCATACTGACCAAACAAACCACCCAAAATAGCAGCAGAAACAACAGCCACAG
-GGTGCAGAGGGTCATTCAGGGTGcctctcacaagcctgggaagtaggcatgtgatatggt
-ttggctgtgtccccacccaaatctcatcttgttttgtaactgcttcaattcccatgtgtc
-gtgggaggaacccggtagggggtgattgaactgtgggggcaggtctttcctgcgctgttc
-ttgtgatagtgaaaatgggtctcacgagatctgatggttataaaaatcggagtttccctg
-cacaggctctcttttttgcctgccgccatccacgtaagatgtgacttactcctccttgcc
-ttcggtcatgattgtgaggcctccacagccttgtggaagtccattaaacttctttcattt
-gtaaattgcccagtctcgggtatgtttttatcaacagcgtgaaaacgaactaatacagca
-cggttaactcccattttacaggcgaggaagctgaagcttagaaagatgaaagaatttgcT
-TGTGACCCCGAACGTTCCCTCTGGCTGATGCATTGTTCCTACCTGCTCTGTTTCCTTGTT
-TATGAAGCTTGCAGGCTCCAtggtcctcaaccctggctgctacacactggaataacctgg
-ggtggcagactgtgtctccccaggatggccacaccaatacatctcacatcccacatgctt
-ggccaatagcatatgacagatgtgactgtgggttacttctaaagctaggccataatagcc
-atcgcaaccccaccgtgatctctgggattgctagttctgagggaagccagctgccatgtc
-ctgaggttactcaagaagccctgtggagtaggccatttggggagggactgaggcccccag
-gcaacatctgtcccaacttgccagtcatgttagtgaactacccttgtccagccttcagat
-gacACCTCATGAGAGGCCCTGAGAGAGTCTTATTGTCCCGTTCACCATTCCTGTTGCCCT
-GTGGCCAGCTAATCAGCTTGTGGTGGTTTTCATTTCTTTTTTCTTTTTGCCATTAATAGC
-AATGCCAggctgggctcagtggctcatgcctgtaatcccagcactttgggaggccgaggt
-gggtggatcacctgaggtcagaagtttgagacaagcctggctaacatggtgaaaccctgt
-ctctattaaaaatacaaaaattagccaggtgtgatggtgtgcgcctgtaatcctagctac
-ttctcccaagtagaagggcgtgattcttctcatgcctcatgctgaggcatgagaatcact
-tgaacccgggaggctgaggctgcagtgagcggtgtttgtgccactgcacttcagcctggg
-cgacagagtgagactatctcaaaaaaaaaaaaaaaaGTAGCAATGCCATAGTAAGTATTC
-TTCTAATTAAGCCCTTCTGAATCAGCTTAATTATTTGCTTAGGGTCAATTTCTAAATGCA
-CAGTTGCTGGATCAGAGTACAAGTCCACTGATACAGCATTTAATTTTTTCAAAGAATTGT
-GACTGggccgggcacggtggctcatgcctataatcccagcactttgggaggccaaggcgg
-gcggatcacctgaggttgggagttggagaccagtctgaccaacatggagaaaccccgtct
-ctactaaaaatacaaaattagctgggcatggtggtgcatgcgtgtaatcccagctacacg
-ggaggctgaggcaggagaattgcttgaacccgggaggcagaggttgcggtgagctgagag
-ggtgccagcttgggcaacaagagtgaaactccgtctcaaaaagaaaaaaaaaaaaaaaag
-aaTGTGACTATagctggccgtggtggctcatgcctgtaatcccagcactgtgggaggcaa
-gatggtcagattgcttgagtcaaggagtttcagaccagcctgggaaacatggcaaaaccc
-tgtctctacagaaaaattagctgcgcatgggggcagacacctgtagtcccagctacgtgg
-gaggctgaggtgggagcatcacctgagcctgggaagtcgaggctgtagtgagctgtgttt
-gcaccaccgcactccagcctgggcaacagagtgaggccttgtctcaaaaaaatttaaaaa
-ataaataaaTGTAACTATATTCTCCTTCAGTAGCAACATCTCAATTTACCTTCTCATGCA
-CAGTGTTTGGAAGGACATATTTTGGGATGAGTTTTCTTTTACTTCACTACCTTATTTTGT
-TCTTTCATAGAATGCCTTTAAAATGTTACTTTAAAAAAATAGATAATACCTTTACAAGGT
-ACAAAATCCAAAAGGTATAAAAATGttttctttttttttttggagacagagtttcgctct
-tgtcgcccaggctggagtgcaatggtgcgatcttggctcgctgaaacctccgcctcccgg
-gtttaggtgattctcctgcctcagcctcctgagtagctggaattacaggtgcccaccacc
-atgccctgctaatttttgtattattagtagagatggggtttcaccatgttggccaggctg
-gttttgacctcctgacttcaggtgatccacccaccttggcctcccaaagtactgggatca
-caggcataagccaccacgcccggccAAAAATATTTTATAAAAGTCTTTCCCCCACCCCTT
-TCCCCTCAGTCAGCACAAGTAGCCACCACTGGGACCAGTTTCTGGTGGATAAATCCAGAA
-AAGTTCAGGTGCAAGTAAACACACATAGAGAGAACACCCTTTAAATTAAATGAAACTAAA
-GAAAACAGAGCCATAGGTGCACAGGAGACAGAGAGCTGACATCTGGGGCTGATTGCATCT
-TGGTTTCGAGCTGAGTGGCAAAAATACTGCTAAGGTCAACGTTCTGAAGGAGGCAAAACC
-CACACGCAGAACCAGCCATAGGCCTGTCAACAAGGCGAGATGTTATCATTGCTCATGTGC
-TGGGTCAGGATAAGGCCATACAGACCGCCCAGTTCTCTCTGATCTGGGTGTAGTTAATGA
-CAGTTTATCCGCCTTTTTCTTCTCTCTCACCACTCCCCATGGTGGGGGAGGAGAAGGACT
-GGGAGGACTTGAATACTCTGAATTGGCACCAGGTGCTTAATATAGTCCTGAAAATAGAAG
-ACCAATATGCTGTTGGCACATAAAGATGCCCACAATTCTAGAATCTGAGTGCGCCCAGAT
-GATCTCTCTTTACATGGCCTAATTTGGGATCCTGACAAGTTCCTTCTGCCCTCTGCCTCA
-CTTTCTCAATCTAGGAATGGGCCTCTCGGTTTTTGTTTTGTCTAATTTTAAGCTCTCGGC
-TGTGCATGGCAGAGGCAAACTTGAAGACGCAAGGGTCAGTGAGCAGGGCCTTTATCCAGG
-TATCTCAAATATCTCCCAACCCTGATTAAAGTTACATATCTCAGAGAAGAATTTGGTCAA
-CACCATTGTTGTCATTCCTGGTTAATAACAGGGAAGTTGAGGTctgggaagcaccctagt
-gatgtgttcacatggccatgtgcttctgtaaaatttaccaatgtaaggcatcttaacctc
-attctgttaaaaccactatctcctttcattccaacttccctttgcatcagatgatgttgg
-ggttggtgtgagcagtttgggcatcttgctaaaaggaccttaacatttactttgggttta
-gtgggatatatttatattgtttccagtcacttttgtgaaaaattattactaactgacctg
-gtattgaaatggcttccaggaatatatccataccgagcatactgagctgactcaacttgt
-cgtggcatcaagattcaggatcagaggttatatctcaagatatatgaatggtcctacagc
-actcagttccacaagactgtgaaggagaggtttgaatgtatacacggagccagcagctag
-tttatggaaagtattacagatgtgtttgagacaggcagctaataaaaagaatgttatttt
-tctgcgttttgtaacgtttgtgcaatttctcttttttttttttttttttttggagacaag
-gtcttgctctgtcatctaggctggaatgcagtggtgaaatcatggcttactgcagcctca
-acctcctggtctcaagcaatcctccctctcagcctcctgagtagctgggactataggcac
-gtgccaccatgcctgactaatttcttttttccttttttttttttttttttgagacggagt
-ctcactgtcgtccagcttggagtgcagtggcacaatcttgactcactgcaacctctgcct
-cccagattcaagtgattctcctggctgagcctcccaagtagctgggattacaggtgccca
-ctaccacgtccagctaattttttgtatttttagtagagatgaggttctgccatgttgtct
-agattggtctcaaactcctgagctcaggtgatccaccagcctcggcctcccaaagtgcta
-ggattacaggtatgagccaccatgcctggccagctaatttctttttaaaatttttttgta
-gagctggggatctcgctttgttgcccaggctggtctgaagcccctgggctcaggcactcc
-ttccacctcgacctcccaaagtggtgggattacaggcatgagccaccttattgtggtttc
-ttgtctctttctaaccaaatcttcactttattacttaatttcatatctgtaattttttct
-taaagaggtctccctaGggctggacgtggtggctcacgcctgtaatcccagcactttggg
-aggccgaggtgggtggatcgcctgaggtcaggagttcaagaccagcctgaccaacatact
-gaaaccctgtctctactaaaaatacaaaaaattagcgggtatggtggcgggcacctgtaa
-tcccagctactcaggaggctaagacaggaaaatcacttgaacttgggaggcagaggttgc
-agggagctgagatcgtgccattgcattccagcctgggcgataagagtgaaactctgtctc
-aaaaaaaaaaaaaaaaaaaaaaaaagaaGTCTCCCTAGGCTGAAGCTACCTGCTCAATCT
-TCTCTTGTGTCTTATAGGATCACAGGATCCCCCTTGCCTTACCTCACTGTTACTCCCAAA
-CAGTTCTCACATGTTTACAAGGGAATGTAACAGAGTGGATCAGAGAATTCATTCTGGATC
-CAGACCGAccttagttttctcatctatataatgggaataatagcaggatctctcgcctta
-gatagtcatgaagtccaatgagatgatgtgtataaagccctaacacaatgTAGCAGAGGG
-CACAGGGCCAGGATTGATATTTAGCTGGTCCTCACGGATACAGCAGACTCCCTGTTTATG
-ACAGTGGTTGGCTCTGATTTGGTTGGTGTCCATGCCAGAGTGTACAATCATTATTAGCTA
-TTGATATATTATTAGCTCCCTCCCCTGCCCACCCAGGGGTTTACGCAGTAAGTTCTCAAT
-TATTGGCAATCCAAACAAAGAATAAAAGACACCAGCTGGAATGAAACAGAGAAGCTGGTT
-CCAAATTGAGCAATTCAGACTGACTGCTATAAAATTTCCTCACCTTAAAGGCCCTTAGAG
-TTAATTCATTCTAATCCCCCTAAAAATATACTTTTTTGACATGTTCAAGTATTGGAAATT
-TGGAAAATTCACAAAAACACAAAGAAGAAATTAACTGCTGTGATTATAGATGATTATACA
-CATATACATATGTATTTAATACATATTTATGCTGTACATAGTGTTTTGAAGCATACTGTA
-CTTCAAAAAAATTTGGGAGgggtgcattggcttatgcctgtaatcctagaaattcaggag
-gccaaagcaggaggatcacttgaggccaggagttctagactggcctggggcaacatagcg
-agacccgtagcttgacatggtgatgcgggcctgtagtcttagttactctggaggctgagg
-tgtgaggattgcttcaacctaggttacagtgagctatgattgcaccactgcactccaccc
-tgggcaacagagctagaccctgtctctaaaaaacataaataaaCCAATGTTTAATACTTA
-GCATTTCCCCCTATCTTTAAATATCTTCTAGCTACTTCACttttatttttatctttttga
-gatgatctcttgcccaggttggggtgcagtggcatgatctcagcttactgcatcccccac
-atcccaggttcaatctattctcctgcctcagcctcctgagtagctgggattacaggcatg
-tggcaccacgcctggctaatttttgtatttttagtagagacgaggtttcaccacgttggc
-caggctggtcttgaactcctgacttcaggtgatctggtcgcctcagcctcccaaagtgct
-gggattacaggtgtgagccactgctcctggTAGCTACTTCACTTTTAATGGCTGCATAAT
-ATTCCTCATCAGAAAGTGGGAAAAATTAggctaggtggcgtggctcatgcctgtaatcct
-agtactttgggaggctgagttggtagaattgctagagctcaggagtttaagatcagtctg
-ggcaacatggcaaaaccccatccctacaaaaaatacagaaaataccgggtgtggtggtgc
-acacctgtagtcccagctacttgggaggctgaggtgggaagattgcttgaccccaggaga
-ttgaggctgctgtgagctgagatcctgccactgcactccagcctgggcgacagagtgaga
-ctccatctcaaaaaaaaaaaaaaaaaaagaaaagaaaaaGATAAAGAAATAAATAAAGTG
-TTAATAATTAAAAGTACTTTTAGAGGGTTATGTCATAAGCCTTGACAAGACTTGTTCTGT
-AAAGCTACCCGGCATGCAAAAAGCTCAATTAAGTTAGCTCCTCCACAGGATGGAAttata
-taaccaatccctttcaagaggcattgaagttgtttccattattttgctatgatgaataag
-gctgagcaatattaatctttgctcatatctttggtcatttcctttgtaaatttcgggact
-gctgggtATGCACATTTTAAAATTAActcactcatcatcatgcagttaggagaacagaga
-aaggaaggggcttgcaccgggtcacatagggagttagcgtcaaagtcaggactaggaacc
-agccagggccctctaactGGAGCTCTTCCAGCTGGGGTCCTAGAGGAAGTCCCAGCTGGC
-CGCGGGAGGGAGGAGGAGGAAGGGAAAGAACCAGGCGCCGGGGCTGAAGCGGCGGCAGGA
-AGAAGGTGGGGCCGGCTGGGAGGAGCGGGCGGAGCTGCTGAGCAGCGCCTCTCCTTCGGG
-CGGGGGAAGCTAAGCGGTCGCCTGGCAACCCTGGCGGCGCGCCGTTCGAACGGAAGCGAG
-GAACCAATCAGGAAGTCCGGGGCGAACCATTCTGGTGTGAAGGGGGGCGGCGTGCTCACT
-TCCCCTTCCACGGCGCCCCAGGGACTTTCCCTGCGGTGGGGGCCTTCGACAGTGAGGGCC
-ACCCGCTCAGCTCGACCGCGGAGGGCAGCTCCAAAGGGGACCCCAAAGGTGCCCACGCGG
-GGCTGGGGCCTCCTGGGCGTCGTTGGGAGCGGCCACTACCGGCCCGGGTCCGAGCTGTCA
-GCCTCTCCAAAGCCTGCGCGAGAGGAGCCGGGACACGCCTAGCGCGGGCTCCAGGTGAGG
-GCGCGGGTGGGTCCGGGTGCGACCCCGGGTCTGGGGGCCCCGTTCCCCGAGCGTCTGCTG
-TCTGCTTTCTCCCCGCGTCGTACCTGCGTGTcatttcacagatgaggactctgaggctca
-gagaggcaagtgTCCCGGCCCGGCGAGCTCTGGCGGAGAATCCAGTTCAAGTCTTTCTGC
-CCCACCTCGCAGCCCCCTAGTCTAGTCACATCTGGACTTGCCTTGAGAGGCCCAGACGGG
-CAACTGGTAGTCATTTTCCCAGCGTTTTATCGGCAGGGACCTGTAGACCCCTGGCTGGAT
-CACATATCCCCGCGCCCCACACTGTCCTCGGGATACCCCCTTTGGGCGTCTGTCTTTCCT
-TCTCCGCAGTCCGGGGTTGGACTCGGCTCATTTGGCGCCTTTCTGTCTACGGGGACAGAG
-GACCACTCTTTGGGGATCGGACGGGACTGACATTTCTGGGCTGGATGCAGGGGCAGCAGA
-TTCTCCAGCCCCCAGAGCCGCTGCTGGCCTCTTGGGAATCATCCCCAGTTTGGGGAAGGG
-AATAGAGCCAGTCCCTAAACCAAAGCCACTAGTCACCAGAGACTTTGGAATTGGGAGTGG
-GGCCGGAATCCCCCCAGGTGGAGCAGCTGACCTAGGCCAGACCCTGCTGTGTCTCCtggg
-gacaccccctgccccctaggttgctattgtcagtctccttttgtaggtggggaaacggag
-gttctaagaagttaagccccttttcgaagtcacagtcagacaatgcagtggttagctcct
-agtccctctggcttcAATCTTAGAATCCTTGACACACAGAATCATGCATTTTGAGAGTCT
-TCAATCTCTTCATAAGGGAGTTACATATCCTCTCTCCTCTGGAGCCTGCCCCTGGCTTTG
-GGGGACAGGATCTCCGAGGACTCAGAAAGAAAACAAGGCTTTCTTTTATTCTTTCAACAA
-ATATTATTTATTGACTTCATAAGCCCTGCTCTGGTTCTTGCATGTTTTGGTTTTTTTACT
-TATTAGCAAATGTATCATCTTCTCCCACTGTGATGcaaggcaggggctgaggcaattgag
-ccagtgcaaaatttagggatgcccaaaacctcagtaatcaagaCTGAAACTAACGTTCAT
-GGACCATTTGTGTGTTCTGCAGGCAGGAGGTTAACTCACACAGCCTTCATGAAGTGCAGT
-CCTCCCAtctctctctctctctctctctctctctctctctctctatatatatatatacac
-acacacatatatacacacacacatatatgtatatatatgtatgtgtgtatatatgtatat
-atgtgtatatatatgcatatttataAATCATGAAACCACTgccctgtccctgagttgctc
-tgtgacattgagtaagtttcttcagtctctgggcTGAGCTAAGAAGTCATGATGGTGCAC
-TCAGGCCTGGGCAGAGGGCAGTCTAGGATAGGAAGTGGGCTTGGCTGTGGATCTGCCTCC
-CCCTCCCCTTTCTAATCctgcgtgccaggcccttccccaagaccttgcatgtgttatctt
-ccattctgtcctcactgcaaaatccttcatccccattttgcaacctcaagtgcagaccta
-ggcctagaagatcaaCTTGGTATCAGTGGGCCTAGATGTCCACATCCACACCCATTCCAC
-AGCCTACTCCCTTCTCCCTTCCTAATGTTAGTGCAAGGCCACCCTGAGCAAGGCTGACTC
-CTGGGCAGGCCAGGGCACCAGCGTCTGGGAGGCCTCCAGAAATAGCTCAGGGCCTGGTGT
-GGCTCTGGAGGTGGCCCAGCTGGGTGTCCCTGACCTGGACAGCTGGGCTGAAATTGAGCT
-GGGGCTGCCCTGCTGGCTGGCCCCTTGCCACTGCCTGGAGCCTTCCCAATCTCCTCTGGG
-GCAGGCAAGGGCCTCCCCAAATCTAGGCCAGGCTTCTGCTGAAGGGAAAGAAAGAAGCAG
-GTGGGAGGAAGGGGGCGGGTTGGGTGTAGAATGTCATGAAAATTATAACCTTTGGAAACC
-ACACCTCCCACCCCCTCACCAAAGAATaaaaatcactaacacctcttgagcatttactat
-gttctaagtactttacaagtatgaactcatttaattccctcaactctgtgatataaggta
-attactgctgttcttatttccatcttgcagaggggaaactgagcacaagagaggtttaat
-aatttgcataagataacctagaggtggagtttgaacccagagagtctggctctaaatttt
-acatttttTGGGGGGGGGGGTGGGGTGGGGCAGTGAATGAATtaaaatgtatataaaata
-aaatttaccattgtaaccacttttaagtatacagttcagtggcattaagtacattcccca
-ttgcctctccccccagtgcctggcaatcaccattctactttctgtttgagtgaatttgac
-tactttgggtacctctaggtattataaatggaatcataacagtatttgtcttgttgtgtc
-tggcttatttcacttagcataatgcctttaagtttcacccatgttgttgtatgtgttaga
-attttcttttttatggcggaataatctattctaatattctatgtatatgccacattctgt
-ttatccattcattccttgatggacacttggattgcttttggctgttgtgactaatgctgc
-tttgagcatgaatgtacaaatatctgtttgagttcctgtttttaattgttttgggtatac
-actcagaagtggaattgctgggtgatcctatggcaattctgtttaattttttgaggaact
-actttactgtgtttcacagtgactgcaccattttatgtgtccatcagcagtgcacaaagt
-gctaatttctcaacatcttcaccaacacttgttattttctgtttgtattttttttttggt
-aatggccatcttcaggggtgtgatgtggtgtctcattgtggttttaatttacatttccct
-aatgactaatggtgttgagcatcttttcctgtgcctgttggccatttgttatctttggag
-aaatgtctgttcaagtGACTCTGCAttgttttttttttttttttttttttttgagacaag
-agtttcgctctgtcgcccaggctggagtgcagtggcgccatctcggctcactgcaacctc
-tgtgtcccgggttcaaatgattctcctgcttcagcctcctgagtagctgggattataggc
-ccccgccaccatgctgggctaatttttatatttttagtagagacggggtttcatcatctt
-ggccagtctggtcttgaactcctgaccttgtgaaccacctgcctcagcctccaaagtgct
-gggattacaggcttgagccactgcacccagtcATGACTCTGCATTCTTAACCATTACCTG
-TGCTTCTCTTAGATTTGTAACCTCTGAGAATAGTGGATCAGCTTTCTGGGCTGATGAAGC
-CCTCCCTCAGGAGCTGGGCACTGGATGATCTATTTGGTTGAATAGTTATCATAGCCTGCA
-CTTTGGTGACATTTGTCATGCATGGACCTCATGCAGAgagggaggcactgttgtgagtcc
-tgttttgcagttagggaaactgagatatggagaagttgagtattttatccaaggtctcat
-agctaatcattggtggagctaggatttgaatgggttctggagtccatgctATACCTTACA
-GATAtggccagggggatggagtagtgaagaccactgcaggcagcagaaccagtgtgtgca
-gaggTTTGTATATGGTGGCTTTGGAGAAAGAACAGGACTTGGGTAGAAGTGGTCAGAGCC
-CAGCTTGAATGGGGGTGACTTGAAGTTGGAGGAAGAGTAGGACAGGTCTGGAAAGGCCAG
-GAGCACGGTGAGGGTTTGGGGAGGAGGCTTGGTGCTTAGGGACCCTGTCCTTTTTTTTTT
-TTCtcttctcacaagatatttattaattacaaagggaaaataataactgtacagtggaga
-aatttggcagatactgccttaaccaaggaattggctgatcactaagattaagacaaactg
-ttgttatgagtgggtgtggtaatgtacctatagtcccagccactcaggaggctgaggtgg
-caggattgcttcagcccatctatttgaggctgcagtgagctatggagtgcactccaacct
-gggcaacacagtgagacctcatttctaaaaaaagaaaaaagaagccttctgataccatgt
-actaagaaggacacaacatcacttttgtgttattcttgacagatatgtttaacttTCTCT
-CctttctttcttcctctctttctttcttctctctttcttACTGATATAAGAAAAAGCTTT
-ATACATTTAATATATACCTCTTGATGAGTGGCCTTGGCCTTTGAGGTGGGCTGGGTCCAG
-AACAGCCGGTTGTTCAACGGTATTTCCTCGTGTTTGGTCCCTGAAGGAAGAAAATTGGAA
-GGGTGTGATggagctcatggtccagtgggagagacaggaaacgagttatatttcctatcc
-tagataagagtatctaaaatgacaggatgtaatgagtgctcggaagggaataaaatgggt
-gaaattgctgagggggtctcttggaggagatgacatttgaaatgagatctgaagggggtg
-agggaagaggttccagacagagaacagctggtgcaaaagccctgaggcaggaaagacctt
-atgttcaggaacagcagggagggctttgtggccagagcaggaaagaggttggagataaga
-tgggagatttggacaaggactgagtcctggaaggcctgagggccaagtggggagcttggA
-ttttttttttttttttttttgagacagagtcttgctctgttgtccaggctggagtgcagt
-ggctcaatctcagctcactgcaggGAGCTTGGATTTTATTGTAAGGGAGCCACAGGAGGG
-TTTAAACACAGCAGTAATGAGACTTTATTTCTGCTGGGAAAACATtgccgttattgcccc
-cattttacagcagaggaaaccgagactcagaaccatgaccagggagtgcttcctaaggtG
-GTTTCTCCCTCTGGGGTCCAGCCGACGAGGCAGTAGATTCCTTGGGACTTCCTTGGGGGG
-CACATCTGGTGAGTGGCCAAAGCCCAACACTGAAAACACCGTCTCTTCCACCTCCCCTCC
-CCAGATGTGAgcctgggttccaatcctggctctaccattaatcagctgtgtaattttggg
-cacgtggccttacctcttggagcctcagttttctcatctgaaaatgggcataataatagt
-agccctcacagggtaggtgtgaggattaaattagttaacattttgtagagcttagaacag
-tgtctggtacaaagaaagtgctcagatgagatttgttcttTTCTTTTTTGGCTGTAAGTT
-TATTCAATGTGAAATAATCCTCTCCAATTTTATTGAGGTGGCTGACCACGTCCACGACCA
-CATCTGCCTCTAAACTGGAATTCGGTTGCTGACCCAGCCCCAGCCTCGGCTTTCTTGTCA
-GCACCAGGGGGCACAGAACACCGTCTGTAGGTATCTCTGTCAGCTTCCCGTCTTGTGAGT
-CTTGCAGGTCGCTTACCCTCCAGACCTTTAGGCCGAGGCCTGCCAGTCTCTGGACGGCTG
-CGGTGTAGGGTGGCAGGAACAATCTCCGGGGGCAGATGTAGGGTGGCAGGAACAATCTCT
-GGGGGCAGATGAAGGTAATCACGGAGATACTGGCTACCCTCATTGGTAAGGTACCAGTAG
-AAATGTCTCCAGGCAAACTGTTCCTTCACGCAGCCCCGGGACTTGAGAGACTGCATGGCC
-TTCATGACGTGAAGGTTGGGCACATTCTTGTCTGCCAGCTCCGGGTGCTTAGGCATGTGG
-ACATCCTTCTTGGCCACCATGACTCCCTCCTTAAAAAGGAGTTCATGAATGGCAATCCGG
-TTCTTCTTAGGCATCAGCATCTTGGCAGCTGTAGGGTCCGGGGCTGGGGCTGGAAAGGAA
-GGACTGTTCTTTTCTTTGCTATTACGAAAATCATTATTGTTGCTTTGCTGTTACTACTAT
-TAGCGCCTGAAGGAGCCTTCCCTCCCCATCCCCCATTTCTGCCTCCGTGGAGGGCTAGGC
-AGGGCTCAGCAGGCCATTTGGAGGATGAAGGACTTGTTGCCCCGTCCCCTGTAAAGTCAG
-GGACTGGAGGAGGCTGCAGTGCTGAGGGGGAAGGAAAGCTGATGTGCATCACTGCCGGTC
-TCCTCATGCCCTGTACCCTAGTCCTGGCCCAGCTCCCACAGGCACAGACATGGAACAGGA
-GCCTCTTCAGCCTGAGTGTGGCAGAGGGCTGGGGCTGAGGCCTGGGGGACAGCTCCTTCT
-CTGGGCCTCAGGATTCCCATGAAAAAATGGCCTATCAAATGTTCCTACCTGCAGTGAGTT
-ATAGGACTTGGGGTGGAAGAGGTGACAGTCACCTCCCTCTGGGAATTCCTTCCTGCAGGG
-CTGCAGTCTCATGGGATTAAATGAGGGGGCTCTGGGGATTTAAATGAGTATGGTGCCTGG
-CACCCCAAAATTCTAGTTATTGTTGTTACTATGACGGCTGTTGTTGCCGATGTTAACCGT
-TTTCACAAGGCAGCTGAGGCATGCTCAGGCTCAGCCTGTTCCAGAGGGATGGACTCTACA
-CGTGACAGCATGGAGCACCAGGAGGGTCCCGCAGCCTGGTCAGGGACACACAGCTAGAAA
-GTGGTGGCGTTAAGCCTTGGTCTGGAGGGAAAGTGCGCAGGCTGGACTCCCCAGAgtgat
-tttgggctagtgactcagcctctctcagcctcagtttaccattagtcaaatggggtaaca
-atagaactcaccagatagtgattgttgggaagattaaaatgggttacccgataccaagaa
-aaacactttcccgtgcctggcacaGTGAACATCACCTGGCGGTCGTTCTGAGTGTCAGGG
-AGCGGGGCTCAGTTTGTCCATCTCTAAGGTGGGTGCGCTTGCCTGCCAGAGCCACGGGGA
-CCCCGCGCGCCAGGTGTGCGGTGGGCGGGTCTCGGCTCCCGGAAGAACTTCCCTGGGTGG
-TCCTGGAGCGGGTCGGACCCAGTTCCTGAGCCAGGCCAGCTGCCGGCGGCCGGGGCTCGG
-GTTCTGGCCCCTGCCTGGCTTTCCTTACCCTTTTCGGGTAGTACCTGGACCAGCGGGTTC
-ACTTGCCCGCGGCCGCCGGAAGTTGCGCAAACTCAGCTTGCCGGAGCCCCAGGTGGGCCG
-GGCCGGAGGAGCGCAGGCCAGCGGCGCGGGCGCAGCCGGGTACGTGCGGACCGCGGCGGG
-GGGCGCCCAGCCGGGGTAGGGGGCGGCCCGAGCACCCCTCCACCCCAGGACGGCGGGAAC
-GGGGCAGGGATCTACCTTTCGGCTTCAAGAGGACCGCGGGGATGGTGCCGCTCTCTCCCT
-CATTTGAGAGCCAGGAGGGGCGGCGAGGGGCAAGGGTCACACAGCGCCCTGCTAGCCGAC
-CCCCCATCCCCCGCCACCGGGAGTCCTCAAGCTTTTCCGGAATTGAGGGAGAGCAAAAGC
-CAGCCTGGGGATCTGAGTTCCCCCCAGCCCTGCCCCGCGGCCTCTGGAGGCTGACGCTGG
-GGAGCTAGTGGGGAGGGGGCCAGGTGGGGATGCGCGCCCCCGGGATGCAAGCCAGAAGGG
-CCGGCGGTTGGGGGCATCCGTGGGAGGCATTTGAATCCGTGGGTGGGGCATTGGGCGGTG
-AGAGGAGGCCTCAGAGGGGACATTGAGTCGCGCTTGGGGACTTGGGACCCTGGCTTCACC
-TGGCGGGAGCCGCTGCACCTCCGTTTGCCCACCCGTGACGTGGGGCTGTTGAGGTCAGCT
-CACCGATCAGCCTCTGTCTTGGGCCTGCTTTGTCCGCGGTGTGGGCTGGGACAGACCCTC
-GTGGGGCTTGCTTAGAGACCCCTGCGTGGGGGTGGTCTGTGGACTTGGTTAGTCGAAATC
-TTCTTGAAGACCAGGAGCCTGGTTCGTGGCTCCGCctttttgccagatgccgaggaaagc
-cctcgacctgtttgatctctccatccttatcgtgacctggaggctcaggaaggtctattt
-ttaacctcgtttcacggataaggtaaccgagtctgtaaagaggcgaagctgcttgcgcaa
-ggcgcacagcgggcgggtgggcgagccGAAggccggcgggcccgcggcgccAAACCCGGG
-GTTGGCTCTCGCATCTGTCCCGGCCCCGCCAGAGGGGACCTCAGGGCCAGCAGATGGGGC
-CAGAGGGGCTGGGGGCCCGATCGGGGTCGTGCACGGGGTTTCTGCCCCGGCCCCGCCCGT
-CTGACCTCCTTCTCCCTCTTTATCCGGATGGTGCCCGCAAGGGAACTGCCACTGCGGACG
-GGTTGGACTGGTTTGGGAGGTGGCGGCCTGGGGGTGGGGCAGAGTTTGGCTGGCTCTGCT
-GTGCTCCTTTCCTGTCAGGTCCTTCCCACCTGAGGTCTCCTGGGGGTCGGCCCTGGTGGA
-GCGAGGCTTCCTTTCCCATCCACTCCATCTCTCCTGCCTTGGGAGCAGCACCCAAGGATC
-TATTCCCAACTCATGGCTGCTGCAGAGGTCTCCAGCTGGTGGTTGGGGGCCAGATGGAGG
-AGGAGGGGACAGATATGTTCGCAGACATATTTTGTTTGCTGTATATGCAATGTTTTAATC
-ATTATTATCGAATATGCTGACAGTTAAGAATCTAGAGTTTTTATGTACTCCTGGATTTCC
-AGCTTCCTGGAACAATACACCTACCACCTTGGACCCATATGCCTGCAGCAGGCAGGGTAC
-CTAGATGTCTAGTTCATCCCTGATCACCCAGTTCACATCTGGCTCCCATAAATATttcag
-ttcaataaatttttattgaatattctgccctagtatgtgtctagggcagtatcttgaaac
-tggggtatagtgaacaaaatagccaacccccgcccctacacacacacgcctgccctcatg
-gagctgatattttagggggatagagacaacaaagagtaaaacaaccatacacaaatagag
-tacttgtgcaggggataaggagaaaaggaatagtgccgggagggggtcaggagtgccggg
-gagaaacaggacgtggtattGAGATCAGTGCCTTatttatctattctgggacctgggaaa
-gccacttctctgagtctcagtttctccatctgcacaacgACCCACAGGCTTGTGGGAGGT
-TATAGGGAGGATGGCACCCAGCAGAGATCCCTGCCTCCCCACCCCAATCCAGACTCACTC
-CCTTCTGGATTTTTGGATGTCTAGGTGGGgctgtccaatgtagcttcctaccatggatgg
-aaatgctgtactctgtgctgccaaacacagtggcaactggccacatgtggctattgagaa
-cttgaaatgccactagtgtagctcaggaactgaattttatgtttttatttcatttaaatt
-taaagttaaggttgaatagccacatgtggctgctggctattgagctggacagcacggGTC
-TAGATGGCTTGAACTGTAAGCCTTCTTGGGGAACACCCAGATTAAGTACCCGCCCCCTCC
-ATTTTACAGATGAGAATGTTTGGGACTTGGTATGTGGGTTTTCTTCTGTCCCATCTCCAA
-GGGGCCTTGTGGGGTGACTCTGTGGGCTTGGCCCTTCCTTGGAAACAGGGTCAGGGTTGG
-CTTGATGTCTGGGGCATCAGGTCCTGACACTTGGGTGACCACGTAGACACTTGTGCATCC
-AGGTGTATGCCCTCCTCCCAGGTGAGTACCCATTCCATGGCTGCAGGCAGATCGAGGGTC
-TGCCGGATGCCTCCATGCAGGGCTGTGTGATTTTGGACATTTCCAGCTTCTCTCAGCACA
-GCATAGCTCAGGGCTGATGTTTCCACGTGACAGGCATTTGTGGATCACCGTGGGCCATCC
-AGTTCCATGCAGGAAGCTGACGGATGTCTGGACTCCACTGGGGCGCGGGTGGAGATTTTC
-TTTGCTCCTTCCCTATAAGCTCTGCCCTTTGCCTGGGGCCTGGCATGTCTAGGCGGGTGG
-ATGGCACAGGGCAGCTTCCTGCCTGGATGGGTGAGGGGTAGAGGTGGTACCAGGCTCCCT
-GTGGGGAGTCCAGGTGGGGTGTGGGGCTGGAGCCCTTTTTCTTGGTCATTTAACCCTACG
-CCCCGGTGCCAGCACCTTCCTTTTTGGTGGTCAGGGGCAGAgccacctactcgctgggtt
-aacttaagcaagttgtttgcctctctgggcttcagtttctccatccaaaaaacggggctg
-ttgagaggacctGAGGTTGAGTTGACTGGTGCGTAGCACAGAGCCTGGAGCCTCCCTTGC
-TCCCTTTAGCGCGTGCCTTGCCCTGTCTTTTCTGCTCAGGTTGCCCAGGTCGCCCAGGTC
-TTTTTTCTCTAGCACCTTTTTTCCTCTCTTGGTCTCAGCTGGGCCTGGTTCTCCCGGGGC
-AGGAGGGAGGGGGTGTGGGTGGGGCCTGAGGCCCCGCAGCTGCTGCCTTGTGCCTGCTGA
-TTGGCTCCTTGTGGAGGGGCGTGGTCTCTACCTTATAATAGGGAGGGCGTCTTATCCTCT
-CAGCCGCGGCTGAGCCTCTTTGTCTGAGCGCGCTCGGCTTTTTTTTTTTTTTCTCTCTCC
-TTCCCTGCAGCAGTGGCCGGTGTCCAGCTGCCTACTTTCTGCCCGGATCTCTGGCTCCTC
-ATCTCTCCGGTCTCCGCAGACTAAAGCCCTCGGGATATGCAGCAGCCATGCCTGTGCACA
-CGCTGAGCCCCGGAGCCCCGTCCGCCCCCGCCCTACCTTGCCGCCTGCGGACCAGGGTCC
-CTGGCTACCTGCTACGGGGGCCGGCAGATGGTGGAGCCCGGAAACCGAGCGCTGTGGAGC
-GCCTGGAGGCCGACAAGGCCAAGTACGTCAAGAGCCTGCACGTGGCCAACACCCGCCAGG
-AGCCTGTGCAGCCCCTGCTGTCCAAACAGCCGCTCTTTAGCCCTGAGACTCGCCGCACAG
-TGCTCACGCCCAGCCGCCGAGCCCTGCCTGGCCCCTGCCGACGGCCCCAGCTGGACCTGG
-ACATCCTCAGCAGCCTCATCGACTTGTGTGACAGCCCCGTGTCCCCTGCCGAGGCCAGCC
-GCACTCCTGGACGGGCCGAGGGAGCCGGCCGTCCTCCCCCAGCCACCCCTCCGCGACCGC
-CGCCCAGTACCTCTGCGGTCCGCCGGGTGGACGTccgccccctgcccgcctcgcctgccc
-ggccctgcccatcacccggccctgccgccgcctccagcccagcccggccGCCGGGTTTGC
-AACGCTCCAAGTCGGACTTGAGCGAGCGCTTTTCTAGGGCAGCCGCTGATCTCGAGCGCT
-TTTTTAACTTCTGCGGCCTGGACCCGGAGGAGGCGAGAGGGTTGGGTGTGGCCCACCTGG
-CACGGGCCAGCTCGGATATCGTGTCCCTGGCAGGGCCCAGTGCTGGGCCGGGCAGCTCTG
-AAGGGGGCTGCTCCCGCCGCAGCTCGGTGACTGTTGAGGAGCGGGCCCGGGAGCGCGTTC
-CCTATGGCGTGTCGGTGGTGGAGCGCAATGCCCGCGTGATCAAGTGGTTGTATGGGCTAA
-GGCAGGCTCGGGAGAGCCCAGCAGCTGAAGGCTAGGCGCCACTGGGCCTGGAATTCGCCA
-CAGGACGGATCTTACAGAGGCAAGTGGTCCCTGGACCTCTCTTGCATCCATTCTCTAGAC
-GGCCGTGTCAGAGGCTCCACCCTGTTGTGAACTTGGTATGGAGGCAAAGGCTTAGAGGCT
-GGACCAGCATTGTTGGGCAAGGACTGACTCTCCAAGGGTTTTGTTCTTGGCTTTGGACAC
-CTGAGAACCCCCTCCTCCCCTCCCCCAATACAAGGTTTTTGACATGAGTGTACTCCTGCT
-TAGTTCCTCTTGTGGGGCTGCATTTGCGGTGCTTTGCCCTCCCCACTGTGAGTGAGGGGC
-CAAGGGATCTCCTCAATCCTGTCTCCCCAGCGGCTCTGTTTCCTCCTTCCTTCCTTGGCC
-TCTGTCCTTTGCTGACTTCCTCTTCCTTACCCAGCAGAACTCACCCTGGGGTCGGGGCAG
-TGGGGAGGGGCCTATCCACTGCTCTTCCTAGTCCTTGGCAGCTGGCCTAGGTGGGCAGAC
-TATAGGAGGGACTGGTTAGGAGTCTGCATTGCTTTGACTTCCCTCTCCTTGGTTAATAAA
-CACAAATGCTTGTTTCTCAAGGGCTGGGCCTTCAGACTCTTCTGTGTTCACAAGAGAAAG
-GGTGAGAGAAGTCTTGGGGTGGGGCCATCAAAACAGTAATTGTTCACCCCGAGGTCTAGT
-GGTGGGGCATGATGATAGCGGCTGGCCTGGCTGGAGACATGTCCCCGTGGTGGGTTCTCA
-TAACTCTCCTGGAAGGCTAGCAGGCCTGCCTCATCGAGGAGGAAACTGAGATCCAGCCAT
-GAGTGAGCTGGAATAGAGCTGGGAGTAGGAATGGGGTCTTTCCCCTGCACCAGAAAGGGA
-GCCTGCAGGGGAAAGGCCGATGGGGTGCATAGACTCTCCCCAACCAGGAGTGTTCCATCC
-AAGCCCTGCCCAGTTCCCAAGGGGGCAGGAAGCTCGGAGAGGGCAAATCCTGAACTTGAG
-GTCACACAGACCATAGAGTGAGGATGAGAAGTGGGAGTTTTGGAGGAAGAGAGACTTGGG
-GTGGACGGCACAAAATGAGTGGCctccctggcgatcttggacaagccagtttccctctgg
-gcctcagtGGGAGAGTTAGGCAGCACAGTCCTCCTTGGGTTGGGGCACTGGTGCATTCTG
-GGCCCTTCATGCTATATTCCAATACCTGGGGAGAGGGGAAGGAAGGGGCTGGCACTGGGC
-TTCGAGGCCTCAGCTTCTTCCAGTCTCCCTCCAGGTCAGTTACCTACTAGGACACCCCAC
-CTTGGCTAGTGGAGCAGCTAGGGCTAGAGCTGGGCCTACAAAGGGCGAAAGCGGGGGTGG
-CCTCTCTGGTGCCCCACGGTGGGCGTGGAGAGGGGGTGGGTGGCGCTTCCTTTCACAGGC
-TGCCTTGGCTGCAGCACTCAGAAACAGGAAGCTCTAATGGGGGCCCTGGTGACAGGTTTG
-ATGTAGGTTTTATTTTAAGCATAAAGAGGAGATTTCCGTTGGACTGTTGACAAACATCCA
-CATCAGCCCAGCTGTCCATCTCTCTGTCTGTCTGCCTGTCTACAACTAGCCCCCAGGGGC
-CTGGGATGGGCCTGGGCAGTTTGGGGAAGGAAGGGAAAATTGGGTTCTAGAAGAAGATGG
-TGTTCCAGCTCATGAGACTGGAGCTCATGATACTGGTGGGGAGACAAGCATGAGGAGGGT
-GGTGACCTACCCACAACCCCCCATGGTGCCCAGCAGTTTTGACAATGCAGGAGCTGGGCC
-TCCAGGGTCCCCATGCTGAAGGAGTGATGGTGTCAGGAGAGAGAATCCAGGCAGGATCTG
-CAGACGTGGTGCCCTTTGAGGTGTCAAAGACTAGATTTCCTAGGCAACCCTGCTAGAATT
-CAGGGCTAGTCATTGCCCCTTGCTGTGACCTGGCAGcctccgagtaacccaagaaggtgg
-atgggctggctgcattttacatgtgaagaaattgaggttcagGTCACAGGACTGGTGGGT
-GACACCTTGTTTCTGAAGGAGGGTACAGTGCttgaatcctcaaggtagccttttgaggac
-cagatatattgtcagagcaggaggttgagctcagggaaggatagcgacttgtatactgtc
-acatagcaggtctgcaggacagcctggggtcacactcttgcctgccagacACATCGCAGT
-CTGGATTCCTGGTTCTCCCAGCATGTACCCCACCACTCTTCCTCATCTTGGCAGCCTTTT
-CTTCTGGTCACTTTATTACTGAGCATCTActgggtgcccagcagtggataagacagacat
-ggcccctgtcctagtctggagaagagaatgggcaactaaacattcagcacataaataatc
-atagaatgtAAAGCAGGTATACTTAGGGACTTCTGCCCTAAAACCAGAGCTGTTCCCAGG
-AGCTGGACCAGGGGATAGCTGAAAAGAGAACGCCTTTCCATAAATCCACTGGGAGGGTCT
-GTTGGGGAGAGAGCAGGGAGGGATTCTTGGAAGTGGGGAAGGTGCCAGATTGAGTCTTCT
-CCAATGGTTATGGCTTGGTCTTGGGAGGGCTCCCCCTGTTCCAGGATTCTGGAGCCTCCC
-GCCTTCCCTGCAGGCCTCTGTGGAGGGAGCAGGGCGGGGGGCTTTTGCACTCCTCCCTCC
-CCCAACCCTGCAGCCTTGGGGATCTGTGGAAACAGCCCCTCTATTGTTCTGCCTCCAGTT
-GGAGTGTGAGCCCTCGGAGGGCCTGCAGCTGCTGCCCTGTCTCCTGGGGCTGCCCAGCCC
-TCCGAAGCAGCTCCCCCAGGCCAGCCTGGCCCCAGCTGCCTAGCCCCTAATTAGGCAGAG
-ATGGGATCTGCTCTCTGATCCATTTCCCACCAGCTAATTATATACACGTGGATTtgggaa
-ccaggcaacctggctgctcacttctatcatgaaggtggatgggccctgggaaaggcagcc
-ccccccccacagacctcagtttacccttttggcagaggatggagtGTAGCTGCAGAGGCC
-TGTTCCCTGTCCTTGGTTAAATAGTTCTGTTCCTGCTACTGAAACATTTAAGGAGACCCC
-CCACCCCCATCTTACCTGATATCCTGTGTACAGGGGACCAGGAAAGGGTTGAGGAATTTG
-GCTATAGGTCCTTGACTCTAGGACCCCAGGGTAGGGTCATAGGATATAGATGAGAGCATG
-GCTGCAGCTGGCTGCCAATTAGATGTGCATATAGGAGGGCTTACAGTTGTGCTGGTCCAT
-CTGGGTGGCCTGAACACCCggccgggtgcggtggctcacgtctgtaatcccagcactttg
-ggaggccaaggcaggcggatcacttgaaaccaggagtttgagaccagcctggacaacgtg
-gtgaaatcccgtctctactaaaaatacaaaaattagctaggcatagtggcggacacctat
-aatcccagctacttgggaggctgaggcatgagattcgcttgaaccctggaggtggaggtt
-gcagtgagccaatatcatagcactgccctccagcctgggtgacaaagaaagactccctct
-caaaaaaaaaaaaaaaGGAGTGAACACCCCATCCAGGTTTTTAAAAaggtaatattggtt
-gatgggtacagcaaaccaccgtggcacatacatatctatgtaacaaacctgcacattctg
-cacatgtatctcagaacttaaagtagaataaaaataaaataaaaGGTAATATTATTTTTC
-AGATAATTCACTCATATATTTCTTCCAACAttttattaagaaaaatttcaaacatagagt
-tgaaagaattagacagtgaacattcatatacccacctactaatgcacacttgttaatatt
-tcactatatttgctctatcaggaatctacccatctctccatccATTAATACAACTTATTT
-TTTTAATACAACTTATTTTTTAATAAAGCTTTTCAAATTAAGTTGCATATATCAGTACAC
-TTCCCTTAAAGTCACTTTAGTGTGCATGCCATTAGCTAGAATTCAATATTTGTTTGTCTT
-GTTCCTCTCTaggtaacatttacatggaatgaaatgcacagatcttaaaggtgccatttg
-ctgaatttagacaaatgcatactgtaccccaaacccctatcagggtatcaagcattatca
-cctcagaaagtttccttgcatcgctctcctgccgattgctgcctgcccaCCATGGACATA
-TTTTTATATCCATATATATCAGTACTAACaagcagcatcccttgtcctttcctctacatc
-agcctcgctccccaaaagcaaccacttacaacttcttaaactatttcttctggtactttc
-ctccatatttttaaataacttgcttttcctgctgttttcttgatcaattttaggcataca
-cacacacacacacacacacacacacacacacacacacaTATATAtttattttttttttga
-gacagaatcttgctctgttgccccggctggagtgcagtggtgtgatcttggctcactgta
-acccctgcctcccaggttcaagcgattctcctgcctcagccacctaagtagctgggacta
-caggtgtgtgccaccacgcctggctaatttttgtattttttgtagagatggggtttcacc
-atgttgaccaggctggtcttgaattcctgacctcaagtgatccacccaccttggcttccc
-acagtgctgggattacaggcgtgagccagtgtgtctgaccAATTTTAGGCACATATTGAC
-TGACTTTCTGGTCTGATGTTttcatagtgtggcctccactgcctggctgcctggctttgg
-atcccagcccttcctctttctggctgtatgaccttgggcagtaacttaacctccttgggc
-ctcagttttctcatttgtaaaatgagggtgataataatagtgctgaggttattggattgt
-tatacggattcaagatgtaaaaggctgagaataatgaacatcacccagtgagtagtcaaA
-CTTTTTCTTCTCATAATCATTATTATCAAGAAAGATTTAGCTTTTGGTTCCCCCCTTTCA
-ATTGGCATTtatcacaattttttgtgaagtggattttagtgttatttatattatgactat
-gtaaatactgtttcctttcaagccaagtcatatattttggttacatttcctttcttgtac
-aactctttgttcttcctggagttactactcgctttgctttttttcatttgctgtttcctc
-ttaacccatccttaattcTCTTAATTCTTTGACACCCTCAGTCTCCCCATAGTTAACATT
-ACACATCCTGAAACTCTTCAAGTGCTTTTAAAGAAGCATCCCCATCCATTTAAAAAAAAC
-TGGAGCCAATTTTTAAAATAGAATCTCAAATACAATCTGTAAaataaagatttgtgagca
-tccactatgtgccaggagctgtgctaggcagagtgggaaggtagccaaataggggatatc
-cctgcccatgtggGTTTCCAAGAGGGATGAAAACTGAAGCTCCACACCCCCAGCCTCTGC
-ATTTACCGGGGAACACCTCAGCACCTCTAGGAATCTCAGGACCTCAGGGAGCCCAGATTT
-ACTTATTTGTAAAATGAGGATCATTTTGTCATTCTGCAATCACTCCTTAACCATGTTGTC
-TGGGGCTGTGTTGTGGCTGCTGGGTATAGAGCAATGATCTCCCCATCCCTTGAGGGGCTC
-ACAAGAGCTGTGGGATAGAGCGGAGGCTGTGGATTGCAGCGGAGCAATGGGAGCTGGGGA
-GCGGGTTTCCCAGAGGAAGTACCATAGGACGAAGAGGGTCTTGGTGGGTAAGGGCAGtaa
-acggctgttatgttccaagggctgtgcgaagaacttccatgtattgtcccatcaaatcct
-cccaaagacccattgaaaggggtcatatttttatcacaatttcatagatggggaaactaa
-ggccaggagagtccaaggccagggtcacacagctaataagcggcagaggcagtatttgaa
-cctatgcagttgggttcttaaccacacactgcactgtCTCTCACATCCAGATGCCCAGCT
-CCTGTCCCCACCTCATCCTGTATCTGCCTCGTCCTCTCCTGTCTACCCACTGGTGCTAAC
-CTCTGGCTCATTCCATGCCCTTCGCTTTATTCatccattcattcaacacaaatctactgg
-gcgccttttccacgcccaaccctgggctgggcagtgccagggacatagAGCTTGGGCAGT
-ATTGACTCACCCATTCCCAGATAGGCATTGACATTGACATGCAAGCGGCCAGGAAAGTTG
-TCTAAATAAAGGGGTGTTTGGGGTTGAGTGATGGCtgtgtgtatgtgtgtgtgtgtgtgG
-CCTGCAAGGGGTGTGTGTCAGTGTGGCAGCAACAGACTTTCTGTGGAGGCCATTTATGAA
-GGCATATCTGTGTACCCTTGAGAGTGTGTTGTCTGCAGAGGGTGTGTCCACCAGGTATGt
-ggatcagtgaggctctgctgcataacaaaccactctaagcccagaagcctaaaaccactt
-attagcctgtgtgaagtggcagtctggcctgggcttagctgggcagttctggttttacct
-gggttcacttgccttgctgcagtcagctgagggtgggggctctgggagggcttcactcac
-atgcttagcagttggcaggctgtttgctggggtgcctccatttgctttgatgaggctggc
-ttgggctcatgcttatggtgacctcagggttccacattcagcaagagaagataagctcca
-acgcacagtgcattttgagcctctacttgtgtcaagattataaatgtcctaatagcccaa
-gtgacatgtcaagtcagattcaaaggatggagaaatagactctctctctCTCTCTCTCGG
-TTGTGTTTTTGTTCTTTGAAAACAAGCCCGGCTTGCctggctccatcgcccaggctggag
-tgcagtggcgcgatcttggctcggtgcaacctccgcttcctggttcaagcaattctcctg
-cctcagcctcctgagtagttgggactacaggtgcgtgtcaccacgcccagctaatttttg
-tatttttagtagagatggggtttcaccatattggccagactggtctcgatctcttgacct
-catgatctgcccgccttggcctcccagagtgctgggattataggcatgaggcaccgcgcc
-tggctTAGAATCCATCTCTTagtcacattacacagggcatgagtacagatatggaggaat
-tattgtagctgattttcaaacaacttaccTGTGTGTGCAGGTAAAGAActagggacagtt
-ctcagttttggaaataaaaaaaactctgggctgcagtcctggctcttccgtccttgctgt
-ctgaccttagtcaagttgtctcattctctgagcttccgtaaattggataaaattgaatga
-aacgagatgatctttaTAAAGTGCTTGTGCTACTCATTTGTTTACAAACGcagcacatat
-ttattgaggcctcctatataccaactactggtcccaccccgaggatattgcagtgaacaa
-aatggaccaaaacacctgctcttgtgaagctcacagcctaggttgtagacagatgttaat
-tgatcatcctaataattgtatgaccattgagagtagattccggaaggagagattgctgac
-ctggccaggttgatctgagaagccaaagatatttaagctgagatgtgaagggtaggtagg
-agacaacgaggagaagaaagataggagtggaaaatgattctagatggagggcatgtgcaa
-aggccctgtggtgggaggagtagattccaggaacacagagaaggtgggtggggctggGCC
-TGAAGCACCAGGGCCAGATGGTGTGGGGCTGCTGGAGCCTTTGAACAATGTGAGGGTCTG
-TCTTGCCAGGCAGcctaaaataaaaccgaaaggcctaactgctccacaaggccctcatga
-tcggggaccttgttactcctccagtctcccctttacctactctgctgcagccatgctgcc
-tccttcctgttccaggaacaccctggacacattcccacctcagggcctttgcacttgcca
-ttgcctttactagtatcgaccctacccagatattctgatgactcattctgtcacttcatt
-tccatctctgcctcttcaaaggggccttccctaccaacccaccacaacccccctgcccct
-ccagctaagcagtcagcatccagcagtctctacttccctggcctggtttatttctcttcc
-tagcacatatcacctcctggcttatattaaccagaggccacattgtctgtttctcttctg
-gatctctcaccagagtgcagctcagcaggcagggacttggccttgctctaggctgtgtcc
-tcagcctcaggggaagagtaggcattccataaacatttgtgaataaagaaatGAGTGAAA
-ATGAGTGAGTGAATGCTGGAAAGAACTAGCTCctggaaattaggaggtctgggttcaagt
-tctagctGGGCGATCCTTTCTGTTCCTTGGTTTCTCCAGTTGAGCTGTGAGGCATTTGTG
-GTCTCTAGGGAGGTTCTAGGACAGGAAAGGAGTACTCCAGGCTGTGGAGGGGGCCTATGT
-AGGAAGAAGGGAGCTGGGGCCTTCCCTTTGGCCTTCTGGCGTTTGAAAATAGCCTAGCTC
-AGCCCCTAGCTTGGGCCCCTACCCTCCCTGGGGTGCCAAGCTGGAGCCAGGGGGCTCTGT
-CTGGAGCCTGCCAGCCTGGTGCCGGGCTGGGATCAAGGCCACCTGACAGCTGGGCCAGGC
-AGTCCTGGAAGGTTCTTAAGGGCAAACAGGGCATGCTGGATGTCCCAGACCTCCCTCCCC
-ACCTATTGTCCCTCCTCCCTCAGTGTCCACCGGCAGGATAAATCCCTTCATCCTCTACAG
-GCCTGCAGCCCTTGCAGCTTGCAAATCTTTTTCTTGGTTTGTTTCTAATTTCACCCCTGC
-TCAGTAGctactttactggtgaggacactgaggctcagagatgacaactgcctcactgag
-gttacgttgcagttatgattcaggcccaagtctTGCCCAGCCCTGTCCTGTCACCGCGTG
-CACgtgtgtgtgtttgtgtttgtgtgtgtgtgtgtgtgtgtgtgtgGTCTCACTATCAAA
-CAGTGCCCTCCCTTAACCACCAGTGCCCCGGGTCTCTGATAAGATGtgatgactatgagc
-acctggagccaggtggcctgggttcaaatcccacctttgctacttctatactgtgtgGAT
-TGCTGGGCCACCCCCACCTCAGTGTCTGCTAATAGGACAAATCCCTTAATCCTGGGCACT
-GGGGCACTATCAGGACTAGCATTGTATACATTGCACAGGTTTTAAAAAATGTAATCTGTA
-ggctgggcacagtggcttacacctgtaatcccagcattttgggaggcccaggtgggtgga
-tcatgaggtcaggagctcaagaccagcctggccaacatggtgaaaccccgtcactactaa
-aaatccaaaaattcaccaggcatggtggcgggcacctgtagtcccagctactcgggaggc
-tgaggcaggagaatcgcttgagcccagaagctgaggttgcactgagccgagattgtgcca
-ctgctctccagcctgggcaatagagcaagactccgtctcaaaaaaaaGGTAATTTGTTGT
-CAATATTTACACATCTAAACCATTGGAAGAATAATGTATATATAAACTAGCTAATGAACA
-CCTACCAAGCCCCAAGCACCAACTGTATGTCCAGTACAGAGCCAGCTGCTCCAGGGGAGT
-TCGTTCCTGGGAGGGGGCATCATGATGAAGTGGGCGTGGTTCCCATTTCCTCCAGCGTAG
-TCTCAGAAGCGGGAAGCCATGTGACTGAGGTTACAGCCAGGGAGGGCAGAGGCCCCCGGC
-ACTCACCCCTCTGGGGTCCAAGCCCCGCTGGCATGTGTTGTGTCCCTGGGTAGGTGTGTC
-ACTCCCTGTCTGTGTCTCCAGTGTTCCTGTTGGCAAATCAGGGGTGGGACGGAGGTAAAT
-GGAGAGGCCCTGCCCAGTCTGCTGTAATCCAGGATCTCGGACTTAGTGGGGCCAAAGCTT
-CCAAGTTCTCCTGATTAGTGAGGCTGCAAAAAATGTTTGGCATGTTATTCTCTCACCGTT
-TAAATGTGGGCAAGTAACAACTTACATGTAAAATTACCCCCATATACCAAGCATTTaagt
-tatttattatatcattgcttacaatagcaaataattggaaattatttgagaaatggctaa
-agaaactcaggcccaggtacgcaagggaatcctaggcagccctcaaaagatgtcctgcaa
-acacctgatgtggaatcacaagatacacaacacaggtcagtgaacaaaacaagttgtggc
-atgatacccacagtgtgctgctgcttgtggaagcaggaaCACATGTCCATGTACTCTTGT
-ACTGGCACAGAACCCTGGAGAATTATCCTGGGAACCCTGCATGCTGGCTGCCCCTGGGGA
-GGGGAACCCGAGGGTTGGGCTCAAGGGTGGGAGGCAAGACTCACTACTTTGCACACCTTT
-TGAATTTTGAATCATGTGAATGTGTTATCTGTGCAGAAAAAATAAAAATACATTTAAAGT
-AAAGTGAAAGTAGACAAGAAACCTGAAACAGAGACGGACAAGCAAGCCTGCAGGCCCAGC
-CAGCTACCGCCCCCGGGCAACCTCATGCCACACTGTGGGCTCTGCCCAGCTTGGTTTTGT
-GGCTCCACCCTCTACGGTCATATTTGGGTTTCCACACACACAGCACCCAAAGGAAATCCC
-AGCTAACGCACATCAGGTTCTGGGCTGGGCCACCCGCCAAGGTGGTTGGTGGGCATGACA
-CCGCCCCGGGAATGGCGTCGTCCAAATGCCTGAGCAATGACACGGCCTCAGATGGAATGA
-TGCCACTGCCCACAGTCTCACAGGCCCTCCCATCTCGCCTTTGTTCTGCAGCCTCCAGGT
-GGGTGTATGGACACTCCAAAACAGCCATCCCTGTCAATGAATCAGCCTGCAGGGACTGAA
-TTCattccttcattcatcaatatccattgagcacctactgtgtgccaaacactcttctag
-gaactgaagatgcaacagaaaacaaaacagataaaaatccctgccctcgaggagctgaca
-ttccagaggggacacagacaatacttgccagagtgaaaatgctaaggagaaaaatgaagc
-agggaaggatgggGAACTAGAGATTTTTTTTCCtttttttattgaggttgaattgataaa
-caataaaattggcccattttaggtgtacagttggatgcattttgacagttgtatggcact
-acagacaagtgctagaattcctgtatcatcccaccatgttccttcacgccccccacagtc
-agcccctgactcccacccgctcccacccgaagaaactacagatcagttttctttcactgt
-agatcagctttgtctttcccagagttcatgcaaatggaatctggcttctctcagtcagca
-tcatggacttggttgagattcgcccgtgttgctgagtgtatctgtagcttgttccttttt
-actgacgagtagtattccacagtgtggatgcactgtattttgtttattcatccaacttgt
-tgacggacatacaggttgttcccatttcttggctattacaaataaagctactataaacat
-ttgtgaacaactctttgtgtggatgcatattttcatttctcttgggtaactaccacggag
-tggaattgctggacctcgtggtaagggtagctttaTTAGAAGCAGATCTCATGCttttaa
-acaggatggtcagataaggtgtcaccggctcggtgatatttcaggagaggccagaaggag
-gtaaggggtgtctgcagggaagagtgttctgggctgaggaaacagagtcagtatgtgcct
-ggagtgtttgaggaacagcatggaggccatcaaggagggagtgaaggacgtgaggggaga
-gggctaggaggtgtgctccatgtggaatgaggctagatggtatagggtcacatacatcat
-ggtgaggacattggtatttttttcttttgacatggagtctcgctctgtcacccaggctgg
-agtgcagtgacacaatctcggctcactgcaacctccgcctcctgcattaaagtaattccc
-cggcttagcctcccaagtagctgggactacaggcacgtgcccccacgcccattttatatt
-tttgtagagatggggttttgccatgttgtccaggctggtctcaaatgcctgacgtcaggt
-gatccgcccacctcagcctcctgaagtgttgggattacaggtgagagccactgcacctgg
-ctgaggacattggtttttcctctgagaacccgtgggaggaatctgagcagaggtgggaca
-ggatcagacttgcattttaacaccttcccccatctccagctaccaagtggagaatgggct
-gcagggctgcagggaggaggctactgtaatagtcctggcaggagatgaaggagttggact
-ggggtggaggcggtgggggctgaggggtgtgggattctggatctttctggatctaccccg
-aatgtggagccaacaggggatgtattggacgtgggatgtggggaaagtagggacatgaaa
-gaaggctAGGACCCAAggtgacctctaggaactgagagtggccctccagctcccagctgg
-caaggaaacatgcatctcagaccggcaaccacaagaagttgaactgtgctgacaaccaaa
-ggaacttagagtggaccctgagccgcacaaaggatcacagcctagctgacacggtgattt
-cagcctggtgagacctaagcagagaagccaatcatttcatgccaggacttctgacctgca
-gaaactgtaagaaaataaatgggtgctaagtcactaagtttgtgataatttgttatgtag
-caatagatgactgatacGGGCATACtagaatcctacagtgtgagagctaaaagagtgctt
-agcaaccactaagcccaccccccccatgtacatatggggaaactgaggctcagagagcac
-agaggacttgAGGCGTGGTTCCTGAAGGGAGGCGACATCAGGCAGAAACTGTCCCAGCTC
-TGGAGGTGTCGCGAGTCCCAGCCTCTCCTCTCTTAGGAGGCTGTAGTACCTGCCCCTCTG
-CCAACCCCTGCTCATCAGGACTCCCAGAGAGCCAGCTCCTGGCTACCCACTATCTACCCT
-CGGCTCCCCAAGCAGCGAGTTCAGGCAGGCTCCCCACTGGTGCAGGCCCTCACCCCCACA
-GCAGAGCATGGGCCAAGGGTGCACGAGCCAGGCCTGAATCTGAGACCCCAGGGAAGagag
-gaaaaatcacaaccttgggcctggctagaatcccaactctgccactcaccagctatgtga
-ccctggttgagggactcccctttgctgagctgcagtgtccacatgtataagatgggagta
-gggatgctttcctccaatggtcaatgagctaatgaaggtgaaactcttggcGGGAGCACT
-GTAAATGCATGTATCCAACCTcttcctctgcatgggcctcagcttccccatctgctaaag
-ggtcttgtgttcttgatgtgtttgggggggcccttgcagctctaactatatgaggattca
-aattccggctctgcttctcactagctgtgtgaccttgaatatgttactcaagctctctga
-gtcccagttttctcacccataaaacggggctattaataatacctcctattacaggagaga
-tgcaggtcagatacctagtagagtgactgAGAAAATGTTAGCTAGTTGTGTTATCATCAT
-GATCACCATTTCTAGTGTGTGAGTTTGGTTGTGCCTGCTGGAAGGGGCAACAGGGCCGAG
-CCTCCCAGGGTGAGAAAGTTTGGTTTTCTTAGAGACAGACGTTTGTAGGCTGAGCAAGGC
-ATGCGTGCATTTCTGGGAAAACAAAATTAGTTCATTTCCCTCCAAATCCCTGCCTGTGCA
-ACCACCTAAAGCCAGGCTCTGAGTATCACAGTGCTTATAAGTGGTAAACCCACAGGCAGG
-TTTGTGAAAATGAAAATATGCATTTATTTCTGTTCCCAGTTCTGAGAACTACTTCCTGTT
-TCCCTCTAGAGGAAGGCAATGGCTTGTGCACATGCCTGGAGGTGGGAATGTGTGTCATGG
-ACACAAACTGGGGTGGTTATCACTGTGATGTTCCCACTGGCCATGTCTGAATTGTGCACG
-CAATCCTCTGACCATAGCTGATTCACTGGTGTTAACAGACACCTGACGGCAGGCTGGGCA
-CTCAACAGTCTCTATTGGAAATTTGAAACTTGAATGGGGCACACAGACAGAGAGTGGCTG
-GAGATGCATCATTCCTGGCCAGCACCCTAGAGAGGAAAGCCACAGGCCCTGCCCCTGAGC
-TCCCCAGAGATGCCTTTTCCTGTTCTTCCCACAAGAGTACTCGTTTTGGGGGTTTGCTCT
-TCCCTCATCCTGGAAATGCCTTTCAATAAATCCACTGCTGGGCTCCTTGGTTAGTCAGTT
-TTTCGGTGTTTGCCACCCAGTTCACCTTGGCCAATGTGGTGACTAGGGAGACAGCACTGC
-TGGGGGTTAAGGGGAGACTGTGCAATGGAGCAGTGGCCCTCTgtggagtagttctgggca
-gaaagagcactggacccagagtctggttcttcatgatgtactgccatgtgaccttgggca
-aatcacttaacttctctgTCTGGGATGGAACCAGGGGGCACCTTAGTAAGcagatgggga
-cactaaggatcagagagaggaaaggctttacttaaagccacacaacaggtttaggacaga
-cccgggagagctgggccctgcaaatcccagcccTCAGAGGGAAAATTTCCTGGGTTAGGA
-AGCTTATTTCTAATTATCACCAGGACCTGTTTACCCCAGGTGAACAGGGTCCCCAGGCAC
-TTGGCAGATCACAGATTTCTTTCCCAACCAATTGTCACATTTGGCCTTGGCAACAGCATC
-AATGGCCCAGGAGGGGGCtgagtaaactgagcccagagagggacagagtcttgtgcaggg
-tcataccacaagttcatggcagaactagagtctgggccagatctAAAAAAGTGTTGCTTT
-TTGCTCTAAATTTAAGGAGGGTGAATTGGGGGTAGTGGCTAATGAGTTCTCCAGAGGAAT
-TTTTAAACTGTTTGCTTTCATTTTGATGATAATCCTAAACATGTAACTCAAGCATATCAT
-GAATCATCTGCAGAGCCACAGGTAAGTCCTGCCTGAGCTTGCGTTTGGACTTGGGATCAC
-ACTGGCAGCAaataatagcatttgttgagaactaactatggcccaggcactacgctttgc
-attttttatctattttttaaaattttatttaatcctcacaacaaccctataagataaatg
-ccatcagcatccccatttcacagatcaggcagtcaaggtgcagagaggttaaggttaagt
-aacttgaagcaatgttaacagcgagCCTGTGATCTTGCCCACTACACTTTACCATTGTAA
-TCGGAGGAGAAAATGGCAGAGGTGGCTTTGATATGTAAAGATGAATTCCTGCTAAGTGAA
-GGCCAGTGATGCAGAAGTACAGGGTGGGGAGAAATTTCACCATGGGTGAAATGGTGCCAA
-ATGGTGGGAGAACAAAGCCATCATCAGCATGCAGAGTTGGGTGGAAGTGCGTGACAAACC
-CAAACAAAATGGCATCGCAATTGAGTGTCCCACATTCACACTGCTGGTGGCAACTCTGGT
-TTAGCAAAGCAACATCAACCATATCATTAATTAATTAATATTGTTGCATTGATGATATGG
-cagcatagcttaatgcttagggatgcaggcttaaaactcataatttctgacttcaaatgt
-gttttcctcttggcctagtcctcagactatgggcaaatcactcaacctctctaagcctca
-gttttgttcatctttaaaatggaattgtaatagcacctGATagactgctgattgcctatg
-caattcccttcttttcctgttttttgttgaccaaaccctgattttattcccgatggtgat
-atatctagctaagtaagactttattcccagcctctcttacagctactggtggccagcgag
-tggaagttattcagtgagagacttctgaggactatccctagagggggccaatgcatctgg
-gaggaaagcccatatactcttctttctccttcttcctatatggaactcaggcattatggc
-agcagccccagcagccatctaggatcaagaagtgaccttcaggatgaagacacatgataa
-ggatgaagcaacatgaggctggaaggaacctgaaacattgatgataccatagagactgca
-gcagccctgggctgactcttccctgacttttttttttttttttttttttttttaagtcag
-ccttttattttaggacaattttagatgtaagaatcattgcaaagatagtacagagagtgc
-ctgcataccccacacccagtttctcctattattaacatcttataggccaggcgaggtggc
-ttacacctgtaatcccagcactttgggagtccaaggtaggaggatcacttaaggccaaga
-gtttgagaccagcctgggcaacagagcaaggccctcttcctacaaaaataaaaataaaaa
-attgagctgggtgtcatggcataccagtagtcctagttactcaggaggctgaggtggaag
-gattacttgagcccaggagtttggggcttcagtgagctatgatcacaccactgtactcca
-gtgtgggtgacagagcaagaccctgtctgtaaaaaaacccgaaaaccaaaaccagaaaat
-cttatattagggtatgatacatattaaaaccaaaaaatcttatattagggcatggtacat
-atgtcacaatgaatgagccatactgtcattattaactgaaaagcccatacttcattcaga
-tttcctcagtttctccctaataccccttttctgttccaggatcccatccaggctcccaca
-ttacatttagttgtgtctccttaggctccacctggttgtgacggtttcaaagactttcct
-tgtttttgatgaacctcatagttttgaggacaactggtcaggtattttgtaacatgttcc
-tcaatagggatttttctggtgattttcttgtgattagacaggggtgatgtgtttagggag
-gaagaccgcagaggtgaagtgtcaatgtcatcgcttcagatggggggacattctatcaat
-acgacttctcactgtggatgttgaccttgattgctggcacgtttctccactgcaaaatca
-ctgtttctgtcctccattcaacgccatactctttggaagaaagtcactccatgcagcccg
-tgcttaaggagtgggagttatgttccacctcctggagggtgacgcacttaAGCTACTTAA
-GCTAATAAGTATTTTTTATGTAGCAAAAGCTAACAGATAAACAAACCCTTTTGTTTCGTA
-GATCTATGTTATTTGGGTTTTCTATTACATGCAGTCAAACCCAATTTTAAATGGATGCAG
-AATTTATTTCTCAGGGAGGTTGTGATAATTGAATCAGAGAGGCAGGGACAGTACCTACAG
-CAGTGTTTGGGTGAATAAACAGTAACAATAATCATCGTTggccaggtgtggtggctcatg
-cctataatcccagccctttgggaggccaaagccagtggactacttgagcccaggagtttg
-agaccagcctgggcaacttggcaaaaccctgtctctacaaaaaatacaaaagttacctgg
-gcatggtggcacatgtctctagtcccagctacttgggaggctgaggtgggaggatctatt
-gagcctggaaggcagaggttacagtgagctatgattgcatcactgcactccagcctgggt
-gacagagtgagaatctgtctcaaaaaaaaaaaTCATGattattaataacttaattataaa
-taataataattattattagttttataGTGCATTAGTATTTGATTGATAATTTTGTTTCAG
-TCTTTTTAGTTGTTTGGGAACTATAAGCCTAAGGAGTTGATAGCTCACTTCATGAATGCA
-CACAAATAAGTAGTTTACCgtcaatgccctcctaagggcctaagatcaacaggaatgcac
-ctgtagttaaacaagtggttctattactcactgggacaagaaagtgcacagcatggggaa
-ccttggaatgtcttagtgagagtgttagaaaaggcttattataggattggtctcgtgtta
-ggtgacttgaatagggtttgaggatgtggggtttttcttcagattggatgctctcaggaa
-gtgagggtaattatgcagttgcgatcttaacaagtcttgtctatagagaaggcagactct
-ggcaaggctaatgctgtcattgggaaagaagcagcggtcacttgtattagctgggactga
-ggggtgtttggtcattttcgtggcttggaaatgtgcatgatttgtctttgttcagacatg
-attacagagtgttccacttttcgtcttgattcatcaatcactgaggacctcatctgatgt
-tggtgttctggggaatcattaacattggacaggacataagctgttctctgtgcatgttgg
-gctgacttgcagcaacacccagtcctagctgatgactatccaggatggcccctggatgtc
-agggctgctttcctctttctcaATTTCAGTCAACATTAGTGGGTCTGAGAGGATCCCTTC
-CTCCTTTTAAAGCTCTCCATATATTAAGTTGGAGCAACAAGCTCATTCCTGCTCAAACTG
-GGCAGGCATTTTTAGATTCTTTTCTGCTCCCAGAAGTTTTCCTTTCCCATTATTTGGTCT
-TGAGCTGGTCTCAGGAAGAAGTAATGAAGGTGAGAGATCTGCAGTGGGATCCTGGGAAAG
-GTGGCACATGTGGATCACTGAGGCCTGGGCTCGGATGGTGAGGATTTGAAGATTCCCAAA
-GGCCACACCTAAGGGTCACCAGAGGGTgtccagcccccattatccagatgggggaactga
-gacccaggagggaagGGCTCTGTGTTGGGTCCCAAGGTGTGCCATTCCAATTATCAACTG
-CCCTCCCTTACCTGACTGGCAGAGTCCCTTTCTTCCAGTTTGACGGAAAATACTGTTTGG
-CTCTTTTTTTGTGGGATGGAGTGTAGAAATTGGGGAAAAGAAGAAAATATAAAATCTTAC
-ATTAAGCATCCTAAGCCAATTCATGTGGTCGAAGAagcagaaaagcagcagaaaagcagc
-agaaTGCGATGCCAAACACATCCTCTGTAGGCACGTGTGTTATACCAGGTTGCTGCGAGG
-GCCCAGAGGACACATCTGTTGTAGCTGAATAAGTTCCAGTGTTGAACCTCAGCACACACA
-TGCGCATCTGGGCACCTGTGCACAGAGCTTGTATGCACAGAGCAGGAACACATGCATGCT
-ACAAAAGGATCAAGAGTCAAACTCCAAACTGGCTGCCCTTATTGATAACTTCCAGCTGAT
-GGAAGGTGGAAAGGCGAAGGTAGATGTGTTTTGGATATAAAAGGTctgtcttctctgttt
-actgtctatgtgaccttgagcaaattgattgacctctctaagactcagttttctgcaata
-taatatggTTCTCTTCTCTCAGAGTAAGGATGGAGTTCAGTGAGGAAACAGAAATGTAAG
-CATtgcatcattcggaatgctctgggctgcaagtaacagaacaccaactccactggctta
-aatgaaaaagaaattgatcatctAGAGACAGGACTCAGGACCTCAATGATGTCAGTAAAG
-CTCCAGGCCCCTTCTGACCCTCCACTCAACCACTCACTCTCCCACCTCCCTGTCAGATTG
-GTCCCAAATGTGGTTCTCCTGGTGGTCCACACTGGAGTAGCATCCATGCTGTGTAGTGTC
-TTCTCCATCAACAGAAGAGAGAATCTTTGTttttcttttctttcttctttcttttttttt
-tagacagagtcttgctctgtcttctaggctggagtgcagtggtgcgatctcagctcacta
-taacctctgcctcctgtattcaagcaattcttgtgcttcagtctcccaagtagctgggat
-tatgggtgcctgccaccactcctggctgatttttgtatttttagtagagacagggtttca
-tcgtgttgaccaggctggtctcaaactcctgacctcaggtgatccacccgcctcagcctc
-ccaaagtgctgagattacaggcatgagccaccacgcccagccAGCAGAAGAGGTAACTTT
-TCTGTATCCCTGAAACGCTAAGTCTTCCTCTTTAGTATGAGTGAACTAATTGAAGTCACA
-TGACCAGCCCTGGCAGTAGGAACCATGGCCAGGGGAATATCATGTGCTGACTGGCTGCAG
-TTTTGGTCCCTGAACACATCAGTGGCTGGGGGACCCCTTCAGACTAAAGGACCTAGCCCT
-GCAGCTGGGGACTGATATTAGGAAGGGAAAGGGAAAGGGCATGATTCATGTCCCTCACTG
-CTCAGGGTCTTGCTGTGTAGCATCTCTTCTGAGATGTGGGTCAGACAGGGTGTTGGCCAT
-CGCTAGAAAGGACCCCTCCTACAAGGACAAGACTTGAACAGGGATCCTGAAGACTTCTGG
-GGTTTCTATCTAGAGTCCAAATGGGTCTCTAGAGTCAGCCTGTTGACAGGCTGAGTTGAG
-TGGCAGCATCTCTAGTGGATCTGGCTCTCTGCCTGTGACCACTTGTGTGCATGAGCAAGT
-GCCTCACAGACCTGCATGTGTACATGGAAGATGTATTTTTACCTCCATGTTTGCGTCTGT
-AGCAACAAGTATGAAATGCACATACATGTTCATGCACATGTCAATGTACGTGGCTACCAC
-ACAGTAGGTATACTGTACAGTGTAACCATACAGTGTTTCAAATAtgcatatatgttcata
-tatgtgcatatatgCAATATCTGGATAGATGTATATGGCATAATGGCATATTTATATATT
-AATAAATCAATCATTTTAGAGTATTAACTATATATGAGTTATATTATGCCTAAGATATAT
-Taataaaaacaatgtttgtcaagtacttgctatatgccaggtactattctaagcacatat
-gttctaaattaATATATGTATTACTTTAAGGATACATAACCTAGTGTCTTTTTGGGGTCC
-ATGGATGAAGTGTATCTTCACTCACCTTTAATTAAATTCGGTTGTTTCATTCTTCATTTG
-TGAATGTAGGGCATTCACAAATTCACaaattcattctttcaattgtgaatgtagggcaca
-agccacagtagtgtcaggagtgcctggaactttgtcaccattagaaatcatagctatttt
-tgtatcttgttataatgattatagatatctcaaaatattaacagtcatcatttgttttga
-cctaccactgatcttgttatttaatgtattagcaaagaagcatatatagtacaatatcaa
-aactgtgttctttaaAAAAAAAAAAAGTATATATATATATAtgtatatgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgatgaagtcttgctatgttgcccaaggt
-ggccttgaccccctgggctcaagtgatcctctcacttcagcctcccaagtaactgggacC
-CAGCTTAAAATATTTTGATGACAGTATATATATAttttttgagacagagtctcgctctgt
-cacccaggctggagtgcagtggcacaatctcagttcactgcaagctctgcctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacagttgcccgccaccatg
-cctggctaacctttttttgtatttttactagagacggggtttcaccgtgttagccaggat
-ggtctcgatctcctgacctcgtgatccgcccgcctcggtctcctaaattgctgggattat
-aggcgtgagccaccgcgcccggccAatgactgtgtttttaatataatttgtttcattcat
-aatccaatgcatttaattttattttaagcatgtgaagacaccattctgaggaggggtcca
-tggcttcaccagatgccaaagacgcccatgccacagcaaagAAAaattcattgatcaatc
-cttcaatgaccccatgaagcagcagtgttaccagtttgctacagaggggaacctgaggca
-cagggaggttgtgcaacttgtttaaggtcacatagatatcgagtggTTGTGCATTATTAT
-ATCTGTCAGTTGTTTTTATAGCCTATGGGCTGATGTGGGCTTGTCCTTTGTGTCACATCA
-GAAAGCAAGTCTGGTCAATTATTTTCTTTCTCAAGGTTAAGTGAGATCAAGAAAAATAAT
-ACACATATATTGCATGGATTATTTGTGGTCATCATTTGCTAATCCTTATACCTGTGCCAT
-GTTGGATTAATTATTACAGCTTTGTGAGCTGCTTTATTAAGGAGGGGAAGTAGAGTGAAC
-AAATCATGGCAAGTCACTTCACCTCATCTTCTCATTTAAGGATGCTGATACTGGTGTTGC
-CAAGGCGACGCTGTCAGCTTTCGGAAGCATCTTTAAATGGGAGAGGCGAAGGCCCACACA
-GATCGAGGCGGAGGAAAACTCAGAAAAAAGGCTCAAATCCCTCGGCCGCAGAGACAAACC
-ATCCTGGTGGGGACCATCCCTCACCCCCCGCACATGGCCACTTTCTACCTCACCTGTGGT
-GGTTGTCTCTGGGGTGTACTCAGGGAACTCTCTCCCCAGTGTGGAAACTGCCTTTGCTGG
-GAACAACGCAGAGATCTCAGAAATGATGGATCCATCAAGTGCCAGTGGGAGAGACTGAGT
-GGTCTTGGAGGCCTTTCCAGGAAGTTCCTCCTGCCCTTGGTACACGAGTTTGGTGGTAGA
-TGCCCAGATGCCCAGAGTGCTCTGGGAGAGGAAGGCAGCTCACAAATGCAAATGCGCTGG
-AGGTGGTGCTtggctgtgctgccttggatgagaccctttccctctctgagccctaatttc
-ttttttctttttctttttcttttttttttttttttttgagacagagtctggttctatcgc
-ccaggctggagtgcagtgacaagatgtcggctcagtgcaacctccgcctcccggttcaag
-caattcttctgcctcaggctcctgaggagctggggctacaggcatgtgtcaccatgccca
-gctagtttttgtatctttagtagagatggggtttcaccatgttgcccagggtggtcttga
-acttctgagctcaggcaacccaccagccttggcctcccaaagtgctaggattacagacta
-ggagccactgtgcccggTGCCTAATTTCTTCATCACTGAAATGGGAAGAAAACTAACCTG
-GTGCAGGGAGAGGTGACAAGTGTTTTCCATAGGAACCCGCAGATGCAGGTATCCTAGAGG
-CTGGCACCTATGAGCTGTGGCCCCCAGGAGACCCAGTCTAGGCTCGAGACCACACCAGCC
-GTGCCCTCTACAGTGCCTTGTGCTGCCCAGGATCCTCAGGTTGGTCTTGTCTGCAGCCAT
-TGTGAGTCAGCCTCACTGTCAGAAGGGCTTTCAGAGGTTGCTAGGTGCTCTGTCCATGGG
-AAACTGAGGTTCAGAGAGGGCCAGGGGCTCTGATCCAATGGCAGAGCCAGACTGATAACA
-GGGTCTAATATTCCTGGGCAGGACACAGCTGTGCCCTTGATAGTCAGAGGCAATCTGGGA
-TGAACTGGATCCTGGGGTCAGGACCTGGGGACAGGGAGGCCGAGAGAGGGCACAGAGGTG
-GAGAGAAGAGAGATGAGAGCCAGGGACAGGGAACGAGGGAAGGCTGCCTAGCATCCCTGT
-TTCCTGAAGTCAtgacttgggtgtcactgaccccactgctggtgccaggcatgatcatga
-gaccgaggtctggtcaagcagagtaagagtgataagcatagggatggacacaagaccaat
-cctggctgcagaaaatcattcctttactggaatcatggagacgagggagctccccgggtc
-agggatgctgagctgggaggacatgagcctggggctgccagagccttcttgtgaggaaag
-atcctggctgagaatgaagtcaacggggcagatggaggggctgagaggtggagctgacat
-catttgagcctctggatctaacctcacttgcctttacccttagactttccagttatgtga
-gtcaatttattccttAGGGCTAGAATTTCTATCCCTTATACCTGAGTCCTGGCATGGAAG
-AGGAAGGAAGGTAAGAAAGAAGGATGAATATTTAAGAACAGGTGTCTGAggctgggtatg
-gtggctcatgcctgtaatcccagcactttgggaggctgaggcaggtggatcacatgaggc
-caggagtttgagaccagcctggccaacatggtgaaaacccgtttctactaaaaatacaaa
-agttttccgggcgtggtggtaggcgtctgtaatcccattactcaggaggctgaggtagga
-gaatcacttgaaccaggaggcagagattgcagtgatctgagatcatgccactgcactcca
-gcctgggtgacagagtgagactctgtctcaaaaaaataaaataaaaTTACATAAAGAACA
-GGTGTCTGAGGATAACTCAAATCAGCTTCCTGCCCCCTTATAAAATGGGAGTAGAGAGGG
-ACTTGGGCCTTCAACCCACCCAGAGGAGTTCTGTCCCTGGGCCTCACAGCTTTGCCCTGT
-CTCCTCTCTAGCTTGCAGTCAGCCTAGAAACTACAATAGAAAAATAAATGATGTGGATAC
-AAAAATAAAATGCCTTTTCCTCACCTGAGTGCAGGAGAAGGGGCGGCATGTGCTGGGGAA
-TGCCTTCCTCACCCCATTCTCCTCTTTGaggacaaacatttattaggcacctgcttcatg
-ccaggctctattaagaagatgacatacatggtctcatttcctccttgccatagcccagcc
-aggaaggaatattatcatctccattttacagatgggaaaactgaggctttgatgatgtga
-agataactggtgccttgagaggctgagccactggaccaaagtgtcagagctggagcaggt
-ttgtccgactccaaagccctgcccaccacaccacactgcACACAGTAGAGGCTAAATAAA
-GGTCTGCTGGGCAAATGCTGCTTAAGGCGATTTGAGCTCTCTGGGCAGCAATCTGCCCCT
-AAAGATTTCCCATCATGCCTGAAATGCCACCATTAGCAACCATGTCCTTTGAGTCTTGAA
-GGGGAAGAGTGCTAATTCCCAGGAATGAGATCAAAGTCAGTCTGTGCTGGGTTTACTCAG
-GGATCGGCTGAGAGTGGGACTCAGGGCTGGGGCGAGCCAGGGGGATGAAGGGGTCCCATT
-CCCATTGGCTCAGTCTCATCCAGGAGAAAACCTTCTGAGGACAGAGGTGTATCCTGGCGG
-TAGGGCAGGTGGGCTCCTGGCTATGCCTGGGTGTTGGCTGATGACAACAGGGCAGACAGC
-ATGACACAGTGATGGGGGCAGGTGACAGAGTAGCTGTGGATCCTTTCTGACTCCATCCTC
-TGAAAGAAGCTATGAGGGCCCTGGTCTCCCAAACTCAGGCAGAGGCCTTATCTCCTCCCC
-TGCAGCTCCCCACCTACCACCACAGAGGCAGCATCACTGCTGGATGGGGAAGGGAGGGAG
-GCTAGGGGTTAGGGCTTGGAGGCAGAGAGGATCTGGACTTGGAGACAGATGTCCTGCCTA
-ACAGTCCCTGTAATTGAGCCTGGGGGAGTTGAGGTTACAGGGAGTCCTAAGGGAAGCCAC
-CCAGGTAGAGATCAGCTTCCTGGGACTTGAAGGAGCCTTGGAGGACATGAGCCTATAACA
-CAGACAGGGACCTAGTTCTAGACCCTTCTTCAGGGATGGTATCTGTTTTAACTGAAAGGT
-TATTTCCAGTTGTTTTTAGAGGTTGTTTGAGGCTGTCACTGTGGCCCTTGTAGCCAAAAA
-GGGTGAGTATAGCTGGGGTGGGGATGGGGTCGTAGGGCTCCTCCTTATGCCAGGGGAGCA
-CTAGCTTTGTCCAAGAGCATCTACAGTCCTGTGAGATGCTCTGGGACAAACCGAGCCCAT
-TTTCAAATaagtaaatttggagaaagctgcccactctagccccttcatgggtagtcacaa
-ggcacttggccatattaaaggctctgatcagtcctgcagtgaagagtgcctgttcacttt
-gacttaacctgctgtttccTTTTCTCATTGCTCATAGGTACTTTTAGAGACAAGCCATAG
-TTATTCCCTGTGACACATCCTCTAGGACATGCTGGAGGTGAAGGAGCATGTCCTTTTGGG
-TCTCCTAAAGACCCTGAGCTCCAAACATTGGAGCCTAGAAGTGGTGAAGTGGTAAAGCCT
-AGAAGTGGTGAAGTCTAAAGACCCTGAGATCTAGGGTCATTAGAACCTAGAAGTGGTGAA
-GTGTGAAGGGGAAATAATGATTAACCCACCCACTAAGGGGTGGATGCAGCCCCTTCAGAC
-TTGAAAAGAAAGTTCAAGGACATCTCAAGACTAGAAAATCTTGGAACAGGAGCTTAGAAT
-GGGAGATGGCCTTCTTGCCAATCCAAGGGAGAGAACCTGGGCCATCTGGGCAGCTTCCGA
-TGTGCAAATACATTCCCACCTGCCTGCAACCCCACCATTGGTCATGGGAATCAAGTTTGG
-TCTGTTCTCAGCCCATTCAAGGTACTGTGACCCTCAGGCAGGGAGCCCCTGAAGGGGGAG
-GGAGAGAAGAGGGGCGAGGACTACATCAGAGGGATGGGCCCCGAACACCCTCCATGTCAC
-AGACGGAGGGGAGTTGGGGGGCAGATGACCCTTCTGGACTTCTGGGTCAAGGAGGGCTGG
-CTCAGGAAGCCCAGGGTGTCAGGGAAGGCGGTGGCACAGTGTCTTGCATCTGGGTCCAGG
-TTGTCCAGGAGTGCCAAGTCCGAGCTTCTCCTGTGTGGTCCAGCCTCTGGCACAGCTGCT
-CGTTAGATGTCCAAAGGCCGTATCATCATGCGAGAGGCACGCAGTGAGTAGCTGGGGCCC
-TTGAAGTAGTGCCAGCGGATGCCGTCCATCTTGTACTTGTTGTCGGGAGCGTGGTAGTAG
-ACGCCGTTGAGGTTTGACAGGCCACAGGCGTCAAACCACCACCCTGGTGGAAGAGGGAGG
-ACAGGCGCTTGGTGGAGGTGGGAGCCCAGCCAGTGGCAAGAGGGCAGCCCCTGTGTCCCA
-AAGAGAACAAAGACTAATCGGGGCTGTTGCCTCCTCTGGGAAGCCAGCTggctggggatg
-gggctgggtgggagtgggggtggggTGGACAACAGACCCTCTGCTCAGCCGGGGCCTCTA
-GAGGGCAGCAAGGGGCTCTGGCCACTCCTCGAGCCCCCTTGCTCCTCCCGGCCTTCTCCC
-TGAGCCCTTGGCGTCCCTGTCTTCCTCCCTCACTGAACCTGTCTTTCCAGCTCCCCAACC
-TCCCCTCATCGCTCTGCTCACTGCTTTCTAGTGgtctctgtcactctctctgagtctctc
-actctccaggttcatctctttctctcttatggtctctgtgcgtgggtctgtctctgtgtg
-tcccattgtgttcatctttctctgatggtctttgtccctctctgcctttcgtgtctctgg
-ccctCCCTTCCTCTGGGCCCCCATCTTTCACATGCTGTGTTTGTCTCCCGGCCTCTCCTT
-GGGCTAAGTCTTTCTCCCCCATCTCCCTCTGTACTTCTCTGCCCCAGTATAGCTCTCCAT
-CTGCTGCTCAATGACTCTGACAGCCTTGGtgtctctctctttctccatctgtcctctgtg
-tctcagaaggtctctccccctgtctctgttcttcttactttgtctctgtctcCCATTCAC
-CCCACTTCCTGTTCTCTGACCTCTGTGCCTACCAAGGAACACTGCCTGAGCCACAGCTGG
-TGTGGAGCTGCCCCTCTGCCTCCCTCTGGTCTCCTGATCCTGGTTCGGCTTGCCTGGGGT
-TGGGACTGATAGGGTATAGGGTGCCTCCCCCCCGGGGCCCTGCACTCAGTGTTTCTTTAG
-CCTTGTCTCTGAGGAAAACTGGTGGTGCCAGCTTTAGGAGGAGGTGAGACCTGGAGGGGA
-CTTCAAGGACTCAATGGGGGAAGGCACCGAAGGGGCACAGCCAGGTGAGCTTATGGGTGG
-GCAAGGCCCAGACCTGCACCCATCCTCCTGACAGCACCTGGGCGCACAAGAACCTGGGGA
-GGGAATGGGAGTGTCAATCTGGGTGAGCCTGTGGGTGGGCGGAGCTTCACCCCACCCTGC
-ACCTACCTCCAGACATCACTTGGGCACACTTGCAGAGACAGTGGTCGTTGTCTGAGTCAA
-GGGTGCTAAAGCTGGTGTTCTGCAGGACCAGGCTGCTCTGGCGCCCTGCTGAGCCGCTGT
-ACCCGACCACAGAAAGCCTGGAGGCCACCCAGAGGTGGTGGTGGCAGAAGGGCCCAGAGT
-CAGGTTGGGGCTGTGTCGAGCAAGAACTTCCCCAGTGGCTTTGTCCCAGGCTGGGCTTCC
-CCTCCAGGTGTTCTTGGAGGGACAGCCCCAGCCTGGGTGGAGTGCTTGGGCTGTTTCCCT
-TCCTGGATTGCCTTCCCTGCCTGCTGCCTCCCAGGGACAAAGCACTTACTGTATGCCAGG
-CCTCCCCTATCTCACTGAACCTGAGTCTTGGAGAGAAGTGATAATGGTCACAATAATGAT
-AATAATGGCTAATACATATACAtttttttctttagagacagcaacttgctctgttgccag
-gctggagtgcagtggcacaatcacggctcattacaaccttgacctcttgggctcaagcaa
-tcctcccacctcagtctcctgagtaaatgggacaataggcacgggccaccatgcccagct
-aatgtttgtattttttgtaaaatacaaacatagggtctcactatgttgcccaggctggtc
-ttgaacacctgagctcaagcagtctgcctgccttggcctcccaaagcactgggattacag
-atgtgagccaccgtgcccggcAACGTTTCTTTTTCTTTCTTTTTTTTCTATTCTTTGCAT
-CTACTATGtgttcaaagtgctttgcataggttaactcattctcctttaatcctcacaaca
-ccctatttccattttacacatgcgaaaacagaaatcccaagagccaaagaaacctgctca
-agtctcagaatgaatgagggtcagagccacatgccagcctagtgtggcctgacttgggag
-tctacgtgcatttTGTTCCCCAGCTGATGATGATCTGGCAACCCCAGCCCCATCGCACCT
-CCTCACATTCACCCACCTCTTCCAAGAAGCCTTCCCTGACTACACCAGCCCCCATGGATC
-TGGGCTCCAGGGCACCCCAGCTCTGCAGCTTCGACATCTGCTGCCAGCCAGGTGAGGATT
-TCTATTTCTTTGCCAGGCTCTGTGGCCTTGGTGGGCATGTCCAAGCCTgcctggtgatga
-agaccatgagatctgggggcagaaagcctggattcaaattccagctctaccacttagagc
-tgcatggccttggaggattggctcaccccactgagcctcagtttcttcatctgttccagt
-ggtaatgatagtgaaattagcagtgctgccctcgtttattattgatttggtgatgtcagt
-gtgtgaagtgtgcagagcagtgtcacggggtgagtgctcaacattcagtgcttgttatta
-ttTGGCCCTTGGCAGATGGCTGGGCCTGGTTGGAGAGAATGCGGGGTGTTTGTATGGCAG
-GGTTGGGGGAGGCTGCACTGGCAGCTGAAGTAGGGAGCCAATTTGGGAGCAATTAAGAAG
-GTCCTGCTGAggctgggtagggtggctcacgcctgtaatccccgcactttgggaggctga
-ggcaggctgattgcttgagcccaggagttcgagatcagcctgggcaacatagggaaaccc
-tgtttctataaaaaatacaaaaattagctgggcatggtggtgcatgcctgtaattccagc
-tacttgggaggctgaggtgggaaggtcactggtcactggagcctgggaggtctgggaggt
-cagggctgcagtgagctgtgatcatgccactgcactccagcctgggcaacagagtaagcc
-ctgtctcaaaaaaaaaaaaaaaaaaaaagaaGGTCTTGCTGGGTGGAGGCAAGTGGGTGG
-CAGATGTGGCCAGGGCAGCTCAAGGAAGCTCTTGTACCCTCAGGGCAGGGCCTGAGAAAT
-TCCCCAGTGGGAATTCAGAGGGAATACAGAGCCTGGGTATATGGTTGGCTCAGTCCCCAC
-ACCTCCAGTCATAGATTGTGTCTGTCGCCAGGGAAATGAGACTTAATTATTCTCTGTGTA
-GAAAAGACTTGGGAGGCTCCCTCAGCTTCCTTTTAGGCACTTACTATGTCTGGGGATGGG
-AACAGCCGTGCTCCCAGAAAGCAGTCCAGTCAAGGGTGTGAAAGGCTGCCACGAGACAGT
-GATCGTAAtattgtttgctgagcgtttactacatgccaggcactgtgttaatgcttcatg
-tgcagtatctcattcaggcctcatcacaccctttttgaggtaggtatgcctaaagcaccc
-attctacagatgaaaccgtgaagggacttgctcagggtcactcagggaagtagggatgga
-gtcgggatttaagccTTTGCTTTAGTGGCCAGTGGCTTAAATGGGACTCAGCATAGTGTT
-GTAGCTACTCACTGGTCAGGTGTGAGGAGTAGGGGGACATCCAGGGAATTTTTCATTCAG
-CTCTGGACCTTGCATTATCAGGTTGGTATGGATCCCATAAGGAGGGATGTCAGaacctgg
-gcaacatagggaaaccctgtttctataaaaaatacaaaaatcagctgggcatggtagtgc
-atgcctgtaatcccagctacttgggaggctgaggtgggaaggtcactggagcctgggagg
-tctgggaggtcaaggctacagtgagctgtgatcatgccactgcactccagcctgggcaac
-agagtgagaccctgcctcaaaaaaGCCTTTGCTTTGGTGGCCAGTGGCTTAAATGGGACT
-CAGCTGGAGGAAACAGTGGGGGCATATCACTGAGAAGTTCCCAGAAGTGGAATCAGGCAT
-AAAGTTCAGGAGGACAGAGAGTCATTCAGAGATTccttgtggggaagcgaccttcccacc
-agtggaggtattccagcacggctggatgatgattgcaactatggagggaatctatgaaga
-accagatgacacgtgagattttttgcagccctgtgagtgtgaatcCTGGTTCAGAGATAG
-CCAGGACCCAGGCTTATCTAAAAGATCCTTAAATTTCTCTgagaggcaatatcatgttgt
-ggagacatcatgagttttgacagcagggagatctgagttcaaattccagctcatttaact
-tgtaactttgggcaggatacttaaacttggcatctcagtttccatattactaaagtaggt
-acagtaatgcctacttcaaagtgttgtggggaagattaaatggaataatggtgcctggaa
-cacagtaggtgctcaataaatgctagttcCTTTTCCCAAATATACCAAGAACCAGGCTGA
-GGAAGGGGTGAGAAACCTTGATgatcttacaagatcgtcatgtttaagctcatcctgcta
-ttgaagaagcagaagctcagagaagccagactgacttgtccaagttcccaaagcaagctg
-gagcaaggccacaatgagtgcaggaatttcaacttctggcccagggacccttccacccag
-ccCCAGGGCATAGGACAGGCTGGGCAAGTCACCTCCTTTTGCTTCTGGGTCTCTGTAAAA
-AGGCTGACTTGGGGTGACTGACCTTGGAAGACCCCTTCTTGCTCCTCGGATGGCAGCACC
-AATGACATTCTTTCCACTCCACCCAGTGGCTAGGACATGCTGAGTGCTAACCAGCCACCT
-CCAGATCCCATGACGTGCACCCAAATGGGGGACAGATGGTAGGAACAGGAGACACCCAGA
-GACTGACCGTTGGAGCAGACTCTGTAGACACTAGCCTGGGGACCCCAGCCCGCCCACTAG
-CTGAAGACCCCAGCCCCCACAACGGCCTGGGCCCCGAACCCACCTGTATAGCTGGTTCTC
-ACTGCCCAGGTGGAAATGTTCGTACTGGGCATAGGCCTCGTGGCCTTCCCAGTCTTGCAG
-CTCCACACGCAGAGAGTAGGCTGCCCTTCTGGTGAGCTGGTGCACCACTTCATTGCCCAG
-CCAGTGCTCCCCAGCTGGGTCTCCGAAGCCCTATAGGGAGGGGAGCGTGGGGTGAGACTC
-ATGCTGAGGAGGAGGCCATGTCCCTGGCTGAGGAGCTGGGCTGGGCCAGGCTCCAGGGCT
-ACTTATACAAAACCACTGTGCTTAATGATCGAGTTCATAAGTACAGTGTAGGCAGGACTG
-GGAGTAGGAGCCCTCCACCTGCTAGAGGGAAAAGACTAAGGCTTTTGTAAGTGTAAAAGC
-CTGTTAAAAGTTATTGAAATCAcattcctctgaagttcaagaacaggaaaaagtaatatt
-tggtgactacctttggtggagtattgactgggagggggcacaaagtgggcttctggggtg
-ctgggagtgttgtacatctagcactgaatggtggtcacgtggttaaatacatatctaaag
-gctcactgagccttacactttatttgtgcgcttagacacatgtacgttaaacctcaacaa
-aaaTTAAATAAAATATTTCAATCAGCTACATAAATAGTAGAGCAAACTTTGTTCAGTGAC
-AGCGCAGCCACTGCAAGATTTCAGCAACACAGAAATGTAAAACTGAGAGTGTGGGGAATG
-TCATGTCCCAATGCCCTTGGACAGAACAAGAATTCAGCACCAAGGACAGGGGCACACCCA
-AGGCCCGCTCCCCAATTTAGTCACGATGCAATGCGGGTTAGCCTGATGGTTAATATTCAG
-GGTTCTTTTGTGTATTTCTGCACCTGGACACCCTATTCCTCCTTGCCATTTTAATGGTTG
-TTTAAAGCCCAATTAGTTCAAAACACTCATAACTTAATTTGGTATTTATTTTTAAGTATT
-CCTTAAATGAACAGCAAGCAGACGCAAATAATAGAACTGCTGTATCACTTTGTGGGTATC
-TTTTTCTATTTCTTTGGCTTTGAAAACTTTAAGAGCTTTTAAGTATTTTAAGTCAGCTTG
-GCAAAAAATCCTTTATTCAAAACCTAATTAAAAAATTGGAAAACAATCGGGCTTCTCATC
-TGATAAAATACATGTGATCTTTGGGCCTGCAATTCCTCGTTAATGAATCTCTCCTGCAGA
-TATGATCATAGACGTATGAAAAGACAAGAAACTTCATTAAAGCAACGCAGTCAGGGTTGA
-CTGGGGGGATTTTTATTCTGTCTCCTCCTTTGTATTCtttaaaaaattagaaatgtatat
-gtatttttttaaaaaaaattaaaacaaaaataaaGCTAAACTTTTTTTCTTAGAACATAT
-GTCAGAACTTTCAGAAAGAACATTCAAATTCAGGTGATGGGGTCCCATAAAGCAGATGTG
-CACTGTCAGCTTTAGATGAGTTGATTTTTTCTGGGGGAGGAATGAGGGCAAAGCAGTCCC
-CTTCCAACAGCCCAGCCCCAGCCCCAGGTTTCAGAGCAGAATGGCCCCTCCCCAAGGCAG
-CAGGGCTACCTGTTTGTAATCCTTCCAGTTCCGCTGAAAATTCACGGTGCCATTCTCACG
-GCGCTGGATGAGGGTCCACCTGCCTCCACTGCTCTGCAGGTCACAGAACACCTGGAGGGG
-GTGGGCAAGGCACAGCTGGGAGCCCTTGGAGGTAGCCAGAGGCCAGGCCTGTGCTAGCCC
-AAATGTGGCTAAGCAGACAGACCCCCACAGAGCAACAGGTgagcctgggggtcctgggca
-tcagaaagatccaggcttaaattccccacccattgtcatcatttttctaaagtggtgggt
-aaggaatgacctctcagagccttcctctcatttgtaaaatggagattcataccttaacct
-ctttgtgcctcagtctctcatctaccaactggggttgtgaaaattaaacgagatgagtca
-cgtaaagtgtttagaacagtgcctggcagtactaggtaaacggaagctcGACCTCTTTTT
-GTTGAAAGGAGAGGTTAGCAGGTGTGTGAGAAGTGTAAAAGACAACCTGGAGACAAACAG
-AGGCATTCTCCTTAGTATATTAAGAGGGGGTGAAAGGAAATAGAGCAATGgtaatactag
-caatttgagggccgaggagggaggatcgcttgagctcaggagtttcagaccagcctggga
-aacacagggagactttgtccctacaaaatgtttaaaaatattagccaggccatggtggca
-tgtgtctgtggtcccagctacttgggaggctgaggcaggaggatcactcgagcccaggag
-gtcaaggctgcagtgagctgtgatcatgccattgcactccagcctgggcaccagagcaag
-accctgtctcaaaaaaaaaaaGGGAATTATGAAGTAGGAATCTGCTAGTTGTTTCCcttc
-taggcctggctctcagaccctccctcctgacatccgtgctcttctctgtcacccttctta
-tcggatgacttgaccttaaattttaggacaaccttgggagccactgattgaaaatggtgg
-cacctctattagccctggtttctaatttcccacatggagcagaaccccaactcctgcctt
-caactggactatatgtaaactagaaagaaacgtctttgggctaaggccctggaattttgg
-gggttgtttgtaatatcagctatcatcatcttaaccaacacTGAACTATTTTGTGCTGTT
-CCAGTTAAAGCACCTCTGAAGTGATGCTGGTTAAGGATGCACTTCCAACTTTGGGAACTT
-CTGCTTATCCCCACAATCTGATCCCTGACTGCTGGGAAGTCAAAGCCACCCCTACACCTC
-TGGTATTTCAGATACTGGACAAAGCCTGATCCCGATGGGGTGCGGGGTGTCTGTTTGGGA
-AGCCCTTGGCTCAGCACCCTCTAACAGCCACAGTTCCCAGGGAGCCCCCTAACCTTCCTG
-GGCTTCGTTGCATTGGACACCTGGATGGTGTAGACACCACTGGCACTGGCCCCAGAGCGC
-TGGATCTCTGCACAGTCCTGGAACACCTGCTCACCTGCCATTATGAAGGCTGCAAAGGGA
-CAACACAAAAGTCAGTTGGAGGTGGGCAAGGAAAGAGAGAAGGGGCCAAGTGGGCATGCC
-TGCCTGCTTTGTGCCAGGTTCTGGGTTGGGAGGTGCTGGGGACAGGGAGATGAGTCAGAC
-CTgggaagatttcgtagaggaggtgacagtaagctggaacctgtgtaatgagcaggagtt
-gcccagtggagaaggggaaggtgttccaggcggaagaaacagcatatgcaaaggccccaa
-ggtaggaagggccctagtgtgtgcagaggacagGGCATGGGGAGGGGAACTAAGGCTGAG
-GCCAAGGAGAGGAAATGACTCACACCGTGAGAGAGGAGTTGAGACCAGGGAGGCTGCTTG
-CTGTATGATGCAACTGAGAGGGTAGAACAAGGCTGGCACAGAGAAGGTGGGGAAGGAAAA
-GGAGAGACGAAGCTGAGATTTCAGCAGGGCCAAGTCAGCCGTGAGTGCCAGGCTGCGGAG
-CCCAGATTCTCTGGGCTGagaaagagcactctgtccagagtgtggaggggggcctggagg
-ggatgagactcaaagctgggaggccagagaggaggctgctagagttttctgggagagagt
-tactggggcctgaacTCCAGTGAGGCActtcccatttcacagaccaggaaactgaggccc
-aagagtgaggcaactggcccaagggcacacagccaggtaaggcagaacCTTCCTTCTTTG
-GAGCTCCCTTGGGTGGGAAGCTGTGGGCTCCCCTTCATAGCCCACCCTTTTGGCTGTATC
-TCCCTGCTGCCCTGGGCATATGCTCCCTTATTCTGTCCTCCCTTGAAGCTGACTGCTGGC
-CTTAAAGGGCCCCTGTTTCTTCCCTCTGGACTACATGAGATCGGGATAGTATTAATGACT
-AAAACCTACCAGGGGTTTCTAGGCCTGGCCTGGAAAAAGTGACTGTTGACAAACAAAGTG
-CAGAGATTTAAAATCTCCTCTGTCTCAATTAGTGGAATCCAGTTAGAGGTTTGAACTATG
-ATTCTACCAGAATCCAATCTCTCTGGGTAGCCAGGTACCCAGGATGGGGCTAAAATTCCA
-GATGGATAGGTTGTCAACACCAGTGAGGAACCAGGAGGCTACCACAGGGTGGGACTTCCT
-GGTTTGGCTTTACATCTGAACTTCAGGGATCCCAGATCCTGGATCTGGGGCACTTGTCCA
-GAGAAGGCTATTGCTCTCATGTCACAAATGAGATGACTAAGACCCCCAAATCAATTCCAG
-TTCACTCACAAGCATTTCCTGGGCAGTGGAGACCCCTGCCCCACCTGTTGGCACCCCCTC
-AGCTCCCCACAGGGAATTGGAGTCCAGCCAAGCATGAGGAGGCTGTTGGCCTCAAGGTGA
-GCAGGGATGGGCTGAACCTCACCCAGTAAGGCAAGGACAGAGCCAGGGTTGGCCTGAGAT
-TTCCAGCCACCCTTTCCAAGGCTCTGCTCACTGTTATTTTCCTTAGTCTacaacaatatc
-aataacaataacaacaataatatcaacaCAAAAAGTGAAATACTCACCATGTATTGTAGT
-GTTTCCAAGGTGTCATGTAATGCCAGGGGTAGTTTGGGGCCAGGAAAAATATTTTTGGGA
-GGCATAAGAATAGGATGGACTGATATTGATATGCAACAGTTTGATCTGGTCCTCCTCTGA
-ATATCTGGGCTGGTAATTTGTACCAGTTTCCCTCGCTTTtgtgcataggcactgtgctga
-acccttttgtatgcatgaactcatccgattctctgtgcaagaactctatgagattattat
-tcccgttttacaagtaagaaaaattgaggctctgagaagttaaataaatgacttgtatga
-agttccagtgctaattaataagtgaaggagccagggcttgaactccggcccatctgactg
-caaagccagtgcccttcctcctacacATCTTCCTTTGGATTTCCACCACTGAGCATATGT
-AAGGTTGGGCAAACAGCCTGCATGAACAATCGCTGCTTTTATATCATGCACAAGTTTGGT
-CTTTTCTGCCTGTGCCCATGTCCTTGTAACCTTCTGAACCAAACTCCCCAGTGCCTGGGA
-ACATCAGAAGACTTGACTCTCTTCTCCTTTCACTAGCCTCCACCTGACTGGGACAAAGCC
-ATGCAGAGAGCTAGTGCTCCCTTCCTGCTAGACTTCAAGGATGCCTGGTTCCTGTGCCCC
-ATCTCCATCCAGCCCTCTCTTCTACACCTGGTGACTGAGCCTCTCCTTCAGTTTCTCCAT
-CCAGAAGGGGGTGAAAGCAACTGCCTAGTGTCCTTCCCTGGTGATAGTGGAGCACGGGGG
-ACAGGGTGTTTGGGCAAAAGGTGCCCAAGGTGAGGTGCCCAACACAACCTCCTACTCAGA
-CGATTGAGCAGACATTCAGCCTCATCTGGGGACTGGGTTACCAGTGGGTTAGTGGGAGGC
-ATTGGGCCCAGGCCCTGTGCCTTGGGCTGAGCTACAAGAAACCCACACATGGGATGAATT
-CAGGCAGCTCAAGGCCAGGTCTGTGCATACGCCAGTAATAGGTTCAGGTTAATCCACATG
-TCGCGATTTGGAAGGTGTCTACTTTTCCTACCTGTAGCTTCCTTAGGCCTCAAACCCCTA
-CTCAGCTGGGTCTGCCAGACTGAGATGGAGCCAGGGTGGAATCTTCTGCCCTCAAATCCC
-TGTCAGCCCTGGTGGTGCCGGGAGCGCCATCACTATTGGGTCTTAAAGGCTTTCCAGCCT
-TCCACTATGGATCCAGGAGCAGCAGTAGCCCCTTTGGTCTTTCTCTCTCATCAGGACATC
-TCCACTCATGGTTCCAGTCAGAGCTTCTTGAAAGTAGTCCCACTCTGTTCAAAAGCCTCC
-CATGCCCCCTGCTAGCCTCAGGCTAAGAGCCCTTCTCCTTCGCACAGCCTTTGGACCTGT
-CTATTTTTATGGTCTGGAAACTTCAGGAACACTGATAGCTGAGCATCTGGCACATATTAT
-GCACTCAAAAACCATGTATTTCTTTCTCCTTCCCTTTGGGACCCGTAAACCAGGGactgg
-acatttttgcaagagacaggagctgtgactgtgcattcactgctgtatccccagcaccca
-gcactgggcctgccacacagtaagtgcttagtaaatgtttgttgactgagtgaTTGCAGC
-TGGGGCCAAGAATGCCTTGGACACCCCAAGTAGGCCGTGTTAGAAGGAGTCAGTGAGAGC
-CTGGGAGCCCAGCCCAGAATTGTTTTCTTGACCCAGAAGCCAGGGCCAGGGATGCCTCTT
-CACTTCTGTTTGGCCCTCTTGGGCTTAGGGGCAGGGGCATTAAGATGAgagaggtccttg
-gggtgcattgagtctaacctcccagttcctcccattctacagccaggaaaactgaggccc
-agggaggggtaggacaagcccaagAAAGTGGGGCTGGAGAATGAATCCTGGAGACCAAAC
-TTGTCAGTCTGGATTGCTGTTGCCCTCATCCTCGCCTCCAAAACCCatgggtaaactgag
-gccaagagaggggcaggggcatgcccaaggtcacccatggaatcaggggacagggcctgg
-attgggaTTGTTGTTGACGCCATTATTACTGTTTATTGTTGTTTCTATTTCACAGATGGT
-CGGGGAGGGTGGGGCCCGCAATGGCTCCCAGGCGCCCAGAGACCCTGGAGGGTGAGCAGG
-GTCTCCCCTCCCCTCTCCTGCCCGTCTTTAGCCACACTGGGGCGCACACCGCTCACTCAC
-CCGGGGCCGAGGCGTTAGCCCTTTCTTGCACCAGGTGCCGCAACAACACCAGCAGCTGGC
-GCAGGCTGTGCTGCTGGTCCTGCAGGAGGCTGGAGTTGTGCCTGACACCGCGCAGGCCGC
-GCTCGATGTTGGTGAGGGCGGCGCTCTGGCGGCTCAGCGTGTTCAGCAGCTTCGCCTTCT
-TGCTGAGGATGCTGGCCAGCTCCTCCTGCTGCTTGGTCTCCAGGGCCTGCAACCGCTTCT
-CGAGCGCGCTGCGGGGTAGGGGGCGCACAGAGGTGAGCCTGGCATCCTCGCGAAGCACGC
-ACCCCCGCGCGCCTCCCCGGCCCTGGAGTCCCTGCAGCCCGACGATGAGACTCAAGTGTG
-GTGGAACGTCCTGTGCCCACTGTAGGCACAGATTGAGGAGGGGAGAAAAGAGATACCCGG
-CCCTGGAGTAATATAGATTGAGGTTTAGTGGAAGAAAGAGGTGGTGTGGGAGGGACACCA
-GCAACTGGGTAGCTATTATCAAATCCCAACTGTGCTTGCTTTTTGACCCAGCAGTCTACT
-CTCAGGAGTTATCCTCTAGGGAGCATGGTCAAGAATGGCCCTGGGGACTTGCTTGTAATA
-GAAAAACAAACTAACCAACCAACCAAAAAAGATATAGCCTAGATGCCCAAAAGCCAGGAC
-TGGCTGAATCCGTTGCGTTTTGGCGTCCCTGGAAATGTTCCGCAGTCATGAAGGAGGAGG
-CATTTGCACAGAATTGGAAAGATGCCCAGGACTTGGGGCACATCAAGCCTAACCCCATGT
-GTGGCAAGAGAAGAAAGAAAGTATTAATGTAAATAAAGAGAAATGGGGTGAACATATAGG
-AGAAGGCTGGAAAGACCGCAGTGGTGCCTGTGTTTGGGAAGAATATGAAAGAAATTCCCT
-CAAGTGCTGTGACTTCTGCAGAGCAGGTTTGAGTGGATGAAGATGGAGAGGAGGAAGATG
-GGGGCAGGATGGAGGGCCCAACTTTCACTTTTATTTTGTACAGGTTCCTGTTGTCCGATG
-ATATTATAATAATCAAGAGACATTTTTTGTAATGGATTTAGAAGCAAAGAGGAGTTTTTC
-AAAAGAAAGCCTTAGACTCAGCTCTTTCTTTTTGGACATTTTATCCTCCagatttactca
-catgtgtgtgaaatgagatatggaaatgttactcatcgtatcactggttggattagtaaa
-aggctggaagcaacctcaatatccattaactggggactggaggaataaaagcagggacca
-catatggtggagcattataaaggtggagaaaaaaatgagcaagcatgtcATGCAGTTATA
-GAATCTTTCCAAGGTAACTGAATAATAATTTGTAGAAACAAGGTATAAACAAGTAGTAGG
-CTACATTTGGGCTTAAAAAGGATAAAAATGGGAATGTAcagatgctccaaaatgtatgat
-ggggctatgtcctaataaagccatcgtaagttgaaaatgtcctaagtcaaaaactcattt
-aatacacctaacctgctgaacatcctagcttagcctagaccatcttaaacatgcttagaa
-cacttacattagcctgtgattgggcacgatcatctagcacaaaacctattttataacaaa
-atgttgagtagcttatgtaaggtattgatattgtactgaaagagaaaaaccgaatggttg
-tatgggtactcaaagtacggtttctactgcatgtgtatcactttcataccactgttaagt
-cacaaaattgtaagcccaaccattgtaagttagcaatcttctgTATGTATGTGTTTGCAT
-ATTCATAAGAAACCCTGGAATGTCAGCTTAtaggatgtcagcttcacgaggacaggggct
-tttgtctctttgttcacttctgtatccacagtgtctacaatagtgcctgacacatgaaaa
-gagtttgaaaaataattgttggttgaatgaatGGAAGGATACACAAGAAACTAGGAACAG
-TGGCTACCTCTGGCTTGGGTGGGTGGCTGAGAGACAGGGCTGGGAGGGAGACATTTTACT
-GTATATCCACTTGTGCCAACTCATTCTGCAGACTAAGAAATTGAGTCCAGCTAGGGCAGA
-AGAAATTTCCTCTGGACTCCCAATTATGCTGCAGGAAAAGAGAGAATTGGGGCACACTGA
-AATTCTAGAATTCCTGCCCTGTCTTCATGGGCCAAGAGTTTACCGATGACATCCTCCATC
-CTCACTGATTTCTAGACACCTAGTGTTAATTTAGAGTCATTGAAAGTGTCCCAGTCCTTG
-CCACTGAGACCTTGGGTTGGGAGAATAAGAAGATGGGCAGATTGTCATTAATTGCACCCA
-GATTAGAGAGAGCTGGGGGATCTTATGGCCTTATCCTGAACCGGCATGTGAACAACAACA
-TCTTGCCTGATTCACAGGCCTGTGGCTTGTTCAGTGGGTAGATTTTGCCTTCTCCAGAAC
-CCTGACTTTGGCAGCTTTTTTTCTTCACTCAGCTTGAAACTGAGGTGAAATCAGCCTTAG
-CTGCCAGATTTTTCTGCTTTATCTAAACCTCATGACCGCttttttttttttttttttgta
-atttaaaGGGTGTTCCCCTGATGCCCATTTGCTTATAAATGCAAAGACTCTCTGATAGTG
-TGGACAAGAACCTGGTAACTGTGGTTGTTTCTGGGAAAGGAATCGTAGATAGCACCAGAT
-TTATTTATTTGCAAAGAAGTAAAGCCAATAAAGTTTACCggatgaatagtatggtgggtg
-aattagatctcaataaagctgttaaaaTTTACGAGATAAATAaaagaaggaggaaggaag
-gaaggaaggaaggaaagggaaagaaagaaTCAGGGTGTCCTGGGCCCCAGGAAGATGCCT
-ATCCCCTGTCCCACCCAGTGCAGGGGCCAGGCAATGTGTTTGCCTGGCTCCTAGcccagc
-cccgtatccactctcatttccagcctcagtctagactccaaccctggtttcagtccttcc
-ccagcaggggctattcccagctctagtttcagccctaactccCAGGATACCTccttgccc
-caatcctaatccaagctcctaggtctggctgcaggccctatcccagacaccagcccacgt
-ccagcttccggtcctggctccagccccagtcctagccctggctctggtgcctgccctagg
-tcctaaacttgactccagccccagcccctgtcctagtcTGGTGCCAGGTGCCACACCCAC
-CTGTTTTGGCCCTGAAGCTGCTGGAGCTTCTGCCTCTGTAGCAGCAGCTGGTTCTCCAGC
-TTGTTGGTGGACAGAAAGGTCTCTGGCATCTGGGCATCCATTCTTGATGTCTGGTTCAGG
-AGCTGCCCCAGCAAGCAGAAGCAGGTAGGGGGCTGCGTAAGCGCTACAGGAGCCCTGCCC
-AACCACCCACCTGCCCACAGGCCCTGCCACTCCAGAAACTTACCCATTTCCACTCTCCCA
-GTCGTAGTTCCTGTGGTTACTCACTCACAGGCCCTGACTTAAGCTTATTacctgcttcct
-aaatttgcctttctccatcactgcaatggcagctccattctccctgatgcttaggcccca
-ggagctgtcaaccctgtcccccacatccaactcatctgcaggtcctgtcagccttgcctt
-ccaggtggcccctgaccacctctctcctgctctgtggccctcactctggccctggactgc
-tccctcattgcttgcaatctattctctactcagtagcctggggctgcctcttaaaacatg
-tttgctctgttcaaaagcttcctgtggctcccatctcatgtagcggaaatgccccagttc
-tcaccatggcctgcaaggccctatggtgtgatctgtccctatcacttctccagctccttg
-cctgccactctcctcctggtcactccagcatagtggtctcctgatgttcttgaacctgcc
-agcacgtccatcctccctccgggcctttgcacatgctgcatcccttgtctggagcactct
-ctgcagtaagcctggctgcagccctaccttctccatggcccttcctggccttgctgtatg
-agcttgcagctctcatccccccccaccactcccaatgcaccccctctcttgctctctctt
-ccatgctattttctccttagcgctgtcactggctaacatatgcagacatgtgttgcttaa
-tgacggaaagatgttgtaagaaagtcgtcatcatgcaatttcgtcattgtgcaaacatca
-tagtgtgtacttacacaaatctagatggtatagccgcctgcatacctaggctatatgaga
-cagcctattgctcctaagctacaaatccatacagcatgtgactgcacccaatactgtagg
-cagttataacacagtgggaagtatttgtgtatgcatatctaaacacagaaaaggtacaat
-aaaaacagcatacgatactcttatgggactgctgttgtctatgtggcaagttgttgactg
-gaacattaagcagtgcataaccatatatgtcacttatcttttcattttcaggggaagctt
-cacaggagtaggaatgtatgcctgctttgtttcctgctgtatactagacaccagtcttct
-caagcagtgcctggcacaCGGGGGATCAAACAAACAAATGGGCACAAACTTGTGTCTATT
-TGTTATTCACTTTTTCATCCACTGACTTCCCTACCCTTCATTTATTCACTAGTTCCTTCC
-CTGCTCTTTGCTGCTCAGATACCTCTTCTCTCCAAGTCCTTGGCCCCAGAGGCCCAGTGA
-Attgtttcttatccatcttcccctggcacattgtaagtcctctgagggcaagggagctgt
-gctactatacccctcattccagtgcccagcacagacccaggcactgaagttacagaggca
-gaaaagccaagcccagcatccaccccccagggctcatagcttggagagagatagttttat
-gacaagttcatcagggaggagggacccggggggctacaggcccagaggaggccttgaccc
-tactcagggtcagagatcaaggtaagatgactggggCTACGAACCAGCCTGGCCAGCCAC
-AGGCCCTCAGTGCCCACTCAGTCACCCTCTGTTACCTGAGCCTCCATGTCGGTCAGCTTG
-CGGATCTGGGCAGTGGTCTGGTTCAGGAGGCTGGTGCCCAGCTCTAGCATGGGGGCCGTC
-TGATTCTGGGCCATTTGCTGCTGGACCTGCTCCAGCTTCGACCTCAAGATCGTCTTGATG
-GCCCTCTCTAGCTGTGGGAGACCATGGGCTGGGGTCACGGGGGAGGGGCGGGGGAAGCCC
-CCTGTCCCTCCCACGTGTCACCATGGGAGGGCACTGAGCAGCCACTTGAGGCCTCCCTGG
-CTCAGAACATGCCGGGccaggtcaggccaccattacgtcttgcctggactatcccagtag
-atttttccctgggagggatttatatgcctgttttgtctgcctctctgcttccatctttgt
-cccctgcacagtccatcccccactaggcagccagagggatcctgctaaacctaagtcaag
-tcacactcctcctttgctcaaaatctttccagggttcctatctcacgcagaggaaaagcc
-atgactgcaggttcctccgtgactgggcctgccaccacactctcattcctctcctattcc
-cctctccctcactcacttcaatcccgatgcaatggctccatgacatccctctaacgaagc
-aagcatgtgcccacagctgttccctcactgttccctctggaatcctcccccAACCCTGAT
-CCGCATCTGCGTGGCACAcctcctcatgctgtttcagctttcttcataccacttatcacc
-acctgactttttaaaatcactatctctctttttatctgtctgttgtctgtttctctctct
-agaatgtcaattccatgaagccagggacttggttttgctcactgccttgtttctatgttt
-agcacaatgcatggtgcacagtgagtgctcataaatgcgcgttcaatgaattgatGAAAA
-AGGGGAAACAGCAAGGGTCAGAGCACAGCGCCCAATCACATGCCCCTTCACCAGCTTCCT
-CAGGGTGAGTCAGCCAGCAGGGAGTGGGAATGCATCTCTCCCTTGTACAAAGAGTTTGCA
-GGTCCAttggccaagctgtgttttctatcttcagatcccctctatctgccaaatggggct
-ggactggccagtctccaagggttctcccagctctgatgttctgggatcccaCATGCAAAT
-GTTCATTTCTTTGACAGGGCTGCTCTCTTTCCCAAGGGCAGGAGAGCTGGTCTGGCATGA
-CACCAGTATGCTGTTGTAAAGGTGAACAGTGTGTTCTCAGGGCTCGGTGCCTGCAGGCAG
-AGAGCCAGCTCCCCTCCACCATTGCCTCTCCATTCGGCACACATGCTGGCCTCTCACCAT
-GCCCCCCACCCCTGTCCCTGGCTCCTTCCCTTGCCCTCTCACTCAGTCTTTCAGAAGCCA
-GCTGGACAGCTCTCAGGGTCCTTGGGAAGATGGGTGCTCCCCAGGAGAGGTGGTGACCTT
-GGCTCGGGCCAGGCTCCAGCCACTTCCTCCTTCATCTCTTCTCCCTTCTTCCATCTTGAC
-TGTTCACTCCCATCCCTTCCTCACCCTGGAGTGTTTCAAAGGGAGCAAGTTCCATTATCA
-CATCCTGGAGCGGGTGCTTGTGGGCGGTAGTAGTACTGGTTAGAGCTgtgtttctccaag
-tgtggttcttccgtcagcatcagctgagctcattaaaaatgtgaatttccaggtcccacc
-gcagacctcctgaaccagaaactcttaatggtgcccagccaactgtggttaacaacaccc
-ctggctgagtcagatgcctgctcaagtgtgagagcccttgATGCAGAGTAGCAGCAGGGA
-CTGAAGACCAGAGAGACCCCCCTCCTTCTTTCCCTGCATCATCAGCCCACCCCCTCCCTG
-CAGCACACAAACATGCGCTAACAGCTTCCATCTAAAAACTAACTCCACAGCCTCTCTGGC
-TGCTTCTCCAGTTTCTCTGATCTCATCAACACAAAACTTCTACAAGTTGTCTCCATTTTC
-TCACCTTCATACCCACCCTCACTTAAAAAACAACAACAACAACATAACGTTAATAATAAA
-ATGATGTTACGTTTCACACATACAAAAAAGCATAGAggccaggtgcggtggctcacacct
-ataatcccagtactttggaaggctaaggagagtggatcatttgagcccaggagtttgaga
-ccagcctgggcaacatggtgaaactccatctctactaaaaatacaaaaattagccagcca
-tggtggcataagcctgtggtcttagctacccaggagactgaggcaggaggatcgctggag
-cctgggaggtggaggttgcggtgagctgagatgcaccactgcactccagcctgggtaaca
-gagtgagaccgtgtctcaaaaaaaaaaaaaaaGTATAGAGAATAAATATAGCCCATAGTG
-CTCATCCTCCTGTATACCTCCAGTCATGTCTCTCCATCCTGGGAGGTCCCTTTGCCTTTT
-GGCgtctcactgttgcccaggctggagtgcagtgatgtgatcacggctcactgcagcctg
-aaactactggcttcaaacaatcctcccacctcccaaatagctgggacgacaggcgagcac
-caccacgcgcagttCCCCCCTTCGCTCTTTAATTCACCTTGTCATAGATAGCCCTCCTTG
-ACACTGCCCTCAAGGGACActccatcttgcttgacatctcaggagcaatcacctggatgg
-ccactccctgttgctggacgacttccccccaatcctggtttcctcctagcccctaaccac
-ccactctctgactcctcctttacagactcctacacggcagggcccccatggcccagtcct
-gggtccttgtctctatgtacattcactctctaggtcaggggtccttaatgaagaagccac
-aggctccatgaacttgagtgagaaaaaaagatcacattttttgtccactaatctgcaatt
-aaaatttggcatttccttcaattatgagcctaggtcacaaaccacagccatactagcagg
-tcctgagagtcattaccaatagaaatcccaaatattttcatatcacaacacactcttacg
-gtatcttaaaacattgtttttactcaccgggactttggaattatagacatcacacccacc
-actggataatgctatgcctgatcacagattttatttttcatattttgcttatgatttcca
-tattactgagtgttcttatgctttgattttatgcatttctgagaaaggattattaagctt
-caccaggaccagatgccaagaggTCTGAGGATCCAAATGCATCAGGGCCCTGCCCCAGGG
-GCTGAGATCGGTCTTTGGACTTCCACATCCctctgtgctaatggagccatcaccatctcc
-cacccagacttctcccctgcatgtccccaactcgccatctctgcatggtttccaatgagc
-atctcaagcccagtgtgaaactcttcattcctcagctcccatcgcccctgtccctgtaac
-tcccaccccatgcttcgaaatctttcccatctcaggaaatggctccacccagttctgaag
-ccccaaacccagacctcaatcttaacttctctttttcttagcggccacactcaacccact
-agtaagtactgcccactgtgatcccaatttggatttcaaatctgtttactcgccttattc
-tgggccaggctgccctcctctcCATGGGTCTGCCTTTTGTGCCTTCCTGTCTTTAACCCC
-TCTGTCAGCTCCCAGGAGATTCTTTTTTTTTTTtgcagttgcaagatttaatagcatgaa
-atagagtgaaaacagagctcccatacaaagggaggggacccaaagggggttgctgttgct
-ggctcgaatgcctgggtttatatgccaatccttgtctctcccactgtgctctcaggcaat
-agatgattggctatttctttacctcccatttttgcctaattagcattttagtgagctctc
-tgattggttgggtgtgagctaagttgcaagccccgtgtttaaaggtggatgcggtcacct
-tcccagctaggcttagggattctaagttggcctaggaaatccagctagccctgtctctca
-GTccccctctcaacaggaaaacccaagtgctgttggggaggtcagctgatgaccgcacta
-actgcttcctgctgaattagggagtagtaggggtggtgcagttgagatttcctcgggagg
-ggtgccttcgatgtcattaacatcagagcatgggctagcaggctggtccgggggtccgtg
-gtaaatcttagtcatggactgcatgtgagctccCAGGAGATTCTAATGTGTGGCTGGCTG
-GGCCCACCAGCATGGATGAGGACAAATATAGCTGTATCGAGTTTGGTCTCAGACTTTTTC
-ATGCATCATTGACCTCCTAGAACCTAAATTAAAAAGCAGACATCCAGGTACTGAGCACCT
-GCTCCAAGTAGTCAAACAGCATATTCATGCCTGAGGTGAGACTTTCCCAGGcatcttccc
-caagcttctcatttgcctgaacatagacaaactgaggcccagaagtcttgcccaaggtca
-ccatctggcaggCTAGGCTCTAAGACTCCTTGCCTGAGGGCTGCAGAGCTGAGCTGGTGA
-TTCAGGGCAGCTCAGGGTCCCCTCAAGTGACTGGAGCTCCCCAAGCACCTCACTGGTCCC
-CCACTTGTCCTGTGGTTGCAAGTGGCTGGGCAGGGCAAAGGTTACCCACAGCTGGATCCC
-ATCACCCAGTTTGCCACACCCGCCCACCAGCACAGGCCCTGGGATGGATAATCTGGGCCA
-GATGGGCTCAGTTAGGCTGGGCTGGGCTCTGGAGACTAATATTGGCCTGGGTGGTGGGAG
-CTAGGTCTGGCCCATGGCTGAGGCACCAGCTGGAAGGGCAGGGAATGGATCCCAGTGGAG
-GAACTCACCCAGCGTGGGATCTACTTCTCTTGTTTTTTTGGATCTACTTCTCTCTATGCC
-GTGCACCGACTCCAGGATTAGACCTGCCCCTTCTCCATCACTCTCAGGCTGCCGAATTCT
-CAGGCCTATGATGGGGTACAAAGGCCTGACCTTTTGTCACCCTTCCAGCTGGCAAAGAGA
-CTGAGTTTTGGTCCCTGGTCTACTGCCCCATCCCCTTGGCcctgggtttgagttctggct
-ctgccacactttcattgtgggcccttggagactactgtgtttctctgagccccactttac
-agatctgggtcatgggTCAGCACACCCTGCTCCTTGCTGGGGAGAGGGCATTTGCAAAGG
-GTCTTGAAGGAAAAGAAAGAAATTTTCACAGGCAGGGGCTGGGGGAGAGGGGGTGATTCA
-GACAAATAACAGGTGCAGATCCGTGGATGAGCAGCCTCCGTGGCCGAGGAGATCTGCTCA
-AGCCTGCTTCTCTCCTGCATTATTTATATAaaatggacatcaattggtgaatggagaaac
-tgcagtccatccatgcagtggactccattgagcaataaaaaggaaagaaccattgatgtg
-tgcaaacacacagatgaacttcagatggatcatgagtgaaaaatatgcaactccaatggt
-tccatactgtaggagtctatttgtatgactctctaaaaatgtcagaatctgtgattgcca
-gggcctgggtccggggagggggtggggattgattgttaaaggacacaggggagctttttg
-ggatattggcaatgttctatgtcatgattttgctggtggttacataactgtatatgtctg
-tcaaaactcatggaactatatgtgaaaagggtagattttgctgtacgtgggtcatacctc
-agtaaaaaaCAACGCCCCCAACACAAGGTTCTATAAAATGCCGCAGATATACATATGTAA
-CATTAAATAGATCTCCTCCAGTGAACCCCCTCACCCTCTCTGAGTTTCATTCATGTGttc
-attcaggaattatttcttgagcacctactatgtgctcatcctgtattaggtattagataa
-tcagaaatgagcaaaattcgtaaagtttctgattccagggcacttctactaaatatatca
-gttgcattgaaatcttgatgaatgctatgaagaaaataagacagggtaatatgtggggtt
-ggaggcaagtttagccagtatgatggagaaagccccaccagagagggccatctgggctga
-gaggctgagaagaagcaaggtctgggagagtcaggagggagggaattccaggcagaggaa
-aaggcaagtgcagaggccttgaagtgggagcgtgtctggtatttgaggatcaaaatgaag
-ATGGTAACAATGATATGCCCTGCAGCTATCTCTCTTCCATGGAAAATGGTGCATGAGGTT
-CCTGTTTGGGAAATGCATCTTGTCAACTGCAGATAAAAATCAATgcagagagagtagtgc
-tttgtatggatgaagctgtgtgtgaatcacagctcttagcttactggctgtgtgacctta
-ggctggggcctctactggtgtctgagccttttctctaaaatgaagataatcatagctcct
-tcccctgggttgtagggagcattcctgagataaCTCTGGTTGTAGTTACATAATGAACGC
-ATGATAAATTCTGGTATGTCTGGGCCATATCTTACTATGtgtcaggactctgagcccaag
-cctgcgcgtatacatccagatggcctgatgcaactggagaaccacaaaagaagtgaaaat
-ggctggttcctgccttaacggatgacattaccttgtgacattccttctcctggacaataa
-gtctccgtagctccccaccaagcaccttgtgacccctgcccctgcccgccagagaacaac
-cccctttaactgtaattttccactacctacccaaatcctataaaactgcccaccccatct
-cctttttcagactcagtccacctgcacccaggtgattaaaaagctttattgctcacacaa
-agcctgtttggttcacatggacgtgcatgatatttggtgctgaagacccgggacaggagg
-actccttcaggagaccggtcccctgtccttgccctcattccatgaggagatccacctatg
-acctccgatcctcagatcaaacagcccaaggaacatctcaccaatttcaaattgagtaaa
-cggtcttttcactctcttcttcagcctctctcactacccttcaatctccctgtccttcca
-attcgggttcctttttctctctagtagagacaaaggagacacattttatccatggaccca
-aaactgcagcaccggtcatggactcaggaagacagtcttcccttggtgtttaatcactgc
-agggatgcctgccctgatcattcacccacattccattggtgtctgatcaccggggggaca
-cctgccttggtcattcacccACATTCCCTTGGTGGCATGTCAATTGCAGGGACACCTGCT
-TTGGCTGCTCACCCATATTACAGCCCAGGGCTGCTCACCGcccgcttctccgtgtctcta
-gctttctctttaaacttacctcttcactgtggtcaaccttccaccctgcattcccccttc
-ttctcccttagcctgtgttctcaagaacttaaaacctcttcaactcacacctgaactaaa
-acctaaatgccttattttcttctgcaatactgctaggccccagtacaaactcgacaattg
-ttctaaatggccagaaaacagcacttttgatttctccatcttacaagacctggatgattt
-tttgtcaaaaaatgggcaaatggtctgaggtgcctgatgtccaggcattctttcacacat
-tggtccctccctagtctctgctcccaaagcgactcatcccaaatctttttttttctctcc
-tgtctgtttccttccatctccaccccaagctctgagtcctttgaatccttcttttctacg
-gactcatctgacctctcccctcctccctgacgctgctcctcgccaggctgagccaggtcc
-caattcttcctcagcatctgctcccctaccctataatccttctatcacctcccctgctca
-cacccagtctggcttacagtttcgttctgcaactagccctcctcacctgcccaaaaattt
-cctcttaaaaaggtggcttgagctgaaggcacagtcaaggttaatgctcctttttcttta
-tctgacctctcccagatcagttagcatttaggctctttttcatcaaatataaaaacccag
-ccccgttcatggcccacttagcagctaccattagatgcttcacagccctagacccagagg
-ggccagaaggccaccttatccttaatatgtattttattacccaatctgctcccaacatta
-gaaaaagctccaaaaatgagattccggccctcaaaccccacaacaggacttaatgaacct
-tgccttcaaggtgtacaataatagagaagaggcagccaagtggcaacatatttctgagtt
-gcaattactcgcctctgctgtaagagaaaccccagccacatccagcacacaagaacttca
-aaacgcctaagccgcagcagacagttgttcctccaggacctcctcccacaggatcttgct
-tcaagtgctggaaatctggccactgggccaagaaatgtccacagcctgggattcctccta
-agccgtgtcccatctttgcgggaccccactggaaatccaactgtcccactcgcccaccaa
-ccacacccagagcccctggaaatctggcccaaggctgtctgactgactccttcccagatc
-ttctcttcttagctgctgaagactgacactgcctgattgcctcagaagcctcctggacca
-tcacagatgctttaggtaactcttacagtggagggtaagtctgtcccctttttaatcaat
-acagaggctacccactccacattacctacttttcaagggcctgtttcccttgcctccata
-actgttgcgggtattgacggccaggctgctagactccttaaaactccccagctttggtgc
-caactgggacaaaattttttttttttttgagatggagtctctctctattgcccaggctgg
-agtgcagtggcgcgatctcggctcactgcaagctccatctcccaggttcatgccattctc
-ctgcctcagcctcccgagtagctgggactacaggtgcctgccaccacgcctagctaattt
-ttttgtattttttttttagtagagacggggtttcaccgtgttagccaggatattctcgat
-ttcctgacctcgtgatttgcccgcctcggcctcccaaagtgctgggattacaggcatgaa
-ccaccgcccccggcctgggacaacattcttttatgcactcttttttaattatccccacct
-gcccagtacccttattaggccaagacattttaacccggacaagtcttacaggctggtcca
-agatcttcgccttatcaaccaaattgtcttgcctatccaccctgtggtgccaaacccata
-tactctcctatcctcaatacgcccctccacaacccattaatctgttctggatctcaaaga
-tgctttctttactattcctttgcatccttcatcccagcctctcttcggtttcacttggac
-tgaccctgacacccatcagcctcagcaacttacctgggctgtactgccacaaggcttcag
-ggacagcccctattacttcagtcaagccctttctcatgatttactttctttccatcactc
-ccacctactctcccactgaaacttccacctatcaatctcttcccacacaaggcaaatggt
-tcttggactaaggaaaattcctccttccagcctcacaggcccattccattctatcgtcct
-ttcataacctcttctatgtgggttacaagccaccagcccacctcttaaaacctctcattt
-cctttaagacatttaccttgtatttcactccatccttggctaccttccccttgctcttca
-gactctcctcccaggccctcttcttgtttgcttatacccagccctgtaaataacagtgaa
-tggttgcttgtagatactcgacgttttttcatgcaccatgaaaattgaacctcctcctct
-aggaagttaccccatcagtctccattacaacctctgacggctgccaccctagctggatcc
-ctaggagtctgggtacaagaaacctttagtactccttctcatctttttactttgcatttc
-cagttttgcctcgcacaaggtctcttcttcctctgtggatcctctacctacatgtgtcta
-cctgctaattggacaggcacatgcacacaagttttccttactcccaaaattcaatttgca
-aatgagaccgaagagttccctgttcccctcatgacaccaacaGTTCACTACTATTTTGTT
-TTGTTTTTCTTATTATTAATATAAAAAGACAGGAATaggccttgacttactcactgctga
-aaaaggaggactctgaatatttccaaatgaagaaggttgttttcacctaaatcaatctgg
-cctggtatatgacaacataaaaaaactcaaggacagagcccaaaaacttgccagtcaagc
-aaataattacactgaacccccttggacactctctaattggatgtcctaggtcctctcaat
-tcttggtcctttaatacctgtttttctccttctcttattcggaccttgtgacttccattt
-agtttctcaattcacacaaaactgcatccaggccatcaccaatcattctatacgacaaat
-gctccttctaacaaccccacaatgtcaccctttaccccaaaatctttcttcagtttactc
-tctcccactctaggttccgacattgctcctaatcctgctcgaagaagccctgagaaacat
-cacccattatctctccataccacctccaaaaattttcgccaccccaacacttcacctcta
-ttttgttttgtcccaacacttcaccactattttgttttgtttttcttattaatataagaa
-gacaggaatgtcaggcctctgagcccaagcctgcacgtgtacatccagatggcctgatgc
-aactggagaaccacaaaagaagtgaaaatggctggttcctgccttaactgatgacattac
-cttgtgacattccttctcctggacaatgagtctcagaagctcccccactgagcaccttgt
-gacccctgcccctgcccacaagagaacaaccccctttaacgtaattttccattacctacc
-caaatcctataaaactgccccaccccatctccctttgctgactcctttttcggactcagt
-ccacctgcactcaggtgattaaaaagctttattgctcacacaaagcctgtttggtggtct
-cttcacacggacgcacgtgacaCTATGTAGCTGTTAAAAACAATGAGGTTGATggctggg
-catggtggctcacacctgtaatcccatgactttgggaggccaaggtgggtggatcgctta
-agctcaggatttggagaccagcctgggtaacatggtgaaaccttgtgtctactaaaatca
-gaacaaaattagctgaaggtggtggtgcatgcctctagtctcagctacttgcggggctga
-ggcaggaggatggctttagcctaggaggtggttgcagtgagctctgatcatgccactgct
-ctccagcctgggcgacagagcaaaaccctatcttaaaacaaaacaaacaaacaagcaaga
-aTGAGGTTGAGCTACATCAGATGCTGATCTGAAAAGATGTCCCTGTCATGCTTATGAGTA
-AAAAAAGAAACCAAGAGGCAGAACACTATATACAATGTGGATCCATTTGTGTGTAAGAAT
-GATCCAAATGATGTATTTTTATACAAAAACCGAGAAGATCAAACTATTAACAGTAGCGAT
-TTGCTTCAGGGGAGGGGGTTTCAATAGGGTGATGGTGATGGCGTTTTCTTTTTACATTAC
-CTATATTGAAATTGTTTGGATTTTAAAAGTAGAATGAGAGTGTATACAGGTATAATTAAT
-AGAATATTTAACAACTAGTATATAAACACTAGGAGTCCCTAACTGATGTCCTGGACCCcc
-agggatctgtgaatagaattcaaggaacctgtaaacttgcattaaaaaaaaaaggacatg
-cttttcccactagtctctaactgatattaacttttcctgtggtagtgagtatatgccaca
-ggctattacagtggtgatagcagggcctgcagctttgtcactagtagaaaccgcagatac
-tctaatatctcattgcagtgattgcggatatctacgacacattgtgtatactcacctcag
-cctcaaaattatggaaggtacttgacccaccactcagtcttgttattttgtgcattaata
-cagaaataatataggactatatcagaaacctgttttctgttatgttgacatttgcatctc
-aaggcaatttgtttcctttataaatctatgcatttaattttacatttcaaaaaaaaattt
-ttttttctgagagagggtcaccggatgccaaaggaccccaaggtacaggaaaggttaaga
-cccctgAAGGCCTGTCCCACACAAGGTTCCTCACTGGTGTccccagtaggctaccaactc
-tgagagtgcaaggactttgcctgccttCTGGGGCCTGGAAGACTGTCTGGATATTTgtag
-gctctgctgttgaccccaattatagatgggcaaatggaggttcaggctcagagtcacttc
-cctgaggtcacccatcaagttgcagatgctagattcctcctcatgtctactgatttggaa
-ggctgGGAGGTCAGGTCTTGTGGGTGTAAGAGGGTCAAGGCGGGGGCTGGGCGGGTGAAA
-GTGGTGCTTCCCTCACCCAGGGTACGACCCAGGCTTTAGCCTTGCAGCCAGTGAGCCCAG
-AGGATGGGGTGAACCCTGCTGCTGGCTTCTGCCTGTTGACCCAGTTCCTGGGTCTCTGCC
-CAGACTTGTTCCAGAACCAGACCCAAAGCACCAAGGTTTCTGTGAATGGGGGTGGCAtta
-aggaaacttacccttctagttggtcagacccagcctctcagagctgccctgctttccttt
-gtctctctcacatcctgcatccaatctgttgtctctaccctcgggcgcatgcagaatctg
-accacttctgcccaaccttgccacttccaccccagtcccagcccccattgtctctagcag
-ggatcaaagcttccttgatactgtcagcatctgtcattgctccctgggcccccaggctat
-gctccacacatagccagtgacgtcctggtcaacctgtcagattatgaccccctctgctct
-aaaccctgccttgggtcccgtgtggcttagagaggaccaggactccttgcagATTCCTTT
-AGTGAAGAACAAAATTCTTTGCTTTGGAAACAGGTAAAACAGTCCCCAGTGAACAGAGTC
-CAAACCAGGCTGTACTGGGATGGTGTGGGAATTGGGATGAAGCCTGTTCTAGGTCCTAGG
-CTGAACCAAAGCCCCATGGCTGGGGTGGTGCAGGGTGTGGAGATTTGAGCCCGGCCTGAC
-GGTAAAAGGAAACGGGCTTTAGCAGGGATGCCCCAGGGGTAGGAGCCCAGGCAGGGAGAC
-ATCTGGGGAGCAAAGACTTAGTGAGGGGGAGACCTAAATGATGCTCTCagggacctctca
-gctcccatcccctccatttcacagatgggaaaactgaggtcccaatcaggaaaataaagt
-gccagaggctgtacacaggagctaatggccagatctggTGCAGACGTATGAAAATCTGGA
-GGGTCAGATCTTACCTAGCTGTGTGTGTGTGTTTCAACTTAAATGTAAATCTTTGTAATT
-TTATTTTTCGAATGGGTGATATAAACACATTGTTCAAAATTCCAAGGAACAAAAAGGAGT
-GAAGTGAAAAACAAATTTTTCTGTCCCTGCCTCAACCCACAGTTCCCTCCCTACAGGCCA
-CTGAGGGAGGTTCCTGGGTTTCCTTCCAGAGAAACGCTATGCATACTTCTACATCTGCAG
-TAACTGTGTTTCCATCCCACCACCTGCCCTTCAGGCTACAAAAACCTCAGCTTGccattc
-cacacctggcttccttttgcttaacattgttcatagcatgttccacattcatccaggtag
-acttgcctcagcattgtaagctgcttgaaattccatctatgggcctccattgtttgctca
-tctagtcccctctagctgggcctgtaggatgtttccaggctttaacatcaaaaacagggc
-tgctacaaatatccttgtacacctgtcacttaacattcccacaagtctatgtggggaata
-aatcctctgaagtagaattgcttcaaagtagagtgaaatcacacgtttttttggtccttt
-gttttttgaggcagagtcttgctttatcacccaggctggagtgcaatggtgtgatcatgg
-ctcactgcagccttgaattcccaggctcaagcgatcttcccacctcagcctcccaagtat
-ctgggactataggcatgtgccaccaggcccagccaatttttcagtatttttttgtagaga
-ccagggtcttgctttgttgcctcaggctggtctcaaactcctgagctcgagtgatcctcc
-cacctcacctcagcctcccaaaacagttgtgattttgactatcgttaacaaactgccctt
-ggcagaggttatgccTAGTGGTTTCTGCCCCTTTGGAGGAGAGGCCCTAGGGTCTGCAGA
-GGTGGCCACAGGAGCCACAGAGTTGCTTATTGCACCCCCTCCCAATACGCATCCACACCT
-CCCAATCTCAGTAGCACCAAAGCATCTCCCACCAGCTtccttctgacttctaggtctccc
-tgaaaatgtcacctcctctgagaagcattccctgaccacccccactctactccacctgtt
-tatcacagtgtgcactctggcttctacacagtacttcatgccatctgaaatcactttagt
-catttgtcatttgtccaattcccccacgagaagagccccaggagtgcagaggtttgtctg
-ccctgttcatgagcacatcctctatgcctagaatagggctaggcatatgagaggtcctcg
-ataaatatttgtggaaagagcagatGGGTCAGTTTTGTGTAAGGGGCACGAGATTTCCAC
-TGAATAGTTGTTTGGCAGCTAGAAGCAAGTTAGGAGCCTCGAGCCCAGGCCCAGCCACTG
-CTGGAGCCTGTGAGAGGCAAAGGCAGTGGAGACCACAGAGACCAGAGAACAGAGAGCTAA
-CTGGTGCCAGGGCAGAAAGAAAGGGGAAGAAACACCAGCACAGAGATGGGAGGGGCAGGA
-AGGAGGGTTCCCAGGAGGGAGGCCCATGGCAAGGGAGGGAGTCAGCTTGGGGTATCTGCA
-GGAGGAATGTTCTAGAAATGAACAAGACATAGTCTTGGTGCTCATttccttcctccaacc
-aactcattcagatgtgccgagacctgggcatggtgctggggatagagcagctaccagaac
-aggccaggctctgcactGCTGCTGCGGTCTCCCAAGGAAGATATCTAAAGGGCtactctg
-tcccaggcatgaccccaaggccctacaaatacagctcatttagtccttggtgctcccatt
-gtcaccattttacagatgaggaaaggaaggcattgagaagatgagcatcttgcctaagtg
-gcaaagactggatttaaatataggcctttggtctccagagaccacacccttagccactCG
-GTGGGCTGCTtgtggcagctagccttcaggatgaccccagggatcctggtgctcatgccc
-ttgtgtagtcccctctctcaacaagtcaggactggctggcatgactaattagatattgta
-gaaacgttagtgtgacttccttggctaaaccattgcattgtgtcttctgtcttgccctct
-cttggaccacacgctttagaggaagtaggccactatggcctgaggacccttaagcagccc
-ttgggaggaagccatctggaggggaactgaggccttctactcacagccagcgccagctca
-ccagccacaggaggccgagccccagcccaggtcaagccttcagatgagtgcagccctagc
-tgatacctgagtgcaaccacatgaaaaaaaccccaagtcggaactaccttgttaagttgc
-ttcagaattcctgaccctcagaaactatgaaagataagaaatgtttgttgttattttaag
-ctgctaaatgttttagggtaatttgttatgccacaatagataactaatataCTGCTTTTC
-CAGAGCTTATAGAGGTTTAACCCTCTTGCTTCTCTTCTCTGCCATCCCCAGGCCTCAGTT
-TCCTCATTTTGACAATGGGCTGACTTGTGATTTATGAGGGTTGGCCCCTCCTCCTCTGCC
-TTGCTTCTGTCCCCTGGGCCTGCACCAGGCCCTCACCCTGTGGCTCAATGCAGACTGAAA
-TGGTTTGTCTTGTCCTGTCTGAGCAGCTGGGCCCAAGCCTTCCTCATTGTTTTCCTCTCT
-GCAAGACATACTATTGCTTTTCTTCTGGGTCAGGCTCTGGGCAAGCACAGCCAGTGGGCT
-GAGAGCCAGGGGTAGAGAGACTTGGGGACCAACGGGCTCTCACGGAGGGATGAGCTTCTC
-AACCCTAGCTCAACCCTCAATTCTTTGACACAGGCCCAGCGTCTCCAAACATCcagtgtg
-gtctgggcctggagcactgcactgagagtcagcaagcttgctcaatagctttgccatttc
-ctttctctgccagtgatgagtttctctgaacctcagtggcctcattgtttcctccttgca
-gagcgcctggaaggaatagggaaatggccactgggacctgtgttctgtggatctgggcta
-ggattcttgtctgtctggttcatgaggcctagcacagtgcctggcacacagtagtgcctc
-ccatatttgtggaatATTTGGGACTTCCCTGGCTCCTGAGCCTCACCTTTCATGGGGTGG
-CAGGTCCAGTGTTCATCCCAGGTGAAAGGCCACAAGGAGAAGATGAGGAGTGTGGCGGAA
-AGGGCTGCAGAGGGAGGGGAGCAGGGCCTGCCTCTGCCATCTGGACTTGGGAGGGGCTGC
-CAGGGTCCCTGCCTCCTCAGGCTCAGGTATGCCTTTGGTGGTCGTCTATATTTCAACCTT
-GATCTTGGGAGGTGTTTGCGATCGCTCACCTCCCTGACACTTGAAAGTCACAGAATGGAG
-AGGTGTGTCCATTTTGCTTGGcaacatgcttattgaacagttattatgtggtcagcactg
-ttctaaccactaggtatatgaagtccttgcagccaccctccaaggtaggacctgttatcg
-acctattttacagacgaggcacagagaggttaaacaacttgtccaaggacaggtagctct
-tcacaggtgtaaccaggCGGTGCTTCTGCAAGGCCTCTTGGCTAGAGTGATCATGTGACA
-GCGCCCCTGCCCACCCCCCAACCTCACCTCAACTTTGGGAAAATAGGGCAAAGTATGTTC
-TAGACACAGGGAGGCTTTGCTGGGGTATCTCCCCACGTGGCACCAGGCCTTTCTGCCTGT
-ACGACTCCAGTGTGTACCTCttctcttattggatccccagcagcctggaggaaaagggtg
-attgttccccacacaaatgagtaaactaaggcccacaaaggccgagcattactcacagct
-ggtaaaggaagaTTTTTAACTTAATGGCTGAGCTCTTTCTATGTGCCTGTCTTGCCTTCT
-TGGTGGCTGAGGCTGATCCTGCAGATGGGGTGACAGGGATAAGATTAGGGTCAGACAAAG
-ATGGTGGAAGCTGGCTCAGAGGTCCACAGTCTATCAGAGAATGATCCTCAGTGAGGACAG
-GACAGAAAAGTGGCCACATCTCTTCCCAGTCTCCATGGTCCTCCACGGAGAACAGGGTCA
-GGACCAGGGACATCTGtctggctcctggtgagcactccagtctcatcttggccatgctct
-cctcgctctctgcactgtagacacactgaatgccttttgcttttggcccattctaccccc
-agggcctttgcacttgctgtcccgtgtgcctggaatgcttttgcttcctttccctgtctc
-gccactgccaacccagcctttagatctcagctctgtccttcttcctagtgcctccctccc
-tcaaggtcaggcacccattatccacccctagcatctctcggtccctccttcatggcacat
-atcatgattgatcgttgcacatgggaaatcactaggttagttacacccactgctccaggg
-gcaagggggaaggatggtcttccttgctcactactaaatccttgtcacttgcatggcgcc
-tggcgcattgtaagccctcaataaacagtggtggaagggacaaTTAAATGAATGCAGGAA
-TGAATATTCTTACCTGACAAACTAAGTTCAGAGTTGTGTATACACATTTGTGTTTGTGTG
-TGGTGGGGGGCAGGAGTCGGGGGTTGCACATCTACACATAGTCCCAGAATTGAAAGGATG
-CATGATTTTTTCATGACATTTATGGCATGCTATGTATCTTGTTGCCTCTGGAGAGGAGAA
-ACAGGGGTCTCAGctgggtgtcaggaaccctgggttctgggccaactcctgccaccgacc
-cttgggtgaatgtgattgagtcactcccttgcccaggcttagtgttcccatctgtaaaTG
-GTGGGCACAGAGAGGTGGTCTgtgtagtggttaagactgtgggttctggagccagtctgc
-ccgggtacgaactcacctccctcacttcttagctgtgtaaactccctgggcctccgtttc
-cccgcaataaatggggatcataacagtccccaccttttaggatgccacgaggtttatgag
-tcaatgtttataagacacatataaagtgcctggcccagagaaagTCCCATATGTGAATTC
-ACCCCAGCAAAGCACTTATCCCAGAAGACAGAGGAaacaatagtagcatctcctggttct
-ctgtgctggagcagtgccaggcacatcccctgaccagccatttgagcctcacagcaaacc
-caggcgatgtgtgtatcatcacctcaattttatagattgaaaaactgaagctcaggtctt
-tctcatagttacacagctaataaTCTCACAGATGTAAAGTTGAGGGAACAAAAGGAAACT
-ATAGTAAGATATGGATGGTACGACAGGATTCCTTCCTTGCACCGTGAATCCTGGAGTCTT
-Gacgtttactgagcacttactctctgccaggccctgtactgagccccacatgtgcattgc
-ctcatttaatctcctcaataacctgcaaagtagcttctgttagtgtcctcacttcacaga
-taaggaaaccgagtcacagagtggaaaagcaatggtctgagaaggcacagccagtaagca
-gtggagctgggattcagactgagtcaactgggactcagggcctacactcGGCTTCTGTGG
-GATTTGCCCCCAGGCCCTGGGCCAAGAATGGGGTGTGTAATTGTGGGGACACCCAGACTG
-AGCTTCTGGAGCCCCTTAGCTTTTCAGAACGGCCACAGCTGCCTGAGGCCCTACCTGAAT
-CATCCCTGGCAGAAAAGCCCTAGGGAGCCTTGGGCCAAGGGTTCCTGGGGGAAGAAAAAT
-CTAGTAGCTATGGATCTCCCCTTTGGGGACCAGGGTCCTCTATATTTTCCAGGTCCCAGC
-TAATGCCCAGGGACCCATCCACCATGGACATGGCTTATTTATTGGACAGAAAACTGGCTT
-AAGTTCtgagataataggttccggcatcagatggctgaatctgactttgcccttcttggc
-tgtaagatcttgggcaagtcacctaatctcttggtgcctcagtttcctcatctgttagtg
-gacaagcaatcttacttcactgggtcatggtgagaattaaatgccgtaacataaagcacc
-taggacagtgtgtggcatacagtaaatgctcactaaatgagtgcttactcattACGTCAT
-AACTGCTTtttcatcctccactcattctgggaggcacgagtattttgagttccactttag
-agaggagccaattgatatatgtggcttccccgggttcccatagctttgagtggtacccct
-gggacttgacctcctgaccccaaCTTGGTCCTCCCCAGACCCCACAGCCAACTCTCAGGG
-TTCATTCCTGACATTTCAGAGCTGGCTCTGAGGTTATGCAAACAAACTGCGGCCAGAGTC
-TGACTGGAGGTGCAGGCTTAGGGGGCAGACCTGGGGCCCGTTTTCTAACATTTCCTGCCC
-AAGGAGAAGGAGAAGAAGGTCTGTGTACATCCCAGCCTGGCTGAGCTCTAAGGCCAGGGA
-GGAGAGAACTAGAAACATGTGGCCCTGCCCTCTGTGGGATGGCTGGCCAAGCCAGTTGAA
-CAAATAAACCCGTCCTTTTGGGGGAAGTCGTCAGGGGGTCTGCTGCTGCTGGTGCCTGCC
-CTGCACCCCCACCTCATCCCAGGCATGAGCCAGCTGGTCATCCCCAGGCCGAGGGTATCT
-GTGCCAGCTGTTTCCAGGCCCCCTTCTTGGAAAAATCATCCCATTCCTCTAAGAAGCAGA
-TGCTGTTTCCCCCATCCCCCAGTCCCAAACTGCTTAGAAAGGAGCCAGCAGTGAGGTTAG
-GAAATCAAACCCCAAGATATTTTGTTCGGCACCGAGACTCATTTCTTGTTTGGATAACTG
-AAGGCTGAAAATGCCAAGAATTTGTGGGCAGCCTGGGAAGGCTGGGGCAACTGGAACCCT
-GACTCCCAAACCAGGTCAGTTTGGGAGGGTCTCAGGCTGGGCAAGGACCCCACCCTGGGT
-TCCTCCTTGGTGCTCTCTTGACCCACACCCAGTTAGGCAGGGCCTCACAACTGCCAGGCC
-GAGGGGCCCAGTTATTCTGAGGTTTGATGTCAGAGACCTGGAGCAAACAGCAGAGGCTGG
-GGCAGTGCCAGGTTGGGAGGCCCCTGCCCAGCCCCTGACCCCTCTCTGCTTGGCTTTGGG
-TGCAGAGGAGGAAGAGAAAGAGGCCTCGGCTGAGCAGCCAGCTGCAGGGTGGGCATTGGT
-CATTTGGCAGATGTGCCCTGGGTCTTCAGTGTGGACACTCGGGGAGGTAGAGGTGGGAGG
-GATGGCCTTGGGGTGAGAAAAGGAGGAGCTGAGAAAGAGACAGGAAAAGATGCAGGGAGT
-CACTTTGATAGCCAACCAGGAGAGAGAATCAGAGACAGAGACACCCACAGAGTTAGCAAC
-AGTGAGTCAGGGCCACCGCGAGAGCCCCAGGAGAGATCCACAGAGGCAGAGAGACTCAGA
-AATAGAGACAGgctgaccacagtggctcgtgtccgccgtcccagctacttggaagactga
-ggcgggaggatcgcttgagctcaggagttcaaggctgcagtgagctgtgattgcaccatt
-gcaccccagtgtggttgagagagtcagaccttgtctttaggagagagacagagagaggga
-gagagggacagagagagggagagagagacagagagagggagaaagagacagagacagaca
-gagatagacagggagataggcagagagagGGCTGCCATGGACCCCAGGCCAGCAGCTGCT
-GGCTGCTCCCTAAAGGTGAGAAAGTAGTTCTCACCTGCAGTTTCCAGGTGGGGTCAGCCC
-TGCCTCTGGGAGCTCAGAGACTGGGGAAGATGTGCTGCCCTCAGGTGGTGGGGGTGGGCC
-AGAGAGGCTGGGGCTTGTGTCTGGCCCTGGTTTTcctcattctcctcatctgtataatgg
-atcattctgtggggccatgaagagaaggCAGAGTATGGCACTTCTTGGATGGGACACCTG
-GGGCAACTGGGGGAATGGCAGTCACACACGGGAGCCCttattgagcacctgctgtgtgca
-gaggctttctctgctctgcttctcttgaccccacatcaaaggtcaggggtaggtgctgtc
-attctcctcccagcctccggattaggcactgagAGGGAAGGGCCAGCACTGGGTCCTAGA
-GGGAGGGCATGGTGGACAGAGGAGGTCATGTGACTAGCCACTGAGCTGCCCAGCCCAGCT
-AGAGATGCCTGCACTGCAGCCGGCTCTGTCCCCCAACCTCCTCAATATTCCTGCCTGCAG
-CTTCTCATCCATATGAGCGGGGTGGAGCAGAGCCCAGAGCTGACGTGCAGCCCCAGGAGC
-TGGCTCCAGATGGGAGTTACTGGGGCAGGGGCTTTCCaggagcgaggaggaggagagaga
-gggaggcagaaggagggggagagcagggagaagaaagggaaggggagtgcaggggaggag
-gagagtatgaaagaggagagagagagaagaggtgaggCCGGGGCTCTCCCCATGCCTGAT
-GAGCACTGGCAGTAGGACACAGCAAGCTGTATGCTAGGAAAGAGTGCGTATCTGGGGACT
-TGGAAACTCTGCAGTAGAAGGGAGCACCAAGAGCATCCCATCCTCTCTAGATCTTGCTTC
-CCTTGCCTCCTTGACACCTTCCAgagtcaggaaaaagtacctgcagtttgtagtgagaat
-ccagattggctttcactgctacatggctctggcaagtcactttccctctctggcctgttt
-cctcacctgtacactgggggaacaggaGGGGAGTTGGGGGCACAGGCTGAGCAGATGATG
-GCTTCTGGGATTCGCGACAGGAAGGATCTCCCCTGTGTCTGTCTAGATGAACAGAATCTT
-GCTGAGAGCTTGTTCATCCCTAATGGCAatggtgatgatggtgatgatgatgctgatggt
-gCCATTAGATGAGTATTTTAAAACTCTTTTTTTAACTTTTCTGAGATGTTAGAGAAAAAG
-CCAAAAAAAGGCTTTGAGTTTCAGAAGATCTGAGATATGCCTGGACCAAGAGAAGAACCA
-GAGGAAGGTCACAGCCACAGCCACAGAAGGTAGCAAGCACTCCCCACTGGGGACCAGGAG
-TGTCAGAGGGGGCAGAGAGAAATTATTGTTTACATGAACCAAGGGAGACCGAAACCTGCT
-CATCTGTAGCCATTTGGTAAGGAAGTACCTGCAGCCAGGTCAGCTGAACTCCCATATCAG
-AGATCTTAGGCCCTACGGCACTCTACGGTGACCTGACTGACCCTAGCTCAGAATTTTCAG
-GCTAGGTGAATGGATGCCTGGAGAGGACATTCCACCCCAAGCTGAGGCACTGGACCAGGT
-GACCTTCTGATCCTGCAAGCCATCAGTTCAAGCCATCAGCTCTCAGCCAATGTTTCCCAA
-GCATCCGACACCCAGGGGATTCAAAGATGGATGAGAGTGAGAGGTGAGACTTGGGGTAGG
-AGGCCCAGTGGGAGGTGATGACAGCATCCTGGGAAAGATGACGAGGCCTAAGCCAGAAAG
-ATGGACCATGAGAGAAGCCTAGGCCACAGGATGGGCTGGGCCAGCTGCCTGGGGGATAGG
-TGGGAGCCACAGGAAGCCCCCAGGGCACAGCCTGTGGCTGGGTGGTGGTGTCACCCTAAA
-CAGAGACAGACAGGCAGGAGGAGGGTGTTTGGAGAAGAGCAGGGAGTCGTCTCAGGCAGC
-TTTGGAGTTGAGACACCCATGGACCCTCAGGGAGGTGTTGGGGGAGATCCAGGTCATGGG
-TTTTGGGCTCAGGATCCCATCAATGCCAATTTTGTGTCATCACGGAGCAGGATGGAGACC
-TGGGACCTGAGAGATTGGAAGGACATTTATGCATTCATGCattcactcatgctacagaca
-tttattgagtacctactgtgtgttcggcactattctaggccctgggaacccagaagtgag
-caaaagagacatggcgcctgccctctgggagctcacacaccaaaagaaatgtttttaaga
-acattaggtagggataagttctaagaaaaaaaaacacaacaaagccagcagagggacaaa
-gggtggaagaggaaggtggttatttcgtacggggaggacaaggagggcctctggggagat
-ggcgctggagaggataggaggctggggtaagcaaagtgggagtctgggagagggaactcc
-agggagtaagggttcttgcttttattcggatgcatggttagccctgggaggagggagagg
-atgtaacttaggttttgatggggattctttggtctgctgcatggagaacaggaggtgggg
-gccgagtgttagcagggagccaggggggcagccaggacagctatcctgcctggagccaga
-ggtggttGTCAAGCTTGTCTGCTGTTTAATACCTTCTAAAACTCCAGGAATTAGTTCGCA
-TCCTTCATTCCTCAGTCATCGCCCAGACTGTCTCCTGGGTCCCTCTCCCTTTCCTTGGTA
-GCTCTCACTTAGGGACTCTGAAGAGTCCCATCTCAGACCCCCCAGGATGTCTCCTGTACC
-CTCATGCCCCGCCAGGGCCAAGCCTGCTTTGCACACCTCTGTAGTCAGTGCTTCTCCGAG
-GGTACACAATAGGTGCTCACACTGCTGAAAGACGAAAGCATGACAGGGCATTCTACAGCA
-GCCCTGGTcttgggccaaaaccacagtggcatcctcagctccttgcttcctcccactccg
-catccaattcaccagcagagctgatgggctctacctccagaacccaccagaatcttactg
-gccacaccccctcctagccccgttctgctccaggcctccggtaccttgcacctgatggct
-gcagcggccacctctttgggcttcttccttccaccctgcctcctacagtctatgctgttg
-aaatcgaatcacgggtgtctgtctctgctcacaaccttgcagtggctcccatgacactca
-gaacaaaagctgaagtccttccagtggccccccccccagctgcatggcctgccctgctgt
-cacctctcagacctccccgcacccttgctccctctcctctgctccagctacacaggcctt
-cgccccatggttctccaggcacacaccgctgcggatgcattccctcctcacggtcaaaat
-acatgcagctccctttgcagaacgttccctcaaatacctgcctggcccactctatcattt
-cccttgttctctgggttcaaatgtcacctcctctgagaagtactctctaatgatctgacc
-tcaagcagccacccagggccgccacttgccctctttcttcttcattttgcttcaccatct
-gacatagtagattatctcttactgcctctttcccctactagtccagagggagacatacta
-tactgtcgtatccccagcacccaggaaggcttggtccgttcagcccttggtcagggctga
-atggatttctgttggatgaatgaaGGGACGGCAGTTAAAGAGCCAGGTTGCCAGCTGACA
-TTGCCCAATCTTGCTGTGTGGCCTCAGACCCACCCCTGCCCCTCTTTGTGCAGCTCAGAG
-ACAGCCCTCTGTGCTCAGGGAAGGCCTCTTGGATGGACACTCCACCTGCTGATTGTGACA
-GACCCCAAAGCCGCCCTCTGCCCCCTGCAAACCTCCCATGCCCCGTACCTTCTTCAGCCA
-CTGCGTGTTGTTCTGCAGTGCCTGCTCCAGCTGTTTCACCTGCTGGGTGGGCAACTTCCC
-CAGGTGCAGTGGGTTGGCCAGTGATTCTCTCTGGAGGGTGTTGGAGTCCCTGGAGACCTC
-AGGCCCCGGAGGGCAGGGCTCAGACTTGGGCAGCAAGAAGGTGTAGCTACAGTGGCCGTG
-CTGGACTACAAGTGTCTCGCAGCCCCTATCCGCCTCCTGCCTTGTCTGTTGAGCCACAGA
-CATGGTGGCAACCACAAGGAGGAGGCTGCCCTGCAGCATGGCTAGCTGGGAGAGCATCTG
-AAGATGTGTCAATGGCGAGGGATGTCTGCTCAGAGCCCTAGGGGCTGTGCCTGGGATGTC
-CTGCTGCAGCCAACAGTGGCCAGGCTTGCCTGCAGCTGCAGCTACAAACCTCTGTCTGGC
-CGAGCTCTGTCCAGGCAGCTATTTATACTTGCTCTGAATACCACGGCTGCTCTGCTTGCT
-TCCTCTCACCGCCTCCCTCCGGCCCCACCCGACACCCTCTCACCTCTATTCTTCACTCCT
-TCCCTTCCTCCTTCCTCAGTCTTGGTGGCACGTCGCCCTTACCCTAAGCGTGCACCAACC
-TTGCTCTGTCTGCCTCACCTCTGAGCCCTCTGATTATCCAGTGAGGCCTGGCTTCCCTGC
-TGGAGGGGAGGGAAGAAAACAGcacacagacacgcgcacacactcatgcacacactcacg
-agcacacactcacacgcacgctgacacgcacacacattcatgtacacacaAACGCCAAGC
-TCCAATGCTGCCCGCTTTGGAAAACCAAATGCAACTTAACTCTCCCTTCCTGTCTCTGTC
-TTGGTCTCCCTCTTTCCCTCCACCCCCATCCCCTGCCCCCCAAGTCTAAGATCTCAAGTT
-TCAGTCCCGCTGCCATCCCCTTCTCTCCCCGCTGCACCTTCCTCCCTCTGGTTCCATGTT
-AGCGCTTGGAGTACAAGTGACCCCCGGAGAGAGCAGAGGGAGGGGAGGAGGCAGAGGGGT
-GAGGCTGGGGAGGGCCCAGCGAATCCACTTTGCCTCTGGAGACACAGAAAATCCTTCCAA
-GGTGGGGCAAGTGAGCAACCCAGCTGGGAGTTGCTTCCTGTCCTCTCTTCTCCCTCAGGG
-CCAGGGGAAAGTGGTATGCCCCAGGATGGCCCTGGCTTGGTTGCTTGTAACAGTAATGAG
-AAGTTGTCATGTCCTGGGGCAGATTGTCCTGGGGCTGCTGGAGTGGGGATGTGGAGAGGA
-Ggcagtggggagaggaggttggagtgccaggaggctaaccctagatctcgctccccgaca
-gctggccacgagacctagggtgggcagctgtgcctctctgggcctccacaccctgatctg
-taaactgggtaaaccttatctcttgcaggAGGAATGCGTGTGAGTCCTCAGCATGGGGAT
-GGAGAAGTTTTCAGCTTctgggttcaaatcctggctctaccatctaccagctgtatgact
-ttgagtaagtcacttaacctctctgtgccttcatttcctcctgaatgaggaaaataatac
-cacctacttcacatggcatgaaaattaggtgagttagagcaaggttggcacagagcgagc
-actaaataaatattTTCCGTTGTCAATgttatagttgtcattgcacctcccctcccacga
-cccactggagcataaactcctctagggcagggatttgtcCCTGGGGGACATGGTCTCCAG
-GCAGAAGGTGCCCAGGAGTTGGTGGGGCCTTTCCTGCATGGGCTGCCTTTATGTTCTGCC
-AGCTGTTTGGGCTTTTCCTCTCTCCCTGCTTGTTTCCTCAGAGTAGGGGCCAGTCTGGCT
-GTTTAGTATTTTCCTTTTTGTTCTCTCAAATCCCGATAGAGTTTTGAATTGGGGCAGGCT
-GCTTCTGGGCAGCTGTGAACTGTGGTCTCATCTGGGGACTGAGAACATTATACCAGGTGT
-GGGGCTTTTGCAGGCAAAGGAAAAGCAGCTGGTTATCAGCCTCCAGCCTCCCCTGAGCCT
-TCCCACATGCTCTGAGCTCTGCGTGCCCCGCTTGGCCCCAGTTGCCTCAGCTGTAAATGG
-GGTCATAGCACCCTGACCATGTGAGAGTAATGTGGACTGATAGCTTATCACAGCTCTGGG
-TGCAGAGAAGGGCAGTGTGAATGGTGGTCGTCATTATGATTGTCTTGACTGAGCTGCTTG
-ATAATCCCAACGAGgcagttacaccaggccccaagcttagatgggccccatgcttggttt
-acactctgccagcactgtcttgaaattcttaatacatttggaacaaagtactcagcactt
-gcattcttcattgagttccacaaattaggtagcaggccctgCCTGGGAAACATGAGGCTT
-CCCTCATCCCTCACTCTGCTCCTGACCTTACCATCCAATCAGACCTGTTCTTCCAACATG
-ATCCTTTAGATATTTCCCCCTCTGTCACCTCTTCACTACTCAGAATGCtggagccagcac
-atctggatcggaatcttggctttcctgaccccctatttgtgtgccttttgccaagttgcc
-taacctgtctctcagtttcctcttctgtcaaaatagtgatgttacagtggctaaaagacc
-gattcctgcagtgaggttaacacagagcctttcacataatacatgctcaaccagtgacag
-ctgtcatcattACTCCCtgctatgatatgaatgtttgtgtgcccccaaattgatctattg
-aaacttagtcaacaaggtgatggtattagaaggtggggcctttgggagtgaatagctcgt
-gaggactctgccttgggaatgagattaacgctcctatcaaacatgtcctagacagctggc
-cttcccttttgctaggtgacgttgcagtaagaaagcaccgtctatgaagcagggagctct
-caccagacaccagatcggctggtgccttgatcttggaattcccagcctccagaactgtga
-gaaataagtttctgttgtttataagccccccagcttagtgcattttgttatagcaacctg
-aatgggctaagacaCCCCACCATCACTCTCTTAGACCGGGGTGCTTCCTCTCTTGTAGGG
-AGAACAACAGCCTCAGAAGTGAACTCTGGTTAATTGGCCTTTGCTATTGCAACCAGAGTG
-Accttccttccttccttccttccttttttctttctttctttccttcttctctttctttct
-ttctttctccttttttttgacagagtcttgctctgttgtccaggctatagtgcagtggca
-tgatcttggctcactgcaacctccatctccccggttcgcgtgattctcctgcctcagctt
-ccccagtagctgggattacaggcatacgccaccatgcccaactaatttttgtatttttag
-tagagacggtgtttcactatgttgcccaggctggtctcaaactcctgacctcaggtgatc
-cacgcacctcggcctcccaaagttctaggattgcaggtgtgagtcaccatgcccagccca
-gagtgatttttctaagacacaatccagccctgacttctttgtttaaaattcttcagtttt
-gaactccaactctttctgtggtttacaagcccctgccggatgtggcctccattctcatca
-ctgtttccctggcactttataccttatcattTGGAATTGGTTTTACTCCCCCGCATGCTT
-TCCGCCTTCTGAGGCCTCAGTGTCTATGCTCCTAGCAGGAAACTtctgcttaaaaacttc
-cccccacctgtattgtcccagcttcgttctgcctgtcttttgatcttatctcagggatca
-cctcctctgggaaggctttctgcatctgtccctcccacttcaatgggagtaggccttctg
-cctctgggagctcaaaggcccctgcctgcctgtccctcaccaaagcactcatcctgcatt
-agaaaggcttgtttgcaggccttggtcaccgtctagactgaacactcttctaggtttgct
-gtcacactttccatttctgtgtttgttgcctgtcctaaggttaggctcacagtgggtcct
-catgagtgttatgttgaatgaatAGGAGCTGCAGGCCCAAAGCAGAGAGGAAGGCAGTCC
-CCTTTCCTCTCCAGCAGGGGCAGCAGGAAGTTCTGTGTGAGTTGTTCTGAGTGTCTGGCC
-TCCAAATCCTAAAAACAAACCAACCCATGTTGATTTTCCCATTGTCTGCTGCTACCATGG
-AGGTAGAGAACGGAGAATAAACTTATATCCACCTGGATACTTTGGCTTTTGTtcaaatag
-cttgggtaaaaagggaatttattggccaatttaactgaaaattttaggggtatcgagctt
-caggcatggctggatccaggtgctcaaatgatattagattttttttttttcctccaactc
-caggctcttattttccttcatttccttattttcctttgggttcattctgtaagagttccc
-accataatcaccaccactactggcaacagcagctccaatctatcaactcagtaacctctt
-ttaagagtgcctctttcctaatagttcttggaaaagttccagcttgagccgtacagtcat
-tcctgaaccaactattatagccagaggaaggagctactgtggatggtcaggctggatcct
-gtgtccaggcctggagccttggagcaggtcaacctcacaggatcggaagggactaagggt
-ggggtacagtgacgctcaagaaaacctggagtagaatgatcaggaggcgggtggagttgt
-tgggcaTAAAGCACCTGCCTGCCTGCACCCTGACTCTCCATCCCGCCACCCACCAAGTGA
-ACCCACCTCCCGCtcagagctgatggactcttggagtaactagagatgccatggaccctt
-accttgcatttcactcatgaggaaactgatactcagagagggaggccacttgcccagtgt
-tacaTGCTGGAATCTATTTTCCTGGAAGAACAGAACTTCCTGCTCCTAGGAGTGAAGGGT
-GGGAAAACAGGGTCATTCCGGGAGGACCACTTGCCAATTTGGGGTCCTGAAGTACCTGGA
-TCCAAAAGAAGAAGACTGTCCCCAGTCTGAATCTCCCACTCTGGGGAGAGGGTCACTCCT
-GGGTTGTTCCCACAATCCAGCCCTTCTGCCAGCCCCTCCCTTGGCAACTCCTTGCATTTC
-AACACCCTGGATGATCATTGAGGGTTGCACGTGGGGCAGCTGAAACAGACCCCAGGCCTC
-TGGTCCTGTGCTGCTCATGCCCCTGAGGACACTGCCTGGGCATCTCCCAGAGCTACTGAT
-GGCAACATGGCAAGAGCCTGGTGGGAAGCTGTGGGGCCATCGACAACCCCGGGGGATGGT
-CTGTGTGTCCTCAGAAGGTCTGGTGGTGAATCTTGTGCAGCAGACATCATGGTGGCCCCG
-TGAGCCTTTCCACCCAAGACAGAAGTCGGTTGACTGCCCTCCTCCACTTTCTACCAACCC
-AGACCTAGAGCCAAACAGAATTCCTGGATCACAAGGGGCCTAGGGTGGGTTTTGAGGTCA
-CCCTGTGACCCAGGCCCAGCTGTTAAGAGCCCCACATTCCTGATGCTCAATCTTGACTTC
-CCTTCAGTAGAtgagactcagtttcctcatctataacatggagaaaataatccctcactg
-ggaaggcggtggtgGTGGGGTCttccagttactgatactgtgtaacaaagtatccccaca
-tctagtggtttaaagcagtggcaacatctactttactcacaaatctgcaattgtggccag
-gttccctgggaaaagctcaactgtgctccattccgtgtcagctggagcaacttgcaggct
-ggggtttgcatccaaaactcatccactcacatatctgaaacctcagctggggcactcagc
-aaggacaactgcatatggcctcttcatgtggctaggggcttcctcatggcatggtggctg
-cttcccagagcaagcatctcaggagagagatttgggcagaaggtaggtgatctttatgac
-ctagcctcatggatcatgcagggccaagtcctctgtatctagtcaaagaagcaaccacaa
-agtcccactcaagttccaggggaggaagaacagactctacctcttgatgaggaggatcaa
-ggtttcagaagaaggtataggatgggggatagtgttgtggccatttttatttatttattt
-tgtttatttttaaatttttatttatttatttatttttgagaaagagtctccctctgttgc
-ccaggctggagggcagtggtgtgatctcagctcactctaacctctgcctcccgggttcaa
-gcaatgcccgtgcctcagcctcccaagtagttgggattacaggcacatgccaccaagtct
-ggctaatttttgtatttttagtagagacagggtttcaccgcattggccaggctggtctcg
-aactcctgacctcaagtgatccacctgcctcggcctcccaaagtgctggggttacaggta
-tgagccatagtgaccggccTGTTATGGCCATTTTTAGAAAATACAACTGGCCATGGGAGG
-GTCGGATGAGAAAATGCCATTTAAGTGTTTAGCATGTAAGTGCTTGATAGTTGGTAGCTG
-TTATTATTATCTTTGCGATTATTGGAAAGACCCAGCATCTCTTTGCATAAAAATATCCTT
-CAGAACCTGTGAGAGCTAAAGGTGCAGGAGGAAGCAGGATAATTTCCATCAGGGCTGCTG
-GAGAAATTGGCCCAGAAACCCACTGGATTTGTCCCAAGTCACCCAGTGTATCAGCAGCAC
-CCAGTCTGAGCAAGACTGGCCTGGGACATAGCTGCTTCTTCTGTTAGTAACGCTGTTACT
-ACTTCCTGGGGTATCTTCCTTGGCCTCAGCTTCCTCTCTGAACCATGAGAGCATCCTGGC
-TCTGCCTCCTCAGAGGCTGAGGGGATAAGGGCGGAGGACATGCATTCTCTTGGCTGTGCC
-CAGTCTGGGCCACCAGCCATGCCTGTTCTTTCTCAGGCCTGGGGAGCTCGGTTGCCTCTG
-AACCCACATCTGGCACTCCCTCCAGGATATGAAGAATAAGCCTGCCAGGTCAGAGGGCAG
-ATCTATTTTGGAACCTGGGACCCCATAAAGACCCAGAGGACCCTGTGACCGAGAAAACCA
-ACAGGCCCCTCTGTGttttgttttcattaaacaagcacaacatgtccctcatagaaaagc
-cagaaaatacatattggcaagaaagcgaaaataaatgttgcctgtgctctcaccagccag
-aggcaaaaaccatagctaacattttggagttttttccccccaaataattttcctctgcat
-atagatgcatattttttttggtagattttctagcaaaAAAAAAAAAAAATCAACAAACAA
-AGGAATATTGTCTCAACAATTTTTTAATTTTCTTTTACTTACTTTGGATTTTTCTTCTGG
-AAAAAAATTTAGAgccaggcacggtggctcatgcttggaatcccagcactttgggaggcc
-gaggtgggaggatcgcttgagctcaggagttcgagaccattctggccaacatggcaaaac
-cctgtctcttaaaaaaaaaaTACTGAAATCTCCAGACTTCCAATTGGAATTTATGTTggc
-cgggtgtggtggctcatgtctgtaatcccagcactttgggaggccgaggcaggtggatct
-attgaagccaggagttcaagaccagcctggccaacatggtgcaaccctatctctactaaa
-aatacaaaattagccaggcttggtggtacacgcctataatcccagcgactcagaagactg
-agacacgagaaatgcttgagcccaggaggcggaggttgcagtgagccgagatcatgccat
-tgcactccagcctgggagacagagggaaactatttctcaaaaaaaaaaaaaaaaaaaTCA
-GACAAGTGCACAGGATAACAAAATACACCCCCATATAGTCATCACTCCAAGTGGGCCCAT
-GTTAACATTTTGCATATTTGTCTTCGATTGTTAAAACAATGAAATATTACAGGAAATGTC
-AGTATTCCTTATAACTCCTTCTTGGTCTCATTTTCTCTCCCACCCTGCCCataggttcat
-atctaggtatataaataatgtataatatttttgtgttctcaaaacttaagtatatgctgt
-tatactgaatgcgacgtcctgcttatattatattttccagattgatataaatgacacata
-tagatcttgtgaccaaggacattttcttttcactgctgtgcagcattgcattatgtaatt
-tttaactctttatccagtttttggcagatggatatttaaattaattcagttatcttgtta
-ttcctgacaatactgctattaccatcttatatgggaatacttgtgcttacaagcaagggc
-tcctctggggaactaatccaggcatgctcctcctgggtcgtggaatatatgtgctgccag
-cctgaggcagttgccaaattgtgctccaagtctctctgtcgagttaattccagtagggtg
-ccggggtctccatcgctccgcacccctgccatcccttgagatggtcatgctttacctttg
-ttccaatctgatggctgtgaaatcgtacatgtaattacatagcctgctttccctacttaa
-tagtatattacggaactattttcctgtgcagaatattgttctatatgtgggtgtttcaag
-gtggcataagctgaaagcctccattggggtgttgctgggattttcttaaccaattcccta
-ttgttggacaacagggtttgtttTtgtggtaggattgcaaaactgaccacagatgctacc
-cacccctataagcatgctcctttgcagtgtgactctgcagttctccctattaagaggcaa
-agttcacttctccactcccttaatgctgacttgggccatgtgacttgctttggccaatgg
-gacattttcaagcagaggcttgaaaagggcttgtgctctggggcttgctctcttgctgca
-cctggggccctgagaccaccatgtgaatgagtcctggctagcctgagggatgatgagaca
-cacttggccaagtcatcctgtcatcccagctgatactaaaccatccaccagatttgtgag
-tgaggccatcctagaccatctatctagcccagccaaactggtgcggaccagaagcaaagt
-ccagttggcctgcagagatgtgaaaaataaatgttttaagccactaaattttagaggtgg
-tctgttagacagcaagcctgatacaGTTCCACCCAGCATTTtctttgctcaaccagttac
-tggctgggaaccttgggcaagttgctgagccttagttttctcctcagtacaatgggggat
-tacatacgcactcctcaaagtcgttgtgaagattggatgagatggcacctgtCAGTATCA
-CATGGCGGGGACCCCATAACCAGGGGTTCCTCTTTCACATCACGGTGGTCTTAGATGTGA
-CCTGTGACCTTTCTTATTGCTTCTTGGTTCTCCCTGCTGCCTCTTTCTCAAAAATGTACT
-CATCCTTCCAAGTTTTCTGGAGAGTATCAACATGTAAGTGTAAATCACAATCCCTAGTGC
-TCTCCAAGACTTGCAGGTATCTCCTCCTTCCAGGGCCTTCCCTCTTGAAATTAGGCATAG
-Tggctgtgtgcagtggctcatgcctgtaatacaagcactttgggaggccgaagcaggccg
-atcccatgaggccaggagttggagatcagcctggccaacagggcgaaactttgtctctac
-taaaaatacaaaaattcaccgagcgtggtggtgcatgcctgtaatcccagctactcagga
-ggcggaggcatgagaatcgcttgagtctgggaggcggaggtttcagtgagccaagatggc
-accactgcactccacactccagcaagacccggtctcaaaaaaaaaaaaaaagtaaggaaa
-agaaaaAGAAAAGaaaaggagtctccatccagaccccaagagagggtttcgtggatcttg
-cacaggaaagaattcaaggtgagttgcagagtgcactgagaagagatagtttattgaaag
-ctactcagttacagagaaggatgtcctcagaaagcaagaggaagaacgcactgtctttgt
-tttaaactcttctaatgtaggagtcttatctaagtaaaagctaagttatgtctttgtgca
-gacagaccgacagtgtgacagaatccattaccgttgacttaaagaaagttatccttggca
-ttttagtaagtacatcagatcacgacagtaattgttttgaaagcataaattgttatgtga
-tattggaacatctgggcattttgctgtcgtaagagtttactcttgcaggcattattgagc
-agcttccttagccataaacatcttatgactgtgggctgtgattagcaaggaatgtgtctt
-gctagttttaagatagagttgattttaaaatggtgtcaccctagctctcctatgctcctg
-tttcccaaacaTAAtcccccctctacttaagagagaaccctaaatcttaaggggagatga
-aaggtgaaggtcatttttctgtaacttattcctgctgacagtggACGTTGTTGACCTTTG
-GGAGAGAGTTCTCTCATAAGAGTTTGCAGAGAGCCTTGTAGGGAGCCGGGGAAACTCTTC
-ACTTGAATGACATCCCGATGATTTGGTTTAGTAAGTGTAGGGGCAGATAAGCTGCCAGAC
-TATTttatctccgtaatcccatgcaataagtgcaacagaagtaaaaagcacaataaccaa
-tagcaataagtgtgacaacacgaagcatgctaaaaaggaatgccttccaagtgctgggga
-gctggccaaactgtgctgttatgacaggaagtcaattgctgaggtatgagtctctaggga
-gttcatggcctgagatatattatgagagtgaccaggaatatagacacagtgttcagtctt
-gatcaatgcacagattttcccagggctgctgttaatatgtttaaagccatatggctttgt
-aaggacatttgtcttattcgggacgtttcttctgtcagacgggtgatcaccagatgagtg
-ttgttgaaagccacagcagtatgttttgctagggctcccacctgcgattcaacgtctata
-gatgttgcttaaagacagaatatgggcacaggatataaccaccaaaaagtttgtttctgt
-tgcctatcacagaccttgactacttcccagttggtggagagggaatccagatgtgtaagg
-atacatcctagaaggtagggatgaccccaagtgcatcatccagtcaaattgtaaggtgag
-tatggccaactatgagacccacatgcccataaccattcccaaggggaaggatagtcacct
-aaccatagagattcattttgccatcccatccacatttggtcaattgaaaggagagtctga
-ttgcattgttggggtggcagccatccgatactatagatgttggtttgggggtggttactg
-ttgatgaaaagagtcgaactctgtaaaatatttgaagagacttattctgagccaaatatg
-agtgaccatggcctgtgacacagccgtcaggaggtcctgagaacatgtgcccaaggtggt
-tggggcacagcttgattttatacattttagggaggcatgagacatcaatcaaatacattt
-aagaagtacattgatttagttcagaaaggcgggacaactcaaagcggtggggggaaggag
-aggcttccaggctataggtgaacttaaacattttctggttgacaattggttgagtttgtc
-taaagacctacgatcaatagaaaggaaatgtttaggttaagataaaagattgtggagacc
-aaggttcttttgaagtctcatagtagctgccctcagggacaatagatgacaaatatttcc
-tatttagacctttaaaaaggtgctagactcttacttaacctcttcaggattgggagggcc
-tggaagaaaaagatgtagctatgttaatagagattctttacagatgcacatttgtcccca
-caaaggacagctttgcaagaccatttcaaaatatagcaaagaaacatgttttcgggtaaa
-atattttaattttcttccttgtctcataacattatgccagggtcaggtcggaaagtaagt
-cacaatatgtagggttaaataaaacccatctgaggagaatttatggtttgtagggcatga
-ctcccagaccccttagataggaatttggacaagaaaaaaaaaaatcagagcctagtcctc
-ataaccattatgccttccaaggcataagggtactttgcctgataactgaatttggatacc
-tgtcaaccaactgagtccatcatgtatggtatagcctaaggtagggatgctattaagtta
-tttGGGATTAAATGAAGAAGGAATTTCTTGGTTTCGGTGGAGGAAGGGAAGAAAGAGTGG
-TGTGTGTCCTTTTGGAAAAAGGAGAGTACATATTTTCTGTACTCAAATTAGCTGATTGGA
-TATGCCAAGGTAAGCCCGAGGTTGACAAAGTTTGTACCCATTCTGCAAACAGATATCCTC
-CAACTCTATAATAGAGCAAGCTCAACATTAAAACCAGTGGTCTTATTTTCAGAGCATCAC
-TTATCCACTGGATAgctttttctggaagagaagccgtagatccactattggctcacagga
-gtattctggaatggtgatccctgcaccagatgcctgtgggacttcatgagagacaggttt
-aacttgggataaatgtacccaaatatgtaatcccttaagtttaactgtagtaggagtgcc
-tggaagtacatggtagggctctttctattttggggaaagctgatctgcaggggatccctc
-cttccaaggtttcaatagcatgaaatctcctggTCAAacaggagagaatatttatgaaga
-tggtcctgacacatgtatactgaacaaacatgcatgtaacatatgactctgttcacctta
-aggtggagacttaatccttgccaggcatggtcttagatcctgtttataatttgaaatctt
-cttgctataaagtttctattctatcagtcttatgatctctgttttaatgttaatgctggt
-tggttgtgcccgaattccaagagggagaattgtacagcaaggtgtgtttgaccccccagt
-ccctcttcccatcatggccagaaccagttgttcaggatttttaaaaaattattatttcct
-tttgccaagagagaggtccattctgttgggtggcttaggatatttgtttatttattagtt
-taGTTTATGGTATcccattttgtcgaggtgccagaggcagtattgaaggctaagctttta
-ttgtgtcccatatcaatgctggggtggtgtcctacttgccctggtccattacctcccttg
-gtggaacacttatggtcaaggaacttagagtcaaaagacttatagccaatcaaatgttct
-aggccagatgggaatggaggtgagcaggcactcattaaccttaaagcctctttaagcaac
-ataagagccaaaaatcaaaagccagaaggcaaggtataaaattggcttatttagaaattc
-tatgcaagagctactataatcttggtttgtggcaattagctatacaaactcaagaattat
-gtttagctatttagggatctgtgtgcctgtccttgatttggagtgtcagaattaatttta
-ttcctcaaaactggcccttacaatctcatgtgatagtccctgggcatggaggaattgaat
-agtttcaAATTTTGGAGGTAAAACAAAACATAAGGCATTAACAACATTTTAAACAAAAGG
-TCATAAGCCCTGCCTAGTTTTGAGAGTGACAGGAAAGGAAGTTCACAGGTAGCTAAACAT
-TTAAATTATTTAGTATCAAGACATAGAATAAATTATATTATTTCAGATAAAGGCAAAATT
-ATTAAATGAGTCTTAATGTTTTTGAATACAGGActgcctctgtgtcttatggaagcagtt
-tattttgattgtcacttttgtctaggtctaaagatgagactttggtcaacttgagtttgg
-tgtcagatactggcagaagtcagtgccttcttcttttttgggacagagtctcactctgtc
-acccaggctggagtgcagtggcatgatcctggctcactgcaacctccacttaccagcttt
-aagcaattctcatgtctcagccacgcaagcagctgggattacagatgtgcacgtaccacc
-acacctggctgatttttgtatttttagtagaaatagggtttcaccacgttggccaggctg
-gtctcaaactcctggcctcaagtgatctgtctgcctcagcctcccaaagtgataggatta
-taggcatgagacactgtgcctggcagtcagtgccttccttagatgagatattggacccag
-aagtcaaagccctgtaacttaacagcacaaggattagttaatagCACCTGATAAGGATAC
-TTTTGAGGGGGATAGAGTGAGCCCTTTAATTGATGTTCTTCCAATATATGTAATTATCAG
-GCTGGAGGTGGTGATCCTGGAGTTCATGGTCTGACTGGAAGCTGTGAAGACTTACAATCT
-TCAGTGCTTAATTTTTATGGCTTTAGTAAGCCCCAGCAATATGACtaagtcagagactta
-atttaggattttgattttgaagatgtttgttaaagatgttaaaaggctcaaaacatttga
-tcaaaacagaagcacagatcatggtaaaatagcatttactcatttacccaaagtgatcat
-cgaaatactttaaaggcaatacagaaggttacatggatgtaaaaaccttaacccttttaa
-aatctcagtttctttagcaatgaaaaacctaataaagacagcatagaaattatcttgata
-atacataaaatctcagttttttaagccatctactaaaaaagcaaaaaagccctactgcat
-tgtgactacttttacttattggaagctcatttagataaccaggaagtcaaacttgatgaa
-aaaagtgcttgaatttaatcagacacaggaagactgttttcaaggttatgaatatagcag
-gggaatacacgactcctaggaacagcatgagaagttttctgattgcatcaaaaatttaga
-catatcaagaaaagccagtgtacagaatgcagttatactagaggaaaacattgcttttct
-agacctccaagatgcaatatgttagcatttggccataataacagttagaaccagagcagg
-gagaaagttatagaagctgacagaaaaattaaaggagagagttgttatctcaagcattct
-caaagggagaaacagctgaaagctgtttttttcaacagcacagcaacagttgaacttttg
-agatatgattctgagaagttttaaaaagaaaaaggttataaaattaaaggtaagatttcc
-tataatttatttaaagagcatatcaatatcttaagaaaaccttgttttgatgtaagggac
-caatttttagacaaattattataaataatttttttataactaatgatatgcaaaatccct
-tttacaaattcccctttatgacttacatagaccatctacgacatgcttggactctctgac
-ttgtcctgaacttccctctttgctaaacaatcagtcattttactttaggacaaaaattta
-ccatataagactctttttcatataaaattattctcttttctttataacctttcttaccat
-aaatacatcttcatatttataactttctttacatctctctctctcccctacctactggtc
-cctttctaccttgtttcataagtaaacattttcaagttcgtaatttgaattgaccttcaa
-ttcagataacttctgaattagacaaaattatttttttctcagtaatactagatcttGGCA
-GGCTTTTGGCCTCTAACATCACCCAGAGAGAAGCCAAATTAAACAACCTAAGAAGCAAAA
-ATCATCAAGACCAGAAGGAAAATGTTAAGTGTAAACTTCAAAGCATGTGAGCGTAGGGCG
-ACATGTGTCACTACTGAGGCACAGACAGCAAATATGTAGTCATCAAAAGGGACAAGGGGA
-TCAAGAAGCAGTAGGTGCTGGAAAATATCCCTCTGAGCCTCAAACAGTTTATGCATCAGG
-GTGACACTGCAACCCTGGGCCCCTAATGGCAGAAAAACGCCACACAACAGGGTGGCAGCT
-GACCAGAAGGATCCCACAACTCCAGGCTCCCTAGCAGACACAGCCCAAAGGATCCAACAA
-CTCTGAGTGGGGGGCTCCAACCCCTGGGCCCTGAGAATATAAAGGAACATGAGTGTCCCT
-GTGTCTCCTGGGGCTCAGAAGGCTAGGCTGAAAAGTGACAACAAAGGGAAGGGCACTCAC
-CTGCCTGTGAATCCaaaactggaaaaagcaagaaatcctgagctgtttgtcagatgttag
-cattttatagataaagccattctataattttagaaacatgctttcccatatcataaactt
-ttcttaattggaaataacccagacatctgatgagtaatctaaggaaagctgtggaccaaa
-attttgggtaaagtggtctttatggaagttaaaaaaaaaaagatttaaaaaaagatttaa
-agattttttttttaaaGCCTggctgggcatgatggctcctgcctgtaatcccagcacttt
-gggaggccgaggcaggtggatctcttgagaccaggaatttgagagcagtatggggaacat
-agtgagactctgtctctataaaaaattaaaaaaattagctgggtgtggtggtgtgcacct
-gtggtcccgaatacttgggaggctgaggtaggaggatcacttgagcccaggaggttgagg
-ctgcagtgagctgtgattgtgccaccgcattccagcttgggtgacaaagcaaaaccctgt
-ctaaaaaaaaagagaaataaagaataaataaaaGAATACATGAaattaaattttaaaaaa
-gccttttccactttttttccttcagtgtcaaatgaacttctaatgtttccatttcatcta
-gaactgactgaactgcgttaagaaaaataaaatctccaagtagacttgaattagtaatac
-ataaacagtgagtcttatctcaacaccagcagcttaataacagcagatttaaagcaggca
-gaaaagaaaagggagaaatagataagagagctttagaagCAATAATCAGAGGCAAGCATG
-GAAAGTGAAAGTAGCAAACTTCTGGGCTGGCCATACAGAGCTGTCATAAGCCTGCAGTAA
-AGCAAAGGTAACAAGCTGGGAAACGATGAGAATTACAGCATTCCCATACCTGGCAAAGGG
-GACAATATGGATTAGTTCATAGCAAACATCTTGCAAAGCTACTTCCATTTTTCCAAATAT
-ACCCCAGGGGCTCTAACCCCATGGGTCTTTGGGCCTCTGATCTGAGTATTATACCCCAGG
-GCCTCCAACCCTGTGAGTTGGGCCTCTGACTCCATGGGCCAGGCCTCTAGCCTGAGTTTC
-TAGGCAAGTGTCCTTGCCTAAGCCTGACATAGTACACCaagatggacctcacttaccaga
-agcggccaattggtgctgcagactgaatttcttttgcatagggtctcgtcttatgcttcc
-ttcatggtcgctaggaagatgttgccagaaaaggggccatgattcaaaccttaaaaaagg
-gttcttaggcctcacacaagatggaagtcaaggcgagtctcaaagtgcattgagaacaga
-tagtttattgaaagctactcagttacagagaagggtgttctcagaaagcaagaggaggaa
-cacattgtctttgttttaaactcttcttatatatgagtcttattcatgtaaaagctaagc
-tatttctatgtgagtggactgacagtgtgacaaaatccatgactctgttgatttaaagaa
-agttatccttggcattttaatgtgtaagtacaccaaagcatgactataattattttaaaa
-gcacacattgttatgtgacatggaaacatctggacattttgctgtctaggagtttgtcct
-tgcaggtattattaagtggcttccttagctgtgaatatcttatgatcatgggttgtgatt
-gggaaggaatgtgccttgctaactttaagatagagttgattttaaaatggcatcaccctg
-gctctcctatgcttctgtttccctaacaAAGGAATGCCCCTTCCCTCCACACCCCAAGCC
-CCAACCAGCGGGACCTGGAGGTAGGGAAGACAGCATGGGAAGCCCAGCCTGGATTGGAAG
-CAGCAAACATTTGACCATCCCAGCCACAGGGCATGCCTACCCTCTTCTCTCCCTGGACCC
-TGGCCTCGCCTACCGTGGCCATCCTGCTCCCACACTAATCAGAAACTTTCCCCTGGAAAC
-CCGTCCTGGGCCCAGCCTTTGTTTCAGGTCCTCCTCAAGCCAAAGACTTCCTGATGCAAG
-CGCTTCCTCCCTCCAGCCAGGGTGAATTCTGCCCTGTCCTTAGTTGGCTTTTCACATTCA
-CGTTTCCTTGTGATGCTGCTACTCCGGCTATCAGAGTCGGGGGCAGCAGTGCTGAGGCCT
-CCCACCCAACCCCAAGGTGGCAGCAACATCCTTCAAGTTCCCTCCTTCCAGGAAACCATC
-TCTGGCCCCTCACTTCACAGCGTCCTCCCTCCTGTTCTGCACCTGGCATTTAACACATAC
-TGCCCCAATCACTGAGGATGTTGTCACTGTTGGTAATACAAGGAATAACAGCACTGACAA
-CAATCACAGGGTCAACTATGGGAGAGCAAGAGGTTGAGAAAAACAGACTCTGCAGTGATT
-GGATCTGGCTCAtctgagcctgagttttctcacctgtgaaatggggtcagtgtagcatct
-accagccttgtgtagctgctggcagataaaattagatcaatatatatcaccatcagcact
-cagagggctcagtccctggGGACAATTGTGGTTATTATTATTATTATTGTTGCTGCTACT
-ACAGGGAACACTTGCCAAGGCCTTCCTGTGGGCCACTAACTGTGCCCCCACTCTTCCAGA
-TTCACACCCAAAGGAACAGggtgctatgatacccattttgtggttgagaaaaactgagtt
-ccatcaaagtgaggagatgggttcaaggtaccacagttgggacctgaaaagccagCAATG
-CACTAAAGATGTGGGTGACACAAGGCTTGGACCCTAACAGAGCAGACTCTGAGCCCTGAG
-GGTGGAGATCCCAGCCTAGTTCACACTGCTGCACAACCTGGCTGCAGGAGGACAGCCAGT
-CTTGgggctctggcctcggacaacctgggctaatccttccaccttctagctgagtgaacc
-cgggaacatcacttaaccttcttgagctcagtttttgcctttggaaggtgaaataatggt
-ctctaccatgcagggggtgggggaggattagatgggtaagtggatggaaagcttgagccc
-agagcctatgcacagtgggctgctcaggaaggtagAATCATGCAAGCCCAGGCCTAGAAA
-TTCTAAAGGGCAGGCACAGGTTCCCCACAAACATGACCTTGGCAGAATCCGTTTCTGAGA
-GTTGGCAGCAAGAAGAAGTTGTATGGATGACAGAAATTCTCAAATTTGCCTATTTTCTTA
-AAGTGGACATTTAAAAAATTCCACATTGGGGCGGAGGAATGTTCTTAGCCCAGGGATTGC
-TATACATAGGTTCATGCATTTACTATGCGTTGGTTCATCTAAGCccaacctcagggtctt
-tgtatttgctgctccctctgcctggatcactgtttccccagtgggtctcttcctaacatt
-ctagtctaggcttaactatttgcccttcaagagatcttccctgggcaccctataaaaatg
-catccttcacataaactctttctccttttccctactttgtttattcatgctgcttttact
-atctggcatcatattctaaatttatttgtttatctgtttgttgactgccttcttgtctta
-gcctattcaggttggtataacaaattgtcatgaactgggtagtatataaacaacagaaat
-ttgggctgggcacagtggctcaagcctgtaatcccagcactttgagaggacaaggcttga
-ggtcacgagtttgagaccagcctggccaacatggtgaaactctatctccactagaataca
-aaaattagccaggtgtagtggtgcacacctggggtcccagctacttgggagggtgaggca
-gttgaatggcttgaacccgggaggtggaggttgcagtgagccaagatcgagccactgcac
-tccagcctgggcaactgagcgagactccatctcaaaaaaaaaaatttaaaaataaattta
-ttttcacagttctggaagctggaaagtctaaatcaggtcatgggtagattagatgcctac
-tgagggcctgctttctggctctgggagacttttagctgtgtctgcatatggtggaatggg
-taaggggctgctctggggcctctttcataagggcactaattccattcatgagggctccac
-tcccatgacgtggttccctcccaaagtccccacatcctaacactatgacatgggaattaa
-gtttcaacatataaatgttgggaagacgcaaacattcagaacatagcactttcccattag
-attgtgaggataaggactatatctaagccattcacttctatatccctgttgcccactata
-tacctagcatacagtaggtgcttaataaatgtttgaaaaatgggtgaatGAAATATTGTA
-CTTTCTAATTcaagcattttctgagcacctactgtgcaccagggcctgtgctatgggctg
-tatatacagaaatacatcagtgagagtcctcagccctAAGGCCATTGGTCTGAAGAAAAA
-AGAGAAATTGCAACAAGTGCCATAGCAAACACAGCTGGGAAATTCACtgatgtagtttgg
-aggtgtgtctctgctcaaatcatatattgaaatgtaatctgcagtgttggaggtagggcc
-tggtgggaggtgattggataatggaggaggatttctTTTTTTATATCTATcaggaatgca
-aaattaatttaataatcgaaaattactataattcacagactaagacaagaaaagccatac
-gattctctcaccagttgcagaaaaagcatatgatagaattaaacatctttttatgatttt
-ttaaaattatactttaaattctgggatacatgtgcagaatgtgtaggtttgttacatagg
-tatacatgtgccatgttggtttgctgcacccatcaacttgtcatttacattaggtatttc
-tcctaatgctatccctcccccagccccccaccccctgacaggccccagtgtgtaatgttc
-ccctccctgtgtccatgtgttctcattgttcaactcccacttatgagtgagaacatgtgg
-tgtttggttttctgtccttgtgatagtttgctgagaatggtggtttccagcttcatccat
-gtccctgcaaaggacttgaactcatccctttttatggctgcatagtattccatggtgtat
-atgtgccacattttctttatccagtctattattgatggacatttgggttggttccaagtc
-tttgctattgtgaatagtgccacactaagcatatgtgtgcatgtgtctttatagtagcat
-gatttataatcctttgggtatatactcagtaatgggattgctgggtcaaatggtatttct
-agttctagatccttgaggatttgccacggtgtcttccacaatggttgaactaatttacac
-ccccaccaacagtgtaaaagcgttcctatttctcatggaggaggatttctaatgaatggt
-ttcacaccatctccttggtactgtccccatgatagggagggagttcttgtaaaagctggt
-catttaaaagtgtgaggcccccaccgcctctttctcttgctcctgcttcaccaggtgatg
-tgcctgttccccctctgccttccaccaggattggaaacttcctgagacctccccagaagc
-tgatgccaccatgtttgctgtgcagcctacagaaccgtgagccaattaaacctcttttct
-ttataaatgacccagtctcaggtatttctttctggcaatgcaagaacagcctaacacaTT
-CACCTCCAGCTACTGCAAGCATTCATGGGGATGAGTGAAAGGAAGGAGAGAGGTGGCTGC
-TGTGTCGAGGGTTTGCTCTACGACAGGATGGTGCACTTGCCACCTCTGGCTCGATCCACA
-CACTAGcccattttacagattaggcattgggaactcagagaggtgaagtgacttgaccaa
-aagcaaactcatggcagaatgaagactgggaccagggaggcctaattccaaacattgtgt
-gttacctcctctaccacaaggcctctctTGCCCAAGAGAAAGAATAAAGTCCAGCTAAAG
-TGAGCTCAAGCAAAGAAGATATAGATATGTAATTATTATCATTGTTATTACTATTTTTTT
-ctcatgtaacagatacatcaaaaagtagaagccttcaggcatggctggatctagggtctc
-aaacactatcactagaactgctccattcttagAGAGGCTCTCAAGTCAAAGTGACAAGAC
-GGCTGCCTGCCATGCCAGCCTCCCCTCCCCTACTCCCAAAAGACCAAGTCCAGAGGGAAA
-AAGAATGCCTCATAGCAGGCCGTTGAGGTTGGCTAATCTGGCACCCATTCCCATCAGCCT
-CTTCCTGCTACAAAGGCTGTGCAGCCAAACGTccacctttctgaccctcctgcagctggg
-tggccacaggacacagttctggtcaatgagacataagctgaagtttgtggtgagggagag
-cttttgctcctctgataacaggagcagttgtggccagagctgccccttcccatgttgcct
-tgatcacagacatgatatttgaagcacagaccatcttgcaaccaggaggaaaggctgaga
-aaaaaaaagtcctcactattttttagccatgacattgttaagttgctggactcctaactt
-cagacttcttcctaagagaaaaataaacttccaatgttcaagccactgcattaaattcct
-tgttacttgtagctgaaagcattcctgactaatacaACTCTCTGTCTCAGGTCCCTATAA
-AAACCCTGGGAAGGCATCATATTGGTTCTAATGGGGTCATGCTGTCATTCTGCAATGGAC
-TGTGGTGGCCAGCAGAGATGGGATGTGCCAATTGACCACTCCAGTGGCCACCCTTACCAC
-ATAGGCTTCGAGTGGGTAGGGTTGTTCTCCAGCACAAAAGTTAGTAGAGTAGGGAAGTGG
-TGGCTACACTCCCTATACCTCTGAATCAGTGGAGGCAATAAATTCCCTGTTCTTGGCTTA
-AAGTTTCTTCCATCGTTTCCAGGAACATGAAGATATTGACTTATTTATCCTCCAGGATTT
-TTATTTGGAATGTGAGGGGAGGATAATTCAGTGAACAGTCCAAATAGGGGATCTTCCTGG
-GAAAAAAGGACAAGTCATAAAAACTGCATTGAATGCCAGTGTGCACAATGTCCTTTCTGT
-GCCCCAAGACAGTCTCCCTgcatgagttcttgagccagacagacctgagttcaaacccgt
-ctccatcatgcaagtgcgtgggcagcctcgccatgtcacctcacctctctgcacctgcgt
-ctcTAGAACCGGGGGTGGAAGGACCCACTTCAAGGACCCAGTCTTCAAGAAAGAGTGGAC
-CAAGTGCCTCCCCCATGGTGGCCCTTTGACCAGCAGCAACACCCAGAGTGCTTTCTCTGT
-GAACCCTTCCCTGATAATCCCAGAGTCCCAGGGAGAAAATCTGCTCCCATCTGAAGCAGG
-AACCATCCAGCAGTGAGTGaacccactgccatttcctcctgccatgtggctaggccatat
-tccacagcctcccttgcagtcaggagtggccacgtgccttagttccaatccactgcactc
-cttcccctttgatgggtttgatgcacacaggtctgaagacctcagcagccacagtggaag
-atggcagagctgcaggacaccaggagcttgggtcctgaaatctttgtgcgctagagctgc
-tcacttaccaggggcacccatgttgggcttttggtgagtaaggaaaaaacctctttggta
-tttggtgcatggtgcctcttgggcttACGAACGTTACCCACATGCACCGCTTGGGGGGCA
-CCTGTAAAAGTCTGCAGGACGGTCAGCCCGGGAGGACATTCCATGTGGGCACCAGCAAAG
-GCAGAGGGTGGGAGGTGAGGAGGCCTGAAGAGCCAACGGCAGCCACACTGTGGTGTTGGA
-ACCAGATTGTCCTTCAGTCCTCCCGCCTTGACTGCCAGAGAGCAGCCCATGATCACCATC
-ACATCAAGCCTGCAGGCAGGGTAAGAGATTAATAACAATACTAACAACAGTaataatagg
-aggctctgccaatattcaagagaacttaccactcaccagctgcgggctggtttcttccta
-ggcctgatctcatttaatcctcaccatggcccagcaatgaaggccctactgatgtcagtc
-ccattttacagacaagaatacagaggcccatgaggcgtcggaggacattctccaaagGGC
-ATGTTCTTGAGCTCAGCTTCCTTCCAGCACAGCCTTTCATCAGGGCTTGGACCTTCATcc
-cattatatgtccagcattattcataggctgaggacacagaagtgaacaaagtagatagaa
-atctggacctcgaggggctgcgactctagtgggagaaaatgggcaataaacacacaaaca
-cgtaaatatacaaaaggagtttggtgaaggatgagtgacatgaagacagcaggtcaggat
-gctgcggtgggtgaagggaggaggtggtgctgtgcatcttgaggttggaggaaacctctc
-tgacatggagctgaaagtgctgcagcaaacgagtgagccacgtgaagatctggggcaggc
-tgttcctggcagagggaacagcaagtgcaaagtgcaagtgctacggccctgaggctggaa
-ggagcttgtcatgttcaggaacagaaaggagagagcagtgtggctggagtggagtgatgg
-ggggtggggagggatgaggctgcagagggagtgggttgggacaagTGGCAAGTTTTGGTG
-GGCAATGGTGGCAGGGGTAGATGATCCTCCAAAAAGACTCATCTGGATGCCAGCTCTGGG
-GGGTGCAAGGAGGGTATTCCAATGAGGAGAGGAGACAGGGGTTTCAGCCCAAATTTGCCT
-CCCCACTCTCCACTTGACTTAAGCTGCTCCCctctcccttcctttctctcattccctctc
-tctttttctctctctcCAAGTGGAAGCTGGATCCCTAGGGAGGATGAGGCCCGGGCTTGA
-GTCCAGGCACCAACAAGAGCGCGTTCCCACCCTCCCGAAGGTCTGATGTGGAGCAGAGGA
-AAAGAATGGTCCTGATATCACcggaaaaagggtcttatcccatatcgcaagagtgggttc
-ttggatctcacatgggaaagaattcagggtgagttgcagagcatagtgaagttaagatag
-gattagagactaatcaatgacagagtagggcatcctcagaaagcaagaggagaacgtacc
-catttcaagtaccagtgcttgcttatataggcagttaagagtagtgtactctgggctcac
-ccctgtaatcccagcatgttgagcggccaaggcgggcggatcacttgaggctaggagttt
-gggaccagcctgaccaacataatgaaaccctgtctctactaaaaatacaaaaaactagct
-gggcatggtggcctgagcctgtggtcttagctacccaggaggctgaggcaggaggatcgc
-tggagccccgaaggtccaggttgcagtgagatggtgccactgcactccagcctgggtgac
-agagtgagactctgtctcaaaaaaaaaaaaaaaaaaaagaagagtagtgtattctgttac
-aaaggcttatgatcagcttgtgacaggctactagtattgctactttcctatgttactatt
-gattttagcaagaatttatgagtgtactattatctttaaagcaaaacctaTTATTTTATT
-TTTATTTATTTATTTATTTATTTtttgagatggagtcttgctccatcacccaggctggag
-tgcagtggcgcgctctcggctcgctgcaagctccacctcccgggttcacgccattctcct
-gcctcagcctcccgagaagctgggactacaggcacctaccaccacacctggctagttttt
-tttgtatttttagtagagacggggtttcaccgtgttagccaggatgttctcgatctcccg
-acctcaccatctgcctgcctcggcctcccaaagtgctggaattacaggtgtgagccaccg
-cgtccggccgaaacctgttcttaaactaagaatttttttttgttcttaagatattgggac
-attttcataagttctgcgtctttaagtaacatcattaactcgttccctcaaccatgaaca
-tcttgtaaccaagcacgtccacgcccctggaaatgtaacccagcaggtttggcttttctg
-cctttattcaatatggagtcagtctggttaggatgcctttgTCCctgagagtcagtgccc
-tcacagcccctgcccggcctctaacttgctgtgtgacctggagctgatcattcgctctgg
-gcttcccttttctcctctgtttgaggagggagctggtctggtgccaccattttccagctg
-tctgtccttaggcaaattattcagcatccctgtacctcagtttcctcatccatgaaatga
-ggatggcccagttccaggcttacggtgaggattaaatgCACAGTGCCTGGTCTCAGTGGC
-TGCTGGGAATTACCATCATTACTGTTGTTTTGCCATTCTATTGCTATTGCCAGTGTTGCT
-ATTAGTATTCAAAATGCAGATTGGTggctgggtgcagtggctcatgcctgtaatctcagc
-actttgggaggcagaggttagaggatcgcccaggggttcaagaccagcctgggcaacacg
-gtgaaacctgatctctacaaaaaaaaaaatacaaaaattagccaggcatggtggcacgta
-cctgtagaccttacctgaactcaggggggttgaggctgtagtgagctgtgatcgtgccac
-tgcactacagcctgggggacagagtgagacgctgtttaaagaggtttattctgagccaaa
-tgtaagtgatcaagacccgtgacacagccctaagagatcctgagaaaatgtgcccaaggt
-ggttgggttatagcttggttttatacattttatgggtacagaagttacaggcagacatta
-atcaatccatgtagggtgtacattggttttgtcgggaaaggcaggaagcttgaaaagtgg
-gcggcttccaggttataggtgaattcaaagattttctgatcagcaattggttgaaagagt
-taagttattatctaaagacctggaatcaataaaaaggaatgtctgggttaagataagggg
-ttttggagaccaaagttcttattatgcaaatgaagtctgcaggtagcagccttcagagag
-aatagagggtaaaggtcccagactctttgttaaatctctcctgcatcaggaaaagacctg
-gaaagggaaaaggattctctacaggatgtagattttctctacaagagacagagttgtagg
-gccatttcaaaaatatgtcaaagaaatatattttggggtaaaatacttcaatttctttca
-ggtcctgctatctgttgtgtgatgctatatgaggaatttggtatcttattgctacaaaga
-gcatgctttgtcagtcttaagctctctctctctttttttttttttttttttttgagacag
-tgtctctctctgttgcccaggctggagtgcagtggcactaccttggctcactgcagcctc
-cgcctcccaggttccagtgatactcctgcctcagcctcctgagtagctgggattacaggc
-gtgtgccacctcgcctggctaatttgtgtatttttagtagagatggggtttcaccatgtt
-ggccaggctggtcttgaactccgaccttaggtgatctgccgccgtcttggccttccaggc
-gtgagccaccacgacctgccaagctctctgttttcatgataatgctggtcaactgtgcct
-gaattccaaagggaggagggtatgaggcatgcctgatccccactttccatcatggcctga
-actagattttcagggtttgttgggtcccgttggccgagagggaggtccattcagtcagtt
-agggggcttgtaattttatttttggtttacaGTTCTGAGGCCCCTTCTGGCTTTCAGACT
-GGCCTGGTTGCTTCCCATCTGGTCACCTCTCTGTCAGTGTTGGGGATCAGCATTCATCTA
-CCCCACGGATGTTCTGCCTGGAGTGGGGGTGGGAAATGGGACTGGACCTCTCGCCATGGG
-ATGCAGCCAGGCCCTCTCTGCTCAAGCCTTCCAGTGCTCCTCACCCAGACACCCTTCTGC
-AGGGACCCCAGTTTTACTCCCCTGAAAAAGAAAGTTTCCATCAGTAGGAGAAGACAGGAC
-CTGAAATTGTCCCTGAGCCTACATGTCTACTAGGGTAGATATTTTGAAAGCCGGAGAGAG
-GAGGAAGCAGACAGGAAGGAGACGAAACCCCAGGACTGTCTGCTAACTCCAGGAGGACTG
-GTCTTCAGAACCCAGGGGCCCTCCGCATTCCTTCTGCCTCCCTATCTCATCGTAGCTCCT
-GCCCCATCCCCCCACCACTTCTCTCCCCTTTCCTAACTGCGTGCCCTTCTCTCCTCCAGT
-CCAGCCCAGCCCTACTGAAGAACAGCAACTTGAGCTGGTCTTTCTGTGCTCCGCTTGATT
-AAAATGTAGAAGGCACCTCTATCCAGAAGACTTGGCTTGGCCCTAATCACTCCCAGCCCC
-CTTGGCTGAGTGGCCACCCGCTGCTGGCTGCTGTCATCCCACATTGGAAGTGACGGAGGA
-GCAGAAGAACGAGTGGGTCACCAGCCGGTCTTCAGGCTCCCGGGCCAGCATTCAGACTGG
-GCAGGAGGTTTGTGGGTGGAAGGTGAGTTGGGCAGCCCGTCAGCCACTCCTCAGGGCTGG
-ACGGAAatagtgattaggagcatggggtttgatgtcagatggcctggggttgcagcctaa
-ctttgttatttactatctgtgagttaagccctctgggtttcagtttctccatttgtaaaa
-tgggactgatattggaagatgtcctacttagaatggcgcctgagccatcgtaagccctca
-gtgaatCCACTGTAAGACTTCAGCCCCCAGACTCCCACTGTTCCCTTGCCCCAGCTTCCC
-TGCACCTCTCCTGCCACTTCCCTCAAAGTTGCTCTCAGTCAGGCCTTGGGAGCCACAATC
-TGGGAACGAGGACCCTGACATCCCTCTTCACAGCTGTACCCAGCACCAAACAAGTCATCA
-GAGGTTCAAAACACGGAGCCCCTACCATGTGCCAGGCACGGCATGGCATGCCTGCTCTCT
-TTCTAATTTTGATACCGCAATGATTAATTCTGTGAAAAAAGTTCTAGAAGGATATAAGGC
-AAAGAATTAGGTTGTGTTCCGTCCATTCACTCACGGCTCTGCTCCCACGCATGGCTGCGc
-tatgcacactgccctgcagcttcctttgtctgctgcacaatgggctctggacggagccct
-gttggcgcaatgagtgagccctacatcaagcttcgtcatcgctgcatcgctttgcaccgt
-gtggctgggccgccatcagtacagccaactgcctctgatggacatctgggctgcagccag
-attcctcctaacagggcttcagggaaagtcctcctcagcgcctctttgtgcgcatggcac
-atttctctaaggcaggtttctggacatgagactgacgggcagcatgtgctccttacattt
-gggggtcctgtcaatcccctcctctcccgcaggctgttctagactccagcccccatgtga
-gaggatgcctgttgcccTCACTCTTCCATCCTGGCAGTCCCCAGCCTCCTTGCCTCTCTT
-GTTTTCTTGTTCCGATCAGTTCCAGGTGGCCAGAGGGTCGAGACTCATCTCACAGCCGTG
-CAATAGATGCGTGTCTCTCAGTCGGTCAGCTCTGGCTGGGATCAGTGTTTATCTTCATGT
-CGGTGGACACCATCACAGGCACCCGCAAGAATCAGCGATCGACGGGGAAGAGGTTTGGGT
-GCATGGAGGagtgctttgcagtgagggctttggagccttgtgccctgattcaaatcctgg
-ctgtgtcccctgccggttgtgtgacttcggataaattacttgatgtctctgagcataagc
-tgggtcatcagaaaagccaagctagtaagagcacgtagctcagaaggctgctgtaaagtt
-cagatgagttgatatatgctcagtgctggaaagggtgctgggcacattagctgttggtat
-tattTGGGCACCTCCAGCCCAAATAATAATAAAGAGACTAGGAGGGATGTTGGGAGATAT
-CAGATGTTGCTCATTGGAGGCTGTACTGAGTGTGCAGAGAGCTTCAGGGAACCTGGAGCT
-TTGAGAGGTAAAGGAACGTGCCAACTGGAACTAGAAACCCACTGCCGCCTGCAGCTCTCT
-GGGCTGTTTCTCCACATGCACCGTGGGGTTGTTCGGGTCCCACTGGGGAGGGTGGCTGGT
-ATGAGGGTGGCCTGGCCTGGATGTGAAGTGGGATTTCCAAGGCTGGCACTCAGTCCAGAG
-CACGAGCCTTGATGAGGAACAGATGCACTCACAGTCTGGGGTCGCCGCCCTCCCCTCCTC
-CACAGCCCAGGGTTGGGGTGGCGATAGCTTCCAGATGGGCTTGGCTCTTAGTGGGGCCTT
-AAATGACTCCCTCTGAGTCCCTGAGAGGTGGGACTTAGGGCCTCTTCCTTGGTTCTCAAC
-CCCCCTGGCCCTGGGGGATACCTGAGGTAGCTGGGTTCAGGCCAGgtgaccttgggaatg
-ccagccctgctccgagcctcagtttccccatctgagaaacaggcattCTCCATCAAGCTG
-GCTTGGCAGAGCCACTGTGTCCTGTGATAGCTAAAGAGAAACATGAAGGAGGACCAGGAA
-CCCCCAGGAAAGTAGGGTTTCTTTGGTTTTATTTTCTTTTTGTATTTACTTTCTGAATGT
-ATAGTACATATCCATAGCATAAAATTTCAAAGGTACAAAAGGGGTCATAGGTAACAGTAA
-GCCTGTCTCCCACCCCTGCCCTCCAGACACCCAGACCCCTCTTCCCCGAGGCAAAAACCC
-TGTCACCAATTTCTTGAGAATCTGCCCAGAGATACGGTATGCACACATAGGAAtttttta
-cccagtgatgacaaacttcacacacagtatttcacactgtccttttgttactttaacaat
-accctttagagatcttcctatgtcactccataaagtgcttcttttttttttttGGATGCT
-TGGCGAAGATGGTTTCAGAATATTACACAACTTTCAACTGACCAATCAGGATGGGCCCGA
-GCAGTGCACAACCCTACAGTAGTATATGGCTGCTAGCTGGATGCCAGCTCTGTGTCTTTA
-TGGTTCACCATTGCATAGATGGGCCAATTGCAGGGAtgggtaatttataaaggaaagagt
-tttaattgactcacagttccttgtaactggggaggcctcaggaaacctacaatcatggca
-gaaggggaagcaggcacatcttacatggcagcaggcgagagagtgtgtgaagaagcaaag
-ggggaagagccccttaaccagtcttcaagagatgagcaggggctgtttccaacattttgc
-tctttaaaggaaggttgcaatacatacccattttgtacatttgtaggagaatatatgtag
-aataactttctagaagtgaaattgcATTTTacatccatatgtttaaaaaaatatcaattt
-ccaccccctgccatatacaagaattaacttgaaatctaccataaatctaaacgtaaaact
-taaaactgtaaaacttccagacagcaacatggaagggaaatctttgtgaccttgagttag
-gcaaagatttttttaggtactacacaaaaagcataaaccgtaaaagaaaaaaagataaat
-ttgacttaatcaaaattcaaaacttctgctcttcaaatgatgctatcaagaaaatgaaaa
-gacaagccacagattaggtgaagatatttgcaaaagtcatatctgataaaagactcatat
-ccagaatatatattgagtgctttcacaactcaataataagaacaaataatccaataacaa
-atgagaaaaaggtttaaaaagacatttcacccaaaaacagatattgatggcaaaaacaca
-catgaaaagatactcaatgttatcagtcatcagggaaacatatattaaaaccacaacggg
-ctaccactacatacctgttagaagactaacatgaaaaataactgataatacctggagagg
-gtatctaacaactggaacttagaaaaacagtttggtaatttcttataaaatgacccagct
-gtcctactcttaggtacaaagagtaatgcaagagaagtttgtgttttaaaaagaaaaact
-gtaggcaaatatttacagcagcttttctcataatcaccaaaaactggaaataacTGCtgt
-atgagtctagtctcacacagctataaagagactactcgagatgggctaatttataaagta
-aagaggtttaattgactcatagttctgcatggctgggggggcatcaagaagcttacaatc
-atggcagaagggggaagcaggggaagcaggcacgtcttacatggcagcaggtgagagagc
-gtgtgaaggaggtgaaggggaaagagtcccttttaaaaccatcagatcttgtgagaactc
-actcactatcttgagaatagcatggaggaaactgcctccatgatccaatcacctcccgcc
-aggttccacccttgacatgtgggaattatggggattacaatttgagatgagatttgggtg
-aggcaggaggatcacttgaacccaggaggcagaggttgcagtgagctgagatcgtgccac
-tactctgcagcctgcagacagagtgagactgtctcaaaagaaaaaaaaaagaGGTaaaca
-ggtaaagaaaataattttagatcatgataagagttaggaagaaaacattttcaaggcact
-aaatagagaatgatttggagggggtacgatatttaaagaaggttatcagggaaagcctct
-ctgaagaggtaacatttgaactgagatgtagagggagagaaggaactagccatgtggaga
-tctgggggaggagcattccaggcagaggggatagcaagtgcatctgaagaggtaacattt
-gaactgagatgtagagggagagaaggaactagccatgtggagatctgggggaggagcatt
-ccaggcagaggggatagcaagtgcaagggccctgaggccagaatgagtttggtgttttta
-atgaaagaaaaaggccagtgggtggggcaaggaggagagggcaggaggtaaggtcagaga
-aggaatggggaaAGTCTAGCTTGCACCAGCCCTGACATGGGACGAGACACCCTCTATGCC
-CTCGGTCCTGGCGGCTCCTGCTTCCTCCTTTGTGTCCACTCAACATGATGGGTGGGCTTG
-GCCATCCGCAGACCCCTCTTGATGCCCCAGTACCTTCCCTGCCCCGCCCGACAGTGAGGT
-CCAGCCTCCTGAACAGCTCCTCTTGCTTGTCATTGGATTAATGGGCAGGAATTGCTTCTG
-CTTTTTCAAAGCCATTGCCCCCTACCACAGTCCCCTAAGATCATGAAGGTGCgagcaatc
-atacttgaactgttggatgatgaatgcatcactgttgatgtggaggaggctccccagtgt
-gaggactcagagcagggtctcggcctctcacagacctggctgtgtgcttggctccacctc
-ctacgacctagggccctgagcctcagttgcctcacctgtaaaatgcggcaaacaagcaag
-caacaagatgctcaacctcagtagtagtcggagaaacaagagctaaatagcagtgaggca
-caccctttacctccattccctggattagcaaatagtagagtcaggaacttccaagtattc
-atgagggtgtgggcgatgggaattccatgttctgctgctgggtgtttggactggtttagt
-acctaagagcctaagaaagagtatatctgatgacccaggcattttcctcttgagtgtata
-ccccagagaaattctcctgcagctccagaagGAGCCCATTCGAGGTCATGGGTCACTGTG
-ATGGTGTTTGAGGATGTGAGCAGTAGGTGAGAATCCATGTAGATGCCAGGAAAAGCAAAC
-TGCAGGGGCCTCTAAAAAATACCAGATAAGGGATgagtgcggtggctcatgcctgaatcc
-cagcactttgggaggctgaggcaggtgcatcatttgaggtcaggaattcaagaccaacct
-ggccaacacgatgagacccaatttctactaaaaatacaaaaattagccaggtgtggtggt
-gcgcacctattatcccagctactgaggaggctgaggcaggagaattgcttgaatctggga
-gactgaggctgctgtgagccaagatcacaccactgcactccagcctgggcgacagagtga
-gactccatctcaaaaaaataataaaaataaataaataaataaatacaagaataaaatgaa
-taaaaaaccagatgaaaaagaaaaccaaaaagtaaaaataaaaaACACCAGGTGCATGAG
-AGAAAAAAAAAATAGAAGACGGGGAAATCTGTAGCACACGACCATTTCTGTGAttttttt
-tttttttttttttttttttttttttttttgcgacagagtctcactttttcgcccaggctg
-cagtgcagtggcgcaatctcggctcactgcaacctccgcctcctgggttcaagcgattct
-cctgcctcagcctccggagtagttgagattacaggcatgcaccaccacgcccagctaatg
-tttgtatttttagtaaaaacggggtttcgccatgttggccaggctgaactcgaactcccg
-acctccggtgatccacccgcctcagcctttcaaagtgctgggatgacaagcgtgagccac
-caggcccggccCATTTCTATGAATGAAAAAAACTCACAAGCTACAGAACATCCCTACACG
-CGTTAAAAGGATTCACACACATTCAAGCCCAGAGAACAGACTCACAGGAGCAGATGCCTG
-GGGGGAGGGGGAGGGGAAAGGGCAGAAGAGCATCAAGAGCGAAATCCAATTCAATCCAAC
-TGTGCAACAGACAGTTTGCAGAATTGATGAGGATGTTTAACCCAGGTCTTGGCACCCTAA
-GTCCAAGTAAAAAAATAAATACGATACAGCAGGTAAAATGGGGGATGATGGAAGGGtggc
-gatagtagtgcctttctcatggggaaccctcgaggctccgatgagcgaaaccatgcagag
-tgctcagccaggtgcctggcacgcagcaagGTGTCCGGTGCACAGCAGGGCCGCCCAGCT
-GTGAGCGGTGCGTGTATTCTCTCCAGCCTTGAATTCAGGCCTGGCTCCTTCTGCTTCCTG
-GTCAGTGCCGCTCTCTTGTGGCCCATACAGTGACAGGACTTAGACTGAATAGAGATCTGC
-CATGGTCCAAGGTATCTGATGGCGCTTCGGAGGAGGGAAGGGAGGGAGTCACATGGGGGA
-GATAGGATCACCAGAGGCAGATGGGATCACAGGAGGGAGATGGGGTCACAGGAGGAAGAG
-TGACTTCCGATTGGGGAAGAGATGGCGGATCAGATAAGGCCTCCTGGAGAAGGAATGTCT
-AGGCTGAAGGACAGATTCGACTGGGGGTCAAGGGGATTGATGAGCAAATGAAAGAATGaa
-tggagttagaatattgagcatgagcattacttagccctactgtgtgccaaggctttacat
-gcctcatatcatttcgtcctctaccacccctgggaaggcgacttattgcttctgtctcct
-ttgcagctgcaaaaagggaggctcagtgggttagcgactcatccaaagtcaagccgccag
-ctgcacatagagctctgatacacacccaggtcgtgtgactTGCTGGGGGACTCTATCTTC
-TCCACTTTGGGGTGGACTGAGGGACCCCAGTGAGCATAGGTACAGACCACCCCTGAGTCT
-GTCTGGACCATGTGTTAGCAGAAGTTTAATACTACACCTGTGCAGCAGGTGGAGATGGGT
-GGGACCTGTGTGGACGAGAGGAAGTGGATCTTGGGACAGCTACAGCATGCAGCGGCTCAC
-CCCAGGGCTGGACCCTCACTCTTTGGCAGGCAGCTGGGGCACCACACCCAGGGGTTAAAT
-GTGGAGACTCACTTCTTAAGCTAAAGGATGTGTCTGTCTTCAAGGCACTCTCCGAAAAAT
-GCCTCATTTTGGAATTTATGTCAAAGCCATTTAAATCCTTATTAAGAGTATTTAAAGATC
-AGTTTTCAAAATGTCTCCTAAGTATTTCATTTTTGTTTTTCTCGACTTGGTAGTATATTC
-CCATGGCTAAAAATTCAAAAGGGACCAAAGATAAAGGTAAGcctcctctctttccatcca
-ctctaacctctccccacccagagccatcactgttactggtttctagagtgttttgtcacc
-tgtaggttttgtgcattcatgaatcgtacacacgtgtattttccctccttcccgtccccc
-cgcgtgggggcttactatgcgcgctgttctgcaacttgcttttttcacttggcaattcgt
-ctcagggactgccccgtcattgtgtcaaatccttcctcgtggtgcttctcggccatgcgg
-tgttgcactgagtgctgtgacattgtatcgcaatgcctgtcctctagatatttaggatgt
-ttccagcattttgtgatcatacacaggactgcagggaacagctgtgtaagcaggtacact
-tgttctgcagcatgtgggccaggctaattgttatttatttatttatttatttttgagaca
-gaatctcactctttcgcctaggcgggagtgcagtggcgctatctcagctcactgcaagct
-ctgcctcccaggttcacgccattctcctgcgtcagccttctgagtagctgggactacagg
-tgcccgccaccgtgcccggctaatttttttgtattttttaataaagacggggtttcacca
-tgttagccaggatggtctcgatctcctgacctcgtgatccgcctgcctcggcctcccaaa
-gtgctgggattacaggcgtgagccactgcgcctggccctgggccaggctaattggaggat
-gaatccctagaggtggattgctgggtcaggggacatgtgcgctgtgatttgaatagatgt
-caactcaccttctgtagaggctgggtcaagtcaccctctcctgaggaaggtaggggaggg
-tggcggcttacccccacccagcccaggccctgtggtttcattttctttttttttcttttt
-tatggctcttagccaatcagataggtggaaaatggtagctctgtgtggctttattgtcat
-ctaatttgagtaagggtgTTTGGAGTTCCTTTTCTGGATGAGGCATTTTTGCCACACGGG
-GACAGCGCTGAGCCGACGACACGGCAGTGCCGCTCTGGACACGCTGATTCTCCCTGAGGC
-TCATCTTCTCAGGCTGAGTGGGACTGTGCCTGTGGATGCCCGCTCATGGAGTAGTCGCCT
-GGTGGAGGGCAAGGGTTTTGAGTTCCCATTCCACtacttactttctgagcctcggattcc
-ccctctgtaaaaagtggaaagaataatagaacccacttcagatggctctgaggaggatga
-atttaagtttttaatgtgaaatgcttggcacagttcctggctcagagttagtgcttagga
-aatgtttgttGAATGAAGAAATGAAAGAGATataatcatcttaaaaattgtattgagtac
-ttattatgaagcctttctcatgtattcacgtattttaacttcacagtgacaccaagaggg
-gtacttttattatccccctttaaagacaagaaaactgggccgggtgcggtggctcacgcc
-tgtaatcccagcactttgggaggccaaggcaggcgatcacgaggtcagattgagaccagt
-ctggctaacacggtgaaaccccgtctctaccaaaaaatagaaaaaattagccgggcgtgg
-tggtgggcacctgtagtcccagctactcgggaggctgaggcaggagaatggcatgaaccc
-gggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgggcgacaga
-gcgagattccgtctcaaaaaaaaaaaaaaaaaaaaaaagaagatgagaaaactgaggcac
-agggagagatacaggatcttgcctaaaggctcatagctggcgtcactggcggcgacggga
-ttcgtgatcttctgtctgctcttacccacctcacttccctgcctcccactCTAGGAGAGA
-GGTGCCACCATAAACCCCAttccagctgtccattgcatgaaacaacctcctcaacctcag
-aggcataaacaaacaaccattttatcatgttcctgggttctgtggatcaggagttcaggc
-aggataaggtggacagcttctctctgctgggccttcgatgggaggactctgtggctggga
-gggttctgcagtggggggtaaggaggggcagcgggtaaaacagcaaggactagaagaccc
-acttgcgagaaggcttcttcagctacaagtctggCTGGAGGATCCATTCCACCTTGTGGA
-TGGTAGGTTGGCTATGGCTATGGGTGAGGGTGGGAGTCATGGGGGGCTGAGTGGGAGCCA
-TCAGACCCCAGGGCTGAGTCCACATGTTCCAGGATCTGACAGCTTAGGAGGCTTAGCAAT
-TCCAGGGCTGGCGCCCCCATGAATAGCTTctccaggattttgcaagtgctgtttcctccc
-cctccccacccatctcattaacacctcgcactctttaattctcagcttggctatctggtc
-ctggaggaggagctccctaacccctgtatgccttagacaggatatgctagatcctgtcct
-catggaaggtcttatcacattgttggaattgactgtctgcagactgaacgcttggaggac
-aaggcagggtctttatcaccagcacccaggacagtaccaggcacacagtaggcactttat
-gcatattcacggaatgaatgaatGGGTGAGACTGATGGATTTTGAATGACTTGAACTTGA
-GCCTCAGTTTTTCCTCCTAGAAGTTAGCTGGCAACGTAGCTGTGAAGGTGGCAGGAGATA
-GGTGGGAAATGCGAGGTTAGTAAGAGGAATTGGTAGAAAAATGGTAGTTATGATTTATGC
-TGAAGAGAGAAAAGCAAAGGaaattagatattgcacctgaaatgcttagctatgtttggt
-gcagaataggtgctccataaatATAAGATGACGTCATCATCCTCATCCTCATCATTACTA
-TTATTTGTATTATAAGAATGCACATTTCCTGAGTTAGAAGGTCCACATACGATGGCTTGA
-AATTTTCCTCTGggctgggtgcggtcgctcacacctgtcatcccagtactttgggagact
-gaggcaggaggatcgcttgagcccaggagttcaagaccagtctgggcaacatagcaagac
-tctttctctacagataattttaaacatagctgggtattgtggtgtgcatctgtagtccca
-gttacttgggaggctgaggtgggaggatcaactgatccctgcaggtcgaggctgcagtga
-gccgggatcatgtcaccgacctccagtctgggcgatagagctattacccatcttaaaaaa
-caaacaaacaaagacagaaaaaaGAAATTTTCTTCCAAGCGAAAATGGAGAGGTGTAATC
-CCCATAGGTCACCTGGGCCAGATGTCTGGGCAGGAGGTCATGCTCTGAGTCAGATTTCCC
-TTCTGTGCAAGGAAGGACCTGGGACAGGGACCTCTGAGTCTGACACTCTCTGCACAGCTG
-AGAAGGCCATTCAGCTGAAGTCCCCATTGCAACTGTTGTCCTTCAGCCTGAGGCAGTCAG
-TCCTTCGGTCTGAGGCAGCCTGTCCCTTGCCCTCGGCTACCCTCCACCCTGCTCCAGTCC
-TGCTAGGAGAGAACCGCAACACGACCCCGTTTCAGAAATGCGCTCCTTGACAAGCCTGGC
-TGCGACCTGTTCCTGGTTGACTGCCGTCATCCGGTGGCAGCATGTGGGAATGACATGCAG
-GGCTGTGGTGAGGATGAGGATGGAGTGAGCGGGTGGGGGGAACTGCAGAGAGGGCCCTAG
-TGTGGCCCAGTTGGAAGCGGTGACAGGAAGAACCCACCAGGGATTCCTCAGCTCTGGCCA
-AGGGGTTGTTCTCTCCCTCTGGCATAGCATCCAGAAGGCCAATAGCAGCGGAACCTCCCC
-CTGGGCTCTGCCCAGACTGCCTCTCTTTGGCTGTGTGACCTCACCCTGTTTCTGAGCTTC
-TCTGTGAACTTCTCCAAGCTTGGCTTGTAAGAAGGGAGTGGGCGATGCCCACCTGACAGC
-AGAGTCTCCTTCCCAGAGAGGCCCCTCAATCCTCCAGAGAATGTGGGAGAGGCTGGGATT
-TGAAAGGATTGGAGCTGGGGGCAGGGAACGTCTGAGATGGAAAGGTTATAGGAGGGGCTT
-AGGCCCTGAAGAAATTTCATCCTGTAATTTGAAAATATTAAAAAACCACCACAGCCCCCA
-GCTGAGGACAGAGGACCAGGCCCCCCAAGAAGAAAGAACATGGCCAGGGAATTGCAGTAC
-TGGAAACTTCTACCCTTATGTTGGTCTTTTAGAATTGTGAAAATTAGAACGTTCAGCATC
-CTAAAACTGGAATCTTAACAGAAAACACTATATAGtgtatgtatgtgtgtgtgtgtgtgt
-gtgtgtatatatatatatatttatatatatatttatttatataGGggctgggtacagtgg
-ctcatgcctgtaatcccagcactttgggaggctgaggtgggaggatcatttgaggccagg
-agttcaaaactagcctgggtaacatattgagacccccatctctacaaaaaataaaaaatt
-agctgggtgtggtggtgtacacctgtagtcccagctacttgggaggctgaggcaagagga
-ttgcttgaggccaggagtttgaggctgcagtgagttgtgatcgtaccactgcactccaac
-ctgggtgacagatcaagaccctgccaaaaaaaaaaaaaaattaaaaaGATacacacacat
-acacacacacatacaGACTAAACTCTGTAGAATCAGATCATTGAGCCTTGAGGTCAGAAT
-CAGAATTGCAGCTGCAAATCTAGACTCAGCCCTCTGAGCTGGAAGTCATCTGAGAGCCAC
-CTCTCCCCTCAGCTTGTCCTGGAAAGAATGTTTGCTCTCACTGCCTGCTCCTAAACTTGT
-TTGCAATGaatagatctgggggagggccccaaaacctgaatttctaaaaggctccccagg
-ggattctgttgtTGGGTCTTCCAGATTTCGGCAATAGATTTAATTTAGCCAGGCTTcctc
-ttcatcacattcatcacatgggaaaactgaggccccggaaggggaagtgacttgacctgg
-accccatcagatagctggtgacaggctggagctcccacctgtgcctcccaatgccaaggc
-cactctcaccagcagcccagggtgtttAGATGGCCCCGTGGGACTGTCAACCTCCTAGGT
-ACCCCTGGTCCCTGAGACATCTGGTTCGTGAAACTGCGAGGTTCTGGGGATCGAGGTGTC
-ACCCTCTTCTGCCTCTGGCTGAGTCTGCTTCTTGAGAGTAGCCTGGAGGGGCTGAGGGCC
-CCTCCTCTTTTATCAGCTCCCCCCAAGCTGAAACCCCACCCCAATCCCCAATACACTCTG
-ACCCCTCTCAGCCCCAAGCATTCCTGTGAAAACCACTCCACATGTTTTAAATTCTGCTAC
-TCCAAACTCAGCAGTATCATGGTTTTGCAACACCCTCTTGATGCTCAAGAAGCATTTACA
-AGTTTCTTTTCCCTTTATTAAGAAAGTTTTAAAAAAAAGTTAGGGTCTTGAAACAATAAC
-AACGGAGCATTTCAGAGGCACAAACGTTTGCAGAAGAGAAGCTGGTGGCCTGGCCAGGCG
-GAGGAGGGGGCTCTAGCTGTTCTCGGGGAGGTGAGAGCAGGGAAGTCAGAGAGAGGGTGG
-GCCTGCTGGGAGGGGGGGGTTCAGGCCAGGGCTCCCCAGCTGCCAGGTGGAGGGCAGGTC
-TGAGGGTGGGTGCTCTCTTGGGGTCGGGAATGTAATATTTCATCACCTAGAGCCTCTCCC
-CCAGCCTGCTGACCATCTTCCTTCCCCAGGCCACCCCTGGGCCCCTTGGAGCTCCGACTC
-TTGCTTCTCCTGCCCATTCCTGTCCCAGTCACGGAGCCCTACGTGTTCAGGCCAACCAGT
-CACGGCAAATACAAATCCCGTTTCTGAGGATTCCGGGGAGCAGAGCAGGAAGGGGGTGTT
-ATGATGGCAGAAGGATAGGCAGTGAGGACAGACTTGCTTCCAAGCTGGGTCTGACCTGGA
-GACTCCTCCCAGCGTCGTTCCTGCCTAGGGCGAGGGGCGTCACAGCGAAGCACAGATGCT
-CAAGTCACtggtggtgggtgtgggcgagtgtggtggtgggtgtgggggagtgtggtggtg
-ggtgtggggcagtgtggtggtgggtgtgggcgagtgcggtgatgggtgtgggcaagtgtg
-ggggtgggtgtcagcgtgtgggggtgggtgtcagcgagtgtggtggtgggtgtggACGAG
-TGCACGGATCTTCCCTTGCTCCCCACCCACAATTCCCTACATTTCCCCCCTCAAGTGACC
-CCCAAATTCTCCTCTCCACCGTGAATGTGCTGAGCAGAGCCATCAGGCAGAAGCAGAGCC
-TGAAGGCTTCctgtgtgaccctgggcaagccccttccttctcagacctgtttccccaCAT
-GGGCAGGAAGCGCTGAGGTGGGGAACAGAGCTGCTGGATAATCTCAGCTTTCCTTTCCGT
-TTCAGTGGCCTCTTCTGGGCTGGGCAGGTGGATCCCCCAGCAGTGACAGCTCACCTGATC
-CGGCTTGGGAAAAAGGGGCATGGAACCCATGAGAGGGAGGCCTGTGGGGGAGTGCCGATG
-AGGGTGGCAGGCAGCTTGCAGAGGATGCCCTCCAGGGCTGGCTGCCCACCCAGAGGCCAG
-GTTGTGACCCTCCACGGCCAGCTGGGGGAGGTGTCCAAGCCAGGCCTCTGGAAGCCCTGG
-AGCCTTGTCCAGCCAGCTCCTCGGGGTGGCTGGTGGCTGAAGGCTGTGGAAATGGCCTCT
-GGGGACTGTCCAGAGAACCAGGTGCTCACAGCTCAGGGTCCTGGAGCCTCCCCCAGAGCA
-GAAGCAGGGCCTTCAGGATTCACCTGTGCTGTGTCCCAGCTTTGCCCTCTGGAAACCCTT
-TCTCTGCAAAGATGGGGTCAGGGAAAGGCCTGGGAAAAGATGTTTGCTTTCTTTAAGTTG
-TAGATAGAGAAAGCTGCAGGGGAGGGCACAGGCTCATGGTCCCTCTTAAAGTGTGTGTga
-gagggagacaagaggagggagagagagaaggatgcggtgaaggacaggaagaaacacagg
-aagaaagaaaaggaaagataaaagataagtgagaaagaagaggaaggaagggaaggaggg
-agggagaaaggAGAGGAGAATGGAGGTggaagaaataaaggaaataaaaaagaaaaagaa
-agggaaggtagactgacagaaaaatgatagaagggtggaaagaaagagaggaCAAATGGA
-GAAGACAgaggagaaagagtaagaggagaggaggagaaggagcaggaggaggTGTGCAGG
-GGCCGAGGACTAGGACCAGAGAGTCGGGAGAGCCGGCGGTCAGGGCTGCAGGCCGGGCTG
-GCGCGGCCTCACGTCCAGCCTGCGGTCCAGCTTCCTGTCCTTGCGTGGGCGCCGGTCCTT
-CCTGCCCTTCTTCTGGCCGGGGCTCCTCTCTGCAATGAGAGGACAGAGCCCGGTGACCAA
-GGCTGCAGGGCCAGTTAGGTCCTGGGAGCCTCCTCAGTCCTGAAAGACAAGGGTGCCCCA
-CCCACTCCCCAACAACGGGGCTCAGAACATTTGGGCACTGACCTTGCAGTCCCTCCTGTT
-GAGAGTTTGGACCGTGGGCTAAGGTACCCCAAACTGAACCTTTCTCTCTAGGTCTTCAGG
-GAGTGGCGAGGGCCACTAACTTGTTCAGGGCCTTCTTGTGCTGGACATCTGGCTCGGCCA
-GGCCTGCAGGTTCACCTGGGGCCCCCCAATCAGCATGTCGGGTGGCCTCATGGGAGTCCC
-CATGGCTTTCCCCGGCACACTCCTTCCATAGCTGAGCAGGCTCTGTGCTGGACGCTGGAC
-ACCTTTCATCTGTGTCCCTGCACCAACTTCTGCATAACACTGTGGCaacaatacttcagc
-atttagcaagcgctcactgtatgcaggccacagccccaagtgctttatgtatacgaaact
-cacaacagccgagagaggcaggtaGGGTCTGAGCCACACCCAGTCCCGTCTTCTCCAATT
-GTCCTCTCTTTCTCTCCACCCTTCTATCATTTTTCTGTGCCAGGCTACCTTTCCTTTCTT
-TTTCTTCTTTATTTCCTTTATTCCTTCCACCTCCACTCTGGCTGTGCCCGCTGCCCAGGG
-AGTTCTTCTGAGCAGTTGCCTGTCATTGTTATGGACAGGTGAGAAGACCACAGCATGGTT
-GGGAGCAAGGCCAGCCCTAAGTTTCTGCTTTACAAAGTGTCTCCACACCCAGGACATTCT
-CCTACATTGCTTGGGCCCCATTCAGTTCCCCGCAAGGAGCTGTGTGTCCATTTGAACACG
-ATGAACCTGAGGCTCCATGAGTCACTTTCTGAAGGTGCGCAGCGAGGCTGTTAGAGACCC
-TCTGAGCCTAGTGGCAAGGGGAGGGCAGTTTTATTCCTTGGGTGTCAACTATGTGCCCGT
-CTCCCCAAGAGTCAGGGCTGTGGCTCCAGTCCTGGCTCCTTCCTCTGCAGAGCAGAGTCA
-AGGAGCTAAGACCAGGCTACCCACCTCTGGGGCTCCCCACGCCCACTCTGAGCTCTTGGG
-GAGCACTGAGGCCAACTCCCACTCTGAGCTGCAGAGCTGACTGTGCAGGCCTCAGGTAGG
-ACAGCATCTGGAGATGGGGTGTGGGTGCTGCCTGAGTGGCCCTGCCGGCTCTGATGTGGG
-GGTGTGGGGGCCAGTGGCTTTGTGTCCCTACCCCTTCCCTAGGCCTGCCTGCCAGCTGCT
-CATGTacccatccagtcacccacccatccctccacctatttacccacctacacactcacc
-cacctattcacccatctactcacccacctCCATACCCAATGacccatccatccacctagg
-cacccacccatcacctatccatccacctgttcacctatctacctacctacccacccacct
-aatcatccacctacctactcatccacccacctaccctcccatctaccctcctatccaccc
-atctacctacccactcacccaccTGTGCATTCAGCCATCCatccactcatccaacaaata
-ttaactggataccgactatgtgccagactgtgttagaggcactagagagacagctgtgaa
-caaggcagataaagcccttgccgtcactggagatcacactccagtaaggaaaacagacgc
-tgaacaagcaaacacgagaatgagaaggctcatttcagaagggtgcaagtgctaccatgt
-gatatgatggaaaatgactccggggagggggactcctgggaagcctctctgaggaggagc
-cactgcagccaagacctgggtgatgcagggagctacagcggggttgttgcgaggattaga
-gtcatgtttcacagcactaagcacagccagcacatggtagatgctttatgaatgtttgca
-gttattgtGATTATTATTATCCAGGGGAAAAGCTTTCCCCTCATGATTCCCCAACAGCCA
-TTCACCCCCAGCTCTTGGAGCCATGAGAGGTGCCATGTGGTAATGAGTGCAGAAGAACTG
-TCTGCCTCCTGTGTGAGTCCTGCTCTGGCTCTGGGGTCTCTTAGGTTCTCTGGTTCCACC
-TCAACCTCACTCTGTCCTCACCTGCCCAACATGACTCCCAAAGGCTCCTATCTCTGCTAG
-CTGCACTCCCAACCCAAATAGCACAAGTCCTTCTGAAAGAGGAGTGTCcctgagttcaaa
-tcctggctccactatgtcccagctgggtgccccgggtggcctggttccaggtccctcatc
-cttcatcatgactttagattcctctttgcaTGACGAGTTACgtttgaattctaggtctac
-agctccctggctttgtgacccttaggtgagtgactcaacctttctgggcctcagtcccct
-catctgtaaaatggggatagtgctaataacacctaccgcatagcatcactgcgaagatta
-catgagttaacgattatagagaattcggcacagtgcccagTCAACACTGCCAATACTACT
-CACCGTTCACATCTTACCAAGCACACCCTGTGGCCTCTCTTCTATGTAAATCAGTGGTCC
-TTCATAgcccccagaaacattttggaaatacgtgtagtggtcttgaatggcacagtgaag
-ggggttcctgtggcattcagtggacggcaatcgggatccagcgtgggacagtcccccgca
-aagacgagctgtccccctgttccatccagttctctcacatcgtgccccaccctcacgtag
-ctgaaaagtctgcttgctgggagctgaattctgtttgactcatgaataccaattggtttc
-gaacacttccattcactgaagattctagggcactgtgagtgtggtgtcaatcagagatca
-attgggttggaccttactaatcattggtcactgttgggaaatcgcatctctgatggcgat
-gTGGCCACGTACTTGGGGCGCTGACCACGGCCGCGGTCCTCACTGGGATTGTACTTCCCT
-AAGTGTCTGTTGGTATGTTGGGCCAAGCGCTTCCATCAAGAAAtttcttttctttctcct
-ctatattacagttaggacactatactgataaaaaaaaattacctttgcaagtaggccaca
-ttctccatgaacttcattaagaatgataaagagggtattcccaaatccttcttattaaaa
-ggggggtgttcagtttgagagggttgggaactcctgGCCAGCTCAATTTTCCTAATGTAT
-TTGGGACTGAACCCAGCAAGGAAGGCCCTCCTTTGAAAGGACACCAGGGAAGGTGATGTG
-TACTCCACATGATAGTATGGCTAATGGTGGCCTTTCAGGCAGTCTCATAGATACTATTTG
-TGGGGCAGTGATCTGAGTCCGCCCTGTCCCTGTGGGCCTTTCCCACCGCAGCCTCGTGTG
-CCTGTCCTGGGGCTCACCTCCTGGGCAGGGCCTCTGGATGGGACATTTCCTTGACTCAGA
-AAGCACCTGGCAGGTGGCTGCCTCCTCATGCCCAGCCCGGCCAGCCTCTCGTACCCGGCT
-CTCCAGGCCCCAAGCCGAGCCGCAGGTCTTTCCATTGTGTGTGCAGGGGCTCCAGCCGCC
-CCAGGGACCCAGTTCACACTCCCCTGTGGGGTGAAAGGAGagacagacagacagacagac
-agGGTCAGCCGGCAGTGAGGGTCCTTCAGATCCAAGGGCAGGGTTTGAGGGGTTCAGTCC
-TCTGAAGACTGAAGACACCACTTCCACCTGCTAGGAGCAGAGTTATTTATAAGAGCCTGG
-AATGAGAGCGAAACGAATGCATGCACAGACTAATATGGGCCTGAAGCCAGAGCGGCCGAC
-TGTCTAGCTTTAAaggaaaggcttcctggaggaggtgatgtatgagttaaagggagagag
-gggagctcgtcaggtgagaagaaggaagcccattccaggcaggtgtgcaaagccttggga
-gcccggcccaccatgtttgggagatggggcagcctgagttgggagtcaagtctcaggaag
-gcggggacaggagaggaggctggaaggttgcctgggaaGCCCTCAGGACCAGGACACAGG
-TTTTAAACTTGATCATGTGTCTTTGATCAACTTTGGAAGGAAGAAAAAGGAGGCCATGGA
-CATAAAAGTTCTTCATAGGGGGTAATAAAAatacatatatacatgtatatatatatatac
-acacacacacacatatatatatacacatatatatacacacacacacatatatatacacat
-atatatacacacacacacacatatatatatacacatatatacacacatacacacacacac
-acacacacacacacatatatatatatatataCTTTGATTATTTTAAAAGTCCATGAGAAG
-TAGGCACAGAATATGggtagctatgaatactcctattttgtagatttggacactgagacc
-tagagcagaggtttgctaagggaacgcagcaagaggctcacacagcagacacagcaagct
-caagacacagtgggacccagaccttgctAGatacacacatttgacaagtaaagactgagc
-acccagtgtatgccaggtgctattctgggtgctgagggagcagcagcagacaagacagcc
-cagggtctgcaggcctcctggaattcaccatctggacaccgccgtgatgagggaagtgca
-ggcaccgtgggagcccagaagcagcatgggttgggttgtaggggaggaaacccctggact
-gggtcttgaagtgggggtgggatggcggggaaggggagcctagccaggctcagggaggga
-cgggaggtgctccaagtgagggcataaccccagcagagtcccCAGGATGATTTGGCCTGG
-AACTGGGCAAGCCGGAGAATAAGCTCAAACTGAGGAGGAAAAAAATGATGGGGGTGGAAA
-GGCTGGCAGATGGGACAGATTGCCCAGGGCCTGGGTGGGCTCCGCCCAAGGGCAGTggga
-gccactgaagggtcctgggaggaaaagaaattgagcagactatcattgtgaaatactccc
-tctgctgttgagtggagactgggctggagggactgagaaccaaggcgggagacgggcagg
-agctgtggccagaaccctggcgataggcagggggtggcaagagggtgggaagagggcggC
-ACAGAGGACAGAAACAAATGGGTGGGGAGAAAGGGATGAGCTGAATGGTGTGGGTTTGGG
-AGCTTCGTGctgcttcattttcaccccaaagttcttcctaccacccaaaatattatgcat
-ttgttctcaggtgtcgcttctgtctctccactgaaatgtcatgtccttgagtgcagaggc
-tttgtctgttttgttctgtaatgtgtctccagcacctaggaaagtgcctggccatagcag
-atgctctagtagatattttcagagtgaataaatGAACAGATTGGATTGAATATAGGGTGA
-GGGAGAGAGAAGAGTCAACAGCGATGTCTGCATCTCGCGCATGCCACCCAGGGATCAGGG
-AGCTGGTTATTGAAACCCAGAGGAAACCCAGAGGGAGCGTTAGGTGGGGGATGGTGGCAG
-TGGGAGTGGAAAGAAGGCACCCAGAGGGCAGTGGAGGTGAGGATCAGCTGCTCAGGGAGG
-CTGGAGACACGGAGTCAGGGGCCATCAGCAGCTGGAATGACCATGAATGTGAGCCCGGAG
-GGAATGCGTGGGCAGAGAGGCACAGTGTAGATGAGAATGCCAAGGAGCAGCCTAGTGCAG
-GAACGGGAGGGCTCACAGGCAGGAGTGTGACAAGGAGCTGTTAGGAAATAATCAGAGCAG
-TAATAACACTGATactgacacgtactgagcatctactgtgtgctggctgctgtactgagc
-actttaaattgtactaattcactttatcctcataacaattcctccccatgaggtaggctc
-tatgttctattgtctttttttttttctaacgtttggagaaaccgaaggacagagagctga
-ggtggtttgcttaagatcactaaagggtaaggtttagagctaggattggaccccaggcct
-gtcctattccaaaatcagtgctcagccaggtgtggtggctcatacctatactcccaatgc
-tttgggaggctgaggtgggaagaccgcttgagcccaggggcagcctgggcaacatagcaa
-gagcctgtctttacaaaaacataaacgcatagccagctgttgtggtacatgcctgtggtc
-ccagttactcgggaggctgaggcgggaggattctctgagcctaggagtttgaggctgcag
-tgagctatgatcatgccactgcactccagctgggcaacagagtgagaccctatctcaaac
-aaaacaagcaaacaagcaaacaaacaaacaaataaacaTCAGCGCTCTTCTTCTGCACTC
-TGCTGATTCCCTTGGCATTAATAACAATGCCAGTGTTGGTTGTAGTAGTAATCATAGTAA
-TGGCGGTTATGTTGGCTCTAGTGTTTTGCAGTTACTATGTGGAGGTACCCAGTGTACCTG
-ACATGGTGGTGCTGGGCCTTCCCTCACCATATGGCATTCTACTGTAATTTCTTCCAGGGC
-CCCTAACATCTCTCACCAAGCCCCCGCTCCAGGGAGAGGGGAGGGGCAGGGGCAGGGCGG
-GGAGGTCCCCACTCACCCTGGCACTCCCGTGTGTTCTGGTGGGCCAAAGTGCCCGGCGGG
-CAGGTGGGCAGACACTTCCCCTTGTACAAGTAAAACTGCCTCTTGCACCGGATGCAGAAG
-TCCTGGCTGAAGCAGCTCTCACAAGTGGCCCCACATTCTGTAATAGAGCCAGGGACACCC
-CAGGTGAGGGAGACTGCCAAGGATGGGGCCCACTGGGTCTGCCCGAGGTGGAAGGCCCTC
-TGGGTAGCTCCAGGCTTGGTAGCATTTGGGTCAGGACTCAGTGTCTCCTTTGAAGCCCAG
-ACTTGGCCAAGGTCAAACTGGGCTGCATGTGAAGAGAACActccctttctcatttgaggg
-gaggctcagagagagcgagtgacttgcttgaagtcacccgcaaaccagggctggagtgag
-gactccctgcttcttttTCACCTCAGAAATAGTGATAATTTGCCCAAAGTTACAGCAAAA
-ATTAGAGCTTGGAATTAGGACTCCTTTTCCTATTTGagctaagaccagagaaggtgagtt
-acatgcctaaggccacaccacaaactagggtagaAGTGAAAGTTGCCTGTTCTATTAGTG
-CTAATTAAGGCTGAGAGCGGACTGACTTGCCTCGGGCTGCGGAGTCAGCCTGGACACAGG
-CAGGTATCTCAGAGTCTGGGCTTAGACATGCACCTACTTCCCCTCTGTCTGTGCTGGGGT
-GAAAGGGTGGGATCTAAGCCCATGGTGTCTAGGAGCCCAGCACTAGCATAGAACAAGGGA
-GAAGCCACGTACTTTTGCACCTGTTGACCTCCTGGCCGCGGATGCCGAAGTACCCAGGGG
-GACAGTCGTGCAGGCACTTGCCGTACTGGCGGATGCCTTCCCGGCGGATGAACAGGAAGA
-GCCTCTGCTGGCAGGTGGAACAGCCGTTCTCCTCTGAGCAGATGATACAGCCTGTGCAGT
-TGCCCCCCAGGCCAGTGCCCACTGCCCACAAGACCAGGGCAGAAGGAGGGGGAAAGGGAG
-AGAGAGATGGTCAAACCATATATGCGAGCAGCTGAGATGGTCTCATTGGGATAGtaactg
-ggcacatggccacccaaacaaaagactacatttcccaccttcccttacaactagatatgg
-tcatgtgaccaacatctggccaatcagatgtaaggtaaagcagcatgtgacacttcaaga
-aagctgccttaaagggcaggggtgtgccccttgtcgtcccctcatcctttctgttgggtg
-gaatgtgaacgatggctggagcacaagcagccatttcagatcatgaggtggaaactatgt
-cccgtgaggcggtggaaaaatcagataaaaagcacctgggtgcctgaggaaggcagaact
-gctgtaccagctctagcctgcctgtgtagactgttacatgagagagaaatcaacatctat
-cttgcttaaatcactgttatttgaagttttccatcactcacaagcaaacttaatctttac
-CAAAGTAATGTGAATTTTTGAGTGTGTGTGGGTGCACATGATGAGTGGGGTGGGGTGAGA
-CCCTCACCCTCCTGCTGGGTTCCTGAACAATACTCAGCAATACTCCATTTCTCACTGTCA
-CCATCAGCAAGGGCTCCCACCATCATCAGGAATAGCAATGGGAGAAATTTTTTTAAGGAG
-AAAATTTTTTGTTACCCCAGAATTGGCACCCAGGAGCCAAAGCTGGGGAAAAAAGAGGTG
-GAAAATGCTCTAGAATCTTAAGTGAGCCTCTCCCAGGCTCATAAGGAGTCTCTGTTACCC
-TGACCATCACCCCAGGACCCTGATTAAGCTGAACACTTGCAGGGAGGGACTCATGGGAGT
-TAGGGATTGTCAGCCTggccaggcacagtggctcatgcctgtcatcccagcattttggga
-ggccaagatgggagaattgcttgagtccaggagtttgagaccagcctggacaatatggcg
-aggccctgtctctacaaaaaatacaaaaattagccgggtatggtggcacacacctgtagt
-cccagctacttgggaggctaaggtgggaggatcgcctgagcggggaaggctgcagtgagc
-tgtgtttgtgccactgtactccagtcggagagacagagtgaagccatgtttccaataaag
-aagaaaataaaaagaaGTGGACAGCCTAGGGAAGTGAGTTGTGGTGCTGTGACTTTTCCT
-CTGTTCCCAACCCTGCCAACGAAGTGAGGAGATGCCAGAGAAACTCACAAAGACAGGGGG
-TGCCTGCAAGAAGGTGCCAGCATCTCATGCCCTGCTTGGACATAAACTCATGTCCATAGC
-CCTGCGAATCTGCCCCCTTCCCATTCCTCTTTGAACAGAGAAAGGAGACCAGGAGACAGA
-AGGGCAGAGCTGAGGGGAAGAGTGTGATAGAAGAGCCTGCACATCCTTCCCGGCACGTGT
-GAGGGAGTTCTCAGTGGTAAGGGGCACCTTGGGAGCAGCCAGGCTTAGGTGGTATTCCTG
-CTGCCTGGCACAAGAAGGCTGGTTGCTGGGAGGTGCCCCAGCAGTAAGAGGCAGCAGGGG
-AGACCACTGGGAGTAGGAGGTGGGGGAGAGTCAGAAAATGACCAGGTGTCACTAAGTGAC
-AGGAAAGGATAGGGCAGCTTTTGAGAGGCAGCAATTGGGGAAACAGTAAATGGTTTCATG
-TTTATATGTCATTAGGGTCAGACTGGTTAATAATCCGGTTATACACCTTGATTCACCTGA
-GCCCCAAGACCACCCGGCAGGAAACATTCTTGGCTCTCCAGCTCTCAGATGCTCCCCTCT
-TCCTATTGGTGCCCCATCTCCCTTTTAGAGGAATTCCCCATTGTGCAAGGTCCTGATGAA
-ACACATCCTGGCACCTTCCCCCTGGAACAGAAACCAAAAGAGTTCTGGCCCTCCTTTAAG
-TTGGCAGCAGGTGAGAGCTAACGAAAGCCCGGTCAGATACACATTCTGGTGACTCCAGTC
-CTGGGAGTGGGACACAAGAGTGAGGGTCACACAGAAATGGGGTTCATGGTGGAGGCAGGG
-CAGGCTCTCTGCCCAGCCCTGGCTGAGGcctttctctctcccttccatccctcagtccct
-ctgttccttcctccctGCTCCAGCTCTCGGATGAGTACTGCTACTTCCCCAGTCCTCACC
-TTCTGTTCCTTAGATTCGGTGAGGCCCCACATCCTGCTGATAACCCTCTTTCTGTTGCTT
-ATAACTCAGGAGGCTTACTGATCCAGGGTCGTACGGAAGCACACAGTAACTAAAGTGTAC
-CCTGGGATGCTGTTCCCAAGCAAAGTTGGCATTGCCCTCAATTTTCTTGCCCTGGGATAA
-GAAACTGCAACAGGAGAGCAGAATAAAGATTTTTGTGCCTCTGGAGCTGTATACCTGGCA
-GGGATCTGAGGGCAGAGAGCAAGTGTGATGTTGTAAGGGAGATTCCCAGAGCCAGAGAAA
-TAAGAACATCCACTGAGAATTTAGCAGAGTCCGGACTTCTCACTCAgcaaaagattcaga
-ttctgatactacccagagctggcaagaatgagaggaaaccttcgctttttcaccttagat
-aggagtgtaaacttcggggaaaaatctagcagtacctaataaatttggagatGTCTCTTT
-TCTTTTTGTGTTAAAAAGtttttttgtttgttttgttttgttaagacaggatcttgctct
-gtcacccaggctccagtgcagtggcatgatcctaagctcactgcagcctcaaattcctgg
-gctcaagcaatcctcctgcctcagcctcctaagtagctgggactacaggcatgtcccacc
-acaccaagataattttttaaaaacttttgtacagatggtctctctctgtttcccaggctg
-gtcttgaactctggcctcaagtgatcttcctgcctcagggtcccaaagtgttgggattat
-aggcatgagccaccacgactggccTGATGTCTCTTCTAAATGTAACAATTTAGCTTCTGG
-TATATACCCTAGAGcggcagttctcaaactctggcgcacaacagcagctcctagagagct
-tgttagaatataggtccctgggttccacccctggtacgtctgattcagtaggtctgagaa
-tttgtatttctaacaggttcccaggtgatgctgatgctgctggtccagggaccatgctct
-cagaaacactgAcctagagaaacccttgtatatgtgtagaaagagacaaagatatttatt
-gcagcattatttaatagcaaacaactgcaaaaagctaaccctctgccaaaggaatagata
-aatacattgtggtatattcatacaccacagccagataccacatacacaacccagccatga
-taaatgactgaggtagctacagttatcattgtgggcacagctcaaagacggggctgagag
-gaaaaaagcaaggtgcacgatgaatcatatagtaagagccatttatataaagttcaagga
-cctgcaaagcaatattttgtAGCATTTGTGACTTGTAAATATGCATTCAGAGCAGAAGAC
-ATGGGACTAACCAACACTGAATTCAGGATCATGGCACACAAATGtttattatattatttt
-aaattCTTGACTGTAGGTTTGAAATAGTTCACCCTAAAAATGCATAAAGAACAAAAGAAT
-TTAGCCTCTACTGTGTCCTGGGGCAGGAGGAGGCCTACATTCTTTCTTCTCCTTCTCCAC
-TAGCTCCCCTCCCAAGCCCTGTCCCATCCTCAAGCTGAGGTCTTGAGCAGGGGAAGGTGA
-CAAATTCTGAAGACGTGGGACCCGGGTTCCAAGAGCAGTGGAGACTCGTGCCTCTGCACA
-CTttgcccctcgtccactctcccctcatcctcagtagtggaatcctgatttttattttat
-tttttgaggcaaggtcttgctctgccccccaggctgaagtgcagtggcacgaccttggct
-cactgcagcctagacttcccgggctcaagcaatcctccctcctcagcctccctagtagct
-aggactacaggcgtgcaccaccatgcccagctaatctgtgtatttttttgtagagaaatg
-gtttcaccatgtttcccaggccggtctaaaactcctgggctcaagcaatcctcctgtctc
-agactcccaaagtgctgggattacaggcctgagccacagcgcccggctggaaccctgata
-ttaagcggagtttatgtcctctaagactatatttcccaggccctttgcagctatatgtgg
-tcatgtgcttatgccctgaccaatgggatatgagcgggcatgccctgtacagcCCCTTAG
-GAAACGCTGGCACTGTTCTCCTCCCATTTTCCCTTATGCCTGCAGGAGTGCAGGCTTAAG
-AGTGGAGCCATGGCAGATCCAGGAGGCAGAGGGATCTTATAGAAAgacagcttggcgtgg
-ctgtattaacccagggctgcccaccgccgagattctttcctggggaagggaggaaagcat
-tgcccatcttgtttaggtcactgGGCCTTTCTGACGCACACATTGACTGATGATGTCGGG
-TTTTCCGCCATGCAAGGCAGCACAGAGTCATATCAGTGGAGACCAAGTTGCCCTGCGCTG
-TGCCTTGGCGCTGTGTAAGCCCACTGGGCCTGAGAGGCGACCCCACTACCAAAGAGCAAG
-GGGACCCTCAGTTGACTTGTGGTGATCTTTATCACCTGGCAGAATAGGACTTCAAATTAC
-AAATTAATTTAAATTACAGAAAAACAAAGTAGCATTTCCTGAAaaacgaatctgtggaca
-cagactcacaccctgacatggcgttgctgcccattttgcagctgagaaaaaccgagaatc
-aaggaggtgaaacgacatgtccagggtcacacagaattggcaggggtggacccacatcac
-tctgccccacgctgccctctTAGAGCATCTGTCCAGGGCCTCCTGTGTCAGGCAGAGCCT
-GGGGCCATGGGGGTGAGCCACGCATGGCCCCTACCCCTATAGGACAAACAGCCTGGTGGG
-AGGAATTGAAGCCCACAGAAGTGACAGCAAAGCAGGATGAGATAAGGGGTCAAGATGGAG
-ACAAAGCAAAGCTCTTACCACTCTtagaagagcttagaggtcactcagcacaactcctgc
-agtttcactggggacactgaggccagaaggggtggagctttccccaaagtcaggcagcca
-actGCAAAGAAGCCTCAGTCCTCAGTTAGAGTTATAGCACTAtttgttttttgtttgttt
-tattgtttgtttgtttgtttgtttgtttgtttttgagatggagcctcactctgttgccca
-gactggagtgtagtggtgcgatctcagctcactgcaaactccgtctcccaggttcaaacg
-attctcgtgcctcagtctcccgagcagctgggattacaggcacccccaccaagcctagct
-aaatttttttgtatttttagtagagacggggtttcgccatgttggccaggctggtctcga
-cctcctgacctcaAAAAGCTACAGTATATGCTGAAGGCCAAAGAACCCAACAAGCCCCTC
-CCAGGCCTCATAGAGTGCTGGCCCACTGGATGGTGCTTAGCATCCTTCAATACCCTGGTC
-TTTGAAGGTCAATACCCTGGTCTTTGAAGGGTAGTGGCTGTTTCTGGCCTCATCCTCGAC
-CCTGGCAGTTGGCTAGGATGCCCTCTTGTGCCTCTATGTTGTAATGGCACCTCTTGCTTT
-TTGACTTCCGGTAGCCTGTCTGGTGTTTCGTCATGTCTCTGTAACTCATTAGAAAAAGCA
-GTGCTACTGCCTCTCTCTACCCCCTGCCCTAAAGTCACGGGTGCAGGCGCTTGAATGTTC
-ATTCTGTGAATCATCAGTGATGACAAGAGTCTGTAGAGTGCTGCTCTAGAAAGATCCAAA
-CTTGAAGGTTCTTAAACTTGACTGTGATAACAATCTCCAGAGAGGCTTGTAAAGCGTCTG
-CTGTGGGCCAGGAATGTGCACTTTAACAAGTCCAAAATAAATGTAACAGAATTTTGGAAG
-TGTCTTCCCTGTTCACAGTTTCCTTTCCCTGAGAACTGGCCCCAGTAATCCTGTTTGTAG
-GGCATGACTCTGACCCTAACCAATGGCTGTCTCTTCCAGGATGGGCCAATTAGACCATCT
-CTCTCTGGGCTGATGGACAATGGTCTGCGCTGGCCTTGACCTAAGGCGATCTGCAGGTGG
-GAGGGTAGCCTGTTCCAATGCACATGTGTGAGAAGCCTTGGTGGGCACTAGCTAACAGAG
-GCTCTGCTCCTCTGcactctctggcattgaggttcgtgtgctgccatatccacccagatg
-cacttaacctgggcttggccaatcagagcatcaggtccccttgactacagtggttgtagg
-ttcagacacaggctcacatccccacaagagctagtcttggggtttttgctgaggtcaatg
-gatgtgtgtggagatgtgtgtgttttcctttcctctctttggatctaggaggatatagat
-cagagctggtgggtgccacatgagggaagagcctctggagaatggaggccatacagcaga
-aacagagccaagagacacagacaaagaccaaaaagagtcatctgtgcatgtggatccacc
-ctggggatccataaattctctttttttctcaggtcacattgagttaggttttctgtcact
-tgcaaccagatgattcccgactaatacaGAAGTAGAGAGAGAAAAATAAATCAGATGCAG
-AGAGAGAAGCAGCAACCAGAACCTCACGGGCTCCTTGAGACAGAAAAAATTTCTGACTGC
-CTCCCAGTCCTTCCCAAAGCTTGGCTTGTCCCATAGCTCCAAATCCAGTGACTTTTTCAC
-TTGAGCTGGTTTTCTTCTGTCAAATTACAATAAAAATGGATGTAGCTCACTAGACAGCGA
-ACAGATCACGGTGGAGCAGCGCTGCTTTGGCGCGGATGAGGAACCTGGAGCACCACCTAT
-CCAACCTGATCACCCTGGTGCTCCAGGGGACACTGAGGTTCCAGGGAGCACACTTTGAAA
-CCCCCTGGGTCCTTCTACACATCTTGGCCTCTGTCGCTGTCCTCTCCCAGCTGAGATGCA
-CATTTTAAAAGCATTCAAGCTCTAGTTGCAACCTCCCCAAGTTTTCTTGGGCCATCACAG
-TGGATGGCAGGCACCCCATGTAACTTCCATTAACAACTGTCTCCCATAATCAAGACCATC
-CTCCCTCAGTCAAAACACCAGTAGGCCACAAAAGCATGGCCCTGTGTTGCTCCAGCAGCT
-GGAGAGGCTTAGAATGAAATCTGAGTCACTCCATGTTTCCCCAAGCACCCGAGGGATGAG
-TCCAGATTTGGATGTCCATTTTATGGAGAATGAGAGTGGAATCAAACACACCAGATTTGA
-CAGTTTGCAAAGTGATAAAGGCTTATGACAACTCTGAATGCGTGCATTAACCCAGGGTTG
-AGTGATCCATTCATTCATTCATCGACCcattcattcaacaattactgagcccctattctg
-ggtaaggtccagtgctaggACTCAATGGTTATGAGCTTTGGGGCagttgtgtgaccttgg
-gcaaggtactttacctctacaagcctcagtttttccagctgtaaatggggataataatgc
-ttatcttgcagggctgttgtgattaaaggagatggtacgtgaaaaactgttagctcagac
-cacctgcagcaggcatctgataaactgaagctaccattattATATTGAGAATGATGTGTT
-TTCTGCCCTCAAGGGACTTAAAAATCTAAAGACGTGTAACAATGCAGGTTcccaggttga
-tatcctggccccatcactcattgaatgagatccctcgtctctgtgggcctcagtttcccc
-atctgaaaaattgtggcagcaattcctacctccacgtgatttgttatgagggatgtgcaa
-accagcaagcactggcacacagtaggtgctcCTCTGTAAACCTAGGTTCCCTCCCTGTTC
-CCTCACCATCATGACACACAGTGGGACTGTCAACCAACATCTGGACCCTTGTCCTCTTTC
-CCAGGTGAGCAAACAAAAGCCAGAGATGTTGGTGAGGCTGGAAGGAGGCCAGCAGGGTCC
-AGGGACATGGTCTTTTGCCCTCTGGATGGTGAAGTGCTCAGGGCAGAGATACTAGCCAGC
-AGCTTTGGTCCTAGGTGAAGGGCAGGCTTATTCCTTCTTTTGGGAATAGGGAATAACCTG
-TGCCCTTCAAATAAGGGTCCCTAAGCTCAGGTTCACCCACATCCTGAGAACTGCCCCAAG
-CACCTTGTTTCAACAGGAGTCAACGGCTCAACATGTGCAAGTGATCGCTGTATTTTTTTT
-TTCCATTTCAGGGTTTTGAGTGAACTTAGGGTCATCTCTGCCATATCATGCCTTCCATCT
-GCCTTCACTCTGCAGAACTTCCCTGAGGGGTCAAAAATGCAGGGTGACATCTGGGACGCT
-GAAAATGTCATGTTCTCCTAGGCAAGCTCGTCTCCTCAGTAGCCCAGTGAATCTGTCATT
-GAAATTTCCTTAATACCCAAGCCAGAAAGCCTAGCCCCATACATTTTTTTTAAAAAAAAC
-AAGACTAAtttggatagatttctagcatttaaaaaatcaagagatttcacattaaaaagc
-tggaatttgaacttctctggaaaaagtcagaacatctaccaacactgggtctgctgtcac
-agggcagtgagtggttagagttacataaataaggcatatgttccccaggttactgcagac
-cctaccCCTCCCTATTGTATTTCAGATACTGAGGGAAAAGGTCAGCTGCCCTATGTTATC
-ATCCTTGAGCTACATCTTAACACCCACTTCACTCACTCACAATAGAAAACAATGTAGAGc
-aggggttctcaaacttgggcatgcatcagattcacctagagagcctgttaaaaacacagg
-ctgctgggccttaccctagagttgctgattcattaggtctgggcagggcctgagaatccg
-cattgctaacaggttcccaggtgatgctgacctttgctggtcctgggcccacactttgag
-aactactAGTGTGGAACAGGGTTAAgagccagactggttggattgaaatttcagctctgc
-cccttacctttgccatgtgaccttgacccagtgccttaacctcactgtgcttcagttttc
-tcatctgtaaaacaagaatcctcctggctgacctcacaggtgtgctgtggggGCCTGGCA
-GGGCTGACAGTCAAGCGGGTCTCCATGACATCACTGTTACTACCATTATTATCACCACCT
-GCCCTGCCTGTGTTGGCATTTGTGATCCTGGAACTGCTTTGACAATCAGTGCAGAGTTTT
-TGGTTTTGATGCCAACATTTTTGGGGGTAGAGTTTCTTCATAATTGGGGTGTGCCCTGGG
-AAGTGTGTCTTGCATGAGAACATCATGTCATGGTGAACTAAGGATTTAATACAGCTGTCC
-TGGAGGACTCCCCAGGGCTAAGAAGGATGGGGAAAGAGAGAAAGACACCACTGCCCCTGC
-TGAGGTCCCTGCTCTGTCCTTGGGGAGGACCCAGAACCATGCAGGAGGGCCCTACACAGA
-CAGTGCTGGGCAGCGCATCCTCCGATGCCCGCCTGGCAGTGCAGGACGCATGTCACCGAT
-GACCAAGGGAAATAAAAAACATCTGGGCACCCGCCTGCCCACTCAGGCCTCCACATATGG
-GAGGCAGTCGCCACTGCTGGAGGCTTGCTCAGAAGATCCCCCAGCACATTTCTGCCTAGG
-GGTAGATTGCACCATCTCTAGCAAGGGGGTGGGCCCTGGAGATGACTCCCAGCTTAGAGA
-CTCCCTGGGATCAGGGCTAGAGGTCGCTAGCCCACTGGACCCTTCTCAGCACTCAGGAGG
-TGGGGGGACCAGCAGGGCAGAACATTCAGCAGAATGTTGaggttgccttggctttggggc
-ctgacaaaccaccacttcctagctgggtgatattgggcaagtggctttactgttctgagc
-cttggtcttctcttctgtaaaatggggacgatagtagcaaccacctcccaggcagttgtg
-gggatgccatgaactcatctgcgcaaagtgcttagcacagctcacggcagatgaatgagc
-actccattactacttgattCATGAGAGATGCTCCTTTGAGGGCTGGGCCCAGCTTGGCTT
-GCTCACCTTTAAATCCCCACGGCCCTGCACATTGTAGGTGCCCACTGACTACCCATTTGT
-GATTATACCCATTATGCCCATTCATTATTTCTTAAATGAATGCATGAACGGTGGCTCAAT
-AAAGGTTCTCAAAAACTGCTCTCAGGGGGCTCACAGCCTATTTGGGAGGACCAGGCCCAT
-ACGAATGTGGAGAAAGCTGATGACCTCTGCCCAGCAGGGCTCAGAGACAAGTGAAGGACC
-CAGGCAAGGTGGGAGTGAAAGTCCAGAGACTGGAGACATCAGGGGTGGTTTTCTAGGGAG
-GCAGATGTGGGGACAGAAGCTGAGGCCAGGAGCAGGACTAGTTTGTGTAGATGGAAGAAA
-GGTTTCTAAGAGAGGTGAGTACAAGATGATATTGTACTCATTTGGTAGAAAGGGAGGGGC
-TTGAGCAAGGAGCAGATGGCAAATCCCCGCTAAGGTGCCAATACAGGACACCTAAGGGGC
-TAATGGATAAGACCCTCAAAATACAGTAAGAATAGGCacacatccaaaatggaaactttt
-catcctttgccctccaaacctgcttctcctgtccatttcagtcaatggctactccactca
-gggccaaagacttcagcggcatccttgtctcttctctctccctcatatcctactattggc
-ccatcaggaatccggtcagttccacttctgaaatatgtctgggaataatttctccacctt
-tcctgtccctaccccgttccctgctcctgccctgtttccccaccactcaccttccctggc
-catgctggcctcatcctccatgttccccatctgccaagaccactcccaccacaggacctt
-tgcacttgctcttccttttgtctggaatgcccttcccacattcacccgcaaggctccctc
-cctcaaatgtctccttgtggggacaagagtgattccttcttagatactaatttgccacgt
-caactcctgactaaccctgagtccagtaatgcctccaagatgtctagctgaagcattact
-ctctacgtagaaacacttatttgctgcgggtttcacttttcctccaaaacaaaccttgat
-gctgctgcaggaagcataggctatgacacccatagcacaatgtcagtcacctgtgcactc
-ctcccagagcacgcagacctttctccccaagatatgtaagccctgggtctggagagttac
-agcttggagatctacctatcttgaggctgcccaaatcttgctctgttcaaaagttcccca
-actaataaccctttaccaacaaattggaattggctgcctcattctttggtttcccagctc
-cttctgcatttggggtcgctttatgtatacggccctttcacagaacaccccttccctgtg
-atgcccccagacctcttgcctgcagcagcaccacacctacaccctattcctctcccacgt
-cgctatgttcttcatgccatttattcccacctgataggttctaaatttggcaagtgctgt
-tgtctctttcccaccagtgaaagatgagttccaggaaggcagggaTGAGCCACGGCACAC
-TGGACCTTCTCACTTATGCAGCACCTGCCTTCTCACTTAACCAATTCTTTGTTTTATAGC
-TGCTTACCATTCCGCATAGaggggctgcaaaactcatttaggtgctattatcacacccat
-ttcagaaaggaggaaactgaggttcagagcaatgatgctgcttgcccgaggtcacttaat
-aagtggagcagatattcaaacccaggcagtgtgactctgaacctgagggttatcctcagg
-ttgccacactgcAGCCTGGCTACTCAACATATCCCTGTGCGCCTCCTCAGTCCTCCATGC
-AGAGTCCCTTACCTACTGACGCCTTGCTAAGTTCCCAGTGCTGTGCTGAGGCCTTCTTCG
-GTGTCCGCTTGACCTCACCTGAGACAGGAAATTGGCCAAATGGTGGCAGTGCAGGCTGCC
-CCAGGACTGAACATGCCCCCTCTGCATTCCTCATCCATCCTCCCCTCACCCCCAGTAGAG
-AGTGAGCAGATCAATAGGTGTGTGTTCAATCAAGGGGTGAAATGCCCACTCCGTCTCTCA
-AATTCTCCAGGAGTGAGTCTCCTGCCTCGCAGCTGGGACTTGGGGAGGATGAAGAAAAAT
-TACCTGCTAAGTTGCAGCCTCTGCTGGACATTCTGGCCAGAATCCTTTTTAGACGTTGAC
-CTATATGGGCTGGTTGCAGGGGTGGAGAGGGTGGTGGTAAAACCGGGGTTCAAACTCACA
-TTTGTTGATTTCATGGCcagtggtgatctcagatttcaatccccatcagaatcacctgag
-gctgcttattaaaaACAAGAGGTGCTGTCGCCTCTCGACACATGCGGTTGTTTTAACGTT
-TATGGTGTGCCCAGGGTTGTACGTGCATGAACTCAGAGATCTTCAAAAACTGTCCTGTGA
-GATCAGCCAGGgcttcccaaactgtaatatgcacacaaagggatttaactcagggatctt
-gggttaaaatgtagattttgatgctaaagttctggaatggggccagaggtgctgGCCCGA
-GAACTCACTTTAAGAAGCGAGGCGGgagatgctgttatcattcctcattttacggttcag
-gaagtgaaggctcaaagaccaacaattataggtggtggcattagatttaaacccacagct
-gatgaaaccccagactcattctactgtgtcacactgccTTACCCTGTTGGTCTGATGATG
-AACGTGGAGCGGGAAAATGGGAGTGATACTCAAAAGGGGCAACCTggccaggcacagtgg
-ctcacgcctgtaatcccagcacttagggaggctgaggcaggtagatcataggaggcccgg
-agttcgagaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaatc
-agctgggcgtggtggtgcacacctgtaatcccagctactcaggtggctgaggcatgagaa
-acgcttgaatccaggatgcggaggttgcatgagccaagattgcaccactgcactccagcc
-tgggcgacagagtgagacgctgtctcaaaaaagataagatataaaataaaataaaataaa
-aataaaataTCAAATGGGCAACCTGACTCCTTTCGCCACTCATAGGAGGGGCATTTCCCC
-AAGCAGCCTGAGTTGGGGACAGTCCCTGCCAGGCCCAGCATGGCAGAAAAAGGAAGGGCT
-GGGTTCATGTGTGCCCGACATGTGTGTGTTTGGGGGACAGGGGCAGGTATGTGCCGACAC
-ACGAGACCCCTGTCTAAAGGATCTGCCTGTCCCCACATTAAAGCATAGAGAAGGCCTGAG
-CCCCTGCCCTATGCTGGTCCTGCAGGGCTCGGCTGGGGCCCAAATCAGGGGTTGACACAG
-TGAGAACAGGCTGCTGGTGCCTGGCATCCCCCACTTCCCACCCCACATCAACCAAATCTC
-TGCTTCCCCATTCTCCTGGACCTGCCCTGGACCACATCTATTCTGCCCTCCATTAGCTAC
-TCATTAAGAGAAGTTACATTTGTGTTTCTGGTGGGAGCCCTGGGGGTGCTGAGCAGCCCA
-GAGCAACCACTGGTGACCTTCAGAAAAATCATATTAAAGAAAAAAGGGTTGTTTTTGGAT
-TCCTCATCATTCGGCAAGCTGTGCTGGGGGTAGAGCAGCCAGATGAGTTCGGGACCGGGG
-CAGAGAGTCTACCCTCCAGCTGGCTTCTCCAGACCCACCTGCCCAGAGCTAGTGCCCTGT
-TAGCCAGGAACACAGAACTGTCACAAAGCTGTCCTGAGCATGAAACTGTTACCAACCAAT
-CTGTCCGTGGAGTTGTTACAAAACTGTCTTGTGTGTGAAGGTGTCACAATGTTGTCAAGT
-ATGTGACCTTGTATAAGAAATTGTCATGCAATTGTCCTATAGGTAAAACTGCCATGAAGT
-TGTCAAGCATATGCAGTTGCCACTCATTTGAAAAACTACTGGAGAAGAGTTTCTTTTCTT
-TTCATGTATGAGGGACAGGTTTGCTGTGTGGGTGACTTTGAAAAAGTTGCTGACAGGCAC
-TGTGCTTGGCTGCTGCTCCTGTAATAacagcgcccggcacccagtaggtgctcagtgagt
-acttgccgaatgTCTCCTCAGGGCTGCAAAGTAGACTCAGACAGGTTCTGGTTCTTTCAG
-GTGCTGGCTTTGTCCCGTAGTGGGCTGGTCTGATGTGACCTCGGGTAGGTCTGTTGCCTC
-TCGCATCCTCTCTGAGCCTACTTTGGTTGTTGTAAAGTGCCCTGAGGCCTGTGTATGACG
-TGCCCAGCAATACTGGGGACAATAAATGCTGGCTGCTAATTCCCTCTCCCTCTTGTCGGG
-GGTTTATGATTCCTCAGGGCTCTTGATGGTAGCAGAGGCCTCTCGTGGCTCTTTGGGAGG
-CTGTGGAAGCTTCAGCTTTGGCTGAGTAGGACGTCTGCAGTGGCAGGACACCTCCAGCCA
-ATCAGGATGCTCAGTGTCACAGGGATTGGGGGCAACGCCCACCGCTACAAACCCAGGAGG
-CCTCCTCTGGGGAGGATGTGAGCTCCAGGATTCCAGGAAGGGTGGGAGGAAACCTTCTAA
-GGGGAGCTGAAAGCTCGTTGATTCCTAAGATGAGCCCGAGTGAGAAAGGTACCAGGTTTT
-GAAGTTTGTTCTGCAAACGACCTTCTTCACTTTTTTGTGAAGTCCTGCaatcaacagagc
-tcagggctaggaattaggacctttgctcctgtcccaccttggactcagactcattgtatg
-acctttggcagagcacctggagcttcCAAGGGGTGGCAGAGAGTTGGGAATGCAGTTTCC
-TATCGGAAAAGCAGAGCCTTGGTCTTGATAAAGAACTTTTGAACTTTTTCTTAGCCAAGG
-GAGCCTTCCTTTTTGCAAGATGAAATGTGACATGAGAGATCGATTCCTAAAATGAATGAG
-TTGAGCTGCTTTGGCTGAGGCCAGGATGGGGGTGAGGGTGAGCATCTTGAGCTGTCTTTT
-TGGTTTCCTTTGCCTACTTCTAGAGGCAGCCTCTGAGAGCTTGGATACCCCCTAAGGAAC
-CTTTGAACCCCAGAGTTCCACAGTGCTAATGGCTGCAAGGCAGGTGATATAATTTTGTGG
-GACTCTGGAGCCTGGGTTCATTCCCACACtagcttctctgagcattggttttcccgtctg
-taaatggggataacgactatgctcacatgttgtgacagtgtggtaagctggttttgtgtg
-tggcatgccaaaacagggtttggctgacatggggtgcacagcaatgtgggAGCTGCTAGC
-AGTTGTGGATCTCTTCTTTCACAGGCCAGACTGCCTcaacaatcctgcaagatgggtagt
-attatctggtcttgcggacaaggaagctaaggcacagagaaggtaagtaagttgcccaga
-tcccatagctggtgagtggcaaactcaaagccaggcagtctTAGTAACAGATAGTTATTA
-TTATTTTAAGTACTGGGGAGAGTCTAGGCCCCAGAATAGGTCCAAAATAAATACCCTCCT
-CACCTTACATAATTAAGCTCTAAGAAAGCTTAGAAATAggccaggcacggtggttcacac
-ctgtaatcccagcactttgggaggctgaggcgggtggatcatgaggtcaggagttcaaga
-ccagcctgaccaagacggtgaaaccccgtctctactaaaaacacaaaacacctgcaccag
-gtgtggtggtgcgcacctgtaatcccagctacttgggaggctgaggcaggagaatcactt
-gaacctgggcagcagaggttgcagtgagccgagatcatgccactacactccaccctgggc
-gacagagtgagactctgtctcagaaaaaaagaaaGCTGAGAAATATAATCAGCTCCCAGT
-GCTGAGAAGACTTGGGGCCCCACTGCCAGTGAGCATCAGGAAAGGGGGCCAGGTCTAAAA
-GTCAGCGCTGACTGAGGCAGGTCCTTGGTCAGTGTGTCCCTGCCAGTGTTCCTGGGAAAG
-CCCCAGTTCTTCTCAGCCAGCACCCTGGGTACCTGGAGCTTCCAAGGGGTGGCAGAGAGT
-TGGGAATGCAGTTTGGGCCTCCAGCCCAATGCTCCATGCTCCTTGCCCAGTAATCACACC
-TGGCACAAAGTGAGCATCTTCAAGGACCCTATTCTGGGTCTGGTCTCTCCCCATGGGCCT
-TCTTCAACACTCAAATCCTAGTAGTACAAGGGAGAGAGCCCCAGATGTGGACTcttgtcc
-agttctgtgtgtcctcaggcaagtgtctccctgtctctgggcttcagtttctccatctgt
-caaatggatggttaaactcagtgtttctaaaggcccACTGTTCACccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccccatccatccatccatccatccatccatccacccacccacccatctatccatcca
-ctcacccacccatctatccatccatccatccacccatccatccatccaccaacccatcta
-tccatccaatcacccacccatctatccatccaccaacccatctatccatccactcaccca
-cccatctatccatccatccatccacccacccactcatctatccatccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccacccacccatatatccatccactcacccacccatctatccatccatccacccacc
-cactcatctatccatccatccatccatctatccacccacccacccatcatccacccaacc
-atctatccgtccatccatccattcagcagatatttcttgaatatcatctatgtgccaggA
-TCCTTTATTTATTAAAGTTAAAAGACAAATCACAGACCTGTAGAAACATTTTAGAAAGAC
-ATACAAAATCATACTGGATTGGAAATGTAAATTTCCCCAGGACttttgttcaccagtgac
-tctccaatgccatgcatggggccacatgtctactaggtgctctgtaaaatgtttattgga
-tgtaagaatGAATAGGACATATTTTGCTGTTCTAAAGAGAGCTGCCTCCGAGTCTGAGAT
-TGGAGTCAGACATCCTCTCTAGGACTTATTGAGAGGGGGCCAACTATCTTTGTCACCCCC
-ATCCCTGACCTGCCCCACTGCCTCCCCAGCCCATATAAGCCAGTTTCTAAAGAGGATCTA
-AGGAGGATTGGCCAGCAGTGACTGGGGCAGGGTAGGGCACGGCATGCCCCCAACTCCCAA
-GCCCAGGTGGGCTCATGGTTTGGAGGGGAGAAGCTATGAACCAGAGGGAAACAGGCATTC
-CATCCCTTGATTGAACTCACTCTTGTTGATCTGCCCTGTGTCCATTGGGAGTGAGTGGAG
-AATGAATGAGAAATGCAAAAGGGGTGGGGTCTGGCAGAGGCAGCCTGCATTGCCACCATT
-TGACCAATTTCCTGTCAATTTCCTATATTTGGTCAAGTGGACATTGAAGGAGGCTCTTGA
-GCTTAATCTAAGCCATGGTTTTCCAGCCCAAAGGGGCATGAGGCTGTTGAAGTGGGGATG
-GGGTAGTGAGGAAGCTAGGGTGATCTGAAGAGGTCAAGCTCGTGCTCCTTGCTCAGTAAT
-CACACCTGTGTACCAATTAGGCACCTGCCACACGTGGGAGAAAGGGGAGGGCATGGATGG
-AGGCAGAGGAACATTTAGTCCCAGTCCCTCCCTGCTGCTCACTGGTGATGGCCCCAGAGT
-TTTCTAACACCGGGAATTGTGGAGGCCACAGCAGCATCAGGGTAGTGACAGCTGTCTCTA
-TCCCCATTCCTTCTTCTGCTCCCCAACATACAGGGGAGAAATCAACCCAGAGGGAGGAGA
-GAAGAGAATGAGACAGCATGACATATCTCCCTACAGGGCAAATCAGTGGAGTCAGAAGCT
-GAGTCAGGCAGTGATGGGGAAGCAGTGATGGGAAAGGAGAGCTTCAAATCAGACCTGTAT
-TTTAAAAATTCAGCACTGGACTAGGCTTTTTAATAGCTGAAAGTTACCAGAAAGCTTTGA
-GATCTGCCCAAAGTTATTAAGGATTGGAGTTTAAAAATACGACTGTGCATTGGGGGTGGG
-GGGTGGGGGGTGCATGGAAAGCATGCCATGTTTGTAACCCTCTGTTACAACTTCAGTATC
-ATCATTAAGCCAGTTACACACAAAGTAAGCCAAGAAtatccttaatacacaacgagctcc
-tataaatcaataagaaaaaggggaatgatccaagtgtgtggagggagaatgggcaaagac
-attacaaggaatttaaaaaagaaagacaaataggacaataaccatacgcaaagctgttct
-acttccctaagaattttcaaattgaagatgagaacaagaatgaaataccaccatgaccta
-caagatacggaaactgtaaaagactCCGGCACCCTCTTTTGAGAAGGCAATTAGGCAGAG
-TCTATTATCTGTAGCCTGAGGTAGTAACAGcattttacaggaagtgtcctgagttgagag
-aggggtaggcacttgttagaagccacacagtgagtcatgggaggggaggagctagaactc
-agacctctggaTGGGCACCTTTGATTCTTTATCTCCAGCCAGCTGGTCCTCTCTGTCTGG
-GCTAGTGCACAGCCTGGCCCCTGGCCCCTGTCTGGGTAGCCCAGGTCTGCTACATCCATT
-GCTGCACCCTGCTCTGGGCCTGAGGATGGTTGGGGCACTGCTATTCCAAATGACACATCT
-CTTATGATTACCCTGTCCTTCCTAGACAGGAAGCTTTCAATTAGTCCTGCTGGGCAGCAG
-CCTTAGAGGgtagaggtaggactccaaggtttgggatgagacaaacctgttctcaaatcc
-cagccccacctttactccctgggacagttacttaacctcagtttgctcatttgtaaaaGG
-AACACTGTccaggtgcggtggctcacacctgtaatcccagcactttgggaggctgaggtg
-ggaggattacttaaggccaggaatttgagaccagcctgggcaacatagtgagacccttat
-ctctatgaaaataaaaaaaaaaaattagccaggcatggtgatgcgtgcctatagtcccag
-ctactcaggaggctgaggtgggaggactgcttgagcccaagaggtcaaggctgcaatgag
-ctaagatcgtgctattgccctccagtctgggtgacagagagagaccctgtctcaaaaaca
-aacaagattaaaaTGGACACAATCACCCACCCACTGAAAAGCttgttccttccacagata
-tttattgagggcctactatgtgccaggcacttttcaaggcactgcagatacatcagtgaa
-tgagacagaccttcccctcatgaagtttacatcctaagtgggagagggagatcatttcag
-agaacgacagggaattgaatttgggtacacagagtggcaggagggagggcctgggctgcc
-tggaagggcatctctgagatacacaagaaagcactcttggcggagggaccagtgggtaca
-aaagcccagaagcggcaaagaacgtggtgtggaagagagcagcaaggccagagtgcagtg
-actgaggggagagtggtgggtggtgaggtctggaggcagaggggccagacccccaggaca
-catggatgagtttggatggtgctggattttcctggaagtgagttgggaagccactgtggg
-ttgcaagccgaggagtgtctgccaccttgaaagcttctctggtgctgaggggaatggact
-gtggggcaggagtagaagctgggagctcagggtgtatgggctgtggtcattctggtggcc
-tggacgaggctggcagctatgagaagtgggtggatccagggagggtggacagacaagctc
-tgctcatgggttATCATGAAGATTAAAGGGTAAGTGACTCAGTCCACAGTGCAGCACATA
-GCACATGCTAGACAGATCTTAGCTGttttatttatgtatttatttatttttgagacacag
-tcttgctctgtcactcaggctggagtgcagtggtgtgatctcgactcagtgcaacctctg
-cctcccaggttcaagcaattctcctgcctcagcttccctagtagctgggattacaggcac
-ccaccaccatgcctggctaatttttgtaattttagtagagatggggtttcaccatgttag
-tcaggctggtcttgaactcctgacctcaagtgatccacccgactcagcctcccaaagtgc
-tgggataacaggcgagagccactgcgcccagccAGATCTCAGCTTTTAAGAGGCCTAGAC
-CTAGAATCCCATGACTGTGTCTACCCCACAGCCTCCTCCATAAATGCCCCAAATCGCTTC
-TGCCTCTCCTGGTCATTGGTTCAAAATGTGATTCCTTGACCTCTTGTTGCCTCTTGACTT
-TTGCAGCTGCTGGGATGAAGTACTTGTTCTGAGTTCCTCTAGTTGCTATTTTAAGCAGAC
-TGCATACCCTCCGGCCCCCATCTCCCAAGCTGGTGTGAAACCCAAGGCAGTATCTGGGTG
-GCTCCCTAAGTCGTTTTCCAAGTTGAGAATAGGTAGTAGAGTCACCTATTCTCACAACCG
-TGACATTCCACCCAGTCCAGGCTCCCAGACTAACTGCCCAGCCCCTGGAagtagagagat
-gggaggcagcaccaggcagcagggaacccaggtttgagtcccagctctgccaccttgacc
-ctaggaaggccctttgacctctctgagtctctgcacctcttctgcaaaataggaatgatg
-atattaaagaattgcttgcagggtaaagtgaggtaataacctgcggagcacctggctgtg
-tgcccagctcatatggcaaacactcaccaggtaggagGATCCTAAGGTTGTGGGCaatgc
-atacaaagcctctggtgcattgtaggtgctcaataaatggtagGATGCCAGTAGGGAGGA
-GTTGAATGAGAAAAGGGGAAAGAGACCCAGTGCATGGTGGGGGTGGCAGGAACACAGGGA
-GTTGGGGGCTCCACCTTGGAAACCTCTCCTGGCCCTGGGGGCACTATCTCCACCAAACCC
-AAATCCAGGCAGCTAGAGGGACCTGGGCCTGCACAGGCATGGAAATTCTGCACTCACTGT
-TAGtgggcctcagtttcctcatccgcgaagtggaaaccataacccttcttaccCAGTTAT
-AACCTGGATTCTGGGCTGGAACCAAGATAAGCAGCTACAGGCTGTCCTACCCCACCCCCA
-GCTGGAGACGCGGGCCTCTGGGAGCTCTGGCCGATTTTCAAAGGGACCAGAACTGCAAAA
-AACAGAACTAGGCTAATGCTGGCtgagtgttcacagtgtgccaggacctgtgccacccag
-gtccttgtactaaatcattaaaacttgccataaccccacaaggtgggggctacacttact
-ccattggcagggatgagaaaactgaggctcggagaggtaaagggcttggcccaagcattc
-acaggaggagccaggaggaatgcaaaactgagcccagctcctaactACTGGAGAGGAGCC
-TGCCTTGTGGTCCGTCACCCCTCCCTGCCAACCCCTGCCAGCTGGGCTTCCAAAGGCCGA
-CAAATGCTATTTAAAGTCATACGTCTCTCAGGTCCCGAGGCACACCAGGGATGGACCCTA
-AACTGTTTGTGGGGGCAGACAGGAGTTATATCAGCCAAGTGAAGGCAGGAGGGGAAGGCT
-ACTCCAAGTGCCTTTAGTCTGGAACTGTTTGCATTGCAGGGATGGAGCCCTTAGTAGCAA
-CCTCCAGACAGTCAAAAAAGCTGGCTTTGCACACAAACATCCCAAGTGTATGTTttcctt
-cattctttctctttctcttttctttttccttccttccttccttctttccttccttccctc
-cttctttccttcctccctccctccctccttccttcctttctttttctttcttctttcttt
-cTCAGtctctctctctctttccctctctctcttcctGGGGTGGGGAGTTGTTGATGCAAG
-AGAATGAGATGATCCACAAACTGAACTGGTTCAGCCAAAGCAGCCCTCAGCCAGGGGCGA
-GCGGGAAGTGTAAGCTGTTGGCTGAGGATTCTCCTTGTGGGGGATTTTGAGCCCCTGTGG
-GGTGTTGTTCAAGCCAATGTCACTCGCCTCCAGGGGCAGGGAGTCTCCAGCTGATGTCTC
-TCTTAGAGGAAAATTCACTGCTGTTGAGCTTACTACCTCCATCAGAGTAGGGGAAAGGGG
-ACCCCAAGGACAGGGTCTGGCTAGCAGCACATGCTCCGCAGATGCGTGCCAACTGCAGGC
-TGTGATCCTAGGGCACAGTCAGGAAGGGGCGTGGACAGAGGAGCATTGTCGCAACTGAGC
-GTCCCACTAGCGTCCTCAGGAAGGCCCGAGGGCTGCTGCAGCAGCACTAACACTTGGAAG
-AATCCCTCGCGGGAAGGGTGGTCCAATGTTGAGGAGTAGCAGATCCAAGCTCACACTCTG
-GAGTGTGACtttgcttgtttattttaaaagaaggggtctcaccacattgcccgggctggc
-ctcgaactcctgggctcaagccatcctcccacctcagccccgtgagtagctgggatttca
-ggcgagagtcaatgcacctggcTCTGGGGTGACTTCTTGTAAGACCTTCTCATACAGACT
-TTTTAATAAGATCAGAAAACCCAGACCATAAGGCAGAACAAGCCCCCTCTCCCCACTCAA
-AAACCAATGGATTTGACCACACTGACAGCATGGTAAGCAATGATTTCTACTCTCCAAAGG
-TGaggactctacaaagtcagattaaaaaagattttttttgtgtcaaaatgaacatgggat
-tgatatctaggtaatacaaggaagccctacaaattgacaagaaaaattcaggaattccaa
-ttttaaaagtgggaaaaataaaaataaaatgtttaaaaagtgaaaaaataaaatttaaaa
-ttaaaaatcaggtgaataagaattacatgattaaaacaaatttaaacagttaaaataaca
-ttcaaaaacgaaattaagtaacaaaataaaaatttaaaaataaggtataaaaataaagtg
-taaaaatccattcaaataaaaaatacatttgtaaaataatttaaatacattaaaattaat
-aaaaacaaaaatgttaaaaataaaagtaaaatgtttaagtgaaataaaatttaaaaatgt
-aagaatacatgaaagaatttttacgagtaaaataaaaaatcagctatttttaacaatcta
-aagaataaagaaaAACTAATAGAAACATCAAAGGAGAGCAAGGTCTTGCTAGATGGATGC
-TGATGATGTGCTGTGAATTAAGGAGTCCGATTGGCTCAAATGCCTGCAGGGAGGCGGGGG
-AAGTGAATGACGGGGGTGGTGTAGGGAGTGAGAGGGGACGAGGAAGTAAAAGCATGCCCG
-CAGGCAGCATCTGATTCGGTTTTTCCAGCCCGCTGTGGGCAGAGGGCAGGAAGTCAGGCC
-CCATCATGGCTTCCCCCCAAAATAGCCATCACATCATTTATGCATTTGTAATGTGCTGGC
-AACATACGCACACGCACACGGATGCATGTTACATCATCCCATCCTCACTGCCCCATCCTC
-ACTGCTGTCCTCTGAGGTCCACTTTCttttttttttttttttttttgagacggagtttcg
-ctcttgttgcccaggctCTGAGGTCCACtttcatagaggagtgaacagagactcagagag
-ggtgggtcactgtgccacagtcacacagcACTTAGGACCACCCTATCCTCTGAATCTGGC
-ATGCTCAAAATGACCTTCTTTGGATGAGTTAGGTCTGCTGAGCACTTTCAAACAGAGGCA
-GGGCCATCTCTGACATCAGGCTCGAACGTTCTGTACACTAGGAAGAGCCCAACCTCTCCC
-CCCATGACGCATGACAGTTATCaccattaaagaaacactgactgtcttccaggggcgtca
-catgcatagtcatcttgaaaaccatatgaggtagatgctcttattgtccccattgtattg
-acagacaacatcgagattcaggagtcaaatactgtcacccaagcatggcagtaacagaac
-tgggagctgagcccaggactgtccacagcccaaatctcacactccctgcgtggcaccagg
-cCCTTTTAACCGTCATTGATGAGCACTCCCTATGTACCAGCAATGCGTTTGTCTATGTTT
-CATGcctcattttgcaaattagccaacgggggcacagaagggagagatgacctgcccaag
-gtcactcagccagtaagtggcagagccCACAGCCTTCGTGACAGCCTGCCAAGCCCCCAG
-TGCTCATCCGGGACTTGCTAGAGACAGCTGTGCCCACTGGCCAACCCCAGATCAGGCTCA
-GAAGGGCAACTGTGACATTCCTTCTCTTCATGTCTCCACCCTGGCGGATGTGGGCTCTGC
-CATCGGGCTCCAGGGAAAGTGGAGGCTTCCAGTGAAAGGGAGTGGTTTCCCCATGTGGCC
-TGGGTCCTCTGGGCTTGGGAATGCCTCTGTTTTGAGCTGGTGAAACAGAATTTCCCACCC
-CCTCCGCAATGGCACATCAGAGCCCCCACTATGGGCCACAGAGCAAGGGCCCTATGAATC
-ATGCTGCATTACTGCAAGAAATCATTCCAGGGCAGGCAGTGGCGGCCCAGCATGGGACAG
-CAGTGTCCGGGTGGAGTTGGCGTCACCCATCCGGAGATGGGAAGCAGACCATTCCCGAAG
-GGATCTGGAAGAATCTCCGAGGGCGGGGCTGAGGGCAAATGTGTCCTGGATGCTGCTGTT
-CCACCgggctaggaaaaaaagctccagcccacagagacctgggagcacatcacgaccttt
-ccccagcctggctgtgtgtccttggcaagttgattcccctccctgaatgtggaaggcctc
-atctgtagaagagggagaataatagggtcaagccacttcatggggctataatgtgggtAG
-CCTGGGAGGAGGGCtggcatggtggttatggactcaggctttggaatcaattgtctggat
-ggaatcctggtttttgccaaacttactctgccaagctgtgGggtagaaacatgaaattgc
-taatatttggctgtttatgacctagaaaaatggcaactgcatatacttcaaTGAATGTGC
-CTctcttttaactgcttcctcctctgtaaaatgtgggtaataacaggcccctcagagggg
-tgctgtgaggatgaaataagGCTgggaggcaattaagttcagtagttagagctgggctct
-ggggcaaggaaggatttgaaccttggctgagtggccttgggcaaagttacttaaccttcc
-tgtgcctcagttttcttgtctgtaaaataggaatgctactgcccactgcacaggtttatt
-aaggtaatttaatcaattaatacatacaaagtacatagaacagtgtctgAAATTGTTACA
-TAAAAGAATGCAGGTAACATCTGGCATCTCCTGCACCCTCATGTCTACTCACATAAATGC
-TCAACCACGAAACAAAATCCAAAGTGACTTTTGTAAACCTTTGATGCCAATGAAAGTTAA
-GTATTTTTAAAGAAAAAATATGTTTTGGGGAACATACATGTGTGTAGAGATGTAGGTGAG
-GAGTGTGCTCCCCAGGGTCCACCCCCAGGGCTGTTCTATGTCCTGATGGTGCCTATAGCC
-CAAGACTCTGAGGACAGGACTAGCCTTGAGGCCATGATGGCCCCGTGGCTTGGTCTCTTT
-CACAAAATCACACAGCCAAACCTCAGACCCTATGGAGAGGCTCCACTTGCCTAGGTAACT
-CTAGAGGCCCTTAAGAGGCACCCAGCCCTGGGCTGGCCTCTGATTATTAAGAAATTCCTG
-CAGACAGCCTTGGATGTGCGAAAGCCCTCCAGCTTCCATCCTGTCTTAAtttttttttag
-acgaagtcttgttctgtcacccaggctagagtgcagcagtgcaatctcagctcactgcaa
-cctttgctttccaggttcaagtgattctcatgcctcagcctcctgagtagttggtagttg
-ggattacaggtgtgcactaacacacccagctaatttttgtatttttagtagagatggggt
-ttcaccatgttggccaggctggtctcgaactcctggcctcaggtgatctgcctgcctcag
-ccttccaaagtgctgggattacaggcgtgagccactgcgcctggctCCATCCTGTCTTCT
-GACATTTGTCCCAGCCCTGGGAAAAAAGGCAAAGCACACTGAGCATTTCCAAGTCACGCG
-GGGGGAAACTGAGGCTCTGAGAGGCTCTCAACCTATCAGGCTCTGGAGCAGGCTGCCTTC
-CTCTACCAATTCAAGTTTTGCCTTCACCGCTAGTCTCCTgaaccctcacttctactcaca
-gctgggtgaccttgagtaaggtacttccctgcttgagtctccaattttacaaggattggt
-ctcaaaggtctcacttggcctttttggccttatcacttcattattctaGAACCCTTCTCC
-AGAATTTCAGAGAGAAAATGAAAGCTGAATTGCTCTGCAAACTATAAAGTGCTACACAAA
-CAAGAAGGTGGTTAATGGCAGCATTAGATGGGTTTTCAGAAGTCTACCGTAGGCAGGATT
-TGCTGTgggttttggaattaagaagacccagctcacacatgtatttgcgacgttactttg
-gataagccagttcccctctctgaaccaacttccctcttctgtaagctggcggtagaggca
-tatccaccaggcaggactggggtgaggaccaaaggaaaggagcgtgcaaTGTCTGCCACG
-CCCTGGCCGAGCAGAGGTGTTTGATGCAGGAGGAGATTTAGGGCCCCGACACATCATTCC
-ACCTTCCAGGAGCTAAAATCCACACACCTGGGGAATGATGTAGCTGTCAGATTCAGGGCG
-ATTAGAAACAAGCATCTGAACTAAGGCAATTGTTTGgagctccagagacagactctctgg
-gcttacatcccagcacccctgtctgttgctataccacccactgggcctcagtctcctcat
-ctataatataaagatcctcctggaatctgccccttacagctgtcaggagggcctccatta
-ggccatgactgaaaggggctgagcacagAAGATGGGCTCAGCTGGTCCAGCAGCCTCCAC
-ACTATTTTGACAATGGTATCAGTAGACACAGTAGTacacacgtgcacatgcatgcacaca
-ctcacatacatccacatatatgtgcatgcacactcacCCactcatacacccattcacata
-tatgtgtaaactgaaacacatttctcaaaataatagttttcacacttgcaatgcactctg
-atatattctaaaaaggaggttggcaaaaatcgcagcctctggaccaaatttggatgtttt
-tgtgttgcctgtgagctaagaagagtggagtacatgacagattgtatgtggtttgcaagg
-cctaaagtatttactatctgacccttcgcaaaaaatgtttgctgaccccactctatttta
-gtcagtgctattccattccgttctgttccgttccattccattccgttaccattccattcc
-atttcattagaaaatgctggctattgctaaatttattgtcctcacctgctgatgcattgt
-aaacctcagcttggaaaacTTTAAACTAATGGGAGCTTCAGTTTTTTCACCAGATGGGAG
-GATGGATGAACAAACCGTATCCATGTGACACCTTAGCCAAGCAACCTCCCCTCTTTGTCT
-TGGATTCCTCGGCTGAGGCTGAGACCACCACCACCAGCCTGCTCTCAAGGGTGTGTTGAG
-GTGCAGCCTCAGAGGTCTTGTCCATGATGTTCTCATTGACGGATCTCaagagcccaatag
-taaatactttaggctttttgcaccacatacgatctgttgcctattcCAGTATTCTTAGCT
-TGAAGGCCATACAAAAATAGTCCTGTGGCGGCAGAAATGGAGGAACACCCAtctctgctg
-tccttttcaatacccagcccagggcctggcccacaggaaggacccaataagtatttcttC
-ATGGTGATGGTGACTGGAGAGTGGCACCCAAGGCCCTCCATGACGGGACTCTGGCCCAAT
-CTGCAATCAGAACTTCACTTCCTTCGGCCACGCAGTCCCTTGTCCCCTCCACCTGGCCAC
-ACTCTCTCCTCATCCTGCAGAGGTCCTCACCTTACTGCCACCTCTGCCTGACAAAATCCT
-AAATCCTACTCCCCCCGATGGGGTTCCTCTCAGACACTTACACCTTGCAGCCCTGGCAAA
-TCACTGGCATGATTCATTTCTATATCTATTgcacgggcttcggagcctccaaaactctgg
-gtccaggtcctggctcagcagctgtgagctctttggcaggccattgatgctttctgagcc
-tcagttcccgtgtctgggaaataggcataacaCAAGGCAGTGGCAGAGTGAGGACGCGCA
-GCCCCACCTGCACAGCTCCTGGCACATGGCCCGCCTCCCTCCTTCCTCAGTGGCCTCAAT
-CTCAGTGGCCTGAATCTCCTTCAGTGGCTGGGCAGGGGGGTTGGATGGTTTCCGTCCACA
-GGAGAGGGAGGTGGGGCCCCCCGTGGTGGGGCAATGGGATGGAAAAGCAGCATCTCTTTT
-GCACCCAGGCTTGGCTTCAGAACGCTGAGTGGAAGAAGGATGGCAAATGGAGCTCAATTG
-ATTGACCACCTACTATCTGCCAAGCATTCAGATTTCCATTTCTCAACCAGCCCCTATGCT
-ATGAAGAAACCGAAGCCGAGAGACCCAAGGTTACATTCTATTAAGACTCAGCGCCATTCC
-CTCAGCCCTCAATGTCCAGTCATTACCCACCCCTGCCCTGTAGGAATCCCTTTCAGAACT
-ACCCCTGCATCTAAACCTGGCTTCACCTGGATGCCAGCACTCAGGGGACATACTTTGTTC
-GTGCCCAGCGATGGCGCCTGCTTGCCCAGGGCCTGGTGCATCTGTCTGTGTACAGGAGAC
-AGtgctgtctgcctggccctccacaaggggctttgcaatttaaacggaagcatcatattc
-actccacataacaggcctctggagtgggcactgccacagtcaatttacaataaagaaaaa
-caagctcagagagaggagaaggtttgctccggatgcaccacaagcaagaggcagaggtga
-gcttaacccacgtgagaccccactcccttccggtccagggcatgtctgctctgcTGTAAA
-ATGGGAAGGGAAAGTGGTCAAATCCttatgaagcccctactgtgtgcctttggccccctt
-ccctcttggactgcagtaaatcttcccaattgctcagagaggtaggtgtaagttttccca
-tttcacagatggggaagcacggacgggagaaggcatgtggcctgcttaatgtcacatatc
-tagggcaggagagggctcaaggtttgatcccagggctcttcactTTGCCCCTTGCTTGCT
-CAGGTCTAGAAAGATCCAGAAGCTCCATGTGAATGTGGGGGTCCCTCCCCAGAAGGCCTT
-GGATGTCAGGGAAAGTCAGTCACAGGCTGGCATCTCCTCCTTGCCCAAATGGACCTCCAG
-ATCTAGGGATGCGAACCAGGGCCCCCTCACTCTGCCCTACTGTCCCATTGCCAGGACacc
-ccagcatgtttcaaaaaaatgtccccatctggttctgattcatttacacttcattaatca
-acatgctgttttgtaagagacacttgagatccaagaatctttctcaagtcttttacttca
-ttctttcttagaaacagaaaaattgggcttcattaagaCGCAGTGACGCCGGAGCCTGAG
-GAAGGATGGGCCTGTGGGAACCAGGCCTCAAGCAGGCTCAGAGAGGGCAGATGCCAGCCC
-AGCACCTCATTCCTCGGGATTGTGCAGACCTGGCCAAACGCTAAGGCCAAAGACTCAGGC
-ATGGGGGAGGCTGGAGAAAGGTGGGAAAGGGTCATccctctatgttggcagctccccaag
-gacaggcccagggctgctcacctgggtatctccaaggtccccaacacagagcctggcaca
-gaggctgccctgtgaaatgaacaagtgaatgaatgaaGCACTGCCAATACCCAGGTGTTT
-TCAGGACACATTCTCCTGCCAAAGTTAGATAAGGTCAAAGCTGGTAGGACCCTGAGGGAT
-TGTGTACAGAATTTTCCAAGCAGATGCCTTATGAGAAATGGTCTCTGATGTGTAATATGT
-TTGGGAAAGGTCACTCTCTCTCGCtctctttttttttttttttttttgagacagggtctg
-ctctgtcgcccaggctggggtgcagtggcacaatcacggctcactgcagccttgatgtct
-ttcctgggctgaagcgatcctcccacttcggcttcctaagtagctgggactacaggtgtg
-caccaccaccaacatgcctggctattttttgtatttttttatagagacaaaaaatgtatt
-ttttgtagagttttgccatgttgcccaggctggtctcgaactcctgagctcaagctatcc
-tcccatcttggcctcccaaagtgccaggattataggcttgagccatcgcacctggGTTAC
-ACTGTCTGTCTCCACCTCTTCAGCATgctctgataagtctcacagccaagaaatctgcta
-aacccagcatttcccaatctatttgaccagaactCCTGTGGCTGCCTTGCAAAATATGCT
-ACAGGAAGGGTTTATCTAGCTCTGGTCCCCACTGCAGTGCCAGTGGGAAACTGAGGCTAT
-GGGCGGGGGACAGAGAAAATCCACTCACCCAAGGTCACATGATACAACTGGGTCAGGGGT
-GTGACTGAAATCCAAGGCTATCTCCATTGTACCCCAACAAATAAATGGAGCCCTAAGCCT
-CTTCTGAAGATGCTAGGCAGGTGTGTGTCCCAGAGGCAAGAGATCAGGTACTGGAGGAGG
-GATGCTGAGAGCCCCTCACCAAATTGCGGCCATATCCCTACCTCCTCACTGAGCTCCTGG
-GGAGGTGGTGGTGAGCTGTAGATGGGGCGGGGGGCAAAAGGGGCAGGATAGGAATTTTTC
-ATTTTTCTTTAATTTTTTTGTCTTTTTTgagctgagaagcatcttaaagtcttctaaacc
-agctcctttttgttgttgttgttgttgttgagacagagtctcactctgacacccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctctgcctcctgggttcaagcgactct
-cctgcctcagcctcccaagtagctggaattacaggcgcccgccaccacacccagctaatc
-attgtatttttagtaaagacagggtttcatcatgttagccaggctggtctcaaactcctg
-atctcaaatgatccgcctgccttggcctcccaaagtgctggtattacaggcgtgagccac
-cacacctggcctaaaccagctcctctttagatgaggaaactgaggctctgagaagggaag
-ACCAGCACACCTCAGAAGATATCTTCTCAGCATTATgtcaggcagattgggattcgagcc
-tgctttgctactcacctgctgtgcgaccttggacaagtcagtttccttctctgaacctca
-gttccctcatccagaaaacaagcatCTCTCCCCTCCCTCCACTAAGCCACTGTGAGTAGC
-CAAAGACACAGTGGACAGGAAATGAGAATGATTAATACTTACGAGCACCCATTAGGAGCC
-TGTGTCCTTAGCTACTCATCTTGCCCACAATCCTCCTTATGAGCAGGATACTTAAGTAAA
-AGATGGGTTGATGAAGGGAAAGGGGGTTTGTTTGATTTTTTGGTATTGTttagaatggag
-aaagatctcagagatcttctaaaggaccctcagatgggtaaagtgaggattggacaggca
-aagtgacttatccaaagtcactcagttggtaactggggaagctgggatttgaactcagtt
-gacctggctccagagcccatgcccctaactactaAACAAAGGCCATTCACAAAGGAGTGT
-CCCCATAGAGTCCCAAACTCACCCCAGCTCAGCTGAAAACCACACGCCTCTCTAGTCCCT
-TGTCCCACTGTCACAGCAAGAACTGGAGCCTCTTGGGCCACAGTCTCCCCAACCCCATCC
-AATCCCACCTCCCAATTCTCCCACAGCCTCTGTCTGCTTCCTGCTCCGTTCCAGGAGTGA
-CTGTGTCGCTGTAGGGCTTTCACACAAATGGAAGGCCCCAGAGGGCAACCCATCCTCTCT
-CATTTTCCTTCCCCTTTATCCTTGCTCAGACCCGATGCCAGGGCTGGAAAGAGAGAAGAC
-accagctggacaattcagcagttatttaaaccagtctgagccttggaatcccaggcttta
-ttaaaactggacgacccctatgtcatgagcatatagttgggatttgatgagctaggacat
-gaaaaacccgtggcatagtggctggcaTTCGGCTGCTGATCTTAAGAGTGGCACCTGGAG
-GCCAAAGGGCTGCCCAGCTCAGGCAGGCGATTTGCTCACTTGCTCACCCGCTTACCCTTC
-TCTGAGGCACAGGCTCTACCAACTCCTGCTCTGCAGGGACAGCCTCCAACCCACCTTCTG
-AGGATGTTCTGACTCTCACAGCGAGGCTGTGGCATAGGACTCCCAGGTGAGAGCGCATGC
-GGCCCCTGGTACATTTATAATCTGAACCTTGGCTCATCTTCCTAGTGGCCTGAGAGGTGA
-agatggaaaagctgaggctctctgaggggctggacttcttctaggtcatcccctattaga
-ataagtgaacctgaactcaggtctcaggtctggctgaactcaaCATAGGGGGGCCATGGA
-GGATCACTGCCCTCTGGGAGGTGACACCAGGAGTCAGGGTGAGTGATGAGGCTGGGACTG
-GGGCCTCTGGACGCCCAGCCCAAGGCTCTCTATGTCACTTCCTGGCCGAGCATGGATGCT
-TGGAATGGCTTCTACGCCACTGAGTCTGTCTCCTAGTCCCTGTGCCCCGCAGGCTGGCTC
-TTGAGTCTTCTGTCTCTGCACGAAGCCATCCTCCTTTCTGCTGACCATGCGGCTACTACA
-GAGAGCCCTGCTACCCTCTCCCTTCTGGGTGAGTCTCCTTGGCCCACCCTACTCAATGGC
-TCGCTCACTGGGTGCCCTGGAGCCTCAATCTCCCCATCTTAAGTGAGGTTGAGACTCGTC
-TGGAGGAGCGAAGGACCCAGGGCGCCAGGCACCAGGCAGATGCCCCCAGAGCCGCCGCCC
-CCGGTCCTCCGGCCCCCGGTCTGCCCCGCAGCGCCTGCCCGGCCGCCCTGCCCAGCCACC
-CCTTGTACCTTGCTTCTTCCTTCGGTTCAGGGCGAGCATGTCCACGGCGTGGGCGACGAG
-CAGGAGCAGGCAGAGTGGCGCCCGCATCTGGGCAGCCGGATCCGGGCTGGCGCTCCCCAG
-GCGGCCCGACGGCCCAAGGGCCCCACGTcccggcggcggcacggcgggcgcgggggcTGC
-TGTGGGCGCGCCGGGCGCATCCGCCAGGCGCGGGTCGGTCCGGCCGCCAGGTCTAGTGAG
-GGCGTTGGCGGAGCCGGGGCACTGCCCTGGCGGGGAGGAgccggcgcggcgggggcggcg
-cgTTAACCAGCTcggggcccgggagcgcgcgcggggagggggcgggggTCACCCGGGTCG
-GGGCCCTCGAGTTCGATCTGTCCCGCAGCCGGCGGTCTTGCGTCTTTCCCGCCCCCAGCA
-CTGCCCCCGAGCACGTGCACGTGCCCACCGCCAGCCACAGGTACGCACGCGCGCGCAGGT
-ACAGATGCGCGGACACCCGGAGACCCGTACGGTCCCCCGCGCCCTCTCAGCGCCTGTGAT
-TTTCTTTCCCTCCCCCCAGTCCCCTTTCTCTGTCTGTTCCTCCTTCTGGCCCTTAAGGAC
-AACTCCTTGTCTCCTGCTTTCTCGGTCTTTCCGCGGCCCGCGCTCCCCTGCTCTGCCCCC
-GACCCTGCCTGGCTGTTCCTGCATCCTTTACTCTTGCCGGCCGTCTCTCTCTCAGGCTCA
-CTGTCTGTGTCCTCCTGGCTGGGCCTCTGGTTCTCCCTTTTCTCTGTCTCTCCCTTCAAC
-CCCATCTCTCCCCTTCTCCCCTCCTGCAGGGTGGGGTGTTTGCGGGGCTCCTGCTGCCTG
-GCTTTCTCTTTTTCTCTCTACTCTGTCTCATTCTTTTAACAGAGGCCTGAGCCCCTTCTG
-GCCACTAACCCTGAATGTTTCCTGTGCAGTCTGCGGGGATCATCTACTCCGACTCAAAGT
-GACCAGCACCTCATAAATCCACTTGTGACAGGGCTGGGGACCTGGACTGTGTTTCCTCCA
-ACCTTATCACCAGGACTGGGAGCAGCTGGTTCAAGTTTAACCCTTTCAGAGCAAAATTCC
-TCCTTCAACCCGACAGCATGCTCACCTCTCCTGTCACTATAACCACCAAAAACAACAACA
-ATCATGCTagctatcatttgtgaggcatatatggtgggcattgctaagaacttgacatat
-actagagtcttcaaaacaacccaatggtttgggtttgtattctgagtaattccacttttc
-tggggagcaaagggaagctcagagaggccaagtgacttgcccaaggccacacagcaggtc
-agtggcCATTCTGGTCCAGTGCCTGCCCCTCTTAGCCACTTCTCAGGCACAGACTCATCA
-GAATGGAAGAGGCCTTGGAGGGAGGCCTAGAGAAACTTACAGTTGACACTCTCTTGCTGA
-ACAATTGTCCTTCCtttttcttttcttttttttttcttttttttgagatgggttttcact
-ctgtcacccaggctggagtgcaatggcgccatctcggctcactgcaacctctgcctcctg
-ggttcaagtgattctcctgcctcagcctcccaagtagctgggattacaggcacctgccac
-cacacccagctaatttttgtagtttttagtagagacggggtttcaccatgttggccaggc
-tggtcttgaactcctgacctcaagtgatccacctgcctcagcctcccaaagtgctgggac
-tacagacgtgagccaccccacccagccTGTCCTCTTTTTTCCTACATGTGGAGCTTGCTC
-CAAAAGAAATGGAAGGTAAATGCTGGTATCTCCTCCAGCTCCTTCTCCCAGTGCAATGAG
-GGACACTTGAAGGCATGGCAGGGGCAGGGGAAACACACAGAGAGTGTGGCAGCTGAAGGT
-ACAGCCCTGGCCTGGCCATTCTTTCTGTGGGGCCCCAAGAACGCTGGCAGACAACACGGa
-gaacttggtggaatgtcagagacagcccacccaaagtgctccatttcacagatgaggcca
-ctgagccttcaggactggggggtgcctagattaggccacccagtgagtcaaggactgagc
-tgacatgggcatccaggtgtccCATTGTGgtcatcaccatggcctgcaaggacctcttgt
-tctgatatctctgatctcagtctttcccactgccccacccctctctctttagccttagag
-atttcagcccttgaatatttcacaaacaccacaggcctctcacacctctgagcttttcat
-gttgtggggcctctccatggaataccatcctatatcctacctccttcttcactgcctctg
-ctccaggaagccttccctgattctcaggccaggtccagtgcctcctctgggcatccacaa
-tctctttatcacagctctgatcacatcaggtggtaacaatggatgtgtctgttctccttc
-caaactgccatctctttcaagccagagccagacacacagcggtgctcagaatgtttgcat
-aatgagtgcataaataaatgaatggtgaatgaatgaatTCTCCAGATGCACAAGTCTCCC
-AGCCTGTACATGGAATGCAGGTACTTGGAGAAATGAGGTGACCCCAGAAGATCAAGCCTT
-AGGAAAGCGGAGGTCATTCCCTTCCCCACTACCCCCAGTACTGGAGTCTCCAAAGTCCAA
-AGGGGACAGCTTCCATGTGAGCAGGGCCAGAGAGGTCCAATGTGCATTGTGAATTGacag
-ccagccacacggctctgcaggatgaagctgcttaccccttcttgaattttttcccctatt
-tattccccactgcctctgctctagctagcctcgtgtttctcagactcttgtcactcatcc
-tgcggtttttgctgttctctctgcctggaaagtctttccccagatttggggcttgtctcc
-cctcgatgttgcctcctcagagaggccccctgtgaccactccagtaaaacgcaccaccat
-gcactttatcctcttgtcttgctttaccctccgtagtacctgttcatgtctgtcagttcc
-tgtttgcttgtttgtgagttccatgaggacaggaatcttctattttgtccctatgtgcct
-tacactgcagtgattaagacatacttgtggaatggatttttttaaaaaatgagtgaatga
-atAAGCACTCATTCATccatagattcattgtgggacctcaagtactttctgttctcttag
-gctcaatttccccagttgttcaatggcacagatgggattttgtgttctgtgagagcccct
-ttagtgcttccagaattggatatttctagggttcTAAGGCCCAGAACTCAGGGCCCTTCA
-TACCCCAAGATGCTCAGAGGGTGTTTGGTTCTCTAACTATGGGGGCTGTCTGGGCATCTT
-GGCCTGTTATCCAGTTCCCCTACCCCAATACAGGTGCCCAGGGAGGCTAGTGATGCTGAT
-GGCATGCTCTGGCGGGGGGCGGGGAGGGGTGCACCCAAGGGTGTCAGTTAAGGCACCATT
-GTCACAAATAGATGAAGACAGGTATAATGGCTGAAACACACTAAGCTCACAGCATGTGTT
-CCTGATCAGCAGATCCTTCTCTGTGGGATAGCAGGAACTCAGATTCCTTTCAGCTTGTGT
-TCTGCCCTGTTCAGTACCTGGTTTAAAGCTCACCGAGaagggcagggcttatgggaagta
-cagagcctgtctacctatgtcccattggccagaactcagacacacggccacacctacctg
-caagggtgactgggaaatgtagtccagccatgtgccagacaacacacaggaggaaaagca
-agaatttggtgaacatctggccCATTGACCAACGTTGGgccaccctcatttcttgcccca
-gtcatgcagtagctccttcctgtgtctgctctgacccctacaagctcttcttaagcagcc
-agagGACATGTATTATTCATCGGGTGAAGACCAAATTTCTCCTCAGAGATGCAAGGGCTA
-CGTGATGGCCCCTACTAGGGGGCCATCTGCtagggtgaccagctgtctggtttgccaggg
-attgaggggcttcctaggatgCAACGTTGACCTGTGTGTAGCCTTGtataatacaaccac
-aatcaagatatttaaacatacttaaacaagatactaaaacatcatcacaagactccttca
-tggtatccatttatggctccaccctccctctccacttccagtcctaatccctagcaaccg
-ctaatctgttctccatctctgtaatgttttattttttgagacagggtcttgctgtgtcac
-ccaggctgaagtgcagtggcacgatcatggctcactgcagccttgacctcctgggctaaa
-gcttctcctgcctcagctgtgtagcctggactacaggtgcatgccaccatggctggctaa
-ttttttattttttgcagaggtgaggtttcgccatatttcccaggctggtcttgaactcct
-gggctcaagtgattcttccacctcggcttcccaaagtgctgggattataggtgtgaatca
-ccacgcctggcctcccatctctataactgtttttacataaatattgtataatggagtcat
-gcagtatgcatctttttgagatttggctttcttcactcagcacaatttgtttggagattc
-attttagttttgcatgtattagttatttgctttttactgctgagtagtattccaccgtat
-gaatgtaatatagtttgtttaaccattcacccactgaaggacatttgggtattttctagt
-ttttcattattaagaataaaggtgccatgctcacttgtgtataggtttctgtgtatcctc
-tttggtgaaatgtctgtgcatatctttcacacattttaaattggatttttacattactat
-tgtgttttaagagttctatgtatatattctatatagaagttctttgttggttacgtgatt
-tgcaaagcgtgagatttatgtcaaggttcattttgtatttttgtttatttttttatgttt
-ttgtttgtttatttttatgttcgtttttaatttttgtttatttcgaggttcattttttat
-ttttcgtctgcggatgtccaattgctccagtatgctttgatgtaaaagctttatcaaaaa
-ttaattgggcatattggcatggatttattttggggctgtctcctgtattccatgggctat
-gtgtctttctgtctaccaatactacactgtactgattactgtaactatataataaatctt
-gaaattgggtagatggatccttcccactttattcttctttttcaaaattattttagctat
-tctagttcctctgccttttcatatatattttagaataatcttgtttatatctaccaagaa
-tcttgctgtgagtttgattagaattgcattaaacatgtatatgaatttgggaagaattca
-catctttactatattgagtctttcaatccaaaaacatagtatgtctctccatttgtttag
-atcttctttgacttttttaaataaatgttttgtcattttcagcatacaactcctgtgcat
-gttttgttagatttatacctatttccttttttctcccttagaaattatacatggtattct
-attttaaattttgctgtccgtgtgttcattgctagcagatagaaatacaactgatgttcg
-tgtgttgatcttgtatcctagcaccttgctgaactcatatattagttctaggagtatttt
-tgtagatttttttgggttttgcaacattgacaatcatatcaactgcaaatagcgacagtt
-ttctttccttctgatcttgtgccttttgtttcctttacctgctttatcaaacttgctaga
-acttccagccatatgccgagtaagtgtgatgagcatagacatccttgttctcaatcttgc
-ctggttcccaatcttagtgggaaagcattcagtcattcactatgacattagactgtagga
-cttttgtagacactctatatcaccttgaggaagatcctctctattgctacttttctgagc
-attttttaaaattatgaatggctgttgaattttgtcaaatgtttttcctgcacattggta
-taatcatttaatgtttattctttagtctactgatacgatgtattacattgattgattttt
-aagtataaaaccaacctttcttcaatggaataagccccacttggccatggtgtaccattc
-tccattatatactgctgaattctacctactaatattttgctgaggatttttgtgtctaaa
-tccattaagaatattggtctatatttctcttttttgttctgtctttgtctggttttggta
-gcagggtaatgccagccccagtagcaccagaagaacaaggcttactagaatagaattgca
-agggttccaggccaagtgcggtggcctatgcctgtaatcccagcattttgggaggctgag
-gtgggcggatcacttgaggtcaggagttcgagaccagcctggccaacatggtgaaacccc
-atctctattaaaaatacaaaaattagccacgtgtggtggtgcatgccagtaatcccagct
-acttgggaggctgaggcaggagaatcacttgagccctggaggcagaggttgcagtgagcc
-aagatcgtgccattgcactccagtctgggtgacaagagcaagactcctctcaaaaaaaaa
-aaataaataaataattgcaagggttccaacaagtttactgtcattggacctaaagcccac
-aaaagtaaacgagaactcacatgctacatttaaacagggaaactgctgcctgctaaacta
-aagtatgaaataagacctgaagttccaactgatgctaatactaaaatgactcagatgttg
-aaattgtctgacaaggattttaaagcagtcatcataaaaatgctttggcaaggaattatg
-aaatctcttgaaacaaatgaaaacagaaaatctcagcaaagaaatggaagttatataaaa
-ggatcaaacagaaattttagaaatgaaaaataccataactgggggaaaaaactttgctaa
-tggactcattagtacagtggagaagTTCAGtgatggacaaataccccaactctctattga
-atgggcaggatggccggacacataaaacatgccacgctgtctcctgccacaattccccag
-ccctgccatgctgacttcagagggactgagcttcagttgcccacggtgctgtctgggtaa
-cctgtccttcatgggctgcctgcccttcctgtttcactccttatgctccatgctatgctt
-cttgggatcaattctcaaatcaatttcttgaactcaaatccttgtctcagggttggcttc
-tggcaaccccaaaccaagacTAATTCTTACTAATTCTCATGACAACCTATAAGGTATTAC
-AGGTAAAACATGGAACAGCACCTAACCCAGAGTAAGTTCTCACTGGTAACTTTCATGATT
-GGTGCCTCAGTTTTGTTATGTATAAGACAGAGGCATCGAACCCCTCACCCTCTTCCTCTG
-GACTTCTTCTTGTTCTCCTCTTAAATCAAAATCTCTGCAAACCCACCTTTGTTCTTTGTT
-TTACCTGTTCTTTCCCAAGGGAAGGCAAACAGCCTTCTCCCTGTAGGATGCTCAGGCAGA
-CAAAGGAGCTGCTTCAAGCCAGCGCCCCTCCCTCACCAACCCCAGTGGAATCCCAGCCTC
-CACAGTCAGTTGGGTTGTTGTTTTTTATAATACCAGTGTGAAATAAATTGAAAAATTACC
-CATAAAATACAGGTTTTCAGCAGCTGGCCTGAAATTTCTTTCCATAAACAAACAAGTTTA
-AAGAGATGCCTGATGCCACCCGCCAATCCCAAACTTTTATGTCCCCATGTGGCAGTGGGG
-TCTGCCGGGAGATTTGGCCTCCTGGGCAAAGGCAGGCTGCTGGGGGCCACAAGTCACCCC
-TAGGTCTTTGGGGCTGACTTGTACTTCTCAACCGTATCTGTCTGCTCCATGAAGAATCCC
-CCAGACTCATCCCTCATCCCCCAGCTCCTACACTCagcatagacttgggagccaaactgc
-ctggatttgaatcagagatttccacttattcagtgtgacttcaagcaagttacttaatct
-atctctgcctcagtttccccaactgataatgctgataatagtagtacctacttcatagga
-ttgtttgtggattaaattagttaaatatacatgaagttcttaggacatggcacaagacca
-tgctgtataactgttagctattattAGTCGTCCAGGAGGAAGAAAAACTAGGATGGAAGC
-TACAGCAGGAGGCCTAGTGACATTTTGATTTTCCCACAATAAGCTTTCTCTGGAGTTTCC
-TTCAGGGTGTTTACATAAATGCCTGTCCAACACTCTgcagtttgcaaagcttgctacatc
-tgctatctcatttggatcaacatttaagccatggaaggagttaggacagaggttgtgatt
-atccccattacccctagtttacagaagaggaaactgaggcccagtaggtgaattgacttg
-ctcatgatctcaagaaggggtagagccaggaCCCCATTTCTGTAGCTTGAGGATCCGGGA
-CGCATCTTGATTCTTGTCACACACTGAAAGCAGGTCAGAGCCCTCCTGATCCTGCATCGC
-ACACTGAAGCTTGAACCTCATCCTAGACCACAACATAACCCTGGTCTCAGGTGGGGCTCT
-GACCCCATGCTTGACCACAGACTGAAGCCCAGATTAAGCCTCAGTATCGGTTTGAGTCAG
-AACTCTGAATCTCGCTTCACACTAGGCCCTGACTCCAGCCTCAGACTGATTCCTGATCTT
-TGTTATAGGCTGAGTCCTAATCCAGGTCCCATATTGACTCATGATCGTGATTCCACACTG
-TGCCCTAACTCTGGCCCCAGACTGAGCCCCCAGTGGGAGCCTCTAACTTGGAACTCCATC
-TCTAACCCCATCTTGAATCTTTTGTATAAATCCAATTGCCCATCTTCCCCAGGCTTTGGT
-CCATCTACCTGAAAAACAGAGTAGGGAAGAAAGTGCTCAGCACCCTTTGGAGAAGGCCCA
-GGCACCAGAGCAGAATTTACAATCCACCACAGGAAGCAAGACCCTCATCTCATCTCCTGT
-GTTTGCAACTTCCTCCAACTCCACCCCAGCTGGGACAGCCTCAAAGACCCCAGTCCTCCT
-GACGCCAGAACTCTGAGGAGTTCTATTGTTTAGGTGGTTTTCGGTTTTGATTATTTAATA
-CAGTCATTTCTGGTTTTATATTCACAGCTTTGGTCAGCTGGGATAGGGTTTTTCTTCTTC
-CTGTGGTTGAAGTTGTAACACTATTTCAAACAAAGGAAAAATTTTAAAAACAACAGTGAA
-AATATTTTCAAAATATGTTCACAATCAAGTTAATTTCTTGGTAATTGGCTGGGGAAGAGA
-AGGGAAGGACAAAGAGAGATTTTTCATAATGAAGGGACAGCAGTTCTCTGGTGGGCTGGG
-GGACAGCAGGGTGGGGGCCAGCCTTGGGTCTCAGTCTACACAAAGGTGGTAATGGGCTGG
-GGGAGATAGGGATTGGGAGCTGGACCCAGGACAGTGGATGAGAAAAGCCAAGGTCAGGCC
-TCTAAATGTCCCACTCTGGAGGGAGTTAGGACCCGGAGCCTATTTTTCTCTGTGTGCCct
-taattctgggcctcacttttttcatctgtgaaatggattcaataacacctgcccaaggag
-gactcttgaaattaaaagacaaggtggctgcaaagcacccagcacaaggcctgacactga
-ggtgtacaagtaatagtagttGATGCCATCATTATTATTTGTATTCATGGTTTGCCAGCC
-CAGAGGCTgtagaacctggtggtacagggaagcctgagtcagacaacctggattcaagcc
-ccagttgtgccacttactacttatgtgacctccggcaagttgctgagcctctctgacctt
-tggttttctcatccataaaatggggatagtaactgagttgttgtgaggatcgaatgcatg
-actgcatgcaaagcacttagaactgtgcctagtgcatagtcagtgccaagtgtcagctac
-tactATCTGCTCAAAAATATTTCATGCATACCTACTACTTGCAGGTTGTGAATTGATTGA
-TTCTTTTTTCATTACTAAGCACTAACTGTGTGCCAGAGAGCAGTGAGAACCGAAGACACA
-GTAGCTTCTATCAAGGCCCTCATCGCCTGGTGGGAGACTGAGAAGGAAAGAAGGCAATGA
-TGACAAGGTCAAGTAAGTTCTAAAATCCAGGCACAGGGGAGGAGCTGTGGGAGCCTAGGG
-GCAAGGCCAGAGAAGGGTTCACAGGAGTTAAACattcattcattcaacaagtatctactg
-agcactggcccaaggctgaggattcagccaccaccaccacaggtccacatctggccttcc
-tggagcttgcagcctagccggggagacaggaacaatgaagacacacacacttagataaca
-tgatggtggtgatggtgagtgccgcgatgaaaaccaaagccaggggaggggatagagaat
-gacagacatggtcaggggaggcttctctgcaaggtgagcagagatttggataaagtgggg
-gaacgagtcctgtggaggtctggggagggcattccaggtggaggggcagtaaatgcagag
-gcccagaggcctctccatgggctaacgagggaggcagagggagggagggagtggagggag
-caagggtatgtgtaggagggaagcagggcagGAGTGGGAGCACAGTGACTCGCCTGCATG
-TATTCCCAAGGAGATGGGAAGGAGAGGCGAGCAGAGGGGTAAAGGAGAGGAAGCAGGAGC
-TGCCACTTTTGAGAAGCACTGAGAAGAGAAGCAGAGGTGGGTGGGGAGGGGGATGCAGGG
-CCAGGACTGGTGGGCAGGGGCCCTGCAAGCCCTGCTTACTGGAACGGGAGAAGGCTGGGG
-GAGGTGTTCCAACCTTCACAAGCCACAGGCAACCACCGAGTGACATTAGACAGGGAAGGG
-ATGAGATCAGACCCTGGCATTAGAAAGGCTGGAGTTCTGGGTCCTTCATGCTCTCTCCCT
-TAATTCTTACAAGAAcccatttcacaggtggggaaaatagaggtcccagagaggttcagt
-gacttgctccaggtcactctgaaaggacacagatctggctgcctccagctccccctgctc
-cttgagttccctgctgtcttccctggcctctgcctctGGGCCCAAGAACTCCCAGCCCTC
-AGCATCCATGGCCTCCCCCTGGCCCACGAAGTCCTCAGCCACCTCCTTCCTGGAGGGCTC
-AGCCAAAATCAGACTGAGGAAGAAGTGGTGGGCACCCACCTTCTGGCCTTCCTCAGCCCC
-TTATTCCTAGGACCAGTCCCCATCTAGGGGTCCTCACTGCCTCCCTGCAGCCCCTTGAAA
-CTTCTGATCATTCAGCTCCTGGGATGTCCTGGGCAAAGTTATCCAGGCCCAGGTCCCTGG
-CTCGTGGCTCTCCTCTCATTCCCTCAGTGGGTGCCCTGCCCACACCAGGATTGCATTCAC
-CATCCAGGTGCTTGCTGACTCGGgggcaggctgagtgctgatgagttaatgccccccagg
-agcacccctgagtggatgaggatgggagttggtggaaaaacatttcagtcccctcgcccc
-ttgggtgggacagttctgttgccagagttcccagtgggagggatgcccagttgccaacTT
-GATCCTTATCACACCTGTGCTTGCTTCTTTGGGACTGGCTTCCAGGGAATCTATTTGGAC
-GGGAATTCTTGTTTCCAGGTCTGCCAAGATAACTGCCAAGCCTAGTCCATTCTACCTGCA
-AAATAGCTCTCCAACCCTTGCCTCTGTGACTGCCAGGTCTGCCGCAGCCTCCTGCATCTC
-TGTTTGTACTCGTGTAAAGGCCCCCCAAGCTGTCCTCTTGTTTTGCCCTTGCAGTCTACC
-CCTCCTCCCTCCCAAGGAGCCAAAGGGGTTGGGTTTTAAGGAAAACCTGACCATGGCTGC
-CTGCTGTTCTCAGGCTAAACAGCACCCCTGCAAGGCCCACAGGCAGCCCACCTAACCGTT
-TCTCTACATctctgccccaagccacactggtcaccttcccatttttcaaacacatctact
-tatcaccttctcagggcctttgcacttgctgtctcctctggatggaacactcccagtctc
-ccatggttagctcattccaggcttcagttcaaatgtcacctcctcaaagaggccttccct
-gaccatgcgatggaaactcccatccttcaccactacgcttggcttagccctcttagcttt
-gcttcctctcctttgaactgtttcccatgatctgaactagccttgtttgtttgttGTGAT
-GACGATTGAGCCCCCCAAAGCAGAGAACTTGTCTGCACACACTGGGCATCTGGCTGGCTG
-CGGGTGTTGAGCTGTGAGATCGGCTATGTTCTTGCCCTGCTGCAGTTGACCGTCTGGTTG
-GACAGGGGCTGGAGGGATGAACCAGTTGTGGAAAATGCCACAAAGGAAGAGGAGTAACCG
-GCTGCAGGGAGAGTGGGAGGGCACACTCACTTGGGTGGGTGGATTCTGTGTAAGAACAGG
-GACCTAccaaggtgggcagatcacttgaggtcaggagttcaagaccaccctggccaacat
-ggtgaaaccccgtctccactaaaactacaaaaacattagctaggcgtggtggggcacgcc
-tgtgatcccagctacacgggagactgaggcaggagaatcgcttgaacctagaaggcagag
-gttgcagtgagccgcgatcatgccgctgccctccagcctgggtgacaagagtgaaactct
-atctcaaataaataaataaataaataaataaataaataaataaataaaataaaGTGCGGC
-TGCATTTGCCTCCCAGGGCAGCCCAGGTGTAAGCTATACAGCTTGGTGGAATGTCTCCAT
-GGCTTCTAGGGGATGGCCCAAGAGAGTTCCAAACACATCATATTCCAGTGAATGGGactg
-gtcagcccacagccacatggccatgtccagctgcaagggaggctgggaaatgtaatattc
-tgcaggccacccatgtgctcagataaaaataaagagaatattattcaagagaaagggaga
-cagagtgtgggggatgactgatgatccttgccataAGCATCAGCAGGAAACCACCAGCCC
-CCACTTCCCTGTTTCTGCATGTCTGTTATTTGGTCCTTCCTGTGTGTGATGGAGGGAAAG
-ATGGCTGTGTGTGATGGAAAAAAAGATGGTCCTGAATGAGCCTGATTCCACTTCTGGGTT
-CCCACACCCTCTGGTAATTCCCTCCTTTCCCCCGTTTCTGCCCTGTATCTCCTACAGTGT
-CTCCAGCCCTCCTTCACTCCATTTCTCCCTCTCATCATAGACTGTCTTGGAAGTTCTGCC
-TACAAATGTGGCAGCTGCTGTCCCACTCTTCTCTCCATCCCCTCTGGAAGCCTGGCCTCT
-CCCCAACTTCCTGCTCTGTTCTGTAGCTCACTCAGCGAGGACCAGTCCCTCTCTGTCATG
-AGATCCACTTTTTCTCTCCAACCTCCCTGTGGGCCTCTGTCCTGTCAACATCCCTCCTGA
-CACTCTCTGTGACATTTGACCACCTGCTGGAATCAAAGAATGTGGGCTCTGCAATCAGGC
-AGGACAGAAATGaagatgcttcccctttctcagcctcaatgatctcatctgtaaaatggt
-gtgaagaatgtccacTAACTAATTGAAACAAATTTTTATTTGCAGCCATGACATACCATG
-CATTTAAGTAAGCCCATATGAGCACATCTGAAGGCAGTGATAATACAATCAATAATACTA
-CTGGGAGTGCCTAGCTCTTACTGAGTGCTAAGCTCTTCAGCACGTCAGCTCAGAAATGTG
-GCCCCTCCCATGGCCCCGCCTGCACTCTTTTCTCCTTTTTTGCTTAACTTCCCTTTTGTT
-GCTTCTTTCTTGAGTCCATTTTTGGCTCTGTTCTCTCCTCATCTCTGCAGCTTTCCCAAA
-TTCTTTTTTAAAtttttatttatttatgtatgtatttattttgagactgagtttcactct
-tgttgcccagactggagtgcaatagcatgatctcggctcactgaaacctccacctcttgg
-gttcaagtgattcttctgcctcagcctcccaagtagctgggattacaggcgcacaccacc
-ctgctcagctaattactgtatttttagtagagacagggtttcatcatgttggccaggctg
-gtctctaactcctaacctcaggtgatccactcgcctcagcttcccaaagtgctgggatta
-caggcatgagataccacatccagccAGCTCTcccaaatccttttcccagctctgacatgt
-tgccacacttcatctacctggctggacacctccacttgaagtcctgtggacatctcaaac
-ccagggtgtctaaaatagaactcagcctcttcccctgcaggcttCCAACTCTGGAAAGGG
-CCCAACCACCTACCCGCTGGGTCTGTGAGCCAGGccttcctctcaggcccctcctctctt
-cccctggccccagcctccttccccacttccccacccttccccaccccAATGCACATACAG
-TTGCTCAATTGCTAGTCCTCACATACTGCATTGTGTCACCCCACCTGGTCATTGTCCTGC
-CCATGTCCTCTCAGCACTCACCTTTCCATGTCCAAGGAGTCTTCTGCAAACATCTGCAAC
-TGTCTGaagccaaggtgctggagaactaagagagagtccccaagcagccctcagccaatg
-accgatgggaggtggtggataaataccagccccctgccctgagttgggagacctgaggtg
-tgctcttcactgtctcaagaggacctcaatggggctgagctcccgttgcccatattagca
-attcacttattatgcatcagtggcttcagtggtttactgcagtgtcttcattgtctcTGG
-GCCACATAATTTTATGGAAGTCACAGCCCTTCTCTCTAAAGTCCATCTATGAAGCCACTT
-TACCTCTGTTTGAGAAGCACTGGTCTCCAGGATGACATCTATACCCCTTACCTGGCATTC
-AAGGTCAACCTGCTGACTCCACCATGTGTCTACCCTTCCATGctttgctcatgctcttcc
-ctcctgcctgaaatattcatcactttgcttaatgcttgtctgagttgcacctatccttca
-agactcagctcaagttcacttcctccgggaagcctttcAGACCACATTAATCCTTCGAGT
-GTTCCCCACAGCCCCAAGAATCTGCTCCCCACATGTGGCACAAATAGTGCCTTGGGTCTT
-ACCTGGtttgttccttcagcaaaccaaggttaagttagcattttctctgtgcaaggccct
-gagagctgggagagctggagacatgaggtgagtcaacacagaccctgctctgaggtctgg
-gcagtccagtcgaaagacGTCCAGGACATGGGGTTGGGCATTCCAGGCAAGACCATCAAC
-TCTACGAGGAAAGGGATGATTTTAATTCACTATGAGAAATGAGTGAATCATTTATTTTCT
-TAGCTTAAAACAGGGGGTGGACAAGAGACTGACtctggcccaccatctgtttttataaat
-aaagttttattgaaacacaactatatttcttcatgtatcacctatggcctttacactaca
-atgtacgagtaattgtgaaagagaccacgtggaccacaaacactaaaatatttactgttt
-ggacccttatagaagttccctggccctggcttgaaacactaatacttgtttattatttca
-cacagtttctgaaggccagaaatttgggagtggtttagctgggtggttctggctgagggt
-gtctcaggaggttgcagtccgcagggctgtctgagtctcatcataacacagcagctggtt
-tccccAGTGAAGACTTccatgctaggcacctcacacacagcctcatttaatcctcataaa
-catccttaaaggacagctatgattattacctacatttctcagctgaggaaaccagagctc
-agagagaggaagttatttccctaaggcaaggacagacctaggactggagctcaggttcct
-ctgcctccaaagccccgctcctaaccactgggctgtccttctgAGCACCACGGGGTCCCA
-GCAAATGATCTGTGGCTGGGGATCCAGGATCATTGTGATTTGACTCAGATGTCCCTTTGC
-CAGGGATATGGTCCTACTCTCCCTCCAGTTACCTGCTCCACAGGTGGGGTCCACCTTCTT
-TCAGACCCTCTATCAAGTGAGTCAATGGTACTGTCCAATTCCTTCCCAATATCTTTGCCA
-TCCACCCCCACTCTTTTCCAGCCCCACTGCTTCGGTCTTACCTCTGGCCGTCTGGGCTCC
-CATCTAGAGACAAAGTCAGGGGAGGTGATGCTTTCTGCTGATATTCCTTGATTTTTTCCA
-CCTGATTCACTTTCAGCTCTCCTCTGCCCATCCTCTCAGAAGATGGATATGCAAAAAATG
-ACCCCAGAGCCATAGGAAGGCCCCAAATGCATCCCAAAGTACTGCAGATGATACCTCCTG
-ATCAAGCCCTGCTGCTAATCAATCAATAGAATTAATATAATTATACAATTTCATTTATTC
-AGCCTTCTACCTTCACaaatgcctggaccttggtttcaggtaaactggctcgagttcctg
-cttggtctttgccaacatgtgtccatgggcaggtcttagtctttcctttggcctcagcct
-cctcatctcaggattgctagagggggttaaaGGACATTGCATTGTAATTTGCTTGTTTTC
-ACACTTGGTACATAATACTTGCTAGAACCATGATGCAAAGAGCAGTCAGTCCGCATGCTT
-ATAAGGGAAGCAAAGATGTTCAGCATTATAGAATGCATGGCTAACATGGCCCCAAGATGG
-TCCAATGGAAAGCTCTTCTTCTAATCAAATAGTGAACAATCCAGGAATAACCAAAGAAAA
-AGTtcatcttattatttgttttcacagcagctccatgaggcagaattaattttgtgtgtt
-ttgcagatacgggaacagtaggtgagagcatgagtaactcagctcaggtcacacagcagg
-tgggagagaactggaacaagaacccagtgctctttctgctctacccactgacccATCCTC
-TCACGCATCATACACCCATACTCccatccacccaccttcccattcatgcattcacccatt
-cacccaccttccatccatctaccatccaCCACGTACCTACACTCCCATCTACCATCCAAC
-CACATTtccattcacccatcctcccatccatcaaccctccaatccaccacccacagacct
-tcccatccattcatttacccatccacatattcacccaccctcccatccatccatcTACTG
-TCTATCACCTACTCATTTTCCCATCTGCTATTCACCCCCACCCTCCTatccatccattca
-accatccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccat
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-accctccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccac
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-acccTCCACCcatttatttgacagttgctgagagcctactaaccaccaatcactattcca
-ggcactgagatatgactttgagctagacaaagtcttgcttcatggagctcacattttggc
-tgtgaatggcagcaacagacaaataaatacgtagtttacgtgaggtactgcaaagaaaaa
-ataaagcaggggagtgatgtcaggagtaactaaggcaggatggtagtcagggaggtcgtc
-tctgaaacgggacatttgagcagaagcctgaaggaagtgagctccctgacaacttgggag
-aagagaatttcaggcagagagaacagttgtacaaaggcccagtggtaggaatagaaacag
-cttgatgggattaagaatcaacaaaaaggtcattatggatgaagcagaatgagggaggaa
-acccaagccagctcgggcttgatcatggcaggctttgtcagtcactgtgagtaaccagac
-tttatttcaagtgagttggCCAACAGTGTCTCCCCAGTAGTAGAGTGATTGCTCGTCTGC
-CAGAAAAGGGGCACAGAGCTCTGGACATCAATACTTGCCGATCTCTCCTTCATCAGCCAC
-CCAACCCTGGCAACAGTTTTCAATTACACCTGTGAAAACTTGTGGGTTAAACAGCTGAGA
-TCCATGCCTCAGCTTCTATAGGTGATAAGCCTGTCCTTCCTTAGGTAAAGAAAGGAAGGG
-GCGAACCGTCAGtgagcaccattcacataccttagccggttcagcttcaccaccctctga
-aggtgccatcagcagctcccttttgctgaagagtaagcggaggcccagagaggtcatgtg
-gtgtgtgcttgaggtcacatggctgagaggtggcaccagatttgcccaactctcaagtcc
-catagtctaacgtttcactccacTCAGATTCAACCTCCcaagaaattatttgtttgagta
-cctactaggcaccagactcagagtgagaggcagttgcagattcactcagggccagttttg
-gaggccagcttcacaatcacccagcacagcccatctttctacttgtgaggaaacagaggc
-tcagtgaaggaatgcctttcagatcacagagaggatgaagccaggatattcaaacccagc
-ttattttACTACAACTCTATATGGTAGGAAAGAGAAAAGCGCCCATACAATTTCAGTGGC
-TTGACGTGGAGCCTGGCAACAGATGTGTTCTTGGACTGTTGGCTATAAGACAAACCAGCT
-TTCCCCACTGACTGTCACCGTGTTTTGGGAGACAAAGCCTAGGACTTTGGTGTGTCCACC
-GTGGGTCAATAAATGCCCCCAAACAAGCATATCTTGCAAAAGTGGGGACTTATTAATTCA
-TTGATTCGTTTCTTGATTGATCAATTGATTTATATGTCCCTGTTGGACAAAGGGTTTGAG
-GCAGCCTGGGAAGGAAGTGAAGTGTGGAAACTGGTCATCTTCTGTGCTTCTTACATTCCA
-CTCATTGGGAACATCAAAAAATGAAAAAAAAATCCAGCTGCTACATAGCTGGGGAACAAA
-TTCTTGGTATGGAAGTAATTCTGCTAAGGCTAGCCTCCTCAGAGTAATTCCAAATGCTTT
-TCCTATTTTCAAATTTAATTAGGAGACATTTCTGTAGTGTGAGTCATCATTTAATAATGG
-GGGGTGTTTATTAGGGAATGagtggaaagagaacaggacagctggataattcaaatccca
-gttcttcaagtctctggctgtgtgatcttgggtgagccacttcacctctctgaacatcag
-ttttcttgtctttaaattgatatttacctggcaaggtttggggaaggtctcaactagatt
-atgtacataacaagcttgccagtgttagtacataataggtgtttaataaatattaactGC
-CTTCTCTTCCCATTTATTTTCTTATTTGGTCTTCTAAACAACCTTGGGGACCATGATAGG
-TATGTTGTTTGCTTTCTCTAGCATGAAAACAGCCTCCCAGAAACTACTCAGCCAATCCTC
-TGAAATGGTATTTCCGGTCAAATCTGATGCACCTTCTGAGACTTTTTTTTTTTTGTCTTT
-TCCAGTAAAGCCAAGCACATAGTCATTGTTAGTTTTAAAAAATGTATTTGGATGGGGTAT
-GAAGTTCAGAAGAGAAAGACATTCCTGGTTGGGTTATTCAAGCAAGGATCCCTGAAGAAG
-AGATGCTAGCATTTGGCTAGGTGATAGGAAGGGGACAGGAAACAGCAAAAGGCAGGATGT
-GGAGGCAGAATGAGTTGAAAGATGCTGTTATTGAAGGCGATGGTGGTAGTTTATCCCTGA
-AAGCCACCAAGAGCTCAAGAGCAGGAGGGAAGAAGATGAGTTTCTGTTGAAGAAAGACCA
-AAGTCACTCACTGGCTGATTTGTGCTTGGGAGGAGCATCTCTTTCCCCTGCTGATTGGGA
-GTCTTTTGTTTCCCTGGGACAATAGGCACTGGTCACTGAAGAGTGTGTCTGTCCTCCACA
-CTTTCCCATGTTCCTGTCTCTGGGGAACTCCTCCCTGACTCCGAGAGACAGGATGGAGTT
-GTCAATCAAGATGTCTGTCACTTTGCCTACCAGGGGAGAGCTTTCCAAGTGGGGCCCTGT
-TTTTCTGCTGGGGCTATAGGGGAGGGTCTCCATCTTCATGtgtcaggatgtagccttggg
-gctgctggtgtcatatttatgccacatggaatgaagctgtctgaagcaggaaaggatgat
-attaccaagcaaaaagagatgcaaagctgagtgtggacggaggcctgcttctgatcctgt
-ccatgtacttggatcaaaccatgcctgaactccatttggtttgcaccttatggggcaata
-agggaataagtaattctctttgtttattcaacaggatttctgtcacttggcaattctgat
-taatacaGACTTCTGATTAATACAGTTGGCAAATGAGAGACAAGTGATCTCTTcagaaat
-ggacagagcaggaaaggaacccaccaagcatggagaggttgaatgagagtctcttcttcc
-ccattgactcactgcagccctggatcaggttgctgcccttctctgggactcagttttatc
-atctgtgaaatgggCTGCAGTGAGTGGGAAACAAAAtcatttatttatgcccaaccttgt
-tgcaaaaatgatttaagacagcttacaaatgtattaaagccagagattaggaaaagaaag
-agataatgaaattgtgagaagggggagaaaaggtgaactcaaggatgaggttaggttatt
-gaatgcctgctgtaaagttctggacagttgctaaaggtgaacagacaagtttgttctgag
-attctttgtagccaaagcaagaaaaagaaaatgcagttacgtggatttgtaggaaaaaaa
-aaaaaaacaacccggttcctgagaagaagcccaacttttcttagaataaaagtctgaaac
-aattttccttgtggttccccatcaaaaggactttgtgaaataccatgagcaaATATAAAA
-ACCAGAcaggttgagtatcccttatctggaatgcttggaaccagaagtgtttcagataac
-agattcttttggattatggaatatttgcatatacagtcctacctcgggtataggacccaa
-gtctaaacacagaattcattcatgtttcgtgtataccttatacaagttacctgaaggtaa
-ttttatttttctgtgtgttgtgcacctgcattttgactgcaacctgtcacgtgaggtcag
-gtatagagttctctacttgtggcatcatgttggtactcaaaaattttggattttggagca
-ttttcaatttcagattttcaaattacaggtgctcaacATTTAacaggctggggtaaatag
-ttgcaacatatttaatagtcggaggattaaaatccacaataaaataagagctcccacaaa
-tcaataaggacaaaggaaaaaaacactccatcaataaaatgggcaaaaagggataagaac
-acaattcacaataggggaaatAGctatcaaattagaaaaaaatatcagaagaatgggtaa
-tatcagtgttggtcacagtgtggggaaataggcatgctcagacacCttaacttactttta
-gcgtttctcgtcacctgacacaccatatatatacgtctctacgtgttggggatctctctc
-tctgaccagattgcaagttccatgagagtaaggactacctcctcatcactgctgaattcc
-cagaacctagaacagtgtgcccagaacagagtagatccttgataaatatttatcaagtat
-gtgagtCAATAAATAAATGAGTGAATGAATGGACAGTGTGTAAACTGGGGTCATATAttt
-ggcaggcaatttggcaacatttattagaatgaaaatgcacaaacactgatgcagacattc
-ctcctttagccatacgctcgactgagacatacaaatattcaaaggaatgggtcaaagagt
-gtttttgtagtgctgtttaaatggcaaaagttggaaatgacctaaatgccaaacaatact
-acactaataaagttatggtttattctgactgtgaaatattgtgtgttcttctttaaaaaa
-atagtgttttcatactgatgtggtcagatctccaagatacattatcaaaagaaaatagca
-agtcacagaacaataatatgtaacatttacggtaaaaaCAAAACAAACTTTccaggcgca
-gtggctcacgcctgtaatcctaacactttgggaggctgaggcgggtggatcacgaggtca
-ggagattgagactatcctggctaacacggtgaaacctgtctctactaaaaacacagaata
-tcagccaagtgtggtggcacgcacctgtaatcccagctactcgggaggctgaggcaggaa
-aatcacttgaactcgggaggcggaggttgcagtgagtcgagatcacgccactgcacccca
-gcctgggcgacagagagagactccatctcaaacaaacaaacaaaaacaaacaaacaaaaa
-acaccacaaacaaacaaacTCAGTCTGTCTGGTTAGCTAGCTActatctatccatctatc
-tatccatccatccaCTCGCTTACATTGGTCAACCTATCAGTATAAACAAATAGAAACATA
-TCTAGAAGGAAATACCAAGCTGTTAACAGTTCTTCAGAACAAGGGAATAAAATGTGGAGG
-TTTACACAAAGGGCTATTTTTACTTTAAAAATAtatttcagtataatatgcacttaatgt
-gcatagataggttggcaaatgataaagctttacaaactgtatttatccctgtcagcatca
-ctcagatgaagaaagagatatgaccagcaccccagcagccctactgttatcctctcaagg
-aaaactatcactgcccttctattacttttatcaccctagactagttttgctaatttttgg
-actttatataaatagaatcaaaaagtggatacaattttgtatctttcatctttggtgcaa
-tattctgtttatgtgaATATTGCCAAATGGCCTGACACTCCAACCAGTGTGGCAGAAGGC
-CTGTTCCCCCCATGCAGCCACCcaatacattttaactaacctgtagtctgtattttgttc
-agtcccagtaatgtcctttacagctttttttctagtttgggattacatgttgcatgtagt
-tgtcatgtctctttagtatcctttaatctggaacagtttctcagcctttctttgtctttc
-atgatgttggcctttaagaaaaatataggttagttgttttatggaatgtcacatccctca
-ctttgggtttgtgtgatgtctcctcatgattagactgaggttatgcattttgggcaggaa
-tatcttgtaaatgatgctgtgttcttctcagtctatcacattaagaggtacacaatgtca
-atttgtccctttattagtgttaactgatcatttggttaaggtgacatccagtttctccac
-tgtaaagttgtttactttttcttttgtaattaaaaagtaattttaggaagctactttaat
-atctttatctattaaatatccttttccttgtcaaaGCCATGGTATGTTTAAAATGTGaat
-ttctttctaagttcaggggtacatgtgcagatttgttacacaggtaaacatgtgccatgg
-gggtttgttgtacagattatttcattgcccaggtattaagcctagtacccattagttatt
-tttcctgatcctctccctcatcccacgctccaccctccagtaggccccagtgtgtgtcat
-tctcctctgtgtgtccatgtgttctcataatttacctcccacttatgagtgagaacttgt
-ggtatttggttttctgttcctgcattagtttgctaaggataacggcctccagctccatcc
-atgtccctgcaaaggacaggatctccccttttttatggctgcatagtattccatggtgta
-tatgtaccacattttatttatctagtctatcattgatgggcatttaggttgattccatgt
-ctttgatattagtgctgcaatgaacatacagttgcatgtgtcttcatcatagaacaattt
-atatttcttctttttttttgtttgagacagagtcttgctctgttgcccaggctggagtgc
-aatggcacaatctcagctcactgcaacctctgcctcttgggttcaagtgattctcctgca
-ccaccctcccaagtagctgggattacaggtgcccaccagcacttccggctaatttttgta
-tttttagcagaaacggggtttcaccatgttggccaggctagtctcaaattcctaacctca
-agtgatctgcctgccttggcctcccaaagtgttaggattacaggcgtgagccaccgcacc
-tggcctttacattcctttgggtatatacctagtaatgggattgctgggtcgaatgatctt
-tctgtctttaggtctttgaggaatcgccacactgtcttccataatggttgaactaattta
-tactcccaccaacagtgtactgagcattcctttttcttcacaaccctgctagcatctgtt
-attatttgattttttaatagtaaccatcctgactggtgtgagatggtatctcattgtggt
-tttgatttgcatttctctaatgagcaatgatgttgagctttttttcatataattgttggc
-tgcatgtatgtcttcttttgaaaaatgtctgttcatcttctttgctcacttttttaatgg
-ggtagttttcttgtaaatttaagatcctcatagatgctgggtattagactgtggtcagat
-gcataatttgcaaaatttttctcccattctgtaggttgtcactttgttgatagtttcttt
-tgctatgcagaagctctttagtttaattatgtcccatttgtcaatttttgctttcattgc
-aactgcttttggtgtcttcatcatgaaatacttgcccgtgcctatgtcctgaatggtatt
-gcctaagttgttttccaggatttttatagtttgtgttttataAAATGTGAATTTCTTAAT
-TGAGAGTAATGGGAAGCATTTATTCCTGTGCTCCTGAGTCACCGGTTTTCCTTTTTGATG
-AATTTTGATAATCATTTTTTCTCACTAAAATTTAAAGGTTTAATTTTTAAAAACTGAATG
-GTTTAAGCTTAGCCCTATAGTTCTTGAACCATGATTTTAATAATAATGATTTTTTAATCT
-TCATTGCTCTAGCACCTTTAAGAAGGATTCGTTTGAAAATTCACCTGTGTCTCAACCCAG
-GAATAGGCTTGGCCTTCCTTCTCTGATGGCAGCCAGGGAGCTTCCTCCCATATACCGTGC
-CCACGGGAAGGAACAGAAATGCTTCCTGTCACTCCCAGGGGTCTCCAGCTGTCATAAGCT
-GCCAGCTGGAGGTGGTCCAAGCCAAGATTACAGCCGGCCTTTATCCTATAGTTATCACCC
-ACAAATCACCCCCTATCCCCAACCCAGGGGAGTCTCTCTGTCCATTCCATACCCCGGATA
-CTGAACTCAGCTCCAGAACCAGGGACCTCCTGCCCATTCACGATGGCCTTGAGCTCCCAG
-TGCTGTCCCCACCACTCAAGATTGTCCCATACCACCTTTCCCACCCAGCCCAAACCTCAC
-AAGCCAGGTGCATGTGGTGGCCTCTAGGGAAATGAGGTTTCAAGGTATTTTAGCCACAGA
-TCTCTTTGCTCAAATAAAGCCCTACACAGAACCCCAGCCCATTCAACATTTCAAGGTGGA
-GCTGAAATCCTTTGTGGGTTCTATTTTTCTCTCTTTGCAAAGCATTTCCAGCTTGTGGGC
-TGATTGTCATATAATCTAGACAAGTGTTAATTAAAGAAATCACTCAGAGCCTGTATATAC
-AAAAGGTAAAAATTTTAAAATCTTTACAGCTAAAAATATATTTAATGTGGTACATTTAAA
-AATATTTGATACAAGGTGGGGATCCCAAACAAAGAGTGCCAGGGGCCTATGGTGAGCCAA
-CCTCCCACACCTCCCAAATAAATCAGTCATCTGGCTTTGTCTATCTCTACGCTCTTCCTA
-TGAGTGTTATCACACTCAAATTGCATATTGATGGGATTAACCCTTTAAGGTCTCTTTCAC
-TCCACCATTGGCTTAGTGAGGCAATCTAGTCCATCATTGTCTCCCCAGCTCTGAGAAGCG
-AGCACTATCATAAAAGAAAAGAACTATTATACAAGAAAAGATTGCTACAGTGAACTAGAT
-TAATGTTAACAGGCTCCTTGAGGTAAGATGCTAAAAAGCATCAGAATGAATGAGTGAGTC
-GATAAATGAGTGAATCCACACTGTTGCTTATGAGGTCTGTGGGTGATGACGCCCCATGTG
-CATGGCAGTTTCAGAAGGGCTTTCAGGGTTTAGATTCTGGGGAAAGGAATCCACTTCACA
-GACCCTGCTGGTGCCGAGCCACTTCTAAGAGACCAAGGAGCCTGGAGCCACCCCATTCCT
-CCCAGGGGGTGGGGTTAGTTGATGCTGTCTGGTGAGTGACCAATCGCATCAGCACCTCTG
-CTGACCCCATGGGACTCCGCTACCTTCTCTCCTGGACTCCTAAAACTGCCATTTCTCTGA
-GAGGGGGAGGAGGGCTTCTTGCTTCCAAAAGGACTAAGCAGGGTTCTGGCAATGGGGACA
-GGATAGTCGTTCCCTGTGGCAGGCTGATGTACAATGGGATGGTCCTGGGGCCACATCTGG
-GCACAGACCCCCATTATCTTTAATGGTGCTCTTGCCAGGGGGACACTGCAGAGAGGAGTC
-TACCACGAGGAGACCTGCTCTCCCCTCCCAAGCACTGGAGCAACCTTGGCCCTGCCCAga
-aaaaggcagctgtagggaaatggagctgagtttaaatgcccactgggcacttagtagcca
-tgtgaccttgtgtaggtgactcctcctcttcctctctgggcctgagtttcctcctccata
-aaatgaggcagtcatctttgcagctctgcacccacaaagtgccattgtgagggtcaaata
-agtggatgtaaaagggcttgcagagaaccctgcagatggaaggtgGACCTTTATAAGGGA
-GAAATAAAATCTTATTAAGGAGAAAATAAATTCCCAAGAATGAGCTGCCCAGCATCTTTA
-AAAGAAGACTGCAGAGTGGACAGTGCTCAtacctgaaatgttttttttattcctctacca
-gtcagcctcctacacatcccagaggaggcagtgccttccccagaaagccctgccaggctg
-cactctgtcctcccatcctgctgcctccagcacaatgctcatatctgactgtctgtctac
-ctgacatctcccccactggtctggtgctcctttgggaaggaactgtatctgatgcaacca
-ggaatttcagctcttagggcagagtctggcgcatctgaggcacacatcaatattCTGAGC
-CAGACTGACTGGCTAGAGTAGAGCTAATGGTAGAATGTCGGGGGCTGGTGCCTAAGGTTG
-GGGTAACTAAAGACGCAGGCAAGCCTCACACTCCCTTCCTAGAACCTTATCTGATTACTT
-TCTCCATCTAGGTTTGAGACGAGGTCTAGCCGATCCTGCCTACAGGCTGAGTGAAAGCTC
-TTTAAGGTAGgggtgaccagcttttcctggtctgctcaggactttcctggtttgagttct
-aaaacgtcccatttcccaggtaaaccagggcagttggtcatgctaCCTTAGTTACTAATT
-GATTCTCATAGTAGACATTGTAATTACTCACTGATTGTATATTACGCTTCTCCTTCCTCC
-CCCTTTCCCAGGCTGGCAGAGcccatctcttaggacagaggctgaaaacggaagatagtt
-tcccagcctctcttgtggtgaggggttgccatgtgaccgagttttggccaatgagacaaa
-agggaaagtctgctgggaacttctgggaaggggttttttctctctatctaccttcacccc
-ctctttcttcctgctttcggtcgtgagaatgtgatgattagagctgtgacagccatcttg
-tgaccacaaggaaacatccttaccacactctgaggggtaaaacgaaggacagtaaaagct
-cgacactttgatgacattgttgatcctctgaaCGACCCTAGGACttgaacaacattaaaa
-tgttacatgttgtttatcaaaagacatcattagaataacaaaaaggcagcctctgtgctg
-ggagatgatatttgaaatctctccttgaaaaggactcgtatacagaatactcaatgatag
-ataactcagttgttaaaaattggggcaaaacttgaaaagaaactctagaaaagagaaaat
-taaaatggccaataagcaaagcacacaaaaaggtctgaacatcattattcatcagggaaa
-tgcaaattaaaactacagtggggcccgggcctgttggctcatgcctgtaataccagcact
-ttgggaggccgaagcaggcatatcacctgaggttgggagtttgagaccagcccgaccaac
-ttggagaaaccctgtctctactaaaaatacaaaattagctgggcgtggtggcacatgcct
-gtaatcccagctacttgggaggctgaggcaggggaatcacttgaactcgggaggcagagg
-ttgcagtgagctgagatctcaccattgcactccagcctgggtaacaagagcaaaactcca
-tctaaaaaaaaaaaatacaatgggatacaatctcacacttaccagagtggctaaaattaa
-aaacactgaaaatacaaagtgtcggtgaggatgtggagaaactggaactctcatactcta
-gtaatactaataataggagtgtaaatttggacagttgctttggaaaactgctaagcaata
-gctactaaaactaaacacagacttacctgatgaccaggtatttacccaagaaaaataaaa
-acatgtccacaagaagatgtgtatgtagatgatcatagcagctttattcagaacagcaaa
-acacaagaaacaccgccaacgcctgtcaacaaaagaacagaaaagtaagttgtgatatat
-ccatacaatggatgtatatgttattttatgaatatataaaatggatatattggaaatact
-acatggataaaatagttactttttaaactacatagcagtgaaaaagaataaactactgac
-acgtagcaatatggatgaatcttaaaattatattgtgcaaaagaagctagacacaaaaga
-gtacatacagcatgattcatttctatgaagtttaagaatgggcaaaaccattctatgctg
-ttagaagttggttagtggttaccctttgcaatggcaggtggagcagtggggagcagtagc
-tgggaaggaggtatggggatgccaaatgggatgtcaagaatgttctacatcttgatctag
-atcatatacttgcaaaaaattccttcagccattacagctcaagattcgtgtgctttattt
-atgcaatacagcaatctaaaaCATTAAAAAATGAATAATCTCTATGGTTTAAGGCACATT
-TAATCGAGTATTCTGTTACTTGTAGCGAAAAGCACTCTAACACTCCTCAACACAATTTGG
-CGACAGAGGATGTTTGTTGGGTGAGTGATGGTAATACCCGTGGAATAGCATTCTTACAGG
-GAACAGGGCACATTCACGCcattaacacctgtcactctcacttcagtcccaccagggagg
-gtttgttagtttcctctaacagatgaggaaactgaggtccagagaatcgcactgacctgc
-tcagagtcacacaacgagctttttttttttttttttttgagatggagtctcactgtgttg
-cccaggctggagtgcagtggcatgatcttggctcactgcagcctccgcctcccaggttca
-agcaattctctgcctcagcctcccaagtagctgggattacaggtgcccgccaccatgccc
-agctattttttttttcttagtagagagaggttttgccatgttggccaggctggtcttgaa
-ctcctgacctcaagcaatccacctgcctcggtctcccaaagtgctgggattataggcatg
-agccactgtgcccagcctacacagtgagcttttgaccaatctagaatttgggcccaagat
-tgtttaatcccaaacccagtgctctttccgctacacttctctcaccctGGGCACATCCAC
-CAACAACATTTGTTGAACTCCTATTCTGTATACTTCAGGGAAACTTTATCTGGTCTCTAC
-TTCCACTGAGCTTGTGGTCTAGGAGAAGAACAAGAGTTTTATCTAACAATAATAATTGTA
-TTTTTAAGTGCTTACGTTTATTAAATACTTACTATCTCCTAGACCAGCCTTTTTCagtgg
-agtccatgtattgcagagtatactccactgggttgcaagaaaaacaattagtaattctat
-ctgtatatttgatctcatcttttaaaaattttcattttgtgtatatcatataagatgata
-atatattgattgataatatattatgtttttactttgtaaatgtacatattaaatatattg
-ggggcaatgttcaCTGACAAGAATGGGACACCTAAATCTTTAAAGACCCATTGGTCGCCT
-GATCACATGATCCCATCTGGCCCTCATGACACTCCTGAGGACCAGAttttttttgttgtt
-tttagagacagagtttgctatgtcactcaggctgggatgcagtggtacagtgatggctca
-ctgcagccttgaactcctgggctcaaatgttcttcctgcctcagcctcccaaagctctgg
-gattacgggcatgagccaccatgcGTGACTGAGAACCCGATGTGTTGCCCCATGTTACAT
-ATGAAgatacatctttaaggtaatgaatatcccaatcacccagatttaattcttaagcgt
-tgtatacaggtatcaaaatatcacatataccccccaaatatggccaactattgcatgatt
-aaaaaataaaagaaaaaaGAAAAAGAAACCATCTTTAGCAATACCCTTTTAAAAAGTgct
-ttttgtttgtttagctttctttgaacatttgacccaagtcttccctcactcagaaaacca
-ctctgtaaaacatccctcaacatgatttcctcacagacaaacctgtctgataatttaatg
-ctgctgccatttttttttctggagctctgaactttgatgcctatctggactagttttgct
-ctagacttggggcacagataccattaggaattcctttGTCTCTCCTGTGTTGAAACCACA
-GACTGCTATATCTCAGTTCATCATAGAAAATTTACAAAATAAAAGCCACAGAGATTCATT
-Cccctgcctgtgtctaagctcttgtccaagcccctctcacattgactctgggcttggtca
-cgtgacttgctttggccaatggcataatggcaaacatgacacaagcagcagctggaaaat
-tacttgtgcatatgagcctttgccctttcagctctggggaaccctgtgaccacaaccagg
-ctggcagcaaacccaggctggtttgctgaagtataagagaccgatggctaaatcatctct
-gttaccccagctgtgccaagccaaccagcatatatatgtgagtgaggccattgacgacca
-gctgacggcagacacaggagagaagccagccaagaccacatggagcccagcccacgccac
-tactgggctataggttcataagggaataaatggtggccgttttcaggcaatttgttacac
-aggaaaagctCATGGttcctcttcttggtttagttcctctttttggtggagcacagcccc
-tggtagcATGGAAGttttaaaacatgtgcaccaatcctttgacacttgtcccatcagcag
-atagggttcatgacaccttcccttgcttgggcctgtaccttagtaatgcagcaaaagtga
-catggcataacttctgaagataagttagaaaaggccctacagtttccacctggttctcct
-gggacactcactccggggtaagccagccattgaggaagaggtatgagatcaccgtgctgg
-aaaagctacatgtcaacacaccactcaacaatccagtcgagacagccttccagccatctg
-ggccaaaggagccagactggtgagtgatgtcatcttgggccctccagaccagctcatcca
-ccagctgaagaccactaagtgagctccatcaacaccacgtggaacagaatcatcacccag
-ttgcaccctccctcagtttttaacccacaaaattaatccactaattttggtgatggtttg
-tcatgcaacaatagataaccagaTTCTATGCCATGATGGGAAGTTCTGCAGTTTCATTGG
-GAAGTGGCAGGCATTCTGGGACAGAAAAAACTTGGGGTCATTTGTGCAATCTACTGCAca
-gatttttaatctctggtttcttactctctgttccttccagagagcttcttgttcacattt
-tactgctgcaatatctttatcactcaagggatattaattgtaggatttattttaagtttt
-ctcttgttccctggattcttttcttgaagaccttttaccccgccctcatggtttgctttg
-atctctgcacttcatgatagaaatttctaatgatccttggctgtctactcacattaccac
-tctggctggaaactgggtggggagggtggactggtaggcttttgtgtagggtccatgcag
-ggtggttgcatagggctggtgcaaaggggctggttggctttttctgtgatgcactctcct
-cccacccccaattaccgtatctttaggtctttgtcctggaagtggttctccagataattt
-tctgcctggggttggacattctagaatgagacgggtgaagggggctgaagatctcACCTT
-CTctgggcctgatgtttctagttttggagtttctttgttgcctttttttcagagaataaa
-cctccctttgcttgcccagaagtgagtggggttactacctggctgggcaggatgggggtt
-ggggacgtggaggtcccatgctccttgtacagattgctttcaatccccacttcaccagca
-gctcctccaagacctagtagcttcaatttttgaggcctttaggCAAATTGGCTTGTTTCT
-CTATGCAGCAATCCACCCACACAGCAGTCACCTACCCCATCCATTTAGCTTTGACTTTCT
-TCCTCTCGGTTATGTCACTGGCCACTTCATCCATTTCCCTCCTTTGTAGTTCAGGGTTAC
-AAATGTCTCTCGATTTCCTCAAAGACAGAGTTTTTGTTTCTGCTCCTTATTCTTGTTTTG
-GGGAAGTTTTTTGTTTGTTTTTTTCTTTTTTAAGAAGAGAAAAGGAATAGAAATGTCTTT
-AGTCTACTATCTTAAAGCCACCATTTCATTAGAGTTTTAAATGGAAAAAGCACCCTCTTA
-TATTGGACAGAAGTGTGTCAGCAATGTGGGTTTTGTGACTCTTACTGGAGTAAGAGCCTA
-CATTATACGCCAAGGTGGCTTCATGTTCTAGTTTTACAAATGCATTTGATACAGTTAATA
-AAATAGCAAATTATGTATTAAGGAGAATACAGATAAGTCATTGCTGGCTTGGCAGAGAGT
-GGAGAGCAGCCTTGACCAAAAAGCTTAGAGGAGGAAAAGTGGGGTGGAGGCATGAGGTTG
-ACCTGTCCCTGCTAAGTGCCACTGTTTTCAgctcacccctttccacctgcaggtccctgc
-tcagatgccacctccttggaggatccccacccacctgtcactttctctctactaacttgt
-tttatgtctgactgcctgccaatggatttgattgacttatttatctttaggtttgtcgac
-cccactagatcatgggctccatgaccagggggagctttgctttttcacctccatacactc
-ggtgcctgtgagcacctggtacatcagtagatgctcaataaagagttgttgagtgaacaa
-atGAATGAGCCAGTGATTGCGTGGATCCATGTTTTCTATGAGAAGGCAGAGCTCTGAGGA
-CAGACAGAGGCCCAGTGTGCATGAGAAAGTCCTGCTGGCCCAGGCAGTGGCCTAAGAGCT
-GCCTACCATGGCGGTCACTGTTCTTGGGGAACCACAGATGTTTCCCCTCTAATCCCTCCA
-TGGGGACCAGGGGGGCATGAGAATGGGAGAGAACACAAAGTCCCTTTATTCAGGGGAGTG
-GATTCCATCTCAAGACAAATTGTTACCTCCAAGGCCACCAGCCGCCCAGCCGGCCCATCA
-CCATGGCCTCCCTCTTAAGGATGTGGGCACAGGCCCGGCCAGAGCTGAAATTGCCCTGGA
-AACTAGTCTCCCCTTTAATTAACAGGGAGGGCGACCAGGCCTGCTAACGGGGTGGGGTAT
-GGAGTCGGGGTGGGGTCAAGTTCATAAAGTCCCCAAAGAATCAAGGCCTCCTTGTTTATT
-TTCCCGAAAATGTTCCCCATTACCCAGAACAGCATAGGGGCCAAGCAGGCCGCAGGCAGG
-GAAAAAGCTTTAACCTCCCCGCTGCTCAGCTCAGCACATCACTATTTGACTTGCATTTTA
-AAAATAATTACAAACTTAATGAAAAAATAACCTAACCCCCAAACAGGCCAGGGACTCATG
-GCCAGCATTGGCAGGAGCAAGCCCCTGGCAGCTGTGAGGATGAGATGCAAAGGGTATAGA
-GGAACCACTGGAAGACAGGGGACACCCTTTAGATGGACACTCCCTCTCTCTAGCGCCAGC
-TTTGGCTCCCTATTGCCCTTTGTGTCATGCCCAAATGTCTCAGCCCATGTCTTAGAGCCA
-GTTTTACTCAGGCCCTATGTGGAAGACACTGGAACCCAAAGAGGAAAGGAAGTTGCTCAG
-GTTGTGCATTGTGTGGGACCTGATGCAGGTAGTGAGGCTGGTTGGGATGGGTTCTCGGGG
-AAAGAGTGGAGGAAAGTGAGAATGTGTCTCTGTTACCATCTGAGCCCTGGCTGGGTATGG
-CCAACATGCCAGGTAAGCAGCCTTGGGAAGCAGGCACGATGATTATCCATCTTTAATATC
-CCAGGACTTGAGTCCAGGTCTGTCGGGCTTTTAGCCACCACACTAAGTGCTGTAAAAGGA
-GCTGGAGGTAGAAATGAAGTAACAACAATAATaataataagcagctttcatggattgtag
-actatgtgccgtgcactgtgccaagctctttaccatctcttttaatctttgcaataactt
-tatctggtaggtagtgttattgacccattttacaaacgacgcccagagcattggttcaag
-gttgtgcagctgggaaatggcCTGTACTCTTCTACCCTGAGAATAATGCTCTACAGTGAG
-TCAGGGAGTCTtgtgaggtctcaagaacagggaccttgtctgtcttattcacttgtgtgt
-cctcagagcccagaagagagactggcatataatagatatttaatatctgtgttgtgaata
-agaatgaaCAAATGCACCTGGACCTAGAAGTAACTTCCGATGAACCATCCCAGTTCTCCC
-TTCCCCATTCCGGATTATCTTTACTTACCTGGAAGTGAACAAGATATTAAGGGGCTCCAA
-AAGAACTGAGAAATAGAACTTGGTTTGAAAGACAGTAGGGAGCCACAGCAGGTCCTTCAG
-GAATGGAGTTCCAAGCTAGGGGAGTGATGGTCTTCCTGTGTCTTTATGGATTCCAGGAGC
-TAGTCAAGGTCAATGAGCCTTTAGCCAGAAGGTCAAGTTATCCCCAGTGGTAAGTGTTGG
-GGGAAGAGGAGGGCACTTCTCAGGAGTTGAGGGTCCCAAACTTGTCATGCTCATTGGTTT
-TGTGGCTGAGAGTGGCAGGTTCAGGCTGGCCAGCCAGCCTCTTCAGCTTGCCCATGGTAA
-ATCCCATGATCCTGGGTCAAGGACGCCCAAACATGGTATGTCCATAGCCAGCTGACAGAA
-TTCGTATGTCATTGAATCTTTCAACAATGGATTCTTTGAAACTTACAACTCTGGGGCCTT
-TGAGGTCCATCTCAGATTCTGAGGCTGTAGAAACTGTTCATTTTAGAATAATGATAGGTA
-CAAaacatttactgagtacttactactccagacattgtttacaaatatcaacgcctttaa
-tcctcacaaccaccccagaaggtagtaacaatgtgaccccccacttcacagatgtgaaga
-cggaggcactgaaaggtgtaacttgcccagggtcacTGGCCGCCTGGCTCTAAAGCACAC
-AGCACTGCCTCACAGACACTTAAAGTCGTTGAGACTTACACTCTTCAAATTTTAGAATCG
-TAGAAAGTCACAAGGTCAGGATCTTCAAGCCACAGAGTCTTAAAATCATAGCACTTTAGA
-ACCTGCCATCATTGACTCATCAAATTCTGCCGTCATAAAATCTGGGCATGTTATAATCCT
-GGAATTCCAGATTCTTGGGGACTTTTAAGTCAGAGAAGTTTAGatcctgggatattaggc
-ttggattacagaccctagcccagtcctctcatatagcacagggaaactgaggcccacaga
-agtgaCAGAAGTCCAAGAGAGGCAGAGCCTGGTGGATTCAGTGTCATGTTTGGAGGGAGA
-AATCGGAGTGAACAAAGAAAGCCCCTGGGCAGGCAGGAATCTGTTTGTGATTAGCAGTGG
-GTTTTAGTGTTGCCGAGGAATGTACCCAACGTTACCGTTACCCCCGCAGGTTGCTGCCTC
-CTTTCTTCCCCCTCAGATGCCCTCCTCAGAGCCCATCCTGGCCAGACTCAATATCCTGTT
-TCTACCACCAGCAAATTGAATTTTCAGAAGTTGGCCTCCTAACGAAGCCAGCTTAATACG
-TTGGAGGTTTTCTTTGCCTGCATTGCTATTTCTTGGTAGGATGCCTGCTCTTCAGGAGCC
-CAGAGAGGTTTTGCACACTCAAATCACAACGCCAGGAGGGATGAGGGACAGGAACTATGG
-GACAGGTGGCTGGGGGCTTAGATAGACCCAGAGGTGGGaatagaaatggcgtgtctcaag
-ggggaggtgacaggtccacagggacctccgtactgctcaggccacacctgggaatttggg
-ggccttcagtctttcagaaacattaaccaaatggggtttgtttagaggagggatggggag
-agatgggtgggaatcccatgCTCTGGGAGACCTTGAGCGTGGACTAGATGGAAAGAAGCA
-TGAATTCTAAAGTTCAGCCTCTCAGCTACTGCCCCCTTGAAGACAGACATGGGTGGAGCC
-CTGGGGTATAGACCTAAGATTGAATGGTGGAAACTCCATGAAGATTTTGGTTTTATCAAA
-ATCAGTGGTTCTCAggctgggcatggtggctcacacctgtaatcctgaggcgggcaggtc
-acttgagatcaggagttcaagaccagcctggccaacatggtgaaaccccatctctactaa
-aaatacaaaaattagctgggtgtggcatcagacacctgtagtcccagctgctcaggaggc
-tgaggtaggagaattgcatgaacatgggaagcagaggttccagtgagccgagattgcacc
-actgcactccagcctgggcaatagagcaagagcctgtctaaaaaaaaaaaaaaaaaaaaa
-Gcaatggttctcaaagtacagtacagtccagaatctgtggggttcctgagaccattccag
-ggcatccacatggtcaaaactatattcacaacaacactaagacattatttgttcttctaa
-ccctcagtggggttgtccaaagttgatatgacatgtgatgccaccatcactctgatagca
-atgaaaaaaattaatgcaaaaacattcatgatgaacaaaatactaaaactgtaaataaag
-agaagactaatactactgatttttcctttcatctcaggcttcagtgtgaatttttcaaaa
-tattgcattaaaatgtcctaattactgatatttttggcacacaaattttaaacctgaggc
-aagtgcctcgtttaactcactctagtcctggcTGtggatataatccacatcaacagaagc
-ttgttggggtcctcaataatttttaaggatataaagtgtgctgagatgaaaacatttgag
-ggtcactgataaaagggataatgttccatcagctcaaactatccaacaatggaggggatt
-atattccaaggtactgagttcccatcacaaggtgtgtacaaatgggggGATTAAAGGATT
-GGGTGTGGGGAAGAGGCCTAATGTGCAGCATCTCTTGCCCAGGTGCCTCCTGTGGTCCCA
-CCTACCTGGCATCCAATagatcttctcattttcccacttgaaagcttgcaatggtacccc
-actgtgctctgagcaaaaacccacctcttctccatggcctaccaggctctatgtgtcctg
-gccctgtctcccactcttttgcccctagcttgctctgctatccccaacctagcctctttc
-tatttcttcagcatgccaaactctttcttacctagggattttgcacacgctgttccctct
-gcctggaacatcttcctcttcactcttctcatggctgttccttgtatcttctgagtttca
-acttgactgttgcctccaggaaggcttccctgatcaccctatagtaagtaggatttctct
-gacatcatctctcaacctcttttttgcttccttcatggaagtcatcactgcttttttata
-tttacttgttggcatggatggttctcatctattctctccatgagaccatgagctcctcca
-gggcaggaagcctgactgttcagacatggggcctcagcacctgacccagcacctggcatg
-gaggaggcccttgagaagtgtttgttaagcaaataaaCAAATCCTTTatgaattagtgaa
-tgaatgagtaaatgaatgaaAGATTAAACAGAAAAGGCCTCTGACTGCTGATGCTCAGGC
-ACTCACCAGGAAACCCAAAGTAACACAGGTTGTTACTTTGATGAAACATCAGTAACCATG
-GCTGGATAGTGTGTGATGAAGTATTAAGCAGTAAGTGTTTGCCCACTACCCATCAGCGCT
-GATCAAGTTGGAGGAGAGGGAGACTGGCCTGGCTGCAGAAATCTTGGATGAGTTGGGGCT
-TGAACACAAGCCTTCAGGGCTTTGCCAAGGCAGGTTCCCCTGCCTAGTTTCTCTGAAGAT
-TCACATTGTATTCACTGTGAGGGCTCGGCTCAAATAACCCTGCCTCCTATGGCTCTTCCC
-TGACTCTTCTTGGGTAGGGTCGGAACACACCATCCTTGTTCTGGGTGTTATTGTATTAGG
-ATAACCACCCTTGTCTATCACTGATTTGAAGACATTAGCTTATAGAAATGTCCCGACAGT
-ATAGATGTTATCCCAGTTTAGAGATGAGAAAAGTAAAGGTCCCAGAAGAACTTACATTCC
-AGTGGAGGAGACTCATCACGGGCAAAAAACCAAACCCACGTGTTGTGAGTGATAAGAGTT
-AAGGTGAAGAATGTTGCCGCGGAAGAGGAGTGGGGAGACCTCTCTGAGGGATCAAAGAGA
-TGTGGGTACAAATTCCATCTAATAGTGTCAGCTAAAGTTCAGTTAACTGTTACCACTAAC
-AATGAGTTAGCtgttgcttccaggatgtctgtttcacgaggacagggactatgttcactt
-ttctgtccccagcacctagaacagtgaacaacacatagtaggtgttccatgtatggtgtg
-aggtgaataaaGGCCTGCctgcatcaggcgttgtatatgaattattttatttaatctcca
-tggtcagagaggtaagggttatcatccccattttgtagataaggaaatgagggcacagtg
-aagttaaagtctaatgacttacccaagaacacccagatagtaaatggtggagcccgagtt
-ggattcgaatccagtccaatctgtctcgtatcttagccactctcctacacAGccttattc
-tgctcactcactgtgtgaccagggcatattgcctaacctctcatccactgaggatgtcat
-tttctttagcttttgaaataatacccatgtcatagggttactgtgaaagtttggttcagg
-tagagctcttagattcctgtctggcacacagtgaCACCTCTTTTCAGGTGACCCATTCTC
-GTTTGATATTGTCAGCCATTGTGAAATAAGAGGGTATAGAGCAAAGCTTTCCAAATGGAA
-AAACCTGCTATGATTTCTAGAAAGTCTTGGGAAACTTTCTAGATCAGTTATGGAGGTTGC
-AGAGCAGAAGGCCTCAAGGACGAGATGCAAAAACAGCACCCATGCAAGTTGACTTGTAAA
-CTGCTTTCTTCATCCTTTAGGAGGAATTGCCCAagaggcagcatttatggggcatgccca
-gggtctccaggcactgtgctgagggctctgtatcccgtctgtcaatttttcccaactcta
-ttatacagatggcaccactgaggctcagagaggtgaagggacttgcccaaggcctcatag
-tgcatcagaaacagtcaggactcagctcaagaaaaggccccaaagcaagcactcccaacc
-acatgatctaAGACCAGGGAACAAGGGGACAATGAGAGTGAGGGCAGGAAAAACGCTGGA
-AGATGTACCAGAGACTTAGCACTTGACTGATGGCATCTTTCCAGGCCAGTGCCCACCCCT
-CCTCTCCTGGCCTTCTCTTCCACCTCCCACCCTCCTGGGTTCCTGCACCATTTTCTCACT
-GGAGCTCCTGCCATGCCTGTTATCTTCTgttggttcttgggaaaagactctgagatggag
-attggcgtgcagtgggtttattggggagagtgctcaggagtaagaccaatgcaggagtga
-ggaaaacaggcctgggaggagtgaacagctggcacaatggagttacaacagaaatctcag
-tgatcccacaggagctctggagcagagatggcccttcggagctgaaggatcgggtcaggc
-attttttatcatacaccaaccactctttggccacaggctgcacctggaacgaacgtgtcc
-ttgggcagggcaagtccctacagctgagggccattcccggctgggaaatatcagcagctg
-gcagtcccatcagctgggAAGGGTGTCTGATGAGGGAATCCATGCTAGCCCCCAGCCTCC
-TTTCCACCTGTCCACTGTTATCTGACAATAGCGATCATGCCACACTAGCTCACACCGGCA
-GAGCACTGTCTACCTCTCAGGCTCCCTACCACGTCGTGTGGTGTGtggattccctcattc
-catcctcatgacaaccatgagagggggacactttccacatgaggaaacggaggctcagtg
-agatgaagagcttgcccagagtcccaaggtgcaagaatgctgtagctggtattctcaccc
-aagcagtGGGACCTATGGGTCCTATCTTGGTCCCTTATAGAAACTCCTTCCTTTAATCCA
-ACTCGGCACTGAGTCCCCTGGagtcaaagctcctgccctccaaaagttcatcatccagtg
-ggggaagtcaagacatatacactggaaagataagggctggtaagtgctgtgatgagaggt
-gacctgagggtgggtgacagggatgtcctgcccaggaaggcaggtgagacaaagtcagtg
-agttcagcctcagtggatgaggagagtgctgtgggaaggatcggggcagggtgggcttct
-aggcagtgggagcacaggtgcaaagacagagagggtgaaagagAGGGGCCCTCCAGAAAT
-AGGGAGTGGTCTCCTGAGATGACATAGGGGTTTGGGGGAAGGAAAACAAGGTCATCAAGG
-TGGAGGGGCTCCAGCCTCAGGGCCCTGCATGATACAGTCCCTGCCCTTCCGTGAATATTT
-GCTGAACGAATGAATGGTTGGATGGGTGAATGAATCGCTGCTGTGGAGGGTGGATTGGAG
-GTTACAGAGACGGGCAGGGAGACCAGTGGGGGGTCCACAGCAAATGTCCAGGTAAGAGGA
-AATGGGCCCAACTTTGCAGGGACCACAGGGGTGAAGCGATGAGAGAGAGAAAGAGAGAGA
-GGAGCGGAACGCCGCTGGGTGTGGTGACCTAGAGCTTCTGTGGCCCATCTCTCAGTCTCA
-CCCTGTTCCACCTCCATGCCCTGCACCATGCTGCATCCCCTGCCTGGCAGCTTTTTCCTC
-TCCCTCTGCATCTGCAAGTTGCACTGGCTGCCCAAGCTCTGCTTCCTCTAGGAAGTCTTA
-TTGACCAATGCAGCTCTCCCTTACCGTGCAAGGTCACTTCCCATCTCCCTCACAGTTTAA
-CCCTAGCAAACTCCATTTGCAGAGGCCGGTGTTCAAAATGCAATTCTCCAATTTTTGAAT
-GCCAGGCCAACAGGGAAGCATTTAATGCCCTTCAGCAGGGGTATGATGGGATAAGTGTGA
-ATCCATGTATCCCGTACAGGTAGGACCTCTCTGCCCCCATAGTGCCTGCTCGTTAGCCCT
-CTAAGGGAGGCATCTGGTAAATCTGGGCTTGGAGTTTGGAGGATCGGAAACAGGAACGAC
-CTCTCTGGGGACAGTTCTTAAGTTCTAATGGAGCAACTCTTCACAGAGGGACTTGCAAAG
-CTCTTAATTAAAGTTACCATCAGAACAAAGACTCTCTGAAGCAAGAATTTGGACCCCAAT
-GGAGTCCTGAATCCAGGCAACCAAGCTTGCATAAGTGTGCAACACAAAGGCAAATGAGTC
-CCCAAGGAAGAAGAGGCTCCATCCTCAGCTTGCTGCCCTTGTCTGAGGGAAGCACCATGC
-CCTACAGCTGACATTTACTGAGTTTGCATCCGTTgactcttttggttgcagaaaactggc
-tcagacaaaaaggggatttgctggactgaaaaggccaggctggagctatggtgcagcagg
-atctaagggcttaagtgatgtctttagggtggggtttctctccatttttttctgctcagc
-atccttcagaatccacttcattcccagAGTCTATGAAGGTGGGGTGCACAGAGAGAGTCT
-GTTGGACCAGTGTGGTCACACACACACCCTGAACCAAGGAGCACAACACCTGAGTGGCTG
-AGGCTGCAGGGCACGTCCCAGATTACACTGACCAAAGAGTAGGAAAATGTTCCCCATCAG
-AAATTGGTAGAACAGGGAATGGATTCTGGGGAAGTAAGCAATGAACATTATCCGTAAGGG
-CCTActatatggtaagcagctattaatcgctttgccaatttatagttgaggaaacagcct
-cagagaggtgaagtcactctgacagccaggaagtagggaaaagcaagcttggaacgcagc
-tctgtctggtaccagagcTGAGGGTCTGGGGAGCTCCACCATCCTGCTTTCCAGGCAACA
-TCTTTACCCATCTCTGTTTTGGTCCAAGGCACAAAGCTGGTGTCAGATGGCTCTTGGATA
-AGCCTGTGTGGGAAGGACAGATAGATGGGGGTGTGTatggatgaatggattggtgaatgg
-atgaacagcggggtggatggatgggtaggtagaagggtggatggattgctggctgtgtgg
-tttactggctaggtgggtgggtaaattggtatatggttaggtggaagggtggatgtatgg
-ataggtgggtggatgCTTGGGTGAATAAATGAAATGGCAACTGAAAGGACAGGTGGAAGG
-ATGTGTGGGTAACTAGATGGGAGGGTGAATAGAATAATGCTGACATAAGCATTAACAATT
-ATGTCTAGCCTCTTGCCCCTCTCTTCCCAACTGCCTTTTCCAGTGGAAAAATTGAAAATC
-ATGGACCCGGGGAACACATTCCCCTGTGGTCTGTTAATAGAGGCCCAGCAAGGCCAGCCG
-AGGCTGTCAACTCACCCCCCACTAGGACCCTGTCATTAGCCACACTCCCCCAACCCTGCC
-CTTGGGTGGAAGTATGATCTGGTGGGCACTGAGGGGCTGGGCCCATCCAGGCCCCTTATT
-AAGCCTTATTAAGCCCACAGACGGGGAGCAAAAAGGGGAGAAGAACTTTCTCCCAAAGGT
-CAGCTGTTGGAAAAAGAAGGTACAGATGTCTCTGGGGTGGTCGTCTACTCtcaggccaca
-aggaatgtgaaagtttgcctggcccaatctgctctgctgtcttcttgcaggctgggaaac
-tgaggcccatacaggagacaggagggacacacagaagtcgggacagagccagactcaaac
-ctcaggccggctcacagaccatAGCCCAGCCTTTCCCTGAAACAGCCTCAGCATCAACAA
-TGGGGAGGGAAAGGAATGGGCATGAATGGGGCTCCTGCTATATGCCAGGCCCTTGAGCAA
-AGCATTTTCTGTTCATGGAGCCACTGGTCTCCTCTGTATCCCCATGAGTAAAATGGAAGT
-TATGCCTGTCCTGTCACGGattgaacaagcatttgttaaacatctgttatactgtgggcc
-aagcactggtctaggtgccaggaatatggcattaactagccaaacaaggtttctgctttc
-agagagcttactttctagacagtgatagagacagacaaataagtaggtagataaaatgtg
-atatgaagaaaattgaggagtggtatgagatgtacaaggatggaagggacgttctttgga
-tgagatggttgggaagggcctctctgagaaggtgaTCATGGTCAAGGTCATtaattgtcc
-accaagtccattctcccctttgctagtatgtgggcaaagcccacaagtggctgtccaggc
-agggtcaacatttcccagccctatttgcatgcaggtgtggccatgtgactagctcttacc
-aatagaatgggagcagaagtgatgagtgccacatccaggcctagcttttgagaagtgagg
-gagcttcccccatgttcttgttacttttcccctggctgaattcaaatgatggcaagaccc
-caagatagaggagccacaagattagaagagcctggattcctgcatcaccacatggaggag
-agccactcattgccctggcacatccattgcatgagtgagaaataaacttCAGGTGAGACC
-CAAAAGACATGTGATGAACTGGTTaggacattgcaggcagaggaaatagcatgtgcaaaa
-ggctcaaggcagaaccaagcttggcatgttggcacagaaaggataccaatgtggccagaa
-taaatggcacaagaggaggaaatgaggtgaaccatgcaggcagtggcctcagtcaggagt
-ctgtatttcaagtggccccagtggaggtggcgccatcagcagggaagaaataccatgtgg
-ttcatacttggaaaagatccctctggccactgtgcagagatgagttggaaggaggcagga
-atggacacaccagagaggagctggtgcagtcatcctagcctggatgaggctggggacata
-agagtgagtgaacagagtgggtttggatatattttcaagggcttgctgatgggttgtttg
-tggaaggtgaaggaaaCCAAATAACCCACAAGCCATTAAACAAAATCTAATGCAGAAGCC
-AATATATATTAGTAAACACTTTAGGGGTCTCTGTCTAGCTTCTAATCTTCCTTCCCTGAG
-AACCTCCCACTTATGCCTATCTGATAACTCTACTTATCTGATAAACTGGCCCCTCCCCTG
-CCCTAGCTCATGGAGCTGGAGATCGGTCCCTGACTGGGGCTCAGCCAATCAGATCATCCC
-TGGCTGTCAGACCCCAGTGTGTGGCTGGATGGGGAATAGGCTGGGCCCTAGCACTCTCTC
-CTTGATAGAGATGATGGGGTAGGGGGAAGGTCAGCAGCCCAGAAGCTGAGGAAGAATGAA
-CTCTCCAAGGACCACCTACCCATCCCATAGCAGGCGAAACATAGCTGCAAGTGGACTCAA
-CCACCCTCAACCACAATTGGAGCTGCCACCAGCCAAGTGTGGAAAGGGTTGGTCTTTGCA
-GAGCCCTGGACTGGAAGAGGAGAGTGGGTCTCCCAGGGCAGAAAATGGGAGTGGCCAGCT
-CCAATTCTGTGCCTCAGGTTGGGAGACATGATCCTCTGGGTTCTTTCCATACCCTAGACA
-AGGATATTCCTTGTCTGAGCCTAGACAAGTTATTCCCCTGGGAAGGAGGGAGGTGCTTCT
-GTTTCTCCATCTGTCAGGTGGCTGAGtataacagatttcatttccaaaaatggccacagc
-cccctgctcctcatgaaccctgccactctccatcaagagggagagtttatttctcctccc
-ctggagactggcaggactttgtgactgccttgatgaatagaacgcagcagaggtgactgt
-gtaacttccaagggtgggtaagaaaagacaatacagcttctctctggctctttgtcttga
-gacactcaccctgggaaccagacgaccacggtgtaaggaagcccaggccccctggaaaag
-ccagaggtaaatgttctggccgacatttacccagctggggtcccagccaacagtcagcat
-caaccaccagacccatgagggaatcagtccagcccctggccatcaagtcttccatctgag
-gccccagacaccgtggagcacagacaaatctacccactgtgcccttctggattcctgccc
-cacacaatatgtgaatgcaatgaatgactgtttgatgccagtgtgttcaggggtgatggg
-taacgcagcactagatacccagaacGCTGACTCAGGCAGACTCTGCCTCCATGACACCCT
-CCGTGCTAAGCATCTGTTCCATTTCCCCACTGTCCTGAAATTTCCAGACACTCCTCTTTG
-ACAAGCCAGGCTTGGCTATGAGCTGGGGCCTCTCAGGGATCTTCCAAAGATCAGCCGTGG
-AACAAGCCCTGCGGGGAGTTCACTCCCTGGTCAAGAACCTTTGCTAACTCCCCATTTCCC
-CCCATATCAAATCTCAGCTCTTCTACTAGGCTTCCCAGGCCTGTCCTAATCTCCTCCATC
-CTCATGTCTCCCTGAAATGGGCCACAATTCCTCCCTCTGCAGTGTATTAAGAGTGAGAAT
-GTGGGGTTAGATGAGGTGAGGGGAATCGCAGGCTCTGGGAGAGCTTTGAGAGCTAGGCCT
-GAAGCTTTAGAAGGCAGTCttccctcatttagcaaatattgagtcctagtgtgcactacg
-ttctatttacagtgctgggaatacacagctgcacctgctagacataatccctgtcctaaa
-cccatgaggatcatattctcttccacctcagggcctttgcacctgccattctcctaacct
-aaaatctatttcggaagatttgtgtacacctcatcctttatccttccagtctcaccttag
-aagggcctgcctggccaccctctctagtcatccccattgctaattccctttattattatt
-attttttttttgagacagagtctcactctgtcactgaggctggagtgcaatggcacaatc
-ttggctcactgcaacctctgcctcctgggttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattaccggcacatgctgccacacctagctaattttttgtattttagtagag
-acagggtttcaccgtgttcaaggctggtcttgaacttctgagctcaggcaatccacccac
-ctctgcctcccaaggtgctaggattacaggtgtgagccaccatgcctggcctaattccct
-ttactcttaattatatctccctgttcattttctccctaagtcttgaacaacagtatataa
-tctgtgatggctgatttacttgatgtttgtctgacttcccctactagaagtgtcagctcc
-ctgaggcagggactgtgtctgtctcattcactgctgtgtgccagggcatggcacagggcc
-tggcacccaggggtgctctatgactattAAATGTGTGCAGTGTGATGCTGGCTGCACAGT
-GCCTGCTTGCAGCTGGGAAGCTCGCAGTAAGGGGTGATCCTCTCTTTCTCTTCTGCCCTG
-TCTGTGGACATGCCCCATAAACACTCAACAGACTCCCCTCTGTGCCAGGTTCCATGTGGG
-CACCAGCAGCATGTAAGGGCTCAAACACAGTCGCTGGTACTGAAGCAGCTCCCAAATACT
-GGGGCAGGAGACAGATATCCAGCCTGTACTGGATATCTGGGGACATAGTGTAGCTGGTAG
-GGAGAGACGGCACAAAAGTCAGGGCACCAGAGGTCTGCAGTGCCAAATTAGAGTGGAGTA
-AGGACTCCATGCTGAGTAAGGAAAGAAGATCAGGCAGGCACTGGGGAGTACATTGAGGAT
-GGAAAGGAGGGCGATGGAGGCCATCTGGAAGGACGAAAGCGAGTGGTAGCAGGAGAGGCA
-TCTTAGgtatgaccccgggcatgacacgcaacctctctgaatctgtgtccCTGTTGgtat
-aacattctgtgaagcacacaggtcctggagccttcctgggttcaaatcccaccctctgat
-tactcatgaccctcaataagttctttcaacttggtttcttcatctgtaaaatggagatga
-caataatagcacctccccactattgtttcatcaggatcacatgagttaatgcattgaaaa
-cacttagatcggtgccaggcacatggtaagtggtcagtcaacgtGAGCTAGCACTGAAGC
-AGGAGTCACAGTTGCAAAGCACAGACCAGTGCCTGCACGCGCACACAGCAGGCACTCATC
-AGTGAGACGGACCTTCTATCTGCCTCTTACGCTGtaacacatatcaccacccaacatggt
-atttttttgcttatgtgattattgtcccttgcctccaccagaatgtgagctcaatgaggg
-caggggttctgtctcttttgttcccttgcattatccccagagcccagggcagtacttgac
-acatagtaggtgctcagtaagtagttgctgaatgaattcatttctaatttttagttttgt
-gcttggtgcacagcaaatgctcaacaaatgctggtcctcttCACCCCTACCAGCCTCTCC
-ATCCCGTTTCTACCTGCTCCAGGAAGCCCTCTTGGGCCTCGCAGCATCCACCAACCGTCC
-TTCATCCCAGGCTAAGTTCCCCACAGACCCCCTTGGCCCACCTCCCATCTGCTTTATCAT
-GCCTGTGGAGCCAAGGTTCACCTTGTTCCCCGGCACTCCCGCCAGCGTGAGTAAGCATCA
-GCCAGGACCTGGAGAGTAGAACCCACCCAGAGAAGAGCCCCTGCTTCTCTGCCCACCCCA
-GGCCAGAAGTGCTCTTGCCCCTGGACTGGTTTGTCCAGGGAGGTTTTCCAAGTCACTGAG
-AGCCCCATGATCAGATGTCACCAGATCCTCCCACCCCGGCTGCAGGGGCTGCAGTACCAC
-CAGGGCCAGAGCCATCCCCATGCGTGATTTCAACATCTGTAATACTTTCCCCTCTCCTTG
-TGGAATTCCCCCTCCAAATTCCTCCTGCTTCattattagtatatataaaaaataaaaaaa
-ttaaGCTGTCTTAATCATTTTCCATATTAGCTGACAGCCGGTTCCCATATGCCTGGGAGT
-GAGACCACACCTCCTGTTCCCCCCCCCTCCCCGCCCTCTCTGCTGTTCCAAAATGACTAG
-CCCCAAACAAGGCCCAGTTACTGAAAACCCTCTATCTTACAGACTCCGCAGCCCTGACTC
-CTTGGAGTCCTGTCTGGCTGGTGTGGCCCAAGCCAAAAGCAAAGCAGGAAGATTCTCTTA
-TGTCCCCAAAAAGTGCAGACCTCAGGGCTGGGCTGATCAAGGTGCAAATCTCAGTGTCAT
-CACCTACAAACTGGAACTCCACAAACTGCTTTGTCCTGTCCAAgaaagggcacaaattct
-gaagcagacggatctgagttccatctctggaactcagctctgtcaccttgggcgagccag
-ttcaccactctgagcctgagtttcgtcatctgtaaaacggcagaaacaacagcagttacc
-tctcagtgtcacagtgaaaatcaaggagaCTTTGataacagcagtgaacatccactgatc
-ccactgtgtgccaggcactgagccaagccctccctgcctccccctcattgcatctgcaca
-acaacctgctttgcagacagaaacaaagggaccgagatattaaaaatttctccaggacaa
-agaacagggaggtggaggagcaccctgacccaggcccgGCATTTTCAGTTCCACTCGAGA
-GCCTGACCCCCTGGAGATACTCCACAAGTCCTCACCCTTTTCCCCCAGTTTCACCTTGGT
-CTTTCCTCCTCTCATGGTCTTGAGCATGGGCATCAGGGATTGGCAGCACTGTTGTGTCCT
-GTCCCCACTGCCCAACCCCAGTGCCAGGGCTGTGAGCATCAGGAGGGTCGGTAGGAGCCC
-GTGGCCCATGCATGGCAGACTCAGGTGGCCCAGCACCTTGCGGCTGCTCCTAAAAGCACA
-GACACCTGTATTGAAGAGAGGGAAGTTCTGGGTTGAACTTGAACTGATTGAGAATTCCCA
-AGCCAGAGGAGATAGACAACTATGCCAGACCTCAAACTTGAAGATTGTTTTTGTTTTTAT
-TTAACTGAACCAAACTGATTTTTTTCTTCCCCCCGAATTACGAGTGAATCAGTTCATAAT
-AGAAGCCCCCATTATATCTCCTAGATTTTTAACCAAAATATCCAAAAAGAATTGGGCTAA
-CATAGCCACACCATCTTGGAATATGTATATTTATAGTGACATGTCATAAAGACTTCTAGT
-ATTTTGTCTCTACTCTTGATCCAAACTCCAGTGGTTCcggtttctctatattaagtattc
-acgtgctttgcatgtgtcacttttcatccttcagcccttagagggaagtatcattcatct
-tcaacttacagatgaggaaactgagactcaacgtagttaaatgatctgtaagacaaggtt
-ctgaatttgaacataggtctcagctgcagagccatgttattgctaacacagcctctgtat
-ggttctccagaaggcccctgatcCACTAAGAAACAAACCTGTCCCCCAATGCCAGCTGAC
-CCTATCCATGAACCCTCCTCCCTCCAGCCAGACAGGCCTCTGCCCGGAGAGGCAGCATCA
-TCTCCAGCTGcctgtactctcatcccagttcagccattcgccaagcatgacaactcggac
-aagacctttccctcctcagcctgtttcctcctgtgctgaggagaaataaaatcctccatc
-tcccacgctgttctgtgaaatgaagcaatcatgtacctaaagtgcgagcacaTagctggg
-catggtggctcacacctgtaatcccagcactttgggaggctgaggcaggcgtatcacttg
-agcttaggagttcaagaccagcctggtcaacatggcaaaaatccaccacttgagactagg
-atttcaagaccagccgggccaacatggcaaaaacccatacaaaattagctgggcgtggtg
-gcacacacctgtaatcccagctactcaggaggctgaggcacgagaatcacttcaacccac
-gaggcagagcttgcagtgagctgagatggcaccactgcattctggcctgggtgacagagc
-aagactgtctcaaaaaccaaaaacaacaataacaaaaaaaaGGGCTAGCACTTATTTTAC
-TTCTAAACTCTCCAGCCTCAACCCAACGTAAGTGAGGTGCATATAATAGGTGCTCAAGAA
-TTACTCATTGATGATAAAAGCAAGCCTGGAACAacaaaaataagagactgggcagaaata
-ttacaaaacatcagaagtagatccctctggggtggaattatgggtgattttattgtcttc
-ttggtgattttttttttctattttccaaactctcAGCTTGGAAGTATGTTATACTGTGTT
-TTCTAATTGTATGACACTATGAACTATACAATGCACTGTACACCTAATAGCAGTTTTTGA
-GAGGAAAGAACAAAACTACTTCATTGGATTGTAAGACTTGTTCTGATTTTGGTAAAGTTA
-AACTCTGCAGGGCAGGAAGAGTAGAGAGGTGTTTTAGAATCAAGGAAATACATTTGTAAT
-CAAGCAATCAAAGTGGTGGTCTTGGGGGGAGGAGGCTAATAAAATTATTATTGTTAATGT
-TATTATTAtttttgagatggagtctccctctgttgcccaggctggggtgcagtggcatga
-tcttggctcactgtaacctccacctcccgaattcaagcaattatcctgcctcagcctccc
-aagtagctgggactacaggcgcacgccaccatgcctggctaattttttgtattttaggag
-agactgggtttcaccgtgttgctcaagctggtctcaaactcctgagctcaggcaatccac
-ccgcctcggcctccgaaagtgctgggattacaggcatgagccactgaacctggccATAGC
-ATTACTTTTTAAAGGAGGAAGAGGATACAGGCAACTTTTCATTGCTTCCAGAACCTGGAA
-CATCAGCTTAACCTTGCCGGCACACCcagctcacctgggatatttgaaaataaacacaga
-tggccaggccctgtcctggtctgaatggccagcatctctaggctggggcctgggagtctg
-tgttttaaGTGGACACAGCAGATCCTGGGCACTGTATAGTAAATaaatctcctcatccac
-tttctgtctcatcttacagatgggaaatcagaagtccaaccaggggaggtgTTTAGCACT
-CTCCTGCCTGAATGGTGAGGGTGGCCAATCTCTTCCTTCACCCCAAGGGCCTTTCTCAGT
-CCCTGTCACCATCTTACCTCTCCCAGTCCTAGCCCCTTCCCCAGCCTTGCTCTGCCAGCC
-TGGAGCTGTTTCTTCCTTTTCTCCCTAAGGGAGTGTTCCCTGTTCTTAATTAGGGAGACT
-CTGGGTATTTTTGTCTCTTTGAGTACTGCGTTCTGTTGCCAGCAAATAACTTTAAATAGA
-AAAAATATGCCCAAAATTAAACTAGAAAACAGAAATAAATAGGAAGGGGGTGGGCTGAGT
-GTCAGCCTGCCCTTGGTGGAGAGGGTGGGctctgggcctcctttcctgcatctctgccat
-ggagaccatcacagtacccaccttctggggtgctgtgcacatcagacaagaagaggcaca
-cagtacactttgcacagggtgtctAAGTGTCCATTAATATCCAAAGTTACTGGGCACACT
-CGTTGCTTGGATTTTGAGATAATTATGTAGAGAAAATGTCAAGGGGCTCAAAGTCCCCCA
-GTTGACATTTCCCTACCAAGAGCTACTTTTATAACATGCTGCCGGATGTCATTTTCTTAA
-TAGGTACAATTTTAAGAGCAtctctccaccttcttccctaccctagtccaactgttcaca
-gctgaaagagtgaccttccaaaagcctaactcagatcatatgattctttgcctctgaaat
-ttttcaaagctctccattgtctacgaaatgccggcctcagagcctttcaggataggggcc
-atgaagggtctcaaatttcaaatttcatcttcctctaccatcctcctgtcaccctccagc
-cacacagacctgccccttggtccccaaaTGGATGCCCACTTCCTTTTTCCCTAATTGAAA
-GCCAGGGCAGAGTTAGGTTAATCACATGCCTTAGCTCCAGCCACACTTTTGGCACCAGAG
-TGAGACCCCTCCCTTATTTTATGTGTCCCTTTCATGCctcatccctactctcatcccacc
-tctcatccctccctcATGTGGATACCCCCCTAACGTGTTTGGCGTGTGTCTTTAAACATG
-CACGTGCCCTTGGAAAATGTGCAATGTTGTTGTCTGTGTGTATGATTTTAATTTACATAA
-ATGCTATTCATATTATGGCTTCTTACCTTTTTTCCTTGACACTGTCTTGAGATCTAGCCT
-GCATATGTGTGGAATCATCACTTCCAACTGCAGAAGAGTCAGCCACAGGGGGTGTCCTCT
-GTGCTTCCCTGCCCATCGTTCTGGTGCTGGTGGCCTAGGCTACCTCTGACTCCCCACAAC
-AAACCTCTGACTGCTTCTTATGTAAGAGAACACAACGACAGCTCCTGCTTTTTGCATAAC
-GAGCCGTTGTTTAGTAACAAGGGGCAGATGCCTCACTCAAGTGGATTTAGACACAGAGAC
-AAAGAAAGTGTAGATCTAGGTGTTCACTAACTCCTCAGGCAGCTGTCTTTCTCCATCTTA
-TCAATTCCAAGATCCCAGCCTCCCACCTTGGCAACTGCAGGGGAAAAGAAGCTCCCGAAA
-CAGTCCCAGGTGACTTTCTGGACCATAGCCTTTGTGCTGTTTCTTTGACGGTGGGATCTG
-GTTTTGTCCTGGCTTCAGCCTTCCCAGATCCATGTGTTTCAGAGGAAGTGAACTCCAGTC
-TCGGGGtgttatggactgaattcgaaattgtgttgaaaccctaaagcccaatgtggctat
-attagaagacatggtctgaagggaggtaattcaagttaaaggaggtcacgagggtggtat
-ccagtaggactggtgtccttataagaggaagagacatcagagctctctcttcacatagac
-acacagagcagatgccacatgaggacacagtgaggaggtggccatctacaggccagaaag
-gcctcaccagaaaccaaacctgatgacaccttgatcttgaacttccagcctccagaacca
-ggaggaaataaatttctgttgctgaagacacccagtctgcagtattttgttatggtagcc
-caagcagactaatacaGGGAATGAACTGTGATTGGTCTAAGGcaatatttctccattttt
-ttttcattattacccctcattattgacctcctgaagagttgttttaagaatttttttctc
-ctaagagtgcctcccacaaaatatatatatactacagacatatctatttatgtagtgtgg
-tttcttggagggtcacaaacggttgtcatatctaagattttgtcataccttaacctaagc
-taatttttacagccttaggagcaatattgccccattgagaatgcaCTGCCTAAGGCAATG
-TACTTGGTCTgtgattggttagaacatgggcatgtgaggctaatgtagaccatagatgtg
-agagccacagaggaagaaattgtcccttttcacctttggtctttattatggatggacata
-atgcctggatctgcggcagctattttgtgactatgaggacaggctgatatgctttaaatg
-gccaactagtagataaaacctaggccattgttcatatatatatatatatttgagatggaa
-tttcactcttgtcacccaggctgaagttcagtggctcgatctcagttcactgcaacctct
-gcctggttcaagctattcccctgccagagccttcagagtatctgggattacaggcaccca
-ccaccactcccagctaatttttgtatttttagtagagacgacgtttcaccatgttggtca
-ggttggtctcaaactcctgacctcaggtgatccacccacctcggcctcccaaagtgctgg
-gattacatgtgtgagccaccacacccggcccactgatcatatttttgagcaataaaagta
-accagccctgaaactgccctaccacaaactcctccttatgtgaaatgatgcattttcaca
-tttcagcctgttcagctgtgtagtttttgtaattgcagctgaagacattctaacagaTCC
-TGTtctttttcccgtaagttgtaccaaatgttctgaggcagactggcagtgatgggcctg
-gttagtccatgagttcatccccaaaccaatcttgtggccagacttgaatcctgtgcccac
-ccacctttgtagctcagggatgggaaggggtcaaccccacctggactgagaactgggggc
-tgttcctccgagggagatgagggagatacttcccaaagggattgtgaatgctgagagggc
-agaaatgacagctgGGTTTCACATTCACACCATCCCTTCTACATGAAATACCCCATCTCC
-AGCCCAATATACTCCCTCTAGTGCAGCTCAGCATCTCCCTCTTCTGAAAGGTCTCCCCAA
-GACCATGTTGAAATTATCTCTTCTCTTCCAGGTGATGCTCACTGGGGCATTTGTAGTCTA
-CCTCTGCCCTTAAGAGGCCAGTCTTCATGGCATGCAATCattcatgcatccatctaccct
-ccaatcttaattagcaccttctgtagccatccctaggccttggggtgctaagcaagaaaa
-aggcataatttccatcctcaaggatctcacagtccaggggaggaagcaaaactcataggc
-attcatTCGACACACATTTATTCTCTGTATAGATATGAGTAAAATATTGCATATCCTCAA
-GGAAAGGGGGAACTCCCCAGCTAATGGGACAGACAGATGAAGAACAAGTAAGTACAGTGT
-ATAATGAGGTGACAGAAGCCACCACTCATTGCTCTGACTAGGAGGAAACAACAAGATGCC
-TTAGACTCTTTTGGCCAAGGAAAGACACACTAGCTGTGTGAATGCCAGGTGAGCTGGCAT
-CATTTGTCTGGGATAGGGTGCAGTGGAGGCTGTTGAGGCCTGACAGCTTCCCCCTTCACC
-TTACTCCATTGTTTGCCAGGCTCATGCCTGGGAGAACCATATGCATAAGAAGACCTGGAT
-CTTATAGGAAGAAGAAGTGGAAAAGCCAATACCTGACCTCCAGGAATCAGAATTTGtgtt
-gcaggttgggttctatgcaggcagacacgaagacagagtttaggtgcaaggtgtttatta
-ggaatcaatatctggaaaagaaaggggcaggaatcagggttgaggaggaggagatactta
-actgcaatgtgacccagtaaagcgttggtcaacatggtgaggaagttgggagcaagaatt
-atccctcgatagacaccccgttctacatgatgtaattattatgaattacatgcctgtatc
-aaaacatctcatgtaccccataaatatatatatacctactatgtacccacaaaaattaaa
-attaaaaagagttacccctcagagaatcccaaaagatatcaaaatatccagacttttgtc
-tcagccccttcattttgatagttcactattcaccaaatacaggttgccccaggaagggca
-tggcctgggatgaagtggccctctcaagctgaggctaaccttgaaggggctgaagctgaa
-ggctctctgctgaccatgcttccCCCGCCTTCAGCTGTCAAGTCCTTCAGGGTCAGCTCA
-GTTCTGAGTGCCACTTTACTTGGGGTCACTTCTTTGATTCCAAGCAGTTTAACATAATGG
-CAACCACAGTTAGGGAGACCTGTCCTGGTGGATCAGGGTGGCCCAAGCTAAGGTCTGGAG
-GAAAGACGACCCTCAAGAAAAGATGTCTCCTCTGTCCCTCCACCCCATTCATACTAAGGG
-CCATGGGTTCATGGAGAGGGTTTCAGATGGGCACATTATAGGGCTGAGGCTAAAAGTCTC
-TTTGAACCAACTCACACTTGTACAGAAGTGATGCTGTGAGGACTAATGAAaacaagtagc
-atctactgcatgcttaacatacaccaggcactattccaaattttttacccacattagtca
-tttaattctcacattaccctatcagaggaacaatgatGAGCATGGGTATGTAGACCAGAA
-GGAGCTAAAACCCTAGAACACAAGCAGAGGACACCAGTGAGCCCAGGAAAGGCCCTGGGC
-CCCTGGAAGCAGTCTCCTCATCCGCCTGCATGGGCCAGGGTTCAACAGAGGCACCATGTG
-GCTGCAAGAGGCAGAAATGGCTGCAGACTGAGCTCTACTAGTTCCTTCCACTTGATGTTT
-GAATAAAGTCCCTGGAAAACTTGGGGAGATGGGATGAGTATCTCAGCTGGGAACACACCA
-AGACTTCTTAATAAGGCATGGAGAGGCTCAAGCAATTGATTGGAAAGAAAAAAAAAAAAC
-AAAACTAACTCAAGTTGGTAGATTTTACCTGCCATGAGATGTTTGTGAATAGCAGAGCAC
-AGGGTAGAGAGGTCACTGCCAAAGAGCAACTCCCAGTCACCCTTGACATGTGGCATCCCC
-TCTCATGCCTCCACGTCTGCATAAGCTTGGTAATCTTGTGCCCTCTGACACCATTCTCCC
-ACCTGTCACCCCACTCCATTCTGCCCATCAGGATAATGCTGCCACATCCTCCAGGAAGCC
-TTCTCTGGCTGTCCTTCTCCATGACGCTAGGCTCCCCTTCCATCTTCCCACAACTTCATG
-TACCTCCCTCTATCATTTTATTTATCAATCATTCTAGATTTTATGTGTTTATGACTGACT
-TTCCTCCTAGATTATGAGGCAGTATGATTATATTATTTACCTTTCCCACTGTCATGCATT
-CCCATTTATCTCACTCGGCGATTGTCACAACAatgctgcaaactaactaccactaagctc
-agtggcttaaaacaataacttcttctcactcatgggtctgtaggtcagctgggattctgg
-tggtctagactgggctgggctccaggcatgcatgcggatctgctccacgcgtctctcatc
-ctccttgacccacagaagacagctggaagcaggcaggacctcataggctttagctcagag
-ctggtgtgctgtcacttctgcccatgttccatcagccagagcaagtcacatggccaagct
-caacatcaattagatgtggagaaaattgatgagtcatgtggcaaagggcatggatatagg
-aaaaggtgaaaattAGGAATAGTATGATTTACTGTGACACAGATGCTTTCTGGTGAACAC
-CAacctctccaaactcatttcaagacccttcctcatcagcccagtgctcaaggtcaattc
-ctgcaaccttcagccctttgtagcctttcagtcttttgaacacactgtactttttgtctg
-acatacacctttcccatccctttcagatctcagctgagatgtcatctcctcaaagaTTTG
-CATGGCTGTAGGCTTTGCCACCAGGAGATAGTGACCCAACAAACAAGCTTGTATGGGTGA
-GTCCCTGAATCCAAACCCAACCCTGcctggccttgccactcactgctgtgaggccctaag
-aaaatcttatcttttttctactgctgttttcttatctgccaaaagtaaataaaaacaTCT
-TCCCAtatcagttagaaatgcttgcagctgcaagtagcagaacccctaatagtagctaaa
-acaataatatctcacaaactagatgcctggaagcaagaagctccagggctggtttattgg
-ctcagtgatgtaaggacTAAGTGCTCACTCATACCCTCTCATTTCTCCTCCTTCCCTTTC
-CCCATTCTACtaggttggtgcaaaagtaattgtggtttttgccattactttcaatggcaa
-aTTGtggtgcaaaagtagttgtggtttttgccattactttcaatggaaaaaacagcaatt
-acttttgcaccaacagcaaaaacagcaattacttttgcaccaacctTAATATTTCCACAG
-TGTCTTCCCTAAAGTCTCACAGAAGGTTCCCTTTACATTTTACTGGGCAGACATGGATCA
-TATGGCCACTCTAGCAGGAAAGTGAAGTGGGAATGCCAATATCAGGGTTTTGTTGTTGTT
-GTTGTTCAGCCTCCTTTGGGGGAAGCAGCAAACGAGAAGGGGGTAAGAATTGGCTGCTGT
-GTAATCAACTCACAATATCTACTCCTGATCTAACTTTCTACCTCACAGAATTTTTGTGAA
-AATTTGGATTGCCAGTAGCACTCTGAAGGCCACAAGCTTATAAAATAATAATCTACTTTT
-ATTATTATTCATGACTTATTAAGAAAAAATCAATATTGGAAGAGAATAATACTTCGCATT
-TGTTCAACAATGAACTTTCCGAAGGTGAAAGGAAAAGCAATTACTGTCTGAGCCCAGCCT
-GAGTCCCAAGTCCATGCCAAGCGCAAGCCTGCAAGACCATTTCCTCCTCCAGGGACTTGC
-TTCGATTGTGctaaaacagcttctgccaagccaaccaggattgcatgctgccaaatccag
-tactcattttcctgatcttattttatttgaattccctgagcattcaatccagttggcagc
-accctccttgatacatgatcctgtctgggcttctgtatgctcacagccctggttgttcct
-cagtctcctctgctggcttctccccatctacctggtttctagatgccagctgactcagga
-ctcacatgtgagctcctctcctccttcccaccccctatgctctttctgtctcaGGTttct
-caaaccttagcatgcatcaccgtcacagggagggcttgttaacacatagattgctgggtc
-tcactcccacagtgtctgatttcatcgctctagggtgaaacctgaacacttgcatttcta
-acaatttctaggtgatggtgatgatgctggtcctgggaccaccccttgagaacctctCAC
-TGCTCTatctcaaccagtgttgagagccttgtttctcagccttggctgcaaattggaatc
-acccggggtgctttaaaatatggacaccaggatctcatcccccagagattctgattttaa
-tggtctgcattatatcctgggtacctagagttaaaaacctcccccaggtgacttcaacat
-gcaggtaaagttgaaagcccctaatttagatactacttaactgctagtaacacctacatt
-tatttccctctcccagacttgtcctctgagttttagcccagtatgcccaattattcactc
-gatatctccacttacgtgactcacaagcatctgagagttaacacacccaaagtggaagtc
-tgaatcttcacttccaaattgctacttctctatcttccccatctcagcaaacagcaactc
-catccatgtgctgtagtttattggggtaaaaaccttggagttatctttggctcctctctc
-ccctccatgacccatatataatcctttgacatagtctatcggttccacctacaaaacata
-tccctaaattctcctctctgcctgaactgctaacacctacatcagaatatcatcaactct
-ttcctgggtggtctctgcagcatcctcacctccctacttctattctttactccctcgcca
-atgcatcctccaaacagcagccagaatggtctcttaaaatcataaaccagatcatgatac
-accccgatttaaagtcttgcaaaacttcctgtcaccttgggcataaaatctcagctcttg
-ctcatggccagtgagatcctgtcctcttctcaaccttgtctattccgctctctccctggc
-ttagatactccaaacacactggccttccttctgtcccttaaatacattcagttatttctt
-gcatttactatttcattaacctggatttctgttccctttggactctgcttggccagctac
-ctctcatctttcaggtctgcttaagtgtcactgccttaaagtgtctccctgacccgcctg
-ttatgttctatcataagactctatattcttcttagcgcctatcagagttggtgatcattt
-gatttgtaaatatattggtttattatttgtctctctcactagactgtgtgctttgtgagg
-gcaggaaccatgcctgttttggtcacggttgacacctcagtgcccagaagagtgaatgag
-acatagtgggtattcaaaacatacttagggagggagagaaaagaggaagaaaaaggaggg
-aggagaaaggaaggTCTAGTAATACTCAGAGCCCAGGAATTACACACCAGATACCCCTTG
-CTTCTACCCAAGAGGTGGTTCAGATTAGAGATTAGATTTCAAGGCTCCAGCTTGCTAGCT
-CATAACTGCTTCTACTCAAGACGGTCTATTCATGTAGCAAAGTCaaaatgtgaacatgct
-tttaagttccttgacgacaggaattgtggcttgtttactcttctacctggcatttgcaca
-gagcctgggcctgaatgaaagttcagtaaatggttcatgaatgaTTTGAATGGCATTTGC
-CTGAAGGAAATCTAAGAAAGTCTTGCCTTGGTTTCCCCATTAAATGGGGCAAGCAATTCT
-TATCTCCCCTTCCAGAGAGCTGCTGCCAACACAGGGAATCCATCCTGGAAGAAAAGATTG
-GTGGCCACCTGCACCATCAGGTGGAGGGCATCTCTCAGCTGCCCTTGCCACATCTGCAGC
-CCTAAGCTTCCAGGTGACCCCAGTGGACCAGTCTGCCCAGAGCATATCATTAGTTAGGGG
-CACTCTGCAGGAGGATGCCTGCCTTTGCTAGTGCATAGCTAATGTCCCAGGGGGCTTCCT
-CTAATTAAAACCCAAACTGCAATTATAGTTGTGCCAAAGCATGTGCACATGGCGCCACTT
-AAAAGGGACAGATTGACAAGGCGTTAACAACTCCAGAGGCAGCATTGTCCCAGCACCAGG
-TGCTACCAATCATCAAAATTAGAACCAAATGAGTCACTGGGGCTCAAGATACAGTATCCA
-GTGCAGACTAATGGGTGATTCCAAGAAACTTATGAGGATTATTTAAaacacactaactat
-gctccttctacagggcctttgcacttactagtccctgtacttcttcttgcctaactctat
-ttgatctctctcaattatcacctcttctgagacacctgctttgatcacatgaatctctac
-cctgctttatttttcttcttagtgtttattatcatctgatattatatatttgtttTGCGA
-TTGATAGCCCaaaatatgttttaatattgtataaatgtaaaacatatataaatacacaaa
-attttataattttCTGCAATACATATGTATCAAGAAGATACAGCATACACACTAAGGAGG
-GTGTCTTCTTGGGGTTGGGGGTGGTGAGGCAGGGGAATAGAAAGACTGATTCAGAAAGAA
-GAGAGGAACAATAAAAGAACAAATGAGAATATTTATATATCCTGATGACAATAGTGGGCC
-ATTATTTGAAGAGTATGATAAACTTGAATTTTCCTTCCTATCACTTGGTAAACTTGAATT
-ATTCCTCCCTGAAGTTCTGTACTCTGGGAAAAttttcttttttttttttttttggagaca
-gagtcttgctctgtcaccaggctggagtacagtggcacgatctcggctcactgcaacctc
-tgcctcctgggttcaagtgattctcatgcctcagcctcccaagtagctgggattataggc
-acatgccaccacacccagctaatttttgtatttttagtagagacagggtttcaccatgtt
-ggccaggatggtctcgatctcctgacctcatgatctgcccaccttggcctcccagagtgc
-tgggattacaggtgtgagccaccatgcctggccACTCTGGGATAATTTTATTTTGGTTTT
-TAGAAATAACTTTATTGAATATTTTAGTACCAGTAATCTTGCGATAAATTTCAGCCCTGG
-TTTGGTTGTTGTTgttgttgtttttggtctaaagccatcttgattttgcctttatttttg
-aagagtatttttactagatatagaattctaagttgtcaattatgtatattttttcagcac
-tttataaatgttatttcattgtcttctggctttcatcatttctgttgaaaagtctaccat
-cagtcttattgttgctcttctgtaggtaatgtcatttacctctgactacttttaagattt
-ttctctttatttttgtttttcagcagtcttactatgatgttcctatgtataattttctta
-gtatttaccctgcttgggattgtcagagcttcttgagtctgtgggttgatatcttttatc
-agttttgaaaaaattcttagctcttatttctgcaaatattgttaattttgtattcttatc
-ctcaccttctaggactccaaataaatgtatattttttttactaggtcccacatatctatg
-acacattcgtgtattttctattatttttctatgtatactttagtttggacacttttcatt
-tttttaagtgtgctaatcctatcttccactgtatcaaatctctgttaatcccatctgatg
-aatttttgatttcagatattatattttctcattctagaggtatcattttttcttttttat
-agacgctaattttctgatgaaattctccatcttttcaaatattttgtgcatatttttctg
-ttttttaaCATATTAATCTTAGCATGTCAAAGTCATTATCATATACCTGTTTCTATTGTC
-TATTTTATTCTGTTTGTTTTCAGATATGTCCTAGCTTTGGCATAACTAATAATGTTAATA
-GAATGCCACTTATTATACATAATGTAGAGACTCCAGATGATATATTCTTCTAGAGAAGAT
-TTACCCTCTGCTAGGCACAGAGTGGGGCTTATCATCATAAACCAGTCAGGGATTGTACTG
-AGTCAAGACTGTAAGGTAACCCCAGGAAGGTCAGTTTCCCTGTGCTTCAGTCAGTCATAC
-ACTGAACACCTCTTCTCAGAGGCTTTATGCCAAGGTTTATAGCCTCCTGCACCAGGTATC
-CCAGAATCCAGCAAGTGTCTTGAGGGATTAATGAGCCCTCAAGTCTGCCAAAGGCTCTGC
-TGGTTTCTTCCACACTAGTCCAGTGCTGCATAAAACTTGGATTCTCAGCATTCTGCTTTT
-GCCTAGAATTGGAAAATGGTCTGGGGTAAAGAAGCTATATAATTCAGCTTACTCCCCTGC
-TGTTCATTCCTTTCCAGAATTTTAGCAAGTAGTATATTTTTTTCCAATCCTatgatatct
-gacaatgctactatatttctctagtcaatttactcttccatttcctgggcaaccatttca
-ctttctcttatttcttcacatctttgacaccttctttctctcctcacttctaactgacgg
-cttacaaatgaaagcaagtggaatgacaataactttttataaaaacttctacactagtcc
-atcaacacgtctctctaatacttctccctccctctctttctctctctccctttctctctc
-tccatgtgtctgctggatcccatcattctcatctaatcaaggactttgctcctataatca
-tccctccatgaatcattttcctctctctgctaaattattcccataagtggacaaatatac
-cattagtctcccatcttctaaaaagtatataccctcccttgtctcaatatctctgtgcag
-ctacccccacattttgtttcttcccatttgaagcaaaactcctcaaaaattgtatatatt
-cactatcttcattttctttccttctatgccaaacaggttttcctccttcaaagctactct
-catcagggtcaccaaatacctctgcattgccaaatccagaggtcagttcacagacctcgc
-cttacctgattgctcagaagcatttgacactgttctctttgctggttcttcctcatgttc
-tcgacatctgagtgttggagacccccaaaatcagtcctaggactctttcttttccttcta
-tatattccttttacgtgctttccttattctctttgtatataatttaatacctctactggg
-taatttacaaagaaaacaaacttatttctcacagttctagaagctggaaagtccaagatc
-aaggcagcagcatgttcagacgtgtggtgagggctgccctctgcttcctagatggtgcct
-tgatgctgttgtcctccagaggagaggaaatctgtaaattcacatagtggaagatacgga
-attatgaaaaaggaacaaactccctccatcaagctcttttatcagtaccttgatccattc
-tgccctcatggcttaaacacctttcaaaaggccccacttcaacactgttgcattggcaat
-taagtttccaacacacacattttggggaacacattcagaccatagcaacccttttgttca
-gtctcatgattttaaatatcatttatattttatgactctcaaatgattctagccagaaat
-tatctcatgagctctagactctctctacatacccacattaacaGCAACGAAAGCACATTT
-AATCAATTTAACCCAAGGAAGTAATACGATGAGCTCAGGTAATACAGACTGAGACTTCAT
-CCAAGATCACAAGGATGGTATGTGCTAGACTCCAAAGAGATGCCCAAGATTTTGTAAATA
-CCCTTCCCTTCCACAAGAATAGAGTTGTTATTTGGTGTGATTTCTCAGGGAGTTGGGGAG
-ATCTCTTATCAAACTCCCAAATTGCTCTCCAATCTGCTCAAGTTTTCTGAAATGTTGTTG
-tttctgggtcatagcatatgcacatacttactttggttaagttcagccaaattatttctc
-cagaatggctgttccagtctacattctttccagccatgcctgtgggctcttatctccaca
-tctttgccaggtattactagccttttagtttttgcctggttaataaatgtaaagtgctaa
-ttctctgatgttttatttatcatattactaattaatttgagcatctctcacttacttgtt
-ggcttgtttctttttccataaattggtatccatttctcttgccagttttttattatggag
-tatatatatattgccaatttaaaggacttctttgaatattctagTGATTTGTCCCCTGTC
-AATTTTAGAAATTGCAAACATCTCCTAATTTGTCATTAGTCTATTATCTTTGTCTTTATG
-TCTGTCATTTAAGAGAAATCATTTTCCTGTAAATGTTTTAAAActttttattgtaaaata
-aaacacattaaaaatctcacacggcaaatgtttaacttagtaaattattataaactgaac
-cctttaaagtattactcaagtcaagaatataactttgccggccattcagaagcccctccg
-tatgttctatcccaattatagctccctctcccctccaaaagcaatattaccctgactttc
-atatcaatcactttcttgcttcttttatcatccaagtgtgcacccccagacactatggtt
-tagtcttgccATTTAAAAAAATgtttatatgtattttgagtctcttttaatctacaggct
-ccctttccatctcttctctttctttaatattcatctgttgaagaacccaggccatttgac
-ctgtacagagtcccatagtttggaatttgctgattgcaagtcttggtgaagttcaagatt
-cctctgtttaacgtctttactgtaaatggacagctggtccagaggcttcatcaggctcag
-acgctgtgttattttatcatgtggcacattcctatctgggtgcttctctttgagaaggca
-gtgacacttaaagattagatctattgattcattgcggattggaaaaaggggatgttctaa
-ttccattttttttttcattttttttaactggaataattttataaagagacacttttctca
-ctcgccattggttattgttacgaactgaattgtatccctccccaaattcattcattcgtt
-gaaacctagcccccaatgtcactgtacttggatatagggccgctagggaggtagttgagg
-ttaaatgaggtcagaagggtagggtactaatccaataagactggtacccttagcaaacaa
-agagactccagtggtctgtgtccttctctccatacctgcaaagaggaaaggccatatgaa
-gacacaatgagaagtcagccctctgtaagccaggaaggaagactcaccagaaaccacatt
-ttgtggcaccttgattttggacttcccagcctccagaactgtgagaaaataaatttctgt
-tgtttaagccacccattcggcggtattttattttggcagccctagcaaactaacaccatt
-acccaagtggtataattaatacataaaagagaagataactgcttgattctctttatttac
-caggtttcgagataatgaatttgttcctgttatcctccaaaggctaccatttaaattctt
-ttgttattattaaatcatggatttaagtatagtttgtggttttcaatccattgcattttt
-attctaattgacaatcaagttgttccatctttgaacagtaggaagctctttggcttggct
-cctgaggccttttgacttatctcccttagtccttgaagcttctttgtatcttgaatgaca
-aaatattccaggcttgtcctaccttcatatcctgctttaaacctagaatcagccatttct
-tcaaggagtcctgggtccttctaatgagaaattttatttcaagactataatatgaatgct
-agagatgttcactgctcctgggctgctcattaagtctaggcttcttgagtgggcaaagct
-aatatacatatatgtatgtgtgtgtgtgtgtatatatatatatataactcatgaattcat
-actggttcaatgagttcagttctaacttagaactcagattgttcacttaacttcttttac
-actatatttgaatcttttttcttacattctgagaattctggttcttaatatcACAGGGAG
-TGATATAATTAGGATGTCAATAGTCTTTAATTATTTAATTTATCCCATGTTGTACACACA
-ACAATACTACCAATCCTAATTACTGACAACAGTTTAAAAAGTTTTGCATATGCTATTCCA
-TTCCCTCCCCATTTTTATATTTACATAATCAAATAATAAAGCCTTTAATATATAGTCTCT
-ttctggtcttagttccgcaagtgggtatatataaaggctcaaaatcaatctttatattga
-catctctctacttatttgtgttgtctgatgctcatattgt
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta.fai b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta.fai
deleted file mode 100644
index 04a438b..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-chrM	16571	6	60	61
-chr20	1000000	16861	60	61
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta
deleted file mode 100644
index 9b75d10..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta
+++ /dev/null
@@ -1,16946 +0,0 @@
->chrM
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTT
-CGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTC
-GCAGTATCTGTCTTTGATTCCTGCCTCATTCTATTATTTATCGCACCTACGTTCAATATT
-ACAGGCGAACATACCTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATA
-ACAATTGAATGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCA
-AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGCCAAACCCCAA
-AAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAATTTTATCTTTAGGCGGTATGC
-ACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTA
-ATCTCATCAATACAACCCCCGCCCATCCTACCCAGCACACACACACCGCTGCTAACCCCA
-TACCCCGAACCAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCCTCA
-AAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGG
-TCCTAGCCTTTCTATTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGA
-GTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGC
-TCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAACCTTTAGCAAT
-AAACGAAAGTTTAACTAAGCTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACC
-GCGGTCACACGATTAACCCAAGTCAATAGAAGCCGGCGTAAAGAGTGTTTTAGATCACCC
-CCTCCCCAATAAAGCTAAAACTCACCTGAGTTGTAAAAAACTCCAGTTGACACAAAATAG
-ACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAACTGGGATTA
-GATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAG
-AACACTACGAGCCACAGCTTAAAACTCAAAGGACCTGGCGGTGCTTCATATCCCTCTAGA
-GGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATA
-TACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAA
-AGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCAAGAAATGGGCTACATTTTCTACCCC
-AGAAAACTACGATAGCCCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTG
-AGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCC
-TCAAGTATACTTCAAAGGACATTTAACTAAAACCCCTACGCATTTATATAGAGGAGACAA
-GTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACA
-CAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAAACC
-TAGCCCCAAACCCACTCCACCTTACTACCAGACAACCTTAGCCAAACCATTTACCCAAAT
-AAAGTATAGGCGATAGAAATTGAAACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGA
-TGAAAAATTATAACCAAGCATAATATAGCAAGGACTAACCCCTATACCTTCTGCATAATG
-AATTAACTAGAAATAACTTTGCAAGGAGAGCCAAAGCTAAGACCCCCGAAACCAGACGAG
-CTACCTAAGAACAGCTAAAAGAGCACACCCGTCTATGTAGCAAAATAGTGGGAAGATTTA
-TAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTT
-AGTTCAACTTTAAATTTGCCCACAGAACCCTCTAAATCCCCTTGTAAATTTAACTGTTAG
-TCCAAAGAGGAACAGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAAAATT
-TAACACCCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACC
-CACTACCTAAAAAATCCCAAACATATAACTGAACTCCTCACACCCAATTGGACCAATCTA
-TCACCCTATAGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAA
-GCCTGCGTCAGATCAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCA
-ACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAAGGAAAGGTTAA
-AAAAAGTAAAAGGAACTCGGCAAACCTTACCCCGCCTGTTTACCAAAAACATCACCTCTA
-GCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACC
-CTAACCGTGCAaaggtagcataatcacttgttccttaaatagggacctgtatgaatggct
-ccacgagggttcagctgtctcttacttttaaccagtgaaattgacctgcccgtgaagagg
-cgggcatgacacagcaagacgagaagaccctatggagctttaatttaTTAATGCAAACAG
-TACCTAACAAACCCACAGGTCCTAAACTACCAAACCTGCATTAAAAATTTCGGTTGGGGC
-GACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCG
-AACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAA
-CAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGAT
-CAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAACGATTAAAGTCCT
-ACGTGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTC
-CCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATG
-ATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTgttaagatgg
-cagagcccggtaatcgcataaaacttaaaactttacagtcagaggttcaattcctcttct
-taacaacaTACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGC
-ATTCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAA
-CGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCATAAAACTCTTCACCAA
-AGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGC
-TCTCACCATCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCT
-CAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTG
-ATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCA
-AACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGG
-CTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATC
-ATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTT
-CGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGG
-CCCCTTCGCCCTATTCTTCATAGCCGAATACACAAACATTATTATAATAAACACCCTCAC
-CACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTACACAACATA
-TTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCC
-CCGATTCCGCTACGACCAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCCT
-AGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCCCCCTCAAAC
-CTAAGAAATATGTCTGATAAAAGAGTTACTTTGATAGAGTAAATAATAGGAGCTTAAACC
-CCCTTATTTctaggactatgagaatcgaacccatccctgagaatccaaaattctccgtgc
-cacctatcacaccccatcctaAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCC
-GAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTAC
-TCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACCTGA
-GTAGGCCTAGAAATAAACATGCTAGCTTTTATTCCAGTTCTAACCAAAAAAATAAACCCT
-CGTTCCACAGAAGCTGCCATCAAGTATTTCCTCACGCAAGCAACCGCATCCATAATCCTT
-CTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGAACCATAACCAATACTACC
-AATCAATACTCATCATTAATAATCATAATGGCTATAGCAATAAAACTAGGAATAGCCCCC
-TTTCACTTCTGAGTCCCAGAGGTTACCCAAGGCACCCCTCTGACATCCGGCCTGCTTCTT
-CTCACATGACAAAAACTAGCCCCCATCTCAATCATATACCAAATCTCTCCCTCACTAAAC
-GTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGATTA
-AACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATA
-ATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATC
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTA
-TCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCC
-CTAGGAGGCCTGCCCCCGCTAACCGGCTTTTTGCCCAAATGGGCCATTATCGAAGAATTC
-ACAAAAAACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTC
-TACTTCTACCTACGCCTAATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAAC
-GTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATC
-GCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATACTAATAATCTTATAGAAATTT
-AGGTTAAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTG
-CAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTA
-ATTAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGC
-TAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCGGGA
-GAAGCCCCGGCAGGTTTGAAGCTGCTTCTTCGAATTTGCAATTCAATATGAAAATCACCT
-CGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTC
-AGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCAC
-AAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCT
-CTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCAC
-ATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCC
-ATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATG
-GCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTG
-CTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTA
-GCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTA
-GCAGGTGTCTCCTCTATCTTAGGGGCCATCAATTTCATCACAACAATTATCAATATAAAA
-CCCCCTGCCATAACCCAATACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATCACAGCA
-GTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGAC
-CGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGGAGACCCCATTCTATACCAA
-CACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATCCTACCAGGCTTCGGA
-ATAATCTCCCATATTGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGT
-ATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATA
-TTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATC
-GCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATG
-AAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGC
-CTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTAC
-GTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGC
-TTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATC
-CATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGC
-CTATCCGGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATC
-CTATCATCTGTAGGCTCATTCATTTCTCTAACAGCAGTAATATTAATAATTTTCATGATT
-TGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTG
-GAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGAAGAACCCGTATACATAAAA
-TCTAGACAaaaaaggaaggaatcgaaccccccaaagctggtttcaagccaaccccatggc
-ctccatgactttttcAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAA
-TTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACG
-CTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTT
-TCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTA
-ATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCA
-TCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACG
-ATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCG
-ACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCG
-ACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTA
-TAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAA
-CAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTAT
-ACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAG
-AATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATTTACCCTATAGCACCCCCTCT
-ACCCCCTCTAGAGCCCACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAA
-GAGAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCA
-TAATTACCCCCATACTCCTTACACTATTCCTCATCACCCAACTAAAAATATTAAACACAA
-ACTACCACCTACCTCCCTCACCAAAGCCCATAAAAATAAAAAATTATAACAAACCCTGAG
-AACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACC
-CGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCAT
-CAACAACCGACTAATCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGAT
-AGCCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTT
-TATTGCCACAACTAACCTCCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACT
-ATCTATAAACCTAGCCATGGCCATCCCCTTATGAGCGGGCGCAGTGATTATAGGCTTTCG
-CTCTAAGATTAAAAATGCCCTAGCCCACTTCTTACCACAAGGCACACCTACACCCCTTAT
-CCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGT
-ACGCCTAACCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCAC
-CCTAGCAATATCAACCATTAACCTTCCCTCTACACTTATCATCTTCACAATTCTAATTCT
-ACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGT
-AAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTA
-AAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTA
-GCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACA
-CTAACCATATACCAATGGTGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCAC
-ACACCACCTGTCCAAAAAGGCCTTCGATACGGGATAATCCTATTTATTACCTCAGAAGTT
-TTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAA
-CTAGGAGGGCACTGGCCCCCAACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTC
-CTAAACACATCCGTATTACTCGCATCAGGAGTATCAATCACCTGAGCTCACCATAGTCTA
-ATAGAAAACAACCGAAACCAAATAATTCAAGCACTGCTTATTACAATTTTACTGGGTCTC
-TATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGC
-ATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGC
-TCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACAT
-CACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTTTGACTATTT
-CTGTATGTCTCCATCTATTGATGAGGGTCTTACTCTTTTAGTATAAATAGTACCGTTAAC
-TTCCAATTAACTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCCTTAATTTTA
-ATAATCAACACCCTCCTAGCCTTACTACTAATAATTATTACATTTTGACTACCACAACTC
-AACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCC
-CGCGTCCCTTTCTCCATAAAATTCTTCTTAGTAGCTATTACCTTCTTATTATTTGATCTA
-GAAATTGCCCTCCTTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATA
-GTTATGTCATCCCTCTTATTAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTA
-CAAAAAGGATTAGACTGAGCCGAATTGGTATATAGTTTAAACAAAACGAATGATTTCGAC
-TCATTAAATTATGATAATCATATTTACCAAATGCCCCTCATTTACATAAATATTATACTA
-GCATTTACCATCTCACTTCTAGGAATACTAGTATATCGCTCACACCTCATATCCTCCCTA
-CTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAAC
-ACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAA
-GCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTA
-CATAACCTAAACCTACTCCAATGCTAAAACTAATCGTCCCAACAATTATATTACTACCAC
-TGACATGACTTTCCAAAAAGCACATAATTTGAATCAACACAACCACCCACAGCCTAATTA
-TTAGCATCATCCCCCTACTATTTTTTAACCAAATCAACAACAACCTATTTAGCTGTTCCC
-CAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTACCTGACTCCTAC
-CCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGCGAACCACTATCACGAAAAAAAC
-TCTACCTCTCTATACTAATCTCCCTACAAATCTCCTTAATTATAACATTCACAGCCACAG
-AACTAATCATATTTTATATCTTCTTCGAAACCACACTTATCCCCACCTTGGCTATCATCA
-CCCGATGAGGCAACCAGCCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCC
-TAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCAC
-TAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACT
-TAATATGACTAGCTTACACAATAGCTTTTATAGTAAAGATACCTCTTTACGGACTCCACT
-TATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAG
-TACTCTTAAAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGA
-CAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATAACAAGCT
-CCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACA
-TAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCA
-TTCTCATAATCGCCCACGGACTCACATCCTCATTACTATTCTGCCTAGCAAACTCAAACT
-ACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCAC
-TAATAGCTTTTTGATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTA
-ACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCC
-TACTTACAGGACTCAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAA
-CACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAA
-ACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCA
-TTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAACATCAGATTGTGAATCTGACA
-ACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCC
-CCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATTGGTCTTA
-GGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCACACTACTATAAC
-CACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTTAACCCTAACAA
-AAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCT
-CTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTG
-AGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACTACTTCTCCATAAT
-ATTCATCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATAT
-AAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATTTTCCTAATTACCAT
-ACTAATCTTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGG
-AATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGC
-CATTCAAGCAGTCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCTTAGCATG
-ATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCC
-AAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGG
-TCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCA
-CTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGA
-AAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGC
-AGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAG
-TCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCA
-CATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCA
-CAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCT
-CACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGG
-TTTCTACTCCAAAGACCACATCATCGAAACCGCAAACATATCATACACAAACGCCTGAGC
-CCTATCTATTACTCTCATCGCTACCTCCCTGACAAGCGCCTATAGCACTCGAATAATTCT
-TCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACATTAACGAAAATAACCC
-CACCCTACTAAACCCCATTAAACGCCTGGCAGCCGGAAGCCTATTCGCAGGATTTCTCAT
-TACTAACAACATTTCCCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACT
-CACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTAAC
-CAACAAACTTAAAATAAAATCCCCACTATGCACATTTTATTTCTCCAACATACTCGGATT
-CTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCT
-GCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACA
-GCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTT
-CCTCTCTTTCTTCTTCCCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCC
-GAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACCACTACTA
-ATCAACGCCCATAATCATACAAAGCCCCCGCACCAATAGGATCCTCCCGAATCAACCCTG
-ACCCCTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCA
-CCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAA
-CACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCCATCG
-CTGTAGTATATCCAAAGACAACCATCATTCCCCCTAAATAAATTAAAAAAACTATTAAAC
-CCATATAACCTCCCCCAAAATTCAGAATAATAACACACCCGACCACACCGCTAACAATCA
-GTACTAAACCCCCATAAATAGGAGAAGGCTTAGAAGAAAACCCCACAAACCCCATTACTA
-AACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGA
-CCAATGATATGAAAAACCATCGTTGTATTTCAACTACAAGAACACCAATGACCCCAATAC
-GCAAAATTAACCCCCTAATAAAATTAATTAACCACTCATTCATCGACCTCCCCACCCCAT
-CCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAA
-TCACCACAGGACTATTCCTAGCCATACACTACTCACCAGACGCCTCAACCGCCTTTTCAT
-CAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCA
-ATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACG
-GATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAG
-CAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAG
-TAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCT
-GAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCT
-TACCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACGGGAT
-CAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACA
-CAATCAAAGACGCCCTCGGCTTACTTCTCTTCCTTCTCTCCTTAATGACATTAACACTAT
-TCTCACCAGACCTCCTAGGCGACCCAGACAATTATACCCTAGCCAACCCCTTAAACACCC
-CTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGATCCGTCC
-CTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCC
-CCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTT
-ATTGACTCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCT
-ACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCC
-TAATACCAACTATCTCCCTAATTGAAAACAAAATACTCAAATGGGCCTGTCCTTGTAGTA
-TAAACTAATACACCAGTCTTGTAAACCGGAGACGAAAACCTTTTTCCAAGGACAAATCAG
-AGAAAAAGTCTTTAACTCCACCATTAGCACCCAAAGCTAAGATTCTAATTTAAACTATTC
-TCTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAAC
-AACCGCTATGTATTTCGTACATTACTGCCAGCCACCATGAATATTGTACGGTACCATAAA
-TACTTGACCACCTGTAGTACATAAAAACCCAACCCACATCAAACCCCCCCCCCCCATGCT
-TACAAGCAAGTACAGCAATCAACCTTCAACTATCACACATCAACTGCAACTCCAAAGCCA
-CCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAA
-GTCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCC
-CCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTG
-CTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGAC
-ATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATAAG
-ACATCACGATG
->chr20
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNGATCCAgaggtggaagaggaaggaagcttggaaccctata
-gagttgctgagtgccaggaccagatcctggccctaaacaggtggtaaggaaggagagagt
-gaaggaactgccaggtgacacactcccaccatggacctctgggatcctagctttaagaga
-tcccatcacccacatgaacgtttgaattgacagggggagctgcctggagagtaggcagat
-gcagagctcaagcctgtgcagagcccaggttttgtgagtgggacagttgcagcaaaacac
-aaccataggtgcccatccaccaaggcaggctctccatcttgctcagagtggctctagccc
-ttgctgactgctgggcagggagagagcagagctaacttcctcatgggacctgggtgtgtc
-tgatctgtgcacaccactatccaaccgatcccgaggctccaccctggccactcttgtgtg
-cacacagcacagcctctactgctacacctgagtactttgccagtggcctggaagcacttt
-gtcccccctggcacaaatggtgctggaccacgaggggccagagaacaaagccttgggcgt
-ggtcccaactcccaaatgtttgaacacacaagttggaatattgggctgagatctgtggcc
-agggcctgagtaggggagaagctcccactctcagaacactgagaaaagtgaggcatgggt
-ttctgggctggtacaggagctcgatgtgcttctctctacaagactggtgagggaaaggtg
-taacctgtttgtcagccacaacatcttcctaagggagccttgtgtccgggaaaaactgac
-agaccagtgatctgggtgcagaaggcttgagacaaaactagctggttgggccagctatgg
-ggcaaatgctggaaagaaacctggtcagggagcctgagctgagtggtccccacagtcatc
-tgcttggcaagaaaccctaggtcgcaggtgctagaccagctgcacacccacagcaacact
-gccatgcccaggatcctctgcccttgatcctgaatcaacagaccacttgcagatatactt
-cacagcccacgctgactctgccaagcacagacaaccactgggccccaggggagctgcagg
-tctcctggtcacctaatcttttttttttttatactttaagttttggggtacatgtgcaca
-acgtgcaggttacatatgtatacatgtgccatgttcatgtgctgcacccattaactcgtc
-atttaacattaggtatatctcctaatgctatccctcccccctccccccaccccacaacag
-gccctggtgccatggaatactatgcagccataaaaaatgatgagttcatgccctttgcag
-ggacatggatgaagctggaaaccatcattctcagcaaactatcaaactatcacaaggaca
-aaaaaccaaacactgcatgttttcactcataggtgggaattgaataatgagaacacatgg
-acacaggaaggggaacatcacacatcgggacctaatcttaagctaagtgtggctaagagc
-ctatctgctggcctttactattaagcactgcccactggattgcagcctgaattacaccgc
-caaacaaatactgtttcagcatacattaccagtgaaacccaatgcaggaacatagtcaaa
-aataaacacctggcatagagacttggccctctgaaaacacccagaaaaaagccagctata
-ttcaacatacatcactgtcaaaatatcaaggaaaatgaagaagaataaaacaaaaagtca
-aaaccaaatgataggaacttcaaaaagataaagtaacaccagctgtcttagatgagaaag
-aatcagcacacattcttgcaattcaaaaagtcagaatgtctccttacctccaaacaatca
-tactagctctcatcagattgaaatggctgaaatgacagacatagaattcatgatctggaa
-ggtaaggaagctcaagaacattcaggagaaagttgaaacccagtccaaggaagccagtaa
-agcaatccaagagtacagagataacatagccattttaagaaagaaccaaaagaaacttct
-gcaattgacaaattcattataggaattttgtaatacattcagaagcattaacaacagaat
-agatcaagttgaggaaagaatctcagagctcaaagatcagtcctttgaatcaacacagtc
-agacaaaactaaagaaaaaaatttaaaaataaaacctctaaaaaaatatggaattatgta
-aagataccaaacttacaacttatgggcattcctgaaagaggagaaagaataagtaacttg
-gaaaacatatttgaggatagtccatgaaaatttccccaatctccctagagaggctgacat
-gcaaattcaagaaatgcaaataacccctgtgagataactacaagataactatccccaaga
-cacatagtcataagattctccaaggtcaacgtgaaagaaaaaaatcttaagggcagctag
-agaaaagcctgaggtcacttatgaagggaagctcatcagactaacagcagacttctcagc
-agaaaccttacaaaccaagcaagattaggggcctatttttagcatccttaaagaaaagaa
-atttcagtgaagaattccatatcctgcaaaactaagcttcataaaagaaggagaaatagg
-ctgggcatggtggctcacacctgtaataccagcattttgggaggctcaggcaggaggatt
-gcttgagctcaagagtttgagaccagcctgggcaacatggcaaaaccctgtctcttctaa
-aaatacaaaaattacctgggcAAGACTCCATCACAAACAAACTAACAAACCAAAActatc
-aggtactatgctcactacctgggtgacaaaatcatttttacaccaaacccagtgacaagc
-aatttacccatgtaacaaacctgcatgtgtatcccctgaacctaaaataaaagttaaaaa
-aaaaagaaCTTTCATCAACatttcttgcagtgaaggtatgttagtgatgaacattctctg
-cttttattgcctgaaaatatctttattttgtattcatatttgacatatattctcactggg
-cataaaaattctaaattacaagtttttccccttttttgtattaaaaatttcattccaata
-tcttTCATATTGCCTTATTTGTAATGATGCCTTCTATCCTTCTTATCTTTGTTCCATTTA
-TAAGAAGTGTTCCCCAACCCCAGACTGATTAAAACCATTTTTTTAATTAAAAAAGCAAAA
-GAAAGAAACATTTTTATCTGAAGCTGTCTCAGACTCAGACACCACCCAATCTTCAGATTT
-CAAATAGCTTATACTCAAACATTTGGTAATATCAGCCCCTTAATGGTCTTCCTGGAGGGC
-AGATGCATTCTAGAGATGAGAACACGATCATGATTACGAATGCTACCACCACTACGAACG
-CACAAAAGTCACTGGTGTGATCCTTTCTCAGAACACTGTGGTAACTTCTGGACATTCTCT
-GCTGTTATCATTGCTTCTTCCTTCTGGGTTTTTTTCCCCCTTATATGGGCAGATAATTTT
-CTCCATTGGAATGAAAAAGTCTTGCTTCATGCTCTTtaactgtgtgaccttgggcgtatt
-actttactttggggcaaaccattttccttcttgaggaccaaatgtgctcttttataaaac
-gagcagttagaattagattgtctctctggacacggcttatgttgacaacctggatcacAT
-TAGAGGATCAcactgagacctttatgtcggcctcagttcctccatctgtaaagtagaggt
-tgggcttagattatAGATGATAAAGACACCAACTTTCctggaaaggattctggaaaggat
-tctgAACTTAGGCTCAGCCTCAGTAAGAAGGAGTTCTGTGATTAAACAGGGATGCCCACA
-CATCAGCAACAGAAATGGGCAGGTCAACCATGTATGCTGTGCCTCAGTGAAGATTTTATG
-CTATGCTGTGCATTTGATATCCATTCTCTATATTTGATATCCAATCTAAGATTATCTAGA
-AGGTCCTTTCCAAGACACTGATGAGATACATCTGTATAAATATATAACTCAGGATGAAAG
-CAACTTTTAACATTTAGCGTGTGCCTCTGCCTCTGATCTGATTACAGCCCACAGAGAAAT
-ATAAACAATACACAATACAGGCTAATGAAGAAGGGTGATAAGAtttttttttttttttga
-gacggaatttcactcttgtcacccaggctggagtgcaatggtgcaatcttggctcactgc
-aaccttcgcctcccggttcaagcgattctcctgcctcagcctcctgagtagatgggattg
-gaggtgcccaccaccacgcccggctaatttttgtattttttagtagagacagggtttcac
-catgttgtccacgctggtctcgaactcctgacctcaggtgatccgccagcctcagcctcc
-caaagtgctaggattacaggtgtgagccactgcaaccggccAAGGGTGATAAGattttaa
-aaatttatttaaaataCAGAAATTTCAAAAAGAGAGAAGTGCAGTGATAGCAAAATTGAT
-GCAAACTGTGCAAGCATGAAATCTATTTTATAGCTGAATCTACTTTTCTTGGTCCCAAGA
-TTCTATTTCCATTGGTTTTCAAATAGTTAATTCTATTGTTTTTTCAGGGAGATTACTAAA
-ATCACTAATAATTATTTTCCTACTGACACAAAATCTAAAAAGCACCATATAGACCTTCTC
-TCTCCATCTCCCCTTATCCTTATGTCACCTTACCCTACCCCAATACTCCAATGGCAGAGT
-ATCTACCCATGGCAGAGTAGAGAATATGTACACTAACAAAACCAGATGCACAGAGGTGGG
-GTATCCATCTCTGACTTGGCTGAGCTAGTCTAAGGAAGGAAGGCTCTGTGGCCATTGTCC
-TTGGAAGTCATTCTCACAGGTTGGTGGTATTCTCAAGTAGGTGGTGCTTGAGTGGCCCAA
-GAGCACCCACATGCTGCTATGCATTTTTCTGACAACCTCTTTATGATCTCTGACTTTGGC
-AGATCATCTTGCATCTCTCAATTGGAGAGTCACTTTTCTTATCTCCACAGAAAATTCTTA
-ATCAAGCTCCTGGTTTTCCTTTATAGCTTCTACTTTTTAAACTCACTTCTCCAACTTCAC
-CGCTACATCTCTGACAGATGAGAACATTAGAGATTCCCTGTTTTTCAAAAACAAAACAAA
-ACTCAGCAAAACTATAAATATACTAAGGGTAAGTCTGTATTATCTCCTGCCAAAATACAC
-CACCCTGCATTTTTTTAAATttttatcttttgtaggtacatagtaggtgtctatatttgt
-ggggtacatgagatgttttgatacaagcatgcaatgcataataaccacatcatggaaaat
-ggggtatccatcccctcaagcatttatcctttgtgttacaaattatctaattatacttta
-ttattttaaaatgtacaattaaattatttttgactatagtcacctcgttatgctattaaa
-taccaggtcttattcattctttctaactattttttgtacccagtaaccatcctcaccttc
-ccacacacgcccaccacctttcccagcctctgataaccatccttctactctctatctccc
-ttgaattcagtagttttgatttttagatttcacaaataagtgagaacatgcaatatttgt
-ctttatgttcctggcttatttcacttagcataatggcctccagttccatccatgttattg
-caaatgacagcatctctttcttttttatggctgaataatactccactgtgtataagttcc
-acattttctttatccactcatttgttgattgacacttacgttgcttctaaatcttggcta
-ttgtgaatagtgctgcaacaagcacaggtgtgcagatatctattcaatattcttatttcc
-ttttggaggggagtgtgtacctagcagtgggattgctggattgtatggtaactctatttt
-cagtttttttaggaacctccaaactgttctccatagtggttgtactatcttacgttcaca
-ccagtagcatacaagggtttccctttctccaaatccttgccagcatttgctattgcctgt
-cttttggataaaagccattttaactggagtgagatgatattccattgtagcttgattttc
-atttctctgatgatcagtgattttgagcaccttttcatctgcctgtttgccatttgtatg
-tcttcttttgagaatatctattcagatactttgcccatttttaagttggatcattagatt
-tttttcctatagaattgtttgagctctttgtatttcctgttattaatcccttgtcagaag
-ggtcgtttgcaaatattttctcccattctgtgggttgtcttttcactttgttgattgtgt
-gctttgctgtgcagaagctttttaacttgatgtgatcccatttgtccatttttgcttcga
-ttgcctttgtttgtgggttgctactcaagaaatttttgtccaaacatcctggagagattc
-cccagtttcttatagtagtttcatagtttgagatcttagctttaagtctttaatccattt
-gacttaatgttttgtatatggtgaaagacaggggtctagtttcattattctgcatatgga
-tatccagttttcccagcaccattttttaaagagactgtttttcccccaaagtatgttctt
-ggcaactttgtcaaaaatgagtttactgtagatgtgtggacttgtttctgtgttctctat
-tcttttccattgctctatgtgtctgtttttatactagtaccatgctgttttggttactat
-agctttgtagtataatttgaagtgaggtaatgtgattcctctagttttgttctttttgct
-taggatggctttggccatcctgcatttttAAcccttttcccattttcacccagaatactc
-gctggtggcacttgcagctgcagggtttaccctgagataactttgccacaaaatatctcg
-cctttattattattttcacatcgttctaatatatcgactttgaaaacacaaatcatcatt
-ctatttatagcatcttgttgttagcagtggtatttccatttacaaaatatagaaattctt
-gatcgctgaaaatgtcaaattctagaaagcatagcattcccatgttaacattgttctcaa
-acagttttgggccaaagagtcatttaatgaatccggttttttccaaaatagatgattctg
-attattcagatgattctgatgttagttctgtttaaaaataattccaagaacagtttgtat
-attttattttcacactgaacatcagtcagcctccagagcatgttaatgtaaaattaaatg
-aacatgggcagtgagctgcagttttttttctaaacagTGCAGCTGTTTAGAAAATTTTTT
-TAAAATTTTCCTGATTTCCTTGGTATTAAACATATGTGGGAGAAATACAGCTCAGCAAAC
-TCTTCCAGGAGATAAAATGCTGATCACTCCTACTGGGCAATTTCACAAATGTCTCCTATA
-TTTTTCTCCTTTGGTAGTGGGGATGGGGGGCATAATGTTACATTGGGCctctctcctctc
-tctctttctctctccctctcCTTTTAAAATGTTTCCTCTCTCTCAATATTTCATTTCTTA
-TTTGTATTTCTGAATGAGGGAAAAGAGTTGATGGGACAGCGGAACGGGAAAAAGAAGAGC
-ACCAATAAAACCTGTTTTCCTGTTTTCACTATTTTCATTCCAAATTCCTTCTGTCTCATA
-ATTGATGGAATCTTATGAACTTATTAGTTAAAAAGTGTCTTTCTTGTTTCACAGGAATTC
-ATATCGGGGTGATCACTCAGAAGAAAAGGTGAATACCGGATGTTGTAAGCTATTGAACTG
-CCACAAGTGATATCTTTACACACCATTCTGCTGTCATTGGGTATGTACAAAGTGCTGCAT
-ACAGACAGAGGAGAAGGACAATTGAGCCCATCTAAAGTTAACAAAAACTTCCTCTTGGGG
-CTGTTTCTTTCCATCAGACCTTACAGTTCTACGGGATAATAGCTTATCTCATAAGGCCTC
-AGCTTTCTTTAATAATTTCTAGAAGCAGACGTTATTGTGTCATGCACACTCAGTGTTGCA
-AATTAATGGTCTGGTGATCTGGGTGGCATGGCATTTTCCCCTTCTCTGGTTCATCACCCA
-TGATAGACCAGTAAAGGTGACCACTTAAATTCCTTGCTGTGCAGTGTTCTGTATTCCTCA
-GGACACAGAGCTTCCTCTCTCCCAGGAGCCATGAATATCCTGATGCTGACCTTCATTATC
-TGTGGGTTGCTAACTCGGGTGACCAAAGGTAATGGAACCCTATAAAGCAGAGATGATGAC
-TAGGATGAGTTGTTGCCCTTGGGCTCCCCTGGTATCATGATGGGAAGAGAGGGAATCTGC
-AGGAAAAATCTGGGCCAACAAAGAGCAGCAGAATGCTCTTATTTTGGCAGCTCCATGCCC
-CTAGTCTCTGAGAATCTTTCTGTTAGGGGCATCTAGCAAGCTGGGATGTCCTCTGAGGCA
-TTTCTCCAAAGACAAGAATTTCCTTAATGCTCTGAGCCACCCTATCTGTCTCTCTACATA
-ACTATCCAATGTTAGTTCAGCCTCACTTCACTTCCATTTCGATTATTCTGTTGTATCTAT
-TTCATTGTTGTGTCCTATTAGTTCTCCTACCATCTTGAATTCTTCTTTGCCCGGAGGGTA
-CCTTCAGAGGGAGGCCCTCACTTTCATGTTCTTAGATATGGTGAACAAGTCCATTGACAG
-TTTGTAGATTCTGTAGCACTATCATATGGAAGAGACAATATATATGTTTGGGGTAGAAGT
-GGAAATAAGTGGAGTGAAGACAGGATAGACAGACTAGTGACCAATGGGGAGCTTCTAATT
-TTAGATGAATAGGAACAGTCTGTTTCCACTATTTAATAATGCTACTTTTGAAAATTGTTA
-ACTTTTTATTAAAAAATAATACTTGCAATTGACTTATGTATCAAGCAATCGATGGATTTA
-TAGGGTTTAAGGAAAAGAAAAATGTTTGTCTGTCCAAGAATACCAGTTCTTCAGTCTTCC
-CCTTCAGAATCAATCAATGTTACCAATTTCTTATATATCCTAGCAAATACAAATATATTT
-ATATTTGCATGTGTATACCTTTTAGATTTTTAAAAAATGCAATTGCAAATGCACCATGTG
-AATTGTTCTGCAATGTACTAGCAATATATTAGAGACATCTTATCCATACATAAACCTAGT
-TCATTATTTTTAATCGATAAGTAAAACTTTGAGGAGGAGCAGATGAATTGCCTCACATTA
-ATTACTCCGCTACTGATGAAAAATAGGTCTTTAATTATCAAAAACAATTCAGCAAGAAAA
-ATTTGTAAACAAATGTATGTCTTTTCATTTATGACTGGACACGTGGacacacacacacac
-acacacacacacacagtcaaaccacctaccagaaaagctgaactattcttctctcctatc
-accagttgcaagagtgtcagcttcccacaccctcatcagtcctttttgttttttctacta
-cattcagttttctactacattcagttttacagtctaatatgtgaaaatgatgtcctgatg
-tttgaattcatgacactttagttataaatgagtttgaacatccagtccattagatttcta
-aactttcttAATTATCTTTATATACTAAGAAATTTGGCTTTTGTTAAATTTGGAGGTGTT
-ATATGTTGCCTAGAAAGATGCTATTCATGTCTATTAAATGGTTATAACTGTGCCTATGAT
-CTGTTATGTCTTGATTCACATGTTGATGTAATGTGAGTTACAGAATTAATATCTACATTC
-ATTTCTGATTATAAACTGCTGTATTTGTTGAAAATTTGGAAATTTTGAAATTGTAAAGAA
-GTAAAAAAATTGTAAAGAAGTTAAAAGAGACAAAATATTTTTGATCTATTGTTCTTCCTC
-AGTTTTCTTATTTGAATAAAAATGTATAGCATACTTATAAATTTTCTATTATACTATTAG
-TATTTTCCCATTTACTATTTTCAAAAACTGTATTTCCAATGACTGTATAAATTTTATAGA
-ATGGATACTGTTTAAATTACTTAGCCAAATTGTTTTTGCATAAATAAGTGCATTTACATT
-TTATAGACAAGGATGGCTAGTATAACCTTTCTTATACATAAATCATTCAGCATAAAATTC
-CTGGAGATGTACTTTTTTCTGTCTGCTTCATGTGTTATCAATTTTTGAATACTTGCCAAG
-TCCtaaaaatgaaatattatatataaatatttaatttttatttatGTCTGTGAGTAATGG
-GGAAGTCGAACTTCAAATACATGCTTAATGTATATTTAACTTTTCTACAAATTGTCTATG
-TCTCTCTTTCTCTTTTATTTTGGAGAGGTAGTTTTCATTTCTTTTGATTTAGAGATTTTC
-ATTTTTGTGTTCTCTTATAGGTTTTGTTTTGAAATTTAGCTATTTAGTCTCTCTGGGCTT
-TATATTATGTGTTTTCAAGTGAGATAGCACCTGATGGCTTGTGAAGCAACTTTTTACCAA
-GCCAAGCTATCAGTGGACTGGTATCCATAGATATATtttaagttgatgctagctgattat
-atatctggtatgttttagaaagaactccacacatgggataatgttttggctagatggctc
-cCCTACTTAGAAACATACAATTGCTAGTCATATTTCTAATTTTAGGATTTCGAGATACTG
-GTGATGAAGATCACATGTCCTAACAACATAATAGTTCCAGACTGAAGTTCTTTGAAAAAA
-ATGACTGTTGTCACTTTAGAAAAAAAAAATTATGAATTATTCCcaattgccatcattcta
-ctgctaaaaccaaattcttggaattatctatgatttttctatatcctatgacactcatat
-ctatcaggaagtctattacatctgcctgcaaattatatccagaatgcaattattctcgcc
-acctccattgctgccactctgattctagtcaccatcatctctcacctgtgttattgccat
-agcttcctcatgagatctgtccttctgctcttccctgccaccatcttgtgaagacacata
-gtgcatgatccgcttacactggaagtcagatcatgtacttttgctcaaaactctgctatg
-gccccctctatactcagagcggtaacaagagtccatacagtggctcacctggccctgcag
-gatctggcccttatgacctctctcacctcatctcctactattatagtccttgttcactcc
-actacagccacacaagccccagtgctcttccccaaacatatcagacttactcaacccata
-gagctttgtttgtttcctctgcctagaatgtacttgcctcagatactggtgtgactaatt
-cctttacctccttcaagctgtttaatcatcaccttgttacacaggcttgtgcaactcctg
-tttatgaatcttctattacccttaaatctattctcccttctttctgcaaaccatttgtca
-ccttttcatctacaaaataatgtacttttttattAAGGTAAAATATACATTTAAAAATTA
-CCATCCTTACCATGTTTTTACCATatttttatgtatacctgatggctgtttgtatgtctt
-ctgttgagaaatgtctattcaaatcttttgcctgttttaaaatcagattatttgtttttg
-tttgctatggagttttttgagctccttatattaatatactttttgttgttaattcctcgt
-cagatggatagcttgcaaatattttctcctactctgtgggctacatcttcactttgttga
-ttatttcctttgctgtgcacaagctttttagtttgatgtaatcctaattgcctatttttg
-ctttggttgcccgtgcttttgaggtcttacccaagaaatctttgccaagaccaacgtcct
-gaagtgtttccctaatgtttttttcaggtagttccatagtttcaggtcttagatttaagt
-ctgtaaAACCATACAGTCTAGCAGGGAGTGCatttactttttattatctgtctccctctg
-ctagaaagtcagctccatgtgatttttgtctgtttagttcacagatgtacctcaagggcc
-caggatagtgcctgtgccatagtaggggcccaaaactttgatgactgtgtgaCTATAGCC
-TAATTTAAGAATGGAGGGGATAATTTAAAAGCAGTAGGAAGGAATGTAAGTGAGAAACAA
-TTTTGAAGAATAATTGACAGAACAAGGCGATTCAAAGACAAAGGAGAAGAAGAGAGCCAA
-GATGACATATTTCAAGTATGGATAATGCTGGAGGAAAAAAATTAAGATATAAATCTTTGT
-AGATGTGAGGAACGAAGAAGCAAGGTTAGAGTCTGTCTTGCACAAAAGAAGTGGAAGGTC
-TAGACTTGAAACTTATAGAAAATTCCACGAAGTACAAAGTAAAATCGAGCCAGTAAAATA
-ACAAAGATAGAATAAATGACTCTAGAGGAGTGAAGGTAGAATAAATAATTGGTGAAGCTG
-GACTAGAGCCAACATTTCCCAGAGGATAAAATATAAACCAAATTATTGTGAGCCTAatat
-atacatacatacatacatctatatatgttttatatatatTATCACATTAAGTTCAAATAA
-GGTTGTTTAGAAAATTActtgctcttctgcacatataccaggcttcctcctccatagagc
-cttatctctagctgcttcctctgcctagaatacacttATCTAGGTACTCCTTGGGCAATT
-GTCTTGAGAAAGATGATCATGCCGTTTACTgcttgataaatgaacatacaatgcagcaca
-ctagtttccctttagatttatatcctcacccctcaaatgagtagtcacactgcttggaaa
-tcctactgcatttctcttgtaaatgaaccttccttcttttttttttttttttgagacaga
-gtctttctctgtcaccaggctggactgcagtggcccaatctcggctcattgcaaccgcca
-actccctggttcaagtgattctcctgcctcagcctcccgagtagctgggatcacaggcat
-gtgccaccacatccagctaatttttatatttttagtagagacaggttttcaccaggttgg
-ccaggatggtctcgatctcctgaccctgtgatccaccctcctcggcttcccaaagtgctg
-ggattacaggtttgtaccaccacacccagccatcttccctcttttttagacaactatttt
-gtcctgacctttatttgtcttttattttcctgctcctctcctctacatggctctccccct
-cagtttatcccatgccccatttatttaaacaattcaaataggaagttttcactcatttcc
-tctgtcccctttgccataaatggagaaacgtgtcttctccatctaaagatcagtctgctc
-tgtgtgaatttgtgactatgcccttctgtcatctcatcaccctattctatattaatctct
-ccttttctgcttttttttttttttttttgagatggagtcttgctcttgttgcccaggctg
-gaatgcagtggcacaatcttggcttactgcaaccttcgcctcccaggttcaagtgattct
-cctgcctcagcatcctgagtagctgggactacaggtgctcgccaccatgcccagctaatt
-tttgtattttttagtagagacagggtttcaccatggccaggctggtctcgaactcctgaa
-ctcaggtgatctgcccgcctcgatctcccaaagtgctgggattacatgtgtgagccactg
-cgcccagactgcttgtctcttttctcattgcttgcaagcaccatttggtatttctcgttc
-ttcaaaacaaacctgaaagctttcccttaaccttacattgctctctaacaagttatttat
-ttctctgcttttctttggatctaaacttcttaagagtttcatctacaggtcctgcattca
-cttctctctcattcacattttgaccaactgcaatttggtttcttttttcataccactcgg
-aagctgctctcctcagtatgaagttaccttcatactactaaaagcatggacattttcctg
-ccttcatcatttttttttaacctctcagcagtatttgactacaaaatgaccactctgtcc
-tttaagaaacagtctcctctcctgCTTAATGTAGTCACATCTGATACAACTTTCCCCATA
-ACCTTTTATGCATTTTCTGTTTTCATGCATATCAGCCCAACTTGCAATTGTCAGTATCTC
-CAGTCTTTCAACAACTGCTTGTGAAATACCCCTGTACAGGGCAATCCAGAAATGCCAGAA
-AATTATCAGCTGTCTCTGGATCATCTGTCAACTATGGGGGAAGCTGGATAAATAGTCCAG
-GTCCTTTGAGCCTCATGTAGAATAACTTTGAGGCTTGGTAATATTTTTTTTTTCCTGTGG
-TAATTCCCTTATTTGCAGTTCAAGGCTATTATGGGAAGAAAACATAAATGGATGTTAGTT
-CTTCAAGGTTTTTACTGTAACTGTGCACCCTTTCATTCTTCAAGGTTTTTCTGTAACACT
-GCACCTTCAGGACCTGATGCCCAATTAAACATTTTTTTAAGTTTTTTGGTTTTTTTTTAA
-TAAAAACTAAATGCTATTTTTTCttctacttttagttgatgtgtaataattgttcatatt
-tagaagatgcagagtgatattttgatacatgtatacaatgtgtaatgatcaaatcagggt
-aattagcatatctatcacctcaaacatttgtcatttttttatattgggaacattcagaat
-cgtctcttctagctatttgaaaatatacagtaaatgattgttaactaccgtcaccctaca
-gtgctatagaacagtggaccccttttggcaccagggaccagttttgtggaagacagtttt
-ttcgacgaggtgaaggtggtggtggggatggtttcaggatgaaactgttccacctcaggt
-catcaggcattagagtctcacaaggaacacacatcctagatccctcacatgcacagttca
-caatagggttcatgctcctatgagactctaatgccttggctgatctgacaagagatggag
-ctcaggtggtgatgcttgcacacctgctgttcaccttttgctgtgcagcctggttcctaa
-caggccatggaccagtacccattggctgcccaggggttggggacccctgctataggatgc
-tggaactttttcctcctatctaggtgtaattttctatctgttaaccaacctctctctatc
-ctcctttcccttcccagcctctagtaatcattattctacagtctacttctatgaactcaa
-cttttttagctcctgcttatgaatgaaaacatgtggtatttatctttttgtgtctatttc
-acataacggaatgtaacatgtcccccaggctcatccatgAGTCTGAGGCTTATTTGTAGC
-CTGGCTGCTGGGCTTCCCTGTGGGATTGTCCTCTGAGCAAACAGAACACAGCCATCCTGC
-TGGCCAGCAGTTGATAGATGATCTCATGATAATAACAGGTTATAACTCACCTTTTCTTGG
-ATTTCTTGCTTTCCTGATTTCTACATTTCTCCACTGATTTTTTTTAAGGAGGAATTGTCT
-CTCAACTAAACTATTATATTCAAATCTTTGCTGGAGCTCTGCTCTGCTGGGGGTCTGCTT
-TAAGACTCTAGAGTCTTattctcctgttttgatctgacttatcttattggtccttttaag
-tcgtttcctcttatctgatctcttatctcttaatattgaaactcactagaatttaattct
-agtcctctttttttctcatattattccaacccaccatggtttaccaatttctgtacttta
-aatgctatccataagcaatcacatttattgatttgcatatgtcgaaccaaccttgcattc
-caaggataaaggctacttgatcgtagtggataagctttttgatgtgctgctggattcagt
-ttgctactattttgttcaggatttttgcactgatgttcatcaaggatactggcctgaaat
-tttttttttcttgtgtctctgctaggttttggtctcaggatgatgctggcctcatagaat
-aagttaaagcggagtcctgccttctcaattttgggtgaatagtttcagtaggaatgatac
-cagctcttctttgtatatctggtagaattcagctgtgaatccatctggtcctgggctttt
-CATTTTCATCCTTTCTTTCTAGGTTTCGTATCAGTCTCAGTATGctctctctctctccgt
-ccctctctttttctacatttctccttttctcCATACAACTTCTTTGATGGCACATAGCAC
-AATTTTAATATACACTTTTTGTTCTCCTGTTTGTCTCTTACAATGGCTTTTTGTATTTGA
-CATCATATTAGTCTAGATGTCAGTCAGTGTAAATTTTTGAATGAATGAAAAGTTGTTATG
-TTGATGCCAGAGTTAAAAATTTGACCTATATTTTATTCTCTACAGGTAGCTTTGAACCCC
-AAAAATGTTGGAAGAATAATGTAGGACATTGCAGAAGACGATGTTTAGATACTGAAAGGT
-ACATACTTCTTTGTAGGAACAAGCTATCATGCTGCATTTCTATAATATCACATGAATATA
-CTCGACGACCAGCATTTCCTGTGATTCACCTAGAGGATATAACATTGGATTATAGTGATG
-TGGACTCTTTTACTGGTTCCCCAGTATCTATGTTGAATGATCTGATAACATTTGACACAA
-CTAAATTTGGAGAAACCATGACACCTGAGACCAATACTCCTGAGACTACTATGCCACCAT
-CTGAGGCCACTACTCCCGAGACTACTATGCCACCATCTGAGACTGCTACTTCCGAGACTA
-TGCCACCACCTTCTCAGACAGCTCTTACTCATAATTAATTAACATTTACTTCTGGTATGG
-AACAACTAGAAATACTGCTGGAAATAATATCCAAAGAGCTGATTCTACCAATCCAATTTC
-ACCAGGAAAATTCCATCAGGGATTGGATGACCATGGGGATGGACATAATTGCTACTACCA
-ACACAACAGCCAAGAGAGTTGCCTTACAATTAGAAATGTGTAGACAGAAATGTATAGAAG
-ATACAAGGATTCTCTTAATTGGACTTAAATTCTTTATCTGTCTTCCTCCGATGTACTCAA
-ATATATGAGCTAATTTTTGTCTTAAGTGAACATTTGTATATCTATGTATTTTTCCATGCC
-AAAAACAAAAACGAAGACCATTGTTTGGAGCTGCCTCTTATGACTAAGACAAGAATTTTT
-ACTTTAACAGTGCCTGGCCCACTACTATCGTATATAGGAGAACATATAAAAGCATATAGA
-AAGTTCCAGATGAATGTTCCCTTCTCTACCCTCCACCTTTTATTGTAAGTTCTGACCCTA
-AATACTTTTCTGTGTCATGACGTCAAATTTTGTTTAAGGTTCTAGCTGGTAACTAACAGA
-GTCAGAAGCTAATTCTTTCATTCAACACAAGCACTGATCTAACTGGATAGAGATAAAAGT
-GGGACTTGCCTTGAGAGTACATCATATTAAATTAAAAGCTGCATCTCAAATTCTACTTAT
-CTTTCCAATCTTCTTTCCACTTAGAATTCCAACTTCCAAGTATGGCAGCCTCATAACATG
-CCTCTTCAGGTCTCTGTGTTGTCCATGAATGTTAGTTGTGTGCAGTGTTTCTATGCTTTG
-TATGGCTGTACGCATGTGACTGCTGTTTGTATGGCAACAGGTGGGTCAGTAAGTGTCTTC
-TATGATACTACAGAGAAGCGGTTATTAACTATAAAGTTGATTAGGttttttttttttttt
-gagacagagtctagctctgtcgcccaagctggagtgcagtggcatgatctcggctcactg
-caagctctgcctcctgggttaacgccattctcctgcctcaggctcccgagtaactgggac
-tacaggcacccactaccacacctggctaattttttgtatttttagtagagaggggtttca
-ccatgttagccaggatggtctcgatctcctaacctcatgatccatccgccttggcctccc
-aaaatgctgggattacaggtgtgagctactgtgcccggctGATTAttattttttttaagt
-tccaggatagaagtgtagaacatgtaggtttgttacataggtatacatgtgccatgatgg
-tttgctgcacctatcaacgcatcatctaggttttaagtcccgcatgcattagctatttgt
-cttaatgctctgcctccccttccccacacaccctgactggcccccatgtgtcacgttccc
-ctccctgtgtccatgtgttcttattgttcaattcccacttatgagtgagaacacgtggtg
-tttggttttctgttcctgtgttagtttactgaagatgatggcttcgagcttcatccatgt
-ccctgcaaagagcatgatctcattcctttttatggctgcatagtattccatggtgtatat
-gtaccacattttctttatgcagtctatcattgatgggcatttgggttggttccatgtctt
-tgctattgtaaatagtgctgcagtaaacatacgtgtgcatgtgtctttataatagaatga
-tttatattcctttggatatatacccagtaatgggattgctgggtcaaatggtatttctgg
-ttctacatccttgaggaatcgccacactgtcttccacaatggttgaactaatttacattc
-ccaccaacagtgtaaaagtattcttatttctccacagccttgccagcatctattgtttct
-tgactttttaataattgccattctgactggcatgagatagtatctcattgtggttttgat
-ttgcatttctctaatgatcagtgatgttgagcttcctttcatacgtttgttggctgcata
-aatgtcttcttttgagaagtgtctgttcatatcctttgcccactttttgatgtttttttt
-ttcttgtaaatttaagttcttgtagattctggatattagacctttgttagctgggtagat
-tgcaaagcgttcctcccattctgtaggctgcatgttcaccctgatgatagttttttttgc
-tgtgcagaagctctttcatttaattagatcccatttgacaattttggcttttgttgcaat
-tgcttttggtattttcttcatgaagtctttgcccatgcctatgtcctaaatggtattgcc
-taggttttcttctagggtttttatggttttgggtattacatttaagtctttaatccatct
-tgagttaatttttgtataaggtgtaaagaaggggtcccgattcagttttctccatatggc
-tagccagttttctcagcaccatttattaaatatggatcaaattcacacataacactatta
-accttaaatgtaaatgggctaaatgccccaattaaaagacacagactggcaaattggata
-gagtcaagacccattggtgtgctgtattcaggagacccatcacacatgcaaagacacaca
-taggctcaaaataaagggatggaggaaaatttaccaagcagatagaaagaacaaaatagc
-aggggttgcaatcccagtctctgacaaaacagactttaaaccaacaaagatcaaaaaaga
-caagagcattacataacggtaaagtgatcaattcaacaactagagctaactatcctaata
-tatatgcacccaatacaggagcactcagattcataaaacaagttcttagaggcctacaaa
-gagacttagactcccacacaataatagttggagactttaacactcagtgtcaatattaga
-cagatcaatgagacagaaaattaacaaggatattgaggacttgaactcagctctggatca
-agtggacctaatagacatctacagaactctccaccccaaatcaacagaatgtacattcgt
-ctcagtgccacatgacacttattctaaaatcgaccacataattggaagtaaaacactcct
-caggaaatgcaaaagaactgaTTAGTTATTAATAAATTGGGCTGAGGCTTGGGCGCTACT
-GAAAGCCACAATATCAGATGCCAGAATGTCTCAAAATCAAAAAGGTTTTTTCCTCTAATT
-ATTTTTTATGTGATCCAAGCCAAGCTGCCAGTGACTATGGCTGTAGTTTGGATGTTGACC
-ATCAGACCACTGACCTTTCAGTAGACCTCATATTCTAATAGGTCTTAGACCACCAGTtag
-ggtgtccatcattcagatttgattgggactgaggggcttcccagaacatgggaattagag
-agctaaaatcaagaaaatccagagtaaattgggacaagttgatcaccctCACTTCAGTGT
-ACTTCTGTCTAGCAAGCTATTTTTCCATTTTTCATGGCTATACCTCATCACATAGGTCAT
-ACATTGGCTTTTCACAGAATCAGTCTAGGGTGCTCTTTTTCCATATTTTTGCCTCAACTG
-TCATTTCCTGAAACACACTCCTTGAGCATGCAGAACACCTTCCATTCTACTTTGTATTAT
-TTTCTTCCCATCATTTGAACTCTGAAATCATTTTGAGTATTTACTCTCTCTCTGATTTTT
-TTTACTAACTTATGGCCTAACACCCCTGCTATAATGTACATATAGTCCTCATCTCTTGgt
-cttgttgacctatgtgatccaaactgcaagaacagtgcgtcacacatgagaaatgctcaa
-taaaaatttgAGAACAAATTATTCAGGCAGTTATCTTAATATATATGAGAAGGTTATATA
-ATATAAAAcagtagtcttcaaactgcaatactggttacaaaaagatttttcaagctatac
-atattgatagtttaaaggaataaaatttcagaccctcaagttccaaatttcttatgatgt
-tttggagcattcttaacaggctcttcttttataactccaatttctcaattttccttctcc
-cactctgaaaagaaaacttacctctcacccaccctttatctgacaatcatggattgccct
-gagtgaacaaacctccagtggacaattgaaatactagtgctggTattcagaaagtgaata
-atcatagactttgaataaaaatcctttggaaataaaagtgtttttaatttttttgtttac
-aaaagcaatgatggggtgtcaatcaagttgatggttaatattaaatagatctttgaagat
-aaactttaataatagcctactatgaaattttttagcatatcacttggaagaggttaaaag
-aactgtgtaaacattagagtcttatgttcaaagagatttcacaataagctacaatgtatg
-tctatgttttgtcacagagaaatgtgatagaatgattaataaaagacttgcaaacacaaa
-aatatagtacattaggatcaaattttgcagagaagtttgaataaaaactaaagttttaaa
-aagaaaaaagatacaatgttcccaattgctaaaaaagagcttctttgcatatttattaaa
-tgaattattgtgattagcaaattgtcatgcattcatattccattggatgtatttagtatt
-tagttgttacatgtcaatatttgtaatatgctattagttatctttttatgattaaaattt
-aagatgaaatagtttatttcccaattttaaattgtattgggaaaatacacactttATTTT
-TATACCTAGCATAGACTTTTTGTTCCTTCTAATTGGAAAAAGGCTTTGCAATTTGCAATT
-GGTATATGTGTGACTTCTAGAAATGTGGTGTTCTttttttgttttttgtttttttgtttt
-ttttgagatggagtctcactctgtcgcccaggctggagtgcagtggcgccatctcggctc
-actgcaagctctgcctcccgggttcacgccattctcctgcctcagcctccctagcagctg
-ggactacaggagcacgccgccatgcccggctaatttttgtatttttagtagagacggggt
-ttcaccctgttagccaggatggtctagatctcctgacctcgtgatccgcccaccttggcc
-tcccaaagtgctgggattacaggtgtgagccaccgcgcccggccCAGGAATGCTCTTAAC
-CACTTCATCAAGCATCAAGGTTGGCACTGTCTAGATGTTGGTTTTGATTGCCAACCTACA
-AAAGAAAAGGGAAATTATAAAAGAGAAAATTAACAAGTGAGTACAGTTTCAAAATCTGTC
-CTGCAAATGTGTTTTAAACCAAAGAAATCATCTTTGGCATGGGCTATTTGCTTTATAGTC
-ATTCAGAATTGCTTGGTCTCTGTCTCCTGAAGACTGTGGCTAGGATTATTCCTGATGAAT
-GAGAAAGTTACCATAAATCAAAAATAAAATGAATAGAAAACTTAACAGTTGACTCTCAGA
-AGAAGGTATCTTCCCTCACTTTGCACTGGTtatatatatatatatacacacacatacata
-taATTGTATAATATGTATTAttttataaattgatttagaaggtacaagtgttgttttctt
-atatgcatatattacatagtggtgaagtctgggcttttagtttagccatcacccaaatag
-tgtacattgtacccattaagtaatttctcatttcttagcccccttctacccttccaagtt
-tccagtgtctattacccactccttatgtccatgtgtatacttagtttccacttgtgagaa
-catgtagtatttgactttctgtttctgagttatttcacttcagataatgAAAACATTCAC
-TTCAGATAATGAAAACACACTTTTCAAAATTCAAAGAGGTTTGAAAAGCTCATGGCCTAA
-TACCCCCACTATAAATTTTATTTTTAAACTGTTCATACTCCTAGAATGAACAGAGGCTTC
-AAACACTATCTGGTATAAACTGATGATGATTCTTCTACTACTGTGATCATTCTGTTTTTC
-TATGATTCCTGGATTTTCCTTTTCCATGAATGTGGGCTTTGCAGCATAACTTCTAGTTTG
-TTTATATCATTGCCCTTTAGGATCTCCTGTAGGCTCAGTAATCTATCACTTCCCTATATG
-GGACTGACCTCCAAATTACTGACTTTATATGTTCTCTCTCTCTCTCTCTCtgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTTAGTATTTGCATTTTG
-CCACATTCTTATATAGTTTCCAGCTCAAGTCTGAAATTCTCTACCtctttatctatgctg
-tccatattaggtatatgatttgataagttagacatgtgacatatatttcccccattctct
-gggttgttttttcattatatcaatggtgtcttttgaagtagagcagtttttaattttgat
-gaagttctcttttttaaaaacacttttctttttggtgtcatatctaagaaatcattccct
-aatttaaggtcataaaggcttattcttgtgttttcttctaagggttttagctttcacatt
-tagctgtacgatcctttttaatttaatttttttgtatgatgtaaggtaggggtccaaatt
-cattcttttgcatgtggctctccagtttctccaacactatttgataaaaagactatttac
-ccactgaattgtctggacacccttatagaaaatcaattaataataaatgtGataatttgg
-gcagatctttggagagaaagcaccaagagtggatggagaggcaacactgacaccaaagct
-gaagagagaggaagctggaatctctgcatgaggtgcctgaacattagggctagttcctga
-ccctgagtggctcctggggaaggggtaagtaaggggactaaggaacatcccgcttttgcc
-atggacctctgggatcatagctacagggtaccccatgtccctcatggatttgtaggctag
-cagggagcaggcagagacagggcttcagccagtgtgaagcccaggagcttttgtgcatgg
-ggcagctctggcagcgcatgaccgcaggtgcccatccccaagggctccccatcttcttct
-gagaggctgtagccccagctgactgctggacctggagagagtggcgccagctttgccatg
-ggactggggtgcatctgttctgcaggctctcctgcctgccagcccctcccatggcccctg
-cctagccaccctgcaggagcatgagcacagcacagcctccaccactaagccggagtgctt
-tgctccacctgagtacattcccagtaacctgggagcacttcagatccctcagtgcagctg
-gagcttgaccccaagccacagatcatccccgtgccccagggctgcagcacacagcttggg
-agcatgcagctgagatctgtggctgacaggcaagtagaggagaggcccccaatatcagaa
-cataaagggggcaagatgtgtgggttcatgggccagcttgggagcaaggtgtgcctccct
-ctgcagggttggtctggaaagggtgtggcccatctccctgccatggcctctgcccaagga
-agccccacagcctggaacacctaacgaaacacagaaatgatgccagtgatcagggtgggg
-tccctaaaggcccaagagcagatctggtgaggagttttctctcccactccactcaccata
-gaacatgcctgcaaatggaaggacatgcaaaagagctgagtaacagcctatgtaccagtc
-actacttaagcatcaatgactagatctcagccccaactacagcaccaaaaatgattctgc
-taatatacacccctgtgaaaccaagtgcaagactttgcccatacataaagatcctgtaca
-gagccacggacctctgaaaacatccagaaatgaactcaactgactatattcaacttacac
-cacatttaaaagaaaaccagcccccctcccaccagaagagaaagaatcaatgcaagaacc
-ccagcagttcaaaaagccagggtgtccccttacctcaaaatcagcccactatctccccag
-cagtggtccttaaccagactgaaatgacagacatagaattcagaatccaaatggcaagaa
-gctcattgagatttaggagaaagttaaaatccaatccaaggaatccagtaaaatgattca
-agagctgaaagatgaaatagccattttaagaaggaaccaaactaaacttctagaactgaa
-aaatttgctacaataatttcataatatgacagtataacagtattaacagaatagaccaag
-ctgaggaaagaatctcagagctcaaaggctggtccttcaaatgaacaaagtcagaaagaa
-aaaatctttaaaactgaacaaaaccaccaagaaatatgagattatgtacagaaacaaaac
-ttctgacacactagcattcccgagaggagggaaagagagtgaacagcttggaaaatatat
-ttgaggatatactccatgaaaatttccctaatctcactagagaggttgacatgcaaattc
-aagaaatacagagaaccccagctagataaaatacaacatgaccatcccaagaaacatagt
-catcagatttgccaaggtcagcatgaaggaaaaaaaatcttaaagccagctagaaagaag
-ggtcatgtcatatgtaaagagaaccccatcaggctaacaccagacctctcagcagaaacc
-tgacaaaccagaagagattaggggcctttttcagaatccttaaagaaaagaaattctaac
-caagaatttcaaatcccatcaaactaagcttaataaacaaagaggaaataaaatatttct
-cagacaagcaaatgctgaggaaattcatcacaaccagatatgcctccttacaagagattc
-ttaagggagctctaaacctacaatcaaaagaacaacacctgctacaaaaaaaaaaaaaaa
-aacatacttatgcacataaagacactataaagcaactacactatcaagtctacataataa
-ccagctaacaacacaatgacaggataaaaatctcgcatatcaatactaaccatgaatgta
-aatggactaaacaacccacttaaaggacacagtgtagcaagattgataaaaagacaagac
-ccaactatctgctgtctttaagagacctacctcacatgtaactacacccacaggctcaga
-gtaaagggataaagaaagatctgtcacacaaatggaaaacaaaaaagagcatgagttgtt
-attcttatatcagataaaacagactttaaatcaacaactatgaagagggacaaagaaggg
-cattacataataataaaggatacaattcagtgagaagacttaactgttgggcctggagag
-agtgggaccacctttgccatgggactggggtgcatctgttctgcaggccctcctacctgt
-agcccctccgaaggcccctgcctagccaccctgcagaagcatgtgcacagtgcagcctcc
-actgccaagcctgagtgctttgctccacctgaatatgtttatattctaaacatatatgtt
-cccaacattgaggcacccagattcataaaacaagttcttcttaacctataaaaagatgta
-gatagccatgcaataatagtgggagacttcaacaccctactgagagtgttagacaaatca
-ctgaggcagaaaattaaccaaaaaatcctggacttcaactcaacgtttgaccaactagac
-ctaacagacacctacaaaatattccacccaacaacaacagaatataacttccttcttctc
-tttggcacgtggaacatattccaagattgaccacatgctcagtcataaagcaagtctcaa
-taaatttaaaaaagtcatgctgagcccattctcaggccacagtttaataaaaatagaaat
-gaatatcaagaagatctcttaaaattacacaaatacatagaaatgctcctgatacctggg
-taaacatcaaattacagcagaaaattaaaaaattatctgaattttttattaaaataggga
-cacaatttaccgaaatatctgtgatacagccaaagcagtgttaagggaaatttatagtgc
-taaacgtcatcatcaagaagttagaaagatctcagattaaccatcaaagtttgcacctag
-aactagaaagaaaagaacaaaccaaccccaaagctagcagaagaaaaaaaaattactaaa
-attagaaaagaactgaaaaaaattgagatgcaaaattccatagaaaggaccaataaagcc
-aaaaggtggttttttgaaagaataaaaaaggttgatagactgctagctacataaccatga
-agaaaaaagaagaccaaaataaatacaataaaaaatgaagaagatgacattacaatgaat
-cccacagaaatacaaaagatactcagagatcattttgaacaactctatgcacacaaattg
-gaaaatctagaggaaatggataaattcctggaaatataaaacctcccaatattaaagcca
-aaggaacatgaaaacctgaacaatcaataaacaagttcctaaactgaatcaataataaaa
-acctaccagcccaaaaaaaccctggaagagatggattcacagcctaattctaccagacat
-aaaaagaactggtatcaattctactgaaactattccaaaaaaatctaggaggagaggctc
-ttccctaactcagtctatgaagccagcatcagccagataccaaaatctgtcagagacaca
-aataaagaaaacctcagaccaatatccctgattaacatagatgcaaaaattttcaacaaa
-atactaggaaaccaatcccagcaacagatcaaaaaattaatacatcagaatcaagtaggc
-tttattcctgggatgcaaggctggctcaatatatgcaaatcaataaatgtgattcaccac
-ataatcagaattaaaagcaaaaaaatatgatcatctcaatagatgcagaaaaggatttga
-aaacaatccaacgcaccttaatgataaaaacccacaacagactaggcactgaaggaacat
-accgtaaaataatgagccatctatgacaaacccatagccacgatcattctgaactggtaa
-aagccggaaccattccctttcagaactgcaacaagacaaggatgcccactctcaccatgc
-ctattcaacatagtactggaagtgctactagagcaatcaggcaagaaaaagaaataaaag
-gcatccaaataggaaaagaagaagtcaaactatccctcattgctgatgatatgattctac
-acctggaaaaccccaaatactctggcaagaggcttataatactgatgaacaacttctgta
-aagtctcaggatacaatatcaatgtcaatgtacatttctatacacaataaccttcaacct
-gagagtccaatcaagaacacaatcccatttataatagccataaaaaatgaaaatccctag
-gaatacagctaaccaaggaagtgaaaggtctccacaaggagaactacaaaatacttctgc
-aagaaatcagagatgacacaaataaatataaacaattccatactcatatatcaaaaagat
-caatgtcatttaaatggctatacattccaaagcaatctacagattcaatgctatttctat
-caaactacaaaaactgcttttcacagaattataaaaaaactattctacaattcatatgga
-atccaaaaagtacccaaatcaccaaagcaatcctaagcaaaaggaacaaagccagaggca
-tcacattatctgacttcaaactatattataaacccacagtaaccaaaacagctgatactg
-gtacaaaaataaacatatcactaatggaacagaatagacaacccagaaatgaagccacac
-acctacagacatctgatctttgataaagacaacaaaaataagcacagggaaaagaccccc
-tattcaataaacggtgcttgggtagctggctaaccatatgcagaagaatgaaagtggacc
-cctgcccttcaccatatataaaaattaactccacaaggattaaatatttaaatgtaagat
-cttaaactataagaatcctggaagaaaacctggaaatacccttctcaacatccacgttgg
-taaagaattcttggctaagtctccaaaagcaattgcaacaaaaacaaaaattggcaagtg
-ggacctaattaaactaaagagcttctacacagcaaaagaaactctcaacagagtaaacag
-acaacctacagaatgggagaaaatattcgcaaactatacatccaataaaggtctaatatc
-cagaatctataaggaaattaattcaataagcaaaaaaaaatcccattaaaaatgggcaaa
-agttataaacagacacttctcaaaagacatacaagtggccaaaaaacatgaagaattctc
-atcatcactaatcatcaaagaaaggcaaatcaaagcaattagataccatctcataccagt
-cagaatggccattattcaaaagtcaaataatagcagaagctagtgaagctgtagagaaaa
-ggaaacacatacactcttggtgggaacaaaaactagttctgccagtttggaaagcagttt
-ggagatttcttaaggaacttaaaaatagagctaccatttgacccagaaatctcattagtg
-ggtatctatgcaaaagaaaacaaatcattctaccaaaaagacacatgcagccctatgttc
-atcgcagcactattcccaatagtaaagacatgaaatcaacctatgtgctcatcaatcatc
-aatggtggattggataaagacaatgtgttacatattcaacatgaaatactatgcatccat
-aaaaaagaatgaaatcatgttttctgcagcaacatggatgcagctggagaccataattct
-aagcaaattaatgcaggaacagaaaaccaaatactgtatgttctcacttataagtaggag
-caaaacattgtgtagtcatcaacataaagaaggaaacaatagacaatgtggattactaga
-gggaggagggaggaaggggggcatgggctgataaactaactattgggtactatgctcact
-acccaagtgaaaggaaacataacccaaacgacagcatcacacaatatacccatgtaacaa
-acctgtacttgtatcccatgtatctaaaataaaagttgaagttataaagaaaaataagtg
-ttagagtttatttcttggctcacaattctactccattgttatatatgtttaGCTGTACTG
-Aggggtctccaagatcaccctcaagtttgatgactcactagaaaaactcaccagacctat
-aaaaacgattatactcatggttacagcttaatacagttaggagatacagattaaagtcag
-caaaggtaaaaggtgcacagagtgatgcctaggaaaaaacaggtatgagctttcagttgt
-actcttcctccagaatcacacgaatagaactcaattcttccaaccataaggtatgacaat
-aagtgcaaaatggtgccagccattttcagtgggagtcaatcacataagcatgaagcatcc
-ccaagactgaatttagctactcaatcttcagcccctaaccttaggagtcaagctaatacc
-gcttggcctgaagccccagtcatagaaaaaaatatatgatttattcaccataaatcacat
-tgttagcataaactatttggcatgggccaagtctcaggtatacaaagacactttatcagg
-caggataattaaagggctcagagattatctgccaggacctttgaaatatgcagggttagg
-acaaccccaaatcttctgagttaaccctttattacacaGTCCACCCCATACCCCTTAGCC
-TAGGCTGTCTTTCAGCAAAACAATTCTATATTTCTGAGCATCTACATTTAGTATAGCATT
-TATATAACAGATCTAGAAATAGTATCAGTATGAAGAAAGATCTCTAGTTATAGTAGATAA
-AATATAGCAGTGGAAGGCCCAGCATACCATGGTTGTGCTATGCTCAAAAACATTTGGAGG
-AGCTAGTGTGGGGTAGGGATAAAGATTTTAAAAACAACTAATCTATCTCATAAAGCCATT
-ACATACATTTTCATATTTTTGTACTGATTTGTTACTTGTTTCTCCCCTTGATCTACCACT
-TTAATCTTACAGCTGCAGAATTATTTAGCCTAGAAATTAGTTTATGGTTAACTAAATCCA
-ATTCTTCCTTAGGCTAGTCATTTTCCATTGGTAATACATCCTGAGGAGGCTTAACTCAAT
-CTCTCAATACATTTGATCATCAGTATCAGTACCATCCTATGACTTATTTAATAAGGTGGC
-TGAATCTTACCAACAATAATAGTGTCACACTGTATAGCAATATAGTCATGGAACAATTTA
-GTTTCATTCATAGAACAAATTAGTAAGGCTTACGTAAGTTTTGCTATGCCTTCCCAACAG
-AAACAGTCCTTGCTTATATACAAGATATACTTATGGACAAGCATTGTTATAATTGTTAGA
-ATGATTTGATTATTTCTGGCTTCCATGTCAACGGAGGACAAAGACAGCCACCCCGTTTTA
-GTTTTCAAGCTTGGACAGAGACTGGTTTCCATTGTGTGATTTTCTACAGCAGGACCTCCC
-CACCCTCCTATGGGAGGTCACAGGTGATATTCAGATAGCTTCAGTCCCTACTAACTGTAC
-TGCAGAATATGTCTTATTCTGAAGCTCTAATGGGGCAAGAATAATTTGTAGTGCATCAAT
-GCACATTTACAAATGCCCTGAGAGGTCTTTCATAAGTTTGAAGGCCCATGAGATTCCCAT
-AAGTGTGTCCCTTTTTCCTCAGCAACTAGGATGTAGTGCTATTTCCCCATGGTTACTTTG
-ACCTTCATCTGTAATTAAAACAGTCAAAAGGCACTGTTGGGTCAGGGTACAAGCCCTTTC
-CCAACGTTGGATCTTAGCATTATCTAGCATTATTTTTGAGTCTACTTGTTTCATTTTAAT
-AAAGCCTCATCACTTTCTCAGGATGACCCTCATCTTTTGCCTTCCTCCTAGAAAAGAATT
-CTCTCCAATCTGCTCATTTTAGTTCAGTAATATTTCCTCTAGACTTCACTAAAAGGGAAT
-TCAGCTTGTCCCATGATGCCTGAACTGACACCTAATGCCCCTAAAAAGTCTGTTTTATGC
-ACAAATGTAGTTTAATTCACCATGCATGTTGTTGGCATTGTATACTTATGGCCCAAGTGC
-AGTTAGCATATGTGGTTTTTACCCCAAAATGCGGGTTCTTCATATATAGATTAGATGAAT
-TGTAGTCAAACTAGATCTAATTTAGTTTTTAGTATGTTTTAATGCCTTTCATAATCTTTT
-TTGTCTCAGGGTGGGGCCATTACCCCAGGGGAATTCAAGTCACCGTGTAATGGCTACTGC
-TTTAATCCCATCATGTATTAATTGCCATTCTCTCttttttcaactttcattttagattca
-ggggatacatgtgcaagtttgttacctgggtatattgcatgatgctgaggtttgggatat
-gaatgattttgtcacacaggtctgagcatagtacccagtagttagtttatcaaaccttgt
-ccaccgcctacccagtagtacccagtgtctattgttttcatctttatgtccatcagtact
-caatgttcagcctccacttacaacatatggtgtttggttttctgttcctgtgttaattca
-cttagtattacaacatccagctgcatccatgttgctgcaaagagcataatttcattcttt
-attatggctgcatagtatttgatggtgtatatataacacattgtctttatccaatccacc
-atagatgggcatgtaggttgatttcatgtctttgctattgtgaatagtgctgtgatgagc
-tataactgcatctgtcattttggtggaatgatttgttttcttttgcatagatacccagta
-atgagattgctgggttgaatggtagctctatcattaagttccttaagaaatctccaaact
-gctttcaaactggctgaactaatttacattcccaccaagagtgtaaaaatgttcagtttt
-ctctgcaacctcaccaacatctgtttatttgtttttcatgtttgagtaatagtcattctg
-actgttgtgaaatggtatccagtcatggttttgatttgcattgctctgatgattagtgat
-gatgagcatttttttcatatgtttgttgagcacttatatgtcttcctttgagaagtgtct
-gtttgtgtcctttgcccattttttccatgagtttttttttcttattgaattgtttaattg
-ccttatagattctggatattagatctttgttggatgcatagtctgtaaatattttcttcc
-attctataggttatctgtttactctgttgagagttttgtggtgcagaagtttaattaagt
-cccactttccaatttttggtttttgtttttttcaattgcttttgagaacttagtcataaa
-ttattttccaaggtgatgttgagaatggtgttttctaggttttcttctaggattcttttt
-tctttcttttttttttttttttttttttttgagatggagtctcactctgttgcccaggct
-ggagtgcagtggcgtgatcttagatcactgcaacctccacctcctgggttcaagctgttc
-tcctgcctcaacctcctgagtagctgggattactggtgcatgccaccacacctggctaat
-ttttgtatttttactggagaccagatttcaccatgttggtcaggctggtctcaaactcct
-gacctcatgatccgcccacctcagcctcccaaagtgctgggattacaggtgtgagccgct
-gcgcccagctcttctaggattcttaaagttttggatcttacatttaaatctctaatcgaa
-cttgagtcaatttttatacatggtgaagggcaggggtccatttcattcttctgcatatgg
-ctagccagctatccaagcaccattactgaattattgaatagaattattgaatagggagtc
-ctttctccatgataatttttgttgtctttgttgaagatcaaatggctgcaggtttgtggc
-tttatttccaggttctccattctgttccattggtttatgagtctgtttttgtaccagtat
-catgctgttttggttactgttggcttatagtttgaagttaggtcatgtgatgcctccagc
-tttgttccttttgcttaagtttgctttgactattggggctcttttttggtttcatatgaa
-ttgtagaatagattttctaattctgtgaaaaatgataatggcagtttgatagaaatagtg
-ttgaatctatagactgcattgggcagtttggccatttaaatgatattgattcttccaatc
-catgagcatgggatattttttcatttgcttatattatttattatttcttttagcagtgtt
-ttgtagttctcccggtagaaatctttcacctccttggctaaatatttgcaatgtatttta
-tttttcatgtggctgtcatgaatgggattgtgttttgagactttgctgaagttgtttatt
-aaatctggaagtcttttggtggaatcattagggttttctaggcgcatagaatcacattgt
-cagcttagagagctaatttgactttctcttttcctatttagacaccttttatttccttgt
-cttgcctgattgtttgggctaggatctccaattctaacagctttcagtggagtctaggtt
-tttctaaatataagattatgctgtctgtaaacagggataatttttttcttttactgttaa
-ttttcagagttttatattttatttattatgtgtagtctgcaaatacattctgtaaggtta
-ttgcttgtctttttattttcttaacagggtcttttgcagagcaaattttaagactttgat
-gaagttaaatttgtcaattactttttatggattgggctttttgtgtcatgtctaaaacct
-cataaccaagcattaagctccatagattttctcctatgttttcttttaaaagctttatgg
-ttttacatcttacatgtgattctatgaccaattttgagggcttttttttcatgtatgtgg
-ggtgtttaggtaagttaattttttttaacctgtggatatgcaactgttccatcacctata
-tttaaaaagattattcttccttcatttaattggttttatatctttgtaaaaaaaatcaat
-tggctatactagtatggttctacttccggattctgtattcttttccattcatgtatgtgt
-ccattcctctgctaatacaaatcttggttactgaagctatacaacaactttcataattgg
-gtagaattaatttctccgactttattctattttttcaagattgactaatccattctagct
-attttgcctttccatataaattacagaataatctgtgtatatttagaaatatcttgatgg
-cagtttcaagatggctgactagaagcagctagcgtgtgctactctcacggagaggaaaca
-aagtagcgagtaaatagtggcttttcaagtggatcgtctgggagaccacatcaggattca
-ccaaggaagtgagggaatcctcagagagcagagagtgaagcctggcagcagccgctcacc
-cgggaccagtgtggagcaagagaaattccctaacatggggaaagggtgagtaagtgagag
-tcctcaggggatccacatggatctttgcaatcctgtgcacaggagaaccccttggcccct
-ataggcctctagatcgacacaacatcctggagtttgtgtagacgcactgctaagggccat
-gtggagccccacaggccctggatccctgatcaacctggtgccagctgccatagccctgat
-aggggctgcagtcatggtgctgaggagtggtcagactgccctgctcctcctcaccaggca
-aggctcggctttggcttccagtgcaacagtctgcctccacctgaactctgcatgtgggca
-cactctacactcccctgggaaccactcagatggcggattgtgtgactcccattcccctgc
-tgctccgagccaggcaaggctagctggtttgggcttcaacacagcacctctgcccctacc
-tgaacactgtagtgggttgcagctttccattcccctggggcaaaactcacagaggtaaca
-gatAATGCCTGGCACCTTTGTGTGTTGCTAATAGTGAAGTTCAACATTATTGGATAGGAG
-GGAGGTGCAAGCATGCCAGGCATTCCACAGCTTCCAGTCTCCATTGCCCCAGCTAAGGGA
-TGGCATGCTCTCCAGTTAAAGGCCCACAGCACAACTGTCCTGCCCCTGCCTGAACATTTC
-ACCTGCGACCCAGAGCCTTTCCGAAAACCCACCCACCACAGGCCTGTGATATTCTTCTGG
-GTTCCCACCACCCAAGAATCCCACcttcccctgcctgagagtttggctggtgacccaggg
-accagcctgaaccccacccccaccccattacagtcagcacctgaaatctgggatagataa
-ccccagtccagccccttcagggccatgcacactgtccagcaggccttctggaggcctgtc
-agctgagaaactatcaatacccttccagtgctgttggcacctgaccaatttcctcagggc
-ctgaggttgggcctacccaaccagcaaacaccaccatgaccaacaccgacctgcacggac
-cCAAAGGTGGAGACCTTCCTTCTCAAAAAGCAGCAGTAATGCCCCATCATagaataagtg
-agccttaaagctatctgtatcaggttgagtgatgaggttataccctgaacaactctcatg
-gagaatcataaaacaagtgttccctgtggccctcaaccacattgcagtccagagatagac
-tatagtgtgcatctgaactaggagtcatgagccctgaaacagggtgtgataaggaaacag
-atcacatttctacctacctaggatggggagctggtgcagtcttctcgcccacaagcccct
-acagagacctcagtgcaggagttgctcccagccacgctcatcagagctggtgcctgtgct
-tgccattggtatactaatgggcaagccaggggcaccagctcttctcagctctgtcccacc
-atccccacagaacaagaagctcagtacatcaggcacccccactgtccagcccttcacctg
-aaacaactgagagcccctaatagtaaaaaaagatcagatctatacccatctgtttatggg
-acagctggctgttacttgcaaatgtcatctaccagtctataggtcaaactggacagccca
-tcaaaaaacctgctggtagaagtgtgtaggactatagaaacaaagccaaaagccctaccc
-aacacaatcccctccagataagaaggaactagtataagaattctgctgtcatgaaaaatc
-tgaatgtgtgacaccaacaaggttcactctagctctccaggagtggtcctagccaaaata
-gaagctgagagatgacagatggagaattcaaagcatagattgcaggaaaattctttgaga
-ttcaagataaggttgaaaatcaacacaaagaaacctgtaaagcaatccagagaataaagg
-aagaggtaaactcttaaaaataaatctatcagagctactgaaagtgaaaaactcacttaa
-gacattccgaaattcaatgaaaagttttatcaatagactagatgtagcagaagaaagaat
-ttcagagcttgaagatcagtctttcaaactaacccagtcagacaaaataaagaaaaagtt
-attttgaaaaatgaaccaaatcttcaagaaatatgggattatgtaaagtgaccaaaccta
-tgaattactggcattctcaagagagaaagaggaaaaagtaaacaacctagaaagcatatt
-tgagggaataattcaagaaaatttcctttatcttgctagagaggtagacatccagataca
-ataaattcacagaacacctgcaagatgctatacaaagtgaacatcatcaagacatagggt
-catcagacagtctaaggtcaattctaaagaaaaaatcttgaaggcagcctagagaaaagt
-gtcagatgagttacaaaggtgagcccatctggctaacagcagacttatcagcagaaaccc
-tacaatcccaaagagactgggggcctatttaaagaattctcaaagaaaagaaactccaag
-caagaatttcataccctgccaaactaagctttataagtgaaggagaaataagatcttttt
-cagacaagcaatcactaaggcaatttattgccactagaccagccttacaagagatcctta
-agggagttggagttctaaacataaagatggaagaacaatatctgccaccacaaaaccaca
-cctaagtacatagcacatagaccctttaaagctattacacaataggaactataaagcaac
-cagcttacaatttcatgacaggatcaaaatctcacatatcaatattaaccttgaatgtaa
-atggtcttaacaccccacttaaaggcacagagtggcaagttggatcataaaataagaccc
-atccatctgttgtgttcaagagacccatctcacatgtaatgacTACTACACTAATTTTAT
-CGGGTTTTTTTCCCCATTGCTTATAAGTTTCATTTTATGGTATGTTATTTTGATTGTATG
-CCAAACATTGGGTAAATGGGTTTTGGAGACTCCAAGTGATGTTATCTTCAAACATAAAAG
-GTCCTCCCTTTCTCCAGATAGCAAAGAGATAAGGACATGACTAATTCAATATAACAAGGC
-ATTAAGCTGGTTCAGGGCTGGGTTTCAGTATTAGTAATGATTCCAACCACATCTAGTTTG
-GTCCTGTTTCTCAGGAATAGCCCTCCAGGCTTTTTCTTCAGGGTCTGTTTGGTCTCAGTA
-TCTTCAGCCCAAAAAAACAATGAGGGAATTCTAGCTCTGTTCTTTATGGTTTTCAAACAT
-TGCTCTTCAGCCTCCTGATTCAGGCACTTCTGTAATGTCTCAAGGGGGAGACTATCTGTG
-TGCTTGAGGTAGGCTCCATATCACTATCATATCTGTTTCCTAAGCACTACAAGAGTACAA
-GAAATCTCTTACTGCCTTTCGGAAGTTTCAGCTGAGCTTTCCAACCTCTCACAAAGCTCT
-ACTTTTCCAATGCTCCATTGGGGGGACTAAAATTTGGGGCACCTGAAATTCCAATTTGTA
-ATTCCTAGAATCTCTGCTACTTCTGCTGATTCAATTACCTCCCAGAAAGCCTTTCTTTCT
-GGGCCAAGCCTGATTTCCCGTCTGTCCCAAACTGACAAAGGCACCCATGGGGGAAATGGC
-TGGCAATTATTGACCTACTCCAGAAACAGAAAGCCTGTTCTGTTCTCTCTTTAGAATATC
-AACTCTTCTAGTACCAGTAATTTCTCTGGTTCTCTAATGCCTTGGaaatattattttaat
-aaaaatCAAGCTTTTCTAGGTTTTGTATCAAAGGCATTGCTTTTCTGTGATTTACTGATT
-TCTCCCCAAGAACAGAACTTCTCAGgcccatttaatcttaacttaattgctgttatgttt
-ggctttaaattggccattgtttaacgtgatttacattttcctgagttttctatatttctc
-ttttttctcctttcttttaatctttctgtataaaccagatgttctttaattccattttcc
-tccccactagtttttaatgtattctccttttctattcatcatcactctagaaatgaagac
-atacattcttaacctatcaatatctaatattaaccaaaaatgtgtatttctcctcagaca
-atgcatggaatacaactccatttcacctgcctccagtttatattctattgctttatttta
-ctttcatataatactaagacaatattattgcatgcgtgacaattataggtagttctattt
-tctgggtgactccaacaagttatcattataaagtaacccattttcctctaagataatttt
-tgccttaaatactattttgttcaatactaagaagtaagataacttccttttgttggtatt
-tgcatgttaagtttttttcccatatttccactttcaatcttctccgtatcttgtttttac
-atttatctgttgtaaatagcatctaatttttcatccagtctagcaactagagttaatcca
-taaatttaccaatctctgaataatatatggaacatagaccactttaattctatttaacgc
-tcccaattgattctattttcagaattttgatatttaattatgtttttaatcttataaaac
-atctttatttaattctGCCAGTTTAATCCACTtttatccctttttttgttgcttcttcat
-cacatactttccatgtgtggtcatttttttaaactaaagaacatcctttagaatttcctt
-tcatgagatctgctatctctatctgaaaaggttgtatttatattttcttcttaaaatatt
-tttgtggatatggatttctaggatgacatttactttgaaaaatacgttgaagagctcagt
-ccattggattatggcttctattgtttgtggtgaaaaatcacctgtcagtgtaacaattac
-tctatcaaaagtatggtttctgtttttccctctgactgtttcccacttttctctttgtcA
-TTTTATCTAGATGACAATTCTTATTTATTTTCTAGAATAGTATTTCTTAGATTATTTCTG
-AAAAAAAAGAAGATTTATTATCTTTTCAAATTTATGTAGCtttttgtaattctttttctt
-taattttctttctccttctctttgaaaatcttattaatcagatattggctctcctggatt
-gacactctgtgtcttatatattttgctcatactttccacttgtttttagacttcaaagat
-tttctcactttatcttcaaatgtgcctgctaaacaatcatttttctaatttccaaaagtt
-tactacttctccttacatagcatgatattattgctttatggatggaataCACTCTTGAAA
-CTCCAGCCCCTAAATAATAGTTATTCTAATGTGCCTTTCTTCATTTATTTTCAGTCATGT
-TAAAGATTTTCTCAAATAGATAGCCAGCCTAGATTGTTTATTCATATTTTACATATATAC
-TGAGCCATTTTATGTGTGCAAACTTGTCCACAGCTTTTGTTTTAAAATGCTTGaactgtg
-aagatagaaaagacatgtttgctggaatgcataatactgaagtttacttctcatagtctt
-tctttagaagttatcgcctaggcagaaaaagaaagtaactaaaaaaaaagaaaacacaat
-ttccaggtatatctgtgccaactcaggtgactagtaaaacaaaattctaagatgacatct
-gtatagcctacataggaagcaaccagttcacattatagaaggaagaatgaatgttccagA
-GACAAAATATAGTTACAATACACCCTCATCTATTGTAGTAAAAAAAAAAAAAAGCTGAAG
-TCTAAATTACACAAATGTAGCAGCATAATACTATTAAATAATAAGTAATTTAATATTCTA
-TTTCATGGCATTATTTTACAGGAGCACTATTTGATCATCTTCTCTTTATCACACATACTT
-CTTCCATTTATCTTACAGTATCTTTACATAAACACTAAAATAGTTATACTCAGATTGTAC
-ACTTTTGAAGGGAGTTAGCCTATTTGTGTCAATTATTTACTAAAACAAAGCTAAATAACA
-GCAACAAAAAAGCCTTGTTGGAACAGGGACCAGGGGAATGATCAGAGCAATAAGTAGCTT
-GCATGAAAATATTATTAACTCTGAATACTTTCTCATTAACATTAACAGTGTGTCCTGCCT
-GTATATTTAATCCATTTAGAATTAAACTATTAATATATTGTGTCCTAGGATGGCAGAGTT
-ATTAAGCAGCCCCTGTATGCTCCAGGGGATATAGGTTGATATTCTTCAGCTGTCAAAATT
-CTTCAGCTGTCAAAATTCTTCAGCTGACTTAAATCAGCAGTAGTGGCGTTTATCACCAGT
-CAACAAAGTTCTTCTATCCTTCACTTCTTTAGCCTACTCATCTAATGGATGTTGGCACGA
-ACATGAAGTTTCTCTCCTAAATATCTATGATGTTCCACAAATCATGGGATATGCCTGCAG
-GCTGCCAGCACAATCAGATCTTCATGTTCCAAGAAAGGGATCATTAGTTTGGCCCTGCAA
-GATGTGCCACCTTTCTTGGAGAACTGAGTGTGCCACATGCAATCTGCTGAGGCATGAACG
-TGCTCTTGGCATTTCTGTTTATTTGCTCCTTATTACACTATATTGTGTCAGAATGATGGT
-TTGGGTTCAACAGTATGCTCACGTAAGCCACTATTCCAAACTTCCTAAACGCACAGTTGT
-GGAATGTGACACAATTGTTGGCAATGATATTTAAACAGGATATGTGTTTTTGGTGGGGTC
-TCTGGGAAAAATTACTAAAGGGAGGGGTGGAGTGATCCAAATATTCAAGTGGTAGACACC
-CACTTGACTTTGGccttccacttcctcctgtttggaatatggtcataatgctggaggtaa
-tgctgccatctataacaatgaagcaaaaacactggataacagtatgtgaacagaagagta
-gagggtgactagcatggtgaagctgttatataatttctggactTTATGTTATGTAAGAAA
-AATAAAACCTGAATTTGTAATAAATGAACAAAATGCCTTTTTCATGTTTTTCTGTTTCAT
-ATTACAGCCTATTATACTTTCTAACTGGCACATCATGGATTATAGATAGAATGTGATTTA
-GGATTAAACTCTCTTAAGTTTAAAATGTGTAGTTTTCTTCTCTCTTGTTCATTCTCTTAC
-TGCCTCCAGTTCATTTCAGAGCATATGAAAAGAGACAATAAGGGACTTTTAGCTGGAAGT
-TTACACTACATTACTGAGTAGGAGGAAAGTAGCTTAATAGTTCTATAAAGAGTATCATTA
-CAATTTTAAAAATAAACAAAAACATAAATTATATACCTGTAGTCTATCCTGAAAATATTT
-CCTGAAGTCACAGATTTGGAGTATTGTCAACTTGTGCAtaaacttcatgagaccatggac
-tattgtttttctcactgctttattcctagctccttgatcagaacaggcagagagaagatg
-cacaataaatgaataaatataataaatgaatGTATCCTTTATTACCTACGCAAACACATG
-CACACAAACACATCTATGAAGTTTTACATGATAGTATAAACACTGCTTTGGTGGAGGAAG
-TTACTGATTTTCTTTTAGCTTGTTTTCCACTTTATTTTTCTTTACCAAATAAGTTTCACT
-TTTGCTATTAGAATATAATAAATAACAGAAACCACAAGAACAAAGTAGCAGCTGAAAAAA
-AGAAATGGAAAATTCTTAATTCATATATGATTGCCTCTGTGAAACAAtgaaaagtggtca
-tccaatttcagtttgaacacttTTTTCCTCATAAAGTCATCCTATACCTTTACTCAAATT
-TAGTTTTAGGTGCATTAGGAGTTAAAAATAAAACATAAACCCATTTAAGAACCAAGAGAA
-TTAGTAAGGTAAATTACTTTGGTAAAATGCCCAAGTTCCAGGCTCTGCTGAAGAGAAATT
-ATTGATTCAACCTTAAAATatttgaagtctctggtaaggtgactttagctaaagctgcaa
-ccagctcaactacaaatcagactgactcactactctagcaacttgacagaagaacaatac
-tagacagaatattaattaccttttggaggtaattatttattgaaaactctactgaacttc
-tatatgtctggcataaaataaaggttatgacatatttttaaaaagaaagaagacataact
-cattgtccagagaggaaatgatcaacacccagccaatggaattatcaaccagaaactcaa
-agtaactctgatagaaatatgctagagaatatagtgggaaaataaacagtactggtgttt
-actgataaaatagagaattttatctatgagccaaaacaaagtaatacaaattaaaaattc
-aatatcagaaatggataattcattcaatgggctgaacagcagactgggagaagcaaagaa
-aacaatcacttcacttgaaactcaaatgaacatttgaatagaaatttcccaaatgaacac
-aaacacaaaaaagtaaagaaaaattgaatacaacatcagagagatgtgagatattatcaa
-ataattcaacatggatttaattggctcccaagaagaagggaaggagagaatgaagcagaa
-gaaataagagctaatagcctcctacatagcaaaattgatccaagaacttcagcaaggtct
-aattaggacaaattcaaagaaaatttctagacatagtggatttcaaactgctgaaaatca
-aagacagagaacaaatcttaaaagtagccagagaaaaaggacatgttatctaggaaggaa
-caatgacacaaatGATGCTGAGCTATTTCCAGAAAAATAAAAACAGCgggtgacatcagc
-aagatggcagaataggaagtcccagatctcatttccacatggaaacaccagtttaacaat
-agatgaacaaaaatatctttattagaattccagaaGAGAAggaaagaaattcaaagattt
-ctcataagaaacttcgaagggcaggaggaagtggcacaatatttttaaagtgcttcaata
-gtaagtctcaatccagatatctatgtccaagaaaatatccttcaagaataaggaccaaat
-aaacacattctcaaatgaaggaaaactgaaaaaaaaagggggggtcactagtaggtatac
-ctaaaagaacagctaaaggaagtcctccacagtgaaagaaattatttttttttttttttg
-agaaaggagtcttggaacataaggaaaaaagaagagagaaaacaaaaacatcagaaatgc
-aataaactttttacctactttttagttttctaaattatttttgacagtaacagcaaaaat
-tatccctctatagtgattctcagcataggtagaaaaaatatttaagtcaatgatattaga
-aatggggggttatcatagagatataaagggagataaaatctttatctgatgtggttaaat
-gatgtaccagtagactgtaataagttatggatatataatgtagcacagacaacaatcact
-acaaaagctatacaaagagatacacttgaaaacactatagatgaatgaaaatggaattct
-aaattatggaaaaatatctcacaaaatggcaggaaaaataagacaaagaagcaaaaagga
-aacaaaaacaaaatgaaagatttaagcattaatatatcaataatttaattaaatttaaat
-gatctaaacacacaaatttaaagatgaatattggcaaagtatgtttttagatgacccagt
-aatatgctatatacaagaaactcacatcaaatataatgatataaataggttataagtaaa
-agaatggaaaaagatataccatacaaatattaataaaaagtttgcaggagtgactatatt
-aatgtcagataaagtagacttcagaacatcaaaaaaattaggatgattttttgtcacctt
-tacatagtgacaaaaggtccaatacaccaaaaagatgtggcaaacttaaatttgtgtgct
-ccaaaacacaaagctgcaaaatatgtgaagcaataacagagagttaaaagagagaaataa
-gcaaaaacacagtcgggatatcaccacccacttctttccagaattgatagaacaacaaga
-aagaaaatcagcaacagcaatagaagagctcaacaacattaactacaggatccacgtggc
-atttaaggagcatttccactcaactagagcagagtaaatattcctttcgagctcagagag
-tgtatactaagatagactatatcctaggcaaaaaaaaaaagaagaagaagaaaaaaggat
-attcaactaattaaaaagaatttaaactgcacaaagtttattctctatatgattgacaca
-gtgaaatcaaactaggaatcaataccagaaataaaacacaaaaatctccaaacacctgga
-aattacacaacatgcttccaagtcaaagagaagtctcaataagaataaaatatacataga
-attaaataaaaatgaacatataacatattcataatttgtgctaaagcagtgccaagagag
-aaatttagaacaacaaatgcttatattacaaaagaagaaaaatgtcaaatcaataatctt
-agctctcacctgaattagaaaaataagagcaaattaaatgcaaagtaagcagaagaaaga
-acataataaagataacagcacaaatcaatgaaattggaaacagaaaaacaatagagaaaa
-tcagtgaaatgaaaagctgcttctttgaaaagatcaataacattgacacacttttagcaa
-gactgacaaagaaagacacaaatttccagcatgcggaataaaacaaagaatatcactaaa
-gaccctatggaaataaaaatgataataagggaatacgataacctttttttttttttttga
-gacagagtcttcctctattgcccaggctggagtgcagtggcacaatctcagctcactgca
-acctctgcctcctgggttcaagagattctcctgcctcggcctcccaagtagctgggacta
-caggcatgggccaccatgcccagccagtttttgtatttttagtagagatggggtttcacc
-acactggccaggctggtctcgaactcctgacctcatgatctgctcgcctgggcctcccaa
-agtgctgggattacaggcatgagccaccgcgcccagccaactaactctctatacattgat
-ttacttttttattttaaaatatccttgcattcccagtagaaaccctagttggtAAAAAAa
-aattattgtttgtaaacccttcttctttgatgttacgcatctacagctaaagatttcccc
-ttaagcaaggcaggagctgcatttcacactttataaaatgttgtattttactatcttgcc
-gttcaaaatacatattaattattcctataattttatctttaacacatggcttttacataa
-ttttaaatagtactttttaaattttaaattaaattttaaatacttttaaataataaaagt
-atgctagttaatttcaaaatattatgtttcttaacatcttatttttattggtttccaact
-taatactgatgtttttctagatatcacatttttaattgattgctattttgcaattatttc
-tgcaatattttagtgttttgacatttatagggacttctttaaagaatcaacactgtccat
-ctcagtgagcattccatgtgcatgtgaaaaaaaaacgggtattctgtaattattggaggt
-agtgttctatacatgttaattggattgaggtggttattcagatttgctacattctttttt
-ttttttttcgagacagagtcttgctctgtcaccaaccaggctggagtgcagtggcacgat
-cttgggtcactgcaacctccacctcccgggttcaagtgattcccttgcattagcctcccg
-agtagctgggactacaggtgcgcgccaccatgcccggctaattttttgtattttagtaga
-gacgggatttcaccatgttggccaggctggtcttgaactcctgacctcgtgatctgcctg
-cctcggcctcccaaagtgctgggattacaggcatgagccaccacgcctggccatttgcta
-cattcttactaaatgtttggtctagttatgctatcaataaccaacagtgaatgataaaat
-ttccaactgattgaagatttttctgttttcaagttacttttgtccatctttacttcatgt
-atttttaagttatattattagatacatcatgtctttctaatgaattgaccctttcatcat
-tatgaaatggccttcattatctctagtaaatactgcttgccttggagtcaaatacatcag
-atattaatataatcacTCCACAATTAACAAAGCCATCAAAAGTAGCTTGTATATCCAACT
-TATTCTCTGTATCGATTTCTTTCACTTTTGGCCTGAAAAATCTTTACTCactgaaaagca
-aagaatataaagaaaaaaaaaaggtaaagaatccaaggactgtgggaaaactgcaaaagg
-tgtaacctacatgtaatgggaataccagaaggagaagaaagagaaaggaacagaaaaaaa
-tatttaaaacaacaattgaaaatcttcagtgggagtataattagttcaaccattgtggaa
-gacagtgtggtgattcctcaaggatctagaaccagaaatacctttgacccagcaatctta
-ttactgggtatatacccaaagaattataaattgttctactataaagacacatgcacacat
-atgtttactgcagcactatttacaatagcaaagacttggaaccaacccaaatgcccacca
-atgatagattggataaagaaaatgtggcacatatacaccatggaatactatgcattcata
-aaaaagaatgagttcatgtcctttgcagagacatggatgaagctggaaaccatcattctc
-agcaaactaacacaggaacagaaaaccaaacaccgcatgttctcactcataagtgggagt
-tgaacaatgagaacacatggacacagggaagggaatgtaacacactggggcctgccaggg
-gtgggggggcaatgagaaagcattaggacaaataatgcacgtggggcttaaaacctagat
-ggcaggtttataggtgcagcaaaccaccatggcacatgcatacctatgtaacaaacctgc
-acgttctgcacatgtatcccagaacttaaagtaaaataaaaagaaagaaaaaaaaacttg
-agtaaaatgaaaaagaaaaagaaaattttccccaaattaatatcaaacatcaaaccacag
-atccaagaagctcagagaatactaagtaggataaatgcaaaaaaaaaaaaaaaaaaaacc
-taatcatgtcatattcaagctccatgaaacaaaatataaagaaagaatcctgaaagaaga
-caaaggaaaaaaTCTTATcataataatagtgctcatttctccaacaagacataacaatcc
-ttaatgtgtatgtgtctaaaaacagagtcaaaCAATgttttgatttgcatttccctgttg
-actagtgatactgagcatttttccatgtatatgttgaccatttgcatgtcttttgagaat
-gtctatttttgttctttgctcatttttcaaggatatcatttgtttttgtttctgtttttt
-ttgctttcagttgagtcccttgtttattctagtttgatacagtcccatttgtctgttctt
-ggttttgttgcctgtgcttttaaggtcttaaaatatttgcctagaccaaagtcctggagt
-gtttcccctatgtcttcttctagtagttttatggttttgggtcttaggtttaagtctcta
-atctattttgagttgacttttgtatatgatgatagataggggtctagtttcatttttctg
-catataaatatccagttcccagcaccatttattgaagagtgtgtcctttccccagtggat
-gttcttggtgcctttgttgaaaatcagttggctgtaaatatgtgaatttatttctggatt
-ctttattctgttccattgatctatatgttcatttttataccaacaccatattgttttgct
-ataagtactatagccttgtaatatattatgaaggcaggtagtgtgatgccacaaactttg
-ttcttttgtctcagaattgctttggctattttggctcttttttggtttcatacacatttt
-aggattgatttttctatttatgtggaaaatgtcattggtattttgataagaattgaattg
-aatctgtagattgttttaggaaatatggtcattttaacaaaattgattgttccttttcat
-gagcatgggaggcatttccatttgtttgtgtcgtcttccattcctttcatccgtgtcttg
-gggtattccttgttgacatctttctcctccttggttaaatttattcttaggtattttttg
-tagctattgtaaatggaattgccttcttgatttcttttttggctagttcattattggcat
-ataaaaatgctactgattttttagcattgattttgcattctgcaactttactgaatttgt
-ttatcaattctaagaggtttttggtggagtcgttaggtttctttaaataaaattatgtca
-tctgcaaagagggataagttagtttcctgtttcccatttagatactgtttatttcttttt
-ttgtctaattgctctatctagcacttccagtactatgttgaatgggaatgatgaaagtgg
-acatcttcttgtcttattccagttcttaaaggaaaggcGACTCTTgggggaggagccaag
-atggccgaataggaacagctccggtctacagctcccagcgtgagcagaagacggcgattt
-ctgcatttccatctgaggtaccgggttcatctcactagggagtgccagacagtgggcgca
-ggccagtgggtgcgcgcaccggcaccgtgcgcgagccgaagcagggcgaggcattgcctc
-acctgggaagcgcaaggggtcagggtgttccctttccgagtcaaagaaagaggtgacgga
-cacacctggaaaatcgggtcactcccacccgaatattgcgcttttcagaccggcttaaaa
-aacggcgcaccacgagactatatcccgcacctggctcggagggtcctacgcccacggaat
-ctcgctgattgctagcacagcagtctgagatcaaactgcaaggcggcagcgaggctgggg
-gaggggcgcccgccattgcccaggcttgcttaggtaaacaaagcagccgggaagctcgaa
-ctgggtggagcccaccacagctcaaggaggcctgcctgcctctgtaggctccacctctgg
-gggcagggcacagacaaacaaaaagacagcagtaacctctgcagacttaaatgtccctgt
-ctgacagctttgaagagagcagtggttctcccagcacgcagctggagatctgagaatggg
-cagactgcctcctcaggtgggtccctgacccctgacccccgagcagcctaactgggaggc
-accccccagcaggggcacactgacacctcacacggcagggtattccaacagacctgcagc
-tgagggtgctgtctgttagaaggaaaactaacaaacagaaaggacatccacaccgaaaac
-ccatctgtacatcaccatcatcaaagaccaaaagtagataaaaccacaaagatggggaaa
-aaacagaacagaaaaacgggaaactctaaaacgcagagcgcctctcctcctccaaaggaa
-cgcagttcctcaccagcaacggaacaaagctggatggagaatgactttgacgagctgaga
-gaagaaggcttcagatgatcaaattactctgagctatgggaggacattcaaaccaaaggc
-aaagaagttgaaaactttgaaaaaaatttagaagaatgtataactagaataaccaataca
-gagaagtgcttaaaggagctgatggagctgaaaaccaaggctcgagaactacgtgaagaa
-tgcagaagcctcaggagccaatgcgatcaactggaagaaagggtatcagcaatggaagat
-gaaatgaatgaaatgaagcgagaagggaagtttagagaaaaaagaataaaaagaaatgag
-caaagcctccaagaaatatgggactatgtgaaaagaccaaatctacgtctgattggtgta
-cctgaaagtgatgcggagaatggaaccaagttggaaaacactctacaggatattatccag
-gagaacttccccaatctagcaaggcaggccaacgttcagattcaggaaatacagagaacg
-ccacaaagatactcctcgagaagagcaactcaaagacacataattgtcagattcaccaaa
-gttgaaatgaaggaaaaaatgttaagggcagccagagagaaaggtcgggttaccctcaaa
-gggaagcccatcagactaacagcggatctctcggcagaaaccctacaaaccagaagagag
-tgggggccaatattcaacattcttaaagaaaagaattttcaacccagaatttcatatcca
-gccaaactaagcttcataagtgaaggagaaataaaatactttacagacaagcaaatgctg
-agagattttgtcaccaccaggcctgccctaaaagagctcctgaaggaagcgctaaacatg
-gaaaggaacaactggtaccagccgctgcaaaatcatgccaaaatgtaaagaccatcgaga
-ctaggaagaaactgcatcaactaacgagcaaaatcaccagctaacatcataatgacagga
-tcaaattcacacataacaatattaactttaaatgttaatggactaaattctccaattaaa
-agacacagactggcaagttggataaagagtcaagacccatcagtgtgctgtattcaggaa
-acccatgtcacgtgcagagacacacataggctcaaaataaaaggatggaggaagatctac
-caagcaaatggaaaacaaaaaaaggcaggggttgcaatcctagtctctgataaaacagac
-tttaaaccaacaaagatcaaaagagacaaaggcggccattacataatggtaaagggatca
-attcaacaagaggagctaactatcctaaatatatatgcacccaatacaggagcacccaga
-ttcataaagcaagtcctgagtgacctacaaagagacttagactcccacacattaataatg
-ggagactttaacaccccactgtcaacattagacagatcaacaagacagaaagtcaacaag
-gatacccaggaattgaactcagctctgcaccaagtggacctaatagacatctacagaact
-ctccaccccaaatcaacagaatatacatttttttcagcaccacacaacacctattccaaa
-attgaccacatagttggaagtaaagctctcctcagcaaatgtaaaagaacagaaattata
-acaaactatctctcagaccacagtgcaatcaaactagaactcagaattaagaatctcact
-caaagccactcaactacatggaaactgaacaacctgctcctgaatgactactgggtacat
-aaggaaatgaaggcagaaataaagatgttctttgaaaccaacaagaacaaagacacaaca
-taccagaatctctgggacgcattcaaagcagtgtgtagagggaaatttatagcactaaat
-gcccacaagacaaagcaggaaagatccaaaattgacaccctaacatcacaattaaaagaa
-ctagaaaagcaagagcaaacacattcaaaagctagcagaaggcaagaaataactaaaatc
-agagcagaactgaaggaactagagacacaaaaacccttcaaaaaatcaatgaatccagga
-gctggttttttgaaaggaccaacaaaattgatagaccgctagcaagactaataaagaaaa
-aaagagagaagaatcaaatagacacaataaaaaatgataaaggggatatcaccactgatc
-ccacagaaatacaaactaccatcagagaatactacaaacacctctacgcaaataaactag
-aaaatctagaagaaatggatacattcctcgacacatacactctgccaagactaaaccagg
-aagaagttgaatctctgaatagaccaataacaggagctgaaattgtggcaataatcaata
-gtttaccaaccaaaaagagtccaggaccagatggattcacagccgaattctaccagaggt
-acaaggaggaactggtaccattccttctgaaactattccaatcaatagaaaaagagggaa
-tcctccctaactcattttatgaggccagcatcattctgataccaaagccgggcagagaca
-caaccaaaaaagagaattttagaccaatatccttgatgaacattgatgcaaaaatcctca
-ataaaatactggcaaaccgaatccagcagcacatcaaaaagcttatccaccatgatcaag
-tgggcttcatccctgggatgcaaggctggttcaatatacacaaatcaataaatgtaatcc
-cgcatataaacagagccaaagacaaaaaccacatgattatctcaatagatgcagaaaaag
-cctttgacaaaattcaacaacccttcatgctaaaaactctcaataaattaggtattgatg
-ggacgtatttcaaaataataagagctatctatgacaaacccacagccaatatcatactga
-atgggcaaaaactggaagcattccctttgaaaactggcacaagacagggatgccctctct
-caccactcctattcaacatagtgttggaagttctggccagggcaatcaggcaggagaagg
-aaataaagggtattcaattaggaaaagaggaagtcaaattgtccctgtttgcagacgaca
-tgattgtttatctagaaaaccccatcgtctcagcccaaaatctccttaagctgataagca
-acttcagcaaagtctcaggatacaaaatcaatgtacaaaaatcacaagcattcttataca
-ccaacaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaa
-agagaataaaatacctaggaatccaacttacaagggatgtgaaggacctcttcaaggaga
-actacaaaccactgctcaaggaaataaaagaggatacaaacaaatggaagaacattccat
-gctcatgggtaggaagaatcaatatcgtgaaaatggccatactgcccaaggtaatttaca
-gattcaatgccatccccatcaagctaccaatgactttcttcacagaattggaaaaaacta
-ctttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaa
-agaacaaagctggaggcatcacactacctgacttcaaactatactacaaggctacagtaa
-ccaaaacagcatggtactggtaccaaaacagagatgtagatcaatggaacagaacagagc
-cctcagaaataacgcccatacctacaactatctgatctttgacaaacctgagaaaaacaa
-gcaatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgt
-agaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatt
-aaagatttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacc
-attcaggacataggcgtgggcaaggacttcatgtccaaaacaccaaaagcaatggcaaca
-aaagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaa
-actaccatcagagtgaacaggcaacctacaacatgggagaaaattttcgcaacctactca
-tctgacaaagggctaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaa
-acaaacaaccccatcaaaaagtgggcgaaggacatgaacagacacttctcaaaagaagac
-atttatgcagccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatg
-caaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaag
-tcaggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttgg
-tgggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatcta
-gaactagaaataccatttgacccagccatcctattactgggtatatacccaaatgactat
-aaatcatgctgctataaagacacatgcacatgtatgtttattgcggcattattcacaata
-gcaaagacttggaaccaacccaaatgtccaacaataatagactggattaagaaaatgtgg
-cacatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgta
-gggacatggatgaaactggaaatcatcattctcagtaaactatcgcaagaacaaaaaacc
-aaacaccgcatattctcactcataggtgggaattgaacaatgagatcacatggacacatg
-aaggggaatatcacactctggggactgtggtggggtgtggggaggggggagggatagcac
-tgggagatatacctaaggctagatgacgagttagtgggtgcagcgcaccagcatggcaca
-tgtatacatatgtaactaacctgcacaatgtgcacatgtaccctaaaacttaaagtataa
-taaaaaataaataaataaataaataaataaaaaaggaaaggctttcagcttttcttcatt
-caatatgatgttagctgtgtgtttgtcacatatatgacctttatttattttatttatttt
-atttttttgagacggagttttgctcttgttgcccagggtgtagtgcagtggcacgacctc
-agctcactgcaacctctgccttctagtttcaagtgagtctcctgcctcagcctctcgagt
-agctgggattacaggggcccaccaccacacctggctaattttttttgtatttttagtaga
-gacagggtttcatcatgttggtcaggctggtctcgaactcctgacctcgtgatccgcctg
-cctcagcctcccaaagcgctgggattacaggcgtgagccactgcgcctggccatatgacc
-tttattatgttgaggtatgttccttctgtgcctagtttgttgagtttttaatcatgaagt
-ggtgttgaattttatcaaatgccttttcctgcatctattgagatggtcatattgtttatg
-tccttcattttgttgatgtgtcatgtttatcaactggcatatgttgaatcatttttgctt
-ctctgggataaatgccatttgattatgatatattacctttttgatgtgctgttggatttg
-acttgctagtattttgttcaggatttctgcaggatttcatcagggatattggcctgtagc
-ttctttcgttttgttgtgttcttgtcaggttttggtatctgagtaatgctggcctttaga
-atgctatagggagaattccttcttcaattttttggaacagtttgaggaggattcatgtta
-gttatttatacatttggtagaacttggtaaaccagtgaatccttctgatcctgggctttt
-cttcagagattttttattacgaattcaatcttatcacacattattggtctgttcaggatt
-tctgtttctttttgatttaatgttggtggctggtatgtgtgtgggaatttaccttttccc
-ctagattttcctgtcagtgtatacttgttcataatagtctctgatgatcttttgtattct
-gtgatatcatgtgtgatgtctccttttttcttttctgattttaacacacaaaagtataaa
-tcactggtacagcaaatgcataaatgaggaaaagacccaaatgttaccactacagaaaac
-cactaaaccataattataaataagagagaaaaaaaaggctatacaaaacaaccaaaaact
-aattaccaaaacgacaagaaaaagtcctcatatataaatagtaagtttgactgttaagtg
-gattaaatattccacttaaaacatataggctgtctgaatgaattttttaaaaaagtgacc
-cagtaatgtaatgcctacaagaaactcacttcaactgttaagacacatagactgataata
-aagggatagaaaaagatatctcatgcacacagaaaccaaaagcgagcaAAGAGACGATGG
-CAGTACGTTCAGGTAGgagataagcttccatgacctcagctgccaccattccccacaatg
-ccccagctacccaagagaccctgagcccactcaactagtacattacttgtacaagtagta
-cgttactactatagctggcatttgagagagccactacagtaaagctatttgcaaccaagg
-aaatcataaaaagtctacataactcctcgacacgcccatcagggctaatgattgtggttg
-ccattgggaaacctgagggcaagcctgccccatcgagctgtgcccaactttgcccccact
-ttggggctgagaatggagcccatgccactgtgcattccacagacagaccatttcctgaga
-caatactgtttctcccagtaaacaaagatcaaatataaactccctgctatcaccgcatcc
-agctcttaactgcaagtgccacctactggcctggaggtcaaactgcacaacccgatagaa
-gtgttgacataagcgtacagtgctcgagaaaaagataagcgtctcaggacctctgccact
-caagatctgcaggagactgtgagcctcatcacatgcctagtacatcactactacaactgg
-catttgagaaagtcaccgcatgaaggctatttataaccaaggaattcatacagagTATAT
-GCCATTCTCCCCATCATTACCACAAgtgctggtgtttgtgcctgccaatgagctatttga
-aggaaagtttgacagtttagctccacccagctttatcctccccttaggggctgagcaggg
-agctcaggccagtgtatattccatagactgtcccttgcctgaggcaacagagagcttctc
-cccgtaaacaaagatcaagcatacacccacctgcttctgcccagattttattcataagca
-ccacatagtagcctggaggtctaactacacaacccagtaaaaaactggcttacacaagtg
-cacagcacggggaaacaagttaagcttcctaagacttctgcactctagccctgcaggagg
-cagtgagcctagcccagcacatcactactacaaccagcatttgagaaagccaccacacaa
-aggctatctataatcaagaaactcatacagactctttgccactgaaagcacccagaacca
-aggccaaataaccctacacaatgtatattataatcacatcctcaagggggaaaaagtcct
-gaccaaatgaaagtaaatttaaaaataagaacagatagttgatccaaatgagaaggaacc
-caagaaacaattctggaagtataaaaaaaagagtgttacaacaccccaaaggattgcact
-aactcttccacaatgaaccctaaccaaaatgaaatctttgaaataccaaagaattcaaaa
-tattaattttaaagaatctcagtaaggtccaagagaaagtaaaaaatcaatacaaatcag
-aaatataactcaggatatgaatgaaaaatctactaaagagatggattttttaaaatagtt
-tttttgttgtttgtttgtttgtttgttgttgttgttgttgttgttgttgagatggagtct
-tgttctgttgcccaagccagagtgcagtggtgcgatctcggctcactgcaaactctgcct
-ccagggttcaagtgattctcctgcctcagcctactgagtagctggaattacaggtgtgtg
-ccactacgcccagataatttttttttttatttttagtagagacaaggtttcaccctgttg
-gccaggctggttttgaactcctgacctcaagtgatctgcccaccttggcctcccaaaatg
-ctgggattacaggtgtgagcccactgtgcccagcctaaatagttttttcaaatgaacttc
-tgtaattgaaaaattcatttaagaaattacaaaatatagttgaaagctctaacaatagac
-taaaccaagcagaagaaagaggttcagaacttgaagacaagtctcttatgaattaaccca
-gtcagacaaaaataaagaaaaaaattttaaaaatgaacagagctttcaagaagtatgaga
-ttatgtaaagtaactgaacctatgagtcacaggtattcctgaggaaaaagaaaaagtgag
-aagtttggaaaaactatttgaggaagtaattggggaaaacctctttagtcttgctagaga
-tttagacatctaaatgaaagaggctcaaagaatgccaggaagatacattgcaagacagac
-ttcatcaagatatgtagtcatcagactatctaaagtcaacatgaaggaaaaaaattctaa
-aatcagcaagagaaaagcatacagtcatctataaaggaaatcccatcagaataacaatgg
-gcttctcagcagaaaccttacaagccagaagagattggatctaatttttggacttcttaa
-agaaaaaaaaacctgtcaaacacgaatgttatgccctgctaaactaagcatcataaatga
-aggggaaataaagtcaagtctttcctgacaagcaaatgctaagataattcatcatcacta
-aaccagtcctataagaaatgctcaaaagaattgtaaaagtcaaaattaaagttcaatact
-caccatcataaatacacacaaaagtacaaaactcacaggttttataaaacaattgagact
-acagagcaactaggtaaaaaattaacattacaacaggaacaaaacctcatatatcaatat
-taactttgaataaaaagggattaaattcccccacttaagagatatagattggcagaacag
-atttaaaaacatgaactaactatatgctgtttacaagaaactcattaataaagacatgag
-ttcaggtaaaggggtggaaaaagatgttctacgcaaacagaaaccaaatgagagaaggag
-tagctatacttatatcagataaagcacactttaaatcaacaacagtaaaataaaacaaag
-gaggtcatcatacaatgataaaaagatcaattcagcaagaagatataaccatcctactaa
-atacatatgcacctaacacaagactacccagattcataaaacaaatactactagacctaa
-gagggatgagaaattacctaattggtacaatgtacaatattctgatgatggttacactaa
-aagcccatactttactgctactcaatatatccatgtaacaaatctgcgcttgtacttcta
-aatctataaaaaAATTAAAATTTAACAAAAGTAAATAAAACACatagctaaaactaaaaa
-agcaaaaacaaaaactatgctaagtattggtaaagatgtggggaaaaaagtaaactctca
-aatattgctagtgggagtataaattgttttccactttggaaaacaatttggtaatttcGt
-ttttttttttttcttttctcttttttttttttttttttttGCATGCCAGAAAAAAATATT
-TACAGTAACTATGGAACACAAAGGTTTATTACATCCATAATTAACATGGAACATTTACTT
-ATCAGTTTGACAAGGACAACACTGAGACCTCTTAGGACAGAGAGAAAGGGCAATTTTCAA
-AGGAAAAAAGCATAGTATATGCATATttaataagtaaaacatacacataccctgtgactc
-agccattgtacatctagctgtttatccaagagaaatgacagcatatggctacacaaagag
-ttgcacacaaattttcaatggcagttttatttgtaatagctaacatctgaaaacaatcat
-aatgttcattagggggtaaatggataaatgatcatatatgcataaaaagtaatacaagca
-ataaaaaggaatgaactattggtacacgaaacatatatgattcaaaataattgccttgga
-tggaaaaagacaagcggaaaagtatacatgctatattacttcatttatgtaatattcaag
-agaatgccaagaaagctacaagaacaaatagcaggtcagtcgttgcctgggtatcatgga
-ggtagagggagggaagggaagaggaaagagtggatgccaaagaggaatgagaaacatttt
-gagagtgaaggatatatacattatgttgattaaggtaatggtttcaccagtgcatctttt
-gccaagttcatcaaattatacactctaaataatgcagtttaatgtacatcaattatatct
-caataaTTTGGAATGAAAAAAAAAAACTCCTCACAAAGAACAAAACCTCTAGGACCTGAT
-AGCTTTCAGTCACAATATAGTCAGGCACTCAAAAAAAAACTTTAACACAATAAAATTCTC
-TTTGAATGCCACCTTAAACTCAATCCCATCCAGAGAAAACAACTTTTATTAGAATGACAT
-GTGATTTGCATTTTTAGTTCATGCATTTACTTATATACACATAAATATAGCTTTTTCACA
-TAAATTAGAATCATTGCTATGCATGTTGTTCTAAAATGTTGCTTTTTCACTCAAAAAATG
-TTTAGTAAGATAAAATCTGCTGCACTCTTTTTAACAGAAGCACAGAATTAAATCATATGG
-ATGCACTTCGTTTTATGCTACTCTACAGAGTGACAAGACTTCTTTGTGCATTTATCTTTG
-AGCACTTATTTATTTCTTTGTAAAAGGCTTTCTAAATTTCCAGATCATCAACAAAGCATT
-AATTTGGTCAGTTAAAAAACAATTGCTTATATCCTTCTCTGAAAAGAATGATGTACAGAA
-AAGAATTATATATATATATGAATAATACATCATAAGTGTTCAGAAAGACATTGTATTTTA
-GGTGGAGAGACAGGCAGGTGACCAGACTGCTACATGCAGTAAGATGAACCCTGATAGAAC
-TAACACTGGAGGCTGTGAAAAAACTGCTAGGAGCACCCAGCCTTGGTAGAGCAGCATAAT
-TTCTTCCTGTAATTCTTTCTCTCCAAATTGCCATACACTTCAGCAGAGTTTGCAACTTCT
-CTTCTAAGTCTTTATCCTTCCCCCAAGGCATGCCTAGCACAGGACTCTTGAACAGTGATG
-CCTCAATTAGAGTTGCTAGCCAATAGATTGAAGCTATGTTGGCACAATATCCTACATCCT
-CCCGATCTACTGGCTGAGCCCAACCCCACCTAAGAAGGACAATAAAGATCTGTGTTCAGA
-GTCATACTGAATAGAGACTTCTGGACTCTATAGAACCCACTGCCTCCTGATGAAGTCCCT
-ACTGTTCACCCTTGCAGTTTTTATGCTCCTGGCCCAATTGGTCTCAGGTAAACAGAATCT
-TGGGGAAGAAGAAACACTGGCCTGGAACAGGGTCCTGCACATGGAGTCCCTGTTTCTAAG
-TGGTCTGTGGAAATGGGGTCTGGCTTCTCACTGGGAGCAGGGCTGAGATTTGTCCTACTT
-CTTCAGACCACCTCTGTTCTAAGAAACTTGAAGGCTCTCAGGATAGAGCAGGATCTGTGA
-TCGGAGCTGGGGAGGAGGGTAAGGCAAATCCCATACAGTTGCCTCCAAAGGTAGAAATGA
-TCTTGAAATCCCAAACTTCTATCCTGTCACTTCGGGTCAGTCCAGTCAAGCCCTGCCTCA
-TTTCACTTTTGTTTTTTTTGCTGCCGATATTCCCTCCTGAGGTAACAATTATATAATATT
-ACTTCCCCCAGTTTTCTTGGTCTTACAGAGAGGTCTCTGATTTTTTGTTTGTTTGTTTGT
-TCTTGGATGTGGTTAACAGAACAGGAAAGGCTGTTTCTATATATGTATAGGACTGTAAAA
-TGGAAAATGAAAAAAAAAATTCTGTGTGGGAACTATTGGAAGTCTATATCAGATTTCAGC
-TCTGTTTGTGTAAGCATTTCTTATTTTTAATTTATTCTGTAGCTTATATTTACAAAACCA
-AGACAAGAACACTGAAAGTTATTTAGAAATAAATTGGCCACATTTCATCACTGCTTGCAT
-TTTTTCACTTGTAACCAactgatatatgagcttataacctgctttatttttttacctacg
-attctatcaggaaaattttcacaggtcttgaatattccttgaaaatacaatttgcagtag
-atgcttataattctgtcatatttttgtaccaatattaacttggaaagtccttaattgtgt
-gtcatttggattattttttctaatgtgtgagtactgtaaataacattgtacaaccttatt
-aatatatcattgtgagattctctgtttgtataggtaaattttagaagttccattgcttgg
-tacaagggtattatttcttctaagttaactggcacatattgccaaTGGTTACTATTGGAG
-TATTTGTATTTTTAACATTTGTATTTCATATTTCTTGCAAATATTTTCAAACATATTGGT
-TGCTTCTAAAATGCATTATTTATTTGAGACACATAATTTTCATTTTCATGTCAAATCTAT
-TGGTGTTTTCTTTGCATTCTTCCACTAACTTAGTAAGTCCTTCTCCGTGTTGAGAACAGT
-TATTCACCTATGATTTTGTTTTTTACACCGGACTCAATCCCACCTTTTTACATAAGGCAC
-AATGAAATAAACTAATATTCTTTAGTATAATTTCCTAATGGGTTATATAATAACTCCATA
-GCCCGCCTCTAGAGATAGTAGTTTATATTCCCTAATTTGCAGAAATGTTCAAATTGATAG
-TGGATAAGAGGAAATTATAATGCTCTCATGGTTGTCTCAAAAGATGTTTCAGGCCTATTG
-CATCCTTGAAATTCTATGAGTTTAAATTGCCTGATTTCTCCCTCTGTCTCTGGAACATTA
-GTGACATACATCGACATACATCACATACTTGTATGTTGTCCTTTTTCTACACTTTGTGTG
-TGTGTATATATATTCTAACATATACATATATATAATGTTAAAAACTCAATCATCAGAGGA
-GGATTAAACAGCTGATAAGGGATAATAGTAGTGGTAATAGCATTCAAAAACGTTTGCTCT
-GTTCACTTACTGTCAAttacctcatatttctttcatttattgtacttatcacaatctgta
-gttattttgtttattcatttacttgtttattttctttctccccctctccaatgtaaggtc
-ctcaaatcatgtctttctgttcattgttttattccctgcatcttgcagaattcttgacat
-ggtaggcactcatcatatacttgttgattaagtACAGTAATGAGTTAAGCAAGGTAAGAA
-AGAGCTCCAGCGTCACTCTAGGGCCTCTATGTGTTAAACCATGTGATGAGATATTTTCAT
-ATGTATATAATATGTACACATATATAGGCAAACCCTGCAGAATGTCTCCCTAATGAATAT
-ATTCCTAATGGAATGGCTTTTTTTATTCTCAAAATTTTGTAAAATGTACTTATATCTCAA
-TATCATATAGGTATATAGGTATAGATGAAAATTTTTTATTTATCTTTCCATAACTTGACA
-TGACATTTTTAACCAGATAATATGTAAGATAAGCCTAGAGTTATCTTCTAAATATAATTT
-TTAGGATCTCAGAAACATGTAAGGGACATTTTGAAAATCTCACCAATTGGCAACAAAAGC
-CATATGTGTTTCAGTAATGGTGAGAAAGATGACAGCAATTATTTTAGCATTTCTTATTTT
-TGAAATGATAGTTTTTACTTCTGTTTAGGTGTTTGTGTTTTAGCTACATTTTAGGAAATT
-GCTTGGGGATTTTGTGTTCATGTATAACAACATGCTATATATTTTCCCATTTAAAATCAT
-GGGGAATTGGCCCCTGGTAAGTGTTTGTATACAGAATTCTGATTTCAGAAATGAGAATCT
-CATACATATCTAAAGAATTCTATGTGTGTTTATAAAATTTCACTTAATCCTCAAAGTAGG
-TATTTATGATTAGGAAAAACATGCTAAAGCAACTGGAAAGGCACTTGAATAAACAGTGCT
-CAAAAACTATTGCTATTTTTTATCCTCCTGTGATAAATACTTAGGCTTAATAATCTATAT
-AATTCCTTTATTCAGGTAATTGGTATGTGAAAAAGTGTCTAAACGACGTTGGAATTTGCA
-AGAAGAAGTGCAAACCTGAAGAGATGCATGTAAAGAATGGTTGGGCAATGTGCGGCAAAC
-AAAGGGACTGCTGTGTTCCAGCTGACAGACGTGCTAATTATCCTGTTTTCTGTGTCCAGA
-CAAAGACTACAAGAATTTcaacagtaacagcaacaacagcaacaacaacTTTGATGATGA
-CTACTGCTTCGATGTCTTCGATGGCTCCTACCCCCGTTTCTCCCACTGGTTGAACATTCC
-AGCCTCTGTCTCCTGCTCTAGGATCCCCGACTCATTAAAGCAAAGAGGCTTATTCTGGTG
-TCAGTTTTCTCTCTACAGCCCCCTTCCCACTTTCCCTCCATTCAACAGTGTCTGGAAGGG
-CACCACAATTTCACTGCACTCGCATTTCTATGGTAGAAATGCAAATAAGATAGGGGCCAG
-GAACAAGGGAGGGTTAGTCCAAAACACCCACTCAGGAATGATAGATAGTAGCAATGTCCT
-CCTTGAAGACAGTTCTAGGCCCACAGCTTGCCATAGCAATTATCAtcaaacttcatgtac
-atcagaaacacctggagagatggctaaagcacagatttctagggctcacttttagtttcc
-aattctgcaggggagcttgagaatttgcactgctcacaagttcccaggtgatgctagggc
-tgctggtccaggcaccacactgtgagaacAATTAGCTTATAATATGAAAGGATTGAAAGC
-CGACTGTGAATGTGATTTTCTACAGATTGAAGGCTGCATTTCCTATGTAGTTTTGGAGTA
-GATAGTAATACAAAatcatcctacagaatcctccgacaacaacctgagaatgtaggtatt
-ataacctcactttagagaataggaaactTGATTTCTAAGCATTAGAAGACTGGGACAGAC
-TAAATTGACTACTGAGAACATTCTGTCACTGCACCATGAGGTTGCCCAATTTTCTTCTCA
-CCCTGGAAATCCTCATTCATAGCTTCCAACTTAAATATGATGAAAGGGAGATCAAGAGCT
-CTATAATGTGTCCTGAATGTTAGGACAGGCACTCATCCCAAGCAATAGAATGTTTTCCGT
-ACATTACATTACATTGATGCTCTGCCTGCACCAATAAGAGAATATGACTGGGTGTATCAT
-AGTCATCCATCCATGCCTCAGGCCCACTTCCCTGATAGTTGGACAGGGAGAATAGGGAAT
-GCAGATGCCTTCGCTTTCTGGACACTTACAGTAGCTGTGTTTGTCTTTGTCATCTCAGTT
-TGCTCACTTATGAAATGCTAGCGTTTTACTCAGTATCTTTCTCCCCACCCCTGTCATAGT
-ACATCTTTCTGATTCTGAAGATATAAGATTGGCTTATGTTTTGTGGGGTCAACTTCACCT
-TTGACCCCATAAGATCCTAGAGATTTAATGTAGATATATAAAAGTTGGAGAAAACATTGG
-TGGAAGGGTTTTCTCCACTATAGACACAAATCCATGAGTGTCATCACAGACTCCTTTTCC
-TTCTTCACTTGATTCCAGTGAAGATCCATGTTCAttctaccacctccaatatgtaccatg
-acctctatctccagctgctgctaggatgattgcaatagccttcccattgattgccctgca
-ttcctttcacactcacgcctaactatcctccacaatgagagccagaatcatttttctgaa
-acacagatctaatcattagactcccctctggcatcttttcccatagcatcctaagacaac
-tcttcagagcagccttcatcactcttggcattcagaacctgccttgcgtttccagtttta
-cctccaaagcactgtcacagggcatcttgctatcccaccaacatacctcttcgtgattgg
-tttgaactcactggattgcttctggttttgagtttttgtacatacttttctgtctCCATT
-TATAACTGCCTGGAAAAAAATCTTTATTTTCTTCTGGAGGACTTTGATAACCACACTGTT
-CTACCCACAATAGAACTACTGCCACCATTTGTGCTCCACTGTTATGACTTACCCAGAATT
-TTAAGTCATCATGTCACATGCCTCACTCTGAATATCTGCTTATGTCTTCTCCCCTACTGG
-ACTTTGAAATTTTATTTAGGAACAGGAACCATCTTATCTTCTCTTTCTCCTACCATCCCC
-TAACAAGATTCTATATTAATTCTTGTTGAATAAGTAAGAGGGATTCTCGAAGGCCAGAAA
-GATCTTTGGATGTTACTGAAATCTCATTTTTATTTATTTTAGATCTTCTCCAGGAAACAG
-GCTTCTGTCTCCTTTAGAAGACATATCTATGATCTATGTCATTACATAGTAGAGGAGTTT
-TGAGAGGTGGCTTGTCCCATGTGGTAGGACATCATTGCCTCTTACACCCATGCTTATCTT
-TGCAGGCAGAACTCATGAACTCACACAAGAAGGTGGGCAGATGGAAGCAAGTTACTTCAg
-cagaggagaatagtaggaaaaaaacataactttagagctggatgtatctgaggtcattca
-tgatcccaccatatatccactcttggaccacagacaaatgatttcccatcttcgagcctg
-ttactgaatttgaagaacagagaaaatactcactcccactcaaggtactttgagggttgc
-cagagtaatctattaaaatgttaatcataTCATAGGGATTCAGCTGTAACAGGTTGTTCC
-CTGGATAAGAAACAGTACAGCACATTTCCCCAGGGCCCTGCCCACTGGGCCTTGGCTGTC
-TTGCCTGAGTATGGGTGATTATAGCCTATGTTTCACCTGGGGGAAGACGCATTAGGCTGA
-GAAGAGTGTAACAGAGTTGAGGGTCATGGGATCTCTTTGAACAGCCAGATGAGATTTTAA
-AGGTTCTAGTAGAACTTGCTGTGCTTACTTTTCAATAATCACCTTGATCACTACCTTGGA
-AACATCTTAGAGCTATTATCACATTGATTCTAGACGATGAATATAATCTCAGTGCTGCAG
-CCTGAAACATTGTCCTCCTGTCCTCTTGCCTTATATCTCATCCGTCCTTCACGCAGTGCT
-GGAACTTAGGTGGCAAATATTCTTTTCCCACTTTGGAGTTGACTAATGGCATTAGGAGGC
-CAAGGGAAAAGGAATCTTTATGGTGAGAGAAACTGCAATGTGCCAAGCACATTAATACAC
-AATTTCTTAAACAAAAGCATTGTATGATAATtatgacaacatgattaaagctgaggaacc
-tggagtaaaatgtatctagggttacatctaggtttgttccttactacttttactcatcat
-gtggtctctatatcaatttcttcatttgcaagacaggtataatcatgcatctacctctta
-gaatcactctaaaaattaaaatagataaggcatataggtcaccgtgatctctagcaccaa
-tgaaattctaagaaatgtagatttTAAAAGGCATATGAGATATAGGTTATTCTGGTTTAA
-AATATGAAACGTTTAAAAAATAAAATATGTAAGTCCTGAGTTTCCGGGAGAAAAAGGGTC
-TTGCACAAGAACAACCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCCGCATCTCTA
-CCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCC
-GCATCTCTACCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTT
-CTCAAGGCCGCATCTCTACCCCATCTCATGCGAATCCTGACGACGTCCTCAAAGCTGAAT
-AAATTTTTGCCTTAAATAAATTAAACGAGATTTAGATTTCACCAGTCACTGATACTCAAT
-CCCAATTGGATATTCATTCAAAAGTCTGACTTCTCTCCTGAGGTGAGAGTAAGATTCCTG
-GGCACTTTTTCATAATACTTACCTTAACCTAGCTAAACACAATGGACACTCTTCTTTGAG
-gtgtcagtggaaattaagaggagagtctgaactcttacctcccacatggggcttgcagac
-aggtgaagatggcgctcctcccctttgttggtaatggagacctagaagaaaggctgggca
-tccagctcccacgcagtcatatgaagcagcccagagcaacattccccttcactgcctgtg
-cggtggcagtagagacctagcAGTAGAGACCTAGCTGGGAGTCAGATCTCCCATCCCTCA
-ACCAGTGGTAGTGATTGGCCTGGGgaggaatcccttccctgctggtgccatgtcagtgaa
-aactgaggggagactgaaattgcccttccttccaatagtataaaaggcctgaagcagact
-tcccttcccagccagtacattaccattgaagaccaaggggtggtctcaacttcaatccct
-aGGGAGCCGTGGCTGGCATCAACCCTCCTTCCAGTCAGTGAGGATAGAGGATAGGAGGGT
-GCTGGAAAATAGGTGTCTTTAAAACTGAATAATGTTGTTTTTACCACAATTTTAAAAACT
-GAATAAGAAGACATGGCAGACCCCTGAAACTGGATAACTACACACGGAACTAACCAGAAT
-TAACATGCAGAAGGTTTGAGAATAGAACTGCAGTGGGGAATACCACCTAGATTTTTAaaa
-taacaacttgtatatatttaaggatatatgcaatatgatgttttgatatacatagacata
-gtaaaatgattgctataatcaaattaacatatccttctcttcacatagttatcatttttt
-gaggagacagcacctgaaatccatcttcttagcaaatttctagtatacaacaccatatta
-ttaactagagtccccatactgccctttagctctctagactttatcctacacaacttcaac
-tttgtacccttcgacgagcatccccccatttcctccaccacccgccccacccctgataat
-cactggtctacactcttctatgtatttgaatttttaaattccatgtataagtgagatcat
-gctgtactttttttctgtgtctgtcttatttcacttagcataatgtcctctgggttcatc
-catgttgttctgaatggcaagctctcctttgtcaaggctgaataatatgccattgtatat
-atatacaatttatttagtgtgttcatctatcgatgtcgatagatgataatgtcttcatct
-atcagcttaggttgatttcatatcttggctattgtgaataatgctgagcacagatatctc
-tacatggtgccgatttcatttctttttggtatataccaagacgagggattgatggctcat
-atactagttctgtttttatttttttgagaagcctccatactgttttacatcattgttgta
-ctaatttacatttccaccaacagtgcgcaaaagttccctttacattctcaccaatacttg
-tgatctcttgtctttgtgataatagtcatcctaacaagtgtgaagtgatttctcattgtg
-cttttgatttgcatttccctgatgattagtgatgttgagcacctttccatacacttgtta
-gccacttttatttcttctccagaaatatttctgttcatgtctttgcccaattttcaagtg
-ggctctttgttttttgctactgagttgtgtatgtttcttatatgttttttatattaacct
-tatgtgatatatggtgggcaagtattttcctcccatcccataaactgccttctcactctg
-ttgactgtttcctttgctgtgcaAcaaatgatcttcaatgataatacaaagaatatgcaa
-tacagaaatgatagtcacttcaacagatggtgttgggaaaactggatttccacaggcaga
-acaaatgaaatggatccttatcttacaccacacacacacacacaaactcaaaatggattt
-aaagacttaaatgtgagcctggcaaacttaaaactcctaaaataaaacagaagggaatat
-ctttatgactttggtctaggcaacagttgcttgaatatgacatcaaaaccacaagcaaca
-aaagcaaaaatatattagtgggactatggatacatttgaaacaaactacaaactagtaaa
-atctcagcaaagaaatagaagatataggccaggcacggtggctcacgcctgtaatcccag
-cattttgggaggccgaagagggcggatcacgaggtcaggagatcgagaccatcctggcta
-acatgataaaaccccgtctctactaaaaaaaaaaatacaaaaaattagtggggcatggtg
-acaggcacctgtagtcccagctgcttgggaggttgaggcaggaggatggcgtgaacctgg
-caggcggaggttacagtgagccaagatcatgccactgcactccagcctgggtgacagagc
-gagactccatctcaaaaaaagaaaaacagaaaaaagaaaaagaaatagaagatatgaaaa
-taatcaaatggaaattataaatttatgaaatgtaatcaaagtaaaaaagaaaaagtcact
-gtataggctcaatagtagatggaacatgacagaggaaaaaataagacagatctatagaat
-tacccaatctaaaaacagagaaaaatagactgataaaaatgaacagagccacagatacct
-gtgggacataaaaagatctaatgttcatgtcatcagagtcctcaaggagagggagagtgt
-ggaactgaaaaaaatatttgaaggaataatgcctgaaaaatatcccaagtgtggcagaat
-acatacatctgtaattcaagatcttgaattaacccaaaacaagataaacccaaagaaatc
-catgccaagataaagtataatcaaactaaaactaatagctagagacagaaaaaaatcaag
-cgagcattcagaaacaatacaccacccatggtaaaacaatggtttgattgatgggatttg
-tcatctgaaaccatggaagcaaaaaagaaatgtcatcacatgtttcaaatgccaaaataa
-agaactatcaaatccaaatcctatatctagcaaaaaaaaaaaaaaaaaagttctctagga
-ataaacagggaaagaaaaacattctcaaacaagaaactattaagggaatttgtcactagc
-agccctatcctaaaaatatagtcaaagaaagttctctaaaccaaaatgataaccgggggc
-ttggaacttcagaaaggaagaagtcgaagtcaatagaatgggtaaaatgggaggtgaata
-taatagactatgcttttttttttgctttattttttttttatgctttcttttcttgagata
-gtgtctggctctgtcgcccggacaggagtgcagtggtacaatctcagctcactgcagcct
-cgacctcctgggatcaaaggatcttccctcctgagcccagtgagtagctgggaccacagg
-agccggctaatttttatatttttttgtagagacagggtttcactgtgttgcccaggctgg
-tctcgaactcttagactcaagcaatctgctgcctcggcctcccaaagtgagactatcttt
-ttattaaagagttttgaaatcatgtttggtagattgaagcaaaaattgtaacattgtctg
-atgtggttctaaatagatgtagaggaagtacttaaacattataagctgggtaaggcaaag
-aaatttaaagtgaggtaagtttttatacttcattcaaacttgtaaaactttgacaccgta
-gactgtgataagttaggtacagcaaccactaaaaaaaataaataaatacaataagaaatt
-atagctaaattatagtggaattctaaGgaacaaatagaaaacaaaatataaaatggtaac
-ttaatccctaacatgtatcaaaaagataccccatacaaatattaatcataagaaagtagg
-aatggctatattaacatcagttaaagcagacttcagagcaaaacaaattatcaaggacag
-agagggaaattatataatgccaaaagggtcaatcaaccaagaagacatggcagccctgat
-cgtccacaaactgaaaaccagagtttcaaaatacctgaagcaaaaactgataaaactaag
-aggagaaataaatttacaatatcaggccaggcgtggtgactcatccctgtaattccagca
-ctttgggaggctgaggcaggcaaatcacttgagcttgggagtttgagatcacctgaggca
-acatagtgagacccccctctctataaaagatacaaaaactaaggtgtggtggcccacgcc
-tgttgtcccagctactcaggaggctgacatggaaggcttgagcccaggacatcgaggctg
-ccgtgagctgtgcactccagcctgggtgacagagcgagaccccgtctcaaaaaaaaaaaa
-aaaaaaaaaattacaatatcaacttcaacagttgatagataggacaactagacataaaat
-ccacaagggtgtagaagaatttaaaaataccacaaagcaacaggatctaatagacattta
-taaaacatttcatccaacaacaatggaatacactccttggtgtttatgccaaggaaatga
-aagtgtttttctccacaactcccgggcaggaatatcaatggtagtgttatttataatagc
-ccaaaagagtaaacaaccaaaacgtcattcaacaggtgaatgactaacatagggtggtac
-atccatacaatggaatacttctcagcagtaaaaaaaaaaaaaaaaatgaattattgatac
-atgcaacagcttatatagattataagagcattatgctgagtgatgaaaaaagacaaaggg
-tcacatagtgtgtgactatattcacataacattgtctaaaaattatgaaatgtagaacaa
-attagtgctttccaggggttatgaatagtcaggagagggagggaaatatgccagtaagac
-aataagagagggagatcttttcataatgaataattctgtattttgatttgttgatggtta
-aatgaatctaAGAAGGATCTGATAATCTAGTATTAGACGCATAGTACAGTAGTGAACTTT
-CAGCCTCTAGAGAagtgctctccaatagaagtaactaaaaagatggaaatgttctaaatc
-tgtactatacaatatgttagccactggtcatgtggttgtaaagcacttgatatgtgCTCT
-ATAATattttgagcaagtttcttatgttttctgtgcctttgagtttctcatttgtagaat
-ggagataataatatctacctcaaagtgttgctgtaaaggtaaatgagtttatgtatgtaa
-gacaccgacaggagtgccagcacatagaaagtgttatacaagggttagccattTGTTATT
-GTCATTGTTGTGTTTTGTTCTCTTTCTAATGTCTGGACCTTCAAAtgattcagactcatg
-ggaccatacttcattctgtttttataactttaacctgtaagattctcattttaattggaa
-tttcatatttaggaattcttgggtgccttggatatatgaagaaaagattcacatctgctt
-ccactaaacaactagcgaattaacaactgagatttcttataattaaattatttacttgat
-ttttttaatccatataaatagcttgaacttaggttgaaacccatgagaatttgtggctac
-agttcatagggttaatatttaccttctccatccagagccaaggttaaTGCTGACAAAATA
-CAATCTAATACAGATTAATCTGTGTGTGTGTGTATGTATACACTCGTGTCAGAGAGAGAG
-ATTTCATTCTTCCTTAGGCTGAGATTGTTGCCTTTGAATCTCAGGTTTATATAAGGGTAT
-CAATTATATGTCTTCCCTAGGACTAGATCTTAGCTTTATACATCTCACATAGCCATCAAA
-ATAATGTTCAACTTATCTTTCAGGGTTTGCAATCTTAGTTTTTGGCCTGTGCAGATTCCT
-TTCATTTTTGACGGTTTCTCAATGCAGTAATTTCCTTTTTACATTTACCCAACTTTTTTG
-GTTATTTTCACCAGATACATTGTTCAATATATCTATTCTACTATATTCTATTAATAACAG
-TCTACTATATATGTGTCTTATTGTCTAatattgctgaaatctttttttaatccaataatg
-aatctctgtcatctaatcagtgagtttaagccatgtgaatgtattataactactgatcta
-ttaggacttttttctgccCTCCAGTTGTGACTTATCTATTCCTCATTTTTTTTAGTTTCT
-GTTGGATGGATCATATGTTCTTCTGCTAATATGaatattataattttatttttatttgtt
-ttattaaaaatttGTCCTTGCTCTTAGGACCCATTCCTATCCTTATATTTATTATTACTA
-ATTTAACATCCAGCTTCAGAAATACAACTTTAATAGGAAGGCTTTTTGTATTTCTCCTGA
-CTGCTCAGACTTAGGGTCTTTATTTGATGCTCCACCACCAAGTCACCTATAAGGAAAGTT
-TGCATTCACAGGAAGACTATAAATAATAAAACCAATCCCTTGACTAGGACTTAAACCATG
-TAAAAGCTGGTGGCAAAAGTAAAGGGAGGTGACCCTTGAGACCTCTGAGGTAACTGCTCT
-TAAATTTACATTTGCCTCTAAAAAGGATTTCTTATATGTCAACATCTCTCTGTTTAAACA
-TATTCTTGTGTAAAACCACTACGTGACCTGAATAATGGCCATAGGGCTCATCTCTAAGCC
-AACTGGCTTATTTATTTAATGCATCTCAGTGGTTAACAGGGTTGAAATTTTTTGAAAACT
-GCAATCAATGATCAAAGAATGATCTAGGTAAACATCGATTCCTTGTGGCAACATTTTAAT
-ATTTTCAAAGACAAGGTACAACTGGTAGAAAAAAAATACCCTCATGCATCTTTttcttct
-aattgtggtaaaatatatgacataacattggccattttagccatttttCCttttattttt
-agttgacacataattgtacttatttataggatacaaagtgatatttcaatacatgcatat
-aatgtgtaatgatcaaaccagggtaattagcatatccgtcacctcaaacatttatcattt
-gtattgggaacattcaaaatcctctcttctagccttttaaaagtatacaataaattgtag
-ttaaccatattcaccttacagtgctacaacaccagaagtcattcctcctatctataattt
-tgcatccattagccaatctctctccatcctcccctctccctaatcattaccagcctctaa
-tattaatatctgcaacactactctctacttccatgtgctcaacttttttagctcccatat
-ataaataggaacatgtggtaatctttctgtgcctgacatttcacataacataatgtcctc
-caggctatccatgttgttgcaaaggacagaatttcattatttttatgggtgaatagtatt
-ccattgtgtGTGTGTGTGTATATATATATATATATATTCCATTGTGTGTTATGTATGTAT
-AGTATTCCATTGTGTGCatatatatgtatatatgtgtgtacatatatatatacataatat
-atattcttctgcacatggaaatccagtttctccagcatgatttattgaagagggtatcct
-ttccccagtgtatgttcttggtgcttttataaaaaatcaggtgacCTCAGATCAGACCCA
-ACTACATCATACCTTCTTTCGAAATGTGCAAGAAACCTACTAGAAATTCTTATTGTTAGA
-GTTTCAGATTTATGTCCTGGTTTATACTGCCACATTCATTCTTGGAGGTGAGTACATTTC
-GATCTTGGTCCGGCTGCGCAGAGAGTCAAAGCAGGAAAATCACAGATTCTTCCCAGCAGT
-CTACAGCCTACACAGCGGCATTTGGTGCGATGGGATGGAACATGCTGTATCTCTATTCCA
-TGTGGGGGTAAAGTGGGTGGCCTGAAATTTCCTGTGTCTGCCTGCATGATGCAAAGCTCA
-CAGTTCAGAAGCTTAAGGACACACTTCATATCATCCCATCTGTTCTGGTTCAGTGCATAA
-GAATCTAAGTCTCTGAGGAAGGTAGCATAGTGTGCAGTTCACTGGACCAAAAGCTTTGGC
-TGCACCTCTTCTGGAAAGCCTGGCCATGGGGCTCTTCATGATCATTGCAATTCTGCTGTT
-CCAGAAACCCACAGGTAAACCAAACCAGAAGCTCACTCAAATCAACAGTGGGATGGAGCA
-TTTTCAGGAGCCAAAGGGAACTTCATAATCCACACTAAAGGGAAATAGAGCCCCCAAAGA
-TGGCTAAAGTTTATCCAACATCATCAGAAATTTCCTCTTTCTGGAGCCTTATTCCATGTT
-ACTATCCTTAAAGAGGAGTACTCACTGAGCTAAAAAGAGGTCATAATTTCTTCTGGGAAA
-GATGTGTTGTTATAGAAAGGAATGATGCCAATATCTAGGGATACCTTTATGTCTTTGGAT
-ATGGTTTTTACTCTGATGCTCAGCTATATTTCCTTTTACTCAAATATATATAtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgCATGAatagaggaagaagcaaattttggagttaggt
-ttaagaaacatgccttcaatatctactagtttgtcaactttaagtagtgaagactctagg
-agcctcagtttcctcatctatggagataatgacacctggttaacaggggttttattaaat
-gatataacctatgtgaagcttggcacatactgagaactcaaaaatTAGAGTTTCCTTTCC
-TCTTTCAAAACCAGATTTCTTACATGTGTCCCTTATTATAAGAATAGTAATGGCCTATTC
-CTGACCCTCTACATTCCTAAGACCCAATAGACTACTACCTTACTGGATAACATGAAAGTC
-ATTCTTGACCCTGATAGTGGGTTTGAACTCAGGAGAACAGTTTGATTCAGACATAAACAC
-ATAGTAACAATACATTGTTCTCTGGGCATCAGAGGAGGTGCAGTAGAAGGTAGTGCTCTG
-GGAGCATTCAGGATGCAGGCAGATTTGCTGAGGTTCCTATGTAGAGCATAGTTCCATAGC
-CTAGAATCAAGGGTTCAGCTCCTTTATTTTCTCAGATAAGATCTTATGTTCTTGGCAGAG
-TCTATCAGATGTTAAGGGAGGCCTAAAACCTCACAGGACCTAAATATAAGTGATCCAGTT
-AAATACAAACACTGAGGTTGACCTTGTCGGAAAATCCTCTTCAGAATATATGAGGGTCTG
-CCTTGTGGATACCCCATACCCCTAATTCCTACAAGCCTCCTCTGTCTTCCCCAAAACCAA
-CGTGCCTTCAGTCTCAAACACTGATATTGTTCTATTGCTCCTTTCTGTGTATAGTAACCG
-AACAACTTAAGAAGTGCTGGAATAACTATGTACAAGGACATTGCAGGAAAATCTGCAGAG
-TAAATGAAGTGCCTGAGGCACTATGTGAAAATGGGAGATACTGTTGCCTCAATATCAAGG
-AACTGGAAGCATGTAAAAAAATTACAAAGCCACCTCGTCCAAAGCCAGCAACACTTGCAC
-TGACTCTTCAAGACTATGTTACAATAATAGAAAATTTCCCAAGCCTGAAGACACAGTCTA
-CATAAATCAAATACAATTTCGTTTTCACTTGCTTCTCAACCTAGTCTAATAAACTAAGGT
-GATGAGATATACATCTTCTTCCTTTTGGTTTCTTGATCCTTAAAATGACCTTCGAGCATA
-TTCTAATAAAGTGCATTGCCAGTTTTCTGTCTCATTTTGTTCTTTAACCAGGGGTTGAAC
-ACTCATTATATACTAGGTAATGAATTGATAAGAACTCAGAACCTCTCCTTGAAAAGGGGA
-TATGACAAGTACACTAAAAAAAAAAAGTCCTATAGTGTGGAAGTCTGGAATAAGAAACTC
-AGAAACACTGACATGTAATTTAGGAGAGGGAAAGGTGAAGCAAATATTCAGGGGAAATTC
-ATGAGTAAGTTTAGGAATAAAGCAGTGTCTTGTAGTAAATAAGTAAATAGTAAAGCAGTA
-AATAAGTAGGATTTCCATGGATGAGGTTTGGTAGGGAAGGCAATTTGAGTGAACAGAATG
-GGAGGAAATTGGAAAAGACAGAACATTTCAAGACACTATACATGCACTTTGTTTGGATGA
-AGAACAGAGCACTCAAAGTTGAACTATGGGGGAAGTCTGATTTCCTAAGCTCCTGTGTAC
-CAGCAGTGAACTGGGAAGACGGAGATAAATAAGATTCCACTGTTGTGGAGCTCAACAGTG
-GAGCTCAACGCTTCCTCTATGAAGTGGAGAAGACCTAAGTAAATAACTCCAACACAAAAG
-TTTTTAGGTTTTTGCTttgttgttgttgttgttgttgatgtGTTCATCTTTTTTGTTATT
-GGGGCCCTGTGGAGTTTAGGGGAAATGTAAAAGATCTAGGAATTGGTCCAAATTGTAGTG
-CTTTCATTGTCTTGATATGCAAGAAGAATAATCCATGTACATACTCTGCTGAATTCTTAA
-AGATGTACCTTCTGAATATGATTAACATGGAAAGTTTCTTCTTCAACTACATTTCAAAGT
-CATTTGCTAGTTTTGTTTCTTATATCATTTCACCATAACAATTACAAGCATTTTAAAGAT
-TTAGTTCATCCACTATAACATTTACCACTAATGTGTGGCATGTGTTCTCTTAATCTCTCT
-CTTTCTGGTGttctagggctggtatagggagcacctaaaacaagcctaaaatatcttgtg
-gtgccagaaagtaagcaattgcttaataatcaaaggatagggtctgcaaacacggacaat
-ttgacttcctcttttcctaattgaataccctttatttccttctcctgcctgattgccctg
-gcgagaacttccaacactatgttgaataggagtggtgagagagggcatccctgtcttgtg
-ccagttttcaaagggaatgcttccagtttttgcccattcagtatgatactggctgtgggt
-ttgtcatagatagctcttattattttgaaatacgtcccatcaatacctaatttattgaga
-gtttttagcatgaagggttgttgaattttgtcaaaggctttttctgcatctattgagata
-atcatgtggtttttgtctttggctctgtttatatgctgcattacatttattgatttgcgt
-atattgaaccagccttgcatcccagggatgaagcccacttgatcatggtggataagcttt
-ttgatgtgctgctggattcggtttgccagtattttattgaggatttttgcatcaatgttc
-atcaaggatattggtctaaaattctctttttcggttgtgtctctgcccggctttggtatc
-agaatgatgctggcctcataaaatgagttagggaggattccctctttttctattgattgg
-aatagtttcagaaggaatggtaccagttcctccttgtacctctggtagaattcggctgtg
-aatccatctagtcctggactctttttggttggtaagctattgattattgccacaatttca
-gatcctgttattggtctattcagagatgcaacttcttcctagtttagtcttgggagagtg
-tatgtgtcgaggaatttatccatttcttctagattttctagtttatttgtgtagaggtgt
-ttgtagtattctctgatggtagtttgtatttctgtgggatcggtggtgatatccccttta
-ttgtatatgtagaaaaccccattgtctcagcccaaaatctccttaagctgataagcaact
-ttagcaaagtctcaggatacaaaatcaatttaccaaaatcataagcattcttatacacca
-acaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaaaga
-gaataaaatacctaggaatccaacttgcaagggatgtgaaggacctcttcaaggagaact
-acaaaccactgctcaaggaagtaaaagaggatacaaacaaatggaagaacattccatgct
-catgggtaggaagaatcaatatcgtgaaaatcgccatactgcccaaggtaatttacagat
-tcaatgccatccccatcaagctaccaatgcctttcttcacagaattggaaaaaaactact
-ttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaaag
-aacaaagctggaggcatcacactacctgacttcaaactctactacaaggctacagtaacc
-aaaacagcatggtactagtaccaaaacagagatgtagatcaatggaacagaacagagccc
-tcagaaataacgccgcatatctacaactatctgatctttgacaaacctgagaaaaacaag
-caatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgta
-gaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatta
-aagacttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacca
-ttcaggacataggcatgggcaaggacttcatgtctaaaacaccaaaagcaatggcaacaa
-aagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaaa
-ctaccatcagagtgaacaggcaacctacaaaatgcgagaaaattttcgcaacctactcat
-ctgacaaagggttaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaaa
-caaacaaccccatcaaaaagtgggtgaaggacatgaacagacacttctcaaaagaagaca
-tttatgcaaccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatgc
-aaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaagt
-caggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttggt
-gggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatctag
-aactagaaataccatttgacccagccatcccattactgggtatatacccaaatgactata
-aatcatgctgctataaagacacatgcacacgtatgtttattgcggcattattcacaatag
-caaagacttggaactaacccaaatgtccaacaataatagactggattaagaaaatgtggc
-acatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgtag
-ggacatggatgaaataggaaatcatcattctcagtaaactatcgcaagaacaaaaaacca
-aacaccgcatatcctcactcataggtgggaattgaacgagatcacatggacacaggaagg
-ggaatatcacactctggggactgttgtggggtggggggaggggggagggatagcactggg
-agatatacctaaggctagatgacgagttagtgggtgcagcacaccaacatggcacatgta
-tacatatgtaactcacctgcacaatgtgcacatgtaccctaaaacttaaagtatttaaaa
-aaaaaaaaaaggatagggtcatattaaaagaacacaggagtcggtctaaaagagcttcaa
-atgaccaaagctgcgacaatttgagcaataaaataaataagatagcattggattataata
-caacatataataaatatctatgagtccatgatgatatgaataaataattgaataaattgg
-aaaattggtgagaacagatgtgccatatagaataattcccaataattcatacagatactc
-cctgctgaagaaggtggagcttgacctccctctcccttgagcatgggctgtatttagcta
-cttgtttccaaagagaagtgtgtggaaaggagttaaaaaataatttcacctggataaacc
-tgataaggtcatgtttcagattttatggagaaatcatattgataacatgaacctgtgata
-tgatctgatgagaatggcacttcacttctgttttcttcctcccaaaaccctgcgacccaa
-gacaaacaatgaaaaacatcagaaaaactcaaattcagtggcattctaaacaatatttga
-ccagtatttctaaaaactgtcaaatttatcaaaaaggaagaaattctgagccacagtcaa
-agaccagagaagcctaaagagacaggacaactaaaggtaatgtggtatcctggatggact
-cttggaacaggaaaagaacattaaggaaaaactagtggtgataatagtaataataataag
-tgtagagtcatttagtagcaatgtatttagctgtgatggctgcattgtggtaatataaga
-tgttaacaatagcagaaactgggtgaatatttgggagctctctgtattatctttgcaaca
-tttctataaatctaaaactattctaaaactgaaaatgtatttAAATTTTAGAAAACTGAC
-CACAAAATCAATTTGGCACATTCCTTTTCTTCTTATTTACGAAAGAGCTTCTCatttctt
-cattgaatgcttggtagaatctaatggtaaattcaactggaacggaactctttacaggaa
-gtattgttatagattaagtttattgcaggttaaaaggcaattcagttttctatgccttct
-agtcaactgttgtatttggcatatatacttttcccatgttctaagatttttatacttgct
-atcctaaaactcttgtaatatcttctttttatcttattaatgcctgtaagatatgtaatg
-acaccttctttttcatttttgacatctattatttgttttattttctcttttttcttgata
-agtctcacattcacttattaatttgatttatctttacagaaaacaaattttcttcattaa
-ttttAGTTTAGTTTCCATTTCTTAGACtgtgacttgcattgcccaattgaaagtgattga
-aagtgacaggttcacttccaagtggaaacttaagagccagtgtgtccatgtgcagtggct
-cacacctgtaatctcagcactttgggatgctgaggcgggcagatcacctgaggtcaggag
-tttgagaccagcctggccatggtggtgaagccctgtctctactaaaaacacaaaaattag
-ccaggcatggtggcagggcctgtaatcccagctatttgggaggctaaggaaggagaatca
-cttgagcccagaaggcggaggttgcaatgagctgagatcatgcctctgcactctagccta
-ggtgacagagccagactctttctcaaaagaaaaaaaaaaagagccagtgtgcagtttaac
-cgtctctcatctctctgccaaggtgattgtggaagcactgttgacatagagcctctgtca
-gcctgaagccccgagtgaccatgaaagcagggtcattcttttgacctaaaatagacatct
-agcactgccagaaataaccttttgggaagttactctatgagagctgaggtttgtttttta
-ttTTGttttatatatattttttaaatCAGGAATAACTTAGACCAGGGTGAACAAACTACT
-GCTGTCAGGGCAAATCCAGCCCATAGCCTGCTTTTGGAAATAAATTTGTATTAGAacaca
-cacacacacacacacacacacacacacacacacacatacacacatacacacaAATATATC
-TTCACTAATGTTCTTTTTTTCTTGTTTTTCAAAAACTtttacataccataaaattcacct
-gttttaagtgcacaatttagtgTCATTTCTATTTTTTATTTTCGgtatgcttttcttttt
-gtaactttgttaggtgcatgtttatctttataaaagaaaagccttccttcttttcaaata
-tgagagtttaaagttgtaagtttctctctatacacagcctgagcaccatcccacaaattt
-tcaatatagagtatgttcattgttacattataaaccttctcatttctcttAAACCATGAG
-CATATAAATAACATATAGATTATATAAAGACTATGGATACAAATGTTAATCATGCAATTT
-TGTCAACTAGTTATAATTACATATACAGTAACATTACTTTGGTGATATGTAAACCAAAAT
-GTAAACAAAACTTGAAAGCAAACAGAAAATATCATATGCAAAAACTTGTACACACTTGTT
-CTTCATACAGTTTGTTTTCAAATATGATCTTCTATCTTGTTATAGGTTTTCTATGGCTTT
-AAACTGACATTTATTTTTCATTTATATTGTCCTCTGTTATGATTCTTCCAGTCCTGAACT
-TCCTGCATCAGTAATTTTTAAAGATATTTTTGGTTTACAGAAGTTTACCAATTATTACCA
-TAATTTATCATCAATTTATTAACTCTCACCATCATTTCAAAAGTGAAAGAAATTTCACTA
-CCTAAAAATATGTATGTATGACATTTTAGAAGAAAACAGACTTTTAACTAAATGCATTCA
-TGTCTCTTAAAATTTAGTTCTATCATTTTAATTTTTTTCATTTTATTACAGACCAGTTTA
-AACTTTGTCAGAACCCCATTAGGGCCCATGTATCCATTTAACAACAAAATTCTGTAATTC
-TTAAATTCTCAAATTCATAATTTATATAACCACTGATACCCAATTGGTAGTAGTCTTCTG
-AGGAATGTTTCTATTCCATTATTCCTTGTCTTCTCTAATCACTCTCTGAATCTAAACTTC
-TCTTTAGTTTTTTTTCCCTATAATTAGATGTTGAGGTGTTTGGCTTACTTATCTTCTTTA
-TTAGAATAAATAATATGTATCCCATCCCTAATGATTAGCACTTTGTCAATTTTTATATGT
-TTATGACAGGTGGACTCACTCTTATTCTAAACTCTGATATTAGTGATATCCAATGCCCCA
-TTCAGAGACCATTAAATTAAAAATGCACTTATTACTTCTGGGACTTTCTAGACAATTTCC
-TTCATCTTTAAAAGATCTGGGACAAACACCACAAGCTTTGTCCCACATGAAAGTTCTCTG
-CCCAAGTAATGAAGCATCTAAAAATGCTAGTAaagatattagattttaatataacacatc
-aataattatatttaatataaatgatctaaatcaggggtccccaccccccaggccatggac
-cggtataggtttgtggcctgttaggaactgggccacagagcaggaggtgagcagcagtgg
-gagtgagcattaccacctgagctctgcctcctgtcagatcagctgtggcattagattctc
-ataggagtttgaaccttattgtgaactgcacatgcaaaggatctttgcgtgctccttatg
-agaatctaatgcctgatgatccaaagtggaacagtttcatcctgaaaccatcttcccatc
-cctgccagtttatggaaaaattgactgcattaaaccggtccctggtgccaaaaaggctgg
-ggaccactgatctaaatacaccaataaaaagaaaaagattgtaagattggattttaaaag
-acctgactctatactgaccacaaaaaaAAACCCTCACTTTATTCTTTattgcatatattt
-atggtgtacaacatgatgttttgatacatgttgtgaaatggttaatatagtcaggcaaat
-caacacgttcatcatctcacatagtttccctttgtgtgtgtgtcgcaagagcacactact
-tttttaacaaaaattccaagtaaaatataatattatcatagacctcacgttgtacattag
-acctctagacttttttaatcttacgtatctgcaattttttatcctttgacctacatctct
-ccatttccttcccctccaaccacacccctggtaacgaccacattattctctatctccttg
-tattcagctttccttttttttcttttaagattccatgtataagtgaaatagtgcagtatt
-tttctttctgtgtcagtttatttcatttagcataatgttcttcatgttcattcatgcctt
-ggcaaatggcaggatctcctttttgaagagtaaataatattccattgtgtgtgtgtgtca
-cagtttatccattcatctatcaacagttcacttgtttcaaaattttgactattgtgaata
-atgctgcaataaatatgaaagtacagatacctctatgaagttaagtggtgatttcatttc
-atttttttttttaaagacagggtgtcacagtgttactctgtagcccaggctggaatgcag
-tggtgcaatcatagctcactgtaaatctcaaactcctaggctcaaggaatcctgcctcag
-tctcctgagtagctgggactacagacacacaccatgcttagtcaatgttttttaggtaca
-gggtcttgctgtgtagcccaggctgggctcaaagtcctgacctcaagcaatcctcctgct
-ttgacttcccaaattaccgggattacaagcatgaaccacctcactcagcctggtagttct
-atttctaattcctttagaagccttcatactgactccacaatggctacatctgtctacatt
-cccaccaagaatgtacaaaggttcccttttctccacaccctcattaacaattgttatatc
-ttgtctttttggtaatagttatactaacaggcatgaggtgatgtctcattgtggttttga
-tttacatttccctaatgattagtgattttgagccccttttcacatacttcttggccattg
-ttatgtcttctttggagaaatgtcttttcaagtctttgtccatttttttaattgggtttg
-gtttttttttactgctactgagctgtatgagttctttatatattttatatattaatccct
-tatcagatatatttaatataaaGACAAAGAAAAGCTATAAGACTTTATATCTTAAaaagc
-tggagtggctatattaatattgaacaaaatagatttcaaaacaagaaatactaccaggga
-tcaagacgcacagaaagaagtcaattcaccatgaaaatataacaatactaaatgtgcatg
-caactaacaatagaacttcaaaataaaagcttgtagaactaaaaaagagaaatagagaaa
-tcttcacctacaactggagatttTTAgactgacattagcaagatggcagaataggaggtt
-ccaagcatccctcctctcaacagaaaattcaactggcagatatccatgacaagagcactt
-tggtaaaaatcccaaaacttggaaataagccaaagacacccatgttgaccacagaactga
-ataaaaaccacattagaagggggaagagaaaaggtctcactttgaccaggccacccctcc
-tccactccctcgcccaagttggcacaccactatgcagacaggattgccctaggcctacag
-tttctccagtgggaaaagaaaactaaagatgaacattcagcttccttagccattcctgga
-atattctcagaaagcccatttcagtctcagttcacagggaaagcaggggataacggtgtg
-gttagatcacctgggttcagatagaaaaaaagaaaagggggcattgctcacagtgaccag
-tatgaagatactgttggtagctctgtgtcactgccagcagaggtaccagccaacagcata
-agccacctgcaaagccaagctggtcactcccagaagcacagtggaaatttccatctggct
-tgagtccctagatggccagcctccacagccagcctcaaatccctccccaaggccccacgc
-agaaatggagatacctgcaacaaagcatttcaaacaaaagaaacaactgagacttgtgcc
-ccagggcatttaaacagtggctcagactcaaagctcactcaaggagggagatgcccacca
-cagcacctttcagcaaagcccagaggctggactagccacacccagaagtataaatggtgg
-ctcacctcagcctcaaagcccaccccaagtctctgcctaggcaagggggcaagcctcaac
-catgcatttcaacaaagcatagcagctggtcccaactaccctgaacaaaacctatctaac
-ctcaggacccaaacagtggtagtgcccggccGGGGAAAATACCATGTCTGTTAAGGGTTC
-TTACCATGATTTTAAAAAAGAAAGaaaacctatacacagacattcccaacagctttattc
-ataattgccagaaattgaatacaatctgaatatccttcactgtgtggcttttaaaaaatc
-gcatttatagtacatccatagcatggaatattacttagcaataaaaagaaacaaagtatt
-catacaagttggagggatcttcaaggaacactaagagtaaaaatgccaatttaaaaagat
-tacatatctatgattccatttatatggcattcttgaaatgacaaaattatagagctagag
-aacagattcctgtttacccagggttagggaaggagggagaaggctctcactggaaaaggg
-tagcacaaggagtctatgtgataaactgttttgtgtcttgactgtaatggtggtcacaaa
-aatcaaagcatgtcataaaattgtgtaaaactaaatacatacctacatgcacacacacaa
-acaaatgactacatacatgtaaaactgatgacatctgattaagaccaatggagtatatca
-atgtcaatttcctgattatagttaaacaagatgtaaccattggagggaaaaggtatatgg
-gatttctctgcatgtaggtaagtctaaacatatctcaaaatTATTTTAAATGTCAACTTT
-TAGGAACAGCTGATATTTTCTCTGTATTTATCCTAAATCACTAAGGCTTTCACAAGATCT
-CTGCTCCAAAGACCACCATATTTCTTTTTAAATGACATATCTATTGTGAAATGCATTTAT
-GATAGTCAGTATTCTCATGCTGTGGAAATATACTTTAAAAAGAATATAGTCTTTATCCTA
-TACTGAAGCTCTTGTCCCATCCTGTCCTTTTCAAACACTCAGCAGTTCAATTGAGCTTTA
-CAACTTCCATGCACTTCACAAAAAGAAATAAAATAGTGGAGGCTACGCTGATCTCAGCTG
-GTTTTCATATATTTGGGGGTCAGAtggctatagactgatataagctagcctctgctggga
-caactgggttcttctccaaaatgtctctcttgtccttcctgcagactagactggtcttgt
-tcacctgactgaggcagggttccaatggagaaggcaaaggcacacaggccttttgaggca
-taggcttggaaatagcacaatttcatttgtgccatattctCTCTTTTTATGACTTTATTA
-TTTGAATTTGTATATTGCACAAGACTTCCTATTGTTCAGATTTCATTTGCTTTCTTTCTC
-TTGTATTTTAACATCCTTCACAATTCTCACATCATTATTAAAAGTTGCACTTAACCTAGT
-AATAGATAAGCATTAGCTGAAATTAGTAATTGCTTAACTTCTATCCTACACTACTTTATC
-ACATACTAGTGTGTCATGTTTCATAGTATAGGAACAAAGTAATCTTGCACGATGATATCT
-CTGATGCATACCACTATATTTTTGCTCATGGAATGACAGCAAAATTAATTTTTCTGCTGC
-CAAACTAATATTCAGCCAATCTTTTATTCATCAAATCTAACTACTTAGACCAGGGGCAGT
-TTCCTTTAGAGTTAGACTGTAATTTGTGTACTAATTTTTTTTTGGTTTTTTGTTTGTTTG
-CTTGTTTTGCTAAGGGAAAAATTTATTTTCCTGATGTAtttattattttttagcttttat
-tttagttttagttttaggaatacatgtgcaagtttgttatataggtaaattgcatgtcat
-gggtgtttggtgttcacattcttttgtcagccagataaCCATATTCTCTCTTTTAACGCC
-TATTTaaaattatatatttttaagctatacaatgtgatgttttgatatacatatgcatAT
-TTAAGCTATACAATGTCATGTTTTGTTGTACATATGCATATTTAAGCTATACAATGTCAT
-GTTTTGATGTACATATGCatatttaagctatacaatgtcatgttttgatgtacatatgca
-tcttgaaatgaatactatagtcaggctaattaacatatcagtctcttcacgtagttacca
-ttgtgtgtgtgacaagaatgcttaagatctactctgatagtaaatttcaactatataata
-cagtattatCTCTTTTTTAttttttacttttatttgtttatttttttgagacagagtctc
-tctgtgtctcccaggctggagtgcggtggcgccatctcggctcactgcaagctctggctc
-ccaggttcacgccattctcctgcctcagcctcctgagcagctgggactacaggtgcccac
-caccacgcctggctagtttttttgtatttttagtagagacggggtttcactgtgttagcc
-aggatggtctcgatctcctgacctcgtgatccgcccacctcggcctcccaaagtgctggg
-attacaggcgtgagccaccacgcccagcctttatttatttatttattttgagatagagtc
-tcgctctgtggcccaggctggagtgcagtggcagcatctcagctcactgaaatctctgcc
-tcccaggttcaagcaattctcctgcctcaacctcccaagtagctgggactacaggcaccc
-tccaccacacccagctaatttttttatttttcatagagacggggttttgccatgtcggcc
-aggctggtcttgaactcctgacctgaagtgatccacctgcctcggcctcccaaagtgctg
-ggattacaggcatgtgccaccatgcctggctGatttttgtatttttagtagagacggggt
-ttcaccatgttggacaggctggtctcgaactcctgacctcaagtgatctgcttgcctcag
-cctcccaaagtcctgggattacaggcgtgaaccactgcttccggccacagtattatcaac
-tgaggtccccatgctgtgcattagatctcaaaaacttaatcatcctacaatactggaacg
-tactctttgaccaacatcttttgattctgccaccattgcttctgataatcactattctct
-ctccttctatgaatttgacttttcaagattctacatgtaagtgatatcatgcagtatttt
-tcttcctgtgcctggcttattttacttagtataatgtcctccaggttcatgcacattgca
-caaacgacaggatttctttgttttaagactgaataatatttcatATtggatacaacctaa
-gtgttcaacagatgaatggataaacaaattgtggtatatacCACCTGTTCTCCCTTGTAA
-GTGGAAGCTAAAtgtcaggcctctgagccgaagctaagccatcacatcccttgtgacctg
-cacctatacgcctacatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggcc
-tgttcttgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgc
-cttaactgatgacattaccttgtgaaatcccttttcctggctcatcttggctcaaaaagc
-tcccccactgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttga
-ctgtaattttcctttacctacccaaatcttataaaacggccccacctctatctcccttca
-ctgactctgttttcggactcagcctgcctgcacccaggtgaaataaacagccttgttgct
-cacacaaagcctgtttggtggtctcttcacacggacgcgagtgaAATtttggtgccgtga
-ctcggatcaggggacctcccttgagagatcaatcccctgtcctcctgctctttgctccct
-gagaaagatccacctacgacctcaggtcctcagactgaccagcccaaggaacatgacacc
-aattttaaatcaggtaagcggcctttttgtactctcttcttcaatctcactatccctcaa
-cctctttctcctttcaatcttggcgccacacttcaatctctcccttctcttaatttcagt
-tcctttccttttctcctagggacaggagacgcattttatccgtgaacccaaaactccggc
-gtgggtcacggactcagcaaggcagacttcccttggtgtttaatcattgcgggaatgcct
-ctctgaatattcacccacatttcagaggtgtctgaccacatggggacgcctgccttggtc
-cttcacccttagcagcaagtaccgcttttctagggagcaaacaccccccaccccttctct
-ccatgtctctactctctcttttctctgggcttgcctccttcactatgggcagccttccac
-cctccattcctccttcttctcccttagcctgtgttttcaagaacttaaaacctcttcaac
-tcacacctgacctaaacctaaatgccttattttcttctacaatgccgcttgacctcagta
-caaactcgacagtggttccaaatagccagaaaacagcacttttggtttttccatcctaca
-agatctagataattcttttcataaaataggcaaacggtcggaggtgtttgacatccaggc
-attcttttacacattgttccctccctagtctctgttcccaatgtgtctcgtcccacatcc
-tccttctttccctcccacctgtcctctcagtcccaatcccaagcattgctgagtctttct
-aatcttcgttttctgcagacccctctgacctcttacctcctccccaggctgctcctcgcc
-aggccgagccaggtcccaattcttcctcagcctctgctcctccaccctataatcctttta
-tcacctcccctcctcacacctgctagccctaccccacttgcccagcaatttcctcttaaa
-aaggtggttggagctaaaggcatagtcatggttaatgctcctttttctctatccgaactc
-tcccaaaatcagttagcgtttaggttctttttcatcaaatatgaaaaacccagcccagtt
-catggctcattcggcagcaaccctgagatgctttacagccctagaccctaaaaggtcaaa
-aggccgtcttatcctcaatatacattttattgcccaatctgccccgacattaaataaaac
-tccaaaaagtaaattccagccctcaaaccccacaacaggacttaattaacctcgccttca
-aggtgtacaataatagagtagaggcagccaagtagcaatgtatttctgagttgcaattcc
-ttgcctccactgtgagacaatccccagccacatctccagcacacaagaactccaaacgcc
-tgaaccgcagctgccaggagttcctccagaacctcctcccccaaagtccgtccccttctt
-aatcaatacggaagctacccactccacattaccttcttttcaagggcttgtttcccttgc
-ctccataactgttgtaggtattgacggccaggcttctaaacctcttaaaaactccccaac
-tctggtgccaacttagacaacattcttttatgcactcttttttagttatgcccatctgcc
-gaattctcttattaggccaagatattttaagtaaattatctgcttccctgactgttcctg
-gactacagccacacctcattgctgcccttttccccagttcaaagcctccttcgcatcctc
-ctctcatatccccccaccttacccacaagtataagatacctctactccctccttggtgac
-tgatcatgcaccccttaccatcccattaaaacctaatcacccttaccccattcaatgcca
-atatcccatcccacagcacgctttaaaaagattaaagcctgttatcacttgcctgttaca
-gcatggccttttaaagcctataaactctccttacaattcccccattttacctgtcctaaa
-accggacaaggcttacaggttagttcaggatctgcaccttatccaccaaattattttgcc
-tatccaccccgtggtgccaaacccatatactctcctatcctcaatacctccctccacaac
-ccattattctgttctggatctcaaacatgctttctttactattcctttgcaccctacatc
-ccagcctctcttcgctttcacttggactgaccctgacacccattaggctcagcaaattac
-ctgggctgtactgccgcaagccttcacagacagcccccattacttcagtcaagcccaaat
-ttcatcctcatctgttacccatctcggcataattctcataaaaacacaggtgctctccct
-gctgatcgtgtccgactaatctcccaaaccccaatcccttctacaaaacaacaactccct
-tccttctaggcatggttagtgcagtcagaattcttacacaagagccaggaacatgccctg
-tagcctttctgtccaaacaacttgaccttactcttttagcctggctctcatgtctgcgtg
-cagcggctgccgccgccctaatacttttagaggccctcaaaatcacaaactatgctcaac
-tcactctctacagttctcataacttccaaaatctattttcttcctcatacctgacacata
-tactttctgctccccagctccttcagctgtactcactcttttttgagtctcccacaatta
-cccttgttcctggctcagacttcaatccggcctcccacgttattctggataccacacctg
-accctcatgactgtatctctctgatccacctgacgtacaccgcatttcccccattatttc
-cctcttccctgttcctcaccctgatcacatttagtttattgatggcagttccactaggcc
-taatcgctacacaccagcaaaggcaggctatgctatAGtacaagccaccagcccacctct
-tagaacctctcatttcctttccatcatggaaatctgtcctcaaggaaataacttctcagt
-gttccatctgctattctactactcctcagggattattcaggccccctcccttccctacac
-atcaagctcagggattttcccctgcccaggactggcaactcttaactccctcttagagtg
-gatagatgctctttgctggcaggggaccctccaatcttttcaccctgatgaagttctatt
-ctttacttttatactcactcttattctcattcccattcttatgccaccctctacctctcc
-ccagctatctccaccacactatcaaccttacccattctctcctagccgtttctaatccct
-ccttagtgaacaaccgctggctttgcatttccctttcttccagcacctacacagttgtcc
-ccaccttacatgcagactaggcaacatctcctatctccttacacctccaaacttccttta
-acagccctcacctttaccctcctgaagaactcatttactttctagacaggtccagcaaca
-cctcctgagacatctcacatcagcaagctgccgccctcctccgcacttaattaaaaaacc
-tttctccttatatcaactctactcccccaatatttggacctctcacaacacaaactacta
-ttcctgtggccgctcctttatgtatctctcggcaaagacccactggaattcccctaggta
-acctttcaccttctcgatgttcctttattcttcatctccaaagcccaactacacacatca
-ctgaaacaataggagccttccagctacatattacagacaagccctctatcaatactggca
-aacttaaaaacattagctgtaattattgcttaggaagacacttaccctgtatttcactcc
-atctttggctgccttccccttgctcatcagactctcctcccaggccctcttcttgtttac
-ttatacccagccctgtaaataacagtgaaagtttgcttgtagacacttgacgttttctca
-tacaccatgaaaatcaaacctccccctctatgcagttaccccatcagtccccattacaac
-ctctgatggctgccaccccagctggatccctaagagtctaggtacaagacactcctttca
-gcattccttctcatctttttactttgcatctccggttttgcctcacacaaggtctcttct
-tcctctgtggatcctctacctacatgtgtctacctgctaattggacaggcacatgcacac
-tagttttccttactcccaaaattcaatttgcaaatgggaccgaagagctccctgttcccc
-tcacgacactgacacgacaaaaaagagttattccactaattcccttgcttgtcggtttag
-gactttctgcctccactattgctctcagtactagaatagcaggcatttcaacctctgtca
-cgaccttccatagcctgtctaatgacttctctgctagcaccacagacatatcacaaactt
-tatcagtcctccaggcccaagttgactctttagctgcagttgtcctccaaaaccaccgag
-gccttgacttactcactgctgaaaaaggaggactctgtatattcttaaatgaagagtgtt
-gtttttatgtaaatcaatctggcctggtatatgacaacataaaaaaactcaagaatagag
-cccaaaaacttgccagccaagcaagtaattacactgaacccccttgggcactctctaatt
-agacgtcctgggtcctcccaattcttagtcctttaatacctatttttctccttcttttat
-tcagaccttgtatcttccatttagtttctcagttcatccaaaaccgtatccaggccctca
-ccaatcattctatacgacaaatgtttcttctaacaaccccacaatatcaccccttaccac
-aaaatcttccttcagctcaatctctcccactctaggttccatgacccaatcctgctcaaa
-gcagccctgagaaacatcacccattatctctccatgccagccccccaccaaaaatatttt
-tttcgctgccccaacacttcaatactattttatgttatttttcttattaatataagaagg
-caggaatgtcagacctctgagccgaagctaaaccatcgcatcccctgtgacctgcatgta
-tatgcccagatggcctgaagtaactgaagaatcaccaaagaagtgaaagtggcctgttaa
-tgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgccttaac
-tgatgacattaccttgtgaaatcctttctcctggctcatcctggctcaaaaagctccccc
-actgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttgactgtaa
-ttttcctttacctacccaaatcttataaaatggccccacccctatctcccttcactgact
-ctcttttcggactcagcccgcctgcacccaggtgaaatagccttgttgctcacacaaagc
-ctgtttggtggtctcttcacatggatgtgagtgaAATTaatattaggtacacacagacat
-aaagatgggaaaaatagacagtgaagattttaaaggggataaggaagggagaggagcaaa
-tgttgaaaaactatctattctgtactatgtttgctacttgggtgacagggtcattagaag
-cccaaacctcagcatcacacaataagcccatgtaacaaatctgtacatttatcccctgaa
-tctaGATTTTAAAATAAggctgggtgtggtggctcacacctgtaatccaaacactttggg
-aggctgaggcaggaggattgcttgagcccaggagttcaagaccagcctgggcaacataga
-ccttgtctctacaaaaaataaacaaaatcagcaaaatgtggaggtgcgcctgtagtccca
-gctgctcaggagactgaggcaggaagattacttgagcccaggagctcaaggttgcagtga
-gctgagatcgtgccactgtactccagcctaggctaccaagtgagattttgtctcaaagaa
-aataagataaaaTTTTTTCTTACATTGTGATATATATGCACAATGGaattttcaaatata
-tagtatattatcactaactgtagccaccatgatgtaaatagagctcttgaattttttttt
-tcttcttttgaaaacagagttttgctcttgttgctctggccagagtccaatggtgcgatc
-ttggctcattgcaacctctgcctccccagttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattacaggcacatgccaccacgcctggctaatttttgcatttttagtcaag
-gcggggtttcaccatgttggccagactggtcccaaactcctgacctcaggtgatctgcct
-gcctcagtgtcccaaagtgctaggattataagcatgagccaccgtgcctgaactctcttg
-agcttatttttcctgtctaagtgatttccccacccctagcctctgataactaccatttta
-ctctttgtttctatgaattcaacttttttacactctacatagaagtgagatcatgtcttt
-ctgtgcctggtttatttcatttagcttactgtcctccaggttcatccatgttgttgcaaa
-tgacagaatttacttcttttttaaagctgaaaagtattccattgtgattatgtaccacca
-ttttctttattaattcatctattaatgggcacttaagttgattccatgccttggttattg
-tgaataatgctgaaattaacatgaaagtgcagatatcttttcaacatgctgattttattt
-ccattagctatatacccagtaatgggattgctggatcatatagtagttttcattttaatt
-ttttaaggaacttccatacagttttccataatagctatactaatttttattcccaccaac
-agtgtgcaagggttcccatttctccacatcctttccaacacttattctctttcatagtat
-attttgaagtcaggtagtgtgatgccttcagctttgttctttttgctcaagattgttttg
-gctattcaaaatcttttgtggttcaatccaaattttaagatttttttctgtttcagtaaa
-aaatgtctttggaattttgatagggattgcattaaatctatagaccactttgggtactac
-agatattttaacaatattaattttttactttcatgaacatgggatatctttccatctgtg
-tcttcttcaatttcttccatcaaagttttatacattttagtgtagaggccttttacctct
-ttgttaaatttattcctaagtatttttgtagctattgtaaaaggatcatttacttgattc
-acttctcaggtgttcttgttagtattcagaaaagctgctgatttttgtatgttgaattta
-tatcctgccactttactgaattcatttattagttctaatagttatttggcaaagtcttca
-ggattttctgtatatacgattatgtcatctgcaaaaagaaacaatttcacttcttccttc
-ccattttaatgctctttttattgcattttcttgcctaattaatctggctagaatttccag
-tactacattgatagaagtggcaaaagtgggcattattttgttctttatcttaaagaaaaa
-gcttttgactgttcaccattgagtatgatgttaaatggggcttgtcatatatgatcttta
-ttgtgttgagatcattctttctgtatctaatttgttgagttttatcacaaaaggacgctg
-aatgttgtcaagtgttttttctgcatctgttgagatgatcatatggtttttacccatcac
-tctgttaatgtagataaatctcacttgatcatggtgaataatccatttaaagtattgttg
-aattcaatttgctagtattttcttgaggtttttgtatctctgttctagggacatcgacct
-ataacttttttttcttgtatgcccttgctctggctttattataagggtactgctACccca
-gcatgatttccaaatggctatgaaccagtgactgctgtgtacaaccaacttttcctcctt
-tcaaatgggagtgttgtggttatAACATTATAAAACAAATCTTGCAAagttagatagaag
-gcatcagttctagtgtttgatagcacagcagagtggctattgttaacaacaatttattgt
-atatttcaaaatagctaaaagagaagttttgaaatgttcccaacacaaagaaaggacaaa
-tgtccaaggtgctggatatcctaaataatctgacttgattattacacattatatgcatgt
-atcaaaatatcacatgtgcccagaaatatgtacaaatactatgtatcaataaaaaaGttt
-ttaaaaaataaatattacatataatatatgaattatataataaaactagaatataatata
-aaaaggaaaaaatatatgtaaaataaatCTTCATaataaaataaaataaaataaTTTGAA
-AGAGTCTATGAATAAGATTTTGGAGACTACTCTAAGACAGATGCAAGAGCAGGTACCAAT
-AATTCTGTCTGTACCAAAAGAGTGAATAATAAAAATATACAATTTCAACTTAATTTTGCA
-TAAAAAAAAGTGAACAAATAAACATGCATCTAACAATACTGACCACATCCACGTCTTCTA
-TGAGTATGGAGGGGATAAAAGAATAAAAGAAAAAAGTCAAAGCGAAGATTAGATCCCCCC
-AGTCAGAGCAGAATTCAAGGGTTAATTTATCTGTTCAATTAAGTATATCCCTCACCCCCA
-ACTCAGAAGACACTTCTCTGATTTATCTGACACTAAGCCAAAATGGATTCTCTTATCTAA
-TTTATCAGTAGAATCATATAGAGTAGAGGACACATGTAGATTAAAGACAGTGAGCCAGAC
-CCATCTTCACTGTCACAGTGACAGAATGGACCCTCCTTTAAAATACCCCTGGTGACATTG
-TAATGAAAGACTAAAAAAGAAAGGGGCTTATAAAGTGCTGCAGTGAAAAAAAGGGCTTCT
-TATGTGAGCCTTACTTTTAAAGTTCCCTAAGAATTAGGTTGAAAAAGGTCATACATTGAC
-TTTCATAGTGCTGAAATCATCAACAAAAATTTCTAAAATTCTGCAAAGTCCAGTCACTGT
-TACCTGTGCACTTCTCCAGAATTTTCAAAAGCCAAACTACTAAAAGGAAGGTTCTTGTAT
-GCTCTTGAAACTTTAATATATCCAGCTAAATATTTTTCTCCTTCCTCCCCCTGAAACAAG
-GTGGTGAGCTGCTCATGGAGTAATAAGGTTCATTGATTTCTTTATCTCACATGAGTAAAT
-ATTAGCTCTACAAAAGTTATTTATGACCAGTGCCTTAAATTAAGCAGCATCAACAAATGT
-CACCACAAAATTTCTCTTCTGTTCATCTGGACAGCATTTTCTACCATCATGACCTACTAC
-AATTTCATCTATCTCATGAGGAGCTTCTTAAGTACGTCCCCCTCATTTATAAGACTTTAA
-ATTTCATACTGAAACAAATGATATGCAATGCTTTTAGAGATCTTAAGATAATCTTTGTCT
-AAAAATTCTGTCAACTAGATGTTCAAATTGCTACTGAAAATGGAGATGGAACACATACAT
-TAAATGATTCAAATGATATATCGGAATTACCAGTAGCTGTCATGTTTGCCCATCAGATCT
-GCCCTCAAAAAAGTGTTATGAAAATATTCAAACATTTTTTCTCCCTCTAACTAATTCCTA
-GCTGTTAGCAGAACCCTCTGTacacacacacacacacacacGGCATTCAGATCTAATTAG
-ACAAAAGAAATTTCATTTGTGAAACAGGAGAAATACCTGAAATTCTGTGAAATATTGTCT
-CGCATAGAAAATGGAGTTGttacaagccaggagagattgggtgcctattttcaaccttct
-taaagacaagaaattccaaccaagaatttcatatcctgtcaaattaagattaataaatga
-aagagaaataaaatcttttccagacactccagtactaagagaaatccttattattaaagg
-cagtcttacaagagacccttcagggagttctaaatatggaaacaaaggaacgatatttgc
-atttacaaaaacatacttaagtacgtggcccacagaccctaataagcaaccacacaatag
-aaactacaaagcaaccagctaacaactccatgataggatcaaaacctcacatattaacat
-taaccttgaatatgaacactctaaatgctccacttaagaggcacagagtagcaagttgga
-aaagaaaagaaaagaaaagaaaagaaaactcatctgtctgcagtcttcaagagaccaata
-tcacatatatgacacccataggctcaaagtaaatggttggagaaagatctaccacataaa
-caaaaaacagaaaaagaggaggggtcattattcttagataaaacaaactttaaaccaaca
-actacttagaaagataaaaaagggcattacgtgacaataaagggttaaattcaataagaa
-gacttaactatcctaaatatatatgcacccaatattggagcatctagattcattaaaaaa
-actacttctagacctatgaaaagacttagccacatgattatattgggggacttcaacacc
-ccactgacagcattagatagatgattgaggcagaaaactaacaaagaaatcctggactta
-aacttgacacttgaccaattcaacttaatagacatctacagaatattccatccatcaacc
-acagaatatatattcttcacatctgcacatggaacagactccaagattgaccacatgcta
-ggccatggaataactatcaacaaattcaaaataccaaaataatgccaaccaaactctcag
-accacactggaaaaaaatagaaatcaataccaagaaccttcaaaaccacacaattacatg
-aaaattaaacaacttgctcctaaaccacttttggataaacaacaaaatgaaggcagaaat
-ttaaaaattcattgaaataaatgaaaacagagacatagcataccaaaatatctgggatgc
-agtgaaaacagtgttagaaagaaagtttatagcactaaacactgaccttgaaaagctaga
-aagatctcaaattaatgatattacgtcacacctacaggaactagaaaaacagaaacaaac
-taaccaccaagctagcagaagaaaaaaaataactaaaatcagtgtagaactgaatgaaat
-tgaggctcaaaaatccatacaaagacacagtgacattacaagtttgtttttttaagggat
-aaacgagatcaatagaccactattttttgttagtagattaacaaaagaagtgagaagatc
-caaataagcacaaatagaaacaacaaaagtgacattacaacagatcccacagaaatatga
-aagagactattatgagcacctctatgcacacaaactagaaaatctagaggaagtggataa
-attcctggaaacatacaatctcccaagattaaaccagaaagaaactgaaaccctgaacag
-accaataacaggttccaaaattgagtcatcaattaaaaacctattaactaaaaaaggccc
-tgaaccagatggattcacagcccaattttactagacataccaattctactaaaactattt
-caaaaaagcaagaagaaagatacctccctaactcattctacaaagtaggcatcaccctgg
-taccaaaacctggcaaagacacaacaaaaaaagaaaactacaggccaatatccctgatga
-aaaaaatgcagaaatccttaagaaatactagcaaactgaatcaaagaatactaaaaaaag
-acagttaattcgccatgagcaaacagacctccctcttgggatgcaaggttggttcaacat
-atgcaaatgaacaagtgtgattcaccatataaacagaattaaaaacaaaaaccatatgat
-catctcaataaatgcagcaaaccttttgataaacccaacatcccttcatttaaaaacccc
-tcaacaaactaggcatcgtaggagcatactcaaaaataataagagcccctatgacaaacc
-cacagccagcatcatgctgaatgggcaaaaactgaaagcatttcccttgagaactgggaa
-tgctttctggaacattccagttttctggaacattcccaggaatgcccactctcaccactc
-agattcagcctattactggaagtgcttgccagagcaatcaggcaagaggaagaaataaaa
-ggcatccaaataggaaaagaagaagtcaagctatctttcttcattgacagcagattatat
-gcctagaaaaccttaaagcctccaccaaaagactcctggaactgataaacgacttcagta
-aagtgtcaggatacaaaagtcaaagtataaaaattaacagcatttctatacaccaataat
-gttcaagctgagagtcaaatcaagaatgcaatcccattttcaataaccacacactcaaaa
-aaaaagcctaggatttttttctaactaagaaggtgaaagatctcttcagattcagggaga
-attataaaacattgctttaaaaaattatagatgtcacaagcaaatggaaaaacattccat
-gcccatgggttggaaaaatcaatatcatttcaacagtcattctgcccaaagcaatctaca
-gattcaatgttattcctatcaaactaccaaagccatttttcacagaattagaaacaacta
-tcctgagttcttatggagccaaaaaaagagcctgaataggcaaaacaattctaagcaaaa
-agaacaaagccagaggcatctaattacccatctcaaactacacgataaggttacagtaac
-tgaaacagcataatactgatacaaaaacagacatatagaccactggaacagaataaagaa
-tccaaaaataaagctgcatgcctacagccatctgatctttgacaaagtcaacaaaaatac
-gcaatgggaaaagggctccttattcaataaatggtgctgggatagctggcaagccacata
-tagaagaataaaactggacccctcctctcaccatataaaaaattaactcaagctggatta
-aagatagaaatgtaagaactcaaattacaagaatcctagaagacaacctagaaacaccat
-tctggacataggtcttgggaaataatttatgactaagtcctcaaatcaattgcaacaaaa
-acaaaaattgacaagtgggacctagttaaactaaagagcttctgcacagcaaaagaaact
-atcaacagagtaaaaagacaacatacaatggtagaaaatatcacaaactatgcctctgac
-aaaggtctaatatcaagcatctataaggaacttaattcaacaagcaaaaagaaaatagcc
-ccattaaaaagtgcgcacaagacatgaacagacacctctaaaaagaacacgtacaagtgg
-gcaacaaatatatgaaaaaatgttcagcatcactgaacaccagagcaatgcaaatcaaaa
-tcacaatgagataacctctttacaccacttagagtagctattactaaaaaatcaaaaaac
-aacagatgctggcaaggccgcagagaaaagggaatgcttatacactgttagtggaaatgt
-aaatttgttcagccactatggaaagatgtttggagacttctcaaagaacttaaaacataa
-ttaccattcaactcagcaatcccattactgggtatatatccaaaagaaaataaattgttc
-taccaaaaagatgtatgcacgtgtatgttgatcgcagcactattcataatagcaaagaca
-tggaatcaacctaggttcccatcaacagtggattggataaagaaaacgtggtacatatac
-acaatggaataccatgctgccataaaaaaataaaattacctcttttgcagcaacatggat
-gcagctggaggccattatcctaagcgaattaacacaggaataggaaacctaataccatat
-gttctcactaataagtgggagctaaacattgggtacacattgacataacgatgggaacaa
-tagacactggggactaatagaagagggaaggaggagaggagaaagggttgaaaaactaac
-tgttgggtactatattcaggacctgagtgatgggatcagttgtaccccaaacctcaacaa
-cacacagtacaccaatgtaacaaatctgcacatgtacccctgaggctaaaataaaagttg
-aaaTTATTTTCTTAAAAATGGAAAGGCTAAATTCCACCTCTACCAATATGTTTACTTAAT
-TTTTATATCCCCCATCTTACTGGTATAAAACCAGGAACATGGCAACCATTCATTTATGTT
-TGAAGTGTTCAAAAAATGAGTGACTACATCAATAAATGTACTCAGAGGAAAGCACAGGAC
-TTTATTATGTGGGGAATCAAGTTCACAGAAGGAAGCAGATGAATCTTTTGCTGCAGGCTG
-CTGGATTAGGCAGCACTTTTTATTTAGGAAGAGTGGAGACCAGCGAGACAAGGGCTAGAT
-TTAGGATTAGACTGTGAAAATGGTGATGGTGGGTAAGATGATGTAATCCTGCAGCACACT
-CAGCTTCTCACCAGAATGTTGATGTGGCTTCTTAAATGACACATGTTTTTTCTCTTCTTC
-ATCATTAGCACAACATAATTTCCCACTTAGACATCCTATTTCATATCTTTCTCCTACCTT
-GCATTTCTTCCTGCAATAGCCTGTTACTTTATTGAAGCATTTTTTGAGTCTTGCCCCGTC
-TGTGCATAGGAAACAACATTGAACCAAGGTTAGTGCGTAAGGAAGAGCAGAAGAGGTAGG
-TATGTGGTTCCCCACAAGTCATGGCCTCCTATGGTCCCAAGTGAACATTATGCTGATAAA
-AGGAAACTCAGAGGCCCCTCCTTGAAAAATATCCCAAATTAAGGACATTCAAAAGCCCAG
-GCTCTCAGCCAATGTCCAGTTGCCTCTGAGAACATTAGAACTGATATGACAAAAGAGAAG
-AGAGAACTCAATTCCTGGTTATCAACCAGAGCCAAGTCCCACCCCTAGGACCATGGCAAA
-GCTGACTCTCTCCACCAAGCTCCAAAGTCAGCACTCTCTCAGCTCCATCTCAGTCTCATG
-TCCCCAGAGACGGCTAACATGTCACCATGTGCACAAGACATGTCACCATTGGCACAACTC
-AGCCAAAGCAACTTTTGAAAGAACATCACAAACAAGACTTTTTAACTTAATTCGGTTTCA
-CACTCACTGATATGGGCAACAGAAATCTCCCTTTGACAAGATCTCATGGGTCTCAGCAAC
-AGGTGCTATTGAGAACTCCTTCCCTTAACCTGGCTCCTCCTGTCTGTCACTCATCACACT
-CCCCTTGATCTCAGATAAATGTGTTGCCCAGGGATCAAATTCAATTCCATGAATTTGGCT
-CTAGAGAGCTACATTGTCACCTTCTCAGAGTAATGCACTGAAATTCTAAGTCTCTTGTTT
-CTAATCCTTATTTGCCCCTCTACCCAAAATTTGAACAAGCCCAAAGAATAAGGTTGGAGA
-AGAGAGACATACTCTCCCTATCCTAAACTTCAGAATCAGGGAACATCTTTGAGGGTTAGA
-GGAGTATATTTTGGGGCCATAAAAATACAATATGCCTTCTTCCTAGCAAGAGAGAAGGTA
-ACTCTCACTGACAGGGCTTCTACGATGAACTTTgtgcttcgtgcttgtaagttcatgtaa
-cctgtacatcaaatagaatcatgaaatatagtaattatactccttcacagatgagaaaat
-tgagattaaaaggaaataatgtgcttaattcatacaacccgtcaatgatgaagacatatt
-ttaacctcacattgacatgactccaaaatgtgtgctattttaattactgtTGTAGTACAG
-GCTGAAAATGAATTTGAATGGAAAAGGGAATGGCCAGGCTCTCAGGTGAAAACTGTGTCC
-AGCATTATAAAGATAATTCTAGATGATGAGTTCATGGATACTTTTGAAAAGGACTCCTGA
-GAGTCCACTATAGCCCTGACCTCCTCTTACCTCCTTGGGTGCCTCTCTTCTAAGGCATAG
-ACTCAAGTCAGGCAACCAGGAGAATGGGTACTTTTTTATGATTTTGGCCAAATATAAATA
-ATCTTGAAAGTCCTGTTCCCACTCTTACAAATAGTAATATCTCTTAGGATGTTATAGTAC
-ATTTGGACAAGTTACCTGTGAGTACCTCAAACAGCAGAATAATGAGAACCAGAAACAGCT
-TCATATTTACAGACTTCCCAAGAGAAAGAGGCAGCAGAACTTTGTCCAGTGGTCTGTGTG
-CCACAGGTCTTTAAAGATGATCCAGAGTTTTGAGAGCTATCAGCGCTCGGAGCTCTCATT
-TTAACCCACACAGACAGAGAGGAATTCCAAGTCCACCCCCGTAACACACACACCTACATC
-CCCAAATATGGAGCTCACAGTCCCAGAATGTTCCACCATATCATCCCTCCTCCCCCTTCC
-TCAGGATATGCGCCCCTAGAGAGCAGGAACTATGACTTTCCGTCTGAGCTTCCAACCCAT
-TTGGGTCAAGGTTGGTTGGTCGTGGGCCTTGGGTTGTGTGGGATAATCCTGTCTTATTCC
-TATTGTTCCAATGTTCCATCCGGCTACTGCTGCCTCTAACAAAACTAACCCAGTTTGGAA
-GATAAATTAAGTCATTAGTCGACACAGAAGCATATTCAACAATAATTTTTTTAATGTATA
-AAGCTTCCAGATAGTCATTCTAGGAGTAAGATTGCTTTTAGGTTTGGCTAGATAAATTGA
-TATTATTTGAGAGTTTCCCATAAAGACTTGTCCATCTAGTAGAGCAAAATTCAACAACTG
-AAAGTTTTCAAAAGATCAAATCTCCTTAGCACAGCACTCAACTTATTATAAACTGGTCTC
-TGCTCTCCTCTCTTGGGACATTTTATGGAACCATCTATGTTTCTCCCAAACTAGTGGGTA
-CACCTTCCTGAACTTTTACTTCCTTAATCTGTTTCTTTTCACATTTAAATCCCTCCTTAC
-AGATTATATTACACTCCCCATCCCCTCCATATAATTGGTGCTAGTGAACTCCTGGTTTTC
-CTTCAAAACCAAGTTCAATCATCTCTATATAAGTGAAAGTTTCCCTGACCCAACTAAACA
-GAGCTGCAAACTCTCTTCTTCGCACCATCACTGTATTTGTACATATTTTTGTTGATGGTC
-ACACTATGTCATGTTCCAATTATTTGTTTATCTGCAATAGTCTGCAGACCCATAAAGGGC
-AGGTCTCTGGTCTTATTAGACTTGGAGttctttttctttttttttttttttttgcagttg
-caagatttaatagagtgaaaatggagctcccatacaaagggaggggacccaaagaggtta
-gccgttgccggctcgaatgcctgggtttatatcccaatcattgtccctcctgctgtgctc
-tcaggcaatagatgattggctatttctttacctcctgtttttgcctaattaccattttag
-tgagctctctttcctacctgattggtcacatgtgagctaagttgcaagccccgtgtttaa
-aggtggatgcggtcaccttcccagctaggcttagggattcttagtcggcctaggaaatcc
-agctagccctgtctctcagtaccccctctcaacaggaaaacccaagtgctgttggggagg
-ttggccgacgaccgctctaactgcttcctcctgaattggggcatagtaggggttgtgcag
-ttgagatttcctcaggaggggtgccttcgatgtcattaacattggagcatgggctagcag
-gccggtccaatggtccacggtagctcttagtcatggacggcatctgtggctccatttgaa
-gaatgatttgtagttttacagctttgattctggaaaagacaaacttaacaaggaggttaa
-agatacagggattgaaatgtatggcctgcagtgcaggggattatttctttggcacacttt
-acaggccctgactatctatttgatagttttgaaaaggcctggtccagtaaataataattt
-agccatctgatagttgctatcaatgcctaagtgaaaggtttggtaaagggttttaagtaa
-tttcaattggttagctgcaggcaaaagtattttttcttctttggtggctagccatcctga
-ggggaggaaagtatgtcctcttgaggttctccattctatttcttctgctgagtactgggg
-cttggtttcctggagggggttaccccacactaggggtccttctataagcatttctaatgg
-agggtcctgtcttgtggctcttttggcttcaacatctgcttggcagttcccttctacttc
-cctttccttttttttttttttttttatgaccccggcagtgtaagactgccacctctttag
-gtttctgtacagccaataataatatcctaatggcttcttgatgtttgataggtgttccct
-tggaagttaggaattccctttctctccatattgctgcatgggcatggagaactaggtaag
-catacttagagcctgtatatatatttaccctttttccttctcctaattctagtgccctag
-tgagggctattagttctgccagctgaacactagttcctggagtgaggggattactttcaa
-gtattccattatcactgaccactgcataccccacttttcgaagtcctttttctacaaagg
-aacttccatcagtacataaggtgaggtcaggatcagtcaagggaacctctaaaggatccc
-cttgagcagcgtaggtttgaacaattacttgctgacagttatgttctatcttttctttat
-tgtctggaagaaatgtggctgggttaagagttgcacaagtgcacagtcgcagcactggcc
-cttcaagtaatagagcctgatatttaagtaaatggttgtctgacagccacaagtctcctt
-tagcagtgagtatgccattcacatcatgagatgtccacacagtaagatctcttccctgta
-ttagtttaactgcttcagatactaagactactactgctgccactacccgtaaacaatgag
-gccaaccctttgccattacatcgatttccttacttaggtatgccacgggttacaagctca
-tccctcagacctgtgtaaggactcctagagctattcctgtttttttctgtgacttataaa
-gaaaagtcttgcccctttgacaagcttaacactggggcttgggttagggccttctttagg
-gcctggaaagctgcttctgcttcaggtatccatcttactaatgggtatttgctttctgag
-tttccttaattgtgtatataatggtctggctatttcgccatacctgggaatccatattct
-gcagaaacctgttacgccaaggaagcttttagttgctttagggttttgggatgaggatca
-gccagtataggctggatatgttcctcactgagggccctggtgcctttggataatttgagc
-cctaagtatttaacctgctgtgagcagagctgagcctttggtttggaaaccttatagcca
-caggtggcgaggaaatttaagagtgcttgggtggcttgattgcacaaggtttctgaacgg
-gcagctaaaattaaatcatccatgtaccaaaggacaagagtgtccaggtatgagaactgg
-ctcaagtcttaggctaatgcctggccaaatagatgggggttatccctgaacccttggggt
-aaaacagtccgggtgagttgagatgttgggttcgaaggatcttcaaaggtaaacaagaat
-tgaaggtcaggatgtacagggatgcagaaaaaggcatccttaatgtccaggactataaac
-cactctgcttcctctggtgtttgggaaagcagagtatacgggttaggtataggtgggtat
-ggagcgacaatggcctcattgataatcctgagatcttgcactaacctccactgtccgctg
-agtttctgtactcctaaaattggagtattgcaggggctattgcatggttttactaggcct
-tgggcttttaggtccttaaaaatattttagagtccttgttgggccttgggtgtaaggggg
-tactgcctttggtagggaaaggaggtgaaatcctttagtttaactcaaacagaatgggca
-ttctttgctcgtccatgttgtccttctgttgcccagacttcaggattaattccttcctca
-agcagggggacaataaacgggtgttctttctcctatgttcaggtgtataatggcccctgc
-tttcgctagaatgtctctccctaacaagggagtggggctttcaggcataattagaaaagc
-atgtgaaaagtataaagttccccagtcacaacttagtggctgggagaagtatctagtgac
-tggctgtcctaggaccccttggatagtgacagatctggaggacagttgtccgggacagga
-cagtaagactgagaaggctgcgccagtgtccaggagacagttagcctcctggctctcaat
-ggtcaagcatacccgggactctgtgagggtgatggcatgggctggagcttgccctgggca
-ccctcagtccttctgctggatcatctggttagtggcttctgactcagaggaccttcgtcc
-cctggggcagtgggccttccagtgattcccttgacataaggggcatggatgagagggtgg
-cttatttctacttggacaatcttttttaaagtgtccttgtagaccgcactggaagcaagc
-cctattaggcattcgatttgcccagtttttcccttttccaaagcctccTCGACTAGGAGT
-TCTTAACTCATAGCACAAAATTCATGCTATATGCTCAATACATAATCACTGAATGGCTGA
-AAAGTACTGAACAAATTACTGCTAGATAAAATACTCCAACACAGCAATAAAGTTAATTAT
-GGCATTTCCTTTAAAAATGCTGTTTACCACTTTTTGCAATTTCTAGGCACCTAATTATAG
-TAATGAGGTCCCATCTAATCCAAATATCTTTCTGTGACAGTATCTGGAAGAATGTTGGAA
-TTTCTGAAAGCTGTAGAAGTAGCCGTTGATGATTAAACTCTTATCACAACATAGTCAGGG
-AAAGAGTAAGGTTAGGAATTAGTATTGTATATAGCTTACTATGGATACCAGTAACCAGAG
-CCCTTATCCCCCTCAGTTAGTAGCTGTATACCTTGTAATCCTGGAGTGGCACAGAAAATA
-AAGATTGGTGAGGCTTACAGAATCTCATCAAATCATATTTATCATATGAAGACAGCTAAG
-TTAATGGGTGCAGGAAATTTAGCCGCACGAAGATCAGATGTGTGAATATTTATTAAGGGC
-TAGGTGCagtggctgggattacaggcgtgcaccatcatgcccagctaatttttgtatttt
-tagtagagatggggtttcaccacgttggccagtctggtcttgaactcctgacctcaggag
-atccacccacctcaacctcccaaagtgctgggattacaggcatgagccaccacgcctggc
-tTGTTtttttgtttttgtttttgttttAATTTTCTAAGTCTTTCTTGCTGAGGGTCTGTG
-GATCAAGGAAATACTTATTCAAAAAACAGGTATTAAGTTCCTGTTAATAAATACAAGAAG
-AAAAGTGCTAACTGAATCACCTGTGGGTTTAAAGACCACCATCAAAGCTACAATTTTGGA
-GGACAGCCAACTGCTCCCTTGTTCTGTAATTCAATTTTACTCATTGCTGTAAGGGAGTTG
-GTTCCATTTCTAAATAAATTAAACAGAGATAACCCAAGGATTAGATGAATATAAGTCCAG
-CTATGCAGGAAATCGTTTGCCACCTTAGTGCACAATAAGAACTAAGAAGTTGGACTCCAG
-ATTAGTGTATGGGATTTCTTTTAGCTTTTTCTAACTAGAATCAAGAAAGATGAGATATTT
-GACTGTTCTAAACCTTTACTTCAGCCAAGTATGGTGCTCTGGAAGCTTCTCAACCCCACT
-CCCACTGCCTCCATGTTCAAGACCATCAAATAAGAGGGAATTTCCTCTCCAAGTAGATGT
-CCATCTTCTACAACATTTTTTCCTACGTCTGATAGATACACTCTAGCAGAACTCCAGTAG
-CATATTTCACCCAGGATACAAAGGTGTATTTGTCAGCACCAGTCCTGCTGATGTTTTTCC
-TCAAATTCTGCATTGTTTCTTTCCAAATCTCAAAACCTCCCAGAaaatccttcttgtctt
-ttaaggctcagataaaaataagacctcctctgtgatgtcttcctaactcctctgatagac
-ttgattaattactattttgaacccccacagctctttccATTTGTATTTGTAACACTAATC
-CCATTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtctgtgtatgAAttttt
-ttagcttttattttaggttcaggagaacatgtgcaggttagtcacataggtaaattgtat
-gtcacagggatttggtgtacaggttatttcatcacccaggtaataagcatagtacctgat
-aggtagtttgttgattcccaccctcctcctacctcaagtaggccccggtgtttgtttcct
-tttttgtgtccaggtggactcaatgtttagctcccattataagtgagaacacgtggtatt
-tggttttctgttcctgtgttaactcacttgggatacaggcctccagctccatccatgtcc
-ctgcaaaaaacatgatttcattttttatggctgtgtagtattcgatggtgtatatgtacc
-atattttatttatccagtgtaccattgatgggcatttaggttgattccgtgtctttgcca
-ttgtgaatagtgctgcaatgaacatacacgtgcatgtgtctttatggtggaatgatttat
-attcctttggctatatacccaataatggaattgctgggtcgtatggtaattctgttttaa
-gttctttgagaaattgccaaactgttttccacaatggctgaactaatttacactcccacc
-agcagtctaaaagcattcccttttctccacaacctcgccagcatctgttattttttcact
-ttttaataatagctattctgactggtgtgagatagtatctcattgtggttttgatttgca
-tttctctaatgataagtgatgttgatctttttttttctttcaaatgcttcttagccgagt
-atatatcttgttttgaaaagcgttccccattgcttgtttttgtcaggtttgtcaaagatc
-acatagttgtaggtgtacagtcttatttctgggatctctattctgttccactgatctatg
-tgtctgttcttgtaccagtgtcatgctgttttggttactgtggccctgtagtacagtttg
-aagttgggtagtgtggtgtctccaactttgttctttttgcttagaattgccttggttatt
-caggctcctttttggttccatataaattttaacatagatttttctacttctgcaaagaat
-gtcagtggtagttaaatgggaatagcattgagtctataaattgctttgggcagtatggcc
-attttagtgatattgattcttcctaccaatgagcatggaatgttttttcatttgtttgtg
-tcatctctggtttctttgagcagcactttttagttccccttgtaggtagaaatctttcac
-ttcccttgtaagctgtattcctatgtattttattctttttgtggcaattgtgactgggag
-ttccttcatgatttggctcttgtgttgaaggttataggtgtataagaatgctagtgattt
-ttgcacattgattttgtatcctgcgactttgctgaagttgtttatcagattaagaagttg
-cctagccatgtgcagaaaattgaaactggaccccttcattacaccatataatacaaaaat
-taactcgagatggattaaagacttaaatgtaaaacccaaaagtataaaaaacctggaaga
-caacctagataataccattcaggacacaggcacgggcgaagattttagggtaaagatgcc
-aaaagcaattgcaacaaaagcaaaaatggacaaatgggatctaattaaactaaagagctt
-ttgcacagcaaaagaaactatcaacagagtaaacagacaacctacaggatgggagaaaat
-ttttgcaaattatgcatccaacaaaggtctaactaatatccagcatctataaggaactta
-aacaaatttacaataaaaacaaacaaccccattaaaaagtaggcaaagaaaacatgaacg
-gacacttctcaaaaaaagacatacatgcagccaacagtcatatgaaaaaaagctcaacat
-cactgaccattagagaaatgtgaattaaaaccacaatgagataccatctcccaccagtca
-gaatggctattaccaaaaagtcaaaaataacagatgctggccaggtacagtggctaacac
-ctgtaatcccaccactttgggaggcctaggcaggcagatgacctgaggtcaggagtttga
-taccagcctggccaacatggcgagaccccgtctctactaaaaatacaaaaattaatcagt
-catggtggtgggcacctgtaatcccagctacttaggaggctgaggcaggagaatcactgg
-aacccaggaggcggaggttgcagtgagccaaggctgcaccattgcactccagcctgggca
-acaagagcgaaactcccatctcaaaaaaataaataaataaaaataacagatgctggcaag
-gttgtgaagaaaaaaggaatgcttatacactattggtgtaaattagttcaatcattgtgg
-aagacagtgtggaaactcctaaagacctaaagacagaactaccatttgacccagcaatcc
-cattactgggtctatacccaaaagaatataaatcattccattataaagacacatacatgc
-ccatgttcattgcagcattatttacaataacaaagacttggaatcaattcaagtgcctgt
-caataatagactggataaagaaaatgtggtaaatatatgtcatggaatactatgcagcca
-caaaaaagaatgagatcacgtcctttgcagggacatgaatggagctggaagctattatcc
-ttagcaaactagcacaggaatagaaaaccaaataccacatgttctcatttacaagtggga
-gctaacttatgggaacacacagaaacacagaggggaaaaaccacacactggggcctcttg
-gagggtggagggtggggggagggagagaagcagaaaaaataactaatagacactaggctt
-aatatctgggtgatgaggggcgggcacagtggctcatgcctgtaatcccagaactttgga
-aggctgaagcaggcagatcgcttgaggtcaggagttcgagaccagcctggccaatatggt
-gaaacctcatctctactaaaaatacaaaaattagccaagtgtggtggcatgtgcctgtaa
-tcccagcttctcgggaggctgaggcacaagaatcacttaaaccagggaggtggaatttgc
-catgagccaagatggcgccactgcactccagcctgggtgacagaacaagactctgtctca
-aaaaataataataataataaatctgagtgatgaaataacctgtacaaccaacccccatgt
-cacacatttacctatgtaacaaacctgtaccccctgcacacataacctttgatcttaaaa
-taaaagtgaaaaaaaAAAGTGTCTGTTCATGATCTTTGCCtttttttttttttttttttt
-tttgacagagttttgctcttgttgcccagcctggaatgcaatggcatgatcttggctaac
-tgcaacctccacctcctggattcaagcaattctcctgcctcagcctcccaaatacctggg
-attacaggtgcccaccaccTCAAAGtaaatttctttgagtttcctcaacacagctattgt
-gaattatctgtcagaaaagtcacatatctctgtctctctggaatggcccctcctgcctta
-tttagtccatttggtgaggtcatattttcctggatggtgttgatgctagtagatgttctt
-cagtgtctgggcattgaagagtagggtatttattgcagccttcactgtctgagcttgttt
-gtacctgtccttcttgggaagtctttccgaatattcaaaaggtcttgagtgttgtgatct
-aagctatatctgctttagggggtaccccaaacccagtaatactgtggttcttgcagactc
-ttagagataccaccttgatggtcttagacaagatctgagaaaattctctggattaccagg
-cagaggttcttgttctcttcccttgctttctcccaaacaaacggagtcagtctctctctc
-tctctctcttttctgagctacctaaagctgaggatggagtgacataagcatccctgtggc
-caccaacactatgactgcactgggtcagacctgaagccagcacagccctaggtctcaccc
-aaggcctgctgcaaccactccctggctacttctcaaggccctgaggctctacaatcagca
-agtggcgaagccagccaggactgtgtccttcctttcagatcataaaggtaccccaggccc
-aggatggatacagaggttcccatggggactccgagactagagtaacaaaccttagaaatc
-tacctggtgttctattgtactgcagctgagcttgtactcaaaccacaagactcagtcctc
-cccactcttccctctcctttccaaaagcagaggagccttacttcgtggccaccaaaacca
-caggccacaaggaatactgccaggctactgctgatgttccctttaagccccaagggttct
-tacgtcagcttgtggtgaatgctgcctggcctgggactaatccttcaagaaggtaggctc
-ccctctggcccatgacaggtccagaaatattcaagagtcaagtcctagaatcgaggaccc
-caagagcccacctgatgctctacctccttgtggccaagctggtacctaaggtgtaagaca
-aagttcccttcattttttctctgcttttctcaagcagaaggagttctgccctatagccac
-cacagatggggatgtgttgagtgtcacctgaagccagaaagtctcatgggttcacccaag
-gccatcagtgtggaacctggttatcactgctggttattcagggcacaagggctctttagt
-tagcaggtgattaatgctgccaggactgggtccttcccttcaaggcagtgggttcccttc
-tggcccagggtgtgtctagagatgtttttcaggagctacgtcctggaagagggtctgtca
-actatctggtgcctgatcctgctgtggctgagctggtatccaagatgcaagacaatgttc
-ttcctactcttctctctcttctcctcaagtggaaggaaatggtctcttttggagctatga
-gttgcgcagcctggggttaggggaggatgatgttagaactcccttagctgccctagctac
-tgttttagtaggtcatgtgccccccagtccactgtctctaggcccagttcagcactagga
-cttgcctaagagttgcagtccttggggtttagactgcctttcaagtttgcttagagaccc
-aaagcccacagtggaaagctttgcatgtattcaagttccgaccactgagatcagcaattc
-ccctctggttagggctggtttaaatgcttcctctgtgggtgggcctcagctgcatttggt
-ccagttttcctttctgctctaactgggcagcactgagttcactgcctcacaattgccgag
-ttttccatccctcctccagcacccagagattatctttgcatgctgctaccgacagggcag
-tgggagtggggagtgcagggtggcagctgtgattgaggactgtgttttctatttcttcag
-tgcctcattcagtggtaggaactaaaatcaagtgctatgattcttattcttatgaaggtg
-ttttttgtgtagatagttgttaaattggtgcctttgcataggggagggaggacgatcagc
-ggagccttccattcaggcatcttgctctgcctcctttttccataaataatttttgggagt
-ctagtatgttccaggaactctttcaggtcctgaaaattagacatgcattcatggagcata
-cattcaaaagtgggaagcagataaaaaatcatatgaataaatatatagtatgtcagatgg
-tgacagggctctggagcaaaagaagatatagaaagaagatgacaaggccaggcacggtgg
-ctcacacctgtaatcccagcactttgggaggctgaggcgggcggatcacctgaggtcagt
-agtccaaggccagcctggccaacatggcgaaacaaaatacaaaaattatccaggaatgat
-ggcgggtccctgtaatcctggctacacaggaggctgaggtggaagaatcacttgaaccca
-gaggtggaagttgcagtgagccaagatcatgccattgcactccagcctaggcaaaagagg
-gagactccatctcaaaaaaaaaaaaaaaaaaaagtgctgagcaaaaaagagtacagtttt
-aaatgaggtatctgtgaaaagactccttgaggcagtgacatttcaggaaggatgtaaaag
-ttatctggggcaagagagtgtcaggcaatgagaagagcaagtgcaaaggccctgaggtgg
-gaccatgcccagtgtgttcaagaagtagcaagaagaccacatggataatgtgaagcaatg
-aggaaagagaaaaaggggattatatcagaaaagtaatgggggtgcacatttggggttaca
-ataaagaattagacttttcctctaagatggaggttattggacagtgctgacatgatctga
-tgtattttcaaaagatgcctctggcttctgtggtcaaaacagattgagagggagggaaag
-tataaaagtggaaaacctgttgcatgggcattacaaaatctaagtgacagctaatagggc
-ttagatagagagcatcagagaagagggtgggaaatggtcagactcttacatacctattga
-aaatacagtcactcgtagattgaagagaaaggaagaagtcaagataacatcacagtttta
-gtctgagtaactgaaagaatgaagttgtcactgacagagatggatataacaggagaaagt
-tcagattggtctttttgcttgagggaggataaaaacctttgtttgggatacgtttgcttt
-ggagtgctatagacatctaagtggaattgtcttgtaaacaggagagatttttaagccatg
-agactgaatgggattgtcaaggctatgactgcagaaaagagcctaatgcctgagacctag
-aactccccaatgttgatgaataagaagcagcaaaggacactgagaaggttcattccagtg
-aggtcggaggaaaaccaagagaacatgatgctctgggagcttaattaaattaagttcatc
-aaggaggataaagcaccaaatgctgctgatacatcaagatgaggcatgagaattgatcag
-tggCCTACCAGAATCCCAGCTCCAtgacctcttaccagatgccaagtagatgacaaatgc
-atttcaaatgcattgcttactttaatcatcacaagaacactatgaagcagaaattaatat
-acctcaatttttaaaactggaaaactacaatttagggagctaataatgtgcccaatgtca
-cacagccaataaggaattaactgggatcaacacaggtctgcatgaacctaaaattaaagg
-ccttagccactatgctaagctgcctctcCAGCTGCCTTCCATGGGTCAATTCTAGGGAGA
-CTGAAGACAAAGTATTCAAATAAAAGATGTTGCTTTATTCAAAAAATGTATTGGCCATGT
-GCTTGGCTGGACATTCTTCCATGACCTACTCCTTTATACTCTATTCATCACTTACAGGGC
-AGCCTGTTTTAAGAGAATTCATATTTCTTATTTCTGAAGATGACATTATTACATCCTGGA
-AGAAATATTGATTGCCCATTTCAGTATATTCCTAAGTCTTTTTGTTCCTCTGTGTCAATT
-Ctttttcttttattattatactttaagttctagggtacatgtgcacaaagtgcaggtttg
-ttacataggtatgcatgtgccatgttggtgtgctgcacccgttaactcatcgtttacatt
-aagtatttctcctaatgttatccctcccccctcccaccaccccacaacaggtcccggtgt
-gtgatgttccccacctgtgtccaagtgttttcattgtttaattcccacctatgagtgaga
-acatgcagtgtttggttttctgtccttgcgataatttgctcagaatgatggtttccagcg
-tcatccatgtccctacaaaggacatgaactcatccttttttatggttgcatagtattcca
-tagtgtatatgtgctacattttcttaatccagtctatcattgatggacatttgggttggt
-tcgaggaagtcaaattgtccctgtttgcagatgacatgattgtatatttagaaaacccca
-tcatctcagcccaaaacctccttaagctaaccaacttcagcaaagtctcaggaaacaaaa
-tcaatgtgcaaaaatcacaagcattcctatataccagtaacaaacagagagccaaatcat
-gagtgaactctcattcacaattgcttcaaagagaataaaatacctaggaattcaacttac
-aagggatatgaaggacctcttcaaggagaactacaaaccactgctcaacgaaataaaaga
-ggacacaaacaaatggaagaacgttccatgctcatggataggaagaatcaatatcgtgaa
-aatggccatactgcccaaggtaatttatagattcaatgccatccccatcaagctagcaat
-gactttcttcacagaattggaaaaaactactttaaagttcatatggaaccaaaaaagagc
-ccgcatcgccaagtcaatcctaagccaaaagaaaaaagctggaggcgtcaATTCTTTAAT
-GTCAAGCAGCCTTTATGCAATCTTGGATTGGGCACAAGAAGCACACAATCTCCTCATTTT
-CAAAGCCCTTCATGGCTAAGCAATAGAGTTCCTCTTGAGTAGGCTGGAACAGATAATGAA
-ATGTTGCTTTTTAGATGTGGTCAGTTAAAAATAAAATCACCTATCAACATTTGTTACTGT
-ACCTCCAGCTGTGATCAATAGTACAAATTGCTTTTAATATCTTACTTATAAATAGACTTT
-AAGTATGTTTCATTTCTGAGAAATGTTCTCTGAATTCTACTTAAGATGTTATCTTTCCAA
-ACTGCTGGACGGGCTGAATCCAGGCAAGAAATGGGATTGCAAATTCCCTTGCACGAAGAC
-TTGATGGGTGAGTCAAAGCAAGATTCCCTTGCCATTCTTTGTTTAGAGGTGAGAGGAAGG
-TTAACTAGCATTTTATGCTATAAAAATCAGACACAAAGATAAGCAAAAAGAATACAACAG
-AAGCCACTCATTATTTCAGCTCTCTGTTAACACTTTGATGTTCACTTCTAAATATGCTTC
-CTCAAAGTAATTTCTTTTCACAACTGGGTAGGAGATAAGATAAAGCAAAGTGAGCTTGCT
-TGCTTTTCATCCACTCAGTTAAAAACAGTCTTCCAGTTGACACTCCCTGATACATGCACA
-CTCAGGCACACACAAAAGTCTGCACTCATCCATTAACCTCAAGAAAGAGACCTGTTGACA
-AAATAGACATACACCAGTTCAGAGGAACCTATGTCACCTGTCCCTAGTAATCTACTTTTA
-AGCCTAAATATATCAACAGTCAATTTCAGGAAAATTAACATTAAAAAAATTTAGATGAAC
-AATAGGAATGAATGAACTTAAAGGAAAAGAAGCTAATATCAAGGACAGAAGATAATTATT
-TAAAATGATGAGTGACAAACTTGACTAAAATGCACAACCTCTTCATAACAAAAAGCATGC
-AGGAGAAGGTACAAGTCAGCACAAGgttaaaagacaatcagagtagaacaaaaattctat
-gtgcatgataccacaaaaagattgctatccataatctatatgaagaataactacaaatca
-ataagaaaatgacaaatgacccagaggaaaataggcaaaCAATAGTATAGCAGCAAAACA
-TTGTAAGCACTCGTTTCAGAAGGTTGATATAGATTCAGAAATATGATATTCCCTTTAAGA
-GAATCTGCTTTTAATCCATAAATTGTCTTACAAACTAGTTTTATTAGTTTAATATTAAAG
-GAcccattagtgggtatatatccagaggaatataaatcattgtattataaagacacacac
-ctgaaaatgttcattgcagtactattcacaatagcaaagacaaggaatcaacctaaataa
-ccatcaatgacaggttggataaagaaaatgtggtatgtatacaccatggaatactgtgta
-gccataaaaaagaacaagatcgcatcttttgtgggaatatggatggaactgcagaccatt
-atccttagcaaactaacgcaggaacagaaagccaaataccacatgctgtcacttataaat
-gagagctaaatgatgagaactcgtgaacacaaagacgggaacaagagacactggggtatc
-cttgagggtggagggcgggaggagggagaggagcagaaaagacaacaaacctctgtgaca
-caagttttcctatgtaaccaaccttcttatgtcctcccaaacctaaaacaaaagttaaaa
-aaaaaAAAAAGACCCAATTGGAGTTGCAATTTGCTCTTTCCCATTCTACTGCATTTCTGA
-AACCCAAAGTGTACAAAGAATGTGTCTTATGTTTTATGAAATGTACATTTGGGCCCCCAT
-TTTTTTATTTGTATAACAATTGTAAAACACTATCTAAAGGCATAAAATGGCTAGGATGAG
-AATTACTATTGGTTCATAATTATATTTGCTTAATTACTGAAGATGTAACTGTACTCGCTT
-TAAGTATGCCATTTGACTATTGCCCTTCTTTTTGTCCAGAGCCATCAAAAGATTAAAGTA
-TTTGAAATGAATAATGTAATGGTTTTGTCTTCCTGCTACAGTGTGTTTCAGGTTATTTTC
-TAAAATCATAATGAACCCTGTTTTTTTGTTGTTTTTATTATTTTTTGATAAGTAAATAAT
-GCCACGATTGGTAGATCTAAAACTGAAGAAGGAGACCCTATGGCCTCAATCCAGAATGCC
-ATAGCATGCTAAAATGAGAACTTCCTCCAGGTGTGTATGTGTGTGTTCAGGGCCACCTAT
-GTATGCCCGATACGTCCAGTCTTCGTTGATGAAAATTGTTAGAGGTCAGTATTACAGAAG
-ATAAAACAGAAAGGCCATATGTTAATAATGAGAAATAAGTGGTTAATTCATAATTAGTGA
-ATCTGGTTTCAGCACTTTGGCCTTCGAGGTGGTCAAAACAGGTCTCCAATATGAACTAAG
-GATTGAAAAGattaaaattatttttttaacaaaaattaaGCTCAAAGAGTCTTGGATGCT
-TCAGATTGACTCTGCTTCTGGCATAACTTGAATAGAAAATCATATAAGGGTCTATGATGG
-GCACCATGCCCAGAGCTAGTTGGTTTAAATGTCATTCTATTTTGGACCCTAAAGATAAAC
-ATGGCCTACTGTGATTCCGTCCTGCGTGGCTGTTCTCTGGAGCAGTAGTCATTAATCTTT
-GCCTGCCTTCTCTCCCACCTAGGTGTGTGCCACCACCCCATGGTGACATGAGCTTCatta
-attaaaaaaaaaaaaaaCtttttctctcttttcttaatagaaatgaccttggaaaatttc
-tattggtctgtcttcaagttcatttctctttccatatcatatctacatggctgttaagtc
-caaagtttattatttaaataaataaataaaattgataaaactctagccagttgatcaaga
-aaaaagagacaattaccaaattttcaatatcaggtataaaaagaggacatcattacatta
-aaagttttgtgagagatgattctatatgccaaaatttttgacaacctatatgaaatggat
-aagtttcttaaaagatacaaattaccaaaactgacctaagaggaaacataaagtttaaac
-gatgctgtatcaattggagaaattgaatccatagtttagtcttctcacaaagaaactttc
-atgccttgatggcttcactggtgaagtataccaagaaataataatggcaattctacacta
-actctttcagaaaataaaggaggagacacttctcaaatcattcttcgaggccaatattac
-cttggttccaaaaatatgcaaagatatcacaagaaaagagaactatgagccaatatcctc
-atgaacataatttcagaaatctataataaaatattagcaaattgaatgcggtgaagaata
-gaaaggatcatagaacaggacaatatgatgtttatccccagaatgcaaagttgatgtaac
-atcaaaaaatgaatcaacgtaattcaccatattgatggactaaaggggaaaaacatatga
-ttatttcaataaatgcaagaaaagcatttgacaaaattcaaagccctttaaaaaaaactc
-atcaaactaggagagatggtaacttcaagctgaataatgctagctacaaaaaagtaacta
-cagataacatcacctttaacttagaaggctcatgtctttctactttaattaggaacaaat
-ggtaagttgaccacaaccacttttacttaacgtcatactgaaggtcttagctactccaaa
-aaggctagaaataggaataaaatgcatgcatttagaaaaggaagatacagcagattctat
-ttttagtttttaatttttataggtacatagtagatgtatacatttatggggtacaaagtt
-attttgatacaggcatacaatgtgtaataatcatattagggtaaatggggtatccatcac
-ctcaaacatttatcttttctttgtgttatcaacattctaattatactcttttagttatat
-ttaaatgtagaataaattaattttgactgtagtcaccctgttgtgctattgaatactaca
-ttttattcattctgtcttactatattttcatacccattgaccatcccctcctcccagacc
-cccctactacccttcccagactctgatcatcatcattctactttccgtcttcatgagctc
-aattagtaaaactttccttttttgcagataacatgatcatgtacataggaaaccctaaag
-aatccttggaaaagctattacatctaataaatgaatttagcaaagttttgaatgaaagtc
-tgtatacaaaaatatatatgtgcatattttagcaaaaaattagaaaaagaaattttgaca
-aaaactaccctttccataatagcatcaaaaatgaaatatttaggGGCCGGGCATGATGGC
-TCACCAATCTTGTACCCCAACAACCAGAATGATTATTTTTTATAGTTTTATGTATAGTCT
-ATTTTGGTTTTAAAATGGCAAAATACTATATGATTTTATATAAAAACTAAACTAACTTAG
-AAGTATGCAGTAAGAACGTGAAGGTCAAACACGCTGTCCATAACACTTAGGAAAATGAGA
-TCAACAGTAAATAGAAGACTGGTTACTCATCCTACAAGAAATGGTGATGAATAGGCCTGC
-AAAATATCCTGTAACTCCTCTAGAGGGTGCTCACTAGCAGGACATTCACATGCTACTCCA
-TGTGATGTTAGATTATTGTAAAGCATTATGTTCCTATAAAGGGTGGCGTGACAGTCCATT
-ACCAAGCACGAGACCCTCTGCTGATCTGTCCTAACAAGTGGAATTATGATATGCAGCAAC
-ACAGGAACCAGGCTTACGCTAGCCACATTGCAGAGAGACATTGCCAGAATCTCACTTGTA
-GAGGCCACCATCATATACATCAGTAAGCCTCTCTCCCTGGATCCACATCTCCCTCTATAA
-GGAGCCCTGTTAACCCCATCATTTAAGGGCTTCATACATTTGCCTTATATTTCTCTCATA
-AACAAATCAATGAGTTCCAGACTTTTGGTACAAATGTATGAAGACAGAAGAAATCATATT
-TCAGtcttaaaagcctaatcccagaagtgacacccatcacttcacattccattgccaaga
-gcaaatcacatgaccacacagatgcaaggggaatgagacattggcaaccacttcccagtg
-aCCATTATATATTATAGAAGGGGGGCATGCATGTAAGAGGAAAGTTGGTCTTCTCTGACA
-GAGACGTAGAATTCTACAAACATAGGGGAGGACGTTAAAAGGTGCTGAGCAGATAAAGGT
-CAAATGTCTGTTACAGAAGGACACAGGCACCAAAAGATAAAGagatactcctcaatttat
-gagggagttatgtcccaataaactcaccataaattgaaaatatcatacgtcaaaacttca
-tttaatacaactaacctacctaacatcatagcttagccaagcctgccttaaatgtgctca
-gaatatttatttgagcacatagttgggcaaaatcatctaataaaaagactattttataat
-aaagggttgaatatttcctgtaatttattgaatactgtattgaaagtgaaagatggaatg
-gttgtatgggtacttgaagtatggtttctactgaatgcatatggctttcacaccatcgta
-gagtcaagaaatcatgtcaaccatcataaataggggactatctgTATGACAGTAAAAACC
-ATTTTGTTACACAAATAGCAATCATCAAAAAAGAAAACACAGCAATTTCTGTTGCATATA
-TCCAAGCATTCAACAACAAAAGACCTTTCATTTTAATCAtttttttaagacacacggtct
-gactctgttgcccaggctggagtgcaatggtacaatcatagctaactgcagccccgacct
-cctgagctcaagcgatcctcctgcctcagtctcttgagtagctgggactacaggtgcgca
-tcactatgcctggctagttttttctagaggcagagtcttgctatgttcctcagactggtc
-tcaaactcttggcctcaagtgatcctcccaccttggcttcccaaagtgctagaattacag
-aggtgagccacagcacctggccAAGAATAGACATTTTATATCAAAGTAATTCAAGTATCT
-ATATGAACAAGTAATCGTGCAACTAGGTAATCAGGGCTTTGACCAATTTTGAATTACACA
-ATTAAAGTGCTAATATGTATTGTATTATACTGTATTTGCTGTAGCAATGCAAAAACTTCA
-TTGTTCTTTGTCCCCAAATACAACTGTCACTTATATTTCACTGTTTATGCTGCTAGTACA
-TAGCTTTATAAATTAATCTATCTTGTTTCTGACACTTATACATATTTCATCCTCTGGGGA
-CCTGGAGGAGCATATTCTTTGCCCCACCTCACAATTACCTATGCATATTTCTCAGTAACA
-GGCATAAGGCACGCTGCACAATCTTAGCTGATGAGATAAGAAGTCTCTCCTAAGGCTTTA
-CTCGCTGGACCATGGCAGAAATGTGGACAAGAGTGGTTGCAGAACATGCTGTGCCTGGGG
-CAAGGACCCTCTAATAGAACTAGAAGAGATAAGTCACAGGTACAAGGAGTGTGCAATCGG
-TCTGTTCAGCCACAGTTGCTATTAGAGGCCCCTGAAGAATTTGTTGTACTTTCCACGCTA
-GGCTACCTCGATCACAGAAATCAGCCTAGAGTCATATAACCCAAAGGGGGAGCTGACATT
-GCTGCTAAGCCCTCCTCCTGAGGGCCTTTTATCATCTCGTCCTGTAACCTACCTTTGCCA
-AGACAATTCCTTCAATCTTTGCTTTGTTTCAGGGAACAGTAATCCTACTAAGACTCTAAC
-AGTAGGGACGAGAGAAAGGGATGGAACAAAGGAGTGAGGCAAGGAGGCATCAGATGAAAG
-TGAGCTAATAATCTGTTGGCACCCATCACAtgctgagtacttccacttacattatcacac
-ttaagatgcacaatactttgggcatgatgtcactgccagcaaatctgaaattaggaaact
-caggcccagaagatatgaagtgacttttccggggtatcattaatgcaccagcagtgtaag
-ctaaattgaatccattctgcctgacaccaaaatcgtattcctttcCTTCCCTCCCACAAT
-TGTTTCCATTGGTGTATAAAACCTCTAAAGATCAAGATGTGGCTTCCTTCTTTAAAGAAA
-TAAAGCTGAGGCTAGGTAGTGACAGGTGGGGGCAAGTATGACCATCTATGAATGTTAAAT
-CTCACCCTCAATCCCACCTTGTAGTTTACCATCTATAGACTTGGCCTTCTTTAGATGAAG
-CAGTGTTGTAGGGgcctttctcaactggtgttcctcattcgaaccacagaacacagaaaa
-tgacttaggtgactattttcccaattcttccaaagatgatacatatgaataccattctag
-gtgcttagaagaaaggttaatccaaacacaatggatgtgtttggttgttaggatttaatt
-tgcttgcagaaacccaattgagacatgctgGTAGGGAATCTCTAACATTGGTCCACTGTA
-GAAGACAGAGGAGACGATCAATTTATTTTGTCTATCAACCTGCAGAAATAAAGAGTTTTG
-GTGGAACTGTAGGTAGAGAAAGAAGGAGGTACCTTCCCATGGCCTTGATGAGCCTGAGTC
-TTTCTAAATGCCAGGAAGGAAAACTACTCAAATTAGCTGTAACAGGGAGTTATCACAACA
-ATTTTTATTCTCTTGGGAAGTGCTAAAACAAATATATATGGAAATCTTACAGCCAACAGA
-AACGAatttcccactgctttcctccctcccaaactttcccactgtccctaattgaaaccc
-cattggaaggtaactaaatcctgtacaaccagaatctcctcatctaacttttcatttctc
-cctgtgttaaattaatcctgtttctccctcatggattcaccatcaacttgtactctcaag
-ctgatgctgttcattttcccacttttcatgactcaaggccaaaaggttggtatggcagct
-tcctcccttcccaatgttattttgaaaacattgcttctgtagtgtaaaatccccaactag
-tcaagactcaagtcagctcttttcaatgcctcttcaaccatctttattgttatattttaa
-aaagcagccccccatttattgaggactttggcactttgtttagaatgtatctattctgat
-tattgcctttattattggtgacttcagcatccatatggaaacactatccagttctacaaa
-tgttcagttatttgtcctccttaatgtcaataatttacctgctattctactcctgatttc
-tggccatagagctgtccacgtcatcatcaatgaccactccacacatgaactctgaactcc
-taccaccttctctgatcacacccaggcaccttttcagctccctcattttattatagaaca
-tgcatccgccagacgcttcctccttcacttttctattttttttttttttttttttttttg
-agatggagtcttgctctgtcgcccaggctggagtgcagtggctcgatctcggctcactgc
-aagctccacctcccgggttcacgccattctcctgcctcagtctcccaagtagctgggact
-acaggtgcccaccaccacgtctggctaatttttttgtatttttagtagagatggggattc
-accgtgttagccaggatggtctcgatctcctgactttgtgatccacccgcctcagcctcc
-caaagcctccttcacttttctttattagcctcaaccccatgattcaccactccaagtact
-cccttgccagcatcctcaaatcccaataccatttttaaaattttttaaagaatttctgca
-cccacctgtgtgaaaagttcaacccccagatccttttaactgtttgtcttctccacagac
-aaattcaggctgatgagcagtgctggaaaaagtgcacagctgcgcagattagtggcacct
-gcattcatgatctccagttttcacaaagccctcaGCAGCAGCCACTTGGTTCCCTGTGTG
-CAGCGTTCAGTGGAaaactccatgagggcaagaacaatatctgcttttactcattatttt
-aacccacttgaatgttaagctccatgatgacagggactttctgcggtatagattattacc
-ggcccctaagacagtttctggcacataatagacgctcaataaatactcagtgaaggaata
-aaATAAATAGGAGGTTAAAATTAAGTGATCAACAGTAGTCCAGGGTATTAAAGagactcc
-ccttaaaagctgcaattaagcagagtcatgagaggtgagtaggagctagcctgagaggaa
-atggaaaagacagtattaaaggcaggttgaacagcGCCTCTGTGATCCCTCCCTCATGCT
-TTACACACAATCGTTCTGAGTATTCTGTACTCAAAGCCCTTCCATTCTCTCCAGTTCCAC
-TGCCGCTCCTATGCACCCTCAGATGCAGCCTCTGTATTTCAGCCAGAATGGTAGCTCTAA
-AAGGTAATTCTGCTCATTATTTTCAGCTTCTATTTGGAACTCCTCTCAGAGCTCTCTAAA
-TTTCCTCAAGATATCTATCAGTTAAATGTGTTCACCcagtggtcttccatgtggtttgta
-tatgccaaggtatccccaaaaccctttgaaggagtctgcaaggtcaaaattattttcata
-acaatatttttaaaataactagtttcataataatattttgccttttcacaaaattgacat
-tggctctgaaaatgcaaactgaagcagataaaatagctagtgcctcaccacaaatcaaag
-caggggcacaagtctataattagaagttggattctttatcaccaagcacttgtaattttt
-ttaaatgccactcttaagaatatacttgacaaagtataaaaatttttaattttattgaat
-cccttgagtaGATTTTGTTCTAAGgttaaagtaaattaaagtggaaaccaggcctggaga
-atccatgagcagacaaggcctcttaagtgctcataacttttcttgatttgcaaacgtaag
-caaaacttaattggagctatttcttgtaaatgcctatattaaagaaaaatagaacttaat
-ctcaaccaatcaaaagcagctaactaactcgtaattatataagaaggtacttcccagcag
-gatagaccaaataagacaaaatttgtaactataaccaatcaaatattttatttgtattat
-ttccacacttactgcataaaagcgtgttccttacCACttttttttttttcttgagacagg
-gcctcactctttcacccaggctggagtgcagcggcatggtaatggctcattgcagcctcg
-aactccggggctcaagcaatcctcccacctcagccttctgagtagctgggaccacaggca
-cccaccatcatgcctggctaatAtttttttttttttttttgagatggagtctggctttgt
-cacccaggctggagtgcagtggcgcaatctcggctcattgcaagctccacctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacaggcacccgccactacg
-cccatgcccggctaatttttttttcttttttttcttttttggtagagagaagggtgtcac
-catgttgctcaggctggtttcaaactcctaggctcaagcaatcctcccaccttggcctcc
-caaggtgctgggattactggcaggagccaccatgtccagctTccttaccacttcttaagt
-gaagaccccgaaccacttctggtttggagttgcccaattcatgcattgctgtttgctcaa
-ataaactcttttaaaaatttttattatgcctcagtttaccttttGACACTatgttctgag
-taatacaaggaaaagtacatataaagcacttctgcagtataacaagctatgatggttgtc
-gccagaaaaatcacttaaataactatttggattttaaactgaactaggcacttttttatg
-aaacatcatttttatttgaaagaatgatggaaaaagtatggttattcagacttacatact
-tggcagaaattttctcaaaaattaacaaagtgaacttgtcatttcaaagaaaatagctag
-caatattagttaccaatctattcttataatgtgtggctgacaacaagaagtgaagtcact
-gctccctttccttgaacctgggaagatctttgtaaccaacctgaccagtacaatgcagtg
-gaagaaatatcaggtgatttccaaggcagaacagcttctgactggccctctgtctccagc
-caccatgttagaaggaagttcaggccacatggagacagcaaggcctctagctcacagtca
-gcatcaactgccagacatgtaagtgaatgggcctccagatgattccagtccccagtcttt
-gaggcttcccagctgacgtcactgacattaccatgcagagacaagccatctctgctaagc
-cttaatttttaacccatagagaccatgaaagaataacaaatgatgattgttttgaagcca
-ctacattttggggtaattcattatgcagcaatgggtaaGTAATCCTGGCATCACATGTTT
-TTCAAGAATGGGAATATGTCTTTTTCTTCCTGTCTTTCATGTCTAAGCCCTCTATCAGTG
-GTGCTTGTTGTGTGGAGTTTGGAGCCCAGGAGTAGTCAGAAAAGACTTTGATGACACAGG
-GTTGCTTGTAGAACATCTAATATGAGCAACTCCTACCTTGTGCTCACTGACCAGGCCCAC
-AGAAAAGTCAACAAGGGCAAAAGTTCTTTGCCTCACAGCACAGAACTGCTCCTTCCTCTC
-TGGTGCCTCTCCAACCACAAAATTCCTTGTCCCTGTCTTTGCCAGTCTCATGTTAAGAAA
-CCCCATAGACCCAGGTATTCTCCAATCTTGATGATAGAAGGGGAAACTGAGGAAGAGGTC
-CAGCTCACAACATTCTTACCAGCCCAGGGGGAAGGCCAAGATCTCCACAGAGTCATAAAC
-TCTAGGCCAAGACTATGCCTCTCCCAGGAATATCCAAGTTGGATATACCATATATTTTAT
-GCAgataaaatagctagtgccttaccacaaatcaaagcaggggcacaaatctgtaactag
-aagttggattctttatcaccaagcacttgtaattttttaaaatgccacttttaagaatat
-acttgacaaagtataaaaattattaattttattgaatcccttgagtaGATTTTGTTCTAA
-Ggttaaagtaaattaaagtggaaaccaggcctggagaatccatgaaaagacaaggcctct
-taagtgaTAAAACCTGTATTATTCCTACAGAGTCTCCTCTAATGTCAGCAACTGTCCTGG
-TGTCTCAACCTGTCTTTACCACCTTGATTTAGCCATCATGAAAGATCAGCCAACTCTATG
-TTATTGTATTTTTATTTCCATCTCTACTTTTTATTACAACAAAGGTCCTACTTCGTTGAA
-TTTTCCCTTGCTTTTAAAAAAACGGAAGGTCTTTAACTTGTTCTGAAGAAACCTCCTGTG
-AATTTCAAAAGGGCTCCCTATCTGTTGCATGTGGGGAAGGGCCACGCACATCCACATTCC
-CTTCGTTCCAGGGCACTGGATTTTCAAATATTGAGTTCTTGCTGTCTTCAGTCTTTGAAT
-AAAGCTCACGTGGACAACTATGAAGTTTAAAAGCATAGGTTGAGTTTGGGGTATAGTCAT
-GAGAATAGAGAGGAAAGAGCAGAAGTACAGCTCATTGCAGAGGACAAGCATCATGATATT
-CAGAACATTTGATATGGAGTGATATGGGGTAAGAGTGAGCTGGGTTTTATTCTGGGAAAT
-CACCCAGccctgaaaaagctatttatattcttttgttcactttccttatctgtaacacag
-agaccgttatgccaggtttcctagctactttagttgttgtgaagCAGCATATTATAAATA
-TCATAAAAGATTATCCAGTgctaggtgccatggtgcacagctgtaatcccagctacttgg
-gaggcagagtcaggaggatcacttaagcccaagagttcaaggctgtactgcactgtgttc
-acacctgtgaatagccactgcactccaacctgagcaacacagtgCCTCTTAAATAtgtat
-atgtatatatatatatatgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtATAT
-ATATATATATATACTCTTTTAAATTTACTCTGTTTTAAATATTTTGAGGCAGAAGCAAGA
-CGTTTTGATACAGAAAGCCAGCAGGTTGCTGAATTACAAGACTGAAGCTGAGGAAACTGT
-GTTTATCAATAGAGATGCACCGCTCATTCTTATAGAGGGAAGAtacaaagtaactctatt
-aagtcaagaatttctatatgttttatttactgcaatatcctcagtacatagacagcagtt
-gacatatagtattgatcatagtatctaatgttcaatagatatctgctgaatgaactgaaA
-AATTAATAATGTTGAGCAATAACAGGTAATCACTGTAAGATAACATTCTGAGGAGACTAA
-AATTTGAAGAATGCCTACAAGAGAGGGAGATGCAAAGGGAAAACATATCCTAAAAAATGA
-AATGAAATTATCCTTAAGAGAAAAAAGAAACACCAGTATGATCAAAGATTGCAAGAGGTA
-GAAGACAAAACTGCATAAAGTAAAACAAAATGCTGAACTCTTGAAATGCAAAAATCCAAA
-AATCCTGTTGCCTGTtttttttttgtttgtttgtttgttttttttgagatagagtttcac
-tcttgttgcccaggctgaagtgcaatggcaccatctcggctcactgcaacctccacctcc
-ttggttcaagtgattctcctgcttcagcctcccaagtagctgggattacaggcgcccacc
-accatgcccagctaattttttgtatttttagtagagacgggtttcatcatgttggccagg
-ctggtctcgaactcctgacctcaggtgatccacccatcttggcctcccaaagtgctggga
-ttacaggcatgagccactgcactcggctGTATTTTTTTTTTTCACTTATTTAGAAGGCTG
-ATTTATTATCACCTCCTGCCAGTCACGGGAATGAGACAGAATCACCTTGAGAGTATCTAC
-AGGGAGAATCTGGAGTCCAAATCCCTTCTTAATCAAGAAATGCTCTTTAATCAACTCCCT
-ATATATAGGGAGGTTGATGCTGGGACAAGAGGGGCTGAATAACTTGGGGTTCTAGTCTTG
-GATATGGAATGGGGGCAAGTGTGTACAATCTCTTTGATTTTCCCCAGGGCTTCCATCAAT
-ATTCCAAAAGACTAGAAATTCTGGACAGCAGCTTTTCCCTTCTCTCCCTTTCACACTTCA
-GTGACTTCTGTCTTCATCTTAAGACACTAATCTACACCCAATTTTCTCTCCTTCCTTTTT
-GCAGGAATGCTATTCATTCAAAAATGCTGGGATGAAAGAGCAAACTTGCAAGGATATCTG
-CTACAATAATTAAAGAGAAATAGATGCCTATAATTAAAAACATTGCTGCTTGTCTCTGAA
-ATTATTTGAACACTGTATACATCATAATGTACATAATCAGTTTCCATCTGATATCCCAGA
-CATCTAATCCTGGAAACAACGTCTAATATCTCTACCCCAAAGCAATAGAATTAGAGCTGG
-AAGGGGCAGGTAAGCAACAGTGTGGACCTTTctcagcagcagtgaacttggggtgctcac
-aacctgtgcaaaaccagctgtggtggctaaggattgcctatgtcacctctcccccaactc
-taggcaatgcagcttggggatagactccttccacttgggggaagaagagggaagagtaca
-gagggctttgccttgcaacttgggtaccagctcagccacagtaaagtaaagtatcAAAAG
-TTacccagcatggtgccagctgtggtggccactggacttgcccttcccccaactccaagc
-agcctggcacagagagagagactccttttgtttgggggtaaatgagggaagagaagaaga
-aactctgcctggtaacccagggaatttggccaaatttaaaccccagcccactaaggtggt
-tcctctaggactcagcgagagttgcagtgtttctgagcttagggcaccctctagtgctga
-tatagtttcaataatcacaggctcaaatcacaacactcaatctccttcaaatacctgaaa
-agccttcccaagaaggatgggtgcaaacaagcccagattgtgaaggctacaatatgtatc
-taactcttcaatgcccagacatcaacaaccatcttcaagagttaagaacatccagggaaa
-tatgacctcatcaaatgaactaaataaggcatcagtgaccaatctgagaatgatggagat
-atgtgactttttagacaaataattcaaaatagctgtcttgatgaagctcaacaaacttca
-agacaacacagagaaagaattcagaattacatcagagaagtttcacaaagaaattgaagt
-aatttctaaaaaatcaagcagaaattctggcactgaaaagtttgattgtcaaagtgaaaa
-atgcataagagtctttcaacggcagaattgatcaagcagaaggaactggtgagaactggc
-tatccaaatatacacgaagccaaaaaaagaattaaaaaagaataaagtatgcctacaaaa
-tgtagaaaatagtctcaaaagggtaaatccaagagttattggtcttaaagaggatgtaga
-gggagagaaaagggtaaatagagagatcttttcctcagcacatggaacattttgagagat
-cagggtagaaaggtcagagaaataaaaacaaacaaccttccaaacctcaagaaagatata
-aacatccaggtacaaaaaggtcaaaaaacaccaagcagattcaacccaaataagactacc
-tcaaggcttataataatcaaactttcaaagatcaaagataaagaaaggatcctaaaagca
-ccaagagaaaagaggcaaataacatataaaggaactccaatacatctagcagcagacttt
-tcaacagcaactttacaggccaggagggagtgggaaaacatatgaaaactgctgaaggaa
-aaccaaccttcaacctagaatattatctccagcaaaattatcctctaaacatgaaggaaa
-aatagtctcccagacaaacaaaagctgaggaatttcatcaataccagatctgtcttacaa
-gaaatgcccatgggagttctccaacctgaaataaaaggacattaactaacaacaagaaat
-cgtctgaaggtataaactcactggtgatagtaagtacacagacaaatacaaataccctaa
-cactgtaattctggcatatgaaccgttcatatctttagtagaaagactaaaagacaaacc
-aatcaaaaataataatgacaacaactttttaagagattgtataaaaagatacagagacaa
-taaaaatcaaaaagagtgtagagtgtagagtggttgtctctttgcttgttagtctgtttt
-tcttttctttttaatcaggattaagttgtcatcagtttaaaataagtggttataagatgt
-tatttgcaagcttcatggtaagtacaaaacaaaaacctgtaacaaatatgcaagaaatta
-aaacatactaccacacaaagtcaactttacacaaagaaagatggaaggaagggagggagg
-gagggagggagcagggaagggaaggaagggagggaagggagggaatggagggaaggagga
-aaggagggaaggagtgagggagggagggaaggagtgagggagggagggaaggagagagga
-gaaaaggagggagagaggagaaaaggagggagagaggagggagggaggaaagggagggaa
-ggagggaggaagggagggaaggaaggaaggagggaaggaaggaaggaaggaaggaaggaa
-ggaaggaaggaaggaaggaaggaaaaagaggaccgatgaagcaaccagaagataaatttt
-taaatggcagttgtaagtccttatctattaataagaacattgaatgtaaatggactgaag
-tctccaatcaaaagacatagagtggttgaatggataaaagagcaagacccaactacatgc
-tgcctatgagaaactcacttcacctataaagaaactcatagactgaatataaaggaatga
-aaaaagaaattctatgcaaatagaaaccaaaaaagaagttattatacttatatcagataa
-aaatatctttcaagacaaaactgtaaaaagagacgaaggtcgttgtttaataataaagga
-gtcaatttttgcaagaggatataacaattataaatatatatgcacccaacactagggaac
-acagatatataaagcaaaaattattagttctaaagagagaggtagaccccaaaacaataa
-tagttagggacactaacaccccactttcagcattggacagatcatcaagacataaaatcc
-acaaagaaatatcagacttagtctgcactataaaccaaatggacctaacagacatttata
-gaacatttcatccaacagccatggaatacacattattttcctcaccatatgaacattctc
-aaagataaaccacttgttaggccacaaaacaggtctcaaaagaatctaaataattaaaac
-catatcaagtatcttttatgaccacagtggaataaaagtagaaatcaataacaagaggaa
-ctttgaacactatacaaacacatggaaattaaaaaacataatcctgaatgaccgttgggt
-cattgaagaaattaagacagaaattttaaaatttcttgaaacaaatgaaaatggaaatac
-aacattccaaaacctatgggatacagcaaaagcagtactaagagggaattttatagcaat
-aaatgtgtatatcaaaaaagtagaaaaaatgatcaataaagcagtctCAGTATCAAAAAT
-TATGCCATATGTCATTCCCTTCCCCAATATAGAAATTATTTAGAAATCAATAAcaaaaag
-ttcaagaaaatgtatattatgaaaaaaatcatgtaagaatttcaaaatgttttgcaccaa
-aataaactaatactaactggttataaaatgtttgaacaagatctagtttcagacactaaa
-aaagataagacatcagtctgaaaagagcccctatcagagcaacatgaattctgctaaaat
-tgaagcaagaacaaacatcaaatgtacagtgaagcttgggtagaagaatgatgaaatcat
-tgatgctttacaaaaagtctatgggacgatgccccaaggaagtcagcagtttgcaaatgg
-ataactcattttaataagggatgagataatattgaagatgaagccaccagcagcagacca
-cccacatcagtttgggaggaaaaaattaatcttgttcatgccccagttgaaaaggactga
-taattaacagtaaaaacaattgtcaacatcatagacttctcagttggttcagttaatgga
-aatctgactaaaaaattaaagaagaacaaactttccacttgatgggcgccaaaaccattg
-tgccaaaatcagctacaaacaagagcacagctttcaatgaaactttaaacaagtgggatc
-aagatcctgaagcatttattcaaagcactgtaacaaaagttggaatctggctttaccagt
-atgaccctgaagacaaagcaaaatcaaagcaaagagatggaagtgatccagtccaagcaa
-aagctgaccagttaagaacaaaagtcatgtcaacaatttttgggggtgcacaaggcattt
-tgcttgttgactttctggagggccaaagaacaataacatctgcttattatgagagtgttt
-tgagaaagttagccaaagctttagctgaaaaatacccaggaaaacttcaccagagagtcc
-ttctccaacatgacaatgctcctgctcattcccctagtcaaacaagggcaatttttcaag
-cgttttgatggaaagtcattaggcatccacattgccatcctgacatggctccttttgact
-tctttttatctcctaatcttaaaaaaaaatctttaaaggacaccaatttttcttcagtta
-ataatgtaaaagaacactgatgtggttaaattcccaggaagctcagtccttcagggatag
-actaagtggctggtaccattgcttacaaaagtgtcttgaacttgatggagcttatgttga
-gaaataaagtttatatctttatatttttatattttaatgtcatcttccacaaactgtttg
-aagttccctcataactaaaatgtccccacatgctcagataagaaacacatttctcaacca
-atgtttctcagatattaaagtacatacaaatcacctgaggatcttcctaatacgcagatt
-ttgattgactcattctgagatgaattgaaatcctgcatttctgacaagctctccggaagt
-gttgatgcttctggtctttccaccacactgtgaatagcaaggttcaaactaattcatatg
-tcagaaaagatgacacagtggaaattgaagtgtttatttttaagtgaatgattatgataa
-caaaacactgcaaataaaaacttatgaagtccagctaaagctgcatataaagggaaaatt
-agagtcttacccacttggttatactgaagaaaagctgaaaatgtatgagataacaacaca
-aataataagttagaaaacaataacagaataaaatgaaattttattcaaagaagttcaaag
-aaaggaagataaagctgagaggagaaaataattaaatattttttaattttcataatattt
-aaaataaaatataattaaataaaaatcaaacatagaatcaacaaaaccaaaagctgattt
-tgaaaagaccaattaattaattcactataggaataacaaagaaaaaattgaaaacacatt
-acccatatgaagaataaaacacgtagccatcactacaaactctatagatagtaaagagat
-caaaggacatattgtgagtgaccttatgccaaaaatgaaatttagaagaaataaacatta
-cttgatgtgacccaagaagaaattgaaaatttgacagttctaaattgttagggaaattaa
-atctTAAATCTTTAAACTCAGTTGAGTTTTTCTGCTACATTCCAATGTCTGATCCCTAGC
-TCTATGGGTTTCAACAGACAGTTGTAGAAGCAGCAGAAAAATATCCTTGCTCTTATATTA
-CAGCTACCGTGGTGTGTTCTTGAAGTCCAGCATGTCTAATCATGGGATCCTGTCACCCTA
-CTTTCCTGACTATGAAAGAACTAGCAGATTCTCTGCTGGGCCAGTTTGTTGGAATGTTCT
-GGAAGTCATTCTGGGAGACCAAGCCCACAGTCAGCTTCTGTAGAGAGTTTATAAGCACAT
-AATTCTGAGTATTAAAAATATTTCTGTTGAAAATAGCTAGTGTTTTTCATTTCCCAACTG
-ATACACATAAATGCAACACTTTGCACATGTGAATAATTTGTCTTTTTACAAAATTATGCT
-ACACTGTTGATAGATTCATTCCATATATACATGCAACATACTTAATTTTTCATAACTTTC
-CAATTCTTATTAACTCAACTTTTTGTTCCATAATAACTGTGCTTCTCTTTGTACCAGTAC
-TTTCCATATTCTTATTGCTTTGGGACTAGCAAGACACAATGAGGTGAATAATGTTATTTC
-AATGCATCTTAAAACACCAGAAACCAATTAATATGCGATATTCAGGATTAACTGATTCCA
-AAGGGCTGTTAATTCCATCTCTTGATATTGACAAGTAGTAAGTAAATATGCCTAAGCTTG
-ATTATTTTTGTTCATAGAAGTAAAATATACATTTCATAAAGTGAAAGTTCATAAGATTTG
-CTTTTATTGTTTTAAAAAATAACAGTTAATTTAAACAAAACTGAGGAGTCATTGGATACT
-ATAGTAGCTAATGAAATCCTAAGAAGACATGAATTTCAGGAAGGCGAGGAACCAGGGAAA
-CTCTTGAAACTTGAACAATTAATAATATTCAGAGCCAATGAGCTTCAATATCTGAGTTTC
-TTAGGAAATGTCCCAAATTAGCAGGGGAAAGCATCTGATTGGTAGGCTTGGTTCTATTGT
-TACACCTGGATCAATCAGCTACGACCAAGGAATCTGAGCAGTACACTATAAAAATTGCTG
-CTTTTaattatttcaaccattgtggaagatagtgtggcaatccctcaaaaacctaaagtc
-agaaataccatttgacctagcaatcctattactgggtatatgcccaaaggaatataaatg
-gttctattataaagacacatgcatgcatatgttcactgcagcgctattcacaataacaaa
-gacatagaatcaacccaaatgcccatcatttggccatttggataaagaatggataaagaa
-aatgtggtacatatataccacggaatactatgcagccataaaaaagaatgagatcgtgtc
-ctttgcagggacatggatggagctggaggccattatccttagcaaatgaaggcagaaaca
-gaaaaccaaatactgcatgttctcacttataggtgggagcaaaatgatgagaacacatgg
-acacacagaggggaacaacacacactggagcttactggagagtggaaggtgggaggaggg
-agaggatgaggaaaaataactaatggacactaggcttaatagctgggtgatgaaataatc
-tatacaaccaacccccatgacacacattacctatgtaacaaaccagcacatcctgcacat
-atacccgcgaagttaaaaaagttTTTTTTTAGTTGCTACTTTAAAAGGATGTGGGAATCA
-TTGTAAACTCAAAAGTTAAAGATGTGCCAAGAGCTGTCTCCCACGAACTTGTTTAACAAA
-CGTACTGACTTTGTATGTTGATCCAATACCCATGCTGGCCACTGGACATACCAGTACAAA
-CAAGGCAGAATCTTCACTCTCCTCTAGCTCTTCTAATTCTCATGCACTAAGTGCCAACCT
-TAGCATAACTGGGCTGACAATCAGTGAATCAAATATCTAACTCTTATCCTACTCCAACGT
-TAAGAAAGAGACATGCgactgggtgcggtggctcatgcctggaaccccagcactttggga
-ggccaaggtgggcggatcacttgaggtcaggagtttgagaccagcctggccaacatggtg
-aaaccccgtctctactgaaaatacaaaagttagctgggcatggtggtgcatgcctgtagt
-cccagatactctacttgggaggctgaggcaggaggattgcctgaacctgggaggcggagg
-ttgcagtgagtcgagatcacgccactgcactccagcctgggcaacagagtgagactccat
-ctcaaaaaagcaaaaGAGAGACACATGCAAAGGGCTTGCTCTTTCTTTCTCATCTTACCT
-ATCTTATGTTTTCCTCCAGGATCAAGAGCAAGGAATTTGTTGCATAGAGGTGTTCAAGAA
-AGGGTGTTTTCAAACAGAGTCAGAAAAAACACAACTATACTGCGAGCAGCATACAAACCT
-GCTTTGGCTGCACTTCACTGCTCATGGCATAAGGCCACGAAGAGGCCAATAAAGGCTGGA
-GCTCAGGAGCATCAACCCAGATTCAAGGCTTCCTCTCTGGCACCCAACCATGAAGCTCCT
-TTTTCCTATCTTTGCCAGCCTCATGCTACAGTACCAGGTGAACACAGGTAATGTGGATTC
-CCAAGTTTAAGATGGGTAGATGAGAGGAACCAAGGATTTGGCTGCCCATGACAATGGAAA
-CCCAAAGAGAGGAGACTGAAAGATTAGCTGTTCAAAAAGATGGCTAAAGAGCTTACCTAT
-TGTATCAGTCATGCACTGATACATTCTCATAGGCCCCAACTGCCAGATTGTGTCCAGTGG
-AAACACCCAGGAAGCTACAGAGAAAGCAGGGTATTTTTTGTCTATTCAGAAACTATCCAA
-AATATAATGCTGCCTTCCTGCCCTGTATATGTCTATCATGCTAAGACTAAGCCCAGGTCT
-ACCTCCTTTTAGCTCTATTTCTATCTTAAAAGCCCTTTTTTTTTAAAAAaagtcctgggg
-tacttgtgcaggatgtgcggtttgttacataggtaaatgtgtgtcatggttatttgctgc
-acctaccaacccatcgcccaggtattaagcccaggatgcattagctatttttcctgatgc
-tctccctccacccaacaggccccagtgtgtgttgttccccttcctgtgAAACCACCTCTT
-GAAGCAAAGTTTCCTATCAGTTTGTGCTTGGTGTAGAAAGGAGGAAGTTCTTCCCTCATG
-CTCAAAAAAAAACCCTTTCAAGATCAAGTAAACAGGCCTGTGTTCTCCATCTTGAATTCT
-TTCAGGTTTTCCAGAGCCTTTATCGCTTCTCTCAGACTTTGTCTTCCTGAAAACCCCCAA
-ACTACCATAAGGGCATCTAGGAATGCATTATAGCAAAAGGCTAAGCCAGGGGATTAACCA
-TTGTTTTTGGAAAAGAAAGGAGAAGCACTGAGATTTGTTTCAGAATACAAGAATCATCCA
-GCTATTTGAAAAAATTAGCAAAGGGTTTCGGGGCAGGGAAAGTGGAAGTGTCAAAGATGC
-TTCTAATGTTTTTATCTTCTAATGTTTTTATCTTGGGACCCTAGGAAAAGGGTAGTACCA
-TAAGCAAGTAtggctgtgtcatcttgggtaaagtcacttaaccactttgaacttcaattt
-cacatgagtataatggggttaatcaatgcAGCTGATTCCAATATAAGAATTTTTCTGTTT
-CCCGTTTGATGAGAAAACAATGTGGAAATGTATGCAAATATGCTTTGAAAATTAGCAGAT
-GCTACATAAATCTCTTGTAATTTAGGGAAAATCATTGGGTTATTAAGATGAACAAGGGAG
-AAAAGCTTTCTTGATTCAGAAAAAAGAAACACGAGACATTAGGATGGAAAAGTCATTCAG
-CAGATAAAGATAAGGTACTAAGCCGAGCAGGAAATTTAGAATTATAGATAACAATACAGA
-AGTTACCTTGGTGGATATGAGGTTAAGGCTAGGATAATGAATGAGACTTCTGAGAGATAG
-AGTGTCCAAAGAGGCTAGAAGAGATAGAACACCATGCTTCAGGAATCACAGATCTAGTGA
-TTGTTGAGAAGAGAGAAGTCATGGGCTACTGAGTTTGGTGAAAAGATAAGACTCCTGAAA
-ATTCTATTGATTCTCTTTTGAACTTCTTTCTTAAATTAGTTTTATGATGGACTTGGCTCT
-CATTGGTATTTCCCAAGATTATGGAGATGGGATAGTGATGTCTGACAAGTACCTAAGATG
-CTAAGTTGAAGGTCTAAAATTCCATCCTAAAAGCAAATAATTACTCTATCATCTACGTGC
-CCTTTGCTTCTTAAAGTTACTCAAGGAAGGCAGACTAAACAGGAAATTTACTTTGGATTC
-AAGAGGGGCATAGAGACGCTCTCAGCCTGCCCATTTGCCTTCATCAACATTCCTAAACAC
-TGGGCTTAAAATGTAGTATGAGTAAACTCTCTCTTAGTCTATCCATCTCCCACTAGCAGT
-TTTAACATCATCTCTAGTTATTAACCTTGGCTCAATGGCTTTCTCTTTTTTTATACAGAA
-TTTATTGGCTTGAGACGCTGTTTAATGGGTTTGGGGAGATGCAGGGATCACTGCAATGTG
-GATGAAAAAGAGATACAGAAATGCAAGATGAAAAAATGTTGTGTTGGACCAAAAGTGGTT
-AAATTGATTAAAAACTACCTGCAATATGGAACACCAAATGTACTTAATGAAGACGTCCAA
-GAAATGCTAAAACCTGCCAAGAATTCTAGTGCTGTGATACAAAGAAAACATATTTTATCT
-GTTCTCCCCCAAATCAAAAGCACTAGCTTTTTTGCTAATACCAACTTTGTCATCATTCCA
-AATGCCACCCCTATGAACTCTGCCACCATCAGCACTATGACCCCAGGACAGATCACATAC
-ACTGCTACTTCTACCAAGAGTAACACCAAAGAAAGCAGAGATTCTGCCACTGCCTCGCCA
-CCACCAGCACCACCTCCACCAAACATACTGCCAACACCATCACTGGAGCTAGAGGAAGCA
-GAAGAGCAGTAATGTGGATCTTTCCCTTAAAACTCCAAGTTCCTCTCTATTTTTGCTATC
-TATAAAATGACATAGAACTGTTTCCTCTGTCATCAGTCATTCAATAAACACTGTTTGAGC
-ACCTACAGTTTATGTAATATTATCATTCTCACAAGAGCCTCACAGAGGGGGTAGAGCTAG
-GGAGGGATGGAATTGTTTAAGTTTAGATGCCCAGGAGAAAGTAAGCCTCAGGAGGGTGAC
-TACAGCATCGAGTTTGTCCCAAGCATGGCCTAGATTAGGCCTCTGTAGCAAGCATTTATG
-TCTCTCATATGGTGTGTTTTTCCTGGAGCAACAGTAAGGAAAGCATCAGGAGATGTATTT
-TCTTTTCTCATGTATTTGGGAGGAAAGGCCCAAATGCAAAATAGAATATGTAGGAATCag
-aaaaaggttaaattaattgtaataatatatttttgtttcgttttgttttgagacggagtc
-tcactcagttgcccaggctggagtgcagtggtgtgatctcagctcactgcaactccacct
-cccgggttcaagcaattctcctgcctcagcctcctgagtaaccgagattacaggcgcaca
-ccaccacacccagctaatttttgtatttttagtagagacggggtttcaccatgttggtca
-ggctggtctcgaactcctgacctcgtgatccgcctgcctcggtctcccaaaatgctggga
-ttacaggcatgagccaccacacccaaccaataatgtgttttattgaatgcaatatatcca
-aaacatgatcatgttgacatgtaatcaatgtaaaaattatttatgagagagtttaccttt
-tttggactacatctttgaaatctcatatgtgtaattacacatagagcacatttctattca
-tactagccacatctcaagtgctcatagtcatatatgaatagaggatttcatagcatattg
-aacagcAACAAGGCTAGAGAGTTTTAGGGCACAAGTAATTATAGTGACTCTTAGGCATAG
-GGGATGCCCCTAATCCAGAGGAGACAGGCATATTTCTGAGGGCtgtggcatataatttaa
-gagtatagaaattcaggtctgatatgcccggactagcatcctagattctggcacttttta
-gctgtgtggtcttgaacaaatcatttatccacacataagcatcagtttatttattcataa
-aatggagatGTGAACATTATATTATATCCCAGAAATCAGCAATCTCAGATCACTCTTCCT
-CTTATTGCCCAAATTACAATGGCACAGCCACCTATTCTAGttttttaatagctttattga
-agcataattgatatacagagaattgaacatatttaatgtgaataatggcatgagtttggg
-catatgcaaaatcctgtgatactatcaccacaatcaaggtgatagacgtatacatcacct
-cccaaagtAacatgaccatatttgtagaaaaccctgaaaacttcacgaacacacacacaa
-aaatgtagaactaagaaatagattcaaaaaagtcaacatacaaatatcagtggcatttct
-atacacttaacaatgaaccattccaaaagaaaatcaaggaaacaatctatttacaaaagc
-aacaaaaagaataacataggaataaacttaaccaaagaagtgaaagaggtacattaaaaa
-cttaaaaatattgatgaaaaaatcaaaggaaacacaaataaatggaaagatattccatgt
-ttaggtattgaaagacttaacattgttaaactgttcattctgtctaaagcaatctacaga
-tataatacatctccccccttccaaatcccaatggcattttttaaagaaatggaaaaaaca
-atcctaaaattcacagggtaccataaaagacccagaatagcaaaatcaatcttgagtaaa
-aagaacaaagctgaaggcatcacactttcttatttcaaaatatattacaaaggtatagta
-attaggccaggcgcagggactcacgcctgtaatccagcactttgggaggccgaggcgggc
-ggatcatgaggtcaggatatcgagaccatcctggctaacacggtgaaacctcgtctctac
-taaaaacacaaaaaacaaaaaatagccgggcgtggtggcgggcgcctgtagtcccagcta
-cttgggaggctgaggcaggagaatggcgcgaacccgggaggcggagcttgcagtgagccg
-agattgggccactgcactccagcctgggcgacagagccagactctgtttcagaaaaataa
-ataaataaataaataaataaataaataaataaataatggtgttgggaaaactggctaccc
-acatgcagaagaatgaaattggatccttatctcaccccatataaaagaaatcaactcaaa
-acggattaacgacttaaacataagacctaaaactgtaaaactactagaagaaaacacagt
-actgttctgtatttaagctccatgacatcgttctgggcaatgatttcttgcatatgaccc
-caaagcacaggcaacaaaagtgaaaataggtaactgCATCCAGATTTTTTAACATATTCT
-TCTCTGCTACATATCACCTACCTCCATTCAAAGGTCACCTTTCCCCATCCTACTCATTTT
-TTAATACAGTGTCACTCTAAGAAAGACAAAGATTTTTCATGATGCCCCACAGTGATTCTA
-GAATATAACTAAAAAATATTTTCCTGGAAGTTTTTGCACAACAGAAAGGAGTTGCAATAC
-AAAGCATAAGTTTAACACCTGCTAGATATGTGTTCTCTGAGGAACCCCAAGCCTACCTGA
-TGGGTGTCAGATTCTCTCCCTGCTACAGCTATTTGTCAAACTCTTGAAAGTCCAGCTTTC
-CTTCCCATGGAAGGAAAATTCCCACGGAATGCTCTCTTCCGTGTTTACCCACAGAAAGGA
-GAGAAAGGTTCTTTCTCACACAAGTCTAAGGCCTTCCTCTAAGTCACCTTTTCCTATCAT
-AGAACTCACCCAGCACTTCTCAGGATAAATGATACTGCAGAATATGAGTTTGCTTCAGGG
-AAATCCCATACCCACTGTGAAAAATATGGTAACTctccaatatcagttctccccctttgc
-taagtaatagaaccctccaaatattaggttgacacaaagccgaccagagaaaaggctgaa
-tttcccaTCTAGAACTGGTCATTCTTCAATTCAGACCAGCCATAACTGGACACTTTTGCA
-AATATTCATTAATAGTCTTGGTGAAAACCTCAGATTTCCATTTTGCCAAAGTTTCCAAAG
-GAAAAGAGGGCCTTTTTCTAAGCCCTGAGAGCCCCACAGTGACAGTAAGTTCTCCCTTGG
-AATTCACCCTGGCATACCTCGGTGCTACCCCAGATCCTTTCCCTCAGGGGCTATGAGATT
-AGGTTTCATggccgaatgtgacggttcatgcctttaatcccaacactttgggaggccgag
-gcaggaggatggcttgagcccaggagtttgagaccagtctgggcaacatcatgagactct
-gtctatgtaaaaaataaaaattaaccaggtgtcatggtacataactccagtccctgctac
-tgtggggcaggggctgtgggggctgaggagggaggattgcttgagcccagaaggttgagg
-ctgcagtgagctgtggtcgtaccactgcactccagcctgggcaacagagcaagaccctgc
-cttttaaagaaaaagagaaaGGAggttgggcatggtggctcatgcctataatcccaccac
-tttgggaggccgaggcaggtggatcacctgaggtcaggagttcgagaccagactggacaa
-catggtgaaaccccatttctactaaaaatacataaattagctgggtgtggtggcgggcac
-atgtaatcccagctactcaggaggctgaggcaggagaattgcttgaacctgggaggcgaa
-ggttgcagtgagtcgagattgtgccactgcactccagcctgggtgacaaaagcaaaactc
-catctctaaataaataaataaaaataaaaaaGAGAGAGAGTGAGATTAGGACTCACCCTG
-GCCATCCCAGGTCCTGCCACTCCAGGTCCTGCCACTCAGGGACTGTGTGACTCTATATTT
-TTTTTAACTTCTCAGGCCAATATTAGAACCCAATCTGATCAAATTAGAAACCTATGAACA
-TTCCACTTACTAGCAGTGCATTCATGGAGCACTTCACAGGGAGTCACCAAAGTATCAATC
-AATCAATAAACTACTACCCTACCCTGAACTAttaggttggtgcaaagtaattgcagtttt
-tgcattgttggaatttgctgtttgatattagaatgcgttcttaaataaatgtggttatgt
-tacactttttttttttttttttttgagatggagtttcgctcttgttgcccaggctggagt
-gcaatggtgtgatcttggctcaccgtaacctcctcctcccgggttcaagctattctcctg
-cctcagcctccctagaagctgggattacaggcctgtgccaccatgactgactaattttgt
-atttttagtagagacggggtttctccatgttgatcaggctggtctctaactcctgacctc
-aggtgatgcacccgcctcagcctcccaaagtgctgggattacaggcatgagtcactgctc
-ccggcctatacatcattttaataggcatttctcactttatgttttttgataatgacttat
-tacttgctgttgattttatgtttattttagactatggaaatgatgtcagacaaaaagaaa
-attcaagcgattttcttattcaagttcaaaatgggtcgtaaagcagcagagacaacttgc
-aacatcgactgcgcatctggtccaggaactgctaacgaacgtacagtgcagtcgtggttc
-aaaaagttttgcaaaggagaggagaacctcgaagatgaggaatgtagtggccggccgttg
-gaagttgacaaccaccaattgagagcaatcattgaagctgatcctcttacaactatacaa
-gaagttgctgaagaactcaaccttgaccattctatggtcgtttggcatttgaagcaaatt
-ggaaagatgaaaaagctcgataagtgggtgcctcatgagctgagcaaaaatcaaatcatc
-attttgaagtgtcgtcatctcttattctacgcaacaatgaaccatttctcaattggattg
-ggacatggcaatgaaaagtgtattgtatgtgacaacctgctacaagcagctcagtggttg
-gaccaggaagctgcaaagcacttctcaaagccaaatttgcaccaaaaaaaaaggtcatgg
-tcactgtttggcactgtgatccactacagctttctgaatcccagcgaaaccattacctct
-gataagcatgctcagaaaatgagatggaaatgagatgcaccgaaaactgcaatgcctgca
-gccggcactggtcaacagaaagggcccagttctttacgacaaggcctgacctcatgttgc
-acaaccgacacttcaaaagttgaatgaattgggctacgaagttttgcctcatctgccata
-ttcacctgacctctcgccgatcgactaccacttcttccaactttttgcagggaaaatgtt
-tccacaatcagcaggatgccgaaaatgcttccaagggtttgttgaatcccaaagcacaga
-tttttacactacaggaataaacaaatttattcctcattggcaaaaatgtgttgattgtaa
-tggttcctaatttgagtaatcaagatgtgtttgagcctagttatagtgatttaaaattca
-cggtctgaaatcgcaattacttttgcaccaacctaaTATGTATGCAGGTGAATTCTGTCT
-GTCTTTGCTAAGCAGTGAGGTGATCCCGTGCTTAATGATGTTACTGCAAGCATGACAGCG
-GATAGAAGCGGGGAGGGCCAGTGATGAAGATAACTATTAGAGAGGGCATCCCAGTTGATT
-AGAAGCCCATCCCTAACTAACTACATCACTTCTAAAGGCCTGATTTCCAGTCCAGAACTA
-CTTTGAAAATGTTGTTTATGAACTCAAATTGTTAGTTGTAAAAATTATGAAATGAAAGAC
-TATTATGAGCATATATAAAATAAATTAGCCAGTAAATAACCTAAGATGATGAAGAAAAGA
-GCACTAAATAAAACCATAAATAAAAAGTTGGGAGCTTGGTAATGTCCAGAAAAAAATATA
-TATTTACTGTAACAAAGCAAAGGCCTTTTGTTAGTACATGAGACTCAGAATGCCTTAAGG
-AATGTGCTGGGCTCTAGAGGGCAGGGCAGGCACACAGCAGCTGGCACTGTTTGTCCAGAC
-TCCTGCCTGGACAAGTTGAATTAGAAAAATCCAAGCAAGAAACAGTGTCACTACTGGCTT
-CCCTGCTCTCTACTCATCTGCTCAGAGAGCTGCATGCTAGTTTGGCCTGTCCTGCACCCG
-TAGAGGACAATAGGTTATCTACATCCTTCACCACTAAGTGAGCCAatgggctgaactgtg
-ttcccctcaaaattcatatgctaaagccataacccacaatgtcactgtatttggaggtaa
-agcctttaaagaggtaattaaggttaaaagaggtcatatgagcaggatcctatccaacat
-aattggtatctttgcgagaagaggaaaagataccaaggatatgcatacacaaagaaaagg
-tcatgttagggcacagcaagaggtcagccatctgcaagccaaggaaggaggtctcaggag
-aaaccaaacctgccagcaccttgatcttggacttctcgtcttcaggactgagagaaaatg
-agtatctgctgtttaagccacacaggctgtggtattctgcgatagcagccctagactaat
-acaGGCCATAAAAAAGATAATATCCTTTCTTCCTTCTTTCTGAGCTCTGGGTAAATGGAG
-GTCAGATAAAgccaggtgtgatggcacatgcctgtattacccgctactcaggaggctgag
-acaggaggattgcttgagcccagtagttctaggctgtagtacactgtgattatacctgtg
-aatagccattgcactccagcctgggcaacatagtgagaccctgtcccctccccaaccaaa
-aaaaaaaaaagaaaGGAGGAGGGGGAGGAATGAGGTAGGAACAATAGGAACAACAGATGC
-tttttttttttttttttttttgagacagagttttgctcttttcacccaggctggagtgca
-atggcgtaatctcggctcactgcagcctccgcctcccaggttcaaacgattctcctgctt
-cagcctcccgagtagccaggattacaggcacccaccaccatgcctgactgatttttgtat
-ttttagtagagatggggtttcaccatgttggccaggctggtctcaaacacctgacatcag
-gtgatccacctgcctcagccttccaaagtgctgggattacaggcgcgagccaccgtgccc
-ggccAACAGATGCCTCTTAAAACACCCTGAGCCTCTGCCTTTATTCTAAATTTGTCAGTC
-ACAGGCCCGGGAGAAAGCTGAGCAACTTCAATAGGATTTTTAACTCAAATCTAAGACAGA
-AGTTTATATAAAGTTGTAGTCAGACTCGGCTGTGTTCAGAAAGTATATTTCTTCCATTGC
-TCAGCAATTATTTATTAGCATCTATTCTGGTCTCTGGGCAAACATTAAGGACTAAGAAAT
-GAATGAACTCTAATCATTTTCATTCTTTAAAAATTGTGCAGCCAAGAAAGAGAAATAAAT
-AGGCAAATGACCACATAACAGCAAGACATGTATAGTGAAAGTCATGCTCACTGCAATAAA
-AAGAACCTCTAGCTCTGAGTGAGGAAGGGGGAGTGGGTGCTGAGGTTGTGGGAAAGAGGA
-AGCGTGGGTAGAGTGAGGCAGACTGCTGTGGAGTGGAGCTGTGGGAGTGGCTTAGAGCTT
-GCAGGAGTAAGGGAATGAGGTGAGAGTGGAGGAACGGCAGAGTGCATATTCTCAGTTGCC
-AGAGATTCTGGGCAGCTTCTTTCGATCTTTGAGGATTTGGGCAGGAAAGGGTGAGAAAGG
-CCCATCTAACAATCCTGCGCTTCATAATCCCCTGAATCCTTGAAATTATTACTAAAGCTT
-AATGCTGGGAAAGATCTCTGATTCCCCTGAATCTGATTTGGCAAGCCAATCAATCATTTG
-TGTTAATTGGGAAAGAAATCAAATATTTCTGTGTGAATATACTCATCTCAAAACATTTTC
-AAGATAAAGTGTTTTACAAACTATGCTTCTGAGTCAATAGGATTCAGCTGTTTCGTTTTC
-ATTTCAGCAACTTAGAGGAAGTTTATCTTCAGAAAAAATTGCTATAAGAcacttcctata
-agccagccctgtgccaaattatttacatgaatcaccttctctagtctttaaacagcccta
-ttatgaatggacaattatctcaatttgacagatgatgaaactgaggcttgaagagattaa
-gttacctaagatcacacaATATGCCTCCAAAATTCGAAGAGGGCCGAAGGTTGTAATTGT
-GCAAGAAGAAGCAAATTTTCTATCTCTTTGAACCATAGACTGTGGATCCACTGCAACCTT
-GCTGAAATGGAAGTCTTTGTTGTTTCATGGGGGTTTTGCTGAATCTTCTGGCTTGTAGCA
-AGAAACTACTTTATCTTCACCAGATCTTATCAGCACATTGTATACCTGTGTGATACTCTG
-TGTGCTAATAAAATTATCAAGCTTCCTGTGGGTCCAAATTATGGCAAAAACGTAAGACAA
-AATGAtaatcccagcactttgggaggccgaggtgggtggaacacaaggtcaggagttcaa
-gaccagcctggccaacatggtgagacccccgtctctactaaaaatacaaaaattagctag
-gtgtggtggtgcgcacctgtagtcccagctactcaggaggttgaggcaggagaatcgctt
-gaacatgggaggcggaggttgcagtgagctgagatcacaccactgcactctagcctgggt
-gacagagctagactccatctcaaaagaaaaaaaaaaagaaaaaGCACACGACTAGTTATC
-ATAGATACTGTTGGCTACTGTTTCCTCTCTGTTGTGTGGGTCTGAGCAAAGAGAGGGAAT
-GGGATGCACCGTGCTTTCAGCTCTCTATAGTCTCTTCTGGATTTCAGTGTTTCAGCACAG
-CCCTAAAAACTACCACATGATTATGCCCCACGTAACAGTCAGATCACCTTGTCTCTAGAG
-AGACCACGCATCCATAACGAAGAACCTCTTATAACCATGGGTTCCACATCTTTACGGCTT
-AATCACTGATGCTCTCAGTGAACCTGAAAATTGATCCTGCTGAACAAGATCAATAAACAG
-AGTTTTGATTCAAAGGCAGCCCAATGAGTTAATAAGTGCTCCATGACAATGCCAAAGAGG
-ATTAAGGAAAGAATAGCAACCTGGAGGAAGATGTATAGAAAAGCAGAccaggtgcggtgg
-catgcgcctgtagtcccagctacccaggaggctgaggcaggtgaatcatttgaacctggg
-aggtggaagttacagtgagccgagatcacgccactgcactccagcctgggagacaaaacg
-agactctgtcaaaaacaacaacaaaaaaaaaCCAATATTAATAATGCAAATATTTGAGtt
-acagggcatttttaagagccagatacagtactgggaaccttgagtatattatctcattta
-gtccttaaaacaaccccatagactttatataaataatacaactgaaagtttaacttaagt
-tgctgaagttcacagataagcagtagaatcaggattggaacccatgtctcatcatatcag
-agaccctacgcttaagtgctatgctTCCTTGACTCTCACTGGCAACAGCTTTGGTGCATG
-TACCTAATGCCAGTTATATCATAAAGGATCTACATGGATAAGCTTATTTCATACTCTTAG
-AAATGGTTTGGAAGAggccaggcgtggcggctcacacctgtaatcccagcactttgggag
-gcctaggcaggcagatcacgaggtcaggagatcgagaccatcctggctaacatggtgaaa
-ccccatctctactaaaaatacaaaaaattagccaggcatggtggcatgcacctgtaatcc
-cagctactcaggaggctgaggcaggagaattgcttgaacctgagaagcagaggttgcagt
-gagccaagatcacgccactgcactccagcctgggtgacagagtgagacttcgtctcaaaa
-aaaaaaaaaaaaGTTTGGAAGAAGCTATAGAAGTCTCGATATTACTGGTGACCCAGTATA
-AGGAGGAGTGGTGAATATCCCTATTCTAAAGGATTTCCTAATCCTGAAGGATTTGGACAG
-CTCCTGCAATTGCCAAATGTAAGCGGCCTGAAAAGTTCACACTTAGATTATTGCCTTTAT
-TTTTGGCTCCCACACTGTAAAAGAAATTAGAATTAGAGCACAGATACAAAAGCTATGATA
-ATGAAAGTCCTAAAAAAAATTCCATTAAGAAACACACACATATAAGTCAGAAATTCATTG
-GGAATACCTTTGCATTTTAAGAGATGAGAAGGAAAGAGTTAACAGTAGTCCTGAAATCAA
-TTCTCTCCCTTTAACAGGAGATACTTCTGGCAGGAAAGAAAAAAAAAAAAAAAAAACTTG
-ACTCTGACTCTGTCAGATCTCCTTATAACATGCTAATAAGAGACCTTCTGGTAAATATGC
-TAATGATATTCACTAGCAGAGGGGTCTTTATGTAGCAGAATGCATCTGCTCAGTCCTCAA
-TTGCTTCTGGTAAACAAACTTAGAGTCTATGAATTTACAGGGCATGGCTCCTTGAAAAAT
-GTCATGTGTTTGTAATGCTAAGTAATTGCCAGAGAATAAAATGGAGATGTTTCTAGCTAA
-AATAGCCCCTTTGGGTAGCTGATGGGCACCCATGCATCACAGACATCACTTAGAGATCTT
-TCATGTTAAACCTATCCCATGGCTTATTTTCATGAGGCAAGAAAGGACCTGGGAAGTGGT
-GTGGACATCCCAGACTTTTGCATTTTTACCTGCTTCGTAATTACCCGTATCCTTGAAATT
-ATTACTAAAGCTTAATGCTGGGAAAGATCTCTGATTCCCCTGATTCTGATTTGGCAAGCC
-AATCAATCTTTTGTATTAATCAGGAAAGAAAGCCAATATTTCTATATGAATATACTCATC
-TCAAAACTTTTCAGAAAAGATATTTTCCATACATGGAAATAGCTTAATTAACtttttctg
-attatgaggttacttatagtcattttgaacactcagacaaaacagaaaactttatggaag
-ataaaataagaataacaaaatctttcccaaagagaaagaccattaaatttttgtatatat
-ccttccagagaatacacaaattatatgtatatatattttacatgtatacatatataacaa
-agactagcttatactacccacgctttcctgtcatttttcttttctacctaagatatcact
-gacagtcttttatataataaggatagtcctcaattatcatcattgtttaaatggaattct
-aatgtgttaagtgccataaattagcagattctctattgatagacatttagcttacttttc
-acattctcactatgagtaatgctAAGAAGGCAATATAGTTCTTGCACCTTCATGAACATA
-TTCTTTTATGCTATGTGCATTATTTTGGGTCAAAGGGCAAGCAGAGTTTCATTTAATTTT
-GTTTTAGACATGGGCTATATATTGACAAATTGCCCTCCCAGGAACAGTACACAGTTTTTC
-TTATGTTGCCTCACCCATGCCAGCAGTAGCTAGAAAATGCATTTCCAAAGACTGGTGCTA
-ATTTTCTGTGCATTCTGTGAGTGCTCAGTCAATTTAAGCAATAACCACTTAGAGTAACAA
-AATCTATTCACCCTAATAGCAGAGATTTCTACTTCATCCCTGGCTCACTGCCCAACTTTT
-GATCTCATCTAAGGCCAATAAATGTAGCTCCAGACAAGTGACACAGGTAGCTCTGTCCCC
-ATCCAATCTACCCAGCTACTTCTCTTAAGGCACGTTCTGATCCTTCAAGCATGAAGTTCT
-TGCCTCTGGCTTTTGTTTCTCTCTTGTTTCTGGCTTCAGTGACCTTGAGTACCCTGGAAT
-CTTCCATATTGAGAAAGAAATGATAGAGGGGAGGGGACATGGAAAAAAGAATTAAATATA
-TCTATTTTTAAAAAGAAAGAAAATTTTAGAATGGACATGTCTagaaggaggaggaaacag
-aggagggggacaggtataaaaactggacttctctgaatatactctgctttgaaggtttga
-ctttggaatcatctacatattttatctaatacaagaatatcgaaacttaaatggcaatcc
-caaaaatctaaaaggaatagaaatcaaattagcctctgtaataaatgggttgtataacca
-cacaaaggACTATTTGAAATGACTTTCAAAGAGTAATTTGAGAATACTTCCTTATTGGAA
-TATAACCTAAAAACAGAAGAATTGCAAACTGTTTTCAATGTTTTCAGTAATCATATTGAG
-ACTTTAATACATATATTGTGGGATAAAGGAAATGAATGTTGGTGTCACTGATAGAGATAA
-GAAATAAAAGTTCAGGTAAAAATTCTGTAAATCCTAAATTTGAATTGGAATTTTATATTT
-TATTTTTaaaatacctttttctacccccatccactgaaaagccctagaaatattggccaa
-cctagtagaaatgatttccctctcacccgggatattatctctaaatataatttaccaaag
-tcttattgaagaaattgctgtttctgagcttgaagcaactatacaaatgtacctggaaga
-ttttaccatactggaaaaaagcagcttgacaaagactactgaagtcatgtcaaaaaaaac
-aaagaagtcaacttgaaggggctttctcttggcaaagatgggaaaatgtgaaccttgata
-aaaaataattgcatgcattattcacagtaaccaagatatgtaatccacctaggtgtctat
-ggatggataaatatataaagaaaatgtgatatacacaatgaaatattattcagcctttaa
-aaagaaagaaatcctgccatttgtgacaacacagatgaacctggaggacattatgctaag
-tgaaataagccagacacaggcagacaaatactgaatgatctcacctatgtgtggaatctt
-aaaatgtcaaactcatggacacagagagtaggatggtggttaccaagggagttgagggaa
-atgaagaagtactagtcaaagggtacaaagtttccgttatgcagggtgaataagttcggg
-agcttactgcatagcacagtgactacagttaataatactgtgttgtatacttgaaatttg
-ctaagagtagatcttaaatattgttaccacagaaaaaaatggtgactatgagaggtgatg
-aatatgttaattagcttgatagtggtaatcatgtcacaatgtatatgtctatcaaaacat
-cacattgtacgtcttaaatatgtacaattattatttgtcaattatacctcaataaagctg
-gaaacataaaaataaaataactacaattaattgaaacatatcaaacatgtccaaaactga
-taaagaaaggtaaagaatttggcctggcacagcggctcacacctgcaatctcagcagttt
-gggatgccaaggcaggcggatcacctgaggtcaggagtttgagaccagcctggccaatat
-agcaaaaccccatctctactaaaaatacaaaaattagctaggcgtggtagcgggcatctg
-tagttccagctactactcaggaggctgagatagagaatcacttgaacccagaggtggagg
-ttgcagtgagccgagatcacgccactatactccagcctgggtgacaaagtgagactctgt
-ctcaaaaaaaaaaaaaaaagaaagaaagaaaagtgaagaatttatcctggcttttctgta
-aaaactgcacctcagaagaaccaaattattgataaggaattttgctctttagaaatattt
-ccagctaataaatgaaggaataatagcattgagacaaatcgccattttgtaatctcaggt
-gaatttacggatctaggcaatgatcattaatggctgagaaaatcacaacaaaaagaacaa
-ttagacatttgtgcctcctgatagaagtatacaatatcaccttcaaagctattttgccaa
-aaaagaaaaaaaaaatcaacccaaatctaatcaaggctcccactctaactcccaagctct
-aggatataccaaggacaaaggaagatcatgaaataccaccatggggattcaatcagcaaa
-ttcTGAAATGCAACATTATCCTTCACCCTGCTTGGCCTAAAAGTACAAAATAACACGAGG
-AAAAATTAGTTTCCAGAGCCTGTTATATTTTGAAAAATCATCAGAAAACTGAGAATCAAG
-GATAGAATTTCTAGAAAGTTCCTTCCCCTAAAGCTTTCACACTTGCCTCAGTGTATATAT
-GTGGCTATACCACTGACAGGCCGCCAGTCATTAAATTCAAGCTCCAAGAGACAAACTCTT
-GAAAAAAAGGCAGCCTAGGAGAAAGCAACATGATTTTTCACATATTTTAACTTGGTTTTT
-CTCATAAAATGGTTTCTGAATGTTTCTTAGCTTTCAATGGGCAATAAATAACTTTTAGGG
-AAATAGATGTGAGCCAATCTGAGGAAGTATTTGAGATGAAGAGAAGGCTTTGCTGTCTAT
-GAGGAGTGCATTAGAATAGAATCGCTCCAGGAAAAGGTCACCTGTGTTGATTGCCTTTAT
-GAGGTGACATTTAAATAAAAGTACTCGTTCAGTTTTCATTGAAAAACATTAAAAGACATC
-TCCAAAAATTTTTTTGGGAATGTGAGAAACTCTGCTGCACAAATGATCATGTTTTGTCAA
-ATAAGATGAAAAGAAAAAAAACACACACAAAAATgaaaaaacagatggaggggtaacata
-aattaagaaactcagaagacacatctacaaattacaatttatggatcatatttgaatgct
-gattctaaaaatttgaaaaaatatgcatttgagaaaatgaatgctgacttcatagtttat
-aatatgaagTCatattataaaatataataagaatgaaatattaataatttatCAGGTATG
-ATAATGGTTTTAAGGATGTGttttttgtttgtttgttttttgagacagagtctcattctg
-ttgcccaggctagactgcagtggcgcgatctcggctcactgcaacctctgcctcttgggt
-tcaagcgattctcatgcctcagcctctcgagtagctgggattacaggcatgcaccaccat
-acctggctgatttttgtatttttttattagtagagatgggcttttgccatgttggccagg
-ctggtctggaacttctggcctcagttgatccacctgcctcggcctcccaaagtgctagga
-ttataggcatgagccaccacgcccagccTAAGAATGTGTTTTTTaactgtatatatttaa
-ggtgtgcaacatgatgtgtgtatgtatatatatatatatatatatatatatatagagaga
-gagagagagagagagagagagaaataatttctgtggtcatgcaaattaacatatccatca
-tctcacagctacaatttttgtgtatgtgtggcaagagcacctaaaatctactcttagcaa
-aaatcctgaatacaatacgatattattaactattgtacattagacctctagacttgtttc
-tcttacatatctgcaactttgtgtcctttgacctacatttccccatttcctacccctcca
-ccacaccccagtaataaccactttattctctatctctgcattcaactttgttttttctag
-tttttaaactctgcatataagtgagatcatgcagaatttctctttctgtgtctggtttat
-ttcacttagtacaatgtcctccagattcactcacgttgccccatatggcagaatctcctt
-cttttttaaggctgaaaaatattccattgtatatataccatagtttctttgcccatttat
-ccttcaatgaatacttcagttgtttccacacctcggctattgtgaataatgctacaatga
-acgtaggagtacagatattttatgaggtgatgatttcacttcctctaggtatatacccag
-aggaggaattgctgggtcctatggtagtgctatttttaatttatttaggaaccttcatac
-tgttttccttaatggctccactaatctacattcccaccaaaagagtatacaggttccttA
-AGGGTGTATTTTTCAAAAGGGTCGCCGagagatacctattaaaatatatacaagagaaat
-cttataatatcagggatttgcttcaaaggaggggaaatccaagaaggggaaagtaaattg
-ggttatataagaaacaagattggccatgagttaatgttgaatttggatgatgaatacatg
-ggggctcattatattattgcttgacttttacacacatttaaattgttcAATAGTAtgtat
-tagtccattctcacactatataaagacatacctgaaattgggtactttataaaggaaaga
-ggtttaattgtctcacagttctgcagggctgtagaggcctcaggaaacttacaatcatgg
-tggaaggggaagcaaacacatccttcttcacatggtggcagcaagaaaaaatgcagcaca
-aaagggggaaaagccccttataaaaccatcagatcttgtgagaactcacacactatcacg
-agaacaggatggggaaaccactccgtgattcaattatctccacctggtccctcccacaaa
-acgtggggattatgggaactacaattcaagatgagatttcggtggtgacgcagcaaaatc
-atatcaAGTAATAAGCTGAAAATACCCTTTATATAAATAATGATAACACTGCATGGAAAT
-AAAGAAAAATCTTTAGGATGCAGCCTAACTGGTATTTACGATTTTTTAAACCCTGGATTA
-AACGCATCTTTTTATAAATGGAAATAATTAATGAAGAACTGAGATGGAATCAAAATAGCA
-AATCATGcacacacacacacacacacaAATTCTGTTTAGAGAACTAAAACAATATGTCAG
-AAACGTTGAAGAGTTCATGtgcatcagttagttcctgccatgtaacaaaccacaccaaaa
-tttagtagcttaaagcaaaatcatttatgtatgtcataattctatgagttacaaattgag
-gctgggctcagctgagaggttcttctcttcacttttgggctcatgcatgtgaggattaat
-gggagctggcaggtctagggtggactccactggaatagtctgtctctgttccaaaaggtt
-agctgaagcttgttttcctggcaacagagcagagttctgagagagcgtgagtatgcaagg
-cctcttgaggcccaagcctaggttcagaacaggaatcacttctgatatactctattggcc
-aaagttagtcccaagtccagatccagGCTTGCTCAAAACAGTGGCCCATCTCTCTGGCCC
-CAATCTCCATAGTTCTGGTAAACaaaaaaaaaagaaaaagaaaaagaaaaagaaagaaag
-gaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggCTGAGATAACA
-TTGGGTTTTTCCAATGATAAAACCTAGAATTAATGAAGAGCTAAAATTAGTAAATTTTCA
-AAAATAcaaaacacataaaatgtaaaactgctgaaaagataagaagaaatgaataaatct
-ataattaagacggaaatctttaataggccataggcctcaggagtcctcaaagtaaacaaa
-aaatgcacaagcatgcttatcttaaaggattaaataggtatttttaaaatattgatttaa
-tacacatgtagaactattaagtaacaaaatagatacatacaattttaaagcatagctaaa
-aaatggctaaaaattgattattataatacatgtgtatttcaaatattccaaaagaagtca
-gtccactcatataaactaaccacaatataacaacattagaacttccaaaaaaggtatgtg
-tatatgaggtggggttttttcaaccttctaaataattgtgggttaaaaaaacataaaaac
-tacaagattttggaaatgaatcaaaatgagagttctacatataaaatcttcatgaaaatg
-gttaaagtggaaattagatgaaagatttaaaggcatttactagaaaacaagaaaTTTTAC
-ATTTTTAAATTAAAAGCTAATTAAACTCAAAGTTAAATTTAGTTAATTAAACTCAAAAAG
-CTAACAGACCTGAACTTGCTCAGCAGCCTTACCTAAGAATCATCTATTTTACCGATCTTT
-TCAAAGAAATGTTTTGTTTTTATTGATCAATGCCTCCatatttttgaaatttttatagtt
-ttcatttattatattgacaaatttttttaaattattaatGTGGCGCTGGCAATACACTTG
-TGAAGCATTTAGTTATTTATCCTTAAAATATATTAGTACTTggcggagtgcagtggctca
-cgcctgtaatcccagcactttgggaggctgaggtgggcaggtcacaaggtcaagagatgg
-agaccatcctggccaacatggcgaaaccccgcctctactaaaaatacaaaaaatagctgg
-gcgtggtagtacacacctataatcccagctactcaggaggctgaagcaggagaatcactt
-gaacctgggaggcggaggttgtagtgagccaagattgggccactgcactccagcctggat
-gacagagcaagaccctgtctcaaaaaaaaaaaaaaaTTAATCCATGTGCACAAAGAGGCA
-TAATCAGAAATAATCATTTCCAATTTTggctgggcgcagtggctcatgcctgtaatccca
-gcaatttgggaggctgaggcgggtgaatcacctgaggtcaggagttcgagaccagcctgg
-ccaacatggtgaaaccccgtctctacttaaaataccaaaactagcctggagtggtggtag
-gcacctgtaatcccagctactcggggggctaaggcaggagaattgcttgaacctgggagg
-tggaggttgcagtgagccgagatggtgctatcacactccagcctggggaacaagagtgag
-atgtcatctcaaaaaaaaaaaaaTCATTTTTATTTTGTTTTTAAAAAGAAAAAATGggcc
-gggcgcggtggctcatgcctgtaatcccagcactttgggaggccaaggcgggtggattac
-ctgaggtcaggagttcaagaccagcctggccaacatggtgaaaccacgcctctactaaaa
-atacaaaaattagccagaagtagtggcacgtgtctgtaatcccagctactcaggaggctg
-aagcaggagaatcgcttgaacctgggaagcagagtttccagtgagccgagattatgccat
-tgcactccagcctgggtgacagagcaagactccatctcataaaaaaaaaaaaaggaaaaa
-TTGGAAAAATAAAGTACATGCAGTTTATTTGACAGAGGGATGTTTAACTGAACCACACTA
-CATCCATATATATGAAGTTATGCAGCAATAGAAAAGAATAATGGACATTTATATTTTTAG
-ATATAAAAAGAGCTGTTGAACCTATCATTGAAATTTTAAAAGGAAGCTGAAGAACAAGTA
-CAGTGTAATAAATTATTTGTTTTTtacaatttaattatagagtaaatgtgatctttcttg
-gtatatagttctatagattttaataaatatttggattcatgtaaccaccaccacaaatag
-gacacacaacagtttcatcaccctaagaaaagttcccggatgctcacccctctgtagcca
-aaccgtcaccccacccataatccctggcaaccactgatctattttccatcactataattt
-tgccttttccaagaatgtgacataaatggaatcatgtagtatttaacgttttgagaccag
-cttctctcagcatgtgatatggtatgtacctgtgtctccacctaaatctcacgttgaatt
-gtaatccccgatgttggaggtagagcctagtgagaggcgattggatcatggggacagatt
-tctcatgaatggttcggtatcatccccttggtactgtcctaaggatagtgagtgagttct
-gcagagacctggtttaagcgtggagcacctccccactctcttgctcctgctctggctatg
-ccatgtgcctgctcacccttaaccttccaccatgattgtaagtttcccgaagcctccccg
-gaagccaagcagatgccagcatcatgcttcctatatagcctgctgaacagtgagacaact
-aaacctcttttttttttagcaaatgacccagtcccaggtatatctctataacaatgtgag
-aacgacctagtaacagcatgtctttgagattcatccaagtttctaccagtatcaataact
-cattcctttttactgctgagtatgattgtattctatggatgtggtacatctgtttatcca
-ttcattcattgaagggcatttgggttgttttcagcttttggctatcacaaataaagtttc
-taagatggccaggcatgatggctcacgtctctaaccccaacactttgggaggctgagatg
-ggcgttgaggtcaagagtttgggaccagcctggccaacatggtgaaaccctgtctctact
-aaaaatacaaaaattagctaggtgtggtggcacacacctgtaatcccagctactcaggag
-gctgaggcaggagaatcacttgaacctgggaggtggaggttgcagtgagccaagattaca
-ccactgcactccagcctaggcaatagagagagactctgtctcaaaaacaaataaataaat
-aaataaagttgatatgagcagtttttacagatgtttgtgtgaccgtaagttttcgtttca
-ctagggtaaataccaggttcaggattgctaggtcctgaggtacgtgtatgtttacctttc
-aaataaactgacaaaccattttctagagtgactgcaatttccagttgttctgcaacctca
-ccagcaattggtgttgtcagaaactttttattttcataattcttatcaatgtgCACAATT
-GTTTTTAAAATTCACAGAATTAAAGGAAAATATATTGTGCACTATTTGTGTAATTaaagc
-aaaacacaaacacataaacggaagacaaaaataagaaactaattcaagaaactaaagaaa
-gaaaaacaaaaTTAACTTTTTAAAATTAGAATAAAGGCATATATATGTAATAGGGATAGT
-TTGAAACACTCCCAAACATCTGCTCTGAGCCAACAACAATCGGATAGCgtgagggcagat
-acaaattaaatatgagacttaactctccccgttaaaaataaggaaagagacttacccaac
-acccctcccccccgcccttctctttctctgtctctttgaaatgtatgtaaatctttttaa
-aatgtaaataggcctctagccagttttacaacccaggaatatctttgtcaaatacctagg
-agccatctctttgaaatgtaagcatccagaaaggtagtgctcctatctctgaatttatat
-gagtgggtaggtctctaactttggcaagttccttgcttcaagttgcaaagccacttcctg
-tcacaaggatgtgagaattttgtttttcctttggttaaagccaaccagcgaacacagatg
-gccactccaattatcaggtgaatctaggatgaactatgtgtatgtcaaatggtacttcta
-agttctcctatttgagaaccagttattgtttgtcttgagagcatatctgtaatgggtttt
-atcttcttcaggatataaacaagtaggatttctttctgtctttgcaaactctttgtgaat
-tgcctgtgatgtgtctcacattctggttcaatgcttattcaatggcaattgttttctttc
-tcttctacctttgtggagaggttttctaggttgagagaagattttgtttttaattatatt
-tcccccacaATAGCAAACACATCCCCAACcacatacacacacacacacacacacacacac
-acacacacacacaacaggtaattagacaggcctgagcagggcaggagagggctcttcccc
-cacccactacgaatgtcagtgatggttccaaaattatcacattgcctctctaaaagtgat
-aaattggGCAgcgcagtggctcatgcctgtaatcccagcactttgggaggctgaggtgga
-cagatcacttgaggtctggagttcaaaaccagcctggccaacatggtgaaaccccatctc
-tactaaaaatacaaaaaatagctgagcatggtagtggacacctgtaatcccagctactca
-ggaggctgaggcaggagaatcgcttgaacccagaaggttcaggtttcagcgagccaacat
-tgccccactgcactccagcctgggcaacagagtgagactccatctcaaaataaataaata
-aataaaataagtgagaacatatggtacttatctttctgtgtctgacttgcttcacttaag
-ataatggcctccagttatatccatgttgctgcaaaagacatgatttttgtggagggattg
-tattccattgtatatatagaccataatttctttatccaatcatctgttgatggacactca
-gttgattccatacctttgccatcatgaatcatgttgtaataaacatacaagtgcaggtat
-cttttgatgtgattatttcttttcctttgggtagatacctagtagtgggattgctggatc
-aaaAtggcaggtgcctgtaatcccagctactccagagactgaggcaggggaatcgcttga
-aactgggaggtggaggtttcagtgagccaagatcatcccactgcactccagcctgggtga
-cagagcaagactctgtctcaagaaaaaaaaaaaaaTgctgtgtgattacccttatatggg
-tttcctggatgagccatttgttaaattaatttttgttggaaatttccccgcagagctgtt
-gcacattgtggggggttaatccccagacactcccatgaggccccagtcacccaggggtgc
-ctttggctgggaggagcaagtgccctttctcctaggagctgaaaaactcagtctcttatt
-tatctatgaaaacaacagttcagtttctcacataaatgtgtacagataaaccgaatttag
-acagattttaggagaaaaagcaattgagaattccttttagaatgcatctcccaactagaa
-ttaggatccttaaacaaccacttcttaggagaaaaccagctcagaataaatcaaggacca
-tcaaccaaagggaggtctggggctcaggaggacttaccagttccaccagaggagaagctc
-gaagcttcaatgggcccctgctggcaccttagctctggttttgggcaactcctttagggt
-cctgagtcttccctgaggcctcacgtgtttgggcaccaaattattgttgacgaaaagagc
-caaactctgtaaaatattttaagagatttattctgagccaaatatgagtgaccatggccc
-gtgacacagccctcaggaagtcctgagaacatgtgcccaaggtggtcggggtgcagcttg
-gttttgtgtattttaggaaggcatgaaacatcaatcaaatacatttaagaaacacactgg
-ttacttggaagtccccgcggggctgggggcgggtatcaatggaaaggaatgttcaggtta
-acataaaggattgtggagaccaagttttattgtgaaaagaaatctctcagatagcagact
-tcagagagagagcagattgtaaaatgtttcttatcagacctaaaagggtgcctggctctt
-agttgattatctcctggatctggaaaggaaggggaaaaagggggtgggtgggtgtggggg
-tatagaatgtggatctttttccaccaaagattttgtaaggcaatttcaaagtatggcaag
-gcaatatattttgtgataaaacattgtgattttttttttttttttgtgagacagagtctc
-actaggtcccccaggctggagtgcagtggcgccatctcagctcactgcaaccttcgcctc
-ccgggttcacgccattcttctgcctcagcctcccgagtagctgggactacaggcgcccgc
-caccacgcccggctaactttttgtatttttactagagacagggttttactgtgttagcca
-ggatggtctcgatctcctgacctcatggtccgcccgcctcagcctcccaaagtgctggga
-ttacaggcgtgagccactgcacctggccaaaacattgtgattttcttccttgttatgcca
-gagtcagattgaaaagtaagtcacaatatacagggtcaaataaaacccatcttgtaagaa
-tttatggtttgtagggcataactccctagaccccttaggtaggaatttgggcaagataaa
-aaatcagagtttagtcctcaattccttaagataaatctctttctctatatatatctctct
-ctatctcatatctccatcctattctctggaaaactctgactaatgcaAGAAATTAAAGAG
-ACAAAACACATAATACAATATCTtaaacaacaaaatactattcagccataaaaaagaatg
-aaatcctgtcattcatggcaacatggatgagctagagcagtggtccccaacctttttggc
-accaggcactggtatagtggaagacaatttttccatggtcggaagggggtgggaggatgg
-ttttgggaagaaactgttccatctcagaccatcaggcagtagttagattctcataaggag
-tgtgcaacctggatcccttgcatgcgcagttcataatagggtttgtgcttccatgagaat
-ctaatgcttctgcacatctgacaggagatggagctccggggtaatgctcacctgccactc
-acctcttgctgtgctcccagttcctaacaggccatggtccccataccaatctatagccca
-ggggttggggacccctggcctagaggacattatgttaagtgaaataagtcaggcacagaa
-acataaatgctgcacattctcacttatatgtgggaactaaaaaagttgagcttacaggcc
-cggctcggtggctcacacctgtaatcccaacattttgagaggccaaggcgggtggatcac
-ctgaggccaggagtttgagaccagcctggccaacatggtgaaatcccatctctactaaaa
-atacaaaaattagccgggtgtggtggcgggtgcctgtaatcccagctgctcaggaggctg
-aggcaggagaatcgcttgaacctgggagacagagttgcagtgcaccaagattgcaccact
-gcactccagcctgggagacagggtgagactccatctcaaaaaaaaaaaaaaaagttgagc
-tttcagaagtagagagtaaaataatgtagcaggtagaagaggatacggagaggttggttt
-taacaaatacaaaatcacagctagataggaggaataagttctagggttccatagctctgt
-agggtgactgtagccaacaatcacttattgcatattttcaaatagctagaagagaggatt
-ttgaatgttctcgcacaaagaaatgagaaatgtttgaggtaccctgatttgatcattaca
-cattgtgtacacgtattgaaatatcactctgtatcccataaatatgtataattattatgt
-caattaaaaataaaattttaatttaaaaatacattttaaaaatCAATACAATATCTGACC
-TGACACTGCAATCTCAACTCAAGGAGGAAATGAAtgctgtaaaaggcattattaggtcaa
-ttggcaaattggaatacagatatatatatatatatatatatatatatggatagatgatag
-actagataaaagtggtgtccatttaaatttatggagttagtaactatactgtcatacagg
-agaatatccctattcttaggaaatacacactgaattatttgggagtaaaaggccacgata
-atataaggccatgaacatataacttatgctcaatagattcaaagaagaaaatatacaaat
-atagagagactaatatagATATATATATATCCATAGATAGAGAGAGGTGGGGCAAATGCT
-AAAGCAAGAAAGATAAAATGTCAACAATAGGCAAATCTCAGGGGAGCTGGGGAAAAGGTA
-TCGTACAATTTGTATTTTGCAGCCGGTATGttttaaattatttttaaatgaaaagatttt
-ttaatGGGTTGAGGAAATTGGAGTGACTTATATTTATGACATCCAATGGACTGTGCATGC
-TGTATGGAAACAAGGAGAAAATAAATGTCATCATTGCTTAACAAGTGAAGGGTAAAAAGA
-CAATTAACTCACTGAAGACTACGCACAGAAACACAAAAGCCTTTGCTTCTGTGGTTATAG
-GTTTACCAAAGGCACAAAGGGATTTGTATTTATTTTAGGATTATAATTTACATCACTTAG
-TTGGAAAAATTACAGATTTTAAGATATTTTTACAAATCTGAGTGACTGTAAAGACTGCTA
-AAGTCTTGGGACATATTCTTACCAAGTCCCAGATCttttgttttgttttgttttgtGCCT
-GAAATCAAACCAGGTTTTTTAGACCAGGAAAACGTGAGAAGCTAGAGCTGCTCTACTCAG
-TTGGCCCAAACCAGGACTCCGGAGATTATTCCCTTATACAGCAGGCACCACATTAGAGAA
-AGGATTCTGGAAAAGTGAGCTGGAACAGAAAAGAACTGTCTCAATGGGAAACAGACTCCA
-AAGGACGCTATTGGGGGGAGGAAAACACAAAATATTTCTTGAGAAGAATGTGGAAATGGC
-AAAGTCTCTAGCCTCCAGAAACCTTAAACTCTAGGGAAAGAAAGCAAAAATTTAGAGGTA
-AGAGTGTTCATATTAAAATTCAAACAATAAGTAGTTTTTCTATAAACTCTCTTTTTTTCT
-AATCATGAAAGTACACATAATCATTCTCTCCAAACTCAGACATTTtagacagatagatag
-atagatgacagatagatagatagatagatagatagatagatagatagatagataCacatg
-catacatactacatacatatatacctacataTGTTGGCACATAGATGTTCCTTTACCACA
-GATTAAGTTATTCTAGATGCATATCTTGTAGCCTACATTTTTATACATTTTcatcatttt
-aataactgcatactgctctattatattctgtattttctatattagattagatccatgttt
-tatcaccatttaggtagcttttggttttctgttactgtaatgttgagataaacgtcttta
-tgtacttgttcaattattcccattaaacaaaagcccaaggtacaaagtttctgagtaaaa
-aaataggcacattttaaggcttctgatatatattgccaaattgtgctacaaaagaaaaac
-tgtaccaattaacactcccagcaacaacgccaagagaatgctagtttccccacatctcac
-caacactgtctaGAACGCATAGTTTTAGAGATGAACGCTGGGAACCGACGCACTGTTTGC
-TCTACCTCTCCCCCTCCTAACAGTCTAGAACACAGGCGCTCAATAAATCAATCCAGGCTC
-CAGTCCAGTAGACATTCTGATCTAATCTGACTGCTCTGGGTAACAGAAAAGTCTCCCTTG
-GTTCACTGCCCAGTATCCTGGCATCATGTGGATCCTATAAAGGCAGTAGCTCCAAGCACA
-TTACAGAGGGACCCAACTCCATTAAACCACCACCAGCTCCCCAAGCCACCCCTTCAGCCA
-TGAAGTTCCTGCTCCTGGTCTTGGCAGCCCTCGGATTCCTGACCCAGGTGATCCCAGGTA
-AACTGGATAAATAGGAGGAAAGGAAAACTGGGAACGAGGAACACTAGCATATCTGGTTGC
-TCTGGTGATAGATGAGCCAGGTTGGGTGGAGGCAGGGCTCACCCCACTGAGTTCCAGTCT
-AAGGTAGAGATCTCCTAACAACCACCACTAGCCTTGATATCCCACACCCAAACACCACCC
-TATATAACCTTTACAAAAATTTGTTTTCTATTCTAAAATGATAGTCACCCTCAACCTAAA
-CCAAAATATCTTCTTTCACTTTATGTGAGCTCCTTATATCTAACCTCCTAAGACACACTG
-AAGGCTTCTGTCATCACCATGTGCATCCATTGAGATCAGCCCGGGTTGGAGCTCAAAGGA
-GATTTTGAGCCTAGAAGGAAGAGATTGAGGTTCCCATCCCTATGCTCAACAGACAGCTGG
-CAGGTGGGGGATGGAAGCAGACCTCTTAGAGGGCTAGTTCCCACAGGATGGTAAGCAATG
-GGTTCAGCTCAAACCCTGGGGCTAGGAGATAATGCAGGGTCagaaagagagagagacaga
-cacacagagagcagggagagagagagaTCAGAGGAGGGCCAGGCAACGGATGTGAAGAAA
-GCCAAAGAGGCTTGAGGGTGCTCCGAAGAGGCCCCTGCTGTGAGCCAATGGCAGACACAG
-AGCACTGAGGCAAACAGATTTCAGCAGATGGTGAAATGGTGCACAGCACTGGGTGAATGC
-AAAAATGCCCTGTCACTGGCAACCGTTATTTTCTTTTTAATGATTTTGGAGAAAGATTTG
-ACTCCTCCCACTTTGCCCCAGGTTGACTCATATTTACAGTTTTAGAGTCTATGAAAACAA
-GTAAGGTAGAAACACCTTAAAAGGGAGCCTGTGGGGTGAGTGAGACTAGCCCCATTTCTC
-CCTTTTGAGTATCCAAGCTCCTCCCTGACCGTGAAGACCAGGCTCCCCACCCCTGTTTTT
-ACCCATACATCCTATTCTGTAGTATCAAATTTAGCAAAAAGCTTCAAAGATGCAGATACT
-GGCAAAGAAGAAGAGCTCGTCAGACAGAGTTCCCCAAGGCCATCAATCCAGGAAGATTTT
-TGTCTCCTCATCACTGGCTTTCCCAAGTCTCATTTGCACAACATCCTAAGGATACACCTC
-AGAACAAAAAGCCAAACACTCCCATCTGGCGCTGACGCTTTAGTAGCCCTGTGCTGCTTC
-TAACCATGACTTCTCTGTCTTGTCCTCTCCCATACAGCCAGTGCAGGTGGGTCAAAATGT
-GTGAGTAACACCCCAGGATACTGCAGGACATGTTGCCACTGGGGGGAGACAGCATTGTTC
-ATGTGCAACGCTTCCAGAAAATGCTGCATCAGCTACTCCTTCCTGCCGAAGCCTGACCTA
-CCACAGCTCATCGGTAACCACTGGCAATCAAGGAGAAGAAACACACAAAGGAAAGACAAG
-AAGCAACAAACGACCGTAACATCATAATAACCACTGCTATCGCCTCCACCAACTCAGAGA
-AATATCATTTCCACAGTTCCAATTCCTCCTACATTGCTGAGTACTAGCCAAGGCTCCTCT
-TTATGGGGCAGATATCTATAGCCAACCCCAAAACTTCTGTCTTCTATCATTCTGTCATTC
-ATCTAGTAACTAATTTGGAGTTTGTATCTATCTTACGAGAACAATCATCATGCAGATTCG
-TCCACAGGGGATCtgtcagtttgggtcctccaaatgaaaaatgtcaagacagaattggac
-atgcaaaagattgactgggagaacacacctctgatggacaaaggtgagacagagcagcca
-caggcagggagagccttcagactgcaacgctggcctgatacgtgtcaaaggagagaggga
-tagaggaggattgaatagaaggagactaagactgcagctctaagaaagtctcagccaaac
-agatggggaggcccaaagcaaggcttgcccctcagaggagctcacgcagggcaggaatag
-ccaggttctcatatcccaggggttcagactttggctgagaacagcccctggagaacatgg
-ggtgactgctaccataggtctggaagtatgaggctgtccaccaactatccccttgaagca
-agttctcttgaaaggaaatctaaacagtgcacccccatggctgccacGGAGTATAAGGAG
-GGAGAGAAAGGAGCTGAAAGTCTAGGTTTGGCCAGCTAGGTAGACTGACTTGTGAGGTAT
-TTATTTATTCATTTGAGTAACAAAGCAGACAGAATACATAGCCACCATTGGTAGTACACC
-CCAAAAGCAAGGATGGCATGATGCTGGTGACTCAAACGTGCCTACTCATGGTGTCAAATT
-GGCATAATCCTCTTGGGAAGCTGTGTGGAAATAAGCACAGAGAAGCAGAACTCTAATTGC
-TTAATCCACTAAACATTACTTCTGGGAATTGGCTCATCATAAATTATCCAAGAGAAGCAC
-AAAGTTATGGGCACAAAGGTTTTCCATATAATATTATTTAAAATGCTGAGAAAATGAAAA
-AATCTAAATGGTGAAATATATACTAATGCCATCTATAAATACAAACAAATAGAATGTTTA
-TAGAATAATGGAACATAATAACATTATTCAAAATTGCATTTATGCTATAGTTGTCAAAAT
-TGTCTCCTTATATGATACAAAACTCATGAAAATTATGACTTTTTTGTTTGGTTGGAAAGC
-AGAATTATGCATAAATTTCCTCTTACAGTTCGATGCCCATTAGTTTTATATAACATTTAT
-TTGACACGTACTGACTTCTATCTGAGAAGAACAAACCAAAACACTCAGGCCTAAATAATT
-AAAAACGGTCCTAAAAACTAGCAAAccagataagaaaagatgttaatgcccattccctaa
-cttatgtcttagaccaaaattaattctagatggttttaaaatgacagtgtaaaagtaaag
-tattaaaagattgtgtggtcaaatattcaatttaagagcaaggaaattcttataaatata
-acaatagaggcagaactcatgtaagaataaattgattaggtggtattaaatattaagttc
-ttatgtatgtcaaaagatatcattttgaaattcatccatcttattgggtattgcaggagt
-tcattcctttttgtttataaatactcttccgtcatatgaatagtattcatttgtatactg
-gtttgttgatggacatttgggttgttcccagtttatggctattacaaataaagcttctat
-gaacatttatgtacaaatctttgtatggatgtatgctttcatttccctaaggtaaatacc
-taggagtagaacgtctgaatcatatggtaggtgaatgtttagcttttttgtttgtttgtt
-tgtttgtttgtttgtttgtttgttttttgagatagagtttcgctcttgttgcccgggctg
-gagtgcaatggtgcgatctcagctcactgcaacctccgcctcctgggttcaagcaattgt
-ccttcctcggcctcctgagtagctgggattacaggcacgcaccaccccccgaccccggct
-aatttttgtatttttagtagagacggggtttctccatgttggtcaggctggcctcgaact
-cctgacctcaggtgatccgcccgccttggcctcccaaaatgctgagattacaggcatgag
-aatgtttagcttttaaaggaaatacaaaattgttttccaaaatggttgtgccagtggatg
-tgcccatcagcaggatgtgaaagttccagccgttcctcatcctcaccagcatgtgatatg
-gtcagtcttttgcattttcatcattctaatagatgtgtagtggtatttcattatgctttc
-aatttgcatttttttaataactagttatcaaaaaagtatattctgtatgattctatttac
-ataaagttcttTAAATTCTTTTAAAATTGCATAcaattatttaaaatagaaagtaagaat
-ctaacgacagaaagcagatcactggttgtcaggggatgtgaaaggtgcatggagagggct
-gaaagaatgtaaagggacctgaggacactttgaggggtgatcagtcaagacacattcata
-ggccgggcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggtgga
-tcacgaggtcaggagatcaagaccatcctggctaacacggtgaaaccccgtctctactaa
-atatgcaaaaaattagccgggtgtggtggtgggcgcctgtattcctagctactcgggagg
-ctgaggcaggagaatggcgtgaacccaggaggtggagcttgcagtgagccaagatcgcgc
-cactgcactccagcctgggcgacagggcgagactgtctcaaaaaaaaaaaaaaaaaaaga
-tacattcataatcttgattgaggtaatggcttaatgggggtgtacataagtcaaaaaatt
-acaaaatggtaaactttaaatgtgttcagtttattgtatgtcaatttaaacttccaaaaa
-aGCtattattttaataaaataaataaatCTCACAGTGAAACAGAAATATTAAAGTATCAT
-AAATAGTTTAAAGACGTATGACAAACTGAGACATGTGATGAAGTATCGATACCAATAAAA
-TATAACAAGTTAACATGAAGcaacagggaaaacatgaaacccctagcagaaaatgaaaaa
-gtaacatgaactagctttttaactctataaacggcctgaaaaatgggaaaaaatctgtgt
-gactgtgatcaaataaatgcagattaaaactacaatgagatcttgttttttacctatcgg
-attgtcagagaattaacaaacccaagtctgacaaggcataaatagaaataagtctcatca
-tcagatgctccggtttataactaaatatgtccattctggaagacatttatctatacagct
-ttcaaaacccttaaaaatgttcatgttctgtggctcagagactctacttttagggatata
-ttctggggaaataattagagttcatatcaaaaagattaatgtatatacagcacaatcata
-gcagcatagtttaaagtagtgaagaggcagtggggtaagatggctgaacagaagcctcca
-ctgatcatcctccccactagaacaccaaatttgacaactatctacacaaaaaagcacctt
-cataagaataaaaaatgaggtgagtgatcacagtacctagctttaacttcatatcaccta
-aagaggcactgagaaggtaggaaagacagtcctgaattgctgacaccgcctctccccagt
-cctcaggcagcagctgtgtggtgtgcagagacaatatgtgtacttgcaggagggagagca
-cagtgattgtgggatttcacattggaactcagtgctgctagcaccaggcagaacccagca
-ggtgcctaaaagggatcatttagaccatccctagccagggggacatcacccatcccagag
-gtcggaactccagtttccgcaagcctcaccaccgtgggctaaagagctctggggtcctaa
-ataaacttgaaaggccgtataggccacaagaactgcaattcctaggcaactgctagtgct
-gtgctgggctcagaggcagtagatttagggaccactcaacctagtgagacaccagctggg
-gtgtgtgtgtgtgtgtgtgtgtgtgcgtgtgtgtgtgtgtgtgtgattctcgtgcctcag
-cctcccaagtagctggtgatggcagtggcagcccatctggagtggacgctgccatcaagc
-cagctgcagcagggagggacagctggggctgcacattccacagagctgcagagctgggga
-caatgagagccccacaccttccaagctggtgcagcaggagctccccaggtgcaactgcag
-ccactcaagtcacggctgtgaaccccggcctccctgtgttcttgtgggtgctgggagcag
-gcaggggtcctgcacttttgggtgcagctgcaggcgcccaaaccatggctgcggaaccag
-acatctctacactcttgagggtcagggaagtccccactgccctcacaagcttagaagtgc
-ctgctcccacagcctggcgcctccctgctgtcggtgcccgctctaatcttggagcaaagt
-tgaggccaagcccaggtgctgtcatagcctgttgggtgtgcacacgcttggggcagtgct
-gacataccagccccctgccgcctcggacccctacagacctcgggtgctgacgagcatagg
-aggaaagccgaggtggggctgagggcagctcggcacctacagcctgggtgccatgaatgg
-cagtaggagTCTTCTCAGTTCTGTCTCCCTCCCTTCAGTGTGGATGAAGGGGTAGAAATG
-AGGTACAGCATCCTGTCTTTCCCAGGGGTCGTGTTGCATCCTTTAATAGTTTACCACTGA
-CAGCACTACCAACGATTTGGGGATTGTGTCTCGAGGAAGCAATTGACCTAAATTTCATGT
-ATCAATGAAACTGTTTTTCCTTATGGttttaattatttatttattttataaaataaaata
-aataGGCTTTTAATATATAATGAAAGCCTTTTAATGTTAACATGCAAGGACTGAAAGAAT
-ACCTGTTGGACTGCAAGATGGCTGCTCCCTCTACCCTCAGCTTCAACTGGCCTGTCAGCC
-AAGCTTTGATTTCCTAGGCAGAATATAAAAGAATTCCTCTCTGTGGTGGTCCAGGAGACC
-AAGGGAATTTGGGGAGGTGATAGAACTGCACCCTGATCATGCTGGTGGTGAAAACTCGTG
-CAACCGTACACCCAAATGTCATCTTTTTTACTGTATGTTAATTTTAGAAATCAGAAAGTA
-AAAGATGCAATCACAAAAATATCATTTGGTAGGACAAACTTATTCAGTATATGAAGATAA
-TAGAGAACTTTTATACAAAAGTGGCTCTTACaaaatattaatataaaatattaaaatata
-aattCTCAAGAGCTATAACTTAAACTTCTATGTTAATTTAGGTAAGCAATTCTCCTATGA
-AAAGACTTAACGAATTCTTTCCTTTTCTTTTCCTCTTGTCTTTTCATTTTGCTGCAAGGA
-GCAGCCTTAAAGCTGACTGAAACAGTTATTGTGACCAGCATGTAATGCTTGAAAAGATGA
-AAATCCAGCTTTAAATATGCTCAATCTCAATAACttttttggtttttttttttttttttt
-tttttgagacggagtcttgccttgtcacccaggctggagtgcaatggcacgatctcggtt
-cactgcaactttcgactcccagattcaaatgattctcctgcctcagcctcttgagtagct
-gggattacaggcaccggccaccatgcccagctattgtttgtatttttagtagagatgggg
-tttcaccatgttggcaaggctggtctcgaactcctgacctcattatctgccgccttggcc
-tcccaaagtactgggattacaggtgtgagccaccgcgcctggccTCAATAACTTTTTAAT
-AGGTATATGCTTAGTTTATTCATGTTTCTTTGCTAGTTTTTTTTCCCTGCAAAGAAGAAG
-AAGAAAAATAATTTTAAATCTTATTTGAAGGATGATTGTACACTGTGTTATTGGCCTTGG
-AAAGGAGAGAAGGAGGAAAAGGAGTAGGAAAAGGGAAAATATCTTAAGAGGTTGTACTGT
-TAATCTACTTCCAGGCAGATTTTAACCACTAAAGCTAAAATGCTATTATGAAATTGAATA
-TTTCAATTGAATATTGAAAATGGTATAATGATgccgggtacggtggctcatgcctgtaat
-ggtagcactttgggaggccaaggtgggtgcatcacttgaggtcaggagttcgagactagc
-ctggccaacatggtgaaactctacctctactaaaaataccaaaaaaatagccggaaattg
-cttgaacctgagaggcagaggttgcaatgagctgagatcatgccactgcacttcagcctg
-ggcaagagagcaagactccatcttaaataaataaataaataaatgaaAATGGTATAGtgg
-cttgaagatgcaggggcccatgaggaagaacatggatggcccctagaagctgaaagcagc
-ccccaggtggcagccagcaaggaagtggggtcttcaattctacacgtgcaaggaactgaa
-ttctatcaacaacctgaatgagcttggaagctgattcttccccagaagccgcagataaga
-gctcagccTGCTAGGGGCTTGAGAAAGGGGAAAGTGACTTTAAAAATGTAACTCGAGGGA
-GTTCCAAAAGGCTAAGCGATTCGGTGAATCTAATAAACATGTTAAAATGCATAAAGTTCG
-GGTGTGGGGGAAAGGGAAGGGAGAGCATTAGGACAAATAGgttcttttctgagttctggc
-caggaggcttcttgatcagttcaaattgttacaaagttcagctggaggtttccttctccc
-tgtggccgctctgggcctctggcagccctcctcaaggagcaatccgtttccttcagaggg
-tctgtgggttctcctggcttccctaatgcgttcctgcagtccttctgaagcaaaacttaa
-tgatgcgagcctccacacgctgctctgaccgtccgagtgggagctgcaatctagtcctgc
-ctcccgtctgtcatgatcccTGGTGGTTTTTGACTACagctcaattgttttagattccat
-gtgtaagtgagaacatgaagtatttgtctttctgtgtttgactcatttcacctagcagaa
-tgtGTaataaacattaacaaaatgaatgtgtaaaatcaggtagtgatcacagctacaaag
-aaaataaaacagagtgatagatggaaagtgatggggaggaagaacctggttagaaatggt
-ggtcaggcaggacctctctaagaagggaaaagagctgtgactgcacgataagccggccac
-gtgaagaccttgaggacaacatgcaaagctgatgacccaccggccctgcaaagaccgggc
-gggagataagcttggctggcgcgaagaaagaaggctggagggagtagaaatggggacagg
-agctgaacgctgggagagggggctcaaagCCAGCTCGCGTAGGCAGGGACTGGGCACTCG
-CAATGCGCGCAGAACAAAGGCCTCTCTCTCTCTTTCGCCACACTAAGGGCCAACATGGTC
-ATCTCCAGGTGCGGATTCTGCCGTAAAATGCGCCCCTGGCGACTCACGACCAGGACGCAT
-TCCGCACCGCTCCCCCACGCCCCGCAGCCCGCCCTCGAGGCTGATTGATTTGTGCCAGTC
-TCTACCGCCATCTGCCGGCAGCACTCGGTACACCCGCGCCCTGGAGGTCGCACGCGCTGG
-CCAAACGGGCGCACCAGACACTTTTcagggccctgccaaagacctcccaatgtctactgg
-cgtcccagacacaagagatccaggccaagactcacacttcacaagatacacagacacggg
-ccttagggaacaggaaattccatgaaacttccatttacccaattagccggactcactgag
-ccccagaatagggttttcaaccaactcctactaaaattAAAAAGTAATGTGTGGtataga
-ttggaataatagacattggaggctacaaacgatgggaggcggagaggggtgagggttgaa
-aaattacctattgggtgcaacattcactatccgggtaatggggcactagaagcccactcc
-accactatgcaatatatgtatttgtaccccgtaaatctataaaaataaaaaCTACATTAA
-AAATAATAATAATGTCTGGTCATCTAAATAGTACCTCTACAGCTTATTAAGTGCTCTGGA
-GACGTCCCAGTTGCCTGTCCTTCCCATTAAAGGTGATATCCAGTGCTGATTTCCCCTTCA
-ACCTCGGGTTCCCATAAACCTCTTCTTTCTCACTCCTGCTGCCCTCCGGTACTCCAATAA
-AGAATGATAGATGggccgggagcagtggctcacgcctgtaatcccagcactttgggaggc
-caaggcggatggatcacctgaggtcaggagttggagaccagcctggtcaacatggtgaaa
-ccccgtttctactaaaatacaaaaattagctgggcatggtggcgggcctcagtaatccca
-gctactcaggaggctgaggcaggagaatcgcttgaacccgggggcagaagttgcagtgag
-cagagattgtgccactgcactccaacctgggcgacagagcaagactccgtctcaaaaaag
-aaaaaaagaaaagaaaCAGTCCCAGTATGCATCCATGTGCATGTGCATGCAGGTGTATCT
-GCCTGTGAGAGCTGCGCACGCGGCTCTGAGTACCTGGGAAGACACCCATGTACAGATGCT
-GTACATGTGCGGGGTCACTCTCTGGCGCATTCGGAGGCATGAGGGCTACGTGCAATGCGA
-GGGAACCTATGTCCAGGCTTCCTTTCTTGGTTTTCCTCCTCTGAACTCATGCATCCCTTC
-ACAAACagtccagctcctggctaaaaacctatgtgtgatttttcagcccaaacacaggca
-atgacaggttttacctggcaggcctcacagctgagtcgtgcacagctgatgcgttgcagt
-ctttaaagacagttgcagacacagactcaggcctcctggacagtcgacctctcacacaca
-tctccgctcccaacccaagtcttcattcagacacgtcttcattgcagtggggtaggcctt
-cggccaggacctccttatcttggggagtggagaatccttgaagacactttcctccatgct
-gactcagaagttttcccactctcccttccccaccccatccctggcccccaggtccgtaca
-acttcaggagcctttttgttggaagcttttctgcagtgagaccaaccccacacctgtgct
-catccacccgaccccagttggcatcattctatgaggaaattagaacaggtggatctgtgt
-tctacaaaataaaacaaaccaggttctctggtttagcctctttcttgtactgtaataata
-agagatttggggcttggctattacttgctttgactttttttgttttgagacagggtttcg
-ctctgtcacccaggctggagtgcagtggtgcgatctcggctcactgcaacctccgcctcc
-tgggctcaagcaatcctcccacctcagtctccctagtagctaggactacaggtgcacacc
-atcatgcccagctaatttttatattttttatagagatggggtttcaccatgttgtccagt
-ctggtctcaaattcctgagatcaagcaacccactggcctcagcctcccaaagtgtgagga
-ttacaggcctgagccaccatgccgggccatcattaatcagctactccagcacttagcagt
-tcagctctctcctgctcagctgagctcctgaTTGTACAGTGGTTAAGAGCAAActgcctc
-tgccacttagtaacctggtgacttgaaaaatcactttgccttttcatcctttggtttctt
-catctgtaaaatgaaaataacaataaacaatacctacttcacagggtggttgttgtgagg
-gtgtagtgagttgatgtatgtaaagcATAACGTAGGTTCCATTGAAGTGTTTGCTATTGT
-GTTCAACAGGGTCCATTTCTGCTTGGAGATCCACATGGCTCTGGGGAGTACCTGTTGGCT
-CAGCCTAGGTCACGTGTTCCACCTTAACCatcccttccctgctccaaggtagagcccgtg
-acctgaactaaaccagcaggcacgctccacctccaacaccggctcaaggtgggcgtgtaa
-tataagctggttcaattagaatgaatcttttttttttttttttaaagacggagtctcatc
-ccccatcacccagactggagagcagtggcacaatctcagctcactgcaacctctgcctcc
-caggttcaagcaattatcctgcttcagcctcctgagtagctgggattacaggtgcctgct
-gccacgcccagctcatttttgtatttttagtagacacagggtgttgccatgttggccagg
-atggtctcgaactcctgacctcaagtgatccacccacctcggcctcccaaagtgctagga
-ttacaggcgtgaaccactgtgcccagcccaattacagtgaatcttaatacactggctgaa
-aattctgggacacagccagtctctctctttccaacaggacatgtacaaggacctgtacaa
-ccctgggagatgctggcatattggggccacaagcagtgctgacctgaagaaaagggcaac
-acctcagaaaacaaagtagataaatagaaaccaagtccttggtgccatcacttgatttct
-ggacaaagcctcacctaagctatttattgacctgagcccttcatagtttaggccaatGTG
-ATTTGGTTGTTTTGTTACCTGTAACCAAGTATCTTAACACAAAGTGGATCTGTGAGTGAC
-CAGAGCCTCTTGGGGGTTGTAGCAATCTAGTAgttggcccagaaaggccaactctgagat
-ggagtgtagggtgcagaatgttgagtaatgagtgctcttggaatcaacaactgaggaaga
-cagaaatatgcaggattgggcacagggagaagttcagctgcagtgcaggcccaagggtag
-ttgcagctgagccttcaggaagttctggagccagagtagcccttctgagttgttccaagC
-ACTGAAGGCCTAGCAAGTTCCAGGGGTATTAAAATCAATAAGCCTGTCAGCCCCGACAAT
-GCCCTCAATAGGTCTGGGCACAGATTGGAGAGAAGCTGGGCTCCCACTGCACCAGGAGGG
-AGTGGCCCAGAGCCACTGAGCCATGGAGACTCAGGCAGGGGGTTGCTCCAGCACTTCTTC
-TGGAGAAGTTTTGAGCCCCAGATGCAGTTAGCACAGTTGCCCGCCCCTTATCATAAGACG
-AAGTCCGTTCCCACCACATCTTCTGCAAGACCTAGCTGGGGACCCCGAGACACTGGCAAA
-AAAGCAAATGTAAATCCAGCTTTATTGGTAAAAAAGGAATAGCAGATTTAATCAGAAATT
-CCCACCTGGCCCAGCAGCACCAACCAGAAAGAAGGGAAGAAGAGAGGAAAAAACCACAgg
-aagaaagaaaggagggagggagggagaggaggaaggaaggaggagggaagggaagggggg
-aagaagggagggagggagggagggaaagaaagagggaggaagggCAGAGGGAGCAGGGAG
-ACTGTAGATCAGGGTCTGAATGGAGATCCGGTCCTGGAAGTAAATGATCCAAGGCTCCAG
-GTGCTGGGAAGAGAGCAGGAGGGGAGGGCGGCCCATGGCACTGCCATCTAGAAGGGTAGT
-GGCTCTTCCACAGGAATGTTGAGGATGACATCCATGTCTGGGGTGCACCTGGTGGGAGGC
-AGCACAGAAGGCCATGAGAGACCAGAGGTGGCGGTGTGGGAGCACCCACTCAGAGGAGCC
-CTGCTCTTTAGAACTCTGGTACGTACTTGGGTTGGGGGGCAATCCCAAAATACAATCTGT
-GATCTATCTGTGACCTCAAAGCCCAACTGTGcatacacaagcatacacacacacacacac
-acacacacacacacacacacatacacacacaTCAAAAATGGAAAAGAAATGAGTTTGGCA
-GGACAAATGTTCCCCTGACAAGTCTGAGGTCAAGAGGGAGCAGGAACTCAGCTCTGAAAT
-GCTGAGGGCCCTCAAGATgatcactggctttggagtgaggatgacaggtttgataacttt
-gacctgtgtcaccttgagcaagctatttctactctcccagcctcactccttcagttgGCA
-CTTAAGTGAAAAGCACTCATTAAGTCCCAGACCCCAAGtgagcctcagtttcctcatctg
-tcaaatgggtttaatattctaacctcagtcattggtggaaagattaaatgagaccatgcc
-agcaggtaataagtgctcagtaaatgacaggcaTTATTATTTCCATGAAAGTAGCAAGAG
-AGATGGATTCCCATCAGCAATATATTCCCCATTGCAGGGACCAGCACAAATATTTAAGAG
-GCTGAAGGATTACATTCTGTTTCACTCTCTTTTCTCTCTTCCAAGGAGACCATCCTCTCT
-CATGGTTTCAATAATCTGCTGATACACATGAAGTATTTAGGCAGGAAATGTCAGGATACT
-TGCAATTTACAAATACTATTAAAAAAATGAACatgaaaccaacatagaaaaaaaaaaaat
-ttctaaatctagatgggcaaaactggctattcattatatcattctctcttctttatattt
-gaaatttttcataataatagtaaaaaaaaaaaGTTcatctctatgctggcaacacctaaa
-tttctacttccagccaatatctgtcctctgaggtctacactcatcttgtcaattgcccac
-ccaatgactccaccttggcacctcatataaatcaaacttactgtccaagtcaactgtatg
-gtttttgttttgttttgttttgtttgagacatggtctcactcggtcacccaggctggaat
-gcagtggtgcaatcacagctcactgcagcctggaactcctcaatcgatcctcctgcctcc
-caaatagctgggaccacaggcacgtgccaccacatctggctaattttttaattttttgta
-gagatggaggtctcactatgttgtccccctggtctcgaactcccagcctcaagcgatcct
-tcttcctcatcctcctaaagcactgggattacaggtgtgagccaccatgcctgcctccaa
-ataaactttttgactgtgcctacatacacatccctcaccccgccccagccttcccaatct
-ctgcatttgacatcaccaccaccccattataaaagtcaggaacccaggggttattcttga
-tacctccctttcctgtacttcccaagtcatgcaagtccttcttactttcctaaatatttc
-tccaatctatctatttctcccatttcttctgccacactcttggccaggccacttcccatg
-ttcccctggacaactgccctcacacccactagaattccagctgccattctggctccttgc
-caatctcatccccatgctcttttcttttcttttaagaaagagtcttgctctattaagcag
-gctggaaggcagtagcaccatcttggctcactacaacctctgtctctagggctcaagcaa
-tcctcctgccttagccttcactgcagctgggactacaggcgcacgccaccacgcctggct
-aacttttgtattttttgtagagatggggtttcaccatgttgcccaagctggtcttgaact
-cctgggctcaagcaatcctcccaccttggcctcccaaaacgctgagattacaggcatgag
-ccaccacacccagcccaccatgctcttttcaaactgacttttttggaatacaaatctgat
-catgtggcttaagatcctttgcttctgggatcaggcagaacatctgggcctacagggcac
-tgcatggaggtccctaggggctgagttgccctgctcccttcccgccactctccctgtcac
-tctgcattccaaccactctggcctcactcagctccgtgtcaatgccaagttccttccaac
-catagctccttcacaGCTCAAGGCTCAACATGTGGTtggttcatagagcagtaacataag
-catcaccgggtagcttcttagaaatgcagaatcAggctgggcatggtggttcacacctgt
-aatcccagcactttgggaggccaaggcaggcagatcacttgaggtcaggagtttgagacc
-agcctggccaacatggcaaaaccccgtttctactaaaaaacataaaaattagccaggcat
-ggtggtgcacacctgtaatcccagctactcgggaggctgagacaagagaatcacttgaac
-ccaggaggcggaggttgcagtgagctgagatggtgccagtgcactccagcctgggagaca
-gagctagactctgtctcaagaagaaggaaggaagaaaggaaggaagggagggagggaggg
-agggagggagggagggaggggaaagaaagaaagaaggaagaaagaaaaagaaagaaaaga
-gaaagacagagagagaaagaaagaaagaaaaagaaaagagagaaaggaaggaatgaagga
-aggaaagaaagaaaagaaaagaaaaaagaaatgtagattcatgagccccactgagaccta
-ctgacttggaatctgctttttaacgcgatctccaggtgtttcctgggcatgttccagttg
-gagaggcTCTGCTTAACAGTGTGCCATTTCTACTTTTTAGGAGGGAAAATGTGCTTCCTT
-GCTCCTGGTGTTCCCTTCCACGTGGAAGGGCATCCATGAGTGTATTGCTCCTGGCCTCTC
-TCTGCCCCCTTAAATTCTGCTTTTGGAAAGGGGGTATGACCACCAGAATGGTGAGTGTGA
-GGAGAGGAAGGGGACACAGGGAGCCCAGTCCCTTTCTCTCTCAGCAGCAAGAAACCCGAA
-AGGACTCCACTCTTCTCTGCCCCAAGGCCTGGCTCCACGTGGGTCCAGCTCCACCATGAT
-CGGGTGGTTCAATTTGCCTAATTCTGGGTTCACTATTCAGAGGCCAACACAGTCTCTAAA
-ATCAGCTTTACCAGAATAAAGGTGATAACCTGGCCCACATGCACCTTACCCCTTTCAGTC
-TCATTCACTGTGTTCAGAGTTCAGGTAAAGACAAGTGACTATTTATTACGTCCCCCGGAG
-ACCCTGGCAccaccgcctagaattgctcttccttcagctcccccatcagtctctttcacc
-tagtgaatttctatgcatccttcaagcctcagttcaaatgtcacatcctcaggaaaacct
-tccttgactgcccagacTTGCTGTCCTAACAGTTGCtttcttttttcttttttttttaat
-taaaaaaaaatttttttttagatggagtctcgctctgtcacccagactggaatgcagtgg
-cacaatctcggctgaccgcaacctccgccttccaggttcaagcaattctctgcctcagcc
-tcccgagtagctgggattacaggcacccgccaccatgcccagctagtttttgtattttta
-gtagagacagggtttcatcatcttggccaggctggtcttgaactcctgacctcgtgatcc
-accggccttggcctcccaaattgctgggattacaggcgtgagccactgcacccagctCCT
-AAGAGTCACTTTTGCAGTGGCATGTACTCTACTCAGCAGCTCTGGGCTCTGCTGCAACTC
-CACATTTATTTGTGGCTCATTATCGACTCATGTCCAGTTCCCTCTTTAGTTCCATGAGGG
-CGGGACCAAGGACTGTTCTCATTCACATGGTGCCTGGCATTCAGAGGCACTTCATAAATC
-CAATAGTATTTTGTTTTGGGGGCGGGGGGCGGTTTagaaatagaagaaaaggaagaaatg
-gcgataggagaggagaaggaaggaaaacgacaggagggagagacagatgaagaagaaaaa
-TTAAAGAATTTGCAAATGCTAGGCTCTGCCACACATGGTCCTGTGGTGTCATCAAGGAGA
-GGTAAGCCTGGGGGACCCCCAACCCAACCGCAGAGGGCTTGCCCCAAGGAAGGGCAGGCA
-AAGAATTGGTTTCTGGGGCCCAGAAACCTGCCAAGTGAACAGGACAGACTTCTCTCCTTG
-TAGAGTGTCTTCCAGGCTATTCTTCCCTGAAGCCAACCACCCCACTCAACTCTGCCTTCC
-TCAAAAACCCAGAAGTGGAAGGCTGTACCCACTTGGTTGACAcatgggatctgggaacta
-gaagggcccttagagattacaccacccagcctgctgtgtacagatgggaattggaggcct
-ttgcagagatgggaaaggtcacatctgcccctggtcagtggcagatccaaggtggaaacc
-caggaccgcccctccctccctgtacagggttctgccatccacACCAGGCTGCCTTCCCCA
-AGAACAGAGAGCCTCCGTGAGCTCAGAGTGTGACTGGTTTAAGAGGCAGTGGCAAAAAGA
-TCACATACTTGGGTCTCCGAAGCAGAACATCCTCAAATATGACCTCTCGGGGTTCCCGGG
-TCTGGGCTTGGAGCTCTTCCACCTCGGCCCTTAATACAGGCATGTTCTCCTCAAACTGGT
-CAATAATCTGAGAGGAAAGGCACAGCAGGGGAGAAGGGAGAGGCAAATGGCCCCCAACCA
-AAGGGAGAAAGGCCAAAATGAACGAGGAGCAAAGCTATCTGGGGAAATGGTATGGGTTCT
-GTCACTGGGACTTGCTGGACTCCAGGGAGGGGACTTCCCCATGCAAGGTGCGGCTGGCTT
-CCAAGTTAGTGACAATATTCAGTGGTGCTGAAACAGGTGAGGGATCATGGAGAATGGAGA
-CAGGTTACAAAGTGGCGGGGAATGCTCAATCATGGGAATGAATGGAGGCTGGCAGAGATA
-GTGAAGGGCATACACATTAAAAACCAGTGAAGAGGCAAGATAATGAAAATTAATTCAAGA
-AGGCAGTGATGGTGAAGTTCATTAACACTGATAATGGGTGGTGGGCAGTAACAAGAATCA
-AGGGGTAAAGATGCACGGTGGTTAATGGCTGAATAGGTGATGTTTGGTGATGGTTGTAAA
-TGGGTCATTAGCCAGCATTGCTGGCTAATGAGGCAAGGCCTAGGTCAGTGCCAATCGCCT
-TCCCAGATGAAAGACAAGTGACAGTAATGGCACCGGCAAGGAGGGAGGCCAACACCAGAG
-TCAGAGACCTCCTGAGCGCCAGATCAGGAGAAGCCTGACTCATTCCCACAGGCCGTGGGG
-ACTGCCCATCCACTGCTTCCCTACAGGGACCACCACCTTCCTTGCCCACGCACTTCTCTG
-AACCTTTGCATGCATTTCAGGAAGTCCTGGCTTTCCCACATCTTCTGTAGGAGAGCCTCT
-TCATAGGGACGCTGGGTTTCCTGTGGAGGAAGAAGAGGTCTGGCCCCCAGGTGCCTCTTC
-CTGGGCAGCAGAACATGGTAGAGACCGATGGGGCTGCAGTGGGCCTGGAGGCAGAGGATG
-GGGAAGAGGGCGGGGTGGGGGTGAGACCTGGATCCCCGCTCCCACACAGCAACTGGCTAC
-TCACCGCCACCACAGAACTCAGAATTTTTTTCTTCTTCTTCTGAATCTTGTCAGACAAGG
-ATTCCAGGACCTTTCTGCGCATCTCACCGAGGTCATCCAGCTCATCCTGGGAGCCAGCAG
-AAGGGTGTTGGTCACCAGTCCTGCCTCCCACACAGTCTGGTGGGAGAGGGGCAGGGGCTC
-CCCTACCTGCTGGCTGTCCTTAACCTGCTGCAGCTGGCGCATAAGAGTGGAGATCTGGAC
-AGACTTGATGGAATACTCATGGTCCATGTAAGTGCTCAGGAAGTTCACTTCCTCCTGGGT
-CTTCTCAATCTTGGCATTCAGCTGCTCTGCCTGCTGCTCAAGATCTGGGGAGGGGTTAGG
-GAGGTCAGCAGGGACAGGAGGCAAGACCTTCCCTCAAGCACCTGGGCCCCAGGAGGCCCA
-GGAGGCAAGGTCTCCTTGGCCAGTAACTGGGGTCTGGGCTGAGGTGAGCTCACACAGGGC
-TGGGAGGTGGTTAAAAGTTAAGGCTCTAGACGGTTTTCCACCCCTGCAGGAGAAGAGGCA
-ATgctgggtaggaaaaaggaagggaattggtgcatgatccctagactagtccccactctg
-ccactgacttgccgggtggctctcgccaagactgtccctctccagacttcagtctcctca
-GAGACACACTCAAGGAAGTGAGACCAGGCAGATGGGGTGACAGTGGCTCCCAAGACACAA
-CCCATGGCAGGATTAAGACAAAGTCTATCCTGTCTTCCTCCAGAGAGACCCCCAATGTCT
-GGGGTTGACTGATCCACCACCCCTCTGCTCAGCAGGTGTGTAGTCTGCTCAGGGAAAAGG
-AACCACAGGCCAGGCAGGAtggaagccaggagacccaggttctagcccagccactgactc
-ccagaaggaccttggCAGGAAACAgagccaggctaggattggattctggctcctagctat
-ataaccttccacaagctactgcacctctcttagcctcggtttcctcatctgtaaaatggg
-aggacagcttccctgcctccaagtagttgcaatgactgagtgtgtgcctgtaaCAATGCA
-GACATTGGTAGAGACCCAGATACGGGGCCTGGAAAGAGCTAAGTGTTGGGTAACTATGCT
-ATTCGCTCTGTATCTTAGCATTCCCATCTGCCAAGAAGAGAGCCAATGGGGCTGAGGGTT
-TCTGAATGGCAAGTACAAGGTGAATGCTCTGCTGCTGACCTCCCCAAGGTGCCAGGGGGG
-AGGGTCAAGGAATTTGCCAGGGATTCTTACAGCTCATCTTGCATTTCTTCTTTTCTTCCC
-ACTCCTGAAGCTCAGATTTCAATTGCTGCAGCCTCTTCTTGTTTGAGTACTCCAAGATGT
-CGATGATGGTCTGCGGGAGGGGTGGAGTCAACTCACCCACAGGCTCTGCTGGCTCTCAGA
-GGCGGCCACCCAGCACTTCCTCAGAGGAGTCCCCAGTCCCAACCTCACTCCCAGAAACCT
-GACCAGAGGCTaatcgggacagtaacagtgtccacccatagggttgttgtaaggactata
-taaagacatacagatcgcttGCTATTACACGTAGAGGTGTTTGCAAATGCTGTTGGTGGT
-AGCAGCGACCTCTGTCGCACCGGTACAGTATGTGCCCGGTGAACCCCCTCTGGGACGGGT
-GCTATGGTGCCGCATTTCACAGAGCTCGGGGAGGCAAAGTTAACTAAAAGTCTCCCGGCC
-AGTGAGTGCTGGCGCGCTGGGATGAAACCCATCTCGGTCCTCTTGCAAAGCCCAGGTGAG
-GGGAGTGAAGGGTGAAGAAATGCGTCTTCCAGGTGGAGGAAGCACCACGTGCAGTGGGCG
-GGGAAAGGCAGGAGAGGGCGCGCGAGTGCGcggagggagggcgggacggagggagggagg
-gcgggacggagggagggagggagggacggagggcgggacggcgggagggcgggacggagg
-gacggagggagggcgggacggagggcgggagggcgggacggagggagggagggagggagg
-gacggagggcgggacggagggacggagggagggagggagggacggaggttgggacggagg
-gacggagggCGGGCGGATGCCGCGGGTCTCACCGCCAGGGTGTCCTGCTGCTGCAGCAGG
-GCCCGCACGTGCAGGGTCGTGCTGTTCTCCATCTCCTGGATGGTCTCGATCAGCTCCCGG
-TTGAGCTTGCTGAGGAAGTTCTCACGGCTTCGGAGCTCTCGCAGAGCGGCCCTCCCGCTC
-CTGAGCGAGGTCTGCGGGCGGAGGGAAGAGCAGAGAGGCGGCGCTGCGCCCTGCCCGGCC
-TGAGCCCCCGAAAGCCCGTGGAcccgccgccccggccccgccagacgcccgcccccgTGC
-GGCCTCCTGCTGGTAAACGCGGCCCAAGCTGGGCGGTTCCCCATTGTCTGCGCCGCCCGG
-GAGCTCCGGGACtctcatccgttcggaaacgcacgtgtacccatcatctcacatccctga
-ggtgcgggtgcatctacagttggtggcgtgtcaccaactaatcaacaaatatattattag
-tgggtaaataaagatgtgccttcatatcaatggcttctcagaatcaatgaaatatagAAA
-TAATAGTAAGggccgggcggggtggctcacgtctataatcccagcactttgggaggccaa
-ggtgggccgatcacgaggtcaagagttcgagaccagcctgaccaacatggtgaaaccccg
-tctccactaaaaatacaaaaattagccgagcgtggtggcgcgtgcctgtaatgccagcta
-ctggggaggctgaggcaggagaatcgcttgaacctgggaggcggaggttgcagtgagcga
-gatggcgccactgctctccagcctgggcgacagaggaagattccTGTCCCaataataata
-ataataataaACGCCCCAGGTAGGTTAAGAAGGTGGCAGAGCGACCGCCATGTCTGGAGG
-AGAAGCAGGGGAGGCAAAATGGATGATAAACGTCAGCATTTCCGGGCAGGCCGCGGAGTC
-AATGAGTACTCTCATTTCACACAACAGCCCCCAGTGGAACAAGgagggtctgagggttaa
-gtgactcgcctaaggttacacccagcaggtgcataaaaccTACAGTAACAACAACAACAA
-CAATTGTACTTCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAATAACA
-ACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAAT
-AACAACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTaa
-caataacaacaacaattgctgagggccctctacatgccaggccaggtgctgtgccttgct
-ctgcaggtggcacatggtatctgttcaccctccaacagctttatgtttactaactctatt
-ttgctgataaatggaggctcagagagtttaatgacttgcccagtgtcacacagtcaagaa
-gtggcagggctggaactggaaagccagacttctgaatcccaatgtctgtctttccgttat
-gctaAAACAAGAACTGAGTAGCCTTAAAACTGCAAGGCATGGCTGAACCAcgtagtgact
-aagacttggatgttgaacctagacacaccttggttcaaatcccagctcagccacttacca
-tctaagagaatctgggcaagttagttaatgtctcagagcctccttatactcattctaaag
-gtaaggaaactagtatctgttttagagaactgccgtaaaatataaatgagATTggacagg
-tgcggtgactcacgcctgtaatcccaacactttgcgaggcccagatgggaggatcactca
-aggccaggagttcaagaccagcctgggcaacatagtgagacctcatttctacaaaaagta
-aacaaaattcgctgggtgtggtggtgtacacctacagtcctagctactcaggagtctgag
-gtgggaggaatgtttgagcccagaagatcgaggctgcagtaagtcaagattatgccacca
-cactccagcccgggtaacacagcaagaacttgtctctaaaagtaaataaataaataaata
-aataCAATTTTaaaaaattaaaatgttcgctgggcatggtggtgtgcacctatagtccta
-gctacttgggaggctgaggcaggaggatctcttgagcccaggagtttacggctgcagtga
-gctatgattatgccatttcactttagcctgggtgacagagcaagaccctgtctttaaaTT
-CACAATCAAGCCACTTAGTGAGAGTGCACTCATGTGCACTCAGTGAACAATAGCTGATAC
-TACTGTCTCTGGCTCTAACCCTCTACCCCTGCCATAAATATTTGCTCTTTCATTTGTTCC
-TGTACTTCCTCATTTCTCCGTCCTTTACTAAAAACGACCCCTTCCTAGCCCTCAGCTCCT
-TTATTTCTCATATaacagtaatcatgctgatgtgctgagtgcttgccatgtggctgatac
-tgtactaagcacttcatgcgcactgcagcacatcaccctcacagcaagactaagagatgg
-gcactattattaggccaactttataaaagtggacagcagtcgggcacagtggttcacacc
-tgtaatcccagcactttggaagagcaaggtggaaggactacttgagcccaggagttagag
-ccctgggcaacaaagggagatcccatctctacgaaaattagctgggcatgatagtgcatg
-tctatagtcccaactactccgagaggctgaggtgggaggatcacctgggctcggaaggtc
-caggctgcagtgagccatgatcatgccactgcgctccagcctggatgacacagcgagacc
-ctgtctcaatcagtcaatgtggacagcaaggattaaattcagtaacttattcaaggtcac
-acatagcagagctgTCATCCTTGAAGTCTTGCCTCCTAGCCACTCCACTACCTTGTCTCC
-ACATCTCCAGACCAAAATACCCAGAAGTATCTTGTGAAAAATGTTATTCTCCAAGTCCTG
-GGCCCACTGAAACAGCAGCACTAGggtttcagttcaaatgtcacccaccttagcagcctc
-tcgttagcacctaaacaattactgccacactctcctccgtgcctccagccccctaacctt
-attcttaggcttctctttagctcttatcatcatttcaaatatctttctcttgttgattgt
-cagtctcccccatccaatagaatggaagtcccctaagatcagaggtcacattactggtga
-accctcatactcagaatagaacctggcacatggtaggtgctcaatcaatatttgttgatt
-cattaaatgaatGAAAGATTGCAAGAGACAGTATTAAGAACTGGACtggttaggagcaca
-agttttagagccaaattgtccacgttcAGCTTCTACATCAATCAAAAACACCTAAACCCC
-TCTAAAGTTAGGATAAAAATAACAGAAATggctggaagcggtggctcacacctataatcc
-cagcactttgggaggccaaggcgggcagatcacctaaggtcaggagttggagaccagcct
-ggccaatatggtgaaaccccatctctactaacaatacaaaaaattagctgggcgtggtgg
-tgggcgcctgtaatcccaggtactcaggaggctgaggcaggagactcactcaaacctggg
-aggtggaggttgcagtgacctgagatcttgccactgcactccagcctgggtgacggagtg
-aaactctgtctcaaaaaaaaaTTTTTTTAAAAACTAAGAGAAATATGAGTTCCTCCTTTA
-AGAATACTGGGCTACCTCTAAACCATTTTGCAAGATAAAAGGTTAAAGGGGAAAAAAAGG
-TTTCAAAGCAAATTATATTTTCCCTTGTTCTTTATATAGTAGTCATTGTTCATTGAGCTA
-TTAAAAATTTTCTTGAAGAATTATTCTATAGTATTTTGTAGTCTTTATAATACTTAGTAT
-TTTACTTTCTGCTATGTATGCTAAGGACTTGTCTTCCTTTAGGCATTTCAAATACTTTGA
-GACATTGTTCAGATAATTACAGAAGCCATAAAACAATGTATAGCGAGGAAATTAATTACC
-TACAATTGTAGCGATTGATGTGAAAATTTTCATTGTCAGTTTCTAAGGCTTGCTTCAAAG
-TACACTGTAAGAAAATTTAATTTACTGGAAttttttttttttgagatgaagtctcactct
-gtctcccaggctggagtgcagtggcaccatctcagctcactgcaacctctgcctcccagg
-ttcaagccggtctcctgcctcagcctcccgagtagctgggactacaggtgcgtgctacca
-cacccagctaatttttgtagtttgagtagaaacggggtttcaccacgttggccaggctgg
-tctcgaactcctgacgtcaaatgatccacccacctagacctcccaaagtgctgggattat
-aggcatgagccaccacacccggccAAGTTGCTGCAAATTTTAAGATAAATAAGCCACTAG
-ATCGTGTTCCTAATGCAACAAAATAACAAGCAATTCTGATTATTTCTTGAGTCTTAAACA
-GAACAGCAAACGCTTTGTTTAActggctttgacccctgatcctgccatttcctggctgtg
-tgacctggtgcatgtcatttatctccctgcgcctcagtttcccggtttgtaaaataggaa
-caaggataagcgtgctcacacagttcctgtgaggaagaaatgagtcaagtctggcaccca
-caaagttctcagcacatgtttgctacaGCCATCATCCCCGTCCCTGTCCTGGGCCCAGTG
-TCCAGGGAAGATGTGCCTCATACCTTCATTAACCAGATTTTGGCATGCATCTTCCCAGGG
-TCCAACTTCCGCCTTCTATGTAGTTCTCTTGGATTCTTCGGCTGGCAGCTTGTCACCACC
-GTAGTGGGCTTGAAGTGAAACACTAGGGGTAGACAGGAAAGGACAGGGAGAGAGTGAGGG
-TCCCGGAAGGCCTGAGGCCAGGTTCCCGGGAGTGCACCATTAATGAGAGGAGGGCCAGAC
-CCCAGCTCCACCCTCTGACTGCCTTATAATGTGACACTAGACCGAGGGTGAAATTCACAC
-CCTTCACTAAGCTCCCAGGACAGACTCTGGGCCTCAATATGAGGGAGGGACAAGCCCAGG
-TGAAAGCAGTAACTATGGACATGGACAGAGGGGAGGGCAGGGCAGCCAGGAACCCCGCTC
-TCAAATGTCCAGTCAGAAAGAGAGTCGGGAACTCCCACTCCTTGTGTCTTTCCAGTAGCT
-ACTgcagcacaggacagcagaaagaccagagtctggcaggcctgaatccaaatccctgct
-gtcccaccaacctggctgGCAGAAGGCCTGatggggtaggggttaagagcaagaactaat
-gagccagacagtccaagtttaaatccaggctctTggccaggcatggcggctcacgcctgt
-aatctcaacactttgggaggccaaggcgggcggatcacctgtggtcaacagttcaagatc
-agcctggccaacatggtgaaaccctgtctctattaaaaatacaaaaaatgagatggacat
-gatgatgggcgcctgtaatcccagctacttgggaggctgaggcaagagaatcgtttgaac
-tcgggaggcggaggttgcagtggtgcgagatcccgccactgcactccagcctgggtgaca
-gagactctatctcaaaaaatatatataatcataaaaataaatttttaaaaattccaggtt
-ctgccttctactagctgcgtgaccttgagcaagtcaaatgacctctgtgtccctccattc
-gtccacctataaaatgggaataatcatcacgcccacctcatagagtcttcctgaagatga
-aagaagttactataccttaaaggtgtttggaatagtgcctgatgcatattcagtgctgga
-tacacattaccagttgttactCTTACTTCTAGTGACCTGAGAAGTGGGACCACAACACCA
-GACGAAGGCACAGCAGCCACGCAAAACTCCAACTGGCTGTCTCTGAAACACTCTAAGGGC
-TGTGGTTCTGCCAGATAAGAGTACAGGCATTTGGGGGGCATATTCTCAGAATCCCTGTTT
-CCTCTCTGCCTGTCGTGCAATGACATGGGACAAATCGCCCAGGTGGATCCAGCTGTACTC
-TCAGTCCTCACCAAAATCCCTGCTTCAGGTACAACCCAGCTCATCTGGGAGAGATACTAA
-TCTCTTTAATAGATCAATGTCCTTCATCCTGAGAAATGCTGGCATTAACTATGGAGATGA
-TTAAGTAAATTAATTTTGTGTTTAATTTATAAATTACCTGTATATATCCGGTTTTTAGTT
-GTATTGTATAAGAGATAGAATGATTAATAGGTTAATCTTGTGATTCTAATTTTAAAAGTG
-TAAGTGGGATTTTGATTTAGATTTAAGTTGAAAGGTTTAATACACTCTTATTAGCTCCgt
-tgcccaggctggtgttcaatggcgagatctcggctcactgctacttctgcctcccagatt
-caagcaattctcctgcctcagcctcctgaatagctgggataacaggtgcccgccaccaca
-cccagctaattttttaatttttagtagagatgcggttttgccatgttggccaggctggtc
-ctgacctcaggggatccacctgcctcagcctcccaaagtgctgggattacaggtgtgagc
-caccgcgcccggccAGATTACCCATATTTAGAAGTTTAAGTATTAGATATACAAGAATTA
-TGTAAATACCCAATGGTTTTTGTTAATCAGACAAGTGAACCATTTGAAAATGAAAATGAA
-TACGTTAAAATTTAAGATGTGGCTTAAAAGGTTTAGGAGAATTTAATTAACCAAGTTCCA
-AAACCCCCTTACAAGTGTTTATAAAAATTGTAAGATTCTTAAGTTGAATTTAAATGCTTA
-AGGAAGATTTGCAGTTTTAATAATGAGGATTTATTTTCATTATTGGTAGTAGCCCTAATT
-TATCtttttttaaattaaatcttttattacaagatagttcagattcacaagcagttttaa
-gaaataatacggagGggctggccgtggtggctcacgcctgtaatcccagcactttgggag
-gctgaggcatgtggatcacctgaggttaggagttcaagatcagcctggcgaacatggtga
-aaccccatctctactaaaaatacaaaatttagccaggtgtggtggtgcacgcctgtaatc
-ccagctacttgggaggctgaggcaggggaatcgcttgaacccgggagttggaggttacag
-tgagctgagatcacaccactgtactccagcctgggtaagagagacagagagagagagaga
-ctctgtctgaaaaaaaggaaaggaaaggagaggagaggagaggggaggggaagggagggg
-agaggaAAAGGAAAAGAAAAAGAAAAAGAaaaagaaaggaaagaaaaggaaacagaggta
-gtctatgtaccctttacccagtttctcccagtggcaacatcctgcaaaagtacggtacaa
-tatcacaaccaggatattgacattaagatgagcaagatataggactttcccataaccaca
-aggatcctgcctgtcgccttctacaaccacacccacttccctccccttaccaccctcctc
-acaactctgtccctaacccctgcaatcactaatctgctctccatttctataattttgtga
-tccccagaaggttatataaatggaatcatccagtatgtaactgtggggattggctttttt
-ttacttggcataattctctggagattcatccaagttgttgaatatatcaatagttctttc
-ctgtttatcgctgtatagttttccacggtggggatacaccataggttgtttaaacattca
-cccactgagggacttcaaggttgtttccagttttgaggaattatgaacgaggctgctatg
-aacattcacatactggcttttgtgtgaatataagttttcatttctctggaataaatgccc
-aagagtaaaactgctgggtcggattactaggaagtgcatgtttcatgttgttagaaatgg
-ccacacttgtttccagagaggctgcatcattttaccttcccaccagcaattgcgcacaat
-ctgacgtctcctctttgctagcatttggtgttatcactatttttttattttagccatttc
-gataggtgtgcagtgatatctcactgtggcttaatttgcattgccccaatggctaatgat
-gttgaacatctttttaatgtgcttatctgacatctgtatatctgctttggtgaaatgtct
-cttcatgtctttttcccattgcctaactgaattgtctgtttcactgttgagtttttactg
-ttactgatatattctacatagtagtcctttgtcagatacatggtttgcaaatattttctc
-caagtctatagcttgtcttttcatcctcctaaaaaggtctttcataaggccaggtgcagt
-ggctctcacctataatcccagcactttgggaggctgaggcgggcagattacttgaggtca
-caagttcgagaccagcctgtctctactaaaaatacaaaaattagccaggcatggtggcac
-acgccttcagtcccagctactcgggaggctaaggcaggagaatcgcttgaacccgggaga
-cagagtttgcagtgagctgagatcgcaccactgcaccctggcctgagcaacaaagcgaga
-ctccttctcaaaaaaaaaaaaaaaaaaaaaagtctttcacagaacaaaatttttaatttt
-gatgcagtccaattcatctatttttcttttatgggtcaagcttttggtgtgatacctaag
-aactcttcacttggccctaggccccaaagatttttctctcctgttttcttctaaaagttt
-ttcagtttcacattttacatttaatttctattttattttatctttgagctaatttttata
-ttcgttgttaaatcatttctttctttttctttttctttttttttttttttttttttttgc
-ctatgggtgtccaattgctccagcgccacccatggaaaaggctttcttcctccactgaat
-tgtttttccactttctgaaaaacccattgggaatattggtatggatttattccCTTTTCC
-TCACTGGGAAGTGTTGGCAGTGTCCAGCAGGTAGCTGATCCTTCATTCCCTGCTTGGTGG
-TGCTGATTccccaactgggatagtgctggcagggatgagtggggaggtcatcttctaacc
-cccacctggcagaagacagtgctctgactctctctctagggtagtgtcaacagagtctag
-cagtgacaagatttcatgaagtgtcatgaggtgggactcatcacctctgggcttcactcc
-cctcccccagcctacctatgtcagtagagcctggtgggagcctgagcctctatccccacc
-cagcatcagtgaggtAAAATAAGGTAGTGAGATGCAGGGCAACTTGGCATTCTACTCTCC
-CATCTCCTTTCTGTGTTTCAGTGTTGCCCACAGGGGAGCTGATCTAACATTACTTACTCA
-GAGGCAATGAGGTGGTATGAGTGATTTTATACATAGAtgtatacataagtatgctagatt
-gtctatgaagttcatttcaggataccaaagaaatattacaaaatatttgttattaattct
-cacaacaatcctaggtggtattagtgtccccatttcacaaatgagaaaaccaaggctcag
-agagatgaatgatttttccaagtgagtaaatggcagagccaaaatctgaccccatgtctg
-cctgagcctgacccaaggccTCGGAACTCCCCTGTAAAGCATGATAATGAtgtggcagag
-tttattctacgatttcaccaaaccttgttttcttttcctcctggaaaaacagatggacta
-catttcccaccttcccttgtggttagcagaggtcatgtggctaaattatggcccctgaaa
-catgagtaggagtaacatttgtcacttcaaatctggaccccccccaaaaaaaatgcccac
-ataattgtccatgttcttgttctctctcttccctctatgccagctggatgcaaaagtatc
-cagcagaagacttcaagaccttacaaaatatcagacccacaaggtcaaaggaacctggat
-ccctgaatgaccatgtggaacagaatccctccttcctcagatccacaaatgtactgtggc
-ataaatgagatataaacttctatatcaatacttgcaatttgggcattgtttattacatca
-gttagcctaccctaaTATAAGTGGTGTCACCAAGAGCCAAAAGCAGCCACTCTATCCTGT
-CTCCAACCCCCACACCAGCTCCCAGGTGCCTCCGCCCACCTGGTTGGACCCTAGTCAAAG
-TCTTCATTTTGCTTGTATGAAGGCTGTTGGCTTGTTGGACTGGAGGCAGAGTAGATGGCT
-TGGTTTCCTGCTTGGACTGCTGCCATGGAACATAATCCTACAAAATATACAATCagtcac
-atagcaccatgagtttatatcccagctctacccttttcagatatctgtgaccccaagcaa
-gtgacttgacctctcctgagcctcaatcttctcatctgtaaagtggatctaataataaaa
-cctacttctgtggattggcgcaagaattctgagagatatttatgaagcatgtggtaagtg
-ctccataaatgttagctatcactTTTTTAAATCAGCCAGCCAGAATTTACTAAGCACATC
-CAGGCTGTGAGGTGCTAAGAACTGTGAGAAACAGAAGGCATGGAAAAGACGCAGACATCC
-ACCCTCAGGAAACCAGAGCAGCAATCAGATGAATAAGAGAGCAGCATAATATACCCTTAC
-ATTCTGATAAGACAGTGagaggagaaaaatgaggttctgaggcttgctctgggtcccaca
-gcaaagtgtgacccggctgggactggaattcgggtctccagcctATATCCGCGGAGCAGT
-CACGACCGTGAGAGTGGAGAGCAGGTGGACTGCAGGGCCAGCGAGCCTCCCACCCCAGCC
-CTAGTCCCCCAAGACTCACCGGAACCTGGAACTCCTGGACTATGGAGTGAGTCCCAGAGT
-GCTTGGGTCTGGAAAGAGTTGGGAAGGGAAAGAACTTCCATTATCCCCAGCCCAAGGGGC
-AGCAAGCAGCAATTCGAAACAGGATTGGAGTCTCGAACCAGAAACTGCAGTTTACCGGGG
-ACAATAGCCCCGCGGGAGTGGGGCGGGGCCAAGGAGATGTGGGCGGGGAGAGGACGGGGG
-TCAGAAGACCGAGGGCGACCTCGAGGCGAGGGCGGGACAGCGGCGGGGTGTGAAGTACGC
-ATGCGTATTCCGCCTTTCTTCCAAtttttttttttttttttttttACCTACTTTTGTAAG
-ACATGCGCCATTGGGGAAAATGGAAGAGAAGTTGCGAGTCTGTGAGACCCTGATCTTCTG
-GTATAACTACTCGGCTTTTCCAACTTCCTTGTCTCAGTGTAGATCGCGCGGTAACCCAGG
-CCACTCAGAAGTCCCGAGACCCGATGCTTTCGCCAGCGTCTCGGTCTCCAAGGAAACGCG
-ACGCCGCCTACCGAGCGCCTAAAGGGACTAACCTCTCAAGGCAAAATCTAGTTCGGCCCG
-CTTTTCAATTTTCAAAttcccttcagtttgctctgcccataatcctaaaatatgatatca
-tatttctccactctcatcaaacttccaccatttccttcgccatcttcactcttggctaat
-gagtttgcttccaattttactaagaaaattgtgggaatcagtaaacccacaagttcatgg
-catcatttactcgcctacttgcctccctcccgtaactacgtataaactgcctactaagac
-caattcctacatttatgcaccgaatcctatcctctcacgttttctcaaagatattggccg
-agcagttctccccgttttttcctcctcttttctctctcctttgtatcatcagtataccaa
-cgtatttttaaatttcttctatttaaaaagattgtccacagccggacacggtggctcatg
-catataagcatgagagcactttgggaggccagaggtgggaagatcgcttgagccagaaag
-gtccagtctgcagtgagccacgatccagccactgcattccagcctggttgacagagcaag
-accctatctctaaataaataaacaaaccacttcccctccagccagctcccatttctgctt
-cattttaaagcaaaactcctagagaggtttgcctactctgtttcccatttttttccctcc
-tctcaatcaggctttcactccccactgaaactgccctcgtcaacatcattggtgacctcc
-actttgctaaaccccatggtcacttctaggtcctccctttatttggcctgtctgcagcat
-ttgacacaacagatcactccctcccctgaaacactttcttaacttagtatccaggaaacc
-actcttgagttgcttcctgcctccttttcagtctcctttgctggttcctcctcttctccc
-tttatcattgtagtatcccaggactcagtcccagccccctcccttccagtctcatggttt
-tgaataccatccgtacccagatgcctctcagactcacgtctccatcctccccctgaattc
-cagccatgtacatccaactgcctgcttgggccccttataagcaactctaatgtgcaatat
-ttttccagaaacatttttcccgaacttaaaatagggcatctctcttcttggaatcatcct
-taactcatctcttatcccacatccatcagcagatcctgttgcaataacttcaacgtatat
-ctggaataggaccacACATACACACACACACACCCCTCTTTCCTTTTGTACCCCAACTAA
-AGTACTAGTTCCCACCCTTGCCCTACACCAATTCTCTCTCTACACACCAGATTTGCTAGA
-TAGAGCACGGATTTAAAAGAGAATTCCAGTTTAAAAGATAATTGGGCGGGAGCAATAATT
-TTAAATCACTTAAACTTCAATAGGGGAACATTGCTATAGAATACCATGTCAGAGCTCCCA
-ACCTTTTCTGCCTCTTAAAAATCACAGGAGAATGTGTTTAAATGCACTGTGGTAAATAGA
-AGCAGCTGCTAGGATAAAAAGCAATTAGCCCAGGTACTCTGGCTATTCAGGCCCCTCCTG
-GCTGACCCTAGAGCTGAGGGAATCACTGTGTTGGGTACCCTCATTTGCAGAGCACACCAT
-ATGACAGCACTCTTGCTGGGCAACTCTGTACCAGGAAACCATTAAAAAGTAAAAGATAAA
-ggccgggcacggtggctcacgcctgtaatctcagcactttgggaggccgaggcagatgga
-tcacctgaggtcagaagttcgagaccagcctggccaacatgatgaaaccccatctctact
-aaaaatacaaaataggattagccaggcgtggtggcgggtgcctgtaatcccagctacttg
-ggaggctgaggcaggagaattacttgaagcagggaggctgatgttgcagtgagccaagat
-cacgccactgcactccaacctggacaacaataatgaaactccatctcaaaaaaaaaaaaa
-agtaaaaGATAGGAATACAtgacagatccaggtagtgacttactcaacagccattcctcc
-ccatcatcgcaactattggatcctgatcttgtccatgtatgcacttgccttaatggaggc
-aggccccaggtccagccctagtcctagtcccagctccaatagtcatgactgtctgaggct
-ggacttggtgagccaatttccctttccagttagaggtctagtcatagatacatgatgaaa
-gtctggctaagaagacaggatgagaaatctactcaaaggcttttgggaaaggttttcatc
-acacttttaaaaaaaggcattgcagaaaaacattccttcatctgctggtagacattgtca
-tatctgtgtgggattcctggaatcgcggaactgtgaggggagttggccaaagaggatata
-cagtgaatggtagagaggaaaatgtaaaaaccttcttccttgatagcactgttgagccat
-taaattaaccaaccctagcctggcacaatagtatgtgcctgtaataccagctacttggga
-agctgacgcaggagcatcgcttgaggccaggcatttgagatcagtctgggcaacatagtg
-agaccacatctcagaaaaaaaaaattttgttttaattagccagatgtgatgatgtgcacc
-tgtagtctcagctacttgggaggctgtggtgggaggattgcttgagcccatgagtttgag
-actgcagtgagctatgattgtgccactgcacgccagtctgggcaacagagtaagattctg
-tctctaaaagaaattaattaattaaattaacctttcacctatctagaaaatacttgagat
-taaataagaaatcacattactgggtgagcaaatttgagttgagttttctggtacttgcag
-accaaaagcattttactgaACCCTACGTCtggaggaacaacaagatagaaggaacctggg
-tgggtccctgacaaccttgcaggagaaagtcacctacctgtccttactgcctgccaaatt
-ccgagctgcttcatcaaagagaaataaacctccaccttgtctgagaccctgtatttgaga
-gtccctttgttacagtagcttaacctgtaccttgattaatacaAAGAAGAGCTTGGCCAC
-TGTCAGACAGCCTTCCTCATCAGACATGCTGACCCAGCATGGACACCCACTGAGAGCTGC
-CTGTGCCCCACATCTCAGGTACTTAACCAGTAATATTACTGCCTCCCACTTCAAtttttt
-tttgtttttgagacagagtttcgctcttgttgcccagactggagtgcaatggcatgatct
-tggctcaccacaacctctgcctcccgggttcaagtgattctcctgcctcagcctctcgag
-tagctgggactacaggcatgcgccaccacaaccggctaattttgtatttttagttgagac
-ggggtttctctatgttgctcaagctggtctcgaactcctaacttcaggtgacccgcccgc
-cttggcctcccaaagtgctgggattacaggtgtgagccaccgcacctggccCCACTTCAA
-ATTTTTAAAAAAAATACATAAAAACATTTGCAAAAATGCTGCCATCTTAATCAAAGCCAA
-AACACACTTGAGGGGCCACTGACAATCACCTGTAACAAAGCTGTTGGAACTGGGATTGAA
-TCAGATGGGGTCCATTTGCACTTACACCTGTTCAGGTGGCATTTCTGTGTTCACGAACAC
-CTGATGGAACTTCCTGCCCCCAGGATAGGTGGGCAAGATGAGCTGGCCTTTCCTCCCTGC
-ACATGTGAGGTGATAAATGTGATAGAGGGCCTCTCAGGCCTGCTTGGCTCCAGGCTCAGC
-AATGGCAACCTGGGCTCTGATTCCATCAACATCTTGCTGAGAGGTGGACTAGGCTGAGCA
-GGCAGTCTCGGGCTTCCATCCATGTCATTTGATGTGCTGGCTTTGTGGCAAATGTGCACA
-GCATCCTAAACCCACAATCCCTACTGTTGTCACTGGGTAAGATGCCGTGGTTCTTGTGGA
-GACACCTGCTATACTCGACATAACAAGATCCTAGACATTCCTTCTTATCATCTGCACAGC
-CCTCCAGAGCTGCTCTCTCCATACGGCCTCAGTGCCCATCCGGACTGCTCTCCTTGCAGG
-GTACCTGCCTGGCCCCTGTAGCTCCTGATGTAATAATCTCTGCAAAATTTGACCTGGAAA
-AAATGAAACTGACCAAAAGGATGGCCCTACACATACCAATGAAATTGTACAACAGAAGAA
-GATATGATTAGCAAAATTGGACATGGAGCCAGAACCTAATCCACAAGTCAAATATTTTCA
-AAATACAGACAGATGCCTTTAAAGTCCAACACAAAACAAAAATGCTCAAAATACGTTGat
-tatatgagagttcctgactagtgcagtaagacaagaaaaagtataagatttgaaaaaaga
-gacaaaaccttcattattcacagacgatatgattggcaatacagaaaagtaaagagattc
-caaaaaccactggaaattttttaaggtttcaactttgttgccagatatggggtcagtaca
-caaaattcaatcgtgtttcctctaacggacaccaacaaaccatatgtaacttctgattta
-caataatttcacttacaatagcagtcaaaccacgtggtactttggaataaatccccaaaa
-gtatgtaagacctttatgaagaaaactataatattttattgaaattcataaaataaggcc
-taaataagtgagaaatcaagtggggtcattgatggaaagactccgtgttataaagtggta
-attctgtacaaatgcagtgcaacgccaattaagatctcatagtttcctggaacttagtag
-gcaggttgtgaaatttatatggaggttccaaatatagctgagaccatcttaaagaagacg
-aaAGAGAGAGAAGAATGtttcccataaaagaagaaactggagttcagatttctctttgga
-aactgaaagatccccccacagtggaccctcacttctggagaggaatattcagctacagtt
-gactagcagttgccccttcagatagaatattcgatctccagttcacccagtatatcttct
-acttaaggcacctgcctgacccttgcagatatttgattatgtgaTAGTTACCTGGAGTGA
-GGGCTTAAGATAAGAGGAATGGAAGAGATTGTTTAAAATACATCTATTGTTTGGTTGTGT
-AAGTATTCTCCTCATGGTGAAACTTGACCAGGCAAGTAGAAAGAATAACAGAGAAGTATG
-TGAATCTAagacattgatgtttctggtaatggtgaagttccgagtatgatcacgggaatg
-cgtggctgagaagggataaaggaaatggtgcctgaggatataaagtgagaggactggaaa
-gTGCAAACGGCCCAAGTCAGTGGCTCCCCTGAGACCAATACCAGCAGTTGGGATGAAGGG
-AATCTGCCTGTTAACAAGGTTTCCTAGGATCTGATGCACAGTTCTTGATCCACGGCGTCA
-GAAATAAAGTGGTTAAATAAATATAAGCTACCggccgggcgcggtggctcacgcctgtaa
-ccccagcactttgggaggccgaggcgggcgatcacgaggtcaggagatcgagaccatcct
-ggctaacacggtgaaatcccgtctctactaaaaatacaaaaaattagccaggcgtggtgg
-cgggcgcctgtagtcccagctactcaggaggccgaggcaggagaatggcgtgaacccggg
-aggcggagcctgcagtgagccgagattgagccactgcactccagcctgggcgacagacca
-agagtccgtctcaaaaaagaaagaaagaaagaaaTATAAGCTACCTATACGTGGGGCTGC
-CTATTAACTCCGCcaagtgacttaactcctgcctctttatctgtaaaatgggcataatta
-cagcattgtttttggaagattccatgtaataaagtctgaagtgtgcttaacacagtactg
-ggaacttaagcagcactcaCACTTCATCCTAAATACGACGAAAGTCTTTTCAAAAAAATA
-AAAATTAATGCAATATGACTTACTTGGAAATGTATCAAAAAATAAAGACCGATGAATGGA
-TCGAGGCGTAGTGTGACAGAGTAAAATTTTAATGATAAAAAGTTAATGGTAAAATGTTCA
-CTGTAAAACTTTCAACTTTTCTTCTTGAAAACGTGCATAATCCGACGTGGGAAAAAAAAT
-AACGCATTGCAGTCAGTTCTGGGGAAACGGAAAGCTAAGTTTTAATTTTGCTATTGCTTT
-TGCTTTTTTAACAGAAAAGGTACAAAAAAGAAAAAATGGGAGAGATGTTGCCGAACTCCG
-TCCCGCCTGTGGGCTGTGGGCCGTTAGCAAAGCTGCTAGCATGAAATCGTCGAGCACCGC
-TTGCGAAACGCCAAATCCTCGAGAGCGAGGCCGGAGGCTGCCAAACCCGCGCTGGGGAAA
-GGGCCGCCTCCGGGCGCCCCATCCCGCTGCGGACGGAGGTGAGGTTGGAGCGAGCGCTGG
-CGGAAGAGAGGCTCAGCGCAGGGGGCGCAGAGCCGGCGCTGGCCAATATGCGCCGCATGT
-GATACCTTTGAGGGCGCGGCGGGGGAGGGTAGCGTCAAATTTCAAAAAAAAAAAAAAACC
-AAACCCACACAgccccggcgggcgggcgcgcgcgATGGGCGCCCTTTGGCTGCGGGAGCG
-AGTGGAGGATGCTGGGAAGGAGGTAAAATGGCCACCGGCGGCGGCGCGGAGGAAGAGAGG
-AAACGGGGGCGGCCGCAGCTTCTgccccccgcgcggcccgcggcccggggcgAGGAGGCC
-GACGGCGGCCGCGAGAAGATGGGCTGGGCCCAGGTGGTGAAGAATCTAGCCGAGAAGAAG
-GGCGAATTCCGCGAGCCGCGGCCGCCGCGGCGGGAGGAGGAAAGCGGCGGCGGTGGAGGG
-AgcgccgggctcggcggccccgcgggcctggcggcgccggACCTCGGCGACTTCCCACCG
-GCTGGCCGCGGGGATCCGAAGGGCCGTCGGAGAGATCCGGCCGGCGAGGCGGTGGACCCC
-CGCAAAAAGAAGGGCGCTGCGGAGGCGGGCAGGAGGAAGAAGGCCGAGGCGGCGGCGGCC
-GCCATGGCGACCCCGGCCAGGCCCGGCGAGGCCGAGGACGCGGCCGAGCGGCCCCTCCAG
-GATGAgccggcggcggcggcggcaggcccgggcAAGGGTCGCTTCCTCGTCCGCATCTGT
-TTCCAGGGAGACGAGGGCGCCTGCCCGACCCGGGACTTCGTGGTAGGAGCGCTTATCCTG
-CGCTCCATCGGCATGGACCCGAGCGACATCTACGCGGTCATCCAGATCCCGGGCAGCCGC
-GAATTCGACGTGAGCTTCCGCTCAGCGGAGAAGCTGGCCCTGTTCCTACGCGTCTACGAG
-GAGAAGCGGGAGCAGGAGGACTGCTGGGAGAACTTTGTGGTGCTGGGGCGGAGCAAGTCC
-AGCTTGAAGACGCTCTTCATCCTCTTCCGGAACGAGACGGTGGACGTGGAGGACATTGTG
-ACTTGGCTCAAGCGCCACTGCGACGTGCTGGCCGTGCCGGTGAAAGTGACCGACAGGTTT
-GGGATCTGGACCGGGGAGTACAAATGCGAGATCGAGCTGCGCCAGGGGGAGGGCGGGGTC
-AGGCACTTGCCAGGGGCCTTCTTCCTGGGGGCCGAGAGGGGCTACAGCTGGTACAAGGGG
-CAGCCCAAGACATGCTTTAAATGTGGTTCCCGGACCCACATGAGCGGCAGCTGCACGCAG
-GACAGGTGCTTCAGGTGCGGGGAGGAGGGGCACCTGAGCCCTTACTGCCGGAAGGGCATC
-GTGTGCAACCTCTGTGGCAAGCGAGGACACGCCTTTGCCCAGTGTCCCAAAGCAGTGCAC
-AATTCCGTGGCAGCTCAGCTAACCGGCGTGGCCGGGCACTAAACACCCGCCTGCCTGCCA
-GGGTGAACACACAGCCAGCTTATCCCTCTTAAGTGCCAAAACTTTTTTTTAAACCATTTT
-TTATCGTTTTTGAAGGAGATCTTTTTAAAACCTACAAGAGACATCTCTCTATGCCTTCTT
-AAACCGAGTTTACTCCATTTCAGCCTGTTCTGAATTGGTGACTCTGTCACCAATAACGAC
-TGCGGAGAACTGTAGCGTGCAGATGTGTTGCCCCTCCCTTTTAAAATTTTATTTTCGTTT
-TTCTATTGGGTATTTGTTTTGTTTCTTGTACTTTTTCTCTCTCTCCTTGCCCCCCTCCCG
-CCCTCCCCGCCCCATACCTTTTCTTCCCCTGGATTTTCACCCTTTGGGctgccttgctca
-tctttatgccccagcactaggtacggggcccaacacgtggtaggcactccatcagtgttt
-gctgaatTGAAAACATTGTTGACTGTGGCTTCTATCAGAGTGTCTACCTTTTGCAGCTCT
-TCCCCTCCCTCATTTAATTTGCTGCTTTTAATCTACGTGGTCTGAGAATTTGTGAAACCA
-GTGTTGTTAGAAGTGTATATAATCTGAATCAATAAGCTCTGAATGGTGGCCAAGGGCCTC
-TCTTATGGCACAAAGATGCATGGACTTCATGACAGCTCTTTTGGTGGCTCAGAAGCCATT
-TTTTATAgaatcatggaatctagaatattcctgctggaaagaacctgagagttggtttgg
-accaattccctggttttccagcagatgaaacaggcccaaagaggttaaatgactgggtga
-aaatcacatagctgtctggtgccagagccagcctatagtagagtcccctgaccccaagcc
-cggtgctcattccactACCTCTCACACTTCACAACAATTTCCTCAACACTTGAGGGCCCA
-GAAAGTCTGATCTCTCCAGAATGATCAGCCCAGAGGAATGCTGAGAAATCACCTGGAGGA
-GGGAGCAGAAAGAGAAGGTTTTTAAGGAGGGGCTTCTGAATACTTGGGAGATACGGAACG
-GACCAAGGACCACACTCCAGGGTGCATTCGTTGCTCCCTGGGGCACCACTTCTGGATTAC
-AGTGTGCCAGGTCCTTTGGAGGCCCTACCCCTTCCCCATTCATTGCCACCAGTGAGAAAT
-GGGGGTGCCCCTGTGTAAAGAAACCTACCAAAGGTTTACATTTGCACCTTAGCCTCAATA
-GCTACGAACCCTAGAGAAGCAGCTAGCTGGAGCTCATGTGCAACTCCTGATTCTCAGGAG
-AAAGATGGATTTTAACCCAAAATTATGAGTGAGCTGTTAACTCTAAAATGTACTTGGGAG
-ATAGGCCAAGCGAGAGGTCATGGGCCAACTAAGTGTTATCCAGTAGAAAAGACAGTACAC
-TGCTTTTCTTTTAGTGTTTGCTTTTCCTTTGCTATATGTTTTGCTATTTCCTTGTGGCTT
-AGAATGTAAAATTGATTGTTAAAAGTTTTGTTCTGAATAAATATTTATCTTTTGTATTGC
-TAAAACTGGTGCACTATTTCCTTTCAAAGTGTTAGATGCACAGTTACCCAGCTCCAGACC
-GTATTTCAATCCCACTTCCCCTACACTCCATTTGTTTACCTTGCTAAATACATTTCCCAC
-CCCTGCAGGCAACACTTAGCACCTACTACGTTGTGCCGGTCCCTTTGCATCACAATCAGC
-ACACTGTTAAAACGGGTTTTaagtcctaacacagttccaataaatcagaatcactgttag
-aggaagtgaaacattttagttaatcatcctcaagcaattctgatgggcagccaggtttga
-gaCCAGAGTATAAGATGTGTGAGCTGAAccctgccctcagggagattacagacctgtggg
-aaagagagGTGGTTTGCCAGCTTCCTCGTCTTTCTGTTACTGTAAGCGCGCGCTGTGGAT
-GGGATGCAAAATATTCTTGGGTTCTGGGAAAATGCCATTTCTTCCAGCTGTTGAAAAAGC
-GGGATCCAGGGAGCTGACTTCTCCAAGTTAGCCCCCACTGGAGACTGGGCCTGCAGGCAG
-AATAGGGTCAAGGTCCCTGGACTTCAGGTCCAATACCCTGCAGACCCCAGATACAACTCT
-CTGAAGGATTTTCCAGCTGGTGATGCTAGGATGATCTGATCCTGAGAGTTAAACGTTCCC
-AGTATATTGACTCTGACTCAGTGATTTGAGGATATTTCCAGAGCTGATCTGGAGTTGGGA
-CCTGGTAGGCTCTTGGGAATCCTGTCTTTCAGAGCCAGTTCAACCCCTCTCCTTGTCTCC
-CAAAGCAAGCAGACTCTCCCCTCCCTCCCATCCCTCTTTCCCGTCTTTGCCAGCGGTTTC
-CCTCCCTCTCACAGAGCTGGAGGCCAGGGGCCAGGAGAAAGCCTGCATTCACCATACTCT
-CCACTCCGTTCCTCAAAGCAGGCACTGTGCCAGGGAGCCTCCTTGAAGGAACCTTCCCTC
-TCCTGGCCCCATCCCCCCACTCTCCAGGAGGGAGGAGAGGAAGAAACTGTTTCCCTGCCC
-ATCCCCCACAGGATCTGCTTCAAGGCCTCCTGCCTGGTGGCCCAGGGACAGCCAGGGGCT
-GGAGCTGAACAAACCTCCCCCAGCTTCCTTTCCTGATCAAGCAGCCCTCAAATTACAATT
-CTTCACTGTTTTTGGGCTCCTGGAAAGTGTGCAGAGATGCCCGGACTGAGGCTGGTTGAC
-TAGGGGACATTGattcattccacttcaacaaatacggagggcattagagctgggccccat
-gcaaggccctctgcataggctgccttgaacaagacagTGCACTTGCAATGGAAGGTACAG
-ATAAGTAACAGTAGGCAATGTTTACAATCATATATTTAACAAtttttttttgagacagag
-tctcactctgttgcccaggctggagtgcagtggcatgatcttggctcactgcaacctcca
-cctcccggattcaagcgattcatgtgcctgagccttccaagtagctgggattacaggcac
-gtgccaccacgcccggctaatttttgtatttttagtggagatggggtttcagcatgttgg
-ccaggctggtctcgaactcctgacctcaggtgatccacctgcctcagcctctgaaagtgc
-tgggattacaggcgtgagacaccgcacccagccAACATTTGTCCTGTatagaattgtctg
-aagtaaaggtttccctagaagagaaaacgtcctgactgaaacctgcaagatgagtaagaa
-ccaggctaagagtgaagagacagccaagcagcagaaatagcagatgtagaggcctggagg
-ccagagagcacacagcgtgttcggactggccaagagtcaggggaagatgtggctgggaga
-aaacgccgagaagagGTGTCACAGGGCTTACCAGCCATATTTAAAAACGTGGATTTTGTC
-CTCAGAGCCTCCAATCAGGCCTCCTCCATTCCattcattctttcaacacatgcctgttaa
-gcgccaactctataggggccttttctaagcgatggaacacagcatggagcaggataatca
-agtccctgaagctcagattctagagtcacacaagtacataattacagacgatgatgcact
-aaaagaaacatacagggtgagatccctgtttaacaagcaaagctgatccagtcttaagga
-tcagagaaaatgtttgaactgagatggaaaagacataaaaggagttaatcgagagatggg
-gctggggattaagggatggcaagggtattaacctaggcaagagggatagcaagtaaaaca
-accctatagtgggaggaggcatgaccacttctagagacTAAATGAATCAGTCTAAGTTTA
-GAAACAGAAACCACTCTTGCTGTTGAAGAAAATGCTGGTCCCTGGGCTGGGTATTAGGAA
-TGACTCCTAGAACACCATAGAACTGCCAGGGGAGTTACTACCTCTCACAGTCAGAAAGAC
-AGAAGCCAGGAGGCCACCACTGGAAAGGCTGAGCATGAGGACACAATGGTGAAGCTGCCA
-CCCAAAGACAGGATCCTGGGATCAGAAAGTCACTGCCAATGCCACTGGCAGGACAGTGAA
-ATGCCAAGTCCTTTCCCTGCCTCTACAAAGCCAGGGACTGTGCACTACTGTCTCCGCAAC
-CATTTACAGGTAAAAACAGCCCAAACTGTCTGGCTTACTTATGCCTCCCTTCCATCTTTT
-ATGCAAATACATCTAAGTGCTAGAGCCCTAGCTGCAAGGGAGTTGGGAGATGTTTTAGCT
-TTCCAGCATCCGCAACATAGGAAGGCACATAGAATGGGGATGGGTGCTGTCTGTCAAAAG
-ACAATATCCAGCACAAAAAATGTGACTGCAGTGCAGAGAAGAGGAGCTCGTGGGagcatc
-tggtaggccatgttaagaatgtgggtctaagaacgatgtgccattgaaggacttgcaagc
-aagagagtaacatgattagattggttatgttttacaagcatcattcaggatagttggtgg
-agactgggtcagaggagagcccaaggggaaatacagtatagttcacccaggtctctcgag
-agatgaggacatcttaggcatggaaggcggagatgtacagagagaaacagccgagtaaag
-aaatctttcagagtttaagtcaacaagatttggagctatatttgacatgggctgggagaa
-agttaagtaccaaggatgttgcccaggtttctagcttctgcagttggatggatggtgggg
-cttttccctgagatgcgaaacagaagagaaaatccaagtttagggtgaagggcttgaatt
-tgattttggatatattgagtttaaggtctccgtagaggatatctaagaggagatgtggag
-taggcggttggatacacacagatcttacattcctaggagaattctggccctgagaaataa
-acacaggagttgtacagcTgtggctttcaaactgttttaccacatcccacagtaagatat
-atattttacattgcagccatcatacatatgcatgtgtgtatttatatctaaatctgaaat
-aagcttcctcaaacaatatttgccctgtgcatgatgcaccttgacactttctattccatt
-gcttcatccttttgtcaatgcttatatgacgtgttaaactgatttcacactctcctaatg
-gTCAAGAGAGAAAGCAGAAGGAAAGATTATACCAACTAAGATTGTGCCTCAAGCAACTTT
-GACACAGTTTTCCCTGATGgaaaaggagatggtgaaaaactaataagggacagccagaaa
-gggagaaggaaaaccagaacgtgcagaaacacataaaccaagggaggacatttcaggtgg
-taggggttaacaattgtgtcaagggctgcaagaaatcaagtaaaatcagctctaagaaat
-gtcaattgAggccgggcgcggtggctcatgcctgaaatcccagcactttgggaggccgag
-gcgggcggatcatgaggtcaggagattgagaccatcctggctaacacagtgaaaccccgt
-ctctactaaaaatacaaaaaattagttgggcgtggtggcgggcgcctgtaatcccagcta
-ctcgggaggctgaggcaggagaatggcgtgaacccaggaggcggagcttgcagtgagctg
-agattgagccactgcactccagcctgggcgacagagcgagacgccgtcaaaaaaaaaaaa
-aaaaTgtcaattgagatcagaactgaagagtgccctaggattgagtagtgtggaggttat
-caataagggccttttagaggaaagtgatgggggcagaTTAAGGAGCAAATGATCTTTCTA
-AGATGTCAATCTGGCACGCTGACCATTTTATTCCCATGTCACGTCCTCTGGGACTCCCTT
-GTGCACTTGGAACCCAGCCTGGTACCCGATCCCTTTCACAAGAGGCTCCTGGACTCCTTT
-CCAACCTTACTCTCAGCCAGATTGCCCATTACATCCCTTTATGTCAACTCCAGTTACGGC
-TGACAAACAGCAACCAGAAAGAATTTTGGAGTATGGAGTGGTACAAGACCAAGCTAAGGg
-gccaggtgcaatggttcatgcctgtaatcctagcactttgggaggcctaggcaagtggat
-cgcttgaggtcaggagttcgagaccagcctggccaacatggtgaaatcctgtctctacta
-aaaatacaaaaaaaaatagccatgtatggtggcatgcacctgtagtcccagctactcagg
-aggctgaggcaggagaactgcttgaacctggTGATACAGGAAGGGAAGTGCTGGGAAGGG
-AAGGGCACAGTCCCTTTAAATGACATGGAAGGGAGAAagggcgtggtccctggctagggc
-tccaccccagcctgtgcccatggacctaggtgaggacaggcatttttgttttcctgccca
-aatgttgcatttcccaagaccaccctggccggccacgcccccatcctgtgcctataaaaa
-ccctagcaggcagacacacaggtaactggacggctagaggagcacatcagtggaggaaca
-cacaagcggctggacgtcgagaggaacgcaccgacaggcactgacaaaccagcacaccac
-aggccatcgaccaacagaactatgcagagtttggctggggcagtcggaggggagcctggg
-ccactgaacagtccaactccaggggaaaaccttctcactccatccccttctggcttcctc
-catctgctgagagatacctccactcaataaaaccttgcactaattcttcaagcccaggtg
-tgatccaattcttctggtacaccaaggcaagaacccaggatacagaaagccctctgtcct
-tgcaacaaggtagagtgtctaattgagctggttaacacaagccacctatagatggcaaaa
-ctaagagcatacggtagcataagcccattggggcttcaggagctgtaaacatccaccact
-agacactcgtggggtcggagccccacaacctgcccatctgtatgctcccctagaggtttg
-agcagcgggacactgaagaagtgagccactccccttgtcacacgccctgggacggggaca
-agggaacttttcccgtttcaGTgggaggcagaggttgcagtgagccgagattgtgccaca
-ctgcactctagcctgggcaacagagcgagactccatctctaaataaataaataaaaGGAC
-CAAGCTAAGGGTGAGGAGACGTCAGATCATGCTGAGTTGAGGGTGGGGGCGCCACAGGAG
-TGCACCAAACGTGTACAAAGGCACTGATACATACAGCCCCATTTGCTGGCTTGTCAATGT
-GACTAAGATTTGGGGTAGGACATAGTAAAAGAAAATAAACACAGATATATTATGGAAAAG
-AATGTAAACTTTGCAGAGTTTTAAATAAAATATGACtttttttttttttgaggcagggtc
-tcactttgttaaccaggctggagtgcagtggctcactgcgtggctcgctacagcctacaa
-ctcctgggctcaagcaatacttctgccccagcctcctgtgtaactgagactacaggcaca
-caccaccacacccagctaatttttTCTttctttctttttttttttttttttttttttgag
-acggagtctcactctgttgcccaggctggagtgcagtggcacaatctcggctcactgcaa
-cctctgcctcccgggttcactgtggatatatcccctcccgggatatatccatcactgtgc
-ctggcacagctgcagcctcccaagtagctgggactacaggcacccgccaccacgcccggc
-taattttttgtatttttagtagagatggggtttcaccgcattagccaggatggtctcaat
-ctcctgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgag
-ccaccactcccagcctctctctttctttctcctctttcttctctttctttcttttctttt
-tcttttcttttctttcttccttccttcctcctttccttcctttccttccctttctctctc
-tccttccttctttccttccttccttccttcttctttctttctctttcttttctttcttca
-gggtctcaatatgttggccaggctggtcttgaactcctgccctcaagtgatccttccacc
-ttggcttctcagagtggtaggattacaggtgtaagccaccacacccagcccaagaaagat
-tttattttatttttttatacagacagggtcttgctatgttgcccaggctagactcaaact
-cctggacaacatagcaatcttcctgcctcagcctcccTAGTAGCCAGGTGTGCACGGAAC
-AAATTAtatgtattaatatggaacaatctctaagacacattattaaatgaaaaaaagcaa
-gatatggtatcctacagtttacattttttaatgttggaataaatacatacataccctcag
-caccataggaaagattttaaaaaagaaaaaatatatatacatatgcttatttttgtacaa
-atatgtaacactggaaggatattaatgaaattcgtaatttgtaACTTTGGAGAACTGGAT
-ATTTGGGGTTTGGGATAAAAGGAAAGTTTATTTTCCACTGTGTATCCCTGCTTTTAAAAA
-AATATTTCATCTATTATCTCTAACAACAACAAAAACAACTTTTAACAACAAAAATAAATG
-CAAAACACAAGACTTCAACGAAATTCCTATAGACTTTAGAGAGACAGGAGTCCATCTCCT
-CTATCTTTAAAAGTAAAggccgggcttagtggctcatgcctgtaattccaacactttggg
-aagccaaggcaggaggactgcttgagcccaggagtttgaggccagctgaggcaacacagg
-gatatcctgtctctacaaaaaaaaaacaaatcgttgggtgtggtggtacatgcctgtggt
-cccagctacttgggaggctgaaacaggaggatcacttgaggttgaggctgcagtgagccg
-tgatggcaccactgcactccagcctgggccgcagagtgagaccctgtctctaaaaataaa
-ataaaataaaataaaaataaaaAATAAGAACTTTGATGGAAGAGTTTAAGAAATTCTATA
-GCAGACAACACATTGGTCTCCCTGCTTCCAGGCTCCCTCTCCTTCCAACCATGGAATCCA
-CCCCAAAACAAAACTTGATCACATTTCTCCCCCGCTTAAAGAACTTCAAAGATTTTGCGT
-CCTCCCTGGTGTTCACCAGGGCCTGCCTGACCAGCCCTGCCTCCTCTGGGCCTCCTCTCT
-TGTCGGGCCTCCCCCTCTTACCCTGGCTTGGCTTCCCcttctgctccagctggtcattcc
-tggaagcagatctcttcctcccctacccatggttaatccttacctgcctggggcactcag
-ctctaatgctgcttcctaactagagcctaccctaacatcctgtatcagaccctcttacac
-cgtccgttacctccctggcctctccttcagcagttactcgggtgcaatgatatacttatt
-tgtgccatggtttgattgatatctgcctctgcctctccactttgagctccctgagggcag
-gaaccagtctcttttggctcacggttatagcttgagcaattagcactatgcctggcacag
-agtaaagcctaataaatatttattgcatgcatgaTCTAGAATCACTTGGCTGAGGTTACA
-GATTAAGACACGTGTCTACTTGTCCTTCTTTAATATACTTAACATACCTTAGCACTCTGT
-CATTGACACATACTGAACAAGGGCTTATTCATTCATCTTTTAAAAGCTAACTCACTCTTT
-TAGTTTTCCCACCTTTGATAAGGGAGGATAGGACCTGGGAGGTCAGGCCCTCGGTTTACT
-AGCTCATCCTCCTCTATTTCTCTGAGAGCATAAAATCACTGGAAGTCAGCCAGCATGCCC
-CATGGCACTGTGAGGCACAGGGGAGAAGCACCAGGCTCCTGGATTCTGAATGCGTGGCTT
-TGAAGCCTGGCAAGAGTGGCCCCTTCCCTGAGTCCCCCACCAcccctccccttggggcga
-ggattctgcaggcatgagaagtgcccacccagagtctgtgcctatgccttctagaacacg
-ctctgatacccgataattcccttccaaaatgtcactaagttaattcacagggctctttgt
-gggcctcatccctggcttcatctcacctgagggcaaactatactgcctgatgcacatctt
-atagacctgagccttgggcctcaagatagctgtttgcaggtgacagctaggtgttgaccc
-atgcatgctagctccatcactgatgggatgagaggtagctggataagggatggatacagg
-ttccaggggacaggtctccttgggcctacacattctggcacataactccaagggtcttag
-aattctaatttgaacatggccttccaggttgttagaggatatatccatcaaggaagaaaa
-cagaacatatttcatttaacacttgctggactgttgtataatttctaactatagagacat
-atggtatatgggcctccaactctactcttgttctgagccccacaaatgCCCATTtggttc
-tgtcatttctttgcatagacaagctacataacctctctgaacttcagtttcctgagcagg
-aaaatgggtctatggtaataactacattatcagggctggtgagaaaatgaaataaaataa
-tccatgtcaagggcttgagaagaatgccCTCTGGCTGTCGTCTCCTATGACTTCCTGTAT
-GATCTCCAAACTGCTCTCTTTGCAGGGTTTCAACACGGCTGCTCCCTCCTGCCTCCTTAC
-CCACAGCCAATAACCTCCCCATTCTCTCCACCTAGTCAAATCCCACCGTCTTCAATTGTG
-ataatagctggttgattgcacgtttactacgtttcaggcattgtattaagaactttccat
-gcattaactcagttctgacaccaactcgatgaagcaggcactgtttattattccccaaac
-acaaagacacagggatctggagactggaagcactggcggctgcaagtggcagggctggcg
-gggtgtgaagccggagaggagtctttctgcagTCAGGCCTCCCAAATCCCGGGATGGAAT
-CAAGGAGCCTTTGGCTGTCCCACCCCTCCTCCTCCAAGCCCCCAAATCCAAGTCTGTTAT
-ATCCCGTCAGCTCTGCGGGCCTGCCTGTGACTTTCAGCCCAAGGGGGCGGGCACTTCGTG
-TCACGCCACGTTGTCCACATCATCGAccctccctccccttctccccttccttccttccct
-ccctctcttcctcccATTGAGTGCCAGTTCTGTGCCAAGCTTTGCTGTTCAAAATGTTAC
-GAGTGGAGAAGTCAGGGAAGGATGGAATTATAGGTGTTTCTTCTTCATACCTTTCTGTTT
-GGCTGATTTTTTTTCAAATGAGCACGCAGGCCCGGTTCCTCAAACCCACTTCCAATGTGG
-CATTGCTGGGTTGGTTTGGTCCAAGGAAAGCCCTGTCTCCTTAACTCCCAGCCCCCACGC
-CTCCTCCGCCGGCCCCCAAATCCAGGCCGCCCTGCCCCCTCCGGAAAGGGGAGTTGGGGG
-CGAGCGCCGAAATCTGAGTGGCTCTTTCAAGCCTCCGTTGCCATAGAAACCGGCCGCACA
-GGCCGATGCTGTCCATTACACCATCCTCTAGCCTCGCAGCCAATGGACTCCGAGCTCCAT
-CGCCAGAGGCCCCGCCCCCCAGCTCTGGGGAGTCCACCAATCAGCAGGTCCCGTGACTTA
-GAGCCCTGCCCTCGGCCCAGGGACACCACCAATGCGCTTCGACCCTGCCCTCCTTCTCTT
-CGGTGTAACAAGAAGACTCGatatttttttttttttttttaGGAATTCTCCAGATCAGAA
-GGAATTGGCAGTAAGGCCTCTGTCAGCTGCACCCTGAATAATCTTTGGCTGCTATTTTAT
-TTAAGGAGAGCAAAACTGTTTCAATTACGCAACAATATATACCATTCTCTACTAAAACAA
-TTTTAGGAAATGAAAATGTAGGCAATGGGATGATATAGTCTGCTCTATATGAATGTCTTT
-CATTATAGGTATTTTAATTTAACTTAAAATGATCAAGGAACTAGTCATCTTTCCTTTGTA
-TTTCAAATGCATACAAAATTAAAGATACCGAGTTTTTTGATGCAGAGTTCATGAGACATT
-GACTTAATTAGTTGGTAGGCAACTTTTACTGAACCATCTAATTCCTGGTTCAGAACATTA
-CAACTGGAGGATAAATGAATATTTCTCTTAATCCATGGAAGAAATTCTGTTTTTGAGGCG
-GGCTGCGTAAATGGCTCTGACACTCTGGAGTCTAAATAAACCAAATGTGTTTTTAAAACC
-CGTTTGCCATTACAAaaaaaaaacttcaattttttagaacacttttagatttacagaaaa
-attgtgaatataaagttcccgtctaccccagccacccaCCCTGtttctttcattattatt
-attattattgagacagggtcccgctctttcacccaggctggagtgcagtggcgcgatctc
-ggctcactgcaacctccgcctcccaggctcaggcgatcctcccacctcagcctcccaagt
-agcagagactacaggggcatgccaccaagcccagctgatttttgcatttttcatagagat
-gaagtctcgccatgttgctcaggctggtgtttctgctattaacatcacatatggtattgc
-agacgcatggtatatttgttccaattaataaaccaataatgatacattatttattaatta
-gagttcacagtttattcagatttccttcgtttttacccaacgttctttttctactccatc
-tttttctactccaggatccatccagcatgcctcatcgcactagctgtcgtgtctctctgg
-gctcctcttggctggggcggtttctcaCATAGCAACATGACatcactgttggtgctgcgt
-caggtttctctactggaaagtcagtcttcttttgccccttttcatactgtactctttgga
-aggaagtcactatgctcgggccacacttaagtgaggagttatgctctatctccttaaggt
-tggaatagctacatagattatttgggatttttctacactgaagatttgtctcatttattc
-agtaatttatttatatcagtatggattcacagataattatttaatactttaggttataat
-ccaatactatttgattttgttgctcaagttgttccagctttggcttttgggagctctttc
-ggttggctcccgtctccctttgacacacccctatttttgtggggttttctcgttgccgtc
-aagcacttccttactttctggcactacaagatgcctcaggctcatctttcgtatttcctg
-ccccagtcctcaaatcagccatttcgcaagagctttgattgtttcggagaagggtattta
-ttagaaaccaagaactgggcgctaggtgcactcattgctactagggtgtcatttattTcc
-ttcctccctccctccctccctcccttcctttttgagacagagtctcactccatcacccac
-actggagtgcaCACTCATGGCTACAGCCACGTAGCCATGGTAATGAAGCCATAACCTCAC
-GAAGCTTCCAGTTTACACAATTAGAGGGTTAATTACCAAGTTGCCCAGCACTCTGCAGTG
-TGCTgtgtaggcaatgcgggggtaaattatctgaagagaatttaaagacaataaAAactg
-cagcctagacctcctgggctcaagtgatcctccctccttagcctcctgagtagctaggac
-cacaggtgtgtgccaccacactcagctaattttaattttcaatttttttttttgtagaga
-taaggtcttgccatgttgcccagactgatacaactcccggcctcaagccatcctcctgcc
-ttggcctcccaaagtgttgggattacaggcgtgagccaccacacctggccTtggggtatc
-atttcttttaagccttctcaactgacagaacaaagaaatatatctgtatataccaatgtg
-tatatatatacacacatatctatatttccatttgtaaccatctgtatatatattaagcta
-aacatgagttcctgtttatatttaccacttgaatccagggatcatttggcttgcttcctg
-cttgcttatctctaaattcccactccaataacgggaaacctggttcccatcatccacatc
-caccatccatttacttaattgttcaagtccagtatacatgtgtaggattatcaaaattgt
-taacccatacccctgtgggaaactttatcaagtagagtacattcttctgaacactttctt
-ttgcctttagtgttccagcagactccacttgtttcttttttctttttctttttttttttt
-ttttgagacagagcctcactctgttgcccaggttggagtgctggagtgcagcggggccat
-cacagctcacagcagccttgacttcccagtcttaagtgatcctcctgcctcagcctccca
-agtagctgggactacaggcatgcgccactacacccatctaattttttaaaatttttgtag
-agatgggatctcactatgttgcctaggcttgtctccaactcctgggctccagtgatcctc
-ccgcctcagcctcccaaagtcctgggattaaaggcatgagccaccacgcctggcccactc
-atttctaaagttacttaggtcagcacgttttcctctatcctcttcatgaggtcatttcac
-acatttgtaatacggtgaagatgtttgtcatattctgcatgacattttggaattatctaa
-atgtcctaagtgatttttttaactttgcatgcattaaggttcactttttgtgctattaag
-tttaatggatatcaaccaatgcacagtcatatacccacatttcttcaccctaaaaaaccc
-cctgtgctcacttattgaaccctctccccgccaaacactggcaaccacacatccgtttac
-tgtatctatggttttgcctttttgtgccattattaaaaaaaagaaagacgcacaatattt
-ttgttgttgctcttgtcacAGCTGCCacccattgaatccttactatgtcccaggtccaga
-attacactgtcccattttgaagatgaggaaacagatgcaaatgagttgaagtactcccta
-gagactcataacaataagcaaagtttgacttcTATGATTAACTTCTGAGTCACCTCTGGG
-AATATTTGTAATATGTCTAATAGCCACACttcttttgtttgttttgatacaggggtcttg
-ctgttgcctaggctggagtacagtggctactcacaggtgcaatcatagggcactacagcc
-ttgaactcctgggctcaagcaatcctcctgcctcaacctcaaaagtggctgggactacaa
-tgtgtgccactgtgcccagcTATattagccacatttcaagtactcaatagccgctgtgca
-gtttatactattatattggTTTCTGAGttttgtttttgagactgcgtcttgctctgtcac
-caggctggagtgcaatggcacaatctcggctcactgcaacctccaccacctgggttcaag
-cgattctcctgcctcagcctcccaaatagctgagactacaggtacgtatcaccaagacca
-gctaacttttgtatttttagtagagacatggtttcaccatgttggccaggatggtctcga
-tctcttgacctcgtgatctgcccgcctcggcctcccaaagtgttgggattacaggtgtga
-gccaccgtgcctagctATATTGTTTTTTAAAAGATCTCTTATTATTTAGTGAAAAGAAAG
-GAcctgtagtctcagttactcaggaggctgaggtgggaagatcatttgagccccagagtt
-tgaggtagcagtgagctatgatgatgccactgcactccagcctgggcaacagagggagat
-gccatctcacacacatacaaaagaaaagagaCCTTGTAATGCACACACTATCATAATCTC
-TGAtttttctttttttttttttttttttgagacactgtcttgctctgttgcccaggctgg
-agtgcagtggggtgatcactgctcactgcagcctcaacctcctgggctcaagtgatcctc
-ccacctcagcctccccagtggttgggaccacaaatgtgcaccaccacaactggtaaattt
-tttatttattgtagagatgtgggtctcaatattttgcccaggctggtctcaaactcctag
-gctcaagctagcctcccaaagtgctgggattataggtatgagccactgGCTttttttgtt
-tgtttgtttgtttttgtttttgatatggagttttgctcttgttgcccaggctggagtgca
-atggcgctatcttggctcactgcaacctctgcctcccaggttcaagtaattctcctccct
-cagccttctgagtagctgggattacaggcatgcgccaacacctccagttaattttgtatt
-tttagtagagacggggtttctccatgttggtcagactggtctcaaactcctgaccgcagg
-tgatctgcctgcctcagcctccaaaagtgctgggattacaggtgcgagccactgcccctg
-gccTGACTTTTTTAAAATCAGGAAATTTAGATGAATCAAAAAAGAAATTACCTTGTCCCT
-ATTGTTCTCTTCTCATTATGAATGTCTTTGAGGACCATGCCAGTTGGCAAATAGGTATTT
-TGGAGCTAGACACAGTTAGGGTGAGTGGAGTAACACGACAGTACCTACAACAGCCACACC
-CACACCTGAGTTGGCTTCATCCTGCCTTCAGGTATCATTAAGAATAGGtattattattat
-tattattattattattattttgagaccgagtctcactctgtcgcccaggctggagtgcag
-tggcacaatctccgctcattgcaacctctgcctcccaggttcaagcgattctcctgcctc
-agccttctgggactacaggcccgtgccaccacgcccggctaattttttgtatttttagta
-gagatgggtttcatcgtgttagccaggatggtttccatctcctgacctcatgatcctcct
-gcctcagccttccaaagtgctgggattacagatgtgagccaccacacctggccATATATA
-TAtttttttctttgagacagttccactctgtcacccaggctggagtgcagtggtgtgatc
-atggctcactgcagcctggaactcccaggctcaagagatcctcctgactcagtctcccaa
-gtaactaggactataggcacacaccaccaggcccagttaatttttctatttttagagacg
-gggtctcactatgttgcccagactcgtctcgaactcctgggctcaagcaatccttccaac
-ctctacttcccaaagtgttgggattgtaggcatgagacaccacatctggcctataatgga
-atattatttggcaataaaaaggaagttctgatacatgctacaacatagatgaacctagaa
-atcatgatgctaagtgaaagaagccaggcacaaaaggccacatgttgtatgattctcttt
-acatgaactgtccagaagagacaaatccatggatacagaagcagattaatggtggcctag
-ggctggggattagagggaaggcagagcagatgggagagtgactgctaatgagtactgatg
-ctaatggtttcttttggggatgatgaaaatagtctaaaatccattgtggcaacagttaca
-caactctgtgaatgcactgaaagccactgaattgtaaactataaatgactgaatagtgtg
-gtatgtgaattacatctcaacaaagctgttTTTTTTTTTTTTTAATGTTCTGGAAGAATC
-AGGATAGACATTACCTCAGGTGAAGGAAGGCAGGAGATGGGATGGTAAAGGAATTCATTG
-GGGAAAACAGGTTATCAATGTTCCAGTTCTTGTGTCAGATTGCTGACTCCACAGATTTTT
-ATTATGTTATGTAAAAATAAATACACACAGggccaggcatggtggctcacacctgtatcc
-cagcactttgggaggctgtggtgggaaaatcgcttgagcccaggagttcaagaccagcct
-aggaaacatagtgagaacctgcctctacaaaaaaaatttttcgaaattagccagccatgg
-tggcatgcatctgtagtcctaactacttgggaggctgaggcaggaggatcacttgggccc
-agaagttccaggatgcagtgagctatgatcgcaccactgtactccagcccaggcaacaga
-gcaagaccaggtctctaaaaaaaaCCCACACAAGCATAAAGTGAGGGAATCACAGGCAAC
-AATGAGAATGTGTCGCAGATGAAGCGATTCTGTATACCTGAGACAGAGGGAGATGAACGG
-GAAACGGCAGagagtggtcaggacagtcctctctggggagcccgtttgagccgaagctag
-gatgagtagatgctccagcccatgtggggatgggggtgaaaagagttccagacaaaggag
-acagcatgaatgagggccctgaggtaggcccaagcctgttgtgtttgggggacagccagT
-TTAAATGTCTGTTCTGTTATATTGTGGAGTCTCTGTGtatgaatttttcctaaagaaata
-acagacaggccgggtgcagtggctcacgcctgtcatcccagcacttcgggaggctgaggc
-aggcagatcatgaggtcaggagatcgagaccatcctggccaacatggtgaaaccccatct
-ctattaaaaatacaggtcgggcacggtggctcacgcctgtaatcccagcactttgggagg
-ccaaggcaggcagatcacaaggtgaggagatcgagaccatcctggctaacacggtgaaaa
-cccagctctactaaaaatacaaaaaaaaaaaaattagccgggcatggtggcgggcgcctg
-tagtcccagctactcgggaggctgagacaggagaatggtgtgaacccgggaggcagagct
-tgcagtgagccgacatcaagccactgcactccagcctgggtgacaaagcgagaatccgtc
-tcaaaaaaaaataaaaattagctgggtgtggtagcgcacacttgtaatcccagctactca
-ggaggctgaggaaagagaatcgcttgaacccaggaggtggagattacagtgagccaagat
-tgcgccactgcactccagcctggcgacagagcgagactccatctctaaataaataagtgg
-ccaaaaacatacatacaaaggtgttcactgccatattgtttataatagcaaaaaggggta
-aaacaatcaaaatgtctttcaagaaggaactgattcactttgggaggccgaggtgggcag
-atcacctgaggtcaggagttcgagaccagcctgaccaacatggtgaaaccccatctctaa
-taagaacacaaaattagccaggcgtggtgatgcacgcctgtaattccagctacttggaag
-gctgaggcagcagagtcatttgaacccaggaggcagagtttgcagtaatccgagatcacg
-ccattgcactccagcccaggcaaaaagagtgaaactccgtctctaaaaaaaaaagaactg
-attaaatgaattacaatataCTCGGCAGACCTGGACGAGAACCTACGCACTACATGGAAA
-GAGAAAAGAGATGTGAAAAAAGCAGGTTACTAGAAATTACATATAGTAACATTCCACTTG
-TGTAAAAAAAACTATGTGTGCATGTGATTATAAGCATTTAAGTTTCTGGATggccaggtg
-aagtggctcatgcctgtaatcccagcactttgggaggccaaggtgggcagaccgcttaag
-cccaggaatttgagaccagctcgggcaacgtggcaaaactcagtctctataaaaaataca
-aaaaattagccctgtgtggtggtacgcgtctgtagtcccagctacctgggacactgacgt
-gggaagatcacttgagcccaagaggttgaggctgcagtgagctgtgattgcgccactgca
-ccccatcctgggtgacagggagagaccttgtcgaaaaaaaaaaaaggccgggcacggtgg
-ctcacgcttataatcccagcactttaggaggccaaggcgggcagatcacaaggtcaggag
-ttccagaccagcctggccgatatggcgaaaccccgtctctattaaaaatacaaaaattag
-tcgggcgcagtggtgggcggctgtagtcccagctacttgggaggctgaggcaggagaatc
-gcttgaacgtgggaggcagaggttgcggtgagccaggatcgcgtcactgcactccagcct
-gggcaacagagtgagactccgtcccgtctcaaaaaaaaaaaaTTCTGGAAAATTACATTA
-AAATTTAAAATTTACTCATTATAATGCCATTTTTCTAGATTACAGGAGACGTTCACTTTT
-CGCCTTATATAATTCAGTATAAggccgggcgcagtggctcatgcctgtaatcccaaaact
-ttgggaggccgaggcgggcggatcacttgaggtcaggaattcgaggccagcctgaccaac
-atggcgaaactccgtctctactaaaaatacaaaaattagccaggcgtggtggcacgcacc
-tgtagttccagctactcaggaggctgaggcaggagaatcgcttgaacctgggaggaggaa
-gttgcagtgagctgagatcacgccactgcactccagcctggtgacagagcgagactccac
-acacacacacacacacacacacacacacacacaaacacaaacacCATATATATACATATA
-TAACTTTTGTAATAATAAAAAACATACTTCTACTTAAAGAGAATATCAATAAGCCCTAAA
-GTTTTTCATAGTGAAAGCCCTTCAAAATTGCTTGACAAATAAATTCTAAGTATACTAACT
-ATGGGAAAAATGTATGCTTGCGAAGACTTTGTTAGACACATTTTCTTAAATGCTGAAGCT
-ATAATTTAAAAATGAAGATTTCAGGAGACAAAATAAAGTCAGCTGGATAAAAAATGTGCA
-GAGAGAAAAAATATACCAAAATGTTAAGAGTGAGTGTCTCggccgggcgcagtggctcat
-gcctgtaatcccggcactttgggaggctgatgcgggcggatcacggggtcaagagtttga
-gatcagccggccaacatagtgaaaccccgtctctactaaaaatacaaaaattagccgggc
-atggtgatgcatgcctgtagtcccagccacttgggaggcttagggaggagaatcacttga
-acccgggaggcagaggttgtggtgagctgagatcgtgccactgcccttcagcctgggcaa
-cagagcaggactctgtctcaaaaaaaaaaaaagaGTGGGTGTCTCTTGGCACTGAGACAA
-TGAATCCCAACAAATTCCCAACAAATGATATTTTTTCCTTAAATTTCAGAATTTTTGAAG
-TTTTACACAATGAATATTTTGTGATCTGAAAATTTTTTCTTCCCCTCCTCTTCCAATTCA
-ACAGCTGAATAATAATCTtgtgttcattgtctgctactgcttaagacattctttccagac
-ttagaggcttaacaaagcaaacagctaccatctcacagtttctgtgggtcatgaatccac
-gcagagtttagttgcatggttctggctcagggtcattcacgaggttgcagttgagatgct
-ggtcagggctgcagtcatctgaagacttgactggggctggaggatctgattccaggatgg
-atcgatcactcagatggctgttggaagtaggtctcagttccttgttggtgttggcaggag
-gcttcagtttctcaccacgtagagctttccacagggctgcttgagtgccctcgcatgaca
-gctgacttctcccagaataaatgatacaaaataagacagccaggaggaaaacatagagct
-ttctatgtccaatcttagatatcacaaaccatcacttctgccatattctattagttagag
-gcaagttcacacttaactgggaaggggaggaggaattaggctcttccttttgaaggaagg
-aacattaaagaatttgtgaaGggccgggcgcagtggctcatgcctgtaatcccagcactt
-tgggaggctgaggggggcggatcatgaggtcaggagattgagaccatcctggctaaaacg
-gtgaaaccctgtctctactaaaaaaatacaacaaaaattagcagggcgtggtggcaggcg
-cctgtagtcccagctactggggaggctgaggcaggagaatggcgtgaacccgggaggcgg
-agcttgcagtgagccgagatggcgccaccgcactccagcctgggtgacagagcaagactc
-catctcaaaaagaaaaaaaaaaaaagaaTTTGTGAACATGTTTTTGAAACACAAGAAAAT
-ttccagctgatctttccccccaaatttccctcctccaatccaactacaacacatgaaact
-ccttaatcttgctgaagcgtacctctgatcatgtcatcctgcaataaaaaaactgtccct
-ggctccccacaacccagggaactccataacttggcttctgaggaccaactaccgtattgc
-ccttcagctccagctcaacataaacgcatcgtattcctcatgtacactcccccatctctg
-gtcttggcacctatccatgccctctcaatacctcgtcccagtctccttcccatctccagt
-cccttgcacttgctgtttcctctgcctggaatgttttacatggatggttcttcgtcatct
-tgagatctaaactctcccccatctctatcatcccccgtcccagtcactcactctctcatt
-accttgttttcttttcattgtcgtttgagacagggtctcactctgtcccacaggctgggg
-tgcagtggtacgatcacagctcactgcagcctcaacttcccgggctcaaacgatcttcct
-gcctcagcctcccaagtagctaggactaaaggcacaggccatcacacctggctgttttgt
-attttttgtagagacaggcttttgccatgttgcctaggctggtcttgaacttctaggctc
-aagcatctgcccacctcagcctctcaaagcgctgggatttcagatgtgagccaccttgcc
-cagcccctccctcccttctttccatcacccagtctggggtgcagtggcaccatcatagct
-cactacagcctcaaaatctctggcttaagcgttttcccacctcagcctccccagaagctg
-agatgacaggtgcttgctaccatgcccggctaatttttgaatttttgtggaggtgggatt
-tctctatgttacccaggctggtctgaaactcctgggctcaagcgattctcccgccttggc
-atcccaaagtgcagggattacaggcgtgaaccaccacacccagcccagctttattttctt
-tatagcagtcacaactatctgaaattatcttatttgtttacctgctcttttctgttgccc
-tcacttgctccttaagaacagggacctctgtcttggtcactgctgtaacccagtagcccc
-agttccaagttcactgcctggtgcacagtaggtggccaataaattgttgaattaaATGTC
-CTCTCTTCCAGGGAGTTGTTTTAGAAAGAATCACACACTGCATAAATGTCTGTTGAGGAA
-GAAAATGAAAAAAACAAAAGTGAAGACATTATCTTCTCGGCTGAACTTCCCACACCATCT
-TCTCTGTCATTAATAAGTCCTGGTGTCTACACTGGGGAAGGCAGTCCAAGGTTCTTCCAG
-GGCCTAGGTTCAGCCAGACTTTAACCATCTCTAGCTCCTCAGAGTCCGTCAAAGGGCCTA
-AGGAATGGTAAGTATTAATAATGtttgtttatgtatttatttatttatttattttgagat
-aaagtctctgtctcccaggccggagtgcagaggtacaatcattacaacttccacctttcc
-ggctcaagcaatcctcctgcctcagcctgccaagtagctaggactacaggcaggcaccac
-cctgcccagctaatttttgtacttttttttgtagagtaagggtttcaccatgttgcccag
-gctggtcttgaactcctggccttaagtgatctgcctgcctcagcctcccaaagtgctaag
-actacagctgtgaaccactgtgcAGGGTCAAATGTTTATTAATGGATGCATGCATGGATG
-GAAGAAGGAAAGGAGGCAGGTGTGAATAATGAATGCAGCATTTTCACTGCTGAGAATAAA
-GAGTGAAATCCTGGTCCAAATCAGTTTGGCAGTGAGTAAGGTTAGGAACTATTCACATAC
-ATTGGAATAATAATAGCAGCAGCAGCTACAGGGTCAGAGACAGATCTTTGAGAGGCCATA
-AGCATTGAAAAGATTGTGGTACCTATCACACACCGTCTAAAATAAAACAAATATTTTATT
-TATGGGAAAAGTGTTAAGGTGTTGATAATTCCAAGAAAGCTTTTATTTGTCCTACAATCA
-TTACTTTGATACCTTTTCTGAAATCCTAGAGCTGTCCCCACTCTGCCCATTTTTTTTTCT
-CATTATGGTGATGTCTCTGGGTTGCTGGTGACCTGCGTAACTATTGGGAAATCTAGTTTC
-TCAAAACttttagtttttttttagacagggtctcactctgtcactcaggctggagtgcag
-cggctcactgcaacatccgcctcctaggttcaagcgattctcatacctcagtctcctgag
-tagctgggattacaggtacgcgtcaccaagcctgactcattattttgtacttttagtaga
-gacaaggtttcaccatatcggccaggcggatctcgaacttctgacctcaaatgatccgcc
-cgccttggcttcccaaagtgctgggattacaggtgtgagccaccgcgtccCGTCTATCAT
-AAGTtttattgaacattgcctaggtatcaggatgtgtttacatgcattatctcatttaat
-ctgtaaaaccaccatgtgagggagaaactgaattatccccattttcaggataaggaaaag
-gaggGACTGGGAATGTGAACTCAGGAAGTGTGACTCCATCGGGTAGACTGCTCAGGCTGC
-AGATGTAAAGGTTTTACACGTAGGCTTTTCCAGATCTCAGCTTCTGAAAGGCGGAGGGAC
-CGTTTGGACGGGAGCAGGGCCTCCTCTTCCAAGCACCCTGTGCCTTTAAGAGTCGCCCCC
-TCCCTCCAGGGATGCTCCAATTTCTTTCTCCCCACCACCCCCACCCCGCCCCCCGCGCCG
-CGGAGCCGCACCTCGGTCCTTCCTCCCCGCCCCACACCCTCAAGCTCGGCTCTTGGCCTT
-CGCTCGTCCAGAAGTGGGTGAGCTGTACCGCCAGAGGCGCATTCTCCTAGCCCCAAACCA
-TGCCCGCTACGCCCCAGCGGAATGCCACCTTAAAGACCCTAATCCGGGCACCTCCCAGCT
-CCTGCTTCCCAAGGGCGAGGCCTCAGCGCCCCCTCCCATCGCCCATGCTCACGACGCCGT
-GAAGGTGACCTCCCCCAGGGGCGGCACACGCCCAGTGGTGCCCGAACTGGCTCACACGTG
-GTGAGCCGGGAGCGCGCGGCCCCTCCCCGCCACGCGCCTCGTGCCGGCCACCCGGCCACG
-CCCCCAGGACTGGCTCCGCCCCGTGCCCCTGCACGCTTCTCCAGGCTTGGGTGGGGCGAC
-GCGCCCAAGTCGGGCACCGGGCAGGCTACGGGGTGGGGTAGGACCTGGGAATGGCGCACC
-CACGCATCCTCGAATGTCGCCTGCGGTTTGTGAAAAGCGGGAAGTCCGCCCAGCTCAGGA
-CCTTTGGCTGGCAGGCGAGGTGCCCCGCGGCCCTTGGTGCTGAGCAGGGGAGAGACAGCT
-GGGACCGCGAGCCTGGGAATCGAATCCTAGTCTGCGTGTCCTCGGTGCTTCCTATTTGGA
-AACTGGGCATCATATTATCATATTCCCTTCTCCCTCCGGATTCTTATGGAGCTTCGAACG
-AGATTAAATATACATATATATGAGAAAGGGATTTGTTCACTAGGTCCAAAAGCATTTGCT
-GGTCCCATATGTGGTCGGACCCTGTGTGTAGTAGGCGGGGGGCAACATCTACGACAACCT
-GAGTTCGTCCCCTTAAGAAGCTTTCCTGAGTCTTGGGCCCCCCAAATTCTCTTCTGGGAT
-GGTCCGAAAAGACGTCCCTGAAAGAGGAAAGGGCGGAAATCCTACCTGACGGCAGGTGTC
-TCGGAATGAGCTAAAATTTAAAAGGCAACGCGGGGCAGGGACAAGCGTCCAGCGTCAGAT
-GGAAGCAGGCTCGCGTCCCCTACCCTTCCTCCAACCCCTAACCTAAGAAAAGAAACCGAT
-CTCGCCGGTCTCCCCCAATCCTAGCCGCGAGACCGCCCAGCCCCGCAGCCCGAGCCCCGC
-CCCGCTCCGGCGGCCAGCGATTGGGAGATGCAAATACCGGCTTCTCTGCCCAGCAACGGG
-TGACGCGGCGCCCGAGCGCGAGGCGGGGCCCGGCCGCAGCCCAAGCGGGCACCTCGGTGT
-TTACAcggggcggccccgcgcgcgccgcagcggcccgcagacggcgagggggaggggtgg
-tgcgcgcgccggcggggccgcgcggggAGAAAGACACTGAAAGGCGTcggcggccgggcg
-gggagcggcgcgcgcgggccgcggcggAGCCAGAGGCTGCAGGAAGAGCCCGCGGGGGCC
-CGGAGGGTGCGATTCCTCGGCCCCCGCAAAACAATGTGTGTTGTGAGCCAGGACGCAACT
-TGCCGGAGGCGGCGGGGGCGCGCCGAGCCCGCCTGAGACCGCGCTGACCTTCTCCCCCCG
-CCGTCCGTTGGGCCCGAGCGCCCAGCTCCTCGCTCCCCAGTTcgcgggggccgggccgag
-ccgcggggcggggccgccccTCCGTCGCCGCTGCCTCCTCCCCCACCCCCAGCCGCGGAG
-GATGCGGACGGCCCCCGGCGGCGTCTAGCGGCCCCGGGCCCAGGCGCGATGGTGCAGCAG
-CGGGGCGCGAGGGCCAAGCGGGAcggcgggccgccgcccccgggacccgggccggccgag
-gagggggcgcgcgagcccggcTGGTGCAAGACCCCGAGCGGCCACATCAAGAGGCCGATG
-AACGCATTCATGGTGTGGTCGCAGCACGAACGGCGGAAGATCATGGACCAGTGGCCCGAC
-ATGCACAACGCCGAGATCTCCAAGCGCCTGGGCCGCCGCTGGCAGCTGCTGCAGGACTCG
-GAGAAGATCCCGTTCGTGCGGGAGGCGGAGCGGCTGCGGCTCAAGCACATGGCGGATTAC
-CCGGACTACAAGTACCGGCCGCGCAAAAAGAGCAAgggggcgcccgccaaggcgcggccc
-cgcccccccggTGGTAGCGGTGGCGGCAGCCGGCTCAAGCCCGGGCCGCAGCTGCCTGGC
-CGCGGGGGCCGCCGAGCAGCGGGAGGGCCTTTggggggcggggcggcggcgcccgAGGAC
-GACGATGAAGACGACGACGAGGAGCTGCTGGAAGTGCGCCTGGTCGAGACCCCGGGGCGG
-GAGCTGTGGAGGATGGTCCCGGCGGGACGGGCCGCTCGGGGACAAGCGGAGCGCGCCCAA
-GGGCCGTCGGGCGAgggggcggccgccgccgccgccgccTCCCCGACACCGTCggaggac
-gaggagccggaggaagaggaggaggaggCGGCAGCGGCTGAGGAAGGTGAAGAGGAGACG
-GTGGCGTCGGGGGAGGAGTCGCTGGGCTTTCTGTCCAGGCTGCCCCCTGGCCCGGCCGGC
-CTGGACTGCAGCGCCCTGGATCGCGACCCGGACCTGCAGCCTCCCTCGGGCACGTCGCAC
-TTCGAGTTCCCGGACTACTGCACCCCCGAGGTTACCGAGATGATCGCGGGGGACTGGCGC
-CCGTCTAGCATCGCAGACCTGGTTTTCACCTACTGAGCCCACCGTCAGCGGGGCGCGCAC
-GCCCCCAAACCAGCTGTTTACATACAGGAATCAGGTATTGGGGCCCCTCGGAGGCCGAGG
-CTGGCACCCCATCTCCCGCGCAGCCTGCCCCCTCCTGGACGTGCCCATCCCCCCTCAGAT
-CCAGACATGCCCCTCCCCCGCAGACACACCCCAAGGCAGCCCAACCCCCACCCCTTCCCC
-GACACCCAAGCCCCTCCCCACGTCGCCCCCTCCTGCACAGCCACCAGCAGCCAGCCCCCT
-CCGATACACCTCCCGTCCTCTCCTACAGACCTGCACCCCTCCCCCCTTTTGCACACGCCC
-CTCCTCGTGGCCGGAGGACCCGCCCCCTCCTTTGCTCCGGAATCTCTCCTCCCTCGCCCG
-GCCCGCCTTCTCTGGGTTAGGGGGGCGATGCGGCCGGGTGGCAACGCACGCGCCTCCTGC
-GCCCCTCCCTTCCCTGGGGGGAGGGGCGCACCCCTTTTATCCCCGGAGCGCTAGGGCCCG
-CCCCTCCGCTGGGGCCCACCCCCTTCGTGCGCATGCTTAATGCTTCTGGGGAGGAGGGGG
-CTGGTCCCAGCGGAGCCGCACTCTTCGCCCGCTCCGGGCAAAAGCGGGGGCGAGTGTAGA
-GCGATCCTGGGAAATCCTTTGATCCGGGAGCCCTAGGTTTCCTCTCCAGCCAACGGGGCG
-TCGCTGCCTTAATGGGAGGAGCACTCGGAAGGGTTGGTTTGGGCCTGAAACTCTCCCAAG
-TGGCATAGCCCCTTTTCCGGTATGGGGTCTCCTACACCCACGCGCACCACCTCTCCGGTC
-GCGTGGCTGCCTCTACAGCCTACCTATACGTCCCTTTTTCCCCCCAACTGGGAATTGAGA
-GGTAAGGTCTTTCTCTGGAAATCCAGCAGTAGAGGAAGGGACCACCCAAGAAAACTAAAA
-ACCAAGGCACCTTACCAGTCTGTCTGGGGACAGGATCCCTGCTGCACCTTCCCCACCCCC
-TCCTGGGAAGTGCCCCCTCACCTCAGGGCACCCGCAACCTGGGCTCCTCCCTGAGCGCAC
-CGGCCCTTCCTGTCACCCAGGTCCACCCTCAGTACTCAAGCTGCAGTATACAGCGGGAAA
-AACTGAGGCACTTTGGTGCTAGGGGTTTGGGACTGAGGCGTGGAGAGCAGATGTGATGGC
-AGGAAGACTCTCGCTTTTAAACATCTGGTTTGGGAGAGACCATCGACTTGGCCAGTGAGA
-CTGAGAATGGATTCCGAGTAGTGATGGGCCGTTTGCACCTCGGTTTTTCCACGTGAGAAA
-TGGGGAGAACGCTGCTGTTAGGAGGAAGTTGTGTCCAGTTCAGGGTGCCCTCGGGAGCCC
-TGTCCCTGTTGCTGTGGCCCCTCTCACGCCGCCATCTCTCTGCCCCGCCCCGCCCCTCCG
-GCCTCCCCACACCCCCCTTGCCCTCACTACCTGTATCTCACCGGCGTGTGTTCACCCTCC
-CGGGTGGCTCACACACTCTCATTCACACACACAAATCTCAGGAACAAACGGTCCCAGAGT
-CCTCCGGACCCCTGCCCAGGGTCTCTGCAGGTCTCTGCCCCACGCGTTCCCGTCGCTGAC
-AAAGCCACCAGCTGCCTCCTTTAAGCTTGGTGCTCCGGCTCTGGGCCTTTCTTGCGCTCT
-AttttttttttttttttttttAAGAAAAACAACAACAACAAAAAAAGACAATGAAAAAAA
-AAACGTCATGTGAGTGAAGAGATGTCACTGTCTGTGGTCTTGGAGAACTAGTCTCGTAGC
-TGAGGGGTGGGGTCCCTCTGTCTGGGGCACTGGCACCCACAGCAGGACTCCGCCAGTCTG
-ATGCCAGGACTGAATAAAGTGTATTTGCCCCGACCTTGCCCTGTGGTTCTGCATGTCTGT
-GCTCTTCCTCAACCCTCCCTAAACAGTTTGCCAGATTCAAGTCCGTGTGATTTGGGCCCG
-AGCTGGGTGTCCCAGGGCAAGCCACCTTGCCTGTCTAGGCCTCTATGTCAGGACTCCCTG
-GCCTTCATGaagaatagcaaactcatccctgtagggaccaggcaggtaacatagacgagt
-gactctgggtggacagtggtgtcatgacccacttcaaggggcctacctcctgccagttgt
-gaccctgtgggaatgcagtccacagtggccaggtggccagatttttcaagaaaagctgga
-tggatgtttctgagtcatcttaatttcaaaatgagactcatattttaaaatttctgtggg
-ccaaatgaaacaagtatgcaggcaggtctggtccgagggGGCTGGCTTGGCCATGCCTTT
-CTGTGCCTTTAATGAGgactaagaagcaagattgggccacactgtctggactcaaagccc
-agctccaccactgagcacccgtgtgactctttccatatgtataacgtggggataataata
-atagctgcttcacaggatGAAATGAAGTTTGAGGTGAGAAGCATTCACCATGGTGCCCAT
-CGTGTTACTCCATTGTCAGAGGAGGAAACGGGGTCAGGCAGGAAAGCAACTTAAAGGAGG
-GCCTGCAAGCAGCCAGGGTCAGAGACAGGGCTTGGTTCTGCTTCCTGGTGAAGCATGGCT
-TCGGGGTGCTGCCTCTCCCTCCCTGTTTGAATCTGCAGATTGTGTTAGGCCCCCAGCTGA
-GGGCCTGGAGTGGTGGGATTGGTCCCAGTGCCTGGCGCACATTGGCCTGCAGAGTAGATT
-AACTGAATGACCAAAGAGCAACAGAAGTCTAGTGATTCTTGTCTTTGAGGTTCTGACTGG
-TGTTTTACAACTGAGTCCAAGGCTTTTCCCTCCTTTGTCCCTCTGACACCCCTCCCCCTA
-ATTCTCATCTGTCAGATCCAGTGTATTCCTAAGCTGGGACAAAGCCTCTGTTTTCCCAGT
-AGGAGCCAGGGCTGAGTGTGGAAATTACAGTGACTGCTTCTTCTCAGCTTCTCTGGTTGA
-AAGCAAGCTGGCGAAGTAAGAGGAGGTAGAGTTGAGAAGGTGTGGAAGATAGGGACAGCT
-GCCCCCAGAACTCCCTTCAAGGGAGGACTTccccagctatgggaagtgccatcagggtgg
-ccgcagctgcagagagccacttcacctgagaccacgcccttcctggggcagcctgtatct
-ggtgtctgagtgaggcatggtataaacacctggtcatttcaatccaacatgggacggaca
-ctgacagacagtactcccagcaggcccaggccagccagggcttcgtcaggcctgcagcac
-aatttgacttcctatgcccaggcctgcttcctcttcttcctcttcttttcacaggtgctt
-attcctaataaacatcttgcaacccaaactcagtctcattgtctgtttctagagaaaccc
-agtctacaacaGAGGGTTCAAGAGACTGGACAAAGGGAATTGGGTCAGTGGCCCAGCAAC
-TGCAGCTAGGCCGGTCGGATGTATCCTAATGTCAAGAGTCTGTTCACCGATGCCATCAGC
-ACCAAACTAGGGGCTGCACACTTTCCTAGTCTGCACACCAGTCACGTCAATTAGAGACTC
-CAGCCTCAGCCCGAAGGCCTTCCAGGGCCCCCTGCTGATGCCATTCTCACTGCCAGTCCG
-TCCCCTGGTAAAAGCAGGTGGGAGGGAGGTCGTCATCTGAGTTTGTCTTACAGAATAGCC
-TGGAATGGGGTGCACGGTAAAATGCCTGACCGGAGATAATGCTAGAgctgtggaaccttg
-ggcaagcctcttcccctttgtgggcTGTACTGGGAGTCGGTAATAGGACTAGAAGAGGGA
-CCATCTCATTTTGGTTCCTTCCATTTCAGATGCTGACCTGAAAGGTCGGGGAGACAGCTC
-CTTATGGGGTCTCTGGGGCCACCTAGTGGCTAAGAGGAGTAGAACCAAGGTTCTGTGCAG
-TTGGGAGGTGGGAGTCGGGGTGTGTCCCAGGCCAAGGAACTGAGTCCCACTCGAGTCTCA
-CTCCATTCATGCATTGACTCATTGCTGGGTCATGCCCCTTGCCTGGGTGGTGTGAGCCAC
-CCTGCTTCCAAGGCTTTCAAAACACCATACGCTGAtgtattgtttctcatctattgctgc
-gtaacaaattgccacaagcttagcagtgtaaaacaacatgcatttgttatttcagtctcc
-atgcatcaggagtccagcatgccttagctgggtctctgctcaggatctcacaaggcagca
-gctggggtgctggtggcccgcattccttcttggagctcagcagccttttccaagctctca
-cggtagtgggcagaattcagttctttgtgcttataggacagagatccctgttctattgct
-ggctgtcagttagtaccactcttgattactacaagctgctcagtttcttgccacatggcc
-cccacagggcctccccagccttctcacaatattgcaacttattttgtcaaggccagagga
-gaatttttctgctgcttggagtcacttggctcagggaaggtttaagctctcttttaaaag
-cctctcctggctgggcatggtgtgttcatgcctgtaatcccagcactttgggaggccaag
-gtgggtggatcacctgaggtcagcagttcgagaccagcctggccaaatggtgaaacccct
-tctctactaaaaatacaaaaattagcctggcgtggtggcagtcgcctgtaatcccagcta
-cttgggaggctgaggcaggagaatcactcgaacctgggaggcggaggttgcagtgagcca
-agaccaagccactgcacttcagcctgggcgacagagcaagactctgtctcaaaaaaaaaa
-aaagaaaaaaaaggaaaaagagagagagaaaaaaaaagccttccctaattaggtcagact
-cacccaggaaaatctcctttttgattaggcatcaactaatgtgggattttatatctgcaa
-aaaatcccttcacctttgcagtatattgtagccttataagagtgacagctgtcatactag
-atttgcccacactcaaaagggaggaggctgtctagggcagctacaccagagactgggaat
-cttgggggccatcttagaattctgcttatcacacacctgtaatcccagcacttcgggagg
-ccaaggtgggaggatttcttgagtccaggagttcaagaccaacctggccaacatagcaag
-acctaatctctagtaaagttttttttaaaaaaattagccaggcacggtggtacacacctg
-tagtctcagctacttgggaagctgaagtaTCATAgctgagaattctcaggtctacatctc
-catcccagacatgactagactagctgccttcttgtcatctccactgatatatctaattgg
-cacctcaaactggacatgccaaaaaatgaactgtttccacagtgctcccaagcctgcttc
-cacagaccacatctgcacagctgatgtgaaatgaaaggctaaagcctctcagttatcctt
-gatgcctcttttcctcccagcgccatctcccttataccctgttggctctaccttcaaaat
-atgccctgtgtcttgtcacttctcacatcttccatggcctctgggtccaggatataaggg
-catacgaagggctccttgcgttttcctttgccccactcatagtcttattgtccacacagc
-agccggagtgatctggttaaactgtaaatcccagcacaccctgccactgttcaaaattct
-ccaaagactctcattcagtagaagccagagtcctcagcatggcctgcaaagccccataag
-aagtagcctgtggctcagcctcggcttcatcttctactttttctgtttctcacatgccca
-gtcacactggtcttgctgttcctcaaaagtgccaatcacacttccgcctgaaggcttttg
-cacatgcttttccctctgcttaagatacccttcctccggctgggcgaggtggctcacgct
-tctaatcctagcactttgggaggtccaggtgggtggatcacctgaagtcaggagttcgag
-accagcctggccaacatggcgaaaccccttctctactaaaaatacaaaattagctgggcg
-tggtgacacatgcctgcagtcccagttactcaggaggctgagacaggagaatcacttgaa
-tccaggaagcagaggctgcagtgagctgagatcgcatcactgcactccagcctgggcaag
-acaaagcgagacttcacctcaaaaaacaaacaaaaaaatacccttcctccagatagccac
-atgtcttacttccttcaggtctcagctcccagggcgccctagagtaggcacagggagtac
-ctcacagtgtcctccctgaccatccatataaagtaacatcctccataaactatcctgtta
-ctttgctttatttttctgaatagcatttatcactatctggcatttatcacctgtagtttt
-tactttttgtctctctctctctaatttgtatgtaagcttcataaggaaggaatgactctg
-GACTGGACTCCATGCCTCAGCACATTCACCCACCCATTCAACAAACATTCTTAAGGGTCT
-Aggctgggcatggtggctcatgcctgtaatcccagcactatgggaggccgaggtgggagg
-atcacttgaagccaggagtttgagaccagcctgggcaaggaaacaagaccctgcctctaa
-aaaatacaatttaaaaaagtatccaggcacagtggcgtgagcctatagtcccagctactc
-gggaggctgagctgggaagatctcttgtgcccaggagttcaaggctgcagtgagccatgg
-tcatgccactacactccagcctgggtgacagagttagaccctgcctgtaaaaaaaaaaaG
-GTGGGGGGCAGGGTGGGgaaggtttgccttgaccaggccgcgtgctaggtgccgggcata
-caaaagtgaaaaacgtgatttgtcctcagtgagctcacaggtctgaggagacacataaac
-ccaggaatggaaatgctttgctggcgatggacagtgagtctgggagaacattgaggagat
-gtttaacccagacaatggagtggggtgtggtcaggtcattccctggaggaggtgatgttt
-aagctgtggcatgaaacctcagtaggatgtgatgaccttagaacatggctacacgttctt
-tgacattcctcctttaaattaccttccctttgaatctgggctgggccttcatgatccatt
-tgtaaccaacaggacacagcagacatggtgctgcaggatttccaaggctaagtcacgctg
-aaccgccatgttgaaaggccaacagccaagactgccatgtggagaagcagcccgggccac
-gtgggaagaccatgtgtaggtagctgctccagttgacagctgagcccaggcaccagactt
-atgagttgagaagcttccaggggattccagcccctcataattcaactcactcccagctgt
-tggagggccttcccagcagaggcccagccatcacagagcagagacaagccatcccttcta
-tatcctgtctgaattcctgacccagagtccacgaacataatgagatggcagttgtccaca
-ctattaggttttggggcagtttgttatgaaggaataactggaacaataggataaggaaga
-gtgaggtgaaggaaaggactttacagatgccagcaacagtacatgggaagacctggtaag
-agtggctgacacagaagctaaccagcttgcggggaaggtgtggagagaggagggtgacag
-gcaagagtgagaaggaCCTTGAAGGTATTTGGACTTTATCCCGAGTCTTCACACTGCAGC
-CCAAGGGGTCAAGGAGTCtttttttttgtatggtaaacatggggtcttgctatgttgccc
-aggctggtcacaaactcctggcctccagagatcctcctgccttggcctcctaaagtgctg
-aaattacaggtgtgagacactgtgcccagccTCCAAGGGGtcttctcttttttttgagac
-cgcgtctcgctctattgcccaggctggagtgcaatggcgcaatctcagctcactgcaatc
-tccgcctcctaggttcaagcgattctcctgcctcagcctcctgagtagctgggactacag
-gcatatgccaccacacctggataatttttgtatttttagtagagacagggttttaccatg
-ttggtcaggctggtcttgaactccttacctcatatgatctgcccacctcatcctcccaaa
-gtgctgggattacaggcgtgagccaccatgcccagccGGggtcctttgaaaacacaaacc
-tgaccactgctgtaaacctttcgatggccccttactaccctcaggataaaCTCTTGAAAT
-TCAAGGCATTTTGCAGTTGACTCCCTCACTCTTTTATAGATTTATCTTCGGTCACTTTAT
-CCTCAGCTACGCCAGGCCACTCTCCAGTGACAATGCTTCCCGCCTCACCCATGCTATTTA
-TCTTTGCTCATGTGGAGGAATTAgtgggactttgggctaatcaccttgcctttcgaggcc
-tcagtttccccatctgtatgattaggtggttggactagaagtttttgttttgttttgttt
-ttgtttttgtttttttgagaccgagtttcactctgtcgcccaggctggagtgcagtgctg
-tgatctcggctcactgcaacctctgcctcccgggttcaagtgatttttctgcctcagcct
-cccaagtgactgggattacaggcatgcaccaccaggcccaggtaatttttttgcattttt
-agtagaaacagggtttcaccatgttggccaggctggtcttgaactcctgacctcaagtga
-tccacctgcctcggcctctcaaagtgctgggattacaggtgtgagccacgacacccagcc
-ttagatgtctcttaagagcatatctagcctggcattctaggagtctatgaAAAGGAGGGA
-GAAAGGTGTCTGTAGCCAAACCTGCCTGTCTGGCTTCTTCTAGGTTGCCTAGCAATGGAT
-GCCAACCCTCTCCCCCATCCTTGGGGGTTTCTTAGCAACCCAGTTTCTCACCCTCTGCTG
-TTTTCAGGGTTTCCTTTTAACTAAATGTCAAGTTTTGCTCTTTCTCCTCCAGAAAACCTG
-AGGCCAAGGGTCTCTGTGTAGAGCTGGATACAACCCAGAATACACAGAGACCTGGGTTTG
-AGGTCAGTGGAGGATTTGCTGTGTGACTTGGAGGTCTTTGACCTCTCTGGCTTTCATTTC
-AGACTGTGATTCCCTGTCATATGCTCCTCAGAGttcttcttcttttcttcttcttcttct
-ttcctcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttc
-ttcttcttctcttcttctttcttcttcttcttctttcttttcttcttcttcctcttcctc
-ttcttcttcttcttcttctcctcctcctcctcctcctcctcctcctccttctccttcctt
-ctttcttcttcttcttcttcttttgttttttgagacctagtctcactctgtcgcccaggc
-tggagtgcagtggggcgatcccggctcactgcaacctccgcctccctggtacaagcagtt
-ctcctgcctcagcctcccaagtagctgggattacaggtgcacgccaccatgcccagctaa
-ttttgtatttttagtagacacagggtttcactatgttagccaggctgatctcgaactccc
-aaactttgggattacaagcatgagccactgtgcccagccTGttcttttctattttttgag
-atggagtctcactctgtcacttaggctggagtacagtggcacaatctcagctcactgcaa
-catccacctcccaagttcaaacgatttttctgcctcagccaccaaagtaagctgggatta
-taggtgaacaccaccacaccgggctaattttttgtattatttggtagagacgggttttca
-ccgtgttacccaggctggtctcagactcctgacctcaagtgatccgccagcatcagcctc
-ccaaagtgctgggattacaggcatgagccactgtgcccagccctctgtattgttctgatt
-ttagtatatgtgtgctgaaatgagcacTTCCCTCTTCTCTTGTATGCGTTTGGTTTGACT
-ACCAAATTTattcacttttgcaataaaccgtcactgagcacctactatgttccaggcact
-gtcttaaggactggggattcgtcagtgaataaagcagacatagtcccttccctcacagag
-cttatactctagtagatggaaacgtataatgaataaacagataagtgcacataatgatat
-catgcagtgaAGGGGACAAAGTGTAAGGAAGGGCTACTATTTTAGATGAGGAGGTTGTAT
-CAGTCAAGATGGGCTAGGGaagtcagagatggttgggaagaaaaagcctggcttccccct
-ttctccctccaacttcctgtgggtgcctcaccttgggtgacctcagctagaggccagctg
-acaaaggaggctgagtagcttccaggggtcagctctgcaaagcaggaaagagcaaggaat
-ccactggaagcaagaaggcCCAAAAGTACCTTGGGAGGTACGCCGCTTTTTCAGCTCACT
-CACTGCCTGTAAACTGTCAGGGACCCTAGGATCATTAAAAAATATTTTGAGggccgggcg
-tggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggatcacttgag
-gtcgggagatcgagaccagcctgaccaacatggagaaaccccatctctactaaaaataca
-aaattagccaggcgtggtggtgtgtgcctgtaatcccagctactcgggaggctgaggcag
-gagaatcacttgaacccaggagacagaggttgcagtgagctgagatcacaccattgcact
-ccaccctgggcaacaggagcgaaactctgtctcTCTCTCTCTCTCTCTCTCTATCTATAT
-ATATATAGATAGAGAGAGAGAGAGAGAgtagtaaaatacagatagcataacatttaccat
-cttaaccatctttaggtgtacaactcactggatattaagtatagtcacattgttgtgcaa
-ccatcaccatcatccatcttgagaactcttcatcgtgcaaaactgaagttctggatccac
-tatgcactaactctccatttccccctccccctagctcttagcaaccaccattctgctttc
-tatatgtatgaatttgactatggtatatgtctcatataagcagaatcatacagtgtttac
-ttttcgtgactggtctatttcacttcacatcatgtcctcaaggtttatccattgcagcat
-gtatcagaatttccttctttttaaagctgagtaatattctattgcatgtgtatatcacat
-cttgcttatccattcatctgttgatagacacttgggttgcttccaccttttagctattga
-gaataatgttgctatgaaaatgggtttggaaatttctcttcaagatacactgctttcagt
-tcttttttttttctctctgagacagtctcactctattgcccaggctggagtgcagtggca
-caatctccgctcactgcaacctccacttcctgggtccaagcaattctcctgcctcagcct
-cccgagtagctgggattacaggctcacaccaccgcacctgatgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtctgtgtgtgtttagtagggatgaggctttgccatgtttgtca
-ggctgctctcaaattcctgatctcaggtgatccgcctgcctttgcctcccaaagtgctgg
-gattacaggagtgagccaccacccctggcttcagttctttggggtatataactagaagta
-aaattgccagatcatgtggtaattctatttttactttttcaaggaatcactatgtgtttt
-ccatagcatctgcaccatttttcattgttatcaacaattcacagggttccagtttccccc
-tatccttgccaaaacttgttattctgttttgttttatggtagtcatcctaatgggtatga
-agtgACTAGGATCATTTTGAGACCCAAACAGTCACAGGCTTTTTTGTTGTtgttgcccag
-gctggagtgcagtggtgcaatcatagttgaccgcagcctcaacctccttgggctcaggtg
-aacctcccacctcaggctcccaaggagctgggactacaggcacacaccaccacatccagc
-taatttttgtgtattttgtagagacagggttttgccatgttgaccaggctagtcttgaat
-tcctgggctcaagcaatccacctgcctccagcctcccaaagtgctaggattataggcACC
-CAGCTTCATAGGctttttagcccaggcttgtgatttctttgtcagtataattctctgaaa
-aacttaggtttctggcagggggcagtggctcacgcctgtaatcccagcactttgggaggc
-cgaggcggacggatcacctaaggttagaagttcgacaccagcctgaccaacagggtgaaa
-ccccatctctaccaaatacaaaaaattagccaggcatggtagcatatgcctgtaatccca
-gctacttgggaggcggaagcaggagaatcacttgaacccaggaggtggaggttgcagtga
-gccaagattgtgccattgcactctagcctgggcaacaagagtgaaactccatctcaaaaa
-aaatcttaggtttcttatcgatttgactgtagttaatggtactaaaaccatacccacaat
-acttttcaatataTTGTCCTCAAGTCTGCTTTTTCCCTTTGCTTTCTATCCTAAAGCTGT
-CACTCTCAATGTAATGGCAATTAGCAAGAATAACAGGTGGCAGAGTTGCACCTCTAAAGT
-GATCTTGGCTCTGAGAGTTTTTACAGGACATTTTTCACTCAAAGCCTTTTAAAAATCCAA
-TCTCATACTTTAGTTGATTCTAGCCTTGAAGTACTTTAATTGATAAAAAAGAAAGTTCAT
-AAGGTCATTGGGAAGATTAATTATCCCAGCATATAGTAAATGCTCTATAAATGATACCCA
-TCTTTGTCACttttttttttttttttgagacggagtctcactctgtcgccaggctggagt
-ggcacaatcttgtattactgcaacctccgcctcctgggttcaagcaattctcctgcctca
-gcctcccaagcgagtagctgggactacaggcagcatgctgccactcccggctaatttttt
-ttttttttttttttcagtagagctggggtttcaccatattttctttctttctttctttct
-tttctttctttctttctttctctttcttttcttttcttttctttttctttctttcttttc
-ttctcagagtctctctctgtcacccaggctggagtgcagtggcatgatcttggctcactg
-caacctctacttcaagtgattctcctgcctcagcctcaagagtagctgggactacaggca
-tgtaccaccatgtccagataatttttgtatttttagtagagacagagtttcaccacgttg
-gccaggctggtctcaaactcctgacctcaagtgatccacccacctcagcctcccaaagtg
-ctgggatcacaggtgtgagccaccatgcctggACAAATTTTCCTATTTCTTAATAGATAA
-TCCATCTTGTTTTTCTCAAAAGTAGACAGTTTATCAGGTGTCGTGTCTCTCACCTTCCCA
-CCCTACTCACCTATAAACTAATATAACAATAACAGTaacaataaccataatttgctgagt
-tctaattttgttccaggtactttggataagtgtcttatatgcacatctcatttcactctt
-tcaacccctctgagaggcaagtacttaaattatcttcattttacagtcagggaaactgag
-gcacagagtgtttaaatcatgtaagcagtaagtagtggagctaagattcaaacgcagatc
-tgctggactccagagttcAACTTACAGACACTACATTGTGGCTCTTCTTGGTGGCCCCCT
-CCCCTCCTCCCCAGGCTCTCAGAGGATACAGGATCCCTCCTTTGCTAGTCAAGGCCAGCC
-CATCCCCCTGTATATTTGACTTCATCTCTTCCCACTGCCCCAGGATTTCATCCACCCCTG
-CTCTGATATCAGGGGCCCCCTCCCCTTCTGTCCATGGTGTGGGGCTTTTTGCACTTcaca
-cacacacacacacaggtgcacatacatacacacCCCTTCTCCAAACCACTCCACAAAGGG
-CCCCTGCCTCCTCActttcttgccttccacatcacaccctaaattctcctggccaaggtt
-cccactgacctccttgttgccaaacctaagtcctgttgtcccgctgtgtgtctcttatgc
-acttggcaaggctgagcaggtccttcttggaaatgtgtttctttggtttctatgacacAA
-TGCACCCCCACTCCAAAACACACATACACACATCCCAGATTCTTGCCCCCACCCACCACC
-ACCCGCTATCTCTCTAGATGCTTCTGTGGTTCTTTCTCCTCCTCTGACCTCTTCAAATGT
-AGtatggtggttttaaaacatgtccataatttttttttttttttttgagatagagtctca
-ctttgttgcccgagctggatacagtggtgcgatcaggtgcgtgccaccatgctcagctaa
-ttttttttaacttttaagttttttggagagataggggctccctgtgttgaccaagctggt
-ctcgagctcctgggctcaagcgatcctcccatcttggcctcccaaagtgctaggattaca
-gacttcagccatcgtgcccaaccatgtctataaattctttaagactcctcccactgagta
-acagagtctgtttcttccccttgaatctgagccaaacttagtgactcagactacagtaga
-aatgattctatggtgacttgtgaggctgggtcataaaggcaatgtggcctgactcatggg
-agtcctgagctacagtgtaagaggtgtcaacactctcagctgccatgctgtgaggaagcc
-caactggctcatgcagagagacaacatggagaggccttgaggctatatgaagagagatgc
-ttggccagctcccagctgctccagctccccagtgctccggcttccactgtaaccacaaaa
-gagacaccaaggcagaaccacccagatgagcccttcccaaattcctgacccacagaaatt
-gtgaaagatgataaaaatcattggatttggagtggtctgttatgcagccatagacagcca
-aACAGAGGCAtcttaatctgcttgggctactataacaatttagcatggagcaggtggctt
-gacaacacacatttattcctcaggtctgcagggtgaagagtctaagatcaaggtgctggc
-aaattccattctgctggcaaccaagggcctgacttctggtgtacagacgaccatcctatt
-gtagccccaaatggcacagagaagaagcaagctctcaagtctcctcttatcaggctgtaa
-tccctcccaaaggcccacttccaaataacatcaccttaggacttcaacatatgaatatga
-gggagatacaaacattcagtctgcagcaGAGGGCTTCGTTAGAGCTCTGACCTGAGCACG
-CTTCATCTCAATGTCAttgtttttgccagctctacatccactgccctttttttttttttt
-tttttttttttttttttttgagacagagtctcactcttatcacccaggctacggtgcagt
-ggcacgatcttggctcactgcaacctccgcctcccagcttcaagtgattctcctgcctca
-gcctccggagtagctgggactacaggtgcatgccaccacacccggctgatttttgtattt
-ttagtagagacagggtttcaccatgttggtcaggctggtctcaaactcctgaccttgtga
-tccacctgcctcagcctcccaaagtgctgggattacaggcatgagccactgggcctggcc
-ccactgccctttcttacagtaacagtatttcaatttccctttagggaagctcttcaagca
-ggttctcagtccaagaggtttctctgggttaagcactgccagccacccaaagggtgagca
-agtaaccagccaatcagagacactccagtgggttcagtaaatgacatattatctaactgg
-ggtgaggggaatcaacatcagggcttttcctgagactataaggagaaacagattcttttc
-ccagcagttaaatttgaagtctgtggccattttgctaccatatagggaaaatctgcctga
-cattgaagccaacacagatgagggaagagccaagagataaagagaaagatcctgagcatc
-tggatacagccatgcctgaagccagtatcccttgacttctcaattatgtgagcctttata
-ttccctttgtttaaagccagttcaagttTAAAACTGCCATTTCCAGTGAGAACAATTCCC
-TATGTTGTATCTAAGGCCAAGACCTTGCCCCTGACTCTAGGCCAGAATGTCCTGTACAGT
-GCCATTCAACTCTGCCAAAAGCAAAGGGCATCAACTTCTCCACAACCTGGCTTTCCCTCA
-TCTATTTTACATCTCTGTTAATGGGAGCATCACCCACCTGACCTATAAACATAAAAGTCA
-GCCTCTATCctctctgtctctctccctctctctgtctctctctctctctctcAATCCCTG
-TCACTTCCCTTACTTCTTAGTAACCAAGTTCTGCCAACTTAACTTTATGGACATTTTTCA
-CACCTGCACCCTCCTTTCCATTTTTCCTGCCCACTCCAATTCTTCATCATTTCTCACCTA
-AATTTTTACAAAATCAATAGATAACTAACATAGAGGTGTATAGTAAAAAGTGAATTTCgg
-ccgggcacagtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcagatc
-atgaggtcaggagatagagaccatcctggccaacatggtgaaacctcatctgtactaaaa
-atacaaaaaaaaattagctgggcatggtggcatgtgcttgtagtcccagctactggggag
-gctgaggcaggagaatcgcttgaacccgggaggcggaggttgcagtgagctgagatcgca
-ccactgccctccagcctggtgacagagcgagactccatctcaaaaaaaaaaaaaaaaaGT
-GAATTTCATTCCCACCCTTGCCATCAGTTACCCTCCCCCAAGGCATCTACTGTTACCTCT
-TTCTTGTCTATTTTCCCAGAAGTTCTCTATATGTGCCATCTTTTTGAGAATTTcaaatgg
-aggcatactatcaagacttttcagaacactgcatccttcttcacttgaagtgtgattaat
-ataaataattatagactaatttcttctttctaatggatgcatagtattccacaaagacat
-ataatgtacataactcgtcttccattgatggatatttaagtggtgtcccagttatctgtt
-agcacagaacaaaaccccccaaacctagtggtataacacaataaccacttgaatatgctt
-gtgggttctgtgtgtcaggaattcaggcaggacacagtgaggccagcttgtttctactct
-gcaatgtttgagtcttcagctaggaagatttgaagatttgaaggctgaagctgattcaaa
-tggctggccactggaatcatcttgttcttccccttccccttcgccttctacagtgcaatg
-gcatgatgtcggctcactgcaacctctgcctcccgggttcaagcaattctcctgcctcat
-cctccctagtagctgggattacaggtgcacgccaccatgcccggctatttttgtattttt
-agtagagacggggttttgccatgtggccaggctggtctcgaactcctgaactcagggtat
-ccacccgccttggcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggcct
-catctggttcttcttcactcacttcttttatgcttgaactgggatgactcaaagctaagc
-ttagctgggactgtggtgccttcatgtgtcctctcctgatggtcttggcatcctgacagc
-atggcagcctctaagcagacatggagccctaggtaggcatggtgcctcaggctccaagag
-ctagagttctagcagaagttgcctgtacttttatgtctggaccttagaagtcagagtgtt
-acttccaccgtactccattggttgaagcagtcatcagctcacccaagattcagagagggt
-acaaggatcccacctctctacagaggagtgctaaagaatttgtagctatattttaaaacc
-accacaggttgtttccaatctgtagctattcctgtagttcattttacaggctaacatctc
-ttgaatgtcttcatttctctgcaccaggccaagacactgtcatctctgatctctttgctg
-atctcttgctgtcactcttgtgctcaacatgctgttctcttgacagcagccagaggtctt
-ttcagaatgaaaatcagatcacatcccacccctcttcataacccttccatggctccccac
-tacccttgggctgaagctcaaactccttaccttggcttatgaggccccacaaggtctcac
-ttctgcctgcctctccaatgccatctcctgtcacCATTTGGGGCCTTTAGTTTTGAGCTG
-CAAGAGTTCCTCCCATcacacacacacacatacacacacacacacacacttaaatgagta
-agtaaatagaacatacaaaacgcttaaacactttgcacatagtgagcataataagtttgc
-tactattATTAGACTGTCttcagtaaatatttactgggctgcctactcagtgccaagcac
-tatgggaggctcacagatacaacacgaacaagaAATATGTGGCCTTggccagacgcggtg
-gctcacgcttacaatcccagcactttgggaggccgaggcaggtggatcacttgagctcag
-gagttcaagaccagcctgggcatcatggcaaaaccctgtctctattaaaaatacaaaaaa
-ttagctaggcatggtagtgcgtgcctgtagtcccagctcctcaggcgactgaggtgggag
-gatcacctgagccttgggagatcgaggctgcagtgagccgtgatcatgccaccgcactcc
-agcctggacaacagagtgagacgctgtctcaaaaaaataaaaattaaaaaaaaagaaaaa
-GAAAAACTAAAAAGGAAGATGTGGCCCTATCTTGccgagctcattcttctgtgtgtcccc
-agcccctagcacaaggagaaacagaatagatgctcaaGACACAAAGGCATGTCTGTGCAA
-GGGTGCTTGAtgacggttggaggggcacaatgactttcccaagatcacacagcaaatgtg
-ggacaaaatcaagGCTGACAGCTCATGACAGGGTGGGAGGCAGATGCAGCTGCCTGGCAC
-AGGCTGGCTCTCCAGGGAGATGGGCAGTGGGCACGCATTGCCCAGGGCAGAACTGGGGCT
-AGGGGAGGAAACAACAAGGGAGGCTGTCATTAGCTCCTTCCAAAGTGGAGGTCACTTCTC
-TCCCAACCCCGAGTCCTCCACCCAAACTCCCTTCTCAAGGTACAAGGGCTGATCCCGTAC
-CAGGGATGGGTAGGGACTCAAAGAGGAAAAGAGGATGAAAAGAGGATGGGGACTGAGTGA
-GATGTGAGGACTCCAGAGGGATTAGCGGCTCTCAAGGCAAGTGGGAGGGGACTTCCCGGT
-AGGAGCCCGGAGACAGATGGGAGCCTGTGAAGAGGGCGGGGGCCCGGCGAGGAGAAGCGG
-TTTCTACGCTGGGGTGGGGCTCCATGAGGGGGATGGAGACCTGGAAAAGGGACTGACGGT
-GCAGCGAGGAGAGGAAGGCTCGGTTAAGGGATGGGTCTTCCACGGGAGGGGTGGGGAACT
-GCGGGAGTGACGGCAGCTTCGGTGAGGAGTCTGAGGGGCTGCGTGAGGGGCTGGGGCCCA
-GGGAGTCCGAGGGGTCTCTGTGAGGGCGCTGGGGTGTCCGAGCGAGCAGGGAACTCTGGA
-AGGGGACAGGAGCCGGGGGAGCTGCAGGCGGCCGCCGTCTGCAGAGCCAGGCCCTGAggc
-gggccggcgccccctcccccgccccgAACTGCGGCGCAGGCGCGAACCGGACCCGCCTTT
-GCTCGGCGGAGACAGCAGGCAGAGAGGTGAGCTTAGCCCTGCCCCACGCGCGGCCAGGCC
-CCAGCCCCAGCCCCTGGAGAACCCCCGCGCTCTGCCCGCATCCTCAGCCCGGGCCGTGTC
-CCGCCAGGGCCGGGACCTTTGCGCCTGAGCCTCGGCTTTGGGAGGTGGGGGTCCCAGGGA
-AGCAGCAGGGGCGGGAGACAGAAACAGCCCCATCGCCCCTCGACGCCTCAGGGTTGATAG
-GCTGGGTAGAGGCTTCAAAGGACACCCCCACCCCCGCCAACACTTCAAAAACCCATTCCT
-ACCCCTCTCTGCCTCAGTTTCTCTCTAGGGAAAAGGACGCAGTTGGTGTGGAGCAGGGCA
-TCGGTGGTCCTGTCAGGAAGAGTGGCGCGGGTGCCGGTGGGGAAGGGAGGCGGGAAATGG
-CCTGATTTCCCCGGCCGACACCCCCTACCCATCCCCCCCGGGAGGGCGCCCCTTCTCCCC
-CGCCCGGGCAGCGCTGGACGCTGTAGTGGGCGAGTCTGAGGGTCTGGGAAGGACACAACT
-GAATGAGGCTGTGCAGAGGCGACAGATTCCGTCCATCTTCGGGCCCTGGCTTCCGTCACT
-TCCGCCCGTGCCTGCCGCCCCTCGCCTCCTCCCTCCGCCGCAGTCTCCCCACGTCGGACA
-GCGCAGCCCCCTCCGCCTCCCGCTCCCCTCCCACCGAGCTCCTCCCGGCTCCCGGGCTGG
-GGACGCCTCCCTAGCGGTTCCCATGGCAACCCTCGTCCCGGGTGCCTgcgccccgccccc
-cgcccgccAGACCTACTCCGTGCAGCCCTGAAACGCCAGGCGGAGGGGCCAGGCCGAGCG
-GGAGGCAGCGTCAAGGTCACCTTCCCTCTCCAGTAGCAGCAGGACTGAGTGATTCCATCT
-ATTTGGAGTCGCGGAAGCGGTGAATTGGAGGGGAGGAGCTGACCCAGGTCAACAGCCCCG
-AAGCCCCCTCCACACCTCCTCACCTGTGGCCTTGAACAGTGGTCTCCGCACGGAGGCTCC
-TACCGTCCCCCAGGCCCCATTTCTTCTCCCCACCCGGGCCTCCCCAGCGCCTCGCCGGGG
-CGGGTACCGCGCTGGCCGCACCCTCCGCACAGCCCGCCCCGCCCGCCTCCTCCGGCGAGC
-CCTCCTCTCCAGACCTCTCGCCCTCCTCCTCCGACGGTCCTTCGCTTTCAGTCTCTGCCT
-TTTCCCGTTCTCTGTCGTGGCTTTTGTTGTTGTTGTTTTTCCTCCTTTCCTTCCCCGCTC
-TTCTTTTCCCTGAATTGTAAGTGAGGAGGGTGTACAGCCACTATTTATGGACAGGCTTTC
-TTGACAGCAATCTTGTGTGCCGTGTGACTCCAAGCAGAACCTCCAACCgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtCGTACCTATCTGGGTATGTCTCTGTATG
-CTTTGTGAGTATGTCTGTGTGTTTCTCTGTGCTGTTTCGGTGAGTTTCTCTATGCAGGGA
-TTTGAGGACCACATCTGATTGGAAGTGAGGGGCAGCTGTCAGGACCTTTATCTTACCCTT
-TGGAACAAGCACATTGTTTCATTTTGCAGGAGGCTGCTAATTAAGGCTGAGGGCCATCAT
-GGAGACTGGGGTAGAAGCCCAGTCCTCCCCCAACACCTCCTGGCTTTGGTTCGGGCCAAA
-CCTGTATATGGATATACAAGTACCTTCCATTCCCAAGATCCGTGTCCACTTTTGTGGAAA
-AAAAAAAAAAGGTTATTTGATAGGTTTCTCTGGAAATCTAACAGCCCTTAAGCCTAAGAG
-TCTTTAATCCTGAGGGACCCTGACTTTCACTTCCAATGGAGTCAAAATTCATTGGAATCT
-GGAGGCTTTCAGGGGCAGTCCTGGGGAGGACCTTTTTATAGCCTTGCAGCTTGGGAACTC
-CAGCCCAAGTGTCAGCCATGACAATTACCCCCAGGAGGGGGTCTGAAGGGGAGCGGAGGG
-TGAGGCTCTCTCATTCCAGATATGGAGACTAAAAAGTTCAAGATGGAAGTAATAGCAAAA
-AAATTACAGTACTAATCACAACAGCTACCATTTCTCAGCATTAGAcacagtaactgtatg
-aaagaagtatgattattaggtctgttttacagatgaggaaactgagacccagaaaggtgg
-aagcacttgtctaaggtcacgcctccaggaagcagtgtgtccacgactccagtccaagtg
-gtcaggctccagagcccacagtcccaggtactGGGTGGCCTCCAGAGTAAACATGCAcat
-ttattgacacctccaattgccaggcactgggctaaggccttcagtgcattggctcattCG
-CAGTGTGCTTTGGGAAGGACAGGCTGGGATTCCAAAAGGCCAGACTGTGCTATGCGTGTA
-GGGTGTCTCGAGTGGGAGGAGAAGCGGGTGGGGCACAAAGATTTAGGGGGCTTATGAAGG
-TCACCATGAGCAGCTCCCACTAATCCCTCCCTCCGTCAGCTGCACCTTACCTGCTCCCCA
-GGGGTCCATGATGCCGAGCTGCAATCGTTCCTGCAGCTGCAGCCGCGGCCCCAGCGTGGA
-GGATGGCAAGTGGTATGGGGTCCGCTCCTACCTGCACCTCTTCTATGAGGACTGTGCAGG
-CACTGCTCTCAGCGACGACCCTGAGGGACCTCCGGTCCTGTGCCCCCGCCGGCCCTGGCC
-CTCACTGTGTTGGAAGGTAAGGCCAGATGAGCACCTCCCATGATTCCTCTGCCTTGATGG
-AGGAAATGAGTCTGAATTTGAGGCTCAGAGGAAAAAAGAAGAGATAGCgtagtagttagg
-agtcttgcacagtcaagcaacagaaaacccaattcaaatgggtttaaataatgaagggag
-ccttcattgTATTTGTATTTACAtacaaattatttacataattatttacatatttattGT
-ATGTAAATAATggtggctcatgcctgtaatcccagcactttgggaggctgaggtgggcag
-atcacctgaggtctggagttcaacacctgctctgtcagcatggcgaaaccctttctctac
-taaaaatacaaaaatggaccgggtgcggtagttcacgcctgtaatcccagcactttggta
-ggcggaggctgaggctggtggatctcgaggtcaggagttggagaccagcctggccaacat
-agtgaaaccctgtctgtactaaaaatacaaaaattagctgggtgtggtggcgggcgcctg
-taatcccggctactcgggaggctgaggcaggagaatcacttgaaaccaaaaggtggaggt
-tgcagtgagctgagatcaatccattgcactccagcctgggtgaaagagcgaaactccctc
-taaaaaaaaaaaaaaaaaaaaatgagccgggcgtggtggcaggcgcctgtaatcccagtt
-acttaggaggctgaggcaggagaattgcttgaacccaggaggcagaggttgcagtgagcc
-aagtttgcaccattgcactccagctgggcgacagaacaagactctgtctcaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaagaaaaaaGAAGGGAAAATGTTGCTCATTTTTTAGAAGAGA
-CCCAAGGTCCAAGGTTGCATACTTTCAGGCAAAGTTTGATCCAGCAGTTCAACCCTTTAT
-ACCAAGGACTTTGCAAGTTTTCTTAGTCTTCAGCCTCCTCATGGTGCCCCTACCCTGGTA
-GCCTGTTAGCTTCAGACTCTCCCCACATGTTCCCCAAATGGCCACTACTGTGTGGACTCT
-CAGGTCTTCACTCCACACCATCTAAGGGAAGTCAGCATTTCCTGTGGTATTTCCTTCAGA
-AAAGAAAATAgcctgtaatcccatcattttgggaggccaaggtgggtggatcacctgagg
-tcaggagttcgagaccagcttagccaacgtggtgaaacctcatctctactagaaatacaa
-aaattagctgggtgtggtgatgggcgcctataatcccagctactctggaggctgaggcag
-gataatcactagaacccgggagacagcagttgcagtgagcagagatcgtgccgttgcact
-ccagcctgcacaacaagagtgaaactctgtcttaaaaaaacaaacaaacaaaaaaTGGCC
-ACAGGTACtggcttacacctgtaatcccagcactttgagaggctgaagcaggaggattgc
-ttgagcccaggaattcaagatcagcctgggcaacatagtgagacttcatctctactaaaa
-ataaaaaattagctggatgtagtggcgcgggcctgtgatgcctactactcaagaggctga
-gccaggaggatcgtttgagcccaggaggttgaagctgcagtgagccatgattgtgccact
-gcactccagcctgggcaacagagtgagactctgtcaagaaaagaaaagagagaagaaagg
-aagaGAGAAAGCAAAATAGTAAgatattaaaaacatgttaccatttaccttagcaccaaa
-gaagagagaaatacttaggtgtaaatctaacaaaatatctgtaatatgagaagaactaca
-aaactcaaaagatatcaaataactaaataaatggagaaatagttcatattcgtggattgg
-aatagtcaagatgttagttcttcccaacctgatctttgattcaatgcaatgccaatcaaa
-accccagcacgttattttgtggacgtcaaAATGTCACCTCCTCAGGGAGGAGATCCCTGG
-ACTGAGTCGGGTCCCTTGCTTTACTCTGGGCAAACTCTGTGCCCATTCATTCTTCAATAC
-ACTTACCACTTTGCACACTTGTAGTTTATATGGAGAGGTAAAAGATTCAGAAATTTAAAA
-ATCATTTATAagaaacaatgcttttaattcccagaagtcctgacaagcattgtgttggct
-ctcattgggtcacttgccagccttgaactaattactatggttaagagatggactatgctg
-actggcAGGAAGTGAGGTTCATCTCACTTAAATCTTACTGTGGTTTCTCAATGGTAGACT
-GGAGTACCTTGCCAGGGCAGAGAAAAAATGTGAAGAATTGATGTCTTTAACAGCCAAGGA
-GACTAGTCGGCCAGGGTGCACCAATGGGTCAAGGTGTAGAGGTGGCAATGAGCTGAGTGC
-CTGCTATGGGCATAGCTCTTTGCTAAATATTCTCGGGAGACTGAGGCAGAGGGTCCCTTC
-TTTTGCTTTCAAAGGACTTCACTCTAGTGAGGAGGTAAGGTGCCAACCTCTGCAGAGAGG
-CCAACTTACATAACTTCAGGTCAGGTCTGTAGGGAACACCAGGAGAGGAAATGATCAAGG
-AAGACTTCCAAGGAAAGGTTAGTGTGTATTTaaaatttttaagcatcttcttattgcgag
-gcactgtgctaggctcttgggaacacagaatttaagacatgaggtccctgtcttcgagga
-actcTTTTAGCTGTGGTTTatttaatcattcagcaaacatttattcagcctttgctctgt
-gccggcacgtgctaggcacagaagactcctagtgagccaaaacaggcacagtctgctctc
-atggagctctcagtactgcgggagaggcagacgtcacttacatagcaaccaaaatacatg
-tccaagtgtgcacaatggtaagtgtattgaagaatgaatgggcacagtttgcccagagta
-aagcaagagacctgactcagtccaggggtcttctccctgaggaggtgaggtttgagatga
-gatctgatggtgcataggagttaacccaacagagacaggaaggtagaaaggATAAAGAGA
-TGAGTTGGGATGGAGGGAAACACAGGGTTGGCCGGAGAAACCCACTGCTAGGTGGGAGCT
-GGGAAGGAAATTAAGAGGCCTCAGGATTCCAAATAAAACATGACAGTTTATGCCTCCTGT
-CAGTTAGACCCCAGCAAGTGTGTTCTGTGATTCCCATCTCCTGAGGATGGATCAAGGGGT
-TACCCTTAAGTCTGGTGAGGATCCAAGGTGATCCCTTGGCCAGGGGCCCCTGGCTGACCC
-TGACTGCTTCCTGGTCTGTCTGCTTCTCCCTAGATCAGCCTGTCCTCGGGGACCCTGCTT
-CTGCTGCTGGGTGTGGCGGCTCTGACCACTGGCTATGCAGTGCCCCCCAAGCTGGAGGGC
-ATCGGTGAGGGTGAGTTCCTGGTGTTGGATCAGCGGGCAGCCGACTACAACCAGGCCCTG
-GGCACCTGTCGCCTGGCAGGCACAGCGCTCTGTGTGGCAGCTGGAGTTCTGCTCGCCATC
-TGCCTCTTCTGGGCCATGATAGGCTGGCTGAGCCAGGACACCAAGGCAGAGCCCTTGGAC
-CCCGAAGCCGACAGCCACGTGGAGGTCTTCGGGGATGAGCCAGAGCAGCAGTTGTCACCC
-ATTTTCCGCAATGCCAGTGGCCAGTCATGGTTCTCGCCACCCGCCAGCCCCTTTGGGCAA
-TCTTCTGTGCAGACTATCCAGCCCAAGAGGGACTCCTGAGCTGCCCACATGGCCTAAGAT
-GTGGGTCCTGGATCCTTCCCCCCTTCTCACCATAACCCCCTCTCAGTGTTTCCCCAACTT
-CTCCCTTTTAGCAGGGTCCCTTTAGAGCCCAACTCCAGGTCAAATCTGGAGCTCAAATCC
-CAGTGCTCCCTCCCCAGGAGTGGGGCCCCAACTCTTCCAAGATACCAGCATTCCTCAAGT
-CCTCCCAAAACTTCCTACCCACACCCTCTTCCCAAGGCCCTCAGGGGCAGAAAACATCTC
-CTTCAACCCGTCCCCACTCCTTCCTctgcatgaccttgggcaaacccttgccctttcaag
-ccatcagctcctgcctctctgccatgagggctttggatcagatTCCTCTTCTCGCCAGGA
-TGAGGACACGCACTGCCCTCCATAGACACAGATGAAGGGGTGGGGGTCATTCAGCTCGAA
-TGGGTCCCAGATGCTCACTTGGCCTTTCCCTGCAGGATGAGTGAAGACGTTTGCCTCTCA
-CAGTGTGTCTtctacctgcattttggcatcagagccccccagcccacccaccacaggcaa
-ttactagccctagttgataggtgaggtgggtgaagaaggctggaggtgacatgtccgagg
-tcacacaacaaagcagcatgcaggaactagaaacacatcttcagcctccTCCTGGGCCAG
-CTCTTGTGCTACAGGTGGGGCGGAGCCAGCCCCTCACCTTCCTGGTTCCCTGAGGGTCCT
-CAGGGTGGAGGACAGGTTTGGCCCAGAAAGACTAGCCAGAGGCCTGATGGTCCCAGGTGG
-CTCTGGATATACTTTGGATATGGATTTAAATGGTCTCTAAGAGCCGGGGGTAGGGGGCAG
-GAAAAGTGGGTTGTCTTTGCCCCTCAAAGTCCACCTACCTAGAAACCAAGCCCACGGTCT
-TGGCCGTGACCCTGATAATAAATGGGCTCTCTCAGAGGCGCCAGCCCCTCCCTCCCCAGC
-CGGAGGCGTCATCTCTCTTCTGTACCACTAGAGGGAGCTCTGATGCAGCTGGAGAGCAGC
-GCTCAAGGCTCTCGCCCCTCCCCTCCCTAACCCTTACCTTCAGTCTCCACCAGCCTGAAG
-GGCCTCCTAGGGGATCCTCAGGCGGCCCCCACCAGGGCACACCCTACTGTCCTTGTGCCT
-CACGCCCCCTCCTCATCCTGCACCCCTTCCATCCCACCTTCCCTTTCAATAAACAGCTGG
-GATGGATACTGACTTTGTTTCCTTTCTCCCTGGCCACTGGGGCGTGGGGAGGAGAAAGAC
-ACAGACTCAGgagcacctactgtgtgctgggcacgacccattatttctcattcgctcctc
-aggataacctgttgagaaaggaattattgtcttcttttttttttttttaagatgttgtct
-cgctctgtcgcccaggctggaatgcagtggggcgatcttggctcactgcaacctctgcct
-cctgggttcaaccaattctcctgcctcagcctcccaagtagctgatattacaggtgcacg
-ccaccacgcctggctaatttttgtatttatagtggagacggggttttaccatgttggcca
-ggctggtcttgaactcctgacctcaaatgatccgcctgcctcggcctcccaaagtgctgg
-gattaccgggtgagccaccttacccagacttattgtcttcattttacagatgcggtaact
-gatgatcagagaggtgagtgatttATTTTTTAtttttatttttaattcttttttattttt
-ttcgagacggagtctggctctgtcacccaggctggagtgcagtggcacgagctcagctca
-ctgcaagctccgcctcccgggttcatgccagtctcctgcctcagcctcccaagtagctgg
-gactatgagtagctgggactacaggtgcctgccaacacacccagctaattttttgtattt
-ttagtagagacagagtttcaccatgttagccagcatggtctcaaatctcctgacctcgtg
-atccgcccgcctcggcctcccaaagtgctgggattacaggcgtgagccaccgcgcccggc
-cTATTTTTAATtctttttatttcagtagcctttggggtcaaagtgggttttggttacatg
-aattagttctatagtgattctgagattttagtacacctatcacctgagcagtgtatactg
-tacccaatacgcagttttttatccctcatcccctcccaacctccctggactcagtcccca
-aagttcgttatatcactctgtatgcctatgcatcctcatagcttagcttccgcttatata
-agtgagaacctaccgtatctggatttccgttcctgagttacttcacttaggataatggcc
-tccagctccacccaagtcctgcaGTGGATTTAAATGCTCAGCCTAGGGCCTGGAGGGGTG
-GCTGggccaggcgaggtggctcacgcctgtaatcccaggactttgggaggccgaggtggg
-tggatcacctgaggtcaggagttcaagaccagcctggccaacatggtaaaaccccataac
-tactaaaaatacaaaaattagctgagcatggtggtgcatgcctgtaatcccagctactcg
-ggagactgaggcaggagaattgcttgaacccgggtggtggaggttgcagtgaaccaagtt
-cacaccattgcactccagcctgggcaacagagcaagcctctgtctcaaaaaaaaaaaaaa
-aaaGTGCTTAGCCTGATTGGCCTATTGCCTGAGTGTGGAGCTCCTGTCTTTGGGTGGGAA
-GGAGATTTCTCAGCCACCTTGAGAACACACTTCCTCTAGTTCTGAAAGGAATGTGAGGGC
-CAGGGTGTGGGAGAGGGGGCTGAAGCCAAAGGTAAGATCTTTTCCAGGCCTGGaagagta
-attaaccccttttggcactcaccaggggctgggccttgttcttagtgccttacagaattc
-gggaattcatttaaccaggacgacaacctctgaggtggcggctattattctcaaacctag
-tttttcctaaactccaggcttgcgttcccatctgcattcacctggatgttgaatttaaac
-tcaactatctcaaactgttctccttgttaccacccctccctgaccaaacctgcctctact
-atgctgcccacgtcttagagagtagcgtccccattcttctggctgctccagccaaaacct
-cctctctttcctcacaccctgtatccaatccatcagcaagtcctgtcaactcaaccttgg
-aaatatatcctgtacccaactacacctcgacatccccgtggctgattccatggtctgaac
-caccagcgaccagcgcctcgatctggatcattgcaccagcttcccccggtctcctggctt
-ctgagttttgaaccccaccctactccacgccttgactccccaagtctaattactacacag
-tagccagacagatcttgttagaacataaactaggtcatgttcctcctccgctccaaacct
-tcccatggctcccacctaactcagagtagccaaaaccctccctgtggcctccaaggccct
-acacaatttgctgatttccactccccccgcactttcctctgtaaccccaactcccaccac
-tctccaggttcctgtgtcctctccagccaggatcctgactcagggcctttgcctcactgt
-tccctctgctggggtactcctccccagttgacgacatgggcagttccttcaagtcgttgc
-tcaaacatcaccttctcagcaaggccttccctgagcagcctattagaattgcaACCAggc
-caggcgcagtggctcaagccagtaatcccagcactttgggaggccgaagcaggtggatct
-cctaaggttgggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaa
-aatacaaaatcacccaggcatggtggcacatgcctgtaatcccagctactcgggaggctg
-aggcaggagaatcacttgaacctgggaggcggagattgtggtgagctgagatcgcaccat
-tgcactccagcctgggcaacaagagcgaaaccccatctcaaaaacaggaaaaacaaaaaa
-caaaaaaaTGCAACCATGCCggccaggtggagtggctcacacctgtaatcccagcacttt
-gggaggccaacgtgggcagatcacctgaggtcaggagttggagaccagcctgggcaacat
-ggtgaaaccctatctctactgaaaatacaaaaattacccaggcatggtggcacgtgtctg
-taatcccagctacttgagaggctgaggcatgacaatcacttgaactcgggaggtggaggt
-tgcagtgagccaagatcgcgccattgcattccagcttgggcgacagagcgaaactccatc
-tcaaaaaaataaaaggaaGCTAACACAGAGTATAAATGGTGCAggcagtttgacaatatc
-aaaatagaaaatacacatgccctttgatttctccctcttatgcaggtggatctatagatt
-caactctacatgttggaacactatagtattatttgtaattaaagcatttggaaacaacct
-aaatgctcatggtaggggactattaataaaatacggtaAggctgagtgcagtggctcacg
-cctgtcatcccagtactttgggaggccaacgcaggaggatcacttgaggccaggagttca
-agaccaacctgggcaacatagggcaacatagcaaggccccatctctacaaaaaattaaaa
-attagctgggcatggtggcacacgcctgtagtctcagctattaatatttgggaggctgag
-gcaggaggatcacaccactgcactttagcctgaatactgagtaacaaagcaaaaccctgt
-ctctcttaaaaaaaaaaTTGGGGGGAAGGACAAGTCTTttttcttttcttttcttttctt
-ttctttttttttttttttttgagatggaatttcactcttgttgcccaggctggagtgcaa
-tggtgtgatctcggctcacggcaacctccgcctcctgggttcaagcaattctgcttcagc
-ctcccgagtggctgggattatagtcatgcgccaccacacctggctaattttgtattttag
-gtagagacggggtttctccatgttggtcaggctggtcttgaactcccaactcctggcctc
-ggcctcccaaagtgctgggattagaggtgtgagccaccgtgcccagccAGGacaagtctt
-cttacagaagaattccaattagtaaatgtagaaggattgagagaaattgaaaaatcatca
-ttagaacaccggaataataattgctgcaggcaacatctaccaatgaacaataaaatgagt
-gggtgaaactttaaggagaaacaaggttttttttttagaaacgggatcttactacattgt
-ccaggctggtctggaactcctaggctcaatgggatcctcccacctcatgctccccagtag
-ctgctactacaggcacataccaccccaccaggcttgaaacaaaatatttgcatagcctca
-aagtatctatccccaaatatgtattaattagtatggtggttttaacatatgcatacatgt
-tctttgatgctctgccatctaggaaatggagcttaatttttctcctcttgagtgtgggct
-ggactcagcaacttgcttctaacaagtagaatgtggaaaggcaaaaacagtgacttcaca
-gtggaaaaatctggcagacaccaccttaaccaaatgaaggctggcaccaccagtcaaaag
-tcttgttgatatcacagcctctgaaatgatgtggtgagaagggcacttggcctgagtggc
-attcttcccccaaatccgtaacgtcagcctaatcatgagaagacccattctacaaaagat
-ctgaccagcactcttcaaatgtgtccaggtcacgaaagacaaggaaaggacaagaaacgg
-tctcaggttggaggagactaaggagacgtggctgaaggatacacaggatctccctgtact
-gtccatgtaactcttcaataaatctacaattatttcaaaatagcaaaaaatacgattGCT
-ggccgggcacagtggctcacgcttgtaatcccagcactttgggaggccaagaagggcaga
-ttacttgaggtcaggagtttgagatcagcctggccaacatggtgaaaccctgtctctact
-aaaaatgcaaaaattagctgggcgtggtggcatgtgtctgtaattccagctgctcgagta
-gctgaggcaggagaatggcgtgaacccgggaggcggagcttgcagtgagccgagattgcg
-ccactgcactcccgcctgggccacagagcgagactccgtctcaaaaaaaaaaaaaaaaaa
-aTTACTGTGGTCAAGATGGAATAACAGGGATCTGGTTTAACACACCCCAAAAAGGACCTA
-AGAAAGGACCATTCCCTCTCCTCTCTGAGGTGGGAAGATCTGGGAAGGAGAGGAGGCTGA
-CCAGTGGGGTCTACCTTCTGCTCCACCCCTCTTCTATCCAAGAGTCTGAGCACCCAACCC
-CCACACCACCCTGGAGGCTCCCGCCCTCGTGCTGAGTCTGGCATGCCCTCCCCATCCCTA
-CTGGCCCAGGGGACTAGGTTAGCTCAGAGAAGCCCTTCTAACTCACCCACAACTGGACCA
-AAGAAGGATTGATCTGGGGCCACTGCCTGGTCCCTGGGAGCACTGTGCTAGGGCAGGGGG
-CTGAGATGCCCCAGGGTAAGAGACAGAACAGTGAtttttttttttctaagacagagtttc
-gctcttattgcccaggctggagtgcaatgcgcgatcttggctcaccgcaatctccgcctc
-ccaggttcgagcgattctcctgcctcagcctcccgagtagctgggattacaggcatgtgt
-caccacgccccccggctaattttgtacttttagtagacacagggcttctccatgttggtc
-aggctagtctcaaactcctgacctcaggtgatcctcccaccttggcctcccaaagtgctg
-ggattacaggcatgtgccaccgcacccggccAAAAACAGTGATATTCATATAGATGGGGG
-AGGGATTAATGGGGGTGGAGTGAGAGAGAGCCTGCTGGAGCAGTCCGAAAGGCAGGCATT
-CCTTCTGTTCAGCAACATTCCTGCCCCCACAATCTCCTCCCACAACTTATATCTAGTgca
-ggctgagagtgaatctgtctgccagtgttcaagccactgtgtgaacctgagtttcttaac
-cgttctgagtgtcaggagtttttttcatctccaaaataggagcaacaaggataccaatcc
-cttgagattgtatgaagcttaatgcacttaacacagcacctggcacgtagacatgctccc
-taaatgccagctgttattatGAAAGAGAGAAGTCTGAGGTTCAGAACTAGCAGGCAACAC
-ATAATCtataatgatggatggctcagacagggtcctgtcctatagggactcacagtctag
-tggaaaggacagtcctgtggacagcaaatggcaaTATACCTGGGTAAGTACTGTAATAGA
-ATAACAAAGTAATATCCTATCACGGGGCAGTCACGGGGGCAGTGAGAGACAagcgcttgt
-ccatgccaggctctgtactcagtccatcacatacattaggtcttgcagtcctcataccac
-cataaggtggttaccattatctccaattcacagaaaagcaaacagtatggagtgtttaag
-cgtcctgtccgagatggcatagctagtggagctgaaatttgaacccaagtaatccaggtc
-cagaatGCCCCGGATGCAGAAATGACCACACAGATTCTACCAATGAACTAACCTGATAAG
-GTTGGAGGTCATACTCATAACCCCTCACACAGGTCCACACAGACACAGGCAAGCACACCC
-ATGTCTATTCAGATACACACCAATTCCTGTCTATGACGAGCGCTCAGAAAATCCTCCACA
-ACACCACACCAGGAATGATGTGCATTTTGAGAAAAAAAAAAATCAGCTCTGAAGACCTCA
-CAGACACATGCAGTGAAATGTAAATGGAGGGACCCACCCAAGTTCTTGAATAGCACATTA
-CATGCCTGGATGCACATCAGCGGGCATGTAAATGATGACGAGGAGGTCTGCAGACACTGA
-CACGCTGCATTTGCACTCACTCTGCTACTGAATTTTTTAGCagctacatttactgagcac
-ctactgtatgtaaggAAAGATAAAGCagccgggagctgtggctcacgcctgtaatctcag
-cgctttgggaggccaaggcaggtggatcacctgagctcaggagaccagcctggccaacat
-ggtaaaaccttgtctctactaaaaataatacaaaaattagctgagtgtggtggcatgcac
-ctgtaatcccagctactcaggaggctgaggcaggagaatcgcttgaacccaggaggtgga
-ggttgcagtgagccaagatcacgccattgcactccagcctgggtgacagaatgaaactct
-gtctcaaagaaaaaaaaaaaaaaaagtaaaaaagataaagctcagagaagtgaagtggct
-tgcccaaagtcaaatggctgagattcaaaccctggccctataatattaggcaacggtgtc
-tccctccaccactgtgcAGATGCATCCATGAGTGAAGAGATGTGCTATGGCTGGATTCCC
-TCATTGACATTCCCTGTGACCTTGGACATGGCATGGCCTTGTCTGGCCCACATTCTCATG
-TTGAGTCCATTCACAGGTGTGCTCCATGGATGTGCATGGATGGGACCGGCAACCCTGGCC
-TTGCTCTGAGTCTCAGCTTGGCTTGGTGTCACCAGGGCTGTGAGCTTCCAATCCCAGCCT
-TGCCATGTCCCAGAGCACATGGCTCAAAACCAAGCTCTGGGCATCAGGCCAGCAGGGCCC
-CTGTGATGGAAGAACTGACAGGATTTCATAAGCATCCGGCCCGGGACACGTGGTCAGGGC
-AGGGAGAAGGGAGATAAACAGGATGTCCACCAGGGTGTGCACCTGGGCAGGGTCCATGGA
-CCAGGTGTGGCAGGGGAAGAGCTGTCAGGACTTGGCATCTGATGGGCACTCAGCAGATAT
-AGGCTGTGTGAGGGGAGGAGTTTGTGGGGAGGCAGGGCTGCAGCTTTGCTTCCATCCTGG
-AGGCCAGGAATGAGGGAGTAAGTGAGCCATTGACTCaatgaatgaatgaatgagcgagtg
-agtgaaggaaggaaggggtaagtaaataagtgaagaatgGAATGGGGGAGGGAGTGAatt
-tatttatttatttatttatttattttgagacagggtcttgctctgttgcccaggctggag
-tgcagtctcagctcactgcaacctctacctctcaggctcaagggattctcccacctcagc
-ccccagcatagctgggactacaggcgcatgccgccacatcccgctaatttttgtattttc
-tgtagagatggggtttcgctatgtcggccaggctggtctcaaactcctgggctcaagcga
-tctgcctgcctcagcctctgcagtgctgagattacaggtgtgagccaccgtgcTGAGCTG
-TGAatttattttttacacaaatctgagtgctcactctgtgctggccctggacgggtctct
-gtggatgtctggtgagcaggatggacacagcccggtcattgcaacgctaaaagCTTGAAT
-GACACCAGTCAGGCTGGGGAACTGGGAGGGCCCTTGACATGCAGAGTGACTCAGCCAGTG
-TGAGCAGGGGTTGTCAGCATGCCTAGGGGAGCAAGAGACTGTGAGAGAtgtgtgtgtata
-cttgtgtgcctgtgtgtgtccgtgtgtacacatgtgtgcgCCGACACAGCCAGGTGTTGG
-CCAATGCAGGTGTGGTGTCCTCAAGAGCACAGTGCATCCTGATTCTTCACCCTCCCAGGC
-CTCCCCTGCCCCTGTTGTGTGCCAGCTGGGCCTGCCCCATGTTATGCCTGACGCCCACGC
-AAAAGCTGCTTCTTCCAGTCACAGGACAAAGGCATCCTCAGCCCAGACCCTGTACCCCAG
-GGGTAAAGACCTCTCAGACCCCTAGTGCTCCTCAGCATGGACCTCTCCACCAGGAGCCTC
-AGAGTTGTGAGAAGCACAGGCACCCAAAGCCCACCGCCCTGTGTCCATGTGCATGGAGTG
-TGCCCAGGTACACGCAAGGGCTGGAGATGCCCCAGGGCGGTCCAGACAGACGTGCAGATG
-ACACATTGGCCACTGAGTTTCCACAGACACTGAGCTAAGTGCTTTCGAGACACActgggt
-gaccttaggcgtatcaccctctctgagcctcagtttctaatctaaaagtagggtaattat
-actcacttccagtcttgttagaataactcaatgCATGATCAGCTCAACACATCATGATTA
-TTTTTCCTGAGTTCCTGCCTTCCCAGCTATATTGTCTATTCCTCAACAGTACCCACTGAG
-TCTTATATCCCCGTTTCTCCTATGATACTCCATTACACAGGACTCAAATAACTACCTGCT
-CTAAGAATTGCTGAGTGACATGTAGTCCTCATAAATAGCAATAATAGTCACTAACATTTA
-TATAACaacaagagccagcaattttgattttttattgtgtcaggcattgtgctgaacact
-ttacattccttcattcatttgacaaacattcactgaacacctggtaggtgctgggctctg
-tgctagacctgcagatgcagcatctctgccctcaaggttcttacattctgatggggaaga
-agagacagacaaaagacagtttggcggggcacagtggctcacgcctgtaatcccagcact
-ttggtaagccgaggcaggcagatcacttgaggtcaggagtttgagaccagcctggtcaac
-atggtgaaacccctgtctctactgaaaaaatacaaaaattagccaagtgtggaggtaggc
-atctgtaatcccagctactcgggaggctgaggcacaagaatgacttgaacctagaaggtg
-gaggttgtagtgagcagagatcgagccactgcactccagcctgggcgacagagcgagatt
-cagcctcaaaaaaaaaaaaaagataatttaatacataaatgggataatttcaaaccttga
-caagtgctacaaataaaataaggaagagttatggattagagacaaactgcagggattagg
-tggggcatgatgcttgatgagtgatcagggagggcctctctgaggagcaaatatttgatc
-tgagacctgaagaagaaggaagagcctggaaagatacaggaaaagttccaggcagatggc
-atagcaagggcaaaggccctggggcaggaagaacttggtaggttcgaggactaggagaaa
-gggaccatagctggagGATGATTCAGCAAACCTGGCAGGTCTGTCCTGGATGACTCAGCA
-AGCCTTGCAGGTCTGTTCTGGTTTCAGAACCCAGGCATTTTGTCCTTCACTCCAGGCTGC
-CTCAGAGACATGCATCCCTGCCATACACAACAATGTGTGCACGCTGGCACACATGCACAT
-GCATGCACACACACACTCTGCATGCTGACACACAACTAAGGGCCGGACCAGCCATGATAG
-TCTAAGACACTAACATTTTTCTCTAGTGTCTTGTGGGGCCAAGTAGAAGGGCCAGATGTC
-ACCTTTGCCCAGCCTTCCAGAAGTTCTGGGCCAAAGAAAGATTAAATGGCAGGAAGAGAA
-AAATGGCTTAATAAGGAGGTGACGGGGAACTCGGGTGGCCTGTGGGGGTGCGGAGATGGG
-GGGAGATGATAGAGATGTGAGAGCCCATGGGCACATCCCCTCTGGGGAAGTGAGGGAGCA
-CCGAGAACAGAGAAGCAGAGGGAGTGGAGACGGTTCTCAGAAGCACAGGGCCTCCACACT
-CACCACAGCCCCTACTCAGCCGACATGCCTTGCTTCCTCTCACCTCCCCTGGTTCACCTC
-AGAGATGGGACACTCATTGCCCACCAGGGCAGCCTGGGTGGTGCCAACTGTGAGAGAGCT
-CCCCTTCCACATCTGCCTTTGTGGCTGTAAAATGTGGAAAGaataagagaaatacctatg
-aaatctgcaggaagatactttcttttttttttttttttttttttgagatggagtttagtt
-cttgtcgcccaggctggagtgcagtggagcgatctcagctcactgcaacctccgcctccc
-aggttcaagcaattctcctgcctcagtctcccgagtagctgggattacaggtgctcgcca
-tcacacccagctaatttttttgtatttttagtagagatggggtttcgccatgttgggcaa
-gctggtctcgaactcctaacctcaggtgatccacccacctcagcctcccaaaggaggctg
-ggattacatttttctaaatcagttcggtaaaaatcaaaaattttgagaacacctggtgtt
-gtagttctgggaagcaggtactcacatgctttgctggcaggaggtagattgataacaatc
-tctatagaggaggagccagagatctctcttaaaagtgcaaatgcacaaacttttgactta
-gaaattctgcttctgggCAGGGCGCGGTGGCTCACGCCTGTGATCCCTGCCTCCCaggcc
-aaggttgcagtgagctgagatcgcaccattgcactccagcctgggcaacaagagcgaaac
-tctgtctcaaaaaagaaagaaagaaagaaagaaaaattctacttctaggaaattagctca
-gaacttctctccacacccccatgtatgaacactgcagcattttttgttatagcaaaagac
-tggaaataattaactgttcattgacaagggatggtttaaataaaccagtacattcctaac
-catggaataggaccaagctgtaaaaactgaccaggcaggtctttctggactgacacggaa
-gagtccccaagataaattgttaaataggaaggaaaaaggcaatctgaaggacatggagtg
-tgctcccatctgtgtaaaaaagtgacaaTAAATCCTCATATTTTATGTCTTGAAGGAAAC
-ACGAGAAAATGGCTTGACCCCAGGAAGATGAACTAGGAGCTGGGGATAGGAGTGGGAGGG
-AGACTTCTCAAGTATTACTCTTCTGTGCCTTTGAATTTTGAGCTAAAATATTTAaataaa
-atattaatataattaatataatacaattaataattaatattgaataaaataaaatatCTA
-AAAATCTGCTCCccgggtgcggtggcccacgcctataatcccagcactttgggaggccaa
-ggctggtggatcacctgaggtcgagagttagagaccagcctgaccaacatggagaaaccc
-cggctctactaaaaatacaaaataattagccgggagaggtggcgcatgcttgtaatccca
-gctactcagcaggctgaggcagaagaatcgcttgaacccggaagacggaggttgcagtga
-gccaagatcgcaccattgcactccagcctgggcaacagaagcaaaactccgtctccaaaa
-acaaacaaaaaaacaaaacaaacaaacaaacaaaacCACAACTGTCTGCTCAAAAGTGCC
-ATCCTCCTACACACTCCTTGCCCTCAGCTAAGTTCTGTCCCCATGGAACTCTCCCTGGAA
-GAGACAATCTGTCTCCCAAGAGAgcaggcctatgtgtgagtcctggttccatcactgacc
-ctaagtgtgacctcaggcaagacactCCCACCCCTGACTTGTACTAGACAGTTCTCCCCA
-GCACTGACATTCTGTCTCTCCTGCTGGAGGGGCAGGAGGGCAGGCACAGTGTCTTCTTGC
-TCTGTGATTCATTCAGTTCACTTAAACTGAGTTACCTACTCCAGGCCAGAGTTTGGGTTC
-ATCCATTTCTTGCCCTCCATGCCCACCCCAGGGTCTGGCATGGGAGTTGGTACCCTATAG
-GAGTTCTGAACAGACTCAGCTTACGGATGAGGAACAGACGGTGGGTCAGATGCGCGGTAA
-GGAGGGTCAGGTACACGGCCCATGGGATCGAATAGATTCATGGGTGGGtctttaagacaa
-ccgccttcactcaatcctaagccctccccacagctaccaccctattttttctcccctttg
-cagaaaagggctttgagaaaattgtctatcctcgctgtttttaattagtcttctctctct
-ctctccctctgagacaggatctgctctctcacccaagctggagtgcagtggcgtgatcat
-ggctcactgcagcctcaacctcctgggctcaaacgatcttcccacctcagcctcctgagt
-agctgggactacaggtgtgcactaccatgcctggctaatttttgtattttttgtagagac
-tgggttttgccatgttgcccaggctggttttgaactcccaggctcaagtgatccatccac
-ctcagcctcccaaagtgctgggactgcaggtgtgagccaccacacctggccctcttgtct
-cttaagtccatttaatcatgcttctacctgtcacttccctagttgaaactgctcttgtca
-atttcaacacattgctaaatccaatgtgttcagttctcattcttcatctttttttttttt
-tttttttgagacagagtcttgctctgtcacccaggctggaatacagtggcacgatcttgg
-cccactgcaacctctgcctcctgggttcaagcgattctcctgcctcagcctcccgagtag
-ttgggactacaggcacaagccaccaaacccagctaatttttgtatttttagttgagacgg
-catttcaccatgttggccaggatggtctcaatctcttgacctcgtgatccgcccaccttg
-gcctccaaaagtgctgggattacaggtgtgagccaccgcacccggcccattcttcatctt
-cttaactgatcaacagtttgacacagctgaccactccctgctctttgatgtacttctttt
-cacttggtggccaggcctccactctctgctggttttcctccttctcaggctccctgcttc
-tcccattcctgttggagcagtgaggacttggtccctggagctctcatccagtctcacgtc
-tatgactcccaacactgtatcctcagcccagacctctcccctgaactccagcccatacat
-tcaaatacctacctgatgtctctttgaggatgtcaaaagacatgacagactccacagaac
-caaagctgaacctgggcttcccccaaacacctcgctccatgtcatttgatggcagttcca
-tacctgtcaccgttcaggccaagaaaccttggaagcaccttgacacctccttttccctca
-aactccacatctagaccatcagcaatcctgttggctccacctttaaaatatacccagaat
-ccagtcacagctcacctctagcatggccactgccctgctctgagccactggagtttaaga
-gaattattgcaacacctgctcccttgtcttcctgtccttgcctcattcagtctattccaa
-gtacagatccctaaatgattttattttaaaagtaagtcaaggctgggcatggtagctcat
-gcctgtaatcctagcgcttgaggaggccgaggaaggaggatcacttgggtgtaggagttt
-gagacccacctgggcaatgtggcaaaaccctgtctgtacttaaaaaaaagaaaaaaaATg
-gctgggcatggtggctcaccctgtaatcttagcactttgggaggctgaggcgggtgaatc
-acctgaggtcaggagttcgagaccagcctggccaacatgatgaaaccccatctctactaa
-aaatacaaaaattagccgggcaaggtgatgcacgcctgtagtcccagctactcaggaggc
-taaggaagaagaatcactggaacccaggaggtggaggttgcagtgagccaagatcgcgcc
-actgcactccagcctgcatgacaggagcgagactccatctcaaaaaaaaaaaaaaaaaaa
-aaaaggtaagtgagatcacttccctcctctccttaaaccctcccctgcctccccatgact
-cctcagcgtcctttcaaaggcctccaaagctccagattatctgaaccccctttacctctc
-tgacctcatctcccaccgcctccctgtcactggctgcactccagccacattgaccttctc
-cgatggcacaccagtcagctagtcagcttccttttggagcttttgcatgagctgttcctc
-ttcctgaagaatttgcccttcggatagtctcagggcatccactgaacactccactcaata
-cagccactgcctgcccacccaacactcctcatctctgtacttactctttttttcccttgc
-attcgtcaccccctaacatgtgctacaatgtacttattatggtaattatttcttgcatgt
-ttctttctttttttttttgagacagggtctcactctgttgcccagtctggagtgcagcag
-catgatctcagctcactgaaatcttggcctacctggctcaggccatcctccctcctctgc
-ctcctgagtagctgggactacaggcactcaccaccatgcctggctagttgttgtactttt
-ttgtagagatgaggtttcaccatgttgcctaagctagtctaaaactcctaggctcaagtg
-atcctcccgcctcagcctcccgaagtactgggattgcgggtgtgagccgctgtgcctggc
-tgcacttttccttctaatggaatgtaagcgccacttttgtctgttattttcactgtagta
-tccctagcctttggaatgttgcctggcaagtagtaggtactcagtaaatatttgttgaag
-aaacggatGATTCTATAAATAGCATGGATTGATATGGGAAAGCTATGTAGGTGGATGGAT
-GGATGCTTGTCGGATGGAGGGTAGATGAAAGAACAGCGAGAAATTCGAATGGCTAGATGG
-TGGGGATGCATTATAAAATAATAATTCATAGATGGAAAAGGAATGAATAGATGGGTGGAG
-GGATttaatctcttcaactactatttactgaccacttgccgtgtgccaggcactgtatga
-ggtgctagagacactggtgagccacacaggcaaggtgcctgtcctaagggagcctgtagt
-tcagtgggtgaggcagacactaaacaaataacaaatacatacataattccaattatagtt
-aagtgttctggtggaaaagaaCAGGATGCTCTGGGAGAGAATAATATGGATAAGTGATGG
-AAAAATGGACAATAAATGGGTAGATGGAGATGGATAGGATCGGGGTTATTTGCCTTAAAG
-GGCCTGGCTTCAGGACTGGAGCTGCTTTACCTTAAAGGGCCTGTCGGACCACATGTACCA
-TCCCACATCCCAGACCAGCTCTGCACTCAGAGACTGTCCCTCTCTCCCTGCCCTGACTCA
-GCACCTGCCTGGCCTATCCCCAGTGGTCCTGCCTGACTCTACCTCCAGCTCCCACCCTGC
-TGAGTCACAGTCAGGCTGGTCAGGGGGCTGTCCCATGTTCAGTCCAGCCCCTCAGCCTTC
-CTCGACCTGGGGGGGTATGGGGAGCAGCCCAGAGGGGAGGGGAGCAGGTGCCAAGCTCTT
-GATTCCTGTGCCTGAGCACTGCCCTGTTGAGACCAGAGAGAGAATCTATGGCTAGGGTAT
-CTGGGGCTACAGTTGGGGTTTATCTGGGGCCTGGGGTCACACATGATGGATTAGAGCTAA
-ATCTATCTCCAGGGTTATAACTCAATCAGGAGCTAGAATTCAAATTCAGTTTATGGATCA
-TGTGGGGAAAAAGTGACCAAGACACCGTTCAGTTTGGGACCTGTGTCGGCGTTAGCTGTG
-GCTACGGCCCAGGGCTTAGTGATCACAGGTCAGACCATGTTCAAGGTTTCAGGCCAGAGT
-GCAGTTGAAGTGCAAAGTCAGGCAATAGGGTTCACCCTAGGACCACAGTCAAGGATCTGG
-GTCAGTTAGTGTCCAGGGCACTGGCCTTGTCTCCTCTTCTTTGGGAGAGAAGCCAGGTGG
-ATGAGTTGGATCTAAATGTCCTGAGGAGCAACTTCCAGCTCAAGTTCCTTCACCCAGGCG
-GCCTAAGCCCTCTCAGCACTGGCCCCAAAGCCTTCCTTCATCCCTCAACTTCCTCCATCA
-CTCCCTGACAGCCTGGCCTTGCTCAGTGTCCCTCGCAAGGCTGAACAGTCCTCATTCTGG
-CACCTCAGGGGACAGGGTAGGGGTGGGGACTATGGGACAGGGCTCAGTGCTGGACCCAGG
-AGGGCGCCTTGCGCAAGGTTTTCTGATGCAACTGGCTGAGTGCTTCAGCATTCCACCCCC
-ACCCCCCAAGCTTTTCTCAGAAAGGCAAGGCCTGGGCAGTTATCCAGACTGAACATATAA
-TCCCCTTCCTTCTCTGGCCTTTGATGGCTTCAGGACCTGCAGGCAAaaggaaggcaggaa
-ggcaggcaggaaggaaggaaggTCAGGTGACTCAGCAATGCGTCCAGCACTGGGAGCTGG
-CAGATCTGGGGCTCCCTCATCCTCCAGCTGAGAGGCGAGAAAGAGAATCAGGATCCCTGG
-AAGTTTGGAGATCCTAACCCCTTATACATACAAAGCAGCAATTATGTGCCTAAGCCCAGG
-GAGAGACCTGTAGCTGCCCAAGGTCAGAGGCAAGGTCAGAACCAGACCAGCTGTCTTCAG
-CCCATGGCTATGATCTAGCTATTTCCACTACACAGAAAGAGAGAACCCTTCACCCTTGAG
-GAGGACACGGGACTTCCCCAGGAACCTCCCGTCAATCCTGTTGAGGCTCCTGAAATGgtg
-gaatgacgtggactttggaaccacgcagacctgggtttaaatcccaggccaggcacggtg
-gctcatgactgtaatcccaacactttgggaggctgaggcaggcagatcacttgtggtcag
-gagtttgagaccagcctggccaacatggtaaaaccccatctctactaaaaatacaaaaac
-tagccaggcgtggtggcacacgcctgtaatcccagctactcaggaggcagaagcgtgaga
-atcgcttgaacccgggaggcggaggttgcagtgggctgagatcatgccaccgcactccta
-ggtgagagtgagactccgtctcaaaaagccacactggctagctgtgtaacgctgggcagg
-ttactttcactctttgacactggatttgctcacttgcaaagtgggcgtaaatgcatcctt
-agctcacagggctgtggtgaggctgacatgaggaagcactggaaggcacagcttagGCTC
-CACATGGGCCACTCTCAGGAAGTGTGTCCCCACCTCCCCCTTTATCCTCAGCTCTCACTG
-GGTGTGTTTGCTGGGGAAGGAGGTGCAGCAGCCCTGGGGCCTTGGAaataataatagcca
-ctcaccctccagtgcttaccatgtgctgggaactctcctaagcgtgaacttaacctgtat
-tagcccatttaaccctcCATTTAATCCAATAACAGTTCCCAGgccaggcatggtggtgca
-tgcccatagtcccagctactcaggaagctgaggcgggagtatcgcttgagcctgggaggt
-tgaggctacagtgagtcatgatcaccctactgcactgcagcctgggcaacagagtgagat
-cttctctcaaaagaaaagaaaagaaaagaGggaaggaaggaaggaagggagggaggGAAA
-TCCCAATGACAATAAGCAGTTcaataaccctacaggaaaacactgtcatcaatcccactt
-tatagatagggctgtgggtctgagtagctaagtgactttgtccaagacagtggacaagag
-accacacggattttgagccaggccagctggctctgaatcccactgtctcctccctcctta
-aactagtgatgtcactgctctgagccctggtttcctcatctgtctccagggataaaaata
-gcagcttcatggggaagtttgaggatgacacaagatgacgtaagggaggtccccacacag
-ggctccacccacagGCATGAGAAGAGCCTTTCTCAGGAAGAATCCCAGGCCGCCCCTGGG
-GCAACCGCCGGGCTGGCCTTCCTGCCTCTCCTTAGGCCCAGCCTAGCGTGATCTGGATGG
-TGAGAGATTTCTGCAAAGCCCCCAGGGGCCTCCAGAGAAGGGAGGTGCCCGGTCTCCTAG
-ATAAGGGCTCCCAGAGAGGATCACAGCCCTGGAGTTGCCATTCTTGAATCACCCACTGTC
-TTCCCCAAGTTGATTGGTCTGAATCCATGTACTTATTTTTTAtattagttccataatgtc
-ttccttccaaccagctcatcttttacttatttatttatttatttattttatttatttttt
-tatacagagtcttgctctgtcacccaggctgaagtgcagtggtatgatctcggctcacgg
-caatctctgcctcctgggttcaagcgactctcatgcctcagcctcccaagtagctgggac
-tacaggtgcatgccaccacgtccagctaatttttgtatttttagcggagataggtttttg
-ccatgttggccaggctggtctcaaactcctgacctcaggtgatccactcacctctgcctc
-ccaaagtgctgggattacaagcatggaccactgtgcttgaccacaaccacctcattttaa
-aaaacttatctaaatttatttaacatggaaattttaaatcactgacctcaaatagaaaac
-tactatgatttgccataaagaagaggtaagcatacaattacatacaaaaaaagcagaacc
-aggttattccattccagctaaatcctgtttcttgctgaaggctccaagctgaactctgct
-gtctcattcttaacaagagaggtgttaaaaacatagaagctgtgaggccgggcacggtgg
-ctcatgcctgtaatcccagcactttgggaggccgagcgagtggatcacgaggtcaggaga
-tcgagaccatcctggctagcacggtgaaaccccgtctctactaaaaacaataacaacaac
-aacaacaatcagccgggcgtggtggcgggcgcctgtagtcccagctgcttgggaggctga
-ggcaggagaatcgcttgaacccgggaggcagagattgcagtgagctgagatcataccact
-gcatttcagcctgggtgacagagcaagagcaagactccgtctcaaaaacaaacaaaacaa
-caacaacaaaaaaaaaaaccatacaagctgttggccgggcgcggtggctcacacctgtaa
-tcccagcactctgggaggccaaggtgggtggatcacgtggtcaggagatcaagaccatcc
-tggccaacatggtgaaaccctgtctctagcaaaaatacaaaaattagctgggtgtggtgg
-cacacgcccatattcccagctactggggaggctgaggcaggaggatggcgtgaacccggg
-aggcggagcttgcagtgagctgagatcacgccagtgcactctagcctgggtgacagagcg
-agactccgtctcaaagaaaaagaaaaaaaaaaaaagaagctgttaaatgagactttctcc
-ctgagtctttggagaaacagcaagaaaactgaaagggtttaagtgtatcacaattatgat
-tcaaagttatgtcatacggtatctggagaccctaaaaccctctggcactcagccattgtt
-gtacatggtatatttcagaaaacactgACCTCACTGacctactccaactttctcttctta
-ttttacagataagaaatttgaagcccccgcaaagggaggtgacttgtccacaatctcaca
-ggctcagtggcttcagccagacttggaacgcaACCAGAAGTTCTAAGGCATCATGTCACT
-TTTGTGGGGGAAATGTATGAAGATGAAAAGTTTCAAGGACACCTATGGTGGAATTTTAGG
-CATATGGCAATCACTAGGGACACCCATGTGGAAGGAAAGGAGGCAGGCATGGCTCATGTC
-ATTGCTGTGGGCCCCACATCAGTGCTGGGGGTCAGAGACGGAACTCATCAGAACTATAGC
-AAAGAggccgggcacagtggctcacgcctataatcccagcagtttaggaggccaaggtgg
-gcggatcatttaaggtcaggagttcgagaccagcgtggccaacttggtgaaaccccgtct
-ctactaaaaatacaaaaacattagccaggtgtggtagtccacacctgtaatgccagctac
-tcagggagctgaggcaggagaattgcttgaacccgggaggcagaggttgcagtgagccaa
-gatcacatgccacttccctccagcctgggcagcagagcgagacactgcctcaaaaaaaca
-aacaaacaaacaaaaaaCCAAACCTATAGGAAAGAGAAAAGCAGCCTTCTGGGCTCAGAA
-ATCTGAGTAGAAAGATGTTCTGAGCCTGGAGAAAGAAATTCATAAAAGCCTGACTCTCTC
-TCCAGAAAAGAGTACATTTCTGCATTTAATTTTGGGAGGTTGGTCACCATTCTTTTCCTC
-GCTTCTAAATAAATGCTTATATAGCATTTAtattccagtcactttacaaatattgtcatt
-taattctcatgcaaaccaacgaggtaggaactattgttatccccattttacagatgggga
-aactgaagtacaaagagctgaagtaacttttccaaaatAGATGTGGTTTTGAACCCAAGA
-AATGTGATACAACTATGACATGAGGCAGTCCCAATGcattgaatccttatgactgcaatg
-caagggaggtataattaactgcattttatagatgcagaaactgaggcttgaggctatttg
-gtgtttctggtgtagatctaggagccaaactccagcctacctagactctttgcctctgct
-gtacccctggaccatgTGTTAGGAATTCTTGGTACAGGGTGGTAGTGCTCAATATGGTAG
-TGgttttagtctgttttctgttgcttataacagaatgtctgaaactgaacaattttgaaa
-gaaaaggaatttattccttacagctatggaggataggaagtccaagattgagggggcact
-tctggtgagggccttattcctggtctctgaagtgtctggaggtggcacagggtatagcgt
-ggagaggggactgggcatgctgacatgctatgctttggtctctcttcctcttcttataaa
-gccaccagttctcctcctgtgaaaacccacaaatccattaatccatgagtgggttagtcc
-attcataagggcagaggcttcatgatccaatcacttcttaaaagtcccaaccgctcagta
-ctgccacattgggggattaagtttccagcacatgacatttgggggacacatttaaaccat
-agcagtagccatttgccacatgtggttattgagcacttcaagtatggctaatgtggctag
-tgtgactgagaattttttattttattgaatattttaatttttttttttttttttgagatg
-gagtctcactctgtcgcccaggtcagagtgcagtgtcatgatctcggctcactgcaacct
-ccgcctcccggggtcaagtgattctcctgcctcaacatcccgagtagctgggattacagg
-tgtgtgccaccatgcccggcaaatttttgtatttttagtagagacagggtttcactgtgt
-tagccaggacgatcttgatcttctgacctcatgatccacccacctccgcctcccaaagtg
-ctgggattacaggcatgagccactgcgcccagcctcacattatatttctattggaacaca
-gaaTGGTCTAGAGAATTGGGATTTGACAAACCCAGCTGTGACAAGTCACCAAAATTTGGG
-GGCCATACCCAGGGTGCCGTTCCTGTCACGATACCCATAGGTCCATGTGGAGGCTGCAGG
-GATACAAAGCTCGTGAAATATCCCAGGATGgcatgggcactggagtcagctgccccaagt
-tcaaatctgaaatcagtctttttgttttttttttttttttgagatgcagtttcactcttg
-ttgcccaagctggaatgcagtggcgcaattggctcactgcaacctccgcctcctgggttc
-aagcgattctcctgtctcagcctcccgagtagctgggattacaggtacatgccatcacgc
-ccggctaaatttttgtattcttagcagaaaccgggtttcaccaccttagccaggctggtc
-tccatctcctgacttcaggtgatccgcctgcctcagcctcccaaagtgttgggattacag
-gcgtgagccaccgcgcccagcctgaaatcagtcttatacgaccagctgggtggtcttggg
-taggtcccttaccttaactcttcttgtctgcagaatggaggtgacttactgtttttctct
-gtctccctttcacatctttgcactcttcaccccttctcttccctcagcttttagtttaaa
-catcacctttctgataagccctgctgaaaatggccaccctcagtcatgacggagaacaag
-tctttcctattttattcaagaaaatgcatgatgcaatctattttaaatgatcatggtttt
-aattttattttcctgataatggtctatctctccactgatttataagatttgtaagagcag
-gggtggatcattctggtcactgctgagtccccagcatttagaacaggggctgacacaGCA
-CAAAACAACGTTAGTTGGGAATGTACAAGCAAACCCAGCACACCTTCAGAGGGGTGCTCA
-GGAAACAGCCCTCCCAcctttcttcacccctcacagctgtgggatcttcctaaccatttc
-ggtgtcccaggatagaggatgagtttattcacccctccccagcaggggagttgccaggat
-taaatgagatCCCAGAATGCCCTGGTATACCCTGAAGGCTCTGGGACACAGGTGAGCTGG
-TCCCCAGGGATTTGGAAACAGGAAAACAAATATGACTCCACCCTGCCTCCCATCCAGCCT
-CTGCCTAGAGGAGTTATtttattttattttactttttttttttttttgagacggagtctt
-gctctgtcgcccaggctggagtgcaatggcgcaatctcagctcattgcaactcctgcctc
-ctgggttcaagcgattctcctgcctcagcctcccgagtagctgggactacaggtgtgttt
-tttgtatttttagtaattttttgtacttttagtagaaacgggtttcaccgtgttagccag
-gatggtcttgatctcccgacctcgtgatccacctgcctcagcctcccaaagtgctgggat
-tacaggcataagccaccacgcccagccTCTAGAGGAGttattttacttacttacttattt
-atttattacacaggatctcactctgtcacccaacctggagtgcagtggcacaatcacgtt
-tcactgtaacctgaactcctgggctcaagtgatcctcctacctcagcttcctaagtagct
-gggaccacaagctcgtaccaccatgcccgctatctttttctctttgtaaagacagggtct
-tactatgtcatccaggctgttctcaaactcctggcctcaagcaatcctcccgtcttggcc
-tcccaaagtgctaggattacagacatgagccagctcacccagctGAGGAGTTATTTTTTG
-ACACTGGTGAATTCAGATCAAAAGGGATTTCTAAGAAAGGTGCTGGACCCAggccgggcg
-cggtggctcatgcctgtaatctcagcactttgggaggccgaggcaggtggattatctgag
-gtcaggagttcgagaccagcctgaccaacatggagaaaccctgtctctactaaaaataca
-aaattagccaggcatagtagcgcatgcctgtaatcccagctacttgggaggctgaggcag
-gagaatcgcttgaacccgggaggtggaggttgcagtgagccgagatcgtgccatcgcact
-caatcctgggcaacgagtgaaactctgcctcaaaaaaagaaaaaaaaagaaaGGTGCTGG
-ACGCCTAGGACGCAGAGGGGTGTTTCACCCCAAATCAAGTAGCACCAAGCCCTCCCAGGC
-CTTGGGTGCAAGCATATTAAAGGCCTCTTTCCCTCTCTGTCTCCATTGTTTACACTCCac
-tgagcatccgcaatgtgccacacactgttctaagcgtcttacacatattaaattatttaa
-tcctcacaacaactttatgaagtgagcgcaattatgagcccattttatggagcaggaagt
-tgaggcagggttttaggtagcttttctggggtagcactgtgggttggagcggaggtggag
-tgcactcttaggccagctggctctaggggctcttcaccactaggccgcactgCCTCTAGC
-AAAGGGACGCGGGGAAGCTCAGCAGACCTTAGGCCTCCCAAGGGCGCCACGGTGGTTCCT
-TTGAGCCCAGAGTCAGCTCTTAAGTCCATAGGCCTTCCTGAAGCTTCTGAACCACTTGCC
-CATAGCTGGGCCTCAGGCTGGCTCTCAGTAGAATGTGGAGAATGGAGATTCCCGCATGTC
-CACTTCTCCTAAAGGTTTTATAAGGCAGTGCTGGGAATGTGCTTTATAAAAAAGGGGAAG
-CACCCCGACAACAGTCACTGTTTGctcttttaagcaccatcctgagaaggaggaatgttc
-ttcccatttcataggtggggaaaccgaggctcagaagagcaaatttttggccgggcgcgg
-tggctcacgcctgtaatcccagcactttgggaggccgaggcgggtggatcacgaggtcag
-gagatcgagaccatcctggctaacaaggtgaaaccccgtctctactaaaaatacaaaaaa
-ttagccgggcgtggtgcgggcgcctgtagtcccagctactcgggaggctgaggcaggaga
-atggcgtgaacccgggaggcggagcttgcagtgagccgagatcgcgccaccgccctccag
-cctgggcgacagagcaagactctgtctcaaaaaaaaaaaaaaaaagagcaaatttttttt
-ccaaggtgatagggagagtccgtggctgaTGTCTGCACTGACCAGACGCCCCTAGGGGGC
-CAGCGAGGGCGGGTCCCAGGTGCAGCGGATGCAGAGGAGAGAggcccgggcgcggcgcgg
-gggATGGTGCGATCCCGGGCCCGAGGGCATCAGACGGCGGCTGATTAGCTCCGGTTTGCA
-TCACCCGGACCGGGGGATTAGCTCCGGTTTGCATCACCCGGACCGGGGGATTAGCTCCGG
-TTTGCATCACCCGGACCGGGGGCCGGGCGCGCACGAGACTCGCAGCGGAAGTGGAGGCGG
-CTCCGCGCGCGTCCGCTGCTAGGACCCGGGCAGGGCTGGAGCTGGGCTGGGATCCCGAGC
-TCGGCAGCAGCGCAGCGGGCCGGCCCACCTGCTGGTGCCCTGGAGGCTCTGAgccccggc
-ggcgcccgggcccACGCGGAACGACGGGGCGAGGTACTCGGCGGGGTGCGGCCTGCGGAC
-TcgcccggaggccggggggcgggagggggcggccggggAAGGGGGCGCCGGAAGCCTCTG
-GGCGTCTGCGTGTTGCCGCGTGTTACACGCACGCACGCCCCTTACACACCTTTTCACAGA
-CCCCGCCGTCGGGGCGCGGCCAGGTCAGATCCCTTTTGATCCGGGCCTGGGCTGAGTGCT
-CCCCCCGGGCTTCAGGTGACGCGGCCCCGCGGAGCGTGGGGTCGCCCGAGTTGGGCTGGG
-GAAGCCAGGGACGGAGGTGTCCGGCCGTCACCCCTAGAGGAGGGCGTGCGGGGGTCTGTT
-TTGCGTGAGTGCGGGATAGGGGAGTCGTGTGGTGCGGTGAGGGGCTTGTGGGGGGCACTG
-GAGGACTCTGGGGGTGGCGGGGGATCCGAGGGGGTCCTCGTGAACCCGCAGGGGAGAGTC
-CTGGGTGAGGGTGGGTCCCGAGCACCTGTGTCTCAGGAGATGGTGAGAGCTGTCTGGAGG
-GCTGGGCACTTGGTGGCAGGGGTTGGCGGTGCAGGGGACACCGCCGGGACAGGGCTGGGG
-TGCCCTGGAGCGGGGGAGCCGAGGGAGTGGGAGCGGGGGCGCAGCGCGCGATCTCTGGCC
-CGGCAGGGCCGCTGGTTCTCCCCAGTGCGCGGCTCCGGGTTTGCAGGTGGACGGTGCGCG
-CGTGTCTGCGGTGTGTGCTGTGCCTGCAGACCGGGGAGGGCGGGGGACGACAGCCACCTC
-CTTCCCTCTGCCTCACCCCCCTCCTGTCCCAGGGCCGCGCTTCAATTTCCGCTGAAACTT
-CTGACTCGGACACCCGCCGCCTTTCGCTTGGGCTCCCACGGGAGGGGCCTGGCTGCGGGG
-GGCGGGGCGGGGTGGGGGTGCGGCCTTGCTCGGGTAGACCATGGGTGTGACAGCTGGGAG
-GGCtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgtgCGCGCGCGCGCTTGCGCTTGATGTA
-ACCCGCCCTCATTTCCCTGGGTCCCGAGTGTGGCAGGGAACAGCAAGAGGTAGATATTAG
-GGGCTGCTTTCATTCCACATCACAGATTCTATTCTGCAGTGTGGTCTGCAAAATGCCTTG
-CCCAAGATGTATAGACTCAGTTACCGCATCTGTCCCCATCTGGGTGGAGCTTATCCCAGG
-CCCCAACAGGCTCTGAGGGATGGCCGGGGCCAAGGCAGCCTGGACTACTGATGTGGCACA
-GGCCAGAGGGACTCCAGGCAGTCTCCTGCTGCACAGGGCACAAAGCATGTGCACAGCCAG
-GTATCATCCTGCGTGACTCAGAACAGCCTTGAGATGTAAGGAGTGTCATCCCAGCCTCGA
-ACCTGGGGAGCTTTCTAAGACTCCCAAGGATGGTACTTATGCATCTTGCTGTGAAGAATA
-ACAGGATGAGTGCtaataatgaccatttcctgacacctacctggcaacaggtccataagc
-tctacatgcttcatttgtgttttcatttcatcatcacgaaaaacctgtaagctttgcatc
-ctgttcccactttacaggaactgaggctcagaaagcttgaggaacttgaccaggggtacc
-ccccagctagaaagggtttgagacaggattagaacccaggaatatctgactacagccact
-ccttactgcaTTCTTACCAAGCCAAAGTCATGACCTTTCACTCATGTGGGGAGGCCTTCC
-CTTCCAAGGCAGCTCTTCCATTTGGGAGCAGCGTACTTGGAGAGGTGGGCCTCTGTCTGG
-TAACTGACTCATGTTGCCTTGTTAATCCTGCCTTGAACTGTTGGGAAGGTCTTTAACCAG
-GCTGAGGTCTCTCGCACCAATGCCCATACCTGGGCATGCACCTCCTTGGAATGGAGTTTA
-AGTGGGTGGGCAGATGGGTTCTAGAGAGAACCCGTCTGCCCTGACCATGCCCTACTGCCC
-TCTCCTTCAGCCACCACACACACAGTCACACAGCTGCGTGAATGGTGgctttcctttcac
-ttaacagttcactctggagatccttccaattaccctataaagagcatcctcaacctttta
-aatggctgcacattgttccgttgtgtggatgaagtataatttatgtaaccagccctgtaa
-ttatagacagccaattatttctgtcaaaagggctgcaggaataactgtgtatttgcatgc
-ttacacacacacacctctacagaataaattcttagcaatgggattaattgctgaatcaaa
-gctcacacgcttttcatcgttgtttttgttttgttttgttttgctttgttttgagacagt
-ctcactttgttgcacaggctagagttcctgaccatggctcactgaagcctttaccttctg
-ggctcaagtgattcccctacttcaacctcctgcatggctgggactacagctgtgtgccat
-catgaccagataattttttttttcttagggacagggtctcgctacgttgcctaggctggt
-cttgaactcctgggctcaagtgatcttcctgcttcagcctcccaaagtactgggattaca
-ggcatgaagcactgcacccagcctgtttttcattttgatattgtcaaaatgcactcctca
-gaggtggtaccttttatcctcccactagcactgtCTTCATTGTTAGTGGCTGCACTGCCA
-CTATTCCACAGTATAAACCCACTTTTCATGACACTGCCAAGACATAAGGGTCTGAAATAC
-TTAACAGTTTTCTTCCACAGTCCCCAAAATACAGGCTtctcccccagctcaggacatgaa
-gccatcatccctcctcattgcaggagccaaaggctggacctcacctcgattccaccctct
-ccttcacccctcacatccaatccatccagtccatccagtctgccactgagtcctcttgat
-cttcctcctatgagcccttaacttcgcgtctccatctagcaccccctagtccaggtcacc
-ttctcctgcctggactcgtgcttgtgtgggcctcctagctagtctcactgccccgtcttg
-tactttcaaatccaccctaaaagcatgatgttcccctgctgaaatccttcagtggctccc
-cactgcctttggataattccaaatcctattgtgtgttaattaggattaggctcagctgta
-atatagaaacagccacttaatagctaaaatgaaatagacgtttttttcttctttttctct
-ttttttgagacagagtcttgctctgtccccaggctggagtgcagtggcgagatctcagct
-cactacaacctctgcctcccaggctcaagtgattctcctgcctcagcctcccgagtagct
-gggactacaggcatgcaccaccatgcccacctaatttttgtatgtttagtagagatgggg
-tttcaccatgttggccaagatggtctcgatctcctgaccttgtgatctgcctgcctcggc
-ctcccaaagtgctgggattacaggcatgagccactgcgcccagccttcaatagatgttta
-tttctctcctgtgtaaaaaacctggaggtctggcctgacaactccatgtgtcagggacct
-aggctcctctcttgctctactgtatgtggtacttctgaagccaaggtagatgctggagct
-ccagcagttaggtccacattccagcatacaggaaaggaggaaatgaggaagttgggccct
-ccctttaagaacactgtcctgggcattgtacacaacacttccacttgtgtcctactagcc
-atatgctgatacaaggatacaagggagacaggaaatgcagtttattctaggtgtccttgt
-gctcagctgaaaatctcaggttctaatcctatgtaaggaggggagacctgaaactgggga
-ccactaaccacctctgccatatgatgctcgtagagcccttcacaatagggcctctactaa
-cctcaccttatttttatttatttatttatttttgagacggagtttcactcttgtcgccca
-ggccggagtgcaatgacactatctcagctcaccgcaacctttgcctcctgggttcaagca
-actctcctgcctcagactcctgagtagctgggattacaggcgtgtgccaccacgcccggc
-taatttttgtagttttagtagagacggggtttcaccatgttggtcaggctggtctcaaac
-tcctgacctcaggtgacctgcctgcctcggcctcccaaagtgctgggattacaggtgtga
-gccaccacgcccggcctattttttttttttttttaacttttcacttttttttgcagtcac
-gctcattctccaccgtgttcttggggaacatgcagcatgttcttttgcctcTTCCCTCAC
-CCCAGAACAGGggttactggacagcggcatcaacttcacctgggaactggatagaaatgc
-agattcagaccttctgaatgagctactttgggagtagggcccagcaatgtatgttgaaac
-aggcctccagatgatctcaatgcttgctcaagtttgagaaccactgAACCGCAGTATGAC
-TCTCCGTGTCAcctggctaactctgcctcactttcaggtctcagtgtagacaccacctct
-tctaggaagacctctcttgacccaccagcccaggagagaggcctctctgggttcctagag
-gcccatgcttctctgTATAGTAGGGCTGATCACACTGTATGTGAtttttttttttttttt
-tgagagagtctttactctgtcaccaggctggagtgcagtggcacaaacatggctcactga
-agcctcaacctcccaggctcaagcaatcttcccacctcagcctcccaagtagctgggact
-acaggcatccaccaccacacccagctaattaaaaaaaaatttttttttgtagagacaggg
-tctcactatgttgcccaagctggtcttgaacttttgggttcaagcagtcttcccaccatg
-gccttccaaagtgctaggattacaggtgtgggccactgcacctagccTTGGACGTGATTT
-TATTACTCATCTGCCCTCCAAATTGACTGGAAGATCCTGACGGCAAGACTGCTGTCTAAC
-CTACTTCTCTTCCTAGCACCCAGTGTTAAGTGAATGAACAAGATCATATCTCTCATCTGT
-GAATGTACGAGAGCCATGGATTATGAGATTAGTTGATTTTCTTAACTATAATTTTTAGAA
-ACAAGCTGTGTTTTTAAGCAGGTATTTATTTCCTTAAATGTACATTTCTGATTACAAAAT
-ACttttttttgagacagagtcttgctctgtcacccaggctggagtgtagtggcacaatct
-cggctcattacaacctctgcctcctgggttcaagcgattctcctgcctcagccttcccag
-tagctgggattacaggtatgcaccaccacgcccggctaattttttttttctcccgtgacg
-gagtcttgttctgttggccaggctgaagtgcagtggtgtgatctcagctcactgcaacct
-ccacctcccgggttcaagtgattctcctgtctcagcctcccaagtagctgggattacagg
-cccacgccaccacgcctggctaatttttctatttttagtagagatggggtttcaccatgt
-tggccaggctggtctcaaactcctgacctcatgatccaccaccttggcctcccaaagtgc
-tgccgtgggctgcactttggcattgccttggtcacgtgctgctacctgggattacaggca
-taagccactgcgcctggcctaatttttgtattttttagtagagacagggtttcaccatgt
-tggccaggctggtcttgaactcccagcctcatgattcgcccaccttggcctcccaaagtg
-ctgggattacaggcgtgagccaccacgcctggccAGGAAATACATTTACATGGCTCAAAT
-TCAAAACTATAAAAGTCggccaaacatggtgactcacatctgtaatcctaacactttggg
-aggctgaggcaggaggattgcttgagctcaggtgagaccagcctaggcaatgtagggaga
-cccccatctctacaaagaataaaaaaaaattagtcaggcatcatagtgcacacctgtagt
-cccagctacttgggaggctgaggtggaagaatcacctgaaccctgaggtcgaggctgcaa
-gtgaactgtaatAGTAAGAGTCTCCTCCTAATCTTGTGCATCCTTTCAGAGAGAGAGATG
-atagatattcaaacaaatacatacatatatataacatatttatatatattctttttaaca
-taaaagtatagccaggtgtggtggttcactactagagtcccagctacttaggaagctgag
-gtgggaggttcacttgaggccacgagtttgagaccagcgtgggcaacatctcttggggaa
-aaaaaaaaaaaaacccaccataaaagcattctataacacgtaattctgtgtttgtctttc
-ttctcttaatacatcttggagatcagtacgcatcagtatatagagagcttccttgtcctt
-tttcagggctgtgtagtattctgctgtatggctataccatgatgttttcactagctttct
-actgcctgacatttgggatatttcctgcttttgctattggacacaaggctctgatgaaca
-gcctttactatatttaatttttttgtgagaagtttaactggaagataaattcccagaagt
-ggggcacccagttaaggatatgtgactttgtcattttaacacacactgccagatcacccc
-ctataaatgttgtgccacgtatcctcccaccagcaGGGGAAAGGAGGGGCCACCAAGCAG
-TCTCACTTTAGTGCTTTTCTCTCCTTTTTACCAGATGCGAGCCACCCCTCTGGCTGCTCC
-TGCGGGTTCCCTGTCCAGGAAGAAGCGGTTGGAGTTGGATGACAACTTAGATACCGAGCG
-TCCCGTCCAGAAACGAGCTCGAAGTGGGCCCCAGCCCAGACTGCCCCCCTGCCTGTTGCC
-CCTGAGCCCACCTACTGCTCCAGATCGTGCAACTGCTGTGGCCACTGCCTCCCGTCTTGG
-GCCCTATGTCCTCCTGGAGCCCGAGGAGGGCGGGCGGGCCTACCAGGCCCTGCACTGCCC
-TACAGGCACTGAGTATACCTGCAAGGTACGTGCCCATGGGCGGCTGTCCCCCAGCACCAC
-AGGAGGCCTGGGAAGGAGGCCTCCAAAGGATTGCCAGGGTGCAGAGGGGTCCTTATGTTC
-ATTCATTCTTGTGTTTGTTTAGTGGGGAAGCATCCAGGGAGCCCCTGCTGGACTGATACT
-AGAGAGGTAAACCAGAGGTCGTCCCAGTCCTGGGGGAGTTCACAGCTTAGGCCCTACAGT
-GTGATAAATGCTGCAGGGGTAGAACTTAGGGATCATGGGCGCAGAAaaggccgagcagaa
-gttagccaggtagaagtgggagatgggagttgcaggcagggggaacagctgttcaaaggc
-ctagaaaagtgaggggatagcactttagagaatgaaaaggacttctctgtggccagagtg
-gagaggatgtgcagaaaggggcaggagatgaagGTTGGCAGCAGCTGGTCATGAAGGTGT
-TAACAAGGGGCCTCCACTGGGCTGTGCGGAGCTACTGAAGATGTTTGCACAAGAGAAGGG
-TAGGGCATGGTAGACATCAAAACTCCTgggacctcggaggtgatcgagcctaacctgggg
-ccattttacagataggaagactgagatgaagacaggagaagggccatgcgtgaagtcaca
-tagcACTGGGCCTGGCTCCTGGGGTAAACTAAGGGGTAGAAAAGTCTGAGGATTCCTGGC
-AGAAACCAGGAAATGGACAGGGTCAAGGCCCCTGAGGGTCAGCCCATGCAGGACACTGAC
-AAGTGACAGTCCAAGAAGACAGAGATGAGAATAAAAAGTGTAACAAtaggtattcactgt
-gcaccaggtactatgatgattgcttagtgtgcacaatctcttttaatcttgacacaacca
-atgaggtggtttctatcattgtgccccttttatagatagaggacactgagactcagaaag
-ccatggttacttgccacatgacagagccaggtggtatcagagctgggattgggcccagga
-ggctgagcccagagagtcctgtgcccGTGCTAGGATAAGCGTTTCACACAATCAGGGCAG
-GCTGCCCTGGCAGGCAAGCATAAGGAAGATAAGGGGGACCTGGAAACCCAAGGGAGAGTA
-GCGGGGGCCTGGGTCCCTTGGGAATGCACAGAGAAGCAGAAGGACTTAAGCCTCCTCCTG
-GGGCAGCAGCAGAGCTTTGCTCTGTTGACGGAGATGCAGTGAACAGCGGGGCAGATCCAG
-ACAGGGTCCAGCCCCTAGCTTCACCTGGCCTCTTGTGCACAGATCTCCAGCGCCCTTACC
-AGGTGCCCTAAGGAGCCCAGAACTCTGGGTCCCCTTCCTGCAGCATCACAGGCTCTTTTC
-CACTCCCGCTGGGGAGGTGAGTCCATGATAAGAGGAATAACCCAAGCAGGCTCAGGAGAG
-AAGCGCCATGCGTTCACAGGGCCCTGATTCTCAAGAAACATTTGGGAAAATCCACTGGAA
-CATACTCACCCCTATGCCAATGTGCACCATGGGTGCTGAATGGTCATTTCCACACTTCCT
-CAGCTTTTCTGGTCAGTGTGTAGAAAGATCAAAATCTTGTCTTTGTAAATGATCAACTTa
-ttcattaattcaacacaacttcattgagcacccgtatttgccatgtaccatgctgtggtt
-aaaaaacaaagttctgttctcatcaagctgacgttctagtgggagatacagacactaaac
-aagcgaataagtaaaatacgtgtcaggtggccgggcgcggtggctcacacctgtaatccc
-agcactttgggaggccgaggtaggcagatcacctgaagtcaggagttcgagactatcctg
-gccaacatggtgaaaccttgtttctattaaaaatacaaaaaattagccgggcatggtggc
-aggggcctgtaatcccagctactcgagaggctgaggcaggagaatctcttgaacctggga
-ggtggaggttgcagtgagccgagatcacaccactgcactccagcctgggcaacaagagca
-aaactccgtctcaaaaaaacaaaaaacaaacaggaaaaCCCTTATTCCAGCATCTTTCTT
-GGTTCCTTTGCAATGCTTATCAGCATTTGTCAATATTTGGTTTCTGGGCATGTTTGCATG
-GCCTCCCAGTGGGCACCGGAGAGCAGAGCCCATGGCTGTCAGTCTAGCTGGACATGTGGC
-TGGCCCGTGCAGGCCCAGGGCCAGCATACTGAATGAATGAAAGCGTGGGTGGGCAAAGAG
-GACGGGAGCTGTGACGGTGATGAGCATCAGGTGCCTTCTGCATCATCCGCCCTTCCGGAT
-TCCTCCTGCTTTGTGGGTTATTTTTCTGTTTGGGTGACCTGTTACTTTTCAGTTATCCGA
-TGTTTGAGGCCAtatagcgtagcagttaagagcacagacaaaaggccgggtgcagtggct
-cacacctgtaatcccagccctttggaaggctgaggcgggaggatcacctgaggtcaggag
-ttcgagaccagcttagccaacatgatgaaaccccatctctactaaaaatacaaaaattag
-ctaggtgcggtggcacatgcctgtaatcccagctacactgggggctgaagcgggagaatc
-acttgaatccaggaggcggagtttgcagtgagctgagattgcgccagtgtgctccagcct
-gggtgacagagcgagactccgtctcaaaaaaaaaaaaaaaaaaaaaaagcacagacagtg
-gagtgcatacgtgcaaatctcagccgtgctgtttgctggctgtgtggcctctcagcttcg
-ttaaccgtaaaatggagcaagtcatcctaccttataggaccatggtcagggctgagtgac
-tcggtcagtgaagcgcttggtgcgatgcctagcacatggtagtgtctaataGGTCAGCTG
-TGACTGTTTGCAATGCCAGCCTCAGCTCCCGGGAGTCCCCAGCTGTGCTAACACCATGCT
-CTGCCCACAGGTGTACCCCGTCCAGGAAGCCCTGGCCGTGCTGGAGCCCTATGCGCGGCT
-GCCCCCGCACAAGCATGTGGCTCGGCCCACTGAGGTCCTGGCTGGTACCCAGCTCCTCTA
-CGCCTTTTTCACTCGGACCCATGGGGACATGCACAGCCTGGTGCGAAGCCGCCACCGTAT
-CCCTGAGCCTGAGGCTGCCGTGCTCTTCCGCCAGATGGCCACCGCCCTGGCGCACTGTCA
-CCAGCACGGTCTGGTCCTGCGTGATCTCAAGCTGTGTCGCTTTGTCTTCGCTGACCGTGA
-GAGGTGAGTGTGGTCTCAGAGACCCCAGCCACAGACACACCCAGGGGGTGGGCCATGATG
-GAGAGAAACCGAGGCCCAGGAAGGCAAGGTAACTTAGGCAAGAAGTGGGAGAAACTGAAG
-TAACCAGCAGCCCCTGTTTAGTTCCCTGAGAAGAGTTGACTCAggccaggtgcagtggct
-cacgcctttaatcccagcactttgggaggccgaggtgggtgaatcacttgaagtcaggag
-ttcgagaccagcctggccaacatggtgaaactccgtctctactaaaaatacaaaaattag
-cctagtgtggtggcgcacacctgtaatcccagctactctgaaggctgaggcaggagaact
-gcttgaacctgggaggcggaagttgcagtgagccaagatcacgccactgcactccagcct
-cggcaacagagtgagattccatctcaaaaaaaaaaaaaagaGTTGACTCAGTCCTCTTGG
-GAGCCCCTTGGGATTCTGGGATGGAGCACTGAGATGTGAAAGTCATAGTAGCCGACAGTG
-ACGAAAGCATCGCCACATTATCTAACGTGGTCttccatccttacaaacacgaggcaggta
-ctgttattatccccatatgatcaaggaaactgaggcccagagagctcaagtaacttgccc
-aagatcccatagcagaataaatggtagagctgggatttgaacctagatctgactccagag
-cctgggtcttaaTTCAATCTGAGCTTGAGAGGCAGGGGcctggctgggcttaccaactga
-ctttgggtgacctagtgtctctgagcctcagtttctccgttggtaaggaaaagggctgga
-ttGTTAGGGTGTTTTCAGGATTCCAAGACCACAGCCAAAATAGGGTCTGAGGTTCCCCAC
-ACGGGAACGTTTTCTGTGAAACTGAGAATTAGCACTTTTTGGTTAAAAGAATCTTCCTTC
-TCTAGGTTGGGATGCTAAGAAtttttttttttttaattgagacagagtctcactctgtca
-cccaggctggaatgcaatggcgcgatcttggctcactgcaacctctgctgcctgggttca
-agtgatacgcctgcctcagcctcccgaatagctgggactacaggcatgcgccaccatgcc
-tggctcattttttctatgtttagtagaaacggggttttgccatgttggccaggctggtct
-tgaactcttgaccttaggtgatccgcctgcctcggcctcccaaagtgctgggattacagg
-tgtgaggtactgcacccagccTAGACGCTAAGAAAAATTTTTAAAAGATAATTCTGGGGA
-GAAGGGCAGAGAGACTCGCCTCCTGTTCCCTCTCCAGATTCCTGGGGGCAGTCAAGATGT
-GTCAGGGAGTGCACTAAGCTGCCAGTTACACAGGAGTTTTCTGTGGAGAAAGGAGTGTGA
-CCCCATGGCATTTTAAAAAACtttttatcttgaaataattttagacttttagaaaaccta
-caaaaatagttcaaagagtttctgcatatcctttaaccagtgctctccaatgttaacacc
-tgacgtagctatggtacaattacccaaactattaactaagccacagattgattcccactt
-cccgagtttcccactaacaccccttgctgtgcaggatccagtgaggatcccaatttagtc
-atcagtggtttccttggtctcttccaatctgagacagttcctcagtctttccctgtcttt
-gaagacccatgaccttgacacttttttttttttgagacagggtctcactctgtcacccag
-gctggagtgcagtggtgtgatcacagctcactgcagcctcaacctcccgggctcaagtga
-tcctcccacctcagcctcctgagtagttggttctacaggtgtgtgccaccccacctggct
-aattgagatggggtcttgctatgttgcccaggctggtctcagactcctgagctcaagcaa
-tctgcctgcctcagcctcccaaaatcctgggattataggcgtgagccactgctcctggcc
-ataaccttgagacttttgaagagtactgatcagttactttgtatgtccctcaatttggat
-ttgattgatgttttctcacagttagattgcagttatgtatttttggcaagaacaacacag
-aatcgataggcccctctccacatcatatcaagagatacttgagctgatagtcattcctat
-gtcgtgaccttgatcacttggttagggcaggacctaccaggtttctctactgtaaggtcc
-taatttaccctttgtaattgacaaataccttgggggaggtaagctaggcatataaatatc
-ctgtttttcctcaactttcacccactaattttagcagccatccatcttgcctatagcagt
-tattattgtggtgcttgcctaagtctaattttctttttcttttttttctttctttctttt
-ttttttttttttgagacagagtctcgctctgttgcccaggttggagtgcagtggcacgat
-ctcggctcactgcaacctccacctcccgggttcaagtgattctcgtgcctcagcctcttg
-agcagctgggattacaggcacacaccaccacacttggctaatttttgtatttttagtaga
-gatggggttttgccatgttggccaggctggtctcgaaatccgcctgccttggcctcccaa
-agtgctgggattataggcatgggccgctgcgcccagccCCCAAGGCTGATTTTCTGTTAA
-TATTTCCTTCTACATTTTATATTAGAACAAGCATGCCTTTTTTAAAGAAGTAACATTTAT
-AATGATGTTTAAGCTAGTACATAACTTCAAACACATTTTAGGCTTAGGGTAGATACAACT
-ACCCCGGACCTCCTGGAGGAGACAGCGTGCTTCCTGCTCTTTTCAAGAAGTCACTTgatg
-gcccacacctgttatcccagtgcttcgggaagccaaagtaggaggactgcttgagcccag
-gagttcgaggccagcctaggcaacacagaaaaccccatctgtacaaaaaatttataaaaa
-ttagccaggtgtggtgatgcacacctgtgatcccagctacttgggaggctgaggcaggag
-gattgcttgagcccagaagtttgaggctgcagtgaactaggattgcaccactgcactcca
-gcctgggtggcagagtgagaccctatctctaaagaaaaaaaagaaaaaaaaaaagaaaaA
-TCACATGagagtcattggtagaagagggaccgtgagttagatagacctgtgtttaaatcc
-tgggttctgcttcttacctgctttttggccctgagcaaatgacttcacctgcctgagcct
-ttgtttcttcatctgtaaaatgggctaataatgctgacACCCCTTGTCCCCCAATACTGT
-GATTCATAGGATTGGTCAGTATTTGTGAAATGCCACTGGACACCCAGGAAGTAATGCCAT
-AAAGAAGAAACTAATAGCAGTGGTAATAGAATGATTACTATTAAAGTCATCTTTGAGTGC
-TCAGTGGAAGTTGTTTAAAGTAGAAATTGCAAATGGCAGGACACACtttttttttttttt
-tgagacagggtctcactctgtcacccaggccggagtgcagtggcgcgatctcagctcact
-gcaaccgccacctcctgggctcaagtcatatccttctgcctcagcctcccaagtagctgg
-gactacaggtgcgaatcaccatgcctgctaattttcgtattttttgtagagataggtttt
-taccgtgttgcccaggctggtcttgaactcctgaactcaagtgatccccctacctcggcc
-tcccaaagtgctaggattaccggcatgagccaccgcgcccagccTTACACACTTTTTTTT
-TTGCCCTGCTTACCTGTTTGTGTTTTTTATATAAACTGGTTGCCAATATTTTTTAAATGG
-GGACCTTTTCATTAAAATACAATTCCTGGCTTCTCTTGGGGAAAACAATGGGAATGTGGG
-GCCATCTTGGGAACTGCGAGGGTGGGTCACAGCACTGGCTCTGAGTATCTGCCAGCCAGC
-GTTCCCATCCCAGGCCCATGCtctacagctgtaaaatggtgtcttccttgcaggctgtag
-cctagatagaatgaggtgagccaggtaatgagctgggtcaagggccaggaacacagcagg
-cacttggtaaaCCCTAGAATGCGTTGTGTACCCTTTTTAGGTAGCGCTTGTGCTGAGATG
-TCAGGCACACTTCCTGTTTCTCTCATCTTATTACCTGCCTGGACCCTAAGTTTGTAGCTG
-GTTTAAGAGAGGCTTAACCCTCTCAGCCCCATCAGCCCCCTCCCCAAGGGACTCTGTTGA
-AAAATGTATTCCTTTCAgaattttagtttaaatttaattgctctgtggccttaaatgact
-taacctctctgagcctgggcttgggtatctgtaaaacaggATCAGACATCACAGGACTGG
-CTTGTGTCTGTCAAAGGCCAGCAGGCACTTGGAAAGTGGGTGCCACAAGGGTGATAGCAT
-GGGGTGGTGGCATGGGGGTTCTGGGTAGGACCTGACCCTTCTGTTTCTCCCCATGTCCCA
-GGAAGAAGCTGGTGCTGGAGAACCTGGAGGACTCCTGCGTGCTGACTGGGCCAGATGATT
-CCCTGTGGGACAAGCACGCGTGCCCAGCCTACGTGGGACCTGAGATACTCAGCTCACGGG
-CCTCATACTCGGGCAAGGCAGCCGATGTCTGGAGCCTGGGCGTGGCGCTCTTCACCATGC
-TGGCCGGCCACTACCCCTTCCAGGACTCGGAGCCTGTCCTGCTCTTCGGCAAGATCCGCC
-GCGGGGCCTACGCCTTGCCTGCAGGCCTCTCGGCCCCTGCCCGCTGTCTGGTTCGCTGCC
-TCCTTCGTCGGGAGCCAGCTGAACGGCTCACAGCCACAGGCATCCTCCTGCACCCCTGGC
-TGCGACAGGACCCGATGCCCTTAGCCCCAACCCGATCCCATCTCTGGGAGGCTGCCCAGG
-TGGTCCCTGATGGACTGGGGCTGGACGAAGCCAGGGAAGAGGAGGGAGACAGAGAAGTGG
-TTCTGTATGGCTAGGACCACCCTACTACACGCTCAGCTGCCAACAGTGGATTGAGTTTGG
-GGGTAGCTCCAAGCCTTCTCCTGCCTCTGAACTGAGCCAAACCTTCAGTGCCTTCCAGAA
-GGGAGAAAGGCAGAAGCCTGTGTGGAGTGTGCTGTGTACACATCTGCtttgttccacaca
-catgcagttcctgcttgggtgcttatcaggtgccaagccctgttctcggtgctgggagta
-cagcagtgagcaaaggagacaatattccctgctcacagagatgacaAACTGGCATCCTTG
-AGCTGACAACACTTTTCCATGACCATAGGTCACTGTCTACACTGGGTACACTTTGTACCA
-GTGTCGGCCTCCACTGATGCTGGTGCTCAGGCACCTCTGTCCAAGGACAATCCCTTTCAC
-AAACAAACCAGCTGCCTTTGTATCTTGTACCTTTTCAGAGAAAGGGAGGTATCCCTGTGC
-CAAAGGCTCCAGGCCTCTCCCCTGCAACTCAGGACCCAAGCCCAGCTCACTCTGGGAACT
-GTGTTCCCAGCATCTCTGTCCTCTTGATTAAGAGATTCTCCTTCCAGGCCTAAGCCTGGG
-ATTTGGGCCAGAGATAAGAATCCAAACTATGAGGCTAGTTCTTGTCTAACTCAAGACTGT
-TCTGGAATGAGGGTCCAGGCCTGTCAACCATGGGGCTTCTGACCTGAGCACCAAGGTTGA
-GGGACAGGATTAGGCAGGGTCTGTCCTGTGGCCACCTGGAAAGTCCCAGGTGGGACTCTT
-CTGGGGACACTTGGGGTCCACAATCCCAGGTCCATACTCTAGGTTTTGGATACCATGAGT
-ATGTATGTTTACCTGTGCCTAATAAAGGAGAATTATGAAATAATTTTATTTTTCTCTGCA
-ATTTCTTCCATCCTTTCCAACGATCTCTTACCAGTTTTTCCTGCCTTCAAAACTGGCCCC
-CATGGTGAAAGGCCGTAGAGTTGTGTCTTAACCTGGGCTGAGTGGTTTGTGAGAACAGAT
-TACCTGGAGCCCAGTGGGTCTTCCTGCACTCCTTCTGTTTCTTCTGGCAGCAGCAGTGTC
-TCTATTAGGGTACTTTCTGAGTCaaaatggcttcaacaagatggaaatatgtttcacaca
-aaacaagaagtcagcagatagggtgggcttcagtgctggtccattcaactcccaaagctg
-cgcacagggaccccggctctccaggctccttctgtctctTGGCTGTATTGTCTCGAGACT
-GCTGGCCCAATGGCTACAGCAGGTGTCACATTAAAGAGGTCCATGACCAGAGGAAGAAGC
-CAGGGGTCATTGtagtacctgagaactcagaactctggagtcaggctgcctggaattaaa
-tcctggctccagcactcaatagctgtttgacccttggcaagtttcttaaccactctatgc
-ctcagattcttcatctgtgaaatgggggacaatgatagtacctaacttatgagaactaaa
-tgacttattttgtataaagcaattagaacaagcagcgcctggcataataagcccacaata
-aaagttACTCCCggctgggcacggtggctcacgcctgtaatcccagcactttgggaggcc
-gaggtgggcagatcacaaggtcaggagttcaagaccaacctgaccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaatttttagtagagacggggcgtggtggtgcgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaattgcttgaacccgggaggtggacgtt
-gcagtgagccaagatcccgccactgcactcagcctgggcaagagagcgagactccgtctc
-gaaaaaaaaaaaaaTGGTGCTCCCACATTTCTTTCTTGGGATGGAGGaagctttcccaga
-agcgctcctgaccgactttcccacacatctcactggtcagaactgcatcacttgccgttt
-ctgaccaatcaccagcTTACATTCATGGGGCACGTGCTTACACTAACCATGGCACTCCTC
-GAGCTAAGTGGAGCTCATGCGTCATATGGAGGGGTAGTGACTCCTGAGCAAAACCAGGTT
-CAAAGAGGGAGGGGATCGTAGGGAAAAGAATGTGCGGAAGTgcggaggcccagccaacag
-cctgctaactgcagatactcgagagcggccaccctagatcatctgacccaggctggccca
-cgctagaattgcccagtgacccgcaaggtcatgagctaattgagctaaataaaatcattg
-tgtttttttgtttgtttgttttgtttttgttgttttgttttttgagacagagtctcactc
-tgtcacccaggctggagtgcagtggtgcgatcttggctcactgcaacctctgcctcccgg
-gttttcaaacgattcttctgcttctgcctcagcctcccgagtagctgggattacaggcac
-gcgccactacacccggctaatttttatatttttagtagagacgggggtttcgccatgttg
-gccaggctggtctccaactcctgacctcaggtgataggcccacctcggccacccaaagtg
-ctggtattacaggcgtgagccgccgcacccggccaatcattgtggttttaagtcactaag
-tttgaggctattttgttttacagcaaaagctaactgatgcaGACAGGGACAAGTCAGTCT
-CATCTCTGTGCACCCAGCATTGCCCAGAACAGGGCCTAGTTGTGTCTAGGGTCTCATGGG
-GCAGCCCCTGACCTCTATCTTGCCCCTCCCAGCTTCCAACAGACCCTGTCCCAGCTCCCT
-CCAAGCTGAGTGTTGGCCTGATACCTACCAGTGGAGCGAGGGGAACACGAGGACTGCCAA
-GGGcaggtaccgtgccaacccttcactccattccacaaagagactcatttactcctcatg
-acaatccagtgaggcagatgttcctgtcactttacagataagacaaatgagctttagaga
-gagcagaagactcatccaagacctcacaacAGAGAAAAAGACTCCTCTGGTTTTTGCCTT
-GGAGCAGGAACTTTTGACAAGGCTGCGCAGATGCAGCCACATGAAAACCGCCCATTAAAA
-ATGTAATATCggcccggagcgggggctcacgcctgtaatcccagcactttgggaggccga
-ggcaggcagatcacttgaggtcaggagttgaagaccagcctggccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaaatagccaggcgtggtggcatgggcctgtaatcccagc
-tactcgggaggctgaggcaggagaatcacttgaacccaggaggcagagattgcagtgagt
-caagattgcaccactgcactccagcctgagcgacagagcaagactctgtctcaaaataat
-aataaaaTGTAATATTCACTCTTATCAAATAATGGATGTCACCACACCCCGACCCTAATT
-AGTGAGGACTTTCATGTTCTACTTGTCTTCATTTAATCATCATTGTATAAGAGTTTTACA
-ATATCAAATTAGTAGATGTATATTACTGAAAGGGAAGGACTGTTAGAAATTTACTTGAGG
-AATGTCTGCCACTGGGGGCTGAACACAAAAGATCCTATTGTGACCTGCCAGATTATTCat
-tcacttagcaattcaacaaccatcgctgaatgcctactataggccaggtgccatgcaaga
-cagatgtgctcccaccctcaagggttcacagtctaatagaggagagagatgttaaacaga
-taactgtacagatggcaTAGCTAATTATATTCGTGGAAGTTCGTTGTGGCAAAGACAGGC
-ATCTCAATATTTCAGGAGCTCCCctatattttctagcctcccttacagtcacatgactag
-ttctgaccagtggggtgtgtgtaggagtgGCAGGCTGAAGCAATGGAGAGCTGGTGAGCC
-TCATCCCTCTCTTCCCCTGCCACAGCCACCTTGCGCCCACAAGTtcccttagctacaagc
-tggaggagagccaccagatccaccttagatttcactgagcaagaaataaagcttcttgtg
-ttaagtctttcagatttggagtttgtctggtagatagtgttaattaccatgactaaGGAA
-AATTTGCCATTAGTGAAGGGAGGAAAAATATTCTCCACCAGTAACAAGGCCATGTCAGTC
-TGCTGCATTATAAACCCCAAACAGtagtttatgatcctctgggctggcaatttgggctga
-attcagctgggtcactcctgcagctgcaggcagcaagcagctcgaatgtctaccttgcca
-ggaaggctcttctctgctccacatggcctcgtcctccaataggcatagcctactccttcc
-tatggtggtctcagggtttcagaaagcaacaagagaggacaaattccagtgttcaagctg
-cactagtgtcaaagcatatcaaatagcatgtcaaattccacatcaaattcaggatgcagg
-caaattgattctttctcttgatgggaagagctgaaaaTAATGTGTGGTCTTGTTTTTCAA
-TGTAcagtggtcccatttatccaggggggatacattccaagacccccagtggatgcctga
-aaccacagatagtacagaattctgtatataccatgttttttactatacatacatacctac
-gataaggtttaatttgtaaattaaactcttacaaattaagagttaacaacagctgggcac
-agtggctcacgcctgtaatcccagcactttgggaggccgaggtgggcggatcacgaggtc
-aagagatcgagaccatcatgaccaacatggtgaaactccgtctctactaaaaatacaaaa
-attatctgggtgtagtggcgcatgcctgtaatcccagctacttgggaggctgaggcagga
-gaatcatttgaacccgggaggcggaggttgcagtgagctgagatcgcgccactgcactcc
-agcctggtgacagagcgagactccacctcaaaaaaaaaaaaaaaacaaaaaaaacaaaca
-gttaacaataaatagaacagttataacagtatgttgtaataaaagttatgcgaatgtggt
-ctctccctcaaaatgtcctattgtactgtactcacccttcttgtgatgatgggagataat
-aaaatgcctacatgatgagatgaaggtaaatgaatgacatgggcattgtgatctagcgtt
-agactactactcacctgatgatacgtcagaaggagaatcatctcctttgggtgatccagg
-atcatgaagccgtgacaatgtccatgattggatgtcaggagcagatgatgttaatgatta
-accgtgggtaatgtctacaatatggatacagtgcaaaagggatgattcacatcctacgtg
-gaatagtgcaggattgcatgagatttcatcatgtggttggctgcaggtaactgacattgc
-agaaagcaaaaccacagatcatgggggTGGGGGTGGGGAACTACTGTACAACATGAGATA
-TATTTGATCAAATAAGATGAGGTGCACCTAAAACTTTCCCTACAGGTTGTATGCCCCTGA
-GTAAATTGCTTGGTGTCTCTGGATCTCCAGCTGTTCCCCTTCTCTCTGCATGGCTAAGCC
-CTGTCCGTCACTTGGGGCTGGACCTAGAGCCCTGCCTGGCCACTAAGCCCTCAGAACAGG
-GTTTCTTTTTTAAAAAAGACAGGGTcgggaggtggaggttgcaatgagccaaggtcgcac
-cattgcactccagcctgggtgacaagagtgaaactccatctcaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaagacagggtctcactctgtcacccaggctggagtacagtggt
-gtgatcatggctcgctgcagccttgaacacctgggctcaagctgtcccccaacctcagct
-tcctgagtagctgggagtgccaccacgcctagctagttttttaaaaaattgttttgtaga
-gacaggggcctcactattttgcccaggctggtcttgaatgcctggcctcaaatgatcctc
-ctgccttggcctcccaaagcactggggttacaggtatgaccacTACCCACAACCAGAACA
-Tttctcaaatgtgattggttgatctcctgcatccatccctggggtgcttgtttaaaatgc
-agagccctggatcctcccccaacctagagagtcagaacatctgggcttctgcatcttaac
-aagctccctgggtgatgctgctgggcctccaagttggagaacctctgTATTTGAAGAAAT
-CCGGACTCCTTGGGGACTCAAATCTTATTTCAGCTCTTCTCTGGACTAGTTTGACTTTAG
-CCTTGGTGTAAAATGGGTATACATTTTACACGCCTGTGACGCCAGGATGCGCTCACAGGG
-GAGGGAGGGCTTTATCAGAGGTCAGAATCTAAGCCACCACTACAGTTGTACTAGATCCAA
-GGAGAAAGACTCCCAGGCCTCATttcctcatcgttctctcttctcttacctggctttatg
-gttcttcatagcactgagcaccaccaggcagtgtattttatgttttttttgagctttata
-atgccagggactatgttttgtttataactgttcacccagttcctagaacagtgcctggta
-cacaggagtgctcaataaatgtttgtggaatgactgaatAAAAGTTGTTCCTGTACAGAT
-TCCACCTGCCTAGAGCAAAGCCAGGACACTGATTGGGAtgaacacatagcacatgccaga
-catggctttgagtgctttacctggatcatctcactttatatgtgacagccaaatggtccc
-cagtgaccttcaccagctgctattcacgcctttgtacagtttcctcccatcctaagctgg
-gctgaccagtgtaatgaatacaatattgtgaaatgagaaagtatgacttttaagattagg
-tcataaaatatgttatggcttctgccttgctcttctggatcatctgctctggggacagcc
-agctgccatgttgcgaggacactcaattacccctgtggaaacttacatgtggtgaggatc
-gtaggcattctgcaaataaccagcaccacccaggcacataaaagagctttcttgagtcaa
-tcctccagccccagtcaagccttcagatgactgcagccccagccgacatcttaactacaa
-cctcatgagtgaccctgagccagaaccatctatgtagctgctccccagttcctaacccac
-agaaactatgtgatagcatacatgttgattgcttttttaagcaattaattttgggaaatt
-tgccacatatcaataattaataacttgtacagattctcacaacagcctatgtgggaggag
-ccatcataattaccattgaacagagaaagaaactgaggcccagatagggggaatctttgt
-ccagggtcacacagatagtgaactgtagcactgagattggaacccaagtttgaatgacta
-gagtcTACCCACTGAGGTGAAGGTGTTCAAGTTGAATGCCAGCTCTTCCCCTGAAGGGCC
-AAGGCTGAGACCAGAAAACCTGAAACAATATAGCTGCACCCaatataaatatatgcaggt
-aactcagggctgatggtacatgaccataataaatcagcagggtcatcaggagaaaacaag
-acaacaggagcgaaaacagatagaaacaaatatgcccagagtttgtatatcagtattatc
-agacgcagattataaaacaaaatgttggccgggcacgggggctcatgcctgtaatcccag
-cactttgggaggccaaggcgcatggatcacctgaggtcaagagttcaagaccagcctgac
-caacatggggaaaccccgtctcaaataaaaatacaaaaaaattagctgggcctggtggca
-ggctcctgtaatcccaggtacttcaggaggctgaggtaggagaatcgcttgtacccggga
-gggagaggttgcagtgagctgagatcgcaccatctcactccagcctgggcaacaagagcg
-aaactctgtctaaaaaaaaaaaaagtttactgcgtttaaataaataaataacctagaaac
-attgccaaagtatagaaaattatatcacatgacaacaaattttaaaataacctaacagaa
-cttctaaaataaaataatacaataatcaaaatttttaggccaggcacagtggctcacacc
-tgtaatcccagcactttgggaagccgaagtgggtggatcacttgaggtcaggagttcgag
-accagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaaattagccagg
-agtggtggcagacacctgtaatcccagctactcaggaggctgaggcaggagaatcacctg
-aacccgggaggcagaggttgcagtgagctaagatcgtgccatttgcactccagcctgggc
-aacaagagtgaaactctgtcacacacacacacacacacacacacacacacaaattaaatt
-taaaagatgggctaaacagcaaactagatatggctaaagagggaattagtgagacagaaa
-tcagaCaccaatcacagattcaagaaactccataaattttacacatagacacatcatagt
-aaaagtgcaaaaagccaaagattttttttaaaaaactcttaaaagcactcagaggaaaag
-aatcagagattctaaaaacaaaaaacaaaACAAAACAAAAAAACCCCAAAACAACAACAA
-CAaaaaacaaacaaaaaaccagtactacaacatggataaacctcaaaaacgttatgtcaa
-gaaaaaccccaaagttatgccaagtgaaagaagccagtcacaaaggttcacatattgtca
-aaatctaattttctttttgagacagggtctcactctgtcacccaggctggagtgcagtgg
-gacgatcactgctctacaggtgcacgccatcacactcggctaatttttgtattttttgta
-gagatggggtttcaccatgttgcccaggctggtcttgaattcctgggctcaagcgatcca
-cctggcttggcctccccaagtgctgggattactggcatgagccactgtggcccatcagta
-agatctaatttctataaaatatcaagaagaggaaagtctatagagacataaagtatatta
-gtgctgtcagttggaggatgggaaacagggaatgtctgctaatgagtacaggtctatttt
-ggggtgataagaatgttctttctttctttttttttttttggtctgagacagagtctcgct
-ctatcacgcaggctggagtacaacggtgcgatctcagctcactgcaacctctgcctccca
-ggttcaagccattctcatgcctcaggctctgcagtagctaggattacagatgtccgccac
-cacacctggctaatttttgtatttttagtagagacagggtttcaccatgttggccaggct
-ggtctcgaactcctgacctcaagtgatccgcccacctcggcctctcaaagtgctgggatt
-gtaggtgtgagccaccatgctcagccaaaaatgtcctaaaatttgattgtgatgatgggt
-gtacaattctgtaaatgttactaaaaactattgaattgtatattttaggtgggtggattt
-tatggcatataaattatatctcaataaagctgtttataaaaaGAACAGCAGTTAGATTGA
-CAGGTGATGATATCTCAATAAAGCTGTTTATAAAAAGAACAGCAGTTAGATTGACAGGTG
-ATGATATCTCAACAGCAACCATTtcccagcattttgggaggccgaggtgggcagatcatt
-tgagcccaggagttcaagaccagcctgggcaacatgaccaaaccctgtctctacaaaaat
-tagccagctgtggtggcacgtgcccgtggtttgcagctactcgggaagctgagcccagga
-gttggaggctgtagtgagccatgatcacgccactgcactccagcctgggcaacaagagtg
-aaactccatctcaaaaaaaaaaaaaaaaaaaaaaaaGGCTtccccaggccattcaaatgt
-acagccaaagttaagaaacattgtctaaagggatgtgtttccggcaaaagaaaaattatc
-ccagatgaaggtctgaggttcattccttcattcaacatatggagcctccattatgtgttt
-ggaactgttctagacaccaggaacacagcagtgagcaaaacaaaccaaagtccctgccct
-ctaggagaggaaaacagacccagaataacataaataagtaaaacatgctccgttagacag
-taatagatgctgagaagaaaaaatgaagccaggaaagcggatgtgaaatgctggatacgt
-gtgtctgtgaaatttcagatggagtaactagggaagatttttgggtaaagaccaaaataa
-agggaaggagggagccatgcagacgtttgggttatggcaggtgcaaaggccttagggcgg
-gagtgtgtctgacttactccaggacccagcaggtcaatgggacttgagtggaatgaggca
-ggggcagggcagtcagctacgaagacagagatcgggaggcaatttgcgagccctgggaca
-gatctcggattttgctttaagtgagatgggagtacttgggtcggggagtggcatgggttt
-gatttacattttaacaggactctccggcagctaggtggaaatggacggtagggggcaaaa
-agagaagcaaggaggcccaggaggaggctggttcaagacccctgagatgatggagcactg
-atggagctggagcgggatggggccggaggaggtgagggatgagattctgcaagtggagcc
-cgcaggatctgctgatcgatgggacgaggaacgggagaaaaaTTAAAGCGGCGCATGAGG
-CAGACGAATGCAAACTTCACCAATAGCTCAACGAAAAGACAGACGGTGACCGCTgagagg
-cagcgtcggatctgggtaagggcgggttcctgagcctgccaggcctggattcaaacctcg
-gctgagtggccttggacaggtcatcaacaaacagagccttcgtttattcatgtgcaaacg
-gggccaaggaccgggcctgccccgaggtatgcctgaggcttgggtgagCAGGCGCCGGGC
-TCGCAGGGCGCGCTCCTAACCCGTCCCCAGCGGCTCGACGCTGTGGATCCCGCCGCCCTC
-CAGCCCCGGCTCCGGCGCCGACTCCTGCTCAGgctcctgctcctgcccccggccccgccc
-ccggccccggccccggcccccggcccaccccggccccgcccccagcccccggcccccccg
-gccccgcccccggccccgccccggccccgCCCACCCCGCCTGCGGCCCAGCTCCTTCCCG
-CGGCTCTGCGATGCGGCCCGCAGGGTGACCCGGGCGGGAGTCCGGGGACCCGCGATCAGC
-CCCGGAGGACGGGGTGGGGTCGCCCCAAACAGGAGCGCCGGGACCGCTGGGACCCCGCAC
-TCGGCGTCCGCCGCCGCCGGGTAGCCGGGCAGTGGAGGTCCCGGATGAGGCGACAATTTT
-TCCGGCCCCCCCTCCCAGTCCCGCCCCACTTCCGGGGCCGCCACTTTCACTTTCTCTTCC
-GCCGAAGCCGCTCCCCTTGCGAAGAACTGGGGCCTCCCGGGAGGAGAGAGGGCTTTGCCT
-TGAAACCCGGGACGCCAGGGGCGCTCCCGCAAGTGGGGGTCCTCCGGGACTTGGAACGCC
-CCGGCTGGGTGGTGTCCGGGCGTCCTTTCCCCGCTTCTTCCCACCTCGGCTGGTCCCGTT
-TCCTCCTGCGCCCAGTGCGGACCTGTCTCGGCGCCCGCTGCCCTCTCACCGCCCCACGCA
-GGATCCCGGCCTGGTCACCGGGCAGTGTGATGCTTCCCGACTGCCGCGGGGACAGCGAGG
-CACACACAGGGCTTGGGCCGCGCCGGAGGCCACACGGCCTGGCTGAGTTGCTCCTGGTCT
-CCCGCCTCTCCCAGGCGACCCGGAGGTAGCATTTCCCAGGAGGCACGGTCCCCCCCAGGG
-GGATGGGCACAGCCACGCCAGATGGACGAGAAGACCAAGAAAGGTGGGCACAGGCTGGAG
-GTGGCTGGGGAACTTCCGGTGGGAAGTGGGCCCCGCAGGACCTGGCCTTGCCCCTGGCCA
-GAAGGGCCTTGGAGAGGGGGCTTTAGCCTGCCCTCCCTCTACCCTCCTCCCCATCAGTTT
-CCTCCTTTGGTACCTGCTGGCTTCCAGAGCCATCTTGGGGCCCTGAGAACTCCTTGGGCT
-GGCTCTGTGCTGAGATGGGGCTAGGGGACTCGCAGAGGACACAGGGCATTGAACTTGGAG
-ACCTCCTGGGCTGGTGGGAGACAGACGTCAGTTGACCTGAGAAGCAGGGGTACTTGCCTC
-TTCTCTTGTCCCCTGCACCTAGGGttgtagaacggaagtcagtcactgccttgctggaaa
-ccctcccatgcccctctgtgttctccaaacaaaacccagaggccctgggtggcccacagg
-atatctgtcctcagtcaccccgccatgctcactctactggagccccactggcttccttcg
-gttctcatccaaccattttttggccaaggcccttactcttccttccacctggaccactct
-tccccactggagcttgacacgtgcagcttctcctccttcaggtcttagcttcagtgttac
-cccctcccagaggcctcccctggtctccttaacctgtttatttccctgccagcaaggatc
-gcaatctgactttttttttttttcttgttaaacttgttcattgtctccccactgggcagg
-gagatccataaggagaggggccctgtttataaatctctgtgggattccagttcctgggac
-agtgggtggcacacagtagaagctcaataactgcttgttggataaatgaatAGAAATATG
-AGGGACCCTGGGAATGGGAAGGACAAACAACCAAATGAGCCTAGTGTGAGGAGGAGTGgg
-gaatattagagaacccctcccggagaaagggacttttagtctgggtgctgaaggatacgt
-aggagttcaccaggaagacagagaaagCAGCACACACAAAGGATCGCCTCCTTTCCTACC
-CCATTACTCTCAGCTCCTGAAAATAAACCCTGTGCTAACTGGCTCCTGCTGTACTGGCTT
-TCAGCAGAGGAAATGGCCCTGAGCCTCACCCGAGCAGTGGCGGGCGGGGATGAACAGGTG
-GCAATGAAGTGTGCCATCTGGCTGGCAGAGCAACGGGTGCCCCTGAGTGTGCAACTGAAG
-CCTGAGGTCTCCCCAACGCAGGACATCAGGTGAGGAGTGCATGGCTGGCCTGAACCCAAG
-GGACAGCAGGACAGGATATTCTTGCCTGTAGAACAGTTCTTCCtaatggcacgttctggc
-ttcaggaggcctggcttctaaccctagttatgtcattaatcaactgtgaaatacagagca
-ggtcacttcacctctcagtgtgtcctcattttaaaaatcagaccgtaacagtagctatct
-catagggttgttaggaggTGTACTGTATTAGGATGTTAGGCCTTATACAACAGAAGAAAA
-CGGAACAGTGacgtaaacaaatttgatggcagggagtccagatagggaggttctgctccc
-gacagtcctcagaggctcatattgtttctctcaccattctgccattcattcccagattcc
-tcatggtgcaaaatggccattccagctccatccagccatcacatcacaggaggaagggaa
-gaaagacacccctccacactcttctaaagagcatagctcaaaaattgtacacacttcttc
-cgttaattcctgtggaccagaactgattcccacagctacagttcagcttgaggggagact
-gtatagccaagatattcagctagaattcaggggttcgcttggtaagggaagggaagagaa
-tggatactgTCGGTCTGTGCTCCAGgagacttaaactcaatgctgaaacactttgcacaa
-tgcctggcgtgttatgcactcaataaTAAACATTAGTGTCTATCGTTATTTTTTGACTGC
-TTTTTCATTACTGGATAGTAAGGCAATAGTTTTATGGTTTCTGATTTTTGGTTCTCTTGG
-TGGGTCCCATTTGGTTTttcttaaaacagttttatttatttatttatccttacagttcga
-ccatttaaagtatacagttcaatggcttttagtatattcaaggttgtgcaaccattgcca
-caatcaattttagaacattttcatcatcctgtaaagaaacctggtactcattagcagcca
-gtcctcatctctctaccttttccctaactccccaaccttaggcaaccactaatctacttt
-ttatctctagggatctaccttctggaaattccatataagttgaatcatgcaatatgtggc
-cttttgtatctggcttctttcacttaggatcgttttcgagattcatccatgttgtagcat
-gtctaacaacttcattcccctttttttttttgacatggggtctcttgtctaggttgaagt
-gcagtggtgccatcatcgctcactacagcctcaacttcctggattcaagcagtcctcctg
-ccttggcctcccaggtagctgggactactggcatgtaccaccacacccggctaatttttt
-ttttctttgagatgggagtctcactctgtcccccaggctggagtgcagtggcgcgatctc
-agctcactgcaagctccacctcccaggttcacgccattctcctgcctcagcttcccgagt
-agctgggactacaggcgcccgccaccacgcccagctaattttttgtatttttagtagaga
-cggggtttcgccgtgttaaccaggatggtctccatctcctgacctcgtgatccgcccgcc
-tatgcctcccaatgtgctgggactacaggcgtgagccaccacacccagccacacctggct
-aatttttagaaagtctgtagagataaggtcttgctttgttgtctgggctggtcttgaact
-tctggcttaagcagtcttcccacctcagcctctcaaagtgctgggattacaggtgtgagc
-caccatgcccaaccagaactttattcctttttattgccaaataataatctattgtataga
-catatctcattatctttactcattaaatcagttgatggacatttgggtgtttctattttt
-tggctattataaacaatgctgccgtgaacatttgtgtccaactttttgtgtggacacgtt
-ttcatttctcttggatacacactagcagtggaattgctgggtcatacagtaactctatgt
-tactttttgaagaaatgccagacagttttccaaagtggctgcaccattttacattcccac
-cagcatatatgagggttctagtttctccacatcatctctaatacttgttgttgtttatct
-ttttgattatagccatcctagtaagtttgaagaggtatctcactgtggttttgatttgca
-atttcctaaccatttgatgacaaatgatgttaagcatcttttcatgcacatattttcttt
-ggaggtttgcctattcaggtcttttgcccattttaaaattgggtttatcttttttttttt
-ttgagatggagtctcgctctgtcacccaagcaggagtgcaatggtgcaatctcggctcac
-tgcaacctccgcctcccaggttcaagtgattctcctgccccagcctcctgagtagctgga
-ttacaggtgcccaccactacactggctaatttttgtatttttagtagagacgggtcttac
-catgttggccaggctggtcttgaactcctgacctcaggtgatccacccaccttggccttt
-ccaaagtgttgggattacaggcatgagccactgcacccggctgggtttatgtttttatat
-tgagttgtaggagtactttattcattttagctagaagtactttattcattttagcttatc
-agctacatgatttgcaaaaattttctctcattctgtggattgtcttctcactttgttgat
-ggtatcctttgaaccacaaaagttttaaattttgatgatgtccagttagtctatgtttta
-ttttgttgtttgtgcttttggtgtcatatctaagaaatcgttgcctcatccaaggtcatg
-aagatttacctctatattttcttctaaagattttatggttttagctcttacatttaggtc
-tttggtccattttgatttaatttttatataaggtgtgaggtaagggtccagcttcattct
-tttgcacgtggatattgagttgtgccggcactatttgttaaggctgttttcctctgttta
-atcatcttaaccctttttggaaattaattgaccataaatgtgagtgcttatttctggact
-ctcatttctataccattgaactataatatatatctgcccttacgccagtaccacactaat
-tactatagcttcatagtatttgaaatcaggaaatacaagttctccaacttttgttctttt
-tcaatattgttttggttattgcaagtctcttgaatttccatataaattttacgatcagct
-tgtctgtttctgcaaaaaaaaaacaacaacaactgggaattttggtagggatttcattga
-atctgtagatcattggccacttgattttaaacaaaatattgagatatctacttcttgaaA
-TGATTGCttgagacagtacctgtgtactccttgctatgaaaaatgaggaagttaacatac
-tcatcttccacctttccttttccttactttttttgttGAAGTATCATTGTGGACACTTTC
-CCAGTTGACTTCCACTTGATCCCCTGAATTAACTAACTGGCACTGGCGTTTCCTTTGTAA
-AATGTACAATGTCAGCCACCATCTtgctactaaagtgtggcctgtggaccacaacatggg
-gggaatctcaggtctcacctcagacttgctgggtcagaacctgagttttgagaggctcTG
-GGCAACCGGCACCTCTCAGACCTGCTGTTGGGTTCTCATCGATGGACCCGATGCTTCCTA
-GCAAATGATACCTGTTGTATGTGTTATTGGTAATAACATAGTTTACTTAGCTATTACATT
-AATTAATAAAACATGAGCGCTGAAAGAGTTGTTTCTGTGAAAATAAGCTGATTGCTTTAA
-AAAGATAAGAGACAAATCACCAAAAAAAAAAAAAAAAAAGATTAACACTTTTGGGTGAGA
-CAGTAGTAAGGAAATACAGTAAAAATCCAGAAGGGCTCTGTGCTCTGATGCTTCAGGAGT
-GTGTCTAAGTTCTTGCTCGCTTTAAAGAAGCTGCTACTAGAAATTATAGATCATGATTAT
-CGATGTGGTTCATACAAAAAAAAAAAAGAAAAATCCCTGGGAAACTCCAATGAGCAGGTA
-TAAACTCACgctgggcatggcggctcagcactttggaaggctcaggcaggagaatggctt
-gaactcgagtttaagaccagcctgggcaacatagtgagaccttgtctctgcaaaaaataa
-aaaaaattagccaggctgggtggcacacacctgtagtcccagctatttgagaggctgaga
-tgagaggattattagaccctgggtggttgaggttgcagtgagccatgatcatgcctgagt
-gacaaggtgaaaccctgtctcaaagaaagaaagagagaaaaGCCATTGGCTGTACACCTA
-GAGACTGGCCAGTGAATATGCATTTATAGTATGTAAGTTAAAATTAAGTGTTTAAGCTTT
-GTCTGCAGCTGTTTTTGTGATTCTCTGCTGTTCACCAGCGATCCTGATGTCACATTGGAT
-GAGAGAGCTCCAGCTGTATTTTTTTGTTGATAGTGTTAAGATTATAGCTTTAAAAAATTT
-TGTTTTCTAACATAATTAAGGCCTTTATGCTTTGCCTCTAGGTTGATTCTAAAAGTGTAA
-CACTACTAGAAAGGATTTATAGTATTTTGATTATGGAAATATTATTCACTATAGAATAAC
-TAGTGCAGTTGAAACCATATGCACTTTTATGTTTCAAAACCCTTATTGCTGGAAGAACAT
-TTTGGGGTTAAGATCCAGTCCTTTTCATTTTTTACTTTTCTTCTATTCTCCTGTATCAGA
-CTCATCTATTTTTGTTTTTCAAGAACTTTTCACGTGGAAAATGTggtaaacttttagagt
-ctttgcatgtttaaaaatttctatattttgctctgtcaattcattgatagttgactgggt
-attcaaattgtttacctgaagaattttgagagcattttctggactgcttttaaataaatt
-tcagatattattttatccttaaatactttagtatgtgtcttcaaaaaattaggacttggc
-ggggcacgatggatgatgcttgtaatcctagcactttgggaggctgaggcaggtggactg
-cttgaacccatgagttcaaaaccagcctgggcaacatagtgaaaccttgtctctacaaaa
-cattagctaggcatggtggtgcgcccatctagtcccagctacccaggaggctgaggtggg
-agggtcacctcagtccaggagattgaagctgcagtgagccaagatcatgccactacactc
-catcctgggtgacagaagtgagaccctgtctcaaaaaaaacaaaaacaaacaaaacccct
-caatactattatcacaccttagaaaaggaataagaattccttaaaatccgctaatgccct
-gtttatattcacattttcctatttcattagtgctttttacaattggtttcttcaaatcag
-gagccaaacaagatctacatgtagcatttcttactatgtcttaagtcccttttactctcc
-tctatttttatgccactagttttttttttaagaaacctggtcttttgacctctagaattt
-tccccatattctggatctatccattacctcttcatggtatgtattagaccactctagcat
-tgctacaaagaaatatctgagactgggtaatttgtaaagaaaagaggtttaattgactca
-gttctgcaggtggtgtaggaagcatggtcctgacatttgcttggcttctggggaggcctc
-agtgaacttttactgaagcgggagcaggcacttcacatggtgagagagggagcaagagag
-agagttggtggggaggtgccacactttacaacagccagatctcacgaggactcactatgg
-cgagaagtcactacagtgagcgcagcaccaggctgtgagggagctgcccctatgacccaa
-acacctcccaccaggcctcaccttcaacactgaggattacagttcaaggtaagatttggg
-cagggacaaatacccagactatcatggtgtcatttactatctcccgtttttcctgtaact
-ggtagttagagataaagtttcaattagtcagCAGTCACtttttttttttttttttttgag
-acagagtttcactctgttgcccaggctggagtgcggtggcgcaatcttggctcactgcac
-ggtccgcctcccgggttcacaccattctcctgcctcaatctcctgagtagctgggactac
-aggcgcccgccaccgtgcctggctaatttttttttttgtatttttagtagagacgggttt
-tcaccgtgttagccaggatggtctcgatctcctgacctcgtgatccacccacctcggcct
-cccaaagtgctgggattCAGCAGTCacttttaatgtgcaggaactcttcctcattttttg
-gttgcttcatgcctttccttgctttctgaatgcagtgttttcccaaatctctctgaaggt
-actagttagacttcactgttgcttattgttccataccctaaatgatctctgtttcctttg
-gggtcggttctgttttttcatcttttcatgcttttgattttccaaacatgttggaggatc
-ctcaAGAAAGTTAAAACCACTTTCTCTGGAATAATACCATGTAGATTTAAATCCTGCCTC
-Tggctgaacacagtggcttactcctgtaatcccacttcgggaggccaaggcaggaggatc
-acttgaggccaagagttcaagaccagctttggcaacatagtgagaccctgtctctacaaa
-aacttaaaaaattagccaggcatggtggcatgagcctgtggtcccagctacttgggaggc
-tgagatgggaagagcccaggaggttgatactgcagtgagccaaggtagcactactgcact
-ccagcctgggccacagaaagagagcctgtgtcttaaaaTTAAATCAAGACATACAAATga
-atcctgcctctaacagttattagttgcttagtttggcagagtcactggaacctatctgtg
-cctcacatttttatctgtaaaacagggatacagcagtacctgtctgatgggttggttgag
-aggattaaatgagttaatacacatgaagtgcattaaatagtcttagcacgtagttaacaa
-caacttctggtggttTCACTAAGgagcaggggagagaagacagaagaggttggagaggtc
-agggaggtgccagatcatggaggccctcgtgtgctgccacgagttgattctaagagtagc
-gtggagccattggagggGCCTAACTGGTGGGTTCTAATAAAGGAAGAAGCATGGGTGGGG
-CCTACCCCAGACTGGGGTTtgtgtgtgtgtgtgtgtgtgtgtgtgtgCATGGCCATGTGC
-CTGTGTGCAAATATGTACATGTCTGTAGCCGGTGGCTGAGGCTGGACCCCTGGCCAGAGC
-CCATGCTGAGCCCCTGCTGTTCTCTGCAGGCTGTGGGTGAGCGTGGAGGATGCTCAGATG
-CACACCGTCACCATCTGGCTCACAGTGCGCCCTGATATGACAGTGGCGTCTCTCAAGGAC
-ATGGTGAGTGAGGAGGCGGAGGGCGACACTGGGGTGAAGGctctccctttcactcctgct
-tcctctctctcctctggccctcccttcccactctccctctctttgccccCACCAGGTTTT
-TCTGGACTATGGCTTCCCACCAGTCTTGCAGCAGTGGGTGATTGGGCAGCGGCTGGCACG
-AGACCAGGAGACCCTGCACTCCCATGGGGTGCGGCAGAATGGGGACAGTGCCTACCTCTA
-TCTGCTGTCAGCCCGCAACACCTCCCTCAACCCTCAGGAGCTGCAGCGGGAGCGGCAGCT
-GCGGATGCTGGAAGGTGAGGCTCTGCCCTGAGCACCGCCGGACCCAGCGGGGGCCCTGGA
-CTCACTTGAGGGCATAGGGCAAGCAGGGGCAGAGCCCCTGGGTTTTTAGTCAGGGACTCA
-CCCAGAGGACCCTATCCAAGTGGGGAAGAGAGGACCTAAGACACATGGGAGGGAGCATTT
-CAGGGACCCATCATGAGAACAGCTGGCACGGGGAGGGGTGGACTCCGtccaggctccggc
-attcccagctgtgtgaccttgggcaaggttgctcctatctgctgcccagtttgctaaaat
-cataaattgggtatgacagtgatCGTGATAACTAGTGTTTATTCTTAAtttttaacttct
-gaaatgtttcagacctacagaaaagttgctaaattttacaaagtagtacataaagaattc
-ccatgtacctttcatgtgggttttaccacatgtgctttctttttttttttgagacggagt
-ctcgctctgtcgcccaggctggagtgcagtggcacaatctcggctcactgcaagctccga
-ctcccgggttcacgccattctcctgcctcagcctccggagtagctgggactacaggcgcc
-cgccaccacgcccggctaattttttatatttttagtagagacggggtttcaccgtgttag
-ccaggatggtctcgatctcctgactttgtgatccgcccgcctcggcctcccaaagtgctg
-ggattacaggcgtgagccaccacgcccaacccacatttgctttcttttatcattctcttt
-ctatataaaattattttttttctgaaccattttgagagtaagttgcagacatgatgtctc
-tttcccctaaataattcagtgtgcatttccttgaaaagaaaggtcattttcttacattac
-tgggtataacaatccaactcaggaaactaacgctgatacagtactggtatccagtctaca
-gatcttactcagattttaccagttgtcccactattgtcatttatagcaaaagacttggca
-ttctgctgtcatgtctcagtccctttcaaagagtccaggccagtttcttttttttggcgg
-gggttgggggctgatgtttcctccggagtggatcaagtcactgttttggcaggaccgcct
-cagcggtgctcttgggtccctcttggtgcatccttcaggaggcacGGAAGGGCTGGTGTT
-GTGCTGGGTTTTGAAGCTCAAAGGACATAGAAGCATTTATCGGTGGAATAGGGACCCTGA
-CCCTGGGGGAGCCAGGATGCCCACTTGGCCAGATGGAAGCTGGAGGTACCCCCAGGGAGG
-AGGGAGAGGATAGGGGGAGGGTCTGCCTGGCTGGCTCAGGGAGACCCACCCCCATGGGTG
-TGGACCAAGTGGGCCGCGTGGAACCACCACCCTTTAACCCTCCTCCACAGATCTGGGCTT
-CAAGGACCTCACGCTGCAGCCGCGGGGCCCTCTGGAGCCAGGCCCCCCAAAGCCCGGGGT
-CCCCCAGGAACCCGGACGGGGGCAGCCAGATGCAGTGCCTGAGCCCCCACCGGTAAGCTG
-TCCTTGGCCTCAGTATCCTCTTCTGTGCCCCTCCCTTGCCTCACCCTGCCCAGTCGGGCT
-CACAGCACCCTCTGCTCCCAGGTGGGCTGGCAGTGCCCCGGGTGCACCTTCATCAACAAG
-CCCACGCGGCCTGGCTGTGAGATGTGCTGCCGGGCGCGCCCCGAGGCCTACCAGGTCCCC
-GCCTCATACCAGCCCGACGAGGAGGAGCGAGCGCGCCTGGCGGGCGAGGAGGAGGCGCTG
-CGTCAGTACCAGCAGGTGGGCGGGAAAGTCCCTGGACAGACACCTGCAGACCGCACGGGG
-GAGGTGTAGGCCAGGAAGGGAGACACCTGCGCACTGCCGCGCCTCTCCGTTACTGCCTTG
-CCCCTCCCAACCATGCTGCTGGCAGTGACCCTGCACCTGGCTGTGACCCTGCACCTGGCT
-GTGACCTGCCCTCTCTCAAAGGTCACCCTGTGGCTGAGACCCGCTCCCTGGCTGTGGCGC
-ACATCCAGGTTCACATGCCCCACTCCCACGTGGGCTGTGGCTCCATCCCCAGCTTTGACA
-CACCACACGAGTATGGCTGGCCATGACCCCAGCACCCTAGCCATGACCCCAGCACCCTAG
-CCATGACCACACCTCAGCTCGGACCTCACCCCCACCCGTCTGTGACCTAAGCCTGCTCCA
-CCTCGCCGTGACCTCACCCTGGACTCTCCTACTCCTGACCTCTTCCCTCTCGGGCTGGGC
-CCACCCCTGACTTCCTGAGAGCCTGGCCTGGACCCTCGCTGCGCCCTAGGGGGATGACCC
-CCGACCCCGGTCCTACGCCTTAGCCCTACCCCGCCCCCATCGTGACACACGCACTAATGA
-CACAGACATTGATCCCCGAGTGCTCCCCATTCTGATCTCACCCCTGGCCCCACCTGCATT
-CCCCTTGGACCCGGTGCTGCCCCTGGCCACCCCACTCCTGTTCCCGTCTCAGCTCCTCGG
-CTTCGTCACTTCCCCACCCCTGACGTTGAGTGGCTCCACCAGCCCTGGCCCGGGCCCTGC
-CCTGCTACCTGACTCACCACTCAGACCCCGGCCCCCTTCCTTACCTTGCTGCCATTGCTG
-TCTCACCTGGCGCCTTCCGTGGCTACCTGGCCGGCCTCCCCTCCCTTGGCTTCCCCACCT
-CCACCTGGCCTCACTCCCAGCCCCGCCCCTCCCAACCTGCCTGCTCCTGcccatccccca
-ccccccaccccccatcccccagccccacccccatcccccacccccgtcccccatccccca
-tccctacTGGCTCCCAGCTTTGCCTGTGGCTGGTCTGACCCAGCCCTGACCACGCCCCCT
-GGCCCTTCCCCCTTCGGGGTCTGACCCGCCCCCGAGGCCCTGACCCGCCCCGTGGCCCCG
-CCCCGTGTGCCCAGCGGAAGCAGCAGCAGCAGGAGGGGAACTACCTGCAGCACGTCCAGC
-TGGACCAGAGGAGCCTGGTGCTGAACACGGAGCCCGCCGAGTGCCCCGTGTGCTACTCGG
-TGCTGGCGCCCGGCGAGGCCGTGGTGCTGCGTGAGTGTCTGCACACCTTCTGCAGGTGCG
-GCCCCCAGTCCCACCCCCGGCAATGCAGCTtaatcaaagccgccaattacgcagggctgg
-acgtgggtggggccctgtgctctgatacctcattggacgcccgcgaaaacctacgaggta
-ggctccgtctccccatgttgcggacgaggaacctgagggaaagagaggcccagcgcctta
-ccccaggcccacggctcatgagagaagcagcctagacgtgagcgcaggCGTGGGGGGAGA
-CTCCCTTCCCCTCTACCTTTCGCCGCCCGGGCTCCTGCAGCCACGCTGCTCTCAGCCTCG
-CTGTGGGCATCTGCCAGTTTCTGAGTCTCCTGTCATGGCCCCCCCACCCCTGAATGTGGG
-GAACACAGACCCGCTCACCACAGCGGACCCTTGTGGAGCCGCCCCTGGGTGacaggctcc
-gtgcctgcctcctgcagcttacattccagcagagaggctgatgagaatcggataatcgct
-ggttgatgtctttgtgaattgtgtcaaatgctacatacagtacattaagagacaacagga
-gtccttcccagagagggtggtctggaagcttccaaggaggtagccccagagcagggaccg
-gaaggcctgctgtaggtgtggggtgtgggcctggcctgttggaggagactgaggaggtct
-cttggtggctggagcagagggatgaagggggtaatcagagcaggatagagaggtgttggg
-tacgtgagcagcagtgaggagttgggatttgttctgggtaggatgggagtcactggggag
-acatggctgctgttctgagatagactctaggggccagatggatgcagggagcccagcgag
-gaggctcctggagtcacccaggtgggggatgtggggcctggaccagagaatcagagcggc
-agtatggaggcagggtggagGCCTTGGTGATGGGTTGGTGAGAGGGATGGGAAGGAAGGA
-GATATTGAGGAGAAGTCCACCTGGGGTGACTGAGTGAGGCCCCTGGGGTCAGGCCTTGCC
-ATGTGAGGGATGGAGTCCCCAGTGAAGGGGGTTCCTATGATCCTAACTCTTTTCCCCTCC
-CCTCCCCTAGGGAGTGCCTGCAGGGCACCATCCGCAACAGCCAGGAGGCGGAGGTCTCCT
-GCCCCTTCATTGACAACACCTACTCGTGCTCGGGCAAGCTGCTGGAGAGGGAGATCAAGG
-CGGTAAGGCCTCAGGGTGGGAGACATACCCCAAGTCCCAACTCCTAAGGAACTGGGCCCT
-GAGCAGGCAGCAGACATCtttcttttctttcttttttttttttggagatggggtctcact
-atgttgtccaagctggtctcaaactcctgggcttaagcgatcattcatcctcagcccccc
-agaCATTTTTCAAGAGCTTTGTCCATGTGGGGTGTTGAGACCCCAAGCAGAAAAAGAATT
-GAGGGGAGTAGCTAGTCAAGAAACCACATCTATGAAGGAaggacagcagagttgttaaga
-atcagggactcggctgggcgtggcagctcacacctgtaatcccagcactttgggaggatg
-aagtgggcagattgcttgaacccatgagttccagaccaacctgggcaacatggcaaaaaa
-tattcaaaaaatagccaggcgcgggggcatgcgcctgtagtcctagctacttgggtgggg
-tctgggatgagtgggctgaggtgggaggattgcttgagcctaggaagtaaggttgcagtg
-agctgtgattgtgccactgcactccagcctgggcaacagagtgagaccttgcctcaaaaa
-aagaaaaaaaaaattagtcagggaactctggagcctggtggcctgggtgtgtgaccacaa
-gtcagatatttaacctctctatgcctctatctcatctctgttagagtcagagttacagct
-tctatttccaggattgcaaagattacagtagaggatatgtgtatagaattcatagtagta
-cATccaggcgcagtggctcattcctgtaatcccagcgctttgggaggccaaggcgggtgg
-atcacctgaggtcgggaattcgagatcagcctgactaacatggagaaaccccatctctac
-taaaaatagaaaattagccgggtgtggtggcgcatgcctgtaatcccagctactcaggag
-gctgaggcaggggaatcgcttgaaccccggaggcggaggttgtggtgaactgagatcgcg
-ccattgcactccagcctgggcaaccagagcgaaactccgtctgaaaaTATATATATATAT
-ATTTAGAGTAGTGCTTGTCACATAGTAAGCCTTtgttgttgttagcgcttactgtgtaac
-aaatcactgcaggctcaaaacaacagtcatttattcagctcataaatctgcaagttagga
-cagttggccctctgtatctgtgggtaccacactggagaattcagcaacggtggatagaac
-atattcttacaaaaaaaattacaataaaaaacaaatttaaaaaacaatacagcataaact
-atttgtataacatttatgttatattaggtattataaataatctacagatgatttaaagtg
-tatgggaggatgttggtaggttgtatgcaaatactgcactattttatataaggggtttga
-gcatccatggatttgggtatctgcaggggtcttggaaccaattctctggataccgaggga
-tgactataatttgggctggacttacctggatggttcttctggtctgggcagggcctcgct
-gatttcacctgggcctggctggtgggtcagccgcggtggcctggtttataatggtctcat
-ctgtgatgactgggatgactggggcctccttccacttcaatgtctcacccaccagcaggc
-tgcccgggccttctcatgtcatggtggtctcaaggttccaagagcagccatggggagccc
-cagtgcatgtgtactttctaagtctgctcatttctcacttgacactgtcccattggccaa
-agcaagtcccatgctcaagcacagagtccattgggaagggaccacccaaaagtgtggaat
-cggggagacagaaacaaattggagtcaccaCTCCGCCAGTCTGTCACAGCGTTATGTGTG
-TCTGCATACGTGTGTGCTTGCCGCTGGCGCTCTTCATGAATTCGTTAGCAGGTTctctgc
-ctggctgctggtgatctcgagcaagttgtttcccttctgtgggactccatttccttatct
-gaaaagtggacagttgggcttgatTCATGGTTTTCAAACTGCTGGGAAATGACCTTCCCA
-GACTTGGGCACTGTGGGTTCCCAGGCCAAAACATGGCAGCCGAGGCCCAAATGGGAGATC
-CCCACAAAACACATACACAGACCTCCTCTTTATTTCTGTCCCCCCTGCCTCTCTCCTATG
-CCCCTATTTCTCCTGAGAATGCTCCCAACTTCACCAAGTGTTTATGGAGCCCAAGAGGTT
-CTGCCCCTGGGGAAAAGGGGGAGGCAGAAGAGGTAGAACTTTGGGAGTTCACAGCTCTGA
-TATCAGGAGCAGCCCCATTTTTCTCTGTTGTCTCTGGGTGGTTGCTGAGGCTCCTTCGCT
-CTGGCCTGGAGAGACCTCATGACCAGTCATTCCATATGTCCCCAGCACCCATAGCCATTT
-GCTTAGAGGTTTCCCTGTGGAGTCCACCCCAGCCAAGGGGCATTATGCTGGGGCCAGGTT
-CATGCCAAAGGGCTGCATGAACTTCCCTGGAGCCCACTGGAGTTGATGTGAGTCTCAGAA
-AATGGTCAAGTGTGACAGAGAGAAGGAGGCAGGGATCAGCCAAGTAATGTAGTGGAGGTT
-GTTTTTACAAAAACAGAAAAATATGCCTCACCACATAGAACCAGAGCAGAAATCAGAGAG
-AAAATCACCCACAAACCCAGGAAATCCTCCAATTGCATTTTATCTTATTTCCTTCAGTAT
-CTCTGGGCAAAttttttttttttttcctttttgagatgaagtctcactctgtcatccagg
-ctggagtgcaatggcgcgatctcagcccactgcaagctccgcctcccgggttcacgccat
-tctcctgcctcagcctcccaagtagctgggactagaggcgcacaccgccatgcccagcta
-atttttgtattttcagtacagacgagttttcaccatgttggccaggctggtcttgaactc
-ctgacctcaggtgatccacccacctcggcctcccaaagtgctaggattacaggcgtgagc
-caccgtgcccagccAGATATGATTTTTTAAGTCAACtttacttaagtatactttgcacac
-aataaaatgtactcattgtaagtatgcagtcaggtaaattttaacaaatgtaactctcgt
-aaccaccaaccactgttacatataacatAGGCATGATTTCTGCCTCATTGTAACCAGCAT
-GGATACAATCGCTTTAGCTTTTGTTATTTTGCTATAGAATTTTTCTAAAGATTATTACAA
-ATCTCAATAGCACATATACTGTTTATACCTCTTAGTTCTAGTTTCTCAGTTTGTAATACT
-CCTTCAAGGAATGTTTTGCATGGTGTAttcttttttttttttttttttgagacgaagtct
-cactctgttgcctaagctggagtacattggtgtgatcttggctcactgcaacctccacct
-cccgggttcaaacgattctcctgcctcagcctcccgagtagctgggactacaggcagatg
-ccaccacacccagctaatttttgtatttttagtagagatggggtttcactatgttggcca
-agctagtcttaaactcctgacctcgtgatgcgcccgcctcggcctcccagagtgttcaga
-ttacaggcgtgatccatcattcctggctGGTGCATCTTATATattattttcttgggataa
-agttaaagaagtgggatgggtaccaaagggtcagaaaagtttgggatggttgaaacgtta
-ttgccacattgctttctcagtgctacgtactagcttactagtttgtttaatttttatttt
-ttatttttgcgggtacatagttggtgtatatatttctggggtacatgaaatactttgata
-caggcatgcaatgcgtaataatcacatcatggagaatggggaatccatcccctcaagcat
-ttatcctttgtgttacagacaatccagttaacctctcttagttattataaaatgtacaat
-taaattattggctacagtctgttgtgctatcaaatactaggtcttactctatttttttgt
-accaatttgccatccccactcccctgccacgcctcactaccctttgcagcctctggtaag
-catccttttactgtctgtcctcattagttcagttgtttcgatttttagcacctgcaaata
-agtgagaacatgtaatgtttgtttgtctgtgcctggcttatttcatttaacataatgacc
-tccagttcttccatgttgctgtaaatggcaggattgcattcttttttgtggccgaatagt
-actccattgtatatatgtgccacgttttctttataggatactagtttaatcatgtctttc
-ccaacattgcttattatttATGTTCttttctttattgtgagaaaatagacataacattta
-ccattttaaccagtttttagtatacagttcagtggcattaagtacattcacactgttgtg
-caaccatcaccaccatccacctccagaacttttAGAAATTCCCCCCACTTTCTTTCACTT
-TCTTTTTACTTTTCTTTTCCttttttttttttttttttttttttttttagctaggatttc
-attctgtcacccaggttggagtgcagtgcatcagtcatggctcactgcatccttgacctt
-ctgggctcaagcgatcctcacaacccagcctcccaagcagctgggactacaggtgtgagc
-accacacctggttattttattttttaaaaaaattttttggtagagatgaggtctcactgt
-atttctcaggctggtctgaaactcttggcctcaaggaatcctcctgccttgactgacctc
-ccaaagtgctgggattacaagtgtaagccaccacacctggccTAAAATCCACTCTTTGAA
-TGGAGTTTTTCAACACTATGAGGATTACATGAAGAAAAGAGCCTGGGGCTGGGTTGGAGT
-TTCTGGGCTGGGGGCTTTCTGGAGGGTATTTAGTGGTCAAGGGTCATATGTCAGGTGTTC
-TGAATCCTGAGCAGCAAGGACATGGTGTGTTGGCAGCTCCTGACCCCTGAGGATTACCAG
-CGATTTCTAGACCTGGGCATCTCCATTGCTGAAAACCGCAGTGCCTTCAGCTACCATTGC
-AAGACCCCAGATTGCAAGGGATGGTGCTTCTTTGAGGATGATGTCAATGAGTTCACCTGC
-CCTGTGTGTTTCCACGTCAACTGCCTGCTCTGCAAGGTGGGGCCTGCAGGGACTCCCCCC
-ACCTAGTCACTGTCATCTTGCCTGGAGCTCACCACACTGCAGTGCGTGTTCTCCTGGGAA
-GGGAGCTGTGACACTGGCCTGCTGGTCATGACTTAGAGCTACATGTCAGTGGGAGAGTGT
-GGCTTGAGCCTGAACTGagccctggccccacagacggagtcccagccccagccccagatg
-gagcctcaaacctaggcagccctggttcacaatggagccccgaccctgggccagtctgac
-cccagtcacagactgaatcccagtcccacattgagccctgatcccatccAAGTCCATAGA
-CTTGGCCTCTGACCAAACCTGACCCTGCACTTGTCACTTAAGGTGGTCCCATATTCAGCT
-CAGACCCTGAACCGAGCTCTGACCCTGGCTTCTGACTGAATCTGTGACAGACTAAGGCCT
-GACCCTGGCCCTATACCACGTCTCCACCCGTGTCCTCAACTGAGTGCTGACCCCAAACCT
-AGACAGCCCTACCTGATCCTTCCCCCAGGCCTGTCCCCGCCGCTTCATCTCAAAAGTTGA
-AGGTGAGGAGCCGGTAAACAGGTCTGGAGCCTGGTCTCAGACTCAGCCTGAGCAAGCTCA
-GTCTGGGGTCATTGGGCCTGTAACCCCGGGCAGGCCCTTGTTAGGGATGCAGGGTCTCAC
-CCTAGGGGTATAAGGGATTTCTGTGCCCATCAGAACTTaaataagctgggtgtggcagca
-catgtcagtggtcccagctactcaggaggctgaggtaTATTTTGCTGTTAGCATAtgtga
-tgaccttgacttcacctccctggcgccaatatcctcttctgtaaaatgGCTTATGCATTA
-CAAAGTGAGGTCCTGCCAGTGACTACACCTAGAGGCATTAAGTGCCTTTGTGGACTCCTG
-CCCTGCACCTCACCTCTCCCAGCTTCTTAACCCCCTGAGGAACCTTCTTACCTTGAGTCC
-CTCACCCGCTACAGGCCATCCATGAGCAGATGAACTGCAAGGAGTATCAGGAGGACCTGG
-CCCTGCGGGCTCAGAACGATGTGGCTGCCCGGCAGACGACAGAGATGCTGAAGGTGAGGC
-TGGGACAGGGCCGAGGCCTAGGGATTTTAAGTTCTGGGATCCAGGTGGGGGCTGGGGGCT
-TCCCAGTAAGGGCTGTGCTCACACATCCCTGGAGGCTCTGACCTCCCTTCTGGCTGTCAC
-TCCCATCCGGAGGTGGGACTTAGGCCGAATGGTCATGTCAGGAAGAGCGTCTGGGTGGAG
-GGTGGAGACCACAGGAATGAAGAGGGGGTTGCTGGATGGAGCCTGGCCTGGCAGAGCCAC
-ACAGGAGAGACTCCACAGCTCTAGAGGGTCACCACCTTCTCCCTGCCATGGGGAGGGGCC
-AGGCTGGGTGACTGCCCCAGCCCCGCCCCAGGGCCAGCACCTGCCCCACTCCAGGTGATG
-CTGCAGCAGGGCGAGGCCATGCGCTGCCCCCAGTGCCAGATCGTGGTACAGAAGAAGGAC
-GGCTGCGACTGGATCCGCTGCACCGTCTGCCACACCGAGATCTGCTGGGTCACCAAGGGC
-CCACGCTGGGGCCCTGGGGTGAGTCTTTGCTCGTGGTGGTGTGGAGAGGGTGCCCTTGTG
-GGCTTTGCCTTAGAGGagggctgggaaaactacagcccatgggccatatccaacccagca
-cctgaatttgtacagctcccgaggtaagaatttttttttttttttttgaaacggagtttc
-actcttgttgcccaggctggagtgcaatagcacaatctcagctcactgcaacctctgcct
-tccgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcatgcg
-ccaccacgcccggctagttttgtatttttaggagagacggggtttctccatgttggtcag
-actggtctcaaattcccgaccgcaggtgatccacctgcctcggcctcccaaagtgctagg
-attacaggcgtgagccaccgggccgcaagaatgttctttacatctttaaatggttgaaaa
-aataccagaagatgactattttgtgacgtgaaaattacatgaaatccacgtttcagtgtc
-cgtaggtaaagtgctttggagcacagccgtgttcattcattcacatgttggctgtggttg
-cttttacactacagaggcagaggccgtatggctgcccggcccaaaatgactggccctttg
-cagaaaaggtttgcccactcctgCCCtagaggacagcaagtaaaggttcgatctggagtc
-agaggtggattggcccctggctctggcacatactgactgtgtgattaggctgcctgccac
-tcacctctgtcagccccatttcctctgtgaaatggagatgatagctgggcttatctcagg
-cttgttgtcagaatcaagtggaaaaattgcaagagaagtgcttagagagcctgtcacttg
-gtgagcacccttgcagatggtagctgtcgttattAGGGGTGTGCTCTGGAATTGGGGGCC
-TGTTGCTACGTTCAGGTAGACTTTCAGACAGGTGGAGGCAGAGGAAACTGCCCTCTCGCA
-TGCTGACATGTCTAGAATATGCAGAGTGGTCAGATCCTCTCCCTGGCCTGTTCCCGGATC
-TAGGCGTGGGTAGACTGAGTGCTGTGGGAGCCCAGAAAAGGCCTCAGTGACTCTCCATCA
-GGTAGCTGAGGCTGACCAGGCCATTCTTGCAGGAGGACCTGCAGAGGCAAAGGCCCGGGG
-TGGGAGAGCGCTCGGCTGTGGGGGCAGTCTCTGCACTGCGCTGACATTCTCTTCTCTTCC
-TCCCATCCTCTAGGGCCCAGGAGACACCAGCGGGGGCTGCCGCTGCAGGGTAAATGGGAT
-TCCTTGCCACCCAAGCTGTCAGAACTGCCACTGAGCTAAAGATGGTGGGGCCACATGCTG
-ACCCAGCCCCACATCCACATTCTGTTAGAATGTAGCTCAGGGAGCTTCGTGGACGGCCTT
-GCTTGCTGTAGCGTTGTAGGGGCCCTGCCTGCACTGCGGTTGTCCACGGTCACATCTGCC
-CCAGTGCCTTTGTCCTTCCCTTGGGGCTTGCCGGCCAGACTTCTCTCCCCTGCGGCTCCC
-ACCTCTGCCTGACCCCAGCCTTAAACATAGCCCCTGGCCAGAGGCCTTGCTGGGTGGAGC
-CTCTGTGTGACTCCATACTCCTCCCACCACAACACTCATCTGTCAAACACCAAGCACTCT
-CAGCCTCCCCGCCTTCAGCTGTCAGCTTTCTGGGGCTAACTTCTCTGCCTTTGTGGTTGG
-AGGCCTGAGGCCTCTTGGAACTCTTGCTAACCTGTTCAGAGCCAGGAAGGAGACTGCACA
-GTTTTGAAAGCACAGCCCGTCAGGTCCGGCTCTGCGTCTCCCTCTCTGCAGCCTGTGTAA
-GCTATTATAATTAAAATGGTTTTCCGGGAAGGGATGAGTGTGATGTCCTTGAGAGGAAAT
-GAATGTCCTGGCCTGGGACTCTACACACAGGCAGGATCCTGAGGTCTCTGGGAACTGCAT
-CAGAAAGTTGACTTGTCAGTCCATCTGTGGTAGAATGAGGCTGTGACTGAGCACTGGGAC
-CTTTCTACCAGATGTGGACCCCATGCCCAGCCTCAGGGGCAAGGATGCTCTTGGGTCACC
-GTCAGCCAGGACAGGTGGAGTGTGCAGTGTGTCAAGTCTGCAGAGAAGGATGGGCTTAGG
-GGCGGGAGGGGAAGTCTTGCCACTCCTGCTCCCTTTTGACCTCTCAGCAGGCATCTAGGG
-TTGGCAGGTAGATAGTTCAAGAAGGAACGAAGCTGCTGCAGTTGAGGGGTGGGGTTGTCC
-ATCCTATTTTCTCGTCTCAAGCAAGATGGCACAGTATCGATTCAGCAGTATTTACTAGAA
-CCCACTCTGTGCTGGTCGGAGGTTACTAAGACAGGGTCCTGGGATGTTCATTCTCTAAGT
-CTTTCCTCCGCTCTGTGACCCACCCTCCTTCCCCTTTTGAGATCTGGTATTTGATGCCCA
-ACACATTGTCCACGCTGTGACGTGACCATCATCATAGCAGGCAGAGGGCGCCTCTGCTGC
-TGAAGGCCTGTGATTTTGTGGGGAAGGGCCTGTTCTAGCAACTGGAAAGGCACTGCCACC
-TGCCGTTGGATGCCAGGACTCAAGAGCTGGCCCCAGTCACTGTGCGCAGAGCTGTCTGAG
-AATGTGTGAGTGGACTGGGTCCTTCGGCACTGCCTGCATTGGCTCAGGGCAGTCAACCGT
-CGCAGAGGATGAGGGGCACACTCAGGCAGCCTCCCCGGCCCTGGAGGCAGAAAGGCCCAG
-GCAGAACCACTGACTGGGAGGAAACAGAAAAAGCAGAGGAGAGCCAGGCTGCAGGCGTGT
-GGATGGGACCAGCTCAGGCAGACGCTGTCTCATACCCACTCTCCCCTCTCTTGCCAGGGC
-CTGGCCTGGTGTCTCTCAGGAGCCTGGGCATGAGACAAAAGCAGAGATTGTTCTCTTGTG
-GTACCACAGGCTGTAACCAgtccacccagtgttgttttagaaatttaaatcggttgccca
-tctttttaaattggcaacatcgtttaccacattaaaatctagatgccctgcttctcttga
-aaatgtcaaagcttggtaatgccaggtcctcacttctacctggggggaatggagtcacag
-agatgtcaaatctcttcatggggtgtacaccctccagtttgccacagtcctcaccACCCC
-AGGACTCACGCCGAGGCCTTTCCAGTGCCCTTGCACCATCCTTTTTCTCGTAAGAGGAAG
-ATGAAGTGGGGCTCTACGCGCGGCGTATCACAGGTGAGGGCGAGACCAGCAGAGAGGGCT
-GTGCTGGCTGTGGCTTTGCTCGGCCTGCCCCATCCATGCTGCAGTGGTGCGGAGGAGCAG
-GGAGCTGTGTAGGGCCAACCCCGGTTCCTGCCTCAGCTCCACCCGCCTTGCACCTGCAAG
-TGAAAGGTCTTAAGACGAGCAGGCCCAGGGCACCCTCTACTGCAGGGTCAGGTGGAGGTG
-CCTCCACCTCCCAAGGCTCACCCATGCCAGGGGCCCAGAACTTGAGAGGCCAGCACCAAC
-TCTCCAGGGCCGAACGAAAACCAAACCCCAGGGCTTTGGACTCAAACCATCGAGAGGAAG
-CAGCAAGAGGTCCCAAAGGTACTTGAGTGACACAATGATCATCATTCTCTCCTCAGGGGC
-AGGACAGGGGCAGGGGAAGGTGAGTGGAAGCCCATTGCTCAGATAAAGAGCAGCTGCCAC
-GGAGGGTAGCCCGTCGGCCTATGCCGGCGCTCACTGGTGTCTTCCTCTAGTGCTTGGGGC
-TGGCATGGAATCTGCTCAAATGCAGGCAGCTGAAGGTGAGCCCGCAGCCTGGTGATCCCA
-AGTGCCAACCATGAGGAAGTCTGGAGAAAAGACCAGGGAGCAGGGGCCCTCGTGAGGAGC
-AGGAATTGGCAGCAGGGGCCACCAGCAGAACACCAGAGGGGACAGTGGCAGGGGGAGGAA
-GATACAGCCAGGCTGGGTCTCAGCCCCAGCTGAGGGTCTCACCTCTTAGCTGGTGAAGGC
-TCCGGCCTGTTCCTGCTTTCGGTCACCACTTCATCCCTGGGTGATCGTGGGCCCGGTGCA
-GGGCTGGCTACAAGTGTTTGTTGATTGGTAACTGCTCATGAAAATGGCAACAGCACTAGC
-ACAGCTTCACAAATAGAAACACATTTCACCAACACCCTTGCAGGAAGCCCTCCAGGAGGG
-CCAAGACCATCCCTGCTTTACTGTTATGGACGTGAGCCTCCGAGAGGCAGTGACTTAGAT
-GCTCACCCAGCCAGGAAGGAAGGAACACACTCGACCCTCAGTCTAAGACCCCATCAGGCC
-ACTAATAATTCTCCCTCCAAACCCAGCTCAGGTCAAGGCCTATCTTCACCCCCAAATCAT
-CCCTAAGGCAGCCTCAACTCTCCACAGCACTACAGCCATCCTGCCCGGCCCCAGTGCTCC
-ACAGACCCTAAACCCGAGCCCTCCCGGGCTTTGTTGGCCCCAAACCACCTACACTTGTTA
-CGTGTTATTTTTACACTGGCGTTTCCCCTCAGCCTTGCATACTGTGTGGTGTTGTCTGAC
-ACCACTTTTCCAGCTCtctgacaccaactggggctagtgtcaggttccacagattaaagg
-gctcagtcccacacttccgatggagtcacagatggggtgcccaggctacccacacttcct
-gggctacccacacttcctgggctacccacacttcctggccaactacacattcaggggttc
-ccatgactccaccccctcaggttcaataatttgcctgagtgactcagaactgaagatcac
-cctgccctgacgcttcctggtgtggtgtcctcaaggatgcagtgtgggcaggaacagcca
-cgcttgagatgaacagggttagggatgggagCGACTGGCAGCCACTGCAATCTCAAGTTT
-TGGGGttttttttgttttttttttgagacggagttttgctctgttgcccaggctggagtg
-caggggtgcagtcttggctcactgcaacctccgcctcccaagttcaagtaattctcctgc
-ctcagcctcccgagtagctgggattacaggcacccgccatcatgcccggctaatttttgt
-attttagtagagacggggtttcaccatgttggccaggctggtctcgaactcctgacctca
-ggtgatccacctgcctcggcctcccaaagtgctggaattataggcgtgagccaccgcgcc
-cagccCTGAATCTCAAGTTTGTAAAGTGCTCCACCTCTGTCACTCCAACTCCCAGGAGTC
-ACTGCTtgggattgaaagtttccgccctcgaatcacctggtctttctggtgcaggagcaa
-ccccgaggcaatctaggggccctgctctaacgaattcattagcatgaactcaaatgggct
-ggaaaggggttatgaataacaaaagacactcaccactcacgaaattccaagggttgtagg
-agacccgtgttaggaacccaggagaaagaccaaatatttcttagtatcccacaCATACCC
-TTCCTTTAGTTCTCCAATTATCATAATTCTATTCATCCTTCACATTCCACCCTCACCTTC
-TATGAAAGTGCCCTGAATTTGCTGCAGGATAGATTGCTCCTGGAGTGCAGCTCTGGTGTG
-AGCTTTCAGAGGCAGCGCAGTGCCCTGGGCAGCCTGCGTAATCCACGACTGTCAGATCAA
-AGGGCAGTGTGACCCTGGCCCACAGTGGCAGGAGCTGAGTGCCACTGGCTTGGCCCCGGG
-AACCTGCGCATCTCCCCTCTGAGCCAAGGAAACAAACAACACAGACAACAGTGTCTCCCC
-GATGGCCCCATCCCCAGGGTGGAGGCCCTGCACCGGGCACTGCTCTGCGCGCGCGCTCCC
-CAGCAGCCAGCAGTGTCTGGAGGATACTGGAAAGCTTGGCAAGAGTAGGCTGAGCAGCTC
-CTCTGTGGACAGAAAGGGCATGTGGAGAAGCGGCACATCAAGCTCTGGTTAGGATCCAAA
-ACCAAATGCCAGCTCCTAGGATCCCCAGACCAGGGTGTGAAACACACCAAGAGCACCCCA
-GACCCGCACCAGTTGTGTCGACTGTGACAGTACCCAGAGTGGAAAAAACATGAActcaaa
-ctgtgttttcctccactgctctctcaataccaacagacatctgtggccaaatgtgttggg
-gatttctcccctgacaccaagcaagcaagcaattctgcagcctacatcagctgggtatcc
-tccaattcaattcagtgctcaccctacctatagtatctggaaatggaatccacaggttca
-aggctctgtcccacaagaccgccgcctctgccacaacattggactgaccaccctctttgg
-gtggcatgatttgccaagagtggctcacagaactcagggaaacttatgtttaccagttta
-ttacaaacattattagaaaaggatacaaataagtaaacagccagatgaagatacacacag
-ggtgaggtctggacgggtcctgggcaaatgctggagcttctgtccccatggagtgggggt
-gcgccaccctcttggcacatggacaagttctcgttcccctccctccacatgttcagctct
-tcagaagctcccgtgttcctgggccttttatggagacgtcattggataggcatggctgaa
-gcatggcagctgtgttgagatgaaactggacaaaaagcataaggtctaaacccagcaagg
-cctgtctgtccagatgcttcttggcctctctgtgcagcgttcctccttccgggtatgggg
-cagcaccctctctggaatgagggtcttatgagctacagtcagattaaagtctggtgttga
-gcaagtgaaatggggcaggagaaggtcacagacagagattccgttttctgaggcctgcag
-tgtcccaacattataacaaagggttatgggagtgatgaaccaggaactgtggacaaaaac
-atctacacacgtataaaatatcacaGTGCCCTGGGCTGCAGCTGGAGTGTGTGGGTCATA
-ATtcttgcagatgaaacagaaacagcaagactgtaggtactgcccaaggtctcctagcca
-gtcaaggctgaccaggagtcCACAGACCATGGCACAGTTCTGGGCCTGACATGGAAGGTG
-GGAGCATCCAGATCAGAGACCATTCCCACTGAGCGGTGGCCAAGGACGGAATGACAGAAG
-AGGTGATTAGTAACCACATATGGCTGTTTATTTGATACAGGGCTCTGTACAAAATATTTA
-CACATATTCTTTACAGAATAAGTAAACCACCTGAAGGTAATTAGATAATGCTTTCTTCTC
-AATGACAGGGAGAATCCTGGTGTCAGCAAAGTTAGAAAACAGATAAACATTCTCCTTCCG
-AGGCCACAACTCAAGCAAATGCCACTTGCTTCCTAGGATCTGAAAAGCTGTGGCCTTGGG
-ACCCTGGTCACATGCACCTCCTTTCCTCAACCCCATCAATTCCTTCAGTATTTACAAACA
-GGCTTGAGTACTTGTGGAAGGAGGGGCAGCTGGTGCCGCCCACTGAGAGGATGACAAGAG
-GGCCAGCTTGCTTTGGGAGAGCACTGGGAATATCTGCCGCATCATCACCTCTGGAAGAAT
-TTCCTTTGCCCTGATGAATACACCACTGTCTAAATTAATCCATCGACATCACACTTACCC
-CACAGTGGGGCTCCTGAGCCATGGACAATGATCCATCCCTTTGAGCTTTTTTTGGTTTTA
-AAGTGCGTAGTGGTggctgggcgtggtggctcacacctgtaatcccagcactttgggagg
-acgagacgggcagatcacctgaggtcaggagttcgagaccagcctggccaacgtggcgaa
-accccatctctactaaaaatacaaaaattagtcaggcgtggtagcaggtgcctgtagtcc
-cagctactcgggaggctgaggcagcgagaattgcctgaacttgggaggcggaggttgcag
-tgagctgagactgcaccactgcactccagcctgggcaacagagtgagactccatctcaga
-aaaaagaaaataataataaaataaaTAAAAATAAAGTGCTTAGTGTAACTCAGCGGACAG
-GGCTCCCAGCTGCTCTGGCACGTGGGACACCCTCCACCCTGCACACAACAGGCATGCAAA
-GAGGACTGGATATGGTGGGGTAGAGTGCTTCTGGTGTGTTCACTTTAAGAAAACATCTGC
-CAAGAGAGAAGAGTGCCCAGGAAAGACCAGGAAAATACAAGTACATGGCTGCTTCATACC
-ATATACCCCAATTCTTTAAAGCAGCAAAAGGCACTTTTTTTTTCAGGCCAGAGTGAATCT
-AAAACAAACCTGGCTTTGCTTACAGGGAAGCTGTCCCAGAAGGACTGAGTGATGCCTCTT
-GTTCCCTAAGGTCTGGAGAGTCTTTGCAAGTTTCCAACGACATTTCCAACCAGGTGGGAG
-AGACCAGCAGTTGACGAGTCAAGTCAGACCCAAAAAACGACGCCAAGGTAGTGAGTGGGT
-GCCTATTTGGGAGTAGGATGATTTGAGGAAAACAGGAAGAAAAACCGGTCAGAAAGTGGC
-ACTTTGGAAGTGGAAAGCTGTTTGCAAATAGCAACTCTGGCTAAAGCGAAAATGTTAATC
-AAGTAGAAAGTAAAATTCAGGATCTTAGAAGCTCATCCTTCTGATGAGAACTATTTTTTT
-TTCCGTGAAGGAACTATTATTACTTTAAAAGTGAGGGTAATTTACATATGGGGTGTATAT
-ATTCTAAAAATAGTAATAAAAGTACCTTTTATAAGCAATGTTGTGTGGCTTGTAGAAGAA
-AGCAGGGAGGAAAAAAAGGCAGGCAAAACTAGTCTAGGTCTAGGCCCTAAAAATGAGCTT
-CCTTCCCACTTGACTGGAAACGCCCATGTGATTTCTAGGCTGAAAATAGGTAGGATTTAA
-CGAGTAACCTAGTTCCCTTCTGTCTCTGATTTCTGATCAGCTGATGGAGCTGCTAGTAAG
-AGGGGCCGATCATGCTCCCAGACGAGTCCTTTGGCCTCTTGCTCTCCATCCCAAGCCTGA
-CTCCTTCAGCAGCAGCCCCCTCCTTCTGTGTCCATCTGATGCAGGCAAGCAGGAGCAGTA
-AGAGGGCATCCCATGTTCCAGTTCACCTTCTATGGGGTGACTAGGAGGTTCCCGGTAACT
-AGGGCAGCCCAGGCCCAGCAGGTTGCAAAAGCAGCTGCAAGCTTCAGAAACCCACTTCCT
-CCAACACCAGGGAGGTGGCAGAGAGCCCATCCAAAAGCCCACTGGGAGAGGCATAAGATT
-CTGTGCCAGGCCCCCAGGTCCCCTCTGTGTCAGGTAGGCTCTGCTACTGGCCTCTGAAGT
-AAAGGCAAACACAAACGGGCAGGGCAGGGTGGCAGGAATAAAAAACTCTGGACAGAAACC
-CTTTTAATAAAGGAAATTCCACCCCTCCCAATCCTTCCATGGAAGGGTGAGACCTTAATG
-TGATGTAAGAGGAAGGTCTTCTCTGGCTTTCAGGGAAACAGCTGCAGCTGAAACTTAGGG
-GCCCATTCCAGGGCACTTTTCACCACAGCCAGTGCAGCCGCTCCAAGTGCCACTGTCAGC
-CCCATCACTGCCAATTTCACAAAGCGGTTGGTCCTTGGCTTGGTCAGGACATCTTTTGTT
-CGATCTTCAGGCCGCAGAAGTCCCCGAAACCGCTGCCGCAGCACCATATCAGGCCTCTGC
-TGGGCTGATGCCAGCTCAAAGTCTTTGAAAGTAGAGGCTGCCGTCCTGCAGGGGAAAGAG
-ACGGAAGGAAGGAAGTGGTATGAAAGAGGAGGAGGAAAGCAAAACTACACCACATAGGCT
-GCGGGCAGAGCCTTTCATTGCTGGGAAAGCTCTTTATGATAAAGACCCATATGTCTACAG
-TGGGGATTCCACTGGCCTAAGCTCAGATCTCTGGAAACATGCCCCAACCCTATCCCACCA
-GACACAAACCTTCCCTCGCTTCTGCTCATTTACAGCCACCCCCATTCAACCAGTGTCCCA
-GCCTTGCTCACCTCTCAGCTTGCTGTTGGGCAGCGGCCTCCCGAGCAAGTTCGGATGGGG
-GAAACTGAACAAAAAGGTCTCCTGCTCTGCTGATCAGTGTCTCATAGGGCAAGTCCTGAG
-GGATCTGGGACAACAGGTGGTGGACCGAGGCCATGTCACAGTCACAGTCCAGGACTTCCT
-GCTCGCGATACAACACAATCTGTGGGGAGGTAGTAAAGCCTTGCAGTCAGAGGCCAGACA
-CACAGGGCCTGGGCCACCTGCACTCCATTATCCTTGCAGATGAATTTAAACTGGTAACAG
-ACAGGACTCAGCCCAAATGTTGAGCAAACTCTTGTATCCATCAAGGAAGTAATAACATAT
-ATACGCTCAGTGCTACTCCTACTCTCTGGCCCTTCCTGCAAACTTCCACCACATGACATG
-AAAGGCTGACCAGTTACAATCTAAGTCCTTCGGGCATGCTGGGCTGCTCAGGTGTCCCTT
-TAAGTCTTGAAAGAAATGAAGGAGATTCTTTTAGGAGAAAGTAGGAGAATTATTGGGAGA
-TTCCTGGAGCTCCAGCATAGAAGAAATGGTTCAAAACAGTAGAAAGAACAGTCTTGCTCC
-CTTTAAGCATCTTCCTTCTGACTGTTGGTCCACAAATCCACAGATGCTCAAGGGACCAGT
-GGTCATTGAAGGACTTCCCTGAATTCCCATCTCCACCCCATCCCTCAAGACCCTTCTACT
-AACTGAAGCCCCTACCCTCCACCGCAAGCCGCCTCCCTTGTCTGTCATGACACCAGATCT
-CTTCTTTTCTTAAATCTGGAGTTGACAGCTTACGCTACTATTTCCCTAATTGTGTTCATC
-AGCTGAACATATATTCCAGACAATGTCAACAGGAACCCTGACAattcacaatgcagatta
-gcattttaaaggttcagaagtgtcatgcagcaaaaaaaatctgattttgtttatacccag
-catttcccaacttactATTTTTTGTGTGTGACACCCCCATTAATACTGCACAGAATGGTG
-TCCAGGGACACCAGCCTGGGAAGTGCTGTCTTTTGCATCTTTCCATAATCCCCAGGTTTC
-CCTTCAGGGAAAATGACCACAGTGGGATGGGTGATGGTGAACCCAGCTGCTGGCTCGTGG
-CCTGTACCTACCACGGCTGCAAAGTAAATCGGCATCAGTGGGTGGCAGGCCAGGAAGAAG
-TCATATAACCGCACGACGTGCCTGAAGTCAGACAGGACATGCCCAAACCAGGTGATGAGC
-CAGCTGAGGGCAAAGATGGTCCCTACCTCAGCACTAGAAACAAAGGAAAGGCAGGTGTCA
-GGTCCTGTGGGCCATCCCTTCCCTCTCTCTGGGCCTTATAGCGCTGGTGAGAAGGAAGCA
-TTTAGGAATAAGATTTCTGGAAAATTCAGTTACCTAGGAATTCAGCATCTTCTCCTTACA
-AAATATTTAATACAAAGTCTTTAAGGTGTACCACAACACTAACACCACAACAGGGTCCTG
-GCTGCTTTATCTCACTGGGTGCTCGCCTACTGGCCAACAAATGTCAACTACAGGAACGAG
-AAGCAGTTGTTTTCAGAGAACTACGCCATGATTCTCCTTCTGACTAAGTCTTACCCTTCT
-GGGGGGCACAGGTACATATTCCCAAGCCTGAAAACATGACTGCATTAATTTTTCTGTTAA
-CATGAGACAACTGAAATATCTTAAGATGTAGCTgccagacacggtgagtcacgcctataa
-tctcagcactttgggaggccaaagcgggcggatcacctgacatcgggagctcgagaccag
-cctgaccaacatggagaaaccctgtctctactaaaaatacaaaattagccgagcgtggtg
-gcgcatgcctgtaatcccagctacttgaggctgaggcagaagaatcgcttgaacccggaa
-gatagaggttgcagtgagccaagatcatgccattgcactccagcctgggcaacaagagaa
-aatactccatctcaaaaaaaaagaaGGCATAGCCATTACCttttaaaaaattttaaaaaa
-aGAGGCATTGGCCAAGAACACATTTCCAACTAAACAGAGAAGAAACAAAACATCACATGG
-GATTTGCAAAAAAATATTTCTTCTCTTTGGTACTTGGGAAATAAAACAACCCATTGTTGG
-CCTTCCCCTTCTCGCCACTGGATCCCACAGGACTTTGTGTTTCTCTTGTGGCAATAACCT
-CAACATCTTACCTTGGCATACATACCTTATCCACCTCTCCCCACTAGATGTAAACTCAAG
-GGATGGGCTATGTCCCCCAAAGAGCACAGTCCCCAAAAATGCTCCAAGAACTGAATTACC
-CAGATTGCTGGTGACTGGAACAACTGGGGAGAACTTAACAAATCCACCCAAGACAATGAG
-GAAACTGCGCTCGGCTTGTGAGGAGTGTTTCAGGTGTGGGGGGGTGTGGGCGTGTGTATG
-CATGCACACAGAAATGCAGACACATATGTACCTCTGCATGAAGTCATGGAGCTCTGGATT
-CACCTGGTCAATGATGGGCATCAGATAGTTTAATATATGCTTGGTGTTGTCCATTGTTGG
-ATCCATAAAATCCCTGGAGGGAGACAATTCAATAAGCCTGGTTACCAAACACTTAGATCA
-GGGCTCAGGGTGGCGAGGGCTCAAACTCCTAAAAAAGCTGACCAGAAAACAGGCCAGTGA
-GTTATCCCCAGGACGGCTGAGGAGTGATGCCCGTCGTCTTGTGTTCCTCTCTACTGGTAC
-CTGAGGTGGTGGGTAGATAATTTTTCTACCAGGGATGTTGCCAGCCTCTCGCCTACCACC
-AGCAGAAATGTGACCACAATGTCATGGTAGCCCTGGTAGTAGTGCAGCTGAGGGTTGCGC
-TCCAAGATGAGGAGGATGATGTCAATCAGTTCTTCCTGGAGCCCTTCTCTCTGTTCCTCT
-GGCATGCCTGGGGACAGGAACAGAGATGCCTTTGAACATACCAAGCAGCCTAGTTAACAA
-GGAGGTCGAAGAAGGCCAGCAATGAATTTTCAGAGAAAAAAGGAAAATGAATTACAAATA
-ATTTGGCAACGCATATCAAGATCCACTGTTGATACCACCTGGCATACAGGAAAAGGCAGC
-TGCtagctttccagtaggggaagctgcagatgccaccctaaccaagttgctgcagttaat
-actgctgggacacagtatttaactgcagaatttcaactatgggagccacagacggcctct
-gcctcccgaggtgatgcactgacagagctcagcatcatgtctgcaggatttctatcaaca
-gcgcacagacctcaatctcacaatgaagaaatacccaatatccccaaaggaagagaaatt
-taactctcatacaatacaaaggaactgttccagattaaaaatggctaaagatataggaca
-acagcatgagaaacgcataaatctatatttccttttccagtgaagcacattactcgaaga
-aatggtgaaatgtgaataaaatctgtggattaattagttaactatttttcagtgttgtta
-ctgatgttgctcagtgtactgtgattacatgagagccttatatttaggaaatatgtcctg
-aaacacttggggtaaaaagatgtcatgtttgcaacttactcttaaatagttcagagaaaa
-agtgtatgtctatgtgtaaagcgaaggaaagacagaaagcagctaaaaaagcaaatgtag
-gccaggcgcggtggctcacgcctgtaatcccagcactttgggaggcagaggcaggtggat
-cacgaggtcaggagatcgagaccatcctggctaatatggtgaaaaaccccgtctctaata
-aaaaatacaaaaaattagctgggcgtggtggcaggcgcctgtagtcccagctacttggga
-ggctgaggcaggagaatggcatgaacccaggaaccagagcttgcagtgagctgagatcgt
-gccactgcactgcagcccgggcgagagagcaagactccgtctccaagaaaaaaaaagcaa
-atgtagtaaaatgtgaaaacaaaaggaaatctgggtaaaaggtatctggggaattctttg
-tcctatttttacaacctttcagtaagtatgaaattatataaaaataaaaaAATTTTAAAG
-TTACACGGTCCCCTTTAAACCAAAGCAAACGTTACAGGAAAAACTGATCCTCTTGATCCA
-AAGATGTATTATAGCTGGAAATAGGGAAGCCTGTCTCAGGAGTTCTTTCAGGGAGTTCTT
-TTACTGCTGGAGCTAGTGCTGCCAGCAGTAAAAATGCCTTGGCCTTATGAGCCAGGTTAG
-AAGAATGGCACATGCACAGCTTCTCCACACCATTAGCTTTCAGTTACAAACACATACTCA
-GAGAGAGAAAGCAGCTAATGTAAGGGCCCAAACTAAACCGGACAAAGGATTGCAGGTAAG
-AGCAAAACTCACCTCTTGCCCATATTTACCCCACCCCTTCTCAAATAAAAAGCATACCCT
-AAAAGATAAATAAGGAAACGAAGCAAACCCAGGGCTGCTGATAGGTGAAGCAGTGAAAGG
-AGTGAGAGTAAAAATTAAACCCTGTGTGAATTTTCAGCAGAAAAGCAGTGAGCCAAGCCC
-AGAAGACCATGAATGGAAAAAGAATATGAAGCCACACTGTAAGTTCAGCCTACAGAAAGC
-GTATCACAGATATTACATCAATGGAAGAGGAATAAAGGGTTCAGAGGGAAAACAGGTTAC
-CTAGGAAAAAATGGGggtggctcttgcctgtaatcccagcactttgggaggctgaggtac
-gtgcatcacctgaggtcaggagttcgagagcagcctggccaacatggtgaaaccccatct
-ctattaaaaacacacacacacaaaattagctgggcgtggtggcgggcacctgtaatccca
-gctacttgggaggctgaggcaggagaactgcctgaacctgggaggcggaggttgtagtga
-gctgagacagtgccattgcactccagcctgcaacaagagtgaaactctgtctttaaaaaa
-aaaaaaaaaaGGGAGGCATCTGTCCTATATGATCTCATCCAAACCAGCAGGCTAGGAAAA
-GGGAATGGACCGTGGGCATGTGCTTTTATCAAAACCACGCTGGCAGGCTACTGCTACCTG
-GGTATTGCAAGAATCTGTCCAGGGAGCAAGAATGCCAGCAGGAAAGCAGCCCCTTCAACA
-ACAAAAGCCAGGCCAGAGCACAGTGCAGAAGAGGGAGGCAGCCAGCTTAGAGGCTCCTGT
-TCCCTTTAGCAATTCTCCTCTCTTCATGACCTAAAGGTGGAGTTGCCAGAGGAAGAAAAA
-TAGGTCATCCATGTGAGGTTTGTTGCCCAGTTCCCTTCACTGTGAAAATTGAGACAACGG
-TCCTTCTTTTCTTTCTTCCTGAAATAAAGAGGTAATTTTAGGAATACATTCTTTtttgtt
-tgtttgttttgtttttatttatttatttttttatctattGCTGCTTAATTTGTTAATTAA
-GGAATATACTCTTACACAAACAGGGAATGGCCTCTCTTCCCTCTAAGGAATCTTACATAT
-GTATGCGCAAGGTACCATCGTTTTTAAACCTAATTAAGATATTACTCATTCTTGTTGGTG
-CCCAATTCCACACCAATCTGCTCTTTAATGCCAGACTGATGGCTCTAACAATCCTTATTA
-ACTCCTTTTTGTGGCTTCAAGGAAAAACAAAAACCTCTTCTCTCATTCACCACCTCTAGG
-CCAGGAGAAATTATTTTTGGTTCAGGCTTTCACAGTGGGGGTCTGAAAGTGACCAGTCAA
-GAAAAGGATGACTCAGCAAAAGGAGAGCTCTGAAGGTCCCTGAGGCGGCAGGGTCCAGCA
-TATTAGGTCACATGGTATGACCTGGAACAGATACAGTCTTTCCAAATGTGGCAGGACCGG
-GAGAGCTTCTCACCAGGAGGGAACCGCCGCAATGACCGCCGGACGTCCAGCAACACTTGT
-TGGTAGTCCTTGCTCATCTGCCGTAGGTTCTTCCCTATTGAAGGAAAAGGCACGTTATTG
-CAGGAATGCCTGAGAAGCCAGACCAGAAGCAAAACATTCTGGGATGACACAAAAGGCCTA
-GAGGGCACATGTCAGCTTCTCCTGAAGAGGATGATATGACTCAAGATACAACATTTGGCA
-GGGAATCCCTAGTTTGGTTCCAAACATTATGTTTCCTGCAAGTCACAATGACCCTAAGAG
-AAGGGAGCACAGACTGCCCAGGAGACAATACAGCAGGGTGGGAAGGAGAGCAAAGACGTA
-AGGAGGCCAGGCGCCTCGTGCAGAAGGCCACTGTGCATCACTGGGAACTGCTCTGAATTT
-CAAAGTCCACAGCTACAAAATGAGGATATTCCAAGGATCAAATAAAATCATGAATGTGGG
-AACAACAGACCACTGAAAAAAACCCTAACGCCTATAAAGTTGTGGGAGCACTAAGCTGTT
-TAGAAAGGTATATTGAGACTCACATAAAGAACCACCTAACAACTCTTGACCCAGCAATTC
-TAAAACTAAAGAGCTGCAAAGAGGAGACAGTCCTTGTGTTCAGCTGCTAAGTCCAATACA
-GCATGAAAGGAGGCAGTCTCTAGCCATTATACATATAACAAGTGTACATTTCCTCCAACC
-AAACCAAGTGCTGTATAATAAGCGTACATTTCTCTCACAACCCAAATCCAAAGCTAGTAA
-GGCTGGGCAACACTTCCTCACACGTAGGCTTCACGGTATAAAAAGATGAGGGAAGTTTGG
-AACCTGATAGAAGAACATCATCTCAGGATTCAGGGTGTGAACATGGCACTGCCTTAGCCT
-TCCAACAAAAAGCTGACTGCTCTGAAGCAGCCAATTCCAAGGATAATAACAAGTGGCAAC
-TCAACACCTACTGGGTGACATCATGACGCTGTGAACTTTTTGGTGGCAGAAGTCCTGTTT
-CAATCATCTCCAGTACCTGGCAATCATAGCACAACTAATATTTGCCAACTGAAAGAATCC
-TCAGCACTTGGCATTTTGCCATGATGGCAGGAAAGCTACAAGGTGAGTGCACTGAGTGAA
-TGAGCAGCAGAGTGGATTCACTGTTCTACAGGACTTTTACTATTTTGAACTTCATTCCAA
-GGAACTCTTTTCACCACATGGGCCTTGCACATTAGTTAGGTAACTCTTTTCACAGAATTA
-CAGGATTTTAGAACTCCAAAGGATTTCAGTATTTCCCAATAAAAAGAGGGTGttttcttt
-ttttttgagtatctcactctgtcgcccaggctggagtatactggcgcaatctcggctcat
-tgcaacttccgcctcctcggttcaagcgattctcctgcctcagcttccctagtagctgga
-attacaggtgtgtgccaccatactcagctaatttttgtatttttagtagagatggggttt
-caccatgttggccgggctggtctcgaactcctgacctcaagtgattcacctgcctcagcc
-tcccaaaatgctaggattacaggcgtgagccactgtgcccggACAAAAGAGGGTGTTTTT
-GTGTGTGTTTAAttttactttacttttagagattggatcttgccatgttgcccaggctgg
-cctcaaactcctgggctcaagtaatcctgcctcatcctcccaagcagctaagactacagc
-cgtgcaccaccatgtctggctagtttttaaatttttgtagagacagggtttcgcaatgtt
-gcccatgctggcctcaaacttccagtctcaagtgaccctcctgcctcagcctccgaaagt
-gctggaattacaggtgtgagtcacctcgcccagccACAAAATACGCAttttttttttttt
-tttttttttttgagacggagtctcactctgtcacccaggctggaggacagtggtgcaatc
-tctgctcactgcaacctccaccttccaggttcaagcaattctctgctgcagcctcctgcg
-tagctgggattacaggcacctgccaccatacctggctaatgttcgtattttttttttttt
-tttttagtagagatggggtttcaccatcttggccaggctggtcttgaacttctgacctca
-agatccacctgcctcagcctcccaaagtgctgggattacaggcgtgagccaccacacccg
-gccCAAAATATGCATTTTTAAAAAACACTTGCCAAGCAAGTATGCAGAACAAAGCATATG
-CATTTTTAATAAATTCACTTGCCTAGCCAATATTTTAATCCCTAATAAAAAAAGAACTTG
-Cctgggcgtggtagctcatgcctgtaatcccagcactttgggaggccgaagcaggctgat
-cacttgaggtcaggaattcgagaccagcctggtcaacatggcaaaaccccatctctacta
-aaaatacaaaaattagccaggcatggtagcgcatgtctgtaatcccagctactaggaagg
-ctgaggcaggaaaattgcttgaacccagggggcagaggttgcagtgagctgagattgtgc
-caccgcactccagcctgggtgacagagcaagactccgtctcaaaaataaataaaataaaa
-acaagtaaaaaaaGAACTCATTCCACTTTTGAATAAAATTCTACTTATCGGTTTGGCCTT
-ATTTTCAGAGTGGGCCCAAGCATTTCCCAAAACACCCTAGATTTATTCATATACCCTTGG
-TTTGAAAGGACCATAAAAATTAAAGATCCTGGAATTCTTTTCCCCCTGTCTCCTAGATAA
-GCTCCCCTCACAGCCTCCCCCACTCCCCTTACCTGATATAGGAGGTGGGTCATTGGCATT
-GACATTGAGGAGCTTGGGCCACACTTTTCGTCTGATCTCATCAGTCAGGAGCCCTCCTTC
-ACTGATAGCCATGCGTCTAAGGGCAGCCACATCAGTGGGATCACTGTTCAGAGCCTGGTG
-TATCTCTGCCACTTTCTTTTTCCTTTTGGCGTTAAAGTCTGAAGATAAGGATAGGGAAGA
-ATTAGGCGCACATTCAGCACGTGCATATTTTCTGCCTAGGACTCAAGCTCCTTTTTGATA
-TGAGGTACAGGTAAGTATCTCCTCTTAGCTCTAAGACTGCCTGCTGGCATAAAGTCTCAC
-AGCCAGATGCACTATTCATTTCGGGCCCAGTCTACTGGACCTCATGGTGGGAGGCTTGGA
-GAGCCCACTATAAAACAGATTTTAAATCACCGATTTTTAAAAAGATAGTCTCTTTTTATA
-GGTCTGAACCAAAAATCATAGGCACAGACTGGAAATAATTATTAGTTGTTGTTGTTTTTA
-AGAGACAGTGTCggctgggtgtggtggctcatgcctgtaatcccagcactttgggaggcc
-gaggtgggcggatcacaagttcaggaattcgagaccagcctggccaatatggtgaacccc
-cgtctctcctaaaaatacaaaaattagctgggcatcgtggtgctcgcctgtagtcccagc
-tactcaggaggctgaggcagaagaatcacttaaacctgggaggcggaggttgcagtgagc
-cgagatcgtgccactgcactccagccaggatgacagagcgagactccgtcttgaaaaaaa
-aaaaaaaaaagagacattgtctctctaagttgcccaggctggcctcaaactcctaggcaa
-aaccgatcctcccacctcagccttccaaacagctgggactacaggtgcatgccaccatgc
-ctggTCCAGAAATAATTACACGTACttttttttttttttttttttgagacggagtctcgg
-tctgtagcccaggctggagtgcagtggcgcaatctcagctcactgcaacctccgcctccc
-gggtcccggttcaagcaattctgcctcagcctcccaagtagctgggatttcaggcacgca
-ccaccatgcccagctatatttttgtatttttagcagagatagcgttcacaacgttggcca
-gggtggtcatgaactcctgacgtcgtgatcctcctgcctcggtctcccaaagtgctagga
-ttacaggtgtgagccaccacgcccagccTATATGTACttttttttttttttttttgagaa
-ggactcttgctctgtcgccaggctggagtgcagtggcacgatctcggctcactgcaacct
-ctgcctcccgggttcaagtgattctcctgtctcagcctcccaaTACATTaaaaaaaaaaa
-aaaaaaaaaGGTAAGTGAggctgggcacggtggctcatgcctgtaatcccagcactttgg
-gaggccgaagtgggcagataatgaggtcaggagttcgagaccagcctggccaacatggca
-aaacctcatctctactaaaaatacaaaaattagccaggcgtggtggcatgcacctgtaat
-cccagctactcgggaggctgaggcaggagagtcgcttgaaacccaggaggctgaagttgc
-agtgagccaagatcgtgccactgcactccagcctgggcgacaaagtgagactccgtctca
-aaaaaaatgataagtgaaaaaagaaaTGTGttaaaatcagacagatcttggttcaaatcc
-tggctctgccacttatctgatccataatcttggacagatgacttccctgctctgggcctc
-TGGACTGACACCCTCTTGTCAGGATAGTTACCATGGTACACAGTAGATACTTACTAAATA
-TTAGCTCCCCTCCTCACTCTGAAACAACATGTATTTTACAAATCAACCTACAGATATTTA
-ATTAGTACGTAATATGCAAAGCACTAAGGAGATATACTGTGTAAGTAACAAGCAAGGAAT
-TACAACTATAATAAACGCTCAGTAAATTCAGGCATATCTAGCAGTTAGTGTCAATGTTTT
-CATACAAGAATGTCCATTCTTAATTCCCAAACTTCACAGAGCATATACATCTCTTACTGT
-AACAATTTTTTCCTGTTGTTTAAATAGGAAAAATGCATGTCACCAAAACTCGATACTACA
-TTGAAAACATAACCACATGAAAAGGTCTCCTGTTACACGCTACTACAACTGGTAAAAACA
-TTAGAATCACATAGAGAtttttttttttttttgagatggagtctcactgtcgcccaggct
-ggagtgtaatggcgcgatctcagctcactgcaacctccctgtcccaggttcaagtgattt
-tcctgcctcagcctcctgagtagctgggattacaggcatgcaccaccacgctttgctaat
-ttttttttttttttagacagggtttcaccatgttggccaggctggtctcgaactcctgac
-ctcaagtgatccacctgcctcagcctcccaaagtgctgagattacaagcgtgagccacca
-cgcctggccAACACAGAGATGTTTTCAAAACCAGTGTCAAAGGGTACTTGGGTTTCCAGT
-GTGGCTGGTGACACTGCCACCAGACACTGCCACAGAGAGGCTGTGACACTGCATACAAAG
-GAACTGTTTCTTAAAAACCATAGTAAGTAATGTTTTAAGCATCTTACATCCTTATGTGAT
-AGTCTGTTATTCATAGACATTTTGCCATGTTTAAATTACTTTTTAGgactggtccctgag
-tggtgctatttacaactcattgattacaatcagttagatttctttgttccttttccacgc
-ccactgcttcacttgactagccttCAAATAAATAAATAAATAACTTTTTTGGGAAATTGG
-TTGGGAATTTGTGGTTAGTAGCTATCATATCATTTTTCTATGTGAAATAACAGAGTATTG
-CTTTTTGGCCTTTGGCTGAGATCAGGGGAGATAAAGGAGTAAAAGGCTCTGAAAGTTTGC
-ATGCAGAATGTCTGCTTTTAGGGATGGCTTGTGGAAGTTAAATGGATGATGCCTGTATTT
-CAGTTCTTTCTAGTTGCCAGTACCATTGAGAAAATATGTCAAAAACACAAGAAATGTTAC
-ACAAGACAACACCAAACGTCACAAGGCAGTAGACTATAATTGTCAAAAAAGGTGCATGCA
-GACAATAATGGCCAAGAGCTCAAAGAGACTGCAGTGGGTCAGGGCCAAGCTAACCTGAGA
-AGTGTACCTTAAAAAGGAAGAGGAGCAAAACTCTCTTGACATGCTTAATTGTGATGTTTA
-ATGAACATCCTTGCAGTGTAAGACGACCTTTTTAAAATACATTCTTggccggggacggtg
-gctcacgtctgtaatcccagcactttgggaggccaaggcaggcagatcacctgaggtcag
-gagttcgagaccagcctggccaacatggtgaaaccctgtctctactttaaaaatacaaaa
-aactagccgggcatggtggcaggcgcttgtggtcccagctactcaggaggctgaggcagg
-agaatcgcttgaacctgcaaggtggaggttatagtgagccgagatagcgtcactgcactc
-tagcctggacgtcagagcaagactctgtctcaaaagaaaaataaataaataaataaatTC
-TCTCGGCTTCAGACCTACCTATCTTTGGTGTCTCAAGTTAAACCCAAAGCAGCACCCATC
-ACATCTGCCTTTTCTTTACTTTTGTCTCCTATTGCTTCCAGATACCTTCTTCCTTTTCCT
-GCAAAGCCCATTCTGCTGGAGTGGAAAAGTCCAATGCCttgatgccagggtcttgttcag
-tcactcaagatggagtgtagtggcacagtcatggctcactgcagcctcaaccATATATAT
-ATAGTTTAAATAAATCAATAAACCAATAAATTCTCTCTTAATGATGGTTTGAGCCTCACC
-ACTTGATTAGGACAATCAGCATAACCTGTAGAATCTTATTTGGAATTGAATTCTGTATTG
-TAATTTTGTTCCTGTTCATTTTTAAATTTTATTTTTCTTTCACTGTAAAGATGATACTCT
-GCTTTAAATGTTAAAAGTGTACAAGCAAAAggccgggcacagtggttcacacctgtaatc
-ccagcactttgggaggctgaggcaggcagatcacgaggtcaggtgttcgagaccagcctg
-accaacatgaggaaaccccgtctctactaaaaatacaaaagttagcctggcctggtggcg
-cacgcctgtaatcccagctactcatgaggctgaaagaggagaattgcttgaaccccggtg
-gcagaggctggagtgagccaagatcgcacaactgcactccagcctgggcgcgacatagcg
-agactccatctcaaaaacaaacaaacaaaaaaaaGTGTACAAGTTAAGGAagccaggtac
-aatggctcacacctgtaatcccagtgctgtggagggccaaggtgtgagaatcacttgagt
-ccacaaaatcgagaacagcctgggcaacaaagtgagaccctgtctctacaaaaagtacga
-aaagttagccaggcatggtggtcccagctactcaggaggctggggcgagaggatcacttg
-agcccaggagtataaggctgtggtgagctatgatagcaccactgcacttcagcctaggtg
-acagagcaataccctatTATCAAGGCACTGGACTTTTCCACTCCAGCAGAATTCTAAATT
-TTATTTAAACTATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATGTGAAGTGGAAG
-ATATCACCAGAAGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTA
-GAAGGGACACCAAGCATCTTCCCCAGCAATGTTCTAGTCTGAGGAAAAGGAGGAAGGTGT
-CCTGGTGACCTGTCTCTAAAAACAAAAACAAggctgggcacggtggttcatgcctgtgat
-cccagcattttgggaggccgaggcgggcagaccacctgagattgcgagtttgagaccagc
-ctgaccaacacggagaaaccccatctctactaaaaatacaaaattagccgggcgtggtgg
-cacaggccggtaatgccagctactcaggaggctgaagcagaatcgcttgaacccaggggg
-cggagattgaggtaagctgagattgcagatcgcgccattgcactccagcctgggcaacaa
-gagcgaaactccgtttcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCAggctgg
-gcgcagtggctcacgcctgtaatcctcgcactttgggaggccgaagtgggcagatcatct
-gaggtcaggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaaaat
-acaaaaaattagccgggcgtggcggcgcatgcctgtaatcccagctactcgggaggctga
-ggcaggagaattgcttgaacctgggaggcagaggttgcagtgagccgagatcatgctata
-tgccactgcactctagcctgggcgacaagagcgaaactccgtctcaaaaacaacaacaac
-aaCGACAGCAACCACGGAcggtggctcgtgcctgtaatccagcatttttttttttttttt
-tttttttgagacggagtctcgccctattgcccagactggagtgcagaggcgcaatctcgg
-cttactgcaacctccacctcccaggttcaagtgattctcctgcctcagtctcctgagtag
-ctgggattacgggcacgtgccaccatgcctggctaatttttttttttgtatttttagtag
-agacagggtttcaccatgttggtcaggctagtctcaaactcctgacctcgtgacccgcca
-gtctcagcctcccaaagtactgagattacaggcgtgagccaccacacctggcctatccca
-gcactttgggaggccgaggtggatggatcactgaggtcaggagattgagacgagcctggc
-caacatggtgaaactccatctctattaaaaatacaataattaggccaggtgcggtggctc
-acgcctgcaattccagcagtttgggaggccgaggtgggcagatcatgaggtcaggagatc
-gagaccatcttggctaacacggtgaaaccctgtctttactaaaaaaatacaaaaaaatta
-gccaggcgtggtggcgggcgcctgtagtcccagctactcgagaggctgaggcaggagaat
-gaggtgaacctgggaggcggagcttgcagtgagctgagatcacaccactgcactctagcc
-tgggtgacaagttctgtctcaaaaaaaaaaaaaaaaggcagaaagaaCATGGATTCACCT
-GCTTATACAAGAAAAAAGGAAAAAAAAAAGTGTACGAGTTGCCTTGTTACAATAAAACTA
-AATGTGTATACACACAAAGGAAATGGAGGACATTCAGGGGCTGGGATGAAGGGTACAGAA
-GAAAGGCCAGGAGATACGGCCCTTCCATTTGACAGTAAATAGACTAATTAAAAAATATTT
-ATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATTTGAAGTGGAAGATATCACCAGA
-AGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTAGAAGGGACACC
-AAGCATCTTCCCCAGCAATGTTCTAGTCTGAGACCATTGTGAGTCTACAAACTGTTTCTA
-TGACAAAGCTGTACattattattattattattattattttatttttattttttgagacag
-agtcttgctttgtctcccaggctggagtgcagtgaagcaatcttggctcactggaacctc
-tgtctcttgggttcaaaccattctcgggcctcagcctcccaggtagccaggattacaggc
-gcatgctgccaccacacctagctaattttttgtatttttagtagagacagggtttcacca
-tgccaggctggtctcgaactcctgacctgaagtgatctgcctgcctcaggctcccaaagt
-gctgggattataggcatgagccatcaggtctggccCATTATTAACATAAATTAAAGTTGG
-TACTAATAAGTCACAGGTGAGCTACCTATGAGACCTGAAACGTAAAACCCACATAAACAG
-AGGCACTAGCTGGTTTGGAGCCATGTGCAATTGGAAGTGCGACAGAAAGATAATAGGAGT
-AACTTTTCACCTCGGTAAACCTGTCCTCCTGGCTTGACTGCTGTTTCCTGGTAACCTAGt
-agggtgaccatttgtcctcatctgtctgagatcttcctggtttatacctagagtcctggc
-acaattgttcacagcaaaccctttctgctccctgtattctcaaatatgtcccagtttgga
-agccaaattaaatggttaccTACCTAGAAATCATTAAAAATAAAACCCCTTCTGGGcaca
-cctataatcccagtactttgggaggccaaggtgggcagattacctgaagtcaggagatcg
-agaccagcctgaccaacatggtgaaaccctgtctctactaaaaatataaaaattagccgg
-gtgtggtggtgcacgcttgtagtcccatctactcaggaggatgaggcaggagaatcgctt
-gaacccgggaggcggaggttacagtgtgccgagatcatgccactgtactccagactgggc
-aacagagtgacactctgtctcataaaataaataaataaaaaataaaataaaATAggccag
-gcgtggtggctcatgcctgtaatcccagcactttgggaagtcgaggcgagcggatcacct
-gaggtcaggcgttcgagaccagcctgaccaacatggcgaaaccccgtctccactaaaaat
-acaaaattagccaggcgtggtggcaggtgcctgtaatcctagttacttgggaggctgagg
-caggagaatcacttgaacccaagaggcggaggttacagtgagctgagatcacgccactgc
-actccagcctgggcaacgagagcaaaactccgtctcaaaaaaataaacaaaataaaaata
-aaaaTATAATAAAATAAAAACCACTGCCGGGCATGGTTTTTAGTCCAGACgtggctcatg
-cttataatcccagcactttaggaagccgacgtgggcagattgcttgaccccaggatttgg
-agagcaaccagcctgcacaacatggcaaaaccttgtctctacaaaaaataggtgggcgtg
-acggcgtgcacctgtaattccagctgcttaggaggcagaggcgggttgtagtgaggcatg
-attgtgccactgcactccagcctgggtgatagagtaagactctgtctcaaaaacaaaaaa
-aaaTCTCCAATTTCTTCTGTCAGCATAACACCTAGTCAATTGTTCATGAGATGTGTCAAG
-CTCTTGACTCAGGTGTGTCCTttcatccattcatccattcatccattcatccGCCTGCCC
-ATTTGtccagtcattcatcagtctgtcacttaatgggtgtctacttgtactaagcactgt
-actggggataaaaagatgaattactccctcccagcccttgaagggctcacagtagggaca
-caaacaattattatatataatagaatctgagggattatgaaaatccagaggaaagaatga
-ctttttttcttcttctttttttttgagacggagttacgctctttgttgcccaggctggag
-cgcagtgttgcgatctcagctcactgcaacctccacctcctgggtttgagcagttctcct
-gcctcagcctcccgagtagctgggattacaggcattcaccaccacgcctggctaattttt
-tgtatttttagtggagacggggttttgccatgttggccaggctggtcttgaaatcctgat
-ctcaggtgatctgcctgcctcggcctcccaaagtgctgggattacaggagtgagccacca
-cacctggccaagaatgactacttctaaagcagtcaggaaaggcttcaccaagaatatatt
-ctggatccttcttttaattttttttttttttttttttgagacagagtttcactcttgttg
-cccaggatggagtgcaacggcacgatctcagctcaccgcaacctccacctcccaggttca
-agcaattctcctgcctcagcctcccgagtagctgggattacaggcatgcaccaccatgcc
-tggctaattttgtatttttagtagagacagggtttttccatgttggtcaggctggtctcg
-aactccccacctcaggtgatccgcccaccttggcctcccaaagtgctaggattacaggca
-tgagccaccgcatctggccCttctttttaatttttatttatttatttagacagggtctca
-ctctgttgccttggctggagtgcagtggcacaatcatagctcactgcagcctcaacctct
-agggctcaagcgatccttccacctcagccttctatgccaccatgcctaattttaaaaaaa
-ttttttgtagaggtggggtctcattatgttgcccagactgatcttgaactcctgggctca
-agcaatcctcttgcctcaacctcccaaagtgctaggatcgcagatgtgagccaccacact
-gggctctggtacgttcttaaagaaaattttgccacagggaagagtgtgttaaggggaaag
-tactccaggcagaagagttatgtgcaaagaccttgtcacatgaaagaaacaccatgtcca
-ggaaacaaagagttctatgaagctgaagtgccaggtaaagggagagAACAGAAGCAGGTA
-GCACCGCAGTAAAAGAGGCTGGGCTGGATTCATCCCGCAAAGGAGTCTGGGTTTATCCTG
-TACTCAGGAGGAAGACAGGGAGGGATTTTACTTTGGGCCTGAGGGCCATCCTTTGGAAGA
-CCAGGCTGTACGTTTTCAAGAGGGGTCAAAAACATGCAGGAAACAGAGAAGCCTTTTTAT
-ATAACATCGGTGGAGGCAAACCATGAGAAGAATTTAATTTCCAACAAAGAGAAAAAACCT
-AACATATTTAATTTTTTTTTAACTTGGGAGTACCCCTGCACTTTCCACACATCACAAATT
-GACAGCACTTGAGTGGCAATACTGAATACTGCTTGAGGGAAGCTGATATTCAGAAGTCTT
-GTTAACCTATTTGCTAAGAGTATGATAATTTTTCTTCAGTTTGTTTAGACATACATCCAC
-CCCATCTCTCTTTCTAAATAAGCTATTCGGCAATCTGGGAGAAAGGAAATCTTGTATCTT
-GGGGAAAAAAACCACTATGCAGTCAACTGAATTTCCATGAGGTTTTGGCAAACCATTTGC
-CAGAATGTTACTTAATTCTGAACTCAAATCCTCAAATCATACCTCCCATAACTCATTTCT
-CTTAAGACTCTGTTCCAAttttttttttttttttagagacagggtcttactctgtcaccc
-aggctggagaatagtggcacgatcatggctcactgcagcctcaaccttctgggctcaagt
-gatcctcctgccttagcctcccaggtagctgggaccacagacaagctccactggcccagc
-taatttttgcgtatatatattttgtagagaaaaaaagtgttgcccaggctgatctcaaac
-tcctgggctctagtgatccacccacctcgacctcccaaagtgctgggattacaggcgttg
-agccaccatacctggccTCCAATTCTACTTTTAATCCTGCATTTCAAAATTTACTTACTA
-TTTCAAAATTTTTGGCACTCTGTGGGAACGCAACAAATACGTGCAGAATATAGTAAGTGA
-TTTAGTTTAGTTATTGTTCCTCTGGAAAAAACTGGCTTGCAGTAAATGACATTATTTTTC
-CCATACTGTTAAGGTGATGCTCACTGCAGAACTCTCTAAACAGATCTGCAGACTCTTTGG
-CCTGTTTCTAACACTACCGGTGTTTCCCAGAGGAGGATGCTGTCCCAACGTGGATTTCGG
-CTGCTGTTTTTTTCAGGCCCCAACACCACCCTCCTCAACCCCACAGCCTAGTGATTAAAT
-GTCAGTGGCAGATGGAGAAAGCACTCCCACGTGTGCCACTCTGACAAATACTTTATTCCA
-ACTAAATGTATAGGCTCTCACTGTGACATAAAAAGGGAAGAGGAAACAGAAAATTCAAGT
-GAGCTAAAGATGTATGAATTACAGAGTGAGATCAACTGCTAGACGACACAGGGAGGGAGT
-TAGCAGCGTCTCCACTGAAAGACAAATTCACAGACATCCTGTTTATTTCCGAAAGAGAAA
-CATCATAGAGCTATTCTTGGGATGTTCAGGAAAAGATTAAAATAAATGCCTATTATCTAT
-TGTATTTCGAGATAAACTTTATAGATTTAGAGCAGGACACACATTTCTGGACTTGAGAAC
-GCTGTATCTGGCTTGGAATAAAAGCCCACATTTCATCTAGAGGTAGAATGTATGTCATTC
-TAATCTCCCTCAATCCTTTCTTCTCCAATTTCTTTATTGCCCCACTTACAAGATAGTGCA
-CTATTATTCCAAAGCTGATACCTTCCAAATTCCTTTATAGTAGAGGTCTTGGCTATCATA
-ACCATGATGGAACGAATGACCGTCCTACAGCTGGCTGCAAAATATAAGACTGCTATAAAT
-AAATCCCTGATGCCTGAAAAGTAATTCATTCAACAAAGGAAGATAGGTATGACTTTGGCC
-TACTCTTCATTAGAACGCTTATTtttatttatttatttatttatttataaagagggcaaa
-gcagactttatttgaggggcaccacagcaataggtatagcaacaactgcaacagggtttt
-gtagtcagggagggagatcagactcaactccCTAAAATGCTAATTTTAACAATGGGACAC
-TTCATCTGAACTGTGGTTCTTAATGGTTCAGATAAAGATGACACAACCCACTATTGGCTT
-AAACTTCTCCCAACTCTGGCTACAGAATCCAGGTAAAGATTTCTGCCCCCTCAGAGTAAT
-AGGCATGTCCAAAATCACCTGGATTAGGGCACTTAATACACTGGGAAGGGACGATAACAA
-CTAAAGATGACCACTATCCATGCCTCCTCTAAAAGTTTTTTCATATATTTTTTCATATCA
-CCAAAACAAATACTAACTTGGATCAACTAATTTATATAATGGAATCTCGTGTGAGCGTAC
-AAAATTCCATACTGATTATTTGGTTTAAGCCTGCATTATCATAAAGGCTTTACAGTCTTT
-AAACTGAAATTAAGCTCAAATTAAGAAATGCTAGTCTTAAAACAATGGAAGGGGGGGGCC
-GTTTTGTGTGGAGGGAGGGAGACAGACATACCCCTACACCCACCCACAACTACTGATATT
-GACATTGGAAATTAACTTGAAAATTTATgcctgtagtcccagctactcaggaggctgagg
-tgggaggagcacttaagtccaggagttgggagatgacagtgagctttgactgtgacactg
-cactccaacccgggtgacagggcaagatcccatctctcaaaaaaaaaaaaaaaaaaTGCT
-TTAACTCCACGTCTGTACCAGAAGACCACAGCAGGAGAGGAAAACCTTATTTCAGTCTGG
-GTAAGAGTTCTATTAAACACAAAATAAAACAAACTAGCCTCTGTTTCTGGAGGTCTTCAT
-TAGTAGTTTCTACAAAACAGTATCCAAATTAGCAAAGATTCTGTTAACTACCTGGAAAAA
-GCAGGTACCAAGAAAGAATGTTTCACTACAATGGAAAAAAACAGTCTAGTAAGTAAACCA
-ATCTGACTATAAACGCTACAAAAGAGGGATTCTAGCATTAGTAACTTTGCCAACAATACT
-CTGATATGATTAAAAAACAAAACAATAACAAAAACAAAAAACCTCATCTTTAAATTTGTC
-CCATTCATCCAGAGAAGCAAAATCAAGGAAACTAGAGGGGGTAAAGTCTTGCAACAGATA
-CACAGCTGCACTGCCAACAGGTCACAAGACCCATGCTGCCTAGGGCATTGACTGTTATGC
-CATGAGGACAGACATCACACAAACACCAGTAATTAAAGGGTTACGGTGCCAAAGGGTTCA
-GAGCTCCACTTCCATTCAGTATCAGAACATAAGAAAAAGGGAAAAACAGAAAATGAGCCC
-aaataaaatataaaataaaatataGATACCAGGAGCTTCCTCAAAATATGTGGGTTGTAT
-TAATAACGTGTTTGGCTCTGTTACGGGCACCATCCATCAGAGGACTGGAAATAGGGAAAG
-TCACCTTAGTCTTCCTCAAGGAAAAAAGATTATTTAACTTGGTTCACGGTGTACATTCAT
-AATTTTAACTGTCATGTATTTATTGAATGAAAAACATTTGAGAACATCATGTGCAACAAA
-AACATGATTTCACAGAAATTGTCCAAACTAAAAGAGTATAAAAATAGAAGCGCTTTTTAT
-ACAAttatttacttattattattattgagatagggtctccatctgtcacccaggccggag
-tgcagtggcgcaatcatagagtagcctctaagtcctgggctcaagcgatcctcctgcctc
-agcctccagagtcgttgggatcacaggctcgagcctccacacccgactaacttttaaaaa
-ctttttgtagagatgaggcctcgctgtgtttcccagcctgatctcgaaatcctggcctca
-atcgatcctccaaccatggcctcccaaagcgctgggattacaggcgcgagccatggtgcc
-cggccGCTTTTACACAATTGAATAACATTAAAATAGGTGGCAGAAGACagacagaaagtc
-gattcgtggttgccaggcgtcgtgaataccggggaacgcggagtgcctattaatgggtaa
-gggtttcgttttggaatcagacagcggcgatggctgcacaactttgtgaattttctaaga
-atcactgaactgtgcaccttaaaggaagaactgtgtggtaattacatcGGCGGTACGCGG
-GCAGCGCGTCAATCAAGCCGGCGACGGTGAATGCAGTTCGGGAGAGCTGATACCCCTCGG
-GGAGGCGGCTCCGGGAGCCTGCGGACGTGGCGGACGCCTGGGACGGGGTGGGCCTGGCCT
-CCGCGCTCGAGGAGTCCCAGTCCTCTCCAGATGGAAGAAAGCCGGGGCGCGAAGCCGCCG
-CCCGCTCTTCTGCCTGGGGACGCGACTCTGCCGCCAGGCTCCCTCGGGTCAGCTCGGCAC
-CCGCCCGAGCCCCCCCAGTTCCAGGCCCTCTCCTCATCAGACGTGCCCTGGGCCCTCAGC
-CTGTTCCTCTCGccgcccggaaccccgcagcagccccgggtccccagcccgcgcccctcc
-ggcgccgcctccgccagctgcccctgccccccgggccgccctcgcaggccgctcccggcg
-ccccggtcggcttccgtacctgccttctccgcgccgccgtcccAGTGGCCGGAGGTGGGG
-CCGTCGCCCTGCGCACTCCGGAGGGCCATgccccggggccccgggcccccACCCGAGCCC
-CGGCTGGTGGCGGAGCCGGGAGAAGACGCGGCTCCGACCGCGGGACGTAGCACCCGCTCG
-GCATCGGCAGGCTCCCCTCCGTCGGCCAgcggcgcgcaggcgcgcaggcgccccgctggc
-cccgccccgcgccggcACGTGACCCTGCGCTACGCCCGGCCGGCGGCGGGGGAGGCTGCG
-GAAAGAGCGCGGTGAGCGCTCTGAGGAGTTGGCTTCGTCTGCGCTGTAGACTCTACGGTG
-TAGAgtgtggcgctcttgagcgagtgtgctcgagaccagctgtcgtttcctttgcttctt
-tcatctgtaaaatagtattgatgataataaaaatattgaactcacaaggttattgagagt
-gtttagaacatcaccaagcatatagtaaatactccacaattatGACCAATTTTTGCTTAC
-CAAGGATTATTTTTTTACCTCCTGTCTCGTCTCCCCACACGAACTCCTGTCATCAGTTCT
-TGGGTACTTGGGGATCTAGCAGGTTCATGTCAtacgggtccgcaggttatgcactgcaca
-aggcctgggagcgccatttacgtagacgttcacgtgaaccgtgcccccttaagttgtgcG
-AAATAGTGGCCACTCATCTAAAGCAGCGctctggcttatcaggtctgatttccttctcgt
-cttcagtgatattcctttctttccaattagacatccattcccttggttatatccctgata
-ttgtgattgtggcctcccgaatttctagtgctaggtcttcatgctgaagttcccataatt
-ccagttgcttgatgactctcttccacctcccacccccaaccacaacagttctttattatc
-ctgagacctccagcccatGAaactcctgacctcgtgatccgcccgcctcagcctctcaaa
-gtgctgggattacaggcgtgagccaccgcgcacagcCAAGTTTTACAGTTCTATTCATAA
-ATCTAGTAAATTATATCAGTTATTTGGTCCCATTAATAAACTAAGCTAATTAAAATCCTT
-TGAACATTTGAAACTGCATTTATAAATTCAATTCGTTTTTCTAAGTATCACAGGTTTCTA
-ACAAAGCCTTTCAAGTCCTTGTGTAATTCTTGTAAATGTAATACATTTATAAGAATACTG
-AGTCATGAGTGCTTTCAAATGTGTCAATACAAACGAGATTTCATCTTAAAATCAAAAGTC
-TAAATCTATTCAAATACATATTTGTAATTAGTACAAGAATAATCTGTTAGAATTCTCAAA
-Attatcttttttttttttttgagacagagtctcactctatcacccagactggagtgcaat
-agcgatcatagctcactgcagcctcaagctcctgggctcaagctagcctcctgttgcagc
-ctcccgagtagctgagactgtaggtacacactaccatgcctggctagtttttttagtttt
-tatagagggggtggggaatctccctatgttgcccaggccggtctcaaactgccttcgcct
-cccaaagctctgggattacaggcgtgaatcacagtgccAAGCTCTTGAAATTATCTTGAA
-CATTATAGGAATTTAAAGTATCACATTTACACAGATGCCTTAATGCAAAATTATTAATAC
-TAGAAGTTTGAAAACATTTCTAGTCTTTGTTCTAAATCATCTGTGAggctcatgcctgta
-atcccagcactttgggaggtgaagggctgcagatcacttgaggtcaggagttcaagacca
-gcctcaccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcatgg
-tggtgcctgcctgtaatcccagctacttgggaggctgaggcaggagaattgcttgaacct
-gggaggcagaggttgcagtgagccaagattgcgccactgcactccagcctaagagacgga
-gtgagactccatctcaaaaaataaataaataaaatgaaataaaTCATCATTGAGGTTAAA
-AGATGCTTAGTGCCCACTGAAGGAAGATTTAAGTCATCCCAGTTTAAGAGTAACGTGCTC
-AAGCAATTTGAGATATTTATTCCCTTCTCAGTTTACTGCGCTGGTCATCCAGCCAGCTGG
-ATTCTTGCTTTTGGTAGTGATGGAACAGTGACCCCCACCCCATTCCCACCACCACAACTC
-TAGGACTAAACAGTTGTGTGGTCGTTGTGAAGCTTGGGCcagaatttactttcaaaaaat
-gtcccgcttcatgtataatataaagaccttacaataaattcccatttcttccctcctgtt
-cttcttgctgttgtcctacattttactttttaaaatcccttccttctcttgctttctccc
-ctctacccaccaaccacttgcaaacaaccactgatctacatcctgtcactatagattggt
-tttcattttctggaattttttatggacggaatcatatagtatgtagtcttttttgtctgg
-cttcttttactcagcgtaattattttataagcaatcatgttgcattaatcaatagttcat
-ttgtttttgttgttaagtagaatttcatcttagaaatataccacgattcattttatcaGT
-ATTTTAAATTTTTGCATGTGCTGCAAGTACACAATTCATTGCTAATATGCTTGCCTTAGA
-CCAGGCGGTTAGCAAAAAAGATGGTCTGCCCAcctgcaagccaaaaccactctactgcct
-gattttgcacggctcatgaactaagaatggcttttaccttgataaatgttgaaaaatcac
-aacttaattgtagcacattaaaactatatggaatttaaatctcagtgtccataaaccttt
-actgaaacagagtcacgctcattcatttacctactgtctatggctgttttcatgctgcaa
-cggtagagttcagtggttgcaacagagatatggcctacaaaacctaaaatatttattatc
-tgctcctttatgtatttatttattttatgtgtgtatgtatgtatgtatttttttgagatg
-gagtttcactcttgttgcccaggctggagtgcaatggcgcaatcgcagctcactgcaacc
-tccgcctcccaggtccacgtgattctcctgcctcagcctcccgagtagctgggattagcc
-cgccaccatgcctggctaatttttttgtatttttagtagagacggggttttgccatgttg
-gtcaggctggtctcaaactcccgacctcaggtgatccgcccgcctcagcctcccaaagtg
-cctgggattacaggcatgagccaccgcacccggccTATCTGCTCCTTTATAGAAAAAGAT
-Tggcaggacgtggtggctcacacctgtaatcccagcactttgggaggccgaggcaggcag
-attacatgaggccaggagttcgagaccagcttggccaaagtggtgaaaccccgtctttac
-taaacatacaaaaattagccaggcatagtggcacaggtctgtaatcccagctactcagga
-ggctgaggcaggagaatcacttgaacccaggaggcggagactgcagtgagccgagatcac
-accattgcactccagcctgggtgacagagtgagactccacataaaaaaaaaaaaaaaaaa
-aaaaaaGTTTTGTGACCCTCTAttgtagagatggaggtattggggctgttgcccaggctg
-gccttcaactcctggcctcaagggatcctcctgcttcagcctcccaaaaatgatgggatt
-tcaagtttgagccccatgcccagctCACTTCAGTTATTTCTAAGGTAATTTAAaaaagat
-tttaattgtacttaccttcattcaatttccagtgctcttaatttcattgtgtagacccag
-gtttttttctggtatcatattccttttgcctgaaaaacttcctttagtatcttgtagaag
-gagcaatgaattccgtttttctttatctgaaacagggtttatttctcctttattttgaaa
-gacactttcatttgggtataggattccggaattttgggtgagcagtttttgtgtgtgtat
-gtgtttttcccctatcagcatcagcaataaggtcactccattggcttctagcttgcatag
-tttctgacgtctccataattcttagcttcctctgtatgcaatgtcttctttttccttgct
-gcctttaagattttcttttgttttagcatttcgagtatatctaattttatatgtgtgtgt
-gtatatatatatatatatatatatatatatatatatatatgagtttattctgcatgttct
-ctgagcttcttggattttgtggtttgctctgtccttaatgttgaaaagttctcagccttt
-aattcttcaaatgtttcttttcctgttctctctcctttcttctgggaatctaactataat
-atgtttgagtgtttgatattgtcccacaactcttggatgttctcttttgacggttttttt
-tcccttcaccctttttccccagtgtttcagtttgaataatttctcttgacctatctttga
-gttcattcattctctccttggctgtgtcaaatccactgacgagctccatgaggcactctt
-catctctgcatctctgttagtgtgtttcttttttttttttttttttgagacagagtctcg
-ctctgtcctccaggcgtgcagtggcgcaatctcggctcactgcaagctctgcctcccggg
-ttcacaccattctcctgcctcagcctcctgagtaggtgggactacaggctcccgccacca
-tgcccggctgattttttgtatttttagtagagacggggtttcaccgcgttagccaggatg
-gtctcaatctcctgacctcgtgatctgcccgcctcggcctcccaaagtgctggaattaca
-ggcgtgagccaccgcacctggccattagtgtgtttcttattttgaccagttccatttggt
-tctcatagcttccatctctctactgagattgcacttttgatcttgcatattgtctacttt
-tactgttagaccttttaccatattagttatttgaaattctgtatcacatagctctgacat
-ctgtgtttggttctgaagattgctttgtctcttgggagtatgtcatttatctcttgcttc
-ataagtgttggtgaaagttggacatcttgtgtaggatagtagaggcccagggaaatgggt
-tttgtgtagaaatgggcacacttttccttctgttaggtctttagcgtgggggtttgaatt
-aacctagttaggagttgTGATAggctgggtgggtggctcatgcctgtattcccagcactt
-tgggaggccaaggcaggaagattgcttgaacacaggagtttgagatcagcctggacaaca
-tagtgaaaccccatctctacaaaaaaaataaaaattatctaggcatttttggtgcatgcc
-tgttgtcctagctactgggaaggcttgccgagtctgtcctgcagactctgcccaagcgac
-ggatgaaaggagtactcagatacagatatccagtgaaagagcaggataggggactgccag
-cactaggggccgaagagaattagcagttcccctaagccggcagccctcgcatttgtttgg
-tacagatttaatgacaaaggcttggagcaaacacaatttgtgggtaataaacattgttga
-ccccccgagtagagagcagtcctgcatgcaaatgattaaaggttggtttctggagacagg
-agtagacaaatttatctagataagtttctttacattcccttgttatctgccctttgctct
-caggctccagatgagacaatttggctgccttcagccataatttccttccaaagcttttgt
-aaaacctcctggcctttcaagaaggtttgtgtctttactataatttctcccaccaccctg
-accaatctcctacatctcccccttttctgttttttgcatcagcttttgttaattgaagag
-tacagatgtgcagcaacaggtttttcaggtgtagtggtcactgcttgtatttcggctttg
-catcctagaattagtaaataacataagataaacgtgaatataatcagtaacattcttttc
-caatcaaggagtgacatgtagtgttacttgccacctcagttcagtgtgtgcccttactaa
-ggaaccccactgggggtatgttaaccccttccagccaagcagttacgttattagaggctg
-ggaagggggtgtccacccaggtaatagggtggaagaaaagcagatttagaagatgggccc
-aatagagtgtagcaggtactggttgcaggcagagtgagggaattaaacaaggttaataaa
-gcatagtaaggaataaattatctggagtgaatggtgtttgtgtccagagcaggattcgtt
-cagcctcctgagttgtcttcttcagcatcccccaggtaatgtctggggcttgtgtcgtct
-gaggaagctgcatcatccagggctgtgggtcctgcagggacatttccttcatttctggta
-ccaggttgggtcctagccacaccatgttaaggtttgatgcgttgtgctggaatccaaaga
-ggacctgaggtgatgtgaacacaaccatatcctcttccccatgttggcaactcatttgga
-ccacaccatacattactgtttacatctttccataaaactgtgggttttatgtcttgagag
-gttttagcaaagtgcttttctatagctgattgaaatttatcatttaaatttaagaaatta
-agggtaaataaggcttttgctagtagtgttgcagggtccttactcatactcccccttttt
-tgttttttgagcatatttttaagagtggacacgttctactatggcctgtccttgggggtt
-atacgggatgcctgtggaatgctggatgttccacgtgtgacaaaattgttgaaattgtga
-gctggcatgagccagaccattatcagttttaatttttgtgggccgccccataaatgcaaa
-agttaagagaagagtttaataacatatcaggtggactttccaggaagagcattgtgctaa
-ttaggtgagaataggtatcaatggatacttgtacatatcttagttttccaaattcaggga
-cgtgagtaacatctgtttgccataactgattaggttctagtcctctagggttaacgcctg
-ttgaaggaggggacatgcctgtgagctggcaatccgggcattgcaggataatttgtttag
-ctagtctttgggtaagttgaaattgttcagttaagttccttcaattttggtggaaaaatt
-gacgcaactgcatggcttggtgaagcagtgacatcataacttgcaggtctgcttgttcat
-tgccataagccagtgggccaggcagtgagctgtgggctcgaatatgtgtgataaaaatag
-gatgtgtacgttgatccagcaattgctgaagttgaagaaaaagtgcacacagggtgagct
-tgagagtggacttaatgagggctgttttaaggttttgcaataaataaacagagtaagcag
-agtcactaatattgataggcagagtggaaaagttctccaggggcaatattaaggctccaa
-cctcagctctctgagtgctagtaaatccagaatgagtgaggaaattatgcagtctccacc
-aaacaggcgcttttctgtttttaccagagccatcagtaaaaagtgttaaagtgttggggt
-atgggggagtgaactacttttgtaggcacaactacaggagtacgagataagaactgaatt
-acgttgtcagcaggaagggcatgctctatatggcctgtgtaatcagagattgctatctga
-agatctagagataggggcaatactgatccaaattgccttttactcaaaggaattcttatg
-acatcataacctagcaactgattgcactatctgcggcctgtatagatgactttactaact
-agctggatataggaagatagtgttttagtctcggtatgtgagcaaaaaacccattctagg
-aagcgtagtcctggggtcatctctcctattaatactgttggggaatgtttagtaggaaaa
-acaaacaattgaactgactatcggggtgtctatgtgatatagttgcctctgagaaatagc
-ttgctctatttcctcaatttccctttttgctgcaggagtcaaatacctgggagagtctag
-ggctgtattgccctttaggatagaaaacagttttgtaacttatcagtagttatgcccaac
-gtggggtgaagtcaattaatattgcccagtaacttttgataatcatttaaggtgtgtaaa
-tcgctagtatttaaccttttgaggtcttactgaccagaagttagtatgtatccaagatat
-ttccaattgtactttttcaggtgctatgattaaacctcttaactgtgtattctttatgac
-agaggcatataaacttaaaagcactggctctgttggggctgctaggaaaatatcatccat
-aaaatgaataatcttgcaactaggaaattcttttctactggggagcaaagcctgatttac
-atgatactgacacatggtaggactgaacagcatcccttgaggaagtactttccaatgaaa
-tcagcgagctggcctctcattactgataactggtattgtaaatgccaatttttctctgtc
-ctgttctacaaggggaatagtataaaagcagtcctttaagtcaataatgactataggcca
-atcttgaggaatcgcctcaaaggggaagggaggtcccgttgaaggggccccataggttgc
-aaattagcattgatagcctgtaagtcatgcaaaagtctccatttgccagaccttttggga
-atgatgaaaatgggcgaattccaagggctgtttgacagttctatatggccagcttttaat
-tgttcttccactaattcatgggctttttgtaatttctctctctttaaaggctactgtttt
-acccaaataggattttgagagagccatgtcaggggtaggggaggaataacagtggccatt
-attagaaaggtttgctgttcacacaatttatcaaattctgccctccagaggaggtactga
-ctggcctttaaagttgttttagctagcactgaccagtcccatggggtgatatggaagttg
-tctgctatggtttcaattattccttttgtaaatgggctagtggctccgtttaatgctttt
-tcttaccactttataagcgtcaaaagaagttgtctgctatggcttcaattattcctttca
-taaatgggctagcagctccattttctttaacgtttttttcttatctctttataagcgtca
-aaagaaatgggttcatatacctgatcgccttgtcgatcttgcattactgggcaggctaag
-agctccccttctgatgccgcttggctaagacagggtcccaaagctgtagtgtatcccttg
-tctttttccaatttattggaggagggggctcaggcaaaacctctgtttcctctttgttat
-ttttgcctgttaatggctgggctgagggagaaggaggagacggtagggtaggtgacggtt
-ccatctcccttacttttttaggcttttctgtgtagagtgggaccaaagcagtcctaacta
-aagcccataacgttaaagatgttactgagacccattgcccttgctcatgatgttaaaatt
-tcttcccagagctctacgtctagtgtaccttcttccgagagccatgggttatgggaaaca
-acagtttgcattaggtcccataattgagcctgtctgaggctctgctaactttcagcattt
-gttttactacttttatatactgttgctgttgagctgacaactgttgtcccatgatgacaa
-ctgtcatcccatgatgatcgtccctagcttgagcaattcctttgaacttggaaatgctga
-acaggcaccaatgacttactgactgcgcagtctcttcaccttcattttcgagggttccgt
-cgtgatctgttgcagcattcctcacacagggaatcacctgccgagtctgtcccacagact
-ttggccgagtgacagatgaaaggagtactcagacacagatattcagtgagagagcaggct
-aggggactgccagcactaggggccgaagagagttagcagtccccttaagctggtggccct
-cacatttatttagcacaaatttaatgacaaaggcttggagcaaacacaatttgtgggcaa
-taaacattgtcaacatcccaagtagacagcagtcctgtgtgtgaatgatcaaaggttggt
-ttctggacacaggaataaacaaatttatctaggtaagttcctatacaactcccctgttat
-ctgccctttgctctcaggcttcagataagaatttggctgccttcagccataatttctttc
-tgaagcttttgcaaaacctctcggccttccaagaaggtttgtgtctttcctataatttct
-cccaccaccctgaccaatctcctacaAaggctgaagcaggaggattgcttgagcccagga
-gtttgaggctgcagtgagctgcgatcacaccactgcacttcagcctgggcaacagagcaa
-gaccttgtctctaaaaagtaaataaaaaaaagagttgggctaggtttgaggtttattgtt
-gctatggttacccccaatgcagcagcttccagttcctccaatgacaccttggactgaggg
-tgcaggctggcctgccagagggattttctccttccatgtgtgctccctgctcagctttag
-gtcctccctttgtgaccctcagaaagggtcttcttcccatactcttgtctctctcctgta
-acatttttacttctaactcaaggcttgtcagcttaccattggcaggtgggggaggaggga
-attctctgttctgatcaagtctcagtctctgtcaggccctttgtgtctctgattttgggg
-ttatgtcctccttagtgctcctgttcctcccccAGTTCTGGGCCCAGTGTGTATTCCTGC
-CCCTGCCCAGGGAAAGTTTTGTTTTGTTCCTGTTTCATTCCCCCAGATGCAAGGGAGCTT
-CATCCAAGGGGGTGACAGGATTTGGTGTCCTTCCCTCCACAGACTAAGGCTTTTGTCCGG
-TAGGGGATACAGGGAAGGGTCTGGGTGGAGCACTGTGATCCTTTCACAGTAGCTGCCATT
-GTCTTCTTCCAGATCTTGAGACATTTTATTAAAACTTTCTCCAATCTTCTGTGTGCTCCC
-AGTGGGGTTCATGGTGAAAAACGCTGAAAAGGGTAAAGACTACTGCAGTCTCCATGACCC
-AGTCCCTCACCAGTGTCCACTTGTGTTTACCAGGTAACCAGTGCCCATGTCATCTCTTCC
-ATTTTGTGCCTGTCTCTCCTTAGATTTGAAGCCAGTTGATTGTCTTCTGATCTCAGCTCT
-CCAGAAGACCTTTTCCAGAAGACCTCTCCCTGTGTATCCACTTCTAAACCAGTCACAACT
-GCCCGAGTCTCACAGCAGCATGGTGGATATCCCGCTGTCCCTCAAACTGGGGCTCTGTCA
-ACAAAGAGGAAGGGAGGAATGACTCCCTTGGGAGGAGACAACAACATTGCAAGTGATCTa
-gtctttgaaaggcttttaagcaagggactgagataaaatttatttattatttttaagaga
-gaggttctcactctgtcagccaggtctcactgagagcaatgtgatcatagctcactgcag
-cctccaactcctgggctcaacgtatcctcccacccagcctccccagtagctagcactata
-gtcacacaccaccacactagttaatgttttcattttttgtagaacagaggactcgctgtg
-ttacccaggcctcaagtgatcatcgggccttggcctcccaaaatgctggggttatagata
-tgagtcactgtgcctggactagaatatttatttttgaaagatctttggttgcaggtgtca
-gatgaatcaggaattgagacgagatgggaaggcatcaagaccagttatctgctatgatac
-tccaagcaagagaggatggtggctgggatgaggaatttggcaacgggaatgggaggaagt
-ggatgcattcaagataaatATCCATTTATTAAAAGTAGTTGCTTTTTCACCAGAGTAATA
-CATAAATATAGTTTTAAAAGTAAATACTGCTACTATCTTAACAATAATTTAAAAAatctc
-aaaataacatgcaactgtttgatttttcagttttaggcattagttccccttataaatgat
-gagagtttagagcttagaccgcttgtcctgttaccaacaccaccacacatgccagcattt
-cccatcactcctctttccattgtcatcatactgtaatcctggttagaccagtattcagtg
-tttccattatgactacgtaaattctaatcacagctgaaccagcagtatgatatttagttt
-tccctcctttcataacttttcccattcctgctgagttaatacttttttggcttgtcttac
-tctgctcagttttcATTTTGTAAActtttaaacatttgaactctagcaaatatactgaga
-agtgccccaaacgtaaatggagagtttaacaaataattatagagcaaatacaacatttag
-gtaccaccccaataaacacaacaccgaggacccccagaagcaccctgtgtATAGTGGAAT
-GTTGTGTTGTTTCTGGCCATGGAGTCTCAAAGACTGATTCTCAATTTTTGTTGCTTGAAA
-ACAAGTAAACAAGTATTCTCagccgggcacggtggctcacgcctataatctcagcacttt
-tggaggccgaggcaggcagattacttgatgtcaggagttccagaccagcctggccaacat
-ggtgaaaccctgttgttttgtaaaaatacaaaaactatctgggtgtggtggcatgtgcct
-ataatcccaactacttgggaggctgaggcaggagaatcgcttgaacctgggaggtggagg
-ttgcagtgggctgagatcatgccaccgcactccagcctgggtgacagagttaagactctg
-actcaaaaaaaaaaaaaaaaaGTTGGTGTAATCCTTTCCACACACACATATATATATACA
-TAGATGTTATATGTGGTTGCCTTCTGTTCCTACTGATATATATGAATAGTATGGCTGATT
-GCATTATTGGTTTGTTTCTTCATTCCCCTGTAATAAGACTAAACatacacaccctttgcc
-atataacctcataaagttttcccaacacaggctctatgcttccctactgcactgatgttg
-ggcttggctatgtgatttgctttcgccaatgggatgatggtgcttgtgacacagcagagg
-cttgaaatgtgcttgtgtgattccatttggtctcttCTAAGTTTCTGTGATTCATGAGAA
-GAGCACGCCCTGAGTAGCTGCTGCAACTTCTGCCACATTGGGCAAACCTGAATCCAATTC
-ACATGGAGGTGTCCAGCCCAGCCGACCCACAACCTGAAAAACAGCTGCTTGGGCTGAACT
-TGATCTAGATCAGCTGAACTACATACAGTTGCCTTAGAAATTTGTGAGACTAAGACTAGA
-CAGAGAACAAAAGCAAAAGAAAGAAAAAATTTGTCTGCAATGACTGGCTAGGAACCTGGA
-CAGATTCCTGGCAACATAGCTGTGCAAAAGCAGCCCCACAAGCAAAATTGAGCCAGGAGA
-CAGGGTTCTGATCCCAGGCATGGGCCTTGGCAGCTGAAACTTGTTAGGCTGGGCCTCTCC
-CTCGCCAGTTCAGGCAGCCCCTCCTCTGAGGCCTCATGGACCATTCTCTCTTCTCCAAGA
-CTTCAAGATTCCTTCCTAGTGAGtttttcttttttacttttagatggagtctggctctgt
-cacccaggctggagtacactgacgtgatctcagctcactgtaaccgccacctcccaggct
-caagcaattctcctgcctcagcctcccaagtagctgggactgcaggcacacgtcaccaag
-cccagctaatttttgtattttttagtagaaacagggtgtcaccatgttgttcagtctggt
-ttcaaactcctgacctcaggtgatccactcgccttggtctcccaaagtgttggattacag
-gcgtgagccaccatgcccggcACCTAGTGAGtttttctgttacttttttttttggaggcg
-gggtctccctatgttgcacaggctggagtgcagtggtgaaatcatggctcactgcagcct
-caacctcctgggctcaattgattcctccatctcagcctcccaagtagctgggactacagg
-catgcaccaccatgcccagctaatctgtgtattttttgtagagagggtttcatcatgttt
-cccagaccggccttgaattcctgagctcaagtgagtcgcccgcctccacctctcaaagtg
-ctgagattacaggtgtgagccactgcacccagccTGTTAAATCTTTTTTTCAATTAATAA
-CAACttcttttacagacagggtctcactctgttgctcagtctggggtgcagtggcactat
-catagctcactgcagccttgaacccctgggctcaagtgatcctcctgcctcagcctccag
-agtagctagcactacaggcatgtgccaccacatccagctaatttttaattttggtagaga
-cagggtctccctatgttgcccaggctggtctccaactcgtggcctcaagcaatcctcctg
-cctcagcctcccaaagagctgagattacaggcatgagccaccacgcccagctTCTGTGAC
-TTTAAAAAAATCtttttagacagggtcttgctctgtcacttgggcttgagtactgtggca
-caatcacacctcactgcagccttgacttcttgggctcaggcaattaattctcgtcctttg
-gcctccccagtagctaggacacaggcgcacaccaccacactcagctaatctattttttgt
-agaggtgggttttcgccatgttgtccaggctggtctgggactcccggctcccaaagtgtt
-ccAACCACAGGTGTGTGGGCCTTCCGTGGTATCTTAACCTCATCACCCAGAGGCAACAAC
-AGCTAGTATTCTTCTAGTTTTTACCACCCCCACCACCTCAATCCTGCCCCTGTAGCCTTT
-CCAAGTGCCACAGCATTGTTTCAGTTTCTATCTTAGAAAGCCCGGGAGTCTGTGTCCTAT
-CTCCCTGGGGGCATTCAAACCCTAGTCCATAGCCTGAGGCCCACCTATACCCAGACCCAG
-TGTCTTGGAAGCACTGACTTTAATACCCACTTAggctgggcgcagtggctcacgcctgta
-atcccaccactttgggaggcttgggcgggcggatcacctgaggtcgggagttcgagacca
-gcctgaccaacatggagaaaccccgtctctactaaaaatacaaaattagctgggcgtggt
-ggtgcatgtaatcccaTGCCTGTCTCAaaaacaaaacaaacaaacaaaacaaaacaaaac
-aaaaAAACCCCAGTTACATTCAGGATGAATTCTGCCTTCCTTTTTGCCACCTTGGGATTT
-CCATTTCTTTCTCTGAAATAGGCATTTGCATTTTTCCTAGGATTTTTTTTTTAAAACAGT
-TGGAATTATCCCATATACACAATTTTTTCACTTTTCTAATTAACATACATTTCCCCATGG
-Gcttgtgtctcacctctcaatccccagtgtatagcaaagaccaggctcaggggcacttac
-aaatgtttgttgaaACCAAAGACATCCTATATTACAGAAATGAACTTTGGAAAGACCAGT
-CAGCGTGGGTGGGTGAGGAATGCCAGAGACGGGAGAACAAAATGAGGTATACCGTCAGGT
-TTGAAGGGTTGAGGGTTATGGAGGGTTCTTCATAGGAAGTTCACCATGGAGTTCTTGGAA
-CTGTTCAACACACAGAAGCAAGGTCCTCTCCTTCTAGGTATGGCTAGAAATGTTTATCAA
-TAGCTGAGACTCTGATTCCCAGGGTGGGATCAGGAAGCCAGCCCCAGCTGCTGCAGCATT
-TTTTTCCCTTTTTCTCATTACAGGAGCCAAGAAAACTGTCAAAGCAGATGATGCAAGAGT
-GAAGCTGACTCAGAAATACTCAATCCCCCCAGGAACTTCTCTAAGAAATGGACTGACCAT
-CCTGTAAGCTTCCATCTGGAGGTACCTGGGGAAGGGCTTCTCACATTGAGGCCAATAAGA
-ATCCCTAGTGggccaggtgtggtggctcatgcctctaatctcagcactttgggaggccaa
-ggcgggtagactgttgagctcaggagttcaagaccagcctgggcaacacggcaaaacttc
-atctctaccaaaaaaaaaaaaaaaaaaattagccaagcatgatggctcgtgcctgtagtc
-cctggaaggctgagttgggaggatcacctgagcctgggaggttgaggctgcagtgagctg
-tgatggcgctactgcactctagcctgggtaacagagcaagacccgtatcaaaaaacaaaa
-caaacaaaaaaCTTCTAGTGAGTAGAGCGACAGGGAGACAAATCCAGTTTGTAATTTGCT
-ACAGTGCAAAATATCTGGCTTTCCATAGAGGGAGTGGGAACAAGGCAATGCTGGCCTTCA
-TTCAATCAGAAACTTGACTTGTACCCGTTGAAAACCTGTCATGTTTAATGCTTGGATATT
-TTTTCTTCTAGTAaagacactttactgccacctgctggaaaagagtcagaaattttccaa
-atgcaaacatctatggcctccctataatgtagcatccttttactgtacatagtctgcaca
-actgtacaATTTAGAAGAGAAACCAACATTTGGTGTAACTCTACCATATACCAGGCATCT
-GTCATAGAATCTGAACAACCGCTCTATGAAATCAGTACTTATACCCCAATTTAACAGATA
-GGAAATATTGGGacctctggggaagggaggaagaagagggtatcaccaaaaaagggcaaa
-aagggggcttggtctgtattggcaatggaaattcaacttgggtggtaggattatggatgt
-gttacagctttctttataattTGGTACATGCCTAAAATGTTTTACAATAACAATTTAAAT
-CACCTGTGAAGAAAAGATTCAGAGAGGTTAACTGATCAAAAAAATCACACTGCCAGACAG
-AACTCTGTTAGAGGTAGACCACTTGCAGTAACATTACATTGCTTCTCTAATGGTTAAATT
-TAGCACAGAATCAAAGGAGAGCTATAAAGTCTAGGAAGTACTTATTTACATAGGATTGAG
-TCCAGAACATCTTGTGACACCATCTACATATGTTTTACTTGGAGAATAGTCTGAATTTCG
-TATTAcacgttgagcatttctaatttgaaaatacaaaatcctcaaaaatctgaaattttt
-taagcatcaacatgatgcctaaagtaaatgctatttggaatatttcaaatttcagattag
-gaatattgaactggtatgtattccgcaaatattccaaaaatccaaaaaaattcaaaacac
-ttctggtcccaaccattttggataggggatattcaacctATATTACACACAGGTAATACA
-GCAGGGGAAAAGCAGGGAGACTGCAGCATCTAAGTCTACTAAATTGGCCAGGATCATTCC
-TTAGTCTTCAGATACCTATTTATCAGGGTCTCATTAAATAAAGTTACTTGTCATGTTAGT
-TCAGTCTGGCCTGTGGCTTGTAATTATAGCTGCAAACTCAAGGGCAAAGTTCTTAGGATT
-TTGAGATGCTCTTTATGCAACAATACTTCCATTTACTTtgtgtgtgtgtgtgtgtgtgtg
-tgggtgggtgggtgtgtgtgtgtAGGGAGAGAAAGGGGGCAATGGAGTGGAGagtggaac
-tacaatttattaagcacctattattacaagccaagtagggtgttaaatattttcctcgtg
-ccattccattcaatactcTTCGATCCTGAGGGAAAACGAACCCACTTAAAAAAAAAAACA
-AAAGGTTTTAATGAGGATTGCATAAGACATGCAAGGTCACCAGGGAGTTTACATGCAAGT
-GGGGAGATACAAAATAATACAACAAAAGTTCAGGTGTTCTGAGGAAAAAGAAGGGCAAGG
-GTAAGTGATGACAGTGGGGGAAGTCGGATTCAGGATAAACCAATTTTAGACTCATTTTTT
-GAGGAAGGAACTGAGCATGACCTTACCACACAGCCTTTTTAGTTAAGTGTTTCTTTAACT
-AGGAAAAGGCCCTGGGAAGACAGGCTCTCTACTATGCAAACCCAATTCCAGTCTTGGGAG
-AGAATTTGCTGGTGGGACAAAATCAGGTTTTTCAAGAGATGCTTAAATGGTCAATTCTAA
-TTATAACCATACTTGTCAAAAGGTGAAGCAAAGATGAAAGTTAAAAACTAAGAAGAAATT
-AAAATTCCCAAATCTGTCAACCAATCTCTAATTTTCTCTGCTACTTTAGGACTATAGTAA
-TTAGCCATACCCTGAGGATCTACTTTACAAGATATATTCCTCTGACAGTCCCACTCTAAC
-AATTTAATCTATCTTATGTAAGCTGGACAGGCATTTCAAGTACAAGAAACAGAATTCAAA
-ACGTGAAAACGGAGCCATCTATCACACACGGTGTCGGTTGGAGAAGCATATTGCTCAGGC
-TGCAGGGACATTTCatttatttaaatgtttttattaaaaaaaattaaaGACCTTCATGGC
-ACAACTTCTTCCCAGCACAGTTATGGTTTAGTCATACCAATTACAATACAATTACAACCA
-ATAAAGCAAGGTGGGGAGGGCCTTCTGGCTTCAAACTTAAAAAAAAGCAGAGGAAGAGGG
-GAGGGACCACTTCAAACAAAGTTTAAAAATACTTTAAAAAATCTTTCAGAGTAATTGCCA
-ACATAACCTTTCATGTTGGCCATTCCATTTCCTGCCATCTAAGCAATGCAGACACAGGTA
-GTGCTGAGAAATAGTGTCCCAATACAAGGTATACAGATGAGGTAATTTACAACAACACGT
-AAGTTGTTACTCTGTAAACCCTTGCCTCCCCCCCACCCCCCACCCAATTGGGTCTTTTTT
-TTTTTTCTCTCTCTCCATGCTTCTGCAGTGACTCTTAAGTAGCATTTTTAAAAACTTCTA
-TTTATTTTAAAAGGCTCTTGGGTGGCACCTCAGAGTCCTCTGCATTCACCTTCGGTTTAT
-TCCAAGGTCTGATGGGTGTAAGGAGGTCCAGCTGTCTGCAGCTCTCCGCATCAGCCTAAG
-CTACACCTCAATTTCCGAGCTACAAGGATAGGGTATGAAGTCTTGATTTACAACCCTCTC
-CCCACCTCAAAAGAAAGAACTCATTAGTTATAAGTGTCCTGTTCAAATCACAATCCAGTG
-CAAACATAATCACAAATTGCATCTCTGGCACATCTGGTGCTTTTAGCTTCTGCACAAATT
-CAACATGGTAACCCTCACAGCATTCTAGGGCATAAAAGGGTCAAGTACAATAAATATCCA
-CTGTAAGTGGTCATAAGGAAGAAAATCACCCTGCCACACAGTCAGAATGTTTTCCCTTCA
-GCTCTCCCTACCGTTGAGAAGCGCTATAAAAGGAGGCTTTAGCGTCCTCTAAAGTTTACC
-ATTATATTCACTAAAGCCACCACCTTGATAAAGTTACTAAAGCCAAGATGGGTTACAAAG
-TTAGATAAGTTCATTAAATTCAACTCCCCAAACAATTACGTTTATCTATGATGCCTAGGC
-GAGAAAGGCCTGTGAATCTATAAGGTAGGAGAATGGGGAACTAAGATTTTAGGCCTTAAA
-ATATGTTGGAAGAATTTTTCCTAGTTCCCACAAGCAGCTACTGTAATGAAATAACAGGAG
-AAAATACAGAGCTGATGGTTTTGCTATTGTGCTTAAAAAACTAGGCTTCCTCAGTGAAGC
-ACCTGATAAACTTAGGTGGTTGGATTACAGTGGAAAGTCCACTTTACACACACACACAAA
-CACACAAAAACTGGCGACTTTTTCCATCCCCAATCCCTGCACTGCTGAGACACAAAATGA
-GTTTTATGGCAAAGGATCCTTAATCCCCAGAGACGCTTTGGCTTGTGGTGCTTTTTTTTT
-AAGGCCTCTCTGCTCTGCCCGGTACCATGGGTCGAACGAGGGGTGTATAAAATGGGGGCC
-TTGGGAAGCCTCCACGGTACAGGGCTGCAGGCCCCTCAGATGTGAACATGAGACACCCAC
-CCAGCAAGACCTTTACACAGGGAACTTAAATCTAACCTTGATAAATAAAACCAAACGTTT
-ATTTACACCAAAGAATTCCAACACTGGATCTTTCACATATGAAGGACAAAGTATTATATA
-TATACACACAGCAAGGGGTGGCGGGGCTGTAACAAGAGAGTTTATAGTTTTCCCACAATT
-ACAGGTCTACCATTTCAGCTTCAATGGAGATAGTGGCTCTGCTCCTACCTCTCAAGATAC
-ATTTACAAGACTGAGGAGCAGGTCTTCTCACTGGATGGCATGTGAGGGAAGGGGACGGTC
-GGAGGAAAAGAAGGTAGAAAGCTTAAAATGGAAGTCAGTGTGGCCACATCTCCCATTAGC
-TCTAGCATGAAACCTGTACAGACAATGTTTGTTTCTTTTGTAAAAAGCAGTAAGTTATGC
-CCAGTAACTAAATGAATTCAAAATGGCCAAGACAAAGAAAACTAAGAAAGATTTTGCCTT
-CCCTCTCCTACCAGCTATGGAGCACAGCATGTTGGGAGATGAACAGGGAAAAGACCAAGG
-TAAGGAGCCTGGGAGGGAAGGTATCAACATTTTAAACTGAACTAAAAATAAAAGTATAAA
-TGAGTTGGATTTAGGGTTAGATCAGTAAGACATGATTCTTACTGAACAGAAGTTTTTAGT
-ATCTGTCTGCATTTTGGGTAGATTTTCAACATCTTGATGTAACTAAGACACACTTCCACA
-AGAGCCACTAGGATAACCCCACTGAAGCGCTTATGGAGTAAAGTGATGTAAGCGACCAGC
-AAGCAGTCCACTGCTCCTATAGATTGGGtcctcccttccttctttccttccttcctttct
-tcctgcctcccCTGAGAAGCTACATTTTTGTAATCTCTGGAGAAGAGCACGAGATACCAA
-CCCCCTAAAGTGTGGGACGGTGGAGGAACAATGGTGGGAATGGGAAGAAGTCTCCACCTA
-AATGCAGCAGCCGGGATTGAGGCTGGTTTATCTTTGTTCTTTTGTGATGAGGAACTAAAT
-TTGGGAGGGGAGAAAAAAAAATTTGTCCATGAAATATTCCACCTGCAGGTAATTTTTCAG
-GGAATCCCCTGAGTTATGAAAAGTTCGAGTTAAAAAAAAAAAGAAAAAAGAAAATCAGCC
-TATTATAATTTTTTTTTTATGACTGAACTACTATAAATCCACAAGCAACGGTTCAGACAC
-GGTGCTTCTGAAGTGTTTCACCCCTCCCCGCCAGGCGCAAGCTGCATCAAGGAGAGGGTG
-GACTCCCCCACCTCTGCTCAGGCATCAGGAGACAGATAGGGCCGTTACTGCTGAGCGCCA
-GCGGCAGCTGGAACAGGCATCCCAAGGGGGTTGGCAGCAGCAATCACTGGTGAGCCTGCC
-AGAGGTCCAAGGGGTGAAGGGGTTGGCACTGAAGAAATCCCTGAAAGAAAAGAGCTGTCA
-GTGAGCCAAAGACACCAACCATGGCAATCTTACCAGTTTCTCATAGCACTCACTGCAAAA
-GGAACACAATAATTCTTTACTGAAGACTTCCTCTTAGCTGGATTtttacatatacttcaa
-gtctgaccctcacaaattcaagttaaagtggcaagtcctaatcaatttaagagacaggta
-aagaaatctaggcttggacaatttaaggagtttgtccaaagtacacgattaagcaagtgg
-caaccatggttggattctaacccaggcctgtctagGGCAGAGATGTCCACCCTGGTGACc
-agtagccaaccacatgtggctgctgagcacttgaaatatggctagtgcaactgaggaact
-acattttaaattttattcaattgtaattaaatagcctcacgtggctagtcactaccatac
-tgaacagcacaTGACTGCAGTCAAAGCTCATGTGCTCTTACACCATGCTGTCTTGATAGC
-TGGCAGCTTTCAAAATTACTGAAAGTCAATTTGAATGGGGAAAGAGCATTTTCTAAGATA
-AAATTGTGTTTTGGAATTTATTTCCATTTGATTTCTTCCACCTCTCTAATCATGTTTTtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtACACACAGGTAATACATTCACATGGTTCAAA
-ATACAAAAGGTTCAAAAAAGTATACAAAggccaggtgcagtgtctcacgcctgtaatgcc
-agcactttgggaggccaagttgggcggatcacctgaggtcaggagttcaagaccagcctg
-gccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcgtcatggcg
-ggcgcctgtagtcccagctacctgggaggttgaggtgggagaatcgcttgaacccgggag
-gcggaggctgcagcagctgagattgtgccactgcactccagccttggccacagagcaaga
-ccttgtctccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatatata
-tatatatatatatatatatatGAGAACATTATTATACATTCTTCTCCACTCCTCTTAGAC
-ATGGCTCTGCATCTCACtttttcttttgagacagagtctcactctcacccaggctggagg
-gcaacggtgcgatctcggctcactgcaacctctgcctcccaagttcaagcgattatcttg
-ccttagcctccaagtagctgggattaaaggcgccgccgccacgcccagctaattttttgt
-atttccagtagagacagggtttcgccatgctggccaggctggtctcgaactcctgacctc
-aagtgacccacccgcctcagcctcccaaagtgctgggattacaggcatgagccactgcac
-ctggccctgcatcttgcgttttaaatttcacattattatattggagttggagatctaaca
-gaacatgaaactcttattctactggctgcaccacattccattaaatggatataccataac
-tgatttaaccagtttcctactgatagctattctcaatgttttgttattacaaataaggct
-acaagtaagtttggatatacattactctgtacagaggtaggatactcaaggggtaaattc
-tagaagGCAGTTAGTTCTTTTCTTAAAAAAGAGGAGGGCAACAGCAATTATTTGAGGATA
-TGTAAGTAAATGCCTTCACTACCAGATATGCACCCACTTGGATGTTGCCTATATGTATAA
-TTCTTATGCTATGTGCCTGTAGTTCCTTTGGAATAACTGGGTACTCTATAAAAATTCACT
-GTGCGTCACAATGATCCAATAATGGAAAACCATTTTACTTATGTTTTTACAACTGATAGG
-CACTCTATAGTTGCTCTGGCACATGTCACGGAACTGTCCTTGTACACATACACACCTATG
-TATAAACCCCACCTCTATACCCCATTTCTTAACATTGTTTCTAAGGGCCATGTAACTACT
-GTCATTTCAAACTATAAGATGAAATGGTGTATTTTTCCTTTTCATGGCTTGGCACTTTCA
-AGCCCCTATGCCAAAAATTTTCAGCCAGGAATGCTGAGATTCTAGCCTAGAAGGGGATAC
-CCTACTCAAGACAGTATCACTAAAGTATACCAAATGTCAAGCATGCTGAAACCTGGTTAA
-AAAAAAGTCACAAGGCCACCAGTACGGAGAAGAGAAGGTATACAAGAAATCAGACCACAA
-AGCTAAGAACAGTAATTGACTTCCACATTTTTTTAAAGAAAATTTACCAATGAACTGACC
-TGACATCATATTGGCGCTGCTGACGGGCGTACTGCCCCCTGGCATGCTAGATGAACCCAT
-TCGAGCCTGGTCCTTCACAACAGTGTCTAGAAAAGAGACAAAAAGGCTAGGTTCTGTTTT
-GCTTGAAAGATTAAACTAATGGTCTGGAAGCCTGAAAGCAGCCAGCTTCATTCTTTGCAA
-TTTATATATACTCTACATTATTCCCCAAAGAACTTAAGGTGGCAATTGCCTTCACCATGA
-ATTAGACAAGTGGTAAAAAGCAGAAATAGCTTTCCTATCAAACTGTGGTAAAAGCTAACC
-TTTCAATCAAATGGTAGAAAGATGAGGTAATTATTTATAGCAGAGCGAATTTAATGAAGC
-CCTGGTCCTGTTGAGGTTTAATGGAGACAAGACACTGTAACTCGGCAAAGACGGTAATAT
-ATTACCAGTGTGTCCACAGCCCAGTACCAAGTAGGCCAAAGCTATAGGTCCATGTAGCTT
-AGGGCTATGACCACATTCTCTATCCCAATCAGCCTATCTATCTGCTTCAGGTATTGGGCA
-AAAGTATAAATGATTCAGTACAAAACCATCACACCGAAGGAAAAATGTCATGTTGCAGCT
-AACATCACAGTGCAGATGGGGTGGGTCTCAGTGGTATTTTCACTTAGGATGGCACAGGTG
-GCTATACTCACAAATCTAAGTCAAGGTGTTCATACAATTTTAAGATTTGTAAGCCTCATT
-AGCTCTTTCCAACGAATGATTACTAGGGACAGGAAAGATACAGGGCTGTGTATTCTAATT
-CAACCATTCCAGACTGAGGCACTGAGAAGTGTCATCCTCACAGTATGAAAAGAGTTTATT
-TAGGAATGCTCTTGTGTCATGTATTCTGTTACAGAAGaattcttccagtaattctgcaat
-gtagttgccatcactatccccactggaagaatctgaggctcagtgtgggtgaattaactt
-TGCAGCAAGCTGACAGGAGCTGGGATTACGACTCTGTTCTATAGGACTCTGCGCCTGCAC
-AAACTCTGTGGGCTAGATATCTGGACTCACAGAAATAGGGGTGCTCCATTGCCTCTCTTG
-CAGTAAGCCGTGACTGGTGGTCATATCGCAGCAGTTTGTCCAGGAAATCCAAGGCCTCAG
-GGCTGACAAGGTGCTGATTTTCACTGTGGACAAAGCGTTCCCATCGCTTTCGAGAGTGTC
-TGCAGGACCAAAAGAGGGCATGAGAAATGGGCCACGTGGGCACAGAAGCCCAACATTTCA
-TTCCTACATTTTTCTTAGTGGCTAACAGCCCAGACAAAAGCAAAGAGGGATCCAAACTCA
-AGAGGGTAGTCTTGCACCGCTCTGCCACTGAGTGGGACAACAAAGCTAACTGGAGACTGG
-AAACAACATAGCTAGAGTGAAAAAAGACATCTGAGTCCTCTCAATTTTAAGAAACATAAT
-TCAGGTTACTTGACAGGACGTGACCGCTTCTGTGTAGCAAGGAGGGTCAGGTGGCTGAGC
-TCACCAGGCCTATTTCCCATCCCCACACATATTCCTGGCATCTCTGCCAATTGGCCAGCA
-AAAGCCTTTGCATCAGGAAAGTCCATCTCCTCCTGTTGAGTGGTTAAGTGTATAAGTACT
-ATATCTAGTCACTACTGTTAAGAGTCGGTTGTCTGCATATAGCCtttttttttttttttt
-tggagacagggtctcactctgttgcccagactggagcgcagccacatgttcattgctctc
-tgtagcattccctcctgggctcaagggaagctcctgcctcagcttcctagtagtctggac
-tactgccacacatcaccatgcatggagtcgagggtctcattatgttgtccaggctggtct
-ccaactcctgggctcaagtgatcctcctaaagttctgggattacagatatgagccaccgt
-gcccagccTGCACATCAGTCTTAAAGCATGCATTTTCTACTTCAATTTCTTTCTCTTGGA
-GAGAGGTTTTTCACTTAAAGAAGCAAGGTAAATTTTGATTTTTGCCTCAACTGTAACCCT
-TCTACTAGAATCTACATTCATTTTGTAGGAATCCTCTAGCTATAACCCCTCCATCAGACT
-CCTGTAAGTTAATTTGAATAAAGGGCCATTCAATCCAATGCCTTTATCAGAGGCCTGCTC
-AATGCAGCATCCTGTGGCACTGGACCACTGACATCCTGACAGTGCTGGCAAAGAAAACAT
-AACTATTTTGAAGATCCTAAGTGCCAGTTCACTCTCAAAGTGCTTAAGCCACAGATGCAC
-ATATTTTGTTTCATGACTTACCTGCCCAAGATATCATTGAAACGTGGATCTAATTCAATG
-TTGTATTTGTCAATATAGTCATATAAATCTTCTGTCCCCAGAACCTTGGCTATCCTCACC
-AACTAGTATTAAAGAAAGACAAAAACCCATATCACAAGCATATTATATTAACAAATCAAC
-AATTAACAATGATTGAATTTACATAAACGGGTCATCATGTCTACAGGTATGAATGCTACC
-TCCTAACAGTTTAGACTTCAACTCAATGTGATAGTGTTAGAAAAAGCAAACTACTTTATA
-AACTGGTTTCTTCCTCTTGAAATGtcaccctggtgaacccttatttttctcccctcaaaa
-cccaattgaagatgtcacttcttttgggaagctcccattgcacactcaaactactcacca
-ctactgccttttgtgccttgtccacatttctactctgaagttatgactgtaacctatttt
-gttgtatgtttgactcccttacaagatcagctatgaactatctgaggggaagaaaactat
-tctttcttttttctgtattcctcagtactgcatgcacttgatacagagTTATTGACTTTA
-ATGGAATTCAGGTTGTATTCTTTGACTCATTAAAATTGGACATGGTGCTCAAAGGGAACA
-AGACAATGGTACCTTCCACAAGGTCCTAGAATCATTCCAGGTTCTTGTGAATGAAAGAGC
-CCTTTGATCTTCAAGGGGGAAGTGGAGTTAGTTTAAGAAACATCTGTAACTCAACCCATA
-TAAAGAGCCAAAAGGATCACAGAAATACCACATATGGGCTCACATATTGGAGAAAACACC
-ATATTGGAGATAAGGGTTTATTAGGAGAATTCTAAGGTAATGTCCTATTTTAAAAATCTG
-GATGACAATTTATATGTATTCTTCACAATAAAATAAGCAATGCAAATGACAAAGACTAGG
-GGGGAATGTCTGATTTCAAAAGGCTAAGCTGGTAGCTCCCGAAACATCAATCTAAGGATC
-AATATCGGGGTGGCTGAATAAACAGTGAACTGAAAGTTACAGGCAGTGCTGGCTATCATT
-GCATTAGGCCAGTACATTTTTCAATGGGTATAACATATATTACCTGATCATAATTGTCAT
-GTCCATGGAAAAATGGCTCCTTCCGAAAGATCATACTTGCCAGCATACAACCCAAACTCC
-ACATATCCAAACTATAATCGTACATCTGCATAAAAGTAAACTCACTGTTATTATCTGTGA
-ATCCTCAGGCTTGTCACTTCaaaataaaaaattaatttttaaaattaaaaaaaaatCACT
-CCACTGACTCAAAATCAAAACACTAATAACATCTTCATATAtttctttttagtctttctt
-ttttttttttttggagacagagtctcactctgctgcccatgctggagtgcagtggcgcaa
-tcttggctcaccacaacctccgcctcccgggttcaagcaattctcctgcctcagcctcct
-gactagctgggactacaggcgcgtgccaccatgcctggctaattttgtatttttagtaga
-gacggggtttcactacgttggccagtggtctcaaactcctgacctcatgatctgctcgcc
-tcaggttcccaaagtgctaggattacaggcatgacccaccgtgcctggctAGttttttct
-tttttttttttttttagttttttttttagttttttcttttATGCATCTTTCACTCGGTTT
-TAAAACAAtttttactttttttttttttttttgagacagagtcttgctctgtcgcccagg
-ctgcaggggtgtgatcttggctcattgcaactcagcttcccaggttcaagcaattctctg
-cctcagcctcctgagtagctgggattacaagcgcccaccaccgcgcctggctaatttttt
-tgtatttttagtagagacagggtttcaccatcttggccaggctggtcttgagctcctgac
-cttgtgatccacttgccttggcctttccaagtgctgggattataggcgtgagccactgtg
-cctggctCttttttttttttttttaaagacacagggtcttgctctgttgcccaggctgga
-gtgtagtggcgtgatcatagctcactgcagcctccaactcctgggcttaggcctcctgag
-taggtaggattacaggcatacaccactatgctcagctaatATACATACTATTTTGAATTG
-TTTTCTTCACTTACATGAAAAAAAAAAAAAAAAAACCTCCAAATTGTTAGCCCATGGAGA
-CCATCTAATGTGTATCATTAGTATTTTATTACATAAATGTTTCAGAATTCAATCTTTAAT
-TTTCCTATAATAGGACAGTGTTCTGTTTTTCACAATTATTAGTAATACTGTAAAAACTAT
-TTTTATGCATAAAATGCTTTTTGAACTCAGGGCTATAGCCTTAAGACCCCAAGAAAGAAA
-TTCCTACAAGAACAAAAAGTCTGAAACTTTTAAAATCAACTGATAATAACCTGGAAAGAC
-TGGGCATAAAAGATACTCCCAAGAAAACTTCAGATTTTTAAACACTTGGCAAATCTATTA
-TTAATTTGGTTCCTTTCTCCTTTTTCTGTGAGGAGAAAGAAGGCTTTTTGGGGGAGCTGG
-GGAGAAGACCTTTTTATTTAGTATACAATTCAGAAGAACAAGAAAACATTCTTGAATTTA
-CTCTGAAGATTGGTTAAACTTAGTTACAGGATgggcatggtggctcatgcctgtaatctc
-agcactttggggagccaaggtgtgaggatgggttgtgcccaggagtttgagatcagcctg
-ggcaacatagtgagactttctctctacacacaaaaaaattaaaaattagctgggtgtggt
-agtgcacgcctgtagtcccagctactcaggaggctaagctggaaggatcacttgagccca
-gaagttcggggctgcagtcagctatgatcatggcattgcactccagcctgggcaacagag
-caaaaccctgcctcagaaaacaaacaaaaggccgggcgtggtggctcacgagggcaggag
-atcgagaccatcctggctaacacagtgaaacccagtctctactaaaaatacaagaaaaat
-tagctggggtggtggtgggtgcctgtagtcccagctacttgggaggctgaggcaggagaa
-aggtgtgaacctgggaggcggagcttgcagtgagccgagatcatgccactgcactgcagc
-ctgggcgacagagtgagactccgtctcaaaacaaaaacaaaaacaaaaacaaaaCAGCTT
-ACAATTCAAAACAGTTCTGGAACTGCTGATTATAGAACATATCTTTGGCTACTTTCCCTC
-AAGTCAGGATCAAATGCAAACCTATTCATATTCTACCGACATTATGACAATAAAAGTAAT
-GTAAGTCATGGTACATGAATTAAGGTGATTTATATTTTACATTTCATATAAAAAGGACAG
-CTGTGAATGTGCATTAAGTGGCCTACCTAAATGCACAAAATGATACTTTTTTTTTTTTGG
-TAAATTATGTGCGAAATAAACACAGGATCAAAACTGTGCCTGCCCTTCTGTTCTTACCTG
-ATAGTCTACAAGTAGCTCAGGACCTTTGAAGTATCGGGAAGCAACTCGGACATTATATTC
-TTGGCCAGGATGATAAAACTCAGCCAAACCCCAGTCTATTAGTCGTAGCTGAAAAAGAAT
-AAACCATGAGCAATCTTATCTTTCTCTAAGCTACCCACACTGTGCCATTAGCATACTCTT
-GAtaaaatataccagacacgtcactctttactgaaacccctccactgactacttatagcc
-tttagaatgaaaataaaacttcttagcttgacaaacctctttctccatgattttgttccT
-GGAAGACACAATCTCACCTGTGCTTTTACAAATTTCTTAAACTGCTCAATGACTAAAATG
-TCCCTACTACCCAGCCTATAATCCTATTGGTAAGCATTTCCTTAACTTTTGGAATATTTA
-AGTCAGCTTCTCAATGAAGTCTGATCATTGCCTTCAGCCCCCTGAATTTTAGATATATTT
-CTTTAACAGAACCTAAACTCTTTATGTTTTCTACCTTtctttttcaatatggacgacaag
-ctccttaggggtagggactgttttattcacctttgtaattttcagaattcaacataatgc
-ctggtatacaggagaaaaatgaataaatatttgctggatagatgaaATAACAGAAAAGTC
-ATACAATACAGCTTTTACCAAAATGCATCCTAAACATGGAAAAAGGGGTAAGAGGCAAGC
-TTATCTGCCCACTGTGCATAGCATGACCATGATCTGAAGTGCCAGCAGTAGGCCCTGAGG
-AAAAACATCGGACTGCTCTGGCACTAAGTTTACTGCCTGTATCTcaaaactaaacctttg
-attactccctgcaaaagcacctccactcagtctccccctgttcggttaaaggtgatactc
-atcctgtcatacaagccaaaacttaagattcaccctggattcttgattccctcagacctc
-acatttaatctgtcaaaaaattctgaaggttctatcatattgtgaccattatcatcacct
-ccactgccactgccccgatccaagccaccaccacctcttgtttgatatattgccatagcc
-ccttctcctaactggtctcactgctttcactcttgccctctagtctaAACAGtttaataa
-atactaaatagtttaatagttattttaaaaataattaaatatttaaaaataaatataaaC
-AGCTTTTTAAAAGGATTGTTCAGGTTGCTATGGAGAGattatagattcacaggaaattgc
-caaagtagtagagattctctgcaccctttacccagtttcccctaatagtaacatcttaca
-taactacagtacaatatcaaaatcaagaaactgacactggcacaattcagaaagatctta
-ttcaggtttcaccagttttacatgcacgcatgtgtttgtgtgtgtgtttctatgcaattt
-catcacatatgtaagttgatataatctcctcaacaagatatagaactgttccatcaccac
-acacatgtcctgtgtgttagcccaacccctggcaacccctctgctctttatctctatcat
-tttgagaatgctacaaaaatggagtcattggcatataactttttttgagactgccttttt
-tcactaagcatgagatccatccaagttgttgcatgtgtcatacttctttcctttttattg
-ctgagaaatactacttcataataatattatatggtatggatatgccagtttgtttaacca
-ttccctcattgaagggcacttttccccatttttttttttttttttttttgagacgcagtc
-tcgctctgtcacccaggctggagcacagtggcacgatctcggctcactgcaacctccgcc
-tccggggttcaagcaattctcctgcctcagcctcctgagtagctgggattacaggtgcat
-gccaccaggcccggctaatttttgtatttttttagtagagacagggtttcaccatgttgg
-ccaggctggtcttgaactcctgaactcgtcatctgcctgccttggcctcccaaaatgatt
-acaggtgtgagccactgcacccagcttttccccccaattttaagctattacaaatatagt
-tgcattcatatataggcttttgtgtggacctaagattttgttgctctgagataaatgcca
-ctgcaggattgtatggtaagcatatgtttagcttttcaagaaaccaaccaactataaaac
-aatagttaagcattttccaaaatgccaaactttgcattcctaccagcaatgtatgagaga
-tcaagtttcttcacatttttgccagcacttggtaccatcactattttttattttagctgt
-tctaataaatgtgtagtTAActtttaaatttcaagtgagaacatgctaaagcttagaata
-tgcaaaagctctctatcttcagagaaaaggcctaacaatgaccaataaggttttacatga
-tttggttttacctctttgatttcatttcctccttctttccccgcattcattctgtcccag
-ctttatccttgctgctgctcttccaacatgccaaacatatccttacctgaagggcttttg
-tacttgctatttactctgccttgggacatgtttcttcataagactgcatggctgggtccc
-tcccagtgctctctaaaatgtcacctttccaatgaaaccttcccttataactggtttaaa
-actgcaaataccctcttgccattccctattcgttttttcttctacatcaaaataactttc
-tatcccaccagcctccctaaatgtagctcctaaaagacaagcatttattgtatgttgagt
-tcacttacatatccccagccctagggtggtgcctctgacatggtgtgtgtctaaaagtaa
-ttcagttgcataaataaatCACCTGCCTCCCCAGAGACCACAACAGGCAAGTCATCACAG
-CTTGTCACCTTAAAAAACTGAAATGCTAAAGCATGTGGCCATTACAGCTCTCATGTAAAA
-GCATTTGCAGACAACAGGGCCCTTATGACATCCAATAAACAGAAACAGCATTTTCTGTAT
-ATCTCGTCCACTTAACTGTGCAcatttaattctcacgaatacctagtcgcctgcagggct
-attattacccacactgtacacgtaagaaaaagaaggcaaatggagagaaagtagtttCTC
-AGGAAACCAGTTACTCAATAAATAAGGCGAGAAGCCACGTTTCCGGGCTTAGAAGATGAA
-CATTTTGCCCACTTTACTCATGTTTCCTTCTTGGGAATATTCTTAGGAATATAAATAATG
-GTTCAAACATGTTGACTTGTAAATTCGTAcattcattcaccaaatatttctcaactgccg
-aataggtactagggcctgtgacaacacaagggataaagtgttgaaGATGGGCAATTAGCT
-ACATCATGTAGATAAATAACACTTGTCAGCCTATCACTTTACCTTTCTGTGCTCATGATC
-AATCATGACATTATGGGGCTTGACATCTCTGTGCATAATTCCCATGCTGTGACAATAATC
-CAGGGCCTGTGGGATGAACGGGTCAGAAAGGAGTTAGCCTGAATAATACGTAAGAGTCCT
-TTACTTTTCCCTCCATGTAAATTTTCCTTTTAGCCTCACAATACCCCTGGGATTCAAGCT
-GAGGACACAGTCACTTCCACAGCAATGCTTCAGAGACTTGTTCATGATCTCACAGTCAAG
-CAAACTCAGCTCTCTGAGCTTAGAGATCTTTTTCTGACACAGTTGTTTCAACATGTTTTC
-TGTCCTAAAAGACCCAAAGTATACCCAAATTGCACCACTTCAAATTTTTCTGTCTTGTCC
-AGATCCTAGATTATTTCCACAGACCCCTCAAAGAAAGAAAACAGATCTTTACTACAAACC
-TCTTATTCTAAGAACAGTAATTCTTTAGCCATTAAGAGTCTGTAAcagaggttggcagac
-cacaggccaaatttggcctgatgtctgcttttgtaaataatgttttattgcaacatagcc
-atgcctatttgtttgcatattgtttatggttgctcttgtgcaacaacagcagacttgaat
-agtgtgacaaacactacatggcccacaaagcctaaaatatttactatttggccctttaaa
-gaagtttgccaatgcctgATTTAGGTCATCAAATCCAATCTGAAATGTTTCCAACCTCAA
-ACTAAAGGGAACTGAGTAGTATAATCTTTGGGGTTTGTTAATCCCAGCCTTTCAGTCAGC
-CGACGTTGTTGGCCAAATTCTTGTCCTTCCTGAAGGGCAACTTGGGTTCCTACAGTTCCC
-AGGGCTGGGCAATCATATCTGTAACTTTCTAAAGCCTTGCTTGCCACAAACTGCATGAGC
-CAATGGAAAGATCAAGTATCTCTGCTGGCACAATCTCCTCAGGGGATTTCTAAGGCTCCA
-ACAGCAGGCTTTATGTCAACTCTTGTTTAGTAAGAAAGCTTAGCCAACTTTTAGCAATTC
-TCTCTTCTAGGAAGCTGATCTTGTGGCTACTGGGAACAAGATATTTGGTGACCCCACTTT
-AGAAATGTAAGTAAATTTTCAATTAGCATCTATAAGCAGAAATTTACACAATCCTTAGGA
-CAATTACCCTTTGAGAACTGAGTTAAAGTTTACTGTTTTATTTGCTGACTCTTAAGTGAG
-ATAAAGTATACCAGAAGCTAGCACGTCAGGTGTTTTCACGAGTTTTGAAAATTTAATATT
-AACTTACATAGGGGCCACAGAAATTACAAATATTTGTTAAGGGGTCAGTCCCAGCTATCT
-TACAAATACCCTTTTTCAAATTGTTCTAAATTATACTCCCACTAGACCCCATTCCATAAC
-CCTTAGCACAAGGGTTCTGATACTATTATTATTAAtttttatttatttatgtatttagag
-acagggtcttactctgtgctactgcactccagcctgtgcaacaatcatagctcactgctg
-cctcaaattcctgagatcctcctgtcacagcctcccaagtagctggaattacaagcataa
-gccaccatacccagctaatttttaaattttttgtagagacagggtctcactatgttgctc
-aggctggtcttgatctcctggcctcaagcaatcctcctgccttggcctcccaagtagctg
-ggacttacaggtgcacaccaccatgcccagGTAATTAAACAAtttttttttgtagagatg
-gggatctcactatgtcacccaggctggtcttttgatctcctggcctcaagcaatcctcct
-gcctcagccttccaaagtgctgggattacaggtatgaTACTATTAACTTATTAAAAACTT
-ATATAGAGGTCCCTTCTTTCAACATACTTTACAAAGTTAATCTGCTGGCTTTTCTACCAT
-CAATTGACTATTTAACAAAAAGAAGACCAATTTAAAAAATATTTAGTATTCAAGGTTCAC
-TTACCTTCAGAATCTCATACATGTAAAATCGAATATCATAGTCTGTTAACGTCTGGTACA
-ATTGCTGTTAAAGACAAATGTTTGAGCCATGAAATAATGCTGACAGAAAGGCATTTTTCA
-CCCTCACTCACAGTAATTCAAACCAAGACTTGGCTCATTTACCGTTGTTCCAAGATCTGT
-CCATTCACTGCCCTCTATTTCTCCAACATTACATTAACTTTAAAGAGATACTTTGGGTCT
-TCAACTCTTAAAAATGAAGAATTACTTAAACATATATTGCGGAAGCTATAATCCACTGTC
-AGAAACATACTGATCTAGATACGTTAATATGCACTGACACCCACCTATAATTTAGTTTGC
-TTTTCATGTATCTTCAGACCTTCTCAAAAGAGGCATTTTGGCAAATATACTGCCTCCTTA
-GTAGGGAACTAACTCATCTTTGCCTTACATAGTTGGCCCTGCAGATCACCAGTGGGTATG
-CAGATGGCATGATACCAAACCTGTTGAGTCAATTTAACAAAACTATTCTTGTTCCAATTG
-GAAAGTAAACTCTGAACAACTGTTATGTATCCTTTCCAGTTTCCAAAGAGTTGCAGAATG
-TTTTTTACATGGACATATCttttttttttttttttttttttgagacagggtcctcactct
-gctgcccaggctggagtgccgtgctgcaatcataactcactgcaacctcaaactcctggg
-ctcaagcgatcctcctacctcagcttccccagtagctaggactacaggcgaaagccacca
-tgcccagcCACAGGTACGTCTCTTTAATGGTTAGCAACGTCTTCTGACAAAGTTTTTCTT
-GAAATTATCATTCTGACTCTAAAGCAGTTCCTCTTCCTTTCTCCCTATCTCTGCAACAGA
-ATTCACTAATTTATTAATATATAACATTCTGGATACTGGACTGGTGGAAAGGCAAATCGA
-AGATTTTTACTTTTACTCCAAAAGAGTAGCTATATTCTTCTGTAAAATTGGAACTGTGTG
-AAATAAGTAGGCCACTGGATAGACTGGAATTCTGAGATATCTCTTATAGAGGTTTGTGTT
-ATGGCAGAATTTGACATTATCCTTCCTCGATCCCTGCCTTTTAAGATCTATAGCCCACAG
-TTTATGAGGAATCCTAAGAAATAAGCAGTCCCTACTTTTATACATACAATATATTTCTTC
-CTGAACACTATTGTTTAAAGCGAATTGCCATATGGCCAGATCCTAAGTGAACGTGTGTTA
-CTGCCTTCATTAGGTTGGACATCAGCAGAAACTGTCAACTAAGTAGTGAGAAGTCAATGT
-GTTGGTCATTAAAAAGAACATTAAACAAATGGGCAAAATATCAAGATGCAGAAAGTGGGC
-ACTGCTTATATAGGAGTTCTTCTATCTTAAAATTTGCACTGTAAGGATGAAAAGCTTTTT
-AAAAACAAATGCGAAGCAAGCTCTTCTAACAGCATCATCCCCAAAGGCTATGTGGTCTAA
-AAACCCACTAGCCCGAAACAGTTGGTTATATATTATACCTTGAAGTCTGTGTTGTTTACG
-TGTTCAAAAACCAAGGCGGGGGTTCGTGACTAGGGGAAAAGAACAAAAACAAAAACACAC
-ATTAGCAATAGCCCTGACAGCTTTAATGGGGACAATGTTTGCGGATGCTGCGTGGTGAAA
-TTTGGCAGTCCTCGCCTCAGTAGTAAGAAACCCTCTATTGCTACAAGCCCTCCCCGCTCT
-GATCATCACCGCACTTAGGTCATTTTTGGGATGGATTTCAAACAGAAGACATGGAGCTGA
-AGTCTCACCAGGCTCTAGGCAGCCCGACAATGCGCCCATCGCCCATCGGCATCGGACCTG
-AGTTTGCAAAATGGATTAACACATTTCAGTTTCCAGTGCTATCAGTCTCTTAGCCTAGAA
-GAATAAGAAATAGTCTGTGGGTGGAGGTCTCTTTGAAAGAAAGACCCAAGCTAGTTAAAT
-GGTATATCTGATTAAGCACTTTCAAAGCAGGACTTAATGATGAGGGTTGGGGGAGGGAAC
-AAAAAGAGGCCAGTTGTGCTCCAGGTCAAACACCATCTCAGCTCTGGCGGGCCTTGCTAA
-CACCTACTATACTCACCACAGGGTCTTTTACAATGTCTGCCAGTGTGATGATGTTGGGAC
-CTCCTCTCAAATTCTCCAAAATCTTTATTTCACGCTTAATTTTCTTCTTTTTTACTGGCT
-GAAAGGGGAAAAGTACATCAGCaaaaaaaaaaaaaaaaaattttttCAGAGTATTTCAAC
-ACGTAGTGTAATACATAAATGATAAATGGCTTACTtatgagcacaccttgaaggaagaaa
-atgtgtcacattcgtctctgaatccttctcctagcactgtgccaggtattctgcaggtac
-ttacaaatgttgaattgaaagaaAAAAAGATTTCTATTCCAAAGACCAGACACTTCTGCA
-GAATTAGCATTTCAATCATCAGTCTTGATGTTAATGTTTTAAAACATGTTAAACATGTTA
-ATGTCTTAAAACCTTACAAAGTAGCAATTTAAATCGTTAGTAATACTAAAGTATATCAAA
-CTTTTTATCAATTAGGATGAAACATGGGCCCTTTCCATTTCTTCCTCTAATTAGGGCCAA
-CAACAAGGATGGCCAAAACATCTTTGTgtagcacaaccctgagggtaaagggtgagtctt
-ggagtcacaatgcccaatgtgaaacctacctttactacctgctggctgttaatggcaaac
-tacataacctctctaagcctttcattaagtgtaaaatgagtaacaagagtacccatctca
-taagattgttgcaagaatcaaatgaggtaTTCGAAAGATTTCGGAATATGGCTGAAACAT
-AACATAATAATAACTGTCTAGCCTGATCACCAATGCTCtttttttttttttttttttttt
-gagacagagtcttgctctgtcacccaggctggagtgcagtggtgcaatcttggctcactg
-caacctccgcctcctgggttcacgccattctcttgcctcagcctcccgagtagctgggac
-tacaggcacccgccaccaggccaggctaatttttgtatttttagtagagacggggtttca
-ccgtgttagccaggatggtctcgatctcctgacctcgtgatctgcctgcctcggcctccc
-aaagtgcCAATACTCTTATAAATGAACCCCTCCATTCTAAAGAGTATTCTGCAGAGCATA
-TCTTAAACATTCCTTTGTCCTTACCCATTCTTTCCACATCTGTTCTAGTATGGAATCCTT
-TTCATTTTTTTCTGAGGAGGGCCTTGGTCCCACTGCACCTCCTTTATAAAGCCttttttt
-ttttttgagacagagtcttgctctgtcgcccaggctggagtgtagtagcatgatctcagc
-tcactgcaacttccgcctcccgggttcaagcaattctcctgcctcagcctcccgagtagc
-tgggattacaggcgccagccaccatgcccagctaatttttgtatttttagtagagacagg
-gtttcatcatgttggtcaggatcgtctcgaactcctgacctcatgatccgcctgccttgg
-ccttccaaagtgctgggattataggcatgagccactgtgcctggGCTTATATTATAAAGC
-CTTCTCCTGAATAGTCTAAAAcagtgctggcccaaaggaaatataatacaaaccacatgt
-gtaattttaaatgtgttagtagccacatcaagaaaattttaaaaaggacaaaattaatgt
-actttattaatctaaaatcttaacatataaatcaatataaaaattattaatctattttac
-ctttttttgtattaaacccttgaaatctaatgtattttactcttacagcatatctcaatt
-cagcccagccatatttcaagtgcttaacagcctcatgtggcctgcgtgcctgctgtactg
-gactgtgcagGTCTTTTCCTAGGGTGTTGGTCACCTCAGACTAGATGCACTGCATATAAC
-TCTTAGAAGTTAAGTACATCTCATCTCTTCATTAACAAGATTGgtggttactaaagtttg
-atgaccaacaatcacctggatttttttaatatacagactcacagaacccaccaagattca
-ctaaatcaaaatcttgagagggaaacgggggatttatttttagatactttccaggctgat
-GATCCAGGTCCAGAAACTACCAAATAATACTATAAATTCTTTTAACTTTGTCTTAAGCCT
-CAAGCACATGATAGCAGAAAGCAAGCAGATTTTGGAAACATTGACAGTTCTCAAAACCTG
-GCTTTGTGGTTGTGCAGTGTTCAGAAAAGCATTTAAATGTTTCTCACTGCTGAAAGGGAC
-TATACTCGCCTGTTAGTGATTTACATACCACAGTTAGAACAGGTCCAATGCAAAGTGGTA
-CCCAATAAACAGAAGCTATTTTACTAATGACTTCCATGTAGTCCATTGAATTCAACCCAC
-GACCTCTTACCCAATACAATATCTACCTAAGAAACAAGATAATATAAGTCTTCTCTTCCT
-GCTTCAACTATTCAGATCTTTATAAACTGTTATATTATCTGGGAGATCTTTCCACCCTGC
-AGAGACTAACCCAACAACTTACCTCCTGTTTTCCATTAACCCAACTGCTGGTTTTTTAGT
-GGAAAAAAAAAGCTTCTGGTTGACAAAACTACTCTACAGAATGCTTCAAATCTATAAACT
-TAAAAAGCTGGTTTGTGACAGACCAGGCAGCTGACTCAGGCCCGAATTTAATGCGATCAA
-TGCAACTTTTGTCTTATTAAATAGGGGAGATTAAAAATTTTAAATATGGTTTACAAAGGA
-AATTCATCTATACTTACACCACCTACCCACAGTTACAGTAAAATATACAATACAGTTAGA
-AAGACTGAGCTGAAAAAAATCTTTCTAAATCACCCTTCATTCAAAATCATCAAGGGCTCA
-CAATTACCTAGAAGAGATAGTCATATAATTTTAAGACTGCAAGGAAATGCAGAGATTATT
-TTTTCCAGGCCTTCGCCAACTTAATCTCTCTTTCCAAGTTCAACTCCTATGTATGGTCAC
-ATAACATCTTTCACATGAAATATTTCTCTCACTTTTCCCTCCTCCTCTTTTCTTATCTTG
-GTGCACTCTACAGCCTGCTTCCCTTCACCACTTCCACCCAACACCTATCCAAATCCTCCT
-CCCATTCAGCCTGAAGACAGCTCCTGGGAGCTTTTCCTAACTACTACCCTCTTCTGAACT
-GTAGACCCACTATGCATGCTTTTCATGTGGCTCTAAATAATAATATATCACCTCATTCTA
-TCATATACCTTTCCATATGAATATCACCATACAATCACAAAGAACTCCAGTCTCCAACGT
-ATGTATATATACACACAATTTTGTGTTTGATCCtttttgttttttgagacagggtctcat
-tctcatcgcccaggctggagtgcagtggtttgatcatagatccgtgcaaccttcaacttc
-caggctcaagcgatcctcccactttagcccctcgaggacctgcgactaaaggcacatgcc
-accatgctcagccaaCATTCTTTTTAATAGATGGATAAACATGTCCTAGGTTAAAAGGAC
-TACTATGGCTAGTCACCCACATGTTTTGATTTCCAACCTAGTTCTCTTTCTACATATTTC
-AAGACAGATATAAATACTTAAACTCTCTGGTTCTCAAAGGGCATGTgaagcaccccagca
-atgcacaggaatactgtggaacactttacatttttgaggaagacacatcaacccatcgtt
-gaatctgccagacactgggtgcactgccagcttgaggtggttcgtagtttcaacattaga
-ttgtgttacactcctcgtgatggattgtgttatactcctcgcgatggcatatttttgtga
-agctgggtttgcagtagttgctgtggtaaaaagcaagtactgcacaaaaatcaatgacag
-gaaatgagggtggtggtgtccaaccaatgacaacatttgaaaagctatgcagcaacaggt
-ctacataacccaacagtaacaaattatagttatataagaacaaatttaacttttttcttt
-taatttatgtgaataactttttaaatggctaccaagttgctaagatataaatacttagcg
-ggcaggcgcagtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcggat
-cacctgaggtcaggagtttgagaccagcctgaccaatatggtgaaaccccgtctctatta
-aaattacaaaaattagccgggcattgctggcgtgcatctgtagtcccagctacttgggag
-gctaaggcaggagaatcgcttgaacccaggaggcggaggttgcagtgagccgagatcgcg
-ccactgcactccagcctgggcgacagagcgagactccttctcaaaacaaaaacaaaaaca
-ataaaaaaaacaaaacttacttagctatttggaccttgctacttaatacagagaactatg
-aggtatttcttgacttaggagtaccgtgaaaaattaaagacagtataagtgttataaatt
-gagaaagtttggaaacttctACTTTTCAGTGTCAAATATGAAAAAGTTCCTGTGGTAAGG
-AACTATATGCTAAGTTCCCAATATATGACAGTGCACAGCATAGTTATAACTAAATTAAAA
-GTTGTATATTGGTCTCCCAGAGGCCAAATCtggcctgtgcattgtttttttaaaatcttg
-agccaacacttaaaagtcaggaaaattcatatacaaatataaatttctggcttttatttg
-caaaacagagtatcaagcaacaatggacttgcattactgcagggcaatcatcagcttcag
-ctgagaagcagctaactccttttgaagaggcatgtgtttcccagtttgtttcagtcccta
-ccactcacatcacCTAAGCAAGGGCAATTACACCCGACTAGCTGCACTAATATCATCTGT
-CTGTCCCCCTCGAGTCCTGTGACTCCTCATCTTTACAAAGTAGAGGCAATGATTTATTTA
-TTGAAAACAAAAGCCTCATTATATAATGAAAAGTAAAGGAAATAAGTATTAGgcaataac
-tgggagagaagagactgtacctttgctcccttactctgccacaacctagctatatgagtc
-aactcaaatcacttctcttgcttcagtttcccgatctgtcaaataagcagaacttgttct
-attgagttcataggatACAATAAAATTTTATTTATTTGCTTTGGCACCAAAAACCTTTTA
-AATGCTGTTTTAAAAAAGTCTTCAAAACTACTTTTAAAAATCTATATTCCAAATACCTCT
-GAAATTATCTCTTGTACTCACCTTGAGAATTTTAACAACAACTTTTTCATTATTTGTGAT
-GTTGATGGCTTCAAATACTTCACTGTATTTACCTCGGCCTAATTTTCGAACCAGCTGGTA
-GTCATCTTGATTTCTGTGGACACAAACAAAATGACTTATAAACGGTCAAATTATCAGCAT
-CAATTCAAATTACAGGAATCTATTACCAGCAGCTGTAATAGAAATAAGAAGTATTTCAAA
-CAATTCCCAAATAGGtttttttttttttttttttttttttggagatggagtctcactctg
-tcgcccaggctagagtgcagtggcgcgatctctgctgactgccagctccacctcccgggt
-tcacaccattctcctgcctcagcctcccgagcagctgggaccacaggcgcctgccaccat
-gcccggctaattttttgaatttttagtagagacggcgggtcctcaccgtgttaaccagga
-tggtctcgatctcctgacctcgtgattcgtccgcctcggcctcccaaagtgctgggatta
-caggcgtgagccaccgcgcctggccCATTGtattttttttttttttaaattaGGCCAATT
-AAAATACGTGTGTTTCAAATCCTAGAATTAGAAAAACTTATACCTTTCAATTATTCTTTC
-TAATCCCAAACTGTTTACATCTTTATTGGCACATGACATGGAGCTGGCTTGTATTAAGGT
-TTGTTCTAAATACGTTTGTCTCCAACAAGAGACAGCTTTCCCCAAGAGAATAAttttttt
-ttttttttttttttttgagacggagtcttgctctgtcgcccaggctggagtgcagtggcg
-tgatctcggctcgctgcaagccccgcctcccaggttcacgccattctcctgcctcagcct
-cccctagtagctgggactacaggcgcccaccaccacgcccggctaatttttttgtatttt
-tagtaaagacggggtttcaccgtgttagccaggatggtctcgatctcctgaccttgtgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgcacccggccG
-GAGAATAATTTTTATATATTCTTGTCCCTTAGTGCTTGGTCCAGTGTTGGCACTTAGCAG
-GAACTAAAAACATTTTGCAAGACTGTTTCAATCTAGCCACACTTTGGCAGCAGCTGATTT
-TTAACAGGCCTCTTTGAAGGTAAATGGCTTTCAAATGTATAGGCTTAATCTATTTGCCCT
-CCAGGGCAAGCTCTGGGGATAGTCCATGCGTAGTACGAAGCACATTATAGATTGTAAACT
-ATAATCAGCGATCCCCTCCTCTACATATACCCATATTCTGTGACCAATAAGCAACATCAG
-AGGTAATAAACAGAGGTAGAATAAGGGAAATGCCAACATTTTCCTCCTGCCCCTGCCTGC
-TTCCAATGTAGAGCGCTTTGCTCTGAAGAATGACAAACACAGTTCCAATAAGGCCTAAAT
-TCTATCCTACTGGATAGAATCCTCTGGACCTACTAAGTATCCAATATGAACCAAATCAAC
-CACCTCAACCATTCATTTTCCTCAAGTAGCTAAAAAGAAAGTGAATGAAAAGACAAAAGG
-TACTAAAAACAATGGACAACATAATAATCATGGCAGGTGTAGGGGAAGAATGCTCCTACT
-TCTGGTTGAGTTCTCTTCCTATGGGAGGGCATACAAAACAAATGCCAGCAAGCAAACAGA
-ACCATGCCAAAAGCCCAAAAGGGCTCTTTAGTGCCATTTAAGCAGAACCAAGTGCAAAGC
-ACTCAATTTGAAGATAGCGGCTGAAATTCCTATAGTAAACACAGTGTCACCTAGAGTCCA
-AAGCCTGTGACATAAGAGGAGAATTGTTAGATTATCAGTAATAACAACATTTATTGGTAC
-TAAACCACACTGGCATTTAATGGTGTCTTTACAGCATACAGTGCCTCTGTATTCAGAGGC
-AATGTATTTACTGTTAAGAATCATGGCATACTCaaattagctgggtagggtggaaggtgc
-ctgtaatcccagctactcgagaggctgaggtgggagaatcacgtgaacccaggaggcgga
-ggctgcagtgagccgagatcacaccactgcactgcagccagggcaacagagcaagactcA
-TTTCCACACACACACATACACAAATTCATGGCATACTCAAGATTAAAAATACGCCCTATG
-ACAATTTAGGGAAGCCATCCACTAACCACTTACAGGTTACAGAAATCACATGCAGTCAGA
-TATAAAATACAGCATACAGGAGCTGTAGCTTTAGTTTTCAAATTGCTTTCTTTTGCACTT
-GAATGTCAAAATGCTTTTATCACAAAAGTATGATCTGAACAATTAAATGTCTACCACATT
-GGGACAGGAAATGCAAACATCCAAATGAGTCTGCACAGAGAATTAGGAGGGCAAACACAG
-CTGTTCAGGCAGACTACAACTGTTCAAGATAGAATTTGGGCTGAATTCCATGCTAAGACA
-TGCCTAGTCTCAGGATAAGGGCAAATGTTTAAGAATTTAATTGTTTCTCATCAGAAAGAA
-GTTACCTCTTTGGAGAACTGTTTCGTCCTCCTGTATTAACACGAAACAACATTCTCTACC
-TCAAAAATACTTTATATAAGACTTTGGTGTTTTCAAAGTCTCTCAAGTATCACTTCTCAC
-TGATCTGCAATGCCCTTGGCTTGATAAGCAAGCTGATAGGTAACTTTTTGTTGCCAGGTG
-CCCATACAGAATACCgtcatgcgttatttaatgacattctgagaaatgtgttaaacatca
-gagtgtttacacaaacctacatggtatggcatattacatacctagggtatggcctacggc
-tcctaggatacaaatgtgtaccgtaataaatactttaggcaattgtaacacaatggtatt
-tgtgtatctaaacgtagaaaaggtaatgaatgcactgttgatgttacgatgacatcacta
-ggccacagacatttttcagctctcttataatcttatggaaccactgtcctacatgtggtc
-tgtcattaattcaaactttgttatgtggtgcacgactgCATATACATCATAGAAAAGGAT
-AAGAAACTAAAATGATTTTTAAATGGTAAGCCCATTAAAATTGTTCACTTGCCAAAGCAA
-CTCTGCTTCCTCACTGCAAAACCAAATTTTCAGCTCAAAAGAAAACACAAATTGGGCTTT
-GATCCTGAGGTATACACATACAGAGTCACGGAGGTTTTCTGACAAAAACTACTCAACAGA
-TCCACAAGATTCAGCCCTTTGAGTGAGTATAATGAAGTCAACAAAAACAATTACCCCCAT
-TCCACCACATGTGACTCGTAATCCCAGTATTCTCGAGGTCTGTGTGTATTAACATCTGTG
-TAAACTCTGGCCCTGCTTGGCACGGGTCCCGACATGTCAGACAGGTTGGCGGACAAAGCT
-GGACTTGATGTTTGGAGATCTGGCAGTCACTGTGTTCAGAAGCAGCTGGGGGTAAGACCT
-TGTTTCAGACCTGTTTTCTTCAAACTGCAGAAACAAAATGCACAAAGTCCAAGGAATCAT
-TTACAGAAGGTATATGGGAAGGAAATAATCTTACAAATAATAATGGCCTGAAATATACCT
-CTGGCTCTCCTACCTACAGCCAATAAATATAGCTCAACTGTGTTAACCAGTGCTTCCTAT
-AACATGAGAAGAAAAATCCCAAGAAATACAGTAAACTGATATTTGCTTTAATCATATTTT
-GCCAAATATCCTGTTACCTCTGCAGGCAAAATTTGAATGATTTTTGTAAGACAGCCTGGA
-AGAGAAAAATGGCATTGAGGATAGATACATCAGCATTACCACTAGTTATATATTCTACAA
-AAGGTATTGGCAAGAAAAATACTTTCTTTTCAGCAGCTTTCTGTAACTTAAGTAGGGGTG
-CTAAAAGGTTCTAGAATGGCGGCAAAGCTAAGAGTACAACTTGCCATTCTGACTCATATT
-TGATGAAACCAGGAAGAGAATAAAGGCTTGTTCTCATACATCAAAGCTCCATGTCATCTT
-ATACCAATCCAAATCTTTTGGGGGAACCTTAAGGTAATAATCAGTAGAACCTTGATCACC
-ATTTGAAAGACACACTTGGTTTCATTAAATTTAAAAACAGAAATCAGTAATATTCTCTTT
-ATATTTAATACAGGAGCTTAAAAACTGGTATAAAACAGTAATACAGATTAGCTGAGCTAA
-TGCAAAATTTGACACCGGGGGAAAATAAGTAAGATGTTAGAAATATGCTATCAAATCAGG
-TTCCTTTCCAATGATGTCTTCCCTATCTCCTACAGCATGTGCTGATTCCCCTCATTATGC
-ATTTAGATGAAATTGTATTGAGTCTCCAGATTGTGATAACGTGAGAAGGATATAACACGT
-ATGCAAGTCTCCTGGCTGAGACAGCATAACTTCAATTTGTATGTGTGTATGTGttttaag
-acagggtcttattccactgcccagactggaatgcagtggtgtgatcatggctcactgaag
-cctcaacttcctggactccggtgattctttcacctcagcctcccaggtagctgagactac
-aggcacgcaccaccaccctcagctaattttctgtattttcagtagagacggtgtttcacc
-atgttgcccaggctggtcttgaactcccaggctcaagcaatcctcccacctcagcctccc
-aaagtgctgagatcacagatgtgagccaccgcacccagccATAACTTCAATTCAATTACC
-AGGAAACATTCAGAAAAAGAGGAAGTGTCTATTTAAAAAGGGGGAAGGGGTACTATACTT
-CTAAAACATGTCCACAGCATAAAAGACAAATGGAGGCTAAAGAGACATTGCATAAATGCA
-ATACTCTAGACTGTATCCCATACTGCAGGAGGTGGAGGGGGAtgctataaaaaacaatat
-cgacagaactggaattcagagggtattaaattattgtatcaatgtaaatttgtgaagttg
-gtacataatcacaatagttaagagaatatacctattcttttttttttttttttgagatgg
-agtttcgctcttgttgctcaggctggagtgcaatggcgtgatcttggctcaccacaacct
-ctgccgcctcccaggttcatgtgattctcctgcctcagcctcccgagtagctgggattac
-aggcatgcgccaccatgcctggctaattttgtatttttagtagagatagggtttctctat
-gttggtcaggctggtctcaaactcccgacctcaggtgatccgccctcctcggcctcccaa
-agtgctaggattacaggcgtgagccacctcgcccagcccaagaatatgtctattgttaag
-aaattttcctgaagtaattagaagtaaacagccatgatgcatataatctaccctaaaatg
-attcaggaaaaaaatgtgcccacacgtttacatgtgtatatatatagcacacatgactgc
-acactcacaaatgataaaacaagctgggtaaaatattacaataggtaaacgtgcgtaaag
-ggaatagagatgccctttgtactatttttatttactttttgttgaaatcttcttatttga
-aacaaggtctccctctgtaggccaggctagagtacagtggtctgatcacagctcactgca
-gccttgacctcccaggctcaatcaatcctcccacctctgcctcccaagtagttgggacca
-caggcgtgggctaccacagctggctaattaaataaattttttttttgtaaagatggggtt
-tccctatgttgcccaggctggtctcaaactcctgggttcaagtgatgctcccaccacagc
-ctcccaaagtactgtgattataggagtgatccaccatacccagctTGTTGAAACACtttt
-ttaaattgtggtaaaatatacataacataaactttatggccaggcacagtggctcacttt
-gggaggcttaagagggtggatcgcttgaacccaggagttcgcaaccagtctgggcaacat
-ggtaaaaccccatctctactgaaaatacaaaaaattagccaggtgtgatggtgtctgcct
-gcagtcccagctacttgggaggctgaggcaggagaatcaccagagaccaggaagtcgagg
-ctacagtgagctgtgattgcaccactgcactccagcctgggtgacaggagagagacctca
-tctaaaaaaaataaaaactgccattttatccacatttaaacctaaagctcagttgcatta
-agtatattcacattcttgtgcagtaatcaccagatcatccatttctacaaatttttacca
-tcccaaatgaaaactatgtatccactaaacactaattttccctcccccaactctttgcaa
-ccactattctattttctgcctgagctggctattctaggaacctcatataagtggaatcag
-acaatatttgtcctttgttttgtttatttaatttagcataatgtcttcaaggctgatcca
-tgttgtagcatgtgttagaattccaatccttttaaaggctgaatgatattgcactgtgta
-tatatatacacacacacacacacacacacacacaccacattttgcttatccatttatctg
-ctgatggacacttgagttgcttccacagcttggctattgtaaataatgctgctatgaaca
-taggtgtacaaacatctgtttgagacctcgctttcaaatcttttatgtatatatccagaa
-gtggaactgctgaaccatgtagtaattctatgttaattttttgaagaaccagcatattgt
-ttcaacaagctgggcacggtggctcactcctatacagcaactgtatcattttacactccc
-aggaacagtgcaaaggctacaacttctctacatccttactaacacttgttattttctgtt
-ttttGCTTGtttttatagagacaggggtcttgcttatgcccaggctggtcttgagctcct
-ggcctcaagggatcctcccacctcggcctcccaaagtgctCTCAAAATAGACTGTGCCTG
-GCCTATTTTTTGGTTTTCTTTTCTTCTTCTTCTTttttttttttcagtaacagccctcct
-aatgagtatgaagttgtatctcattgactgtgattttaatttgcatttccctaatgatta
-atgatgttgagcatctttttacatgcttattggccatttgtatatttgttttggagaatg
-tctattcaaagctgttgtccattttttgattgggttgttttgtttgttGACGATGCATTT
-GTTAACTATACTGTTTTTTTGTTGCTTACAAGCTGCTCATCTTTCCAAGGTAAGCTGTAA
-CTTAGCTACCACACCCAAAGAGAAGCCAGAAGAGATACCTCCTTATGCCCATGGTGTCGG
-CAGCTAAAGGCTTTCAGAAGAATAGCAAGACTGGGATGGAGATTAATTCTCTATTCCTTA
-ACCGTGACAAACACAATTAATGACATTCCACTCCAAATATATGAGATCAAAAGATTCACA
-TGCTGACTTATGAATTCTCCCACCCAAAAAACTGCTGTAACTTGCCTCTGTTCAACTCAA
-ACCTTCTGAGGTTCCATAAATGTACTAAATGACCAGAAAACAACAAAGTAATTCAAGTAC
-CAAAAGTCTTTAAAATTATTTCTATTTCTTTGATTTTGTAAAACCTGGGTGACATTAATC
-TATCTTCACTTAATATCAGTTAAAACTGTAAACGCACACACACACAAACACATCAAACAT
-GCAAAAACCAGATGTTTTCTTGTAATTTTTCTTCTTCCCAAAGAAATAAGGTCATCTATG
-TTGTAGGATTGGTGACTCTGTGACTACTATGCCTGCCTTGACAGCAATGAAAGACACTAG
-GAAAACCGTAGAGAAAGGTGTAGGTGTGAATATGGCCAAAATAGTAGAAACAGCAGCATG
-AACCCAACAGAAATGCTGTCCCCAGAAATTTATTACTTTTAATATACTAAACTTTTAAAT
-TCTCAGCCTCTCCTCTGACAGGAAACAGTATCTTTCTCTACATAACCTTTACAGCCACTT
-TACTCTTCTGGTTAACATTTTATACGTGTAAGACAGCCTTCGTCTGTGGATCTCAAAGCC
-CTTTTCCTATGCTTAAAAGTGATCTCTCTGTTGGGCTTTTCCCAGCTTTGGTTCATCACT
-TATAAAACCTGTCTAACTGTGCTTGCAGACTGAAGGGAAGATGAAGTGAGATGATCTTCC
-AGAAAGGGCTTAGAAACATGAAATGCATGTAAATTTGTATTAAGTAATTACTATCCCCTA
-GCTCCTTAGTGAAAGCTAATAAGCAGAAACCTATCTTTACAGGCTGGAACCTTCATTCTT
-TAAAATACAAAAATTATAGTAGCCGTGGTTAATTCCCGGCCACTGAGGGCTAACTCCCAA
-GTATACATGACATTACAAAATGAGTCCTCATTTCTCCCTGGAAACCATCTGACATATGGA
-GAATAGCCAACTCCTATTACTAGTCATGTACATTCTCATCACCCAGTCTTCTTCTGCTGT
-TTCAAGGCCCTGGCATCCTCTGTGAGGAGTGGGAAAAGACTAATAACTAATGAAACTCTT
-GAGATTCTCCAGTACTTGTCTGAATGACCCTTGAAGCTTTGGGGCTCATCAACTGGGACC
-TAATTTATGAACTAGCAGATCTGATTCTCCACTGGGAAGACAACAAGCTAACTATTTTTG
-CAGTACCCCCAAAGAGGTGCTTCACCTTACTGTCACGCATACCAAATAATCTGCTTATAG
-TAAGAAAGGTATTCACATGAATTTCAAATGGCTGGCCTTCATTAATTATACGGGAAAATA
-AAACAGAGGATTCTTCAACTGTGACTCTGTAATCTCAGATAGATAAAAGGGTACTAAGAG
-ATTGGGGGTTAAGGGATGGTGATAAAAAGGGGATGTGAagcccagtgtggtggctcatac
-ctataatcccagcactctggcaggatcacttgagcccaggagtttgagaccaccctgggc
-aacacagcgagacctcctctctacaaataacataaaaatgagctgggtgtagtggagtac
-aactgtggtcccaggtacttggtaggctgagatggaaggatcacttgagcctgggaggtc
-aaggttgcagtgagccatgatctcaccactgcactccaacctgggtgacagagcaagacc
-ctgtctcaaaaacaaacaaacaaacaaacaaaaaacaaaAACAAGAGGGGATGTGAAAAG
-ACAGAAAAGGGAGGTCAAAGACCAAATATTATCATTATTATTTTTTTGAGACAGgagaca
-gggtcttgcgctgtcacccaggctggagtgcagtggtgcaatctcgctcggctcactgaa
-acctccacctcatctcctgggcttgagcaatcctcccacctcagcctcctgagtagttgg
-gactatagctatgcgccatcaggcccagctaatatttgtattttttgtagagacaaggtt
-ttgtcatgatgcccaggctggtctcaaactcctggactcaagtgatccaccagcctcagc
-ctcccgaagtgctgagattacaggtgtgagccaccatgcccaaccAAGATAAACATTATC
-TTATTTAGAAATAGTATTTCACTTATACCTCTGCAAATGCATATGTATATCACATGTAAG
-CTAACAGGAAGAAAACACACAGCCTACATTTCTCAATTTTTGGTTTGATTCTTCCCTACA
-TTCCTGATTTTGTCCATCCCTTAAATAGAtaaccatctactatgaaaaagtactatccta
-ggccttaggaatataagtgagcaaggcagaACAGGGGTGAGACAAgtatgccattgaaga
-ttttacctatggactaagggtaacagaaattcattgaaaagttttaagcagaaaagtgac
-ccatacatattgtttttaaaatttttactctggctgagtgtgggacaggacttagggaga
-aggctgttaacagtagcacacgtgagagaaatgatgacctaaggtggtggcatgtggaga
-tcagtggactaatatgaggaacaaaatttatggtgtaaaatcaatagctctgagtgaact
-ggaaaatgctgtatgaagtgggaggtgactcttggatttcttgcttgacagactgttggt
-gccattcatggagataagagtgcacaagataggttttggacttaaggttaaaatggcttt
-gaatcattcaaacgaagattctgaataggcagttagatattacaagtctggaactaagag
-tttctcagctttaagtatctaactcttccaacaactctacgaggcaagcattagtttctc
-taatctacaaataagaacagcctaagttcagtagcttgaccaagaatatccaatacagtt
-acagctgggattcaaagacagtgagttggcctccaaggttcaagtcttctcactCCTACA
-GAACACAATCACTTTCTACTGCACATTCACACACACACACACCAGTCTTCAAATCTTAAT
-ttctcaattggaccctaagttctacaaagttaagaaccatgtttaatttacctttttaat
-ttatagtacctagcctaaggcttgcattttgtagcacgttcagtaaacactatttggtga
-tcaaattaatCTTGGTTTATTTTTTAAAAATGAAATGAAAATGAAGTTGCATCCAAAGTA
-TAGGGTGTTCCTAAATACTTCAGGTCATCTGGTACGCAACTAGGAGAACTGGAAAACCAA
-GTCAAAGGTTCTTGAGTAATTGTTCCCTTCCCTCTCTCTCTTTCCCAATACTACAGCTTC
-TATTAAATCACAGGACTACAACTAGGATTTGTCTTTTTCCCCTCGATAATTCAAATTAAG
-AGAATACTGAAGAAACTTGATTTTACCAATTTTTATAGCAGCTTATTTGGAAGATGGAAA
-AAGTGCCTGAGTCCTAGATATTTGGAAGATCAATTCTCCTCTCCACTGTTCATAATACTA
-GTATATCTTAAGGCAATCTAACAAAATGCACTGCCTTTCTTATTAAGTTCCATTTTAAAT
-TGTCTTACTTAGTGCTTACTGTTCTCATGTAATTGCATAAAAGGAGGTGTAACTTTAGTG
-GCTAACCATTTCAGACCACTACATCTACCTTAACACCGTCAGAATGACTTTGAAGACATG
-GCTAGGTCTTGTATGCTCAACGTTTAGCCTAACAGAAGCCAATTAATCAGCTACGAAAAA
-AGTATCATGTCAATGAATTTTTCCCGACTGAAGTAAGATCACATCGAAGCCAACTGCATG
-GGTCTGCATGACCTATTCTTTAATAAAGTATAAGTAAATAAAAAGAAAATGCCATTAAAC
-CATAAGGAAAAATTGTCCATTGCCAAAATCATAAGTTTACTGATATACACTGAATACAGC
-AGAATTAATTTCAATAAAAACTCCTCTTGCCCTTAGCTAGTCCCTCCTTCTAATCTCTTA
-TGTTCAGTTGTTATTTTTCAATTTGGCAACTAAAAAGAAAACTAGAGGCTTAGTAACAGT
-CCAATACCAGAAAACTATACAAACAAGTTTGCTTAGTCATTTCTGCTAATGTATTTTTAT
-TGATGAATTTCCTAGTATCAGAAATGGAAAAGATCATTCTAGAACTTTAAGTCAATTTTT
-GAACTGTAATATAATTAGTTCTTTTTAACCCTAATGTTTATTAGTCTCCATCTTAAAAGG
-AAAAAAAAAATCTCCTTCTCATCCCTAAATGAACCATAGCAAATGAACAAGATCTCATCA
-TCATCCCGACAGGACAAAGATTTCTATAGCAAAGAATGAGGAATGTGCTTAGATTGCACT
-GACTGCATGGTTTAGGACTGCTTGTTTAGAGGAAAAGCAGCTATACAGGAAGACACCTTT
-TATGCACTGCTGCAGAGAATGAACTCTTTTTCCAAGCAATCAGGCAACATAAACTGGTAA
-GAGACAAACAAGACTTGTGGAACTCAGCGAGACCTTAAATATGTATACTTTTCTACCTTG
-CTACAGAAGCAAAGAGAAAAATTCAGTCAAACTTGCCCATTTCCCTTTACAAAAGGGGCA
-CTGATTAGAAGGCCAACTTAATACAAAAAAGCACAAGTAGCTAATGTTACCTGAATTACT
-TATTTCAAATGTCCATACTTAACCTTAATTTCTTTCTTCCTTTCCAATCAAGAGCAGAAT
-GCTCATACATCAAGcatttactgaacgtttactatgtaccaggaaatgtgtgcctgactg
-ccagaaaggcattctttctcttggtcctGGAGAAAGTATCTCTGCCCTCAGACAAAGAAA
-ACAGACCATTACAATCTCAAGTGATCAGTGCTTGAAACAATTAAGTCATGGTGGTGTACA
-GACGTTGAAGGGTATTTAAACTATCACCAACCCAtcattcattcaacaaatatttatgga
-gtacctaAAATGGGGAAAAACTGTAAGAGAAAAAAAAAACTGCACTTAAAGTACGCACAG
-GAATTATTCAGATGGAAAACATTAAAACAAGAAATTGCAAAGCGTAACACTTTAAAGCAA
-GTTAAGAATTTTAAAGACCTATAATTTTGCACCCTAAAATGACCAAAGGCTGGCACATTT
-TGTTATCTTCTATAAGAAACACATCATTGGATGCCACATGCAACGTGGCATCAGGTGTAA
-AAAAGCACCTGATGTGCTTTTTTTGCACATCAGGTCAGCAACCTTTTTATATCTGATTTG
-GAGACTATTAGTTTACTCGACTGTTACCATTTTGTGCTTAAAACAAACAGTATCATTAAT
-TCACAAGCTTTGGAATTCTTTCTCTTTATTTTCTTTTCTCTACTTCCAACACTAATCAGT
-TCCTtgttgcccaagctggagtgcagtggcacaatcgtagctcactgccacttcaaattc
-ctgggctcaagtaatcctcccacctcagcctcccaagtaactgaggctacaggcatgtgt
-caccacacctggcCCACTCATCTTTAAATAAGACAGAGAAGTAATTATAGCCAAAAGGGA
-ATAGAAAATGCAAACCCAGAGATATAAGCAAGCAAGGAAGCCTGGAAAGCCTTTGTTGAT
-CCTGAAAATTAGAATTTTGTTCTCACATAAACCAAAGCCCAGGGCTCTCACAAGACAAAA
-AGTCTAATAGGAGGCCCTCTTCATAAGGTGGGACTTCAGAGGCATACTTCCTAATGGTGA
-GAGTGACTAGGGAGTGGAAGATCCAGGGAGGAATTAAAGCCCTACTGAAGGGAATATCAT
-ATCTTAAGCTTGTTTTAAGGTGGTCTCTGGATTAGTGCCCATGCATACCTGATATAAGCA
-AGCTCTCCATGGAGGAAAGTACCTTACTGTGGGCCTCAAATGATCACTACAAATATCTAt
-ttttatttttattattttttatttttttgagacagagtctcgctctgtcacccaggctgg
-agtacagtggcctgatctcagctcactgcaagctctgcttcctgggttcacgccattctc
-ctgcctcagcctcccgagtagctgggactacaggagtccgccaccacgcccggctaattt
-tttttttttttttttttttaagtaaagacggggtttcaccgtgttagccaggacggtctc
-gatctcctgacctcgtgatccacccgccttggcctcccaaagtgctgggattacaggtgt
-gagccaccgcacccagccAATTATTTATTTTTAAATACAATGTCCTAGCAGATCTCAAAA
-AACAAGAGGAAAAATATAGTGAAATCGTTGGATATACttttttttttttttttttttgcc
-acaaagtcttgttctgccacccaggttagagtgcagtggcacgatctcagttcattgcaa
-cctctgcctcccaggttcaagtgattctcctgcctcagcctccagagtagctgggactac
-aggtgcatgccaccatgcccggctaatttttgtatttttagtagtgagggggttttgcca
-tgttttggccaggctggtcttgaacttctgacctcaagtgacccgcccatcttggcctcc
-caaagtgctgtgattataggcgtaagccaccgtgcccagccAGTTTGATATACTTTTAAT
-TGGTACTAGCAGAAAAGAGAATGGGATAAAGGCAGTAACTGAAGACAGTTGAAAATATCC
-CAGAAGCAATCAGACACAATCAAATTCCAGAAGCAAACAATTTccaaacaagatcaataa
-aaagaaatccaaaaccaaacatataattacaaaatagcaggaaaaaacaaagatgagttg
-ggtgtaatggcacaggcctatagtcccagctatttgggaggctgatacaggaagattgct
-tgtgcccaggagttggaggccagcctgggcaaaacagcaagaccttgtctcaaacaaaaa
-caaaaaactaaagacaagcaagtacagaaaaaggcagattatattcaaagagcaacatta
-gaacagctgatttttcaaaaccaacaatgaagccaagtagtttaatacctgcagtgtgct
-gaaaaaaataaatagccgccaaattaaaattctgttatcaagcaaatgtctctaaagaaa
-aaagaaaaataatcccattttggaaggtctgagttgaaagaaaaaataaagagcaaaaaa
-gaggaaaatttacagacagctccaaacaaacactgattatacaaaagaataacaatacct
-tgaggagctttaaaacatagaatacataacaataaaaacacagtgtattgaggagatttc
-aaagtattctttctaaaggtcttttattatatgaaaagaagataaaattataatatcagg
-ttttgctaagttatagctgcaagtcacaagatgtatgacaactaattacagaataaaaat
-agcatatatttccaaaccagaaagagggaaaagtaaaatcataaaaagaatccaaaagaa
-tgttaagaagggagaagaaaaaaatctagaacataagaagcataggggaagaaagttgaa
-ttggaatatgattaattatattaaatataagtggaataaattatccaggtaaaagacaaa
-gactatcatatcagactggattaaaaaagaaatccaaatgaaccagaataatccaaacaa
-ttctgaaaaataataaagctggaagaattatactaactgatcttaaacttattacaaagc
-tatagttgtcaaaacagtgtattggcaaaaggataatacatagatcaagggaacagaata
-aagagtacagaaatacactcacacaaacaaggccaattaatttttgacaaaggtacaaag
-gcagttcaatggagaaaggacatatatacatatatatataaatatattatgtattttttt
-cgagatagggtctgcctctggtgcccacgctggagtgcaggggcatgatctcaactcact
-gcaacctccgcctcctgggttcaagtgattctcctgcctcagcctccaaagtagctagga
-ccacaggagtgtgtcactatgccctgctaatttttgtatttttagtagagacagggtttc
-accatattgcctaggctggtctcaaatttctgagctcaactgatccacctgccttggcct
-cccaaagtgctgggattacaggcataataatcttttctataaattgttttggaagacttg
-gagatcaatatgcaaaatcataaactttaatctaaatctcacactttatataaagataat
-tcataatgaatcacagatatcaatgtaaaacttgggtcagatgcggtggctcatgactgt
-ataatcccaggctgggtgacaaggcaagactctacctctgggggggaaaaaaaaagatat
-aaatgtaaaattatcaaaccttcttgcaaccaggggttaggcagagtttgaagacatgac
-actaaaagcatgggctgtaaaactgataaactgaacttcatcaacgttaaaatatttctg
-ctctgtgaaagacactattaagaaaataagccagacacaagaagaatgtatttgcaaatc
-acaaatcgaataaagaacttgtatctgtaacattaaaaaactcaataagaaaacagctca
-atttaaaaatgggcaaaagacgtgaacatacacaccacaaaagaagatatacacataagt
-atatgaaaagatacacaacactgccagacagcagggaaaatgaaattaaatcatacaact
-accactacagatttattaaaatggctaaaatttaaaaaaacagaaaacaaaactatacca
-aaagctggtgtggatgcagagtaacagtaactaatacattcctggtaggaatgcaaaatg
-gttttggaaaacagtttggcagtttcttatagagttaaacatgtacttaagcatacaacc
-agcattcccactcctaggtatttactcaagagaaacggaaacccgtatctacacaaaaac
-ttatacacaaacatttaaggcagctttattcataattgtgaaaaaacagaaacaaccaag
-gtgtccaacagttacatgaacaaacaaatggtttgccatgtgatgcttagcaataaaaag
-gaacaaattactgatttgtgcaacaaaatggatgaatcGtttttctttttttggtagaga
-cagggtctcgctttgttgcccaggctggtctcaaacgtctagcctcaagtaatcctttgg
-cttcagtctcccaaagtgctaggattacaggtgtgagctgctacacctgaccaacatggt
-gaatcttaaaagtgaagaagccagaaacaaaagcctacatattgtatacttccatttata
-tcaggggtccccaatccccgggccatgggcctgtaccagttcatggcctgttaggaacca
-ggctacacagcaggaggtgagcagcgggagtcactcgcattactgcccgagctctgcctc
-ctgtcccatcagcaacagcattagattctcataggagaaccctattgtgaactgcacatg
-tgaggaatctaggAGGTGGAGCTCAATTTTTCTCCTTTAAGGAAAGGAAATAAGTAAGCA
-TGGAAAGAGAGCCTAAATTTCTCCCTTTCCATGCTTATTCATTACAAGGGTATTCCTAAG
-TCCAATGGGCTtggaaagggagaaatagcaactctacagtagaaaaacctggcagacttt
-actgaaatatcactagtgttaagtcactttgacatcatatgcccctgatataatgtgatg
-agaagggcacttcacctctgtggtagtcttctcaaaaatccataaccacaatttaatctt
-gagaaaacatcaaacctgtattgaaggacattctataacatacatcaccagtcttcttca
-aaagtttccaagtaatgaaaattaaagacagactaagaagcttcacagactggaggatac
-taaggagacatgatgactaaattaatgtggtatcctggactggctccttgaacagaaaaa
-ggatacaactggtaaaatccaaacaaagcctgtagtttagttaatagtattataccgatg
-ttaatttcttaattattttatttatttatttatttttagagatggggtctcactttgtca
-cccaggctggagtgcaatggtgtgatcctagctctcccagttcacagcagcctcaaactc
-ctgggctcaagcgatcctcctgccccagcctcctaagtagctaggactacaggcacatgc
-caccatgcccacctaacttctgagaaccaggttggtctcaaacgcctggcctcaagcaat
-cctccccaccacggcctccagagttactgggataacaggtgtgagccaccatgactggcc
-cagtttcttagtgttgatgacatatcacggttatggcaagatgtgaacattaggatatac
-tgagggaagcatatatggagattctatctgtaacttctgtaaacctaaaattttcaacat
-tacaagttAAATACTGCCAATATTTAACTTGAAATGCTAAAGAGGATGAGAtgctagaga
-agatgaggaaaaactgaaactcatacattgctagtgtgaacgcaaaatagtactgtatag
-ccattctagaaaacagtttggcaacttctttataaataagttaaatgtacatttttcata
-tgacccagcaatccaactcacagttatttaccctagaaaaatgaaaacttaggtccacaa
-aagcctataatgttatgttcacagcaactgtattcataatcaccaaagaatgaaaaccaa
-aatgtccttcaaggagtgaatggataaaaataactatagtctatccataaatggaatact
-actcagtaataaaaaggaactaaccatttacacacacaataactttgatgaatctcagag
-gcagtatgctgaatgaaataagccagtctcaaaatattacataatgtttgatttcattta
-tatgacattcacgaaaagataaaactgtagtgaggttgggcacggtggctcacgcctgta
-atcccagcactttgggaggccgaagcggatggatcacaaggtcaggagatcgagaccatc
-ctggctaacacggtgaaaccccgtctctactaaaaatataaaaaattagccgggagcggt
-ggtgggcgcctgtagtcccaactactcgggaggctgagcttgcagtgagctgagatcacg
-ccaatgcactccagcctgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaaa
-aaaaactgtagtaactcagaacagaacagtggttgctagagattaggggtgggaggctag
-gtatgttaccaagggtaacatgcagaaggtgatataactattctatgtcccagttgtgat
-ggtagttacttgaatctatgtatgtattaaaattcatagaacagtatacacaaaaaggag
-tcaattttactgtgtattaatttaaaaaaaaATTTAAAAAAAGGAAAAAAATTCTATCAC
-ATGCTGTCTAAAAGAGATACATCTAggccgggtgcagctgctcacgcctgtaatcccagc
-actttgggaggctgaggtgggcagatcacctgaggtcaggagctcaaaaccaccctggcc
-agtacagtgaaacccatctctactaaaaatacaaaaatgagctgggtgtggtggtgcgtg
-cctgtagtcccagctgctcttagaggctgaggcaggggaatcgcttgaaactctcgagag
-gcgaaggttgtagcaagataacgccattgcattccagcctgggagacagagggaggctcc
-ttctcaaaaaaaaaaaaaaaaaaaTTAATAAACAAATAAATAAAAGAGATACATCTaggc
-caggtgtggtggctcacttgaggtcaggagtttgagaccagcctggccaacacagcgaaa
-cctcatctctacttaaaaacaacaacaacaacaaaacacaaaaattagctgggtgtggtg
-gcgggtgcctataatcccagctactcaggaggctgaggctggagaatcgcttgaacctag
-gaggtggaggttgcagtgggcactccagcatgggtgacggagactccatctcaaaaaaaa
-aaaaaaaaaaaaaaGAGATACATCTAAAACATGGGGTATATATTATAtacacgatgtata
-catgcactgaaacatcacaatatatcccataaatatgtacaattatgtatcaattagaaa
-tTAAGAGCTGGGCACAGCTCAGGGGtccctgcactttgggagactgaagaggaaagatgg
-cttgaggctgagttcgtgaccagcctgggcaacacagcaagactaccatctctacagaaa
-aatttaaaagttagctaagtatggtgcatgcacctgtgtcctagctactcagaaggctga
-agtgatcatgtgaacctaggagtttgaggcttcagtgagctatgatcacagtgttgcact
-ccaacctggctgacagacactctgcctcaaaaTCAATCAATCaataaattttaaataaaa
-aaaaaCATAGGCTATAGAGAGTTTGTTCataaaaatacgatatttcaaaacgtgggatac
-aattaaagcaggacttagaaatttataaacttaggccaggtgtggttgctcatgcctgta
-atcccagcactttgggaggctgaggtgagtggattacttgaatctaggagttcgagacca
-gcctgggcaacatggcgagacctcgcctctataaaaataaaaattTTAAAAATCggctgg
-gcgcagtggctcacgcctgtaatcccagcactgtgggaggctgaggcgggcggatcacga
-ggtcagaagatcgagaccaccctggctaacatggtgaaaccccgtctctactaaaaatac
-aaaaattagctgggcatggtggcgggcgcctgtaatcccagctactcaggaggctgaggc
-aagagaatggcgtgaacccgggaggcagagcttgcagtgagccgagatcgtgccactgca
-ctccagcctgggcgacagagcgagactccatctcaaaaaaaaaaaaaaaaagaaaaaaaa
-aaTAATAATAATTAggctgtgcacagtggctaatgcctgtaatcccaacactttgggagg
-ctgaggccaaggtgtgaggattgcttgagctcaggagtttggagaccagcctaggcaaca
-tagtgagaccctgtctctatttttttaacttaaaactattaaaaaaaaaaaaaaaaaaaa
-aaagccaggtgtggtggcatgcacctgtggtccaactattcaggagtctgagatgggagg
-aacacttgagcctaggaggtggaggctgcagtgagctgtgattatgccactgcactctag
-cctgggcgacatagcaaggccctgattcgaaaataaaaaTTCATAAACTTGAACttagaa
-aagcaaactaaaaattaagaacttacacatatctcaataaatttgaaaacagaagcccag
-agaaactagaaggaaaaaaacgggaaaagcagcaatcaaagaaatatgaaacaaagaGGA
-TCCACAATACCAATTGAGTCTTTAAAAATGCTCGTgctgagcccgtggctcatgcctgta
-atcccaacactttgaaaggccaaggcaaaggattgtctgagtccaggagtttgagatcag
-cctgggcaacagagtgcaacccccaatctctacaaaaataatttaaaaattaggccaggc
-atggtggctcatgactgtaatcccaatacttaggaaggctgaagcgggaagactgcttga
-gcccaggagtttgagaccagcctgggcaatacagtgagactccatctcaaaaaaattgtt
-tttaataataaaaacaatggaaaaaattagctgagtcccagctactcaggaggctaaggc
-aggaagatcacttgagcccaggagtttgaggctgcagtgagctatgatcatgtcactgca
-ctctagccagggcgacagagaaagaccctgcctcTGCAGGTGGGGGGGAAGAAATTAAAA
-ATGTAAGTGTGCTTGATTTAAGAAAAAAAAAAAGAAGggccaggtgtgatggctcatacc
-tgtaatcccagcactttgggaggctgaagcaggcggatcacaaggtcaggagctcgagac
-cagtctggccaatatggtgaaaccccatctctactaaaaatataaaaaattagctgggtg
-tggtgccacacgcctgtagtcccagcaggaggataaggcaggagaatcgcttgaacccgg
-gaggcggcagaggttgcagtgagctgagatcatgccactgcactccagcctggcgacagt
-gagactctgtctcaaaaaaagaaagaaagaatgagagagagagagagaaagagagagaga
-cagacagagagagagagagagagagagagagagagagagagagagagaATGAATATTAGG
-GTAAATGTCCAATATCAAGAATGGAAATGAGGGAGTGAGGGATGAATTAGGGTAAATGTc
-cagtatcaagaatggaaatgatacatcactacagatcctacagatggtaaaaagataaga
-caatatcacgaacaactttgtgcccacaaacttgaaattcccagaagaaaaataatttat
-caaaactgatacaagaTCCCAGTCTGATTCTCAGGGAGAAAAAACAAAAACTGACACAAA
-AAATGAAAACCATAAATAGTCCCATAACCAATAAATTCAATCAGTATTGTTTCAACCTGT
-TCTATTCTAATGTCTTTGAACTGCACAGATTAACATTTTCAAAACATTTGTTTAAACTGA
-CTGAACTTGCTTCCCACTCCTCTCCAGGTCTCTGTGCTTTTATACATTGATTATGCCTTC
-CAATAGTGCTTGCTAGGGGAAATCCTACTCACCCTTCAAGAATCAGCAAACTTTACATCC
-ACTATGAAGCACACTATGAAGCATTCCCATCTTTCTCCAAAACAGGCCAAGTACCTCTTC
-TACAGGGCCAAAGCAACCCCATATACTCTCTGACATTGTCACACTGAATGTGTTTTGTTT
-ACATACACCTCTCTCCTCAGATTATGAATTCAAGTACTTGGACTTTGATTTATTTCTCTT
-GGTGGATGCCCCGTgtttcaccacactgcccaggctggtctcaaactcctgacctcaggt
-gatccaactgtttcagcctcccaaagtgctagggttacaggcatgagccactgtgcccgg
-ccTGTGGTTTTTAAAATGCTCCTCAGTCTTACCTATAAATGTTATTGCATCCATCCTTTT
-TAAACCAGGGGAAAAAGGTTTCCTACTATCACTTACCAAAGAGATGTGAAACTAGTCAGT
-ATGGGTGAATGATGTTTCTTGGAGATTTTATGAGGTTCCACGCTGCATGATTTACCATGT
-GATGAGCACACTGCTTGACAAGCCTTGATAGAGCTACAAAAACAGTTCAGTACTCCGTTA
-CTGAAAGGATCTTGGATTTAAAAGACATCATAAGGTTGCAGAAAGAATAAGTACACTAGA
-ACCACTACAACCTACATCTGATGTTGGATATGTTATTTAACCTACCTGATTAAAGTGAGA
-AAACTGCAGAATATAAGGATTATCACCCTTCCCCCACTCCCTTCTTTACTGCCATGGTGG
-CAGGTTACATAGCAGACAACCATCATCTCCGCAGGTGATCAATAACCAACAGCTAATAAG
-GTAGGTTGTCCTAAAACTGACAAAAATAGAATAGGCTGGAAGTAAGGGCAGTAAAAACTG
-GTTGCCTTTCAATTCTGAAGATATTATGTGAATGCCTATGTCAGTCACTGATTCTTGGGA
-TTTATCAtttttgtgtgtgtaacagggtcttgctctgtcacccagggtgggtgactgcag
-ccttgacctcccaggctcaagcaatcctcctccttcagcttccttagtagctgggaccat
-aggcatacactactgtcccctgctaattaaattttttcttttttttctttctttcttttg
-tttttttttctgagatgtcttttgtttttgttctgaggtcttgttatgttacccaggctg
-gtctggaagtcctaagctcaagcaatcctcctaccttggcctcccaacgtgctgggatta
-taggcatgagccaccatgcccagccAGATTTATCACTGTTAAACCAGCAAGTCCATGACC
-TAAGTAATGTCTTTCTCATTTTACAGAAGGCAAAACTGCATAACCTTCCCAATGTCAGAG
-GTAGTGATTGGAAAACATTCGTCTAGATTCACAGCCTATTCTTCTGTTCTACAGCAAGGG
-ACTGTAAACTGGTGACCACAAACACAGCCAACCCCCATACccatggtttcagttacccgc
-agtcaactgcagtctgaaaatattaaatggaaaattccagaaataaataagtcataagtt
-ttattttccatgtttgtttttagagacgaggattcactcagtcacccaggctggagtgca
-gtggtgcaaccgtagctcactgtagcagcctctacctcccatctcagcctcccttgtagc
-tgggaccacgggcatgcaccaccactcctggctattttttttttttttttgtaaagaagg
-tttctcactatgttgcccgggctagtcttgaactcctgggctcaagcaatcctcccgcct
-taccctcccaaagtgctgggattacaggcatgagccattgcacccagccatgttttaaat
-tgtacatggttctgagtaatgtgatgaaatcttgcaccatctagtaccatccagccctgg
-atgtgaatcatccctttgtccagctgtatatgccacctgctcattagtcacttggtagcc
-ttcttggttacttgaatgttgcagtattgcagtgcttgtcttcaagttacccttatttta
-cttaagaaatgccccaaagtgcaagagtagcgatgctgagaatctggaaatgccaatgtg
-aagctgtaaagtgcttcctttaagtaaaaaggtaaaagttcttgacttaatatggaaaaa
-aaaatcatatgtggaaattgctaagatctatggtaagaacaaatcttctatcagtgataa
-tgtgaagagggaaaaataaattcacatttgttttgctgttgtacctcaaactgcaaaagt
-tatgaccgcagtatgtgataaatgcttagttaaaatggaaaaggcattaaatttgtgggt
-agaagacatcaacagaaaactgtgttccaactgatgataatcaggtttggtattatctgt
-ggtttcaggcatccactggggatcttggaatatatttcccacagatggctgggaacagga
-ctactCTGTGTGTATATCTCCTATTTGGCTCACATATTACTTTTAAAAattgagataaaa
-tccatgtaacataaaactcatcattttagggtacaatcagtaccctaaaatggtgtgttt
-tcgtatattcacaatgctgtggaaccatcaccactatctgattccagaacacttcatcgc
-cccaaaaagaaacccagtacctcagaggattaactcccaatagcctcttcctacaatcct
-ctggcaaccaataatctgctttctgtcttcatgtatttgcctattatggacatttcacat
-aaatggaatcatgcaatatgtggcctcttccacttagcaaaatgtctacaagtttatcca
-cgttgttgcaagtatcagtaattcatttccttttacagctgaattcactgtataaataca
-tcacattctggttgtccattcactgacagatatttggactgtctccactttttggctact
-atgaaataatgtcgctaggtgcatatgtgtacaagtttttCACtttttttcctttttttt
-tttttttttagagtcaggaccttgctctgtcacccaggctggagtgcaatggcatgatca
-tagttcacttcactgcagcctcacactcctgagctcaagtgatcctcctacctcagtctt
-ccaagtagctgggactatgggtgtgcgccaccacgcccagttaattttctgcatttttag
-tagagacagggtttcgccatgttgcccaggctggtctcgaactcctggattcaagcgatc
-atcccatcttagccttccaaagtgttgggactacagtatgagccacagtgcccagccTTC
-ACACTGTTTTTAAAAAGTAAATCAGGggccaggcatagtggctcacacctgtaaccccac
-cagtttgggaggctgaggcaggcggattacctgaggtcaggagttcatgacagccttggc
-caacatgatgaaaccccatttgtactaaaaatacaaaattagccaggtgtggtggtgggc
-acctgtaatctcagctacttgggagcctgagacaggagaatcacttgaacctgggaggca
-gaggttacagtgagctgagatcgcgccattgcactccagcctgggtgaaaagagtgaaat
-tccgtctcaaaaaacaaaagaaaaGGTATTAAGGTGAATTATGTATTAAAATTTTTCACA
-ATTAATATTTTTCAAAGTGACAGTTACCAAAATTAAAAAAAAATTTAACTTTCTATTTCT
-TAAAAGAAATAAAGCAGGAGGGAGGGCAGGTAGGTCTGTCTGTCTGGTAACAATGACTCT
-TCATTCCTGCACTGACAAAAACCTGCTGGATATGCTAAGCTGTGACTGTCCAACAACTGG
-CTCTTTTAACAGACACCCAATGGAGATACCACACGTAAACCTGGACAACTCTTCATTTAC
-CTTATTGACTCGACTCCTGAAGGCATTTGAGCAATCAATCCCTGGTTTATACTAAATATA
-TAAATTTACAAATAATAAGATGGGGGAACTCTTATTTAGACTACACAAATTTTGGAACTG
-AAAATGCAGCTCAACAATGAGATCAGTGGCCATGAACTCTCTGGTAAATGTATATAAAGC
-AGCATGTACATGTACATTTTTTTTTGAAGAAAAAAATTATTACAGGCTCAGGAAATCTGT
-AAACTCCAGCAAAATTAATAATTCCTGAGTTAGACAAACAGAAACTCATCTAAGAAGGCT
-AACTTGGTGATTTACATAAATATTAAAAAATTAAACTGCTCAAACTAAGTATATGCCATT
-CTTTCCTGAAGGAAGACAAGAAGACAATGTATCCTAGGCTTCAGAGTATGAGACCCAAGC
-TTGATGAATGATTAACAAAATGTCAGCCTCAGAAAAGATACAGTAGCATTCAGAGTTAGT
-CAGGTAGAGATAACAGTTTTACAAAAGGGAACTTTACTTCTGCCTCACATTACTGCTTAG
-AAAATAAGAACTTGAATTTCTTCACTACTGTCCAACCTTAAATTGTTCACAGTCTTGTAT
-TTTAAAGCATATCCTTTGAATCATGTGTCCAAAGAGAATTACTTGTGGGTCAGAGAGGTA
-CCTTAAAATGGCTTTAAAAACTTAAAACCAAGATTATTTTCAGATTGTTTACCCCCTTGA
-ATCTTAAAACTGTTCAGATATCCAATTACTGAGCTTTCTAAATTAGTGCTCCCAGTTTTT
-CTAAACTTTTAACtttttttttttttgagatggagtctcgctctgtcgccaggcctggag
-tgcagtggcacgctctcggcttactgcaacctccgcctcctgggttcaagcgattccccc
-gcctcagcctcctgagtatctggactacaggcaagcgccaccatgcccggctaatttttt
-tttttttttttttttgtattttagtagagacagggtttcaccatgttggccaggatggtc
-ttgaactcctgatcttgtgatctgcccgcctcggcctcccaaagtgctgggattacaggt
-gtgagccactgctcccagtcTTTTTTACAGTCAAGACAGAAAATAATATTTGTATGGCAC
-AATGGGGTAAATGATCAAGACTGCTCTGGATCTGAGGTCATTAGTTTGGATGCTGTATCC
-AAACTATATTCTGCATGAATGGCCAGAGGTGTGAGGGGACCAGTATCTCAACACATCTGT
-AACGCACCCTAACACAATACACTGGTTGAGAAATTCTAGTTTAAATAACTTGTGGAGATC
-ACGACCTGAATAGTCAAAATCCATGCAGCAGGTTGAGAAAACTATTTCACAATTCCTCTT
-ATTTCAAGAGATACGCAATCACCTTTTGCAGCTTTCAAGTATAGACCAGATGTACTAACA
-GGCAACCATTTCGTCTGGAAGATCATCTATTTGGAGGTCACTGACACAAAAAAACAAAAA
-CAACAAAGACAAAACAAGCCTCCTTACCCTAGCTCAGAAGGATAAGCCAAAAGAAAACAG
-GTTAACGGTAAAAATGTATGATTAAATGAAGTTATTGTTTTTTTTCCTCCACTTCATATT
-GATTCTCTTTTCCCATGTCAATTTAAGGTGGTAACCATGGCCAACAACATTCTCTCTCAC
-CTATCATACTAATGCCATATAAGTAGTAGTGTTTTTGTTTTTTCAAGTGGGGAAATATAT
-ACAGCTCAAAAAAACAAAAAAATATCTAGCAACTAACTCCTTGGCAGTTCCCTTGACTCT
-CTGACCTTTAAGTCCCAAGGTTCTAAGTATACAATGAATAAGAAAACTACCTGTTCAAAC
-CCAACAGAATATGTTTTTTTCTGGTTTGATTAAGGCTTCGAATTTGGAACATAAATACTC
-TCAGTAATACTTAGTAATTCATGAAGTTACTGCTTGTGTAAACTTGCAGAATATTTAACT
-TTAGGAGATTATAAATCCTAACATGCCCCTAGGGGCCTTCTGCTTTTATTCCTACATACA
-AAACATACAACATGTTTGTTTTTAAAAACAATGCACATAGgccaggtgtggtggcacaca
-cctgtagtcccagctacttgggaggctgaggcagaagcatcacttgaacccaggaggcag
-aggttgcaatgagccgagatcatgtcactgcactccagcctgggtgacagagcgagacgc
-tgtctcaaaataaaTACATACATACATACAAAAAAATTAAACCAATACACGGAAGTATTA
-CTTCCATAAAACAAACCAGGAAGTACAGTAAAACAGAAAACATTAGCATTTGGGCCTTTT
-GTGTGAATTACATTTCTCCACCTTCAACCCAGAAAAGGGATCTGAGTGTCAATGTGACAT
-AAATGACATAGCAACAGTGTGAGGTCTCCCAATGAAGGGAGGTATTAGAAGAAAATCCAA
-GCAGTTTGATTTGGATTAATAGTTCTACCCCAAACACCTAAGAGAAATCGGAATTCCAGT
-ACTGTCTCTTACAATATAGTCATCATCTATACACCTTTTTACCACGCCATATAAGCAAAA
-TAAAGTCACAATGTGAAACTTTACTCCACTGGCTATTACCCTCTGGAACCAAAAGATGGA
-AAACTTCATTTGGGATATACAGTAATCTAAAGAAAAATTCAGCACTTATGAATGTAATAA
-CTACTGTTACCATTTGAATGCCTCTTACAAACCAGGCACAGTATCAGATGCAtattctga
-ttttagaaataaacagattcagaggttaaataatctgccaaaaacaacaggattactaag
-tggtggaagccagatctgtttaggatccaaagcctaaataggttcttttcactAAATTTA
-ATACTATTTCCTTAGTTCTCCAAACTGATTTATTAACAGCCTATCCAAAACACTATAATA
-AAATGAACTGCTTTAAATTTGGAGGCAAGGTAGGGGTGGGATACTGAGTTTCAATAATCA
-GGTTTCTTCATTATTCTTTTACCTGAATGGGCTGGCCACCAGGCCACAATTGTATAAAAA
-TCAGATTTTAAATGATGGAAAAGCTTTTCTGTGTGGCTACTGAAGGGAGAAAGGAAGACA
-ACTGAGACATGCCCCACCTTGCTGGCTGGGGGCTGGTGACATCTGTGGGCCTCAGTGTTG
-GACTCCAGATGCAACAAAGCCTAAAGTTTTGAATATGTATGAAGGTCAATGTGATGTTTT
-CCAAAAACAGTCATAAAAGATGGCTGTGAAAAACCCCCTAGTATAACAACTGTATGTAAC
-AAGAGCATATAGGTAGCTGCAGATGAATGCTCAGGTCCTTAGCTGTGGTGTTTAAAAATT
-CTTCAGACCAggctgggtgcagtggctcacacctgcaatcccagcactttgggaggccga
-gatgggtggattgcctgagctcaggtgttagagaccagcctgggaaacacagtgaaaccc
-catctctactaaaatacaaaaaaaaaaaaaagccaggcgtggcagcgtgcgcctgtagtc
-ccagctacttgggaggctgaggcaggagaattgcttgaacccgggaggtggaggttgcag
-tgagccaaggtcgtgccactgcactccagcctggcaacagagtgagatgctatctcccaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTTTCTTCGGACCAgtgtggtggctcatgag
-tgtaatctcagcactttgggaggctgagttaagaggactgcttgagcccaggagtttgag
-accagcctgggcaacatggtgagaccttgtctctacaaaaaaAATTaacaactacccaca
-aagaaaaccctagctcaagatggcttcactggAAGGAAAAATGAACTGGTCAGGAAGACA
-GACAAATAGAAGCAAATAATGAAAGCATTTTATTTGACATTGATAACCTTCTCACAATAA
-ATTATGTGGCAAAATACATGCTTGAATACTTAATTGCTAGGCAATAGTCTATTTTCATTT
-TTTCACAAAAGGTAGACAACTCCAAAGCAGATGGCCATTTGTAGCCATTCTATATAATCA
-TAAATACACAAAACACTggccgggcgcggtggctcacgcctgtaaccccagcactttggg
-aggctgaggcgggtggatcacctgaggtcaggagtttgaggccagcgtggccaacatggc
-gacaccccgcctctactaaaaatacaaaaattagcccggtggggtggcatgcacctgtaa
-tcccagttacttaggaggctgagagaggagaatcacttgaacccaggaggcagagattgc
-gccactgcactccagcttgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaa
-aaGTTTTAAAGTGCCGATAAATACAAGTTCCTGGTCTGCCTACAGTTTATCACTTAATAA
-TACAAAGCAAACAAGAAAGCAAGTTAGTGGATTACCTGAGAGAGCAAGACATAGAGAAGA
-TGTTAATGCAGGGAGCTGGCCTTCTCCAAACATATCCCTAACACACAATATTCAAGCAAT
-TCCCAAACTGTGATCAGAGAACCACTGGGAGTAAGACCTCTGATCTATATTTACAAGTCT
-ATAGGTGAGCAAAGGTAGACCTTTTCCTGAGTCTGAGATGGGAATATTACCTTCTCTATC
-TAGAAGCAAAAGAATCCTAGACTCACCAGGACTAGGTAATAGACACTGTACACGAGTAAT
-TGAGGTAATCTACACTGGGCGTGACTTACATACTGATCCACCCCTAGGCAGCAATTCATA
-CCTCACCCACCCAACAGGCTACATTAGAAACAAGGAAGTACAGGTCAAAAGTCTCATTAA
-AAAAATAAGAACTCTTGGCAGCAGAAAATGAAAATAAAGAATGAAGAATGACAGCACTGG
-CAATAAACACATTCTTTTCTCCGAAAGGGAAGGGAAAGAACTAATGTTGGGCACCCACAT
-GCCAGACATTTTATCAATTTTCTCCTTTAATCCTCAATAATCCTGAGATAATACTAGCTA
-GTACTCTAGTTAttaatcctcacaaaaatcctgaggtaggtactactaattcccatgtta
-caggtgaagaaaccaaaagttagtaagttgcccaaggtAGttgttatccgaactgtagag
-acaagaactcccagacttgaagaggttaagtaaacttccccaaactcaAAGTGGGAGTTC
-TTTCCCACTAACCTATTGCCTTCCCCTCCCTACCCGCAATCTCAATTAATTCTCTATTCT
-ACCCCCTTCTCATTTCTGCAGCTGTTTCAAAAACTACACCTAAGATACAAAGCAAATAGG
-AGTTATTATAAGAAAACACCTCCAAAATCTACTAAGTTGTGGTATGATATGCCTGTTATC
-AGAAAACGTCACTCAATTTTGAGCTTGGAGGGCAGTGACAGTTTGGAGATCTTtagcaca
-acgcctgccagaaacgtggcaggcgctcaggatctgctgaatgaaCAACATCTTCTGAGT
-GGTTATGAATTCAATAACCCAAAATGACCATCTCGTATTTCTGGATATGACATGATACCA
-TTTTTTGGAAAATAATTTACCCATTCATTTTAAACAGGGTAGCTTTCTTAAAATTTATAG
-AACATTGATGAGATAGCTAAACTGAGAAATGCCCATTAAAGCATTAGTCATAACTTCAGG
-AAAATTTCAAATGTTCACTTTTCCAAGCAAATTAAAATGTTTCAGCTAATAAAAACCTGT
-CAGAAAAACCCACAAGACAAGAAAGTATAAAAAGAAAAGAGCAGCCAATATAAGGGCATT
-TAAGATGTCACACATAAAAAATTATAAAACATTAATCTAACTTGTACCTTGGTATTTAAC
-CCTAAAACTGTCACCTCAGATAACACAATATTTTCTATGCAAGAAAACATTATCACCACG
-AATGTAAAGAAGCTTGCCGACCATAGCAACTGTTGCTACGTAGGGTTTTTTAATGTCTAA
-GACTGAAAGACAGAATTTGTAGAAACCAGTTAAAATGCCACTCTTAGCAGTATCTTGTGA
-TACTGTGAATGCTTTCACCTTAAACTTTTTAAAAGACTCAATCTTTGACTTCTACATGTG
-AAAAAAAAAAAGTACATCTGGGAGCACTCAACGTAAGAAAACTACCAATTGTCTATAACC
-CAATGAAAATACATCCTTTGTTACAATGACAGCAGCTACTTTTCCTTAATAATCCTAGAG
-GAATTTCTTCATTTGAAAAGCTGGCTGGCCTAGATTTCTCTATAAACTAAATGACATGCT
-ACTTTCGAAATTATCCATTTCAGAAGTTCAAAGAAATTCAGGTATAAGAACACATTAATA
-CTCTCATGAAACAAACCTTATCCAGGTTACCCACGAATTGTGACAGATCAAAACCCAGTT
-TCTCATTTCAAATCAAGTATCACATTATTTATTACCTTAAAATACTAAGCCCTTACCTAA
-TTCAATGGCAAATCATATTGGTTTTCAGTTTCTGAACTTGTACAAATCATACTGTAATAT
-TTATGCAAAAGTTGTCATATAGTTGAATATTATAGACAGTTAACATCttttttttttttt
-tttgagacggagtcttgctctgtcccccaggctggagtgcagtggcgtgatcttgactca
-ctgcaaccaacctccgtctcccaggttcaagtgattctcagcctcctgagtagctgggac
-cacaggcacgcacctccacactcagctaattttagtagagatggggttttaccatgttgg
-ccaggctggtcttgtcctgacctcaagtcatctgcccacctcggcctctcaaagaactgg
-gattacaggtgtgagccaccatgcccggccAACAGTAGAAAAGGGTACTCAGGGAACATA
-GTTCAAAAGTCATGATTCTCTATTGGCTGGACCAGGATTCTAGACTAGCTCTAGGGCTGA
-GATATCTTAGTAGACCAGTTAACATTCATGTGGCCCAATTTCCCTTACTCTAAACCCAAA
-GTCAAACATAACCTCTAAAGTCTTTCATACCCTGAAATGCTAATCTTGTAATCATCTTTC
-TATTCAGGTAATAACTCAAAAGAAATGGTCTCACTTCCTTCATCCTCTGACTAAAGTTTA
-GTTAGTCCATATTTTATGAATCCAATTAATAGGATACTTTAAAGAACAAAAAGAAAAGAC
-TTTTCTTAAAAGCTAGAAACTCCATTCTGTAGTGATGATTCCCAGATCTGACTCTTAAAC
-TCAACAACCTCAACAGACAATGACAGGGAGAAAAGATCTTACAAGTTTGAGCTGAGCTGG
-GGTGGGGTGGGAGGTGTGAGAGAACAGAGAGACAGTTACAAATTCACAAAAATGTATCAC
-CCATTTCCATCTCCTCTAAAAAAATATGAAATAAGCCTTAAAAGGCTGTCATAGAAACCC
-ATTATTAAGCCAATAAAAACTAATGAAGAAATTATGTCATTTATCCAAGATATGGAAGAA
-CCACCTATTTACAGAAATCCTACCAATGTCCTAGACCTTCAGAAACTACATCTCACTAAG
-CTGACCATCAAGCCCCTTCAAACTGCATCTAAGGACAATAATAATATTCAAACATCAAGA
-AACAGGCACAGGTTCCACTCAACACCATTATTCCGTGGAGTCTTCCAGGACTAAATTGTT
-TTATAGAATCTTTGCTATCTTTGTTCTCTAGAAAATGATATCCCAAAGACTCTAAAATAA
-AACCAGCAAAACCCCtgtatttgttttccattgtgtcataacaaattatcacaaacaaaa
-caacacaaatggattatcttacagaagtcagtgggcttgactgggtctcacaagggctaa
-atgagggtatccagtgggtgggttccctgctggaaactctggggaaaatttgcttccaca
-ttcattcaagctattggctgaatttagttccttgcagctgtaggactgagttcccacttc
-cttgctggttgtcagctgggactggcctttcctactagaggctgcctgcattccccgtct
-cacactttcaatctggtcccctccagtaacggcaggctgagtccttctcatgcttcaaat
-ttgacttccccttctgcctcatctctgacaccagccagaaaaagttctctgcttttaagt
-gcttatgtgagtagaataaacccacccagaaaatccaagataatctacctaagatcctta
-actttaattaaatctacttaacatattcatgttccagggtttatagtatggaaatcgtag
-gggagccattctgcttaccgcagtctgccttctggtttccaaggattcatctctctctca
-aatgcaaaatacatccatcccatcccaaggtcccaaaggtttcccatctaaagcttatca
-tttcagaagtcccaaatctcattcatctattcaggtgtggatgaggttctggggacaaaa
-cagtaagtccaattcctggggcacaattcctaaagaaacaagttctctactcccaacata
-ccactgtgagacatgtagagaataacagttagacattccagttcaaatgggcaaaatgta
-aaagaaaacagagcctccggtccaaagcagtttcaaaatctagggaatctccattccatt
-tcaaagcctgggaaaaatcctctccagcttttagctccacccctctgggctctcctatct
-ccgtctgagtcaccctgattcttttatgaaaagcaacacattcacatgtgagtagtttta
-tcagcctgcttcctatcagtagaatttggggggtccaacagccctattactttctgtctc
-tttcaatccaaactagaactgtttatgttggcataaaattctcaagaacctaatgggctg
-tggaagtattccacatgggtccactccattaaagttcacattcacaaataaaccaggctg
-cacatttaatactttgcttggaaatctcagctaaatatacaagttcatcacttgcaaatt
-tggctttccatataaccataggatacaattctgctaaacttagttgctactatgtaacaa
-ggatcccctttctgccagtttccaataagaaagacctcacttctgtctgggccctcacta
-gcagagtcattaacatccatattgctactaaaagtatgtccTAGGCCttttcttttttga
-cagggtctcactctgccacccaggctggagtgcagtggtgccattaccgctcactgcagc
-cttgacttcctgggctcaagcgatcctcctgTGTtccaggccttttctatcatgcccctc
-aaaacaattctaacctttatctactgccactttcatttttaggtaatagtaccccactcc
-tggtaccaaaatctatactagtgttctactgctgccataacaaattaccacaaatgtagt
-agctaaaaataacacaaatttgttatctcacagttattgtaggtcagaagttgggtgggc
-ttggctagctaggtcttttgcttagggtctcacgaggccaaaaatcaaggtgtctcaagg
-ttgcattccttggtggaaactgggaaattcacttccaagctcaatcaggttgttgaccaa
-attcaggttccttctggttgcacaactgaggtccccatttctttctggttgtcagccagg
-gactggtctttgccactagaggctgcccacattccttctgataaactttccatgtggtcc
-tctctagcaaaggcaaatggagtccttctcatgcttcaaatctctgatttccttttctgc
-ccatttctctgatcccagttggagaaagttctctgcttttaaggacttaagtgactagat
-tcggcccacccagaaaatccaggataatttttctattttaagattcttaaccttaattac
-acctgccaagttccttttgccatgtaacacaggatagctacagattctggggatcaaggt
-atggcaccttgggaagagggagatgtaattctgcctactacaAATCCAAGTCCTATGGAA
-GGGTTTAAACTCACTTCCTAAAGAAAATCATCCCTTTCTTTAACAGAGTGTGAAGTAAAG
-ATGTATATATTTTACTTATGTGAAGTAAAGTATATATACATACATACATATGTCTTTACT
-TATGTGACACAAAGATGTATGTTCAGAGATAGAGACAATAGTAAAAACAAGGACTCACTC
-TGGATGAGTGAGTAGGAAAAGGACGCGCAGTATGGAAAAGGAGTTGCCACCTGTTTCATC
-CTCAAATTGCAAGGCACTTCACCCATAACTACTTAGAAACTAACCCATGCTCCTCCTTAA
-ATGTGTATTTCTCTTCTCTGTATTCCACAAAGGAGTACATAACTAGGCTTTTTTTTATTT
-TTAAAGAAAAGTCACCTCACGGGGACCTAACTGTATAATCAGTTGATTAATCAATCTAAG
-CAAATTTCCAATCTTGCATTCTTTCTTCAAGTCATACACCCTCCCGCAATAGCAAACCAA
-AGCCAAGTATTTCAAAGTCACAGAAGGACAAAAACATGCCCTGCTAAGACTGCAGGTGAA
-CTTTTGAGAATACCACGGAGGAGAACTAGTATTGGTACTGGACTTTCAGCCCCAGGTCCA
-CCAAGCCAGTAAAGCCAAATGACTTACAACAAAACCCTACAACAACTACAAAGATACTAC
-TCTAAAGCCCTGTCTACAGTCAAATTCTTGACTATAAATTTTACTTAGAACAGAAGAGCC
-CCAAATATACCAGCTAGTCCCTTTACAGTGACAGGTAAAAGCTACTTACTAcacttacta
-cctgccagacactgtagtaagcacttgacacaaattgtcttatttactcttctccgtaaa
-ctcacaagctagaaaataccatcatcccccttttacagacgggaaaactgaggcttagag
-agtttaggtcacacagctaagtagcaatggccctgatatttgagaacctaggcagtctgg
-tttttaaccactgggcctacactgCACTCCTCAGATGGAATGAAGTCTCCAATTCTTGGA
-AAAATCTTCCCTTCTTAGttttcttttttctttttgaggcggagtctcgctctgtcgccc
-aggctggagtgcagtggcggatctcagctcactgccacctccgcctcccaggttcaagcg
-attctcctgccttagcctcccgagtagctgggattacaggcgcgcgccaccaagcccggc
-tgatatttgcatttttagtacagacggggtttcaccgtgttggtcaggctggtctcgaac
-tcctgacctcgtgatccacccgcctcggcctcccagagtgctgggattacaggcgtgagc
-cacacgcccggccTCTCTTCTTAGTTTTCATTTCCTCTCCCCATGTCCCATTCTCGTAGA
-ATTAAACAGCTGAAAAGTAATCAAGTCTTCCCAAATAATTTGCCACCTTCTTTTCAAAAC
-TCTTTCCTCCACACAAAGCAATAGCCAAGATGCAACTTCTCCTGACCCTGACTCTGCTTC
-CCCAAAACAAACTACAGAAGCTCCACCCATCACCTGCTTAATCTAGCAATGTTCCAACAC
-TGCAAAAAACACACAACGAAAAACAAAATTGAAAAGTCCTACTCTTTCAAAAGGTCACCA
-ACATATGTATACCCTTAGCCAAGCTTTCTCTCCATACCTCTTTTTCTATCCAGGCTCCTA
-ACTAGTCCTTAACTCCAACTCCAGACGTTCTGCCCCACGTCTTGGTCCCTTCCCCCTTTC
-GCCCCAGCAACCCCGCCTGGGGTTCTCTCCACCTCGCACCCACTCTGCAGGTGGGAAGCT
-CAGCCCCGCCCAGAGGGACCCTAAGAAGGCCCCTACTCCAGCTGCCCAGTTTCGCGGGAG
-GGTTCACTGCACACTACCCAGCAGGCACCACTCCCTCCGCACCCTCCCCCAGCACCCCCC
-TGCGGCCCCACCCCTCAAGTTCCCTTCCCCCTCTGACGACCCCCTCCTCCAAGTTGTCCC
-CTAGTCCCCACCCAGTTCAGTCCTCTCCTCTGCAATAAGCTGGACTCCGGCAGCCGGTTC
-CCACCCTCACATCGGCCTCTGCCCCCAAACCTCGCCCTCCGCCCTGAGGGGTGGCCCCTG
-GGCCTCCCCGATGGGCTGCAGGGGCCTCGCTTGGTTTATGTGTGAAGGTGGGGGCAGGGG
-AAGGCGACGGGCCGCTCAGGAGTCTGCTGGAAGCGTGAGGGTCGGCCGCGCTCCGCTGCC
-CTATCCTGGGCCCACCCCACCCGCCAACGACCTCGCCTGGCTGCTCCCTAGGTACCTGTG
-GTGGAAGCGGCAGCGGCGGCGGCCGCTCTCCCCTCTGCTCACACAGACAATATGGCGGCG
-ATGGAGGAGGAGACACACGGCTCGGCCGCCAGCCGCAGGGACCAGAGCGAGGCTGCAGCC
-GCTGCTGCCGGAAGCGGAAACCCCCTCCTACCAGGAGGCGGGGCGAGACAGCTTCCGACT
-CCGCCCCCAGAGGAATCTCTCTGAATGCGGCCATGCTGGGATGTCCTATTGTAACCTTAG
-GGATTCAGTTCTGGCCTAGGGTGCAAAATGGAAGGAATCCCCAACGCAAAGCAGAATAAG
-GAGACTTGCAATAGTTAAGCGCATTTTATTTCAATAGTGTTAACAAGTGACAACAGAGAG
-AACACGAACCTCCCATTAGGTGAACAGTTGGTTTGACCCAAGTTAAGATGGCGGTACCCA
-GGTTTCCCACACTTCACCCAGCTGGCCCCCCTTTCTTGAAAAGAACCATGCGCGACCTGC
-AGAGCTGTAGAGCCAAGCATTCTGGGAGCTGAAGTCTCTTTTGCTCTGACCCCTCGTTTT
-AAATTAGGGTTTCAGCAACACTTTCTATTCAAACTTGGAGTTCGGAAGAAGTGAATGAAA
-GTTGGACCCTAGGAAGGGCATGGCGCAGGAGTCTGAGAAGTGAGGATACTAGCTCTCAAG
-AGACCAAGGCCCAATTCCTTCCTCCTACAGGAGTCCTGCCAAGAGCTGTGCGTCCAAAAT
-ACAGTGTTTTTTTTTCCTtctatctgcctcccacccctgctctccttgcccgagctacct
-ccccaaaacagccacaaagcactttctaccatgcagagctcatcatggtctccctatggt
-caaaaatctcccatggacctctttatgcaccaaagatagcccaaactcttcacttgacat
-tcagagtcctccataatttggccaaaccctcctttccagcctcctattctgccactctct
-tctcaaattccggaagattccacccacaagactgcaaacaattcctggaacttagctgtg
-ttgcctccctccctttacactggcagttacttctCTTACTGTCACCTCATGGACTGGATA
-ATTTCTGTATGCCGATTGAACTAAttcagggatcctttcctctaggggtctcctctctgt
-ttaactccctccaacccagacactatcagtcagtaacctgaggacctcagtctgtctcct
-ccatcagactgggagcccccagtggacagggctccatctgATGATCAACCTCTCCTTTGC
-AGGCCCTGATAAAAGCTGAAGCGTCTAAGAGTTGCTGAAAGGAGTTCAAGTATTAGTCTC
-ACCTCTGGTGGGACAGAGGTGTGAGCACTGGAACGAGGGTGAGGAGGCCAGGTTCTTTCA
-GTACCAACCATTATCCCTAACTGTCTCAGAATAGCTGGTTGTCTCAGGAATGGGCCTCTC
-CACCCTCCACAGCCCTGCCTTCACAGTTTGTCAGCTGACTAGCACCTCTGCTCCCAAAGA
-GGCACCTCTTCCCCATGTGGGGTTAGGGCTGGTGGTGGCTGCAGACTTATAGTGATGGCC
-TCAGGGAGGTGGCTGTGGCCTTCTCTGGACCTCATCTGCTAGACAGCTTGTGACATCTGA
-TCCCAATTGCCTGGGAACCCACAACAGTTTTTCTCTCAGTGTCCTGTAActgggcctcaa
-tttccccacttgtggactgaggaggttatacaagataatcccaaagtttctGGGAAGCCA
-TCTTCCAGGAAATGATACCCTTCTACCTACCTCTCGAACGTATCTTTTTGGCTCTTGTGG
-CTTTGTTTTTCCCAACTGTATTCAcatttgtttaactcacaacaattcatcatttgctat
-gagccagacactgtgctaggtactggggatgtgttatgaggaagacatacaccagttgct
-cactggtggagcttaccttctaaagtgagaagcaagtaatgcacaggtaaacaaatgcat
-aaacaaagtaatttcaggtagcaataagtgctacgaaaggaaaagataagtagctgtgaa
-gtatagagctttagcttgagtggttcagaaggtccctttgagaaggaaacagtaagtgca
-aacgtcccaaggcaggaaagagcatcacaagtttgaagaaggaggccatggtggctgaag
-cactgcaaataaagggaagaagaggaagaaatatggtgggagaggtgggcagggcattca
-ggtcatgataaggaagctgggttttcatctgagtgtagtgaggaTATTTCCCATTGCTTA
-GCCTTCATGCCTTTCCAATCTCAGCCTCTCTCACAGCATTAGTTCTTCATTCTTCTTCCT
-AGTTCTGGCCTCTATCCATGACTTCATTCAGAGGGCTCACCTGGGCACACATATACAACC
-CTCATACTCATGCAGGACATAATTGAAACCCAACTCCTGCCGTCTACTACGCCAGCCTCA
-TGTAGGTCTCCGGTCTCAAGAGGCTTCCCATCCCAAGTGTTCACCTAGTTGTAGACTTAA
-CATTTATCCTTAACTCTTACTGTCTCTGATCCCCCACATCACACCTCTCAGGCTAGTCTT
-TCTGCAAACAACAGCAGCAGAAGCAAGAGTTAAGATGTTGAGAGTACTTgcactgtgcca
-cacactgaatgttcatcatctcacttaatcctcatgtcaacctgatgaggtagaaaccaa
-aagtatctcaccgtacagatgaggagactcaggttcacagagatcacaggccatgcccaa
-ggtcacatgccggagatggagcttgcatttcaacctgggccATTAGAGTGActctctctc
-tctctctctcttttgagacaggatcttgctctgttgtccaggctggagtgcagtggcatg
-atcacagctcattataaccttgaactcctgtgcttaagcgatcctcccaccttagcctcc
-tgagtagctaggactacagacatgcaccaccatgcctggctcatttttaatttagtagta
-ttattattactattattattattgtacagatggggtcttgctatgttgccagggctggtc
-ttgaactcctaggctcaagcagttcccctgccttggcctcccaaagtgctagaattacag
-gcAAAAGTTTTAATCATGCACTAAGAACCTAAGtgtatttgctttctattgctgcttaac
-aaaatcaccccacaatatagtggcttaaaacaacaatattttatgtttgtgtggattggc
-agtttggacatgtctcagccaggacagctcttttctgctccaagtggtctttcctggctt
-actcttacgtttgctgtcagtgaacaggccagcaaactggttagaactccatggcctcat
-tcacatgtctggcagttggttggggttgttggcttgagtgccttggttctcctccatgtt
-gcttcttcagtaagctaactcaggcttacttacatgacggcccccagaagaaagaaaaca
-aaagcagcaagatctcttcagatctaggcttagaaatgatatagcatcattttcactgta
-ttatatcgatcaaaggcagtcatatggccagctcagattcaaggagagtagaaatagatt
-ccatctcttcatgagaaaaacatcaaatcatactgcaaggagtcatgtgtataaggaggg
-tggaattgttgtggccacctttgcaaacattatatcacaTAAGTAATCGTAGGCATggaa
-ctggttaaagaaattatggtacagccagacatggggctattcacagcaatgagaactaac
-atttttgagcacttaatatgtgtcagacactgtacaagatgctttacatctattaactca
-tttaatcctcacaacagctctctgtggccagtacatttttaatccccattttagagatta
-agaacaccaagtctcagagaggttaaacaactagtccaatgtcacacagcaagtgacaaa
-gccATTGAAAAGAATGAAGACAGTATTATGTCCTGACATAGAAATCTGGCCCTGACATTC
-TGTTATACGATACAAAGCAAGAGACAAACAGTAGTTTGATCAGAAAACATTTAAAAAGCA
-CATTTAAATAATTAGGAGATGTGTGTCttttttttttctgagatggagtttcactcttgt
-tgcccagggtggagtccaatgatgccatcttggctcactgcaacctccgccttctgggtt
-caagcgattctcctgcctcaacctcccgagtagctgggattacaggtgcccaccatgccc
-agctaatttttgtatttttagtagagatgggatttcaccatgttggccaggctggtcttg
-aactcctgacctcaggtgattgcctgtcttggcctcccaaagtcctgggattacaggcat
-gagccactgcgttcagctGGAGATGTATGTCTTATAAAAATTAGTAGAATAAAAATTTTT
-ATGTCTTATAAAAATTAGTAggccgggcgcggtggctgatgcctgtaatcccagcacttt
-gggaggccaaggcgggtggatcacaaggtcaggagatcgagaccaccctggctaacacgg
-tgaaaacttgtctctactaaaaatacaaaaattagccgggcatggtggtgggtgcctgta
-gtcccagctactcaggaggctgaggcaggagaatggcgtgaacccgggaggcagagcttg
-cagtgagctgagattgcaccactgcactccagcctgggcaacagagcgcgactctgtctc
-aaaaaaaataaataaatacaataaaTTAGTAGATCTATATGTCTTATAGTTTTAGATAAA
-TTCAGGAAGAATTTACTACAAACTATTAATGGAGCTTATCTTTGAAGAGGAGAAAAGGAG
-AAAACTTTTATTTAAACACCTCTGTTTGTGTTGCTTGAATAttttttttttttttttttt
-ttttttgagacagattcttgctctgttgcccaggctgaagtgcagtggcaatggtcacag
-cttgctgcagcctcaacctccagggctcaagtagtccttgcacctcagtctcccaagtag
-ttgagaccacaagtgtgtgccatcatgcctggctaatttatttttatgttttgtagagat
-agggtctccccatgctggccatgctggtcacaaactcctgggttcaagtgatcctcccgc
-cttggcctcgcaaagtgctggaattacaggcACAAAGCCTGGCCTTCTTTGAATTTTTTT
-ATAGCAATCATAAATTTTTATTTCAATACCTTATAAAGAAGAAAATGCTTTTAAAATGTC
-CTTCAACTTGGCTCCCACCTATGTCtttttctatttggttttatttttattgttttttgt
-tttcttttttgATACCACCCCAGCCCAACCCCTTATCAATTCTGACCCGAAGTTTTGTGG
-CTACCTTGAGGGCCCCTCCTCTCTCCCTCTGTAGTTCATCCTGCCTGCTGCTGGGGGAAA
-GCTCATTAACCATCATGTTCCATTTTTGTCTAAGAGTTTTCAATGGTATTGCATTGTCTA
-CACAGAAAGTCCAAACCCTTTGGCCTTGTACATTGGGTGTTTGTAAGTTTGACTCCAact
-tggttggattccagctctgtcacttactagcagcatatagttggataagttattagatct
-ctctgagcctcaatttccacatctttttttaaaaaaatgaaagAAAAgaccaggtgtggt
-ggctcatgcctgtaattccagcactttgggaggctgaggtgggtggatcacctgaggtca
-ggagtttgagaccagcctggccaacacagagaaaccctgtctctagtaaaaatacaaaaa
-ttagccgggcatggtggcacatggctgtaatcccagctactcgggaggctgaggcaggga
-gaattgcttgaacctggaaagtggaggttgcagtgagccgagattgtgccactgcactcc
-agctgagtgacagagcaaaactctgtctcaaaggaaagaaagaaagaaataaagaaagaa
-agaaagaaagaaagaaagaaaaaggaagagagagagagaaagaaaaagagaaaagaaaga
-aaAGGATATAGCATTACATATTTTGTGGCAAATTAGATTACTGTTCAGTGACTGTTCACT
-TTCTCACCCAGCCAGGGGCAATTAAtattttcctgccccattaatattaggcttggccat
-atggtttgctttggctagtggaatatacatatcagttacaatgtgcaaattccagcctag
-gccttaagaggtctCTCTTGTTTTCAATTGGCTGTCTTAGAATTTTCACCTCTTCCTTGA
-AGGGCGAGCTGTCATTGGTGCCTTACATCTTTTGAAACAGACTTCCAATCAAGGCTGTAG
-TAGGCAAGTCTGAGATAAGAATAGTTCTTTACTCTTTAGTTTTAGTTTGCattaattaaa
-ttataatttataGTTTTTCGTGAACTCCATATTTTTGAATGAGCGGAAGCTAAAGAGGTG
-GGAAGAGAATGCTCTGTCTCAATTTGGGAAAGCAGTAGCTTCTGTCCAATCCTCCAGCAT
-CAAACAGGCTAGTCCTAGAAGAATAAAGGACACACATAGTAGATCTGAAATTGAGTCAAC
-CCCAGCAGAACCCAGCCAAGATCAGCCAAACCCAAATGACTACATATGAGAGAGGGAGAA
-ATCAATGTTTGCTTCTGTCAGCACAGAGTCTTGGGGCAGTTTGATATGCAACATTATTat
-aggaatagccaactaacagattcacatcatagggcttttttcagggttaaataaatgaat
-acaggaaacgccttaaaaatacactggcatatagcaagggtgtaatgcatgagaactact
-attATtgggggtgcaactgtgaacaaaacaagcccctgttctcaaggatcttatgttctg
-cggagagatgtatggaatggcagctggtgatgagtgttatggaagaaaataaagcaggga
-aggagagggagtgctgaggtaaaatttcaaatgtgatcatcaacaaaacttcaacggaag
-gtgaaacttgaccaaatccaagaggaagtgaggcggggagccagaaagtatgtgggagaa
-gattgtcccaagcagagagaattcggatgggcaaagaccgtgaagtaggctcatgcctgg
-tgaatttcaggaatggtcagtagatagggcagctgagccgagggagtgGCTGATCTCGTC
-TCGGCTCTGCTGGGGTTGACTCAAATTCAGGTCTACTGCATGTGTCTTTTGTTCTTCTGG
-GACCAGCCTGTTTGATGCAGGAGGTTTGGACAGAAGggggacaatgtctcagaggttcac
-aaggtactggattgtgcacagccatgtagggctatcgtgaggacttgcttctgctctgaa
-tgaggtggggagctatgggagggttttgaccaggtggagagcaggctctgctatgcattt
-ttataggatttgtccagctgctaagtgtggactagatggaccgggaatgagggctgaagc
-agggagaaaagataagaagctactaccacaagccagacaagagatggtgttgctttgaac
-caaagttggactccgaggttcttttcaaagtaaaatcaaaagaatttactgataggtgtg
-gtatggggtgtttgaggaaaaaaagaattgaggatgactccaaggcttctggcctgagga
-actgaaagaaggaatttgccagtaactgagatgaagaaggctatagaagagaacttcttg
-gggcagggggagaaagagaggaggaattagcagttccatttgcgacttgttaaatttaag
-tgagctatgagacttccaagtgcagatgactaatcagaagttagatgtatgaatctgagc
-ccaggagagaggtccaagctggagacgtaatttttgggagttactatgtactaaattttg
-tcctccccaaatttatatattgaaaccctaacacccaatgtgacactatttggagacagg
-gtctttaaaggaggttaaaagagatcatagagtgggccctaattcaacaggactattgtc
-cttacaggaagatgagatatcagagctcattctctccccatgcaggtgctcagaggaaat
-gctgtgtgaggacacagcaagaaggcagccatttacaagccaggcagagagccttcacca
-gaaaccctccctgacagcaccttgatctcagatttccagcctctcagtgagaggctgaac
-tgtgagaaaataaatttctgttgtttaatcctctcagtctgtggcattttgttatggtag
-tttgagcagactactactgagtcatcaacagagaaatggtttttaaagccatgaggggcc
-aggcatggtggctcacacctgtaatcccagcactttgggaggctgaggtaggcagatcac
-ttgaagtcaggagtctgagaccagcctggccaacatggtaaaaccccgtctctattaaaa
-atacaaaaattagctgggtgtggcggtgtgtgcctgtaatcccagctacccaggaggctg
-aggcaggagaattgcttgaacccgggaggcggaggttgcagtgagctgagatcgagccac
-tgcactccagcctgggcgacaaggaagaaactgtctcaaaaataaataaataagtaaata
-gccataaggctgggtgaaattgcccagggaatgagtgtagacagagaaggaggaccaagg
-actgcgccctggggcatccaacagtaagagacaagcaaccagcaaaggagcctgagaagg
-agcagccagtggggtaagtgtcctggggaccaagtgaaaaacgtgtttcatggaaggagt
-gttgatcccctgatcccctgtgtcagatgctgctgaggggtcagaaaagaaaagaacaaa
-gagctgatttacaaagtggaggacattgttttgacaggagagagtgtaggtaggttggtg
-ggaacaaaagtctgattggagtgggattaagagagaataggagaaaatataaatatagac
-aTagaaaggaaggaaaaaaggaaggaaggaaggaaggagggCTCtttttttttttttctt
-tttgagatgggttctcactctgtcgcccaggttggagtgcagtggtgtgatctcagctca
-ctgcaacctccgcctcccaggttcaagcgattctcctgcctcagcctcccgagtagctgg
-gattacaggtgcgtgccaccacgtctggctaatttttgtatttttagtagagatggggtt
-ttgccatgttggccaggctagtctcaaactcctgacatcaggtgatctgcctgcctcagc
-ctcccaaagtgctgggattagaggtgtgagccaccacacctggccTggagagctcttttt
-aagagtagaaagctgggccaggcgcagtggctcatgcctgtaatcccagcactttgggag
-gccgaggcaggcggatcacctgagatcaggagtttgagaccagccgggccaacatggtga
-aacccagtctctactaaaaatacaaaaagttagccaggtgtggtggtgcatgcctgtaat
-cccagctcctcaggagactgagctaggacaattgcttgaacctgggaggtggaggttgca
-gtgagctgagatagtgccattgcactccagcccgggcaatgagagtgaaactctgtctca
-aaaaaaaaaaaaaaaaaaagtaggaagcaaatgactaaatgtagaagaataggagttggc
-aaccaccataggagacaatcattaatggacactgcagtagtggattaaagtttgatgaga
-aatagggcatttgcacagtctgagaatatctccccccaagatacttattaattacaaagg
-gtaaaatagtaactttacatggagaaacacagccaacaccacttgaccaagtgataaagt
-gaacatcaccagtagcagggcaaattgacatcatgtggcttccgggatgatgcactgagt
-gggacgtcgcgtcacgtcagtgatatttctgccaaagaggcataattgactcatgaggaa
-gcattagaaaagcccaaagtggccaggcacagtgactcacacctgtaatcccagcacttt
-gggaggctgaggtgggcagatcacgaggtcaggagttcgagacaagcctgaccaacatgg
-tgaaaccctgtttctactaaaaatacaaaaattagctgggcatggtggcgtgcgcctgta
-gtcccaactactcaggaggctgaggcaagaaaatcgcttgaacccaggaggcagaggttg
-cagtgagccgagattgcaccactgcactctagcctgggcaacagagcaagactccgtcta
-aaaaaaaaaaaatgtccaaagtgaggatatctttgcaagagaaccttactctttaaaaat
-gttgaagtggtaaaagacaaaggaagactgaggaatagttttagatgaaggagaataaag
-taattacaactactgaatgcaatgtgagatcctagattaagaaaaaatcattttcactta
-ctacaaaatatattaactagatgagtggtgaaatttgaataagatctgtagattagataa
-tggttttgcatcagtgtaaaacgtcccgattttggttattataagagaatgtccttcctt
-ttaggaaatgtgtactggtttttaggcctgtaacttaccataaaagagttcagggttgga
-ggaaagaaaaataaatgataaagcaaagatggtaaaatctgggtaatgggtatttggcta
-ttctgtttttgtttttgagacagggtctcactctgttacccaggctggagtgcagtggtg
-tgatcatagctcactgcagcctcaacctcccaggctcaagcaatgctcccacctcaacct
-cctgagtagctgggaccacagttgcgcaccaccacacctgactcatttttaaatattttt
-tagagatggggtctccctgtgttgcccaggctggtctcaaattctaggctcaagcaatcc
-tcccatctcagccttccaaaatgctgagattttaggtgttagccattgtggctggtgaga
-tttgagtgttctttgtactactttgtaacttttctgtaagtgacattatgtcaaaataaa
-TTCTAACaagagagaatagaaggaaaggaagtagagacatggaggcagtgagtccaggta
-actttttgaggagttttgctatagaactgaggacaggtggcaggtggagagcaaaatggg
-gtcaagataagttgttcaaaggcagaaattgtagcatgtttttatgctgatgagagagat
-tcagtagattggaaaaaaaagtaataatgcagacagagagagagaagagagtggctagaa
-tggtgtctctggagagaaggatgggatctagtatacaaatgggggctttgaccttggagc
-acagatggctcatccatggtcacagaagggagggcagagtatttgggtaccagattggta
-ggtaggtagctgtgcagtggaaatgtgtggaaatgctttctgattgctaccattttccct
-gtgaaataggaagcaaggtccttggctaagagtgagaatgggggagaaggtgatggaggt
-ttgaaaagataggaaggaagtgtgtagggaaaatgaatggatctactgtgattgtcaggc
-agaacaaaagacaccactgaagctatcatcattcaagtaaagtgaggccagtctacatgg
-tggtgtgtttttctccagccacattccactgcagggggacaaacacagagggatgtggag
-ttggcaccaactaacaggtgtttagtcagagagggtcagggggatcttgggagtatgcag
-cacagtggggataaagttatatcatggctgtaatccacaaagaaggaagtgaggacaagg
-aaacaccaaggttcagagaggtttagtgacttacccaagcttgcacagctagtgaataat
-gagttggtctctgcatccaggcagtgtggctcaaagcttattctctcaccaacccagtat
-acacaggctgtccccagggtgtagcatagcatttggcacatgtagCCTCTGCTAACAAGT
-GAATTAAATTGTACCTGGGGTTCTCTCTGCCTTTCATTCTATGCCTCCGAAGAATACTaa
-ataaaataaaataaaacaacaacaacataaaaACCTAGCTTCTTCCTTGCCTTCAAGCTG
-TCTTTGATGTCTTAGTGTGCACGATGAAGGAGATGTACCATCAGTCTCCTTTGGGTGGCC
-ATTGGTTCATGCCTGCAGTCTGGCTttcagcaggtcattctcagcacatactctggggca
-gacactttctcaggttctcagtacacagcgggaaacaagtcagtattcctggcctggtgg
-agctcagtcaagtggggagaagataagcagacaaatctagcattgcaaactgggattatc
-gccaggagagacaagtgggcggggtatgagagtgcatgagagtaaagccgacctagtgga
-gggcgggaagaagagtttacccaaggaaggtcaggaggggtggcccatggggctgactga
-agaggagaaacagcatgggcaaaggtcctaagataggaacatgcctgttaatggcatatc
-aaggaggccaatgtggtccagacgtatatggagagggtggagggtgggagggaacatagt
-gggaaatgagatgggagaggttggcaggatccactacaccctgtagaggaatctgattta
-agaacaatagggtttaagcaggggaatgatttcgtaaggttttacatttatcagccaggt
-gcggtggctcacgcctgtagtcccagcactttggaaggctgagatgggcggattgcttga
-gctcaggagttcaacatggggaaaccccatctgtaaaaaaatatacaaaaattaggctgg
-gcgtggtggctcatgcctgtaatcccagcactttgggaggctgaggagggcagattatga
-ggtcaggagatggagaccatcctggctagtagtgaaacccctggctagatggtgaaaccc
-catctctactaaaaatacagaaaaattagccgggcgtggtggcaggcgcctgtagtccca
-gctactcgggaggctgaggcaggagaatggtgtgaactgggagatggaacttgaagtgag
-ctgagatcatgccactgcactccagcctgggtgacagagcgagactccgtctcaaaaaaa
-aaaaaatatatatatatatatataaaatacaaaaattagcagggcgtggcatcatgcacc
-tgtattcccagctacttgggggctgaggcaggaggattgcatgaacccaaggagttgagg
-ctgcagtgagccgagatcaccccactgtgctctagcctcaatgacaaagtgagatcctgt
-ctcaacaacaacaaaaaaaattttttttatttataaaagacctctttggctgctgggcca
-ggagcagggaggacaggaggcaggggtaggagtggaggtgtgggaggagaggaagcagga
-gaggagtggaggtgtgggggcaggggaggcagtgggtgggccaggagagaggtgatgtgg
-catgggctaagatggaagcagtgcagataaagagaggtggattgacttgggacatatttt
-ggagctggagttcacCACAGGGAAACTGAGGCCCAGTGCTTCCAAGGATAGCGCTCCAGC
-TCTCCCAGCCCAATGGAAGCTTTTAGATACTTCTGCACTGTGGGGGTCACTTGTGGGTGG
-TTGCATTGGGGGACGAGTGGCCAGGACAGGTGACCTCTGACTTTTGTCTGGTGATGCGTG
-AGTCTCAGATTGGGCTTTGAAGGAGCCATGGGTACCTTGCTGGGCAGGTGGAGCATGTCC
-TTAGAGGATCATCCCACCATCCTCACgtaaccctgcaggtctcttctctctgagtcatag
-ttctcacacttgtaacatgaagagggacagtacccacttAGGCGACATCACCCCCTTCTT
-ACAGATGAGACAACTAggccaggtacagtagctcatgcctgtaatcccagcactgtggga
-ggctgaggcaggcagatcgcttgagcccacacatttgagaccagcctgggcaacatggca
-aaactctgaatctacagaaaatacaaagattagctgtgtgtggtggcatgcgcctgtagt
-cccagctacttgggagactgaggtaggaggatcacttgagcccaggaggtggaggttaca
-gtgagctgagatccaccactatactccagcctgggagacagattgagactttgtctcaaa
-aaacaaaaacaaaaacaaaaCCACCACCACCACCACAACAAAAAAACCCAAAAGAAAaca
-gatgagacaactgagcctcagtgaagggaagtggctctttagggtcatacaggagtaaag
-acacagccaagactagcacccaggctagagcctgggctgttgacctttctgcttcatcat
-ttgccTCCCATACCTTTCCTGGGCTCGTCAGTCCTGGGGATGCTCAACTCACCCAACACT
-GTGTTTCAAGCCCAGGGAATCCAGGATCGGTtagttcagtggttaggggtatgggctgct
-tggattctatttccagcgccaccaaggggccttattctgtctgaaccttggttttctcct
-ctgcaaaatggggctaacagtgcatacccttgtagcactgttacaaggtaggggaactgt
-acagatgtaaTGATTTGTGTATGTGAGTCATTTACAAGCCTTTGGAGTGGCTGGCACCCA
-TCATTGTTTGCTGTTGCTGTGATTATCATGCCATTGGACTgtggcttgaaaccctacagg
-cccaaggctccctttaatagtagttataatgcttcttttctaaaataaaatacatgaata
-acataacctgctgacgcacataattttttttttttgagaccgagtctcactctgtcatcc
-aggctggagtgcagcggcacaatctcggctcactgcaacctccgcctcctgggttcaagt
-gattatcctgcctcagcctcccgaataggtaagattacaggcgcatgccaccatgcccag
-ctaatttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcgat
-ctcttgacctcgtgatccttccgccttggcctcccaaagtgctgggattacaggagtgag
-ccaccgcgcccggccatgcatagttttaaacataaataatgtcctagttgtaatttaaaa
-gaaaataaagtgaaaataatttagaataaattaatatgtaaatgttccaggacaatgtgt
-agaaaccatcacaaagtagttgggtgggctctgctctgggtggaatcattgagaatctgc
-aggctgaattggtaacgccgcactggcggcacatgcactgtgactgcatggctgtgatag
-tctgaaatgtgagcagtctaggtaaagttctgaaccaaacacaatccattctgttcccaa
-tcgctacagactaaatgtttgtctcccccaaaatcttacgtcaaagcctaatccccagcg
-tgatggtattaggagatggggccttttggaggtgattaggttatgagtgcagagccctca
-tgagtgggattagtgcccttataaaagaggccccagagagctctgctgccccttctacca
-tgtgaggacacggtgagaagccatctatgaaccaggaagcggtcttcaccagacatggaa
-tctgccagctcctggatgttggacttgccaggcttcggatctgtaagaaataaatttctg
-ttgcttataagccaccagtctgtgtaatttgttacagtggcctgaactgactaagacacc
-aatttatgtgaaggttgctttcctggcagagtcgctgttattaaaaccaagcaaaCACac
-attgtactggaaaaggcaaaactatagagacaatgaaaagatcagtggttgccagggctc
-aggggaggggagagagggatgcacaggtggagcacagggcatttttagggcaggggacct
-cttctgtatgatgctgtaatggtagataaaggatgtatgtacttgtcaaaacccagcatg
-ggccgggcgcggtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcgga
-ttgcctgagctcaggagtttgcaaccagcctggcgctacagaaatcctgcttcaaatcca
-gaaaccccgtctctactaaaaaacacagaaaattagctgcgcgtggcggcatgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaatttcttgaacccgggaggtggagggt
-gcagtgagccgagatcgtgccactgcactccagcctgggtgacagagcgagactctgtct
-caaaaacaaaaaacaagcaaacaaaaaaacaaaaaaaaacaaaaaatccccagcatggta
-gaactgtgcaacacaaagagtgaactgtaaggtaactgtggatttcagttaataattgtg
-tgtcaaaattggtttatcaattgtaacagatgcaccatgcatttgcactaatgcaaaatg
-ttaataacaggagaaactgcatgtttggagaaggagtacaagggaactgtctatgatttc
-tgtgtcatttttctttttcttttctgagagagggtcttgctctgtcccccaggctaaagt
-acagtggcacgattagagtccactgcagcctcaaactcctaggttcaagcaatcctttag
-cctcagcctcccaagtagctaggaccacacacatgtgccaccatgctagggaaattaaaa
-aaaaaaattgtggagacaggttcttgctatcttgctcaggctggtctcaaactcttggcc
-tcaagcaatctccccatctcggcctcccaaagcactgggattacaggcgtgagccagtgt
-gcccagtctctgcacagttttgctctaagtctaaaacttctctaaaaaagtagtctatta
-aACATAAAAAACAAAATGAAAACCCCCacacattgtgtttatatgtaaaatagaattcgg
-tccttggctcagataattaaaaacaaggtttttacctacactaattaccaaagggagatt
-tgaaaatcatgACTTGAGATGCACTGCAGGATGTCTGCACCCTTGCTCCCCTCCTGCATG
-GCCGGGGCACCCCCTGGTCACTGGGAACTCTCCAACACTCTTGGTGACATTGCCCCCTTG
-AGGATCTCTGCACTGGATCTTTGCTCCCTCTCCTGCAGAACCCACAACTGCTGACTTACT
-GATCTTGGGTGATGTCTGATTAAAAAGTCTCCCCAGGCTTAGGAAACTCAAGGTGCCACT
-GTGGACACAGCTCCCACATTTCAGCTTccagaaatcctgcttcaaatccagatcccagca
-ctccctcattatgtggacttgaatgagtcacatcaatttattgagcttcagtttccccat
-tgatgggaaaaagggtgattgataatacctgccatactttatattcataatgaatataat
-gagtatattcattaactcagtaaatatatattgaacacctactgtctgtgctgagaattc
-aacagcgagcagaacaaacatctctgccttattggagcttatggtctcgtgatggggaca
-gacaaaaatcaaacaaatatatgagataatgtcagtgataaataaaaataaggcagagtc
-acagatggaaagagggtagggcaagggatccttggtaagtgtcgtcctggatggcttccc
-agaggagatggcatttgaacagggctgggaatgaagtgaaggaacgtgccacgaaagtct
-cagggcgaagaggcaacagcaaacaccaaaaccctgaggtgggaatgtgcttggtgaatt
-cgagaaacagcaaggaggccagtgaggccggtggggagtaagagggaagagaaagtgagg
-acagagagatctggagaagccagactctgtaAGGAATTGGGGGTTTATCCCAAGTGCAGC
-AGGGAGAAAACTTGAAGAGTTATTTACTGGGGAAGGCTTCCTGTGTTGTGTGCCCTTGCA
-GGTGAGAAAAGGTGATGAGCCCACTCTAAAGCCAACTCTATGGCCCATGACCGTGGTCTG
-GGACACTTTGAGCAGAAAGCGTCCTGTTCTCCTTGGAGTCAAAGGATTGGTGACAGTGTC
-TGCCATGCTGTAGTTTCCACAAAATACCACCAGGTGACGACTCTGGGTCACGCTTCTAAC
-TTGTGGGTTCTTGATTcctggagggcttttgctaaaacacagactgctcctggccccagc
-cttccaaagcgctggattacaggtgtgagccaccacacctggccTGACAGCCATGTTTTT
-AGCTTTTAAAAGCAAAACTTTGGCATTAGCACTATctctgtgagaggggccgatcattcc
-tgttttccagatgggtctatgaggctcagagaggagaaatcattgtctccatgagcaaaa
-gtgataaaactggcactcggcccccatgtctgcctgacttcaaggcccccaatccttcAG
-GGATGCCACACccatgtgcccagtgaggctctgggaattttaaaaactcatccaatttaa
-tccttacaactgaacaaatcccatgcaacgttaatgtctccattttagagatgagaaaac
-tgaggactagaactgagaaataagtcacctgatgtcgctgagctGTTCTAAGGCTGACAT
-catgcattttggagtcagagagacctgaatctcaactctagctcacactctccctagcta
-tgttcacctgatttctctgagccacagtttaagatgggaataagagcccctcctgcttgg
-tagctgtTGGTAATATTTATGAACAAATCTAGGCCTGGGGCCTCTTAGGCTTACAGTGGC
-ACCAGCCTCTTCTGTTCTGGAATCAGGAGGGAAAGTGATTGACCCGGCATTGGCCATCCC
-TGGCCTGGCTGGGATCAGAAGGGTCCTGGAAGGATAGGCAGTACCCGGCAAAGACTGGGG
-AGGGAGCTTGCTTAGCAGAGGTGTGAGGGACCTCACAGGAGTCCCCACAGGGTGTCCAGG
-TAGGCATAGGTATGGACGGCTGGACAGGGACTCCAGTTGGCCAACCAAGAACAGGGATAG
-AGCTTGGGCTTTGGGGTCAGGCAGCTTGAAGctctgggttccagctcccagatctgtaaa
-gtggaacagtaatgactcttccctgttttggattattgagaggaCCCCGGGGAACAGTGG
-GCTCAGCTGGAGGGATGACATTCTAAAGTGTTCTCTGGGACCTTAACCCCAGTCTCACAG
-GAGATGGGCCTTTGACTGTGGCCTTTCTGAAACCTGAGAATGTTAATGGTCACATAACGT
-TAGTAACAGTGATGGCAGATAACATCTGTCATGGATTAGAGGCCACTGGGAGGTTCTCCC
-TCACAGTTCTGGGTTCTTTGGATCAGAAACATGGCACAAACACACAGCCAAGGGTGGTTT
-AGGGCCTTGCAACTTACAAAGTCCTTCCATAGCATTGCACTGCACCCTGTGTTAAGATAA
-ATTCTCCAAGCTTTaagcactctgctaagtgcttgacaggccttattttattcttccaaa
-acactttgaagtgggtgttgccttgacccccattcttcagctgaggaaatgggaggcata
-gtgaggtcaagtgacttgcctaaggctactcagctggaacgtagagcgcctcatcccatg
-cttgactctgaGTAGAGCAAGGGTTGCACAGCAAGTCAGAGGCTGAGAGGGCCTTGGAAG
-GACCCGAGGCTCCCCTAGCCACTCCTGCCTGGCACCGATTCCTCCAATCCCACCTGGAAG
-TGGCTGGAAGTGAGAGGGAGAGGCGGTAGGGGTGCTGAGCCTGAAGGGAGGTTTCAGGAC
-TCAGGCTAGGAAGGCAGAGAAGGAGAGGAGGGACGGAAGTGCCCCTTCCCCCTAGAGCCA
-CTGAGGGGAGAGATAAAGGCATGAGGAGATGTAGCTGGGGCCAAGACAAGGAGGAAGAGA
-AGAGCTCAGGAGCTAGAAGGAACAACTATCTGGGGAGGAAGCCCCGTTCCAAGAGAGAAG
-GCCAGGGATGGGAAGGGGTGGGCCAGGCCCTTGGGCTGGGGTCCTGGGTCCCAGTTTTAG
-CAGGTAGCAAGACCCCGAACTGGATAGAGGGTTGCCTTCAGTAGATACCCTATCATTCCT
-GTGTTATGAGAGGTTGGGGCCACTTGAGGTGAGCCCAGGATTCAGCCTTCGAGGCTCAAC
-ACACTTGAGTCCAGCTGAATGACAGAATGAGCCATAGGACACTGTCCCAGGCCTGACttc
-cttccttcaacaaatatctatggaggattcaccaagggccaggctgggctcccagcagga
-aacaaagtccctctgaagagagactaacaccttcgttaaggagcccccaatctcatagga
-gagatggacaaaaagcagaaaatgaattggtatccagtatcacttttggctgtaaaggtg
-atcaggggaaaatgaatggattggagtctacctattttgtgatggcggtcagggagggcc
-cctctgagaaggtgtcatctgcacagaggcctgaaggagatgaggcagtagctatgaatc
-tgggggaagagcatttcaggcaagcgcaaaggccagggcaaaggccttgaggcaagaaga
-tgctgctgtggaggaaggagggcaccaagcaaggaggccagtgtggctgctggtgagaga
-taagagagtgaaggaagatgagggtagagtccggggggcagatcacatagggcctcaaag
-gccactctatggattttagctgcatctcatgtgacatggacattgaaggaTTTTTATGTG
-TGTGTGTTTGTTTGTTTGTTTGTTTttgagagggattctcgctctgtcacccaggctgga
-gtgcagtggcacatctcggctcactgcaacctccacctcccacattcaagcgattctctt
-gcctcagcctcccaagtagctgggattacaggtgtgtaccaccacgcttggctaattttt
-gtatttttagtagagacagggtttcaccatgttggccaagctggtcttgaactcctgacc
-tcaactgatccacctgcctcggcctcccaaagtgctgggactacaggtgtaggccactgt
-ggcctgtgacattggaaggttttgagcagaggtatgtgttgtgacctgactcaggtttta
-ccagaatccccctgagagatgttctggccaccactgaagaagactggagggtagagcagg
-caagggctgatgcagggagcccagtgaggaggctGGTCAATGAGCACAGCAGTTTGGCCA
-ACGATCTGGGGTGCTAAATATCAACAGAAACAAAaatatttattgcatgctttctgtggg
-tcacaaactattctaagtggttgcttgacatggaatgcttttaatcttcagtacagattt
-taggtagatcatatttttgtACATTTATGTCTATTTGTCTCTGGACTGATTtttttttaa
-ttgagatgaaattcacataatataaatcaaccatttgaaagtatacatctcagcggcatt
-tagtatattcacgacattgtacagccacacttctgtctagttccaaaatattttcaacac
-cccccccaaagaaactttgtacccatcaaagatagatgatatttttatcctaattttaca
-gatgaacaagcagaggcgtggacaagcagagtcacgtgccccaggtcacacagccaggaa
-atggaacaagctggCCACAGGTGTTGGGAGGAACATGTTGACAAGCTGCCCAGGATGGCC
-TGGAGGCCCCTTCGGGGTCCCCCAGGTAATAGCACCAAACTGCCttttatttttatttat
-ttattttgagacagaattttgttcttgtcacccaggttggagtgcaatagtgcaatcttg
-gctcactgcaacctccgcctcccgggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgtgccaccatgcctggctaattttttgtatttagtaaagacag
-ggtttcatcacgttggtcaggctggtctcgaactcctgacctcaggtaatccaccgcctc
-tgcctgccaaagtgctgggattacaggcgtgaaccatcatgtccagccCAAATTGCCTTT
-TAAGAAGGGCATGTCagccgggcgcggtggcttacacctgtaatcccagcattttgggag
-gctgaggcgggcggatcacctgacgtggtgagtttgagaccagcctgaacaacatggaga
-aacccgtctctactgaaaatacaagattagccgggcatggtggtttatgcctgtaatccc
-agctacttgggaggctgaggcaagagaatcacttgaacctgggaggtggaggaggttgcg
-gtgagccgagatcacgccattgcactccagtctgggcaacaagagtgaaacaatgtctca
-aaaaaaataaaaataaaaataaaaataaaaataaaaaAAAGAAGGACATGTCCTCACTTC
-TGGGCTTTTGTTTTGTGGAAGGGGTGGGATACATTTGAGGCCAGAAAACAGAAAGCACTG
-GGAAGGCTGAACAGTGGCCCCTGCACCCTCTCTcaggatggtgcacagaggagaatgggg
-actctggagccaggctgttgagttcaattcccttctcccacctttcttccatgttgtgaa
-gttgggataataagagcaccaatctcatcagtgttgggggaaagtgaatttcccatcagt
-agagctcagcactgcccgtagtatttgctcaatcaaCAGCAGCCTGCATTCTCTTTGCTG
-CCCTCTCCACTCCAGGAAATAAGTTAAGCAGGTACCTAAATGCAATCTCAGTGTTGGGCC
-TCGTAAAACATCTGGGACAAGACATCCTCCATTACCAGAAAAAATGCAGTCATAAAAATC
-TCAAGGTTGACAGGATAGTGCCCAtttttatttatttattattattattattattttgag
-agaaagcctcactctgtggcccaggctggaatgcagtggcacgatcttggctcactgcaa
-cctccacctcccaggttcaagcgattctcctggctcagcctcccgagtagctgggattac
-aggcacctgccaccacgcctggctaatttttgtatttttaggagagacagggtttcacta
-tgttggccaggctggtctcgagctcctgacctctagtgatctgcccgcctcggccaccca
-aagtgctgggattatagatgtgagccaccgcacccggccCTGATACCCATTTTTAAAAAT
-CACATACAATCAAAATTCAGGATATAATTTACATAAAAACAAAAGCACTCATTTTGTCCA
-TCCCTTGCTTTGGGTTTATCTACCGGTCTTGTTGACTCCATTGCTAATATACATCCAGGT
-CCCATCCCATCTTCCCAACCTTTCCCAGTCTTTCATCCTTCAGCTGCACCTCTATGGCAA
-GGAGCCACCTCATGAACATCAGTTTCAGACTTGACAGCTGATGGCCGGGGGTGCAcatgg
-gcttgtggagacacggtcagggagccctgggtctacacctgagtctgcctgggccgctgt
-ccgttgtgtaatcttcatcaggccacatcctctctctgagtctcagttttcttttcctta
-aattggagatgaaaaagtctgtctcacttggcagtcaagaaggtccaacaggataaCTTC
-ATCCATGGTGAGAGAGTGGAGGAGAGGCCCCCAGGAGGAGGCAGGGATCTCATTCTGCGG
-GTACTGTACTTGGTTCTGGGAGTGGGATGGCAGACAAGCGTGTCACTGTCTTTGTTCTCA
-GAGCTTTGGTTGTGGAACGGGAATGGGAAGGTAAGGGAGGGTACCCCTGGCAGGGGCACA
-GCATAAACCAGGGTGTGGAGATGGGATGGCGAGGCAGGACTGCCCCAGAACTCTGTCCCC
-AGGGGCTGGCAGTGCTGAGAGGGACAGAGGGAGAAGCGATTGTTTATTCTCAGCCTCAGG
-AGGACGCAGGAGAATCTCAGGCATCAAATTTAGTGCAGCACACCTGCCTAGGCAAAACTG
-GACAGCTCCACCTCAACTTTGTAGAGGGGCAGAGAAAGCTGTGGGGAACCACCTTCCTGC
-TCTTGTCATGAAGTCCTCCTCAACTGGAAGCCCAAGCTTCAGGCCAGGAACTTCCCCAGC
-AGAGGCAGCCTTCCCCAGGGGGCCAAGACCTTGGCAGAATGTCTGGGGTGCTCATGGCAG
-CGCCTCTCACCTGGCCCCTGCCAAATCAGTTTCTGCTTGGCCTCTGCAGGATCTGACCTC
-GTTGAGTCCCCAGGGCCCAGTTCTCTGCCTCTGAGGCTAAAAGTGAGATCGTTTCCTGGT
-TGAGGAGTGACTAAAAGACTTCTGTGTgtagagactgggttttgctgtgttggccaggct
-ggtctcgaactcctgaccccaagtgattcaccTTAAGGTGAATGTGTGGCTGTGTACGCG
-CACGTGCAGAGCAGAACCATCACTCTGCTTGGGCTAGGCAGCTGGACTAATCGTCCATTT
-CCCCCCGCCCGGAGGCCTCTTCCAGGCCCCCAGCTGCCCTGATGGGCCAGGTCAGCCCCC
-CCCACAGGAGCCCCCAGCCGCTCCCCATTCGGCTTTCCTTGTATTGTGCGCTGCCTGGTT
-TCTCGAGGAAATGGGGCGGCTGCTGGGTGCGGGGGCGGCCGCCAGCAGCCCCACCCCCTT
-CCCCCCATTGTCACTCCTGGCTTCTGCCCCTAGCCCCTGCTGCTGACACTAAAAATAGAC
-CTGTTCACAGGGAGACGGCCCCACCCCTGAGCGGGGCCCCAGGCTCAGTGTCAGGTTGGG
-TTTGCCAAGACAGAGCTGCCCTGGGGACTGAGGTGGCTCAGCTGAAAGACCGGGGTCGAA
-ACACGTTAGGgctgtgtgaccttaggtccccttttctcctctctgagcctcaatttcctc
-acctttaaaatggggtaaggctacctacctgctaaggttgctCTTGACAATGAACAGAAG
-CTGGGTGAGTCACAAGCGCACTTCGTTCTCGTCCTGCCCGTGGTTTGGTGCTGCCTGAGC
-GGCTTGAGAACCTGGAGGACAGATGGCATAACACACGCCTTCATCTTCAATCTGCCTTGA
-ATGATTGCCAAGGACTTCCAAATCCCCCTAAACAGAGGAGCTGGAAGAGCCCACTTGGGA
-ATCCAAAAGTGTCCGCAGCTCTGCTGTGTGAGCCCGGGTAGGTGCCTCCTCTCTGGCATC
-CATGagctcacacgtgaagtatgcagccaggctgggactcgaacctgtgtctgcagcctc
-tgaagactgttttttccgctttaaggggctgcctcCATGCTGATGACTCCAAGGACTTCC
-TGGCTGGGATAACCCTGCCTTTTCGTCTACAAACACATGATTCATGGTGAAGGAAGATGC
-TGGGCGGTGGGCATGGAAGCCTGAGCTGGGGGCTGGGTAGTTCCCCTTGAGCCCATGCAG
-ATGGGCAGCTGTCCTCAGATGCCACCCGCAGCCATTGGGTTGGGCCCTGCAAAGGAGATA
-CTGGCATGTGTCTGTCTACCAGGCTCTTTTTTGTTGTTGTTCCTTTGTCCTTTTTTTTAA
-ACCATGGAATATTTCAAATATGGGTCTTTCATATACATTCAAAACCTTGAACTCTTAGAA
-TTACTTTTGTCACAGTTGCAATTTTTTTTTAAAtttttatttcatttgtctatttatttt
-ttgagacggagtctcgctctgttacccaggttagagtgcagtgacctgatcttggctcac
-tgcaaccttcgcctcccaggttcaagcaattctcctgcctcagccttccaagtagctggg
-attacaggcacgcaccaccatgcccagctaatttttgtatttttagtagagacagggttt
-taccatgttggccaggctggtcttgaactcctaacctcaggtgatcggtccaccttggcc
-tcccaaagcgctgggattacaggtgtgagccagcgtgcctggccTGCAATTTGATATATG
-TCTATGTAATTACCTATCTCCCATTAATCCTGGGCCCTAGAACAGGGACTGAGACTTTAT
-TATTAATCCATGTATTCCCCCCCAAAACAAATACAGTACTGTTATTCTCCCACACAGACC
-CTGAGAGCAAGCAGACTTGTCTCTATTGTTTGTGTTTTGGGATTTGTGGGGACACCTTGT
-GACCCAGTTTTGTTGTAAATCTTGTCCATGGGGTTTTGGTTTTGCTACCTAATTGCTTTG
-CCAATTTTTATGTGGGGATTTAGAAAGATTTAAAAGCTGAGTTTTCCACTGCAGACATAC
-CCATATTCCCGAATCTTGACTCTTTCTAAATACATATGTACATGAGAAAAAAAAAATCAG
-CACTCAAGGTATTCAGTGACAGGTTTCTCTCAGAACCTGGAAATGCTGGAAATGACCACT
-GTTGCTTAGTCGGGGCTCCtttctttcttttttttttttttttgaggcagagtcttgctc
-tgtcgcctaggctggagcgcagtggcgcaatcttggctcactgcaacctctgcctcccgg
-gttcaaggaattctgcccaagcctcctgagtagctgggattacaggtgcatgccatgact
-cccggctaattttcgtatttttagtagagatggtgtttcaccatgttggccaggctggtc
-tcgaactcctgacctagtgatctgcccacctcggcctcccaaagtgctgggattacaggc
-gtgagccaccgcacccagccTGAGGCTCCTTTCTTATATTTTATGTGTATCAAGCAAACT
-TAGGTACCTGGTCTAGTTCTTACACAAAGAGTGTACTTCCCCACTTAAAAACGGCTACAT
-TGggctgggtgtggtggctcatgcctgtaatcccagcattttgggaggctgaggcgggtg
-gatcatttgaggtcagaagttcgagaccagcctggccaacatggtgaaaccctatctcta
-ctaaaaatacaaaaacattagcccggtgtggtggcagatgcctgtaatcccagctactct
-ggaggctgaggtgagagagtctctcgaacccaggaagcggaggttgcagtaagctgagat
-cacagcactgcactccagcctgggtgacagagcaagactctatctcaaataaataaataa
-ataaataaataaataaataaaataaaATGGCTACATTAAAAGTAggatttttagcttttg
-ttccatagacctcttcggcatatggtgaagtggggatggaccccttctcaaaatgtggtt
-tttttttaattagtctttttttttttttttttcaatagaggtggcgtctgactatgatgc
-ctagcctggtctccaactcctgggctcaagtgatcctcctgccttagccttccagacagc
-agggattacaggcatgagctactgcacctggatttttttttaatgttttataaatgcata
-aaataaaatgcacgatattacaaaggaaaccaattatactgaaatgctattactgcaata
-taaacaagggtttgtgatgcagtgatgaggtgaacttctttattagtacattaaataaca
-agatggggaagcaggttgcaggtcaccatgaacgtaaacaatatgtaatgttatctgcaa
-ccactgtgatatgaaatgaaagtatctttgacttctgttgtaacagtcactgctaaccct
-accatgcttcttgatccacattcatacttgaaggaaatgctgcatttcaattagaggtta
-gtgaatataaagttattttttcccacctaagttcatgaagtttctgagttctagatcagg
-taaagaacccctgCTAAAAATTGTGGCTGTCCCTCACTTGATTCAACCAGTCTCTTATTG
-AAAAGTCACCCCacctcagcatttcttcaaatctcatccttatgcagttggggaaactga
-ggcccaggctggagaacaaacttgggtcattctgccctggggggattgcagaatccagtg
-tcctgattcccggctcaggttattttccagctcctcccctaccagGCGGGTGGCAGGGAC
-CCCCCCTCGGCCCCACCTCCCTGCTCGCCAGGAGCAGCTGGCGTCCTGTCCCGAGAGTGA
-CCCAGCCCCGCCCCGCCCTCGCCCCACCCTGGCCGGCCAGCTGTGGATGTGACAGGAGGC
-TTGGCTCTGGCTCACTCCGGCACATTCCTGGCCCAGCCACTGTTTTCCTCTTCTTCTTTT
-TTTTTTTGGTGGTGACTTTTTCTCCCATACCCCTCCCACTCCTTTTCCTCAAAAATGCTG
-TGTCTTTCCCCAGAGGGTCCCTCTGGGCGGCTCCGGGAGGGAAATGTGGCCTGGATTTCC
-TGGAACGCGTGGAGCTGGAGTCTCAGCGCTGGGAGGAGGGAAGCTGTTGGCAGCAGGGCA
-CCCCCCCAACATAACTGGGCCTCCCTGGAGAAAGAGGGTGAGCGGAGCCTCAATATTCCC
-TTTGCACTGGGCCCTCTGAGCAGTGGCACCCGCAGCTGCAGCGAGTGGGCTGCTGCCTCG
-GGGATAGTGAGACGCCTCTAGGAAACCGCGgctctgtgatcttggggaagctgggcattc
-tctctgagcttgggtttccttgctccttagaactgaggatgtgatctggatctgccacag
-ctggtgggacagtccagtgaggcgatggctgtaCATGGTCCCTTTCCAAACAGGGAACAA
-GAAGCGAGGTGTTGGGGGCATCTGGGGATGCAGGTTTGGGGGCTGCATTTGGGGCAGCAG
-GGGTGGAACAGAGAATTTCCATCCTTCCTTCTTACCTTCATTCATTCATGAGACAAACGT
-GTATCAGACAATTACCATTGTGCCTCTCGGGGCTCacaataagagacaagtaaatgtctc
-ctgtaggggcaggtgcagatgagtgctctaagaaaaagtgaagcagggtGCAGGGATAGA
-GTTTCTGAGGGTGCTGGGGGGAGCTGCTCTGCTGGGGCACCACATGAGCccaggcagagg
-gagcagtgggtgctgaaggctctgaggtgggagcaagcaaggaagggaagagaaggcaag
-gtttgtgtggagtgggggagacagcagagagggctgtggggacttctgggtgaggcgagg
-actttggctcgattcatgggaagctacgaagggctttgagcctgcagtgacacagtctgT
-AAAGGACCCACGGGGCTCTACAGGAGGTgcgcacgtggaggagtgacttggaggccaagc
-agctggggtcctggcttcagctcctccctggctctgtgagcgtggacaggatgcttctcc
-ttgagcctcattttcctcctcagtagagtgggctcatggagctctgaagactaagaggaa
-gggTCATCAAAGTGATGACCCTTTGCCATCACTTTGCCTGTGAGCTACAGGTCTCTATAA
-GTGGGAGCTGTTTTTTTCTATGAGCCTCTGAGGATTGGAGCCACTTGCTTAGGGGGAGGC
-TTTGGGGACAGAGCCAAAGGCTGGTTCCGAGCCCAGGTAGAGCAGTGGCTGCTCAGATTT
-TGGGGACATGTGGTGTCATGATCTGGGAGGGGGATATTCTTGAGTTGTCTGCAGCCCTTT
-TCCCCTTATGGGTACGTGGCTGGATTTAGGGAACCCTAGGGCAAGGGAAGAAGGGCTAGG
-AGCTGCCCCTGAGATCTGTGAGATGGGAGGTGGCCGGGTGTTCAGAGGTTCTCTGAGGTT
-GCAGAATGCCCTGTCAACCACTCTCCCATACCCAGAGGGGGCTGGACGCATCCCTCTCtc
-ccttgtcctcagtctcgattttctcatctgtgaggtgggcacaacaagtcctaatcctgg
-cagTGATAGGAACGTTTGGGGAAGCAGTGATTTGTCATGCATGATGCGGTCGGACAGGAC
-CCTGCCCTTAAGAAGGAGGGAGCCCACCTGCCCAGGCACTGTGCTGAGCTTCTGTGCATT
-AGCTGAAAGTGGACAGGATGACGTCACTTCACTGGAACTTTCTGTGGCTTCTCTTTGCTC
-TCCTATGGAGGTTCCATGGGAGGTAGGAGCTGGGGGCTAAccctgcataccttataaacc
-tcaactctcacatcctcctggctttctgtgtccaggttcacaggcctcctgaatctccct
-ccttaatgcccacgttgttctggcctctgagacattgtgttactccctgaattccttcct
-cttgccctagtaaactctccctccctgctcagctcagtttaactatctcttcctagagga
-agcccaccctgtcctgtagactaggctgagtctcacattgcggcatcttaaggtgctgcc
-tcctctcctggtaacacctgtcgctgttgtaatttcacaggtgttgctgcaattacctgg
-ttgctgactctccccacattaggactgtgtgttccatgagggcagggacgttttctcgat
-cacagccatatccccaacagtaatagcaaattgcagatgctcaataaatgctttctggat
-aaatggaGGGGTGAaatcattttgacaatcagaagaagaaggtgccccccttttacagat
-aaggaaccaaaggtacagagagattaagtaacatgccccgaggtcacacagccagaatca
-gatggTGTCTGTCTGGGAATGTGTCCCTGCAAGCCAGGCCTAGAAGGTGGGCAGATGGGG
-TTACGCAGAGAGGAGCTAGGACCATCTGGATAAGGGAGGGTTGTGGGGGCAAGCCCCACC
-CATCCTTGTTTTCTCCATTCGAATAGTGGTTTGTGGCTGTTTTCCTCAAGGGCGACTCAG
-GTGACCTTCAGGTTGGGGCCTCCTGGGTCCCAGGGGCCTGCTGGGTGGAGGGCCCGGTCT
-GGCTGGGCTGCTTTTCTCGCCCCTTTGCCGGCCCGCTGGCTTCACGCACAGATTACAACT
-TCCCCTCTTCGGCCGTCTTACGCAGGCCACCTCCGGCTCGCCATTGTCTCATTGTTTGCT
-GAGGGAAGCTCCAGGAGGAAATCAACCTGCTGCTCACCCCAAGCAGGGAGTTTCACCCCC
-AGCCCCCACCCAGGGAATGCCTGGGGGGAGGGCAGGAGGGGTGGGGGCAGGTAGCAGGCa
-atgcaacaggcagccttgaagggagtgagctccctggccgggaagtatgcaagcagaagc
-tacatTCACAGCACCTATTTACTAGGTCCTCTCCCAGGCTGCACGTCAGGCAGCTGGAGA
-CACAGATGCTAGAAAAGGGTCTTGTCCTTAAAGACCCTGTAGCCTAGAAGAGATGCTGGG
-CAGGGCCTCAAAGCCAAATGCCTTAGGGGCCAGACAGGTGACAGAAATCTGTAGGCCTGC
-GAGCAATGCTGAGTGGTCGGGACGTTAAATGAAAACTATGGTGCGAAGGAAGGCTTTTAG
-ATTCCAATTTTATTTTAACATGTTGCTAATCAAACAAATGAGTCCTCCAGCCTGATGTAG
-ACTGCGGAACCCCAGCCTAGCCCTTTAGAAAGGAATTCTTGTTCTGGGGTGAAATTGGAT
-CAATAGTTATTGGTGTCTGCCCCTATGCCTTTAGCTATAGCTGTGATGGGCAGTTCCCAG
-CACACTGACAGCATCCCTTTTCAAACACCCAGCAGTCATTTGGCTTCTCTGAAGACTTGG
-GAACTCTCTCAGGGACCTGGgaggagttgatgccactaggggcacccctcagtcaatggg
-gaatgggagttagtgggtaaatgccccatcctcttatccattggaagttcctggtcactc
-aaaggtctgcagtgagttgggggcactggttgcccatactggaaactggctcaataactc
-actttttatccgtttcccctcttcgctgtcactctcccagatccctctggcttcctgggc
-taccggctcccaaattcttgtctcaggctctgcttttaggggaacccaaactaaaacaGT
-CTCTAATATTCTTTCCAAATAGCTTATGATTGTACACTTAGGTGATTCTAATATCCAATG
-ACTTTAACTCTGTGATTATAAGTTTTCATAAGTAAACCCAACTGTGATTCCAGAATGATG
-TCATTCTAATATGGCCGAGATACACCTATCAGAACTGGAATGCTCCATTTTGTACAACTG
-AATTTTGCTTCTCTTGAGCTCCTATTTTTTTTTTCCGATGCCAGAAAATGCAAACTTCAA
-AAAAATCTAGACAAAAACCAATTATTTCAGATTTGAACTCAGTTGGGTGAATCAAGCTTT
-CCCTGGCATCCCTTTTTTCCCGGATTCATTTAAGTCCTGGAAGGGTAGAGGCATCTTGGC
-ATTGGTTGAGGGAAGAAGGGGTCTGTGACTGGTGTTTCTCAAGCTATACCAACCCATCTG
-GCTCTCCAGCATGCTTCTGCCCCCTTGGCATTCACTGGAGATGACCCACTCATGTTGATG
-CTTTGATCTCTAGGGTCAAAGAAGCATAGCTTTCTCCTCCTGGACCATACACTGTAAGAG
-TCACGTCCACTCCATTCAGTCATCTGAAAAGATGTGTTCACTTTTTACACCTCACAAGGC
-CCTGTATACAAACTCGtcattcaatcaaatgtacttgctgagtatccggcatgtgttggc
-attgagccaggcactgaggatacaaagatgaaaagacaggtccctttcctcaagtcattt
-gcaagccaaataatgtataaatattttcaacttacatattgtgatgtccattatgaagga
-accaaatagggtaggcagagaaagcctctttgaagagctgtcattggagccaaagtctaa
-agtcaggggaagccacaaaaaggtttagcaagaaagaCATGTCTGATTATATCTGTAACT
-GTAAAACATTTTCtttttctctttctttcttttattattattttttggagacagggtctc
-actttgtcacacaggccagagggcactggtgcgattttggttcactgcagcctcaaccta
-cggggctcaagcgatctccttcctcagccccccaagtagctgggattctaggcacatgcc
-accatgcccagttaatttttttgtattttttgtagagatagggtttcaccatgttgccca
-ggctggtctcgaactcctgagctcaagtgatatgcccaccttggcctgccaaagcattag
-gattagaggtgtgagccatcacgtttggccGGTAACTGTAAAACTTTTTGTAATACTGAA
-GGCATCTCCTGCATTTTTTCATACATTTTACTTTTCCCCTATTTATTGGTGGCCTCCATC
-ACCTTAGAGATTCACGTCTCAAAGGACAAGAGTCATGGAAATTTAGTCAAAGCCCTGAGT
-AATTTGAGAGTGTACAATTTATGCCATAAATAATAGATTGAGAAGAATAGATGAGTCAAA
-TTGGTTTTCCTCTTTAGGAAACGAGATAAAGATTATCGGGAGGTGGGGAGAAGGGAAGtg
-tagcagagatgtccagctgtcatgcaattacccgacttccccttcttctatagctgcaga
-tggccatgtatctacactgcatttcgctgtctcccttgcagtttaggcgtggccacgtga
-ccaggctctggcaaaggatatgtgaaccgaatggtgtgtgcaacttctgggtcatgcatt
-gaaagaaaaaaaggggcatcctcttcccacacctcttcttcccttcctgccagctagaat
-ttggcatggtggcaggagcagtagcagccgtcttagaccacaagactgaagccacacgtt
-gaggatgtcagaacaacaaaatggaaggatcccaggtatctgacgtcatgggactcatag
-cggcctagactgcttgccccctactggttagtgagagagaaatcaaTAGCTGAGTTAGCA
-TCCCAAGTAATACAGAGGGTCAGAAATATAGGAAATTagcctgttgctgtggctcacgcc
-tctaatccctgcactttgggaggctgagttgggcagatcacttgaggtcaggttttgaga
-ccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaactagctgcggc
-atggtaggacatgtgcctgtaatcccagctactcaggaggctgaggctggagaattgctt
-gaacccgggaggcagaggttgcagtgagctgagattgtgccactgcactccagcatgggt
-gacagagcaaggctctgtctcaaaaaaaaaaaaaaaaagaaaggaaagaaaTATAGGAAA
-TTAGTGTGCATAGACACTGGTGTAACCCTGAAAAAAGAATAGAAACTTCGTGTGGTCTTG
-AGGGGTCTAAGGTCTGGGCCCAGAGCCTTAATTCTGGGTAGAACCCAAGGAAGCCATGAA
-CCTAACTGCCTGAGTGTGTGTGCAGGCACCTGGAGCAGGACACTTCAGGGGAAGGGAGGT
-GAACTGAGGGGAAAAAGCAAAAGAAGACACCCAGAATTGACCAAGATTAAGTTTCTCCTA
-CCTAGTGGAATGGAGGCTATTTATTTTGGGTGTGAGCTGAGAGTTGTACCTGCTTCCCAT
-TTTATTATTATTGTATTATTATTCCTGGATCCCAGCCCAGCAGTTAACAGGAACCTGAGT
-GGAGGCTGAGTTTTATCAATAAATTTTTGCTGAGCACCAaggcccaggctcaggtcccag
-cctagctccctacttgctgggtggccttgagcatgttacttctcttttctgagccttggt
-gatctcattgggaacataaaggggttgaactccaggatgctcaaggtggctctttttgca
-ttgatgtcctgtggttttTCTCTGGGTCTGGCAATGAGGGCAGTTCAGGAAAAGTGTGAT
-AAAATAGCTCTACTTTAGTTCATAGAGGGACAAGACACAGTCACATGGGcacacatgtac
-acacacacacacacacacacacacacacacaAATGTGATTAACCAAACATCATGGTAGCC
-AAGAAGATATGTAGCATTAAGGTTTagaatacaggctttgaagtcaaacagaccagagtt
-aacaacctcattttgtttttattTTCTTTTTTAAAAtttttttaaaattatactttaagt
-tctagggtacatgtgcacaacgtgcaggtttgttacatatgtatacatgtgccatgttgg
-tgtgctgcacccattaactggacatttacattaggtatatctgctaatgctatccctccc
-tcctccccttaccccacaacaggccccggtgtgtgatgttccccttcctgtgtccaagtg
-ttctcattgttcagttcccacctatgagtgagaacatgcggtgtttggttttttgtcctt
-gcgatagtttgctgagaatgatggcttccagcttcatccatgtctctacaaaggacatga
-acacatccttttttatggctgcatagtattccatggtgtatatgtgccacattttcttaa
-tccagtctatcaatgatggacatttgggttgcttccaagtctttgctattgtgaatagcg
-ccgcaataaacatacatgtgcatgtgtctttatagcagcatgatttataatcctttgggt
-atatacccagtaatgggatggctgggtcaaatggtatttctagttctagatccctgagga
-attgccacactgtcttccacaatggttgaactagtttacagtcccaccaacagtgtaaaa
-gcattcctttctccacatcctctctagcacctgttgtttcctgactttttaacgatcgcc
-attcttactggtgtgagatggtatctcattgtggttttgatttgcatttctctgatggcc
-agtgatgatgagcattttttcatatgtctgttggctgcataaatgtcttcttttgagaag
-tgtctgttcatatccttcgcccacttgttgatggggttgtttgtttttttcttgtaaatt
-tgtttgagttctttgtagattctggatattagccctttgtcagatgagtagattgcaaaa
-attttctcccattctgtaggttgcctgtttactctgatggtagtttcttttgctgtgcag
-aagctctttagtttaattagatcccatttgtcaattttggcttttgttgccattgctttt
-agtgttttagtcatgaagtccttgcccatgcctatgtcctgaatggcattgcctaggttt
-tcttctagggtttttatggttttaggtctaacatttaagtctttaatccatcttgagtta
-atttttgtattaggtgtaaggaagggatccagtttcagctttctacatatggctagccag
-ttttcccagcaccatttgctaaatagggaatcctttccccatttcttgtttttgtcaggt
-ttgtcaaagatcaggtggAGCaaccccattttcatcactaactagctggtgaccttggat
-aagtcactttatttctctgagtcttgggtttctcccatttaaaaggaggatgataatacc
-tatatttagggctttcatgtaataaaataaggtaatttatgtgcagctccaagatcacgc
-tgggcacgttacagatactcagtaaatggtggttattCTGATGAGGATTGTGAGCCATGG
-TGAGAATCAAGTGAAAGGTGGAGAAGGGCAGAGCTGGTGGGTCTTGAGTATGGACTAGGA
-AGATCCATGAAGTCCAGGGTGTAGGGAGGCTCTTGGAGAAGGCAGGACATGAGCAGTGCA
-GGGATGTGTAAAAGCGTGACCAGATGGGATGAAATACCCTTTTAGGAGAAGGAGAAAATA
-GACCCAGAAGCGAGGTAGAGCCAGGcttgagaaaattacttcctctttctgagccttatt
-tttcctcttggtaaagcgagtgtaacaatatctgccttgcaatgttgttatagcgattat
-tgagatgttagaagtcaagctcccattaagatgcctggctcatgtaaggcatcaaatatt
-agtttcattCCTTTCCCAAGAGAGGGTACTCACAAAATATCATCAGGGCTAgtaacacag
-aggataaatatttgaggggatggatacctcattctccatgatgtgattatgtcacattgc
-atacctatatcaaaacatctcatgtaccccataaatatatacaccgaatatgtaccccaa
-aaattaaaaATAAACAATTTTTAAAAAAATCCCCCAAAACAAAAACAAATGAACAAACAA
-AGACAAAATGTCAGGGCTAGAGTGACCCTCAACGCCTTTCTATGGTAACATACACATCTA
-TTCATGAACTGTTCACACAtcattcatcaatctatacagctatcacttatgcatttttca
-tatatccattcaaacaccaacaattcattcatcacccattgttcattcatctagccaaaa
-gtccattcatccttcactcaccatctatccttatccatcatcatgcattcatcagcaacc
-ttccatctgtctacctatcatctattctatattcatccttcatcaatctatttcatatcc
-atacacccattcagccagctactcaagcagccatcattctttcatctgtctatccattta
-tcatttatccatcatccacctatccacctgccattagttagccatcaccatctctcatga
-atttatttgttcctcaactatccattcttcatgcatctatccatctatttatcactcaat
-gatccatccatccattatttcattcatCATTTATGCACCCACCATTTTTCACGCATGAAA
-TATTCATCCAAAATCTATTCTTCATTTCTTCATAGCTATCATTTACAAGCCAAACATCAA
-CCCACCAATTTACTCTTCCTCCCTTCCTCTTCCATGCATCATCCATCCTTCATTCACTCT
-TTCACTAAACATCTGTCATCTATTAGCCATGCCTATCATCATCTATGTATCTTCCATCGA
-CATAACCACCTACGATCTATGTAATTTCATCATCCATCTGTATATGTTTatccagtcatt
-cattcatttatgtttcatcttccatattgcctgtcaggtaacatacaccagagatacaga
-ctaaataagctacaacctgtcctccagttgttcagagtctagtggagaaagataaataag
-cctatgatagctgctgtaccagaggaatgactgtaccaagcaccccaggggagaccacac
-aggagagagccacagactctgagggaactggggaaggactcacaaaggaggtggcagttc
-attaaactgggtctcgaagaatgattagaagGTCCACTGttttttttttttttttttttt
-ttttgagacagagtctcactctgtcccccaggctggagtgcagtggcatgatcgtggctc
-actgcaacctctgccttccaggttcaagcaattctcgtgcctcagcctcccgagtagcta
-ggactacaggtgcccgccaccaggcctggctaattttttgtatttttagtagagatgggg
-ttttaccgtgttggccaggctggtctcgaactcctgacctcaagtgatctgctcctgacc
-tcaagtgatctgcgcgacttggcctcccaaagtgctgggattacaggcgtgagtgagcca
-ctgtgcccagccCAAAGGTCCCCTGGTATttttatggggggaaatgagtcctaagagggg
-aagtgactgtgcataatcatactaagagttaattaacaggacagagacttgtaaccaagt
-ctctagcctactatactagttctgtttccactTCTTATGGGAAACAGTAAGTTACTCAAG
-GGAAGACAAGTAAGCAAAGAAAACCTGCCTCGAAGCACCAGAAGGCTGCTGTTTTAGGAT
-CTGGTTGTAGATGGGGTGGAGAAGGGGATTTTCCTAGACCTCAGCTTCTCATTCAGGGAG
-AGGTAACAGCAGAAGCCCCAGGAATATTTGACAAAGGGCAGGAAAGAAGGAGGAGGAGAG
-ACAGAGCACAGTGAGGTGAGGAGAAAAACAggtcaggcacagtggggctcatacctgtaa
-tcccagtgttttgagagatcgaggtgggaggatcacttgaggccaggacttggagaccag
-cctgggaaactccatctctaccaaaaaaaattaaccgggtgtggtagcatgtgcctgtag
-tcctggctgaggcaggaggatccccttgagcccaggagtttgaggctggctgcagtgagc
-taagatcgtgcctctgcactccagcctgggtgacagagcgagcccctgcttcaaaaggaa
-ataatataataataaaaaaaCCCCACCTACTATTTTCTTGTTACCTTTACTTGGGTAATT
-AATAATAATATTGTTACTGCTTggcacggtggcttatgccagcaatcccagcactttggg
-aggccgaggtgggtgggtcatttgaggtcgggagtttgagaccagcctggccaacatggt
-gaaaccgtctctactaaaaatatgcaaattaaccaggtatggttacacatgcctgtagtc
-ctagctacttgggaggctgaggcaggagaatcacttgaatccaggaggtggaggttgcag
-cgagccgagatcatgccattgcactccagcctgggcaacagagcgagagtccatgtcaaa
-aataaaaataataataaTGTTGTTAATATTCTAGCagccatgttttattgagcacagact
-acgtgctgaacagtgtgctatagatttttcatgcatcataccattttatacctcaccctc
-agcagccccaagaagcagttattactcttgtccccattttgtgaatgaggaaactaagtt
-cctgagaaggtaagctaggatttaaatatggtctgtgtgactacaaattccatgtccttt
-ccactcctctttgctgcctctctCATCGTTCTTTGGGTATGGTATATAATAAGTGACTCA
-GACATACATGTGCATTCACTAAGATATATGCTTCATTTTACTGGAGATTTTCTCTGTATC
-CTCAGACTCTGAAATAGTGGACATAGTAGGAAAGAAAAAATTTGTTGAATTTTCATAGCT
-ATCATTTACAAGCCAAACATCAACCCACCAAGAAATATCTTCTATTTCTTGTTGAATTAT
-CTTGCAAAGAAAATGGATAATCAATTAGAATATAGGGTATACAGGTTTGTCTATTCTGAC
-ACAAGTCCAAAGttttttgttttttttttttgagataagagtcttgctctgttgcccagg
-ctggagtgagtgcaatggcacgatcttggctcactgcaacctccgcctcccaggttcaag
-cgattctcctgcctcagcctctcaagtagctgggattacagctgcctgccaccatgccag
-ctattgtttttttgtatttttagtagagatggggtttcaccatattggccaggctggtct
-cgcacttctgacctcaagtgatctgcttgccttggcctcccaaagtgctgggattacaga
-cgtgagccaccgtgcctggGCAAATCTGAAGTATTAATAGCATAAAGATATAATTATTTT
-TCTCCCAGGTCCAGGAGTAGgctgggcatggtagctcatgcctgtggtcccggctacaca
-ggaggctgaggtgggcggattgcttgagctcaggagttcgaggttgcagtgagctatgat
-tgtgctgctgcactccagcctgggtgacagagggagatgctatctcaaaataataataat
-aataaTCCAGGacaagcttgtttgggtcccaggcttcttctgtcatgcagctctgccacc
-cccagggtgttgccctagtccccgtggtctcagatgccacccacatatctacaccacagg
-cagtaggcagtggaaaaggcatgaggcaactatgacttgcaggttgctctccccacttct
-gttcacctaccactggtcagaatttagtcatgtgatagtaaccagctgcaagggaggctg
-ggcaatgtagtctttattctgagaggctatgtgttcaggtaaaagtgagaggttttattt
-ccacaggagaaggggaaaatgggtatgaggggcaagtaggggtctctgGCGTAGATGAGA
-AGAAGATGTATGGACACCAATATTCTCTATCATGTGAAGACTCCTAGGGTCAcatatcat
-ctctcccattagacagcaagctccctgagggcagggggctagattaatcaccctggtgtc
-cctgaaagcttctagctcagACTTAAGGAAGAAGACTTTTTCAGTCCCGGATAGAGGTCT
-AATGATCTGATGGAACCAGAGCAAGTAGGTTAGAGGCCTTTTGCCTGGTGACGACCAAAG
-TGGAGAGGCCAGGCGTCTGGGAGGCGGCCAGCAACAGTAGAGAGAGACGCAGGAAAGCGA
-CTTGCAAGGGGGCTGGAGTGGGTGAAAGGTCAGAGGAGAGTCTGGAAAGGAGGATGCAGT
-GTTGCAGGGCGGGCAGAGCTGGGGGAAGGAGGGGATAATTTAGTAATCACAGCTCTTCCC
-TCAATAGAATGCTCAAGGGCTCACAAAGCATCTTGGCCTCCATGTTCTCACTGGTGAGGA
-TAGATGGTACATGAAGTTAGGTGGCAGATGGGGGGGTGCTTCGGATTGCCACCAGCCCAT
-TCCTATCTAGAGAACTGTCACTGGTttccttcttcgtttcccatgtgcttcctttctcct
-tccctgtctcccttccttcttccttccttgatttctctcttcttcctCTGTATGTGTGGa
-tatacacatgtataacacacacacacacatagacatacatatatatgtatatctgaatgt
-atgtctctgtatgtacagatatacacatatacatatatgtatatgtgcatacacatatGT
-GATGACCAAAGTGGAGAGGGCTAAAAGATGAGGCCAGGTGTCTGGGAGGCAGCCAGCAAC
-AGTAGAGAGAGACGCAGGAAAGCGACTTGCAAGGGGACTGGAATGGGTGAAAGGTCAGAA
-AAGAAgtgtgtatatgtgtgtatgtatatgtgtgtatatgtatatgtacatatatgtgtg
-tacatatgtatgtgtgtgtgtgtgtgtgtgtatgtataatcacctactatgtgccaggag
-gtattgtgaaagttattgagaaacacactggtgagcaaaccagacaagatccttgccctc
-atggagcttatgcttaagagagagagatattacacaaataaatgcacaaatagctccata
-accgttaaatgtgaccaacgactagcgctatgcagaagtgcagaatgctgtgagaGCATA
-TTCGTTGTGTATTCCAGCATTTATTAAACAAATATTTAATAAAGCAAATTATATGTATTA
-GAGAtttgcttttttttttttttttttttgagatggagtcttgctctgttgcccaggctg
-gagtgcagtggcacgatcttggctcactgcaacctctgctgcccaggttcaagcgattct
-cctgcctcagcctcccgagtacctgggattacaggtatgtgccaccacgtctggctaatt
-cttgttttttagtagagacggggtttcagcatcttggccaggctggtcttgaactcctga
-cttcgtgatccacctgtcttggcctcccaaagtgctgggattataggcatgagccactgc
-gcctggccTAGAgataatttttagaaaggaataaaatcacgctcttgttcaaatataaaa
-tgaacatgtgtcaaagattttatttaactcattaatttatgaggtaaccaataaggtgtt
-aaaaaatagttcaaaggagaatccaaagagaagaggcatacataggtaatgaggattgct
-tacattaatttgctaaagatgcaaaactgttttcttccaagagtactggggggaatgaat
-tgcatctttattattattattttgagacagggtctctctctgttgccaaagggctagaat
-gcagtggtatgatcatggctcactgcagcctcaacctcctgggctcaagcgatcctccca
-cctcagcctcctgagtagttgggactatagacaagtgatatgtgacaccttgctagctaa
-tttttaaataattttttgtagagatggggtttctctctgttgcccaggctggtctcaaac
-tcctgggctcaagtgttcctgccacaggctcccaaagtgctgggattacaggcgcgagcc
-accgcatctggcctcaactgcatcttgagcagaagaaatttgtttgcatctctgtgacga
-gaattgtttttattatcatcaatcttgttacaacatattgaagtgtacgctagctcaaaa
-atgtgaaatgcgtcggcaaccatagaatcagctaacctgaaatgatgtaaagacaattca
-taCCATTCTGGAGGACTTCCAGTAATCTTTGTGGACTTTTTTTTTTCAGCTTCAAAGTAT
-TTTACAGTTTTTcctgatgtgagtcagatcggtactagatactaataatacagaggtaaa
-ccatacagacacaatttctccctcaaggaCAATATTCCCTTATGTTCTAACTGGGGTGGA
-GAGCCGGGGAACAGTTTTTGGAAGCCAAACTGAGTCTTTGCCATTTATAcagtcatatgt
-taattaacaacaggaatatgttctgagaaatgtgtcgtcaggtgatttcattcttgtgca
-aacgtagaatgtactgtcacaattctagatggtacaacctactaggcacctagtctctat
-tctataacctatttcttctaggttacaaatttgtacctcatgttactgtactgaatattg
-taggcaattgtaacacaatggtaagtatttttgtatctaagcatagataaatatagaaaa
-gatacagaaaaaatatgtagaaaagattttttttaaaaaagacacacttgtatctttact
-gtgaatggagcttgcaggactggaagttactcttggtgagttaggaagtggtgactggat
-gtgaaagtctaggacattactgcacactactgtagactttataaacactgtacacttagg
-ctatactaaatttatttttaaaatttgtttctttcttcaatagttaactttagcttactg
-taactgttttgttctataaacaaaaaaattttaaaaacactttttgtattattttgtaat
-aacacttagcttaaaataggaacacattgtacagctgtataaaaacattttctttcttta
-tatccttattctataagcctttttctacttttaaatgttttttccttaaattttgttgtt
-gttgttgttaaaaactaagacacaaacacacacattagcttcagcctacacaaggtcagg
-atcatcaatatcactgtcttccacctccacgtttcgttccactggaaggttttcagggca
-gtaacacctgtggggctatcatatcctgtgacaacaataccttcttttgaatacctcctg
-aaaaacctacctgaggctgttttacagttaacttatttttttttaataagtagaaggagc
-acactgtaaaataacaattaaaaagtatagtaaacatgtaaatcaataagttgtttattg
-tcattatcaagtattatgtactgaacattttttttttttttttttgagatggagtttcgc
-tctggttgcccaggctggagtgcaatggcacaatcttggctcactgcaacttctgtctcc
-caggttcaagcgattcttccgcctcagcctccggagtagctgggattacaggcatgcacc
-accacgccgggctaattttgtatttttagtagagatgggCACACCAactaaagaacatca
-aagcccagagcgagaaccttcctccctttcccattttccttcaacttgttattaaggaga
-aagtctctgttcaatgctggtgtgtttttaacacctctcttaacacttacttcccttttt
-aacagagaataggcctccagagcctttggcaggccaccggatctggctagaatgtgatga
-cattgttttgttttcattgtacttatttttatggctaccttctatttatggcacgagata
-ctggttttccatttagggagggccctaaactttccttttgacataatatatttatgtttt
-tagaagaaggaccatttaaagaaaaaatattatgtaatattaattacataatatttgcag
-cacaggtggtactgagacagggaaaaaattataaagaggtatgtaaTGTGCTGAAAAGGA
-GGACATGCTTCTCAGGCTAATGCCTCtcccagcccctacttaacagaagggaccactgag
-gcacagagaggagaagggactttgtcaaggtcacacTGATGATGTGGACTAAGAACTGAC
-AGCCTCTTGATAGCCCTGTGGTGGGGGATATCTTGTGTCAGATGGGGAGGGCAGAGGTCA
-GGGACTGTGTGCAGCCCCATTGGTCAGTCCAGTGCACTGATCCGCTAGTCAGACAGAGTC
-CTCCAAGGTTGACCAAGTCATGGACTGAAGGCAAAAAGGACCGGGGGACCTGGAGGGGAG
-GAGAGAAGAATGCTGGTGTTTATCACGCACTAACTATGCTAGATGCTCGGGTGCCGGACG
-TCACCCCTAGGGAATTCACAAATTTGGGGGCAGACACGTCCTACAAAAATAACTCAAGTT
-TCTGGCGAAAGTGTGGTAAGTGTTCCAGCAGAGGCCTCTCtagtgacatctaggtttttg
-tctgctcactggtcatttccccatattcttttgggaaaccacctcttcaccactcttgat
-tcttgtagctcagaccaggcaaaccccacacccacttcagaggtgggcacatgaccagac
-ctggccaattagaacactttatccctcttgccacagagactggcacatggttgggcgcgt
-gacccaaggcaggccagagggggccttccccaggaatttgctggaactactggagaaaaa
-tcccacttcatagggtttttaaaatggatacactgtaagccagagttgctggcagctatc
-tttgccaccaaaagagagaggttctctgaaaatgaagctgacaggaaagcagggatgaca
-gatggagagacagctagagtcctaatgctactgtatggtcacctcctggacccagccgtg
-aaatcagtgaccctgaacACAGTTCTATTTTGCTTTGTTACCCAGGCTGGAGCtttttat
-ttttgtaattaaattaaattaaattaaattttaatttttagagacaaggtctcgctttat
-cacctagactggagtgcgtggtgcaatcacagctcactgcagaatcagcctcctaggctc
-aagtgatcctcctgcctcagcctcccatgtagttgggactacagttgtgtgccaccacgt
-ctggctaatttttaatttttattattatttaatttaatttttaatttttattttttgtag
-acatgtggtctcactatgttacccaggctggtcttgaactcctggcctcaagtgatcctc
-ctacctttatctcccaaagttctgggattccaggtgtgagccattgtgcctggctCGttt
-ttatttttatagagatggggtctctctatgttgcccaggcttgaactcGGTTCTAGAAGG
-CAATAacacacacacacacacacacacacacatacaTAtttgcattagccactttgagat
-gggtttctgtctcttaaaaccaaaaagagacctgtctaatTCCAGGCAGAAACAATATCA
-TGGGAATGTTGGCAAGGGAGAGGGATTGGAGTGTGTGTAAAGATTTATCTGGGAGTCCTT
-CCTCGTGGAGGTAGGTTTTGAGCAGGGTTTTGAGAAATGGAGAGGATTTTGATATATAAA
-GAAGGTGAAGAAACAGTATTTCCAGGGAGGGGAACATCCTGGGCAAAGGCTTGGTGGTGG
-AAGAGGGCAGGGAAGTGGCGCCGTCCAGTGTGATTGGAGAGAGGATGGGGATAGAGAGGA
-GGTGGGAGAAGAGCTGGCAAGAAGGGATGTGCCCTAATCGTGCAGAGATCCAGTCTGCTC
-CTTCACCTGCATCCTCCTCCTCTGGAGGCGTGCCCTTCATCAGttaattcatccacagcc
-atttactgaacaccagcatgcgtcaggcactgtcaaagggctggcgagagagctgtgggc
-cacaccaccaagtccctgccctcttgtagcttcttttgtaggtgaaggacacaggtggta
-aacatgagcaagaaataaacaagtatcatagtgtcagggagcagtaactgttatctagaa
-aaattaagacgagtaaagggaatacagactagtggagaggTGTTTGGGAtgaaaacggat
-aatactgatggttgaccgacatcgtgagtgcactcaatgccactgaactggtaaaatggt
-taaaatgataaattttacattaggtatttttctgttctttatattatgtacattttacca
-caataaaaaaCAGGATTggcagaggggtgctattttagctagggtggtcagggcatgtct
-ctctaaggaggtgtcgtttgaacagaatggaggggaattagcaagccttgaagagattgg
-ggggaaggtattctgggtggagggaattgccaggacagatcctgtggggccagagtcggc
-ctggtgtgttctaaggacagcaagtgggcccctgtggctggagcccagagagcaaaggga
-gagggggaggaagatgagtacagggatcagcaggggcttgtatgccaggagagaactttg
-gatttggttgtatgagtgatgggaagccatcggagggctgagcagggaagggatatgaat
-cagagtttctgttCAATTCTCCCTCTGCCCACACTCAGTCCTGCTCTTAATCAGGTTGGT
-AATCTTGCCTCTGCTTCTGACTATCTCTCTCTCCTGGCTGCTACCCTCTTCTGCACATCT
-TCATGACCACTATCTTGCTGAGGTCATCttttttttttttttttgagacagagtctcact
-ctgtctcccagctgaagtgcagtggcacaatctcggctcgctacagcctctgcctcctgg
-gttcaagtcattctcatgcctcagcctcccgagtagctgggattcaggcgagcaccacca
-tacccagttaatttttgtatttgtagtaacgatggggttttgccatgttggccaggctgg
-tcttgaacacctggcctcaagtgatccacccaccttggcctcccaaagtgctgggattac
-aggtgtgaaccaccacacccagAGAGGTCATTGTTTTTATATGGCTGACCCAAATGGCCT
-CCAACTGGCCTCCCTGCCTCCTGCCGACCCAGCCTCCACCAGTCATCAGGGTCTCTTTCT
-ACCCGCAGCTCTGACCAGCCCTTGCCTTGGTGAGAGCCACAGCCTCCCAACTTCCAGTCC
-AGCCCCATCTATCTTCTTTTCTCCTCACCCCAAAGCCCACACTTAGTCACTCAGAGCCTC
-CATGGGGTTCCCCTGCTGCCTGCCGTAGGCTTGCCCTCCTCAAGGCTGGTGTATGGCTCT
-CTGCTCTACTCGGGTTCCTTTTCACCTAGACAGCCCCCTCCCATCCTTCAACAGCCTCCC
-AGCATCACTCCTCTGTGAAGCCTTCCTTGGCTGTCCCACCCGCAGGCTGGCTTAGCTAGC
-TCCTCTTCAGTGCTCCCTAAACCACTCACATCTTCCACTTTCAGAGCCCCGAGCATGTGG
-CATGCAAAGCACATTggtttggtttggttttgtacaaacctttccctttcctcagctccc
-tgaaccccccagttccctgttcatagtatgttcgcaacaaatgtttattgaataaatgaa
-tGAGTTTGGAATTTATCTTGCAGAAACAATACTCCCACCACCACTACCAGCACCTCCACC
-AACGAAaataatatccaacccaagttgatgacttgctatgcatcgggcactgtgctacac
-acttccaaatctggatctgatttctatttcataatattaggaggaaatcactgtgttagc
-cccactttagagatgagaaaactgaggcatggtgaaattaatcaattttcctaaggctac
-ataactcagaagcaggagagccgacagtccaaAGTGTGCAGCCCAAAGCCGTGGGCACCG
-CATGCAGCTGGAGGAGGTGTCTTGGCATTACTGCATCCACGGACGGGGTTTCCAGGAGTC
-CTGGAGTTCCATATGAAGATTGATTGTCCATGAACTTTTTGGGCATGGGGGCAGGTCCAT
-TACTTGTAttttttttttttttgacagggtcttgctttgttacccaggctggagtgcagt
-ggtatggtcatagctcactgcagcctccatctcctgggttcgagagatcctctcacctca
-gcttcccaagtagctgggaccacaggcatgcatcaccatgtctgcattatatatatatat
-atatatttttttttttttttaagagatggtgtctccctgtgttgtgcaggctggtctcga
-actcctgtgctcaagtgatcctcctgccttggcctcccaaagtgttgggagtacaggtgt
-gggccatcgtgcccagccGTGATCCATTACtttttttttttttttttttgagacggagtc
-atgctctatcacccaggctggagtgtagtagtgagatctcggctcactgcaacttctgcc
-tcctgggttcaagcgattcttctgcctcagcctcctgagtagctgggattacaggtgtgt
-gctacctcgcttgactaatttttgtttttttagtagagacagggtttcaccatgttgacc
-aggctggtctcgaactcctgacctcaagtgatccgcccacctcggcctcccaaagtgctg
-agattataggtgtgggccaccgcacccggctGGTCCATTACTTTTACCAGGGTCTTAGAG
-GGGCTCTTGATAATTCCTATATTTAAGATGCTCCTCTGCACATAAGGGGGAAAGATGGAG
-AGTTTTCGAGTATTGGACTGTTGCGGTTCAACCTATGCTTTAGAGAGATCACGTTggcta
-tccattgcagtgtaatgcagggagaagagattggaaatatccctaagattcaccaagagt
-ggatgtgttaatcatatcatggtacctccttccacagaagggaataatacgcagccataa
-agatgaatgaggagtctctttatgtaccaatgtgaaatgattcctaagatatttatgtca
-gagagagagagacagggtCTgggtctcactctgtctcccagactggagtgcagtagtgtg
-atctcggttcactacagcctccatctctgggggctcaagagatcctctcgcctcagcctc
-ctcagtagctaggactacaggcttgcaccaccacgcttggctaattaaaataaaattttt
-ttttggagagactaggtctcactatattgcccaggctggtctcaaacttctgggccaaag
-agattctcgcacctcagccttccaaagtgctgggattacaggcgtgagctaccctgcctg
-gccTtccaagacatagtttaagtaaatacagcaaggtgcaggccagcatgtataattagc
-ttctatgtatgttttttaggaagggaggggttaagattatagatctagatgtgcttctat
-atgcataaaaaaTCTTTGGCAATATTCACTGTTAAATAGTCAGTGGAAACcctacctcat
-agggtttttatgagggttacatgagttaatattagataattgcttagaagagtacctggc
-acacattaagcactacagaagattttatttaataAAATAAAAAAGAgtggcgggcgcctg
-tagtcccggttacttgggaggctgaggcaggggaatggcgtgaacccgggaggcggagct
-tgcagtgagatgagatcgcgccactgcactccagcctgggcgacagtgtgagactctgtc
-tcaaaaaaaaaaaaaaaaaaaaaaGAGGGTCCCTTAGGGGATGGAGACCAGGTGACTAAG
-GGGCAGGGAGAGAGACTTATTTTTCATCTGAGGCCTTAGACGCCTTTTGAATTTGGTACC
-ATGGGTAAAttttttttatttttatttattaatttatttttgagacagagtctcactctg
-tcacccaggctggagtgcagtggcacgatctcggctcactgcaacctccacctcccgggt
-tcaagtgattctcctgcctcagcctccctcgtagctgggattacagttgtgcgccaccac
-acctggctaatttttgtatttttagtagagttggattttcgccatgttggccagcctggt
-ctcgaactcttgacatcagatgatctgcctgcctcagccttccaaagtgctacgatgaca
-ggcgtgagccaccacgcccggccTATTTTTTTGAAGTTGAAATTCAGTGTATCTTggcca
-ggcgtggtggctcatgctgtaaccctagcactttgggaagctgaggcaggtggattgctt
-gagctcaggagtttgagagcagcctgggcaacatagtgagaccctatctctcaaaaaaat
-gcaaaaattagctgggtgtagtggcgtgcacctgtagtcccagctacttggggggctgag
-gtgggaggattgcttgagcccaggaggcataggttgcagtgagccgagctcacaccactg
-cactccagcctggacgacggtgagaccctgtctcaaaaaagaaaacaaaaaacaaaaaac
-aaaaaaaaaaaaAGAGAAAGAAAGAAATTCAGCATATCTAGATAGCTAAGAGATCATCTG
-AGGGGGTCAGGGCCTGGAAGGAGATCCCACCCAGAATCCCCGGGAATTCGCTGTAATTGG
-TCAAAGGCCACATTGTGTAGTGTGAGAAATCAGGACGTGAGGAAAAGGCGGACAGGAGAC
-ACCAAAACACCCACGCCCCAGGGCCCACTATAAAAAGCACATTTAAAAACACCAGACTGG
-AAAAGTTttattattattattattattTTTTAAATAGCAAAAGCGAGTCCCCCCAGGAGG
-CGCACTGCAGCTGCGGCTGTGGCGGTTCCCAGGTGATGTCAGTCCTGGCCAGGCGCCAGT
-CCCGGCCCCTTGGAGACGGTCTTGGTGGGTTCAGCTTGACTGTTTTTCCTTCCTGAGACT
-TGAGGACACCTTCCTGTCTCAAAGAAGGAAGCCTTTCCAGGGCTTTCTGAAAGCCAGGGG
-CAGGGGAGGCGGTGGGCCTGGGCTGCAAGGGCAGAGAGAGGCAGGGAAGGTGGGTGGGGG
-TGGGGAGGAGCGGGGGCTGCCTCTGGGAGGAGAGTGAGGGTGGAGAGAGCAGAAGACAAG
-CCTGGCTCCTGGGTGGCTCTTTAGCCCTCCCACCCGGGGGCGCGAGGGGGTCTGCTTCTT
-GGGAATCCAAGGCCCGCCTCCCTGGCCCCATTGCTTCTCAGCCCTGGCTGCTTCCTGGGG
-AGGCCCCTGGGTGGGGTGAGGTTGTGGGGTGAGAGAGGTTCCCACAGAGTTCCCAGTTGG
-TCAGTGTCTTTTCTCCCTCCCTGAGCCCTGGGCCCACCCTTTCTTCTCTATGGTTAAAGG
-CTCTTTGCCAATATCTTCCAggccaagcgcggtggctcacgcctgtaatcccagcacttc
-gggaggctgcagcaggcagatctcctgaggtcagaagtttgaggccagcctggtcaatat
-ggtgaaaccctgtctctactaaaaatacaaaaattagccaggtgtggtggcacgctcctg
-aatcccagctactctggaggccgaggcaggagaatcgcttgaacctgggagacggaggtt
-gcagtgagtcgaatcatgccactgcactccagcctgggtgatggagcgagactctgtctg
-aaaacaaaaacaaaaacaaaaacaaaacaaaacaaaacaaaacaCCCAAGATTCTGCCAA
-TATCTTCCAAACTGGGTTTTCTGCAGATGGGACGATCCAcagagctgggtttgaggtcca
-actctgcactcctagccgtgcgacctcaggctggtcactgcttttctttgagtgccacct
-ctgaaatggattaggttggccttacagggtggttatgcagagtgagtgagacaGAACAAT
-GCCTCTTGGTCCTTCCCGAGTATCTGCTAGGCACCCACAACGCGCCGGTGCCACCAGGCG
-CTCGGGATGCTCAGCATTTGGCACAGAGGcagcagagcagggaggtgaagagagtgggct
-ctggacccagcctcagtccacatcccggttctgtcctttgatggccgtgtgaggatagtg
-acagcctgtctcactgggtcgtagaggagtaaatgagttacaggccgtggaacagtgcct
-ggcactgaggcggtgctaggtaagtgtttgcttttattTTCGACTTCTGTCCAACCAGCC
-TTCTGTTGCTTTGACAGCTTCATGGGGCTGCTCTGGGCACTCAAAGGAGATATGTTGGGG
-ATTCAGGGGTTGTGTTTAGGGGAGACCCAGGTCCTGCAGGTGCCCCATCATTCATACTGA
-TGCAGGGGTGGCCTGGAAGCTGCAGAACCATTCACACTCGGCAAAGCCTTCTCTCACCTT
-GGAAGCATCATTCCTAATGACGACACAGGTCTCCCAGCCATGCGTTCCCACATAACTTAG
-AAGCACCCATCCCatttttattatttgctcagagcctgctttttcagtaggccgtaaact
-ccatgaggtcaggtactacatctggcttattctctgatcatccctagagccttgtgtggt
-tcatggagaagttcaaaacatgtttgttgaCGGACTTACTGACTGACAAAGTCTGCCAGC
-CTTATGTTGGTCTACAATGTTACACTCTATCCCATGCCTCCTGCTGAGTTTTACCCTCCT
-GCTGTGATGCAGGCTGTGGGAtctggagctagaccccctcagttggaatcctggctgtgc
-cattgcctagctgggtgcccttgggcttggttttctagtctgtgaaatggggatagcaac
-agtacctacctatgtggcttgttgcaagtgaggccatctctgtatgtcactcagagaagt
-gccttggattagtcagTTCCATCAACATCAGGACTAGGCACGCACCTGGTGAGGTCATGT
-GGGGGtggtggttgagagcccagtggggctctgcagctagaacatctgattcaaatccac
-cagccactgtgtcaccttggccaagttctttaacctccttgtgcctccgtttcctcatct
-ataaaatggagcaataataatacatatctaaccagcttttgagcaagctgtatgtatgta
-tgtatttatttatttagagacggggtcttactctattgcccaggctggagtgcagtggtg
-caatctcggctcactgcaacctccaactcctgggttgaagggattttcctgcctcggcct
-cctgagtagctgggattacaggcacgcaccaccatgcccagctaatttttgtatttttag
-cagagatggggtttggccatgttggccaggctggtcttgaactcctggcctcaagtgatc
-tgccctcctccgccttccaaagcactgtgattacaggcatgagccactgccccccgcgaa
-gctgtatttattttatgtaaagtgcatagcctaggcctgacacgtagtaggtcctcaaaa
-gagtcaggcatttttCCAAGCCATTCAGAAAAAAACAACTCCTAGATTTTATCAGCCTTC
-CCTCCCACAAGGCCAGTGTGTCCCAGCTGACAAAGTTGCTGGCCGTGCTGACGtgaggaa
-aagcaagggccagagagggccagacgcctaccctgggtcacacaggagcagtggccaacc
-tagaataggctaggtcttctgtctcgcagcctgtTCATCCTGAGTGCCTCCCTGGTTTCC
-AGGCCCTGCTGGCCTGCCCTCTGACCCTAGCCCCCTGGGAGCTCTATCCCAGGCCCATGG
-GGTCTGCAAATCTGGTCTGGATTAGACACGCTGAGAAGCAAACGCCAGCCCCCCCAGCCG
-GCTGCCCAGTGGGACCTGTGCTCACAGCTGCTGAGGCTCATAGGGACATAAATCATGGTG
-GCAGGAGACTCGGGGGATGGGACCACCTTAGCCTCCTAAGGGGCACAGGGGCCTGAGAGT
-CACGAGCAGAGGCACCTGGGTCTGCTGGGGATATTTTCCATCGTCTGTTGGACAAGCTAA
-AGCCAGGGTGCATCAGAGGGGGCCAGGACACCATTTGGCAGCCCTCGCATCACAGTAGGC
-CAAGATCCCAACTTCTTTTTAACttttcattttgcaatcatttacaacatgcagaaaagt
-gacaaaagtggtgcagagaactcccatataccctgtactcagattcaccacattttaagt
-ttgtcatatttactctatccttttctctcacacatatattatttctcttctgaaccattt
-gagagagcacgttacctacatcatacttctccttaatagtacttcaggatgtattttttt
-ttttttttttgagacggagtctcactctgtcacccaggctggagtgcaatggtgcgatct
-tggctcactgcaacctctgcctcccgggttcgagcagttctcctgcctcagcctcccgag
-tagctgggattacaggcgcctgccaccacagggtttcaccatgttggccaggctggtctc
-gaactcctgacctcaggtgatgcgcccacctcggcctcccaaagtgctgggattacaagc
-tgagccaccacgcccggcctaggatgtaattcttaagcacaaggatatcctctgacacaa
-tcagggtgctgttagcaaatacagaaaatttaactttgatgcaataccttaatctattgt
-tcatatcccaattttgtgtgaccatgtctcaaaaaaaaaaattgtcaactctaccaagaa
-ggtcccctgtcacattttcccctctgcagtacaggatccagttcaaagtcatgtatcgca
-tttacctgttcaggtctATACTTGATATCACAACTACACGAGGTAAAATATACAGTCGTA
-AGAGACACAGATGGGGTTGAACAAAGACATCCAACTTCATATGTACGTCCCATGAACCAA
-TGTTTCTATAAATCCTCTAATTATATGGTGTTCCACAATAATGCATCACGCTCCTGACTG
-TGTGGAGGTAGTTAAGAGTTAACTTGCCAggccaggcacagtggctcacacctgtaatcc
-cagcactttgggaggctgaggctggaggattgcttgagcccaggaatttgagactagcct
-gggcaacatggcgaaaccccctcaaaataaaaaattagctgggcatcatggtgcacacct
-gtagtcccagctactcaggaggctgaggcgctaggactacctgactccaggaggtggagg
-ctgcagtgagccatgatcgtgccacctgcactccagcctgggtgacagggtgtaaccgtg
-tctcaaagaaaaaaaaaaGTTAACTTACCAAATATGCCATAGTCTTCAGCACTCTCTTTT
-TGTAGTGCTTCATTTTTTAACCTAATAAAAGCCTCATAAAATGGGAGTGGCCTGGGACAA
-TGAGGGGAACCTGAAGTGCTGtgggtgcaagaggtcctgtgttctcagccctgctcagct
-ccagatgctgtgcaaccgtggcccatcaccgctcctctctgagcttcaggttGCCATGGG
-TGACCTCTGAGGCCTTCCTGCTCATAACTGTGGAGTCAGAGAAAACAGCCCTgcatggca
-aggagggagatttgtgttcttggtgtcccaacagggccaaggacctgctggggaacccca
-ggcaggttgccctctgtcttgtctcactttcttcattgtgaaatgaTGAACTCTGAGATT
-ATTCTTGTGCTGCTGCTTCATGTGTCAAGACTTGCAGGGAGAGTGTAACCCTTTGGGGTC
-CAAGGTGGCCTGGCTGAGTCGGTCATTCCAACCCCTTCAGTCCTGGATTTCTTCTCCCTG
-AGCAGCTTTACTCCTGTGGCCTCAAGTTGGCCTGGAGAAGCTTGGCTGGGCTGGACCATC
-CCGGAGGCGACAGGCATGCTGGGGGAGCGGACAATGTTACAAAATGTTCCCCAGAGGAGC
-TGCCTATATATGCAGACCACACCTGTGCTTCTCCCCGGTCACGTGTGTGGGCTGACCTTG
-CAGCTCACAAAGGCTCATGGGCATtaactgtccattaccaggaagatagcaagctgcaaa
-atatgcataatggagcactatgcagctatgaaaaggtgtgaaacagctctgtaagcaacc
-aagggtctccaagaagtacagttaagaaaaaaaaatccagtgcagagaggagtgtgtgaa
-atgctaccacttgtgtggaaaaacaatatctatgtaatttgcctatatatgcagaCCATC
-TCTGCCGGAATCCATAGGATCCTGGTTACCTTAACATAGCAATTGCCTCTGGGGACTGGA
-GCTGGTGGCTGGGAGAGAAGGAGACTTATTGTCAGTTTATTCTTTTTTGTGTCTCATTCA
-AAGGAAAGAACCGGTATGTGTAGATGTGcaagaggggctggctcctgggaagctgctaat
-tgcatttcttgatctccatgctgggtgtacaggtgtgctcagcttgtgaaaatccattga
-gctgtacccttacaccctgtgcactttcctgaatgtgtcttatacttccataaaaagtgt
-aaaCTTggccgggcgcagtaactcatgcctgtaatcccagcactttgggaggccaacatg
-ggtgggtcacctgaggtcaggagttcgagaccagccttgccaacatggtgaaaccccgtc
-tttactaaaaatacaaaaattagccaggcgtggtggtgcacgtctgtactcccagctact
-caggaggctgaggcaggagaatcgcttgaacccgggaggtggaggttgcagtgagccaag
-atcacgccactgcactccaacctgggtgacagagtgagatccatcttaaaaaaaaaaaaa
-aaGCGTAAACTTAGCATGGTTTAAATGATTTGTTAAGCGTATGTGTGCTAGTTTAACAAA
-AACGCTGCAGagctgggcgcagtggctcatgcctataatcccagcactttgggaggctga
-ggtggatcgcttgagcccaggagctggagaccagcctgcataacatagtaagaacctgtc
-tctacaaaataaacaaataaataaaattagccaggcctggtggtgtatgcccgtatttcc
-agctactccgcaggctgaggtgggaggatcacttgaggacaggaggttaagcctgcagcg
-agctatgactgtgccactgcactccagcctgggtgacagagtgagaccctatctcaaaca
-aaacaacaaaaaaTACTCGGTGGGATTATCGTCTTCACTGTGGCTGTCTCTGGGATAAGT
-GATATTTCTAGAGTCTTATAGCATTTTGAATTTGTTTTACAATGAAAGCACAGGCAGAGA
-AACCTATAAATATTTTTTCAGAAACAGTTATCAGTATAGAAGCTTTTTTGGAAGGACACT
-CAGGAAGCTGCCTCTGGGGAGGGGCCTGAGGAGGTCTGTACTTTTCACTGCATACCATTT
-GATACAACTTGGATTACTTACCAGTGCATACAGGGTCTATTAAAAACTATCTCACAAAGC
-AAAACAAATACTTATCTTTCTGTTCTAGCTGCTCTTACTAGTTAGAGACTGAGCCAGGga
-ggcccagaggggtcaagcaacatctctggggtcacccagcaaatctggtggcggagtggg
-cctccagccagagcacccaagtgtctgctctgcccccactcccaggcttcctgccattga
-caaggccacagtccttttcCTGTGGCTTTGCCAGAGGCTGGCTGTACCTGGGAGGGTAGG
-CGCAGGGGGAGCAATGTGCTTTCCTAATCAGCTCCCAAAGGGGGAAGCACAGCCACGCTG
-GGACACAGGATAAGCACGACCAGTGTTCCTGAAACAGCGGGGAAGTGAGGTAGAGGGTGC
-TTGGAAAGCTCTCCTGGGTGGGGGACCCCGGCCCCCTGGGGCCCTCCTTCCTCTACTTCT
-TACACCAAAGGAATTAAGCATGGTAATTTCATGGCCTGCTCCAGCCTAGGGACTGGCAAT
-TCCAcaactcccttgatctccctgggcctcggttttcatctgtgaggaagaccaggttgg
-tcgggctcattcctgtggcatctggcacagtgcctgccacacagagggtattgacaatct
-gtttgtcaaTTTGCAAAATCGGAGCCACAATTCAGGCTCAGATGGTCAAACGCAGGGGAG
-TGGGGTAGAGGCAGAACAGAGGGGATACGAACGTGGACTCTGGGGCCAGAGTGCAGTCAG
-TAAACATGAAATAgatcacttgagctcaggagtttgagaccagcctgggcaacatagtga
-gaccctgtctctaaaaaaataaaaataaaaGTGTTTGTTAAATAAATAAACTGTTGAAAT
-AGGCATATGAATGTACCTTGCTGAGGAGAGGGTGGCTGCCTGGCTGCCCTGGCCTTTCCC
-TGGCTCTCCCACCCTCGGGCCTCTCGAGCTTCTCTGATCCTGACCTCACAGGGACACAGC
-CCCAGCCCGAGAGCCAAGAACTCCTAGCTGCACTGATCAGCTGACGCATCGCTGTCTCTG
-CTGGGTCTGCAGTGGGGAAGACACCAGCTCTCACCTCCCAGGGCTCCTGGGAGTGTAATT
-GGGGTAACAGGTGCTGGCTTTCCACTTGGGGCATCTCCAGGGCAAGGAAGGAGCTGCTCT
-GGGCTTCAAAGGTGGACGGACCTCAGGGTGTCACCCTGCCACGTGCCTCTGGGTGTCATC
-GGTCTTCTAAAGCATTTCAGCTAACACAGGGGTAAGAATATTCCCCTTTAGCATGCACTC
-ATTTGCACTTGTGGAAAACCACATGGCTTGTTGGTGATCGcatcaaagagggatgggtta
-aaggatggcatgttcacaaaatggaataataagcagctcaggaagaaatgaaataccctt
-taggtactgacttgggatgataccaagctagattaaggaaaaaaagaaggagccaaaagt
-gtgtacgatgtgctgtcatttgtgtaTTTGCCTGATCATTCATAGTGAATGGGACATCAC
-AGGAAACTGGTGCCCTAGGCTGCTTGCAGAGAGGAGAGCTGGTGGCTGGAGGACAGGGGC
-ACGGAGACTTTTCAACACATACCCTCTGGTACCTTCTGAGTTTTGAACCATGTGAATGAA
-ATGAACACAGGCCTTATTCAAAAATAAGTAAAATTAAGATTTCTTTACCAACCATATCAG
-ACACCTAACAGTTGTTAAGAACATCTGATAAACAGCAGACTGAGGAAAGTTTGGTTATGG
-CGCCCGGAGAGGGGGCTCTGCCTGCCTTCCCCCGCCCCACCCCCACCCTTCCAGGGCTCA
-GGGCAGCCCCCAGAACATCTGTGCCTCTCTCTAGGTCCAGGGGAGGGCCCACCTCTGACC
-TCCGATGTCCACGGGACTCTCCTCAGCTCAGAACGACGTCTTTTATTTAAAAATAGCTTT
-TATTTTAAACTCACCAATTCTCTCTcacacacactcacactcacgcacagatacacacac
-acCCTGTCACCAACAGTCTTTGTTTTTCCAAAAGTTCTGCCTTGTCTCTGACCAGCCAGA
-GCTGGGCAGGCTGAATGGATCCTCACAGCTCTCCAGGATCGGGTGGAGATGTCCCGAGGG
-CCCTGCCCAGAGTGTCCCGGAACAGGCCATGGTCCCCCGGTCCCTACACAAAGAAGGGGT
-GGGCTTGGCTCCTGGGGTCTTCTTCCCTGTCCAGCCAGTGGCTGGCTCCTGGCCTCCTTC
-TCCAGGGTCCAGGCTCATCTCCGTGGCCCTCGAAGGGGGGCCACCCCCCTCACCTTCAAG
-CAGCTGCCCCCCAGGTCACGACGGCCACCCTGCAGAGGGGGAGAAAGAGTATAAAGAGGT
-TCGATTAGGCCAGTGTGaacactggaactaacctctgtatccctcaagagggatcctgat
-caataaatcacagttcagccacacgatcaagttctctgcaacagaaagcagaagaaaccc
-tttctggactgatacagactgctgccaaatgacaatgtttagggacaaaagcaaggggca
-gGCTGAATGCGCCTGTGTGCTGTGATTGCTGGGGAGAAGCACACACGGGAAATTGTGAGT
-GGGTTTCTTCAGAGAGGAATTTGATGATGGAGAGAGGATGGGAGGGAGGCTCTCTCATGC
-TATACTGttttttgagatggagtcttgctctgttgccaggctggaatgcagtggcacaat
-ctcagctcactgcaacctctgcctcccgggttcaagtgattctcctgcctcatcctcccg
-agtagcggggactacaggggcccaccgccacacccggctaatttttgtattCACGCTATA
-CTTTTTTACCTTTTCTACTTCTTTCCCATATGATCTGTTGCTTAAAAAAAATCCAATATA
-TTTTAAAGCATAATATTTTACACGGGCAAAACAAGCACACCCCACAGTGGTCCTCCCCCT
-GCCTGACTGCATGCCTAGCGGCTCACTCGTCCACCTTTAAAAGGGGACTCGGTTTCTGGC
-CTCCTTGACTTCCCTCAGGGCGTCCCCTTTCCCAGGAATGTGCTCTCAGGTCTTGTCTCC
-CTGGAAAGGTTTCTCTGTTCCTGAAATTGCCTAGCACTTCCTGCCTTTCTGGGGACATTC
-CATGGGGATGAATCTCAGAAGGACAAGGCAGGGTCTCTCCTTTGTCTCCCCATCTGGACT
-GGGATCTCAGGGAGTGGTAGGGAAAAGGAGTTCTTCACTCTGTGGTCCCATTTCCAGCCT
-GGGCTCTCTTGGCCCAGGACCTGACTTGGAGCAGGCACCAATCAAGGCCGCCTGAATTAA
-GTGGCAGCCATTGGAAGATGGGCTAATGGCGGCAGTCCCTGAAACCATCAGTCCTTACAG
-GGGCTGTCTCTACCAGCTCTTCTCATTGATATTTTCAGACTGGACACATGGGtttcatcc
-tcaccgtaagccagagaggtcacagatgttaaagcaccccctcttttgaggcctccagcc
-actgaatgactggcccagaggcacccagccagttgtaaaagagctgggctagaaatctat
-gttgtccaacaatctgtcctgtttccaGGACATGATAGTGTCTGAAATCCCACTGTAAAT
-GCTCATCACCCTGAGCCTGGCTAGATGATGGAGGAACAGGCAGCTTTCTCAGCCCACTTA
-GAGAAACAGCTGACCATCTGGGAGCTCTGTCCCCTGCCCCCTCCACCCCCAGGTCCAGGT
-TGGGGCAGATCCATCCAGATGCGAGCCCAGCCTCCCTCGAGGCTCTTGCAGCCCAGGGAC
-AGCATGTTCACTCACAGGCAGGGCTATTTTGAGGGCTGAGGCCACAGTCCCAGCAGAGCC
-TGGGGCTTGGGCTTCTCAGACAAACTCTGGCAGGAGTGGCTGAGAAGGGCAGATAGGGGA
-GGGGGTGCAATATTAAGGTTGAATTAGAAAACTGGCCTTCCTCTCTTTTACTCTGTAAGT
-GCTCAGGGACAGGGAGAGCCGCCCCCTCCCACCCCAAGTCTGGAGGTCAGCTGGAGACCT
-AGGGTCCCAGAAGAATGCTGGGACTGttcacctccctgaacctcagtttcttcatctatg
-aaatggggacaaaatgattttacttgccatctcaaggtGCAGTCGAATGTGAATGCAGCT
-GTGTAAGCTGCTAAGTGTACTTAGAAGAGGTCTTGACggccgggtatggtggcttatgcc
-tgtaatcccagcacttttgggaggccgaggcaggcggatcacctgaggccaggagttcga
-gaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaaattagccag
-gtgtggtggctggcacctgtaatcccagctacttgggaggctggggcaggagaactgctt
-gaacccgggaggcggaggctgcagtgagttgagatcgtgccactgtactccagcctgggc
-gacagagcgagactccatcgcaaaaaaaaaaaaaaaaaaGTCCTGACAAGACCCCAGTTT
-GTTTGTCCCTTAGGAACTCAGCACCAAGGGTCTTCGGGAagcaccatggttaggagttag
-gctcaagtgagacagacctaggcttcgatccctactttgccaagggccaactactggacc
-tcaggcaagtgatttcatctcactgagcctcagtttcccccccgtaaaggggaattactt
-tacaggatcacacaagctaatctaggtaaagccttggcacagtgttgggaacaaagtaaa
-tgttcaataaatgttcataagtattattatCAGCATCATCTATGGACAGTGCCTCCTGGT
-CCCAGCTACCCTCTGGGTATACCAACAGGGGAGAGCCTTACAAGATGATCCTGTCCAATC
-CTCACCCCCAGGTGACAAAGGGAAAACAGGGCAGAGACAAGAACCCCCTTTCCACCTCCC
-ACGTGCTAATTCTACCACAGAGGGCCACACCTAACCCCTCCTTCAACAGAAAGATGCTAC
-AGGAAACTGTTTCCACGGCAACCCCAACTCCAGACTGGCCAGGATGGGAGGGAGGTGGTG
-GCTCAGGGTAAAGGAACGGGGTCTTGGGTCTTAAAGCTCTTCTGGCCCACAAAGCTCAGA
-AGGGAGCAAGAGCTCCCCAAGCCAGCCAGTTTTCTTCCAGCAGAGTCTTCAAGGGGCCAT
-AGCTGGCCAGGATTGCCCCTCTCGCCTATTCCCAGAGGAGACCGTGGGGTTGAGAGCATG
-GTTTCTACAGCCAAATTTGGCTGAGTTCTTGGTCCCATAGACAGATCCCAGGGAAGCGGC
-CAGGCCCAGGGGAGGCCCCTGTGAGCTGTGGGACAGGCCTGAGACCTGCAGAGAAGTCCC
-CCAGCCTGCTTGCTATGGGGGTGGACACATGACAGTTACAGGGACTTCCCTCTGTAACCT
-ATCCCACGTCCCaaccaggcaggcctgagtttgaatcctggttccatcactgactgtgtg
-tctctgcgccactggcagcacctctaagcaagtggggataaccacagcgcctcattcctg
-gctgttgcaggattttaatgataaatcataaagagcgcttagcacagATCAGTGCTCATG
-AAGGCTGCTGTCACTGCTGTTATTGGCCATTGTGCTCCCCCTCTGCACTCCTGCCACTTT
-TAACCTCTTCCCTCTTCCTTCTCTAGGCCTGAGCTCTTGCTGTATGCCCCAATCCTAGAA
-CACCCTTTCCTACCCCTTCATCGGCCTGCCCCTGTTCTAAAGCATCCTTCAGAAATGAGA
-CACAGAAACCCTGTCAGCACTCACCCTGGGTTGGAGGCTTTCTCTGGGCTCTGAGAATCC
-CTTTGTGCTTCCCCTCCCCCACCATCAGACCACAGCATCCTCATCTTCATCTCCCTGCCC
-TGACCCTGGGGCTGTACTGTCAGGTCCTGACTGGTGGAAGGGTGGGGACCTACAACCTGC
-TTCTCTGGGGTTCTCAGAGCCAACAGAAGGCAGCTGTTGGGTAGCTAAGGGTTGCTAACT
-GGAATGAATGGGTGAAAGGCAGTCAGGGAGTATCCCTGAGAGCCCCTTCAGGCCCTCCCA
-TCCCAGGAAGCCTTAAAGGCCCACTCCTGGCTTCTCAGCCCAGCCTGGGGCACTGACAGG
-GGCCCACAGCTGGGAGCAGCAGGGACCCTGGAGAGGGCACAAGCCTGAGGCTAAGAAGAC
-CGACGATTCAGGGCAACTGAGGCAGCCAAGTGTTGAGCAACCAGGCTGGATATCTGATGA
-GCCAGACAGAGGGTGGTCTCAGGCCAAGATGCAGAGGCCTCCGCAGAACAGGGTGGAGCA
-AGGGACCAACGGCAGCTGTGAGAACCAAACAGCAGGGAGTCAGGGGCCTAACTCCAATTC
-CCCATGCCCTTCCACTTGGCCACCAAAAGTCAGTACTCTCTCAGCCTCAGTTTCCCCGGA
-TGTAAATGGTAGCTGCTGGAATACAAGTTGTTAGACAGGCTTCTTTACTGTAGGAAAAGC
-CCAGGCCAGAAAGGCACACGGTCGGGGGATGAAGCAGGTTCCTTGGAGCCTGGGCAAGGT
-TTCAGCCAAGAGGCCACCTCTGCTGCCACACAGCCCCCGCCCACCCCTACCAGCCTGATC
-CACTTTCTTGCCCAGGACACATTGCAGGAGCTGCACACCAGCTCCCTCCAGCTGACCCAA
-GAGTGCCCTCTCCCAACACCACGTCCTTTTGGGGGCTGGGGACTCTCAGAGGGCCCCTTC
-TTCACTCCTACTGCTCATCCGCTGGGTACCTCAGGCTCTCGGTTGGCGGTTTGTGGCCTC
-CTTTCTTCTCAGTCTCCTGCTCTTGGGTTAGATCTTAGGACAGGGGACAATTATTTCAAG
-GTGGGGGCAACACACACCGGGCAAGCCCAGGGCCAGCGCCCCGGcttcccagctgagtaa
-atgtgggcaggtgatcccatctctgatgctcagatcctcatcaggataaaatgggcagaa
-aaactacctgcctgaagggattcttgtgaaggcaaaaaagtggatgtggagcgcatcggc
-acagaggaagactccataaaagatgggtctttgttACTCAGTCCTCATGCCGTCTTCCCA
-GCAGGAAGGAAGTTCCAGCACACCTTTCGTTGGAGGGGATATCCCACACTGAGCAGTTAA
-ATCAGACCCGAACTCTGGGTTTTCCCGCATCCTTCTGTTTGGGGGCCTGGGCATTAAGTC
-AGTGGTTCTGGGCTTGGGGTGCCGCACCCAGCACGAATTCCACGTCGCTTCCCCCTGGCC
-TCGTTGGGGACCCCTGCACCTCTCCGGTTCCCGCAGAGGCGCTGCCCCCCGCCTACCCCG
-ACCTGGCGGCCGCAGCGAGGGACGCAGCACACTCACCCCCTTGCGCTGGTTGCTGAGGCA
-GAAGGTGCAGATGGAgcgcggctggcggccgccgtcggcggcggcggggacggcgcccTT
-GGCACTGCCCGCGGCACGGAAGCACGGCTGCCCGTCGTCGGCCGAGTCGCCCAGCAGCAG
-CACGTTGGCCAGGTGCGCGATGTAGCTGGACGCCAGGCGCACGGTCTCGATCTTGGACAG
-CTTGCGGTCCACCGGCTCGGTGGGGATGAGCGTGCGCAGCGCCGTGAAGGCCGTGTTCAC
-GCTCTGAGTGCGGTCCCGCTCCCGCGCGTTGgccgcctgccgctgtcgcaccaccaccac
-ggggcccgcgccgccgccgccgcccgcccgccgcccgcccccggggcccgggccgcgccg
-cgccgcctccgggccctcgcagcagccgAACGACTGGTCCGACGCGTCGCTCTCGCTGCG
-GTTCTCCTCGTCCTCGCTCAGCAGCCGCACGTCCGGGTACAGCACGTGCGCGCCGACGGG
-CCGCAGCAGCGCGAACGCCATGGGCGCCGGCCGCGTCCCTCCGTGCGCCGCGTCCCAGCG
-TcggccgcgccccgccgtgcgctcccgcgcgctcccacggccccgccggcccccgccTTA
-TAGGCGAGGGAGGGGCCAATGGCAAggccgccccggccgggggcggagggctccgcccgg
-ccAATGGGGAGGCGTCCGCCCGGCCAATGGGGAGGCGTCCGCCGCGCCCTGGCCAATGGC
-GACGCTCCCACCGCCTCCGTCCCCCAGGTTGAAAGCGGCCCGGGAGCCGGCGGCCCACCC
-CGAAGGCCCCCGTTCCCGGCTGGCTAGCCCGGCAGATGCTGGAGGTCTGGGAGGGTCGGC
-CGGggtgggcccagatccgaactttttgtctccagcctggaccacctgggagacgcgggc
-agatccctttctcctctctgggcctcagtttcctcgttcggaaCGTTCAGATTGCAGAGA
-AACAGCTAGTGTCTGCCTGCCCTCCAATTCTAATCCTgtagttctgcagctttcacgtgc
-gtaagaactggggaaggggcttttgctattacagagtcccaaattgctcccattctgatt
-gagcagttctggaacgggcccaggaacctacattttgtaacaagccattggtgatagtgg
-tggtgtccgtggagaacacttggagaaAAGCTATAATCTTTCCAAATGAGGATTCGACAG
-TGTCTTGTCCCTGAAGACAAACTTAAAAAGAAGAAGAAAAAAAAAAGCAAAACAAAACCA
-CAATACACAAACACCAGTAGTTCGttcgttttttcaacaaatattcgttgggtccctact
-atgtgtcagacatggttttaggtctgaggatacagccattaacaaaataaattcttcacc
-ctcacggaactgacgttttggttaaggaACTACTGTGTACCAGACTCGGTGCTATATACT
-CTATTGCGCCCAGCTGAGGCTGCAGGATGGCAGCCCTGAGTTACAGGTCAGAGAGCTCCG
-GCCTTCAGTCGTACAGGTGGGAGTGGCGGCGCTAGCTCCAGCCTGTCCGGTTTCACTACC
-TCTTGGAATCCTACCACCACCATCCCATCACACACACACGGGCTATCTTTCCTCAATGCC
-TGCTTGCCTTCTAGAAACCTTAGATTGTTCAGCCTGACGTGTCCTCTTCAGAGAATTGCT
-GAGCCAAAGGTGGTTGCCGGGGTCTCGATCTCACTCGTGCCTGCTGCTCAGCTCTCTCCA
-GGCACTAGCTAAACCAGCATCCACTTGGCCTTGAAAATAAGCCCGAGTGGCAGCCGGTGT
-AGCAGACAGAGCGCAGGGAGTGGAGTTGAAAGGCTTCTAGGTGCATTTTGGCTCCTCTGG
-GCGTCTGTTTTCCTGACGATGCCTGCAGCTCTGCCATGCTGTGCTTTCCTGGCTTCCCTG
-ATCCAGGCCAGAATTAGGGGAAGAAGAGGGAGCGAGGGATTTCCCATGACTGCCGGGGGA
-GGAGCCCCTTAGGACCCAGGGTCTGCGGGAGAGTCTGTTCCCACACCTGGATCCCCCCAC
-CGCCAGCATTTGACCGTGACCCCAGCCAGGCTGGGCTTTGGGGAGGAGGGAAACAGCCAG
-CATGGGCCCCCTCCCCGCAGGGCTGGTCCCACACACAGCCCCAGACCAGGCTGCTGCTTC
-CTGAGCCGATGAATTATTACCGGGAGATTTCCTTCCCTGTCTGCGCCTCCTCACAGGGGC
-TCCCAGCTCACTTCACTTTCGCTTTCTCCCCCTTCTCCCCCTCCTCTCTGCTTCTGACCC
-TCAGGCAGCTTGAAATTCCTCTGTCCAGCCCCCTCCCAATTCCACCTCCAACTGGAGATG
-CCAACCAAGGCGTGAACTGGGCCCGGAAGGCGAAGAGGGGCTTGCCTTGTAGGCTCATTC
-ATTTATTTGCTCCTTAGGCATATTTTGACACTTGGGACCCTGGGAGTAGAAGAAAACCAT
-GAATGAGACTGAGACAGGCCTTCTGCAGCCGAGAGGGGAAGGCGAGCTGTAAACAAAGGA
-TTTCAAGACAATGTGGTAGGAGCAAGCCAGGGTCTGGTATCAGAGAGACCCAGTTCCGGT
-TCCAAGGTTAGCTGcttcccagagtctcagttgcctgctctgaaaatgagataataatag
-tacccattcccagggctggtgatggttccatgagtttgtgccagtagagctgggcttggc
-acacaggagtgctcagtaCCTGAGAGGAGTTTGTGCTACTGTTTTTAGGGGCTGGCCCCA
-GCCAACTGCCTGGGAAAGGGCTGAGCAGCATTGACTTTTCTAGGTCTTGTCCCTGGGAGT
-GCGGAGGGGACTCCTACCACATTCTCAGCTCACCTACACAGGGgacctcagcttccccca
-ttctctgtccctcactctgctccagccacactggcctccccactaaatctggagcccact
-tcttcctggcccccctggcccctgatagtctcatagtttgttcactcatttccttcaaat
-cttcactcaaatcttatctcagggaggcccttcctgaccaccagcactaacagtaatggc
-ttctccaacctgccagcacccccagctctccctttccccttatcctgctttatttctttt
-tatagcatttgtcactgactttcattcattcacttattcattctacaaatattaactgag
-cacctgctatgtgctaggcacagttctgggtactgcggatacagcagtagaGacattaca
-tatttatttgtctaccacctgtctccctccactagagtataagctccatggggcaggtac
-tttgtgtattttgctcatctcacttccttcccaacacaaccttctgaggtaggtattgtc
-attattcccattttacagatgaagatacggaggttcaaagaggggaaagtgacttgcccg
-aggtcacacggtgggccaatgtgggagctgagattggtctgactccaaagccattgctcc
-ttccctaaccacatggcttctGAGGCAGCCTAGAGGCCTGTGAGGGCTGAGTAGGAGTCT
-GCCAGGTAAGAGGAGACAGGTGTCACAGGCTGAGAGGGTAGAGGCTGGTCCCTGCCTCCC
-TGACCATGGGCACCCTTCACTTCTACAAAAAGCATTTGTTTCTCAGAGGCACCTGCTGTG
-CACAACTCTGAGCCTGTGCTCCAGCTGTCCTTCCTGCTTGGAATGCTGCCCCTTTGGGTC
-TGACCAGACATCCCTAGTCCTCTGCCAGTGTTCAGAGTAGCAGATGGTGAAGGCCTCTTT
-GCCACTTTTTGCCAACCTTGCTGCAAAGTCTTGTTGTGTTCATCACACCATATTTTGACT
-TTTCTCCCTTCATCCCTGATTCTCACTTCCATTTCCCTCCCCTAACAGGGCACCCACTCC
-CATATCTTTGACGCATGCCTTTGGATATATGTGTGTCTTTATAAAATGTGCATGGCGTTG
-ATTTGTGTGTGGAGGTTTTTAATGTATATAAATAGTGGTTTCAATAGATCTGTGTCATAG
-GCTATTTTGTTTCCTCGACACTGCTCTGTGtgctgagtccagctcaagtcccttggttcc
-cactgctgctaagcatgcacggtgtgcgtgtgccaccatgcctccttttcccaccgcttt
-agtgatggatgctggctacctccagttcccacctccccaagcaaagctgtgatggacttg
-cagtgtgtgactctcatggactcccgtgtgtatttctctgggatgtacactcgggggcag
-gatccctggggtggagagaatacatacagttactgcactctatgacggctgcctcagtct
-acatgcccagcagcagggcatgagggaccactttctccacatgcaccctagcacttggaa
-ttatctgACTTCCCAATGATGGAGATATGGGTTGTTTTCCATCTCCTTGTGCTTGCCTCC
-ATCACGGTGTGGGCAATAATGAATACTTGTTgcactttgggtggccgaggcgggtggatc
-attgaggtcaggagtctgagaccatcctggccaacatggagaaaccccgtctctagtgaa
-aatacaaaaattagccaggcgtggtggtgtacctgtaatcccagctactcaggaggctga
-gtcaggagaatcgcttgaacctgggaggcagaggttgcagtgagccgagatcgcgccact
-gcactccagcctgggtgacagagcaagactccAtctctctctctctctctctctctctat
-atatatatatatatatatacatatatatatgtatatatatgtatatatatgtgtatatat
-gtgtatatatatgtatatatgtgtatatatatatgtatatatatatataATGAATACTTG
-TTGAACAAATGAATGAAAAGGCTAATACACAGCCTCCCACACCTACCTTGTACCAAACCT
-CAGTCTAGAAGGTGGCGGTATATGTGTGTATGTTTGTGTGTAGAGAGGGGAATATAAGAC
-AAAGTCTTATGCCTCAACCTGCTTAGAGAAAAAGACTaatgacagttagcatttattgag
-ggcttactttgtgtcaagaattCATAGGTGTATATTCACAACCTTAACTTCAGTGAGACA
-AGTAAAATGCATTTCTCTCTCATTCAAGGCCTTTGGAGGTAGGGCTGCTCTGGCATTCCA
-CAGtgtggtcgccagcttccaagattgccagcaatgatccttgcctcctagtattcatct
-gcgtgtgtagaaccctcccccattgaatcagatttgactcatgtgaccaaaagaatatga
-cagaagtgacggtatgtgacttctgaatgtagctcataaaggcattgagctcctgccttg
-ttctcttgagtcatttactctggggacagcagccaccatgccatgaggacactcaagccg
-tctgtggagagagaccaaggtccctagcctacagccatcaccaatttgccagccaagtga
-gtgagcctccttggatgtggatcctgaattcctgacctgcaggacctgtgaaaaagaaga
-aagataatacagaaagacaaagaaaaaagataataaataattattggctgggcgcagtgg
-ctcacacctgtaatcccaggacttcacaaggctgaggccaaaggatcgtttgaggccagg
-agtttgagaccagcctgggtaacatagtgagaccctgtctctaaaagaaaaaaaaggaaa
-agaaatttgctggatgctctggtgcatgcctgtgttcccagctactctggaggctgaggc
-aggagggtcgcttgagcccaggagtttgaggctgcagtgagccatgatcacaccactgca
-ctccagcctgggcaacagagcaagaccttgtctctaaaaacacaaaaattatcaatgttg
-taatcccgtaagtttagggtgttttgttatgcaacattagataactaaaacaGATGGTgc
-cggggacccaggctctgtctatctttttactgcaccatacatagctttcacttcctagtt
-ctcttacagagccacatggccacaggagccattctatctgcattccaactggcaaaaagg
-agaaagaggcagaaggaagagcatgctttaatctgtagaacaccaacctcactccgttca
-catcccgttggcaagatcttgtcatttgaccatacttaactgaaaaggaggctgagtata
-tagtcttttgcaggtaggtgtccgtgtgtgcagctgaacactgggtttctgttagtgagg
-aagaagggaagaatggctattgaaaacaactaacCATAGGTGTTATATACCATAGGTGTT
-AACTCTGGAGATAATAATGTCACAtggttaagtttgcacatttgggagcctgactgcctg
-gtttcagttctcagttaggccacttaccagatgtgtgatcttgggaaatttaccaaactt
-ttctgggcctcagtttcctcatctgtaaacagggctcacagtaaagcctgcctcataggg
-ttgttatgaggattaaatgagtcaatgtatgtagcgtttataacagtcctggcacatggt
-atgtgctGTGTGTTAGCTGTTTTCATTATATAATCCTTACAAGGGttttttttttttttt
-gacagagtttcacaattattgcccaggctggagtgcaatggtgcgatcgcagctcactgc
-aacctctgcctcccaggaggattctcctgcctcagcttcccatgtagctgggattacagg
-catgcaccagcatgcctggctgattttgtatttttagtagagactgggtttcaccacatt
-ggtcaggctggtcttgaactcctgacctcaagtgatccaccctctttggcctcgtaaagt
-gctgggattacaggcatgagccaccgcgcctggccACAAGGGGTTTTCTTAAGTTCTCAC
-AACCAGCAAGTGATGGAAGCAGAATTTGGCCCAAAAGCATTTTTTTCCACTTGCGTCATC
-CCATAGAAATTCGTAGAGTGCAAGATCAAGAcccagatcagtacaccgcacataatacgc
-atccagaaatatctgtcgaatgagtgagtTAAATAAACACGTAAACTGTCCTTACATAGA
-GATGCTAGGTTTTGTTTGGTTTTGTTTTATGTTCAGTTAATGAGAATGCTCCATTGACCC
-CATCTGGTTCCTCTAGTATGGGGCTGATGCCCTTGATACCATGCTAGAACTCAGTCCCTC
-CAGGGTCCCTCCAAGCCATCATTTTTAAGGGTGAATTCCTGGGAACACTTGTTCTTGCGG
-ATGCTCAGGATTCCATGATTTTTTttaaaaaaagtcagagaagctgcattttatatcccc
-ctcctagcgacctgcaacaacattagcatgttaaagagtcggagaaatcctgcaacaaaa
-aagcttgttgggcttcatttcaatctgcattttgttttcttatttttttgagacgaggtc
-ttactctgttgcccaggctggagtatagtgatgcaatcatggttcactgcagcctcgacc
-tcccaggctcaagcaatcctcccacctcagcctcccaaataactaggactacaggcatgt
-gacaaacccagttaatttttaatttttttgtagagatttaatttttttttttgtaggcaa
-ctatgttgcctaagctagtctctaattcctggactcaagcaatccttctgccttggcctc
-ccaaagtgctgagattacaaacatgagctaccgtgcctggtctcaatctgcattttctga
-gcttatttTAGGCTTACTTGATTAAAGACTCACTTCCTGCCCCCAACACCAGACACCTAA
-TAGAGAATACAGTTTAGCAGACATTTCTCCGGGCTGTTGCCACTGACATCTACCTCAGTG
-TGAGTGGGTATCCATTCTTTCTAGACAGCATGTTTGATAGGAGTGAAGTGGAAGTGAGCA
-GGTGGGTGCTGGTTACCAGGAAGAGACAGGGTAAGAGAGGGAACATACAGGCATATGTCC
-GAGCCCCACTTTCTAAGGGACATAAAAATATCATTGAAAATATAATAGGTGGAGAAAAGT
-GTATTTCGTGGTACTTCTTTCAGGGAAAATGCAATGTAAATTGAaataataatattattg
-aggggtaacaatatgccaggcactctgctaggaacttatttaatcctcacagcagtctca
-tgagctaagtactattaatattcccgttctataggtgagtagactaaagagcagaaaggt
-taagtaatttgcttaaggtcacatagctagggagtggacaggaattcTTTGATAAGTTGC
-TTGTGGTGAGGATAACAAGGGAAGACCCTCCCCCGGGGTAGTTTAAGCTCAGATGCTCAC
-AAAACTCTGCTCCAGGGAGAGTGAGCCTACTTGGTTGAAGAGCACTGATTTTGTTGAGTA
-GAGGATGCAAGTTTGGGCCAGAGTGGAATTGTTCAAGAATAGAGAGGAGGTTGGTGCTGC
-CATGGGTGCCCTCCTTCAGCTCCATCGCTTTAAGGAAAGGATGAGCTCATGTTTAAAGAC
-TTTTAAGTTGAAGGCAGTGCTAAATAATTTAGTGTGGTCAGGTACCCACCTGACTCAGGT
-TGACCCTGACACCAGTGCCAGGTGTGGCAGAATCACCAAAATGGTGTGGAAGATCAAGAT
-AATGCTAAAtgaaactaccatttaagtctgctttgaaaactcaaggagtttggagctcag
-agttgccaagaacaagttggaatggcctgaggctgccatgctatgaggaagcccaggcca
-catggagaggccacatgcttttgactggtcgttctggtctttcaattctcccagctccag
-gaacagacacatgagtgaagaggctttcatacaattccagccccagttatcgagtctttg
-ccattgaagcctcagacatcatggacagtgacaagtcttcactgctctacccattctgaa
-tcctgaactacagaatccgtgagcataaggaaatgcttaagacaccaaattgtggggtaa
-tttgTCACACAGCAACACTAATTGTGACTGTAGCTCACTAAAATGCCTCCCAAATATTAT
-CTTCACAACTAAAAGCACCAAAAAACCTGAAAGTAcagttgaatttcatgatttgctata
-attatattctagaaagtcactgcaaacactgaattagcaaatactgaaccactgctccta
-ggagaaatacaggcttaggttcctgtgaaccattctgttcccaacatgttcatcaactca
-tcaatacttaagcttgttttatgcatgtttctgttgaaagacaccatgtttaatacatat
-tgttgattcactcacattgcactcatggccaacagcactgtaactcacgcctgaatgaag
-cttatctaactcacatgatcttctctgtaaggcacatcaaagccttctggtgcttaggaa
-cattagacagcacctcagcaccatgcccggggccattgtcaacagtacaatcaccagcgg
-aagacacaaaaatttgtaaaatgtggcactgaatagactgaaaaggacagttgtttacag
-tgtgagagctgaaagaagaaggcagcgtgtcactttgtatgatctcacctggaaacatgc
-atcaagtgactcaaaaaaaattttttttttcgagacagggtctcactctgttgccaggct
-ggagtgcagtggtgggatctctgctcactgcaacctccgcctcccgggttcaagcagttc
-tcctgcctcagcctcccaagtagctgggactacaggcacacgccaccacacctggctgat
-ttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcaatcgctt
-gaccttgttatctgcccacctcggcctcccaaagtgctaggattacaggcgtgagccact
-gcgcccaactggcaactcaaatttttcatgactcctcaagtatccatcaatgaccatgag
-agctccagcgagtgttgattttgaggttacaaatttagtgagtagatgaatccacgactc
-cacaatcagtgactaataagaattgactgCATTATTTAATAAGTTCAGGGCTTGCCGTCG
-TGATTCACAATTGGAGAAAGCGAGGCATGGAGCAAGTCCAGGGGTGTTCCAAAAGGCCTC
-ACTTTTCTCCTTTGCAAACTGTGGCTGATGAGGGCCATCCTGCGGGGTTTGTGGAGAGAA
-GGGATAGTAACAACAGCTGCATTGTATGGTGCTAtgtgctgcacactttgcacacctgat
-catttaatactcacaatgatccctagcagatggatcctattaccaagttcattttacaga
-tgaggaagcttagacccagcaaggttaaggggctgtgctcaaggtcttaccttctaggag
-aggcagagctggatctgaagccatttctgttctcagcccctgctGTGTGCTTTCCTACCA
-TCCTCTCCAGACTCGCCCTGAGCCCAAGTTGCtgaggcatgtggcacggtgcctggcaca
-cagtaggctcacagtagtggctgctttGATGATGACCATAAACTGGGATCTGGGGTCCTT
-GAGATGATTCTACCAAGGGGACCCGGGGGAAGCTGAGCCCTGGGGCAAAGTGGGGGCCAG
-CACAGGAGCTGCTGGGGAAGGAACAGAGCCTGTGCGGTGGGAAGATAGGACATGGAGCAA
-AGAGGATCTTGAATCAGACCCCGTGGTCCCCTCCTACAGAGGGTTAAAGCAAGCCAGCCT
-CCTTCCGGCTGAGCGGAAATCAGATTTTGAGAGCTGAGCAGGGCTCTGGAGGGATGTTTT
-TCTTCTCCATTTGTCTGCTTGTGGCTGGCCCATAAAATCCACCGGAACTCCATGCTGGAC
-TGAGGAATTCCTGCTGAACAGGGACATGGAGAACGCAGGCTGGGAGGGGGCATAGTGTGG
-ATCCTTATCAGAGCAGAGACCACCCCATCTTCAAGGCCCCACCTCCAGGTTGGGTGATCC
-CCTCTGGAGGCCTCATAGGATTCCTGGGTAAGGGGAGGGACCAGGATCGACAGGGTGGGG
-GAAAGTCCAAGGAACAAGTGATACCCCCTCCCACCTTTTCAAAGTGAACTTGTGGGGTGA
-GGAATGAGAGGAGACAGGGAGGGTCAGGCTGTGGCAGGTCAGTGAAGTGtgatgcaggtt
-ccaccttctacgctgtgtgacattgggcaagtctctgcccgtttcctcatcattgcaacc
-agggggctggagctagatgaccaccatgtgtaattttctaatcagagctgacagtctgag
-gctctTTCTGTCTAGTTTGCACCTTGCATGCATGTCCTCCCCTGAAGGCAGTGCAattat
-tataacccctattttaaaggtaaataaaccaaggctcactgaggcaaggtgacctgagca
-attttgcccttgaagggctgggacaggatgcaaacctagacaattggtgccagaattcat
-ctctcaagcattcgctctcctgCCTCCCAACACGAGTTTCTACttctctttgccctggga
-tgacctctcctttgtctcttggcttgatgacctcatttttaaagattcggctcatgcatc
-acctcccccaagaagcctgtcctgactaactaagctcggttggggctcctctctgtctgc
-tcatgcctctgggaagtagctgtctcttttggtcactgggctgtgagccctggatgagca
-gagccacttctcattccttcctgtgcctcctgcatcAGCCAACATAAAAAGCTTTCAATT
-TTCCTTGAAGATTCTAAGTGCTTGTGGTGGTTTTAGAACATGGCTGCCTTAAGAAGTGGG
-GTCCATTggtagctcatgcctgtaatcccagcactttgggaggctgaggcaggaggattg
-cttgagcccaggaagctgaggccagcctgggcaacacagcaaaatcccgtctctacaaaa
-aatacaaaaattagccagatgtggcagcatgtgcctgtgggctcagccccttgggaggct
-gtggcaggaggatcacctgaacctggggaggtcaaggctgctgtgagctgtgattgcacc
-accgcactccagcctgggtgatagagggagaccctgtctcaaaaaaaaaatggggtttat
-gtctcctcctcttgagtctgggtgggctcgtaacagctttaaccaatagaatatgtcaga
-agtgactctgcgactactgagactgttcactggcactctgtttttggagccctgagctgc
-cgtagaagatgttcaaatactctgggactaccatgctgtggggtcacatgtaggccctcc
-tagtcttcaagtcatcctggtctggggactccagatgattccagttcttagttgtttcat
-atccagcctttgagtcctcccggctgaggaccaagacaccacggagcaaaaacaagccat
-ccccaccactcctggcccgaattcctaagcataataaaatggtggctgcttaaagccacg
-gagttttggggtagtttgttacacagaggtggtaacgggaacaGtgcgaccaccctgggc
-atgtcaccttcctctctggccagccagaaggtgcagcagccacaaagctctctgcctcct
-cccttccctcagcggtgtgctgctgacacagcagtcagagatgccccataaatgcttcaa
-acagaccatgtccctcctttgctcaaaaccgtctgttggctcccagctcactcagaggaa
-atgccagattcttaccatggcccacgggccctacatgatgggacccctctccagcccatg
-gcctctctgtcctgtctcccaccctctcccttctccagccacaccacctccttgctactc
-cttgaacaccacatacgccctgtctcagggcctttgcgcttgccaaggacagtgctccat
-tgcctggaacattctttctccaggtgttgcttggttcagtccctcatcttgttcatgtcc
-ctgctcagatgtcatcttctcagtgaggccctctcttcctactcccaaaccccttgactt
-gctctattttcctctcgccatggcccttagaactacctaacacactatgcactttactta
-ttgtgtttccccgcccaccccgtccaccctagaatgtcaataccacagggcaggaatctt
-ggttattctttaatgtctccccagtgcctgtaagagtacccaacactcacagtggtttgc
-tgaatgaatgaatGAATGAGCTGTAGGAGCCCAGAAGGGGTTCGTTGCCTTCCCTAGGAC
-TATGTATGTGGGGAAGCAGAGTGGGTGAGGAAAGGGCAGGATTGGAGTGACTGGGTTGAG
-CCAGTGTGGCCAGGGCTGGAGGACATTTCTTGGAAGTGACAACTCACTGCCCAGCTGGGG
-AATCCTGAGGATGGGAGAGTGCAGGGCAAGCCTTTGAAGATGCAAACATGGGTCGTCTCC
-GGGGCCTCCCTCCTTCCTGGTCTTGTGTGTCTCCGGCCCTGCCAGTAAACAGGATCTCTG
-GGCAACTGCCTGAGAACCCTGCCCAGTGCCCCAGAGGCCCTGACGTGCTCCTTCCTGAGC
-TATAAATCAGGTACCTTCCAGCTGTGTGACATCCTGGATTTGATGGGGAAGGCAGAGCAG
-ACAGATTTGTTGCAAAGAGCTGTGCActgcaccttgatttccttgttagcaaaataggaa
-ggataggagcgttgacttcaagctgtggctgtgaaatcgagtgagataatgcatgaaaTT
-CCTCTGTAAACAGAGATGCTTCAAGGACGCATTAGTGGGTGGAGGCACAGGgagcaaatc
-ccaactctgccgctgagctctgtgtcttcacctgtaaaatggggttaatgtgaatcacta
-acttcctagggctattgagggattcaaaaatggagagaaaagtcttagtacccaatgaac
-gtgcaatagatattagctgttattaATGGTAACTATTACCATAATGATAAAGAATCAGAT
-GTTATTGATAAGCCATTTGGGAGACCGAGAGTCTCAGTTCATACCCCAGAGGGGACCATG
-GACTTGGCACAGCACGATTTCAACCCTGTGCCTTTTGTGTATATTTCAATCTGGTCAGAG
-ACTATCTCCCACTCACAGGCCACCTCCTCCCCCTACCCCCAGAAAGGCTATACTTGTGAG
-CACACCACTTCCCTAAAATATGCCACAAGAGTCGACATCTagccaggcacagtggctcat
-gtctataatcccagcaatttgggaggccaaggtaggaggatagcttgaatccaggagttc
-gagaccagcctgggcaagatggtgaaaccatctctactaaataattttttaaaaattagc
-tgggtgtggtagtgtgcacctgtagtcccagctacttgggaggctaaagtgggaggattg
-cttgagcccagaaattcaaggctgcagtgagctgtggttgtaccattccacttcagcctg
-ggcaacagggcaagaccttgtctctaaaaaaatttaaaacaaacaaacaaacaaagaATA
-AATATCTAGCCTTGAAGCCAGCCTTGGGGGTGGGGTGGGAGGAGGACTATTTGTGtgcag
-gagttcaaacccaggccccatcactccccagatgtggaaacttagacatgttatttaatt
-gtcctatgcctcagttccctcaactgaaaaagagaataataatagtacccatctcttcta
-gttgcattgaggactgaatgagttaaAAAGTACCcaacacaccatatgagataatgctat
-tttcattctaccaatgggtaaactgaggctcagctaggagaaagaacttggttcaagCTA
-TCAGTCGTGTTGTTTATTGGCCCTAAGTTGTGACGAGTTTCATTATACCATTAGAAGCCC
-CCGAACAGTGAACTCATTGTTTGTGAGGTATCTCTATCTCTTAGTGATTTTTTAGTTAAA
-TGAGAGTCCATGCTAATCATTTATAAAAAATGGATAAGATAAAAACTTAACATTGAAACA
-TCCATGGGCTTCTTTCCATAAGAAATGGAGAAACTCTTGCTCCTAGTATTAAAAGGTCGT
-GGGTTCCAGTTTGAGATGCACCAAGCAAGGTAATAGGAAGTCCTTGAAGGTTCTTGAGCA
-GGGGGAAGCATGAACTTAAAGCATATGAACCATGTGTTTGGGTCAATTCAagttactgag
-acttagacattgctggtgggatgcaaattgctacaatctctgtggagggtgattgagttc
-cacaaatatttaagataaatgtaagagctcctaccAAAtgccaggtgctgttcaggtgct
-aaggatttgcagcaaataaatccaaccaagtccctctgcctggtgcttattttctggaga
-ggagacacacaatgaatgaatatacaacttagtatagcgtgCACTGGGGAAAGAAATAAG
-AGCATTTCTACAATAATGTTTACTGCAGTGTGAAGGGGGATCTGAAGAGGCTGGACAGAG
-CCAAGTATGGGTGAAGATGTGGAGATAGCGCTGGGGGTGTGTGGACTGGAGCTGCCATCT
-GGAGAGCAATCTGTCCAGTTAAATCTGTACATTGggtgcataaattatggccaccaatta
-tttgacattcctcccatctagatgtaggtctatgtatctgctctctgaatctgggctggc
-ctctgactgctttgacaaacaactatggtggaagtgatgatgtgtcagtttccaggccta
-ggctttaaaagattggcagcttctacttcctctttcttggaacaattacttgaggggaag
-ccagctgccatgaagaactccagccaccccaagactgccattctgtgaggaagtcccgcg
-aacaatggaaagaagtcctctaggatgagacaccatgtgatggagagagaggccaggaac
-atcaaggctgtagacatgagtgaagatgccatcttgaaagggaacctccagccgtagctg
-tttcagttgataccacaaggttcagaaaggagccacccagctgagtccttcctaaattcc
-tgactcacaaagtaatgaacaaagtggttgctttaagcctctaagttgagggtagtttat
-tgtagtgcaaaagataaccagaataGATatatccgatgacccagcaattatactcctggc
-tatatgtccagacaaaatTCTCTTATCAGCCCATAGAGGATATGGCCATATTGTTGTGGC
-AACAGAGAGTTAGAGGCCACTCAGGTATCCATTACTGGGGTGGTAGAAAGGAATACATGG
-TAGGTGCAAAGAGCTCTAGGCAGCAATCAGAAGTCACAGGTGAAGCCACACATACAAGTC
-TGTTATGTTCTACGTGAAGACTTATACACCACAGAATGCACAAAGAACCCATCAGAATCT
-ATGGAGGTGCAGAAAATATGAAGGGGAAATGGGATAAAAAGGAATAACTAGAGAGAGAGA
-AACAAAACCAAACAAAGGAGGGTGCACAGGGGTAAGTTATGATAATCTGCCATGAATTGA
-GGTCTTATTAAACTCAACGCTCTACATTTAAAATCTAAAAAgtaataacaaaggccaaca
-aaattaatgtgtgtgaatagggggttggttaaataaattgtagcacatccacatgaggga
-gtactgtaaagccataaaaaagagtggcagagcttgctatgtactaacatgtaagagtcc
-caaagtatgtcgaaaaggctataagaagggtattgaaaaggatgcataataggcttccat
-ttgGGGGGAGATACCAGTGTGTGTGGTTGTGGATATGTTTATAGACAAATGGTATATCTG
-TGGAAGGATGCTCCTGGGGAAAAGAGCCAGATGTCAGGGGAGAGGGGTGGATGGCACTTC
-AGAAGAGCAGGCACCCAGGAGCTGTGTTCAGAGAAGGAATTGCCACTAACACTGGGACCA
-CCTCCTCCAGGCCAGGATCACGCCAGGTGTGGGGGCTCAGAGTGGGCAGAGAGCCTCTGC
-TGCTTCCAAGATGCCCAGGGTCCTGACTGTGTCCATGATGCAACCTCAGCCAACAAGTTG
-GTTGGGCACTGCCCACTGCTGTGCCCTCATCAGCCACTGTCCTCACTTCATTGCCACTCA
-CCATCACCACTCTCCTTCATTCTGCCTGAAACACTCCTCCCCACTGCCCGTCTCCCTCTG
-TTACTTAATACTCAAACTAGTACAGAGAATAACAGAATAAAATCCCATGTACTCACTGCT
-CAGTTTAAGGAATAATACttttcttttcttttttgagatgaagtctcgctctgttgccca
-ggctggggtgcagcagcgtgatctcagctcactgcaacctccgcctcccagattcaagtg
-attcttctgcctcagcctcctgagtagctgggattacagggatacgccaccacacctggc
-taatttttgtatttttagtagagatgggatttcaccaagttggtcaggctggtctcaaac
-tcctgacctcgtgatctgcctgccccggcctcccaaaatgctgggattacaggcatgagc
-cactgcgcctggccTAAAACTTTTCAAAAAGAATTGAGAGTGAAtggttttaaatatgtc
-cacaaattcttggacactcctctcttcaaaaagtagagttacattctccttacctttgag
-tatgggctgagctcagcaactcatgtctaatgaagaggatgtggtgaatgaggatgggtc
-acaaaagggatacaacttctgcttaattgtccatctgtccgtctatctctccatgctcac
-ttttggaatccagccaccatgttgtgatagaacccaagatgcatgggcgggcccacatgg
-agaggaactgaggccctctcccctcttcccagtccctgatcaacaaccatcacaaatttg
-ctagccacccagatgaaccccctttggcttggcagcaaattctccagcttaccctccaac
-tccccaacccgataggccttcagatgactgcaggcccagctgacagctgaatttagcttc
-ctgaggaccagaaccacccagctaaaccatgcccatattcctgccttcagaaactgtgag
-atataaaaaatgactgttagtactttgaaaacattatgttttgggatgatttctaatgca
-ggatcgattgctaatacaGAGGGTCCCTGGTATCCCTCCCCACCATCCCCATCCACCCTC
-TTAGAAGCCACAATCCTGATGTTTATTATTTCCATGAATGTTTTACCTTTTACTACATAT
-AATAAATCCTTACCCAATACATAGGACTATAtttccttcttttttaaagaattttttctt
-tttgagatggagttttgctcttgttgctcaggctggggtgcaatggcgcgatctcggctc
-actgcaacctccgcttctcgagttcaagcgtcattctTAAAAATGtatagaagtgcatat
-atattgtatggattctgtgcatcctacctcgcatgctcttttccttgcacagtgtgcatt
-ggcgacccatctgcattgaggcaggcagctgccattcgttggcactgctgggcattcttc
-ccttatatgaatatgttaataccacgatatagtatctgaagtccatgttgatgaacattt
-ggatggtttttattttttgctattacaaacaacagcgctggtaacatccACTTGCCCTCT
-TCCCTCTTTCACATGGCACCTTCTTGTTCTTGGAGGTCTCAGCTCTAACAATGTAACCCC
-ACCAACCCCCCGCTCCAGCTAATGGGTTCTCTGTCCCCACATGTGCCTCCCAAGCTGGCT
-TTTGATGGTGctccctctgtttttccttctggcatctactccgtgtggtcaacattcagt
-tatcttttcctgtctggagctagagggtaagccccatgaaggcaggcagagtagtgggtt
-tttttccccagtcccctccatccctgatgctttgcacagggcctggcacacagtaggttc
-gcaagaaaaattgttggatcaggaatgGCTGAGAATTAGcttcctctctttgggcttcag
-ttttcccatctgcacagtgaaaactttagataatttcGGGGTGATTTTAGGTTTAGCCTT
-TGAGAGGTGCCTCAGTGGCCGCCACAAAATATCGGAAGACCCCAACTTTCAGCAGAGCTG
-GCCTTGTTTCCCTTGTGTCTTAGATTGGTCTCTATGGCAGATTATGTTTAAAaagaatag
-ccaccatttattgagcgctcactacgtgataggcatgctgtcagctggcagatgcatttc
-ctcattttggccactcattaaccctcagaagtagcactgttactatgctctttataaaga
-ggggtaaactgaggcaaagagaggtgaagtcacttgtcagaggactagcaaaggagggag
-ctgggatttgtagcacaagagactatcagagcccattcgccaaccctggtgcagccctgc
-cccactgGTACCACAGCTTTAAAGAAGTGGGGTGGGAGGCAGAGGAGGAGGACGGTGAAG
-GACAAGGGTGAAGAGAAATGTTTGGATAAGTTTGACAGCCACTCTTCTGAAGGGCTTTGC
-CAGCCGCAGCATTCGGGTGTCCCTAGTCACGGGGGCTCCGTCACTTCCCTATCCCCCTGT
-TTCCCGGCCCTGATgggtcttgctctgtcacccaggaggctggagtgcagtggcgtgatc
-acagctcactgcagcctggaactcccgggctcaagtgatgttccccatcagccttcctag
-tagctgcgactacaggcgtgcaccaccatgcccagctaagttttaaatgtttatatagac
-acagggtctcactatgttgcccaggctggtctcgaactcctggcctaaagcaatcctcct
-gtcttggcctctcagagcactgggattaaagtgtgagccactgtgcctggctGAGattta
-ttgatcacatagatacctatattattctaagtgtttttcaagtgacaactcatttaatct
-tcataactgtcctgtgacgtagatagtatcagttttatcagtattttatggagattaagt
-aacagaagcacagaaaggtcaagtaacttgcacagagtcacacagctggtaagatgtgga
-cccagctttgaatccaggcagtccagctccagaatccttgtgcttcacATCACCACACGC
-TGCCTTCACCATCACGTGTCAGTTCCACACAAGTGGATGCCCACAATGGTTGGGAGTAAG
-GGGAAAAGGAGTAGGGCTTGAGGAAAAAATAAAAGTGAAGCGTGTGATGATAATGAGCTA
-TGCTTGAGAAATGGGATTAACTCAGCTCTCTGTACTTGATAGAaaaaagaaggagaagga
-ggagaggaaagaagaagaaggaaaTATTTAACTGGACTCTCCGGGGCTTAATTATAACAA
-CTGTCTGGCACCTAAGGTCCTTCCCTAGCTGGGcttgctgcttctctaatctcatttccc
-tacgtttctcacggtgctccagtcactccaggccacacctgatcccagaaacctacttgt
-tcctactttgagcctttgcttgtgctgtttcttccattaagggtgccctttttgccaggt
-gcagtggctcatgcctataatcccagcactttgggaggccgaggtgggacaatcacctga
-ggtcaggagttcgagaccagcctggccaacatggtgaaaccccgtctctactaaaaacac
-aaaagttagccaggcgtggtggcaggtgcttgtaatcccaactacttgggcggctgaggt
-gggaggatcgcttgaacctgggaggcagaggttgcaatgagctgagatcatgtcgctaca
-ctccagcctgggcaacagagctagagactccgtcacaaaaaaaaaaaaaaaaaaaaaaaa
-agagtgctcctttccccattttaggaactcctacacatccatcaaaacctggcctaaagg
-ccctctcctcaatggaaccttttccagcctttcacttcttggggttcccacagcccttta
-catgtctctattctggttggctcacctgctagccagtgagctcctggaggacagggatgg
-gtctggctcatctctttaaccgccatgctgagcccagagcctggtaaatggtgggtgctc
-tataaGCTCGTGCCCAGTCACTCACCTTTACAGCTCcagtgtctggctgacagtgggtgc
-tcagtacatgtggttggacagatcaatGAGTGAATATTTGACGGAAGGGTGAATAATGAC
-ATCAAGGCTGCATTCCAATAACAGCACAATCCCAGTGCTGAGAAAACAATTCACAGCCCT
-GGATTCATATCATGGAATTCTGATTCCTAGGCCCCTTTGTTCCCAGAGCTATCCGATGAT
-GCTGAAGAAGAGTCCCTGGGCATCATCTGTTccagctgtgtgaccttgagcaagttgttt
-aaccaccttgtgccccaagattctcatctgcataaagaagagaaatagctacaccttcct
-catgggctagttacaaggatgaaatttgatcatatgtgccaagcacttaacacaacacat
-gaacatCACGGCATTGGCATGTCAGCTATGCCAATGACTCTATTTATACCTGAAttttta
-tttgaaataatttcagacttacagaaagtttgcaataataatacaaagaattcctacata
-ccatcacccagattccttaaatgttaacattttgcattctttgctttttcattctctctc
-agcatatatttttgtccagtgcctgaattgttggaaataagttgcagacatgttgactct
-ttacctctaagttaattatcccatgtatatttctaaaaacaagaatattctcttacaaaa
-tcgcaggacagatagaaaaatcaggacactgatacaatgctattgtctatcttatagacc
-tattgaaattttttcagttctactaatgtcctttgtagcaaataaacaaaaagatttcta
-cccccccaccccacccactcagtaaccagtccaggacacatgttgtatttaatgtttatg
-tctctttagtcttctttttagtcttatctggagcagtttcttttttttgagacagagtct
-tgctctgttgcccaggctggagtgcagtggtgccacctcggctcactgcaacctctgtct
-cccaggttgaagtgattctcctgcctcagtctcccgagtagcaggaattacaggcgcctg
-ccaccacgttcagctaatttttgtatttttttagttttaccacgttgaccaggttggtct
-cgaattcctggcctcaagtgatccacctgcctcggcctcccgaagtgctgggattacagg
-cgtgagccactgtacccagcgtggaacagtttctttggcttttatggctgacattatttg
-aagagtttaggccagttttttgttttgttttgttttggtttTTGAagatggagtttcact
-cttattgcccaggctggagtgcaatggcaccatcttggctcactgcaacctccgcctctg
-ggttcaagcgattctcctgcctcagcctcctgagtagctaggattacaggcgctcgccac
-tatgcctggctaattttttgtatttttagtagagacagggtttcaccatgttggccaggc
-tggtctcgaactcctgatctcaggtgatccatctgcctcggcctctcaaagtgctgggat
-tacaggtgtaagccactgtgcccagcctggaacagtttctttgacttttatgatcaacat
-tatttgaaaagtttagaccagttgttttgcagattgtccctctgtttggatttttgtgtt
-atttctttatgcttggattcagatcaggcacttgtggcaagaacaccgcatcagtgacgc
-tttgtccttcacagtgcgtcccatcagggggcccatgatgcctgccgacttgccccacta
-ttagcaatgttcactgtgatcatttggtgaaggtggtgtctgccagttttccctactgta
-aagttaccatttttctctttgtaattaacgaataccttataggaagatacactgatacta
-tgtaaatattctgtttctctttatatttcctgcccatatatttcctagcaggatgatcta
-ttttgcaatagatgcaattattatttgatAAAGGAATACATAAACATGGACCAATATTCC
-AACAGTATAAAAGAGTGTAAGGCAAATctcccacccactccgtccccagccaccccgatc
-ctctccccaagccatccctagtctcactgtttcttgtgtccttccagaaatgttctatgc
-atagacaagcgaatccactcatccatcttcttctcgagttatgtgcatgcagaaggtagc
-taaatagacacatgatctgcatcttgttttatttcatttaatattttggagaccatttca
-tatttgaacacaaagaGAGATCTCTTGCTGATTTTAGAAACTTATGTCCATCTGAGGTGC
-AATCCCAGGGtagtcaatctctttcaggttcacaaataaggaagctgagactcagagtgg
-ggaagggacaggtcccaatgtcagaggcaaaacagacTTGGAAACCAGCCTGGAACCCCT
-GAATAAGAGAGTTGACAGGTCTTACTATTGGGGAACCAGTCCTTCCAAGGGCCTTTTCAA
-CAAAATGCCAGACCCAGGCTCATGCCCCCGTTCTCAGCCTGGCTTCTCCCTCCTTCCCCC
-CTCCTCCCCTGGGTCCCTTCTTAACTCTCGTTAGGGACTCCCCTCCAGCTCCCTGCTGGG
-CCAGGCCTTGGGAGCCCCATTGATCCTCTGACAGCCCAAGACAGATTGGTGGGGAGTGTG
-TATTCAGGTGCAGGCGCCAGCACATGGAGGCCAGATGAGAATGGGGTGGAGGGGGTCAGG
-GGCCTGCTGGGGTGGGGGGATTGAGGATTGAGGAAGGCCAGGATAGTGCATCCCACAGAC
-ACCTGCCTCCCCTCTTTCTCCCCCACCAATTCCTGCCCTTCTTGGGGCTTCTGTTCCTCC
-CGCCTCCTCTTGCCAGGCGTGGGCAGGCCAGAGGGGCTGGGGCAGGGCCTGGGAGGCCTG
-GGggtgtagcagagagaagtcgggatggggagtgagccttgcttggtttgatctcagctc
-aggccctcttgtgagactcaggcagatgacatctcttgagcctccgtctcctcggggcaa
-taagaaggaaataaACTTCATACAGCGTCCAGCAGCCAGTGAGGCATGGCCAGTAAAGGT
-CTCCATGTCCTTCATTGGCCTCTTAAGGCTCCCACTGCATTGTTCCTGTCTGATTATGGA
-AGCCCCCAAGCCAAGGCGGCCCCTCGGCTCTGCCTGCGGAAAGTTTTCCCTTCACCTGCG
-CAGACCAGGCCGATGTGGCCTCCAGAATGGAGGGGTCAGCCTAGGTTGCCTGTGACAACT
-CTGAAAGGCCTTAGGAGGCACAGCATCTCAAGTGCACACCCGAGTATGGCGTGATCTGCA
-AGGGGAATAGGGGCTGGGGGGAGACATAGGCTTTGAAGATGAATCAGGCTGGAGCAGGGT
-GGAAGTGGGCTCAGGGAGATGGAGCAGGAGGGGTTGGTCAGGGAAGAGGGAGCTCAAGGG
-AGGAGACATAAGCGCAGAGAGTGAGATAGATAGGGACCCAGCAGCAAGTGGGCTCAGAGA
-GGGGCTGTGGTGCAGAGAGAATGAGACTCAGATGGGGGCTGTAGACTCAGAGAGAGAGAT
-GGGGACAAAAGGGGAGTGGGGGCTCAGGCAAAGGGATGAAGGCAGAGATGGGAAAATTGG
-GAGGGAGGGGAGCATCCGTTTTGGGAGGGAAGTGTCAGTTTTGAGCACACACAGTCCTCT
-GCAGCTTGAGGAGGAGGAAGGCTGGGTCTGTGGAGGGTGGGGAGCGGGTGGCACCAGAAC
-AAAGCCCCGGGGGTAGCAGCCTGGGCCCTGCAGCTCCTTCGCAGCTGACAGTCCCTGAGC
-TAATTACCATTAATGAGCAGCTGGGCCCAGTTTCCCGGGATTTGCATTCACTGTGCTAGT
-CAGCGCCACTGTGGATGGAAGCCAGCGCCAGCCTTCTGGGGTGGGGGTGACTCAGGGAGC
-CGAGGTAAGATCGCTGGCTTCATGTGGGGCTGAAGAAGGTGTGGCTTTGCCTTTCCTGCA
-GGTTAGGAGATGGCCGAGGTACAATCGTGCCTGGAGGCAGGGCACTGGCATCATCCACCT
-GTCCTCAGCCAGGGCCGGGGTAAGGGTCTTGGGGAAGGAACAGGTCTTGTGGCCCTCAGA
-AGCCCTCAGACATTTGGTTGCAGGGGCCCTCAGATTGTGCAGCCAGCTGTCCACTGCGGA
-GTTGAGGGAATAGACCACAGAGGAGCAACGTGCTGCTCAAACTCATACCAAGACAGCATT
-GCTCGTTAAGCGTGCCtgtgtcagacgctgtccaaagcactttactgaatcttcactacc
-aaccccatgtggtggctgttattagcaatcccattttacagatgaggaaactgaggcaca
-gagcggtcacacagccagggaccagcagggctggcatttgagcccagtcctcctgactGA
-TCCCTGCTGGGCAATAGGGCTGAGGAGCTCTCAGACCTGGGTTTTCCCTTGTGATGGGGG
-CTAACAGTGCCTCTCTCCCCCTAATTCCACTCTCTGCAGGGATGCCGGTATGTTTGGTGC
-CCCTGGCAGGGTTGGGAGGTGAGACTTAAGTACAAATAAATAAACAGGGAGCAGATGGTT
-GTGGGGGGAGTGGTGGTGCTGGGAGGGATAGGGCCAGGGCCTCCCACTTCTCCTTGGGAA
-AACATTTCTGGGCTGGAGCAAATGGATTCCAGACTCAGGACCTGGGAGCCCCTTCCCCAG
-GCCTGCCCTCCTGCCTGCTGGCCTCAGACCTGGCCCAGCCCTTGGgagaaatggtgggct
-ggggtcccgagtcttgggttctgcccatccctcatttctctctcttcttcctgtgtggcc
-ttgagcaagtccctttacctttctgtgcctctatttcctcatctgtcaaatgagtggaag
-gagaatgaactttatcaagtttctgttcaagggccacctcccctgggaagcctttcttga
-ttgctccaggcAGCTTCTGTTAGAGCAACAGCCTCGAGTATCAAGGAGAACATAGGTATT
-TGTGTTTTTCATTTCACAACAatccattcaacagatactttctcagggtcacctatgtgc
-ctggcacgatgccaCACTCCAGGCTGACTCGTAGTTTTTCTCTGTAGCTCcagtgctggc
-ccagagtagccactaataaacatgtgtcatgtgcatgaatGATGAGTGGGTGACTGAAAG
-GGAGCATGAGGAGCTGcagtgtttcccaaacgtggtacttgtatcttgggggtgggagtg
-gggagtggataaaagatgatacgggtgaacagcaacaagttattaaataacaataaatca
-acagtgaaaaagttattcctttttcattacctcccagtccttcttacaggccaaggagaa
-ggtctccgatgatgccaggaacgtgtttctagcacctgtggatctctctttctctctctc
-tctcccccaactcccgcaaaacccaccccaagaaggctggtcttgggctcagagcttcta
-cagacaacactatctagaatttgagaatgttgtttggtttccattttattcattttggtc
-agttaccttttatttgtgacaagggattttgatttttcctttgtTTGGACATGGCCAGTG
-GGAGTTGGAAGTGTTTGGCACTTTCTGATGAAGTGATCAGGACCAgggtggggaagaggg
-ctcgactgaaaaggggcacgagagcacttgtggggtgatggaaatgttctgtgttttgct
-tgtggtcgtagttacatggctgtgtacatttttcaaaatgcattgcacgataacacttaa
-aataggtgcattttattgtatgtaaattatacctcaaAGTTGATTTAGAAACACATATTG
-AGggctgggaatggtggcttacgcctgcaatcctagcactttgggaggccaaggtgggtg
-gatcacctgatgtcgggagttcgagaacagcctggccaacttagcaaaaccctatcttta
-ctaaaaatacaaaaaaattagccgggcgtggtggtgcatgcctgtaaccctggctactca
-ggaggccgaggcatgagaattcttgaatctgggagacagaggttgcagtgagctgagatt
-gcactactgcaccccagagcgagactctgtctcaaaaccaccaccaccaccagcaccacc
-accagcaccaccaccaccaccaccaccagcacATGTTGAGGatattaagtagataataat
-acagatggcatgtaggtgtggccaaagtcatgaaggtTGCCCACCACACGGTAAACTTTG
-TAGTCagtgaataaatggatagataggagatagaatggaggaatgcatgaatgggtaaat
-gagcaagcgaatgaatACCTATCTCatccattctacacagccccagcacattgggaggtt
-gtcctatctcaacttgcatagctcctagaatgggggaactcactaccttatgacatagcc
-ctttccacatctgaaccactaggagtgtgtaaaagacattttctcatattaagtttatct
-ttctggagatcctgtgctctctggggccccacagacacatctgcttccctgtctggggac
-agcccaaacacttgCCCTCCCCAGGCTGCCCTTCTCTGGGCCCTTCTGCCCAGATGCTTG
-GCTGCTGTGCCCACCaggtcctgcttgcacagagcttatatcctagtgggcggcaggaca
-aagaacaagcacacaggcacacaaacacaatgattccatgctatgaaggaaatgcagagt
-gagactgttgggaagagcatggcggggtgtggagaggcaaggggagtctctctaggaagg
-taatatttgagctgggacctgaagaatgcaacaaagccagaagaacaagagaaagggcat
-tccagatagaggcaagagcaagtgcaagagccctgagatcacagagcaattggaaactag
-gaagcagccagcctggctggaCATGGACATTTTGGGTATTGATGGTGAAGAGCCTGGAAT
-TGTTTTCTAAATTTGATCTCCAAACACTTTTAAGCAAGAGGTGATATGATATGACATATT
-TTAGCAGACAATGAATATTTCCTGAATTAAAATTGAAGACCCTTCTAGTTCCAATAGTTC
-CATGCTTCCCAAAGTGATACTGAAATGACTTCAGGAGAGAACAggctgggcgtggtagct
-cacatctgtaatcccaacgctttgggagggtaaggcaggaggattgctcgaggccaggag
-ttcaagaccagcattggcaacatagtgagatccccatctctacagaaataaaaataaaaa
-taaaaaaattaaggccgggcacagtggctcaagcctgtaatcccagcactttggaaggcc
-aaggtgggtggatcatgaggtcaggagttcgagaccagtctggccaacatggtgaaaccc
-catctctactaaaaatacaaaaaatttagctgggcatgttggcgtgtgcctgtaatccca
-actacttaggaggctgaggcaggagaatcacttgaacctgaaaggtggaggttgcagtga
-accgagatcacaccactgcactccagcctgggcgacagaatgagactctgttaaaaaaaa
-aaaaaaaaaaaagctggacatgatggaacatacctgtggtcctagctactcagggggctg
-aggcaggaggatcacatgagcccaggaggtcaaggctgcatgagctgtgatcttactact
-ccacctcagcctaggtgacacagccagaccttgcctcaaaaaaaaTTTTTTTTTAAAAGA
-AAAGAGACAATCATGtgatggttgccagaatggcctccagagagggcctccctaggctga
-atcctggctctgcctcatccttgccgtatgactctgggccaaggaccttgcctctttgag
-cctcagtttttacatctgcaaagtgggggtcataattgtccctgtcttattggcttgttg
-tgaggattaaatgactttatattggagaacagggcccagcatgtcaaaagtactTTCTGT
-TTGTTAAATACAATGAAAAAGGGTGAGGACATGCAGAAGCAAGATTAATCCTTTTTCAAT
-CTCTTCCAGTCCTGATTCCTGCAAGGAGAGTCAGGGTTGGTGGGGATGTGTATCTCTAAC
-ACCAGCCCAATCTGGAGGAAGTTAGTAACAAGGTTATATTTATGTTGTTTATATTTACAG
-CTACCTTTATTTGTGCCACATGATACAAtttttttttttttttgagatggagtctcactg
-tctccaggctggagggcaatggcacaatcttggctcactgaaacctccacctcctgggtt
-caagcagttctcctgcctcagccacccgagcagctgggattatgggtgctcatcaccatg
-cccggcttattctgtagttttagaagagacggggtttcaccgtgttggccaggctggtct
-tgaactcctgacctcaggtgatccacccatctcagcctcccaaagtgctgggattacagg
-cgtgagccaccgcgtctggccCAAATTTTCCATCTACCCTGGCTATTTCAAGTTTCCTTA
-TTTTTTTTTTTTAAAGTAAAACAAAAGCAAATAGATTTAGAAATTCAAGGGCCATGGTCC
-CTGAGGTAATGGCAAGCCCTCCTGTCCCAAATGGCCCAAATTGTGCAGGTGGTCATTGAG
-CCATTGATGGGACTTTAGGAAGCATGGttttatttttatttttattttttagatggagtc
-tcgctctgttgcccaagctggagtgcaatggtgcaatcttggctcactgcaaccttcacc
-tcctgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcgccc
-gccaccactcccggctgatttttgtatttttagtagagatgggatttcaccatcttggcc
-aagctggtcttgaactcctgaccttgtgatccacctgtcttggcctcccaaagtggtggg
-attacaggcatgagccaccgcgccccgccCAGAAACCTGTTTCTAAGCTCAGCACAGGGA
-ATAGCTCCTTTTTCAAGTTATGTCCTGATCCGGATCACTTCTTTCTACCCGTGTGCAATC
-CACCAAGCATCACCTGGGGCTCTGGTGACAGCAGCATCCCCTTCACCTTCTTTCTCTTCC
-TGCTCCACTCGGCAGCCAGagccagaccatgtccttcctctgctcaaagcctcacaaggc
-tcccagctcacttggagaaaaagccgaagtcctcacccagctatgaggcccctcccaagc
-tgatgaccctcacccctcctcacccctccagcctcgtcacctgcccagccacagcccttc
-tcccacctccactgaccccaccacactggcctccttgctgcttcttgaacactcactctg
-tgcaggctccagctcaggacttttgcatatgctgttccctctgcctggaacacatccctc
-tgacacccacagggcatttttcctctcattgcccaggtcaatgccccctctcagagaggc
-ccatccaccttacctaaatatttcctagctcattcttcctccctcccctgcttttccctc
-agagcatatatcactaccagacatcacattttacctttgatacatatgttgtgtgtgtca
-tcgcctgtctcccagagtggacttcaagaggacagaagtttgcgtctgttttgtactctg
-atggctccagtgcctggaatggtacTGATTTGCAGAATGAATGTCCAGGGGTGTGTGTGA
-AGGGTGGAGGGCAGTCACTCCCAGCCCTGCCCAGCCTCACTGTGGCCCCTCAGTCCCCTC
-TCCGGATATAGCTTTTCTCTCTGCCTGCCCCACCCTCTGACCCTCAAGGGCAGGCCAGGG
-CAGCAAGCTTGTCCCTTAGGAGGGAGGTTTCCAGCTGCAGGGCAGACCTTCCTCCTATAC
-CTCCATCCCAGGTAAGCCCAACTGGAGCTGCCCTCTCGTGGAGGGTACTCCAAGGATGAA
-GGGCCTTAGGGGAAGAGCCACCCTGAATGTCTCTGGGCAGCCAGGAACCTGCTCACAGCC
-TCCGCGACCTCATCGGGAAAGAGGCAAGACTCATGAGAGTGAATGGcccacggggagtta
-ctatgcttgtccccttttacagatgagaaaactgaggctcagagaggtgaaTCTGTCTCT
-AGGGCAGCTGGAgcctctgtcccctcctctgtaaaatgaggagaataactcctccctcct
-aaggttaccttgaggattaaatgagctaaataaagcctttaaacacagagctgtgtctgg
-cacataggaggtgctcaataaatgttgggtactcttGTTgttctgacaggtgaactaact
-ttccaaggtctcacagttagtaagtaacacaaacaaattcaaacccagatctgtctgaat
-ctaaagTGATTCCCAGAGGgggggcagtggctcacaccagcactttgggaggtcgaggca
-ggaggatcacttgtgcccaggggttcgggactagcctgggcaacgtgacaagacattgtt
-tgtctccgcaaaaaacttacaaaattagccaggcatggtggtacgtgcctgtggtcccag
-ttacttgggaggctgaggctggaggatggtttgagcctgggagttggagactgcaatgag
-ctgtgatcacaccactgcactccatcctgggtcagagagctagacctggtttcgaaaaaa
-agtcaaataaataaagaaaGTGACTCCTGTGCacaaccacaaaataataacaataacagc
-gacgacaacagcaacaacaCCTCCGAGCAGTAACAGCATTTTCCACTGCAGACGGCGGCG
-CTGAGGGTACAGGGATAAGATCATCCGGTGACAGGGATCATCATCCCTGCCTGGCATAGA
-AACCCGGACATCGGACCCTGCCCTCCCGCTGCTTCCGCAGGGACAGGGGGCAGCCAGCAG
-AGCCTCCCTCTGGGGGTGCCCCCCAATCTGGTTGCCTGGGACGGGGGCCCAGCGGGGGTG
-GAGTTGCCTGGGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGAGGCCCAGCGG
-GGGTGGAGTTGCCTGGGGGGGGGAGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGGTGC
-CCAGCGGGGGTGGAGTTGCCTGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGTGGGGGGA
-GGCCCAGCGggggtggagttgcctggggggggcccagcgggggtggggttgcctgggggg
-ggaggcccagcgggggtggagttgcctgggggggggaggcccagcgggggtggagttgcc
-tgggggggggtgcccagcgggggtggagttgcctggggggggcccagcgggggtggagtt
-gcctgtggtggggggccagcgggggtgaagttgcctggggggggccagcgggggtggagt
-tgcctgggggggggccagcgggggtggagttgcctgtgggggggggccagcgggggtgga
-gttgcctggggggggccagcgggggtggagttgcctggggggggCCAGCGGGGGTGGAGC
-ACCCTGGACGGCCCCGCGGAGCCCCCTGCGGGAGGCGAGGGCGGCCCTCGGGCTCTGGAA
-GGGGCCGCGCGGCCTGGAAGACATTACACGGCTGTCGGGCGGGGGGCGGCGCTCGCAGTT
-CCGGAGGGGGGTCCCGGCGGCGGACGCGCGGGGTGAGGGGACCGCCCGGCCACAGAGCGC
-GCTTTGTTCTGCGCCGCCCCCGGGAGCTGGAACCAATGGATTGGCGGCAGCTGAGGTCAT
-CTGTCAGGCGGAGCCGGGGGGTCAGGCCCGGGGAAGGGGCCGCGAGGGAGGGCGGCGCGC
-GTGGGCCGGCGGGGTGCGGGTGGacgagccgggggccctgcggcaggtggctacgctgct
-tcggtcctcagtttacccgtctgtccaacaggaaagatcatttctgccctgtccacctct
-gggggctaatgtgagagttaaaGTAGGGGAGCTACAGTGATGATGATGATGACGACGGAG
-GATGACAGCCTTCCCCTAATCGCAGTCTCTACTTCGGGTACCATAGAAGTGCTAAGTCAG
-GGGCTGGACGCAAATGTGCTTTGTAGCCTATAGTGCGTGCCTGTGTGGGAAGCGGGATGG
-ATGTTTCACCCCACCCTCTTTCAGCCCAGGGAAGTCAGTGGCTCCCCCTGATTGCCTGCC
-TTGACCCTGGGTGCCAGGCTTGGTCTGCCTTCTCCAGGGGTGATAGGTGCAGCTGCCCAA
-GCCTGAGCCCAGGAACCCATTGCAGCCTGTCCTTGGAGCCTTCTGGTCCAGGGTAGGGCG
-GGACTGGAGTGACCCAGATAGGTGGGGTTTTTTTTTCTGACTGGGGGTAGGTCAGGGTCT
-CAAGGCTCTCCTTTGCCTCCTACAAAAGGACAGCCCTttctttcatcaattcactcattc
-attcattcaCACTGCCACCTGCCTGTGCCTCACAGTTCCCATCCATGAGATAATGAGGCT
-TCTAAACATTTGATACAGGGTCCCCCAGGGAAGGAGATCATCAAATACAGGGAGGCCCAG
-AAACGGCCCAAAATGCGTGTGTGTGTATTTTTGGGGAAAGGACTCATGGCTTTCTTGTGT
-TCTCAACCACGTTCATGATCCcaaacaaggctaagaagtactggttggagtgcagggaag
-gcaaataggctcccaaactccaccggagagggtggcacttggaacaaccactttggagag
-caatttgccagggtcttagaagatggaaatgggcgtatgcatcagccaggcagctccact
-cctgggtatacagttgaaagaGCAGGGTGATGGCGGGGGCCGTTCGCAGCCGCAAATAAC
-TGTAAGCCCCCATGCTTCCATGAACATGATCACGACTAACAAACGGCTACATTCACAGCC
-TGGAACACCACGCAGCGGTGAAAAAGAATGAGATAGACTCAGCTGGAatttattcatttg
-acagatattgattaacactactatcttttaggcactgttcttagcactgaacctacagtg
-ataaacaagacagattgagtcctgccttaagaacgtacatttggccaggcacggtggctc
-acacctgtaatcccagcactttgggaggccaatatgggaggactgcttgaggccgggagt
-tgaaaatcagcctgataaacattgtgagacctcatctctacaaaagaaaaataaaaaatt
-agctgggtgtggtgacacacacctgtaatcccagctactcaggaggctaagtgggaggat
-tgcttgaacccagaagttggaggctgcagtgagccacgatggtgccactgcatactccag
-cctgggtggtagagcaagatcctgtcttaaaaaaaaaaacaaaaaaagcagacacagaag
-aaaatttgggagagtgtgacaaatgccatgaagaaaataaaactggataaagggacggaa
-tgatgggggagggggctgttttagacgctatggttgggaaggcccctgaagaagtgacat
-ttgggcacagaccagaatgagggagactgggagacaggcacgCACGAATGGGATGGACGG
-CTGGGGCACAGTGCCAAGGGAGAAAAGCAATCCACAAAACAGCGCAAAAAAAGAAAACAT
-TTTTTACTTAAACGCACATTCATTACTATTAAATTAGATAAGAGTCTGGGAGGCTCTATG
-CCAAATTCATAAAGGTAACTGTCCCAAGAGGGCAAAGGAATAATCAGGACTAGGTTTTGT
-GGTGGGCTTCCGCTTGCCTCTAATACtttaaatttctaatatttaattatttaacatttt
-aatattttaatGTTTAAACGGTAAATATggctgaatgcagtggctcatgcctgtaatatc
-atactttgggaggccaaggcgggaggatcacttgaggccaggagttggagaccaaccacc
-ccaggcaacagagcaagacctggtctctataaaacgttaaaaacaaaattagctgggtgt
-ggtggtgcctgtagtcctagctactcgggaggctgaggcaggaggatggcttgagcccag
-gagtttgaggttgcagtgagctataatcagaacattgcgtgccagctttggtaacagagc
-aaaaccccatcacaaacaaacgaacaaaCACATTTTAAAAAGTAAATATACTTATATAAA
-ACTTGTGAAATggctgggcatggtggctcacacctgtaatcccagtgcctcgggaggccg
-aggcggacagatcacctgaggccaagagttcaaggtcagcctggccaacatggtgaaacc
-ccatttctactaaaacaacaacaaCAAAAAGCCTTGTGAAATGAAAACAAAAAAAAAAAA
-AAAAAGGAAATTTAAATCTACCACGGTCAAGTGGGTGGGTTCCAGGGCGGTGAAGGCACA
-TACTGCCTTTCACTGGAGCCAAGTTCCTGGGGGCAGAGGTTTTTTTGGGGAGGGACACTG
-TAGGTCATGGtagcccagccagtaggagcccagaagcttcttggaggaggtaccaccttt
-gctgagcctgaGATTCTCTGGCCCAGCACCCCCAGTATAGACAGGAATGGGTAGACATGT
-GCGCAAGGTTACAGAACAAGAGCTGATAAATAGAACCTGAACTCCAGACTCATCCCGGCT
-GAACCCGGGTTAACTATCCCGCCTCTTTCAGCCCTGCGCGTGCATCCAGCCCCTTCCCAC
-AGCTGTAGCTCTTGCAGGCCAGAGGGACGGCCCTGCCGCGGGGGCCGGAGAGCAGCGCCA
-CCTGCTGCTGTAAGAGGGAAACGCAACTTCCGGCTACCAGCAGGTTACACCCTTTAAAAC
-CCAGCTCCTCTTCCTTAAATGATCAAGCAGTACCCCTCTACTCCGAATCTGTTCTGCACC
-TCCTTCGCAGTGCCTGGCAGGGCCCTTAGCGCTGTCTGGTTGGGTCTTCTCTGCAAGAAG
-GAAAAGTTGTTTCAGGAGGGGGCGACCATCTTCACTCTCATTCCAGCCCAGCGGGCACAG
-GAGGAGTTTACTCACAGAAGACAGGGGcacctcaccttcgctacaaaccttaggggtaca
-caatccatttgacagcctggaagaagtccccagggaagggacagaaccgcccaaggtcac
-acagttaatgagtagacaagctgggGGGAATGAGTAGACTCATTCCACTGGGGATGGAAG
-TGGGGAAGTCACCGTATTTGAAAATAACTGACGCAGTTATTagcagctcttagcatgtgg
-tccctgaacagcagcatcagcaacatctgggaacttgttagaaaagcaaattatcaggcc
-ctgccccaactcgcctcaatcagaaactctggggggccgggggcagtggccatgtctgta
-atcccagcactttgggaagctgaggcgggagaatcgcttgtgcccaggagtttaggacca
-gcccagagaacacagcaaaaccctgtctctacaaaaaaatgagaagggcgcacctgtagt
-cccagctactcaggaggttgacgtgggaggatcacttaagccccgggaggtcaaggctgc
-agtgagtcatgatcgtgccactgcactccagcctgggtgacagggcatgaccctgtctca
-aaaaaaaaagaaagtgggggtggggcccagcaatctggtatttagcaaacAAGCTTGAGA
-CCCTGAACCATTGGTCTAAAGGAATTGCACACCCCCCCTTTTTTTTTTTAAAttaaataa
-acttttattttggaatgatactagatttacagagaagttgcagagatagtacaaagagtt
-cctgtatacccttcacccagcctaccccaaggtcaacatcttacatcaccatggtacatc
-tgtcaaaaccaagagactgaaattggtatattaactaaaattcagacttttttcagattt
-ccaattttcccactaatgtcctgtttttgttccaagacccaatccaggatgccacattgc
-actGAAGACACTCTCCCTTTTCAATTCTATTACTGGTCACCTCAGTCAACTTTCCCGGGG
-AAAGAGAATGCATGGGAAAAGCTCTTGTCCTTATTATTGAACTGGAGAAACTGAGGCTTA
-AAAGTGCCGAGTGACCAAGTTCCCTTAGAGGGCAGTGAGAACAAGGCCTGCCTTACTCTG
-TTCCCTTTCCCCAGGGACTCTTGGTTTTCAGAAGCCCCTCTGGAATGTCCTACCTGGCCT
-AACCCCATACCAGCAGTGCAGACAAGGAGGCACTCCTACTACAGTGGGTCCAGCCCATGG
-AGAGACTCACTTCCTGCCCCAACACCTCTTCCCCTAGACCCTGAGGGCCAGGACAATGTC
-TTAGTGCCTTCCAACTTGGCAGAGTGAGGCCCCATGAGACAGAGAGAAAGGGGGAAGAGG
-GAAATACCTTTATCCAAATAAATACCCATCCAAAATTATTTGTGATAGGTGAAAAATGGC
-CACAAGCTctttgtggttcccctcatcaagacatgtagtctgtttctcatcccttgaatc
-tgggtaaagccttgtgatttgctctgaccaaaagaacttagcagaagtgacactgtccta
-gtcccagttccaggccaagaactcaagaagtctttcagcttctactctcactctctttgg
-aatcctgaagccatcatgtgaataagcctgagctagcctgctggagaggccacatggagg
-agaaccaagcaattccagccaacagcctgtcacctgccaggcaagtgagtaaggctatcc
-tagaccatccaggcccagctgaggtaacagctgaccttagctccatgagggatcccaggt
-gtgagcagcagaactgccctgttgagcccagcccaaattgccaacccataggattgtggg
-aaaatacagggtttgtttctagctgccaagtttggggatggtttgttacacagcaaaagc
-taactggtacaCAattctgcatttctctcttggtaatgggatcccagttttattgcagga
-ggcagtgtgccagtctcagtagatggaacacgattggtctattcagccatgacaattctg
-ttccctgctgtcttagctttgtttgcagctagaggtgcaatggtagctggctcgggccaa
-gggcatctaagtgaagatatgcagagggagagagcaggaaacagacttctgacgaggttt
-tactttctgatagaaggtgacgggtccagctagtttggcccttcctcttcctccacccct
-ccttccttgaacgcagacatgattcttggggatacagcagccatcttgggaccatgaagt
-aacgagcactgagattaaggcaaaaggatccaagacgtgacccctaccttcgtggagttg
-ttgaaccaataccattagccacccatctccagaatccatgctatgtggaaaaacaatctt
-ctgtttgtttaaaccactgcaatcaaggttttcctttccttgcagctgaatgtagtccAT
-ATAAGAGGTTACATAGACAAAAATGCAGAGGGATCCTTGTCCTTGGGAATTTGGAGCCGG
-CAGCACGTGgctcttcaagcccatctctgttctccttctcggtaatgcttcaagggtaag
-gccatgatcctattgtcacagaggtgggaactggggctcccacactgtacagtgagtcca
-aggccttgtagctggtgagaggggtgcccagagtcagacccTCTCGCCAGGTGCAAAGAG
-AATGCACCCCTGCTATCCCTTCTGCATGGCCCAGCCTGCTGGAGGCCAGGTGTGTCTTCT
-GGGCTCTTGAAGGTGGCAGCAGGTGCCAAGGAGGCTGCTACTGCAAGTCTGGTGTGGATG
-CTCCCAGGTACACCCTTAGGTCTGAGAGAGTGGACTGGACAAGCTTGGCGGGGATGGTCT
-CTCGCTGCAGTTGCTGGTAGGCCGCGTAGCGGTGGCAGCCCCCAAAGGAGTAGAAGTAGT
-CACCTCCCTGGGCCCCTTTGATCCAGAGGACATCGATGGGGGGCACGCTGTCTGGGTCCT
-CCTGGGGAGAAGAGGCACAGAGTCAATGGACATGGTACAAGGCTTGAGAGTTTGTAAAGC
-AGACTTTGTCCACTTGTGCTGAGCTCCTTATAAGGTGATCACACTGGACTACTGTGAGAG
-ACAACTGTTAATTATCAGGAATTTTGTGAGCTGTTCgacatcaccttgtagcttgaaaat
-cagccatgggagagtatttacaccagagaaatggacagatgctacaaatcagggatttct
-cccacacatgtatcagcacaccacATGCACactatccagctggccctgttgtagaccctg
-ggaatacggtacagctggaatgtgactgaatcaggccctggcttcaaggggctccagtct
-agtggggcagatggaacaagaagtaaatattagagtgacaaatgctataatgacaataac
-acaggtgacaggacagagatgggGTCCACGAGGCCTCTCTGAGGTAAGAATGAAGCAGAG
-TACTTGGAAAGATAGAGAAGTGGggccgggcacggtggctcatgcctgtaatcccagaac
-tttgggaggccgaggcgggtggatcacctgaggtcaggagtttgagaccagcctggccaa
-aatggcacaaccctgtctctactaaaaatacaaaaattagctgggcatggtggtgtatgc
-ctgtaatcacagttactcaggaggctgaggcaggagaatcacttgaacccaggaggcgga
-ggttgcagtgagctgagatcgcaccattgcactccagcctcggcgatggaacgagaatcc
-atctcaaaaaaaaaaaaaaaagagagaaGTGGAATAGTTTCGATTAAgagctcaactgcc
-tgggttcaaatctagctctgctgcttaacagctatgtgatcttgggcaattcatcttttt
-gtgcctcagttgccccatctatcaaattggatggagataacagatccatctcatagaatt
-tttgggttaaatgggttaatatatataaagcacttcaaaccatgcttggcacacggaaag
-tgctcagtaatgtatgctgtgtatGACCTgagggaagaacgttccatgcaaagggaacag
-caaacgcaaaggacttgaaaccagagcacgttcactgtgtaggaggcacagcaaggagtt
-cactagagtggactccagggctccaggaatggtcagaaaggccagcaggagccagatggt
-gcaggtctgcttctgagagcagtgggtgggccctggagtgttggcaacaggggagggtga
-catgatctgatgcatgttctagaaagttgtcacaggagaacagacttggcagggtggaca
-gggcacagggctggaaggcagaggggaggcctctgcaggtattcagcagaagatgctggt
-ctggatgatggtgtggtggggacagggagaggtagacaggtttgggacacatttacgggg
-caggcccaaggggtctggcagaaggggtgaatccaagggcaagagaaaagggagaatcta
-agttgacttcctgttaggggcccacacagccaggtggagagtaggtcatcctctaaacag
-ggaaagtctggggcaggacgggtgcagggtagagCACTCTGGGGAGACCCCATTAAGTGT
-GAGCGGCGTGGAAGGCCTCCTGCTGCTGGTCCACGGGTTCTCTCTCATGATTCCACAAAT
-GATTATTCAgcagtaaggtgcagcagtcacaagcctgagctctggaacctggcacacctg
-actttggatctcagctcctctccacagcagctggggcacacagccctctgaacaccattc
-ctcacctgtaaactgggaataaaacatcctagagggctgctgatgaagagtcagtgagct
-gatgcCTACCGGGCATTAGTGGAGCACTAAGGAGGGCAGCCGTGCCAGGCAGGCCTTGTG
-CCGGGTACTGGAGGCACGATGGTGgatggccagaatgatggctcccaaagatgtccacgc
-ccgaatgcttctgaatgtgttaccttacatgggagaagggacttggcagacagaattaag
-gtaaggatcctgagatgcggaaattatccaaggttatctagatgggtcgaatgccattat
-cagggtccttaaaactggaagaggaagtagaggaagaggtcagagtgatgcgatgtgaga
-aggccttggcctgatgttgctggctttgaagacagaggaagaggccataagccaagcagt
-gtgggtggcgtctggaagctgggaaaggcgaggaaatggattctcccctagagcctacag
-aaagtagtgcagccctgcttggtgttagcccagtaagacccattttggacttctgaccat
-aaataaacctgtgttgttttaagccatcaactttgtggtaacttacagtggccccagaaa
-actaatacaGGTGTATGTAAGCAAAGGCAGAGCTGGTTCTGGCCCTCAGAGCCTACGGTT
-CTAGCACGGAAGGCAGGTGTCTAGACAGGACGTTAAAAGCCAGTGGGctgtaatcccagc
-actttgggaggccgaggtgggcagatcgcttgaggtctggagtttcagaccagcctggcc
-aacagggtgaaaccccatctctactaaaaatacaaaaattagccaggcgtggtggtgggc
-gcctgtaatcccagctacttgggaggctgaggcaggagaatggcttgaacccgggaggcg
-gaggttgcagtgagccaagatcgtgccactgcactccagccagggtgacagacccagaca
-acgtcttaaaaaaaaaaaaaaaaaGCCAGTGAGATCAGAGCTATGCAGGTGGGCACACAG
-GTGGCTGCAGGCCCACAGAAGCTCCTAACCCGGTAGGGATGGTCAGGGAAGATCCTGACA
-CTGAGACAGGAAGACCGAGAAAGAGTGAGAAACGACAAGGCAGAGATAGAAGAGGTTCTC
-AACGGGAGAAAAAGCCCAGTGGTGGGACAGGGCATGCATGGCAGATCCCTTCCCATCTCA
-gccaggcgccgtgctactattgtggcaacagataagatgggacgaggtcctcgcccttgt
-ggagtgcacgtgaggtcaggaagacagaaaataaaatgcaacacaaatagatgtataata
-taatttctggtggacataagtggtatcctgaaaaacatctcgggctaaggggagagctag
-agaggccagtgactctgaccaagggtgatcaaggaggcagagagctgaaccaggcagggg
-agcaggccctgtggttgtctggggaagtggctccaggcagtgaggacactagtgtaaaTA
-CTAGGACTGAAAGTTATCGGGGGTGGCTGTAGAGGTGCTGGGTGGGGCTTAGGGATCTCA
-TGTGCTCACCTTCCAAGGGTCGGGGGAAGGGGACACAACGTTATGTAGGCCTAACCTGAC
-ACCTGTTCTTGCGGGGCCCCCAAGTTCCTGCCAGAATCACTCCGGTATTCTTAACACCCT
-TCCTCAGTGGTGGAGCTGACCCTTGACCTCTCCCACTTCCCATTCAGACAAGGGCCTCCC
-AGCAGATATGACACACCTAGTCCCACTGTCACTGACTGTCACAGCCATGAGAGCCCACGG
-CTTATCTCCGGgtagtgcggtggccatgtgctgggcagtggggcccaggctgcctgggtg
-tgaattccagccgtgtcactttttaagcgcctgatcttagtcaagccgctgaaatcttcc
-ctgcctcagttctcgtctgcaaaagagccactatctacctcctagggttggcataggaaa
-ctgagggacttcctgcagttcctggaccactgcaagcactAGCGTTATAAGCGTTATCAT
-CACTactttaattatctcgcccaattccctccttgctcaagtgaggaaacagaggcccag
-agaggcccagctacttgctcaaggtcacacagcagaggctgagctccggctgggcccgga
-accagtccgtctcgcgtccaTCGCAGCGACCTCCCTCCTCCGGCAACCTCCCTCCTCCGA
-AGCCCTCCCTCCGGTTGGCTGGACTCCCCGAGGCCTCACCCGGATCGTGTCCACGAGGCT
-CTGCACCTTGGCGGGGTCCAACACGGACGGCAGCGGCCGGATGAGCACGCTCAGCGGCAC
-GTTGTGCACCGCGGCGATGCGGCCCGAGTGGATGCTgccgccctgcgcgccgccgctcgg
-cccgggcccctcgggcgccccccgacccgcgccggcccTGCCCAGCGTTCCTCCTGCACG
-CAGCCCCATCGTCGCCGCCGCCGCGGGACTCGCCGCCTCCCCCCGGCCTTAACTCCGGCC
-GGGCCATACCATTccgcgcggccgggggggggggcccgTGCCAGGGCAGCGCGCGTTTCT
-CCCCCGACCCCGCCGCGGTCCGGCCTCGACCCCGCGGTCCCCAGCCCGACTCCGGCTCCG
-CTCGCCAGGTGCCGCCAGACTCGCGCGGGGCTCAGGCTCTCCACCGGGGGGCGCCTCTCG
-CCTCCCCTGCGCCGCGCGGCGTCCGGGGAGTGGAAACGCCCGGGCGGGCTGACTCAGGGT
-GAGTTTGCAGGTCGCGGGGCGGGAGGGGCGCGGGTGACGCACCGGCCGGGCCGACTTAgg
-ccgcgggggcgggggcgggggAGAGCGCGGCGGACCTGCCCAGCCAGGGTGAGTCGGCAA
-AGCCCGCGGTGCGCTGCTGCCCCGCTGCTGGGGTTCCTAGCCAGCGAGGTTATGATCCCC
-ACCAGCGGTTCCACTTCCAGTCTGGCGCCGGCtgtgtctggagtcgttccgaacattttg
-cacgtgtattaacgtatctgaacctcaaaacaaccctgcaaggaaggtatgactgttatt
-cccattttacagaagaggagactgagacacaggtttaagtgatgtacccaagatcacgga
-actagtaagtggccgaatccgcgttcaaatccagacggtctggctccagagtccgccttc
-tACCCCACCGTTGGCTGCCTTGGTTCAGCAACAGTGACTGTCACACGGAGCCCTCAGGAG
-TCGCGCTGACAATGGGTGGGCCCTGCCTTCAAGTTCCACACTGTCTGTTTGTGTCATTAC
-AACACTACTGGAAGTAGGTGCAGTTATAGACCCGCTGTTCAAGGTCAGCTGAAATGAAAG
-TCAGGTCACACGAGTCCAAACTGTGGGGCCACTTAACCACCAACTCCAAGCAGGAAGGTG
-GACGATCCCAGACTCGGTCGAAGACAAGCATGTCTGGTTTGCTTGTCTTCCTTCTCAACC
-TGAATGGCACGAACATGGAGAAATGCATACTTACCCTGCCAGCTGGAGAAAACTGGAGAC
-GAAGGAGGGAGCCAGGAGTTTCTACTTTGccttccaccagttgctgacactttctgaacc
-ccgtctgtaaaatgaagtcatgctgcccatcactcaaagttgtgtgaattgagagagtgc
-tcatagtgctctgtgaattgcataacaTCCATTTTGCTGTTGAAGATCATTTATTTTGGG
-TTCTTAGTCTCTCACAAAACCTTAGAACACTGACACCAAGACTCCAGCCTTTCCCTTTCG
-AAACATAATTCCCGTGCGCACCTAAATGATACTTTATTTCAAGAAGTAGAACTGACACCC
-ACACCTCAGCCCCAGAATTATTCAGAATTAGAGAATTTCATCAAGAGGGAAGTTATCCCT
-TCTAAAACATCTTCCTCATTACAGGAAGTAAGAATGGCAGGATAACAGTTTCTAGAGTGG
-AAAAGTGGAGCTCTGGCCTGATTCTATCATCATGGTGTACCCAGGGAGGCCTCATTTCCT
-GGTATCAAATTCTCTGTGTTAAGATATCTATGGcccaattcaaaatggcttaagcaataa
-gaaggtttgttttctcacataataaaatgtttggaggtaggtatgtccaaggttggtaaa
-gaggcagttgaacaatgtgaccaaagactccagttctggctgggcccggtggctcacacc
-tgtaatcccagcactttggaaggctgaggcaggcgaatcacttgaggccaggagttcgag
-accagcctagccaacatagtgaaaccctgtctctaccaaaagtacaaaaattaggcaggc
-atggtggcgcgcgcctgtagtcccagttactccagaggctgagacaggagaattgcttga
-aaccgagaggcagaggttgcagtgagctgagatcatgccgttgcactacagcctgggtga
-gagagtgagactctctcagaaaaaaaagaccctggttctgtctatccttttgtgccatca
-tccttggtgttctgttatcctgcggtgtgcccctcatggtcccaagatggctactgtagc
-tcaaaacatcacatcattacatgcgaatgtccacaagtggaagttaggacatcccttcga
-gcctctttttaagagtgaagaaaccttcccTGGCTGGATGCAGTGGctcacaccttctga
-ccttccactcctcaagccccggagtcaactctagtcacactggcctccttgctgtgcctc
-ttccacagcgaatgtgtcctggcctcagaccctttacatttgctgttccctgtgcatgga
-acgctcttccctcaggtCATACatagcatacattactgagtgctctccatgtgcccagca
-tggtttgatgcgctttacatatattaactcatggaacctaacagctttatgagacgagtc
-tgttatctccatccccatttgatagatggggCATCCCTGTGGGAGCTCTGCCCATTCCAG
-AGGTGCCAGGCCATTCACTAATGGGGGCAGGAGCCGGTGAGTAAATGCCAGTCTTGTGCT
-GTCACAGGTGGACGATTCAGAGAGGTGTTCTAGACCATTCAGATCTTTCTGGAACCTTCT
-CAGAGACCAGAAGTACTCAGCCCTATTGCTACAACTGACTTCACTAACACACCctctgtc
-ccattcctcccaccccttacttctgcttccagggatcacctcccacataaacgacttaca
-ctcaagtctcagacttgctatcagggaaccaaaactaaaacaAAAGGGAAACTTGATACT
-GGGTCATCCCCTATAGTTCTGTACCTtgcctgggttaaaattgcactattttattagatg
-tgtgaccttgggccagtcacctgtctgtgcctgtttcctaatctgtaaaacggacataat
-gtcacctaattcacaggggtgttggaagagtgaagagagatggtgttaggtgaggtcctt
-aaaacagtgcacaacgcattataagtgctcaataaatgtttgctgttTGATTGCATTTTA
-AATTGTAACAGAGCTTGAACGTCTCTCCGTGTCTTCACTTTCAGACTAGGCTTGAtgtat
-tagtcaagacttttgtttgcaagtgacagaaagccaaagtgaattagcttaatgaaaatg
-gggatgcttggctattcccgtgactgaGGTGAAGCGGAGCCTCAGGGGAAAGTAAGTTGA
-GAGATTTCTTTTCTCTGCCCTCACTCAGCAGAGGGATTATCTCTACATGTCAGGAACATG
-ACTGTCAACAGCgatgatatttggctttaaataagggaaacctgacaacagagacttcat
-acaacttaaagtgtttcctctttaaaaaaaaaaacagtcgaggtaggaagtccatggctg
-ggatggctgctccatggtcactagtggcataggccctttctatcttgccgctccatcatt
-ttccagcagagttttcattctcagggtcacctcctattcaggattgctgctgaagtgcca
-gccgtctcatccaaattccaccctggaaagaggtggagaaatggaaaggcaaaggatatg
-acccctccccttttgaggatgctatctcagaagttttgtataacacttccccttgcatgt
-cattgactagaaattggtcacacggccacccctggctgcaagggcagctggatatgttgt
-cttcatccgtagcggtaatgtgctgagctaaaactggagttctcttactaaggaagaata
-gagattgataagtagctagcaatcggggccacaGCTCTCAAGTTACAGGCCTTATGGCAC
-AGAGACAGGGAGAGAGAGAAAATTTCCAAGTTCTAGTCAGATGCCTACATATGGACAAGC
-CAGCTATGGCATTGGGGGACACAGACTTTCTTAAAAGCATAAGCCACCATTATTTATTAT
-AATGACTTAAAGGTAAGGAGttcatttaaagataattactggtcacctgctattggctag
-gctagacccaggggatttagtgatcagcaaaaagacactaccaatctctgcattatgagg
-cttacagtgtagtggaggattcagataatgaccaaataatcacactggttaatggaaagt
-atacattggtagtgggtgctgcaaaagaaTGGCATGTGGTTCTGAGGAAGtgttttagtc
-ctttttggctgccatagcaataccatagactgggtggtttataaacaacagaactttgtc
-tcttacagttttaggggctgagaaatccaagatcaaggtgACtttgtatctccccaacat
-tcatatgttgaaatcccaacctccaggtgatggtgttgggaggtgggcctttgggaagtg
-attatgtcacggggttcatgggggtagagccctcatgaatgagattagtgtcctttttct
-ttcttttgagacagggtctcactttgtcacccaggctggagtgcagtagaactgtaaaga
-aaacttctaatttttaaaatcaggaacctgataataactaaggaatcctgaacagagtgt
-tggtagaaatacagatgaaaaaggccatttggatgaggaaatgaggaagatattattgga
-caatggaaaaaaggccatgttgttataaaatggcaaagaacttggctgaattatgtccac
-gttctagtgttttataggaggtagaacttgtgagcaatgaaacggaatatttagctaaag
-ctatttctaagcaaagtgttgaagctgtggcttggctcctcctgactgcttatagtaaaa
-tagaagcagaaagaaatgagttaaagatgtgacttttaagcgaataggaagcaaaacgta
-aagatttgaaaaattttcagcctatccatattgcaaagaatgagaaagaatgtttgggag
-aaaacaccaTAGTCTCCATAAGGAGACTGTAATGGTGATGAACGTAATCAGCCatcccag
-caggaaaactgccgtcttgaattgaaggggaaggagatgggaagggatgaggaaggaAAG
-CTGTCTGACTTCTTGGATTTTTCAGGACAAGACCAGAGTGCAAactcttcaagacaaggg
-aagaatgaccctgaaggcaattcagagatcatcaaggctatctcCTTGCTTTCAAAAGTC
-GGGAGCATTGCCTTGCATTCAGCAGGTTAGAGGGCCTCTGTCCAAAGCCATGGAGGAAGA
-GCTGCCCAGAGCTGTTGGTGTGGGGCTACCCAGAGCCCTGGGAACATGACTTCTGCGGGA
-TAGAGCTGGAGGGACAGGACCACCACCCCAGAGGGTACAGAGGGTGGGACCACCACCATT
-GTGGATCTGGAAGGCTGcctcagtgggcctggaagcagagcatttaatgaactaaaaatg
-atttttcttgagccttaagatctcatggagtttgccttgtagtttggatgtaatttggat
-ctgctattcctttcttctttcctatttctcccttttggaatggtctatcctatgcctgtc
-tcaccattgtattttggaagcagataacttgcttgatttcacaggctcaccgctggagaa
-caatttgccccaggatgcatcacaccttgagtctcagccatatctgacttagatgacact
-tagataataaaactttggattttagacttcagagttaatgctggaatgagttaaggcttt
-tggggctgttggaatgtaaggaatgaatgtattttgcatgtgagaaggatgtgaatttgg
-cggggGATGGGGACGGAGGCAGAAtgctatagactgaatgtttgtgttcctccaaaattc
-atgttaaaatcctaacccccagtatgatggtattaggaggtgggcttttgggaggCACGT
-TAAGGCCAGTTCATTTCATGGTCACAAGATGACATGCTTTTCTGTTCACACTGGAGGGGA
-AGAGGAACTGGACTTCCTTTCCTCTTAAGAAAAAGGAagcagcaaagttttccataccct
-tccagcaaccctctccttaagtctcattggccagaattgggtcatgtgcccatttctgaa
-cGATGGGAGATGTTAGTATTAGACCAGTAAAGACTACCTCTTAAGCTGATGTTCAGTCCC
-CAGATTGCGTGGTTGCTAATCCAGGAGAGAGGGGTGGGGTGGAATGGTTATTGGACCCAC
-ATAACTGGGCTGGATATGGCTGATGGAGACCCAGCATTCTTTCCCACCTCCCTCTAGGGT
-GCCTTCTAGATTGCCTAGTTGGAGAGTTAAAAACTCTATTTCTCAGATCTCTTTGCAGCA
-AAGATACTAACAGGGAATTAAGTTCTACCAGTTAGATGTACTTTCATGAGACATGGATGG
-CAGAGGTGGGCCGGGGCCATCTTCCATCTTTTGACTCTTGCTACTGTCAAGATTGTCTTG
-GAGGTGTTAAGATTTTCTGTAGCAGTGTTCCAGCATTGTGCCACCAGCACAGTGGGAGAC
-AGGAGATAGTTATAGAGGCAGTGGCAAGGGCCTGCTGATCCCTGGCTTGCACCTATGATG
-CGGTGTTCTGTATCTCAATAGTTCCAGGGCACCTTATTGACCACCACCAACCCCCACTCC
-GCACCCTCTCCCACCACTGACTGTGGAAGAGGCAGGTGCTGTCTCAGTGGCAGCAGTTCT
-GCAGTGGGGTTCTGGGGTCCAGCAGATGGCTCACTTCAGCCCTTACACAAATTTTGTCAG
-CAGCCAATTATTGAAGTATTAAATCCTTTCTCCTTCAAAGGAATTTAATACTTGTTTATA
-AAATCCTGTCTAGAGTGGTTTCTGTTCCTGGCACCTAAAACAAACATAATGGATCCAACA
-GCCAGTCACGGGCAGTGTATGTGGGTGGTTAAGGGATGCAGCAGATGCCTGGGTTTCTCA
-AAACCCCACTGGcgaggcgggcagatcacttgaggcaaggagttcgagaccagcctggcc
-aacatggcaaaaacctgtctctactaaaaatacaaaaattggctggacgcgggggctcac
-gcctgtaatcccagaacttggagaggccgaggcgcgcggatcacaaggtcaagagatcga
-gacaatcctggccaacatggtgaaaccctgtctctaccaaaaatagaaaaattagctggg
-catggtggcacatgcctgtagtcccagctacttgggaggctgaggcaggagaattgcctg
-aacccaggaggcggaggttgcagtgagccaagctcacaccactgcagcctggcaaggcag
-cgagactccatctcaaaaaaaaaaaaaaaaaaccaaaaacaaattagccgggcgtggtgg
-cacatgcctgtaattccagctacttgggaggctgaggcaggagaactgcttgaacccaga
-aggcagaagttgcagtgagctgagattgcgtcactgcactccagcctgggtgacacagca
-agactctgtctcaaaaaaaaaaacaacaagaaaCCACTGGAGATTTTGCAGAGTTGTGGG
-GAGGTTCCCACAACTGCTGCTGTCAAAAACAGCTAGCACATTGCTCAGGATGCAGCTGCT
-TGTCCAGAGGGGTGTGAAGGGAAGGCGGACAGGCACCAGGGAGGCAGTCTACAAACTGAG
-TGCACTGCTTACACAGGAGGAAACTGACAAAGAGGCCCCAGAGGAGGCAGATTCTAGCCT
-GCAGCTTCCCCATCCCTCAAAGCATGCAGGTTATGCTTCTTGGTAAGTCTGAGTTGAGGG
-TAGGTGGCAGGGGTTGGTGGTCCCCAGTGAAGTTTTTAGTAAGGTGAGACAGATTTGTAT
-CTTGAAGGATCACTAAGGCAGCTATCGAGGATGATGGATTGGTTGCcttgaacacttttg
-gtgacaggcagctcagaagctctaggggcaagtcactgtttttggacaactttccagctg
-agccaaagtcaacctttttgcctgcttccactcactgaATATGTGACCATATATGACTAG
-GCAGAGCAGTAGGGGGTGAACTGGGGAAGATTATAGGGGTTGTAAACTGGCTGTCAACAG
-ACACATGTGGACCACAGTTTTAACTGTTTGGTGGGTGTAGTTAATTTGAATCCTATTTCT
-CTAAGGTGAGACACTCTTTCCAATTAGTCACAGGCTTCACCTTCCCTAATGTCTTAAGGC
-AACTGGCTTCACTCACATGTTATTAATCTGGTTTTTAAACCCTTATTTGAGGAGTATTAA
-GGATTGAGGATGCCTGAGAACTTGTAAATGCCAAGGGACCCTTGGGGCTGTGTGACCCTT
-GGTGGCAGCTACAGGCTGGTCAGGCTACAGAGAGGAAAATGGAGTGGAAAAGTAGTATCT
-CTCAGATGCCCTCCCCTTCGTCTCATTCCCCCCCTTCATCCCCACCCCTTGCTCCAATCA
-GAAGGTCTAGAGGCGATGGTGAGTGGCCAAAGTCCCTTTAATATCCCTGAATTGCGTTAC
-AAGTAATACTGCTGGAGGTGGGGAAGGGATGGGGGTTTGGGGGTGAGTTGGGATAGGACG
-GAGGAGGAGCGCCAAGCGCTCATACAAAATATGGCCAAAAGGCTTAGCATGCATGGAAAA
-TTATTGCTGTCAGAAGTTGCTATTTACAGGGTCAACGCCTCCATAATTGCTTCTGCTACC
-CCTCTCCCTCCCACCATCCCTGCAGCCTCCCTTCCCGCTGGGCCTGGAGCTGAGCAAAGG
-CCCATTCACCCCTCTGGAGCCCTAGGGAAGTGCCCCTGCTGCAGGGGTGCCTCCAGTCTC
-CCCCCTCTTTTGTGGCTAAGAGGAGGGGAGAGGAGGATCTGAGAGTCCAGGACTCCTGCC
-CCCAAGCTGGCTGCAGAGCAATGGGGCAGAGGCGTGTGCTTAAAGCGGAGGGGGCCAGGG
-CCCGTGCGCGTGGAGGTGTGTGCTTCGGTCCTCGCCCGGGCATGCAAAAGCGCAGCGGAG
-GAGGTAGTGGCGGCCAACGGGCGGGTGGCTGGCAGCCCGGCCCCTCTGTCCGGGAGAGTT
-GCATAGACATGGCCGGGAGAGAGCGCCCCTCCCGGGGAGCAGGCCAGAGGCCCCAGCGGG
-TCCGGGGCTCAGTCGGTCCCTGGAACCTGGGGTCCCTCGGGAAGAAGAATAAACAGGAAA
-CAAATCGAAGAGGCTCCTCTCTCCGGGCCGCCTGGAGTGGCAGGGGAAGGTTCAGGAAGG
-TGGGGACCTGCCCCACGCCTGGACCTCCTGATGCTCCCTCACCCCCCCAGTTGAGGGTCA
-GCAAGCTGCCCCCCCATTCTCGAGTCCCCTTCCTTAGCGAGTGCAGGCTCTGAAGAGGGT
-GGGTTTCTCCCGAGACGCGGGGGTGTGTGTGGTGGGGGCAGCCCTCTGTGGCCTGTGCTG
-TCCCTCTCCTTGCCTGGCTTCCTGACCTCCCAGTCCAGCTGGGGAAGCCAGACGGTCCCT
-GGGTGAGGCCAAGAGATtaaatagaataataaatagataaataaataaatacacaaataa
-ataaCTGGAAGGACCCAGCCGGATGGGGGAAGGGCATTGGCGAGGTGCTCCAGACCTCCC
-CCCAACAAGTAAGGAAGGGGATCTGTGGCCCTGGGGATGGGGGAAAGTGCTCAGAGAATC
-TGGGGGTAGGGCAGCTCCAGACTGTGGAAGCCCAGGTTGTGCCGGGGTGAGAGAGGGGTT
-ACATTAGGGGGCAGGGCCCTGAAGTGCCCCTCAAGCCCCCTCCAGGTTAGGTAGACTCAG
-AGGGGTGAGAGCTGCTAGAGAGGTGAGGGCAGCTGGAGCTGGGGCTGGGAGTGGGTGATG
-AGATCCCCATGGACTGAAGACAGTAGGAACTGTGTGTGGGAGTGGGGTGTGGGGGTGTGT
-GTGTGTGTGAATGGCCAGACCTAAGGCCTGAGCATGGATGGGATCAGGGACAGATCGGAG
-ACTTCAAGAAGGGTGAAGATTAGATCCCCAGATGGACACACTCTGGGAGATTCAGCAGAG
-GCCAGAGGGATGGTCTGGGGTTGGACTGTGGTCTCAGGGCGGCAGGGCCTGCGTCCAGGT
-GTGGATGGGGAAACTGAGGCAGGTATGGGCGTCAAGGGTATAGGTTTGCGGCTTTCATTG
-GGGGCTCCAGTAGAGGAATGGTCAGAGAGATTCAGCTGAGAAGCGAGAGAAAAGATCTAG
-AAGTTAGAAGAGCAGCGCGGGGTCTGGGAGGGAGAAATTTCCGGCTCTGGGGCGCGGGAG
-AGGTGCGGACCTGGTGCCTGAGTTGGGAGCCTTGAAGGCGCGGACAGGGGGGTCAAGGTC
-CGAGGGATGGCCGGAAAGGATGAAGTGGGTCGGGGGACGCTGGGGAAGACGGTGTGGAAG
-TGAGTCGTGGGTTTGGGGGTTGGGGAGAAAAGTTCCGGGCCGGGCCGGGGGTCCCCACGA
-GAGGGTCATGGGCAGGGAAACGCAGCCGGGGCTGGGCGAGGGCGCTGCGGGCGCAGGTAG
-GGGGCCCGGGGCGCGTGGAGAGCGAGTTCCGGGCGCGAGGGCGAGGCGGAAGGCTCAGCT
-GGCCGGGCCGGCGGGGGTCGGCGGGGGTGGCTCGGCCGCCTTGGCGCAGGCCGCCTCGCA
-GTGCTTGTGGAGGTAGGACTTGAGCGCGAAGCTCTTGTCGCACTGGCGGCAGCGGTAGTG
-CTTGAAGGCCGAGTGCGTCTGCATGTGCGCGCGCAGGTTGGAGCGGTCGGCGAAGGCCTT
-GCCGCAGTGCGCGCAGCCGAACGGCTTTTCGCCGGTGTGCGAGCGCATGTGACCCTGCAG
-CAGCCAGGGCCGCGAGAAGGCCTTGCCGCAGACGCCGCACTTGTGGCGCAGGTTGTGCGT
-GAGCAGGTGCATGGCGAGCGCGGGCATGGACACGTAGGCCTTGCCGCACGTCGGGCATTT
-GCGCGCCAGCTGGCTGTCCAGGCTGCGGTGCGTCTGCTTGTGGCGGCTCAGGTTCGACGA
-CGTGGCGTAGGTCTTGCCGCACTCGGCGCACGCGTGCCGGTGcccgccgcccgcctgcgc
-ccccgcgcgccccgcgcgccccccggcgccccccgcgtctcccgagccccccgcgtcccc
-gccgcccccgccccgccgccgccGCGAGCGCCCGTCCGAGATGAAGAAGGCGTCCATGGA
-GTAGCTGTCGGTCACTGCCGCCTCCCCTCGGAAGTAGCGCGCCGACAGGCTCGACTGCGG
-GCTTTCGGGGTCGCTGTACTCCTCCGGCGCCGCCGGCGGGTACGCGGGCTCGGCCGGGGC
-CAGCTCCAGGCCCGGCTTCTGGTCCGCATCGTAGCTGCTCGGGGGCAGGCGGTGCGGGGC
-GTACCCTGGAGGGGGCGAGAAGTGGAGGGGCGGTGAGAGGAGGCGCCGAAGAGGGTTTCC
-CGCTTTGAGCGCGTCACCCTTTGCGCCTTCCAGCTTGGCGCCCCTGTGGCAGCTCCGACA
-GTGGTGGTCTCCGACCTGCACCTCAGCTCTTCCTGTCAGGCAGCCTGGGTTCAATTCCTT
-CCTCCATCGACGGCAGTGCAAATAGCCGCCACCCCAACCCACGGAGCATGGGGCCAGCAC
-GGTtgtacagagcgtaccttcactatccagtgctcacaaccgcggagtgatggtcttata
-atacccacgctacaggtagagaaactgaggcgcagagagatgcagcagtctaaccttaca
-gtcaggaagtgatggagcccttgccagtgtgaccctgaagcccatgctgtctctattcca
-acaacatgctgccGTTGCAGCCCTGtaacttctctggatctcagttttctcatctgcaaa
-atggagcttgtgattggacacctccttccagggtcgttggaaggactgagtaaagtgacg
-ataataagcgtgtgttaagctcttactgtttgccagactctgcctcggtgctttacgcat
-gttaactctaatcgtcacagacccaaggaagtcggcactattgtaatccccatttgatgt
-gtaaggaaatgaacaaagGTGGGGGAGCATACAGTAATTGCTATATAAATGTTAGCTATT
-ATAATTATGCTTTTTACTTGCTTGGAGATAGTTTCctcccccaccacactgtgagctccc
-catggttggatctgtgtgcccagcacatgcctggctcaaagtaggtgtgcgatgaataga
-tgttgcatgaaggaatCACAATCCAGTTAGACCCACCTGCCAGGGTTGCTGAAGCATTTA
-ACAGGGGTCAAGTGTGTGGCATGTAATAGGTGCTACAGAAAGGGGACTTCCTCGCACCTG
-CTCCCAAGCCTGCTCTAGAAGTCGTCGGAAGTCCGCAGTGAGAATTCCCCTCCCCCTCCT
-CCTCCCACTTAGCTGGAGTTGGACCAGGAATCCTGTCTGCCAAGGGTTTGAGTGATTGGT
-GGGTGGGCAGGCTGGGGTCTCCCTGGGGATTCCGTAGGGGATTCTCATGGGCAGGGGCCA
-TTCTGATTTGCCTCTGCCTCCCATGGCCTAGGCTGGTCCTAGCACCTTCCCTGAGACCCT
-GGGGGCTGGGCTCCCTGGAGAGTTTCTGGCAGACAAACTTTTCATCCTGGCACTTGATGG
-GCAAGTGATTCCATTGTTCTGTGATTCCACAGAACAATGAAGGTTAGGTCCGTTTGGGAG
-GTTTCCCACCTGGGGAGTGGGATTTGACCTTCTCCTGGTGACCCCTGAGACCTGTAACCA
-CTCCTCCTTCCCTCCTCCCCTAGCCTCCTTCACTGAAGTGAGCAGGTGGAGGAGGGTTTT
-GTAAGGGGAAACAGGGTTCAAGATGTTCAGACTTTTAGCTGGGTACTCTGGTCAGCTTTC
-GTTTCCCACACAGCCTGGCTGATTCAGCctccaggcctttgcctctcatctggagtttgg
-gatggacacagggtgaagtctgtgtgcccctgaaggcaagggtgtgcccttatttttacc
-tctgtcccttcagcagccagcacagggccctctgcacacagaagtcattgtggattatgg
-aagtggatgaCTCGGAAGCGGGGGGCTCTGTGGTTGGATGTAAAGGGGGATAGTGATAGT
-GGCAATTTTTTAATCTGGGGAGAGGAGATGCCCAGCCTCTCCGCACCCTATGTCTCCCGT
-CCCATCTGCCTGTGGTCTGGAGGTCCCCCTGCTTCCCACTCCGGGAACCAGGCCTGGTAC
-TCAGGTCCCAGAACATTCAGGAGTGTTGTTTCAGACTGAGTTAAATACCCGTCAGGCACT
-CCCAGACCCCCCTCCTTCTCCTTCTGTATTTCCTCACGTTGTAATTCCTGGTGATGataa
-taatagctaatattcactgagcacttactgtgtgcaccaggctctgtgctaagtgcttcg
-ctcccatcatctcactgaatcatcacaaaactactctcatcacagataaggaaactgagg
-gacagtgtggtgatggcacttgctccaggggtggagcaaggattggaatccactgccCCC
-TTGgtttcccacatactgggaggtcctccaggagggggctgtggctgagctgttcacctc
-ccattcccagggccctagctagtgggcacttaataagtatttgtggaatgagtgaTGATG
-ATTTGCGAGGCCAGCCTCACTCCCCAGCCTAGCAGGACCTGGTATAGACAGTCCTGTTCA
-CCTGGTCTCAGGGCAGGTCTGCATCTCATGTGTCTGGGGCCATGGAAGGGGAAGGGTGGT
-TTGGTTCTCCAACACAGATTCCAGCTGAGTGCCTTTGGGTGGGTTGTGCTTCAGGTCCTT
-TTTTTTTAAAATGGGATTTATCTGGAGGGGTGACTGATCACGTAACCAGTGCTTTGAGTT
-CTATTATTAAaggatgacatattggataagagtaaaactttggtgccagacggcctggat
-tgttttggctctaccattcccagcagtgtgaccttggccaaacgatttggcctctgtgtg
-actcTACCGTTTCAGTAAGGGGTCTGCCAGTAAACAGTATATAAACAaatgataaccagc
-actctcagagcactcctgtgtcaggcactcttacaagggctttccacacatgaaagcatt
-ctacccccatgacacacaaggtggtaggtacccttttatagaagaggaaaccaaggcaca
-aggaagctaagtaacaagcctaagattgtgcagctgataagttagagccaggattccagc
-tcagTGGCTGGCACATTTTAAATCCACCACGCATGTTGGCTGTTATTATGAACAATAATA
-ACAATCTCCCCAGATGGGTTTCTGTGCTGCAGCTTTCTTGGCATCTGCCCCAACACATCG
-TGCTGCTCCTCTCTGGGCCTCTGTTTCCTCACCCGGGATGTGTAATTTCTATTTCACGTT
-CTGATGGGAAAATATCTGGTGCATAGTAGGAGCTCCATCAGTGAACCAGAGCGTTCTCCA
-TGAGGTGCTCTGCCCATGGCGCCCTCTGCTGGTGGCCCTCAGCGCTGTTGACTTTCCTCC
-TGTTGCAAGGGGCTCTTTATGAAGAAATAGGGGTGCCTTCAACAAAGGCTGCTCATTTGC
-CTAGGGAGGGCTGCAGAAGTGTCTTCAGGATAGGAATTGTGAGCCCAGACCAGACACCCA
-GTCAGTGGATTTTGGCATGGGTTGAGAGCATCCTGTGAGAGTTTGTGTGGTCATGTTAGG
-AGGAGGTGGTTctaacttgctttgtgactgtggccaggttgcttaacctttctgggcgga
-atctatacatgacaaagatggactggaatggtctaaagaccctttctgcATCATGGCTGA
-ATCAGTCCCTCCATGATGCTCTTTGTCCCCTCCACTCCCAGCTCCTCCAATTCCACCCCG
-TTTTCCTCAGATTCACAGACATCTCCctaggcaaccttgggcaagttacttaacatcttt
-ctgccacacctgtataagggagttcataataaggctgaataaatgaatgcatgtaaagtg
-cttaggacaatgcctgacacataatagctgccctcttgagctgttattattGTTACTGGT
-AGTATTCCTGTGTTTCCTGGTGATATATCCTTCTAATCTGCCAGAGAGTAGGAGATACAC
-ATGGGTGTCTTAGGCTgctgtgtgaccttgagcaaaccacctcacctctctgagcctcaA
-CCCTGGAGACTCCTTTAGGACACTAAAAGCCATACTTTAACCTAATGCATGGAACCCAGA
-CAGGTACCTTCCTCTGCCCTAAGAGTGACTATAGAAGGCTGAGATACCTATCCTGCAACT
-GACAGGGTGAGACAGGACTCTTGTTTGGGTTCCCAcagagatagggatgagctgggattc
-agagaaaagagaatctcaggtgagatctctcatcctagcccttgaattcaggccgtagcc
-atgtgaccttgggtaagtcgcataacttatctgggctcaaatcctccatttgaggaatgt
-ggaccagaggcacccctgtcatgtagggatatggggaggGCCCAGAAATACTTTGGAGAT
-GTGCACATGTCACCTGGAAATGACTTTGGTTTTCCCTGCCCAAGAGTCTTGATATTTTAG
-ACTGAAGGTCCAGAATCTGTCTTTTTAAAAATCGGTACTCAAAGGAGTGGTGAAAGGGAA
-ATTTATGAGAACTAAGGTGCTGGGCCCTCTGCAGACACTGTCTCATTTAGCTGCCTGACC
-CCCTGCGGGGATGGAGGGGGATGTGTAACAAATACTGCTACTGCTACTGCTGGTGCTTCC
-AACTAGCACCAGCCTCCCTGTGAGCCAGACATTGCCCTGTGCCCAgaggcccagagaggg
-gagaggatttgcccaaggtcactgagagggaggcggcaggtttgaaaccctccaaggcct
-gtgttttttccaaaacaccaGAGAGGGCATGGAGACTTGCTGGGGAAGAGATCTTCAATT
-GGTAGGGGAAGGGGTGGTGCGTTTCCTCAAACACTCCCTAGTTAGCCTGTGGTGGGGTGG
-GTGGGGGCACGGGGTGGTGGGGGCATGGAGAAGCTGTTGTGGAAAATGCTTCAGCCTCTT
-GTAAGTATTTGTAAATCATACTTAATaacagtaatgcctatcacttactgagcacttact
-tggtgcaaggcatcctgctaaatgctttgtgcacattagctcatgtctaaggtcacttcc
-ctccatgcccttgttctgcagaagctgaagcccagacaaaggccttgacccacctcaggt
-cacaaaacaagttctcatcagagctgggttggcctccttttctttcctttttttcagtcc
-aggactcctttccccagtctctcccagACTCCCAAGGTGCCAAACTTTCTCCAGGGAATT
-CCTAGCCTCAGCCTCACCTCTCTGTCCTAAAATGGGCAGAAAAAGACAGGGGCCTGGTGG
-GGGGCCAGCTTCCCCGGCGGCCCACTTTCCTGAGGAGGGCTGGGCCCTGCTGGGTGGTAG
-GGGCTGGAGGAGCTGCTGTATGGGTATATTTAGAGCTGCTTCTTGCTGTGCCAGGGCCTC
-GGGCCTCGAGAATCAGCTCCAGCCAGCTGAGCAGAAAGCCAGGTCTGTCAGCAGCAAAGC
-GGGATAAAAATAGTTTCTCCTGTCTGCTCACAGAGCTGGGCAAAGGGGCTGGGTACCTCC
-CCCTCCCCTTATTATAGCATCTTTGTTAGCGGTTCCCTGGGCACTGGACCAGAAATGACA
-CCCACCTCCTCCAAAGGCCTGGCAGCTGGTACATCTGCCCACGGGGAGGAGGTCCCTGTG
-CCCAAATGAGCAGGGGACAGAGTGAGGTCTGGCCCAACATGACCAACGCTGCATGGCTTG
-GGGCTGATGCCCACTGACCCAGGCCCAAGGAACTTTGAGAGAATTTCAAGGCTTTTCCCC
-ACCACCCCCATCTCTTGGAATTCCCCACATTCTGGTCTTTCCTGACTGTGACCCAATTCC
-TGTGGCCTACAGGGAGGTCCAGAGCTCTGCAGGAATCAATAGGAAAGATTTTTCAGGGGG
-GTATGGAGATGAGAGTGAGTGGCTCAGGGTCTTCATTTGCCCAGCCTGGGTTCGTAGAGT
-TGCCTCCTGCTCCCTCGGGGGGGATCTCCAGTGGGCCCTTTCTGGGCCTCGTTCCGGAGA
-CTGGGTGTGTTGTGCAGTGCTCCACCTCTTCCCCCGGCCTCCTACTTTCTGCTCTGCCGC
-CTCTCTCTCTAGAAGGGTGCACTCAGAGGGCCCATTCCAAACCCCTCCCTATCCAAAGGC
-TGGCCTGGCAGTAGACGCTTCACTTCAGGGGAGTCCACAGCTGGGAAAGAGACCAAGAGG
-CCCGAGGGACCCCATCTCTCCCGGCAGAGGGCCTCCAGGCTGTGGGGGCCCCTAAAACCT
-GTGGATGTAGCACCCACTAGGGAGGTGTGACAGGGTGCACCGTTTATGCTCTtgtgactt
-tgggcaagtcacggcctctctgtgacctcagttttgcctctgtaggttggagtgaatCCT
-CCCCTGCCCCCCGCTGCCCTTTGCCCACTGTGGATTTGTGTGGCCAGAGAGTGCCTTTGG
-GATGTGTAGATTGCTGTACTGACATAAGGGACTTGGTGTACTCTCTGGCCCTCCTTCAGC
-AATCAAAGACTGAGACTATCTAAAGTGTGGAAGCTCAGCTCAGGACCCTCACGTCCCTCT
-CGTAACCCCAGGCTTTAGAGGAAATCAGGGGTTCCCAGATTCCATATCTCACATGGGCCT
-CATCATTCCACACTTCCACTGAGCCCTGTTAATTCACAGGAATATTAGATTTCTGGGTCC
-Ctagaaggtcaaagctgaaagagatcatattcaaccgtttgatattatgaaaggaaaaca
-gaggctgggaggagaggggagactaggccaaggccacacagaaggctaatggtgagtcta
-agacttgaactcagCCCAGCCTTGAGAGCGGATCTGGACAATGACCTTGGACTGGAAACT
-GGGCCTGAATCTTGATTCTGGACCCAGCACTTTGCCCTGGACCTGTTCATAGGTATTGAA
-ATTTGAAATTGGACATGGATTTGTCCTGGATAGCAGACCTGGACCTATAACCTCAGACAC
-TGACCTTGGACCTAGTCCTTGGACCTGGTCCTATACCTGAAGTTTGACGTAGGCATTGGA
-CTTGGACCTCAGATCTGTACTTGGATGTTGGACTGAATGTTGGACCTTGACCTAGACTTT
-GAACCTGGGCCTCTGACATGTCTTTAACCTGGACCTTGGACCTGGACCAAGGCCAAGTTA
-CCAGGGAAAGGGGTGGTTAGAGAAGACTCAGATGGGTCTGCTGTGTGTCCATGGGCACCT
-CCCCAGCCTTCTCTGTGCTTGCTCTTCCAAAAGACTGGGGAAGCCCTTTTGCATTGCTGC
-TCCCCAGAGGAGCTTTCTGAGGTGTGGAATGGATGTGTGGCAGCTGGGGACATTGGGCCG
-GGCTCCCGGGCTTGGCCTGGAGCGACTACCCGGCACCATCAGAGGGAGTGAGAGGAAGTG
-GGCGCTGGTTTAATGTGGTCAGCTAGATAAGCCCATGGGTAGAAGTAGGAGAGTTTCCTC
-AGCTTGCTGGGGGAGGCTTAATGTAGCTGCAGAGGGCAGACAACTGTGTTATTGGATTGG
-CATTGATCCCTCATCTGCCTGGGTTGGATGCACTCTGAGAGGGCAGGAGGGCAGGACAGG
-GCGGGGATGCAGAGGAAGGGGGGCCTGGCTCCAAGCTGGGGTTCGGAGTTAAGGTGGAGG
-GGAGGCAGACACTCCAGAAGATATTCTTGGCAGGGGCCCACAGAGACCACTGACATGCAT
-GTGGGTGGGCCACCTTCTTTGGGGTGGCTGAGAGTCCCAGTATCCTTCAGATGGGGGCCC
-CGGTCTGTGGGGAGGGCCTGGTGGAGTTGGAGGGTGAGGTTAGCAGAGGGTTAGGATGAT
-GTAAGTTGGCATCTCCCAGAAAGACTGAGTCTGTGCTCAGAATCACCCAGGGGAGAAGAG
-GGGAAGGGAAAGCAGTGGAGGAGCAAGAGAGGCATCTTACTTGAGGGGACAATGAAATTA
-GATCTATTCCCACTTATCAGGGAGCTCTGCAGAGAGACCTGGTGCTTTCTTCATTTGAGG
-GGCTCCCCTTCCCTGTTTAGGAGTTCTGTGGGCTTGGGGGGACCCTGGAGCACAGACAGA
-CTTGCTGCACCCTCTGTTCTGCCTGGCGGTAGAGGCTGAAAGGGAGTAGGAAGGCAAAGA
-AGAGCATTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgcgcgtgcgtgt
-gtgtgtatgGAGGAGGAGCAGGAGTCCTCCAGGAATTCTCCAGCATTCTCAGGCATTCCC
-AGAGCTGGGGTACACCTCTTTAATTTGGGGTTCTGCATCTTTATCAGCTAGGAGCTTGTG
-GTTTCTCTGACCTCCACATTCACAGGCTCCCCCAACCCCTGCTCCCCCGACCCAGGTTTC
-CCTCCCGCCAGCCTCATCCTGACCCTGCAGCCCGAGCTGCAGGAATGGCTTGTAAGAAGA
-TCTTTCTAATAACTGGAACTATCTCCAGCCCCAGGCCTCCcccgccctccctccctccct
-ctctccttccctccctcccttgcttctcctccctccctctcctcatcttccccccctccT
-CTCTTTCTCCTTGTTTACCCAGCACACTTACACACGCTGAGAGAGAAAAACGTCGGCTCA
-GCAATTTTTCACACTTCCCTCAAATGCTCAGCAAGGTTATTTCCGGCAGAGCGGAGACAA
-CGGGCCACCAGGAGCCGGCGGGCTCTCAGCAGACCCCCAGCACCCTCCACCCGCCCAGGG
-AATAAGGGATCCCTCACTGCCCAGTCTGGCCGCACCCCAGGGAGGGAAGAGGCCCCTGAA
-AACAAGACAAGGCAGACTTTGTATTTCCCAGTCATACCTAGGCTTGGTCTCTGGCACTGA
-CCGTCCACTGCAGACACTGCCAAGGTGGCCAGGCCAGGGTGCCTGTCCTCACTATGGGGT
-AGCCTACAGAGACCAAAGCCAAGAAAAGTGCCCGATCCCAGAAATGCCGCTACCCTCAGC
-CAGGTGGCGTATGTTCAGTGGAGCCCTAAGGAAACCCTGACAGTGGCCTCCCAGCATCCT
-GTTAGACCCCTGTGCAGGCATCTCCAGTGCCTGACATTCCATAGTTGACCTtcacagaag
-ctgagcttgtcaaagttggaaggatgcttagtttatgccatcaaaactctttcactgctg
-gggaggctgaggaccagagaagggaaggcacttgcccaaggtcacacagcatgtgagaga
-tctagagcccaggcctccaaatttcaggccaggtttctggctatcagcacagccTCAGGA
-TTCCTGAGAGGTGAGGGAGTTGGTCTGGAGACCCATGGGGAAGGGGACAAAGACAGAGGT
-GGTTCTAGGGTGTTAAACCCGGTGGAACCTCTGCAGAAACACCCTGCTGGTGGCTCTGCA
-CCCGCCCTGCTTCCCACTATTCACTCAGGGGCTCCTTTCAAAGCTTTTTTTTGGACTGAA
-TTCAAGGCAAGGCATTCTCTTGCCTCCCTCCTGAGGAACAGCCTGCAGTTTTGGCTGTGC
-ATGGGAAATTCTCTGGGCTTCTCTGGGTTTCCTCAGCTGGCCTGGGGACAGGACCAACGG
-GGCTTCAGGGGGTGGAATCCCAGAGCTTTGTGTCAGTGTCAGTCCCTTAAGAGATCCATA
-TCCCAAGCTTGCAGATATTTCAGTTTCTACCAGCTTTGAGCGCACACTCTCCAGCTTTGG
-CATGGCCCCAGGTCCACCCTCTGTCCTGCCAGCCCTCAGCCCTGCTCAGCCATGTCCCTG
-GGCTTCTGACCTCCACCTCAAGAGGCCCTGTGATCAAGAAAAGAGGACAGTAGAATAAGG
-GACATGTGGGCAGAGGAGAAGGGGTTTCTGTTAAGGGTCTGGGGGATGCCAGTGGATGAG
-GGGCTGTAGCTGTATCCCTGATCACTCTGTAACTTCTTTGACCTTGATGAGGTCACAAAG
-CCCTTTGCCCAGCACTCTCTCTCTCTCTACCTGGTGTGGCAGAGTGATGGAATGTGGGTG
-AAGTGCTTGGAAATCCCAGAGGTGGAAGCCCCCATCCTCCCAGGCTCCTGTCTTTGCCAT
-CTCAGTTCCCCCCTCATCCTCAGTCCTTTCTTTTCTCctctctcaatctccctctttctc
-tctctctctttccccacccccatctctctctctctctctctctcacacacacacacacac
-acacacacacacacacacacacacaACCCAAAGCTGCCACATGTGATGTCAGATCTCTCA
-CTACCAAAGGGACACCTCCTCTTCAGACACCTGCCCTGGTGGGGGCCATCAGGGGAGAAC
-CCCTTTGTGATCCCCTTGGTGGAGGATGGGATCCACAGAAGCAGTCTCCACTTTCCCCTG
-CCTTCCAGAGATCACCCCCTTCTGCACCTGAATGACTTCTCTTGTTCCTCAAACCCTTGT
-CCCTGCAGGAACTTGTTCTGAGAAGAGATGGAgtgtgtgtgtgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtatgtgtAGTGAGGAGGGGGCTTACGAGGAGCAGCAGGGTTGGTT
-CTGGAGGGGGTTGAGAAGCTGGGGATGGGGAAGGAGTGCAATCCAGGGGACCAGGAGCCA
-CTTTGGGGGAACCCCTCCCAGAAATCCTCTCTTTCTTGCAGTCCCCAGGACAGGCCCAGC
-CTTTGGCAGGCATGTGGCTGAGGGTAACAAAAGAGTTATTGAGAGAGGGGGTCTGAGAGC
-ACTTGTGTGACATCGGCAGGGGAGCAGGTTTGAAGGGAGGGAGGGCGCCCCCAGCCACCC
-CCAGGGAACCAACCCTGTCTCTCCAGGGACTGAACATCCAGGGCTCTTTACCTTCCCCCT
-TCCCGGGCAGCCAGCTTCTCTTCCTCAACGGGGGAGAGGGAACCCTCAAAGTGCCTTGTG
-CCTCAGTGCCCAGCGCTGGCCTTTCACGAGCAGCCCCGTCTGTGTTCTCTTGCCACCCCC
-TCACTCTAGCCCTATTTGAGGGCCACAACTTTCAAAGTCCCGGCTGGCGCGTGGCTGCGG
-GATGGGCCGACCCCGCGACTTTCCCTTTGTACGACCTAGCCCCTGCCCCGCCCGCACGGC
-CCTTGGAAAGCCCGGGAGGAGCCCACGGCCAGAGAGATCTCCTCCCGGGGGTTTCCTGTC
-GCACGCGCCCCTCCTCGTGGCCCAAGCTGGGGAGGGCCCCAGCTCCCCTCGCCTCTTCTC
-CCAACCCCCCGCCCCCGCCGGGTCCCACTCACCGTTGTCCCCGGGAGGCCCCCGGGCGCC
-AGGCAGCACGTAGGCTGTCTCCAAGGGGTGGTAGGTGGGGGCCGGCACCCCGCTGCACTG
-GAAGCCGTCCCCTTTGATCTTCTTTACCAGGAAGGAgcgcggcatggcgcggccggcgcg
-gggctcggtgcggggaggcggccggccgggcgcgATCGGCTGTGTCCGCGCGGGTTTTCA
-GCACTGGACAGCTCCCAGCGGGCTGGAGCGCGGGAGGCCGCTCGGAGCCGGCACCGGTGG
-CGGCGGCCCCGGCTCGGGCTCGGGCTTGGCGGCGGCGGCGCGCAGACAGGGGATCGCGGG
-AGCTGCGCTCAGCACTCCGGCTGCCGGCTTTATATGGGACGCAGGCTGGAGATCAGGTGG
-TCCCCTAGCAATGGAACCGCTCGGCGCTCTAATCCATCAAATGTCCCCCAGGACAATCGC
-TCCGCACACGTTCCCCTGAACCGGCGGCGGTGGGGGCAGGCCCGGAGCaggcaggagggg
-agaaagtgagggcgagaaaggcgcagagacagagagggacggagaaaggggagtgagggg
-ggcggggagaagaagagagactcggagaaagacagagacatacagggaaagagagacgca
-cacgctgagagaggtagaaatagaagcagagagaccaagataaggacaaaaagacacaag
-agagaaacagagagagaagaaagacagagaTGGAGAGAAGTAGCAACACACACACACCCA
-CGGGAGGAAAAGAGAAATCCAGGCACACAAAAAGGAAACCCCCCCAGGGATGCAAAGAAA
-GGGAAAGAAAAGTGCAAAAGAGAGGGGGAAGCCGAGGGGAACGGAGGGAAAGCGGTCCCG
-AGCAGGCGGGGTTCAGGCACATGGGGCCGCAGGGAAGGGGATGCAGAGGAAAGAGTGCGC
-ACTGGCCAGCGGCCACCCTCCCGCCTCCAGTCCTCTCCCTCTCCCCCAGTTCTGAAGTGG
-CCAGGGTGGACGCTCAGCTTTCACTAGAGTAAGTCTCCCCTCCCCCCTGCTCGGGCTCCC
-ACTGGAGCCCCCTGTTGGGTTTGGGGTTCAACTTTCTTCTTCCAGAACTGGTGGGGGGAG
-CAAGTCCCCCACGCCGATGCCTGGCCTTGCTCGGTTGGTCCTGTTCCGGTGCCTAGCTCA
-GGCGGGCGCTGCAAGAGGAAGTGAAAATCGTCCAGTAATTAATTTTCCTGCTGCCGGGGG
-GTGGTGGTTTTGACACATCCGAGGCAGTGTCTTTCCCTGAAGCGGGGAGCAGACAATAGA
-GACACGTGGACTgggaagggagaggggggaagggagggggagcgggGCTCCTGCTGGAAC
-TCTTTGCAGGTCAGCTCCTTTGTCTCTAAAAGGATCTGAGCAGACCCGCCACCCCCAGTC
-CGACCCAAACCTGGGGGAGCCCCCATATCTTGGCAGGACCAAGGAGCAGGAGAGCTCAGC
-CCCCTGCCCAGAGGGTGCTGGGCAAAGCCCCATGGTGGCGGACCTGCTTTAGCAAGTGTG
-GGATGGCCAGTGCACAAGAGTCCCAGAATCAGACTCTAGGAATTCCAGGCTCTCGCTGTC
-AATGGAATTCTGGTTATGAGATGCAAGGCTGGTGGAGTGGGGATGTCCTTTTGGGACTGG
-GTCATCCAATACCAGTTTGCAGGCTAAGACCTAGAGAGGGCTTGGAGGTGCTTGAGGTCA
-TGCAGTGAGTCAGCAGCAATTGCCAGAGACCTCAGTGGCCTCTGGGCACCACTGAATCAG
-GGCCTATCATGGTCCTTGAGGTGTAGCCCAGAAGTCTCAGAATAAAACTGGGGCCCCTcg
-tggtggttcaagcctgtaatcccagcattttgggaggctgaggcaggaggatcacttgag
-gtcaggagtttgagaccagcctgggcaacatagtgagaccttgtctctacaaatagttaa
-aaaaaaaaaaaaaattagccaggtgtggtggtgcacacatgtggccttagctacttggga
-ggatgtggtgggaggatcgcttgggcctgggagttcgaggctgcagtgagctgtaatggc
-accactgcgctccagcctggatgaaagagcgagaccctatctccaaaataataataataa
-taataataaGTTAGAGTTTCCAATGCAGGATCTGTTGGCCTTGAATATTTTCAAAAGACA
-TAAAGATGCAAGGATGTGGAAGCAGAAGGTTTGCCATTGAATTTGCCCTGTATGGTTTTA
-GATTGTTTTCCCTGACCGAAATAAGGAATTAAGGCAGTTTACTCCCTATATATAAACATT
-GAAAAACATTGCAGGTCCAAAACAATGGGGGCCCCTGATCTTGCCAAGGCCCTGCATGGT
-CTAGAGGTCCCCCACCATCTTTCCTGTTGCATTGCCTCATATCTTGCCCATGGGAAtttt
-ttttttttttgagatggagtttcgctctcgttgtccaggctggagtgcaatggcgcgatc
-acagcccactgcaacctccgcctcccaggttcaagtgattctcctgtctcagcctcctga
-atagctgggattacagggtgcgccaccatgcctggctaattttttgtctttttatcagag
-acggggtttcaccatgttgcccaTGGGACTTTTTTAAACCTCTGTCACTGAGAGTTGAAG
-TGACCACACCCTTGACTCATGGCACGcccatgcattctctgctccagccataggtgccta
-ctggtgctttgggcttgcagctctcttgacctgtataccatttccactgcccagagtcct
-tccctgcacttcaccctaggaaacccctacttgttctcaagactcagccgaggggtcact
-tcctccaggaggtgtccctgacttccatcattgcagactgggccaactcacccactggtc
-cctgagcttcatgaggacaaagactctgtcccatgtatggcttaacacACTCTTAACAGT
-GTGCATGAGGGTCttctagctcccctacttattagccataggtccttggacaagttactc
-aaccgctctgtgcctcaatttccccacttataaaatgggaataataattgtcactaccta
-agtgttgttgggagtgttagaagagttactacatataaagggcttggaatggtgactggc
-atatggtaggagttcaatGCTTGAGGGTTCTATATATGCAGTTTTGCCTGTAGCATGCAG
-CGCTCATTTGTTACATGTTAGTGGGATTctgtggaatgagtggtgaactaggcatctctg
-gtccctgctttcttgcagctgatcttgcagctgtccattcattgagtggatggacaccaa
-gcaagaaaatccttaaatcaacaatatattttcagatagttgaccagtgctgtgaggaac
-ataaaacagggtgagatgatggagagtgatggtgcctttaggcagggtgaccagcaaggg
-tctcctgggagaggtggcatgtgcacctagacttgagccagccatggaaggagcccagga
-aagagtgctccagccagaggcttcacaagttcaaaggctctgaggcaggaatgagcttga
-gcagctgaggacagcaagaaggGAAGGAAGATGAGTTCAACATGTTAGCAGGGCCAGACC
-CAGAGATTACTCCATAAATCCCAaatgaatgagtgaatgaaagaatgaatgaTTGTAGGG
-GTGAGATTCAGCCTATAACTATAGCTTACAACTGTGACTAAGTAGACCTATTGGTTGGAG
-AATAACTTTTCACTGTTTACATAGAGGAAGTTGCTTATTTGTTCAGTCATTGACAATTGT
-GGTATAGCCATATTTTTTAGTTTGTGCTGGGTACTTGGATCTCTGTCCTCTAGGGGTGCC
-TAGTTCACTGTGGGTAAATAAGGCAAGTGGGTGTCATCTAGCTCACCTCCACCTGCCTGA
-TGGTTCTACCTCTCCAACCTCACATCTAAGAGATGGCAAAACGGATCCCAGAGTCCTTAA
-AAAGGAATATAGGTCACAGCAACTTTTGACAGAGCTGGGACTGGACTGTTCTCACTGGGC
-AAGATAGTGATCCACCCCTTAACTGATCAAAGGAAGCCCCACAGAAATGGTGTATTAATA
-GGTCCTGCAGCCCACTAGTGTCGGGTTGAGGATAGAACCCCAGGTCTCTGACCACAGGTT
-GGAAGGTGGTGTGGGTGCATTTAGCATATGAGAAGAAGCCTTGAGCCCTGAAGATGAGGT
-TCCAAAATACCTTCAGAGGGGAGGAGGCCTTAAGTATGGATGAAATACACAATGGCCAGC
-AGAATTTCATCACTAGGACACCAGGAAGGGCCTTCTGTCCCCCAAACCTCCCCCCACCCC
-AGCTTACTGGTTTcaggaagttcactgtggggaattaatttctctaagtcacatgaaata
-aggaaataacttttattcccaaggatgttcgctgcagcatcagagatggtaataaaaacc
-ctgggttggagaaagcaaggagagggttgtgaagaagacgttcactccatgtagtattct
-gcagccattaaaaattctcatttggggagaaaagctcataaaatgtgttaagtgaggggt
-gcagaatacagaaacctctcacagcacgttcacaaccatgaaccaaaacaaaaataaaca
-cacacAAAAGAGTGAAATAAGGGTCTGGAACTATGGGGTTTCCCTCTCCCTTCTTTTTGT
-GTTTTCCAAAAAGATCATAAAATATTTCAGTTCagccaggtgcagtggctcacgcctgta
-atcccagtactttgggaggctgaggcgggtggatcacgaggtcaagagattgagaccatc
-ctggccaacattgtgaaaccccatctctactaaaaatacaaaaattagttgggcatggtg
-gcgcgcgactgtagtgtcagctactagggaggctgaggcaggagaatctcttgaacccag
-gaggtggaagttgcagtgagctgagatcgcgccactgcactccagccttgtgacagagca
-agactccatctcaggaaaaaaaaaaTAGTTCAACAAATATTTATCTTGAGCACTTGCTAA
-CTGTCACTTACTTCCAAATAGAAGAAATGCTGAAGTTTAGTAAACCATGTCAGGATATTC
-ACTATTCATTCTTCTGACTTTTGGGAAGTTGGCATTGTGAATTTCCCCAGTGGCAATAAT
-AATTATTAGTACATCGCCAGCAACATTACAGAGCCACCCCACAGGCCTGGCAGTGTGCTA
-AGCACTTTCCCTTTGAAGAAGGTGACCTTgcctggggctttagattgagggatttggagt
-cagcctattttcagtttaaattcctgctctgccatttcccgactgtgtaattctctgtgc
-ctccattttctcatctgtaaaatgggtgtataaattgggcctgtctcacaaggttgcagt
-gaggattaaatgataatataggcatcaagtgcttagagcagtgcctggcacacaataact
-tgataaatgttgacagttgctatttacatatcctcacttatctaagccttaccatggcct
-catgggagaaggtgctgttattGAAATGACTGGTTCATGGCTACATAGTCACTGTACAGA
-GGAGCTAAAGAGTGTCCCATGTCTTCATGGCCTACTGCCTTCCTGCCCAGGAGCCCCAGG
-TCTTGGCATAATAGGTCTAGCTGGCTGCAGGCTTAGCCCTCTCTGGCCTACCTCGTCTGC
-TCTGGCATCTTCCATATTTCAACTGTGCCCTGCCCATCAGGAAGAAGGGCAGTTCCCAGG
-GTCTAGGTGTGAGTCTCAGGGCTGTGTGACCCTAGGTGGCTGGCAGAGCCACCCTGGGCC
-TCACCCTGCACATCCATAAAGAGGGGTTGGGGCATCCTATGATTCACTGGCTTCACTCTA
-TGGGGTCAGgaaggagcactgacctgggagtcaggagcccagttccagccctgcttctgc
-tccctttgccctcccctttgggccccagctttcttgtctgtcaaatgggaatgggacaag
-atggtccctgagctgctgtccagACCCGGTAATGGAATTCTGTATGAATTCCAAGGAGGA
-GAGTAGCCACAAATGCATCCGCTCCACGCTGATGGGGCTCTCTCTCCGGTAAGCTTCACT
-TACTCTGCCATTTCTCCAGTGTATTTTATCAGACCCACCTCCTCTGAGCCAAAGAAAAGA
-GGGTAGGAGCAGGATGAAACAAACTCACAGCTCTGTTCATTCAGGCTCATCACAGAGATG
-ACTTGCCCAAGGGCATGTGGCAGGTCCTCTGAAATTTGAGGAAGGCTGTGTTTTCTTTtg
-tgtcactttggtcctccgggaagcagatgtgaaaatggaggtgtaagtgtaagagattta
-ttgagaaaacaccgtgagaaatggaggagagccttcagagagggatgcaggtctgatact
-gtgaaaggagaggtggaataaagaaagattggggaagaggagcctcaggccatggtgcag
-gtctaaggaagtcctagccaacccaacagggagctcctgtgcaaagatttcctgtagagg
-agtcccgtgctcgacagaagggcagaccctagtttcccaccatgctcagtcatcagccgg
-cctgtcctggaagagtggctgtgctgacaactatggcagattgcaaaggtgttgcagctg
-gaggctctcagtgactgtagtccagagaagatctgagtggcacctccctaaggctgccac
-aTGTTTTTCTTTATTCATTtaatagacacttacagaactctgggccatgtgccagttact
-gatctatgcactttacaaatattaccttagttaatccttaccctcgccttttgagacaga
-tggtatttttagccccattttatagagggagaaactgagcacaaagaggttaagtaagtt
-gcccaaggtttcacagccagtaggtgataagccacaaatccaacccaggcaagctgcttg
-gaggctctgctctgaccactccaccacactgCCTCCTCTCCAGCTGCAAATGCCTTGGTG
-GCAATTTCTGGGACCATTTCCATTTTCATTTTTCATTGGCTCAGGACCTCACAGCCTTAA
-CAGGAAGGGGCCTACTGTGGTGGCTGGGGGCATAGCAGGGTCCCAGCTCCCCCTGAAGCT
-TCTAccttgctccctcaaagacttccacctcaaagcctttgcatatattgttcccactgc
-ccagagcactcttccacccccttccttgcctaggtaacccctcctcCCATCGCTCCCTTG
-CCTGACCCCAGGATCTAGCCCAGGATAGGGGTGATATGTAGTGGAAAGGAGCTagttgac
-atttattgagcacttattatgtgctaggagccaagtccagccctttacatagattgcctc
-acttaaccatcataacaacctgtgagtgtggcccatggctatccccattttacagatgag
-gaaaccaaggctcacagatgcaaggtgacttgcccaaggagacccagctaggaatcagtg
-gtgtcagtatttaaaccaggctgcctggctacaaagtcctgatcttAAACCATGAGTCCT
-TCCCTCTAAGAGGGCAAAAGATACCAATGCTAGGGTGGGTAGGTGAGGGCCCTCCAAAGA
-ATGTCCCTCCCCTtccccctgccagggctgacagctccttgagtgggattccggatctgc
-tccattcattgccgcacctccatcgtctacccagagccgggtaaatagtaagtgctcagt
-aaatacatcaattgaatgaataaaCTAATGAGTGAAAAACCTTCTTGCGACCCGCAGTCA
-CCTTGGTCCCCTTTGACCAGAGCCAGGTTGACGTGTCAACCGTCAAGATATCCCTCTGTT
-TTGGGTGATAATTAGATTTCTATCTTGACTGTTACAGACATTGGTATTCCTCCATTAAAA
-TGTCTTTCTTTCAggccaggtccggtggctcacgcctgtaatcccaacactctggggggc
-cgaggcgggtggatcacctgagttcaggagttcgagaccagactggccaacatggtgaaa
-ccctgtctctactaaaaatacaaaaatcagctgggcatgatggggcgtgcctgtgatccc
-agctactcaggaggctgaggcatgagaatcgcttgaacctgggaggaggaggttgcagtg
-agccaagactgcgccactgcactccagcctaggtgatggagtgagactctgtcttaaaaa
-aaaaaaaaaaagaaagaaagaaaaGAAAAAAAGTCTTTCTTTCAAAGTTGGAGACATCCC
-TAAACATTCTAACTCCTGTCCCTGACAAGGTCCCATCTTAAGCAGGTCTCTGAAACCTCT
-GGAAGAAGGAATTGGCTATCAGGAGTCTGATCACCAGGCTGCCTGCGGGGTCAGGGTATT
-TGGGGTGGGCCTCTGGCATGGTTTAGCGGTGGGCTGGCCAAAAGCCCCTAGACAAGAGCC
-CACCATTCAAGCAAGTGGGATAACTCAGCGTTTGGGCCTGGGTCACCCTGAGCCAAGttt
-tattttttatttttattttgtagaggtagggtcttgctctcatccaggctgtagtgcagt
-gttgtgatcatggcttatggcagccttgaactcctggggtcaagtgatcctcctccctca
-gcctcctgagcagctgggactacaggtgcatgccaccatgccctggctaatttttaaact
-ctttgtagagatgggattttgctatacttcccagactggtctcaaactcttggcctcaag
-tgatcctcacgcctcggcctcctaaagtgctgggattatagatgtgagccactgtacctg
-gctgagccaaattttaatcctggctctgcctcttcaagctggttggccctgggcaagtta
-ctttgcctctttgcagctctatttcatctctgtaaacagaggccagtgggagcacctgct
-aagtagggctgtAGGGGGCTTCATGTATAGTCAGCCCTTGGTAAGTGGGAGCTCTActtg
-aagggcctttgagataacagcattgtctcctccccacccccatttgacagttgtggaacc
-tgaggcatgggacagggaaatgctttccctggaacattcaggctccctgccaagtcagga
-tgggcttcctcactccaaggtggcctctctTGCCTCCCTCTCTTCCCCACCAGCCGAGCT
-CAGAACCATGCCTGGGAGATGCTGAGGTGGCAATGGAGCTGCAGAGTTGGCATTTCCAGG
-CTCCCAGGACTCCTGGCACAGAGGAATCAACCCCTCTCAGCAGCCCCGGCTCTGCCTCCT
-GCTCCCTGCCTCTGCTCATATACCAGCTGGGACTCATCAGCTTCTAGAGAAAGCCAGGAG
-GTGGCCCAGGTGCATGGAGGCAGGGGGCTGTCAATATTGACCTGTGCTTGACCGCAGACT
-TTGCCAGTGGACAGGTTGCTAAGGAGTCAGAATGTCCACATGCCCCTAGTGCTCATCTTC
-CTAGCCTCCCATCTCACCTAGCTGCAGAGGGGGAGGGGgagcacaagagttgaaagcgtg
-gatgatctgggttcacttcggctgcttaccaacaagttacccagcctggggaagtttccc
-atcctctttttatctcagtttcttcaactgttacatgaggatgttgatactaatggctta
-tcttgaagggcagatggaagatgagtgaggtgtttgcacacagccagtgctcaataatat
-tggccattgttAATTCTGAGGCTATCCTCTTACAGTGACCTCTTGGGCCTTTCAGCCCCA
-AGGAGCCTCTCCTCTCTCTGACTCCTGTGGCTCTGTCAAGATCCTGCAATGAAATTCTTC
-TGGAACCCTATCCAGATGGTGAACTCTTCAAGGGCGGGGACCCCATACAGGTGCCCCATT
-ATAGGCCTGGTACACAACAGGTGCTCATGAAAAGGCCTGCTTGGCTGTGATACtacatga
-acttacagaaccctcacaactacttttggaggcatatgacatgattatccccttttataa
-aaagggggacagtgggtaacatcgaggtgaagaaattgcccaagcagctgggcgcgatgg
-ctcacgcctatagtcccaacactttgggaggctgaggtgggtggatcatttgaggccagg
-agttcaaggccagcctggccaacatggcgaaaccccatctctgctacaaatacaaataca
-aataataataataataataataataataataataataataataataatagccaggcatgc
-tggcatgcacctgtaatcccagctactgaggctgaggcatgagaatcatttgaaccggga
-ggcagaggtaagagggagccaagatcgggccactgcattccatcctgggtgacagagtaa
-gactctgtctcaagaaacaaacaaacaacaaacaaacaacaacaacaaagaaaaagaaag
-aaaaaaattgcccaggggctcacagctataaatctgcagatacttattgtgacctgccat
-gtgccagacactgtgctaagagctggggacacagcaatgaacaagacagagacctgctct
-catgtggcttacatcctgctgagccaagagtaggtagatatgccaatgtcctgtcataga
-aagcaccaggcagggaaatgggcaaagacagagagaggtggaggccgggcgcggtggctc
-acgcctgtaatcccagcactttgggaggccgaggcgggcggatcacgaggtcaggagatt
-gagaccatcctggctaacacggtgaaaccccgtctctactaaaaatacaaaaaatcagcc
-gggcgtggtagcaggcgcctgtaatctcagctactcgggaggctgaggcaggagaatggc
-gtgaacccgggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgg
-gcgacagagatagactccatctcaaaaaaaaaaaaaaaaagagaggtggagcgagagcca
-ttttagatagggtagtcaaggaagacctctctgaggaggtgacttttgtgtagagtccag
-aatgCAGCAAGTGCTGGGTGAAGCCTCAGGAAATCTGCTTTAGCATTGCTGTGGCAGATT
-CAGGGTGGAATCCAGGAGATCCCAGGACTGGTGGTGCCTAGAGCCCAGTTGGCTAGATCA
-ACTTCAGTGTGGATAAATGACTCCCCTGCCCCCGCGAACTTACCTTCCTGGAGCAGTTAA
-AAGAACGgggcacatgacctagattctctgagcttcacttttctcatctgtaaaatgggg
-attgaaaagcatagcttacaattctgagagctgagttgattaacagagatggtccatgta
-aaatgctgggctcagagctgggcTGACCAGATTCACCTAGTCCTTGGTGGCTGGAGTGGG
-CAGGTGACCTTCCTTTTGGCCGTCCAGCACCCTCCAACTCCTTGCTTCTGAGACCTCACC
-TCCCACTCATGGTATCATTGCTGGCCTTCCCAGCCCCGTCTTGGCCAGGGGGCAGTCAAG
-TGACCCAGATTAGCCTCGTGccattctgttgagggtgtggtggttgctacattgagtgtc
-cagaggtagcaaggactaaagtcctggtgtcagcatccagcgttggtgtcagcagcacga
-gctctgtcttggggacccgtggtgtcagcagtgaagtctccctcaggccagggctttggt
-ctgatttgagggcttttttcttttctggatatgaagcctgtaagccttctgaccctcctg
-gagatcctTCAGGCACGTCTGCAGCCATGGGTCCTGGATGATTTAGCAGCTCACGCCATT
-GTCTGGAAACTCCACTGGTACTATTTTTCTCATGTTCAGCTCTCTGTGCACAGACTCCAT
-CCTTCTGGCCCAGATGGCCCCTTGGGGATATGCACATACCAAGTTCTTTCCACTGTCCTC
-ACTTtgagggcaggggcctgggttgttcatttttgtgtccccagatcctagcacagagcg
-gctcagaggaaaggctcaatgcatgtccatggtgtcaacaaatCAGTGGcacaggataca
-gtttccacacatctccccatcctggttgcttccccgaaccattttccagtctgtcagtgt
-tcttctgaatatacaggatccagaactgagcacaaaactccagaaataggtgaatggagc
-tgagcagaatgaaactgtcacctcccttaccgtagataccggacttctaattacatgacc
-agacatttaataagcttgttttgTTTCCCTGGGTGGCATATATCAAGCTACTAGCAAGCG
-TTTTGTTTTCATGGTCCTCTACCCACATATTGTTGCAAAACCTCACTTTACTGCCCTTCT
-CCCTTAATTTCACGCTTATAATAGTATTGCCCCTCTCTCACTTCCcaggaatgccaagtc
-gattacagctcaagagcccaatcttgactggtccgtagcctggaacatggtgctgagata
-gatgctgtaactgagtttgggctcactgagaaagactgctgcaattgattaacgatgtct
-gccaAGCTGTGTAAAGTGAAGTAATGTCATTCCCTATCACAAGtcctaacctggggtcca
-tggaaagaatttagttggtctgtcattaacttggatagggaaagtattacatctttaatt
-tcattaacctctatctgaaacttatcattccttcaattatgaatgcaggcaacagaccac
-agtggtattagcaggacctgtgactttgtcaccaatagaaatcacagattttttaaaatg
-acattacagacgttccgcatatcttgaaatataatttacatgcactgtgacttggaaatg
-ataagttattTGCTAAGTactcatttacttactcacatttgtttagcgcctagtcaatag
-cctggtgacgtgccaggacctgggctgggtgctataggcaaaaggcagatgcgtaaggct
-cagtccttccctcaaaagagaaaagcagacagtgacaatggaaaggcttgatgctttgat
-gggggaagtacctgaggcccccaacccagcccagagggatcagggaaggcttcccagagg
-aagtggcctctcagatgagtaggaagtaaccagacccctgagtgctgagaaaaagtgttc
-agggagcagaaacagcatgagtaacgaagctaggaaagaaagagGACACAGGGCTTACAA
-AGTATTCCATGGCGGGGATGGGGAGGGGAGGAGAGAAGCGGGGAGATGGCTGGGGGGGTC
-AGGCAGGCCCCTGGAAGTCATGCTTGGCGGTACCCTGGTCGTGGGGGGGAAGGGGTGCTG
-GCGCTTGCTGCCCCATCTGTCTCAGTGGCATTGAGCTGTGACTTCAGTGGCCTGGGGAAG
-TTCAAGGTCACCTCTGGGGTGGAGGAGGTGGAGACATCTCACCAGGGCTGGCAAAGGCCA
-ACTGGGAAGCTGGGGCCGATACCTGCCCCTCACGGCAGCCACCACAAGGGGCCTTCTGCT
-CCGAAGGCCCAAGCACGCCCTGTTCCTTTATTTATGGGCCGTGTGAGCAATTTGCTGCTT
-GCTGGCCGGCTGGCTGGGTGTGCGATGCGGGGATTACTCACGCCCCAGTTGTGGTCCGGC
-CTCTGCAGGCTGCGGGGTAGTGAGTGAGGTAATTAAGTGTAAAAGATGGAGCAGGCAGGG
-GAGGGCTGAGGGCGGTGAGCAGTCACTGGTTCTTTTCAGGAGCAGGGGAGTGAGATAATG
-TAGGATAATAGCCTAGCCAAACCCTGCCCAGGCAGCCCGGCCTGTGCTGAGAGGTGCCCC
-CCAAACGGCCAAGACAATTCAGCCTTTTCAGGGAAAATGGGGGGGCTTGGGCAGGGCCTG
-GCTCCCAGGGACAGCTGTATGGAAATGACAGCTCCTCTCCTTCGTCCTGTCCTGTGTTGG
-CTCAGGGTAGGGGCAAGTGTAAGTGTCTTCAGCTGGGGATGAGGCCAGGGCAGGGGGCAG
-TAGATGGGACCAGGAAAGCTGGTGGGTGAGAGGAGGGATCCATGCGGGGCTGGGAGACTG
-ACCTGTGTATGTGGCACAGgcacagtggttcgtggcagcagactccagggcctgactcac
-ctggtggaaactgtggtgtggctttggctagctgtgtgacatcagcctagttgtggtcct
-tctctgagcctcaggactctcatctgtcaaatggggctgtcaaacaattcctacttcccg
-ggggtgtttggagaatGGTTCGTAGCGCCTGATGCACAGGGGCTACGAAATGCTTGACAT
-GGTGAAGTCCAGAATCAGAGTGCATTAGTCattcactcattcagtggataaatgtttatt
-gagtgcctaccatgttctaatggttcctgggaaagcagcagtgactagaacagagtccct
-ttcctcttggagatgacattctaagaggggagacagaccattaatcgtgaaacacataaG
-CATAAAAGGTCATAccagcaatcccacttctgaaaacttattctatagacatgtttgcat
-acatgtggaatgaatgcattcatggttatttattgcaattttgtttggcatagcaaaatc
-ttagtaatgatctaaatgcctgttacacatgggctgactgaagtatggaatattatatag
-ccattaaaaagggtgagaccatttctatTTCTgtttatttttatttactttttttagaga
-tgggatctcactatgttgaccaggctggtcttaaactcgtcactggtgaGACCATTTCTT
-ATGTACTGATATAGAAAGCTCCCTAAGATGTTTTGACAAATAAGAAAAGGAATGTGAAGG
-ATAGTTTCTGTAAAAGAGGAGACAATTTGAAAAATGTATTTCTATTAGCTTGTGTATATA
-TGAAACTAATAATAGTTGTTACCCAAGGAGAGGAGTAGGGTTGGAATGAGAGACAGGAAG
-GGGAGAGTTTCACTGTATACTTTTCTATAACTTTTATTTTTGTATGAAGTGAATGTATTA
-CTAGTTCAAAAAAGAGAAAATAAATATTCAGCTTCCTCTTTCCTCCTTTCCTTCCTCAGC
-ATTTGTTGGAGGTAGCTGTTGAGATTTGGGACTAAGCAACAAAGGCAGCTGAGTGAGGTG
-GTGGCTCAGTGTGCCTGGggattgaacaaacaggttcatatatcaaggataatgagagcc
-aggttgctcagcatcagagaagggaattacaagtatgaaaacaggaaaggctagaaagaa
-ccctgtggtgttagattggagttagaggaatcagtgtaaactcatagcttttgatatata
-tagttacataagcatgcatgcaagtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtg
-tgtgtgtgtgatgcatatgtgcatttcccagttctgtccaaaaagacagcaataatcaat
-acaccatgtagccacgaatacacctaacacctagatcttgggttttaaatactattctcc
-actgaaaggaactggggcttgggaaaatagtagatttgagggctggagcaggaaaagtgc
-cctgtgcctggtaccatggtacatgaaacatctagctgtgccatatgataggcaagtgct
-caagtaatgctgaggacatgtcaaaagaccaaggtgccaacttaaagggactcccaatgg
-ccaaatctgggacaacttgagtatcaaaataatgacagtaacagattataagccatgaaa
-tataaatagtcctgatatacagacacatacacgtattacatacacacatacatacataca
-cacatgtgcagaaagagaaagctctttcttacactagaatgcccaataataggtgtggaa
-ggaaggatgcaactagtatggtaataattgattcaaacaagaagcattactagatgctaa
-aactaaagccattgtgtgaaaatttgttgaggagtaggatatttacatagtcttaaagag
-tctttccacaagatacaatacctgcaaaaggaaggagagtgactttatagcgaagaaaca
-tggcagagactatcttagtcgagtgatcaaaggctgcatcactgttactggacaaactga
-catgaggctcctgatgggatgcacagggaagagtgaaaaatcacttctgtgatgttcctg
-ccagagatgcaaaactgaaatctaatcacgaggagccgtcacataaacccaatttgagga
-accttctacaaaacaactggcctgtaacctgggtaagtatcaaggtaatgaaaggcaaag
-aaaaactgagggaccgtcacagattagaggagactaaagagataagacaatgaaatacaa
-tgagtaattctggatggatctttttgtttattataaaggacattattattgagacaatgg
-acaatatttgactgggctctgaagattggatggtagtaatatatcaatgtcaatttcctg
-attttgatgattttattgtggttatgtaggagaatatacttgcttttaggaaatgtacac
-taaagtattccaggataacagggaatcaaattgacaatttactctcaaacaattcaaaga
-aaatctctctatatataaatctctaagagagaatgataaagcaaatatgtttaaatgtca
-atatttggggattctgggtaaacaatatatgagaattctttgtacaatgtttgcaactct
-tctgtaggtttaacattattttacaataaaGTTATTTACATGAAACTGaaaccatatgat
-gtcaagtaatgataagtgatatatagaaaaatcaagtgggcagaggaacagaaaatgagg
-gggtggtgctattctagatggtatggtccaggcaggcctctctaggggaggacctttgag
-cagagacctagtgggagggagggagtagctccatggatacttggggagagtctcaaaggc
-cgagggacccatctgagaaaaggcccagagtgggaccagcttggcctgtgtattagtgtc
-tattgctatgtaacaaatcatcaccaacttagtggcttcaaacaacagccatttagctca
-cagttctgtaagtcatcgtctggcacagagcaactgagttctttgctcaggatattacaa
-ggtagaaaccaaggtgtaggttgggcttagttcttatgtgaaggctctggggaaaaaatc
-cacttccaatttcattcttttcttttcttttttttctttttctttttttttttGTGCAGT
-TGCagagaggaaaggaggaaatttttcgatagaaaaatcttggagatcctgttgctgtca
-cccatcgggctgttggaagctggggttagtccagaagtcttcaggtaatgccagggtgtt
-gccctggccaggaactctcagttgcctctgaacttcttccagccccacatgatggctaag
-ctctccatgaaaggagaccagttggaaacaaagccaacattcccagcaccctgagggcac
-tgaaggattggctaagttctccccggcaagcctgttccctgagaaaatggaggacagagt
-ccttaaaatgaaagagctggggtctgtgcctatactcactctttcaatgaatctacgtcg
-gatcccaggcaggcccccacaatgaagtggtgttgttcaactgaggtaatacccaaggtt
-cgttgtctcatggccacagaaaactaggactcggacacaccagagtgaggttaagagcag
-aagtttaataggcaaaagaaagagaaaagctctctctgttgcagagagaggggtcctggc
-gaaaatgggttgcccccaagttcattcttgttgttcgcaatgttcagcgtcttgcggttg
-tgggactgaccgtaacagacgatttttttgttggctagaagccacctgcattccttgatg
-tgtggcccctccatcttcaagtgagcaatggtgttttgaatcctccttatgcttcatgtc
-tttgacttcctcttctgtgaccaaccgggaaaaactcactgctttaaaagggctcttagg
-attagatcaggtactgtgttagttcacttttgcattgctataaagaaatacctgaggctg
-ggtgatttataaagaaaagtggtttaattggctcatggctctgcaggctgtaccagcata
-gctctagcatctgcttctggtgaggcctcgggaagcttctaatcatggtagaaggtgaag
-ggagagcaagtggtgtcacatggtgagagccagagcaagagagagaaggggagggtgcca
-gattcttttattttttatttttgttttttgagacagagtcttgctctgttgcccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctccacctctcgggttcaagtgactcc
-catgcctcagcctcctgagcagctgggactacaggtgcacgccaccatgcccagctaatt
-tttttgcatttttgttagagatggagttttgccatgttgctcaggctggtctcgaactcc
-tgaactcaggcaatctgcccaccttggcctcccaaagtgctgggaattcaggcatgagac
-atggcgcctggccccagactcttttgaacaagcagatctgtgaactaaccgggtgagaac
-tcacttattaccaaggggatggtggtaaaccattcatgaggaatccgccccggtgatcca
-atacctcccgccaggcccacctccgacactgggaatcacatttcaacgtgagatttcaga
-agacacacatccaaaccgtatcaagcatacccagagattttccgtatcttaaggccattt
-atgccaaataacataagctgatcacaagagtaaacgccaccatattcacagcgcagggta
-ttttacaggacatgtacacaggatggggaggactgggctgaaatcctggaggccatctta
-gaatctgcctatcataGTtgccggggttgagaaacaagaaagccagtgtggctggagcac
-agtgaacaagggggtgcagggaggagagacagcagagTATCACAGGTGGAGAGACACATA
-TATACCACCTAGCCTGATGGGAGGCTGAAGGCCTGAAAGTCACCTTGTGCAATTTTGGTT
-CCTGAGGAAGGGGAGGGTCATGCGAGTTCCTCCATGGATTCACTTGCACTAAAAAGCACC
-CCTGGGGTGGGACCCAGTCGATGATGGAAGTCAATGGAATGCGTGTTGAAGAGTAGCCCT
-TGGAGAACCAGTGGGCTGCTGGGCATAGGTGATAAGTTCTGCTCTGTGCATTTGGCCCAG
-TAGGCACAATGCCAAGAAGCCATGGGCTCGTCAAGGATCCATGGAGAAGTCTGAAATCTA
-AAAAAGCTGGCTGGAAAAATATTTTAAAACTTTCCAAACTTGAAAGACTTAGTGAAGTGC
-CTACCAAGTAGCATTGTGTCAATGGGTCATGAGCAACGCCCAAGTCTCCTAATAGTTACA
-TATGCGTTCTATGTGATGTGACTGCATTTTGTTTCCATTTTAACATTATTGTATTTATTT
-TTTCGTAGTATCATGTGCAATGTACAAATAAAAAGGAACAAAAGGAGATGCCCTGAAAAG
-CAAGTCTCTCTCCCACCTCTGACCCCCAGCCACGCACCCTCTCCCCACTGAGGCGTttcc
-tgtactcaaaggtattttgtgcacatgctaatgaacatgtatatatacacctgactcctc
-cccttttcacaatggtggctgttctgcctgctttttttcttttttcttggcagtacatct
-tggagatgtttcctattggctcatgtggagctgcccattcttttgtacagcagcagagca
-gtctgttatttggatgaactgtcatttattaactagACATGCCCACAACCCTGCCACCTC
-TTTTCCTAACACACTGGGCAGTCTTGGCCTCTCCCAGGCTCCCTGGGAGGGTCACTACTT
-TCACAAAGATGATGCCCACTTCTGCCcatggaatctggcttgcccagtgactacctgaca
-gggttgagtgacaccacccagaagtgcaaagAAGGCAGTAAAGAAGAAAGAAGAATTTAT
-TAGGTGCCCGAGGAAGGGCTcaatcctgccagtctaaacattgttgtacatacctcctga
-tatgtttttctagaatgtctccaggaagggattgctgggaataagtgcaaaataatgccc
-aattgttctccagagtggttgtacaactgactcccttatcaccagtgtcaaggagtcctt
-gttccacataattgatcacatttggacttgtctagctttttaagttttgccaattgagta
-gacaggaaatgagcttttaatttggatttctctaattactcagaggttgagcatcttttc
-aaatgtttgttggctattcatgttttcgcttctctatgtctgtccaaatctttagtccat
-ttttctttttgattgtttgtccttgtcttattgaattgtaggggttctttatatatttgg
-gtgctaatctttgtcagttaaattgttacggacatcttctagcttgtgacttgtctttcc
-acttttaaaaaatggtgaactttgatgaacggtatcggttgtaatgtaactaatttatta
-atatatgcctttatggtttgtcctttctgtttcttgcttcaggaatcctttccaacccaa
-agccatCCCCATGtttctatgatgcacatgtatatatattatttatttatttattttttg
-agatggagtctcgttttgtcccccaggctggagtgcagtggcgcaatctcggctcactgc
-aagctccgcctcctgggttcacgccattctcctgcctcagcctccggagtagctgggact
-acaggcgcccgctaccatgcccggctattttttttgtattttttagtagagacagggttt
-caccatgttagccaggatggtctcgatctcctgacctcatgatctgcccacctcggcctc
-ccaaagttctgggattacaggcgtgagccaccacgcctggcacatgtatatatatatttt
-aaaaagatcatatgtgcatcctgttttgtagctacttttccacttacctaacatgaagga
-acattttttccatgtttaaatagtctacaacatctttggtaaatggttgcatagttttcc
-attgtatggaatatacagtctttatttactgaatcccctgtgatgaacatttaagttgct
-ttcagctttcatatgatcaataatgctgccaagaatatcctgaagctgttggggtccaca
-ttcatgatcatttctcttagataaagtcatagaaatgaaattgcccatagaatttaaggc
-ttcggatacatttgaccaaatttgccagaGGATCCACTTTTGATTCCTTTCCAAGAAGCA
-ATATGCCATTGTGTTCAATTGCCCTTCCCAAGAGTCTGGAATCAGCAAAGTAGGGGTCCT
-GGAGATGATGTTTTGAACTGGAGCTGTTAGCAGGCATGTTCTGTTGTGTGCAGAAATAGT
-TACTGTAGCAGTTAAAGATTTTCCCTGTCCTCTTCCTTCCTACCCTCTCCTGACTCCTGA
-CAGGTAAGATGCCATTATTAGTACTATTAAGAGAAAAGAGCCAAGAAATTAGGCCTGCTT
-TGGTAATGATTCTTGGCTAATTAATTGCATTTCCAATGGCCATAAGCTCCTGCTTCAACC
-AGCACCTCTATGTGTTGAAGGCAAGAAAAGGGGTCCACTACAGCTGCTACCTCCTGGGCT
-GGGCACATAACATTCTCATAAAAATGTTTGTCCAGTCAATGAAGGATTTCGGtttttttt
-aagagacagggtctcattctgttgcccaggctggagtgcagtgtcacgatcacggctcac
-gcagtcttgacctcctgggctcaaatgatcctcccacctcagcctcaaatgatcctccca
-cctcagcctcccgagtagctcggaccacgggcacatgccaccatgcctggctgatttttg
-tattttttgtagagatggggtttcgccatgttgatgaggctggtctcgaactcctggctc
-aagcaatccacgtgcctcggctttccaaaaagattacaggcatgagctaccgtgctcCCG
-GTCAGGAATCTTTTAAAAGTCTCCTGGGTTGTCTTGGATGAGAAAAATAAAAAGAAGTCT
-CCCAGAGAACTTGAAAGCCTTAGATCAGGATTCCCTTCCTTCAGAGGGGTAAGAGGTGGG
-TGCCAAGCATTTAATTCTTAAGCATTTATTTTAGCAAATATCAACATGTATAGTAATTGA
-TACTtttatagtaattgatattaattttcatgtatggcagcacaaagtttcccattagcg
-tgaactggctttttgtttttttaaatgaggctatttaaagaaaaatattaagtaaattgg
-tggaagatagcctgcagatgggggtggggaggaggtggtgtgattccgcccaaacttcga
-gaaacactgCTTCGGTGGAAACCGCTCCGTGAGGAAGGCCTTAAGCCAGGGCTGGGTTGG
-GTCAGGAGAAAGCAGGGCCTTGGGATTCCAGGCGGAGGGCACTGGGAGGCTCTGGAGGGT
-GCAGTGAGGCTGCCACAGTCAAAGGCCGGGCGGCTGGGAGGGGCTTTCGGAGCTCTTCCT
-GGTATTTAAATCATATTTAGGGATTATAAAGTGTGATCCTTCTCATTGTGtcatttgaca
-ctcacagcaactttgtggagtttcaggcaataaggagattgccttgtcagtttacagaag
-gaaacggaggcagagagagacgcagcaatttgcccagggtctcaggtgagtaaaaggcCT
-CAGTGGTGGGTGTGGGCAGCATGGCTGGAAGAAGCGGAATTTGGTGTGGAATTTGTGGAG
-ATGTGTCAGGAGTTGCACCTCTGGGACTAGGGCACTCACAGCCCTCTCCTAATAACaata
-acaaccaccattagcatttatggagtgctcgctgcgggctggctctgtgctgagcaactc
-tggctgtctcactgcacactttacactaacgcaatgggaggggaggtgtcattatccccC
-AGAAAGTGTCAAGGGCAGGAGTTATTGATTCATGgtgtctgctcttgtagaaatttgaat
-tccagtaagggagaggggagccagaaaataaccacgggaagacatcaatgaatgagataa
-tttcacataacgataaatgccagggagaaaaaacccacagggcaatgtgatatggcctct
-ggaggtggagaaggaactgctccagatgaggccatccgtgaaggcttctctgaggaggtg
-acattagagcCAGAGCCAGTAACGTCTGGACTTGAACCTGGGCTTGCGGCATGGGAGAGT
-CCTGCATCTGACTCCAAACTTCCCCTCCTCTGTCTCCTGTGGATCACAGAATGCTTTTGC
-CAGAGACTCAATCCCTTGTTAAGAATCATGGAGTTggccgggcacggtggttcatgcctg
-taatcctagcactttgggaggctgcggcgggtggatcacttgaggtcaggagttcaaaac
-cagcctggccaacatggtgaaaccccgtctctactaaaaatacaaaaaattagcagggca
-tgatggtgcgagcctgtaatcccagctgctcaggaggctgaggcaggagaattgcttgaa
-cctgggaggtggaggttgcagtgagccgagatcccaccactgcactccagcctgggtgac
-agagctagactctgtctcaaaaaaaaaaaaaaaaaaaaaaaaTCATGGAGTCCTGGCTTA
-GGGAACGGAGTGTCCAGGAACTAGGGATGAAAGGATGGTAAGATATCCAAGCTGGAGAGA
-CCTCACCTGTGGTGCTGCCTTGTCCAACTCCAGGAGCTTCATGCACTTGCCGACAGTGGA
-GTTATGCCACGTTAGGGGTCACTCTAGATGATTCCCCTGGCCAAAGGGAAACCAAGTCCC
-AGAGACGAGATGGGTCCTGCCAAAGGCTGTAGCTTACAGCTGTGCAAGTTGTGCTGGGCT
-CCAGGGAGCCCAACTGGAGGCTAAGGGGATgccttgcatcccaccagggggctgcaccag
-gaagaaagggtacctgtttctaattcacacaaaggaatgctatgggctaggggtggccct
-gAGCCTCGTGGAGGATGGGGGCAGAGGTGAGATCCCCACATCGTTGTGCCATCCTTTTTC
-CCACCTCTCCTGCTTCCTGCTTTGTTCCTGCCAGTCCCTGGAGGGCAGGCGGGTGAGCAT
-CTTCACCATTGAGGGATGCCCCCTCCTTAATTGTGGCAAGGGGGGCCCTTTGCAGCCCAG
-TGCAGGCCTTATGGGACAGTGAAGAGGAAAAGAAGCAAGCTGGCCAGGATTCCCTGGGGT
-TTTTGTGGAGCTGACAGGCTGAGGAGTGGTTGGTTCCGGGGGCGGGGGTGGCCCAGAAGT
-GCCTTATCTCCTCTGGGCCAGTGTCAGCTCCTGTCCCCAGCCTGCAGCACAGGCTGGAGC
-TGCCAGCCTGGGGACTGCAGCAAATTTGCATTTATATTGGAGACTTCTGTTTCCAGGGCT
-TGGGGGGAGGAGGGGTGGCCACCACCATCAGCTGAGCAGAGATGCAGGAGAGGAGGGGCC
-TGCAGCCCTGTCCTGCCAGGGGCACAGGAAGTGGCCGATGGGCCCAGTCTGCCTGGCTGA
-GGGAACAGTGGCACAGAAGGTTCTCTGGGCACGCGGCCGGCCCCGACAGCCTGCCTGTCC
-ACCCTCCCAGACGCTCGCCAACATCAGCTGGGAGTTGGCTCTGCCCCCAGGCCTGGGAGA
-AAGGTCAGAGGCCGGTGCCAGCAAGGGACTAAGCAAGGCCAAAGCACTCCTGTGACAGGG
-TGCAACTGCGTGTCACCCGGTCTCAGCCCCACAAAATTGTAAATTGttttagccaagaaa
-acggaggctcagaggggcttagccattagctcaaggtgatccagctTATCATCCATGCCC
-CATGAGCCTCCCAGGAACACCCGGGATACTCACACACCCTGGATGCCATCTATACTTAGG
-GGACAAAGAGGAGTTGACACCCCTTTTCCAGCTAAGTTCTGGAGGGTCAAGGGAAGTTAT
-TGCAGGCTCGTGACACTGTTAGGGCTGGTTTTGTGACAGCTTAGGAATCATGTTTCTTTC
-TCtcttttctttcttttttttttttttttttagagacagtctcactcagctgcccaggct
-gaagtgtagtgcagtcatggctcactgcagcctcagcctcccgggcttaagagatcctcc
-cacctcagcctcctgagtagctgggaccacaggagcatgccaccatgcctggctaatttt
-ttaattttttattattagtagagactgggtctcgctctattgcccaggctggactggaac
-tcctggcctcaagggatcctctcgtcttggcctcccaaagtgctggTGTAAGTCATGGCT
-CCTGGCCTCATGTTTCGTTTTATGGTGAAATCCATAAAATGGGTTTTTTTAGGGCCAGGT
-TCAGGCCAGGTTTCCCCTTGTCTTTGGAGAATGTAGCTTCTCCCATCTGTGAGGTTCCAT
-GTGaagaaggaatggaaggaaggagagaagacaagaagggaaggaggggggacaggagga
-gggagaaatagggagtgaagTATAGAATAAATAAATAGAAGAGGGGggccgggcatggtg
-gctcatgcctgtaatcccagcacttcgggaggccaaggtgggcggttcacctgaggtcgg
-gaccagcccgaccaacatggagaaaccctgtctctactaaaagtacaaaattagccaggt
-gtggtggtgcatgcctgtaatcccagttactctggaggctgaggcaggagaatcgcttga
-actcgggaggcggaggttgctctccagcctgggcaacaagaatgaaactctgtctcaatc
-aatcaatcaatcaatcaGTAGAAGAGGGGATAgaaggaaggagtggaaggagggaaggaa
-gggagAGGGAGTAGATGAGAAGAGAAGATAGAGTCATCCTGCACCCCGCCCCCCAGGTGT
-GCTTGTTGCTGCTGGAAGTGCCCCCTCTGTGCCCTTTCCCTGGCTGTTGTATGGAATGGT
-GGTCCTCTCCCCATCCTCCTCACCCTACAGCTGAGACCTCCTGACCTCCAGTAGCAGGTG
-AGCCCTGCTCCAGGTGGGGGACCAGTGACAAGCTGGTTGGGGCTCCAGGAAGCAGAAGTT
-GGGGCCCTGTTGTGATCCCTGGGCTTTATTTCCATCCTCAGGGCTCAGCTGCCTCTGGAG
-GGGGCTCTGCCTTGCTCTTTGGGTTCTCTCCACACACTCCCTCCCCCACTCTTCCAGACG
-GAGGTCTTGGCCCCATTCCCCCAGCCTGTGGCTGTAGGCTTGCAGCTGACAAACCTCCTG
-GTCCTGGCTCTCCGTCCAGCAGAACAAGCCCTCCCTGTCTGTCACCAAACAGTCAGGACG
-GCCTGTTCCACCTGGCAGGCTGGACTATTGCCcagcttagtcttgggaagtgaggaccag
-ggctgacaacccactgcctgagttcaaatctttgctgtgcctctttctggctgtgtggcc
-ttgggcaagacccgttacctctctgagcttctggcttctcatccgtcaatgggcataatg
-ttaggatctgcctcttggattactgtatgaatgatacgagatcgttcatggaaagtgctt
-ggcttggtgcctggcacCAAGACATTTCAGCTTATATTATCCTAGCTGTATCCTTCAGTG
-TCTGTCTGGCCTAGGTGGGATGTCAGGTTCCAGGGACCTGTCCCCATGCTTCCTCCATTA
-ACCCCTTTATGACTAGTGTCACCTGATATGACTATTTCAACACACATAGGATTGAACCCT
-GGTACTATTATACCATTACTACTTCTCCTAGTTGTTGTATAAGTGCTTATGGGATCAGGC
-ACTGTTCAAGCCAttttaaaatatgactccacattcctttaaattcctctaatcaagaag
-tggggcctatgtcccctctcttgattgctcccaggaataaaatatggttagaaatgacca
-tgctggctgcgtgcggtggctcacgcctgtaatcccagcactttgggaggctgaggtggg
-cggaccacccgagggcaggagtttgagaccagcctggccaaccaacatggtgaaacccca
-tctctactaaaaatacaaaaaaattagccgggcgtggtagctgtaatcccagctactcgg
-gaggctgaggcgggagaatcacttgaacccgggaggcagaggttgcagtcagcctagatc
-gtgccactgcactctagcctgggcaacagagtaagactccttctcaaaataaataaataa
-ataaataaTAAAAAAAAtgaccatgccacttctgcttgagtctctggggacactcactct
-tggaactgttggaacccagcctgcatgctaggaggaagcccaggacccacggagaggcca
-ggtgtggatgttctggcctgcagtctccactgtgccactcctaactgccacacatgtgag
-gggaagacaattctagatgattctagtcccctgccttcaactcttttcagctgaggcccc
-agatactgtagaacagaaggaagccacccccatgtgctctgtctgaatctgtgagcataa
-gaaaatggttaacagtactacacgttggggttgttatgccacagtaaatcaccagaaTCC
-Ctgtgctgactcatttaagcttcacaacttaggaagtagctgttcttatcatctccattt
-catagatgaggaaattaagacccaaaatgctttagcaagctacctgagtccacagatctt
-ctaagaggaagagctgggattcgtgcccaTGGGTTTGAGCATTGAAGAATCAAGCAGGGC
-CCATGTCCTACAGGGCCTAGTGGGCCACATAGGTGACTGGATGTCATCTTGAGGGCCTTG
-GAGGGCTGTGGGAAGACACTGATGTGTGGAATTCACGAGGTCGGGAGAGGGCACTAAGAA
-GCTTGCTTAGGTGCAACGTGGAGGGTGGGTGAGAAGGGGCTGGAAGTGGCCCACGAGGAT
-GGACAGTGCCACCCTGCCATGGTCCACCATCCTCTCCATGTCCTGCTCCTCAAAGTTACG
-AGGGCAGCAGCAGGAGGCCTGGTCTCAGGCCCTAATGAGCTCTGCACCTATCAGAGCTTG
-GCCTAGCCGGAGATCCCAGCCAATTCCTTTGGGCTGACTTAGGCTGTGCCCTTGGACGGA
-CAGAGCTGGGCAGTCAGGGCTGGGAGCCTGACAGTGTGAACAGGAAGTTGACGGCCCAGG
-AGCATCCTCTGTTCCCTGCACATCAAGGTGGGCCACATAGCTCCAAGATCATCTGTGCCA
-ACtggatctactgggtttggagttggctgagagtggaagggagcccacaagaagagtgac
-ctaaagaggacagacactgatttctttttcttattaccaatctggaagcaggcagtcccg
-ggctggtataatggctctttgatcctcagggacccagactccttctatcttgttgttcca
-ccctcaacacttcatagtccaaggtggccgctcattctctggccatcatgtccacattcc
-agccagagggaaagaggaagaggcaaagaatgctctggtctctttaaggacccctcaccc
-ccaccgctcagaagttgtactcggtactccgtttacctcttcatggcaggaatgcagaca
-catggccacccctaactgcaagagaggctgggaagcgtggtctctgttctgccatccatt
-cacccagctaTATCGGTGGGGAGGGGGTTCTCATACTGCGGGACATGGCAAATCGCTTGG
-AATGCCAGCCACACCTGGCACCTGGAagccagagtgagtgttttgaaacttgaatcattt
-aacttcgttgcttaaaatgatcctgtagcactcactgctcccatgataaaggccaaatcc
-tcatctgacccccagggctgcctgatctcaccgtggctcacctctccagcctcatgccct
-ggttcccccagccccatcctccccaactcaccctaacATTGAAATTAAACCATGCCCACT
-CCATCCTCACCTTGGGTCTCCCTTTGTGCTCTGATATTTGGGTTCTCTTCATGCCACAGC
-TCCACCCAATGTGTGCTCTGCTTCCTTAGCTGTAAAAGGAGCTCCCCATAGTACCCACTG
-GGCACATAATAGGGTCACTTGCTTGGGTACAACGTGGCGGGTGGGTGAGAAGGGGATGGA
-AGTGGTCCACAAATAATGATTTGGGAGAACACAAATAATCAGACATAAAGAGCCACAGAG
-GCACTTACTGACTCTAAGGACTGTGGTTATAAAGCCCCTGCAATGTGCCAGGTTGGTACT
-ATGGGGAGCTCCTTTTATAGATAAGGAAACAGTGCATGCTGGGCGGAGCTGTGGTGTGAG
-GTCCTGCTGCACTGCCTTGCTGATGAGAAAAAACACTTATGGGCAGAGCGCTTTACACTG
-AGCAACTCTGTGCCTGCCTTTGTCTCAGGCAGTCCTCTAGCCATTGTGCCCCCCCCtttt
-tttttctgagatggagttttgctcttattgcccaggctggagtgcaatcgtgcaatcttg
-gctcaccgcactctccacctcccaggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgcaccatgacacctggctaattttgggtttttattagagacgg
-agtttctccatgttggtcaggctggtctcgaactcctgacctcaggtgatccacccactt
-cggcttcccaaagtgctgggattacaggtatgagccaccacacctggccCactgtgcccc
-ttttgcacatgaggaaatgggagagggactgtgattctgtaaggtcatatagccaggtag
-tagccatgccttgactggaacccagctctgcctgccccttccctgctggcagttgcatca
-cctgccttctctgGGGAGTGAATGAGGACAAGCCAcacttgaccttccatggtcctgtag
-cagagattttaaagtccagcttttagagaggaacgtgaaagcccagagaggaaggaactt
-gcccttggtcctatactccatcaagcacaatgctgggaagggactcaggtctcctgactc
-ccagtccagagctcttgcacactttgctccttcatgcaacaaatatttattgagcatcta
-ctgtgtaccagcacagtgctagcccttgagaacacagcagcaaacacaacagacacaaaa
-ccctggccctgtggagtggacattccagggctgggtggaggagTGGGAGACCAATACGGA
-CCAAGTAAGTCAGCTGCAGCACTGTCTTTCCTCTTATTTATTTCCGGAAACAAATAATTA
-TGGAGAACTTTATTGCTataagacagacatggtcctgactctcctacagtgagaatatag
-tgttggagacaggcactcaatgagagacacataaataagcaaagttcagattgtgatcat
-agctgagaagaaaacaaggttgaagtgctagagagtaatggggatgcggtactggtagtt
-aacttcagatggggtggccaggaaaagcctctccaggaagtgactcttgagctgagaccc
-aaagcatgcaatggggcccaacagtgttccaggtggagggaacagcaagtgccagggtgc
-agaagtaggacagagcttggtgggagaaaggaacagagagaaggccaaggtggctggagc
-agggcgagagggggaggttggcaagagggagggggctggagaAAGTCCAGAGTGTCGTGG
-ATAGACACTGAATAAAGAGAAGGGATGACTAGCCCCCTACAGTTCACCCCTGGGTGGGGG
-TTGGGTAGTCGTCTTTGCATCTGATAATTTCCCAGCTAGACCCCCAAGGGGTGGGGGCCA
-AACACCTGCTGGCCTGGCACTGCCTGTCTCTGCAGAGATAAAGTTCCCTGCCCCCCGTTC
-ACCAGGACCCCGCTCTGTGGTGCCTCCACCTGCACAGTCAGGCAGGGCATTGTGTGTTCC
-GGCCGGCACACCTGGCATTCACCAGCCTGCTGGTTGCCTGATTTAGGGGCTCATCCTGCC
-TGGCTCAGGGGTCTGTTCCCTGGAGTCTACCAGCTGGGACTAGGCTGGCTGAGGAGGAAG
-ACACAGGCGCTGGTGGTGGCCACAAAGAAGGCACCCTTTACCGTTGCACGCCCATTGGAC
-CATGTTTGAAACCCCAGGCCTCCCTTTTCCAGCCATCCTTCCCTGGGTGGCAGAGTCTGG
-GCTTGGGCAGAAAGGTTCAAGGGGCAGTTTCACTgctgtgcttagaaattttctctccct
-ctctgggcctgtttcctcatctgtgcaacggaagggttgacctggataaactcATGGTGT
-Agactctagagccagactgcctgggtttgaacctttaccacgtagtgaccatatgaattt
-agctaagttactcaacctttcgttctcagtttacctacatgtaaaatggaggtacaataa
-taacacctatttcaagggctgcgggaggattaagtgaattatatatgtctggtgcttcaa
-acagtgcctgctctatggtaagtgctatatattttaactctgatcattattATTAACGTC
-TTTGGAAAACATTGCACTGGAAAGACTCAGTGGAGAAATCTGAGTTCATTTGTTTGCAAA
-CTTTTTGGTCTTTGTTTTTAACAGAGAAGCTCTGCATTGGTCAGGAGAAATTTTACTCAG
-AGCCCCAGCTGTTAGCAGGGGATTGAAGGGGGGCGCCTGCCCCACCTGCTTCCCCGTCTC
-TGTGTCTGCAGCCCCCAAGAGGCCTActggagcataacttgaaaatccctgctcagttta
-tctccttcagctcacagtcagggaaactgagactcagagaggagcagggatctgcccagt
-gagtggcccagcctagactagaacccagatctcctATTTTTCTCAATACAAGACAAGGGG
-CAGGGGCTAAGAGAGAAGCTAAGACCAGAAGCCTCTTAGGGGACTGGGTGCATTGTGTCG
-TCAAGTCATTAGCATGCAAATGATATGCAAATGAATGCAAAACAGCATGTTTTATGCTAA
-TTTGCAGAGTCGAGAGCGACGACATTTTTGGTAATAGGGCGGCAGTCCTGGTCCCTGGGC
-ATTGCCGAACACGCGTCCTTTTTTTCTTTTCTTCTTTCATTATTATGATCGGGCCCATAA
-ATCTTGGTTTGGCTGTGACTCCGCCCCTTCTTGCTTGAAAGCCTGGCTCCTATCATTCTC
-AAGGGCTCCCTTGCCAGTCCTCTGGTCCGGCCTGGGCCCAGGGACAGGCCTGAGCAGTGG
-GTCAGAGAACCAGGACTCAGGAGCCACCAGTCAGAGCTAGAGGGTGACCCCAGCTCTGGC
-CTGGAAGCCACTTCTGAAGGAGGGGACCGTGGCACTTCCTCTGAGCTCCCACAGCCACTG
-TGGCTTCTGTGCCATTGTCTGTTTGGGGCTGGCTTGCTCCTTTTCTTGTCAGGGCGCCCA
-GTACCTGGAACACAGGTTCAGGATGTGTTTGGTGTTTGAAGACTGAATCCATATATGGAG
-AGCTGGTGgtgtaccctagtgatgagcctgcagtctctgaaaacatgcagcttgagttaa
-aaccctggcaccactactttctGAGAAAATAGTAGTATGTACTCACAGCTAACCttttgt
-ttttgttttgttttgagacagggtctcattctgtggctcaggcatgagtgtagtggcatg
-attgcagctcactgcagcctcagccttctgggctcaatccatcctcccacctcagcctcc
-tgagtagctggcactacaggtgcacactgctaccatgcccagctaatttttttttttttt
-tttttttgtagagatggggtcttgccatgttgtccaggcaggtctcgaactcctgggctc
-aagccatccttctgcctcggcctaccaaagtgcagggattacaggtaagagccatcacac
-caggccCATAGCTAattgagcacctaccatgttccagggctctgctttgtaattgttgtg
-aacgctgtcactgataagagtatcctagaaggtgagtatcgttatcattgctctcatttt
-acagagagggttaaatgatttgcctgaggtcacacTCCCCAGGGTAATGGTAAAGGGGTA
-TTTATATTTACTAAGGATGAGTGCTTCATCAGGCAGGGGCCTTTAAGGCACTCAGCAAAG
-CTTCTGTCACAGGGTACCAGGGTCTCCACCTGTGCTATCAAGCCACTCTTTtgacaatgt
-taaactttacctgagccctgtgctcctgaaaaacagcgatggtccagaaatccccccaac
-tttttgttttctgaagtctccctaccttttctgttcagggaaatggcttagcaaaacgag
-ccacccttccccatatgactcagataagacgtagtcccctctttctagtgtatcctgtaa
-gactggaggatgactcccttgctggcctgtgatctttccccttttgctggaacctgctga
-caaggccaaggccaaggaccctcccacttcccattctttgtctcatggttgattagctga
-gatgagaactgtgtgtcctctctgaaactagctagacacagagatgaacatttcctcttc
-aatggactgatggagatatcccctatttgtaagacaatccccactttaaatccctcctgc
-tgtaacctgtctcctcacccctacaaaagtcaaaggcaaatccatcctgtccagacactc
-tgattttgggatctgggatgctctccctgttgcaatagcatgaataataccatcaacccc
-aattcttccgtgtattttgtctttGACCCTTTCCACCGTGCTGTTTTCCACCTAAggctc
-tgagctaggtaagagccctgtgaccttggagtacttctcgggcttctctgtaccttaggt
-ttaaaacggatgcgcacaggcgttatgtcctcaggttgtgagataaaaggagacgacgcc
-agggaaacgctcggtcgcttggcactgtgcccagcagcgtgagtgctccagaaatgtcaa
-ccattgtGAGTCCAGGAGAGGAGAGTGGCGCTCAGAGAGGGAACGGGACCTGCCGGGAGA
-CTCACAGCGGGAGGAAGGGGGAGTAGGGCGCACGTCTGGTGACCTCCGCCCCCAGCTGTG
-GGAGTGTGCCCTGTGACCCCCTCATCCTGCCTTTGGATCACGAGCTGGGGTCGGGGGAGG
-GGATGGTGGGGGGGACACTGCTCGGTCCTCCACTCCGTGTGCCCTGTGACCCCCTCATCC
-TGCCTTTGGATCACGAGCTGGGGTCGGGGGAGGGGATGGTGGGGGGGACACTGCTCGGTC
-CTCCGCTCCCCTCCGCCCGCCTTTGATTGTGGTGAGCAGCGAGTCGCGGAGCAAATTAAC
-TTTTCGCACACTTCATTATGCGCCGTCCCGCGTcccccggggccgaggcccgcgcccccg
-ccccgcgccgACAACTTGATTGGGCAATTAATCTTCGCGCCCCCCACACCCCCTCCCGGC
-CCCGGGCCTTTGTGCGCCCGAGCGTGGGCCGTgggcgccccccgggccgcccggTCTGCT
-GGCGCAGATAAGGCGCCCCTCGCCGCGCGGCCCCGCCTTTGTCAGGGCGCCCGCAGGCCC
-GGCCGCCGCGCTGCCGTCTCGCACCCCATCCGCGCGCCCCCGCCCCTTGGCTCGGTCCAT
-CTGTTTGAGCTTCACAATCCTCCAGCGGCCGGGGGCTGGGGGCGGGGTCTCGCTCTTGGG
-CAGGCAGCCAGCACCCCCTCCCCCCGGCCCCCCCACCCAGCCCCCAGACACGCGCGCGCA
-CGCCCACTCGCACGCGGGGCCGCCCTGTCAAGCAGTGCGGTATTAATTAAGAAGGTGGGG
-GGGAAGCACAGCAGCAGTTTGAAGAATTGTGGGGCGGAGGGTTCCCAGCGGTGTCCAGAA
-AAGAGGGGGACCCTGCCACCCATCTCGTACCGCAGGTGCTTAACGCCTGGTTATTGGCTT
-GGGGATCTACAGGCTCCCATGGCTGGGGGTGGGGGTTAGGGGAGGTGGGAGGTGGGAGGG
-AGAGGCCTGGGAATTTGCCTGACAGTGTCTCTTTGTGCATTTTTCTGGGGTTTTGCCAGC
-AGTTGACCCAGCCTCAGAAAGGTAGCCTGTGATTCAGGTAGTGTTGAAAACCAGAGGCCC
-AAAGGCAGGATAAATCTGGGCCTATTTTAGAGGCCAATAGCGTGGTGGTTCAGAAAGGGG
-TTCCAACAGTTCTCCCTACTCGCCGTTGAGGATTTGCGTCAGGTAACCACCCTGCGCCCG
-GGGCGGTGGAGGTGATGGGCTGAGACCGTGTTGGCGCAGTGCTGGGTACACGGTGAGTGC
-TCACAAGTGCTGGTTCTTGCTGTTTTCTGTGATTTTCCTTGGAGGGGCACAGGGAAAACC
-AAAAATGGCTGGTGCTGGAAAGAGGCCCTTGAGTTTCATCTCACAGCTGGCGGTAGGGTG
-AAGCTTGGCAAAAAACCTGTGGTCTGTGCTGAGCTTGGGGCTGGgtgtgtgtgtgtgtgt
-gtgtgtgtCTATGGTCTTTGAGAAGTGTCTTCATCAGCATATGACTTGTGTGAGTTTTTG
-GGTAGAGAAGGCACAGCCTTCACTAGTTTCTACAAGAAGGGTGTGATCCAGTGTGCGAAG
-AATCCCTGTGTGCAGGGCTGGGAAATCAGCTTCATCTCTTCCATCCAAGAACAGCATGGC
-TGGCACGCTTATTGTGTGCGGAGTCCACGGTAGCGTCCCTAGGTGCTAGGGACAACCGTG
-AGCAGAGCAGAGTTCTTGGCTGCCTTCACAGACTCGCAGTCTCCTTCGGAAGATGAATGA
-GAAATAAAATAAACATGTAAGACATGAGGTAGGTCACTAGGTGACATGAGCTTTAGATAA
-AAACAAAGCAGGGCACCTGATTAGGAGGGTGGGCCCTACTTGCCAGACCCCTACCCTCAT
-CCCCAATACAGTGTGTATCATTGCCTGGGCAGGAAAGGGCCACACTCCTGGGTCTAGGGA
-ACTAGGTCCCTAAGTAGCCTCATGTCCCCACCCACTAGGACCCAGCCTCCAGCCAGTTCT
-GTTGCATGGGGCAGGGTCCCTGGGAAGATGGGCAGGCCTCAGACTGCTGCAACCTCTGCC
-CCTAGCCCTGAGGTGGTGGCAGTAGTGTTTCCCTCTGATAATGACATACTCCAGTCTTGC
-ATGACCACGATGCCTCATGAGCCCACAGTCCAGAAGGGGCCTGGTGAGCAGGAGCTGAAT
-TAAAATGGAAAATACGGCCTCCCTTCCCCCCTTCCTGTTCCTCCCCACTTACTCCCTTCA
-TTCCTGCTGCTCCTGAAGCCATGGGTGAATAGTTTCTCAGTCTCTTTGCCTTGCTGAGCT
-GGGTTAGTTGGGTTAGCAGGATGGACATCTCCTTATGGATACTAGAGTTAGGAGACACCC
-AGAACCAGCAGGTGGGATTTTAGAAAGTGCTGTTTGGCTCTGACCAACCCCTACTCCCAC
-CCCATGCATAGCAGGGTTAGTTTCCTCATCAACTCTGGTCTCTGATTCTGATGTTCTGCC
-CCTAAGCATCCTACATTCTAACATTGTATTCTTCTGACTTTTTAGAATTTTCCCATCCTA
-TGCATCTTACACGAATATGGTGAAGTTCTGATTTCCGCCCTTATGTTCTAGATTGAGTCT
-TCAGTATTAATTTTGTTGGGGTCTACCCATTCAAATAACAATAGAGAAAGACTATGTGCA
-GAGTCACATAATACTAGTCATGATAGTAGCAATTAACATCCTTTTGACCTTGGTTTTATT
-TAACAGTTTTTTTTTTTGAGAATTTTCTAAGCGCCAGACACCATTCTAGACATTATACaa
-ataaatagataaaaatgaataaataaataaatGTTATTTTAGAAGGTGCAATTGAAATTG
-AGAGTCAAGGCAGGACTCACTAAGAAAGTGACAATattttctttctgctttcagttatgg
-agatttgaaatctcagttgataaggtggatttatttctccttgcaggtcattcacttttt
-ccttcatgtattttgaatctctgctattgggggcataaatatttagaattgttatatgct
-catgattaactgaccttttttttttttttttagatggagagtcttgctctgtcgcccagg
-ctggagtgcagtggcgcaatctcgactcactgcaacctccgcctcctgggctcaagagat
-tctctggcctcagcctcctgagtagctgggattacgggtgtgcaccaccacgcccagtta
-atatttgtatttttagtagagatggggtttcaccatgttggtcaggctggtctcaaactc
-ctgaccttgtgatccacctgccttggcttcccaaagtgctgggattacaggcgtgagcca
-ccgcacccagccttgacctttttaatcattataaaatgaccttatctttcctggtaatat
-tctttgctctgaaacaaacattgtctgatatgaaactagctactcctccagtgttatttt
-gattactgttactttccatctttgtacttttaacttgtgtgtttacacttaaggtgtgcc
-gttttgaaggttgggtcttattttttttttttaaaaaaaacaatatttgggtcttatttt
-tttaaaaaaatccaatctaacaatctctgctttttaattgagggtatttagaccatttac
-atttgatgtgatcattgacgtggttagatttaagtctatcatcttgctatttgttttatt
-tttgtcccatctgttctttgcttcctttttcttctttttctgtcttcttttgtataagct
-cagttttttttactatttcattttaactcctccttttttattatatcgttttaccttctc
-tgttggtttattaactgtaatgttttgtttgttatcttagtagttacattaggccttata
-agcctgggtacggtggctcacacctgtaatcccagcactttgggaggctgaggtgggcgg
-atcacctgaggtcaggagtttgagaccagcttgccaatatagtgaacccctgtctctact
-aaaaatacaaaaattagccaggcatggtggtgcatgcttacagtcccagctactcgggag
-gctgaggcaggagaattgcttgaacctgggaggcagaggttgcagtgagctgagatagca
-ctactacactccagcctgggtgacagagcaagactcaaaaagaaaatcatgtaatagtat
-actttcatttccttcctggccttcttgctgttgttgtcatacatacatatgtgtgacaga
-ctccacaaaatgttattatttttgtttaaatgctaagttatctttttttaaattaaataa
-tcagaaaagattttatatatttaactcatgtagttaacacttctggtgacctccattccc
-ttatgtagatccagatttccatctggtatcattttccttctgcctgaaggatttccttta
-tcacttcttgcagtgcagatctgttggtgacaaatgcattcagcttttgtatgtctgaaa
-tcatctttatttcatcttcatttttaaaagatattttaactgggtatagaattctagatc
-ggcaggttttttctttcattagcttaaaagatgttgttgcttcactattttcttccttaa
-attgtgtccaacaagaaatctgccattatccttatctttgtttctctatactttacaagg
-cttttctttctctgactgtttttaatatttatctgtttgtcactggttttgagcaattcg
-ttcatggtgggtaatttccttcctgtttcttgtgcttgaggttcgttaagcttcttggat
-ctgtgagtttatagtttatatcagatatgaaatattctcagccattaattttctatttcc
-tctcctttggggacttcaaagacacatatattaggcttcttgaagttgttccatagctcc
-taatactcttggttttttggattctttctttttctctgagtcgtcgattttgggtagttt
-ctattgctacatcttaaaattctctaatcttttcttctgtcacatcagcatatttttcat
-ttcagacatgtagttatcatttctagaagttcagtttgggtcattttatatcttccaagt
-ctctccttaacctttgaacatgcagaccatgaaatacaatttgaatacttattttaatgc
-tcttatctcctacttctgtatcagttctgggtcagtttcaattgattgattattattctt
-gtatgggccatgttttcttgcttatttacgtgcatggtaaactttggatgccaggcattg
-tgaacattacccttgttgggtgctgtacacttttatatttctataaatctccttcagttt
-tgctctaagatgcaattaagttacttggaaacagttttatccttcctagtcttgctttta
-taatttgttgagtgggtccagagcagtgctatctgttgagggctaattatataccactgt
-tgagaaaagaccttcctgagcactctacccagtaccccagaaattatgagggttttttct
-gtttattaatatttctggttttgtgtgagtgctgagcactgttctctaatcttatcagat
-gattttcacccctacttcagtgtagttttatcatacaaaagcaccaaccagtactcagtc
-taatactcaagggggactttcttcatatctctggaatagtctctctgtgcaactctttcc
-tcccaatactgtgtcctgcaaactctgccctctttgtccttcctggactctcaactctat
-ttccttaactcaggaagcctcctgggtgctgcctgggttcctcctccctgcactaggttc
-tgaaaactctctccaagcggcaaactgaggccatgatagggttcatcttatttcccactt
-ctcagggatcatgatcctttattgcctgttgcctagagtcttaaaaattacagtttcatg
-tattttgcctggtttggtttgtttgtttgattgtttcaagcaggagagtaaattcagttt
-ctgatactccatcttgggtggaagcagaTAtgagaaggtgacatttgaacacaaacttga
-aggagttgatggagtgaaccaagaggatatgggagtggggagaggaaggagattctaggc
-agtgtgaacagcaagtacaatggtctcctgcgtgtatagctgagagtgcgggtagtgtgt
-ttgaggaaggaagggagcacgtatggctggagcagagagttatgtggggaaagtggggag
-agggagggatgaggtgtcagcttgtgtaggaccttgcaggccatggagaggattttggct
-tttacaccaaatgaaatgggagccatgggaggattttgagcagagggaggacatctttta
-caggatctctgaatcgattggattaactgaaagggataagagggcaagagagaaagccag
-agacttgctgggaaccagtgcactaagccaggtgaatgctagtgactcagacACATGAAA
-GGACACACTACCAagggggtgaataactaggagcggggatgaaggaggcttctggggtgc
-tgtcggtgtcttgtatcttgatctgagggaggttacatcatctgctcactgtgtgaagat
-tcattgagctggatgtacacgtctaaattgtgTTCACAATTGAATTGAATACATGAATAT
-ATTACTATATAAATATACTATATACATATAAAACTTAGAAAACAAAGTAgggagatgaag
-gtggcttggactagactgttatcagtggaggtgggaagaactgtatgcattctagatctc
-ttttatatgtagatccaataagatttgcaaacagatctaatgttagatgtgaagacagag
-aatagtccaggataatgtcaagttctctggctgagctacagcaaagactgaggacctgct
-gtgtaccagagcttgggctaagctctattaacttctttaatcttcatgacaattctagga
-agtaagtCTGGCAAGAGCTGCTTctgaggtttttgtggggctactgggagcctttccacc
-agaagtgtagtttgtgtgatggattccagaggtagtggtggccacctttgcctccatgag
-gttacaggctgcctgagagtgaggcctacaagaaagaaatcaaagccatgatagagagag
-agacaggatcctcacagtaacatgtcagcacctggattcagccataacagaagccagtgc
-cctgggcttctcagttatataaattaataattacttttttttttatttctttcacttcta
-actgaagagtccagactgatacaACTTCTTCATATGTGTCCCCTGTCTGCACCATCCAAT
-GGACCATCAACAGCAGCTACATCCTCTCCTTACCGTTGCTTGCTTGCtttttttgagaca
-aggtctctttctgttgatcagactggagtgcagtggcataatcacagctcactgcagcct
-tgacctcttgggctcaagcagtccttctgcctcagcctcctaagtagctgggtctatagg
-tgcttgccatcatgcccagctatttttttttttttcatagagacagggtctcactatgct
-gtctaggctggtcttgaactcctggactcaagaaatcttcctgccttggcctcccaaagt
-agtgggattacaggcgtgagccaccgtgtttggccGTCCTTACCATTTCTAATGCCTGCT
-CTGCACTTTCTCTCTCTGGACCTTTGCTCCTACAGGTCCTCCTTTCCAGAATGCCTTTCC
-TCCCTTACCTTCTGCCCTCACATCAAAACCAGCCCCCTACTCAAAGCCATCCTAACTCCA
-CCAGCTGAAGGATGGAGCTGGCAGAGTGCTTAGATATCAATCCATTTTACAGATGGGAAT
-ACCAAGGTCACTGTGAGACAGGGCAGATTTGTGGTCAGGACTCCCGCGTTCTGACTCTCT
-GAGACTCTTTCCATGATCCTCCAGGACAGCCTTTTCTGTGCCCTCCCTTGCGTGGGGTTG
-AACAGTACTTTTCACAACAATTTACActctcccataccccaacccttgcacgtgctgttt
-cctcagtctgggatgccctattccattctgtccttccggaaagggtgccacttgaacttg
-gagattcaactcaaggatcagacttccagaagccttctctttttcccagggtggctctgt
-gtcctgcctggtactcccACAGCTGCCTCTGGTACCTCCATGAACCCATTTATCCATTTG
-TTTTTTAGGTGTCTGTTTCTTGTTTGCCTCACCTGTTAGGTAGGGGAACTGAGGCAGACC
-TCCTGGCCAAAGAAGGCTCCCAACTGATGTTTGTGAATCAACATAGAGTGAGAAAGAGCC
-CCGTGGAGTGGGGCGGGGGgtggagagccagcgctgggcgtggaggcaggacgcctgggc
-tccagtccagccaccaccactctagtgtgtggcctcatgcaagtcatgtcctctccttga
-gcctcaggcttttttggcagtaaaaagggcagaacatcatagtagttaatacctcaggca
-gcctggatttgaatcttggctgtgtgactttaggcagtttactccagctctctgtgcctg
-tttcctcatttgcaaaatgggggcaataaacatatctgcatcatagggtatttgtgagca
-ttaaatgagttaatgtttacaaagctttcaaaccatgcttgcttggcacatcataTAAGC
-ATCCCAGAGTGAGAACCATTAAACAAAAGAAACCCTTCCCTTCCTGAGAGGAGAGGAGAG
-CTTGACAAACTCTAAAGTGGCGTGTGAGTGAACTATGGTCACTctcagggggtaagctgc
-ctggaaaaggctgactctgacactgactagtgtgtgtctttggagaaatcatgtcacctc
-tctgggactcagcttccccatctatcaaatggaggagttggtctagcgcagttggagtta
-aagtgctttgtctctttgagttttatgtccatgtcagtagagtgggctgagagctgcatg
-tctgtcatgcgctcctggtgagaatgaaatacgatgatgggccggacgcggtggctcatg
-cctgtaatcccagcactttgggaggctgaggcgggtggatcacttgaggtcaggagttcg
-tgaccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaattagccgg
-gtgtggtggcgggcgcctgtaatcccagctacttgggaggctgaggcaggagaatcgctt
-gaacccgggaggtggaggttgcagtggaaccaggattgagccactgcactccagcctggg
-caaaaaagtgagactctgtctcaaaacaaataaataaaataaaaaatataataataaata
-aataaatacaatgatgtctggagcacttgccagtcatgcctgccacatagcaagtaatcT
-GTCATAACTGTCACTGTTATTCTGGCCCTGACATTCCAGGGTTCCTTGAGGTGGGGCAGG
-ATGAGGGATGGGCTGGGCATCATGAAGGAAGGTGCTGATGTATCACCTACTGACAGTTTA
-GAAAAGGGAAGGCAGCCATGTGACCCACAGGCAGTGTCCCCCTGCCTGAGCCTTATTTGC
-AGGGCTGTGGCATCGGTGAGCAGGACAGGGACCACCACGCCCACTAGAGAAAGAAGCACG
-TGCTGCTTTTGTGAGTTCACAAAGGTCTTGGTTTTCCAGGGCCAACAGTGTCCCCGCCAC
-ACGTGACCACCTCAGAACCATCACCTGCCACCTGCCAGGGCCTGGGAGTTGGAATCTGAG
-Gtggaaggagagagcaggggccaactcctggctgctcccctctcttggtatgtgaccctg
-ggcaagcctctgcacctctgtcccctttgtcctctcttgtcacataatgaggttttgagt
-gtcttagatagggaggatgtcTCCCTATCTAAGGATAGGATAGGATagaaatggccaggc
-cctggtgcctctgctagctcagtctggctgggacgacctgggaagaacatggcctcagtt
-ccaaagccaaggcggctcctgggggagctgcagctggaggctgtcagcttgctgccctcc
-ttgctgctgaaggacaagctttttcttgaagataggatggataggatgtctcctatccat
-caGGAGATGCGATTATTGGCCTAGACTGGGCAGGGTCTCCACCTGGGCGACGGGTTGGGA
-GGCGGAAGTGAAGCTGGTGGCATGAACCATTCTCAGTGACCTTTCACCAGGGTGAGTGGG
-AAGTAGTTGGGAGCATCGAGGCCTCACTCTCCATCCTGAAGATGGAGCACAGACTGGCTG
-GCTGAGGCCGGGAGCTCATCACGGGATGGAGACAGATTGGCAGACAAAGAGGAGGCGGGC
-GGTTGGGGCTGGGTGCCCCTGGGGAGGAAGGCGGGGAGAGAGCGTAGGAGCAGGAGGAAA
-GAAGGCTGGGCTTATGTGCAGCCTCACAGACTGGGCCTGCAGAGTCTCCAGCTGGAGGTT
-GGGACTGGACCTTCCTCCTGAATGGGCAGGGAGGGAGGCTTGTTGGCCTAGCCCTCGGGG
-TTCTTGAAATAAATGAGGGAGGGCCTTGGGGGGTGGTAAATTGCTGAGGCTGTGATAAAC
-ATTCTCCCCTTCCCACAAAacacacacaggcacgtgtgcgtgcatacacatacacacaca
-cacCCTGGCCACACTGCTGTGCATATCTTACTGATTGTTGTCCTCTGTGAcagcagttct
-ccaagttgagtgcattggaaggatcagttaaaatgcagatttccaggcatttccatctct
-aaatgtagggtgtggcctgagaatgtgtatgtcttacaggatcctggttgatgctgatgc
-tgggggttctgggacacactttgagaaccactgCTCCATTGAGCAGCCtttcagtttggg
-tgcccctcggtgctggtgctgggagagagttaggagggcaagggggttagtgagggctgc
-tacctgtgaaacacaaagcaggagggaatggaattggccaggagagcctcagaccacagc
-ccgggcctgcagagtcaccctctaggggtctctggagtaaagattatccacagagaagcc
-ccacatggggcagaaatggccaggccctggtgcctctgctagctcagtctggctgggacg
-acctgggaagaacatggcctcagttccaaagccaaggcggctcctggaggagctgcagct
-ggaggctgtcaccttgctgccctccttgctgctgaaggacaagctttttcttgaagagag
-aCTGTGTCCCATCCACAACTGCCCCAGgcatctaccacatgccaggctctgtgcagagtg
-tttacctggatgaatgcagtttcagatcagagcaacctggccaagcaaatataatcgtcc
-ccatctaatagatggggaaaatgagggattaagtcatctgcccaGTGGTGGAGTCAAGAT
-TTATCCCCTCTTGTGCCTTAGcactcatccctgtcagcttccctgggtggtgaagaacat
-tagctccttttacacctgaggaatctgaggtgtggagaggtcagtgacttgcggtagagg
-tgggtagaggatccgggattccaaccctgctcatgccCCTCTTTTTAAATTTCAAGATGC
-TGTCCCTTGAGTACTTCTAGGGGGATGTAATGGCAGAAACTTGGGGCTGGAAGAAGCctc
-cctggcatttgacaggtgggtacactgaggcccagggaggcaaTCAGCCGTGCCTCAGTG
-CCTCTCTCTGCCCTGAAGGGGCTCCCTGTTGTGTGTGGGGTATAACCCCCCCGTAATTCA
-TGCATTCAGCACACACTGGTGGGCACCCATTGTGGGTCAGTCCCCCAAGCCAGAGTACTG
-TTGGTGAGTGGGAAGGCAGACGTGGGTGCAGAGGGTCTGTGCAGTGATTGGGGATGCACT
-GGGGATTGGAGGGGGCAGTTGACATGTGTGGGGTGCATGCAGGGAGGCTTCCTGGAGGAG
-ATAGTCTGAGAGAGGAGGAGGTGAGAAGGGTACTCAAGGATGAGAAAAGAACAGAAACAA
-AGGCTTGGAGGTGGGGGAAGTGATATTGCCTTTAGGAAATTGATAGAAAATCTGTAGCTG
-AGATAGTGTGGGGAAGGTATGGCCAGAAATGAGGTGGAAAGTGGAAGCTTGGCCTGGGGA
-AGTGGTGGAAAGCTCTGGACTTGAACCATGACCCTGGTTCTGTTCAAGGCAGGGCTACTC
-TCTGCAGGGCTCTGAATTCTCCAGATTTCCCTCTTACCTTTCCGAACTTCCTGCGGTGGC
-CAACCCCTAAAATAGCCCCCAGTAATCTTTGAGTCCTAAtaaccagtaggattttgtgga
-aatgacagagtgtgacttccaaggctggatcatagagtgtgttgcagcttctgccttggt
-ctctgggtttgatccccccggagaagccagctgccgggctgtgaagtcactcaagcagcc
-tgcagaaaggccacatggagagaaactgaggtcctgcctgcagccagcatggacttgcta
-gtcatatgactgagccaccttggaagtggatcctccagccccaggcaagccttcagatga
-cagcagcccagaatcacctagccaggcctgttctatattcctgacccagagaaactgaga
-cacactaaatgatcattgtgttgtacgtcactaagttttggggtcatttgccgtgcagca
-tcagataaTGAGGGCTTCTCTGTGCCCTTTCTTGGCTTCTTCTGTTGCTTCAGCTGCCAT
-CTGATGAAAGTCTGATGAAAACCAAAGGCCCTCCTCCAGAAAAGTTCAGGTACACCCAGA
-AAGAAATGGGGGTGCAATTTCAAAGGGATCACAGGCCATCTAAAACTAAACCTCAGACCT
-TCAGATCCCGGCCCCCAGTGGACATGGAACCTGAGTGAGGAATGAACAGTGTCTCAGTTG
-CTGAGCTGTGGGACATGGTGGCTGCTGCGGGGTCTTCAGCTTGGTCATGGCAGGGTGCCC
-ATGGCCTACATTCCTTTCTCCTCCTCTTCTCTGTGTCCTTGGCAGGCTGCCCCTGCAGAG
-GAGGACCGTGGGTGCCCAGACTGAGTAGGTAAGTTTAGCTCTAAGAGAACAGGTTGAGAG
-AGCCCATCGGTTGTGTACAGGCAACTTCTCAGCCAAGCTCTGCCAGTTGCTGGTGTTCAT
-ACTTGGCTGATGTCTCCACTTCAATACAGAGCCTGCAGGGGATGCAGGCTGTGAATGCAG
-TCCCTGGAACCAGACTGTGGGCTCagccatgagacctgggggatgtacttcaccttcctg
-acttgggcttttcaacttggaattggaggccagaagtccaccctgaagcgtggctgtggg
-gTGGAAACAGGCCCTCCAGCAGGGCAACAGCAGGGGCTCCTTGCCTGGCAGCCCCTCCGG
-TTCTTCAGCCCTTAGCCTCCCCTCTCTGGCTGTGGTCAGTGGCTGGCTCACCAGCCCCTC
-TTATGGCAGTCACTGCTCCAGAGTGCCAGGATTTCCCAGTATGGTGGCCAGGGCTGTCCG
-GAGCCCAGCACGCAGCTCAGGAAGCAGCTCAATGCAGGTGGGACGTCAGTGGGAGCAGAG
-GGCAGCCTCCCTCCCCAGACCCCTGAGGATGAGTCTGTCTCCCTCCTTGGTGCTAActtc
-tctctccttcttacatctccacttctttcttcttcctttatcttctctacctccttctct
-cttctaccttttcccttcttttccgctttttccttttttcatcttcattcttctcttttc
-tttcgtctttctcttcccctttcctcctctctttgtctagtccttcttccccctcacctc
-tccttttcctcctcttcCGTTTcataatgattaagagtatggcttctgatgtcagcctcc
-ctgggttcgaatccctgctgtgccacacactggctgcgtggcgttgggcaagccacttaa
-tttctctgtgctttggcttcctgagctgtacagtgggatgctaacagtgtctctcttgaa
-gggtGCCATGGGTGCCAGGTGAGCGTTAGCTGCTTATCATTCGTGTTCCTTCCTCCCCTC
-CTCTTCTTCTCCTCCTGGTCTTAGAAGTCTGTCTCCCTCCCTCTCTCCAAGCCCTGTGAC
-TCGCCTCTTACGTCTCTCTGCCCAGCATCTTGGGCCTGTCTCTGGCCCCTGCCCTGCTGC
-TTCATCCTCTCACTGCACGCACAGGAAGGAGAGCCCAGGCCTGGGGCCAGGTTGCCCCAT
-GAACAGTTGCTGAGCCAGGTGGCTGGAGCTCTTCCCTGGGGCCCCGCCCACGATGAGTTC
-AGGAGCTGCCTTTGTGCACCCGTGACAGCCTCTCCTGGCGCCTCATTTGGCAGAGCTGTG
-CATCTGGCCCAGTTACTGTGGTAGCCTTGGAAGGCAGAGTGCTCTGGGGCTTCCTTGTCA
-TCTACCTGCGTGACCCTGCATGAAGGGTATGCCCAGCCCTCAGCTGGACTGCCAGCCCCA
-CAGGCACCCTTGGTGCCCACCACACAGCAGGAGCTCATCCACAGATGGGCACAAATAGTG
-ATACCAGACAGTGCCTCtgagtccttgctgtgctaggcactgttctaagtgcaaattccg
-ttcatcttcacagcaacccttgcagtgggggctgttaaccccattttagagatgagcaaa
-ctgaaacacagaaaagcataggaaattgcccaaagttgaatgaatgaatgaatgaatACA
-ATGACAACTTAGGAAGGAAGGCATTTTACTGAAGagtgacaggcccacggtcacacagat
-agtaagtggaaaaaaatcagggctggaactcatgactccaaCATCACCTCCCACCTGTCC
-ATAAGCCCAGTGACAGCAAGGCTGGCACTCCCTCACACTTGGGGTTGAGGCCAGTAagag
-ctgcatttgtggaacactggccaaagcaaaccctctgtgctgagggcacttcagccagtg
-tctcaagcctgtctgcacttcttcttttttttttttttgagacagactctcactctgttg
-cccaggctggagtgcagtggcgcaatctcggctcactgaaacctctgcctccccggttca
-agccattctcctgcctcagcctcctgagtagctgggattacaggcacgtgccaccatgcc
-cggctaatttttgtatttttagtagagatggcattttgccatgttggccaggctggtctc
-aaactcctgacctcaggtgatctgcctgccttggcctcccaaagtgctgggattacaggc
-gtgagacaccatgcccagtcaactgaagttctttgagagtactgttcccattttccagat
-gaggagcctgaggcccagcgaaggcgagcaacatggccaaggtcacacagccagtaggtg
-TGATTCCAAAGTCCCACTTTCTGTCTTCCATCAGGTAGTACTATCTGCCTTCCACTATGG
-AGGGAATGTCCCATTGGGAGACGCCTAGGATGGGGGCTAAAGAAAGACAGGCAGGCCCGA
-CACCAGCCTCTCTCTCTTCTGTCTGCTGTCAACACTATATCTTGGTGCCATTCTGCCCAC
-TATTTGTAGAGAGGCCTGGGTACCAGCCTCTTCACTTTGTCCTGGAGGCCAGGCCAGGCA
-AGGATCACTGTACCCACTTttctttccttccttccttccctccctccctctctttctgcc
-ttTTTATTAAGGTATAAACCACACAAAATAAAGTACATAGagccaggtgtggtggctcac
-gcctgtaatcccagcactttgggaggccgaggGACCCCCCAGCCAAAGCCTGGAGCTCAG
-AACACAAATGCTCCCCTTGTTGAGAGTGGGGAAAAAAATCTCTTTTCAGGTGCCAGCCTT
-AAAAAGAAAGAACAAAAAAGGTAACTCACAGATGACCGTGATATGTGACGTGCATCTGAG
-CCCTTCACACAACCACAGAACTAACTGTCTGCAGCTGCCACAACAGCTGACCCCTCTGCC
-AGGCAGAGTTTGCTATCAACCAGTAACAGCTCCCAGAGGTTTTGTTATCCCTCTGTAGAA
-ATGGAGGCTTGAggccaggtgcagtggctcatgcctgtaatcccagtactttgggaggct
-gaggcaggcggataacctgaggtcgggagttcgagatcagcctgaccactatggagaaac
-cctgtttctactaaaaacaaaaaattagccaggcgtggtggcgcatgcctgtaatcccag
-ctaccagggaggctgaggcaggagaatcacttgaacctgggaggcggaggttgtggtgag
-ccgagatcgtgccattgcactccagcctgggcaacaagagcgaaagtccatctcaaaaaa
-aaaaaaaaaaaaaaaaaaagaaaTGAAGTCTTGATTGACTGAAGTAGGAGGAGCCAGCGC
-ACAGGCTTTGGAGGCAGAAGAGCTGGGACCAGCTCTGGAGGTTTGGGAACATGACTCCAC
-CTCCCCGAGCCTCGTACTGCTGACCAGATTGCTtttgcaagcattgtactacatcttcac
-acaatgctgggaggcagctgttaccaaccccatcttacagccggagaccctgaggctcag
-ggaggtaagggatgtgtgcagagacatgcaCAAAGTGGAAAAATGTGAAAACAGACCTCA
-TCGTGCAGTGTTATTGTGCAATTTGAATTGAATGAGGGATAAGAATGTGAATGGAtgcag
-tccacagtaggtgcttaagtcttgcatggggtctaatagccggtgagtggcaaaaggaga
-acttgtacccagatctgcctcaccccagagcccacctctgagcctctTCATCCATGGGAA
-GCCATCAtcagcatggtgcctggcaccgagtgagcctttgagaaagggtaactGGgtcaa
-aaattattttcagaaagttgaaaacatggatcttatacaaatgtatagtgagcacatgtc
-aaagtgttatttaactcattaaggatggaaccggtaggatggcaaagctgactcaaagga
-ggataaaatggcaaagttagctacgacataggttaatgtcttacagggcaccaaaaccat
-aagctttagcgttatttcttctacaggtcagaaatcatttgcaactcgtgcactttttac
-aagttaccaggtaactttgcttaggatcaggtgacccaggctcatcggacactgccttcg
-cttgatattgaaagggcacacagacaccctttttgtcttatttccaagttttggatattt
-tttctttaCAGTTATTATCATTCCACTTCTCTCTGACGAAAGGCTGTTCACAGGCCTCAC
-AGGTTCCCAGGAGCCCAGGGACACGCAGACCCCACCCCACCCATTCACACAAGGACTCAA
-GGACAGAGCCTCTACCCACAGATGAACTTGGGTGGTGCACAGGCACACGAGCTTGATGGC
-AGGGCACGCCCAGGCTGAAGGGGCCGGGTGGGAGCTAAAACGTGTGGTCTATGGTAGCCC
-AGCCTCTTTCCTCAGCAACCACGCCATGAAAAGATCCCTACATTATTTGTCAGGTAAAAT
-AAAGCGACCCGTAGCTAGTGGCGCGAGATTCTATCCAGCTTAATACGTGTGTATGTGCAG
-ACACATTTATGAGTGTGCATGCAGAGAAAACTCTCTGGGGAAATACCCCCTGAACTGACA
-GCCATGGGGAGTGAGGGTGAAGCGGAAACAATCTTGTAAAAGAAATTCAAAAACCGAAGC
-CCACTGCATTGTTTAAATTGGTTACGTCCAACTTGTTTTCCTGTGTTATCTGTCGCCTGT
-TAATACACACACACAAACACACACATAATAGAATGGGATAGAatatctatatatatctaa
-tatatataatatctaatatatataatatctaatatatataatatctaatatatataatat
-ctaatatatataatatatatatagagagagagagagagcgagagagagagagagagggag
-agacggagtttcgctcttgttgcccagactggagtgcaatggcgcgatctcggctcaccg
-caacctccgcctcccggcttcaagcgattctcctgcctcagcctcccgagtagctgggat
-tacaggcgtgcgccaccacgcctggctaaattttttttttttttttttaatttttagtag
-agacggggtttctccgtgttggccaggctggtctcgatctcccgacctcaggtgatccgc
-ccgcctcgacctcccaaagtgctgggattacaggcgggagccaccgcgcccggcGGGATA
-TTATATTTCCATAAGGCCCTCCGGGGGCCTGGGAACGGACTGGTGCTTGCGTGCGGGGCT
-TTTCCACTGGTTCCCTTCCGTACTCGGGCTTCCCCCGCTGTTGTTACTCCCTCAACGGGA
-ACACAACTCCACCGCCGCCTCCGGGACACACCCCCGCCGCGTGGGCCGGGGTCCGGGACG
-CGCGCTCAGCTCGGCCCCGCGGGGGCGGCGCAGGAGGGAAGGGGGTGCGGACCCCGGAGG
-CGCCGCAGGAAGCCCTCGCCCACCCTTCCCGGCCGGGCCGGGTCCGCAGCTGACGGTGGG
-GGTGGGGAGCAGACGGGCGGGGCGCCGGCCGGCTTGGGGGTCCCCTGGTCCCGTCCAGGG
-GGCTCGGGCCGACTCCGGGCCAGCTGCGGAGGCGGGGGAGGGGACCCCGCTTTCCATGGC
-AGTGCCGAGGCGGCGCGCACAAAGGCGCCGCGATCAGCGCTTCATCGGTTCGAGTCAATT
-ATCTGAGGCGCGGAGGCGGCGGGCGGGGCGAGGCGATTCCCCGGTGGGGCTGCGGAGCGC
-GGCGCCGAGACTCAGAGGAGGGGGCGCTGGGGAAGCGGCTTCTCCGTCTCCTGCTCCGCC
-CCGGGCTTCGTGGCGAGGCGCCGTCGCCCCCTGGTGGGGCCTCATCCATTCCTCGCTCAC
-TCGCTCGTTCACCTTTTTCTCAACCTTACAGCGGGTGGCTCTACGGTACGAGCTGAGGGT
-GAAGTGCTGAGAACAGGGCAAGCGGGCCGTACCTTTAAATGCCCTGTCGGGAGCTGGGCC
-CCTCTGAGTGGCCAACCTCACCAGGAAAGGGCGCTCAGCCTCGCGCTGCAGATGGACTTG
-GAAGCAGACCGTCAGAATGCAGCCCTCCCTGCACGTGATAGAGTAAGGGCCGCACAGGGG
-ATGAGGGCCCGGGGAGGCCCTTCGGGAGAGGAAGAGTCCCAGATGGCTCTCTGGAGGAAG
-TCTGGCCTAAGATGACCAGGTGAAGGGGTGGGGGTCCAGGGAGATGAGGGCGTTGCAGGT
-AGAGGTTTCAGCTATTGCAAAGGGGTTGCAGTACGGGCAAGTAAGGTGCACTCTGGGGAG
-AGTAACCTGTACTTACTGTGCGAGGGGAAGGGAGGTGATCAGTGAGGTAGGTAAGTGGGC
-CAGGGCCAGATGGCACAGGGCCACCTGCAAGCGTGGGCTGAGGGTGGGTTGTCAGGTCGT
-TTCATCATTTCCAGTTTATCCTTCTCCCCTTTAGATTTGGAGAGGATTTGGctgccctca
-cccttgtaagggtttaggcatcattcgcccttgactcctgtccagttgtctcactggtct
-ccctgtatcccttattttgcccttcaatctgcctgcacccatcctccaaaatgacctttt
-taaaagcaaagctcggtggcactacttttcaaaatcACAAATGCACAGGATCTGTAACCT
-GCTGGTTGCACATGACAGAAACCGCATAATAATCATGGGTTAggccgggtgtggtggctc
-aagcctgtaatcccagcactttgggagcctgaggcaagcggatcacttgagatcaggagt
-tcgagaccaggctggccaatatggtgaaaccctgtctctactaaaatacaaaactttgct
-gggcgtggtggtgtacaccagctactcaggaggctgaagcacgaggagaatcgcttgaac
-ccaggaggcagaggctgcagcgggctgagatcacaccactgcactccagcctaggtgaca
-gagcgaggctccttctaaaaaaaaaaagaaaataaaaaaaaaGTCCTGGTGTTAGAGGCA
-TTTTTCTTTtcctcctcctcctcctcctgctcctcctcctcctcctcttcttcttcttct
-tttctgagacagagtctccctttgtcacccaggctggagtgcaatggtgtgatcttggct
-cactgcaacctccacctcttgggttcaagcgattcttctgcctcagcctccagctaattt
-ttgtatttttagtagacatggggtttcaccatgttagccaggctggtcttgaactcctga
-cctcaggtgatccacccgccttggcctcccaaagtgctaggattacaggtgtgagccacc
-acactcagccAatagaggcatttttctgtcatgtaaataaagtctaaagcaggcagtcta
-aaactggcatggtgctctacggttcaggaacctaaactccttttgtcttattatgctacc
-ccctcagtacatggtttccacttcatggcccaacatggctgctcaaacagcagccctcac
-atctgcatccccagatggagagtctttttttttttttgagatggagtctccctctgtcac
-ccagcctggagtgcagtggcctgatcttcgctcactggaatctctgcctcccaggttcaa
-gtgattcccctgctcagcctcctgagtagctgggaccacaggcacgtgccaccacacctg
-gctaattttttgtatttttagtagagatggggtttcactgtgttagccaggatggtctcg
-atctcctgaccttgtgatccacccacctcggcctcccaaagtgctggggttacaggtgtg
-agccaccgcgcccagcccccagatggagagtcttttagtcattagaaaggagaaaggagc
-caaggagggagggaggttcccttaaagactctttcggaagtcacatacaatcttcttgtt
-gatgttccattggctaaacttgatcacatcactacactaagctacaaaggaggctgagaa
-atatgatctgtgttctaggcaccatgtgtccagatgaaaattgaggctcttatttcaaag
-aaaaagTTCAGTCCATggccaggcgtggtggctcatacctgtaatcccagcactttggga
-ggccgaggctagtggatcacctgaggtcaggagttcgagaccagcctgggtaacatggaa
-aaaccccgtctctactaaaaatacaaaaattagccgggtgtggtggcatgtgcctgtagt
-cccagctgctcaggaggctgaggcaggaaaattgcttgaatttgggaggcacaggttgca
-gtgagctgagatcacgccactgcactccagcctgggtgacagagcagaactctgtctcaa
-aaaaaaaaGTATCAGAAAAAGCGCAGTCTGGATATTGGGAAATGACCATCAGTCTATGCA
-TGctcaggagttccatgtctagcagtgtgtcctataggtttgcttaacccatgtgacatt
-tgacacgtttacaaggttattcactgcagcattgtgacagcaaaagactggaaacaacct
-aagtgtcctgtaataggggactggttaaacaaattatgggacatttatacaatggagaat
-gatggccacaaacacacatgaggaaactctcaatgcagtgatatgaaatggtatttaaga
-tgtTTcactttggaaaacagtttggcagtttcttatagagttaaacatacatctctccta
-tgacccagcaagttcacctctaggtttttgctcaaaataaaaatatatatgtatatatag
-ctccacaaggacttctatgcaaatgttcaacagagtttaacatgtgatagacaacaattg
-gaagtgacccaagatcgaacagccaatgaatggataaactggtgagtcaaatattacact
-ggagtttaaatgagtgatccaatgtctgcaaccacatggatgaatctcaaaacatgctga
-atgaaaacaagctggatacaaaaaatagcatgttgtaatgatgccgtttatatgaaattc
-tagaagaggcaaaacagaccaatctatgatgacagaaagcagagcagtggctgcctctgg
-ggtggagggatggactgggaaggagcataaaagaatttcttgggatgctggaaatgttct
-gtatcatgattggggtgttgattacacaggtgcatTTCACTGCATGTAAATTATACCTTG
-ATATTTTTAAAAAGCAGGGTGCAGAACAATGTTTAAATTATGGAATCCGGTATGTTTAAA
-AAGCAAGGAAATTTGCTTGTATCTGCATTGACTGTCTAGAAGAGACTTGTAATAGTGATT
-GTCGGTGGGAGAGGAACTGGGTAGCTGGGGGCTGGGGAAAAGGGACACTTTGGGCCATAC
-CCTGTTATACCTGTTGAATCTTAAACCAGTTGAATGTACTACCTAATTAAAAACTAAAAC
-TGAAAAGATCAGTTAGATGCACACGTGACATCACCACATTCATGTTTTAAATCTCCTAAT
-GGCTCTTCCCGGCAATCTGGACGAAGTTCAGACTCTGAGCTGTCCTGGCCTTATGTGGCC
-CCACTCAGGCAGCATCCTCTCCAACCACTTTTCTGTTCCCTGCAGAGACAGCTCAGTGCC
-TGGCTCCCTCTGGTTGGCCTAAGTGCATATGTGCCATTCCCTGAGTGCTCAGCTCCTCGG
-TGAATTCTCCCCAGCCCCCTGCCTGAGTTGGTCCCTCGGGTCTCACTGGACCTGCTGCAC
-TTTGCCTTCCCCCTTCCTCATCTATCAGATCAACACGTGTTTCCCAGAGCTCTCTGTGAG
-CTGGACCCCAGAGTCCTGGAGATGTGTGGGAGCCACTTTTATGGGGGAACCTGCTTCCTT
-GTTTCTGCTTCAGACAGCAGGCTTCTCCTGCCCTGAGACTCCCAGCAGCGTCTCCTCTTC
-CCAGGCCCAGATCTGGCCTGGGGTAGAAACTTTGATAAAATGTGCTGTCTTTAAGTTAAA
-TATGGCTCCATAAAGAATGCATTCCATGacaagaaccaacagagccctggtttcttagaa
-gatacagagaaaacacactgttgtgggagaattgtgtctgccaaaaagatacatcccagc
-tctaaccctgggacctgtgattgtgaccttatttggaaacagggtttaggcagatgtagt
-caggtcagggtgaggtaatactggattagagtgggctactccaatgactggtgcccttaa
-agagggaaacagacagaggagaacaccacgtgaccacagaggcgaagatgggagtgatgc
-atccacaagccaaagaaggccaaggaggcttgcagtcataaaagctggggagaagcgagg
-aagtgtcctcccttagggctttcagagagagcatggccttgccagcaccttgatttcaga
-cttttagcctccagcactgtgagaatacatttcagttgtcttaacctacctggtttgtgg
-ttatttgttctttttttaaattttttatttatttatttatttttgagacagagtctcact
-ctgtcacccaggctggagtgcaatggtgtgatcttggctcagtgtgacttccaccttctg
-agttcaagtgattctcctgcctcaggctctggagtagctgggattacaggcacctgccac
-cacacctggctaatttttgtattttcaatagagacgtggttccactgggttggccaggct
-ggttttgaactcctggtctcaactgatccgcctgtcttggcctcccaaagtgctgagatc
-acaggcatgagctaccgcacctggcctgtggttgttaactgtagtcccaggaaatgaata
-cacacacaaaaccagttaatacctaagacaattccagctagtggcaagtgctttggaaaa
-acaaaacaaaacaaaacaaaacaaaacaggtgagaagggcgtgggatagagagggactgg
-gaacggtgccacattagccagggtggtcagggaagccctcttggaggaggaggcatttca
-gtggagaGGAGAAGCCCAGCATGTGAGGACCAGGCAGAGGTGCTGGTGAGGGGGCACTTG
-GTGGGCGTGAAAGCTACTGGATGCAGCTCTGACGATGGAGGATACCTGACTGGGATTTTG
-GAGGAAGTCTCCAGGAATGAACCGGGAAGGGGCTATCCTCTCTTTGCCTCTGCAGGTCTC
-AGAACCTGCTGCATGGCTGCTGCAGGCTGTCCCTCGGCCTAGGCCGGCTGGCAGCCGATG
-AAGGAGGCCAGCCTCGCAGCTGACATGCTGCTCTCTAATTGTGATTAACTACCAAGTCCT
-CTCCTGCTCCGGCCTGAGGCCGCTGGTGTGACAGCTGCAGAGTGAATCAATGAGGCCAGG
-AAGGGGTTAATGGGCAGCCCCTCCATCTGAGCCCTTCAGACAATAAGGGGAGGTGGGGAG
-GCCTCTGGTGGGGGTGTGTGGCATCAGCTGGGGTGAGTGAATGGAGGGGACAGAGGCCTT
-GTCCCTGGGGACAGGGTGTGAGTGCTCTGTGGGGAGAGGGGTCAGACCCCCCTCCCATTA
-TTTTCATCCACCTCCATCGTCCTCTCCCCTCCCCCACCCAGCCAGAGCATCCCAGACAAC
-TGCCCTCTTGGCTCCAAAGTGTGCAGCATCTTCAGCCTTACGGAATTCTGAAGCAGAAAT
-TCTAAAAGCCAAAGAACTGCAGAATCGTGACATGTCACCGCTGTGGGAGAGTCCGTCTAG
-TCCTGTCATTCTGAAACTTTCTTTTGCAGTGGAACCCACAACTCCCACCCCAGCTCATTT
-CCCCCCAAAATAATAGTGCATTGATAACATTGAGAACAGACCCTGGTACCAGCCGGCCTC
-ATTCATCCTTCATTCAGCCCCGGTTCTACCACGTACAACTAGGGTAACTTGGGGGTATAA
-TGCATAGTTTATAGgtgtgtgtgtgtgtgtgtgtgtgtgtgtCTTCCCtagagacagagt
-cttgctatattgcccaggctggtcttgaactcctgggcacatgcagttctccagccttgg
-ccttctgagtggctggCTCACACCACCGTATTCAGTagttccgtaggttttgacaagttt
-gtaagttatgtaaccaccaccacaattaatatatagaacatttccatcgctgaaaaatgt
-tgcctcatgccccttgtagtcaatacccttcccTGTGTTACCTGATATGGTAGCATGAAT
-AAAGGTCATCTAGAGTTAGTGACTCTAggccgggcagggtggctcatacctataatccca
-gcattttgggacgccaaggtgggtggatcacttgaggccaggagtttgagaccagcctag
-ccaacatgacaaaaacccatctctactaaaaatacaaaaatgagccaggtgtggtgatgc
-acgcctataatcccagctactccggaggctgaggcaggagaattgcttgaacccaggagc
-tggaagttgcagtgatccgagatcacatgactgcactccagcctgggcaacagcaaggct
-ccgtctcaaaaaaataaaaaaaataaaaaaaTTAGTGAttctaatccttgaactgtgtaa
-atgttaccttatttggataaaggatctttgcagatgtaattaagaggcagaggttggagt
-gatgtggcccaaagcaaagaacaccaggaggctcccagaaccagaaggggcaaggaatgg
-attctgctctagagcctccagaggtagagtggctctgccaacaccttgatttcaaatgcc
-tggcttcagaactgaaagagaatacacttctgttgttttaagcctctcagtgtgtggtac
-ttttttacagtagtctttacaaacaaatatacctagcaaccaccatgccttgttttctat
-ctgtataagttttgcctttgcaaggatgttacatagacagaatcctgcagtatgaagctt
-ttgtgagtttggcttctttcactcagcataacacagttgagatgcatccatgctgttgca
-tgcatcagaagtctgttccttttggatgctgagtagtatttcactgctggatacaccaca
-gcttatccattcaccagttgaaaggcatttgggtcactcctaattgggagcattataaat
-aatgctgctatgaacatgtgtgtatagatctctgtgtggacatacactgtcatttctcca
-gagtagataccctggagtagaattactgggtcatattgtaagtgtatttataattttatc
-agaaattattacccgggcatggtggcatgcacctatagtgccagctacttgggaggctga
-ggcaggagaatcccttgaacccagtaggtggaggttgtagtgagccgagatcatgccact
-gcactccagcctgggcaacagagtaagactctgtctaaaaaaacccaaaaaaccaaagaa
-caaaaCTACAAAGAATCTGATgtggctcatgcctgtaatcccagcactttgggaggccga
-ggttggaggattgctggagctcaggagtctgagaccagcctgggcaacatggcaaaaccc
-gatctccactaaaagtacaaaaattagttgggcgtgatggtgagtgcctgtagtcccagg
-tacttgggaggctggggtaggaggatcacttgagggtgggaggcggaggttgcagtgagg
-tgagattgtgccaatgcactctagcctgggtgacaaagtgagaccctgcctaaaaaaaac
-cccaaaaaacagaaagaaactgacaaactgttttccagtgtagctataccattttgcatt
-ctctccagcaCTTAGTATTGTCAGGTTTTTAAAAATTTAGATATTTTAggccaggcgctg
-tggcttatgcctgtaatcccagcactttgggaggcagaggtgggcggatcacttgaggtc
-aggagttcgagacgagcttgaccaacagggagaaccagatacttgggaggttgaggcagg
-agaattgcttgaacctgggaggcagaggttgcagtgagctgagatcacaccattgcactc
-cagccctccagcctgggcatcaagagtgaaactctgtctcaaaaaaaaaaaaaaaTTAGA
-TATTTtaataggtatgtaacaatcatagggttattgtgagaatgaaatgaacatatctga
-gaatactgcctagcacatggCTCCTGGCTTGGAAGGGTAAGCTCCTCTTATTGCAATCAC
-TATGGGGTTATGTCCTGTCCAGGACAAAACCAGAGGTGAAAACTCAAAAAAAAACTCAGG
-TGGGCCAGGAGGAGGCTGTGGGGACCAGTGAGCTCATGTCCCATCttgaaggtcaaggtc
-ccgggaagcagctcctgagatggaaatctgcatgtgggtggttttccaggtagtgctctt
-aggatcttggaggagccagggaagcaggctcgggcagttgcaatagaggccttgaccagt
-cccatcaggagctgggccagcccttaggacatgtcacagcctgagacagggaggtcatgc
-ctctgtactctgcaagatcagactttggagtggttgcccacaggagagatgttattaata
-tcttgggtgaagcagcccttttaagctgGTGCCTTGATCCGGGTGATGGCTTTGAGGTgg
-aaaacaagcctgagtggtttcagctttcaacttttcaagagaagctatgtatctagattt
-tgatgttaactctccaaacttttttaaaatgctggaaattctagacttttcaaacctgct
-gtgaggggctcacatgccaggcacaagggctggagggggcctgaggctgcctgtCGATGC
-CCCTTGATATAAAACCAggctgggtgcagtgccttatgcctgtaatcccagcacttcggg
-aggccgaggtgggtggatcacttgaggtcaggagttcgagaccagcatggccaaagtggt
-aaaaccccgtctctactaaaaaatacaaaataataataataataataataataataataa
-taattagctgggtgtggtggctcacccctgtaatcccagctactcgggaggctgaagcag
-gagaattgcttgaacccgggaggcggaggttgcagtgagccgagatcgcgccattgcact
-ccagcctgggcaacaagagcaaaactctgtctcaaaaacaaaacaaaacaaaaacaaaaa
-caaaaaAGGAAAACCAAACAAAAAAACCCCCAAAACCTGCTGTGTCATCTGACATCACGC
-TAGTgtctggttgccgcactggagaggacaccccatggggcaggaatctttgggttttga
-tctccaccacatccccagcatgtagggcagggtccagGCCTGGATGCAGCACGAGAGAAG
-GAACGCAGGGCCCGAATGAGTAATTTGCCTCAGTGTGCAGGTCATTTAATTGCAAAGAGA
-GGAAAAACGACAACCAAaaacaaccaaatgaaaaaatgagcaaaggatttgaatagacat
-ttctccaaagatgtacaagtggccaataaacagaggaaaagatgctcagcgtcagtaatc
-attagggagatgcaaatcagaattgcaagcacgagataccgcttcacacctattaggatg
-cctattaaaaaacaaaaacaaaaaACAAAACAAAACAAAAAAATCAggcagagtgctgtg
-actcacacctgtaatcccagcactttgagaggctgaggtgggcggatcacctgaggcagg
-gagttcgagactagcctgaccaacatggagaaatcccgtctctactaaaagtacaaaatt
-agccgggcgtggtggcgcctgcctgtaatcccagctactcgggaggctgaggcaggagaa
-tcgcttgaacccaggaggtggaggttgcagtgagccgagaccacgccattgcactccagc
-ctgagcaacaagagcgaaactccgtctcaaaaaaaaaaaaaaaaaaaaaaaaaTCGCAGA
-Tctgactgtgtgaccttgggcaagttgcttgacctctcagtgcctccatttcctcctctg
-taacgtgagagtaaaaatactactcatacctacctcgtagggctgtcatgaggactgaat
-aagtgcataggtacagacatgcttaggacagtatcagcacatgcaggaattacatgggag
-ttggctgttaATATTATTACAGGAGTggatcaaatccatctctgccatggacttgctgtg
-tgacctagtgcaggtcactttgcctctcttggtccagttttctcacttgtaaaatgggac
-catactgccactctccatagggcaagtgtgcggattcgaggagctcatatgtgaaaggcC
-TCCTTCAGGCGCAAGGTTGGTCCTTGGTTATGCACGTATGTGAGCCTCTTGGCGTGCCTT
-CATATGTGGGGCATAGGCAAGCACTCAAGTGGCCTGGACTCCTATCTCGGCTCTCAATGT
-CCCCGCTTCCTGGCCTGGGATCAGCAGGACCTCAGTGGATCCACCATCCAGGCACATCCC
-TTTCTTTCCCTGCTTTTTTCCTGCTTCTTGGGCGGCACCACCACCTACTGGCCTAAAGCT
-ACATTGCAGCCAATGTGCACAGCGGGGCGGAGGGAAGGGAATATGGCCTTGGGCAGCTGC
-TGTGCGCAGAATATTTACCTCTGTACACGCTTAGGGTGCTGAGGCTTAGGGAGCTCACAC
-GGAGAGAGCCAGCTGTGAAGCTGGGGTTAGAATCCCTGTCTCCCTTTCACCTCACTCCAA
-ACACCCTCTTAGAATGGGAACTCAGTTCAGGTTCTGCCTTGGGCCCTAGACGATCCACCC
-CTCCCTTCTGAGCAGGGAGCCAGGAGCTGAAGTCCAGGGTCCTTGGAAGTATGTCAGGGT
-TGTCCCCCCAGGGTCCTGATTACAGAAGAAAGAACACTGGACTCAGAGTCCAGAGGTTGG
-GGGTCTAGCTTTGCCTTCCCTATCCCCAACTATCAGCAAAACAGCCTTTGGAAAATCCTC
-ACCCATTTATTCTAGCACTTGTCATTTCGAAATATATTTACTGTGGGAGAGCATTTAATG
-TGAGTGTTAGGTTCTAACGCAAGGAGAAAATTATAAAAATAAACAAAAACTTTTAAAGAA
-CTCCTAAAAATCCTTTAAGTCACTCATAAAGTATAATATGGGCAGTTTTCTAAATATAGT
-CCTTTGCAGCAATAAATGCACGGACCATAAAGAACAGCAGTATATGGTGGTGATTGCATG
-CATTTGCGAACTGTAATTTTAGGTTCTGTTCTCTCTCAGGGGTGTGTGGGATTCCGAGCT
-GTGGATCCACACCCCCACATCTCTCTCACAGCTGGGATCATGTCCAGGCAGAATCGCCCA
-CATTGTGTACATCATTCTCCCTTCTCTCTCTCTTTCTGAGCGCACATAGCTGCATTTCCG
-AAGTTACATAATaaaaacagctaacatttattgagctttcattatgtattaggcctgctc
-gcagccctttgctcacgcattaattcattaattcagataatcctcctaagaatgttatga
-ggtaggtatattattatctcttctctttacagatgaggaaactgaggcactgaatggtta
-agtaactagcccaaggtcaaatagTGTACCACCCAGCCCGAAGGCGTTCACCTTgttccc
-gggtaggatcgcagaactggttaagctaggttaccgatccgggtggtgtcagctgatccc
-tcagctgctgtagtgcaagatctgcaaaatatctcaagcactgatcttaggttttgcaat
-agtgacactgtccccaggaacaacttggggaggttcagacccttgctgtcagaggctgca
-cagcccctaaaccttgatttctaatcttgtagctaatttgttagtcttacaaaggcagac
-tggtccccgggcaagaagtggatcttttcaggaaagggctattgtcataatttcctcagt
-tacaatttttgcaaaggtggtttcaatagccagtgagtggtacagcctgaatttgaaggc
-aggaagtccgggacgagaacccacactcttgactggcatactTGCCACCTGAATGGAGGC
-TCCATAGAGCCACGCGTGCATGCTTGTGTACCTGTTGTCAGCCCGCAAGCTCCGTTAGGC
-AGGCTAGAACCTGATCCAGGTTAACTTTGCATCCTTAGTGCTGGTTCTTTCCATCCAGGG
-CCCCACTCAGGGTATATGCTCAGTGACTGTTGTACAAATGCATAAAGCTCAGTTTGCATA
-AAGCTCACTTCAGCTTCTGTATCTGTAAGACAAGAATCAGagccaggcacagtggttcat
-gcctataatcacagaactttgggaggctgaggcgggcggatcacgaggtcaggagttcca
-ggccagcctgtccaatatggtgaaaccccgtctgtagtaaaaatacaaaaattagccagg
-tgtggtggcacgcatctgtaatcccagatactcgggaggctgaggcagaagaatcacttg
-aacctgggaggcagagtttgcagtgagccgagatcatgccactgcactccagcctgggcg
-acagagcgagactccatctcaaaaaaaaaaaaaaaaaaagaaTCGAAATCAGCTCTTCAG
-ATTGCTGGAGGCTCCGACAAGCCCATTGGTGGGAAAATTCTCTTTAAAGACACTGATGTG
-ggctgggcacaatgactcatcctgtaatcccaacactttgggaggccaaggtggatggat
-cactagaggtcaggagtttgagaccagcctagccaacatggtgcaaccttgtctctacta
-aaaatacaaaaaattagccaggtgtggtgacatgaacccataatcccagctactcgggag
-gctgagatgggagaatcgcttgaacccaggaggcggaggttgcagtgagccaagattgca
-catctgcactccagcctgggcgacagagcaagactccatctgaaaacaaacaaacaaaca
-aaaCACtgatatagtttggatttgtttcccctcccaaatctcaggtggggttgtaatccc
-cagtgttggaaaaggggcctggtgggaggtgattggatcttgggggcaaacatccccctt
-gctgttcttgtgatagtgaatggattcttacgagatctgcttgtttaaaagtgtgtggca
-cctcctcctaccccgctccagccatgtagaacgtgcctgcctccccttcgccttctgcca
-tgattgtaagtttcctgaggcctccccagtcatgcttcctgtacagcctgcagaaccgtg
-agccaattaaacttctttttttaaatgaattacccagtctcagttcattataccaatgtg
-agaacaaacgaatacaGACACTAAATTCTCCTTTGCCCACCTCCTGCTTGGTCCCTTCTT
-GAATTTTCAAGCTGCTCAACCAAGTggcctgcaccagcttgggagagctaatcgtgtgta
-tctgtacccaactctacattcagtaacatcatgtttgtagctcgaaatcagcaatggtga
-gtatttacactatggcaattggcaaatgcttcaaacaggagttttcccctctagagatgt
-taaacgtttgccagGAGGAAATCAATCCTCTAATGGCCACCTTcaaggaggcaacacagt
-ggagtgatcatgcttgttggctctggagccagaacacctgggttcaaagtccagctctat
-cacttaccagctgtgtgaccttgttcagttacttaacctctctgagcctcattagtctca
-ttcatgaTTACGTATTTCATTGGGGACTCAATGCCATCTTCCATATAAGTGCTCTCTCAA
-TTAATGTTATATATTAATATTATCAATCAGCTTAAGAGGTGGGGAAACTTTCTTGTTTTC
-CATCCTAGGAAAGGGAGTGCTGAGGACAGGACTTGCAGTGTCAAAAAGGAACCTCAAAAA
-CGGCAATGTGTAACTGCAGGTCTGGGCCATTTTTGAGGGTCTCTTGAGCATTGGCAGACC
-AGATCTTTATGCCAACACAGGTTGTGCGTGTGGGGGTTAGAGGAGGAGAGGCCTTCTCAG
-TTCTTTGCAGGAAAGGCTACTGTTAGCTCTAGAGCCCAGAACAGATTTAGGGGGAGAGAT
-GATCTAACCAAACTTTCCCTCTGCCCTCGGCTTGCCAGTCTTCTCGCTAGTGAACACTCC
-CAGTGTGAGGTAGAGGGTTCCCTGTTCCACCTCCTTCCTCCCTCTGTAGAGGAGGTATGC
-ATTGGGGCAGGTGTGTGTAAGGCCCTCCTGGGGTACCCCTCCAGGGAATCTTCCCATCTT
-CTCCAGTACTGCCCCATCTGACATCCTGCCTGAAGCCACAGGTTTCCCTTGCAATCACTA
-AAGAAGCAGGAGGGAACCAGCAGAACTCCCTGCCCATGTGCACAGGAGGTGATCCAGAAA
-CTTCAAGGGGAAAAATCCTGCTCTCCACCCCAGCAGGCATTGATTTTTGGCTGCGAAGAT
-TACAGtctctctctctctctctctctctctctctctctctctctctctcacacacacaca
-cacacacacacacacacacTCCTGTGTGCCAGGAGGTTCCTAGAAGGTCCTCACTCCTCG
-CACTCAGGTGCTCCAGGGCTAGCCCACTCCTGGGAGGTGCCCACAACTGACCACGATGCC
-CACAAGACTGTGGGAAGGGTTGCCCCATGTGCCTTCGTGCCCCTCCCACTGGATCCCAAC
-gaaggctcttttcacaacaggaatcagagcatgtcactcccaacctgcctaaaccctcca
-atggctcccaccacttttgatcaagacctaaatcctttctgagtccaccccatccttaca
-gggtctaaccttgcttccatccctgtcttcaccccttattcctccctctgggctcctctt
-caggcccttgaggtgccaagctcactcctgccctgggcctttgctgctgctgtccccttg
-gcctggagcactcttcccTGTCCTTTTTGCCCATGTGAGGCTGAGAGGCAGACGGAATCA
-TGGTTGCTAGTGTAGAgaggccacactactggagtttgtatttcagttctgtcaccttga
-actgggtgacctcacccatctctgcctccctttcctccctctatacagtgggaaagataa
-tagcacctacatcttagggtgttgtgagactgattgagataatCTGTATGGTTTTtggca
-gtttctgaaatgcactgtaaactgtctggttctcctcccatcggaaggtgagaatctgac
-tgctccccttgactctgggtgagagggtagggcaacagcaatgctccatgatttcagagg
-ctgggtcataaaaacggtctgcaggggattcacttccagaacagtggagtgaggaacact
-gcagactgctttctggtgaaaacaactgatgatgatttctaaaaaacaatcatttgaagt
-ctctggaaattgtcctaagagcatacagcaagtgaagaaacacttattcaagaaaatcta
-ctaaatctaggtaagaacagtgagtttgtagaacttgagacacaatccactctctttctc
-ccctccattccattttactgttatggaaactcaactgtgagcagccagggccaagaagat
-gggagtcatttccccccaagctcctagtcgatggggtacagcatctccccaggaagggaa
-ggctgccagcatttgtcatcctcccaacagctatatcttacagaggctaaactccaggta
-ggtgtggctgggagactgggatcttccttcctctacccagtccccactcatagggtggtg
-gccacgccaagtgcagcaggctaaaaatattgaagccccagttgcttttgtcttagctta
-cttgttaaagcagaggttccatgcctggagatgcaagctgagaagaccagagactaagaa
-tactgccccaactcagccctgctcataaagcaagaaggttactctgggagaagtgaactg
-ttgtccctgcctccagctccagagcagtgtcacagatgctttgcccaagagagaggcagg
-tcataacaacacagatctttaaagttgtccataaaggaactgactttctttagaacagag
-tatgcagaaatttaagcctaagagtgccctcagaagcagtggcgattttggtagtgatca
-gggacccaaagttgctatactatatcatcttaaatgttcattttccagcaaagaatttca
-agacttgcaaagaaataaacacatgtgacccatacacagggaaagaccagtcaacagaaa
-ctacctgtgagagtgctcagaggtcagacttgcacggacttcaaagcaaccactgtaaat
-atgttcaaagaaataatggaagccatgcttaaagaataagggaaggtaggctgggtgcag
-tggctcatgcctgtaatccccgcactttgggaggccaagaggggtggatcacctgaggtc
-aggaatttgagaccagcctggccaacatggtgaaaccccatctctactaaaaatacaaaa
-attagctgggcatggtggcaggtgcctgtagtcccagctactcgggaggctgaggcatga
-gaatcacttgaacccaggaggcggaggttgcagtgagctgagattgtgccactgcccttc
-agcctgggtgacagagagagactccatctcaaaaagaaaaacaaaaacgaaaatcaagaa
-taagggaagcggtgatgactgtgtctcatgaacagagaatgtaaacaagaagatactatt
-ttaaaaaacttaatggaaattctggagttgaaaagtgcaaaagaaaaattcactagaggg
-gctcaacagtagacttgagccagcagaaggaagattcagtgaatctgaagacagatcaat
-agagatttcgcagtctgaagaacagagagaaaaatatgaagaaaaatgaacaaagccttg
-gagaaatgtgggacacagctaggtgcaccaacatatgcacaataacatatataacagaag
-gagagcaaagagagaaaggaacagaaaaaaatgtgcaaaaataatcactgaagcctttgc
-aaatttgatgagaaacatgaattatgcattgaagaagcttaatgaactccgagtagaaca
-aatgcaaagtggtcaacaaccagatacataaaaggaaaatgttgaaacccaaagataaaa
-agaaaatcttgaaagcaacaagagaaacacagctcatcacatataagggaacaccaaata
-agaccgacagcagatttctcatgtgaaacgatggaggccctaaggcagtgggacaacata
-ttcaaaatgcataaacaaaaactaccaagcaagaatcttacatccagcaaaattatcttt
-caaaagtgatgatgaaagagatatttccagataaacataaactgagaatttgttgccagg
-aaacttaccttacaataaatactaaaggaagttcttcagacagtaatttgaatccacaca
-cacaaaagccaaagtgctctgggaaaggcaagtagatcgttatgaaaggcagtaagaatg
-catatttattcaccttctcttaacagatttttaaaaataatttgtatataattgtattgt
-ggggccaagacatatagaaatgtaatatattttgataataatagcacacaggaggtgagt
-gggagcagagctgtattggattaagaaagtgagaccagatgggaactggaatccacagga
-acaaatgaagagaaccagaaattataagtaagaaagttaataaaacaaagtcttttaata
-tatacttgctctcctttcttctctcagcttcttcaaaagacataaaactatataaagtaa
-taattataacaaagtactgttggttttgtaacatatgtagatgtaatacatataaaaaga
-atagtgcaaagaggaagaagagagaatagtgctatataggagtcaccgggcacggtggct
-cacaactttaatcccagcactttgggaggccgaggcaggccagtcacttggggccaggag
-ttcaagaccagcctggccatgtatctctacatataatagattgaaaccatgtatctctac
-gtataatacaaaaattagccaggtgtggtgtcatgtgctggtaatcctagctactgggga
-ggctgaggagaattgcttaaacccaggaggtggaggttgcagtgaaccaagatcacgcca
-ccacactccagcctgggcaatagcacaaaaatctgccaaaaaaaaaaagatagaaatata
-taggagtaatatttctatatatcactggaattaagttactgtaaatctgaagtcaattct
-gataagttaaaacctatatagtaagcctaaactggtcattaagacaaacaaacagaacag
-tgaaaaagctattaaagaaatttaaggctgggcacggtggctcacacctgtaatctcaac
-actttgggaggctgaggtaggtggatcacctgaggtcaggagttcgagaccagcctggcc
-aacatggtgaaaccccctccctactgaaaatacaaaaaattaggtgggtgtggtggcagg
-cacctataatcccagctacttgggaggctgaggcaggagaattgtttgaacctgggaggt
-ggaggttgtagtgagccgagatcatgccattgcactccagcctgggtgacagaatgagat
-tctgtctcaaaaacaaaaacaaaaacaaaacaaacaaaaaatccaaaaaacagaaattta
-aataatacactagaaaatattcgtttagtgtaaaagatgtcaaggaagaaaagaggaaca
-aaaaagacatgagacatatagaaaataaaaagtcaaatgacagacataaatccaacttct
-ctcaatgatagcattaaatgtgattggatcaagtcaaaagggagagatttcctgactaaa
-taaaaagccaagatcaactatatactgtgtgcagaagatacactcaagattcaaaggtta
-aaagtaggttgggcgttaaaggctgaacaaaatatatcacgcaaacagcaaccataagaa
-aacttgatttgctatattaatatcaggaaaaagactttaaaatgaaatatgttacaaaag
-ataaagaggaacattttataatggtaaaaggatcaatcgatccattgggaagacataaaa
-attatagacagatatgcccctaacaacaaagccccaacatgtgtgaagcaaaaacagaaa
-gaattgaaggggcaaatagacaattcaaaaataatatttggagacttcaaaaccccactt
-ttaataatgaatagaacaactaaacagaagactaaagaaggcaatagaggctgggcgtgg
-tggctcatgcctgtaatcccagcactttgggaggcccaggcgggcagatcacctgaggtc
-aggagttcgagaccagcctgaccaacatggagaaaccccgtctctactgaaaatacaaaa
-ttagccaggtgtggtggcgcatgcctgtaatcccagctactcaggaggctgaggcaggag
-aatcacttgaacctgggaggcagaggtttccgtgagcccagatcacaccactgcagtcca
-gcctgggcaacaagtgcaaaactccgtctcaaaaaaaaaaaaaaaaaaaagaaaaaaaaa
-agaaggcaatagaagacttgaacaacactaaaccaacaagacctaaaagacatctataga
-acatttcacacaacaacaagataatacacattcttctcaagagtacgtgaaaaattattt
-aggacagactatatgttagaccacaaaacaaacatcaatgatttttttatcttttatttt
-tttttttaatatggagtcttgctctgttgcccaggctgaagtgcagtggcatgatctcag
-ctcactgcaacttcagcctcccgggttcaagcaattctcgtgcctcagcttccagagtag
-ctgggattacaggcacccaccactatacccagctaatttttatatttttgtagagacagg
-gtttcaccatgttcgctaggctggtcttgaactcctgacctcaagttatctgcctaagtc
-ggcctcccagagtgctgggattacaggtgtgagcaaccgtacctggacaataaattttaa
-aagattgaaatcatacaaagtaccttctctgactaaaatggaatgaagctagaaatcaat
-agaagaaaaccaagataattcacgaatatgtgaaaattaaaaacacactcaaacaactaa
-tgtgtcaaaatagaaatcacaagggaaattggaaaacaccatgagggaatgagaataaaa
-atataacataccaaaacttacgtgattcagtgaaagcagaaaaatttatagctgtaaaga
-cctgcactaaaaagggagaaaggggccaggcgtggtagctcactcctgtaatcccagcat
-tttgcgaggctgaggcaggcggatcacttgaggtcaggagtttgagaccagcctggccaa
-catggtgaaaccccatctctactaaaatataaaaattagctgggtatggtggcacatgcc
-tgtaatcccagctacttaggaggctgaggcgggagaatcgcttgaacgcaggaggcagag
-gttgcagtgagccgagagcgtgccactgcactctaacctgggtgacagagtaacactccg
-tctcaaaaaaataaaaaataaataaaaaaatttttttaaaaaggagaaaagtctcaaaac
-aaccacctaactctacaccttaaagaactaCAGAaagaatacaaaaattagccgggcatg
-gtgatgggcacctgtaatcccagctactctggaggctgaggcagagaatggcatgaacct
-gggaggcagagcttgcagtgagctgagatcgtgccactgcattccagcctgggcaacaga
-gcgagactccgtctcaaaaaaataaataaataaataaaaaataaaaagaactagagaaag
-aagcacagactaaacccaaagctagcagaagaaagaaaataattaagattggagtggaag
-taaacaaaatagagtatagaaaaacagtggtaaaaaaatcactgaagctgggcatggtgc
-cacatgcctataatcccagcactttggaaggcagaggcaggtggatcacttgaggccagc
-agttcaagaccagcttggctaacatggtgaaaccccatctctactaaaaacacaaaaatt
-agctgagcctggtggtggacacctgtaatcccagctatgcgggaggctgaggcaggagaa
-tcacttgaacctgggaggcagaagttgcagtgaactgagatcatgccactgcactgcagc
-ctgggcaacagagcaagaccctgtctcaaaaaaataaaaaataaaaaaataataaatcaa
-agaaacaaaaaattgatcaatcaaattgacaaacctttagctaaactggctaagaaaaga
-agattcaaattactaaaatcagaaatggaagttcggacagtactactgaacttacagaaa
-taaaaataattataagaaaatactatgaacaattgtgtaccagcaaattggagaacctag
-atgaaacggacaaattctggccaggcgtggtggctcacgcctgtattcccagcactttgg
-gaggcaaaggcaggcagatcacaaggtcaggagattgagaccatcctggctaacatggtg
-aaaccccgtctgtactaaaaatacaaaaaattagcctggcatggatggcacgtgcctgta
-gtcccagctactcaggaggctgagacaggagaattgcttgaacctgagagatggaggttg
-cagtgagccgagattgtgccactggactccagcctgggtgacagagcaagattctgtcaa
-aaaaaaaaaaaaagaaagaaaggaaagaaagaaagggacaagggacagattcctagatac
-acatgatataccaaaactgagtcatgaagaatggaaatctttatagacctgtaatgaagc
-agtgatcaaaagccatccaaaaaagaaaaacctttgacaagtccctggtgaattctacca
-gacatttaaagaagaactaacatcaatctttctcaaactcttccaaaaaatttaagagga
-gggTCGGGGGGCTGGGAGATCCAACATGACctcatccacatgactggcaattggtgctga
-ttgtcagcaggaatgtctgtgttctcctccttgcggtcactcttgctctgttaggtcaga
-catcatcccttacatagaggcccaagggtccaacggtccaagtccaagactgaagctgca
-aggtctcttgaggcagaggctctgaaaaccacatgatgtcacttctgtcacacgctattg
-gtcaaagcaagtcacatgcctcactcagcttcaagtcagtggagaaacagactccacctt
-ggatgggaagaatagcagagtcacattgcaaaggggtgtggataagggttgggaggaatg
-tgtagccattaatttacaCCAGATAATGTGAGTGTTTGCACTTTACAAGGTCCACAGGTC
-CACtgatacagtttggctctgtgtccctacccacatctcaccttgaattgtaataatacc
-cacgtgtcatgggagggaccccatgggaggtaattgaattatggggcgggtttttcttgt
-gctgttctcgtgataatgaagacatctcaagagatctgatgtttttatcggggggagttc
-ccttgcctgccaccatggaagatgtcccttgactcttccttcatcttcagccatgattgt
-gaggcctctccagccatgtggaacagtgagtccactaaacttgtttcctttataaattac
-ccagtctcaggtatgtctttattttattttattttattttattttattttattttatttt
-attttatttttgagacagagtcttgctctgtcacccaggctgaagtgcaagggcaccatc
-tcggctcactgcaacctccgcctcccacgttcaagagattcccctgcctcagcctcctga
-gtagctgggactacagtgcacgcctccacacccggctaatttttgtattttagtagagac
-agggtttcactatgttggccaggctagtgtcgaacttctgatctcatgatccacctgcct
-cggcctcccaaagtgctgggattacaggcatgagccaccatgcccggcctcaggtatgtc
-tttattagagcgagagaatagactaatacaTCCACCAACCCTAGGAAGTCAGTGGAAGGG
-TATTTCCGTATTTCATATGGAAGTCATTTCCATATGAAAATTTAGCCAGAGGATTTCATG
-CTGGTTGTCTGAAAGCCAGGAGCTTCTAAAAAACTTTCAGGGTAGCTGTCTAAGCATGac
-ctcatgtcatcctgttgtgagtactaaattagttaattcaggggaggcactcagaaaagt
-gAAGAAAGGGAAATCTTTCTTATATAAATCTTAGAAATCTCATAGAAATCTTAGGAAAgt
-gcctggcgtgcagtaaacacgtgatacatttcagttgttattatcttcacaataattttt
-ttgggtcaggcttgttattttccctgttttacagattaaggggcagagactcagagatgc
-gcagtaagtcgcctgagggttacgcagcaaataagcagggaagccagatgagaacctaCA
-TGACAGAGTCACCCATGTGTGAGACTCCAAAGCCTCATTCAGGTGCACAGAGAGGCGGTT
-GTGAGGACGttcactgctgcgttgccttcagtagcttaacatcagaaacagcgcagatgt
-ccaccaacaggggccacccagtaaaccccagcatgcccagccaaggagtgctttgtgctg
-gttacaagaaatgaggtcacgctatacataggacatgggatcatctccaagacattctgt
-tcagtaaaaagaacaTCTGAAAAAAAAGTTCCATAACCCACAGAAAATACTGCCAAATAT
-TCCAAAAAATCTAAGTCCAAGTGTGTGTGTATGTGACCTCTGGAGGCTGATCTGAAGCAA
-ATGTAGGTGAATTAAACAATAGGATCTATTTATAGGACTCTTCTTTTCCTACTTTTCTTT
-ATTTTTGTTGGATTTTGAAACATGTTCAAAGAAAAATTCAGAGTACAATAAAGTACCagt
-cgggcatggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggacca
-cctgaggtcaggagttcgagatcagcctggccaatatggtgaaaccctgtctctgctaaa
-aatacaaaaattaggtgggtgtggtggcaggcacctgtaatcccagctactcgggaggct
-gaggcaggagaattgcttgaacccaggaggcaaaggttgcagtgagctgattgtgccact
-gcactccagcctgggcgacaagagtgagactgtgtctcaataaataaatgaaagaaagaa
-agaagaaagaaagaaagaaagaagaaagaaagaaaagaaagaaagaaagaaagaaagaaa
-gaaagaaagaaagaaagaaagaaaaagaaaaagaaccaagaagaaaaaataaTCACCGGA
-GATTCCtcccctcccctagagctaactaggctaacattttggtatatatctttccagtcc
-ggatcctgtgtgactgagtgtgtatatgcatatgtattattttCAACTGTtggctttctc
-cttgtggtccaagacagctgctccagatttagccattacatctgtttcctgccagcaaga
-aagggaaaatgggaagtagagggccttttaagtatacaacctagaatttacacacattat
-tctttatcacatctcatttctctaaatgtagtcgcatggccatcctggccagaaggaagc
-ctgggaaatgtggtctttcctctgggctgccttgtgcccagtgaaaagtcaggggttcta
-tgactatgaaagaaacaggagaatggatattgtggcaactagcagtGCTATTCACCTTTA
-TTCTCTCAATGGTAATATTTTTCCCCATCAAGAGGGGAAAATTTGTGTCTTACATTCTAA
-CCACTGAACTCCGAGAGAAGACACTGGCCTGTGCCAttctcttgcgatggagtttcgctc
-tgtcgcccaggctggagtgcagtggggtgatctcagctcactgcaacctccacctcctgg
-attcaagcaattctcaggcctcagcctcccgagtagctggaattacaggcacctgccagc
-acacccctttttagaccacatagggtagcttccgactgttgccatggcatttgtgaattg
-tcatgtgctggtgggagtgtctcttagcatgctaatatattataattagcatatatatta
-taatgagcagtgaggaggaccagaggttgctttcatcaccatcttggttttggcgggatc
-tggccagcttctttactgcatcctgtttgttttatcaataaggtctttgtgacatgtacc
-ttgtgAAACCAGTCCTGCCTAAGGGAGCGGGGCTGGCGGTTGTTCAGAGTGAACAATTCA
-AAGTCAGGTCCTCCCTCTTGGAGCTCAGAGACTTGAAGAGCAAGGACCACTGTCAGGACA
-CAACCCCATTTGCAAGGCCGGGGACACACATACAGACCCACAGGCCATTGTAGAGAAAGT
-GTTAAAAGATGGAAGTCAAGCCACGGCCACTGGAAGTGGTGTGCCCTGAGAGGCAGAGGG
-TTCTCCCTAAGCCAGGGAAGGACAAGGCAGGGCAAGACAGAAACTGGGCCTGGGGCCAGG
-ATTCCTGAGCTGGGGCTAGATTTGCCCAAATCTAGGGCAGGGCTGACTGGGTCAAGCACA
-GCAGGGAGCCAGGGTGGGTCGATCCCCCTGCCACAGGCTTCACTCTTCTGGCTCTGGTTT
-CCAGGCAGTTCTAAAAGCCTCCCAGTggcccagtgcagtggctaacgcctgtattcccaa
-cgctttgagaggccttaggcgagcagatcacttaaggccaggagttcgagaccagcctga
-ccaacatgtcaaaaccccgtctctactaaaaatacaaaaattagccaagcgtggtggcag
-tgcctgtaatcccagctacttgggaggctgaggcaggagaacccaggaggtggaggttgc
-agtgagctgagattgtgccactgcactccagcctgggtgatagagcaagactgcatctca
-aataaaataaaataaaaaaaTCAAATCAAATAAAATGTCTCCCAGAATACACCACCCCAG
-CAAAATGGCAGGAGGGAGTGTCACCTGGGGACCTCCACTTTGGAGGTTTGAGTGGGCAGC
-TTTAAGCTGGAACAGTCACTCTTGCTGTGGGTTCTCAGGGCGGAGACTGAGCCCCCACCC
-TGCCTCCTCAAATGCATTTCCTCTCAGCTCCCACCTGCCAGCCCAGGAGAGAGGGAGGGC
-CATTCTGTCCTTTTCCTGCAGAGTCCCTTTGTTCAGTTGGTGACCAACATCCTGAAAAAC
-ATTCTCAGGAGATCAAAAAGAAGAACATTTTGGTCTATGTGGTAGGTTGGCCCAGTGCAC
-CACGCCCAGTGCAGGTCCCTCTTGAAACCACCTTTGGGAAATTATGACTGAgacaccacc
-tttgcaaaattatgactgagacaatgagagatctttttttttttcctttgagacagagtt
-tcgctcttgttgcccaggctggagtgcaatggtgtgttctcggctcactgcaacctccac
-ctcctgggtttaagcgattctcctgcctcagcctcccgagtagctgggattacaggcacg
-cgccaccatgcctggctaatttttgtatttttagtagagacaggtttctccgtgttggtc
-aggctggcctcgaactcccaacctcacacctgaggttgcctcagcctcccaaagtgctgg
-gattacaggcgtgagccaccacgcctggcccacagtaagaggtcgaacttaacctactct
-atcttgcttctaacctccaagctgtccttgttcattcctgggcataagctgaactaacct
-tgggagaaacttagtttatactttaaacagccctttcccaaagcagacctccttcttgcc
-tggggactaagctgcctttgtaggactaacattagccacaaaattagaaattttggttta
-ggagtcatgcagctggaggctacaagatcctgaccctccctaaactactcctgacatcag
-ggcttgagatatttttcagaccctgcacttgatggatcagctggcatcacccacgtcaat
-aaactggctcatctgatcttgtggcccccacccaggaattgattcagctcaggaagacag
-cttggactccctgtgatttcaaccctgaccaatcagcactcctggtgcactggcttctcc
-ccacccaccaagttatccttaaaaactcttctccccaaatgctcggagagacagatttga
-gtcataaaactccagtctcccacgcagctggctctgtgtgaattactctttctctattgc
-atttctcctgtcttgatgaatcggctcttgatgaataggcagcctgcaaggtgaacccct
-tgggcggttccaCTCTTTGCCCAGGGTGATGTTATTTCTCTCCAGGATGGCTGCAGCGGC
-TTCTGAGCCTGCTTGCATCTGGTGTGGTCCCTTTCAATGTCACGCAGGCCAAAGCAGCCC
-TCCATCTCTCCATGATCTTGGCTTCCAAGGTACTCTGTCTCTCTCTCTGGGTCGCCATAC
-TGGCTTCCATCAGGCCCTGGAATGCATCCTGCTGGTTCTATCCCTTGGCCTTCAAAAGTG
-CGGTTTCCTCCTGGAAGGCACCTTCTGCCTTACCTCACACTTCCTTCCCTCCTACCTGCC
-TTGAGATACCAGCTTGCAGGGGCATTCTTGGGAAAGCCGACCCCTTGGACTGAGTCTGGA
-GTTTTGATCTCTCTCTCTCttttttttttttttggagatggagtttcactcttgataccc
-aagctggaattcaatggcgtggtctcggcttaccacaacctctgcctcccaggttcaagt
-gattctcctgcctcagcctcccaagtagctgggattacaggcatgtaccaccatgcctgg
-ctaattttgtatttttagtaaagatggagtttctccatgttgatcaggctggtctcgaac
-tcccaacctcaggtgatctacctgccttggcctcccaaagtgctgggattacaggcatga
-gccaccgtgcctggccttttttttttttttttttttgagatggcatctcactttgtcacc
-caggctggagtgcagtggcaccatcatggctcactgcagcattgaactcctgggctccag
-caatcctcccacctcagcctcttgagtagctgggatcacaggcatgtgccaccatgccta
-gctaatttttgtatttttttttgtagagacagggtctcattatgttgcccaggctggtct
-caaactcctgggctcaagcaatcctcctgcctcaacctcccaaaatactgggattacacg
-tgtaaaccaccacatccagccCTGATCTCATTCTTCAGAGAATTTACCTAGCTGGTCACT
-TGGTGTCTGTAGGAGCATCGCCTCTCAGGCCTGCCTCAAAACTGCATTTCAGTTGGGAGT
-GGGGCGGGGGGAGGGAGAGTGTAGTTTGGGGACATCAAGCGTCTGTGGTGGATCTCCTCC
-CAAAGTGAGACTGCTTTTTAATGatatttattgagcacttactgtttgccactgcggtgc
-taagcactttgcacatactagctcagtgcatccttacagcaatcctgggagggaggtgct
-tttctcatccgcatgtgctgacaaggctgagAAGAGCTGGGTCTTGCACGGTACCTTAAG
-GGCTAAAGACCTGCAAGGATGGTGCATGAAAGCAAAACCAGAGAGGCGCCTTTTCCAAAT
-GCCAATGCGCCCTCCACCCAGTCCTTCACAAACCACATCAGCATGGATAGCACCACACTC
-CACAGGCTTTTCTGCATCTCCTTTGTGTGTGTGCACATGTGTAATTAATTCTGGGGCAAC
-TTCCTACATCAGTACAGAGAAACTCCTTGATCATTATCCACTCCAACATCCTTCCTGGGA
-GGGACTGACTGGAAACCCAAATGCCCTtgtaagggcaaatacaaaaactaaaataattct
-ccctggtgcagaaaaaggaaagaaacctcccgtttcctgttcttaaacactctagagcaa
-acactttagaaaacttctcaattatttctctgttcctttaagatgtgtctttttaaaagc
-caggtgagcctcctgccagttttacaagccagggatgttttcccaaggacctaggagcca
-tctctttggaaggtaaacatcaagattgcacccttctcatccagtctccatgggcagata
-ggagcctaacttcagtgcttggctccaagttgcaaaacaatccatcgtctatcataaaga
-tgtgagtttatattttctctggataaagacaattagctaacacagatggccactccaatt
-accaggtgaattcgggatgaaataagttgcaaattgtgttgtgcagtcatctgactcgag
-aactatttttttttttttgagacagagtctcgctctgttgtccagtctggagtacagtgg
-tacgatctcagctcgctgcaacctctgcctctcaggttcaaacaattctcctgcctcagc
-ttcccgagctgggattacaggcgtgcactaccacacctggctaatttttgtatttttagt
-agagatggggttttgccatgttggccaagctggtctcgaacttctgactttaagtgatct
-gcccaccttggcctcccaaagagttgggattacaagcatgagccaccaccccggccctag
-ttattatttgaggacatgtatgcaataggttatacctgcttggttatataggaggacgaa
-atgtatttctctttgtaatctcttttgtggattgcctgtgatgcccactgcagtctggtt
-taacgcttatttaataataaaactgttttctcttctacttttgtggaaaggttttctgga
-ttagATCTTTAATTTTGTCTCCAGCATCTTCaaatgtctttctacagagggttggttaaa
-taaatgtggcatctccacaaaagagaatactgcacagtcatggcaaaaaaacaaggagcc
-tgttttcgttgttgaatgaaaagtgcaaggtgcacaacagtttactactttttctgtaaa
-aaaagaggTCTGAGAAGGCTGTATTTGCCATTTGTATAATCTCTGGAAGGGTAAACAGCG
-ACTGATAAAAGTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTAAGAGAAAC
-TGGGCAGATGAGGGAGAGGAAAGGGATGAAAACCTTTCTCTGTACACCTTATATTTTCTG
-ATTTTTTGAAACACGTGACTGTATTACCTATTCACAGTAAGTTAACAGGGATGGGAAGCA
-TGGTGGTGGCAAGCAAACGAAACCTCTAAAAAGAAGTCCCAGGggccgggcgcagtggct
-aactcttatgatcttagcgctttgagaggccaaggtgggcagattgcctgaactcaggag
-ttcgagaccagcctgggcaacatggtgagacctcgtctctactgaaaatacaaaaaatat
-gccaggtgtggtagtgcgcacctgtagtcccagctactccggagactgagaggcaggaga
-gtcacttaaacctgggaggcagaggttgcagtgagccgggatcacaccactgcactccag
-cctgagcaacaggcaggactctgcttccaaaaaaaaaaaattagccaggtgtggtggtgg
-gcacctgtaatcctagctactcaggaggctgaggcaggagaatcacttgaacctgggagg
-cagaggttgcagtgacctgagattgcgccacggcactccagcctgggtgacagagcaaga
-ctccatctcaaaacaaaaaaaGCCCCAGAACCAGACATCCTTAAGCACTTGATTCTGTTC
-ATTTCTGAGCTCAGCCTTGAGCTTAGAACCAAGTGAAAACTAATTACACATTTTCGGAGT
-TCACATTAAACttcttctttttaaaattattatttttgagacagaatcttgctctgtcac
-ccaggctggagggcagtggcacgatctcagctcactgcagcctccacctctggggttcaa
-gcaattctcagtctcctgagtagctgggactacaagcatgtgccaccatgaccagcaatt
-ttttgtatttttagtagagatgggtttttgccatgttggccaggctgatctcaaactcct
-ggcctcaagtgatctgcccgccttggcctcccaaagtgctgggattacaggtgtgagcca
-ctgtgccATGCCTGAACTTCTCCTTTGAAGGAAGATCTGAGTGTAAAAGCAGGGAATGCC
-TTTATTTAAAAAAATGAAAAACAGAAACTAAAACAAAATAACAATCACCTCTGTTGCCTC
-CATTTGAGAGAATACTTCCAGGGGCTCTGCATGTCTGGTCCCCAACCTGGTCGGGGAGTT
-CACTTTCAGAGGCTCAGGGATGGGCCTTCCCCAGCCCCACCAGCAAATCATCTCTCCCGG
-CTTCCAGGAGGGTACTTACTCTCCAACTAGTGGGCTTTATGGGCCAGGAAGGATGACAGG
-AAGGGGTGTGTGGGGTACTACGTCCCTCCACACTGAGAATCCGAAAGCCAAGATGCCCAA
-GATTCTATCGTTATCTGCTTGTCTTGTAGAAGCCCCTCTGTGAGACTGAGGGGCAAAGGA
-GAGAGGGCAGGGGCGTGTCTCAACCCTTCTGGCCACTTCTAGGTTGTGCAGACTGCCACT
-CTTGTTACTACGATGGACTGTCAGATCAGCAGGTGGCCCAGGAGGGCTTGCTTGATGCGG
-GCTGCTTTTTCCTTTTGCCTCCGTGCCATGcctgtgaggtagttggtacttactggaatc
-cccactgcatgcatgaagaaacaggcacagagaagccaaatgactttcccaaggtcacac
-agcctgaagggacagccggctgtcccagctgtttcccttctaacacccttgggcctgcct
-ccagctagatgctgcAAATCAGTCCTCTCTTGAGAGTCAAAGCAAAGGAGATCTGAGCTG
-GTCGTCACAGGTAGTGTGACACAGAGTTGGGGATAGAGCCGCACCTTGCATTTCCAGGTG
-CCATCTTCCCCACAGTCCCCAGTGGGCACTTGCGTTCATGATTCAATTACTCAGGCTCTG
-TCTCTCTGTTCCTGCCCCTTGCTCTGTGACCTGGCCTCTCTGGACCCCAGTTCCGTCCGT
-GAGCGATGGGGGCGGGGTCGGCGGCCTGCCTAGGCTGGACAGTGCAGATTGCAGAAGTCC
-GCGGACGAGAAGAGCCGCAGCACGTTGACCAGAGGGAACATGAGCAGCGCTCCGAGCAGC
-GAGCCCAGCTGCACCGCCGCCCCGCACCACAAGAGGGCGCTGCGGCTGAGGTCGCGCAGG
-ACCACGCCCAGCATCACCTTGACGTAACTGAGGCAGCCGCTGAAAAGCACCCACGAGGCC
-ACCTGCGGGGCCGGGAGGGAAGAGGTGCAGAGTCACGGGGCTTGCGGGGCGAGCGCCGGA
-GCAAAGAACTCTCACAGGGCTCAGGGGAACCCACGGAATACTCTCTAGGTGCGAGGAGCG
-CCTTCTGGGAGTGAGCCTGCGGGGCCGACGGGTCCCATGAGTTGGCCGCCCGGGGGCGAA
-GGAGAATCCAGTGGCTTTTCTGGGTTCACGTGCCCATGATCAGGGCAAGGGCCCTTGAGA
-GAAGGCCCCTGCTGAGGTACACATGGTGGGAAGAGGCCTACCAGTCACCTCGATTCCCTA
-AGCCTCCACTCCCAAATGAGGAAGGGGCGCTTCCCCCACCTGGGGCTTCCCGGGAGGGTC
-CCACAGACCCCGCTCGCTGGAAAGGGCCGCGCCCAAGCTCTCCCAGGCCTTGGCTAGGGG
-TGAGGGGTACGCAGCGGGAGCAGCCCCACCGGCCGGATACTCACAATGAGGACTTCCCCA
-CCCCAGTGGCCCTGCAAGAGGGGGCAGGGGCTCATCACCGCCATGGCCATGTTGTAGCCC
-CCAAAGCAGGTCCCAAGCACGGAGAGGACCCCCAGGAACAGCAGAGACCTAGAGGAAAGT
-AGGGGAGGTGAGTGGAGGTGAGAAGCCTGACCTCTGACCCCCCCGCCCCACTGGGCGGCA
-TGTGGATGGCCAGTGTCTCCATAGTTAGTTTAGACCCATGTGGAAAATTCCAGGTTGCCT
-GGCTCAAGTGGGTCAGGGAGGCTCCTGAGCAGGCAGGGCTGGCCTGAGTCATCCCCAGCA
-TTAACGGCAGGGCCTGGCACCCCGgcaagaaaaacataatggactctggcaccggatggt
-cctggttcaaatcccagttctactgtttaagctgAGACTCGCCTCTGAGCCTCCAAATCG
-GAGTTTTGCAAGGCTGCATGACCTCCAGGAGCAGAGCATGCAGGCCTGGCGCCGCTGTGG
-GCCCACCTGGTGTTTACCTGCTGGCATTTCCTCCTGCAACACACCCTCAGCCTCAGCCAG
-GAAGCTGAGTTGAAGTGAAGATGGCTGGATCGGGCATTGGCACAGTAGGGTTTGCTGTGC
-CTCCTCAGGAGACCCCTCCCCTTCTGGCCTCAGCTACCTGCCTCTGCAATGTGGAGTGTG
-CTGATCTCCAGGGGTCCTGGCAGCTGGCTTGTTGCTGCTAGGAGCATCTCTCTACAGGTG
-GCCTTCCATGCAAACCTACATCTGGGACCACTGTCCTTCCTCACAGGTCCTTGTCCCTGG
-GGTCCCAATCTCTAGAACCCCAAGACTGGTCCACGCCCTGGGTAAGAACAGACAGAGGTC
-TGCCTATACCCTTAAAGACTCTTTCTGCTCCAAGATTCTTGGATTCCATGACTCAGATTC
-TGTAATTCTAACATTTGGGGTTTCTTGGATTTGCAGGTCTGAGCCTTTGGTCCTGCTTCC
-CTCAAATCCTCCATCCTCTTTCCAGTTTCTAGGTCCCAAGGTAGAAAATCCAGCTTCCTG
-GCAAGCTTTCTGTCAAGCTCTTCTGTCCTCACTGTCCTTCTTCTGGGCTGGGAGAGTGGG
-TGTAAGCAGGCCAGTGAGGACAGGCAGGCCAGCGTGGATACGAGGCTGTAGGACCCACCT
-CAAATGTCAAGATCCCAAGGTGGTAGTTCTCCTACAGGGGTCTGAAGCCCCTGCCTCAGA
-ACCGTCTGGTTTCCTTACTAAAAATTGAAATCCCAGGTCCCAGTCTAGGCTGGTTCAATC
-TGCATTTTATCAACTTGCCCAGCCATTCTTCTAGAACTGTGGCTCTAAGGGAACCAGCAG
-GAGGTTAGAGGCAGGAAGGCAGGGCCGAAATCCTGGGAATTAGACCAGGTCAAGCTCTTT
-CTCCAAGCCTCAGGGTTTCCCCTTATAAACGGGAACCTCAGTGGCTATCTGCTCCTCCTC
-ATGGACTGATGACaatgatggtcaacgcttaggctggacctgccacgtgccaggcaccgc
-tccaagagctttatagaatcagctcatatcatgcttccagcagtcctaggaggtggaatg
-ttacactcccattttccgataaatatccctgaggcacagagaactgaagtgacttgtctt
-acacacagctgacaggtggcagagctgggatttggaccagggtgctccccaaacatgttc
-ttaaccactaCATGTACAGCCCAGTAGGTGCGTTTGGAATTCTGGGTTCTGAAATGAAGT
-GTTCCCCCACTAGGATTCCCTAGGACCAGATGAGGGCACACCTGTTAGGCAGGAACATGG
-AGACCAACGAGGCAAGAGGGTTGGCCACAATGCTGAGGGTGGCAGCCAGGTGGTAGGCAA
-CTGGCCCATAGGACAGGCAGGAGTAGGTCTGCACAGAGGGCAGCATGCCGTTGGTGAGCG
-CGTTGACGAAGGCCACCAGGGTATAGATGAAGGCCAGGTGCGCCGGGCAGCAGGGGGCTG
-CTTTCTCCTCTAGATACCCCTGGCCCTGGCTGCTGTCCACCGTGCCTGCAGGGCCCAAGT
-CATTCTCTTCCCGCGGCCGGATGGAGTGGAGGGTGACCTGGTCATTGAGGAGGTCTTCCA
-CGGAAGCCTCCCAGCACCTGGGTTGACGCTGGAGGACAAAGAACGCCACGAGGCAGCAGG
-CCATCATGATGGATAGGAGGAGGAAGAAGACCAGGGGTGAGAAGTGGGCGGGAAGGTAGC
-GGCTCTCCAGGTGGGACAAGGGTGCTTCCATTCCGGGGAGGGCGGACACCAAAGCTCTGG
-GAACTCCCTGCAAAGGACAAGACAGATCCCTGGTCAGGGGAGGGGATCAGGCTGCAGAAC
-AACAATCATGACAGTGATAACAGAATACAGATCACCTGTTATTATTAATGGATAATGAAT
-AAATAAACATAACTAACAAGGTGGCAAtaatgactgctcatactgactgcccactgagca
-cgggcactgtgcatggataagcccctatgcctcctaacagggctgcacagtgggcaccat
-catcccccattttagagggaactgaggtatcagaatgcttcgtcccttacctgagggtca
-cagggagaatgtggcaaagccagactccacctggtgctttctgacttggaagctacacct
-tttatcaccccacAGCAGTGGCAACCACAAACATGTTCAGAGGAGGAGCTAGCTGGAGAC
-TGAGCAGTGGAGCCGCCCACCTAAGAGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACC
-TAAGGGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACCTAAGGGGAGAGCCCCCACCTA
-AGGAAGAACACTGCTCCACCCATCGTCTAGGAAATAAGGGCCTTcaggacatgccatccc
-aaaatatgactgtaggaggccagaatatgccaccccaaaattgacctattggcatatttt
-ttatttctagctggttattttgaaaaattgcaggctaaggagtagctctgaaaagttgcc
-attttgtaagataaatttacatctaaaggaaatttttattagtaaagctatcttatctgt
-accaagaaaaggtatctgtaccacgaaggggtatctgaaccaggaagagaaaggtgatgg
-cctttatcacccgaggaacttttatctgcataacagtgcaatgtttattcaccataagtt
-tcctcccttcactctcccataatttgtctccaccatcctgcagtagcctcaagcccctat
-tcccttttgtagctcaggatgctatagaagctgaaatcatctggcccttttttgagtctc
-atattttttggggactcccatgcgtatgtatgtaagtaattaaaatgagtttcctgctgt
-tgatctgccttatgtcagtttaactcataggccgaccaaagaacctagaaggatggaggt
-gagcagtttttccctcccctacaTTTGTGATAAAGCCAAGTGCTGAGATGGCTCCGGGTG
-ATGCTGGGTACCTGTGCGATGTCAGTCTCCCTCGTGGGTACAGGGCTTGGTACGCTGTCT
-GATATCTCAGTGACATTGACGCAGGTAGTGAGACCGGAGCCCTGGGCAAGAGCCACCAGG
-GCGGGCAAGAGGCCGCTGAGTCCTTCACCCACAAAGAAGGTGGTGAGGTAGTAGGTGGGC
-AGCCGGCTCATGAACGGCAGGAAGGTCACTGAAGAGGTGCAGTCCACCAGGGCCAGGAAG
-AAGGTGAGGACCAAGAAGGCGATGCTGTGGTGGCCGTCCAGCACCCAGGAGGTCATATTC
-CAGAGGAAGGCAAAGATGATGCAGGTGACGGTTCCCACGCCCAGCAGGGTGAAGATGATG
-GGCACTTCGGAAAGGCAGCTGGGCCGGAAGTGATGGAGCAGGGTGACCAGGAGGGGCCCG
-ATGTTGGCCAGCTGGATGACCACCGTGAGGTAGGAGGGCAGGTACCAGCCCTCGGGCAGC
-TCCATCACCAGCAGGGGCAGCTCTACCCAGAGCCCATTGATGGTCACCCAGGAGCCCATT
-CCGAAGACGCAGACCAGCAGGTGCATCAGGAAGGCCATGGCGGTATCTGCCCTGGGCCAG
-AGGCTTTCTCAGATCAGCCTGCAGCGGGGCTGGCAGAGAAGGACACCAGGTGAGTAATTC
-CAGCTTCACCACCTAGCAAGATGCTGGGACCTGGGGCCCAGAGTTTTCTCTTATTACTCC
-CCTTCCTGTGAACAAGCTGGCttttttttttttcctttgagacatagtttcactctttta
-gtccaggctggagtgcaatgggatgatctcggctcagtgaccctctgcctcctgggctca
-agtgattctcctgcctcagtttcccaaatagctgggattacaggtgcatgccaccatgcc
-agctaattttgtatttttagtggaaacagggtttccccacgttggtcaggctggtctcga
-actcctggcctcaggtgatccgcctgcctcggcctcccaaagtgctgggattacagtgtg
-agccaccacgcctggccCAAGCTGTCTTTTTATTAGCAGAAAACAAGAGAAGCCTTTCCT
-AACCGTGATTCATGAAAGAAAAGTTCAATCCGACACACAAAAGCaaacaaagcagcttct
-gcaaaagataccaacagcaaggtcaaaagttaaatgaaaacacggggaaaacatttgcca
-cataaatcacagacaaagggctcatcttccttgtcaggcctctgagcccaagcctgcgcg
-tgtacatccagatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggccggtt
-cctgccttaactgatgatattaccttgtgaaattccttctcctggctcagaagctcccct
-actgagcaccttgtgacccccacccctgcccgccagggaacaaccccctttgactgtaat
-tttccactacctacccaaatcctataaaactgccccacccctatctcccttcgctgactc
-tcttttcggactcagcccgcctgcacccaggtgaaataaacagccttgttgctcacacaa
-agcctgtttgatggtctcttcacatggacgcgcgtgacattcctaatatataaagagttt
-ttaaaaatcaagaacaaagagaccccatatagaagagggccaaggatatgaacaattcag
-agaaaaaggtacaaataagctttaaacacatgaaaatattatcaccttcattcacaatag
-gaaaactactccaggtgccatttctcaccatgagattgtcccaaagcctgacaaaatgac
-tcatgttcaaggttattatagattgcgatcttgttggtaatagcaagttatgggaaattt
-tctcctgggtggctaccaacagagagggggctaattaaagggacctgctggaataccaca
-tacctgtttaaaggaataagaaataaggaaagcagatcttggtgactgataaggaaaggt
-ctccaggctataataataatcttgaaacaaaatcaaggcaggtaaatggaaccaggaaaa
-agtgtactgccttttggtcatagaagaggaggaaaaacaTGTTTTCTTTGCTTGTACTTG
-CACAAAGCAACCCTTGAAGGACACACAGGGACTGCAGGGATGTTGGTGATGCCTCTGTAT
-ATCttttttttttttcttgtgacagagtcttactctgtcaccaggctggagtgaagtggc
-acaatctcagctcactgcaacctctacctcccgggttcaagtgattctcctgcctcagcc
-tcccaagtagctgggactacaggcgcccaccactacgcccagctaattttttgtattttt
-attagagatggggtttctccgtgttagccaggatggtctcaatctcctgatcttgtgatc
-caccctcctcagcctcccaaagtgctgggattacaggcatgagccaccgctcctggccCT
-GCCTCTGTATATCTTTTAATAAGAGTTTTGATTTGTGAACCATGTAAACATATTACCTGA
-TGCAAATATATGGTTACCTGAAATAAGATTTCAATCTGGCTTTTTTTCCTCCTGAAATTA
-TATCACTCTCTACGTGGCCTTTGGAGACCACTTCCTCTAGCCCTCCAGAGCCATTCTGCC
-ATCTGTTTACCCCTTTGTCAGCTACCAGTGGCAGCCCACCTGTGCTGTTACTAACAACTT
-TCTTCTATCTATCCTTAGTCTGAGCAGTAATATGGGAGATGCCAGGAGTGAggctctgga
-gccagctgtttgagtttgaccctggctctgctgcttacaatctgggtgaccctgggcaag
-tggctttgcctctctctgcctcatctcctcatctgtaagtaggggatagtgatagtatga
-actccgtggtttgttgtgagatataaggatgctggtgagtttatgctgtttccaacagtc
-ccagcatagggtaagcacctctaagggttactgatcattATCGTGAAATGGCAGGTTTGG
-TGACATCGTTATTTTTGTCTAATTCACATGAGAATTAATACATGACTATGAAAATTTAAA
-AAAGGAAAAGATTCCCCTACTAGGTATCAAGTGAACTCACCAGTGGTATATGCACCTTTT
-TGTAGAGACACGCTAACTGGGCCAATCTTCACGTTTTGTAGATGGGAGACGAGGTCCGAA
-GGGGCAGAGGGGCTCTCCTGGGATCTGGACTGGATCCTCTGCAGCAAGCGGCCTGTCCGG
-GACTCCTCAGTTCACGCTGCAGTCTTTAACTCCATACTTCTTCCTTCTAGTACAAAGCAG
-GAGTGTCCGTTGTGGCCACGCCTCACCCAGGAAACTCCTGAATCCTGGCAGCTCCTCCCC
-ACGGTTCCCACACACGGAATTCCCTCACAGGGCTGGGACTTCCTTCCTCATACCTTCACT
-GAGCGAACCCAATGCTCAGTGGCCTTTCTGGTCACCTCCTTTTCCTCTCTGGGAGGAGCC
-ACTCCTGGGGTGTAACGCAGTCAGATCCCCTAGCAGTCCCGCTCTGCCCCCTCCCTTCTG
-GGGGCCTCAGACTCCATTCCCTCCCTTAGGAAGCTGACTTGACTAATAGCACAGGTGAGG
-CCCACTCCAGGCGTGCCAAGAGGACCCAAGGAGGGAGGGGAAGCTCCCAGACAGCAGTGG
-CACAcctttgcctgtgctgtcctcccagcctggagcaccagccccctctgctgtccacat
-ccaagctttctacaagactccgtcctccaggagacctctggctgcctcaccttctcaggc
-gtcctcaccagggcccatgaccccttcatttcaggttgttcttgtgtgggtgcatgcagg
-cacataccttgagactgaagctttttgagggcaggggctgCTTGGGAATCTGACATTTTG
-AAGGTGGAAGGGCCTTTCTCAATGACTTAGCTTAGGATTTGTAAATTGTTAACTCACTGG
-CCACTGCCAGACAGCAGATATATTACTTTGGTTTGCCCAGTGTGTTTAACAATTTGTTAC
-TGTAATCAGCAGTGGAGGGGATGGCAAGCAACCTTCAGCATTTCTGGCTTCTCAGGAATA
-TTTTGGAAGAAGTGGCCCCCCACTTTGGCCTCTTTCTCTGTTCTAGACTCGGGCCATCTT
-GGAGCTCTCCCCTGCGGTAACAtctggaaccagttgcctgggttcaaatcccagcttcaa
-cccttacaagctgagcaagtgacctaacctcctgtgcttcagagtcttctcttgcaaaac
-agctataggctgtcagtaccaacatcagaactgttgctaggaacatgcactaaagtgcta
-aaactgtgcctgccacatagtgagggctcaatgaaCCATCATTATAAGATTACTATTTCA
-GCAAACGTATCAGTTGCATTCAAAAACATGTAGTTATTggccaggcgcggtggctcacgt
-ctgtaatcctagcactttgggaggatgaggcgggcggatcccttgaggtcatgagtccga
-gactggcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaattagcccag
-catggtggcgcacacctgtaatcccagctactcaggaggctgaggccggagaacggctcc
-aacctgggaggtggaggttgcagtgagccgagatcatgccactgcactccagcctgggca
-acagagcgagactccatcttaaaaaagaaaaaataaaaaaaaGGCGCAGtttttgttaga
-caaatggccactcaactaaaggactacatttcccagccttctttgtagctgcacatggcc
-atgtcatcaagcacaggccaatgaattcaaatgcgactttgagtagtctccttagcccgt
-ttcctgtttagaaaaaaaagtgcagctcgttgccagcactcatttaattttatgtaaacg
-tgctatttgaggctgaagcaaatctgattctgactgctgttttttttttttttcttttga
-gacagagtcttactgtgtagcccaggctggactacagtggcttgatctcggctcacagca
-acctccgcctcccgagttcaagcagttctcgtgcctcagtctccttagtagctgggatta
-caggcgtgcaccacaatgtccggctaattttttatatttcttagtagagacggggtttct
-ccatgttgccaggctggtctcgaactcctgggttcaagtgatccccacgcctcagcctcc
-cagagtgctgggattgcaggcgtgagccaccaagcccagccctaaatctgactgattttc
-aatgtgaaaataacatgtaaaaactgtttttgaagttatttctaaccagaactaacatca
-gactcatctatttcagaaaaactggattcatcaaacgaatctttggtcaacaactgttca
-agaacaatgttaacatcacacataggaatgctaggatttgctattttcagcgatcgagaa
-ttactttgttttgtaaatggaaataccacgactaaaaccagaatgctacaaatagagtga
-tgtcttttgtttccaaagtcaatatactagagcaaggcaaaaataataataaaagcgagg
-tattttgtggcaaagttatcttggggtaaacactgcagtcacaagtgggtattccttctg
-gcaaacagggaaagagttaacaataagggagtgtgcccttctgctcttcctccatttggc
-tgtctggaatcagatgtgatggccagaactccagcaacgattttgtgctatgaggcatgt
-ggtgggggttagatgcatactaggctcctttgggattttgtggcagagagcacccatacc
-agccctgttttgcctgtgttgaactgttttgtttgtttgtttaatgttgttgttaaattg
-taaaagaaacttctatgttgtttaagtcactcttattttATGTACAACAAAAGTACTCAG
-Aggctgggtgcagtggctcactcgtataattccagcactttgggaggctgatgttggcag
-atcacttgaggtcaggagttcaagaccagcctccaactggtcaacatggtaaaaccctgt
-ctttaccaaaaacacaaaaaattagccaggtatggtggtgggcacctgtaattctagcta
-ctcgggaggctgaagcaggagaattgcttgaactcgggatgtggaggttgtagtgagcca
-agagcacgccagtgcactctagcctcggcgacaaagcaagactcttgtctcaaaaaacta
-aaagaaacaaacagacaaaaaCTACTCCATACTAAGTGCACAGAGATACACATTCCAGGA
-TATATATTGAAAGATTATAGTAACCAAAAACTAATGAATACATTTATCTCCTTTACCACC
-TACTTTCTGACTCTGAAACTTAGGTCCTGTCCCAACCAGGATTTGATCAAAAATCAAAAT
-TTAACAAAAGTAGTTGTTTAGACCCTTGGGGGCAAATGTCTTGCAGAGATATGAAAAAAA
-AAAAAAAAAGGAGAAGAGAGAAAGAGGGAGGAACAGAGGAACACAGAACCCTCCATATAG
-CATTTGGTACCAAAAGTATAAATTGAGACCAAGAGTCATTTCATATATCAAAACTCTAAT
-TCATAAAGGAGTCAAAATTGTAGTGACTATCTGTATTCTGAATATTTCCTGAAATAGCCT
-CAGACATTCCAGGAGAAATGGACAGAAGCACAGTCCAGCAGTACAGGCCTGACTCACCCT
-TCCAGGTCAAGACAGCAGACGAAGGTGCAAAATAAACAAGGATATAGCAAAAGCAATAAA
-TGATATACCTAGTAAAGAGGGCTAAGTCAGTAGTTAAGGGGAGTAGGCGAATTTGCAGAT
-GATGGTGACCTTTGCCATATGAAAAGCTATTAAACTAATGAGAGTGTCCAGTTAAACATT
-TACAAACATCAGTAGCTTTCCCACAGAGGGCTGGATGGGGAGATGAGGGCAGACAGGGCA
-GAAGTAGCCTCACTTTCTTGTATGTTCGACAACTCCTAAGCTCTGAACGCCTAAATCCCT
-GCTCCCCACAAAGACGAATTCTCTGGTTTTGACCCAGGTGCTACCACGGCTGTGTCACTT
-GAGGGATGGGATTTGGCTCCGGGGGTCTGTTTCCTTGTCTGGAAACCAGGCACAGTGGGG
-GTGTGTCCCCACGTGACCCATCTGCCCTATGGCCCTGGCCCACTCCCAAATTATCTCCTT
-CCTCAAAAGTGAGGTGTGCTTTTGGACCTCGGGGACACAGTGAGGAACAGTCATTAATGT
-CAATGAAGGGGATGTCTTAGGCAGAGGGAACTACATGTGCAAAAAGGCCCCAGAGAAAAG
-GAGAGACTCAGAATGGCTGGTGTTCGGAATGTGTTGGGATACTTTTAAAAGATGCATATC
-TGTATtttctgttttttttttttttgttgttgttgtttgtttgtttattttACAGTGACC
-TTGCAGTTCTTatttattcattttaaccagtatttcttgggcaccaactgtgtgctcaac
-cacAATCCCTGCTCTCAGGAAGTTGGAGGAAGCATTCACGAAGCAGAATAAAAAACAGAA
-ACATAGAGCAGGTCAGATGGTGGCAAGGACTCCGGAGGAAAGCAAAGCTCCTGAATGGGG
-AATGTGCCGCTGTCAAGGAGAGgacatgaagggagtgtgggagtgagctgtctgcagaaa
-gcacggtccaggggagaaaacagcaagtgaaaaggccctggggtgcggccacacctgctc
-tgtcccagaagtggattttgctgttcaaaggacagctaggaggccagtgtggccgcagca
-gcgggagccaggttggaggggaggagacagggcaggtcccctgtggccctgtggtgacag
-cttgggtgttttctctagagcaaaaagctccgtgagtgggcagaagagaccagctctaat
-ctagtttttaacaggatcgtgctggctgttgtgaggagaaacatgaggcgccagggagga
-agcaggagtaaaccttcggagggttaggaagctgtagcaAAAGAGCTAACAATCACCATG
-ACAACAGTGACAACCATagctgccactcctcagctatttattgtgccagaccctgtgcta
-agctctttgaacacattacctgtcaaatcttgttccacaatcctgaggctggcattatga
-ttatctccattttacagatgaggaaactgaggtttaaaagggaaataaatttgcctaggg
-tcatacagctgggagctgagctttacatccaggcatgcttgactGTGGACCCAGCCCTGA
-GAAAGGCCTCAGGGTGAAGGGGTTCTGAAGGGGCCATGGGGGTCAAGCTGAGCAGGATCT
-CTTTCTGCTCACAGATGGCCTCCCAAGACTTGGGCCAGAGAAAGAGAGAAATGGGGTACA
-GGCTCAGGAGAAGCTGAGAGAGGCTCTGAGACATATCTGCTTCCCAAGGATCCAGGACCC
-CTTATGTGATCACCAGAGACCAGAAACCTAAGGCTTCGCATGAGACAGTTAAGATGCCCC
-ATAATGCGTGGGCGACAGATAGAGAAGCTAGAAGGATCAGTTCCAGGCAAAGGTTTCTCT
-TTTGCATTCTTGCATCAAAAGCTGTGAGCCCCCAGCCCAAGAAAGTGAAGAGAATTGGGA
-GTGGGGTTCTGACCAGGGCCAGTGCACCGTCATTGTGTGGGCTGGGCCATCTCCTCCAGG
-GAGCTCAGGCAGCTTCCATCCCACCCAATGTCCCCCGCCCCCCTCCACATTCTCCTGCCC
-TCTGTTTTCCTCCATCAAAGTATTACTGACACCAGCTCAGTTACGGGAGTTTATCTGTGT
-CTATCTGTTGAGCGCTGGTCTCTCCCATTGGAGTGTAATCTCCATGTGAGCGGGGGCTTG
-TCCTCTCCCCCAGTGCCCAGGTGACCATCTGGCTTGCCACGGGCTGGGCCACCTGAGCTC
-CTGGCACCATGGCTGGGTTCTCGCTCTGCAGGGATAATCTGCCAGCTGGTAGGCACCTAG
-CCCTGTGGGCCAGACTGGAGGAAACCCGCCTCAGCTATGAGGGTTGTGTTGGCCAGGGTG
-ACCCCTGGGGCAGTGCCAGGTGGCAGCCTGACACTGGATACATCTCACTCCTGGGCAAGG
-GTCTGAGCCAATTCTTTCCTGGGTTCCAGGCTCCTGGAGAACTTAGTGAGGCCTGTAGGC
-GTCTACTTAGGGCCTGGCCTCACCCTCATGAGAGTGGGTAGGAATGGACTGACTTTGAGC
-CCATGAAGAAGGGAGGCTGAGAGGTCAAACCACAAAACCCACagggagagatgggggaga
-tgaaggggagtgagagagaagagactgagacaaagagacagaaagaaccgaaagctagaa
-gcagaaatggggagaaaggacaacagaggcacagagacagggaaaaatgagaAGCTGCGG
-CTGAGAGGGAGGCAGGGAGGTGCCAGGAGGCAGGAGGCAGCTGGGGCGCTGGGAGCCTGG
-CCTCAGCCACCCTCACTGTTCACAGCCACATGTAGCAGAAGGCCATCTCTACCTCTTGTT
-GCTGGGACCTCAGAGTTCccctgaaactcatcccaactcaatgtccctattgcacaggtg
-gggaaaccaaggcccagagaggagatagtgcttccccgaACCCTGCCCCACCCCTGATCT
-CAGGCTGTGGCAGACattcaggcctgtgctcaccggctgtgcaacctcaggtcagctgct
-caccctctctaggccttggtttctccatctgtgaaagggTCTGGGAATGCCCAGCCTTTC
-TGGGCTCAGCAGACCAGGAAAAAGGGAATGAGATAACAGGCGCTCAGCCTGGCCAGTAGA
-AGCGGACAGTGAGTTCTCTTCCCCCTTCTCCTCCCTCCCAAGGCCAGGAAGGGCTTCAGG
-CCTCCCATGGGGCTGACCTTGGTGGAGCAGCCTCCCCCAGGCCAGTTCCCCTCCCCTCCA
-CGTCCATCCCAACTCCCAGCCTCCTTCCCAGGCTCCTGCGGCTTCAGCCTGGTCAAGTTG
-TTCCGAGATAGCATGGAGATGGCCCTGGGTAAAGTCAGTGGGGGCCCAGTCttttttttt
-tttttttttttttttaagacaggatgtcgctctgtcacccaggctgaagtgctgtggcat
-gatctgagctcactgcagcctcaaccttcctggctcatgcgattctcccacctcagcctc
-tgagtagctgggactattaacccatgccaccacgtccgacctgggtaatttttgtatttt
-ttgtatagatggagtttcgccacgttgcccaggctggtcttgaactccctgagctcaagc
-gattcacctgcctcagtctccagaagtgctgggattacaggcgtgagccatgacacccag
-cATGGGCCCAGCCTTTTGGTCTGGAGGCACCAGGGGTCTGGAATTCACCTGGATGGCTCA
-GCCTGTCCCGACTCCAACATGCCAGCTGAGGAGGAAACCTTTCTTCCCTCCTGTCCCTTT
-GATCTTTCACCTGGATGGCTCAGCCTGTCCTGACTCCACATGCCAGCTGAGGAGGAAACC
-TTTCTTCCCTCCTATCTCTTTGGACTCTCCCGACATGGCAGCCTGAAACTAGGGGAAAGG
-CCACGGGACACCTGCTGGCTCCAGATAAGTGCCCCTGCCATATCCTGGTCAGTGTCCCAT
-GCTCCTAGCTAGCAGGCAGCCTTGGTAGCTGCAGCTGCACCCTCACAGGCCTGAGCCGCC
-CCGCTTTGCCCACTTACCTGCTGGTCCAGTTCCCCAGCCGCTCTGCATGGGAGGGGCCAG
-AGGCAGCTCGTTTTGTATAAAGCTGTCCCCGCCCAGAGCTCGGGGAAAGGCAGGCGGAGG
-GTGGGTGTGGCTCCCGGCAAGACCAGGCGCCTACTATGTGTCTCTGATCTGCCCTACAGC
-CCAGCTAGGAGGAGGATCCAGATGGTAGAACTGTATAATAAAGGGCTTGCTTTATTGAGG
-CTCTCTGCCACCCAGATTTCATGAGGGTTGATCCCCAGTTGACAAAAGCTATGTGCAAAC
-AGTTGGTTCTGGCATCACCCTGAGATCTCCATAATTCCTTTCACACAGGAAGAGAGTTCC
-CTGGAGCAAAAACAGTTCAAATACTGgtgcttcagtaagtcatgtggaaagcggggataa
-taatagtgccctcttcataggACAGAAATCCTAACTGCCAGTGTGCACTGAgctgactca
-gtgtcaggcatgttcttggggcttgagagaaattaatgcatttaatcttcatggcctttt
-ggagagatgctattactatccctattttccagatgaagaaacaggcccagagaagtcgag
-agccttgtgtaggtcacacaccttgtatatggcagaactggTCTCTGATGCACACTGAGC
-TACCCTGACAAATACtgtaaccacctgaggggttctttctgcccactgcataaagaaaga
-ccatgaggctggccatgccacaggggaaatgagtttgttcccaaatcatcttcaaagctt
-gtaggtgaggggtttttcaaaggcagtataggggaagagttgggggtggccaggtaacag
-gtgcttgctgctgattggttggggtggagatgaaatcatagggggttgaagctgtgctcc
-tacaggctgaatcgcttttggggggggggccacaggagcagggttggcggtcctggtgga
-gacatcaggtttaggtggagccatgggtgtcaaatctgcaaaaaacctggaaagatggcg
-gggcgtggtgggtcatgcctgtaatcccagcactttgggaggccgaggcgggtggattac
-ctgaggtcaggaattcaggaccagcctgaccaaaatggcgaaaccctgtctccactaaaa
-atacaaaaattagccgggcatgatggcggacacctgtaatcccagctactggagagactg
-aggcaggagaattgcttgagcccgggaggcggaggttgcagtgagccgagatcgcgccgt
-tgcactccagcctggacaatagagcaagactctgtctcaataaaaCAAaaacaaacaaac
-aaacaaacaaaaaacaaaaaaaaaacaccaactggaaagatatctcaaaaggccaacctg
-caacagtggtgttatttgcaggagtaattggggaagttgcatatcttataacctccagaa
-taatggctggcaatcatttatgtctacaccttaggaggacccaggctcctcttctttccc
-cagcctgatggcctctcattaactttacaaaagtggttGCTCACAGTGCTACGGCCTGTA
-AGTGCAGGGCCAGGATGTGAATGCAGACTCAAATTGGTGCCTCCatggatgtaaaacata
-ttgcacagattctgacacctagtaaatgctcagtGCATATTGACTTCTACAAATAATTCT
-GGCCTGCCTGTTGTGTTATTTTCCAAGACATTCATTTACTTAACAAGCAATCAATCACTC
-TCCAGGCTAATGCTTGGGGCGAGAGGTGAGCAGGCACTAGGGAAGGGGCCAGACCCCTCG
-CTTAGCAGGCAGGTGTTCAGGAAGTGTTGCCACtgttggggctcaggacatacacacccc
-caaaatatgactctgggaaaccagaatgtgccacccccaaatacacctctttgacatact
-ttgagctggttattcagagaaactgcagacacaggagtagctctggaaagctattctttg
-gtaaaagaaatttacatctatcaaggaaatctacattagtaaaggtgcctgtatcaggaa
-aaaggctgctccagaagaattaccctagagactttcttttttttttttttttttaagata
-caatttcacttttttttgcccaggctggagtgcaatgctgcaatctcggctcactgcagc
-ctccgcctcccgggttcaagtgattctcctgccacagcctcccaagtaactgggattata
-ggcgcacgccaccatgcccagctaattttgtatttgtagtagagacaaggtttcaccatg
-ttggccaggctggtcccgaactcctgacctcaggtgatcttcttgcctctgcctcccaaa
-gtgctgggattacaggcttgagccactacactggccaccagacagacttttatctgcaca
-ggaagacaaccattatttaccatacaataattcttcccctcaccctcccataactgtgtc
-tccgccaatcccccaaagccctaagaccctattccttaaacttcaatcatctgacccttc
-tttgagtctcatattttgtgggatttccacgcacagatatgtaattaaatatggtttctc
-tcctgttactcagtttcatgtcaatttaattcatagcccagccaaagaaccatgaaaggt
-ggagggaagccatgtttcccttctctataGTACCAAATACTTTGGATCTGTtaaaaaaaa
-attgcaggactctaaatttatgatgccaagggagaagttaagccttgcagagtgTGAGTT
-ATGTGGCTTGCAGGATGGCCACTTTCTtcttctttttttttttttttgagacggagtctc
-actctgtcgcccaggctggagtgcagcggccaggctggtctcgaactcctgacctcaggt
-gatctgcctgccttggtctcccaaagtgctgggattacaggcatgagccactgtgcctgg
-cCAcaatttcatacttatctctgccaaatactataaggtgtcaaaatttggcatagaggg
-tacaaaactataactcaatccaaacagaataatctttgcttgtataattttttaataatg
-aaacatcaatattggtttaataaaggcagctatatcttgaactatttagttaaataccct
-aacttctaatcctgtggccttaggaagtctagtctacagacgtgaaggaagtttctttag
-ggaaaggacttatcatctttgatattaaagaaaagagaatttatataaaaataatcttat
-atggtaaattcttgttctaaagtaaatgaattggttgtttaaaaagaaggatgtttacaa
-cgagtcagaaagttgaggcatgtcagagattgtgtaaattgtaaaaattttataaaaggg
-aatttatgcaagaaatgttgtacagtttaaaagtgatgagggggccgggcacggtggctc
-acgcctgtaatcccagcactttgggaggccaacgcgggtggatcacctcaggtcaggagt
-tggagaccagcctggccaacaagatgaaaccctgtctctactaaaaatacaaaaaattgg
-ctgggcatggtggtgggtgcctgtaatcccagctactcgggaggctgaggcagaatagct
-tgaacccagaggcagaggttgcagtaagctgagattgcaccactgcactccaggctgggc
-gacaagagtgacattccatctaaagaaaacaaaaacaagagcgactaggcctcctgaatg
-ctttataaaatgccaccataactcttaactgtacaacttgcctgctttgtagctgggtaa
-gacctagcacacatggagttaaatgctggaataagtcagaccttatctgcacttctgtct
-aggtcctaggctctacatctagtacataattacaatctcaaactgactaacaaaagtaaa
-agttgctaaaagttaacagtgtaacatgtattgttccatagaaagaatctaagataagac
-tgtaaagctgaggctagccgtggaattgtaccattaaatacctatgagtttcctcttgag
-gttgcaagataacctagggttcccggcctctcagaaagggcattctttgcttaccacaga
-tcagaagccctatacagggactgtgtacacaaaatataaggccagtttccaagggctttc
-ttggcttcgtaaatcaagtttgattccttaaaggaaagcataccattccagtcaaggcct
-tggtaaaaaaaccagtttttccaattgtgtcctgttacaaaagaaaacagattcttatta
-cacttgtgcaaataactatatcgccataacttaagaatactcacagatagtttccaaatt
-ctggagaaaatcagggagagagaaacaagtatgctacaaattttgttcatgggagtatac
-taaattgttaaaagctgttaatagctcaaaagaaaaatttcgaggccggatgcagtggct
-catgcctgtaatcccagcactttgggaggccgaggcgggcggatcgcctgaggtcgggag
-ttagagaccagcctgaccaacatggagaaaccccatctctactaaaaatgcaaaattggc
-tgggtgtggtggtggcacatgcctgtaatcccagctactcaggaggctgaggcaggagaa
-tcgcttgaacccaggaggaggaggttgtggtgagccgagactgcaccattgcactctggc
-ctgggcaacaagagcgaaactccgtctaaaaataaaataaaataaagaaaagtttctttg
-actttgaaaagcaaaacaaagtattagcaatattttaagcaaaatatcaaaaagatcact
-ccagtctcctattagttcagttcgtgcagttaattcctgtcctgcttgatattaatgaac
-attttagctaagagtcctaaccatttttcctgtattctgatgtcacaatctccaaattta
-tcagaaacctgcattcaagaacacctgttagagctttatagctgagtataaaacccttct
-aaagaggatcaaaacaagacaacaattgtttatggatgaccaaaagttttagggtagcca
-tagttaaagacacaattgacaaggaaatctgttacttctgtggcacacaataattttaac
-ataacaattataattactactgataacacacactaagacatatcagaattataggagtct
-cccataactttggaacacataccaataacatatttatacaaatatggcccaaagaaagcc
-aaacattattttatatttgacaatgcttcctgtatgacttcataccaaataagccaaatt
-ttacctttatattagtgtgttattaatgttaaactcaattttaatgttttgatcataagg
-tcagattttcatggacccttttttttttttgagacagagtctcgctctgtcgtgggcgac
-agagtgcagtggagcaatcttggctcactgcaacctccacctcctgggttcaagctattc
-ttctgcctcagcctcctgagtagctgggactacaggtgcccaccaccatgcctggctaat
-tttttgtgtttttagtagagatggggtttcaccgtgttagccaggatggtcttcatctcc
-tgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgagccat
-tgcggctggcctatagaccatttttaaccctttataatttttgtcaaagagcaggttagt
-gctttaagaaaaacccattgtgcttttattttaatactcaatttacagaaaaactggatg
-atacacctttaactttagccaagatgtttacacacagtatttcctttacaattaaccttc
-caaaagttgcttaaaccttcatttttattttattcaacttaaaacaattctttaaccttt
-taatctaggtaaaaatccacattctcatgcctccttataatctttttaccaaaagtatat
-gtaaactgttttttcaatagtcttaaatacatgttacactgttaacttttTTTTTTAAGG
-CCTACGTAACAAATAATTATTCTTggctgggtgtggtggctcacgcctgtagtcccagca
-ctttgggaggccgaggcaggtagatcacctgaggtcaggagtttgagacaagccttgcca
-acatggcaaaaccctgtctctacaaaaatacaaaaattagctgggcgtggtggtgggtgc
-ttgcaatcccacctactcgggaggctgaggcaggagaatcacttgaacccgggaggcaga
-ggttgcggtgagcttagattgcaccactgcactccagcctgggtgacaagagcgagactc
-catctTGGGGGGGAaaaaatgggaaactggagagagaaaattacatttcagaaactataa
-cacacctgttattaaattccagtgttgcctaatgttgttcaatttttattactttaaatt
-aaattctaatttttctgactacgagtttccaaaataagctttgttttcttaaagccctat
-gaactgaaaactagacgtttcagcaggcactgcctctaaacgccccccagccatcacagg
-aggaaacctcttcactgctggagctgacaactaataactgagcgtgcctggaatcctttg
-cccccacatctaataagtccatggaacccagggtaattgagatggcatctcttacaagaa
-tcaacttctgggtcaggtgcggtggctcacgcctgtaatcccaacactttgggaggccaa
-ggtgagtggatcacttgaggtcaggagtctgagaccagcctggccaacatggtgaaaccc
-catctctaccaaaaatataaaaaagttagctgggcatggtggtgcatgcctgtaatccca
-gttattcgggaggctgaggcatgataatcacttgaacccaggaggtggaagttgtggtga
-gccgagatcgcgccattgcactccagactggcgacagagcgagactccatcttaaaaaac
-gaaacaaaacaaaaaaacaggaatcaacatctggatacattacactcgagtcaaagcctg
-gaaagctgaggaagcaacccctgatagccaaaggaacatcctaaatatcagtgtaaagaa
-ataggaaattttaagctcataaaaggtaagtaactgagtgagaactacttatcttactca
-gtctcacccctacctcaccaaatacttttagatgttcctacctctccttttaagacaaat
-attaaaactttttaatggaaattattcactacaccaccattgtgggaactgctttacaca
-ctctattatttgcagtgggactatgtactacagcaccctcaggatggaatatcagacaga
-gaatctcaattatggtaccattttgcttaattattatcctcatagcaggaataacagtta
-ctaacagcaaataacacatgggcctttccagacatgtgcctctgcctgtcattgggtgag
-gaatgttgtttctatatcaaccaattaggcctagtaagaggtgctgttgaaaaacttaag
-gaaagggctataccaaaacaaccaaatagattcttggtttaggaacaaaatcatagcatg
-ggtcatcccattcctgggacctttcctaataatatgcctaggactaatgttcttaccctg
-cctaattaacctttttcaaagatttttaactgacaggatcatggccatttcacagacaac
-tacccaaaaacatccacagacagcgttactgctacagttaatccaagaccagaaaactct
-gtcccctcatcagcaggaagtagccagaaagaacaccctgcctttcatcctttttataac
-tataaggtctggattgacagagcaggagcattgccatcttggacaagcactgccattcta
-aagttccccttgatcaaaaaccacctaaatccaaagggcatcagcctaatggctaaggtc
-agcatgaccataaaccacaaatgacatctctgaccagaaacattccaaccataagttaaa
-gccctccccgaccagagacgtgccagccccaagataacctcccctccaggtggagagatg
-tcagccccaagataccgtcccttccaaccagagacattccaaccctcaatagacttctcc
-cctacacaggaacattccaagcctgtgataagctctcttacccagaaaccagtaaatacc
-cttagtatgtaagagagagcattcctgactgaaattggacagaggcccctctcaggttta
-ttcttcaaaataaacctgtctttgactgttgagcctcttttcatgtttctttcctctttc
-ttgaactcttacaACACCTTTGTTAGGCGCAAATtttcagtgctgcaaaagaaatagcac
-tcgaacataaatttaattttctcagcaaggcaattttacttctatagaagggtgtgactt
-gtggatggaacaatggtgagagcacacctgaacaagggaggggaaggggtttttattcct
-gatgcaggtagcccctactgctgtgtggttcccctgttgactaggattggaccacacagt
-ctaagctaattccgattggctgttttaaagagagcaggggtacgagtcggagtagcggag
-tgagtagtttggcgggaaggacagttaggaacaggtgactaaaggtgactcaggtcagtg
-caggtgaccaggggtgactcaagaaggagcaggtgatcaggggaatagatgtgaactact
-gattagaactggtggaaaaggttgtttactgaaactaggggcaaggaggcaaagagaatg
-agaaagttaaactttaaaatggagaacaaagaacaggggacctgaatatactcatacatt
-ggttccttggagaggatctcagaactcattgtacttaacaATTTACAGGCTGAAACATTT
-GAAAAGGAATTTGTTATATCCTACAatttccccctttcaattttcatagtacttcctctt
-caaactttttaaacatgtcttggcttagctgctcgacttaatcctctaaaagaaaaagct
-tatctgaataaggtggaggtgagttaaggaagattttagtaagtgctgcttttataagtc
-tttgcactagcccacagatgcatggtatgacataacacctaacaagaatgagtacagcta
-ttacggctgcaagagaagtaagaattgaggctgtgatttctttccatttactgaaccccc
-tttctagccaccctgagaaagggttatcgactccagaattttagctagttcattggatag
-agtggtaagtctttataaggcccttgttatgttcccagtgtgggcagtgttatttgggat
-aaaggtacaacactgagttttaatcataatacaaacaccactttttctgctaatatcata
-tctggtgccattctgttttcccaggccatctggctagtgggccccaattgttctgctatc
-cctttgacagcatccctggtgtaattaataaactgctgctgattataatagatgtaattt
-atccagtctacatttttattaatcgtcacccatgaaaatattgacttaaatcctgcagct
-atttgatctcgggctttaaattcatctggtactcctagtggaactccagtaatgtttata
-taaacatgggggtcaaacgactcatgtaaggcacttcttttacaattttcttttttatca
-tgttgacggaatgctagagtgaaagggatggccaattggactagagcacgagtgctgctc
-taattgcttggcagagtatccagcaatagtgcccctcaatgccaccacacacctgctcag
-ggatgaacaagggcagactgatgggtaagctcttgaaaaggcttggtttcaccgcaccct
-gttaagtctccaaggaatgctaacttttccccctgccgtgaaagggacaggtgaacttaa
-catcaggggctggaggctggatggccctccgggctgacccacagggctcttgacctcggg
-gaagagcagtgaaagcgaacagcagtgaaagagttttgcctgactcattgccccggctgt
-ggggttctggaagagagctaccatacagctcatgccctgtccatgagaggaccactcgag
-gggaaaggggacaatttgggtctctggcctgcctgtcgcacaagcagtcacttttgttta
-gcatgcgaacagaatatttaatccatttcagccaagcatttacatcctggtactctgttt
-caattgctatagtttgttttaaatctataacttctacaacagctactttggttttatcat
-tgggtatataacgaaagaagatctggttagtggagaacttaggagtgggagaagggggtg
-caggagttgaggaggcaatgaagcacatttcaaaggatcctctggggtccttccctgaga
-cttctgctcctataccatagaaacggtactctggggagcagaggtggtaatctgtactgg
-attacattggttcatctgacaatggggtggtccatccttgctccttggtagtccataagc
-cattagaccagctaaaagttctgttctaggagggcaagattcctagttcatactgggacc
-atcatcaatatcttcccagactaactgatcccagttaacagattttcagtctgaggagag
-ccaggaaggacaaagatacttttctgaaggggagagttgcctctggtttggcagatctcc
-acaggtcatcccaaggcaagcatcaaaagtaatagtttggggcgaacttgttacataaag
-aacgagaagactagcaatagaaggggaaaagaaagagatggaatgtaagaggatcaaacc
-cgttttagctttagcttggttggagttggccctggaatagctgtccatgattctggaggg
-ggtggtgctcttttgacctaggtgtgatgagtccatcctctttctgctgtttgaactgtg
-gtctcggtggttagaagcaacaggtagggtccttcccaagccagttcgagtttcccttcc
-ctccaacttttgacaaggacacagtccttaagctgatgttggtgtactggaaactgtagg
-ggtggtacctgttctaaaagacctttagttctgagggaagagaaagtggaaaataaacca
-agtatataatttctgagaaactcatcttttgttttgaacataggaatgtcagcagtggag
-tgtaaacagggcaacctacacaacatttcataaggggataagccaacatctctctgagga
-gcagttcagactctcaagagggcaatgggagagcatctatccatggcaaccgagtctcta
-agactaatttggttaggtggccttttttttttttttttttttttttttgagagggagtct
-cgctctgtcgcccaggctggagtgcaatggtgccatctgagctcactgcaacctccacct
-cccgggttcaagtgattcttctgcctcagcctccctagtagctgggactacaggcacgcg
-ccaccatgcctggctaatttttgtatttttagtagagatggggtttcaccatattggcca
-ggctggtctcgaactcctgacctcgtgatccacccgccttggcctcccaaagggcttttt
-ttttttttttttgacagggtctctctccgtagcccaggctggagcgcagtggcgcgatct
-cggctcactgcaagcaccgcctcccgggttcacgccattctcctgccaaagggctttttt
-aaaaaatagtttggttcattctttccactcttcttgatgaaggtaggtgccagggagtat
-gatattcccatgttatatccagtatctgggctaatttcttaatgacatgtacagtgaaat
-gagtcttattatctgaatcaatgttttctattaatctaaacttgagtataagattttcaa
-ctaatgccctgtctatgttattatcagttgtacttgaaaaggaaatagcttctatccaat
-gagtaaggtgatctactatactaataaatacttcagatgatcagttggaggcatctctgt
-gtagtcagtctggatactttggaatggccttaagcctggactccttcccccaaggggtaa
-tgttttactaaacaactgtctgtaacctgtttggccagggtataaatcctatgcacccat
-aaactctgatgaatgtgtcacacgaggcttggggcctccaatgggtcctttaatgcagtt
-ggaataagacttccctcataaggggtttggataacatttctctctggtctagcaatatcc
-attttccttctgaattctctttagcacctatttttattagtttttaaaccaaagaaagcc
-aaacaccattttatatttgataatgcttcctgtgtgattttataccagataagctaaatt
-tcacctttatattagtgtgctattaatgttaaactcaattttaataaaatcttgtagaca
-tatttattcaattttaatgtctgaccataaggtaaaattgttatagactctttctaacgc
-ttcataatttttgttaaagagcaggttagtactttaagaaaaacctgttgtgcttttatt
-ttaatgtccagttcacagaaaaactggatgacacccctttaactttagccaatatgttta
-cacacagaaattcctttacaattaacatttcaaaacttgcttaaaccttcaaaacaattt
-tttaaccttttaatgtaggtaaaaatccacattcttatgccttcttataatccttttacc
-aaaagtatattttactttccttacacgccttgaacataaactgtttcttcaatagtttta
-cattcaggaggcctaattacttttaaattatacaacatttcttgcataaattccctttta
-taacattttccacgactttcacagaccatctttgacatgacttaaatttctgacttgtga
-acattcctttctttaaacaaccagttaatttattttaggatgagaatttaccgtataaga
-ttctttttacataaattctccTTTTTTCTTAATGTcaaagatgataattgttttttccca
-aagcaaacttccctcatgtctgtggactagactgcctaaggccacaagattagaagttag
-gataatacatgttacactgttaacttttagcaaattttacttctgttgaaaaccttgtaa
-gtttggaattttaattaaaggaaggcttttttggtgtccggggacatggacaatagttat
-ttttttggcaactgaaggttatttaatacttgggtgattaattcctcgtggaccgggtct
-tgacctttgctattaataagacctggttcagtccaaatttttccacatgcatgagccact
-ccaaaggcacactgaaaattggtatagatggttccttcctggttctgtaagtactttaag
-gcttggctgagtgcaaacagctcacacgtttgagcagaccaattattaggcaattttcct
-aactctatctctacACCTTTAACCATTGTTCCCTATTTCTCATTCAAACTTGGACATAAC
-GGTATgtgaaaaagagcctcttgtgactgttacctctttacaatggaatgttaagcaacc
-cctcagaaagtagggagtagcaaatcaaatctttgtaactacatttcagcctttgccggt
-tgaaatgtcagagccccggcatcagaaagtggtcaactcaagggctgataagaagaattt
-accaacaacagtataggtttgaaaagtaaagttttattagaaagaaagaacattgcagaa
-gagtgcagcgaggtgcctcagcaagaggggactgagagggctgtggtggatattccttag
-gcgcatatatgaaccttaaggcaaaagcttgagggtaatttggagcatactagccacgta
-ggttatgataaatggttacatttgtagttattttggtgccttaatgtcagcaaggattgc
-acagtgagtttcgcatagaaattctggttactacaaaatttttgaaagacccctggaacc
-agatgccaactttagatatgtcgatgaagagtcaaactctgtaaaatatttgaagagatt
-tattttgggcgaaatacgagtgaccatggcccatgacacagcacttaggagatcctgaga
-acatgtgcccaaggtggttcgggcgcagcttggttttatacattttagagaggcacgagg
-catcaatcaaatacatttaagaaacacattggtttggtccagaaaggtgggacaactcaa
-agtgggaacttccagactataggtaaatttaaacattttctggttgacaattggttgaat
-ttgtctaaagacctgggatcaataggagggaaatgtttaggttaagataaaacattgtgg
-agaccaaggttcttttgaagtcttatagtggctgtccttagagacaatagatgacaaatg
-tttcctattcagacttttaaaagctgctagactcaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaggctgccagactcttagttaatctcagagggcctggaagaaaaagatctagctatat
-taatagagattatttacagatgcagatttccccccacaaaggacagctttgcagggccat
-ttcaagatatggcaaagaaacatgtttttgggtaaaatatttttgctttcttctttgtca
-cataatgttatgccagagtcagattggaaagcaagtcagatatataggtttaaataaaac
-ccatctgatgagaatttatggtttgtagggcatgactccccagaccccttagataggaat
-ttcagcaaaataaaaagatcagagcttagtcctcataatcaagaaataaccataaaaatg
-ggcaaccctatggagtagccattcttttattcctttactttactaataaattttcttttg
-ctttgcactgtgaacttgccctggattctttcttgtgtgagatccaagaaccctcttgtg
-gggtctggattgggacccctttccggtaacGATTAtacttctaaattcctcagataagga
-gtttttgtctcgggctgcttcagggtcaccaggtgatttttgctctcctcaCCCCTTTGT
-TCAGCTTCTCTGTTTTTGCCTATGTACACAACTCTCAGATTTGGCCACtggggagagcaa
-agttatacctggtgaccatcaagcagaccattcagagacaaaactccttatcagaactcc
-ttattcagaagcaattagacttccctattatctaaagcaggcatctcattccaggcttct
-ttcccccaaatttataagtaactagaatttctatgcatctctggaatgcatgcatatcaa
-aactcacggtgcTgaaaatttgcatctgtaaagaatctctattaacatagctggatcttt
-ttcttccaggccctcccaatcctgaagagattaactaagagtctaacaccttttgatggt
-ctgaataggaaacatttgccatctgttgtctctaagggcagcgaacataagacttcaaaa
-gaaccttggtctccacaatcttttatcataacctgaacatGAGTCTCTTGCTGATATTAA
-GGCATTGAAACCACCTTTGCAAAATTATTACAGACAGcatcattgcaggaatccaggaca
-ctggagtagaggatgttccatacctttgggttacaagccacccccaggaccttgtcctca
-ttgcaaacaagagggtcattgtgatatggaaggggggcaggggagtgctgggtacagaaa
-tgcagggttcctggtgagggctccacccttgggcctgtgcccacagacctaagtaagaac
-aggcactcctgttttcatgcctgaatgttgtattttccaagaccactctggcccaccaca
-tccccttcctgtgtccataTtgttaaatatgaattctaaatttctcttcaaagaattaat
-atgtcagtatgttcaattctttgacttctgcttttaaatttaacttcctcgtaaagcaac
-ctttttcgattacctgctccaccctgactcattccgattacctgctccaccctgactctt
-gcaggttacttgctacctgctccaccctgactaattattctccaccctgcataaccattt
-ttttttcccgccaaagcactcatcctgtcacactctttaaatctgccaattggaattagt
-ttagcctgtgcagtctaaccctagccaataggggaacgacacagcagcaggagccttgtg
-cattagggataagaacccctttccctcccttgtccaggtgtacactcaccattgctctac
-ctgtgagggtgcacccttctatagaagtaccttgccttgctgagaattaaaaagaaaatt
-ttatattcgagtgctatttcttttgcggcactgaaactttatatgtaacaatttgggggc
-tcgccctgattacatttccctctggggcagtctctggttctctcttgtgaggagcgctcc
-gccccctgtggcggcctcagccgggagaaatcagaacccacccagtgcgaggaacaaccc
-gagctgtcagcaacaggggggaagaaaactggccggcaacctagcttaaagaatcctcac
-atactgcagcgacgactctgcgcacagagcaaggaaggagaagccgcgggagctggtaaa
-gtatttccttggtggtcgggaccaaggtaagaaagccacgggggtggtgggcggtgaagt
-actccttggtcagggtggcttagaggttaaaaagaggtgagacatccccattggcggaga
-ttgaacctcacacaaacctccagtagtagaaaaggcaagaaatttccagtggggaaattg
-agcctcaccccaaaaggtaagaaatttccagtaagggaaagtgaaccttgaaccttatcc
-caaaaccatcaagatgggaaatatcccaagcaagacagggagcaagggggataaacatgg
-taacaaagatatccctccagatggccccctaggtctcatgctaaaacactggaaggataa
-tgaaaggatacacataggaaaaagcaacaaatggtaaaatattgctgttttatttggagt
-cagggacccatcctcagtccctcaatcttctggtcaaagtttgggtcaaatgagaatgta
-atgtgtcagcttctaatccgatacgttaatgataaaagtccagtgtctcaagaagaacta
-ggctatgccctttgttggaggcaaggacctgccctcctatttctcttaaaaataaatagg
-gaagaacccaatctggcacctcaaaatgaaaagtcagaggagccagctctcatgcctaaa
-gactccagtgctgcatggtatcccctagaccatcttcccccactcagtgtccccaaactt
-tcccctcagacagccactgccacctcagatcaccactgccacctcagatcctgttccaaa
-ttccccctctactcacgctatccctcctccttataaccctgactgttgggaattaccatc
-ccaccagcctgttctctcccaacctaaagacccctctctaaaaagactccagcgtgaggt
-agaacaatgtaaaaaagatattcagaatttcctatttccctccgtacctaagaggtcagc
-ccctaccctcttccctttgaaagaggtaccacaagttgggggcgggggggggggcattga
-ctttgtaaatgctcccttaatcagttcagaagtccagaattttacaaaggagcttaaact
-gctgctggacgacccttacagagtggcagaccaaattgaccaattcttagaacctcagtt
-atacacttgggtcaagttaatgtccatcttgggcatcctcttttcagggtaagaaaggag
-tatgattcttaggtctgctatggtagtttgggaatgtgagcaccctcccaatgaaaacgt
-tcctaccacggaccagaaattccccgcccaggaccccccatgggaaaataacaatgcaga
-tcaccgggaaaatatgcaggacctaagggagataataaaaggaattcaggaatcagtacc
-ctgaacccaaaatctttctaaagcatttgatatacaacaggaaaaagatgaagggcctat
-gagattcctagacagactgagggagcaaatgaggcaatatgcaggcctcaatttggatga
-tccccttgggcaaggaatgttgaaactccaatttttcactaaaagttggccagacatttg
-aaaaaaaaagttacaaaagatagacaattgggaagaccatcccttaagtgagcttctcag
-ggaagctcagaaagtgtatgtgaaaagggacaaagtaaaacgaaacaaaagacaaaactt
-atgtttttcaccttccaacagatggctccaaacccaggtacttctagatagagtttccag
-ggagccagaaactataaagggtccgaatcctcttttaaagaaccccagcctccatctgga
-ggaccagggtccttgtctaccaagccccctaaagagtatgggggagaagggttaaagaat
-cccagaactaaggggaggaaggacaaaataggtgctatagatgtggaagagcagaccact
-tcaggagaggatgttctgaactaagaaaggagaaagaagccctttcactcatgactttca
-aggaagaatagcggggtcaggggctctgtctcttttatcttgagtcccaccaggagccct
-tgataaatttgggggtgggacctaaacatgagcttatcacctttttagttgattcggggg
-ctgctcgctcctctgtttccccccatctaatgttgtctccttcttagaggaacttttagt
-ctccagggtaaaaggtgtaggattaagagcaaaaattttagaaagcactgaagttagata
-ccaggatcgctcagcttatattcagttcttgtttatccctgaagcaggaactaatttact
-ggggaggaatttaatgttaaagttgggcataggtctacaagtcagcccaagaggattcct
-cacctcattaaacctactcaccaccgcagatgaaaaatatattaatcctcatgtcttgac
-caaagaaggaaaccaagggaaactctaagtccctccgatccacatcaagctaaaaaaccc
-aggggaagtagtaagaaggaagcaataccctattcccctagaaggtaggatagtgttgaa
-acctataattgaaggccttatttaggatgggcttcttgagccctgtatgtctccttataa
-catcccaatcaagaatcaagaaatcaagactgctaccagccagtcaagaaattagatggg
-tcataccagctagtacaggaccttagagctatcaaccaaatagtccagagtacccaccct
-gttgtcaccaatccttacaccattcttagcaagattccatataatcatcaatggtttact
-ataataaatttgaaggatgctttttgggcatgtcccctggctgaagatagctgagatata
-tttgcttttgagtgggaggatccatactcagggtggaaacaacaatatcgatggaccgtc
-ttgccccaagggttcacagactcccctaaactttttggccaaattttagaagaagtacta
-gaaaaagttgtcatcccagaacaaatatgccttcttcagtacctggatgacattcttata
-tctggtgaagatctagagaaggtaactgacttctctacacatattcttaaccatctgcag
-tttgaggggctatgagtctcaaaaagaaagcttcagtatgtagagcctgaagttaaatat
-ttaggccacttaataagtgtaggcaagcgaataatagggcctgaatgaattgagggaatc
-gtgtccctacccttgcctcaaactaaacaagaactcaggaaatttttagggtcagtcaga
-cactgtcgctaatggattgactcatatacactgccccgtaaactgttctatcaaaaactt
-gcccaggagaagcctaaccgtctcctgtggacttctgaggaagttgatcaaatcgagagg
-ttggaggaaaggctcataactgcccctgttttaggcttaccctccctagaaaagccattc
-cacctttttgctaatgtggacagtagggtaccttcgggagtgctgactcaagaacacaga
-ggccgccagcagcccgtagccttcccatcaaaggtcttagacccagtcacttgtggatgg
-cctcaacgcatccagtccatcgctgctatggcaatactaggtgaggaaagcagaaaatta
-accttcggaggaaaattgacattaaacacgcctcaccaagttagaactatcttaaaccag
-agagcagtgagatggcttactgacttgagaatcttaaagtgtgaggccattctgttagaa
-aaggatgatttaacattgaccactgataattcactcaacccagcaggtttcctaacaggg
-aatccacatctaaggagggaacacacatgtttagatttaattgattaccatacaaaggtt
-tgaccagacctgggagaaacccccttctggactggacggcacttactcatagatggttcc
-tcccaggtgattgagggaaaaagacacaatgggtattcagtgattgttggagaaactctt
-gtagaaataaagtcaggaaaattgcccaacagttgatctgctcaaacgtgtgagctgttt
-gcactcagccaagccttaaagtacttacagaaccacatctatacagattccaggtatgcc
-tttggagtggcccatacatttgggaaaatttggactgaacgaggtctcattaatagtaaa
-ggtcaagaccttgttcacaaggagctgttcacccaagcattgaataatcttcagttgccg
-gaagaaatagctattgtccatgttcccggacaccagaaaagcctttcttttgaaagttga
-ggaaataacctagcagatcaggtagccaagcaggctgctgtgtcttctgaaatgcgtgtt
-tttcacttaactccctacctccctcctcctaccataatccccattttctcttccaccgaa
-aaagagaaactaataaaaataggtgctaaagagaattcagaaggaaagtagatactgcca
-gaccagagagaaatgttgtctaaaccctttatgagggaagtcgtatcccaactacatcag
-gggacccattttgggccccaggccatgtgtgacgcagttctcagagtttatggttgtata
-ggaatttataccctggcaaaacaggttacagatagttgcttagtatgtaagaaaactaat
-agacatactataaaatgattacctctcaggggaaggaatccaggctaaaggccattccaa
-agtatctaagttgattacacagaaatgcctctgatagatcatctaaaatatttactagtg
-atagtaggccacctcactccctgggtcgaagctatccccttttcaaatgcaacagccagt
-aatgtagttgaggccctaattgaaaatatagtacccaggtttcgactaacggaaaatact
-gactcagacaatggaactcatttcaccacacacattattaaaaagctattccaaaatatt
-agacattagatgggaacaccatactccctggcacccaccctcatcagggagagtagaaag
-aatgaattagactctaaagaaccacttaaccaaattagtcttacagacttggttgccatg
-gaccaagtatcttcctatcaccctgctgagaatttgaactgcaccatggaaagacattgg
-tctttctccttatgagatgctctatggattaccttatttgcactccactgttgatattcc
-tacctttgaaacaaatgatcaattccttaaaaattatatacttggtctatgttctacttt
-ctcctctcttaaaactaaaggtctattagcacaggcaccacccttggagttcctggtgca
-tcaacattagcctggggatcacgtcctcatcaagagctggaaagaggagaagcttgagcc
-agcctgggaaggtccttacttggtgctcctaactactgaaaccgcagtccgcacagcaga
-gagaggatggactcaccacacccaagtcaagaaagcaccgccccctccagagtcgtgggc
-catagtcccaggggaaaaccctactaaactaaagctaagaagaatttaactccctttcat
-ctattctattactcttttttctttcctcactctattgctgaccatatagttattaacata
-accaagtcaatttcacctcaactattgcatttgatgcttgccttgttatatcctgtgggg
-atttgtcaagccaaagaaagctctctacttcagatacctctgtccctcctggctctcctc
-agactaggcattagtgaatcgggaccatttaatctggggagatttctataaagatcccag
-tggcaaccaggagtcttcccccagtgatgtagagcttttaagccatagttggtccaaagt
-tctgtggaccattaaagagcaaggatggattgccccaaccagtttttgtaatttcctaaa
-ttcatacattcgttttactaaagggacagtgcccactaactctcagctaaaccagtgcaa
-ccctatacaggttattattttgagcccacaaaattcttcctcttttctaagctggttccc
-ttctttaagccagttttatggtatgggggctgaagtttcagggacagaccctattggatt
-ctttgaaatgcacttctttgatcccctgctgtctgcacctgcctctgagcctttttccaa
-aacctctcacaacggaaccattgttcctcctctatctaacgacaaggccaagatagcgat
-ggtagaagttaaagacttaaaacaaactggcaattgagacaggataccaagatgtaaatg
-tttggttggaatggatcaaatatttcatccacacgttaaacaaaagcaattgttatgctt
-gtgcgcacagcaggccagaggcccagattgtcccctttccactagggtggtcctccagtt
-gaccgggcatgggctgcatggtagctcttttccaggattctatagcctggggtaagaagt
-tgtgccaagctctctctctgctatatcccgaagtttgacaccttgtgggtcagcccccaa
-gggccatccagcttccatctcccaacactaagtttacttcgtgtctctcatgacagggag
-gaaacttagtgttccttggagacctgaagggatgcagtgagcttaagaacttttggccag
-gcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcggatcacaa
-ggtcaggaaatcgagaccatcctggctaacacgatgaaaccccatctctactaaaaatac
-aaaaaaaaaaaaaaaaattagccaggcgtggcgtcatgcgcctgtagtctcagctacttg
-ggaggctgaggcaggaggatggcgtgaacccaggaggtggagcttgcagtgagccgagat
-cgtgccactgcactccagcctgggcgacagagcgagactctctctcgaaaaaaaagaaaa
-agaactttcaaaagcttaccaatcagccagcccttgttcatcccctagcagaagtgtggt
-ggtattgtggtggacctttactggacactctgccgaataactggattggcacttgtgctt
-tagtccaactagctatccctttcaccctggcatttcatcaaccagaggaaggaaaaataa
-gacatcgtaaagtgagagaagccccttatgggtctttagactctcacttctgtttagacg
-caattggggtcccatggagaatacaagatcaatttaaagtctggaatcaaatagctgcag
-gatttgagtcaatatcttggtgggtgacaattaataaacatgtagattggataaactaca
-tctattacaaccaacagtgatttagtaactacactagagatactgttagaggaatagctg
-agcaagtaggggctacaggccagatggcttgggaaaataggacagccttagacatgatat
-tagcagaaagaggaggggtttgcatcgtgactaaaactcaatgttacaccttcatcccaa
-acaacattgcccctaatggaagtataacaaaggcattgcaaggtctcactgctctatcca
-gtgagttagccagcagctcaggggtaaatgatccctttacaggatggctagaaaaatggt
-tcggtaaatggaaaggaataatagcctcaattcttacctccctcgtagctgtaataggtg
-tacttattcttgtcgggtgctgtgtcataccatgcatccgtgggttggtgcagaggctcg
-tagaaacggcacttgctaaaacctcccttaactatcctccaccttatccagagaagcttc
-ttcttttggaaaatcaagcagaacaactaagtcaagacatgttaaataagtttgaagaga
-aagccgtaagaaaaatgcaagaggaggaagttgttaaatatgaattctaaatttctcttc
-aaagaattagtatgtctgtatgttcaattctttgccttctacttttaaacttaatttcct
-cataaagcaacctttttcgattacctgctccaccctgactcactccgattacctgctcca
-ccctgactcactccgattacctgctccaccctgactcactccgattacctgctccaccct
-gactcattccgattacctgctccaccctgactcattattctctgccctgcataaccatta
-ttttcccgccaaagcactcaccccatcactctctttaaattagccaatcggaattagttt
-agcctgtgtggtctaaccctagccaataggggaatgacatagcagcaggggccacatcct
-tcagggataagaacccctttccttcccttgtccagatgtgtgctcaccattgctccatct
-gtgaggttgcacccttttatagaagtaccttgccttgctgagaattgaacagaaaatttt
-atattcgagtgctatttattttgaggcacagaaactttatatataacaatataaacccga
-gaccttggcgggcacacacacaagcagctgaatgtcaagaggaGTGGAGGAACGGAGTGG
-CAGAGAATGGCAGAGAGCGCTGGAGAGTGGCAGAGCAGCATGGCAGAGAGGGAGGGAAGA
-GGCGTCTGAACTTtggaagacacctccactcctcaataaagtctccgcatgtatcacttt
-tcaaacagttcatgtgacctgattaatccaggatgccagacaagaatctgggGAAgttaa
-cattcaggcatccctggatggcaaggctaaaggagcacactgtaacatatgcccacttgg
-gctccagcacctgtccatctgtgtgttcccccttccctcaggggtttgagcagtggggtg
-accaaacagacgagccacaccccctgttgcatgtcctgcaaggagaatcagggaactctc
-ctgtttcaGttggaagagcaagtgtccctctctctctcgtggtggggagacatctcttcc
-ttctgggctgtcacagccccaacctcaccaacctacctgacaagggagtctggcagaaca
-agggcaagggcagggagaagcacctctaactctattcctggataataatcaagtctctaa
-aagtcatcctggagccgggcacagtggctcatgcctgtaatcccagcactttgggaggct
-gaggcgggtggatcacctgatgtcaggagttcgagaccagcctggccaacatggtgaaaa
-cctaactctactaaaatacaaaaaaaattagctaggcatggtggcaggtgcctgtaatcc
-cacctacttgggtggctgaggcaggagaatcacttgaacctgggaggcggaggtcgcaat
-gagctgagactgtgccactatgctccagcctgggtgacagagagagactctgcctcaaat
-aaataaataaataaataaataaataaataaataaataaataaataaagtcatcctctagg
-gctttgaggccgttcaagcccctattttttccatctctgtggatgagcctctgttaaatc
-tgattgtggctgaacaagagataatgttcctaatagatacagggaccagttattcagctt
-taagtgtttattacagcccaatgtgctagtcctccatttcattacgggtattgataaact
-tcagtgaggctgtttcacactgccactcccttataaaatgaaaggctattcctttaccca
-ctcttcagtcctgccaagctgccctgtttctttattaggtcacaatttgctcacaaaatt
-acaagcgaatttacagttaagacctcacattctagctgtaattaactcacacttcaccaa
-aaaagttgctgcagtctatagaacatcacattttaaaacaagtgccggccaggcgcagtg
-gctcacgcctgtaatcccagcactttgggaggccaaggcgggtggatcacttgaggtcag
-gagtttgagaccagcctggtcaatatggcgaaaccccatccctactaaaaatacaaaaat
-tagctgggcatggtggcacacacctgtaatcccagctactcaggaggctgaggcagggga
-atcacttgaacctcggaggtggagattgcagtgagccaagatagtgccattgcactccag
-ccctggcaacaagagtgaaacgctgtctcaaaaaaaaaaaaaTTGTTCTTTTGTTTGCTT
-TTCTTTCACCCTGATTCCTCCTTCCCCCTTTGCCGTCTTCAGTACCAAGCTACAAAGCTA
-GGGGTGGCTGAGGACAGTAAACAGAGTGTGGtcttagctggctttttccctcctgggaag
-ttgttgtttaggatcctaattctagttcagaggtgcattctaaatagtcttctccattgc
-ctttccccccaaaattaatctcacacgttggcttgtgtgtgcattcacgtgaggaactga
-actgtcattttcatagataaataagagactgagtttccttagctccaaagagaaagggca
-ttttgctcctcccagcagaaaggtacccgagtgactggggggccttgcgggagtgttggg
-gggttgagcccccagcgacatgaagtgattctgcagggaactcacaacaaaattagtttt
-aaaaaggctcgtccaggaagcacatataggaactggtcactctgagttttgagccctctt
-ggaggtgctagacctccggagaaaacactgagacacctaagagggtggtggcaaggattc
-agtggtgacacactgtggagtctcatctgcaaccattacacttcgacctactccacaaaa
-accctaggccacagctcagttactccttaaaagaaagtgggaaacaaataatctaagaat
-aaggaaaaacaaggtgttgacgaaaagagttaaactgtgtaaaatagttgaagatattta
-ttcagagcccaatatgagtgactatggcccgtgacatagcccttaggaggtcctgagaac
-acgtgcctaaggtggtcggggctcagcttggttttgtatattttaggaaggcatgagaca
-tcaatcaaatacatttaagaaacacattggtttgattcagaaaggcgggacaattcaaag
-caggggtcagggtgagggtggcttccaggctataggctataggtaaatcggtaaatttaa
-actttttgttttgttttgtttttttgttttgagacagagactcactcttccacccaggct
-ggagtgaagtggcacaatctcaactcactgcaacctccgcccccatgggtttcaagtaat
-tctcctgcctcagcctcctgagtagctgggattacaggcacccaccaccacgcctggcta
-atttttgtatttttagtagaggcagggtttccccatgttggccagagtgatcttgaactc
-ctgacttcaggtgatccaccggcctcggcctcccaaagtgctaggattatgggtgtgagc
-caccttgcctggtctaaatttaaacattttctgattgacaattggttgagtttgtctaaa
-gacccgggatcaatagaaagtaaatgtttaggttaagataaaagactgtggagtccaagg
-ttcttttgaggtcttatattggctgcccttagagacaataggtgacaaatgtttcttatt
-cagacctttgaaaatgtgctagactattagttaatctcttcaggattgggagggcctaaa
-ataaaaagatctagctatgctaatagagattctttacagttgcaaattttcccccacaaa
-gtacagtttggcaggaccatttcaaaatatggcaaagaaacatgttttggggtaaaacaa
-ttgactttcttcttggtcatgtaatgttatgccagagtcagattggaaagtagtcatcat
-atataatgttaaataaaatccatctgatgagaatttatgatttgtagggcatgactcccc
-agaccccttagataggaatttaggcaagatagaaaaaatcagagcttagtcttctcacaa
-gagaatgaccctcttttaggtaccccattgattttacggcatctctactttgcaagtgtt
-tgtgtaaatggacatattatggtctctttgtgcacaattatgtcaaagacaatttagagc
-ttgaaggttgacctccagctgtaaagttcctaagttctctatctctctgctttcttttct
-gcctgttttaagtctgctattatttttctttctttttttgagacagagtcttgctctgtg
-cccaggttggagtgcagtggtgcaatctcagctcactacaacctctgcctcccaggttca
-agcagtcctcccacctcagcctcctgaatagctgggactacaggcatgtgccaccactct
-tggctaatttttttttttttttgagacagagtcttgctctgttgcccaggctggagtgca
-atggcatgatctcagcaaaccaacgagtttctattaatatctcatggctagagttctgag
-ataatagctataggatctttggttgtatgagtatgtatgtgtgtgtttatgcatacatac
-acttatttcattgtgttttctagccacaggtactgaattggcttaaagttaaagaatatt
-cataaattaataagcctaaatgcttttcaagttcatgtgacttaagtaaaatctttaata
-agctagctttaaaattattggtaaagtaatattagaaatgtcttaaaaattgttagcata
-aatttttgtttgcatttattgatcaagggacttcatatactgccaaatactgtaaggtgt
-caaaatttggcatagggtttgtaaaactacaaaaccgttcaaaacagaatgatttttgct
-tttgtaatttttgataaataagacattgatattggtttaatgaaaacagctaaatcatga
-attatttagtgaaataacaatatatttaatcttaaggtttttacttagcaaacacctgaa
-attcacaggctatcaaatgtttgacagggaaataactttaaatgatgactatcacagttt
-tcataactaacctgggtaaactattaaaataaaatatttaggtaaatgtaatgggataaa
-tacttgtagacaaagttgtcataatttaggatctaaagttatgttaaattaaacaataga
-tatttcattaactgggtttttttaattaaaaaagatattgcaggaaatcattttttttct
-aaaaaatgtgttcttgttaaaaggaggataatttttgtctaattcaaagcttatttaaag
-gttatatataaaataaggtaaaaagaaacaagaaaatatataaagaagttatagaaataa
-aaaagaatttttggtaagaaagcttaaagaaaaataattttacatgagaaagaaccttgt
-atggtacatttttgtcctagaataaaatgactggttgtttaagaaagaggaatgttcata
-caaaccagaaagtccaagcatgtcgtgaatggtctgtttaagttataataagagcattta
-tggaaaaagacccacaaactttcatataatcaagttgtctataattaaagggaaattatt
-tataatgatcttttgagagattgggttttgatattaaaaaacatttatacactaaagaat
-tcattagaacaacattttcttaaggtattgatttacttttaataaattacaagactatat
-atataatatattttttcctgcaaagttcaacttttattgcatctcactgttttcagcttt
-ctctccccttttaaagtacctgaaataataactctatctttcaactcatttttagctcct
-gtaagtttttttattttctcctttgtgttctaactgttgtggcctgacgctaataaatgt
-tttatctttgtggtctaaaggaaacattccttccaacataatatttcctgtagggaacag
-cggttgaaatgcagaaggtgttttgttttccctttgggaaattggcctaataaacagagt
-ttatgctttattgaaataattcctatgtcattattactaagttttggtttgtttagaaaa
-aaacccgagattaaattttttttaattaagattattacatacatgtaaccctctgtatgt
-gcttttaaagtccttgtgccattaagttacagagctttgagtccttggtctaaaaagaac
-accaagtcctgctaaatattaaacactgacagcagttaaaacctcattttctgacctggt
-agaagatgccaatcaaaataaactgtgttcatgagacagaaggccggaaattaaaacgat
-tcaactcctcaaggtctggagactatcaaagaagaggtgggtgcatgagattgtaagggc
-cgattttgagagatcaaatgattataaggccaattttgagagataaaataattgagtttc
-tctataaattaaccattaatctcaaaggcacactgatgcaagactagcatatgggctgct
-gtgtcacgttaacaaggttttcttggagaattaacccactccttaataaaaggttataaa
-agaggttataaaggttataaaaaaggcttgtggaatttttatcttgtggtcaggatgatt
-aaaattttatagattgtttatacattttgaaaaacaaatttaattggcctcgtttttatt
-agggcttattgtttaggcaattaagtcttctctctcaaagaatcaaggtttttgcctttt
-ttttgaaatctttgagttatcaagttgagtaaatgaaagacttattttacaatgacttga
-tctgtgatcctattttgtgatatcaagcattttatttatttatttatttatttttgagat
-ggagtcttactctgttgcccaggctggagtgcagtgctatgatcttggctcactgcaacc
-tccacctcctgggttcaagcgattctcctgcctcagcctcccgagtagctgagattacag
-gtgcctgccaccacacccggctaatttttgtatttttcatagagacagcatttaccatgt
-tggccaggctggtctagaactcctgacctcaggcgatccacccaccttggcctcccaaag
-ttttgggattacaggtatgaaccactgtgcccagccaaatcaagcattttaaacttttta
-tttttatttttaaaattttaatattttgagatggagtctctctctgtcactcaggctgga
-gtgcagtggtgcaatcttggctcactgcaacctctgcctcccaggttcaagcaattctca
-tgcctcagcctcatgaatagctgggattacaggcacttgccaccacacccagctaatttt
-tctatttttagtagtgacagggtttcaccatgttggccaggctggtcttgaactcctaac
-ctcaggtgatccacttgccttggcctcccaaagtgctgagattacaggtgtgaaaggtgt
-ttaaaggccactgtgcctggcctttaaactttttatatttgacaaactttccaaagtcaa
-attctaacttggttcctcaatgattttttgatattagtcccctgaagtccaaaagagaca
-cagtcagcttatttggcataaaaatcatacaggaagcattgtcaaatatgtaatagtgtt
-tggctttctttgggctgtatttgtataaatatgttattggcatatgttccaaaattatgg
-gaaaatcctataattatgaatgacttagtatatgttattaatcattatcattattatgta
-aaattattgtatgctacagaagtaaccaagtttctttgtcaattgtgtctttaagtatga
-cttttctaaaacttttgtcatccacagttgttttacttttatccttttcaaaaggatgat
-tttacaatcagcataggactctgacagttgctgttgaatacaggttttggagatagtgac
-actaaaatagagaaaaaaaatccaacactcccatagagagctgaaatatacatgaatagc
-aagcagaagaggagttaactgcatggactgaactaatagaagactgaaataatccttcta
-tgactttttgcttaaaacattgctaatcctttctttgtttttcagagccaagaaaacatt
-tattttgagcttttaaaaaatttattattattattattattaacaaataaataatcttct
-ttctttttttcttttatctttctctgcagggcaagttctgtatttatagcttttaacaat
-tgaggaaattatactcctataaacaaaatttggagcatatttctctctatctggtttctc
-taaaatttggaaactagttgggagtattcttaacttatagcaatatagttatctgcacaa
-gtacaataagaatctgttttcttttgtaagaggacataattggggacagtggtgatttta
-ccaaggttttgactggaacaacatgctatcagatgcagactcctttaaggaatcaaagtt
-gacttacagagctaataaaagcatcttgggaaagctggcctcctatcttgtctacacagt
-ccctgtacaggttcctgacctgtggtaagtaaagagtgtcactttctaacaggcccagga
-gcccaaagtcttcctgaggtgaggaattcatccaattaatacaggtatttgcaggcacag
-gccgggcttaagacattaaagtcgaatgtgagattacttatggaataaagttccagcaaa
-gccaattaaaaaaaaaacaaggagcctatatggcaaataattattcttgatgattttatg
-caaatactccagccaaatataataagacagaaacttattttgcaaatgaattttgttcta
-taatttgtcctcagtgaaaggggactggagagagaaaaaattatgtttcaaaatcaccta
-tagtacacctgttgttagattttagtctcacttagtgtttttaaatttttattattttct
-atagtttggactaaactctaaaatttttcctggtcacaagtccccaaaataatttttttc
-attttttttcttttttcctttccttttccccccacattttttcctgattagaaatcacca
-aacattaaactgtgctttcctaaagccctgtgaactaaagctagacaatctatttacata
-cataagctactttcatacctgcctactggtgtatgaacttcagagtaatatggcctatat
-tgatttcccaggattattgttgttgttgttgtttttctcctttcctcccccattttctct
-taggacgtgagacttcacaacctgctaaagcgagctttcctaataatgtggaacctacct
-gtctatgaataaactgtcctagtcatgagagatcagacaaaacctgagaccagaggctaa
-ttttcttctaaaatgcttttaaaaagaaaaggggggaaAtgtgaaaggaaaataaacttg
-ggaccctcaaatcactaagccaaaacgaaaagtcaagctgggaacggcatcgggcaaacc
-tgcctcccattctaatgggatagctaaataagatagctacaaagattttaaaaagctaca
-tacctccctcacaattttcccacaaggaaattccttgtgtacctagaacagacagaactc
-aaagtcatccctctgctcatgggagacaaatgcacatctgatggcttcctttgccctatt
-gcttcgctaagccagactaaggcataagtgactattcctgcaagttgcatattcagtgga
-gggctaatcagaaactcaaaagaatgtaacaatttgtcctttatctacctatgacctgga
-aaacccctccccacttcaggttgtctcacctttctggatggaattgatgtacatcttacg
-tatttgctgactgatgtctcatgtctccctaaaatgtataaaacctagctgtgccccaac
-taccttgggcacatgttatcaggacctcctatggctgtgtcactggtgtgtccttgacct
-tggtagaataaattttctaaattgattgagacttgtctcagataactcttgatttgcagt
-aagtagcatttctaaacatctctggaatgcatgcatattgaaactcattatgcaaccctt
-gctgacatcaaggcaggaaaatgtctacaaatgtaatcatttagcgtgacctatgtggct
-aatgtggaccaaattatccttaagctcctgctttaaggtgcataaatgcccctgaggaaa
-aatccaccttggcactctccatcctatcttgctgagattcttgcctgcactcttctacag
-agttctttctttctaataaaactttccttttttcaaaccaatactattatccataaattc
-ttcttctttttttgtttttttgaaacggaatctcactttgttgcccaggctggagtgcag
-tagcatgatcttggctcactgcaacctccacctcctgggctcaagtgagtctcctgcctc
-agcctccagagtagctgggattacagacgtccaccaccacgtccagctaatttttgtatt
-tttagtagagatgaggtttcaccatgttggccaggctggttttgaactcctgacctcaaa
-tgatccacctgccttggcctcccaaagtgctgggattataggtatgagccaccatgccca
-gcagtaaattctccttactaatccacgagtggaccactttccaatgctgaggctctgaca
-cctcgctgggcaGCCACTTTTGATTATTTTGGGTTGTCAGGGCTCAGGGACACAAGAACT
-TGCTCCTTAGGGGAGCTGGAGGTCTAGTAGGGATTGCTTGTTCTCCATCAGGCCCCTAGT
-AGGGAGGCCTCTCCTGTCCCCAATCCCTGACTCCCAGGGATGCTCCCCTCCAAACCACAG
-caggaagttcctccttaggtcagacccacagccctgatgctgtggtctCACTGCAGGTCA
-TAGTCTCACAGGGGCCTCTTATAttattttaattttaattttaattaaattaaattaatt
-ttttttttttagatggagtctcgctcttatcgcccaggctggagtgcggtggtgtgatct
-tggctcactgcaacttctgcctcccaggttcaagtgattctcctgcctcagccacctgag
-tagctgggattacaggcatccgccaccatgcctggctaatttttgtatttttagtagaga
-cagggttttgccatgttgaccaggctggtctcgaaatcctggcctcaagtgttctgcctg
-cctcagcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggtcttatatta
-ttttaattttaaatttaaGAATACATTCTTAATATCAACCTTCAAAGACTCCCTGTTGCT
-TACCAAGTTAAGAAAACTACTTAAACCTCACATATAATTCCTTTCTCAACTGGGACCAAT
-AAACCGTGACAGCTTTATtgaagggggccagccccttcacacctgtgggtatttctcgtc
-aggtgggatgagagactgagaaaagaaatagacacagggacaaagtacagagaaagaaca
-gtgggcccagggcactggcgctcagcatacgaaggacccgcaccggcgccagcctctgag
-ttccctcagtatttattgatcatgatctttactatcttagcaaggggagtgtagcagggc
-aacaggtggggagaaggtcagcagggaaacatgtgagcaaaggaatctgtatcatgagta
-agttcaaggaaagatactgtgcccggatgtgcacgaaggctagatttatgtttctcttta
-cccaagtatctcagtgtagcaaagagcaacagagcagtattgctgccagcatatctcgcc
-tccagccacagggcggttttctcctatctcagaatagaatgaatgggaatggtcggcttt
-acacagagacattccattcccagggatgagcagagaagccttcctcttatctcaactgca
-aagaggcctccctctttcactcctcctcctcagcacagaccctttatgggtgtcgggctg
-ggggatggtaaggtctttcctttcccatgaggccatatctcaggctgtctcagttggggg
-aaacgttggacaatacccaggctttcttgggcagaggtccctgtggctttccacagtgca
-ttgtgtccttggttaacagagaatggagaatggcgatgacttttaccaagcatactgcct
-gcaaacatattaacaaggcacatcctgcacagtcctaaatccattaaactttgatccaat
-acagcacatgtttctgtgagcacagggttggggataaagttacaagttaacagcatctca
-aagcagaaacaatttttcttaatacagatcaaaatggagtttcttatgtttccttttcta
-catagacacagtaacaatctgatttctctttcttttccccacaCTTTCTCACGTGttctt
-tctttctttctttcttttcttttttgagatggagtctcgctttgttgcccaggctggagt
-gcagtggcgtaatctcagctcactgcaaactctgcctcccaggttcaagtgattctcgtg
-cctcagcctcccgagcagctgggattacaggcatgcaccatgacgcccagctaatttttg
-tattttcagtagagacgggtttcaccatcttggccaggctggtctcgaactcctgacctc
-aagtgatccacctacctcagcctcccaaattactgggatcatatgaatgagccaccatgc
-ctggccCATGTTTTTCTTGTACTTTAGGCTTTGCTACTTACAACCAGAACTGCTTACCAT
-TCtgtcagaagccttccaaccagggcaactccatcttgaataggggctgggtaaaataag
-gctgagacccactgaactgctttcccagaaggtcagacattcttagtcacaggatgggat
-aggagtttggcaggactggtatcacaagtacaggtcacaaagaccctgctgataaaacag
-gatgcagtaaaagaagccggccaaaatccaccaaaactacgatggggatgaaagtgacct
-cgattcgtcctcactgctcattatataggaattataatgcattcgcatgctaaaagacac
-tcccaccagcaccatgagaatttaccaatgccatggcaacgtcaggaagttaccctacat
-ggtctaaaaaggggacgaaccctcagttctgggaattgcccatccctttcctggtaaaac
-aatgaataatccaccccttgtttagcatacgatcaaggagtaactataagtatgttcagc
-tgagcagcccatgccactgccctgcctatggagtagccattattttattcctttactttc
-ttaaataaacttgctttcactttactctatggattcaccccaaattccttcttgtgtgag
-gtccagaaaccctgtcttggggtctggtttggtacccctttctggtaataATTCTGTAAG
-TATTTGTAGTACGTCTGAGCCACCAAAATTTCcatactgatccttccattagaatatcct
-ttctgcctgtctctttctggcaggatctgatccatatttcaaagccagtctcaaatgcca
-ccttttccaaagaaacctatcctTATATCTTTATCTAATACAAACAGTATATATTGGGAG
-CCTAAGAAATGCTTGTTGCATACATCAATGAATGAACCCCAAACCAATGTATTTCTCCCT
-TCCTTGTAATCTCCAGAAATGTTTATAAACTTTGTTGTTGTTTAtttgtttgttttattt
-ttatttttattttgagatggagttttgttcttgtcacccaggcgggagtgtaatggcgcg
-atctcggctcaccacaacctctgcctcctgggttcaagtgattctcctgtctcagcctcc
-cgagtagctgggattacaggtgtgcactaccatgcccagctaatttttgtggttttagta
-gaaatggggtttcaccatgttggtcaggctggtctcaaactcctgacctcaggtgatcca
-cccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgtgcccggccTGTT
-GCTATTTATTTAATATACTTTATTTTTTTGAGCGATTATAAGTTTATTtttatttattta
-tttatttatttatttatttttgagacagggtctcattgtcacctcttgcccaggctggag
-tgcagtggcacgatgttagctcactgcaacctctgcctcccagagtcaagtgatcctgcc
-acctcagcctcctgagtagttgggaccacagatgtgcaccaccacgctgggctactattt
-ttatatttttagtgcagatggggttttgccatgttgctcaggctgatcctgaactcctga
-gctcaagcaatctgcctgccttggcctcccaaagttctggaattacatgcgtgagctact
-gagcccggccTTAGGTTTACAGAACAGCATTCCACCCATGTTATTTATGCAGGGGAGCAC
-ACCACACACATCACTTTGCAGCTTCCTTTCTCCTCTTATATGTCTTACAGATCTTTCTGT
-GTTCTGTACATTGAGACACTCATTCATTGGCTTCACTCATTCATTTGAATTCattccttt
-gttcaacagatatttatcgtcagctctatgtcaggcactatgagaagtgcttgggatata
-aaactgaacaaaataaacaaagtcctttccattggagagatgacattctagtgtaaggag
-atagacaatagataataaatacaacaaataaataaatacatggtttagtatgttataaga
-tgctttctgtaggaaaaaagtgagagggacctggagtggagggaggaccgagtggggaca
-ggtgcagggtgggggcagccagtagagcccctctgaggaggAGTGGATCACAGGAGGATG
-ACTGGCAAGACCTAAAGGTGGCAAGCTGTCTCTGGTGCTGGCTCTGAGAGCAGGATAGCT
-GGAGTAGAGTGAGGGAAAGGCGAGGTCAGAGGTGAACCTGCAGGGCAGGTGGGGCTCCTT
-CCGCTAGCgcatggtgttccattatccagatgcaccaggacaaatgtcgcccactgccat
-tactaggtgcttaccatgtgccatcaagaacaataccgcaggccgggtgcggtggctcac
-gcctgtaatcccagcattttgggaggccaagatgggtggatcacttgaggtcaggagttc
-gagaccagcctggctaacatggtgaaacctggtctcgactagaaatctaaaattagccta
-gcgtggaggcgcactcctgtaaacccagctacttgggaggctgaggcaggagaatctatt
-gaacccaggaggcagaggttgcagtgagcctagatttcgccattgcactccaactgggca
-agagcaaaaatctgtctcaaaaaacaaacaaaaacaatactgcaataaacattctgtcag
-tctgtcattttgcccatggacagaatatctgcagaattaattcccggcagtgaacttgAG
-AGAGATCACCCAATTGCCTTCCAAAGGAGCTGTGCCTGGACCATGGGTTTCAGCACAAAG
-TGCTGCTCCCTCCAACTTGTAGACTCTTCTGGCAGGTCACGGTGGAGCTCACATTCTAGC
-GGGAGAGTGTCCAGGGCAGAGATATTCCATTCCGTGTCTTTTCTCCCAGGGCTCGCACAG
-AGAGGGTTCACGCGGTAGTCAGTAGGTGGGCAGTGCTTGGTGAAGGCATTGATGGGTGGA
-GGGATTGAAGGATGAATGAATGGATTAGGGGCTGACAGTGCCGCTGCAGTTACTCAAAGG
-AGCCACCAGGAGGCGCAGGGAGCCCACATTCTGGAGACAAACCTTTTAAAAAAAGCATCT
-GGTGACTTAACGACCTTTTCACCAATGGCTTGTGTGGGGCCTTAATGCTAGGGTGAGAAA
-AAGGTGGGAGATGGAAGAAAGGGGAGTGGGTAAAAGGACATGTGGGAGAAGAAGGCAGAG
-AGAGGGCCTTCTGAGGGGGCCTCCACGCCAGGTAAGGACCGTTTAGCTCCCCTAAGAGCC
-TGCAGCATTGATGCAGATCCCAGCAAAGCCAAAACCCCCTTATGCCCACAGTTGAGCCCA
-AAAGCCCAGAACAGAGGGGAAAAATAAATTTCAGGATAggccaggtgaagtggcttacgc
-ctgtaatcccaaaacttggcgaggtcaagtaatcccaagtactttgggaggctgacaggg
-gaaactctatctaaaaaaaaaaaataaGAAAAGGAATTTCCAGGATAAATATGTACAGTA
-TAATCCCATTTATGTGAAAAAAAAAATCTCCACAAATAAATTCCTTtgtgcgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtttgtgtgtgacggagtctcagtctgtcgcccaggctgaagt
-gcagtggcacgttctcggctcactgcaacctccggctcccaggttcaagcaattctcctg
-cctcagcctcctgagtatctgggattacaggcgtgtgacaccacacccagctaatttttg
-tatttgtggtagagacggggtttcaccatgttggtcaggctggtctcgaactcctgacct
-cgtgatctgcccgcctcagcctcccaTAAATTCTACATATTAGTTTGGGGAGTGTGTATT
-TACCACATACACATCTACAGGGAAAATCTGGAAAGGTAAATGTCGAATTGACAACAGTGG
-TTACTTTTGTTATTGTGTGTGTAGAGAGGGGCAGGGGACAAAAAGGAAAATGAGGAGTGA
-TCAAAGGGGACTTTAATTTTCTTTTTTTTTTTTGAGACAGAGtctcagctcactgcaacc
-tctgtctcccaggttcaagtgattctcctgcctcagcctcccaggtagctgggattacag
-gcacccgccaccacgcctagctaatttttgtattttattttagtagagacagggtttcgg
-tttcaccatgttggccaggctggtctcaaactcctgacctcaggtgatctgcctgctgcg
-gcctcccaaagtgctgggattacaggcgtgagtcactgcaccgggccCCCAAAGGGGACT
-TTAGACTAAACTGAAACATTTTAACTTTCCAGGAATCTGTAACCCTGCTATTATATAACC
-ACAAATTAAAAATTACTTTaaaaaatgaaaaaaaaaaaaaaaaaaaaaaggctgggagcg
-gtggctcacacctgtaatcccagcactttgggaggctgaggcaggaggatcacgaggtca
-ggggtttgagaccagcctggccaaaacggtgaaaccctgcctctactaaaaagacaaaaa
-ttagcagagtgtggtggcacgtgcctgcagttccaactactcaggaggctgaggcaggag
-aatcgcttgaacttgggaggcagaggttgcagtgagcctagactgcgccattgcactcca
-gcctgggcaacagagcaagactccggctcaaagaaaaaaaaaaaaggaaaagagaaaaaA
-AAAGGAACAATAACAACAACaaaaattaaatgctatcttgtgttgcatcaatagaagtct
-tacgtgcagctcaagggaggtgacagccccctctgctctgctcagaccacacctgggacc
-tcctttcctcttcttggccctgtcccgtgagaagaataatgacagcctaaggcatgCTGG
-GGGTTGGAGATGGGGGGAGGCTGGGGCCATCTGCACATGATACAGATCCAGGAATAGTCC
-CTTTACCCAAGCGGGAGAAACTGGGCAGGTGAGCAGCTTCCAGGTGTGTGGATGGCAAAT
-GGATGCCAGACTTTAGGATAGGAATCCAGGGGTGCAGCGGATGGAAAGTCCAGCCCAGGA
-TGGGGCATAGTTTTCCCACCCAGCTAGGGAGGGAGGGTAGGGGCTACTCTGGGGTGTCAG
-GAGTGCCGAAGCCTGAGGTAGGCGCAAGCCAGGCAGCATGGCAGCATCCTTCCAGAGGGT
-GTTGTGCAGCTGTGGAAAACAATTGCTGGGAGGCCGGCAGGGGCAGTGGTGGAGGAGACC
-AGAGCTTAATTCTAGGTGAGTCACAATAGCCTCATCTGTAGAATGAGTGAGGGGTGGGGC
-GTAGTTTCAGAttttttttttttttttgacacgtagtttcgctcctgttgcccaggctgg
-agcgcaatggcgcaatctcggctcaccgcaacctccgcctcccgggttcaagcgactctc
-ctgcctcagcctcctgagtagctgggattacagccatgtgccaccatgcccggctaattt
-tgtatttttagtagagacggggtttctccatgttggtcaggctggtcttgaactcttgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtcagccaccgtgcccCACCA
-GTTTCTGACTGAttttcttttttttttttttttgagacggagtcccgctctgtcgcccgg
-gcgaagtgcagtggcgcgatctcggctccctgcaagctccgcctcccgggttcacgccat
-tcccgggcctgggaccacaggcgccgccaccacgcccggctagtatctttttttattttt
-attttcaatagagacggggtttcaccgtgttagccaggacggtctcgatctcccgacctc
-gtgatccgcccgcctcggcctcccaaagtgccgggatcacaggcgtgagccaccgcgccg
-ggccCAGCTTCTGATTTTATGCAGCTGGCGGGATCTTGTTCTTGGTCCTTTAAGGCGACC
-GGAGGGATTGCAGTTTTAAAAACTCGCCAGCAGAGGTCGCCTTCTGACGGATTTGACCAA
-AAAATCCATTCCGGTGGGAAAGGGGAACCTGCGCCTGCGATtctctctctctccccctct
-ctccctctctctttctctccccccctctctctctctccctccctccctctctcctcctac
-tcctccctccctccctctctctgtctctccctccctccctcccgctctctcccccctccc
-cctctccccctccctccctcccttcctccctctctGtctctttctttgagacaaagtttc
-actctgtcacccaggctggagtgcagtggcacgatctccactcactgcaacctctgcctc
-ccggggttcgtgattctcatgcctcagcctcccgagtagctgggattacaggcgcccgcc
-accacgcccggctaatttttgtatttttagtagagacggggttttgccatgttggccagg
-ctggtctcaaactcctgacctcaagtgatctgcctgcctcggcctcccaaaCTAAGATTC
-ATTTGTTGACTAAGTGAATAAAAGGGGAGACATTGAAGAGGGGGACCCgactggatttgg
-gggtgaaggtggagttgagagtgactttgaggcttctgcttgagcaatgagtggagggtg
-cctctcctgagctggggaaactggggcagCACTGACGGAGGGGACACAGCTACAGAGGGG
-AGAACCCTCTCCTGCCGGGGCTGCGGGTTACAGCCTGCACTGCGATTCTCTGATCTCAGG
-GACCTCAGACTTCTGGGGCCCTGTCCCCTACCTCTGTGTATGACCCTAGCTGGCTGAGGG
-CTGAAGGCTTGCTGTTGGCTCTTTCTGCACCCTCAGCCTTCTCCTTCCTCTTCCCTCTGC
-AGGACTCTGTCCTGGGTCCTTAGGAAGAGTCCAGGCCCCAGGACAGGGAAGTTGGGTCAG
-GCCTGGACCTCACATTCCCTGCCTGTCCCATGAGGTGGACAGTGAGAGGACAAATGCCTG
-GACCCCTGGCCCCAAACCCAAGAGCAGATGTACCGGAGAAGAGCTTCTTAGAGCACCAGG
-TGCCAGGGCTGCGGTGGAGAATCAGGGGGGCCCAGGGGAAGGGGCTGCAGATGAGGGAGG
-AGATAGATACGGAGGGCCTGTGTGCCTCCCAGATACAGGGCTGGCTTTCCCAGCCCAGAA
-GGTTCTTTCTGCCTTTCCCAGTCTTCTTCCATTCTCATTTCATGTTCACACTTTTGGCCA
-TACCCAGGGTCAGCCATGAAGATTGTTCTCAGAATGTtttctttcttccttcctttctct
-ttcttttctttctttcttcctttctttctttcctttctttttctttcttctctttctttt
-tttcttttcttctttctctctctttctttctctctctctctctccttccttccttccttc
-ttttctttctttcttctttctttttttgaaacagagtctcactatgtcacccaggctgta
-gtgcattggcacgatcactgctcactgcagccttgacctcctgggctcaagtgatcctcc
-cgcctcagcctcctgagtagctgggaccacaggtatgcaccaccatgcccagctgatttt
-ttaattttttgtagagatgggggtctcactgtgttgctctggttggtcttaaactgctgg
-gctcaagtgatcctcccgccttggccttccagagtgttgggattacaagcaggagcagca
-cacctggccAATGTTTTATTTAAATCAACTCACTTAGGTTGAAttagaataattttagac
-acacagaagagtgtgtctatataattttgaattatatacccaacactcagatataacatt
-agcattttgccatatttgcttcatctatttctttctgaaatattttaatgtaaattacag
-atatcatgaattttcatccccaaatactttagtctgcatCAGTCAAAGATATCTAATATT
-TAATCCACAATGGATTTCCCCAGTGGCAATTCCCCTAAATTGTGTTTTACAGTTGACAGT
-GGatttattgtaaaaggaaactcgatataccaagtgacaagcaagttatcttctgttata
-aatagaaaggatccctggaaatggacacagtgtcaggcccagagctgtgggtggagacct
-gctctctgtttgacataaataggagatcagtggctactaaatctgaagacagggcagcag
-caaagaacattttctcacggatgtgatgagacttgaaagggactcagaaagggggtcact
-ttctccaggttggggtaactgttatttaagccagggttcatCTGCAGCGTGGGGAGCCAG
-AGGGTGACCCCTTCCCTAGGTGATGGAGGTGGCTGAGGCTCCAGAAGTTTCCAGAGAAAG
-ATCTGGTGTTCCTACAAGGCCAGTGGCAGGGGGAAGGGCACTAGACAGTGGGGCTGGAGG
-GTGTGGGCCTGTCCCTGCTCTGATTTTGGGCACTGCACTTTTGCCTGTAAGAAGGGGATA
-TGTGAGGCCAGGACAGGGTCTCCTACTCTGTCCCCACTCCCACGCCAAACAGGGCCTTGA
-GGACTCTCGCGACCTCCATGACCCAGCTTCCCTCCTACCCCAGCCCCAAGCCTGTTTTTG
-TTCCCCTCCCTCCctcctgcttgatctttgagcctcagccaggatgttacctcctcctag
-aagcctgccttggtccctggaatggattaagggactctctcctgggccccacagctgccc
-aggatcactcagcactgtagtgccctgttggcctttgcctccctccagctgtggacgtac
-aaagcagacagcgaatctgtcttgctcaccactgtacccccatcccctactgcagcacct
-ggcacatagcagtagtgcggcacacttgttgaatgaataaGGGATCATTACTACTACGCT
-TCCCACTCATAAATGTCTGCCTCTTCGGGGGGCTCAGAATGCACATTTGGTCCTTCATTA
-ACTCATTTACTCACAAttttttttttttttttttttttgagacggagtttcactcttgtc
-gcccaggctggagtgcaatggtgtgatctcggctcactgcaacctctgcctctcaggttc
-aagcgattctcctgcctcagcctcccgagtagctgggattacaggcgctagccaccatgc
-ctggctaatttttgtatttttagtagagatggggtttcaccatgttggccaggctggtct
-cgaactcctgacctctcaggtgattcacccacctcagcctcccaaagtgctgggattaca
-ggcatgagccaccgtgcctggctcatttactcacaaatatttactgagcacctactatgt
-cccaagcagtattctaggcactggaaatggggcaaggctgctgcctctgtggaacttata
-ctggggtgtgggaggcaaagaaaaacaagcaaacatacatatgaaataatttaagatgcc
-actcgtggtgggagggactgacaggagctgctgtggaagagagcattaggagggccttgc
-tgaggggtgactttatttcagctgagaggtggatgagaaggcacctgcaggggaagaaga
-accaggggaagggtgttcctgatggagcaacagcctgtgctaaggccccaaagtgagcac
-cagctgggcgctgagggacagaaccaggcacaggctcggttagaggaggtctgaggtccc
-agaggagacaagagaggggaaggatgggagggcaggcctgagccgcagaaggccagtgga
-aggttctgagtgggaagaggatgggataggagttatattctgaaaggtccgcctgtgctg
-ggtggaggatgggtggggacaggcaggagcagcccaggctctgatgcagcctccaggcag
-agatgGACCAGGGGAGCCCATTTCATATCCGGCCCCTGTGGAGGGTCTGAGGGTGTTGAG
-CAGACAGGCCCTGGCTTTGGAAGTCCTGGGTGTCTGGACCCGCCTGCCTGTGGGGCCCCA
-GCAGAGAGGAAGGGAGGCGGGGCTCCCAGTGCCTGTTGACTCATTTGCATCTGATTTGCA
-TGTGAAGCAGAGAGTCAGGTTGAAAGCTGGGAAGGCCTGTGCCAGCCCTGGGTAGAGGGT
-CTTGGGTGTTAGTTCCCACAAAGACTCTGTCCCAGGCCATGACCTTCCTGTTCAGGAGGG
-GCTCTGCCTTCCCTTGCCTCCAACGCCCCTCTGGCCTGGCCCTGCCATCTGGGGCTGGGC
-AGTGCCCACGGGGACAAGGTCGTTTCCTTTTAGGAGAGGTCTGCATGCTATGAGGACAAA
-GGCCAAATCCCCACCCTCGGGAACCTCCTTCCCCAGCAAAATCCCATCTGTCAGGCTCAG
-CCTCTGACCTTCGACCTCTCTGTCAGCACAGGCTGCAGTGTTGGGGAGGGGAGGGTCCCC
-ACCCCCAACCCTAGGGGAGACCCAAACCTCTCCCCCCAGCCTTCTCCATCTGTCCCCTTC
-GGCTtctgccacctgctccgtgtgatccaggccaggtcacctccgctttctgggccttgg
-ttcccccacgtgtccaatgtgggTTTCCCAAATACCAGTGACTTGTGTCAGTCCACTTTT
-GTAATTGTAGCCAACTCCacttactatttcttaagtgaacttactctccttcacttaaat
-agatttaatttaaaaagaaatgttataccagctctgtaaatggaaaaccagtttcatctg
-ccacaagtagaaacataataggaaaaaataatgaaatggaaataaaacaatgttactcta
-gtctagcCTCaagtgaaaaaagtcagacacaaaaggttacatttatatgattgtctagaa
-aatgcaaaactagagagaaagaaaacagaccactggttgccagggttggggagagggagc
-tgacaatatcaaggggtgcagaaactttttagggtgatccaaactgttttttgatgatga
-tggtggttacagattgtatacatttgccaaaaatcaccaaagtgtacattcaaagttggt
-gagttttattttatgtataaaccacctcaaaaagacaaaTTTTAGAGAAGAAAACAAAGA
-AAAATGCCGGTTTAGCCCCAAGTCTGAGGCTTCCTCTCTGTTAAACAAATTAGCAAATAG
-AAggccaggcatggtggctcatgcctgtaatcccagcactttgggaggctgaggcaggag
-gatcacttgaggtcaggagttcaagaccagccatggccaacatggtgaaatcctgtctct
-acaaaaaatacaaaaattagctgggcgtggtggcgcatgcttgtaattccagctactcag
-gaggctgaggcaggagaattgcttgaacctgggaggcggttgcagtgagccgagattgca
-ccaccgcactccaccctgagtaacagagcaagagactccatctcaaaaaacaaacaaaca
-aacaaggaagagaaAGAGGGATTTCTCTCTCTGTCTCTCACCAACTCTCTAACCCTCCCT
-AGTTCcatgcaccaaggaaaagctatgtgaggacataggagaaggtggccagccacaggc
-caagaagagagccttcaccagggactgaatcagctggcacctccatctggtacctctagg
-ctccagagctgtgagaaatagatgtgtgctgtttgagccacatagtctctgatattttgt
-tttggcagccggagcagactcatgcCCTCTGATCTCATCATTAGCATAATGCctgtttat
-agaaccatgctgtgggcaggctctgtgctaaaagctttgccagcatcatttcagagactt
-gatgtgacatcttacatcgtaggggaaattattgttcccattaaagatgggCCCACAGTG
-TGGCTAAGCCAGTGGGGCATGTCCTCAGACCTGGAGTGCTCCCATAGGAAGCTGGGCCCG
-ATTCTTTCTGAAGGTGTGAGCTGGAGGCAGTGATGGTGGTTTGAGAGGCACGGGCTGTGG
-GGAACTGGATACTGAGGGCAGTCCCTGTGTCCCAGGGGAAGCACTCTGTGCTTTCAAGGG
-GGGCACTGGCAGAGAAGGAAGTGTCCCTCATCACATCCTGGAGACCCACCCTCTGGAGAC
-AGTGTTTTCACGAtttcttttctttcttttttttttcagacagggtctcactctgtcacc
-caggctagagtgcagtggcacgatctcagctcactgcaacctctgccttctaggttcaag
-taattctcctacctcagcctcctgagtagctgggattacaggcacccgccaccacgccca
-gctcatttttatttttttatttttcgtagagacagggtttcaccacgttggccaggctgg
-tgtcaaactcctgacctcaaatgatctgcttgctttggcctcccaaagtgctgggattac
-aggcatgagccatcatgcctggccATGTTTTCACTATTTCTATGGACCGTTTCATAAGTG
-TTGTGTGGACATAGGgctccagggttaaatgtgtttgggaaatgtggtgtaagcaaagag
-aaagaagtttccactctaatacttctcagagactttaatgtggagataggcatggcgaat
-ctcTCACTGCGGGACAAgtgggcaagagaagtgtggatgctgccttctgggcactcacag
-ttggtggaggagacagccaacatgcaagcaggggccacaccacatgtctggaggttggaa
-cgctatgcagagagaccacaggaaccatgggggaagtggggagggatttcccagaggaga
-tgacatttgaacaaagatgcaaaggaagtgtggaaggaggtaagggagagctgtatgact
-gtctgggggaagagaaacccaagcagagggaacagcaagcacaaaggttctgaggctcaa
-ggttgcttggtgcatttgacaagcagaccagcgccattggctggagctagctgggccgag
-tgggagggtgataatggatgaggtTGACCACGGTCCGCTCCCAAAGGCCATGGAATTCAG
-AGCATACTGGAGAGCCCTTAGTGGGTTTGGACAGACAGTGATACCTTGGGACACACAGCC
-TCATGAGCTCATACTGACCAAACAAACCACCCAAAATAGCAGCAGAAACAACAGCCACAG
-GGTGCAGAGGGTCATTCAGGGTGcctctcacaagcctgggaagtaggcatgtgatatggt
-ttggctgtgtccccacccaaatctcatcttgttttgtaactgcttcaattcccatgtgtc
-gtgggaggaacccggtagggggtgattgaactgtgggggcaggtctttcctgcgctgttc
-ttgtgatagtgaaaatgggtctcacgagatctgatggttataaaaatcggagtttccctg
-cacaggctctcttttttgcctgccgccatccacgtaagatgtgacttactcctccttgcc
-ttcggtcatgattgtgaggcctccacagccttgtggaagtccattaaacttctttcattt
-gtaaattgcccagtctcgggtatgtttttatcaacagcgtgaaaacgaactaatacagca
-cggttaactcccattttacaggcgaggaagctgaagcttagaaagatgaaagaatttgcT
-TGTGACCCCGAACGTTCCCTCTGGCTGATGCATTGTTCCTACCTGCTCTGTTTCCTTGTT
-TATGAAGCTTGCAGGCTCCAtggtcctcaaccctggctgctacacactggaataacctgg
-ggtggcagactgtgtctccccaggatggccacaccaatacatctcacatcccacatgctt
-ggccaatagcatatgacagatgtgactgtgggttacttctaaagctaggccataatagcc
-atcgcaaccccaccgtgatctctgggattgctagttctgagggaagccagctgccatgtc
-ctgaggttactcaagaagccctgtggagtaggccatttggggagggactgaggcccccag
-gcaacatctgtcccaacttgccagtcatgttagtgaactacccttgtccagccttcagat
-gacACCTCATGAGAGGCCCTGAGAGAGTCTTATTGTCCCGTTCACCATTCCTGTTGCCCT
-GTGGCCAGCTAATCAGCTTGTGGTGGTTTTCATTTCTTTTTTCTTTTTGCCATTAATAGC
-AATGCCAggctgggctcagtggctcatgcctgtaatcccagcactttgggaggccgaggt
-gggtggatcacctgaggtcagaagtttgagacaagcctggctaacatggtgaaaccctgt
-ctctattaaaaatacaaaaattagccaggtgtgatggtgtgcgcctgtaatcctagctac
-ttctcccaagtagaagggcgtgattcttctcatgcctcatgctgaggcatgagaatcact
-tgaacccgggaggctgaggctgcagtgagcggtgtttgtgccactgcacttcagcctggg
-cgacagagtgagactatctcaaaaaaaaaaaaaaaaGTAGCAATGCCATAGTAAGTATTC
-TTCTAATTAAGCCCTTCTGAATCAGCTTAATTATTTGCTTAGGGTCAATTTCTAAATGCA
-CAGTTGCTGGATCAGAGTACAAGTCCACTGATACAGCATTTAATTTTTTCAAAGAATTGT
-GACTGggccgggcacggtggctcatgcctataatcccagcactttgggaggccaaggcgg
-gcggatcacctgaggttgggagttggagaccagtctgaccaacatggagaaaccccgtct
-ctactaaaaatacaaaattagctgggcatggtggtgcatgcgtgtaatcccagctacacg
-ggaggctgaggcaggagaattgcttgaacccgggaggcagaggttgcggtgagctgagag
-ggtgccagcttgggcaacaagagtgaaactccgtctcaaaaagaaaaaaaaaaaaaaaag
-aaTGTGACTATagctggccgtggtggctcatgcctgtaatcccagcactgtgggaggcaa
-gatggtcagattgcttgagtcaaggagtttcagaccagcctgggaaacatggcaaaaccc
-tgtctctacagaaaaattagctgcgcatgggggcagacacctgtagtcccagctacgtgg
-gaggctgaggtgggagcatcacctgagcctgggaagtcgaggctgtagtgagctgtgttt
-gcaccaccgcactccagcctgggcaacagagtgaggccttgtctcaaaaaaatttaaaaa
-ataaataaaTGTAACTATATTCTCCTTCAGTAGCAACATCTCAATTTACCTTCTCATGCA
-CAGTGTTTGGAAGGACATATTTTGGGATGAGTTTTCTTTTACTTCACTACCTTATTTTGT
-TCTTTCATAGAATGCCTTTAAAATGTTACTTTAAAAAAATAGATAATACCTTTACAAGGT
-ACAAAATCCAAAAGGTATAAAAATGttttctttttttttttggagacagagtttcgctct
-tgtcgcccaggctggagtgcaatggtgcgatcttggctcgctgaaacctccgcctcccgg
-gtttaggtgattctcctgcctcagcctcctgagtagctggaattacaggtgcccaccacc
-atgccctgctaatttttgtattattagtagagatggggtttcaccatgttggccaggctg
-gttttgacctcctgacttcaggtgatccacccaccttggcctcccaaagtactgggatca
-caggcataagccaccacgcccggccAAAAATATTTTATAAAAGTCTTTCCCCCACCCCTT
-TCCCCTCAGTCAGCACAAGTAGCCACCACTGGGACCAGTTTCTGGTGGATAAATCCAGAA
-AAGTTCAGGTGCAAGTAAACACACATAGAGAGAACACCCTTTAAATTAAATGAAACTAAA
-GAAAACAGAGCCATAGGTGCACAGGAGACAGAGAGCTGACATCTGGGGCTGATTGCATCT
-TGGTTTCGAGCTGAGTGGCAAAAATACTGCTAAGGTCAACGTTCTGAAGGAGGCAAAACC
-CACACGCAGAACCAGCCATAGGCCTGTCAACAAGGCGAGATGTTATCATTGCTCATGTGC
-TGGGTCAGGATAAGGCCATACAGACCGCCCAGTTCTCTCTGATCTGGGTGTAGTTAATGA
-CAGTTTATCCGCCTTTTTCTTCTCTCTCACCACTCCCCATGGTGGGGGAGGAGAAGGACT
-GGGAGGACTTGAATACTCTGAATTGGCACCAGGTGCTTAATATAGTCCTGAAAATAGAAG
-ACCAATATGCTGTTGGCACATAAAGATGCCCACAATTCTAGAATCTGAGTGCGCCCAGAT
-GATCTCTCTTTACATGGCCTAATTTGGGATCCTGACAAGTTCCTTCTGCCCTCTGCCTCA
-CTTTCTCAATCTAGGAATGGGCCTCTCGGTTTTTGTTTTGTCTAATTTTAAGCTCTCGGC
-TGTGCATGGCAGAGGCAAACTTGAAGACGCAAGGGTCAGTGAGCAGGGCCTTTATCCAGG
-TATCTCAAATATCTCCCAACCCTGATTAAAGTTACATATCTCAGAGAAGAATTTGGTCAA
-CACCATTGTTGTCATTCCTGGTTAATAACAGGGAAGTTGAGGTctgggaagcaccctagt
-gatgtgttcacatggccatgtgcttctgtaaaatttaccaatgtaaggcatcttaacctc
-attctgttaaaaccactatctcctttcattccaacttccctttgcatcagatgatgttgg
-ggttggtgtgagcagtttgggcatcttgctaaaaggaccttaacatttactttgggttta
-gtgggatatatttatattgtttccagtcacttttgtgaaaaattattactaactgacctg
-gtattgaaatggcttccaggaatatatccataccgagcatactgagctgactcaacttgt
-cgtggcatcaagattcaggatcagaggttatatctcaagatatatgaatggtcctacagc
-actcagttccacaagactgtgaaggagaggtttgaatgtatacacggagccagcagctag
-tttatggaaagtattacagatgtgtttgagacaggcagctaataaaaagaatgttatttt
-tctgcgttttgtaacgtttgtgcaatttctcttttttttttttttttttttggagacaag
-gtcttgctctgtcatctaggctggaatgcagtggtgaaatcatggcttactgcagcctca
-acctcctggtctcaagcaatcctccctctcagcctcctgagtagctgggactataggcac
-gtgccaccatgcctgactaatttcttttttccttttttttttttttttttgagacggagt
-ctcactgtcgtccagcttggagtgcagtggcacaatcttgactcactgcaacctctgcct
-cccagattcaagtgattctcctggctgagcctcccaagtagctgggattacaggtgccca
-ctaccacgtccagctaattttttgtatttttagtagagatgaggttctgccatgttgtct
-agattggtctcaaactcctgagctcaggtgatccaccagcctcggcctcccaaagtgcta
-ggattacaggtatgagccaccatgcctggccagctaatttctttttaaaatttttttgta
-gagctggggatctcgctttgttgcccaggctggtctgaagcccctgggctcaggcactcc
-ttccacctcgacctcccaaagtggtgggattacaggcatgagccaccttattgtggtttc
-ttgtctctttctaaccaaatcttcactttattacttaatttcatatctgtaattttttct
-taaagaggtctccctaGggctggacgtggtggctcacgcctgtaatcccagcactttggg
-aggccgaggtgggtggatcgcctgaggtcaggagttcaagaccagcctgaccaacatact
-gaaaccctgtctctactaaaaatacaaaaaattagcgggtatggtggcgggcacctgtaa
-tcccagctactcaggaggctaagacaggaaaatcacttgaacttgggaggcagaggttgc
-agggagctgagatcgtgccattgcattccagcctgggcgataagagtgaaactctgtctc
-aaaaaaaaaaaaaaaaaaaaaaaaagaaGTCTCCCTAGGCTGAAGCTACCTGCTCAATCT
-TCTCTTGTGTCTTATAGGATCACAGGATCCCCCTTGCCTTACCTCACTGTTACTCCCAAA
-CAGTTCTCACATGTTTACAAGGGAATGTAACAGAGTGGATCAGAGAATTCATTCTGGATC
-CAGACCGAccttagttttctcatctatataatgggaataatagcaggatctctcgcctta
-gatagtcatgaagtccaatgagatgatgtgtataaagccctaacacaatgTAGCAGAGGG
-CACAGGGCCAGGATTGATATTTAGCTGGTCCTCACGGATACAGCAGACTCCCTGTTTATG
-ACAGTGGTTGGCTCTGATTTGGTTGGTGTCCATGCCAGAGTGTACAATCATTATTAGCTA
-TTGATATATTATTAGCTCCCTCCCCTGCCCACCCAGGGGTTTACGCAGTAAGTTCTCAAT
-TATTGGCAATCCAAACAAAGAATAAAAGACACCAGCTGGAATGAAACAGAGAAGCTGGTT
-CCAAATTGAGCAATTCAGACTGACTGCTATAAAATTTCCTCACCTTAAAGGCCCTTAGAG
-TTAATTCATTCTAATCCCCCTAAAAATATACTTTTTTGACATGTTCAAGTATTGGAAATT
-TGGAAAATTCACAAAAACACAAAGAAGAAATTAACTGCTGTGATTATAGATGATTATACA
-CATATACATATGTATTTAATACATATTTATGCTGTACATAGTGTTTTGAAGCATACTGTA
-CTTCAAAAAAATTTGGGAGgggtgcattggcttatgcctgtaatcctagaaattcaggag
-gccaaagcaggaggatcacttgaggccaggagttctagactggcctggggcaacatagcg
-agacccgtagcttgacatggtgatgcgggcctgtagtcttagttactctggaggctgagg
-tgtgaggattgcttcaacctaggttacagtgagctatgattgcaccactgcactccaccc
-tgggcaacagagctagaccctgtctctaaaaaacataaataaaCCAATGTTTAATACTTA
-GCATTTCCCCCTATCTTTAAATATCTTCTAGCTACTTCACttttatttttatctttttga
-gatgatctcttgcccaggttggggtgcagtggcatgatctcagcttactgcatcccccac
-atcccaggttcaatctattctcctgcctcagcctcctgagtagctgggattacaggcatg
-tggcaccacgcctggctaatttttgtatttttagtagagacgaggtttcaccacgttggc
-caggctggtcttgaactcctgacttcaggtgatctggtcgcctcagcctcccaaagtgct
-gggattacaggtgtgagccactgctcctggTAGCTACTTCACTTTTAATGGCTGCATAAT
-ATTCCTCATCAGAAAGTGGGAAAAATTAggctaggtggcgtggctcatgcctgtaatcct
-agtactttgggaggctgagttggtagaattgctagagctcaggagtttaagatcagtctg
-ggcaacatggcaaaaccccatccctacaaaaaatacagaaaataccgggtgtggtggtgc
-acacctgtagtcccagctacttgggaggctgaggtgggaagattgcttgaccccaggaga
-ttgaggctgctgtgagctgagatcctgccactgcactccagcctgggcgacagagtgaga
-ctccatctcaaaaaaaaaaaaaaaaaaagaaaagaaaaaGATAAAGAAATAAATAAAGTG
-TTAATAATTAAAAGTACTTTTAGAGGGTTATGTCATAAGCCTTGACAAGACTTGTTCTGT
-AAAGCTACCCGGCATGCAAAAAGCTCAATTAAGTTAGCTCCTCCACAGGATGGAAttata
-taaccaatccctttcaagaggcattgaagttgtttccattattttgctatgatgaataag
-gctgagcaatattaatctttgctcatatctttggtcatttcctttgtaaatttcgggact
-gctgggtATGCACATTTTAAAATTAActcactcatcatcatgcagttaggagaacagaga
-aaggaaggggcttgcaccgggtcacatagggagttagcgtcaaagtcaggactaggaacc
-agccagggccctctaactGGAGCTCTTCCAGCTGGGGTCCTAGAGGAAGTCCCAGCTGGC
-CGCGGGAGGGAGGAGGAGGAAGGGAAAGAACCAGGCGCCGGGGCTGAAGCGGCGGCAGGA
-AGAAGGTGGGGCCGGCTGGGAGGAGCGGGCGGAGCTGCTGAGCAGCGCCTCTCCTTCGGG
-CGGGGGAAGCTAAGCGGTCGCCTGGCAACCCTGGCGGCGCGCCGTTCGAACGGAAGCGAG
-GAACCAATCAGGAAGTCCGGGGCGAACCATTCTGGTGTGAAGGGGGGCGGCGTGCTCACT
-TCCCCTTCCACGGCGCCCCAGGGACTTTCCCTGCGGTGGGGGCCTTCGACAGTGAGGGCC
-ACCCGCTCAGCTCGACCGCGGAGGGCAGCTCCAAAGGGGACCCCAAAGGTGCCCACGCGG
-GGCTGGGGCCTCCTGGGCGTCGTTGGGAGCGGCCACTACCGGCCCGGGTCCGAGCTGTCA
-GCCTCTCCAAAGCCTGCGCGAGAGGAGCCGGGACACGCCTAGCGCGGGCTCCAGGTGAGG
-GCGCGGGTGGGTCCGGGTGCGACCCCGGGTCTGGGGGCCCCGTTCCCCGAGCGTCTGCTG
-TCTGCTTTCTCCCCGCGTCGTACCTGCGTGTcatttcacagatgaggactctgaggctca
-gagaggcaagtgTCCCGGCCCGGCGAGCTCTGGCGGAGAATCCAGTTCAAGTCTTTCTGC
-CCCACCTCGCAGCCCCCTAGTCTAGTCACATCTGGACTTGCCTTGAGAGGCCCAGACGGG
-CAACTGGTAGTCATTTTCCCAGCGTTTTATCGGCAGGGACCTGTAGACCCCTGGCTGGAT
-CACATATCCCCGCGCCCCACACTGTCCTCGGGATACCCCCTTTGGGCGTCTGTCTTTCCT
-TCTCCGCAGTCCGGGGTTGGACTCGGCTCATTTGGCGCCTTTCTGTCTACGGGGACAGAG
-GACCACTCTTTGGGGATCGGACGGGACTGACATTTCTGGGCTGGATGCAGGGGCAGCAGA
-TTCTCCAGCCCCCAGAGCCGCTGCTGGCCTCTTGGGAATCATCCCCAGTTTGGGGAAGGG
-AATAGAGCCAGTCCCTAAACCAAAGCCACTAGTCACCAGAGACTTTGGAATTGGGAGTGG
-GGCCGGAATCCCCCCAGGTGGAGCAGCTGACCTAGGCCAGACCCTGCTGTGTCTCCtggg
-gacaccccctgccccctaggttgctattgtcagtctccttttgtaggtggggaaacggag
-gttctaagaagttaagccccttttcgaagtcacagtcagacaatgcagtggttagctcct
-agtccctctggcttcAATCTTAGAATCCTTGACACACAGAATCATGCATTTTGAGAGTCT
-TCAATCTCTTCATAAGGGAGTTACATATCCTCTCTCCTCTGGAGCCTGCCCCTGGCTTTG
-GGGGACAGGATCTCCGAGGACTCAGAAAGAAAACAAGGCTTTCTTTTATTCTTTCAACAA
-ATATTATTTATTGACTTCATAAGCCCTGCTCTGGTTCTTGCATGTTTTGGTTTTTTTACT
-TATTAGCAAATGTATCATCTTCTCCCACTGTGATGcaaggcaggggctgaggcaattgag
-ccagtgcaaaatttagggatgcccaaaacctcagtaatcaagaCTGAAACTAACGTTCAT
-GGACCATTTGTGTGTTCTGCAGGCAGGAGGTTAACTCACACAGCCTTCATGAAGTGCAGT
-CCTCCCAtctctctctctctctctctctctctctctctctctctatatatatatatacac
-acacacatatatacacacacacatatatgtatatatatgtatgtgtgtatatatgtatat
-atgtgtatatatatgcatatttataAATCATGAAACCACTgccctgtccctgagttgctc
-tgtgacattgagtaagtttcttcagtctctgggcTGAGCTAAGAAGTCATGATGGTGCAC
-TCAGGCCTGGGCAGAGGGCAGTCTAGGATAGGAAGTGGGCTTGGCTGTGGATCTGCCTCC
-CCCTCCCCTTTCTAATCctgcgtgccaggcccttccccaagaccttgcatgtgttatctt
-ccattctgtcctcactgcaaaatccttcatccccattttgcaacctcaagtgcagaccta
-ggcctagaagatcaaCTTGGTATCAGTGGGCCTAGATGTCCACATCCACACCCATTCCAC
-AGCCTACTCCCTTCTCCCTTCCTAATGTTAGTGCAAGGCCACCCTGAGCAAGGCTGACTC
-CTGGGCAGGCCAGGGCACCAGCGTCTGGGAGGCCTCCAGAAATAGCTCAGGGCCTGGTGT
-GGCTCTGGAGGTGGCCCAGCTGGGTGTCCCTGACCTGGACAGCTGGGCTGAAATTGAGCT
-GGGGCTGCCCTGCTGGCTGGCCCCTTGCCACTGCCTGGAGCCTTCCCAATCTCCTCTGGG
-GCAGGCAAGGGCCTCCCCAAATCTAGGCCAGGCTTCTGCTGAAGGGAAAGAAAGAAGCAG
-GTGGGAGGAAGGGGGCGGGTTGGGTGTAGAATGTCATGAAAATTATAACCTTTGGAAACC
-ACACCTCCCACCCCCTCACCAAAGAATaaaaatcactaacacctcttgagcatttactat
-gttctaagtactttacaagtatgaactcatttaattccctcaactctgtgatataaggta
-attactgctgttcttatttccatcttgcagaggggaaactgagcacaagagaggtttaat
-aatttgcataagataacctagaggtggagtttgaacccagagagtctggctctaaatttt
-acatttttTGGGGGGGGGGGTGGGGTGGGGCAGTGAATGAATtaaaatgtatataaaata
-aaatttaccattgtaaccacttttaagtatacagttcagtggcattaagtacattcccca
-ttgcctctccccccagtgcctggcaatcaccattctactttctgtttgagtgaatttgac
-tactttgggtacctctaggtattataaatggaatcataacagtatttgtcttgttgtgtc
-tggcttatttcacttagcataatgcctttaagtttcacccatgttgttgtatgtgttaga
-attttcttttttatggcggaataatctattctaatattctatgtatatgccacattctgt
-ttatccattcattccttgatggacacttggattgcttttggctgttgtgactaatgctgc
-tttgagcatgaatgtacaaatatctgtttgagttcctgtttttaattgttttgggtatac
-actcagaagtggaattgctgggtgatcctatggcaattctgtttaattttttgaggaact
-actttactgtgtttcacagtgactgcaccattttatgtgtccatcagcagtgcacaaagt
-gctaatttctcaacatcttcaccaacacttgttattttctgtttgtattttttttttggt
-aatggccatcttcaggggtgtgatgtggtgtctcattgtggttttaatttacatttccct
-aatgactaatggtgttgagcatcttttcctgtgcctgttggccatttgttatctttggag
-aaatgtctgttcaagtGACTCTGCAttgttttttttttttttttttttttttgagacaag
-agtttcgctctgtcgcccaggctggagtgcagtggcgccatctcggctcactgcaacctc
-tgtgtcccgggttcaaatgattctcctgcttcagcctcctgagtagctgggattataggc
-ccccgccaccatgctgggctaatttttatatttttagtagagacggggtttcatcatctt
-ggccagtctggtcttgaactcctgaccttgtgaaccacctgcctcagcctccaaagtgct
-gggattacaggcttgagccactgcacccagtcATGACTCTGCATTCTTAACCATTACCTG
-TGCTTCTCTTAGATTTGTAACCTCTGAGAATAGTGGATCAGCTTTCTGGGCTGATGAAGC
-CCTCCCTCAGGAGCTGGGCACTGGATGATCTATTTGGTTGAATAGTTATCATAGCCTGCA
-CTTTGGTGACATTTGTCATGCATGGACCTCATGCAGAgagggaggcactgttgtgagtcc
-tgttttgcagttagggaaactgagatatggagaagttgagtattttatccaaggtctcat
-agctaatcattggtggagctaggatttgaatgggttctggagtccatgctATACCTTACA
-GATAtggccagggggatggagtagtgaagaccactgcaggcagcagaaccagtgtgtgca
-gaggTTTGTATATGGTGGCTTTGGAGAAAGAACAGGACTTGGGTAGAAGTGGTCAGAGCC
-CAGCTTGAATGGGGGTGACTTGAAGTTGGAGGAAGAGTAGGACAGGTCTGGAAAGGCCAG
-GAGCACGGTGAGGGTTTGGGGAGGAGGCTTGGTGCTTAGGGACCCTGTCCTTTTTTTTTT
-TTCtcttctcacaagatatttattaattacaaagggaaaataataactgtacagtggaga
-aatttggcagatactgccttaaccaaggaattggctgatcactaagattaagacaaactg
-ttgttatgagtgggtgtggtaatgtacctatagtcccagccactcaggaggctgaggtgg
-caggattgcttcagcccatctatttgaggctgcagtgagctatggagtgcactccaacct
-gggcaacacagtgagacctcatttctaaaaaaagaaaaaagaagccttctgataccatgt
-actaagaaggacacaacatcacttttgtgttattcttgacagatatgtttaacttTCTCT
-CctttctttcttcctctctttctttcttctctctttcttACTGATATAAGAAAAAGCTTT
-ATACATTTAATATATACCTCTTGATGAGTGGCCTTGGCCTTTGAGGTGGGCTGGGTCCAG
-AACAGCCGGTTGTTCAACGGTATTTCCTCGTGTTTGGTCCCTGAAGGAAGAAAATTGGAA
-GGGTGTGATggagctcatggtccagtgggagagacaggaaacgagttatatttcctatcc
-tagataagagtatctaaaatgacaggatgtaatgagtgctcggaagggaataaaatgggt
-gaaattgctgagggggtctcttggaggagatgacatttgaaatgagatctgaagggggtg
-agggaagaggttccagacagagaacagctggtgcaaaagccctgaggcaggaaagacctt
-atgttcaggaacagcagggagggctttgtggccagagcaggaaagaggttggagataaga
-tgggagatttggacaaggactgagtcctggaaggcctgagggccaagtggggagcttggA
-ttttttttttttttttttttgagacagagtcttgctctgttgtccaggctggagtgcagt
-ggctcaatctcagctcactgcaggGAGCTTGGATTTTATTGTAAGGGAGCCACAGGAGGG
-TTTAAACACAGCAGTAATGAGACTTTATTTCTGCTGGGAAAACATtgccgttattgcccc
-cattttacagcagaggaaaccgagactcagaaccatgaccagggagtgcttcctaaggtG
-GTTTCTCCCTCTGGGGTCCAGCCGACGAGGCAGTAGATTCCTTGGGACTTCCTTGGGGGG
-CACATCTGGTGAGTGGCCAAAGCCCAACACTGAAAACACCGTCTCTTCCACCTCCCCTCC
-CCAGATGTGAgcctgggttccaatcctggctctaccattaatcagctgtgtaattttggg
-cacgtggccttacctcttggagcctcagttttctcatctgaaaatgggcataataatagt
-agccctcacagggtaggtgtgaggattaaattagttaacattttgtagagcttagaacag
-tgtctggtacaaagaaagtgctcagatgagatttgttcttTTCTTTTTTGGCTGTAAGTT
-TATTCAATGTGAAATAATCCTCTCCAATTTTATTGAGGTGGCTGACCACGTCCACGACCA
-CATCTGCCTCTAAACTGGAATTCGGTTGCTGACCCAGCCCCAGCCTCGGCTTTCTTGTCA
-GCACCAGGGGGCACAGAACACCGTCTGTAGGTATCTCTGTCAGCTTCCCGTCTTGTGAGT
-CTTGCAGGTCGCTTACCCTCCAGACCTTTAGGCCGAGGCCTGCCAGTCTCTGGACGGCTG
-CGGTGTAGGGTGGCAGGAACAATCTCCGGGGGCAGATGTAGGGTGGCAGGAACAATCTCT
-GGGGGCAGATGAAGGTAATCACGGAGATACTGGCTACCCTCATTGGTAAGGTACCAGTAG
-AAATGTCTCCAGGCAAACTGTTCCTTCACGCAGCCCCGGGACTTGAGAGACTGCATGGCC
-TTCATGACGTGAAGGTTGGGCACATTCTTGTCTGCCAGCTCCGGGTGCTTAGGCATGTGG
-ACATCCTTCTTGGCCACCATGACTCCCTCCTTAAAAAGGAGTTCATGAATGGCAATCCGG
-TTCTTCTTAGGCATCAGCATCTTGGCAGCTGTAGGGTCCGGGGCTGGGGCTGGAAAGGAA
-GGACTGTTCTTTTCTTTGCTATTACGAAAATCATTATTGTTGCTTTGCTGTTACTACTAT
-TAGCGCCTGAAGGAGCCTTCCCTCCCCATCCCCCATTTCTGCCTCCGTGGAGGGCTAGGC
-AGGGCTCAGCAGGCCATTTGGAGGATGAAGGACTTGTTGCCCCGTCCCCTGTAAAGTCAG
-GGACTGGAGGAGGCTGCAGTGCTGAGGGGGAAGGAAAGCTGATGTGCATCACTGCCGGTC
-TCCTCATGCCCTGTACCCTAGTCCTGGCCCAGCTCCCACAGGCACAGACATGGAACAGGA
-GCCTCTTCAGCCTGAGTGTGGCAGAGGGCTGGGGCTGAGGCCTGGGGGACAGCTCCTTCT
-CTGGGCCTCAGGATTCCCATGAAAAAATGGCCTATCAAATGTTCCTACCTGCAGTGAGTT
-ATAGGACTTGGGGTGGAAGAGGTGACAGTCACCTCCCTCTGGGAATTCCTTCCTGCAGGG
-CTGCAGTCTCATGGGATTAAATGAGGGGGCTCTGGGGATTTAAATGAGTATGGTGCCTGG
-CACCCCAAAATTCTAGTTATTGTTGTTACTATGACGGCTGTTGTTGCCGATGTTAACCGT
-TTTCACAAGGCAGCTGAGGCATGCTCAGGCTCAGCCTGTTCCAGAGGGATGGACTCTACA
-CGTGACAGCATGGAGCACCAGGAGGGTCCCGCAGCCTGGTCAGGGACACACAGCTAGAAA
-GTGGTGGCGTTAAGCCTTGGTCTGGAGGGAAAGTGCGCAGGCTGGACTCCCCAGAgtgat
-tttgggctagtgactcagcctctctcagcctcagtttaccattagtcaaatggggtaaca
-atagaactcaccagatagtgattgttgggaagattaaaatgggttacccgataccaagaa
-aaacactttcccgtgcctggcacaGTGAACATCACCTGGCGGTCGTTCTGAGTGTCAGGG
-AGCGGGGCTCAGTTTGTCCATCTCTAAGGTGGGTGCGCTTGCCTGCCAGAGCCACGGGGA
-CCCCGCGCGCCAGGTGTGCGGTGGGCGGGTCTCGGCTCCCGGAAGAACTTCCCTGGGTGG
-TCCTGGAGCGGGTCGGACCCAGTTCCTGAGCCAGGCCAGCTGCCGGCGGCCGGGGCTCGG
-GTTCTGGCCCCTGCCTGGCTTTCCTTACCCTTTTCGGGTAGTACCTGGACCAGCGGGTTC
-ACTTGCCCGCGGCCGCCGGAAGTTGCGCAAACTCAGCTTGCCGGAGCCCCAGGTGGGCCG
-GGCCGGAGGAGCGCAGGCCAGCGGCGCGGGCGCAGCCGGGTACGTGCGGACCGCGGCGGG
-GGGCGCCCAGCCGGGGTAGGGGGCGGCCCGAGCACCCCTCCACCCCAGGACGGCGGGAAC
-GGGGCAGGGATCTACCTTTCGGCTTCAAGAGGACCGCGGGGATGGTGCCGCTCTCTCCCT
-CATTTGAGAGCCAGGAGGGGCGGCGAGGGGCAAGGGTCACACAGCGCCCTGCTAGCCGAC
-CCCCCATCCCCCGCCACCGGGAGTCCTCAAGCTTTTCCGGAATTGAGGGAGAGCAAAAGC
-CAGCCTGGGGATCTGAGTTCCCCCCAGCCCTGCCCCGCGGCCTCTGGAGGCTGACGCTGG
-GGAGCTAGTGGGGAGGGGGCCAGGTGGGGATGCGCGCCCCCGGGATGCAAGCCAGAAGGG
-CCGGCGGTTGGGGGCATCCGTGGGAGGCATTTGAATCCGTGGGTGGGGCATTGGGCGGTG
-AGAGGAGGCCTCAGAGGGGACATTGAGTCGCGCTTGGGGACTTGGGACCCTGGCTTCACC
-TGGCGGGAGCCGCTGCACCTCCGTTTGCCCACCCGTGACGTGGGGCTGTTGAGGTCAGCT
-CACCGATCAGCCTCTGTCTTGGGCCTGCTTTGTCCGCGGTGTGGGCTGGGACAGACCCTC
-GTGGGGCTTGCTTAGAGACCCCTGCGTGGGGGTGGTCTGTGGACTTGGTTAGTCGAAATC
-TTCTTGAAGACCAGGAGCCTGGTTCGTGGCTCCGCctttttgccagatgccgaggaaagc
-cctcgacctgtttgatctctccatccttatcgtgacctggaggctcaggaaggtctattt
-ttaacctcgtttcacggataaggtaaccgagtctgtaaagaggcgaagctgcttgcgcaa
-ggcgcacagcgggcgggtgggcgagccGAAggccggcgggcccgcggcgccAAACCCGGG
-GTTGGCTCTCGCATCTGTCCCGGCCCCGCCAGAGGGGACCTCAGGGCCAGCAGATGGGGC
-CAGAGGGGCTGGGGGCCCGATCGGGGTCGTGCACGGGGTTTCTGCCCCGGCCCCGCCCGT
-CTGACCTCCTTCTCCCTCTTTATCCGGATGGTGCCCGCAAGGGAACTGCCACTGCGGACG
-GGTTGGACTGGTTTGGGAGGTGGCGGCCTGGGGGTGGGGCAGAGTTTGGCTGGCTCTGCT
-GTGCTCCTTTCCTGTCAGGTCCTTCCCACCTGAGGTCTCCTGGGGGTCGGCCCTGGTGGA
-GCGAGGCTTCCTTTCCCATCCACTCCATCTCTCCTGCCTTGGGAGCAGCACCCAAGGATC
-TATTCCCAACTCATGGCTGCTGCAGAGGTCTCCAGCTGGTGGTTGGGGGCCAGATGGAGG
-AGGAGGGGACAGATATGTTCGCAGACATATTTTGTTTGCTGTATATGCAATGTTTTAATC
-ATTATTATCGAATATGCTGACAGTTAAGAATCTAGAGTTTTTATGTACTCCTGGATTTCC
-AGCTTCCTGGAACAATACACCTACCACCTTGGACCCATATGCCTGCAGCAGGCAGGGTAC
-CTAGATGTCTAGTTCATCCCTGATCACCCAGTTCACATCTGGCTCCCATAAATATttcag
-ttcaataaatttttattgaatattctgccctagtatgtgtctagggcagtatcttgaaac
-tggggtatagtgaacaaaatagccaacccccgcccctacacacacacgcctgccctcatg
-gagctgatattttagggggatagagacaacaaagagtaaaacaaccatacacaaatagag
-tacttgtgcaggggataaggagaaaaggaatagtgccgggagggggtcaggagtgccggg
-gagaaacaggacgtggtattGAGATCAGTGCCTTatttatctattctgggacctgggaaa
-gccacttctctgagtctcagtttctccatctgcacaacgACCCACAGGCTTGTGGGAGGT
-TATAGGGAGGATGGCACCCAGCAGAGATCCCTGCCTCCCCACCCCAATCCAGACTCACTC
-CCTTCTGGATTTTTGGATGTCTAGGTGGGgctgtccaatgtagcttcctaccatggatgg
-aaatgctgtactctgtgctgccaaacacagtggcaactggccacatgtggctattgagaa
-cttgaaatgccactagtgtagctcaggaactgaattttatgtttttatttcatttaaatt
-taaagttaaggttgaatagccacatgtggctgctggctattgagctggacagcacggGTC
-TAGATGGCTTGAACTGTAAGCCTTCTTGGGGAACACCCAGATTAAGTACCCGCCCCCTCC
-ATTTTACAGATGAGAATGTTTGGGACTTGGTATGTGGGTTTTCTTCTGTCCCATCTCCAA
-GGGGCCTTGTGGGGTGACTCTGTGGGCTTGGCCCTTCCTTGGAAACAGGGTCAGGGTTGG
-CTTGATGTCTGGGGCATCAGGTCCTGACACTTGGGTGACCACGTAGACACTTGTGCATCC
-AGGTGTATGCCCTCCTCCCAGGTGAGTACCCATTCCATGGCTGCAGGCAGATCGAGGGTC
-TGCCGGATGCCTCCATGCAGGGCTGTGTGATTTTGGACATTTCCAGCTTCTCTCAGCACA
-GCATAGCTCAGGGCTGATGTTTCCACGTGACAGGCATTTGTGGATCACCGTGGGCCATCC
-AGTTCCATGCAGGAAGCTGACGGATGTCTGGACTCCACTGGGGCGCGGGTGGAGATTTTC
-TTTGCTCCTTCCCTATAAGCTCTGCCCTTTGCCTGGGGCCTGGCATGTCTAGGCGGGTGG
-ATGGCACAGGGCAGCTTCCTGCCTGGATGGGTGAGGGGTAGAGGTGGTACCAGGCTCCCT
-GTGGGGAGTCCAGGTGGGGTGTGGGGCTGGAGCCCTTTTTCTTGGTCATTTAACCCTACG
-CCCCGGTGCCAGCACCTTCCTTTTTGGTGGTCAGGGGCAGAgccacctactcgctgggtt
-aacttaagcaagttgtttgcctctctgggcttcagtttctccatccaaaaaacggggctg
-ttgagaggacctGAGGTTGAGTTGACTGGTGCGTAGCACAGAGCCTGGAGCCTCCCTTGC
-TCCCTTTAGCGCGTGCCTTGCCCTGTCTTTTCTGCTCAGGTTGCCCAGGTCGCCCAGGTC
-TTTTTTCTCTAGCACCTTTTTTCCTCTCTTGGTCTCAGCTGGGCCTGGTTCTCCCGGGGC
-AGGAGGGAGGGGGTGTGGGTGGGGCCTGAGGCCCCGCAGCTGCTGCCTTGTGCCTGCTGA
-TTGGCTCCTTGTGGAGGGGCGTGGTCTCTACCTTATAATAGGGAGGGCGTCTTATCCTCT
-CAGCCGCGGCTGAGCCTCTTTGTCTGAGCGCGCTCGGCTTTTTTTTTTTTTTCTCTCTCC
-TTCCCTGCAGCAGTGGCCGGTGTCCAGCTGCCTACTTTCTGCCCGGATCTCTGGCTCCTC
-ATCTCTCCGGTCTCCGCAGACTAAAGCCCTCGGGATATGCAGCAGCCATGCCTGTGCACA
-CGCTGAGCCCCGGAGCCCCGTCCGCCCCCGCCCTACCTTGCCGCCTGCGGACCAGGGTCC
-CTGGCTACCTGCTACGGGGGCCGGCAGATGGTGGAGCCCGGAAACCGAGCGCTGTGGAGC
-GCCTGGAGGCCGACAAGGCCAAGTACGTCAAGAGCCTGCACGTGGCCAACACCCGCCAGG
-AGCCTGTGCAGCCCCTGCTGTCCAAACAGCCGCTCTTTAGCCCTGAGACTCGCCGCACAG
-TGCTCACGCCCAGCCGCCGAGCCCTGCCTGGCCCCTGCCGACGGCCCCAGCTGGACCTGG
-ACATCCTCAGCAGCCTCATCGACTTGTGTGACAGCCCCGTGTCCCCTGCCGAGGCCAGCC
-GCACTCCTGGACGGGCCGAGGGAGCCGGCCGTCCTCCCCCAGCCACCCCTCCGCGACCGC
-CGCCCAGTACCTCTGCGGTCCGCCGGGTGGACGTccgccccctgcccgcctcgcctgccc
-ggccctgcccatcacccggccctgccgccgcctccagcccagcccggccGCCGGGTTTGC
-AACGCTCCAAGTCGGACTTGAGCGAGCGCTTTTCTAGGGCAGCCGCTGATCTCGAGCGCT
-TTTTTAACTTCTGCGGCCTGGACCCGGAGGAGGCGAGAGGGTTGGGTGTGGCCCACCTGG
-CACGGGCCAGCTCGGATATCGTGTCCCTGGCAGGGCCCAGTGCTGGGCCGGGCAGCTCTG
-AAGGGGGCTGCTCCCGCCGCAGCTCGGTGACTGTTGAGGAGCGGGCCCGGGAGCGCGTTC
-CCTATGGCGTGTCGGTGGTGGAGCGCAATGCCCGCGTGATCAAGTGGTTGTATGGGCTAA
-GGCAGGCTCGGGAGAGCCCAGCAGCTGAAGGCTAGGCGCCACTGGGCCTGGAATTCGCCA
-CAGGACGGATCTTACAGAGGCAAGTGGTCCCTGGACCTCTCTTGCATCCATTCTCTAGAC
-GGCCGTGTCAGAGGCTCCACCCTGTTGTGAACTTGGTATGGAGGCAAAGGCTTAGAGGCT
-GGACCAGCATTGTTGGGCAAGGACTGACTCTCCAAGGGTTTTGTTCTTGGCTTTGGACAC
-CTGAGAACCCCCTCCTCCCCTCCCCCAATACAAGGTTTTTGACATGAGTGTACTCCTGCT
-TAGTTCCTCTTGTGGGGCTGCATTTGCGGTGCTTTGCCCTCCCCACTGTGAGTGAGGGGC
-CAAGGGATCTCCTCAATCCTGTCTCCCCAGCGGCTCTGTTTCCTCCTTCCTTCCTTGGCC
-TCTGTCCTTTGCTGACTTCCTCTTCCTTACCCAGCAGAACTCACCCTGGGGTCGGGGCAG
-TGGGGAGGGGCCTATCCACTGCTCTTCCTAGTCCTTGGCAGCTGGCCTAGGTGGGCAGAC
-TATAGGAGGGACTGGTTAGGAGTCTGCATTGCTTTGACTTCCCTCTCCTTGGTTAATAAA
-CACAAATGCTTGTTTCTCAAGGGCTGGGCCTTCAGACTCTTCTGTGTTCACAAGAGAAAG
-GGTGAGAGAAGTCTTGGGGTGGGGCCATCAAAACAGTAATTGTTCACCCCGAGGTCTAGT
-GGTGGGGCATGATGATAGCGGCTGGCCTGGCTGGAGACATGTCCCCGTGGTGGGTTCTCA
-TAACTCTCCTGGAAGGCTAGCAGGCCTGCCTCATCGAGGAGGAAACTGAGATCCAGCCAT
-GAGTGAGCTGGAATAGAGCTGGGAGTAGGAATGGGGTCTTTCCCCTGCACCAGAAAGGGA
-GCCTGCAGGGGAAAGGCCGATGGGGTGCATAGACTCTCCCCAACCAGGAGTGTTCCATCC
-AAGCCCTGCCCAGTTCCCAAGGGGGCAGGAAGCTCGGAGAGGGCAAATCCTGAACTTGAG
-GTCACACAGACCATAGAGTGAGGATGAGAAGTGGGAGTTTTGGAGGAAGAGAGACTTGGG
-GTGGACGGCACAAAATGAGTGGCctccctggcgatcttggacaagccagtttccctctgg
-gcctcagtGGGAGAGTTAGGCAGCACAGTCCTCCTTGGGTTGGGGCACTGGTGCATTCTG
-GGCCCTTCATGCTATATTCCAATACCTGGGGAGAGGGGAAGGAAGGGGCTGGCACTGGGC
-TTCGAGGCCTCAGCTTCTTCCAGTCTCCCTCCAGGTCAGTTACCTACTAGGACACCCCAC
-CTTGGCTAGTGGAGCAGCTAGGGCTAGAGCTGGGCCTACAAAGGGCGAAAGCGGGGGTGG
-CCTCTCTGGTGCCCCACGGTGGGCGTGGAGAGGGGGTGGGTGGCGCTTCCTTTCACAGGC
-TGCCTTGGCTGCAGCACTCAGAAACAGGAAGCTCTAATGGGGGCCCTGGTGACAGGTTTG
-ATGTAGGTTTTATTTTAAGCATAAAGAGGAGATTTCCGTTGGACTGTTGACAAACATCCA
-CATCAGCCCAGCTGTCCATCTCTCTGTCTGTCTGCCTGTCTACAACTAGCCCCCAGGGGC
-CTGGGATGGGCCTGGGCAGTTTGGGGAAGGAAGGGAAAATTGGGTTCTAGAAGAAGATGG
-TGTTCCAGCTCATGAGACTGGAGCTCATGATACTGGTGGGGAGACAAGCATGAGGAGGGT
-GGTGACCTACCCACAACCCCCCATGGTGCCCAGCAGTTTTGACAATGCAGGAGCTGGGCC
-TCCAGGGTCCCCATGCTGAAGGAGTGATGGTGTCAGGAGAGAGAATCCAGGCAGGATCTG
-CAGACGTGGTGCCCTTTGAGGTGTCAAAGACTAGATTTCCTAGGCAACCCTGCTAGAATT
-CAGGGCTAGTCATTGCCCCTTGCTGTGACCTGGCAGcctccgagtaacccaagaaggtgg
-atgggctggctgcattttacatgtgaagaaattgaggttcagGTCACAGGACTGGTGGGT
-GACACCTTGTTTCTGAAGGAGGGTACAGTGCttgaatcctcaaggtagccttttgaggac
-cagatatattgtcagagcaggaggttgagctcagggaaggatagcgacttgtatactgtc
-acatagcaggtctgcaggacagcctggggtcacactcttgcctgccagacACATCGCAGT
-CTGGATTCCTGGTTCTCCCAGCATGTACCCCACCACTCTTCCTCATCTTGGCAGCCTTTT
-CTTCTGGTCACTTTATTACTGAGCATCTActgggtgcccagcagtggataagacagacat
-ggcccctgtcctagtctggagaagagaatgggcaactaaacattcagcacataaataatc
-atagaatgtAAAGCAGGTATACTTAGGGACTTCTGCCCTAAAACCAGAGCTGTTCCCAGG
-AGCTGGACCAGGGGATAGCTGAAAAGAGAACGCCTTTCCATAAATCCACTGGGAGGGTCT
-GTTGGGGAGAGAGCAGGGAGGGATTCTTGGAAGTGGGGAAGGTGCCAGATTGAGTCTTCT
-CCAATGGTTATGGCTTGGTCTTGGGAGGGCTCCCCCTGTTCCAGGATTCTGGAGCCTCCC
-GCCTTCCCTGCAGGCCTCTGTGGAGGGAGCAGGGCGGGGGGCTTTTGCACTCCTCCCTCC
-CCCAACCCTGCAGCCTTGGGGATCTGTGGAAACAGCCCCTCTATTGTTCTGCCTCCAGTT
-GGAGTGTGAGCCCTCGGAGGGCCTGCAGCTGCTGCCCTGTCTCCTGGGGCTGCCCAGCCC
-TCCGAAGCAGCTCCCCCAGGCCAGCCTGGCCCCAGCTGCCTAGCCCCTAATTAGGCAGAG
-ATGGGATCTGCTCTCTGATCCATTTCCCACCAGCTAATTATATACACGTGGATTtgggaa
-ccaggcaacctggctgctcacttctatcatgaaggtggatgggccctgggaaaggcagcc
-ccccccccacagacctcagtttacccttttggcagaggatggagtGTAGCTGCAGAGGCC
-TGTTCCCTGTCCTTGGTTAAATAGTTCTGTTCCTGCTACTGAAACATTTAAGGAGACCCC
-CCACCCCCATCTTACCTGATATCCTGTGTACAGGGGACCAGGAAAGGGTTGAGGAATTTG
-GCTATAGGTCCTTGACTCTAGGACCCCAGGGTAGGGTCATAGGATATAGATGAGAGCATG
-GCTGCAGCTGGCTGCCAATTAGATGTGCATATAGGAGGGCTTACAGTTGTGCTGGTCCAT
-CTGGGTGGCCTGAACACCCggccgggtgcggtggctcacgtctgtaatcccagcactttg
-ggaggccaaggcaggcggatcacttgaaaccaggagtttgagaccagcctggacaacgtg
-gtgaaatcccgtctctactaaaaatacaaaaattagctaggcatagtggcggacacctat
-aatcccagctacttgggaggctgaggcatgagattcgcttgaaccctggaggtggaggtt
-gcagtgagccaatatcatagcactgccctccagcctgggtgacaaagaaagactccctct
-caaaaaaaaaaaaaaaGGAGTGAACACCCCATCCAGGTTTTTAAAAaggtaatattggtt
-gatgggtacagcaaaccaccgtggcacatacatatctatgtaacaaacctgcacattctg
-cacatgtatctcagaacttaaagtagaataaaaataaaataaaaGGTAATATTATTTTTC
-AGATAATTCACTCATATATTTCTTCCAACAttttattaagaaaaatttcaaacatagagt
-tgaaagaattagacagtgaacattcatatacccacctactaatgcacacttgttaatatt
-tcactatatttgctctatcaggaatctacccatctctccatccATTAATACAACTTATTT
-TTTTAATACAACTTATTTTTTAATAAAGCTTTTCAAATTAAGTTGCATATATCAGTACAC
-TTCCCTTAAAGTCACTTTAGTGTGCATGCCATTAGCTAGAATTCAATATTTGTTTGTCTT
-GTTCCTCTCTaggtaacatttacatggaatgaaatgcacagatcttaaaggtgccatttg
-ctgaatttagacaaatgcatactgtaccccaaacccctatcagggtatcaagcattatca
-cctcagaaagtttccttgcatcgctctcctgccgattgctgcctgcccaCCATGGACATA
-TTTTTATATCCATATATATCAGTACTAACaagcagcatcccttgtcctttcctctacatc
-agcctcgctccccaaaagcaaccacttacaacttcttaaactatttcttctggtactttc
-ctccatatttttaaataacttgcttttcctgctgttttcttgatcaattttaggcataca
-cacacacacacacacacacacacacacacacacacacaTATATAtttattttttttttga
-gacagaatcttgctctgttgccccggctggagtgcagtggtgtgatcttggctcactgta
-acccctgcctcccaggttcaagcgattctcctgcctcagccacctaagtagctgggacta
-caggtgtgtgccaccacgcctggctaatttttgtattttttgtagagatggggtttcacc
-atgttgaccaggctggtcttgaattcctgacctcaagtgatccacccaccttggcttccc
-acagtgctgggattacaggcgtgagccagtgtgtctgaccAATTTTAGGCACATATTGAC
-TGACTTTCTGGTCTGATGTTttcatagtgtggcctccactgcctggctgcctggctttgg
-atcccagcccttcctctttctggctgtatgaccttgggcagtaacttaacctccttgggc
-ctcagttttctcatttgtaaaatgagggtgataataatagtgctgaggttattggattgt
-tatacggattcaagatgtaaaaggctgagaataatgaacatcacccagtgagtagtcaaA
-CTTTTTCTTCTCATAATCATTATTATCAAGAAAGATTTAGCTTTTGGTTCCCCCCTTTCA
-ATTGGCATTtatcacaattttttgtgaagtggattttagtgttatttatattatgactat
-gtaaatactgtttcctttcaagccaagtcatatattttggttacatttcctttcttgtac
-aactctttgttcttcctggagttactactcgctttgctttttttcatttgctgtttcctc
-ttaacccatccttaattcTCTTAATTCTTTGACACCCTCAGTCTCCCCATAGTTAACATT
-ACACATCCTGAAACTCTTCAAGTGCTTTTAAAGAAGCATCCCCATCCATTTAAAAAAAAC
-TGGAGCCAATTTTTAAAATAGAATCTCAAATACAATCTGTAAaataaagatttgtgagca
-tccactatgtgccaggagctgtgctaggcagagtgggaaggtagccaaataggggatatc
-cctgcccatgtggGTTTCCAAGAGGGATGAAAACTGAAGCTCCACACCCCCAGCCTCTGC
-ATTTACCGGGGAACACCTCAGCACCTCTAGGAATCTCAGGACCTCAGGGAGCCCAGATTT
-ACTTATTTGTAAAATGAGGATCATTTTGTCATTCTGCAATCACTCCTTAACCATGTTGTC
-TGGGGCTGTGTTGTGGCTGCTGGGTATAGAGCAATGATCTCCCCATCCCTTGAGGGGCTC
-ACAAGAGCTGTGGGATAGAGCGGAGGCTGTGGATTGCAGCGGAGCAATGGGAGCTGGGGA
-GCGGGTTTCCCAGAGGAAGTACCATAGGACGAAGAGGGTCTTGGTGGGTAAGGGCAGtaa
-acggctgttatgttccaagggctgtgcgaagaacttccatgtattgtcccatcaaatcct
-cccaaagacccattgaaaggggtcatatttttatcacaatttcatagatggggaaactaa
-ggccaggagagtccaaggccagggtcacacagctaataagcggcagaggcagtatttgaa
-cctatgcagttgggttcttaaccacacactgcactgtCTCTCACATCCAGATGCCCAGCT
-CCTGTCCCCACCTCATCCTGTATCTGCCTCGTCCTCTCCTGTCTACCCACTGGTGCTAAC
-CTCTGGCTCATTCCATGCCCTTCGCTTTATTCatccattcattcaacacaaatctactgg
-gcgccttttccacgcccaaccctgggctgggcagtgccagggacatagAGCTTGGGCAGT
-ATTGACTCACCCATTCCCAGATAGGCATTGACATTGACATGCAAGCGGCCAGGAAAGTTG
-TCTAAATAAAGGGGTGTTTGGGGTTGAGTGATGGCtgtgtgtatgtgtgtgtgtgtgtgG
-CCTGCAAGGGGTGTGTGTCAGTGTGGCAGCAACAGACTTTCTGTGGAGGCCATTTATGAA
-GGCATATCTGTGTACCCTTGAGAGTGTGTTGTCTGCAGAGGGTGTGTCCACCAGGTATGt
-ggatcagtgaggctctgctgcataacaaaccactctaagcccagaagcctaaaaccactt
-attagcctgtgtgaagtggcagtctggcctgggcttagctgggcagttctggttttacct
-gggttcacttgccttgctgcagtcagctgagggtgggggctctgggagggcttcactcac
-atgcttagcagttggcaggctgtttgctggggtgcctccatttgctttgatgaggctggc
-ttgggctcatgcttatggtgacctcagggttccacattcagcaagagaagataagctcca
-acgcacagtgcattttgagcctctacttgtgtcaagattataaatgtcctaatagcccaa
-gtgacatgtcaagtcagattcaaaggatggagaaatagactctctctctCTCTCTCTCGG
-TTGTGTTTTTGTTCTTTGAAAACAAGCCCGGCTTGCctggctccatcgcccaggctggag
-tgcagtggcgcgatcttggctcggtgcaacctccgcttcctggttcaagcaattctcctg
-cctcagcctcctgagtagttgggactacaggtgcgtgtcaccacgcccagctaatttttg
-tatttttagtagagatggggtttcaccatattggccagactggtctcgatctcttgacct
-catgatctgcccgccttggcctcccagagtgctgggattataggcatgaggcaccgcgcc
-tggctTAGAATCCATCTCTTagtcacattacacagggcatgagtacagatatggaggaat
-tattgtagctgattttcaaacaacttaccTGTGTGTGCAGGTAAAGAActagggacagtt
-ctcagttttggaaataaaaaaaactctgggctgcagtcctggctcttccgtccttgctgt
-ctgaccttagtcaagttgtctcattctctgagcttccgtaaattggataaaattgaatga
-aacgagatgatctttaTAAAGTGCTTGTGCTACTCATTTGTTTACAAACGcagcacatat
-ttattgaggcctcctatataccaactactggtcccaccccgaggatattgcagtgaacaa
-aatggaccaaaacacctgctcttgtgaagctcacagcctaggttgtagacagatgttaat
-tgatcatcctaataattgtatgaccattgagagtagattccggaaggagagattgctgac
-ctggccaggttgatctgagaagccaaagatatttaagctgagatgtgaagggtaggtagg
-agacaacgaggagaagaaagataggagtggaaaatgattctagatggagggcatgtgcaa
-aggccctgtggtgggaggagtagattccaggaacacagagaaggtgggtggggctggGCC
-TGAAGCACCAGGGCCAGATGGTGTGGGGCTGCTGGAGCCTTTGAACAATGTGAGGGTCTG
-TCTTGCCAGGCAGcctaaaataaaaccgaaaggcctaactgctccacaaggccctcatga
-tcggggaccttgttactcctccagtctcccctttacctactctgctgcagccatgctgcc
-tccttcctgttccaggaacaccctggacacattcccacctcagggcctttgcacttgcca
-ttgcctttactagtatcgaccctacccagatattctgatgactcattctgtcacttcatt
-tccatctctgcctcttcaaaggggccttccctaccaacccaccacaacccccctgcccct
-ccagctaagcagtcagcatccagcagtctctacttccctggcctggtttatttctcttcc
-tagcacatatcacctcctggcttatattaaccagaggccacattgtctgtttctcttctg
-gatctctcaccagagtgcagctcagcaggcagggacttggccttgctctaggctgtgtcc
-tcagcctcaggggaagagtaggcattccataaacatttgtgaataaagaaatGAGTGAAA
-ATGAGTGAGTGAATGCTGGAAAGAACTAGCTCctggaaattaggaggtctgggttcaagt
-tctagctGGGCGATCCTTTCTGTTCCTTGGTTTCTCCAGTTGAGCTGTGAGGCATTTGTG
-GTCTCTAGGGAGGTTCTAGGACAGGAAAGGAGTACTCCAGGCTGTGGAGGGGGCCTATGT
-AGGAAGAAGGGAGCTGGGGCCTTCCCTTTGGCCTTCTGGCGTTTGAAAATAGCCTAGCTC
-AGCCCCTAGCTTGGGCCCCTACCCTCCCTGGGGTGCCAAGCTGGAGCCAGGGGGCTCTGT
-CTGGAGCCTGCCAGCCTGGTGCCGGGCTGGGATCAAGGCCACCTGACAGCTGGGCCAGGC
-AGTCCTGGAAGGTTCTTAAGGGCAAACAGGGCATGCTGGATGTCCCAGACCTCCCTCCCC
-ACCTATTGTCCCTCCTCCCTCAGTGTCCACCGGCAGGATAAATCCCTTCATCCTCTACAG
-GCCTGCAGCCCTTGCAGCTTGCAAATCTTTTTCTTGGTTTGTTTCTAATTTCACCCCTGC
-TCAGTAGctactttactggtgaggacactgaggctcagagatgacaactgcctcactgag
-gttacgttgcagttatgattcaggcccaagtctTGCCCAGCCCTGTCCTGTCACCGCGTG
-CACgtgtgtgtgtttgtgtttgtgtgtgtgtgtgtgtgtgtgtgtgGTCTCACTATCAAA
-CAGTGCCCTCCCTTAACCACCAGTGCCCCGGGTCTCTGATAAGATGtgatgactatgagc
-acctggagccaggtggcctgggttcaaatcccacctttgctacttctatactgtgtgGAT
-TGCTGGGCCACCCCCACCTCAGTGTCTGCTAATAGGACAAATCCCTTAATCCTGGGCACT
-GGGGCACTATCAGGACTAGCATTGTATACATTGCACAGGTTTTAAAAAATGTAATCTGTA
-ggctgggcacagtggcttacacctgtaatcccagcattttgggaggcccaggtgggtgga
-tcatgaggtcaggagctcaagaccagcctggccaacatggtgaaaccccgtcactactaa
-aaatccaaaaattcaccaggcatggtggcgggcacctgtagtcccagctactcgggaggc
-tgaggcaggagaatcgcttgagcccagaagctgaggttgcactgagccgagattgtgcca
-ctgctctccagcctgggcaatagagcaagactccgtctcaaaaaaaaGGTAATTTGTTGT
-CAATATTTACACATCTAAACCATTGGAAGAATAATGTATATATAAACTAGCTAATGAACA
-CCTACCAAGCCCCAAGCACCAACTGTATGTCCAGTACAGAGCCAGCTGCTCCAGGGGAGT
-TCGTTCCTGGGAGGGGGCATCATGATGAAGTGGGCGTGGTTCCCATTTCCTCCAGCGTAG
-TCTCAGAAGCGGGAAGCCATGTGACTGAGGTTACAGCCAGGGAGGGCAGAGGCCCCCGGC
-ACTCACCCCTCTGGGGTCCAAGCCCCGCTGGCATGTGTTGTGTCCCTGGGTAGGTGTGTC
-ACTCCCTGTCTGTGTCTCCAGTGTTCCTGTTGGCAAATCAGGGGTGGGACGGAGGTAAAT
-GGAGAGGCCCTGCCCAGTCTGCTGTAATCCAGGATCTCGGACTTAGTGGGGCCAAAGCTT
-CCAAGTTCTCCTGATTAGTGAGGCTGCAAAAAATGTTTGGCATGTTATTCTCTCACCGTT
-TAAATGTGGGCAAGTAACAACTTACATGTAAAATTACCCCCATATACCAAGCATTTaagt
-tatttattatatcattgcttacaatagcaaataattggaaattatttgagaaatggctaa
-agaaactcaggcccaggtacgcaagggaatcctaggcagccctcaaaagatgtcctgcaa
-acacctgatgtggaatcacaagatacacaacacaggtcagtgaacaaaacaagttgtggc
-atgatacccacagtgtgctgctgcttgtggaagcaggaaCACATGTCCATGTACTCTTGT
-ACTGGCACAGAACCCTGGAGAATTATCCTGGGAACCCTGCATGCTGGCTGCCCCTGGGGA
-GGGGAACCCGAGGGTTGGGCTCAAGGGTGGGAGGCAAGACTCACTACTTTGCACACCTTT
-TGAATTTTGAATCATGTGAATGTGTTATCTGTGCAGAAAAAATAAAAATACATTTAAAGT
-AAAGTGAAAGTAGACAAGAAACCTGAAACAGAGACGGACAAGCAAGCCTGCAGGCCCAGC
-CAGCTACCGCCCCCGGGCAACCTCATGCCACACTGTGGGCTCTGCCCAGCTTGGTTTTGT
-GGCTCCACCCTCTACGGTCATATTTGGGTTTCCACACACACAGCACCCAAAGGAAATCCC
-AGCTAACGCACATCAGGTTCTGGGCTGGGCCACCCGCCAAGGTGGTTGGTGGGCATGACA
-CCGCCCCGGGAATGGCGTCGTCCAAATGCCTGAGCAATGACACGGCCTCAGATGGAATGA
-TGCCACTGCCCACAGTCTCACAGGCCCTCCCATCTCGCCTTTGTTCTGCAGCCTCCAGGT
-GGGTGTATGGACACTCCAAAACAGCCATCCCTGTCAATGAATCAGCCTGCAGGGACTGAA
-TTCattccttcattcatcaatatccattgagcacctactgtgtgccaaacactcttctag
-gaactgaagatgcaacagaaaacaaaacagataaaaatccctgccctcgaggagctgaca
-ttccagaggggacacagacaatacttgccagagtgaaaatgctaaggagaaaaatgaagc
-agggaaggatgggGAACTAGAGATTTTTTTTCCtttttttattgaggttgaattgataaa
-caataaaattggcccattttaggtgtacagttggatgcattttgacagttgtatggcact
-acagacaagtgctagaattcctgtatcatcccaccatgttccttcacgccccccacagtc
-agcccctgactcccacccgctcccacccgaagaaactacagatcagttttctttcactgt
-agatcagctttgtctttcccagagttcatgcaaatggaatctggcttctctcagtcagca
-tcatggacttggttgagattcgcccgtgttgctgagtgtatctgtagcttgttccttttt
-actgacgagtagtattccacagtgtggatgcactgtattttgtttattcatccaacttgt
-tgacggacatacaggttgttcccatttcttggctattacaaataaagctactataaacat
-ttgtgaacaactctttgtgtggatgcatattttcatttctcttgggtaactaccacggag
-tggaattgctggacctcgtggtaagggtagctttaTTAGAAGCAGATCTCATGCttttaa
-acaggatggtcagataaggtgtcaccggctcggtgatatttcaggagaggccagaaggag
-gtaaggggtgtctgcagggaagagtgttctgggctgaggaaacagagtcagtatgtgcct
-ggagtgtttgaggaacagcatggaggccatcaaggagggagtgaaggacgtgaggggaga
-gggctaggaggtgtgctccatgtggaatgaggctagatggtatagggtcacatacatcat
-ggtgaggacattggtatttttttcttttgacatggagtctcgctctgtcacccaggctgg
-agtgcagtgacacaatctcggctcactgcaacctccgcctcctgcattaaagtaattccc
-cggcttagcctcccaagtagctgggactacaggcacgtgcccccacgcccattttatatt
-tttgtagagatggggttttgccatgttgtccaggctggtctcaaatgcctgacgtcaggt
-gatccgcccacctcagcctcctgaagtgttgggattacaggtgagagccactgcacctgg
-ctgaggacattggtttttcctctgagaacccgtgggaggaatctgagcagaggtgggaca
-ggatcagacttgcattttaacaccttcccccatctccagctaccaagtggagaatgggct
-gcagggctgcagggaggaggctactgtaatagtcctggcaggagatgaaggagttggact
-ggggtggaggcggtgggggctgaggggtgtgggattctggatctttctggatctaccccg
-aatgtggagccaacaggggatgtattggacgtgggatgtggggaaagtagggacatgaaa
-gaaggctAGGACCCAAggtgacctctaggaactgagagtggccctccagctcccagctgg
-caaggaaacatgcatctcagaccggcaaccacaagaagttgaactgtgctgacaaccaaa
-ggaacttagagtggaccctgagccgcacaaaggatcacagcctagctgacacggtgattt
-cagcctggtgagacctaagcagagaagccaatcatttcatgccaggacttctgacctgca
-gaaactgtaagaaaataaatgggtgctaagtcactaagtttgtgataatttgttatgtag
-caatagatgactgatacGGGCATACtagaatcctacagtgtgagagctaaaagagtgctt
-agcaaccactaagcccaccccccccatgtacatatggggaaactgaggctcagagagcac
-agaggacttgAGGCGTGGTTCCTGAAGGGAGGCGACATCAGGCAGAAACTGTCCCAGCTC
-TGGAGGTGTCGCGAGTCCCAGCCTCTCCTCTCTTAGGAGGCTGTAGTACCTGCCCCTCTG
-CCAACCCCTGCTCATCAGGACTCCCAGAGAGCCAGCTCCTGGCTACCCACTATCTACCCT
-CGGCTCCCCAAGCAGCGAGTTCAGGCAGGCTCCCCACTGGTGCAGGCCCTCACCCCCACA
-GCAGAGCATGGGCCAAGGGTGCACGAGCCAGGCCTGAATCTGAGACCCCAGGGAAGagag
-gaaaaatcacaaccttgggcctggctagaatcccaactctgccactcaccagctatgtga
-ccctggttgagggactcccctttgctgagctgcagtgtccacatgtataagatgggagta
-gggatgctttcctccaatggtcaatgagctaatgaaggtgaaactcttggcGGGAGCACT
-GTAAATGCATGTATCCAACCTcttcctctgcatgggcctcagcttccccatctgctaaag
-ggtcttgtgttcttgatgtgtttgggggggcccttgcagctctaactatatgaggattca
-aattccggctctgcttctcactagctgtgtgaccttgaatatgttactcaagctctctga
-gtcccagttttctcacccataaaacggggctattaataatacctcctattacaggagaga
-tgcaggtcagatacctagtagagtgactgAGAAAATGTTAGCTAGTTGTGTTATCATCAT
-GATCACCATTTCTAGTGTGTGAGTTTGGTTGTGCCTGCTGGAAGGGGCAACAGGGCCGAG
-CCTCCCAGGGTGAGAAAGTTTGGTTTTCTTAGAGACAGACGTTTGTAGGCTGAGCAAGGC
-ATGCGTGCATTTCTGGGAAAACAAAATTAGTTCATTTCCCTCCAAATCCCTGCCTGTGCA
-ACCACCTAAAGCCAGGCTCTGAGTATCACAGTGCTTATAAGTGGTAAACCCACAGGCAGG
-TTTGTGAAAATGAAAATATGCATTTATTTCTGTTCCCAGTTCTGAGAACTACTTCCTGTT
-TCCCTCTAGAGGAAGGCAATGGCTTGTGCACATGCCTGGAGGTGGGAATGTGTGTCATGG
-ACACAAACTGGGGTGGTTATCACTGTGATGTTCCCACTGGCCATGTCTGAATTGTGCACG
-CAATCCTCTGACCATAGCTGATTCACTGGTGTTAACAGACACCTGACGGCAGGCTGGGCA
-CTCAACAGTCTCTATTGGAAATTTGAAACTTGAATGGGGCACACAGACAGAGAGTGGCTG
-GAGATGCATCATTCCTGGCCAGCACCCTAGAGAGGAAAGCCACAGGCCCTGCCCCTGAGC
-TCCCCAGAGATGCCTTTTCCTGTTCTTCCCACAAGAGTACTCGTTTTGGGGGTTTGCTCT
-TCCCTCATCCTGGAAATGCCTTTCAATAAATCCACTGCTGGGCTCCTTGGTTAGTCAGTT
-TTTCGGTGTTTGCCACCCAGTTCACCTTGGCCAATGTGGTGACTAGGGAGACAGCACTGC
-TGGGGGTTAAGGGGAGACTGTGCAATGGAGCAGTGGCCCTCTgtggagtagttctgggca
-gaaagagcactggacccagagtctggttcttcatgatgtactgccatgtgaccttgggca
-aatcacttaacttctctgTCTGGGATGGAACCAGGGGGCACCTTAGTAAGcagatgggga
-cactaaggatcagagagaggaaaggctttacttaaagccacacaacaggtttaggacaga
-cccgggagagctgggccctgcaaatcccagcccTCAGAGGGAAAATTTCCTGGGTTAGGA
-AGCTTATTTCTAATTATCACCAGGACCTGTTTACCCCAGGTGAACAGGGTCCCCAGGCAC
-TTGGCAGATCACAGATTTCTTTCCCAACCAATTGTCACATTTGGCCTTGGCAACAGCATC
-AATGGCCCAGGAGGGGGCtgagtaaactgagcccagagagggacagagtcttgtgcaggg
-tcataccacaagttcatggcagaactagagtctgggccagatctAAAAAAGTGTTGCTTT
-TTGCTCTAAATTTAAGGAGGGTGAATTGGGGGTAGTGGCTAATGAGTTCTCCAGAGGAAT
-TTTTAAACTGTTTGCTTTCATTTTGATGATAATCCTAAACATGTAACTCAAGCATATCAT
-GAATCATCTGCAGAGCCACAGGTAAGTCCTGCCTGAGCTTGCGTTTGGACTTGGGATCAC
-ACTGGCAGCAaataatagcatttgttgagaactaactatggcccaggcactacgctttgc
-attttttatctattttttaaaattttatttaatcctcacaacaaccctataagataaatg
-ccatcagcatccccatttcacagatcaggcagtcaaggtgcagagaggttaaggttaagt
-aacttgaagcaatgttaacagcgagCCTGTGATCTTGCCCACTACACTTTACCATTGTAA
-TCGGAGGAGAAAATGGCAGAGGTGGCTTTGATATGTAAAGATGAATTCCTGCTAAGTGAA
-GGCCAGTGATGCAGAAGTACAGGGTGGGGAGAAATTTCACCATGGGTGAAATGGTGCCAA
-ATGGTGGGAGAACAAAGCCATCATCAGCATGCAGAGTTGGGTGGAAGTGCGTGACAAACC
-CAAACAAAATGGCATCGCAATTGAGTGTCCCACATTCACACTGCTGGTGGCAACTCTGGT
-TTAGCAAAGCAACATCAACCATATCATTAATTAATTAATATTGTTGCATTGATGATATGG
-cagcatagcttaatgcttagggatgcaggcttaaaactcataatttctgacttcaaatgt
-gttttcctcttggcctagtcctcagactatgggcaaatcactcaacctctctaagcctca
-gttttgttcatctttaaaatggaattgtaatagcacctGATagactgctgattgcctatg
-caattcccttcttttcctgttttttgttgaccaaaccctgattttattcccgatggtgat
-atatctagctaagtaagactttattcccagcctctcttacagctactggtggccagcgag
-tggaagttattcagtgagagacttctgaggactatccctagagggggccaatgcatctgg
-gaggaaagcccatatactcttctttctccttcttcctatatggaactcaggcattatggc
-agcagccccagcagccatctaggatcaagaagtgaccttcaggatgaagacacatgataa
-ggatgaagcaacatgaggctggaaggaacctgaaacattgatgataccatagagactgca
-gcagccctgggctgactcttccctgacttttttttttttttttttttttttttaagtcag
-ccttttattttaggacaattttagatgtaagaatcattgcaaagatagtacagagagtgc
-ctgcataccccacacccagtttctcctattattaacatcttataggccaggcgaggtggc
-ttacacctgtaatcccagcactttgggagtccaaggtaggaggatcacttaaggccaaga
-gtttgagaccagcctgggcaacagagcaaggccctcttcctacaaaaataaaaataaaaa
-attgagctgggtgtcatggcataccagtagtcctagttactcaggaggctgaggtggaag
-gattacttgagcccaggagtttggggcttcagtgagctatgatcacaccactgtactcca
-gtgtgggtgacagagcaagaccctgtctgtaaaaaaacccgaaaaccaaaaccagaaaat
-cttatattagggtatgatacatattaaaaccaaaaaatcttatattagggcatggtacat
-atgtcacaatgaatgagccatactgtcattattaactgaaaagcccatacttcattcaga
-tttcctcagtttctccctaataccccttttctgttccaggatcccatccaggctcccaca
-ttacatttagttgtgtctccttaggctccacctggttgtgacggtttcaaagactttcct
-tgtttttgatgaacctcatagttttgaggacaactggtcaggtattttgtaacatgttcc
-tcaatagggatttttctggtgattttcttgtgattagacaggggtgatgtgtttagggag
-gaagaccgcagaggtgaagtgtcaatgtcatcgcttcagatggggggacattctatcaat
-acgacttctcactgtggatgttgaccttgattgctggcacgtttctccactgcaaaatca
-ctgtttctgtcctccattcaacgccatactctttggaagaaagtcactccatgcagcccg
-tgcttaaggagtgggagttatgttccacctcctggagggtgacgcacttaAGCTACTTAA
-GCTAATAAGTATTTTTTATGTAGCAAAAGCTAACAGATAAACAAACCCTTTTGTTTCGTA
-GATCTATGTTATTTGGGTTTTCTATTACATGCAGTCAAACCCAATTTTAAATGGATGCAG
-AATTTATTTCTCAGGGAGGTTGTGATAATTGAATCAGAGAGGCAGGGACAGTACCTACAG
-CAGTGTTTGGGTGAATAAACAGTAACAATAATCATCGTTggccaggtgtggtggctcatg
-cctataatcccagccctttgggaggccaaagccagtggactacttgagcccaggagtttg
-agaccagcctgggcaacttggcaaaaccctgtctctacaaaaaatacaaaagttacctgg
-gcatggtggcacatgtctctagtcccagctacttgggaggctgaggtgggaggatctatt
-gagcctggaaggcagaggttacagtgagctatgattgcatcactgcactccagcctgggt
-gacagagtgagaatctgtctcaaaaaaaaaaaTCATGattattaataacttaattataaa
-taataataattattattagttttataGTGCATTAGTATTTGATTGATAATTTTGTTTCAG
-TCTTTTTAGTTGTTTGGGAACTATAAGCCTAAGGAGTTGATAGCTCACTTCATGAATGCA
-CACAAATAAGTAGTTTACCgtcaatgccctcctaagggcctaagatcaacaggaatgcac
-ctgtagttaaacaagtggttctattactcactgggacaagaaagtgcacagcatggggaa
-ccttggaatgtcttagtgagagtgttagaaaaggcttattataggattggtctcgtgtta
-ggtgacttgaatagggtttgaggatgtggggtttttcttcagattggatgctctcaggaa
-gtgagggtaattatgcagttgcgatcttaacaagtcttgtctatagagaaggcagactct
-ggcaaggctaatgctgtcattgggaaagaagcagcggtcacttgtattagctgggactga
-ggggtgtttggtcattttcgtggcttggaaatgtgcatgatttgtctttgttcagacatg
-attacagagtgttccacttttcgtcttgattcatcaatcactgaggacctcatctgatgt
-tggtgttctggggaatcattaacattggacaggacataagctgttctctgtgcatgttgg
-gctgacttgcagcaacacccagtcctagctgatgactatccaggatggcccctggatgtc
-agggctgctttcctctttctcaATTTCAGTCAACATTAGTGGGTCTGAGAGGATCCCTTC
-CTCCTTTTAAAGCTCTCCATATATTAAGTTGGAGCAACAAGCTCATTCCTGCTCAAACTG
-GGCAGGCATTTTTAGATTCTTTTCTGCTCCCAGAAGTTTTCCTTTCCCATTATTTGGTCT
-TGAGCTGGTCTCAGGAAGAAGTAATGAAGGTGAGAGATCTGCAGTGGGATCCTGGGAAAG
-GTGGCACATGTGGATCACTGAGGCCTGGGCTCGGATGGTGAGGATTTGAAGATTCCCAAA
-GGCCACACCTAAGGGTCACCAGAGGGTgtccagcccccattatccagatgggggaactga
-gacccaggagggaagGGCTCTGTGTTGGGTCCCAAGGTGTGCCATTCCAATTATCAACTG
-CCCTCCCTTACCTGACTGGCAGAGTCCCTTTCTTCCAGTTTGACGGAAAATACTGTTTGG
-CTCTTTTTTTGTGGGATGGAGTGTAGAAATTGGGGAAAAGAAGAAAATATAAAATCTTAC
-ATTAAGCATCCTAAGCCAATTCATGTGGTCGAAGAagcagaaaagcagcagaaaagcagc
-agaaTGCGATGCCAAACACATCCTCTGTAGGCACGTGTGTTATACCAGGTTGCTGCGAGG
-GCCCAGAGGACACATCTGTTGTAGCTGAATAAGTTCCAGTGTTGAACCTCAGCACACACA
-TGCGCATCTGGGCACCTGTGCACAGAGCTTGTATGCACAGAGCAGGAACACATGCATGCT
-ACAAAAGGATCAAGAGTCAAACTCCAAACTGGCTGCCCTTATTGATAACTTCCAGCTGAT
-GGAAGGTGGAAAGGCGAAGGTAGATGTGTTTTGGATATAAAAGGTctgtcttctctgttt
-actgtctatgtgaccttgagcaaattgattgacctctctaagactcagttttctgcaata
-taatatggTTCTCTTCTCTCAGAGTAAGGATGGAGTTCAGTGAGGAAACAGAAATGTAAG
-CATtgcatcattcggaatgctctgggctgcaagtaacagaacaccaactccactggctta
-aatgaaaaagaaattgatcatctAGAGACAGGACTCAGGACCTCAATGATGTCAGTAAAG
-CTCCAGGCCCCTTCTGACCCTCCACTCAACCACTCACTCTCCCACCTCCCTGTCAGATTG
-GTCCCAAATGTGGTTCTCCTGGTGGTCCACACTGGAGTAGCATCCATGCTGTGTAGTGTC
-TTCTCCATCAACAGAAGAGAGAATCTTTGTttttcttttctttcttctttcttttttttt
-tagacagagtcttgctctgtcttctaggctggagtgcagtggtgcgatctcagctcacta
-taacctctgcctcctgtattcaagcaattcttgtgcttcagtctcccaagtagctgggat
-tatgggtgcctgccaccactcctggctgatttttgtatttttagtagagacagggtttca
-tcgtgttgaccaggctggtctcaaactcctgacctcaggtgatccacccgcctcagcctc
-ccaaagtgctgagattacaggcatgagccaccacgcccagccAGCAGAAGAGGTAACTTT
-TCTGTATCCCTGAAACGCTAAGTCTTCCTCTTTAGTATGAGTGAACTAATTGAAGTCACA
-TGACCAGCCCTGGCAGTAGGAACCATGGCCAGGGGAATATCATGTGCTGACTGGCTGCAG
-TTTTGGTCCCTGAACACATCAGTGGCTGGGGGACCCCTTCAGACTAAAGGACCTAGCCCT
-GCAGCTGGGGACTGATATTAGGAAGGGAAAGGGAAAGGGCATGATTCATGTCCCTCACTG
-CTCAGGGTCTTGCTGTGTAGCATCTCTTCTGAGATGTGGGTCAGACAGGGTGTTGGCCAT
-CGCTAGAAAGGACCCCTCCTACAAGGACAAGACTTGAACAGGGATCCTGAAGACTTCTGG
-GGTTTCTATCTAGAGTCCAAATGGGTCTCTAGAGTCAGCCTGTTGACAGGCTGAGTTGAG
-TGGCAGCATCTCTAGTGGATCTGGCTCTCTGCCTGTGACCACTTGTGTGCATGAGCAAGT
-GCCTCACAGACCTGCATGTGTACATGGAAGATGTATTTTTACCTCCATGTTTGCGTCTGT
-AGCAACAAGTATGAAATGCACATACATGTTCATGCACATGTCAATGTACGTGGCTACCAC
-ACAGTAGGTATACTGTACAGTGTAACCATACAGTGTTTCAAATAtgcatatatgttcata
-tatgtgcatatatgCAATATCTGGATAGATGTATATGGCATAATGGCATATTTATATATT
-AATAAATCAATCATTTTAGAGTATTAACTATATATGAGTTATATTATGCCTAAGATATAT
-Taataaaaacaatgtttgtcaagtacttgctatatgccaggtactattctaagcacatat
-gttctaaattaATATATGTATTACTTTAAGGATACATAACCTAGTGTCTTTTTGGGGTCC
-ATGGATGAAGTGTATCTTCACTCACCTTTAATTAAATTCGGTTGTTTCATTCTTCATTTG
-TGAATGTAGGGCATTCACAAATTCACaaattcattctttcaattgtgaatgtagggcaca
-agccacagtagtgtcaggagtgcctggaactttgtcaccattagaaatcatagctatttt
-tgtatcttgttataatgattatagatatctcaaaatattaacagtcatcatttgttttga
-cctaccactgatcttgttatttaatgtattagcaaagaagcatatatagtacaatatcaa
-aactgtgttctttaaAAAAAAAAAAAGTATATATATATATAtgtatatgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgatgaagtcttgctatgttgcccaaggt
-ggccttgaccccctgggctcaagtgatcctctcacttcagcctcccaagtaactgggacC
-CAGCTTAAAATATTTTGATGACAGTATATATATAttttttgagacagagtctcgctctgt
-cacccaggctggagtgcagtggcacaatctcagttcactgcaagctctgcctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacagttgcccgccaccatg
-cctggctaacctttttttgtatttttactagagacggggtttcaccgtgttagccaggat
-ggtctcgatctcctgacctcgtgatccgcccgcctcggtctcctaaattgctgggattat
-aggcgtgagccaccgcgcccggccAatgactgtgtttttaatataatttgtttcattcat
-aatccaatgcatttaattttattttaagcatgtgaagacaccattctgaggaggggtcca
-tggcttcaccagatgccaaagacgcccatgccacagcaaagAAAaattcattgatcaatc
-cttcaatgaccccatgaagcagcagtgttaccagtttgctacagaggggaacctgaggca
-cagggaggttgtgcaacttgtttaaggtcacatagatatcgagtggTTGTGCATTATTAT
-ATCTGTCAGTTGTTTTTATAGCCTATGGGCTGATGTGGGCTTGTCCTTTGTGTCACATCA
-GAAAGCAAGTCTGGTCAATTATTTTCTTTCTCAAGGTTAAGTGAGATCAAGAAAAATAAT
-ACACATATATTGCATGGATTATTTGTGGTCATCATTTGCTAATCCTTATACCTGTGCCAT
-GTTGGATTAATTATTACAGCTTTGTGAGCTGCTTTATTAAGGAGGGGAAGTAGAGTGAAC
-AAATCATGGCAAGTCACTTCACCTCATCTTCTCATTTAAGGATGCTGATACTGGTGTTGC
-CAAGGCGACGCTGTCAGCTTTCGGAAGCATCTTTAAATGGGAGAGGCGAAGGCCCACACA
-GATCGAGGCGGAGGAAAACTCAGAAAAAAGGCTCAAATCCCTCGGCCGCAGAGACAAACC
-ATCCTGGTGGGGACCATCCCTCACCCCCCGCACATGGCCACTTTCTACCTCACCTGTGGT
-GGTTGTCTCTGGGGTGTACTCAGGGAACTCTCTCCCCAGTGTGGAAACTGCCTTTGCTGG
-GAACAACGCAGAGATCTCAGAAATGATGGATCCATCAAGTGCCAGTGGGAGAGACTGAGT
-GGTCTTGGAGGCCTTTCCAGGAAGTTCCTCCTGCCCTTGGTACACGAGTTTGGTGGTAGA
-TGCCCAGATGCCCAGAGTGCTCTGGGAGAGGAAGGCAGCTCACAAATGCAAATGCGCTGG
-AGGTGGTGCTtggctgtgctgccttggatgagaccctttccctctctgagccctaatttc
-ttttttctttttctttttcttttttttttttttttttgagacagagtctggttctatcgc
-ccaggctggagtgcagtgacaagatgtcggctcagtgcaacctccgcctcccggttcaag
-caattcttctgcctcaggctcctgaggagctggggctacaggcatgtgtcaccatgccca
-gctagtttttgtatctttagtagagatggggtttcaccatgttgcccagggtggtcttga
-acttctgagctcaggcaacccaccagccttggcctcccaaagtgctaggattacagacta
-ggagccactgtgcccggTGCCTAATTTCTTCATCACTGAAATGGGAAGAAAACTAACCTG
-GTGCAGGGAGAGGTGACAAGTGTTTTCCATAGGAACCCGCAGATGCAGGTATCCTAGAGG
-CTGGCACCTATGAGCTGTGGCCCCCAGGAGACCCAGTCTAGGCTCGAGACCACACCAGCC
-GTGCCCTCTACAGTGCCTTGTGCTGCCCAGGATCCTCAGGTTGGTCTTGTCTGCAGCCAT
-TGTGAGTCAGCCTCACTGTCAGAAGGGCTTTCAGAGGTTGCTAGGTGCTCTGTCCATGGG
-AAACTGAGGTTCAGAGAGGGCCAGGGGCTCTGATCCAATGGCAGAGCCAGACTGATAACA
-GGGTCTAATATTCCTGGGCAGGACACAGCTGTGCCCTTGATAGTCAGAGGCAATCTGGGA
-TGAACTGGATCCTGGGGTCAGGACCTGGGGACAGGGAGGCCGAGAGAGGGCACAGAGGTG
-GAGAGAAGAGAGATGAGAGCCAGGGACAGGGAACGAGGGAAGGCTGCCTAGCATCCCTGT
-TTCCTGAAGTCAtgacttgggtgtcactgaccccactgctggtgccaggcatgatcatga
-gaccgaggtctggtcaagcagagtaagagtgataagcatagggatggacacaagaccaat
-cctggctgcagaaaatcattcctttactggaatcatggagacgagggagctccccgggtc
-agggatgctgagctgggaggacatgagcctggggctgccagagccttcttgtgaggaaag
-atcctggctgagaatgaagtcaacggggcagatggaggggctgagaggtggagctgacat
-catttgagcctctggatctaacctcacttgcctttacccttagactttccagttatgtga
-gtcaatttattccttAGGGCTAGAATTTCTATCCCTTATACCTGAGTCCTGGCATGGAAG
-AGGAAGGAAGGTAAGAAAGAAGGATGAATATTTAAGAACAGGTGTCTGAggctgggtatg
-gtggctcatgcctgtaatcccagcactttgggaggctgaggcaggtggatcacatgaggc
-caggagtttgagaccagcctggccaacatggtgaaaacccgtttctactaaaaatacaaa
-agttttccgggcgtggtggtaggcgtctgtaatcccattactcaggaggctgaggtagga
-gaatcacttgaaccaggaggcagagattgcagtgatctgagatcatgccactgcactcca
-gcctgggtgacagagtgagactctgtctcaaaaaaataaaataaaaTTACATAAAGAACA
-GGTGTCTGAGGATAACTCAAATCAGCTTCCTGCCCCCTTATAAAATGGGAGTAGAGAGGG
-ACTTGGGCCTTCAACCCACCCAGAGGAGTTCTGTCCCTGGGCCTCACAGCTTTGCCCTGT
-CTCCTCTCTAGCTTGCAGTCAGCCTAGAAACTACAATAGAAAAATAAATGATGTGGATAC
-AAAAATAAAATGCCTTTTCCTCACCTGAGTGCAGGAGAAGGGGCGGCATGTGCTGGGGAA
-TGCCTTCCTCACCCCATTCTCCTCTTTGaggacaaacatttattaggcacctgcttcatg
-ccaggctctattaagaagatgacatacatggtctcatttcctccttgccatagcccagcc
-aggaaggaatattatcatctccattttacagatgggaaaactgaggctttgatgatgtga
-agataactggtgccttgagaggctgagccactggaccaaagtgtcagagctggagcaggt
-ttgtccgactccaaagccctgcccaccacaccacactgcACACAGTAGAGGCTAAATAAA
-GGTCTGCTGGGCAAATGCTGCTTAAGGCGATTTGAGCTCTCTGGGCAGCAATCTGCCCCT
-AAAGATTTCCCATCATGCCTGAAATGCCACCATTAGCAACCATGTCCTTTGAGTCTTGAA
-GGGGAAGAGTGCTAATTCCCAGGAATGAGATCAAAGTCAGTCTGTGCTGGGTTTACTCAG
-GGATCGGCTGAGAGTGGGACTCAGGGCTGGGGCGAGCCAGGGGGATGAAGGGGTCCCATT
-CCCATTGGCTCAGTCTCATCCAGGAGAAAACCTTCTGAGGACAGAGGTGTATCCTGGCGG
-TAGGGCAGGTGGGCTCCTGGCTATGCCTGGGTGTTGGCTGATGACAACAGGGCAGACAGC
-ATGACACAGTGATGGGGGCAGGTGACAGAGTAGCTGTGGATCCTTTCTGACTCCATCCTC
-TGAAAGAAGCTATGAGGGCCCTGGTCTCCCAAACTCAGGCAGAGGCCTTATCTCCTCCCC
-TGCAGCTCCCCACCTACCACCACAGAGGCAGCATCACTGCTGGATGGGGAAGGGAGGGAG
-GCTAGGGGTTAGGGCTTGGAGGCAGAGAGGATCTGGACTTGGAGACAGATGTCCTGCCTA
-ACAGTCCCTGTAATTGAGCCTGGGGGAGTTGAGGTTACAGGGAGTCCTAAGGGAAGCCAC
-CCAGGTAGAGATCAGCTTCCTGGGACTTGAAGGAGCCTTGGAGGACATGAGCCTATAACA
-CAGACAGGGACCTAGTTCTAGACCCTTCTTCAGGGATGGTATCTGTTTTAACTGAAAGGT
-TATTTCCAGTTGTTTTTAGAGGTTGTTTGAGGCTGTCACTGTGGCCCTTGTAGCCAAAAA
-GGGTGAGTATAGCTGGGGTGGGGATGGGGTCGTAGGGCTCCTCCTTATGCCAGGGGAGCA
-CTAGCTTTGTCCAAGAGCATCTACAGTCCTGTGAGATGCTCTGGGACAAACCGAGCCCAT
-TTTCAAATaagtaaatttggagaaagctgcccactctagccccttcatgggtagtcacaa
-ggcacttggccatattaaaggctctgatcagtcctgcagtgaagagtgcctgttcacttt
-gacttaacctgctgtttccTTTTCTCATTGCTCATAGGTACTTTTAGAGACAAGCCATAG
-TTATTCCCTGTGACACATCCTCTAGGACATGCTGGAGGTGAAGGAGCATGTCCTTTTGGG
-TCTCCTAAAGACCCTGAGCTCCAAACATTGGAGCCTAGAAGTGGTGAAGTGGTAAAGCCT
-AGAAGTGGTGAAGTCTAAAGACCCTGAGATCTAGGGTCATTAGAACCTAGAAGTGGTGAA
-GTGTGAAGGGGAAATAATGATTAACCCACCCACTAAGGGGTGGATGCAGCCCCTTCAGAC
-TTGAAAAGAAAGTTCAAGGACATCTCAAGACTAGAAAATCTTGGAACAGGAGCTTAGAAT
-GGGAGATGGCCTTCTTGCCAATCCAAGGGAGAGAACCTGGGCCATCTGGGCAGCTTCCGA
-TGTGCAAATACATTCCCACCTGCCTGCAACCCCACCATTGGTCATGGGAATCAAGTTTGG
-TCTGTTCTCAGCCCATTCAAGGTACTGTGACCCTCAGGCAGGGAGCCCCTGAAGGGGGAG
-GGAGAGAAGAGGGGCGAGGACTACATCAGAGGGATGGGCCCCGAACACCCTCCATGTCAC
-AGACGGAGGGGAGTTGGGGGGCAGATGACCCTTCTGGACTTCTGGGTCAAGGAGGGCTGG
-CTCAGGAAGCCCAGGGTGTCAGGGAAGGCGGTGGCACAGTGTCTTGCATCTGGGTCCAGG
-TTGTCCAGGAGTGCCAAGTCCGAGCTTCTCCTGTGTGGTCCAGCCTCTGGCACAGCTGCT
-CGTTAGATGTCCAAAGGCCGTATCATCATGCGAGAGGCACGCAGTGAGTAGCTGGGGCCC
-TTGAAGTAGTGCCAGCGGATGCCGTCCATCTTGTACTTGTTGTCGGGAGCGTGGTAGTAG
-ACGCCGTTGAGGTTTGACAGGCCACAGGCGTCAAACCACCACCCTGGTGGAAGAGGGAGG
-ACAGGCGCTTGGTGGAGGTGGGAGCCCAGCCAGTGGCAAGAGGGCAGCCCCTGTGTCCCA
-AAGAGAACAAAGACTAATCGGGGCTGTTGCCTCCTCTGGGAAGCCAGCTggctggggatg
-gggctgggtgggagtgggggtggggTGGACAACAGACCCTCTGCTCAGCCGGGGCCTCTA
-GAGGGCAGCAAGGGGCTCTGGCCACTCCTCGAGCCCCCTTGCTCCTCCCGGCCTTCTCCC
-TGAGCCCTTGGCGTCCCTGTCTTCCTCCCTCACTGAACCTGTCTTTCCAGCTCCCCAACC
-TCCCCTCATCGCTCTGCTCACTGCTTTCTAGTGgtctctgtcactctctctgagtctctc
-actctccaggttcatctctttctctcttatggtctctgtgcgtgggtctgtctctgtgtg
-tcccattgtgttcatctttctctgatggtctttgtccctctctgcctttcgtgtctctgg
-ccctCCCTTCCTCTGGGCCCCCATCTTTCACATGCTGTGTTTGTCTCCCGGCCTCTCCTT
-GGGCTAAGTCTTTCTCCCCCATCTCCCTCTGTACTTCTCTGCCCCAGTATAGCTCTCCAT
-CTGCTGCTCAATGACTCTGACAGCCTTGGtgtctctctctttctccatctgtcctctgtg
-tctcagaaggtctctccccctgtctctgttcttcttactttgtctctgtctcCCATTCAC
-CCCACTTCCTGTTCTCTGACCTCTGTGCCTACCAAGGAACACTGCCTGAGCCACAGCTGG
-TGTGGAGCTGCCCCTCTGCCTCCCTCTGGTCTCCTGATCCTGGTTCGGCTTGCCTGGGGT
-TGGGACTGATAGGGTATAGGGTGCCTCCCCCCCGGGGCCCTGCACTCAGTGTTTCTTTAG
-CCTTGTCTCTGAGGAAAACTGGTGGTGCCAGCTTTAGGAGGAGGTGAGACCTGGAGGGGA
-CTTCAAGGACTCAATGGGGGAAGGCACCGAAGGGGCACAGCCAGGTGAGCTTATGGGTGG
-GCAAGGCCCAGACCTGCACCCATCCTCCTGACAGCACCTGGGCGCACAAGAACCTGGGGA
-GGGAATGGGAGTGTCAATCTGGGTGAGCCTGTGGGTGGGCGGAGCTTCACCCCACCCTGC
-ACCTACCTCCAGACATCACTTGGGCACACTTGCAGAGACAGTGGTCGTTGTCTGAGTCAA
-GGGTGCTAAAGCTGGTGTTCTGCAGGACCAGGCTGCTCTGGCGCCCTGCTGAGCCGCTGT
-ACCCGACCACAGAAAGCCTGGAGGCCACCCAGAGGTGGTGGTGGCAGAAGGGCCCAGAGT
-CAGGTTGGGGCTGTGTCGAGCAAGAACTTCCCCAGTGGCTTTGTCCCAGGCTGGGCTTCC
-CCTCCAGGTGTTCTTGGAGGGACAGCCCCAGCCTGGGTGGAGTGCTTGGGCTGTTTCCCT
-TCCTGGATTGCCTTCCCTGCCTGCTGCCTCCCAGGGACAAAGCACTTACTGTATGCCAGG
-CCTCCCCTATCTCACTGAACCTGAGTCTTGGAGAGAAGTGATAATGGTCACAATAATGAT
-AATAATGGCTAATACATATACAtttttttctttagagacagcaacttgctctgttgccag
-gctggagtgcagtggcacaatcacggctcattacaaccttgacctcttgggctcaagcaa
-tcctcccacctcagtctcctgagtaaatgggacaataggcacgggccaccatgcccagct
-aatgtttgtattttttgtaaaatacaaacatagggtctcactatgttgcccaggctggtc
-ttgaacacctgagctcaagcagtctgcctgccttggcctcccaaagcactgggattacag
-atgtgagccaccgtgcccggcAACGTTTCTTTTTCTTTCTTTTTTTTCTATTCTTTGCAT
-CTACTATGtgttcaaagtgctttgcataggttaactcattctcctttaatcctcacaaca
-ccctatttccattttacacatgcgaaaacagaaatcccaagagccaaagaaacctgctca
-agtctcagaatgaatgagggtcagagccacatgccagcctagtgtggcctgacttgggag
-tctacgtgcatttTGTTCCCCAGCTGATGATGATCTGGCAACCCCAGCCCCATCGCACCT
-CCTCACATTCACCCACCTCTTCCAAGAAGCCTTCCCTGACTACACCAGCCCCCATGGATC
-TGGGCTCCAGGGCACCCCAGCTCTGCAGCTTCGACATCTGCTGCCAGCCAGGTGAGGATT
-TCTATTTCTTTGCCAGGCTCTGTGGCCTTGGTGGGCATGTCCAAGCCTgcctggtgatga
-agaccatgagatctgggggcagaaagcctggattcaaattccagctctaccacttagagc
-tgcatggccttggaggattggctcaccccactgagcctcagtttcttcatctgttccagt
-ggtaatgatagtgaaattagcagtgctgccctcgtttattattgatttggtgatgtcagt
-gtgtgaagtgtgcagagcagtgtcacggggtgagtgctcaacattcagtgcttgttatta
-ttTGGCCCTTGGCAGATGGCTGGGCCTGGTTGGAGAGAATGCGGGGTGTTTGTATGGCAG
-GGTTGGGGGAGGCTGCACTGGCAGCTGAAGTAGGGAGCCAATTTGGGAGCAATTAAGAAG
-GTCCTGCTGAggctgggtagggtggctcacgcctgtaatccccgcactttgggaggctga
-ggcaggctgattgcttgagcccaggagttcgagatcagcctgggcaacatagggaaaccc
-tgtttctataaaaaatacaaaaattagctgggcatggtggtgcatgcctgtaattccagc
-tacttgggaggctgaggtgggaaggtcactggtcactggagcctgggaggtctgggaggt
-cagggctgcagtgagctgtgatcatgccactgcactccagcctgggcaacagagtaagcc
-ctgtctcaaaaaaaaaaaaaaaaaaaaagaaGGTCTTGCTGGGTGGAGGCAAGTGGGTGG
-CAGATGTGGCCAGGGCAGCTCAAGGAAGCTCTTGTACCCTCAGGGCAGGGCCTGAGAAAT
-TCCCCAGTGGGAATTCAGAGGGAATACAGAGCCTGGGTATATGGTTGGCTCAGTCCCCAC
-ACCTCCAGTCATAGATTGTGTCTGTCGCCAGGGAAATGAGACTTAATTATTCTCTGTGTA
-GAAAAGACTTGGGAGGCTCCCTCAGCTTCCTTTTAGGCACTTACTATGTCTGGGGATGGG
-AACAGCCGTGCTCCCAGAAAGCAGTCCAGTCAAGGGTGTGAAAGGCTGCCACGAGACAGT
-GATCGTAAtattgtttgctgagcgtttactacatgccaggcactgtgttaatgcttcatg
-tgcagtatctcattcaggcctcatcacaccctttttgaggtaggtatgcctaaagcaccc
-attctacagatgaaaccgtgaagggacttgctcagggtcactcagggaagtagggatgga
-gtcgggatttaagccTTTGCTTTAGTGGCCAGTGGCTTAAATGGGACTCAGCATAGTGTT
-GTAGCTACTCACTGGTCAGGTGTGAGGAGTAGGGGGACATCCAGGGAATTTTTCATTCAG
-CTCTGGACCTTGCATTATCAGGTTGGTATGGATCCCATAAGGAGGGATGTCAGaacctgg
-gcaacatagggaaaccctgtttctataaaaaatacaaaaatcagctgggcatggtagtgc
-atgcctgtaatcccagctacttgggaggctgaggtgggaaggtcactggagcctgggagg
-tctgggaggtcaaggctacagtgagctgtgatcatgccactgcactccagcctgggcaac
-agagtgagaccctgcctcaaaaaaGCCTTTGCTTTGGTGGCCAGTGGCTTAAATGGGACT
-CAGCTGGAGGAAACAGTGGGGGCATATCACTGAGAAGTTCCCAGAAGTGGAATCAGGCAT
-AAAGTTCAGGAGGACAGAGAGTCATTCAGAGATTccttgtggggaagcgaccttcccacc
-agtggaggtattccagcacggctggatgatgattgcaactatggagggaatctatgaaga
-accagatgacacgtgagattttttgcagccctgtgagtgtgaatcCTGGTTCAGAGATAG
-CCAGGACCCAGGCTTATCTAAAAGATCCTTAAATTTCTCTgagaggcaatatcatgttgt
-ggagacatcatgagttttgacagcagggagatctgagttcaaattccagctcatttaact
-tgtaactttgggcaggatacttaaacttggcatctcagtttccatattactaaagtaggt
-acagtaatgcctacttcaaagtgttgtggggaagattaaatggaataatggtgcctggaa
-cacagtaggtgctcaataaatgctagttcCTTTTCCCAAATATACCAAGAACCAGGCTGA
-GGAAGGGGTGAGAAACCTTGATgatcttacaagatcgtcatgtttaagctcatcctgcta
-ttgaagaagcagaagctcagagaagccagactgacttgtccaagttcccaaagcaagctg
-gagcaaggccacaatgagtgcaggaatttcaacttctggcccagggacccttccacccag
-ccCCAGGGCATAGGACAGGCTGGGCAAGTCACCTCCTTTTGCTTCTGGGTCTCTGTAAAA
-AGGCTGACTTGGGGTGACTGACCTTGGAAGACCCCTTCTTGCTCCTCGGATGGCAGCACC
-AATGACATTCTTTCCACTCCACCCAGTGGCTAGGACATGCTGAGTGCTAACCAGCCACCT
-CCAGATCCCATGACGTGCACCCAAATGGGGGACAGATGGTAGGAACAGGAGACACCCAGA
-GACTGACCGTTGGAGCAGACTCTGTAGACACTAGCCTGGGGACCCCAGCCCGCCCACTAG
-CTGAAGACCCCAGCCCCCACAACGGCCTGGGCCCCGAACCCACCTGTATAGCTGGTTCTC
-ACTGCCCAGGTGGAAATGTTCGTACTGGGCATAGGCCTCGTGGCCTTCCCAGTCTTGCAG
-CTCCACACGCAGAGAGTAGGCTGCCCTTCTGGTGAGCTGGTGCACCACTTCATTGCCCAG
-CCAGTGCTCCCCAGCTGGGTCTCCGAAGCCCTATAGGGAGGGGAGCGTGGGGTGAGACTC
-ATGCTGAGGAGGAGGCCATGTCCCTGGCTGAGGAGCTGGGCTGGGCCAGGCTCCAGGGCT
-ACTTATACAAAACCACTGTGCTTAATGATCGAGTTCATAAGTACAGTGTAGGCAGGACTG
-GGAGTAGGAGCCCTCCACCTGCTAGAGGGAAAAGACTAAGGCTTTTGTAAGTGTAAAAGC
-CTGTTAAAAGTTATTGAAATCAcattcctctgaagttcaagaacaggaaaaagtaatatt
-tggtgactacctttggtggagtattgactgggagggggcacaaagtgggcttctggggtg
-ctgggagtgttgtacatctagcactgaatggtggtcacgtggttaaatacatatctaaag
-gctcactgagccttacactttatttgtgcgcttagacacatgtacgttaaacctcaacaa
-aaaTTAAATAAAATATTTCAATCAGCTACATAAATAGTAGAGCAAACTTTGTTCAGTGAC
-AGCGCAGCCACTGCAAGATTTCAGCAACACAGAAATGTAAAACTGAGAGTGTGGGGAATG
-TCATGTCCCAATGCCCTTGGACAGAACAAGAATTCAGCACCAAGGACAGGGGCACACCCA
-AGGCCCGCTCCCCAATTTAGTCACGATGCAATGCGGGTTAGCCTGATGGTTAATATTCAG
-GGTTCTTTTGTGTATTTCTGCACCTGGACACCCTATTCCTCCTTGCCATTTTAATGGTTG
-TTTAAAGCCCAATTAGTTCAAAACACTCATAACTTAATTTGGTATTTATTTTTAAGTATT
-CCTTAAATGAACAGCAAGCAGACGCAAATAATAGAACTGCTGTATCACTTTGTGGGTATC
-TTTTTCTATTTCTTTGGCTTTGAAAACTTTAAGAGCTTTTAAGTATTTTAAGTCAGCTTG
-GCAAAAAATCCTTTATTCAAAACCTAATTAAAAAATTGGAAAACAATCGGGCTTCTCATC
-TGATAAAATACATGTGATCTTTGGGCCTGCAATTCCTCGTTAATGAATCTCTCCTGCAGA
-TATGATCATAGACGTATGAAAAGACAAGAAACTTCATTAAAGCAACGCAGTCAGGGTTGA
-CTGGGGGGATTTTTATTCTGTCTCCTCCTTTGTATTCtttaaaaaattagaaatgtatat
-gtatttttttaaaaaaaattaaaacaaaaataaaGCTAAACTTTTTTTCTTAGAACATAT
-GTCAGAACTTTCAGAAAGAACATTCAAATTCAGGTGATGGGGTCCCATAAAGCAGATGTG
-CACTGTCAGCTTTAGATGAGTTGATTTTTTCTGGGGGAGGAATGAGGGCAAAGCAGTCCC
-CTTCCAACAGCCCAGCCCCAGCCCCAGGTTTCAGAGCAGAATGGCCCCTCCCCAAGGCAG
-CAGGGCTACCTGTTTGTAATCCTTCCAGTTCCGCTGAAAATTCACGGTGCCATTCTCACG
-GCGCTGGATGAGGGTCCACCTGCCTCCACTGCTCTGCAGGTCACAGAACACCTGGAGGGG
-GTGGGCAAGGCACAGCTGGGAGCCCTTGGAGGTAGCCAGAGGCCAGGCCTGTGCTAGCCC
-AAATGTGGCTAAGCAGACAGACCCCCACAGAGCAACAGGTgagcctgggggtcctgggca
-tcagaaagatccaggcttaaattccccacccattgtcatcatttttctaaagtggtgggt
-aaggaatgacctctcagagccttcctctcatttgtaaaatggagattcataccttaacct
-ctttgtgcctcagtctctcatctaccaactggggttgtgaaaattaaacgagatgagtca
-cgtaaagtgtttagaacagtgcctggcagtactaggtaaacggaagctcGACCTCTTTTT
-GTTGAAAGGAGAGGTTAGCAGGTGTGTGAGAAGTGTAAAAGACAACCTGGAGACAAACAG
-AGGCATTCTCCTTAGTATATTAAGAGGGGGTGAAAGGAAATAGAGCAATGgtaatactag
-caatttgagggccgaggagggaggatcgcttgagctcaggagtttcagaccagcctggga
-aacacagggagactttgtccctacaaaatgtttaaaaatattagccaggccatggtggca
-tgtgtctgtggtcccagctacttgggaggctgaggcaggaggatcactcgagcccaggag
-gtcaaggctgcagtgagctgtgatcatgccattgcactccagcctgggcaccagagcaag
-accctgtctcaaaaaaaaaaaGGGAATTATGAAGTAGGAATCTGCTAGTTGTTTCCcttc
-taggcctggctctcagaccctccctcctgacatccgtgctcttctctgtcacccttctta
-tcggatgacttgaccttaaattttaggacaaccttgggagccactgattgaaaatggtgg
-cacctctattagccctggtttctaatttcccacatggagcagaaccccaactcctgcctt
-caactggactatatgtaaactagaaagaaacgtctttgggctaaggccctggaattttgg
-gggttgtttgtaatatcagctatcatcatcttaaccaacacTGAACTATTTTGTGCTGTT
-CCAGTTAAAGCACCTCTGAAGTGATGCTGGTTAAGGATGCACTTCCAACTTTGGGAACTT
-CTGCTTATCCCCACAATCTGATCCCTGACTGCTGGGAAGTCAAAGCCACCCCTACACCTC
-TGGTATTTCAGATACTGGACAAAGCCTGATCCCGATGGGGTGCGGGGTGTCTGTTTGGGA
-AGCCCTTGGCTCAGCACCCTCTAACAGCCACAGTTCCCAGGGAGCCCCCTAACCTTCCTG
-GGCTTCGTTGCATTGGACACCTGGATGGTGTAGACACCACTGGCACTGGCCCCAGAGCGC
-TGGATCTCTGCACAGTCCTGGAACACCTGCTCACCTGCCATTATGAAGGCTGCAAAGGGA
-CAACACAAAAGTCAGTTGGAGGTGGGCAAGGAAAGAGAGAAGGGGCCAAGTGGGCATGCC
-TGCCTGCTTTGTGCCAGGTTCTGGGTTGGGAGGTGCTGGGGACAGGGAGATGAGTCAGAC
-CTgggaagatttcgtagaggaggtgacagtaagctggaacctgtgtaatgagcaggagtt
-gcccagtggagaaggggaaggtgttccaggcggaagaaacagcatatgcaaaggccccaa
-ggtaggaagggccctagtgtgtgcagaggacagGGCATGGGGAGGGGAACTAAGGCTGAG
-GCCAAGGAGAGGAAATGACTCACACCGTGAGAGAGGAGTTGAGACCAGGGAGGCTGCTTG
-CTGTATGATGCAACTGAGAGGGTAGAACAAGGCTGGCACAGAGAAGGTGGGGAAGGAAAA
-GGAGAGACGAAGCTGAGATTTCAGCAGGGCCAAGTCAGCCGTGAGTGCCAGGCTGCGGAG
-CCCAGATTCTCTGGGCTGagaaagagcactctgtccagagtgtggaggggggcctggagg
-ggatgagactcaaagctgggaggccagagaggaggctgctagagttttctgggagagagt
-tactggggcctgaacTCCAGTGAGGCActtcccatttcacagaccaggaaactgaggccc
-aagagtgaggcaactggcccaagggcacacagccaggtaaggcagaacCTTCCTTCTTTG
-GAGCTCCCTTGGGTGGGAAGCTGTGGGCTCCCCTTCATAGCCCACCCTTTTGGCTGTATC
-TCCCTGCTGCCCTGGGCATATGCTCCCTTATTCTGTCCTCCCTTGAAGCTGACTGCTGGC
-CTTAAAGGGCCCCTGTTTCTTCCCTCTGGACTACATGAGATCGGGATAGTATTAATGACT
-AAAACCTACCAGGGGTTTCTAGGCCTGGCCTGGAAAAAGTGACTGTTGACAAACAAAGTG
-CAGAGATTTAAAATCTCCTCTGTCTCAATTAGTGGAATCCAGTTAGAGGTTTGAACTATG
-ATTCTACCAGAATCCAATCTCTCTGGGTAGCCAGGTACCCAGGATGGGGCTAAAATTCCA
-GATGGATAGGTTGTCAACACCAGTGAGGAACCAGGAGGCTACCACAGGGTGGGACTTCCT
-GGTTTGGCTTTACATCTGAACTTCAGGGATCCCAGATCCTGGATCTGGGGCACTTGTCCA
-GAGAAGGCTATTGCTCTCATGTCACAAATGAGATGACTAAGACCCCCAAATCAATTCCAG
-TTCACTCACAAGCATTTCCTGGGCAGTGGAGACCCCTGCCCCACCTGTTGGCACCCCCTC
-AGCTCCCCACAGGGAATTGGAGTCCAGCCAAGCATGAGGAGGCTGTTGGCCTCAAGGTGA
-GCAGGGATGGGCTGAACCTCACCCAGTAAGGCAAGGACAGAGCCAGGGTTGGCCTGAGAT
-TTCCAGCCACCCTTTCCAAGGCTCTGCTCACTGTTATTTTCCTTAGTCTacaacaatatc
-aataacaataacaacaataatatcaacaCAAAAAGTGAAATACTCACCATGTATTGTAGT
-GTTTCCAAGGTGTCATGTAATGCCAGGGGTAGTTTGGGGCCAGGAAAAATATTTTTGGGA
-GGCATAAGAATAGGATGGACTGATATTGATATGCAACAGTTTGATCTGGTCCTCCTCTGA
-ATATCTGGGCTGGTAATTTGTACCAGTTTCCCTCGCTTTtgtgcataggcactgtgctga
-acccttttgtatgcatgaactcatccgattctctgtgcaagaactctatgagattattat
-tcccgttttacaagtaagaaaaattgaggctctgagaagttaaataaatgacttgtatga
-agttccagtgctaattaataagtgaaggagccagggcttgaactccggcccatctgactg
-caaagccagtgcccttcctcctacacATCTTCCTTTGGATTTCCACCACTGAGCATATGT
-AAGGTTGGGCAAACAGCCTGCATGAACAATCGCTGCTTTTATATCATGCACAAGTTTGGT
-CTTTTCTGCCTGTGCCCATGTCCTTGTAACCTTCTGAACCAAACTCCCCAGTGCCTGGGA
-ACATCAGAAGACTTGACTCTCTTCTCCTTTCACTAGCCTCCACCTGACTGGGACAAAGCC
-ATGCAGAGAGCTAGTGCTCCCTTCCTGCTAGACTTCAAGGATGCCTGGTTCCTGTGCCCC
-ATCTCCATCCAGCCCTCTCTTCTACACCTGGTGACTGAGCCTCTCCTTCAGTTTCTCCAT
-CCAGAAGGGGGTGAAAGCAACTGCCTAGTGTCCTTCCCTGGTGATAGTGGAGCACGGGGG
-ACAGGGTGTTTGGGCAAAAGGTGCCCAAGGTGAGGTGCCCAACACAACCTCCTACTCAGA
-CGATTGAGCAGACATTCAGCCTCATCTGGGGACTGGGTTACCAGTGGGTTAGTGGGAGGC
-ATTGGGCCCAGGCCCTGTGCCTTGGGCTGAGCTACAAGAAACCCACACATGGGATGAATT
-CAGGCAGCTCAAGGCCAGGTCTGTGCATACGCCAGTAATAGGTTCAGGTTAATCCACATG
-TCGCGATTTGGAAGGTGTCTACTTTTCCTACCTGTAGCTTCCTTAGGCCTCAAACCCCTA
-CTCAGCTGGGTCTGCCAGACTGAGATGGAGCCAGGGTGGAATCTTCTGCCCTCAAATCCC
-TGTCAGCCCTGGTGGTGCCGGGAGCGCCATCACTATTGGGTCTTAAAGGCTTTCCAGCCT
-TCCACTATGGATCCAGGAGCAGCAGTAGCCCCTTTGGTCTTTCTCTCTCATCAGGACATC
-TCCACTCATGGTTCCAGTCAGAGCTTCTTGAAAGTAGTCCCACTCTGTTCAAAAGCCTCC
-CATGCCCCCTGCTAGCCTCAGGCTAAGAGCCCTTCTCCTTCGCACAGCCTTTGGACCTGT
-CTATTTTTATGGTCTGGAAACTTCAGGAACACTGATAGCTGAGCATCTGGCACATATTAT
-GCACTCAAAAACCATGTATTTCTTTCTCCTTCCCTTTGGGACCCGTAAACCAGGGactgg
-acatttttgcaagagacaggagctgtgactgtgcattcactgctgtatccccagcaccca
-gcactgggcctgccacacagtaagtgcttagtaaatgtttgttgactgagtgaTTGCAGC
-TGGGGCCAAGAATGCCTTGGACACCCCAAGTAGGCCGTGTTAGAAGGAGTCAGTGAGAGC
-CTGGGAGCCCAGCCCAGAATTGTTTTCTTGACCCAGAAGCCAGGGCCAGGGATGCCTCTT
-CACTTCTGTTTGGCCCTCTTGGGCTTAGGGGCAGGGGCATTAAGATGAgagaggtccttg
-gggtgcattgagtctaacctcccagttcctcccattctacagccaggaaaactgaggccc
-agggaggggtaggacaagcccaagAAAGTGGGGCTGGAGAATGAATCCTGGAGACCAAAC
-TTGTCAGTCTGGATTGCTGTTGCCCTCATCCTCGCCTCCAAAACCCatgggtaaactgag
-gccaagagaggggcaggggcatgcccaaggtcacccatggaatcaggggacagggcctgg
-attgggaTTGTTGTTGACGCCATTATTACTGTTTATTGTTGTTTCTATTTCACAGATGGT
-CGGGGAGGGTGGGGCCCGCAATGGCTCCCAGGCGCCCAGAGACCCTGGAGGGTGAGCAGG
-GTCTCCCCTCCCCTCTCCTGCCCGTCTTTAGCCACACTGGGGCGCACACCGCTCACTCAC
-CCGGGGCCGAGGCGTTAGCCCTTTCTTGCACCAGGTGCCGCAACAACACCAGCAGCTGGC
-GCAGGCTGTGCTGCTGGTCCTGCAGGAGGCTGGAGTTGTGCCTGACACCGCGCAGGCCGC
-GCTCGATGTTGGTGAGGGCGGCGCTCTGGCGGCTCAGCGTGTTCAGCAGCTTCGCCTTCT
-TGCTGAGGATGCTGGCCAGCTCCTCCTGCTGCTTGGTCTCCAGGGCCTGCAACCGCTTCT
-CGAGCGCGCTGCGGGGTAGGGGGCGCACAGAGGTGAGCCTGGCATCCTCGCGAAGCACGC
-ACCCCCGCGCGCCTCCCCGGCCCTGGAGTCCCTGCAGCCCGACGATGAGACTCAAGTGTG
-GTGGAACGTCCTGTGCCCACTGTAGGCACAGATTGAGGAGGGGAGAAAAGAGATACCCGG
-CCCTGGAGTAATATAGATTGAGGTTTAGTGGAAGAAAGAGGTGGTGTGGGAGGGACACCA
-GCAACTGGGTAGCTATTATCAAATCCCAACTGTGCTTGCTTTTTGACCCAGCAGTCTACT
-CTCAGGAGTTATCCTCTAGGGAGCATGGTCAAGAATGGCCCTGGGGACTTGCTTGTAATA
-GAAAAACAAACTAACCAACCAACCAAAAAAGATATAGCCTAGATGCCCAAAAGCCAGGAC
-TGGCTGAATCCGTTGCGTTTTGGCGTCCCTGGAAATGTTCCGCAGTCATGAAGGAGGAGG
-CATTTGCACAGAATTGGAAAGATGCCCAGGACTTGGGGCACATCAAGCCTAACCCCATGT
-GTGGCAAGAGAAGAAAGAAAGTATTAATGTAAATAAAGAGAAATGGGGTGAACATATAGG
-AGAAGGCTGGAAAGACCGCAGTGGTGCCTGTGTTTGGGAAGAATATGAAAGAAATTCCCT
-CAAGTGCTGTGACTTCTGCAGAGCAGGTTTGAGTGGATGAAGATGGAGAGGAGGAAGATG
-GGGGCAGGATGGAGGGCCCAACTTTCACTTTTATTTTGTACAGGTTCCTGTTGTCCGATG
-ATATTATAATAATCAAGAGACATTTTTTGTAATGGATTTAGAAGCAAAGAGGAGTTTTTC
-AAAAGAAAGCCTTAGACTCAGCTCTTTCTTTTTGGACATTTTATCCTCCagatttactca
-catgtgtgtgaaatgagatatggaaatgttactcatcgtatcactggttggattagtaaa
-aggctggaagcaacctcaatatccattaactggggactggaggaataaaagcagggacca
-catatggtggagcattataaaggtggagaaaaaaatgagcaagcatgtcATGCAGTTATA
-GAATCTTTCCAAGGTAACTGAATAATAATTTGTAGAAACAAGGTATAAACAAGTAGTAGG
-CTACATTTGGGCTTAAAAAGGATAAAAATGGGAATGTAcagatgctccaaaatgtatgat
-ggggctatgtcctaataaagccatcgtaagttgaaaatgtcctaagtcaaaaactcattt
-aatacacctaacctgctgaacatcctagcttagcctagaccatcttaaacatgcttagaa
-cacttacattagcctgtgattgggcacgatcatctagcacaaaacctattttataacaaa
-atgttgagtagcttatgtaaggtattgatattgtactgaaagagaaaaaccgaatggttg
-tatgggtactcaaagtacggtttctactgcatgtgtatcactttcataccactgttaagt
-cacaaaattgtaagcccaaccattgtaagttagcaatcttctgTATGTATGTGTTTGCAT
-ATTCATAAGAAACCCTGGAATGTCAGCTTAtaggatgtcagcttcacgaggacaggggct
-tttgtctctttgttcacttctgtatccacagtgtctacaatagtgcctgacacatgaaaa
-gagtttgaaaaataattgttggttgaatgaatGGAAGGATACACAAGAAACTAGGAACAG
-TGGCTACCTCTGGCTTGGGTGGGTGGCTGAGAGACAGGGCTGGGAGGGAGACATTTTACT
-GTATATCCACTTGTGCCAACTCATTCTGCAGACTAAGAAATTGAGTCCAGCTAGGGCAGA
-AGAAATTTCCTCTGGACTCCCAATTATGCTGCAGGAAAAGAGAGAATTGGGGCACACTGA
-AATTCTAGAATTCCTGCCCTGTCTTCATGGGCCAAGAGTTTACCGATGACATCCTCCATC
-CTCACTGATTTCTAGACACCTAGTGTTAATTTAGAGTCATTGAAAGTGTCCCAGTCCTTG
-CCACTGAGACCTTGGGTTGGGAGAATAAGAAGATGGGCAGATTGTCATTAATTGCACCCA
-GATTAGAGAGAGCTGGGGGATCTTATGGCCTTATCCTGAACCGGCATGTGAACAACAACA
-TCTTGCCTGATTCACAGGCCTGTGGCTTGTTCAGTGGGTAGATTTTGCCTTCTCCAGAAC
-CCTGACTTTGGCAGCTTTTTTTCTTCACTCAGCTTGAAACTGAGGTGAAATCAGCCTTAG
-CTGCCAGATTTTTCTGCTTTATCTAAACCTCATGACCGCttttttttttttttttttgta
-atttaaaGGGTGTTCCCCTGATGCCCATTTGCTTATAAATGCAAAGACTCTCTGATAGTG
-TGGACAAGAACCTGGTAACTGTGGTTGTTTCTGGGAAAGGAATCGTAGATAGCACCAGAT
-TTATTTATTTGCAAAGAAGTAAAGCCAATAAAGTTTACCggatgaatagtatggtgggtg
-aattagatctcaataaagctgttaaaaTTTACGAGATAAATAaaagaaggaggaaggaag
-gaaggaaggaaggaaagggaaagaaagaaTCAGGGTGTCCTGGGCCCCAGGAAGATGCCT
-ATCCCCTGTCCCACCCAGTGCAGGGGCCAGGCAATGTGTTTGCCTGGCTCCTAGcccagc
-cccgtatccactctcatttccagcctcagtctagactccaaccctggtttcagtccttcc
-ccagcaggggctattcccagctctagtttcagccctaactccCAGGATACCTccttgccc
-caatcctaatccaagctcctaggtctggctgcaggccctatcccagacaccagcccacgt
-ccagcttccggtcctggctccagccccagtcctagccctggctctggtgcctgccctagg
-tcctaaacttgactccagccccagcccctgtcctagtcTGGTGCCAGGTGCCACACCCAC
-CTGTTTTGGCCCTGAAGCTGCTGGAGCTTCTGCCTCTGTAGCAGCAGCTGGTTCTCCAGC
-TTGTTGGTGGACAGAAAGGTCTCTGGCATCTGGGCATCCATTCTTGATGTCTGGTTCAGG
-AGCTGCCCCAGCAAGCAGAAGCAGGTAGGGGGCTGCGTAAGCGCTACAGGAGCCCTGCCC
-AACCACCCACCTGCCCACAGGCCCTGCCACTCCAGAAACTTACCCATTTCCACTCTCCCA
-GTCGTAGTTCCTGTGGTTACTCACTCACAGGCCCTGACTTAAGCTTATTacctgcttcct
-aaatttgcctttctccatcactgcaatggcagctccattctccctgatgcttaggcccca
-ggagctgtcaaccctgtcccccacatccaactcatctgcaggtcctgtcagccttgcctt
-ccaggtggcccctgaccacctctctcctgctctgtggccctcactctggccctggactgc
-tccctcattgcttgcaatctattctctactcagtagcctggggctgcctcttaaaacatg
-tttgctctgttcaaaagcttcctgtggctcccatctcatgtagcggaaatgccccagttc
-tcaccatggcctgcaaggccctatggtgtgatctgtccctatcacttctccagctccttg
-cctgccactctcctcctggtcactccagcatagtggtctcctgatgttcttgaacctgcc
-agcacgtccatcctccctccgggcctttgcacatgctgcatcccttgtctggagcactct
-ctgcagtaagcctggctgcagccctaccttctccatggcccttcctggccttgctgtatg
-agcttgcagctctcatccccccccaccactcccaatgcaccccctctcttgctctctctt
-ccatgctattttctccttagcgctgtcactggctaacatatgcagacatgtgttgcttaa
-tgacggaaagatgttgtaagaaagtcgtcatcatgcaatttcgtcattgtgcaaacatca
-tagtgtgtacttacacaaatctagatggtatagccgcctgcatacctaggctatatgaga
-cagcctattgctcctaagctacaaatccatacagcatgtgactgcacccaatactgtagg
-cagttataacacagtgggaagtatttgtgtatgcatatctaaacacagaaaaggtacaat
-aaaaacagcatacgatactcttatgggactgctgttgtctatgtggcaagttgttgactg
-gaacattaagcagtgcataaccatatatgtcacttatcttttcattttcaggggaagctt
-cacaggagtaggaatgtatgcctgctttgtttcctgctgtatactagacaccagtcttct
-caagcagtgcctggcacaCGGGGGATCAAACAAACAAATGGGCACAAACTTGTGTCTATT
-TGTTATTCACTTTTTCATCCACTGACTTCCCTACCCTTCATTTATTCACTAGTTCCTTCC
-CTGCTCTTTGCTGCTCAGATACCTCTTCTCTCCAAGTCCTTGGCCCCAGAGGCCCAGTGA
-Attgtttcttatccatcttcccctggcacattgtaagtcctctgagggcaagggagctgt
-gctactatacccctcattccagtgcccagcacagacccaggcactgaagttacagaggca
-gaaaagccaagcccagcatccaccccccagggctcatagcttggagagagatagttttat
-gacaagttcatcagggaggagggacccggggggctacaggcccagaggaggccttgaccc
-tactcagggtcagagatcaaggtaagatgactggggCTACGAACCAGCCTGGCCAGCCAC
-AGGCCCTCAGTGCCCACTCAGTCACCCTCTGTTACCTGAGCCTCCATGTCGGTCAGCTTG
-CGGATCTGGGCAGTGGTCTGGTTCAGGAGGCTGGTGCCCAGCTCTAGCATGGGGGCCGTC
-TGATTCTGGGCCATTTGCTGCTGGACCTGCTCCAGCTTCGACCTCAAGATCGTCTTGATG
-GCCCTCTCTAGCTGTGGGAGACCATGGGCTGGGGTCACGGGGGAGGGGCGGGGGAAGCCC
-CCTGTCCCTCCCACGTGTCACCATGGGAGGGCACTGAGCAGCCACTTGAGGCCTCCCTGG
-CTCAGAACATGCCGGGccaggtcaggccaccattacgtcttgcctggactatcccagtag
-atttttccctgggagggatttatatgcctgttttgtctgcctctctgcttccatctttgt
-cccctgcacagtccatcccccactaggcagccagagggatcctgctaaacctaagtcaag
-tcacactcctcctttgctcaaaatctttccagggttcctatctcacgcagaggaaaagcc
-atgactgcaggttcctccgtgactgggcctgccaccacactctcattcctctcctattcc
-cctctccctcactcacttcaatcccgatgcaatggctccatgacatccctctaacgaagc
-aagcatgtgcccacagctgttccctcactgttccctctggaatcctcccccAACCCTGAT
-CCGCATCTGCGTGGCACAcctcctcatgctgtttcagctttcttcataccacttatcacc
-acctgactttttaaaatcactatctctctttttatctgtctgttgtctgtttctctctct
-agaatgtcaattccatgaagccagggacttggttttgctcactgccttgtttctatgttt
-agcacaatgcatggtgcacagtgagtgctcataaatgcgcgttcaatgaattgatGAAAA
-AGGGGAAACAGCAAGGGTCAGAGCACAGCGCCCAATCACATGCCCCTTCACCAGCTTCCT
-CAGGGTGAGTCAGCCAGCAGGGAGTGGGAATGCATCTCTCCCTTGTACAAAGAGTTTGCA
-GGTCCAttggccaagctgtgttttctatcttcagatcccctctatctgccaaatggggct
-ggactggccagtctccaagggttctcccagctctgatgttctgggatcccaCATGCAAAT
-GTTCATTTCTTTGACAGGGCTGCTCTCTTTCCCAAGGGCAGGAGAGCTGGTCTGGCATGA
-CACCAGTATGCTGTTGTAAAGGTGAACAGTGTGTTCTCAGGGCTCGGTGCCTGCAGGCAG
-AGAGCCAGCTCCCCTCCACCATTGCCTCTCCATTCGGCACACATGCTGGCCTCTCACCAT
-GCCCCCCACCCCTGTCCCTGGCTCCTTCCCTTGCCCTCTCACTCAGTCTTTCAGAAGCCA
-GCTGGACAGCTCTCAGGGTCCTTGGGAAGATGGGTGCTCCCCAGGAGAGGTGGTGACCTT
-GGCTCGGGCCAGGCTCCAGCCACTTCCTCCTTCATCTCTTCTCCCTTCTTCCATCTTGAC
-TGTTCACTCCCATCCCTTCCTCACCCTGGAGTGTTTCAAAGGGAGCAAGTTCCATTATCA
-CATCCTGGAGCGGGTGCTTGTGGGCGGTAGTAGTACTGGTTAGAGCTgtgtttctccaag
-tgtggttcttccgtcagcatcagctgagctcattaaaaatgtgaatttccaggtcccacc
-gcagacctcctgaaccagaaactcttaatggtgcccagccaactgtggttaacaacaccc
-ctggctgagtcagatgcctgctcaagtgtgagagcccttgATGCAGAGTAGCAGCAGGGA
-CTGAAGACCAGAGAGACCCCCCTCCTTCTTTCCCTGCATCATCAGCCCACCCCCTCCCTG
-CAGCACACAAACATGCGCTAACAGCTTCCATCTAAAAACTAACTCCACAGCCTCTCTGGC
-TGCTTCTCCAGTTTCTCTGATCTCATCAACACAAAACTTCTACAAGTTGTCTCCATTTTC
-TCACCTTCATACCCACCCTCACTTAAAAAACAACAACAACAACATAACGTTAATAATAAA
-ATGATGTTACGTTTCACACATACAAAAAAGCATAGAggccaggtgcggtggctcacacct
-ataatcccagtactttggaaggctaaggagagtggatcatttgagcccaggagtttgaga
-ccagcctgggcaacatggtgaaactccatctctactaaaaatacaaaaattagccagcca
-tggtggcataagcctgtggtcttagctacccaggagactgaggcaggaggatcgctggag
-cctgggaggtggaggttgcggtgagctgagatgcaccactgcactccagcctgggtaaca
-gagtgagaccgtgtctcaaaaaaaaaaaaaaaGTATAGAGAATAAATATAGCCCATAGTG
-CTCATCCTCCTGTATACCTCCAGTCATGTCTCTCCATCCTGGGAGGTCCCTTTGCCTTTT
-GGCgtctcactgttgcccaggctggagtgcagtgatgtgatcacggctcactgcagcctg
-aaactactggcttcaaacaatcctcccacctcccaaatagctgggacgacaggcgagcac
-caccacgcgcagttCCCCCCTTCGCTCTTTAATTCACCTTGTCATAGATAGCCCTCCTTG
-ACACTGCCCTCAAGGGACActccatcttgcttgacatctcaggagcaatcacctggatgg
-ccactccctgttgctggacgacttccccccaatcctggtttcctcctagcccctaaccac
-ccactctctgactcctcctttacagactcctacacggcagggcccccatggcccagtcct
-gggtccttgtctctatgtacattcactctctaggtcaggggtccttaatgaagaagccac
-aggctccatgaacttgagtgagaaaaaaagatcacattttttgtccactaatctgcaatt
-aaaatttggcatttccttcaattatgagcctaggtcacaaaccacagccatactagcagg
-tcctgagagtcattaccaatagaaatcccaaatattttcatatcacaacacactcttacg
-gtatcttaaaacattgtttttactcaccgggactttggaattatagacatcacacccacc
-actggataatgctatgcctgatcacagattttatttttcatattttgcttatgatttcca
-tattactgagtgttcttatgctttgattttatgcatttctgagaaaggattattaagctt
-caccaggaccagatgccaagaggTCTGAGGATCCAAATGCATCAGGGCCCTGCCCCAGGG
-GCTGAGATCGGTCTTTGGACTTCCACATCCctctgtgctaatggagccatcaccatctcc
-cacccagacttctcccctgcatgtccccaactcgccatctctgcatggtttccaatgagc
-atctcaagcccagtgtgaaactcttcattcctcagctcccatcgcccctgtccctgtaac
-tcccaccccatgcttcgaaatctttcccatctcaggaaatggctccacccagttctgaag
-ccccaaacccagacctcaatcttaacttctctttttcttagcggccacactcaacccact
-agtaagtactgcccactgtgatcccaatttggatttcaaatctgtttactcgccttattc
-tgggccaggctgccctcctctcCATGGGTCTGCCTTTTGTGCCTTCCTGTCTTTAACCCC
-TCTGTCAGCTCCCAGGAGATTCTTTTTTTTTTTtgcagttgcaagatttaatagcatgaa
-atagagtgaaaacagagctcccatacaaagggaggggacccaaagggggttgctgttgct
-ggctcgaatgcctgggtttatatgccaatccttgtctctcccactgtgctctcaggcaat
-agatgattggctatttctttacctcccatttttgcctaattagcattttagtgagctctc
-tgattggttgggtgtgagctaagttgcaagccccgtgtttaaaggtggatgcggtcacct
-tcccagctaggcttagggattctaagttggcctaggaaatccagctagccctgtctctca
-GTccccctctcaacaggaaaacccaagtgctgttggggaggtcagctgatgaccgcacta
-actgcttcctgctgaattagggagtagtaggggtggtgcagttgagatttcctcgggagg
-ggtgccttcgatgtcattaacatcagagcatgggctagcaggctggtccgggggtccgtg
-gtaaatcttagtcatggactgcatgtgagctccCAGGAGATTCTAATGTGTGGCTGGCTG
-GGCCCACCAGCATGGATGAGGACAAATATAGCTGTATCGAGTTTGGTCTCAGACTTTTTC
-ATGCATCATTGACCTCCTAGAACCTAAATTAAAAAGCAGACATCCAGGTACTGAGCACCT
-GCTCCAAGTAGTCAAACAGCATATTCATGCCTGAGGTGAGACTTTCCCAGGcatcttccc
-caagcttctcatttgcctgaacatagacaaactgaggcccagaagtcttgcccaaggtca
-ccatctggcaggCTAGGCTCTAAGACTCCTTGCCTGAGGGCTGCAGAGCTGAGCTGGTGA
-TTCAGGGCAGCTCAGGGTCCCCTCAAGTGACTGGAGCTCCCCAAGCACCTCACTGGTCCC
-CCACTTGTCCTGTGGTTGCAAGTGGCTGGGCAGGGCAAAGGTTACCCACAGCTGGATCCC
-ATCACCCAGTTTGCCACACCCGCCCACCAGCACAGGCCCTGGGATGGATAATCTGGGCCA
-GATGGGCTCAGTTAGGCTGGGCTGGGCTCTGGAGACTAATATTGGCCTGGGTGGTGGGAG
-CTAGGTCTGGCCCATGGCTGAGGCACCAGCTGGAAGGGCAGGGAATGGATCCCAGTGGAG
-GAACTCACCCAGCGTGGGATCTACTTCTCTTGTTTTTTTGGATCTACTTCTCTCTATGCC
-GTGCACCGACTCCAGGATTAGACCTGCCCCTTCTCCATCACTCTCAGGCTGCCGAATTCT
-CAGGCCTATGATGGGGTACAAAGGCCTGACCTTTTGTCACCCTTCCAGCTGGCAAAGAGA
-CTGAGTTTTGGTCCCTGGTCTACTGCCCCATCCCCTTGGCcctgggtttgagttctggct
-ctgccacactttcattgtgggcccttggagactactgtgtttctctgagccccactttac
-agatctgggtcatgggTCAGCACACCCTGCTCCTTGCTGGGGAGAGGGCATTTGCAAAGG
-GTCTTGAAGGAAAAGAAAGAAATTTTCACAGGCAGGGGCTGGGGGAGAGGGGGTGATTCA
-GACAAATAACAGGTGCAGATCCGTGGATGAGCAGCCTCCGTGGCCGAGGAGATCTGCTCA
-AGCCTGCTTCTCTCCTGCATTATTTATATAaaatggacatcaattggtgaatggagaaac
-tgcagtccatccatgcagtggactccattgagcaataaaaaggaaagaaccattgatgtg
-tgcaaacacacagatgaacttcagatggatcatgagtgaaaaatatgcaactccaatggt
-tccatactgtaggagtctatttgtatgactctctaaaaatgtcagaatctgtgattgcca
-gggcctgggtccggggagggggtggggattgattgttaaaggacacaggggagctttttg
-ggatattggcaatgttctatgtcatgattttgctggtggttacataactgtatatgtctg
-tcaaaactcatggaactatatgtgaaaagggtagattttgctgtacgtgggtcatacctc
-agtaaaaaaCAACGCCCCCAACACAAGGTTCTATAAAATGCCGCAGATATACATATGTAA
-CATTAAATAGATCTCCTCCAGTGAACCCCCTCACCCTCTCTGAGTTTCATTCATGTGttc
-attcaggaattatttcttgagcacctactatgtgctcatcctgtattaggtattagataa
-tcagaaatgagcaaaattcgtaaagtttctgattccagggcacttctactaaatatatca
-gttgcattgaaatcttgatgaatgctatgaagaaaataagacagggtaatatgtggggtt
-ggaggcaagtttagccagtatgatggagaaagccccaccagagagggccatctgggctga
-gaggctgagaagaagcaaggtctgggagagtcaggagggagggaattccaggcagaggaa
-aaggcaagtgcagaggccttgaagtgggagcgtgtctggtatttgaggatcaaaatgaag
-ATGGTAACAATGATATGCCCTGCAGCTATCTCTCTTCCATGGAAAATGGTGCATGAGGTT
-CCTGTTTGGGAAATGCATCTTGTCAACTGCAGATAAAAATCAATgcagagagagtagtgc
-tttgtatggatgaagctgtgtgtgaatcacagctcttagcttactggctgtgtgacctta
-ggctggggcctctactggtgtctgagccttttctctaaaatgaagataatcatagctcct
-tcccctgggttgtagggagcattcctgagataaCTCTGGTTGTAGTTACATAATGAACGC
-ATGATAAATTCTGGTATGTCTGGGCCATATCTTACTATGtgtcaggactctgagcccaag
-cctgcgcgtatacatccagatggcctgatgcaactggagaaccacaaaagaagtgaaaat
-ggctggttcctgccttaacggatgacattaccttgtgacattccttctcctggacaataa
-gtctccgtagctccccaccaagcaccttgtgacccctgcccctgcccgccagagaacaac
-cccctttaactgtaattttccactacctacccaaatcctataaaactgcccaccccatct
-cctttttcagactcagtccacctgcacccaggtgattaaaaagctttattgctcacacaa
-agcctgtttggttcacatggacgtgcatgatatttggtgctgaagacccgggacaggagg
-actccttcaggagaccggtcccctgtccttgccctcattccatgaggagatccacctatg
-acctccgatcctcagatcaaacagcccaaggaacatctcaccaatttcaaattgagtaaa
-cggtcttttcactctcttcttcagcctctctcactacccttcaatctccctgtccttcca
-attcgggttcctttttctctctagtagagacaaaggagacacattttatccatggaccca
-aaactgcagcaccggtcatggactcaggaagacagtcttcccttggtgtttaatcactgc
-agggatgcctgccctgatcattcacccacattccattggtgtctgatcaccggggggaca
-cctgccttggtcattcacccACATTCCCTTGGTGGCATGTCAATTGCAGGGACACCTGCT
-TTGGCTGCTCACCCATATTACAGCCCAGGGCTGCTCACCGcccgcttctccgtgtctcta
-gctttctctttaaacttacctcttcactgtggtcaaccttccaccctgcattcccccttc
-ttctcccttagcctgtgttctcaagaacttaaaacctcttcaactcacacctgaactaaa
-acctaaatgccttattttcttctgcaatactgctaggccccagtacaaactcgacaattg
-ttctaaatggccagaaaacagcacttttgatttctccatcttacaagacctggatgattt
-tttgtcaaaaaatgggcaaatggtctgaggtgcctgatgtccaggcattctttcacacat
-tggtccctccctagtctctgctcccaaagcgactcatcccaaatctttttttttctctcc
-tgtctgtttccttccatctccaccccaagctctgagtcctttgaatccttcttttctacg
-gactcatctgacctctcccctcctccctgacgctgctcctcgccaggctgagccaggtcc
-caattcttcctcagcatctgctcccctaccctataatccttctatcacctcccctgctca
-cacccagtctggcttacagtttcgttctgcaactagccctcctcacctgcccaaaaattt
-cctcttaaaaaggtggcttgagctgaaggcacagtcaaggttaatgctcctttttcttta
-tctgacctctcccagatcagttagcatttaggctctttttcatcaaatataaaaacccag
-ccccgttcatggcccacttagcagctaccattagatgcttcacagccctagacccagagg
-ggccagaaggccaccttatccttaatatgtattttattacccaatctgctcccaacatta
-gaaaaagctccaaaaatgagattccggccctcaaaccccacaacaggacttaatgaacct
-tgccttcaaggtgtacaataatagagaagaggcagccaagtggcaacatatttctgagtt
-gcaattactcgcctctgctgtaagagaaaccccagccacatccagcacacaagaacttca
-aaacgcctaagccgcagcagacagttgttcctccaggacctcctcccacaggatcttgct
-tcaagtgctggaaatctggccactgggccaagaaatgtccacagcctgggattcctccta
-agccgtgtcccatctttgcgggaccccactggaaatccaactgtcccactcgcccaccaa
-ccacacccagagcccctggaaatctggcccaaggctgtctgactgactccttcccagatc
-ttctcttcttagctgctgaagactgacactgcctgattgcctcagaagcctcctggacca
-tcacagatgctttaggtaactcttacagtggagggtaagtctgtcccctttttaatcaat
-acagaggctacccactccacattacctacttttcaagggcctgtttcccttgcctccata
-actgttgcgggtattgacggccaggctgctagactccttaaaactccccagctttggtgc
-caactgggacaaaattttttttttttttgagatggagtctctctctattgcccaggctgg
-agtgcagtggcgcgatctcggctcactgcaagctccatctcccaggttcatgccattctc
-ctgcctcagcctcccgagtagctgggactacaggtgcctgccaccacgcctagctaattt
-ttttgtattttttttttagtagagacggggtttcaccgtgttagccaggatattctcgat
-ttcctgacctcgtgatttgcccgcctcggcctcccaaagtgctgggattacaggcatgaa
-ccaccgcccccggcctgggacaacattcttttatgcactcttttttaattatccccacct
-gcccagtacccttattaggccaagacattttaacccggacaagtcttacaggctggtcca
-agatcttcgccttatcaaccaaattgtcttgcctatccaccctgtggtgccaaacccata
-tactctcctatcctcaatacgcccctccacaacccattaatctgttctggatctcaaaga
-tgctttctttactattcctttgcatccttcatcccagcctctcttcggtttcacttggac
-tgaccctgacacccatcagcctcagcaacttacctgggctgtactgccacaaggcttcag
-ggacagcccctattacttcagtcaagccctttctcatgatttactttctttccatcactc
-ccacctactctcccactgaaacttccacctatcaatctcttcccacacaaggcaaatggt
-tcttggactaaggaaaattcctccttccagcctcacaggcccattccattctatcgtcct
-ttcataacctcttctatgtgggttacaagccaccagcccacctcttaaaacctctcattt
-cctttaagacatttaccttgtatttcactccatccttggctaccttccccttgctcttca
-gactctcctcccaggccctcttcttgtttgcttatacccagccctgtaaataacagtgaa
-tggttgcttgtagatactcgacgttttttcatgcaccatgaaaattgaacctcctcctct
-aggaagttaccccatcagtctccattacaacctctgacggctgccaccctagctggatcc
-ctaggagtctgggtacaagaaacctttagtactccttctcatctttttactttgcatttc
-cagttttgcctcgcacaaggtctcttcttcctctgtggatcctctacctacatgtgtcta
-cctgctaattggacaggcacatgcacacaagttttccttactcccaaaattcaatttgca
-aatgagaccgaagagttccctgttcccctcatgacaccaacaGTTCACTACTATTTTGTT
-TTGTTTTTCTTATTATTAATATAAAAAGACAGGAATaggccttgacttactcactgctga
-aaaaggaggactctgaatatttccaaatgaagaaggttgttttcacctaaatcaatctgg
-cctggtatatgacaacataaaaaaactcaaggacagagcccaaaaacttgccagtcaagc
-aaataattacactgaacccccttggacactctctaattggatgtcctaggtcctctcaat
-tcttggtcctttaatacctgtttttctccttctcttattcggaccttgtgacttccattt
-agtttctcaattcacacaaaactgcatccaggccatcaccaatcattctatacgacaaat
-gctccttctaacaaccccacaatgtcaccctttaccccaaaatctttcttcagtttactc
-tctcccactctaggttccgacattgctcctaatcctgctcgaagaagccctgagaaacat
-cacccattatctctccataccacctccaaaaattttcgccaccccaacacttcacctcta
-ttttgttttgtcccaacacttcaccactattttgttttgtttttcttattaatataagaa
-gacaggaatgtcaggcctctgagcccaagcctgcacgtgtacatccagatggcctgatgc
-aactggagaaccacaaaagaagtgaaaatggctggttcctgccttaactgatgacattac
-cttgtgacattccttctcctggacaatgagtctcagaagctcccccactgagcaccttgt
-gacccctgcccctgcccacaagagaacaaccccctttaacgtaattttccattacctacc
-caaatcctataaaactgccccaccccatctccctttgctgactcctttttcggactcagt
-ccacctgcactcaggtgattaaaaagctttattgctcacacaaagcctgtttggtggtct
-cttcacacggacgcacgtgacaCTATGTAGCTGTTAAAAACAATGAGGTTGATggctggg
-catggtggctcacacctgtaatcccatgactttgggaggccaaggtgggtggatcgctta
-agctcaggatttggagaccagcctgggtaacatggtgaaaccttgtgtctactaaaatca
-gaacaaaattagctgaaggtggtggtgcatgcctctagtctcagctacttgcggggctga
-ggcaggaggatggctttagcctaggaggtggttgcagtgagctctgatcatgccactgct
-ctccagcctgggcgacagagcaaaaccctatcttaaaacaaaacaaacaaacaagcaaga
-aTGAGGTTGAGCTACATCAGATGCTGATCTGAAAAGATGTCCCTGTCATGCTTATGAGTA
-AAAAAAGAAACCAAGAGGCAGAACACTATATACAATGTGGATCCATTTGTGTGTAAGAAT
-GATCCAAATGATGTATTTTTATACAAAAACCGAGAAGATCAAACTATTAACAGTAGCGAT
-TTGCTTCAGGGGAGGGGGTTTCAATAGGGTGATGGTGATGGCGTTTTCTTTTTACATTAC
-CTATATTGAAATTGTTTGGATTTTAAAAGTAGAATGAGAGTGTATACAGGTATAATTAAT
-AGAATATTTAACAACTAGTATATAAACACTAGGAGTCCCTAACTGATGTCCTGGACCCcc
-agggatctgtgaatagaattcaaggaacctgtaaacttgcattaaaaaaaaaaggacatg
-cttttcccactagtctctaactgatattaacttttcctgtggtagtgagtatatgccaca
-ggctattacagtggtgatagcagggcctgcagctttgtcactagtagaaaccgcagatac
-tctaatatctcattgcagtgattgcggatatctacgacacattgtgtatactcacctcag
-cctcaaaattatggaaggtacttgacccaccactcagtcttgttattttgtgcattaata
-cagaaataatataggactatatcagaaacctgttttctgttatgttgacatttgcatctc
-aaggcaatttgtttcctttataaatctatgcatttaattttacatttcaaaaaaaaattt
-ttttttctgagagagggtcaccggatgccaaaggaccccaaggtacaggaaaggttaaga
-cccctgAAGGCCTGTCCCACACAAGGTTCCTCACTGGTGTccccagtaggctaccaactc
-tgagagtgcaaggactttgcctgccttCTGGGGCCTGGAAGACTGTCTGGATATTTgtag
-gctctgctgttgaccccaattatagatgggcaaatggaggttcaggctcagagtcacttc
-cctgaggtcacccatcaagttgcagatgctagattcctcctcatgtctactgatttggaa
-ggctgGGAGGTCAGGTCTTGTGGGTGTAAGAGGGTCAAGGCGGGGGCTGGGCGGGTGAAA
-GTGGTGCTTCCCTCACCCAGGGTACGACCCAGGCTTTAGCCTTGCAGCCAGTGAGCCCAG
-AGGATGGGGTGAACCCTGCTGCTGGCTTCTGCCTGTTGACCCAGTTCCTGGGTCTCTGCC
-CAGACTTGTTCCAGAACCAGACCCAAAGCACCAAGGTTTCTGTGAATGGGGGTGGCAtta
-aggaaacttacccttctagttggtcagacccagcctctcagagctgccctgctttccttt
-gtctctctcacatcctgcatccaatctgttgtctctaccctcgggcgcatgcagaatctg
-accacttctgcccaaccttgccacttccaccccagtcccagcccccattgtctctagcag
-ggatcaaagcttccttgatactgtcagcatctgtcattgctccctgggcccccaggctat
-gctccacacatagccagtgacgtcctggtcaacctgtcagattatgaccccctctgctct
-aaaccctgccttgggtcccgtgtggcttagagaggaccaggactccttgcagATTCCTTT
-AGTGAAGAACAAAATTCTTTGCTTTGGAAACAGGTAAAACAGTCCCCAGTGAACAGAGTC
-CAAACCAGGCTGTACTGGGATGGTGTGGGAATTGGGATGAAGCCTGTTCTAGGTCCTAGG
-CTGAACCAAAGCCCCATGGCTGGGGTGGTGCAGGGTGTGGAGATTTGAGCCCGGCCTGAC
-GGTAAAAGGAAACGGGCTTTAGCAGGGATGCCCCAGGGGTAGGAGCCCAGGCAGGGAGAC
-ATCTGGGGAGCAAAGACTTAGTGAGGGGGAGACCTAAATGATGCTCTCagggacctctca
-gctcccatcccctccatttcacagatgggaaaactgaggtcccaatcaggaaaataaagt
-gccagaggctgtacacaggagctaatggccagatctggTGCAGACGTATGAAAATCTGGA
-GGGTCAGATCTTACCTAGCTGTGTGTGTGTGTTTCAACTTAAATGTAAATCTTTGTAATT
-TTATTTTTCGAATGGGTGATATAAACACATTGTTCAAAATTCCAAGGAACAAAAAGGAGT
-GAAGTGAAAAACAAATTTTTCTGTCCCTGCCTCAACCCACAGTTCCCTCCCTACAGGCCA
-CTGAGGGAGGTTCCTGGGTTTCCTTCCAGAGAAACGCTATGCATACTTCTACATCTGCAG
-TAACTGTGTTTCCATCCCACCACCTGCCCTTCAGGCTACAAAAACCTCAGCTTGccattc
-cacacctggcttccttttgcttaacattgttcatagcatgttccacattcatccaggtag
-acttgcctcagcattgtaagctgcttgaaattccatctatgggcctccattgtttgctca
-tctagtcccctctagctgggcctgtaggatgtttccaggctttaacatcaaaaacagggc
-tgctacaaatatccttgtacacctgtcacttaacattcccacaagtctatgtggggaata
-aatcctctgaagtagaattgcttcaaagtagagtgaaatcacacgtttttttggtccttt
-gttttttgaggcagagtcttgctttatcacccaggctggagtgcaatggtgtgatcatgg
-ctcactgcagccttgaattcccaggctcaagcgatcttcccacctcagcctcccaagtat
-ctgggactataggcatgtgccaccaggcccagccaatttttcagtatttttttgtagaga
-ccagggtcttgctttgttgcctcaggctggtctcaaactcctgagctcgagtgatcctcc
-cacctcacctcagcctcccaaaacagttgtgattttgactatcgttaacaaactgccctt
-ggcagaggttatgccTAGTGGTTTCTGCCCCTTTGGAGGAGAGGCCCTAGGGTCTGCAGA
-GGTGGCCACAGGAGCCACAGAGTTGCTTATTGCACCCCCTCCCAATACGCATCCACACCT
-CCCAATCTCAGTAGCACCAAAGCATCTCCCACCAGCTtccttctgacttctaggtctccc
-tgaaaatgtcacctcctctgagaagcattccctgaccacccccactctactccacctgtt
-tatcacagtgtgcactctggcttctacacagtacttcatgccatctgaaatcactttagt
-catttgtcatttgtccaattcccccacgagaagagccccaggagtgcagaggtttgtctg
-ccctgttcatgagcacatcctctatgcctagaatagggctaggcatatgagaggtcctcg
-ataaatatttgtggaaagagcagatGGGTCAGTTTTGTGTAAGGGGCACGAGATTTCCAC
-TGAATAGTTGTTTGGCAGCTAGAAGCAAGTTAGGAGCCTCGAGCCCAGGCCCAGCCACTG
-CTGGAGCCTGTGAGAGGCAAAGGCAGTGGAGACCACAGAGACCAGAGAACAGAGAGCTAA
-CTGGTGCCAGGGCAGAAAGAAAGGGGAAGAAACACCAGCACAGAGATGGGAGGGGCAGGA
-AGGAGGGTTCCCAGGAGGGAGGCCCATGGCAAGGGAGGGAGTCAGCTTGGGGTATCTGCA
-GGAGGAATGTTCTAGAAATGAACAAGACATAGTCTTGGTGCTCATttccttcctccaacc
-aactcattcagatgtgccgagacctgggcatggtgctggggatagagcagctaccagaac
-aggccaggctctgcactGCTGCTGCGGTCTCCCAAGGAAGATATCTAAAGGGCtactctg
-tcccaggcatgaccccaaggccctacaaatacagctcatttagtccttggtgctcccatt
-gtcaccattttacagatgaggaaaggaaggcattgagaagatgagcatcttgcctaagtg
-gcaaagactggatttaaatataggcctttggtctccagagaccacacccttagccactCG
-GTGGGCTGCTtgtggcagctagccttcaggatgaccccagggatcctggtgctcatgccc
-ttgtgtagtcccctctctcaacaagtcaggactggctggcatgactaattagatattgta
-gaaacgttagtgtgacttccttggctaaaccattgcattgtgtcttctgtcttgccctct
-cttggaccacacgctttagaggaagtaggccactatggcctgaggacccttaagcagccc
-ttgggaggaagccatctggaggggaactgaggccttctactcacagccagcgccagctca
-ccagccacaggaggccgagccccagcccaggtcaagccttcagatgagtgcagccctagc
-tgatacctgagtgcaaccacatgaaaaaaaccccaagtcggaactaccttgttaagttgc
-ttcagaattcctgaccctcagaaactatgaaagataagaaatgtttgttgttattttaag
-ctgctaaatgttttagggtaatttgttatgccacaatagataactaatataCTGCTTTTC
-CAGAGCTTATAGAGGTTTAACCCTCTTGCTTCTCTTCTCTGCCATCCCCAGGCCTCAGTT
-TCCTCATTTTGACAATGGGCTGACTTGTGATTTATGAGGGTTGGCCCCTCCTCCTCTGCC
-TTGCTTCTGTCCCCTGGGCCTGCACCAGGCCCTCACCCTGTGGCTCAATGCAGACTGAAA
-TGGTTTGTCTTGTCCTGTCTGAGCAGCTGGGCCCAAGCCTTCCTCATTGTTTTCCTCTCT
-GCAAGACATACTATTGCTTTTCTTCTGGGTCAGGCTCTGGGCAAGCACAGCCAGTGGGCT
-GAGAGCCAGGGGTAGAGAGACTTGGGGACCAACGGGCTCTCACGGAGGGATGAGCTTCTC
-AACCCTAGCTCAACCCTCAATTCTTTGACACAGGCCCAGCGTCTCCAAACATCcagtgtg
-gtctgggcctggagcactgcactgagagtcagcaagcttgctcaatagctttgccatttc
-ctttctctgccagtgatgagtttctctgaacctcagtggcctcattgtttcctccttgca
-gagcgcctggaaggaatagggaaatggccactgggacctgtgttctgtggatctgggcta
-ggattcttgtctgtctggttcatgaggcctagcacagtgcctggcacacagtagtgcctc
-ccatatttgtggaatATTTGGGACTTCCCTGGCTCCTGAGCCTCACCTTTCATGGGGTGG
-CAGGTCCAGTGTTCATCCCAGGTGAAAGGCCACAAGGAGAAGATGAGGAGTGTGGCGGAA
-AGGGCTGCAGAGGGAGGGGAGCAGGGCCTGCCTCTGCCATCTGGACTTGGGAGGGGCTGC
-CAGGGTCCCTGCCTCCTCAGGCTCAGGTATGCCTTTGGTGGTCGTCTATATTTCAACCTT
-GATCTTGGGAGGTGTTTGCGATCGCTCACCTCCCTGACACTTGAAAGTCACAGAATGGAG
-AGGTGTGTCCATTTTGCTTGGcaacatgcttattgaacagttattatgtggtcagcactg
-ttctaaccactaggtatatgaagtccttgcagccaccctccaaggtaggacctgttatcg
-acctattttacagacgaggcacagagaggttaaacaacttgtccaaggacaggtagctct
-tcacaggtgtaaccaggCGGTGCTTCTGCAAGGCCTCTTGGCTAGAGTGATCATGTGACA
-GCGCCCCTGCCCACCCCCCAACCTCACCTCAACTTTGGGAAAATAGGGCAAAGTATGTTC
-TAGACACAGGGAGGCTTTGCTGGGGTATCTCCCCACGTGGCACCAGGCCTTTCTGCCTGT
-ACGACTCCAGTGTGTACCTCttctcttattggatccccagcagcctggaggaaaagggtg
-attgttccccacacaaatgagtaaactaaggcccacaaaggccgagcattactcacagct
-ggtaaaggaagaTTTTTAACTTAATGGCTGAGCTCTTTCTATGTGCCTGTCTTGCCTTCT
-TGGTGGCTGAGGCTGATCCTGCAGATGGGGTGACAGGGATAAGATTAGGGTCAGACAAAG
-ATGGTGGAAGCTGGCTCAGAGGTCCACAGTCTATCAGAGAATGATCCTCAGTGAGGACAG
-GACAGAAAAGTGGCCACATCTCTTCCCAGTCTCCATGGTCCTCCACGGAGAACAGGGTCA
-GGACCAGGGACATCTGtctggctcctggtgagcactccagtctcatcttggccatgctct
-cctcgctctctgcactgtagacacactgaatgccttttgcttttggcccattctaccccc
-agggcctttgcacttgctgtcccgtgtgcctggaatgcttttgcttcctttccctgtctc
-gccactgccaacccagcctttagatctcagctctgtccttcttcctagtgcctccctccc
-tcaaggtcaggcacccattatccacccctagcatctctcggtccctccttcatggcacat
-atcatgattgatcgttgcacatgggaaatcactaggttagttacacccactgctccaggg
-gcaagggggaaggatggtcttccttgctcactactaaatccttgtcacttgcatggcgcc
-tggcgcattgtaagccctcaataaacagtggtggaagggacaaTTAAATGAATGCAGGAA
-TGAATATTCTTACCTGACAAACTAAGTTCAGAGTTGTGTATACACATTTGTGTTTGTGTG
-TGGTGGGGGGCAGGAGTCGGGGGTTGCACATCTACACATAGTCCCAGAATTGAAAGGATG
-CATGATTTTTTCATGACATTTATGGCATGCTATGTATCTTGTTGCCTCTGGAGAGGAGAA
-ACAGGGGTCTCAGctgggtgtcaggaaccctgggttctgggccaactcctgccaccgacc
-cttgggtgaatgtgattgagtcactcccttgcccaggcttagtgttcccatctgtaaaTG
-GTGGGCACAGAGAGGTGGTCTgtgtagtggttaagactgtgggttctggagccagtctgc
-ccgggtacgaactcacctccctcacttcttagctgtgtaaactccctgggcctccgtttc
-cccgcaataaatggggatcataacagtccccaccttttaggatgccacgaggtttatgag
-tcaatgtttataagacacatataaagtgcctggcccagagaaagTCCCATATGTGAATTC
-ACCCCAGCAAAGCACTTATCCCAGAAGACAGAGGAaacaatagtagcatctcctggttct
-ctgtgctggagcagtgccaggcacatcccctgaccagccatttgagcctcacagcaaacc
-caggcgatgtgtgtatcatcacctcaattttatagattgaaaaactgaagctcaggtctt
-tctcatagttacacagctaataaTCTCACAGATGTAAAGTTGAGGGAACAAAAGGAAACT
-ATAGTAAGATATGGATGGTACGACAGGATTCCTTCCTTGCACCGTGAATCCTGGAGTCTT
-Gacgtttactgagcacttactctctgccaggccctgtactgagccccacatgtgcattgc
-ctcatttaatctcctcaataacctgcaaagtagcttctgttagtgtcctcacttcacaga
-taaggaaaccgagtcacagagtggaaaagcaatggtctgagaaggcacagccagtaagca
-gtggagctgggattcagactgagtcaactgggactcagggcctacactcGGCTTCTGTGG
-GATTTGCCCCCAGGCCCTGGGCCAAGAATGGGGTGTGTAATTGTGGGGACACCCAGACTG
-AGCTTCTGGAGCCCCTTAGCTTTTCAGAACGGCCACAGCTGCCTGAGGCCCTACCTGAAT
-CATCCCTGGCAGAAAAGCCCTAGGGAGCCTTGGGCCAAGGGTTCCTGGGGGAAGAAAAAT
-CTAGTAGCTATGGATCTCCCCTTTGGGGACCAGGGTCCTCTATATTTTCCAGGTCCCAGC
-TAATGCCCAGGGACCCATCCACCATGGACATGGCTTATTTATTGGACAGAAAACTGGCTT
-AAGTTCtgagataataggttccggcatcagatggctgaatctgactttgcccttcttggc
-tgtaagatcttgggcaagtcacctaatctcttggtgcctcagtttcctcatctgttagtg
-gacaagcaatcttacttcactgggtcatggtgagaattaaatgccgtaacataaagcacc
-taggacagtgtgtggcatacagtaaatgctcactaaatgagtgcttactcattACGTCAT
-AACTGCTTtttcatcctccactcattctgggaggcacgagtattttgagttccactttag
-agaggagccaattgatatatgtggcttccccgggttcccatagctttgagtggtacccct
-gggacttgacctcctgaccccaaCTTGGTCCTCCCCAGACCCCACAGCCAACTCTCAGGG
-TTCATTCCTGACATTTCAGAGCTGGCTCTGAGGTTATGCAAACAAACTGCGGCCAGAGTC
-TGACTGGAGGTGCAGGCTTAGGGGGCAGACCTGGGGCCCGTTTTCTAACATTTCCTGCCC
-AAGGAGAAGGAGAAGAAGGTCTGTGTACATCCCAGCCTGGCTGAGCTCTAAGGCCAGGGA
-GGAGAGAACTAGAAACATGTGGCCCTGCCCTCTGTGGGATGGCTGGCCAAGCCAGTTGAA
-CAAATAAACCCGTCCTTTTGGGGGAAGTCGTCAGGGGGTCTGCTGCTGCTGGTGCCTGCC
-CTGCACCCCCACCTCATCCCAGGCATGAGCCAGCTGGTCATCCCCAGGCCGAGGGTATCT
-GTGCCAGCTGTTTCCAGGCCCCCTTCTTGGAAAAATCATCCCATTCCTCTAAGAAGCAGA
-TGCTGTTTCCCCCATCCCCCAGTCCCAAACTGCTTAGAAAGGAGCCAGCAGTGAGGTTAG
-GAAATCAAACCCCAAGATATTTTGTTCGGCACCGAGACTCATTTCTTGTTTGGATAACTG
-AAGGCTGAAAATGCCAAGAATTTGTGGGCAGCCTGGGAAGGCTGGGGCAACTGGAACCCT
-GACTCCCAAACCAGGTCAGTTTGGGAGGGTCTCAGGCTGGGCAAGGACCCCACCCTGGGT
-TCCTCCTTGGTGCTCTCTTGACCCACACCCAGTTAGGCAGGGCCTCACAACTGCCAGGCC
-GAGGGGCCCAGTTATTCTGAGGTTTGATGTCAGAGACCTGGAGCAAACAGCAGAGGCTGG
-GGCAGTGCCAGGTTGGGAGGCCCCTGCCCAGCCCCTGACCCCTCTCTGCTTGGCTTTGGG
-TGCAGAGGAGGAAGAGAAAGAGGCCTCGGCTGAGCAGCCAGCTGCAGGGTGGGCATTGGT
-CATTTGGCAGATGTGCCCTGGGTCTTCAGTGTGGACACTCGGGGAGGTAGAGGTGGGAGG
-GATGGCCTTGGGGTGAGAAAAGGAGGAGCTGAGAAAGAGACAGGAAAAGATGCAGGGAGT
-CACTTTGATAGCCAACCAGGAGAGAGAATCAGAGACAGAGACACCCACAGAGTTAGCAAC
-AGTGAGTCAGGGCCACCGCGAGAGCCCCAGGAGAGATCCACAGAGGCAGAGAGACTCAGA
-AATAGAGACAGgctgaccacagtggctcgtgtccgccgtcccagctacttggaagactga
-ggcgggaggatcgcttgagctcaggagttcaaggctgcagtgagctgtgattgcaccatt
-gcaccccagtgtggttgagagagtcagaccttgtctttaggagagagacagagagaggga
-gagagggacagagagagggagagagagacagagagagggagaaagagacagagacagaca
-gagatagacagggagataggcagagagagGGCTGCCATGGACCCCAGGCCAGCAGCTGCT
-GGCTGCTCCCTAAAGGTGAGAAAGTAGTTCTCACCTGCAGTTTCCAGGTGGGGTCAGCCC
-TGCCTCTGGGAGCTCAGAGACTGGGGAAGATGTGCTGCCCTCAGGTGGTGGGGGTGGGCC
-AGAGAGGCTGGGGCTTGTGTCTGGCCCTGGTTTTcctcattctcctcatctgtataatgg
-atcattctgtggggccatgaagagaaggCAGAGTATGGCACTTCTTGGATGGGACACCTG
-GGGCAACTGGGGGAATGGCAGTCACACACGGGAGCCCttattgagcacctgctgtgtgca
-gaggctttctctgctctgcttctcttgaccccacatcaaaggtcaggggtaggtgctgtc
-attctcctcccagcctccggattaggcactgagAGGGAAGGGCCAGCACTGGGTCCTAGA
-GGGAGGGCATGGTGGACAGAGGAGGTCATGTGACTAGCCACTGAGCTGCCCAGCCCAGCT
-AGAGATGCCTGCACTGCAGCCGGCTCTGTCCCCCAACCTCCTCAATATTCCTGCCTGCAG
-CTTCTCATCCATATGAGCGGGGTGGAGCAGAGCCCAGAGCTGACGTGCAGCCCCAGGAGC
-TGGCTCCAGATGGGAGTTACTGGGGCAGGGGCTTTCCaggagcgaggaggaggagagaga
-gggaggcagaaggagggggagagcagggagaagaaagggaaggggagtgcaggggaggag
-gagagtatgaaagaggagagagagagaagaggtgaggCCGGGGCTCTCCCCATGCCTGAT
-GAGCACTGGCAGTAGGACACAGCAAGCTGTATGCTAGGAAAGAGTGCGTATCTGGGGACT
-TGGAAACTCTGCAGTAGAAGGGAGCACCAAGAGCATCCCATCCTCTCTAGATCTTGCTTC
-CCTTGCCTCCTTGACACCTTCCAgagtcaggaaaaagtacctgcagtttgtagtgagaat
-ccagattggctttcactgctacatggctctggcaagtcactttccctctctggcctgttt
-cctcacctgtacactgggggaacaggaGGGGAGTTGGGGGCACAGGCTGAGCAGATGATG
-GCTTCTGGGATTCGCGACAGGAAGGATCTCCCCTGTGTCTGTCTAGATGAACAGAATCTT
-GCTGAGAGCTTGTTCATCCCTAATGGCAatggtgatgatggtgatgatgatgctgatggt
-gCCATTAGATGAGTATTTTAAAACTCTTTTTTTAACTTTTCTGAGATGTTAGAGAAAAAG
-CCAAAAAAAGGCTTTGAGTTTCAGAAGATCTGAGATATGCCTGGACCAAGAGAAGAACCA
-GAGGAAGGTCACAGCCACAGCCACAGAAGGTAGCAAGCACTCCCCACTGGGGACCAGGAG
-TGTCAGAGGGGGCAGAGAGAAATTATTGTTTACATGAACCAAGGGAGACCGAAACCTGCT
-CATCTGTAGCCATTTGGTAAGGAAGTACCTGCAGCCAGGTCAGCTGAACTCCCATATCAG
-AGATCTTAGGCCCTACGGCACTCTACGGTGACCTGACTGACCCTAGCTCAGAATTTTCAG
-GCTAGGTGAATGGATGCCTGGAGAGGACATTCCACCCCAAGCTGAGGCACTGGACCAGGT
-GACCTTCTGATCCTGCAAGCCATCAGTTCAAGCCATCAGCTCTCAGCCAATGTTTCCCAA
-GCATCCGACACCCAGGGGATTCAAAGATGGATGAGAGTGAGAGGTGAGACTTGGGGTAGG
-AGGCCCAGTGGGAGGTGATGACAGCATCCTGGGAAAGATGACGAGGCCTAAGCCAGAAAG
-ATGGACCATGAGAGAAGCCTAGGCCACAGGATGGGCTGGGCCAGCTGCCTGGGGGATAGG
-TGGGAGCCACAGGAAGCCCCCAGGGCACAGCCTGTGGCTGGGTGGTGGTGTCACCCTAAA
-CAGAGACAGACAGGCAGGAGGAGGGTGTTTGGAGAAGAGCAGGGAGTCGTCTCAGGCAGC
-TTTGGAGTTGAGACACCCATGGACCCTCAGGGAGGTGTTGGGGGAGATCCAGGTCATGGG
-TTTTGGGCTCAGGATCCCATCAATGCCAATTTTGTGTCATCACGGAGCAGGATGGAGACC
-TGGGACCTGAGAGATTGGAAGGACATTTATGCATTCATGCattcactcatgctacagaca
-tttattgagtacctactgtgtgttcggcactattctaggccctgggaacccagaagtgag
-caaaagagacatggcgcctgccctctgggagctcacacaccaaaagaaatgtttttaaga
-acattaggtagggataagttctaagaaaaaaaaacacaacaaagccagcagagggacaaa
-gggtggaagaggaaggtggttatttcgtacggggaggacaaggagggcctctggggagat
-ggcgctggagaggataggaggctggggtaagcaaagtgggagtctgggagagggaactcc
-agggagtaagggttcttgcttttattcggatgcatggttagccctgggaggagggagagg
-atgtaacttaggttttgatggggattctttggtctgctgcatggagaacaggaggtgggg
-gccgagtgttagcagggagccaggggggcagccaggacagctatcctgcctggagccaga
-ggtggttGTCAAGCTTGTCTGCTGTTTAATACCTTCTAAAACTCCAGGAATTAGTTCGCA
-TCCTTCATTCCTCAGTCATCGCCCAGACTGTCTCCTGGGTCCCTCTCCCTTTCCTTGGTA
-GCTCTCACTTAGGGACTCTGAAGAGTCCCATCTCAGACCCCCCAGGATGTCTCCTGTACC
-CTCATGCCCCGCCAGGGCCAAGCCTGCTTTGCACACCTCTGTAGTCAGTGCTTCTCCGAG
-GGTACACAATAGGTGCTCACACTGCTGAAAGACGAAAGCATGACAGGGCATTCTACAGCA
-GCCCTGGTcttgggccaaaaccacagtggcatcctcagctccttgcttcctcccactccg
-catccaattcaccagcagagctgatgggctctacctccagaacccaccagaatcttactg
-gccacaccccctcctagccccgttctgctccaggcctccggtaccttgcacctgatggct
-gcagcggccacctctttgggcttcttccttccaccctgcctcctacagtctatgctgttg
-aaatcgaatcacgggtgtctgtctctgctcacaaccttgcagtggctcccatgacactca
-gaacaaaagctgaagtccttccagtggccccccccccagctgcatggcctgccctgctgt
-cacctctcagacctccccgcacccttgctccctctcctctgctccagctacacaggcctt
-cgccccatggttctccaggcacacaccgctgcggatgcattccctcctcacggtcaaaat
-acatgcagctccctttgcagaacgttccctcaaatacctgcctggcccactctatcattt
-cccttgttctctgggttcaaatgtcacctcctctgagaagtactctctaatgatctgacc
-tcaagcagccacccagggccgccacttgccctctttcttcttcattttgcttcaccatct
-gacatagtagattatctcttactgcctctttcccctactagtccagagggagacatacta
-tactgtcgtatccccagcacccaggaaggcttggtccgttcagcccttggtcagggctga
-atggatttctgttggatgaatgaaGGGACGGCAGTTAAAGAGCCAGGTTGCCAGCTGACA
-TTGCCCAATCTTGCTGTGTGGCCTCAGACCCACCCCTGCCCCTCTTTGTGCAGCTCAGAG
-ACAGCCCTCTGTGCTCAGGGAAGGCCTCTTGGATGGACACTCCACCTGCTGATTGTGACA
-GACCCCAAAGCCGCCCTCTGCCCCCTGCAAACCTCCCATGCCCCGTACCTTCTTCAGCCA
-CTGCGTGTTGTTCTGCAGTGCCTGCTCCAGCTGTTTCACCTGCTGGGTGGGCAACTTCCC
-CAGGTGCAGTGGGTTGGCCAGTGATTCTCTCTGGAGGGTGTTGGAGTCCCTGGAGACCTC
-AGGCCCCGGAGGGCAGGGCTCAGACTTGGGCAGCAAGAAGGTGTAGCTACAGTGGCCGTG
-CTGGACTACAAGTGTCTCGCAGCCCCTATCCGCCTCCTGCCTTGTCTGTTGAGCCACAGA
-CATGGTGGCAACCACAAGGAGGAGGCTGCCCTGCAGCATGGCTAGCTGGGAGAGCATCTG
-AAGATGTGTCAATGGCGAGGGATGTCTGCTCAGAGCCCTAGGGGCTGTGCCTGGGATGTC
-CTGCTGCAGCCAACAGTGGCCAGGCTTGCCTGCAGCTGCAGCTACAAACCTCTGTCTGGC
-CGAGCTCTGTCCAGGCAGCTATTTATACTTGCTCTGAATACCACGGCTGCTCTGCTTGCT
-TCCTCTCACCGCCTCCCTCCGGCCCCACCCGACACCCTCTCACCTCTATTCTTCACTCCT
-TCCCTTCCTCCTTCCTCAGTCTTGGTGGCACGTCGCCCTTACCCTAAGCGTGCACCAACC
-TTGCTCTGTCTGCCTCACCTCTGAGCCCTCTGATTATCCAGTGAGGCCTGGCTTCCCTGC
-TGGAGGGGAGGGAAGAAAACAGcacacagacacgcgcacacactcatgcacacactcacg
-agcacacactcacacgcacgctgacacgcacacacattcatgtacacacaAACGCCAAGC
-TCCAATGCTGCCCGCTTTGGAAAACCAAATGCAACTTAACTCTCCCTTCCTGTCTCTGTC
-TTGGTCTCCCTCTTTCCCTCCACCCCCATCCCCTGCCCCCCAAGTCTAAGATCTCAAGTT
-TCAGTCCCGCTGCCATCCCCTTCTCTCCCCGCTGCACCTTCCTCCCTCTGGTTCCATGTT
-AGCGCTTGGAGTACAAGTGACCCCCGGAGAGAGCAGAGGGAGGGGAGGAGGCAGAGGGGT
-GAGGCTGGGGAGGGCCCAGCGAATCCACTTTGCCTCTGGAGACACAGAAAATCCTTCCAA
-GGTGGGGCAAGTGAGCAACCCAGCTGGGAGTTGCTTCCTGTCCTCTCTTCTCCCTCAGGG
-CCAGGGGAAAGTGGTATGCCCCAGGATGGCCCTGGCTTGGTTGCTTGTAACAGTAATGAG
-AAGTTGTCATGTCCTGGGGCAGATTGTCCTGGGGCTGCTGGAGTGGGGATGTGGAGAGGA
-Ggcagtggggagaggaggttggagtgccaggaggctaaccctagatctcgctccccgaca
-gctggccacgagacctagggtgggcagctgtgcctctctgggcctccacaccctgatctg
-taaactgggtaaaccttatctcttgcaggAGGAATGCGTGTGAGTCCTCAGCATGGGGAT
-GGAGAAGTTTTCAGCTTctgggttcaaatcctggctctaccatctaccagctgtatgact
-ttgagtaagtcacttaacctctctgtgccttcatttcctcctgaatgaggaaaataatac
-cacctacttcacatggcatgaaaattaggtgagttagagcaaggttggcacagagcgagc
-actaaataaatattTTCCGTTGTCAATgttatagttgtcattgcacctcccctcccacga
-cccactggagcataaactcctctagggcagggatttgtcCCTGGGGGACATGGTCTCCAG
-GCAGAAGGTGCCCAGGAGTTGGTGGGGCCTTTCCTGCATGGGCTGCCTTTATGTTCTGCC
-AGCTGTTTGGGCTTTTCCTCTCTCCCTGCTTGTTTCCTCAGAGTAGGGGCCAGTCTGGCT
-GTTTAGTATTTTCCTTTTTGTTCTCTCAAATCCCGATAGAGTTTTGAATTGGGGCAGGCT
-GCTTCTGGGCAGCTGTGAACTGTGGTCTCATCTGGGGACTGAGAACATTATACCAGGTGT
-GGGGCTTTTGCAGGCAAAGGAAAAGCAGCTGGTTATCAGCCTCCAGCCTCCCCTGAGCCT
-TCCCACATGCTCTGAGCTCTGCGTGCCCCGCTTGGCCCCAGTTGCCTCAGCTGTAAATGG
-GGTCATAGCACCCTGACCATGTGAGAGTAATGTGGACTGATAGCTTATCACAGCTCTGGG
-TGCAGAGAAGGGCAGTGTGAATGGTGGTCGTCATTATGATTGTCTTGACTGAGCTGCTTG
-ATAATCCCAACGAGgcagttacaccaggccccaagcttagatgggccccatgcttggttt
-acactctgccagcactgtcttgaaattcttaatacatttggaacaaagtactcagcactt
-gcattcttcattgagttccacaaattaggtagcaggccctgCCTGGGAAACATGAGGCTT
-CCCTCATCCCTCACTCTGCTCCTGACCTTACCATCCAATCAGACCTGTTCTTCCAACATG
-ATCCTTTAGATATTTCCCCCTCTGTCACCTCTTCACTACTCAGAATGCtggagccagcac
-atctggatcggaatcttggctttcctgaccccctatttgtgtgccttttgccaagttgcc
-taacctgtctctcagtttcctcttctgtcaaaatagtgatgttacagtggctaaaagacc
-gattcctgcagtgaggttaacacagagcctttcacataatacatgctcaaccagtgacag
-ctgtcatcattACTCCCtgctatgatatgaatgtttgtgtgcccccaaattgatctattg
-aaacttagtcaacaaggtgatggtattagaaggtggggcctttgggagtgaatagctcgt
-gaggactctgccttgggaatgagattaacgctcctatcaaacatgtcctagacagctggc
-cttcccttttgctaggtgacgttgcagtaagaaagcaccgtctatgaagcagggagctct
-caccagacaccagatcggctggtgccttgatcttggaattcccagcctccagaactgtga
-gaaataagtttctgttgtttataagccccccagcttagtgcattttgttatagcaacctg
-aatgggctaagacaCCCCACCATCACTCTCTTAGACCGGGGTGCTTCCTCTCTTGTAGGG
-AGAACAACAGCCTCAGAAGTGAACTCTGGTTAATTGGCCTTTGCTATTGCAACCAGAGTG
-Accttccttccttccttccttccttttttctttctttctttccttcttctctttctttct
-ttctttctccttttttttgacagagtcttgctctgttgtccaggctatagtgcagtggca
-tgatcttggctcactgcaacctccatctccccggttcgcgtgattctcctgcctcagctt
-ccccagtagctgggattacaggcatacgccaccatgcccaactaatttttgtatttttag
-tagagacggtgtttcactatgttgcccaggctggtctcaaactcctgacctcaggtgatc
-cacgcacctcggcctcccaaagttctaggattgcaggtgtgagtcaccatgcccagccca
-gagtgatttttctaagacacaatccagccctgacttctttgtttaaaattcttcagtttt
-gaactccaactctttctgtggtttacaagcccctgccggatgtggcctccattctcatca
-ctgtttccctggcactttataccttatcattTGGAATTGGTTTTACTCCCCCGCATGCTT
-TCCGCCTTCTGAGGCCTCAGTGTCTATGCTCCTAGCAGGAAACTtctgcttaaaaacttc
-cccccacctgtattgtcccagcttcgttctgcctgtcttttgatcttatctcagggatca
-cctcctctgggaaggctttctgcatctgtccctcccacttcaatgggagtaggccttctg
-cctctgggagctcaaaggcccctgcctgcctgtccctcaccaaagcactcatcctgcatt
-agaaaggcttgtttgcaggccttggtcaccgtctagactgaacactcttctaggtttgct
-gtcacactttccatttctgtgtttgttgcctgtcctaaggttaggctcacagtgggtcct
-catgagtgttatgttgaatgaatAGGAGCTGCAGGCCCAAAGCAGAGAGGAAGGCAGTCC
-CCTTTCCTCTCCAGCAGGGGCAGCAGGAAGTTCTGTGTGAGTTGTTCTGAGTGTCTGGCC
-TCCAAATCCTAAAAACAAACCAACCCATGTTGATTTTCCCATTGTCTGCTGCTACCATGG
-AGGTAGAGAACGGAGAATAAACTTATATCCACCTGGATACTTTGGCTTTTGTtcaaatag
-cttgggtaaaaagggaatttattggccaatttaactgaaaattttaggggtatcgagctt
-caggcatggctggatccaggtgctcaaatgatattagattttttttttttcctccaactc
-caggctcttattttccttcatttccttattttcctttgggttcattctgtaagagttccc
-accataatcaccaccactactggcaacagcagctccaatctatcaactcagtaacctctt
-ttaagagtgcctctttcctaatagttcttggaaaagttccagcttgagccgtacagtcat
-tcctgaaccaactattatagccagaggaaggagctactgtggatggtcaggctggatcct
-gtgtccaggcctggagccttggagcaggtcaacctcacaggatcggaagggactaagggt
-ggggtacagtgacgctcaagaaaacctggagtagaatgatcaggaggcgggtggagttgt
-tgggcaTAAAGCACCTGCCTGCCTGCACCCTGACTCTCCATCCCGCCACCCACCAAGTGA
-ACCCACCTCCCGCtcagagctgatggactcttggagtaactagagatgccatggaccctt
-accttgcatttcactcatgaggaaactgatactcagagagggaggccacttgcccagtgt
-tacaTGCTGGAATCTATTTTCCTGGAAGAACAGAACTTCCTGCTCCTAGGAGTGAAGGGT
-GGGAAAACAGGGTCATTCCGGGAGGACCACTTGCCAATTTGGGGTCCTGAAGTACCTGGA
-TCCAAAAGAAGAAGACTGTCCCCAGTCTGAATCTCCCACTCTGGGGAGAGGGTCACTCCT
-GGGTTGTTCCCACAATCCAGCCCTTCTGCCAGCCCCTCCCTTGGCAACTCCTTGCATTTC
-AACACCCTGGATGATCATTGAGGGTTGCACGTGGGGCAGCTGAAACAGACCCCAGGCCTC
-TGGTCCTGTGCTGCTCATGCCCCTGAGGACACTGCCTGGGCATCTCCCAGAGCTACTGAT
-GGCAACATGGCAAGAGCCTGGTGGGAAGCTGTGGGGCCATCGACAACCCCGGGGGATGGT
-CTGTGTGTCCTCAGAAGGTCTGGTGGTGAATCTTGTGCAGCAGACATCATGGTGGCCCCG
-TGAGCCTTTCCACCCAAGACAGAAGTCGGTTGACTGCCCTCCTCCACTTTCTACCAACCC
-AGACCTAGAGCCAAACAGAATTCCTGGATCACAAGGGGCCTAGGGTGGGTTTTGAGGTCA
-CCCTGTGACCCAGGCCCAGCTGTTAAGAGCCCCACATTCCTGATGCTCAATCTTGACTTC
-CCTTCAGTAGAtgagactcagtttcctcatctataacatggagaaaataatccctcactg
-ggaaggcggtggtgGTGGGGTCttccagttactgatactgtgtaacaaagtatccccaca
-tctagtggtttaaagcagtggcaacatctactttactcacaaatctgcaattgtggccag
-gttccctgggaaaagctcaactgtgctccattccgtgtcagctggagcaacttgcaggct
-ggggtttgcatccaaaactcatccactcacatatctgaaacctcagctggggcactcagc
-aaggacaactgcatatggcctcttcatgtggctaggggcttcctcatggcatggtggctg
-cttcccagagcaagcatctcaggagagagatttgggcagaaggtaggtgatctttatgac
-ctagcctcatggatcatgcagggccaagtcctctgtatctagtcaaagaagcaaccacaa
-agtcccactcaagttccaggggaggaagaacagactctacctcttgatgaggaggatcaa
-ggtttcagaagaaggtataggatgggggatagtgttgtggccatttttatttatttattt
-tgtttatttttaaatttttatttatttatttatttttgagaaagagtctccctctgttgc
-ccaggctggagggcagtggtgtgatctcagctcactctaacctctgcctcccgggttcaa
-gcaatgcccgtgcctcagcctcccaagtagttgggattacaggcacatgccaccaagtct
-ggctaatttttgtatttttagtagagacagggtttcaccgcattggccaggctggtctcg
-aactcctgacctcaagtgatccacctgcctcggcctcccaaagtgctggggttacaggta
-tgagccatagtgaccggccTGTTATGGCCATTTTTAGAAAATACAACTGGCCATGGGAGG
-GTCGGATGAGAAAATGCCATTTAAGTGTTTAGCATGTAAGTGCTTGATAGTTGGTAGCTG
-TTATTATTATCTTTGCGATTATTGGAAAGACCCAGCATCTCTTTGCATAAAAATATCCTT
-CAGAACCTGTGAGAGCTAAAGGTGCAGGAGGAAGCAGGATAATTTCCATCAGGGCTGCTG
-GAGAAATTGGCCCAGAAACCCACTGGATTTGTCCCAAGTCACCCAGTGTATCAGCAGCAC
-CCAGTCTGAGCAAGACTGGCCTGGGACATAGCTGCTTCTTCTGTTAGTAACGCTGTTACT
-ACTTCCTGGGGTATCTTCCTTGGCCTCAGCTTCCTCTCTGAACCATGAGAGCATCCTGGC
-TCTGCCTCCTCAGAGGCTGAGGGGATAAGGGCGGAGGACATGCATTCTCTTGGCTGTGCC
-CAGTCTGGGCCACCAGCCATGCCTGTTCTTTCTCAGGCCTGGGGAGCTCGGTTGCCTCTG
-AACCCACATCTGGCACTCCCTCCAGGATATGAAGAATAAGCCTGCCAGGTCAGAGGGCAG
-ATCTATTTTGGAACCTGGGACCCCATAAAGACCCAGAGGACCCTGTGACCGAGAAAACCA
-ACAGGCCCCTCTGTGttttgttttcattaaacaagcacaacatgtccctcatagaaaagc
-cagaaaatacatattggcaagaaagcgaaaataaatgttgcctgtgctctcaccagccag
-aggcaaaaaccatagctaacattttggagttttttccccccaaataattttcctctgcat
-atagatgcatattttttttggtagattttctagcaaaAAAAAAAAAAAATCAACAAACAA
-AGGAATATTGTCTCAACAATTTTTTAATTTTCTTTTACTTACTTTGGATTTTTCTTCTGG
-AAAAAAATTTAGAgccaggcacggtggctcatgcttggaatcccagcactttgggaggcc
-gaggtgggaggatcgcttgagctcaggagttcgagaccattctggccaacatggcaaaac
-cctgtctcttaaaaaaaaaaTACTGAAATCTCCAGACTTCCAATTGGAATTTATGTTggc
-cgggtgtggtggctcatgtctgtaatcccagcactttgggaggccgaggcaggtggatct
-attgaagccaggagttcaagaccagcctggccaacatggtgcaaccctatctctactaaa
-aatacaaaattagccaggcttggtggtacacgcctataatcccagcgactcagaagactg
-agacacgagaaatgcttgagcccaggaggcggaggttgcagtgagccgagatcatgccat
-tgcactccagcctgggagacagagggaaactatttctcaaaaaaaaaaaaaaaaaaaTCA
-GACAAGTGCACAGGATAACAAAATACACCCCCATATAGTCATCACTCCAAGTGGGCCCAT
-GTTAACATTTTGCATATTTGTCTTCGATTGTTAAAACAATGAAATATTACAGGAAATGTC
-AGTATTCCTTATAACTCCTTCTTGGTCTCATTTTCTCTCCCACCCTGCCCataggttcat
-atctaggtatataaataatgtataatatttttgtgttctcaaaacttaagtatatgctgt
-tatactgaatgcgacgtcctgcttatattatattttccagattgatataaatgacacata
-tagatcttgtgaccaaggacattttcttttcactgctgtgcagcattgcattatgtaatt
-tttaactctttatccagtttttggcagatggatatttaaattaattcagttatcttgtta
-ttcctgacaatactgctattaccatcttatatgggaatacttgtgcttacaagcaagggc
-tcctctggggaactaatccaggcatgctcctcctgggtcgtggaatatatgtgctgccag
-cctgaggcagttgccaaattgtgctccaagtctctctgtcgagttaattccagtagggtg
-ccggggtctccatcgctccgcacccctgccatcccttgagatggtcatgctttacctttg
-ttccaatctgatggctgtgaaatcgtacatgtaattacatagcctgctttccctacttaa
-tagtatattacggaactattttcctgtgcagaatattgttctatatgtgggtgtttcaag
-gtggcataagctgaaagcctccattggggtgttgctgggattttcttaaccaattcccta
-ttgttggacaacagggtttgtttTtgtggtaggattgcaaaactgaccacagatgctacc
-cacccctataagcatgctcctttgcagtgtgactctgcagttctccctattaagaggcaa
-agttcacttctccactcccttaatgctgacttgggccatgtgacttgctttggccaatgg
-gacattttcaagcagaggcttgaaaagggcttgtgctctggggcttgctctcttgctgca
-cctggggccctgagaccaccatgtgaatgagtcctggctagcctgagggatgatgagaca
-cacttggccaagtcatcctgtcatcccagctgatactaaaccatccaccagatttgtgag
-tgaggccatcctagaccatctatctagcccagccaaactggtgcggaccagaagcaaagt
-ccagttggcctgcagagatgtgaaaaataaatgttttaagccactaaattttagaggtgg
-tctgttagacagcaagcctgatacaGTTCCACCCAGCATTTtctttgctcaaccagttac
-tggctgggaaccttgggcaagttgctgagccttagttttctcctcagtacaatgggggat
-tacatacgcactcctcaaagtcgttgtgaagattggatgagatggcacctgtCAGTATCA
-CATGGCGGGGACCCCATAACCAGGGGTTCCTCTTTCACATCACGGTGGTCTTAGATGTGA
-CCTGTGACCTTTCTTATTGCTTCTTGGTTCTCCCTGCTGCCTCTTTCTCAAAAATGTACT
-CATCCTTCCAAGTTTTCTGGAGAGTATCAACATGTAAGTGTAAATCACAATCCCTAGTGC
-TCTCCAAGACTTGCAGGTATCTCCTCCTTCCAGGGCCTTCCCTCTTGAAATTAGGCATAG
-Tggctgtgtgcagtggctcatgcctgtaatacaagcactttgggaggccgaagcaggccg
-atcccatgaggccaggagttggagatcagcctggccaacagggcgaaactttgtctctac
-taaaaatacaaaaattcaccgagcgtggtggtgcatgcctgtaatcccagctactcagga
-ggcggaggcatgagaatcgcttgagtctgggaggcggaggtttcagtgagccaagatggc
-accactgcactccacactccagcaagacccggtctcaaaaaaaaaaaaaaagtaaggaaa
-agaaaaAGAAAAGaaaaggagtctccatccagaccccaagagagggtttcgtggatcttg
-cacaggaaagaattcaaggtgagttgcagagtgcactgagaagagatagtttattgaaag
-ctactcagttacagagaaggatgtcctcagaaagcaagaggaagaacgcactgtctttgt
-tttaaactcttctaatgtaggagtcttatctaagtaaaagctaagttatgtctttgtgca
-gacagaccgacagtgtgacagaatccattaccgttgacttaaagaaagttatccttggca
-ttttagtaagtacatcagatcacgacagtaattgttttgaaagcataaattgttatgtga
-tattggaacatctgggcattttgctgtcgtaagagtttactcttgcaggcattattgagc
-agcttccttagccataaacatcttatgactgtgggctgtgattagcaaggaatgtgtctt
-gctagttttaagatagagttgattttaaaatggtgtcaccctagctctcctatgctcctg
-tttcccaaacaTAAtcccccctctacttaagagagaaccctaaatcttaaggggagatga
-aaggtgaaggtcatttttctgtaacttattcctgctgacagtggACGTTGTTGACCTTTG
-GGAGAGAGTTCTCTCATAAGAGTTTGCAGAGAGCCTTGTAGGGAGCCGGGGAAACTCTTC
-ACTTGAATGACATCCCGATGATTTGGTTTAGTAAGTGTAGGGGCAGATAAGCTGCCAGAC
-TATTttatctccgtaatcccatgcaataagtgcaacagaagtaaaaagcacaataaccaa
-tagcaataagtgtgacaacacgaagcatgctaaaaaggaatgccttccaagtgctgggga
-gctggccaaactgtgctgttatgacaggaagtcaattgctgaggtatgagtctctaggga
-gttcatggcctgagatatattatgagagtgaccaggaatatagacacagtgttcagtctt
-gatcaatgcacagattttcccagggctgctgttaatatgtttaaagccatatggctttgt
-aaggacatttgtcttattcgggacgtttcttctgtcagacgggtgatcaccagatgagtg
-ttgttgaaagccacagcagtatgttttgctagggctcccacctgcgattcaacgtctata
-gatgttgcttaaagacagaatatgggcacaggatataaccaccaaaaagtttgtttctgt
-tgcctatcacagaccttgactacttcccagttggtggagagggaatccagatgtgtaagg
-atacatcctagaaggtagggatgaccccaagtgcatcatccagtcaaattgtaaggtgag
-tatggccaactatgagacccacatgcccataaccattcccaaggggaaggatagtcacct
-aaccatagagattcattttgccatcccatccacatttggtcaattgaaaggagagtctga
-ttgcattgttggggtggcagccatccgatactatagatgttggtttgggggtggttactg
-ttgatgaaaagagtcgaactctgtaaaatatttgaagagacttattctgagccaaatatg
-agtgaccatggcctgtgacacagccgtcaggaggtcctgagaacatgtgcccaaggtggt
-tggggcacagcttgattttatacattttagggaggcatgagacatcaatcaaatacattt
-aagaagtacattgatttagttcagaaaggcgggacaactcaaagcggtggggggaaggag
-aggcttccaggctataggtgaacttaaacattttctggttgacaattggttgagtttgtc
-taaagacctacgatcaatagaaaggaaatgtttaggttaagataaaagattgtggagacc
-aaggttcttttgaagtctcatagtagctgccctcagggacaatagatgacaaatatttcc
-tatttagacctttaaaaaggtgctagactcttacttaacctcttcaggattgggagggcc
-tggaagaaaaagatgtagctatgttaatagagattctttacagatgcacatttgtcccca
-caaaggacagctttgcaagaccatttcaaaatatagcaaagaaacatgttttcgggtaaa
-atattttaattttcttccttgtctcataacattatgccagggtcaggtcggaaagtaagt
-cacaatatgtagggttaaataaaacccatctgaggagaatttatggtttgtagggcatga
-ctcccagaccccttagataggaatttggacaagaaaaaaaaaaatcagagcctagtcctc
-ataaccattatgccttccaaggcataagggtactttgcctgataactgaatttggatacc
-tgtcaaccaactgagtccatcatgtatggtatagcctaaggtagggatgctattaagtta
-tttGGGATTAAATGAAGAAGGAATTTCTTGGTTTCGGTGGAGGAAGGGAAGAAAGAGTGG
-TGTGTGTCCTTTTGGAAAAAGGAGAGTACATATTTTCTGTACTCAAATTAGCTGATTGGA
-TATGCCAAGGTAAGCCCGAGGTTGACAAAGTTTGTACCCATTCTGCAAACAGATATCCTC
-CAACTCTATAATAGAGCAAGCTCAACATTAAAACCAGTGGTCTTATTTTCAGAGCATCAC
-TTATCCACTGGATAgctttttctggaagagaagccgtagatccactattggctcacagga
-gtattctggaatggtgatccctgcaccagatgcctgtgggacttcatgagagacaggttt
-aacttgggataaatgtacccaaatatgtaatcccttaagtttaactgtagtaggagtgcc
-tggaagtacatggtagggctctttctattttggggaaagctgatctgcaggggatccctc
-cttccaaggtttcaatagcatgaaatctcctggTCAAacaggagagaatatttatgaaga
-tggtcctgacacatgtatactgaacaaacatgcatgtaacatatgactctgttcacctta
-aggtggagacttaatccttgccaggcatggtcttagatcctgtttataatttgaaatctt
-cttgctataaagtttctattctatcagtcttatgatctctgttttaatgttaatgctggt
-tggttgtgcccgaattccaagagggagaattgtacagcaaggtgtgtttgaccccccagt
-ccctcttcccatcatggccagaaccagttgttcaggatttttaaaaaattattatttcct
-tttgccaagagagaggtccattctgttgggtggcttaggatatttgtttatttattagtt
-taGTTTATGGTATcccattttgtcgaggtgccagaggcagtattgaaggctaagctttta
-ttgtgtcccatatcaatgctggggtggtgtcctacttgccctggtccattacctcccttg
-gtggaacacttatggtcaaggaacttagagtcaaaagacttatagccaatcaaatgttct
-aggccagatgggaatggaggtgagcaggcactcattaaccttaaagcctctttaagcaac
-ataagagccaaaaatcaaaagccagaaggcaaggtataaaattggcttatttagaaattc
-tatgcaagagctactataatcttggtttgtggcaattagctatacaaactcaagaattat
-gtttagctatttagggatctgtgtgcctgtccttgatttggagtgtcagaattaatttta
-ttcctcaaaactggcccttacaatctcatgtgatagtccctgggcatggaggaattgaat
-agtttcaAATTTTGGAGGTAAAACAAAACATAAGGCATTAACAACATTTTAAACAAAAGG
-TCATAAGCCCTGCCTAGTTTTGAGAGTGACAGGAAAGGAAGTTCACAGGTAGCTAAACAT
-TTAAATTATTTAGTATCAAGACATAGAATAAATTATATTATTTCAGATAAAGGCAAAATT
-ATTAAATGAGTCTTAATGTTTTTGAATACAGGActgcctctgtgtcttatggaagcagtt
-tattttgattgtcacttttgtctaggtctaaagatgagactttggtcaacttgagtttgg
-tgtcagatactggcagaagtcagtgccttcttcttttttgggacagagtctcactctgtc
-acccaggctggagtgcagtggcatgatcctggctcactgcaacctccacttaccagcttt
-aagcaattctcatgtctcagccacgcaagcagctgggattacagatgtgcacgtaccacc
-acacctggctgatttttgtatttttagtagaaatagggtttcaccacgttggccaggctg
-gtctcaaactcctggcctcaagtgatctgtctgcctcagcctcccaaagtgataggatta
-taggcatgagacactgtgcctggcagtcagtgccttccttagatgagatattggacccag
-aagtcaaagccctgtaacttaacagcacaaggattagttaatagCACCTGATAAGGATAC
-TTTTGAGGGGGATAGAGTGAGCCCTTTAATTGATGTTCTTCCAATATATGTAATTATCAG
-GCTGGAGGTGGTGATCCTGGAGTTCATGGTCTGACTGGAAGCTGTGAAGACTTACAATCT
-TCAGTGCTTAATTTTTATGGCTTTAGTAAGCCCCAGCAATATGACtaagtcagagactta
-atttaggattttgattttgaagatgtttgttaaagatgttaaaaggctcaaaacatttga
-tcaaaacagaagcacagatcatggtaaaatagcatttactcatttacccaaagtgatcat
-cgaaatactttaaaggcaatacagaaggttacatggatgtaaaaaccttaacccttttaa
-aatctcagtttctttagcaatgaaaaacctaataaagacagcatagaaattatcttgata
-atacataaaatctcagttttttaagccatctactaaaaaagcaaaaaagccctactgcat
-tgtgactacttttacttattggaagctcatttagataaccaggaagtcaaacttgatgaa
-aaaagtgcttgaatttaatcagacacaggaagactgttttcaaggttatgaatatagcag
-gggaatacacgactcctaggaacagcatgagaagttttctgattgcatcaaaaatttaga
-catatcaagaaaagccagtgtacagaatgcagttatactagaggaaaacattgcttttct
-agacctccaagatgcaatatgttagcatttggccataataacagttagaaccagagcagg
-gagaaagttatagaagctgacagaaaaattaaaggagagagttgttatctcaagcattct
-caaagggagaaacagctgaaagctgtttttttcaacagcacagcaacagttgaacttttg
-agatatgattctgagaagttttaaaaagaaaaaggttataaaattaaaggtaagatttcc
-tataatttatttaaagagcatatcaatatcttaagaaaaccttgttttgatgtaagggac
-caatttttagacaaattattataaataatttttttataactaatgatatgcaaaatccct
-tttacaaattcccctttatgacttacatagaccatctacgacatgcttggactctctgac
-ttgtcctgaacttccctctttgctaaacaatcagtcattttactttaggacaaaaattta
-ccatataagactctttttcatataaaattattctcttttctttataacctttcttaccat
-aaatacatcttcatatttataactttctttacatctctctctctcccctacctactggtc
-cctttctaccttgtttcataagtaaacattttcaagttcgtaatttgaattgaccttcaa
-ttcagataacttctgaattagacaaaattatttttttctcagtaatactagatcttGGCA
-GGCTTTTGGCCTCTAACATCACCCAGAGAGAAGCCAAATTAAACAACCTAAGAAGCAAAA
-ATCATCAAGACCAGAAGGAAAATGTTAAGTGTAAACTTCAAAGCATGTGAGCGTAGGGCG
-ACATGTGTCACTACTGAGGCACAGACAGCAAATATGTAGTCATCAAAAGGGACAAGGGGA
-TCAAGAAGCAGTAGGTGCTGGAAAATATCCCTCTGAGCCTCAAACAGTTTATGCATCAGG
-GTGACACTGCAACCCTGGGCCCCTAATGGCAGAAAAACGCCACACAACAGGGTGGCAGCT
-GACCAGAAGGATCCCACAACTCCAGGCTCCCTAGCAGACACAGCCCAAAGGATCCAACAA
-CTCTGAGTGGGGGGCTCCAACCCCTGGGCCCTGAGAATATAAAGGAACATGAGTGTCCCT
-GTGTCTCCTGGGGCTCAGAAGGCTAGGCTGAAAAGTGACAACAAAGGGAAGGGCACTCAC
-CTGCCTGTGAATCCaaaactggaaaaagcaagaaatcctgagctgtttgtcagatgttag
-cattttatagataaagccattctataattttagaaacatgctttcccatatcataaactt
-ttcttaattggaaataacccagacatctgatgagtaatctaaggaaagctgtggaccaaa
-attttgggtaaagtggtctttatggaagttaaaaaaaaaaagatttaaaaaaagatttaa
-agattttttttttaaaGCCTggctgggcatgatggctcctgcctgtaatcccagcacttt
-gggaggccgaggcaggtggatctcttgagaccaggaatttgagagcagtatggggaacat
-agtgagactctgtctctataaaaaattaaaaaaattagctgggtgtggtggtgtgcacct
-gtggtcccgaatacttgggaggctgaggtaggaggatcacttgagcccaggaggttgagg
-ctgcagtgagctgtgattgtgccaccgcattccagcttgggtgacaaagcaaaaccctgt
-ctaaaaaaaaagagaaataaagaataaataaaaGAATACATGAaattaaattttaaaaaa
-gccttttccactttttttccttcagtgtcaaatgaacttctaatgtttccatttcatcta
-gaactgactgaactgcgttaagaaaaataaaatctccaagtagacttgaattagtaatac
-ataaacagtgagtcttatctcaacaccagcagcttaataacagcagatttaaagcaggca
-gaaaagaaaagggagaaatagataagagagctttagaagCAATAATCAGAGGCAAGCATG
-GAAAGTGAAAGTAGCAAACTTCTGGGCTGGCCATACAGAGCTGTCATAAGCCTGCAGTAA
-AGCAAAGGTAACAAGCTGGGAAACGATGAGAATTACAGCATTCCCATACCTGGCAAAGGG
-GACAATATGGATTAGTTCATAGCAAACATCTTGCAAAGCTACTTCCATTTTTCCAAATAT
-ACCCCAGGGGCTCTAACCCCATGGGTCTTTGGGCCTCTGATCTGAGTATTATACCCCAGG
-GCCTCCAACCCTGTGAGTTGGGCCTCTGACTCCATGGGCCAGGCCTCTAGCCTGAGTTTC
-TAGGCAAGTGTCCTTGCCTAAGCCTGACATAGTACACCaagatggacctcacttaccaga
-agcggccaattggtgctgcagactgaatttcttttgcatagggtctcgtcttatgcttcc
-ttcatggtcgctaggaagatgttgccagaaaaggggccatgattcaaaccttaaaaaagg
-gttcttaggcctcacacaagatggaagtcaaggcgagtctcaaagtgcattgagaacaga
-tagtttattgaaagctactcagttacagagaagggtgttctcagaaagcaagaggaggaa
-cacattgtctttgttttaaactcttcttatatatgagtcttattcatgtaaaagctaagc
-tatttctatgtgagtggactgacagtgtgacaaaatccatgactctgttgatttaaagaa
-agttatccttggcattttaatgtgtaagtacaccaaagcatgactataattattttaaaa
-gcacacattgttatgtgacatggaaacatctggacattttgctgtctaggagtttgtcct
-tgcaggtattattaagtggcttccttagctgtgaatatcttatgatcatgggttgtgatt
-gggaaggaatgtgccttgctaactttaagatagagttgattttaaaatggcatcaccctg
-gctctcctatgcttctgtttccctaacaAAGGAATGCCCCTTCCCTCCACACCCCAAGCC
-CCAACCAGCGGGACCTGGAGGTAGGGAAGACAGCATGGGAAGCCCAGCCTGGATTGGAAG
-CAGCAAACATTTGACCATCCCAGCCACAGGGCATGCCTACCCTCTTCTCTCCCTGGACCC
-TGGCCTCGCCTACCGTGGCCATCCTGCTCCCACACTAATCAGAAACTTTCCCCTGGAAAC
-CCGTCCTGGGCCCAGCCTTTGTTTCAGGTCCTCCTCAAGCCAAAGACTTCCTGATGCAAG
-CGCTTCCTCCCTCCAGCCAGGGTGAATTCTGCCCTGTCCTTAGTTGGCTTTTCACATTCA
-CGTTTCCTTGTGATGCTGCTACTCCGGCTATCAGAGTCGGGGGCAGCAGTGCTGAGGCCT
-CCCACCCAACCCCAAGGTGGCAGCAACATCCTTCAAGTTCCCTCCTTCCAGGAAACCATC
-TCTGGCCCCTCACTTCACAGCGTCCTCCCTCCTGTTCTGCACCTGGCATTTAACACATAC
-TGCCCCAATCACTGAGGATGTTGTCACTGTTGGTAATACAAGGAATAACAGCACTGACAA
-CAATCACAGGGTCAACTATGGGAGAGCAAGAGGTTGAGAAAAACAGACTCTGCAGTGATT
-GGATCTGGCTCAtctgagcctgagttttctcacctgtgaaatggggtcagtgtagcatct
-accagccttgtgtagctgctggcagataaaattagatcaatatatatcaccatcagcact
-cagagggctcagtccctggGGACAATTGTGGTTATTATTATTATTATTGTTGCTGCTACT
-ACAGGGAACACTTGCCAAGGCCTTCCTGTGGGCCACTAACTGTGCCCCCACTCTTCCAGA
-TTCACACCCAAAGGAACAGggtgctatgatacccattttgtggttgagaaaaactgagtt
-ccatcaaagtgaggagatgggttcaaggtaccacagttgggacctgaaaagccagCAATG
-CACTAAAGATGTGGGTGACACAAGGCTTGGACCCTAACAGAGCAGACTCTGAGCCCTGAG
-GGTGGAGATCCCAGCCTAGTTCACACTGCTGCACAACCTGGCTGCAGGAGGACAGCCAGT
-CTTGgggctctggcctcggacaacctgggctaatccttccaccttctagctgagtgaacc
-cgggaacatcacttaaccttcttgagctcagtttttgcctttggaaggtgaaataatggt
-ctctaccatgcagggggtgggggaggattagatgggtaagtggatggaaagcttgagccc
-agagcctatgcacagtgggctgctcaggaaggtagAATCATGCAAGCCCAGGCCTAGAAA
-TTCTAAAGGGCAGGCACAGGTTCCCCACAAACATGACCTTGGCAGAATCCGTTTCTGAGA
-GTTGGCAGCAAGAAGAAGTTGTATGGATGACAGAAATTCTCAAATTTGCCTATTTTCTTA
-AAGTGGACATTTAAAAAATTCCACATTGGGGCGGAGGAATGTTCTTAGCCCAGGGATTGC
-TATACATAGGTTCATGCATTTACTATGCGTTGGTTCATCTAAGCccaacctcagggtctt
-tgtatttgctgctccctctgcctggatcactgtttccccagtgggtctcttcctaacatt
-ctagtctaggcttaactatttgcccttcaagagatcttccctgggcaccctataaaaatg
-catccttcacataaactctttctccttttccctactttgtttattcatgctgcttttact
-atctggcatcatattctaaatttatttgtttatctgtttgttgactgccttcttgtctta
-gcctattcaggttggtataacaaattgtcatgaactgggtagtatataaacaacagaaat
-ttgggctgggcacagtggctcaagcctgtaatcccagcactttgagaggacaaggcttga
-ggtcacgagtttgagaccagcctggccaacatggtgaaactctatctccactagaataca
-aaaattagccaggtgtagtggtgcacacctggggtcccagctacttgggagggtgaggca
-gttgaatggcttgaacccgggaggtggaggttgcagtgagccaagatcgagccactgcac
-tccagcctgggcaactgagcgagactccatctcaaaaaaaaaaatttaaaaataaattta
-ttttcacagttctggaagctggaaagtctaaatcaggtcatgggtagattagatgcctac
-tgagggcctgctttctggctctgggagacttttagctgtgtctgcatatggtggaatggg
-taaggggctgctctggggcctctttcataagggcactaattccattcatgagggctccac
-tcccatgacgtggttccctcccaaagtccccacatcctaacactatgacatgggaattaa
-gtttcaacatataaatgttgggaagacgcaaacattcagaacatagcactttcccattag
-attgtgaggataaggactatatctaagccattcacttctatatccctgttgcccactata
-tacctagcatacagtaggtgcttaataaatgtttgaaaaatgggtgaatGAAATATTGTA
-CTTTCTAATTcaagcattttctgagcacctactgtgcaccagggcctgtgctatgggctg
-tatatacagaaatacatcagtgagagtcctcagccctAAGGCCATTGGTCTGAAGAAAAA
-AGAGAAATTGCAACAAGTGCCATAGCAAACACAGCTGGGAAATTCACtgatgtagtttgg
-aggtgtgtctctgctcaaatcatatattgaaatgtaatctgcagtgttggaggtagggcc
-tggtgggaggtgattggataatggaggaggatttctTTTTTTATATCTATcaggaatgca
-aaattaatttaataatcgaaaattactataattcacagactaagacaagaaaagccatac
-gattctctcaccagttgcagaaaaagcatatgatagaattaaacatctttttatgatttt
-ttaaaattatactttaaattctgggatacatgtgcagaatgtgtaggtttgttacatagg
-tatacatgtgccatgttggtttgctgcacccatcaacttgtcatttacattaggtatttc
-tcctaatgctatccctcccccagccccccaccccctgacaggccccagtgtgtaatgttc
-ccctccctgtgtccatgtgttctcattgttcaactcccacttatgagtgagaacatgtgg
-tgtttggttttctgtccttgtgatagtttgctgagaatggtggtttccagcttcatccat
-gtccctgcaaaggacttgaactcatccctttttatggctgcatagtattccatggtgtat
-atgtgccacattttctttatccagtctattattgatggacatttgggttggttccaagtc
-tttgctattgtgaatagtgccacactaagcatatgtgtgcatgtgtctttatagtagcat
-gatttataatcctttgggtatatactcagtaatgggattgctgggtcaaatggtatttct
-agttctagatccttgaggatttgccacggtgtcttccacaatggttgaactaatttacac
-ccccaccaacagtgtaaaagcgttcctatttctcatggaggaggatttctaatgaatggt
-ttcacaccatctccttggtactgtccccatgatagggagggagttcttgtaaaagctggt
-catttaaaagtgtgaggcccccaccgcctctttctcttgctcctgcttcaccaggtgatg
-tgcctgttccccctctgccttccaccaggattggaaacttcctgagacctccccagaagc
-tgatgccaccatgtttgctgtgcagcctacagaaccgtgagccaattaaacctcttttct
-ttataaatgacccagtctcaggtatttctttctggcaatgcaagaacagcctaacacaTT
-CACCTCCAGCTACTGCAAGCATTCATGGGGATGAGTGAAAGGAAGGAGAGAGGTGGCTGC
-TGTGTCGAGGGTTTGCTCTACGACAGGATGGTGCACTTGCCACCTCTGGCTCGATCCACA
-CACTAGcccattttacagattaggcattgggaactcagagaggtgaagtgacttgaccaa
-aagcaaactcatggcagaatgaagactgggaccagggaggcctaattccaaacattgtgt
-gttacctcctctaccacaaggcctctctTGCCCAAGAGAAAGAATAAAGTCCAGCTAAAG
-TGAGCTCAAGCAAAGAAGATATAGATATGTAATTATTATCATTGTTATTACTATTTTTTT
-ctcatgtaacagatacatcaaaaagtagaagccttcaggcatggctggatctagggtctc
-aaacactatcactagaactgctccattcttagAGAGGCTCTCAAGTCAAAGTGACAAGAC
-GGCTGCCTGCCATGCCAGCCTCCCCTCCCCTACTCCCAAAAGACCAAGTCCAGAGGGAAA
-AAGAATGCCTCATAGCAGGCCGTTGAGGTTGGCTAATCTGGCACCCATTCCCATCAGCCT
-CTTCCTGCTACAAAGGCTGTGCAGCCAAACGTccacctttctgaccctcctgcagctggg
-tggccacaggacacagttctggtcaatgagacataagctgaagtttgtggtgagggagag
-cttttgctcctctgataacaggagcagttgtggccagagctgccccttcccatgttgcct
-tgatcacagacatgatatttgaagcacagaccatcttgcaaccaggaggaaaggctgaga
-aaaaaaaagtcctcactattttttagccatgacattgttaagttgctggactcctaactt
-cagacttcttcctaagagaaaaataaacttccaatgttcaagccactgcattaaattcct
-tgttacttgtagctgaaagcattcctgactaatacaACTCTCTGTCTCAGGTCCCTATAA
-AAACCCTGGGAAGGCATCATATTGGTTCTAATGGGGTCATGCTGTCATTCTGCAATGGAC
-TGTGGTGGCCAGCAGAGATGGGATGTGCCAATTGACCACTCCAGTGGCCACCCTTACCAC
-ATAGGCTTCGAGTGGGTAGGGTTGTTCTCCAGCACAAAAGTTAGTAGAGTAGGGAAGTGG
-TGGCTACACTCCCTATACCTCTGAATCAGTGGAGGCAATAAATTCCCTGTTCTTGGCTTA
-AAGTTTCTTCCATCGTTTCCAGGAACATGAAGATATTGACTTATTTATCCTCCAGGATTT
-TTATTTGGAATGTGAGGGGAGGATAATTCAGTGAACAGTCCAAATAGGGGATCTTCCTGG
-GAAAAAAGGACAAGTCATAAAAACTGCATTGAATGCCAGTGTGCACAATGTCCTTTCTGT
-GCCCCAAGACAGTCTCCCTgcatgagttcttgagccagacagacctgagttcaaacccgt
-ctccatcatgcaagtgcgtgggcagcctcgccatgtcacctcacctctctgcacctgcgt
-ctcTAGAACCGGGGGTGGAAGGACCCACTTCAAGGACCCAGTCTTCAAGAAAGAGTGGAC
-CAAGTGCCTCCCCCATGGTGGCCCTTTGACCAGCAGCAACACCCAGAGTGCTTTCTCTGT
-GAACCCTTCCCTGATAATCCCAGAGTCCCAGGGAGAAAATCTGCTCCCATCTGAAGCAGG
-AACCATCCAGCAGTGAGTGaacccactgccatttcctcctgccatgtggctaggccatat
-tccacagcctcccttgcagtcaggagtggccacgtgccttagttccaatccactgcactc
-cttcccctttgatgggtttgatgcacacaggtctgaagacctcagcagccacagtggaag
-atggcagagctgcaggacaccaggagcttgggtcctgaaatctttgtgcgctagagctgc
-tcacttaccaggggcacccatgttgggcttttggtgagtaaggaaaaaacctctttggta
-tttggtgcatggtgcctcttgggcttACGAACGTTACCCACATGCACCGCTTGGGGGGCA
-CCTGTAAAAGTCTGCAGGACGGTCAGCCCGGGAGGACATTCCATGTGGGCACCAGCAAAG
-GCAGAGGGTGGGAGGTGAGGAGGCCTGAAGAGCCAACGGCAGCCACACTGTGGTGTTGGA
-ACCAGATTGTCCTTCAGTCCTCCCGCCTTGACTGCCAGAGAGCAGCCCATGATCACCATC
-ACATCAAGCCTGCAGGCAGGGTAAGAGATTAATAACAATACTAACAACAGTaataatagg
-aggctctgccaatattcaagagaacttaccactcaccagctgcgggctggtttcttccta
-ggcctgatctcatttaatcctcaccatggcccagcaatgaaggccctactgatgtcagtc
-ccattttacagacaagaatacagaggcccatgaggcgtcggaggacattctccaaagGGC
-ATGTTCTTGAGCTCAGCTTCCTTCCAGCACAGCCTTTCATCAGGGCTTGGACCTTCATcc
-cattatatgtccagcattattcataggctgaggacacagaagtgaacaaagtagatagaa
-atctggacctcgaggggctgcgactctagtgggagaaaatgggcaataaacacacaaaca
-cgtaaatatacaaaaggagtttggtgaaggatgagtgacatgaagacagcaggtcaggat
-gctgcggtgggtgaagggaggaggtggtgctgtgcatcttgaggttggaggaaacctctc
-tgacatggagctgaaagtgctgcagcaaacgagtgagccacgtgaagatctggggcaggc
-tgttcctggcagagggaacagcaagtgcaaagtgcaagtgctacggccctgaggctggaa
-ggagcttgtcatgttcaggaacagaaaggagagagcagtgtggctggagtggagtgatgg
-ggggtggggagggatgaggctgcagagggagtgggttgggacaagTGGCAAGTTTTGGTG
-GGCAATGGTGGCAGGGGTAGATGATCCTCCAAAAAGACTCATCTGGATGCCAGCTCTGGG
-GGGTGCAAGGAGGGTATTCCAATGAGGAGAGGAGACAGGGGTTTCAGCCCAAATTTGCCT
-CCCCACTCTCCACTTGACTTAAGCTGCTCCCctctcccttcctttctctcattccctctc
-tctttttctctctctcCAAGTGGAAGCTGGATCCCTAGGGAGGATGAGGCCCGGGCTTGA
-GTCCAGGCACCAACAAGAGCGCGTTCCCACCCTCCCGAAGGTCTGATGTGGAGCAGAGGA
-AAAGAATGGTCCTGATATCACcggaaaaagggtcttatcccatatcgcaagagtgggttc
-ttggatctcacatgggaaagaattcagggtgagttgcagagcatagtgaagttaagatag
-gattagagactaatcaatgacagagtagggcatcctcagaaagcaagaggagaacgtacc
-catttcaagtaccagtgcttgcttatataggcagttaagagtagtgtactctgggctcac
-ccctgtaatcccagcatgttgagcggccaaggcgggcggatcacttgaggctaggagttt
-gggaccagcctgaccaacataatgaaaccctgtctctactaaaaatacaaaaaactagct
-gggcatggtggcctgagcctgtggtcttagctacccaggaggctgaggcaggaggatcgc
-tggagccccgaaggtccaggttgcagtgagatggtgccactgcactccagcctgggtgac
-agagtgagactctgtctcaaaaaaaaaaaaaaaaaaaagaagagtagtgtattctgttac
-aaaggcttatgatcagcttgtgacaggctactagtattgctactttcctatgttactatt
-gattttagcaagaatttatgagtgtactattatctttaaagcaaaacctaTTATTTTATT
-TTTATTTATTTATTTATTTATTTtttgagatggagtcttgctccatcacccaggctggag
-tgcagtggcgcgctctcggctcgctgcaagctccacctcccgggttcacgccattctcct
-gcctcagcctcccgagaagctgggactacaggcacctaccaccacacctggctagttttt
-tttgtatttttagtagagacggggtttcaccgtgttagccaggatgttctcgatctcccg
-acctcaccatctgcctgcctcggcctcccaaagtgctggaattacaggtgtgagccaccg
-cgtccggccgaaacctgttcttaaactaagaatttttttttgttcttaagatattgggac
-attttcataagttctgcgtctttaagtaacatcattaactcgttccctcaaccatgaaca
-tcttgtaaccaagcacgtccacgcccctggaaatgtaacccagcaggtttggcttttctg
-cctttattcaatatggagtcagtctggttaggatgcctttgTCCctgagagtcagtgccc
-tcacagcccctgcccggcctctaacttgctgtgtgacctggagctgatcattcgctctgg
-gcttcccttttctcctctgtttgaggagggagctggtctggtgccaccattttccagctg
-tctgtccttaggcaaattattcagcatccctgtacctcagtttcctcatccatgaaatga
-ggatggcccagttccaggcttacggtgaggattaaatgCACAGTGCCTGGTCTCAGTGGC
-TGCTGGGAATTACCATCATTACTGTTGTTTTGCCATTCTATTGCTATTGCCAGTGTTGCT
-ATTAGTATTCAAAATGCAGATTGGTggctgggtgcagtggctcatgcctgtaatctcagc
-actttgggaggcagaggttagaggatcgcccaggggttcaagaccagcctgggcaacacg
-gtgaaacctgatctctacaaaaaaaaaaatacaaaaattagccaggcatggtggcacgta
-cctgtagaccttacctgaactcaggggggttgaggctgtagtgagctgtgatcgtgccac
-tgcactacagcctgggggacagagtgagacgctgtttaaagaggtttattctgagccaaa
-tgtaagtgatcaagacccgtgacacagccctaagagatcctgagaaaatgtgcccaaggt
-ggttgggttatagcttggttttatacattttatgggtacagaagttacaggcagacatta
-atcaatccatgtagggtgtacattggttttgtcgggaaaggcaggaagcttgaaaagtgg
-gcggcttccaggttataggtgaattcaaagattttctgatcagcaattggttgaaagagt
-taagttattatctaaagacctggaatcaataaaaaggaatgtctgggttaagataagggg
-ttttggagaccaaagttcttattatgcaaatgaagtctgcaggtagcagccttcagagag
-aatagagggtaaaggtcccagactctttgttaaatctctcctgcatcaggaaaagacctg
-gaaagggaaaaggattctctacaggatgtagattttctctacaagagacagagttgtagg
-gccatttcaaaaatatgtcaaagaaatatattttggggtaaaatacttcaatttctttca
-ggtcctgctatctgttgtgtgatgctatatgaggaatttggtatcttattgctacaaaga
-gcatgctttgtcagtcttaagctctctctctctttttttttttttttttttttgagacag
-tgtctctctctgttgcccaggctggagtgcagtggcactaccttggctcactgcagcctc
-cgcctcccaggttccagtgatactcctgcctcagcctcctgagtagctgggattacaggc
-gtgtgccacctcgcctggctaatttgtgtatttttagtagagatggggtttcaccatgtt
-ggccaggctggtcttgaactccgaccttaggtgatctgccgccgtcttggccttccaggc
-gtgagccaccacgacctgccaagctctctgttttcatgataatgctggtcaactgtgcct
-gaattccaaagggaggagggtatgaggcatgcctgatccccactttccatcatggcctga
-actagattttcagggtttgttgggtcccgttggccgagagggaggtccattcagtcagtt
-agggggcttgtaattttatttttggtttacaGTTCTGAGGCCCCTTCTGGCTTTCAGACT
-GGCCTGGTTGCTTCCCATCTGGTCACCTCTCTGTCAGTGTTGGGGATCAGCATTCATCTA
-CCCCACGGATGTTCTGCCTGGAGTGGGGGTGGGAAATGGGACTGGACCTCTCGCCATGGG
-ATGCAGCCAGGCCCTCTCTGCTCAAGCCTTCCAGTGCTCCTCACCCAGACACCCTTCTGC
-AGGGACCCCAGTTTTACTCCCCTGAAAAAGAAAGTTTCCATCAGTAGGAGAAGACAGGAC
-CTGAAATTGTCCCTGAGCCTACATGTCTACTAGGGTAGATATTTTGAAAGCCGGAGAGAG
-GAGGAAGCAGACAGGAAGGAGACGAAACCCCAGGACTGTCTGCTAACTCCAGGAGGACTG
-GTCTTCAGAACCCAGGGGCCCTCCGCATTCCTTCTGCCTCCCTATCTCATCGTAGCTCCT
-GCCCCATCCCCCCACCACTTCTCTCCCCTTTCCTAACTGCGTGCCCTTCTCTCCTCCAGT
-CCAGCCCAGCCCTACTGAAGAACAGCAACTTGAGCTGGTCTTTCTGTGCTCCGCTTGATT
-AAAATGTAGAAGGCACCTCTATCCAGAAGACTTGGCTTGGCCCTAATCACTCCCAGCCCC
-CTTGGCTGAGTGGCCACCCGCTGCTGGCTGCTGTCATCCCACATTGGAAGTGACGGAGGA
-GCAGAAGAACGAGTGGGTCACCAGCCGGTCTTCAGGCTCCCGGGCCAGCATTCAGACTGG
-GCAGGAGGTTTGTGGGTGGAAGGTGAGTTGGGCAGCCCGTCAGCCACTCCTCAGGGCTGG
-ACGGAAatagtgattaggagcatggggtttgatgtcagatggcctggggttgcagcctaa
-ctttgttatttactatctgtgagttaagccctctgggtttcagtttctccatttgtaaaa
-tgggactgatattggaagatgtcctacttagaatggcgcctgagccatcgtaagccctca
-gtgaatCCACTGTAAGACTTCAGCCCCCAGACTCCCACTGTTCCCTTGCCCCAGCTTCCC
-TGCACCTCTCCTGCCACTTCCCTCAAAGTTGCTCTCAGTCAGGCCTTGGGAGCCACAATC
-TGGGAACGAGGACCCTGACATCCCTCTTCACAGCTGTACCCAGCACCAAACAAGTCATCA
-GAGGTTCAAAACACGGAGCCCCTACCATGTGCCAGGCACGGCATGGCATGCCTGCTCTCT
-TTCTAATTTTGATACCGCAATGATTAATTCTGTGAAAAAAGTTCTAGAAGGATATAAGGC
-AAAGAATTAGGTTGTGTTCCGTCCATTCACTCACGGCTCTGCTCCCACGCATGGCTGCGc
-tatgcacactgccctgcagcttcctttgtctgctgcacaatgggctctggacggagccct
-gttggcgcaatgagtgagccctacatcaagcttcgtcatcgctgcatcgctttgcaccgt
-gtggctgggccgccatcagtacagccaactgcctctgatggacatctgggctgcagccag
-attcctcctaacagggcttcagggaaagtcctcctcagcgcctctttgtgcgcatggcac
-atttctctaaggcaggtttctggacatgagactgacgggcagcatgtgctccttacattt
-gggggtcctgtcaatcccctcctctcccgcaggctgttctagactccagcccccatgtga
-gaggatgcctgttgcccTCACTCTTCCATCCTGGCAGTCCCCAGCCTCCTTGCCTCTCTT
-GTTTTCTTGTTCCGATCAGTTCCAGGTGGCCAGAGGGTCGAGACTCATCTCACAGCCGTG
-CAATAGATGCGTGTCTCTCAGTCGGTCAGCTCTGGCTGGGATCAGTGTTTATCTTCATGT
-CGGTGGACACCATCACAGGCACCCGCAAGAATCAGCGATCGACGGGGAAGAGGTTTGGGT
-GCATGGAGGagtgctttgcagtgagggctttggagccttgtgccctgattcaaatcctgg
-ctgtgtcccctgccggttgtgtgacttcggataaattacttgatgtctctgagcataagc
-tgggtcatcagaaaagccaagctagtaagagcacgtagctcagaaggctgctgtaaagtt
-cagatgagttgatatatgctcagtgctggaaagggtgctgggcacattagctgttggtat
-tattTGGGCACCTCCAGCCCAAATAATAATAAAGAGACTAGGAGGGATGTTGGGAGATAT
-CAGATGTTGCTCATTGGAGGCTGTACTGAGTGTGCAGAGAGCTTCAGGGAACCTGGAGCT
-TTGAGAGGTAAAGGAACGTGCCAACTGGAACTAGAAACCCACTGCCGCCTGCAGCTCTCT
-GGGCTGTTTCTCCACATGCACCGTGGGGTTGTTCGGGTCCCACTGGGGAGGGTGGCTGGT
-ATGAGGGTGGCCTGGCCTGGATGTGAAGTGGGATTTCCAAGGCTGGCACTCAGTCCAGAG
-CACGAGCCTTGATGAGGAACAGATGCACTCACAGTCTGGGGTCGCCGCCCTCCCCTCCTC
-CACAGCCCAGGGTTGGGGTGGCGATAGCTTCCAGATGGGCTTGGCTCTTAGTGGGGCCTT
-AAATGACTCCCTCTGAGTCCCTGAGAGGTGGGACTTAGGGCCTCTTCCTTGGTTCTCAAC
-CCCCCTGGCCCTGGGGGATACCTGAGGTAGCTGGGTTCAGGCCAGgtgaccttgggaatg
-ccagccctgctccgagcctcagtttccccatctgagaaacaggcattCTCCATCAAGCTG
-GCTTGGCAGAGCCACTGTGTCCTGTGATAGCTAAAGAGAAACATGAAGGAGGACCAGGAA
-CCCCCAGGAAAGTAGGGTTTCTTTGGTTTTATTTTCTTTTTGTATTTACTTTCTGAATGT
-ATAGTACATATCCATAGCATAAAATTTCAAAGGTACAAAAGGGGTCATAGGTAACAGTAA
-GCCTGTCTCCCACCCCTGCCCTCCAGACACCCAGACCCCTCTTCCCCGAGGCAAAAACCC
-TGTCACCAATTTCTTGAGAATCTGCCCAGAGATACGGTATGCACACATAGGAAtttttta
-cccagtgatgacaaacttcacacacagtatttcacactgtccttttgttactttaacaat
-accctttagagatcttcctatgtcactccataaagtgcttcttttttttttttGGATGCT
-TGGCGAAGATGGTTTCAGAATATTACACAACTTTCAACTGACCAATCAGGATGGGCCCGA
-GCAGTGCACAACCCTACAGTAGTATATGGCTGCTAGCTGGATGCCAGCTCTGTGTCTTTA
-TGGTTCACCATTGCATAGATGGGCCAATTGCAGGGAtgggtaatttataaaggaaagagt
-tttaattgactcacagttccttgtaactggggaggcctcaggaaacctacaatcatggca
-gaaggggaagcaggcacatcttacatggcagcaggcgagagagtgtgtgaagaagcaaag
-ggggaagagccccttaaccagtcttcaagagatgagcaggggctgtttccaacattttgc
-tctttaaaggaaggttgcaatacatacccattttgtacatttgtaggagaatatatgtag
-aataactttctagaagtgaaattgcATTTTacatccatatgtttaaaaaaatatcaattt
-ccaccccctgccatatacaagaattaacttgaaatctaccataaatctaaacgtaaaact
-taaaactgtaaaacttccagacagcaacatggaagggaaatctttgtgaccttgagttag
-gcaaagatttttttaggtactacacaaaaagcataaaccgtaaaagaaaaaaagataaat
-ttgacttaatcaaaattcaaaacttctgctcttcaaatgatgctatcaagaaaatgaaaa
-gacaagccacagattaggtgaagatatttgcaaaagtcatatctgataaaagactcatat
-ccagaatatatattgagtgctttcacaactcaataataagaacaaataatccaataacaa
-atgagaaaaaggtttaaaaagacatttcacccaaaaacagatattgatggcaaaaacaca
-catgaaaagatactcaatgttatcagtcatcagggaaacatatattaaaaccacaacggg
-ctaccactacatacctgttagaagactaacatgaaaaataactgataatacctggagagg
-gtatctaacaactggaacttagaaaaacagtttggtaatttcttataaaatgacccagct
-gtcctactcttaggtacaaagagtaatgcaagagaagtttgtgttttaaaaagaaaaact
-gtaggcaaatatttacagcagcttttctcataatcaccaaaaactggaaataacTGCtgt
-atgagtctagtctcacacagctataaagagactactcgagatgggctaatttataaagta
-aagaggtttaattgactcatagttctgcatggctgggggggcatcaagaagcttacaatc
-atggcagaagggggaagcaggggaagcaggcacgtcttacatggcagcaggtgagagagc
-gtgtgaaggaggtgaaggggaaagagtcccttttaaaaccatcagatcttgtgagaactc
-actcactatcttgagaatagcatggaggaaactgcctccatgatccaatcacctcccgcc
-aggttccacccttgacatgtgggaattatggggattacaatttgagatgagatttgggtg
-aggcaggaggatcacttgaacccaggaggcagaggttgcagtgagctgagatcgtgccac
-tactctgcagcctgcagacagagtgagactgtctcaaaagaaaaaaaaaagaGGTaaaca
-ggtaaagaaaataattttagatcatgataagagttaggaagaaaacattttcaaggcact
-aaatagagaatgatttggagggggtacgatatttaaagaaggttatcagggaaagcctct
-ctgaagaggtaacatttgaactgagatgtagagggagagaaggaactagccatgtggaga
-tctgggggaggagcattccaggcagaggggatagcaagtgcatctgaagaggtaacattt
-gaactgagatgtagagggagagaaggaactagccatgtggagatctgggggaggagcatt
-ccaggcagaggggatagcaagtgcaagggccctgaggccagaatgagtttggtgttttta
-atgaaagaaaaaggccagtgggtggggcaaggaggagagggcaggaggtaaggtcagaga
-aggaatggggaaAGTCTAGCTTGCACCAGCCCTGACATGGGACGAGACACCCTCTATGCC
-CTCGGTCCTGGCGGCTCCTGCTTCCTCCTTTGTGTCCACTCAACATGATGGGTGGGCTTG
-GCCATCCGCAGACCCCTCTTGATGCCCCAGTACCTTCCCTGCCCCGCCCGACAGTGAGGT
-CCAGCCTCCTGAACAGCTCCTCTTGCTTGTCATTGGATTAATGGGCAGGAATTGCTTCTG
-CTTTTTCAAAGCCATTGCCCCCTACCACAGTCCCCTAAGATCATGAAGGTGCgagcaatc
-atacttgaactgttggatgatgaatgcatcactgttgatgtggaggaggctccccagtgt
-gaggactcagagcagggtctcggcctctcacagacctggctgtgtgcttggctccacctc
-ctacgacctagggccctgagcctcagttgcctcacctgtaaaatgcggcaaacaagcaag
-caacaagatgctcaacctcagtagtagtcggagaaacaagagctaaatagcagtgaggca
-caccctttacctccattccctggattagcaaatagtagagtcaggaacttccaagtattc
-atgagggtgtgggcgatgggaattccatgttctgctgctgggtgtttggactggtttagt
-acctaagagcctaagaaagagtatatctgatgacccaggcattttcctcttgagtgtata
-ccccagagaaattctcctgcagctccagaagGAGCCCATTCGAGGTCATGGGTCACTGTG
-ATGGTGTTTGAGGATGTGAGCAGTAGGTGAGAATCCATGTAGATGCCAGGAAAAGCAAAC
-TGCAGGGGCCTCTAAAAAATACCAGATAAGGGATgagtgcggtggctcatgcctgaatcc
-cagcactttgggaggctgaggcaggtgcatcatttgaggtcaggaattcaagaccaacct
-ggccaacacgatgagacccaatttctactaaaaatacaaaaattagccaggtgtggtggt
-gcgcacctattatcccagctactgaggaggctgaggcaggagaattgcttgaatctggga
-gactgaggctgctgtgagccaagatcacaccactgcactccagcctgggcgacagagtga
-gactccatctcaaaaaaataataaaaataaataaataaataaatacaagaataaaatgaa
-taaaaaaccagatgaaaaagaaaaccaaaaagtaaaaataaaaaACACCAGGTGCATGAG
-AGAAAAAAAAAATAGAAGACGGGGAAATCTGTAGCACACGACCATTTCTGTGAttttttt
-tttttttttttttttttttttttttttttgcgacagagtctcactttttcgcccaggctg
-cagtgcagtggcgcaatctcggctcactgcaacctccgcctcctgggttcaagcgattct
-cctgcctcagcctccggagtagttgagattacaggcatgcaccaccacgcccagctaatg
-tttgtatttttagtaaaaacggggtttcgccatgttggccaggctgaactcgaactcccg
-acctccggtgatccacccgcctcagcctttcaaagtgctgggatgacaagcgtgagccac
-caggcccggccCATTTCTATGAATGAAAAAAACTCACAAGCTACAGAACATCCCTACACG
-CGTTAAAAGGATTCACACACATTCAAGCCCAGAGAACAGACTCACAGGAGCAGATGCCTG
-GGGGGAGGGGGAGGGGAAAGGGCAGAAGAGCATCAAGAGCGAAATCCAATTCAATCCAAC
-TGTGCAACAGACAGTTTGCAGAATTGATGAGGATGTTTAACCCAGGTCTTGGCACCCTAA
-GTCCAAGTAAAAAAATAAATACGATACAGCAGGTAAAATGGGGGATGATGGAAGGGtggc
-gatagtagtgcctttctcatggggaaccctcgaggctccgatgagcgaaaccatgcagag
-tgctcagccaggtgcctggcacgcagcaagGTGTCCGGTGCACAGCAGGGCCGCCCAGCT
-GTGAGCGGTGCGTGTATTCTCTCCAGCCTTGAATTCAGGCCTGGCTCCTTCTGCTTCCTG
-GTCAGTGCCGCTCTCTTGTGGCCCATACAGTGACAGGACTTAGACTGAATAGAGATCTGC
-CATGGTCCAAGGTATCTGATGGCGCTTCGGAGGAGGGAAGGGAGGGAGTCACATGGGGGA
-GATAGGATCACCAGAGGCAGATGGGATCACAGGAGGGAGATGGGGTCACAGGAGGAAGAG
-TGACTTCCGATTGGGGAAGAGATGGCGGATCAGATAAGGCCTCCTGGAGAAGGAATGTCT
-AGGCTGAAGGACAGATTCGACTGGGGGTCAAGGGGATTGATGAGCAAATGAAAGAATGaa
-tggagttagaatattgagcatgagcattacttagccctactgtgtgccaaggctttacat
-gcctcatatcatttcgtcctctaccacccctgggaaggcgacttattgcttctgtctcct
-ttgcagctgcaaaaagggaggctcagtgggttagcgactcatccaaagtcaagccgccag
-ctgcacatagagctctgatacacacccaggtcgtgtgactTGCTGGGGGACTCTATCTTC
-TCCACTTTGGGGTGGACTGAGGGACCCCAGTGAGCATAGGTACAGACCACCCCTGAGTCT
-GTCTGGACCATGTGTTAGCAGAAGTTTAATACTACACCTGTGCAGCAGGTGGAGATGGGT
-GGGACCTGTGTGGACGAGAGGAAGTGGATCTTGGGACAGCTACAGCATGCAGCGGCTCAC
-CCCAGGGCTGGACCCTCACTCTTTGGCAGGCAGCTGGGGCACCACACCCAGGGGTTAAAT
-GTGGAGACTCACTTCTTAAGCTAAAGGATGTGTCTGTCTTCAAGGCACTCTCCGAAAAAT
-GCCTCATTTTGGAATTTATGTCAAAGCCATTTAAATCCTTATTAAGAGTATTTAAAGATC
-AGTTTTCAAAATGTCTCCTAAGTATTTCATTTTTGTTTTTCTCGACTTGGTAGTATATTC
-CCATGGCTAAAAATTCAAAAGGGACCAAAGATAAAGGTAAGcctcctctctttccatcca
-ctctaacctctccccacccagagccatcactgttactggtttctagagtgttttgtcacc
-tgtaggttttgtgcattcatgaatcgtacacacgtgtattttccctccttcccgtccccc
-cgcgtgggggcttactatgcgcgctgttctgcaacttgcttttttcacttggcaattcgt
-ctcagggactgccccgtcattgtgtcaaatccttcctcgtggtgcttctcggccatgcgg
-tgttgcactgagtgctgtgacattgtatcgcaatgcctgtcctctagatatttaggatgt
-ttccagcattttgtgatcatacacaggactgcagggaacagctgtgtaagcaggtacact
-tgttctgcagcatgtgggccaggctaattgttatttatttatttatttatttttgagaca
-gaatctcactctttcgcctaggcgggagtgcagtggcgctatctcagctcactgcaagct
-ctgcctcccaggttcacgccattctcctgcgtcagccttctgagtagctgggactacagg
-tgcccgccaccgtgcccggctaatttttttgtattttttaataaagacggggtttcacca
-tgttagccaggatggtctcgatctcctgacctcgtgatccgcctgcctcggcctcccaaa
-gtgctgggattacaggcgtgagccactgcgcctggccctgggccaggctaattggaggat
-gaatccctagaggtggattgctgggtcaggggacatgtgcgctgtgatttgaatagatgt
-caactcaccttctgtagaggctgggtcaagtcaccctctcctgaggaaggtaggggaggg
-tggcggcttacccccacccagcccaggccctgtggtttcattttctttttttttcttttt
-tatggctcttagccaatcagataggtggaaaatggtagctctgtgtggctttattgtcat
-ctaatttgagtaagggtgTTTGGAGTTCCTTTTCTGGATGAGGCATTTTTGCCACACGGG
-GACAGCGCTGAGCCGACGACACGGCAGTGCCGCTCTGGACACGCTGATTCTCCCTGAGGC
-TCATCTTCTCAGGCTGAGTGGGACTGTGCCTGTGGATGCCCGCTCATGGAGTAGTCGCCT
-GGTGGAGGGCAAGGGTTTTGAGTTCCCATTCCACtacttactttctgagcctcggattcc
-ccctctgtaaaaagtggaaagaataatagaacccacttcagatggctctgaggaggatga
-atttaagtttttaatgtgaaatgcttggcacagttcctggctcagagttagtgcttagga
-aatgtttgttGAATGAAGAAATGAAAGAGATataatcatcttaaaaattgtattgagtac
-ttattatgaagcctttctcatgtattcacgtattttaacttcacagtgacaccaagaggg
-gtacttttattatccccctttaaagacaagaaaactgggccgggtgcggtggctcacgcc
-tgtaatcccagcactttgggaggccaaggcaggcgatcacgaggtcagattgagaccagt
-ctggctaacacggtgaaaccccgtctctaccaaaaaatagaaaaaattagccgggcgtgg
-tggtgggcacctgtagtcccagctactcgggaggctgaggcaggagaatggcatgaaccc
-gggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgggcgacaga
-gcgagattccgtctcaaaaaaaaaaaaaaaaaaaaaaagaagatgagaaaactgaggcac
-agggagagatacaggatcttgcctaaaggctcatagctggcgtcactggcggcgacggga
-ttcgtgatcttctgtctgctcttacccacctcacttccctgcctcccactCTAGGAGAGA
-GGTGCCACCATAAACCCCAttccagctgtccattgcatgaaacaacctcctcaacctcag
-aggcataaacaaacaaccattttatcatgttcctgggttctgtggatcaggagttcaggc
-aggataaggtggacagcttctctctgctgggccttcgatgggaggactctgtggctggga
-gggttctgcagtggggggtaaggaggggcagcgggtaaaacagcaaggactagaagaccc
-acttgcgagaaggcttcttcagctacaagtctggCTGGAGGATCCATTCCACCTTGTGGA
-TGGTAGGTTGGCTATGGCTATGGGTGAGGGTGGGAGTCATGGGGGGCTGAGTGGGAGCCA
-TCAGACCCCAGGGCTGAGTCCACATGTTCCAGGATCTGACAGCTTAGGAGGCTTAGCAAT
-TCCAGGGCTGGCGCCCCCATGAATAGCTTctccaggattttgcaagtgctgtttcctccc
-cctccccacccatctcattaacacctcgcactctttaattctcagcttggctatctggtc
-ctggaggaggagctccctaacccctgtatgccttagacaggatatgctagatcctgtcct
-catggaaggtcttatcacattgttggaattgactgtctgcagactgaacgcttggaggac
-aaggcagggtctttatcaccagcacccaggacagtaccaggcacacagtaggcactttat
-gcatattcacggaatgaatgaatGGGTGAGACTGATGGATTTTGAATGACTTGAACTTGA
-GCCTCAGTTTTTCCTCCTAGAAGTTAGCTGGCAACGTAGCTGTGAAGGTGGCAGGAGATA
-GGTGGGAAATGCGAGGTTAGTAAGAGGAATTGGTAGAAAAATGGTAGTTATGATTTATGC
-TGAAGAGAGAAAAGCAAAGGaaattagatattgcacctgaaatgcttagctatgtttggt
-gcagaataggtgctccataaatATAAGATGACGTCATCATCCTCATCCTCATCATTACTA
-TTATTTGTATTATAAGAATGCACATTTCCTGAGTTAGAAGGTCCACATACGATGGCTTGA
-AATTTTCCTCTGggctgggtgcggtcgctcacacctgtcatcccagtactttgggagact
-gaggcaggaggatcgcttgagcccaggagttcaagaccagtctgggcaacatagcaagac
-tctttctctacagataattttaaacatagctgggtattgtggtgtgcatctgtagtccca
-gttacttgggaggctgaggtgggaggatcaactgatccctgcaggtcgaggctgcagtga
-gccgggatcatgtcaccgacctccagtctgggcgatagagctattacccatcttaaaaaa
-caaacaaacaaagacagaaaaaaGAAATTTTCTTCCAAGCGAAAATGGAGAGGTGTAATC
-CCCATAGGTCACCTGGGCCAGATGTCTGGGCAGGAGGTCATGCTCTGAGTCAGATTTCCC
-TTCTGTGCAAGGAAGGACCTGGGACAGGGACCTCTGAGTCTGACACTCTCTGCACAGCTG
-AGAAGGCCATTCAGCTGAAGTCCCCATTGCAACTGTTGTCCTTCAGCCTGAGGCAGTCAG
-TCCTTCGGTCTGAGGCAGCCTGTCCCTTGCCCTCGGCTACCCTCCACCCTGCTCCAGTCC
-TGCTAGGAGAGAACCGCAACACGACCCCGTTTCAGAAATGCGCTCCTTGACAAGCCTGGC
-TGCGACCTGTTCCTGGTTGACTGCCGTCATCCGGTGGCAGCATGTGGGAATGACATGCAG
-GGCTGTGGTGAGGATGAGGATGGAGTGAGCGGGTGGGGGGAACTGCAGAGAGGGCCCTAG
-TGTGGCCCAGTTGGAAGCGGTGACAGGAAGAACCCACCAGGGATTCCTCAGCTCTGGCCA
-AGGGGTTGTTCTCTCCCTCTGGCATAGCATCCAGAAGGCCAATAGCAGCGGAACCTCCCC
-CTGGGCTCTGCCCAGACTGCCTCTCTTTGGCTGTGTGACCTCACCCTGTTTCTGAGCTTC
-TCTGTGAACTTCTCCAAGCTTGGCTTGTAAGAAGGGAGTGGGCGATGCCCACCTGACAGC
-AGAGTCTCCTTCCCAGAGAGGCCCCTCAATCCTCCAGAGAATGTGGGAGAGGCTGGGATT
-TGAAAGGATTGGAGCTGGGGGCAGGGAACGTCTGAGATGGAAAGGTTATAGGAGGGGCTT
-AGGCCCTGAAGAAATTTCATCCTGTAATTTGAAAATATTAAAAAACCACCACAGCCCCCA
-GCTGAGGACAGAGGACCAGGCCCCCCAAGAAGAAAGAACATGGCCAGGGAATTGCAGTAC
-TGGAAACTTCTACCCTTATGTTGGTCTTTTAGAATTGTGAAAATTAGAACGTTCAGCATC
-CTAAAACTGGAATCTTAACAGAAAACACTATATAGtgtatgtatgtgtgtgtgtgtgtgt
-gtgtgtatatatatatatatttatatatatatttatttatataGGggctgggtacagtgg
-ctcatgcctgtaatcccagcactttgggaggctgaggtgggaggatcatttgaggccagg
-agttcaaaactagcctgggtaacatattgagacccccatctctacaaaaaataaaaaatt
-agctgggtgtggtggtgtacacctgtagtcccagctacttgggaggctgaggcaagagga
-ttgcttgaggccaggagtttgaggctgcagtgagttgtgatcgtaccactgcactccaac
-ctgggtgacagatcaagaccctgccaaaaaaaaaaaaaaattaaaaaGATacacacacat
-acacacacacatacaGACTAAACTCTGTAGAATCAGATCATTGAGCCTTGAGGTCAGAAT
-CAGAATTGCAGCTGCAAATCTAGACTCAGCCCTCTGAGCTGGAAGTCATCTGAGAGCCAC
-CTCTCCCCTCAGCTTGTCCTGGAAAGAATGTTTGCTCTCACTGCCTGCTCCTAAACTTGT
-TTGCAATGaatagatctgggggagggccccaaaacctgaatttctaaaaggctccccagg
-ggattctgttgtTGGGTCTTCCAGATTTCGGCAATAGATTTAATTTAGCCAGGCTTcctc
-ttcatcacattcatcacatgggaaaactgaggccccggaaggggaagtgacttgacctgg
-accccatcagatagctggtgacaggctggagctcccacctgtgcctcccaatgccaaggc
-cactctcaccagcagcccagggtgtttAGATGGCCCCGTGGGACTGTCAACCTCCTAGGT
-ACCCCTGGTCCCTGAGACATCTGGTTCGTGAAACTGCGAGGTTCTGGGGATCGAGGTGTC
-ACCCTCTTCTGCCTCTGGCTGAGTCTGCTTCTTGAGAGTAGCCTGGAGGGGCTGAGGGCC
-CCTCCTCTTTTATCAGCTCCCCCCAAGCTGAAACCCCACCCCAATCCCCAATACACTCTG
-ACCCCTCTCAGCCCCAAGCATTCCTGTGAAAACCACTCCACATGTTTTAAATTCTGCTAC
-TCCAAACTCAGCAGTATCATGGTTTTGCAACACCCTCTTGATGCTCAAGAAGCATTTACA
-AGTTTCTTTTCCCTTTATTAAGAAAGTTTTAAAAAAAAGTTAGGGTCTTGAAACAATAAC
-AACGGAGCATTTCAGAGGCACAAACGTTTGCAGAAGAGAAGCTGGTGGCCTGGCCAGGCG
-GAGGAGGGGGCTCTAGCTGTTCTCGGGGAGGTGAGAGCAGGGAAGTCAGAGAGAGGGTGG
-GCCTGCTGGGAGGGGGGGGTTCAGGCCAGGGCTCCCCAGCTGCCAGGTGGAGGGCAGGTC
-TGAGGGTGGGTGCTCTCTTGGGGTCGGGAATGTAATATTTCATCACCTAGAGCCTCTCCC
-CCAGCCTGCTGACCATCTTCCTTCCCCAGGCCACCCCTGGGCCCCTTGGAGCTCCGACTC
-TTGCTTCTCCTGCCCATTCCTGTCCCAGTCACGGAGCCCTACGTGTTCAGGCCAACCAGT
-CACGGCAAATACAAATCCCGTTTCTGAGGATTCCGGGGAGCAGAGCAGGAAGGGGGTGTT
-ATGATGGCAGAAGGATAGGCAGTGAGGACAGACTTGCTTCCAAGCTGGGTCTGACCTGGA
-GACTCCTCCCAGCGTCGTTCCTGCCTAGGGCGAGGGGCGTCACAGCGAAGCACAGATGCT
-CAAGTCACtggtggtgggtgtgggcgagtgtggtggtgggtgtgggggagtgtggtggtg
-ggtgtggggcagtgtggtggtgggtgtgggcgagtgcggtgatgggtgtgggcaagtgtg
-ggggtgggtgtcagcgtgtgggggtgggtgtcagcgagtgtggtggtgggtgtggACGAG
-TGCACGGATCTTCCCTTGCTCCCCACCCACAATTCCCTACATTTCCCCCCTCAAGTGACC
-CCCAAATTCTCCTCTCCACCGTGAATGTGCTGAGCAGAGCCATCAGGCAGAAGCAGAGCC
-TGAAGGCTTCctgtgtgaccctgggcaagccccttccttctcagacctgtttccccaCAT
-GGGCAGGAAGCGCTGAGGTGGGGAACAGAGCTGCTGGATAATCTCAGCTTTCCTTTCCGT
-TTCAGTGGCCTCTTCTGGGCTGGGCAGGTGGATCCCCCAGCAGTGACAGCTCACCTGATC
-CGGCTTGGGAAAAAGGGGCATGGAACCCATGAGAGGGAGGCCTGTGGGGGAGTGCCGATG
-AGGGTGGCAGGCAGCTTGCAGAGGATGCCCTCCAGGGCTGGCTGCCCACCCAGAGGCCAG
-GTTGTGACCCTCCACGGCCAGCTGGGGGAGGTGTCCAAGCCAGGCCTCTGGAAGCCCTGG
-AGCCTTGTCCAGCCAGCTCCTCGGGGTGGCTGGTGGCTGAAGGCTGTGGAAATGGCCTCT
-GGGGACTGTCCAGAGAACCAGGTGCTCACAGCTCAGGGTCCTGGAGCCTCCCCCAGAGCA
-GAAGCAGGGCCTTCAGGATTCACCTGTGCTGTGTCCCAGCTTTGCCCTCTGGAAACCCTT
-TCTCTGCAAAGATGGGGTCAGGGAAAGGCCTGGGAAAAGATGTTTGCTTTCTTTAAGTTG
-TAGATAGAGAAAGCTGCAGGGGAGGGCACAGGCTCATGGTCCCTCTTAAAGTGTGTGTga
-gagggagacaagaggagggagagagagaaggatgcggtgaaggacaggaagaaacacagg
-aagaaagaaaaggaaagataaaagataagtgagaaagaagaggaaggaagggaaggaggg
-agggagaaaggAGAGGAGAATGGAGGTggaagaaataaaggaaataaaaaagaaaaagaa
-agggaaggtagactgacagaaaaatgatagaagggtggaaagaaagagaggaCAAATGGA
-GAAGACAgaggagaaagagtaagaggagaggaggagaaggagcaggaggaggTGTGCAGG
-GGCCGAGGACTAGGACCAGAGAGTCGGGAGAGCCGGCGGTCAGGGCTGCAGGCCGGGCTG
-GCGCGGCCTCACGTCCAGCCTGCGGTCCAGCTTCCTGTCCTTGCGTGGGCGCCGGTCCTT
-CCTGCCCTTCTTCTGGCCGGGGCTCCTCTCTGCAATGAGAGGACAGAGCCCGGTGACCAA
-GGCTGCAGGGCCAGTTAGGTCCTGGGAGCCTCCTCAGTCCTGAAAGACAAGGGTGCCCCA
-CCCACTCCCCAACAACGGGGCTCAGAACATTTGGGCACTGACCTTGCAGTCCCTCCTGTT
-GAGAGTTTGGACCGTGGGCTAAGGTACCCCAAACTGAACCTTTCTCTCTAGGTCTTCAGG
-GAGTGGCGAGGGCCACTAACTTGTTCAGGGCCTTCTTGTGCTGGACATCTGGCTCGGCCA
-GGCCTGCAGGTTCACCTGGGGCCCCCCAATCAGCATGTCGGGTGGCCTCATGGGAGTCCC
-CATGGCTTTCCCCGGCACACTCCTTCCATAGCTGAGCAGGCTCTGTGCTGGACGCTGGAC
-ACCTTTCATCTGTGTCCCTGCACCAACTTCTGCATAACACTGTGGCaacaatacttcagc
-atttagcaagcgctcactgtatgcaggccacagccccaagtgctttatgtatacgaaact
-cacaacagccgagagaggcaggtaGGGTCTGAGCCACACCCAGTCCCGTCTTCTCCAATT
-GTCCTCTCTTTCTCTCCACCCTTCTATCATTTTTCTGTGCCAGGCTACCTTTCCTTTCTT
-TTTCTTCTTTATTTCCTTTATTCCTTCCACCTCCACTCTGGCTGTGCCCGCTGCCCAGGG
-AGTTCTTCTGAGCAGTTGCCTGTCATTGTTATGGACAGGTGAGAAGACCACAGCATGGTT
-GGGAGCAAGGCCAGCCCTAAGTTTCTGCTTTACAAAGTGTCTCCACACCCAGGACATTCT
-CCTACATTGCTTGGGCCCCATTCAGTTCCCCGCAAGGAGCTGTGTGTCCATTTGAACACG
-ATGAACCTGAGGCTCCATGAGTCACTTTCTGAAGGTGCGCAGCGAGGCTGTTAGAGACCC
-TCTGAGCCTAGTGGCAAGGGGAGGGCAGTTTTATTCCTTGGGTGTCAACTATGTGCCCGT
-CTCCCCAAGAGTCAGGGCTGTGGCTCCAGTCCTGGCTCCTTCCTCTGCAGAGCAGAGTCA
-AGGAGCTAAGACCAGGCTACCCACCTCTGGGGCTCCCCACGCCCACTCTGAGCTCTTGGG
-GAGCACTGAGGCCAACTCCCACTCTGAGCTGCAGAGCTGACTGTGCAGGCCTCAGGTAGG
-ACAGCATCTGGAGATGGGGTGTGGGTGCTGCCTGAGTGGCCCTGCCGGCTCTGATGTGGG
-GGTGTGGGGGCCAGTGGCTTTGTGTCCCTACCCCTTCCCTAGGCCTGCCTGCCAGCTGCT
-CATGTacccatccagtcacccacccatccctccacctatttacccacctacacactcacc
-cacctattcacccatctactcacccacctCCATACCCAATGacccatccatccacctagg
-cacccacccatcacctatccatccacctgttcacctatctacctacctacccacccacct
-aatcatccacctacctactcatccacccacctaccctcccatctaccctcctatccaccc
-atctacctacccactcacccaccTGTGCATTCAGCCATCCatccactcatccaacaaata
-ttaactggataccgactatgtgccagactgtgttagaggcactagagagacagctgtgaa
-caaggcagataaagcccttgccgtcactggagatcacactccagtaaggaaaacagacgc
-tgaacaagcaaacacgagaatgagaaggctcatttcagaagggtgcaagtgctaccatgt
-gatatgatggaaaatgactccggggagggggactcctgggaagcctctctgaggaggagc
-cactgcagccaagacctgggtgatgcagggagctacagcggggttgttgcgaggattaga
-gtcatgtttcacagcactaagcacagccagcacatggtagatgctttatgaatgtttgca
-gttattgtGATTATTATTATCCAGGGGAAAAGCTTTCCCCTCATGATTCCCCAACAGCCA
-TTCACCCCCAGCTCTTGGAGCCATGAGAGGTGCCATGTGGTAATGAGTGCAGAAGAACTG
-TCTGCCTCCTGTGTGAGTCCTGCTCTGGCTCTGGGGTCTCTTAGGTTCTCTGGTTCCACC
-TCAACCTCACTCTGTCCTCACCTGCCCAACATGACTCCCAAAGGCTCCTATCTCTGCTAG
-CTGCACTCCCAACCCAAATAGCACAAGTCCTTCTGAAAGAGGAGTGTCcctgagttcaaa
-tcctggctccactatgtcccagctgggtgccccgggtggcctggttccaggtccctcatc
-cttcatcatgactttagattcctctttgcaTGACGAGTTACgtttgaattctaggtctac
-agctccctggctttgtgacccttaggtgagtgactcaacctttctgggcctcagtcccct
-catctgtaaaatggggatagtgctaataacacctaccgcatagcatcactgcgaagatta
-catgagttaacgattatagagaattcggcacagtgcccagTCAACACTGCCAATACTACT
-CACCGTTCACATCTTACCAAGCACACCCTGTGGCCTCTCTTCTATGTAAATCAGTGGTCC
-TTCATAgcccccagaaacattttggaaatacgtgtagtggtcttgaatggcacagtgaag
-ggggttcctgtggcattcagtggacggcaatcgggatccagcgtgggacagtcccccgca
-aagacgagctgtccccctgttccatccagttctctcacatcgtgccccaccctcacgtag
-ctgaaaagtctgcttgctgggagctgaattctgtttgactcatgaataccaattggtttc
-gaacacttccattcactgaagattctagggcactgtgagtgtggtgtcaatcagagatca
-attgggttggaccttactaatcattggtcactgttgggaaatcgcatctctgatggcgat
-gTGGCCACGTACTTGGGGCGCTGACCACGGCCGCGGTCCTCACTGGGATTGTACTTCCCT
-AAGTGTCTGTTGGTATGTTGGGCCAAGCGCTTCCATCAAGAAAtttcttttctttctcct
-ctatattacagttaggacactatactgataaaaaaaaattacctttgcaagtaggccaca
-ttctccatgaacttcattaagaatgataaagagggtattcccaaatccttcttattaaaa
-ggggggtgttcagtttgagagggttgggaactcctgGCCAGCTCAATTTTCCTAATGTAT
-TTGGGACTGAACCCAGCAAGGAAGGCCCTCCTTTGAAAGGACACCAGGGAAGGTGATGTG
-TACTCCACATGATAGTATGGCTAATGGTGGCCTTTCAGGCAGTCTCATAGATACTATTTG
-TGGGGCAGTGATCTGAGTCCGCCCTGTCCCTGTGGGCCTTTCCCACCGCAGCCTCGTGTG
-CCTGTCCTGGGGCTCACCTCCTGGGCAGGGCCTCTGGATGGGACATTTCCTTGACTCAGA
-AAGCACCTGGCAGGTGGCTGCCTCCTCATGCCCAGCCCGGCCAGCCTCTCGTACCCGGCT
-CTCCAGGCCCCAAGCCGAGCCGCAGGTCTTTCCATTGTGTGTGCAGGGGCTCCAGCCGCC
-CCAGGGACCCAGTTCACACTCCCCTGTGGGGTGAAAGGAGagacagacagacagacagac
-agGGTCAGCCGGCAGTGAGGGTCCTTCAGATCCAAGGGCAGGGTTTGAGGGGTTCAGTCC
-TCTGAAGACTGAAGACACCACTTCCACCTGCTAGGAGCAGAGTTATTTATAAGAGCCTGG
-AATGAGAGCGAAACGAATGCATGCACAGACTAATATGGGCCTGAAGCCAGAGCGGCCGAC
-TGTCTAGCTTTAAaggaaaggcttcctggaggaggtgatgtatgagttaaagggagagag
-gggagctcgtcaggtgagaagaaggaagcccattccaggcaggtgtgcaaagccttggga
-gcccggcccaccatgtttgggagatggggcagcctgagttgggagtcaagtctcaggaag
-gcggggacaggagaggaggctggaaggttgcctgggaaGCCCTCAGGACCAGGACACAGG
-TTTTAAACTTGATCATGTGTCTTTGATCAACTTTGGAAGGAAGAAAAAGGAGGCCATGGA
-CATAAAAGTTCTTCATAGGGGGTAATAAAAatacatatatacatgtatatatatatatac
-acacacacacacatatatatatacacatatatatacacacacacacatatatatacacat
-atatatacacacacacacacatatatatatacacatatatacacacatacacacacacac
-acacacacacacacatatatatatatatataCTTTGATTATTTTAAAAGTCCATGAGAAG
-TAGGCACAGAATATGggtagctatgaatactcctattttgtagatttggacactgagacc
-tagagcagaggtttgctaagggaacgcagcaagaggctcacacagcagacacagcaagct
-caagacacagtgggacccagaccttgctAGatacacacatttgacaagtaaagactgagc
-acccagtgtatgccaggtgctattctgggtgctgagggagcagcagcagacaagacagcc
-cagggtctgcaggcctcctggaattcaccatctggacaccgccgtgatgagggaagtgca
-ggcaccgtgggagcccagaagcagcatgggttgggttgtaggggaggaaacccctggact
-gggtcttgaagtgggggtgggatggcggggaaggggagcctagccaggctcagggaggga
-cgggaggtgctccaagtgagggcataaccccagcagagtcccCAGGATGATTTGGCCTGG
-AACTGGGCAAGCCGGAGAATAAGCTCAAACTGAGGAGGAAAAAAATGATGGGGGTGGAAA
-GGCTGGCAGATGGGACAGATTGCCCAGGGCCTGGGTGGGCTCCGCCCAAGGGCAGTggga
-gccactgaagggtcctgggaggaaaagaaattgagcagactatcattgtgaaatactccc
-tctgctgttgagtggagactgggctggagggactgagaaccaaggcgggagacgggcagg
-agctgtggccagaaccctggcgataggcagggggtggcaagagggtgggaagagggcggC
-ACAGAGGACAGAAACAAATGGGTGGGGAGAAAGGGATGAGCTGAATGGTGTGGGTTTGGG
-AGCTTCGTGctgcttcattttcaccccaaagttcttcctaccacccaaaatattatgcat
-ttgttctcaggtgtcgcttctgtctctccactgaaatgtcatgtccttgagtgcagaggc
-tttgtctgttttgttctgtaatgtgtctccagcacctaggaaagtgcctggccatagcag
-atgctctagtagatattttcagagtgaataaatGAACAGATTGGATTGAATATAGGGTGA
-GGGAGAGAGAAGAGTCAACAGCGATGTCTGCATCTCGCGCATGCCACCCAGGGATCAGGG
-AGCTGGTTATTGAAACCCAGAGGAAACCCAGAGGGAGCGTTAGGTGGGGGATGGTGGCAG
-TGGGAGTGGAAAGAAGGCACCCAGAGGGCAGTGGAGGTGAGGATCAGCTGCTCAGGGAGG
-CTGGAGACACGGAGTCAGGGGCCATCAGCAGCTGGAATGACCATGAATGTGAGCCCGGAG
-GGAATGCGTGGGCAGAGAGGCACAGTGTAGATGAGAATGCCAAGGAGCAGCCTAGTGCAG
-GAACGGGAGGGCTCACAGGCAGGAGTGTGACAAGGAGCTGTTAGGAAATAATCAGAGCAG
-TAATAACACTGATactgacacgtactgagcatctactgtgtgctggctgctgtactgagc
-actttaaattgtactaattcactttatcctcataacaattcctccccatgaggtaggctc
-tatgttctattgtctttttttttttctaacgtttggagaaaccgaaggacagagagctga
-ggtggtttgcttaagatcactaaagggtaaggtttagagctaggattggaccccaggcct
-gtcctattccaaaatcagtgctcagccaggtgtggtggctcatacctatactcccaatgc
-tttgggaggctgaggtgggaagaccgcttgagcccaggggcagcctgggcaacatagcaa
-gagcctgtctttacaaaaacataaacgcatagccagctgttgtggtacatgcctgtggtc
-ccagttactcgggaggctgaggcgggaggattctctgagcctaggagtttgaggctgcag
-tgagctatgatcatgccactgcactccagctgggcaacagagtgagaccctatctcaaac
-aaaacaagcaaacaagcaaacaaacaaacaaataaacaTCAGCGCTCTTCTTCTGCACTC
-TGCTGATTCCCTTGGCATTAATAACAATGCCAGTGTTGGTTGTAGTAGTAATCATAGTAA
-TGGCGGTTATGTTGGCTCTAGTGTTTTGCAGTTACTATGTGGAGGTACCCAGTGTACCTG
-ACATGGTGGTGCTGGGCCTTCCCTCACCATATGGCATTCTACTGTAATTTCTTCCAGGGC
-CCCTAACATCTCTCACCAAGCCCCCGCTCCAGGGAGAGGGGAGGGGCAGGGGCAGGGCGG
-GGAGGTCCCCACTCACCCTGGCACTCCCGTGTGTTCTGGTGGGCCAAAGTGCCCGGCGGG
-CAGGTGGGCAGACACTTCCCCTTGTACAAGTAAAACTGCCTCTTGCACCGGATGCAGAAG
-TCCTGGCTGAAGCAGCTCTCACAAGTGGCCCCACATTCTGTAATAGAGCCAGGGACACCC
-CAGGTGAGGGAGACTGCCAAGGATGGGGCCCACTGGGTCTGCCCGAGGTGGAAGGCCCTC
-TGGGTAGCTCCAGGCTTGGTAGCATTTGGGTCAGGACTCAGTGTCTCCTTTGAAGCCCAG
-ACTTGGCCAAGGTCAAACTGGGCTGCATGTGAAGAGAACActccctttctcatttgaggg
-gaggctcagagagagcgagtgacttgcttgaagtcacccgcaaaccagggctggagtgag
-gactccctgcttcttttTCACCTCAGAAATAGTGATAATTTGCCCAAAGTTACAGCAAAA
-ATTAGAGCTTGGAATTAGGACTCCTTTTCCTATTTGagctaagaccagagaaggtgagtt
-acatgcctaaggccacaccacaaactagggtagaAGTGAAAGTTGCCTGTTCTATTAGTG
-CTAATTAAGGCTGAGAGCGGACTGACTTGCCTCGGGCTGCGGAGTCAGCCTGGACACAGG
-CAGGTATCTCAGAGTCTGGGCTTAGACATGCACCTACTTCCCCTCTGTCTGTGCTGGGGT
-GAAAGGGTGGGATCTAAGCCCATGGTGTCTAGGAGCCCAGCACTAGCATAGAACAAGGGA
-GAAGCCACGTACTTTTGCACCTGTTGACCTCCTGGCCGCGGATGCCGAAGTACCCAGGGG
-GACAGTCGTGCAGGCACTTGCCGTACTGGCGGATGCCTTCCCGGCGGATGAACAGGAAGA
-GCCTCTGCTGGCAGGTGGAACAGCCGTTCTCCTCTGAGCAGATGATACAGCCTGTGCAGT
-TGCCCCCCAGGCCAGTGCCCACTGCCCACAAGACCAGGGCAGAAGGAGGGGGAAAGGGAG
-AGAGAGATGGTCAAACCATATATGCGAGCAGCTGAGATGGTCTCATTGGGATAGtaactg
-ggcacatggccacccaaacaaaagactacatttcccaccttcccttacaactagatatgg
-tcatgtgaccaacatctggccaatcagatgtaaggtaaagcagcatgtgacacttcaaga
-aagctgccttaaagggcaggggtgtgccccttgtcgtcccctcatcctttctgttgggtg
-gaatgtgaacgatggctggagcacaagcagccatttcagatcatgaggtggaaactatgt
-cccgtgaggcggtggaaaaatcagataaaaagcacctgggtgcctgaggaaggcagaact
-gctgtaccagctctagcctgcctgtgtagactgttacatgagagagaaatcaacatctat
-cttgcttaaatcactgttatttgaagttttccatcactcacaagcaaacttaatctttac
-CAAAGTAATGTGAATTTTTGAGTGTGTGTGGGTGCACATGATGAGTGGGGTGGGGTGAGA
-CCCTCACCCTCCTGCTGGGTTCCTGAACAATACTCAGCAATACTCCATTTCTCACTGTCA
-CCATCAGCAAGGGCTCCCACCATCATCAGGAATAGCAATGGGAGAAATTTTTTTAAGGAG
-AAAATTTTTTGTTACCCCAGAATTGGCACCCAGGAGCCAAAGCTGGGGAAAAAAGAGGTG
-GAAAATGCTCTAGAATCTTAAGTGAGCCTCTCCCAGGCTCATAAGGAGTCTCTGTTACCC
-TGACCATCACCCCAGGACCCTGATTAAGCTGAACACTTGCAGGGAGGGACTCATGGGAGT
-TAGGGATTGTCAGCCTggccaggcacagtggctcatgcctgtcatcccagcattttggga
-ggccaagatgggagaattgcttgagtccaggagtttgagaccagcctggacaatatggcg
-aggccctgtctctacaaaaaatacaaaaattagccgggtatggtggcacacacctgtagt
-cccagctacttgggaggctaaggtgggaggatcgcctgagcggggaaggctgcagtgagc
-tgtgtttgtgccactgtactccagtcggagagacagagtgaagccatgtttccaataaag
-aagaaaataaaaagaaGTGGACAGCCTAGGGAAGTGAGTTGTGGTGCTGTGACTTTTCCT
-CTGTTCCCAACCCTGCCAACGAAGTGAGGAGATGCCAGAGAAACTCACAAAGACAGGGGG
-TGCCTGCAAGAAGGTGCCAGCATCTCATGCCCTGCTTGGACATAAACTCATGTCCATAGC
-CCTGCGAATCTGCCCCCTTCCCATTCCTCTTTGAACAGAGAAAGGAGACCAGGAGACAGA
-AGGGCAGAGCTGAGGGGAAGAGTGTGATAGAAGAGCCTGCACATCCTTCCCGGCACGTGT
-GAGGGAGTTCTCAGTGGTAAGGGGCACCTTGGGAGCAGCCAGGCTTAGGTGGTATTCCTG
-CTGCCTGGCACAAGAAGGCTGGTTGCTGGGAGGTGCCCCAGCAGTAAGAGGCAGCAGGGG
-AGACCACTGGGAGTAGGAGGTGGGGGAGAGTCAGAAAATGACCAGGTGTCACTAAGTGAC
-AGGAAAGGATAGGGCAGCTTTTGAGAGGCAGCAATTGGGGAAACAGTAAATGGTTTCATG
-TTTATATGTCATTAGGGTCAGACTGGTTAATAATCCGGTTATACACCTTGATTCACCTGA
-GCCCCAAGACCACCCGGCAGGAAACATTCTTGGCTCTCCAGCTCTCAGATGCTCCCCTCT
-TCCTATTGGTGCCCCATCTCCCTTTTAGAGGAATTCCCCATTGTGCAAGGTCCTGATGAA
-ACACATCCTGGCACCTTCCCCCTGGAACAGAAACCAAAAGAGTTCTGGCCCTCCTTTAAG
-TTGGCAGCAGGTGAGAGCTAACGAAAGCCCGGTCAGATACACATTCTGGTGACTCCAGTC
-CTGGGAGTGGGACACAAGAGTGAGGGTCACACAGAAATGGGGTTCATGGTGGAGGCAGGG
-CAGGCTCTCTGCCCAGCCCTGGCTGAGGcctttctctctcccttccatccctcagtccct
-ctgttccttcctccctGCTCCAGCTCTCGGATGAGTACTGCTACTTCCCCAGTCCTCACC
-TTCTGTTCCTTAGATTCGGTGAGGCCCCACATCCTGCTGATAACCCTCTTTCTGTTGCTT
-ATAACTCAGGAGGCTTACTGATCCAGGGTCGTACGGAAGCACACAGTAACTAAAGTGTAC
-CCTGGGATGCTGTTCCCAAGCAAAGTTGGCATTGCCCTCAATTTTCTTGCCCTGGGATAA
-GAAACTGCAACAGGAGAGCAGAATAAAGATTTTTGTGCCTCTGGAGCTGTATACCTGGCA
-GGGATCTGAGGGCAGAGAGCAAGTGTGATGTTGTAAGGGAGATTCCCAGAGCCAGAGAAA
-TAAGAACATCCACTGAGAATTTAGCAGAGTCCGGACTTCTCACTCAgcaaaagattcaga
-ttctgatactacccagagctggcaagaatgagaggaaaccttcgctttttcaccttagat
-aggagtgtaaacttcggggaaaaatctagcagtacctaataaatttggagatGTCTCTTT
-TCTTTTTGTGTTAAAAAGtttttttgtttgttttgttttgttaagacaggatcttgctct
-gtcacccaggctccagtgcagtggcatgatcctaagctcactgcagcctcaaattcctgg
-gctcaagcaatcctcctgcctcagcctcctaagtagctgggactacaggcatgtcccacc
-acaccaagataattttttaaaaacttttgtacagatggtctctctctgtttcccaggctg
-gtcttgaactctggcctcaagtgatcttcctgcctcagggtcccaaagtgttgggattat
-aggcatgagccaccacgactggccTGATGTCTCTTCTAAATGTAACAATTTAGCTTCTGG
-TATATACCCTAGAGcggcagttctcaaactctggcgcacaacagcagctcctagagagct
-tgttagaatataggtccctgggttccacccctggtacgtctgattcagtaggtctgagaa
-tttgtatttctaacaggttcccaggtgatgctgatgctgctggtccagggaccatgctct
-cagaaacactgAcctagagaaacccttgtatatgtgtagaaagagacaaagatatttatt
-gcagcattatttaatagcaaacaactgcaaaaagctaaccctctgccaaaggaatagata
-aatacattgtggtatattcatacaccacagccagataccacatacacaacccagccatga
-taaatgactgaggtagctacagttatcattgtgggcacagctcaaagacggggctgagag
-gaaaaaagcaaggtgcacgatgaatcatatagtaagagccatttatataaagttcaagga
-cctgcaaagcaatattttgtAGCATTTGTGACTTGTAAATATGCATTCAGAGCAGAAGAC
-ATGGGACTAACCAACACTGAATTCAGGATCATGGCACACAAATGtttattatattatttt
-aaattCTTGACTGTAGGTTTGAAATAGTTCACCCTAAAAATGCATAAAGAACAAAAGAAT
-TTAGCCTCTACTGTGTCCTGGGGCAGGAGGAGGCCTACATTCTTTCTTCTCCTTCTCCAC
-TAGCTCCCCTCCCAAGCCCTGTCCCATCCTCAAGCTGAGGTCTTGAGCAGGGGAAGGTGA
-CAAATTCTGAAGACGTGGGACCCGGGTTCCAAGAGCAGTGGAGACTCGTGCCTCTGCACA
-CTttgcccctcgtccactctcccctcatcctcagtagtggaatcctgatttttattttat
-tttttgaggcaaggtcttgctctgccccccaggctgaagtgcagtggcacgaccttggct
-cactgcagcctagacttcccgggctcaagcaatcctccctcctcagcctccctagtagct
-aggactacaggcgtgcaccaccatgcccagctaatctgtgtatttttttgtagagaaatg
-gtttcaccatgtttcccaggccggtctaaaactcctgggctcaagcaatcctcctgtctc
-agactcccaaagtgctgggattacaggcctgagccacagcgcccggctggaaccctgata
-ttaagcggagtttatgtcctctaagactatatttcccaggccctttgcagctatatgtgg
-tcatgtgcttatgccctgaccaatgggatatgagcgggcatgccctgtacagcCCCTTAG
-GAAACGCTGGCACTGTTCTCCTCCCATTTTCCCTTATGCCTGCAGGAGTGCAGGCTTAAG
-AGTGGAGCCATGGCAGATCCAGGAGGCAGAGGGATCTTATAGAAAgacagcttggcgtgg
-ctgtattaacccagggctgcccaccgccgagattctttcctggggaagggaggaaagcat
-tgcccatcttgtttaggtcactgGGCCTTTCTGACGCACACATTGACTGATGATGTCGGG
-TTTTCCGCCATGCAAGGCAGCACAGAGTCATATCAGTGGAGACCAAGTTGCCCTGCGCTG
-TGCCTTGGCGCTGTGTAAGCCCACTGGGCCTGAGAGGCGACCCCACTACCAAAGAGCAAG
-GGGACCCTCAGTTGACTTGTGGTGATCTTTATCACCTGGCAGAATAGGACTTCAAATTAC
-AAATTAATTTAAATTACAGAAAAACAAAGTAGCATTTCCTGAAaaacgaatctgtggaca
-cagactcacaccctgacatggcgttgctgcccattttgcagctgagaaaaaccgagaatc
-aaggaggtgaaacgacatgtccagggtcacacagaattggcaggggtggacccacatcac
-tctgccccacgctgccctctTAGAGCATCTGTCCAGGGCCTCCTGTGTCAGGCAGAGCCT
-GGGGCCATGGGGGTGAGCCACGCATGGCCCCTACCCCTATAGGACAAACAGCCTGGTGGG
-AGGAATTGAAGCCCACAGAAGTGACAGCAAAGCAGGATGAGATAAGGGGTCAAGATGGAG
-ACAAAGCAAAGCTCTTACCACTCTtagaagagcttagaggtcactcagcacaactcctgc
-agtttcactggggacactgaggccagaaggggtggagctttccccaaagtcaggcagcca
-actGCAAAGAAGCCTCAGTCCTCAGTTAGAGTTATAGCACTAtttgttttttgtttgttt
-tattgtttgtttgtttgtttgtttgtttgtttttgagatggagcctcactctgttgccca
-gactggagtgtagtggtgcgatctcagctcactgcaaactccgtctcccaggttcaaacg
-attctcgtgcctcagtctcccgagcagctgggattacaggcacccccaccaagcctagct
-aaatttttttgtatttttagtagagacggggtttcgccatgttggccaggctggtctcga
-cctcctgacctcaAAAAGCTACAGTATATGCTGAAGGCCAAAGAACCCAACAAGCCCCTC
-CCAGGCCTCATAGAGTGCTGGCCCACTGGATGGTGCTTAGCATCCTTCAATACCCTGGTC
-TTTGAAGGTCAATACCCTGGTCTTTGAAGGGTAGTGGCTGTTTCTGGCCTCATCCTCGAC
-CCTGGCAGTTGGCTAGGATGCCCTCTTGTGCCTCTATGTTGTAATGGCACCTCTTGCTTT
-TTGACTTCCGGTAGCCTGTCTGGTGTTTCGTCATGTCTCTGTAACTCATTAGAAAAAGCA
-GTGCTACTGCCTCTCTCTACCCCCTGCCCTAAAGTCACGGGTGCAGGCGCTTGAATGTTC
-ATTCTGTGAATCATCAGTGATGACAAGAGTCTGTAGAGTGCTGCTCTAGAAAGATCCAAA
-CTTGAAGGTTCTTAAACTTGACTGTGATAACAATCTCCAGAGAGGCTTGTAAAGCGTCTG
-CTGTGGGCCAGGAATGTGCACTTTAACAAGTCCAAAATAAATGTAACAGAATTTTGGAAG
-TGTCTTCCCTGTTCACAGTTTCCTTTCCCTGAGAACTGGCCCCAGTAATCCTGTTTGTAG
-GGCATGACTCTGACCCTAACCAATGGCTGTCTCTTCCAGGATGGGCCAATTAGACCATCT
-CTCTCTGGGCTGATGGACAATGGTCTGCGCTGGCCTTGACCTAAGGCGATCTGCAGGTGG
-GAGGGTAGCCTGTTCCAATGCACATGTGTGAGAAGCCTTGGTGGGCACTAGCTAACAGAG
-GCTCTGCTCCTCTGcactctctggcattgaggttcgtgtgctgccatatccacccagatg
-cacttaacctgggcttggccaatcagagcatcaggtccccttgactacagtggttgtagg
-ttcagacacaggctcacatccccacaagagctagtcttggggtttttgctgaggtcaatg
-gatgtgtgtggagatgtgtgtgttttcctttcctctctttggatctaggaggatatagat
-cagagctggtgggtgccacatgagggaagagcctctggagaatggaggccatacagcaga
-aacagagccaagagacacagacaaagaccaaaaagagtcatctgtgcatgtggatccacc
-ctggggatccataaattctctttttttctcaggtcacattgagttaggttttctgtcact
-tgcaaccagatgattcccgactaatacaGAAGTAGAGAGAGAAAAATAAATCAGATGCAG
-AGAGAGAAGCAGCAACCAGAACCTCACGGGCTCCTTGAGACAGAAAAAATTTCTGACTGC
-CTCCCAGTCCTTCCCAAAGCTTGGCTTGTCCCATAGCTCCAAATCCAGTGACTTTTTCAC
-TTGAGCTGGTTTTCTTCTGTCAAATTACAATAAAAATGGATGTAGCTCACTAGACAGCGA
-ACAGATCACGGTGGAGCAGCGCTGCTTTGGCGCGGATGAGGAACCTGGAGCACCACCTAT
-CCAACCTGATCACCCTGGTGCTCCAGGGGACACTGAGGTTCCAGGGAGCACACTTTGAAA
-CCCCCTGGGTCCTTCTACACATCTTGGCCTCTGTCGCTGTCCTCTCCCAGCTGAGATGCA
-CATTTTAAAAGCATTCAAGCTCTAGTTGCAACCTCCCCAAGTTTTCTTGGGCCATCACAG
-TGGATGGCAGGCACCCCATGTAACTTCCATTAACAACTGTCTCCCATAATCAAGACCATC
-CTCCCTCAGTCAAAACACCAGTAGGCCACAAAAGCATGGCCCTGTGTTGCTCCAGCAGCT
-GGAGAGGCTTAGAATGAAATCTGAGTCACTCCATGTTTCCCCAAGCACCCGAGGGATGAG
-TCCAGATTTGGATGTCCATTTTATGGAGAATGAGAGTGGAATCAAACACACCAGATTTGA
-CAGTTTGCAAAGTGATAAAGGCTTATGACAACTCTGAATGCGTGCATTAACCCAGGGTTG
-AGTGATCCATTCATTCATTCATCGACCcattcattcaacaattactgagcccctattctg
-ggtaaggtccagtgctaggACTCAATGGTTATGAGCTTTGGGGCagttgtgtgaccttgg
-gcaaggtactttacctctacaagcctcagtttttccagctgtaaatggggataataatgc
-ttatcttgcagggctgttgtgattaaaggagatggtacgtgaaaaactgttagctcagac
-cacctgcagcaggcatctgataaactgaagctaccattattATATTGAGAATGATGTGTT
-TTCTGCCCTCAAGGGACTTAAAAATCTAAAGACGTGTAACAATGCAGGTTcccaggttga
-tatcctggccccatcactcattgaatgagatccctcgtctctgtgggcctcagtttcccc
-atctgaaaaattgtggcagcaattcctacctccacgtgatttgttatgagggatgtgcaa
-accagcaagcactggcacacagtaggtgctcCTCTGTAAACCTAGGTTCCCTCCCTGTTC
-CCTCACCATCATGACACACAGTGGGACTGTCAACCAACATCTGGACCCTTGTCCTCTTTC
-CCAGGTGAGCAAACAAAAGCCAGAGATGTTGGTGAGGCTGGAAGGAGGCCAGCAGGGTCC
-AGGGACATGGTCTTTTGCCCTCTGGATGGTGAAGTGCTCAGGGCAGAGATACTAGCCAGC
-AGCTTTGGTCCTAGGTGAAGGGCAGGCTTATTCCTTCTTTTGGGAATAGGGAATAACCTG
-TGCCCTTCAAATAAGGGTCCCTAAGCTCAGGTTCACCCACATCCTGAGAACTGCCCCAAG
-CACCTTGTTTCAACAGGAGTCAACGGCTCAACATGTGCAAGTGATCGCTGTATTTTTTTT
-TTCCATTTCAGGGTTTTGAGTGAACTTAGGGTCATCTCTGCCATATCATGCCTTCCATCT
-GCCTTCACTCTGCAGAACTTCCCTGAGGGGTCAAAAATGCAGGGTGACATCTGGGACGCT
-GAAAATGTCATGTTCTCCTAGGCAAGCTCGTCTCCTCAGTAGCCCAGTGAATCTGTCATT
-GAAATTTCCTTAATACCCAAGCCAGAAAGCCTAGCCCCATACATTTTTTTTAAAAAAAAC
-AAGACTAAtttggatagatttctagcatttaaaaaatcaagagatttcacattaaaaagc
-tggaatttgaacttctctggaaaaagtcagaacatctaccaacactgggtctgctgtcac
-agggcagtgagtggttagagttacataaataaggcatatgttccccaggttactgcagac
-cctaccCCTCCCTATTGTATTTCAGATACTGAGGGAAAAGGTCAGCTGCCCTATGTTATC
-ATCCTTGAGCTACATCTTAACACCCACTTCACTCACTCACAATAGAAAACAATGTAGAGc
-aggggttctcaaacttgggcatgcatcagattcacctagagagcctgttaaaaacacagg
-ctgctgggccttaccctagagttgctgattcattaggtctgggcagggcctgagaatccg
-cattgctaacaggttcccaggtgatgctgacctttgctggtcctgggcccacactttgag
-aactactAGTGTGGAACAGGGTTAAgagccagactggttggattgaaatttcagctctgc
-cccttacctttgccatgtgaccttgacccagtgccttaacctcactgtgcttcagttttc
-tcatctgtaaaacaagaatcctcctggctgacctcacaggtgtgctgtggggGCCTGGCA
-GGGCTGACAGTCAAGCGGGTCTCCATGACATCACTGTTACTACCATTATTATCACCACCT
-GCCCTGCCTGTGTTGGCATTTGTGATCCTGGAACTGCTTTGACAATCAGTGCAGAGTTTT
-TGGTTTTGATGCCAACATTTTTGGGGGTAGAGTTTCTTCATAATTGGGGTGTGCCCTGGG
-AAGTGTGTCTTGCATGAGAACATCATGTCATGGTGAACTAAGGATTTAATACAGCTGTCC
-TGGAGGACTCCCCAGGGCTAAGAAGGATGGGGAAAGAGAGAAAGACACCACTGCCCCTGC
-TGAGGTCCCTGCTCTGTCCTTGGGGAGGACCCAGAACCATGCAGGAGGGCCCTACACAGA
-CAGTGCTGGGCAGCGCATCCTCCGATGCCCGCCTGGCAGTGCAGGACGCATGTCACCGAT
-GACCAAGGGAAATAAAAAACATCTGGGCACCCGCCTGCCCACTCAGGCCTCCACATATGG
-GAGGCAGTCGCCACTGCTGGAGGCTTGCTCAGAAGATCCCCCAGCACATTTCTGCCTAGG
-GGTAGATTGCACCATCTCTAGCAAGGGGGTGGGCCCTGGAGATGACTCCCAGCTTAGAGA
-CTCCCTGGGATCAGGGCTAGAGGTCGCTAGCCCACTGGACCCTTCTCAGCACTCAGGAGG
-TGGGGGGACCAGCAGGGCAGAACATTCAGCAGAATGTTGaggttgccttggctttggggc
-ctgacaaaccaccacttcctagctgggtgatattgggcaagtggctttactgttctgagc
-cttggtcttctcttctgtaaaatggggacgatagtagcaaccacctcccaggcagttgtg
-gggatgccatgaactcatctgcgcaaagtgcttagcacagctcacggcagatgaatgagc
-actccattactacttgattCATGAGAGATGCTCCTTTGAGGGCTGGGCCCAGCTTGGCTT
-GCTCACCTTTAAATCCCCACGGCCCTGCACATTGTAGGTGCCCACTGACTACCCATTTGT
-GATTATACCCATTATGCCCATTCATTATTTCTTAAATGAATGCATGAACGGTGGCTCAAT
-AAAGGTTCTCAAAAACTGCTCTCAGGGGGCTCACAGCCTATTTGGGAGGACCAGGCCCAT
-ACGAATGTGGAGAAAGCTGATGACCTCTGCCCAGCAGGGCTCAGAGACAAGTGAAGGACC
-CAGGCAAGGTGGGAGTGAAAGTCCAGAGACTGGAGACATCAGGGGTGGTTTTCTAGGGAG
-GCAGATGTGGGGACAGAAGCTGAGGCCAGGAGCAGGACTAGTTTGTGTAGATGGAAGAAA
-GGTTTCTAAGAGAGGTGAGTACAAGATGATATTGTACTCATTTGGTAGAAAGGGAGGGGC
-TTGAGCAAGGAGCAGATGGCAAATCCCCGCTAAGGTGCCAATACAGGACACCTAAGGGGC
-TAATGGATAAGACCCTCAAAATACAGTAAGAATAGGCacacatccaaaatggaaactttt
-catcctttgccctccaaacctgcttctcctgtccatttcagtcaatggctactccactca
-gggccaaagacttcagcggcatccttgtctcttctctctccctcatatcctactattggc
-ccatcaggaatccggtcagttccacttctgaaatatgtctgggaataatttctccacctt
-tcctgtccctaccccgttccctgctcctgccctgtttccccaccactcaccttccctggc
-catgctggcctcatcctccatgttccccatctgccaagaccactcccaccacaggacctt
-tgcacttgctcttccttttgtctggaatgcccttcccacattcacccgcaaggctccctc
-cctcaaatgtctccttgtggggacaagagtgattccttcttagatactaatttgccacgt
-caactcctgactaaccctgagtccagtaatgcctccaagatgtctagctgaagcattact
-ctctacgtagaaacacttatttgctgcgggtttcacttttcctccaaaacaaaccttgat
-gctgctgcaggaagcataggctatgacacccatagcacaatgtcagtcacctgtgcactc
-ctcccagagcacgcagacctttctccccaagatatgtaagccctgggtctggagagttac
-agcttggagatctacctatcttgaggctgcccaaatcttgctctgttcaaaagttcccca
-actaataaccctttaccaacaaattggaattggctgcctcattctttggtttcccagctc
-cttctgcatttggggtcgctttatgtatacggccctttcacagaacaccccttccctgtg
-atgcccccagacctcttgcctgcagcagcaccacacctacaccctattcctctcccacgt
-cgctatgttcttcatgccatttattcccacctgataggttctaaatttggcaagtgctgt
-tgtctctttcccaccagtgaaagatgagttccaggaaggcagggaTGAGCCACGGCACAC
-TGGACCTTCTCACTTATGCAGCACCTGCCTTCTCACTTAACCAATTCTTTGTTTTATAGC
-TGCTTACCATTCCGCATAGaggggctgcaaaactcatttaggtgctattatcacacccat
-ttcagaaaggaggaaactgaggttcagagcaatgatgctgcttgcccgaggtcacttaat
-aagtggagcagatattcaaacccaggcagtgtgactctgaacctgagggttatcctcagg
-ttgccacactgcAGCCTGGCTACTCAACATATCCCTGTGCGCCTCCTCAGTCCTCCATGC
-AGAGTCCCTTACCTACTGACGCCTTGCTAAGTTCCCAGTGCTGTGCTGAGGCCTTCTTCG
-GTGTCCGCTTGACCTCACCTGAGACAGGAAATTGGCCAAATGGTGGCAGTGCAGGCTGCC
-CCAGGACTGAACATGCCCCCTCTGCATTCCTCATCCATCCTCCCCTCACCCCCAGTAGAG
-AGTGAGCAGATCAATAGGTGTGTGTTCAATCAAGGGGTGAAATGCCCACTCCGTCTCTCA
-AATTCTCCAGGAGTGAGTCTCCTGCCTCGCAGCTGGGACTTGGGGAGGATGAAGAAAAAT
-TACCTGCTAAGTTGCAGCCTCTGCTGGACATTCTGGCCAGAATCCTTTTTAGACGTTGAC
-CTATATGGGCTGGTTGCAGGGGTGGAGAGGGTGGTGGTAAAACCGGGGTTCAAACTCACA
-TTTGTTGATTTCATGGCcagtggtgatctcagatttcaatccccatcagaatcacctgag
-gctgcttattaaaaACAAGAGGTGCTGTCGCCTCTCGACACATGCGGTTGTTTTAACGTT
-TATGGTGTGCCCAGGGTTGTACGTGCATGAACTCAGAGATCTTCAAAAACTGTCCTGTGA
-GATCAGCCAGGgcttcccaaactgtaatatgcacacaaagggatttaactcagggatctt
-gggttaaaatgtagattttgatgctaaagttctggaatggggccagaggtgctgGCCCGA
-GAACTCACTTTAAGAAGCGAGGCGGgagatgctgttatcattcctcattttacggttcag
-gaagtgaaggctcaaagaccaacaattataggtggtggcattagatttaaacccacagct
-gatgaaaccccagactcattctactgtgtcacactgccTTACCCTGTTGGTCTGATGATG
-AACGTGGAGCGGGAAAATGGGAGTGATACTCAAAAGGGGCAACCTggccaggcacagtgg
-ctcacgcctgtaatcccagcacttagggaggctgaggcaggtagatcataggaggcccgg
-agttcgagaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaatc
-agctgggcgtggtggtgcacacctgtaatcccagctactcaggtggctgaggcatgagaa
-acgcttgaatccaggatgcggaggttgcatgagccaagattgcaccactgcactccagcc
-tgggcgacagagtgagacgctgtctcaaaaaagataagatataaaataaaataaaataaa
-aataaaataTCAAATGGGCAACCTGACTCCTTTCGCCACTCATAGGAGGGGCATTTCCCC
-AAGCAGCCTGAGTTGGGGACAGTCCCTGCCAGGCCCAGCATGGCAGAAAAAGGAAGGGCT
-GGGTTCATGTGTGCCCGACATGTGTGTGTTTGGGGGACAGGGGCAGGTATGTGCCGACAC
-ACGAGACCCCTGTCTAAAGGATCTGCCTGTCCCCACATTAAAGCATAGAGAAGGCCTGAG
-CCCCTGCCCTATGCTGGTCCTGCAGGGCTCGGCTGGGGCCCAAATCAGGGGTTGACACAG
-TGAGAACAGGCTGCTGGTGCCTGGCATCCCCCACTTCCCACCCCACATCAACCAAATCTC
-TGCTTCCCCATTCTCCTGGACCTGCCCTGGACCACATCTATTCTGCCCTCCATTAGCTAC
-TCATTAAGAGAAGTTACATTTGTGTTTCTGGTGGGAGCCCTGGGGGTGCTGAGCAGCCCA
-GAGCAACCACTGGTGACCTTCAGAAAAATCATATTAAAGAAAAAAGGGTTGTTTTTGGAT
-TCCTCATCATTCGGCAAGCTGTGCTGGGGGTAGAGCAGCCAGATGAGTTCGGGACCGGGG
-CAGAGAGTCTACCCTCCAGCTGGCTTCTCCAGACCCACCTGCCCAGAGCTAGTGCCCTGT
-TAGCCAGGAACACAGAACTGTCACAAAGCTGTCCTGAGCATGAAACTGTTACCAACCAAT
-CTGTCCGTGGAGTTGTTACAAAACTGTCTTGTGTGTGAAGGTGTCACAATGTTGTCAAGT
-ATGTGACCTTGTATAAGAAATTGTCATGCAATTGTCCTATAGGTAAAACTGCCATGAAGT
-TGTCAAGCATATGCAGTTGCCACTCATTTGAAAAACTACTGGAGAAGAGTTTCTTTTCTT
-TTCATGTATGAGGGACAGGTTTGCTGTGTGGGTGACTTTGAAAAAGTTGCTGACAGGCAC
-TGTGCTTGGCTGCTGCTCCTGTAATAacagcgcccggcacccagtaggtgctcagtgagt
-acttgccgaatgTCTCCTCAGGGCTGCAAAGTAGACTCAGACAGGTTCTGGTTCTTTCAG
-GTGCTGGCTTTGTCCCGTAGTGGGCTGGTCTGATGTGACCTCGGGTAGGTCTGTTGCCTC
-TCGCATCCTCTCTGAGCCTACTTTGGTTGTTGTAAAGTGCCCTGAGGCCTGTGTATGACG
-TGCCCAGCAATACTGGGGACAATAAATGCTGGCTGCTAATTCCCTCTCCCTCTTGTCGGG
-GGTTTATGATTCCTCAGGGCTCTTGATGGTAGCAGAGGCCTCTCGTGGCTCTTTGGGAGG
-CTGTGGAAGCTTCAGCTTTGGCTGAGTAGGACGTCTGCAGTGGCAGGACACCTCCAGCCA
-ATCAGGATGCTCAGTGTCACAGGGATTGGGGGCAACGCCCACCGCTACAAACCCAGGAGG
-CCTCCTCTGGGGAGGATGTGAGCTCCAGGATTCCAGGAAGGGTGGGAGGAAACCTTCTAA
-GGGGAGCTGAAAGCTCGTTGATTCCTAAGATGAGCCCGAGTGAGAAAGGTACCAGGTTTT
-GAAGTTTGTTCTGCAAACGACCTTCTTCACTTTTTTGTGAAGTCCTGCaatcaacagagc
-tcagggctaggaattaggacctttgctcctgtcccaccttggactcagactcattgtatg
-acctttggcagagcacctggagcttcCAAGGGGTGGCAGAGAGTTGGGAATGCAGTTTCC
-TATCGGAAAAGCAGAGCCTTGGTCTTGATAAAGAACTTTTGAACTTTTTCTTAGCCAAGG
-GAGCCTTCCTTTTTGCAAGATGAAATGTGACATGAGAGATCGATTCCTAAAATGAATGAG
-TTGAGCTGCTTTGGCTGAGGCCAGGATGGGGGTGAGGGTGAGCATCTTGAGCTGTCTTTT
-TGGTTTCCTTTGCCTACTTCTAGAGGCAGCCTCTGAGAGCTTGGATACCCCCTAAGGAAC
-CTTTGAACCCCAGAGTTCCACAGTGCTAATGGCTGCAAGGCAGGTGATATAATTTTGTGG
-GACTCTGGAGCCTGGGTTCATTCCCACACtagcttctctgagcattggttttcccgtctg
-taaatggggataacgactatgctcacatgttgtgacagtgtggtaagctggttttgtgtg
-tggcatgccaaaacagggtttggctgacatggggtgcacagcaatgtgggAGCTGCTAGC
-AGTTGTGGATCTCTTCTTTCACAGGCCAGACTGCCTcaacaatcctgcaagatgggtagt
-attatctggtcttgcggacaaggaagctaaggcacagagaaggtaagtaagttgcccaga
-tcccatagctggtgagtggcaaactcaaagccaggcagtctTAGTAACAGATAGTTATTA
-TTATTTTAAGTACTGGGGAGAGTCTAGGCCCCAGAATAGGTCCAAAATAAATACCCTCCT
-CACCTTACATAATTAAGCTCTAAGAAAGCTTAGAAATAggccaggcacggtggttcacac
-ctgtaatcccagcactttgggaggctgaggcgggtggatcatgaggtcaggagttcaaga
-ccagcctgaccaagacggtgaaaccccgtctctactaaaaacacaaaacacctgcaccag
-gtgtggtggtgcgcacctgtaatcccagctacttgggaggctgaggcaggagaatcactt
-gaacctgggcagcagaggttgcagtgagccgagatcatgccactacactccaccctgggc
-gacagagtgagactctgtctcagaaaaaaagaaaGCTGAGAAATATAATCAGCTCCCAGT
-GCTGAGAAGACTTGGGGCCCCACTGCCAGTGAGCATCAGGAAAGGGGGCCAGGTCTAAAA
-GTCAGCGCTGACTGAGGCAGGTCCTTGGTCAGTGTGTCCCTGCCAGTGTTCCTGGGAAAG
-CCCCAGTTCTTCTCAGCCAGCACCCTGGGTACCTGGAGCTTCCAAGGGGTGGCAGAGAGT
-TGGGAATGCAGTTTGGGCCTCCAGCCCAATGCTCCATGCTCCTTGCCCAGTAATCACACC
-TGGCACAAAGTGAGCATCTTCAAGGACCCTATTCTGGGTCTGGTCTCTCCCCATGGGCCT
-TCTTCAACACTCAAATCCTAGTAGTACAAGGGAGAGAGCCCCAGATGTGGACTcttgtcc
-agttctgtgtgtcctcaggcaagtgtctccctgtctctgggcttcagtttctccatctgt
-caaatggatggttaaactcagtgtttctaaaggcccACTGTTCACccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccccatccatccatccatccatccatccatccacccacccacccatctatccatcca
-ctcacccacccatctatccatccatccatccacccatccatccatccaccaacccatcta
-tccatccaatcacccacccatctatccatccaccaacccatctatccatccactcaccca
-cccatctatccatccatccatccacccacccactcatctatccatccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccacccacccatatatccatccactcacccacccatctatccatccatccacccacc
-cactcatctatccatccatccatccatctatccacccacccacccatcatccacccaacc
-atctatccgtccatccatccattcagcagatatttcttgaatatcatctatgtgccaggA
-TCCTTTATTTATTAAAGTTAAAAGACAAATCACAGACCTGTAGAAACATTTTAGAAAGAC
-ATACAAAATCATACTGGATTGGAAATGTAAATTTCCCCAGGACttttgttcaccagtgac
-tctccaatgccatgcatggggccacatgtctactaggtgctctgtaaaatgtttattgga
-tgtaagaatGAATAGGACATATTTTGCTGTTCTAAAGAGAGCTGCCTCCGAGTCTGAGAT
-TGGAGTCAGACATCCTCTCTAGGACTTATTGAGAGGGGGCCAACTATCTTTGTCACCCCC
-ATCCCTGACCTGCCCCACTGCCTCCCCAGCCCATATAAGCCAGTTTCTAAAGAGGATCTA
-AGGAGGATTGGCCAGCAGTGACTGGGGCAGGGTAGGGCACGGCATGCCCCCAACTCCCAA
-GCCCAGGTGGGCTCATGGTTTGGAGGGGAGAAGCTATGAACCAGAGGGAAACAGGCATTC
-CATCCCTTGATTGAACTCACTCTTGTTGATCTGCCCTGTGTCCATTGGGAGTGAGTGGAG
-AATGAATGAGAAATGCAAAAGGGGTGGGGTCTGGCAGAGGCAGCCTGCATTGCCACCATT
-TGACCAATTTCCTGTCAATTTCCTATATTTGGTCAAGTGGACATTGAAGGAGGCTCTTGA
-GCTTAATCTAAGCCATGGTTTTCCAGCCCAAAGGGGCATGAGGCTGTTGAAGTGGGGATG
-GGGTAGTGAGGAAGCTAGGGTGATCTGAAGAGGTCAAGCTCGTGCTCCTTGCTCAGTAAT
-CACACCTGTGTACCAATTAGGCACCTGCCACACGTGGGAGAAAGGGGAGGGCATGGATGG
-AGGCAGAGGAACATTTAGTCCCAGTCCCTCCCTGCTGCTCACTGGTGATGGCCCCAGAGT
-TTTCTAACACCGGGAATTGTGGAGGCCACAGCAGCATCAGGGTAGTGACAGCTGTCTCTA
-TCCCCATTCCTTCTTCTGCTCCCCAACATACAGGGGAGAAATCAACCCAGAGGGAGGAGA
-GAAGAGAATGAGACAGCATGACATATCTCCCTACAGGGCAAATCAGTGGAGTCAGAAGCT
-GAGTCAGGCAGTGATGGGGAAGCAGTGATGGGAAAGGAGAGCTTCAAATCAGACCTGTAT
-TTTAAAAATTCAGCACTGGACTAGGCTTTTTAATAGCTGAAAGTTACCAGAAAGCTTTGA
-GATCTGCCCAAAGTTATTAAGGATTGGAGTTTAAAAATACGACTGTGCATTGGGGGTGGG
-GGGTGGGGGGTGCATGGAAAGCATGCCATGTTTGTAACCCTCTGTTACAACTTCAGTATC
-ATCATTAAGCCAGTTACACACAAAGTAAGCCAAGAAtatccttaatacacaacgagctcc
-tataaatcaataagaaaaaggggaatgatccaagtgtgtggagggagaatgggcaaagac
-attacaaggaatttaaaaaagaaagacaaataggacaataaccatacgcaaagctgttct
-acttccctaagaattttcaaattgaagatgagaacaagaatgaaataccaccatgaccta
-caagatacggaaactgtaaaagactCCGGCACCCTCTTTTGAGAAGGCAATTAGGCAGAG
-TCTATTATCTGTAGCCTGAGGTAGTAACAGcattttacaggaagtgtcctgagttgagag
-aggggtaggcacttgttagaagccacacagtgagtcatgggaggggaggagctagaactc
-agacctctggaTGGGCACCTTTGATTCTTTATCTCCAGCCAGCTGGTCCTCTCTGTCTGG
-GCTAGTGCACAGCCTGGCCCCTGGCCCCTGTCTGGGTAGCCCAGGTCTGCTACATCCATT
-GCTGCACCCTGCTCTGGGCCTGAGGATGGTTGGGGCACTGCTATTCCAAATGACACATCT
-CTTATGATTACCCTGTCCTTCCTAGACAGGAAGCTTTCAATTAGTCCTGCTGGGCAGCAG
-CCTTAGAGGgtagaggtaggactccaaggtttgggatgagacaaacctgttctcaaatcc
-cagccccacctttactccctgggacagttacttaacctcagtttgctcatttgtaaaaGG
-AACACTGTccaggtgcggtggctcacacctgtaatcccagcactttgggaggctgaggtg
-ggaggattacttaaggccaggaatttgagaccagcctgggcaacatagtgagacccttat
-ctctatgaaaataaaaaaaaaaaattagccaggcatggtgatgcgtgcctatagtcccag
-ctactcaggaggctgaggtgggaggactgcttgagcccaagaggtcaaggctgcaatgag
-ctaagatcgtgctattgccctccagtctgggtgacagagagagaccctgtctcaaaaaca
-aacaagattaaaaTGGACACAATCACCCACCCACTGAAAAGCttgttccttccacagata
-tttattgagggcctactatgtgccaggcacttttcaaggcactgcagatacatcagtgaa
-tgagacagaccttcccctcatgaagtttacatcctaagtgggagagggagatcatttcag
-agaacgacagggaattgaatttgggtacacagagtggcaggagggagggcctgggctgcc
-tggaagggcatctctgagatacacaagaaagcactcttggcggagggaccagtgggtaca
-aaagcccagaagcggcaaagaacgtggtgtggaagagagcagcaaggccagagtgcagtg
-actgaggggagagtggtgggtggtgaggtctggaggcagaggggccagacccccaggaca
-catggatgagtttggatggtgctggattttcctggaagtgagttgggaagccactgtggg
-ttgcaagccgaggagtgtctgccaccttgaaagcttctctggtgctgaggggaatggact
-gtggggcaggagtagaagctgggagctcagggtgtatgggctgtggtcattctggtggcc
-tggacgaggctggcagctatgagaagtgggtggatccagggagggtggacagacaagctc
-tgctcatgggttATCATGAAGATTAAAGGGTAAGTGACTCAGTCCACAGTGCAGCACATA
-GCACATGCTAGACAGATCTTAGCTGttttatttatgtatttatttatttttgagacacag
-tcttgctctgtcactcaggctggagtgcagtggtgtgatctcgactcagtgcaacctctg
-cctcccaggttcaagcaattctcctgcctcagcttccctagtagctgggattacaggcac
-ccaccaccatgcctggctaatttttgtaattttagtagagatggggtttcaccatgttag
-tcaggctggtcttgaactcctgacctcaagtgatccacccgactcagcctcccaaagtgc
-tgggataacaggcgagagccactgcgcccagccAGATCTCAGCTTTTAAGAGGCCTAGAC
-CTAGAATCCCATGACTGTGTCTACCCCACAGCCTCCTCCATAAATGCCCCAAATCGCTTC
-TGCCTCTCCTGGTCATTGGTTCAAAATGTGATTCCTTGACCTCTTGTTGCCTCTTGACTT
-TTGCAGCTGCTGGGATGAAGTACTTGTTCTGAGTTCCTCTAGTTGCTATTTTAAGCAGAC
-TGCATACCCTCCGGCCCCCATCTCCCAAGCTGGTGTGAAACCCAAGGCAGTATCTGGGTG
-GCTCCCTAAGTCGTTTTCCAAGTTGAGAATAGGTAGTAGAGTCACCTATTCTCACAACCG
-TGACATTCCACCCAGTCCAGGCTCCCAGACTAACTGCCCAGCCCCTGGAagtagagagat
-gggaggcagcaccaggcagcagggaacccaggtttgagtcccagctctgccaccttgacc
-ctaggaaggccctttgacctctctgagtctctgcacctcttctgcaaaataggaatgatg
-atattaaagaattgcttgcagggtaaagtgaggtaataacctgcggagcacctggctgtg
-tgcccagctcatatggcaaacactcaccaggtaggagGATCCTAAGGTTGTGGGCaatgc
-atacaaagcctctggtgcattgtaggtgctcaataaatggtagGATGCCAGTAGGGAGGA
-GTTGAATGAGAAAAGGGGAAAGAGACCCAGTGCATGGTGGGGGTGGCAGGAACACAGGGA
-GTTGGGGGCTCCACCTTGGAAACCTCTCCTGGCCCTGGGGGCACTATCTCCACCAAACCC
-AAATCCAGGCAGCTAGAGGGACCTGGGCCTGCACAGGCATGGAAATTCTGCACTCACTGT
-TAGtgggcctcagtttcctcatccgcgaagtggaaaccataacccttcttaccCAGTTAT
-AACCTGGATTCTGGGCTGGAACCAAGATAAGCAGCTACAGGCTGTCCTACCCCACCCCCA
-GCTGGAGACGCGGGCCTCTGGGAGCTCTGGCCGATTTTCAAAGGGACCAGAACTGCAAAA
-AACAGAACTAGGCTAATGCTGGCtgagtgttcacagtgtgccaggacctgtgccacccag
-gtccttgtactaaatcattaaaacttgccataaccccacaaggtgggggctacacttact
-ccattggcagggatgagaaaactgaggctcggagaggtaaagggcttggcccaagcattc
-acaggaggagccaggaggaatgcaaaactgagcccagctcctaactACTGGAGAGGAGCC
-TGCCTTGTGGTCCGTCACCCCTCCCTGCCAACCCCTGCCAGCTGGGCTTCCAAAGGCCGA
-CAAATGCTATTTAAAGTCATACGTCTCTCAGGTCCCGAGGCACACCAGGGATGGACCCTA
-AACTGTTTGTGGGGGCAGACAGGAGTTATATCAGCCAAGTGAAGGCAGGAGGGGAAGGCT
-ACTCCAAGTGCCTTTAGTCTGGAACTGTTTGCATTGCAGGGATGGAGCCCTTAGTAGCAA
-CCTCCAGACAGTCAAAAAAGCTGGCTTTGCACACAAACATCCCAAGTGTATGTTttcctt
-cattctttctctttctcttttctttttccttccttccttccttctttccttccttccctc
-cttctttccttcctccctccctccctccttccttcctttctttttctttcttctttcttt
-cTCAGtctctctctctctttccctctctctcttcctGGGGTGGGGAGTTGTTGATGCAAG
-AGAATGAGATGATCCACAAACTGAACTGGTTCAGCCAAAGCAGCCCTCAGCCAGGGGCGA
-GCGGGAAGTGTAAGCTGTTGGCTGAGGATTCTCCTTGTGGGGGATTTTGAGCCCCTGTGG
-GGTGTTGTTCAAGCCAATGTCACTCGCCTCCAGGGGCAGGGAGTCTCCAGCTGATGTCTC
-TCTTAGAGGAAAATTCACTGCTGTTGAGCTTACTACCTCCATCAGAGTAGGGGAAAGGGG
-ACCCCAAGGACAGGGTCTGGCTAGCAGCACATGCTCCGCAGATGCGTGCCAACTGCAGGC
-TGTGATCCTAGGGCACAGTCAGGAAGGGGCGTGGACAGAGGAGCATTGTCGCAACTGAGC
-GTCCCACTAGCGTCCTCAGGAAGGCCCGAGGGCTGCTGCAGCAGCACTAACACTTGGAAG
-AATCCCTCGCGGGAAGGGTGGTCCAATGTTGAGGAGTAGCAGATCCAAGCTCACACTCTG
-GAGTGTGACtttgcttgtttattttaaaagaaggggtctcaccacattgcccgggctggc
-ctcgaactcctgggctcaagccatcctcccacctcagccccgtgagtagctgggatttca
-ggcgagagtcaatgcacctggcTCTGGGGTGACTTCTTGTAAGACCTTCTCATACAGACT
-TTTTAATAAGATCAGAAAACCCAGACCATAAGGCAGAACAAGCCCCCTCTCCCCACTCAA
-AAACCAATGGATTTGACCACACTGACAGCATGGTAAGCAATGATTTCTACTCTCCAAAGG
-TGaggactctacaaagtcagattaaaaaagattttttttgtgtcaaaatgaacatgggat
-tgatatctaggtaatacaaggaagccctacaaattgacaagaaaaattcaggaattccaa
-ttttaaaagtgggaaaaataaaaataaaatgtttaaaaagtgaaaaaataaaatttaaaa
-ttaaaaatcaggtgaataagaattacatgattaaaacaaatttaaacagttaaaataaca
-ttcaaaaacgaaattaagtaacaaaataaaaatttaaaaataaggtataaaaataaagtg
-taaaaatccattcaaataaaaaatacatttgtaaaataatttaaatacattaaaattaat
-aaaaacaaaaatgttaaaaataaaagtaaaatgtttaagtgaaataaaatttaaaaatgt
-aagaatacatgaaagaatttttacgagtaaaataaaaaatcagctatttttaacaatcta
-aagaataaagaaaAACTAATAGAAACATCAAAGGAGAGCAAGGTCTTGCTAGATGGATGC
-TGATGATGTGCTGTGAATTAAGGAGTCCGATTGGCTCAAATGCCTGCAGGGAGGCGGGGG
-AAGTGAATGACGGGGGTGGTGTAGGGAGTGAGAGGGGACGAGGAAGTAAAAGCATGCCCG
-CAGGCAGCATCTGATTCGGTTTTTCCAGCCCGCTGTGGGCAGAGGGCAGGAAGTCAGGCC
-CCATCATGGCTTCCCCCCAAAATAGCCATCACATCATTTATGCATTTGTAATGTGCTGGC
-AACATACGCACACGCACACGGATGCATGTTACATCATCCCATCCTCACTGCCCCATCCTC
-ACTGCTGTCCTCTGAGGTCCACTTTCttttttttttttttttttttgagacggagtttcg
-ctcttgttgcccaggctCTGAGGTCCACtttcatagaggagtgaacagagactcagagag
-ggtgggtcactgtgccacagtcacacagcACTTAGGACCACCCTATCCTCTGAATCTGGC
-ATGCTCAAAATGACCTTCTTTGGATGAGTTAGGTCTGCTGAGCACTTTCAAACAGAGGCA
-GGGCCATCTCTGACATCAGGCTCGAACGTTCTGTACACTAGGAAGAGCCCAACCTCTCCC
-CCCATGACGCATGACAGTTATCaccattaaagaaacactgactgtcttccaggggcgtca
-catgcatagtcatcttgaaaaccatatgaggtagatgctcttattgtccccattgtattg
-acagacaacatcgagattcaggagtcaaatactgtcacccaagcatggcagtaacagaac
-tgggagctgagcccaggactgtccacagcccaaatctcacactccctgcgtggcaccagg
-cCCTTTTAACCGTCATTGATGAGCACTCCCTATGTACCAGCAATGCGTTTGTCTATGTTT
-CATGcctcattttgcaaattagccaacgggggcacagaagggagagatgacctgcccaag
-gtcactcagccagtaagtggcagagccCACAGCCTTCGTGACAGCCTGCCAAGCCCCCAG
-TGCTCATCCGGGACTTGCTAGAGACAGCTGTGCCCACTGGCCAACCCCAGATCAGGCTCA
-GAAGGGCAACTGTGACATTCCTTCTCTTCATGTCTCCACCCTGGCGGATGTGGGCTCTGC
-CATCGGGCTCCAGGGAAAGTGGAGGCTTCCAGTGAAAGGGAGTGGTTTCCCCATGTGGCC
-TGGGTCCTCTGGGCTTGGGAATGCCTCTGTTTTGAGCTGGTGAAACAGAATTTCCCACCC
-CCTCCGCAATGGCACATCAGAGCCCCCACTATGGGCCACAGAGCAAGGGCCCTATGAATC
-ATGCTGCATTACTGCAAGAAATCATTCCAGGGCAGGCAGTGGCGGCCCAGCATGGGACAG
-CAGTGTCCGGGTGGAGTTGGCGTCACCCATCCGGAGATGGGAAGCAGACCATTCCCGAAG
-GGATCTGGAAGAATCTCCGAGGGCGGGGCTGAGGGCAAATGTGTCCTGGATGCTGCTGTT
-CCACCgggctaggaaaaaaagctccagcccacagagacctgggagcacatcacgaccttt
-ccccagcctggctgtgtgtccttggcaagttgattcccctccctgaatgtggaaggcctc
-atctgtagaagagggagaataatagggtcaagccacttcatggggctataatgtgggtAG
-CCTGGGAGGAGGGCtggcatggtggttatggactcaggctttggaatcaattgtctggat
-ggaatcctggtttttgccaaacttactctgccaagctgtgGggtagaaacatgaaattgc
-taatatttggctgtttatgacctagaaaaatggcaactgcatatacttcaaTGAATGTGC
-CTctcttttaactgcttcctcctctgtaaaatgtgggtaataacaggcccctcagagggg
-tgctgtgaggatgaaataagGCTgggaggcaattaagttcagtagttagagctgggctct
-ggggcaaggaaggatttgaaccttggctgagtggccttgggcaaagttacttaaccttcc
-tgtgcctcagttttcttgtctgtaaaataggaatgctactgcccactgcacaggtttatt
-aaggtaatttaatcaattaatacatacaaagtacatagaacagtgtctgAAATTGTTACA
-TAAAAGAATGCAGGTAACATCTGGCATCTCCTGCACCCTCATGTCTACTCACATAAATGC
-TCAACCACGAAACAAAATCCAAAGTGACTTTTGTAAACCTTTGATGCCAATGAAAGTTAA
-GTATTTTTAAAGAAAAAATATGTTTTGGGGAACATACATGTGTGTAGAGATGTAGGTGAG
-GAGTGTGCTCCCCAGGGTCCACCCCCAGGGCTGTTCTATGTCCTGATGGTGCCTATAGCC
-CAAGACTCTGAGGACAGGACTAGCCTTGAGGCCATGATGGCCCCGTGGCTTGGTCTCTTT
-CACAAAATCACACAGCCAAACCTCAGACCCTATGGAGAGGCTCCACTTGCCTAGGTAACT
-CTAGAGGCCCTTAAGAGGCACCCAGCCCTGGGCTGGCCTCTGATTATTAAGAAATTCCTG
-CAGACAGCCTTGGATGTGCGAAAGCCCTCCAGCTTCCATCCTGTCTTAAtttttttttag
-acgaagtcttgttctgtcacccaggctagagtgcagcagtgcaatctcagctcactgcaa
-cctttgctttccaggttcaagtgattctcatgcctcagcctcctgagtagttggtagttg
-ggattacaggtgtgcactaacacacccagctaatttttgtatttttagtagagatggggt
-ttcaccatgttggccaggctggtctcgaactcctggcctcaggtgatctgcctgcctcag
-ccttccaaagtgctgggattacaggcgtgagccactgcgcctggctCCATCCTGTCTTCT
-GACATTTGTCCCAGCCCTGGGAAAAAAGGCAAAGCACACTGAGCATTTCCAAGTCACGCG
-GGGGGAAACTGAGGCTCTGAGAGGCTCTCAACCTATCAGGCTCTGGAGCAGGCTGCCTTC
-CTCTACCAATTCAAGTTTTGCCTTCACCGCTAGTCTCCTgaaccctcacttctactcaca
-gctgggtgaccttgagtaaggtacttccctgcttgagtctccaattttacaaggattggt
-ctcaaaggtctcacttggcctttttggccttatcacttcattattctaGAACCCTTCTCC
-AGAATTTCAGAGAGAAAATGAAAGCTGAATTGCTCTGCAAACTATAAAGTGCTACACAAA
-CAAGAAGGTGGTTAATGGCAGCATTAGATGGGTTTTCAGAAGTCTACCGTAGGCAGGATT
-TGCTGTgggttttggaattaagaagacccagctcacacatgtatttgcgacgttactttg
-gataagccagttcccctctctgaaccaacttccctcttctgtaagctggcggtagaggca
-tatccaccaggcaggactggggtgaggaccaaaggaaaggagcgtgcaaTGTCTGCCACG
-CCCTGGCCGAGCAGAGGTGTTTGATGCAGGAGGAGATTTAGGGCCCCGACACATCATTCC
-ACCTTCCAGGAGCTAAAATCCACACACCTGGGGAATGATGTAGCTGTCAGATTCAGGGCG
-ATTAGAAACAAGCATCTGAACTAAGGCAATTGTTTGgagctccagagacagactctctgg
-gcttacatcccagcacccctgtctgttgctataccacccactgggcctcagtctcctcat
-ctataatataaagatcctcctggaatctgccccttacagctgtcaggagggcctccatta
-ggccatgactgaaaggggctgagcacagAAGATGGGCTCAGCTGGTCCAGCAGCCTCCAC
-ACTATTTTGACAATGGTATCAGTAGACACAGTAGTacacacgtgcacatgcatgcacaca
-ctcacatacatccacatatatgtgcatgcacactcacCCactcatacacccattcacata
-tatgtgtaaactgaaacacatttctcaaaataatagttttcacacttgcaatgcactctg
-atatattctaaaaaggaggttggcaaaaatcgcagcctctggaccaaatttggatgtttt
-tgtgttgcctgtgagctaagaagagtggagtacatgacagattgtatgtggtttgcaagg
-cctaaagtatttactatctgacccttcgcaaaaaatgtttgctgaccccactctatttta
-gtcagtgctattccattccgttctgttccgttccattccattccgttaccattccattcc
-atttcattagaaaatgctggctattgctaaatttattgtcctcacctgctgatgcattgt
-aaacctcagcttggaaaacTTTAAACTAATGGGAGCTTCAGTTTTTTCACCAGATGGGAG
-GATGGATGAACAAACCGTATCCATGTGACACCTTAGCCAAGCAACCTCCCCTCTTTGTCT
-TGGATTCCTCGGCTGAGGCTGAGACCACCACCACCAGCCTGCTCTCAAGGGTGTGTTGAG
-GTGCAGCCTCAGAGGTCTTGTCCATGATGTTCTCATTGACGGATCTCaagagcccaatag
-taaatactttaggctttttgcaccacatacgatctgttgcctattcCAGTATTCTTAGCT
-TGAAGGCCATACAAAAATAGTCCTGTGGCGGCAGAAATGGAGGAACACCCAtctctgctg
-tccttttcaatacccagcccagggcctggcccacaggaaggacccaataagtatttcttC
-ATGGTGATGGTGACTGGAGAGTGGCACCCAAGGCCCTCCATGACGGGACTCTGGCCCAAT
-CTGCAATCAGAACTTCACTTCCTTCGGCCACGCAGTCCCTTGTCCCCTCCACCTGGCCAC
-ACTCTCTCCTCATCCTGCAGAGGTCCTCACCTTACTGCCACCTCTGCCTGACAAAATCCT
-AAATCCTACTCCCCCCGATGGGGTTCCTCTCAGACACTTACACCTTGCAGCCCTGGCAAA
-TCACTGGCATGATTCATTTCTATATCTATTgcacgggcttcggagcctccaaaactctgg
-gtccaggtcctggctcagcagctgtgagctctttggcaggccattgatgctttctgagcc
-tcagttcccgtgtctgggaaataggcataacaCAAGGCAGTGGCAGAGTGAGGACGCGCA
-GCCCCACCTGCACAGCTCCTGGCACATGGCCCGCCTCCCTCCTTCCTCAGTGGCCTCAAT
-CTCAGTGGCCTGAATCTCCTTCAGTGGCTGGGCAGGGGGGTTGGATGGTTTCCGTCCACA
-GGAGAGGGAGGTGGGGCCCCCCGTGGTGGGGCAATGGGATGGAAAAGCAGCATCTCTTTT
-GCACCCAGGCTTGGCTTCAGAACGCTGAGTGGAAGAAGGATGGCAAATGGAGCTCAATTG
-ATTGACCACCTACTATCTGCCAAGCATTCAGATTTCCATTTCTCAACCAGCCCCTATGCT
-ATGAAGAAACCGAAGCCGAGAGACCCAAGGTTACATTCTATTAAGACTCAGCGCCATTCC
-CTCAGCCCTCAATGTCCAGTCATTACCCACCCCTGCCCTGTAGGAATCCCTTTCAGAACT
-ACCCCTGCATCTAAACCTGGCTTCACCTGGATGCCAGCACTCAGGGGACATACTTTGTTC
-GTGCCCAGCGATGGCGCCTGCTTGCCCAGGGCCTGGTGCATCTGTCTGTGTACAGGAGAC
-AGtgctgtctgcctggccctccacaaggggctttgcaatttaaacggaagcatcatattc
-actccacataacaggcctctggagtgggcactgccacagtcaatttacaataaagaaaaa
-caagctcagagagaggagaaggtttgctccggatgcaccacaagcaagaggcagaggtga
-gcttaacccacgtgagaccccactcccttccggtccagggcatgtctgctctgcTGTAAA
-ATGGGAAGGGAAAGTGGTCAAATCCttatgaagcccctactgtgtgcctttggccccctt
-ccctcttggactgcagtaaatcttcccaattgctcagagaggtaggtgtaagttttccca
-tttcacagatggggaagcacggacgggagaaggcatgtggcctgcttaatgtcacatatc
-tagggcaggagagggctcaaggtttgatcccagggctcttcactTTGCCCCTTGCTTGCT
-CAGGTCTAGAAAGATCCAGAAGCTCCATGTGAATGTGGGGGTCCCTCCCCAGAAGGCCTT
-GGATGTCAGGGAAAGTCAGTCACAGGCTGGCATCTCCTCCTTGCCCAAATGGACCTCCAG
-ATCTAGGGATGCGAACCAGGGCCCCCTCACTCTGCCCTACTGTCCCATTGCCAGGACacc
-ccagcatgtttcaaaaaaatgtccccatctggttctgattcatttacacttcattaatca
-acatgctgttttgtaagagacacttgagatccaagaatctttctcaagtcttttacttca
-ttctttcttagaaacagaaaaattgggcttcattaagaCGCAGTGACGCCGGAGCCTGAG
-GAAGGATGGGCCTGTGGGAACCAGGCCTCAAGCAGGCTCAGAGAGGGCAGATGCCAGCCC
-AGCACCTCATTCCTCGGGATTGTGCAGACCTGGCCAAACGCTAAGGCCAAAGACTCAGGC
-ATGGGGGAGGCTGGAGAAAGGTGGGAAAGGGTCATccctctatgttggcagctccccaag
-gacaggcccagggctgctcacctgggtatctccaaggtccccaacacagagcctggcaca
-gaggctgccctgtgaaatgaacaagtgaatgaatgaaGCACTGCCAATACCCAGGTGTTT
-TCAGGACACATTCTCCTGCCAAAGTTAGATAAGGTCAAAGCTGGTAGGACCCTGAGGGAT
-TGTGTACAGAATTTTCCAAGCAGATGCCTTATGAGAAATGGTCTCTGATGTGTAATATGT
-TTGGGAAAGGTCACTCTCTCTCGCtctctttttttttttttttttttgagacagggtctg
-ctctgtcgcccaggctggggtgcagtggcacaatcacggctcactgcagccttgatgtct
-ttcctgggctgaagcgatcctcccacttcggcttcctaagtagctgggactacaggtgtg
-caccaccaccaacatgcctggctattttttgtatttttttatagagacaaaaaatgtatt
-ttttgtagagttttgccatgttgcccaggctggtctcgaactcctgagctcaagctatcc
-tcccatcttggcctcccaaagtgccaggattataggcttgagccatcgcacctggGTTAC
-ACTGTCTGTCTCCACCTCTTCAGCATgctctgataagtctcacagccaagaaatctgcta
-aacccagcatttcccaatctatttgaccagaactCCTGTGGCTGCCTTGCAAAATATGCT
-ACAGGAAGGGTTTATCTAGCTCTGGTCCCCACTGCAGTGCCAGTGGGAAACTGAGGCTAT
-GGGCGGGGGACAGAGAAAATCCACTCACCCAAGGTCACATGATACAACTGGGTCAGGGGT
-GTGACTGAAATCCAAGGCTATCTCCATTGTACCCCAACAAATAAATGGAGCCCTAAGCCT
-CTTCTGAAGATGCTAGGCAGGTGTGTGTCCCAGAGGCAAGAGATCAGGTACTGGAGGAGG
-GATGCTGAGAGCCCCTCACCAAATTGCGGCCATATCCCTACCTCCTCACTGAGCTCCTGG
-GGAGGTGGTGGTGAGCTGTAGATGGGGCGGGGGGCAAAAGGGGCAGGATAGGAATTTTTC
-ATTTTTCTTTAATTTTTTTGTCTTTTTTgagctgagaagcatcttaaagtcttctaaacc
-agctcctttttgttgttgttgttgttgttgagacagagtctcactctgacacccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctctgcctcctgggttcaagcgactct
-cctgcctcagcctcccaagtagctggaattacaggcgcccgccaccacacccagctaatc
-attgtatttttagtaaagacagggtttcatcatgttagccaggctggtctcaaactcctg
-atctcaaatgatccgcctgccttggcctcccaaagtgctggtattacaggcgtgagccac
-cacacctggcctaaaccagctcctctttagatgaggaaactgaggctctgagaagggaag
-ACCAGCACACCTCAGAAGATATCTTCTCAGCATTATgtcaggcagattgggattcgagcc
-tgctttgctactcacctgctgtgcgaccttggacaagtcagtttccttctctgaacctca
-gttccctcatccagaaaacaagcatCTCTCCCCTCCCTCCACTAAGCCACTGTGAGTAGC
-CAAAGACACAGTGGACAGGAAATGAGAATGATTAATACTTACGAGCACCCATTAGGAGCC
-TGTGTCCTTAGCTACTCATCTTGCCCACAATCCTCCTTATGAGCAGGATACTTAAGTAAA
-AGATGGGTTGATGAAGGGAAAGGGGGTTTGTTTGATTTTTTGGTATTGTttagaatggag
-aaagatctcagagatcttctaaaggaccctcagatgggtaaagtgaggattggacaggca
-aagtgacttatccaaagtcactcagttggtaactggggaagctgggatttgaactcagtt
-gacctggctccagagcccatgcccctaactactaAACAAAGGCCATTCACAAAGGAGTGT
-CCCCATAGAGTCCCAAACTCACCCCAGCTCAGCTGAAAACCACACGCCTCTCTAGTCCCT
-TGTCCCACTGTCACAGCAAGAACTGGAGCCTCTTGGGCCACAGTCTCCCCAACCCCATCC
-AATCCCACCTCCCAATTCTCCCACAGCCTCTGTCTGCTTCCTGCTCCGTTCCAGGAGTGA
-CTGTGTCGCTGTAGGGCTTTCACACAAATGGAAGGCCCCAGAGGGCAACCCATCCTCTCT
-CATTTTCCTTCCCCTTTATCCTTGCTCAGACCCGATGCCAGGGCTGGAAAGAGAGAAGAC
-accagctggacaattcagcagttatttaaaccagtctgagccttggaatcccaggcttta
-ttaaaactggacgacccctatgtcatgagcatatagttgggatttgatgagctaggacat
-gaaaaacccgtggcatagtggctggcaTTCGGCTGCTGATCTTAAGAGTGGCACCTGGAG
-GCCAAAGGGCTGCCCAGCTCAGGCAGGCGATTTGCTCACTTGCTCACCCGCTTACCCTTC
-TCTGAGGCACAGGCTCTACCAACTCCTGCTCTGCAGGGACAGCCTCCAACCCACCTTCTG
-AGGATGTTCTGACTCTCACAGCGAGGCTGTGGCATAGGACTCCCAGGTGAGAGCGCATGC
-GGCCCCTGGTACATTTATAATCTGAACCTTGGCTCATCTTCCTAGTGGCCTGAGAGGTGA
-agatggaaaagctgaggctctctgaggggctggacttcttctaggtcatcccctattaga
-ataagtgaacctgaactcaggtctcaggtctggctgaactcaaCATAGGGGGGCCATGGA
-GGATCACTGCCCTCTGGGAGGTGACACCAGGAGTCAGGGTGAGTGATGAGGCTGGGACTG
-GGGCCTCTGGACGCCCAGCCCAAGGCTCTCTATGTCACTTCCTGGCCGAGCATGGATGCT
-TGGAATGGCTTCTACGCCACTGAGTCTGTCTCCTAGTCCCTGTGCCCCGCAGGCTGGCTC
-TTGAGTCTTCTGTCTCTGCACGAAGCCATCCTCCTTTCTGCTGACCATGCGGCTACTACA
-GAGAGCCCTGCTACCCTCTCCCTTCTGGGTGAGTCTCCTTGGCCCACCCTACTCAATGGC
-TCGCTCACTGGGTGCCCTGGAGCCTCAATCTCCCCATCTTAAGTGAGGTTGAGACTCGTC
-TGGAGGAGCGAAGGACCCAGGGCGCCAGGCACCAGGCAGATGCCCCCAGAGCCGCCGCCC
-CCGGTCCTCCGGCCCCCGGTCTGCCCCGCAGCGCCTGCCCGGCCGCCCTGCCCAGCCACC
-CCTTGTACCTTGCTTCTTCCTTCGGTTCAGGGCGAGCATGTCCACGGCGTGGGCGACGAG
-CAGGAGCAGGCAGAGTGGCGCCCGCATCTGGGCAGCCGGATCCGGGCTGGCGCTCCCCAG
-GCGGCCCGACGGCCCAAGGGCCCCACGTcccggcggcggcacggcgggcgcgggggcTGC
-TGTGGGCGCGCCGGGCGCATCCGCCAGGCGCGGGTCGGTCCGGCCGCCAGGTCTAGTGAG
-GGCGTTGGCGGAGCCGGGGCACTGCCCTGGCGGGGAGGAgccggcgcggcgggggcggcg
-cgTTAACCAGCTcggggcccgggagcgcgcgcggggagggggcgggggTCACCCGGGTCG
-GGGCCCTCGAGTTCGATCTGTCCCGCAGCCGGCGGTCTTGCGTCTTTCCCGCCCCCAGCA
-CTGCCCCCGAGCACGTGCACGTGCCCACCGCCAGCCACAGGTACGCACGCGCGCGCAGGT
-ACAGATGCGCGGACACCCGGAGACCCGTACGGTCCCCCGCGCCCTCTCAGCGCCTGTGAT
-TTTCTTTCCCTCCCCCCAGTCCCCTTTCTCTGTCTGTTCCTCCTTCTGGCCCTTAAGGAC
-AACTCCTTGTCTCCTGCTTTCTCGGTCTTTCCGCGGCCCGCGCTCCCCTGCTCTGCCCCC
-GACCCTGCCTGGCTGTTCCTGCATCCTTTACTCTTGCCGGCCGTCTCTCTCTCAGGCTCA
-CTGTCTGTGTCCTCCTGGCTGGGCCTCTGGTTCTCCCTTTTCTCTGTCTCTCCCTTCAAC
-CCCATCTCTCCCCTTCTCCCCTCCTGCAGGGTGGGGTGTTTGCGGGGCTCCTGCTGCCTG
-GCTTTCTCTTTTTCTCTCTACTCTGTCTCATTCTTTTAACAGAGGCCTGAGCCCCTTCTG
-GCCACTAACCCTGAATGTTTCCTGTGCAGTCTGCGGGGATCATCTACTCCGACTCAAAGT
-GACCAGCACCTCATAAATCCACTTGTGACAGGGCTGGGGACCTGGACTGTGTTTCCTCCA
-ACCTTATCACCAGGACTGGGAGCAGCTGGTTCAAGTTTAACCCTTTCAGAGCAAAATTCC
-TCCTTCAACCCGACAGCATGCTCACCTCTCCTGTCACTATAACCACCAAAAACAACAACA
-ATCATGCTagctatcatttgtgaggcatatatggtgggcattgctaagaacttgacatat
-actagagtcttcaaaacaacccaatggtttgggtttgtattctgagtaattccacttttc
-tggggagcaaagggaagctcagagaggccaagtgacttgcccaaggccacacagcaggtc
-agtggcCATTCTGGTCCAGTGCCTGCCCCTCTTAGCCACTTCTCAGGCACAGACTCATCA
-GAATGGAAGAGGCCTTGGAGGGAGGCCTAGAGAAACTTACAGTTGACACTCTCTTGCTGA
-ACAATTGTCCTTCCtttttcttttcttttttttttcttttttttgagatgggttttcact
-ctgtcacccaggctggagtgcaatggcgccatctcggctcactgcaacctctgcctcctg
-ggttcaagtgattctcctgcctcagcctcccaagtagctgggattacaggcacctgccac
-cacacccagctaatttttgtagtttttagtagagacggggtttcaccatgttggccaggc
-tggtcttgaactcctgacctcaagtgatccacctgcctcagcctcccaaagtgctgggac
-tacagacgtgagccaccccacccagccTGTCCTCTTTTTTCCTACATGTGGAGCTTGCTC
-CAAAAGAAATGGAAGGTAAATGCTGGTATCTCCTCCAGCTCCTTCTCCCAGTGCAATGAG
-GGACACTTGAAGGCATGGCAGGGGCAGGGGAAACACACAGAGAGTGTGGCAGCTGAAGGT
-ACAGCCCTGGCCTGGCCATTCTTTCTGTGGGGCCCCAAGAACGCTGGCAGACAACACGGa
-gaacttggtggaatgtcagagacagcccacccaaagtgctccatttcacagatgaggcca
-ctgagccttcaggactggggggtgcctagattaggccacccagtgagtcaaggactgagc
-tgacatgggcatccaggtgtccCATTGTGgtcatcaccatggcctgcaaggacctcttgt
-tctgatatctctgatctcagtctttcccactgccccacccctctctctttagccttagag
-atttcagcccttgaatatttcacaaacaccacaggcctctcacacctctgagcttttcat
-gttgtggggcctctccatggaataccatcctatatcctacctccttcttcactgcctctg
-ctccaggaagccttccctgattctcaggccaggtccagtgcctcctctgggcatccacaa
-tctctttatcacagctctgatcacatcaggtggtaacaatggatgtgtctgttctccttc
-caaactgccatctctttcaagccagagccagacacacagcggtgctcagaatgtttgcat
-aatgagtgcataaataaatgaatggtgaatgaatgaatTCTCCAGATGCACAAGTCTCCC
-AGCCTGTACATGGAATGCAGGTACTTGGAGAAATGAGGTGACCCCAGAAGATCAAGCCTT
-AGGAAAGCGGAGGTCATTCCCTTCCCCACTACCCCCAGTACTGGAGTCTCCAAAGTCCAA
-AGGGGACAGCTTCCATGTGAGCAGGGCCAGAGAGGTCCAATGTGCATTGTGAATTGacag
-ccagccacacggctctgcaggatgaagctgcttaccccttcttgaattttttcccctatt
-tattccccactgcctctgctctagctagcctcgtgtttctcagactcttgtcactcatcc
-tgcggtttttgctgttctctctgcctggaaagtctttccccagatttggggcttgtctcc
-cctcgatgttgcctcctcagagaggccccctgtgaccactccagtaaaacgcaccaccat
-gcactttatcctcttgtcttgctttaccctccgtagtacctgttcatgtctgtcagttcc
-tgtttgcttgtttgtgagttccatgaggacaggaatcttctattttgtccctatgtgcct
-tacactgcagtgattaagacatacttgtggaatggatttttttaaaaaatgagtgaatga
-atAAGCACTCATTCATccatagattcattgtgggacctcaagtactttctgttctcttag
-gctcaatttccccagttgttcaatggcacagatgggattttgtgttctgtgagagcccct
-ttagtgcttccagaattggatatttctagggttcTAAGGCCCAGAACTCAGGGCCCTTCA
-TACCCCAAGATGCTCAGAGGGTGTTTGGTTCTCTAACTATGGGGGCTGTCTGGGCATCTT
-GGCCTGTTATCCAGTTCCCCTACCCCAATACAGGTGCCCAGGGAGGCTAGTGATGCTGAT
-GGCATGCTCTGGCGGGGGGCGGGGAGGGGTGCACCCAAGGGTGTCAGTTAAGGCACCATT
-GTCACAAATAGATGAAGACAGGTATAATGGCTGAAACACACTAAGCTCACAGCATGTGTT
-CCTGATCAGCAGATCCTTCTCTGTGGGATAGCAGGAACTCAGATTCCTTTCAGCTTGTGT
-TCTGCCCTGTTCAGTACCTGGTTTAAAGCTCACCGAGaagggcagggcttatgggaagta
-cagagcctgtctacctatgtcccattggccagaactcagacacacggccacacctacctg
-caagggtgactgggaaatgtagtccagccatgtgccagacaacacacaggaggaaaagca
-agaatttggtgaacatctggccCATTGACCAACGTTGGgccaccctcatttcttgcccca
-gtcatgcagtagctccttcctgtgtctgctctgacccctacaagctcttcttaagcagcc
-agagGACATGTATTATTCATCGGGTGAAGACCAAATTTCTCCTCAGAGATGCAAGGGCTA
-CGTGATGGCCCCTACTAGGGGGCCATCTGCtagggtgaccagctgtctggtttgccaggg
-attgaggggcttcctaggatgCAACGTTGACCTGTGTGTAGCCTTGtataatacaaccac
-aatcaagatatttaaacatacttaaacaagatactaaaacatcatcacaagactccttca
-tggtatccatttatggctccaccctccctctccacttccagtcctaatccctagcaaccg
-ctaatctgttctccatctctgtaatgttttattttttgagacagggtcttgctgtgtcac
-ccaggctgaagtgcagtggcacgatcatggctcactgcagccttgacctcctgggctaaa
-gcttctcctgcctcagctgtgtagcctggactacaggtgcatgccaccatggctggctaa
-ttttttattttttgcagaggtgaggtttcgccatatttcccaggctggtcttgaactcct
-gggctcaagtgattcttccacctcggcttcccaaagtgctgggattataggtgtgaatca
-ccacgcctggcctcccatctctataactgtttttacataaatattgtataatggagtcat
-gcagtatgcatctttttgagatttggctttcttcactcagcacaatttgtttggagattc
-attttagttttgcatgtattagttatttgctttttactgctgagtagtattccaccgtat
-gaatgtaatatagtttgtttaaccattcacccactgaaggacatttgggtattttctagt
-ttttcattattaagaataaaggtgccatgctcacttgtgtataggtttctgtgtatcctc
-tttggtgaaatgtctgtgcatatctttcacacattttaaattggatttttacattactat
-tgtgttttaagagttctatgtatatattctatatagaagttctttgttggttacgtgatt
-tgcaaagcgtgagatttatgtcaaggttcattttgtatttttgtttatttttttatgttt
-ttgtttgtttatttttatgttcgtttttaatttttgtttatttcgaggttcattttttat
-ttttcgtctgcggatgtccaattgctccagtatgctttgatgtaaaagctttatcaaaaa
-ttaattgggcatattggcatggatttattttggggctgtctcctgtattccatgggctat
-gtgtctttctgtctaccaatactacactgtactgattactgtaactatataataaatctt
-gaaattgggtagatggatccttcccactttattcttctttttcaaaattattttagctat
-tctagttcctctgccttttcatatatattttagaataatcttgtttatatctaccaagaa
-tcttgctgtgagtttgattagaattgcattaaacatgtatatgaatttgggaagaattca
-catctttactatattgagtctttcaatccaaaaacatagtatgtctctccatttgtttag
-atcttctttgacttttttaaataaatgttttgtcattttcagcatacaactcctgtgcat
-gttttgttagatttatacctatttccttttttctcccttagaaattatacatggtattct
-attttaaattttgctgtccgtgtgttcattgctagcagatagaaatacaactgatgttcg
-tgtgttgatcttgtatcctagcaccttgctgaactcatatattagttctaggagtatttt
-tgtagatttttttgggttttgcaacattgacaatcatatcaactgcaaatagcgacagtt
-ttctttccttctgatcttgtgccttttgtttcctttacctgctttatcaaacttgctaga
-acttccagccatatgccgagtaagtgtgatgagcatagacatccttgttctcaatcttgc
-ctggttcccaatcttagtgggaaagcattcagtcattcactatgacattagactgtagga
-cttttgtagacactctatatcaccttgaggaagatcctctctattgctacttttctgagc
-attttttaaaattatgaatggctgttgaattttgtcaaatgtttttcctgcacattggta
-taatcatttaatgtttattctttagtctactgatacgatgtattacattgattgattttt
-aagtataaaaccaacctttcttcaatggaataagccccacttggccatggtgtaccattc
-tccattatatactgctgaattctacctactaatattttgctgaggatttttgtgtctaaa
-tccattaagaatattggtctatatttctcttttttgttctgtctttgtctggttttggta
-gcagggtaatgccagccccagtagcaccagaagaacaaggcttactagaatagaattgca
-agggttccaggccaagtgcggtggcctatgcctgtaatcccagcattttgggaggctgag
-gtgggcggatcacttgaggtcaggagttcgagaccagcctggccaacatggtgaaacccc
-atctctattaaaaatacaaaaattagccacgtgtggtggtgcatgccagtaatcccagct
-acttgggaggctgaggcaggagaatcacttgagccctggaggcagaggttgcagtgagcc
-aagatcgtgccattgcactccagtctgggtgacaagagcaagactcctctcaaaaaaaaa
-aaataaataaataattgcaagggttccaacaagtttactgtcattggacctaaagcccac
-aaaagtaaacgagaactcacatgctacatttaaacagggaaactgctgcctgctaaacta
-aagtatgaaataagacctgaagttccaactgatgctaatactaaaatgactcagatgttg
-aaattgtctgacaaggattttaaagcagtcatcataaaaatgctttggcaaggaattatg
-aaatctcttgaaacaaatgaaaacagaaaatctcagcaaagaaatggaagttatataaaa
-ggatcaaacagaaattttagaaatgaaaaataccataactgggggaaaaaactttgctaa
-tggactcattagtacagtggagaagTTCAGtgatggacaaataccccaactctctattga
-atgggcaggatggccggacacataaaacatgccacgctgtctcctgccacaattccccag
-ccctgccatgctgacttcagagggactgagcttcagttgcccacggtgctgtctgggtaa
-cctgtccttcatgggctgcctgcccttcctgtttcactccttatgctccatgctatgctt
-cttgggatcaattctcaaatcaatttcttgaactcaaatccttgtctcagggttggcttc
-tggcaaccccaaaccaagacTAATTCTTACTAATTCTCATGACAACCTATAAGGTATTAC
-AGGTAAAACATGGAACAGCACCTAACCCAGAGTAAGTTCTCACTGGTAACTTTCATGATT
-GGTGCCTCAGTTTTGTTATGTATAAGACAGAGGCATCGAACCCCTCACCCTCTTCCTCTG
-GACTTCTTCTTGTTCTCCTCTTAAATCAAAATCTCTGCAAACCCACCTTTGTTCTTTGTT
-TTACCTGTTCTTTCCCAAGGGAAGGCAAACAGCCTTCTCCCTGTAGGATGCTCAGGCAGA
-CAAAGGAGCTGCTTCAAGCCAGCGCCCCTCCCTCACCAACCCCAGTGGAATCCCAGCCTC
-CACAGTCAGTTGGGTTGTTGTTTTTTATAATACCAGTGTGAAATAAATTGAAAAATTACC
-CATAAAATACAGGTTTTCAGCAGCTGGCCTGAAATTTCTTTCCATAAACAAACAAGTTTA
-AAGAGATGCCTGATGCCACCCGCCAATCCCAAACTTTTATGTCCCCATGTGGCAGTGGGG
-TCTGCCGGGAGATTTGGCCTCCTGGGCAAAGGCAGGCTGCTGGGGGCCACAAGTCACCCC
-TAGGTCTTTGGGGCTGACTTGTACTTCTCAACCGTATCTGTCTGCTCCATGAAGAATCCC
-CCAGACTCATCCCTCATCCCCCAGCTCCTACACTCagcatagacttgggagccaaactgc
-ctggatttgaatcagagatttccacttattcagtgtgacttcaagcaagttacttaatct
-atctctgcctcagtttccccaactgataatgctgataatagtagtacctacttcatagga
-ttgtttgtggattaaattagttaaatatacatgaagttcttaggacatggcacaagacca
-tgctgtataactgttagctattattAGTCGTCCAGGAGGAAGAAAAACTAGGATGGAAGC
-TACAGCAGGAGGCCTAGTGACATTTTGATTTTCCCACAATAAGCTTTCTCTGGAGTTTCC
-TTCAGGGTGTTTACATAAATGCCTGTCCAACACTCTgcagtttgcaaagcttgctacatc
-tgctatctcatttggatcaacatttaagccatggaaggagttaggacagaggttgtgatt
-atccccattacccctagtttacagaagaggaaactgaggcccagtaggtgaattgacttg
-ctcatgatctcaagaaggggtagagccaggaCCCCATTTCTGTAGCTTGAGGATCCGGGA
-CGCATCTTGATTCTTGTCACACACTGAAAGCAGGTCAGAGCCCTCCTGATCCTGCATCGC
-ACACTGAAGCTTGAACCTCATCCTAGACCACAACATAACCCTGGTCTCAGGTGGGGCTCT
-GACCCCATGCTTGACCACAGACTGAAGCCCAGATTAAGCCTCAGTATCGGTTTGAGTCAG
-AACTCTGAATCTCGCTTCACACTAGGCCCTGACTCCAGCCTCAGACTGATTCCTGATCTT
-TGTTATAGGCTGAGTCCTAATCCAGGTCCCATATTGACTCATGATCGTGATTCCACACTG
-TGCCCTAACTCTGGCCCCAGACTGAGCCCCCAGTGGGAGCCTCTAACTTGGAACTCCATC
-TCTAACCCCATCTTGAATCTTTTGTATAAATCCAATTGCCCATCTTCCCCAGGCTTTGGT
-CCATCTACCTGAAAAACAGAGTAGGGAAGAAAGTGCTCAGCACCCTTTGGAGAAGGCCCA
-GGCACCAGAGCAGAATTTACAATCCACCACAGGAAGCAAGACCCTCATCTCATCTCCTGT
-GTTTGCAACTTCCTCCAACTCCACCCCAGCTGGGACAGCCTCAAAGACCCCAGTCCTCCT
-GACGCCAGAACTCTGAGGAGTTCTATTGTTTAGGTGGTTTTCGGTTTTGATTATTTAATA
-CAGTCATTTCTGGTTTTATATTCACAGCTTTGGTCAGCTGGGATAGGGTTTTTCTTCTTC
-CTGTGGTTGAAGTTGTAACACTATTTCAAACAAAGGAAAAATTTTAAAAACAACAGTGAA
-AATATTTTCAAAATATGTTCACAATCAAGTTAATTTCTTGGTAATTGGCTGGGGAAGAGA
-AGGGAAGGACAAAGAGAGATTTTTCATAATGAAGGGACAGCAGTTCTCTGGTGGGCTGGG
-GGACAGCAGGGTGGGGGCCAGCCTTGGGTCTCAGTCTACACAAAGGTGGTAATGGGCTGG
-GGGAGATAGGGATTGGGAGCTGGACCCAGGACAGTGGATGAGAAAAGCCAAGGTCAGGCC
-TCTAAATGTCCCACTCTGGAGGGAGTTAGGACCCGGAGCCTATTTTTCTCTGTGTGCCct
-taattctgggcctcacttttttcatctgtgaaatggattcaataacacctgcccaaggag
-gactcttgaaattaaaagacaaggtggctgcaaagcacccagcacaaggcctgacactga
-ggtgtacaagtaatagtagttGATGCCATCATTATTATTTGTATTCATGGTTTGCCAGCC
-CAGAGGCTgtagaacctggtggtacagggaagcctgagtcagacaacctggattcaagcc
-ccagttgtgccacttactacttatgtgacctccggcaagttgctgagcctctctgacctt
-tggttttctcatccataaaatggggatagtaactgagttgttgtgaggatcgaatgcatg
-actgcatgcaaagcacttagaactgtgcctagtgcatagtcagtgccaagtgtcagctac
-tactATCTGCTCAAAAATATTTCATGCATACCTACTACTTGCAGGTTGTGAATTGATTGA
-TTCTTTTTTCATTACTAAGCACTAACTGTGTGCCAGAGAGCAGTGAGAACCGAAGACACA
-GTAGCTTCTATCAAGGCCCTCATCGCCTGGTGGGAGACTGAGAAGGAAAGAAGGCAATGA
-TGACAAGGTCAAGTAAGTTCTAAAATCCAGGCACAGGGGAGGAGCTGTGGGAGCCTAGGG
-GCAAGGCCAGAGAAGGGTTCACAGGAGTTAAACattcattcattcaacaagtatctactg
-agcactggcccaaggctgaggattcagccaccaccaccacaggtccacatctggccttcc
-tggagcttgcagcctagccggggagacaggaacaatgaagacacacacacttagataaca
-tgatggtggtgatggtgagtgccgcgatgaaaaccaaagccaggggaggggatagagaat
-gacagacatggtcaggggaggcttctctgcaaggtgagcagagatttggataaagtgggg
-gaacgagtcctgtggaggtctggggagggcattccaggtggaggggcagtaaatgcagag
-gcccagaggcctctccatgggctaacgagggaggcagagggagggagggagtggagggag
-caagggtatgtgtaggagggaagcagggcagGAGTGGGAGCACAGTGACTCGCCTGCATG
-TATTCCCAAGGAGATGGGAAGGAGAGGCGAGCAGAGGGGTAAAGGAGAGGAAGCAGGAGC
-TGCCACTTTTGAGAAGCACTGAGAAGAGAAGCAGAGGTGGGTGGGGAGGGGGATGCAGGG
-CCAGGACTGGTGGGCAGGGGCCCTGCAAGCCCTGCTTACTGGAACGGGAGAAGGCTGGGG
-GAGGTGTTCCAACCTTCACAAGCCACAGGCAACCACCGAGTGACATTAGACAGGGAAGGG
-ATGAGATCAGACCCTGGCATTAGAAAGGCTGGAGTTCTGGGTCCTTCATGCTCTCTCCCT
-TAATTCTTACAAGAAcccatttcacaggtggggaaaatagaggtcccagagaggttcagt
-gacttgctccaggtcactctgaaaggacacagatctggctgcctccagctccccctgctc
-cttgagttccctgctgtcttccctggcctctgcctctGGGCCCAAGAACTCCCAGCCCTC
-AGCATCCATGGCCTCCCCCTGGCCCACGAAGTCCTCAGCCACCTCCTTCCTGGAGGGCTC
-AGCCAAAATCAGACTGAGGAAGAAGTGGTGGGCACCCACCTTCTGGCCTTCCTCAGCCCC
-TTATTCCTAGGACCAGTCCCCATCTAGGGGTCCTCACTGCCTCCCTGCAGCCCCTTGAAA
-CTTCTGATCATTCAGCTCCTGGGATGTCCTGGGCAAAGTTATCCAGGCCCAGGTCCCTGG
-CTCGTGGCTCTCCTCTCATTCCCTCAGTGGGTGCCCTGCCCACACCAGGATTGCATTCAC
-CATCCAGGTGCTTGCTGACTCGGgggcaggctgagtgctgatgagttaatgccccccagg
-agcacccctgagtggatgaggatgggagttggtggaaaaacatttcagtcccctcgcccc
-ttgggtgggacagttctgttgccagagttcccagtgggagggatgcccagttgccaacTT
-GATCCTTATCACACCTGTGCTTGCTTCTTTGGGACTGGCTTCCAGGGAATCTATTTGGAC
-GGGAATTCTTGTTTCCAGGTCTGCCAAGATAACTGCCAAGCCTAGTCCATTCTACCTGCA
-AAATAGCTCTCCAACCCTTGCCTCTGTGACTGCCAGGTCTGCCGCAGCCTCCTGCATCTC
-TGTTTGTACTCGTGTAAAGGCCCCCCAAGCTGTCCTCTTGTTTTGCCCTTGCAGTCTACC
-CCTCCTCCCTCCCAAGGAGCCAAAGGGGTTGGGTTTTAAGGAAAACCTGACCATGGCTGC
-CTGCTGTTCTCAGGCTAAACAGCACCCCTGCAAGGCCCACAGGCAGCCCACCTAACCGTT
-TCTCTACATctctgccccaagccacactggtcaccttcccatttttcaaacacatctact
-tatcaccttctcagggcctttgcacttgctgtctcctctggatggaacactcccagtctc
-ccatggttagctcattccaggcttcagttcaaatgtcacctcctcaaagaggccttccct
-gaccatgcgatggaaactcccatccttcaccactacgcttggcttagccctcttagcttt
-gcttcctctcctttgaactgtttcccatgatctgaactagccttgtttgtttgttGTGAT
-GACGATTGAGCCCCCCAAAGCAGAGAACTTGTCTGCACACACTGGGCATCTGGCTGGCTG
-CGGGTGTTGAGCTGTGAGATCGGCTATGTTCTTGCCCTGCTGCAGTTGACCGTCTGGTTG
-GACAGGGGCTGGAGGGATGAACCAGTTGTGGAAAATGCCACAAAGGAAGAGGAGTAACCG
-GCTGCAGGGAGAGTGGGAGGGCACACTCACTTGGGTGGGTGGATTCTGTGTAAGAACAGG
-GACCTAccaaggtgggcagatcacttgaggtcaggagttcaagaccaccctggccaacat
-ggtgaaaccccgtctccactaaaactacaaaaacattagctaggcgtggtggggcacgcc
-tgtgatcccagctacacgggagactgaggcaggagaatcgcttgaacctagaaggcagag
-gttgcagtgagccgcgatcatgccgctgccctccagcctgggtgacaagagtgaaactct
-atctcaaataaataaataaataaataaataaataaataaataaataaaataaaGTGCGGC
-TGCATTTGCCTCCCAGGGCAGCCCAGGTGTAAGCTATACAGCTTGGTGGAATGTCTCCAT
-GGCTTCTAGGGGATGGCCCAAGAGAGTTCCAAACACATCATATTCCAGTGAATGGGactg
-gtcagcccacagccacatggccatgtccagctgcaagggaggctgggaaatgtaatattc
-tgcaggccacccatgtgctcagataaaaataaagagaatattattcaagagaaagggaga
-cagagtgtgggggatgactgatgatccttgccataAGCATCAGCAGGAAACCACCAGCCC
-CCACTTCCCTGTTTCTGCATGTCTGTTATTTGGTCCTTCCTGTGTGTGATGGAGGGAAAG
-ATGGCTGTGTGTGATGGAAAAAAAGATGGTCCTGAATGAGCCTGATTCCACTTCTGGGTT
-CCCACACCCTCTGGTAATTCCCTCCTTTCCCCCGTTTCTGCCCTGTATCTCCTACAGTGT
-CTCCAGCCCTCCTTCACTCCATTTCTCCCTCTCATCATAGACTGTCTTGGAAGTTCTGCC
-TACAAATGTGGCAGCTGCTGTCCCACTCTTCTCTCCATCCCCTCTGGAAGCCTGGCCTCT
-CCCCAACTTCCTGCTCTGTTCTGTAGCTCACTCAGCGAGGACCAGTCCCTCTCTGTCATG
-AGATCCACTTTTTCTCTCCAACCTCCCTGTGGGCCTCTGTCCTGTCAACATCCCTCCTGA
-CACTCTCTGTGACATTTGACCACCTGCTGGAATCAAAGAATGTGGGCTCTGCAATCAGGC
-AGGACAGAAATGaagatgcttcccctttctcagcctcaatgatctcatctgtaaaatggt
-gtgaagaatgtccacTAACTAATTGAAACAAATTTTTATTTGCAGCCATGACATACCATG
-CATTTAAGTAAGCCCATATGAGCACATCTGAAGGCAGTGATAATACAATCAATAATACTA
-CTGGGAGTGCCTAGCTCTTACTGAGTGCTAAGCTCTTCAGCACGTCAGCTCAGAAATGTG
-GCCCCTCCCATGGCCCCGCCTGCACTCTTTTCTCCTTTTTTGCTTAACTTCCCTTTTGTT
-GCTTCTTTCTTGAGTCCATTTTTGGCTCTGTTCTCTCCTCATCTCTGCAGCTTTCCCAAA
-TTCTTTTTTAAAtttttatttatttatgtatgtatttattttgagactgagtttcactct
-tgttgcccagactggagtgcaatagcatgatctcggctcactgaaacctccacctcttgg
-gttcaagtgattcttctgcctcagcctcccaagtagctgggattacaggcgcacaccacc
-ctgctcagctaattactgtatttttagtagagacagggtttcatcatgttggccaggctg
-gtctctaactcctaacctcaggtgatccactcgcctcagcttcccaaagtgctgggatta
-caggcatgagataccacatccagccAGCTCTcccaaatccttttcccagctctgacatgt
-tgccacacttcatctacctggctggacacctccacttgaagtcctgtggacatctcaaac
-ccagggtgtctaaaatagaactcagcctcttcccctgcaggcttCCAACTCTGGAAAGGG
-CCCAACCACCTACCCGCTGGGTCTGTGAGCCAGGccttcctctcaggcccctcctctctt
-cccctggccccagcctccttccccacttccccacccttccccaccccAATGCACATACAG
-TTGCTCAATTGCTAGTCCTCACATACTGCATTGTGTCACCCCACCTGGTCATTGTCCTGC
-CCATGTCCTCTCAGCACTCACCTTTCCATGTCCAAGGAGTCTTCTGCAAACATCTGCAAC
-TGTCTGaagccaaggtgctggagaactaagagagagtccccaagcagccctcagccaatg
-accgatgggaggtggtggataaataccagccccctgccctgagttgggagacctgaggtg
-tgctcttcactgtctcaagaggacctcaatggggctgagctcccgttgcccatattagca
-attcacttattatgcatcagtggcttcagtggtttactgcagtgtcttcattgtctcTGG
-GCCACATAATTTTATGGAAGTCACAGCCCTTCTCTCTAAAGTCCATCTATGAAGCCACTT
-TACCTCTGTTTGAGAAGCACTGGTCTCCAGGATGACATCTATACCCCTTACCTGGCATTC
-AAGGTCAACCTGCTGACTCCACCATGTGTCTACCCTTCCATGctttgctcatgctcttcc
-ctcctgcctgaaatattcatcactttgcttaatgcttgtctgagttgcacctatccttca
-agactcagctcaagttcacttcctccgggaagcctttcAGACCACATTAATCCTTCGAGT
-GTTCCCCACAGCCCCAAGAATCTGCTCCCCACATGTGGCACAAATAGTGCCTTGGGTCTT
-ACCTGGtttgttccttcagcaaaccaaggttaagttagcattttctctgtgcaaggccct
-gagagctgggagagctggagacatgaggtgagtcaacacagaccctgctctgaggtctgg
-gcagtccagtcgaaagacGTCCAGGACATGGGGTTGGGCATTCCAGGCAAGACCATCAAC
-TCTACGAGGAAAGGGATGATTTTAATTCACTATGAGAAATGAGTGAATCATTTATTTTCT
-TAGCTTAAAACAGGGGGTGGACAAGAGACTGACtctggcccaccatctgtttttataaat
-aaagttttattgaaacacaactatatttcttcatgtatcacctatggcctttacactaca
-atgtacgagtaattgtgaaagagaccacgtggaccacaaacactaaaatatttactgttt
-ggacccttatagaagttccctggccctggcttgaaacactaatacttgtttattatttca
-cacagtttctgaaggccagaaatttgggagtggtttagctgggtggttctggctgagggt
-gtctcaggaggttgcagtccgcagggctgtctgagtctcatcataacacagcagctggtt
-tccccAGTGAAGACTTccatgctaggcacctcacacacagcctcatttaatcctcataaa
-catccttaaaggacagctatgattattacctacatttctcagctgaggaaaccagagctc
-agagagaggaagttatttccctaaggcaaggacagacctaggactggagctcaggttcct
-ctgcctccaaagccccgctcctaaccactgggctgtccttctgAGCACCACGGGGTCCCA
-GCAAATGATCTGTGGCTGGGGATCCAGGATCATTGTGATTTGACTCAGATGTCCCTTTGC
-CAGGGATATGGTCCTACTCTCCCTCCAGTTACCTGCTCCACAGGTGGGGTCCACCTTCTT
-TCAGACCCTCTATCAAGTGAGTCAATGGTACTGTCCAATTCCTTCCCAATATCTTTGCCA
-TCCACCCCCACTCTTTTCCAGCCCCACTGCTTCGGTCTTACCTCTGGCCGTCTGGGCTCC
-CATCTAGAGACAAAGTCAGGGGAGGTGATGCTTTCTGCTGATATTCCTTGATTTTTTCCA
-CCTGATTCACTTTCAGCTCTCCTCTGCCCATCCTCTCAGAAGATGGATATGCAAAAAATG
-ACCCCAGAGCCATAGGAAGGCCCCAAATGCATCCCAAAGTACTGCAGATGATACCTCCTG
-ATCAAGCCCTGCTGCTAATCAATCAATAGAATTAATATAATTATACAATTTCATTTATTC
-AGCCTTCTACCTTCACaaatgcctggaccttggtttcaggtaaactggctcgagttcctg
-cttggtctttgccaacatgtgtccatgggcaggtcttagtctttcctttggcctcagcct
-cctcatctcaggattgctagagggggttaaaGGACATTGCATTGTAATTTGCTTGTTTTC
-ACACTTGGTACATAATACTTGCTAGAACCATGATGCAAAGAGCAGTCAGTCCGCATGCTT
-ATAAGGGAAGCAAAGATGTTCAGCATTATAGAATGCATGGCTAACATGGCCCCAAGATGG
-TCCAATGGAAAGCTCTTCTTCTAATCAAATAGTGAACAATCCAGGAATAACCAAAGAAAA
-AGTtcatcttattatttgttttcacagcagctccatgaggcagaattaattttgtgtgtt
-ttgcagatacgggaacagtaggtgagagcatgagtaactcagctcaggtcacacagcagg
-tgggagagaactggaacaagaacccagtgctctttctgctctacccactgacccATCCTC
-TCACGCATCATACACCCATACTCccatccacccaccttcccattcatgcattcacccatt
-cacccaccttccatccatctaccatccaCCACGTACCTACACTCCCATCTACCATCCAAC
-CACATTtccattcacccatcctcccatccatcaaccctccaatccaccacccacagacct
-tcccatccattcatttacccatccacatattcacccaccctcccatccatccatcTACTG
-TCTATCACCTACTCATTTTCCCATCTGCTATTCACCCCCACCCTCCTatccatccattca
-accatccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccat
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-accctccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccac
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-acccTCCACCcatttatttgacagttgctgagagcctactaaccaccaatcactattcca
-ggcactgagatatgactttgagctagacaaagtcttgcttcatggagctcacattttggc
-tgtgaatggcagcaacagacaaataaatacgtagtttacgtgaggtactgcaaagaaaaa
-ataaagcaggggagtgatgtcaggagtaactaaggcaggatggtagtcagggaggtcgtc
-tctgaaacgggacatttgagcagaagcctgaaggaagtgagctccctgacaacttgggag
-aagagaatttcaggcagagagaacagttgtacaaaggcccagtggtaggaatagaaacag
-cttgatgggattaagaatcaacaaaaaggtcattatggatgaagcagaatgagggaggaa
-acccaagccagctcgggcttgatcatggcaggctttgtcagtcactgtgagtaaccagac
-tttatttcaagtgagttggCCAACAGTGTCTCCCCAGTAGTAGAGTGATTGCTCGTCTGC
-CAGAAAAGGGGCACAGAGCTCTGGACATCAATACTTGCCGATCTCTCCTTCATCAGCCAC
-CCAACCCTGGCAACAGTTTTCAATTACACCTGTGAAAACTTGTGGGTTAAACAGCTGAGA
-TCCATGCCTCAGCTTCTATAGGTGATAAGCCTGTCCTTCCTTAGGTAAAGAAAGGAAGGG
-GCGAACCGTCAGtgagcaccattcacataccttagccggttcagcttcaccaccctctga
-aggtgccatcagcagctcccttttgctgaagagtaagcggaggcccagagaggtcatgtg
-gtgtgtgcttgaggtcacatggctgagaggtggcaccagatttgcccaactctcaagtcc
-catagtctaacgtttcactccacTCAGATTCAACCTCCcaagaaattatttgtttgagta
-cctactaggcaccagactcagagtgagaggcagttgcagattcactcagggccagttttg
-gaggccagcttcacaatcacccagcacagcccatctttctacttgtgaggaaacagaggc
-tcagtgaaggaatgcctttcagatcacagagaggatgaagccaggatattcaaacccagc
-ttattttACTACAACTCTATATGGTAGGAAAGAGAAAAGCGCCCATACAATTTCAGTGGC
-TTGACGTGGAGCCTGGCAACAGATGTGTTCTTGGACTGTTGGCTATAAGACAAACCAGCT
-TTCCCCACTGACTGTCACCGTGTTTTGGGAGACAAAGCCTAGGACTTTGGTGTGTCCACC
-GTGGGTCAATAAATGCCCCCAAACAAGCATATCTTGCAAAAGTGGGGACTTATTAATTCA
-TTGATTCGTTTCTTGATTGATCAATTGATTTATATGTCCCTGTTGGACAAAGGGTTTGAG
-GCAGCCTGGGAAGGAAGTGAAGTGTGGAAACTGGTCATCTTCTGTGCTTCTTACATTCCA
-CTCATTGGGAACATCAAAAAATGAAAAAAAAATCCAGCTGCTACATAGCTGGGGAACAAA
-TTCTTGGTATGGAAGTAATTCTGCTAAGGCTAGCCTCCTCAGAGTAATTCCAAATGCTTT
-TCCTATTTTCAAATTTAATTAGGAGACATTTCTGTAGTGTGAGTCATCATTTAATAATGG
-GGGGTGTTTATTAGGGAATGagtggaaagagaacaggacagctggataattcaaatccca
-gttcttcaagtctctggctgtgtgatcttgggtgagccacttcacctctctgaacatcag
-ttttcttgtctttaaattgatatttacctggcaaggtttggggaaggtctcaactagatt
-atgtacataacaagcttgccagtgttagtacataataggtgtttaataaatattaactGC
-CTTCTCTTCCCATTTATTTTCTTATTTGGTCTTCTAAACAACCTTGGGGACCATGATAGG
-TATGTTGTTTGCTTTCTCTAGCATGAAAACAGCCTCCCAGAAACTACTCAGCCAATCCTC
-TGAAATGGTATTTCCGGTCAAATCTGATGCACCTTCTGAGACTTTTTTTTTTTTGTCTTT
-TCCAGTAAAGCCAAGCACATAGTCATTGTTAGTTTTAAAAAATGTATTTGGATGGGGTAT
-GAAGTTCAGAAGAGAAAGACATTCCTGGTTGGGTTATTCAAGCAAGGATCCCTGAAGAAG
-AGATGCTAGCATTTGGCTAGGTGATAGGAAGGGGACAGGAAACAGCAAAAGGCAGGATGT
-GGAGGCAGAATGAGTTGAAAGATGCTGTTATTGAAGGCGATGGTGGTAGTTTATCCCTGA
-AAGCCACCAAGAGCTCAAGAGCAGGAGGGAAGAAGATGAGTTTCTGTTGAAGAAAGACCA
-AAGTCACTCACTGGCTGATTTGTGCTTGGGAGGAGCATCTCTTTCCCCTGCTGATTGGGA
-GTCTTTTGTTTCCCTGGGACAATAGGCACTGGTCACTGAAGAGTGTGTCTGTCCTCCACA
-CTTTCCCATGTTCCTGTCTCTGGGGAACTCCTCCCTGACTCCGAGAGACAGGATGGAGTT
-GTCAATCAAGATGTCTGTCACTTTGCCTACCAGGGGAGAGCTTTCCAAGTGGGGCCCTGT
-TTTTCTGCTGGGGCTATAGGGGAGGGTCTCCATCTTCATGtgtcaggatgtagccttggg
-gctgctggtgtcatatttatgccacatggaatgaagctgtctgaagcaggaaaggatgat
-attaccaagcaaaaagagatgcaaagctgagtgtggacggaggcctgcttctgatcctgt
-ccatgtacttggatcaaaccatgcctgaactccatttggtttgcaccttatggggcaata
-agggaataagtaattctctttgtttattcaacaggatttctgtcacttggcaattctgat
-taatacaGACTTCTGATTAATACAGTTGGCAAATGAGAGACAAGTGATCTCTTcagaaat
-ggacagagcaggaaaggaacccaccaagcatggagaggttgaatgagagtctcttcttcc
-ccattgactcactgcagccctggatcaggttgctgcccttctctgggactcagttttatc
-atctgtgaaatgggCTGCAGTGAGTGGGAAACAAAAtcatttatttatgcccaaccttgt
-tgcaaaaatgatttaagacagcttacaaatgtattaaagccagagattaggaaaagaaag
-agataatgaaattgtgagaagggggagaaaaggtgaactcaaggatgaggttaggttatt
-gaatgcctgctgtaaagttctggacagttgctaaaggtgaacagacaagtttgttctgag
-attctttgtagccaaagcaagaaaaagaaaatgcagttacgtggatttgtaggaaaaaaa
-aaaaaaacaacccggttcctgagaagaagcccaacttttcttagaataaaagtctgaaac
-aattttccttgtggttccccatcaaaaggactttgtgaaataccatgagcaaATATAAAA
-ACCAGAcaggttgagtatcccttatctggaatgcttggaaccagaagtgtttcagataac
-agattcttttggattatggaatatttgcatatacagtcctacctcgggtataggacccaa
-gtctaaacacagaattcattcatgtttcgtgtataccttatacaagttacctgaaggtaa
-ttttatttttctgtgtgttgtgcacctgcattttgactgcaacctgtcacgtgaggtcag
-gtatagagttctctacttgtggcatcatgttggtactcaaaaattttggattttggagca
-ttttcaatttcagattttcaaattacaggtgctcaacATTTAacaggctggggtaaatag
-ttgcaacatatttaatagtcggaggattaaaatccacaataaaataagagctcccacaaa
-tcaataaggacaaaggaaaaaaacactccatcaataaaatgggcaaaaagggataagaac
-acaattcacaataggggaaatAGctatcaaattagaaaaaaatatcagaagaatgggtaa
-tatcagtgttggtcacagtgtggggaaataggcatgctcagacacCttaacttactttta
-gcgtttctcgtcacctgacacaccatatatatacgtctctacgtgttggggatctctctc
-tctgaccagattgcaagttccatgagagtaaggactacctcctcatcactgctgaattcc
-cagaacctagaacagtgtgcccagaacagagtagatccttgataaatatttatcaagtat
-gtgagtCAATAAATAAATGAGTGAATGAATGGACAGTGTGTAAACTGGGGTCATATAttt
-ggcaggcaatttggcaacatttattagaatgaaaatgcacaaacactgatgcagacattc
-ctcctttagccatacgctcgactgagacatacaaatattcaaaggaatgggtcaaagagt
-gtttttgtagtgctgtttaaatggcaaaagttggaaatgacctaaatgccaaacaatact
-acactaataaagttatggtttattctgactgtgaaatattgtgtgttcttctttaaaaaa
-atagtgttttcatactgatgtggtcagatctccaagatacattatcaaaagaaaatagca
-agtcacagaacaataatatgtaacatttacggtaaaaaCAAAACAAACTTTccaggcgca
-gtggctcacgcctgtaatcctaacactttgggaggctgaggcgggtggatcacgaggtca
-ggagattgagactatcctggctaacacggtgaaacctgtctctactaaaaacacagaata
-tcagccaagtgtggtggcacgcacctgtaatcccagctactcgggaggctgaggcaggaa
-aatcacttgaactcgggaggcggaggttgcagtgagtcgagatcacgccactgcacccca
-gcctgggcgacagagagagactccatctcaaacaaacaaacaaaaacaaacaaacaaaaa
-acaccacaaacaaacaaacTCAGTCTGTCTGGTTAGCTAGCTActatctatccatctatc
-tatccatccatccaCTCGCTTACATTGGTCAACCTATCAGTATAAACAAATAGAAACATA
-TCTAGAAGGAAATACCAAGCTGTTAACAGTTCTTCAGAACAAGGGAATAAAATGTGGAGG
-TTTACACAAAGGGCTATTTTTACTTTAAAAATAtatttcagtataatatgcacttaatgt
-gcatagataggttggcaaatgataaagctttacaaactgtatttatccctgtcagcatca
-ctcagatgaagaaagagatatgaccagcaccccagcagccctactgttatcctctcaagg
-aaaactatcactgcccttctattacttttatcaccctagactagttttgctaatttttgg
-actttatataaatagaatcaaaaagtggatacaattttgtatctttcatctttggtgcaa
-tattctgtttatgtgaATATTGCCAAATGGCCTGACACTCCAACCAGTGTGGCAGAAGGC
-CTGTTCCCCCCATGCAGCCACCcaatacattttaactaacctgtagtctgtattttgttc
-agtcccagtaatgtcctttacagctttttttctagtttgggattacatgttgcatgtagt
-tgtcatgtctctttagtatcctttaatctggaacagtttctcagcctttctttgtctttc
-atgatgttggcctttaagaaaaatataggttagttgttttatggaatgtcacatccctca
-ctttgggtttgtgtgatgtctcctcatgattagactgaggttatgcattttgggcaggaa
-tatcttgtaaatgatgctgtgttcttctcagtctatcacattaagaggtacacaatgtca
-atttgtccctttattagtgttaactgatcatttggttaaggtgacatccagtttctccac
-tgtaaagttgtttactttttcttttgtaattaaaaagtaattttaggaagctactttaat
-atctttatctattaaatatccttttccttgtcaaaGCCATGGTATGTTTAAAATGTGaat
-ttctttctaagttcaggggtacatgtgcagatttgttacacaggtaaacatgtgccatgg
-gggtttgttgtacagattatttcattgcccaggtattaagcctagtacccattagttatt
-tttcctgatcctctccctcatcccacgctccaccctccagtaggccccagtgtgtgtcat
-tctcctctgtgtgtccatgtgttctcataatttacctcccacttatgagtgagaacttgt
-ggtatttggttttctgttcctgcattagtttgctaaggataacggcctccagctccatcc
-atgtccctgcaaaggacaggatctccccttttttatggctgcatagtattccatggtgta
-tatgtaccacattttatttatctagtctatcattgatgggcatttaggttgattccatgt
-ctttgatattagtgctgcaatgaacatacagttgcatgtgtcttcatcatagaacaattt
-atatttcttctttttttttgtttgagacagagtcttgctctgttgcccaggctggagtgc
-aatggcacaatctcagctcactgcaacctctgcctcttgggttcaagtgattctcctgca
-ccaccctcccaagtagctgggattacaggtgcccaccagcacttccggctaatttttgta
-tttttagcagaaacggggtttcaccatgttggccaggctagtctcaaattcctaacctca
-agtgatctgcctgccttggcctcccaaagtgttaggattacaggcgtgagccaccgcacc
-tggcctttacattcctttgggtatatacctagtaatgggattgctgggtcgaatgatctt
-tctgtctttaggtctttgaggaatcgccacactgtcttccataatggttgaactaattta
-tactcccaccaacagtgtactgagcattcctttttcttcacaaccctgctagcatctgtt
-attatttgattttttaatagtaaccatcctgactggtgtgagatggtatctcattgtggt
-tttgatttgcatttctctaatgagcaatgatgttgagctttttttcatataattgttggc
-tgcatgtatgtcttcttttgaaaaatgtctgttcatcttctttgctcacttttttaatgg
-ggtagttttcttgtaaatttaagatcctcatagatgctgggtattagactgtggtcagat
-gcataatttgcaaaatttttctcccattctgtaggttgtcactttgttgatagtttcttt
-tgctatgcagaagctctttagtttaattatgtcccatttgtcaatttttgctttcattgc
-aactgcttttggtgtcttcatcatgaaatacttgcccgtgcctatgtcctgaatggtatt
-gcctaagttgttttccaggatttttatagtttgtgttttataAAATGTGAATTTCTTAAT
-TGAGAGTAATGGGAAGCATTTATTCCTGTGCTCCTGAGTCACCGGTTTTCCTTTTTGATG
-AATTTTGATAATCATTTTTTCTCACTAAAATTTAAAGGTTTAATTTTTAAAAACTGAATG
-GTTTAAGCTTAGCCCTATAGTTCTTGAACCATGATTTTAATAATAATGATTTTTTAATCT
-TCATTGCTCTAGCACCTTTAAGAAGGATTCGTTTGAAAATTCACCTGTGTCTCAACCCAG
-GAATAGGCTTGGCCTTCCTTCTCTGATGGCAGCCAGGGAGCTTCCTCCCATATACCGTGC
-CCACGGGAAGGAACAGAAATGCTTCCTGTCACTCCCAGGGGTCTCCAGCTGTCATAAGCT
-GCCAGCTGGAGGTGGTCCAAGCCAAGATTACAGCCGGCCTTTATCCTATAGTTATCACCC
-ACAAATCACCCCCTATCCCCAACCCAGGGGAGTCTCTCTGTCCATTCCATACCCCGGATA
-CTGAACTCAGCTCCAGAACCAGGGACCTCCTGCCCATTCACGATGGCCTTGAGCTCCCAG
-TGCTGTCCCCACCACTCAAGATTGTCCCATACCACCTTTCCCACCCAGCCCAAACCTCAC
-AAGCCAGGTGCATGTGGTGGCCTCTAGGGAAATGAGGTTTCAAGGTATTTTAGCCACAGA
-TCTCTTTGCTCAAATAAAGCCCTACACAGAACCCCAGCCCATTCAACATTTCAAGGTGGA
-GCTGAAATCCTTTGTGGGTTCTATTTTTCTCTCTTTGCAAAGCATTTCCAGCTTGTGGGC
-TGATTGTCATATAATCTAGACAAGTGTTAATTAAAGAAATCACTCAGAGCCTGTATATAC
-AAAAGGTAAAAATTTTAAAATCTTTACAGCTAAAAATATATTTAATGTGGTACATTTAAA
-AATATTTGATACAAGGTGGGGATCCCAAACAAAGAGTGCCAGGGGCCTATGGTGAGCCAA
-CCTCCCACACCTCCCAAATAAATCAGTCATCTGGCTTTGTCTATCTCTACGCTCTTCCTA
-TGAGTGTTATCACACTCAAATTGCATATTGATGGGATTAACCCTTTAAGGTCTCTTTCAC
-TCCACCATTGGCTTAGTGAGGCAATCTAGTCCATCATTGTCTCCCCAGCTCTGAGAAGCG
-AGCACTATCATAAAAGAAAAGAACTATTATACAAGAAAAGATTGCTACAGTGAACTAGAT
-TAATGTTAACAGGCTCCTTGAGGTAAGATGCTAAAAAGCATCAGAATGAATGAGTGAGTC
-GATAAATGAGTGAATCCACACTGTTGCTTATGAGGTCTGTGGGTGATGACGCCCCATGTG
-CATGGCAGTTTCAGAAGGGCTTTCAGGGTTTAGATTCTGGGGAAAGGAATCCACTTCACA
-GACCCTGCTGGTGCCGAGCCACTTCTAAGAGACCAAGGAGCCTGGAGCCACCCCATTCCT
-CCCAGGGGGTGGGGTTAGTTGATGCTGTCTGGTGAGTGACCAATCGCATCAGCACCTCTG
-CTGACCCCATGGGACTCCGCTACCTTCTCTCCTGGACTCCTAAAACTGCCATTTCTCTGA
-GAGGGGGAGGAGGGCTTCTTGCTTCCAAAAGGACTAAGCAGGGTTCTGGCAATGGGGACA
-GGATAGTCGTTCCCTGTGGCAGGCTGATGTACAATGGGATGGTCCTGGGGCCACATCTGG
-GCACAGACCCCCATTATCTTTAATGGTGCTCTTGCCAGGGGGACACTGCAGAGAGGAGTC
-TACCACGAGGAGACCTGCTCTCCCCTCCCAAGCACTGGAGCAACCTTGGCCCTGCCCAga
-aaaaggcagctgtagggaaatggagctgagtttaaatgcccactgggcacttagtagcca
-tgtgaccttgtgtaggtgactcctcctcttcctctctgggcctgagtttcctcctccata
-aaatgaggcagtcatctttgcagctctgcacccacaaagtgccattgtgagggtcaaata
-agtggatgtaaaagggcttgcagagaaccctgcagatggaaggtgGACCTTTATAAGGGA
-GAAATAAAATCTTATTAAGGAGAAAATAAATTCCCAAGAATGAGCTGCCCAGCATCTTTA
-AAAGAAGACTGCAGAGTGGACAGTGCTCAtacctgaaatgttttttttattcctctacca
-gtcagcctcctacacatcccagaggaggcagtgccttccccagaaagccctgccaggctg
-cactctgtcctcccatcctgctgcctccagcacaatgctcatatctgactgtctgtctac
-ctgacatctcccccactggtctggtgctcctttgggaaggaactgtatctgatgcaacca
-ggaatttcagctcttagggcagagtctggcgcatctgaggcacacatcaatattCTGAGC
-CAGACTGACTGGCTAGAGTAGAGCTAATGGTAGAATGTCGGGGGCTGGTGCCTAAGGTTG
-GGGTAACTAAAGACGCAGGCAAGCCTCACACTCCCTTCCTAGAACCTTATCTGATTACTT
-TCTCCATCTAGGTTTGAGACGAGGTCTAGCCGATCCTGCCTACAGGCTGAGTGAAAGCTC
-TTTAAGGTAGgggtgaccagcttttcctggtctgctcaggactttcctggtttgagttct
-aaaacgtcccatttcccaggtaaaccagggcagttggtcatgctaCCTTAGTTACTAATT
-GATTCTCATAGTAGACATTGTAATTACTCACTGATTGTATATTACGCTTCTCCTTCCTCC
-CCCTTTCCCAGGCTGGCAGAGcccatctcttaggacagaggctgaaaacggaagatagtt
-tcccagcctctcttgtggtgaggggttgccatgtgaccgagttttggccaatgagacaaa
-agggaaagtctgctgggaacttctgggaaggggttttttctctctatctaccttcacccc
-ctctttcttcctgctttcggtcgtgagaatgtgatgattagagctgtgacagccatcttg
-tgaccacaaggaaacatccttaccacactctgaggggtaaaacgaaggacagtaaaagct
-cgacactttgatgacattgttgatcctctgaaCGACCCTAGGACttgaacaacattaaaa
-tgttacatgttgtttatcaaaagacatcattagaataacaaaaaggcagcctctgtgctg
-ggagatgatatttgaaatctctccttgaaaaggactcgtatacagaatactcaatgatag
-ataactcagttgttaaaaattggggcaaaacttgaaaagaaactctagaaaagagaaaat
-taaaatggccaataagcaaagcacacaaaaaggtctgaacatcattattcatcagggaaa
-tgcaaattaaaactacagtggggcccgggcctgttggctcatgcctgtaataccagcact
-ttgggaggccgaagcaggcatatcacctgaggttgggagtttgagaccagcccgaccaac
-ttggagaaaccctgtctctactaaaaatacaaaattagctgggcgtggtggcacatgcct
-gtaatcccagctacttgggaggctgaggcaggggaatcacttgaactcgggaggcagagg
-ttgcagtgagctgagatctcaccattgcactccagcctgggtaacaagagcaaaactcca
-tctaaaaaaaaaaaatacaatgggatacaatctcacacttaccagagtggctaaaattaa
-aaacactgaaaatacaaagtgtcggtgaggatgtggagaaactggaactctcatactcta
-gtaatactaataataggagtgtaaatttggacagttgctttggaaaactgctaagcaata
-gctactaaaactaaacacagacttacctgatgaccaggtatttacccaagaaaaataaaa
-acatgtccacaagaagatgtgtatgtagatgatcatagcagctttattcagaacagcaaa
-acacaagaaacaccgccaacgcctgtcaacaaaagaacagaaaagtaagttgtgatatat
-ccatacaatggatgtatatgttattttatgaatatataaaatggatatattggaaatact
-acatggataaaatagttactttttaaactacatagcagtgaaaaagaataaactactgac
-acgtagcaatatggatgaatcttaaaattatattgtgcaaaagaagctagacacaaaaga
-gtacatacagcatgattcatttctatgaagtttaagaatgggcaaaaccattctatgctg
-ttagaagttggttagtggttaccctttgcaatggcaggtggagcagtggggagcagtagc
-tgggaaggaggtatggggatgccaaatgggatgtcaagaatgttctacatcttgatctag
-atcatatacttgcaaaaaattccttcagccattacagctcaagattcgtgtgctttattt
-atgcaatacagcaatctaaaaCATTAAAAAATGAATAATCTCTATGGTTTAAGGCACATT
-TAATCGAGTATTCTGTTACTTGTAGCGAAAAGCACTCTAACACTCCTCAACACAATTTGG
-CGACAGAGGATGTTTGTTGGGTGAGTGATGGTAATACCCGTGGAATAGCATTCTTACAGG
-GAACAGGGCACATTCACGCcattaacacctgtcactctcacttcagtcccaccagggagg
-gtttgttagtttcctctaacagatgaggaaactgaggtccagagaatcgcactgacctgc
-tcagagtcacacaacgagctttttttttttttttttttgagatggagtctcactgtgttg
-cccaggctggagtgcagtggcatgatcttggctcactgcagcctccgcctcccaggttca
-agcaattctctgcctcagcctcccaagtagctgggattacaggtgcccgccaccatgccc
-agctattttttttttcttagtagagagaggttttgccatgttggccaggctggtcttgaa
-ctcctgacctcaagcaatccacctgcctcggtctcccaaagtgctgggattataggcatg
-agccactgtgcccagcctacacagtgagcttttgaccaatctagaatttgggcccaagat
-tgtttaatcccaaacccagtgctctttccgctacacttctctcaccctGGGCACATCCAC
-CAACAACATTTGTTGAACTCCTATTCTGTATACTTCAGGGAAACTTTATCTGGTCTCTAC
-TTCCACTGAGCTTGTGGTCTAGGAGAAGAACAAGAGTTTTATCTAACAATAATAATTGTA
-TTTTTAAGTGCTTACGTTTATTAAATACTTACTATCTCCTAGACCAGCCTTTTTCagtgg
-agtccatgtattgcagagtatactccactgggttgcaagaaaaacaattagtaattctat
-ctgtatatttgatctcatcttttaaaaattttcattttgtgtatatcatataagatgata
-atatattgattgataatatattatgtttttactttgtaaatgtacatattaaatatattg
-ggggcaatgttcaCTGACAAGAATGGGACACCTAAATCTTTAAAGACCCATTGGTCGCCT
-GATCACATGATCCCATCTGGCCCTCATGACACTCCTGAGGACCAGAttttttttgttgtt
-tttagagacagagtttgctatgtcactcaggctgggatgcagtggtacagtgatggctca
-ctgcagccttgaactcctgggctcaaatgttcttcctgcctcagcctcccaaagctctgg
-gattacgggcatgagccaccatgcGTGACTGAGAACCCGATGTGTTGCCCCATGTTACAT
-ATGAAgatacatctttaaggtaatgaatatcccaatcacccagatttaattcttaagcgt
-tgtatacaggtatcaaaatatcacatataccccccaaatatggccaactattgcatgatt
-aaaaaataaaagaaaaaaGAAAAAGAAACCATCTTTAGCAATACCCTTTTAAAAAGTgct
-ttttgtttgtttagctttctttgaacatttgacccaagtcttccctcactcagaaaacca
-ctctgtaaaacatccctcaacatgatttcctcacagacaaacctgtctgataatttaatg
-ctgctgccatttttttttctggagctctgaactttgatgcctatctggactagttttgct
-ctagacttggggcacagataccattaggaattcctttGTCTCTCCTGTGTTGAAACCACA
-GACTGCTATATCTCAGTTCATCATAGAAAATTTACAAAATAAAAGCCACAGAGATTCATT
-Cccctgcctgtgtctaagctcttgtccaagcccctctcacattgactctgggcttggtca
-cgtgacttgctttggccaatggcataatggcaaacatgacacaagcagcagctggaaaat
-tacttgtgcatatgagcctttgccctttcagctctggggaaccctgtgaccacaaccagg
-ctggcagcaaacccaggctggtttgctgaagtataagagaccgatggctaaatcatctct
-gttaccccagctgtgccaagccaaccagcatatatatgtgagtgaggccattgacgacca
-gctgacggcagacacaggagagaagccagccaagaccacatggagcccagcccacgccac
-tactgggctataggttcataagggaataaatggtggccgttttcaggcaatttgttacac
-aggaaaagctCATGGttcctcttcttggtttagttcctctttttggtggagcacagcccc
-tggtagcATGGAAGttttaaaacatgtgcaccaatcctttgacacttgtcccatcagcag
-atagggttcatgacaccttcccttgcttgggcctgtaccttagtaatgcagcaaaagtga
-catggcataacttctgaagataagttagaaaaggccctacagtttccacctggttctcct
-gggacactcactccggggtaagccagccattgaggaagaggtatgagatcaccgtgctgg
-aaaagctacatgtcaacacaccactcaacaatccagtcgagacagccttccagccatctg
-ggccaaaggagccagactggtgagtgatgtcatcttgggccctccagaccagctcatcca
-ccagctgaagaccactaagtgagctccatcaacaccacgtggaacagaatcatcacccag
-ttgcaccctccctcagtttttaacccacaaaattaatccactaattttggtgatggtttg
-tcatgcaacaatagataaccagaTTCTATGCCATGATGGGAAGTTCTGCAGTTTCATTGG
-GAAGTGGCAGGCATTCTGGGACAGAAAAAACTTGGGGTCATTTGTGCAATCTACTGCAca
-gatttttaatctctggtttcttactctctgttccttccagagagcttcttgttcacattt
-tactgctgcaatatctttatcactcaagggatattaattgtaggatttattttaagtttt
-ctcttgttccctggattcttttcttgaagaccttttaccccgccctcatggtttgctttg
-atctctgcacttcatgatagaaatttctaatgatccttggctgtctactcacattaccac
-tctggctggaaactgggtggggagggtggactggtaggcttttgtgtagggtccatgcag
-ggtggttgcatagggctggtgcaaaggggctggttggctttttctgtgatgcactctcct
-cccacccccaattaccgtatctttaggtctttgtcctggaagtggttctccagataattt
-tctgcctggggttggacattctagaatgagacgggtgaagggggctgaagatctcACCTT
-CTctgggcctgatgtttctagttttggagtttctttgttgcctttttttcagagaataaa
-cctccctttgcttgcccagaagtgagtggggttactacctggctgggcaggatgggggtt
-ggggacgtggaggtcccatgctccttgtacagattgctttcaatccccacttcaccagca
-gctcctccaagacctagtagcttcaatttttgaggcctttaggCAAATTGGCTTGTTTCT
-CTATGCAGCAATCCACCCACACAGCAGTCACCTACCCCATCCATTTAGCTTTGACTTTCT
-TCCTCTCGGTTATGTCACTGGCCACTTCATCCATTTCCCTCCTTTGTAGTTCAGGGTTAC
-AAATGTCTCTCGATTTCCTCAAAGACAGAGTTTTTGTTTCTGCTCCTTATTCTTGTTTTG
-GGGAAGTTTTTTGTTTGTTTTTTTCTTTTTTAAGAAGAGAAAAGGAATAGAAATGTCTTT
-AGTCTACTATCTTAAAGCCACCATTTCATTAGAGTTTTAAATGGAAAAAGCACCCTCTTA
-TATTGGACAGAAGTGTGTCAGCAATGTGGGTTTTGTGACTCTTACTGGAGTAAGAGCCTA
-CATTATACGCCAAGGTGGCTTCATGTTCTAGTTTTACAAATGCATTTGATACAGTTAATA
-AAATAGCAAATTATGTATTAAGGAGAATACAGATAAGTCATTGCTGGCTTGGCAGAGAGT
-GGAGAGCAGCCTTGACCAAAAAGCTTAGAGGAGGAAAAGTGGGGTGGAGGCATGAGGTTG
-ACCTGTCCCTGCTAAGTGCCACTGTTTTCAgctcacccctttccacctgcaggtccctgc
-tcagatgccacctccttggaggatccccacccacctgtcactttctctctactaacttgt
-tttatgtctgactgcctgccaatggatttgattgacttatttatctttaggtttgtcgac
-cccactagatcatgggctccatgaccagggggagctttgctttttcacctccatacactc
-ggtgcctgtgagcacctggtacatcagtagatgctcaataaagagttgttgagtgaacaa
-atGAATGAGCCAGTGATTGCGTGGATCCATGTTTTCTATGAGAAGGCAGAGCTCTGAGGA
-CAGACAGAGGCCCAGTGTGCATGAGAAAGTCCTGCTGGCCCAGGCAGTGGCCTAAGAGCT
-GCCTACCATGGCGGTCACTGTTCTTGGGGAACCACAGATGTTTCCCCTCTAATCCCTCCA
-TGGGGACCAGGGGGGCATGAGAATGGGAGAGAACACAAAGTCCCTTTATTCAGGGGAGTG
-GATTCCATCTCAAGACAAATTGTTACCTCCAAGGCCACCAGCCGCCCAGCCGGCCCATCA
-CCATGGCCTCCCTCTTAAGGATGTGGGCACAGGCCCGGCCAGAGCTGAAATTGCCCTGGA
-AACTAGTCTCCCCTTTAATTAACAGGGAGGGCGACCAGGCCTGCTAACGGGGTGGGGTAT
-GGAGTCGGGGTGGGGTCAAGTTCATAAAGTCCCCAAAGAATCAAGGCCTCCTTGTTTATT
-TTCCCGAAAATGTTCCCCATTACCCAGAACAGCATAGGGGCCAAGCAGGCCGCAGGCAGG
-GAAAAAGCTTTAACCTCCCCGCTGCTCAGCTCAGCACATCACTATTTGACTTGCATTTTA
-AAAATAATTACAAACTTAATGAAAAAATAACCTAACCCCCAAACAGGCCAGGGACTCATG
-GCCAGCATTGGCAGGAGCAAGCCCCTGGCAGCTGTGAGGATGAGATGCAAAGGGTATAGA
-GGAACCACTGGAAGACAGGGGACACCCTTTAGATGGACACTCCCTCTCTCTAGCGCCAGC
-TTTGGCTCCCTATTGCCCTTTGTGTCATGCCCAAATGTCTCAGCCCATGTCTTAGAGCCA
-GTTTTACTCAGGCCCTATGTGGAAGACACTGGAACCCAAAGAGGAAAGGAAGTTGCTCAG
-GTTGTGCATTGTGTGGGACCTGATGCAGGTAGTGAGGCTGGTTGGGATGGGTTCTCGGGG
-AAAGAGTGGAGGAAAGTGAGAATGTGTCTCTGTTACCATCTGAGCCCTGGCTGGGTATGG
-CCAACATGCCAGGTAAGCAGCCTTGGGAAGCAGGCACGATGATTATCCATCTTTAATATC
-CCAGGACTTGAGTCCAGGTCTGTCGGGCTTTTAGCCACCACACTAAGTGCTGTAAAAGGA
-GCTGGAGGTAGAAATGAAGTAACAACAATAATaataataagcagctttcatggattgtag
-actatgtgccgtgcactgtgccaagctctttaccatctcttttaatctttgcaataactt
-tatctggtaggtagtgttattgacccattttacaaacgacgcccagagcattggttcaag
-gttgtgcagctgggaaatggcCTGTACTCTTCTACCCTGAGAATAATGCTCTACAGTGAG
-TCAGGGAGTCTtgtgaggtctcaagaacagggaccttgtctgtcttattcacttgtgtgt
-cctcagagcccagaagagagactggcatataatagatatttaatatctgtgttgtgaata
-agaatgaaCAAATGCACCTGGACCTAGAAGTAACTTCCGATGAACCATCCCAGTTCTCCC
-TTCCCCATTCCGGATTATCTTTACTTACCTGGAAGTGAACAAGATATTAAGGGGCTCCAA
-AAGAACTGAGAAATAGAACTTGGTTTGAAAGACAGTAGGGAGCCACAGCAGGTCCTTCAG
-GAATGGAGTTCCAAGCTAGGGGAGTGATGGTCTTCCTGTGTCTTTATGGATTCCAGGAGC
-TAGTCAAGGTCAATGAGCCTTTAGCCAGAAGGTCAAGTTATCCCCAGTGGTAAGTGTTGG
-GGGAAGAGGAGGGCACTTCTCAGGAGTTGAGGGTCCCAAACTTGTCATGCTCATTGGTTT
-TGTGGCTGAGAGTGGCAGGTTCAGGCTGGCCAGCCAGCCTCTTCAGCTTGCCCATGGTAA
-ATCCCATGATCCTGGGTCAAGGACGCCCAAACATGGTATGTCCATAGCCAGCTGACAGAA
-TTCGTATGTCATTGAATCTTTCAACAATGGATTCTTTGAAACTTACAACTCTGGGGCCTT
-TGAGGTCCATCTCAGATTCTGAGGCTGTAGAAACTGTTCATTTTAGAATAATGATAGGTA
-CAAaacatttactgagtacttactactccagacattgtttacaaatatcaacgcctttaa
-tcctcacaaccaccccagaaggtagtaacaatgtgaccccccacttcacagatgtgaaga
-cggaggcactgaaaggtgtaacttgcccagggtcacTGGCCGCCTGGCTCTAAAGCACAC
-AGCACTGCCTCACAGACACTTAAAGTCGTTGAGACTTACACTCTTCAAATTTTAGAATCG
-TAGAAAGTCACAAGGTCAGGATCTTCAAGCCACAGAGTCTTAAAATCATAGCACTTTAGA
-ACCTGCCATCATTGACTCATCAAATTCTGCCGTCATAAAATCTGGGCATGTTATAATCCT
-GGAATTCCAGATTCTTGGGGACTTTTAAGTCAGAGAAGTTTAGatcctgggatattaggc
-ttggattacagaccctagcccagtcctctcatatagcacagggaaactgaggcccacaga
-agtgaCAGAAGTCCAAGAGAGGCAGAGCCTGGTGGATTCAGTGTCATGTTTGGAGGGAGA
-AATCGGAGTGAACAAAGAAAGCCCCTGGGCAGGCAGGAATCTGTTTGTGATTAGCAGTGG
-GTTTTAGTGTTGCCGAGGAATGTACCCAACGTTACCGTTACCCCCGCAGGTTGCTGCCTC
-CTTTCTTCCCCCTCAGATGCCCTCCTCAGAGCCCATCCTGGCCAGACTCAATATCCTGTT
-TCTACCACCAGCAAATTGAATTTTCAGAAGTTGGCCTCCTAACGAAGCCAGCTTAATACG
-TTGGAGGTTTTCTTTGCCTGCATTGCTATTTCTTGGTAGGATGCCTGCTCTTCAGGAGCC
-CAGAGAGGTTTTGCACACTCAAATCACAACGCCAGGAGGGATGAGGGACAGGAACTATGG
-GACAGGTGGCTGGGGGCTTAGATAGACCCAGAGGTGGGaatagaaatggcgtgtctcaag
-ggggaggtgacaggtccacagggacctccgtactgctcaggccacacctgggaatttggg
-ggccttcagtctttcagaaacattaaccaaatggggtttgtttagaggagggatggggag
-agatgggtgggaatcccatgCTCTGGGAGACCTTGAGCGTGGACTAGATGGAAAGAAGCA
-TGAATTCTAAAGTTCAGCCTCTCAGCTACTGCCCCCTTGAAGACAGACATGGGTGGAGCC
-CTGGGGTATAGACCTAAGATTGAATGGTGGAAACTCCATGAAGATTTTGGTTTTATCAAA
-ATCAGTGGTTCTCAggctgggcatggtggctcacacctgtaatcctgaggcgggcaggtc
-acttgagatcaggagttcaagaccagcctggccaacatggtgaaaccccatctctactaa
-aaatacaaaaattagctgggtgtggcatcagacacctgtagtcccagctgctcaggaggc
-tgaggtaggagaattgcatgaacatgggaagcagaggttccagtgagccgagattgcacc
-actgcactccagcctgggcaatagagcaagagcctgtctaaaaaaaaaaaaaaaaaaaaa
-Gcaatggttctcaaagtacagtacagtccagaatctgtggggttcctgagaccattccag
-ggcatccacatggtcaaaactatattcacaacaacactaagacattatttgttcttctaa
-ccctcagtggggttgtccaaagttgatatgacatgtgatgccaccatcactctgatagca
-atgaaaaaaattaatgcaaaaacattcatgatgaacaaaatactaaaactgtaaataaag
-agaagactaatactactgatttttcctttcatctcaggcttcagtgtgaatttttcaaaa
-tattgcattaaaatgtcctaattactgatatttttggcacacaaattttaaacctgaggc
-aagtgcctcgtttaactcactctagtcctggcTGtggatataatccacatcaacagaagc
-ttgttggggtcctcaataatttttaaggatataaagtgtgctgagatgaaaacatttgag
-ggtcactgataaaagggataatgttccatcagctcaaactatccaacaatggaggggatt
-atattccaaggtactgagttcccatcacaaggtgtgtacaaatgggggGATTAAAGGATT
-GGGTGTGGGGAAGAGGCCTAATGTGCAGCATCTCTTGCCCAGGTGCCTCCTGTGGTCCCA
-CCTACCTGGCATCCAATagatcttctcattttcccacttgaaagcttgcaatggtacccc
-actgtgctctgagcaaaaacccacctcttctccatggcctaccaggctctatgtgtcctg
-gccctgtctcccactcttttgcccctagcttgctctgctatccccaacctagcctctttc
-tatttcttcagcatgccaaactctttcttacctagggattttgcacacgctgttccctct
-gcctggaacatcttcctcttcactcttctcatggctgttccttgtatcttctgagtttca
-acttgactgttgcctccaggaaggcttccctgatcaccctatagtaagtaggatttctct
-gacatcatctctcaacctcttttttgcttccttcatggaagtcatcactgcttttttata
-tttacttgttggcatggatggttctcatctattctctccatgagaccatgagctcctcca
-gggcaggaagcctgactgttcagacatggggcctcagcacctgacccagcacctggcatg
-gaggaggcccttgagaagtgtttgttaagcaaataaaCAAATCCTTTatgaattagtgaa
-tgaatgagtaaatgaatgaaAGATTAAACAGAAAAGGCCTCTGACTGCTGATGCTCAGGC
-ACTCACCAGGAAACCCAAAGTAACACAGGTTGTTACTTTGATGAAACATCAGTAACCATG
-GCTGGATAGTGTGTGATGAAGTATTAAGCAGTAAGTGTTTGCCCACTACCCATCAGCGCT
-GATCAAGTTGGAGGAGAGGGAGACTGGCCTGGCTGCAGAAATCTTGGATGAGTTGGGGCT
-TGAACACAAGCCTTCAGGGCTTTGCCAAGGCAGGTTCCCCTGCCTAGTTTCTCTGAAGAT
-TCACATTGTATTCACTGTGAGGGCTCGGCTCAAATAACCCTGCCTCCTATGGCTCTTCCC
-TGACTCTTCTTGGGTAGGGTCGGAACACACCATCCTTGTTCTGGGTGTTATTGTATTAGG
-ATAACCACCCTTGTCTATCACTGATTTGAAGACATTAGCTTATAGAAATGTCCCGACAGT
-ATAGATGTTATCCCAGTTTAGAGATGAGAAAAGTAAAGGTCCCAGAAGAACTTACATTCC
-AGTGGAGGAGACTCATCACGGGCAAAAAACCAAACCCACGTGTTGTGAGTGATAAGAGTT
-AAGGTGAAGAATGTTGCCGCGGAAGAGGAGTGGGGAGACCTCTCTGAGGGATCAAAGAGA
-TGTGGGTACAAATTCCATCTAATAGTGTCAGCTAAAGTTCAGTTAACTGTTACCACTAAC
-AATGAGTTAGCtgttgcttccaggatgtctgtttcacgaggacagggactatgttcactt
-ttctgtccccagcacctagaacagtgaacaacacatagtaggtgttccatgtatggtgtg
-aggtgaataaaGGCCTGCctgcatcaggcgttgtatatgaattattttatttaatctcca
-tggtcagagaggtaagggttatcatccccattttgtagataaggaaatgagggcacagtg
-aagttaaagtctaatgacttacccaagaacacccagatagtaaatggtggagcccgagtt
-ggattcgaatccagtccaatctgtctcgtatcttagccactctcctacacAGccttattc
-tgctcactcactgtgtgaccagggcatattgcctaacctctcatccactgaggatgtcat
-tttctttagcttttgaaataatacccatgtcatagggttactgtgaaagtttggttcagg
-tagagctcttagattcctgtctggcacacagtgaCACCTCTTTTCAGGTGACCCATTCTC
-GTTTGATATTGTCAGCCATTGTGAAATAAGAGGGTATAGAGCAAAGCTTTCCAAATGGAA
-AAACCTGCTATGATTTCTAGAAAGTCTTGGGAAACTTTCTAGATCAGTTATGGAGGTTGC
-AGAGCAGAAGGCCTCAAGGACGAGATGCAAAAACAGCACCCATGCAAGTTGACTTGTAAA
-CTGCTTTCTTCATCCTTTAGGAGGAATTGCCCAagaggcagcatttatggggcatgccca
-gggtctccaggcactgtgctgagggctctgtatcccgtctgtcaatttttcccaactcta
-ttatacagatggcaccactgaggctcagagaggtgaagggacttgcccaaggcctcatag
-tgcatcagaaacagtcaggactcagctcaagaaaaggccccaaagcaagcactcccaacc
-acatgatctaAGACCAGGGAACAAGGGGACAATGAGAGTGAGGGCAGGAAAAACGCTGGA
-AGATGTACCAGAGACTTAGCACTTGACTGATGGCATCTTTCCAGGCCAGTGCCCACCCCT
-CCTCTCCTGGCCTTCTCTTCCACCTCCCACCCTCCTGGGTTCCTGCACCATTTTCTCACT
-GGAGCTCCTGCCATGCCTGTTATCTTCTgttggttcttgggaaaagactctgagatggag
-attggcgtgcagtgggtttattggggagagtgctcaggagtaagaccaatgcaggagtga
-ggaaaacaggcctgggaggagtgaacagctggcacaatggagttacaacagaaatctcag
-tgatcccacaggagctctggagcagagatggcccttcggagctgaaggatcgggtcaggc
-attttttatcatacaccaaccactctttggccacaggctgcacctggaacgaacgtgtcc
-ttgggcagggcaagtccctacagctgagggccattcccggctgggaaatatcagcagctg
-gcagtcccatcagctgggAAGGGTGTCTGATGAGGGAATCCATGCTAGCCCCCAGCCTCC
-TTTCCACCTGTCCACTGTTATCTGACAATAGCGATCATGCCACACTAGCTCACACCGGCA
-GAGCACTGTCTACCTCTCAGGCTCCCTACCACGTCGTGTGGTGTGtggattccctcattc
-catcctcatgacaaccatgagagggggacactttccacatgaggaaacggaggctcagtg
-agatgaagagcttgcccagagtcccaaggtgcaagaatgctgtagctggtattctcaccc
-aagcagtGGGACCTATGGGTCCTATCTTGGTCCCTTATAGAAACTCCTTCCTTTAATCCA
-ACTCGGCACTGAGTCCCCTGGagtcaaagctcctgccctccaaaagttcatcatccagtg
-ggggaagtcaagacatatacactggaaagataagggctggtaagtgctgtgatgagaggt
-gacctgagggtgggtgacagggatgtcctgcccaggaaggcaggtgagacaaagtcagtg
-agttcagcctcagtggatgaggagagtgctgtgggaaggatcggggcagggtgggcttct
-aggcagtgggagcacaggtgcaaagacagagagggtgaaagagAGGGGCCCTCCAGAAAT
-AGGGAGTGGTCTCCTGAGATGACATAGGGGTTTGGGGGAAGGAAAACAAGGTCATCAAGG
-TGGAGGGGCTCCAGCCTCAGGGCCCTGCATGATACAGTCCCTGCCCTTCCGTGAATATTT
-GCTGAACGAATGAATGGTTGGATGGGTGAATGAATCGCTGCTGTGGAGGGTGGATTGGAG
-GTTACAGAGACGGGCAGGGAGACCAGTGGGGGGTCCACAGCAAATGTCCAGGTAAGAGGA
-AATGGGCCCAACTTTGCAGGGACCACAGGGGTGAAGCGATGAGAGAGAGAAAGAGAGAGA
-GGAGCGGAACGCCGCTGGGTGTGGTGACCTAGAGCTTCTGTGGCCCATCTCTCAGTCTCA
-CCCTGTTCCACCTCCATGCCCTGCACCATGCTGCATCCCCTGCCTGGCAGCTTTTTCCTC
-TCCCTCTGCATCTGCAAGTTGCACTGGCTGCCCAAGCTCTGCTTCCTCTAGGAAGTCTTA
-TTGACCAATGCAGCTCTCCCTTACCGTGCAAGGTCACTTCCCATCTCCCTCACAGTTTAA
-CCCTAGCAAACTCCATTTGCAGAGGCCGGTGTTCAAAATGCAATTCTCCAATTTTTGAAT
-GCCAGGCCAACAGGGAAGCATTTAATGCCCTTCAGCAGGGGTATGATGGGATAAGTGTGA
-ATCCATGTATCCCGTACAGGTAGGACCTCTCTGCCCCCATAGTGCCTGCTCGTTAGCCCT
-CTAAGGGAGGCATCTGGTAAATCTGGGCTTGGAGTTTGGAGGATCGGAAACAGGAACGAC
-CTCTCTGGGGACAGTTCTTAAGTTCTAATGGAGCAACTCTTCACAGAGGGACTTGCAAAG
-CTCTTAATTAAAGTTACCATCAGAACAAAGACTCTCTGAAGCAAGAATTTGGACCCCAAT
-GGAGTCCTGAATCCAGGCAACCAAGCTTGCATAAGTGTGCAACACAAAGGCAAATGAGTC
-CCCAAGGAAGAAGAGGCTCCATCCTCAGCTTGCTGCCCTTGTCTGAGGGAAGCACCATGC
-CCTACAGCTGACATTTACTGAGTTTGCATCCGTTgactcttttggttgcagaaaactggc
-tcagacaaaaaggggatttgctggactgaaaaggccaggctggagctatggtgcagcagg
-atctaagggcttaagtgatgtctttagggtggggtttctctccatttttttctgctcagc
-atccttcagaatccacttcattcccagAGTCTATGAAGGTGGGGTGCACAGAGAGAGTCT
-GTTGGACCAGTGTGGTCACACACACACCCTGAACCAAGGAGCACAACACCTGAGTGGCTG
-AGGCTGCAGGGCACGTCCCAGATTACACTGACCAAAGAGTAGGAAAATGTTCCCCATCAG
-AAATTGGTAGAACAGGGAATGGATTCTGGGGAAGTAAGCAATGAACATTATCCGTAAGGG
-CCTActatatggtaagcagctattaatcgctttgccaatttatagttgaggaaacagcct
-cagagaggtgaagtcactctgacagccaggaagtagggaaaagcaagcttggaacgcagc
-tctgtctggtaccagagcTGAGGGTCTGGGGAGCTCCACCATCCTGCTTTCCAGGCAACA
-TCTTTACCCATCTCTGTTTTGGTCCAAGGCACAAAGCTGGTGTCAGATGGCTCTTGGATA
-AGCCTGTGTGGGAAGGACAGATAGATGGGGGTGTGTatggatgaatggattggtgaatgg
-atgaacagcggggtggatggatgggtaggtagaagggtggatggattgctggctgtgtgg
-tttactggctaggtgggtgggtaaattggtatatggttaggtggaagggtggatgtatgg
-ataggtgggtggatgCTTGGGTGAATAAATGAAATGGCAACTGAAAGGACAGGTGGAAGG
-ATGTGTGGGTAACTAGATGGGAGGGTGAATAGAATAATGCTGACATAAGCATTAACAATT
-ATGTCTAGCCTCTTGCCCCTCTCTTCCCAACTGCCTTTTCCAGTGGAAAAATTGAAAATC
-ATGGACCCGGGGAACACATTCCCCTGTGGTCTGTTAATAGAGGCCCAGCAAGGCCAGCCG
-AGGCTGTCAACTCACCCCCCACTAGGACCCTGTCATTAGCCACACTCCCCCAACCCTGCC
-CTTGGGTGGAAGTATGATCTGGTGGGCACTGAGGGGCTGGGCCCATCCAGGCCCCTTATT
-AAGCCTTATTAAGCCCACAGACGGGGAGCAAAAAGGGGAGAAGAACTTTCTCCCAAAGGT
-CAGCTGTTGGAAAAAGAAGGTACAGATGTCTCTGGGGTGGTCGTCTACTCtcaggccaca
-aggaatgtgaaagtttgcctggcccaatctgctctgctgtcttcttgcaggctgggaaac
-tgaggcccatacaggagacaggagggacacacagaagtcgggacagagccagactcaaac
-ctcaggccggctcacagaccatAGCCCAGCCTTTCCCTGAAACAGCCTCAGCATCAACAA
-TGGGGAGGGAAAGGAATGGGCATGAATGGGGCTCCTGCTATATGCCAGGCCCTTGAGCAA
-AGCATTTTCTGTTCATGGAGCCACTGGTCTCCTCTGTATCCCCATGAGTAAAATGGAAGT
-TATGCCTGTCCTGTCACGGattgaacaagcatttgttaaacatctgttatactgtgggcc
-aagcactggtctaggtgccaggaatatggcattaactagccaaacaaggtttctgctttc
-agagagcttactttctagacagtgatagagacagacaaataagtaggtagataaaatgtg
-atatgaagaaaattgaggagtggtatgagatgtacaaggatggaagggacgttctttgga
-tgagatggttgggaagggcctctctgagaaggtgaTCATGGTCAAGGTCATtaattgtcc
-accaagtccattctcccctttgctagtatgtgggcaaagcccacaagtggctgtccaggc
-agggtcaacatttcccagccctatttgcatgcaggtgtggccatgtgactagctcttacc
-aatagaatgggagcagaagtgatgagtgccacatccaggcctagcttttgagaagtgagg
-gagcttcccccatgttcttgttacttttcccctggctgaattcaaatgatggcaagaccc
-caagatagaggagccacaagattagaagagcctggattcctgcatcaccacatggaggag
-agccactcattgccctggcacatccattgcatgagtgagaaataaacttCAGGTGAGACC
-CAAAAGACATGTGATGAACTGGTTaggacattgcaggcagaggaaatagcatgtgcaaaa
-ggctcaaggcagaaccaagcttggcatgttggcacagaaaggataccaatgtggccagaa
-taaatggcacaagaggaggaaatgaggtgaaccatgcaggcagtggcctcagtcaggagt
-ctgtatttcaagtggccccagtggaggtggcgccatcagcagggaagaaataccatgtgg
-ttcatacttggaaaagatccctctggccactgtgcagagatgagttggaaggaggcagga
-atggacacaccagagaggagctggtgcagtcatcctagcctggatgaggctggggacata
-agagtgagtgaacagagtgggtttggatatattttcaagggcttgctgatgggttgtttg
-tggaaggtgaaggaaaCCAAATAACCCACAAGCCATTAAACAAAATCTAATGCAGAAGCC
-AATATATATTAGTAAACACTTTAGGGGTCTCTGTCTAGCTTCTAATCTTCCTTCCCTGAG
-AACCTCCCACTTATGCCTATCTGATAACTCTACTTATCTGATAAACTGGCCCCTCCCCTG
-CCCTAGCTCATGGAGCTGGAGATCGGTCCCTGACTGGGGCTCAGCCAATCAGATCATCCC
-TGGCTGTCAGACCCCAGTGTGTGGCTGGATGGGGAATAGGCTGGGCCCTAGCACTCTCTC
-CTTGATAGAGATGATGGGGTAGGGGGAAGGTCAGCAGCCCAGAAGCTGAGGAAGAATGAA
-CTCTCCAAGGACCACCTACCCATCCCATAGCAGGCGAAACATAGCTGCAAGTGGACTCAA
-CCACCCTCAACCACAATTGGAGCTGCCACCAGCCAAGTGTGGAAAGGGTTGGTCTTTGCA
-GAGCCCTGGACTGGAAGAGGAGAGTGGGTCTCCCAGGGCAGAAAATGGGAGTGGCCAGCT
-CCAATTCTGTGCCTCAGGTTGGGAGACATGATCCTCTGGGTTCTTTCCATACCCTAGACA
-AGGATATTCCTTGTCTGAGCCTAGACAAGTTATTCCCCTGGGAAGGAGGGAGGTGCTTCT
-GTTTCTCCATCTGTCAGGTGGCTGAGtataacagatttcatttccaaaaatggccacagc
-cccctgctcctcatgaaccctgccactctccatcaagagggagagtttatttctcctccc
-ctggagactggcaggactttgtgactgccttgatgaatagaacgcagcagaggtgactgt
-gtaacttccaagggtgggtaagaaaagacaatacagcttctctctggctctttgtcttga
-gacactcaccctgggaaccagacgaccacggtgtaaggaagcccaggccccctggaaaag
-ccagaggtaaatgttctggccgacatttacccagctggggtcccagccaacagtcagcat
-caaccaccagacccatgagggaatcagtccagcccctggccatcaagtcttccatctgag
-gccccagacaccgtggagcacagacaaatctacccactgtgcccttctggattcctgccc
-cacacaatatgtgaatgcaatgaatgactgtttgatgccagtgtgttcaggggtgatggg
-taacgcagcactagatacccagaacGCTGACTCAGGCAGACTCTGCCTCCATGACACCCT
-CCGTGCTAAGCATCTGTTCCATTTCCCCACTGTCCTGAAATTTCCAGACACTCCTCTTTG
-ACAAGCCAGGCTTGGCTATGAGCTGGGGCCTCTCAGGGATCTTCCAAAGATCAGCCGTGG
-AACAAGCCCTGCGGGGAGTTCACTCCCTGGTCAAGAACCTTTGCTAACTCCCCATTTCCC
-CCCATATCAAATCTCAGCTCTTCTACTAGGCTTCCCAGGCCTGTCCTAATCTCCTCCATC
-CTCATGTCTCCCTGAAATGGGCCACAATTCCTCCCTCTGCAGTGTATTAAGAGTGAGAAT
-GTGGGGTTAGATGAGGTGAGGGGAATCGCAGGCTCTGGGAGAGCTTTGAGAGCTAGGCCT
-GAAGCTTTAGAAGGCAGTCttccctcatttagcaaatattgagtcctagtgtgcactacg
-ttctatttacagtgctgggaatacacagctgcacctgctagacataatccctgtcctaaa
-cccatgaggatcatattctcttccacctcagggcctttgcacctgccattctcctaacct
-aaaatctatttcggaagatttgtgtacacctcatcctttatccttccagtctcaccttag
-aagggcctgcctggccaccctctctagtcatccccattgctaattccctttattattatt
-attttttttttgagacagagtctcactctgtcactgaggctggagtgcaatggcacaatc
-ttggctcactgcaacctctgcctcctgggttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattaccggcacatgctgccacacctagctaattttttgtattttagtagag
-acagggtttcaccgtgttcaaggctggtcttgaacttctgagctcaggcaatccacccac
-ctctgcctcccaaggtgctaggattacaggtgtgagccaccatgcctggcctaattccct
-ttactcttaattatatctccctgttcattttctccctaagtcttgaacaacagtatataa
-tctgtgatggctgatttacttgatgtttgtctgacttcccctactagaagtgtcagctcc
-ctgaggcagggactgtgtctgtctcattcactgctgtgtgccagggcatggcacagggcc
-tggcacccaggggtgctctatgactattAAATGTGTGCAGTGTGATGCTGGCTGCACAGT
-GCCTGCTTGCAGCTGGGAAGCTCGCAGTAAGGGGTGATCCTCTCTTTCTCTTCTGCCCTG
-TCTGTGGACATGCCCCATAAACACTCAACAGACTCCCCTCTGTGCCAGGTTCCATGTGGG
-CACCAGCAGCATGTAAGGGCTCAAACACAGTCGCTGGTACTGAAGCAGCTCCCAAATACT
-GGGGCAGGAGACAGATATCCAGCCTGTACTGGATATCTGGGGACATAGTGTAGCTGGTAG
-GGAGAGACGGCACAAAAGTCAGGGCACCAGAGGTCTGCAGTGCCAAATTAGAGTGGAGTA
-AGGACTCCATGCTGAGTAAGGAAAGAAGATCAGGCAGGCACTGGGGAGTACATTGAGGAT
-GGAAAGGAGGGCGATGGAGGCCATCTGGAAGGACGAAAGCGAGTGGTAGCAGGAGAGGCA
-TCTTAGgtatgaccccgggcatgacacgcaacctctctgaatctgtgtccCTGTTGgtat
-aacattctgtgaagcacacaggtcctggagccttcctgggttcaaatcccaccctctgat
-tactcatgaccctcaataagttctttcaacttggtttcttcatctgtaaaatggagatga
-caataatagcacctccccactattgtttcatcaggatcacatgagttaatgcattgaaaa
-cacttagatcggtgccaggcacatggtaagtggtcagtcaacgtGAGCTAGCACTGAAGC
-AGGAGTCACAGTTGCAAAGCACAGACCAGTGCCTGCACGCGCACACAGCAGGCACTCATC
-AGTGAGACGGACCTTCTATCTGCCTCTTACGCTGtaacacatatcaccacccaacatggt
-atttttttgcttatgtgattattgtcccttgcctccaccagaatgtgagctcaatgaggg
-caggggttctgtctcttttgttcccttgcattatccccagagcccagggcagtacttgac
-acatagtaggtgctcagtaagtagttgctgaatgaattcatttctaatttttagttttgt
-gcttggtgcacagcaaatgctcaacaaatgctggtcctcttCACCCCTACCAGCCTCTCC
-ATCCCGTTTCTACCTGCTCCAGGAAGCCCTCTTGGGCCTCGCAGCATCCACCAACCGTCC
-TTCATCCCAGGCTAAGTTCCCCACAGACCCCCTTGGCCCACCTCCCATCTGCTTTATCAT
-GCCTGTGGAGCCAAGGTTCACCTTGTTCCCCGGCACTCCCGCCAGCGTGAGTAAGCATCA
-GCCAGGACCTGGAGAGTAGAACCCACCCAGAGAAGAGCCCCTGCTTCTCTGCCCACCCCA
-GGCCAGAAGTGCTCTTGCCCCTGGACTGGTTTGTCCAGGGAGGTTTTCCAAGTCACTGAG
-AGCCCCATGATCAGATGTCACCAGATCCTCCCACCCCGGCTGCAGGGGCTGCAGTACCAC
-CAGGGCCAGAGCCATCCCCATGCGTGATTTCAACATCTGTAATACTTTCCCCTCTCCTTG
-TGGAATTCCCCCTCCAAATTCCTCCTGCTTCattattagtatatataaaaaataaaaaaa
-ttaaGCTGTCTTAATCATTTTCCATATTAGCTGACAGCCGGTTCCCATATGCCTGGGAGT
-GAGACCACACCTCCTGTTCCCCCCCCCTCCCCGCCCTCTCTGCTGTTCCAAAATGACTAG
-CCCCAAACAAGGCCCAGTTACTGAAAACCCTCTATCTTACAGACTCCGCAGCCCTGACTC
-CTTGGAGTCCTGTCTGGCTGGTGTGGCCCAAGCCAAAAGCAAAGCAGGAAGATTCTCTTA
-TGTCCCCAAAAAGTGCAGACCTCAGGGCTGGGCTGATCAAGGTGCAAATCTCAGTGTCAT
-CACCTACAAACTGGAACTCCACAAACTGCTTTGTCCTGTCCAAgaaagggcacaaattct
-gaagcagacggatctgagttccatctctggaactcagctctgtcaccttgggcgagccag
-ttcaccactctgagcctgagtttcgtcatctgtaaaacggcagaaacaacagcagttacc
-tctcagtgtcacagtgaaaatcaaggagaCTTTGataacagcagtgaacatccactgatc
-ccactgtgtgccaggcactgagccaagccctccctgcctccccctcattgcatctgcaca
-acaacctgctttgcagacagaaacaaagggaccgagatattaaaaatttctccaggacaa
-agaacagggaggtggaggagcaccctgacccaggcccgGCATTTTCAGTTCCACTCGAGA
-GCCTGACCCCCTGGAGATACTCCACAAGTCCTCACCCTTTTCCCCCAGTTTCACCTTGGT
-CTTTCCTCCTCTCATGGTCTTGAGCATGGGCATCAGGGATTGGCAGCACTGTTGTGTCCT
-GTCCCCACTGCCCAACCCCAGTGCCAGGGCTGTGAGCATCAGGAGGGTCGGTAGGAGCCC
-GTGGCCCATGCATGGCAGACTCAGGTGGCCCAGCACCTTGCGGCTGCTCCTAAAAGCACA
-GACACCTGTATTGAAGAGAGGGAAGTTCTGGGTTGAACTTGAACTGATTGAGAATTCCCA
-AGCCAGAGGAGATAGACAACTATGCCAGACCTCAAACTTGAAGATTGTTTTTGTTTTTAT
-TTAACTGAACCAAACTGATTTTTTTCTTCCCCCCGAATTACGAGTGAATCAGTTCATAAT
-AGAAGCCCCCATTATATCTCCTAGATTTTTAACCAAAATATCCAAAAAGAATTGGGCTAA
-CATAGCCACACCATCTTGGAATATGTATATTTATAGTGACATGTCATAAAGACTTCTAGT
-ATTTTGTCTCTACTCTTGATCCAAACTCCAGTGGTTCcggtttctctatattaagtattc
-acgtgctttgcatgtgtcacttttcatccttcagcccttagagggaagtatcattcatct
-tcaacttacagatgaggaaactgagactcaacgtagttaaatgatctgtaagacaaggtt
-ctgaatttgaacataggtctcagctgcagagccatgttattgctaacacagcctctgtat
-ggttctccagaaggcccctgatcCACTAAGAAACAAACCTGTCCCCCAATGCCAGCTGAC
-CCTATCCATGAACCCTCCTCCCTCCAGCCAGACAGGCCTCTGCCCGGAGAGGCAGCATCA
-TCTCCAGCTGcctgtactctcatcccagttcagccattcgccaagcatgacaactcggac
-aagacctttccctcctcagcctgtttcctcctgtgctgaggagaaataaaatcctccatc
-tcccacgctgttctgtgaaatgaagcaatcatgtacctaaagtgcgagcacaTagctggg
-catggtggctcacacctgtaatcccagcactttgggaggctgaggcaggcgtatcacttg
-agcttaggagttcaagaccagcctggtcaacatggcaaaaatccaccacttgagactagg
-atttcaagaccagccgggccaacatggcaaaaacccatacaaaattagctgggcgtggtg
-gcacacacctgtaatcccagctactcaggaggctgaggcacgagaatcacttcaacccac
-gaggcagagcttgcagtgagctgagatggcaccactgcattctggcctgggtgacagagc
-aagactgtctcaaaaaccaaaaacaacaataacaaaaaaaaGGGCTAGCACTTATTTTAC
-TTCTAAACTCTCCAGCCTCAACCCAACGTAAGTGAGGTGCATATAATAGGTGCTCAAGAA
-TTACTCATTGATGATAAAAGCAAGCCTGGAACAacaaaaataagagactgggcagaaata
-ttacaaaacatcagaagtagatccctctggggtggaattatgggtgattttattgtcttc
-ttggtgattttttttttctattttccaaactctcAGCTTGGAAGTATGTTATACTGTGTT
-TTCTAATTGTATGACACTATGAACTATACAATGCACTGTACACCTAATAGCAGTTTTTGA
-GAGGAAAGAACAAAACTACTTCATTGGATTGTAAGACTTGTTCTGATTTTGGTAAAGTTA
-AACTCTGCAGGGCAGGAAGAGTAGAGAGGTGTTTTAGAATCAAGGAAATACATTTGTAAT
-CAAGCAATCAAAGTGGTGGTCTTGGGGGGAGGAGGCTAATAAAATTATTATTGTTAATGT
-TATTATTAtttttgagatggagtctccctctgttgcccaggctggggtgcagtggcatga
-tcttggctcactgtaacctccacctcccgaattcaagcaattatcctgcctcagcctccc
-aagtagctgggactacaggcgcacgccaccatgcctggctaattttttgtattttaggag
-agactgggtttcaccgtgttgctcaagctggtctcaaactcctgagctcaggcaatccac
-ccgcctcggcctccgaaagtgctgggattacaggcatgagccactgaacctggccATAGC
-ATTACTTTTTAAAGGAGGAAGAGGATACAGGCAACTTTTCATTGCTTCCAGAACCTGGAA
-CATCAGCTTAACCTTGCCGGCACACCcagctcacctgggatatttgaaaataaacacaga
-tggccaggccctgtcctggtctgaatggccagcatctctaggctggggcctgggagtctg
-tgttttaaGTGGACACAGCAGATCCTGGGCACTGTATAGTAAATaaatctcctcatccac
-tttctgtctcatcttacagatgggaaatcagaagtccaaccaggggaggtgTTTAGCACT
-CTCCTGCCTGAATGGTGAGGGTGGCCAATCTCTTCCTTCACCCCAAGGGCCTTTCTCAGT
-CCCTGTCACCATCTTACCTCTCCCAGTCCTAGCCCCTTCCCCAGCCTTGCTCTGCCAGCC
-TGGAGCTGTTTCTTCCTTTTCTCCCTAAGGGAGTGTTCCCTGTTCTTAATTAGGGAGACT
-CTGGGTATTTTTGTCTCTTTGAGTACTGCGTTCTGTTGCCAGCAAATAACTTTAAATAGA
-AAAAATATGCCCAAAATTAAACTAGAAAACAGAAATAAATAGGAAGGGGGTGGGCTGAGT
-GTCAGCCTGCCCTTGGTGGAGAGGGTGGGctctgggcctcctttcctgcatctctgccat
-ggagaccatcacagtacccaccttctggggtgctgtgcacatcagacaagaagaggcaca
-cagtacactttgcacagggtgtctAAGTGTCCATTAATATCCAAAGTTACTGGGCACACT
-CGTTGCTTGGATTTTGAGATAATTATGTAGAGAAAATGTCAAGGGGCTCAAAGTCCCCCA
-GTTGACATTTCCCTACCAAGAGCTACTTTTATAACATGCTGCCGGATGTCATTTTCTTAA
-TAGGTACAATTTTAAGAGCAtctctccaccttcttccctaccctagtccaactgttcaca
-gctgaaagagtgaccttccaaaagcctaactcagatcatatgattctttgcctctgaaat
-ttttcaaagctctccattgtctacgaaatgccggcctcagagcctttcaggataggggcc
-atgaagggtctcaaatttcaaatttcatcttcctctaccatcctcctgtcaccctccagc
-cacacagacctgccccttggtccccaaaTGGATGCCCACTTCCTTTTTCCCTAATTGAAA
-GCCAGGGCAGAGTTAGGTTAATCACATGCCTTAGCTCCAGCCACACTTTTGGCACCAGAG
-TGAGACCCCTCCCTTATTTTATGTGTCCCTTTCATGCctcatccctactctcatcccacc
-tctcatccctccctcATGTGGATACCCCCCTAACGTGTTTGGCGTGTGTCTTTAAACATG
-CACGTGCCCTTGGAAAATGTGCAATGTTGTTGTCTGTGTGTATGATTTTAATTTACATAA
-ATGCTATTCATATTATGGCTTCTTACCTTTTTTCCTTGACACTGTCTTGAGATCTAGCCT
-GCATATGTGTGGAATCATCACTTCCAACTGCAGAAGAGTCAGCCACAGGGGGTGTCCTCT
-GTGCTTCCCTGCCCATCGTTCTGGTGCTGGTGGCCTAGGCTACCTCTGACTCCCCACAAC
-AAACCTCTGACTGCTTCTTATGTAAGAGAACACAACGACAGCTCCTGCTTTTTGCATAAC
-GAGCCGTTGTTTAGTAACAAGGGGCAGATGCCTCACTCAAGTGGATTTAGACACAGAGAC
-AAAGAAAGTGTAGATCTAGGTGTTCACTAACTCCTCAGGCAGCTGTCTTTCTCCATCTTA
-TCAATTCCAAGATCCCAGCCTCCCACCTTGGCAACTGCAGGGGAAAAGAAGCTCCCGAAA
-CAGTCCCAGGTGACTTTCTGGACCATAGCCTTTGTGCTGTTTCTTTGACGGTGGGATCTG
-GTTTTGTCCTGGCTTCAGCCTTCCCAGATCCATGTGTTTCAGAGGAAGTGAACTCCAGTC
-TCGGGGtgttatggactgaattcgaaattgtgttgaaaccctaaagcccaatgtggctat
-attagaagacatggtctgaagggaggtaattcaagttaaaggaggtcacgagggtggtat
-ccagtaggactggtgtccttataagaggaagagacatcagagctctctcttcacatagac
-acacagagcagatgccacatgaggacacagtgaggaggtggccatctacaggccagaaag
-gcctcaccagaaaccaaacctgatgacaccttgatcttgaacttccagcctccagaacca
-ggaggaaataaatttctgttgctgaagacacccagtctgcagtattttgttatggtagcc
-caagcagactaatacaGGGAATGAACTGTGATTGGTCTAAGGcaatatttctccattttt
-ttttcattattacccctcattattgacctcctgaagagttgttttaagaatttttttctc
-ctaagagtgcctcccacaaaatatatatatactacagacatatctatttatgtagtgtgg
-tttcttggagggtcacaaacggttgtcatatctaagattttgtcataccttaacctaagc
-taatttttacagccttaggagcaatattgccccattgagaatgcaCTGCCTAAGGCAATG
-TACTTGGTCTgtgattggttagaacatgggcatgtgaggctaatgtagaccatagatgtg
-agagccacagaggaagaaattgtcccttttcacctttggtctttattatggatggacata
-atgcctggatctgcggcagctattttgtgactatgaggacaggctgatatgctttaaatg
-gccaactagtagataaaacctaggccattgttcatatatatatatatatttgagatggaa
-tttcactcttgtcacccaggctgaagttcagtggctcgatctcagttcactgcaacctct
-gcctggttcaagctattcccctgccagagccttcagagtatctgggattacaggcaccca
-ccaccactcccagctaatttttgtatttttagtagagacgacgtttcaccatgttggtca
-ggttggtctcaaactcctgacctcaggtgatccacccacctcggcctcccaaagtgctgg
-gattacatgtgtgagccaccacacccggcccactgatcatatttttgagcaataaaagta
-accagccctgaaactgccctaccacaaactcctccttatgtgaaatgatgcattttcaca
-tttcagcctgttcagctgtgtagtttttgtaattgcagctgaagacattctaacagaTCC
-TGTtctttttcccgtaagttgtaccaaatgttctgaggcagactggcagtgatgggcctg
-gttagtccatgagttcatccccaaaccaatcttgtggccagacttgaatcctgtgcccac
-ccacctttgtagctcagggatgggaaggggtcaaccccacctggactgagaactgggggc
-tgttcctccgagggagatgagggagatacttcccaaagggattgtgaatgctgagagggc
-agaaatgacagctgGGTTTCACATTCACACCATCCCTTCTACATGAAATACCCCATCTCC
-AGCCCAATATACTCCCTCTAGTGCAGCTCAGCATCTCCCTCTTCTGAAAGGTCTCCCCAA
-GACCATGTTGAAATTATCTCTTCTCTTCCAGGTGATGCTCACTGGGGCATTTGTAGTCTA
-CCTCTGCCCTTAAGAGGCCAGTCTTCATGGCATGCAATCattcatgcatccatctaccct
-ccaatcttaattagcaccttctgtagccatccctaggccttggggtgctaagcaagaaaa
-aggcataatttccatcctcaaggatctcacagtccaggggaggaagcaaaactcataggc
-attcatTCGACACACATTTATTCTCTGTATAGATATGAGTAAAATATTGCATATCCTCAA
-GGAAAGGGGGAACTCCCCAGCTAATGGGACAGACAGATGAAGAACAAGTAAGTACAGTGT
-ATAATGAGGTGACAGAAGCCACCACTCATTGCTCTGACTAGGAGGAAACAACAAGATGCC
-TTAGACTCTTTTGGCCAAGGAAAGACACACTAGCTGTGTGAATGCCAGGTGAGCTGGCAT
-CATTTGTCTGGGATAGGGTGCAGTGGAGGCTGTTGAGGCCTGACAGCTTCCCCCTTCACC
-TTACTCCATTGTTTGCCAGGCTCATGCCTGGGAGAACCATATGCATAAGAAGACCTGGAT
-CTTATAGGAAGAAGAAGTGGAAAAGCCAATACCTGACCTCCAGGAATCAGAATTTGtgtt
-gcaggttgggttctatgcaggcagacacgaagacagagtttaggtgcaaggtgtttatta
-ggaatcaatatctggaaaagaaaggggcaggaatcagggttgaggaggaggagatactta
-actgcaatgtgacccagtaaagcgttggtcaacatggtgaggaagttgggagcaagaatt
-atccctcgatagacaccccgttctacatgatgtaattattatgaattacatgcctgtatc
-aaaacatctcatgtaccccataaatatatatatacctactatgtacccacaaaaattaaa
-attaaaaagagttacccctcagagaatcccaaaagatatcaaaatatccagacttttgtc
-tcagccccttcattttgatagttcactattcaccaaatacaggttgccccaggaagggca
-tggcctgggatgaagtggccctctcaagctgaggctaaccttgaaggggctgaagctgaa
-ggctctctgctgaccatgcttccCCCGCCTTCAGCTGTCAAGTCCTTCAGGGTCAGCTCA
-GTTCTGAGTGCCACTTTACTTGGGGTCACTTCTTTGATTCCAAGCAGTTTAACATAATGG
-CAACCACAGTTAGGGAGACCTGTCCTGGTGGATCAGGGTGGCCCAAGCTAAGGTCTGGAG
-GAAAGACGACCCTCAAGAAAAGATGTCTCCTCTGTCCCTCCACCCCATTCATACTAAGGG
-CCATGGGTTCATGGAGAGGGTTTCAGATGGGCACATTATAGGGCTGAGGCTAAAAGTCTC
-TTTGAACCAACTCACACTTGTACAGAAGTGATGCTGTGAGGACTAATGAAaacaagtagc
-atctactgcatgcttaacatacaccaggcactattccaaattttttacccacattagtca
-tttaattctcacattaccctatcagaggaacaatgatGAGCATGGGTATGTAGACCAGAA
-GGAGCTAAAACCCTAGAACACAAGCAGAGGACACCAGTGAGCCCAGGAAAGGCCCTGGGC
-CCCTGGAAGCAGTCTCCTCATCCGCCTGCATGGGCCAGGGTTCAACAGAGGCACCATGTG
-GCTGCAAGAGGCAGAAATGGCTGCAGACTGAGCTCTACTAGTTCCTTCCACTTGATGTTT
-GAATAAAGTCCCTGGAAAACTTGGGGAGATGGGATGAGTATCTCAGCTGGGAACACACCA
-AGACTTCTTAATAAGGCATGGAGAGGCTCAAGCAATTGATTGGAAAGAAAAAAAAAAAAC
-AAAACTAACTCAAGTTGGTAGATTTTACCTGCCATGAGATGTTTGTGAATAGCAGAGCAC
-AGGGTAGAGAGGTCACTGCCAAAGAGCAACTCCCAGTCACCCTTGACATGTGGCATCCCC
-TCTCATGCCTCCACGTCTGCATAAGCTTGGTAATCTTGTGCCCTCTGACACCATTCTCCC
-ACCTGTCACCCCACTCCATTCTGCCCATCAGGATAATGCTGCCACATCCTCCAGGAAGCC
-TTCTCTGGCTGTCCTTCTCCATGACGCTAGGCTCCCCTTCCATCTTCCCACAACTTCATG
-TACCTCCCTCTATCATTTTATTTATCAATCATTCTAGATTTTATGTGTTTATGACTGACT
-TTCCTCCTAGATTATGAGGCAGTATGATTATATTATTTACCTTTCCCACTGTCATGCATT
-CCCATTTATCTCACTCGGCGATTGTCACAACAatgctgcaaactaactaccactaagctc
-agtggcttaaaacaataacttcttctcactcatgggtctgtaggtcagctgggattctgg
-tggtctagactgggctgggctccaggcatgcatgcggatctgctccacgcgtctctcatc
-ctccttgacccacagaagacagctggaagcaggcaggacctcataggctttagctcagag
-ctggtgtgctgtcacttctgcccatgttccatcagccagagcaagtcacatggccaagct
-caacatcaattagatgtggagaaaattgatgagtcatgtggcaaagggcatggatatagg
-aaaaggtgaaaattAGGAATAGTATGATTTACTGTGACACAGATGCTTTCTGGTGAACAC
-CAacctctccaaactcatttcaagacccttcctcatcagcccagtgctcaaggtcaattc
-ctgcaaccttcagccctttgtagcctttcagtcttttgaacacactgtactttttgtctg
-acatacacctttcccatccctttcagatctcagctgagatgtcatctcctcaaagaTTTG
-CATGGCTGTAGGCTTTGCCACCAGGAGATAGTGACCCAACAAACAAGCTTGTATGGGTGA
-GTCCCTGAATCCAAACCCAACCCTGcctggccttgccactcactgctgtgaggccctaag
-aaaatcttatcttttttctactgctgttttcttatctgccaaaagtaaataaaaacaTCT
-TCCCAtatcagttagaaatgcttgcagctgcaagtagcagaacccctaatagtagctaaa
-acaataatatctcacaaactagatgcctggaagcaagaagctccagggctggtttattgg
-ctcagtgatgtaaggacTAAGTGCTCACTCATACCCTCTCATTTCTCCTCCTTCCCTTTC
-CCCATTCTACtaggttggtgcaaaagtaattgtggtttttgccattactttcaatggcaa
-aTTGtggtgcaaaagtagttgtggtttttgccattactttcaatggaaaaaacagcaatt
-acttttgcaccaacagcaaaaacagcaattacttttgcaccaacctTAATATTTCCACAG
-TGTCTTCCCTAAAGTCTCACAGAAGGTTCCCTTTACATTTTACTGGGCAGACATGGATCA
-TATGGCCACTCTAGCAGGAAAGTGAAGTGGGAATGCCAATATCAGGGTTTTGTTGTTGTT
-GTTGTTCAGCCTCCTTTGGGGGAAGCAGCAAACGAGAAGGGGGTAAGAATTGGCTGCTGT
-GTAATCAACTCACAATATCTACTCCTGATCTAACTTTCTACCTCACAGAATTTTTGTGAA
-AATTTGGATTGCCAGTAGCACTCTGAAGGCCACAAGCTTATAAAATAATAATCTACTTTT
-ATTATTATTCATGACTTATTAAGAAAAAATCAATATTGGAAGAGAATAATACTTCGCATT
-TGTTCAACAATGAACTTTCCGAAGGTGAAAGGAAAAGCAATTACTGTCTGAGCCCAGCCT
-GAGTCCCAAGTCCATGCCAAGCGCAAGCCTGCAAGACCATTTCCTCCTCCAGGGACTTGC
-TTCGATTGTGctaaaacagcttctgccaagccaaccaggattgcatgctgccaaatccag
-tactcattttcctgatcttattttatttgaattccctgagcattcaatccagttggcagc
-accctccttgatacatgatcctgtctgggcttctgtatgctcacagccctggttgttcct
-cagtctcctctgctggcttctccccatctacctggtttctagatgccagctgactcagga
-ctcacatgtgagctcctctcctccttcccaccccctatgctctttctgtctcaGGTttct
-caaaccttagcatgcatcaccgtcacagggagggcttgttaacacatagattgctgggtc
-tcactcccacagtgtctgatttcatcgctctagggtgaaacctgaacacttgcatttcta
-acaatttctaggtgatggtgatgatgctggtcctgggaccaccccttgagaacctctCAC
-TGCTCTatctcaaccagtgttgagagccttgtttctcagccttggctgcaaattggaatc
-acccggggtgctttaaaatatggacaccaggatctcatcccccagagattctgattttaa
-tggtctgcattatatcctgggtacctagagttaaaaacctcccccaggtgacttcaacat
-gcaggtaaagttgaaagcccctaatttagatactacttaactgctagtaacacctacatt
-tatttccctctcccagacttgtcctctgagttttagcccagtatgcccaattattcactc
-gatatctccacttacgtgactcacaagcatctgagagttaacacacccaaagtggaagtc
-tgaatcttcacttccaaattgctacttctctatcttccccatctcagcaaacagcaactc
-catccatgtgctgtagtttattggggtaaaaaccttggagttatctttggctcctctctc
-ccctccatgacccatatataatcctttgacatagtctatcggttccacctacaaaacata
-tccctaaattctcctctctgcctgaactgctaacacctacatcagaatatcatcaactct
-ttcctgggtggtctctgcagcatcctcacctccctacttctattctttactccctcgcca
-atgcatcctccaaacagcagccagaatggtctcttaaaatcataaaccagatcatgatac
-accccgatttaaagtcttgcaaaacttcctgtcaccttgggcataaaatctcagctcttg
-ctcatggccagtgagatcctgtcctcttctcaaccttgtctattccgctctctccctggc
-ttagatactccaaacacactggccttccttctgtcccttaaatacattcagttatttctt
-gcatttactatttcattaacctggatttctgttccctttggactctgcttggccagctac
-ctctcatctttcaggtctgcttaagtgtcactgccttaaagtgtctccctgacccgcctg
-ttatgttctatcataagactctatattcttcttagcgcctatcagagttggtgatcattt
-gatttgtaaatatattggtttattatttgtctctctcactagactgtgtgctttgtgagg
-gcaggaaccatgcctgttttggtcacggttgacacctcagtgcccagaagagtgaatgag
-acatagtgggtattcaaaacatacttagggagggagagaaaagaggaagaaaaaggaggg
-aggagaaaggaaggTCTAGTAATACTCAGAGCCCAGGAATTACACACCAGATACCCCTTG
-CTTCTACCCAAGAGGTGGTTCAGATTAGAGATTAGATTTCAAGGCTCCAGCTTGCTAGCT
-CATAACTGCTTCTACTCAAGACGGTCTATTCATGTAGCAAAGTCaaaatgtgaacatgct
-tttaagttccttgacgacaggaattgtggcttgtttactcttctacctggcatttgcaca
-gagcctgggcctgaatgaaagttcagtaaatggttcatgaatgaTTTGAATGGCATTTGC
-CTGAAGGAAATCTAAGAAAGTCTTGCCTTGGTTTCCCCATTAAATGGGGCAAGCAATTCT
-TATCTCCCCTTCCAGAGAGCTGCTGCCAACACAGGGAATCCATCCTGGAAGAAAAGATTG
-GTGGCCACCTGCACCATCAGGTGGAGGGCATCTCTCAGCTGCCCTTGCCACATCTGCAGC
-CCTAAGCTTCCAGGTGACCCCAGTGGACCAGTCTGCCCAGAGCATATCATTAGTTAGGGG
-CACTCTGCAGGAGGATGCCTGCCTTTGCTAGTGCATAGCTAATGTCCCAGGGGGCTTCCT
-CTAATTAAAACCCAAACTGCAATTATAGTTGTGCCAAAGCATGTGCACATGGCGCCACTT
-AAAAGGGACAGATTGACAAGGCGTTAACAACTCCAGAGGCAGCATTGTCCCAGCACCAGG
-TGCTACCAATCATCAAAATTAGAACCAAATGAGTCACTGGGGCTCAAGATACAGTATCCA
-GTGCAGACTAATGGGTGATTCCAAGAAACTTATGAGGATTATTTAAaacacactaactat
-gctccttctacagggcctttgcacttactagtccctgtacttcttcttgcctaactctat
-ttgatctctctcaattatcacctcttctgagacacctgctttgatcacatgaatctctac
-cctgctttatttttcttcttagtgtttattatcatctgatattatatatttgtttTGCGA
-TTGATAGCCCaaaatatgttttaatattgtataaatgtaaaacatatataaatacacaaa
-attttataattttCTGCAATACATATGTATCAAGAAGATACAGCATACACACTAAGGAGG
-GTGTCTTCTTGGGGTTGGGGGTGGTGAGGCAGGGGAATAGAAAGACTGATTCAGAAAGAA
-GAGAGGAACAATAAAAGAACAAATGAGAATATTTATATATCCTGATGACAATAGTGGGCC
-ATTATTTGAAGAGTATGATAAACTTGAATTTTCCTTCCTATCACTTGGTAAACTTGAATT
-ATTCCTCCCTGAAGTTCTGTACTCTGGGAAAAttttcttttttttttttttttggagaca
-gagtcttgctctgtcaccaggctggagtacagtggcacgatctcggctcactgcaacctc
-tgcctcctgggttcaagtgattctcatgcctcagcctcccaagtagctgggattataggc
-acatgccaccacacccagctaatttttgtatttttagtagagacagggtttcaccatgtt
-ggccaggatggtctcgatctcctgacctcatgatctgcccaccttggcctcccagagtgc
-tgggattacaggtgtgagccaccatgcctggccACTCTGGGATAATTTTATTTTGGTTTT
-TAGAAATAACTTTATTGAATATTTTAGTACCAGTAATCTTGCGATAAATTTCAGCCCTGG
-TTTGGTTGTTGTTgttgttgtttttggtctaaagccatcttgattttgcctttatttttg
-aagagtatttttactagatatagaattctaagttgtcaattatgtatattttttcagcac
-tttataaatgttatttcattgtcttctggctttcatcatttctgttgaaaagtctaccat
-cagtcttattgttgctcttctgtaggtaatgtcatttacctctgactacttttaagattt
-ttctctttatttttgtttttcagcagtcttactatgatgttcctatgtataattttctta
-gtatttaccctgcttgggattgtcagagcttcttgagtctgtgggttgatatcttttatc
-agttttgaaaaaattcttagctcttatttctgcaaatattgttaattttgtattcttatc
-ctcaccttctaggactccaaataaatgtatattttttttactaggtcccacatatctatg
-acacattcgtgtattttctattatttttctatgtatactttagtttggacacttttcatt
-tttttaagtgtgctaatcctatcttccactgtatcaaatctctgttaatcccatctgatg
-aatttttgatttcagatattatattttctcattctagaggtatcattttttcttttttat
-agacgctaattttctgatgaaattctccatcttttcaaatattttgtgcatatttttctg
-ttttttaaCATATTAATCTTAGCATGTCAAAGTCATTATCATATACCTGTTTCTATTGTC
-TATTTTATTCTGTTTGTTTTCAGATATGTCCTAGCTTTGGCATAACTAATAATGTTAATA
-GAATGCCACTTATTATACATAATGTAGAGACTCCAGATGATATATTCTTCTAGAGAAGAT
-TTACCCTCTGCTAGGCACAGAGTGGGGCTTATCATCATAAACCAGTCAGGGATTGTACTG
-AGTCAAGACTGTAAGGTAACCCCAGGAAGGTCAGTTTCCCTGTGCTTCAGTCAGTCATAC
-ACTGAACACCTCTTCTCAGAGGCTTTATGCCAAGGTTTATAGCCTCCTGCACCAGGTATC
-CCAGAATCCAGCAAGTGTCTTGAGGGATTAATGAGCCCTCAAGTCTGCCAAAGGCTCTGC
-TGGTTTCTTCCACACTAGTCCAGTGCTGCATAAAACTTGGATTCTCAGCATTCTGCTTTT
-GCCTAGAATTGGAAAATGGTCTGGGGTAAAGAAGCTATATAATTCAGCTTACTCCCCTGC
-TGTTCATTCCTTTCCAGAATTTTAGCAAGTAGTATATTTTTTTCCAATCCTatgatatct
-gacaatgctactatatttctctagtcaatttactcttccatttcctgggcaaccatttca
-ctttctcttatttcttcacatctttgacaccttctttctctcctcacttctaactgacgg
-cttacaaatgaaagcaagtggaatgacaataactttttataaaaacttctacactagtcc
-atcaacacgtctctctaatacttctccctccctctctttctctctctccctttctctctc
-tccatgtgtctgctggatcccatcattctcatctaatcaaggactttgctcctataatca
-tccctccatgaatcattttcctctctctgctaaattattcccataagtggacaaatatac
-cattagtctcccatcttctaaaaagtatataccctcccttgtctcaatatctctgtgcag
-ctacccccacattttgtttcttcccatttgaagcaaaactcctcaaaaattgtatatatt
-cactatcttcattttctttccttctatgccaaacaggttttcctccttcaaagctactct
-catcagggtcaccaaatacctctgcattgccaaatccagaggtcagttcacagacctcgc
-cttacctgattgctcagaagcatttgacactgttctctttgctggttcttcctcatgttc
-tcgacatctgagtgttggagacccccaaaatcagtcctaggactctttcttttccttcta
-tatattccttttacgtgctttccttattctctttgtatataatttaatacctctactggg
-taatttacaaagaaaacaaacttatttctcacagttctagaagctggaaagtccaagatc
-aaggcagcagcatgttcagacgtgtggtgagggctgccctctgcttcctagatggtgcct
-tgatgctgttgtcctccagaggagaggaaatctgtaaattcacatagtggaagatacgga
-attatgaaaaaggaacaaactccctccatcaagctcttttatcagtaccttgatccattc
-tgccctcatggcttaaacacctttcaaaaggccccacttcaacactgttgcattggcaat
-taagtttccaacacacacattttggggaacacattcagaccatagcaacccttttgttca
-gtctcatgattttaaatatcatttatattttatgactctcaaatgattctagccagaaat
-tatctcatgagctctagactctctctacatacccacattaacaGCAACGAAAGCACATTT
-AATCAATTTAACCCAAGGAAGTAATACGATGAGCTCAGGTAATACAGACTGAGACTTCAT
-CCAAGATCACAAGGATGGTATGTGCTAGACTCCAAAGAGATGCCCAAGATTTTGTAAATA
-CCCTTCCCTTCCACAAGAATAGAGTTGTTATTTGGTGTGATTTCTCAGGGAGTTGGGGAG
-ATCTCTTATCAAACTCCCAAATTGCTCTCCAATCTGCTCAAGTTTTCTGAAATGTTGTTG
-tttctgggtcatagcatatgcacatacttactttggttaagttcagccaaattatttctc
-cagaatggctgttccagtctacattctttccagccatgcctgtgggctcttatctccaca
-tctttgccaggtattactagccttttagtttttgcctggttaataaatgtaaagtgctaa
-ttctctgatgttttatttatcatattactaattaatttgagcatctctcacttacttgtt
-ggcttgtttctttttccataaattggtatccatttctcttgccagttttttattatggag
-tatatatatattgccaatttaaaggacttctttgaatattctagTGATTTGTCCCCTGTC
-AATTTTAGAAATTGCAAACATCTCCTAATTTGTCATTAGTCTATTATCTTTGTCTTTATG
-TCTGTCATTTAAGAGAAATCATTTTCCTGTAAATGTTTTAAAActttttattgtaaaata
-aaacacattaaaaatctcacacggcaaatgtttaacttagtaaattattataaactgaac
-cctttaaagtattactcaagtcaagaatataactttgccggccattcagaagcccctccg
-tatgttctatcccaattatagctccctctcccctccaaaagcaatattaccctgactttc
-atatcaatcactttcttgcttcttttatcatccaagtgtgcacccccagacactatggtt
-tagtcttgccATTTAAAAAAATgtttatatgtattttgagtctcttttaatctacaggct
-ccctttccatctcttctctttctttaatattcatctgttgaagaacccaggccatttgac
-ctgtacagagtcccatagtttggaatttgctgattgcaagtcttggtgaagttcaagatt
-cctctgtttaacgtctttactgtaaatggacagctggtccagaggcttcatcaggctcag
-acgctgtgttattttatcatgtggcacattcctatctgggtgcttctctttgagaaggca
-gtgacacttaaagattagatctattgattcattgcggattggaaaaaggggatgttctaa
-ttccattttttttttcattttttttaactggaataattttataaagagacacttttctca
-ctcgccattggttattgttacgaactgaattgtatccctccccaaattcattcattcgtt
-gaaacctagcccccaatgtcactgtacttggatatagggccgctagggaggtagttgagg
-ttaaatgaggtcagaagggtagggtactaatccaataagactggtacccttagcaaacaa
-agagactccagtggtctgtgtccttctctccatacctgcaaagaggaaaggccatatgaa
-gacacaatgagaagtcagccctctgtaagccaggaaggaagactcaccagaaaccacatt
-ttgtggcaccttgattttggacttcccagcctccagaactgtgagaaaataaatttctgt
-tgtttaagccacccattcggcggtattttattttggcagccctagcaaactaacaccatt
-acccaagtggtataattaatacataaaagagaagataactgcttgattctctttatttac
-caggtttcgagataatgaatttgttcctgttatcctccaaaggctaccatttaaattctt
-ttgttattattaaatcatggatttaagtatagtttgtggttttcaatccattgcattttt
-attctaattgacaatcaagttgttccatctttgaacagtaggaagctctttggcttggct
-cctgaggccttttgacttatctcccttagtccttgaagcttctttgtatcttgaatgaca
-aaatattccaggcttgtcctaccttcatatcctgctttaaacctagaatcagccatttct
-tcaaggagtcctgggtccttctaatgagaaattttatttcaagactataatatgaatgct
-agagatgttcactgctcctgggctgctcattaagtctaggcttcttgagtgggcaaagct
-aatatacatatatgtatgtgtgtgtgtgtgtatatatatatatataactcatgaattcat
-actggttcaatgagttcagttctaacttagaactcagattgttcacttaacttcttttac
-actatatttgaatcttttttcttacattctgagaattctggttcttaatatcACAGGGAG
-TGATATAATTAGGATGTCAATAGTCTTTAATTATTTAATTTATCCCATGTTGTACACACA
-ACAATACTACCAATCCTAATTACTGACAACAGTTTAAAAAGTTTTGCATATGCTATTCCA
-TTCCCTCCCCATTTTTATATTTACATAATCAAATAATAAAGCCTTTAATATATAGTCTCT
-ttctggtcttagttccgcaagtgggtatatataaaggctcaaaatcaatctttatattga
-catctctctacttatttgtgttgtctgatgctcatattgt
diff --git a/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.dict b/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.dict
deleted file mode 100644
index 8690a8d..0000000
--- a/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD	VN:1.5	SO:unsorted
- at SQ	SN:chr1	LN:8	M5:cc0af3a4fedb18378b4b57b98068e69f	UR:file:/Users/alecw/Documents/work/Picard/Picard-public/htsjdk/testdata/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta
- at SQ	SN:chr2	LN:8	M5:eaa45adaaf6d104af176897fc5d4b179	UR:file:/Users/alecw/Documents/work/Picard/Picard-public/htsjdk/testdata/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta
diff --git a/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta b/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta
deleted file mode 100644
index b3ab72d..0000000
--- a/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta
+++ /dev/null
@@ -1,4 +0,0 @@
->chr1
-ACGTACGT 
->chr2
-TCGATCGA 
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/reference/testing.fai b/src/test/resources/htsjdk/samtools/reference/testing.fai
deleted file mode 100644
index 65b7c02..0000000
--- a/src/test/resources/htsjdk/samtools/reference/testing.fai
+++ /dev/null
@@ -1,7 +0,0 @@
-chrM	16571	6	50	51
-chr1;boat	247249719	16915	50	51
-chr2:money	242951149	252211635	50	51
-chr3::;	199501827	500021813	50	51
-;;;;;;;;	123	234	456	789
-file:gi|17981852|ref|NC_001807.4|	16571	2911876801	70	71
-
diff --git a/src/test/resources/htsjdk/samtools/roundtrip.sam b/src/test/resources/htsjdk/samtools/roundtrip.sam
deleted file mode 100644
index d65463a..0000000
--- a/src/test/resources/htsjdk/samtools/roundtrip.sam
+++ /dev/null
@@ -1,16 +0,0 @@
- at HD	VN:1.5	SO:unsorted
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at RG	ID:0	SM:Hi,Mom!
- at RG	ID:rg1	PL:ILLUMINA	SM:sm1
-A	73	chr2	1	255	10M	*	0	0	CAACAGAAGC	)'.*.+2,))	RG:Z:rg1
-A	133	*	0	0	*	chr2	1	0	CAACAGAAGC	)'.*.+2,))	RG:Z:rg1
-B	99	chr1	1	255	10M	=	26	35	CAACAGAAGC	)'.*.+2,))	RG:Z:rg1
-B	147	chr1	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:rg1
-C	99	chr2	1	255	10M	=	26	35	CAACAGAAGC	)'.*.+2,))	RG:Z:rg1
-C	147	chr2	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:rg1
-D	99	chr3	1	255	10M	=	25	35	CAACAGAAGC	)'.*.+2,))	RG:Z:rg1
-D	147	chr3	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:rg1
-E	99	chr1	2	255	10M	=	15	30	CAACAGAAGC	)'.*.+2,))	RG:Z:rg1
-E	147	chr1	15	255	10M	=	2	-30	CAACAGAAGC	)'.*.+2,))	RG:Z:rg1
diff --git a/src/test/resources/htsjdk/samtools/samFilter01.js b/src/test/resources/htsjdk/samtools/samFilter01.js
deleted file mode 100644
index 3fe7e00..0000000
--- a/src/test/resources/htsjdk/samtools/samFilter01.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/** answer to https://www.biostars.org/p/77802/#77966 */
-(record.referenceIndex==record.mateReferenceIndex && record.referenceIndex>=0 && record.readNegativeStrandFlag!=record.mateNegativeStrandFlag &&  ((record.mateNegativeStrandFlag && record.alignmentStart < record.mateAlignmentStart ) || (record.readNegativeStrandFlag && record.mateAlignmentStart < record.alignmentStart ) ))
diff --git a/src/test/resources/htsjdk/samtools/samFilter02.js b/src/test/resources/htsjdk/samtools/samFilter02.js
deleted file mode 100644
index 046e7ec..0000000
--- a/src/test/resources/htsjdk/samtools/samFilter02.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/** accept record if second base of DNA is a A */
-function accept(r)
-	{
-	/* using substring instead of charAt because http://developer.actuate.com/community/forum/index.php?/topic/25434-javascript-stringcharati-wont-return-a-character/ */
-	return r.getReadString().length()>2 &&
-		r.getReadString().substring(1,2)=="A";
-	}
-
-accept(record);
diff --git a/src/test/resources/htsjdk/samtools/seekablestream/megabyteZeros.dat b/src/test/resources/htsjdk/samtools/seekablestream/megabyteZeros.dat
deleted file mode 100755
index 7c2624a..0000000
Binary files a/src/test/resources/htsjdk/samtools/seekablestream/megabyteZeros.dat and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/seekablestream/seekTest.txt b/src/test/resources/htsjdk/samtools/seekablestream/seekTest.txt
deleted file mode 100644
index 194e3be..0000000
--- a/src/test/resources/htsjdk/samtools/seekablestream/seekTest.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-aaaaaaaaa
-bbbbbbbbb
-ccccccccc
-ddddddddd
-eeeeeeeee
diff --git a/src/test/resources/htsjdk/samtools/sequenceWithSpace.bam b/src/test/resources/htsjdk/samtools/sequenceWithSpace.bam
deleted file mode 100755
index 74da758..0000000
Binary files a/src/test/resources/htsjdk/samtools/sequenceWithSpace.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/sequenceWithSpace.sam b/src/test/resources/htsjdk/samtools/sequenceWithSpace.sam
deleted file mode 100755
index 766bc67..0000000
--- a/src/test/resources/htsjdk/samtools/sequenceWithSpace.sam
+++ /dev/null
@@ -1,6 +0,0 @@
- at HD	VN:1.0	SO:coordinate
- at SQ	SN:chr21 afterspace	AS:HG18	LN:62435964
- at RG	ID:L1	PU:SC_1_10	LB:SC_1	SM:NA12891	PL:ILLUMINA
- at RG	ID:L2	PU:SC_2_12	LB:SC_2	SM:NA12891	PL:ILLUMINA
-read_28833_29006_6945	99	chr21 afterspace	28833	20	10M1D25M	=	28993	195	AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG	<<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<<	MF:i:130	Nm:i:1	H0:i:0	H1:i:0	RG:Z:L1
-read_28701_28881_323b	147	chr21 afterspace	28834	30	35M	=	28701	-168	ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA	<<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<<	MF:i:18	Nm:i:0	H0:i:1	H1:i:0	RG:Z:L2
diff --git a/src/test/resources/htsjdk/samtools/serialization_test.bam b/src/test/resources/htsjdk/samtools/serialization_test.bam
deleted file mode 100644
index 3198626..0000000
Binary files a/src/test/resources/htsjdk/samtools/serialization_test.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/serialization_test.bam.bai b/src/test/resources/htsjdk/samtools/serialization_test.bam.bai
deleted file mode 100644
index a20e0b8..0000000
Binary files a/src/test/resources/htsjdk/samtools/serialization_test.bam.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/serialization_test.sam b/src/test/resources/htsjdk/samtools/serialization_test.sam
deleted file mode 100644
index 337bb9a..0000000
--- a/src/test/resources/htsjdk/samtools/serialization_test.sam
+++ /dev/null
@@ -1,8 +0,0 @@
- at HD	VN:1.5	SO:coordinate
- at SQ	SN:1	LN:16000
- at SQ	SN:2	LN:16000
- at SQ	SN:3	LN:16000
- at SQ	SN:4	LN:16000
- at RG	ID:0	SM:FOO	PL:ILLUMINA
- at PG	ID:1	VN:2.0	PN:BAR
-a	99	1	200	0	76M	=	255	-130	ACCCTAACCCTAACCCTAACCCTAACCATAACCCTAAGACTAACCCTAAACCTAACCCTCATAATCGAAATACAAC	BBBBC at C?AABCBB<63>=B@>+B9-9+)2B8,+ at 327B5A>90((>-+''3?(/'''A)(''19('7.,**%)3:	RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/sra/test_archive.sra b/src/test/resources/htsjdk/samtools/sra/test_archive.sra
deleted file mode 100644
index a9b6e70..0000000
Binary files a/src/test/resources/htsjdk/samtools/sra/test_archive.sra and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/uncompressed.sam b/src/test/resources/htsjdk/samtools/uncompressed.sam
deleted file mode 100644
index e3fe151..0000000
--- a/src/test/resources/htsjdk/samtools/uncompressed.sam
+++ /dev/null
@@ -1,15 +0,0 @@
- at HD	VN:1.0	SO:unsorted
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at RG	ID:0	SM:Hi,Mom!
-A	73	chr2	1	255	10M	*	0	0	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-A	133	*	0	0	*	chr2	1	0	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-B	99	chr1	1	255	10M	=	26	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-B	147	chr1	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-C	99	chr2	1	255	10M	=	26	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-C	147	chr2	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-D	99	chr3	1	255	10M	=	25	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-D	147	chr3	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-E	99	chr1	2	255	10M	=	15	30	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-E	147	chr1	15	255	10M	=	2	-30	CAACAGAAGC	)'.*.+2,))	RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/unsorted.sam b/src/test/resources/htsjdk/samtools/unsorted.sam
deleted file mode 100755
index e3fe151..0000000
--- a/src/test/resources/htsjdk/samtools/unsorted.sam
+++ /dev/null
@@ -1,15 +0,0 @@
- at HD	VN:1.0	SO:unsorted
- at SQ	SN:chr1	LN:101
- at SQ	SN:chr2	LN:101
- at SQ	SN:chr3	LN:101
- at RG	ID:0	SM:Hi,Mom!
-A	73	chr2	1	255	10M	*	0	0	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-A	133	*	0	0	*	chr2	1	0	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-B	99	chr1	1	255	10M	=	26	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-B	147	chr1	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-C	99	chr2	1	255	10M	=	26	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-C	147	chr2	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-D	99	chr3	1	255	10M	=	25	35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-D	147	chr3	26	255	10M	=	1	-35	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-E	99	chr1	2	255	10M	=	15	30	CAACAGAAGC	)'.*.+2,))	RG:Z:0
-E	147	chr1	15	255	10M	=	2	-30	CAACAGAAGC	)'.*.+2,))	RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/5k-30BB2AAXX.3.aligned.sam.fastq b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/5k-30BB2AAXX.3.aligned.sam.fastq
deleted file mode 100644
index 5f17cbb..0000000
--- a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/5k-30BB2AAXX.3.aligned.sam.fastq
+++ /dev/null
@@ -1,19808 +0,0 @@
- at 30BB2AAXX080903:3:3:1535:1429#0
-ATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTTTGGGGNCGACNCN
-+
-677777888888888888838888777765554431221000/.,.,-,,+,+***))*)(((((''$"#""$"#"
- at 30BB2AAXX080903:3:46:1133:292#0
-ATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTTTGGGCTTCATCAC
-+
-67777788/88888888888888877776555443222100//.,---,,+++***)))))(()(('$$"#"##"#
- at 30BB2AAXX080903:3:60:396:738#0
-AGGTCTATCACCCTATTAACCACTCACGGGGGCTCTCCATGCATTTGGTATTTTCGTTTGGGGGGTGTGCANCTNN
-+
-677777888888888888888888777765'5443222100//..---,-+++*****))))()'(&&&$""##""
- at 30BB2AAXX080903:3:56:234:1484#0
-CACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCATGT
-+
-677777888888888888888888777764554432/2100//..,-+,,+++(*()()('(()%(&%"#$%$#$#
- at 30BB2AAXX080903:3:45:1034:790#0
-TCACGGGAGCTCTCCATGCATTTGGTATTTTCGTTTGGGGGGGGGGCACGCGATAAGATCGGAAGAGCGGTGCCTC
-+
-6777778888888888888888887.776551443222100/&.%--,,,-+***))))())(((('$%"""#$"#
- at 30BB2AAXX080903:3:54:503:1305#0
-ACGGGAGCTCTCCATGAATTTGGTATTTTCGTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGATGTGTCTNC
-+
-6777778888882888+88888887777655544322210.//.-.--,,+***)&))))*(((((#"""&&$$""
- at 30BB2AAXX080903:3:59:186:1839#0
-CCGGCTCCAGCGTCTCGCAATGCTATCGAGGGCACACCCCCCAAACGAAAATACAAAATGCATGGAGACCACCNNC
-+
-677777888888888884/888487)77$57534+2,+,0&/.*-,-(+,*)+*%)()))#((((%'&"$"#"""#
- at 30BB2AAXX080903:3:51:735:897#0
-TGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAATACCAAATGCATGGGACACTC
-+
-67777788888888888888888877773555442222100//..--,,,+++++*)*))())((('$$""#"###
- at 30BB2AAXX080903:3:3:724:724#0
-GGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAATACCAAATGCNCTCANTG
-+
-6777778888888888888888887747655540322,100./--+--,)+*)*))))))'''((''$"#"$#""$
- at 30BB2AAXX080903:3:39:1558:516#0
-TCTCCATGCATTTGGTATTTTCGTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCGC
-+
-67777788888888888888888877776555443222100//..-.--,+,++***)*)))(((('"$#$#"#"#
- at 30BB2AAXX080903:3:38:1200:1023#0
-AGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAATACCAAATCCATGGACG
-+
-67777788888888888888888877776555443222100///.--,,,)+++*****)))((((%"$%&$#"#"
- at 30BB2AAXX080903:3:41:523:1441#0
-AGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAATACCAAATGCNCNGACA
-+
-6777578888888888888888887777656554321220//..----,,++*)+*))())('((('$%"#"%##"
- at 30BB2AAXX080903:3:53:366:2032#0
-ATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAAAGATCGGGTGACAGN
-+
-6777778888888888888888887777655544321200./.-,.-,,++++)*(*))(((((''&$"#""###"
- at 30BB2AAXX080903:3:51:505:1972#0
-CCATGCATTTGGTATTTTCGTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCTCACTCGC
-+
-67777788888888888888888877776555443520120//-.---+,,++*****)()(&((''$"$"#"#""
- at 30BB2AAXX080903:3:57:413:1896#0
-GACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCAGACCCCCAGATCGGAAGAGCGGCCGCTGA
-+
-6233-78.308882888+83'.8,7//525)+111)--+(,-.&-+*&&&)(('('##(''#&'#%&%#$#"#"""
- at 30BB2AAXX080903:3:42:1614:548#0
-TGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCACACGAAAAAACCACACG
-+
-677777888888'88888888888777765404432102/1-.--.)++,*(''*)*)&#(((''''"$%&%%$"#
- at 30BB2AAXX080903:3:59:609:710#0
-TGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAATCGCNACGT
-+
-67777788888888888888888877773555443212100//..-,-,,++++****(')))((''""%%"###"
- at 30BB2AAXX080903:3:3:1192:86#0
-ACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAACNCAGCNAN
-+
-67777788888888.88880888857771553483010/0.//.-.*,,-&+))#)((&'('''(#'$"$$"#"""
- at 30BB2AAXX080903:3:37:77:1412#0
-ATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGATCACCCGCACN
-+
-67777788888888888888888877776555443222000/...---+,,++***)())()((&('"$#$"###"
- at 30BB2AAXX080903:3:34:378:888#0
-TTTCGTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGNTCATGCNN
-+
-67777788888888888888888877776555443222000//..-+,-,++**&*))())(&('''""%#""#""
- at 30BB2AAXX080903:3:33:1309:1759#0
-GTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGGACCCTATAGATCGGAAGANGTACTCNN
-+
-6777778888888888888888887777655541221110+/+.,.&+&&)**)'(()'##'(#''#""##$""""
- at 30BB2AAXX080903:3:52:949:1056#0
-GTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGNTTCTCG
-+
-67777788888888888888888877776555443222100//..---++,+++*+))))())((('"$""##"$#
- at 30BB2AAXX080903:3:4:1176:963#0
-TTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGAGATCGGAANACCANTN
-+
-67777788888888888888888357771515503.11+./%'-,'-,,+)*#)))##(#'#'#('#$"&&%%"""
- at 30BB2AAXX080903:3:56:536:318#0
-TTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGAGATCGGACTGCAG
-+
-67777788888888888888888877773555443221100/...+.,+,,+****))))()')'&&"%"$###""
- at 30BB2AAXX080903:3:43:1770:1227#0
-ATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCGCGCAAAGCTATCGCGTGCACATCCCGCGGC
-+
-67777788888888888888888837776565423212100//,.',(,++$**%(#*)))%('(%%&%"&"&%#"
- at 30BB2AAXX080903:3:4:466:1151#0
-TGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGGCNCTTGNTN
-+
-6777778888888888888886887777353543103/0-.//*-,+(),,()*'%)(&)''(%'&#&"%#"""""
- at 30BB2AAXX080903:3:59:1044:433#0
-GGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGGCAGCNA
-+
-6777778888888888888888887777655544122210.//..---,,+,+***)))*))(((('&$#$$#$"#
- at 30BB2AAXX080903:3:4:903:1139#0
-GGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTCNCTCTNAN
-+
-67777788888888888,8888883777652(4130,20*0/.-,,,&,,*,+')*#()&((&'#''$"$&%""""
- at 30BB2AAXX080903:3:37:1075:826#0
-AGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGCGTTGCN
-+
-67777788888888888888888877776555443.22100///-.-,,,+++*+*))())((((''$%#"%%##"
- at 30BB2AAXX080903:3:48:267:1183#0
-AGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGCGTGAGA
-+
-67777788888888888888888877776555443122100///.---,,+++++*)))()((((''$$""""%"$
- at 30BB2AAXX080903:3:1:1520:633#0
-GAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATAGATCGGNACNACAA
-+
-67777788888888888888888577776555443212///./.---+,,*+*'*)*))((((((%'$""#"$$#"
- at 30BB2AAXX080903:3:38:917:1353#0
-GAGGCAGGAATCAAAGACAGATAATGCGACAGAGGGGGCGCCGGCTCCAGCGTCTCGCAATGCTCTCTCCCCACAC
-+
-62777788888888/88838888%7777%/524130221%,+/-,---,(+*#(**'(%(#')##%#"#"#""$#$
- at 30BB2AAXX080903:3:48:1620:1412#0
-TGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTAGCGCGTTCTC
-+
-6777778888888888888888887777655544322-101....--,,,,++***))('(&('''%""$#"##"#
- at 30BB2AAXX080903:3:4:792:911#0
-TGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATANATCANAN
-+
-67777788888888888888888877776555443222120//...--,,+*+**))*)()))((''"""#$#"#"
- at 30BB2AAXX080903:3:35:769:1076#0
-GATGAGGCAGGAATCAAAGAAAGATACTGCGAAATAGGGAGCCCCAGCTCCACCGTCTCGCAAAGCCNCAGTGATN
-+
-67777788888388888881+4867*776555%112221./.+&/.-&$,*'#&*&()))(%##('&"""""#"$"
- at 30BB2AAXX080903:3:36:1397:1463#0
-GGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCACGACACGN
-+
-6777778888888888888888887777655544322210//0..---+,+,+****)*)((((&'#$$"#%#$""
- at 30BB2AAXX080903:3:39:15:1916#0
-GGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGACGCAGCTCT
-+
-67777788/888888888888608777&657544220111//'.+-,-,,+++)'*)&)(('('&%#$"%""$##"
- at 30BB2AAXX080903:3:60:1286:1697#0
-GGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCGGCAGCGTCTAGCAATGGTCACATANN
-+
-677777888888888880888188777765554&022*1*,/&(*(-,,(&)%)&*&'##&'('(&#$$%%&""""
- at 30BB2AAXX080903:3:48:1573:1467#0
-CGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCACCGTT
-+
-677777888888888888881888777765554402221000..+*.++,++**&**))&')&''%#$"$""#"##
- at 30BB2AAXX080903:3:50:307:1304#0
-GCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGGCGCAGTATCTGTCTTTGATTCCTGCCCCCTCACAC
-+
-6777778888888888888888887773655532321210&./.---&,+++*)*)**')''('('%"$$#%"$"#
- at 30BB2AAXX080903:3:55:781:193#0
-AATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAACTCTGTGC
-+
-67777788888888888888888877776555443222110//.,---,,,,+*****))()(((('$"##"##"#
- at 30BB2AAXX080903:3:45:1521:794#0
-CGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATCTATCGCAC
-+
-6777778888888888888888887777635554-2221000/.---,,,,++**)*)())((((''$&#""$""%
- at 30BB2AAXX080903:3:50:1663:1087#0
-GGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCACGGCACAC
-+
-67777788888888888888888877776555443221100//.--,-,-++++**))(())()(''$$""#####
- at 30BB2AAXX080903:3:3:760:1493#0
-AGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTANCGCCNTC
-+
-677777888888888888888888777765355430220/00/.-,,-,,+++**&))*)')(((('""$%$#"#%
- at 30BB2AAXX080903:3:44:343:675#0
-CGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTAGATCG
-+
-67777788888888888888888877776555443222100//..---,,+++****))))(()((&$'&"%"""%
- at 30BB2AAXX080903:3:44:1708:1325#0
-GCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCTCCTCCGT
-+
-6777778888888888888888087777+55544352210///+/.-,,,,*+**)()))))(('(''$#%&#"#$
- at 30BB2AAXX080903:3:57:317:1066#0
-ATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATAAAAGACAGATACTGCGACATAGGGTNCTCGAC
-+
-6777778888888818888888887777655344321210,/.$,----++++%*)**()(((&((&'""""##"#
- at 30BB2AAXX080903:3:44:1187:1203#0
-CGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATT
-+
-67777788888888888888888877776555443222100//..----,+++***)*))))((('&%&&$$&$$$
- at 30BB2AAXX080903:3:2:1371:779#0
-GGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTNCACACAC
-+
-67777788888888888883888877776555443202100....--,,,,,+***()))'((((''&"%&#$##$
- at 30BB2AAXX080903:3:4:1100:1716#0
-TTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTCNCACCNCN
-+
-67777788888888888888&8824777945344322010,//,.---,,,++****)))))((((#$"%$#$"#"
- at 30BB2AAXX080903:3:55:930:977#0
-TGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGATCA
-+
-67777788888888888888888877776555443222100//-..--,-++**))***)*((((''$&"#"#"#"
- at 30BB2AAXX080903:3:50:302:933#0
-ATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGTCGCCGTG
-+
-67777788888888888888888877776555443222100//.----,,+*+*****))))))((($"$"#""""
- at 30BB2AAXX080903:3:57:1469:1852#0
-TTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGAACAGATCAC
-+
-67777788888888888888888877776555443222100/...---,,,++***)*))*(((('('$%####"$
- at 30BB2AAXX080903:3:43:934:69#0
-ATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTAATTAATGAG
-+
-67777788888888888888888877776555443222100/./.--,,,+,+***))))()()(''''&#&$%$$
- at 30BB2AAXX080903:3:47:1027:908#0
-TGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGCGCGTGCAT
-+
-67777788888888888888888877776555443222100//..----,+++***)*)()((((('"###""$##
- at 30BB2AAXX080903:3:55:284:788#0
-TTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTAATTAATGCTTAGCTTGACT
-+
-67777788888888888888888877776525443210111/.-,-,-+,+,++****)()(((&''"$#&%$""%
- at 30BB2AAXX080903:3:59:869:664#0
-CCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATANTCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))(((('&$"%#%##$
- at 30BB2AAXX080903:3:57:144:1832#0
-TACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTGAATGTCTGCACAGCCGCTTCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((('('&%&##"###
- at 30BB2AAXX080903:3:59:1087:334#0
-GTTATGATGTCTGTGTGGAAAGCGGCTGGGCAGACATTCAAATGTTATTATTATGTCCTACAAACATTGTAAACNC
-+
-6777778888888888888888887777+5$,4/20'-.&/#..,.+-,,+,)**(%(#''('#'%#'"""""$"#
- at 30BB2AAXX080903:3:56:151:634#0
-ATAATAATAACAATTGAATGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACACGACTCGC
-+
-67777788888888888888888878776555443222100/,.--,--,+++**))))))))((('""#&%"#%$
- at 30BB2AAXX080903:3:4:1365:1721#0
-TGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCAAACCCCCCCTCCCCCCCNGTCCNAN
-+
-67777788888888888888888877678355433220110//,---,,++,%**+)*))#)(((('$""#"#"""
- at 30BB2AAXX080903:3:50:1218:1566#0
-TAGGGTTCTTTGTTTTTGGGGTTTGGCGGAGATGTGTATAAGCGCTGTGGCAAGAAGCGGGGGGGGGTGCACGCCA
-+
-677777888888188888888&8877776.5014/2'%1.0/'.,,.++,+$'*')(#))((((&('""%$$####
- at 30BB2AAXX080903:3:53:407:1013#0
-TTAGGCTGGTGTTAGGGTTCTTTGTTTTTGGGGTTTGGCGGAGATGTGTTTAAGTGCTGTGGACAGAAGAGGCACG
-+
-67777/888188+8888888888877776555413222*00./.--(-+,+*++**))))))%(('%$#"$""$"#
- at 30BB2AAXX080903:3:57:704:1888#0
-TGGTTAGGCTGGTGTTAGGGTTCTTTGTTTTTGGGGTTTGGCGGAGATGTGTTTAAGTGCTGTGGCCAGGTTTCCG
-+
-67777788888888888888888877776555443222100//.,-,-,,+++***)*)))()(((%%%#"""##"
- at 30BB2AAXX080903:3:8:1664:1236#0
-AAAAGATAAAATTTGAAATCTGGTTAGGCTGGTGTTAGGGTTCTTTGTTTTTGGGGTTTGGCGGAGANCACATGNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((''"%"#"""""
- at 30BB2AAXX080903:3:43:1314:714#0
-ACCCCAAAAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAATTTTATCTTTTGGCGGTATGCACTAGATCG
-+
-67777788888888888888888877776555443222000//.----,,+++****)))))((((&%&#"%"""$
- at 30BB2AAXX080903:3:52:36:1832#0
-GGGGAAAATAATGTGTTAGTTGGGGGGTGACTGTTAAAAGTGCATACCGCCAAAAGATAAAATTTGAACTCAGTAG
-+
-6777778888888888888888887777655544322010./...--,,,+++*+**)*)))(((('$%"%#%"""
- at 30BB2AAXX080903:3:51:882:161#0
-ATGGGAGTGGGAGGGGAAAATAATGTGTTAGTTGGGGGGTGACTGTTAAAAGTGCATACCGCCAAAAGATCACATG
-+
-677777888888888888888888777765554432221/0//..---,,+++***)*))))(((''$#"###%$"
- at 30BB2AAXX080903:3:55:1045:598#0
-TTTGGCGGTATGCACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTACTC
-+
-67777788188888888888888877776555433222100//...--,,-+++**)*))))(('''%&#####"$
- at 30BB2AAXX080903:3:33:507:1544#0
-GATTAGTAGTATGGGAGTGGGAGGGGAAAATAATGTGTTAGTTGGGGGGTGACTGTTAAAAGTGCATNTCGTCCNN
-+
-67777788888888888888888877776555843022100//..---,,++****))))))'((('""##$$$""
- at 30BB2AAXX080903:3:59:961:985#0
-TATGCACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTAATCTCAGTCAA
-+
-67777788888888888888888877776555443222100//-----,,,+****)*))))((((''$&#""###
- at 30BB2AAXX080903:3:50:839:564#0
-GTTGTATTGATGAGATTAGTAGTATGGGAGTGGGAGGGGAAAATAATGTGTTAGTTGGGGGGTGACTGATTACAGT
-+
-67777788888888888888888877776555443222100//.,---+,,++***)))))('('%'%"""##"""
- at 30BB2AAXX080903:3:46:149:683#0
-TTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTAAGATCGGAAGATCGCTGGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((('(&%"%#$#""#
- at 30BB2AAXX080903:3:3:1443:882#0
-GGGGGTTGTATTGATGAGATTAGTAGTATGGGAGTGGGAGGGGAAAATAATGTGTTAGTTGGGGGGTCNCTGTNCA
-+
-67777788888888884888188677176555.4+222000./.-,,-++*+*+))))())(('((%""%##""##
- at 30BB2AAXX080903:3:57:771:103#0
-GGGTGGGGGTTGTATTGATGAGATTAGTAGTATGGGAGTGGGAGGGGAAAATAATGTGTTAGTTAGATCGCGGCAC
-+
-67777788848888888888888877776555443222100/...--++++++****))))((((''""%#""##$
- at 30BB2AAXX080903:3:45:891:253#0
-TGTGTGCTGGGGAGGATGGGGGGGGGTTGTATTGATGAGATTAGTAGTATGGGAGTGGGAGGGGAAACGGCGCACA
-+
-67072788888888888888888877(76.59%42122100//...-+,,+,+%*)*))())((''("""#""$#"
- at 30BB2AAXX080903:3:59:1050:973#0
-GTGTGTGCTGGGTAGGATGGGTGGGGGTTGTATTGATGAGATTAGTAGTATGGGAGTGGGAGGGGAAAATAAGCAC
-+
-6777778888888888888881887771655544312210///..---,,,++***%)))(((((&'&"$###%##
- at 30BB2AAXX080903:3:53:277:2041#0
-ATTATTTTCCCCTCCCGCTCCCATACTACTAATCTCATCAATACAACCCCCACCCATCCAGATCGGAACGGCNCCN
-+
-6777778888888888*888888877776555443222000//..--++,++++**))*))()((('&$"""""""
- at 30BB2AAXX080903:3:46:1516:861#0
-TGTGTGTGTGTGCTGGGTAGGATGGGTGGGGGTTGTATTGATGAGATTAGTAGTATGGGAGTGAGATCGGACGGGC
-+
-67777788888888888888888877776555443222100//..---,,+)+***)))))#()(''$$"##"""#
- at 30BB2AAXX080903:3:48:533:138#0
-CAGCGGTGTGTGTGTGCTGGGTAGGATGGGTGGGGGGTGTATTGATGAGATTAGTAGTATGGGAGGGGGCGCGAGC
-+
-677777888888888888888888777765'54432021*.//.---*,+,+****))))))('(#(""#"#"""#
- at 30BB2AAXX080903:3:1:358:1289#0
-CCTCCCACTCCCATACTACTAATCTCATCAATACAACCCCCACCCATCCTACCCAGCACACACAAGATNACNACAC
-+
-67777788888888888888888877776555443122200//...,--,,++****()))((((('$"#%"$$##
- at 30BB2AAXX080903:3:47:1079:1305#0
-TCCCACTCCCATACTACTAATCTCATCAATACAACCCCCACCCATCCTACCCAGCACACACACACCAGCACGACCA
-+
-67777788888888888888888877776555443222100//..---,,,++*****)))((('('%#"%"###"
- at 30BB2AAXX080903:3:3:851:1747#0
-CTCCCATACTACTAATCTCATCAATACAACCCCCACCCATCCTACCCAGCACACACACACCGCTAGACNCGCANCA
-+
-67777788888888888888888877776555043221121/...--,-,-+**+*))))))(((''""$&&%"##
- at 30BB2AAXX080903:3:60:1051:623#0
-GTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTGCTGGGTAGGATGGGTGGGGGTTGTATTGATGAGATCGTGNN
-+
-67777788488888888888888877776555443222101-/.,.--,++,+**'**))))(((('%"&$%""""
- at 30BB2AAXX080903:3:52:187:114#0
-TTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTGCTGGGTAGGATGGGGGGGCAGAGCGGAAGACCGGCGCG
-+
-67777788888888888888888877770525342212100//+---*-,++)***'#)(#()(#&'$""$$#""#
- at 30BB2AAXX080903:3:2:1270:441#0
-CAATACAACCCCCACCCATCCTACCCAGCACACACACACCGCTGCTAACCCCATACCCCGAACCAACCNGAACACC
-+
-6777778888888888888888887777.3360413000/0.-.,-,,+)***(*&&((((''#'(#&"##"$##"
- at 30BB2AAXX080903:3:50:953:540#0
-TGGGGTTTGGTTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTGCTGGGTAGGATGGGGGGGGGCTGGTGTT
-+
-67777788888888888888888877776555443222100//..---,,+++'**)()))(%('''%$""""""#
- at 30BB2AAXX080903:3:33:1568:449#0
-TTTGGGGTTTGGTTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTGCTGGGTAGGATGGGGGGNCGACCCNN
-+
-67777788888888888888888877776555443222101/+.,---,,+,+**)*))))(((''&"%"####""
- at 30BB2AAXX080903:3:43:1453:1629#0
-CTTTGGGGTTTGGTTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTGCTGGGTAGGATGGGTGGGGGTCTCC
-+
-67777788888888888888888837776555443502000//..-.-,,+)+***%(*)#()((%''%#"#$#$"
- at 30BB2AAXX080903:3:41:1186:644#0
-ACAACCCCCACCCATCCTACCCAGCACACACACACCGCTGCTAACCCCATACCCCGAACCAACCAAACCTCCAANT
-+
-67777788888888888888888877776555443222100//..--,+-+++*++))*)(((((('&%"&&"%""
- at 30BB2AAXX080903:3:50:1591:976#0
-GGGGTGTCTTTGGGGTTTGGTTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTAGATCGGAAGGCTCTNCAA
-+
-67777788888888888888888877776556443222100//..---+,(+****()))('((&('"%%#""#"#
- at 30BB2AAXX080903:3:39:244:215#0
-ACTGTGGGGGGTGTCTTTGGGGTTTGGGTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGGGATAGGGACACA
-+
-67774788888088&8888888-8777365554432220/0//..+-,,,,++**()#)()#(%(('$%"#$#$$#
- at 30BB2AAXX080903:3:34:1458:416#0
-CATAAACTGTGGGGGGTGTCTTTGGGGTTTGGTTGGTTCGGGGTATGGGGTTAGCAGCGGGGTGTGGNCTAGACNN
-+
-67777788888888888888888877776555443222100//.----,,+,+***)**)#)#(&(%"%%""#$""
- at 30BB2AAXX080903:3:58:18:1320#0
-ACACCGCTGCTAACCCCATACCCCGAACCAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTCACTNNT
-+
-677777888888888888888888777795255132210./...-,-,++*+***))(&('(('(''"%""$"""#
- at 30BB2AAXX080903:3:60:1436:1965#0
-TTTGAGGAGGTAAGCTACATAAACTGTGGGGGGTGTCTTTGGGGTTTGGTTGGTTCGGGGTATGGGGACACNAANN
-+
-677777888888888888888888777765554/3('1100//.,---,(,*+**((*))&'((((%$$##"#%""
- at 30BB2AAXX080903:3:48:1341:337#0
-GTATTGCTTTGAGGAGGTAAGCTACATAAACTGTGGGGGGTGTCTTTGGGGTTTGGGTGGTTCGAGATCTGCATGG
-+
-6177778888888888808888887777651343322210)/..,---,,+$+***&*))((((#(%"#"###"""
- at 30BB2AAXX080903:3:36:757:568#0
-AGTGTATTGCTTTGAGGAGGTAAGCTACATAAACTGTGGGGGGTGTCTTTGGGGTTTGGTTGGTTCGCTCTCCTGN
-+
-67777788888888888888888877776555443222100//...,-,,+++***)))()((((('%##&$$#""
- at 30BB2AAXX080903:3:36:758:569#0
-AGTGTATTGCTTTGAGGAGGTAAGCTACCTAAACTGTGGGGTGTGTCTTTGGGTGTTGGTTGGTTCGCTATGACGN
-+
-6777778888888888888*18'877776545243))2100./(.,,-,,+++*#*)*)))(((''#$&#$%###"
- at 30BB2AAXX080903:3:41:976:1436#0
-ACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCCTCAAAGCAATACACTGAAAATGTTTAGACGT
-+
-6777778888888888888888887777655544322210///.---,,-++++***)))))()((&&&%%%#$##
- at 30BB2AAXX080903:3:42:399:173#0
-TGAGCCCGTCTAAACATTTTCAGTGTATTGCTTTGAGGAGGTAAGCTACATAAACTGTGGGGGGGGGCTAGATCGG
-+
-67777788888888888888888877776555443222200//....-,-,*+***)))*))((#'%&&#&$"##"
- at 30BB2AAXX080903:3:41:1791:827#0
-GTGAGCCCGTCTAAACATTTTCAGTGTATTGCTTTGAGGAGGGAAGCTACATAAACTGTGGGGGGTGTCTTTGGCC
-+
-677777888888888888888888777765554432221/0/%..-,-,++,+**))*)))((('&'%%%#$#"#"
- at 30BB2AAXX080903:3:57:550:1680#0
-GGGTGATGTGAGCCCGTCTAAACATTTTCAGTGTATTGCTTTGAGGAGGTAAGCTACATAAACTGTGGTGCGACTC
-+
-677.7788888888888888888877776555443222100//..---,,+,+**+)*))))(((('$&%$"##"#
- at 30BB2AAXX080903:3:42:1112:266#0
-TTTATGGGGTGATGTGAGCCCGTCTAAACATTTTCAGTGTATTGCTTTGAGGAGGTAAGCTACAGATCGGGGNCTA
-+
-67777788888888888888888877776555443222100//..---,,+++**))*)))((('(''$&"%"#""
- at 30BB2AAXX080903:3:51:69:105#0
-GTTTATGTAGCTTACCTCCTCAAAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCACACACCGCTCT
-+
-6770778888888888888888804777555244322+100./.,-,-,+,++***)()(()(('%'%"%""##$"
- at 30BB2AAXX080903:3:40:1472:1490#0
-AGCTTACCTCCTCAACGCAATACACTGCAAATGTTTAGACGTGCTCCCCTCACACACTACACACATAGGCACGTNC
-+
-677077'.8188888+880388(8777&6$/55,02.%2&0//).-*&',*++)*'())))((('(%"&%#$""""
- at 30BB2AAXX080903:3:40:1472:1492#0
-AGCTTACCTCCTCAAAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTCGCANC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*)))((''"&%"$#$""
- at 30BB2AAXX080903:3:47:43:510#0
-CAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGGTCCTAGCCTTATTCATCGC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))()(('"$""#$""#
- at 30BB2AAXX080903:3:38:225:158#0
-ACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGGTCCTAGCCTTTCTACCAGACTNN
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)*))*((((''$$&%"#"""
- at 30BB2AAXX080903:3:2:121:1713#0
-TCACATCACCCCATAAACAAATAGGTTTGGTCCTAGCCTTTCTATTAGCTCTTAGTAAGATTACACATNCAANNTC
-+
-6,7777888888888888888858777765554432.1100//-.---,,+++***)*)))))((('""#&$""""
- at 30BB2AAXX080903:3:60:877:1195#0
-CGGGGATGCTTGCATGTGTAATCTTACTAAGAGCTAATAGAAAGGCTAGGACCAAACCTATTTGTTTACTCCAANN
-+
-67777788888888888888888877776555443222100//..---,,,)+***))()))))((&%$$####""
- at 30BB2AAXX080903:3:55:617:1140#0
-GATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGGGGATGCTTGCATGTGTAATCTTACTAAGAGCAGCTCACG
-+
-677777888888888888888888777765/5443222100//.,--,,,,+)****))))((('('&&$""#""#
- at 30BB2AAXX080903:3:52:1294:1234#0
-ATTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGCTCAGAC
-+
-67777788888888888888888877776555443222100//..---,,++****))))(((((('"&#&&$##"
- at 30BB2AAXX080903:3:1:125:1464#0
-TTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTACAGATCGGAANACNCACT
-+
-67777788888888888888888877756555443.21100//...-+,-+,+****)&))()((('&"#""###"
- at 30BB2AAXX080903:3:51:237:543#0
-CTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCCGCTCACGC
-+
-677777888888888888888888777765554112221.0-/.,.,-,,+,++)*)))))()(''&$%%"$$#"#
- at 30BB2AAXX080903:3:48:1771:173#0
-TGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGGGGATGCTTGCATGTGTAATCTCTGACGCA
-+
-67777788888888888888888877776505441220000/..-.--,*+++&)*)()))(&'''%"$"""#"##
- at 30BB2AAXX080903:3:38:1762:688#0
-AGTAAGATTACACATGCAAGCATCCCCGATCCAGTGAGTTCACCCTCAAAAGCACCACGACCAAAAGGACACACNN
-+
-6777778888888888888888887777%45544.2221/0//..--(,-,'()*)()')%%(((''"#""#""""
- at 30BB2AAXX080903:3:59:1285:1050#0
-GTAAGATTACACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGTGCCTCCAA
-+
-67777788888888888888888877734/254832222/0/-+/.-,,,,*+)*))*()(((((''"""#"##$#
- at 30BB2AAXX080903:3:48:1340:68#0
-GATTACACATGCAAGCATCCACGTCCCAGCCAGCCCACCCTCTAAATCACCACGATCAAAAGGGACACTCCGCACC
-+
-67777788888888888888*88&-7716)'54$'.2/1'./.+-."+,,*++&)&(((()(#((&'%"&##$###
- at 30BB2AAXX080903:3:44:827:1049#0
-GCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGGGGATGCTTGCATGTGTAAT
-+
-67777788888888888888888877776555443222101//..---,,++++***))()((((('$$%#&#""#
- at 30BB2AAXX080903:3:47:173:945#0
-TTACACATGCAAGCATCCCCGTTCCAGGGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGGACGAGCCC
-+
-677777888888888888888888777%65521432,2100*/...--,-++*+****)))((((''"#$""$#"#
- at 30BB2AAXX080903:3:55:1179:1581#0
-TACACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCACCCAC
-+
-677777888888888888,88888777765-554122210/./.--,--,+++**))*)))()(''%%&$%#"$#"
- at 30BB2AAXX080903:3:1:372:1628#0
-ACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCAGCANCCNCACC
-+
-67777788888888%88-8888807677654544321200./..-,--',+++*)*)*)()((((#''"#""%$$"
- at 30BB2AAXX080903:3:37:246:1497#0
-TGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGGGGATGCTCTGANAN
-+
-677777888888888888888888777765554132201000/..+-,-,,++(+**()())(('''%""$#$"""
- at 30BB2AAXX080903:3:46:366:1610#0
-TGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGAGATCGGCACAGCGG
-+
-67777788888888888888888877776555443022100//..---,-+)++**)*))))((((''$###"$"#
- at 30BB2AAXX080903:3:41:1692:846#0
-TGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCAAGATCGGAGTTGCN
-+
-67777788888888888888888877776555443222100//...-,-,+++***)*))()((('''"""$""""
- at 30BB2AAXX080903:3:38:761:1664#0
-AAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACTCAGCCACT
-+
-67777788888888888888888877776555443322/01/..--+-,,+++****())()(('('%$$$$###"
- at 30BB2AAXX080903:3:53:1219:936#0
-AAGCATCCCCGTTCCAGTGAGTTCACCCTCTAACTCACCACGATCAAAAGGGACAAGCATCAAGCAATCTCGGACG
-+
-67777788888888888888888877776555443222100//..--,,,+,++**)))))((((('%%$&&###"
- at 30BB2AAXX080903:3:36:634:304#0
-CATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGNGCATACAN
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))(((((&"###$#"#"
- at 30BB2AAXX080903:3:36:635:305#0
-CATTGCTGCGTGCTTGCTGCTTGTCCCTTTTGATCGTGGTGATTTAGATGGTGAACTCACTGGAACGNTCGCTGTN
-+
-6477778888888888%88888887*77855544322-100./...-,$,+++**+)*())))'('&""$"####"
- at 30BB2AAXX080903:3:55:43:1020#0
-CATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGGGCGCGCCT
-+
-677777888888888888888888777765554432221/0./...-,,,++++*)**)))(((((&"&#"#"##"
- at 30BB2AAXX080903:3:1:1181:617#0
-GCATTGCTGCGTGCGTGATGCTTGTCCCTTTTGATCGCGGTGATTTAGAGGGTGAACTCACTGGAACGNCTNACTC
-+
-6770478888888%)8888883882,7-652.42#.2'10&/.(%,,-+,-+%+*##)'(''()#&%&"$""#$##
- at 30BB2AAXX080903:3:36:817:1175#0
-ATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCACACATCCGCN
-+
-677777888888888888888888777765554432221001/.-----,+,++**)))))))(((%$&%&##"$"
- at 30BB2AAXX080903:3:35:955:880#0
-TGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACNCTACCTCN
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(('(("&%%##"#"
- at 30BB2AAXX080903:3:36:1000:1381#0
-TGAGCTGCATTGCTGCGTGCTTGACGCTTGTCCCTTTTGATCGAGGTGATTTAGAGCGTGAACTTATGAGCGACAN
-+
-677777-888888888888/8888%777/5554(*.+2.0,//#/-,-+,*+**'*')&)))'&#'%""$""#"#"
- at 30BB2AAXX080903:3:51:741:1898#0
-TGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGCACGGT
-+
-67777788888888888888888877776555443222100//..---,,+++***))()()(((('"%"$""$$"
- at 30BB2AAXX080903:3:42:723:1669#0
-TTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCCCTGTGAGG
-+
-6777778888888888888888887777655542312210/-/...--+,+,++**))&)#)#(#'%""$%#%###
- at 30BB2AAXX080903:3:56:239:1775#0
-TTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACGCGTCGT
-+
-67777788888888888888888877776555423222100./...--+,+,*+**))))'((((('$%$#""#""
- at 30BB2AAXX080903:3:51:671:359#0
-GTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCATCCTCAAT
-+
-67777784888888888888888877776555443222100//..---,,+++***)))))((((''"##$#""#"
- at 30BB2AAXX080903:3:47:183:423#0
-TCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAAGATCGGTAGGTCGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((('($"#$""##"
- at 30BB2AAXX080903:3:55:1023:796#0
-TAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTAGATCGGAAGAGCGTGTCAT
-+
-67777788888888888888888877776555443222100//..---,,,++****)))))((('''$$""###"
- at 30BB2AAXX080903:3:49:602:1841#0
-AGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTAGATCGNGGTGCAC
-+
-67777788888888888488088877736555441222/00./...-+,,++*****)))((((('%"""""##"#
- at 30BB2AAXX080903:3:43:1468:441#0
-AGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGGGGGT
-+
-677777888888888888888888777765054432321////.-,.*,,,,**)*)))&)&(((&'&$%#"""""
- at 30BB2AAXX080903:3:1:101:1973#0
-CACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTANAANCACA
-+
-67777788888888888888888,7.7765554432220///-.-.,-,-*++*)**())&(()(('%"""""#"#
- at 30BB2AAXX080903:3:41:565:1780#0
-TGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGACTTCGCANG
-+
-677777888888888888888888777765554432201001/.,---,,+++***)*)))))(('&$$%$%#""#
- at 30BB2AAXX080903:3:3:1591:1394#0
-GTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGTNTTACNCN
-+
-6777778888888888888888887777655544322200.//...-,-+++*)*)*((%')'((%'""#%#""""
- at 30BB2AAXX080903:3:49:1602:180#0
-GGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGGTGCCGCA
-+
-6777778888888888888688887743655544322-1/0./..-,-,,+++**+)()))'('(&(""#"##"#"
- at 30BB2AAXX080903:3:37:580:1209#0
-GGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGCTTTCTCTN
-+
-67774788888888888888888877776555443222100//..--+,,+++***))*)*()((''%$$"$%"#"
- at 30BB2AAXX080903:3:60:1676:228#0
-ATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTTAGCCTAGACAACACACNN
-+
-67777788888888888888888877776555443222100././---,,+++&**))))'(((((&$%%%%$#""
- at 30BB2AAXX080903:3:56:622:110#0
-TCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTTAGCCTAGCCACAGCCCAAC
-+
-6777778828888888888888887873655154322210,//..---+-++++*()))))(()(''&&#$$%"##
- at 30BB2AAXX080903:3:43:774:1532#0
-GTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTTGCAC
-+
-67777788888888888888888877776555443122120/..--,-,,+++****)(((()(((&'$%#""#"#
- at 30BB2AAXX080903:3:49:1149:1514#0
-GTGGGGGTGTGGCTAGGCTAAGCGGTTTGAGATGCCTTGCTGCGTGCTTGGTGCTTGTAGATTGGGACGTGCGTGC
-+
-6777778(8888888888..88-81777*+5)%4*.$1+1./+.),*+,+%++)**%'&)('#((&&$"##$#"#$
- at 30BB2AAXX080903:3:49:1283:1557#0
-GTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCCGGCTTGATGCTTTTTCCTTTTTTCTTCGGGGC
-+
-6/777788888888838/8$88.86777155"441,212#+0+$%-&#,,%)+)+*&()##''((&#%""#"#""#
- at 30BB2AAXX080903:3:50:591:1879#0
-CGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCGTTTGACCGTGGTC
-+
-671777888888888.8828188877176525443222*////--.-,-,+&****)*%#'('(((%"$#$""""#
- at 30BB2AAXX080903:3:1:1637:1222#0
-ACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTTACCCTAGCCACACNCANCGAC
-+
-671077888888888888888&8&7*77655542300000/+...,--+,+**(*)'(((('#((&%&"%"""""#
- at 30BB2AAXX080903:3:50:1746:1971#0
-CCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTATGACAGGC
-+
-6777778888888888-888888877776555441222100/...---,,++++**(*)))((((('""#$#""##
- at 30BB2AAXX080903:3:52:1572:139#0
-CACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTTAGCCTAGCAACACCTCCACGAAC
-+
-67777788888888888888888877276555443222100//..---,,*++****))(#((('(%"&&&%##$"
- at 30BB2AAXX080903:3:38:707:1344#0
-TCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTAGGTCGGACA
-+
-67777788888888888888888877776555443022000//-.---+,,++***)***))(('''""%%#""$#
- at 30BB2AAXX080903:3:36:94:1875#0
-GTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCTCTGTCTANN
-+
-67777788888888888888888877776555443222100/...---,,+,+***))()&))(('#%#"%$"$""
- at 30BB2AAXX080903:3:42:1586:1352#0
-TGTTTCCCGTGGGGGTGCGGCTAGGCTAAGCGTTTTGAGCTGCGTTGCTGCGTGCTTGCTGCTTGTCCCGTCTGCT
-+
-67777788888888888/888.887377.5.53432.'1&./,)-++&++&+**&(*)%)'#((('#"&%%#%"$%
- at 30BB2AAXX080903:3:52:1010:1566#0
-AAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTTAGCCTAGCCACACCCCCAGATCGGTGGTGCGC
-+
-67777788888888888888888877776/55443222100//..--,,,++)+****)))((((('&"##"%"##
- at 30BB2AAXX080903:3:43:144:721#0
-AGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGAGATCGGGCACG
-+
-67777788888888888888888877776556443222100./.,-,-,,+,+'**(())(('((''&$""#""""
- at 30BB2AAXX080903:3:59:1207:1350#0
-AGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGGATTGAGATTGGANAGGCAA
-+
-67777788888888888888888877776555443222100//.----,,+*+)**)(())((('#''&""""#"#
- at 30BB2AAXX080903:3:42:159:363#0
-AAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGAGATTGGTAGA
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))()('(&&""%%"$"#
- at 30BB2AAXX080903:3:51:858:1755#0
-TAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGCAACTCT
-+
-67777788888888888888888877+765553432211/0/,..--+,+,+++()()*&%)(('''$"#""#$""
- at 30BB2AAXX080903:3:55:536:1198#0
-TAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGGTGGACG
-+
-67777788888888888888888877776555443222100//.-.-,,-,++***))))())((('"&#"""##"
- at 30BB2AAXX080903:3:51:513:1866#0
-TGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCAGCTAGCG
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)))(()(('&$"$""##"
- at 30BB2AAXX080903:3:1:953:138#0
-ATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGGGGGGCTAGGCTAAGGGTTTTGAGGTGGGTCNACNTACC
-+
-6777778888888888.808838877720)5+44321'0$0/*.--,+))+)%*))))&%##&(##'""#$""""#
- at 30BB2AAXX080903:3:33:1139:191#0
-TATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCANTGTCACNN
-+
-67777788888888888888888876776555243222.00//...,-,,+++**)**))()(((''"$""$#"""
- at 30BB2AAXX080903:3:40:640:1075#0
-TATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTTGTGTNG
-+
-67777788888888888888888877776555443222100//...--+,,,+*****))()(((''"&$%%$$"#
- at 30BB2AAXX080903:3:54:406:1344#0
-TTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGGGGGGCTAGGCTAAGCGGTTTGAGGTGCATAGATGTG
-+
-677777888888888888888888774765554-32221*0$/.-(,-,++$+))+()*)&#)%'(&$$"%"#""#
- at 30BB2AAXX080903:3:58:781:105#0
-TTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGTCNNA
-+
-67777788888888888888888877776555443222100//.--.-,,+++*)*(*)))'(((('$&&$$$"""
- at 30BB2AAXX080903:3:1:67:1567#0
-CAGCAATGCAGCTCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAGCCTTTAGNCANAACA
-+
-6777778888888888888888887777555544322210///...,*,+++++%*)))())(((('$""#"###"
- at 30BB2AAXX080903:3:34:1236:828#0
-TGCAGCTCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGCGATTAGACTTTAGATCGGNACATAGNN
-+
-6777778888888888388888887/77655544322210///...--',+***+()))()((((('""%"#""""
- at 30BB2AAXX080903:3:38:716:1109#0
-GTTAAACTTTCGTTTATTGCTAAAGGCTAAACACCGCTGTTTCCCGTGGGGGTGTGGCAACGCTAAGACTGTACAC
-+
-677777888888888888888888777465.524%2.210....--(-,,,+'*))))'(''%''&%""&&$####
- at 30BB2AAXX080903:3:8:875:1618#0
-GTTAAACTTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGNAGCTCANN
-+
-67777788888888888888888877776555443222100//.--,-,-+,*+***))'))(((''"""$"#$""
- at 30BB2AAXX080903:3:48:1479:858#0
-AGTTAAACTTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGGTCNTN
-+
-67777788888888888888888877776555443222100//..---,,+++**)))***)(((''%$##$#"""
- at 30BB2AAXX080903:3:1:1655:483#0
-TTAGTTAAACTTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTANGANACTC
-+
-677777888888888888888888777765554432221/0//.---,,,+++*+)))))')(((&'%""""$$#"
- at 30BB2AAXX080903:3:1:1230:1667#0
-AAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAGCCTTTAGCAATAAACGACAGTTNACNCAAC
-+
-677777888888888888888888777765.54432121///..-.-,,,+*+*)*)')))((%('#'"$%""###
- at 30BB2AAXX080903:3:1:1054:903#0
-TTAGTATAGCTTAGTTAAACTTTCGTTAATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTNCANACTC
-+
-677777888888888888868888787765553430220/0//.----,+,++)***()())(((%'%"$#""##"
- at 30BB2AAXX080903:3:35:1065:1365#0
-GGTTAGTATAGCTTAGTTAAAATTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGNTCTCCACN
-+
-671777888888888888888%8807776355443202100//..-(,,,+++***((*()')(((&""#"##"#"
- at 30BB2AAXX080903:3:8:1265:1332#0
-GGTTAGTATAGCTTAGTTAAACTTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTAGATCGGAAGANGCATCANN
-+
-67777788888888888888888877776555443222100///.---,,+++***)*))))()(('""###%#""
- at 30BB2AAXX080903:3:39:1017:1515#0
-CCCCACGGGAAACAGCAGTGATTAGCCTTTAGCAATAAACGAAAGTTTAACTAAGCTATACTAAAGATCGGACACA
-+
-67777788888888888888888877776555443221100//..---,,-+++**))*))))((('&&#%$""#"
- at 30BB2AAXX080903:3:49:516:1299#0
-GAAACAGCAGTGATTAGCCTTTAGCAATAAACGAAAGTTTAACTAAGCTATACTAACCCCAGGAGATGGGCGTGAC
-+
-67777788888888888888888877776555443222100//..--,,,++****))()))((((&"""""""$#
- at 30BB2AAXX080903:3:44:354:1549#0
-GAAATTGACCAACCCTGGGGTTAGTATAGCTTAGTTAAACTTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTTC
-+
-67777788888888888888888877776555443222100//..---,,+++**)))*)))((('''$&%%$$#$
- at 30BB2AAXX080903:3:54:794:50#0
-TGGCACGAAATTGACCAACCCTGGGGTTAGTATAGCTTAGTTAAACTTTCGTTTATTGCTAAAGGCTACTCATTGT
-+
-67777788888888888888888877776555443222100//-.---,,+,+***)))*()()''(%""&%###"
- at 30BB2AAXX080903:3:37:1308:232#0
-GCTGGCACGAAATTGACCAACCCTGGGGTTAGTATAGCTTAGTTAAACTTTCGTTTATTGCTAAAGGCTCACACAN
-+
-67777788888888888888888*7777)-5504222220//,.,.-,,-+++)))*)()((((''%$$#&$#$""
- at 30BB2AAXX080903:3:8:654:682#0
-GTGACCGCGGTGGCTGGCACGAAATTGACCAACCCTGGGGTGAGTGTAGCTTAGTTAAACTAGATCGNCGCCAANN
-+
-67777788888888888288888877774.451(0222101./.-%---++++*'*))*()((((%'"$"#$##""
- at 30BB2AAXX080903:3:2:664:1407#0
-TCGTGTGACCGCGGTGGCTGGCACGAAATTGACCAACCCTGGGGTTAGTATAGCTTAGTTAAACTTTCNCTGTCTC
-+
-67777788888888.88.8883-547336+522-/,,-.0.-/,,,*,+(+)*(')(((((#('(&'$"##""""#
- at 30BB2AAXX080903:3:34:1682:248#0
-TCGTGTGACCGCGGTGGCTGGCACGAAATTGACCAACCCTGGGGTTAGTATAGCTTAGTTAAACTTTNACTACANN
-+
-67777788888888888888888877776555443222100//.%---+,,+++*)*))))((((('""#"#$%""
- at 30BB2AAXX080903:3:60:945:766#0
-AAAGTTTAACTAAGCTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACCGCGGTCACACGATCCACACNN
-+
-67777788888888888888888877776555443222100//..---,,,,****)))())((((''#%$%"#""
- at 30BB2AAXX080903:3:55:134:1049#0
-CTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACCGCGGTCACACGATTAACCCAAGAGATCGTGGCGCG
-+
-67777788888888888888888877776555443222100//..+.,+,,+****))()'(((((#"&#%#$#""
- at 30BB2AAXX080903:3:51:370:1606#0
-TAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACCGCGGTCACACGATTAACCCAAGTCAATAGAAGCCGACAGTC
-+
-67777788888888888888888877776555443222100//..---,-++*+**)**)(((((('%"""#"""#
- at 30BB2AAXX080903:3:35:318:584#0
-TTCGTGCCAGCCACCGCGGTCACACGATTAACCCAAGTCAATAGAAGCCGGCGTAAAGAGTGTTTTANGTCTCTTN
-+
-67777788888888888888888877776555443222110//...--,,+++**)*)))'(()(('"""##$"""
- at 30BB2AAXX080903:3:44:475:1277#0
-AGTTTTAGCTTTATTGGGGAGGGGGTGATCTAAAACACTCTTTACGCCGGCTTCTATTGACTTGGGTTAATCGTGT
-+
-67777788888888888888888877776555443222100//..---,,,,+**)))*)()((((%'""#&%#$"
- at 30BB2AAXX080903:3:39:820:1606#0
-CGGCGTAAAGAGTGTTTTAGATCACCCCCTCCCCAATAAAGCTAAAACCCACCTGAGTTGTAAAAAACTCCATCTC
-+
-67777788888888888888888877776555242222100././.-+,+++****)*)))()(((''&%&#""""
- at 30BB2AAXX080903:3:37:297:1052#0
-AGTCTATTTTGTGTCAACTGGAGTTTTTTACAACTCAGGTGAGTTTTAGCTTTATTGGGGAGGGGGTGATCTACGN
-+
-67777788888888888888888877776555443222120//..--,,,+++***))))(()((('""#%$##""
- at 30BB2AAXX080903:3:59:1002:797#0
-CACCCCCTCCCCAATAAAGCTAAAACTCACCTGAGTTGTAAACAACGCCAGTTGACACACAATAGACTACGCTCTA
-+
-677271888888888888888888-11765714/300210,+&...(,,,,)****))))))')(('"$#"#"#"#
- at 30BB2AAXX080903:3:45:626:1898#0
-CAGATATGTTAAAGCCACTTTCGTAGTCTATTTTGTGTCAACTGGAGTTTTTTACAGATCGGAAGAGGGAGTGTTC
-+
-677777888888888888888888777765554432220001/...-,-,+++*)+)**()((((('$"#"""""#
- at 30BB2AAXX080903:3:40:372:2010#0
-GTGTTCAGATATGTTAAAGCCACTTTCGTAGTCTATTTTGTGTCAACGGGAGTTTTTTACAATTCAGCTGAGCTCT
-+
-67777788888888888888,4884777555.%41222100//..-*&,,,+)**))))(((%(&('%%"%"#"#"
- at 30BB2AAXX080903:3:35:928:569#0
-TTTGGGTCTTAGCTATTGTGTGTTCAGATATGTTAAAGCCACTTTCGTAGTCTATTTTGTGTCAACTNGAGCCGTN
-+
-67777788888888888888888877776555443222100//..----,,++***)))*)))(((&""#"%#"#"
- at 30BB2AAXX080903:3:58:1128:1593#0
-AGTTGACACAAAATAGACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAACTGCCTAAC
-+
-67777788888888888888888877476$55443$0210///,..-,,,++*+)&())(('''('('$&##"""#
- at 30BB2AAXX080903:3:2:257:83#0
-GTTGACACAAAATAGACTACGAAAGTGGCTTTAACATATCTGAAAAAACAATAGATAAGAAAAAAAATNCAANNAC
-+
-6777738888888883288)86817073+346-1"./-1#/*.)%+",&,+&*&%(((#'###&(&#$"$""""##
- at 30BB2AAXX080903:3:36:716:897#0
-GTTGACACAAAATAGACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAAACTCACACCN
-+
-6777778888888888888888887777%5154422220.0.'..---,,-,+*)))*((&'('''#$$$#$###"
- at 30BB2AAXX080903:3:40:810:1481#0
-CTAAGCATAGTGGGGTATCTAATCCCAGTTTGGGTCTTAGCTATTGTGTGTTCAGATATGTTAAAGCCACTTAGAC
-+
-67777788888888888828888877/7055544-02200,....---,,,+*+*()*))((((((#&&&$%&$#$
- at 30BB2AAXX080903:3:57:821:784#0
-TGAGGTTTAGGGCTAAGCATAGTGGGGTATCTAATCCCAGTTTGGGTCTTAGCTATTGTGTGTTCAGATGCGCACA
-+
-67777788888888888888888877776555443222200//..---,,+++***)))))(((((''&"#"####
- at 30BB2AAXX080903:3:1:1056:727#0
-CTGTTGAGGTTTAGGGCTAAGCATAGTGGGGTATCTAATCCCAGTTTGGGTCTTAGCTATTGAGATCTNCANACGT
-+
-67777788888888888888888877776553443222100//.----,,,,+++*)))))((((('&"##""#""
- at 30BB2AAXX080903:3:39:925:350#0
-AGCTAAGACCCAAACTGGGATTAGATACCCCACTATGCTTAGCCCTAAACCTCAACAGATCGGAAGATCGCTCATC
-+
-67777788888888888888888877776555483222110//-/.--,-,,++**)**())(((('"%%"#""""
- at 30BB2AAXX080903:3:38:1233:1273#0
-CCCAAACTGGGATTAGATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGATCAGACTC
-+
-67777788888888888888888877776555443222100//..-,-,,,++***)*))))(((('$&%$%#$$%
- at 30BB2AAXX080903:3:47:807:461#0
-ACTGGGATTAGATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAAGATCGC
-+
-67777788888888888888888877776555443221100//...--,,+++***)*)*))(((('%"#$$####
- at 30BB2AAXX080903:3:54:1236:264#0
-TAGTGTTCTGGCGAGCAGTTTTGTTGATTTAACTGTTGAGGTTTAGGGCTAAGCAAGATCGGAAGAGCGCGCTCTG
-+
-67777788888888888888888877776555343222100//..---,,++++**))))))(('((%&#%&"#"#
- at 30BB2AAXX080903:3:49:402:2042#0
-TATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAGAACACTACGAGCCACAGCTTAAAAAA
-+
-67777788888888888888888877776555443222120//.----,,,++***))))))(((''&"$##"""#
- at 30BB2AAXX080903:3:51:944:61#0
-ATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAGAACACTACGAGCCACAGCTGACGACTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''%%$%""""#
- at 30BB2AAXX080903:3:2:149:210#0
-GCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAGAACACTACGAGCCACAGCTTAAAACANCAANNCC
-+
-6777778888888888848888887727652+142212100/--.--,-++++()*)*)('(((((&"""%$""#"
- at 30BB2AAXX080903:3:46:1047:873#0
-AGTTAAATCAACAAAACTGCTCGCCAGAACACTACGAGCCACAGCTTAAAACTCAAAGGACCTGGCGGTCCACACA
-+
-67777788888888888888888877776555443222100/..----,,+*++**))))(((((((&""$"###"
- at 30BB2AAXX080903:3:4:1731:1955#0
-AGGTGGTGAGGTTGATCGGGGTTTATCGATTACAGAACAGGCTCCTCTAGAGGGATATGAATCACCGCNAGTCNCN
-+
-67727788888888888888888877776/5544322001/0..,&-+,,*+++*))())((((((&"""$#$"#"
- at 30BB2AAXX080903:3:51:206:1852#0
-GAGGTGGTGAGGTTGATCGGGGTTTATCGATTACAGAACAGGCTCCTCTAGAGGGATATGAAGCACCAGATCTCGC
-+
-67777788888888888888888877776555443222020/..-.-,,,+++**))))*)()'('%""""$#"##
- at 30BB2AAXX080903:3:56:1580:124#0
-CTGGCGGTGCTTCATATCCCTCTAGAGGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACACACAAAACA
-+
-67777788888888888888888877776555443222100//..---,,+)+***)))))((('''$$%$$"##$
- at 30BB2AAXX080903:3:1:1765:118#0
-GCTGAGCAAGAGGTGGTGAGGTTGATCGGGGTTTATCGATTACAGAACAGGCTCATCTAGAGGGAAGCNCANTCAC
-+
-6777778888888+8808888,8877/.655.3432$2000/).---+,++$)'#'&'(''((('#'$"$"""###
- at 30BB2AAXX080903:3:59:53:1534#0
-TCTAGAGGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATATACCCGTNNC
-+
-6777778888888888888888887777645054322120/...-.,,-,,+++*')))('')'(('&%##""""#
- at 30BB2AAXX080903:3:43:1086:1132#0
-GAGGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATATACCGCCCTCTTCG
-+
-6777778888888888888888887777655544322.100/....--,+++++****)*)))(((&&$"%"%$$#
- at 30BB2AAXX080903:3:37:1469:797#0
-GCTGAAGATGGCGGTATATAGGCTGAGCAAGAGGTGGTGAGGGTGATCAGATCGGAAGAGCGGGTCACGCGCTTAN
-+
-67272288883888+88828888173772.4+42#22#0&/.#.-+"')+*%%()'()((#((####$"$##"##"
- at 30BB2AAXX080903:3:55:892:1594#0
-GTTTGCTGAAGATGGCGGTATATAGGCTGAGCAAGAGGGGGGGGGGGTGATCGGGGGTTATTAGATCGGTGTGACA
-+
-67777788888888888888888877776555843222)00./*.-(-,&+'+***)*)')'((('#'#"%$$%##
- at 30BB2AAXX080903:3:60:1460:650#0
-TGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATATACCGCCATCTTACAACAACNN
-+
-67777788888888888888888877776555443222100//..----,++++**)*))((((((&$$%%&$%""
- at 30BB2AAXX080903:3:48:1373:72#0
-TCAGGGTTTGCTGAAGATGGCGGTATATAGGCTGAGCAAGAGGTGGGGAGGGTGATCGGGGGTTATCGGTCGTAGC
-+
-67777788888888888888888877776555443220100//(.-+-+-+*+**''))*)(&((&%%""#"""#"
- at 30BB2AAXX080903:3:54:1169:1364#0
-ATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGANGCGCAC
-+
-67777788888888888888888877776555443212100//.,-.,,,,+++****)))((((('$%""""###
- at 30BB2AAXX080903:3:51:1413:994#0
-TGTAGCCTTCATCAGGGTTTGCTGAAGATGGCGGTATATAGGCTGAGGAAGAGGGGGGGGGGGGGGTGCGCGCGCT
-+
-6777778888888888888888887777655544+222100/...,-*+,,++***)(*()((%(%'$"$$$###"
- at 30BB2AAXX080903:3:42:1648:565#0
-TTGTAGCCTTCATCAGGGTTTGCTGAAGATGGCGGGAAACAGGCTCGGCCAGAGGGGGGGGGGGTGAGGTGGTGAC
-+
-67777788,88088888888888877476575443(1,+#-+/(,$+,'%++)**#**#)(')'#'%%$""#""#"
- at 30BB2AAXX080903:3:40:872:1157#0
-TTACTTTGTAGCCTTCATCAGGGTGTGCTGAAGATGGCGGTATATAGGCTGAGCAAGAGGGGGGGGGGGTGATGTG
-+
-677777888888888888888880-777655544322110&/..,.--**+**)))()))'))((%'%&$&"""""
- at 30BB2AAXX080903:3:8:961:542#0
-CGATCAACCTCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTANCACCACNN
-+
-67777788888888888888888877776555443202100//./---,,,,+***)**))()((('"%$#$"$""
- at 30BB2AAXX080903:3:33:418:778#0
-CTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGATGGCGGTATATAGGCTGAGGAAGAGGGGGGGGNGCGACANN
-+
-67777788888888888888888877776555443222100....---,(++'*(&))()*'(((&'"#$"##"""
- at 30BB2AAXX080903:3:56:1622:711#0
-GATCAACCTCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACACAAAAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$"%&#&$%$
- at 30BB2AAXX080903:3:58:613:782#0
-AACCTCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAATACCAC
-+
-67777788888888888888888877776551440222000//..--,,,,+++***))(())((('$&"#"%###
- at 30BB2AAXX080903:3:36:875:755#0
-TCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCTGATCACN
-+
-677777888888888888888888777765554432221000/..---,,++++**))))))(((('$$"""$##"
- at 30BB2AAXX080903:3:46:1110:830#0
-TCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCAGGCCTCA
-+
-67777788888888888888888877776555443222100//.--,--,+++****)))()('(('""%#"#"##
- at 30BB2AAXX080903:3:59:1560:376#0
-TGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGATGGCGGTATATAGGCTGAGCACCAAANNA
-+
-677747888888888888888888777765554432-2100//..---,,+++(*)**)))'(('('$$&%%$""$
- at 30BB2AAXX080903:3:35:547:101#0
-CTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGCAAGCGCAAGANACACACNN
-+
-67077788888888888888888877775-5504321-/00/+...&-)++'+***#)))'((&((#"$$&%%"""
- at 30BB2AAXX080903:3:57:1341:765#0
-TACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGAGATCGGAAGAGCGGGTCAGTCACCA
-+
-6777778888288888888838887'7765.543(,3210+//.--,-,,++++%**)))((')(%'%$%"$###"
- at 30BB2AAXX080903:3:36:1465:756#0
-TTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGATGGCGGTATATAGGCTTNGCACNN
-+
-67777788888888888888888877776555443222100//..----,+++***)*'))()((''%$""$#"""
- at 30BB2AAXX080903:3:59:1045:671#0
-TTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGCAGCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))))(((''%&%$$"#$
- at 30BB2AAXX080903:3:46:846:878#0
-GCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCAGCGTCCCGA
-+
-6777778888888888885888887677656544322010///..---,,++****)))()%(('('""""$"#""
- at 30BB2AAXX080903:3:59:991:1214#0
-TCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGCAAACGCAA
-+
-677777888888888888888888777765554432221001/..--,,,+++)*)))))))(((('"#%##"###
- at 30BB2AAXX080903:3:42:835:1439#0
-TAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGATCGGAAGACTCGNCNA
-+
-67777788888888888888888877776555443222000./.-.--,,+++***)*))*())((&'$"$""$"#
- at 30BB2AAXX080903:3:38:1473:1954#0
-GCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTACACATGTCGC
-+
-67777788888888888888888877744550443222/0/1.,..*,,,,,+***#)(((''(''#%"""""#"%
- at 30BB2AAXX080903:3:49:1290:1989#0
-CCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACACTATA
-+
-6777778888888888888888887776655544322.10.//...--,,+*+****&&()()'(('$%$"""#""
- at 30BB2AAXX080903:3:33:1692:875#0
-CTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGANTAGCGTNN
-+
-677777888888888888888888077765554432121000/....,,-,+***+(*))()('(('""##"#"""
- at 30BB2AAXX080903:3:44:1268:1429#0
-TACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGACACCA
-+
-67777788888888888888888877776555443222100//-.---,,+,++**)))))()(''''$#"%####
- at 30BB2AAXX080903:3:45:421:1459#0
-TACACCTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGATGGC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((('''$"$&"#%#"
- at 30BB2AAXX080903:3:3:796:1149#0
-ATGGGCTACACCTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGCNTCGTNCG
-+
-6477778888888888888888+8777165504432120/,//-%,-*,,++)***)())()(((&'""$"%#"#"
- at 30BB2AAXX080903:3:56:485:755#0
-ATGGGCTACACCTTGACCTAACGTATTTACGTGGGTACTGGCGCTTACTTTGTAGCCTGCATCAGGGAGNTGTACT
-+
-67777788888888888888888'$77765554432221/1//...--,,++***+*)))()(((('&$""##"#"
- at 30BB2AAXX080903:3:59:847:1238#0
-ATGGGCTACACCTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTAGACACAG
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(('''&$&##"##"
- at 30BB2AAXX080903:3:60:1576:1973#0
-ACCTCATGGGCTACACCTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCGTTCCACAACNCANN
-+
-677777888888808888888)887777655544122210)//..-+-'+++(***))))''((#(&$$%%"$%""
- at 30BB2AAXX080903:3:53:928:1277#0
-ACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATCGCTCGCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))()(('&&"&&%%$#
- at 30BB2AAXX080903:3:50:1548:125#0
-CCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGACGCTAGTC
-+
-677777888883888888888888777765554432221/0//...--,,-++***()))))(((('"$"&$"""#
- at 30BB2AAXX080903:3:51:765:1020#0
-CCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGCGGCAGTAC
-+
-67777788888888888888888877776555443221100//...--,,++++**&))))))(('("###"#"#"
- at 30BB2AAXX080903:3:49:69:1967#0
-CTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGAATACTCATC
-+
-67777788888888888888888877776545443222100//.----,,+,+**&)**)'''((''""##"$""#
- at 30BB2AAXX080903:3:53:1046:1880#0
-ATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGATCGGAAGAGTGGCACATC
-+
-67777788888888888888888877776555443222110//..--,,,+++***)*)()()(('("#$#""#""
- at 30BB2AAXX080903:3:1:984:237#0
-TGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGAGGTGCNCANATAC
-+
-67777788888888888888888877774555343222000//./,,-+,,)+****(())()((''%"$""#"##
- at 30BB2AAXX080903:3:42:1278:1283#0
-GAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCAAGCAATG
-+
-67777788888888888888888877776555443222100//..,--,,++++*))))))((('('&""&"%""#
- at 30BB2AAXX080903:3:53:1365:115#0
-AAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCCAGAAATAG
-+
-67777788888888888888888877776555443222100//-..--,,+++*****))))(&((#$$"$$&###
- at 30BB2AAXX080903:3:34:414:1153#0
-GTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGACCTAACGTCTTTACGTGGGTACCTGCGCTNTTCCACNN
-+
-6777778888888888888888887777652511-220100+/-.,,,-,+*+****))#'(('(''"%""$"#""
- at 30BB2AAXX080903:3:47:607:801#0
-TGTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGT
-+
-67777788888888888888888877776555443222100//..---,,+++****))))))((''"&&&$$$$#
- at 30BB2AAXX080903:3:38:1084:1081#0
-AAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGGAGCCCATGAGGTGGGAAGAAATGGGCTACATTTCATC
-+
-677777888888888888888888777765.0-432%2&00-/.,-,--,)++'(**)*)()((#&'&&&%%%%$$
- at 30BB2AAXX080903:3:59:446:1094#0
-GGTAGAAAATGTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGACCTAACGTCTTTAGATCGGAAGCACCTC
-+
-67777788888888888888888877776555443222100//..----,++****))*)))(((('&$%#"##"%
- at 30BB2AAXX080903:3:4:372:321#0
-CTGGGGTAGAAAATGTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGACCTAACGTCTTTACGANGTGTNTN
-+
-+777778888888888880818885745665.51320210/0/.--+--++,*&*))))('((((&'&""%##"#"
- at 30BB2AAXX080903:3:44:978:1048#0
-ACGTAAAGACGTTAGGTCAAGGTGGAGCCCATGAGGTGGCAAGAAATGGGCTACATTTTCTACCCCAGACAACTCG
-+
-67717788888888888.8888*8#77565454332/211///.-.",--*)+))*)))(((('(''%""%"#"""
- at 30BB2AAXX080903:3:50:496:1225#0
-ATCGTAGTTTTCTGGGGTAGAAAATGTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGACCTAACGCCTCTC
-+
-67777788,888888888888888779766/54422%.*0////..,,,,,+*())*()((((''%'"$%#%"#"#
- at 30BB2AAXX080903:3:52:566:1534#0
-AGGGCTATCGTAGTTTTCTGGGGTAGAAAATGTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGNNCTAACG
-+
-67777788888888888888888877776555443222100//..--,,,+++****)**)((((('$"""$#%$$
- at 30BB2AAXX080903:3:4:457:1215#0
-CATAAGGGCTATCGTAGTTTTCTGGGGTAGAAAATGTAGCCCATTTCTTGCCACCTCATGGGCTACAGNTCGCNAN
-+
-(74777888888888888*88738777365203422,01./../-,+'+,+)*'''((%(((&'('&"""#"#"#"
- at 30BB2AAXX080903:3:1:744:243#0
-CTTCGACCCTTAAGTTTCATAAGGGCTATCGTAGTTTTCTGGGGTAGAAAATGTAGCCCATTTCTTGCNACNCTAT
-+
-67777788088888888888888877776'53441222/00//.,.-,-,+,+***))())))'((''"#""%"##
- at 30BB2AAXX080903:3:45:1424:717#0
-TGAGGTGGCAAGAAATGGGCTACATTTTCTACCCCAGAAAACTACGATAGCCCTTATGAAACTAGATCGGAAGCGC
-+
-67777788888888888888888877776555443222100//..---,,+*+***))))))))(''&&#""$##"
- at 30BB2AAXX080903:3:49:1632:1032#0
-TGAGGTGGCAAGAAATGGGCTACATTTTCTACCCCAGAAAACTACGATAGCACTTATGAAACTTAAGAGAGGAACA
-+
-67777-88888888888882888877776555443222100./..--,,,+&****))))))(((('$""""""##
- at 30BB2AAXX080903:3:45:1285:807#0
-CCAGAAAACTACGATAGCCCTTATGAAACTTAAGGGCCGAAGGAGGATTTAGCAGTAAACTGAGAGTAGGGGCACC
-+
-67777788888888888882868877716.5+2432#/10&0/#.,,-++*,++*&)*('((&('(%$"""##"##
- at 30BB2AAXX080903:3:33:1664:2001#0
-AACTACGATAGCCCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGNACCACANN
-+
-6777778888888888888888887877651143/22'10.//.--&,,+++*'*)()')#'('(#'""##"#$""
- at 30BB2AAXX080903:3:49:342:276#0
-CCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGTCCACTGA
-+
-67777788888888888888888877776555443222100//..---,,++++****)))))(((('"#%"""""
- at 30BB2AAXX080903:3:50:686:146#0
-TGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCAGTAGCGA
-+
-67777788888888888888/88877776555443222100//-.-.-,,++++**))))))(((''%"""#""""
- at 30BB2AAXX080903:3:34:634:1566#0
-TGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTACTGCTAAATCCACCTTCGNCACACANN
-+
-6777078888888888888888887777655541312100//...,,-,,,+++*)*)'))((((''"$$#$$#""
- at 30BB2AAXX080903:3:50:1234:1643#0
-TGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTACTGCTAAATCCACCTTCGACTCGAC
-+
-67777788888888888888888877776555443222100//..--,,,+++*****))))(((('&"#$"""""
- at 30BB2AAXX080903:3:58:1493:2014#0
-GTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTAATGCTAAATCAACCTCACACCACN
-+
-6770778888888888888888887/77655544*2000.1-/..-.-+-++%**)**)(((%((%%&$#%&$%$"
- at 30BB2AAXX080903:3:45:1080:1101#0
-AGGGTCGAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACCCC
-+
-67777788888.888888888888777765554432221.0//..---,,++++)*)))()(((((''#"$"$"#$
- at 30BB2AAXX080903:3:46:1298:1235#0
-AGGGTCGAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCTCACACGTG
-+
-67777788888888888888888877776555442222100./.----,-+*++**()())(((((&"$"$"#"#"
- at 30BB2AAXX080903:3:54:290:1649#0
-GCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTACTGCTAAATCCACCGTCGCCC
-+
-67777788888888888888888877776555443222100//.-----,+,++*)*)**)((((('%%#&&%##%
- at 30BB2AAXX080903:3:46:1499:1748#0
-GTCGAAGGGGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACATCCCGCC
-+
-6/777788-88888888888888877776555443212100//-.---,,+++)****)))()((''"##%#"$##
- at 30BB2AAXX080903:3:3:345:1498#0
-CGGGCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGATCGGAAGAGCGGTNTCGTNCC
-+
-677777888888888888583)85414325/5313201*/.*.,-,+,+,+*)))%(((&#'%'&''%""""""##
- at 30BB2AAXX080903:3:54:1504:101#0
-GAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGAGATCGGCACAACGCA
-+
-67777288888888888888888877776555423322100//./---,,+,***)**)*()(''('$$%%"#"$#
- at 30BB2AAXX080903:3:46:324:1756#0
-TGACGGGCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTACTGCTAAATCTCCCT
-+
-677777888888888888888888/77760554/3222000./--,--,-+,*+*))())(()(((&%""#"$###
- at 30BB2AAXX080903:3:35:1436:455#0
-GGTGACGGGCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTACTGCNAACACCAN
-+
-677777888888888888888888777765654433210000...--,+,,++****))(()('(''"""#"$#""
- at 30BB2AAXX080903:3:1:1412:876#0
-GAGGAGGGTGACGGGCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTNTGNCCAC
-+
-677777888888888888088888771765551431./1/0-.,,.,,,++)+'()(((('(&'(&%&""""####
- at 30BB2AAXX080903:3:34:548:1928#0
-CTTGAGGAGGGTGACGGGCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCANCCACATNN
-+
-67777788888888888888888877776543442.0110/-..,-,+,*+**+)*)*))((('('%"$#"$##""
- at 30BB2AAXX080903:3:48:466:1620#0
-AGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCCGCACATA
-+
-67777788848888888808888877774/(1480/./20.+/-.--++,+++')*%#))(('(&''$&"#$$##"
- at 30BB2AAXX080903:3:55:177:980#0
-GTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCGCAGATGAG
-+
-677777888888888888888888777765.54432221.0/-.,-,,,,,,+**))))')(('(%'"$#%""$#"
- at 30BB2AAXX080903:3:50:396:1776#0
-TGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCCTCAAGTCTACTTCA
-+
-67777788888888888888888877776555443212001//..-.-,,+++***))))))))(('"""$$"###
- at 30BB2AAXX080903:3:53:837:1500#0
-AGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCCTCAAAGATCGGAAGCGCATCC
-+
-6777778888888888888888887777655444322211//0..----,-,+***)*()))((((%"$$$##"$"
- at 30BB2AAXX080903:3:58:222:99#0
-AGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCCTCCAGAGATCGGAAGANCTCNNC
-+
-67777788888888888888888877776555443222100//.,-,-,,+++**&)*(*')()(&'$&"""#""#
- at 30BB2AAXX080903:3:46:691:1001#0
-CTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCCTCAAGTATAGATCGGAAGCACGTACAN
-+
-6777778888888888888888887773655544322020./...,--,-,+****))*))((((((%"""""#""
- at 30BB2AAXX080903:3:57:1223:1306#0
-TAGGGGTTTTAGTTAAATGTCCTTTGAAGTATACTTGAGGAGGGTGACGGGCGGTGTGTACGCGCTTCAGTGNACA
-+
-67777788888888888888388877776555443222101//.+---,,+*+****)))())(#(''$%$$""##
- at 30BB2AAXX080903:3:46:707:40#0
-AATGCGTAGGGGTTTTAGTTAAATGTCCTTTGAAGTATACTTGAGGAGGGTGACGGGCGGTAGATCGGTACAGCGG
-+
-67777788888888888888888877776555343222100//..---,,++++**))))'((((''&""#""##"
- at 30BB2AAXX080903:3:38:429:109#0
-ATACTTCAAAGGACATTTAACTAAAACCCCTACGCATTTATATAGAGGAGACAAGTCGTAGATCGGACGATGATNN
-+
-67777788888888888888888877776555443222+00/...---,,,+++***))))))('('&'&"$"#""
- at 30BB2AAXX080903:3:51:1222:1936#0
-ACTTTCCAGTACACTTACTATGTTACGACTTGTCTCCTCTATATAAATGCGTAGGGGAGATCGGAAGAGGCGTACA
-+
-67777788888888888888888877776555443112000//.----,,++++**)*))('((#((&"$##""""
- at 30BB2AAXX080903:3:57:680:480#0
-GGACATTTAACTAAAACCCATACGCATTTATATAGAGGAGACAAGTCGTAACATCGTAACAGTACTGGTACTCAGC
-+
-6777778888888888-88$18187777*555443'/..00-/-.'--',,&+*'()')')('((%%$"%""##"$
- at 30BB2AAXX080903:3:47:488:36#0
-CCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATAAATGCGTAGGGGTTCTCACGCGT
-+
-67777788888888888888888877776555443122100//./..-+,++)***)*))(((('''$&%"%"#""
- at 30BB2AAXX080903:3:50:1416:585#0
-ACTAAAACCCCTACGCATTTATATAGAGGAGACAAGTCGTAACATGGTAAGTGTACTGGAAAGTGAGATCGGGCAC
-+
-677777888888888888888888777765554432221/0//..--,,,+*++**))))))(('('$"#"#""##
- at 30BB2AAXX080903:3:58:1403:824#0
-AAAACCCCTACGCATTTATATAGAGGAGACAAGTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGAAACACA
-+
-67777788888888888888888877776555443222110//..---,,,++****)))'()((('$&&""####
- at 30BB2AAXX080903:3:34:866:397#0
-GGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATAAATGCGTNTGCTCTNN
-+
-67777788888888888888888877776555443222100//...----+,+**)*))((()((('"%%###"""
- at 30BB2AAXX080903:3:46:1210:1439#0
-CTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCAGATCGGAAGAGTCGCCA
-+
-67777788888888888888888877776555443222100//./---,,+,+***)**)))((''(""""$###"
- at 30BB2AAXX080903:3:58:122:359#0
-CACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATAAATGCTTNNC
-+
-67777788888888888888888877776555443222100//..---,,,+++**)*)))()((('%'&#""""$
- at 30BB2AAXX080903:3:46:875:1956#0
-GCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATAGATGCG
-+
-67777788888888888888888877776542443212000/-(..----*++*****()'()'(''"%%""#$#$
- at 30BB2AAXX080903:3:54:644:898#0
-GCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATCTATAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()((('&%"%%$$#"
- at 30BB2AAXX080903:3:43:445:1400#0
-AGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCAGATCGGCAGGGGG
-+
-67777788888888888888888877776555443222100./..---,,+*+*+**))())()(('%&"##""""
- at 30BB2AAXX080903:3:59:628:253#0
-AGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATATGCNC
-+
-677777888888888888888888777765554/3.22100/...-,,,,,++***)))(((('(&'&$&%#"#"$
- at 30BB2AAXX080903:3:4:230:1909#0
-AAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTANCTACNCN
-+
-677777888888888888288688-777655544322.100/..---,-++,***+))))())('''""%#&%"""
- at 30BB2AAXX080903:3:60:414:1167#0
-TGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGAGATCGGACGCNACNN
-+
-6777778888888888888888887775655542322210//....-,,,,,+***))*)))((((&%$%#""%""
- at 30BB2AAXX080903:3:37:1104:1803#0
-TAGAGGAGACAAGTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTATCTTAACACACN
-+
-67777788888888888888888877776535443222100/../---,,,++**)*)))'()(&(("%%&%%%#"
- at 30BB2AAXX080903:3:38:1735:1918#0
-CTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTAGATAGCNN
-+
-677777888888888888888888777765554/35211000...,,,,,++*(*))*)))'(((('""%%"""""
- at 30BB2AAXX080903:3:38:1686:73#0
-CAAGTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACACAAACAACCAANN
-+
-67777788888888888888888877773552443221100//..--,--,*+)+*))#()))((''%"$$$##""
- at 30BB2AAXX080903:3:38:495:50#0
-CAAGTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACACAAATGCCCCANN
-+
-6777+78888888888888888887777655044323110/-/..-,,,-+*+**+'))()((((('""""#$"""
- at 30BB2AAXX080903:3:55:1539:172#0
-AACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACACAAAGCACCCAACACACCTGA
-+
-67777788888888888888888877776555443222100//..---,,++++**))*))(('((&$$&"##""#
- at 30BB2AAXX080903:3:49:546:1848#0
-TAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTCCCCATGT
-+
-67777788888888888888888877776555443222100/....-,,,++++*+)))))))('('%$""$"#"$
- at 30BB2AAXX080903:3:56:1431:57#0
-CTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACACACACAC
-+
-67777788888888888888888877776555443222100./..---,,,+++**)*)))((((''&$"&%###"
- at 30BB2AAXX080903:3:8:455:644#0
-AAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCNGCGACGNN
-+
-67777788888888888888888877776555443221100//..---),,++*)***))()('(('""%#"##""
- at 30BB2AAXX080903:3:43:789:1457#0
-GAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCACTGTGT
-+
-67777788888888888888888877776555443222000//...--,+++++*))))()((((('$&&$"""""
- at 30BB2AAXX080903:3:55:640:712#0
-GTTGAAATCTCCTAAGGGTAAGTTGGGCGCTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACNGACCGCTC
-+
-677777888888888888888888377-655944322/1/00*..---,-++++*+)#*()('(''&"$$"&"#"#
- at 30BB2AAXX080903:3:57:20:889#0
-ACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACACAAAGCACCCAACTTACACTTAGGAGATCTCAACT
-+
-67777788888888888888878877776555443220100/-.----,,++*****&((&)(((''"&#"#"###
- at 30BB2AAXX080903:3:49:1243:1534#0
-TGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACACAAAGCACCCAACTTACACTTAGGAGATCTCCACTTA
-+
-677777888888888888888888777765550432201/0//..--,,,+,++*+**)))((('('"##"$##"#
- at 30BB2AAXX080903:3:39:1496:1635#0
-GGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTTCGTCCCTCCTC
-+
-67777788888888888888888877776555443222100//..---,,+++****)*))(((((&&&%&&#%$#
- at 30BB2AAXX080903:3:59:160:1954#0
-CGGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTAGAGCGTANNC
-+
-67777788888888888888/888777765-54432121(/*...-,-,-+*+)*)()(#''((''''$%%#""""
- at 30BB2AAXX080903:3:2:1154:161#0
-ACTTGGACGAACCAGAGTGTAGCTTAACACAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACNAGCAACA
-+
-6777778888888888888/88487775655544/2/,/0/-/.-(-+,,-++)**)))%()#('&'$"#$""##"
- at 30BB2AAXX080903:3:38:1623:1208#0
-CAGAGCGGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTAGCGCGTTGCN
-+
-6777778808888088888888887777655441322-10///.,--,,,+*+***&)(*)')'#''&##%"""#"
- at 30BB2AAXX080903:3:36:14:30#0
-ACCAGAGTGTAGCTTAACACAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTNCACAGCGN
-+
-6777778-8888888888888888777765/244211100//0..--,,-++)+**))())((''''"$"#""#""
- at 30BB2AAXX080903:3:57:57:1285#0
-CTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTATGCCACCA
-+
-6777778888888888888848817777355544322/101/./.---,++*+***')('()(((('"%%#""###
- at 30BB2AAXX080903:3:36:892:715#0
-TGTAGCTTAACACAAAGCACCCAACTTGCACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAGCTCTCAN
-+
-67777788888888888888888877776555443222100//..---,,+++****))))((('('"#""$"%$"
- at 30BB2AAXX080903:3:46:1232:98#0
-TAGCTTAACACAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAAACCATGCCA
-+
-67777788888888888888888877776555443222100//..---,,-++****)))))(((((""%#""###
- at 30BB2AAXX080903:3:42:353:1645#0
-TGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAGTC
-+
-677777888888888)8888/8(87771+505,)32220/0/-.-+---,+++(**&)))))(%(''&&%#$""""
- at 30BB2AAXX080903:3:39:656:1874#0
-GGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGCGCT
-+
-67777788888888888888888877776553143221100/..----+,,+****))))())((''&&%%%%%$#
- at 30BB2AAXX080903:3:52:973:575#0
-GGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTAAAGATCAGAATCGGCGGA
-+
-67777788888888888888888877754515443021/0,/+...--,,++'+)**)()))((&('$""""#"#"
- at 30BB2AAXX080903:3:8:869:1218#0
-AGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTAANGAGCCANN
-+
-6777778088888888488888887677155344322210///-,---,-+++****)))))(((''""""###""
- at 30BB2AAXX080903:3:1:120:1492#0
-TAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTACNTCNAACA
-+
-67777788888888888888888877776355443220110///--,,,,,+**+)*)))('(((('""#%""#""
- at 30BB2AAXX080903:3:42:1218:1148#0
-TCTGGTAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTACTAAGTG
-+
-67777788888888888888888877776555443222100//..---,-+++*+***)))((('('&"%%&"%$$
- at 30BB2AAXX080903:3:55:356:374#0
-GGTTGTCTGGTAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGANCTCTACN
-+
-67777788888888888888838877776555443232100//..--,,,+,+***)*)()((((('$"###"#""
- at 30BB2AAXX080903:3:42:1225:276#0
-AAGGTTGTCTGGTAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTC
-+
-67777788888888888888888878776655443222100./.----,-+,++**)))))'((((#&&""%%%##
- at 30BB2AAXX080903:3:56:1410:831#0
-TAAGGTTGTCTGGTAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTAGATCGGAAGCGCTGTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()('('$"#%#"##"
- at 30BB2AAXX080903:3:47:57:1929#0
-GGTTTGGCTAAGGTTGTCTGGTAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCACCTGTAGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))()('('&#"""""#"
- at 30BB2AAXX080903:3:42:482:765#0
-TTAACTTGACCGCTCTGAGCTAAACCTAGCCCCAAACCCACTCCACCTTACTACCAGACAACCTTAGATCGGCATA
-+
-677777888888888888888888.7776555453221100/.....++,,,++**)))())('(''%%&%%"#"#
- at 30BB2AAXX080903:3:35:510:632#0
-ATCGCCTATACTTTATTTGGGTAAATGGTTTGGCTAAGGTTGTCTGGTAGTAAGGGGGGGTGGGGTTNGCGTATCN
-+
-677777888888888888888888777765554432221&0//.---*+,*++**())()'(((%('"$"""###"
- at 30BB2AAXX080903:3:4:1655:1851#0
-AACCATTTACCCAAATAAAGTATAGGCGATAGAAATTGAAACCTGGCGCAATAGATATAGTACCGCAANCTCANCN
-+
-67777788888888888888188877775555,432121./1/-,--,+,++*****)*)'((((''""##%#"#"
- at 30BB2AAXX080903:3:45:481:1555#0
-TCATCTTTCCCTTGCGGTACTATATCTATTGCGCCAGGTTTCAATTTCTATCGCCTATACTTTATTTGGGGTTTTC
-+
-637777888888888888838888777765514/3.22&00.'----*,,+*+))))*)((((((('%&""$"#""
- at 30BB2AAXX080903:3:42:482:517#0
-TTGAAACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGATGAAAAATTATAACCAAGCATAATATAGCAGAGAG
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))))(('&'&%&&##"#
- at 30BB2AAXX080903:3:1:408:1140#0
-AACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGATGAAAAATTATAACCAAGCATAATATAGCAANAANTTAT
-+
-677777888888888888888888777765554232221/0/../---,,+,++**))))))))'''%"##"""""
- at 30BB2AAXX080903:3:38:202:192#0
-TCATTATGCAGAAGGTATAGGGGTTAGTCCTTGCTATATTATGCTTGGTTATAATTTTTCATCTTTCTCTTACANN
-+
-67777788888888888888888877776255443222101//..---,,,++***)))))(((('&$&%%"#$""
- at 30BB2AAXX080903:3:50:1068:1354#0
-GCAAGGGAAAGATGAAAAATTATAACCAAGCCTAATATAGCAAGGACTAACCCCTAAGATCGGAAGACTGTCACCT
-+
-6777778888888888888888887777655%443222101//..---,,+++****))))((((('""$"$"$#"
- at 30BB2AAXX080903:3:48:1113:258#0
-AAGGGAAAGATGAAAAATTATAACCAAGCATAATATAGCAAGGACTAACCCCTATACCTTCTGCATAACAACTCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((((''&$""""$"#
- at 30BB2AAXX080903:3:35:1614:462#0
-GTCTGGTTTCGGGGGTCTTAGCTTTGGCTCTCCTTGCAAAGTTATTTCTAGTTAATTCATTATGCAGNCTGACACN
-+
-60777788888888888888888877776555413221/10./..--,-,++++*+))*())))(''"$#$$%$#"
- at 30BB2AAXX080903:3:48:210:598#0
-TATACCTTCTGCATAATGAATTAACTAGAAATAACTTTGCAAGGAGAGCCAAAGCTAAGACCCCCGATACCAGACG
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))'(('&%%$"&%$""
- at 30BB2AAXX080903:3:33:601:411#0
-CTACATAGACGGGGGTGCTCTTTTAGCTGTTCTTAGGGAGCTTGTCTGGTGTTGGGGGGCTTTTGTANCCGCATNN
-+
-6777778888888281888888887711642$14+22*,0&#%/,)+,,&$)%'***)&&)####&#"$#"%""""
- at 30BB2AAXX080903:3:34:239:138#0
-TTGCTACATAGACGGGTGTGCTCTTTTAGCTGTTCTTAGGTAGCTCGTCTGGTTTCGGGGGTCTTAGNTCACACNN
-+
-67777788888888888888,8887777655544322210,//..--,--+++*+*)))))&'((%'""$$%$#""
- at 30BB2AAXX080903:3:3:610:1261#0
-GCCAAAGCTAAGACCCCCGAAACCAGACGAGCTACCTAAGAACAGCTAAAAGAGCACACCCGAGATCGNAGCTNCA
-+
-677777888888888888888887777+655.-431122000..-.,,,,++****)*)(()(((#'"""""$"##
- at 30BB2AAXX080903:3:37:1417:1349#0
-CCGAAACCAGACGAGCTACCTAAGAACAGCTAAAAGAGCACACCCGTCTAGATCGGAAGAGCGGTTCAGGCCTACN
-+
-67777788888888888888888877776555443222100//..-.-,,+++***))))))((#'%$%%%$%$#"
- at 30BB2AAXX080903:3:50:378:403#0
-ACCTATAAATCTTCCCACTATTTTGCTACATAGACGGGTGTGCTCTTTTAGCTGTTCTTAGGTAGCTCGCCTGGCC
-+
-67777788888888888888888877776555443222/0///..---,,+++*****)))(()(('&$$#"""##
- at 30BB2AAXX080903:3:39:438:1749#0
-TACCTATAAATCTTCCCACTATTTTGCTACATAGACGGGTGTGCTCTTTTAGCTGTTCTTAGGTAGCTCGTCGAGT
-+
-677777888888888888888888777765554430221.0//&.&--,,)+(*+*)'*)%)((((#"%"""#"""
- at 30BB2AAXX080903:3:59:141:1526#0
-TTGTCGCCTCTACCTATAAATCTTCCCACTATTTTGCTACATAGACGGGTGTGCTCTTTTAGCTGTTCTTCACNNT
-+
-67777788888888888888888877776555443222100//.-.--,$+++&**))*)''#((&(%&&%$%"""
- at 30BB2AAXX080903:3:45:1534:1966#0
-CCAGGCTCGGTAGGTTTGTCGCCTCTACCTATAAATCTTCCCACTATTTTGCTACATAGACGGGGGTGCTCTTTTG
-+
-6777778888888888888,8888774,65452432.210///-.,--,,,'+****)*)(()(&(''$"$##$$#
- at 30BB2AAXX080903:3:50:611:1662#0
-TCACCAGGCTCGGTAGGTTTGTCGCCTCTACCTATAAATCTTCCCACTATTTTGCTACATAGACGGGATACGCTCT
-+
-67777788888888888888888877776555433222100//..----,+++****))))((('('"""#"#"##
- at 30BB2AAXX080903:3:51:673:1231#0
-GGACAACCAGCTATCACCAGGCTCGGTAGGTTTGTCGCCTCTACCTATAAATCTTCCCACTATTTTGCTCTCTGGC
-+
-67777788888888888888888877776555443222100//...---,+++**))))))(((''(%$#"#"#$#
- at 30BB2AAXX080903:3:1:556:1316#0
-CTTGGACAACCAGCTATCACCAGGCTCGGTAGGTTTGTCGCCTCTACCTATAAATCTTCCCACTATATNTCNCACC
-+
-67777788888888888888888877776/55413222000//.-,-,,,+++**))))()()('('%"&%"%##"
- at 30BB2AAXX080903:3:57:1609:1690#0
-TAGTGGGAAGATTTATAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGAACACACCAAA
-+
-67777788888888888888888877776555443221100/...---,,++*****)))())('%&$$%$$#%##
- at 30BB2AAXX080903:3:53:832:373#0
-AAAGTTGAACTAAGATTCTATCTTGGACAACCAGCTATCACCAGGCGCGGCAGGGTGGTCGACGCTGCCCAAGATC
-+
-6777778888888888888888/87777655044322110///.--,',,+,+)(()))()')('&'%$%"&$##"
- at 30BB2AAXX080903:3:37:501:1818#0
-ATAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTTAGTTCACCTANCTGN
-+
-67777788888888888888888877776555443222100/....--,,++++**))))))((('(&$%&"#%#"
- at 30BB2AAXX080903:3:53:1186:212#0
-TGTGGGCAAATTTAAAGTTGAACTAAGATTCTATCTTGGACAACCAGCTATCACCAGGCTCGGTAGGATTGTCGTC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('""%%$$""#
- at 30BB2AAXX080903:3:44:894:1343#0
-GACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTTAGTTCAACAGATCGGAAGAGCGGCGCG
-+
-67777788888888888888888877776555443202100//..---,-+++*++**))('(((('&%#$$##""
- at 30BB2AAXX080903:3:58:858:844#0
-GGATTTAGAGGGTTCTGTGGGCAAATTTAAAGTTGAACTAAGATTCTATCTTGGACAACCAGCTATCACCACACGA
-+
-67777788888888888888888877776555443222100//..---,,+,+**+**)())((((''&&#%##"#
- at 30BB2AAXX080903:3:59:158:248#0
-GCCCACAGAACCCTCTAAATCCCCTTGTAAATTTAACTGTTAGTCCAGATCGGAAGAGCGGTTCAGCAGGTCCNNA
-+
-67772788888888888888888877776555443222100//..---,,+++***)*)))'(''('&%%"#%"""
- at 30BB2AAXX080903:3:39:1582:505#0
-TTTAACTGTTAGTCCAAAGAGGAACAGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAACATTTACC
-+
-6777778888888888888888887777655534332210///----,,,,,+***)*))))((((#'$%&##$##
- at 30BB2AAXX080903:3:53:50:1468#0
-AGAGGAACTGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAAAATTTAACACCCATAGTAGTGTCTC
-+
-67777788488888888888888877776555423220100//..---,,,++*++)**))((((('""$"#"##"
- at 30BB2AAXX080903:3:46:241:1775#0
-TAGTGGGTGTTGAGCTTGAACGCTTTCTTAATTGGTGGCTGCTTTTAGGCCTACTATGGGTGTTAAATTGGTTACT
-+
-6177778888888888888888/877776555443222100-0..-+-,(++*)*)))*)()()&('"#$#$$"##
- at 30BB2AAXX080903:3:47:837:682#0
-TAGTGGGTGTTGAGCTTGAACGCTTTCTTAATTGGTGGCTGCTTTTAGGCCTACTATGGGTGTTAAGATCGGCGCG
-+
-67777788888888888888888877776555443222100//..---,,+,+*+*)))))(((((($$"%"####
- at 30BB2AAXX080903:3:58:1081:970#0
-AGGTAGTGGGTGTTGAGCTTGAACGCTTTCTTAATTGGTGGCTGCTTTTAGGCCTACTATGGGTGTTATGTACCTC
-+
-67777788888888888888888877776555443222100//...-,,,++#++))*)))((&'%(&%$$$"$#%
- at 30BB2AAXX080903:3:33:1614:1576#0
-ACACCCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACCAGATCGGAANCAGTCANN
-+
-677777888888888888888888777765552432221000/--.-,,,+,+****()*()((('("%"""$#""
- at 30BB2AAXX080903:3:8:1599:447#0
-CCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACCCACTACCTAAGATNCACACANN
-+
-677777888888888888888888777765554432221/00/...-,,,+++***)*))))))(('"%%$$$$""
- at 30BB2AAXX080903:3:34:1421:377#0
-CATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACCCACAGATCGGAAGANCTCCACNN
-+
-67777788888888888888888877776555443222000//..---,,+++*****))))(((('"'#"##%""
- at 30BB2AAXX080903:3:55:986:1797#0
-AGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACCCACTACCTAAAAAATCACAGACACAC
-+
-67777788888888888888888877776555443222100//..---,,,++**+))))))()'(#'&"&%%$$%
- at 30BB2AAXX080903:3:57:574:166#0
-ATTGGGTGTGAGGAGTTCAGTTATATGTTTGGGATTTTTTAGGTAGTGGGTGTTGAGAGATCGGAAGGGGTCGAGT
-+
-67777738/83888888888888877776555443222101//.,-,-,,,+****))))((()(('$"%"#""""
- at 30BB2AAXX080903:3:59:436:1062#0
-TTGGTCCAATTGGGTGTGAGGAGTTCAGTTATATGTTTGGGATTTTTTAGGTAGTGGGTGTTGAGCTTGACCACNA
-+
-67777788888888888888888877476555443222100//..---,,+,+***)))))())'(''&$"#"#""
- at 30BB2AAXX080903:3:35:1085:1659#0
-ATAGGGTGATAGATTGGTCCAATTGGGTGTGAGGAGTTCAGTTATATGTTTGGGAGATCGGAAGAGGNGGCTCTCN
-+
-67777788888888888888888877776552442222100//..---,,+++***)*(*)((('(&"$#%$#"#"
- at 30BB2AAXX080903:3:50:14:1059#0
-AAAAAATCCCAAACATATAACTGAACCCCTCACACCCAATTGGACCAATCTATCACCCTATAGAAGANATCACGTC
-+
-67777788888888888888888877776555443222100//...--,-+++****)))))))(('"""$"$##"
- at 30BB2AAXX080903:3:34:730:1226#0
-ACTAACATTAGTTCTTCTATAGGGTGATAGATTGGTCCAATTGGGTGTGAGGAGTTCAGTTATATGTNTGGGCTNN
-+
-67777788888888888888888897776555443222000//...--,,++*****))))(((''&"%$""$#""
- at 30BB2AAXX080903:3:4:86:545#0
-CCAAACATATAACTGAACTCCTCACACCCAATTGGACCAATCTATCACCCTATAGAAGAACTAATGTCNCTATNAN
-+
-67777788888888888888888877776545443220100//..--,+,+++***)*))))(((''%"##"""$"
- at 30BB2AAXX080903:3:46:1307:321#0
-CTTATACTAACATTAGTTCTTCTATAGGGTGATAGATTGGTCCAATTGGGTGTGAGAGATCGGAAGAGGGGGTTGC
-+
-67777788888888888888888877776555443222100//,/---,,+++****))(()((((&""""""""#
- at 30BB2AAXX080903:3:1:606:1984#0
-GACCAATCTATCACCCTATAGAAGAACTAATGTTAGTATAAGTAACACGAAAACATTCTCCTCCGCATNATNTCTC
-+
-67777788888888888888888877776555443222101/-.----,,+,+*****)))((((('&"%%"$%$"
- at 30BB2AAXX080903:3:60:1531:1324#0
-TGACGCAGGCTTATGCGGAGGAGAATGTTTTTATGTTACTTATTCTAACATTAGTTATTCTATAGACACACACANN
-+
-677777888888888888/8888&777+655)2331,,,10-/(%+++&+*+**')#()'(()'#'&$$#%%$%""
- at 30BB2AAXX080903:3:33:999:577#0
-CTGACGCAGGCTTATGCGGAGGAGAATGTTTTCATGTTACTTATACTAACATTAGATCGGAAGAGCGNGCACATNN
-+
-67777788888888888888888877776555443222100//..----,+++**))*)*)(()'(&""#$$##""
- at 30BB2AAXX080903:3:1:930:2008#0
-CCTATAGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAAGCCTGCGTCAGANTANAACG
-+
-6777778888888888888888887717155541322010././-.-,,,,++*+****)()(%(''&"%#""#$"
- at 30BB2AAXX080903:3:47:1140:412#0
-AGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAAGCCTGCGTAGAACGGAANTTCACAC
-+
-67777788888888888(88888377776555443222.10//..---+,+++*)*)*()))%#&''$"""$####
- at 30BB2AAXX080903:3:39:968:1105#0
-GTTCAGTGTTTTAATCTGACGCAGGCTTATGCGGAGGAGAATGTTTTCATGTTACTTATACTAACATTAGCACTCC
-+
-677777888888888888888888777765554432221.0///.--,,,+,++*****)))(((('%%%#%%$$#
- at 30BB2AAXX080903:3:8:1690:433#0
-TAAGTAACATGAAAACATTCTCCTCCGCATAAGCCTGCGTCAGATTAAAACACTGAACTGACAATTANACTACANN
-+
-67777788888888888888888877776555433222100//..----,++++**))*))(((((&""##"$#""
- at 30BB2AAXX080903:3:46:422:236#0
-GTTGGTTGATTGTAGATATTGGGCTGTTAATTGTCAGTTCAGTGTTTTAATCTGACGCAGGCTTATGCGTGACTCG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('&&"#"#"#"
- at 30BB2AAXX080903:3:47:1602:1542#0
-CTGCGTCAGATTAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCAACAAGTCATACGTCGGCT
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(((('""#$#""#"
- at 30BB2AAXX080903:3:40:125:1283#0
-TGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGGGCTGTTAATTGTCAGTTCAGTGTTTTANTCTGACAC
-+
-67777788888888888888888877776555443222100./..---,,++++**)))))()('''""$%$#%#$
- at 30BB2AAXX080903:3:1:884:1288#0
-TCAGATTAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCAACAAGTCATTATTACNCTNAGCC
-+
-677777888888888888888888477765554432-2100/..-.--,,+++())**()))(('''&"%"""#"#
- at 30BB2AAXX080903:3:57:1687:512#0
-GTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGGGCTGTTAATTGTTCACAACCACA
-+
-67777788888888888888888877776555443222100//..--,,-+,+*#*))))))(('#&'&%%%$%$$
- at 30BB2AAXX080903:3:36:372:1387#0
-CACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCAACAAGTCATTATTACCCTCACTGTCACGCTCCAN
-+
-67777788888888888888888877776555443222100//..--,,,+++*+*)))))((('('&$"%""#""
- at 30BB2AAXX080903:3:34:1773:506#0
-TGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGGGCAGATCGGAANTCACACNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))(((((""$$&"$""
- at 30BB2AAXX080903:3:36:444:1993#0
-CATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGAGATCTCTAGCTCNN
-+
-67777788888888888888888877776555443220100//..---,,+++***)*)))()(('%%$"####""
- at 30BB2AAXX080903:3:40:1729:914#0
-GCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGGGCTGTTTATTGTC
-+
-67777788888888888888888877776,55443222100//..-,-,-+++)***))))()(('&'#"&&&$""
- at 30BB2AAXX080903:3:48:1074:194#0
-GCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATAGATCGGAAGGTCCCACC
-+
-67777788808888888888888877776/55441220100/0..---,,+++)****)))((('''%"$$##"##
- at 30BB2AAXX080903:3:46:1097:1157#0
-AGCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGGGCTGTGACTTGC
-+
-67777788888888888888888877776555443222100//..--$,,++++**))*()((('&''%"#%""$"
- at 30BB2AAXX080903:3:1:1696:800#0
-ATGAGCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTCGGNTGNTTCT
-+
-67777788888888888888188877716)55445222100/...-+,,,+,++*))())((((((&%"%%"""#"
- at 30BB2AAXX080903:3:44:1601:1875#0
-TAACAGCCCAATATCTACAATCAACCAACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAG
-+
-677777888888888888888888777765554432221000/..---,,,,++**())))((('''$&&%%"%$#
- at 30BB2AAXX080903:3:43:723:598#0
-CTTATGAGCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATACTGGGCTGGC
-+
-677777888888888888888888777765/5443212100//./---,,+++***)*))))(((('$&%&%##""
- at 30BB2AAXX080903:3:37:1396:872#0
-CAGCCCAATATCTACAATCAACCAACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATCACTN
-+
-67777788888888888888888877776355443222100//..--,,,,+++*))*)()())'(&%$#%$##""
- at 30BB2AAXX080903:3:4:190:253#0
-TCCTTTTACTTTTTTTAACCTTTCCTTATGAGCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATANATGANAN
-+
-64777788888888888884888277776555343231100//..---,,++++*****)()(((('""$#"#"#"
- at 30BB2AAXX080903:3:39:860:993#0
-TGCCGAGTTCCTTTTACTTTTTTTAACCTTTCCTTATGAGCATGCCTGTGTTGGGTTGACAGATCGGAAGCTGCTA
-+
-67777788888888888888888877776555443222100//..----,+++**))))))())((&%&%$""#"#
- at 30BB2AAXX080903:3:46:345:1922#0
-ATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAAGGAAAGGTTAAAAAAAGTAAAAGGAACTCGGACAAGC
-+
-67777788888888888888888877775555343222000/...-,--,+*+***)*))()(((''&%#"$"""#
- at 30BB2AAXX080903:3:57:622:842#0
-AAGATTTGCCGAGTTCCTTTTACTTTTTTTAACCTTTCCTTATGAGCATGCCTGTGTTGGGTTGACAGTGCTACAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+***)))()((('&&%""#""#
- at 30BB2AAXX080903:3:8:442:1762#0
-TGGTGATGCTAGAGGTGATGTTTTTGGTAAACAGGCGGGGGAAGATTTGCCGGGTTCCTTTTAAGATNACGTCCNN
-+
-6777778888888888888888887772655244332210-/.-)-,++++,**)*#'())(%(%%&""#""##""
- at 30BB2AAXX080903:3:41:217:1293#0
-TGGGCAGGCGGTGCCTCTAATACTGGTGATGCTAGAGGGGATGTTTTTGGTAAACAGGCGGGGGGAGCATTTNCGC
-+
-67777788888888888488888877(76555483222&00//-.---,,+*+*)*))'))(()#&'&$%%%"%$"
- at 30BB2AAXX080903:3:1:1280:264#0
-GTGTCACTGGGCAGGCGGTGCCTCTAATACTGGTGATGATAGAGGTGGTGGTTTTGGTAAAGAGGCGGNGCNACGT
-+
-6770*788888888888848/8871373)025413322&0&....)-&+,**+**()''(('''&#'$""$""#""
- at 30BB2AAXX080903:3:51:187:195#0
-TTACCCCGCCTGTTTACCAAAAACATCACCTCTAGCATCACCAGTATTAGAGGCACCGCCTGCCCAGACAACACTC
-+
-67777788888888888888888877776555443222100/..%--,,,,++*+*))))()(((('"$"#%"#"#
- at 30BB2AAXX080903:3:41:1536:1059#0
-CATGTGTCACTGGGCAGGCGGTGCCTCTAATACTGGTGATGCTAGAGGTGATGTTTTTGGTAAACAGGCGGGGGGC
-+
-677777888888888888888888777765553432,2/00-/-..--+,,+*'**()))((()'('"$#"#"""#
- at 30BB2AAXX080903:3:2:972:1646#0
-AACATGTGTCACTGGGCAGGCGGTGCCTCTAATACTGGTGATGCCAGAGGGGATGTCTTTTGTAAAAANTGACACT
-+
-677777888888)8888888088%767,6/2.31'22-$0&./+'-++,,$+*$+&#*()#(##(&#"""##$##"
- at 30BB2AAXX080903:3:43:108:590#0
-GTTAAACATGTGGCACTGGGCAGGCGGTGCCTCTAATACTGGTGATGCTAGAGGGGATGGTTTTGGTAAACCGGAG
-+
-677777888888,88888888888777-6555443222100//.---,-,+++*%***)&))(((('%%$##$"""
- at 30BB2AAXX080903:3:40:1297:1318#0
-CCTGTTTACCAAAAGCATCACCTCTAGCACCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTNATGCA
-+
-67777788888888888888888877776525443212100/...---,,,+++*))))())()(''&$&"""##"
- at 30BB2AAXX080903:3:44:585:1151#0
-GGCCGTTAAACATGTGTCACTGGGCAGGCGGTGCCTCTAATACTGGTGATGCTAGAGGTGGTGTTTTTGGGGGGAG
-+
-677777888888888888888888.77765504(3222011/-..,)-,,++*(*#*)&)''(%((%$$#"$""""
- at 30BB2AAXX080903:3:49:1341:1445#0
-CGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGGGCTCTTATATTTGTGATGGTAGGAGAACGGGAACGTTGAC
-+
-6777778888888888888888285771655/44(2-%.-,#'-,$+'+(,$')#*&##(('##'''""""""""#
- at 30BB2AAXX080903:3:35:212:1358#0
-AAACATCACCTCTAGCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGNCGGAGGCN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((&"$"""""$"
- at 30BB2AAXX080903:3:36:500:514#0
-TTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGGCCTCTAATACTGGTCTTGTGTGN
-+
-67777788888888888888888877776555442222100//..---,,+&+(*)*)&)(''((('&$"""""""
- at 30BB2AAXX080903:3:42:19:130#0
-TTGCACGGTTAGGGTAACGCGGCCGTTAAACACGCGGCAGCGTGCAGGCGGGGGCTCTCCTAACTACGCTCTGTAC
-+
-67777788,8888888888888857#/765,9$4'2)+.'#.#-%+),+,+*')*#'(######%##"$"#"""##
- at 30BB2AAXX080903:3:56:1182:668#0
-TTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGGGGGTCGGGAGAGGGGTGCACCCT
-+
-67777788888888888888888877776555443222100//..---,,+*+'*'&#))%((&(%#&%$$"###"
- at 30BB2AAXX080903:3:44:924:1681#0
-CTAGCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACCCTAACCGTGCACA
-+
-67777788888888888888888877776555443222100/0..---,,+++***)*)')#(('('%&%"%#"""
- at 30BB2AAXX080903:3:47:235:768#0
-TGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGTGCCTCTACTTCTCTGT
-+
-67777788888888888888888877776555443222100//-.---,,++++***))#)'((((%$""""###"
- at 30BB2AAXX080903:3:46:1456:951#0
-ATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGTGCCTCTAGACTACAN
-+
-67777788888888888888888877776555443222100//..---,+*++****))*#)#'(&%$%"$###""
- at 30BB2AAXX080903:3:3:1343:1688#0
-TATGCTACCTTTGCACGGTTAGGCTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGGCCTCTNGTTCNCA
-+
-677777888888888888.888887777655544320/21,0+.%.,+,,)'*+'()))()%(#&#'""""$%"##
- at 30BB2AAXX080903:3:60:316:139#0
-TGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGAGATCGGAAGAGGTGNTCNN
-+
-677777888888888888188888777735554432121///.,-+,,+,,**)'*)))''((''(#%$""""%""
- at 30BB2AAXX080903:3:1:1478:1991#0
-GTGATTATGCTACCTTTGCACGGGTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGGNGTNCTNC
-+
-62777788888888888888888/177760554422320/...(.-+&-,++++*)(*)'&()(('&$"%#"""""
- at 30BB2AAXX080903:3:56:1111:397#0
-AGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACAAGTGTCACTGGGCAGGCGGGAGCGTCGT
-+
-67.77788888888&8,8888888.77765'54412,0/1/%*,.,+-+,++*(**()))()')(('&"%%#"#""
- at 30BB2AAXX080903:3:57:1137:440#0
-AGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGCGCTACCG
-+
-67777788888888888888888877776555443222100...--,-,,*++***()*)'')(((''$%%"###"
- at 30BB2AAXX080903:3:57:760:1503#0
-AAGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGTCACCTAT
-+
-67777788888888888888888877776555443222100/...--,,,++++*)**)))((('(''&"$$###"
- at 30BB2AAXX080903:3:3:14:452#0
-AGAGGCACCGCCTGCCCAGTGACACAGGTTTAACGGCCGAGGTACCCTAACCGTGCAAAGGTAGCATCNCACNNCA
-+
-67777788388-88..+08,/8)54'274/524-22,+1#,)&.*)+++,%*)$*#')'(%#'(#''&"%""""##
- at 30BB2AAXX080903:3:49:1290:235#0
-GAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGTAGCATACACAGTTGT
-+
-67777788888888888818888877776555443222100-/--.*-,,,+(+*(()))#(('(('$$$"""###
- at 30BB2AAXX080903:3:54:1040:1116#0
-ACAAGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCTAGCGACT
-+
-67777788888888888888888877776555443222100/...-+--++,+**))*))'((((''%$#$%#"#"
- at 30BB2AAXX080903:3:57:1582:753#0
-ACAAGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGATCCTGCAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&"""""$###
- at 30BB2AAXX080903:3:58:1212:2003#0
-GGAACAAGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCCGGACCTCN
-+
-677777888888888888888888777765554432110/0//.-.-,-,++%*+***)#('((''#"%&#$#"#"
- at 30BB2AAXX080903:3:42:1338:1898#0
-ACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGTAGCATAATCACCTCAATATA
-+
-67777788888888888888888877776555443220//0/.----,,,++++*'*)())()(((&&&%%%%%$%
- at 30BB2AAXX080903:3:45:1767:1741#0
-AAGGAACAAGTGACTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCTCTTGGT
-+
-6777778888888888888888887777655544322210/.//.--,,+,+++****()('('((''""#""#""
- at 30BB2AAXX080903:3:40:1493:1863#0
-TGCCCAGTGACACATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGGAGCATAATCACTTGTTCCTTACGNGC
-+
-677777888888888888888888777+65,5112222220-/------$,++*)***))((((((%&'%&%$"##
- at 30BB2AAXX080903:3:4:1314:261#0
-CCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGAGATCGGAAGAGCGGNACCANCN
-+
-67777788888888888888888878776555443232100//..---+,+++****())(((((&'%"#$$#"#"
- at 30BB2AAXX080903:3:3:820:1431#0
-CCAGTGACACATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGTAGCATAATCAGATCGGAAGAGNCAGCNNC
-+
-677777888888888888888888777/6555440212/0//+-..),,++++**))*)&()(('('%"%""#""#
- at 30BB2AAXX080903:3:1:1671:1146#0
-CATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGTAGCAGAATCACTTGTTCCTTAAATAGGGACNCANCACA
-+
-677777888888+888888883827747605351/2--000.'.-+-++*+,'**)))(#)((((&(&"""""###
- at 30BB2AAXX080903:3:8:1696:1593#0
-CATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGGAGCATAATCACTTGTTCCTTAAATAGGGANCGTCACNN
-+
-677777888888888888'888887777635544322#10..,---,-+,,+++'*)))()((('(&"$""$##""
- at 30BB2AAXX080903:3:33:1730:189#0
-CATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGTTAGGGTACAGATCNACCCTANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)()))((('"##"$##""
- at 30BB2AAXX080903:3:37:1569:1092#0
-CATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGTTAGGGAGATCGGAAGNCACTCN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))))('('$'"""##""
- at 30BB2AAXX080903:3:50:1776:595#0
-GTGGAGCCATTCATACAGGTCCCTATTTAAGGAAAAAGTGAATATGCTACCTTTGCAAGGTTAGGACGCGTCACCA
-+
-62777788888088888888/08/73776555441222+00'&./---,,+'+***)')(')'(((#"$#"#####
- at 30BB2AAXX080903:3:43:1237:453#0
-CGCGGTACCCTAACCGTGCAAAGGTAGCATAATCACTTGTTCCTTAAATAGGGACCTGTATGAATGGCTCCACAGC
-+
-67777788888888888888888847776555443222100//..---,,+++***))*))()(('''&%&$%#$"
- at 30BB2AAXX080903:3:58:1639:1422#0
-CTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGTTAGCACACAAAN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((('(&$$"%&#%$"
- at 30BB2AAXX080903:3:2:1410:1565#0
-CCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGTTAGNGTCTACC
-+
-677777888888888888888885787745553432121-./-/..,+,-+++***)()))()(''''"""""$##
- at 30BB2AAXX080903:3:36:1072:929#0
-CCTAACCGTGCAAAGGTAGCATAATCACTTGTTCCTTAAATAGGGACCTGTATGAATGGCTCCACGTATAGCCACN
-+
-67777788,8888888.888888877776555440220000.//.--+,,+++++))*))(('(((%"%""####"
- at 30BB2AAXX080903:3:42:629:1031#0
-GCTGAACCCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGGTAGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))()()(''''&##$"##
- at 30BB2AAXX080903:3:51:650:536#0
-AGCTGAACCCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCCCGGCTCG
-+
-67777788888888888888888877776555443222100//..----,,++***))))))))((&&""#"$#"#
- at 30BB2AAXX080903:3:58:493:353#0
-AAGAGACAGCTGAACCCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTCACNC
-+
-67777788888888888888888877776555443222100//..--,,,+++***))))))))'(('%&&$##"#
- at 30BB2AAXX080903:3:56:1585:582#0
-GTAGCATAATCACTTGTTCCTTAAATAGGGACCTGTATGAATGGCTCCACGAGGGTTCAAGATCGGAACACAAAAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''(''%#$##$#
- at 30BB2AAXX080903:3:4:439:1901#0
-TAGCATAATCACTTGTTCCTTAAATAGGGACCTGTATGAATGGCTCCACGAGGGTTCAGCTGTCTCATNTCGCNCN
-+
-677777888888888888888888777765554432221////....-,,+,+*'))))*()(((('""$'&""$"
- at 30BB2AAXX080903:3:49:478:229#0
-ACTGGTTAAAAGTAAGAGACAGCTGAACCCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACCTGTGTGCC
-+
-67777788888888888888888877776555443222000//.,--,-,++)***))))((()(''"$"#"#"#"
- at 30BB2AAXX080903:3:49:479:228#0
-ACTGGTTAAAAGTAAGAGACAGCTGAACCCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACATGTTGTAC
-+
-677777888888888888888888777765554432220/0./.,.-,,,,++**))*&)(()((''$$$"""""#
- at 30BB2AAXX080903:3:58:1212:747#0
-AATCACTTGTTCCTTAAATAGGGACCTGTATGAATGGCTCCACGAGGGTTCAGCTGTCTCTTACTTTTANCCTCCA
-+
-67777788888888888888888877776555443222100//..---,,+,+*+**))))()(((($""%####$
- at 30BB2AAXX080903:3:44:1353:990#0
-AAATAGGGACCTGTATGAATGGCTCCACGAGGGTTCAGCTGTCTCTTACTTTTAACCAGAGATCGGACGATGTGCT
-+
-67777788888888888888888877776555443222100//.-----,+++++))*)))(('(('""#"#""##
- at 30BB2AAXX080903:3:34:747:2003#0
-CCTGTATGAATGGCTCCACGAGGGTTCAGCTGTCTCTTACTTTTAATCAGTGAAATTGACCTGCCCGNTCGATANN
-+
-6777778888888888888)8888-7016/45353./1(&/-..,+"+++&+%*)&')&##&'''&#""""%"#""
- at 30BB2AAXX080903:3:57:554:752#0
-GCCTCTTCACGGGCAGGTCAATTTCACTGGTTAAAAGTAAGAGACAGCTGAACCCTCGTGGAGCCATTCNTACACG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$&"%%$%$#
- at 30BB2AAXX080903:3:46:797:832#0
-CGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAAAAGTAAGAGACAGCTGAACCCTCGTGGAGCCATCGACTCAG
-+
-67777788888888888828888877776555443222100//..---,,++++**)))))))((((""#"####"
- at 30BB2AAXX080903:3:52:347:1979#0
-TGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAAAAGTAAGAGACAAGATCGGAAGCGTGGTCT
-+
-67777788888888888888888877776/454432-2000//.,.,,,,-*+**+()(*)(&((''%"#"#"#"#
- at 30BB2AAXX080903:3:33:553:2038#0
-TTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAGATCGGAAGAGGGGGTCANCAGAGCNN
-+
-677777888888888888880888777765554-2202100.+-,,+--*,*%(*#)*&(#)(#&&#"$$"#"#""
- at 30BB2AAXX080903:3:34:158:996#0
-TTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAAAAGTAAGAGACAGCTGANGTCCATNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))(((''&""####"""
- at 30BB2AAXX080903:3:46:1412:58#0
-GTTCAGCTGTCTCTTACTTTTAACCAGTGAAATTGACCTGCCCGTGAAGAGGCGGGCCTGAGATCGGTCTATACCT
-+
-6777778888&888888888888372776555443222000/..-.-,,,,+++**'#'''('#%%'"$"""###"
- at 30BB2AAXX080903:3:59:678:1080#0
-ATAGGGTCTTCTCGTCTTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCAAGATCGGAAGAGCACTCC
-+
-6777778888888888888888884347655544331/0/./...,,-,%+****)))(((#''(&''"&$##"##
- at 30BB2AAXX080903:3:41:1084:1398#0
-CCATAGGGTCTTCTCGTCTTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAAAAGTAACA
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(('(''$"&#$""#
- at 30BB2AAXX080903:3:60:655:1701#0
-CCATAGGGTCTTCTCGTCTTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAACATACCNN
-+
-67777788888888888888888877776555443222100./..---,,++++**)*((())('(%%#"""##""
- at 30BB2AAXX080903:3:4:1044:397#0
-ATTAAAGCTCCATAGGGTCTTCTCGTCTTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTANGCACNCN
-+
-67777788888888888&888088767+65454/32/01001*/.+*+',+++***)))(%&'&'''$"%""""""
- at 30BB2AAXX080903:3:47:1248:1008#0
-CGGGCATGACACAGCAAGACGAGAAGACCCTATGGAGCTTTAATTTATTAATGCAAACAGTACCTAACAAACGACC
-+
-67777788888888888888888877776555443222100//..---,-++++***)*)))(((('%%"$&#"$$
- at 30BB2AAXX080903:3:47:1249:1009#0
-CGGGCATGACACAGCAAGACGAGAAGACCCTATGGAGCTTGAATTTATTAATGCAAACAGTACCTAACCGAGCAAT
-+
-6777778888888888888888887777655344322.10&//./----,++++**(())()('(%'&"%##$#""
- at 30BB2AAXX080903:3:41:1655:968#0
-CACAGCAAGACGAGAAGACCCTATGGAGCTTTAATTTATTAATGCAAACAGTACCTAACAAACCCAAAAACGTACA
-+
-67777788888888888888888877776555443222100//..--,+,+++++**))))))(('#"&%%%"#""
- at 30BB2AAXX080903:3:50:969:785#0
-TTAGGACCTGTGGGTTTGTTAGGTACTGTTTGCATTAATAAATTAAAGCTCCATAGGGTCTTCTCGTCCTGCGCAC
-+
-67777788883888888888888877776555443222100//..-,---++++**)))*))(((('&###$"##"
- at 30BB2AAXX080903:3:58:1387:309#0
-GTTTAGGACCTGTGGGTTTGTTAGGTACTGTTTGCATTAATAAATTAAAGCTCCATAGGGTCTTCTCGTCGTTANA
-+
-67777788888888888888888877776555443222100//..---,,++++**))))*((((('&%%"""%"$
- at 30BB2AAXX080903:3:45:534:1703#0
-CCCAACCGAAATTTTTAATGCAGGTTTGGTAGTTTAGGACCTGTGGGTTTGTTAGGTACAGATCGGAAGAGGGGCG
-+
-677777888888888888888088/77764551432221..//-.--,,,+++***'*)())('(('&&"#"#"""
- at 30BB2AAXX080903:3:44:357:1864#0
-AGGTCGCCCCAACCGAAATTTTTAATGCAGGTTTGGTAGTTTAGGACCTGTGGGTTTGAGATCGGAAGAGCGGCAG
-+
-67777788888888888888888877776555443221100//...,,,,+++***)*))))(((('$&%$&""""
- at 30BB2AAXX080903:3:38:1536:1714#0
-GGAGGTTGGGTTCTGCTCCGAGGTCGCCCCAACCGAAATTTTTAATGCAGGTTTGGTAGTTTAGGAGCATCGTCAC
-+
-67777788888888888888888877776515363022100//./--,,,+*+***)))())((('#'#"""$$##
- at 30BB2AAXX080903:3:8:825:450#0
-ATGTACTGCTCGGAGGTTGGGTTCTGCTCCGAGGTCGCCCCAACCGAAATTTTTAATGCAGGTTTGGNCCTCCANN
-+
-67777788888888888888888877776550442022//1-/.-.,,+-++****)*((()&((''"$##%##""
- at 30BB2AAXX080903:3:54:1424:851#0
-ACTACCAAACCTGCATTAAAAATTTCGGTTGGGGCGACCTCGGAGCAGAACCCAACCTCCGAGCAGTACACGCACA
-+
-67777788888888888888888877776555443222100//..---,,+*+***))))))()(''%$$"%%"##
- at 30BB2AAXX080903:3:48:1358:244#0
-TTTGACTGGTGAAGTCTTAGCATGTACTGCTCGGAGGTTGGGTTCTGCTCCGAGGTCGAGATCGGAAGCTTGTGCT
-+
-67777788888888888888888877776555440221100//..---,,+++**)*))))((((('%"""$""""
- at 30BB2AAXX080903:3:3:334:1558#0
-TTCGGTTGGGGCGACCTCGGAGCAGAACCCAACCTCCGAGCAGTAGATCGGAAGAGCGGTTCAGCCGCNCTCANAC
-+
-677777888888888888888888734725+52,21/2.01-.),.++++,*)*#)&)*%'#'(##(%"#"$#"#$
- at 30BB2AAXX080903:3:35:53:1222#0
-GTTGGGGCGACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGATCGGAANGCAAAAGN
-+
-67777788888888888888888877776555441222100//....-,,+,+******))((((('""%"#"#""
- at 30BB2AAXX080903:3:4:498:774#0
-TTGGGGCGACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCGCNCTACNAN
-+
-6777778888888888888888255777957144331212..0.--,,,,*+*)))())((()(('(&"#""""""
- at 30BB2AAXX080903:3:41:563:568#0
-GAGTATAGTAGTTCGCTTTGACTGGTGAAGTCTTAGCATGTACTGCTCGGAGGGTGGGTTCTGCTCCGCGGTCTGC
-+
-6777778888888888888888887777655544322210///....-,,+++%+**)%('))'(''$"#%#""""
- at 30BB2AAXX080903:3:57:444:1473#0
-TGAGTATAGTAGTTCGCTTTGACTGGTGAAGTCTTAGCATGTACTGCTCGGGGGGTGGGGTTGGGTCCGAGCGCGC
-+
-67777788888888888888884877776555/43221100*/..-.,,++)+*&*))))('#&#'#%&""$"$"#
- at 30BB2AAXX080903:3:45:1409:1547#0
-GACCTCGGAGCAGAACCCAACCTCCGAGGAGTACATGCTAAGACTTCACCAGTCAAAGAGAACTACGATACTCAAT
-+
-67.777888888888,+8888488+747'35-44322*2/0/0.,,-,&+*+***)*)')(('('&%$#"%#$"#$
- at 30BB2AAXX080903:3:48:1412:817#0
-AATTGAGTATAGTAGTTCGCTTTGACTGGTGAAGTCTTAGCATGTACTGCTCGGAGGTTGGAGATCGGGAGACTCT
-+
-67777788888888888888888877776555443322100//..--,,-+++*)**&)))')(&#%&""%##"#"
- at 30BB2AAXX080903:3:43:1722:534#0
-CTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCGAACTACTATACTCAATTGA
-+
-67777788888888888888888877776555443222100//..---,,++****)*)))))(((''&%%%%$$$
- at 30BB2AAXX080903:3:57:124:1822#0
-CTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCGAACTACTATACTCCATTCA
-+
-67777788888888888888888877776555443221100//..---,-+++**))**))((((('&$&"%#"#"
- at 30BB2AAXX080903:3:2:982:825#0
-TCAATTGAGTATAGTAGTTCGCTCTGACTGGAGAAGTCTTAGCATGTACTGCTCGGAGGTGGGGAGATNTCATTCC
-+
-67777788888888+88888888%7777655'44320*(00/../---,,+*++**()))&))((''$"#"$#"##
- at 30BB2AAXX080903:3:48:248:431#0
-GATCAATTGAGTATAGTAGTTCGCTTTGACTGGTGAAGTCTTAGCATGTACTGCTCGGAGGTTGGGTTGTGGTACG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''%$""$""#$"
- at 30BB2AAXX080903:3:50:1470:877#0
-ATTGGATCAATTGAGTATAGTAGTTCGCTTTGACTGGTGAAGGCTTAGCATGTACTGCTCGGGGGGTACACACTTC
-+
-6777778388.88888(8888888787765535,2/2%1/0/*#'-,,),)**+&))))(')&)(''"##$"#""#
- at 30BB2AAXX080903:3:53:19:1643#0
-CCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGCTTTGACTGGTGAAGTCTTAGCATGTACTGCTCTC
-+
-67777788888888888888888877776555443222100//..-.-,,+,+***))))*((('''%$$&#%$"#
- at 30BB2AAXX080903:3:48:888:617#0
-ACATGCTAAGACTTCACCAGTCAAAGCGAACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACACAGGT
-+
-677777888888888888888888777765594432+2.00//..---+,+++**)**()(('('''%#$##%"""
- at 30BB2AAXX080903:3:48:1129:467#0
-AGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGCTTTGACTGGTGACGCAGTTGC
-+
-67777788888888888888888877776555443222100//-.---,,-++**&*)))))((((&$$""##"""
- at 30BB2AAXX080903:3:33:1667:1497#0
-TAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGCTTTGACTGGTGNATGCCANN
-+
-67777788888888888888888877776555443222100./-.-----+++****))*(')(('&""#"#%#""
- at 30BB2AAXX080903:3:60:861:238#0
-AAGACTTCACCAGTCAAAGCGAACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTCCCGCTNN
-+
-677777888888888888888888777765554432221/0//.---,-,,,++*+**))((()((&&$$%"$"""
- at 30BB2AAXX080903:3:50:1121:1245#0
-CCTAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGCTTTGACTGGTCCGGACGC
-+
-6777778(88888888+88888887777655544322000///..---,,,++****))))(('((&"$#""##"#
- at 30BB2AAXX080903:3:59:1618:1321#0
-CCGAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGGAGTTCGCTTTGACTGGCAACAANCA
-+
-67777788888888888888888877776555443222100//..---,,+++**')))))((&'''$&%%$$"$%
- at 30BB2AAXX080903:3:2:973:254#0
-TGTTATCCCTAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGCTTTNGCTTACT
-+
-677777888888888888888888.7776555423212100/../.-,,,+++***)**)()((('''""$"#"""
- at 30BB2AAXX080903:3:47:450:464#0
-CAGTCAAAGCGAACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAACACCG
-+
-64777788888888888888888877776555443222100//.----,,++++***)))()(((''$%"%%#"#"
- at 30BB2AAXX080903:3:41:166:808#0
-TGCGCTGTTATCCCTAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGTTTTCAC
-+
-67777788888888888888888877776555443222100//..---,,,++***)**))((('(&%&#"#""#"
- at 30BB2AAXX080903:3:53:803:571#0
-TAGGATTGCGCTGTTATCCCTAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGCCGTGTGN
-+
-67777788888888888888888876776555442222100/.-.-,-,,+,+***()*)*((((('%"$%"$"$"
- at 30BB2AAXX080903:3:2:1457:108#0
-TCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAACAGCGCAATCCTATTCTAANAACACAC
-+
-67777788888888888888888877776545443221./0//...--,*++)*'***(&)()(&((""""#####
- at 30BB2AAXX080903:3:52:1089:1385#0
-TCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAACAGCGCAATCCTATTCTAGCGTCCTTT
-+
-67777788888888888888888877776555243220./0/...--,,,++)***)*)())(((('&"#$%$#""
- at 30BB2AAXX080903:3:55:1017:583#0
-ATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTAGGGTAACTTGTTCCGTTGGTCAAGGTGTTATG
-+
-6777778888888888888888887777651584322210/..-.--++,&*+***())(*')&'%'%#"$"#"""
- at 30BB2AAXX080903:3:37:512:1228#0
-CTTGACCAACGGAACAAGTTACCCTAGGGATAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGCATCAN
-+
-6777778888888888888888887777655544322210//...---,,,*+**)**))))(((('$%%#""$$"
- at 30BB2AAXX080903:3:50:1616:644#0
-GTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTAGGGTAACTTGTCACTGACAC
-+
-67777788888888888888888877776555443222100//...--,,+++**))))(()(((('$"#"""#"$
- at 30BB2AAXX080903:3:53:1024:982#0
-CCAACGGAACAAGTTACCCTAGGGATAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*))(('(&%$$&&%%#%
- at 30BB2AAXX080903:3:37:590:668#0
-CATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTAGGAGCCCGACACN
-+
-6777778882888888888888887777655544322010,/....,-,,+**+)*))'((((('''$""""$"#"
- at 30BB2AAXX080903:3:39:1418:375#0
-CATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTAGGGTATCTTGTGC
-+
-6777778888888888888888887777655544122210/./....,,,,+(**))())('((((#&"%%&%%""
- at 30BB2AAXX080903:3:34:1123:1566#0
-CAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTAGNTCCTGCNN
-+
-67777788888888888888888877776555443202200/...----,++****)**))(()(&'"$##$##""
- at 30BB2AAXX080903:3:57:1667:1221#0
-CCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTACACAAAAAA
-+
-67777788888888888888888877776555443222100//..---,,+++**+)))))()(('&&$%%%$%$$
- at 30BB2AAXX080903:3:51:744:998#0
-AGTTACCCTAGGGATAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGCTGTTGGT
-+
-67777788888888888888888877776555443222100//..---,,+++***())))(((((($"#$""$$"
- at 30BB2AAXX080903:3:50:464:1067#0
-CTAGGGATAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCAGATCGGACGACATCT
-+
-67777788888888888888888877776453443222110//..---,,+(++*))*))))((#'(""$""#"#"
- at 30BB2AAXX080903:3:43:734:239#0
-TAGGGATAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACA
-+
-67777788888888888888888877776555443222100/...---+-+++***)*))()((((''#&&&&$#"
- at 30BB2AAXX080903:3:56:203:1622#0
-CGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGGTGCTCT
-+
-67777788888888888888888877776555443222100//.----,,,,+**)))))())('('&&###""#"
- at 30BB2AAXX080903:3:1:461:50#0
-TAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGANCTNCCAT
-+
-677777888888128888,88888-1'763*145.02.21/.../.+,-+*+)****))(((('(''&"&$"###"
- at 30BB2AAXX080903:3:34:282:630#0
-TAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGANCAAAACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))))((''"&"#""#""
- at 30BB2AAXX080903:3:38:1093:539#0
-ATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCTCTTGT
-+
-67777788888888888888888877776555443222100//..--,,-+++****))()()((('""$"#"###
- at 30BB2AAXX080903:3:1:1484:677#0
-CATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATNACNCACT
-+
-6777778888888888888888887777655544321100///..----,+,++***)))()))((''""$"###"
- at 30BB2AAXX080903:3:47:1758:1554#0
-CATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTTCACCTC
-+
-6777778888888888888888887777655544322220///..---,,+++***)*))())((('"$"""#$##
- at 30BB2AAXX080903:3:44:1372:1826#0
-CAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCGGCAGAG
-+
-677777888888888888888878777765554432221.0//..--,+,+,+++*))))')(((''&$""$#$##
- at 30BB2AAXX080903:3:37:1546:275#0
-CCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGACTCGCGCN
-+
-677777888888888888888888777765454330221000.-.,--,,,+++****)))(((((#"#&%"#$$"
- at 30BB2AAXX080903:3:49:22:830#0
-CCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGACTCACCTG
-+
-677777888888888888888888977+6525443222100//...--,,+++**)))))))((('&"%"$"""#"
- at 30BB2AAXX080903:3:38:780:769#0
-TGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAAGCGTCACAC
-+
-6777778888888888888888887777655544332010///..+--,,+++***)*)*))()(&'"##"#"$##
- at 30BB2AAXX080903:3:1:416:1622#0
-ATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGNCCNCACA
-+
-27777788888888888888888877776555443222200//.-.--,,+++***)*))))()('''""""$#$"
- at 30BB2AAXX080903:3:38:71:31#0
-CGGCTGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGAAGATACGTCACNN
-+
-6777778888888888888888887617/5534-3222/00-..-*-,-+,*+)+*#*(((((((('$$"""#$""
- at 30BB2AAXX080903:3:37:712:571#0
-TTTAATAGCGGCTGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAGATCGGAAGAGCGGGTCACCACCTN
-+
-6777778888888888888888887777656534322201-///--),,+++*))**')*()(((%%$"#""###"
- at 30BB2AAXX080903:3:40:1552:1482#0
-CGAACCTTTAATAGCGGCTGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTCTTGTTGATTTAT
-+
-677777888888888888888888777765414415,202/0.---,--,,,#*+*)(*%()(#'((&$%#%$##"
- at 30BB2AAXX080903:3:2:1496:1839#0
-CATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCAGATCGGAANCACNCAT
-+
-6777778888888888/888785877774452242++000/+..,-,,,,*,*$)%))(&('&'&'#""$"#"$$#
- at 30BB2AAXX080903:3:52:685:1822#0
-TATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGCTCGCTTG
-+
-67777788888888888888888877776,55443222100//.-,-,-,,)+++*)))))()((''%#$""""""
- at 30BB2AAXX080903:3:41:478:926#0
-AAACGAACCTTTAATAGCGGCTGGACCATCGGGATGTCCTGATCCAACATCGAGAGATCGGAAGAGTGTGTTGTAT
-+
-6/717748-88888888288388&3.1&4+/54)-0/-.//*,+,,,),+&)+)'*'(#(('''#'#%""""""""
- at 30BB2AAXX080903:3:4:424:1499#0
-TCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGGCNTGCANTN
-+
-6777778888888888888888883777655542322000.0/..,,--+++**)))(('(((('&'%""$%""""
- at 30BB2AAXX080903:3:53:310:1120#0
-CAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCTATNGAG
-+
-67777788888888888888888877776555443221100./.-.--+,,++*+**)())'((((%"$#""""""
- at 30BB2AAXX080903:3:53:870:1424#0
-CAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTGTTGA
-+
-6777778888888888888888887777656544322211/1/.----,,+,+****))))')(((%$$"$$##"#
- at 30BB2AAXX080903:3:60:638:1460#0
-TGAACAAACGAACCTTTAATAGCGGCTGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTCTCNN
-+
-67777788888888888888888877776555443222000//..---,,+++++*)())(()((''$$&"$##""
- at 30BB2AAXX080903:3:45:658:1123#0
-GTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAAGCTCAGT
-+
-6777778888888888888888887777654542-22110,//.)-,-+,*+**'))))(()#((&&%%$#"#"""
- at 30BB2AAXX080903:3:52:1340:132#0
-GGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTTCACGCAT
-+
-67777788888888888888888877776555243222100///..,-,,++***+**#)'(&(('#$"$&$%""#
- at 30BB2AAXX080903:3:55:81:881#0
-TTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAAANGATCGGT
-+
-67777788888888888888888877776555343222100//...,-,-+++*'**))))(()(''"""#$"#"#
- at 30BB2AAXX080903:3:1:770:607#0
-TAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCGGGATGTCCTGATCCAACNCANACGC
-+
-6777778888888888888888887777655544322110///&,*,++(,++')*('&(((('#''&"%#"$$"$
- at 30BB2AAXX080903:3:8:1599:2002#0
-CGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTAGAACGGAAGAGCGGGTCAGACGNACCTGCNN
-+
-6777778888888888888888887777655541222010//.,,+,#+,*)+(#(#))#######'""###"$""
- at 30BB2AAXX080903:3:34:679:835#0
-ATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCGGGATGTCCTGNTCTCCGNN
-+
-67777788888888888888888877776555443222100//..-,-,-++()#*(*))()(''''"#%"$##""
- at 30BB2AAXX080903:3:4:896:1595#0
-TCAGATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCCTCGGGATGTCNACACNAN
-+
-67777788888888888188888877776/55443002/0.10.--,,+*+)*$%#(##(''(##&%$"$""#"#"
- at 30BB2AAXX080903:3:43:256:1351#0
-CTGAACTCAGATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCGAGGGACTCC
-+
-(477708.88288888348803887117/5153/.0/,,-0.-+)-,++++*+(*)#()#&#&'##%"$"""$"""
- at 30BB2AAXX080903:3:35:1101:967#0
-TCTGAACTCAGATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCNTCACCCCN
-+
-67777788888888888888888877776552443222100//.----,,+++***)**)((('(''""$"####"
- at 30BB2AAXX080903:3:8:1250:1954#0
-TCTGAACTCAGATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCNAGCACANN
-+
-67777788888888888888888877776555443222100//..--,+,+,+****)()(''((#'"""%#$#""
- at 30BB2AAXX080903:3:58:1110:929#0
-ATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAACGATTAAAGTCCTACGTGATCTGAGTTCCACCCAT
-+
-67777788888888888888888877776555443222100./..---,,,+++*))*)))(((('''$""%"###
- at 30BB2AAXX080903:3:37:1668:1278#0
-GGTGCAGCCGCTATTAACGGTTCGTTTGTTCAACGATTAAAGTCCTACGTGATCTGAGTTCAGACCGTCTGCACNN
-+
-67777788888888888)88888877776555443222100/./..-,,,+,++***)))))(((''""#"$%#""
- at 30BB2AAXX080903:3:57:287:1324#0
-TGGATTACTCCGGTCTGAACTCAGATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGNCGCACC
-+
-67777788888888888888888877776555443222100//..---,,+,+*****))))((((''&""##"##
- at 30BB2AAXX080903:3:33:434:184#0
-AGAAACCGACCTGGATTACTCCGGTCTGAACTCAGATCACGTAGGACTTTAATCGTTGAACAAACGANGACCTCNN
-+
-677777888888888888888888777745.5443022100%...-+,-,,++**()*))(((('''"#$$$##""
- at 30BB2AAXX080903:3:55:1029:1392#0
-ATAGAAACCGACCTGGATTACTCCGGTCTGAACTCAGATCACGTAGGACTTTAATCGTTAGATCGGACGCACGGCT
-+
-67777788888888888888888877776555443222100//..---,,+++**))*))))(('('$%%"#""##
- at 30BB2AAXX080903:3:59:1479:1667#0
-TAGATAGAAACCGACCTGGATTACTCCGGTCTGAACTCAGATCACGTAGGACTTTAATCGTTGAACACACACANAC
-+
-677777888888888*8882882,7677655544502210//..+---,,++++**))()))((('''&%%%$"$#
- at 30BB2AAXX080903:3:59:454:492#0
-TGTTCAACGATTAAAGTCCTACGTGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTAAGATCGGTCACAC
-+
-67777788888888888888888877776525443222100/..-----,,++***)))))((('('&$##%$$"#
- at 30BB2AAXX080903:3:53:933:288#0
-GAGGAATTTGAAGTAGATAGAAACCGACCTGGATTACTCCGGTCTGAACTCAGATCACGTAGGACTTTAATCGTTG
-+
-67777788888888888888888877776555443222100//..-,,,,++++**)*)))()((('$&$%&$#$%
- at 30BB2AAXX080903:3:37:163:1920#0
-TGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTCCCTGTACGAAATGTCACAN
-+
-67777788888888888888888877776555443022100//-'---,,,+++**)*)))((('('$$""$"$#"
- at 30BB2AAXX080903:3:58:207:352#0
-ATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTCCCTGTACGAAAGGACAANANA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$$%%&"#"$
- at 30BB2AAXX080903:3:48:1451:1618#0
-GTGAAGTAGGCCTTATTTCTCTTGTCCTTTCGTACAGGGAGGAATTTGAAGTAGATAGAAACCGACCTGAGTAACC
-+
-67777788888888888888888877776555443222100/...---,,+++***))))))()(''""#"#""##
- at 30BB2AAXX080903:3:1:1410:1550#0
-ATTTACGGGGGAAGGCGCTTTGTGAAGTAGGCCTTATTTCTCTTGTCCTTTCGTACAGGGAGGAATTTNTANCTGC
-+
-+777778888888888882381289673635543221110/./,/.,,+++++))**(*((()&('#&""#"""""
- at 30BB2AAXX080903:3:48:1213:1552#0
-TACTTCAAATTCCTCCCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGGTGTAGA
-+
-6777778888888888828)888877776555443222100*/---,-,+,++****))('(((&'%&#""%##"#
- at 30BB2AAXX080903:3:42:1590:464#0
-TTCCTCCCTGTACGAAAGGACAAGAGAAATAAGGACTACTTCACAAAGCGCCTTCCCCCGTAAATGCTCTCATCTC
-+
-67777(8888*88888888818887777655544'0320-0//..,--+,,+(+*))()('#'''&#%"%%"#$$$
- at 30BB2AAXX080903:3:2:94:268#0
-GAGATGATATCATTTACGGGGGAAGGCGCTTTGTGAAGTAGGCCTTATTTCTCTTGTCCTTTCAGATCNGACNNCA
-+
-67777788888888888888888877173545443.22.00/,(.---,-%,'+***(()))''(''$""#"""##
- at 30BB2AAXX080903:3:38:972:1508#0
-TCCTCCCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATAGATCGTCTCTA
-+
-67777788888888888888888877776555443222100//..---,-+++*****)()((((''"$#"####$
- at 30BB2AAXX080903:3:51:1606:2020#0
-GTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTACAAAAACCA
-+
-67777788888888888888888877776555343222120.,..,,+,,++++*+)))))'((''#"""$"%###
- at 30BB2AAXX080903:3:58:777:1192#0
-CGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCAAGATCGGACCGTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&$%$$#"""
- at 30BB2AAXX080903:3:54:1521:613#0
-GAAAGGACAAGAGAAATGAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTACACATAAC
-+
-67777788888888888388888877776555443221100//..---,,,++***)))))(()((''&%%$#"$"
- at 30BB2AAXX080903:3:8:1033:1341#0
-AGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATTATACNACAATCNN
-+
-67777788888888888888888877776555443222200//./-,,,,,,+***)))())(((('"&%"#"#""
- at 30BB2AAXX080903:3:2:544:457#0
-AAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATAGATCGGAAGACNTGGGCTC
-+
-67777788888888888888.838737765/122322110./.,-,-+,,+,+***)*))')(('(&$"""##%##
- at 30BB2AAXX080903:3:42:149:1754#0
-AGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATTATACCCACACCNACCCAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))()(('('"#$$%%$"#
- at 30BB2AAXX080903:3:37:503:990#0
-GCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATTATACCCACACCCATCCNACGCN
-+
-67777788888888888888888877776555443222100//..---,,-++***)*)))((((('"%&"$""$"
- at 30BB2AAXX080903:3:34:1770:648#0
-TTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATTATACCCACACCCACAGATCNACACAANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)**))(()(('""$"#"#""
- at 30BB2AAXX080903:3:55:204:146#0
-CAAACCCTGTTCTTGGGTGGGTGTGGGTATAATACTAAGTTGAGATGATATCATTTACGGGGGAAGGGACTCGTTC
-+
-67777788888888888888888877776555443210100//.---,--++++**)*)))((''('""%###"%#
- at 30BB2AAXX080903:3:4:1388:1436#0
-AAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATTATACCTACACCCACCCAAGAGATCCNTCCGNAN
-+
-677777888888888888888818/7776551)822011-.-.--.-,+,+**(*)))&')'((&&#""""$""#"
- at 30BB2AAXX080903:3:50:1395:1007#0
-CCGTAAATGATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGGTTGTTAAGATAGAGAGCCA
-+
-6777778888888888888888887777655544322210///-.,,-,-+*+***'())))(((''%"""""##"
- at 30BB2AAXX080903:3:42:652:559#0
-CGGGCTCTGCCATCTTAACAAACCCTGGTCTTGGGAGGGTGTGGGTATAATACTAAGTGGAGATAAGTCGGGTGCG
-+
-6777778-8888888888%88883477%65/544'2'21&0'//.,,--,*+*+*))$()'((#''''"%%$""#"
- at 30BB2AAXX080903:3:45:404:645#0
-TGATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTGTTAAGATGGCAGAGCCTGGTACG
-+
-677777888888888888888888777765554432221/0//..---,++++***)))**()('(''$"&&""""
- at 30BB2AAXX080903:3:40:964:108#0
-ATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTGTTAAGATGGCAGAGCCCGGNATACT
-+
-67777788888888888888888877776555443222100//..--(,,++++**)**))()('(#&$&""""$"
- at 30BB2AAXX080903:3:35:1281:998#0
-CGATTACCGGGCTCTGCCATCTTAACAAACCCTGTTCTTGGGTGGGTGTGGGTATAATACTAAGTTGNATCACCTN
-+
-6777778888888888/888888877776555443222100/...-,-,,++*+**)))()((('('"$"$####"
- at 30BB2AAXX080903:3:60:703:511#0
-CTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTGTTAAGATGGCAGAGCCCGGTAATCGCATACACCGGNN
-+
-67777788888888888888888877776555443022100//..---,,+,+***))'*)))((('&$%##""""
- at 30BB2AAXX080903:3:50:777:1316#0
-GACTGTAAAGTTTTAAGTTTTATGCGATTACCGGGCTCTGCCATCTTAACAAACCCTGTTCTTGGGTGTCTAACAC
-+
-677777888888888888888888777765554431/2100..,..--,-+***#*()))(()(((%%"#"""$##
- at 30BB2AAXX080903:3:37:1319:1549#0
-TGACTGTAAAGTTTTAAGTTTTATGCGATTACCGGGCTCTGCCATCTTAACAAACCCTGTTCTTGGGGCTNCAGCN
-+
-67777788888888888888888877776555443222100//..---,,+,****)*))))(('(&$#$""#"#"
- at 30BB2AAXX080903:3:4:1538:345#0
-GAAGAGGAATTGAACCTCTGACTGTAAAGTTTTAAGTTTTATGCGATTACCGGGCTCTGCCATCTTAANAAACNGN
-+
-677777888888888%8888888877976'55443222100//,..-+,+**++*))*)#'(('((%""""$%"""
- at 30BB2AAXX080903:3:44:219:1476#0
-GCCATGGGTATGTTGTTAAGAAGAGGAATTGAACCTCTGACTGTAAAGTTTTAAGTTTTATGCGATTACCGTGCTC
-+
-67777788888888888888888877776555443222100//...--,,+++***)))))()(''&%%%%$$##"
- at 30BB2AAXX080903:3:42:984:1688#0
-TAAAACTTTACAGTCAGAGGTTCAATTCCTCTTCTTAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTAC
-+
-67777788888888888888888877776555443222100//..-+---+++***')))))('((''$%%%&$#%
- at 30BB2AAXX080903:3:2:784:1803#0
-ATGGGTACAATGAGGAGTAGGAGGTTGGCCATGGGTATGTTGTTAAGAGGAGGAATTGAACCTCTGACNTATNCGC
-+
-67777788888888888888888827776525443,/1100/.-.--,',,++)*))*))'((((''"""#$"###
- at 30BB2AAXX080903:3:44:506:1880#0
-AGAGGTTCAATTCCTCTTCTTAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTACCCAAGATCGGGAGAC
-+
-67777788888888888888888877776555442221.00--./----,+,++*)**))'&(((('%""&#""$"
- at 30BB2AAXX080903:3:60:1123:1974#0
-AGAGGTTCAATTCCTCTTCTTAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCGTGCNCANN
-+
-6777778888888888888888887777655544322.000./.,---,,++++**))*)((((((&"%#&"#"""
- at 30BB2AAXX080903:3:34:18:679#0
-GAGGTTCAATTCCTCTTCTTAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTNGCTTGANN
-+
-64770788888888888888888877776555423222020/...---+,+++***)**)'()'(('"#$"""#""
- at 30BB2AAXX080903:3:41:568:1286#0
-GTTCAATTCCTCTTCTTAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCACTCGC
-+
-67777788888888888888888877776555443221100//..----,,*+****)*)(()((('&&$$##"""
- at 30BB2AAXX080903:3:33:1348:1046#0
-AATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCATGGGTATGTAGATCGGAANCTTCCCNN
-+
-67777788888888888888888/77766555443'221-0/...-,(+-,++&)))))))('((##"#""###""
- at 30BB2AAXX080903:3:46:1713:876#0
-ATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCATGGGTATGTTGTCAAGATATG
-+
-67777788888888888888888877776+55443222100//..---,,-+++**)))&))((((&%""%"""##
- at 30BB2AAXX080903:3:46:1613:947#0
-CATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCATGGGTATGGTANGCCCACGA
-+
-67777788888888888888888877776555443222100//-.---,++++*****))())(#('""##"#"""
- at 30BB2AAXX080903:3:59:709:1339#0
-TAAGCATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCAGATCGGAAGCAAGTCA
-+
-67777788888888888888888877776555443222100//..--,,,+++***)*)))))((('&$"##""##
- at 30BB2AAXX080903:3:34:1093:1103#0
-GTAAGCATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCATGAGATNTGTATANN
-+
-67777788888888888888888877776555443222100/...--,,,+++***))))((()(('""""#""""
- at 30BB2AAXX080903:3:42:887:1074#0
-TAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGCATTCCTAATGCTTAAG
-+
-6777778888888888888888887777655544222210.0//.-.--,++++*))*))()(((('&&&%$$##"
- at 30BB2AAXX080903:3:37:1088:1996#0
-GGTAAGCATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGGCATGGGGAGTTCTCTN
-+
-677777888888888888888888777765554432.20/0//..-,-+,+++**#)*)##'(((('""""%$#""
- at 30BB2AAXX080903:3:45:1150:636#0
-TTCGGTAAGCATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCATGGGGCGGTCA
-+
-67777/8888888888888888887777.5554432221/00/-----,,+*+***))())('('('%%"#"""#$
- at 30BB2AAXX080903:3:57:619:1785#0
-GCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGCATTCCTAATGCTTACCGAACGAAACATATGAT
-+
-67777788888888888888888877776555443222200//.-----,+,+***))))))(((('%"%&"#"""
- at 30BB2AAXX080903:3:46:1485:1914#0
-AACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGCATTCCTAATGCTTACAGATCGGAAGAGCGCGTGTC
-+
-677777888888888888888888777765554432221000/....-,,+)++***)))(((''''&###"""""
- at 30BB2AAXX080903:3:60:448:1673#0
-TAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCCATTGCGATTAGAATGGGGAGATCGGAAGATGCCACNN
-+
-6777778888888888888888*877376355423221000//..,-,,,++++**'))('#()#''"#%$#$$""
- at 30BB2AAXX080903:3:41:165:87#0
-ATAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCCATTGCGATTAGAATGGGTGCAATGAGGNGTCTGATG
-+
-677777888888888888-**88&767-63554432221&,$+/'-,*,,++**+**#'''''('('"&##"""""
- at 30BB2AAXX080903:3:49:735:1676#0
-TGCGTAGTTGTATATAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCCATTGCGATTAGAATGGCTCGTAC
-+
-67777788888888888888888877776555443222100//..---,,+,****)))))()((('$$#"""""#
- at 30BB2AAXX080903:3:56:113:583#0
-CGTTGGGGCCTTTGCGGAGTTGTATATAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCCATTGNGCACTG
-+
-67777788888888888888888877776555443222100//..---,,++++***)))()(((('"%"%"#""$
- at 30BB2AAXX080903:3:38:558:1587#0
-AACGTTGGGGCCTTTGCGTAGTTGTATATAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCACTTGCTTCT
-+
-67777788888888888888888877776553443221100//..--+,,+,+*))*))))'((('#&&"#"""##
- at 30BB2AAXX080903:3:54:370:1536#0
-AACGTTGGGGCCTTTGCGTAGTTGTATATAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCCATCGCGATT
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))*)))(('('&%"&&%##%
- at 30BB2AAXX080903:3:8:1493:1177#0
-AGGGGCCTACAACGTTGGGGCCTTTGCGTAGTTGTATATCGCCTAGAATTTTTCGTTCGGTAAGCATNCTCACANN
-+
-67771788888888888888+68877(763524422210#1-.-.-,,-,+++***%()((((('('"$"$#%$""
- at 30BB2AAXX080903:3:39:564:433#0
-TTCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAACGTTGTAGTCACCCACN
-+
-67777788888888888888888877776555443222100/..---,,,,+++*+)*)((#()'('"%#&$#%#"
- at 30BB2AAXX080903:3:34:1251:620#0
-TCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAACGACGGAGGNCATACANN
-+
-&477778888888&88888888887777655244322200/+..---,--+*****(*))##)#((&"%#"#$"""
- at 30BB2AAXX080903:3:42:1612:1081#0
-ATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAAGCCCCAACGCTGTAGGCCCCTACGATAGGC
-+
-677777888888888888888888777765554332201/0-...$-,)-,+*))#%'((%(&'&'#%$"#$##""
- at 30BB2AAXX080903:3:33:1128:1434#0
-GAAGGGTTGTAGTAGCCCGTAGGGGCCTACAACGTTGGGGCCTTTGCGTAGTTGTATATAGATCGGANCACACANN
-+
-677777..88888888888888887777655544%02200//0..---,++*+**+*)())))((('"$"&$#"""
- at 30BB2AAXX080903:3:52:578:221#0
-GAAGGGTTGTAGTAGCCCGTAGGGGCCTACAACGTTGGGGCCTTTGCGTAGTTGTATATAGCCTAGACTTTTTCGA
-+
-677777.8888888888888888877776555442222100//./---,,+++****)))))(((''%""%&$%$#
- at 30BB2AAXX080903:3:47:549:475#0
-AGCGAAGGGTTGTAGTAGCCCGTAGGGGCCTACAACGTTGGGGCCTTTGCGTAGTTGTATATAGCCTAGAAATGCG
-+
-67777788828888888888888877776555443222100//.----,-++****)**))))((''$$""""%#%
- at 30BB2AAXX080903:3:43:693:644#0
-GTCAGCGAAGGGTTGTAGTAGCCCGTAGAGGCCTACACCGTTGGGGCCTTTGCGTAGTTGTATATAGCCTAGAATT
-+
-677777888888/888888888887777$55544521-20,0/-.---,,*,+*))*))))(((('''$$#&$$$$
- at 30BB2AAXX080903:3:38:1419:622#0
-TTTATGGCGTCAGCGAAGGGTTGTAGTAGCCCGTAGGGGACCACAACGTTGGGGACTCTCCGTAGCTCGATACCAC
-+
-677777888888888888888.88770765554$32221%.%.-,.,-*(+*+*#))')&#(##(##%"#%"#"##
- at 30BB2AAXX080903:3:3:1259:245#0
-TTTATGGCGTCAGCGAAGGGTTGTAGTAGCCCGTAGGGGCCTACAACGTTGGGGCCTTTGCGTAGTTGNCTCANTN
-+
-67777788888880888888188877776/4)44322110)//-,.--+*,,++#%))))()''(&'""$%$#"#"
- at 30BB2AAXX080903:3:48:1528:602#0
-ACAACTACGCAAAGGCCCCAACGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCACAGATCCCACC
-+
-6777778888888888888888887777655544322210-//.----,,++****)())#((((#'"""#""###
- at 30BB2AAXX080903:3:2:1366:421#0
-CTACGCAAAGGCCCCAACGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCATAAGATCNTANCATA
-+
-6773778888888888828888887723655524321020/-)..,++,+)*%'*)#&)%(&('''#%"##"##"#
- at 30BB2AAXX080903:3:36:1730:568#0
-CTTTGGTGAAGAGTTTTATGGCGTCAGCGAAGGGGTGTAGTAGCCCGTAGGGGCCTACAACGTTGGGNCCTCAGNN
-+
-6777778888888888888888887777655544*02110.//,.--',,,**+*')))(()&('('""%#$#"""
- at 30BB2AAXX080903:3:52:577:151#0
-ACTCTTCACCAAAGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTCAGCTCTC
-+
-6777778888888888(888888877776555453220+00/.,'-,,,-+,+)*))))))((('('"##&""#"$
- at 30BB2AAXX080903:3:39:1508:1332#0
-TCTTCACCAAAGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTCGCCACCAC
-+
-6777778888888888838888887747655544322/1/00/..--,+,*++**))))(((&((#'$$$$#"$#"
- at 30BB2AAXX080903:3:1:1179:1058#0
-ACCAAAGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTCAGCTCCNCANCACA
-+
-67777788888888888888888877756555023222)00.///-,-,-+++*'***)))#)('''$"%$"$%$$
- at 30BB2AAXX080903:3:35:1613:379#0
-ACCAAAGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCNACTAGANN
-+
-67777788888888888888888877776555443222000/...---,,+,+****())'('((''""%"#"#""
- at 30BB2AAXX080903:3:36:1166:1272#0
-AAAGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCATCGTCNCAN
-+
-67777788888888888888888877776555443222100//..---,-,++*+***)))))(''%$'%&&""#"
- at 30BB2AAXX080903:3:44:1193:105#0
-GCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCCTCGCTCCTCTC
-+
-/7777783888888888888888877776555342222000//.----+,,+')())()%)(('&#'&$"%##$$#
- at 30BB2AAXX080903:3:52:113:1129#0
-TAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGCGGGGGTGTAGAGGGGGGTGGGAGATGGGGGGGGGATCTGGGGG
-+
-67777788888888888888888877776555443*2%+0,*.+.--,,*$,+)%*&#)#()#((('"$$""##""
- at 30BB2AAXX080903:3:49:1358:331#0
-GTAGACGAGCGACGGTGAGAGCTAAGGTCGGGGCGGGGGTGGAGAGGGGGATGGTAGATGTGGCGGGCNCTGCTCG
-+
-677770888888888888888888777765554232-2(.0%..%---,,)&++&)&(%(#)(#(('$"#""""#"
- at 30BB2AAXX080903:3:39:367:758#0
-CCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCAGATCCGCACAGAG
-+
-67777788888888888888888877776555443222100//..--,-,,+****)))))(()(''$""%"""#"
- at 30BB2AAXX080903:3:39:859:1204#0
-CCTAAAACCCGCCACATCTACCATCACCCCCTACATCACCGCCCCGACCTTAGATCGGAAGATCGGTCNTGCAGTC
-+
-677777888888888888888883.7776%4.1131',0.&/../++++++)'()&(()'(##&(&'$"#%#"""#
- at 30BB2AAXX080903:3:58:36:1038#0
-CTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTAGACNNA
-+
-67777788888888888888888877776555443222100//...--,+++**+)*))))'(((''&&"""$""#
- at 30BB2AAXX080903:3:1:465:1262#0
-ATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGCGGGGGGGGTGAGGGGGGGGGGGGGTGGGGGGNCANCGCA
-+
-677777888888888888/888.8576;65'24432+21#/#&('$-#,,,*+)%)*'#('#(#&'%""##"#"##
- at 30BB2AAXX080903:3:37:701:1565#0
-GCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGTACACACN
-+
-6777778888888888888888887777655544320212/1.-..--,,+++**)**))))(((('""#%"#"#"
- at 30BB2AAXX080903:3:48:482:795#0
-CACATCTACCATCACCCTCTACATCACCGCCCCGACCTAAGATCTCACCGTCGCTCAGACCGGAAGGACGGACTGC
-+
-6777778888888888888588887/776/5541-02'%&/$/-,-,*-,)+**'(%'(##'(#'(#""#""$"""
- at 30BB2AAXX080903:3:1:513:1712#0
-ACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGAACNCCNCGCC
-+
-27777788888888888888888877776555443222.00//..,-,-++++++)*))()((((&'&"&""%"$$
- at 30BB2AAXX080903:3:45:1230:805#0
-GGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGCGGGGGTGGAGGGGGGGGTGGGGCACTG
-+
-677777888888888888888888774765454432220/0///.---+,+*+*'*'#)(')((''#%"#"###""
- at 30BB2AAXX080903:3:3:287:126#0
-ATCTACCATCACCCTCTACATCACCGCCCCGACCTTATCTCTCACCGTCGCTCTTCTACTAGATCGGANCTGCNCN
-+
-67777*08808//0.-830)0+/,+2%0)00+/)-,,#.0)-,.,+)')&***('(('%(''#'#&#""%#"$"""
- at 30BB2AAXX080903:3:50:841:182#0
-ATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGAACCGCGTCACCT
-+
-67777788888888888888888877776555443222100//..--,,,+,+++***))(()((('"#$""##$"
- at 30BB2AAXX080903:3:54:122:1321#0
-ACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGAACCCCCCGCGCCCCCN
-+
-67777788888888888888888877776555243222100//..----,++***)(*())((((''"%#&""#""
- at 30BB2AAXX080903:3:53:1326:1351#0
-GGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGCGGGGGGGGTAGCACGCATCG
-+
-677777888888888888888888777765564432221/0//,.-,,,++++**#)*((&&'###'%"$$$""$#
- at 30BB2AAXX080903:3:42:1762:1147#0
-CATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGCCGCTCTTCTAAGATCGGAAGAGCGGGCTAGCTAT
-+
-67777788888888888888,8887086/.052/311.10/#.-.+,,+)*)#)'%#(##&'&'#%'"""""""""
- at 30BB2AAXX080903:3:45:1026:551#0
-GGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGGCGGGGCGGGGGGGGATACATTTGGG
-+
-677777888888888888888888/7776555443122100/..-.--,,)++*****)%)''('#&$$######"
- at 30BB2AAXX080903:3:46:1614:1715#0
-GGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTGAGGTCGGGAGATCGGGTCACTCCG
-+
-6777778888888883888888887777655544332.100//,..--,,,&++*)(*))')((#''"#%#$"##"
- at 30BB2AAXX080903:3:48:683:2015#0
-TCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGAACCCCCCTCCCCATAAGACCGGCACG
-+
-67777788888888888888888877776552423212200//-,---,+,+**)*()((&((((''$$##"%"#"
- at 30BB2AAXX080903:3:48:1333:1106#0
-CCAGGGGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGCGGTGGATCA
-+
-6777778888888888888888887777655544322010//....--*,,+****)*))('((('&%""""""#"
- at 30BB2AAXX080903:3:33:804:301#0
-ACCAGGGGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGNTAGTGCNN
-+
-67777788848888888888888877775555443232100//..-,-,++*+*+*)))))%(((('""""""#""
- at 30BB2AAXX080903:3:37:1288:903#0
-GGTTGACCAGGGGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGCGCGN
-+
-6777778888888888888888887747655543322210///.,----,,,+*)**)))''((((#$%#%#$$""
- at 30BB2AAXX080903:3:39:903:469#0
-TGAGGTTGACCAGGGGGTTGGGTATGGGGAGGGGGGGTCATAGTAGAAGAGCGACGGCGAGAGCTAAAGCGGTGCT
-+
-67777088888888888888880877776755443212110//(--,,-,+++*&**#)#)'(&(&%"$""$""#"
- at 30BB2AAXX080903:3:39:1339:1313#0
-CCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCTCGC
-+
-67777788888888888888888877776555443222000//..--,,,+*+***)*))(()'&'&&#"%%#$"#
- at 30BB2AAXX080903:3:52:27:2008#0
-CCTAGGTTGAGGTTGACCAGGGGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACAGATGCGTGCGTTG
-+
-67777788888888888888888877776555443222100//(-',-+,,++*****#*)'()'%#$""#"""""
- at 30BB2AAXX080903:3:46:129:27#0
-ATAGGAGGCCTAGGTTGAGGTTGACCAGGGGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGTTTACATC
-+
-67777788888888888888888877776555143222100//.----,,+'*****))())((('('$#"##""#
- at 30BB2AAXX080903:3:55:535:612#0
-TCACCGTCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCTCAACAGATCTGCCGCCCC
-+
-67777788888888888888888877776555443222100./..---,,++++**))))))(((''"$""""##"
- at 30BB2AAXX080903:3:47:525:1205#0
-TTCTACTATGAACCACCCTCCCCATACCCAACCCCCTGGTCAACCTCAACCTAGGCCTCCTATTTATGTCTCTCCT
-+
-677777888888282888888888771762/543+3.20*//,.,.--+++++*')())'(((('''""#""###"
- at 30BB2AAXX080903:3:33:148:299#0
-TCCCCATACCCAACCCCCTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTNCTCGGCNN
-+
-67777788888888888888888877776655443222100//..---,,+++***))*))((((('"%$#"""""
- at 30BB2AAXX080903:3:43:1189:1051#0
-CCCATACCCAACCCCCTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGCCTCGT
-+
-67777788888888888888888877776555443222100//..---,,,++****))))())((&'"%#"%#$"
- at 30BB2AAXX080903:3:35:206:1137#0
-CCATACCCAACCCCCTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCNGTCCTCAN
-+
-67777788888888888888888877776555443221100/...---,,+*++**))))))((('&"""#%#$#"
- at 30BB2AAXX080903:3:35:1621:1669#0
-TGAGTAAACGGCTAGGCTAGAGGTGGCTAGAATAAATAGGAGGCCTAGGTTGAGGTTGACCAGGGGGNGCACACGN
-+
-67777788888888888888888%77'76555413212000//,,++--$-+%**#**)#'(((((&""$&%##""
- at 30BB2AAXX080903:3:42:1269:771#0
-TGAGTAAACGGCTAGGCTAGAGGTGGCTAGAATAAATAGGAGGCCTAGGTTGAGGTTGACAGATCGGAGGAGCTCA
-+
-67777788888888888888888877776555443212101//..-,-,+&+*+*&))()(((''('&"&""""#"
- at 30BB2AAXX080903:3:58:1378:328#0
-CCCAACCCCCTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGACACCTCTAGCCTAGCCGTTTACCCAACNC
-+
-67777788888888888888888877776555443222100//..-,-,,+++***)))))))(((&'"$&"$%"$
- at 30BB2AAXX080903:3:2:1525:352#0
-CCTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATACNATTATCA
-+
-67777788888888888888888877776555443222200/..-----,++++****))((((('#'""$"#"#"
- at 30BB2AAXX080903:3:33:16:1955#0
-CTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCNGACTACNN
-+
-67777788888888888888888877776555443022100//..--,,,++++**))))))(''('"""$"##""
- at 30BB2AAXX080903:3:38:1020:1800#0
-TAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCCGCGCT
-+
-67777784888888888888888877776555441220100//..--,,,+++*****))(((((((&'"$"#"#"
- at 30BB2AAXX080903:3:35:989:1544#0
-TGAGTTTGATGCTCACCCTGATCAGAGGATTGAGTAAACGGCTAGGCTAGAGGGGGGTAGGAAAAAANCGCTTCCN
-+
-67777788888888888888887877774.55443222&00-.---"('-*++'**(###%(%'('%"%"$""$#"
- at 30BB2AAXX080903:3:35:1387:1147#0
-GGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGATTGAGTAAACGGCTAGGCTAGAGGTGGCTNGTGTCCTN
-+
-67777788888888888888888877776455443221200//..--+,,+,+**#)(*())#((##""#"#%#""
- at 30BB2AAXX080903:3:46:1466:853#0
-CAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGATTGAGTAAACGGCTAGGCTAGAGGTGGGTCCGACG
-+
-67777788888888888888888877776555443222100//..---,,++++***)))(((((#'""$"""###
- at 30BB2AAXX080903:3:35:1334:961#0
-TCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACNTCTCACAN
-+
-67777788888888888888888877776555443222100//..-,-,,,,+**)***))))((((""%"%$$$"
- at 30BB2AAXX080903:3:35:1246:1254#0
-GATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGATTGAGGAAACGGCTAGGGTAGAGNTCACGACN
-+
-67771788888888888882888877776/55433021100//..---,(+,+*+*())()%''(&("&$"""#""
- at 30BB2AAXX080903:3:40:1269:66#0
-AGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGAC
-+
-67777788888888888888888877776555443222100//,..--,,+++***)*))))((((%'&&&%$##"
- at 30BB2AAXX080903:3:60:1158:624#0
-GCCGATCAGGGCGTAGTTTGAGGTTGATGCTCACCCTGAGCAGAGGATTGAGTAAACGGCTAGGCTACGGACATNN
-+
-677707888888888888888888777765514432221-0//..-+(,,++***)))))('(((%%&$&#$##""
- at 30BB2AAXX080903:3:51:1139:37#0
-GCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTAAAACTACGACCTGACGCGAC
-+
-6777778888888%888888&883677765558/3+22000//.--,,+,+++*&'&**)&(((''%%$$$"#""$
- at 30BB2AAXX080903:3:46:244:1146#0
-CACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGCNCNACGCA
-+
-67777788888888888888888877776555443222111/..-.-,,-++++****)(())((('""$"#""#"
- at 30BB2AAXX080903:3:47:1351:859#0
-CACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCCGTTGC
-+
-6777778888888888888888887777655544322210///..---,,+++**))*)))()('('%"#$#"""#
- at 30BB2AAXX080903:3:55:1138:827#0
-CACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCAGACCGTCAGCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()('''$&#"$""$#
- at 30BB2AAXX080903:3:38:518:1814#0
-GTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGATTGAGTAAACGGCTAGATATCCACC
-+
-67777788888888888888888877776555443111100/..---,,,,,++***)))%))((('$""""$###
- at 30BB2AAXX080903:3:36:807:1447#0
-CGCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCTCTCATCCN
-+
-27777788888/88%888888888477;555-443222100*/.)---,,,,+*****))'(()(%'$""""$##"
- at 30BB2AAXX080903:3:45:740:1376#0
-CTCGCAGTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGAGTGAGTAAACGTCGCTCCC
-+
-677777888888888888888885774765553432211//..-,.,-,+*)+)*)*'*)()(('(&'"#"#"#""
- at 30BB2AAXX080903:3:58:504:906#0
-GCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACAGTCTNC
-+
-67777788888888888888888877776555443222100//..---,,+++**+)*)))))(('''&"%#%#"%
- at 30BB2AAXX080903:3:48:1645:1176#0
-CGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCCGGCAGA
-+
-67777788888888888888888877776.55443222100//..---,,++++)*&))))((((''%$##"$"""
- at 30BB2AAXX080903:3:42:712:768#0
-GTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGAGATCGGAAGAGCGGGTCCCT
-+
-67777788888888888888888897776555443222100//..-.-,-+++***)*)*)(((((''&"""""#"
- at 30BB2AAXX080903:3:54:983:949#0
-GTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGCAGCCA
-+
-67777788888888888888888807776555443222100//..--,-,+++*+)))))*)()'('$$##""##"
- at 30BB2AAXX080903:3:35:998:187#0
-TGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGANCACTCGNN
-+
-6777778888888888888888887777655544322210//...-.-,,+++*****))))(((('"$"$%$"""
- at 30BB2AAXX080903:3:51:1409:130#0
-TTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTACGCCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&$"##"#%$$
- at 30BB2AAXX080903:3:34:1052:353#0
-TTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGNCACCACNN
-+
-6777778888888888888888887777455544(22-.00//-,---,-,,**)))')(()(((''"$"%#"#""
- at 30BB2AAXX080903:3:50:400:131#0
-ATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGACCAGATCGGTA
-+
-6777778888888888888888887777652544322210,/...-.-,,,+*+**)*))()(((%'&$"##"""#
- at 30BB2AAXX080903:3:58:276:1628#0
-AATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGATCGTGTACNN
-+
-6777778588888888888888887777655541322210///-.---,,++++*)))))')((('&%%%#"##""
- at 30BB2AAXX080903:3:54:851:860#0
-TGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGACTCGACT
-+
-67777788888888888888888877776555443222100//..---,,,+++****)))()((''""#"%$##$
- at 30BB2AAXX080903:3:52:74:167#0
-GATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTTCTATGA
-+
-6/777788888888888888888677766555443522100//..---,+++*+***(()(''((%'%"""$%$##
- at 30BB2AAXX080903:3:3:584:1249#0
-GGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATCNCTCTNCA
-+
-67777788888888888888888877776555443222100//.---+,,,++**+()))(((((('%"%#$$""#
- at 30BB2AAXX080903:3:4:1598:1342#0
-GGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATNCACANTN
-+
-67777788888888888888888877776555443222100//-..--),++++*))*)))((((''"""%%#"""
- at 30BB2AAXX080903:3:41:1633:1661#0
-GTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATCNAACACCA
-+
-67777788888888888888888877776565443222100/..,--,,,++++)*))*)')()(&&$"&#%%###
- at 30BB2AAXX080903:3:50:826:732#0
-TGAGCATCAAACTAAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATGCAGTGCCCA
-+
-67777788882088888488788%4,774355443220100//..,)-,++,+*+)*)('(((('''$""""###"
- at 30BB2AAXX080903:3:2:113:1930#0
-AGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTAGATCNGAANNCC
-+
-67777788888888888888888877776555443222100//-...-,,,+++*)))())()((''%"##$"""#
- at 30BB2AAXX080903:3:38:1243:686#0
-AGCATCAAACTCAAACTACGCCCTGATCGGCGCATTGCGAGCAGTAGCCCAAACAATCTCATATGAAGTCACCCTA
-+
-6777778888888888888888887777655544%2221/0//..--,,-*+)**)))&))()((('$%%#"##"$
- at 30BB2AAXX080903:3:33:931:339#0
-CATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATGAAGCNGAAGTANN
-+
-67777788888888888888888877773555443222100/....--,,+,++)))))()(((((#"$""#""""
- at 30BB2AAXX080903:3:8:933:903#0
-GCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTGNTGATCANN
-+
-67777788888888888888848877776551443522100/..,---+,+'*+**)*)))((('(&""""#$$""
- at 30BB2AAXX080903:3:45:774:1556#0
-ATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCCGGGCGGAGGTTGGGGGTG
-+
-67777788881888888888888877776553442-2-.0+/-.,.,),+,)++'&&'())'(%%'%$"###""##
- at 30BB2AAXX080903:3:45:1579:1487#0
-GATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGGAGCGTCTCGGC
-+
-67777788888388888888888877776552443202100/.#.+,-',++**+)))())(&(#''"""""$##"
- at 30BB2AAXX080903:3:8:493:653#0
-TGATGGCTAGGGAGACTTCATATGAGATTGTTTGGGTGACGGCTAGCAGTGCGCCGATCAGGGCGTANGTGCACNN
-+
-67/77788/88888.888888828777&65400432#'00#/.-%-,,,++$++*)'))()(('(##"$%"#"#""
- at 30BB2AAXX080903:3:40:1759:1633#0
-TCAAACTACGCCCTGATCGGCGCACTGCGAGCAGAAGCCCAAACAATCTCATATGAAGTCACCCTAGCCCTCATCC
-+
-6777778888888888888888887777655544%22/100./-,,,,+,++******)()(((&''&$#"&#$##
- at 30BB2AAXX080903:3:51:260:64#0
-TCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATAAGATCGGAAGAGCGACTCACAGC
-+
-6777778888888888888888887777605544122210//....--,,,++**)))*)(((''('$$"$"#""#
- at 30BB2AAXX080903:3:44:617:788#0
-AGAATGATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAAGATCGGCAGAT
-+
-677777888888888888888888777765554430/010///.----,,,+****)*))('(('('"$%"#"""#
- at 30BB2AAXX080903:3:46:1778:1895#0
-AGTAGAATGATGGCTAGGGCGACTTCATATGAGATTGTTTGGGCTACTGCTAGCAGTGCGCCGATCAGGGCGGACG
-+
-6777778888888888888&808877276555403220100//-.-.-,-,%++*+))(*(')(&('&%"""""$#
- at 30BB2AAXX080903:3:46:1138:1080#0
-TACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATGAAGTCACCCTAGCCATCACGATAGGGC
-+
-67777788888888888888888877776555443222100//..---,,+++***(*)))((('(&$""""$#""
- at 30BB2AAXX080903:3:54:1693:1483#0
-GATAGTAGAATGATGGCTAGGGGGACTTCATATGAGATTGTTTTGGGTAGTGTTTGCAGTGGGCGGCACCACAAAA
-+
-677777888888888888888888+'07$(5144'2021001/..-(-+$++)'()'&)()'(#'&&$""%%#%$$
- at 30BB2AAXX080903:3:57:1304:99#0
-GATAGTAGAATGATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCGCATACA
-+
-67777788888888888888888877776555443222100//..---,-+++****))())(((('&&%$$#$##
- at 30BB2AAXX080903:3:57:436:1523#0
-GCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATGAAGTCACCCTAGCCATCAGATCGACAACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(''$""""$"$
- at 30BB2AAXX080903:3:60:1189:842#0
-GCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTGCTNN
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))()((('&&&""#"""
- at 30BB2AAXX080903:3:3:197:106#0
-TGTTGATAGTAGAATGATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCNCTCTNCN
-+
-67777788888888888888,88877075+55.4322200///,.--,+,$++)*)'*')#((((%'%"$"$$"""
- at 30BB2AAXX080903:3:43:1473:1994#0
-TTAGTAATGTTGATAGTAGAATGATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGGCGTAC
-+
-677777888888888888888888777765554-32+2101//.-----,+,+**)*()*()('(&'&"%""""""
- at 30BB2AAXX080903:3:55:1000:594#0
-AAGGAGCCACTTATTAGTAATGTTGATAGTAGAATGATGGCTAGGGGGACTTCATATGAGATTGTTTAGTCTGCCT
-+
-6777778,88888888888888887777655544322210/....-&,++++'***)(*))(((&('$&&%####"
- at 30BB2AAXX080903:3:39:581:875#0
-CAAACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGGAGATCCGAGNNACA
-+
-67777788888888888888888877776555443212100//./---,,++++*****())((('#%%$$"""#$
- at 30BB2AAXX080903:3:60:755:728#0
-TCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGGAGATCGGAAGAGCCGAGCANN
-+
-67777788888888888888888877776555343222100//.----,-+,+**+))))))'(((&%$$#"##""
- at 30BB2AAXX080903:3:46:812:103#0
-AGGGTGGAGAGGTTAAAGGAGCCACTTATTAGTAATGTTGATAGTAGAATGGTGGCTAGGGGGACTTATCATGCAC
-+
-67771788888888888888888877776555433220100/..'.-,,,,&++**)()')#(('''$$#&%##"$
- at 30BB2AAXX080903:3:56:346:816#0
-CATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGGCTCCTTTAACCTCTCNANGCCGAG
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))())'('"$"$#""""
- at 30BB2AAXX080903:3:58:1400:783#0
-TGTTGTGATAAGGGTGGAGAGGTTAAAGGAGCCACTTATTAGTAATGTTGATAGTAGAATGATGGCTATGTGCACA
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))(((''''$%$"#$$$
- at 30BB2AAXX080903:3:51:1292:1678#0
-GGTGTTCTTGTGTTGTGATAAGGGTGGAGAGGTTAAAGGAGCCACTTATTAGAGATCGGAAGAGCGGGCTACACGG
-+
-67777788888888888883888877776555141122100',-/.--,,+++***)))(()'(#(%&$#"$"#""
- at 30BB2AAXX080903:3:37:893:2005#0
-ACATTACTAATAAGTGGCTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTCCGCN
-+
-67777788888888888888888877776555443222100//...,-,,+++****()()()(((%$$#"#""$"
- at 30BB2AAXX080903:3:41:757:1851#0
-GGTCATGATGGCAGGAGTAATCAGAGGTGTTCTTGTGTTGTGATAAGGGTGGAGAGATCGGAAGAGGCGTCGTCTG
-+
-6777778888888888888888887777655644322210///.----,,+++***))'))((('(&"#"#""#""
- at 30BB2AAXX080903:3:36:1663:1725#0
-AGTGGCTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTAGATCGGAAGAGCGACACACCNN
-+
-677777888188888888838888777765/124321/101/,,,.--+,,++++*)(*)()(((&%$%#%$##""
- at 30BB2AAXX080903:3:59:875:111#0
-CCAAGGGTCATGATGGCAGGAGTAATCAGAGGTGTTCTTGTGTTGTGATAAGGGTGGAGATCGGAAGAGNTCGNNC
-+
-67777784888888888888885877706/55141220100/...,-,,,,++*'*))*)('(((&("'"&#"""#
- at 30BB2AAXX080903:3:45:766:806#0
-CTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTCTGACGTC
-+
-677777888888818888888888777765554432211/0//..---,,+++******))((((''$""%"##""
- at 30BB2AAXX080903:3:46:1738:718#0
-TAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAACAGGC
-+
-67777788888888888888888-77776555443222100//...--,-++*+**))&))((((('%"""##"#"
- at 30BB2AAXX080903:3:36:1402:1172#0
-ATCATATTATGGCCAAGGGTCATGATGGCAGGAGTAATCAGAGGTGTTCTTGTGTTGTGATAAGGGACTTCCAANN
-+
-67777788888888888888888877776555443222100//.----,,+++***)*))))(('(#""####"""
- at 30BB2AAXX080903:3:2:1332:266#0
-CAACACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACANCACTTAC
-+
-6777778888888888888888887777655544322200.0./.,---,+++***)**))((((''&"%&%%#$$
- at 30BB2AAXX080903:3:58:1140:1308#0
-CAACACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTCAACAC
-+
-67777788888888888888888877776555443222100//..---,,+++**+))))))()('''&&"#"$$$
- at 30BB2AAXX080903:3:57:1582:1227#0
-AACACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACAGCACGCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&$"$#$"#$
- at 30BB2AAXX080903:3:40:411:219#0
-TCTCTGCTAGTGTGGAGATAAATCATATTATGGCCAAGGGACATGATGGCAGGAGGAATCAGATCGGCAGCAACTC
-+
-6777778888888888888888887777655544502210,/...,-,,++++**&**)(()((#('""##""$##
- at 30BB2AAXX080903:3:57:176:179#0
-CACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTCGCGCTGCT
-+
-677407888888888888888888/7776/521422220/./..-,,+,,,++))*))((()'(((&"&"#$#""#
- at 30BB2AAXX080903:3:33:1434:1349#0
-ACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTANCACCACNN
-+
-67777788888888888888888877776+5544321-*000..),-,,,,+**+**))((((('''"%"%###""
- at 30BB2AAXX080903:3:49:336:2003#0
-AGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGTGCGTCAC
-+
-677777888888888888888888777765554232210/0//..----,+++***))))*(()('&%""#""##"
- at 30BB2AAXX080903:3:57:290:487#0
-TTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCAAGGGTCATGATGGCAGGAGTAATCGTACACT
-+
-677777888888888888888.8877476555443222100//..---,,+,+***)))()((('('"$$"#""##
- at 30BB2AAXX080903:3:56:183:1089#0
-CCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCTATCCGTAT
-+
-6.777788888888888888888877776555443202100/...,--,,++*+*+*()('((''%'"%$#$#"#"
- at 30BB2AAXX080903:3:43:951:339#0
-TCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGTACCCC
-+
-67777788888888888888888873776555443222100//..---,,+++++*)*))())(((''&&$&%#$%
- at 30BB2AAXX080903:3:1:550:1202#0
-TGATTACTCCTGCCATCATGACCTTTGGCCATAATATGATTTATCTCCACACTAGCAAGATCGGAAGANTTNCTCA
-+
-67777788888888888888888877776555443222100//..---,,,++++**))()((((''%""""#"##
- at 30BB2AAXX080903:3:54:543:1397#0
-AGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCAAGGGTCATGATGGCAGTATCACACA
-+
-67777788888888888888888877776555443222100//..---,,+,+*****))))((((&""##"""#"
- at 30BB2AAXX080903:3:3:639:1901#0
-TTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACNCTCNNCG
-+
-67777788888888888888888877716/458431221///...---,,+++++)))())(((('''"%"%""$$
- at 30BB2AAXX080903:3:55:1379:247#0
-TACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCGTCTAGA
-+
-67777788888888888888888877776555443222100//...,*,,+++***)**))())'''$&"%"#$##
- at 30BB2AAXX080903:3:2:580:1613#0
-CCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCATNCGATCAC
-+
-677777888888888888888888777795.5432%1111//.--.,+-+++***)'(((((&#((%$""&""$#"
- at 30BB2AAXX080903:3:52:312:609#0
-GCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTTCGACCTTGCC
-+
-67777788888888888888888877776550443222100/0..--,,,,+++**)))))))('('""#%%$$#%
- at 30BB2AAXX080903:3:51:1576:590#0
-ATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTTCGACACATCACAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''%"$"#""#"
- at 30BB2AAXX080903:3:33:1090:1081#0
-CTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCAANGACAGCNN
-+
-67777788888888888888888877776555443222101//..---,,,++***)))))((((('""$$""#""
- at 30BB2AAXX080903:3:40:1107:597#0
-CCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCACGTGTGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))(((((($&$$&""#"
- at 30BB2AAXX080903:3:48:355:1061#0
-CCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCAAGGGCGTCG
-+
-67777788888888888888888877776555443222100///.---,,,,****)*)))))((''"$"""""#"
- at 30BB2AAXX080903:3:47:1382:373#0
-CCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCCTGGTGCG
-+
-6777778888.888%88/88888808776$55420211111-.-.+-,,-,++**)'))(((((('&$"#$&%"##
- at 30BB2AAXX080903:3:47:299:1095#0
-ACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTTCGACAGATCGCAACATACN
-+
-67777788888888888888888877776555443222100//...,-+,,++*****))))(((('$""##"##"
- at 30BB2AAXX080903:3:33:284:815#0
-CTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAANTGCTCTNN
-+
-67777788888888888888888877776555443212100//..---,,+++***))))(((((('"%"&"$"""
- at 30BB2AAXX080903:3:52:302:1822#0
-TGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAAGATCGGAAGCGCGTAC
-+
-67777788888888888888888877776555443122100'/..---,,+++****)*())(((('""$"#"""#
- at 30BB2AAXX080903:3:45:1717:41#0
-CTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGGTGGTCTCTGCTAGTGTGGAGAGAACTCT
-+
-6777778888888888888888887777+555,433/2100/#...-#+,,'*))'))('(#(%((&$""""%"#"
- at 30BB2AAXX080903:3:1:360:790#0
-GTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTANACNCTCG
-+
-6777778888888888888888807777655544321210.*/,,---,,)++**)**)('('((''%""$"###"
- at 30BB2AAXX080903:3:34:672:452#0
-TCCACACTAGCAGAGACCAACCGAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGNACAGATNN
-+
-67777788888888888888888877776555443222100//-.---,,+++**()*)))'((((&"#&#""#""
- at 30BB2AAXX080903:3:34:569:1444#0
-TTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCNCGCACANN
-+
-67777788888888888888888877776555443222000/...-,-,&+++***%)'))((((%%"$#$###""
- at 30BB2AAXX080903:3:56:1060:539#0
-TTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCGCGTCCACT
-+
-67777788883888888888/88876276362343201110/--..,-,,+,+***')()(((((''$$"#"$##"
- at 30BB2AAXX080903:3:40:961:755#0
-ATTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCGAG
-+
-67777788888888888888888877776555443222100//.-----,+++***)&))))((((''%&$&$%""
- at 30BB2AAXX080903:3:43:266:2030#0
-ATTCGATGTTGAAGCCTGGGACTAGTTCGGCCTCCCCTTTGGCAAGGTTGAAGGGGGTTGGGGTGTTCTCTCTTCT
-+
-67307/-8./3828)+3&&&%'3$7#$$0$$(.&'%'+%#1$&(%,"&$+($%&#&#&%#'&#%%#%$"#"#""#"
- at 30BB2AAXX080903:3:55:86:651#0
-CAGAGACCAACCGAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATAGGTGACTG
-+
-677777888888888888888888.77+15554(/2121(0*/..(-,+,+**))))*'#('''''#"$""""$""
- at 30BB2AAXX080903:3:49:933:647#0
-GGCGTATTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGGTCGGGTGGTGTCA
-+
-67777788888888888888888877776555443222100/...---,,,+*)*))*)))(#(&('"$""##"#"
- at 30BB2AAXX080903:3:2:590:615#0
-GAGACCAACCGAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTAGATCGGAAGNTCGACAT
-+
-677777888888888388888888178763533432211%.-/,.*,-+,+++*))))))((((('%"""$""#"#
- at 30BB2AAXX080903:3:2:1689:858#0
-ACCGAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCNCAGACAC
-+
-677777888888888888888888.77765454112..101/+,-+,--+)*)(*()())((#(#'#'"$%""$##
- at 30BB2AAXX080903:3:2:769:1501#0
-ACCGAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAGATCGGCNCAGCACC
-+
-677777888888888888888888377765453432,2100/....,--,,++)*)*()))))((''$"$"##$"#
- at 30BB2AAXX080903:3:51:707:913#0
-AGGGGCCTGCGGCGTATTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGACACGGC
-+
-6777778888888888888888887775655544322210///...-+,,+,+++*)*))))(('''$$"#"""##
- at 30BB2AAXX080903:3:54:1582:1694#0
-GAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGACACAAACAC
-+
-67777788888888888888888877776555443222100//..-,-,--++**)))*)))((((#""$$""##"
- at 30BB2AAXX080903:3:39:331:714#0
-GAAGGGGCCTGCGGCGTATTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGTACGCGGTC
-+
-677777888888888888888888777765518430210/0/..,---,-++*(**)))&''((&('"$%#$"###
- at 30BB2AAXX080903:3:38:249:793#0
-CCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCAAATACGCAGATCGGACGANTCCGC
-+
-67777788888888888888888877776555443222100//..---,,++++***))))))((('$"$""$#"#
- at 30BB2AAXX080903:3:54:708:204#0
-CGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGGCAGATCGGAAGACTGG
-+
-67777788888888888888888077776555443222100//..----,+++***))*))))((('%"$$&"#""
- at 30BB2AAXX080903:3:54:214:523#0
-TATGAAGAATAGGGCGAAGGGGCCTGCGGCGTATTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCACTCTNNA
-+
-6777778888888888888888887777655044322-100//-/--,,,++****)()))((''('&#$#$#"""
- at 30BB2AAXX080903:3:1:1102:327#0
-GTGCGTCATATGTTGTTCCTAGGAAGATTGTAGTGGTGAGGGTGTAGATCGGAAGAGCGGTTCAGGAGNACNCACA
-+
-677777888888888888888882771765704832,2.00/*.---,,(,++**)*$))('#''##"""#"##$#
- at 30BB2AAXX080903:3:56:1357:1782#0
-GTAGAGTTCAGGGGAGAGTGCGTCATATGTTGTTCCTAGGAAGATTGTAGTGGTGAGGGTGTTTTTTATGCATGTG
-+
-67777788888888888888888877776555442(2.10/1/-.--++,+++**&)*)()((('%''$%""""""
- at 30BB2AAXX080903:3:41:1287:1411#0
-TGTTGTGTAGAGTTCAGGGGAGAGTGCGTCATATGTTGTTCCTAGGAAGATTGTAGTGGTGAGATCGACACACAGT
-+
-67777788888888888888788877779555443222,00./..-,+,++*++**))*#)(()(&'"%"""##""
- at 30BB2AAXX080903:3:39:930:806#0
-ATAATAAACACCCTCACCACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTACCCACACT
-+
-67777788888888888888888877776555443222100//..---,-+,+++**))))()((('&%"$$%#$"
- at 30BB2AAXX080903:3:3:1691:216#0
-AATAAACACCCTCACCACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTAACNTCACNCN
-+
-67777788888888888888888877775555443022/00//..--,,,+*+*))())))(((('#""#&%$"$"
- at 30BB2AAXX080903:3:45:288:117#0
-GGTGACAAAATATGTTGTGTAGAGTTCAGGGGAGAGCGCGTCATATGTTGCTCCTAGGAAGATTGTAGCGGGGACG
-+
-677777888888888888888888377765554422%2100/,.,---,,)++)*)*)(()(((('''"&$"#"#"
- at 30BB2AAXX080903:3:56:434:1429#0
-ATAAGAACAGGGAGGTTAGAAGTAGGGTCTTGGTGACAAAATATGTTGTGTAGAGTTCAGGGGAGAGCGCCGACTC
-+
-6777778888888883888/78(877726555443222/0./*....-,,++++*)*#()))((((&&%#"""$##
- at 30BB2AAXX080903:3:42:941:637#0
-GACGCACTCTCCCCTGACCTCTACACAACAGATTTTGTCACCAAGACCCTACTTCTAAACTCCCCGAGATCGTGTC
-+
-677777888888888888888+88777765)54433221/0//-.,-,,+*++)+*)'&))(((%(%'"&$&#"""
- at 30BB2AAXX080903:3:52:368:1328#0
-AATTCATAAGAACAGGGAGGTTAGAAGTAGGGTCTTGGTGACAAAATATGTTGTGTAGAGTTCAGGGGAGTGTGTG
-+
-67777788888888888888888877776555443222100//.----,,+++***)))))()('(&$""#%#"#"
- at 30BB2AAXX080903:3:4:17:1568#0
-GCACTCTCCCCTGAACTCTACACAACATATTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTNCACTNAN
-+
-677777888888888888881388737/655+442020+&0/.-,-,+,,+++***)))((((#(('"""%%#"#"
- at 30BB2AAXX080903:3:3:1410:1627#0
-CCCTGAACTCTACACAACATATTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAGATCNTGTCNCA
-+
-67777788888888888888888877776555343222100//...,-,,+,+**)*))()))((('%"""$%"##
- at 30BB2AAXX080903:3:51:182:1380#0
-TATGCTGTTCGAATTCATAAGAACAGGGAGGTTAGAAGTAGGGTCTTGGTGAGATCGGAAGAGCGGTCTGGACGGG
-+
-67777788888888888888888877776555443222100//-.---,-+,+***))))))((''&"""#"$$#"
- at 30BB2AAXX080903:3:54:1684:449#0
-AATCGGGGGTATGCTGTTCGAATTCATAAGAACAGGGAGGTTAGAAGTAGGGTCTTGGTGACAAAACACACCCCCC
-+
-67777788888888888888888877776555443222100//..---,,++*+**)))))'(('''$$%%&#%##
- at 30BB2AAXX080903:3:56:514:1143#0
-CACAACATATTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCAGATCGGTCTCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()'('&&#"#"#""
- at 30BB2AAXX080903:3:33:472:1744#0
-AACATATTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCCCNACTGACNN
-+
-67777488888888888888888877776555443222100//..----++++**+)*)())()'''"$#"""#""
- at 30BB2AAXX080903:3:56:1302:1160#0
-TTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCGTATGAATGCGAACAGCATACCCCCGATTCCGCTCCTATCA
-+
-+7777788888888888888888877776555143-2110///,--+-,,,*++**(())(('(('''&"""#"#"
- at 30BB2AAXX080903:3:38:1192:1538#0
-TGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCCCCGATTCCGCTCCGCCACT
-+
-67777788888888888888888877776555443222100//..-.-,,+++***)**)(())(''"%%&"%#$"
- at 30BB2AAXX080903:3:47:1447:272#0
-GGTGTATGAGTTGGTCGTAGCGGAATCGGGGGTATGCTGTTCGAATTCATAAGAACAGGGAGGTTAGAAGTACAAA
-+
-67777788888888888888888877776555343222100//..---,,+,+***))))(((#(('"$%"%#"""
- at 30BB2AAXX080903:3:59:1028:1126#0
-TCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCCCCGATTCCGCTACGACCAACTCATACACCAGAACAAC
-+
-67777788888888888888888877776555443222100/...---,,,+++***)))))((('''%&#$%#$%
- at 30BB2AAXX080903:3:48:306:121#0
-CCTGTTCTTATGAATTCGAACAGCATACCCCCGATTCCGCTACGACCAACTCATACACCTCCTATAGATCGGCCTC
-+
-67777788888888888888888877776555443222100//..---,-,,++***))))))((''$"#"###"#
- at 30BB2AAXX080903:3:2:1679:1728#0
-AGTAATGCTAGGGTGAGTGGTAGGAAGTTTTTTCATAGGAGGTGTATGAGTTGGTAGATCGGAAGAGCNGTCACGC
-+
-677777888888888888888888777365554632/21-0/).-.,-,,+,+*)*)()())(((''""&%%$%""
- at 30BB2AAXX080903:3:38:1062:1120#0
-ACATATCATATAAGTAATGCTAGGGTGAGTGGTAGGAAGGTTTTTCATAGGAGGAGGATGAGGTGGGCGCGTACAC
-+
-6777778888888888888888887)776055)432221&0'/..+*-,-,)+*++#()()(&((('%&$&$%%$$
- at 30BB2AAXX080903:3:38:1783:1571#0
-ACTTCCTACCACTCACCCTAGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCGCTGCNN
-+
-67777788888888888888888877776555443222100//..---+,+,+**)*))))((((''"%&%%##""
- at 30BB2AAXX080903:3:38:1542:47#0
-TTGAGGGGGAATGCTGGAGATTGTAATGGGTATGGAGACATATCATATAAGTAATGCTAGGGTGAGCGACTCCTNN
-+
-677777888888888888888880777765.2443222200//--.-+-,,(++)*()())(#(&(%$"####"""
- at 30BB2AAXX080903:3:59:497:1419#0
-TACCACTCACCCTAGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCCCCCCCACACCAA
-+
-67777788888888888888888877776555443222100//..---,,-++++)*)))))((('%$%%%&###"
- at 30BB2AAXX080903:3:50:482:707#0
-ACAATCTCCAGCATTCCCCCTCAAACCTAAGAAATATGTGTGATAAAAGAGATACATAAGATCGGACTANGTCNCC
-+
-67777788888188.888888/3877676555/&3.221$-/../+,,,+,'+)+)'((''%('((%$""""#""#
- at 30BB2AAXX080903:3:55:650:1997#0
-CAGGGATGGGTTCGATTCTCATAGTCCTAGAAATAAGGGGGTTTAAGCTCCTATTATAGATCGGAAGAGGCTCACA
-+
-67777788888888888888888877776555443222100//..--,,-,++***)*)))((((('$$##""##"
- at 30BB2AAXX080903:3:44:969:356#0
-TGGGGTGTGATAGGTGGCACGGAGAATTTTGGATTCTCAGGGATGGGTTCGATTCTCATAGTAGATCGCACGGGGG
-+
-67777088888888888888888877776555443222100/...--,,,+*+***)*))))(((''$%%$##""$
- at 30BB2AAXX080903:3:50:808:914#0
-TGGGGTGTGATAGGTGGCACGGAGAATTTTGGATTCTCAGGGATGGGTTAGATCGGAAGAGCGGTTCCGGGCACAC
-+
-67777788888888888888888877776555443222100/...--,,,++++****))))((((#$""#%##""
- at 30BB2AAXX080903:3:52:1386:822#0
-TCTAGGACTATGAGAATCGAACCCATCCCTGAGAATCCAAAATTCTCCGTGCCACCTATCACACCCCGCACTAAAA
-+
-6777778888888883818883.7472195224,-2,.0.,./.,-+*,(+()**)))(()(('''%"$"$$#"""
- at 30BB2AAXX080903:3:55:1477:58#0
-TGAGAATCGAACCCATACCTGAAAATCCAAAATTCTCCGTGCCACCTATCACACCACATCCAAAAGTCACCACATC
-+
-6777778888888888888888$/7777655544*20%1*///..---,++++*&'))()(('(('&%$##%#"""
- at 30BB2AAXX080903:3:58:1529:1803#0
-TGAGAATCGAACCCATCCCTGAGAATCCAAAATTCTCCGTGCCACCTATCACACCCCATCCTAAAGTACACACACN
-+
-67777788888888888888888877776545442221100//..---,,,++***)))((((((''$$%%&$%$"
- at 30BB2AAXX080903:3:35:1476:870#0
-CGAACCCACCCCTGAGAATCCAAAATTCTCCGTGCCACCTATCACACCCCATCCTAAAGTAAGGTCANCTATACAN
-+
-67777788.888888888888888777765552432220/0//-.--,,-+++***)))'((('(('"$##"##""
- at 30BB2AAXX080903:3:2:1724:866#0
-GCCCGATAGCTTATTTAGCTGACCTTACTTTAGGATGGGGTGTGATAGGTGGCACGGAGAATTTTGGANTCTCAGT
-+
-67777788888888888888888877776555441222101//..-,,,,+++++*)*)((((((('""##%"##"
- at 30BB2AAXX080903:3:56:221:1234#0
-GGGCCCGATAGCTTATTTAGCTGACCTTACTTTAGGATGGGGTGTGATAGGTGGCACGGAGAAGATCNGATCACAG
-+
-67777788888888888888888877776555443222100/..----,,+(+***)))()'(((&#"&#"#"#""
- at 30BB2AAXX080903:3:46:97:808#0
-TCCAAAATTCTCCGTGCCACCTATCACACCCCATCCTAAAGTAAGGTCAGCTAGATCGGAAGAGCGGTTCAGCAGG
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))(((('&"$%$"%###
- at 30BB2AAXX080903:3:49:143:968#0
-CCGTGCCACCTATCACACCCCATCCTAAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCCGATACAGCCT
-+
-67777788888888888888888877776555443222100//..----,+++*****)))))((''&""$$"##"
- at 30BB2AAXX080903:3:37:1630:1699#0
-GGGTATAACCAACATTTTCGGGGTATGGGCCCGATAGCTTATTTAGCTGACCTTACTTTAGGATGGGGTGNGTCTN
-+
-67777788888888888888888877776555443222100//..--,,,,++***)*)))(()'''&"#"""#""
- at 30BB2AAXX080903:3:37:114:382#0
-TACGGGAAGGGTATAACCAACATTTTCGGGGTATGGGCCCGATAGCTTATTTAGCTGACCTTACTTTACGACGACN
-+
-67777788888888888888888877776555443222100//...--,,+++***)))))((((''"$""###""
- at 30BB2AAXX080903:3:37:782:1187#0
-TACGGGAAGGGGATAACCAACATTTTCGGGGTATGGGCCCGATAGCGTATTTAGCTGACCTTACTTTACTGGTCTN
-+
-677777888883888888888888777765564132221/0.-.-+*+,,*+++)))('(((#'('%&$""$#"#"
- at 30BB2AAXX080903:3:44:398:1834#0
-TACGGGAAGGGTATAACCAACATTTTCGGGGTATGGGCCCGATAGCTTATTTAGCTGACCTTAGATCGGAGGGGTG
-+
-67777788888888888888888877776555443220000//-..---,+++****)&())()((''$"$$""""
- at 30BB2AAXX080903:3:49:1304:1225#0
-AGTACGGGAAGGGTATAACCAACATTTTCGGGGTATGGGCCCGATAGCTTATTTAGCTGACCTTACTTNCGTGTTG
-+
-67777788888888888888888877776555443221101./-,--+-,+++*'*#))'&'(('%'""#""""""
- at 30BB2AAXX080903:3:34:1217:760#0
-CCTAAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCCGAAAATGTTGGTTATACCCTTCCCNCCACTGNN
-+
-67777788888888888888888877776555443222100//./-,-,,,++***)))*())((('""$$$""""
- at 30BB2AAXX080903:3:2:1190:1755#0
-AAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCCGAAAATGTTGGTTATACCCTTCCCGTACNCNTACTC
-+
-67777788888888888888888827776552431221210..+.-.&+,+***)))))('('((%'&"$"$%$"#
- at 30BB2AAXX080903:3:37:127:1197#0
-CCAGGGGATTAATTAGTACGGGAAGGGTATAACCAACATTTTCGGGGTATGGGCCCGATAGCTTATTGCGTCGCGN
-+
-67777788888888888888888877776555413222100//..--,-,++++**)*)))((((''"#"#$"#""
- at 30BB2AAXX080903:3:53:815:1479#0
-GTTGGGCCAGGGGATTAATTAGTACGGGAAGGGTATAACCAACATTTTCGGGGTATGGAGATCGGAAGAGCGGTCT
-+
-67777788888888888888888877776555443222000./..----,++++*+)))))))('('%"##%""#"
- at 30BB2AAXX080903:3:60:1572:1261#0
-ACGGGTTGGGCCAGGGGATTAATTAGTACGGGAAGGGTATAACCAACATTTTCGGGGTATGGGCCCACACACCANN
-+
-67777788888888888888888877776555443)21000//-.-+-,,++)***)*)()((('(&$$%%%$%""
- at 30BB2AAXX080903:3:53:974:411#0
-TCGGGCCCATACCCCGAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTGCTCTCCC
-+
-677777888888888888888808777765554432/2001//.----,-+++****))))((((('&""$$$"##
- at 30BB2AAXX080903:3:41:1700:2012#0
-CGGGCCCATACCCCGAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAAGATCGGACGAGTAT
-+
-6777778888888888888888887677650323330/2.0-/,.--,,,*&)(&))((#''((##%""#%"#"#"
- at 30BB2AAXX080903:3:39:1604:1566#0
-GCCCATACCCCGAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTGTCG
-+
-67777788888888888888888877776559443222100//..---,,++**+**))()))((('&&%$%%"#"
- at 30BB2AAXX080903:3:40:1332:1875#0
-CCCATACCCCGAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATACATCGGACA
-+
-67777788888888888888888877776555443322100//..-,,-,++++**)))()((((('$#%%%""#"
- at 30BB2AAXX080903:3:59:822:1068#0
-GATGGTAGAGTAGATGACGGGTTGGGCCAGGGGATTAATTAGTACGGGAAGGGTATAACCAACATTTTCGTACACA
-+
-67777788888888888888888877776555443222100//..---,,++++**))*)))((((''%%"####"
- at 30BB2AAXX080903:3:4:1780:1038#0
-TTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCANGCATNCN
-+
-67777788888888888888888877776552423222100//..,-,,,,++*+*))*))()((''%""%#$"$"
- at 30BB2AAXX080903:3:43:1381:1551#0
-GGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACATG
-+
-6777778888888888888888887777655544322210///..---,,+++**)**)))))(((''&#$"#""#
- at 30BB2AAXX080903:3:4:1540:592#0
-TATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACNATCANCN
-+
-677777888888888888888888777765554432202000/..---,,+,+****))))(()(('&"#%&%"#"
- at 30BB2AAXX080903:3:35:520:1418#0
-ATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACNTCCCCTCN
-+
-67777788888888888888888877776555443202100//..---,,,+++**)*))))))(('"##$####"
- at 30BB2AAXX080903:3:41:1560:357#0
-TTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGAGATCGGAAGAGCGGCCAC
-+
-67777788888888888888888877776555463222100//.---,-,++++****)()()('(('$""""###
- at 30BB2AAXX080903:3:50:731:455#0
-GGTAAAAAATCAGTGCGAGCTTAGCGCTGTGATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGTGTTGTAC
-+
-67777788888888888888888877776555443222100//..--,,,+++****))))))((('%"""""#"#
- at 30BB2AAXX080903:3:45:630:1978#0
-ACTCAGGTAAAAAATCAGTGCGAGCTTAGCGCTGTGATGAGTGTGCCTGCAAAGAAGATCGGAAGAGGTGTCTAAC
-+
-67777788888888888888888877776555443212100//..---,,++****)*)()(((((''"""#""""
- at 30BB2AAXX080903:3:40:119:1851#0
-CCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACGTGAGTACG
-+
-67777788888888888888888877776555442222100//..---,-+++***))'))((('''""""$"##"
- at 30BB2AAXX080903:3:59:116:1595#0
-AAAGCTAGCATGTTTATTTCTAGGCCTACTCAGGTAAAAAATCAGTGCGAGCTTAGCGCTGTGATGAGTGCTANNT
-+
-67777788888888888888888877776555443222100//..--,,,+,++***)))))(('''$&%#"#"""
- at 30BB2AAXX080903:3:2:448:1022#0
-GGTTAGAACTGGAATAAAAGCTAGCATGTTTATTTCTAGGCCTACTCAGGTAAAAAATCAGTGCGAGCNTAGAACT
-+
-67777788888888888888888877776555443221100/./.---,,,++***)*)))((('(&&"$&$"#"#
- at 30BB2AAXX080903:3:57:62:1195#0
-TTACCTGAGTAGGCCTAGAAATAAACATGCTAGCTTTTATTCCAGTTCTAACCAAAAAAATAAACCCTCGCTCCCA
-+
-67777788888888888888888877776555443222100//..---,,++++*))*()))((''''%&#$"$#"
- at 30BB2AAXX080903:3:42:712:1149#0
-TCTAACCAAAAAAATAAACCCTCGTTCCACAGAAGCTGCCCTCAAGTATTTCCTCACGCAAGCAACCGAACCGACC
-+
-677777888888888888888888777765554432221/)/...-(--,++***)))())(((((''$"&#&$##
- at 30BB2AAXX080903:3:4:1717:538#0
-TAGCTATTAGAAGGATTATGGATGCGGTTGCTTGCGTGAGGAAATACTTGATGGCAGCTTCTGTGGAANACTANCN
-+
-67777788888888888888888877776555443222100//..---,,+,+*)*))))')('('&""#$"#"$"
- at 30BB2AAXX080903:3:50:1593:611#0
-TATTGTTGAAGAGGATAGCTATTAGAAGGATTATGGATGCGGTTGCTTGCGTGAAGATCGGAAGAGGCGTCCATCA
-+
-67777788888888888888888877776555443222100/*..---,,+'+****)())(((((#"""$"%"$%
- at 30BB2AAXX080903:3:3:1209:1475#0
-TATATTGTTGAAGAGGATAGCTATTAGAAGGATTATGGATGCGGTGGCTTGCGCGAGGAAATACTTGTNCACTNGT
-+
-677777888888888888888888677765514-3+2220,//-*%-*'(+$+$*)*)'(('('(%'""%&$#"$$
- at 30BB2AAXX080903:3:59:1436:1457#0
-CCTTCTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGAACCATAACCAATACTACCAAACAACACNAC
-+
-6777778888888888888888882777655544322210//....-,,-+++***)*)()((((&'$$%%%$"$$
- at 30BB2AAXX080903:3:46:1302:1092#0
-GCTATAGCCATTATGATTATTAATGATGAGTATTGATTGGTAGGATTGGGTTTGGTTCATTAGATCGTCATCTGCC
-+
-67777788888888888888888877776555443222100//&----,)+&+**(*#())'('(%'$$""#%##"
- at 30BB2AAXX080903:3:42:392:1911#0
-TATTGCTATAGCCAGTATGATTATTAATGATGAGGATTGATTGGTAGTATTGGGTAGATCGGAAGGGCGTGTCTCG
-+
-+7777788888888%8888886887777643544*2221%0/-,'+--+,,++)+%(*(#)((''%&&$"$"#"#"
- at 30BB2AAXX080903:3:46:1164:371#0
-GTTTTATTGCTATAGCCATTATGATTATTAATGATGAGTATTGATTGGTAGTATTGGTTATGGTTCATCTCCCGGG
-+
-67777788888888888888888877776555443222000//..---,,+,+***)()*)'(((''$"####"##
- at 30BB2AAXX080903:3:55:651:1211#0
-ACAATGAACCATAACCAATACTACCAATCAATACTCATCATTAATAATCATAATGGCTATAGCAATATATCTAATA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))'((('"%#&%""##
- at 30BB2AAXX080903:3:49:31:745#0
-TCCTAGTTTTATTGCTATAGCCATTATGATTATTAATGATGAGTATTGATTGGTAGTATTGGTTTTGTNGCTCATA
-+
-67777788888888888888888877776555443222100///.----,+++*+*()))(((('('"""$"#"##
- at 30BB2AAXX080903:3:42:1213:473#0
-TAACCAATACTACCAATCAATACTCATCATTAATAATCATAATGGCTATAGAAAAAAAAAAGGAAGAACGGGTGAC
-+
-67777788888888888888888877776555443222100//..---),(&%*%*)))(&')'(''""%"""""#
- at 30BB2AAXX080903:3:34:633:880#0
-AACCAATACTACCAATCAATACTCATCATTAATAATCATAATGGCTAGAGCAATAAAAATAGGAATANGCCTCCNN
-+
-677777888888888888880&8877776555443222100//..--)-++++)**))'))'(((#'""##"$#""
- at 30BB2AAXX080903:3:58:712:1953#0
-AATCATAATGGCTATAGCAATAAAACTAGGAATAGCCCCCCTTCACCTTTTTGTCCCCATTGGGAGAGCTATCAGN
-+
-677777888888888+8888888876776545443002.0,..)'&$+&,$(*$'(##&###(#&&#%"#$#$"#"
- at 30BB2AAXX080903:3:53:1517:1436#0
-TGTGAGAAGAAGCAGGCCGGATGTCAGAGGGGTGCCTTGGGTAACTTCTGGGTCTCAGAAGTGAAAGACACGTTTG
-+
-677777888888888888888.8877776555442122100/...---,,++'*+**))())(''('$$%&"""#"
- at 30BB2AAXX080903:3:1:1274:542#0
-GTCATGTGAGAAGAAGCAGGCCGGATGTCAGAGGGGTGCCTTGGGTAACTTCTGAGATGGGAGGAGCGNTGNTCAN
-+
-67777788888888888888.788/777925-4/32..,/0/..-),+$*+'++)*))&'('%('(%$"#%"%%$"
- at 30BB2AAXX080903:3:8:1401:555#0
-TGGTATATGATTGAGATGGGGGCTAGTTTTTGTCATGTGAGAAGAAGCAGGCCGGATGTCAGAGGGGNCGACTCNN
-+
-67737788888888888888884877776555412221100/+.,-.+,,+')*+))*(('((((('"$""$"$""
- at 30BB2AAXX080903:3:33:1071:1089#0
-AGGCACCCCTCTGACATCCGGCCTGCTTCTTCTCACATGACAAAAACTAGCCCCCATCTCAATCATANAGACATNN
-+
-677777888888888888888888777765554432221000/..---,-,,++****)))((((('""###""""
- at 30BB2AAXX080903:3:37:1069:391#0
-TCTGACATCCGGAATGCTTCTTCTCACATGACAAAAACTAGACCCCATCTCAATCATATACCAAATCGCTCCATCN
-+
-677777888888888888&8%88877772555443222+00*/..---,,+++****)()*)(((''"%"&$""#"
- at 30BB2AAXX080903:3:59:369:1081#0
-TCTGACATCCGGCCTGCTTCTTCTCACATGACAAAAACTAGCCCCCATCTCAATCATATACCAAATCTCNACTNNC
-+
-67777788888888888888888877776555443222100//..---,,+,+***))))))(((((''"$"%""#
- at 30BB2AAXX080903:3:42:10:884#0
-TTGAGAGAGTGAGGAGAAGGCTTACGTTTAGTGAGGGAGAGATTTGGTATATGATTGAGATGGGGGCNCGACGTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((((''"$"""""""
- at 30BB2AAXX080903:3:40:1525:958#0
-AAAACTAGCCCCCATCTCAATCATATACCAAATCTCTCCCTCACTAAACGTAAGCCTTCTCCTCACTCAGNTCGCA
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)**)))()('''&%""%###
- at 30BB2AAXX080903:3:42:1688:869#0
-GATGGATAAGATTGAGAGAGTGAGGAGAAGGCTTACGTTTAGTGAGGGAGAGATTTGGTATATGATTGAGATGTGC
-+
-67777788888888888888888877776555443222100//./----,,+*+**))))))(((('&&%#%&"#"
- at 30BB2AAXX080903:3:55:1139:897#0
-CAATCATATACCAAATCTCTCCCTCACTAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATATCTCA
-+
-67777788888888888888888877776555443222100//..--,,,,++**)))))))(((('''"$"$"""
- at 30BB2AAXX080903:3:57:1675:1361#0
-CAAATCTCTCCCTCACTAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCCACACAACAA
-+
-67777788888888888888888877776555.43222100//.'--,,,++%***)))()((('%'&$%%$$%$$
- at 30BB2AAXX080903:3:4:791:1513#0
-CACCTCAACTGCCTGCTATGATGGATAAGATTGAGAGAGTGAGGAGAAGGCTTACGTTTAGTGAGGGANATGCNCN
-+
-67777788888888888888888877786/554432221/00/,,-,+-+*))**)'()))#)'(''%"%""%"#"
- at 30BB2AAXX080903:3:53:462:1854#0
-GTCCACCTCAACTGCCTGCTATGATGGATAAGATTGAGAGAGTGAGGAGAAGGCTTACGTTTAGTGAGACAGTCTG
-+
-67777788888888888888888877776555443222100//..---,,,+++**)*)))()(('''$#""""##
- at 30BB2AAXX080903:3:4:835:1013#0
-TCTCCCTCACTAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCAGATCGGAAGAGCGGTANAGTANCN
-+
-6/777788888888888888888877776555443220100//.-.-,,,+,+**)*)())()(('%"""""""#"
- at 30BB2AAXX080903:3:51:164:794#0
-TGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATAAGATTGAGAGAGTGAGGAGAAGGCTTACGTATAGTGTGT
-+
-67777788888888888888888877756555443221110//..--,,,+++***))))(((((''"$"""""#"
- at 30BB2AAXX080903:3:43:8:311#0
-GTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATAAGATTGAGAGAGTGAGGAGAAGGCNTNCGTCACGAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((#'#$""%"#"#"
- at 30BB2AAXX080903:3:59:334:419#0
-ACTAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCTANNC
-+
-67777788888888888888888877776555443222100///.---,,+++***))))(((((('$$&&#"""#
- at 30BB2AAXX080903:3:36:134:359#0
-CTAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAANAACCACTN
-+
-67777788888888888888888877776555443222100//..---,,+++)**))))))((((&""""$#$""
- at 30BB2AAXX080903:3:33:569:1209#0
-TAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGATCGGAAAGCNGACACANN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((((''"""&%#"""
- at 30BB2AAXX080903:3:35:762:684#0
-AACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCNCCTCCTGN
-+
-67777788888888888888888877776555443222100//..---,,+,*+**())*()()(''"$""##"""
- at 30BB2AAXX080903:3:1:254:1043#0
-CGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGAGATCGGAAGAGCTNTCNACAC
-+
-67777788888888888888888877776555442220100//.--,-+-,*+***)))))(((&'%$"##"$###
- at 30BB2AAXX080903:3:43:1062:1219#0
-TGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATAAGATTGAGAGAGTGAGGAGAAGCTG
-+
-677777888888888888888888777765554432221000/..---+,++++**)*)))((('(&'&%""###"
- at 30BB2AAXX080903:3:56:1069:1119#0
-CTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAACAACA
-+
-67777788888888888888888877776555443222100//.,---,,+++++**))))))(('''&"$"#"#"
- at 30BB2AAXX080903:3:42:1735:1815#0
-CCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCAAACCCAGAGATCGGAGGCTCCC
-+
-2777778888888888888888887777655544322*100/,..--,--+,)***))')*(('&''$&"&$"###
- at 30BB2AAXX080903:3:51:49:745#0
-TCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAACCTCCTAGC
-+
-6770738888888888888888887777655584322210///..),,,,,*+**))(*)(('((''$$""$""#$
- at 30BB2AAXX080903:3:35:978:1303#0
-ATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATAAGATNGTCACAAN
-+
-67777788888888888888888877776555443222100//..---,,+++****))))())'(&""$%#$#""
- at 30BB2AAXX080903:3:44:851:1548#0
-AGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATAAGATTGAGAG
-+
-67777788888888888888888877776555443222100//..---,,+,+*+*)))))((('('$&&&%%%"%
- at 30BB2AAXX080903:3:55:789:2009#0
-TCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATCGACAC
-+
-677777888888888888888888777765555432.2100----.+-+,,+++'*()))))'(((&"%$"""#""
- at 30BB2AAXX080903:3:44:609:1195#0
-TGAGGAGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATATGATC
-+
-67777788888888888888888877776555443222100//..---,,,++***))))))((((&$"&%#"#"#
- at 30BB2AAXX080903:3:50:319:1606#0
-ATTGAGGAGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGTTACGTC
-+
-67777788888888888888888877776555443222100/...-.,--+,+*+*))))))(((('%""""#"#"
- at 30BB2AAXX080903:3:60:573:265#0
-TCCATCATAGCAGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCATACACNN
-+
-6777778888888888888888887777655544322210///.,---+,+++**))))()))((('&$"#&$$""
- at 30BB2AAXX080903:3:57:266:634#0
-CCTATGTGGGTAATTGAGGAGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCTTTCAT
-+
-67777788881888888888888877776555443222/00//..--,,,+*+*****))))()(''$&%"""$"#
- at 30BB2AAXX080903:3:38:769:1843#0
-CAGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACNACGTCCA
-+
-67777788888888888888888877776555443222000//-.---+,+++*)*)*)))))((('%"%#&&###
- at 30BB2AAXX080903:3:1:1659:638#0
-AGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAAGATCGGAAGNCANTTCT
-+
-6777778888888888888888887773655544322210/-./.---,,+,*)**))))))()('(%""#"""#"
- at 30BB2AAXX080903:3:42:1181:40#0
-AGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGCCACN
-+
-67777788888888888888888877776555443220110//..---,,+++***)))(*)()((&'$$#$##$"
- at 30BB2AAXX080903:3:54:1073:1184#0
-TCATCCTATGTGGGTAATTGAGGAGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAGCGACCT
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))((((''$$"%%#$$$
- at 30BB2AAXX080903:3:56:1233:201#0
-TATTCATCCTATGTGGGGAATTGAGGAGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCAGATCTGCCAG
-+
-67777788888888888,88888877776555443222110//..---,,+++(*+))(*)'((&(''&$#""$#"
- at 30BB2AAXX080903:3:48:1129:2038#0
-TTATTCATCCTATGTGGGTAATTGAGGAGTATGCTAAGAGTTTGCGTAGGTGAGATCGGAAGAGCGGCAGAGTGAC
-+
-67777188888888)888,88&88777263524,10321*,//.%.,,+(+++**(#))(()()#('%$"""""##
- at 30BB2AAXX080903:3:42:1547:933#0
-TGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCAGATCGGAAGAGCGGTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))((''$%&""""#"
- at 30BB2AAXX080903:3:49:1715:1152#0
-TACGGTAGAACTGCTATTATTGATTCGATGTGGGTAATTGAGGGGTATGCGAAGATTTTTCGTAGCTCCCCAGCGC
-+
-67777283182888&88(888&)*$)$-655344",1/.-#//(.'+,+&()*+*)(*)'#(''(%%$"#$""#"#
- at 30BB2AAXX080903:3:51:570:903#0
-TACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGCTAAGAGATCGGAAGAGCGTGGAGGTG
-+
-6777778888388888888888887777655544222210///..---,,+++***)**))))((((&""""""##
- at 30BB2AAXX080903:3:45:1631:779#0
-CCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATAATAGCAGTTCTACCGTCACACCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(''$$"$#$#"
- at 30BB2AAXX080903:3:37:567:1358#0
-TAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGCTAAGATTTTGCGTAGCAN
-+
-67777788888888888888888877776555443222100//-----+,+++***)))))((((('""$"#"$$"
- at 30BB2AAXX080903:3:45:558:1968#0
-TAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGGATGCTAAGATTTTGAGACGATG
-+
-67777088888888888888888877776555423222100//-.----,+++%+*)))))(()(('$"#""#"""
- at 30BB2AAXX080903:3:2:632:1771#0
-AGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATAATAGCAGTTCTACCGTACNCACNGTC
-+
-6777778888888888888880.873773353,/1.+1/0,.-,,.,,+++**)*))((((((&'%'%"$#%""#"
- at 30BB2AAXX080903:3:48:1425:1760#0
-TTAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGCTAAGATTTTGGGTACTC
-+
-67777788888888888888888877776555443222100//..---,-++*****)()))()'''&#"""####
- at 30BB2AAXX080903:3:60:913:1278#0
-CTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATAATAGCAGTTCTACCGTACACGCNCAANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))()((&&"&"$#%""
- at 30BB2AAXX080903:3:38:66:623#0
-TGTTAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGCAGATCGCGCAGCGCA
-+
-67777788888888888888888877776555443222100//..--,,,+++*****))()(('(&"$%""$"##
- at 30BB2AAXX080903:3:36:840:1968#0
-AAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATAATAGCAGTTCTACCGTACAACCCTCACCTACANN
-+
-67777788888888888888888877776555443222000//..---,-+++**))*))))(((('&&%#&%"""
- at 30BB2AAXX080903:3:58:1155:1829#0
-AATGGTTATGTTAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGCTACACGN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((('&$&%$%###"
- at 30BB2AAXX080903:3:44:1479:878#0
-AGAATGGTTATGTTAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGGACCAC
-+
-677777888888888888/8888877776555443212100//....-,,+,+***)))))(()('%&"$"%$$$%
- at 30BB2AAXX080903:3:56:393:1225#0
-TAATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATCCTAACTACTACATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))((('%%%&%%##$
- at 30BB2AAXX080903:3:1:1639:1229#0
-AATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATCCTAACTANACNCACC
-+
-6777778888888888888888887777655544322210///..---,,,++***)**))((''('%""%"%#$#
- at 30BB2AAXX080903:3:37:1448:242#0
-ACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATCCTAACTACTACCGCATTCCTACTACTNTCACN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''$$%""%$$"
- at 30BB2AAXX080903:3:3:1094:1070#0
-TTTAAGTTGAGTAGTAGGAATGCGGTAGTAGTTAGGATAATATAAATAGTTAAATTAAGAATGGTTATNGTACNGT
-+
-67777788888888888888888877776555443222100//.----,,++++***))))(((((''"$&&$"""
- at 30BB2AAXX080903:3:49:218:1039#0
-TATTATCCTAACTACTACCGCATTCCTACTACGCAACTTAAACTCCAGCACCACGACCCTACTACTATCTCCCCAC
-+
-67777788888888888888888877776555&43222100//..---,,+++***)**)))(('''&%"#"#"##
- at 30BB2AAXX080903:3:39:1466:1073#0
-CAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGGAGTTTAAGTTGAGTAGTAGGAATGCGGTAAGATCGGGAGCCT
-+
-67777788888888888888888877776555442232100//...--,,+++***))))))()'('&$"""#"#"
- at 30BB2AAXX080903:3:41:1237:1487#0
-ATCCTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTATCTCGCACCTGAC
-+
-67777788888888888888888877776545443222100/...---,,+,+)*)***)))((((&"&%%&%##"
- at 30BB2AAXX080903:3:36:1399:1114#0
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTATCTCGCAACTGCACNN
-+
-67777788888888888888888877776555443222100//..---,,-++***))))))((''&$&%$%$#""
- at 30BB2AAXX080903:3:48:1141:1309#0
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTATCTCAGATNGTCAGCT
-+
-67777788888888888888888877776555443222100//..---,-+++***)*)))((((''%"""$""##
- at 30BB2AAXX080903:3:57:992:1297#0
-TTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGGAGTTTAAGTTGAGTAGTAGGAAAGATACACA
-+
-677777888888888888888888767765554/3222100//...-,-,+*+)***))))((('''$&%&#$#$"
- at 30BB2AAXX080903:3:58:1400:1418#0
-TAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGGAGTTTAAGTTGAGTAGGCTACAC
-+
-67777788888888888888888877776555443222100//..---,-++++**)))))(((('&'$%$"$%$$
- at 30BB2AAXX080903:3:43:81:245#0
-GTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGAGATCGGAAGAGCGGGGCACAG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&'"""$"#""
- at 30BB2AAXX080903:3:41:1612:1240#0
-AGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGAGATCGGAAGTACAGTG
-+
-67777788888888888888888877776555443222100//..----,+++***)))*)(((''''$#"%%###
- at 30BB2AAXX080903:3:3:1522:1183#0
-ACTCAACTTAAACTCCAGCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAANCACANTN
-+
-67777788888888888888888877776555443222000//.-,.-,,,,*+***))))((((('$"%#&%"#"
- at 30BB2AAXX080903:3:49:872:1036#0
-TAAGGGTGTTAGGCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGGCGTGGTGGTGGAGGTTATCTTCTCT
-+
-67777788888888888838888837774555,432320$0.'*..--,,(*+)+*%)()))#('#'$"#""""#"
- at 30BB2AAXX080903:3:36:1082:1729#0
-ACTTAAACTCCAGCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCGTCCACCCN
-+
-67777788888888888888888877776555443222100//-.---,,+++****))))(((('%&"$$#"##"
- at 30BB2AAXX080903:3:60:1084:1917#0
-ATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGTGTNTCNN
-+
-677777888888888888888888777735554430221/0./..,--,-,,****)))))(('(''%&&$""%""
- at 30BB2AAXX080903:3:52:1043:1353#0
-GATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGGAGTTTA
-+
-67777788888888888888888877776555443222100//.----,,+,++**))))))(((''$$%"&"#""
- at 30BB2AAXX080903:3:4:736:1434#0
-AACTCCAGCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATNTCCGNAN
-+
-67777788888888888888888877776555443222000//-.--,,,+,++**)*))))(((('%"$&"""#"
- at 30BB2AAXX080903:3:38:456:1612#0
-TGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGTACTA
-+
-6777778888888888888888887777655.44322/1/0/..--,-,,++***()*))&&(((('"#$&"#$##
- at 30BB2AAXX080903:3:36:1636:905#0
-CTCCAGCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATCACACACCNN
-+
-67777788848888888886888877756545443222100//..--,-,+,+**)))&('(((((&%%%%#$#""
- at 30BB2AAXX080903:3:43:1557:1727#0
-CCCGCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATAGATCGG
-+
-67777788888888888888888877776355443221000//..--,,,++**))(()))((((''&&$&#"$"#
- at 30BB2AAXX080903:3:44:151:528#0
-GCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCAGATCGGA
-+
-67777788888888888888888877776555441222100//..---,,+,+***)*)))))(('''$%%$%%$$
- at 30BB2AAXX080903:3:56:855:935#0
-ACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTCACACCCTTAATTCCATCCACCATCTCAC
-+
-6777778888888888888888887/77655544322200///..--(,,+,+***))))'(')((($&$%%###"
- at 30BB2AAXX080903:3:36:402:1305#0
-AGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAAGATCGGAAGAGCGGTTCTGCGCACCN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((&'%&%%"%"##"
- at 30BB2AAXX080903:3:38:722:1931#0
-GAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTGATGCATCAC
-+
-67777788888888888888888877276555243222100./...--+,+,+*)*))))()((('#$"#$""$#$
- at 30BB2AAXX080903:3:50:1284:1667#0
-GAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGCGCCCGG
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))((('('"$#"###""
- at 30BB2AAXX080903:3:40:1389:1755#0
-CACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTGCGTGAC
-+
-67777788888888888888888877776555442222/00//..--,,,+*+***))()()')(('&&"#$###$
- at 30BB2AAXX080903:3:37:75:1178#0
-AGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTAGATCGGAAGATACACANCN
-+
-67777788888888888888888877776555443222100//.----,,+++****)*))(((((&""##$""""
- at 30BB2AAXX080903:3:50:1452:1552#0
-TAGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAAGATCGGCAGACCGT
-+
-677777888888888888888888777765.5440221100//..---,,+++***)))))((((('"""#"##"#
- at 30BB2AAXX080903:3:57:1571:1018#0
-CCTAGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATACACGACCAC
-+
-67777788888888888888888877776555443222100//...-,,,+++***))))(()(((&$$%"&#$$#
- at 30BB2AAXX080903:3:34:721:328#0
-AGCGGGGGCAGGCCTCCTAGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCAGATCGGAAGAGNACCATCNN
-+
-677777888888888888888888777;655/4412221.0...--.(,++++**))((())(((''""##""$""
- at 30BB2AAXX080903:3:49:125:414#0
-TAGCGGGGGCAGGCCTCCTAGGGAGAGGCGGGTGGATGGAATTAAGGGGGGTAGTCATGAGATCGGGCTGTGTGCA
-+
-6777778888888883888888887777635504332210/+/+.---%,)$'*'&)')()((((('%""""""$#
- at 30BB2AAXX080903:3:42:1124:251#0
-ACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCCCTAGGAGGCCTGCCCCCGNTGT
-+
-677777888888888888888888777765554432221/0//..---,,+++**)*))))(()(('&&$%%"#""
- at 30BB2AAXX080903:3:47:318:1586#0
-TAGGAGGCCTGCCCCCGCTAACCGGCTTTTTGCCCAAATGGGCCATTATCGAAGAATTCACAAAAAAGAATCACCA
-+
-67777788888888888888888877776555443220100///.---,,+++**)**))))(((''%""###"""
- at 30BB2AAXX080903:3:3:1539:90#0
-GGGGATGATGAGGCTATTGTTTTTTGTGAATTCTTCGATAATGGCCCATTTGAGATCGGAAGAGGGGTNTGGANCN
-+
-67777788888888888888888877773555-33.)100///-+*(,+,+'*)'(#((''''(&('$"#""#"#"
- at 30BB2AAXX080903:3:42:1128:1621#0
-GGTGGGGATGATGAGGCTATTGTTTTTTGTGAATTCTTCGATAATGGCCCATTTGGGCAAAAAGCCGGTTAGCGGG
-+
-67777788888888888888888877776555443522/00///.--,--+,+*)*)))))())&'''$$%%$#"#
- at 30BB2AAXX080903:3:59:389:878#0
-TATGATGGTGGGGATGATGAGGCTATTGTTTTTTGTGAATTCTTCGATAATGGCCCATTAGATCGGGAGGTCANNG
-+
-67777788888888888888888877774555443220100-..'---,,+,+$**)()(()''((#&%""$""""
- at 30BB2AAXX080903:3:55:397:2001#0
-TGGCTATGATGGTGGGGATGATGAGGCTATTGTTTTTTGTGAATTATTCGATAATGGGCCATTTGGGGGGTTTCCT
-+
-67777788888888888888888877176555.43222100'/-.(--%,*+)**(*##)#'(('''$"##""##"
- at 30BB2AAXX080903:3:39:44:1216#0
-ATGGTGGCTATGATGGTGGGGATGATGAGGCTATTTTTTTTTGTGAATTTTTTTATTATTGAGAATGTCCACACCA
-+
-6777478888888888%8888/88777765+2443'12100/+.-$,+,++,''(*&*)()%)(##'$"##$"###
- at 30BB2AAXX080903:3:49:1564:403#0
-AGGGTGATGGTGGCTATGATGGTGGGGATGATGAGGCTATTGTTTTTTGTGAATTCTTCGATAATGGGCGAAGTGG
-+
-677727888888888888888828777765554432221.0/-..---+,+++)*)))()((((%&'"$""""""#
- at 30BB2AAXX080903:3:1:1255:209#0
-AGGTAGAAGTAGAGGGTAAGGAGGGTGATGGTGGCTATGATGGTGGGGGTGATGAGGCTATTGTTTGANTANTAGC
-+
-677*778888888888888880887777655/44(.211-/0/&.---$&+&)*'**(('##(#(#%&"""""#""
- at 30BB2AAXX080903:3:1:883:2024#0
-AAAAAACAATAGCCTCATCATCCCCACCATCATCGCCACCATCACACTCCTTAACCAGATCGAAAGACNTGNCTCC
-+
-677777888888888888888888777765553$323001/....%--,,,++)***))()(''(('%""#"###"
- at 30BB2AAXX080903:3:56:1445:456#0
-AAACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACGCANAATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$&$#"%#$%
- at 30BB2AAXX080903:3:60:1526:1084#0
-ACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACACAACAAANN
-+
-677777888888888888088888767765511/+22*//.-/.---*+,*+*+*)))))('')(('$$%%%$%""
- at 30BB2AAXX080903:3:33:1759:1265#0
-AATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACGCCNCATGCCNN
-+
-67777788888888888888288877776555443232000/...--,,-++++**)))(())((''""#""##""
- at 30BB2AAXX080903:3:40:1617:1863#0
-AATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACGCCTACTCGCAC
-+
-67777788888888888888888877776555443221100//-,--+,++*+**))*)((')((''%"$%"#$$"
- at 30BB2AAXX080903:3:45:626:148#0
-AGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACGCCTAAAGACCACTC
-+
-67777788888888888888888877776555443222100/-..---,,+++***)**))((((('%"%$%#""#
- at 30BB2AAXX080903:3:49:230:1819#0
-GCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACGCCTAATCCTACACCA
-+
-67175788888888888888888877776555443221000./-.---,,,++*+*))*))(()(('%%"##$##"
- at 30BB2AAXX080903:3:37:806:554#0
-TCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCGACGCCTAATCTACTCCCCNCN
-+
-67777788888888888888888877776555443222000//..---,,+,++&)**)))'(((''%$&%$%"$"
- at 30BB2AAXX080903:3:48:1258:1279#0
-AGTGTGATTGAGGTGGAGTAGATTAGGCGTAGGTAGAAGTAGAGGTTAAGGAGGGTGATGGTGGCTAGTATGTCAC
-+
-67777788888888888888888877776555483201100/....--+,+*+**()))))'(('%'""#"""#"#
- at 30BB2AAXX080903:3:45:1283:2029#0
-TAGTGTGATTGAGGTGGAGTAGATTAGGCGTAGGTAGAAGTAGAGGTTAAGGAGGGTGATGGTGGCTATGGGGGGG
-+
-6777778888888888888888887777655544322210///..-,-,,+++***))())((((#'$#%#"%$$"
- at 30BB2AAXX080903:3:49:1341:649#0
-ATCATAGCCAACATAACCCTCCTTAACCGCGACTTCTACCTACGCCTAATCTACTCCACCTCAAGCACGGCTCAGC
-+
-67777788882888&888888888777754'5343222000//..---,,*++*)**))())((#('&""#"#""$
- at 30BB2AAXX080903:3:35:1551:1786#0
-TTAGATATGGGGAGTAGTGTGATTGAGGTGGAGTAGATTAGGAGTAGGTAGAAGAAGAGGTTAAGGANGTGCTACN
-+
-677777888888%88/888488887.7765504422011-0.'.-,&-+,+)**#'*(**%(&'(('"""#%"##"
- at 30BB2AAXX080903:3:42:138:1661#0
-TGTTAGATATGGGGAGTAGTGTGATTGAGGTGGAGTAGATTAGGCGTAGGTAGAAGTAGAGGTTAAGCACTGCTCA
-+
-67777788888888888888888877776555443222100//./---,,+++***)*)))(()((&$%#""#"##
- at 30BB2AAXX080903:3:40:1223:724#0
-TTACGTTGTTAGATATGGGGAGTAGTGTGATTGAGGTGGAGTAGATTAGGCGTAGGTAGAAGTAGAGGTTAAGATC
-+
-67777788888888888888888877776555443212100//..---,,,+++**'))))('('(&"%%$#$""#
- at 30BB2AAXX080903:3:59:271:1398#0
-CTACTTCTACCTACGCCTAATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAACGTAAAGATCGCNNNT
-+
-67777788888888888888888877776555443222100//..---,,++++**)*)))(((((&'%%%#""""
- at 30BB2AAXX080903:3:52:759:157#0
-CAAACTGTCATTTTATTTTTACGTTGTTAGATACGGGGAGTAGTGTGATTGAGGTGGAGTAGATTAGGCGTAGTCA
-+
-677777888888888888888888777765554)322200///...-,,,+,+****)))(((((('&""#"$"#"
- at 30BB2AAXX080903:3:41:290:1147#0
-AATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAACGTAAAAATAAAATGACAGTTTGAAGATACAACA
-+
-67777788888888888888888877776555443220100/..----,,+,+++*)))))(()(''$%&%$#$"#
- at 30BB2AAXX080903:3:39:616:1078#0
-CACTACTCCCCATATCTAACAACGTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('&$%&%&"$#
- at 30BB2AAXX080903:3:44:1329:345#0
-CTACTCCCCATATCTAACAACGTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCTCCCAAT
-+
-67777788888888888888888877776/55443222100///.---,,+++)****))()(''((&&"%#$"""
- at 30BB2AAXX080903:3:43:1389:320#0
-CTCCCCATATCTAACAACGTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCCGCACAC
-+
-677777888888888888888888777765554432%2100//..---,(+++**))*))&))(('''""""##"#
- at 30BB2AAXX080903:3:41:703:876#0
-TATCTAACAACGTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCAGATCGGAAGAGCGTTACA
-+
-67777788888888888888888877776555443222100/....--,,,++***)*))))))((&%%$"""##"
- at 30BB2AAXX080903:3:51:1048:163#0
-TGGTAAGGGCGATGAGTGTGGGGAGGAATGGGGTGGGTTTTGTATGTTCAAACTGTCATTTTATTTTTCCGCTGTC
-+
-67777788888888888888888877866555443221100/...-----,++**+*)*)))(((('"##"$#$#"
- at 30BB2AAXX080903:3:34:756:350#0
-ACGTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATCGCCCTNATACAGNN
-+
-677777888888888888888888777765554432221000/..--,,,,++****))))()((('"""#$#"""
- at 30BB2AAXX080903:3:43:815:1993#0
-AGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGAATGGGGGGGGTTTTGTATGTAGATCGGAAGGGGGGGGCA
-+
-677777888888888888888888777765554532..100//(.--),,,,+(**)()'(#((%%'$$%""""#"
- at 30BB2AAXX080903:3:56:1526:1336#0
-AGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGAATGGGGTGGGTTTTGTATGTAGATCGGAAGCACATCACA
-+
-67777788888888888888888877776555443212100//..--,,,++++**)))))(((('&$$&$"##$#
- at 30BB2AAXX080903:3:2:1212:283#0
-GTAGGAGTAGCGTGGTAAGGGCGATGGGCGTGGGGAGGAATGGGGTGGGTTTTGTGTGTTCAAATTGTNATGTCCA
-+
-677777888888'88.8,88888777(7$5354)3.2202/./(.+--+(,+++**))('#('(#%'$""&"##"#
- at 30BB2AAXX080903:3:48:338:835#0
-ATAGGTAGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGAATGGGGTGGGTTTTGTATGTTCAAGTACACTCT
-+
-67777288888888888884888877719535,4+2221*0/+,---,,++++))**))(((('#&#%""#"""#"
- at 30BB2AAXX080903:3:2:774:798#0
-TGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATCGCCCTTACCACGCTACTCCTNCCCACCC
-+
-67777788888888888888888877776555443212100//...--,,,++***)*)))(()(('""%$##$#"
- at 30BB2AAXX080903:3:38:101:1422#0
-GGAGATAGGTAGGAGGAGCGTGGTAAGGGCGATGCGGGTGGGGAGGGAAGGGGTGGGTTTTTGATCGCGAACTACA
-+
-67777788888888888888888877776553%4"2%1%/0//..-"+&,+,+%**)#(()#(#'#'&"#"$"##"
- at 30BB2AAXX080903:3:53:166:1405#0
-AAAGGGGAGATAGGTAGGAGGAGCGTGGCAAGGGCGATGAGGGAGGGGAGGAATGGGGGGGGGGATGGTGGGGATG
-+
-677777888888888888/8,8887777)5554432(2110//..---,,+*+***))#))(#&&%'&#"$#$"""
- at 30BB2AAXX080903:3:33:187:1565#0
-AAAAGGGGAGATAGGTAGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGAATGGGGTGGGTTTTNTTATCCNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((''('"""""##""
- at 30BB2AAXX080903:3:56:380:1065#0
-AAAAGGGGAGATAGGTAGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGGATAGATCGGAAGAGCGGGTACTC
-+
-67777788888888888888888877776+55443222100/..----,,++%**+)))()((((''%&#"""$"#
- at 30BB2AAXX080903:3:46:1066:1736#0
-AGATTATTAGTATAAAAGGGGAGATAGGTAGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGAAGCGCTNTCT
-+
-67777788888888888888888877776555443220100/..----+,,++***)*)))((('('"$&#""##"
- at 30BB2AAXX080903:3:52:1124:1136#0
-CACCCCATTCCTCCCCACACTCATCGCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATACTAAGCCGCACA
-+
-677777888888888888888888777765554&3222110//-.--++,+++****))))))((('$"$#$%#"#
- at 30BB2AAXX080903:3:34:110:464#0
-CCATTCCTCCCCACACTCATCGCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATAGATCGGANACGCACNN
-+
-67777788888888888888888837776555443222100//..---,,,,+***))))))(('('"$%##"#""
- at 30BB2AAXX080903:3:37:539:1043#0
-ATTCCTCCCCACACTCATCGCCCTTACCACGCTACTCCTACCTATCTCCCCTTTAGATCGGAAGAGCGTCGCCATN
-+
-67777788888888888888888877776555443222100//-.---,,++++***)*))(()(('$#""##"#"
- at 30BB2AAXX080903:3:46:69:748#0
-CTCCCCACACTCATCGCCCTTACCACGCTACTCCTACCTATCTCCCAGTTTATACTAATAGATCGGACGTGTCACA
-+
-67777788888882888881888877766+554332)2100///.-,+,,+,+**'))))*(()(''"""$"#"#"
- at 30BB2AAXX080903:3:48:1478:2035#0
-CAGAAATTAAGTATTGCAACTTACTGAGGGCTTTGAAGGCTCTTGGTCTGTATTTAACCTAAATTTCTCTCACTGC
-+
-677777888888888888888888777765/54432121/0-/..-,--,++**+*)&((((((((&$$"&##"""
- at 30BB2AAXX080903:3:33:14:352#0
-AAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTGTAACAGCTAAGANGCTCCGNN
-+
-677777888888888888888888777765/5443222100//..---,,+++***)*)))((''('""#"#%#""
- at 30BB2AAXX080903:3:50:1411:1901#0
-TAATTTCTGTAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTACACAGCGC
-+
-67777788888888888888888877776555443222100//..---,,++++***))))((((''"$"%""#"#
- at 30BB2AAXX080903:3:45:88:1797#0
-TAAGGGCTTAGCTTAATTAAAGTGGCTGATTTGCGCTCAGTTGGGGCAGAGTGGGGGATTGGTGTCCGTAAGACCA
-+
-6777778888888828888878887723.5644/3$2200.//,..)-,%,&+*+**)#))&&(('#$"#""""##
- at 30BB2AAXX080903:3:60:1442:1089#0
-AGTAAGGGCTTAGCTTAATTAAAGTGGCTGTTTTGTGTTTAGTTGATGGAGGGTGGGGGTTTGGAGTCCACACANN
-+
-677777888888888888885888777765$3443)0'1&0//-,'--',,(+$**))&((((##(#&&%%%$%""
- at 30BB2AAXX080903:3:41:812:687#0
-TAGTAAGGGCTTAGCTTAATTAAAGTGGCTGATTTGCGTTCAGTTGATGCAGAGTGGGGGTTTGCAGTCCTTAGCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))&*)(((''%'%&&%%#"
- at 30BB2AAXX080903:3:47:458:87#0
-CTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTAATTAAGCTAAGCAGATCTGGTC
-+
-6777778888888888888888887777655544322211///..---,,+++)***)))*)(((('"$#"$"""#
- at 30BB2AAXX080903:3:39:1111:330#0
-CATTGGTCTAGTAAGGGCTTAGCTTAATTAAAGTGGCTGATTTGCGTTCAGTTGATGCAGAGTGGGGTTTTGCACA
-+
-6777778888888888888888887777655542322210///..-,-,+++++*))*)*()#('('"&%&%$###
- at 30BB2AAXX080903:3:51:1251:670#0
-AAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTAATTAAGCTAAGCCCTTACTAGACCCACGTATAC
-+
-67777788888888888888888877776555.4300210///.-.-,,,++****)()))')('('"%$""""##
- at 30BB2AAXX080903:3:54:629:1186#0
-AAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTAATTAAGCTAAGCCCTTACTAGACCACTGGTCCT
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))()((''%$#$$"$#"
- at 30BB2AAXX080903:3:46:77:1630#0
-TTAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAAGATCGGAAGAGCGAGCCAGCC
-+
-67777788888888888888888877776555443221100//..---,,+++***)))))))((''$""#$""#"
- at 30BB2AAXX080903:3:34:1763:1024#0
-TAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGCTAAGCACCCNCGCAACNN
-+
-677777888888888888888888777765554432.2100//-.-,-,,,++*+*)*)))))((''""#%"#$""
- at 30BB2AAXX080903:3:43:397:1064#0
-ACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGCTAATCACCCTAATCAACTGGCTTCAATCTACT
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(((''&&$&&%#$$
- at 30BB2AAXX080903:3:37:896:467#0
-GGAGAAGTAGATTGAAGCCAGTTGATTAGGGTGCTTAGCTGTTAACTAAGTGTTTGTGGGTTTAAGTATCATTTTN
-+
-67777788888888888888888877776555443222100//..---,,+++*****))(((((''"#"""%"""
- at 30BB2AAXX080903:3:57:1211:65#0
-CGGCGGCGGGAGAAGTAGATTGAAGCCAGTTGATTAGGGTGCTTAGCTGTTAACTAAGTGTTTGTGGGTGTCACTC
-+
-677777888888888888888888777765555432221/0/..----,-,**'**)*()')(((('$&#"$##"#
- at 30BB2AAXX080903:3:48:1192:944#0
-CACAAACACTTAGTTAACAGCTAAGCACCCTAATCAACTGGCTTCAATCTACGTCTACCTCCGCCGCGCGCATACA
-+
-6777778888888888888888887777654-4/322210/.'..*--*,+$#*+*%))'&)((('&$$"$"#"##
- at 30BB2AAXX080903:3:56:1047:1363#0
-TTAGTTAACAGCTAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCTGCACCAA
-+
-677777888888888888888888777765554430211/0/./..--,-,++**))**('((((''&#%#"$#""
- at 30BB2AAXX080903:3:37:1724:47#0
-GGCTTCTCCCGCCTTTTTTCCCGGCGGCGGGAGAAGGAGATTGAAGCCAGTTGATTAGGGGGCGTAGCTCCTTCNN
-+
-677747.888888(83888888.89773644"0$'0#'/$#+.('+(($*$$'$&''')(#'#####$"##"$"""
- at 30BB2AAXX080903:3:52:1184:657#0
-TAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCGGGAGAAGCCCCGCGCGCCG
-+
-67777788888888888888888877776555443232100//..---+,+,+***)**))')('''$"$""%##"
- at 30BB2AAXX080903:3:51:1230:864#0
-ATATTGAATTGCAAATTCGAAGAAGCAGCTTCAAACCTGCCGGGGCTTCTCCCGCCTTAGATCGGAAGAGCCACTC
-+
-6777778888888888888888887777655544321210///..---,,,+++****))()((((("""#$"###
- at 30BB2AAXX080903:3:46:1668:1540#0
-TAAATCTAAAGACAGGGGTTAGGCCTCTTTTTACCAGCTCCGAGGTGATTTTCATATTGAATTGCAAACAGGTCGC
-+
-67777788888888888888888877776555443222100/...,--,-,+++*)**)(()((((%&$"$"##"#
- at 30BB2AAXX080903:3:8:1784:1757#0
-TTTGCAATTCAATATGAAAATCACCTCGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATCGNGACTCANN
-+
-67777788888888888888888877776555443122100//...--,-+,+***))*)())(((&""#%#"$""
- at 30BB2AAXX080903:3:44:1415:1957#0
-TTGCAATTCAATATGAAAATGACATCGGAGCTGGTAAAAAGAGGACGAACCCCTGTATTTAGATTTACAGTCGAAT
-+
-67777788888888888888%882567765.544202.010//-+(+-,%+'(***(*(*)))(&('&#&"#""#"
- at 30BB2AAXX080903:3:42:295:1373#0
-AAGCATTGGACTGTAAATCTAAAGACAGGGGTTAGGCCTCTTTTTACCAGCTCCGAGGAGATCGGAAGAGCGGCTC
-+
-67777788888888888888888877776555443211110//..--,,,,++*****))))(((''$$%"""#"#
- at 30BB2AAXX080903:3:49:1576:617#0
-AGTGAAGCATTGGACTGTAAATCTAAAGACAGGGGTTAGGCCTCTTTTTACCAGCTCCGAGGCGATTCTCACGATC
-+
-6777778888888888888888887777655544312110///..---,,+++***)))()(#(%&'$$%"#""""
- at 30BB2AAXX080903:3:57:369:435#0
-AATATGAAAATCACCTCGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$&%#&$$#"
- at 30BB2AAXX080903:3:33:190:1463#0
-CTCGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTCAGCCANCGACACNN
-+
-67777/888888888888888888777715553432201/0//.---,,,+++*****)))))(('&"$""%#$""
- at 30BB2AAXX080903:3:49:1021:1332#0
-TCGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTCAGCCATGTTATCCTA
-+
-67777788888888888888888877776555443222000///.-,++,+++**)**))())('''"$###$$##
- at 30BB2AAXX080903:3:42:893:907#0
-GGTGAGGTAAATTGGCTGAGTGAAGCATTGGACTGTAAATCTAAAGACAGGGGTTAGGCAGATCGGAAGAGGGATT
-+
-67777788888888888888888877776559443222100//..--,-,-++***)*)))))(((&'$##"""""
- at 30BB2AAXX080903:3:53:849:2016#0
-CATCAGTGGGGGTGAGGTAAAATGGCTGAGTGAAGCATTGGACTGTAAATCTAAAGACAGGGGTTAGGCCCGCCAC
-+
-677777888888+888888888887'1765+5443+22100/...---,,+++*+**')))))'(('$##""##"#
- at 30BB2AAXX080903:3:45:127:30#0
-CGGCGAACATCAGTGGGGGTGAGGTAAAATGGCTGAGTGAAGCATTGGACTAGATCGGAAGAGCGGGGACCGCGTC
-+
-677777888888888888888888777765554430221/0//..---,,+,++(')*#))()(('&""#$"$#"$
- at 30BB2AAXX080903:3:40:352:1876#0
-TGTCTTTAGATTTACAGGCCAATGCTTCACTCAGCCATTTTACCTCACCACCACTGATGTTCGCCGAGCGCTGAGT
-+
-67777748888888888%88888877776551442220100/,,,+,+,&++****('*(('(((('"%""%"#""
- at 30BB2AAXX080903:3:3:164:593#0
-TTTAGATTTACAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTAGATCGGAAGCNCGCANCA
-+
-67777788888888888888888877776552443221010./.--,-,,+++***)*)))))((''%"#"#$"$$
- at 30BB2AAXX080903:3:54:403:464#0
-TTAGATTTACAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGACGTTCTCCGAGATCGGGCGGGCCT
-+
-677777888888'8888888888877716+5144321'000//.'--),(+'(***)$)(((&('(%""#&%#"#"
- at 30BB2AAXX080903:3:42:768:1099#0
-ATTTACAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTCGACGCACGTTGCCTATGTCATCN
-+
-677777848888888888888881774763555132201&../-.-,+,+$,+*#')$#))#(((&''%"##"%$"
- at 30BB2AAXX080903:3:40:1342:1732#0
-CAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCAACTGATGTTCGCCGACCGTTGACTATAGATCTGAGTGT
-+
-67777788888882888888888877776555412222100//-..,-,+,++)**))))))(((''$%&&$"$##
- at 30BB2AAXX080903:3:47:1572:1922#0
-CAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTCTCTATG
-+
-67777788888888888888888877776555443122100/....--,,,+++**))))()(((''&###$"""#
- at 30BB2AAXX080903:3:50:61:1006#0
-TGTGGTTTGTAGAGAATAGTCAACGGTCGGCGAACATCAGTGGGGGGGAGGTAAAATGGCTGAGTGAAGCCACGAG
-+
-67777788888888888888888877776555442222100//..-*-+,+%+***)))()(((('(""#""#"""
- at 30BB2AAXX080903:3:45:1090:1187#0
-CCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACCCCCCAGCG
-+
-6737738888888888888888887725+3554430)2&/0./-..+-,++,)&+)()&()((((&%$#"#%"#""
- at 30BB2AAXX080903:3:50:585:1947#0
-ACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGCCACTGGA
-+
-67777788888888888888888877776555443222120//...--,,,*++**))*)()((('("#$"$#""#
- at 30BB2AAXX080903:3:49:53:1508#0
-TTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGACATTGGAACTACACCAC
-+
-67777788888888888888888877776555443222100//..,.-,,+++*+**))))((((('%""#"###"
- at 30BB2AAXX080903:3:48:538:966#0
-CCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGGTCGGCGAACATCCGTTGCA
-+
-67777788888888888888888877776555443222100//...---,,+++**)()))((((&'&&#&"""#"
- at 30BB2AAXX080903:3:38:801:238#0
-ACTGATGTTCGCCGACCGTTGACTATTCTCTACAAAACACAAAGACATTGGAACACTATACCTATTACACGACCNN
-+
-64777382888880888888888,76+765+5443.)2100/.----(,,+,+***))()()(((&'&"%#"#"""
- at 30BB2AAXX080903:3:42:47:418#0
-TGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGACATTGGAACACTATACCTATTATTCCGCACTGC
-+
-67777788888888888888388877776555441222110//..---,,+*+)**))()))((''&"""#"#""#
- at 30BB2AAXX080903:3:57:730:1510#0
-CTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGAGATCGTGAGAC
-+
-67777788888888888888888877776555443222100//...--,,+++***)*))()(((''"%%$##"##
- at 30BB2AAXX080903:3:44:1477:365#0
-CGCCGACCGTTGACTATTCTCTACAAACCACAAAGACATTGGAACACTATACCTATTATTCGGCGCATTCGTCCGT
-+
-67777788888888888886888876776555443222100//..---,,,++**))*))))()((("$""""#""
- at 30BB2AAXX080903:3:39:1156:1677#0
-CTCCAGCTCATGCGCCGAATAATAGGGATAGTGTTCCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGCGCACC
-+
-67777788888888888888888877*76555443032000/...--,,,,++++*)*)))()('&'''%$%$###
- at 30BB2AAXX080903:3:36:214:1816#0
-AGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTTTCACGCGCNN
-+
-67777788888888888888888877776555443222100//..---,-+,+****))))((((''&$$"$##""
- at 30BB2AAXX080903:3:2:1682:418#0
-GAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTAGNACGACAC
-+
-67777788888888888888888877776555443222100./..-,--,,*+*+*)))))()((''%"""#####
- at 30BB2AAXX080903:3:2:1372:359#0
-AGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCNGNCACAC
-+
-6777778/8888888888888886767765555423202$0/.,..,--,+'+**)())(&'(('''&"&"%%###
- at 30BB2AAXX080903:3:39:1040:410#0
-CACAAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAACCCTCCTTC
-+
-67777788888888888888888877776555443222100//...--,,+,+*****)))))((('"$%&&%%#"
- at 30BB2AAXX080903:3:39:1680:1963#0
-CGAATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCAC
-+
-67777788888888888888888877776555443221100//-.-,-,,+++*+*)*)))(((((%&&#%$#%"#
- at 30BB2AAXX080903:3:52:20:726#0
-GACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCCTGTTCAGT
-+
-67777788888888888888888877776555443222100//..--+,,++++**)**(((((((%&$"&#$"""
- at 30BB2AAXX080903:3:3:909:532#0
-CTCGGCTCGAATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTGATGAGATCGGAAGCGCGGGTCNACAANAA
-+
-6077778888888888888888887747635'44322110,.+..+-,-,*+*)#**#))#&('(#'""##"#""#
- at 30BB2AAXX080903:3:3:179:1209#0
-GCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATANCGACNCC
-+
-6777778888888888888888187797652534322-00///.,.,,+-+++***)*())'('(#'$"%"##""#
- at 30BB2AAXX080903:3:44:1147:1236#0
-GGCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAGATCGGCCGGGCG
-+
-677777888888888888888888777765524132221000/..---,,++++***)))))((('''&"#"""##
- at 30BB2AAXX080903:3:35:1596:2018#0
-TACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCNGGCTGACN
-+
-67777788888888888888888877476/./843.,,11,+.),,,'+++(%+')(#'&(#&&%&#"""$""##"
- at 30BB2AAXX080903:3:39:908:1960#0
-TACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCAGATCGGAAGAGCGGATCCGTCTG
-+
-677777888888888888888888777763/5343021201/..,,,*+,+'****'*)('(((#('"&%%%##$#
- at 30BB2AAXX080903:3:40:680:1828#0
-TATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCAGATCGAC
-+
-6777778888888888888888887777655544322210.//.---,,,+++***)())(((((('&""#$&%##
- at 30BB2AAXX080903:3:47:667:1328#0
-TATTATTCGGCGCATGAGCTGGAGGCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCACGTCAGC
-+
-677777888888888888888888777765554432-21000/..-,-,,,+++*)()()&))&(''""#$##"""
- at 30BB2AAXX080903:3:51:257:683#0
-GATTCGGCGCATGAGCTGGAGGCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCGGGGCCAGTTGCATAG
-+
-677777888888888888888,8877776555443222101/&..,,,,,++***)*(*)('((#'&$"""#""##
- at 30BB2AAXX080903:3:35:1366:1330#0
-ATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGNCTGTCTGN
-+
-6777778888888888888838887777655541322212///..----,+++***))((('(&'&'"&&&&$#""
- at 30BB2AAXX080903:3:35:986:1201#0
-AAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTNCTCTCCAN
-+
-677777888888888888888888777765/544322210//...--,-,,+++*)))((((((((("$#%"$##"
- at 30BB2AAXX080903:3:37:555:1743#0
-GCGCAGGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCCCCATCTN
-+
-6777778888888888888888887777465141*.-0+//..---,,,++)++**(*)%(((('''$"##$$##"
- at 30BB2AAXX080903:3:39:1568:407#0
-CCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGCTGTGAGATCGGAAGAGCGCGGCC
-+
-67777788888888888888888877776555443-/0000/...,--,,++**+)*)*)'(((&''"%"%$#"##
- at 30BB2AAXX080903:3:4:238:855#0
-ATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCNCTCANAN
-+
-677777888888888888888888777;655348322210//..---,,+,++*)))*((()((('%%"#"&#"""
- at 30BB2AAXX080903:3:35:1230:663#0
-TGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTCGGCCAGCCAGGCAACANCCCTCCAN
-+
-6777778888+888888888888877736)51443212100/.-),.-,-&++*#)*&)()&(((''"$%#"$$#"
- at 30BB2AAXX080903:3:59:1168:1739#0
-TTACCTAGAAGGTTGCCTGGCTGCCCCAGCTCGGATCGAATAAGGAGGCTTAGAGCTGCGCCTAGAGATCACACGC
-+
-677.7.88-88888888888882,2%7,60/.30*%2-&'&+.&.,--&++'+$*&))'(#'(#(&'%"$"$&%"#
- at 30BB2AAXX080903:3:3:1564:1104#0
-GCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCCNCATANGN
-+
-67777788888888888888888877776542423222,0/0.+---+,-*+**)*())'''#''&&$"####"""
- at 30BB2AAXX080903:3:34:1627:1973#0
-TGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTANGGCTAGNN
-+
-677777888888888888888888737765554412220201/--..-+++,'*)**'((##'''''"""%"#"""
- at 30BB2AAXX080903:3:39:1438:1738#0
-TGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTACCCNA
-+
-67777788888888888888888877776555443222000-/..---,,,+***))*)''((((('"%%%$#""#
- at 30BB2AAXX080903:3:58:700:1027#0
-GTCGTTAACTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGATTAGAGCTGTGCCCATGCACTCC
-+
-6777278/88881888*888837876-7655644*.00/#,'#*',-+-+,*+&)')))&'(#(##%""%%"$###
- at 30BB2AAXX080903:3:43:1426:1344#0
-GAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTCATAGGTAGCGCGTA
-+
-67777788888888888888888877776555343222110/-.-.+,$,++*)+()(#)'#&(&&%""#%%"""#
- at 30BB2AAXX080903:3:55:512:1206#0
-TGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGATCGNGAGCGACG
-+
-67777788888888888888888877776555443222100//..-,--,++++**)*)))(()((&"&$&""##"
- at 30BB2AAXX080903:3:47:226:570#0
-GATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGCTGTGACCAGT
-+
-67777788888888888888888877776555443222100//..---,,++++**)))()((('''$$%"####"
- at 30BB2AAXX080903:3:2:743:1397#0
-GTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGACNCGTGACA
-+
-6777778888888888888888887/776555441220./.-.+-.-,),*%)')*))'()%#''&'""$$""$""
- at 30BB2AAXX080903:3:46:665:230#0
-TGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGCGAGGTGCG
-+
-67777788888888888888888877276555443222000+//+--,,+,+'))))))())'#'&'$""""####
- at 30BB2AAXX080903:3:8:1383:1016#0
-CACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACNTCTACTNN
-+
-6777778888888888888888887777655544322210..-..-+-,,*++**))))('(('%&'""$""#"""
- at 30BB2AAXX080903:3:37:1138:1483#0
-ACGTGGTAGATGTGGTCGCTACCTAGAAGGCTGCCTGGCGGGCCCAGGGCGGCTCGGATAAGGAGGGCTNGNCGCN
-+
-677057888/88888888/88188773763''4232221&0//)-,-)&+++((')))((((('((#%$"&"##""
- at 30BB2AAXX080903:3:43:162:1401#0
-TAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAGATTGGAAGCGCGGGTT
-+
-67777788888888888888888877776555443212100//.,--,,-,*+***))()('#('''&"%""""""
- at 30BB2AAXX080903:3:50:1229:481#0
-TAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCAGATCGGAAGACCCCNCCT
-+
-677777888888888888888888777765554432221000/..-,+,,,+++***'*(')(((%'$"""$"##"
- at 30BB2AAXX080903:3:54:743:78#0
-TCTAAGCCTCCTTATGCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGGAACGACCACATCTACGTCGGTACT
-+
-677777888880188%8888848877-7653544122110./..,++&'+,$*)')*)('((#''#%""$"$"""#
- at 30BB2AAXX080903:3:52:263:1742#0
-CGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGCTGCNTGC
-+
-67777788888888888888888877776555443022000//..--+,,*+)*)**(&()''''''"$"#$""##
- at 30BB2AAXX080903:3:1:486:576#0
-TAAGCCTCCTTCTTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACNGANCACT
-+
-67777788888888888858888877776355-8322.10/-/.--,,-,,++**)()())()('''&""""$###
- at 30BB2AAXX080903:3:46:1637:1322#0
-TAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACAGATCGGACCAGTTCTC
-+
-6777778888888888888888887777655544322210///..---,,,++***)*)))))('('"""$#####
- at 30BB2AAXX080903:3:36:1640:417#0
-TGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCCGNGTCACGNN
-+
-6777778881888888888888887877655145323210../..+,-,,-+)+*&))#)()(#'#'"""%#$"""
- at 30BB2AAXX080903:3:54:256:1201#0
-TGTGACGATAACGTTGTAGATGTGGGCGTTACCTAGAAGGTTGCCTGGCTGGGCCCGCTCGGCTCGCGNATGGATA
-+
-6777778888888888888888887%77'57-4/320.10#./#.',-+(++%()#((#&#(###'%""#"#""#"
- at 30BB2AAXX080903:3:41:1234:1246#0
-CTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCTTCCACA
-+
-6777778888888888888888887/776525243.1/0110..-.,,-++++*)*())((((('''$%""###""
- at 30BB2AAXX080903:3:44:1669:1394#0
-CTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTAGTGGTGACT
-+
-67777788828888888838888/777764554332%/.011-.,,-,,-**+**))()(()&(&''"#&#"""#"
- at 30BB2AAXX080903:3:1:1244:906#0
-GGGCTGTGACGATAAAGTTGTAGACGGGGCCGTTACCTAGAAGGTGGCCTGGCTGGCAGAGCGGAAGANACNCAGC
-+
-677777888888888&8-088888$7$76'754$30-21/)//.,+*,,,+,+&'*'()('&((%&'&"$$"##""
- at 30BB2AAXX080903:3:42:1260:86#0
-ATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCCCGAGCACAGCG
-+
-677777888888888888828888777745514432121..//..-)++-+&++****)*)'((#('"&%###"##
- at 30BB2AAXX080903:3:2:304:203#0
-TTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCAGANCGCNNAC
-+
-6777778888888888/48886887871.575141520101/..-,,--+++***))()))')''''$"#&""""#
- at 30BB2AAXX080903:3:38:1053:520#0
-TTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACCGCTCCTCT
-+
-67777788888888888882888377776552412220100/...---,,+++***)()))((((''"$%"&"#$#
- at 30BB2AAXX080903:3:46:136:456#0
-GCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGGCTGGCTGGAGATCGGGACCACGGG
-+
-677777888888888888888888777765554422221(0//..---),++++**))))#()(('&$"#$#%""#
- at 30BB2AAXX080903:3:50:490:337#0
-GCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGCCCACCG
-+
-67777788888888888888888877776555413212100/..-.--*,,,+)+**())'))'('%"#"#""##"
- at 30BB2AAXX080903:3:35:487:455#0
-TGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCNCCATATCN
-+
-6777778888888888888888287777655544102020./,..--,,$,,')*)*((()'#('&'""$""###"
- at 30BB2AAXX080903:3:46:497:1571#0
-TGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGGTGCCTGAGATCGGAAGAGTGTGGGTG
-+
-6777778888888888888888887777655544222210,....---,&,+)**))*((#))''(&'"""$""""
- at 30BB2AAXX080903:3:4:1621:1090#0
-CGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCNCCTANCN
-+
-67777788888888888888888877776559442202200./.-,,,+,,+++*&)))((''('''""#"%""""
- at 30BB2AAXX080903:3:52:417:1814#0
-GAGCCGAGCTGGGGCAGCCAGGCAACGGTCTAGGTAACGACCACATCTACAACGTTATTGTCACAGCCCCGGGAGC
-+
-677777888888888888.888$877($6'52-4.32'10/1/.,+&+,+,)'+**)*%)'()(&'#%##""#$"#
- at 30BB2AAXX080903:3:35:262:1346#0
-GAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGNCCTCTCGN
-+
-67777788888888888888888877776555443222100//..---,,+,++***))))(()(('""$##"#""
- at 30BB2AAXX080903:3:53:124:1929#0
-ATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGATCTG
-+
-67777788888888888888888877776555443222100//..-.-,,+*++****))'))%(''$""%###"#
- at 30BB2AAXX080903:3:42:636:1959#0
-AGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATAGATCGGAAGAGCGAGACAC
-+
-67777788888888888888888877776555442222100//-.-.-,,,++*+**)))'(('(((&&%#$"#"#
- at 30BB2AAXX080903:3:37:611:1961#0
-GAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGATCCCAATCN
-+
-67777788888888888888888877776555443222200//..---,,+++***)*)))))((''"$$##""#"
- at 30BB2AAXX080903:3:57:1032:83#0
-GCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCACACA
-+
-67777788888888888888888877776555443222100//..---,,+,++*+))()()()(((&&&%$$$#"
- at 30BB2AAXX080903:3:34:1365:178#0
-TACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTNCTCGTCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('"""#"#$""
- at 30BB2AAXX080903:3:45:791:1839#0
-ACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCGTAGTAAA
-+
-677777888888888888888888777765554432/00-//..--,-,,,)+*)*))))(%(((('""#"&$$""
- at 30BB2AAXX080903:3:1:160:605#0
-TAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAAGATCGCNCANCACA
-+
-67777788888888888888888877776555413222000//./---,-+*+***)*))))()('&""%""#""#
- at 30BB2AAXX080903:3:1:1672:271#0
-ACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACACNCCNTACA
-+
-677777888888888888888888777;65522432/2100/./.----(+,**+')**))))(('#'"%#"##""
- at 30BB2AAXX080903:3:56:996:480#0
-CACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCCATCAGATCGACGC
-+
-67777788888888888888888877776555443222100//..---,,++++**))))))))(('&&#%""$""
- at 30BB2AAXX080903:3:37:685:525#0
-AAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACTGTCTCN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('$$%%"#"#"
- at 30BB2AAXX080903:3:3:273:607#0
-AGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTANNGACNAG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*))(((''$""##$"#"
- at 30BB2AAXX080903:3:34:1403:1812#0
-GGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAANCCCACTNN
-+
-677777888888888888888888777763554(322210-//..,---,+++*****)))))'((("$$$#%"""
- at 30BB2AAXX080903:3:58:1136:1196#0
-AGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGACATCA
-+
-677777888888888888888888777765554432221000/..---,,+++***)))))(((((&'&%"#$"#$
- at 30BB2AAXX080903:3:51:1018:1423#0
-TTAGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACACATGTACC
-+
-67777788888888888888888877776555443222000//-.----,,+++****))))))(('%$$#"####
- at 30BB2AAXX080903:3:36:369:1488#0
-TAATAATCTTCTTCATAGTAATACCCATCATAATCGGAGGCTGTGGAAACTGACTAGTTCTCCTAATCNCACATAN
-+
-67777788888888888888888877776555443222100/..,-$---,++***)'))%(()'('$"##%""""
- at 30BB2AAXX080903:3:34:589:162#0
-GGGGGCACCGATTATTAGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGNATACGCNN
-+
-677,778888288888888888887777655544322200///./-,,--++*++**))())((((("$"##"$""
- at 30BB2AAXX080903:3:45:94:1006#0
-GGGGGCACCGATTATTAGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGCAGAGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((('(&&"&#$#"""
- at 30BB2AAXX080903:3:48:1526:961#0
-CATAGTAATACCCATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTAGATAGACACTACTA
-+
-677777888888888888888888777765554432+110,//..---,,+++***)')))((((%'"$"#""###
- at 30BB2AAXX080903:3:59:960:752#0
-GTAACACCCATCATAATCGGAGGGTTTTGCAACTGACTAGTTCCCCCCATAAACACAGCCCCACACCAGCACAACA
-+
-67777788888388888,88).8(-.3$)$$)$$+$##$#####%&"#&$&$#$########%#&##$"%$%#$$#
- at 30BB2AAXX080903:3:37:992:1531#0
-ACCCATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATGGCGTGTCCGCAN
-+
-67777788888888888888888877776555443221001//....-,,,*+**))))((((((''""$#$"#$"
- at 30BB2AAXX080903:3:41:708:1809#0
-TCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTAGATCGGGAGAGCGGTTTATCAGCCCTAC
-+
-6.07/784884888+8888&8.)0#2279/)32&-$/-../-,#+.()+()')(#%'#)&'''%###%""###""%
- at 30BB2AAXX080903:3:57:1145:842#0
-GAGGTAAGAGTCAGAAGCTTATGTTGTTTATGCGGGGAAACGCCATATCGGGGGCACCGATTATTAGGTGTCATCG
-+
-67777788883888888888888877776555443222100//..,.--,+++****))(()(((('$&&"$###"
- at 30BB2AAXX080903:3:44:1138:131#0
-GAGAGGGAGGTAAGAGTCAGAAGCTTATGTTGTTTATGCGGGGAAACGCCATATCGGGGGCACCGATTATTAGGGG
-+
-67777788884888888888888877776555443222100//.----,,,++**+*)))(()((''""$$$%%#$
- at 30BB2AAXX080903:3:52:1292:924#0
-GAGAGGGAGGTAAGAGTCAGAAGCTTATGTTGTTTATGCGGGGAAACGCCATATCGGGGGCACCGATTATTAGTTG
-+
-67777788888888888888888877776555443222000///.-----+++****)*))))('('"#%&%&""#
- at 30BB2AAXX080903:3:54:1266:181#0
-TAATCGGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCCGCCCGGAC
-+
-6777778888888888888888887777655533322.10//./,.-,,,+,***)*))((((((&'"%""#&$$#
- at 30BB2AAXX080903:3:43:1141:217#0
-AATCGGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((''$&&&&%$$%
- at 30BB2AAXX080903:3:55:417:996#0
-AATCGGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCACTCTATGCCTGTG
-+
-67777788888888888888888877779550432202000%//,,(,-,+**+*)))(())%('('$""$"%#"$
- at 30BB2AAXX080903:3:44:101:650#0
-ATCGGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTCCCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))('(&'%&%""""#
- at 30BB2AAXX080903:3:37:1389:523#0
-GGAGTAGGAGAGAGGGAGGTAAGAGTCAGAAGCTTATGTTGTTTATGCGGGGAAACGCCATATCGGGGTCACACTN
-+
-67777788888888888888888878776565442222000./..---,,,++***)**)((((('#%##$$&%#"
- at 30BB2AAXX080903:3:53:1503:1833#0
-GGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCTCGCCAGATG
-+
-677777888888888888888088977765551430221000/.---,*,,+++))))())((('(#""$#&#$##
- at 30BB2AAXX080903:3:47:1379:503#0
-CCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTNCCACACA
-+
-67777788888888888888888877776555443222100//..,--,,,,+****)))))))(('""$%#%%#$
- at 30BB2AAXX080903:3:44:1268:513#0
-GATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACAGATCGGACNCGCCG
-+
-67777788888888888888888877776555443222100///.---,-,,+*+**)))))(((''&$#"#"#""
- at 30BB2AAXX080903:3:3:1499:686#0
-GGCGTTTCCCCGCATAAACAACATAAGATTCTGACTCTTACCTCCCTCTCTCCTACTCCTGCTCGCATNAGCANAN
-+
-677777888888888888888888777%654544322200..-.-,+,-,+++**)*)())))(((($"$$$#"#"
- at 30BB2AAXX080903:3:58:1216:987#0
-ACTATAGCAGATGCGAGCAGGAGTAGGAGAGAGGGAGGTAAGAGTCAGAAGCTTATGTTGTTTATGCGTGTCAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(()'('$&%"%"%$$
- at 30BB2AAXX080903:3:35:825:1571#0
-CTCCACTATAGCAGATGCGAGCAGGAGTAGGAGAGAGGGAGGTAAGAGTCAGAAGCTTATGTTGTTTNCGCATTAN
-+
-67777788888888888888888877776555443222100/..-----,,++*****)))))((('"$"$#""""
- at 30BB2AAXX080903:3:36:435:1656#0
-TTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGCAGGAGTAGGAGAGAGGGAGGTAAGAGTCAGACTCCACTTAN
-+
-67777788888888888888888877776555443222000//..---+,+++****))))))('(#"$"#%#"""
- at 30BB2AAXX080903:3:38:88:196#0
-TAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAGCGACACACNN
-+
-67777788888888888888888877776555443222100//..---,,,++***))))((((('%"""$$##""
- at 30BB2AAXX080903:3:43:1050:857#0
-CTTCTGACTCTTACCTCCCTCTCTCCTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAAGATCGGGAGGNGCT
-+
-67777788888888888888888877776555443222100//..---,,+++***))))(((((('&$$&""%#"
- at 30BB2AAXX080903:3:55:1633:265#0
-TTCTGACTCTTACCTCCCTCTCTCCTACTCCTGCTCGCATCTGCTATAGTGGAGGAGATCGGAAGAGCAACACAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&'&&&%$$##
- at 30BB2AAXX080903:3:37:1273:1398#0
-CTGACTCTTACCTCCCTCTCTCCTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACACGGGGCACN
-+
-67777788888888888888888877776555443222100//-.--,,,,++)++*))((()'(#'$&#####$"
- at 30BB2AAXX080903:3:2:1503:893#0
-TGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGCAGGAGTAGGAGAGAGGGAGGGANCGCACAC
-+
-67777788888888888888888878776555443302/101/./+,,,++$*+*'*)*'(()#((#%""""&$$$
- at 30BB2AAXX080903:3:40:214:1297#0
-AGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGCAGGAGTAGGAGAGAGGGCGTGACAAA
-+
-67777788888888888888888877776555443222100//..--,,,+++****)))))((''&'&""##""#
- at 30BB2AAXX080903:3:1:854:1236#0
-AGGGAGGGTAGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGCAGGAGTAGTNGCNCACC
-+
-67777788888888888813888873776555443212100...--,-,,+*++****(())((&&'"""#"$#$#
- at 30BB2AAXX080903:3:35:435:1046#0
-AGGGAGGGTAGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGATCGGAAGANGTCATCTN
-+
-6777778838888888888888887748652331521120.-..-+-,+,,+**'*()(''(('(''"""####""
- at 30BB2AAXX080903:3:3:830:1973#0
-CTAAGGGAGGGTAGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGCAGGAGCNCGCNNAT
-+
-6777778888888888888488883771655342020/1/0*..-.+++++++*('*()')(&((%'""%#"""""
- at 30BB2AAXX080903:3:59:764:951#0
-TCCTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTACGTAC
-+
-67777788888888888888888877776555413222100//-.---,,,+++***)*))((((''&%%$%"""#
- at 30BB2AAXX080903:3:54:1254:1712#0
-CCTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCCGCTCGTCA
-+
-67777788888888888888888877776555-43202100//.-.---,+,+****)*)(()(('&$%#""""##
- at 30BB2AAXX080903:3:42:1039:1366#0
-CTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCNACCCTCCCTTAGCAGGTC
-+
-6777778888888888888888887777655184322-/00//----)-,,+****)#)(()'((('&"&&###"#
- at 30BB2AAXX080903:3:60:917:627#0
-TAGTTCCCTGCTAAGGGAGGGTAGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGCGCGANN
-+
-6777778888888888888888887777655544322210///.----,,,+++***)))(()('''%$$%%$#""
- at 30BB2AAXX080903:3:37:988:540#0
-GTAGTTCCCTGCTAAGGGAGGGTAGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGATCATN
-+
-67777788888888888888884877776555443222200//..---,-+++**+*)*())()((%"&%$$%%#"
- at 30BB2AAXX080903:3:53:473:1973#0
-CTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTAGCAGGCTATCATC
-+
-67777788888888888888888877776/5544322.000-/.--,,,,+,*)*))))('(()'''$""#$###"
- at 30BB2AAXX080903:3:59:559:1866#0
-CTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTAGCAGGTGCAACAG
-+
-67777788888888888888888877776.5124312-000*/.,.+,,,*,+)***()(((%(&'''""#"#$$"
- at 30BB2AAXX080903:3:33:1458:593#0
-GGGTGGGAGTAGTTCCCTGCTAAGGGAGGGGAGACTGTTCAACCTGTTCCTGCTCCGGCCCCCACAGNTACATANN
-+
-677377888888888888888.88777765$5441/2-111/+.,.-,+,***)))))((&'(&'%#""#$$""""
- at 30BB2AAXX080903:3:42:1322:848#0
-TCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCCCCCTG
-+
-67777788884888888888888877778.55,4322000////-.-+,,,*+**+()))()(((''&$$#$%"##
- at 30BB2AAXX080903:3:55:1303:691#0
-TCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTACACTGTTCAACCTGTTCCTGCTCCGGCCTCACNCATTCAC
-+
-6777778088888888888888887777655544*2121/0*/+--++,,)+*)*)()')(('#''#$""$""#""
- at 30BB2AAXX080903:3:44:55:294#0
-AGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCAGAGCGGTAGA
-+
-677777888888888888888888777565554432.2100//..--,+,+++*+****)))(((('&"%&$""""
- at 30BB2AAXX080903:3:4:950:976#0
-GGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGTGGGTAGACTGGTCAACCTGTTCCTGCTCCGANTTCANCN
-+
-677777888888818888838888577765531432#210&./.---',,,*()'*()''((#'#''$"""$#"#"
- at 30BB2AAXX080903:3:36:1168:1309#0
-TACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTAGACTGTTCAACCAGATCGGAAGCTGCCACAN
-+
-6777778888888888888888887/7765554422221/0//,.---,,+++*+*'()))(()#('%"%""###"
- at 30BB2AAXX080903:3:57:1531:568#0
-TACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTAGACTGTTCAACCTGTTCCTGCACACAGCACA
-+
-6777778888888888888888887777655544+222100//..--,,,*++****)))))(((('$$%&#"###
- at 30BB2AAXX080903:3:57:165:1536#0
-TACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGGAGACTGTTCAACCTGTTCCTGCTCCACCCGCA
-+
-677777888888,888888888287771655544+3221*0//+--,*,,$+))*'(((%('(('''&&"$"""$"
- at 30BB2AAXX080903:3:1:1406:1095#0
-TTAGGTCTACGGAGGATCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTAGAATGATCAATCTGGCNTCNCTCG
-+
-677777888888888&88868-8+*777655-40321/&1/).,--((,,&++*''*(#('&#'%'#%"##"$%$#
- at 30BB2AAXX080903:3:3:857:183#0
-CAGGAACAGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACNTCACNCN
-+
-6777778888888888888888887777955541321200///..,*,-,*+++**)')((((('(''"#&%#"$"
- at 30BB2AAXX080903:3:46:206:1832#0
-ACAGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCT
-+
-67777788888888888888888877776555443222100//..---,,+++**+*)*))((((('&&$"&%###
- at 30BB2AAXX080903:3:46:369:828#0
-CAGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCACCTCTAG
-+
-6777778888888888882880887777655504/02.11//..,-,,,+,'+*))*$(((&'((&%$""%###"#
- at 30BB2AAXX080903:3:52:1100:878#0
-AGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCAGATCGGAAGAGCGCGAGATC
-+
-67777788888888888883888877776555443222200//-..--,,*,++*)*&))))(((''%%#""""#"
- at 30BB2AAXX080903:3:46:346:359#0
-GGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAAGATCGGAAGAGCGGGTCACGAGTCTGC
-+
-6777778888888888888888887777655544302210///.'.-),,-+++*)*)))())#(('%"#""#"##
- at 30BB2AAXX080903:3:58:1385:723#0
-AAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTAGACTGATCACA
-+
-6777778888888888888888887777655544321210//...*,+,,+,+*)*)**())(#(('$$%##$$$%
- at 30BB2AAXX080903:3:34:1668:795#0
-TAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGGAGNTCTACTNN
-+
-6777778888888888888888887777655544322.100//..-,-,+,,+***))*)))((&('"#$"###""
- at 30BB2AAXX080903:3:50:1187:1260#0
-ACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTGACACT
-+
-67777788888888888888888867776355443022100//-.---,++++***)*&)*)(((('$%#"#$#$"
- at 30BB2AAXX080903:3:41:1274:1572#0
-GGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGCTTGACTTC
-+
-67777788888888888888888877776555440*11100-/..,-,,,&,)''*)('%()(('('"$"""%""#
- at 30BB2AAXX080903:3:47:783:1424#0
-GGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTCATAGCG
-+
-67777788888888888888888877776555443221100./...-+,,,,****))*(())('(($"$""""""
- at 30BB2AAXX080903:3:59:926:588#0
-CTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGTGGCGTCC
-+
-677777888888888888888888477763554432021/0..----',,,*+)**()(((()((&&'"""#""##
- at 30BB2AAXX080903:3:45:1637:86#0
-ACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTAGATCGGCGTAG
-+
-6777778888888888888888887775655.440222/00.,,-,-,),*+*())'$((((''(''"$%""""#"
- at 30BB2AAXX080903:3:47:205:443#0
-ACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTGAGGGGAGG
-+
-67777788888888888888888877776553443222100//...--,,++++***)(()()((('$$$"#"#""
- at 30BB2AAXX080903:3:36:18:269#0
-CCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCAGANTCTCATGN
-+
-67777788888888888888888877776555443222000//.+----,++++**)))))(()(('""$###"""
- at 30BB2AAXX080903:3:3:1006:1559#0
-CTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTAGCACNTCCANAC
-+
-67777788888888888888888877776555443.2210/1.---.,,,+++*+*)(*(((('(''"""#"#"##
- at 30BB2AAXX080903:3:50:115:49#0
-TTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTAGATCTGTGGTGCT
-+
-67777788888888888888888877776555443222100./..---,,+++***)))))((('''$$#"""#$"
- at 30BB2AAXX080903:3:53:44:1998#0
-AGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGCGTGGTTGAGTGTGTA
-+
-67777-88888888,88)8/8188&7776525113222+'//,,/--+%+*')*+)%))(#)'#&%#""$###""#
- at 30BB2AAXX080903:3:43:958:344#0
-GATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGACTCCT
-+
-6777778888888888888888887777655544232210///-.---,,+,+*+*)(*))'(((('""%"%####
- at 30BB2AAXX080903:3:50:217:332#0
-GATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGCAGCTCGGC
-+
-67777788888888888888882857776554443222100//..---,,+++***)))))&(('&&&%#%"$""#
- at 30BB2AAXX080903:3:51:566:1759#0
-AGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGAGATCGGAGGGCTCGC
-+
-67777788888888888888888877776555443222100//...--,,+++*++*)&)())('('""""$#"##
- at 30BB2AAXX080903:3:41:823:1457#0
-TAAGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAAGATCGGCAGCACTG
-+
-677777888888888888888888777765554422201000/-.--,,-++++**())(())((''"$"#""$""
- at 30BB2AAXX080903:3:8:773:1334#0
-TAAGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGNCATCACNN
-+
-67777788888888888888+88877776655443222100%///..-+,++*+*+))))((((#'&"$""%$#""
- at 30BB2AAXX080903:3:33:179:1759#0
-AACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTAGCAGGTGTCTCCTNTCTAGTNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))()((((('""%$#"#""
- at 30BB2AAXX080903:3:43:1414:1126#0
-CTAAGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTAAGATCGGAAGAGCGGGGCAGCGGCA
-+
-67777788888888888888888877576555463222100/)..--'+,+,+*))**())()'((&"$"%""##"
- at 30BB2AAXX080903:3:45:202:768#0
-TGGCAGGGGGTTTTATATTGATAATTGTTGTGATGAAATTGATGGCTCCTAAGATAGAGGAGACACCTGCTGGGGG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&&$#$%$$$
- at 30BB2AAXX080903:3:4:1436:690#0
-TATGGCAGGGGGTTTTATATTGATAATTGTTGTGATGAAATTGATGGCTCCTAAGATAGAGGAGACACNATCANCN
-+
-67777788888888888888888877774555.4522120,//.---++(,$)*+)(*))))'((&''"#"$""#"
- at 30BB2AAXX080903:3:3:492:1707#0
-ACGAAGAGGGGCGTTTGGTATTGGGTTATGGCAGGGGGGTTTATATTGATAATTGATATCGGCAGAGGNGAATNTG
-+
-6717470888888/88880-73161'2++3/+)113/-($)'&(%&&&$$$$#$#####&%###%##""#""""$$
- at 30BB2AAXX080903:3:49:466:1218#0
-GGACGGATCAGACGAAGAGGGGCGTTTGGTATTGGGTTATGGCAGGGGGGTTTATAAGATCGGGAGAGCGTGAGNA
-+
-67777788888888888888888877776355443222100/./.---,,+++&*()))(#((#'(#&#$""$"""
- at 30BB2AAXX080903:3:1:615:635#0
-ACCCCCTGCCTTAACCCAATACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATTACAGCAGTCCTACNTANCCCC
-+
-677777888888888888888488/7776,5343322210//...,-,-+,)++)*)*)())#(('''""#"$##"
- at 30BB2AAXX080903:3:35:1367:717#0
-AGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAAGAGGGGCGTTTNGACTCTAN
-+
-67777788888888888888888877776555443222100//..-----+++***)*)*)((('''""######"
- at 30BB2AAXX080903:3:1:563:663#0
-TAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAAGAGGGGCGTTTNCANACAC
-+
-67777788888888888888888877776355443222100//..---,+,++****)*)))((''(&"%#"####
- at 30BB2AAXX080903:3:46:380:1812#0
-TACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGCTCTAGCTG
-+
-67777788884088888883888,7/275/2534322-00///*,,,,,,*$+**+))()((('((%""%%"$###
- at 30BB2AAXX080903:3:33:1344:1817#0
-TGCCAGCAGCTAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAANCCATGTNN
-+
-677777888888888888888888777765554412221/0//..-(,-,,++*)*))))))(&(''"#$"$""""
- at 30BB2AAXX080903:3:59:1002:561#0
-ATGCCAGCAGCTAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAAGACACAAC
-+
-677777888888888888888883774765553133121100/.--*-,,,(+*))*)(((()('(%%'##"$###
- at 30BB2AAXX080903:3:58:1567:1363#0
-CCCTCTTCGTCTGATCCGTCCTAATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCAGATCGGACACACACCN
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))((('&$$%%%$%$"
- at 30BB2AAXX080903:3:40:950:182#0
-TAGTGATGCCAGCAGCTAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAGGAC
-+
-67777788888888888888888877776555443121100//..-.-,,++******)))((((''%##%#%###
- at 30BB2AAXX080903:3:4:994:447#0
-TCTTCGTCTGATCCGTCCTAATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCNCACTNCN
-+
-67777788888888888888888877776543543222100//..-.-+,+,++**)*)))))('''%"#"%#"""
- at 30BB2AAXX080903:3:40:555:354#0
-TATAGTGATGCCAGCAGCTAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAAA
-+
-67777788888888888888888877776555443222100/...-,-,,,++**))*)))))('(''%%%%&##"
- at 30BB2AAXX080903:3:41:1687:558#0
-CCTAATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACGACCAGACGCC
-+
-6777778828888888888888887777655)443212/'0//,-',-+,,+*)***))(('(((''""#&""""#
- at 30BB2AAXX080903:3:49:699:684#0
-CCTAATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGACCCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((('$$"$"$"##
- at 30BB2AAXX080903:3:41:901:774#0
-TGCGGTCTGTTAGTAGTATAGTGATGCCAGCAGCTAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''&'$$"%#"$
- at 30BB2AAXX080903:3:41:164:161#0
-AATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACATAGCGAAAC
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(((('%%"$""###
- at 30BB2AAXX080903:3:33:522:1104#0
-ATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGCCCTAGCTGCTGGCATCACTATACTACTAACAGNACTACCNN
-+
-677727848888828838888888/.77655234%1/2/00//.---,,,+++**)(()(((((#''""&#$##""
- at 30BB2AAXX080903:3:54:603:1887#0
-AGGTTGCGGTCTGTTAGTAGTATAGTGATGCCAGCAGCTAGGACTGGAGATCGGGAGAGAGGGTTATGCTGTGCTC
-+
-6777778888888888888888887377654414*.2-.///.(,.,+,,$$%*#)(()#))(%###%$#&"####
- at 30BB2AAXX080903:3:44:71:750#0
-TACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGACCGCACCCTC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))(((''&%%&%""""#
- at 30BB2AAXX080903:3:58:1705:1764#0
-GTGGTGTTGAGGTTGCGGTCTGTTTGTAGTATAGTGATGCCAGCAGCTAGGAGTGGGGGAGGGAGGCACACAACAN
-+
-677777888888888888888888977365251432121-$%/(,-*+)-,$#****()#)''#(('$&&$%$%$"
- at 30BB2AAXX080903:3:1:1560:1250#0
-GGTGGTGTTGAGGTTGCGGTCCGTTAGTAGTATAGTGATGCCAGCAGCTAGGACTGGGAGAGATAGGANTANGAGC
-+
-6737778888888/8888864)88287+050,3/2.1/00/+..-,.+,),)#$**))'(#('#(''"""#"""""
- at 30BB2AAXX080903:3:41:68:1446#0
-TCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGACCGCAACCTCAACACCACGTCCCACAG
-+
-67777788888888888888888877776555443222100//..---,,,++*+)*)))))(((('&$#$$#$#"
- at 30BB2AAXX080903:3:50:1461:1468#0
-CCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGACCGCAACCTCAACACCACCCTCTTCGCC
-+
-67777788888888888888888877776555443222100//.----,-+++***)))))()(((%%"&""##"#
- at 30BB2AAXX080903:3:33:1562:1294#0
-CGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGTGATGCCAGCAGCTAGGACNCAGTATNN
-+
-6777778888888888888888887777655534322200.//-,---,,++++**)*))(((((('"$"""##""
- at 30BB2AAXX080903:3:54:196:734#0
-CGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGTGATGCCAGCAGATCGGGAGAGTGTGTG
-+
-677777888888888888888888771763552422-2/0/./(,.,,,,,++)*)))')'#(('#&%##""""#"
- at 30BB2AAXX080903:3:45:1750:1587#0
-TCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCGC
-+
-67777788888888888888888877776555443222100./...,,,-+++***)*))))))(('$%#%%"$$$
- at 30BB2AAXX080903:3:8:1135:912#0
-CTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGTGATGCCAGCAGCNACGCATNN
-+
-67777788888888888888888847776455443522100/..,--,,,,+****))*&)((((('""#"$#"""
- at 30BB2AAXX080903:3:58:201:1044#0
-CCTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGGCTGTTAGTAGTATAGTGATGAGATCGGACGACGNNC
-+
-677777888888888888888838787765454232221%0//-..--+,,++*+*)))))()((('%%%"#"""#
- at 30BB2AAXX080903:3:40:111:456#0
-CTCCTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGTGATGCCAGCNACTCGCTA
-+
-67777788888888888888888877776555443222100//..--,,,+++***)*)))((((''""$"$"#""
- at 30BB2AAXX080903:3:36:29:1528#0
-CCTAGCTGCTGGCATCACTATACTACTAACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCNCATCACAN
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)*(()('''"$$"%#$#"
- at 30BB2AAXX080903:3:56:221:1884#0
-CCCCTCCTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGTGATGCCCGCCACCTC
-+
-62777788888888888888888827706555443020+00//.'-.-+,)+*)*#)*()()'('%#"$#""$#"#
- at 30BB2AAXX080903:3:2:878:917#0
-AGCTGCTGGCATCACTATACTACTAACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGNCTCTCAG
-+
-67777788888888888888888877776555443220110//...-,+,+++*+*)))))()(((%""##$%%$$
- at 30BB2AAXX080903:3:36:596:529#0
-ATGGGGTCTCCTCCTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGCAGTGTNAN
-+
-677777888288888888888888777765554412221/0//..,--,,++++***)))(((((('%$&%$#"""
- at 30BB2AAXX080903:3:50:297:576#0
-ATCACTATACTACTAACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAAGATCGGAAGCGCGGACCC
-+
-67777788888888888888888877776555443222100//..-.-,-++++**)))((()((''$$$""""##
- at 30BB2AAXX080903:3:49:1559:880#0
-ATAGAATGGGGTCTCCTCCTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGCTGAGCTGT
-+
-67777788888888888888888877776/554432221/0//.,---,,++++**))))()(('('$""""#"""
- at 30BB2AAXX080903:3:47:1294:1699#0
-TAACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGGAGACCCCACTCTATACCACGCACGATC
-+
-677077888888888888888888777735554432-2100/*/--+-,,+*%)))(()(((((''&"$###"#""
- at 30BB2AAXX080903:3:51:1489:315#0
-GTGACCGAAAAATCAGAATAGGTGTTGGTATAGAATGGGGTCTCCTCCTCCGGCGGGGTCGAAGAAGCTAAACACA
-+
-67777788888888888888888877776555443222100//..----,++++**))())()('(&$$#""%##"
- at 30BB2AAXX080903:3:51:385:1717#0
-CAGGGTGACCGAAAAATCAGAATAGGTGTTGGTATAGAATGGGGTCTCCTCCTCCGGCGGGGGCGAAGCCCAGGAC
-+
-67777788888888888888888877776555443222100//.,.---,-++***)*)))('('#%"$"$$"##$
- at 30BB2AAXX080903:3:38:1690:1353#0
-TCAGGGTGACCGAAAAATCAGAATAGGTGTTGGTATAGAATGGGGTCTCCTCCTCCGGCGGGGTCGATGTGCGCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(('((%"%"""""""
- at 30BB2AAXX080903:3:57:546:482#0
-TAAACTTCAGGGTGACCGAAAAATCAGAATAGGTGTTGGTATAGAATGGGGTCTCCAGAGCGGAAGAGCNCNTCCT
-+
-67777788888888888888888877776555443222100//.-.--,,+*+***))))))(((''''"$""$#"
- at 30BB2AAXX080903:3:46:789:2021#0
-TAAGAATATAAACTTCAGGGTGACCGAAAAATCAGAATAGGTGTTGGTATAGAATGGGGAGATCGGTGGGAGTGGG
-+
-67777788888888888888888177776555243022000./,.--,-,+++***)))()(('((&"$""#"##"
- at 30BB2AAXX080903:3:2:394:1097#0
-GGAGGAGACCCCATTCTATACCAACACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTACNCTANACT
-+
-67777788888888888888888877776555443222100//.----,,++++****))))(((('""%&$"#""
- at 30BB2AAXX080903:3:34:1453:92#0
-AAGCCTGGTAGGATAAGAATATAAACTTCAGGGTGACCGAAAAATCAGAATAGGTGTTGGTATAGAANGACCTTNN
-+
-677777888888888888888888.7776555413222100//..---,,+++*****))()(((('"""$$""""
- at 30BB2AAXX080903:3:55:246:443#0
-ACAATATGGGAGATTATTCCGAAGCCTGGTAGGATAAGAATATAAACTTCAGGGTGACCGAAAAATCACTANANTA
-+
-67777788888888888888888877776555403222.00//.----,,++*'****))(((((('$""#"#""#
- at 30BB2AAXX080903:3:8:523:813#0
-TCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATACTACCAGGCTTCGGAATAATCTCCCATATNACAAGCNN
-+
-6777778888888888-88883887777655544322**0///-----,,+,*++*))))'('((''""#"""$""
- at 30BB2AAXX080903:3:8:599:1587#0
-TTCCGGAGTAGTAAGTTACAATATGGGAGATTATTCCGAAGCCTGGTAGGATAAGAATATAAACTTCNGTGCCCNN
-+
-67777788888888888888888877776555443202100/...-,-,,+++**+))))))(((('""$""##""
- at 30BB2AAXX080903:3:34:1226:870#0
-TATGTATCCAAATGGTTCTTTTTTTCCGGAGTAGTAAGTTACAATATGGGAGATTATTCCGAAGAGANACACATNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))(''&"$%$&$#""
- at 30BB2AAXX080903:3:54:1498:2015#0
-ATTGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGTATGGTCTGAGCTATGATATACACTGGCA
-+
-67777788888888888888888877776555443222100./..--+-,,++***))()))(((('&$&#%%"$#
- at 30BB2AAXX080903:3:52:581:1722#0
-AGGAAGCCAATTGATATCATAGCTCAGACCATACCTATGTATCCAAATGGTTCTTTTTTTCCGGAAGATCGGACTA
-+
-67777788888888888888888877776555443222100//..-,-,,,++***)))))((((('&$"&&$"""
- at 30BB2AAXX080903:3:2:209:537#0
-CCCTAGGAAGCCAATTGATATCATAGCTCAGACCATACCTATGTATCCAAATGGTTCTTTTTTTCCGCNCGANNCT
-+
-67777788888888888888888877776555523220000//./-,,-+,++***))**)((('''%"$$"""#"
- at 30BB2AAXX080903:3:1:1381:1499#0
-CCGGAAAAAAAGAACCATTTGGATACATAGGTATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGTNCTNTACA
-+
-6777778888888888888888887777655044321210.//..--,,,+,+**)*)))((''(('%"#""#"""
- at 30BB2AAXX080903:3:55:1499:1541#0
-GGATACATAGGTATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACACACACTTCA
-+
-67777788888888888888888877776555543222+0/-....--),*+')**)*)()(((('%$$%$#%#$#
- at 30BB2AAXX080903:3:37:1034:540#0
-TAGGTATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTCCACACCN
-+
-67777788888888888888888877776555443222100./..----,-++***)*)))(((('&$$%%"#"#"
- at 30BB2AAXX080903:3:45:1587:736#0
-TCTATTCCTACTGTAAATATATGGTGTGCTCACACGATAAACCCTAGGAAGCCAATTGATATCATAGACAATGCCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$"#%%"#""
- at 30BB2AAXX080903:3:1:453:1293#0
-CTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGAANCANCCTA
-+
-6777778888888888888888887777655144322200./..-.,,,,++*+**)))())(((('&""""$#""
- at 30BB2AAXX080903:3:49:1384:782#0
-TATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGCCTAC
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))))((('''&""$#""##
- at 30BB2AAXX080903:3:58:1350:1446#0
-GATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACTACACA
-+
-67777788888888888888888877776555443222100//..---,,,+++**)))))((((('&&&"#$%$$
- at 30BB2AAXX080903:3:55:1033:839#0
-CTCGTGTGTCTACGTCTATTCCTACTGTAAATATATGGTGTGCTCACACGATAAACCCTAGGAAGCCCAGTTCCCA
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))()('('$$#"$####
- at 30BB2AAXX080903:3:41:176:368#0
-GGTGAAATATGCTCGTGTGTCTACGTCTATTCCTACTGTAAATATATGGTGTGCTCAAGATCGGAAGNGCGCGTNA
-+
-67777788888888888888888877776555443222100//..---,,++++****)*)))(('&"$#""""""
- at 30BB2AAXX080903:3:51:904:1644#0
-TATGGTAGCGGAGGTGAAATACGCTCGTGTGTCTACGTCTATTCCTACTGTAAATATATGGTGTGCTCCCACTCCA
-+
-67777788888888888888838877776551443+2010///(-,,+,-,++*****)()'('(%'"$#"$"""#
- at 30BB2AAXX080903:3:1:1497:1140#0
-CGTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTCNCTNAACC
-+
-67777788888888888888888877876555443222100-,+,.,-+,+++***)))(''(((''$"$"""#""
- at 30BB2AAXX080903:3:59:689:75#0
-GGTGGGGATAGCGATGATTATGGTAGCGGAGGTGAAATATGCTCGTGTGTCTACGTCTATTCCTACTGCACGCNNA
-+
-67777788888888888888888877776555-43222100/...%,,,,-,***&*))')(('#''&$$$"#"""
- at 30BB2AAXX080903:3:49:1411:1680#0
-ATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATCGCTATCCTCATCGCC
-+
-677777888888888888888888777765554432221000...---,,,++****())()()(('%"#""#"#"
- at 30BB2AAXX080903:3:44:1393:884#0
-GACGCCGGTGGGGATAGCGATGATTATGGTAGCGGAGGGGAAAAATGCTCGTGTGGCTACGTCTATTCTTNCTGTG
-+
-6777778848888888888888887777655544322200&//&.,-,+,,**'*'#((')#(((''$$#"&%%$%
- at 30BB2AAXX080903:3:44:160:1236#0
-AGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATCGCTATCCCCACCGGCGCCACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))('(''&"###$""
- at 30BB2AAXX080903:3:41:83:549#0
-TAAATACTTTGACGCCGGTGGGGATAGCGATGATTATGGTAGCGGAGGGGGAATATGGTCGTGTGGTNTGGCACTC
-+
-67777788888888888888888877776555443222100/-..,---,)++(*')')()'('(%%"%"#$"#"#
- at 30BB2AAXX080903:3:50:1526:952#0
-CGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATCGCTATCCCCACCGGCGTCAAAGCACATGCACCC
-+
-67777788888888888888888877776555443222100//...--,,+,+**))))))((((#'%$$"%""#"
- at 30BB2AAXX080903:3:55:348:685#0
-CTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGACGCCGGTGGGGATAGCGATGATTATGAGATAGGCAGCAG
-+
-67777788888888888888888877776555443222100//..---+,+++*+*)*))()(('('"&%"$###"
- at 30BB2AAXX080903:3:49:1611:783#0
-CTCCGCTACCATAATCATCGCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGCACAATA
-+
-67777788888888888888888877776555443222100./..---,,+++****)))))(((('""#"$"#"#
- at 30BB2AAXX080903:3:33:231:495#0
-TCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGACGCCGGTGGGGATAGCGATGATNTCTATCNN
-+
-67777788888888888888888877176555445222100//..---,,+*+***)*))(((('(&"$$"#"#""
- at 30BB2AAXX080903:3:38:1647:608#0
-CCATAATCATCGCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATGACACN
-+
-677777888888888888888888777165554,3222110//...-,,,+,)+)**))((('('''&$&%$"##"
- at 30BB2AAXX080903:3:43:159:718#0
-TCGCTATCCCCACCGGCGTCAAAGAAGTTAGCGGACACGACACACTCCACGGAAGAGATATGAAAAGAGATGCTGA
-+
-6777578888888888+8083888&777*5/'&23')'1/0/&..,-,,,+)*+*)&))()())(''%%""$"#"#
- at 30BB2AAXX080903:3:44:394:1454#0
-AGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGACGGCGGTGGG
-+
-67777788888888888888888877776555443222100//...--,,+++**)))))')((('&'$%&&"$"#
- at 30BB2AAXX080903:3:8:958:605#0
-CAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGANGCCATCNN
-+
-67777788888888888888808877776555443222100//..---,,+***)**)*)(')((('"#&%""$""
- at 30BB2AAXX080903:3:41:956:760#0
-AGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGACTC
-+
-67777788888888888888888877776555443222100//...--,-+++******))(((((''$%&##$"#
- at 30BB2AAXX080903:3:50:945:627#0
-ATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCAGGCCGGACG
-+
-67777788888888888888888877776555443222100//..--,,,,++***))))))()'''$"##"#"#"
- at 30BB2AAXX080903:3:41:1134:226#0
-AAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCGTAGGCTT
-+
-67777788828888888888888877776553442222000/..-----,+++***)())))'('(''"$#&##""
- at 30BB2AAXX080903:3:42:911:348#0
-GATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAAT
-+
-67777788888888888888888877776555443221100//..-,-,,*+++**)*))))((((#%$&##%"$#
- at 30BB2AAXX080903:3:55:1413:1976#0
-CTGACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCACTNTTCAT
-+
-67777788888888888888888877776555443222000//--.-,-,+++***('()(()((('&$""""#"$
- at 30BB2AAXX080903:3:55:25:1257#0
-AAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGCGGGCGAGATTCG
-+
-67777788888888888888888877776555443222100//./---,-+++***))'))((''#&$%""$#"#"
- at 30BB2AAXX080903:3:2:1741:1364#0
-GACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCNATCTATC
-+
-6777778888888888888888887777635544321211//.-.,-,,,,,++*())'))(((''''"$%$##$#
- at 30BB2AAXX080903:3:57:1350:1968#0
-GAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGAGATCGGCGCACAGC
-+
-67777788888888888888888877776555443222100//..----,+++**)))*)))(((('$$$"#$#"$
- at 30BB2AAXX080903:3:33:283:1903#0
-AGGGGAAAAGAAAGATGAATCATAGGGCTCAGAGTACTGCAGCAGATCATTTCATATTGATTCCGTGNTTGCACNN
-+
-677777388888888888888)887777053524#3221-,/...,*-,,$+++%*))*(()#((&'"#""$"$""
- at 30BB2AAXX080903:3:45:57:409#0
-CCACACTCCACGGAAGAAATATGAAATGATCGGCTGCAGTGCTCTGAGCCCCAGGATTCATCTAGATCACGCAGTG
-+
-6777778888888888)88888887777655'4/3/10100/-..---,(+$+***)*'()()((('&""$""##"
- at 30BB2AAXX080903:3:52:422:719#0
-CCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTCACCACCGT
-+
-677777888888888888888888777765554432221/0//..---,,+++***)*))))(((('$"#$%%%$#
- at 30BB2AAXX080903:3:46:1470:1303#0
-TACGGTGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGNGTCAGCGG
-+
-67777788888888888888888877776555443222100//..---,-+++***)))))((((('""%#""#""
- at 30BB2AAXX080903:3:33:1090:274#0
-TCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACNCTTCCANN
-+
-67777788888888888888888877773555443222100//....-,,,++*****))))(((('"%""$#"""
- at 30BB2AAXX080903:3:1:64:885#0
-GGCCACCTACGGTGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGNGTNACAC
-+
-67777788888888888888888877776555443212100///.---,,+,+***)*)))))((('&""$""#"#
- at 30BB2AAXX080903:3:58:220:769#0
-AAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATCCATCTTTCTTTAGATCGGAAGAGCNTNTCNC
-+
-67777788888888888888888877776555443222100/..'---,,+++*****)))(('(''&&"#"$#"$
- at 30BB2AAXX080903:3:1:216:374#0
-CAGTCAGGCCACCTACGGTGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCNTGNGCCA
-+
-67777788888888888888888877776355443022100/..,---,,,++*'**)))))(((('$"""""###
- at 30BB2AAXX080903:3:33:1396:1247#0
-CAGTCAGGCCACCTACGGCGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGAAGATCATTTNATCTCANN
-+
--77777888888888888,888887777655544320200/./.----,,+++*)*)()')(()(%'"$%$%$#""
- at 30BB2AAXX080903:3:3:833:1687#0
-ACAATGCCAGTCAGGCCACCTACGGTGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGANCATANCA
-+
-677777888888888888888888787165554,32211/0//.---,-,+,++**)))())()(('%"$"%$"##
- at 30BB2AAXX080903:3:54:1315:1714#0
-GAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGAGATCCAC
-+
-67777788888888888888888877776555443222100//..---,,+,++**)*))()((((&&"%"#"##"
- at 30BB2AAXX080903:3:36:18:1196#0
-TACAATGCCAGTCAGGCCACCTACGGTGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCANCCACACGN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()'('""$"###""
- at 30BB2AAXX080903:3:38:1587:1387#0
-ATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATAGATCGGACA
-+
-67777788888888888888888877776555443222100//...-,-,+,+***)*)()((((''"$%$#""$#
- at 30BB2AAXX080903:3:39:1317:1418#0
-TGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTATTATCTACC
-+
-67777788888888888888888877776555443222100/....--,,+**+*)))))()()(('$$###"###
- at 30BB2AAXX080903:3:8:494:1765#0
-TGCTGCAGTGCTCTGAGCCCTAGGATCCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTANAGGAGCNN
-+
-67777788888888888888888877'763.5443.20100/..,.+-+,,*+*+*)*(()((((('"$""#""""
- at 30BB2AAXX080903:3:1:432:453#0
-AGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAANCANCTCC
-+
-67777788888888888888888877776555443212110/...,,,,,+,+*+***))))(((''%"%""""#"
- at 30BB2AAXX080903:3:38:1613:1535#0
-AGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAACCTCACTA
-+
-67777788888888888888888877776555443222100/...---,-,++***)))))(()'('$$$&%#"""
- at 30BB2AAXX080903:3:43:942:1214#0
-GTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGGTGAAAAGAAAGATGAATCCTAGGGGTTCG
-+
-6777778888888888888888887777655544322210.//..--+,,,,+*+*)*))))))(''&$&%""""#
- at 30BB2AAXX080903:3:49:1118:1874#0
-CCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTATGGTGCCT
-+
-67777788888888888888888877776555445222100////----,+++*)*)*))))(((''"#"""###"
- at 30BB2AAXX080903:3:52:665:1872#0
-TAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACT
-+
-67777788888888888888888877776555443212101//..-.-,,+,++**)*))))))(''""#&%%%$#
- at 30BB2AAXX080903:3:36:1411:1733#0
-GTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGGTGAGATCGGATNACTGTNN
-+
-677777888888888888888888777765554432221/0//..---,,+,+++*)))))))('('""###""""
- at 30BB2AAXX080903:3:51:447:677#0
-GTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGGTGAAGATGGACAGT
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))(((''"""""####
- at 30BB2AAXX080903:3:49:1618:721#0
-CGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTAAGATCGGAGTACGC
-+
-67777788888888888888888877776555443222100//..---,,+++****))))((('(($$""$"#"#
- at 30BB2AAXX080903:3:50:22:1750#0
-TCTTTTCACCGTAGGTGGCAGGACTGGCATTGTATTAGCAAACTCATCACTAGACATAGTACTACTCGTGCGTCGA
-+
-677777882888888888/888887777654524'22'+00'..,'--,(,++***)')))'()'%'&""$"""""
- at 30BB2AAXX080903:3:38:296:1167#0
-GTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGCTCACCAGA
-+
-677777888888888888888888777+655544.222100//..---,,,++**))))'(((('(&$%""""##%
- at 30BB2AAXX080903:3:45:418:120#0
-AGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCAGATCGGTCGAGCGC
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))'('((($$#&"%"#"
- at 30BB2AAXX080903:3:51:258:624#0
-TTTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACCCGCTCTT
-+
-67777788888888888888888877776555443222100//..---,,+,+*+*)()))())(('$"$"#"$""
- at 30BB2AAXX080903:3:51:862:1995#0
-CGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTCCNGAGCT
-+
-67777788888888888888888877776555443222200//./---,,,+++**)))))(('('%"$#""""#"
- at 30BB2AAXX080903:3:47:435:968#0
-GTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGAGATCGGAACAGCCATNA
-+
-67777788888888888888888877776555443222200//..---,,+,+*+**)))))((((($$###"#"#
- at 30BB2AAXX080903:3:50:1560:155#0
-AGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGCGTCTCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''"%##"$"##
- at 30BB2AAXX080903:3:44:846:700#0
-GAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGAGATAGGATG
-+
-67777788888888888888888877776555443222100/...---,,+++***)*)))))((('$"%"&%#"$
- at 30BB2AAXX080903:3:8:1090:1869#0
-GGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTCGNCATACANN
-+
-67777788888888888883888877776545445222100//).,.-,-,++****(((((((&%'"$"""$#""
- at 30BB2AAXX080903:3:50:527:539#0
-AAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGACGGGCAGAC
-+
-67737788888888888888888877736)554432221.0/..,---,-+++******))))(((%&"""#####
- at 30BB2AAXX080903:3:60:299:108#0
-CCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCNGANN
-+
-677777888888888888888888777765554432221/0//...-,,,+,+++'**))))''(&&$%&$"""""
- at 30BB2AAXX080903:3:48:1710:2003#0
-GAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGATCAA
-+
-67777788888888888888888877776565443120100-/..--,-,,+++**'*))))%('('%"$"""#""
- at 30BB2AAXX080903:3:35:1148:1226#0
-CTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGNCCACTATN
-+
-67777788888888888888888877776555443222000//..--,,,+++**)***(*()((('"$#"$#"#"
- at 30BB2AAXX080903:3:58:492:1504#0
-GGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATCAGTTTGCTAAGATCGGAAGCCACAC
-+
-67777788888888888888888877776555443232100//..-.-,,,,+**))*)))(((('''$%""###$
- at 30BB2AAXX080903:3:43:1196:1342#0
-GACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCCC
-+
-67777788888888888888888877776555443222100//./---,,+++++*)*))))')((''%#$&%$##
- at 30BB2AAXX080903:3:53:527:1583#0
-GTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAACGTCAGCC
-+
-67777788888888888888888877776555443222201//..---,,+++***)*)()()((''&##"#""##
- at 30BB2AAXX080903:3:40:699:290#0
-ACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACT
-+
-67777788888888888888888877776555443222100//..---,,+*+***))(())(((('%&$&%%$$"
- at 30BB2AAXX080903:3:60:893:488#0
-ACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGAGATCGGCACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((('''$%&%##""
- at 30BB2AAXX080903:3:44:1651:219#0
-AGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACACTGCACGC
-+
-67777788888888888888888877776555443222100//..---,,+,+*****))))((((''#$%&"$$"
- at 30BB2AAXX080903:3:60:945:1556#0
-AGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATAATCTAACANN
-+
-67777788888888888888888877776555443222100//..---,-+++****)))(())'''""$##$#""
- at 30BB2AAXX080903:3:46:751:1726#0
-CTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCAGCTC
-+
-67777788888888888888888877776555443222100//..---,,+,+***))))))(((('&"#$$%"#"
- at 30BB2AAXX080903:3:50:233:2044#0
-ATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATATACAACTA
-+
-677777888888888888888888777765554452211/01/..--+,,+++*+**)))))'((('""#$"##"#
- at 30BB2AAXX080903:3:43:501:169#0
-ATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCCCAAGATCGGAGGTACA
-+
-67777788888888888818882877776553453222100//..+,,-+*+**+)))'#((''(%#%&"#"""#"
- at 30BB2AAXX080903:3:34:766:124#0
-AGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGNCTACATNN
-+
-677777888888888888888881777765554422121/0//.----+-+++****)*))'('(('"%#%"##""
- at 30BB2AAXX080903:3:50:1679:1247#0
-TGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTCACTACGA
-+
-677777888888888888888888777767554432-21/0//..---,,+++***()))))((((%"$##""$""
- at 30BB2AAXX080903:3:35:944:1539#0
-TAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTNCTCTACAN
-+
-67777788888888888888888877776555443222100//..---*,+++***)()))((((('"""$""#""
- at 30BB2AAXX080903:3:39:1042:216#0
-TAGGACATAGTGGAAGGGAGCTACAACGTAGTACGTGTCGTGGAGTACGATGTCTAGGGAAGATCGGAAGAGGGAC
-+
-6777778888288888%88852067773355+3/3'2110./#..+,+,,(,($'*(()()((#'''""%"""#$#
- at 30BB2AAXX080903:3:41:1019:1263#0
-TATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTAGCGCGCGGC
-+
-67777788888888888888888877776555443222100//..---+,+,+***))))*))('''%"%#%$%#"
- at 30BB2AAXX080903:3:34:1757:1065#0
-TGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGNCTACACNN
-+
-67777788888888888883888877776552443222100-/..,,,,,++*+**(*()()(((''"%"#%$$""
- at 30BB2AAXX080903:3:57:127:1200#0
-TGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGATGTGTCCC
-+
-67777788888888888888888877776555443212100//...,-+,+++***)*))')(((&'%&"""####
- at 30BB2AAXX080903:3:59:1488:629#0
-TGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTACACANTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&$%%%%$"#$
- at 30BB2AAXX080903:3:43:121:843#0
-ATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((('&&$$$""#""
- at 30BB2AAXX080903:3:43:121:845#0
-ATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTCTTT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((('&%$$%"$"""
- at 30BB2AAXX080903:3:52:966:163#0
-AGCAAACTCATCACTAGACATCGTACTACACGACACGCACTACGTTGTAGCTCACAGACCGGAAGAGTCTCTCCTT
-+
-6777778888888888888888887747655,4422.%10/...+--)+,+)++**))&&((('(''"%#$"##""
- at 30BB2AAXX080903:3:38:229:803#0
-AAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCAGATCGGGAGAGCGCGACAGC
-+
-677777888888888888888888766765554402221/00/.---*,,++(*)**()')((((''$%%%%$$"#
- at 30BB2AAXX080903:3:39:1324:467#0
-TCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGCTCAC
-+
-6777778888888888888888887777654644322.000/..,-,-,,++****))(((('('%'"$&$"#$#$
- at 30BB2AAXX080903:3:37:662:158#0
-CATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTAAGATCGGAAGAGACCCTATNN
-+
-677777888888888888888888777765554432321/0//-..-++-+,+))**)()))(((''$"#$"""""
- at 30BB2AAXX080903:3:46:257:525#0
-ACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGATCGGAAGGGGCCTAGG
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(('('""####"""
- at 30BB2AAXX080903:3:54:791:1181#0
-ATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGAGCCTTAC
-+
-67777788888888888888888877776555443222100//..---,,+,++***)*))))((('%""""""""
- at 30BB2AAXX080903:3:54:439:1762#0
-ATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATATGTCGACG
-+
-6777778888888888*888888877776355443232200/..,.-,,,+*+***)))()&)&'&'$""#"##$"
- at 30BB2AAXX080903:3:35:1425:1618#0
-AATACAGCTCCTATTGATAGGACATAGAGGAAGTGAGGTACAACGAAGTACGGGTCGTGTAGAACAGNCCTGTACN
-+
-677777888888888888888888787.657541352'+/&..,.(--',++(+*))#*#&)#(#'&"$$"""#$"
- at 30BB2AAXX080903:3:44:1515:2000#0
-ACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGNTGTCTAG
-+
-67777788888888888888888877776555443222/011,.-++++,,++*#)*)*()(((('''"$&""#""
- at 30BB2AAXX080903:3:47:242:1885#0
-ACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCCATAGGAGCCCCTAGA
-+
-677777888888818888888888777&6555.4/3+2.00.'..,-,,,++++'*(#*(#&(((''$#$"$##$#
- at 30BB2AAXX080903:3:40:1292:216#0
-AAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTGCGCTGGTTGCC
-+
-6777778888888888888888887773655544'222.%00..--(*,$+++&*(()()'((#(%'"%"&"#""#
- at 30BB2AAXX080903:3:41:811:1406#0
-CAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTAAGATGTCTCG
-+
-67777788888888888888888877776555443222120//..,-,,,+,+****))))(()('#$"%&$"#""
- at 30BB2AAXX080903:3:49:1201:525#0
-CAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACCAGGTATGA
-+
-6777778888888888888888887/776555443/2210/1,..,-++,+,)**+)')()%(('(#$"""$##""
- at 30BB2AAXX080903:3:49:49:1529#0
-TAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCGCCCCACAC
-+
-67705785883388.888038888977595454/32/201/0..',,,+,,*((+)(('))((((''&$""$$#"#
- at 30BB2AAXX080903:3:59:1342:1581#0
-GGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGNATCAC
-+
-6777778888888888888888887747655544322-100-.-,.-+-+++)*(*)*(#)()(''&%%""&"###
- at 30BB2AAXX080903:3:35:274:647#0
-TGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGNGCTCAAGN
-+
-67777788888888888888888877776555443222*0./..----*,*,+)*(*&)('((('('""%#&"#""
- at 30BB2AAXX080903:3:55:591:524#0
-ATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGGGAGCTACAACGTAGTACGTGTCAGATCTGGCGGCGG
-+
-677777888888888888888888777765554432221*0./&,,,+-)*&+*%+))%*#((('%'%&##"#"""
- at 30BB2AAXX080903:3:47:1278:1119#0
-CATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAAGATCGGAAGANTCGCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('('"%""#"##"
- at 30BB2AAXX080903:3:41:546:806#0
-ATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGAGATCGGTAGCA
-+
-6777778888888888888888887777655543*022.010./..,,,,++*(*****()(()((($%%&#""""
- at 30BB2AAXX080903:3:51:1604:1667#0
-TGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGAAAACACCA
-+
-67777788888888888888888877776555443222100//..---+,+'+***)*&))((('''"""###"##
- at 30BB2AAXX080903:3:49:1371:936#0
-ATGATGGCAAATACAGCTCCTGTTGATAGGACATAGTGGAAGGGAGCTACAACGGAGGACGAGGTGTGGGCAAGCT
-+
-677777888888888888888888772765544432221-0/'..-,--,*+**)))&)()#('#('%"$""""#"
- at 30BB2AAXX080903:3:39:1147:1865#0
-TATGATGGCAAATCCAGCTCCTATTGATCGGACATAGTGGCAGGGAGCTAAAACGTAGTCAGTGGTGTGCTGTCAC
-+
-67777788888888888888888877776555'13222100//(.,--,,*&+**()*)#((&('#&$%#""###$
- at 30BB2AAXX080903:3:39:1148:1864#0
-TATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTTTTCAC
-+
-67777788888888888888888877776555443222100//..--,,,+++&*)*))*(((((%'&%""""###
- at 30BB2AAXX080903:3:44:183:380#0
-TATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGGCGTGAG
-+
-67777788888888888888888877776555443222100//..---,-++++*)))))'(((((&&&""%""#$
- at 30BB2AAXX080903:3:4:1156:1584#0
-GTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCNCCACNCN
-+
-6777778888888888888888887777655544352210+///--,-,,-,******)*)((((('%"#""%"""
- at 30BB2AAXX080903:3:8:901:1500#0
-CCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGGNGATAAGNN
-+
-6777778888888888888888887777655544322-1/0/...$-&,++,*)*#)(()&('(#(#"&#""##""
- at 30BB2AAXX080903:3:42:980:1549#0
-CTACACGACACGTACTACGTTGTAGCTCCCTTCCACTATGTCCTATCAATAGGAGCTGTATTTTCCACAGATCTGC
-+
-6777778888882888888888817./-$4+1241.0.&.1*.&'+-,+(*)+)*&')('(((##%'"#&""""##
- at 30BB2AAXX080903:3:37:1601:1443#0
-CTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAAAGTAGTACAGCACGCACGN
-+
-677777888888888888888888777765554432221000/./--),,+**+)))')#))#((''&#$"%#$""
- at 30BB2AAXX080903:3:52:236:1968#0
-CCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGGGAGCTACAAAGTAGTACGCCTCCTGCG
-+
-6777778888888888888888887777655544322110,/...-.-&,)+#&)(((&)#&)%'#'%""""""#"
- at 30BB2AAXX080903:3:44:725:1074#0
-CACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCAGATCGGGAGGGG
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()((('&&%"#$""#
- at 30BB2AAXX080903:3:42:1283:1263#0
-CGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGGGTGCTC
-+
-67777788888888888888888877776555443211010./.----,,+++)*)*()'('(''''"&"#"#""#
- at 30BB2AAXX080903:3:38:632:481#0
-GACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGCAGGTCTCA
-+
-67777788888888888888888877776555443222100./..--,,,-++*****))()(((''$##$%$"$#
- at 30BB2AAXX080903:3:8:664:1443#0
-GACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCGATAGATCNCTACCTNN
-+
-67777788888888888888888877776555443222100/...--,,-++++*+))))()(((('"$"##"#""
- at 30BB2AAXX080903:3:52:613:1664#0
-TGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTGTGTGCG
-+
-67777788888888888888888877776555443222100//...--,,,++'*))())(((&(%'$"""&###"
- at 30BB2AAXX080903:3:8:841:789#0
-TGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTANTCCATCNN
-+
-67777788888888888888888877776555443222100//...-,,,,++)**)()(())'(''""#"""#""
- at 30BB2AAXX080903:3:41:1062:1346#0
-TGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGGGAGCTACCACCTGTATCA
-+
-6777778888888888888888887777655542322210////.-,-+,+*+*)*)&)(*'#(##'&"$""#"""
- at 30BB2AAXX080903:3:38:1784:1722#0
-TACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCGTTCATCANN
-+
-677777888888888888887838737765.4,41.22210-.--,*,,+,+'(('&')#'((((%%$&%$"#"""
- at 30BB2AAXX080903:3:44:644:1913#0
-AGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGGAGCA
-+
-67777788888888888888888877776555443222100//..---,-+,+*****)&*((&((%'&%%"$%#$
- at 30BB2AAXX080903:3:4:1398:315#0
-AGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTAACNCGACNCN
-+
-677777888888%8888888888837776555443012100//./--,,,,,+*****)#)(('''#""#"##"""
- at 30BB2AAXX080903:3:55:415:751#0
-CTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))()((('&&%&%%"""
- at 30BB2AAXX080903:3:49:1025:580#0
-TCATTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACACAGCGG
-+
-67777788888888888888888877776555443222100//..---,-,+++**))*))&(('('"$"#"##""
- at 30BB2AAXX080903:3:53:1225:1642#0
-AATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGTCACACGCA
-+
-67777788888888888888888877776555443222100//..---,,+++**+)*))))(&(('"""&%#"#%
- at 30BB2AAXX080903:3:43:869:894#0
-GTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTC
-+
-6777778888888888888388287377655244322210.//..---,,,+)+**)*)(')(('(&$$%&"$%$$
- at 30BB2AAXX080903:3:53:1593:131#0
-TAGGGGAAATAAGTGAATGAAGCCGCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGCACTCTGCC
-+
-677777888888888888888888-7776555443222100//..---,,+++***)))))(((''%&$"""""#"
- at 30BB2AAXX080903:3:43:1247:1346#0
-ATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGGGC
-+
-67777788888888888888888877776555443222100//..----,+++****)))))((''&%$&%"""""
- at 30BB2AAXX080903:3:57:1366:1703#0
-GAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGAAGATCGGAAGACGTGTGAC
-+
-67777788888888888888888877776555443222100//.----,,-++***)))))(((((&'$&""""##
- at 30BB2AAXX080903:3:43:124:407#0
-GAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGACGA
-+
-6777778888888888888888887777655544*222100//..----,+++***)))*)(((('&'&"%%#"""
- at 30BB2AAXX080903:3:49:1566:522#0
-CTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCAGATCGCAC
-+
-67777788888888888888888877776555443222100//...--,,++(***))))()))('&"#""&####
- at 30BB2AAXX080903:3:57:1683:1984#0
-TATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTACACCCACAAA
-+
-67777788888888888888888877775555443222100-/.----,-,++***)()))((((%''"%%%$#$$
- at 30BB2AAXX080903:3:43:784:484#0
-TGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTCTGATGGCAAATACAGCTCCTATTGATAGGACTAG
-+
-67777788888888888888888877776555443222100//..---,,*++*****))))(((('&'%%$""""
- at 30BB2AAXX080903:3:44:1718:565#0
-GGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTGCTATTGA
-+
-67777788838888888888888877776555443222100//..-.-,,,++***)*))))()(('%"$$$&%$#
- at 30BB2AAXX080903:3:42:400:1944#0
-TGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTA
-+
-67777788888888888888888877776555443222100//...--,,+++***)))*))(((''&&&&&%%##
- at 30BB2AAXX080903:3:39:1179:855#0
-TAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGAGATCGGAAGAGCTTTGC
-+
-67777788888888888888888877776555443222100//..---,,+++***))())((('('""#"""""#
- at 30BB2AAXX080903:3:38:1310:1789#0
-GTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCACA
-+
-67777788888888888888888877776555343222110//...--,,-,+***)*)))))(((''$%%%$#%#
- at 30BB2AAXX080903:3:47:1693:378#0
-GAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAGGTGGT
-+
-67777748802888888888888877776555443222100./..-,+,,-++****)))()(&(('""#%"%"#"
- at 30BB2AAXX080903:3:51:1093:1405#0
-TGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCACCACCC
-+
-67777788888888888888888877776555443222/00//...--+,,++***)))())(((('$&"##"$""
- at 30BB2AAXX080903:3:58:1117:231#0
-TCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATNCTGNT
-+
-67777788888888888888888877776555443222100//..-----+++****)))))()('''$%"&##"$
- at 30BB2AAXX080903:3:43:19:495#0
-ATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATCGCACATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&$"$"#""#
- at 30BB2AAXX080903:3:53:633:1875#0
-TGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAGATCGGAAGAGCGCAGC
-+
-677777888888888888888888777765554332221*0//.-.--,,+++***)))))((((''%"$###"""
- at 30BB2AAXX080903:3:1:800:1703#0
-ATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGNATNCAGC
-+
-6777778888888888888888885.774555463232101//..---,,+++*)**)))(&()((#&"""""###
- at 30BB2AAXX080903:3:36:635:727#0
-TATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGCTATGCATN
-+
-67777788888888888888888877776555443221100//..----,++++**)))))))(('%%&"""#"""
- at 30BB2AAXX080903:3:42:1535:1489#0
-ATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGGG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('&%%""#"""
- at 30BB2AAXX080903:3:38:179:1866#0
-TGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAAGATCGGAAGAGCGGTTCCGCCGCCAC
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))(((''$$%"""###
- at 30BB2AAXX080903:3:49:732:1376#0
-GCCGATGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGTCACGCAC
-+
-6777778888888888888888887/776555443222100//---,-,,,++***)))()'()(('%"#"#"#"#
- at 30BB2AAXX080903:3:51:965:869#0
-TACGCCGATGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGCGTGTAGCCTGAGATCGGGCGTAGT
-+
-67777788888888888888888877776555443222100./..---,,+++****))*)((((('"$"$"#"##
- at 30BB2AAXX080903:3:37:479:1565#0
-AGATTTACGCCGATGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGCGACACGAN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((('&&%""%##$"
- at 30BB2AAXX080903:3:49:1482:1821#0
-TAGATTTACGCCGATGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGCGTTTATC
-+
-67777788888888888888888877776555443222100//..--+,,+++***)*)())((('&'$"""""#"
- at 30BB2AAXX080903:3:46:330:1392#0
-ACACCCTAGACCAAACCTACGCCAAAATCCATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACA
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(('(&'"#$$$"$#
- at 30BB2AAXX080903:3:36:999:822#0
-TGTGGGAAGAAAGTTAGATTTACGCCGATGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTATATGTCTN
-+
-67777788888888888888888877776555443222100//..----,+++***)*)))))(''%%$"$$##""
- at 30BB2AAXX080903:3:41:1033:132#0
-CTACGCCAAAATCCATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACGTTCTCGGCCTC
-+
-67777788888888888888888877776555413222/00/...--,,,,++++***)())#('(''&%%#"#""
- at 30BB2AAXX080903:3:49:586:1158#0
-GCCAAAATCCATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAGATCGGAAGAGCCGCTCGCG
-+
-67777788888888888888888877776555443321101./,.--,,,)+***)*)*((((((''"#"#"#"#"
- at 30BB2AAXX080903:3:34:1015:386#0
-GGGGCATTCCGGATAGGCCGAGAAAGTGTTGTGGGAAGAAAGTTAGATTTACGCCGATAGATCGGAANCCACCCNN
-+
-677777888888888888888888771765554432221/0/0..---,,+,+*****))))(('''"%$"#$#""
- at 30BB2AAXX080903:3:45:1175:1702#0
-ATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCGACGTAACTCGGAC
-+
-67777788888888888888888877776555443222101+/..,---,,*+***))))))()(''"%%"$&$#$
- at 30BB2AAXX080903:3:46:607:49#0
-TTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCGACGTTACACGGAGT
-+
-67777.88888888888888888877776555443221100//-.--+,,,++**)*)))()'((''"$"$"#"""
- at 30BB2AAXX080903:3:52:1681:1455#0
-GGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCGAGAAAGTGTTGTGGGAAGAAAGTTAGCAAACCCAAC
-+
-6777778888888888888888887777655544322210//.-.---,,+++**)*))))()(('#$$%%$%#$$
- at 30BB2AAXX080903:3:46:1697:1105#0
-ATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCGAGAAAGTGGTGTGGGAAGAAAGTTNGTTNACAC
-+
-67777788888888888888888877776555443102100//..+--,-+)+*+*))))))(((&'"#"""#"""
- at 30BB2AAXX080903:3:1:1542:327#0
-TGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGGCGAGAAAGTGTTGTGGGNTANACCA
-+
-67777788888888888/88881877476+5044322-+-0-&/.-*+-,(*+)*%())#)'%'&('"""""###"
- at 30BB2AAXX080903:3:38:763:627#0
-CATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCAGATCGGAAGAGTGTGTCCG
-+
-67777788888888888888888877776555443222100/...---,,+++*+*)*))))(('('$"#"""##"
- at 30BB2AAXX080903:3:41:640:55#0
-TTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCAGACACG
-+
-67777788888888888888888877776555443222100//..---,,++*+*+**)())(((''&%$%%$""#
- at 30BB2AAXX080903:3:46:593:970#0
-TTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGGTAGATCGGAAGAGCGGGTCTGCTG
-+
-67177718818888888888888877176555443222000////--,+,+%+**)))*)(()((''""#%"##""
- at 30BB2AAXX080903:3:55:1529:1414#0
-TTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCAGATCGGGACACNGCGC
-+
-67777788888888888888888897776555443202100./.-,--*(++'**))'#'(%(#&(#&$%$"#"##
- at 30BB2AAXX080903:3:36:251:1061#0
-TAGGATGGTTCATGGGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCGGTATCACGN
-+
-67777788888888&8888888887777655044321210,//..'--,,+***+*(*))'()(#'#$"#"$$$$"
- at 30BB2AAXX080903:3:41:520:634#0
-TAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCGCTAACTTCC
-+
-6777778888888888888888887777655044322210///...--,,+**'+()))(((((#&&"$$#""""#
- at 30BB2AAXX080903:3:54:616:774#0
-TGATAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGGATGGTCGG
-+
-67777788888888888888888877776555440222100//-----,,+++****)))()'((('"""$""#"$
- at 30BB2AAXX080903:3:41:1033:1357#0
-CTCGGCCTATCCGGAAGGCCCCGACGTTACTCGGAGTACCCCGATGCATACACCACATGAAACATCCCATCCACAC
-+
-67777708888888888888+8887777657+,41'.2.////.+-,,',++***)*#(())'(&'#""%""$"##
- at 30BB2AAXX080903:3:1:1277:1997#0
-GCCTATCCGGAATGCCCCGACGGTACTCGGACTACCCCGATGCATACACCACATGAAACATCCTATCANCTNCCTC
-+
-6777778888888888888588)377770+422232120-.-.-'--,+,*+*(())'((#('''&'%"&%"$$%%
- at 30BB2AAXX080903:3:59:707:1733#0
-AGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTGCGTCACA
-+
-677777888888888888888880&77765/5,4321110///.%--,,,,*+'+*())())(((''&"&&##$##
- at 30BB2AAXX080903:3:53:623:1151#0
-TGAGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCCTTCCGCAG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((''%"""$$%""#
- at 30BB2AAXX080903:3:60:479:1687#0
-TGAGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCACTCCTANN
-+
-67777788888888888888888872776%55342222$//./..-+-,$**+)****))('()((%%$%%#"#""
- at 30BB2AAXX080903:3:1:673:511#0
-GGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATCCTATCATCTGAGATNGANACAC
-+
-677777888888888888888826774165524422201/.-.---.-,+*++)(*(*)()'(('('"""$"$#"#
- at 30BB2AAXX080903:3:43:1489:72#0
-TGAATGAGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCGGGCG
-+
-67777788888888888885888877/7656134320200///.-,--+,**(*))(')#)''(#%&'&""#""#"
- at 30BB2AAXX080903:3:4:1784:678#0
-TGAATGAGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGAGATCGGAAGAGCGGTTANACTANCN
-+
-6777778888888888888888887777654544322210//.-/,--,,+++)***())()&((%&$""%"""#"
- at 30BB2AAXX080903:3:37:788:1651#0
-GACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATCCTATCATCTGTAGGCTCATTCATATCTCTATN
-+
-6777778888888888888888887777455544322200////,.,-,,,+++**))))(()('('$"#&&$"#"
- at 30BB2AAXX080903:3:1:1226:1885#0
-TGCTGTTAGAGAAATGAATGAGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGAAGTNCCNTACA
-+
-67777788888888888883588877736/503412.0001*..,,,+,-$,)****)())()(#''$""""$$#"
- at 30BB2AAXX080903:3:39:319:1604#0
-CTCGGACTACCCCGATGCATACACCACATGAAACATCCTATCATCTGTAGGCTCATTCATTTCAGATCGGAGAACA
-+
-67777788888888/888888887777755554$32221/0//.----,-+++**+)))*)))'('%$""%&$##$
- at 30BB2AAXX080903:3:8:1605:890#0
-CGGACTACCCCGATGCATACACCACATGAAACATCCTATCATCTGTAGGGGCATTCAAGATCGGAAANCATACANN
-+
-677777888888888888888888777765554823(.1%//+.--+,-%%))(*)()))##(('%&"""#$$%""
- at 30BB2AAXX080903:3:4:797:612#0
-GGACTACCCCGATGCATACACCACATGAAACATCCTATCATCTGTAGGCTCATTCATTAGATCGGAACNCATANAN
-+
-67777788888888888888888877779555442222200./.-.--+,+++*****))()((('&$"$""""""
- at 30BB2AAXX080903:3:50:910:432#0
-TATTACTGCTGTTAGAGAAATGAATGAGCCTACAGATGATAGGATGTTTCATGTGGGGTATGCATCTGTAGTCATG
-+
-67777788888888888888888877776555443122100//.+-*-,,+++)**#*)((('(('#$""""$##"
- at 30BB2AAXX080903:3:48:1717:1336#0
-TAATATTACTGCTGTTAGAGAAATGAATGAGCCTACAGATGATAGGATGTTTCATGTGGGGTATGCAGCCGGCGTG
-+
-67777788888888888888888877776555443022+00//..--,,-++%)***))#*((((#&%"$"#"###
- at 30BB2AAXX080903:3:8:486:1189#0
-AGGCTTCTCAAATCATGAAAATTATTAATATTACTGCTGTTAGAGAAATGAATGAGCCTACAGATGANTGCATCNN
-+
-67777788888888888888888877776555443222100//..---,,+,+****))))((((''"""""##""
- at 30BB2AAXX080903:3:39:715:1507#0
-CATGATTTGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTGCAGTGCCTC
-+
-67777788888888888888888877776555413232100//.-----,+*+***))))))('((&$&$%%"$##
- at 30BB2AAXX080903:3:60:263:1064#0
-CATGATTTGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTGGACTNCCNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*))))('&&&"#"#$""
- at 30BB2AAXX080903:3:41:1638:1919#0
-TGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGTTCTTCTACTATTAGGACTTTTCGCTTCGAGCGAGNG
-+
-677777888888888888888888777765554432221.00/.-.-,,+,++***)*)))()((('%$%$&#"""
- at 30BB2AAXX080903:3:59:527:1146#0
-GAATGTGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGTTCTTCTACTATTATGCTAGAC
-+
-67177788888888888888888877776555423222101//...--,,+++*))))*()((('(''$%#"%"##
- at 30BB2AAXX080903:3:37:874:932#0
-TATACGGGTTCTTCGAATGTGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGTTCTCTTN
-+
-67777788888888888888888877776355443222100//..---,,+++++*))))))((('("%&#%$"""
- at 30BB2AAXX080903:3:49:972:544#0
-CCCTCCATAAACCTGGAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGAAGAACCCGTAACGTACGACN
-+
-67777788888888888888888877776555443222100//....-,,++++*)))))))((((($"""####"
- at 30BB2AAXX080903:3:2:1733:1924#0
-GGCTTGAAACCAGCTTTGGGGGGTTCGATTCCTTCCTTTTTTGTCTAGATTTTATGTATACGGGTTCTNCGANTGT
-+
-67777788888888888888888297716555443121000/0.-----,++++*+))))()))'''&"%&$""""
- at 30BB2AAXX080903:3:43:258:523#0
-CATGGGGTTGGCTTGAAACCAGCTTTGGGGGGTTCGATTCCTTCCTTTTTTGTCTAGATTTTATGTATACGGGATT
-+
-6777778888888888888888887777655524/2'212//.--,--,,+++**(*())()((((%&%%%%$"##
- at 30BB2AAXX080903:3:8:1373:597#0
-AGTCATGGAGGCCATGGGGTTGGCTTGAAACCAGCTTTGGGGGGTTCGATTCCTTCCTTTTTTGTCTNTGTACTNN
-+
-67777788888888888883888877775552243222100//.--,-,,++***))*))))(((''"""##$#""
- at 30BB2AAXX080903:3:43:335:1466#0
-AAGGAAGGAATCGAACCCCCCAAAGCTGGTTTCAAGCCAACCCCATGGCCTCCATGACTTTTTCAAAAAGGAGACG
-+
-67777788888888888888888877776555443212100//*---,,,*+*)(*(())*)(#((''$%&"""""
- at 30BB2AAXX080903:3:53:1361:720#0
-CAACCCCATGGCCTCCATGACTTTTTCAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAATAAT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&'"$%$%"##
- at 30BB2AAXX080903:3:50:1007:1109#0
-TCAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAATTATAGGCTAAAGATCGGAACGCACAGCG
-+
-67777788888888888888888877776555443222100//..---,,+++*****))*((((''"##$$""#"
- at 30BB2AAXX080903:3:54:690:226#0
-AGGTATTAGAAAAACCATTTCATAACTTTCTCAAAGTTAAATTATAGGCTAAATCCTATATATCTTAATGGCATCC
-+
-67747788888888888888888877776)55443222100//..---,,+++***)*)*)))(((($$%""""#"
- at 30BB2AAXX080903:3:57:565:1448#0
-AACCATTTCATAACTTTGTCAAAGTTAAATTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGTCCTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('$%%$$$##"
- at 30BB2AAXX080903:3:55:430:492#0
-ACCATTTCATAACTTTGTCAAAGTTAAATTATAGGCTAAATCCTATATATCTTAATGGCACATGCAAGATCGGACA
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))()((('$##&&"#$"
- at 30BB2AAXX080903:3:51:518:1466#0
-CGTCTTGTAGACCTACTTGCGCTGCATGTGCCATTAAGATATATAGGATTTAGCCTATAATTTAACTCTTACNATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((&""""#"""#
- at 30BB2AAXX080903:3:45:1485:1169#0
-GCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCACAGAAGA
-+
-67777788888888888888888877776555443222100//..----,+++***))))(((((('%"#$%"$##
- at 30BB2AAXX080903:3:34:1293:31#0
-ATGGCACATGTAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTNCGCAACNN
-+
-67777788888888888888888877776555443222000//.,--,+,,,++*))))((())'('"%#%"#$""
- at 30BB2AAXX080903:3:4:733:1966#0
-GTGATCATGAAAGGTGATAAGCTCTTCTATGATAGGGGAAGTAGCGTCTTGTAGACCTACTTGCGCTCNCTTANCN
-+
-677777888888888888888888.7776555443222/10-/.,-+,,,+****())((((((('%""%""""$"
- at 30BB2AAXX080903:3:48:1022:440#0
-GCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCCCG
-+
-67777788888888888888888877776555443222100//..---,,++****)))))))((('&"%$$""##
- at 30BB2AAXX080903:3:42:1566:800#0
-CATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCCAGTAT
-+
-67777788888881888888888877776551142222100-.,/.---,,*++****))'(((('%%$"#%##"#
- at 30BB2AAXX080903:3:59:1092:85#0
-CATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTAGATCGCTCACNNA
-+
-67777788888888888888888877776555342222,-1.--,---,,,****)&((('(&'''%&$"#"#""#
- at 30BB2AAXX080903:3:43:81:1783#0
-GAGGGCGTGATCATGAAAGGTGATAAGCTCTTCTATGATAGGGGAAGTAGCGTCTTGTAGAGATCGGAACACTGAC
-+
-67777788888888888888888877776555443222100//..--,,,+++***)*)*))((((&&"#"$"""#
- at 30BB2AAXX080903:3:45:332:817#0
-TGAGGGCGTGATCATGAAAGGTGATAAGCTCTTCTATGATAGGGGAAGTAGCGTCTTGTAGACCTACTTGAGCTGC
-+
-67777788888888888888888877776555443222100//..---,,+++++*))))))(((('&"%$$""$#
- at 30BB2AAXX080903:3:40:1222:517#0
-AGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACACCGTCAGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()((''"&%""##$$
- at 30BB2AAXX080903:3:59:766:1214#0
-TATGAGGGCGTGATCATGAAAGGTGATAAGCTCTTCTATGATAGGGGAAGTAGCGTCTTGTAGACCTACTACGCTA
-+
-67777788888888888888888877776555443.22100//..---,,*++)*)()*()'((#''%$%%##$##
- at 30BB2AAXX080903:3:39:298:1037#0
-GCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGACAGCATAC
-+
-67777788888888888888888877776555443222100./..---,,++***+*)*)))((('($'&%%#%##
- at 30BB2AAXX080903:3:56:696:154#0
-TTATGAGGGCGTGATCATGAAAGGGGATAAGCTCTTCTAGGATAGGGGAAGTAGCGTCTTGTAGACCGACTTGACT
-+
-677777888880888888888886-77-655534120'2#0-.,----+,+$+)')('&('##''#&"$"#"""##
- at 30BB2AAXX080903:3:43:586:671#0
-CGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCAGATCGGACGGCG
-+
-6777778888888888888888887777$555443222100//./---,,++*****)))))()'('&$#"#""""
- at 30BB2AAXX080903:3:2:595:802#0
-AAGTAGGTCTACAAGACGCTACTTCCCCTATAATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCNCACACCT
-+
-677777888888888884088484787765.'45321.000...,-,,++,*+*+*))(()((''(''"$&""#""
- at 30BB2AAXX080903:3:33:257:679#0
-ATGATTATGAGGGCGTGATCATGAAAGGTGATAAGCTCTTCTATGATAGGGGAAGTAGCGTCTTGTANACCCAANN
-+
-677777888/888888888888887777655,44321210//...-+-,,++)**')*))&((((%'""##%#"""
- at 30BB2AAXX080903:3:55:432:1167#0
-CAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTTCTCTTATCT
-+
-677777888880888888858888777765554432200///./-.,-,-+,+**)*)))))(((&&$%#%#"##$
- at 30BB2AAXX080903:3:43:1568:1248#0
-CAGATAAGGAAAATGATTATGAGGGCGTGAGCATGAAAGGAGATAAGCTCTTCTATGATAGGGGAGGTAGGCCATG
-+
-6777778888888&8888888888777+65)'44322210&//..---,,,+%+***(*))(((&&'"%$%""#""
- at 30BB2AAXX080903:3:46:1439:942#0
-CCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTNTTACACTC
-+
-677777888888888888888888777765554432211/0//.----,,,++***)*)))))((('""%%&####
- at 30BB2AAXX080903:3:3:1044:1142#0
-GAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTAGATCGGAAGAGNTCGNNAC
-+
-6,7777888888888888/38808071;03.22500110.0//-,*-,+,++*'**()()'((&&'%""""%"""$
- at 30BB2AAXX080903:3:46:451:320#0
-AAAAGGGCATACAGGACTAGGAAGCAGATAAGGAAAATGATTATGAGGGCGTGATCAAGATCGGAAGCACGAGAGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))((((&"$#""#""#
- at 30BB2AAXX080903:3:58:104:1767#0
-TTATCACCTTTCATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTNNN
-+
-67777788888888888888888877776555443222100//..---,,,++****)))(((('(''$%%##"""
- at 30BB2AAXX080903:3:50:234:1426#0
-TGTTAGGAAAAGGGCATACAGGACTAGGAAGCAGATAAGGAAAATGATTATGAGGGCGTGATCATGAACGCTGTCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))()(((''"$"#"""##
- at 30BB2AAXX080903:3:34:1707:1614#0
-AGTGTTAGGAAAAGGGCATACAGGACTAGGAAGCAGATAAGGAAAATGATTATGAGGGCGTGATCATNCACATCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()(('"$#%"#$""
- at 30BB2AAXX080903:3:44:1659:430#0
-CATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCAAGATCG
-+
-67777788888888888888888877776555443222100//..---,,++++****))))((((''&"%%#"#$
- at 30BB2AAXX080903:3:38:671:627#0
-TGATCACGCCCTCATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACCTGCAACATCA
-+
-677777888882888888888888-777655/44321/100./----,+,++*+*')))))()(#'#"$"#"""#"
- at 30BB2AAXX080903:3:41:759:1319#0
-ATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTAATCCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(('(&&&&$%##$#
- at 30BB2AAXX080903:3:8:1519:1870#0
-AATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTNATCATCNN
-+
-67777788888888888888888877776555443222100//...--,,+++***))))))()(''"'#&%"#""
- at 30BB2AAXX080903:3:36:1488:883#0
-CTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAACGCGACACNN
-+
-67777788888888888888888877776555443222100//..---,-+++++**)))))((((#""$"#"$""
- at 30BB2AAXX080903:3:59:1110:1393#0
-CTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAAATAGCACCTA
-+
-677777888888888888858888777765554432221000/..---,,,++****))*()))((''&&%"#$##
- at 30BB2AAXX080903:3:34:346:1269#0
-TGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAAATNCACACANN
-+
-67777788888888888888/88897776555443222000//..---,-,,+***)*))))))((("%"#"##""
- at 30BB2AAXX080903:3:49:1047:531#0
-TGCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAGATCGGAATGGTAGCC
-+
-67777788888888888888888877776555443222000//..---,,++++**))))))'((&'""""""""#
- at 30BB2AAXX080903:3:34:137:253#0
-CACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGNGACCACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))((((&""$####""
- at 30BB2AAXX080903:3:54:1327:1827#0
-GATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGTTTCTATTTCCTGAGAGATCGGAAGAGATGTCCAC
-+
-6777778888888888888888887777655544-02.200-/.----,,)++**)))))'))%((#'""%$###"
- at 30BB2AAXX080903:3:40:1118:1481#0
-TCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCCTCCC
-+
-67777788888888888888880878776455443222100/...,--,-+,+++))***()(((''$%%&#%%#$
- at 30BB2AAXX080903:3:57:346:1419#0
-GGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGTTTCTATTTCCTGATGTCTACG
-+
-6777778888888888888888887747655544322000)..-.'-,*,+***&**))&()('(''$"#"#"###
- at 30BB2AAXX080903:3:40:137:1657#0
-CAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTNGCACGCAC
-+
-677777888888888888888878777765554422221/0/0.----,,+++***)*))(((((('""#"%#"##
- at 30BB2AAXX080903:3:33:1721:302#0
-GTAGGGATGGGAGGGCGATGAGGACTAGCATGATGGCGGGCAGGATAGTTCAGACGGGTTCTATTTCNACAACANN
-+
-6777778888888888888888887777655544322210/./.----&,+*+*)*)#()(((((('"$#""##""
- at 30BB2AAXX080903:3:39:531:1123#0
-GTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGGTTCTATTTTCTCTCTGCT
-+
-6777778888888888888888887777655544320210.1/.,,--,,)*+*'**'()&)#(((#&&"""""""
- at 30BB2AAXX080903:3:59:417:959#0
-GTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGTTTAGATCGGAATTCTNNA
-+
-67777788888888888888888877776555443222100./...--+,++++**)&)))()('('&$""$""""
- at 30BB2AAXX080903:3:56:289:1815#0
-CTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCAGACCGTCCACC
-+
-6777778888888888888888887777655544322210/../..,-,,,++++))*))))(((''$&&"#$###
- at 30BB2AAXX080903:3:40:161:506#0
-TCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCGTACGCATC
-+
-67777788888888888888888877776555443222100//..----,+++***)))))))(('&%"$&%"""#
- at 30BB2AAXX080903:3:60:449:1142#0
-TCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTCACATNN
-+
-67777788888888888888818877776555443222100//..---,,+++***)))*)())('(&$#"$$"""
- at 30BB2AAXX080903:3:46:287:649#0
-GATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGGTCAGATCGGGAGAGCGACTGCG
-+
-67777788888888888888888877776555443222100//..(,-,+,*+)*')*)&'((#(''&$""$""#"
- at 30BB2AAXX080903:3:48:93:1377#0
-GATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGGTTCTCATTTCCGC
-+
-67777788888888888888888877776555443222100//..,,-,,+++&*))))')(()(&&&##$#$#$$
- at 30BB2AAXX080903:3:51:647:724#0
-GATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGGTTCTCTATCAGAC
-+
-67777788888888888888888877776553443222100//..+--,++++(*)*)())(#&(&'%##"###$#
- at 30BB2AAXX080903:3:3:712:1239#0
-AGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTANTCATNTA
-+
-67777788888888888888888877776555443222100-//.--,,-++*+**))))'((((''$""$$$"""
- at 30BB2AAXX080903:3:36:1671:634#0
-ATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCCACCTGACNN
-+
-67777788888888888888888877176555443012120./.-,&+,(,+%***)&)()('((''&&#""#$""
- at 30BB2AAXX080903:3:41:855:309#0
-TGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGGTCAGATCGGGGAGCT
-+
-67777788888888888888888877776555443222100//.,----,+,****(()('('#('%"&&"%"#$"
- at 30BB2AAXX080903:3:2:505:1137#0
-AAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCAAGATCNGACACGA
-+
-67777788888888888888888877476.55443212211//...,,-,,,*++*()()((((('%%"""$####
- at 30BB2AAXX080903:3:42:128:1864#0
-AACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTGACCTAAAC
-+
-67777788888888888888388(77776556443212100//.-+--,-+++***)*))))(''(&&&&"##$"#
- at 30BB2AAXX080903:3:41:601:1383#0
-ACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACACACCAA
-+
-67777788888888888888888877776555443222100//..----,,++*+***))))()(('&%&%%%#"#
- at 30BB2AAXX080903:3:48:816:561#0
-CTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCACACGTC
-+
-67777788888888888888888877776555443222000//..---,,,++***))())))(((#&%#$"##"#
- at 30BB2AAXX080903:3:4:1342:574#0
-GTCTGTTATGTAAAGGATGCGTAGGGATGGCAGGGCGATGAGGACTAGGATGATGGCGGGGAGGAGATNAGACNAN
-+
-673773888888888888888'88771765$1415*2.20///,+-,,,++*))**()((#&')#'%""""##"""
- at 30BB2AAXX080903:3:43:1085:168#0
-TCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTAGATCGGAGGCGCCT
-+
-67777788888888888888888877776555443222100//.--,-,,++**+*)*)((()((('&""%#""#"
- at 30BB2AAXX080903:3:56:821:1211#0
-TCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACCACCAC
-+
-6777778888888888888888887777655544322210///..---,,-++***)**(())((('$&%"%&#$"
- at 30BB2AAXX080903:3:56:966:1583#0
-CTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATAGATCGGAAGAGCGTCATG
-+
-67177788888888888888888877776555443222+0///-.-,(,,+++***)*)()#)(&('&&$#"$#""
- at 30BB2AAXX080903:3:33:602:212#0
-TGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTAGATCGGNTGCACTNN
-+
-67777788888888888888888877776555443222100//.---,,-+++***)))())(((('""##"%"""
- at 30BB2AAXX080903:3:57:1069:1572#0
-CCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGTGCCACTA
-+
-677777888888888888881888777765554431221/00/./--,,,+++)***)))(()(%('$$&$###"#
- at 30BB2AAXX080903:3:3:780:775#0
-GAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACCNGCACNTC
-+
-6477778888888888/.22884877713-.121121/.0.'..,,*,,+*+)*)(()()'((('%%"""$"#"##
- at 30BB2AAXX080903:3:34:765:1500#0
-AACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTGACATAACANACATCTNN
-+
-67777788888888888888888877736555443221100//.,---,,++++*)(*()())((('"#%#"##""
- at 30BB2AAXX080903:3:4:1576:1178#0
-ACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGANCTATNAN
-+
-67777788888888888888888877776555443222101/....-,,-,*++**)*)))()((('$"$##""#"
- at 30BB2AAXX080903:3:36:687:92#0
-GTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGNGCGACCAN
-+
-6777778888888888888888887777655544322210///.--+,,,++++*))*)))()((''""#"###""
- at 30BB2AAXX080903:3:40:329:1065#0
-ATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGNGCTTAGGT
-+
-67777788888888888888888877776555443222100//..-----+++++*)*))*)((((&"&""#""""
- at 30BB2AAXX080903:3:59:663:1521#0
-ATCCTGCCCGCCATCATCCTAGGCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGCGCGCCG
-+
-6771778888888888888888*0777760554)2221000//.----,,,+++***)*)((((((&$&#%#####
- at 30BB2AAXX080903:3:3:437:1518#0
-TGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCNCCACNCA
-+
-677777888888888888288882977765555402211/.//.-,--,++*+***())(())(((#&"#""#""#
- at 30BB2AAXX080903:3:53:188:62#0
-GCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCGACGACACC
-+
-67777788888888888888888877776555433222110//+.--,,-++++))*))())'((#'$"$&##""#
- at 30BB2AAXX080903:3:52:719:515#0
-GAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGAAGCTGGTCG
-+
-677777888848888888)88888777-6555443222+00//-+---+,+++***))))()''((#"##$%%""$
- at 30BB2AAXX080903:3:55:513:1425#0
-GGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGCNGGTAGAT
-+
-67777788888888888888888877776555443222100//..---,-+++****)))))(((''$""##&$#$
- at 30BB2AAXX080903:3:4:299:1016#0
-GCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGTNGCCANCN
-+
-67777788888888888888888837776/4550320210/./.--,--,++*++))*())(''(&'"""%$""#"
- at 30BB2AAXX080903:3:50:1500:524#0
-CATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCGCCTCCCG
-+
-67777788888888888888888877776555443222100//..---,,+++****))())(((('&$$$""$#"
- at 30BB2AAXX080903:3:52:1272:1210#0
-AAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGCATGTTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((&'"%"%%%""$
- at 30BB2AAXX080903:3:57:861:723#0
-AAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTCGCCGTGAC
-+
-67777788888888888888888877476552443221000/-/,--,+,++****)))()(((''#"$##$$"#$
- at 30BB2AAXX080903:3:42:796:43#0
-ATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCCCCCTTC
-+
-67777785888888888888888877/7655284321100.-//.---,,+,+++)*('((((('&'&""""%%#"
- at 30BB2AAXX080903:3:3:284:1697#0
-TAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTNAGCTNAC
-+
-67777788888888888488888677766-55413)22,././(*.--++,+*&**)()(&)((('#"""&"#"##
- at 30BB2AAXX080903:3:47:1657:1407#0
-GTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGGAGAGTCTAT
-+
-677777888888888888888888777765554432221/0/....--,,,++***))))((((((&$"#""#"""
- at 30BB2AAXX080903:3:48:367:704#0
-GGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAATGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGACA
-+
-6777778888888)888888+68877776555445212100//..-+-,,++++*))))&)'()&('"$""$###"
- at 30BB2AAXX080903:3:43:134:941#0
-ATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCA
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()(((''%&%$%##$
- at 30BB2AAXX080903:3:54:870:526#0
-TCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCTCTTACAAC
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))))(('&"'#"%%"""
- at 30BB2AAXX080903:3:4:1682:201#0
-CCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCNTGTCNCN
-+
-67777788888888888888888877776555430222110//..--,,,,++(**))*))'''('&$"##"$"#"
- at 30BB2AAXX080903:3:41:863:738#0
-TGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGGGGGGAGGAGAGCGGACGAATA
-+
-677777888888888888888888774764454432220100/..--,,&+++*#')))()(()(##%'"""###"
- at 30BB2AAXX080903:3:60:923:194#0
-TGATGGTAAGGGAGGGATCGCTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGCGCAGTNN
-+
-677777+8888888888888&88676$1(,454,3220/00//.-)-+,+++++)(*)*(*((#(%#'$%$%""""
- at 30BB2AAXX080903:3:2:934:336#0
-AGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCAGATCNTGCTGTC
-+
-677757888882888882838888777765098412121//-/.---+,,+*+***)((('((((''&""""#""#
- at 30BB2AAXX080903:3:42:1471:645#0
-GATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGGAGGGATGGGAGGAGATCGCACA
-+
-6777778888888888888888884777655540322/100//.----,),'+$**)*(')))(((#'"#$$$%$%
- at 30BB2AAXX080903:3:4:89:493#0
-GATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGAGTAGGGATGGGAGGGCNGTAGNAN
-+
-67777788888888881888188877770%5$3(11221(0//(,,-,+++$+*&*)*)(*(((((($""#$#"#"
- at 30BB2AAXX080903:3:55:976:1965#0
-CTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTAAGACCGCTCANT
-+
-67777788888888888888888877776555143222100//..-.,,,*++*)))*((())((('"$""""#""
- at 30BB2AAXX080903:3:33:768:826#0
-ATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCANCACGCGNN
-+
-67777788888888888888888877776555443222100//..---,,,,++****))))(((('"$#$"$"""
- at 30BB2AAXX080903:3:38:1744:450#0
-CAATCGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGTTCACANN
-+
-677-7788388828888888888827746(52140322%0///*,*,),+*,))&*')#')'(##(#&""#"#"""
- at 30BB2AAXX080903:3:55:736:1941#0
-GGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGAAGTCGGACG
-+
-677777888888888888818888777765554431121.0/+..--,,,+++***)))))(((((%"&"""""#"
- at 30BB2AAXX080903:3:39:110:846#0
-TGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGCCAGTACAT
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))(()''&"&$#""#""
- at 30BB2AAXX080903:3:3:1371:137#0
-TGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGTGTACNCACTNTN
-+
-6777770888888888888888087777:5552/12100/,#.*.,+--,+)+)*()()('((#(##&"###""""
- at 30BB2AAXX080903:3:2:63:972#0
-TTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTCNCTCNNAC
-+
-677777888888888888888888777765554432221000..---,,,+,+**))*)))(((''&%"%"""""#
- at 30BB2AAXX080903:3:3:1542:862#0
-ATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGCNAGCANCN
-+
-6777778888888888888888880747653544321-00/.,.,--,,-+,+)**)))()(%'(&'$"$##""#"
- at 30BB2AAXX080903:3:55:844:905#0
-ATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGNGTGCTGCT
-+
-67777788888888888888888877776555443222100//..---,,+,+***)**))((((''"&"%##"#"
- at 30BB2AAXX080903:3:58:1437:514#0
-CATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGCATCTACA
-+
-67777788888/88888888888877776555443222100//,-----,++******&))((((''%$%"$"%$%
- at 30BB2AAXX080903:3:52:468:470#0
-ATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAAACAAATGGACCCAGCAGC
-+
-677777888888888888888888777765554432/2110*/-.--'+,+,%**#))#()(#(('#$##"""##"
- at 30BB2AAXX080903:3:57:815:1074#0
-TCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCACAACA
-+
-67777788888888888888888877776555443222100//./---,,+++*+*))*))))(((''#%%#"##"
- at 30BB2AAXX080903:3:35:351:1316#0
-ACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAGNACCGTCGN
-+
-677777888888888888888888777765553421221000/..---,-*,+))****((((((('"$$$""#""
- at 30BB2AAXX080903:3:39:1404:1268#0
-TAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAACTCA
-+
-67777788888888888888888877776555443222100//..---,-+++***(**)()()(('&&%#""###
- at 30BB2AAXX080903:3:54:1060:107#0
-CTTTACATAACAGACGAGGTCAACGATCCCTCCCCTACCCTCAAATCAATTTGCCACCAATGGTAAAGTGTGTACA
-+
-677777888888888888888888777765$544%2'22*)-,(/,-+++*$))*(()((##&%'(#"#$"%"###
- at 30BB2AAXX080903:3:59:223:1396#0
-TACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTCCTNNC
-+
-67777788888888888888888877776555443222100/...---,,,++*****))()(((('&&&&%$""$
- at 30BB2AAXX080903:3:34:848:357#0
-CATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCNATCGCANN
-+
-67777788888888888888888877776555443222100//..---,,+,++*)**))))(((('"""#"$#""
- at 30BB2AAXX080903:3:39:1116:834#0
-TGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCCTCTGTTCT
-+
-67777788888888888888888877776555443202100//...-,,,+*+**+**))()(((('"&&%%%$##
- at 30BB2AAXX080903:3:39:424:471#0
-TGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTGT
-+
-677777888888888888888888777765554432221000/..--,,,+++****))())(((('"$&%$%#""
- at 30BB2AAXX080903:3:43:938:221#0
-AACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGCACATC
-+
-6777778888888888888888887777655444322210000...-,,-,+***(*)))()(('('&&%$#%#"#
- at 30BB2AAXX080903:3:49:133:1841#0
-AACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACNAGTAGACA
-+
-67777788888888888888888877776555423222000//..---,-++++*'*(()))(((('"#%%#""#"
- at 30BB2AAXX080903:3:40:606:1392#0
-GTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGCTCTCGTCT
-+
-67777388888888888888888877776555441221100//..---,,,,+***))))()((((&%"%%$#$#"
- at 30BB2AAXX080903:3:1:525:79#0
-GACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACATACGAGCANACNAAAC
-+
-67777784888888888808448698-024.5/4-00100/1'.%,,+,+))*)))()(%'('''&#%""%"""#$
- at 30BB2AAXX080903:3:3:792:1854#0
-GACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGCACCTACGAGTANTCCNNCA
-+
-677777888888888888888888777765654432/1000//./.-(+,,)*+*)#**()(()'('$"#&$""$#
- at 30BB2AAXX080903:3:44:691:469#0
-GACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCGACT
-+
-67777788888888888888888877776555443222000//...-,,,+*++**)))))))(((''&""%%$##
- at 30BB2AAXX080903:3:33:190:1612#0
-AGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTNCACTTCNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))()'(&""#$""$""
- at 30BB2AAXX080903:3:51:512:248#0
-AGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTCTATTTGTC
-+
-6777770888888888888888887777655534322/200/...---,,++++**)))))((('%'%"""""%$$
- at 30BB2AAXX080903:3:37:1317:183#0
-ACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTAACCAGATCN
-+
-677777888888888888888)0137(065/52112+.12//+*--)*,-$**&)))((''&(''#%"#%""""#"
- at 30BB2AAXX080903:3:50:275:520#0
-ACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACACACTC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((('('%"#""##""
- at 30BB2AAXX080903:3:34:1764:1302#0
-TAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTNTTGTCGNN
-+
-677777888888888888888888777765554432221/0//-.---,-+++***))))))()'('""#$"#"""
- at 30BB2AAXX080903:3:44:349:962#0
-CGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCGACTAC
-+
-67777788888888888888888877776555443222100//..---,(,++***)*))(()(((''&$&#$###
- at 30BB2AAXX080903:3:3:1704:1108#0
-GTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGAATCGTNCACANTN
-+
-6777778888888888888888887777655544122210///..---,,+++***)))))('((&''"#$&#"""
- at 30BB2AAXX080903:3:57:1595:719#0
-GTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGCAACGCACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&%$"$"$$##
- at 30BB2AAXX080903:3:34:1733:2032#0
-ACGTAGTCGGTGTACTCGGAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGAGNCAACAGNN
-+
-277777888888888888088888777765554432-21//....-,--,+***+))))))(()('%"$""%""""
- at 30BB2AAXX080903:3:57:357:1511#0
-GCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGAGATCGGACGTCGCG
-+
-6777778888888888888888817777655544322210,/.------,++*****)*)*)((''('"#""#"#"
- at 30BB2AAXX080903:3:3:1126:1638#0
-GTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCACTTGATTTGATGGTAAGGGATNCACTNTA
-+
-6-7777888888888882288888.77765551422.1100./.,-,'+++'*+**()))''((((%""$"##"##
- at 30BB2AAXX080903:3:58:1286:1597#0
-AGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGCGGACCCCN
-+
-67777788888888888888888877776555483-30100/..-$,,',,+++**))))*((('''"#&#####"
- at 30BB2AAXX080903:3:38:828:29#0
-TTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGAGATCTGAGTCCNN
-+
-67777788888888888888/8887733654541302210/./.,---,+&*+****))(()'((''"#""#"#""
- at 30BB2AAXX080903:3:43:1781:647#0
-GATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGTTGGT
-+
-67777788888888888888188877776555,43221110/0..-,-,,++++****))))()(('&&%&"""##
- at 30BB2AAXX080903:3:52:391:879#0
-AGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTGCCGCGTCG
-+
-67777788888888888888888877776555443222100/...---,,,+++**))**)((((''"#"##"""#
- at 30BB2AAXX080903:3:4:726:1575#0
-TGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGAGCNCTATNCN
-+
-67777788888888888888888827176555,432120//./.,-,,+-*,+)*)')))(()((##$"%""#"#"
- at 30BB2AAXX080903:3:51:755:1179#0
-TGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATAGATCCGCCACGGC
-+
-67777788888888888888888877776555443212100//...--,,-++)**)**))()(((#%"##"#""#
- at 30BB2AAXX080903:3:56:1135:164#0
-TTGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTCATTTGATGGTGCACC
-+
-677777888888888888888888777;655544322-110//...--,-,*+*()())))(((('%%$%%%%##"
- at 30BB2AAXX080903:3:40:717:415#0
-TGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGGTCAGTACCATTGGTGGCCAAACGATTTGTT
-+
-67777788-88888888888888877%760554&3+1.+00*...,-,,+%,)**#*()'))'(&&#"%"$#%""#
- at 30BB2AAXX080903:3:38:279:1549#0
-TCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCGACTACGGCGGACTAATCTTCAAACCCTCATC
-+
-67777788888888888888888877776553423222200/.,..,-,,+,+***#)))('((&&'""%#%%$$%
- at 30BB2AAXX080903:3:41:666:1859#0
-TGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCAAGATCGGCAG
-+
-67777788888888888888888877776555443222000//..--,+,++++**()(()))('(($$&##"$#"
- at 30BB2AAXX080903:3:49:119:150#0
-TGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATNCGACAGAC
-+
-67777788888888888888888877776555443222100//..---,,+++****)*))()(('&""""$""##
- at 30BB2AAXX080903:3:57:310:1321#0
-TAATGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACGCGTGTGAT
-+
-2777778888888888+8888888777765554132221000/..--',++)%(**)*)#&'&('(&%"$%"##""
- at 30BB2AAXX080903:3:38:1033:443#0
-CCAATGGAACTGAACCTACGAGTACACCGACTACGGCGGACTAATCTTCAACTCCTACATACCTCCCCCACTCTGC
-+
-6777778888888888888888-877776-5944321200.*-/,,+,)(,+')*%)))#()#&'('"%##$##$%
- at 30BB2AAXX080903:3:40:1172:1477#0
-ACTGAACCTACGAGTACACCGACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCCGAACGTGTGACCAC
-+
-67777788888888888888888877776555//32)%00$)0(,.,++,+++)#*#))))'(&#(''$%&"$##"
- at 30BB2AAXX080903:3:59:1031:2034#0
-ACTGAACCTACGAGTACACCGACTACGGCGGGGTAATCTTTAAATCCTACATAATTTCCCCCCTATTCCTCAGCAC
-+
-6777778888888888888888887777655$%1++/#00&%.&'&+)'$*$*$%)'$)''##(#''"&$%%"$$$
- at 30BB2AAXX080903:3:8:523:818#0
-GCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACNCTACTCNN
-+
-6777778888888888888888887775655244322210///..-.-,,+++****)))))(('''"#""$"#""
- at 30BB2AAXX080903:3:58:191:1468#0
-TACGAGTACACCGACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATAGATCGGAAGAGCTGCCTNNC
-+
-6777778888888888888888887777655544322210//....-,--,,+)+***))))()(('%"%"#"""#
- at 30BB2AAXX080903:3:59:859:876#0
-TACGAGTACACCGACTACGGCGGACTAATCTGCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGTGTCAC
-+
-27772788888888888)888888(777'/5,453332(0//..-).,,(+++***))((((((('%&$%%$$###
- at 30BB2AAXX080903:3:45:1579:1444#0
-CAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGGGGGCTCG
-+
-67777788888888888888888877776555443222100//..---,,+++****))))(((((&&$#"""""#
- at 30BB2AAXX080903:3:50:247:1697#0
-TCAAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGGAGTTGAAGATTAGTCGGCCAGAAT
-+
-67777788888888888888888877776555453222100.....--,,+++*+*)()))()((('""#""""""
- at 30BB2AAXX080903:3:48:896:136#0
-CTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGAC
-+
-67777788888888888888888877776555443222100//..---,,++++*)))))))()(('&$%%"%##"
- at 30BB2AAXX080903:3:37:720:806#0
-GCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGAGATCGACCTCTCTN
-+
-67777788888888888888888877776555443222100//..---,-,+++*))))))((('('"%#"###""
- at 30BB2AAXX080903:3:37:1175:265#0
-TAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTCGATCTCN
-+
-67777788888888888888888877776555443222100//..---,,+,+**))))))()(''%$"%""$"$"
- at 30BB2AAXX080903:3:47:1293:1247#0
-CGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGGAGTTGGACTCGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))()((('#$""""#$""
- at 30BB2AAXX080903:3:2:201:1492#0
-TACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGCNGTTNNCT
-+
-6777778888888888888888484773555.4432121////..-,,+,++++****))((((''&$""""""#"
- at 30BB2AAXX080903:3:43:257:118#0
-CGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGTAAGTACGTGA
-+
-6777778888888888888888887777655544322210$-/.-*,-),++*+*())(((((((#'%&""""#""
- at 30BB2AAXX080903:3:59:280:177#0
-CAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGGCGCAGGGCGCCTGGGGGATCGGGAGGGGGGGTGTGNNC
-+
-6777778888888888888-8+8875776)5,'432(,10,'..')-,+$('#$*'#(&(%&'##&''"""#$""#
- at 30BB2AAXX080903:3:39:1664:628#0
-TACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTCC
-+
-67777788888888888888888877776555443222100///.---,-+++***))))()((((''$"%%%$#"
- at 30BB2AAXX080903:3:59:912:1892#0
-CTTCAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGGTCTAGGAAGATCCGACACCG
-+
-6777778888888888888888887771355502132200,./+---,&,*++++&)()&))'((&#$"%"$####
- at 30BB2AAXX080903:3:53:487:1066#0
-GGGGCTTCAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGGTCTAGGAAGCTCGTAG
-+
-67777788888888888888888877776555443222100//.----,,+&+****))'))((('&%$#$"%""#
- at 30BB2AAXX080903:3:45:1653:1285#0
-GGGGGCTTCAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGTGGATCGGCAGTGCGG
-+
-677777888888888888,8088/77786555&12+2#1'0..-.*,-,,-,))*)*(&)'#)&%%&"$"%""##"
- at 30BB2AAXX080903:3:52:987:308#0
-ACGAATGGGGGCTTCAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCAGATCGGCACAGGTCG
-+
-67777788888888888888888877776555443222010//..-.-,,+++***))())()((('"##"%""##
- at 30BB2AAXX080903:3:50:168:1256#0
-TACGAATGGGGGCTTCAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGCTTCACGAT
-+
-67777788888888888888888877776555443222100/...---,,-+****)))%))'((('"""##$#""
- at 30BB2AAXX080903:3:59:1069:949#0
-ATACGAATGGGGGCTTCAATCGGGAGTGCTACTCGATTGTCAACGTCAAGGAGTCGCAGGGCGCCTGGGTCCAACC
-+
-67777788888888888888888807476555443.2210/-/---,,,,+%+)'*')*)#')((&#'"$#$#$$#
- at 30BB2AAXX080903:3:53:1388:1053#0
-CCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCGCTCGACNC
-+
-677777888888888888888888777765554432+2100//..--*+,+,++**)*)(((()#'&"##$"##"$
- at 30BB2AAXX080903:3:53:1388:1055#0
-CCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGAGTTAAGCCTCCGCTCGACAT
-+
-+77777888888888&82888888+7776.554(32221/0/..,--),++,****))())(('&''"$"%$$###
- at 30BB2AAXX080903:3:8:1568:1708#0
-TAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATNTCTATCNN
-+
-67777788888888888888888877776555443222000/...-----+++**))(()())((''"%$"#$#""
- at 30BB2AAXX080903:3:49:888:799#0
-AGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGCACAACA
-+
-677777888888888888888888777763554432221000/.-----,,,+++*)))())))(''&%#"#"#"#
- at 30BB2AAXX080903:3:34:923:1335#0
-AATTATTATACGAATGGGGGCTTCAATCGGGAGTACTACTCGATTGTCAACGTCAGATCGGAAGAGGNCCACTANN
-+
-67777788888888888888888877776555443222200/...---,,-++****))))(((('&"$$#"""""
- at 30BB2AAXX080903:3:44:963:1402#0
-CAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCCTTCGTATAATAATTAC
-+
-67777788888888888888888877776555342222100./.--.,,,+,**)))*'#))((('&&#"$%$%##
- at 30BB2AAXX080903:3:41:1544:692#0
-ATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATCGGGAGTACTACTNGATTCTGCAT
-+
-67777788888888888888888877776555443220100//..---,,,,+****)')((('&#''&&#"%""#
- at 30BB2AAXX080903:3:3:50:788#0
-TCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTAGATCGGAAGAGCGGTTCNCGCANAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))(((('%'%"#""#"##
- at 30BB2AAXX080903:3:48:415:1835#0
-AGCTCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATCGAGATCGGAACACATACA
-+
-6777778888888888888888887777655544322210///..---,,+,+****))()))(('%%$#$""###
- at 30BB2AAXX080903:3:39:1217:1534#0
-ACAGCTCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATCGGGAGTACTACCCGGC
-+
-677777888888888888888,38771705554432201000...-*-,,+,#+)()*)())(((%'"%#""""##
- at 30BB2AAXX080903:3:3:378:970#0
-CGAGTAGTACTCCCGATTGAAGGCCCCATTCGTATAATAATTACATCACAAGACTACGTGCACTCAGCNGCACNTA
-+
-/777778888888088+88-88*7367715551431)-00/-/*-+-+,,+(*)*&'&()'('('(&"""%$#"##
- at 30BB2AAXX080903:3:48:332:389#0
-GTAGTACTCCCGATTGAAGCCCCCATTCGTATAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCACA
-+
-67777788888888888888888877776555443222100//..--,,,++*++)**)))))((''%"""$#"$"
- at 30BB2AAXX080903:3:42:1014:996#0
-TGGGGACAGCTCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATAGATCAGGTGAG
-+
-67777788888888888888888877-76+524,3222100/...,-,,+++++*)))&)''('(('&"$%"#$""
- at 30BB2AAXX080903:3:54:405:651#0
-GTGGGGACAGCTCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATCGGGCGTACTG
-+
-67777788888888888888888877776555443222100//..---,,,++****)*)))(((((&#"""""""
- at 30BB2AAXX080903:3:48:927:148#0
-CTAATGTGGGGACAGCTCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATCGGCTC
-+
-67777788888888888888888877776555443222100//.----,,,+++*)*)))))()(('"##%"$###
- at 30BB2AAXX080903:3:39:124:840#0
-TCCCGATTGAAGCCCCCATCCGTATAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCTCCATCATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((&""#$%"#"#
- at 30BB2AAXX080903:3:56:164:1145#0
-AAGCCTAATGTGGGGACAGCGCATGAGTGCAAGACGCCTTGTGATGCAATTATTATACGAAGGGGGGCTTCATGCA
-+
-677707888888888888838888777765534/*2$-+00%/-'-$(,&+*+*+&*))((((((('$"%%#$"##
- at 30BB2AAXX080903:3:48:1028:1375#0
-TCGTATAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAACACAGATGCCTGA
-+
-67777788888888888888888877776555443222100//...--,,+++***)*)))((('(&$""$"""""
- at 30BB2AAXX080903:3:50:1605:1316#0
-GGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTCTTGTGATGTAATCGCCATAC
-+
-67777788888888888888888877776555443222100//...--,,+,+****)*))))(((&"#"####""
- at 30BB2AAXX080903:3:41:936:1607#0
-GTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTCTTGTGATGTTATTTC
-+
-67777788888888888888888877776555443222100/../---,,,+*****())(()((('&&$"&%"##
- at 30BB2AAXX080903:3:1:324:1365#0
-CGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTCTTGTGCNCCNACTA
-+
-6777778838888888888-888877776653.4+23210/*/..-,,,+++++*)*(()('('(''$""#""#""
- at 30BB2AAXX080903:3:4:1469:1727#0
-GACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTCTTGTNATCANAN
-+
-677777888888888888888888777;6555443222100.0..-.-,,+*+)+**'))()()(''""##"$"#"
- at 30BB2AAXX080903:3:58:705:800#0
-TTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTCAGATCAACA
-+
-67777788888888888888888877776555443222100//.-----,+++***()))))(((%'&$""#"###
- at 30BB2AAXX080903:3:39:545:202#0
-TTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTGTTGTGTGT
-+
-67777788888888888888888877772655443202201//..+-+,,+++)***)))((((((&"&#%#$"#"
- at 30BB2AAXX080903:3:2:693:710#0
-GGTTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACTNCTTGCGA
-+
-67.7778888888888-2888888777+3555413212000/....-+,++,**+*)*)()((('(%""$##"$""
- at 30BB2AAXX080903:3:56:118:1345#0
-CGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCTAAACCAACGNCAC
-+
-67777788888888888888888877776555443222020//.----,,,+*++*)())()(((''&#%%%"%##
- at 30BB2AAXX080903:3:33:1223:231#0
-GTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCTAAACCNACACCGNN
-+
-67777788888888888888888877776555443222100//..---+,,+*+*)**)))()'(''"&%%###""
- at 30BB2AAXX080903:3:57:846:32#0
-CTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCCAAACCAAAAGTTGCAC
-+
-67777788,44888888)888888-77765554/32120200/,,.--,,,++'+**'(#)'((('&$%%""""#"
- at 30BB2AAXX080903:3:38:1290:1328#0
-GGTGAAAGTGGTTTGGTTTAGACGCCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCAGCTACAC
-+
-677777888888888888888888'77765.5443222000+/..--,-++,**+***)))(((''''&&"$#%$%
- at 30BB2AAXX080903:3:55:1336:1222#0
-GCGGTGAAAGTGGTTTGGTTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGTCT
-+
-67777788888888888888888877776555443220100//..---,,+,+***))))))(((('&&"#%#"#"
- at 30BB2AAXX080903:3:50:399:847#0
-TAGCGGTGAAAGTGGTTTGGTTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGAGAGCGGGATAGCATA
-+
-6777774888888888.8888+887777655544022211//.....-,,+++*)))*'*))(('('"$"""""#"
- at 30BB2AAXX080903:3:60:1458:90#0
-TCGTGTAGCGGTGAAAGTGGTTTGGTTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGCAACACANN
-+
-6777778888888888888888887777655544322210.//.----,,+++****))))(((((&$$&%%$%""
- at 30BB2AAXX080903:3:39:591:412#0
-CGGTCGTGTAGCGGTGAAAGTGGTTTGGTTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATNTCTGGCTC
-+
-67777788888888888888888877776555443222100//-.---,,++++**)*))))(((('"&"&$"$$"
- at 30BB2AAXX080903:3:48:249:1899#0
-CGTAGTATACCCCCGGTCGTGTAGCGGTGAAAGTGGTTTGGTTTAGATCGGAAGAGCGGGTCAGCAGGCACACCAG
-+
-67777788888888884883882827776)424132021/00/.,-,,$+,$****#*)#'##(#%#"$"$"###"
- at 30BB2AAXX080903:3:56:809:400#0
-GCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGCGC
-+
-67777788888888888888888877776555443222100//..---,-++******))))(('(''%%%#"#""
- at 30BB2AAXX080903:3:49:86:1814#0
-CCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAAGATCGGAAACTCTAAGA
-+
-67777788888888888888888877776555443022//0//..---,,+++**(()*))(&(('#%&#$"""""
- at 30BB2AAXX080903:3:58:451:451#0
-GCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCGGTCGGGGGGGGGGGGAAGAGGGGTGGGGTGGCACTA
-+
-6777778888888+8*88)58888177*0555441.01/.0#-&'.(-,$+,*+#%#(#()(#%%'%"$""###""
- at 30BB2AAXX080903:3:46:1228:901#0
-CGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGGATACTACGGTGAATGCTCTGAAGATCNGTCANTCA
-+
-6777778888888888888888887777650543232210&//...,,,,*(*+)**)))((()(&'"%""""##"
- at 30BB2AAXX080903:3:50:1369:893#0
-GTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGCGGGCACAC
-+
-677777888888888888888888777765554432221-0//,,-,--,,+++*))*))('(((('$"""#"$$#
- at 30BB2AAXX080903:3:40:316:521#0
-GTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCGGTCGTGTAGCGGTGAAAAGATCGNCAGANTTG
-+
-6777778888888888888888887777655544322210.//..---,,,+++***))()(((((&"$&#$"#"#
- at 30BB2AAXX080903:3:53:1411:320#0
-AAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGGAGCCCCC
-+
-67777788888888888888888877776555443522100//..--,,,+,+***))))(((('('"""#$###"
- at 30BB2AAXX080903:3:3:332:1924#0
-AACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATAGATCGGAANTATNNAC
-+
-6777778888888888888888887777655244+00000,/..',++',,++*+()()(('((('%""#""""##
- at 30BB2AAXX080903:3:40:280:850#0
-AACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACNACAGTTTC
-+
-67777788888888888888888877776555443222110//..---,,+(+***)*))((()'('"&%&%%#"#
- at 30BB2AAXX080903:3:54:19:1254#0
-AACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACACTCTC
-+
-677777888888888888888888777763554130+110//.&--,,,,+)*+***)()')'&(&%$"%&####"
- at 30BB2AAXX080903:3:44:772:1528#0
-TGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCGGTCGTGTAGCGGTGAGAGGAGG
-+
-677777888888888888888888777765554433221000/.-..-++,++**#))()(''#('%'$""$""#"
- at 30BB2AAXX080903:3:37:1333:596#0
-CTTTCACCGCTACACGACCGGGGGGATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGCTNCACACN
-+
-677777888888888888888888'723355424+2.1)00..+,-,,*++*)***)))()'(((&'$""%%$%%"
- at 30BB2AAXX080903:3:36:521:647#0
-TTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCGGTGGAGCAAACCACAGCAGTTCATCGN
-+
-67777788288888888888888877476-554312$2,0/..---+,$,*++**))))&('(''#%$""&""$""
- at 30BB2AAXX080903:3:57:835:1005#0
-TTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCGTCACAC
-+
-6777778888888888888888887777655544322210////,---,,+++****))((((('''&%"&&$###
- at 30BB2AAXX080903:3:41:1206:402#0
-ATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCGGTCGTGTAGGTGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++****))))((('('&&%&#%"#"
- at 30BB2AAXX080903:3:46:741:1359#0
-ATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCAGATCGGAAGAGGCGACCT
-+
-67777788888888888888888877776555443222100//..----,+++*****))))(((('"$"#""##"
- at 30BB2AAXX080903:3:43:384:520#0
-CGATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATAGATCGGAAGAGCGGAGCGT
-+
-67777788888888888888888877776555443222100//..---,,,++****)*))((((('$&%$"""""
- at 30BB2AAXX080903:3:41:648:339#0
-ACGATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCGGTCGTGTACAGG
-+
-67777788888888888888888877776555443222100//..--,,,+++***))))))(((((&&%#$"#""
- at 30BB2AAXX080903:3:46:1790:517#0
-ACGATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCAGATCGGATGTGG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$%$""#""#
- at 30BB2AAXX080903:3:35:68:47#0
-GACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTNTCCACCNN
-+
-67777788888888888888888877776555443220100//...-,,,,+++**)*))))()(''""$#$#$""
- at 30BB2AAXX080903:3:45:45:1174#0
-TAATTCTAGGACGATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGTGCATTGACCGCAGTATCGCACAGTC
-+
-6777778888888888888888&87'770551/45(1/0/+//.,--#',(++*(***)))%)((('$"%&%##"#
- at 30BB2AAXX080903:3:4:858:1672#0
-GGGGGTATACGACGGTCAATGCTCGGAAATCTGTGGAGCAAACCACAGTACCATGCCCATCGTCCTAANGTTCNCN
-+
-67777-888888888888888488$77.055544021110/..---.-+-&')**))))()'(('#'"""#"$"""
- at 30BB2AAXX080903:3:41:1449:963#0
-GGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCAGATCGGAAGAGCTGATC
-+
-67777788888888888888888877776555443222100//..----,++++***))))))((('&%%#""#""
- at 30BB2AAXX080903:3:54:361:148#0
-TACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAAGATCGGATGAGGCCA
-+
-67777788882888888888888877776.554322221.0./..+--,,++***))))(')(((''""$##"##"
- at 30BB2AAXX080903:3:39:1478:1360#0
-ACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAGATCGGAAGACGCTACA
-+
-6777778888888888888278887777655534322210///.-..,,,**+*))(*()(('(((%"$""""#$"
- at 30BB2AAXX080903:3:57:418:358#0
-CTATTTCAAAGATTTTTAGGGGAATTAATTCTAGGACGATGGGCATGAAACTGTGGTTTGCTCCACAGATTCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))(((''&$$$"####"
- at 30BB2AAXX080903:3:47:553:1649#0
-AACCACAGTTTCATGCCCATCGTCCTAGAATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATCTCCACCTC
-+
-67777788888888888888888877776555443222000//.----,-+++***)*))(((((('"$"$""#""
- at 30BB2AAXX080903:3:33:633:44#0
-CACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAAGAGAACCAACACCTCTTTACAGNCGACCANN
-+
-67777788888888888888888877776555443222100//..-.-,,+,+*****)))))((('"%"$$##""
- at 30BB2AAXX080903:3:47:883:1377#0
-GCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAAGAGAACCAACACCTCTTTACAGTGAAATGCCACAGCATCT
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()('''"&%"&""""
- at 30BB2AAXX080903:3:36:1201:1481#0
-AGAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCATAATTAGAGCGGAGTGN
-+
-6777778888888-888888888877776555443222100//..--,,,+++***))))))((((&$$%%#&$#"
- at 30BB2AAXX080903:3:48:1399:1131#0
-GAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCATAATTACCCCCATAGCCC
-+
-6777778883.8888888881888777745555/322212,//.--,--++*++**))())&(('(#%$""""##"
- at 30BB2AAXX080903:3:41:370:46#0
-CCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCATAATTACCCCCATAAGATCGA
-+
-67777788888888888888888877776555443222100///.---,,+,++**))))))(((''&%%&&%#""
- at 30BB2AAXX080903:3:40:930:166#0
-ATAGTGTAAGGAGTATGGGGGTAATTATGGTGGGCCATACGGTAGTATTTAGTTGGGGCATTTCACTTGAAAGCAT
-+
-67777788888888888888888877776555443222100/...,-,,-++****)*((')(''''"#&""$"""
- at 30BB2AAXX080903:3:35:1689:1731#0
-TGAGGAATAGTGTAAGGAGTATGGGGGTAATTATGGTGGGCCATACGGTAGTATTTAGTTGGGGCATNTACCACAN
-+
-67777788888888888888888877776555443222100//..---,,+*+****))))(((&'&"$"#$###"
- at 30BB2AAXX080903:3:54:167:2042#0
-GGTGATGAGGAATAGTGTAAGGAGTATGGGGGTAATTATGGTGGGCCATACGGTAGTATTTAGTTGGGTGTGCTCT
-+
-67777788888888888888888877776555443222100//....,,-,++*+*))**)'('(''&"""""""$
- at 30BB2AAXX080903:3:49:1491:672#0
-GAAATGCCCCAACTAAATACTACCGTATGGCCCACCATAATTACCCCCATACTCCTTACACTATTCCTCCTCCCCC
-+
-67777788888888888888888877776555443222100//.-,---,+++****))))))((('"$##$$"$"
- at 30BB2AAXX080903:3:52:1229:1602#0
-GGGTGATGAGGAATAGTGTAAGGAGTATGGGGGTAATTATGGTGGGCCATACGGTAAGATCGGAAGAACGCATATC
-+
-67777788888888888888888877776555433222100//..-,,,,+*+***))))(()(((#$%#$""##"
- at 30BB2AAXX080903:3:39:1032:1412#0
-TGGGTGATGAGGAATAGTGTAAGGAGTATGGGGGTAATTATGGTGGGCCATACGGTAGTATTTAGTTTGTGGATCG
-+
-6777/78888888888888888887777655544/2321/0//..--,+,,,+**)))%((()((&'"%"#""##"
- at 30BB2AAXX080903:3:35:1368:1190#0
-TACCGTATGGCCCACCATAATTACCCCCATACTCCTTACACTATTCCTCATCACCCAACTAAAAATANTACGACAN
-+
-67777788888888888888888877773555442311000/-..,.--,+,+)*'))))()(((('"$"&$##""
- at 30BB2AAXX080903:3:51:397:327#0
-TCCTTACACTATTCCTCATCACCCAACTAAAAATATTAAACACAAACTACCACCTACCTCCCTCAGATCAGCAGCA
-+
-67777788888888888888888877776555443222100//..---,,+++**+)))))((((('%%""###""
- at 30BB2AAXX080903:3:48:827:1949#0
-TATGGGCTTTGGTGAGGGAGGTAGGTGGTAGTTTGTGTTTAATATTTTTAGTTGGGTGATGAGAGATCGGTGTACA
-+
-67777788888888888888888877776555443222100//-.---,,+++***))))))(('((%&$""""#"
- at 30BB2AAXX080903:3:1:1335:238#0
-TTATGGGCTTTGGTGAGGGAGGTAGGTGGGAGGTTGGGTTGAATATTTTTAGTTGGGTGATGAGGAATNTCNCATC
-+
-6777778888888888888088'177976%+54432/220&/-(.,,-++$+)**+*()(()'((#%&"%%"#"$#
- at 30BB2AAXX080903:3:33:1244:1003#0
-TTATGGGCTTTGGTGAGGGAGGTAGGTGGTAGTTTGTGTTTAATATTTTTAGTTGGGTGATGAGGAGNTCACGANN
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)))((('(&""%#$""""
- at 30BB2AAXX080903:3:56:695:1485#0
-TTATAACAAACCCTGAGAACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGTCCACA
-+
-67777788888888888888888877776555443222100//..----,++++**))))))((&('$&$%"##""
- at 30BB2AAXX080903:3:51:548:134#0
-GGTAGGCCTAGGATGGTGGGGGCAATGAATGAAGCGAACAGATTTTCGTTCATTTTGGTTCTCAGGGCATGTCGTC
-+
-67777788848888(88)88888877276/55443222100./..-.-+,+,+****)())((((('$"""$#$#"
- at 30BB2AAXX080903:3:33:813:140#0
-AAACCCTGAGAACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTNCTCTCCNN
-+
-67777788828888888888888870776555443222110//..-.-,-,)++*))))(#(()('&"""&"$"""
- at 30BB2AAXX080903:3:35:57:41#0
-ACTGCGGCGGGTAGGCCTAGGATTGTGGGGGCAATGAATGAAGCGAACAGATTTTCGTTCAAGATCGNACTGCTNN
-+
-6777778888828888888884887777655544322210///..--,,,,++*+))')))()((''""#""$#""
- at 30BB2AAXX080903:3:55:177:33#0
-TGAGAACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACCCGCCATCCGCCA
-+
-67777788388888888888888877776555443222/20//...-,,++,++*))())(()((('"""%#&##"
- at 30BB2AAXX080903:3:1:1744:1275#0
-GATCAGTACTGCGGCGGGTAGGCCTAGGATTGTGGGGGCAATGAATGAAGCTAACAGATTTTCGTTTANTANGCGC
-+
-6777778888888888888,/84+7677)5452/31/-$.+#,$,$,',$%$%'#))(#'((#####""#""#$"#
- at 30BB2AAXX080903:3:35:160:590#0
-GAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACCCGCCGCAGTACTGATCATTCNGNTTGATN
-+
-67777788888888888888888877776555443222100//..---,,+++**)*))))()((('"""""""""
- at 30BB2AAXX080903:3:43:1214:1240#0
-AAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACCCGCCGCAGTACTGATCATTCTATTTCCAGAT
-+
-67777788888888888888888877776555443222100//..--,,,+++*+*))))))(((''&$%&&%%#%
- at 30BB2AAXX080903:3:45:1521:1467#0
-TGCCCCCACAATCCTAGGCCTACCCGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCCACCAA
-+
-6777778888888888888888806777656534322-201//.-,-+,+%**)**)))(()(#'%'&"$#""""#
- at 30BB2AAXX080903:3:38:443:1978#0
-ATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGATCAGTACTGCGGCGGGTGGGCGTGGGGTACATGCCAT
-+
-67777788888888.8883888887777355344/02222,./...--+,+$+**&')*#('#('''$$$##"#"#
- at 30BB2AAXX080903:3:53:233:1784#0
-CCACAATCCTAGGCCTACCCGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCACAGCTCT
-+
-67777788888888888888888877776555143222100//.-.,,,,,,***+)*)('(((('&&$#&##%$$
- at 30BB2AAXX080903:3:37:693:1716#0
-TTGTTGATGAGATATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGATCAGTACTGCGGCGGCAGCGTCGN
-+
-67777788888888888888888877776555423022100./..--,-,++++**)**)))()(('"#"$""#""
- at 30BB2AAXX080903:3:53:359:2024#0
-CGGTTGTTGATGAGATATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGATCAGTACTGCGGCTGCGNGGC
-+
-67777788888888888888888877776555443222100//.-.,-,,,,+***())))((((''"""#""""#
- at 30BB2AAXX080903:3:44:23:239#0
-GGGTGGTGATTAGTCGGTTGTTGATGAGATATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGCTCAGCGT
-+
-677777888888888888888888777765554432121/0//..---,,,++***)))()((((('&$%$"#"""
- at 30BB2AAXX080903:3:50:1005:1852#0
-TGGGTGGTGATTAGTCGGTTGTTGATGAGATATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATCACGAGTC
-+
-67777788888888888888888877776555443222100//..---,-+,+***)))))))('('$$"#""#""
- at 30BB2AAXX080903:3:58:338:941#0
-CATTGTTGGGTGGTGATTAGTCGGTTGGTGATGAGACATTTGGAGGGGGGGATCAATAAGACCGGAAGGGCGGTNG
-+
-6777778888288888888888887777655.4132$2100//(.-(-,,,(+*))))%))%'('#&'$&$#""""
- at 30BB2AAXX080903:3:52:742:1486#0
-TTTGAGGTTAGTTTGATTAGTCATTGTTGGGTGGTGATTAGTCGGTTGTTGAGATCGGAAGAGCGGTTACGGCGTA
-+
-67777788888888888888888877776555443222100//..,.--,,(+)*&)*())&(%('%$"#$""$##
- at 30BB2AAXX080903:3:35:1095:1149#0
-CAACCGACTAATCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGATAACCATACACNACACTACN
-+
-6777778888888888888888887777:555443221100/-..---,-+,+****))))(((('(""$$%$"#"
- at 30BB2AAXX080903:3:40:404:30#0
-TTTAGTGTTGTGTATGGTTATCATTTGTTTTGAGGTTAGTTTGATTAGTCATTGTTGGGTGGTGGTTCGTTCGCAC
-+
-67777788888888888888888877776555543022110//..-,-+,+,+***)*)')('(&('%%&$"$"#"
- at 30BB2AAXX080903:3:39:1091:874#0
-TTCGTCCTTTAGTGTTGTGTATGGTTATCATTTGTTTTGAGGTTAGCTTGATTAGTCATTGTTGGGGTCATGTTTG
-+
-67777783888828888888888847779555443222000/).,---,+&++$**'())(()'(''%""$"%"""
- at 30BB2AAXX080903:3:44:1704:99#0
-TCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGATAACCATACACAACACTAAAGAGATCGAAAA
-+
-6777778888888888888888887777655544322210///..---,,+,+**))*))))(((''&"#&&""##
- at 30BB2AAXX080903:3:44:1253:615#0
-CAGGTTCGTCCTTTAGTGTTGTGTATGGTTATCATTTGTTTTGAGGTTAGTTTGATTAGTCATTGTTGGGGGTGGG
-+
-67777788888888888888888877776555443222100//-.-,--,+,+***)))((((((''&'"&%""#"
- at 30BB2AAXX080903:3:8:438:1040#0
-GATCAGGTTCGTCCTTTAGTGTTGTGTATGGTTATCATTTGTTTTGAGGTTAGTTTGATTAGTCATTNTGTACANN
-+
-67777788888888888888888877776555443222.00//..---,,+++)**))))()(((('""""#$#""
- at 30BB2AAXX080903:3:40:1474:769#0
-ACAATGACTAATCAAACTAACCTCAAAACAAATGATAACCATACACAACACTAAAGGACGAACCTGATCTCTTATC
-+
-67777788888888888888888877776555443222100//..---,,++++**()))))(('('&&&&%%%"#
- at 30BB2AAXX080903:3:48:917:191#0
-CAATGACTAATCAAACTAACCTCAAAACAAATGATAACCATACACAACACTAAAGGACGAACCTGATCTCTTATCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))())'('""&%#####
- at 30BB2AAXX080903:3:34:1231:82#0
-TAGTATAAGAGAGCAGGTTCGCCCTTTAGGGTTGTGTAGGGTTATCATGTGGTTGGAGGTGAGTTTGNCTTATCNN
-+
-67777788888888888)180%887'7-6)55440222000%/.)-,+&,+*+*&)&))'&'((%''"$#$##$""
- at 30BB2AAXX080903:3:33:252:2022#0
-CTAGTATAAGAGATCAGGTTCGTCCTTTAGTGTTGTGTTTGGTTATCATTTGTTTTGAGGTTAGTTTNCTCACCNN
-+
-6777778888888888883888807717:5-504322/$01/..'.+*,,+*++**)'()%(#&(('"&#%%##""
- at 30BB2AAXX080903:3:40:1333:321#0
-CTAGTATAAGAGATCAGGTTCGTCCTTTAGTGTTGTGTATGGTTATCATTTGTTTTGTGGTTAGTTTTGTGTTGTC
-+
-67777788888888888858883872779555443222100/./.-,-,,+*++**(#))()'('(''"#$""#"#
- at 30BB2AAXX080903:3:2:1735:1532#0
-ACTAGTATAAGAGATCAGGTTCGTCCTTTAGTGTTGTGTATGGTTATCATTTGTTTTGAGGTTAGTTTNATTAATA
-+
-67777788888888888888888877776355443222000//-.,--,,,++***))())()(('''"#&%""#"
- at 30BB2AAXX080903:3:3:795:1431#0
-ACTAACCTCAAAACAAATGATAACCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATNCGTGNCA
-+
-6777778888888888888888887777655544322211//./.---,-,,+*+***)))))((''%"%$$$"$$
- at 30BB2AAXX080903:3:47:1767:821#0
-CTAACCTCAAAACAAATGATAACCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTACTCA
-+
-67777788888888888888888877776555443222100//..-,,,,+,+***))*))))((('$"#%"$"#"
- at 30BB2AAXX080903:3:58:291:1771#0
-AATGATTAAGGATACTAGTATAAGAGATCAGGTTCGTCCTTTAGTGTTGTGTATAGATCGGAAGAGCGGGCACTNN
-+
-67777788888888888888888877776555343222000/..----,-+++***()())#(('(#'&$%"#"""
- at 30BB2AAXX080903:3:2:320:448#0
-AACAAATGATAACCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTAAGATCTNCATNNCT
-+
-677777888888888888808836677765320400/,00..,.--,,,+*,+*))*'())((('&#""%$"""""
- at 30BB2AAXX080903:3:1:144:1353#0
-TGTGGCAATAAAAATGATTAAGGATACTAGTATAAGAGATCAGGTTCGTCCTTTAGTGTTGTGTATGTNAGNTCGC
-+
-67777788888888888888888877776553443212100//.,-----+++****))))()'('&&"#""#$#"
- at 30BB2AAXX080903:3:57:1377:1121#0
-AAGGACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTTTATTGCCACAACTAACCTCCTCGGAGTCACCAC
-+
-67777788888888888888888877776545443222100//..----,+++*+**))())((('&%"$$##"#$
- at 30BB2AAXX080903:3:41:1309:447#0
-CTAGTATCCTTAATCATTTTTATTGCCACAACTAACCTCCTCGGACTCCTGCCTCACAGATCGGAAGAGGCGCTAC
-+
-67777788888888888888888877776555443222101//.--.-,,+++***)))()))((('&"&"""""#
- at 30BB2AAXX080903:3:39:1431:1414#0
-ACAACTAACCTCCTAGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGTGAT
-+
-67777788888888&882888888777765554432101/./.----,+*+++***(*))()'(((#%$$"$""#"
- at 30BB2AAXX080903:3:8:1140:1420#0
-TCCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGGCCATNCACTCCNN
-+
-67777788888888888888888877776555443222100//..---,,,+++**)))*)())((&"&&&$$#""
- at 30BB2AAXX080903:3:35:1494:1271#0
-CTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGGCCATCCNACTCATCN
-+
-67777788388888888888888877776555363022100//..--,+,++'**)*((()'()(''"##"##"#"
- at 30BB2AAXX080903:3:35:1618:817#0
-CTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGGCCATCCNTCCACNAN
-+
-67777788888888888888888877776552443222100/...---,,+,++**))())()('('""$%##"""
- at 30BB2AAXX080903:3:52:1303:1113#0
-CTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGGCCATCCCCCTATGAG
-+
-67777788888888888888888877776555443222100//..---,-+,+****))**()((''"$#&$%##$
- at 30BB2AAXX080903:3:60:477:1222#0
-AGCGAAAGCCTATAATCACTGCGCCCGCTCATAAGGGGATGGCCATGGCTAGGTTTATAGATAGAACGCGACACNN
-+
-677777888888888888888888177705/21432222/0/#.,,--,+()*()*(*))#'(#'#%%$%$$$$""
- at 30BB2AAXX080903:3:48:328:1561#0
-CCTAGCCATGGCCATCCCCTTATGAGCGGGCGCAGTGATTATAGGCTTTCGCTAGATCGGAAGAGCGGGGCATCCA
-+
-6777778888888888488888887777655544322110///..--,,,+++(+*)())&)(((%("""#""###
- at 30BB2AAXX080903:3:45:1554:358#0
-GGTAAGAAGTGGGCTAGGGCATTTTTAATCTTAGAGCGAAAGCCTATAATCACTGCGCCCGCTCATACGCTCGGAG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('"&###$#""
- at 30BB2AAXX080903:3:57:1514:774#0
-ACTTGGGGTAAGAAGTGGGCTAGGGCATTTTTAATCTTAGAGCGAAAGCCTATAATCACTGCGCAGACACAGACCT
-+
-+777778888888888888/888877776555443222100/...---,,+++***))))))((''&$$%#""###
- at 30BB2AAXX080903:3:34:440:1530#0
-AGCGGGCGCAGTGATTATAGGCTTTCGCTCTAAGATTAAAAATGCCCTAGCCCACAGATCGGACGAGNCACTTGNN
-+
-67777788888888888888888877776555443222100//.-.--,,+++***)*))*))((((""#%"""""
- at 30BB2AAXX080903:3:3:789:195#0
-GGTGTAGGTGTGCCTTGTGGTAAGAAGTGGGCTAGGGCATTTTTAATCTTAGAGCGAAAGCCTATAACNACACNGN
-+
-6777778888888888888888887777655-44320,000//./.-+,-,++*'**)))'&(((''&"%&#""$"
- at 30BB2AAXX080903:3:36:1306:1933#0
-TATGGGGATAAGGGGTGTAGGTGTGCCTTGTGGTAAGAAGTGGGCTAGGGCATTTTTAATCTTAGAGCTCATAANN
-+
-6777778888888888888888887777655544322000///.-.--,,++*+**))))'))((('&"%#$"#""
- at 30BB2AAXX080903:3:45:1021:220#0
-TAGTATGGGGATAAGGGGTGTAGGTGTGCCTTGTGGTAAGAAGTGGGCTAGGGCATTTTTAATCTTAGACCGCTTC
-+
-677777888888888888888888577765554432320011/-.---,-+,+****)))()((('''#"#"$""$
- at 30BB2AAXX080903:3:48:1229:169#0
-AATAACTAGTATGGGGATAAGGGGTGTAGGTGTGCCTTGTGGTAAGAAGTGGGCTAGGGCATTTTTAACAGTACAT
-+
-67777788888888888888888877776555443222100//..--,,,++++*))*))))(((('"$"##""#"
- at 30BB2AAXX080903:3:49:1150:664#0
-CTTCTTACCACAAGGCACACCTACACCACTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACCGCATNCN
-+
-677777888888888888888888777+6555443222100//.,---,,+,+***)*))))(('('&#"#"""$"
- at 30BB2AAXX080903:3:4:1188:254#0
-TATTGGTTGAATGAGTAGGCTGATGGTTTCGATAATAACTAGTATGGGGATAAGGGGTGTAGGGAGTANAGGANAN
-+
-6777778888888888888*888877776559443512&/0/...---,(+*++**)()())('&(&&"$%$$"#"
- at 30BB2AAXX080903:3:54:387:719#0
-CCACAAGGCACACCTACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCACTCACTAC
-+
-67777788888888888888888877776555443221100//..-.,,,,+******))))((((&&$#%%"#"$
- at 30BB2AAXX080903:3:60:491:1158#0
-CCACAAGGCACACCTACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCANCCGCCNN
-+
-67777788888888888888888877776555443222000//..-.,,,+,+++*)*)))))(((''"&$"$#""
- at 30BB2AAXX080903:3:33:1532:2005#0
-CACAAGGCACACCTACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCANAACACANN
-+
-67777788888888888888888877776555443232100///.---++,,*++*(**()(('''&"$#&%%$""
- at 30BB2AAXX080903:3:43:1239:1104#0
-GCTATTGGTTGAATGAGTAGGCTGATGGTTTCGATAATAACTAGTATGGGGATAAGGGGTGTAGGTGTGTCTGGGT
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('(&'&"#%#$#"
- at 30BB2AAXX080903:3:56:503:1997#0
-AAGGCACACCTACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTAGATCGGGCTCTCG
-+
-677777888888888888888888.7776555443222100/..-.-,,)*+))****))()()'(&'%##"#"$"
- at 30BB2AAXX080903:3:35:1418:1875#0
-CCAGGGCTATTGATTGAATGAGTAGGCTGATGGTTTCGATAATAACTAGTATGGGGATAAGGGGTGTNGNACATAN
-+
--77777-8888888888888888877776)554632(21-0/...---,,+,+****&)))(((''%"$"$$"#""
- at 30BB2AAXX080903:3:8:1248:1228#0
-CCAGGGCTATTGGTTGAATGAGTAGGCTGATGGTTTCGATAATAACTAGTATGGGGATAAGGGGTGTNCACCACNN
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))()('''"%$#%%$""
- at 30BB2AAXX080903:3:49:1066:1369#0
-CCTACACCCCTTATCTCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCAGTCCGCTG
-+
-67777788888888888888888877776555443222.00//.----,,+++****))*)((((('"$"$""$#"
- at 30BB2AAXX080903:3:44:120:280#0
-TACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGGCGCACGC
-+
-67777788888888888888888877776555443022100//..---,,+,++**))))))))((&$"&&$$$$%
- at 30BB2AAXX080903:3:44:594:1611#0
-TACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTCGCCGCACGC
-+
-67777788888888888888888877776555443/22001/...---,,++%++)***)(('(('#&'#&$$##$
- at 30BB2AAXX080903:3:56:1329:751#0
-TAGGCGTACGGCCAGGGCTATTGGTTGAATGAGTAGGCTGATGGTTTCGATAATAACTAGTATGGGGGTCACGAGC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))*)))(('''$'"$"#""#
- at 30BB2AAXX080903:3:37:916:1562#0
-TCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCCACCAATAGCCCTGGCCGTACGCCTCACAGCGTN
-+
-67777788888888888888888877776559443222100/'./--,,,++++**))))()()('#$"&"##"""
- at 30BB2AAXX080903:3:37:917:1562#0
-TCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTCGCACCTCN
-+
-67777788888888888888888877776555443222100//.-----,+,*+*+)*))()((('%$$%#"#"#"
- at 30BB2AAXX080903:3:40:267:1995#0
-GTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATGAGTAGGCTGATGGTTTCGATAATAACTNGTATGGGC
-+
-67777788-888888888885788774765554432.210//.-.-,--,,++'**&*)))(('(%'"$""""""#
- at 30BB2AAXX080903:3:38:752:1330#0
-AGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATGAGTAGGCTGATAGATCGGAAGCGCGTAGTA
-+
-67777788888888888888888877/74555-0/2220/.0-.--(,*+,+%()*())'''((#&&&&%""""""
- at 30BB2AAXX080903:3:2:1530:272#0
-GGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGAGATCGGAAGAGGGGTTCAGGAGGAACNCGTCAGA
-+
-67.777888488828888868)14(8151$3+,(3/$'$/0)**%$,,$*)$'$*&#&%#%######%"$""#""#
- at 30BB2AAXX080903:3:43:1278:1568#0
-GGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATCGGTTGAATGAGAGATCGGAAGATGGGTCC
-+
-67777788888888888888888877776555423222200/0..-&-,,++++**)))*)((('''&"##$""#"
- at 30BB2AAXX080903:3:42:997:330#0
-GAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTAC
-+
-6777778888888888888888887777655544322210///..---,,,++*+**))*)()('(''&%&%%%##
- at 30BB2AAXX080903:3:49:263:57#0
-AACCATCAGCCTACTCATTCAACCAATCGCCCTGGCCGCACGCATAGCCGCGAACATTCCTGCAGGCAATCTACAC
-+
-6177778888238/8888'88888(77-63554)3(10&*1./(.+--&-++*%'))('((&(('&'"""$##$#$
- at 30BB2AAXX080903:3:55:910:332#0
-CCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACCCCT
-+
-67777788888888888888888877776555443222100/0..---,,,,+***))**))(((('%&""#"$##
- at 30BB2AAXX080903:3:41:1403:613#0
-GGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATGCGGCGTGC
-+
-67777788888888888888888877776555443222100./,.----,(++**(*))*)&()(%#%$%""""""
- at 30BB2AAXX080903:3:34:1027:420#0
-CAACCAATAGCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAANCTCAATNN
-+
-67777788888888888888888877776555443222100//..---,,,++**)*))))((((''"$#$"#"""
- at 30BB2AAXX080903:3:39:306:1054#0
-CTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGTCGCACCC
-+
-677777888888888888888888777765554432220/0//..-.-,,,,+****()())'(&''&"$%%%###
- at 30BB2AAXX080903:3:46:855:493#0
-CTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGAG
-+
-67777748888888888888888577776555443222100//-..--,,+++*+*))*)*)((&(&"""$"$""#
- at 30BB2AAXX080903:3:51:1297:908#0
-CCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCCCCCCAGA
-+
-6777778888888888888888887777655544322110///..--,-,,,**+)*))))(((((&$%#%##"$"
- at 30BB2AAXX080903:3:48:1038:1951#0
-TGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCGAGGCGTCGCTCCTGG
-+
-6727778888888888888888887%7+355543/22110/0/.)+-+,,++*+()'*)(&'(('(&"$""$""""
- at 30BB2AAXX080903:3:8:452:567#0
-TGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGAGATCGGAAGANGCTCACNN
-+
-6777778888888888888888887876655045222110....---,,,,+++))()))')(('(%""##%##""
- at 30BB2AAXX080903:3:41:186:1539#0
-CTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCAGCCTAGCAA
-+
-67777288888888888888888877776555443022.00-....--,,+*+)****)()((((('&&##$%##"
- at 30BB2AAXX080903:3:52:833:1365#0
-TGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGATCG
-+
-67777788888888888888888877776555443222100//..---,-,+****)**))((((('&$""%#"#$
- at 30BB2AAXX080903:3:55:968:40#0
-TACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGCAGTATCACC
-+
-67777788888888888888888877776555443222100//..--,,-+,++**)*)))(((('($""&%%$"#
- at 30BB2AAXX080903:3:2:1784:713#0
-AATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGNTGTCACA
-+
-67777788888888888888888877776555443222110//...--,,,,+****))()()((''"""#"$###
- at 30BB2AAXX080903:3:47:1643:746#0
-AATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGATCGTCAC
-+
-67777788888888888888888877776555443222100///..,-,,++*****)))()(((('$"%%$##"#
- at 30BB2AAXX080903:3:49:1363:728#0
-CTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGCAGATCGACTACTAC
-+
-6777778888888888888888887771655544222000,/.-,----,++)*))**)()))((#'"#%#$%""#
- at 30BB2AAXX080903:3:57:995:288#0
-CTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGAGATCGGAGTTCGAT
-+
-67777788888888888888888877776555443222100//.---,,,+++****))))()((''&'$""####
- at 30BB2AAXX080903:3:54:1625:296#0
-TAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTCACACAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''"""%#%#$$
- at 30BB2AAXX080903:3:57:18:1373#0
-TAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCTCCCGA
-+
-6777778888888888888888887777655544312200///.--,,,,+++***)*))(((((''%'#"###"#
- at 30BB2AAXX080903:3:46:575:295#0
-AGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGCAATATCAACCCTTCAC
-+
-67777788888888888888888877776555443222110//..-,-,,+*+****)))()()(('$$""""$##
- at 30BB2AAXX080903:3:56:1611:1757#0
-CGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGATCGGAAGAGACACCACCAC
-+
-67777788888888888888888877776555481222100//..----,+++****)))))((('&$$%####"#
- at 30BB2AAXX080903:3:4:1381:662#0
-TACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGCAATATCAACCATTAACCTTTNACACNTN
-+
-6777778888888888888888887777655544322200/....--,-,,++**))))))((('('""#""#"""
- at 30BB2AAXX080903:3:2:74:682#0
-TGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGCAATATCAACCATTAACCTTCCCTNTACNNCA
-+
-677777888888888888888888777765554/3222100//.----,,+++***))))'()((''""#"#"""#
- at 30BB2AAXX080903:3:36:1332:585#0
-CAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAAGATAGCGTACAN
-+
-677717888888888888888888777765054432121*0//.-+,,-(+*+*+)))))'))(((&$&"""###"
- at 30BB2AAXX080903:3:42:1459:1447#0
-GACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGGGGCTC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((((''&&#"""#""
- at 30BB2AAXX080903:3:42:1609:1743#0
-TGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGCNGTNT
-+
-67777788888888888888888877776555443222100//...---,++++***))))(()('&&"&%"$#"#
- at 30BB2AAXX080903:3:60:1070:1554#0
-AAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAATATNN
-+
-67777788888888888888/88837776555443222100//..-*-,,++****)))))()'(''%&"##$"""
- at 30BB2AAXX080903:3:48:1219:633#0
-GTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGCA
-+
-67777788888888888888888877736555443222100//..---,,+++***)**)))(('('&&"$"""#"
- at 30BB2AAXX080903:3:36:152:536#0
-TGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTAGATCGGACACTCAGCAN
-+
-67777788888888888888888877776555443222100//..---,,++++**'*))))(('(#%&"##"$$"
- at 30BB2AAXX080903:3:42:664:84#0
-TTGTGAAGATGACAAGTGGAGAGGGAAGGTTAATGGTTGATATTGCTAGCGTGGCGCTTCCAATTAGGTGCGTGAG
-+
-677077888888888888,8888877776%55443202101//...-,,&+'+****()((&((('('%$##""""
- at 30BB2AAXX080903:3:48:79:390#0
-CACCTAATTGGAAGCGCCACCCTAGCAATATCAACCATTAACCTTCCCTCTACACGTGTCATCTTCAGTATTATCA
-+
-67777788888888888888888877776555443221100+/..----,+++**()*)))((((('""""#""#"
- at 30BB2AAXX080903:3:2:674:750#0
-ATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCNATTACGT
-+
-67777788888888888888888576776555813202110//...-,--*,*+**)*&)((('('%&"#%%##""
- at 30BB2AAXX080903:3:1:248:1480#0
-TAATTGGAAGCGCCACCCTAGCAATATCAACCATTAACCTTCCCTCTACACTTGTCATCTTCACAAGANCTNCACC
-+
-67777788888888888888888871/76555423212/0../,-.-,,,++'**)*((()))((''""#""###"
- at 30BB2AAXX080903:3:1:733:176#0
-TAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCNCCNCCTC
-+
-67777788888888888888888873776555243221100///.---,,,++**+(*))))'(('''""""##$#
- at 30BB2AAXX080903:3:51:1165:1430#0
-TTGGAAGCGCCACCCTAGCAATATCAACCATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTATATCTACT
-+
-6777778888888888888888887777655544302200///..---,,++++**))))))()('&%$"#$%#$#
- at 30BB2AAXX080903:3:49:522:1238#0
-GGAAGCGCCACCCTAGCAATATCAACCATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTAATCCTACCGC
-+
-67777788888888888888888877776555443222100//..---,,,,+****)))())('(''$#""%""#
- at 30BB2AAXX080903:3:59:159:1062#0
-TCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGNGCGNNT
-+
-67777788888888888888888877776555443222100//.----,,+++****))))((('''&$"#%$""#
- at 30BB2AAXX080903:3:50:1320:1247#0
-AGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGATGGCTGAC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((((''""""#"###
- at 30BB2AAXX080903:3:39:1718:861#0
-TAGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGTGTGNCGCG
-+
-67777788888888888888888877776555443222100//..--,,,-++*+*)**)))(('(&"&"#""$#"
- at 30BB2AAXX080903:3:56:44:1379#0
-TAGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGACGT
-+
-67777788888888888888888877776555443222100//-.--,,,+++***)))))((('('&%""$"###
- at 30BB2AAXX080903:3:41:592:1712#0
-AGGATAGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTCGGGCNT
-+
-67777788888888888888888877776555443222100//..---+,+++***))#)))(((('&$"%#"#"#
- at 30BB2AAXX080903:3:44:1626:703#0
-TAGGATAGGCAGGAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCGGGGGGG
-+
-677777888888888888388888777765554432221/0//..---,,++++**)))))())(((&""&&%###
- at 30BB2AAXX080903:3:60:247:1511#0
-TAGCAATATCAACCATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTAATTCTACTGACTATAGACNGCNN
-+
-67777788888888888888888877776555443220000//..---,,,++***)*))*)((((''&##""$""
- at 30BB2AAXX080903:3:36:1723:152#0
-AACCATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCNCTGTCGNN
-+
-67777788888888888888888877776555443222100/.-..--,,,,+***))*()(((('(""$%#%"""
- at 30BB2AAXX080903:3:8:1781:1665#0
-AACCATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCNCTCTACNN
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))()'('"$#$"$"""
- at 30BB2AAXX080903:3:54:376:1899#0
-CATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCGCTGTAGCCTTC
-+
-67777788888888888888888877776555443222100//..---,-,+****)))))((((('%$""%%##"
- at 30BB2AAXX080903:3:3:960:524#0
-TGGATTAAGGCGACAGCGATTTCTAGGATAGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGCNTTGANAC
-+
-67777788888888888888888877776555283222100//...--,,+++***))())()((('$"#""#"##
- at 30BB2AAXX080903:3:33:1607:696#0
-TACACTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCGCTGTCGCCTTAATCAGANCGCACCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))))(('&"$"$$$"""
- at 30BB2AAXX080903:3:57:8:1053#0
-GTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGATTTCTAGGATAGTCAGTAGAATTAGAANNGTGAGTCTACN
-+
-67777788888888888888888877776555443222100//..---,-,+++***)))))(##('&%#"#""$"
- at 30BB2AAXX080903:3:35:69:938#0
-AGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGATTTCTAGGATAGTCAGTAGAATTAGAAGTGNGACCTGTN
-+
-67777788888888888888888877776555443222100//..---,,+++***'))))())''&"$"##""#"
- at 30BB2AAXX080903:3:1:1685:1109#0
-AAGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGATTTCTAGGATAGTCAGTAGATCGGAAGAGCNGANCTCT
-+
-677777888888888888888888777765554432211200/-.-,-,,+)+**))))&))'((''""$""$%"#
- at 30BB2AAXX080903:3:36:976:1832#0
-CACAATTCTAATTCTACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACATCTCATGNN
-+
-6777778888888888*888888837776555423222100//..-,,,,+++**+)*))))((((%$"&%%##""
- at 30BB2AAXX080903:3:48:745:1420#0
-TTACTAGAAGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGATTTCTAGGATAGATCGGAAGAGCTGCACAAC
-+
-6777778888888888888888887777655544321210//..-,--+,+,+*)*)*)'))((('($"##"$""#
- at 30BB2AAXX080903:3:54:421:1430#0
-TACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTATACCTGCA
-+
-67777788888888888888888877776555443232100//...--,,++++****))))()''("&"%#%"#"
- at 30BB2AAXX080903:3:58:1032:584#0
-TGCAGGTAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGAGATCGGAAGAGGTACATA
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*)(((((''&&"#$###
- at 30BB2AAXX080903:3:37:447:245#0
-ACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCACCCTTCCN
-+
-67777788888888888888888877776555443222100//.----,,+++***)*)))()((('$"$%$"##"
- at 30BB2AAXX080903:3:55:377:168#0
-CGTGCAGGTAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGATTTCTAGGAGCGCCTT
-+
-67777788888888888888888877776555443222100//.-----,+++**))))()))((''$$"#%"""#
- at 30BB2AAXX080903:3:46:649:987#0
-TGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAAGATCGGAAGAGCGGGACAN
-+
-67777788888888888888888877776555443222100//..---,,++++*+)))*)))((''&&%"#"#""
- at 30BB2AAXX080903:3:3:1274:1538#0
-GTCGTGCAGGTAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGAGATCGGAANCTGANGT
-+
-67777788888888888888888877776055423220100//..-.,,-,,++*****))((((('$""""#"""
- at 30BB2AAXX080903:3:46:1087:1732#0
-CTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACAC
-+
-6777778888888888888888887777655544323210/....--,,,+++)****))()))('(%$#$#"###
- at 30BB2AAXX080903:3:57:1147:1633#0
-TAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGAGATACACCT
-+
-677777888888888888888888777765554432211/0//..---,,+,+**))))())(((('$$$%%$##"
- at 30BB2AAXX080903:3:42:1300:1901#0
-TCATTATGTGTTGTCGTGCAGGGAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGGAGATCGGAAGCGCGGTCC
-+
-677777888888888888,5883877774+55%332/10//-/,..,)-%,++)'&()&(((#((&#%"&"""##"
- at 30BB2AAXX080903:3:47:1059:419#0
-GCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAGGCCTCTACCTGCACGACAAGATCGGCGAGACAC
-+
-67777788888888888888888878776555443222100//..---,,+++****))))((((('&$"""##"$
- at 30BB2AAXX080903:3:55:484:683#0
-TGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCCCC
-+
-67777788888888888888888877776555443222100//..---,,+++****))*)((((('$&#&$%##%
- at 30BB2AAXX080903:3:47:1475:1126#0
-GGTGGGTCATTATGTGTTGTCGTGCAGGTAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGAGATTCATCACGA
-+
-67777788888888888888888878779552442222100/...--,,,,++**)**)(()((((#"$""%#$"#
- at 30BB2AAXX080903:3:39:1463:257#0
-TGGTGGGTCATTATGTGTTGTCGTGCAGGTAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGGAGTGTGGGCGC
-+
-6777778888888888888888887777673544323210/-/.--+-,,*++*)*')))(&((('#'$#&##""#
- at 30BB2AAXX080903:3:58:813:1480#0
-GATTGGTGGGTCATTATGTGTTGTCGTGCAGGGAGAGGCTTACTAGAAGTGTGAGATCGGAAGAGGGGTCTCGCAC
-+
-6777778888.888888888888877776555%43222*00.,.--,,,)+*+&**)&))'((((#'&$%&$%$$%
- at 30BB2AAXX080903:3:49:1160:1060#0
-TGTGATTGGGGGGTCATTATGTGTTGTCGTGCAGGTCGAGGCTTACTAGAAGTGTGAAAACGTAGGCGTGGGTTAC
-+
-677777888888888888888888777765554430+21001/...--,,+++*+*)))*()'(('%$$#"""""#
- at 30BB2AAXX080903:3:35:1068:1504#0
-TAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACNTCTCCACN
-+
-677707888888888,888888887777655544322210/./..---,-+++**)*)())))#'''""##$###"
- at 30BB2AAXX080903:3:47:331:403#0
-ATGTGATTGGTGGGTCATTATGTGTTGTCGTGCAGGTAGAGGCTTACTAGAGATCGGAAGAGCGGTTCACCTCTGA
-+
-677777888888888888888888777765654432'0100/-.-.,,-,,+***+*()))((((#%%"##"##""
- at 30BB2AAXX080903:3:8:1010:1323#0
-CATGTGATTGGTGGGTCATTATGTGTTGTCGTGCAGGCAGAGGCTTACTAGAAGTGTGAAAACGTAGNTCACATNN
-+
-67777788888888888888888)7777655)24322$10)/0...--,,++**)*(*)(()((('(""$#$#"""
- at 30BB2AAXX080903:3:34:1768:778#0
-ATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCANCCACCANN
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))((((('"$##%##""
- at 30BB2AAXX080903:3:59:993:1443#0
-ATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACACCA
-+
-67777788888888888888888877776555443222100//..---,,+++**+***)('(((('$&&#%%##%
- at 30BB2AAXX080903:3:58:1636:245#0
-CAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACACACCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&'%%&%#$""
- at 30BB2AAXX080903:3:41:118:1901#0
-GCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACAGCACCAACA
-+
-67777788888888888888888877776555413222100//./-,-,-+++**))))))))((''$##$$"###
- at 30BB2AAXX080903:3:40:363:849#0
-ATGATAGGCATGTGATTGGTGGGTCATTATGTGTTGTCGTGCAGGTAGAGGCTTACTAGAAGTGTGANAACGGACA
-+
-67777788888888888888888877776555443222100//..,--,,+++++))*)))(((('&"&%%$"$#"
- at 30BB2AAXX080903:3:39:1685:253#0
-TACTATATGATAGGCATGTGATTGGTGGGTCATTATGTGTTGTCGTGCAGGTAGAAGATCGGAAGAGAGCTGTCAC
-+
-6777778888888888888888887,776555443220110/...,-,-,,'+*****))))(((('"&%"""##$
- at 30BB2AAXX080903:3:52:36:468#0
-TCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCATCAATCACATGCCTATCATATCGTAAAC
-+
-6717778888888888888888887777655544321220.0/--+--&,,)*+*))))(()(((''$$#&##"##
- at 30BB2AAXX080903:3:39:682:1555#0
-GCTGGGTTTTACTATATGATAGGCATGTGATTGGTGGGTCATTATGTGTTGTCGTGCAGGTAGAGGCTTACTATCA
-+
-677777888888888888888888777765554432221/1//..---,,++******))))((('%$$#$%""##
- at 30BB2AAXX080903:3:3:839:1051#0
-AGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATAGATCGGAAGANCGCANAC
-+
-67777788888888888888888877576555443122100//./.-,,,+,+*****))()()(('$"#"%#"#$
- at 30BB2AAXX080903:3:50:1447:1377#0
-GGGTCATGGGCTGGGTTTTACTATATGATAGGCATGTGATTGGTGGGTCATTATGAGATCGGAAGAGAGGCACGCC
-+
-67777788888888888888888877776555443222100//..--*-,+++***))*)))(('('"$$##%"##
- at 30BB2AAXX080903:3:35:812:1365#0
-TAGGGGTCATGGGCTGGGTTGTACTATAGGATAGGCATGTGATTGGTGGGTCAGTATGTGTTGTCGTNCGCACATN
-+
-677777-88888888888*8)8887777$5554432221/0//..---,,&+******()')(('('"$"%"$##"
- at 30BB2AAXX080903:3:39:528:626#0
-CTGTTAGGGGTCATGGGCTGGGTTTTACTATATGATAGGCATGTGATTGGTGGGTCATTATGTGTTGTCGTGCATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()((('"&&&%&$"#
- at 30BB2AAXX080903:3:56:1233:1459#0
-GAGAGGGCCCCTGTTAGGGGTCATGGGCTGGGTTTTACTATATGATAGGCATGTGATTGGTGGGTCATTTCTCACG
-+
-67777788888888888888088877776555243222100//./-----,++***)))))()('&'&%"#"###"
- at 30BB2AAXX080903:3:49:612:119#0
-CATATAGTAAAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCAGATCCGTCGCGTC
-+
-677777888888888888888888771705554432210...,,'-,*++++'()')'((&))''#&$""###""#
- at 30BB2AAXX080903:3:35:1144:349#0
-TATAGTAAAACCCAGCCCACGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAACGACCTCCGGCCTANGCACCTNN
-+
-6777778888388882808&888877776555443322&01//.,.-',,+++'*+**)()((((%'""#$$#"""
- at 30BB2AAXX080903:3:45:198:34#0
-ATCACATGGCTAGGCCGGAGGTCATTAGGAGGGCTGAGAGGGCCCCTGTTAGGGGTCATGGGCTGGGGTGTCCTAT
-+
-67777788888888888888888877776555443222100//..---,,+++******))(((('&&&"""#"#"
- at 30BB2AAXX080903:3:50:806:1799#0
-AATCACATGGCTAGGCCGGAGGTCATTAGGAGGGCTGAGAGGGCCCCTGTTAGGGGTCATGGGCTGGGATCTCGTA
-+
-677777888888888888888888777365554422201/0//-,---,,,*++**(')))()&'('%"###""#"
- at 30BB2AAXX080903:3:41:1700:667#0
-TAAAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTAGCCATGTGATTCCA
-+
-67777788888888888888888877776552403/2120/1+--+,*++****)))(((%'('('&$""""###"
- at 30BB2AAXX080903:3:36:100:148#0
-AAGTGAAATCACATGGCTAGGCCGGAGGTCATTAGGAGGGCTGAGAGGGCCCCTGTTAGGGGTCATGNCTGCGTCN
-+
-677777888888888888888888777765/544321210///-.+--,,++++***))))((('(("$"##""$"
- at 30BB2AAXX080903:3:54:1471:1186#0
-AGTGGAAGTGAAATCACATGGCTAGGCCGGAGGTCATTAGGAGGGCTGAGAGGGCCCCTGTTAGGGGGACTGGGCG
-+
-67777788888888888888888877776555413222000//..+---,,++**)(*))(((('''$&$&&&$#"
- at 30BB2AAXX080903:3:48:1312:1228#0
-GTTATGGAGTGGAAGTGAAATCACATGGCTAGGCCGGAGGGCATTAGGAGGGCTGAGAGGGGCCCTGGGTCCTGAT
-+
-6777778888888888888888887777655544322-10+-.+.,--,,,+%*+(*))))#(''##"""##"""#
- at 30BB2AAXX080903:3:37:80:318#0
-TAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTAGCCATGTGATTTCACTTCCACTCCATACAAAACAN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''%$%"""#""
- at 30BB2AAXX080903:3:59:88:186#0
-TAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTAGCCATGTGATTTCACTTCCAGATCGGAAGCACNNC
-+
-67.7/788888888888888888876)7655544322211&//.---+,++*++*+))))'(((('''$%##$""#
- at 30BB2AAXX080903:3:4:1041:1601#0
-GAGGAGCGTTATGGAGTGGAAGTGAAATCACATGGCTAGGCCGGAGGGCATTAGGAGGGCTGAGAGGGNCCTCNTN
-+
-67777788888888,84888888877776552243212001/..)--#,)+**++)**)'')(((''$"#$"$"#"
- at 30BB2AAXX080903:3:33:788:349#0
-TGAGGAGCGTTATGGAGTGGAAGTGAAATCACATGGCTAGGCCGGAGGTCATTAAGATCGGAAGAGCNGCTCAGNN
-+
-67777788888888888888888877776555433222000./..,--*,+*+)**)((()'((((%""#"$#"""
- at 30BB2AAXX080903:3:54:153:584#0
-CCTAGTATGAGGAGCGTTATGGAGTGGAAGTGAAATCACATGGCTAGGCCGGAGGGCCTTAGGAGGGGAGGACNAC
-+
-6777778888888888888888887777655544322110///..---+-,+'**((#()'()#(('$$#$##"##
- at 30BB2AAXX080903:3:43:138:1709#0
-TTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGGAAGTGAAATCACATGGCTAGGGCGGGAGATAGGGACA
-+
-6777778888888888888888887777655544322210//*.,--*+,(*%'*#)'))'(((((&'""##"$#"
- at 30BB2AAXX080903:3:54:872:1097#0
-ATGACCTCCGGCCTAGCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAAGCGCCCACC
-+
-67777788888888888888888877776555413222100/...+--,,+++***)*)))((('('%&""%""$#
- at 30BB2AAXX080903:3:41:609:997#0
-CGGCCTAGCCATGTGCTTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACACACNGCACA
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))*())(''&"%#"%####
- at 30BB2AAXX080903:3:53:547:1856#0
-CGGCCTAGCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACACGAACCCGC
-+
-67777788888888888888888877776555443222100//...-,-,+*+***))))((()(('"#$&%%"""
- at 30BB2AAXX080903:3:54:1539:1762#0
-CGGCCTAGCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAGCCAACACAACACACCCC
-+
-67777788888888888888888877776555443222100/....---,,****)))'(()(((''%%&&$%###
- at 30BB2AAXX080903:3:34:1031:852#0
-TGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGGAAGCGGAATANCTGCACNN
-+
-677.7788888888888888888877776550443222100//.-----,+++*#**)))&)%(('%"$""##$""
- at 30BB2AAXX080903:3:48:524:52#0
-TTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGGGTGGAAGGGAAAGAACCACNAT
-+
-6777778888888888888888887/77655544020.100//-.--',%,++&*#*)#(('('&(#"""#"#"""
- at 30BB2AAXX080903:3:54:507:1700#0
-CATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGGAAGTGAGATAGGCGTC
-+
-67777788888888888888888877776555443222(00//..,-,,,+++***)*))))(#'#'%$#&&#""#
- at 30BB2AAXX080903:3:49:367:735#0
-CATCATTGGTATATGGGTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGGAAGGGCAGAGAGA
-+
-67777788888888888888888897776455343201100./...--+,,+(**))*()'(((((#&$""""###
- at 30BB2AAXX080903:3:50:1772:468#0
-ATAACGCTCCTCATACTAGGCCTACTAACCAACACACTAACCATATACCAATGATGGCGCGATGTAACCCGATAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(('('""$$"""#"
- at 30BB2AAXX080903:3:44:498:284#0
-AACGCTCCTCATACTAGGCCTACTAACCAACACACTAACCATATACCAATGATGGCGCGATGTAACACGCGAGGAA
-+
-67777788/82888888888884-77471535443132/00./..'-+,,+*++*))**(((&((''$%"&"""$"
- at 30BB2AAXX080903:3:58:918:1206#0
-TTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATAGATCGGACTCGACA
-+
-67777.8880888888888888887777655544322210-/..--,,,,+++*+))**)()))((%'""$#"###
- at 30BB2AAXX080903:3:50:654:1092#0
-TTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATCACACTC
-+
-6777778888888888888888887777654544321'101//..-.--,,++****)))''(((('%$#####"#
- at 30BB2AAXX080903:3:33:1020:135#0
-AAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCACNCGTCTCNN
-+
-6777778888888888888888887777)55544322%001//,---,,-+(*&**')()))((('#"$"##"#""
- at 30BB2AAXX080903:3:33:665:168#0
-AAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATNGCCGCCNN
-+
-677777888888888888,887837777455,%452211001/,,--+,+,'+*()))(()')&(&%""$##$#""
- at 30BB2AAXX080903:3:35:1162:1259#0
-GAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCANGCTACCAN
-+
-67777788888888888888882877776355443222+/1//..---,,++****))))())((('"""%%"##"
- at 30BB2AAXX080903:3:51:1306:1860#0
-CGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCGCCGCTGGA
-+
-2777778888888888888858887777656542222210///..,--,,+*++**))'))(('('%%#$"#$$""
- at 30BB2AAXX080903:3:39:745:1152#0
-ATCGAAGGCCTTTTTGGACAGGTGGTGTGGGGTGGCCTTGGGATGTTCTTTTTTGTGGGTTTATGCGCTCCCCTCG
-+
-677777888888888888888888777-6)55.430)2.00/-..+-,),++*)%#)#%&&#####'$#%""#"$"
- at 30BB2AAXX080903:3:47:1740:970#0
-ATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGGGGCCTTGGGATGTGCTTTCTCGTGTTACATCGCGCGCACAGAG
-+
-677777888888888888888828737.6555%43+2/100',...-',,,$+)**)')(''(&(''%"$"""""#
- at 30BB2AAXX080903:3:41:440:568#0
-TATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACAAGATCGGGAGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+**))*))()'('&$%"""#"#
- at 30BB2AAXX080903:3:43:363:32#0
-TATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCAGG
-+
-67777788888888888888888877+79555433232200/...---,,++****())))())(('&&"""%$""
- at 30BB2AAXX080903:3:52:800:576#0
-TATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCCTG
-+
-67777788888888888888888777776555443222100/...----,+++***))))))))(('%$$"%$%$#
- at 30BB2AAXX080903:3:50:152:803#0
-GTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGCGCTTTCTCGTGTTACATCGAGGTAACGA
-+
-677777888888888888888888'7776555443222100//..--$,,+++**))*)))))('(&"""#"##""
- at 30BB2AAXX080903:3:37:1558:705#0
-CGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCAGNGCTCAN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))()(((''$$"#""##"
- at 30BB2AAXX080903:3:51:501:1319#0
-CGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCCCGACCTCA
-+
-67777788888888888888888877776555443222100//.,.--,,,++****)*)*)((((#$%""$"##"
- at 30BB2AAXX080903:3:58:1567:1426#0
-CGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATACACCCACAN
-+
-67777788888888888888888877774555443222//0//.-.--,,+,**'*))))))('((&$$%#%$%$"
- at 30BB2AAXX080903:3:38:1182:87#0
-CCCGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATTGTNCANN
-+
-6777778888888888888888887778651544-22110///-.-*,,,,++++*)*))))(((''"$$&"#$""
- at 30BB2AAXX080903:3:54:994:1837#0
-TGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCACCTGTCCAAAAAGGCCTTAGCGCGCACA
-+
-677777888888888888888888777765554432221////..-,-+,+++*+*)*)))((((('%""$$"##"
- at 30BB2AAXX080903:3:1:1576:1474#0
-TTATCCCGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGCTNCCNTCCG
-+
-67777788888888888888888877776552442232100*/.--,-+,*++*)*))))()(('(%&"#%""#""
- at 30BB2AAXX080903:3:53:780:1400#0
-GATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCACCTGTCCAAAAAGATCGGAAGAGCGGTTCCGCAG
-+
-6777778888888888888888887777655542322210///..--,+,+**+**)*)))(((''''$"&#%%##
- at 30BB2AAXX080903:3:35:1344:1291#0
-TGTAACACGAGAAAGCACATACCAAGGCCACCACACACCACCTGTCCAAAAAGGCCTTCGATACGAGNTAGCGNCN
-+
-6777778/88888888888888887777655541322,100-#.'--,,,+*++*(**)*'()((('"'$&$""#"
- at 30BB2AAXX080903:3:58:1063:1837#0
-ATAAATAGGATTATCCCGTATCGAAGGCCTTTTTGGTCAGGTGGGGGGTGGGGGGCTTGGGGGGTGTGTGACCTCN
-+
-67777788888888&8*883868877711)5543'5(,,/0-/.%-",$,+*++%'((*))%'('(#'&%"#"#$"
- at 30BB2AAXX080903:3:60:1337:1763#0
-GAAAGCACATACCAAGGCCACCACACACCACCTGTCCAAAAAGGCCTTCGATACGGGATAATCCTATATTCTAGNN
-+
-67777788888888888888888877776555443511000//.-,--,,+,+**+*)*)()'(('&"$"%"#"""
- at 30BB2AAXX080903:3:2:1075:1871#0
-TGAGGTAATAAATAGGATTATCCCGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGAGATCGGAAGANCGCNCAC
-+
-67777788888888888888888877776555443222100//..---+,+++***))*((((((''%""$""##$
- at 30BB2AAXX080903:3:50:476:1528#0
-CGAAGAAAAAAACTTCTGAGGTAATAAATAGGATTATCCCGTATCGAAGGCCTTTTTGGACAGGTGGCGGGCACGC
-+
-67777388888888888888888877776555343221/00//.,-,,,,+*+**))))((()('((%"""$"#"#
- at 30BB2AAXX080903:3:37:625:156#0
-CCTGCGAAGAAAAAAACTTCTGAGGTAATAAATAGGATTATCCCGTATCGAAGGCCTTTTTGGACAGGCGTTCCNN
-+
-6777778-80888888888888887675635,443212210/...-,+,,+*++*)*)(()))((''$##""#$""
- at 30BB2AAXX080903:3:56:277:1587#0
-TAGGGGCTAGGCTGGAGTGGTAAAAGGCTCAGAAAAATCCTGCGAAGAAAAAAACTTCTGAGGTAATAAATAGCNT
-+
-677777888888888888888888777765554332221/0//.-,--,,+++*****)))))'(''%"#%###""
- at 30BB2AAXX080903:3:49:882:2013#0
-TCAGAAGTTTTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAAGCAGGAA
-+
-67777788888888888888888877776555441322100.-..-,+,,+****()(()((#(#'%"""$###""
- at 30BB2AAXX080903:3:2:555:1902#0
-TTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGANTGTNTCG
-+
-67777788888888888488828877776055443222100//.-.-,,++*+)**)))))'(((''"""$"""#"
- at 30BB2AAXX080903:3:40:1138:496#0
-GGGCCAGTGCCCTCCTAATTGGGGGGTAGGGGCTAGGCTGGGGTGGGAAAAGGCTCAGAAAAATCCTTCNGCAGNT
-+
-67777788888888888888888877076555443222100//+.-&+,,+++***)*)))()'((%"$""#"""#
- at 30BB2AAXX080903:3:53:453:1717#0
-TCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTTGCCCCC
-+
-6777778888888888*88888887777655558322100///--.-,++,+)+**)())))(((''%""$#"$#$
- at 30BB2AAXX080903:3:39:136:1904#0
-CTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACGGTCACCNC
-+
-677777888888888888888488777755555432-1100/--.---),++*******())((((&"""$#%""#
- at 30BB2AAXX080903:3:51:1688:1968#0
-TCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTACCACCACCA
-+
-677777888888888888888888777765554432221001/..-,,-,+,+**+)))))((((('%&%&#$%$$
- at 30BB2AAXX080903:3:54:172:1563#0
-TCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAAGATCGGAAGAGCGGTCGCGCACG
-+
-6777778088888888888888887777657544102/1/1/...-,+-,+)(+)))*)&')&('''""$"$$"#"
- at 30BB2AAXX080903:3:45:1311:1121#0
-ATGCCTGTTGGGGGCCAGTGCCCTCCTAATTGGGGGGTAGGGGCTAGGCTGGAGGGGGAAAAAGCTCAGCACGCGC
-+
-6/777788888888888888%8887770654544322#0000/+-,--)++)%+%)*'%'''#(#''"%#"$$#"#
- at 30BB2AAXX080903:3:40:353:1873#0
-GGGGTGATGCCTGTTGGGGGCCAGTGCCCTCCTAATTGGGGGGTAGGGGCTAGGAGATCGGGAGAGCGGTCCGCAC
-+
-677777888888888888888036/7%765254&2221&00//,,--,,(,,++#*('#()#'(#'%""""#""##
- at 30BB2AAXX080903:3:35:336:1990#0
-TGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTGGCCCCCAACAGATCNACACACAN
-+
-6777778888888888888888887777655532312210.//..---,-+++**))))((')((('""##$"$#"
- at 30BB2AAXX080903:3:59:840:1855#0
-TGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTGGCCCCCAACAGGCACTCACATCC
-+
-677777888888888888888888777765555435101/.//-/---,,+,*+*)('*)(((((''$&""$#"##
- at 30BB2AAXX080903:3:48:89:1181#0
-ATTTAGCGGGGTGATGCCTGTTGGGGGCCAGTGCCCTCCTAATTGGGGGGTAGGGGCTAGGCTGGAGCATGCCATG
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))()((''&$""##""#
- at 30BB2AAXX080903:3:40:307:713#0
-TTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTGGCCCCCAACAGGCATCACCCCTCTAAACAC
-+
-67777788888888888888888877176555443222100/0.,--,+,*++**)))())'(('''"&%""##"#
- at 30BB2AAXX080903:3:46:1295:318#0
-TACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTGGCCCCCAACAGGCATCAGATCGGCAGACTCCA
-+
-677777888888888888888888777765654432221/0/...--,,,)++**)*()(('(&#&'$""#%"###
- at 30BB2AAXX080903:3:50:619:924#0
-AGTGGGACTTCTAGGGGATTTAGCGGGGTGATGCCTGTTGGGGGCCAGTGCGCTCCTAATTGGGGGGGCGTCGNCT
-+
-67777788883888888,8$88887777+565432220100./.-+,,*-+&+*)#'#()(((((('"$####"#"
- at 30BB2AAXX080903:3:34:963:312#0
-TGTGTTTAGGAGTGGGACTTCTAGGGGATTTAGCGGGGTGATGCCTGTTGGGGGCCAGTGCCCTCCTNCCACCANN
-+
-67777788888888888888888877776555443222/00//..---,,+++**)**))()(((''"$#"$$#""
- at 30BB2AAXX080903:3:52:1487:1287#0
-TGATGCGAGTAATACGGATGTGTTTAGGAGTGGGACTTCTAGGGGATTTAGCGGGGTGATGCCTGTTAGCCGCTAC
-+
-67777788888888888888/88877776555443222100//..---,,+,+***))*))&(('('%"#"&##$$
- at 30BB2AAXX080903:3:4:1737:1157#0
-AGGTGATTGATACTCCTGATGCGAGTAATACGGATGTGTTTAGGAGTGGGACTTCAGATCGGAAGAGCNATCTNCN
-+
-677077888888888888888888777765554432,2/10-/..-+--,+**)))*))())'((('""""$""$"
- at 30BB2AAXX080903:3:45:1033:1736#0
-GGTGAGCTCAGGTGATTGATACTCCTGATGCGAGTAATACGGATGTGTGTAGGAGTGGGAGATCGGCAAGGCGGGG
-+
-677777888888.8888888888877776555443222100/...'--',%+++*)*))))))(''#'#$$"#$""
- at 30BB2AAXX080903:3:44:1632:1837#0
-CCATAGAAGTCCCACTCCTAAACACATCCGTATTACTCGCATCAGGAGTATAAATCACCTGCGCTCACCCACGAGC
-+
-67177788888888888888888877756555443.2211-//-.--+,,+))+*'))'))'(''%'"%"%$%"##
- at 30BB2AAXX080903:3:46:884:1759#0
-TTAGACTATGGTGAGCTCAGGTGATTGATACTCCTGATGCGAGTAATACGGGTGTGTTTTGGAGTGTGCAGTCGGG
-+
-67777788888888888888818877776505,43222110//./,--,-+)+*)*%))%)(%(%(&'#####"""
- at 30BB2AAXX080903:3:38:408:2008#0
-ATTAGACTATGGTGAGCTCAGGTGATTGATACTCCTGATGCGAGTAATACGGATGTGTTTAGGGGTGCTCTCAACA
-+
-6777778888888888488888887777655544-22/20.//.-+)-+*++(****((*'((#(#'%#%"$"#$#
- at 30BB2AAXX080903:3:59:1384:710#0
-ATTAGACTATGGTGAGCTCAGGTGATTGATACTCCTGATGCGAGTAATACGGATGTGTTTAGAGATCGACAACNGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((((('&""$##""#
- at 30BB2AAXX080903:3:2:1770:77#0
-TCCCACTCCTAAACACATCCGTATTACTCGCATCAGGAGTATCAATCACCTGAGCTCACAGATCGGAANACACAAC
-+
-6777778888888888888.8888777755454130221/0/-/..(-)%++**&*')((((%%''&""#%%&%#$
- at 30BB2AAXX080903:3:2:485:615#0
-CCAACTCCTAAACACATCCGTAGTACTCGCATCAGGAGTATCAATCACCTGAGCTCACAGAGCGGAATNCGCCCAT
-+
-67.777888888888888&888&877716/65,43222/000/..--,&,,+++**(*)))((''''$"#"##$##
- at 30BB2AAXX080903:3:3:739:217#0
-GTTGTTTTCTATTAGACTGTGGTGAGCTCAGGTGATTGATACTCCTGATGCGAGTAATACGGATGTGCNTTACNGN
-+
-6777778888888888.8$8888877/75555.432/200/-/+---,,,*+++*)**)'))(((&'""""#%"$"
- at 30BB2AAXX080903:3:57:80:906#0
-CATCAGGAGTATCAATCACCTGAGCTCACCATAGTCTAATAGAAAACAACCGAAACCAAATAATTCAAGCACAATA
-+
-677777888/888888888888887777655524222200./--,-,,-,*,*)**))(((((((''&&%%#""#"
- at 30BB2AAXX080903:3:38:1024:1853#0
-AAGCAGTGCTTGAATTATTTGGTTTCGGTTGTTTTCTATTAGACTATGGTGAGCTCAGGTGATTGATACTCGTCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*)((('('&&%%&&%##
- at 30BB2AAXX080903:3:42:930:296#0
-TACAATTTTACTGGGTCTCTATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGAC
-+
-67777788888888888888888877776555443222100//..---,,$++***)))*)))(''''&&&&%$$%
- at 30BB2AAXX080903:3:48:1728:633#0
-TCTATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTAGATCGGAAGAGCGGACCAGCT
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()((('&""$#""#"
- at 30BB2AAXX080903:3:8:1271:374#0
-AAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGAGACTCGAAGTACTCTGAGGCTTGTAGGNACACACNN
-+
-67777788888888888888888877476555243222110//..---,,,(+)**)**'(((''&&""#$&$%""
- at 30BB2AAXX080903:3:45:449:1597#0
-AAAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGAGACTCGAAGTACTCTGAGGCTTGTAGGGGGGGATA
-+
-6777778888888888888888887777655544322210///..--+-,+,+***))))(()('&'$"$%"#"#$
- at 30BB2AAXX080903:3:54:1611:1959#0
-AAAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGAGACTCGAAGTACTCTGAGGCTTGTACACACATCCG
-+
-67777788888888888888888877776555443222100//..---,,++****)*))(((('(''&%$$"##"
- at 30BB2AAXX080903:3:47:325:794#0
-CCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACANTTTACGT
-+
-67777788888888888888888877776555443222101//...--,,+++*+)***))))('('%"#"###"#
- at 30BB2AAXX080903:3:52:326:91#0
-CTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATATCTTGTAG
-+
-677777888888888888888888777765554832021.0//..-,,,,,**++(*))(()&(('&"$"&%$$"#
- at 30BB2AAXX080903:3:43:657:803#0
-TCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGC
-+
-67777788888888888888888877776555443222000/...--,,,,,++*)*)*))(((((''&&&&%##$
- at 30BB2AAXX080903:3:34:779:1470#0
-ACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTNATGACCNN
-+
-67777788888888888888888877$765554412220000/...--,-+,+***))*)()((('&""#"##$""
- at 30BB2AAXX080903:3:39:453:1648#0
-ACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTCTCGCTCCA
-+
-677770888888888888/8+888787743.123+322&/0-*..-,,+,*()+'*(&)(''(((('$&"######
- at 30BB2AAXX080903:3:51:407:778#0
-CAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCCACAGTAGATCTGCGCTCGT
-+
-677772888888888888888888777$6555432/1/10/...-.,,,,+***'*%))(''(('&&"%"""""""
- at 30BB2AAXX080903:3:56:391:1579#0
-CCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCNCTAGCANA
-+
-177127388888888888888882374193451002).1//-/--,-,,,+,+)))))))((((''&"%###$#"#
- at 30BB2AAXX080903:3:8:457:1851#0
-CCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCNCGCGCANN
-+
-677777888888888888888888777765554432021/0..//---,,+++**)(*()()(((('"%"%"#$""
- at 30BB2AAXX080903:3:52:1176:1251#0
-GAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGAGACTCGAAGTACTCTTAG
-+
-67777788888888888888888877776555443222100//.----,,+++***))))')(((('$""#"#"#%
- at 30BB2AAXX080903:3:44:1042:160#0
-CGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCGGGAATGGTGAAGGGGGACTCTGACGGCAT
-+
-67777788888.888888838888777.6555'43+12100...%--,%,)'%+**())))'(('#'"$"#"$#"#
- at 30BB2AAXX080903:3:40:1252:203#0
-CCGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGAGACTCGAAGGGCC
-+
-677777888888888888888888777765554432221/0//..---,+++***()(*))(((((#&$""%""##
- at 30BB2AAXX080903:3:59:1515:652#0
-TTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACACCCNTA
-+
-67777788888888888888888877776555443222100//..---,,+*+***)*)*)((((%&$$%%%%"##
- at 30BB2AAXX080903:3:35:1174:2014#0
-GAAGTCCGTGGAAGCCTGTGGCTACAAAAAATGGTGAGCCGGAGAGGCCGTCGAGATTGGGAGAGCGNCACTCCAN
-+
-67777788888888808888888/+.77655/,450.0$1+$.--'*')+&$(((##'()##&#(&'"%"$"##""
- at 30BB2AAXX080903:3:40:1267:862#0
-GTGAAGTCCGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGGGCTCTA
-+
-6-77.7-888888888888888887747654544332210,0/..-,,,+,+****()())((((('&#"""##"#
- at 30BB2AAXX080903:3:46:594:1507#0
-GTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTTCACGGTCTAGGTGGG
-+
-677777888888888888887388777765554/22/.*////..-,-,+&')+))(&''%&#&&&%"""#""#"#
- at 30BB2AAXX080903:3:43:260:418#0
-CTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCAT
-+
-67777788888888888888888877776555443221100//...--,-+++*+)**)*))(((''"%$%&"##%
- at 30BB2AAXX080903:3:2:1629:1363#0
-TCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCNCGCACTT
-+
-677777888888888888888888774765554432021000/.----+,,++***)()''')'(%''"&&$$#$#
- at 30BB2AAXX080903:3:41:422:1287#0
-AATGACGTGAAGTCCGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCAGATCGGNAGCGCCAT
-+
-67777788888888888888888877776555343222100//..-,,,,,+++*()*()))(('''"$#$""#""
- at 30BB2AAXX080903:3:54:44:719#0
-CTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACCTCATTATT
-+
-677777888888888888888888777765534532221000/.----,,,+***)())('('((''""#"%$##$
- at 30BB2AAXX080903:3:8:1119:1093#0
-TGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGNCCCGCGNN
-+
-67777788888888888888888877776555443.22000-,/..-,+,+++**)))#()((('''"%$%"#$""
- at 30BB2AAXX080903:3:50:978:276#0
-TTTCCGACGGCATCGACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTGCACGGCATTATCCGACCACT
-+
-677777888888%88888888888237+65.544322210/./-+,"-+,++)*&#*))'#((##%%$$"#%#"#"
- at 30BB2AAXX080903:3:40:1659:1272#0
-GTTTAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTACAAAAAAAGTTGAAGAACGGAAGGCGTGTGTAC
-+
-6777778888888888888888887777654544322210/..,,---,,+*+)()***&#))''&%%$"##"""#
- at 30BB2AAXX080903:3:45:187:716#0
-GTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCGGGCA
-+
-67777788888888888888888877776555443222100//..---,,++***+))))()(((''"&""%#%"#
- at 30BB2AAXX080903:3:56:1702:951#0
-AGGAAAGTTGAGCCAATAATGACGTGAAGAACGTGGGAGACAGTGGGGATAAAAAAAAAAAAGGAAGCAACCCAAC
-+
-67777788888888888888888877776)$-4332%01%)#/-.-,,+%++++**)*(&#''####"&&%%$%$$
- at 30BB2AAXX080903:3:1:1553:665#0
-CATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTAGCTCAACTTNCCNCTCT
-+
-67777788888888888888888877776/554/32.11&0-..++,*&,$$*)**)()()(('(#&&"%""""#"
- at 30BB2AAXX080903:3:47:1295:416#0
-ATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCTCGCATA
-+
-67777788888888888888888877776555443221100//.,---,,,,++*****)))(((''&$"#"$##"
- at 30BB2AAXX080903:3:8:1345:1001#0
-TACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCNCACACANN
-+
-6777778888888888888888887777655544302200///.--,-,++++**))**)(((((%("%"%$$#""
- at 30BB2AAXX080903:3:60:1444:740#0
-AAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGATAAAAAAACACAAACNN
-+
-6777778888288888888*8888777765554432/2000//..,---,++++*)))#((#&((''&&%%%$%""
- at 30BB2AAXX080903:3:35:952:944#0
-GAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGCGGAAGACTGAGACCGGAAGANCTCTCCGN
-+
-6377778884888888888888857777655544-3221000+.,-,-,(,'%+%*(*(&&)(''('"%"##"##"
- at 30BB2AAXX080903:3:8:1002:755#0
-GAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTACAAAANATGTCANN
-+
-67777788888888888888888877776555443222120/.-.---,-+++***))))))((((&"%%%%%#""
- at 30BB2AAXX080903:3:40:1518:271#0
-AACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCCGATAC
-+
-67777788888888888888888877776555443222000//..---,,+++*+*)*)()))((('&&#"""##"
- at 30BB2AAXX080903:3:41:433:1987#0
-GATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTAGATCGGACGACACCT
-+
-67777788888888888888888877776555443221100//..-,,,,++++*((*)))))('(''"%"""##"
- at 30BB2AAXX080903:3:59:1174:1407#0
-CATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTGCCACCA
-+
-6777778888888888888-8888777765454332.2000//-.-,,-++*++**))))('(((&%&&%#$####
- at 30BB2AAXX080903:3:38:1634:1439#0
-GCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTCNCAAAACN
-+
-67777788888888888888888877776555443222100//..---,,+++**+*))())(((('""#&$###"
- at 30BB2AAXX080903:3:4:836:199#0
-TTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGACTGTGCNCTCTNCN
-+
-6777778888888888.818,8287673655544/212000//.--+--,++*)*)**()(#(((%'$"%"#""$"
- at 30BB2AAXX080903:3:51:943:1987#0
-AGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAAGATCGTAGAGCGC
-+
-67777788888888888888888877776555443211120//..----,++++*()*))()((((#&"""""#"#
- at 30BB2AAXX080903:3:55:32:799#0
-AGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTAGCA
-+
-67777788888888888888888877776555443222100//..----,,*++**))))((((((&%""#"""$#
- at 30BB2AAXX080903:3:40:1529:293#0
-TGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATATGTCGGCGT
-+
-67777788888888888888888877776645543%32100/..,-,-,,+*)**))*(()'(('#'"$%%&$"""
- at 30BB2AAXX080903:3:45:793:28#0
-TGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCACCCA
-+
-67777788888888888888888877776352443222100/-..--,,-,++***)*)))'((((('$"$"##"#
- at 30BB2AAXX080903:3:41:838:941#0
-TTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTCA
-+
-6777778888888888888888886777655544322200///...---,++++**)))())((('&'%%%&###"
- at 30BB2AAXX080903:3:54:484:1617#0
-CCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCAGATCGTCTGCTCC
-+
-2172778888288-8888580888771765533422311////,,-,,+-+++**(**%&)(()(''$$#""#"##
- at 30BB2AAXX080903:3:4:616:1553#0
-ACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCAACCNCTAGNCN
-+
-677777888888881888888818777;6555443000200....+-,+,+++**)*()()(((('%%"$$"""#"
- at 30BB2AAXX080903:3:51:1185:212#0
-GAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAGATCGGAACACTGCTTC
-+
-67777788888888888888888877775505443222100//...--,,+++***())))))(((&$"$"##"##
- at 30BB2AAXX080903:3:42:1255:1144#0
-AGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGCGACTA
-+
-67777788888888888888888877776755423222000//..--,-,,,+***)))'))'(''&&&%##""#"
- at 30BB2AAXX080903:3:49:709:1893#0
-CCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACANACAC
-+
-67777788888888888888888877776555402222000/...---,,+**+**())))))((('&""""#$#"
- at 30BB2AAXX080903:3:45:641:807#0
-TGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCGGGAG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''%&%$#"#""
- at 30BB2AAXX080903:3:8:718:1747#0
-CACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCAGATCGGAAGAGNGCAGCANN
-+
-67777788888888888888888877773455443211110.+..--,,,++***)))))(('(('("&$$"$#""
- at 30BB2AAXX080903:3:52:1224:1300#0
-ACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAAGATCGGAAGAGCGCGTCCAC
-+
-67777788888888888888888877776555443222100//..,--'-,++*****)())(((('%$#%$"#""
- at 30BB2AAXX080903:3:49:347:619#0
-TTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGGGGAGA
-+
-67777788888888888888888877776555443222100//.'---,,,++++*'))())))(('%$""""$#"
- at 30BB2AAXX080903:3:34:405:690#0
-GATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATNATTCACNN
-+
-67777788888888888888888877776555443222100//.----,,+++**))*))(((((('"#""%""""
- at 30BB2AAXX080903:3:58:810:184#0
-TGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAGTACNNC
-+
-67777788888888888888888877776555443222100/0-..-+,,+++***))())))(((''%%""$""#
- at 30BB2AAXX080903:3:34:974:1466#0
-CGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCNAACATANN
-+
-6777773888888888888888887777655544322210//0.--+--,++++*)))*)))(((''"""$###""
- at 30BB2AAXX080903:3:35:1459:897#0
-AAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCNATTACTCN
-+
-(-7*7-+,,.338)88408..+361.1/4020/120,/1',',(,+"+&(*(%()#(')###''##'"$""$$#$"
- at 30BB2AAXX080903:3:40:1529:113#0
-CCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGTGCAATA
-+
-67777738888888888888888877776555443222100//..----,+,++**)*))))((&('&$#""""""
- at 30BB2AAXX080903:3:58:164:232#0
-CCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGACACNNC
-+
-67777788888888888888888877776555443222100//-.---,,+++***)*))#((('('&&$&%%""#
- at 30BB2AAXX080903:3:57:1380:300#0
-GCCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGTCATAT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&$"%$%""#"
- at 30BB2AAXX080903:3:1:1182:1135#0
-TTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCAAACTAGTATTTCACTTTACATCCAAACATCACNGCNTCGC
-+
-67777788888888+88888887877576556143'.2200*//.-,+,-+,+**+))))))(((&''"&&""#"#
- at 30BB2AAXX080903:3:43:1084:164#0
-TTCGAAGCCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGGTGTG
-+
-6777778888888-88888888887777655544322210//...-,-,+++++*)))))()(((('&$"&"##""
- at 30BB2AAXX080903:3:54:307:1759#0
-CTTCGAAGCCAAAGTGATGTTTGGAGGTAAAGGGAAATATTAGTTGGCGGATGAAAGATCGGAAGAGCGGTCTCTC
-+
-6777778888888818888888887%77655534'222100//&.--,,,,++***)*)()((('('$"""""###
- at 30BB2AAXX080903:3:60:1396:1876#0
-AGTATCAGGCGGCGGCTTCGAAGCCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATCACANGANN
-+
-67777788888888888888888877416/5-4432201.0/..-.-,,,+++*+*)*))()#((&'$$#$""#""
- at 30BB2AAXX080903:3:43:187:112#0
-CTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATAGATG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)*)((('('$&$%"%#"#
- at 30BB2AAXX080903:3:46:868:942#0
-CTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACATCACTTTGGCTTCGAAGATCGGAAGACTCACTTC
-+
-67777788888888888888888877776555443222100//..---,,++****'*))(((('('$$"%"#""$
- at 30BB2AAXX080903:3:57:277:866#0
-ATGCCAGTATCAGGCGGCGGCTTCGAAGCCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGGTGATTCAC
-+
-67777788888888888888888877776555441212100//...-,-,+++*)*)))**((((''"$&"""$##
- at 30BB2AAXX080903:3:56:1456:1323#0
-TCATCCGCCAACTAATATTTCACTTTACATCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACAGTGCACT
-+
-67777788888888888888888877776555443222100//..---,,++++*)*))))))(((&$$&""%##%
- at 30BB2AAXX080903:3:35:1043:356#0
-CATCCGCCAACTAATATTTCACTTTACATCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACNGTCACANN
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*)))((((''"%#$"$"""
- at 30BB2AAXX080903:3:42:793:757#0
-AGCCGCAAACTAATATTTCACTTTACATCCAAACAGCACTTTGGCTTCGAAGCCGCCGCCTGGTACGTCATCGGAA
-+
-607077888488888,8883088,7-7-5755443*.,.//0/,'.*++$+*%**&))#('(#(&##%%"$$##""
- at 30BB2AAXX080903:3:59:1361:1122#0
-TAATATTTCACTTTACATCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTACATCAACA
-+
-67777788888888888888888877776555443222101/....--+,,,++*)*)*&())(('''"$"#####
- at 30BB2AAXX080903:3:48:1641:1538#0
-AGACCACATCTACAAAATGCCAGTATCAGGCGGCGGCTTCGAAGCCAAAGTGATGTTTGGATAGATCGGGACTTAT
-+
-677777888888888888888888777765554432121/01..-.-,+,*+)**)**))((()(&#"#""$""#"
- at 30BB2AAXX080903:3:50:1594:1823#0
-CAGACCACATCTACAAAATGCCAGTATCAGGCGGCGGCTTCGAAGCCAAAGTGATGTTTGGATGTAACGGGGCACT
-+
-67777788888888888888888877776555443222100//..,-,,,+*+****)*))()((''""#""$"#"
- at 30BB2AAXX080903:3:8:1234:1361#0
-ACAGAAATAGTCAGACCACATCTACAAAATGCCAGTATCAGGCGGCGGCTTCGAAGCCAAAGTGATGNTGAATANN
-+
-67777788888888888888888877776555443122100//..----,,+++*+*))())')(''"""#"""""
- at 30BB2AAXX080903:3:4:794:1162#0
-TACAGAAATAGTCAGACCACATCTACAAAATGCCAGTATCAGGCGGCGGCTTCGAAGCCAAAGTAGACNTGTCNTN
-+
-677777888888888888888888777765554432211/0//-.-,-,,*,++*)*))(()('(('"""$$#"""
- at 30BB2AAXX080903:3:1:1707:1412#0
-ATCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATNTCNTATC
-+
-6777778888888888888888887777655544321220///.,.--,,+++***)*))())((('&"#""$##"
- at 30BB2AAXX080903:3:35:926:995#0
-TCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATNTCTGTATN
-+
-67777788888888888888888877776555443222100///.---,,,+++*))))')(((((&"&&&#%$""
- at 30BB2AAXX080903:3:53:996:259#0
-CAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACAGATCGGCTGGCCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(''''$""$"###
- at 30BB2AAXX080903:3:49:1153:1628#0
-ATCACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATTAGATCGGTCCACTAC
-+
-67777788888888888888888877776555443222100//..---),++(+*))*))))()(''%"#"#$"##
- at 30BB2AAXX080903:3:49:1071:1109#0
-TTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATTTCTGTAGATCGGACTNNCTC
-+
-67777788888888888888888877776555443222101//..--,,,+,+***)*)))))((('$"#"""""#
- at 30BB2AAXX080903:3:50:1631:1000#0
-CAATAGATGGAGACATACAGAAATAGTCAGACCACATCTACAAAATGCCAGTATCAGGCGGCGGCTTCGATCCTCA
-+
-67777788888888888888888877776555443222100//..--,,,+++*+*))))))(((''$$""$#"#"
- at 30BB2AAXX080903:3:3:938:1008#0
-CGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATTTCTGTATGTCTCCATCTATTNCTTCNTA
-+
-677777888888888888888888777765554432220/0//..---,,+++****))))))((''%"#&##"""
- at 30BB2AAXX080903:3:3:1460:740#0
-GCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATTTCTGTATGTCTCCATCTATTGATTNTGGCNTT
-+
-67777788888888888888888877776555443222100///.---,++++)**))*))((((&'""""#$"#"
- at 30BB2AAXX080903:3:47:549:1417#0
-CGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATTTCTGTATGTCTCCATCTATTGAGATCTGGANTGC
-+
-67777788888888888888888877776555443222100//..---,,+,+**))*)))((('('%"%"""#""
- at 30BB2AAXX080903:3:59:288:1660#0
-AGAGTAAGACCCTCATCAATAGATGGAGACATACAGAAATAGTCAGACCACATCTACAAAATGCCAGTATCCANNT
-+
-67777788888888888888888877776555443222100//-.-.-+-+++****))))))('(&$%%#$#"""
- at 30BB2AAXX080903:3:46:1443:1818#0
-AAAAGAGTAAGACCCTCATCAATAGATGGAGACATACAGAAATAGTCAGACAACATCTACAAAATGCCGTGCCTCA
-+
-67777788888888888888888877776555543222100//...,-,,,&++**)*)))))((('"#"#"#"#"
- at 30BB2AAXX080903:3:38:1347:441#0
-AGTACCGTTAACTTCCAATTAACTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCAGATCGGCCATATA
-+
-67777788888888888888888877476555443222100.//.--,,*+++*+*))))))(((''"'""#"""#
- at 30BB2AAXX080903:3:54:1587:1230#0
-ATTATTAGTAGTAAGGCTAGGAGGGTGTTGATTATTAAAATTAAGGCGAAGTTTATTACTCTTTTTTGATTGTTGA
-+
-67777788888888888888888877776555443222100//..---,,+++***))())((('''""""%##""
- at 30BB2AAXX080903:3:2:822:1340#0
-AGGGTCGAAGCCGCACTCGTAAGGGGTGGATTTTTCTATGTAGCCGTTGAGTTGTGGTAGGCAGATCGNCGACATC
-+
-6777778888888888888882887727645544322210///.,--+,)+*++**)()*&#(((&#$"#$"#%"%
- at 30BB2AAXX080903:3:41:860:1004#0
-TGACTACCACAACTCAACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCCCCA
-+
-67777788888888888888888877776555443021100//-----,,+,+***(*)((('((''"'"%%#$$%
- at 30BB2AAXX080903:3:46:933:1526#0
-CTACCACAACTCAACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCGCGACGCC
-+
-67777788888888888888888877776555443221000//./---,,,++***))))()(('(#'"%"%$"##
- at 30BB2AAXX080903:3:54:542:1730#0
-ACCACAACTCAACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCTCGCCTC
-+
-67777788888888888828888877776555443222100//-.-----+*+*'+**)'()((('#%$"&%##"%
- at 30BB2AAXX080903:3:8:1533:439#0
-ACTCAACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCCCGCNTAGCACNN
-+
-67777788888888888888888277775555443211100/'/-$-*&+*&))'*'#)'((''(&'"#%#%%#""
- at 30BB2AAXX080903:3:34:29:81#0
-CCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCCCGCGTCCCTTTCTCCATAAAGATCGGAAGANCCACACNN
-+
-67777788888888888888888877776555443222200//.--.--,++++')**)()))('('"$%#%$%""
- at 30BB2AAXX080903:3:59:433:530#0
-CCATAAAATTCTTCTTAGTAGCTATTACCTTCTTATTATTTGATCTAGAAATTGCCCTCCTTTTACCCCTACACNA
-+
-6777778888888%888888888877450553443221100/.--,,-+-,++****#))()(((&'&&$####""
- at 30BB2AAXX080903:3:43:529:1054#0
-TTAGTAGCTATTACCTTCTTATTATTTGATCTAGAAATTGCCCTCCTTTTACCCCTACAGATCGGAAGAGAGCATA
-+
-6777778888888888888888887777652544(2221/../---,,,,+*+***)*(((('((&''"$""""""
- at 30BB2AAXX080903:3:60:1165:229#0
-TAACTATTAGTGGCAGGTTAGTTGTTTGTAGGGCTCATGGTAGGGGGAAAAGGAGGGCAATTTCTAGACGCCTCNN
-+
-67777788888888888(8888887777655541320210&//..-,-,,+++***)'))(()'((''%"$###""
- at 30BB2AAXX080903:3:33:1221:765#0
-ATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGCTCATGGGAGGGGGAAAAGGAGGGCAATTTCTANACACGANN
-+
-677777888888888888,888287777355544/01,000*/..--,,,+++*(*))&()&))'('""$##""""
- at 30BB2AAXX080903:3:54:249:1316#0
-TTTGATCTAGAAATTGCCCTCCTTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATCTCTTTCT
-+
-67777788888888888888888877776555443222100//./--+,-,++**+*)))))))(('&%"%"%$#$
- at 30BB2AAXX080903:3:54:1359:999#0
-GAGGGATGACATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGGTCATGGTAGGGGGAAAAAGGGGGTCTTTACG
-+
-6777778888888888888888887777*545443.22)0.//.%-,,-*+)+***)))))(((%('&&#""###"
- at 30BB2AAXX080903:3:60:967:1358#0
-AAGAGGGATGACATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGCTCATGGTAGAGATCGGAAGAGTGCAATNN
-+
-677777888888888888888888777765+534*22/100/*..-&-,,+++)****)(#)(%&('""#&#$"""
- at 30BB2AAXX080903:3:44:518:1911#0
-TAAGAGGGATGACATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGGTCATGGTAGGGGTAAAAGGGAGGGTGTT
-+
-6777778888888888888888887777655.423222.001/,.--$+++,**)())))'&((((''"#&"""""
- at 30BB2AAXX080903:3:35:163:931#0
-AATAAGAGGGATGACATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGCTAATGGGAGGGGGGATGNCATTGCCN
-+
-67777788888888888888888877776555413222100//..--,,++'****&*)))('(((&"$""""##"
- at 30BB2AAXX080903:3:54:178:178#0
-TAATAAGAGGGATGACATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGCTCAAGATCGGAAGAGCGCGTGCTCG
-+
-67777785888888888888888877776555442212&00'/.,++-,,()+')))#(')#((&('&#"#$""$"
- at 30BB2AAXX080903:3:50:73:387#0
-TTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATAGTTATGTCATCCCTCTTATTACTACAATA
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))(((('&$$"""""""
- at 30BB2AAXX080903:3:50:1447:99#0
-CTACCATGAGCCCTACAAACAACTAACCTGCCACTAATAGTTATGTCATCCCTCTAGATCGGAAGAGCTTCGAACA
-+
-6777778888888888888888887777655544322210-//..---,,+++***))))))(('('$""""""$"
- at 30BB2AAXX080903:3:46:1554:655#0
-TACCATGAGCCCTACAAACAACTAACCTGCCACTAATAGTTATGTCATCCCTCTTATTAATCATCATACTCAGCAC
-+
-67777788888888888888888877776555423212100//.,.--,,+++***)*)))()((''"$$$"####
- at 30BB2AAXX080903:3:42:1713:320#0
-CTTAGGGCTAGGATGATGATTAATAAGAGGGATGACATAACTATTAGTGGCAGGGTAGGTGTTTGTAGTGGCGTGT
-+
-67777788888888888888888877776555443222100//..--+,,+++**))*%()&)(('%&$%%"$##"
- at 30BB2AAXX080903:3:58:1397:476#0
-CAGACTTAGGGCTAGGATGATGATTAATAAGAGGGATGACATAACTATTAGTGGCAGGGTAGGTGTTTTGACTACA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))()&('(&'$$$%"%%$
- at 30BB2AAXX080903:3:8:1224:1129#0
-TTGTAGTCACTCATAGGCCAGACTTAGGGCTAGGATGATGATTAATAAGAGGGATGACATAACTATTNCGAAAANN
-+
-6777778888188888888883884777653244102-00.//.,--,-+,,+)****))()(((('"$##""#""
- at 30BB2AAXX080903:3:2:1736:479#0
-TGCCACTAATAGTTATGTCATCCCTCTTATTAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGCNAAATTAC
-+
-67777788888888888888888877776555443222100//...-)-,,+****)())()()(%'%"""$""$"
- at 30BB2AAXX080903:3:33:1106:808#0
-GTCTAATCCTTTTTGTAGTCACTCCTAGGCCAGACTTAGGGCTAGGATGATGATTAATAAGAGGAGANCTCTACNN
-+
-67777788888888888888888877776555443221100.0..--,,-+++)**)))))))((('"$%""#%""
- at 30BB2AAXX080903:3:50:1426:1840#0
-ATTCGGTTCAGTCTAATCCTTTTTGTAGTCACTCATAGGCCAGACTTAGGGCTAGGATGATGATTAACATGTTAGC
-+
-67777788888888888188888877776555443022100//.--.,--+*+*+*#))()(((#'#$$""""##"
- at 30BB2AAXX080903:3:37:787:879#0
-CCAATTCGGTTCAGTCTAATCCTTTTTGTAGTCACTCATAGGCCAGACTTAGGGCTAGGATGATGATGCATATATN
-+
-67777788888888888888888877776555443222100//.-----,+++*****)))((('('"$&%&"#""
- at 30BB2AAXX080903:3:45:75:505#0
-TAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTACAAAAAGGATTAGACTGAACCGAATTGGGTCCAAG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((((&'&"""#""#
- at 30BB2AAXX080903:3:52:591:86#0
-ATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTACAAAAAGGATTAGACAGATCGGAAGAGCGGTCTCGCAGGA
-+
-67777788888888888888888877776555443222100//..--,,,+++***))))))(('(#$"$&$$""#
- at 30BB2AAXX080903:3:56:1046:962#0
-CATTCGTTTTGTTTAAACTATATACCAATTCGGTTCAGTCTAATCCTTTTTGTAGTCACTAGATCGGATGTGCATC
-+
-67777788888888888888888877776555443222100//.----,,+++***)))))()((('%$%""$##"
- at 30BB2AAXX080903:3:42:249:418#0
-TGAGGGGCATTTGGTAAATATGATTATCATAATTTAATGAGTCGAAATCATTCGTTTTGTTTAAGATCGGTAGACT
-+
-67777788888888888888888877776555443222100//.-.--,,+++***)*))))()(('&%%"$""""
- at 30BB2AAXX080903:3:48:1465:1762#0
-ATGAGGGGCATTTGGTAAATATGATTATCATAATTTAATGAGTCGAAATCATTCGTTTAGATCGGAAGGCGATCTT
-+
-67777788888888888888888877776555443222100//..---,-++++**)))))((('''""""""#""
- at 30BB2AAXX080903:3:53:996:1208#0
-AATGAGGGGCATTTGGTAAATATGATTATCATAATTTAATGAGTCGAAATCATTCGTTTTGTTTAAAAGATCGTTC
-+
-67777788888888888888888877776.55423222100///--+++,+,**)*)))*)(((((%%""&&%""#
- at 30BB2AAXX080903:3:37:1001:196#0
-TATTCCTAGAAGTGAGATGGTAAATGCTAGTATAATATTTATGTAAATGAGGGGCATTTGGTAAATATTCTGCTAN
-+
-67777788888888888888888877776555443222100//..-,-,-+++**+)))))((((('"&$"%%$#"
- at 30BB2AAXX080903:3:2:1772:2031#0
-TGAGGTGTGAGCGATATACTAGTATTCCTAGAAGTGAGATGGTAAATGCTAGTATAATATTTATGTAANATANCAA
-+
-6777778888888888888888187777645554/2220/0/.------,+++*****))))()((''"$"%"$"#
- at 30BB2AAXX080903:3:8:613:423#0
-GGAGGATATGAGGTGTGAGCGATATACTAGTATTCCTAGAAGTGAGATGGTAAATGCTAGAGATCGGNGCTCCANN
-+
-677777888888888888888888777765554432221///...---,-,++***)*)))))((('""$"#$"""
- at 30BB2AAXX080903:3:41:1343:1436#0
-AAATATTATACTAGCATTTACCATCTCACTTCTAGGAATACTAGTATATCGCTCACACCTCATATCAGATCGGCAC
-+
-67777788888888888888888877776555443222101//...--,,+,+++*)()(((((#%'"&&&%#"##
- at 30BB2AAXX080903:3:3:681:1551#0
-TAGGCATAGTAGGGAGGATATGAGGTGTGAGCGATATACTAGTATTCCTAGAAGTGAGATGGTAAATCNCAGANAA
-+
-2777778888888888888888887,7765554632220000..-,,-,,+)**)*)*))))((('&""##%#""$
- at 30BB2AAXX080903:3:49:1630:1869#0
-AGTATTATTCCTTCTAGGCATAGTAGGGAGGATATGAGGTGTGAGCGATATACTAGTATTCCTAGAAGTGGCTGTG
-+
-677777888888888888888888777765554432221/0//..,-,,,++++****))(((('''&"""#"""#
- at 30BB2AAXX080903:3:3:783:684#0
-GAACAGCGACAGTATTATTCCTTCTAGGCATAGTAGGGAGGATATGAGGTGTGAGCGATATACTAGTANCTCGNTC
-+
-67777788888888888888888877776552442222100./-.-.-,++++***)**)))(((('%"#"%#""#
- at 30BB2AAXX080903:3:8:1099:958#0
-CTAGGAATACTAGTATATCGCTCACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATNGTAATCNN
-+
-677777888888888888888888777765554433201/0//..--,,,-++***)**)()()(('"$#"#"$""
- at 30BB2AAXX080903:3:34:22:508#0
-GAATACTAGTATATCGCTCACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTNTCCTCANN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((('(&""#$#$$""
- at 30BB2AAXX080903:3:52:1329:1356#0
-AGTAGCTATAATGAACAGCGATAGTATTATTCCTTCTAGGCATAGTAGGGAGGATATGAGAGATCGGCAGAGCTTG
-+
-67777788888888888888888877776555443222100//..-.-,,++++**)))))()('('$%$"%#""#
- at 30BB2AAXX080903:3:41:1046:924#0
-GTATATCGCTCACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTAGATCGGAGGCCTCA
-+
-67777788888888888888888877776555443222100//.----,,+,+***)**)))((('($&"$"""""
- at 30BB2AAXX080903:3:53:491:75#0
-GAGAGTAGCTATAATGAACAGCGATAGTATTATTCCTTCTAGGCATAGTAGGGAAGATCGGAAGAGCGGTACACTC
-+
-6777778888.88888888888887777655544322210,//.,-+-,-+,+*+***)))'((((%""""%"$##
- at 30BB2AAXX080903:3:39:21:1904#0
-TATCGCTCACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCTCTGGTATATCGGATGTCCATCC
-+
-677777888888$&&$+/,,818,9'/14/55&40'2/01/....,,-&++'#$'('')(%((##''$#"##""##
- at 30BB2AAXX080903:3:33:904:739#0
-CACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCCNCTACTANN
-+
-67777(88888888888888888877776555443222100//..---,,+++***)*))*(((((#"&&##""""
- at 30BB2AAXX080903:3:46:475:51#0
-CACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCGTGCCCGC
-+
-67777788888888888888888877776555443222100//./.---,*++***))())))'(('"""""##"#
- at 30BB2AAXX080903:3:56:45:786#0
-CACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTNANAACCGA
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))(()(((""""$##""
- at 30BB2AAXX080903:3:43:1719:1554#0
-ACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCACAACCCCC
-+
-67777788848888888888888877776555443222100//.--+-,,+++*****)()((('(''$%"$%"##
- at 30BB2AAXX080903:3:52:1657:555#0
-ATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACGCACAAAACAA
-+
-67777788888888888888888877776555443222100//..---,,+++**))))))((((#'&&%""%###
- at 30BB2AAXX080903:3:52:198:488#0
-ATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAGTCCCCAC
-+
-67777788888888888888888877776555443222100//..----,++++*+**))')(((''"$"$"%%##
- at 30BB2AAXX080903:3:52:199:489#0
-ATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAGCACCCAC
-+
-,7777788888888888888888877776555443222100//..-.--,++++*+**))')(((''"$$"#%%$"
- at 30BB2AAXX080903:3:54:1237:527#0
-TCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAACACCTCCTCCC
-+
-67777788888888888888888877776555443202100//..-.-,,++++*+**)))))((''&%#$&$$#$
- at 30BB2AAXX080903:3:36:826:1713#0
-CCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAACAACACCACAGN
-+
-67777788888888888888888877776555443222100//..-.-,,,++***)))))))((('&$$$"$"""
- at 30BB2AAXX080903:3:43:427:76#0
-CTACTATGCCTAGAAGGAATAAGACTATCGCTGTTCATTATAGCTACTCTCAGAACCCTCAACACCCGCTCCCTCT
-+
-67777788888888888888888877776555463.01100//.----,,()*+*')*))')((('''%"#%$###
- at 30BB2AAXX080903:3:2:42:1347#0
-CTAAGAGGGAGTGGGTGTTGAGGGTTATGAGAGTAGCTATAATGAACAGCGATAGTATTATTCCTTCANTGGNNAA
-+
-6777778888888888888888882747655944322210.//..-+),,+*+**))))(()'(((%%""#"""""
- at 30BB2AAXX080903:3:44:1669:1200#0
-GAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAACACCCACTCCCTCTTAGCCAATTTTG
-+
-67777788888888888888888877776555443202100////-.-,-+++****))))((((('&%%$%#$##
- at 30BB2AAXX080903:3:59:600:925#0
-GCACAATATTGGCTAAGAGGGAGTGGGGGTTGAGGGTTATGAGAGTAGCTATAATGAGATCGGAAGAGCGCCTCCC
-+
-677777888888888888888488777-6555443222110//..-----,,+****))('))(('''"%$#"###
- at 30BB2AAXX080903:3:58:1284:384#0
-AGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGGGTGGTGAGGGGTATGAGAGGAGGTATAACACA
-+
-67777788888888888888888877776555443222100./..--$,,*++**+*))()&(&((%"#%$"####
- at 30BB2AAXX080903:3:40:1071:1151#0
-TATAGCTACTCTCATAACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCC
-+
-67777788888888888888888877776555443220100///.---,-++***))))())()'('"%&&%%$$"
- at 30BB2AAXX080903:3:37:139:790#0
-CTACTCTCATAACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTCGCGGAGCN
-+
-677777888888888888888888777765554432221/0//..---,,,++***))))))((((&%"%""$"#"
- at 30BB2AAXX080903:3:47:215:981#0
-CTACTCTCATAACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATAGATCGGAAGATCGGCGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('&"#$""##"
- at 30BB2AAXX080903:3:56:208:1219#0
-CTACTCTCATAACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATAGATCGGAAGANCCCACT
-+
-67777788888888888888888877776555443222110//..---,,,,+***)*))))()(('%&"""#"#"
- at 30BB2AAXX080903:3:50:565:1341#0
-CAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGGGTGTTGAGAGAGCCGTCGACTC
-+
-67777788888888888888888876776545443222100//-.,--,,+'+**))')('('(''%"##$"##"#
- at 30BB2AAXX080903:3:59:409:533#0
-GCAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGGGTGTTGGGGAGATCGTATNNA
-+
-67777788888888888888888877776552423222100//-.-,-,,++#***()#))&)('(&"&%""#""#
- at 30BB2AAXX080903:3:59:593:1035#0
-TTCGCAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGGGGGTTGAGGGTGACCTCA
-+
-6777778888888888888888887777655544+202100//....,,++++'*')))))%'(%(&""&$$####
- at 30BB2AAXX080903:3:38:292:475#0
-TCATAACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCTCGCGCATC
-+
-67777788888888888888888877776555443222100//.-----,,+++**))*)))()(('"#"%#"""#
- at 30BB2AAXX080903:3:50:1480:1291#0
-TGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGATCGGAAGAGCGGCTGACCCGG
-+
-67777788888888888888188877776555443222100//..--,-,,,+**)(()(()(('''%""""#""#
- at 30BB2AAXX080903:3:51:530:701#0
-ACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCAGATCGGACTATGCGCG
-+
-67777788888888888888888877776555443222110//..---,,+++**+)))*)()('''"""""#"""
- at 30BB2AAXX080903:3:55:1247:1936#0
-CCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGATGTGTACGCT
-+
-/77777888888888838888888+777655544-,21.00-/-.,+--,,*(***))*'())((#%'%"###"$"
- at 30BB2AAXX080903:3:34:729:1884#0
-CACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGGNTCACACNN
-+
-677777-8888888888888/488771765553430.0000/-/--,,,+,,+'*)))')))#)#(&"""$$#$""
- at 30BB2AAXX080903:3:8:1322:444#0
-CTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGAGATCGGAANATCTGCNN
-+
-6777778888888888888888887777655544222211/./-,,-,-,++++*)'*))(('((&'"##%$""""
- at 30BB2AAXX080903:3:52:1536:652#0
-CCACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGCACATCTAC
-+
-67777788888888888888888877776555443212101//...)-,,-+)*****)())(%''&'$%$"$"""
- at 30BB2AAXX080903:3:36:1659:1279#0
-AACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGACCTGANNN
-+
-6777778888888888888888887777655344322210///..----,++++***))()'((#%%""%#"""""
- at 30BB2AAXX080903:3:34:764:648#0
-CACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGNCTTCTCNN
-+
-67777788888888888888888877776555443222100//..---,,+,++**)))))((('(&"""#%"#""
- at 30BB2AAXX080903:3:44:1511:1915#0
-CCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGGGGGGTCTGCC
-+
-677777888888888.88888888767765554432211000,..--++,++++'*)))())&)(#''$"""""""
- at 30BB2AAXX080903:3:50:1036:275#0
-CCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACGAGTCGTTGCCGCCTGCGAAACAGCGGGGACGCTGTGT
-+
-6.7.7788883-88888808'8087/-7.-41812220&0.+/#-,-&,$$+#**(#)#(''#((#&"""#"""""
- at 30BB2AAXX080903:3:43:115:2011#0
-TAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAGAGATCGGAAGAGCGCTGTGCAAC
-+
-67777788888888888/88,88/7877655912.1-.+0..-.-+,+'++())))%&(('('%(%'%#"""#"#$
- at 30BB2AAXX080903:3:51:49:557#0
-AGTAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAGGCAAGATCGGGACCCGCTGGC
-+
-67777788888888888888888777770555433',.1.,/+.-*+,+,*'#)**(&)('#%&'#&$"#"""""#
- at 30BB2AAXX080903:3:55:1444:1728#0
-AGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGTGGGCCTAGCCCTACTAGTCGCA
-+
-67777788888888888888888877776555443222000//.---,-,+++)+*)$(('(#%(&'&#"&##"##
- at 30BB2AAXX080903:3:41:882:137#0
-CAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCCGCGAAGCAGCGGTGGGGCTAGGCCTCGCCGTGTCCACA
-+
-6777778888888888888888837717655542322,100*,.-,-+,,&,)+#(&)#%#)'#%#%%"%&##""#
- at 30BB2AAXX080903:3:40:780:1829#0
-GGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAAGCGCACNT
-+
-67777788888888888888888877776355433011/0,-/-+-,+*++,+$*')()(')#''&#$&#"#"#""
- at 30BB2AAXX080903:3:54:437:254#0
-TGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAAC
-+
-67777788888888888888888877776555443222100//.-.--,,*+++**(()(')(((''"&$&%%#"$
- at 30BB2AAXX080903:3:50:906:2018#0
-GTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGTGGGCCTAGGCCTACTAGTCTCAATACTCAACA
-+
-6777778888888888888888887777655544322110.//-.--'),,+#'*)(#)'('#(&&'""#"#"$""
- at 30BB2AAXX080903:3:43:286:196#0
-TATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCCGATG
-+
-67777788888888888888888877776555443322100//-----,,++++*)*())('(((%'%&%""#"""
- at 30BB2AAXX080903:3:45:1475:775#0
-TATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGGGGGCCTAGCCCTACTAGTCTCAATCTCCGATCCACAG
-+
-67777788888888888888888877776555343222$00/,.%,.,+-()*'**(*()((#((''""#"##"""
- at 30BB2AAXX080903:3:48:220:506#0
-ATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAGGAGGAAAAGACTAGACGGGCAGCG
-+
-67777788888888888888888847776555443222.00//.+.--,,,,+&**#&)))')(('&""$####"#
- at 30BB2AAXX080903:3:37:704:1516#0
-CCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACCTCTCGCAN
-+
-6777778888888888888888887777655541322.1-,.+--,+++,++**)))))('('(''#%$$%$"$""
- at 30BB2AAXX080903:3:3:903:1170#0
-CTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCACACCGCTGCTTCGCAAGATCGGAATNACACNCA
-+
-6777778888888888888888887777655'44323000//'.--&-,++,*****)())#(((''""#$"%"##
- at 30BB2AAXX080903:3:3:988:1658#0
-CTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAAGNACTANGT
-+
-67777788888888888888888877776553443220110.../---,++++++*)'))')((&'%""$"##""#
- at 30BB2AAXX080903:3:40:762:432#0
-CTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAACGTCGGACA
-+
-67777788888888888888888877776555443222100././---,-++*+****))))(''''$#%&&%"#"
- at 30BB2AAXX080903:3:3:222:1275#0
-TCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCCGGCGGCCAANACGTNAT
-+
-677777888888888888888888767;65553432220/0//-----,,,++*+)))&*(()('##$""#$""#"
- at 30BB2AAXX080903:3:57:33:1674#0
-AGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCCGATCGGAAGATGGACAC
-+
-6777778888888888888880887777655544322211///.,-,,,-+*+*)*)(%)((&((#''"""#""#"
- at 30BB2AAXX080903:3:43:761:57#0
-GTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAAGATCGGGAGGTC
-+
-67777788888888888888888873776355443212100/...-,,,,+,*+)**()))((&('#"'%""#"#"
- at 30BB2AAXX080903:3:51:507:1342#0
-TGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTAGATCGGAAATAGGGA
-+
-67777788888888888888888877776555443222100//..---,,+++****)*))))((''""""""#""
- at 30BB2AAXX080903:3:51:1643:519#0
-TGCCGCCTGCGAAGCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACACCACACCA
-+
-67777788888888888888888877776555445222100//..---,,++++**)*)))(((''&$"&%%$%$$
- at 30BB2AAXX080903:3:37:803:518#0
-GCCGCCTGCGAAGCAGCGGTGGGCCTATCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTGTCTCGCTN
-+
-67777788888888888884888(714$)55$13132-0/1.+--.,,&,+++*))())(('(((''""#"$##""
- at 30BB2AAXX080903:3:35:170:592#0
-AGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTCGTAGGGCTAGGCCCACCGCTGNCGCCACAN
-+
-677777888888.88888888.887777/555443222100/....-,,,+++++*))))())&(%'"$"%$###"
- at 30BB2AAXX080903:3:51:152:1109#0
-AGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCGTCCTCGT
-+
-6777778888888888888888887777655544322210///..--,,,++*+**)'))))(((('$""#$""#"
- at 30BB2AAXX080903:3:53:1029:889#0
-TGCGAAGCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTACCTCACCTAA
-+
-67477788888888888888880877776555343222200/...--,,,,++*****))()((''#$$%&%"###
- at 30BB2AAXX080903:3:43:489:1666#0
-CAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTAGATCGGAAGAGCGGGACGGCC
-+
-6777778888888888888/08881777655.421)11/./$.+/-++,+++**)*)('()'((''#'$"#"""#"
- at 30BB2AAXX080903:3:39:1428:1113#0
-AGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTACATAACCTAAGCTCTGCA
-+
-67777788888888888888888877776565443222100//...-,,,+++***)))))(('(('%""#$""#"
- at 30BB2AAXX080903:3:57:731:544#0
-GGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCTACTCA
-+
-677777888888888888888888777765554402221/0//..---,,+++***)))))((('(&$$#""""$"
- at 30BB2AAXX080903:3:44:424:1363#0
-GGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTACATAACCTAAACCTACTCCAA
-+
-67777788888888888888888877776555443222100/...---,,+,++***))*((((((''%&&&$%$#
- at 30BB2AAXX080903:3:50:35:510#0
-ATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGGAACGATCAT
-+
-67777788888888888888888877776555443222100//.----+,,,+***)&)))&((('&""#"""$""
- at 30BB2AAXX080903:3:1:396:1739#0
-TGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACGACGTACATAACCTAAACCTCNCANAACC
-+
-277777888888888888,81878.7461525342$2.100*/-...'-,+'++*))))(('(''(''"%&"##""
- at 30BB2AAXX080903:3:43:1377:1569#0
-CATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTCAGACTG
-+
-67777788888888888888888877776555443222100//..-+-,,+++***))())((((''&$##%##""
- at 30BB2AAXX080903:3:58:1417:1634#0
-GCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTACATAACCTAAACCTACTCCAACAAGN
-+
-67777788888888888888888877776555443222000//..----,+++**))))()(((((&%%%$""#""
- at 30BB2AAXX080903:3:3:1150:1405#0
-TAGCATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGNCCTGNTG
-+
-677777888888888888888%8877/76542400+2210/1&.'-&,+(,,+****))*''()(&%&"""#$"#"
- at 30BB2AAXX080903:3:4:504:761#0
-TTAGTTTTAGCATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGCNCTCGNCN
-+
-67777788888888888888888877776555443222100./-.-,+,,+,+*+))*)()()((''&"$"%#"$"
- at 30BB2AAXX080903:3:58:960:1382#0
-GATTAGTTTTAGCATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGGTTAACA
-+
-67777788888888888888888877776555443222100/./.---+,+,++*)*))*)((((''&%&"""###
- at 30BB2AAXX080903:3:49:444:1543#0
-TCTCAATCTCCAACACATATGGCCTAGACTACGTACATAACCTAAACCTACTACAATGCTAAAACTAATCGCGACA
-+
-6777778888888888888888887777655546322-100/...-,-,,,+%+***))())(((('&"$&##"#$
- at 30BB2AAXX080903:3:35:1319:412#0
-TGGGACGATTAGTTTTAGCATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTAGANCGCACANN
-+
-67777788888888888888888877776+55443222100//...--,,+++*+*)*())(((((("$"%#$#""
- at 30BB2AAXX080903:3:56:1624:173#0
-TTGTTGGGACGATTAGTTTTAGCATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGCACAACAGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$$&&###"#
- at 30BB2AAXX080903:3:4:322:1823#0
-CATGTCAGTGGTAGTAATATAATTGGTGGGACGATTAGTTTTAGCATTGGAGAAGGTTTAGGCTATGANCGTANCN
-+
-6777078888888888888888887,776305435/02&00*/.-.-,-,++'***'())'('((('""#""#"$"
- at 30BB2AAXX080903:3:36:786:988#0
-GTCATGTCAGTGGTAGTAATATAATTGTTGGGACGATTAGTTTTAGCATTGGAGATCGGGAGAGCGGCTTCGACAN
-+
-67777788888888888888888877776555423022101//.,+,+,,,+%**)')*%))()%''$"""####"
- at 30BB2AAXX080903:3:60:1351:342#0
-AAGTCATGTCAGTGGTAGTAATATAATTGTTGGGACGATTAGTTTTAGCATTGGAGTAGGTTTAGGTTCCACCANN
-+
-677777888888$8888888888877776555443222100/-..-.-,,+++*)*(*))#()('''"#"####""
- at 30BB2AAXX080903:3:53:235:1478#0
-GTACATAACCTAAACCTACTCCAATGCTAAAACTAATCGTCCCAACAATTATATTACTACCACTGACATGCGACCG
-+
-6777778828.8888+8888888877776555443222100//..-,,,,+++*+***))()(((('"$%"%####
- at 30BB2AAXX080903:3:47:1715:1485#0
-GGAAAGTCATGTCAGTGGTAGTAATATAATTGTTGGGACGATTAGTTTTAGCATTGGAGTAGGTTTAGTGGCGGGC
-+
-67777788888888888808888877776555443222/00///..--,,+++***)))()((''('&#"""##"#
- at 30BB2AAXX080903:3:42:939:929#0
-TCAAATTATGTGTTTTTTGGAAAGTCATGTCAGTGGTAGTAATATAATTGTTGGGACGATTAGTTTTAGCATTGTG
-+
-677777888888888888888888777765554432221&0/..,,-,,,++)**('))))((((('%&""$%$"#
- at 30BB2AAXX080903:3:58:575:1902#0
-TTCAAATTATGTGTTTTTTGGAAAGTCATGTCAGTGGGAGGAATATAATTGTTGGGGAGATTAGTTTTGGTCTCCN
-+
-6777778888888888888888887777655544122,.0/0/-..,-,,,++***'&*(&)'(('''"%%$"##"
- at 30BB2AAXX080903:3:49:1640:620#0
-GCTAATAATTAGGCTGTGGGTGGTTGTGTTGATTCAAATTATGTGTTTTTTGGAAAGTCATGTCAGTCGAATCGTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''$&"###""#
- at 30BB2AAXX080903:3:49:959:1978#0
-ACTACCACTGACATGACTTTCCAAAAAACACATAATTTGAATCAACACAACCACCCACAGCAGATCGGAAGCTACA
-+
-6777778-888888888888888877776555443222100/...---,,+*+*)*))))())(('&&"""$""##
- at 30BB2AAXX080903:3:51:1528:1847#0
-AGAGGGATGATGCTAATAATTAGGCTGTGGGTGGTTGTGTTGATTCAAATTATGTGTGTTTTGGAAAGATGGTCCC
-+
-67777788888888888-8888887777655$443222101/...$.-,,+++****())'(()'''"$"""#%"#
- at 30BB2AAXX080903:3:40:513:888#0
-CATAATTTGAATCAACACAACCACCCACAGCCTAATTATTAGCATCATCCCTCTACTATTTTTTAACCAGATCACC
-+
-177777888888888*888888857777655+443222100/...--,+,,++***)*)))((((''&&$$%&%##
- at 30BB2AAXX080903:3:55:302:514#0
-AACAGCTAAATAGGTTGTTGTTGATTTGGGTAAAAAATAGTAGAGGGATGATGCTAATAATTAGGCTGGGGGTTTG
-+
-67777788888-88(88888888377776-551432/2100//.-----,,++**)(*))))(((('""$""""""
- at 30BB2AAXX080903:3:36:237:472#0
-GGAAAAGGTTGGGGAACAGCTAAATAGGTTGTTGTTGATTTGGTTAAAAAATAGTAGAGGGATGATGCTACGCNCN
-+
-67777788888888888888888877776555443222100//...,,,+,++***)*))))(((('%$##"#"$"
- at 30BB2AAXX080903:3:38:1547:96#0
-TTAGGGGGTCGGAGGAAAAGGTTGGGGAACAGCTAAATAGGTTGTTGTTGATTTGGTTAAAAAATAGACGACACNN
-+
-677777888888888888888)887778635544+0/2/00./.'-+&--*+*+++'('(((('''%"$$""""""
- at 30BB2AAXX080903:3:46:115:1597#0
-TAGGAGGGGGGTTGTTAGGGGGTCGGAGGAAAAGGTTGGGGAACAGCTAAATAGGTTGAGATCGGAAGTGCGACGC
-+
-67777788888888888888888877776055443.22100./,----,-,+****)))))()('''&""##"#"#
- at 30BB2AAXX080903:3:55:529:118#0
-ACCAAATCAACAACAACCTATTTAGCTGTTCCCCAACCTTTTCCTCCGACCCCCTAACAACCCCCCTGCTCATAAC
-+
-677777888888888888888888777765554432221/0//..---,,+++**(*)))))(((('"'"$%$"##
- at 30BB2AAXX080903:3:60:815:1932#0
-AACAACCTATTTAGCTGTTCCCCAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTCCNACNN
-+
-6777778888888888888888887877655224+12,101//.,-+,,,++***)(**'()('(%'&""$"#$""
- at 30BB2AAXX080903:3:36:453:1548#0
-TAGCTGTTCCCCAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTACCTGACTCGCACATCTN
-+
-677777888888888888888888777765554423111//....---,,,,++*))**)()((('&"$$%$"$#"
- at 30BB2AAXX080903:3:41:1537:428#0
-TGAGGGGTAGGAGTCAGGGAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGTCAGAGCGGAAGAGCGGTTCAGAACC
-+
-677777848888888888$88888777765554432221-0/..----,,$,+**(*)))))(((''"""&#""#"
- at 30BB2AAXX080903:3:46:886:1075#0
-TGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGTGGGAGGAAAAGGTTGGGTGCCGCTT
-+
-6777778588888888888888887777655544322210.//.,---,,(*+*&*)')((()'(''&"""#"#""
- at 30BB2AAXX080903:3:43:1012:1723#0
-TGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGTCGGAGGAAAAGGTTGGGGGCGCG
-+
-67777788888888888888888877776555442222100//..---,,++++***))')'()'''&$%%"""#"
- at 30BB2AAXX080903:3:54:676:1472#0
-GCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGTCGGAGGGACAGGTGC
-+
-67777788888888888888888877776555443522100/...---,++++++*)*))(((((''"%%%%##$$
- at 30BB2AAXX080903:3:52:945:914#0
-TTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGAGATCGGAAGAGCGGTCCCGCGGGG
-+
-677777888888888888888888477765/5343222100/...---,,+++***)*())))(((%"""&%"""#
- at 30BB2AAXX080903:3:37:498:1008#0
-GTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGCCTCCGCN
-+
-6777778888888888888888887'776555443222100//..--+,,+++***)())))(((''&"""""##"
- at 30BB2AAXX080903:3:43:1237:487#0
-GTTGGCTTGCCATGATTGTGAGGGGTAGGAGGCAGGGAGTTAGTATTAGGAGGGGGGTTGTAGATCGGGGGAGACT
-+
-6/777788888888888858088872776/5'3432)-1%0./-.----,,++****&()&)(('%''"#%$"$""
- at 30BB2AAXX080903:3:42:951:1057#0
-TGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGTTTT
-+
-6777778888888888888888887777635544321110/./-.--),,+,+***)))))%(('&&%'#""""""
- at 30BB2AAXX080903:3:58:1335:966#0
-TGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGGTGTTAGTGTCCACA
-+
-67777788888888888888888877776)55443222100//-.---,-+++***)))))%((((''"%"##%$$
- at 30BB2AAXX080903:3:38:1316:1622#0
-GGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGCTGTCACTA
-+
-677777888888888888888888777765554432,1101/--.--#,,)+*+)**))))()((('%$%%%"#""
- at 30BB2AAXX080903:3:41:1035:1846#0
-CACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTAAGATCGGCTCGATGCN
-+
-27777788888888888888/888.7576055323222100//---*'+,*$++**()()((((&''$%%#$###"
- at 30BB2AAXX080903:3:35:1160:1334#0
-TCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGATNTGCTCAAN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*)((('('"#%#"$#""
- at 30BB2AAXX080903:3:57:205:1630#0
-ACCCCCCTCCTAATACTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTTATCCATGCGTA
-+
-67777788888888888888888877776555443222100//..---,,+,++****)))()((('$&$""#"#"
- at 30BB2AAXX080903:3:49:154:485#0
-CCCCCCTCCTAATACTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTTATCNCGACAACT
-+
-67777788888888888888888877776555443222100//..---,,++****))*))(((((&"$"###$#"
- at 30BB2AAXX080903:3:42:1571:406#0
-GGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGTGGTCGT
-+
-6727778880888888888888887777657543322.1/0//.,,.-+-+,+++')*)(((&'''''&##""#""
- at 30BB2AAXX080903:3:45:1422:1974#0
-CCCCTCCTAATACTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTAGATCGGAAGGGACG
-+
-67777788888888888888888877776555443222100//..---,,+++*)*)*)))))(('''""#"#""#
- at 30BB2AAXX080903:3:59:294:1395#0
-GTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTAAGATCGNNNC
-+
-67777788888888888888888877776555443222100-/..-,-,,++****)#))()((('''"&&%"""#
- at 30BB2AAXX080903:3:40:385:1146#0
-AGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTACTATGAGGC
-+
-67777788888888888888888877776555413222100/...--+-,+*+***))())((('('$$%$%#$"#
- at 30BB2AAXX080903:3:37:1135:1753#0
-TAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTTGGACN
-+
-67777788888888888888888877776555443220100//..---,-+++*+**))()()('''%%##%###"
- at 30BB2AAXX080903:3:52:837:750#0
-TGATAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGC
-+
-6777778888888888888888887777655544322010///.----,,+&+***)()()(#((&'""#######
- at 30BB2AAXX080903:3:36:680:352#0
-GTGATAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCCTGATTGTGCGGGGTAGGAGTCAGGTAGTNGTATAGAN
-+
-6777778388488888888888887777655544321.+00./..,-,,,++#***()(('((#(('"$"#&%%#"
- at 30BB2AAXX080903:3:46:364:1500#0
-GTGATAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGGAGTGNGNGATAC
-+
-67777788888888888888888877776555443232.00./..--+,,++****()((((('(''""%""#"$%
- at 30BB2AAXX080903:3:2:1154:986#0
-TACTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGTGAACCACTANCCGGTCT
-+
-67777788888888888888888877776555443222001//...-,,,,++*****)))((((''%""%""##"
- at 30BB2AAXX080903:3:59:105:571#0
-TACTAACTACCTGACTCCTACCCCTCCCAATCATGGCAAGCCAACGCCACTTATCCAGTGAACCACTATCACANNC
-+
-67777788888888888888888877(7655554322210//,..---+-+*++**(*))')'(((''&&#%#""#
- at 30BB2AAXX080903:3:60:1176:418#0
-TACTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGTGAACCACTACGATCCNN
-+
-677777888888888888888888777765554432221000/...--,,,++*+***)))()(((''"%#"##""
- at 30BB2AAXX080903:3:48:30:987#0
-TTTTCGTGATAGTGGTTCACTGGATAAGTGGGGTTGGGTTGTCATGAGTGTGAGGGGGGGGGGGGGGCTCCGCCAC
-+
-677777888888888.888888817777)55)4&*22%.0&#.#+,"',,)*#***)()))((((#&%$##""#"%
- at 30BB2AAXX080903:3:2:853:560#0
-CTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTTATAGATCGGAAGAGCGGCNGCCTCTC
-+
-6777778888888888888388884777655543-2)20-0.+.,,++-,,++**)())&((&(&%(""#"""#"#
- at 30BB2AAXX080903:3:38:239:613#0
-GAGGTAGAGTTTTTTTCGTGATAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGNGCGTCTCA
-+
-6777778888888888888888887777655544302210///...--,+,,+'+))*&)))()&(&"#""##"#"
- at 30BB2AAXX080903:3:40:404:1033#0
-AGAGGTAGAGTTTTTTTCGTGATAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGCGTGATCAC
-+
-67777788888888888888888877776535443222100//./---,,+++*)*)*)))((((&&"%"$"""$"
- at 30BB2AAXX080903:3:8:1212:1941#0
-CAAGCCAACGCCACTTATCCAGTGAACCACTATCACGAAAAAAACTCTACCTCTCTATACAGATCGGNCTCGCTNN
-+
-6777778888488888888888167777655544332200/-/,,-,*,-+++*))(#*))((((('"&"#"#"""
- at 30BB2AAXX080903:3:57:91:1513#0
-TCTGTGGCTGTGAAAGTACTAATTAAGGGGGTTTGTCGGGAGGTTAGTATAGAGGGGCAGAGGTTTTTTGTATCTC
-+
-677777888828'8&888,8%8287877%5*'4422$210,/&&-,-#*,)+#+'))$))'(&#'''"$#"$$#$#
- at 30BB2AAXX080903:3:3:15:1417#0
-TTCTGTGGCTGTGAATGTTATAATTAAGGGGATTTGTAGGGGGGTTAGTATAGAGAGGGAGAGGTTTCNCCTNNAC
-+
-67777788888888888.88888877776(5-44322-100*/(.-+-),+++)*()))')((&'(&%"#"%"""$
- at 30BB2AAXX080903:3:35:377:1074#0
-TGATTAGTTCTGTGGCTGTGGATGTTATAATTAAGGAGATTTGTAGGGGGATTAGTATAGAGAGGGANCTACACAN
-+
-677777888888888888$8,888&717.515)432'2000//-,,--&,&,+'*))*))'((('#'"&"#%#$""
- at 30BB2AAXX080903:3:34:330:1261#0
-GAAGATATAAAATATGATTAGTTCTGTGGCTGGGAATGTTATAATTAAGGAGATTTGAGATCGGGAGNCATCCGNN
-+
-67777788888888888888888877776555/4'212,0./-.,-,-,,*++'**'#)''#((&'("$"###"""
- at 30BB2AAXX080903:3:47:993:1219#0
-CTCCCTACAAATCTCCTTAATTATAACATTCACAGCCACAGAACTAATCATATTTTATATCTTCTTCGAACACACA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((''"%"$"%##"
- at 30BB2AAXX080903:3:51:961:1813#0
-TAAGTGTGGTTTCGAAGAAGATATAAAATATGATTAGTTCTGTGGCTGGGGATGTTAAGATCGGGAGAACCGCTGC
-+
-67777788888888888888888877776555443222100//..---,,+,*+'*()))&%()&&&""##"&###
- at 30BB2AAXX080903:3:54:1435:1245#0
-GATAGCCAAGGTGGGGATAAGTGTGGTTTCGAAGAAGATATAAAATATGATTAGTTCTGTGGTTGGGGAGTTGTCA
-+
-67777788888888888888888577776553442220100//.-.--,-++)***%))))(#(((%'"$%%#"##
- at 30BB2AAXX080903:3:50:352:590#0
-ATCGGGTGATGATAGCCAAGGTGGGGATAAGTGTGGTTTCGAAGAAGATATAAAATATGATTAGTTCTGGTGCTGG
-+
-677777-88888888888888)88778165504,32-2100/..-,--,,+,*+***)))(&((%(#""##$#"""
- at 30BB2AAXX080903:3:48:333:1078#0
-TGACTGGTTGCCTCATCGGGTGATGATAGCCAAGGGGGGGGTAAGTGGGGGTTCGAAGAAGATAAGAGCAGGCAGC
-+
-6777778888888888088888887777604--43-2210&/...$-&-,&*+'*&)*()(((&(('"###"##"#
- at 30BB2AAXX080903:3:52:508:1890#0
-GTTCAGGCGTTCTGACTGGTTGCCTCATCGGGGGATGATAGCCAAGGTGGGGGTAAGAGAGATCGGGAGCGGCCCG
-+
-677777888888888.888.188876776555,43222100/.,---#,,++*)***#*#(&'#'('$""$"""#%
- at 30BB2AAXX080903:3:58:469:1093#0
-CCTGCGTTCAGGCGTTCTGACTGGTTGCCTCATCGGGGGAGGAAAGGCAAGGGGGGGGGGAGGGGGGGTATGCTAC
-+
-6-77778.888888(88-88,888(27&9)5(,3222.20,/+#,-$'*+,++****)((((''#('&&#"%%"$#
- at 30BB2AAXX080903:3:34:41:314#0
-CTTCGAAACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGNCTCCTTNN
-+
-67777788888888888888888877776555443222100//..---,,,+++****))))(((('"$$#%""""
- at 30BB2AAXX080903:3:52:1417:358#0
-CTTCGAAACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGACCGCGCGC
-+
-67777788888888888888888877276555443.22&00//...--,,++++*'())))'(((&'&#$&%#"#$
- at 30BB2AAXX080903:3:52:973:1914#0
-CTTCGAAACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAGNGCAGCG
-+
-67777788888888888888888877776555443201200/....--,+,*+**')))(('('(('%""&##%#"
- at 30BB2AAXX080903:3:3:1073:1811#0
-TTCGAAACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAAAGATCGGAAGAGCGGTTCNCGCNNAT
-+
-677777888888888888888888767765/5343222100/..,,.,,-)++*+*))()()(((%#$"$""""#"
- at 30BB2AAXX080903:3:33:1741:589#0
-TGCCTGCGTTCAGGCGTTCTGACTGGTTGCCTCATCGGGTGATGATAGCCAAGGTGAGATCGGAAGANTCACACNN
-+
-677777888888888888888888777765554432221-00...---,++*+*#+)*)&'((%(('"$%"###""
- at 30BB2AAXX080903:3:1:506:1152#0
-GAAACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGCTAGAACGCCTGAACGCNCCNACAC
-+
-64/7718828881*.230,,,,20-,2-+)+0(-*()-)*,)+,'(&&$$($#&#'%#####%%#%#""##"#$##
- at 30BB2AAXX080903:3:51:333:1641#0
-AACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCANGCACTGCN
-+
-67777788888888888888888877776555443222100//-..--,,++++*))*)))((('(&""%"$#"#"
- at 30BB2AAXX080903:3:45:272:1952#0
-AGTATGTGCCTGCGTTCAGGCGTTCTGACTGGTTGCCTCATCGGGGGATGATAGCCAAGGGGGGGGTAAGGGGGCG
-+
-67777788888888888888/88897754555(43.+100/./..*-+,,+++*#*()))&)(((''%"$"&"$""
- at 30BB2AAXX080903:3:35:459:433#0
-CACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGAGANCGTGCGNN
-+
-67777788888888888888888877776555443222110...-.--,,+++*++*)))())((('"&""##"""
- at 30BB2AAXX080903:3:43:894:1016#0
-GTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTGACTGGTTGCCTCATCGGGTGATGATAGCCANGGGGTGC
-+
-67777788888888888888888877776555443222110//..---,,,,+***()*))()((&#$"#""##$#
- at 30BB2AAXX080903:3:44:1221:1665#0
-CCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACC
-+
-67777788888888888888888877776555443220100/....---,++++***)))()(((('&$&&&%$$$
- at 30BB2AAXX080903:3:59:1171:24#0
-CCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCANNN
-+
-67777788888888888888888877776535/31.,210/0,.----,,&+**+*''((#'##(''&"##%%"""
- at 30BB2AAXX080903:3:35:1298:203#0
-TGTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTGACTGGTTGCCTCATCGGGGAGATCGGGANCCTCCTNN
-+
-677777888888888888888888777765552432.210///.'--',+*)*****())'&'((#%"$###$"""
- at 30BB2AAXX080903:3:40:1063:1611#0
-TGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTCCT
-+
-67777788888888888888888877776555443222100//....-,,+++++)))))))((((''%%&%%"#"
- at 30BB2AAXX080903:3:37:1416:384#0
-TACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTGACTGGTTGCCTCCAGATCGGACACGTCGN
-+
-6777778838888888888888/877/7655544.22-1000-(-+&+,+++*)*#(&(#'''#&#%"%%"##%""
- at 30BB2AAXX080903:3:55:1546:483#0
-GCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACAACACATCCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$$%$&#$$#
- at 30BB2AAXX080903:3:55:527:1151#0
-ATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCNAGTACACT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((''"%##$""$"
- at 30BB2AAXX080903:3:4:497:528#0
-TCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCAGCNATCANCN
-+
-6777778888888888888888857777655934302.1///0--.,-,,+++)**)*))('(('''%"""%#"#"
- at 30BB2AAXX080903:3:60:859:1679#0
-GAGCCTACTAGGGTGTAGAATAGGAAGTATGTGTCTGCGTTCAGGGGTTCTGTATGGTTGTCTCATATAGCACANN
-+
-677-/7888888888888888888777765534$352,1/1-..-$-,$*++#$)&)&('#''#(%%"%%$%$$""
- at 30BB2AAXX080903:3:33:901:537#0
-GAAGGGAGCCTACTAGGGGGTAGAATAGGAAGTATGTGCCTGAGTTCAGGCGTTCTGACTGGTTGCCNTCTGCANN
-+
-677777888888'8888888888877276555443222100/%./---,,++****))()()(((''""%"#%#""
- at 30BB2AAXX080903:3:42:774:1155#0
-GAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTGTCTGGTTGTCTCCCGGTCG
-+
-67777788888888888818818877176555442222&0///.,--,-,+++*)&)#)((%&''#%&$#%#"###
- at 30BB2AAXX080903:3:35:856:1046#0
-CCCGATGAGGCAACCAGTCAGAACGCCTGAACGAAGGCACATACTTCCTATTCTACACCCTAGTAGGNTACCTTCN
-+
-67777788888888888888888877(7655,4,*21210//..--,,,,+*++**))()()('(''"""&&%"#"
- at 30BB2AAXX080903:3:48:394:1813#0
-CCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGGCCGCTACA
-+
-677777888888888888888888777765554432211/00/-.-,+-,+++**)*)()((((('%"#""$""##
- at 30BB2AAXX080903:3:49:1438:999#0
-CCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCCGCGGACG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((('&""#"""""
- at 30BB2AAXX080903:3:47:1204:2009#0
-GGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTGACTGGTTGCCCTCTTCAC
-+
-6777778888888888888888887777655543322210///-.--,-,+++*+))))()(('((%$$%""#"##
- at 30BB2AAXX080903:3:33:904:1339#0
-GTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGCACAGGCGTACTGACCGNCACTGANN
-+
-677777888888888888888888777765/55432-2100/..,,,-,,+&+***))#')(('#%'"$#$"""""
- at 30BB2AAXX080903:3:57:927:1252#0
-GAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTGCGCTATA
-+
-67777788888888888888888877736555443222100-/.,---,,++)*++**)*)()('((&"&"#"$##
- at 30BB2AAXX080903:3:2:309:46#0
-GATGAGGAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGTCTGCGTTGAGGAGTTCTCNAGTNNAT
-+
-6777778888888888488)*0817677635.44+,221/../&.,-+,$+*+$*')'))('(#(#'$"#""""""
- at 30BB2AAXX080903:3:33:1694:477#0
-GATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTNTCCAGCNN
-+
-6777778888888888888888187777655(443222100//$..-,,,+*+**()))))'('(''""$%$"$""
- at 30BB2AAXX080903:3:55:1137:1834#0
-CCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCCTCACA
-+
-67777788888888888888888877776555443222100//..---,,,,+****)*))((((('&&"#%$#"#
- at 30BB2AAXX080903:3:49:536:890#0
-GAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACGTCCTC
-+
-67777788888888888888888877776555443222100//..---,,,,++*))*)())))(('&"#""####
- at 30BB2AAXX080903:3:57:843:1396#0
-AACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTAGTCTA
-+
-67777788888888888858888877776555443212100//./----,,++**)))(*()(((('&&#"$####
- at 30BB2AAXX080903:3:41:1759:339#0
-ACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCCTCCCCTACTCATCGAGATCGGGTCT
-+
-67777788888888888888888897476545443220200*...-+-,,)++***(()((('(&''&##%$""$"
- at 30BB2AAXX080903:3:39:1100:149#0
-TGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCCTTCAGTAC
-+
-67777788888888888888888877776555443222/00/-.-,-,,,+++)**(*))())('('"%#$%%"##
- at 30BB2AAXX080903:3:33:1638:1300#0
-GCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTNCTACACNN
-+
-677777888888888888888888777765554432221/0//.-.-,,,,,+++)*)))))))(('""""#"#""
- at 30BB2AAXX080903:3:33:1205:213#0
-AGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTNTCTATANN
-+
-67*747888888888888888788777765552432/212//...-,--,+++**)))()()(((''"%%#""#""
- at 30BB2AAXX080903:3:57:301:1298#0
-CTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGAGATCGCGCGCTGTA
-+
-67777788888888888888888877776555423222000//..-+,,,+,*)**))(((((((''$$$&###"#
- at 30BB2AAXX080903:3:37:628:257#0
-GAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGCTACN
-+
-67777788888888888888888877776555443222100//..,---,,+++**))))))(('('$&%%$&##"
- at 30BB2AAXX080903:3:50:736:303#0
-TTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAAAGATCGGAAGATAACACTAA
-+
-677777888388888888888828771765554432221000..-----++*+*))*))&(((((('"""%$#"#"
- at 30BB2AAXX080903:3:2:1507:571#0
-CGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCAGATCGGAAGAGCNCGCTCTC
-+
-6777778888888888888888887777555534322210//./,.-,,,-+++***)('))(((('%"$"""$##
- at 30BB2AAXX080903:3:2:191:498#0
-GTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTANCGANNTA
-+
-67777788888888888888888877776245443222100/.-.,.,,,+++***)*))(()('(#%"#$"""#"
- at 30BB2AAXX080903:3:37:1327:1296#0
-CACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACGANANGACN
-+
-67777788888888888888888877776555443222100//..----,,++++)))))))(((('$&"%"&##"
- at 30BB2AAXX080903:3:50:1770:1826#0
-TAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGATCGGAAGAGCGGATCCGCGCG
-+
-67777788888888888888888877776555443222100//..---,,,++**+*))))()('''""#""#"##
- at 30BB2AAXX080903:3:2:1202:1083#0
-CCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAAGATCGNAGTCACT
-+
-67777788888888888888888877776555423222100-/..-,-,,,+*+**)*'))))((#'%"#"#%#$"
- at 30BB2AAXX080903:3:46:1029:1155#0
-CCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGAGATCGGAAGACATGGGTG
-+
-67777788888888888888888877776555443322100//..---,,+,+***)))))(((((&$"""#"#"#
- at 30BB2AAXX080903:3:2:1195:196#0
-AGTGAGCCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTANATACACC
-+
-67777788888888888888888877776555442222100./..--,-,+++*)))*())))('(''"""#$"##
- at 30BB2AAXX080903:3:42:300:1964#0
-TTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAAAT
-+
-67777788-888888888883083477765/5/23+2-0.0....--+,,,++*+))*(((((((%'&%&&%"#"#
- at 30BB2AAXX080903:3:43:1094:206#0
-CTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAAGATCGGAGGCGCGC
-+
-67777788888888888888888877776555443222110//..---,,+++***))))))((((''$"&#%"#"
- at 30BB2AAXX080903:3:50:1101:274#0
-TAGAATGGTTAGTGAGCCTAGGGTGTTGAGAGTGTAAATTAGTGCGATGAGTAGGGGCAGGGAGACTACTTCCCTC
-+
-677177888888.88888888888+,77'515442222100.,..-.-,++)+***)()))'(('''$""#$##"#
- at 30BB2AAXX080903:3:38:1506:711#0
-CCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACAGATCGTGAGCGC
-+
-67777788888888888888888877776555443022100//..---,,+++***))))))((((#"$$"""#"#
- at 30BB2AAXX080903:3:41:1224:227#0
-AGTAGAATGTTTAGTGAGCCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTNCTGTGA
-+
-6777778888888888888888887*776555443212/00//.,---,-+,+***)))')(#((''&%""&$$##
- at 30BB2AAXX080903:3:36:1726:561#0
-CTAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAACANTCTCCTNN
-+
-67777788888888888888888877776555443222100//..-.-,,++*+*)**)*))(((('"&&$$$"""
- at 30BB2AAXX080903:3:58:124:1903#0
-AGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAACATTCTACCANNN
-+
-6777778888888888888888887777655944321200///.---++,+,+***)*()(()(('''&%%#$"""
- at 30BB2AAXX080903:3:54:1501:660#0
-AGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGACACTCCTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&$##"#"#"
- at 30BB2AAXX080903:3:46:1617:617#0
-TCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAACATTCTACTACAGTGCTAGA
-+
-67777788888888888888881877776555443222100//.-.-,+,+*++**)*))())((('""""$""""
- at 30BB2AAXX080903:3:49:1022:1264#0
-CTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAACATTCTACTACTCACCGCTTCGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((('''&$"$""##"
- at 30BB2AAXX080903:3:49:1469:208#0
-CAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGTCTGTC
-+
-6777778888888888%888888877770555443222100+...---+,(*+*+**)&)(()('('$"$#$####
- at 30BB2AAXX080903:3:38:1396:722#0
-CTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAACATTCTACTACTCACTCTCACTGCCAGCTGTC
-+
-67777788888888888888888877776555443222100//...--,,+,++*****))()((''&$#&"%#$#
- at 30BB2AAXX080903:3:41:84:660#0
-CGCACTAATTTACACTTACAACACCCTAGGCTCACTAAACATTCTACTACTCACTCTCACTGCCCAANCCTCATCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''"&#"$#"#"
- at 30BB2AAXX080903:3:40:452:1727#0
-TGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGTGAGTGTAATAGATTCAC
-+
-677777888888888888888-88767565514-322100//).--,,,,+++)*)))))()(('('$$%%%$"##
- at 30BB2AAXX080903:3:60:578:84#0
-CAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGGGTTGTGAGTACTNN
-+
-67777788888888888888888877776553443122/00./...---,++****)()*)&('((&'"&%##"""
- at 30BB2AAXX080903:3:38:695:1481#0
-TCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGAGAGGACAC
-+
-67777788888888888,8888887777655544320210//...-,,,,+++**(())))((((('$$#"""###
- at 30BB2AAXX080903:3:1:1137:1440#0
-CTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGNGCNGCTA
-+
-6777778888888888888888887777655240302100/./..--*,++++***'))()((&('%%"#%""#""
- at 30BB2AAXX080903:3:39:244:1967#0
-CTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGTGACATAC
-+
-67777788888888888888888877776555423220201//----,,,-+++**((*))))((''"$"%%"""$
- at 30BB2AAXX080903:3:54:282:249#0
-TTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGCTGGTAT
-+
-6777778888.8888888888888777765554130221000/..,-+,,+*++**))))())((('$%%#$"#""
- at 30BB2AAXX080903:3:1:726:93#0
-CAACACCCTAGGCTCACTAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGACNCTNTCAA
-+
-677777888888888888888888777765254131211/0./..+-,-,,,+***)*))()(((('""#""##"#
- at 30BB2AAXX080903:3:38:1501:851#0
-TAAGTTGTTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGCTC
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))((('(&&%&""%$"#
- at 30BB2AAXX080903:3:46:635:799#0
-CACTAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACTTAATATGAGCTAT
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))()((('%$$$""""#
- at 30BB2AAXX080903:3:48:1320:595#0
-AAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGGAGATCGCTCGCACA
-+
-677777888888888888888888777365/5'4321200-../.*--,,+++**)*()()#)('#'&&$"##"##
- at 30BB2AAXX080903:3:39:320:1443#0
-TGTAAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATTGC
-+
-67777788888888888888888877776555443222100//..---,,+,+****))))()(((&$"%$#"""#
- at 30BB2AAXX080903:3:50:1204:825#0
-TGTAAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGCTACATCAC
-+
-67777788888888888888888877776555443222100//..---,,+++****)))((((((&""##"""##
- at 30BB2AAXX080903:3:48:447:659#0
-AGCTATTGTGTAAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGNGACGCTG
-+
-67777788888888888888888877776555443222100./..--,,,+++***)*)#()((('''"$$#"#""
- at 30BB2AAXX080903:3:2:1683:541#0
-TACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACTTAATATGACTAGCTTACACCNAATCACA
-+
-67777788888888888888888877776555443222100//...--,,+,++***)))))))('&$"""%##""
- at 30BB2AAXX080903:3:4:857:1261#0
-TCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACTTAATATGACTAGCTAGATCGGAAGAGCNCTCANCN
-+
-67777788888888888888888877776555)43222100/...---,,+,++*)))))))((('(&"$"$#"#"
- at 30BB2AAXX080903:3:53:1692:1419#0
-GGTATCTTTACTATAAAAGCTATTGTGTAAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGATCTACACCACA
-+
-67777788888888888888888877776555443222100//..---,,++****)))))(((''#"$%&%#%"#
- at 30BB2AAXX080903:3:36:663:1796#0
-AGGTATCTTTACTATAAAAGCTATTGTGTAAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGACACATCACNN
-+
-67777788888888888888888877776555343220/0///.----,,+++*+***)()(()('#$$""%$%""
- at 30BB2AAXX080903:3:38:913:1126#0
-CAAGAACTATCAAACTCCTGAGCCAACAACTTAATATGACTAGCTTACACAATAGATCGGAAGAGCGGTTCAGCTA
-+
-67777788888888888888888877776555443222100//..---,-+++*****))()(((('%###""""#
- at 30BB2AAXX080903:3:35:374:1092#0
-TAAAGAGGTATCTTTACTATAAAAGCTATTGTGTAAGCTAGTCATATTAAGTTGAGATCGGAAGAGCNCATCTATN
-+
-67777788888888888888888877776555443221100//..---,,+++***)))))()((('""""#"##"
- at 30BB2AAXX080903:3:2:1611:843#0
-AGTGGAGTCCGTAAAGAGGTATCTTTACTATAAAAGCTATTGTGTAAGCTAGTCATATTAAGTTGTTGNTCACCTA
-+
-67777788888888888888888877776555443202100/....,-,,+++***)*)))((((('&"##"##"#
- at 30BB2AAXX080903:3:3:1070:1084#0
-AAGTGGAGTCCGTAAAGAGGTATCTTTACTATAAAAGCTATTGTGTAAGCTAGTCATATTAAGTAGATNCTGCNAC
-+
-67777788888888888888888877776555442222100//...--,,+,+**)))))()('(('$"#%&#"#$
- at 30BB2AAXX080903:3:53:971:1126#0
-AACTTAATATGACTAGCTTACACAATAGCTTTTATAGTAAAGATACCTCTTTACGGACAGATCGGAAGAGCGGCTG
-+
-67777788888888888888888877776555443222100//...--+,+++)***))))((((''%##"###""
- at 30BB2AAXX080903:3:49:1072:1244#0
-TACCTCTTTACGGACTCCACTTATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATATACGACAT
-+
-67777788888888888888888877776555443210100//..-.,*,,,+)*)*)))()(('&'%"#%""#""
- at 30BB2AAXX080903:3:33:1529:186#0
-TTACGGACTCCACTTATGACTCCCTAAAGCCCATGTCGAAGCCGCCATCGCTGGGACAGATCGGAAGNGCGCACNN
-+
-627777888888888888888888777765/54&-'(1201+.(-,-#,),&+**%'(&)(&''#''""$$"#"""
- at 30BB2AAXX080903:3:35:812:1164#0
-CTCCACTTATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTAGATCGGAAGAGCGGGTCNCNCTCCCN
-+
-677777888888888888888888777765554430/21/1/./,-.-),,+*)*)(()()')(#'&""""""##"
- at 30BB2AAXX080903:3:52:227:1277#0
-ATAGCCGCCTAGTTTTAAGAGTACTGCGGCAAGTACTATTGACCCAGCGATGGGGGCTTCGACAGATCTGGGGTCG
-+
-67777788888888888888888877776555443222100//...-,,++++****))()((((('&"##"#"#$
- at 30BB2AAXX080903:3:55:483:728#0
-CCATAGCCGCCTAGTTTTAAGAGTACTGCGGCAAGTACTATTGACCCAGCGATGGGGGCTTCGACATGGCGTCCAT
-+
-67777788888888888888888877776555443)22100//..---,,+,+****)))))(((('"&""###""
- at 30BB2AAXX080903:3:40:243:1720#0
-TAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTAGATCGGAAGANGCGATACG
-+
-6777778888888888888888887777655244021210.//.-,-,,,++++**'*()())('(%"'#""""#"
- at 30BB2AAXX080903:3:43:1725:800#0
-AAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTTCGGGTA
-+
-6777778888888888888888887777655544322210///..----,+,+*+**())())('('"$""%""#"
- at 30BB2AAXX080903:3:59:86:1823#0
-CCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATTGCACNNC
-+
-67777788888888888888888877776555443222100//...-,,,++++**)))))((((('$"&%##"""
- at 30BB2AAXX080903:3:56:806:404#0
-TGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGATCGGAAGAGCGGTCTGCTG
-+
-67777788888881888888888877756-55443222100/.-.---,,+++*+*)))))())((''&"%"""""
- at 30BB2AAXX080903:3:50:484:1458#0
-CCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAACACTAGGCGGCTATGGTATAGATCGGTACCGCAG
-+
-67777788888888888888888877776555443222100/..----,,++****)))(((((''&&$"##$#"#
- at 30BB2AAXX080903:3:56:1036:248#0
-CCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATGGTATAATACGCCCCACACC
-+
-67777788888888888888888877776555443222100/...---,,++++**))())))((''%%"&$%"#"
- at 30BB2AAXX080903:3:59:1400:106#0
-CCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATGGTATAATACGCCACACNNA
-+
-677777888888888888888888777765554$3222100//..---,,++++*)))#)))(('('&%%%"%""#
- at 30BB2AAXX080903:3:51:633:1554#0
-TGAGTGTGAGGCGTATTATACCATAGCCGCCTAGTTTTAAGAGTACTGCGGCAAGTACTATTGACCCACACCATGC
-+
-67777788888888888888888877776555843222110//+..--,,++*****())))(((''"$"##"""$
- at 30BB2AAXX080903:3:47:17:568#0
-AATGAGTGTGAGGCGTATTATACCATAGCCGCCTAGTTTTAAGAGTACTGCGGCAAGTAGATCGGAAGTGCTCGCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((''&&""#"#"##
- at 30BB2AAXX080903:3:43:389:1851#0
-GCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATGGTATAATACGCTCAAACTTCATCTTCC
-+
-6777778888888888888888887777655548322210///..---,,+,++&)($')#%#%#%#$$"&""""#
- at 30BB2AAXX080903:3:53:85:775#0
-GGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATGGTATAATACGCCAGATCGGAAGAGCGCGTC
-+
-67777788888888888888888877776555443222100...---+,-+,++****()(((((#'&$#"#""#"
- at 30BB2AAXX080903:3:3:1697:1557#0
-GTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATGGCATAATACGCCTCACACTCATTCNCCACNCN
-+
-67777788888888888888408877-75555533.220-1*,-,$,++,*,*(**(*)(''#(('%$"$"&$"$"
- at 30BB2AAXX080903:3:41:1638:1451#0
-GGGGGTTGAGAATGAGTGTGAGGCGTATTATACCATAGCAGCCTAGTTTTAAGAGTACTGCGGGCAGTACGATCGT
-+
-677777888888888888888888777765554602221-)/.---,,,-,*++*)*))))))((''%%$%&$%#"
- at 30BB2AAXX080903:3:37:737:186#0
-AGGGGGTTGAGAATGAGTGTGAGGCGTATTATACCATAGACGCCTCGTTTTAAGAGTACTGCGGCAACTAATCACN
-+
-67777748888888888085888877476555443222100/./.,-+,,+*++***))))((((''"$""####"
- at 30BB2AAXX080903:3:36:1663:52#0
-ATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCGATGGTATAATACGCCTCACACTCATTCTCANGCTAATNN
-+
-6777578888888888/8888888777765554432(1001%/-,.+-+,+,**+*)*#)(#'(&('""$"#""""
- at 30BB2AAXX080903:3:58:699:1018#0
-AGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGAGGCGTATTATACCATAGCCGCCTAGTTTTAAGCACAC
-+
-6777778838888888888888887777335544/212100//.----,,+,+*+*))))())('''&$"$$##$#
- at 30BB2AAXX080903:3:56:1142:338#0
-TTAAAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCGAC
-+
-67777788888888888888888877776555443222100//..,--,,+++***)))))((((('&$%&%#""#
- at 30BB2AAXX080903:3:59:996:216#0
-AAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAAACCCCTGACAAAACACATAGCCTACCGACTNC
-+
-67777788888888888888888877+76575443200100/..%.--,+,,+****()(((('&'%%&##""#""
- at 30BB2AAXX080903:3:57:987:160#0
-AGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGAGGCGTATTATACCATAGCCGCCCCAAC
-+
-677777888.8888888888888877776555451222000//.,---,,+++)****))()((((&'%"$##""#
- at 30BB2AAXX080903:3:52:756:316#0
-ACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCCACGCCTT
-+
-67777788888888888888888877776555443022100//.,--,,-++++**)*)()(()(('%$"#"&$$#
- at 30BB2AAXX080903:3:34:1415:703#0
-AAGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGAGGCGTATTATACCATAANAGCGTCNN
-+
-67777788888888888888888877776555443222100//..--,,,+++***)*))))((((&"#"&$"#""
- at 30BB2AAXX080903:3:54:689:635#0
-ACAAGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGAGGCGTATTAGATCGGAAGGCGCAC
-+
-677777888888.8888888888877776555443222100//..---,,+++***)))))(((''&&#"#$#$""
- at 30BB2AAXX080903:3:52:269:1537#0
-GGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCTCANTTGTTC
-+
-67777788888888888888888877776555443212000//...-,,-+,+++)*))))((((((&""$&$#"#
- at 30BB2AAXX080903:3:38:781:199#0
-CTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCTTCCTTCTACTACNN
-+
-67727718888888888888888877776555443222,00//-..--,,*++++***)))(((((#"$"%##"""
- at 30BB2AAXX080903:3:47:1209:426#0
-TGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCCACCCCTTCCGAGATCTGTTGTCA
-+
-+7770788888888888888888817776555413212110//-.---,,++'***)))()((((('$""###"#"
- at 30BB2AAXX080903:3:55:588:1023#0
-TGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCGAATGGGAGNAGCACAAC
-+
-67777788888888888888888877776555443222100//..---,,++++&*)())%#((&#'"&%%#%#"#
- at 30BB2AAXX080903:3:3:123:1016#0
-TAGGGATAGTACAAGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGAGGCGTANCATCNCA
-+
-67777788888888888888888877776555443222001//..-,-,,+*+**))*)))((('''&"$%##"##
- at 30BB2AAXX080903:3:1:476:1908#0
-TAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCTTCCTTGTACTATCCNCCNCATC
-+
-67777788888888888888888877776555(432.21/00&.,--+,,+,++'*))%('((((('&"##""#"#
- at 30BB2AAXX080903:3:57:975:838#0
-GCCTCATAGGGATAGTACAAGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGGTGTCAACT
-+
-67777788888888888888888877776555443220120//---,-,,++'**))))')((&'('&&%"#""#"
- at 30BB2AAXX080903:3:38:990:1689#0
-TTATGCCTCATAGGGATAGTACAAGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGATGTCCACC
-+
-67777788888888888888888877776555443222100//..---,,,++****)))))(('('"%$"#$###
- at 30BB2AAXX080903:3:58:1114:987#0
-TCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATACATAC
-+
-6777718888888888888888887793652544302210/....--,+-,+***))*()(()((''&$&%%%"#%
- at 30BB2AAXX080903:3:58:1115:989#0
-TCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATACAAAC
-+
-67177388888888888888888877516543443.12201../.,-,-,,+*+*))*()(()((&'&$&%%###%
- at 30BB2AAXX080903:3:36:815:995#0
-AGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAAGGAAGGGGTAGGCTATGTGTTTCTCCTGCN
-+
-67777788888888888888888877776555443222100//...--,-+++***))))))(('''"$"$""#""
- at 30BB2AAXX080903:3:55:523:972#0
-GTAGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAAGGAAGGGGTAGGCTATGTGCAGATCGTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&$"""%#""#
- at 30BB2AAXX080903:3:1:1636:466#0
-TGTCGTAGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAAGGAAGGGGTAGGCTATNTCNACTT
-+
-67777788888888888888888877776555441232100//...-+-++++*+)))))')((%'('""#"####
- at 30BB2AAXX080903:3:40:1692:462#0
-TCTGTTTGTCGTAGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAAGGAAGGGAGATTGGGCTG
-+
-67777788888888888888888877776555443222101///.---,-,++)+***)(())(((($$"%$""#"
- at 30BB2AAXX080903:3:58:1667:376#0
-TCTGTTTGTCGTAGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAAGGAAGGGGCACACAACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''%$$%%%#%""
- at 30BB2AAXX080903:3:35:1581:96#0
-GATTTTAGGTCTGTTTGTCGTAGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAANTCACGCNN
-+
-67777788888888888888888877774555443222100//..---,,++)****)*())'((('"&"$%"$""
- at 30BB2AAXX080903:3:44:1025:712#0
-AATGAGCGATTTTAGGTCTGTTTGTCGTAGGCAGATGGAGCTTGTTATAATTATGCCTCAGATCGGAAGGGCGGTG
-+
-6777778838888888888888886771655544222200//..-.--,,-,+**))*)())((((&%$"#$##"#
- at 30BB2AAXX080903:3:44:450:1782#0
-GTACTATCCCTATGAGGCATAATTATAACAAGCCCCATCTGCCTACGACAAACAGACCTAAAATCGCTCCTTGCAT
-+
-67777788888888888888868877776555250222.00./..--++,++++*+)*)()((('(''%"%%%%$#
- at 30BB2AAXX080903:3:41:367:1046#0
-TACTATCCCTATGAGGCATAATTATAACAAGCTCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATA
-+
-67777788888888888888888877776555443222100//..--,,,++++**)))))()(((&%%&%%%$##
- at 30BB2AAXX080903:3:57:447:1741#0
-TATGAGGCATAATTATAACAAGCTCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()('''$&%"%###
- at 30BB2AAXX080903:3:52:1227:1808#0
-GGCTGATTGAAGAGTATGCAATGAGCGATTTTAGGTCTGTTTGTCGTAGGCAGATGGAGCTTGTAGAGCGGGGACG
-+
-67777788888888888838/888777;6555343212100//.---,,,+++***))*())(('(%"$#&""##"
- at 30BB2AAXX080903:3:3:1594:36#0
-TGGCTGATTGAAGAGTATGCAATGAGCGATTTTAGGTCTGTTTGTCGTAGGCAGATGAGATAGGAAGCNTGCTNCN
-+
-677,778888888888888688887717655544322,100//.-(--,,+&++*())))'#(((&'%""##""#"
- at 30BB2AAXX080903:3:34:238:1981#0
-TATGTGGCTGATTGAAGAGTATGCAATGAGCGATTTTAGGTCTGTTTGTCGTAGGCAGATGGAGCTTNTACCACNN
-+
-6777778888888888888888887777:55544322110.0/..----,+++**))*(()(()'''"""$#$#""
- at 30BB2AAXX080903:3:41:989:895#0
-ATTATAACAAGCTCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATCC
-+
-67777788888888888888888877776555443222100//..----,,+++***)))))(((('&&%%##$""
- at 30BB2AAXX080903:3:48:112:1397#0
-ATAACAAGCTCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCCTATCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*)((('''$"$"#"$##
- at 30BB2AAXX080903:3:51:932:211#0
-ACAAGCTCCATCTGCCTACGACAAACAGACCTAAAAACGCTCATTGCATACTCTTCAGATCGGAAGAGTCTCGCGC
-+
-6777770888888888-8888888777765554432#21/1/...-.,,-+'+**'()))()('(('%"######$
- at 30BB2AAXX080903:3:53:665:1041#0
-CAAGCTCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCACCCACATAGGCGACTC
-+
-67777788888888888888888827776555443222111-...,,-,,+,*****)*)(&('(&'&$""%###"
- at 30BB2AAXX080903:3:46:1195:1334#0
-TCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCCCTCGCCAC
-+
-6777778888888888888888887777655244322210.//.'-,-,,+,+***)*)(()(((('%#"#"#"""
- at 30BB2AAXX080903:3:49:416:31#0
-CATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGATGCCAGC
-+
-67777788888888888888888877776555443222100//..----,+,+*+*)))())((((($#"###""#
- at 30BB2AAXX080903:3:36:1016:1573#0
-GCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTACCTCTACN
-+
-67777788888888888888888877776555443221100//.----,,,,++***()*))((((%'$$#"###"
- at 30BB2AAXX080903:3:37:950:497#0
-GCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTACCAGTCGN
-+
-67777788888888888888888877776555443222100//..---,-++++++)))))))(((%&"%&$"%""
- at 30BB2AAXX080903:3:33:826:1300#0
-TACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTAACNGCCACCNN
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))))))(((((""$####""
- at 30BB2AAXX080903:3:3:1143:1970#0
-TACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTAACANCCANNCA
-+
-67777788888888888888888877776555443212.0///..--,,,,*+++))'))%)(%(''$""$$""$#
- at 30BB2AAXX080903:3:40:1183:916#0
-AGAATGGCTGTTACTACGAGGGCGATGTGGCTGATTGAAGAGTATGCAATGAGCGATTTTAGGTCTGTTTGTCGTA
-+
-67777788888888888888882+777765.54022/21///...-,-,,-*+)*(%)))()(''''"$%&$#$##
- at 30BB2AAXX080903:3:40:1184:917#0
-AGACTGGCTGTTACTACGAGGGCTATGTGTCTGATTGAAGAGAATGCAATGAGCGATTGTAGGTCTGCTTGTCTAA
-+
-677*77888888888888888/2877776%/545322210./&.,--',),*+****)#)&)(((&'"$%&&$"#"
- at 30BB2AAXX080903:3:35:1634:300#0
-ACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGAGATCGGANCCTCACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((((&"$$$$##""
- at 30BB2AAXX080903:3:4:676:1466#0
-TGAGAATGGCTGTTACTACGAGGGCTATGTGGCTGATTGAAGAGTATGCAAAGATCGGAAGAGCGGTCNCGCANAN
-+
-6777778888888883/88.888877376+55,33(22/0//..,,+,&(++*))&))&)('(#((&""%"$""#"
- at 30BB2AAXX080903:3:48:964:534#0
-GACGAGAATGGCTGTTACTACGAGGGGTATGTGGCTGATTGAAGAGTATGCAATGAGAGATTTTTGGGGAGGTTTG
-+
-67777788888888888.02888877+&:/5)34*22%10.#/.--"+',))*)*)*#*''))(&'&"""$"#"#"
- at 30BB2AAXX080903:3:36:1229:1719#0
-CAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTAACAGCCAACCTCTACN
-+
-67777788888888888888888877776555443222100/...---,-+++***))*))(((('#"$$&&#"#"
- at 30BB2AAXX080903:3:1:726:1205#0
-CAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTAAAGATCGGAAGANCTNACAA
-+
-677777888888888888888888777765558432220/00/...,,-,,**+')*'*()((('''%""#"$$#"
- at 30BB2AAXX080903:3:48:1339:1623#0
-GTTTGGATGAGAATGGCTGTTACTACGAGGGCTATGTGGCTGATTGAAGAGTATGGAATGAGCGATTATGCAGTGN
-+
-6777778888888888888/88087877655241332*1&//'..*+,-*+&+**#())(()%)'%'"%"#""##"
- at 30BB2AAXX080903:3:50:670:574#0
-AGGGGGTTTGGATGAGAATGGCTGTTACTACGAGGGCTATGTGGCTGATTGAAGAGGATGCAATGAGCGAGCATAG
-+
-677777888888888888888888/77796551432+1)/0+/..--+,,+(+***&)()%&('(''""""%$#""
- at 30BB2AAXX080903:3:3:677:1857#0
-TTCAGGGGGTTTGGATGAGAATGGCTGGTACCACCAGGGGGAAGGGGCTGGTTGGAGAGGATGGAAAGNGCGNNGT
-+
-67777788888888/88488888877774/*$1-"'121$&%#-%--&$,(&+)'*())((#(##(%""&"$"""#
- at 30BB2AAXX080903:3:53:1563:1983#0
-TCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTAACAGCCATTCAGATCGGAAGAGCGGCACACCACCA
-+
-677777888888888888888888777765'5,432121/0/...,,,,-*+*)+'**)(((('(('$$%%#%##%
- at 30BB2AAXX080903:3:54:153:385#0
-CCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGGTCCCACCAGGGGGGTGTGGGTGGCCTTGGCGTGCTGTA
-+
-677777888848888888888888+77-5'5.4$/22'&#,##('),,+)*%#()*)$#('#''###%&#"#""""
- at 30BB2AAXX080903:3:44:475:316#0
-GCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGGTACTACGAGGGGGATGTGGGTGGTTGGAGGGGGGGCA
-+
-677777888888888888888888777765554432220$,--,),(,,,)$%&*))*(')'#('#'&"&"""#""
- at 30BB2AAXX080903:3:42:992:134#0
-CTGCGCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGGGACTACGAGGGGGATGTGGGTGGTTGCGGCTCC
-+
-67777788888888888888888877776555442322100/.$%,*',()+++&###'#((&#(##&&#&&###"
- at 30BB2AAXX080903:3:2:618:834#0
-CTCTTCAATCAGCCACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGATCGGAATNCCACACT
-+
-67777788888888888888818877376365)43200101...----,++****)*)(()''(('%""""#%#$#
- at 30BB2AAXX080903:3:4:295:1551#0
-TCTTCAATCAGCCACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGCNCCACNCN
-+
-6777778888888888888888887727852904351.20//+--*+,),,*+)')()))('(((''%"#$"%"""
- at 30BB2AAXX080903:3:4:1755:405#0
-TGACTGCGCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGGTAGTACGAGGGGTATAGAGATGNTCACNCN
-+
-67777788888888888888888877736555443222100/...-+&$+*$*$***(&'&'''###%"##$%"$"
- at 30BB2AAXX080903:3:59:991:1691#0
-TGACTGCGCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGTTTTTACGAGGGGGATGTGGGTATGTGACCA
-+
-67777788888888888888888877776555343222/00/...+,#$+($'%***#&##%#('##""&""#$#"
- at 30BB2AAXX080903:3:42:580:215#0
-TTCAATCAGCCACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCCGAAGCTTCACCGGCGCAGTCCTC
-+
-6777778888888888888888887777655544322210///...--,+,++*)*))))))()((''&%%$%"$#
- at 30BB2AAXX080903:3:45:1397:883#0
-CCACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCAAGATCGGAGCT
-+
-67777788888888888888888876776555443232200//,.---,,,+++***)))()&('''"$"#$"#""
- at 30BB2AAXX080903:3:38:1423:1370#0
-CACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCATTCCTCTAGCGC
-+
-6777778888888888888888887777655544222/100/./..-,+,+**()*()()(#(((&&""&&#""#"
- at 30BB2AAXX080903:3:53:176:2039#0
-CACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGAGATCTGACTCCCTC
-+
-677777888888888888888888777365558132.2/00...,.--,,++))**(*(%((((''%'%$$$"$#$
- at 30BB2AAXX080903:3:44:227:1032#0
-CGTGGGCGATTATGAGAATGACTGCGCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGGTAGTACGAGGGG
-+
-67777788888888888888888877776555443222100//..,--,,+,++***))))(()&##&"#%"$%#%
- at 30BB2AAXX080903:3:38:1791:835#0
-AGTCCGTGGGCGATTCTGAGAATGACTGCGCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGCGATCGCNN
-+
-677777888888888)888888887777655544122210/....---,&,++**))*))))(('('"&$"#"$""
- at 30BB2AAXX080903:3:54:612:516#0
-GTAACAGCCATTCTCAACCAAACCCCCTGAGGCTTCACCGGCGCAGTCAGTCTCATAATCGCCCACGGTAGTCGGA
-+
-6-77578888888888(888888807776-454&32.0.00'/,*-,-,*,++***)*))))(((%%"""&$$$##
- at 30BB2AAXX080903:3:41:493:769#0
-CAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCATTCTCATAATCGCCCACGGACTCACATCCCC
-+
-67777788388888888828888877776555443222100/0--,-,,,+'++)'*(())((((&'&%%$#$""#
- at 30BB2AAXX080903:3:1:1404:845#0
-TAGTAATGAGGATGTAAGTCCGTGGGCGATTATGAGAATGACTGCGCCGGTGAAGCTTCAGGGGGTTTNTANACAT
-+
-67777788888888888888883877776555443221100./.,-,-,,+++**)))'())((('#'""#"%$#"
- at 30BB2AAXX080903:3:55:480:1425#0
-AATAGTAATGAGGATGTAAGTCCGTGGGCGATTATGAGAATGACTGCGCCGGTGAAGCTTCAGGGGGTTCGTAGTA
-+
-67777/888888888888888888-777'55544322210&/...---+-++****)*()((()'('$"##""##"
- at 30BB2AAXX080903:3:42:1284:817#0
-AAACCCCCTGAAGCTTCACCGGCGCAGTCATTCTCATAATCGCCCACGGACTTACATCCTCATTACTATTCTGCCT
-+
-67777788888888888888888877776555543221100//-.--,-,+++*+**))))((((('&&%&&%###
- at 30BB2AAXX080903:3:49:1486:1543#0
-CCCTGAAGCTTCACCGGCGCAGTCATTCTCATAATCGCCCACGGACTTACATCCTCATTACTATTCTGTCTCTCTG
-+
-67777788888888888888888877776555443.2,10010.-.,-,-++)+*)**))()(((('%"###""""
- at 30BB2AAXX080903:3:38:1054:990#0
-GAAGCTTCACCGGCGCAGTCATTCTCATAATCGCCCACGGACTTACATCCTCATTACTATTCTGCCTAGCCAACTC
-+
-67777788888888888888888877776555443222100///.-.,+-+++*+*)**()))((('$&&#&"$%%
- at 30BB2AAXX080903:3:34:1195:1306#0
-CACCGGCGCAGTCATTCTCATAATCGCCCACGGACTTACATCCTCATTACTATTCTGCCTAGCAAACNCACACTNN
-+
-6777778888888888888888887757655541/220&/1./..,+,++*++***)$)*(((((''"%$%#%#""
- at 30BB2AAXX080903:3:45:785:1387#0
-GTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTGGGCGATTATGAGAATGACAGCGCG
-+
-67777788888888888888888877776552443222100//.-----,+++***)*)))(((((''$$"$$###
- at 30BB2AAXX080903:3:50:236:688#0
-CGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTGGGCGATTATGAGAAGTCCCGCTG
-+
-67777788888888888888888877776555443222100//..-----+++**)))))))(((('$#%#$"#""
- at 30BB2AAXX080903:3:47:63:993#0
-CAGTCATTCTCATAATCGCCCACGGACTTACATCCTCATTACTATTCTGCCTAGCAAACTAGATCGGCCGCCCTCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))(((((&%#"$#$"##
- at 30BB2AAXX080903:3:2:230:1581#0
-TGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTGGGCGATCNCTCNNAA
-+
-6777778888888888888888887777635546302220/....---+,++*+**)*)()))('('""%%$""""
- at 30BB2AAXX080903:3:54:328:228#0
-TGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTGGGCGATTACGAGCAG
-+
-67777788888888888888888877776555443.22100/...----,+++**))))()))((''"#"%%%#""
- at 30BB2AAXX080903:3:56:739:1440#0
-GACTGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTAGATCGGTCTTCT
-+
-67777788888888888888888877776555443222100//..---,,+++****)*)(((((('&$%##""#"
- at 30BB2AAXX080903:3:34:331:129#0
-TGCGACTGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTGNTACACANN
-+
-67777788888888888888888877776545443222100././----,+++*+())*))())'&&"""%$##""
- at 30BB2AAXX080903:3:53:330:158#0
-GATGCGACTGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTATGGTGCG
-+
-67777788888888888888888677776555443221100./-,---,,,++***)*))()((((&"""#"""#"
- at 30BB2AAXX080903:3:45:933:1091#0
-ATGATGCGACTGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGAGGTCGG
-+
-67777788888888888888888877776555443222100//..---,,+++**))))))))('(&'$$%"""$$
- at 30BB2AAXX080903:3:57:756:377#0
-CCCACGGACTTACATCCTCATTACTATTCTGCCTAGCAAACTCAAACTACGAACGCACTCACAAGATCGNCAACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()''''$"#""##$
- at 30BB2AAXX080903:3:51:1719:36#0
-AGAGGATTATGATGCGACTGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGGNCAAAACCA
-+
-67777788888888888-888878+777+5554132221*0//..$-,,,(,+)*%))())'((('%"$%%$$$$$
- at 30BB2AAXX080903:3:59:1368:120#0
-ATCCTCATTACTATTCTGCCTAGCAAACTCAAACTACGAACGCACTCACAGTCGCATCATAATCCTCTCTACANNA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))()(('$$%#$#""#
- at 30BB2AAXX080903:3:52:63:581#0
-GTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCGACTGTGAGTGCGTTCGTAGTTTGCGCATGCTCG
-+
-62777788883888888888888877776555343222100//..--,,+++++*)**)(((((''#&&"%%%$#%
- at 30BB2AAXX080903:3:46:1457:1088#0
-AGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCGACTGTGAGTGAGTTCAGATCGGAGGTGTNGTG
-+
-67777788888888888888888877776555443222100//.----+,++++'*(()))((((('"""""""#"
- at 30BB2AAXX080903:3:56:562:1845#0
-AGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCGACTGTGAGTGCGTTCGTAGTTTGAGGTTCTAC
-+
-67777788888888888888888877776555443222100//...--,,+++***)))))(()('('&"$##"##
- at 30BB2AAXX080903:3:3:1139:105#0
-AAGCTATTAGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCGACTGTGAGTGCGTTTCNAGACNTN
-+
-67777788888888888888888877776565443222100//..-.--,*++)****))))'('(#$""###"""
- at 30BB2AAXX080903:3:49:348:929#0
-CAAACTACGAACGCACTCACAGTAGCATCATAATCCTCTCTCAAGGACTTCAAAAGAACGGAAGAGCGTGCCGCTG
-+
-67774788888888188882888%7715955544*(-1+0,.%,-.(()+$(***''##((&((#&%&$#"#"#""
- at 30BB2AAXX080903:3:48:1646:1293#0
-AACTACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCACTAATCCGTCTCT
-+
-6777778888888888888888887777655541322210/0/..---,,+++****))')))((''&##""#$#$
- at 30BB2AAXX080903:3:59:1452:702#0
-ACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCACTAATAGCCACACANCA
-+
-67777788888888888888888877776555443222100//./---,,,+++**)*)))(((((%$$%%%$"#$
- at 30BB2AAXX080903:3:1:1783:1278#0
-CTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCGANCANTAGT
-+
-6777778888888888888888887777655544522210/./..,--,,+++***))))))((''&$"#""""""
- at 30BB2AAXX080903:3:49:1354:407#0
-TGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCCTGCGANA
-+
-67777788888888888888888877776555443222100//..---,,++++*+)))))))((('"%"#$"#""
- at 30BB2AAXX080903:3:51:218:1778#0
-CTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGAGGNTACCTA
-+
-6777778888888888888888887777635546312210-//.,---+-+++***))))(&(((''"""#"##""
- at 30BB2AAXX080903:3:33:747:1400#0
-AGCGAGGCTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGGAGAGTTTGAAGTCCTTGAGAGAGGNACATTANN
-+
-67777788888888888858888877736552443202101/'...-+,,+)++*)(**)(()((('""$%##"""
- at 30BB2AAXX080903:3:60:353:1863#0
-ATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCACTAATAGCTTTTTGATGACTTCTAGCAGATCANGANN
-+
-67777788888888888888888877276555443222100//.----,,+++***)*)))(((((&'%%$""#""
- at 30BB2AAXX080903:3:43:19:1832#0
-GGTTAGCGAGGCTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGTTTGAAGTCCTTGAGATGCACACCC
-+
-67777788888888888888888877776355443222100//..---,,+,+***))))()(((''""#"$##"#
- at 30BB2AAXX080903:3:2:1733:831#0
-TAAGGCGAGGTTAGCGAGGCTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGTTTGAAGGCNATGACAC
-+
-677777888888888888880888177765$0441222100-.-.---',++**)))))'())(((#"""%%$$##
- at 30BB2AAXX080903:3:33:1212:25#0
-GTGGGGGGTAAGGCGAGGTTAGCGAGGCTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGNTCGTCANN
-+
-67777788388888888888888877776555443222000//..---,,,++***())))('('(&""$""$#""
- at 30BB2AAXX080903:3:54:1442:756#0
-AGTGGGGGGTAAGGCGAGGTTAGCGAGGCTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGAGCGGCCA
-+
-67777788888888888888888877776555443222110//..---,,+,+**+**))))('(''&&#&#"###
- at 30BB2AAXX080903:3:54:456:1969#0
-TAATAGTGGGGGGTAAGGAGAGGTTAGCGAGGCTGGCTAGAAACAATCAAAAAGCTACTAGGGGGAGGAGTGTGTG
-+
-677777.8888888888888/88847776355'432221/&-++*&-*,+*'**))'#)')%#((#(""$"$"#"#
- at 30BB2AAXX080903:3:3:159:219#0
-CTCCCAGTAGGTTAATAGTGGGGGGTAAGGCGAGGTTAGCGAGGCTTGCTAGAAGTCATCAAAAAGTCNCAACNCN
-+
-6777778888888888480888187071:5253430112-0-/,+--,$+)+'+*&#)(#(((((&#&"&$"#"#"
- at 30BB2AAXX080903:3:40:1765:1238#0
-TAATAGCTTTTTGATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTAACCTACAGGTGCGACT
-+
-67777788888888888888888877776)55443222200//.-,----,,+***)))()(('('%%"$"""##"
- at 30BB2AAXX080903:3:1:220:785#0
-AGCACAGAGAGTTATCCCAGTAGGTTAATAGTGGGGCGTAAGGCGAGGTTAGCGAGGGTTGGCGGCGANTCNCACA
-+
-$371.384828-8%--+)')&)03(.)+)%("1-/+%,$(&%+#,)*($$$'#'#'###########$""#"$"##
- at 30BB2AAXX080903:3:41:747:1782#0
-CTAGCACAGAGAGTTCTCCCAGTAGGTTAATAGTGGGGGGTAAGGCGAGGTTAGCGAGGCTTGCTAGAGGTCATCC
-+
-67777788888888888888888877776555443222100//...-,,,+++*)**))())('(''%"%"#"#"$
- at 30BB2AAXX080903:3:44:1652:35#0
-GATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTAACCTACTGGGAGAACTCTCTGCGTCCGG
-+
-67777788888888888888888877776555143222100./,-+,,+,+)++')')))((((('(&&"""$"""
- at 30BB2AAXX080903:3:8:1217:1635#0
-GACTTCTAGCAAGCCTCGCTAACCCAGACTTACCACCCACTAGTAACCTACTGGGAGAACTCTCTGCNCTACATNN
-+
-677777488882888&888*8888&'7&6)6244*2020/&'+.,,-,+*++++*))&)(')(('('""#"%$"""
- at 30BB2AAXX080903:3:50:547:240#0
-GGTTACTAGCACAGAGAGTTCTCCCAGTAGGTTAATAGTGGGGGGGAAGGCGAGGGTAGCGAGGCTTATGTCACAT
-+
-67777788888888888888888877776550443222000//..---,,+++**'&))))'((&&'""#"##$#"
- at 30BB2AAXX080903:3:36:86:1966#0
-GAGAACGTGGTTACTAGCACAGAGAGTTCTCCCAGTAGGTTAATAGTGGGGGGTAAGGCGAGGTTAGATACTAGNN
-+
-677777888888888888888888777765554130321/0//./-,-,,+++)***)))((('((&$"""##"""
- at 30BB2AAXX080903:3:36:1555:1366#0
-ATTTGATCAGGAGAACGTGGTTACTAGCACAGAGAGTTCTCCCAGTAGGTTAATAGTGGGGGGTAAGACAATACNN
-+
-67777788888888888888888877776555443222100./..,--,,+++***))**)((&(''%$"##"#""
- at 30BB2AAXX080903:3:53:812:2016#0
-ACCCCCCACTATTAACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAGATCGGACGAGCTTA
-+
-67777788888888888888888877776535443221110//.+.-,,,+++****))())((#('"$#""#""#
- at 30BB2AAXX080903:3:43:619:203#0
-ACCCACTATTAACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTACTT
-+
-67777788888888888888888877776555443222100//..-,,-,+++*****))))((((''&&&&%%$%
- at 30BB2AAXX080903:3:33:902:1486#0
-TATTAACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTANACCCTGNN
-+
-6777778888888888888888887777655544322210//+...-,,,,,++*+)*)*))()('(""#$$""""
- at 30BB2AAXX080903:3:56:354:1212#0
-ACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTACTTACAGGCCTCTA
-+
-67777788888888888888888877776555443222100//-.--,,,-+++****)*)))(((''&%"$$#"#
- at 30BB2AAXX080903:3:53:801:363#0
-AGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGGTTACTAGCACAGAGAGTTCTCCCA
-+
-67077788888888888888888877776555443222100//..---,,++++***))))))(('''$#%&%$##
- at 30BB2AAXX080903:3:43:350:266#0
-TGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGGTTACTAGCACAGAGAGG
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))()((''&%&%%%%#"
- at 30BB2AAXX080903:3:56:1089:1123#0
-GCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGGTTACTAGCGCATCAG
-+
-6727778.8888888888888888787165554&3022100/../---'--+****()%))')(&''&%"##"#""
- at 30BB2AAXX080903:3:57:349:761#0
-GCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGGTTAGATCGGAAACTA
-+
-67777788888888888888888877776555443222100//..-.-,,+++*+*)))))(()'(''&&#"###"
- at 30BB2AAXX080903:3:44:1591:255#0
-TGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTACTTACAGGACTCAACATACTAGTCACAGCCCTC
-+
-67777788888888888888888877776555443222100//..-.-,,+,+**+)))))()((('&&"%#%$""
- at 30BB2AAXX080903:3:36:480:565#0
-TAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGGTTCTTCGCACN
-+
-67777788888888888888888877776555443220100///.----,,++++*))))(((('''$"#$$%"#"
- at 30BB2AAXX080903:3:39:226:1400#0
-CTAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTACTTACAGGACTCAACATACTAGTCACAGNCCTATACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&"&#&%##$#
- at 30BB2AAXX080903:3:45:1561:1406#0
-AGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGAGATTCGC
-+
-677777888888888888888888777765054(322,1000/..---,,+++*+*)*)))((((''%#$#"""""
- at 30BB2AAXX080903:3:59:437:1417#0
-TAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTACTTACAGGACTCAACATACTAGTCACAGCCCTCAACNC
-+
-67777788888888888888888877776555443222100/...-,+,,,+++***)*))()(((%'$&$"##"#
- at 30BB2AAXX080903:3:3:168:1152#0
-AGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAANCGCANCA
-+
-67777788888888888888888877776555443222100/....--,,++++**)))*)(((('(""#"##""#
- at 30BB2AAXX080903:3:47:459:1772#0
-TAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGCTGGCGAGG
-+
-677.77888828888888888)877717654540322210-*...*--,,++'*(*(()))((('''""""##"""
- at 30BB2AAXX080903:3:53:238:1269#0
-ATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGTCGACAT
-+
-67777788888888888888888877736555443222/0///...-,,,+)++**))()))((((%"$""""##"
- at 30BB2AAXX080903:3:50:1375:1575#0
-TAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTCGCTCAGAC
-+
-67777788888888888888888877776555443222100//.-----,++++**))))((()(('$"$"#""""
- at 30BB2AAXX080903:3:37:474:1232#0
-TGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGTCACTN
-+
-67777788888888888888888377776555443220100//..---,,+++*****)))((('(#"$%"###""
- at 30BB2AAXX080903:3:55:748:664#0
-ATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGANGGTGCT
-+
-67777788888888888888888877776555443222100//.----,,++++**)))))))((('&""""""#"
- at 30BB2AAXX080903:3:39:939:1279#0
-CTACTTACAGGACTCAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATCGTGCATCG
-+
-677777888888888888888888777765554432220000/./--,,,++++*)***))))((''"#""$""#"
- at 30BB2AAXX080903:3:52:153:1296#0
-GAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCATGTACGA
-+
-6777778888888888888888887177655544322200.//..---,,+++)*))(())(((''%$""&"%""#
- at 30BB2AAXX080903:3:59:234:456#0
-GAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGAANNC
-+
-6777778888888888888888887777655544322200///..---,,-++**)))))))((('('%&"##"""
- at 30BB2AAXX080903:3:53:1222:1551#0
-GTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGGGACTAGTATGTTGAGTCCTGCAG
-+
-67777788888888888888888877776555443222100//..---,,++%**))*)))(((''#""$#%$#$$
- at 30BB2AAXX080903:3:38:510:962#0
-GGTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTAGACGAGGAC
-+
-67777788888888888888888877776555443.22100//..---,,*,+**))*)))()(((("'##%$$%$
- at 30BB2AAXX080903:3:33:1222:1852#0
-TCAACATACTAGTCACAGCACTATACTCCCTCTACATATTTATCACACCACAATGGGGCGCACTCACNCCCACTNN
-+
-6777478888888888881)888877776555442222100/)/-.-+,,,++*)+**)(''(((('"%%##%"""
- at 30BB2AAXX080903:3:33:308:1592#0
-CAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCAAGNCTCAACNN
-+
-67777788888888888888818877776555143212100.//-.--,,,,+**))**)()(((&'"$#$"#$""
- at 30BB2AAXX080903:3:36:803:2042#0
-CAACATACTAGTCACAGACGTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCGTCACGANN
-+
-67777788888888888,&*888''7//6.554/222200.+,/,.-,,,,*)***'#(%(#'(''&""$#$"#""
- at 30BB2AAXX080903:3:41:1699:869#0
-AACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACTTACTTA
-+
-677777888888888888088888777765554432221000/..---,,+++****)*)))(((('&$""%%$$#
- at 30BB2AAXX080903:3:57:1492:735#0
-TAATGTGGTGGGTGAGGGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGGTGTGACACATTACTG
-+
-67777488888888888888888877774544443212000//.,---,,+)+*)*'*))')('((#$$#$"$#""
- at 30BB2AAXX080903:3:39:791:1811#0
-TTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTTGCTGCC
-+
-67777788888888888888888877776555443222000/...---+,+++***)*)))'(('(&%$"&"%"##
- at 30BB2AAXX080903:3:60:1231:838#0
-TTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACCGCTACNN
-+
-67777788838888888888888877776555443222100//..---,,++**+*)))))((('''""##"##""
- at 30BB2AAXX080903:3:33:829:34#0
-ATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCNACTCGCNN
-+
-67777788888888888888888877776555443222100...---,+,*++*****))))(((('""#""""""
- at 30BB2AAXX080903:3:3:1202:1782#0
-ATACTAGTCACAGCCCTATACTCCCTCTACAAATTTACCACAACACAATGGGGCTCACTCACCCACCANCTTNNCA
-+
-67777788888888888888888877776550343222.00//..--,,,,+++****)))((((('&"%&%""#%
- at 30BB2AAXX080903:3:4:1311:1186#0
-TGTTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTANCTCANTN
-+
-67777788888888888888888877776552443222101/-.---++,*,+***#))'))(##(#$"$%##"""
- at 30BB2AAXX080903:3:39:327:706#0
-CTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACAGTAACCACA
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))))((('$$&#$$###
- at 30BB2AAXX080903:3:36:833:1796#0
-TAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATCAACTCANN
-+
-67777788888888808888+888767765/54$32220.0//.,---,-+*+**))()))()((''&$&&$%#""
- at 30BB2AAXX080903:3:8:1122:365#0
-TCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAANACCACANN
-+
-677777888888888888888888777765554432221/0//..-.-+-+++*****)(*)()(('"#$#$%$""
- at 30BB2AAXX080903:3:60:1423:1485#0
-GTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTAACCAACCNN
-+
-677777888888888888888888777765553333,2100//..,---,+*+****)*')()'(&%$%%&%$%""
- at 30BB2AAXX080903:3:1:1551:1891#0
-CAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCAGATCGGAAGANCTNCTNC
-+
-6777778888888888888888887777655544321.//....--+,+,++++**)))'(((''''&"%$"##""
- at 30BB2AAXX080903:3:45:359:1834#0
-CAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATCAACCC
-+
-67777788888888888888888877776555443222100//..---,,++++****))))((((''%&"&$#$$
- at 30BB2AAXX080903:3:42:1717:1361#0
-GTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGGAAATATGTAAGGTGGGG
-+
-677777888888888888888888777765554432-2001/..-.+,-,++++*%))#&(('((('&%&#%"#""
- at 30BB2AAXX080903:3:46:1735:575#0
-CTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAGATCGGTAGAGTGGT
-+
-67717788888888888888888877776/554/11211001....---,++++**)*)()))((('$$%"""#""
- at 30BB2AAXX080903:3:38:782:728#0
-CGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAAATAGCTAGATCA
-+
-6777778888888888888888887777655544322*100//..---,,,+++***))))(()(('""$#"""##
- at 30BB2AAXX080903:3:51:817:250#0
-CCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCAATCACACGA
-+
-67777788888888888888888877776555443222100//.--,-,,,+++*+)*))))()(('""$#%#$$"
- at 30BB2AAXX080903:3:59:808:886#0
-TTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAACTCACAGA
-+
-67777788888888888888888877776555443222100./-..--,,+,+***)*)))))('(''"%"&$""#
- at 30BB2AAXX080903:3:42:184:622#0
-CATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAACA
-+
-67777788888888888888888877776555443222100//..---,,+++****))))(((('&'$%&#"%##
- at 30BB2AAXX080903:3:48:1490:1015#0
-ATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGCTAGCACT
-+
-67777788888888888888888877776555443222100//..----,+++*+*))*)))(((''&$"""####
- at 30BB2AAXX080903:3:45:831:918#0
-TACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAAGACACGAG
-+
-6777778888888888888888887777655546322210///..--,,,+,++****))*()((('$""#"""""
- at 30BB2AAXX080903:3:42:1771:292#0
-ACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAGATCGGCAGANCGC
-+
-6777778888888888888888887777655544322210///..---,,++****)))))((((('$$%&#""##
- at 30BB2AAXX080903:3:3:858:138#0
-AACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCCCTCNCTCTNCN
-+
-6777778888888888.838888867776556343222100//..,---,+++**&*')((((####%"%"$#"#"
- at 30BB2AAXX080903:3:47:631:253#0
-GAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCAGATCANAACG
-+
-67777788888888888888888877776555443222100//..---,-+++***))))(((((('$%$""""$#
- at 30BB2AAXX080903:3:42:423:1325#0
-TGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTAGATCCGAGGACAC
-+
-67777788888888888888888877776545443222200//..---,,++++**)()()(((('#"$"""""#"
- at 30BB2AAXX080903:3:33:1774:178#0
-CAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAAACACCCTCANGCACATNN
-+
-67777788888888888888888877776555443222100//...--,,++++*))())))(((''""%$%##""
- at 30BB2AAXX080903:3:57:750:514#0
-ATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAAACACCCTCATGTTCCTACAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))))(((&&'%$$##$%
- at 30BB2AAXX080903:3:48:660:1679#0
-TGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAAACACCCTCATGTATCCACACC
-+
-677777888888888888888888777765554432-020///..----,+++***))(((((((''"#"#%$"$"
- at 30BB2AAXX080903:3:57:786:385#0
-AGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGAGATCGGNACCCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))(()(((('&"#####"
- at 30BB2AAXX080903:3:4:1110:1612#0
-GGATAGGTGCATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGTNCATANCN
-+
-67777788888888888888888,77776555443222/101/.-+*,,+,++++)*))))()(#''$"#"##"#"
- at 30BB2AAXX080903:3:43:1689:1994#0
-GGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTCTCAT
-+
-67777788888888888888888872776552443321100//-.--,-,+++******('))((('&%###"##"
- at 30BB2AAXX080903:3:38:838:1674#0
-ATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAAGATCGGACTNAC
-+
-6777778888888888888888887777+545442222100//..---,,,+++**)*)))((((('$"%&&$"##
- at 30BB2AAXX080903:3:50:1683:1312#0
-ATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGTCGCTGCC
-+
-67777788888888888888888877776555443202100/...---,,)++***)))))((((''&"#"##"##
- at 30BB2AAXX080903:3:40:570:1949#0
-ACAACATAAAACCCTCATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCC
-+
-67777788888888888888888877776555443222100//..--,,,,++**)*)**)()(((&%%&%&$##"
- at 30BB2AAXX080903:3:53:337:1886#0
-ACAACATAAAACCCTCATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCGCTCTAC
-+
-67777788888888888888888877776555443222100//..---,,,++*****))))((((''$"%#%""#
- at 30BB2AAXX080903:3:36:893:750#0
-TGAGGGATAGGAGGAGAATGGGGGATAGGTGTACGAACATGAGGGTGTTTTCTCGTGAGATCGGAATCTGCTAACN
-+
-+77777888888888888888888277765554,3122100//..'-,,,,*+**)))))())((&#%%"""#"""
- at 30BB2AAXX080903:3:40:1329:250#0
-TGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTT
-+
-67777788888888888888888877776355443222100//...-,,,+++***)))))((('(&&%&&&&&##
- at 30BB2AAXX080903:3:4:1367:448#0
-TGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTTAGATCGGAAGAGCGGTTCGNCACANTN
-+
-67777788888888888/8888883777635544352.000///.+-,,,+++)**)))))#((#%&""##%#"""
- at 30BB2AAXX080903:3:39:1091:189#0
-TTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGTTTTTATAA
-+
-67777788888888888888888877776505443222100/0..-,-,-,++***()()(())(((""$&#%"""
- at 30BB2AAXX080903:3:59:1374:1579#0
-GGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATCACCACNAC
-+
-67777788888888888888888877776555443222100//..---,,&++***))*))()((('"%"%$$"##
- at 30BB2AAXX080903:3:57:1373:1568#0
-ATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTAGATGGGAAGAGACTACA
-+
-+723178883888888+8218&88/7(0665345-21/.-0..--++#),+'*+*&(&#&#'#''##'"$$$$##"
- at 30BB2AAXX080903:3:37:1315:668#0
-TCATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAGATCGCTCCTCN
-+
-677777888888888888888888777765554432221/0//..--,,-++++*)*()*)()'('%$"""$#"$"
- at 30BB2AAXX080903:3:2:1048:1326#0
-CATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCNCCCAGCT
-+
-677777888888888888888888377765554432221000/.-.+,,-,++***)*)())((('''""$##"#"
- at 30BB2AAXX080903:3:37:1198:887#0
-CATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCAGCNCTNGN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((("$$"%%"""
- at 30BB2AAXX080903:3:56:326:737#0
-ATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGAGCCCGAC
-+
-67777788888888888888888877746555443222100//-----,,++*****))*)()(((''$""$$"$#
- at 30BB2AAXX080903:3:43:606:985#0
-AATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGGGG
-+
-6777778888888888888888887777655544322220///...-,,,-++**))))&)%()(#'$%"&#$"""
- at 30BB2AAXX080903:3:40:660:615#0
-GAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATAGACGCCTCCCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)**))((((''''$"%""##
- at 30BB2AAXX080903:3:33:673:1967#0
-AACCCGGTAATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAGATGGGAAGNATCTACNN
-+
-6772478-8888888888888888-77765/54,32(2+-0//...+(,,,'+$*))()&'#('%#'""##"$$""
- at 30BB2AAXX080903:3:2:394:930#0
-GAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCATTATNTCGNGAT
-+
-67777788888888888888888877776555443222100//..--,-,,,+****))))()((('"""&&"#"#
- at 30BB2AAXX080903:3:41:310:1955#0
-GAAAACCCGGTAATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAGATCGGTAGAGCAGT
-+
-677777888888288888868888777165514432/2100./..---,+,++*)*))))()()&(("&%###""#
- at 30BB2AAXX080903:3:44:953:144#0
-AACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCAAGATCGGTAGCGCCC
-+
-67777788888888888888888877776555443222100//..-.-,,+++**)))*)(()(('''""#$"#"#
- at 30BB2AAXX080903:3:1:278:1520#0
-GAGGAAAACCCGGCAATGATGTCGGGGTTGAGGGATAGGCGGAGAATGGGGGATAGGTGTATGACCCTNCANATCG
-+
-6777778888888218885-8788777165,544(,,20#0/,--,&---+,)*&+)&*('(((###"""%"$"#"
- at 30BB2AAXX080903:3:59:59:1733#0
-GAGGAAAACCCGGTAATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGGTAGNNC
-+
-67777788888888888888888877776555443222100/..-,--,,+++++*))))))(((''&$%"""""$
- at 30BB2AAXX080903:3:1:1325:630#0
-AGAGGAAAACCCGGTAATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGGGTATGAGACNGCNTGTA
-+
-67777788888888883886888877770551443/1010.//-.--,,,+,+**)*(#)'''('('$""""#"""
- at 30BB2AAXX080903:3:49:1641:854#0
-CTATATTTACAAGAGGAAAACCCGGTAATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTCATACC
-+
-67777748808888888888.888777765554232221-0//..--,,,+++*+***)))((('''%#"$#"###
- at 30BB2AAXX080903:3:37:1505:44#0
-CTATCCCTCAACCCCGACATCATTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAACATCAGTGTNCTANN
-+
-67777788888888888888888877776502843212200.,.--,++-+,+*****)())('((#"$&"$#"""
- at 30BB2AAXX080903:3:57:1111:991#0
-AGCCTCTGTTGTCAGATTCACAATCTGATGTTTTGGTTAAACTATATTTACAAGAGGAAAACCCGGTACTACATAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))())''(&#""##"##
- at 30BB2AAXX080903:3:2:1471:124#0
-TATAGTTTAACCAAAACATCAGATTGTGAATCTGACAACAGAGGCTTACGACCCCTTATTTACCGAGANATACTCC
-+
-6777778888888888888/888877476550443322200/..,--,,,+))*'))))*((('(('%"""#%"##
- at 30BB2AAXX080903:3:50:237:649#0
-AAACATCAGATTGTGAATCTGACAACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCAGATCGGCCGCGCAC
-+
-67777788888888888888888877776555443222110//..---,-+++*+)*)))(((((('"##"""###
- at 30BB2AAXX080903:3:2:452:1277#0
-AACATCAGATTGTGAATCTGACAACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACNTCCACAC
-+
-677777888888888888888888777765554432320010..-.---,+++**))))))))(('''""##%$#%
- at 30BB2AAXX080903:3:2:453:1275#0
-AACATCAGATTGTGACTCTGACAACAGAGGCTTACGACACCTTATTTACCGAGAAAGCTCACACGAACNGCCACAC
-+
-67777788888888888)88588%$'7265$(4$"21,$0/%/,%--&,,+)****)*()((((((&&""$$%$$$
- at 30BB2AAXX080903:3:41:570:1324#0
-ATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATAAGGGGTCGTAAGCCTCTGTTGTCATAGTACC
-+
-677777888888888888888888774765554432221*/....,--,,*++***)(()())(((''&##"%"#"
- at 30BB2AAXX080903:3:49:82:451#0
-CATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATAAGGGGTCGTAAGCCTCTAGATACGTAGACG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$$#""$"#"
- at 30BB2AAXX080903:3:41:1708:798#0
-AGACATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATAAGGGGTCGTAAGCCTCTGTGCNGNCAT
-+
-67777788888888888888888877776555443222100//...---,+++*)))*)()(((((&'%$"$"##$
- at 30BB2AAXX080903:3:46:1650:1344#0
-AGACATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATAAGGGGTCGTAAGCCTCTGNTGGNGTCG
-+
-67777788888888888888888877776555443222000//+..--,,,++*&))))))(((%''"%%""""#"
- at 30BB2AAXX080903:3:59:195:1028#0
-GTTAGACATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATACGGGGTCGTAAGCCTCTNTTANNC
-+
-67777788888888888808888876776545443222100//..-+,+,,,%***)'))(('(''''$""&#""#
- at 30BB2AAXX080903:3:49:184:1766#0
-GACAACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCCCCAGGACATAAC
-+
-67777788888888888818,38877776445443222/00//.----,,++++*)*)**))&('''"$"#"""##
- at 30BB2AAXX080903:3:58:701:1013#0
-CATGTTGTTAGACATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATAAGGGGTCGTATGTCTACT
-+
-677777888888+88888888888777765554432221000/-.--,,,++*******)))((%(''"%"$"###
- at 30BB2AAXX080903:3:50:1244:1771#0
-AGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCCCCATGTCTAACNTACACG
-+
-67777788888888888888888877776555443222100//...-,,-+++**)*)**))(((('"$""$##""
- at 30BB2AAXX080903:3:60:1576:1366#0
-AGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCCCCATGTCTCAACATCANN
-+
-67777788888888888888888877776555443222100//..---,,+++*****))*((((''&$$%"%%""
- at 30BB2AAXX080903:3:8:747:1374#0
-ACGACCCCTTATTTACCGAGAAAGCACACAAGAACTGCTAACTCATGCCCCCATGTCTAACAACATGNCAGACCNN
-+
-6777778888888,888888,8887'7746554432221/0./.---,+,,*++*')**)))(((''"$""$##""
- at 30BB2AAXX080903:3:50:918:222#0
-AGTTGAGAAAGCCATGTTGTTAGACATGGGGGCATGAGTTAGCAGTTCTAGTGAGCTTAGATCGGAAGACCCCGCN
-+
-67777788888888888888888877776555452222000/...'--,*++++*(**)))))((''$$#"$#"#"
- at 30BB2AAXX080903:3:34:161:1201#0
-TGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGGCATGAGTTAGCAGTTCTTGTGNCGAGCTNN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((''&"$"#"$#""
- at 30BB2AAXX080903:3:39:844:901#0
-AGCTCACAAGAACTGCTAACTCATGCCCCCATGTCTAACAACATGGCTTTCTCAAAGATCGGAAGAGCGGCTCTCA
-+
-67777788888888888888888877776555443232100//..---,,,++**+))))))((('('""""""#"
- at 30BB2AAXX080903:3:40:503:373#0
-TGGATAGCTGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGGCATGAGTTAGCAGTTCTTGTCA
-+
-67777788888888888888888877776555443222000//..---,,,++***))))())((('"$&&$%$##
- at 30BB2AAXX080903:3:54:1196:1685#0
-ATGGATAGCTGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGATATCGGAAGAGTGTGCCACCA
-+
-67777788888888888888888877776555443202100//..--,-,+++**(*)())')(((#&###"$##%
- at 30BB2AAXX080903:3:41:982:1276#0
-CCAATGGATAGCCGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGGCATGAGTTAGCGTGTCTT
-+
-67777784888388888888888877776555443222010/,....-,,,++*****))()()('''&$$"%"$#
- at 30BB2AAXX080903:3:49:445:302#0
-GACCAATGGATAGCTGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGGCATGAGTCACCCACCA
-+
-67777788888888888888888877776555443222100//.'.-+,+++++**))))(((('''&&##$##""
- at 30BB2AAXX080903:3:38:834:905#0
-GCTAACTCATGCCCCCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATACATTCTCGA
-+
-67777788888888888888888877776555443222121....--,,,+++**)))*)))(((('""%""#"""
- at 30BB2AAXX080903:3:46:491:111#0
-GGGCCTAAGACCAATGGATAGCTGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGGTGTCCCGG
-+
-677777888888888888888888777765554432221/0//..---,++++**(*)*)(()((('&""""""##
- at 30BB2AAXX080903:3:40:1201:108#0
-ACTCATGCCCCCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATTGGTCTAGATCGCT
-+
-67777788888888888888888877776)553411200/0//-/,----++***(*(((''(&&''&""$%%""#
- at 30BB2AAXX080903:3:36:1218:1219#0
-TTTTGGGGCCTAAGACCAATGGATAGCTGTTATCCTTTAAAAGTTGAGAAAGCCATGAGATCGGAAGCGGCTATTN
-+
-67777788888888888888888877776555443222100//..---,,++++**))))))(((('$$#"#$#$"
- at 30BB2AAXX080903:3:55:1072:436#0
-TATTTGGAGTTGCACCAAAATTTTTGGGGCCTAAGACCAATGGATAGCTGTTATCCTTTAAAAGTTGAGGTACGCC
-+
-67777788888888888888888877776555443222100//-.---,,,++**))*)')((((('&$""##"##
- at 30BB2AAXX080903:3:59:507:435#0
-AAAGGATAACAGCTATCCATTGGTCTTAGGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAANCTTANC
-+
-67777788888888888888888877776555443222100//...--,,+++****)*))(((''''&"&""""#
- at 30BB2AAXX080903:3:54:1589:1065#0
-GTGTGCATGGTTATTACTTTTATTTGGAGTTGCACCAAAATTTTTGGGGCCTAAGACCAATGGATAACACATAAAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&$$&%"#"""
- at 30BB2AAXX080903:3:50:1451:838#0
-TAACAGCTATCCATTGGTCTTAGGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCTCACTGC
-+
-67777788888888888.888888777765554432221-0//..---,,+++**+)**))((((''%""####"#
- at 30BB2AAXX080903:3:43:893:49#0
-TAGTAGTGTGCATGGTTATTACTTTTATTTGGAGTTGCACCAAAATTTTTGGGGCCTAAGACCAATGGATAGCTGT
-+
-67777788888888888888888877776555443222100//..--,,-+++***))*))()((((&%%"$"#$%
- at 30BB2AAXX080903:3:43:912:716#0
-GGTGGTTATAGTAGTGTGCATGGTTATTACTTTTATTTGGAGTTGCACCAAAATTTTTGGGGCCTAAGACCAATGG
-+
-67777788888888888888888&77)76555443222100/&..---,,+++***)*)))((('''$&$&&%%$%
- at 30BB2AAXX080903:3:57:345:1863#0
-AGTCAGGGTTAGGGTGGTTATAGTAGTGTGCATGGTTATTACTTTTATTTGGAGTTGCACCAAAATTTTTTGTCTC
-+
-6777778888888888888888887777655544322210///..---,,+++***)*))()()(('&$%"$##"#
- at 30BB2AAXX080903:3:41:1343:639#0
-AAGTCAGGGTTAGGGTGGTTATAGTAGTGTGCATGGTTATTACTTTTATTTGGAGTTGCACCAAAATTTTTGTTTA
-+
-677777888888888888888888777560554432,2100/..,--,,,++++*)**(()()((''&'%%#""""
- at 30BB2AAXX080903:3:59:972:1782#0
-CAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCACACTACTATAACCACCAGATCGGAAGACTTCAT
-+
-6777778888888888888888887777655244322-100././----,,+++*)*))*)))'(('%"&%""#$"
- at 30BB2AAXX080903:3:53:1343:486#0
-TGGTAAGGATGGGGGGAATTAGGGAAGTCAGGGTTAGGGTGGTTATAGTAGTGTGAGATCGGAAGAGCGGTTGTCG
-+
-677777888888888888888888777765554432221/0//..---,-+++***)*)))()('(&"$%""""#"
- at 30BB2AAXX080903:3:44:410:1284#0
-AATAAAAGTAATAACCATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTAAGATC
-+
-67777788888888888888888877776555443222100/...---,,+++**))))))))('('$'&$&%$$$
- at 30BB2AAXX080903:3:36:1505:1842#0
-CGAGGGTGGTAAGGATGGGGGGAATTAGGGAAGTCAGGGTTAGGGTGGTTATAGTAGTGTAGATCGGATCATGTNN
-+
-677777888888888888888888777765554432221200/..---,,,++***)()()))('(#$$%###"""
- at 30BB2AAXX080903:3:56:386:791#0
-AATAACCATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCNTCAGAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))((((('&"$"&$#"$#
- at 30BB2AAXX080903:3:58:1573:687#0
-AATAACCATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACACACAATACN
-+
-67777788888888888888888877776555443222100/...----,,++****))))(((((&$$$##"##"
- at 30BB2AAXX080903:3:45:1097:1675#0
-TAACCATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTCACCCC
-+
-67777*8888888$88888888887-776521,4121/1$0/.//,.+++,*+*)))(()(%(#'''&&##"$"#"
- at 30BB2AAXX080903:3:3:573:950#0
-CATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTTCNCCCANCA
-+
-677777888888888882288838777844553432(.0/.//--$-++,+*')*)()))&'(('''""""#""##
- at 30BB2AAXX080903:3:54:441:1322#0
-TTTGTTAGGGTTAACGAGGGTGGTAAGGATGGGGGGAATTAGGGAAGTCAGGGTTAGGGTGGGTATATCAGGCTCT
-+
-677777888888888888888888777765554432/1100//..---,-+++)*))))')(%((''"$##$#%""
- at 30BB2AAXX080903:3:57:856:1914#0
-AATGGGGGTATGAGTTTTTTTTGTTAGGGTTAACGAGGGTGGTAAGGATGGGGGGAATTAGGGAAGTCAGTGGCGC
-+
-67777788888888888888888877776555443322100/0..---,,+++**(*))))))((''&&&$%"###
- at 30BB2AAXX080903:3:35:207:658#0
-TGCGACAATGGATTTTACATAATGGGGGTATGAGTTTTTTTTGTTAGGGTTAACGAGGGTGGTAAGGNCACCAAAN
-+
-67777788888888888888888877774555443222100//..---,+++++*))))))()(('&"$##$""""
- at 30BB2AAXX080903:3:3:115:38#0
-TGAGACAATGGATTTTACATAATGGGGGTATGAGTTTTTTTTGTTAGGGTTAACGAGGGTGGTAAGGANAGACNGN
-+
-6..77-888888888188588686771;)4304422/200./..-.,++++++$*)()&%()'((''""%"##"""
- at 30BB2AAXX080903:3:41:626:1894#0
-TCCTTACCACCCTCGTTAACCCTAACAAAAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTT
-+
-67777788888888888888888877776555440222100/....---,+,+*+*)))))((((('&$%&"##"#
- at 30BB2AAXX080903:3:53:533:390#0
-TAAAGGTGGATGCGACAATGGATTTTACATAATGGGGGTATGAGTTTTTTTTGTTAGGGTTAACGAGGTCGGTTGT
-+
-67777788888888888888888877776565443222&00/..----,,+++***)))#)))%(('%#$"#""""
- at 30BB2AAXX080903:3:47:456:1708#0
-AGAGACTGATAATAAAGGTGGATGCGACAATGGATTTTACATAATGGGGGGATGAGTTTTTTTTGTTNTATATCAT
-+
-(710'-85)8+-8$2,8848833+''%-)+514&(,)-.%&',(,,"'+,$((*#)&'((#(&''%%""$"#""""
- at 30BB2AAXX080903:3:57:130:1479#0
-ACCCTAACAAAAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCTCTCCAC
-+
-67777788888888888888888877776555443222110//..---,-+++***)))))))((('&%&%%####
- at 30BB2AAXX080903:3:35:1380:1969#0
-GTTGTGGGGAAGAGACTGATAATAAAGGTGGATGCGACAATGGATTTTACATAATGAGATCGGAAGANCANAACTN
-+
-67777788888888888888888877776555442222100//..---,-+,++**))))(((((('"&#"%%##"
- at 30BB2AAXX080903:3:56:767:1423#0
-AAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCTCTTCCCCACACCATCAC
-+
-67777788888888888888888877776555443222100//./---,,+,+****)))))((''''"##$##""
- at 30BB2AAXX080903:3:38:1111:615#0
-CCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGTCTTGT
-+
-677777888188888888888-8877776555443222100//------,+++****)*)))((('&"%&#%#$$#
- at 30BB2AAXX080903:3:42:1284:673#0
-TTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTGGATCTT
-+
-67777788888888888888888877776555443222100//..---,-++++*****)))((((''&"####$"
- at 30BB2AAXX080903:3:2:1763:678#0
-CCATTGTCGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACAGATCGNATCACAT
-+
-67777788888888888888888877776555443322100//..---,-+,++*)**)))(((((&&"#"%%#""
- at 30BB2AAXX080903:3:36:1034:1688#0
-ATTGTCGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGCAACTGCAN
-+
-67777788888888888888888877776555443222100//..---,,+++++*)))))))((('%##$#"$#"
- at 30BB2AAXX080903:3:56:1118:184#0
-CGAGATAATAACTTCTTGGTCTAGGCACATGAATATTGTTGTGGGGAAGAGACTGATAATAAAGGTGGAGNGNCAC
-+
-67777788888888888888888877776555443222100//..-.-,,+++***))*))((((%'$"""%"$#"
- at 30BB2AAXX080903:3:42:1265:207#0
-GTCGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCGATA
-+
-677777888888888888888888777765554432121000/..----,+++***)*)))()('(''$$$$"#"$
- at 30BB2AAXX080903:3:48:1064:359#0
-CGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATGTCGCAC
-+
-67777788888888888888888877776555443222100//..-&-,,+,+***))))))(('('%"#$%%"##
- at 30BB2AAXX080903:3:39:1086:869#0
-CCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACCCAC
-+
-67777788888888888888888877776555443222100//..--,+,+++***)*)))))(('''&%%$$"""
- at 30BB2AAXX080903:3:58:396:950#0
-TCAGTGTCAGTTCGAGATAATAACTTCTTGGGCTAGGCACATGAATATTGTGGTGAGAACGGTAGAGCGGCGTCCA
-+
-64777788888888888888888%7775655$4432221.&0/.,-(-,,+&+$*#*()))(&((('&'"%""###
- at 30BB2AAXX080903:3:59:792:622#0
-GGCTCAGTGTCAGTTCGAGATAATAACTTCTTGGTCTAGGCACATGAATATTGTTGTGGGGAAGAGACTCTNACTC
-+
-67777788848888888888888877776555443222100//..---,,+++***)))))))(('(&&$""#""$
- at 30BB2AAXX080903:3:34:268:463#0
-GTGGCTCAGTGTCAGTTCGAGATAATAACTTCTTGGTCTAGGCACATGAATATTGTTGTGGGGAAGANCCTACTNN
-+
-67777788888888888888888877776555443222100//...--,,+++***))*))((((('"$#""%#""
- at 30BB2AAXX080903:3:44:1220:131#0
-TATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGCTATTATCTCGAACTAGATCGGCGGCGCA
-+
-67777788388888888888888877776555443522100//..--#,,,**+*)*)()(((((''&'""###""
- at 30BB2AAXX080903:3:42:340:1799#0
-TTGTGGCTCAGTGTCCGTTCGAGGTAATAACTTCTTTGTCTAGGGACAAGAATAGATCGGAAGGGCGGTGCGTGCG
-+
-677277888888881#8&8/888*774-65/54/32(20//'/.,+"&',)+**))'$)(#%(%'#'$%&#%$$$#
- at 30BB2AAXX080903:3:33:244:2025#0
-AGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTGAGNCCCACGNN
-+
-6717778888888888888888887777655544321100////.---,,+,+**)))))()(((''"%$#%#"""
- at 30BB2AAXX080903:3:4:520:517#0
-CCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTGAGCCACAACCCCNCCACNCN
-+
-67777788888888888888888877776555443222100//..---,,,+++***)))((((((&$"$"$$"""
- at 30BB2AAXX080903:3:43:940:1061#0
-CACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTGAGCCACAACCCAAACCACGCCG
-+
-67777788888888888888888877776555443222100//..---,-+++****)*)*(((((''$##&"$$$
- at 30BB2AAXX080903:3:33:1680:830#0
-ACAACAATATTCAGGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTGAGCCACAACCCAAANACTCACNN
-+
-6777778888888,888888888877776555443222100//..---,,+++****)))))(('(&"$&"###""
- at 30BB2AAXX080903:3:8:1390:1666#0
-TATTCATGTGCCTAGACCAAGAAGTTATGATCTCGAACTGACACTGAGCCACAACCCAAACAACCCANCACTATNN
-+
-6777778888888888888888887777'555443322100/...----,,++++***()))((((("$"%"""""
- at 30BB2AAXX080903:3:47:1198:1436#0
-TTAGGGAGAGCTGGGTTGTTTGGGTTGTGGCTCAGTGTCAGTTCGAGATAATAACTTCTTGGTCTAGGCGTGGTAT
-+
-67777788888888888888888877776555443222100/.-..-,+,+++***))))))(((''"$"""""$"
- at 30BB2AAXX080903:3:35:1356:1919#0
-AGACCAAGAAGTTATTATCTCGAACTGACACTGAGCCACAACCCAAACAACCCAGCTCTCCCTAAGCNCACCTCCN
-+
-6777-788888888888888888877776555443222100./.,---,,+++***))))(()(((("""$#"$#"
- at 30BB2AAXX080903:3:59:1381:1438#0
-TAGTTTGAAGCTTAGGGAGAGCTGGGTTGTTTGGGTTGTGGCTGGGTGTCAGCTTGGGATTATTGCGTCAACANCC
-+
-67727788888888888888888873$76$55443222//0*,&'-*,++++%***#()(#(&(%#&&%%$$#"##
- at 30BB2AAXX080903:3:39:1137:1634#0
-GAGAAGTAGTCTAGTTTGAAGCTTAGGGAGAGCTGGGTTGTTTGGGTTGTGGCTAGATCGGAAGAGGTGTCTGGCA
-+
-67777788888888888888888877776555443222100//..---,,+++****(())%(((''%&%%%$$#"
- at 30BB2AAXX080903:3:46:1252:1032#0
-TATGGAGAAGTAGTCTAGTTTGAAGCTTAGGGAGAGCTGGGTTGTTTGGGTTGTGGCTCAGTGTCAGATCGTGCGA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((((&"&$#"$#"#
- at 30BB2AAXX080903:3:47:1654:1609#0
-CTCGAACTGACACTGAGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACAGATCGGACNGAGAG
-+
-67777788888888888888888877776555443222100///..--,--*****()))()(((('%%"""""#"
- at 30BB2AAXX080903:3:44:349:1047#0
-GACACTGAGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACTACTTCTCCAAGATCGGCACAGA
-+
-67777788888888888888888877776555443222000//..---,,+++***))))))(('(&&$&#$"#"#
- at 30BB2AAXX080903:3:2:818:142#0
-CACTGAGCCACAACCCAAACAACCCAGATCTCCCTAAGCTTCAAACTAGACTACTTATACATAGATACNCGCACAC
-+
-6737778888888&188-028888731-6555(43/%,&&1-*.)'-,,,%*+)*)(*%'()((((#""""#$$"#
- at 30BB2AAXX080903:3:46:1779:114#0
-CGAACAATGCTACAGGGATGAATATTATGGAGAAGTAGTCTAGTTTGAAGCTTAGGGAGAGCTGGGTATCGCACAT
-+
-67777788888888888888888877776555443222100//..--,,,,+++**)))))(((('#"#$#$#"#"
- at 30BB2AAXX080903:3:35:1291:647#0
-TGATGGACCATGTAACGAACAATGCTACAGGGATGAATATTATGGAGAAGTAGTCTAGTTTGAAGCTNATTCACCN
-+
-67777788888888888888888877776555443222100//..----,-+++**)))))()(((&"&%"#%##"
- at 30BB2AAXX080903:3:36:1072:1854#0
-TATGATGGACCATGTAACGAACAATGCTACAGGGATGAATATTATGGAGAAGTAGTTGAGTTTGAAGAGTAGTCNN
-+
-67777788888888888288838877676555443(22100//..---,,-+)+*&'())))(((&'""""""$""
- at 30BB2AAXX080903:3:49:202:1420#0
-TATCACAGTGAGAATTCTATGATGGACCATGTAACGAACAATGCTACAGGGATGAATATTATGAGATGGTCCAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&"%#"""#$"
- at 30BB2AAXX080903:3:59:395:1706#0
-TTATATATCACAGTGAGAATTCTATGATGGACCATGTAACGAACAATGCTACAGGGATGAATATTATGTGTCTNNC
-+
-67777788888888888888888877776555443222100//..---,-+++***)*)))((('(&$$&$#$""#
- at 30BB2AAXX080903:3:35:379:256#0
-TCCATAATATTCATCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTAGATCGGANCTACTTNN
-+
-67775788888888888884888277776355$)-'2210)+&,,,,--,+++******)'(&#(('"%#####""
- at 30BB2AAXX080903:3:3:434:1351#0
-CTGAGTTTATATATCACAGTGAGAATTCTATGATGGACCATGTAACGAACAATGCTACAAGATCGGAANCTCANGC
-+
-67777788888888888888888877776555443222100//..--,,,,,+***)))())(((('%"#"%$""#
- at 30BB2AAXX080903:3:34:258:1777#0
-TCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATATAAACTCAGACCANCAACACNN
-+
-67777788888888888888888877776555443222100/0..--,,,++++***))))))((''"$"#$##""
- at 30BB2AAXX080903:3:41:641:1177#0
-ACTGATTAATGTTTGGGTCTGAGTTTATATATCACAGTGAGAATTCTATGATGGACCATGTAACGAACACCACTAA
-+
-67777788888888888888888877776555443222100//...,,,--++**)())*()(&(('"%"$&$$$"
- at 30BB2AAXX080903:3:44:1145:1736#0
-TAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATATAAACTCAGACCCAAACATTAATCAGTT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''&&$&%%%#%
- at 30BB2AAXX080903:3:36:463:536#0
-GAAGAACTGATTAATGTTTGGGTCTGAGTTTATATATCACAGTGAGAATTCTATGATGGACCATGAGCNCGTGACN
-+
-67777788888888888888888877776555443222100//..---,,+++**+))))))(('('$"$"""##"
- at 30BB2AAXX080903:3:45:411:1661#0
-GTCCATCATAGAATTCTCACTGTGATATATAAAATCAGACCCAAACATTAATCAGTTCTTCAAATATCGACTCGGT
-+
-617*77888888888888888888777765553&32220%0/../.-,),+,++))()(&(((((('&%"$%%"""
- at 30BB2AAXX080903:3:50:383:100#0
-TCTCACTGTGATATATAAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATCTTCAGCGAGTCTGC
-+
-67777788888888888888888877776355443222100//..---,,,++***))))))))'''"""""#"""
- at 30BB2AAXX080903:3:33:245:1149#0
-CACTGTGATATATAAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATCAGATCGGANTCGCACNN
-+
-/7777788888888888888882877776545443222100//+..--,,+++**))*)))))('''"$$"%"%""
- at 30BB2AAXX080903:3:35:1307:500#0
-GATTAGTATGGTAATTAGGAAGATGAGTAGATATTTGAAGAACTGATTAATGTTTGGGTCTGAGTTTNCGTGCCCN
-+
-677777488880888888888888777765554432222000...---,-,++***)*()))(((('""#%####"
- at 30BB2AAXX080903:3:45:1037:1580#0
-AGATTAGTATGGTAATTAGGAAGATGAGTAGATATTTGAAGAACTGATTAATGTTTGGGTCTGAGTTCGTATCTCC
-+
-677772888888882888888888777765554432221/0//..---,,+++++*)*))()((''&""""#"$##
- at 30BB2AAXX080903:3:42:1133:1265#0
-CAAACATTAATCAGTTCTTCAAATATCTACTCATCTTCCTAATTACCATACTAATCTTAGTTACCGCTAACAACTT
-+
-67777788888888888888888877776555443222100//..---,,+++***)')))((((''$&%%%&%##
- at 30BB2AAXX080903:3:57:350:638#0
-GTTGGAATAGGTTGTTAGCGGTAACTAAGATTAGTATGGTAATTAGGAAGATGAGTAAGATCGGAAGAGGAGACAT
-+
-67777788888888888888888877476545143222111./.,--+,,+*++*&))))('(((''$"%#""##"
- at 30BB2AAXX080903:3:42:1671:268#0
-GAACAGTTGGAATAGGTTGTTAGCGGTAACTAAGATTAGTATGGTAATTAGGAAGATGAGTAGATATTTGAGATGG
-+
-67777788888888888888888877076555443222120//.,-.--,++++***)))'((((('&&%%&"""#
- at 30BB2AAXX080903:3:2:965:758#0
-GATGAACAGTTGGAATAGGTTGTTAGCGGTAACTAAGATTAGTATGGTAATTAGGAAGATGAGTAGATNTCTCCAA
-+
-67777788888888888888888877776355443220100//-.--,,,+++**)*))))(((('($"%#%%###
- at 30BB2AAXX080903:3:3:1108:1811#0
-AGCCGATGAACAGTTGGAATAGGTTGTTAGCGGTAACTAAGATTAGTATGGTAATTAGGAAGATGAGTNCATNNTT
-+
-6777778888888888888888837717655541322//0/-.--.,,+-+)+***)*)(()(((('%"$"$""##
- at 30BB2AAXX080903:3:42:227:495#0
-ATCTACTCATCTTCCTAATTACCATACTAATCTTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTACTA
-+
-67777788888888888888882877776555443222100//.----,,+++**+)))))(((''&&%%%%$#"%
- at 30BB2AAXX080903:3:8:1324:1310#0
-TCTCAGCCGATGAACAGTTGGAATAGGTTGTTAGCGGTAACTAAGATTAGTATGGTAATTAGGAAGANTCCTAGNN
-+
-67777788888888888888888877756555443220100/.-..--,,,,+******)())((((""$#$#"""
- at 30BB2AAXX080903:3:36:1152:94#0
-AATTCCTACGCCCGCTCAGCCGATGAACAGGTGGGATAAGGTGTTAGCGGGAACTAAGATTAATAGANACGTTACN
-+
-6777778888888)88888888(27575+5/344%2,,&2.*/-.&-*,,&**$'()()##(#&'&'"""#""#$"
- at 30BB2AAXX080903:3:49:172:1151#0
-GCAAGAAGGATATAATTCCTACGCCCTCTCAGCCGATGAACAGTTGGAATAGGTTGTTAGATCGGAATCGTCACGA
-+
-67777788888888888888888877776555443222100//..--,,,++++**)))))((((('"$#""###"
- at 30BB2AAXX080903:3:48:246:36#0
-TGAGCAAGAAGGATATAATTCCTACGCCCTCTCAGCCGATGAACAGTTGGAATAGGTTGTTAGCGGTCCCGGAGCG
-+
-67777788888888888888888877776555443222100//.---,,,&,++**()))())(((#$"#""""##
- at 30BB2AAXX080903:3:53:1142:1184#0
-TTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTAGTTCATCC
-+
-67777788888888888888888877776555443222100//..--+,,,++***)**))(()(''"""#%"$$"
- at 30BB2AAXX080903:3:36:142:977#0
-GTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGTCTGCCTGCN
-+
-67777788888888888888888877776555443222100//..---,,,++*+*))*)))((('#$""#$""#"
- at 30BB2AAXX080903:3:54:77:1776#0
-GTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCGTGTCCGTT
-+
-6777778888888888888888887777655544322200///..--+,,++++**))(*))((((&"$"&%$"""
- at 30BB2AAXX080903:3:4:1241:282#0
-TTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTCGATNACACNCN
-+
-6777778888888888888'/6887777653144222110///#.,,-,,++++***#(('''(##%""&&%$"#"
- at 30BB2AAXX080903:3:37:220:125#0
-CAACTGATGAGCAAGAAGGATATAATTCCTACGCCCTCTCAGCCGATGAACAGTTGGAATAGGTTGTCNAGCTCNN
-+
-67777788888888888888888877776555443222100//..-----,+++**)))))((((''&"&""%#""
- at 30BB2AAXX080903:3:3:186:1889#0
-TCAACTGATGAGCAAGACGGATATAATTCCTACGCCCTCTCAGCCGATGAACAGTTGGCATATGTTGTNTGCNNCA
-+
-6777778888888.$88+88&8880277655.443221100//..-,,,,+)***)**(())&(&('"""&$""##
- at 30BB2AAXX080903:3:47:1557:163#0
-TCAACTGATGAGCAAGAAGGATATAATTCCTACGCCCTCTCAGCCGATGAACAGTTGGAATAGGTTAGTTCGCTCT
-+
-6777778888888888888888887777655544322011/+-..,,,,+,**+'))*()()()#''"""%"$%##
- at 30BB2AAXX080903:3:37:1257:1238#0
-ACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCCAATCGN
-+
-67777788888888888888888877776555443222100//-.---,,+++**)))))))()(('"%&$"%$#"
- at 30BB2AAXX080903:3:45:875:1547#0
-TAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATAG
-+
-677777888888888888888888777765551432-21/0/---.,,,,))+*'*))))(((&'(#'$"##"""#
- at 30BB2AAXX080903:3:8:1430:1295#0
-CAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGANTGCACANN
-+
-67777788888888888888888877776555443-12101//..-.+,,,*+****))())('(''"$"%$#$""
- at 30BB2AAXX080903:3:41:727:1004#0
-ACCTATTCCAACTGTTCATCGGCTGAGAGCGCGTAGGAATTATATCCTTCTTGCTCATCAGAGATCGGAAGTGCGN
-+
-64777788888888888888888878776)5+4-3222200/...,+,,+++***')#(()((('%'""#&"$%#"
- at 30BB2AAXX080903:3:41:1654:1212#0
-CTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGCG
-+
-67777788888888888888888877776555443222100//...-,,,++++*****))(((((('%%&"%"""
- at 30BB2AAXX080903:3:38:1477:1084#0
-TTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGCTNGT
-+
-67777788888888888888/8087777055544322210/...-,-,-,-+*+**)*))()(((('"%$#""""#
- at 30BB2AAXX080903:3:39:1380:169#0
-CAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCCTCTTGCTAATCAGAGAACGGGAGAGCGGTCTATCAC
-+
-6777778888888888888588887#276+5,4532010#1/-.-+*#,%+)+())%'((#&(#(&'"#"#%$$#$
- at 30BB2AAXX080903:3:55:973:883#0
-CAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGCGCTTACT
-+
-67777788888888888888888877776555443221100/....---,-++***)*)()((('(''"#%#""#"
- at 30BB2AAXX080903:3:47:991:1822#0
-ACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCCACACAC
-+
-67777788888888888888888877776555443222100//-.---,,+,+*+*)**)()('(('$%""###""
- at 30BB2AAXX080903:3:58:1558:699#0
-ACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGCACACGACTN
-+
-67777788888888888888888877776555443222100///.---,,+,+*)*)())()('((#$$%#"#$""
- at 30BB2AAXX080903:3:55:514:1196#0
-TGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAAGTGCGGTGCG
-+
-67777788888888888888888877776555443222100//./---,,+++***)))))()('''"$#&%""#"
- at 30BB2AAXX080903:3:45:963:669#0
-TGTTGGCATCTGCTCGGGCGTATCATCAACTGATGAGCAAGAAGGATATAATTCCTACGCCCTCTCAGCGGATGTA
-+
-677777-8888888888888888877776555443222100//..---,,+++***))))))))('''$"%"#$""
- at 30BB2AAXX080903:3:58:392:26#0
-CATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCCTCNNC
-+
-67777788888888888888888877776555443222100//..----,+,+******)())'(''&%"""%""#
- at 30BB2AAXX080903:3:48:222:1943#0
-ATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCTACCCAAC
-+
-67777788888888888888888877776555443222120//..---,,+++**()))))()(('&&""#$###"
- at 30BB2AAXX080903:3:3:1096:550#0
-GGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCACNTCAGNCG
-+
-677777888888888888888888777765554132220000/..----,++*))+)*))))()(%(%"#$"""##
- at 30BB2AAXX080903:3:45:844:1213#0
-CTGCTGTGTTGGCATCTGCTCGGGCGTATCATCAACTGATGAGCAAGAAGGATATAATTCCTACGCCCTCTCCGCC
-+
-677777888888888888888888777765554132221000/..--,,,+,++*)**)()(()'(&'%##"#$#%
- at 30BB2AAXX080903:3:59:1005:868#0
-TGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGAACACG
-+
-67777788888888888888888877776555443222100//..---,,++++*+*)*)))))(('&&%###$$"
- at 30BB2AAXX080903:3:45:709:1767#0
-CGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGAGATCGGAAGAGCGGTGCAGCAG
-+
-67777788888888888888888877776555443222100//..--,,,,,+***)))))((((#%$###$%#"%
- at 30BB2AAXX080903:3:42:178:1153#0
-TTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCATCTGCTCGGGCGTATCATCAACTGATGAGCANGGACGCTA
-+
-67777788888888888888888877776555443222100//..-.-+,,*++***()))()('#'"%"%""###
- at 30BB2AAXX080903:3:53:961:2044#0
-TACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCATCTGCTCGGGCGTATTATCAACTGATGGGATCGCG
-+
-6777778888888888888888887777655$4335221//0,..,.-+,+&+)**#(*'()''(''""##"""##
- at 30BB2AAXX080903:3:8:936:491#0
-CTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACNTCCACGNN
-+
-67777788888888888888888477776555443222100//..----,+++***)*))(((((('""#$"&"""
- at 30BB2AAXX080903:3:37:1552:1828#0
-TTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACACCGCAACAN
-+
-67777788888888888888888877776555443222100//..-,-+,,++***(**('((((''"#"#$###"
- at 30BB2AAXX080903:3:57:379:1371#0
-CGATACGGGTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCATCTGCTCGGGCGTATCATCCACTGAGCATTAC
-+
-&7777788-888888888888-88774765554,/222+00/)-,'-++$&'++'*'()(('%#(&'&#""#""##
- at 30BB2AAXX080903:3:54:1185:927#0
-GCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCATCTGCTCGGGGGTATCATCAACTATTGCGT
-+
-6777778888888888888888887777655544302210//..'+,,,,*+++**'*('(''('&'$#""#"#"#
- at 30BB2AAXX080903:3:41:91:1270#0
-TCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCATCTGCTCGGGGGTATCATANCTCGACAC
-+
-6777778888888888888888887877655544122,10..+.--*,,(,+%+#**)#)#()#((#"$"$""###
- at 30BB2AAXX080903:3:2:1567:1797#0
-TATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGGTGGCATCTGAGATCGGAAGAGCGNCACNTGA
-+
-67777788888888&88-8888880296655.4132..1(&-&.%,-,$)&')'')(###)%'''%#""&&%"##"
- at 30BB2AAXX080903:3:55:748:1415#0
-GTTGATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGNTTCCAC
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)))))((('%&""""##"
- at 30BB2AAXX080903:3:55:1271:1308#0
-TTGATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGAGTCTACC
-+
-6777778888888888888888887777655544332210.//.,---+++,++))))()())(((%&####"##"
- at 30BB2AAXX080903:3:46:726:255#0
-TGATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGACATCCTCT
-+
-6777778888888888888888887777655544322110/./...-,-,+++*****)((((((''""""#$"#"
- at 30BB2AAXX080903:3:47:1563:1186#0
-AAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGGTGTGTTGGGATAGATCGGGAGGGNCACTC
-+
-67777788888888888888888877776555442222100//..-&-,,+)+**%')))((#((#'""""""#""
- at 30BB2AAXX080903:3:2:1157:465#0
-ATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCAGATCGGAAGACNCGCACTC
-+
-67777788888888888888888877776555283220100./-.---,-,++*)***))(((((('""#$%"$"#
- at 30BB2AAXX080903:3:56:286:583#0
-GGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGGCGGGGTGGGGCTTGGCGTGAAATC
-+
-67777788888888888888882877266305243+(.1////.+'+-'(,)#+)*')))&###%##$"#&$%$$#
- at 30BB2AAXX080903:3:49:175:832#0
-GCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGGTNCTACCGTC
-+
-67777788888888888888888877776555443222100//...--,,,+++**))))*)')(&'"#""$#"##
- at 30BB2AAXX080903:3:52:1241:900#0
-GCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATAGGGTTTAGTCCTG
-+
-6777778888888888888888887777655544302/10///.------+++***'*)((''((#'$##""""#$
- at 30BB2AAXX080903:3:36:319:1271#0
-CGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGGATCTGCTCCTAN
-+
-67777788888888888888888877776555443022000//..--,,,+++*'*)))((((&#(#&"%"#$"""
- at 30BB2AAXX080903:3:38:955:1730#0
-CCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGTTTAATCNNTGC
-+
-67777788888888888888888877776556443221100//..--,,,,++***)))(&&'(#%'"$%&""#"#
- at 30BB2AAXX080903:3:2:1298:567#0
-GGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTAGATCGGANGGCACAC
-+
-6777778888888888888888887777655244'22.10//.-'--,,,,++(()#'*'&(%##&'$"""$####
- at 30BB2AAXX080903:3:60:513:930#0
-GGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTAGATCGGAGACTNN
-+
-6777778888888888888888887777655544322210///.----,-+++)**&*)')'((('%"'#$##"""
- at 30BB2AAXX080903:3:48:298:1634#0
-AAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCGTTTCCGG
-+
-677777888888888888888888777766554432101/0//..-*,,-*+++*&))#('&('(''%"""""#""
- at 30BB2AAXX080903:3:59:230:735#0
-AGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCTNNC
-+
-6777778888888888888888787773655044322200/..--&,++,+++)&(&'%'#''###'$"$"$"""#
- at 30BB2AAXX080903:3:57:977:1676#0
-TAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGGTGGGTTTGTGACTCTC
-+
-6777778888888888888888887777655544122%021//-,--),,+****)&()&'((('&%$"%#%"#"#
- at 30BB2AAXX080903:3:42:173:590#0
-GCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGGATGGGTGCTGTGGNGGCGCACT
-+
-677777888888888888888888777765550432/21......)-++,+++&+**))))''(#'%""#"$#$##
- at 30BB2AAXX080903:3:48:1167:970#0
-GCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTGGGTTGATC
-+
-677777888888888888888888777765554432221/0//..----+++++*)*)(()#&)(('""$"""""#
- at 30BB2AAXX080903:3:51:1105:1525#0
-ATGCTAAGGCGAGGGTGAAATCGATATCGCCGATACGGTTGTGTAGGAGTGCTGGAATGGTTGTTGTTNACATCTC
-+
-67777188888888888-88,8887.7%65'54/32(21&///-'---),*++*')'&*)(###('&"""###$#"
- at 30BB2AAXX080903:3:54:86:457#0
-ATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGGTGGATAGGGGTGCTTGAATGGGGGCTGGGCGCTGANA
-+
-677-778888888888888888883075655511*2.2.0/*&,+.-&*)*&*$*#)#((##(##(#"$#%"""""
- at 30BB2AAXX080903:3:2:30:1263#0
-TCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTCNAGTNNCA
-+
-677777888888888888888888777765554422/2100//(--,-,,,,+))*(&(())&'(#'$"#"#"""#
- at 30BB2AAXX080903:3:60:710:1356#0
-GCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCCTTACAGTNN
-+
-67777788888888888888888877776555443232100//..-,)+,&*+)**(''#'&'#''#$&$&%""""
- at 30BB2AAXX080903:3:59:443:386#0
-AATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCGGTATCNC
-+
-67777788888888888888888877776555443212000//..*--,,+++***)))')(()&''$$"$""$"#
- at 30BB2AAXX080903:3:51:205:683#0
-CACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGGTTCATCCTCGCCCTAGCACGCGTGTAC
-+
-67777788888888888888888877776555443222100/-.-,,-'+-+))))())))&(&((&$$$#"#$""
- at 30BB2AAXX080903:3:58:172:902#0
-GGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGNNNT
-+
-67777788888888888888888877776555443222100./----,-,+*+*+*()))#((('''%&$"$"""#
- at 30BB2AAXX080903:3:59:995:272#0
-CATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGGTTCATCCTCGCCTTAGCATGATTTATCCTACCCANC
-+
-67777788888888888888888877776555433.011(1.+*,,-+-*++)*((*'&((((('&%"$$%"%#"#
- at 30BB2AAXX080903:3:45:668:294#0
-TGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATCTCTTGAGA
-+
-67777788888888888888888877776555443222100//..---,,+,+**+)))(((('(('$$$""""""
- at 30BB2AAXX080903:3:36:313:107#0
-TTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGACGATACGGTTGGATAGGGNCACGCCAN
-+
-6777,7888888888888888888777765554,32-210./..--,-%-+++))*)'()##'&'(#"""%"###"
- at 30BB2AAXX080903:3:47:816:1983#0
-TTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGAGGTGACATA
-+
-6777778888888888888888887777655544322210///..-,-,,,++))+*'*)''#'((#&#"""#"#"
- at 30BB2AAXX080903:3:60:671:1118#0
-GTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGAGTACACNN
-+
-67777788888888888888888877776555443222100//....-,,,+*+**))'))''''('$"%%$##""
- at 30BB2AAXX080903:3:52:285:1914#0
-CAATCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCACCACACG
-+
-67777788888888888888888877776552442121100/...---+,++*****))())()((%&"$%$&%#"
- at 30BB2AAXX080903:3:53:124:28#0
-TCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCAGATCGGACGACCGCTGAC
-+
-67777188888888888888888877776555443220100//.----,,,*++**)()'())((#'"$#$"""#"
- at 30BB2AAXX080903:3:55:138:1361#0
-ATCCTATACAACCGTATCGGCGATATCGGGTTTATCCTCGCCTTAGCATGATTTATTCTACACTCCAAGATATCTC
-+
-67777788888888888888888877476)55%03(0/10//+.,-+-+,**++*)#))'#('''('"$"&&%%##
- at 30BB2AAXX080903:3:51:1344:518#0
-CTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGGC
-+
-67777788888888888888888877776555443222100//..---,,+++*****))))(('('&""""$$""
- at 30BB2AAXX080903:3:45:1764:117#0
-GGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGCAGGCGGGG
-+
-67777788888.88888888888877776555443322100-/..--,+-*,+***)())(('''('%$#"$#"""
- at 30BB2AAXX080903:3:41:244:1983#0
-TGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCACAACCTCT
-+
-6777778888888-88(80888&8575765254433+0/1.///.-*-'-,&++))*#&)&'('#'&&"#"$"##"
- at 30BB2AAXX080903:3:59:1258:184#0
-TGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATAAGATCCGCAACNC
-+
-677777888888888888888808577765554432/2100/...---+,++*****)))(((((('""%%##%"#
- at 30BB2AAXX080903:3:39:1269:306#0
-CTATTTGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGAC
-+
-67777788888888888888888877776550443222100//..---,,+++***)*))))(('((&&%&%$$#"
- at 30BB2AAXX080903:3:52:1042:1520#0
-GGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGTTTCGCCC
-+
-67777788888888888888888877776555443222100//.----,,,++****))))()((('%$#""%"$"
- at 30BB2AAXX080903:3:40:1697:879#0
-GCGATATCGGTTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAAGATCGGAAGCT
-+
-67777788888888888888888877776555443222100//..---,,++++**)**()))(('(&&$&""##"
- at 30BB2AAXX080903:3:42:855:1147#0
-GATATCGGTTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAACAGATCGGCCATA
-+
-6777778888888888888)888877776555443312100//-.,,,,-+++**)())&(((((''"%%$"""""
- at 30BB2AAXX080903:3:4:352:460#0
-GATATCGGTTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACACACAACAAACNCACANCN
-+
-6777778888888888888888887777645'4432-2000//.,,+,,,+++(*))&)))((((&'%"%"&""#"
- at 30BB2AAXX080903:3:47:518:1870#0
-TATCGGTTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATACCACTTCTA
-+
-677777888888888888888888777765554432221000/-..-,-,++++*))*)))((((('$""#$####
- at 30BB2AAXX080903:3:2:275:1758#0
-CGTTTAGAAGGGCTATTTGCTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGTNAGANNTC
-+
-677777888888888888888888775765554531221-0//----,,,,*+****))(()((('&"""%$"""#
- at 30BB2AAXX080903:3:35:1083:255#0
-TTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTNTACTACNN
-+
-67777788888888888888888877776555443221100/...,-,-,+,++*+)*)))))((''"###"#$""
- at 30BB2AAXX080903:3:43:1053:343#0
-TGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGGGGGG
-+
-67777788888888888888888877776555442.20+000/).--',&+**+**))*)&')((''&%%&"$#""
- at 30BB2AAXX080903:3:58:916:900#0
-TGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGACAACA
-+
-6777778888888888888888887777655544112/1/0//-.--',,++*+***)))('(((#'&"%%$"#$#
- at 30BB2AAXX080903:3:35:1312:1076#0
-GCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTANTCCAATAN
-+
-67777788888888888888888877776555443222101.....-,-,+,++***))()))(('(""$$"""$"
- at 30BB2AAXX080903:3:4:1729:1372#0
-CTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAGATCGGAACNTCTCNTN
-+
-67777788888888888888888877776555443222010/.-.----,+*++*)*)))))(((('"""$#%"""
- at 30BB2AAXX080903:3:36:1511:2007#0
-GGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGTAGGATACTTTCTCNN
-+
-67777788888888888888888877776552443222100//.,-,+,,++****%)')()((&'%%#"""$$""
- at 30BB2AAXX080903:3:39:1074:2007#0
-ATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGACATCGTCAC
-+
-6777778888888888888888887777652044322.10/0..,,+-,++,+*)*())))(&((('$&%%&#$##
- at 30BB2AAXX080903:3:60:1539:721#0
-ATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCACACACANN
-+
-67777788888888888888888877776555440220200//.,,,--++*+*'*())))%(((#&$$&%%$%""
- at 30BB2AAXX080903:3:55:1252:1771#0
-AGTGGGGTGAGGCTCGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGTTGTATCAAAC
-+
-67777788888888888888888877776555443222100//..---,++++***)*)))()(('#$$"##"#""
- at 30BB2AAXX080903:3:41:1477:316#0
-TAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGGTGGTAC
-+
-67777788888888888888888877773555443222100//...--,,+++)*)())()')((&'$$#""""##
- at 30BB2AAXX080903:3:2:1244:1247#0
-TACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTANCAGACCG
-+
-677777888888888888888888777765554432221000*-..--,-,++)*)))*)()(('('%""%#$##"
- at 30BB2AAXX080903:3:4:715:728#0
-TACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTTNCAATNAN
-+
-6777778888888888888888887777655543222200././.--,,,+++**)**)))(((((&""##"""#"
- at 30BB2AAXX080903:3:46:579:753#0
-TCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAAAGCTAATCCAAGCATCACCCCACTACTAGGCCTCGGAC
-+
-27777788888888888888888877776555443212/0///.-.,-+,+')***'))&'()(#''"##$$""#"
- at 30BB2AAXX080903:3:3:534:528#0
-CCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCNGCCCNCA
-+
-67774788888888888888/888777795554432211000..-,-,,,+,)**)))))))(((''$""%##"$"
- at 30BB2AAXX080903:3:55:1600:33#0
-CCAAATCATGAGACCCACAACAAATAGCCATTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGACACAATAAC
-+
-67777788888888888888888877776%55)43222100//..---,,+++***)))))((('''$$$#$"###
- at 30BB2AAXX080903:3:43:581:1060#0
-AGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATAGATCGG
-+
-67777788888888888888888877776555443221100//.----,,+++***)*)))()('(&&'%%$%$#%
- at 30BB2AAXX080903:3:34:385:1328#0
-CAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCNCGACCTNN
-+
-67777788888888888888888877776555443222100//.-.--,,++++*+)*))*)(('('"%""#$#""
- at 30BB2AAXX080903:3:57:1268:607#0
-CTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTGCAC
-+
-67777788888888888888888877776555413222100//..---,,+,**+*)*)()((((&''%%$"""$#
- at 30BB2AAXX080903:3:8:1773:891#0
-TGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGNCTATCTNN
-+
-677777888888888888888888775765554432221/0//..---,,+++***)))*))((('&"$%""#"""
- at 30BB2AAXX080903:3:38:679:434#0
-ATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTCCCACCA
-+
-6777778888888888888888887777655544332210....-----,,+++***))))((((''&%%%&""#"
- at 30BB2AAXX080903:3:4:216:1410#0
-TGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTANTCTANTN
-+
-677777888888888888888888677765554432221/0/..--*-,,+)+***)*)))(()(('""##"#"""
- at 30BB2AAXX080903:3:49:1688:283#0
-AGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCGTCA
-+
-67777788888888888888888877776555443222100//..---,,,++++*)*)))()((('"$""#""$#
- at 30BB2AAXX080903:3:2:1679:1156#0
-TGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTNGCGAGTC
-+
-67777788888888888888888877776555442221100/./-,--,,+,)**))()('(((('%'"%&%#$"#
- at 30BB2AAXX080903:3:51:906:607#0
-TGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTGTGGTTGGT
-+
-67777788888888888888888877776555443221100//..---,++++***)))))))((''"""$""##"
- at 30BB2AAXX080903:3:55:363:433#0
-GACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCCGCACTAC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((((''""%%$"###
- at 30BB2AAXX080903:3:43:721:690#0
-CTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGGG
-+
-67777788888888888888888877776555443222110//..---+,+,+**))*))(()((('&&%"&%#""
- at 30BB2AAXX080903:3:4:242:569#0
-GCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGATCGGAAGGGCNTGCTNCN
-+
-67777788888888888886880673772515443,2.10../..-,,+,)+***)*((&()#'(#'%""#$#"$"
- at 30BB2AAXX080903:3:45:800:969#0
-TGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGAGATCGGAGGGGGGG
-+
-67777788888888888888888877776555443222100//..---,,+,++***)*)))(((('$"#%"$"#$
- at 30BB2AAXX080903:3:33:1653:1308#0
-TTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGGAGATCGGAAGAGCGGTGANTCACTGNN
-+
-67777788888888888888888877776555443222&00//.-+--+,+*'%**'))))#()#%#""%%%""""
- at 30BB2AAXX080903:3:44:367:1373#0
-CAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAAGATCGGAAGAGCGCG
-+
-67777788888888888888888877774555443222000//.---,-,*,++***))())((((&&&&"%""""
- at 30BB2AAXX080903:3:55:179:999#0
-CAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAAGATCGTNCTCAG
-+
-67777788888888888888888877776555443222100*/--.*-+,,,++****)&))()((#$&""$#%##
- at 30BB2AAXX080903:3:47:749:1380#0
-ATTTGCCTGCTGCTGCTAGGAGGAGGGCTAGTAGTGGGGTGAGGCTTTGGTTTGCGTTTAGAAGGGGTTGTCGCTC
-+
-67777788888888888888888877$7635+5422221*0./.,,.&,,*,%*'*#*)')'((('%"""%%"$##
- at 30BB2AAXX080903:3:36:1036:1272#0
-AACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCTAGGTGTGN
-+
-67777788888888888888888877776555143222100//..---,,+++****)*))((((''%"#"%$%#"
- at 30BB2AAXX080903:3:57:523:1828#0
-AACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCTCCAC
-+
-67777788888888888888888877776555443222100//..--,,-,++****))))))(((''&"#"####
- at 30BB2AAXX080903:3:3:749:138#0
-CAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGCNCATCNCN
-+
-6777778888888888888888887/7553452450/1000/....,,),**+*'*)*(((((('''$"$#$$"#"
- at 30BB2AAXX080903:3:44:70:547#0
-TAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAATACAGCCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((('&""&&%##"#
- at 30BB2AAXX080903:3:49:1248:1539#0
-CCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAAGATCGGAAGAGCGGTGTCT
-+
-67777788888888888888888877776555443222100//.--.-,,+++**)*))))()((''$$"""""""
- at 30BB2AAXX080903:3:59:785:1061#0
-CTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGAGATCGGAAGAGCTGCAACAC
-+
-67777788888888888888888877776555443222000//..-.-,,+,++*)))(()(((('''$%###$$#
- at 30BB2AAXX080903:3:59:119:1007#0
-ACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGGTGTCNNA
-+
-6777778888888888888888887777655544322,100//-.-,-),+++**)))))))(('(''""$%$""#
- at 30BB2AAXX080903:3:36:1786:967#0
-AGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATNTGGCAGNN
-+
-677777888888888888888888777765554432221/0//..,-+-,*++**')())(((((&'"%$%%##""
- at 30BB2AAXX080903:3:1:1174:1765#0
-AAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATNCGNTCGC
-+
-67777788888888888888888857576456342222120-.,/.--,+,+*)**()()('(((%'%"""""""#
- at 30BB2AAXX080903:3:58:1553:630#0
-GGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGATCGGAACACCACAN
-+
-67777788888888888888888077776555443222000//.,,--,,+++***)()()(('('&$$%$$%$#"
- at 30BB2AAXX080903:3:59:865:1924#0
-TGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGAGCACAAC
-+
-677777888888888888888888777765554422121/0/-..*,-+,+++***(*()#()'(('&$#%$"###
- at 30BB2AAXX080903:3:36:687:998#0
-GGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGGGGGGTGAGAGTGTAACACAN
-+
-6777778888888888888888887777355544121..001/.,.-(+)),%**#**))&(#(#(#&$""%#$#"
- at 30BB2AAXX080903:3:36:825:2013#0
-TAATCCAAGCCTCACCCCACTACTAGGCCCTCTCCTAGCAGCAGCAGGCAAATCAGCAGATCGGAAGTCTCGCTNN
-+
-6777778888888888388888887874*5$444-2120./-..-+--$+)+*'**')*)%&(('&%%"#$"$"""
- at 30BB2AAXX080903:3:55:1329:1147#0
-AATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCCCCACCACA
-+
-67777788888888888888888877776555443222100//..--,-,++++**)*)()(((('&"%%##$#$#
- at 30BB2AAXX080903:3:38:204:1656#0
-TCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCATCCGACCA
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))))((((''$"%""####
- at 30BB2AAXX080903:3:33:484:1458#0
-TCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGNGCTGTCNN
-+
-67777788888888888888888877776555443222100//-.-,-,,+++*+))())(()((&&""#""#%""
- at 30BB2AAXX080903:3:38:688:171#0
-TCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGCTGTCAGNN
-+
-67777788888888888888888877776555443222100//-.-,-,+,+++*&))&)(((((%'$"""$#"""
- at 30BB2AAXX080903:3:33:1687:204#0
-GCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCNTCACTCNN
-+
-67777788888888888888888877776555443222100/-.---,-,,++***))()(((((''""%#$"$""
- at 30BB2AAXX080903:3:47:127:277#0
-CCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCCGACTCGCC
-+
-67777788888888888888888877776555443222100//..---,,++++**)*)))()((''$""$##$"#
- at 30BB2AAXX080903:3:2:1533:1696#0
-GAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTATNCGCGCAA
-+
-67777788888888888888888872756555445012100./---,,,,+*+*)**(()#(('(&%""$%&$%##
- at 30BB2AAXX080903:3:36:1638:495#0
-TGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGAGATCGGGATCTATNN
-+
-677777888888888888888888777765554432.1100/...,--,,,,+**))*))())'((#$$"$$""""
- at 30BB2AAXX080903:3:50:1255:490#0
-TGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAAGATCGGAAGAGCGCACTCT
-+
-67777788848888888888888877776555443231100/....--,,,+)**))))('))(((&"$##"#"#"
- at 30BB2AAXX080903:3:53:267:155#0
-TGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTCGTCTTCGGGTG
-+
-67777788888888888888888877176555443321100/....--,,,,)**)**)))(('#(#""""$""""
- at 30BB2AAXX080903:3:57:929:328#0
-CTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGTGCACTCC
-+
-67777788888888888888888877776555443222100//..----,+++***)))))))((('$"%%$$"##
- at 30BB2AAXX080903:3:57:330:1636#0
-AGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGCCTCCACCCGTGACTCCCGTCAGCCATAGCGCCT
-+
-67771788888888888888&888777753454135/0+0//).-(,*,++&++*))#()&((((&%%$""$"##"
- at 30BB2AAXX080903:3:51:1449:1742#0
-GGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATCNAAAGCN
-+
-677777888+8888888888888877776555&41222100/-.'--,,,++*+++(#(#))(('('"$"#"%#$"
- at 30BB2AAXX080903:3:57:358:1455#0
-GTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGAGATCGGAAGAGCGGGTCCGTACC
-+
-6177778088888888888/888877775555413212./..+-----,),,)+*))))(')((#(("'#$"""$"
- at 30BB2AAXX080903:3:49:830:1861#0
-GGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCCAGCCCG
-+
-6777778888888888888888887777655544322210/0/..---,,+++**))*)))((((''$$#""##""
- at 30BB2AAXX080903:3:55:951:1228#0
-GGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCAGATCGTGTGTAC
-+
-67777788888888888888888877776555443222100//.----,,++++**))*))((('('&$"&$%###
- at 30BB2AAXX080903:3:44:1554:775#0
-CTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCGATCG
-+
-67777788888888888888888877776355443222100//...--,,++++*****)*())('''"$"%###$
- at 30BB2AAXX080903:3:44:19:1322#0
-TCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCTAAGGCAC
-+
-67777788888888888888888877776555443222100/0..---,,+++***)**)))((('''"""""###
- at 30BB2AAXX080903:3:40:659:1779#0
-CCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCTCCACCAC
-+
-67777788888888888888888827776555443221100.....--+,+,++***))))))(((#&"%"$#$##
- at 30BB2AAXX080903:3:39:490:825#0
-CTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCGCACACACA
-+
-67777788888888888888888877776555242222110//.----,-,,++***)())((((%("&#$""$#"
- at 30BB2AAXX080903:3:60:1089:702#0
-CTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCGCAACCCCTGACTCCCCTCAGCCATAGAAGGCCCGACACCNN
-+
-677777888888888888'888887777+55511/2)21/,../-.,-,,*'+**+)))()'(('&'"%$$#$#""
- at 30BB2AAXX080903:3:45:618:701#0
-ACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGTTGTGC
-+
-67777785888888888888888877776555443222100//...,--,+++**)*)))()(('((""%#"%"""
- at 30BB2AAXX080903:3:46:1540:1201#0
-CAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGACATAGAAGGCCCCACGCTACACCT
-+
-67777788888888888888888877776552443222100///--.,,,,*+*+*)&)('('('('&$""$####
- at 30BB2AAXX080903:3:52:333:909#0
-GCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCCTCCTCAG
-+
-67777788888888888888888877776555443222100//..---,,+,+**)*)))))(((('%""#"#$"%
- at 30BB2AAXX080903:3:47:877:2004#0
-CAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCAGATCGGTACCGCGAAC
-+
-67777788888888888888888877776555543222.0/-....--,,+,++***)()()(#((#"$""$"""#
- at 30BB2AAXX080903:3:35:507:1548#0
-GGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATNTGCCCCAN
-+
-677777888888888888888888777765554432211/0//..-,-,,+,**+)))**)((('''"""#####"
- at 30BB2AAXX080903:3:49:1524:1809#0
-AGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGGATACACAC
-+
-6777778888888888888888887777655244/2221/0/,,.---+-+'+)'#)(&)((((#'&""""#"#""
- at 30BB2AAXX080903:3:37:1650:1056#0
-GCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCTGCNN
-+
-67777788888888888885888877776555443221100//.--,,-+,+****)*)(((''(''"%""""$""
- at 30BB2AAXX080903:3:39:1410:1543#0
-AGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGATCGGAAGAGCGGTTCCGCAGTA
-+
-67777788888888888888888877776575443122100/...--+,(&++**)*)(()((#('%"#"$%"##"
- at 30BB2AAXX080903:3:54:480:1740#0
-GAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGATCGGAAGAGCGGTCGCGCCAC
-+
-67777788888888888888888877776555443222100//..---,,+,+****))()(((''&"#"#%%""#
- at 30BB2AAXX080903:3:54:523:336#0
-CAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCACCCACGTC
-+
-67777788488888888888888877776555433222100//...-,-,++++*****))((((('&&#&%%$""
- at 30BB2AAXX080903:3:39:1219:400#0
-ATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGGTGGGCGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))())(('''$&"&"#$##
- at 30BB2AAXX080903:3:2:1781:656#0
-ACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGNCGAGCGC
-+
-67777788888888888888888877776555443221100/...----,+++**)*)))&('%(('&"#%"###$
- at 30BB2AAXX080903:3:48:644:1554#0
-CAACTATAGTGCTTGAGTGGAGTAGGGATGAGACTGGGGTGGGGACTTATATGGCTGAGGGGCGACAGAGCACTAA
-+
-677777888888888888888888777+65554432221*0//-'--+%,-,+*)*)))))('(&''"""$##"#"
- at 30BB2AAXX080903:3:40:342:1281#0
-GATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTCGCGGGAAT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))))('('%""%"#"""
- at 30BB2AAXX080903:3:57:1435:687#0
-AAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATAGACGACACAT
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))(('(&&%""$$##"
- at 30BB2AAXX080903:3:56:786:316#0
-AAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTAGATCGAATG
-+
-67777788888888888888888877776555443222100//..---,,+++**))))))()(''''&%%&##""
- at 30BB2AAXX080903:3:4:720:1212#0
-TCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATNCTCANCN
-+
-6777778888888888*88888887777625544302210//0.,,.,+,+*+**)**)()()((''"""%%#"#"
- at 30BB2AAXX080903:3:2:71:347#0
-AGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAAAGANACANNGC
-+
-677777888888888888188883777164104131/010...----++,+,++**'*)#(((&(''$"&%""""#
- at 30BB2AAXX080903:3:39:1233:581#0
-AGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATACTCTCACAC
-+
-67777788888888888888888577136/55043221000//,.-.,+-,,+(*)())))(()('#&&%%$%%$$
- at 30BB2AAXX080903:3:33:1236:1913#0
-GAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTNCCCACGNN
-+
-6777778888888888888888887777655544322210///..--,,,+++***)*)())(((''"$#$"$"""
- at 30BB2AAXX080903:3:42:804:1382#0
-AAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGGGTT
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(('('&'#"#""""
- at 30BB2AAXX080903:3:43:474:1012#0
-AAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGGCTC
-+
-67777788888888888888888877776555443220100//..----,*++****)))(((((('&&$$""#""
- at 30BB2AAXX080903:3:57:1550:1751#0
-AAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGCACTCAAAT
-+
-67777788888888888888808877776530443222110//...--,,,+++*()))))'(((('$$%"##$$"
- at 30BB2AAXX080903:3:1:730:1431#0
-GAAGCGGATGAGTAAGAAGAGTCTGGCTCCAACTAAAGAGCTGGAGGGGGGAAGGGAGGGGAGATCGCNATNCCAC
-+
-67777788888888-&88268'8%'75-$-12,,+$20+-,/&.%."-+%+&***)(&(#(#(###'$"%$""#"#
- at 30BB2AAXX080903:3:33:1537:1426#0
-GAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAAGATCGGNCACGCCNN
-+
-67777788888888888888/888777765551432/220//..,-,-,,,+++**())())(('('"$%$"##""
- at 30BB2AAXX080903:3:33:261:767#0
-GAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGANCAAACANN
-+
-67777788888888888888888877776555443222.00///,-+-,++++***(*)))(('('#"&###"$""
- at 30BB2AAXX080903:3:36:108:1418#0
-GGCCCCACCCCAGTCTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCACACTTN
-+
-677777888888888888888888777765554432211000/..-,-,,+++***)))*))('(''$%"#"##""
- at 30BB2AAXX080903:3:36:1204:194#0
-TGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTATGGCTGAGACTGNAGCCGTAN
-+
-6777778888888888888888887777655544322210.//..---,,++++**))))))((((&"#%#$#"""
- at 30BB2AAXX080903:3:39:891:601#0
-CCACCCCAGTCTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCCTAC
-+
-67777788888888888888888877776555443222100//..---,,,++*****)*))()((&'&&&#%"""
- at 30BB2AAXX080903:3:56:877:2036#0
-GGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGTACTTC
-+
-67777788888888888888888877776555443222100//...--,,+++*+**))))(((('''&%"##""#
- at 30BB2AAXX080903:3:37:143:1292#0
-GGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGCGTATCGTN
-+
-6777778888888888888888887777655544321110//..----,,+++***)()))(()'''%""""#"#"
- at 30BB2AAXX080903:3:2:403:827#0
-CTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTNAGACGCT
-+
-677777888888888888888888777765553432221/0-/..---+,+++***)))))(((((&$""&%&"#"
- at 30BB2AAXX080903:3:4:1420:400#0
-TGCTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGATCGGAAGAGCGGTTCACNCACANCN
-+
-67777788888888888888884877776555441122/00+..,.,,,-,***+*()((#))#'##$"%$#""#"
- at 30BB2AAXX080903:3:36:1103:912#0
-CTCAGCCCTACTCCACTCAAGCACCATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCGATGCACN
-+
-67777788888888888888888877776555443222100//..---,-+,++*+))*)))((((#%""""##$"
- at 30BB2AAXX080903:3:49:581:2014#0
-CTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCATATCCCATAT
-+
-67777788888888/,8483888/67756/55123+021//-)..,(-+)+*+*#('#(('''(#%%""#""#"""
- at 30BB2AAXX080903:3:4:989:1712#0
-TCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCCNCTAGNCN
-+
-677777888888888888888888275725604420220///--,,++,,+)**)**(()(''(('%&"%""#"$"
- at 30BB2AAXX080903:3:8:1017:788#0
-GCTATTTTCTGCTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGNTCACACNN
-+
-67777788888888888888888877776555443220100//.---,,-,++**)**)()((('('"$#"$#$""
- at 30BB2AAXX080903:3:42:1294:932#0
-AGTGTGCTATTTTCTGCTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTATTGTTCT
-+
-677747888888888/88288888-77765154/3222.00/...-)-+,,,)**(*))()(&&'(''##"&#"#$
- at 30BB2AAXX080903:3:40:1780:1441#0
-CTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGAAAATAGCCCACTAAAC
-+
-67777788888888888888888877776555443222100//..--,--+++***)())'(('(('%&$%$##"#
- at 30BB2AAXX080903:3:54:217:1473#0
-TCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGAAAATAGCCCACTAGATG
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))((('''$&&"%###
- at 30BB2AAXX080903:3:33:1469:357#0
-CAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGAAAATAGCCCNATATCTNN
-+
-67777788888888888888888877776555443212100/...---,,+******))*(((((('"$##$$$""
- at 30BB2AAXX080903:3:38:664:888#0
-CACTATAGTTGTAGCAGGAATCTTCTTCCTCATCCGCTTCCACCCCCTAGCAGAAAATAGCCCACTACTCTCACAC
-+
-67777788888888888888888877703555443212100//...--,,+++++***))(()((''&$%#%#"#"
- at 30BB2AAXX080903:3:39:1049:483#0
-AGAGTTTGGATTAGTGGGCTATTTTCTGCTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACACCTATCG
-+
-67774788888888(888888888777765554432121/0//..,,-,,+++**))*))())('&('$#$"$$#"
- at 30BB2AAXX080903:3:46:122:961#0
-TGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGAAAATAGCCCACTAATCCAAACTCTAACCCTC
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*)))((('(&%"##%#$""
- at 30BB2AAXX080903:3:59:1513:1142#0
-TAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGCTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCACAACNAC
-+
-67777788888888888888888877776555443222100//..---,,++****)))))))((('$$%%%$"$$
- at 30BB2AAXX080903:3:46:123:914#0
-TAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGCTAGGGGGTGGAAGCGGATGAGTGAGAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(''''%#"#"$""
- at 30BB2AAXX080903:3:50:97:1499#0
-TAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGCTAGGGGGTGGAAGAGATCCGGCGCCAC
-+
-67777788888888888888888877776555443222001//...---,+++***%))**(((((#$""$"##"#
- at 30BB2AAXX080903:3:40:768:1375#0
-GGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCGATTTTCTGCTAGAGATCGGAAGAGTGGCGTT
-+
-674777888888888888888888777763554432,-100//(%--,,,*+***)*()()'()'('&%""#""""
- at 30BB2AAXX080903:3:8:1721:722#0
-GGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGCTAGGGGGTGGAAGNCATCTCNN
-+
-67777788888888888888888877776555443222100//..---,,,++**)))))))((((&""##%##""
- at 30BB2AAXX080903:3:44:88:784#0
-ACAGAGTGGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTAGATGAGAAGAGCGCTCTC
-+
-67777788888888888/88888877776555-452/2100../----,,(++++*)*)))&((((&&""""$##"
- at 30BB2AAXX080903:3:1:305:216#0
-TTCCACCCCCTAGCAGAAAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACNTGNCTCA
-+
-677777888888888888888882087765553/322.100/0-/,.,-,*,++**()()))((%&('""""####
- at 30BB2AAXX080903:3:33:1319:516#0
-TTCCACCCCCTAGCAGAAAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCANCTCACANN
-+
-67777788888888888888888/.777055444320100/1/-.-&,,,*&(*'*()(((''(&'%"$#%$##""
- at 30BB2AAXX080903:3:56:1252:1047#0
-CTGCGAACAGAGTGGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGCTAGTGGCTC
-+
-67777788888888888888888877776555443222100//..---,,,+****))*)))()('''%%"""$""
- at 30BB2AAXX080903:3:60:1084:1851#0
-CTAGCAGAAAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGTNTGNN
-+
-67770788888888888888888877776555443222100//..--,,,+++**()*))()(((''&%%#"#"""
- at 30BB2AAXX080903:3:42:1712:170#0
-CAGACTGCTGCGAACAGAGTGGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGTTG
-+
-67777788888888888888888877776555483222000//..--,,,+++**+)*))))()(''$&%%&$"##
- at 30BB2AAXX080903:3:47:727:856#0
-GCAGACTGCTGCGAACAGAGTGGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATAGATCGGAAGATGCGATGC
-+
-67777788888888888888888877776/55413222000/..,---,,+,+****))))'(((''""#"$""##
- at 30BB2AAXX080903:3:60:908:191#0
-GCAGACTGCTGCGAACAGAGTGGCGATAGCGCCTAAGCATAGGGTTAGAGTTTGGATTAGTGGGCTATATCCGCNN
-+
-67777788888888888888,88,77476/5'4,0221/-0/#.%,--,,*)+++())()%(()%&&'#%#%"$""
- at 30BB2AAXX080903:3:59:346:751#0
-CGCAGACTGCTGCGAACAGAGTGGTGATAGCGCCCAAGCATAGTGTTTGAGGTTGGGTTAGTAGGCTATTTCANNA
-+
-677777888888888888888088577-65.5(-"-.-0.,-/,.,,#,+,$*+**(&(#(#')(#%%"&"%$"""
- at 30BB2AAXX080903:3:37:1709:1765#0
-CAGAAAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCCGCTCTCNN
-+
-67777788888888888888888877776555443222100//..---,-+++***)**()((((('"$$"#"$""
- at 30BB2AAXX080903:3:36:1216:177#0
-GAAAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCAAGACCGGAAGAGCGGNCANCTACN
-+
-677777888888888888888888777785554432-11-0//.---,*(+)***#&&&('(((&''"$""$""$"
- at 30BB2AAXX080903:3:43:667:969#0
-AAGGGCGCAGACTGCTGCGAACAGAGTGGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGGGGACA
-+
-67777788888888888888888877776555443222100//..----,,++****)))))()(('$$&#""#"#
- at 30BB2AAXX080903:3:37:1211:1239#0
-CTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACCAACACGN
-+
-67777788888888888888888877776555443221100//..---,,++++*))))*)(()(('&$#$#%"#"
- at 30BB2AAXX080903:3:49:1270:978#0
-CCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTAAGATCGGTAACCTC
-+
-67777788888888888888888877776545443222200//.-.--,,+++*'*))*((((((('%""""##"#
- at 30BB2AAXX080903:3:44:767:623#0
-CAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAACGACATCA
-+
-67777788888888888888888877776555443222110//..--,,,+,+**+))))))()('('$#""#"##
- at 30BB2AAXX080903:3:48:960:1633#0
-AACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGATATCATC
-+
-67777788888888888888888877776555443222100//..----,++++***)))))(((('"""###"#"
- at 30BB2AAXX080903:3:4:581:669#0
-CTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGAGATCGGAAGAGAGGGTCCNCCTCNCN
-+
-67777788888888888888888/77716555443021001./-,--,,,+,+****$*'*#)(%'%"""#"#"""
- at 30BB2AAXX080903:3:44:65:2007#0
-TGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATGCAAGTCA
-+
-67777788888888888888888877776553443312.0/..-.-,,),,++**+))*)))()(('$"##"""#"
- at 30BB2AAXX080903:3:1:906:1104#0
-GCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAGATCGTNACNTATA
-+
-6777778888888888888888887777655544320211/...----,,+++**)*)*)(((('&'""##"#""#
- at 30BB2AAXX080903:3:57:112:689#0
-AAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGACTGCTGCGAACAGAGTGGTGATAGCGNGTNCCC
-+
-67777788828888888888888877776555443222101/...---,-+*****)))))((('''&&"##"$$#
- at 30BB2AAXX080903:3:8:838:1370#0
-TAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAGATCGGAAGANCATGTANN
-+
-6777778888888888888888887777654544322120///.--,-,,+++**))*))))('(''"%""#"#""
- at 30BB2AAXX080903:3:4:793:1855#0
-GAGAAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGACTGCTGCGAACAGAGTGGTGACNCTGANAN
-+
-67777788888888888888888877776555543202(00//...--,--++*)****()&))#('%"$""#"#"
- at 30BB2AAXX080903:3:4:751:1909#0
-AGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAGATCGGAACNACCTNCN
-+
-677777888888888888868888/7776+534432021/1//.,-,+,,++)**)*))()((((''$"%"##"$"
- at 30BB2AAXX080903:3:36:732:936#0
-GGAGAAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGACTGCTGCGAACAGAGTGGTGCTCAGATAN
-+
-67777788888888888888888877776555443222100//.----,,,+++*))*))((((''&"%###$"$"
- at 30BB2AAXX080903:3:38:109:1392#0
-TGGAGAAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGACTGCTGCGAACAGAGTGGACATCGCATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)*))(('''%$"#""###
- at 30BB2AAXX080903:3:50:1612:982#0
-AGTGGAGAAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGACTGCTGCGAACAGAGTGACGCTCTCT
-+
-67777788888888888888888877776555443222100//..---,,,,+****)))()(('&'"$"#"###"
- at 30BB2AAXX080903:3:2:998:1935#0
-TATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCCNCACNGCC
-+
-677777888888888888888888777765454032211///,-----,,+)++)*)))')((('%'""%""""#"
- at 30BB2AAXX080903:3:34:716:1406#0
-CACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCNCCTCGCNN
-+
-67777788888888888888888877776555443222100//..-----+,+*)**))(())('('"$$"$""""
- at 30BB2AAXX080903:3:35:169:1277#0
-ACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTAGATCGNACTACCAN
-+
-67777788888888888888888877776555443222/00//..---,,,++**)*))))((((&&""##$$#$"
- at 30BB2AAXX080903:3:56:1070:890#0
-GTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCAGATCGGAAGAGCGCATACCA
-+
-67777788888888888888888877776555443222100//&.--,,,+,++**)*))))()('''%#""####
- at 30BB2AAXX080903:3:42:1197:1745#0
-TATGAGTCCTAGTTGACTTGAAGTGGAGAAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGATTGCT
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))((('(&&$%""##""
- at 30BB2AAXX080903:3:57:1017:1304#0
-GTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAGTCAACTAGGACTCGTATAAC
-+
-62777-88888888888888888877(7655544322210//..----,,+&+****'())())'''&$#&""#"#
- at 30BB2AAXX080903:3:44:1323:1466#0
-CTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAGTCAACAGATCGGAAGAGACAAA
-+
-67777788888888888888888877776555443222000/..--,,,-++'*)))*))(()('('&$"#&#%##
- at 30BB2AAXX080903:3:33:1145:1447#0
-ATGCCGATTGTAACTATTATGAGTCCTAGTTGACTTGAAGTGGAGAAGGCTACGATTTTTTTGATGTNACTCTGNN
-+
-64777788888888888888888877776555443222000//..---,,+++*+**)))))()(''"#"&%%#""
- at 30BB2AAXX080903:3:54:845:989#0
-ATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCCACCC
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))(((''%"$"%$$#$
- at 30BB2AAXX080903:3:44:1551:1387#0
-TAGGTGTGGTTGGTTGATGCCGATTGTAACTATTATGAGTCCTAGTTGACTTGAGATCGGAAGAGCGGGTCAGCAG
-+
-6777778888888888888888887777655544322210///-.---,,,++****)))()((''&'"#$%$$"$
- at 30BB2AAXX080903:3:58:1666:1483#0
-ATCGTAGCCTTCTCCACTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACAAAAGACAN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()('&'&"#"$$$"
- at 30BB2AAXX080903:3:35:32:1292#0
-AATGCTAGGTGTGGTTGGTTGATGCCGATTGTAACTATTATGAGTCCTAGTTGACTTGAAGTGGAGANACAAGAGN
-+
-67777788888888888888888877776555443222100//..----,+++***))*)))(((''""$"""#""
- at 30BB2AAXX080903:3:38:1105:1630#0
-AATGCTAGGTGTGGTTGGTTGATGCCGATTGTAACTATTATGAGTCCTAGTTGACTAGATCGGAAGACGTCATTGT
-+
-677777888888888888888888777765554452221/0//./---,,+,+*)*))*)'(('(('%$#"#"$$#
- at 30BB2AAXX080903:3:33:669:983#0
-GTAGCCTTCTCCACTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACAAGNCAATGTNN
-+
-67777788888888888888888877776555443222100//...--,,++++*+**)))()(((("%""""#""
- at 30BB2AAXX080903:3:44:1727:1505#0
-GTAGCCTTCTCCACTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAGATCGGAAGAGAGGGAC
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)))()('''$&&"$""""
- at 30BB2AAXX080903:3:56:291:48#0
-GGAATGCTAGGTGTGGTTGGTTGATGCCGATTGTAACTATTATGAGTCCTAGTTGACTTGAAGTGGAGAGGGACGC
-+
-67777788388888888888888877776355420322010/0.--,--,*,***))*))((('((&&"#%%$$"#
- at 30BB2AAXX080903:3:39:1044:391#0
-TCCACTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCCGCACACCC
-+
-67777788888888888888888877716555443222000///.---,,-,+***)*()))(((('"&%%$""##
- at 30BB2AAXX080903:3:41:1427:771#0
-CTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCAGATCGCTAC
-+
-67777788888888888888888877776555443222010//..-.-,,-+++'*)*)()((((''&$&%%"#$#
- at 30BB2AAXX080903:3:40:332:1500#0
-TGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTGGTTGATGCCGATTGTAACTATTATGAGATCGGTAGGCGCGA
-+
-67777788888888888888888877776555443222100//..---,,++++***))))((((''$&%%$%""#
- at 30BB2AAXX080903:3:4:101:739#0
-TGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTGGTTGATGCCGATTGTAAATATTATGAGTCCTAGNCGAGNCN
-+
-67777788888888888888888877716,554432+2100/+-.---,+++#+**))(())(''(&"""""""#"
- at 30BB2AAXX080903:3:57:1001:1821#0
-GTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCACATAGAACCACATCC
-+
-6777778888888888888888887772855.54022,100*-.,.,,,,+$+)*()))()'(((''""$"%#"#$
- at 30BB2AAXX080903:3:43:1190:752#0
-CTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCACATCTGTACCCACGCCCATA
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))))('('%$%$#$##"
- at 30BB2AAXX080903:3:43:1631:572#0
-TAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCACATAGATCGGAAGAGCGATCT
-+
-67777788888888888888888877776555443221100//...--,,+++*****))))((('''&%#$""""
- at 30BB2AAXX080903:3:2:1332:587#0
-GAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTGGTTGATGCCGATTAGATCGGAAANCGCACAC
-+
-67777788888888888888888877776555443222100/...-,-,,*+***))*)))('(((&""##&$$##
- at 30BB2AAXX080903:3:52:476:1667#0
-TGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTGGTTGATGAGATCGGAAGGGCGTCG
-+
-67777788888888888888888877776555443222100./.----,,+++*****)))))(('%"$"$"%"##
- at 30BB2AAXX080903:3:43:1245:460#0
-TACAATCGGCATCAACCAACCACACCTAGCATTCCTGCACATCTGTACCCACGCCTTCTTCAAAGCCATACTATTT
-+
-67777788888888888888888877776555443222100//..----,++++*****)))((((''&&&&$%%$
- at 30BB2AAXX080903:3:43:10:226#0
-CATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGATCGGAAGAGCGGTCACAGACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((('&"$"%"""##
- at 30BB2AAXX080903:3:4:1650:612#0
-AGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTGTNCTATNTN
-+
-67777788888888888888888877776545443212/00/..--,,,,*++*)*)))()(()'('""#""%"""
- at 30BB2AAXX080903:3:45:1092:704#0
-GGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGTGTGGTAGGATGCAC
-+
-677777888888888888888888777765554422220000/..---,,++++**)*)))'('''%$%"""#$#"
- at 30BB2AAXX080903:3:47:1768:1464#0
-CGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTAGCTGGA
-+
-67777788888888888888888877776555443222100./..--,,,+++*+*)()))((((''$$""$""""
- at 30BB2AAXX080903:3:60:1397:1728#0
-GGACCCGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGACAAACANN
-+
-67777788888888888888888877776555443222000//..-,,,,+++*)))))))(()((''&&%%%#""
- at 30BB2AAXX080903:3:59:1146:1872#0
-TGATGGACCCGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAAGATCGGACACCC
-+
-67777788888888888888888877776555443222100/..----,-+,++***)#*)(((''''&&"#$%##
- at 30BB2AAXX080903:3:48:1703:446#0
-CCTAGCATTCCTGCACATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATAACCTCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))()(('&"""""##$"
- at 30BB2AAXX080903:3:53:970:982#0
-CCTAGCATTCCTGCACATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGAGATCGGAAGGTTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((((($$""""""#
- at 30BB2AAXX080903:3:39:1561:1853#0
-TGTGGATGATGGACCCGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGTGATANAGN
-+
-67777788888888888818888877776555443222100//..---+,+++*)*')))()'(#('"&&#$"##"
- at 30BB2AAXX080903:3:3:1186:1466#0
-GTTGTGGATGATGGACCCGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACGGATGGGGTNCTCTNAC
-+
-6777778888888888888888884175655541/22200//-.,-,,-,*+(+**#(&(('#('%'%"&"#"""$
- at 30BB2AAXX080903:3:2:736:303#0
-TGCACATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCACAACNGTCTGCA
-+
-67777788888888&8/8088888787765154435201/01/./---$-,++'*)*)*))(#((('&"#&#"""#
- at 30BB2AAXX080903:3:56:539:515#0
-GCACATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCACAACATTAACATC
-+
-67777788848888888888888877756555443222100//..---,,+++***)))))((((('$$%&"#""#
- at 30BB2AAXX080903:3:58:1080:2019#0
-TCATTGTTAAGGTTGTGGATGATGGACCCGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACNACACN
-+
-6777778888888888888888887777655542222222///..----,+++*)**))))&('(('$&%""#"#"
- at 30BB2AAXX080903:3:8:1731:1740#0
-CTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCACAACAGATCGNGCATCANN
-+
-67777788888888888888888877776555443222100//.-.,-,+,+++****)())(((''"""#&##""
- at 30BB2AAXX080903:3:43:398:1158#0
-TGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCACAACCTTAACAATGAACAAG
-+
-67777788888888888888888877776555443222100//..---,,,++****)*)())(((&'&%&&%%""
- at 30BB2AAXX080903:3:35:812:1787#0
-TTTCGAATATCTTGTTCATTGTTAAGGTTGTGGATGATGGACCCGGAGCACATAAATAGTATGGCTTNGACACTAN
-+
-677777888888888888888888777765554432221001.-.-,--,++*+))*))()))('(&"##%$$"$"
- at 30BB2AAXX080903:3:45:810:764#0
-TACTATTTATGTGCTCCGGGTCCATCATCCACAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGCATAAC
-+
-67777788888888888888888877776565443222100//..--,,,+++***))))*()((('%%##"""""
- at 30BB2AAXX080903:3:60:479:723#0
-GGTTTTGAGTAGTCCTCCTATTTTTCGAATATCTTGTTCATTGTTAAGGTTGTGGATGAGATAGGAAGCGCACGNN
-+
-67777788888888888888888877776555443222100//..---,+++***))*()))#((''&"&%#$"""
- at 30BB2AAXX080903:3:60:376:823#0
-TGCTCCGGGTCCATCATCCACAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAGTNGANN
-+
-67777788888888888888888870776555443222000//.-.-,,,++****)*))())((('%%&"""#""
- at 30BB2AAXX080903:3:55:923:1011#0
-GTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTCGAATATCTTGTTCATTGTTAAGGTTGTGGAGGTTGTCCC
-+
-67777788888888888888888877776555443222000//..---,,++*****)))(((((''$&"$"###"
- at 30BB2AAXX080903:3:2:886:107#0
-AGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTCGAATATCTTGAGATCGGAAGAGTGGTTCACNCGCAACA
-+
-6777578888888888888,8038./67.05048332+0/1/./,.,,,,*+#**)()()#)(%'##""%$#"$##
- at 30BB2AAXX080903:3:33:772:1141#0
-CATCCACAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCNCTCGACNN
-+
-67777788888888888888888877776555443322100/...----,+,+***))))*('((''"$####$""
- at 30BB2AAXX080903:3:57:1094:1151#0
-CATCCACAACCTTAACAACGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCACTGCATAC
-+
-67777788888888888838888877776555443222100//..---,,++++****))))(((('$$&""###"
- at 30BB2AAXX080903:3:33:791:1659#0
-CACAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTAGATCNCACCTANN
-+
-67777788888888888888888877776565443222100/../--,,,+++*****()))(((('"$%"$""""
- at 30BB2AAXX080903:3:60:1262:580#0
-CCCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTCCTCAAAACCATACCTCTCACTTCAACCCCACTANN
-+
-*777778888888888888888887777655544322210,./..,-,+,&++*+*)))))((%''''#&#$""""
- at 30BB2AAXX080903:3:60:1263:579#0
-ACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCACTTCAACCTCACACNN
-+
-67777788888888888888888877776555443222100//..---+,++++**))))))))'''$&%#%$$""
- at 30BB2AAXX080903:3:43:737:1917#0
-GTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTCGAATAGATCGGAAGAGCGGCTCTC
-+
-67777788888888888888+88*777765554431.2+-/.+.-+--,-++*'&*)*))'))&&(''#%"#"##"
- at 30BB2AAXX080903:3:56:1542:996#0
-AACGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCACTTCAACCTCCCTCACACTTGCCA
-+
-67777788888888888888888877776555443222100//..-,-,,+++****))*)(((''&$$%$%##$%
- at 30BB2AAXX080903:3:47:1709:1411#0
-CTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTCGAATATATTGTCCAT
-+
-67777788888888888888888877776555443222100//..-----+++*+*))))))(((('"%"""##""
- at 30BB2AAXX080903:3:44:1690:1260#0
-GCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTGATCGGAAGCGGGTG
-+
-677777888888888888888888774745554/2222/00/-...--+$,,***(*)))%(((&('$"%#"""##
- at 30BB2AAXX080903:3:57:875:335#0
-CTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTAGATCGGAAGNATGCCC
-+
-67777788888888888888888877776555443221100/...---,,++++**))*))))('''%&""$####
- at 30BB2AAXX080903:3:42:1034:1784#0
-AAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTACC
-+
-67777788888888888888888877776551443222000//..----,+*+*******()(('(('%&&%%$"#
- at 30BB2AAXX080903:3:48:1571:2016#0
-ATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTCGTACGTC
-+
-6777778888888888888888882777652141302-10&....%+,,,*+')*'&#)#'(&'(''"$$#$#"""
- at 30BB2AAXX080903:3:3:704:1274#0
-TATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCACTTAAACCTCCATCACCATTGGCAGCCNCGTANAC
-+
-6777778888888888888818887777652544122200.+/,%,,,++++')*+)))(((((((&'"#&$#"$"
- at 30BB2AAXX080903:3:40:1025:2020#0
-CTAATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATCTTTCGAAT
-+
-677777888888888888888888777765754/322200///*----+,,+++*)**)&')''(''$$#%#%###
- at 30BB2AAXX080903:3:44:799:1882#0
-CCTGCTAATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGCATGGTTTTGAGTAGTGCTCCTAGTNTGC
-+
-6777778888888888888848887'7-655144-22*.0&/,.---#,,,+%*)**()(()#'(&(%"##%"#"#
- at 30BB2AAXX080903:3:3:390:1182#0
-TATTCCTGCTAATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCNCTCGNAC
-+
-67777788888888888888888877776555443322.00...,-,-,,+)+***#*))*((('(''"%$%#""#
- at 30BB2AAXX080903:3:45:814:637#0
-GAAAGGTATTCCTGCTAATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGGATGGTTTTGGGGAGGCGT
-+
-67777788888888888888888877776525443222100//.,--,,,+++***)&)*)('((((%&"#%"##"
- at 30BB2AAXX080903:3:35:1471:1981#0
-GGACTACTCAAAACCATACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAANACTCCAGN
-+
-67777788888888888888888877776553343322100//..--,,,++****(*()('(((#'""%"####"
- at 30BB2AAXX080903:3:1:871:1913#0
-GAGGAAAGGTATTCCTGCTAATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTNTCNGTGC
-+
-6777778888888888888808887777655544-222/0///..--+,,)*+)***)))'(()('&&"$%""##"
- at 30BB2AAXX080903:3:46:799:732#0
-GAGGAAAGGTATCCCTGCGAATGCTAGGCCGCCAATGGTGAGGGGGGATGCTGTGAGAGGTATGGTTGCGTGCAGG
-+
-677777888288%88883#88828&77+2%514(2222*00//.%-&&,,$&)$*'')))%(''(#'%#$""%$"#
- at 30BB2AAXX080903:3:48:1712:639#0
-TACTCAAAACCATACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATAGATCGGAAGAGCGCGACCACG
-+
-67777788888888888888888877776555443222100//..-,-,,+,++***()*)()((('$"""##"#"
- at 30BB2AAXX080903:3:8:1132:1392#0
-TACTCAAAACCATACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCNTCACCCNN
-+
-67777788888888888888888877776555443222100//..---,,+,+****))))()((''"$"$$##""
- at 30BB2AAXX080903:3:52:1350:805#0
-AAACCATACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCCCAGGTTC
-+
-67777788888888888888888877776555443222100//..--,,,+,+**))*))))(((('"$%%&%"""
- at 30BB2AAXX080903:3:47:480:1397#0
-TACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGGCTTCATCTC
-+
-6777778888888882888888887777655544122010./...+,-,,,++))))*%(((('(&'"""$""#""
- at 30BB2AAXX080903:3:41:1509:1803#0
-GGAGTAGAAACCTGTGAGGAAAGGCATTCCTGCTAATGCCAGGCTGCCAATGGTGGGGGAGGTTGCAGTGAGCCTA
-+
-67775788888888888888888,6777)555,4%212.%,/-#--+,,(++*$+#**)&))#'(#'%%%$""##"
- at 30BB2AAXX080903:3:37:221:169#0
-CCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGGAGTNGAGTTNN
-+
-677(778,8888.8888888888877476555442222100//..--*--+++***)()))()((''&"%&%"$""
- at 30BB2AAXX080903:3:46:1746:264#0
-TCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAAGATCGGAGGCGAGC
-+
-67777788888888888888888877776555343222100//...-,,,++****)*)))(((''($%""#"""#
- at 30BB2AAXX080903:3:55:30:1588#0
-GATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCTAATGCTAGGCTGCCAATGGTCCCTCGT
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((('&'#"##"#$#
- at 30BB2AAXX080903:3:2:390:1386#0
-TTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCTAATGCTAGGCTGCCANTGGNCTG
-+
-67777788888888888888888877775555443222001//.----,,+,+**+**)())((((''"#&#"%$$
- at 30BB2AAXX080903:3:36:1523:1305#0
-GCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCTAATGCTAGGCACACTCCNN
-+
-6777278888888888888888857'7.45624432211/0/..---',,,,)+*)*()))'((((%$"#%"$#""
- at 30BB2AAXX080903:3:55:861:1298#0
-TTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGAGATCGGAAGCGCGGTCTA
-+
-67777788888888888888888877776555443222100//..-.-,,+++***)*))*(((((&%%#$%####
- at 30BB2AAXX080903:3:52:1568:83#0
-TGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGGTTTCTACTCCAAAGACCACATCATCGAAACAGCAAAA
-+
-67777788888888888888888877776555443222100/...---,,+,+***)**))(((''&%'%"#""##
- at 30BB2AAXX080903:3:34:301:1637#0
-TGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCTAATGCNCGCAAGNN
-+
-67777788888888888888888877776555443222000//..---,,+++****))))()((''"%#$"""""
- at 30BB2AAXX080903:3:48:801:936#0
-TATGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCAGATCGCGTGCTA
-+
-67777788888888888888888877776555443222100//..---,,,,+***)*)))(()'('&$""""#""
- at 30BB2AAXX080903:3:33:1147:994#0
-CTAGCATTAGCAGGAATACCTTTCCTCACAGGTTTCTACTCCAAAGACCACATCATCGAAACCGCAANCCACACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))('(&"##"%#%""
- at 30BB2AAXX080903:3:3:435:246#0
-ATGATATGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCGNATGCNTN
-+
-67777788888888888888888877776555443222100///----,,-++++*))))))(''(&%"#%"#"""
- at 30BB2AAXX080903:3:57:1309:699#0
-TATGATATGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCTACACCCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))((('''&#$###"
- at 30BB2AAXX080903:3:43:1428:1750#0
-GCAGGAATACCTTTCCTCACAGGTTTCTACTCCAAAGACCACATAATCGAAACAGCAAACATATCATACACAACCC
-+
-677777888888888888888888387765553&5101100//+,---,,+++)*%)))()((((('''%$%##"#
- at 30BB2AAXX080903:3:42:1341:902#0
-GCGTTTGTGTATGATATGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGNATGCCTG
-+
-677777888888888888488888737765.54432-21.0//..---,,,++**))*)))(((((('"$&"%$##
- at 30BB2AAXX080903:3:59:313:363#0
-TCAGGCGTTTGTGTATGATATGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGCANNT
-+
-67777788888888888888888877776355443222100//..---,,++***)*)*()()(('('&"&$#"""
- at 30BB2AAXX080903:3:56:1654:1651#0
-GGTTTCTACTCCAAAGACCACATCATCGAAACCGCAAACATATCATACACAAACGCCTGAGCCCTATACCAACACA
-+
-67777788888888888888888877776555443222100//..---,,+++***())))((('(&&&%%#$%%%
- at 30BB2AAXX080903:3:2:1014:1698#0
-GTAGCGATGAGAGTAATAGATAGGGCTCAGGCGTTTGTGTATGATATGTTTGCGGTTTCGATGATGTGNCTCTCGT
-+
-6777778888888888888888887777655541332.100//--,,-+,+,**+)*)()()((((&&""##$$""
- at 30BB2AAXX080903:3:49:1259:1767#0
-CATCATCGAAACCGAAAACATATCATACACAAACGCCTGAGCCCTATCTATTACTCTCATCGCTACCACCTTCACT
-+
-27777788888888$881888888777363254330/21.1++,.,-+,,+++))**))*((#('%'"##"##"#"
- at 30BB2AAXX080903:3:38:403:1455#0
-TTGTTAGGGAGGTAGCGATGAGAGTAATAGATAGGGCTCAGGCGTTTGTGTATGATATGTTTGCGGTATCGTCGCC
-+
-67777788888888888888888877776545443232110/..-.--,,+++*****)))))((('"&#&"$"##
- at 30BB2AAXX080903:3:46:165:1888#0
-CTTGTTAGGGAGGTAGCGATGAGAGTAATAGATAGGGCTCAGGCGTTTGTGGATGATATGTTTAGATCGGCCGAGC
-+
-67777788888888888888888877776555443221100//-..--,-,)+*****))'((((('&%%###"#"
- at 30BB2AAXX080903:3:36:370:1925#0
-CGCAAACATATCATACACAAACGCCTGAGCCCTATCTATTACTCTCATCGCTACCTCCCTAACAAGACTCACACNN
-+
-67777788888888888888888877776525443222100./...,-+,,,++**)***(()(((#%"%"%"#""
- at 30BB2AAXX080903:3:35:602:1105#0
-TATTCGAGTGCTATAGGCGCTTGTTAGGGAGGTAGCGATGAGAGTAATAGATAGGGCTCAGGCGTTANCTCTACTN
-+
-67777788888888888888888877776455443221100/..,---,,,++***())())')%''"%#$###""
- at 30BB2AAXX080903:3:49:1686:677#0
-ATACACAAACGCCTGAGCCCTATCTATTACTCTCATCGCTACCTCCCTAACAAGAGATCGGAAGAGCCTCCGCACA
-+
-6777778882888888888888887777655.4432220/0//-.--+,-+*+*+***))))()((#%"$#"$#$"
- at 30BB2AAXX080903:3:34:801:910#0
-GGGTGAGAAGAATTATTCGAGTGCTATAGGCGCTTGTTAGGGAGGTAGCGATGAGAGTAATAGATAGNCAAGATNN
-+
-67777788888888888888888877776555443222100/...+--,,,,+***)())))(((('"$$#"##""
- at 30BB2AAXX080903:3:36:96:1682#0
-CGCTACCTCCCTAACAAGCGCCTATACCACTCGAATAATTCTTCTCACCCTAACAGGTCAACCTCGCTACCCNATN
-+
-67777788888888888888888877726555443222100//..---+,+,++**))))))((('&$"$$$"$""
- at 30BB2AAXX080903:3:59:691:335#0
-CGCTACCTCCCTAACAAGCGCCTATAGCACTCGAATAATTCTTCTCACCCTAACAGGTCAACCTCGAGATCAACNC
-+
-67777788888888888888888877776555443220100//..-.--,+++****)))))(((('&&#$##$"$
- at 30BB2AAXX080903:3:56:1682:205#0
-GTAAGGGTGGGGAAGCGAGGTTGACCTGTTAGGGTGAGAAGAATTATTCGAGTGCTATAGGCGCTTGCACACACCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''&&%%#$%$%
- at 30BB2AAXX080903:3:39:1645:1004#0
-TAGTAAGGGTGGGGAAGCGAGGTTGACCTGTTAGGGTGAGAAGAATTATTCGAGTGCTATAGGCGCTTGGCTATCA
-+
-677777888888888888888888777765554432/2100//..---,,+++****)*))(()''('&%$%#"$"
- at 30BB2AAXX080903:3:39:1190:1461#0
-CAAGCGCCTATAGCACTCGAATAATTCTTCTCACCCTAACAGGTCAACCTCGCTTCCCCACCAGATCTGCGCTTCT
-+
-67777788888888888888888877776555443222100//..---,,+++******)))()((&$&"""""#"
- at 30BB2AAXX080903:3:46:306:1636#0
-CGCCTATAGCACTCGAATAATTCTTCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACACGCTCGGA
-+
-67777788888888888888888877776555443222100//..---,,++++*****)))((((''%$#"#$#"
- at 30BB2AAXX080903:3:51:751:1889#0
-TAGCACTCGAATAATTCTTCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACATAGATCGGGATAAC
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(('('&$""""""#
- at 30BB2AAXX080903:3:39:1197:550#0
-AGGGTGGGGTTATTTTCGTTAATGTTAGTAAGGGGGGGGAAGCGAGGTTGACCTGTTAGGGTGAGAAAAATACCAG
-+
-6777778888888888888888880777455544%222110//..--+,,+&+**))**))((('('$""%$####
- at 30BB2AAXX080903:3:40:1571:1053#0
-ATGGGGTTTAGTAGGGTGGGGTTATTTTCGTTAATGTTAGTAAGGGTGGGGAAGCGAGGTTGACCTGTTGCGTGAT
-+
-67777788888888888888888877776555443222000//..-*-,,+++***)))()(('((''&%$&#"""
- at 30BB2AAXX080903:3:46:220:1335#0
-AGGTCAACCTCGCTTCCCCACCCTTACTAACATTAAAGAAAATAACCCCACCCTACTAAACCCCATTAGAACACTG
-+
-677777888888888882888888777765554432%2000//.-%--+,-*++++)*))))(((''&$"#%#%#%
- at 30BB2AAXX080903:3:39:1488:1570#0
-GCTGCCAGGCGTTTAATGGGGTTTAGTAGGGTGGGGTTATTTTCGTTAATGTTAGTAAGGGTGGGGAAGTCTGCCA
-+
-67777788888888888888888877776555443222100//..---+,++++**)*)))((('''%$""#"##"
- at 30BB2AAXX080903:3:2:1390:1379#0
-TGCGAATAGGCTTCCGGCTGCCAGGCGTTTAATGGGGTTTAGTAGGGGGGGGTTATTTTCGTTAATGTNTGTAGTC
-+
-6777778888888888888888887775635344322+10./-,--.#,,++*)***))(('(&('''""%""""#
- at 30BB2AAXX080903:3:58:1402:645#0
-CCTGCGAATAGGCTTCCGGCTGCCAGGCGTTTAATGGGGGTTAGTAGGGTGGGGTTATTTTCGTTAATGTATGACA
-+
-677777888888888888888888777765550432221%0/...---,,+++*&*)))))'))'''$$&"""$$$
- at 30BB2AAXX080903:3:8:1401:1341#0
-AATCCTGCGAATAGGCTTCCGGCTGCCAGGCGTTTAATGGGGTTTAGTAGGGCGGGGTTATTTTCGTNCTCTCTNN
-+
-64777788888888888888883)7777/5154,.-1-10//#.,+-*++,+#+**)(('&)(''''"$%#"##""
- at 30BB2AAXX080903:3:57:203:555#0
-GGAAGGGGGATGCGGGGGAAATGTTGTTAGTAATGAGAAATCCTGCGAATAGGCTTCCGGCTCGGTTGGGATGTCT
-+
-67777788888888888888888877776555443220100./..,-,,,,+++**()*)&(#'#%#$%#"#"###
- at 30BB2AAXX080903:3:51:303:1022#0
-GCCTGGCAGCCGGAAGCCTATTCGCAGGATTTCTCATTACTAACAACATTTCCCCCGAGATCGGAAGGCACAGCGC
-+
-6777778888888888888888887777655544+2121&00/,..,-+,*)***))()'#(((('&%$#####"$
- at 30BB2AAXX080903:3:1:919:1238#0
-GTTGTTTGGAAGGGGGATGCGGGGGAAATGTTGTTAGTAATGAGAAATCCTGCGAAGATCGGAAGAGCNGTNATCT
-+
-677777888888888888888888777165/)4/322200,//./.,++,+,+**)*)(()('('%'&"##"###"
- at 30BB2AAXX080903:3:4:1652:529#0
-TGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGGGGATGCGGGGGAAATGTTGTTAGTAATGAGCNTGGTNTN
-+
-67777788888888888888888877776555443222100/-..---,,,++***))')()(((''""&&#%"$"
- at 30BB2AAXX080903:3:36:303:1975#0
-GCTGTGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGGGGATGCGGGGGAAATGTTGTTAGTAAGTACACANN
-+
-6777778888888888888888887777655544321.100//-.-,-,,++***+*)))))((('%"""$"$$""
- at 30BB2AAXX080903:3:38:217:1646#0
-GACAGCGAGGGCTGTGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGGGGATGCGAGATAGGAAGCGGACCGA
-+
-67777788888888-83888888877770555441222100///.-*,,,+++(**())))'')(('&#""###""
- at 30BB2AAXX080903:3:46:1507:923#0
-TGACAGCGAGGGCTGTGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGGGGATGCGGGGGAAATGTGATCACT
-+
-67777788888888888888888877776555443222100//..--,-,+++***))))))(''('"#"""####
- at 30BB2AAXX080903:3:8:1493:824#0
-AAAGTGACAGCGAGGGCTGTGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGGGGATGCGGGGGNCACCACNN
-+
-67777788888888888888888877776555443222110//..---,,+++***)))))(((((&"$"##"#""
- at 30BB2AAXX080903:3:4:1012:1341#0
-GGAAAGTGACAGCGAGGGCTGTGCGTTTTAGGCAGAGGGGGATTGTTCTGTGGAAGGGGGAGGCGGAGNACGCNGN
-+
-67777728888888)8388'8$8&73476255%330+210.%.-.,,&'*+**()*)())&%('((&"""&%$"$"
- at 30BB2AAXX080903:3:56:424:538#0
-AGGAAAGTGACAGCGAGGGCTGTGAGTTTTAGGTAGAGGGGGATTGTAGATCGGAAGAGCGGTTCAGCCGCGACGC
-+
-67777788888888888888888877776555443222100//..---,,,,+**))))))(#(('($"&$""#"#
- at 30BB2AAXX080903:3:54:246:1321#0
-CCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACTCACAGCCCTCGCTGTCACTAGATGTACACTA
-+
-677777888888888888888888727765554432221000/..---,,+,++****)())()'('$"""$#$""
- at 30BB2AAXX080903:3:58:628:423#0
-CCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACTCACAGCCCTCGCTGTCACTTTCCTATACGAC
-+
-67777788888888888888888877776555443222110//..-.-,,,++*+**)*()()((''''$"##"#$
- at 30BB2AAXX080903:3:45:783:2045#0
-GAAGTCCTAGGAAAGTGAGAGCGAGGGCGGTGGGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGTGAGCGAGGG
-+
-6777778888888888880888887772(5)5)42221.00-).%---,,+,)+*)(*)())'#((&$"%##$"#"
- at 30BB2AAXX080903:3:54:1368:1964#0
-GCTGTTAGAAGTCCTAGGAAAGTGACAGCGAGGGCTGTGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGTGTGCAC
-+
-677777888888888888888888777765554452221.0//...----+,+****)))))()(('$""$%$#"#
- at 30BB2AAXX080903:3:42:1717:204#0
-CCCCTTCCAAACAACAATCCCCCTCTACCTAAAACTCACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACCACC
-+
-67777788888888888888888877776755443222101./.----,,+++*)&)*(#'((((&'&%&#"""#%
- at 30BB2AAXX080903:3:36:1734:565#0
-ACAACAATCCCCCTCTACCTAAAACTCACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCNAGATCTNN
-+
-6777778888888888888888887777655544322210.//..---,-,++++))**)*))((('""##"$$""
- at 30BB2AAXX080903:3:4:1196:1002#0
-AACAATCCCCCTCTACCTAAAACTCACAGCCCTCGCTGACACTTTCCTAGGACTTCTAACAGCCCTACNCACTNCN
-+
-67777788888888888888888877776555443222100//...--,,++****))))))((((&$"%%$%"#"
- at 30BB2AAXX080903:3:39:1000:1553#0
-CCTCTACCTAAAACTCACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTAGCTACCA
-+
-67777788888888888888888877776555443222100//..-,-,-+,+*)***)))()(('(&$"'&&"##
- at 30BB2AAXX080903:3:58:866:1006#0
-TGGTTAGGTAGTTGAGGTCTAGGGCTGTTAGAAGTCCTAGGAAAGTGACAGCGAGGGCTAGATCGGAATGGCGCTC
-+
-67777788888888888888888877776555443222100//..---,,+,+++*)))))))'(('$$#&"%###
- at 30BB2AAXX080903:3:37:667:1687#0
-CTACCTAAAACTCACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTACTACAN
-+
-67777788888888888888888877776555423222100//-.----,+,++**)*))))(((('$###"#$#"
- at 30BB2AAXX080903:3:48:1298:1992#0
-TTGTTGGTTAGGTAGTTGAGGTCTAGGGCTGTTAGAAGTCCTAGGAAAGTGACAGCGAGGGCTGTGAGGTCTCGCA
-+
-677777888888888888888808777765554431121-./...,-,,,+++**))())(#(('('$"#"$#"#"
- at 30BB2AAXX080903:3:56:155:1614#0
-AACTCACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTAACCAACACAGCCAC
-+
-67777788888888888888888877776553443222100//..-.-,,-++**+)**))))(('''&#$$"###
- at 30BB2AAXX080903:3:4:380:1658#0
-TTCTAACAGCCCTAGACCTCAACTACCTAACCAACAAACTTAAAATAAAATCCCCACTATGCACATTANATTTNTN
-+
-6777778888888888888888887777655544322-100...-..,,-,,+**)))())()((''"""&"#"#"
- at 30BB2AAXX080903:3:56:1219:694#0
-GAGAAATAAAATGTGCATAGTGGGGATTTTATTTTAAGTTTGTTGGTTAGGTAGTTAGATCGGAAGAGTGTGCCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''$%%#"###$
- at 30BB2AAXX080903:3:60:1049:25#0
-CTTAAAATAAAATCCCCACTATGCACATTTTATTTCTCCAACATACTCGGATTCTACCCTAGCATCACACCACCNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)**)()()(('%##&$##""
- at 30BB2AAXX080903:3:51:1196:1390#0
-TAGATAGGGGATTGTGCGGTGTGTGATGCTAGGGTAGAATCCGAGTATGTTGGAGAAATAAAATGTGCTGAGCGGA
-+
-67777788888888888888888877776555441222100//...--,-++++****)))))(((''"""$#$$"
- at 30BB2AAXX080903:3:45:743:1497#0
-TTTTATTTCTCCAACATACTCGGATTCTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTTCCACGC
-+
-677777888888888888888888777765514232222/.//.-.-,,,+*+*(*)()'(((((''"""#""#""
- at 30BB2AAXX080903:3:47:792:1051#0
-TTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGCGGGGTGTGATGCTAGGGTAGAATCCGAGAGAAGTCGTGACC
-+
-67777708888888888884882877779'5544+22-1'0/.,,-"*,,+,#**)*((%(')(((#$"######"
- at 30BB2AAXX080903:3:53:1409:1325#0
-TTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGCGGTGTGTGATGCTAGGGTAGAATCCGAGTATGCTTGCGTAA
-+
-6777778888888888888888887777655544222/100//..---,,++*+*))*())(((((($##&"""#"
- at 30BB2AAXX080903:3:39:253:1770#0
-CTCCAACATACTCGGGTTCTACCCTCGCATCAGGCACCCCACACTCCGCTATCTAGGCATTCTTACGCGTCTCCAC
-+
-(7.7278888,88)-%+888%3085'%+1)65,11%+,.0/$.#,$-(+,),'$)##)(('#&(''%$""#$"$#$
- at 30BB2AAXX080903:3:60:1613:1509#0
-AACATACTCGGATTCTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGACACACAACNN
-+
-677777888888888888888888777765554432221000/..---,,,++*)*)*))))((''&$$%%"$%""
- at 30BB2AAXX080903:3:49:52:1174#0
-ACATACTCGGATTCTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCACAACCTGCC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))(((((&"$#"%#"##
- at 30BB2AAXX080903:3:33:234:393#0
-AGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGCGGTGTGTGATGCTAGGGTAGANCCACTCNN
-+
-677777888888888888888888777765554402221/0//..---+,++****)))()))#(('"%%%%##""
- at 30BB2AAXX080903:3:54:1013:1584#0
-CTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCTGCCCCTACCTCTCCTA
-+
-67777788888888888888888877776555443222110//..--,,,+*+****)())((((('&%"&%%%$$
- at 30BB2AAXX080903:3:49:931:491#0
-CCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCTGCCCCTACTCCCTNCGCCAC
-+
-67777788888888888888888877776555443220100//..---,,,+++****)))')((''"""#""#"#
- at 30BB2AAXX080903:3:57:850:790#0
-CCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCTGCCCCTACTCCTCCTCCTCC
-+
-67777788888888888888888877776555443222100//..---,,,,++**)))))))('(('&&%$#"##
- at 30BB2AAXX080903:3:35:1122:44#0
-TAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGCGGTGTNTGCCTCNN
-+
-67777788888888888888888873776555443222100//..-,--,,++**)())()(((''%""$####""
- at 30BB2AAXX080903:3:3:1318:1012#0
-TAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGGGGTGGTNTGTCNAC
-+
-677777888888888888888038715765401/2..-0.,..(,*)++()++**#%()#'#'(#'&""%"##"##
- at 30BB2AAXX080903:3:33:93:1601#0
-GGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGCGGNTCGTGTNN
-+
-67777788888888888888888877776555443232000/...-,-,+++**++)))'))(('('"$%"#"#""
- at 30BB2AAXX080903:3:48:882:1982#0
-CAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTAGATCGGGCGA
-+
-6777778888888888888888887777655544320200/-..----'++)+**)))))'((('&'"###"""#"
- at 30BB2AAXX080903:3:1:1215:888#0
-GTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGNGCNTACT
-+
-67777788888888888888888877776555343222111//.----+,+****)***))(#%((%%""#"""#"
- at 30BB2AAXX080903:3:50:991:1594#0
-GTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGTGATACCA
-+
-67777788888888888888888877776555443222100/../-,--,(++**(*()))(&((('%"$"""###
- at 30BB2AAXX080903:3:35:1367:1708#0
-CTAGTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGGTNTGCACATN
-+
-67777788888888888888888877776555443.221001/.--*--,+,+(*'())(()))(%'"$$$#$##"
- at 30BB2AAXX080903:3:57:1070:340#0
-GCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCTGCCCCTACTCCTCCTAGACCTAACCTGACGACTCAC
-+
-67777788888888888888888877776555-43220100//..'--,++*+*+')*))''(((('%'"#$"###
- at 30BB2AAXX080903:3:37:1017:83#0
-CTTTTCTAGTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGGTTTGGCTCGTAAGAAGGCCCAGCTAGCGTGGCTNN
-+
-6777778888888888888888887777654544322110&//..--+-)*'****')#(##(##&'$&$%#%#""
- at 30BB2AAXX080903:3:50:1755:1702#0
-AGGTAATAGCTTTTCTAGTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGGGCAGTCTC
-+
-67737788888888888888888877776555443222110//..---,+,++***)*)((((((&'""##""#"#
- at 30BB2AAXX080903:3:41:1740:887#0
-TTAGGTAATAGCTTTTCTAGTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGATTCTAT
-+
-67777788888888888888888877776555443222100//..---,,+)+***)**))#(((('&$"#"#"##
- at 30BB2AAXX080903:3:33:1694:740#0
-TTACGAGCCAAAACCTGCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCGAAAACNACACACNN
-+
-677777888888888888888.88.77765454431220..#'.%-+-+,,+++**'()'(''('(%"#%$$$$""
- at 30BB2AAXX080903:3:38:1488:1643#0
-AGCCAAAACCTGCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACAGCCGT
-+
-67777788888888888888888877776555442222100./..---,,+++**)*)))))((('''"%$#$#"#
- at 30BB2AAXX080903:3:52:1596:1556#0
-TGGAGGTGGAGATTTGGTGCTGTGAAATTGTTTTAGGTAATAGCTTTTCTAGTCAGGTTAGGTCTAGCACAAGAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('"""##"##"
- at 30BB2AAXX080903:3:35:757:516#0
-ACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACAGCACCAAATCTCCNACTCCANN
-+
-6777778888888888888888887777655544322210//...---,,+++++***))())((('""%%"##""
- at 30BB2AAXX080903:3:44:635:77#0
-CCTGACTAGAAAAGCTATTACCTAAAACAATTTCACAGCACCAAATCTCCACCTCCATCATCACCTCACCCCAAAA
-+
-67777788888888888888888877776555443222100//,/.-,,,++++**)*)()(()((''"%&%$%#%
- at 30BB2AAXX080903:3:48:356:1388#0
-TTATGCCTTTTTGGGTTGAGGTGATGATGGAGGTGGAGATTTGGTGCTGTGAAATTGTTTTAGGTAATAGGCTTCC
-+
-677777888888888888888882777765554/3202.00//..---,-+(+***)*))))((('($$$"##"#"
- at 30BB2AAXX080903:3:42:833:1839#0
-AAAAGCTATTACCTAAAACAATTTCACAGCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAAT
-+
-67777788888888888888888877776555243220100//,.'--,,+++*+())))()()((''&%"""##"
- at 30BB2AAXX080903:3:53:369:1855#0
-CCTAAAACAATTTCACAGCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAATTCTACCG
-+
-67777788888888888888888877776555443222100//..---,,++++*))))))))('(&$"#$&##"#
- at 30BB2AAXX080903:3:56:418:1180#0
-TAAAACAATTTCACAGCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTCTACTAC
-+
-67777788888888888888888877776555443222100//..----,++++**)))))(((((''$#&%%#"%
- at 30BB2AAXX080903:3:46:1017:165#0
-ACAATTTCACAGCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTCCCTCT
-+
-67777788888888888888888877776555443222100//.----,,+++***)))))))((((%$$##$$##
- at 30BB2AAXX080903:3:57:457:665#0
-CACAGCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTTCCTCTCTTTCCT
-+
-67777788888888888888888877776555443222100///.--,,-,++****)))*))((('&'"$""###
- at 30BB2AAXX080903:3:51:271:1380#0
-CCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTTCCTCTCTTTCTCCCTCTCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((((''$$#"%&#$%
- at 30BB2AAXX080903:3:46:1263:423#0
-AGTGGGAAGAAGAAAGAGAGGAAGTAAAGTTTAATTATGCCTTTTTGGGTTGAGGTGATGATGGAGGCTCTGTGGG
-+
-67777788888888888888888877776655443222110//.,----,+++**))**))((((('$$#""#"#"
- at 30BB2AAXX080903:3:36:1672:1516#0
-TCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTTCCTCTCTTTCTAGATCGCTACATANN
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))((((&$""$$""""
- at 30BB2AAXX080903:3:39:324:274#0
-AGGATGAGTGGGAAGAAGAAAGAGAGGAAGTAAAGTTTAATTATGCCTTTTTGGGTTGAGGTGATGACGGATGCAC
-+
-67777788888888888888888877776555443122020//..---+,+++**+*))))(((''(&$$""$"$#
- at 30BB2AAXX080903:3:2:1557:1454#0
-GTTAGGATGAGTGGGAAGAAGAAAGAGAGGAAGTAAAGTTTAATTATGCCTTTTTGGGTTGAGGTGATNTGTACGC
-+
-67777788888888888888888877776555423222.000....--,+,,+*****(*)(((((''"""""#"#
- at 30BB2AAXX080903:3:33:1648:1183#0
-CCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTTCCTCTCTTTCTTCTTCCCACTCATNCGCTACNN
-+
-67777788888888888888888877776555443222100//.----,,+++***))))))(((('"%"#$#%""
- at 30BB2AAXX080903:3:52:300:450#0
-ATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTTCCTCTCTTTCTTCTTCCCACTCATCCTTGACCTAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''""""$####
- at 30BB2AAXX080903:3:35:1368:1341#0
-TTCCCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCCGAGCAATCTCAATTACAATANATCATACN
-+
-67777788888888888888888877776555443222100//..---,,,+*+**)))))(((((&"&%&%###"
- at 30BB2AAXX080903:3:52:130:672#0
-CCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCCGAGCAATCTAGATCGGAAGAGCGGCTCAGCAG
-+
-67777/88888888888888888877776555443022100//.-+-,+,**'*)*'))((()((''$$#$"%#$#
- at 30BB2AAXX080903:3:47:281:1197#0
-GGTTGAACATTGTTTGTTGGTGTATATATTGTAATTGAGATTGCTCGGGGGAATAGGTTATGTGATTAATCTCACG
-+
-6777778888888888888888887777655'443221100//..---,,++++**))*))()((('"""#""#""
- at 30BB2AAXX080903:3:43:547:317#0
-TCACATAACCTATTCCCCCGAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACTCCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(((&&##%$"$"#
- at 30BB2AAXX080903:3:58:448:1757#0
-GGGCGTTGATTAGTAGTAGTTACTGGTTGAACATTGTTTGTTGGTGTATATATTGTAATTGAGATTGCAGCGATCN
-+
-67777788888888888888888877776555343222100//..---,,+++***))))))((('&&&%#""$#"
- at 30BB2AAXX080903:3:56:96:511#0
-CCCCGAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACTACTAGATCGGCTNGCTCGT
-+
-6777778888888888888888887777655544322210///..---,,++++**)))))((((''$""%%%%##
- at 30BB2AAXX080903:3:51:1374:267#0
-CCCGAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACTACTACTAATCAACGNCNATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''"$#"$"$#"
- at 30BB2AAXX080903:3:43:841:186#0
-GAAGGAGAGGGGTCAGGGCTGATTCGGGAGGAGCATATTGGTGCGGGGGATTTGTAGGATTATGGGCGTTGTGTGG
-+
-677777888888888888&888287777'55543"(0./0.+/&.-,,,(*,#+')&'&#%((('''$##$""#""
- at 30BB2AAXX080903:3:54:1409:1705#0
-GAAGGAGAGGGGTCAGGGGTGATTCGGGAGGGTCCTATTGGTGGGAGGGCTTTGTATGATTATGGGTGCGAGCACA
-+
-677777888888888888888828(777655'31/2)2.00-/$.%,'+,+))**'(*'(()(('''$#"#%%#$#
- at 30BB2AAXX080903:3:60:312:1326#0
-GAAGGAGAGGGGTCAGGGTTGATTCGGGAGGATCCTATTGGTGCGGGGGCTTTGTAAGATCGGAAGAGCGCNGANN
-+
-67777788888888888888888877776555443222100//..---,,+++*+)*))*(((((''&$%$"""""
- at 30BB2AAXX080903:3:8:1707:1664#0
-GAAGGAGAGGGGTCAGGGTTGATTCGGGAGGATCCTATTGGTGCGGGGGCTTTGTATGATTATGGGCNATCCAANN
-+
-6777778888888888882888887777655341321%100-/..-,-,,+)*+*)*)((()()('#"$##%"$""
- at 30BB2AAXX080903:3:55:462:1131#0
-AGGAAGCTGAATAATTTATGAAGGAGAGGGGTCAGGGTTGATTCGGGAGGATCCTATTGGTGCGGGGGCATTGACT
-+
-6777778888888888888888887777655544322/100//..---,,,+++****))((((''&"""%$$##$
- at 30BB2AAXX080903:3:39:1400:1385#0
-TTTAATAGTGTAGGAAGCTGAATAATTTATGAAGGAGAGGGGTCAGGGTTGATTCGGGAGGATCCTATTGTCTCGC
-+
-67777788888888888888888877776555443222100//..---,,++++***))))()&((''%%#$$#"#
- at 30BB2AAXX080903:3:51:117:880#0
-GCACCAATAGGATCCTCCCGAATCAACCCCGACCCCTCTCTCTCATAAATTATTCAGCTTCCTACTCCACGTCATC
-+
-+7777708888388888488828827776$561422-11/&)/-'-)+*%+)+)&''((&'&)'(&%$"#""#""#
- at 30BB2AAXX080903:3:34:1602:1855#0
-TCCTCCCGAATCAACCCTGACCCCTCTCCTTCATAAATTATTCAGCTTCACACACTCTTAAAAGATCNCTCTCGNN
-+
-6777718888888888888888887777:-3-.1323-100./#.,-*+$$++*))&'()'(('###"$"$#%"""
- at 30BB2AAXX080903:3:50:816:964#0
-GATGGGGGGGTGGTTGTGGTAAACTTTAATAGTGTAGGAAGCTGAATAATTTATGAAGGAGAGGGGTCGTCCAGCA
-+
-6777778/88888888(888888-77776555$42222100'..,--,,,++*+*)*))))(()((&$"""#""##
- at 30BB2AAXX080903:3:52:1384:1857#0
-TGACCCCTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCACCCCAGATCTGCCA
-+
-677(5088388188888888888871773550/42*1$100/---.--,,(*+'**'#)'#((#%%%"""&&%""#
- at 30BB2AAXX080903:3:38:208:1288#0
-GTGAAAGAGTATGATGGGGTGGTGGTTGTGGGAAACTTTAATAGTGTAGGAAGCTGAATAATTTAGATCGCAACAT
-+
-6777778888888888888888887777655,043'221&0//.--,,,,+++'**'*))))(((''%"#""###"
- at 30BB2AAXX080903:3:36:1039:1295#0
-CTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCACCCCATCATACTCTCTGTGN
-+
-67777788888888888888888877776555443222100//..---,,++++**)**)))))(''$&&$%%%#"
- at 30BB2AAXX080903:3:58:312:1709#0
-ATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGTGGTTGTGGTAAACTTTAATAGTGTAGGAAGCTGNATACNN
-+
-67777788888888888888888877776555543222&00./.',,,+,++***))))')()(((#%&"%$"#""
- at 30BB2AAXX080903:3:2:271:1903#0
-GGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGTGGTTGTGGGAAACTTTAATAGAGGAGATCGNCGANNTC
-+
-67777788888888888888'8.8.777655543%22+10-0/,.-)+,,++**)*)))')&'((&%%"#"#"""#
- at 30BB2AAXX080903:3:54:1619:660#0
-GGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGTGGTTGTGGGAAACTTTAATAGTGTAGATACAACATCCA
-+
-67777788888888888888888877776555443222100//..---,,(++***)))))(((''#$$&%%"###
- at 30BB2AAXX080903:3:44:1069:135#0
-GATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGGGGGGGGTGTGGGAAACTTTCACAGTCGGCAG
-+
-67777788888888888888888877776255441222100//.---&,,+*+*+*()#)'%((#(#""""%%""#
- at 30BB2AAXX080903:3:54:476:1819#0
-CACTATTAAAGTTTACCACAACCACCACCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCTCTCGCCTA
-+
-67777788888888888888888877776555443222100//...--,,,++****))())(((((""$%%$#""
- at 30BB2AAXX080903:3:48:318:1422#0
-TGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGGGGGGGTTGTGGTCGAAGCCTC
-+
-677777888888888888888818777765554432#2+-0//.,-.--,+++*&*)&))&((''('$"""###"#
- at 30BB2AAXX080903:3:44:1552:1847#0
-TAAAGTTTACCACAACCACCACCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCAC
-+
-67777788888888888888888877776550453222100//..---,-++++****)*)()(((&'#&&%%$#%
- at 30BB2AAXX080903:3:40:1399:1074#0
-TAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGGGAAAGAGTATGATGGGGTGGGGGGTGGTGTCGGTAC
-+
-677777888888888888888888777765554432221&0./..,-+,,+++***)'))(()'(('"$%&"#"##
- at 30BB2AAXX080903:3:47:1125:428#0
-TTTACCACAACCACCACCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCAGATCGGAGTTGTTAT
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))))((('&#"#""""#
- at 30BB2AAXX080903:3:38:981:596#0
-TTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGTGGTCTCATCTCA
-+
-67777788888888888888848897776555423222000/).,-,-+,,++**))*))')(#((%"%"&%$%$#
- at 30BB2AAXX080903:3:49:548:943#0
-GTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGTGGTGTCTCCGC
-+
-67777788888888888888888877776555443222100//-..--,,+,+***)))))(((''&"$"#"##"#
- at 30BB2AAXX080903:3:1:1177:1935#0
-GAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGNGCNACTC
-+
-67777788888888888888888877/76355443222/00//-.---,,-++**)))))))(('&'&""#""#"#
- at 30BB2AAXX080903:3:59:715:1055#0
-TGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGTGCATCCA
-+
-67777788888888888888888877776555443222100//..---+,,*+***)*))))(('''$%%$#"##$
- at 30BB2AAXX080903:3:41:1158:1111#0
-CAACCACCACCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAAGATCGGAAGAGGCTTCTC
-+
-67777788888888888888888877776555443222100//..-.-,,+++*****))))()((&'%"""#$#"
- at 30BB2AAXX080903:3:56:1714:605#0
-AACCACCACCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAAACCCACCAAACAAAACACA
-+
-67777788888888888888888877776/158/50200%&...--+--)),*+(&)$)))&'%'&'&%%%%$%$$
- at 30BB2AAXX080903:3:51:407:596#0
-GGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGGAAGAAGATCGGAAGGCTATAGTC
-+
-67777788888888888888888877776555023222100./..---,,)+%*+**)))(&)('''"$"""""##
- at 30BB2AAXX080903:3:57:1377:1215#0
-TTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAGGAGTATGATGGTGCACNCT
-+
-67777788888888888888868877756555441222000//(.(---,,+)*&)))#)#')('&&$%%$%$"#"
- at 30BB2AAXX080903:3:4:562:859#0
-CCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCNTCACNCN
-+
-677777888888888888888888777765754432211000.-.--,,,+**+***)()()((((#'"$#%$"#"
- at 30BB2AAXX080903:3:36:373:744#0
-TGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGCAATAGGTN
-+
-67777788888888888888888877776555443222100-/...--,,+++***)))%)((('''$$"#"""""
- at 30BB2AAXX080903:3:47:1645:1845#0
-TTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGCGCGCCGT
-+
-67777788888888888888888877776555443222100/...-,--,+++***))))')((((''#%"""#"#
- at 30BB2AAXX080903:3:46:1443:1289#0
-GTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGCGCCTGAGC
-+
-6777778888888/88888888887777654544322210///.,----,+++*)*)')*)((((('$"""""""#
- at 30BB2AAXX080903:3:4:1232:1142#0
-GTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGAGATCGGAAGAGCGNCTCTNCN
-+
-6777778888888888888888887777655544322210///,.--,,,++****)(***(((((#""#$#$"$"
- at 30BB2AAXX080903:3:36:487:919#0
-TACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCAAGACCTGCACACACN
-+
-67777788888888888&8888883/776550443021200/./,--,,+,++**)*))))()(('%$%%%$###"
- at 30BB2AAXX080903:3:43:577:655#0
-CATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGCG
-+
-67777788888888888888888877776555443222100//..---,,,++***)()))((('('$%#&#%$#"
- at 30BB2AAXX080903:3:3:1242:2005#0
-CACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCAAGACCTCAACCCCTGACCCNCACNNCA
-+
-677777888888888888888888777765554430010..//-.,,-+(+)+*'*)&*')(#%&''&"$%"""##
- at 30BB2AAXX080903:3:59:317:793#0
-ACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCAAGACCTCAACCCCTGACCCCCACCANNC
-+
-67777788888888888888888877776555443221100//..---,,+,++****)))((((('&$%###""#
- at 30BB2AAXX080903:3:36:678:1512#0
-GAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGGTCTGTGACGN
-+
-67777788888888888888888877476555423021100-//.-.-&,*+***+)*)))&&((#'&$&"##$#"
- at 30BB2AAXX080903:3:42:1717:975#0
-CAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))(('(&'$$&%%##"
- at 30BB2AAXX080903:3:39:1740:694#0
-TGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGGTTGGTGCGT
-+
-67777788888888888888188877276555142212000//.,---,+,+++*+)))()(&(('#$&#%""#"#
- at 30BB2AAXX080903:3:44:1057:981#0
-TGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGGGGTG
-+
-67777788888888888888888877776555443222100//..---,-+,+***)))()(()'('$&%&"$"#$
- at 30BB2AAXX080903:3:36:719:1454#0
-CTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGCAGGTTTCN
-+
-6777778888888888888888887775655543302.100//(.,--,,$**+'*&)))(()'&(&%$##"###"
- at 30BB2AAXX080903:3:38:1256:1995#0
-TCCTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTGCGATACACC
-+
-67777788888888888888888877776555443221100//...--,,++++**()))))'(('&$""""#"##
- at 30BB2AAXX080903:3:41:1234:732#0
-TCCTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGTGTGTAC
-+
-67777788888888888888888877776555443222100//...-,,,+++****))))()('%'&&#"#""""
- at 30BB2AAXX080903:3:54:1432:313#0
-ACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCAAGACCTCAACCCCTGACCCCCATAGCTCGTCAG
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()('''$$#&%##%#
- at 30BB2AAXX080903:3:37:458:1311#0
-GAGGAGTATCCTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGAGCTCTATCN
-+
-67777788888888888888888877776559445222000//..---,-+++**)))))))((('#"$#$"#"#"
- at 30BB2AAXX080903:3:57:987:166#0
-ACCCCACTAAAACACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCGGGATACTCCTCAATAGCAATACACCC
-+
-67777788888888888888888877776555343222100//..--,,,+++)**(*())((((('$""#$$###
- at 30BB2AAXX080903:3:43:1160:891#0
-ACAGCGATGGCTATTGAGGAGTATCCTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGAGGA
-+
-67777788888888888888888877776554543222101./..-,-,,,+))+***()&)'(#'''"&"&"$""
- at 30BB2AAXX080903:3:33:998:1792#0
-TACTACAGCGATGGCTATTGAGGAGTATCCTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTNTCATTCNN
-+
-67777788888888888888888877776555443222100//..---,,-++***(*)))((('('"%%"""#""
- at 30BB2AAXX080903:3:35:437:1613#0
-AAAACACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCAACAAACCNCCACACTN
-+
-6777-788088888888888888877776575443222100//.,-,--),,+***))(*())'(('"$$$%$$""
- at 30BB2AAXX080903:3:2:1206:2010#0
-ACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCCATAGATCGGAAGANACANCAC
-+
-6777778888888888888888887777655544222210/././.,-,++*****())(')(''('$""#"""#"
- at 30BB2AAXX080903:3:3:670:1119#0
-GGTTGTCTTTGGATATACTACAGCGATGGCTATTGAGGAGTATCCTGAGGCATGGGAGATCGGAAGACNGATCNAC
-+
-67777788888888888888888877776555442222001//.-.-,,,+++**+)*))()(('(&""##%&"##
- at 30BB2AAXX080903:3:57:1319:1123#0
-GATGGTTGTCGTGGGATATACTACAGCGATGGCTATTGAGGAGTATCCTGAGACAGGGGGGGCAGGTGTGNACACC
-+
-67777788888888888888,38877770545'42/21000-/.-.,-+,,,+*)#(*)(((%'('%'$#"%%"##
- at 30BB2AAXX080903:3:4:981:197#0
-GGGGGAATGATGGTTGTCTTTGGATATACTACAGCGATGGCTATTGAGGAGTATCCTGAGGCATGGGCNCATCNTN
-+
-6777778888888888888888887777655244351210///..-+-,++++*'&))())''((''""%""$"""
- at 30BB2AAXX080903:3:50:134:1742#0
-TAGGGGGAATGATGGTTGTCTTTGGATATACTACAGCGATGGCTATTGAGGAGTATCCTAGATCGGACGATTCACA
-+
-67777788888888888888888877776555443212100//..---,,+,+*+*)))()))'(''%$"#"#$$"
- at 30BB2AAXX080903:3:49:443:697#0
-TTTAGGGGGAATGATGGTTGTCTTTGGATATACTACAGCGATGGCTATTGAGGAGTATCCTGAGGCATGACACTAC
-+
-67777788888888888888888877776555443322100//..---,,++++****((()(((('%#"%&""##
- at 30BB2AAXX080903:3:47:371:1552#0
-AAATTAAAAAAACTATTAAACCCATATAACCTCCCCCAAAATTCAGAATAATAACACACCCGACCACCTCGCTACA
-+
-67777788888888888888888877776555443222011//..--,,,,++*****)(((()((&$"##$""##
- at 30BB2AAXX080903:3:50:721:698#0
-CTCCCCCAAAATTCAGAATAATAACACACCCGACCACACCGCTAACAATCAATACTAAACCCCCATACATAGGCAA
-+
-67777788888888888888888877776555443222100//..---,-+++*****))(((((('"$$#""#""
- at 30BB2AAXX080903:3:41:282:259#0
-TAAGCCTTCTCCTATTTATGGGGGTTTAGTATTGATTGTTAGCGGTGTGGTCGGGTGTGTTATTATTNTTGCTTAT
-+
-6777778888888888888888887777655544322210///...--,,,++**()*)))(()(('"&%%#%#"#
- at 30BB2AAXX080903:3:1:487:1508#0
-TAACACACCCGACCACACCGCTAACAATCAATACTAAACCCCCATAAATAGGAGAAGGCTTAGAAGAANACNCGAC
-+
-6777778888888888888888887777631244312.0/0...-.,,+,,****))))((()(''($"#""$""#
- at 30BB2AAXX080903:3:55:697:1702#0
-TGAGTGTGGGTTTAGTAATGGGGTTTGTGGGGTTTTCTTCTAAGCCTTCTCCTATTTATCGGGGTTTCTATGGCCG
-+
-677777888888888%8888888,777765550131'11#0-/-,.*,,,$**)&))&)#)((('%'&#""""$#"
- at 30BB2AAXX080903:3:58:1711:719#0
-TGCGAGAATAATGATGTATGCTTTGTTTTTGTTGTGTGTGGGGTGTGGAATGGGGGTTGTGGGGTGTCACCAACAN
-+
-67777788888888888888$8887777)55544%222100//,.'-)%(+,+***())())((((%$$#%%$$$"
- at 30BB2AAXX080903:3:44:1661:724#0
-GAAGAAAACCCCACAAACCCCATTACTAAACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCCCGCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*)((('('%&&%"$%""
- at 30BB2AAXX080903:3:38:1109:476#0
-TAGTCCGTGCGAGAATAATGATGTATGCTTTGTTTCTGTTGAGTGTGGGTTTAGTAATGGGGTTTGTTGGTACGAC
-+
-67777788888888888888888877776555443222100./..---,(+++***)))))(%('''""#"""""#
- at 30BB2AAXX080903:3:36:1727:1255#0
-GTGGTTGTAGTCCGTGCGAGAATAATGATGTATGCTTTGTTTCTGTTGAGGGTGGGGTTAGTAGATGNGTCGACNN
-+
-67777788888888888888888877776555443222100/....--,,(++***&))()(((('#"""$"""""
- at 30BB2AAXX080903:3:53:377:622#0
-CCCCATTACTAAACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCAAGATCGGAAGAGCGNGCCCTC
-+
-67*77788888888888888888877776555443222100///.----,+,++**)*))))((('&&"""##""#
- at 30BB2AAXX080903:3:56:1101:544#0
-TCATTGGTCGTGGTTGTAGTCCGTGCGAGAATAATGATGTATGCTTTGTTTCTGTTGAGTGTGGGTTTTGCATACT
-+
-67777788888888888888888/7777627544322211///-.---,,+++***)))())()'%'"%%##""#"
- at 30BB2AAXX080903:3:40:628:1779#0
-ATCATTGGTCGTGGTTGTAGGCCGTGCGAGAATAATGATGTATGCTTTGTTTCTGTTGAGTGTGGGTAGAGTCTGC
-+
-67777788888888888888$888.77765504032211000/..---,,++****)*()))((('%$%##$#"$#
- at 30BB2AAXX080903:3:40:1313:293#0
-TAAACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTAAAACCACGACCAATGAGATCGAC
-+
-67777788888888888888888877776555443222200//..---,,+,+***)*)))((((('$$%#"#"##
- at 30BB2AAXX080903:3:59:414:1767#0
-AAACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAATGATGACGNNA
-+
-67777788888888888888888877776555443222100//...----+++*+***))))((((&&"%"$"""#
- at 30BB2AAXX080903:3:52:416:608#0
-CACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAAGATCGGAAGCGGGGTGTG
-+
-67777788888888888888888877776555443222100//./----,+++*+****))(((((($$"""""""
- at 30BB2AAXX080903:3:41:1146:1701#0
-ACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAATGAAGAGCGGCACAGACAA
-+
-6777778888888888828888887777655342302210///.,---,,,++)')*'))))(#&('$&"$""$$$
- at 30BB2AAXX080903:3:46:1012:269#0
-CAACGATGGTTTTTCATATCATTGGTCGTGGTTGGAGTCCGTGCGAGAATAATGATGTATGCTTTGTTGCGTACGG
-+
-67777788888888888888888878)7*55'44*'20000)//.--,,*,+)+***()))&%((('"$$"""###
- at 30BB2AAXX080903:3:58:407:1023#0
-ACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAATGATATGAAAAACCAGCGTATTCA
-+
-67777788888888881888888877770555443221100./,.--,+-++***)*()')((''('$"%%#""##
- at 30BB2AAXX080903:3:48:1175:103#0
-ACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAATGATATGAAAAACCATCGTTAGTCCACTAT
-+
-677777888888888888888888777765554432221-0//..-,-,,+++**))))*)((('''$#####"#"
- at 30BB2AAXX080903:3:46:355:658#0
-AAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAATGATATGAAAAACCATCGTTGTAGTTACCATA
-+
-6777//08//888&8888888828777365.644232110/--,-+,-,-+'+*(*)()(')(((''$"#$##""#
- at 30BB2AAXX080903:3:36:768:1852#0
-CATACATCATTATTCTCGCACGGACTACAACCACGACCAATGATATGAAAAACCATCGTTGTATTTCACCTACANN
-+
-67777788888888888888888877776555443222100//..---,,+++****))))))('''$$%##%#""
- at 30BB2AAXX080903:3:49:1768:1457#0
-CTTGTAGTTGAAATACAACGATGGTTTTTCATATCATTGGTCGTGGTTGTAGTCCGTGCGAGAATAATCGTTACAT
-+
-67777788888888888888888877776555443222100//..---,,++*)*)))))))(((('"#"#""##"
- at 30BB2AAXX080903:3:59:154:426#0
-ATTGGGGTCATTGGTGTTCTTGTAGTTGAAATACAACGATGGTTTTTCATATCATTGGTCGTGGCTGTTGTGCNNA
-+
-67777785888888888.8888887/776453243122000/'.---,,,+)*)*)*('&('((#''%"&""#""#
- at 30BB2AAXX080903:3:58:794:1427#0
-TTTGCGTATTGGGGTCATTGGTGTTCTTGTAGTTGAAATACAACGATGGTTTTTCATATCATTGGTCGTGTGACTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$&%"""$#$
- at 30BB2AAXX080903:3:53:930:1485#0
-TAATTTTGCGTATTGGGGTCATTGGTGTTCTTGTAGTTGAAATACAACGATGGTTTTTCATATCATTGGTGTTTCG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))()(('$%##$"###
- at 30BB2AAXX080903:3:41:1378:1138#0
-ATTTTATTAGGGGGTTAATTTTGCGTATTGGGGTCATTGGTGTTCTTGTAGTTGAAATACAACGAGATAGTGCGCT
-+
-67777788888888888888888377776555413222100/..----,,+,+****)))))()(('""%#$"""#
- at 30BB2AAXX080903:3:4:1709:1062#0
-TTAATTAATTTTATTAGGGGGTTAATTTTGCGTATTGGGGTCATTGGTGTTCTTGTAGTTGAAATACCNCGACNCN
-+
-67777788888888888888888877776555443222100//..--,,,+++****)))))(((('""%$&%"""
- at 30BB2AAXX080903:3:42:1230:1821#0
-GGTCGATGAATGAGTGGTTAATTAATTTTATTAGGGGGTTAATTTTGCGTATTGGGGTCATCGGTGTTCTTGTGGT
-+
-6777778888888888888888887777655544322200/0/..---,,,++***)(**)#(((''&&%%%%""#
- at 30BB2AAXX080903:3:33:761:934#0
-GAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGAGGGCGAAGATCGGAAGAGCGNCCACTGNN
-+
-67777788888882888888888377176552,43.22110)//.-$-,&(+'*+)'#))%'(&(&'"$##$""""
- at 30BB2AAXX080903:3:1:556:1495#0
-AATTAATTAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCNCCNCACT
-+
-6777778888888888888888886777655544031-.0/-+.,-,,-+++**+))((('((%''%'"##"$"$"
- at 30BB2AAXX080903:3:53:398:112#0
-CAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGAGGTCGAGATCGGAAGAGTCTATACA
-+
-677777888888888888888888777765/54432221/0//..,--,,,++&**'))'(()#'(%"$"#""###
- at 30BB2AAXX080903:3:53:995:1722#0
-CAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGAGGTCGATGAATGAGTGNTTGGATAG
-+
-67777788888888888888888877776555343222100//...--,,+++***(*)()))((''""%%&#"##
- at 30BB2AAXX080903:3:36:1566:495#0
-TAATTAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACCACACNN
-+
-67777788888888888888888877776655441222000//.-----,+++****))('(()(('&$##&"#""
- at 30BB2AAXX080903:3:54:1293:1705#0
-TAATTAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCCTCACCTGG
-+
-6777778888888888888888807/+7255621522-0////./,*-,,-+++**))(((()(#(&"""###"""
- at 30BB2AAXX080903:3:46:98:802#0
-ATTAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCCCGGCG
-+
-67777788888888888888888877776555443222100//..---,,+++****))*)((((''"$$#$%###
- at 30BB2AAXX080903:3:2:647:98#0
-TAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCNCGCACCC
-+
-6777778888888888843/8888977715558/32/10..-..,,--+,,++*))*))'(((('(%&"%&%$$##
- at 30BB2AAXX080903:3:58:1268:216#0
-TAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTCTGNNA
-+
-67777788888888888-88888577716/52113.2201/./..--,,,++++**)*)()((((('&$##""""#
- at 30BB2AAXX080903:3:44:1572:680#0
-AACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCC
-+
-67777788888888888888888877776555443222100//..----,+++**+)**)))(((((%$%&$%#""
- at 30BB2AAXX080903:3:54:187:1498#0
-CAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGAGGGCGGCGAATCAG
-+
-67777788888888888888888877776555443222100-//.---,,+++***&))))&)('%'&$#""%#"$
- at 30BB2AAXX080903:3:54:1200:226#0
-TCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCATGCAGTC
-+
-67777788888888888888888877776555443222100//...-+,,,++++*)*)))((((('%"#&&"#$#
- at 30BB2AAXX080903:3:46:299:1138#0
-ATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCAGATCCATACCC
-+
-677777888888888888888888777765523432/11/0//..-,-,+,)+**)))('(%(('('""$""###"
- at 30BB2AAXX080903:3:51:1187:805#0
-ATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGGCCGCGC
-+
-67777788888888888888888877776555443221100//..----,+++**)*)))(((((('"""#"#""$
- at 30BB2AAXX080903:3:55:1268:579#0
-GATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGAGGGCGCTCATT
-+
-67777788888888888888888877776552443222100//.----,,++++**)))()((((''""#"$"#""
- at 30BB2AAXX080903:3:51:125:1186#0
-GGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGGAGATCGCAGCACGGC
-+
-6777778888888888+888888877776+55,43222,10//..+-,+,)++**))*))((((#''$%"$#$#"#
- at 30BB2AAXX080903:3:56:1457:531#0
-TCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCACTACCAA
-+
-67777788888888888888888877716553443.22100//.---*,,,++**)*()(*(((((''%$#""#""
- at 30BB2AAXX080903:3:1:453:259#0
-CATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCAGATCGCNCCNCTCT
-+
-67777788888888880888*88877776/6521320210/0..,+,,+,*))()))())((('(&'""$%"####
- at 30BB2AAXX080903:3:39:381:1474#0
-GAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATAGATCGGAACAGCAGCGC
-+
-67777788888888888888888877776555443222200//..---,-++)***)**)))(((('&$##"##"#
- at 30BB2AAXX080903:3:4:1057:1598#0
-GAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGANACTANCN
-+
-6777778888888888888888787777655544322210/....-.*,*,+'***(())(((((('"""$"#"""
- at 30BB2AAXX080903:3:4:110:587#0
-ATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTAGACNTGACNAN
-+
-67777788888888888888888877776555443022100./.---,,-,++**)**)()(()(('%"""##"""
- at 30BB2AAXX080903:3:1:948:201#0
-GGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTCTCATCATGCGGAGATGTTGGATGGGGGGGGGNGCNACGT
-+
-677777888888888888888888777765255433022/0../.---,,+,+****())))(#(('"""#""#""
- at 30BB2AAXX080903:3:57:819:2041#0
-TCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATACTCCA
-+
-6777778888888888888888887777:555443222100//..---,,,+******)))(()((''%"%%###"
- at 30BB2AAXX080903:3:51:327:681#0
-TGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGGGGGCGCACACA
-+
-67777788888888888888488877-765554102%11/,//.,-.-,)+*+*'**)(()((((('$#"#"%"##
- at 30BB2AAXX080903:3:55:1014:1114#0
-TGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGGCGCGTG
-+
-677777888888888888888888774765554432111/0//.--,-,,+++***))())()((''%$""#%""#
- at 30BB2AAXX080903:3:36:1314:919#0
-TTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTACCTCCGCN
-+
-67777788888888888888888877775555443122100//..---,,+*+*+*)*))))((('#"$""$#"#"
- at 30BB2AAXX080903:3:53:779:1012#0
-TTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGCCGGGTC
-+
-6777708888288888880888-877174555./3300.0/-.---,-+-,*+))*()))'(((((#$"#"#"""#
- at 30BB2AAXX080903:3:35:351:1853#0
-GATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGNATGCATGN
-+
-6777778888888888888808887777655534032110&//,--,--,+++***()*)()((('&"#""###""
- at 30BB2AAXX080903:3:48:1717:1752#0
-GATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGAAGTTGGATGGGGTGGGGGCG
-+
-60777788888888888888884/7777650534522100-%/+,.,,-,+,+'**#*#)((&((('&""""""##
- at 30BB2AAXX080903:3:2:1455:756#0
-CTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTNAAACTAC
-+
-677777888888888888888888777763554332200//0/...-,,,+,+++)(()((()'('&&""""###"
- at 30BB2AAXX080903:3:3:1460:962#0
-TCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCNACCANCC
-+
-6777778888888888888888887767955544332110///..,,-,,++++)*)()(')&''''%"##"#"#"
- at 30BB2AAXX080903:3:44:1246:1249#0
-TGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTAGATCGGGGGGA
-+
-677777888888888888888888777765554432221000/.----+,,++***)))))((((('"%&%$""""
- at 30BB2AAXX080903:3:38:62:786#0
-CCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCACCTCACCAC
-+
-67777788888888888888888877776555443222100//..---,,++*****))))))(((&$#""&%###
- at 30BB2AAXX080903:3:59:1462:766#0
-AGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGCACCAAANCA
-+
-67777788888888888888888877776555443222110//..-,-,,+++***))))))()'(#$%%%%$"#$
- at 30BB2AAXX080903:3:45:131:984#0
-TAGTACTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGCGAGCCGAAGTTTCATCATGCGGAGATGTTGGCG
-+
-6777778888888888/88888887777655544/22,101/&.---&,,++*%*))*()((#(('&$#$"#$$#$
- at 30BB2AAXX080903:3:1:136:1103#0
-TGGCTAGGAATAGTCCTGTGGTGATTCGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCACNAANCCTA
-+
-67777788888888888888888877+76555443222000/.--,,,,,++****())(()('(''$""#"$#"#
- at 30BB2AAXX080903:3:41:406:1926#0
-CATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCCTCCGCAC
-+
-67777788888888888888888877776555443221100//.--,,,,+++***)))))(((((&&"%#""#"#
- at 30BB2AAXX080903:3:49:1066:1146#0
-TGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTCTCAAGTG
-+
-67777788888888888888888877776555443222100//..-,-,,,++*)*))))')('('&&$"$"""#$
- at 30BB2AAXX080903:3:53:105:1225#0
-TGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGGGAGCCGAAGTCNATTGTCT
-+
-67777788888888888888888877756555443221110/.,.-,-+,(*+*)*&)&)&((%#(#$""""""#"
- at 30BB2AAXX080903:3:43:1024:1353#0
-ATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCACTAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('%&%&%%###
- at 30BB2AAXX080903:3:38:1055:423#0
-AGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCCAAGCGTGT
-+
-677777888888888888888888777765554432220000//.---,,,++***)))()((('('$%&$$"$%"
- at 30BB2AAXX080903:3:1:646:1533#0
-GAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATCNCCNCATC
-+
-6777778888888888888888887777655544322010././.---,,-,++**)))))()((('"""$"""#%
- at 30BB2AAXX080903:3:36:496:476#0
-TGAGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCTCACGATN
-+
-67777788888888888888888877776555443222100//..---,,+++*****))))(('(&%##"#""""
- at 30BB2AAXX080903:3:44:243:1264#0
-TTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCACTACTCACCAC
-+
-67777788888888888888888877776555443222100//..---,,++++**))))))()((''&&&%%%$#
- at 30BB2AAXX080903:3:40:365:427#0
-CGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCACTACNCCACACAC
-+
-67777788888888888888888877776555443222100//...--,,+++++**)))))()(('"$%&%%#$"
- at 30BB2AAXX080903:3:34:881:111#0
-GGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCAGATCGNCCCGTGNN
-+
-67777788888888888888888877776555443220100//..--,,,+++****)))(((('('"&$$""#""
- at 30BB2AAXX080903:3:3:976:717#0
-GTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATAAGGCAGGGNACCTNTC
-+
-677777888888881888388+88777795+54302011(./...-*-,++,+****)(#'(('''&""#&$"""$
- at 30BB2AAXX080903:3:40:700:1850#0
-GGTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGCTCGGAAAC
-+
-67777788888888888888888877776555443222100//..---,-+++***))))()((((&&%%%%""##
- at 30BB2AAXX080903:3:43:882:461#0
-GGTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGAGCAGGCAGGTGGCCGGT
-+
-6777778888828888888&88&8777+657541323210/./.,--+,,(++**(*)))&(('&&'&"%"##"#"
- at 30BB2AAXX080903:3:48:396:1231#0
-CGGTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGGCTNAGC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))))('('&""#"""##
- at 30BB2AAXX080903:3:54:1288:1637#0
-TGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCACTACTCACCAGACGCCTCAACCGCCTCTTCAC
-+
-677777888888888888888888777765554432210/0/..----,-,+++****)))))((''$&%$%$$#"
- at 30BB2AAXX080903:3:43:552:720#0
-GCGATTGATGAAAAGGCGGTTGAGGCGTCTGGGGGGTAGTGCATGGCTAGGAATAGTCCTGTGGGGATNTTGGGAG
-+
-6777778888888888888/8888727+6555'4(2-2100..---,++,+&+)**((())(((&'#&"#"#$$#"
- at 30BB2AAXX080903:3:33:1667:1842#0
-GTGGGCGATTGATGAAAAGGCGGTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCCTGTGNGTCCTCNN
-+
-67777788888888888888888877776555443212/0.//..,--,,+++**))*))('(((&&""$$$"#""
- at 30BB2AAXX080903:3:37:1351:470#0
-CAAATCACCACAGGACTATTCCTAGCCATGCACTACTCACCAGACGCCTCAACCGCCTTTTCAGATCNGGAGCACN
-+
-67777788888888888888888877776555443222100//..---+,,*+****())*)()(''"&$%&%#$"
- at 30BB2AAXX080903:3:46:818:2003#0
-GATGTGGGCGATTGATGAAAAGGCGGTTGAGGGGTGTGGTGGGTAGTGGATGGGTAGGGATAGTTCTGGGTGGCAC
-+
-67777788888888888888888077%76+75(4-$2*0&.)/().),'$+,*')%()&(&#'###'&""""##""
- at 30BB2AAXX080903:3:1:999:892#0
-GTGATGTGGGCGATTGATGAAAAGGCGGTTGAGGCGGCTGGTGAGGAGTGCATGGCTAGGGATAGTCCNTGNTAGA
-+
-6777778888888888888888187777254044-5$,/00-/+.',,$,((++***(()#('(''%""$"""#""
- at 30BB2AAXX080903:3:35:1548:577#0
-GTGATGTGGGCGATTGATGAAAAGGCGGTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCNTGGTGTAN
-+
-677777888888888888888888777745524432-1000%/+.)--),()++*())))#)&((#'"$%$%%$#"
- at 30BB2AAXX080903:3:54:14:1185#0
-ACCACAGGACTATTCCTAGCCATGCACTACTCACCAGACGCCTCAACCGCCTTTTCATAGATCGGGAGCGCGCTCT
-+
-677777888888888888888888777703,544322010,/)-).,--,+**$*)(*))('%((#%$$#"#"##"
- at 30BB2AAXX080903:3:56:1070:843#0
-CGTCTCGAGTGATGTGGGCGATTGATGAAAAGGCGGTTGAGGCGTCTGGTGGGTAGTGCATGGCTAGGGCTGCTCA
-+
-677777888888888888888888777763554432%2100/..+,,-,(+&+&*+(*&&(((%''#&##&"$##"
- at 30BB2AAXX080903:3:48:890:1412#0
-GACTATTCCTAGCCATGCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCAGATCGGTCAC
-+
-67777788888888888888888877776555443222100//..---,,++****))))()(((('$#%%""$##
- at 30BB2AAXX080903:3:8:1685:1928#0
-CTAGCCATGCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGNAAACACNN
-+
-67777788888888888888888877776555443222100//..---,,+++**)*))())(((('"&%%%%"""
- at 30BB2AAXX080903:3:37:1602:2012#0
-GCCATGCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCAGATCGGAAGACCACCAN
-+
-6777778888888888888888887777655584322210./...-.,,,,+++**))))(()(''%"""$#$#""
- at 30BB2AAXX080903:3:50:1362:1019#0
-CATGCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATAAAGGATAC
-+
-67777788888888888888888677176555-43220//0//...-,-,,+++**))))))''(''"""""""$#
- at 30BB2AAXX080903:3:43:1127:2005#0
-GCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGTCGTCTA
-+
-67777788888888888888888877776555443222100//..----,+++*****)*)((((('&&""""#"#
- at 30BB2AAXX080903:3:59:1134:558#0
-GCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGGTCACAC
-+
-67777788888888888,8888887774)5554232222//...-*--,,,*+***)()(')(((''&$%##%%$$
- at 30BB2AAXX080903:3:45:1041:389#0
-TACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGTAGCTCTG
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))(((((&'$"#&""""
- at 30BB2AAXX080903:3:60:1180:1589#0
-GGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGAAAAGGCGGTTGAGATTGGCAGAACCNN
-+
-67777788888888888888888877776555443222100./..---+-,++*)*)&)'((&(##'$&#""#"""
- at 30BB2AAXX080903:3:58:1528:611#0
-CTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGACACAACATN
-+
-67777788888888888888888877776555443222100//..---,,++++*+)))))(((''&$$%&$$%#"
- at 30BB2AAXX080903:3:47:1577:775#0
-ACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAAGATCGGAAGAGCGGTGCATCCA
-+
-67777788888888888888888877776545443222001/....--,-++*+**'))))))((&'%#"%"####
- at 30BB2AAXX080903:3:55:797:1648#0
-GTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGAAAAGGCGGGTGGGGTGCCAGCA
-+
-677777888888888888888888777765554/3222100//.----,,+++**)*))()('('#%'#$$"""##
- at 30BB2AAXX080903:3:2:40:990#0
-CCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCAGNGCANNCA
-+
-67777788888888888888888677736559445121111//.--,,,-+,+***))*())(((''$""""""%#
- at 30BB2AAXX080903:3:37:974:767#0
-CCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCCCCGCN
-+
-677777888888888888888888777765554432201011/.,-+,,)+,***))))))'(('&#"$$""%##"
- at 30BB2AAXX080903:3:38:1289:57#0
-GGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGAAAAGGCGGGTGGTGGGACANN
-+
-67777788888888888888888877776555442212010//..-----+++**+(**))()&'(&$'"#"##""
- at 30BB2AAXX080903:3:3:1457:1469#0
-AGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGAAAAGGCGGGTGANCGCANAC
-+
-6777778888888888888888887777655584322/101/...,*,,++,+**+()))((((##'""%"$#"#$
- at 30BB2AAXX080903:3:50:1097:629#0
-AGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATACCGGAATTC
-+
-67777788888888888888888877776555443222100//./---,,+++***))))))()'(($""""#"##
- at 30BB2AAXX080903:3:43:216:533#0
-GAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATAGATCGGAAGAGGGGGTTAG
-+
-677777888888888888888888777765554432201/0//.----,,,++*+**)*))(((('''$&%""""#
- at 30BB2AAXX080903:3:41:282:1362#0
-CTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACNTTNGNGCA
-+
-677777888888888888888888777765554432321000...---,,,++****)))(((((''"%&"""%$#
- at 30BB2AAXX080903:3:54:953:1565#0
-TCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAAAGATCGGAAGAGCTGTCCACA
-+
-67777788888888888888888877776545803220000/./.--,,,,++&*))*)&'(%((''$""##"#$#
- at 30BB2AAXX080903:3:60:1056:1106#0
-TCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGGAAATTATGGCTGAATCATCCGCTACCGACACAANN
-+
-6777778888888888888588$80777630332302.+0$//.---,+,+++)*)')&((('''#'$""$$##""
- at 30BB2AAXX080903:3:33:213:794#0
-ATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGAANACCATANN
-+
-6777778888888,888888888877776545443222100//..,-,,,,+****'))))(((('&"$"#"""""
- at 30BB2AAXX080903:3:36:238:1812#0
-CATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGTGTACTCANN
-+
-677777888888888888888882777765554422222/00..--,-+,+,+***)()(()((('%%#"#"##""
- at 30BB2AAXX080903:3:54:1442:1840#0
-GCCATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGACAGGGTA
-+
-67777788888888888888888877776554443222100+/.---,,,++****)))#)&()(&'$$&%#&###
- at 30BB2AAXX080903:3:59:900:93#0
-AGGCGCCATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGAGTGCGAGNNC
-+
-677777888888888888888888777765554432221/////-,-,,,++**'*)*)())((('#'$#&#"""$
- at 30BB2AAXX080903:3:56:156:191#0
-TGAGGCGCCATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGGGATGTGGGCGATACGCCAC
-+
-677777888888888888888848777725504432201&.+/.,-+,-,+*+*'*%)&()()((#'%"""$####
- at 30BB2AAXX080903:3:3:1093:892#0
-TCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATGCNTCATNCG
-+
-67777788888888888888888877776555443222/00/..,-.-+,*+**))*()('((('%'&""##$"#"
- at 30BB2AAXX080903:3:8:1655:1637#0
-CATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATAANTACAAGNN
-+
-6777778888888888888888887777655544322210//./.---,-++***))()(()(''(%""$#"#"""
- at 30BB2AAXX080903:3:47:864:1648#0
-ATTGAGGCGCCATTGGCGTGAAGGGAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGGTGTGGGACAGCAACA
-+
-677777888888888888888888477765504432.01-1..-----,*,*')('#)')#((#'&%"$"###"#"
- at 30BB2AAXX080903:3:58:1610:1538#0
-GAATATTGAGGCGCCATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGCACAACCAN
-+
-6777778888888888888888887777655544322210.///,---,,+++***))))&()(''%$$%"$$%$"
- at 30BB2AAXX080903:3:40:354:659#0
-CCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATGGCAGATCGGACGAGTGCGC
-+
-67777788888888888888888877776555443222100//-.---,-++++**))*)))(((('%#$#"#""#
- at 30BB2AAXX080903:3:49:1720:353#0
-ACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTACGTGTCCTC
-+
-6777778888388888848888887777655544322110///..,-+-,+++****)*))((((('$""#"####
- at 30BB2AAXX080903:3:35:1608:904#0
-CTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTATNTGCACTGN
-+
-67777788888888888888888877776555443222100//..*--,,++++*))*))))(((''"$#$##"#"
- at 30BB2AAXX080903:3:33:656:296#0
-CGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCGCGCCAATGGCGCCTCAATATTCTTTATCTNACTACANN
-+
-67777788888888888888888877776555443221100/------,,,++***))*))))((''"%$""#"""
- at 30BB2AAXX080903:3:38:1790:1349#0
-AGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTATCTGCCTCTTTCNN
-+
-67777788888888888888888877776555443222100//..---,,,,*+*))*)))(((((&$"&%%"$""
- at 30BB2AAXX080903:3:3:1029:184#0
-ATTATGGCTGAATCATCCGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTCNTCACNGN
-+
-6777778888888888838888387777454144322-1.-/...---,++++**)*)'()(()&''%""&$$"""
- at 30BB2AAXX080903:3:49:1727:1150#0
-CCTCGCCCGATGTGTAGGAAGAGGCAGATAAAGAATATTGAGGCGCCATTGGCGTGAAGGTAGCGGGAGACAAAAA
-+
-67777788888888888888888877776555443222100//...---,+++***)*))'))('''$$%"&%%#%
- at 30BB2AAXX080903:3:49:1183:414#0
-GAATCATCCGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCCACACAC
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))()((('"$#"$####
- at 30BB2AAXX080903:3:3:1671:781#0
-AGGCCTCGCCCGATGTGTAGGAAGAGGCAGATAAAGAATATTGAGGCGCCATTGGCGTGAAGGGAGCCNATCTNCN
-+
-67777788888888888888888877776555443222100//..-,-+,,+***))'*'()(%''#""#%"%"""
- at 30BB2AAXX080903:3:44:1507:880#0
-TAATATAGGCCTCGCCCGATGTGTAGGAAGAGGCAGATAAAGAATATTGAGGCGCCATTGGCGTGAAGGAGGGACA
-+
-67777788888888888888888877776555443222100//..---,,++++***))))((('''&&"#$""""
- at 30BB2AAXX080903:3:1:999:1009#0
-CGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGATCGNCGNCACA
-+
-67777788888888888888888877776-5544321220//0-,--,+,,++*+*)*()')(('%'%"#""$##"
- at 30BB2AAXX080903:3:54:935:1115#0
-GATCCGTAATATAGGCCTCGCCCGATATGTAGGAAGAGGCAGATAAAGAATATTGAGGCGCCATTCGAGACGCCCC
-+
-67777788888888888888888897146+254$3212100/.+-'--,,+,*++**)((('('(&'&"%%&#""$
- at 30BB2AAXX080903:3:43:395:326#0
-ATGATCCGTAATATAGGCCTCGCCCGATGTGTAGGAAGAGGCAGATAAAGAATATTGAGGCGCCATTGGCGTGAAG
-+
-677777888888888888888888774765554432121000..----,,+*+++)**))(('('#'''%&"$"##
- at 30BB2AAXX080903:3:37:823:233#0
-GCCAATGGCGCCACAATATTCTTGATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACGGATCATTTCTTN
-+
-67777788888818888888888+77776525443221100//...--,,+++*+)**)(()(('('%#$#$%#""
- at 30BB2AAXX080903:3:54:1247:984#0
-AATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACGGATCATGTCTCTCCC
-+
-67777788888888888888888877776555143222000//..--,,,+++***())))((((('$$"&%%###
- at 30BB2AAXX080903:3:40:84:1261#0
-ATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACGGATCATTTCTCTACTCAGAAGCATCTATA
-+
-67777788888888888888888877776555443211100//..,--,,**+**)))))((()(('$$#"#""""
- at 30BB2AAXX080903:3:38:1473:997#0
-CTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACGGATCATTTCTCTACTCAGAAACCTGAAACATCGTCCAC
-+
-67777788888888888888888877776555443222100/...---,,-+****)))()((((''$#$%""#$%
- at 30BB2AAXX080903:3:40:1525:1930#0
-TCTTCCTACACATCGGGCGAGGCCTATATTACGGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCAC
-+
-67777788888888888888888877776555443222100//....-,,+,+***)))))(((''('$%&#%$""
- at 30BB2AAXX080903:3:50:1162:2045#0
-GGAGGATAATGCCGATGTTTCAGGTTTCTGAGTAGAGAAATGATCCGTAATATAGGCCTCGCCCGATGCAGCGGCC
-+
-67777788888888888888888877776555443222100//.-.--,,+++****))))((('('$$""#""##
- at 30BB2AAXX080903:3:51:848:510#0
-TGCAAGCAGGAGGATAATGCCGATGTTTCAGGTTTCTGAGTAGAGAAAAGATCCGTAAGATCGGAAGGGCACACGG
-+
-67777788888888888888888877776555%43222/00//..---$,,++***)*))(('(('&""#"###""
- at 30BB2AAXX080903:3:44:625:415#0
-CGAGGCCTATATTACGGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCAGATCGGAAGAGCGGCTA
-+
-67777788888888888888888877776555443222100//..-.-,,+++++***))))(((''$"$%&$"$#
- at 30BB2AAXX080903:3:56:1115:697#0
-ATATTACGGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCGACCACC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$'"####"#
- at 30BB2AAXX080903:3:43:227:1084#0
-TACGGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAGATCGGAACA
-+
-677777888888888888888888777765554432.2100/..-.--,+,,++*+)))))))((''&&&%&#%"%
- at 30BB2AAXX080903:3:50:1546:1294#0
-TATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGATGTTTCAGGTTTCTGAGTAGAGACNCGCGTCG
-+
-6777778888888888888888887777655544222'10///..-,-,,+++%+*'*)'*'(((('""%$"""#"
- at 30BB2AAXX080903:3:37:1188:1877#0
-GGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGACTACAGCN
-+
-67777788888888888888888877776355443212100./.---,,,++***))*)))()('''"$%"$%"#"
- at 30BB2AAXX080903:3:59:956:555#0
-CATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAAGATCGGGTACTGC
-+
-67777788888888888888888877776555443222100/../.--,,+++*+)*)))((((((''%"###""#
- at 30BB2AAXX080903:3:37:1490:155#0
-ATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGCCANN
-+
-67777788888888888888888877776555443222000//..----,++++**)*))))()#('%$%&#$$""
- at 30BB2AAXX080903:3:34:1732:1649#0
-TCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATANCACATCNN
-+
-67777788888888888888888577776555443222100//..-.-,,++++****))))(((('"$%&#"%""
- at 30BB2AAXX080903:3:2:1628:171#0
-GGACATAGCCTATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGATGTTTTAGGGTTTCNCGACGCA
-+
-677777888888888888888888377765/54&322.000./.),---,$$+)**#((%'&&(''%%"##"#"##
- at 30BB2AAXX080903:3:48:548:708#0
-GGGAGGACATAGCCTATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGGTGTTTCTGGTTTTCGGGG
-+
-677777888848.888888888887777).3544022..00+...'--,&,,**#))'()#((##''""""%"#""
- at 30BB2AAXX080903:3:55:740:2013#0
-CGGGAGGACATAGCCTATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGATGTTTTATGTCTCTTCT
-+
-67777788888888888888888877776452443222200/++.-,-,,+*+)+#)*)()#('#%#'&#$#$"#"
- at 30BB2AAXX080903:3:46:663:205#0
-TCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGGTCACGTCT
-+
-67777788888888888888888877776552445222010/..---,,,,++*(**))(()('('%$"#""###"
- at 30BB2AAXX080903:3:41:536:2037#0
-TCACGGGAGGACATAGCCTATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGATGTTTCAGATACAT
-+
-67777788888888883188888877776555143212000-...+,-,++,#()*)*&')')((#(%"""""$#"
- at 30BB2AAXX080903:3:1:453:1068#0
-GCCTCACGGGAGGACATAGCCTATGAAGGCTGTTGCTATGGTTGCAAGCAGATCGGACGAGCGGCTGTNTGNTATA
-+
-6777778888888888/)8808-8724763$5/4.21-/')'&-',+-,,+)#*)(#$##'&'(#'&""#""##""
- at 30BB2AAXX080903:3:40:1243:997#0
-ATTTGGCCTCACGGGAGGACATAGCCTATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGATGTTTT
-+
-67777788888888888888888877776555443222100/...---,,+++***)*))((((((#''"%%#"""
- at 30BB2AAXX080903:3:36:609:1060#0
-ACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGACACACAAN
-+
-67777788888888888888888877776555443222101//..---,,+,+*****))))((((#"%$%%"##"
- at 30BB2AAXX080903:3:41:282:323#0
-CATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCTCACTCCTA
-+
-6777778888888888888888887.776555443222100/...---,,,,++*)))))(&)'(('$&%%#%$##
- at 30BB2AAXX080903:3:46:1192:1126#0
-ATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCCAATCACAT
-+
-67777788888888888888888877776555443222100//..--,,,+,*)**)*))')(('&'$"##%"$""
- at 30BB2AAXX080903:3:59:1439:1479#0
-CGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAACACACANCA
-+
-67777788888888888888888877776555443222100//..---,,+++****)))())(((&$$&&"$"$$
- at 30BB2AAXX080903:3:55:32:1289#0
-ATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGCGCGGGGATCGGAGTGTCGCAC
-+
-6777778888.888888888888877776555423212000./.%+,,-+++++(*#*)')%&''(%'##"#"$##
- at 30BB2AAXX080903:3:46:343:1278#0
-ATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATCTATTGCGC
-+
-67777788888888888888888877776555443222000//-,--,+,+)+)**()()))()'''$""""####
- at 30BB2AAXX080903:3:56:189:767#0
-CTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGACGCC
-+
-67777788888888888888888877776555443222100//..----,++++*)))))()(((('%"$""""#"
- at 30BB2AAXX080903:3:50:1410:1742#0
-CTGTGGCCCCTCAGAATGATATTTGGCCTCACGGGAGGACATAGCCTATGAAGGCTGTTGCTATAGTTGACCTCTA
-+
-67777788888888888888888877776555443022100/0.,,-,,,++++**)())')(('(%"$#"$"#""
- at 30BB2AAXX080903:3:54:489:1196#0
-CTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGTCCCCTNTC
-+
-67777788888888888888888877776555443222100/...---,,,++**+**)))((((('"$###""$%
- at 30BB2AAXX080903:3:2:386:640#0
-CAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACANCATNCAC
-+
-6777778888888888888888887777655514122210,//...--,-+++***))))))(''(''"#%""$$#
- at 30BB2AAXX080903:3:4:1469:285#0
-TTGTAATTACTGTGGCCCCTCAGAATGATATTTGGCCTCACGGGAGGACATAGCCTATAGATCGGAAGNACACNCN
-+
-677777888888888888888888777765554432/2101///.---,-,,+))**)*))('(('#""#%$#"#"
- at 30BB2AAXX080903:3:58:691:2012#0
-TTTGTAATTACTGTGGCCCCTCAGAATGATATTTGGCCTCACGGGAGGACATAGCCTATGAAGGCTGTTGACACCN
-+
-67777788888888888888888877776555443210100//..---,,++++))*)))((()&''"&%###$#"
- at 30BB2AAXX080903:3:35:877:1404#0
-TAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAGTAGANACTACGTN
-+
-677777888888888888888888777765554432221000//..--,,+++***)))()))((('"#$%"$"#"
- at 30BB2AAXX080903:3:37:694:823#0
-TTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAGTAATTACAAACTTACTCTCCTCAN
-+
-677777888888888888888888777765554432221000/..-.-,-+++++***))()((((("%%%$###"
- at 30BB2AAXX080903:3:50:928:967#0
-TATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAGTAATTACAAACTTACTATCCGCCATCTCATAGA
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))(((('%$"$"####
- at 30BB2AAXX080903:3:54:250:1496#0
-CCCAATGTATGGGATGGCGGATAGTAAGTTTGGAATTACTGTGGCCCCTCAGATCGGAAGAGCGGTTAAGCGGCAC
-+
-6777778.888888888888880877476555%2322200//..-,,,,,*+****)'))'(#)(##"#"%""#""
- at 30BB2AAXX080903:3:53:263:1321#0
-TGAGGCCAAATATCATTCTGAGGGGCCACAGTAATTACAAACTTACTATCCGCCATCCCATACATTGGGCAGCAGC
-+
-67777788888888888888888877776555443222100//..---,,++++****)))((((('&"$"#"##"
- at 30BB2AAXX080903:3:39:491:413#0
-TAGGTCTGTCCCAATGTATGGGATGGCGGATAGTAAGTTTGTAATTACTGTGGCTGCGCAGAATGATCTGCTGTGT
-+
-677777888888,888888883'177776-5+1-3221100....,--,,*++)&**(()''('('%%&##&%%##
- at 30BB2AAXX080903:3:50:661:214#0
-CAAATATCATTCGGAGGGGCCACAGTAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGCGGCCGCTC
-+
-6777778888881888888888887177.555443222100//..----,++++**))))))()(('"""#$"##"
- at 30BB2AAXX080903:3:4:962:1296#0
-AATATCATTCTGAGGGGCCACAGTAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCNACTCNCN
-+
-67777788888888888888888/77776552443.2210/./.,-,),,++**+*&(((((((('%%"#&%$"$"
- at 30BB2AAXX080903:3:4:620:905#0
-GATTCATTGAACTAGGTCTGTCCCAATGTATGGGATGGCGGATAGTAAGTTTGAGATCGGAAGAGCGCNTCACNCN
-+
-67777788888888888888888877776555443222100//..-.-,,,,+****)))()((('&$""%#%"#"
- at 30BB2AAXX080903:3:33:757:524#0
-TCTGAGGGGCCACAGTAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCANGCGAAANN
-+
-6777778488888888888888887777655544322220//-/---,,-+,+***)*))))(((('""$""""""
- at 30BB2AAXX080903:3:45:1654:229#0
-CTCAGATTCATTGAACTAGGTCTGTCCCAATGTATGGGATGGCGGATAGTAAGTTTGTAATTACTGTGGACCTCAC
-+
-67777788888888888888888877772555443222100//..---,++++***)*)))))((('%$""%#%#$
- at 30BB2AAXX080903:3:43:102:322#0
-CCTCAGATTCATTGAACTAGGTCTGTCCCAATGTATGGGATGGCGGATAGTAAGTTTGAGATCGGAAGACAGCGCT
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((('('&&#"$"###
- at 30BB2AAXX080903:3:41:599:89#0
-TACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCCGTACAC
-+
-67777788888888888888888877776555445222100/..-.--,-,*+*))**))()((''%$%"%#""#"
- at 30BB2AAXX080903:3:36:1626:1762#0
-GGACTGGCTAATGAGTAGCCTCCTCAGATTCATTGAACTAGGTCTGTCCCAATGTATGGGATGGCGGCTATCTTNN
-+
-6777778888-8888888&888+$777/655544322$000/.(/-,,+,*+**)))))))&(((('$$#"##"""
- at 30BB2AAXX080903:3:44:1588:964#0
-TTACTATCCGCCATCCCATACATTGGGACCGACCTAGTTCAATGAATCTGAGGAGGCTACCCAGTAGACGGGCCAC
-+
-6777778888888%8888888888.7730.55243)2/10//+.----,,+++****))'%#%'#(%&"$#""#"#
- at 30BB2AAXX080903:3:36:131:251#0
-TGGGACTGTCTACTGAGTAGCCTCCTCAGATTCATTGAACTAGGTCTGTCCCAATGTATGGGATAGANCTCACAGN
-+
-67777788888888888888888877776555443222100//..---,,++******)))(((((&"$"$%$#""
- at 30BB2AAXX080903:3:36:363:509#0
-TATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGCACCGACTN
-+
-67777788888888888888888877776555443222100//..---,-+++***))))))(((('$"%$""#""
- at 30BB2AAXX080903:3:34:1130:631#0
-ATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTNTTACAGNN
-+
-67777788888888888888888877776555443222100//..---,,++++****)))))((''"""$%#"""
- at 30BB2AAXX080903:3:47:1601:971#0
-ATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTACACCAAAT
-+
-67777788888888888888888877776555443)20100/+..----,+)+*))*))(((((('#"&"#%#%"#
- at 30BB2AAXX080903:3:33:498:673#0
-TCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAAGANGTGAGCNN
-+
-67777788888888888888888877776555443222100//.---,,,+++)**)*&)*(((((("#""#"$""
- at 30BB2AAXX080903:3:55:356:570#0
-GCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTCCCATCTCCACAA
-+
-67777788888888888888888877776555443222100//..--,,,+++****))))((((('"'"&&%$$$
- at 30BB2AAXX080903:3:60:866:277#0
-GCCATCCCATACATTGGGACAGACCTAGTTCACTGAATCTGAGGAGGCTACTCAGTAGACAGTCCCACCCCGCANN
-+
-67777788188888888888888877776555-23222100///.---,,+,++*)**&(()'((('''"#"$#""
- at 30BB2AAXX080903:3:60:867:275#0
-GCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTCCCACCTCGCANN
-+
-67777788888888888888888877776555443222100//-------,,++*))*))()'('('&&""$%#""
- at 30BB2AAXX080903:3:2:216:1902#0
-ATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTCCCACCCANCACNNAC
-+
-67777788888888888888888577776555453222200//..-.,-,+++*+)**)(()('(('""#"#""##
- at 30BB2AAXX080903:3:51:829:1466#0
-CATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGCATCCGCGCA
-+
-677777888888883888888888777765554432221001..-.----+++**)))(()'(((&%"""#"#"""
- at 30BB2AAXX080903:3:45:124:592#0
-GAAAGGTAAAGAATCGTGTGAGGGTGGGACTGTCTACTGAGTAGCCTCCTCAGATCGGAAGAGCGGGGCCGGAGTG
-+
-67777788888888888888888877776255443212100'/.---,,,+++*+)*)()))('(''"%$%""$##
- at 30BB2AAXX080903:3:37:1640:1971#0
-AGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCACTCCTCAN
-+
-677777888888888888888888777,6555443322101/*.,--,,-,,+***))()(()(('%"$"$$#%$"
- at 30BB2AAXX080903:3:50:170:1235#0
-GATGAAGTGAAAGGTAAAGAATCGTGCGAGGGTGGGACTGTCTACTGAGTAGCCTCCTCAGATTCATCGGCGGACT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*)))(('&$$"$#""#"
- at 30BB2AAXX080903:3:55:1667:36#0
-TCAATGAATCTGAGGAGGCTACTCAGTAGACAGACACACCCTCAAACGATTCTTGACCTTTCACTACACAACAAAA
-+
-677777888888888888888888777765554$3)2210////)---,,++)+**)*()))(#(&&$&"%&$#$$
- at 30BB2AAXX080903:3:48:1282:1336#0
-CAATGAATCTGAGGAGGCTACGCAGTAGACAGTCCCACTCTCACACGATGCTTTAACTTTCACTTCAACGCGCTCC
-+
-67777788888888888888108877776555'40,2,*00-/,,+-,)(+(+*'')$((#(&#'(#"#"$"""#"
- at 30BB2AAXX080903:3:49:693:1538#0
-CAATAATGAAGGGCAAGATGAAGTGAAAGGGAAAGAATCGTGGGGGGGGGGGGGGGGTGACTGGGGGCGCCATGCC
-+
-677777888888888888888886777765(344152+$1).&.%---,-++))()(#######'##"##""""#"
- at 30BB2AAXX080903:3:2:686:1072#0
-GAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCAGATCNGCTAGTC
-+
-677777888888888888888888777725452432210100/.-----,+++*+***))()(((''"""$"#""#
- at 30BB2AAXX080903:3:45:1124:1058#0
-GAGGAGGCTACTCAGTAGACAGACCCACCCCCACAAGATGCGTTACCTTTCACCTCCTCCTAGCCATCCTGAGATC
-+
-6/77778588888888888888))777765(5'-.'2/&*,'.--&(#++*$)$*##(%#(#&'##%"""$"$"""
- at 30BB2AAXX080903:3:58:1337:421#0
-AGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCAGTAGCACA
-+
-6777778888888888888888887777655544120$100//.,-+*,+,+++*)*))))'(('''%$&""$%$%
- at 30BB2AAXX080903:3:56:752:106#0
-TGCAATAATGAAGGGCAAGATGAAGTGAAAGGTAAAGAATCGTGTGAGGGTGGGACTGTCTACTGAGCAGACTCCT
-+
-67777788888888888888888877776555243222100/..----,,*++****))))(((''&%$##%"###
- at 30BB2AAXX080903:3:45:101:1113#0
-GGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCATAGATCGGA
-+
-67777788888888888888888877776555443222100//..---,,+++****))))(((''''%&&"$%##
- at 30BB2AAXX080903:3:4:1017:1901#0
-GCTGCAATAATGAAGGGCAAGATGAAGTGAAAGGTAAAGAATCGTGTGAGGGTGGGACTGAGATCGGANGATGNTN
-+
-6777778888888888888888887675655544222210///.--+-,,,,**+**)()))(((('&""""""""
- at 30BB2AAXX080903:3:43:128:189#0
-GGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTAACTTTCACTTCATCTTGCCCTTCATTATTAGATCGG
-+
-67777788888888888888888/7877655544322210#//..-*,,+*++**))*)))((('(''%%%"###%
- at 30BB2AAXX080903:3:42:1307:1711#0
-CTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCATTATTGCGTCTGCA
-+
-67777788888888888888888877776575463222020//.,,--,,,+++**(*)((((((('$&%&&#"#"
- at 30BB2AAXX080903:3:38:299:1070#0
-CTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCATTATTGCACCCCTACAC
-+
-67777788888888888888888877776555443222100//..----,+++*+*))))))()(('%"&##%"##
- at 30BB2AAXX080903:3:42:785:820#0
-CTGCTAGGGCTGCAATAATGAAGGGCAAGATGAAGTGAAAGGTAAAGAATCGTGTGAGGGTGGGACTGTCTCTTGG
-+
-67777788888888888888888877776555443222110/...----,,+***)*)))&))((('&&%&""#"#
- at 30BB2AAXX080903:3:51:991:187#0
-GCTGCTAGGGCTGCAATAATGAAGGGCAAGATGAAGTGAAAGGTAAAGAATCGTGTGAGGGTGGGACTGCTCTCGG
-+
-67777788888888888888888877776555443222100//-.---,,+++**+)*)))((('('""####"#"
- at 30BB2AAXX080903:3:37:1665:1484#0
-TGCTGCTAGGGCTGCAATAATGAAGGGCAAGATGAAGTGAAAGGTAAAGAATCGTGTGAGGGTGGGACATTGACNN
-+
-67777788888888888888888877776555443222100//.*---,,,++*+**))))(&('''""""""$""
- at 30BB2AAXX080903:3:59:532:1230#0
-GGAGTGCTGCTAGGGCTGCAATAATGAAGGGCAAGAGGAAGTGAAAGGGAAAGAATCGTGTGGGGGTGAGCGCNAC
-+
-677777888888888888888888777305553432(2000//-.+--'&,,+**('*()&)#(((#&$%#"$"##
- at 30BB2AAXX080903:3:33:194:1128#0
-ACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCATTATTGCAGCCCTAGCNTCAACANN
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)))'(((''""%"#$$""
- at 30BB2AAXX080903:3:2:966:696#0
-CCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCATTATTGCAGCCCTAGCAGCACTCNACCTCCC
-+
-677777888888888888888888774766554432.1200/.-,.--,,+++*)'))()'(('('''"$"""##"
- at 30BB2AAXX080903:3:60:1165:497#0
-CGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAATAATGAAGGGCAAGATGAAGTGAAAGGGAAACACCNN
-+
-67777788888888888888888877776555443221100//./---,-+,++****)))()(((#&%&"$##""
- at 30BB2AAXX080903:3:45:250:1372#0
-CTTTACCTTTCACTTCATCTTGCCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCGCGTAACG
-+
-677777888888888888888888777765554432220/0//...-,-,+,*+****)))))((('%"$&##"#%
- at 30BB2AAXX080903:3:53:52:1051#0
-TTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAATAATGAAGGGCAAGAGNCAGNTCT
-+
-677777888888.8888886888877756535433122001/../-,-,,+*+*)))()))(#'(('""#""""#"
- at 30BB2AAXX080903:3:2:1640:1675#0
-GTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAATAATGAAGGGCAAGANTGACGTC
-+
-67777788888888888888888877776550441222010//,.,-,,-+*)**))*))))(''''&"&##%#""
- at 30BB2AAXX080903:3:33:498:592#0
-CTTCATCTTGCCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTAGATCGGAAGAGCGNTAGTCCNN
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(('(&"""""##""
- at 30BB2AAXX080903:3:43:842:45#0
-AGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAATAATGAAGGGCACAG
-+
-67777788888888888888888877776555443222100/..---,,,++++**)*((((((((''&%##""""
- at 30BB2AAXX080903:3:52:773:1544#0
-CTTGCCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACAGATCGGAAGATGCTCCCC
-+
-67777788888888888888888877776555443222100//..---,,++++**))))))(((('%"""""""#
- at 30BB2AAXX080903:3:43:1755:765#0
-CCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACGGGATCAAACAACCCCCTAGGAA
-+
-67777788888888888888888877776555443222100//..---,-+,******)))()((('&&%%%%$""
- at 30BB2AAXX080903:3:37:1464:295#0
-TTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAGACCCTCNTCN
-+
-67777788888888888888888867776555433222200./.*---,+++++****)))'(('('"&$%$"$$"
- at 30BB2AAXX080903:3:42:536:888#0
-GATTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAATAATGAAG
-+
-67777788888888888888888877776555443222200//..---,,+,+****)*))((('('$&$%$$##%
- at 30BB2AAXX080903:3:55:1148:1423#0
-TCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGCAACGGGATCAAACAACAGACAGGACTACTA
-+
-677777888888888888888888772745554)521'&0//-..'-,',++*')())())((((#%"$"$"##"#
- at 30BB2AAXX080903:3:39:1005:560#0
-ATCGGAATGGGAGGTGATTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAAGATCGGAAGAGTGTAG
-+
-67777788883888888-888%8877772555443210//0/.-+-*-,+++**&***()((&'(&#$$"%$""""
- at 30BB2AAXX080903:3:50:597:724#0
-ATCGGAATGGGAGGTGATTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCACCACTG
-+
-677777888888888888888888777735554432220000/.-----,+++***)))))'(((('%%$#$"#""
- at 30BB2AAXX080903:3:51:1165:707#0
-ATCCGAATGGGAGGTGATTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTTACTCNCTC
-+
-67777788888888888888888877776555443221100./..-,-,,,+****)**))'()('&""$""""##
- at 30BB2AAXX080903:3:49:1498:2039#0
-TATCGGAATGGGAGGTGATTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCATTCAC
-+
-67777788888888888888888877776/55443212+.///./+-',++*+***)*)())#((('""""""#"#
- at 30BB2AAXX080903:3:50:384:50#0
-CTCCACCTCCTATTCTTGCACGAAACGGGATCAAACAACCCCCTAGGAATCACCTCCCATTCCGATAATCTCACAC
-+
-67777788888888888888888877776555443222100//..--,,,+,+***)))))()((('""#"$"$""
- at 30BB2AAXX080903:3:37:998:1081#0
-TAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCCTAGGGGGTTGTTTGATCCCGTTTCGCTCCTGCTAN
-+
-67777708888888888888888877776555443222100//..---+,+,++**)))))'((('%"%"""##""
- at 30BB2AAXX080903:3:52:276:326#0
-TGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCCTATGGGGTTGTTTGATCCCGCCTCTTTC
-+
-67777788888888888888888877776555443222100././--,-+)+++*)))))))(((('%"$"$"""#
- at 30BB2AAXX080903:3:53:1565:1415#0
-TGATTGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCCTAGGGGGTTGTTTGACACACTCCT
-+
-67777788888888888888888847776555413221100/...--,,,**+***)*)()(((((&$$%%$"##"
- at 30BB2AAXX080903:3:3:900:1007#0
-TTTGATTGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCCTAGGGAGATCGGACNGCACNTG
-+
-67777788888888888888888877776555401222000//.---,,-,+)**)*))()(%#(('$"""$#"#"
- at 30BB2AAXX080903:3:39:94:1347#0
-GGGATCAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACATATACATCA
-+
-67777788888888888888888877776555443022100//..----,++++***))))(()'(&$$##"%"##
- at 30BB2AAXX080903:3:43:1649:1221#0
-ACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATAAAAGACGCCCACGG
-+
-6777778888888888888888867777455544322-2///..,,--+-,****)*)))'&(((''&$"&#"#""
- at 30BB2AAXX080903:3:49:1177:804#0
-CAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCACTCACA
-+
-67777788888888888888888877776555443222*00./..--,,,+,+***)))))()((('$$""#$$##
- at 30BB2AAXX080903:3:8:589:1921#0
-CAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTAAGATCGGAAGAGCNGATTCANN
-+
-+77777888888888888888$8877776/5943021211/.).,-,-+,+++)*)()))(('('(("""""##""
- at 30BB2AAXX080903:3:49:1009:1992#0
-AGCCGAGGGCGTCTTTGATTGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCCTCGGCTACC
-+
-677777888888888888888888777765555432221/0//..---+,+++***)))*'((((&#$"%"##"$#
- at 30BB2AAXX080903:3:36:333:1879#0
-AAGCCGAGGGCGTCTTTGATTGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCGACCTCCNN
-+
-677777888888888888088888+27-6/554$32+-10,/+,,--,-),+#**)**&))&)'('%""$$###""
- at 30BB2AAXX080903:3:49:1198:690#0
-CCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAGATCGGAAGCGACTCGAC
-+
-67777788888888888888888877776550443222100//..---,,+++(*+))))))()((&"""#""""#
- at 30BB2AAXX080903:3:37:295:617#0
-TAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGGCCTACAACN
-+
-677777888888888888888888777765,5)43122100//..----,+++***)**))((((('%$%"$"##"
- at 30BB2AAXX080903:3:60:747:779#0
-TAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGGCTTGCGCNN
-+
-67777788888.8888888883887773055/483222100//./-----,+++**)))))()'('''"""%"$""
- at 30BB2AAXX080903:3:54:949:93#0
-GGAAGAGAAGTAAGCCGAGGGCGTCTTTGATTGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGCCTGCACT
-+
-67777788888888888888888877776555443222100//.,---,,+*+***)**))()((('%"#"#"##"
- at 30BB2AAXX080903:3:55:241:443#0
-CCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGAGATCGGAAGACGACTGCT
-+
-67777788888888888888888877776552413212.0/--.-*,-+,,++*&*)(*(%((('&'%#""###$$
- at 30BB2AAXX080903:3:57:1368:1723#0
-TCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGGCTTACTTCTCTTCCACACTA
-+
-67777788888888888888888877776555443222100//..--,,,,++*****))()(('('$"%%""#""
- at 30BB2AAXX080903:3:50:535:717#0
-CCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGGCTTACTTCAGATCGCCAACGT
-+
-67777788888888888888888877776555443222100/....--,-+,++**(*))))((('&&"$#""#""
- at 30BB2AAXX080903:3:59:23:909#0
-CCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGGCTTAGATCGGAAGAGACCNNA
-+
-67777788888888888888888877776555443222100//..---,,,++*****)))()('((&%&"#%""#
- at 30BB2AAXX080903:3:54:219:1792#0
-GGAGAGAAGGAAGAGAAGTAAGCCGAGGGCGTCTTTGATTGTGTAGTAAGGGTGGAAGGTGATTTTAGCGGATCAG
-+
-67777788888888888888888877776555443221100//..----,+++**))))))(()'''$$#$""$"#
- at 30BB2AAXX080903:3:48:1643:1650#0
-AATCACCTTACACCCTTACTACACAATCAAAGACGCCCTCGGGTTATTTCTCTTCCTTCTTTCCTTTATGTACACA
-+
-677777888/8888888888888877776555421-+0&.//%$%,&',+*))+#(')&(&)'#%'&""""$%""#
- at 30BB2AAXX080903:3:39:1579:1523#0
-ATCAAAGACGCCCCCGGCTTACTTTTCTTCCCTCTCTCCTTAATGACATTAACACAATTCTCCAGAACGTCCCTCA
-+
-6777778888888%8888,-.324(.1,3%5%1$+'1.1%0%)*%,**++*+'''#(&)%'&#&###"%#""#"##
- at 30BB2AAXX080903:3:46:730:1679#0
-GCCTAGGAGGTCTGGTGAGAATAGTGTTAATGTCATTAAGGAGAGAAGGAAGAGAAGTAAGCCGAGGGCGACAGCG
-+
-67777788888.88888884888877776555423222100./-.---,,,+****)))))'((((#'#""#""##
- at 30BB2AAXX080903:3:55:1035:617#0
-TGTCTGGGTCGCCTAGGAGGTCTGGTGAGAATAGTGTTAATGTCATTAAGGAGAGAAGGAAGAGAAGCAACCGATG
-+
-67777788888888888888888877776555441222/00//..--,,,++++*))))))()((('"%$$%""""
- at 30BB2AAXX080903:3:42:1523:859#0
-GGCTTACTTCTCTTCCTTCTCTCCTTAATGACATTAACACTATTCTCACCAGACCTCCTAGATCGGAAGCGTCCTC
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()(('''&"###"""
- at 30BB2AAXX080903:3:45:1252:1669#0
-TGGCTAGGGTATAATTGTCTGGGTCGCCTAGGAGGTCTGGTGAGAATAGTGGTAATGTCATTAAGGAGAGGGAGAC
-+
-6777778888888888882888887717655544322210&//.---,,$+%++*))())())(((''$#$$"##"
- at 30BB2AAXX080903:3:1:220:976#0
-TGATGTGGGGAGGGGTATTTAAGGGGTTGGCTAGGGTATAATTGTCTGGGTCGCCTAGGAGGTCTGGANCTNACAA
-+
-677777888888888888888888777765553432111/1//.,,--,,**+))*)))()(&'(((""#"""$#"
- at 30BB2AAXX080903:3:60:1401:1615#0
-CGGGCTTGATGTGGGGAGGGGTATTTAAGGGGTTGGCTAGGGTATAATTGTCTGGGTCGCCTAAGATACCCACANN
-+
-677777888888888888888888777765554432.2000/./.-,-,,,)+****')(')('(('$$#%%$%""
- at 30BB2AAXX080903:3:53:195:1912#0
-GTAGGCGAATAGGAAATATCATTCGGGCTTGATGTGGGGAGGGGTATTTAAGGGGTTGGCTAGGGTACTATTCGTT
-+
-677777888888888888888888777765554422221/0//.----,+,++**))))()'(((#%%##&&#""#
- at 30BB2AAXX080903:3:60:878:1621#0
-GTAGGCGAATAGGAAATATCATTCGGGCTTGATGTGGGGAGGGGTATTTAAGGGGTTGGCTAGGGTATATACAANN
-+
-677777888888888888888888777765554432221*0//.',,--,*++***())()()((#'&$#&%#"""
- at 30BB2AAXX080903:3:2:1139:1227#0
-GAGAATTGTGTAGGCGAATAGGAAATATCATTCGGGCTTGATGTGGGGAGGGGTATTTAAGGAGATCGNCGGCTGA
-+
-6777778888888888828888887777655544322210///..---,,+++)****)*)))((('%"%""$#"$
- at 30BB2AAXX080903:3:53:1584:1417#0
-GGAGAATTGTGTAGGCGAATAGGAAATATCATTCGGGCTTGATGTGGGGAGGGGTATTTAAGGGGTTCACTACAAA
-+
-67777788888888888888888877776555443221100//..---,,+++***)))))((('(%"$#"""##"
- at 30BB2AAXX080903:3:36:1273:1389#0
-CTAGCCAACCCCTTAAATACCCCTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAAGTCTCGTCN
-+
-67777788888888888888888877776455443221100//..---,,,+++*****))(((((%&&&$"#"#"
- at 30BB2AAXX080903:3:35:978:2036#0
-TAGCCAACCCCTTAAATACCCCTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATNCTCACACN
-+
-677777888888888888888888777765554431221/0//...--,,+++**))()))()((''"%#%$##$"
- at 30BB2AAXX080903:3:37:898:1093#0
-GATCGGAGAATTGTGTAGGCGAATAGGAAAGAGCAGTCGGGCGTGATGTGGGGAGGGGGATTTAAGATGGAACATN
-+
-67777788888888888888888*777765$54,3522100-/-..--,,+++***)*&))()(''(%"""##"""
- at 30BB2AAXX080903:3:52:633:280#0
-AACCCCTTAAATACCCCTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGCCCCGCCC
-+
-67777788888888888888888877776555443222100//..----+,+++***)*)(')((('$##&%&##$
- at 30BB2AAXX080903:3:34:1619:1444#0
-TTAGGGACGGATCGGAGAATTGTGTAGGCGAATAGGAAATATCATTCGGGCTTGATGTGGGGAGGGGNACACACNN
-+
-67777788888888888888888877776555443222100//...,-,,,++***)*)))((('(&""#%$##""
- at 30BB2AAXX080903:3:41:1012:759#0
-AAGGACGCCTCCTAGTTTGTTAGGGACGGATCGGAGAATTGTGTAGGCGAATAGGAAATATCATGCGGGTCTCTGC
-+
-67777788888888888888888877776555443222000//-/---,,,++**+)*)))()('''%$$""""""
- at 30BB2AAXX080903:3:8:1421:1061#0
-AAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGATCCGTCCCTAACAAACTAGGAGGCGNGCCACANN
-+
-67777788888888888888888877776555443222200//.----,-+++***))))))(((('""##$$#""
- at 30BB2AAXX080903:3:38:202:141#0
-ATTCGCCTACACAATTCTCCGATCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCNCCNN
-+
-67777788888888888888888877776555443122100//..--,-,+++****))())((((("$$%"##""
- at 30BB2AAXX080903:3:3:1438:141#0
-ATTCGCCTACACAATTCTCCGATCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCACNGCCANAN
-+
-6777778888888888881488883777.55543322-100//..+-+,(,++)&))**))#()('%&"""%%"""
- at 30BB2AAXX080903:3:55:246:89#0
-TTCGCCTACACAATTCGCCGATCCGTCCCTAACAAACGAGGAGGCGTCCCTCCACTACTACTCTCCCACACCANCA
-+
-6777778388888888(88888887*4+6/$0,$12+1.0--/.,-",+$+'#$*'(&)'('#'#%#"""%&#"$#
- at 30BB2AAXX080903:3:50:659:294#0
-CGCCTACACAATTCTCCGATCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCCTCGCC
-+
-6777778888888888888888887777655542'222100//..---,,+++***)))())(((''$"##%$##"
- at 30BB2AAXX080903:3:47:685:1662#0
-GCTAGGATGAGGATGGATAGTAATAGGGCAAGGACGCCTCCTAGTTTGTTAGGGACGGATCGGAGAATTGGGGAGG
-+
-6777778888888888888888887777655544321-100/...---,,,++**))*()(()('#'"$$#"""##
- at 30BB2AAXX080903:3:34:1682:758#0
-TCTCCGATCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCANTAACATNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((&"%####"""
- at 30BB2AAXX080903:3:57:117:699#0
-ATGGGGATTATTGCTAGGATGAGGATGGATAGTAATAGGGCAAGGACGCCTCCTAGTTTGTTAGGGACGCTCTTAT
-+
-67777788888888888888888877776555443222100//..----,+++*****))()(('''$&$%%#%$#
- at 30BB2AAXX080903:3:1:250:1496#0
-CCGATCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATACNCCNTGCC
-+
-677777888888882888888888777163323522210/1./.,),,,,+++**))))((((('&'$"%%""""$
- at 30BB2AAXX080903:3:53:746:1037#0
-TCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCCCCATCGTAC
-+
-67777788888888888888888877776555443222100//..---,,++++****))*(()((&&$#%%#"##
- at 30BB2AAXX080903:3:35:405:1942#0
-GGAGGATGGGGATTATTGCTAGGATGAGGATGGATAGTAATAGGGCAAGGACGCCTCCTAGATCGGANTCTCNCAN
-+
-677777888888888888888888777766554432211/00/..--,,,+++)***&*))))('('""%"$"$#"
- at 30BB2AAXX080903:3:33:884:1604#0
-CGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAAGATCGNACACGANN
-+
-67777788888888888888888877776-45463221100./.-,,,+,,+++**'())*()((('"&#"%""""
- at 30BB2AAXX080903:3:42:956:1811#0
-GTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCAGATCGGACTACT
-+
-6777778888888888888888889777655534321210///.-.--,,*++***)*)*))((((''&%"""##"
- at 30BB2AAXX080903:3:38:21:1839#0
-TATGGAGGATGGGGATTATTGCTAGGATGAGGATGGATAGTAATAGGGCAAGGACGCCTCCTAGTTTGAACCCCAT
-+
-67777788888888888888888877776555443212101//..---+,+++***(*)())(((('"""$###$#
- at 30BB2AAXX080903:3:55:1116:25#0
-CCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCCCCATCCTCAGATACT
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((''%&"$$#"#"
- at 30BB2AAXX080903:3:1:489:491#0
-TAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTGGCAATAATCCCCATCCTCCNCANCCTC
-+
-67777788888888888888888577766545453112100/../,-,,-*+++*)*))())((%'''"##"##"#
- at 30BB2AAXX080903:3:54:842:451#0
-CTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCCCCATCCTCCATATATCCAAACCAT
-+
-6777778888888(88888878887*47655544521100&-/..+-,,-,,+*****())((((('"%%%&%#$$
- at 30BB2AAXX080903:3:50:697:1139#0
-TTTGTTGTTTGGATATATGGAGGATGGGGATTATTGCTAGGATGAGGATGGATAGTAATAGGGCAAGGACTGCACA
-+
-67777788888888888888888877776555443222100//..---,,+,+**))*)))((((''""#""#"##
- at 30BB2AAXX080903:3:35:204:344#0
-GTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCCCCATCCTCCATATATCCAAACAACNACAACANN
-+
-677777888888888888888888777765554432221/0//..---,,+++****))))))((('"%%#"%#""
- at 30BB2AAXX080903:3:34:195:294#0
-GAAATATTATGCTTTGTTGTTTGGATATATGGAGGATGGGGATTATTGCTAGGATGAGAGATCGGAANACTACANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()('('"$#""#$""
- at 30BB2AAXX080903:3:1:1365:1506#0
-CCCTATTACTATCCATCCTCATCCTAGCAATAATCCCCATCCTCCATATATCCAAACAACAAAGCATANTANTTCT
-+
-67777788888888888888828877776555443222100//...--+,,+++**))))))((((''""""$#$#
- at 30BB2AAXX080903:3:36:1558:664#0
-TATCCATCCTCATCCTAGCAATAATCCCCATCCTCCATATATCCAAACAACAAAGCATAATATTTCCACGCCTCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))((((#$'#"%#$""
- at 30BB2AAXX080903:3:50:1452:1649#0
-TATCCATCCTCATCCTAGCAATAATCCCCATCCTCCATATATCCAAACACCAAAGCATAATATTTCGCCTCCTCAC
-+
-67777788888888888888888877776555443222100//...--,(,+++*+))))))()(('&%"$$#""$
- at 30BB2AAXX080903:3:56:819:1752#0
-TGGCTTAGTGGGCGAAATATTATGATTTGTTGTTTGGATATTTGGAGGATGGGGGTTATTGCTAGGTGTGTGTCTG
-+
-677747888888888888888888$777655544322-1/0%/..---+-+++*')($()(&(&((#'&%#"#$""
- at 30BB2AAXX080903:3:48:920:1781#0
-AGTGATTGGCTTAGTGGGCGAAATATTATGCTTTGTTGTTTGGATATATGGAGGATGGGGATTATTGTCACAGACC
-+
-67777788888888888828888877776565442222110./.-,-+,-+&+*))**))#((('('"%#&#""##
- at 30BB2AAXX080903:3:40:345:1151#0
-ATCCTAGCAATAATCCCCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCNATCATACC
-+
-67777788888888888888888877776555,43222120//.-----,++++***))))((('('"$%%%$%$#
- at 30BB2AAXX080903:3:60:879:1349#0
-CAATAATCCCCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTCTGACANN
-+
-67777788888888888888888877776555443220100//..--,,-,,+****))())()(('&$"""##""
- at 30BB2AAXX080903:3:59:1716:418#0
-GGAGTCAATAAAGTGATTGGCTTAGTGGGCGGAATATTATGCTTTGTTGTTTGGGTATATGGCGGACAACAAANNC
-+
-67777788883888888888+8887177655(44/2022/0%0-..--,,,++*&)(*)))(#'(&%&%&#$%""#
- at 30BB2AAXX080903:3:40:84:1589#0
-AGGAGTCAATAAAGTGATTGGCTTAGTGGGCGAAATATTATGCTTTGTTGTTTGGAGATCGGAAGAGACAGCGACT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&$$#"$""##
- at 30BB2AAXX080903:3:53:17:1179#0
-GGCTAGGAGTCAATAAAGTGATTGGCTTAGTGGGCGAAATATTATGCTTTGTTGTTAGATTGGGAGAGTATAGACA
-+
-677757888888888888888888777725554412+,001*/...,,,,,+++*)')((#((#'(#$#"""#""$
- at 30BB2AAXX080903:3:4:649:1000#0
-TCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTTATTGACTCCTAGCTNCACANCN
-+
-67777788888888888888888877776555443222100//-.---,,+)++***))))))((('""##"#"#"
- at 30BB2AAXX080903:3:46:1154:83#0
-TCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTTATTGACTCCTAGCCGCAGACCTCACACTTT
-+
-67777788888888888888888877776555443222100//..---,,+++**+)***)(()((("#"#"$$""
- at 30BB2AAXX080903:3:49:391:1222#0
-AAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTTATTGACTCAGATCGGAAGAGCGGTGTAGCAAAA
-+
-67777788888888888888888877776555443222100//..---,,+++**)))))))(('''$"#%###"#
- at 30BB2AAXX080903:3:37:472:268#0
-GGTTAGAATGAGGAGGTCTGCGGCTAGGAGTCAATAAAGTGATTGGGTTAGTGGGCGGAATATTATGTGTTCTTCN
-+
-672777888848888888888888777725.111/2-2,%0/..,-&+-()*++*'*#%(#('('&%"$%###"#"
- at 30BB2AAXX080903:3:2:1170:677#0
-CAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTTATTGACTCCTAGCCGCAGACCTCCTCATNATCACAC
-+
-6777778888888888888888887777655544323210///..---,-,,******((()('(('&""&%%%##
- at 30BB2AAXX080903:3:55:966:280#0
-TGGTTGTCCTCCGATTCAGGTTAGAATGAGGAGGTCTGCGGCTAGGAGTCAATAAAGTGAGATCGGACGGCTGTCA
-+
-67777788888888888888888877776555443222100//..-,-*,,+++**)'*()(('(('$&"""%$#"
- at 30BB2AAXX080903:3:50:1788:693#0
-TACTGGTTGTCCTCCGATTCAGGTTAGAATGAGGAGGTCTGCGGCTAGGAGTCAATAAAGTGATTGGCATAGACAG
-+
-67777788888888888888888877776555443220000//.,---,,+*))***))(&((&((($""#""$""
- at 30BB2AAXX080903:3:44:1750:1248#0
-AAAAGGGTAGCTTACTGGTTGTCCTCCGATTCAGGTTAGAATGAGGAGGTCTGCGGCTAGGGGGCAATAAAGTGAT
-+
-67777788888888888888888877776555443222100//..-.-,,+,+***))()(()&#&'"#"%$"#"#
- at 30BB2AAXX080903:3:4:524:996#0
-ATGGTAAAAGGGTAGCTTACTGGTTGTCCTCCGATTCAGGTTAGAATGAGGAGGTCTGCGGCTAGGGANCACGNCN
-+
-67777788888888888888888877776555413220101//.,---,,+++*)))*(*)(('('&""%"#""#"
- at 30BB2AAXX080903:3:54:1370:421#0
-GATGGTAAAAGGGTAGCTTACTGGTTGTCCTCCGATTCAGGGTAGAATGAGGAGGTCTGCGGCTAGGGTGGAGTGC
-+
-67777788888888888888888877776555440222100%/...-),,++***')()(*((%('''"""""#""
- at 30BB2AAXX080903:3:42:143:1909#0
-TGATGGTAAAAGGGTAGCTTACTGGTTGTACTCCGATTCAGGGTAGAATGAGGAGGTCTGGGGCTAGCGTCCATCC
-+
-67777788888888888888888877776$55413222(/0/)..-,-,,+++****')(#)(&('&&""#$$"##
- at 30BB2AAXX080903:3:56:384:785#0
-AATGATGGTAAAAGGGTAGCTTACTGGTTGTCCTCCGATTCAGGTTAGAATGAGGAGGTCTGCGGCTAGGGGCACG
-+
-67777788888888888888888877776555443221100//.,-,-,,,+****))((()()(''$&"""$#$"
- at 30BB2AAXX080903:3:36:1379:258#0
-TGACTCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTAGNTCTGTAGN
-+
-67777788888888888888888877776555443222100//..---,,+,*+****))(()(((("%%&%$"""
- at 30BB2AAXX080903:3:53:975:1452#0
-TCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCCTTGGCTG
-+
-67177788888888888888888877776555443222100//...--,,+++*+()))'*((''''$"$&%%$""
- at 30BB2AAXX080903:3:39:594:1968#0
-CGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTCTGA
-+
-67777788888888888888188877776555443221000//..,--,++,+***))))())(((''&%%&&###
- at 30BB2AAXX080903:3:50:1097:1761#0
-GCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCGACCCTTTTACCATCATTGGACAGCGTGCAC
-+
-6777778888888888888888887777655543321210///.-)--,,,++**))*)))))(((&""#"""#""
- at 30BB2AAXX080903:3:55:772:1503#0
-GCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACCACTAGCCC
-+
-67777788888888888888888877076555443222100//...--,,&++**)()))))((((&"&#$$####
- at 30BB2AAXX080903:3:37:180:1854#0
-CAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAGCACTCACN
-+
-67777788888888888888888877776555443002100//..--,+,+++**))))))((((('$%#%#$##"
- at 30BB2AAXX080903:3:50:368:997#0
-CTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATACATAC
-+
-67777788888888888888888877776555443202100../.---,,,*+***))))())(((''$#"##"$%
- at 30BB2AAXX080903:3:46:1010:284#0
-AGTACGGATGCTACTTGTCCAATGATGGTAAAAGGGGAGCTTACTGGTTGTGCTCCGATTCAGGGTTGTAGTCGGG
-+
-6777778888888888888888'8777745554432)2100//..--,,,)$+*)*(('('&')#'#&""#""###
- at 30BB2AAXX080903:3:2:1419:114#0
-ATAGTACGGATGCTACTTGTCCAATGATGGTAAAAGGGTAGCTTACTGGTTGTCCTCCAGATCGGAAANTGTCTAC
-+
-67777788888888888888288877776555443222/00+/..,---+++*$)*'))(('#(('#""%"$$"##
- at 30BB2AAXX080903:3:1:1447:542#0
-TCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAAGATCGGAAGNTANATCG
-+
-6777778888888888888888887777654544032/100..--,---,,,++**))*))(#((('$"%""#"#"
- at 30BB2AAXX080903:3:33:223:699#0
-GAAGTATAGTACGGATGCTACTTGTCCAATGATGGTAAAAGGGTAGCTTACTGGTTGTCCTCCGATANTGCGACNN
-+
-67777788888888888888888877776555443222100//,.---,,,++*+*)(%))(((&('"%$#""#""
- at 30BB2AAXX080903:3:56:367:1126#0
-ACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCAGATCGGAAGACTCCG
-+
-67777788888888888888888877776555443222000//..----,+++***)))*)((((''$$##""##"
- at 30BB2AAXX080903:3:34:1416:632#0
-ATTGTTGTGAAGTATAGTACGGATGCTACTTGTCCAATGATGGTAAAAGGGTAGCTTACTGGTTGGCNTCCTAGNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((%%"&&##""""
- at 30BB2AAXX080903:3:39:928:402#0
-CGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTAGATCGGAAGAGCGGTCCC
-+
-67777788888888888888888877776555443222100/..-,-,,,,++****)*))())(('$&#"""###
- at 30BB2AAXX080903:3:59:457:1640#0
-GGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCAGATCTGATAAGC
-+
-67777788888888888888888877776555443222100//..--,,,++****)**)*)()((''"%##"""#
- at 30BB2AAXX080903:3:52:43:522#0
-TTAGGATTAGGATTGTTGTGAAGTATAGTACGGATGCTACTTGTCCAATGATGTGAAAAGGGTAGCTTCATGGATG
-+
-67777788888-8888888888887777655544.2120/,//.,-*)+,*++)'('(*))(#'('&"#"%%%"##
- at 30BB2AAXX080903:3:41:976:1353#0
-AACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAAGATCGGAAGAGCGGAC
-+
-67777788888888888888888877776555443222110/.-.--,,,+++***)*)))))((('%%#%$""""
- at 30BB2AAXX080903:3:58:1048:887#0
-CAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCCTAATCAC
-+
-67777788888888888888888877776555443222100//..---,-+,++**)*)))((((('&$&$""##%
- at 30BB2AAXX080903:3:1:952:396#0
-GTTGGTATTAGGATTAGGATTGTTGTGAAGTATAGTACGGATGCTACTTGTCCAATGATGAGATCGGANTCNCATC
-+
-67777788888888888888888877776555443220100//...--,,++)+***)*)()((#(&&"#$"$###
- at 30BB2AAXX080903:3:44:944:1948#0
-CTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCCTAATACCAACTATCTCAGA
-+
-67777788888888888888888877776555443222100//..---,-,+++*)*))))(((('''%%%%%%$%
- at 30BB2AAXX080903:3:56:1281:147#0
-TACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCCTAATACCAACTATCTACCTCCTT
-+
-67777788888888888888888877776555443222100///.---,-+,+***))*))()((((&"&#$##""
- at 30BB2AAXX080903:3:34:301:2039#0
-ACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCCTAATACCAACTATCTNCAGCACNN
-+
-67777788888888888888888877776555443222100//..----,,++***))*)))()'(("&#"#"$""
- at 30BB2AAXX080903:3:40:1323:925#0
-CCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCCTAATACCAACTATCTCCCTAATTGC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*)()('''&$%#%$$""
- at 30BB2AAXX080903:3:54:740:1683#0
-ACAAGGACAGGCCCATTTGAGTATTTTGTTTTCAATTAGGGAGATAGTTGGTATTAGGATTTGGATTAGCGTGGAG
-+
-6777778888888888888884887777655532222-100//,.--*,,,%#*+*)*&()#(('''$""%#%#$"
- at 30BB2AAXX080903:3:57:810:1004#0
-ATACTACAAGGACAGGCCCATTTGAGTATTTTGTTTTCAATTAGGGAGATAGTTGGTATAGATCGGAAGGATACAC
-+
-67777788888888888888888877-7655544322.0/0/...-,--,,+*+**))))()((((%&&""""##%
- at 30BB2AAXX080903:3:1:1068:707#0
-AAGGTTTTCATCTCCGGTTTACAAGACTGGTGTATTAGTTTATACTACAAGGACAGGCCCATTTGAAGNACNCACA
-+
-67777788888888888888888877776525443222000//.---,,,,++****)(')((((('""#%"####
- at 30BB2AAXX080903:3:2:1188:1280#0
-ATACTCAAATGGGCCTGTCCTTGTAGTATAAACTAATACACCAGTCTTGTAAACCGGAGATGAAAACCNGTTCCAC
-+
-67777788888888888888888877776555443222100//..--,,,,++****))))((((((%""&%$$""
- at 30BB2AAXX080903:3:37:78:1987#0
-AGACTTTTTCTCTGATTTGGCCTTGGAAAAAGGATTTCATCTCCGGTTTACAAGACTGGTGTATTAGTCAATACAN
-+
-67777788888888888888888877776555442221101//..-,,,,*++**)*))))((#(('"""##"#""
- at 30BB2AAXX080903:3:1:353:277#0
-GAGATGAAAACCTTTTTCCAAGGACAAATCAGAGAAAAAGTCTTTAACTCCACCATTAGCACAGATCTNCANTCAT
-+
-6777778888888888881888487/7760.5343000+0,-/---,,,,&*)&**(*('('((('%$"##""%#"
- at 30BB2AAXX080903:3:35:628:32#0
-AGAGAATAGTTTAAATTAGAATCTTAGCTTTGGGTGCTAATGGTGGAGTTAAAGACTTTTTCTCTGTNTTGTCANN
-+
-67777788888888888888888877776555441222100//...*--,++)**))*))('((((%"'%""##""
- at 30BB2AAXX080903:3:56:1670:650#0
-TTGGGTGGTACCCAAATCTGTTTCCCCATGAAAGAAGAGAGAATAGTGTAAATTAGAATCTTAAGATACACACACC
-+
-67777788888888888888$888777765554432.2100//..---,,+++***)))()(((((''&&%%$%%#
- at 30BB2AAXX080903:3:50:823:229#0
-TGGGTGAGTCAATACTTGGGTGGTACCCAAATCTGCTTCCCCATGAAAGAACAGAGAATAGTTTAAATCACACCAT
-+
-67771788888888882888388877776555443212100/0..---,,+++****))))((((('$$"#"%#""
- at 30BB2AAXX080903:3:42:1230:2002#0
-ATTTAAACTATTCTCTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCACACAC
-+
-67777788888888888888888877776555443222100//..---,,+++**+)*)(')(%#'%%'#$$###%
- at 30BB2AAXX080903:3:3:1281:452#0
-CTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATNTCCTNTC
-+
-6777778888888888888888887777635244333220/./..---+-*++++*))(*)(#('(($""#$"""#
- at 30BB2AAXX080903:3:52:1652:149#0
-GTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGCACACACAC
-+
-67777788888888888888888877776555443222100//..----,+++***))))'()(((%""%%$$$##
- at 30BB2AAXX080903:3:49:1560:2000#0
-TCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCCGTCC
-+
-677777888888888/88888888777//54,1222%21001+.,.&,'++)+)#*)&%('(('(&'"""##""##
- at 30BB2AAXX080903:3:51:770:842#0
-TCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTAGA
-+
-677777888888888888888880787755554432,2010//..---,,++++*+*)()()(('('%######$$
- at 30BB2AAXX080903:3:42:1433:1929#0
-TTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCACCAACCGCTATGTATTTAGTTCCTCT
-+
-6777778888888888888888$8937664554,3122.-/0..+,,-,,))**'())('()(('%'"#"#""#""
- at 30BB2AAXX080903:3:44:1337:358#0
-TTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGGGCATCT
-+
-67777788888888888888888877776555453212100//.--,,-,,+++*)*)))()'((%'&""""""#"
- at 30BB2AAXX080903:3:51:76:1710#0
-TCATGGGGAAGCAGATTTGGGTACAACCAACGCATTGACTCACCCATCAACAACCGCTATGAACCTCGTCCCCTCC
-+
-677777888888888,48888/88'767)3$504'2220&/0..,)-,+,,++)****%)%%(%'(($"""#$""#
- at 30BB2AAXX080903:3:43:1511:1868#0
-TGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACCTC
-+
-677777888888888888888888777765553430211////.-.,,,,+*+**)**)(())'(''&%#&$"##$
- at 30BB2AAXX080903:3:37:1601:1577#0
-GGTGACTGGCAGTAATGTACGAAATACATAGCGGTTGTTGATGGGTGGGGCAATACTTGGGGGGGAACTATATATN
-+
-6777778888888888888888887777655544322110/-....-&,%%*+(*)*))))&((('#&$%%%""""
- at 30BB2AAXX080903:3:59:382:1713#0
-ATTTGGGTACCACCCAAGTATTGACTCACCCACCAACAACCGCTATGTATTTCGTACAAGATCGGAAGAGCAANNA
-+
-67777788888888888888888877776555443222100//..----,+++****)))))(((''&%%$"#""#
- at 30BB2AAXX080903:3:40:1281:1063#0
-TTCATGGTGACTGGCAGTAATGTACGAAATACATAGCGGGTGTTGGTGGGGGGGTCAATACTTGGGGTGTGTACAC
-+
-6777778888888888888888887777655,4432221-0/-.'&-,,,++(*&#)*')#')((('$%#"""""#
- at 30BB2AAXX080903:3:37:508:189#0
-GTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTGCATTACTGCCAGTCACCACTAACGAN
-+
-67777788888888888888888877776555443222100//..---+,++**+**)))))(((('"$""%$"""
- at 30BB2AAXX080903:3:33:1757:1818#0
-ACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATNGTCCTGNN
-+
-67777788888888888888888877776555443222100//.--,-,,+,++**)*)))))(&('"""$$""""
- at 30BB2AAXX080903:3:40:355:782#0
-ACAATATTCATGGTGACTGGCAGCAATGTACGAAACACATAGCGGATGATGAGGGGAGCGCTAAGAGNCTGGGGCC
-+
-6/777084888888888888888*77776545443+22000//..--++,+')+&*)*')#%&(##%"$#&""###
- at 30BB2AAXX080903:3:40:209:2014#0
-CCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCAAGNTCGCAAAC
-+
-67777788888888888888888877776555443222100//..--,,,+++***))))()(((('"&#&"""#$
- at 30BB2AAXX080903:3:46:1441:1189#0
-CCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATGAATANTACAGACA
-+
-677777888888888888888888777765554432221/0//..---,,+*++*****)))(((('"""$"""##
- at 30BB2AAXX080903:3:50:916:860#0
-CCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAAGATCGGAAGAGCGGTCACCCA
-+
-677777888888888888888888777365554432221-0///.--,,,+,++)*)*))((((((#%$"#"####
- at 30BB2AAXX080903:3:2:760:721#0
-GTACCGTACAATATTCATGGTGACTGGCAGTAATGTACGAAATACATAGAGGTTGTTGATGGGGGAGTNTACACAT
-+
-677777088888888888881888777765/143302*1/0//-+--,-(++***')(#''((#(&'"""%#$#""
- at 30BB2AAXX080903:3:39:1742:542#0
-GTACCGTACAATATTCATGGTGACTGGCAATAATGTACGAAATACATAGCGGTTGTTGATGGGTGAGTCCATTCTG
-+
-67777788888888888888888877776555443222100./...--,-+++**)*))())(#(''%%"&$"""#
- at 30BB2AAXX080903:3:52:963:1624#0
-ATGGTACCGTACAATATTCACGGTGACTGGCAGTAATGTACGAAATACATAGCGGGTGGTGATGGGTGCAGGCTGC
-+
-67/77788888888888388888,777765554432/2$-&/'.-+.+,,*'(+*))*()(#()('&&$""$####
- at 30BB2AAXX080903:3:58:307:207#0
-TATGGTACCGTACAATATTCATGGTGACTGGCAGTAATGTACGAAATACATAGCGGTTGTTGTGGGGGGNGTCNNC
-+
-67777388888888888888888847+7655544%5/01/../,--,,+,('*'**&#*&&(##''''%"%"#""$
- at 30BB2AAXX080903:3:4:1229:619#0
-TTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATGAGATCGGAAGAGNCGTCNCN
-+
-67777788888888888888888877776555443222100//..---,,++++***))))((((('""%$"$"#"
- at 30BB2AAXX080903:3:53:1240:1660#0
-ACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATGAATATTGTACGGTACACAGAACG
-+
-677777888888888888888888777765554432221001/..---+,,+++***))))((((''%###&"#$#
- at 30BB2AAXX080903:3:35:189:196#0
-TCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATGAATATTAGATCGGAAGNTGCGTCNN
-+
-677777888888888888888888577765554432221000/..-,-,,++++*))))))((((('"""$"##""
- at 30BB2AAXX080903:3:34:148:519#0
-CAAGTATTTATGGTACCGTACAATATTCATGGTGACTGGCAGTAATGTACGAAATACATAGCGGTTGNCCACTCNN
-+
-67777788888888888888888877776555343222100/-...-+-,++++**)))))()((%'"#%$$"#""
- at 30BB2AAXX080903:3:4:985:1056#0
-TGGTCAAGTATTTATGGTACCGTACAATATTCATGGTGACTGGCAGGAATGTACGAAATACATAGCGTNCGTANTN
-+
-6777778828888888888888.8777765*54432%200.//..-*,,++$+'*)'*&)((&&(&'""%"$""#"
- at 30BB2AAXX080903:3:3:699:1843#0
-TCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATGAATATTGTACGGTACCAAGATCGGNAGANNCG
-+
-677777-8888888888888888877779555482221//0/..,,-,,,,+++*)&(()(((('('$"""#""##
- at 30BB2AAXX080903:3:50:1740:362#0
-TATGTATTTCGTACATTACTGCCAGTCACCATGAATATTGTACGGTACCATAAATACTTGACCACCTGCGCACAGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''$$"%#%#"#
- at 30BB2AAXX080903:3:43:1723:370#0
-TTATGTACTACAGGTGGTCAAGTATTTATGGTACCGGACAATATTCATGGTGACTGGCAGGAAAGGAGGGGGATAC
-+
-67777788888888,888/-88587777662(4231.0210/....,*+-*,++#*)((')'(#(%'%#&"""##"
- at 30BB2AAXX080903:3:44:649:1570#0
-TGGGTTTTTATGTACTACAGGTGGTCAAGTATTTATGGTACCGTACAATATTCATGGTGACTGGCAGGGGGTCGGG
-+
-67777788888888888888888877776555443222100///.--,,-++++**)*))()((((&""%$""$$"
- at 30BB2AAXX080903:3:47:613:1319#0
-ATGTGGATTGGGTTTTTATGTACTACAGGTGGTCAAGTATTTATGGTACCGTACAATATTCATGGTGACGCGCTGC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))))()(((('$%#"$$""#
- at 30BB2AAXX080903:3:48:452:648#0
-GGTTTGATGTGGATTGGGTTTTTATGTACTACAGGTGGTCAAGTATTTATGGTACCGTACAATATTCATGGGGAGT
-+
-67777788888888888888888877776555443122+0.//*----,,,+++*+)))()((((''%%&$"##""
- at 30BB2AAXX080903:3:45:1570:1609#0
-TGAATATTGTACGGTACCATAAATACTTGACCACCTGTAGTACATAAAAACCCAATCCAAGATCGGAAGCGCGCTG
-+
-67777788888888888888888877776555443222101//..----,+*+****)*))))((('%%###""""
- at 30BB2AAXX080903:3:46:220:1308#0
-GGGGGGGGGGGTTTGATGTGGATTGGGTTTTTTTGTACTACAGGTGGGCAAGTATTTATGGTAACGTCCCTACCTC
-+
-677777888888888+88*8838877776555,422,'1.+1/.'--,),,+*)**)$))(%'#(('%$$"#####
- at 30BB2AAXX080903:3:60:439:622#0
-GTACCATAAATACTTGACCACCTGTAGTACATAAAAACCCAATCCACATCAAACCCCCCCCCCCCCGCGTCAGTNN
-+
-67777788888888888888888877776555442022000./..---,,,*****)*)))(('###$""##"#""
- at 30BB2AAXX080903:3:4:40:2019#0
-TGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTAAGCATGGGGGGGGGGGGGTTGGGGGGGGTTGGCNCTCTNTN
-+
-677777888888888888888884.7776555413222000//..---,,+,'('*%')'((%&#''""""#%"#"
- at 30BB2AAXX080903:3:49:898:1401#0
-TAAAAACCCAATCCACATCAAACCCCCCCCCCCCATTCTTTAAAAAAAAGACAACAAACAACCCCCCCACCGCGAT
-+
-677777888888888,888804/1077;6/224)#$##(/&$),%$&))&)$%&#&(&##&#&####""#%"""""
- at 30BB2AAXX080903:3:36:1068:1677#0
-TGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTAAGCATGGGGGGGGGGGGGTGATCATCCN
-+
-67777788888888888888888877776545443222100//..-.,,,+++****)*))((((&'"""$$###"
- at 30BB2AAXX080903:3:59:1634:1181#0
-TGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTAAGCATGGGGGGGGGGGGTTCAACCANCA
-+
-67777788888888888888888877776555443222100/0..-.-,,,++***)))))((('''$'%%%#"$$
- at 30BB2AAXX080903:3:40:232:782#0
-TTGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTAAGCATGGGGGGGGGGGGTCTAGTGTCA
-+
-67777788888888388888888877776555443222100//..---,-+++***)))))((('('$&#"##"##
- at 30BB2AAXX080903:3:46:1552:973#0
-GGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTAAGCATGTCCGCGCC
-+
-677777888888888888888888777/65554/321210&//.---+,-+$(**+()*()&((#''%"#$"#"##
- at 30BB2AAXX080903:3:46:374:1334#0
-CCCCCCCCATGCTTACAAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCAGATCTGAAGC
-+
-67777788888888888888888877776555443212100//..---,,+++**+*))*))((((&&$$##""""
- at 30BB2AAXX080903:3:38:1280:1689#0
-TGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTACGTGTTACA
-+
-677777888888888888888888777765554432120000/...--,+,+*+***))))'))(('%$%$$""#"
- at 30BB2AAXX080903:3:58:243:1377#0
-CCCATGCTTACAAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCACGCNC
-+
-.7777788888888888888888877776555443222100//..-.--,,,+***)*)))))(((''&%#&"$""
- at 30BB2AAXX080903:3:46:520:139#0
-TGCTTACAAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCAGA
-+
-67777788888888888888888877776555443222100/....--,,,+++**)*)))()((('&$%$&$"""
- at 30BB2AAXX080903:3:50:1379:95#0
-TAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTCGCTGGGAG
-+
-67777788888888888888888877776355443222120//-..--,,+++***)*)*)())('(""%"""##"
- at 30BB2AAXX080903:3:53:1562:1290#0
-CTAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGTTGGGTGGTGTACTCACATCAAC
-+
-67777788888888888888888877776555443022100//.--+-,,+++**+)$)*#))('%&$$%%$###"
- at 30BB2AAXX080903:3:52:111:895#0
-ACAAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTGGAA
-+
-67777788888888888888888877776555443222100//..---,,+++******))))((''&&#&&&#""
- at 30BB2AAXX080903:3:57:1136:59#0
-CAAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAAGCC
-+
-6777778888888888888888887777655544322210///..---,,+,+**)))))))((((''$$#%%"#"
- at 30BB2AAXX080903:3:59:377:73#0
-AAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTCTGNNA
-+
-6777778,888888888888888877776555443222100//.-.--,,+)***+**)))()(((''&&"$#""#
- at 30BB2AAXX080903:3:4:786:1138#0
-GGTATCCTAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGGTGGTTGCTNCACANCN
-+
-67777788888888888888838877776555843522000*/.--)-'+++#+*')))&())''(#""""##"""
- at 30BB2AAXX080903:3:59:1112:304#0
-GGTATCCTAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGGTGGTTGCTCTCTCANG
-+
-67777788881888888888888877776555443222000//.,-,-,,++*+*))*)#))('((''$%""&%""
- at 30BB2AAXX080903:3:43:454:229#0
-TGGTATCCTAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGGTGGTTGCTGGACTTG
-+
-6777778888888888888888+8777765554432221.0/...--,,++*+***))))')(('('%%%#""$$#
- at 30BB2AAXX080903:3:48:244:91#0
-AAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGACTCACCC
-+
-67777788888888888888888877776555443222100//..---+,,,+**+)*)))))((('$"#"$$###
- at 30BB2AAXX080903:3:37:1280:1001#0
-GTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATCCGACCN
-+
-67777788888888888888888877776555443222100//..---,-++++**)))))()((''%&$%#%%#"
- at 30BB2AAXX080903:3:43:339:741#0
-ACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAC
-+
-67777788888888888888888877776555443222100//..---,,,++***))*)))((((''&%&%%$$#
- at 30BB2AAXX080903:3:48:925:871#0
-ACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATATCACATAC
-+
-67777788888888888888888877776555443222100//..---,,+++*****))))(((('&"$$%$"#"
- at 30BB2AAXX080903:3:57:610:143#0
-GCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTATGATACCAACCACACA
-+
-677777-88888888888888888777765554432221010/...---,+++**+*)*(#)('((('$"$%$##"
- at 30BB2AAXX080903:3:41:1598:398#0
-TGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGGTGGGGTATC
-+
-67774788888888880888888877771535443*22100//.--,-,,)+'**&**&)')''((%'$#%""#"#
- at 30BB2AAXX080903:3:36:1607:1024#0
-CAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCACCCCTCNN
-+
-67777788888888888888888877776555443222100//..---,-++++*))*))))((('(&$#%#$#""
- at 30BB2AAXX080903:3:60:1483:1864#0
-AACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACACAACANAANN
-+
-67777788888888888888888877776561481202001-..-.--,,++)%*)'*((&#(('(&&$#&"$%""
- at 30BB2AAXX080903:3:53:1212:415#0
-TATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTCACCACC
-+
-67777788888888888888888877776555443222100//..---,,,++*+*)**)))))'('"##&#%##$
- at 30BB2AAXX080903:3:36:808:1994#0
-GTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGGTTTGGAGATAGGGAGATCTCTCNN
-+
-67777788888888888888868877776555-12321100%/+/---+,,)***))#)'(#((%&#%#&##"$""
- at 30BB2AAXX080903:3:50:840:1990#0
-GTACTGTTAAGGGTGGGTAGGGTTGTTGGTATCCTAGTGGGTGAGGGGGGGCTTTGGAGTTGCAGTTGCGATCACT
-+
-677777888888808888888)8877776345113,2%100-/*.---$,+&+)***$)(()##(%'"#"""#"#"
- at 30BB2AAXX080903:3:38:404:1533#0
-ACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTAGATACGCANACT
-+
-6777778888888888888888887777652524122010//.--.-,-,,*+*+*())()(((('%"$%#"""#"
- at 30BB2AAXX080903:3:52:118:1596#0
-ATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGACACTAGCC
-+
-67777788888888888888888877776555443222100//..--,,-+,++*))*)))()((('$%"$"$"""
- at 30BB2AAXX080903:3:49:646:1661#0
-CAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTAAATAGCACA
-+
-67777788888888888888888877776555443222120//..---+,++)+**))))))(((''$"#""####
- at 30BB2AAXX080903:3:60:602:369#0
-ATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGCTTTGGAGTTCACCNN
-+
-67777788888888888888888877776555443222100//.----,,+++***)()))((('''&'#%###""
- at 30BB2AAXX080903:3:58:710:1583#0
-TATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGCTTTGGGGGCGANTA
-+
-67777788888888888888888,777-65534331221.0/./.)-+,,+&+***))())((((((""##"""""
- at 30BB2AAXX080903:3:49:1156:518#0
-CTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAGACCTACCCACCCTTAACAGTACATCATCCANCT
-+
-63777788888888$888885888777363.343-2./10./%.--,-,,+++$))#()())(('('""""%#""#
- at 30BB2AAXX080903:3:55:1543:1116#0
-CTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACAACACACCACA
-+
-6777778888888888888888887777655544323$100///-----+,++*****))))(('('$$%&"""$#
- at 30BB2AAXX080903:3:48:1310:1002#0
-TGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGGTTTGGCGC
-+
-67777788888888888888888877776555443222100//...--,-+++***)))()((('''"$###"###
- at 30BB2AAXX080903:3:2:131:1913#0
-ATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTAGATCGGAANTGCNNTA
-+
-67777788888888888888888877476545441522200//..--,,,++*+***)())((#(('"""$"""#"
- at 30BB2AAXX080903:3:42:1035:1027#0
-AATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGATTGGTC
-+
-677777888888888888888888777765504433221*0//-..---,,,*+*))))()'((((&'%"#$#"#"
- at 30BB2AAXX080903:3:53:1623:1497#0
-CCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATACACACCAAC
-+
-67777788888888888888888877776555443222100//...--,,+++***))))))()''%%&%#$$#$#
- at 30BB2AAXX080903:3:39:1298:1490#0
-AAGCCACCCCTCACCCACTAGGATACCAACAAACCGACCCACACGCAACAGGACAAAGAACACAAACATCTTTCAA
-+
-6777778888388+8882&288877/55635243.%.,1-..&*%%-''+*$+(*#''#'%(%''('"$#"$"#""
- at 30BB2AAXX080903:3:53:629:128#0
-AAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACACAAAGCTCATCACG
-+
-67777788888888888888888877776552443222100/0..,--,,+*+*+*))())(%((&'%%%"$%%%#
- at 30BB2AAXX080903:3:58:12:700#0
-GGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGNGGCNNC
-+
-67777788888888888888888877776555443022101//-.---,,+++**)*))))()#'''&$"""#""$
- at 30BB2AAXX080903:3:56:779:1644#0
-CCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACACGC
-+
-67777788888888888888888877776552412'220/0/..-.,-+,,++**)))))()((%('$%##$#$""
- at 30BB2AAXX080903:3:48:1165:1269#0
-TGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGCAGCTCAC
-+
-67777788888888888888888877776555443222100//.----*,+++*****)(')(((''&$""$"%#$
- at 30BB2AAXX080903:3:56:874:1115#0
-ATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGCGGGTAGGTTTGTTGGTATCCTAGTAGAGAGGATC
-+
-6777778888888888888888887717635,44322.100./..---,+-++***)(*''(((((''$"%&"#"#
- at 30BB2AAXX080903:3:1:1397:1840#0
-GCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGNTGNCAGT
-+
-67777788888888.8888618887227636501222.0.,/..%.--%+,+(***)())#'('''&'""""#"""
- at 30BB2AAXX080903:3:46:450:1935#0
-GTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTGGGTTTGTTGGTATCCGCGGGGGTG
-+
-67777788888888888888888807776/55443.(2100....-(-,,+)++#***)))((((#'$%%""$#""
- at 30BB2AAXX080903:3:58:1058:1119#0
-GTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTACCTC
-+
-67777788888888888888888877776555443222100//..-*-,,*,+*)*))&*)(((''(&$&%#####
- at 30BB2AAXX080903:3:46:1076:1244#0
-CCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACCGTACACAGCCAAGA
-+
-67777788888888888888888877776555443222100//..---,,++++**))))))((''&$%$##""#"
- at 30BB2AAXX080903:3:50:380:1721#0
-AATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGGGGGGAGGTTTGTTGGTATCCCACGGG
-+
-67777788888888888888888877776555340222100//..---,$+++&)*)$))))(((&#"""""##""
- at 30BB2AAXX080903:3:42:813:616#0
-GTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCGTNT
-+
-67777788888888888888888877776555443222100//..---,,+,+****))())(('(&'$&&%$""$
- at 30BB2AAXX080903:3:37:1750:557#0
-CTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTCTTGTTGNN
-+
-67777788,88888888888888877776555443222000./..-,-,,+++&**)&)))((('''"$%%"%$""
- at 30BB2AAXX080903:3:41:1315:569#0
-ACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGGTGCGCTTCC
-+
-67777788888888888888888877776555443222100//.---,,-+++***))#)))&)((%&$#&"""$"
- at 30BB2AAXX080903:3:46:815:664#0
-GACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAAGATCGGCGTCATGG
-+
-67777788888888888888888877776555443222101//-/---+,,'+**')))&)((('&''$""$#"##
- at 30BB2AAXX080903:3:55:1479:86#0
-TTGACTGTAATGTGTTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTGGTGTCGTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))'(('(&$#$"""#""
- at 30BB2AAXX080903:3:39:543:919#0
-TTTGACTGTAATGTGCTATGTACGGGAAATGGCTTTATGTACTATGGACTGTTAAGGGTGGGTAGGGTTGGTGCAT
-+
-67777788888888888888888877776555843*211/01...-&-,-+++***))#))('(('&"%#"$#"#"
- at 30BB2AAXX080903:3:37:314:1099#0
-ACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACTCTCACAN
-+
-67777788888888888888888877776555443222100//..---,,+,++**)))))()((''$$""%"$#"
- at 30BB2AAXX080903:3:60:1103:496#0
-ACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACCGCCATNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((''$%###"""
- at 30BB2AAXX080903:3:42:367:1499#0
-GGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGAGATCGGAAGAGCGGTTCTGAGGGNA
-+
-677777888888888888888888777763554432-2101/.-,--+,,&++****)))))#((#''$%#%"#""
- at 30BB2AAXX080903:3:38:1676:659#0
-CAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAGATCCCTN
-+
-67777788888888888888888877776355443222100//..---,,+++***)*)))()(''&$"$&&#$""
- at 30BB2AAXX080903:3:60:998:1537#0
-GAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGCGAACANN
-+
-67777788888888888888888877776555443222100//..----,,++++*)))))()(''&%$"##$$""
- at 30BB2AAXX080903:3:41:534:484#0
-ACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGTGGCGGTCT
-+
-677777888888888848888888777765554432.2000//..--,,,++*+***))())()''&%$%#""###
- at 30BB2AAXX080903:3:8:1294:565#0
-CATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACNCGCCACNN
-+
-67777788888888888888888877776555443222100//--,--,,+,+++**))())((('%"##$%#%""
- at 30BB2AAXX080903:3:44:462:1317#0
-CCTTAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCAGATCGGGAGCC
-+
-67777788888888888888888877776555333222100/.-.---,,,++++*)*('((%(((''&%""##"#
- at 30BB2AAXX080903:3:36:511:156#0
-TCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGGACTATGTNCTTACACN
-+
-677777888888.888888388880777655540322110///-.'-++,+++**)))*((#((#''"$%"%$##"
- at 30BB2AAXX080903:3:55:304:632#0
-TCCATGGGGACGAGAAGGGATTTGACTGTAATGCGCTATGTACGGTAAATGGCTTTATGTAAGATCGGCGGGACCT
-+
-6777778888888888888488887777555343322-10//...%,,,,,+'***))(((((('&&%"#"""$""
- at 30BB2AAXX080903:3:56:255:1024#0
-TCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGAGATCGGACGGACCTAC
-+
-677777888888888888888888777765554432221000/...,-,,++++****)))))'(('$$""$"#"#
- at 30BB2AAXX080903:3:56:899:1956#0
-TCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTATGATCAAT
-+
-67777788888888888888888877776555443122100//..---,,++)++*))*))'((((''###"#"#"
- at 30BB2AAXX080903:3:35:1422:1443#0
-TAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCNCCCACCCN
-+
-67777788888888888888888877776555443222100//..---,,,*++**(**)))(((('"$#"####"
- at 30BB2AAXX080903:3:51:461:754#0
-TAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCTCCTATCT
-+
-67777788888888888888888877776555443222100//..---,-,++***)))))((((('&""#"""""
- at 30BB2AAXX080903:3:34:758:1173#0
-AACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCNATCACTNN
-+
-67777788888888888888888877776555443222000//...--,-+,***)*))))((((''""%##%"""
- at 30BB2AAXX080903:3:51:612:182#0
-TCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTAGATCGGACCACACGTC
-+
-6777778888888888888888887777655244322210///.,---),+++**()*)))(('(''$$"""#""#
- at 30BB2AAXX080903:3:43:861:1849#0
-ACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGAGATCG
-+
-67777788888888888888888877776555443220110//.---,,,+++)*)**)))(((((&&'%%&"#$$
- at 30BB2AAXX080903:3:56:803:2016#0
-AGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGTGCTCACT
-+
-6777+788888888888888888877776555443222000//...--+-+*****()))(((((&('"$$$$#$"
- at 30BB2AAXX080903:3:54:530:404#0
-GGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACGCTGGTCT
-+
-67717088888888888888888873776555443220100///.-,,,,,+++*)**)))()((''&"#$$#$##
- at 30BB2AAXX080903:3:60:1423:74#0
-GGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATAGATCGGAAGGACACACCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))&(((('#%&&%%$%""
- at 30BB2AAXX080903:3:52:233:1754#0
-GGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGGAAATGGCTTTATGACTCATGT
-+
-677777888888888888888.880777655543/3210/0/%.,,,,,&++++&#)()()'(((&'&$$""#$$"
- at 30BB2AAXX080903:3:52:655:1729#0
-GAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTATTTT
-+
-67777788888888888888888877776555443222100./..-,-,,+,+)**))())))'(('&"$%"##"#
- at 30BB2AAXX080903:3:33:1263:126#0
-TGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGCACGGCAAATGGCTTNTCTACCNN
-+
-67777788838888888888888877976552101210200..-.--,,+,+%+**)#)')(((#''"$$#$##""
- at 30BB2AAXX080903:3:37:262:1056#0
-TGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGGGCTATGTACGGTAAGATCGGACACCACTAN
-+
-6777778888888888888888887777655.44321/.0/1/.,&-+-++++*)**)))()(''('&"$#"$"#"
- at 30BB2AAXX080903:3:46:346:760#0
-AGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCAGATCGGAAGATATGTCC
-+
-67777788888888888888888877776554443222100//..--+,,,)%)*)**('''('(%'$""#"""#"
- at 30BB2AAXX080903:3:41:288:1891#0
-CTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTCTATGTCCC
-+
-67777788888888888888888877766555343222100///.----,++++*))*)()((((&&%$%%$$##"
- at 30BB2AAXX080903:3:50:662:506#0
-GTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCACCTCAGA
-+
-67777788888888888888888877776555443222100///.---,,++++*)))**)(((((%&"%$$%"##
- at 30BB2AAXX080903:3:50:1762:337#0
-TACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCACCCCCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((('$"$#$#"""
- at 30BB2AAXX080903:3:2:1266:798#0
-AAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATAGATGACCCCCCTCCNATATATC
-+
-67777788888888888888888877776555443221110///.-,-,,+,++***))))((((''%"#$#"#"#
- at 30BB2AAXX080903:3:4:792:1223#0
-ATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGCNCTCANGN
-+
-67777788888888888888888877776555413222100//.--,-,,+++**))()()))('''%"#"##"#"
- at 30BB2AAXX080903:3:45:1487:923#0
-TTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGGGTNCACCCG
-+
-67777788888888888888888877776552443222100//..---,,+,++**))))))('(('$""$"##""
- at 30BB2AAXX080903:3:3:875:1311#0
-TGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGAGATCGGACNAGTCNCA
-+
-6777778888888888488888887777353533122210.-/+.),,-,*****)())()(&'((&""#""#"##
- at 30BB2AAXX080903:3:49:1718:1404#0
-GTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGGGGTCCCGTGCTTAGC
-+
-67777788888888888888888877776555443012100//..-,,+-++++**)))))))&'&#"#$%""""#
- at 30BB2AAXX080903:3:52:1424:1588#0
-TACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGAGATCGGAAGAGCGTGCCAGC
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(('(&%""$"""##
- at 30BB2AAXX080903:3:38:1342:752#0
-GATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAACGCGTCACA
-+
-67777.88888888888888888877776555413202120//...--,,++++*)')))(((('&'$&"$$"#%$
- at 30BB2AAXX080903:3:45:1567:27#0
-GATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAGATAGGAAGAGCGGTGCAGTTGCAC
-+
-67777(88-88888888828838837/723554430(,0'0//&,,,,,-+++*#&*&)(((#((##&""""###"
- at 30BB2AAXX080903:3:59:885:1091#0
-GCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGGGGTCCCTTGACCACNCNCAGTC
-+
-67777788888888888888888877776555443222110//.----,,++++***))))((((''&"$"##""#
- at 30BB2AAXX080903:3:3:669:505#0
-CACGGAGGATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGCNTGTANTG
-+
-67777788888888888888888878776555413222100./.-,--,-+++***)())))(((('%"#&##""#
- at 30BB2AAXX080903:3:43:754:1987#0
-CACGGAGGATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTGACG
-+
-6777778888888888-888882-7'77255/4$322210.+..,$&,+-+,%$*)*#&)(('#'''""%%%#"#"
- at 30BB2AAXX080903:3:46:659:673#0
-TCACGGAGGATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGTGTAGAGG
-+
-67777788888888888888888877776555443222100//..---,,+++++**)*))(((((''""$#$"""
- at 30BB2AAXX080903:3:36:1108:197#0
-GTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGGGGTCCCTTGACCACCATCCTCCGNTCACTACN
-+
-67777788888888888888888877776555443222120//..-,-,,+,++**))))))()(('"$#"%&$$"
- at 30BB2AAXX080903:3:56:1455:1407#0
-AATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAACCTAACAC
-+
-67777788888888888888888877776555443212100/...,.,,,,++*))*))*)()(((%$%"#""$#"
- at 30BB2AAXX080903:3:46:640:575#0
-TTCTCGTCCCCATGGATGACCCCCCTAAGATAGGGGCCCCTGGACCACCACCCTCCGTGAAACAAATATCCGCCAA
-+
-6777778888888888888888887'4765'04432%21000++.&--&-&*))*))#)(((&(('%"$$%"##""
- at 30BB2AAXX080903:3:3:582:1307#0
-TGTGCGGGATATTGATTTCACGGAGGATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGTNNTACNAT
-+
-67777788888888888888888677(76535332.-101.-.*-*+)),,'+**)*)#&'''&%&'$""""%"#"
- at 30BB2AAXX080903:3:38:492:589#0
-TAGCACTCTTGTGCGGGATATTGATTTCACGGAGGATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCTGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&$$#%%%""#
- at 30BB2AAXX080903:3:59:1015:644#0
-AGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGAGGATGGCGGTCAAGGGACCCCTATAGATCGGTCAAC
-+
-677777858888888888888888777765254432221/0//,--$-,,,+)**+*))())(((('&&&#"$###
- at 30BB2AAXX080903:3:49:462:1243#0
-CCCCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTGCTACTCTCCTCGCT
-+
-67777788888888888888888877776555441212100/..----,,++++*)*)))((()(('%$&%$%##"
- at 30BB2AAXX080903:3:2:1301:909#0
-CGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGAGGATGGTGGTCAAGGGACCCCNAGCGACG
-+
-67777788888888888888888877776555443222100//..---,,+++(**()))))((''#&"#%&$"""
- at 30BB2AAXX080903:3:33:1027:786#0
-CCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGAGGATGGTGGTCAAGGGACCNCTCGACNN
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)*)))(((('&"%%$&#%""
- at 30BB2AAXX080903:3:56:350:1962#0
-CCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGAGGATGGTGGTCAAGATCGGGAGAGTTCC
-+
-67777788888888888888888877776555443222100//..---,,,++*+*)())(((((('"%&##""##
- at 30BB2AAXX080903:3:44:219:1775#0
-TAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTGCTACTCTCCTCAGATCGGAAGAG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('''$&%%#"###
- at 30BB2AAXX080903:3:48:1429:955#0
-GGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTGCTACTCTCCTCGCCAGAACGCACACA
-+
-67777788888888888888888877776555433222000/../---+,+,++)***)'(((''('"$#"#####
- at 30BB2AAXX080903:3:38:1706:394#0
-ACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTGCTACTCTCCTCGCTCCGGGCCCATAACCGCTGGANN
-+
-67777788888888888888888877776555443222000//..---,,++++**)))))(('(('"$"&"##""
- at 30BB2AAXX080903:3:37:1024:956#0
-CCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGAGTCTCTAGTN
-+
-677777-8888888888888888877776555443222100//.----,,,,+*****))))(((('"$&$"#"""
- at 30BB2AAXX080903:3:42:1137:1299#0
-CACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTGCTACTCTCCTCGCTCCGGGACCATAACACTTGGGTTCT
-+
-677777888888888888888888777765554432/2000//...---,++*+*))&))(((((((&&%%%""""
- at 30BB2AAXX080903:3:36:975:1594#0
-TACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGCGATCTCTN
-+
-67777788888888888884888877774551443.221/0/...-,-,-++****()()(((('('%$""$"#""
- at 30BB2AAXX080903:3:45:797:292#0
-GCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGGGGCGGG
-+
-67777788888888888888888877776545443222100//..-.-+,+++***)))))(((((('&""%##""
- at 30BB2AAXX080903:3:49:123:1918#0
-CAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGANTCTTCTAC
-+
-67777788888888888888888877776555443322000//...--,,++*+***))))((((''"%$$##$""
- at 30BB2AAXX080903:3:42:446:886#0
-ATCCCGCACAAGAGTGCTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAATGAACTGTATCCGAC
-+
-67777788888888888888888877776555443222100///.---,,++++)))))))))(('''%&%#$$"#
- at 30BB2AAXX080903:3:53:790:383#0
-GATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTAGCACTCTCGTGATG
-+
-67777788888888888888888877776555443122100//..---,,+++***()))()()(('&$#%&%""$
- at 30BB2AAXX080903:3:56:1256:1063#0
-CAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGAGCGGATGTACTCA
-+
-677777888888888888888888777763554612201.0//..-*'+,+++'***)')())'#''"%%%&##$%
- at 30BB2AAXX080903:3:36:1220:1187#0
-AACCAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGAGTGGTGTNCN
-+
-67777788888888888888888877776555443222001//..---,,+,+***)))))'((((#$$&"%$"#"
- at 30BB2AAXX080903:3:34:958:571#0
-GAACCAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTNCGCCTANN
-+
-67777788888888888888888877776555443222100*/-.-,-,,,)*+**)*))))((((%""""#"#""
- at 30BB2AAXX080903:3:1:295:568#0
-GTAGGAACCAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGAGANCANAACA
-+
-677777888888888)888880087627655544122.0//-+..--,,++,+*'((*)()'('('(""%""""##
- at 30BB2AAXX080903:3:50:1738:1119#0
-GCTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAATGAACTGTATCCGACATCTGGAGACTCTAG
-+
-6777778888888888888888887777655544322*100//-.---+,,++***)*))))(((('"""#"#""#
- at 30BB2AAXX080903:3:56:1659:521#0
-TGAAGTAGGAACCAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTAGATCGGAAGAGCGACAAAAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&'%#%%$%$$
- at 30BB2AAXX080903:3:4:1086:896#0
-TCCGGGCCCATAACACTTGGGGGTAGCTAAAATGAACTGTATCCGACATCTGGTTCCTACTTCAGATCNGACANCN
-+
-6777778888888888888888887777656544521211./.-.---,+,++***())())''('(%""""""#"
- at 30BB2AAXX080903:3:42:1353:411#0
-TGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAAGAC
-+
-6777778888888888888888883787656544321110.//...-+,,*,%**))*()'(''(''&%&"#%"""
- at 30BB2AAXX080903:3:52:707:1478#0
-TGTGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGTCGGATACAGTTCATTTTAGCTACACCCACAC
-+
-67777788888888888888888877776555443221100//...--,,+++***)**)))((((''""$#$%$"
- at 30BB2AAXX080903:3:51:1717:173#0
-CGTGTGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGTCGGATACAGTTCATTTTAACACAACACAC
-+
-677777888888888888888888777765554432221&1//.---),,+++(**&)()))((('&$$%&%&$$$
- at 30BB2AAXX080903:3:50:1121:1425#0
-GAACGTGTGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGTCGGATACAGTTAGATCTGCTGCTACG
-+
-6777778888888888888888887777355544321210//.----,,,,+***)())(((((('#$#""$""#"
- at 30BB2AAXX080903:3:40:1656:1952#0
-GGAACGTGTGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGTCGGATACAGTTCATTTTAGTCNCAC
-+
-67777788888888888888888877776555443222100//..---,,+,+***))))))((((''&$#$"$#$
- at 30BB2AAXX080903:3:48:1643:1982#0
-GTAGCTAAAATGAACTGTATCCGACATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACANCACTCTC
-+
-6777778888888888888888887777655240322010/0/..,-,,,,++*)+**))))&('('&"%#$"#"#
- at 30BB2AAXX080903:3:55:1468:822#0
-AATGAACTGTATCCGACATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACAGATCGGAAGCTCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&'&"#""$""
- at 30BB2AAXX080903:3:36:1334:1173#0
-TGTATCCGACATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATTAGACNTCN
-+
-67777788888888888888888877776555443222100//..---+,+++***)*)))))('(#"&%#$"##"
- at 30BB2AAXX080903:3:37:218:257#0
-TGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGCTGGANACN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))(((&$%&&#"##"
- at 30BB2AAXX080903:3:53:1174:25#0
-GTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTGAGGAGTG
-+
-67777788888888888888888877776555443222100//..---,,+++**))*)))))('''$$#%%"$""
- at 30BB2AAXX080903:3:38:251:416#0
-CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCGCAACCTA
-+
-67777.88888888888888888,777765554430.2100/..,.--+-++)')*)))'(%&'(&'$""##"#"%
- at 30BB2AAXX080903:3:1:625:1741#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTGNTCNACTG
-+
-6777778888888888888/888)77776355443/2/100-/,.--*+++++)*)*)*((((((''""##""##"
- at 30BB2AAXX080903:3:36:943:1853#0
-GTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGCTCGCTCNN
-+
-67777788888888888888888877776555443221100//...--,-+,+*****)))(((((#%&#%$$$""
- at 30BB2AAXX080903:3:52:1558:1025#0
-GTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGCACAGGTAC
-+
-67777788888888888888888877776555443222100//-.---,,+,+***)*)))))('('$$&"$""#"
- at 30BB2AAXX080903:3:37:1103:1443#0
-AGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTATTNGNCGCN
-+
-6777778888888888888888887777655544222210./...-,--,+++++*)))))()('(%"$"""$%$"
- at 30BB2AAXX080903:3:1:1088:277#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCACNCCNCGCC
-+
-67777788888888888488888677776/454410-200.-,-..,',--++&)*)))''((('&#%"$$"$""#
- at 30BB2AAXX080903:3:2:1470:1751#0
-GTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTNCGGCAAT
-+
-6773778888888188888284887*4065504/3221/.///,,,.,-+**+)+#'))()##(('''"%&"####
- at 30BB2AAXX080903:3:57:1159:1969#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTNCTCTGTC
-+
-67777788888888888888888877776555443222100-/..-,,+,+++)**)*)((()(('%&"#"$""#%
- at 30BB2AAXX080903:3:50:179:800#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGTATCCCG
-+
-67777788888888888888888877776/55443222100//..---,,+++***)))()((('('%""#"###"
- at 30BB2AAXX080903:3:38:1353:1150#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCACACCATCA
-+
-677777888888888888888888777765554432221/0//..--,,,+++***)))((((((''""%%&%###
- at 30BB2AAXX080903:3:40:313:823#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCNAAAGCTCC
-+
-67777788888888888888888877776555443222100//..---,,,,+*****))(((((&'"&#%%""#"
- at 30BB2AAXX080903:3:55:1600:757#0
-CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACACACACAATC
-+
-677777888888*8888888888877776555443222100//..---,,+++*&**))')((('%&'&%"###"#
- at 30BB2AAXX080903:3:1:1571:390#0
-TTAGGGTTGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTGGGGTGAGGGTTAGGGTTANCCNGTCC
-+
-67777788888888888888888876776559443220100-.*.--,+(,++)'')))&'()((&%"""%"""##
- at 30BB2AAXX080903:3:41:1736:2020#0
-CTAACCCTAACCCTAGCCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCAGATCGGACGCTCTNC
-+
-6777778888888888888888887777655542211210/...-,,,,,,,*())()('('(%#&&&"$""#""#
- at 30BB2AAXX080903:3:38:1506:1060#0
-TAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACAGACAGACACCA
-+
-677777888888888888888888777765554332221000'..---,,-*****)())(((((''"""#$"###
- at 30BB2AAXX080903:3:2:599:1510#0
-AACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTACNCACACAC
-+
-677777888888888888888888777763533432221//..--.,+,++++)))())'&((('%'&"&"%%$#$
- at 30BB2AAXX080903:3:54:1472:1803#0
-ACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCAGATCACACCCAC
-+
-67727788488888888888888877176552363200/101..-,-,,,+*+*))()))(((((''$$%&"""""
- at 30BB2AAXX080903:3:60:1288:1358#0
-ACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACAGATCNCACGTANN
-+
-67777788888888888888888877776555243220000/..-.--,,**+***')))))(((('""%$""#""
- at 30BB2AAXX080903:3:40:702:1131#0
-CCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCAGATCCTACCGCAC
-+
-67777788888888888888888877776555443221100//..---,,+++***)*))((()(('$&##"$$$$
- at 30BB2AAXX080903:3:36:358:2013#0
-TTAGGGTTAGGGTTGGGTTAGGGTTAGGGTGAGGGTGAGGGTGCGGGTGAGGGTGAGGGTGTGGGGGCGCCACANN
-+
-67.77788888888888.1888817677645'443*2/100./(---&,(,,(%*(*)*&)%(((##&$"""#"""
- at 30BB2AAXX080903:3:39:1436:304#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCAAACAGATCGCACGCGCGCAA
-+
-677777888888888888888888777765554432211/0./.,----,+++%*#)()('(#&(&#$%$"""$##
- at 30BB2AAXX080903:3:60:1189:129#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCAGATCGGACGCACANN
-+
-677777888888888888888888777765554132121/0//...-,,,+,++')*))()(('(('&$"$###""
- at 30BB2AAXX080903:3:8:1516:1398#0
-TGGGTTAGGGTTAGGGTTGGGTTAGGGTTAGGGTTAGGGTTAGGGTGGGGGTTGGGGTTGGGGTTGGNCTCACANN
-+
-6777778888888888+8888888777065554&2,2210.+...,"#-,*+#'*+)'&')(''#&'"&"$$%#""
- at 30BB2AAXX080903:3:57:1246:836#0
-CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACAGATCGGAAGAGCGTGCACTAC
-+
-67777788888888888888888877776555443222100//...--+-++++*+)*)))((((('&""#$##"#
- at 30BB2AAXX080903:3:40:888:550#0
-ACCCTAACCCTAATCCTAACCCTAACCCTAACCGTAACCCTAACCCTAACCTAACCCGAACCCTAAGCTTAACCCA
-+
-6277578888888%8+888(0%887.*743513/122/00/-/-'--,,,)+++*#)(*(('%(('#'"$"#"%#"
- at 30BB2AAXX080903:3:50:1324:1835#0
-GTTAGGGTTAGGGTTAGGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTGGGTTAGGGTTAGGGACCGATNGT
-+
-6777778888888888888888887777555544322210///.--,-,,+++**))))))')((('"$"""""""
- at 30BB2AAXX080903:3:35:543:275#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGGTAGGGTNATCACGNN
-+
-67777788888888888888888877776555543212100//.----,-+++**)#)))%&(('('"#$$"#"""
- at 30BB2AAXX080903:3:49:1703:379#0
-CACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCTAACCCTAACCCTAACCCTAACCCTCTCTCACAC
-+
-677777888888888888888888777765554432220000/.-----,++++**)))*)))(''&$"#"$"#"#
- at 30BB2AAXX080903:3:39:606:1085#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCTAACCCTAACCCTAACCCTAAGATCGGAACATCCGCAC
-+
-67777788888888888888888877776555443222100//..---,,++++**)*)))()('''$&%$"""##
- at 30BB2AAXX080903:3:36:1320:637#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGTTAAGGTTAGGGTTAGGGTTAGGGTTACTCGTGTGN
-+
-67777788888888888/88888877776555443222100//-.-,-,,++****))())(((((#%$""""#""
- at 30BB2AAXX080903:3:48:578:1107#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGATCGGAAGAGCGGTTGAGCACGGTC
-+
-67777788888888888888888877776555443222100//-.--+,,+++)**)*)))'(('(%"$###""""
- at 30BB2AAXX080903:3:38:1259:1343#0
-TTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAAGATCGGAAGAGCGGTCTATCNTAT
-+
-67177788888888888888888877776545243202100//..---,,,+++**)*))))((''&$"""$"#$%
- at 30BB2AAXX080903:3:40:1690:1470#0
-ACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCTAACCCTAACCCCAACC
-+
-677777888888888888888888777765555432221/.//.,----,+++**)))(((((#(&%%$%$$%#$#
- at 30BB2AAXX080903:3:56:1127:42#0
-CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTTAACCCTAACCCTAACCCTTAACCCTTAGATCGCAGC
-+
-67777788888888888888888877776555443222100//-/--,,,,*+****())(')(%&('&&&&#""#
- at 30BB2AAXX080903:3:2:59:1248#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGGTTGGGGTTGGGGTTGGGGTTGGGGTTGGGGGGGGGGGCNCTGNNCA
-+
-67777788888888888886888-76776.5$-4302.200..+,--*$+*++)#&())(%&((('&$"$#"""##
- at 30BB2AAXX080903:3:52:1068:1516#0
-TTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGGTTAGGGGTTAGGGTTAGGGTTAGGGTTAGGGTGAGGCTG
-+
-67777788888888888888888877776555443222100//.----,,+++***)))))((((''&#"#%##""
- at 30BB2AAXX080903:3:41:1099:881#0
-ACGCAGCTCCGCCCTCGCGGTGCTCTCCGGGGCTGTGCTGAGGAGAACGCAACTCCGCCGTCGCTATGTGCTCCCT
-+
-14777788888888838888*8887'936)5('4..//0//$/,'.-#++)++*')&'&(#'''#%%&"""$##$"
- at 30BB2AAXX080903:3:4:1243:1902#0
-TGCGCCTGCGCCACGCCTCCACCCCTGGACGCGCTAGCATGTGTCTCTGCGCCTGAGATCGGAAGAGCNTACANCN
-+
-67717788888888888-8888137/10+24.(0*.../&,%-**,,&*(*)+)))''&('(&''%'""#$"#"#"
- at 30BB2AAXX080903:3:48:152:905#0
-GACTGGCAAAAATCCAAAAGTAAACACTTTGTGGAGAAACAGGCACTCCTAGACATTGCTGGTGGGATAATCAACA
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))))((('''&"#"##$##
- at 30BB2AAXX080903:3:53:533:539#0
-TCACAGCCAAGGAGATGAGCACAAGCACTACTTACTGGCCTAGGTTGTGAGAGAAGTTGATGAGATCGGCGGCGTC
-+
-67777788888888888888888877776555443222100//.+---,-++++****)))((((('"%"%#$#""
- at 30BB2AAXX080903:3:52:1058:1679#0
-GGGCCGGCATCTCCTGTCTCCTGGAGAGGCTTCGAGGCCCCTCCACACCCTCTTGATCTTCCCTGTTGCAGNACCA
-+
-6777778888888888888888887777635524.22-,10/..--,,+,,+*+)))')*#'((('&&$"""%#$$
- at 30BB2AAXX080903:3:40:828:533#0
-TCCCTGCAGACCAGGCCCATGACAAACACCGTCTCCAGCGGGCAGAGCAAAGGAAGGGCACAGCGCCAGGGCGCGC
-+
-67777788888888888888888877776553443222100/.-.--,-,+,+*****))(()((''"&"####"#
- at 30BB2AAXX080903:3:41:892:1427#0
-CACTCTGGACTCCACACTCTCCTGGGTTTCACCTTTGTAGCAGGATCCCTGCAGACCAGGCCCATGACACACCCAC
-+
-677747888888888888,888287777655.823222100-/.,%,$,,+,+*+*)))*((((((''%"%$"$$"
- at 30BB2AAXX080903:3:45:948:170#0
-AGGGCAGTAGCAGATGGGTCTGCTCCGTCTCGCTTCTAAGAAGGTGGGCAGGACAAATGAGATCGGAAGGCGACGC
-+
-6777778888888888888888887773665544322110/./.%--,+-+++)*)*()()(''('&""""""#""
- at 30BB2AAXX080903:3:42:601:500#0
-AAGGGCAGTAGCAGATGGGTCTGCTCCGTCTCGCTTCTAAGAAGGTCGGCAGGACAAATGGCAGCCTCCCGCTCAC
-+
-67777788888888888888888877776555441212.00//..*,-,-+++*')*(#))'((#(&&&##""#""
- at 30BB2AAXX080903:3:48:340:1748#0
-AGGGAGATAGAAATCCAGGCAAGGCTGTGGGGCAGGTTAGGGAGCAAGGCTGCAAGATCGGAAGAGGGTCCCTCAG
-+
-67777788888888888888888877776555143212100/..++--,,,,*+****)))'(((''%####"#""
- at 30BB2AAXX080903:3:58:1014:1441#0
-CAGACACGGGGTCTCTAAAAATAGTCATGCTGAGAGCCTAATGGCCCTTGGCACAATTGCTGGTAGATCGTCACCG
-+
-677777888888888888888888777765554432021/0//.-,-,,,++++*))*)'))('(('$$%%$#$#"
- at 30BB2AAXX080903:3:39:737:853#0
-CCACACAGTGCTGGTTCCGTCACCCCCTCCCAAGGAAGTAGGTCTGAGCAGCTTGTCCTGGCTGTGTCCCCGTCTG
-+
-67777788888888888888888877776555443222.00//..---,,+,++****))))()'''&&$#%#$$%
- at 30BB2AAXX080903:3:54:154:35#0
-CAGCTGGCAAGAGCAGGGGGTGGGCAGAAAGCACCCGGTGGACTCAGGGCTGGAGGGGAGGAGGCGAGTATGCCTC
-+
-61777788888888&88888/8887*70.,55022111&00--*,&,(,+&*+&*)))#('#((&'#$""$&###"
- at 30BB2AAXX080903:3:57:33:538#0
-ACAGCAGCAGCAGCGCGTCTCCTTCAGGTGGGAGCAGCTCTTTGAGGCCACCTGATTTCTGGTGTGCACAGATNCA
-+
-67777788888888888888888877771555,431221/-00.'---,,++**(*)*))))()(('$%&$##"##
- at 30BB2AAXX080903:3:45:710:1725#0
-CGGCAATGTACATGAGGTCGTTGGCAATGCCGGACAGGTCAGGCAGGTAGGATGGAACATCAATCTCAGGGGGATC
-+
-6777778888888888888888887777655543322211///.---+-,+)+**)*())()))'('%&$"""""#
- at 30BB2AAXX080903:3:41:967:408#0
-TACATGAGGTCGTTGGCAATGCCGGGCAGGTCAGGCAGGTAGGATGGAACATCAATCTCAGGCACCTGGCCCAGTT
-+
-677777888888888888888888777765554432221/0//.---,,-++****)))))))((('%&$#$"%""
- at 30BB2AAXX080903:3:56:134:794#0
-CTCCAGTCAAGGCTGTTGGGCCCCTTATTCCACCCATGGGAGGTGCACACAAGGTCTAGAGCGGGAGNGNCTTCCA
-+
-6777775888888888888888887667235(0430/010,//+--+,++))++#)%&''#'((##'"%"$""###
- at 30BB2AAXX080903:3:42:876:490#0
-AAAGCTCAAGGTACAGGTGGGCAGCAGGGCAGAGACTGGGCAGCCTCAGAGGCACGGGGAAATGGAGGGCGGGCCC
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)((()((''$%#"""##"
- at 30BB2AAXX080903:3:41:363:1455#0
-AGGGCAGAGACTGGGCAGCCTCAGAGGCACGGGGAAATGGAGGGACTGCCCAGTAGATCGGAAGAGCNGCGCACAA
-+
-6777278888888888888888887777655544+212101//.-'--,*+++))*)))))((('(#"'$#$##""
- at 30BB2AAXX080903:3:59:656:332#0
-TGCCCCATCAGTAGCCATGTGTGCATGTGTAAATACCATCCTCTGTGTGCCCTGGAGGCTGTCCTTCAGATAACNA
-+
-67777788888888888888888877776555443222100//...-,,,,,+**)*)*))&'(&('%&$$#"#"#
- at 30BB2AAXX080903:3:35:1540:622#0
-GGGTTGTGAAGTGCTTGCCCCATCAGTAGCCATGTGTGCATGTGTAAATACCATCCTCTGTGTAGATNCTACNACN
-+
-67777788888888888888888877776555443222100//..---,,,++****))))((('('"%%$$"$$"
- at 30BB2AAXX080903:3:45:1395:34#0
-CCTGCTGTTCCCCAGATGTGCCAAGTGCATTCTTGTGTGCTTGCGTCTCATGGAACGCCATTTCCCCGATCTCCCA
-+
-6777778888888888882888887777+55544322210///...--,,++*+**)))*('(((''"""##"##"
- at 30BB2AAXX080903:3:40:861:1811#0
-CCCTTGCCCACAGGGCCACAATCCACGTGCAGAGCAGCCCAAGCACTCACCGGGCACGAGGTATACGCGCACTNCC
-+
-672777+884,88888(8&8+8853677652514%+2-.%&*--,(,,,+*))*))&)(#&&&('''""%"#"""#
- at 30BB2AAXX080903:3:36:1322:1307#0
-GTGCTCTTCTTTTTTCTTTCTGAATTGTGGCCACCTTCATACCAGTCTGTCATGGAACACTTAAGCCTCACGCACN
-+
-67777788888888888888888877776555443222100//..---,,++*++)*))())((('%$&##"#"#"
- at 30BB2AAXX080903:3:55:343:357#0
-AGGTGCATAAGCTCTGCATTCGAGGTCCACAGGGGCAGTGGGAGGGAACTGAGACTGGGGAGGGACAGTGTATANG
-+
-67777788888888888888888877776555443222&00//..-,--,,+++**))))'((('''%$$%""#""
- at 30BB2AAXX080903:3:36:209:1470#0
-CGAAATGTACAGCATTTCTCTTTGTAACAGGATTATTAGCCTGCTGTGCCCGGGGAAAACATGCAGCACTCGACGN
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))((('('$%$$#"#""
- at 30BB2AAXX080903:3:4:536:1872#0
-AGACACAGTTCAGGTGAAGAAAGACCTGGAAACTTCTTTTAACTATAAGCTCAGTAGGGGCTAAAAGCNACTCNAN
-+
-67777788888888/8828884887877:-43442021100.0.---+,,,+++)))()(#((&('&"""%&$"""
- at 30BB2AAXX080903:3:3:1599:1484#0
-CCGGCCTCTGGCCTCACTGGCGTCTGTGCCCAGTGACGCAGGCAGGGGAGCTCCCGGCAAAATAACACNCCCANAN
-+
-67777788888888888/8888/8277165534-23+/,-///+,-$,'++$(*'('&&''#%&#%&""$#$""""
- at 30BB2AAXX080903:3:39:332:978#0
-GAAAAGCCCACTAGCTTGTCCAGTGCCACAGGAGGGGCAAGTGGAGGAGGAGAGGTGGCGGGGCTCCCCCCTCATC
-+
-67777788888888888888888877776555443221100//..--,,,+,++*))*&))#(%'&'$%##"%""#
- at 30BB2AAXX080903:3:57:192:729#0
-GAAGGGAAGGGAGAGCCAGTGACGACTGGCAGTGGAGTGGGGAGCACCGCCCCCTCTCCTCCTCCACCTGCCACTC
-+
-6777778888888888888888887777655534332-100//.-.--,,,%++'*(*)&)('((&'$%&#%##"#
- at 30BB2AAXX080903:3:38:979:972#0
-GGAACGAGGATGAAGGGAAGGGAGAGCCAGTGACGACTGGCAGTGGAGTGGGGAGCACCGCCACCTCACCTCCTTC
-+
-67777788888888888888888877776555443222100//&/-+-%,+++&*()(()#((''#'$$&&&%##$
- at 30BB2AAXX080903:3:45:9:1807#0
-GCTTGCAAGTCCCCTGTCTGCAGCCTCACCCCTGTCGCATCCTGACTACAATAACAGCTTCTGGGTGTNCACGCAA
-+
-6777778888888888888888887777655544322210///..---,,++**+**)))()(('''$"&"$""""
- at 30BB2AAXX080903:3:58:592:1403#0
-TCTCGGGGCATGAGAGGCTGACTTTCCGTGAGCCTGTGGGCCAGGCCTCTTTGAATGGGGCTGAGGGAGCTCCTAC
-+
-67777788888888888888888877776555443222100//..---,,,+++**)))))((((''&&$&###"#
- at 30BB2AAXX080903:3:45:1313:1067#0
-CCAGGGCAACCTGCATATCCACCTCCCTACCCTGCCCCCCTCTTCCAGGAGTCTGCCCTATGTGGAGCAGTGCGGG
-+
-67777788888888888888888877776555443222100//...,,,++,++**)))(()(('&'$""""##""
- at 30BB2AAXX080903:3:51:498:1610#0
-AAGTGCTGGACATGGGGTGGCCACAATCTGGAGCTGATGGCTCTTAAAGACCTGCATCCTCTTCCCTCGGTGTGAC
-+
-67777788888888888888138877776552443222100//+.---,,+)%+**)'))((((''&%"#$""""#
- at 30BB2AAXX080903:3:33:954:1706#0
-CACATACTTCCCACTGGGGTCTACCATGTGAGGCATGGTGTGGGATCCTGGGAAGGAGACCAAGCCTNCTCTCTNN
-+
-67777788888888888888888877776555443222100//..---,,++++***)))()(((&'"%&#"""""
- at 30BB2AAXX080903:3:53:1561:274#0
-ACATACTTCCCACTGGGGTCTACCATGTGAGGCATGGTGTGGGATCCTGGGAAGGAGACCAAGCCTCACACCCGCT
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))(((('&$$%&$"$"#
- at 30BB2AAXX080903:3:2:39:582#0
-ATGGGTTCCCCAGGACCGGGATTCCCCAAGGGGGCTGCTCCGAGAGGGTGGGGTGATGGGGTTGCACANACANNCA
-+
-67777788888888888888888/77%56552442.2010.%..--,-$,$+%)*&))))#&(('%'"""#$""#"
- at 30BB2AAXX080903:3:38:1749:1701#0
-TGGGATTGCCCAGGACAGGGATGGCCCTCTCATCAGGTGGGGGGGAGTGGCAGCACCCACCTGCTGTATGGTGANN
-+
-6777778888888888888888887017675641122$100//(.,-*,,(*+&%&'('&'#(&''#""%&###""
- at 30BB2AAXX080903:3:45:134:925#0
-CAACACCACGCTGCCCTGTGGTGGGGGCGTGCCGGTGGTCGTGGGGGGCTCTGACGCTCCGGCTCCGATCGGGAGC
-+
-677777888888888888888888777765554431221/0-/..'--&++,+)&*('&(()''&''""$$"""#"
- at 30BB2AAXX080903:3:58:485:1940#0
-GCTGTGTTGTCTCAACACCACGCTGCCCTGTGGTGGGGGCGTGCCGGTGGTCGTGGGGGGCTCTGGCGCTCGCCTN
-+
-67777788888888888888888877776555443222110-/-.--,,,**+)*+)&))'(''(##&%$%"###"
- at 30BB2AAXX080903:3:47:1141:1513#0
-AGAGCCACCCACGACCACCGGCACCCACCCACCACAGGGCAGCGTGGTGTTGAGACAACACAGCCCTCCTCCCTAC
-+
-6777778888888888888888887777655544+222100/...--,,,+++****)*))))('''$""##""##
- at 30BB2AAXX080903:3:51:1206:1287#0
-TATGTGCATAGTTGGGATGAGGGCTGTGTTGTCTCAACACCACGCTGCCCTGTGGTGGGGGCGTGCCGGGTGGTGT
-+
-67777788888888888888888877776555443222100/0..---,-+++***)*)))'('(&%$#"""""#"
- at 30BB2AAXX080903:3:43:880:1474#0
-TACAGTGGGGCCCTTGGTTGCAACACAAGTAGGTAGGGATGGATGAGTGTGGCATAGATCGGAAGAGCGCTGAGCA
-+
-67777388888888888488888877776-554/2222000///.--+,++++*+*)*)())(((''%&%#$""#"
- at 30BB2AAXX080903:3:34:678:962#0
-TACCAACTGTAAGTCACCCTATCTTCATACTTTGTCTTTATGTAAACCTAAATTAGATCTGTAGATCNCACAGCNN
-+
-67777788888888888888888877776555443222100//./---,,,+++**)*))))(((('"%#%$"#""
- at 30BB2AAXX080903:3:46:1623:647#0
-GCACAAAGGGGTTGATTAGCAATTATCTTTTGAAAAGCCTGTAGTTGCTCATCTGAAAGATCGGAAGAGTGGCACA
-+
-67777788888888888888888877776555443221100./.---,,,++++**)))))(((('&$$#""#"#"
- at 30BB2AAXX080903:3:59:308:1040#0
-AACAAAATCCCCTGACTTCTCAACTAGTTAATGTCTGCCCACAAAAGAAGAGGGGGTCCGTCGCCATTTCATCNNA
-+
-67777788888888$88888888877776)$54-321'000.*,--,,+,+,+)**($))#'#%###&"#&%%""%
- at 30BB2AAXX080903:3:60:570:1889#0
-GGAGAGACCCTGGAGCGGGGTGTGGGAGAACGGTCTGGAGGAAGGGCTCCGAGCACTTCAGATCGGAAGATNCANN
-+
-6777178888888888888818887747/565422232/00.+---,,++,*+)*)'))()(''((&%##%"##""
- at 30BB2AAXX080903:3:51:760:1891#0
-CGAGCTCCCGACGTGCACACGGCTCCCATGCGTTGTCTTCCGAGCGTCAGGCCGCCCCTACCCGTGCGTCTGTCTC
-+
-677777888888888888888888777765554432121////.--,+,,,*+**)(*)(((((''#"##""""#$
- at 30BB2AAXX080903:3:47:151:1547#0
-AGGAATGTCCCATGCACAAGGTGCACCGATGCCTGGGTAAAGCAGCCTGTCACCGACGGATGCACGACTGGTCGAG
-+
-(-/),7.'+0.+8/$*+&$.,#0$-#1&$',''$'.'%(-)')*%'&+)$**#$&%#)###%'#'&%%"#""##""
- at 30BB2AAXX080903:3:4:535:2007#0
-TAAGCTGTCTGGTCTGTCTGGTGAAGCTTCAAATGCTGTTCATTTCCGATAAGGGAGATCGGAAGAGCNTCACNCN
-+
-677777888888888888888485777065504132220/0-/.-.,,+-+(++**)()()((&('&$"$#"$"#"
- at 30BB2AAXX080903:3:59:969:575#0
-TGTGATGTTCTCTCCCCCATGTCCAAGCGTTCTCATTGTTCAGTTCCCACCTGTGAGTGAGAACATGCAGTGCTCA
-+
-67777788888888888888888877776555443222100//..----,+,+***)))))(()((&'&&&"$"#$
- at 30BB2AAXX080903:3:52:1065:1496#0
-CTTTCTCATGCCAAGATGAGGCTCCCCCAGATTTGCTCAGACTTACCTATAGTCAGCAGCATCGGGGGTGGGCATC
-+
-67777788888888888888888877776555443222100//..,,-,,-++*+*)))(()(((''&"""$#"""
- at 30BB2AAXX080903:3:49:178:481#0
-AGGTGCTGCCCCGAGAAGGATGCATTTATGGCTTCGTGAAGTCTTTCCTGACCCCCGATGCTGCTGAACATGCCTC
-+
-677177888888888888888888777765503432221001/.,---,-,+*****)*)((()(('"$""##"""
- at 30BB2AAXX080903:3:1:248:536#0
-CCTGGCTAGCAGGACTCAGCCCCTCCCCTTCAACTTTACTCAGGACCTGGTCTCCCCTCCTTAAGGTCNCANACAC
-+
-6777778888888888/88854857817656+130101/0..//-+*,-,+*+())()(('((&'''&"$#"####
- at 30BB2AAXX080903:3:49:511:813#0
-CAGGCTCTGGGCTGTGTTACTGGACTAACACTAACACCGTCCCCTTGCACTTCTGAGGGGTCCCTGGAACTCCCCC
-+
-67777788888888888888888877776555443222100/....--,,++++**)**)))(((('$"%$"$#$%
- at 30BB2AAXX080903:3:37:129:1079#0
-CTAAACCCGATTTAGATGAGATTCGGGACTGTGAGCATGAAGGGATCTCAAGAGGGGTGAATGTGTTCTGCACTCN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()'('"$&&&#"#"
- at 30BB2AAXX080903:3:2:436:275#0
-CTCTGCCATTCACACCCTTGAATAATCCCCTTCTCTGGTTGTAAGCAGAACCTGTGGCTTGCAGATCCNTGTCCTC
-+
-67777788888888888888888877776555443222100//...---,,++***))))('((('#$"#$%#$"#
- at 30BB2AAXX080903:3:40:439:201#0
-GCTGGCTGACACACTGATGGCACCTTACAGAGGACCAGTTAGGCTGTGCCAACACCTGACCTGAGATCGTGAGGTC
-+
-677777888838.8888488888877776525543021.0,//-+-,--,+,+&)*)(&'(()((''&&#"$$""#
- at 30BB2AAXX080903:3:45:826:118#0
-GTCAGGGCAGTGTGCTAGGAAGTGAAGGCAGGGAGATGCAGGAGGTGTGGATTGGTGGGGCGTCACAGGGTGGACG
-+
-67777788888888888888888877776555443232110//..&-#,,*++*&*()))()&('&''"$""###"
- at 30BB2AAXX080903:3:37:876:1114#0
-GACGCCCCAACAATCCACACCTCCTGCATCTCCCTGCCTTCACTTCCTAGCACACTGCCCTGACTCCAGAGACCAN
-+
-67777788888888888888888877776555443222001//-/.-,,,+***+)*)))())((%($#%""##""
- at 30BB2AAXX080903:3:33:351:917#0
-CAGCGTGGCTGCGGCAGAGGGAGTCAGGGCAGTGTGCTAGGAAGTGAAGGCAGGGAGATGCAGGAGGNATCTCTNN
-+
-67777788888888888888888878776555443222000./.+--,,,+++***))()'(((''&"""$###""
- at 30BB2AAXX080903:3:42:311:1944#0
-AGGGTGTGCAGTAGTGACACTGGGAAACTGATCATTTTGATTTCTGCTTTCTAGTAGAATCAGCTCCCAGAGACCA
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)*))(((((('"&%%%""""
- at 30BB2AAXX080903:3:42:743:504#0
-ATTCAACCCAGCAATTCCATTACTGGGTATATACCCAGAAGAATATAAATCGTTCTACCATAAAGACGTCAACACA
-+
-67777788888888888888888877716555443222100//..---,,+++++***))))((((''"%&%&%$$
- at 30BB2AAXX080903:3:60:747:2024#0
-TATTGAATTCATGCTCAGAGCAGTGAGAAAAGAGTGTATTCAAATAAGTTGAAAGAGAAAACATTTAGTGCNCANN
-+
-67777788888888888888888877776555442222100//..---,,++++**)**))(((((''&%#"#"""
- at 30BB2AAXX080903:3:54:582:1338#0
-GAGGGCAGGAGAGCGAGACCATCCTGGCTAACACGGGGAAACACCGTCCACACTATTAATATAAAATCTACACGTC
-+
-67777788888888888888888877776555443222.00./+,--)'-+,+)*%(*)()%(''(%%"#$%##$"
- at 30BB2AAXX080903:3:52:1090:647#0
-CAAAATGTGTGTTTCCTTTGTTGGAGGCATCCTGGATAGTCAGGATAATCCATGCTGTATCTCAGTTTGGTCTCTT
-+
-67777788888888888888888877776555443222100//..-.-,,+++***)*)))((((('&""&#%"#"
- at 30BB2AAXX080903:3:8:791:557#0
-ATGAACGTCTCCATGGAAAGACTGGGAAAATGGATTGCAGGTTCTAGCAGGATGTCATAATAAATGGNTCAACANN
-+
-6777778888888888888888887777655544322/100/0,/--,,,,++**)))*)))(((('"$$$%%$""
- at 30BB2AAXX080903:3:37:756:1698#0
-CATCCAGGAAAGTAGGAGGTTAGATCTGTGGATCAGGAACTCAAGAAATAGTACCAGGGTAGATCGGAAGAGTCCN
-+
-67777788888888888888888877776555443222100/0...--,-+++***))))*()((''""$"""##"
- at 30BB2AAXX080903:3:35:573:1176#0
-AGGGAGTTGGCCAGCCAGATACAGAACATGTTGTGATTTGAAGGCTGTTTCCTGAAGATCGGAAGAGNGCACTCAN
-+
-67777788888888888888888877776555443222100//..---,,+,+***)**))('(''&""%#""#$"
- at 30BB2AAXX080903:3:59:1019:1847#0
-CATTTCAATACGCTGTTCGGCCTGCTACCCCAGTTTCCCACTTAGAACAATGGCACACAGGACAGGAGCACACACT
-+
-67777788888888888888888877776552443220200//..--,--+++*****))))((((''&%$#$%$#
- at 30BB2AAXX080903:3:36:319:123#0
-AGTAGTTGGGACTACAGGCATGCACCACCATGCCCAGCTAATTTTTGTTATTTTTAGTAAGATCGGANCACTATAN
-+
-6777778888888888888888887777655544322200///..---,-+,+***)*)))((('('""######"
- at 30BB2AAXX080903:3:35:65:319#0
-AAGGCATCTCTGAAAGCTGTTTCCTACATGTGCCTATAATGATCTACCCCAAACCAACACGTGAATCNCGTCTCNN
-+
-67777788888888888888888877776555443222100//..---,,,+++**))))))(((('""$"###""
- at 30BB2AAXX080903:3:51:356:1137#0
-CCTTGTTATAAGTATTATGCTGGCAACAATTGTCGAGTCCTCCTCCTCACTCTTCTGGGCTAATTTGTTGCACTGC
-+
-6777778888888888888888887777655534322-000//...,,+,++)**))*))(''((('$""##$"##
- at 30BB2AAXX080903:3:49:563:1296#0
-AGGCCTCCTAGCACACAAGCTCATATCTTAACTACTTTAATACGTTGCGCGATGGGAGCTTACAGGTCGTCCTTCA
-+
-6777178888888888888888887777655044-222100//..,-,+,+++***#(*#)(#'(('%$######"
- at 30BB2AAXX080903:3:34:1596:1443#0
-TAATACGTTGCTCGATGGGATCTTACAGGTCTTCATTCACCCCTTTCCTGCTCACACAACCACAACCNCCCCCANN
-+
-67777788888888888888888872776+554)322.10,/.&.-(-,,++*****)*'()'(((%"$%#&$%""
- at 30BB2AAXX080903:3:58:679:475#0
-TATTTGGTTTTCTGTTTCAGTGTTAATTCACTTAGGATAATGGCCTCCAACTGCATTCATGCTGATGCATATGCTA
-+
-67777788888888888888888877776555443222100//...--,,+++****))))((&((&'&##$##"#
- at 30BB2AAXX080903:3:49:1559:181#0
-ACCCCCTGATCCCCAACAAGCAGAGCCCTAACCTCACACCAGCAGTACAGCTGCCCCATCCCCCAGGCTGCAACAT
-+
-67777788888888888888888877776555443222100//..---,-,++****))))()('(&%""#""###
- at 30BB2AAXX080903:3:60:373:1638#0
-CATAGATAATAGATGTTTTCAGATTCTGGTACATTTTGGCTGCATTTGTTTGTTTCATGAGATCGGAACGCNAGNN
-+
-67777788888888888888888877776555443222100/.,.---,,++***))*)))(('('#'$$$"#"""
- at 30BB2AAXX080903:3:44:595:1727#0
-TTTGCTGGCCAACACGAGCACTCTGGGTGCTGAGGGCGAGAGGTGGGAGGTCAGAGGAGATAGATCGGACGCGCGC
-+
-67777788888888888888888877776555443212000///.--,,,+*+***)))()(()(''&"#%"&#$"
- at 30BB2AAXX080903:3:40:52:2000#0
-CTCGCCCTCTGCACCCAGAGTGCTCGTGACGGCCAGCAGAGCCAGCCCCCATCTCCTCTGACCTCCCATGCATGCC
-+
-67777788888888888888888877776355-/32/2010*+--',+*++)#*()(&)((%&'%&'$""#"""##
- at 30BB2AAXX080903:3:41:969:902#0
-CCTTGGGACCCACATTGCTACTCCTCTGCCTGTAGGGGGACCCACAGGTATCCACACAGCTCACTCCTGTCGTACA
-+
-677777888888888888888888777705'521322$001/),---#-+,,+***))*#%''('#'&%#$$%"$#
- at 30BB2AAXX080903:3:42:960:893#0
-GCAGGGACTGTGCTGGTCTTACCTGAGCAGACCTGCATGTCTGCGGTCAACTGGGATGGCAGAGACAGAGTGTGTG
-+
-6777778888888888888888887777655544322212&//...,-,,,+++*&)))((('(((''"&#&$#""
- at 30BB2AAXX080903:3:4:1499:1032#0
-GTAGCTTTTTTGTCTTTGTGTAATAGCTATCTTATTTAGGAACCAGATGGGAAGCAGAGATCGGAAGCNGTCTNCN
-+
-67777788888888888888888877776555443222100//.--.-,,+++***)*))(((((('$""##""#"
- at 30BB2AAXX080903:3:35:220:1888#0
-CATGTTGCTGTTGTTGTTATTGATATTGTTGTTTCTGATGGATAGAGATCTAGGCCTGACACTCCAANCCCTCTGN
-+
-6777778888888888882888881777655'44522010///..'--,,+,+*)*)))()'(((''""#$"##""
- at 30BB2AAXX080903:3:44:1434:1305#0
-AGACGTGCTCATGGTCTGCTTTGCTGCTCAGCATGGCTGGGAGGCACAGTTGAAGATCATGCATCCTGCGGGACGG
-+
-67777788888888888888888877776555443212100-/.,-$),%,+**+**'*')#(&((%&&"&""###
- at 30BB2AAXX080903:3:39:101:423#0
-TAGTCAGGATGGGCTGGATTATGCTGTGTTAACAGCCATTCTCTAAATCTCTGTGGCTCAACAGGGATCTCTGCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$$""#$$##
- at 30BB2AAXX080903:3:57:854:311#0
-CATCATTTTTCTCCTCGCTGGAAGTCTGAGGGGCAGTTCACTTATCTCCTCCCCTCCCCTACTCCTCACNCCACAC
-+
-6777778888888888+8888888777765554432021000/..---,,+++***)*)))(((((&'$"%%%##"
- at 30BB2AAXX080903:3:36:388:946#0
-TTTGAGACGGAATCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGTGCGATCTCGGCTCCCTGCAACTCGCCACTN
-+
-67777788888888888888888877774555443222100/...--,,,++****))))('((&(($%"##"##"
- at 30BB2AAXX080903:3:46:556:592#0
-ACCCATGTTGCTGAAGTCATTTCTCCAATTCATGATCCATGAAACTACTTCAGCAGTGAAAATGGCAGTCCTCAGG
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))((('('$"%#"#"$$
- at 30BB2AAXX080903:3:48:1590:122#0
-TTTGATAGTGACTAGCTCTGTCACCTAGGCTAGAGTGCAGCGGTGCAAACACGACTCACTGCAGCCCTGCCGACCT
-+
-677777888888888888'88886717763.544.'3020.//...,,,,,)))%)('#()(((''#"""$"#"##
- at 30BB2AAXX080903:3:43:386:578#0
-ACTGGTGTGAGATGGTATCTCATTATGGTTTTGATTTGCATTTCTCTAATGATCAGTGATGTTGAACTTTTTTTTT
-+
-677777888888888888888888777765554132221/0///.----,+,+****))))((((''&&%&%%%$$
- at 30BB2AAXX080903:3:46:1757:533#0
-AAGGGAGGCAGTTAGGGAAGCCTTCCCTGAGTTAGTGCCACTTAACCTGAATTATGATAGATGAGATCGACAGGGT
-+
-6777778888888888888888$827786/50443+2'11,//*..-,,,,+*+**)*))))((''%%""#"""""
- at 30BB2AAXX080903:3:46:363:547#0
-GTTCAGCCCTTACTGCATATTCCAGGCACTATTCTGACTGTGGCAGGAGGGAACAAACAGGCAAGGTATCTTCTCC
-+
-67777788888888888888888877776555443222100//..--&,&+&+*+*)()()#'#(''$"#""###$
- at 30BB2AAXX080903:3:33:1000:529#0
-GAAGTGAAATGACATCAAGAGACCTATCAAGACCTGTATCCAGGAAAAGGTAAATCTGAGCTGAAATNGCCCACNN
-+
-67777788888888888888888877776555443222100//.----,,(++***)*))#')((('""#%$$#""
- at 30BB2AAXX080903:3:55:1518:1008#0
-CAAGACTGCAGCATTTCAGATAAGCCACCCTCACAAGAACACTTGCCTAGCAATGGCTGTTTCTGCCACGACGTCA
-+
-67777788888888888888888877776555443222100//..---,,+++****))()(()('''&"$%%$$$
- at 30BB2AAXX080903:3:40:8:1726#0
-CAATGAGAAAAGGAATGCTGATGTTCTCTAGAAGATAGAAAAGGCCAGGATATGGATTCTACCANANATATGCGTT
-+
-6777778.88888888888888887777655544312200///.,,,--*+++***()()'''(#(#""""##"""
- at 30BB2AAXX080903:3:52:1007:530#0
-TGAGGATATTTTACTGCAGTTCGAGTTGTAATAATAGCTCTGTTTAAGATCCGTCAGTCACTTGAATCACGTCTAG
-+
-67777788888888888888888877776555443222100//..---,,++++*+))))))(((&'%%$"##%$%
- at 30BB2AAXX080903:3:50:174:1040#0
-ATGCTGTACGAAGTACATGTTGACATGTGAGCATATAATAAATGGGCTGGAGGCCAGAGGATAGATCGCGACAGCC
-+
-67777788888888888888888877776555443222100//..--,,,+++*++)))))(((((%$$"#%#"""
- at 30BB2AAXX080903:3:56:176:432#0
-CTAGCAGGGCGTGGTGGCTCATGCCTGTAATCTCAGCACTGTGGGAGGCCGAGGTGGGTCGACTACCAGAGTCACC
-+
-67777788888888.8888888887773655544/222110./..,----+*++#*)*&()()('''"&#""#"#"
- at 30BB2AAXX080903:3:38:1047:1029#0
-GTCGACCCACCTCGGCCTCCCACAGTGCTGAGATTACAGGCATGAGCCACCACGCCCTGCTAGGAGTCTCTTCATA
-+
-6777778888888888888888882776655543322210//..--,,,,,,**#))&))((((('&$%"""#$$$
- at 30BB2AAXX080903:3:43:1699:645#0
-TAGCCAGGTGTGGTGGCACACGCCTGTAGTGGTGGGGCATGCCTATAGTCCCAGCTACTCAAGAGGCTGGGGGTCT
-+
-67777788888888888888888877776655443'2%,&0//,,,-,',,,'**(()(('((('('"%#%"$"""
- at 30BB2AAXX080903:3:59:185:201#0
-TCCCTGCAGCCACACGAGGCCCAGCAACCTGCCAGTCACTCAGTGGCCTCCAACCAGACAAAACACCGTGCACNNA
-+
-6777778288888888888888.8781765554422221*/%/&.--,,,+&*)*%((#(''('(%&%$%$$#""#
- at 30BB2AAXX080903:3:48:1203:1580#0
-GCAGCCCAAACACTCCAGAGCTCGGATACCAAGGAGCAGCTTCTGTGGGGCAGAACGGCTGCACACAGGCNATNTC
-+
-67777788888888888888888877776555443222100//..---,,+,+**))*(*)(('(''""$"""""#
- at 30BB2AAXX080903:3:36:432:1108#0
-GGGCAGCCCTGCTGCCGCCCACGTGAGCTGCTCATTCCCAGCACATGGCCAGCGAGGTCATAGCGATGTCCTCACN
-+
-67777788888888888888888877776555443222100//..---,+,,+***)())(()(''#"&%#"###"
- at 30BB2AAXX080903:3:43:1392:1284#0
-CTGTCCTCCTCCTACACATACTTGGATGCTTCCTCCTCAACCTTGGCACCCACCTCCTTCTTACTGGGCCCAGGAC
-+
-67777788888888888888888877776555443322100//-.,--,-+++**+**)))((((('&&$&%$#""
- at 30BB2AAXX080903:3:55:952:1813#0
-GGAGGAGCCTCAGCCTCGCAGGCTGCTCCGTGGGACTGATGACTGCATGATCTTCTGGGCACCTCACCGGTCGCAC
-+
-67777788888888888888888877776505443222110/.-..,-,,+*++**))*)('((((%"$$&&%#$"
- at 30BB2AAXX080903:3:2:1543:1260#0
-GCAGGGCAGCCAGGGTTGTGCCAGAGCCTGAGCAGGTGGAGGGGGGGTGAGGCGGGGCTGGGGGGCATNCGACTCG
-+
-2-+7573888,1818&)/&.*)*)&'+&*)(,$&.*%#+#,*#(,**#$$%'%$&(&&##&###%%#""$#"%"#"
- at 30BB2AAXX080903:3:58:1209:655#0
-GTCTCGAAGGCCTGCACGGGCCCAGCCTCGGCCTCGGCCTCACAGCGGACTCTCCACGCCCAGCTAGCTCTCCAAC
-+
-67777788888888888888888877776555443222100//...--,,+++******))(((((''&&%#%"$%
- at 30BB2AAXX080903:3:3:1253:995#0
-TGGGAGGTCGCGGTGGGGCGAGAGCTGGGCCTGGAGAATCCCCTGGGAGGCAACAGCGGGGTATGGGANCGTCNCT
-+
-6777778888888888,8838818(77766.'4402.'0.-./+,.-+,-(*')**')(''&##'##""#%$""#"
- at 30BB2AAXX080903:3:33:317:1713#0
-TCCCACGCTGAGAGAGGTCAGCCTGAGCCCTTGCCTCACACCAGCCCCTCCCACGCGGACAGAGGTCNCTACACNN
-+
-6777778888888888888888887777655544222210/0/.-.,-,,+,+*+***)))()((''"$##%$#""
- at 30BB2AAXX080903:3:4:1136:1040#0
-CCTCCCACGCGGACAGAGGTCAGCGTGAGCCCCTTGCCTCACACCGGCCCCTCCCACGCTGAGAGAGTNACCTNTN
-+
-677777888888888888888888-/7,335243.0.,1./../,+-+,)+***')((('&'(''&'""#&&%"""
- at 30BB2AAXX080903:3:3:1096:557#0
-CCCCTCCCACGCTGAGAGAGGTCAGCCCGAGCCCCTTGCCTCACACCGGCCCCTCCCACGCTGAGAGCNCGCTNCC
-+
-6/2774888888882888.88.5///+/603(1$/..1&01*,+++*++&%&'(#'&'&''#(#'##$"%##""##
- at 30BB2AAXX080903:3:41:865:161#0
-GGCTCGGGCTGACCTCTGTCCGCGTGGGAGGGGCCGGTGTGAGGCAAGGGGATCGGGCTGACCTGCATCCGGATCC
-+
-647(778888888888888888884707655148222-1%0-/.*%+-,,)$%'*)*)((#&('&'#%$"&$%#$#
- at 30BB2AAXX080903:3:57:26:621#0
-TCCTCCCACGCTGAGAGAGGTCAGTGTGAGCCCTTGCCTCACACCGGCCCCTCCCACGCGGACAGAGGTTCNACAC
-+
-6777778888888888888888289777555541132000,..--,-,+,+%+*)&()(('&'&'#&$"#"""$$"
- at 30BB2AAXX080903:3:3:793:2004#0
-TGTCCGCGTGGGAGGGGCCGGTGTGAGGCAAGGGCTCACACTGACCTCTCTCAGCAGATCGGAAGAGCNTGTNNCG
-+
-67777788888888888808808,71153/.232/.0-0..)-*,,,+)+()'())')%('(#''%'$""#"""#"
- at 30BB2AAXX080903:3:49:1451:1705#0
-GCGTGCGGCCCAGCTCCTCCCTCACGGTGGCCTGTTGATGCCCAACTCATGAGATCGGAAGGGCGGGCGCAGGCCT
-+
-6777778888888888888*8688771-650533%22+00)#.(,-),+++*+)*%))&()()#((%$"#"""##"
- at 30BB2AAXX080903:3:8:1007:1602#0
-CCAGGAGATGGGTAGGCACTGAGTCCAAAGAGGTTGTTGAGAGGCAGGAATCGGGCCTGGAGACCCANACTAGANN
-+
-677777888888888888888788777765454,32,21/0//.--,,),$)))*((&()%('&'''"%$""""""
- at 30BB2AAXX080903:3:52:1492:1419#0
-TGGTGGCCTATGAAGGCCCAAAATCTCCTCAAGTTGACCTGTCCAGGCCCAGCTCCTGCCTCCTGTCCACCTCTAC
-+
-67777788888888888888888877776555443220000//..--,,++,+**))*)())(((('$"##$##"#
- at 30BB2AAXX080903:3:51:1475:1741#0
-CATGACTCTCAATGGCCTATTTAGGCCCATACCCTACGTCACGGCAGCCTCCGCAGATGAGGCAGATGTCATNGGA
-+
-677777888888888888888888777765551432221/0//...-'+++*+)(*(()&()#('%'""#""""""
- at 30BB2AAXX080903:3:57:1499:235#0
-GAATGTGAGCAAAGGGGAGTGGCTGTAAATACAGACGAAGCTTCCCTCACTCCCTCACTCGACACCGCACTCCTCC
-+
-6777778888888888888888887*77655244302210/*/-.-+-,,,++*(*))')((((((''$%"#$"#"
- at 30BB2AAXX080903:3:60:348:1822#0
-TCATGGGATACCCAGTTAATATCCAGAGCACTGAAGAATCTGGTGTAGAAACTCCATACGTACATTCAGTGNGANN
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))((((('&%"""#""
- at 30BB2AAXX080903:3:1:1061:1251#0
-TGCTGCTGATCTGACAGGACATGGAGCTCAGGTGGTCATGCAAGCGATGGGAGGGGCTAGAAATACAGNACNCACA
-+
-67777788888888888888888877776555,42220100-/---,,,,,*+*+*())()((((''""##""##"
- at 30BB2AAXX080903:3:35:1669:1510#0
-GTTGGGTGCAATGGCTCACACCTGTAATCCCAGCTACTCAGGAGGCTCAGCTAGGAGGATGGCTTGGNCTCTACAN
-+
-67777788888888888888888877776555443222100//..-.-,,++++*)*)(())'((&%"%"&""##"
- at 30BB2AAXX080903:3:4:369:930#0
-TCAGAGCAAAAGCCAAAGCCCCAGCAATAGCGTCCCAGGGATTACACGATCTGTACCGATCTCAGCGCNTCTANCN
-+
-6777778888888888888)88883777653528121210//+-,---+,*++***(*)&(&((('#%"#""#"#"
- at 30BB2AAXX080903:3:37:1298:800#0
-GAGTTGGAGAACTGGTGTAGAAACTCTGCACACACATTTGGTCAGAAGTCTGTGAGTAGAGAGAAACGTGTCTACN
-+
-67777788888888888888888877776555443222100//..---,,+++*+***)*)(()(('%$&###$$"
- at 30BB2AAXX080903:3:35:194:71#0
-GGAGTTCGAGACCAGCCTGATCAACATGGTGAAACCACGTTTCTACTAAAAATACAAAAATTAACCANCCACATNN
-+
-67777788888888888888888877776555443222100//..---+,,++***)))*)()(('&""##$#"""
- at 30BB2AAXX080903:3:47:112:269#0
-GCAGGTCAGGTGAGGTGGCTCATACCTATAATCCCAGCCCACTGGGAGACTAACGCAGGAAGAGTCCGATCGTGCG
-+
-677777.888.88888888888-877)7655244322210)/..'-,-,++++'*()*)&(((''#%&""$""##"
- at 30BB2AAXX080903:3:51:262:1243#0
-GGAGGCAGGGAGAATTGCTTGAACACAGGAGGTGAGACTGCGATGAGCTGAGATCAGACCACTGCACCATGACAGC
-+
-&777778888-888888881818)7.57155,%322%,./.%#-'-&',-*+(*')(&#)''&(#%#$"#""$"#"
- at 30BB2AAXX080903:3:38:1258:1769#0
-GAGGCAGGGAGAATTGCTTGAACACAGGAGGTGAGCTTGCCATGAGCTGAGATCATACCACTGCACTCCTGCTCAC
-+
-67777788888888888888888877776552443.22./01....(,,+,,+)**)()('#(((('%$%%%"###
- at 30BB2AAXX080903:3:35:180:1763#0
-TGAACCCAGGAGGCAGACATTGCAGTGAGCCAAGATCACGCCACTGCCAGCCTGGATGACAGAGCAANTGTCACTN
-+
-6777778888888888888888887777655544322210///..---,,,,+**))))))()((('""##$##""
- at 30BB2AAXX080903:3:43:101:113#0
-GGAGAATCCGTTTCCTGGCCGTAGAGGTGGACTGCACTCCGCAGCTTGTGCTGCCCGTCGCGAAGGGTTGGAGATC
-+
-677777888888888888888888777765$5143222100//.,----,)++))*)()))(#((%'$$%%""#"#
- at 30BB2AAXX080903:3:42:1289:788#0
-CAGAGTAACATGGCAGGAAGTGAGGGGGAAAGCCGCCCTGGAACTGCGCCTCTCTGCCCCCTGACGTCAGCTCGGA
-+
-67777788888888888888888877776755143321,00./+,---,,+,***+*))))(((((#'$%""%""#
- at 30BB2AAXX080903:3:47:1349:1408#0
-CCCGCAGCTATGGGGCTGAAGGGGAATTACAGCCCAAACACCAGATGCTGGCTCTCAAACCAACACTGTCGCGTCC
-+
-6777778888888888888$880817776555.3/222.(,/.+*,,,+++&'%&&&'('&'&&'%%""#"$""##
- at 30BB2AAXX080903:3:36:1643:70#0
-AAAGTGCGCTGATTGTATCTCCCTGTGGGCACTGAGGGCTCAGTGTGAGTTTGAGAGCCAGCAAGATNATACATNN
-+
-67774788888888888888888&77776552,422220#0-/#.*&++((+*))**')('(''((#""""$#"""
- at 30BB2AAXX080903:3:2:1208:1712#0
-TAAGAGACAAAGACCAACGAGCCACCACAGCCACCAGTCCCAGAACCTGCCAATGCTGGCGAACGCAANACTGACG
-+
-677777888888888888888888777715$544332'1//0.,--,-,-+**)*))))#)(('(&'$""#&#"$"
- at 30BB2AAXX080903:3:41:1032:925#0
-TAGAGATGGGGTTACAACATGTTGCCCGGGCTGGTCTCAAACTACTGACGTCAAGTGATCCACCTGCCTTGGCTTC
-+
-67777788888888888888888877776555443222100//./---,,+++**))**))((((''&&%&%%##$
- at 30BB2AAXX080903:3:49:1300:1010#0
-GATGTTCTACAACATTGCTTAACGCAAGGGGAGACGCTCCTGACTCAGAGTGTTTAATTGCTCACCTACTTAGCTC
-+
-677777888888888888888888777765554422221-0//..-,-,,+++***))))()(((''"$"###"$$
- at 30BB2AAXX080903:3:37:1558:1949#0
-AGAAAAAGAAGTAGGTGAGCAATTAAACACTCTGAGTCAGGAGCGTCTCCCCTTGCGTTAAGCAATGTTGCACCGN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))(()((('"$##"#$""
- at 30BB2AAXX080903:3:41:1521:31#0
-CTCAGTGGTCAGCGGAAACTTGATGATAGCATAGTGGCCAAGCTTGTTTCTCCTGGGGGTGCTCAGATCGGATGCT
-+
-6777738888888888888888887677655544322210///.,--,,,)++)*****#(''(''%"$%"#""#"
- at 30BB2AAXX080903:3:43:1395:698#0
-GAGGTCACACTATGTGTATCCTCCTCAGACTGTCTTCTCCCACTTAGCAATGTGCATGCAAGATTCACTCATGTAG
-+
-67777788888888888888888877776555443222100//..---,,,++*+**))))()(('''&&$&$$#$
- at 30BB2AAXX080903:3:35:1014:2002#0
-AAGGCACATGAACTATACTTCATTATTGGATTCCATTTTATAAAGTTCTTTCCAACAGATCGGAAGANCCGCTCTN
-+
-67777788888888888888888877776555443222100//..---,,+++**+)))))((((''"$$"%##""
- at 30BB2AAXX080903:3:1:1373:706#0
-GTAGGTTAGACACACACATATACTTCCTAGCATTGCTAATGAGGGACAAGATACAATGTGCATTCAGCNCCNAGAC
-+
-67777788888888888888888877776555443222100//..---,,++***+))))()()'((&"%$"""#"
- at 30BB2AAXX080903:3:44:724:1311#0
-TACTACTGTAACAGAAAACATGTAAAGGACATTTGTTTTGATTTATATATCAGTCTGCAAGATCGGAAGAGCGATT
-+
-67777788888888888888888877776555443222100//..---,,,+++***)))))((((''&"#"""""
- at 30BB2AAXX080903:3:59:1599:1766#0
-AGGAAGGGATGCTTTTGTAAAACAAGACTTGTGGAATATAACATGTGAAAGTAAAGCCCATGGCAAACACCCANAC
-+
-677777888888888888888888777765554432221000/..---,,+++***()*))((('(&$$%%%$"$$
- at 30BB2AAXX080903:3:42:1295:1267#0
-AAAGTGAGAAGCAGAGATAAACTAGTCCTAGACAGCTGACTCATGTTGGGGGCAGCCCACAGATCGGAAGCGCCAC
-+
-67777788888888888888888877776555443222100/...---,,+++***))))))()((('#&"$$##$
- at 30BB2AAXX080903:3:47:1062:671#0
-CACCTCGAGGCAGCTTTGTAAGCTTCTGAGCACTTCCCAATTCCGGGTGACTTCAGGCACTGGGAGGCCTTCTGTT
-+
-67777788888888888888888877776555443222100/...--,,,++++****))))(((('$&"$#$"""
- at 30BB2AAXX080903:3:59:968:73#0
-TGAGACTCACCTTGGTTGTGTTCTTTTATTAGTGCCTGTGACGCAGCTTCAGGAGGTCCTGAGAACGTGGTCANNC
-+
-6777778888888888888888887777655544322210///..---,,+++)**))*))((''#'&%$$%$""#
- at 30BB2AAXX080903:3:50:1512:1586#0
-TGTTTTGTGTCAGGGAAAGAATCAACCTGGGAGCCAAGCCCAGGAATCAGGATGACCAAGACATACTCGGCGAGAC
-+
-6777778888888888888888887777655544322201///..--,--++*+**&)))('(&(%'$""#"#""#
- at 30BB2AAXX080903:3:4:1738:1246#0
-ACTGCACAAGGAGGGAACAAACCCATCCAAGGACACTCAAGGACAAATCAAGCAAATGAATTTAAGGCNGCTCNAN
-+
-677777888888888888888888767722554632010-/..---,+,,++)**)(*)(('(('''"""""#"#"
- at 30BB2AAXX080903:3:54:828:1860#0
-AAGTCGGTAGACTAATACCTAATAAAAGCAAAGCTGCCAACAATTGAAATTGCCTAGGCTGCTCTGTGTGTCCCTC
-+
-67777788888888888888888877776555443222100//..-,-,++++***)))))()(('&$$%$"$#"#
- at 30BB2AAXX080903:3:36:644:1261#0
-TGTTAATATCAGATTAGTCAGGATGGGCTGGATTATGCTGTGTTAACAGCCATTCTCTAAATCTCTTGTGTGTGCN
-+
-67777788888888888888888877776555443222100//..-,-,,,,+*+*))))))()(('%&#$$%#$"
- at 30BB2AAXX080903:3:40:537:1113#0
-ATCTGGGTGCCTGGCAGGATGACATGGTGTGAGGCTCAAGCAGCACTGTGGGAATTCAAGCATCTGTTTATTTANA
-+
-67777788888888888888888877776555443222000//.-----,+++***)*))())((''"&#%"$#""
- at 30BB2AAXX080903:3:3:1615:1646#0
-AAGTACAGAGGTTATTCCTAGGGTCTTTAATATTACTGTCCCTTTAGGCAAGATTATCCGTATGATAANATGANCN
-+
-677777888888882888888&887777635544312200./,--,-,,+++)**)())')'((''%&""""#"""
- at 30BB2AAXX080903:3:34:1136:1098#0
-CTCTTGCTGCCCAGGTTGGAATGTAGTGGTGCGATCTTGGCTCACTGCAACATCCACCTCACGGGTTNTACTCTNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(('%'"%%"##"""
- at 30BB2AAXX080903:3:39:961:878#0
-GGTTGTTAACAAGAGCCTGGCACAAACCCCTCTCTCTCGCCACGTGATCTCTGCACATGCCAGCTTACATCGTACA
-+
-67777488818888888888888877776555443212100./.'---,,+,++**)**((()''('"""%"""#"
- at 30BB2AAXX080903:3:43:1170:932#0
-CACAGTTCTGAAGGTGTGCAAGAAGCATGGTGCCACCATTTGCTTCTGGTGAGGGCGTTAGGCTGTTTCAGATGTA
-+
-67777788888888888888888877776565443222100//..---,-+++**))*)))(((''(&$#&"""""
- at 30BB2AAXX080903:3:49:39:584#0
-TTGGAAAGCGGAATTTATCTTCATATAAACAACACTGAGCTAAATCTCAATATTTCAGATCTCTAGACCGCTCAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&$"#"$#"""
- at 30BB2AAXX080903:3:58:786:154#0
-TAGAACTATCCATCAGTGAAATGGATTGCAAATACAAAGAGTAATACCATGTCACTTAAGAATACAATCATTGNNA
-+
-67777788888888888888888877776555443222100././--,,-+++*++**))))((((''&%%""""#
- at 30BB2AAXX080903:3:56:1030:521#0
-GGTCTCAGTTCAAATGTCACTTCCCTGTAAAAGCTTCCTGGCCATCAAGCCTTCTTTACACACTCAGATCTGCGCC
-+
-67777788888888888888888877776555443222100//..---,,+++****)*))(()(('%'"""""#"
- at 30BB2AAXX080903:3:43:1004:671#0
-TGTGGAGGCAAGAGGATCACTTGAGGATCACTTGAGTCCATGAGGTCAAGGCTGCAGTGAGTCATGGTTGCGCCAC
-+
-67777788888888888888888877776555443202120//..,-,,,+**+*)*#*()'(('(#&#%$$%###
- at 30BB2AAXX080903:3:57:960:270#0
-ATTATGGTTTTGATTTGCATTTCTCTAATGATCAGTGATGTTGAACTTTTTTTTTGTATGTTTGTAGATGTTCATA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((''&&'#""##""
- at 30BB2AAXX080903:3:52:1474:218#0
-AAAAACCACCACCATCATTTTGCAAGTGTTACCACTATTGTGTGTTAATATTGTAGAAGTATTCCTAGTGATGTGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&"#"&%$##$
- at 30BB2AAXX080903:3:2:180:685#0
-ATTGTCTCATTTTCAGAACAGAGTACTAAATGGATCATGAACACTATCTGGTATGTCACAGATCGGACNTGTNNCT
-+
-67777788888888888888888877776555443222100//..,-,,,+*+***)*)))(('(('"""$"""""
- at 30BB2AAXX080903:3:56:1111:307#0
-GAGAATGGGACATTTAAGAATAGACTTGAAGGACAGGCAAGAGCAATCTCTATGTTTATATGGGAGATCGGTCATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((('&"%$%"###"
- at 30BB2AAXX080903:3:51:1412:1403#0
-ACTGAATGCAATAAAGGCTTATCAGATGTGATTAAGGATGCAAACCGAGATGGAGAGATCTTCCTGGATGCTCACN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))()((('''"""#"#"#"
- at 30BB2AAXX080903:3:42:222:1832#0
-CACCATTCCCTGAACAAAATATGCCATCTTCGTTGTTCAGGTCTGTACAGTGCTAGATCGGAAGAGCNGCACACAC
-+
-+77777848888/8.8/83808889777654544322./0/.-..-,),,,+*+*+**)))'((((#"$#"$%"""
- at 30BB2AAXX080903:3:53:1153:1961#0
-TCCTGCCACACTTAATTCACCATTCCCTGAACAAAATATGCCATCTTCGTCGTTCAGGTCTGTACAGGGGTGACCT
-+
-6777778888888888888858887/77655544522210/.0.,--,,,++++**))(()))('(%"$""####"
- at 30BB2AAXX080903:3:2:1594:1461#0
-CATGCATGTGTAGTCCTAGCTACTTGGGAGGTTGAGATGGGAGGATTGCTTGATCTCAGAAGGCCAACNCTACACA
-+
-67777788888888888888888877776556443222100./.-.--,,+,)+**)*)(())('('""#$##$"#
- at 30BB2AAXX080903:3:40:564:69#0
-GGATGCACTTGAGCAGGGGTCCCCAACCCCTGAGCCATGGAGCCGCAAGGAGCCACACAGCAGGAGGTGACCAGAG
-+
-67777788888888888888888877776555543222101/...--*,,*++****)())((('''"&####""#
- at 30BB2AAXX080903:3:35:753:1760#0
-GCAGCTGGCCAGGTGTGGTGGCTCACACTGGTAATCGCAACACTTTGGGAGGCTGAGGCAGGAGGAGNCTCATATN
-+
-6777778888888888888888887777655,48332020////.---,,++*+*))))(*((((%&"%"####""
- at 30BB2AAXX080903:3:49:1196:1797#0
-AGGCCGACGGGAGGCAGAGGCTGGGCCTGGAGGGGCCACCAAGATGCAGGAGCTGGGCCTGGAGAGGCAACCACAC
-+
-6777778888888888888888887/776565443.01000-/.--,,,,++'**)*#())((('('%"""$"#"#
- at 30BB2AAXX080903:3:55:1711:1853#0
-CCCAAATCAGGCTTTTGCCCAACTTCTGTCTACTGTCGGACTCTACAGGTCAGCCTCTGCCTCACACACACCCACA
-+
-6727778888888888888888887/7763550432.2100//.-+--++*+*$')(*)&()((''&$$%%$&%$$
- at 30BB2AAXX080903:3:59:367:1142#0
-GTGAGGCCTGACCTGGGCCTGGGGAGCTTGGCTTGAGGAAGCTGTGGGCCGACCAAGGCCGCCAGGAGGTAACNNA
-+
-677777888888888888888888.77765554430220/0...-----,+*+*))*))))')(((#&%"""#""#
- at 30BB2AAXX080903:3:39:38:1695#0
-TGTTGAGGCAGGGGGTCACGCTGACCTCTGTCCGCGTGGGAGGGGCCGGTGTGAGGCAAGGGGTCACCTACACCAC
-+
-677777888888888888,878882777655334221211,0/.-+---*,'+(**##'(((###%#$""#"##"#
- at 30BB2AAXX080903:3:43:1318:786#0
-AGCAGCCCGAGAGCGATCCTGTTCCTCCCTCACGGTGGCCTGTTGAGCCAGGGGGGCGCCGCGCAGTACGGCCGCG
-+
-0777778880,888884888888861276)5514/0112$)..&..-$')*)++*######'(##&&"#""#$##"
- at 30BB2AAXX080903:3:33:1128:1150#0
-ACCCGGAAGGCTGAGGCAGGAGAATGGCGTGAACCCGGCGGGAAGAGGTTGCAGTGAGCCAAGATTGNGCCCCCNN
-+
-67777788888888888888888877776555483222100//..---)-+***+**))(()(('('""##$##""
- at 30BB2AAXX080903:3:54:155:1356#0
-CTATGCACACATCTTCCCCTCCAAGGTTTGTTCTGCCCCTGCCCTGACTCCCAGCCCTGTGGGGGTCCTCAACCCC
-+
-67777788888888888888888877476555343210020...,---,-++)+*)))('(((((%&"""""$###
- at 30BB2AAXX080903:3:42:1470:976#0
-GCAGTGGGCCTGGAAGAGCTGCATGATCAGGGCCGGCACTGGTCCAGGGTACGTGCAGTGAAGAGGACNAGATCCT
-+
-6777-7888888888888888888777765554432211*1/...---,+++++**)*()('(((('%"$&#"""#
- at 30BB2AAXX080903:3:1:1184:305#0
-CACTGAGGGACTGGGCCTGACATCATCTGAGTGGTAGAGGCAACTGGGTGTCAGGAGACATGATGGAGNCANTAAC
-+
-6777778888888888888388887747655644022111/..(-.-,+,+(***)))((()(''(&""##""""$
- at 30BB2AAXX080903:3:56:1412:1940#0
-TGCTCTTGTCACCCAGGCTGGAGTGTAATGGTGAGATCTCTGCTCACTGCAACCTCCACCAGATCGGATGCTGCGC
-+
-67777788888888888888888877776555443221100//.-.+-,++,+)**)*)()((''(''##"##"""
- at 30BB2AAXX080903:3:4:388:998#0
-GCACTCTGTCACCCAGGCTGGAGTGCAGTGGCACAATCTCTGCTCACTGCAACCTCTGCCTCCTGGGANATCANCN
-+
-67777788888888888888888'777785554330201/0...--,+,-,*(**)())(((((('&&""#%""#"
- at 30BB2AAXX080903:3:34:913:939#0
-ATAAACAAGGATTATAATCTGAGATATTTGTGCTATGATCAATCATAGGTGCATCCCAAGAGATCGGNCTCACANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))())('&"$"##%"""
- at 30BB2AAXX080903:3:40:407:531#0
-AGGAAAATATGTAAAGACAAAAAGAAGTCCATGCAAGCTGTTTTGAAACAAACATCATTGGTCACAGCGAGGCACA
-+
-6777778888888888888888887775635544322210///...--,,-++***)))))))(((&&%#"""###
- at 30BB2AAXX080903:3:34:825:1405#0
-AATCTGTGTGGCTTCCAAATTTGCAAGCTGAGAATTTAATTCAAAGTGGTCTCAGGTTGAAGATCGGNCACACTNN
-+
-67777788888888888888888877776555443222100/0..-.-,,,++***)*)()))(((&"$$#$#"""
- at 30BB2AAXX080903:3:47:11:1920#0
-TTCTTGTGCCCTCTCCCTCTCTCTCTTTCTCTTGCCCTCTCATTTGAATGAAGCCAACTGGCATGCTGACACACAG
-+
-677777888888888888888888777765554403221000/..,-,,,+++*)**))))(()('(&%###"##"
- at 30BB2AAXX080903:3:40:161:1355#0
-GAGATTTGGGTGGGGACACAGCCAAACCATATTGCTGCTGAATAGATCATGTAGACAGGCTCTCAAANTCCAGAAC
-+
-67777788888888888888888877776555443222100//...--,,+++****))()))((('"$""%$"##
- at 30BB2AAXX080903:3:50:961:593#0
-TTGGGAAGGCATGATTGGTTTTGAAATGTGAGGACATGAGATTTGGGAGGTGCCAGAGGCAGAATGAGGCGACCAA
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((((''$"##"##""
- at 30BB2AAXX080903:3:44:703:170#0
-CCACGGTGCCTGATCCCTGCTGCATCCTCCTTCTCTAGTGGCAACAGCAAATGGCCACACAGAAGGCAGACACTGC
-+
-67777788888888888888888877776555443222000//..---,++,++****))(((('(''$"""""##
- at 30BB2AAXX080903:3:1:657:109#0
-TGACAGAGCAGGCTCCTAAGTCAATGAAGGAGAGACTGGCCAGTAGAAAGTACATGGGGGAGTGGAACNAANACAC
-+
-677777888888888888888388777765451410222*)-/,-.*,,,$*%*'))*))#(#(##%"""""####
- at 30BB2AAXX080903:3:38:1408:1753#0
-GCAATCCTAGTCTCTGATAAAACAGACTTTAAACCAACAAAGATCAAAAGAGACAAATAAGGGCATTACATAACTG
-+
-67777788888888888888888877776555443222100//.----,,++++**)))))((('(&$$%&$#"""
- at 30BB2AAXX080903:3:38:423:536#0
-CAAGCTGGCATGTGGCTTGAGGTGACCCGAATATGTCAGCACCCCTCAGATGTCTTTCAGATCGGAATAGCCGACA
-+
-677777888888888888888888777765554430221*,./..--*-,++*****)((((((('&$#"#"""##
- at 30BB2AAXX080903:3:3:27:1957#0
-CATGTGTTTTTTGGCTGCATAGATGTCTTCTTTTGAGAAGTGTCTGTTCATATCCTTTGCCCCCTTTCNTACNNGT
-+
-6777778888888888888888887777655544302110///..-,-,,+++**()*))))(('('%"#"#"""#
- at 30BB2AAXX080903:3:43:823:764#0
-GTCCATGTGTTCTCATTGTCCAATTCCCACCTATGAGTGAGAACATGCACTGTTTGGTTTTTTTTCCTTCTGGTTT
-+
-6777778.888888888888888877/76555'432221/0//..----,,+*****)&))'(%(''&&$&#$#""
- at 30BB2AAXX080903:3:54:34:362#0
-TTCTGGGTGCAGCACACCAACATGGCACATGTATACATATGTAACAAACCTGCACTTTGTGCACATGTGGCGATGA
-+
-6777778/88888888885388887777655.4432302/0-.-..,,,,*,+**)())()((((''$""%""""#
- at 30BB2AAXX080903:3:52:540:1144#0
-CCCCTGAGAGGCCCTGGTGTGTGTTGTTCCCCTCCATGTATCCACGTGTTTGTCCTGATGGTAGATCGCGCGACTA
-+
-67777788888888888888888877776555443222100/.-.-,-,,+++*+*)))))(((('#$$"#""#$#
- at 30BB2AAXX080903:3:37:1436:1234#0
-TTCCCCTCCATGTATCCACGTGTTTGTCCTGATGGTCTCCTACCCCCTCTCCCCCTGAGAGTCCATTCTCTCTCTN
-+
-67777788888888888888.8887777+5554432212/.//,-.-,%+,++$)()()(&#'(%&#%$#"$"##"
- at 30BB2AAXX080903:3:4:735:1949#0
-CCCCTGTCCCCCTGACAGGCCCTGGTGTGTGTTGTTCCCCTCCATGTATCCACGCGTTTGTCCTGACANACTCNCN
-+
-67777788888888828888888877776)554413222/#/.,,+,*+,+'+(()'))(((((((&%"%$#""""
- at 30BB2AAXX080903:3:38:261:1349#0
-ATGTACCCACGTGTTTGTCCTGATGGTCTCCTACCCCCTGTCCCCCTGAGAGGCCCTGGTGTGTGTTATTCCCGCT
-+
-67777788888888888888888877776555443232100/.-----,,,,+**)*)))))(('''"&%%%%"$#
- at 30BB2AAXX080903:3:51:826:1191#0
-CATCAAGACAAACACGTGGGTACATGGAGGGGAACAACACACACCAGGGCCTCTCAGGGGGACAGGGGGGCTGTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('$"#%"#"#"
- at 30BB2AAXX080903:3:45:572:45#0
-CCTGTCATTTAATGTTTTTTCAATAAATGCTGGCAGGGCTAGCTAGTCAGGGCTCGTGGCTGCCCGACGNGTCGGC
-+
-677777888888888888888888777765554432221/0//.,.,,),,,*)+(#)*(''&(##%""""##""#
- at 30BB2AAXX080903:3:56:995:113#0
-ATGGTGGCCCAGGCTGGAGTACGATAGTGTGATCTTGGCTCACTGCAACCTGTGTCCTGGGCTTAAGGGTCCACCG
-+
-67777788888888888888888877736555443222100-/-.--,,,,+*+*)***))('((''$&#"#"##"
- at 30BB2AAXX080903:3:45:1022:248#0
-CCAGGCTGGAGTACGATAGTGTGATCTTGGCTCACTGCAACCTGTGTCCTGGGCTTAAGTGATCCTCNCACACCAC
-+
-6777778888888888888888887777655544322210./,.,---,,,,+***)*)()((((''"&"$""##"
- at 30BB2AAXX080903:3:42:321:801#0
-ACAAACTTATAGTTTGATTTTTGTAAACATCCCTGTAATCATCACATAAGTCAAGATATAGGACTTTAGATCGGAA
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))(((((&'&&%%$$#$
- at 30BB2AAXX080903:3:2:1005:1899#0
-TGTATTATCTAAGAATGCATTGCCAATCCACAGCAATGTTTTATTTCCATGTTTTCTTCTAAGCATGTNTGGNCTC
-+
-67777788888888888888888877776755443222100//.----,,++++****))())((((&""%""#""
- at 30BB2AAXX080903:3:52:1130:1835#0
-TGTTAATTTGCCTTTGGATGATCTGATTTCTAAAGGTTTGGTGGAATTCTCTGTGAAAACATCTAAACCTAGTGTT
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))()(((("""$%%#"%
- at 30BB2AAXX080903:3:56:733:1970#0
-TGAGAGGCAGAGGTTGCAGTGAGCCAAGATCATGCCACTGCACTCCAACTGGGGCAACAGAAGATCGGANGAGTCC
-+
-67777788888888888888888877776555441222100//.-----,+++**)*)*)()))('''%""##""#
- at 30BB2AAXX080903:3:1:1112:1239#0
-TGACAGAGTCTTGCTGTGGCACCCAGGCTGGAGTGCAGTGGTGCAATCTCAGCTCACTGCAACCTCCANNTNTCGT
-+
-677777888888888,88*3888&77786552443212.00//----,+,+,+*+*()*)))('('&%""""$#""
- at 30BB2AAXX080903:3:45:230:803#0
-CTCTGTCTGATGCTGGGCTGTCACCATGCCCAAGACTGAGGGGACCCACAGTCTAGCTAGAAGGCATGGAGTAGAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))))))((((('%"""##$%
- at 30BB2AAXX080903:3:49:375:934#0
-TGCTTTGCTGCTCAGCATGGCTGGGAGGCACAGTGGAAGATCATGCATCCTTCCCCTGGGACTCCTCTGCCCTCAC
-+
-677777888888888888888888777765554232/21/0/.-.-,,+,+,***))**)(((((('$#"$#"#"#
- at 30BB2AAXX080903:3:43:1559:1760#0
-ACCTGCTCATGGTCTGCTTTGCTGCTCAGCATGGCTGGGGGGGACAGGGGGAGGACAAGCATGCCAGAGGGGGACG
-+
-677777888888888888888888704763454422221/0/+)%.-#,-**+)##'#(&'&#%##&%"""%#"""
- at 30BB2AAXX080903:3:45:543:1504#0
-GGGCACGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCAAGGCAGGCAGATCACGAGGTCAGGCGACGGT
-+
-67777788888888888888888877776555343222100/.-/,--,,+,***))))()()('&''""""""""
- at 30BB2AAXX080903:3:3:1522:47#0
-CAAGTCTAAACTCCCGACCCTGGAACATCAGGTCTTTGTGCTCTGTTCAGTGCTTCTCTACCTCACACNACACNCN
-+
-677777888888888882,288887.7725552,321110,/....-,,,+,)+*(*(*)'#(#(%#""####"""
- at 30BB2AAXX080903:3:38:199:546#0
-AAAGAGCTGATCAGGAAGCAACTATGCACGGTCTTCCCCTCCACACCTCCAGCCCCAGCTCCCTTCCTCACACCTA
-+
-67777788888888888888888877776555443222100//..-.-,-,++**))*))))(((('"%"""####
- at 30BB2AAXX080903:3:60:1392:1511#0
-AGTGCATGGCTCCACACTGCCATCTTGGGGGCTGGCACAGGCTGGCAGTGAGTCTGGGGGAGGGAGGCACAACCNN
-+
-67777788888888888881*-307777654'443$+-.01-/..+,&+,(*)'*)'))#((((#(#$$%%%%$""
- at 30BB2AAXX080903:3:41:1728:799#0
-GCCGACTGCTGGGTGCGCGGCAGACCTAGTGCATGGCTCCACACTGCCATCTTGGGGGCTGGCACAGGCCAGNTCC
-+
-67777788888888888888888877216+5444322010///-'.--++))+*(*))''()(''&'&$""&"$#"
- at 30BB2AAXX080903:3:33:659:237#0
-AAGAACCCACAGCCGACTGCTGGGTGCGCGGCAGACCTAGTGCATGGCTCCACACTGCCATCTTGGGNCAGCATNN
-+
-677777888888888888888888+777655544322210///.---,,,,+++*))**((()((('"&""$#"""
- at 30BB2AAXX080903:3:42:1316:1812#0
-TATTACACACCAGATTCATTCCCTGATTAGAGCTGCTGAATTCTTTTACTCTCACTGCACTCATGCTACAGTTTCT
-+
-677777888888888888888888777765554432221/0//..----,,++++*)))))(()(('&"%%$#%#$
- at 30BB2AAXX080903:3:47:234:803#0
-TCACTGCCTGGAGCCAGCTCTTGGAAGTTCCCCAGGAGCTGTCCAGTCTTACGTCATGTCTAGTCAGCAGTGCCTN
-+
-67777788888888888888888877776555443222100//.----,,,,++*)**))))(((('%##""##""
- at 30BB2AAXX080903:3:57:1354:908#0
-AATTGACTCTATGTTCCACAGTCCATACAGGGAGCCTGGCTTGTGAGCGATGCCGTCATACACCCTAGAGCGCACG
-+
-27724728888888888)843&78.027635"34/-2'00+..-+$-+$,$%*'**''%()(##(%#%&%#"%"#"
- at 30BB2AAXX080903:3:45:343:174#0
-CTGCTCAGCTGAACCCCTGGGAGCTGAGGGGCCAACTCTGACTCCCAAGAAGGTGACCTCTATCTCCCTTCCGGGG
-+
-6777778888888888888888887717655548322220///..-,+,+*++(**()*))()((('&""$$"%#"
- at 30BB2AAXX080903:3:34:808:1334#0
-ATGTTGTGTGAGGCCTGACCGCTGTGAGGATGGACTTCCATCTGTGTGAATGGATTCATGAGACCAGNCTCACCNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)***))(((('"%"%"$#""
- at 30BB2AAXX080903:3:1:1153:736#0
-TGCACAGAAACTTAGGCATATGCCTACCAACATGCCCGATGTTGTGTGAGGCCTGACCGCTGTGAGGANTCNCCAC
-+
-67777788888888888888888877776555443222100./.--,-,-++++***))))())(('&""%"####
- at 30BB2AAXX080903:3:52:1018:2027#0
-TCCTTCCACATAGGTGGTTCTCCACCCAGGCTGCCCAGGAGAATGTGGAATCTCCAGCAGTTCTGACGTACGGNGG
-+
-67777788888888.888888188777765554131221/0-.-.,--,,+*+*))*)((&((''%%$""""#"""
- at 30BB2AAXX080903:3:1:506:1384#0
-GGTGTTTGGAGCTTCCTGGTAGGGGCTGGGGACAAAGTGTGGATGGGGCACCTGCTGGACCTGTGGGCNGANCACA
-+
-67777788888888888885888872776553,0..2,1.0/,,.-*-$$+*'*##))%#&#(#(#'""#&"$##"
- at 30BB2AAXX080903:3:41:1164:1967#0
-TGTGCGTGAGTCCCTGTGTGTGATGTTGTGTTCTCGGTGTGAGTTCATGGGTGTGACGGGGGGTGTGCTGTATCNT
-+
-677777888888888888888888777765554432211/0//..,--,,++++*()))))(((''&&'%&#%"""
- at 30BB2AAXX080903:3:3:124:1345#0
-TGTGCTGGGTGAGAACGTGTGTGTAGTGTTCACATGTCCTCTGTGCGTGAGGCCCTGTGTGTGATGTTNTGTCNCT
-+
-6777778888888888888-888177776555443222100//..---,,+%+***)*)()((((''&"$&##"#"
- at 30BB2AAXX080903:3:53:1237:733#0
-GGGGTGTGCTGTGTGAGAACGTGTGTGTAGTGTTCACATGTCCTCTGTGCGTGAGTCCCTGAGATCGGCACAGTTG
-+
-67777788888888888888888877776555443222100//..---,,+++******)))((((&$$"""""""
- at 30BB2AAXX080903:3:4:1614:1500#0
-TGGGTGTGACGGGGTGTGCTGTGTGAGAACGTGTGTGTAGTGTTCACATGTCCTAGATCGGAAGAGCGNTCGCNCN
-+
-6777778888888888888888887777655343322210./...-.,,,,,++*+*)())))(((%"""""#"#"
- at 30BB2AAXX080903:3:36:1382:1870#0
-TAGTGTTCACATGTCCTCTGTGCGTGAGTCCCTATGTGTGATGTTGTGTTCTCGGTGTGAGTTCATGGCTCGTGNN
-+
-67777788888888888888888877776555443222100//..---,,,++**+)*))))((('%"$"""""""
- at 30BB2AAXX080903:3:34:1573:1705#0
-AGGGACTCACGCACAGAGGACATGTGAACACTACACACACGTTCTCACACAGCACACACCCCAGATCNCATACCNN
-+
-677777888888888888888888777755554)30211/0//..----,,)+****))(((('&#'"%"#%$#""
- at 30BB2AAXX080903:3:41:922:166#0
-TGTGAACACTACACACATGCTCTCACACAGCACACACCGCATCACACCCACACCCCCACAAGACNGGTGGCGCGAC
-+
-6777778088888888848$888897776/25243112000..+-,,,-*+*+)+))()('')##''"$%"%#"#"
- at 30BB2AAXX080903:3:38:1400:171#0
-CGGAGGGGCCTCCCTGCCGACTCTGCCCCCGTCCTGTGGCCGTAAGCCCACCCAGAGCGCCCCCTCCTCCCTACNN
-+
-6777778888888888888888833777654'44/.)10//.'(*-",,(+*+&'&))((#(###'%$%$$#"#""
- at 30BB2AAXX080903:3:36:1153:871#0
-GGCCACAGAGAACCCGCGTGCACCGGCCGCCAGGCCTGGGCATCTCCTCTCCTGCAGCGCCGCCTGCCNCAGACGN
-+
-6777778888888888888888887777655544322210/1/-.-,,,,,+++****))))(('(&""###$$""
- at 30BB2AAXX080903:3:51:1670:1413#0
-GCACACGGGTTCTCTGTAGCCAGCAGGCGGCGCTGCAGGAGAGGAGATGCCCAGGCCAGGCGGCCGGAACACACCA
-+
-67777788888888888888888877776555443212120//..---,-+,+***))))((((('&$$&#$#$#$
- at 30BB2AAXX080903:3:44:1274:1604#0
-TGTGAGTGTGTGTGGCTCTCAGGCCTGTTCTGTCCTGGGTGCGCTGCGTTCCCCAGGCGGCACCATCTCTCTGCTC
-+
-67777788888888888888888877776555423222100//.----+-+,+**)))))&'('&'&"$"$$%$"#
- at 30BB2AAXX080903:3:44:1718:847#0
-CACGAGAGCTGTGAAATGGGAGTGAGGGGTGAGGCAGGCCATGGGGCCTTCCACAAGGTGGGCAAGATGGGTGTCG
-+
-677777888888888888888888777763554432221/0-./.-,,+,++*)&**)(())'''('"$$""""#"
- at 30BB2AAXX080903:3:56:504:1509#0
-TGTCAGTCAGAGCTCAGGCCAAACACTGGGGCTAATAGGGGTGAGAGCAGGGAGCTGTGGGGTCCTCACAGCNTNN
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))))((((('%&"&""$""
- at 30BB2AAXX080903:3:60:1067:1145#0
-ACCCTACCCTGTCAACAACACTGGCCTTCAAGACCCTTTGTAGCATAACTCCCACCTATAACTCCCAACTTCAANN
-+
-677777888888888,8888848877776555443222100//..---,,,+++**)))))(()(('"$&##$$""
- at 30BB2AAXX080903:3:58:445:1310#0
-CATTTCCTCCCCACAAAGCCACCTCATGAGCCTGGGGGGGGCCTAGCCAGGCCTGCTGCTGAACCTGCTCTTCCAC
-+
-677777888888888888888888787765.94432.21-0-/.--,-,,&++')*&*'()((#(#''%%#""##%
- at 30BB2AAXX080903:3:43:1138:131#0
-GCAGCGCTAGCCCCTGGACTATTCTCACCACTCACGCCTTGGCCTCCATACCCGCGCGCACACCGCCCCCGGCGCC
-+
-67077788888888/8888888&87777455)43'221+-&/+.--.&)+(+%**&'#'(##((#''""""#""#"
- at 30BB2AAXX080903:3:35:1407:524#0
-ACCGCCTCCCGGGTTCACGCCATTCTCCTGCCTCAGCCTCGCGCGTAGCTGGGACTACAGGTGCCTGNCGACCTTN
-+
-677777-888888888888888),7777.5/514112200,/..+'+,,*+**()()#))(&('%&%""#"#$"""
- at 30BB2AAXX080903:3:48:72:1271#0
-CGGGCCTCCCCTGCCTCCCTCTGCAGCTGTCCACGCCCAGCCAGCCTCCCTGCCTCCCTCTGCAGCTGTCTGTACT
-+
-67777788888888888888888877776555443222100//.-----,++++****)))()('''$$#""#"##
- at 30BB2AAXX080903:3:2:589:1114#0
-CTGCAGAGGGAGGCAGGGAGGCTGGCTGGGCGTGGACAGCTGCAGAGGGGGGCAGGGGGGGGGCGGGTNTGCATAC
-+
-6777778888888888881883)3712765+5'43$+*0-,/*(-*-,,%,+#&)**)#)(###'##"""%$"""$
- at 30BB2AAXX080903:3:36:90:188#0
-CAGGGCAGGACCAGCCCCCCAAGCTGTGAACCTCGCCCGAGGCTATGCCCCACTCTGGAGCAGAACGNCTACGGTN
-+
-67777788888888888888888877776555443222100//.-.-,,,++++**))())(('(('"""#%""""
- at 30BB2AAXX080903:3:41:759:1634#0
-AGCCTCGGGCGAGGTTCACAGCTTGGGGGGCTGGTCCTGCCCTGTCCCACATGTGGCTGGTTTGGGGGCGTGGCGA
-+
-6777778888888888888882887777655544302110.//..-,-,+++***)&*)&'(&''##"$""$"#""
- at 30BB2AAXX080903:3:41:694:781#0
-TGAGGGTGAGGCCCATGGCCTTGGGAAGCAGGCATAAGTTGGGGGGGGTGGGCACACAGGGGCACCGCGGGACCAG
-+
-677777888888888888888888777765554432.2000//..---*,,++*+**)))(#'(('''&""""##"
- at 30BB2AAXX080903:3:34:439:399#0
-ACACACACGTGCATGTGCATACATGGCTTAGCACACACATCTGTAGATCCTGGGTTTGTCCTTTAGANCACGTCNN
-+
-67777788888888888888888877776555443222100//..----,+++**+**))))))(('"#"$#"#""
- at 30BB2AAXX080903:3:41:947:127#0
-ATCTTGGCTCACTGCAAGCTCCACCTCCCGGGCTCACACCATTCTCCTGCCCCAAGATCGGAAGAGGGTTCAGCAC
-+
-6777778888888888888888887/7765254131211//++--.-&+-+**)*))&(')'')#('&%$$""$##
- at 30BB2AAXX080903:3:47:1096:1669#0
-CAAAGAATTTGGGCACCATGGTAATTACTGAACATTTAGGGGAGACACTTTGACAGTATAGATCGGAAGTGTCGGG
-+
-67777788888888888888888877776555443222100//..---,,+++*****)*)(('(('"""""#"""
- at 30BB2AAXX080903:3:46:770:234#0
-CACCTTGGCCGTGTGATCAAGGTCCAGACCACCAGTGATGAGGCATGTTGACATCGTGGCCCCTGAGACGCTGACG
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)*)))((((%'%""""""#"
- at 30BB2AAXX080903:3:41:827:784#0
-GCAGCTCACGTCCAGGACCCCAGGCTGCACTGGCCCTCACGCCTCCTTAGTCCCCTGCACCTGTGACCCTTTCCTC
-+
-677777888888888888888888777765554452220/0///..-,-,,+++**(*)))((('('&$#&$%##"
- at 30BB2AAXX080903:3:33:712:1620#0
-CGAGGGTGCCGTCTCAGCAGCTAAAGGTGTGGAAACTGGGACACTCACGCGGGTGCGGGGATCGGAANACACACNN
-+
-677777888888.8888288+8$)+78+3)55452+.1&0,..,,&,',%+++$*%&(#(###('#%""&%&$$""
- at 30BB2AAXX080903:3:50:685:603#0
-ATCTCAGCAGCTCACGGTGTGGAAACTGCGACACTCACGCGGGTGCAGTCTCAGCAGCTCACGGCGTGGATACACA
-+
-67777788888888888888888877776555443222110//$.---+,+,*+**)))*()((#(#$""""##$#
- at 30BB2AAXX080903:3:56:1307:1519#0
-CACGGGTGCCATCTCAGCAGCTCACGGTGTGGAAACTGCGACACTCACGCGGGTGGCATCTCAGCAGATANGACAC
-+
-677777888888888888888888777+6/55443012/2/./-----,+++*)*#(()'#(()'('&&""##$##
- at 30BB2AAXX080903:3:51:749:1955#0
-AGTTTCCACACCGTGAGCTGCTGAGATGGCACCCGTGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCNCGCATGG
-+
-67777788888888888888888877776555343220100./.,--,,,++*****)()()(((''"""""#"""
- at 30BB2AAXX080903:3:43:807:1752#0
-ACACTCACACGGGTGCCATCTCAGCAGCTCACGGTGTGGAAACTGCGACACTCACGCGGGTGCCGTCTCAGCGGCC
-+
-67777788888888888888888877776555441212100//..,-,,,,,+**(()))()'(('''&%"%"##"
- at 30BB2AAXX080903:3:3:429:941#0
-TGTGTATGACTGTGTGTATGAGTGTGTATGATTTGTGTGTGTGAGTGTGTACATGTATACACTAGTGTNCGTCNCC
-+
-67777788888888888888888877776555443222100//..---,,+,+***))*()))((('$"&#"#""#
- at 30BB2AAXX080903:3:39:469:1852#0
-TGTGTATGAGTGAGCATGAATGTGAACATGTGTGCACGAATGTATATATGATCTGGGTGTGTAGGAGATAGCAACA
-+
-67777788888888888888888877776555442232000//...--,,,++**+)*)))((((('"$""#"###
- at 30BB2AAXX080903:3:53:57:1762#0
-CATGTGTGCACGAGTGTATATATGATCTGGGTGTGTAGGAGTGAGCATGAATGCGTATGCACAAGTGGCCTATCTG
-+
-647777888888888888888888777765514433221/0./-...-,,+++***)*)())(('''"$#"""#""
- at 30BB2AAXX080903:3:45:936:1683#0
-CCAGAAAAGCCTGGATGCCACACAGACTCAATGCTGAAAGCTCCCAGTGCACCTGCACAGATCGGAAGCGCGCGGC
-+
-6777778888888888888888887777655544322200.///-.-,,,+++**)*))*)((((('$"$#%"#"#
- at 30BB2AAXX080903:3:3:651:1124#0
-CATGTGTGGGTGTCTTTGTGCAGGTGCACTGGGAGCTTTCAGCATTGAGTCTGTGTGGCATCCAGGCTNCTGCNTA
-+
-6777778888888,88888881887777655544322212///.-.-+,,*,++**)*#'(&''((%&""&$$"""
- at 30BB2AAXX080903:3:40:540:1733#0
-GACTGAGTTGGCCTGGTCCATTGTGAGGTCAGGTAGAGCCAGGGCCGAGGTGGGGATGCCAAGGGCCTATGTATAT
-+
-671777888888888888888888767765454/3232000/../--+,,+++**))*(((')(&&'%$%%$%%$%
- at 30BB2AAXX080903:3:50:53:145#0
-GGTGAGCATTTCCGGTTCCCCTGCTGTGCTTTGCTGCGTTGTTCTCTCCTGCTGCAACGTTCAGATCNGTCACACG
-+
-67777788888888888888888877776555443222100//..---,,+++*****)(*))((('"$"#"###"
- at 30BB2AAXX080903:3:59:1267:943#0
-GAGCATGGGGCTGTGCGGCGTCCCCTCCCTGGCGCCCACCTGTGCCCTGCACACTGGCCTGCACTGTCATCACACA
-+
-67707788888888888888888877776555443232100/..----,,+++**))()()'''('%"""###$$#
- at 30BB2AAXX080903:3:41:486:1918#0
-GGAGGCAGGCATGGAGCCTTGGAGGAACCACTCCTCCCCAGCCGCCACCAACATTTGTGGCACCGAGAAGCACATC
-+
-677777888188888848888808777754/51/32/-00/-.--+,++++))**)('()%('&(''%"$$$#""#
- at 30BB2AAXX080903:3:57:1025:1228#0
-GGAATTCTGCCCTAGCTGATGGCTTCTCCGAGGCCTAGGCCCAAATCCACACCTGCTGTTTAGCCCAGAGCGTGCC
-+
-677777888888888888888888777765454532221/.././-,,,,+**++***(()(('&''&""$"#"##
- at 30BB2AAXX080903:3:54:1538:1826#0
-GGAGTCAGCCCCCTGCCCACGCCACCAGGCTCACGTTCAGGGCCCTGGCTGGAGAAACCTGAGCTGACACACTGAG
-+
-6777778888888888888887187777:45083520-20//,,-.,,+,,+**&))'(((((%%&&$$%&"""#"
- at 30BB2AAXX080903:3:35:998:167#0
-GAACAGAAGCGGAACAGCCTAATGCTAATGTTTGGGAAGAAGAGAACAGTGATCCCCCTGGTTACCCNACCACCNN
-+
-677777888888888888884888777765554422121/0//.-.--,$+,+**')*())#'(('%""$#$##""
- at 30BB2AAXX080903:3:50:1195:1750#0
-CCTCTGTCTTCACGAGAGCTACTTTTTTAGTAGGTGGGAGAGAACATTCAATGTTTGTCTTTAGATCGGTAGTCCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()('(%""#"$"##"
- at 30BB2AAXX080903:3:35:1436:929#0
-CGAGTAGCTGGGATTTATAGGTGCGCACCACCACGCCCAGCTAATTTTTTGTATTTTAGTAGAGACGNCGCATCCN
-+
-6777778888888888888888887777655544301110/0---.-,,,++++**)*))))((((&"$"$####"
- at 30BB2AAXX080903:3:33:1435:1262#0
-CCTCAGGAAATCAATGTCATGCTGACATCACTCTAGATCTAAAAGTTGGGTTCTTGGACCAGGTGTGNCCACAGNN
-+
-67777788888888888888888877776555443222100//..---,,+++****))))((('(&""%#$$"""
- at 30BB2AAXX080903:3:42:1588:115#0
-GCTGCTTCCTGGAGGAAGACAGTCCCTCTGTCCCTCTGTCTCTGCCCACCAGAGATCGGAAGGGCGGGTGGTGGCC
-+
-677777888888888888888818782707.344'2,-0.,/+-,,$'+,*)'('#(#)#&'#&#'%$""""#"#"
- at 30BB2AAXX080903:3:47:309:1172#0
-CTGGGTCAGAGTCAGAGCCAGAAGTATGGTTAGAGGGGGGGTCATGGTCAGGGTCGAGATCAAAGTCGGGGGACTG
-+
-677777888888888888888888777765554232$2100./-.--,,,+++***)))%()(((##$""$$""#%
- at 30BB2AAXX080903:3:8:1315:1812#0
-ATGCCTCCTCAGGAGATCCTGACAACATGGGCCCAAGGTGGTCGGGGCACCGCTTGGTTTTATAAGANCTCGTGNN
-+
-67777788888888888888888877776555343,21&01*..-.-,++&,)&***&)&(((((''"%"&#$#""
- at 30BB2AAXX080903:3:42:1167:659#0
-AATGGTTTCATTCTTTTGCATTGCTGATTACCCTCTCCACGTGAGGCAATCAGGTATGCATTTATCTCGCTCTGTA
-+
-67777788888888888888888877776555443222100./..-,,-,,++**)*)*(())(((('&"$$"""#
- at 30BB2AAXX080903:3:45:1662:1554#0
-ACGATGGTTTGGATGTGGTTTGTCCCCACAAAAACTCATGTTGAAATTTGACTCCCACTGTGTAGATCGGGGGCAA
-+
-6777778888888888888888887777655544322210///..---,,-++***))))(())(('%$""""$""
- at 30BB2AAXX080903:3:50:1530:1673#0
-CTGTGGTCCCAGGTAATCAGGAGGCTGAGGAGGGAGGATCGTTTGCACCCAGGAGGTAGAGGTTGCAGCCGACTGC
-+
-677777888888888888888888777765554432221/0//...-,-,+++***()))))(('%&"$#""#""#
- at 30BB2AAXX080903:3:38:1262:1788#0
-CAGTGAACACAAGCGTGTTGTTTTCTTCTATCTTCTTCACGCCGACTCAGTGGTCAGCGGAAACTTGATGATGATC
-+
-67777788888888888888888877776555443222100/0..---,,+++*+*))))(((((('$&%##"""#
- at 30BB2AAXX080903:3:3:267:1855#0
-CTGTAGCTCAAGAGAGGATGTAGCTGCCCCCACCCCGCATCCCCGGGCGCGGGTTTGCCTTGCTGACCNCTCNNAG
-+
-677777888888888880882188.77;6.502422,1&'-...+'++$,+*+$'))#(%'((((%'$""#"""#"
- at 30BB2AAXX080903:3:39:376:911#0
-AAAATGAGTCATTGCAAGGATGACAAAGACGCTCTCCTTGACCAAACTCCATTCAGGCTCCTTTGAGCCTTCTCAT
-+
-6777778888888888888888887777655544322210/0/..---,-,,+++*)**)(((((''&%"&%%%""
- at 30BB2AAXX080903:3:58:356:910#0
-ACAGCTCACAGCAGCCTCAAACTCCTAGGCTCAAAGGATCCTCCCACCTCAGCCTCCTGCGTAGTTGAGATCACNA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(((&'$""&"#""
- at 30BB2AAXX080903:3:52:238:333#0
-AAGGATCCTCCCACCTCAGCCTCCTGCGTAGTTGGGACTACAGGTGTGTGCCACTGCACCAAATAATCTGTGTAAA
-+
-677777888888888888888888*777655144322210/*..+---&,++****)))('(('(&'"""""""##
- at 30BB2AAXX080903:3:44:175:741#0
-GATTAATTGTTTGCTATTGTTTGAGCTCCTGGTTATGAATCACTTGTCAGGTGGGTAGCGTGCAAAGATNANTAAC
-+
-67777788888888888888888877776555,43222100*-..-,*,,+)+**)*)()((((('&$'"""""""
- at 30BB2AAXX080903:3:42:1035:180#0
-GTTTCTCTGATGATTAGTGATGTTGAGCATTTTTTCATGTACCTGCTGGCCATTTGTACATCTTTTGAGTGTTATT
-+
-67777788888888888888888877776555443222100//..---,,+*+*****)())((((''$""""""#
- at 30BB2AAXX080903:3:40:463:919#0
-AGGCAGGGGAATCGCTTAAACACAGGAACCCGGGAGGCAGAGGTTGCAGTGAGCCAAGATCACACCACTGCACCCA
-+
-67777788888888888888888877776555443221000//.,--,,(+++)*)*)()))(((''"&&&#$"""
- at 30BB2AAXX080903:3:4:18:454#0
-TGAGTTCATCAGCGGATGATGGATAAACAGAACGTGGTGTGTATACACAGTGGAATATTCTTCAGCCANGACANTN
-+
-67777788888888888888888877776555443222100//...-,-,++++***))()(((((#""""$""#"
- at 30BB2AAXX080903:3:43:128:589#0
-ATGGCGTGAACCCGGGAGGCGGAGCTTGCAGTGAGCCGAGATCCCGCCACTGCACTCCAGCCAGATCGGACGCCCG
-+
-67777788888888888888888877776555443222200//..---,,+++*+*)))))((((('&&#""###"
- at 30BB2AAXX080903:3:45:1526:694#0
-CTGCTGGTAGCAGAGCCTCAGTTCCTCTCCTGCGTTCTTTCGCTACAGGTGTTAGACCTCCAGATCGGGCGTGCGC
-+
-67777788888888888888888877776555442222100//..---,,+++*****))))(((('$$#%"$#""
- at 30BB2AAXX080903:3:54:1479:90#0
-AGCTGGATAGGTTGCCTTTGGCCCACATGGAGTCAGCCCCCTGCCCACGCCACCAGGCTCACGTTCACACATGCTA
-+
-67777788888888888888888877776555443232100//-/.--,-,+*)***)(())('(('&$&$""#""
- at 30BB2AAXX080903:3:39:999:1933#0
-ACGGTGGGACTGGGCTAGGGAGACAGGCAGGCTGGCCTACCCACTGAAGGAGCCAGTCTGCTTTCACCTATCTCTC
-+
-67777788888888888888888877736550143+-/0(...+--,,,,++#(()'&()''(#'&#%$&#&#%$#
- at 30BB2AAXX080903:3:47:319:1003#0
-CTGAAGGAGCCAGTCTGCTTCCACCTAGTCAGCAGCTCCAGGGAGCGCATCTCCCTCAGATCGGAAGGACACCTGT
-+
-67777788888888888888888877776555443222100//-.---,,+++**+*)))))(((''$"#"#"###
- at 30BB2AAXX080903:3:40:597:1510#0
-TGGGGCTGTGCGGCGTCCCCTCCCTGGCGCCCACCTGTGCCCTGCACACTGGCCTGCACTGTGGTGATCTCGCTGA
-+
-67777788888888888888888877776565412221100/...,,-,-+++***)()()()('''$"$%%$$""
- at 30BB2AAXX080903:3:45:825:1815#0
-TGGCCTGCACTGTGGTGATCTCGCTTGGCCCCCACCTGATTCCTGACATACAGCAGAGGAAGCTTAGGCTCAGGGG
-+
-67777788888888888888888877776555443222110+/...--,,+,++***))(()'&('%&$###&#"#
- at 30BB2AAXX080903:3:47:553:318#0
-AGTTAAGGGACTGTGGCCCTGTGTAATGCCAGGCAGTGACAAGGACTGTGACTGGGAGCCATCGTAACGCGCATGC
-+
-677777888888888888888888767765554412/21////..----,-,+***)))()'((#''"%%#%"#""
- at 30BB2AAXX080903:3:36:565:943#0
-AGTGTGTGTATGATCTGGGTATGAGTGATTGTGAATGTGAGCATGTGTGCACGAGTGTGTATATGATCACTGGTAN
-+
-67777788888888888888888877776555443222100//..---,,,,+***))))))(('('%$%#"""#"
- at 30BB2AAXX080903:3:36:1383:1270#0
-GTGCACACATTCACACTCATACACACCCAAATCATACTCACATTCATGCACACATGTAGATCGGAAGCTCTCTCTN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('$#&##"$#"
- at 30BB2AAXX080903:3:51:918:1442#0
-ATATGATCTGGGTGTGTATGAGTGAGCATGAGTGTGAACATGTGTGCATGAATGTGAGTATGATTTGGGTTCCTCT
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()('''&$#""#"#"
- at 30BB2AAXX080903:3:2:301:814#0
-ACCCAAATCATACTCACATTCATGCACACATGTTCACATTCATGCTCACTCATACACACCCAGATCAANCTANNAC
-+
-610047888488888.+88)5811./151/45&,/0)*1/,++++-,*++))*)*)(()#&'&&''%$"###""##
- at 30BB2AAXX080903:3:53:1469:791#0
-GTGTATATATGATCTGGGTGTGTATGAGTGAGCATGAATGTGAACATGTGTGCATGAATGTGAGTATCACTTGTCG
-+
-67777788888888888888888877776555443222100//..---,,++++**)*)))((('(''$%&%$%#$
- at 30BB2AAXX080903:3:43:133:755#0
-CAGCTTCCTCTCACTTGAGCATCTTACACGCAATGAGGCACGTGTAGAAACTGCGACACTCACAAGATCGGAACAG
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))(((('&'"&#"""#"
- at 30BB2AAXX080903:3:37:615:904#0
-GACGGCACCCGCGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGTGGGTGGCGCTNCATN
-+
-67777788888888888888888*7)7065554832(220/*,,--,,+,+++**)*('(''#(#'#&$##"%#""
- at 30BB2AAXX080903:3:53:900:830#0
-GGGTGCCGTCTCAGCAGCTCACGGTGTGGAAACTGCGACACTCACGCGGGTGCCGTCTCAGCAGCTCAAGATCCTG
-+
-67777788888888888888888877776555443222100//..---,,*+++***)*)))(('%%&#$"#"""$
- at 30BB2AAXX080903:3:48:1673:47#0
-CCACACCGTGAGCTGCTGAGACGGCACCCGCGTGAGTGTCGCAGCTTCGCCACCCCGAGCGGCCGCGACTACAGCC
-+
-243772-0/02/828888,25+0//*/0)'*,$3",#*%(&-',%$",$&($#&###('########""#"%#"##
- at 30BB2AAXX080903:3:44:866:942#0
-TGCTGAGACGGCACCCGCGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGTGAGGGGGCG
-+
-677777888888888888888883784765554410.010//*..-,+,(+,)+**)*('('((('#'"$""""""
- at 30BB2AAXX080903:3:50:442:106#0
-TCCACACCGTGAGCTGCTGAGACGGCACACCAACGAGAGTCGCAGATTCCACACCGTGAGCTGCTGCGACTACCGT
-+
-67777788828888888888888877776$'534322-1//1/,.$-,+,++***))(()'#((#'#$$#$"##"#
- at 30BB2AAXX080903:3:8:907:898#0
-AGTTTCCACACCGTGAGCTGATGAGACGGCACCCGCGTGAGGGTCGCAGTTTCCACACCGTGCGCTGNGTCCACNN
-+
-67177788888888888888'88877676555833021200#/,,.,)-++**))))(()'(#((&&""#$""%""
- at 30BB2AAXX080903:3:40:998:1656#0
-AGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGCACC
-+
-67777788888888888888888877776555443222100//.---,,,++***)*)()()(((('&&$#"""##
- at 30BB2AAXX080903:3:40:393:1821#0
-TGCTGAGACGGCACCCGCGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACAGATCGGAAGAGCGGCTCCG
-+
-677777888888888888888888777765554423221/1//.----,-,++***))))')('(''$""%$""#"
- at 30BB2AAXX080903:3:2:734:1657#0
-CGCGTGTGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGTGCGTGTCGCAGGTTCCNCACCCGT
-+
-677777888888882888888028774-6/2121201-0-/...-,*-,++$+$*%)#('&''####""$""##""
- at 30BB2AAXX080903:3:54:953:26#0
-GCACCCGCGTGAGTGTTGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGCGAGTGTCGCCGTGTCCACA
-+
-67777788888888888888888877776555-4022210//..-.-,,,+++)*)#)))#(#'(&#"$"%#$###
- at 30BB2AAXX080903:3:51:1273:825#0
-CTCACGGTGTGGAAACTGCGACACTCACGCGGGTGCCGTCTCAGCAGCTCACGGTGTGGAAACTGCGACACTCTCG
-+
-67777788888888888888888877776555413022100//.---,+,+*++)*)**))(((('("%""$%"#"
- at 30BB2AAXX080903:3:51:541:612#0
-AGCTCACGGTGTGGAAACTGCGACACTCACGCGGGTGCCGTCTCAGCAGCTCACGGTGTGGAAACTGGCAACANAC
-+
-67777788888388888888888877776555443121000//..--,,,+**)**')())((((&'$%#"%"""#
- at 30BB2AAXX080903:3:2:725:1428#0
-CGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGTGAGTGTCGCAGTTTAGATCGGAAGAGCNTCATACC
-+
-67777785883888888888730731-1054.1-1..0+/#.)-',&*+&&*#$)&&&#''&#&'#'""""""%##
- at 30BB2AAXX080903:3:48:155:835#0
-CGGCACCCGTGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACAGATCGGAAGAGCGGTTCANACGAGTGT
-+
-67777788888888888888888877776755241222010./.--,+,,+**+**)*)*'()#(%%"""#"""""
- at 30BB2AAXX080903:3:2:99:643#0
-CACCGTGAGCTGCTGAGACGGCACCCGTGTGAGTGTCGCAGTTTCCACACGGTGGGGTGCGGGGGTGCNCGCNNAC
-+
-677777888888888888888888777-65514230022/0/0-'+++-+&+*)&*#')##(&(&#'&"#"&""#"
- at 30BB2AAXX080903:3:37:109:865#0
-CACACCGTGAGCTGCTGAGACGGCACCCGTGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGAGNGGNTCAN
-+
-67777788888888888888888873776555443222001//-.-+-+,+(+***)))()(()&(%""$"""#$"
- at 30BB2AAXX080903:3:41:987:437#0
-GTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGTGTGAGGGGCGAAGGTTCCCCACCGCGGCAGCTC
-+
-67777788888/8888888858887377654524321,.0/*%*%,,,+,$$%&)'####%'(&(&'&$"##$%#"
- at 30BB2AAXX080903:3:46:579:1731#0
-GGAGGCGTGAGGGCCAGTGCAGCCTGGGGTCCTGTACGTGAGCTGCTGAGACGGCACCCGCGTGAGTGCGAGTGAC
-+
-67777788888888888888888877776305443202100/+..,--+,+%+*')('()')%)&(''##"""""#
- at 30BB2AAXX080903:3:37:27:27#0
-CTGTCAAGGCAGTGAAGCGAAGACAGGCCAGGAAAGGGTCACAGGTGCAGGGGACTAAGGAGGCGTGCGTCACANN
-+
-677777.8888888888888888847776/55433222//0.+..--+,,,,++*))(()&))((#'%""%#$#""
- at 30BB2AAXX080903:3:39:187:1638#0
-AGAGTGCTGCTCAGGTATTCTGCAAGACGCCCCTCAATTGGTGTGTGTGTGATGTTCTCAGATCGGACGGNACAGT
-+
-67777788888888888888888877776555443222100//..---,,+,+****)))))(((''"&#"%%$""
- at 30BB2AAXX080903:3:59:18:1625#0
-TGTGTGGGCAGCATGGATCTTCTTCCGCGGTGACCCTGTGTGCCCACCCCCGCCAACTTATGCCTGCTTCACANNT
-+
-67777788888888888888888877776555143222100/.----,,,,,+*'**))())'(((&&%&"%$""#
- at 30BB2AAXX080903:3:34:1322:491#0
-GTGCACAGCCTATGTGCATGGTGGAAGCTCTGCAGAGGCCGTTCCGCTCCAGAGTGGGGCATAGCCTNACTAGTNN
-+
-62777788888888888888888877776555443122100#..%.-(--*+**&*)))))'((''%"$"$##$""
- at 30BB2AAXX080903:3:34:810:842#0
-CGACAGCTGCAGAGGGAGGCAGGGAGGCTGGCTGGGCGTGGACAGCTGCAGAGGGGGGCAGGGGAGGNGTGAACNN
-+
-677777888888888888888888777765551432/00/0/.-.,,-++-)++*'**)()((('('""""""$""
- at 30BB2AAXX080903:3:38:1630:1572#0
-AGGCCTCACTTCAGACCATAAACACCCTCCCTGTGTGGGATAGAAACACACATCGTCACAGCCAGGAGCACTGCTN
-+
-677777888888888888888888777765554432221/0//..-.-,,+++***)))))((((('$$"$""#""
- at 30BB2AAXX080903:3:45:505:1811#0
-CACAGGGAGAGCTGCCGGGGCTGGGTGGGGGAGCGTGACTGTGAACGGAGTTCTGGGGGTGATGTAACTGGTCTGT
-+
-677777888888888888888888777765534532222001/.-+--*,(,****)))')(((''&"%%"###$"
- at 30BB2AAXX080903:3:45:594:1146#0
-CACCGACTTGGTGCGGTGTGTGTGACAGACCAGCGAAGCGGGTCTTGCTGCCTGTCCTGTGGTTGGTCCACTGCAG
-+
-67777788888888888888888877776555433222100/)+-.-,,,+++*)#*))(((''((#%""#$$$#"
- at 30BB2AAXX080903:3:33:1094:855#0
-CAGGCAGGCAGCCCCGAACAGTGCACTCCAACATGGGATAGTGAGCCAGCTTGGGGGACAGCAAGACNGGACGANN
-+
-677777888888888888888288774065+231322010/1/...,+,-++++*)**)((''(('#""""#""""
- at 30BB2AAXX080903:3:3:1254:1767#0
-CTGGGCATCTCCTCTCCTGCAGCGCCGCCTGCTGGCCACAGAGAACCCGCGTGAGATCGGAAGAGCGGNCCTCNAC
-+
-6777778888888888888888887777645544322,/////,.--,-,+'+**)())()'('(&'""#""$"##
- at 30BB2AAXX080903:3:51:1375:2001#0
-CCTGCTGGCCACAGAGAACCCGCGTGCGCCGGCCGCCAGGCCTGGGCATCTCCTCTCCTGCAGCGCAGGGCGNCGC
-+
-67777788888888888888788877776555-42'32.0.-,--.+++++)*))&#'('&#(#'%#%""%$""#"
- at 30BB2AAXX080903:3:59:1403:192#0
-TCATGCCTGCTTCATGGGGGAGACGTGGAGGACAGGTCAGACGCAGAGCCCGGGGCACACGCCGCAGCACAACNNC
-+
-677777888888888888*888887'776350-432/010)//..-,-,%*++**()*)()'(((%&&%$&#%""#
- at 30BB2AAXX080903:3:35:718:1977#0
-TCTTCCGTCCACCAGGCCAGGGATGCGCGCAGAGTAAGGATGTGTGTGTCTACGCATGTGGGGGTGTNGTCCTGCN
-+
-6777778888888888888888887775655514+1201.0/+.----+,+,++**))))))))'(%"""#$""#"
- at 30BB2AAXX080903:3:4:997:1183#0
-CCACCAGGCCAGGGATGCGCGCAGAGTAAGGATGTGTGTGTCTACGCATGTGGGGGTGTGGGGGTGACNGTGCNTN
-+
-67777788888888.8888888887753655144321200...--.-,,,*++++*#*#)))#('(%$""""#"""
- at 30BB2AAXX080903:3:50:554:1511#0
-GTGTGGGTGTGACAGGGTGTGTTCTGTGTGAGAACATGTGTGTAGTGTCCACATGTCCTCTGTGCGTGTGCCGCCG
-+
-67777788888888888888888877776555442222100//..---,,+++**)))))))(('('&##$#"###
- at 30BB2AAXX080903:3:37:314:1556#0
-TCACACCGAGAACACAACATCACACACAGGGACTCACGCACAGAGGACATGTGGACACTACACACAACATCTCCAN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))()('&&$$#"##$"
- at 30BB2AAXX080903:3:50:1424:930#0
-TGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCTGTGTGTGATGTTGTGTTCTCGGTGTGAGCACCTACTG
-+
-67777788888888888888888877776555443222100//..-.-,,+++****)))))()''&$"$$"#$""
- at 30BB2AAXX080903:3:47:385:1782#0
-GTGTGAGTTCATGGGTGTGATGGGGTGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGCACGCG
-+
-6777778888888888888888887777655244322200/0/.----,,++++**&)))))(('''&$"$"#"#"
- at 30BB2AAXX080903:3:41:701:63#0
-CGAGAACACAACATCACACACGGGGACTCACGCACAGAGGACATGTGAACACTACACACACGTTCTCACACAACAC
-+
-677777888888888888888888777765554432221010...+-*,,,++*****))()&'(''&$#$$"##$
- at 30BB2AAXX080903:3:44:1232:736#0
-GTGTGACGGGGTGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCGGTGTGGG
-+
-677777888888888888888888/7776555443222100//..---,,+++***))(('(((%&''"%$%##""
- at 30BB2AAXX080903:3:56:264:557#0
-CACACACGGGGACTCACGCACAGAGGACATGTGGACACTACACACACGTTCTCACACAGCACACACCACGTCGTAG
-+
-67772788818088880882888877776/5,443',11'/-/,,-,++*)$+*(')(*#&#''(%'$%#"&&$$#
- at 30BB2AAXX080903:3:60:1110:1003#0
-GACGGGGTGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTATGTGCGTGAGTCCCCGTGTGCACANN
-+
-67777784888888888888888877776555443222100./..--,,&+++*)**))))((('('$$%%"##""
- at 30BB2AAXX080903:3:41:1071:1007#0
-CTACACACACGTTCTCACACAGCACACACCCCGTCACACCCATGAACTCACACCGAGAACACAACATCACACATAC
-+
-67777788888888888888888877776555413222100/..,-----,,++***)))*)((((''&%&&#"#"
- at 30BB2AAXX080903:3:42:1509:1682#0
-AGAGGACATGTGGACACTACACACACGTTCTCACACAGCACACACCCCGTCACACCCATGAACTCACACGNCGCAG
-+
-67777788888888888888888877776555443022100./...-,-+,,++**)(()('(((''&$""""#""
- at 30BB2AAXX080903:3:4:343:1643#0
-GAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCTGTGTGTGATGTTTTGTTCTCGTNTAGANCN
-+
-6777778888888888888808887757)555443221100-..---,,,+*+***)*)()))((('""#""#"""
- at 30BB2AAXX080903:3:41:1295:1796#0
-CCTCTGTGCGTGAGTCCCTGTGTGTGATGTTTTGTTCTCGGTGTGAGTTCATGGGTGTGACGGGGTGTGCCGCACC
-+
-67777708888888888888880877176252443222100./+.--,,,++++*))())')()(#'"""#"###"
- at 30BB2AAXX080903:3:46:628:592#0
-CGTTCTCACACAGCACACACCCCGTCACACCCATGAACTCACACCGAGAACACAACATCACACACGGGTCCTGAGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((('''"#"#"""#
- at 30BB2AAXX080903:3:60:1375:1490#0
-TCCCCGTGTGTGATGTTGTGTTCTCGGTGTGAGTTCATGGTTGTGACGGGGTGTGTGCTGTGTGAGAACAACAANN
-+
-6777778888888888888888887777655/44322210,./..-,--,+)+**)))(('('('(%'&%%%##""
- at 30BB2AAXX080903:3:44:284:1267#0
-GACGGGGTGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCCGTGTGTGATGT
-+
-67777788888888888888888877776555443222100//,.--,,,+++****))))((((''&%%"%""""
- at 30BB2AAXX080903:3:59:1463:967#0
-TCACACACGGGGACTCACGCACAGAGGACATGTGGACACTACACACACGTTCTCACACAGCACACACACAACANCA
-+
-677777888888888888888888777765554433220000//-,--,,+,++***))))))((''$$&%$$"$$
- at 30BB2AAXX080903:3:58:1620:382#0
-TGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCCGTGTGTGAACATCACAAN
-+
-6777778888888888888888887777655544322210///..---,,+++**+)))))(((''%$$"&%$%$"
- at 30BB2AAXX080903:3:58:525:892#0
-GTTCTCACACAGCACACACCCCGTCACACCCATGAACTCACACCGAGAACACAACATCACACACGGGGAGTCGCTC
-+
-67777788888888888888888877776555443222100//...-+,-+++***)*))))()''''$#&&#$#$
- at 30BB2AAXX080903:3:33:1649:1030#0
-TGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCATGAGTCCCTGTGTGTGATGTTGTGTNTACCACNN
-+
-67777788888888888888888877776555443222000//..---+,,++****)())((((''"###$$#""
- at 30BB2AAXX080903:3:33:662:1042#0
-CACAGAGGACATGTGGACACTACACACACGTTCTCACACAGCACACCCCGTCACACCCATGAACTCANCCATACNN
-+
-67777788888888888888888877776555443222100//-..+,,,*++***()((('(('''"%#"###""
- at 30BB2AAXX080903:3:33:375:891#0
-GTTCATGGGTGTGACGGGGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGGNATTACGNN
-+
-67777788828888888888888877776555443222100//..--,,-,++****)))))((''%""""#$"""
- at 30BB2AAXX080903:3:59:152:733#0
-GTGACGGGGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCTGTATGTCGNNC
-+
-67777788888888888888888877776555443222100//...--,,,++*+**)()'))(((''"&##"""#
- at 30BB2AAXX080903:3:41:1140:527#0
-GCACAGAGGACATGTGAACACTACACACACGTTCTCACACAGCACACCCCGCCACACCCATGAACTCACACTCCTA
-+
-67777788888888888888888877776553443222100//..----,,&++**)))(()(((%(%%#&###$"
- at 30BB2AAXX080903:3:47:590:752#0
-GACGGGGTGTGCTGTGTGAGAACGTGTGTGTAGTGTTCACATGTCCTCTGTGCGTGAGTCCCTGTGTGTTCGTGTG
-+
-677777888888888888888888'7776555443222100./.,.-,,,+++*)*)**))'(((('%"#$"""""
- at 30BB2AAXX080903:3:49:318:370#0
-TGGAAGGCCCTGAGCACAGGAGTTGATTGCTAGCTGCTAAGAGGCTGCGCTTTGTTCCTGAAGGAGAACGTCTCAG
-+
-67777788888888888888888877776555443222100//./--,-,+*++**()))((((((($%""$"##"
- at 30BB2AAXX080903:3:60:738:1265#0
-TAATTCTCCCTTCCACCGGGGGAAGGGCTGGGTCTCAGGAAAGGTCTAAGAGACACACAGTGCCGGGAGCACTANN
-+
-6777778888888888888888887777'355443,22100-/.,,--',&++**)))))'(('(((&"#"#"#""
- at 30BB2AAXX080903:3:53:1319:1606#0
-AGACACGACTTTTCATGGGCCTCTTCCTTTCTCCCCACCGGTAAATCACCACCCTTCAAAAGATCGGCTGCATCTC
-+
-67777788888888888883888877(765)5311112000-/..-*-++++*)*+*)())))('('$"""""#""
- at 30BB2AAXX080903:3:43:563:397#0
-TCTGATTAGGGCATTTCATCCTTCTCTGAAATGCAGCTGAGAACTGGTCAGCCTCACTCCAGATCGGANGAAGCGA
-+
-67777788888888888888888877776555443222100./..--,-,+*+++***))))((((('"$""""""
- at 30BB2AAXX080903:3:38:1752:1355#0
-TGGTAGGGGCTGGGGACAAAGTGTGGATGGGGAGCCTGCTGGACCTGTGGGGCGAGCAACTGGGGTGACTGTTGNN
-+
-67727788888888888&8$8888777&6555.(/('2010//.)---,,*+#)**)&(&)())'#'"$"#%$#""
- at 30BB2AAXX080903:3:40:652:147#0
-ACAACCACAGGAACTGAATTCTACTGACAACCAGTGAGCTTGCAAAGAGGACTTGGAGCCCCAGATGCGAGAGNGC
-+
-677777888888888888888888777765554432221&//..---,,,,,++***))(()(((''"%#""$"##
- at 30BB2AAXX080903:3:48:361:1555#0
-TAAAAATTATTTTTCAAAATGTTTCTGCCCTACCTTCCGTGAGCATCTGGTGATGGAAGATCGGAAGGGGGGGCGC
-+
-67777788888888888888888877776555443222100//..---,,-+++****)))((((''%""#""#"#
- at 30BB2AAXX080903:3:35:188:1526#0
-TTAGAGCTGGTGTCTTGCTCTGTTGCCCAAGTTTGAGTGCAATGGCTCAATCACAGCTTCACTGCAGNCACTTCAN
-+
-677777888888888888888888777765554432221001/..---,,+++****))))))((('"%"&""$""
- at 30BB2AAXX080903:3:48:1246:1576#0
-GGAATAGAGTTTGTCACTTGGGCTGTACTGACCCCAGTGGTGATGTCTTCCCTTTGATGGGTGGTGAGTGACTACG
-+
-6777778888888888888888887777655544322110.//...---,+,+**))))))')(''%""$#"""""
- at 30BB2AAXX080903:3:3:1726:204#0
-CTGGAATGTAAACTCCCTGAAAGCAAGGACTTGGCTTATTGCTGTATCCCAAGAGCCTGACACAGTGCNCGCGNCN
-+
-67777788888888888888888877776355442222100./..--,+,+,++*)'*))()%((&'&"#$$#"#"
- at 30BB2AAXX080903:3:3:1032:917#0
-TGAAATAGCAATTGATTTTCAGACATGAGTTGATAGAACCATGATTTTCTAATACTGTTCCAAAGAGCNGAACNCA
-+
-67777788888888888888888877776555443222000//..----,,++***)))))('(((&%""%##"%$
- at 30BB2AAXX080903:3:37:1109:523#0
-GGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGGCCCCTTCGCCCTATTCTTCATAGCCCGCTCN
-+
-67777788888888888888888877776555443222100/..-.--,+,++****()()(()(('"$$""#"#"
- at 30BB2AAXX080903:3:43:1168:765#0
-CTGTTCTTATGAATTCGAACAGCATACCCCCGATTCCGCTACGACCAACTCATAGATCGGAAGAGCGGTTGCGCGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))()()'('$$"""%"""
- at 30BB2AAXX080903:3:46:1727:250#0
-TGAATTCGAACAGCATACCCCCGATTCCGCTACGACCAACTCATACACCTCCTATGAAAAAACTTCCTCCCATTCC
-+
-67777788888888888888888877776555443222100//-.---,,+*++**))))(((((''$$#""#"$"
- at 30BB2AAXX080903:3:53:206:374#0
-GATTCCGCTACGACAAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCAGATCGGAAGAGCGGACCTA
-+
-67777788888888(88888888877776555443222100//..---,,+++***)))))((('((&$%"""#""
- at 30BB2AAXX080903:3:58:60:90#0
-GACCAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCCTAGCATTACTTATATGATATGTCNCACNNT
-+
-67777788888888888888888877776555443222100//.---,,,+,*****))))((((('&&"%"%"""
- at 30BB2AAXX080903:3:49:416:142#0
-GCTGGAGATTGTAATGGGTATGGAGACATATCATATAAGTAATGCTAGGGTGAGTGGTAGGAAGTTTTGCTCTAGC
-+
-67777788888888888888888877756555443222101./..---,,+++***)()))%))(%'"""""$#""
- at 30BB2AAXX080903:3:3:1196:818#0
-GAGGGGGAATGCTGGAGATTGTAATGGGTATGGAGACATATCATATAAGTAATGCTAGGGTGAGTGGTNCTCCNCA
-+
-67777788888888888888888877772555443212100//..---,,,++***))))(((('''&"#&"$"#"
- at 30BB2AAXX080903:3:36:1464:1271#0
-TGAGGGGGAATGCTGGAGATTGTAATGGGTATGGAGACATATCATATAAGTAATGCTAGGGTGAGTGTGAGTCCNN
-+
-67777788888888888888884877776345443221000.+-----+,*,++*))))))&('(#'"$""###""
- at 30BB2AAXX080903:3:36:1645:827#0
-GTTTGAGGGGGAATGCTGGAGATTGTAATGGGTATGGAGACAGATCATATAAGTAATGCTAGGGTGCATAGCATNN
-+
-677777888888888888888888777765553/32221-,.#.-.--+,,*+)*))*(''(((#(%""""##"""
- at 30BB2AAXX080903:3:54:1525:1479#0
-CAGACATATTTCTTAGTTTTGAGGGGGAATGCTGGAGAGTGTAATGTGTATGGAGAAATATCATATAACACTACCA
-+
-&7777788888888888888882877776555443222+00//,.-,,+,+++**(#))))')((((&$%##"###
- at 30BB2AAXX080903:3:38:1701:185#0
-CTTTTATCAGACATATTTCTTAGGTTTGAGGGGGAATGCTGGAGATTGTAATGGGTATGGAAGATCGGCAGATCNN
-+
-677777888888888888888888777765554432221/0//.------,++**))*))))(((('""$%""#""
- at 30BB2AAXX080903:3:4:1719:1723#0
-CATTACAATCTCCAGCATTCCCCCTCAAACCTAAGAAAGATGTCTGATAAAAGAGACACTGTGATAGANGTATNAN
-+
--777778888888888888886886777655'443112001/./,-+,,++++***#*))#'('('%%""""""""
- at 30BB2AAXX080903:3:1:319:1608#0
-AATCGAACCCATCCCTGAGAATCCAAAATTCTCCGTGCCACCTATCACACCCCAGATCGGAAGAGCGTNCCNCTCT
-+
-6777778888888%88888888887717655544302.201/)./---+,-++)*)))))'(()('&"""$"##""
- at 30BB2AAXX080903:3:60:1219:1146#0
-TATGGGCCCGATAGCTTATTTAGCTGACCTTACTTTAGGATGGGGTGTGATAGGTGGCACGGAGAATATTTAAANN
-+
-67777788888888888888888877776555443222100//...--,,+++*+*)))))()(((&$$$"%##""
- at 30BB2AAXX080903:3:43:600:1777#0
-GGTATGGGCCCGATAGCTTATTTAGCTGACCTTACTTTAGGATGGGGTGTGATAGGTGGCACGGAGAATTTTAGAT
-+
-67777788888888888888888877776555443222100//..---,-+,+***))))))((''''&&'&#%#$
- at 30BB2AAXX080903:3:45:862:1238#0
-TCACACCCCATCCTAAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCCGAAAATGTTGGTTATCCCCTTC
-+
-67777788888888888888888877776555443202100//.----,,,+++*)))())((((('$""$%%##%
- at 30BB2AAXX080903:3:34:216:1110#0
-CACACCCCATCCTAAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCCGAAAATGTTGGTAGNCTCGACNN
-+
-67777788888888888888888877776555443222100//..---,,,,+****))))(((('&"$#$$#"""
- at 30BB2AAXX080903:3:38:1100:1656#0
-GAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGGTTGGGCCAGGGGATTAATTAGTACGGGAAGGCTATAACAC
-+
-67777788888888888888888877776555443232100//..---,,++****)*)))((((''"%#$%"%#$
- at 30BB2AAXX080903:3:41:205:986#0
-GATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGGTTGGGCCAGGGGATTAATTAGATCGGAANAGCGTGTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&"&%$%#"""
- at 30BB2AAXX080903:3:38:1018:1051#0
-TGTGATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGGTTGGGCCAGGGGATTAATTAGTACGAGTGCCTAC
-+
-60777788888888888888888877776555443222100/-/.----,+++**))))))((((('"%&%%%%$#
- at 30BB2AAXX080903:3:43:691:803#0
-TGTGATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGGTTGGGCCAGGGAGATCGGAAGAGCGGTTCAGCAG
-+
-67777788888888888888888877776455443222100/...----,+++*****))))(((''$$%&$%$#%
- at 30BB2AAXX080903:3:59:56:1905#0
-GCTTAGCGCTGTGATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGGTTGGGCCAGGGAGATCGGGCCANNC
-+
-6777778888888888888888887777055344322210/////--,,,+++*+*((()))&)'(&&%####""#
- at 30BB2AAXX080903:3:47:868:1806#0
-TACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCCCACCCC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))((('('$%""#$#$"
- at 30BB2AAXX080903:3:48:547:1179#0
-TACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTACGCTG
-+
-677777888888888888888888777765554432221////..---,,+++*****)*)))((('&&%$#""""
- at 30BB2AAXX080903:3:38:778:253#0
-TCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTCATNC
-+
-6777778888888888888888887777655544322210///..--+,,+++****))()(()((''%&$"#%"#
- at 30BB2AAXX080903:3:3:1487:1529#0
-CCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCAGATCGGAAGAGNCAGCNAN
-+
-6777778888888888888888287777634384102101..*,,-,,,++++**))((&(((''&'""%""""""
- at 30BB2AAXX080903:3:58:1307:1845#0
-CCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTAGATCAACTN
-+
-67777788888888888888888877776555423222100/..-.-+,,+++****))))(()(''$$&%#"#""
- at 30BB2AAXX080903:3:54:1309:883#0
-CAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTGTACCTCAT
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*)))()(((&"#$%$%###
- at 30BB2AAXX080903:3:54:630:1038#0
-ACTCAGGTAAAAAATCAGTGCGAGCTTAGCGCTGTGATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGTCGCTAC
-+
-67777788888888888888888877776)55443222100.//.--,,,,*++*)))(*))('(''"$"%&""#"
- at 30BB2AAXX080903:3:8:730:454#0
-ATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACCTGAGNTCAGCTNN
-+
-67777788888888888888888877776555443020100-..--,,,,,++*****)))'')(''""#""$#""
- at 30BB2AAXX080903:3:50:979:723#0
-GGCACACTCATCACAGCGCTAAGCTCGCACTGAGTTTTTACCTGAGTAGGCCTAGAAATAAACAAGACCGGTCTGC
-+
-6777778888888888888888887777655524322110/0/..-,-,-++*+***))))((((''"#""""""#
- at 30BB2AAXX080903:3:8:1790:1920#0
-GCAAGCAACCGCATCCATAATCCTTCTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGANCCGCTCNN
-+
-67777788888888888888888877776555443222100///---,,,++++**)*)))))((('"$%%&&"""
- at 30BB2AAXX080903:3:35:1156:897#0
-AGGCCGGATGTCAGAGGGGTGCCTTGGGTAACTTCTGGGACTCAGAAGTGAAAGGGGGCTATTCCTANTTTCTACN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()(''""#&$$$#"
- at 30BB2AAXX080903:3:46:195:1575#0
-ACTAGGAATAGCCCCCTTTCACTTCTGAGTCCCAGAAGTTACCCAAGGCACCCCTCTGACATCCGGCCAGCTCCAT
-+
-67777788888888888888888877776555443222100//..---,,+*+***)))))()(''('#%$"$%#%
- at 30BB2AAXX080903:3:47:1637:1579#0
-GGTGCTGGAGTTTAAGTTGAGTAGTAGGAATGCGGTAGTAGTTAGGATAATATAAATAGTTAAATTACTANTACGC
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*))))))(('%""""####
- at 30BB2AAXX080903:3:45:1649:842#0
-TATCCTAACTACTACCGCATTCCTACTACTCAACTTAAAAACCAGCACCACGACCCCACTACTATCTGTGCACCAC
-+
-677777888888888888888888777746553,*2-21&&-/(-,,',++%+)))%()'%'#(&#'"%#%$##""
- at 30BB2AAXX080903:3:44:1381:808#0
-AGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGGAGGGTCGTCTG
-+
-677777888)888888888888887'71655+44522'101/-.+--,,,+'+)*()()(*'(('''&"#"#"#""
- at 30BB2AAXX080903:3:43:494:1042#0
-GAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGGTGCTG
-+
-67777788888888888888888877776555443222100./..----,+++***))*))((('&''&%#"#""#
- at 30BB2AAXX080903:3:56:1086:1031#0
-AGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTGTTGCAC
-+
-67777788848888888888888877776555443222100//..---,,+++**))))))()('''$&$$""$##
- at 30BB2AAXX080903:3:48:570:1352#0
-GGGCAGGCCTCCTAGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGTGATAG
-+
-67777788888888888888888877+76555423220100/...---,,++++**)()*)())'(("$%""#"""
- at 30BB2AAXX080903:3:51:1009:751#0
-GCGGGGGCAGGCCTCCTAGGGAGAGGAGGGTGGATGGAATTAAGGGCGTTAGTCATGTTAGCTTGTTTCGAGATGC
-+
-6777778888888888888888887777650544322.100/...---,-+++***)))))()((''$$""##"#$
- at 30BB2AAXX080903:3:42:162:348#0
-CTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCCCTAGATCGGAAGAGCGCTCACACC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))((''(%"#""""""
- at 30BB2AAXX080903:3:56:1075:747#0
-GGCCCATTTGGGCAAAAAGCCGGTTAGCGGGGGCAGGCCTCCTAGGGAGAGGAGGGGGGATGGAATTGANGCGCTA
-+
-67777788888888888888888877776555443220100//,.--,,,+++***())(((('(('"$"&"""##
- at 30BB2AAXX080903:3:52:520:1754#0
-TCGTCGATAATGGCCCGTTGGGGCAAAAAGCCGGTTAGCGGGGGGAGGGCTTCTACGGAGCGGAGGGATAGCGGTG
-+
-6777778888888888/88888887777655-442200+00//.',--$+)&))*%))#)#((&(('""#"$#"""
- at 30BB2AAXX080903:3:1:1292:584#0
-TATCTAACAACGTAAAAATAAAATGACAGTTTGAACACACAAAACCCACCCCATTCCTCCCCACACTCNGTNCCAC
-+
-6777778888888888888888887747645344312-00//-.-,,,,))*+**)())(('(''&'$""$"%%$"
- at 30BB2AAXX080903:3:46:1289:1701#0
-AGAAATTTAGGTTAAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTGTAACGCCA
-+
-67777788888888888888888877776555443222/11//..---,,++++****)))(((''''""#$#"""
- at 30BB2AAXX080903:3:41:720:1218#0
-AAAGTGGCTGATTTGCGTTCAGTTGATGCAGAGTGGGGTTTTGCAGTCCTTAGCTGTTACAGAAATTAAGTATTTC
-+
-67777788888888888888888877776559443222&00//,----,-+++***'*)())(((''&$%$"$"##
- at 30BB2AAXX080903:3:44:1581:1616#0
-TCTGTAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTAATTAAGCTAAGC
-+
-67777788888888888888888877776555443222100//..---,,++++***))*)()(((''%%&$$$$%
- at 30BB2AAXX080903:3:40:1329:522#0
-AAGGACTGCAAAACCCCACACTGCATCAACTGAACGCAAATCAGCAACTTTAATTAAGCTAAGCCCCTACTAGACC
-+
-6777778888888888888".8887667655544322210.0...+,-++*++(*+)))()(((('#""#&%%#$#
- at 30BB2AAXX080903:3:37:116:1610#0
-TGTGGGTTTAAGTCCCATTGGTCTAGTAAGGGCTTAGCTTAATTAAAGTGGCTGATTTGCGTTCAGTNGGTTATGN
-+
-677777888888888888888888777765554/32221/0//..---,,+++*+*)))()'(((''"""&"%##"
- at 30BB2AAXX080903:3:41:1680:277#0
-CAGTTGATTAGGGTGCTTAGCTGTTAACTAAGTGTTTGTGGGTTTAAGTCCCATTGGTCTAGTAAGGGCTTAGCTC
-+
-67777788888888888888888877776555343222000//..---,-+,++*+*)))()((((''&&%&&#$"
- at 30BB2AAXX080903:3:49:743:1400#0
-TAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGCTAAGCACCCTAATCAACTGGCAGATCGGGCGATA
-+
-67777788888888888888888877776555443222100//..-,-,,,++*****))))(((('&#""##"""
- at 30BB2AAXX080903:3:40:238:963#0
-ACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGCTAAGCACCCTAATCAACTGGCTTCAATCNACTTCTAC
-+
-67777788888888888888888877776555443222000./-..-,,,,++***)**)))((((%"%"%$$##$
- at 30BB2AAXX080903:3:41:1347:216#0
-GGCGGGAGAAGTAGATTGAAGCCAGTTGATTAGGGTGCTTAGCTGTTAACTAAGTGTTTGTGGGTTTACGGCATNC
-+
-6777778888888888888888887777655544322210///....-,,+++***)))))((((('&$%#$##"#
- at 30BB2AAXX080903:3:46:208:811#0
-TGAATTGCAAATTCGAAGAAGCAGCTTCAAACCTGCCGGGGCTTCTCCCGCGTTTTTTCCCGGCGGCGTCTTCCAT
-+
-67777788888888888888888877776555443222100../+,-,--,%****))(')))'(('&$$""##""
- at 30BB2AAXX080903:3:60:1625:1681#0
-TTTACAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTCAAACAACNN
-+
-67777788888888888888888877776555443232100//..---,,+++***)*)))(((&'&'$%%%"%""
- at 30BB2AAXX080903:3:1:505:1390#0
-ACAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGAGATCGGANGTNACAC
-+
-677777888888888888888886777765554432210/0//---,-,,,++*+*)())())''('&"%""#$"#
- at 30BB2AAXX080903:3:41:1761:1312#0
-CACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGACCAGAC
-+
-677777888888888888888888777765554402/21//./----+,+,+****)()))&(((&'&$#"####"
- at 30BB2AAXX080903:3:39:748:1227#0
-CCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGGTCGGCGAACATCAGTGGGGGTGAGAGATCGGCGGAGCTCA
-+
-67777788888888888888888877776555443211100//..--,-,-++***)*))))(('(&"""""""#"
- at 30BB2AAXX080903:3:49:246:1867#0
-CCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGGTCGGCGAACATCAGTGGGGGTGAGGTAAAATGAGCGAGAG
-+
-647777888888888888888888777765554332..10.//-+.-++,*++***#*&*)#(((''"####&"$"
- at 30BB2AAXX080903:3:34:768:1637#0
-TCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAGATNCAGACANN
-+
-6777778888888888888888887777655543120200../.--,--++++*)()*'(((((('%"##"#$#""
- at 30BB2AAXX080903:3:42:1264:24#0
-AGTGTTCCAATGTCTTTGTGGTTTGTAGAGAATACTCAACGGTCGGCGAACATCAGTGGGGGGGAGGGACACTGCG
-+
-67777788888888888888888877776555443122100//..-.-+,++++)*%))))('('(&&"$"$""#"
- at 30BB2AAXX080903:3:57:641:352#0
-GGTATAGTGTTCCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGGCCGGAGATCGGAAGAGCGGTGCATACGAA
-+
-67777788888888888888888877776555443222100//..--,,,++++*)*))))()((''""""""""#
- at 30BB2AAXX080903:3:43:407:262#0
-CACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGACATTAGATCGGAAGAGCGGACTCC
-+
-6777778888888888888888(87,77670134%212/0///--.-,+,++)*#**))(())'((''"&%#""""
- at 30BB2AAXX080903:3:33:36:651#0
-CTCATGCGCCGAATAATAGGTATAGTTTTACAATGTCTTTGTGGGTTGTAGAGAATAGATCGGGAGGNCTCAGANN
-+
-6777778888888+8888880888777.6053543222100//.%.--+,+++****))'#()'((%"%"##"#""
- at 30BB2AAXX080903:3:56:1646:1004#0
-TCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTTTGTAGAGAAGATCGGACACACCAAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*())*))(#(''$&"#%%%$%
- at 30BB2AAXX080903:3:1:181:790#0
-TAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTTTGTAGATCGGANCANAACT
-+
-67777788888888888888888877776555343212100/...--,,,+++**)*)*)(())'('""##"#"##
- at 30BB2AAXX080903:3:43:544:1761#0
-TAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGGGTTCCAATGTCTTTGTGGTTTGTAGAGAATAGTGAACGG
-+
-67777788888888888288%8$8777765551352'210+/+-.--+,,+++**((*)&()(('%'$&##"""##
- at 30BB2AAXX080903:3:39:937:230#0
-GGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCAGATCGGAAGAGCGCGCAG
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))*))))('(&%$$"""#"
- at 30BB2AAXX080903:3:42:1249:422#0
-AAACCACAAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTC
-+
-67777788888888888888888877776555443222100//..---,-+++***))))))((((''%"$$"$"%
- at 30BB2AAXX080903:3:54:300:1423#0
-ATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGT
-+
-6777778888888888888888887777655544322/000//...,-,,+,+**+)*)))()((''$"$%$%""%
- at 30BB2AAXX080903:3:1:192:541#0
-CATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCCNACNGCTG
-+
-67777788888888888838888877476355353220///./----),,(*+*+())(&'''(#%#%""$""#""
- at 30BB2AAXX080903:3:44:1104:694#0
-TGCATGGGCTGTGACGATAACGTTGTAGATGTGGGCGTTACCTAGAAGGTTGCCTGGCTGGGCCACCCCGGGGGGC
-+
-6777778888888888888888-87*476.5344201-10,./.-,.+,&+,*))*)))(('((&&#$$$%"""#"
- at 30BB2AAXX080903:3:57:423:213#0
-CAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGGTGCCTGGCTGGCCCCNCTCGCT
-+
-67777788888888888888888877776355443122100-/-.-*+,++,+$*+**')()'((''&&""""%##
- at 30BB2AAXX080903:3:58:1640:499#0
-CAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGGTGCCTGGGTGGGACAAGAACAN
-+
-67777788888888888888888877776555443222120//.,.--,,++++**#*)))%)('(%$&""%$%$"
- at 30BB2AAXX080903:3:41:1097:323#0
-TGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAAT
-+
-67777788888888888888888877776555443222100//..---,,+++**+))))))((((&''&%"%""#
- at 30BB2AAXX080903:3:50:757:526#0
-TGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAGTCAT
-+
-67777788888888888888888878776555443222100//...--,,+,++**)*))(()('''""#""""""
- at 30BB2AAXX080903:3:56:755:965#0
-TACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGGTACCTCACGCCACC
-+
-67777788888888888888888877776555443222000//.+-+-,++++**)))##)')#'&'""""$###"
- at 30BB2AAXX080903:3:49:1607:397#0
-TATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCAGATCGGGGGGTG
-+
-67777788888888888888888877776555443222100//..---,,+++***))()))(('''%$"""""#"
- at 30BB2AAXX080903:3:60:1280:1912#0
-TCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTACNACNN
-+
-677777888888%-82,8/.8)8877476452413*2-.-/./.,..,,,+*+****)*)#))((('%$%#"##""
- at 30BB2AAXX080903:3:60:781:755#0
-ATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTATTNACANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''&$""$##""
- at 30BB2AAXX080903:3:43:150:269#0
-TGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGAGATGGGAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&&&"""#$"#
- at 30BB2AAXX080903:3:42:398:1088#0
-ACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAAGCTTCTTCATAGTAATACCCAGTCTAAC
-+
-6777778888888888888)8888787255412332.12/00/.-,--$(*+**))*))((()((##&%#%#"#""
- at 30BB2AAXX080903:3:37:62:842#0
-CGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTACATGCTGTN
-+
-67777788888888888888888877776555443222100//..----,+++*+*))*))((('('&#$#$##""
- at 30BB2AAXX080903:3:42:75:841#0
-CAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATNCGCTCCAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&"$"%""#"#
- at 30BB2AAXX080903:3:48:688:658#0
-TAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCCGCACAT
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))(((((''$""$$#""
- at 30BB2AAXX080903:3:35:972:190#0
-CAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCCATCATAATCGGAGGCTTTGGCAACTGNAGCGTANN
-+
-67777788888888888888888877776555443222100//..---,,++**+****)))(((('"""%""#""
- at 30BB2AAXX080903:3:52:431:625#0
-TTAGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGTGTATTACTATGAAGAAGATTATTACAATTGCATG
-+
-677777888888888888888888777765550$3222110-/...,-,-,+++**)))))((((('$"#"%###%
- at 30BB2AAXX080903:3:56:1337:1009#0
-TTATTAGGGGAACTAGGCAGTTGCCAAAGCCGCCGATTATGATGGGTATTACTATGAAGAAGATTATTACTACATC
-+
-6277778888888*883888)88877776)5$44322,1000/...-,--,+***)))))))(('(''$%##$$"#
- at 30BB2AAXX080903:3:4:9:1631#0
-GGGAAACGCCATATCGGGGGCACCGATTATTAGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGCNCAACNCN
-+
-67777788888888888888818876771555443230.1)/..----,-,+')+(*))))'((&('$"&"#%"#"
- at 30BB2AAXX080903:3:42:676:371#0
-ACCCATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATGGCGGCTCCCCGA
-+
-677777888888888888&8888877776555463321110//.---,+-+*+*))**)'('(((''""&%#%$""
- at 30BB2AAXX080903:3:50:880:231#0
-CATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATGGCGTTTCCCCGCACCACG
-+
-67777788888888888888888877776555443222100/0..,---,+++****))))(&((('&"#"$#"#"
- at 30BB2AAXX080903:3:53:252:270#0
-CTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATGGCGATTACCCGCCTAAACAACATAAGCTTC
-+
-6777778888888888888888887777655.44332110..*-'(--+,+$%)+)(*(')&))('%"""#%"""#
- at 30BB2AAXX080903:3:60:756:420#0
-ACTAGTTCCCCTAATAATCGGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTCACNN
-+
-67777788888888888888888877776555443222200//...,--,,,+****))))((((('&%#"%##""
- at 30BB2AAXX080903:3:52:1086:1998#0
-GGCTCCTAAGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCAGAACGGACAG
-+
-6777778888888888828858827777655.44212220.//,.-----+++'*)'*)())'(#''$$#%%"##"
- at 30BB2AAXX080903:3:46:1515:1094#0
-TGATGGCTCCTAAGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCACTCAT
-+
-67777788888888888888888877775545543020100//.----,,+*+***&())')('((&"#$"$"#""
- at 30BB2AAXX080903:3:46:1354:60#0
-TAATTGTTGTGATGAAATTGATGGCTCCTAAGATAGAGGAGACACCTGCTAGGTGCAAGGAGAAGAAGGTATGATC
-+
-67777788888888888888888810776655433232100.//-,,,+*+++&*'))()')'(('#""#"""#"#
- at 30BB2AAXX080903:3:60:1023:908#0
-CGGAGGAGGAGACCCTATTCTATACCAACACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCNTACAANN
-+
-67777788888888888888888877776555443222100//..---,-+,++**)))))()((((&"%"%##""
- at 30BB2AAXX080903:3:49:437:25#0
-CACGATAAACCCTAGGAAGCCAATTGATATCATAGCTCAGACCATACCTATGTATCCAAATGGTTCTATTTATACG
-+
-6777778888888888888882887777455544322220//.+.-,,+,++*+*)*()((()%(''"#"#""#$"
- at 30BB2AAXX080903:3:39:533:494#0
-AACCATTTGGATACATAGGTATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGTCCCTCT
-+
-67777788888888888888888877776555443222100/...---,-,*+***(*)*))(('(&&$#"""$##
- at 30BB2AAXX080903:3:45:160:555#0
-TTTGGATACATAGGTATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACGAGCGGG
-+
-67777788888888/88888888877776555443222100//.,---,,+)+****)))*((((''&$%"""%"$
- at 30BB2AAXX080903:3:1:1670:468#0
-GTAAATATATGGTGTGCTCACACGATAAACCCTAGGAAGCCAATTGATATCATAGCTCAGACCATACCNTCNTCAA
-+
-6777778888888888888888887777655344322211///..---,,+++*****))))')((%&""%"$%#"
- at 30BB2AAXX080903:3:35:1075:210#0
-CTGTAAATATATGGTGTGCTCACACGATAAACCCTAGGAAGCCAATTGATATCATAGCTCAGACCATNACCAACNN
-+
-67777788888888888888888877776555443222100//...--,,+++++*)*))))()(('"#&####""
- at 30BB2AAXX080903:3:1:922:385#0
-GGTATGGTCTGAGCTATGATATCAATTGGCTTCTTAGGGTTTATCGTGTGAGCACACCATATATTTACNACNCACA
-+
-671.778828888132.84830.2'147:.+5/$'+2-2(.1-/'$)+++$)))''($#(&'%(''&$""%"#$$%
- at 30BB2AAXX080903:3:53:1045:1609#0
-TCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGACTAGAACA
-+
-677777888888888888888888777765554432201.0//..-,---+,++**)*))()((((%%$""%#"#"
- at 30BB2AAXX080903:3:56:1669:1250#0
-TATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGAATAGACCACAAACCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''"$$&%$%$$
- at 30BB2AAXX080903:3:1:1092:1262#0
-GTGAAATATGCTCGTGTGTCTACGTCTATTCCTACTGTAAATATATGGTGTGCTCACACGATAAACCCNTGNAATC
-+
-677777888888888888*88088'7776/504,.22-100%.&.--,),)**))&'&()(((''('$"%&"""""
- at 30BB2AAXX080903:3:35:680:1031#0
-TCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATANTGCACCCN
-+
-677777888888888888888888777765554332/110//0..---,,+*+***)))))))((%("$"""###"
- at 30BB2AAXX080903:3:51:1146:676#0
-ATCGTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTCCNCAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()('(''%#"""$$$
- at 30BB2AAXX080903:3:57:1444:235#0
-GTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCAGATCGAGCGGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('$&"#""$##
- at 30BB2AAXX080903:3:49:1507:1189#0
-TGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCNCTCGAAC
-+
-67777788888888888888888877776555443222100//..---,,++++****()())(((#&"####"##
- at 30BB2AAXX080903:3:54:662:206#0
-TGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACAATCATCCT
-+
-67777788888888888888888877776555443222100//..---,-+++***))))))(((('"#%"%#"##
- at 30BB2AAXX080903:3:36:1191:728#0
-GTGGGGATAGCGATGATTATGGTAGCGGAGGTGAAATATGCTCGTGTGTATACGTCGATTCCTAGAGACTACACCN
-+
-6777778888888888888888887777655+4432/200+'./,.,-,,++%*''#())()''((#"$$"$"##"
- at 30BB2AAXX080903:3:37:675:976#0
-GTGGGGATAGCGATGATTATGGTAGCGGAGGTGAAATATGCTCGTGTGTCTACGTCTATTCCTAAGATCTGCCAGN
-+
-6777778888888888888888887777655(4432.2(00...,-,-,,+)*+&)*)'))('(('%"&&&##"#"
- at 30BB2AAXX080903:3:47:275:71#0
-GCCGGTGGGGATAGCGATGATTATGGTAGCGGAGGGGAAATATGCTCGTGTGGCTACGTCAGATCGGCATACCTGT
-+
-67777788888888888888888877776555443'2*000/.-,,,,,,(,%&))')##&'&#'''$"""##"""
- at 30BB2AAXX080903:3:37:28:1911#0
-ACGCCGGTGGGGATAGCGATGATTATGGTAGCGGAGGGGGAATATGCTCGTGTGTCTACGTCTAGATGCAATAGAN
-+
-6777778888888888888888887777655544322-1'0/).-.)-,,$,***%)(((%')'%'#"$"""#"#"
- at 30BB2AAXX080903:3:46:835:1539#0
-AATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATCGCTATCCCCACCGGCGTCAGTCAAGCA
-+
-67777788888888888888888877736545443122000//...--+,,+++)*(*))(((((''&$"#""%"#
- at 30BB2AAXX080903:3:47:1068:679#0
-GACACACGAGCATATTTCACCTCCGCTACCATAATCATCGCTATCCCCAAGATCGGAAGAGCGGTTCAGCTCATAA
-+
-67777788888888888888888877776551343222100//...-,*,++****)))()(((#&%$$#""""""
- at 30BB2AAXX080903:3:40:705:1440#0
-TGGCGAGTCAGCTAAATACTTTGACGCCGGTGGGGATAGCGATGATTATGGTAGCGGAGGTGAAATATGCTCGTGT
-+
-67777788888888888888888877776555443222120./..--,,,+++*)*)())#)#'(%'"%""$%#"#
- at 30BB2AAXX080903:3:40:852:1798#0
-CCTCCGCTACCATAATCATCGCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACAGATCCGA
-+
-6777778888888888888888887177655544221-.00/,..--,-++,+**)*())('''('''$##&#"##
- at 30BB2AAXX080903:3:60:940:1464#0
-ACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGACGCCGGTACACACNN
-+
-67777788888888888888888877776555463222100//.--,-,,,*+**)))))(()(((&'&"&%#$""
- at 30BB2AAXX080903:3:56:935:536#0
-ACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAAGAGCTCACG
-+
-67777788888888888888888837776)5544/2221.0//..--,,,++******)))(((''''%"%"##$"
- at 30BB2AAXX080903:3:58:813:661#0
-TAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGAGATCGGAAGATGTTCCAC
-+
-67777788888888888888888877776555443222100//..---+,+++(**)*))((()(''$$&""####
- at 30BB2AAXX080903:3:47:221:452#0
-ATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTGAGAACTGT
-+
-67777788888888888888888877776555443222100//..---,,-++***)))))&(((((&$$"#$#$"
- at 30BB2AAXX080903:3:42:1500:1933#0
-TATTTAGCTGACTCGCCACACTCCACGGAAGAAATATGAAATGAACTGCTGCAGTGCGCTGCGCCCTAGGGCACAC
-+
-67777788888888888018&7&06367$52"-1*022001%.,,+,,*++&'*')#'&&'#(%'%%"$""""$"#
- at 30BB2AAXX080903:3:1:1194:734#0
-TAGCTGACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATNTCNCCTT
-+
-677777888888888888888888777765554432221/0-..-.-,+-)+*+*)*)*)')((((''""$"##$#
- at 30BB2AAXX080903:3:50:896:1907#0
-TAGCTTACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATGTGTATAT
-+
-677777888888888888888.8877736555443121110/..-.-*+,++))**))))((((((%%$""""#"#
- at 30BB2AAXX080903:3:53:1718:1107#0
-TGCTGCAGTGCTCTGAGCCCTCGGATTCATATTTTTTTTTTTTGTTTGTGGTTTGACTGGACTCAGTACAACACAA
-+
-67.77788888888888&05&'08+17$0-$24/'22210,/&$.&(-,+*&%*)##'))%#&#%%#$$&%%$$$$
- at 30BB2AAXX080903:3:36:237:119#0
-GTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGAGATCGGAANAACAGCCN
-+
-67777788888888888888888577776555442221100//..--,,,,*+***)*)*((')((%"""$#"##"
- at 30BB2AAXX080903:3:57:840:845#0
-GTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACAGATCGGAAGAGCGGTGCATCGC
-+
-67777788888888888888888877776555443222100//..---,--++***)*))()()'('$$"%"#$"#
- at 30BB2AAXX080903:3:36:821:1014#0
-CGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACAGATCGGAAGAGCAGCGACTCN
-+
-67777788888888888888888877776555443232000/....,,,,+*+***)'()((((((%""##"#"#"
- at 30BB2AAXX080903:3:43:385:1195#0
-GTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACAGATCGGAAGGGCGGT
-+
-6777778888888888888883887747655544322210///.-.-,'+-++**)*))(()(((('$&%$"""#"
- at 30BB2AAXX080903:3:51:1585:1216#0
-GTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGGTGAAAAGCACGA
-+
-67777788888888888888888877776555443222100//...--,,,++***))))))(('''$#$"###"#
- at 30BB2AAXX080903:3:36:1572:1081#0
-TAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCAAGATTGCTACANN
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*)))((('(%"""""#"""
- at 30BB2AAXX080903:3:47:1500:392#0
-TTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTAT
-+
-67777788888828888888888877776555443222100//..---,,++++*****)))))('(&$%"%#"#"
- at 30BB2AAXX080903:3:55:1663:1126#0
-TTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGAAACACACACC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(%%$%%#&%#$
- at 30BB2AAXX080903:3:8:799:1454#0
-TTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACNCACGTCNN
-+
-67777788888888888888888877776555443221100/../---,,,++***))))))))(('"'##""#""
- at 30BB2AAXX080903:3:39:785:481#0
-ACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTGCGGGCG
-+
-67777788888888888888.88877774555443222100//..---,,+++*+*))*)))(((''&&&&&#"#"
- at 30BB2AAXX080903:3:44:38:1424#0
-ACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTAGCATCCAC
-+
-67777788888888888888888877776555443220/00//..--+,,-+++(***)))(()(''$"$##$#"#
- at 30BB2AAXX080903:3:38:82:1200#0
-CAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCGTCTACTCA
-+
-67777788888888888888888877776555443222100//..--,,,+++*****))))(('('""$"#$"##
- at 30BB2AAXX080903:3:52:65:437#0
-CAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCCACTGGATG
-+
-67777788888888888888888877776555442222100./..---,,+++***))))()(((('$"$%"$$##
- at 30BB2AAXX080903:3:52:292:573#0
-GTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTGGNGGCTCG
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))))((''""""%""#"
- at 30BB2AAXX080903:3:8:1477:553#0
-TGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACANTGCCTCNN
-+
-67777788888888888888888877776355441221100.)-..-,,,+,**+(*)*)())'(''"%"$#$$""
- at 30BB2AAXX080903:3:38:1155:1161#0
-CCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGAGATAGTGTG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))()'''"&&%%##$%
- at 30BB2AAXX080903:3:37:582:1497#0
-TCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACGCCAN
-+
-677777888888888888888888-7773555443222001/.--,-,,,+++***)))))'(((('$$%&"#$#"
- at 30BB2AAXX080903:3:58:848:1948#0
-TGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCACCACN
-+
-67777788888888888888888877776555443222100//...---,+,+*+*)))))((('(''&%#%"##"
- at 30BB2AAXX080903:3:41:1225:1810#0
-GTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTA
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))))))((((&$$%%%%##$
- at 30BB2AAXX080903:3:50:543:824#0
-TAGGGTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCATCCTATGATGGCAAATCNACGAC
-+
-6777528888888888-8888888777764554232221/0//.,-----++++'+))))()(('('%""""#"##
- at 30BB2AAXX080903:3:45:617:1437#0
-GTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACTGCT
-+
-67777788888888888888888877776555443222100//...--,,++++**))))))((((''"%#"""""
- at 30BB2AAXX080903:3:46:1435:1085#0
-GTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCACCTGCTCTA
-+
-67777788888888888888888877776555443222100///.---,,,++***)))))))((('$$""$"#""
- at 30BB2AAXX080903:3:49:989:436#0
-TATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTCTCTTGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))))(((&&"##%"""#
- at 30BB2AAXX080903:3:53:1395:1187#0
-GCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCGAATTCC
-+
-67777788888888888888888877776554443222100//./---,,,+++**)**))()(((&"""#&"#$#
- at 30BB2AAXX080903:3:37:1020:102#0
-TATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCGACTTCNN
-+
-67777788888888888888888877776555443222100//..---,,+++++**))))((((('"&$&%##""
- at 30BB2AAXX080903:3:42:690:1087#0
-ATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCAGGGATGCCCCGGCCGTGCT
-+
-674777888880888888*888887777657104320210///.'--),,+++*)*%))))'(('#''$%#%##$"
- at 30BB2AAXX080903:3:60:561:140#0
-TCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCAGATCGGACGCCCCNN
-+
-677777888888888888888888777765554432221/0//..,),,,+,+****)*)'(((((''#&"$#$""
- at 30BB2AAXX080903:3:55:37:1695#0
-CATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCGACGTTACGCCGACATC
-+
-67777788888888888888888877776555443222100//..---,,+,++****))()(((('"$##""##"
- at 30BB2AAXX080903:3:38:99:857#0
-TGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGTTCTTCTACTATTAGGATCCTCTCCCG
-+
-67777788888888888888888877776555443222100//..---,,+*+*+*)*)))(((((#$$&%$&##"
- at 30BB2AAXX080903:3:3:1374:1552#0
-ATGTGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGGTCTTCTACTAAGATCNAGCANCC
-+
-677777888088888888888888(71765524431/2/00-).,.--,,,+%('*)))(('((('%%""""$"#$
- at 30BB2AAXX080903:3:1:15:1043#0
-ATAGTAGAAGAACCCTCCATAAACCTGGAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGNNCTNACAC
-+
-67777788888888888888888877775555443211100./.'-,,+,+,+*')()())((''''""$""#$##
- at 30BB2AAXX080903:3:55:1032:786#0
-TACGGGTTCTTCGAATGTGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGTNTNTCTCGT
-+
-677777888888888888888848777.6555443222000//..---,,+++**)))&)))')'(&"""%%$#""
- at 30BB2AAXX080903:3:4:75:371#0
-GTATACGGGTTCTTCGAATGTGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTAGATCGGCNCTCGNTN
-+
-6777778888488888888888887/77651244122220.//-.--+&++&+(*))((((('((('""%""""""
- at 30BB2AAXX080903:3:57:1639:95#0
-TGTCAAAGTTAAATTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTAACACACAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&$$%%&%$#$
- at 30BB2AAXX080903:3:51:1293:1482#0
-ATAGGGGAAGTAGCGTCTTGTAGACCTACTTGCGCTGCATGTGCCATTAAGATATAAGATCGGAAGAGCGCGGCAT
-+
-6777778888888888888888887777655524112.100//#,.--,-++++*(**))')((((%"$"#""#""
- at 30BB2AAXX080903:3:40:882:158#0
-CCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTGATA
-+
-67777788888888888888888877776555443212100/..-.---,+++**)*)(()((((''&$%#"""""
- at 30BB2AAXX080903:3:55:1126:950#0
-TATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCAGATCGGAAGGTGCGCGAC
-+
-67777788888888888888888877776555843222100//-.---,+,+****(()))'()'''$#$$$#"##
- at 30BB2AAXX080903:3:35:1659:1352#0
-TATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTNACCATTGN
-+
-67777788888888888888888877776555443222100-/.-(-,+,,,+*)**))))(()#&'""$%#""#"
- at 30BB2AAXX080903:3:56:1175:147#0
-GGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCAAGATCGGTACNACT
-+
-67777788888888888888888877776555443511.0//.--,--+-+,++**()))((()(&''$##"""#"
- at 30BB2AAXX080903:3:46:1611:1061#0
-TACAGGACTAGGAAGCAGATAAGGAAAATGATTATGAGGGCGTGATCATGAGATCGGAAGAGCGGTTCAGCATGGG
-+
-67777788888888888888888877776555443222100/...---,,-++***))*))('('(&%"##"""""
- at 30BB2AAXX080903:3:52:1512:647#0
-AGACGGTTTCTATTTCCTGAGCGTCTGAGATGTTAGTATTAGTTAGTTTTGTTGTGAGTGTTAGGAACAGCGAGCG
-+
-67777788888888888888888877776555443222100//..---,,+++****))))((('('%'"&"##$#
- at 30BB2AAXX080903:3:52:1512:649#0
-AGACGGTTTCTATTTCCTGAGCGTCTGAGATGTTAGTATTAGTTAGTTTTGTTGTGAGTGTTAGGAANAGGTAGCG
-+
-67777788828888888888888877776555443222100//..---,,+++***))))(()('('"""$"#"##
- at 30BB2AAXX080903:3:43:693:421#0
-CACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCGCGC
-+
-6777778888888888888888887777655244322210&/...*--+,+++**()()((()('(''%#%&#%$#
- at 30BB2AAXX080903:3:57:1163:1524#0
-CTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTAGATCGGAAGATGNACACA
-+
-67777788888888888888888877776555443222100//..-----+,+****))))))(((''%$""#$$#
- at 30BB2AAXX080903:3:48:1355:828#0
-ATGGCCAATTGATTTGATGGTAAAGGAGGAATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGGAGTGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))))))(((''$""""""##
- at 30BB2AAXX080903:3:59:482:535#0
-GGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACTCCAA
-+
-6717778888888888888888887777435)443222110//.---,,,+++*+**))'()((''#'&#""##"#
- at 30BB2AAXX080903:3:52:504:1093#0
-ACACCGACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAAGATCGGAAGCGAAACAA
-+
-67777788888888888888888877776555443222100//..---,,++****)))))()((('$$""$%##"
- at 30BB2AAXX080903:3:37:1005:832#0
-AAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGCATGTAGGATTTGAAGAGTAGTCCGCTGCATCCN
-+
-677777888888888888883$88727765554432201-0/),.-+,,-*&'*)*)*)('((((''"""#"%##"
- at 30BB2AAXX080903:3:56:1232:1741#0
-GACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACCACACC
-+
-6777778888888888888888887,776555433221/0//0.---,,+,++*'**))())('('%&$#"#%$##
- at 30BB2AAXX080903:3:40:783:397#0
-AACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))())()((('$$%##$"#$
- at 30BB2AAXX080903:3:44:591:1677#0
-GTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGGAGATCGG
-+
-677777888888888888888888777765554435221////,.--,,,+++***)))))')((((&""%#$"$%
- at 30BB2AAXX080903:3:43:892:1725#0
-ACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTGCCGCTGCTC
-+
-6777778888888888)88888837777655544+2211//-..---',,+()+)'*()'))&('(''&%##""""
- at 30BB2AAXX080903:3:3:129:387#0
-ACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGATAAAAGATCNCAACNCA
-+
-6277778888888888(88888787777.3554332(2110*-.,-",,,,+*%*'#*&()#)(((%'"#"$$""#
- at 30BB2AAXX080903:3:54:1223:1032#0
-TGTAAAGAGGTGTTGGTTCTCTTAATCTTTAACTTAAAAGGTTAATGCTAAGTTAGCTTTACAGTGGGCGCTGTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((('''#"&%$"##
- at 30BB2AAXX080903:3:47:208:784#0
-GCCCACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAAGAGAACCAACACCTCTTTACACTCACAT
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((('(&'###$#"#%
- at 30BB2AAXX080903:3:59:1518:686#0
-TAAGTTAAAGATTAAGAGAACCAACACCTCTCTACAGTGAAATGCCCCAACTAAATACTACCGTATGCACACANAA
-+
-6777778888888888888888887777655.443222100//..,.,,,+,++****)))((((('&$#%$$"##
- at 30BB2AAXX080903:3:54:682:1851#0
-TTCATTCATTGCCCCCACAATCCTAGGCCTACCCGCCGCAGTACTGATCATTCTATTTCCCCCTCTAACAGTCCTC
-+
-67777788888888888888888877776555443222100//..-.-,,+++**+))))())(''&"$%"%$%#%
- at 30BB2AAXX080903:3:49:1243:344#0
-ATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGATCAGTACTGCGGCGGGGAGGCCCAGGATCGAGACTCC
-+
-67777788888888888888888877776555442222100//..---,,+++**%**)'(#(('%%%"#"##"##
- at 30BB2AAXX080903:3:55:523:676#0
-GTTGATGAGATATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGATCAGTACTGCGGCGGGGAGGTTACTC
-+
-677777888888888888888888777765554432221/0//-.-.-,,,,+*****)))(((((%""$"""###
- at 30BB2AAXX080903:3:48:1345:142#0
-CTAGGCCTACCCGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCACACATA
-+
-677777888888888888888888777;6555443222100//.,.-,-,+++****())('('(''$""##%%"#
- at 30BB2AAXX080903:3:48:247:1781#0
-GCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCATCAACAACCGACCACACA
-+
-6747+78888888888888888887777.55534322210/-.#.-,+,,,++****))))(((('%"$$""$"#"
- at 30BB2AAXX080903:3:59:1320:999#0
-GCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCATCAACAACCTACACCACA
-+
-677777888888888888888888777765554432220/0/./,--,+,,++****)*))()(((#$&&&$##$#
- at 30BB2AAXX080903:3:1:444:322#0
-GGTTAGTTGTGGCAATAAAAATGATTAAGGATACTAGTATAAGAGATCAGGTTCGTAGATCGGAAGATNAANTGCA
-+
-677777888888888888888888777765554432221000/...-,,,+++)*)**))(()((''"""#""##"
- at 30BB2AAXX080903:3:54:672:1670#0
-ACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTTTATTGCCACAACTAACCTCCTCGGACTCCTNCCTCAC
-+
-67777788888888888888888877776555443222100//.-.---,+++***))()))((((#&""%$%%$#
- at 30BB2AAXX080903:3:55:835:609#0
-TGGGTGGTTGGTGTAAATGAGTGAGGCAGGAGTCCGAGGAGGTTAGTTGTGGCAATAAAAATGATTAAGNGNCACA
-+
-67772788888088888888888877776555442222100/.----,,)++)***)))*)((((('"%"""%$#"
- at 30BB2AAXX080903:3:53:70:484#0
-AGGGGATGGCCATGGCTAGGTTTATAGATAGTTGGGTGGTTGGTGTAAATGAGTGAGGCAGGAGGCCGTGTCGTGG
-+
-677773888888888888888881787163524432,2100//*.(-++,+++&*)))(())#)''%"""#"%"""
- at 30BB2AAXX080903:3:3:566:1332#0
-CCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGGCCATCCNCATCNCA
-+
-67777788888888888888888877776555443222100//.----,,+,++**)*)'(()(''''"%"%$""#
- at 30BB2AAXX080903:3:41:830:1931#0
-TGCGCCCGCTCATAAGGGGATGGCCATGGCTAGGTTTATAGATAGTTGGGTGGTTGAGATCGGAAGGGCGTCTCGC
-+
-6777778888888888888888887777655344222/1101//.,-,,-+++***'*')%((#('#%$$""#$""
- at 30BB2AAXX080903:3:44:1293:462#0
-AAAGCCTATAATCACTGCGCCCGCTCATAAGGGGATGGCCATGGCCAGGGTTCTTGATAGTTGGGGCGAAGCAGCA
-+
-677777888888888888888888&7%735+5403.12.2,+%.%$*'+%,,(*#'#(#('('(%%''"""#"#$#
- at 30BB2AAXX080903:3:44:1777:239#0
-AGTGGGCTAGGGCATTTTTAATCTTAGAGCGAAAGCCTATAATCACTGCGCCCGCTCATAGATCGGACGGACATGC
-+
-67477788888888888888888877776559443222100/...-,,-,+++*+)*)()))#(&''"$"#""#"#
- at 30BB2AAXX080903:3:39:417:1670#0
-CCATCCCCTTATGAGCGGGCGCAGTGAGTATAGGCTTTCGCTATAAGATTAAAAATGCCCTAGCCCACTTCTTCTC
-+
-67777788888888888888885817756555440210000/+------,-++**(*&))('(%(''"%"$%####
- at 30BB2AAXX080903:3:1:1001:812#0
-CACTTCTTACCACAAGGCACACCTACACCCCTTATCCCGATACTAGTTATTATCGAAACCATCAGCCTNACNCACG
-+
-67777788888888888288880877-76545443110.10...--,,,-,++**)()(()(((('#""#%""##"
- at 30BB2AAXX080903:3:53:1077:309#0
-TACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTAGCCGCTACCATCCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*))(((''&#"%%%"##
- at 30BB2AAXX080903:3:51:851:1724#0
-CCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATGAGTAGGCTGATGGTTTCGACTAACT
-+
-6777778888888888888888887777655544322.100//.---,-,+++++*)(*)()(((('%$##"#"#"
- at 30BB2AAXX080903:3:57:579:976#0
-AACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACCC
-+
-67777788888888888888888877776555443222100//..---,,+++**+***))))(((''&&$"###"
- at 30BB2AAXX080903:3:41:241:1097#0
-CATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATGAGGCGGTCGGCG
-+
-6777778888888888888888887777655522522.10/+/.,.+,,,(*+***))))(((('(%$$%""""""
- at 30BB2AAXX080903:3:39:445:207#0
-GGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATAGGTACACA
-+
-677777888888888888888888777765554432221000/-,,--,,*++**))*)))())((%$"%$%"###
- at 30BB2AAXX080903:3:3:160:1439#0
-ACTCATTCAACCAATAGCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGANTCCANAT
-+
-677777888888888888888888772765554432320/1///-+--+,+*+**)'))((((('('"""&#$"""
- at 30BB2AAXX080903:3:51:352:1004#0
-GCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGACTCGCGAG
-+
-6777278888888888888888887777655454322210/./.-.,,,+++***)'*))()(((''"#"%"#"""
- at 30BB2AAXX080903:3:59:190:1177#0
-TTGGATTAAGGCGACAGCGATTTCTAGGATAGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGCGCANNNA
-+
-67777788888888888888888877776555.4/22.100//...--,,(+++*+*))))((''(''""$""""$
- at 30BB2AAXX080903:3:55:1673:1897#0
-TCCCTCTACACTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCGCTGTCGCCTTCACACCCACC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(''&$&%%%$%#$
- at 30BB2AAXX080903:3:33:295:1041#0
-CTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGAGANCAACCANN
-+
-67777788888888888888888877776555443222100./..---,-,+++***)))(((('('"%#"###""
- at 30BB2AAXX080903:3:55:255:594#0
-TAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTAAAACCCAGCCCA
-+
-67777788888888888888888877776550443222101./..---,,+++***))))))'(('($"$%%%###
- at 30BB2AAXX080903:3:57:1552:1305#0
-TAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTAAAACACATACCA
-+
-67777788888888888888888877776555443221100/...---,,,+++**)))))()(((&'$&$"##$$
- at 30BB2AAXX080903:3:42:522:1136#0
-ATCGCGCCATCATTGGTCTATGGTTCGTGTGTTGGTTAGTAGGCCTAGGATGAGGAGCGTTGTGGAGTGGTGTATA
-+
-6737778888888888888888887'736$514432021.///,.-,-+-,++**))())()(((''&&#$$"#""
- at 30BB2AAXX080903:3:42:1309:868#0
-TACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGGTTT
-+
-67777788888888888888888877776555443222100//..---,,+++**+)))))()(('&&%%#%#"""
- at 30BB2AAXX080903:3:43:837:1057#0
-TACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGGTAGTAGGCCGAGTATGAGGAGCGCTATGGCACCGTGT
-+
-6777778888888888888)8888777745*5442222(00/.-.-,,,,++*****)())(&((('$$""$%#$"
- at 30BB2AAXX080903:3:55:825:1264#0
-TTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGTAT
-+
-67777788888888888888888877776555443222100//..--,-,,+++**))))))()'(&$&"$$%#""
- at 30BB2AAXX080903:3:2:864:1183#0
-TGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGACTAGTATGAGGAGCGATANGGACATC
-+
-677777888848*88888888881777765(94(3022100-.--.--,),,)+*)*)())((#'%'"""#%$$"#
- at 30BB2AAXX080903:3:40:1507:1694#0
-GTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGAGATCGTAGGGTTGC
-+
-67777788888888888888888877776552343212100//-,-+,,,,(+**)*)))))((''&$%#""""#"
- at 30BB2AAXX080903:3:49:1026:996#0
-CGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGCTATGGAGG
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))*((('(&$#$#$$"""
- at 30BB2AAXX080903:3:34:1041:1648#0
-TTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGNTAGATANN
-+
-67777788888888888888888877776555443222100//..---,,+++******))(((('&""#""##""
- at 30BB2AAXX080903:3:4:1588:709#0
-TTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGAGATCGGAAGAGCGNCACCNCN
-+
-677777888888888888888888777765554412221/0-/.---',-,**+))*()))('((('$"%&$#"""
- at 30BB2AAXX080903:3:43:991:1309#0
-ATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTATTAGGCCTAGTATGAGGAC
-+
-671,4.8382888-8+.88,118,7317)-+/34#0)-.1/*&.,-(+$,('+(')(#&%('&'(&'$""%#%###
- at 30BB2AAXX080903:3:59:138:1822#0
-ATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTAGATCGGAAGAGCGGACGNNC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)*)))(()'(&'$%#$"""#
- at 30BB2AAXX080903:3:44:1284:1377#0
-TGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*))(('''%"%##$%"%
- at 30BB2AAXX080903:3:44:710:798#0
-TGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGAGATCGGAAGGGAGGGACACGCCA
-+
-6777778888888-888/8888(8-777655'%)1%(21&//+&..+,'+)+++''()))%('('(('"#""$"#"
- at 30BB2AAXX080903:3:41:1379:1187#0
-CATACTAGGCCTACTAACCAACACACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACTNT
-+
-67777788888888888888888877776555443222100//..,---,*++**)())))((((''&&%%%$"""
- at 30BB2AAXX080903:3:41:1594:920#0
-TTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCACGTTCTC
-+
-6777778888888888888888887777655544322210.-/..---,,++++*+)))()(('((&&""%%""$%
- at 30BB2AAXX080903:3:56:454:912#0
-TTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGATCGGTGGAGCTG
-+
-6777778888888888888888887777655544332210///..---,,+&+*+))))))'(((#''$"%"##"$
- at 30BB2AAXX080903:3:53:375:802#0
-GGGGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTCGTAGTCC
-+
-677777833888888888888888777765554432221/0//-.--,-,+++****)()(((('(#$&%$$%"#"
- at 30BB2AAXX080903:3:42:228:196#0
-TGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTCGGAGGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)*))((''&&&$$&"&%#
- at 30BB2AAXX080903:3:8:1106:844#0
-GTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTANCTGCTCNN
-+
-67777788888888888888888877776555443222100//..---,,++****))))((()(('"$""%#"""
- at 30BB2AAXX080903:3:2:60:1894#0
-CTACTAACCAACACACTAACCATATACCAATGATGGCGCGATGTAACACGAGACAGCACATACCACGANGACNNCA
-+
-6777778888888888888838884777635504322200-//,-,-,,,,++&*))(((&(&((%'"""%%""##
- at 30BB2AAXX080903:3:41:1383:27#0
-TGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGCGGACAC
-+
-67777788888888888888888877774555443212100/.-.+-,,,**+*+**(*((((((&'%&%##$#"#
- at 30BB2AAXX080903:3:56:671:2024#0
-TGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTAGATCGGAAGAGCTTTCA
-+
-67777788888888888888888877776555443212100//...--,,-+++**))))))()(('&%$"""##"
- at 30BB2AAXX080903:3:35:824:1294#0
-GTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTNGTCTTAGN
-+
-67777738888888888888888877776555443222100//..---,,++****))*))()(('&""$%#""#"
- at 30BB2AAXX080903:3:41:363:1372#0
-TGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGAGATCGGAAGAGCAGCNGTCACACC
-+
-67777788888888888888888877776555443222000//..---,,,+++*)*)*))(('((%"$#"$####
- at 30BB2AAXX080903:3:57:439:55#0
-TGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGCTNGTTACT
-+
-67777788888888888888888877776555443222100//.----,,++++**)))()((('(&$$"#""#$"
- at 30BB2AAXX080903:3:55:1265:762#0
-GGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGCGACTCGCT
-+
-67777788888888888888888877776555443222100//..--,--+,+***)()))((('&'"&"#"""#"
- at 30BB2AAXX080903:3:35:411:459#0
-AACCAACACACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACNACCCCGAN
-+
-67777788888888888888888877776555443222100//..----,+++*****)))(((((&""$#"%"""
- at 30BB2AAXX080903:3:49:1094:1196#0
-AACCAACACACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACGCACTCCGC
-+
-67777788888888888888888877776555443222100//...--,,+*+***)))*()(('('$$"%#####
- at 30BB2AAXX080903:3:36:849:1531#0
-GTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGAGATCGGAAGCGCCCCCCGN
-+
-67777788888888888888888877776555445222100//.-----,,,+****))))()(('#$$###"#""
- at 30BB2AAXX080903:3:47:950:926#0
-GGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTATCGGGCCGC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))(((((("#"""##"#
- at 30BB2AAXX080903:3:49:881:609#0
-GGTGGTGTGTGGTGGCCTTGGTATGAGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGACATATGG
-+
-677777888888888888888)887,73455544322210.//..---,,++++****))((((%'#&$#"$#"""
- at 30BB2AAXX080903:3:37:951:1054#0
-AGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTCGTTACCAN
-+
-67777788888888888888888877776555443222100//..---,,+++)**)))))))((''$$%$"##$"
- at 30BB2AAXX080903:3:3:1203:1601#0
-CAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTNTACANAT
-+
-67775788888888888888888817776555443221100///----,,+*****)))())(((('%"%#%&""#
- at 30BB2AAXX080903:3:60:427:1283#0
-ACACACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACATCCNGTNN
-+
-67777788888888888888888877776555443222100/.,.----,,++(**))*())))(('%#%#"#"""
- at 30BB2AAXX080903:3:36:321:1673#0
-ACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGCTCTGCGCN
-+
-67777788888888888888888877776555443222100//..---,,+++*+)')))))()(('%#$"$#"#"
- at 30BB2AAXX080903:3:44:619:2017#0
-GACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTG
-+
-677777-8888888888888888872776553443221110//.---,,,+*+**)**)*)(((('''%%&%$%##
- at 30BB2AAXX080903:3:1:341:1411#0
-GGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGNCCNCACT
-+
-677777888888888884888888777765/554323210//..,,+-,,,+***))()())%'(''""$#"$$""
- at 30BB2AAXX080903:3:8:1447:1549#0
-CACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCNCCTCACNN
-+
-677777888888888888888888777765-5443222100//..---,,+,*+*)))))())((('"&##%##""
- at 30BB2AAXX080903:3:44:1712:1095#0
-TGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGTGTGGTG
-+
-67777788888888888888888877776555443222100//-.---,,++++**))*))(((('''&&&$"#"#
- at 30BB2AAXX080903:3:56:1020:2017#0
-ACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCACCGCAGTAC
-+
-67777788888888888888888877776555443222100/..----,,+,+**)*)))()((((''&"##""##
- at 30BB2AAXX080903:3:43:53:1026#0
-TAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCACCTGCGACACA
-+
-67777788888888888888888877776555443222100//..---,,+++****))))(((''''"#"#$###
- at 30BB2AAXX080903:3:39:1330:161#0
-ACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCAGACCCGTGTCTCA
-+
-67777788888888888888888877776555443222100//.---,,-++++*))**)))'((#%"&$"%%#$"
- at 30BB2AAXX080903:3:34:701:316#0
-ATACGGATGTGTTTAGGAGTGGGACTTCTAGGGGATTTAGCGGGGTGATGCCTGTAGATCGGAAGAGNCTAACGNN
-+
-67777788888888888888888877776555443222100//...--,,+,**)**)('()((((("$"""$"""
- at 30BB2AAXX080903:3:35:1380:1616#0
-TAATACGGATGTGTTTAGGAGTGGGACTTCTAGGGGATTTAGCGGGGTGATGCCTGTTGGGGGCCAGNAAACACGN
-+
-67777788888888888888888877776555443202100/0..--,,,+++***)*)())(('''"""##%$#"
- at 30BB2AAXX080903:3:4:385:913#0
-CCCAACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTCCTAAACACATCCGTATTACTCGCACNAGTCNAN
-+
-67777788888888888888888877576545443222100//,..--,,,++*+**))()))('(('"#""#"#"
- at 30BB2AAXX080903:3:3:1050:1036#0
-CAACAGGCATCACCCCGCTAAATCCCCGAGAAGTCCAACTCCCAAACACATCCGTATTACGCGCATCCNCGCANCA
-+
-6777778888888888888888277/(/255'.,22#1//.%&/.-+,+,*$++&*))))'))(('&""$""#"##
- at 30BB2AAXX080903:3:3:1447:1191#0
-AACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTCCTAAACACATCCGTATTACTCGCATCACNCGTGNCA
-+
-677777888888888888888883777763511/10,-(/-/*,--,,+,*)*)*'()((()(('''$""#%#"#"
- at 30BB2AAXX080903:3:39:90:135#0
-AGCAGTGCTTGAATTATTTGGTTTCGGTTGTTTTCTATTAGACTATGGTGAGCTCAGGTGATTGATACGCCTCTCA
-+
-67777788888888888888888877776555443222100/...---,,+++**))))))()(('&""#$"#"##
- at 30BB2AAXX080903:3:58:838:308#0
-AAATAGAGACCCAGTAAAATTGTAATAAGCAGTGCTTGAATTATTTGGTTTCGGTTGAGATCGGAAGAGGTCTCNC
-+
-67777788888888888888888877776555443222110//..---,,+++***))))))(((('&$$"$"#"#
- at 30BB2AAXX080903:3:58:830:1259#0
-GTCTAATAGAAAACAACCGAAACCAAATAATTCAAGCACTGCTTATTACAATTTTACTGGGTCTCTATTTTCACAT
-+
-67777788888888888888888877776555443222100//..---,,-++***))))))(((''%$&%$#$#"
- at 30BB2AAXX080903:3:56:1234:725#0
-CTTGTAGGAGGGTAAAATAGAGACCCAGTAAAATTGTAATAAGCAGTGCTTGAATTATTTGGTTTCGGTTGTCTTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('$&$"%#"""
- at 30BB2AAXX080903:3:33:1640:1067#0
-TGAGGCTTGTAGGAGGGTAAAATAGAGACCCAGTAAAATTGTAATAAGCAGTGCTTGAATTATTTGGNGCATATNN
-+
-67777788888888888888888877776555443222100//..---,-+++***))))))()(''""$##""""
- at 30BB2AAXX080903:3:41:546:757#0
-AGTGAGCTGAGATCGTGCCACTGCACTCCAGCCTGGGCAGCAGAGTGAGACTCTGTCTAGATCGGAAGAGCTGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++****)()))((('("&%"""###
- at 30BB2AAXX080903:3:41:1130:1596#0
-ATGGGTGCAGCACACCAACATGGTACATGTATACATACGTAACAGACCTGCACGTTGTGCACAAGATCGGGAATGT
-+
-67777788888888888888888877776555443222100/...--+,,++++*+**))(((((('&$"""""""
- at 30BB2AAXX080903:3:34:1449:1144#0
-TGGTGTTGCCCAGGCTCAGCTCTGCCTAGACACACGTGAGGGCCAAGATCTGGTTTGTGTTTCATGANCACACANN
-+
-67777788888888888888888877776555443202100//.---+,,,++)***))())'((''"&#%"##""
- at 30BB2AAXX080903:3:52:1258:1115#0
-TGAGCCCTGCCTTCCTAGGGAATCTTGTAGGAAAGACAAAGGTAGAGAATCTGTCTGATGGCGGAAGNCAATGATG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))((((&""%#%%"##
- at 30BB2AAXX080903:3:37:1354:1363#0
-CTGGGGACTGAAGCACCCACCTCCTGTTCATGTTGATACACGGTGAGCAGAATATGGATGTGGGAGGTGTGTGNTN
-+
-67777788888888888888888877776555443222100//-.---,,++++**))*)'))(((%"&"#%#"$"
- at 30BB2AAXX080903:3:40:1436:495#0
-ACACAGGCTAGGGGGAGGGCAGTTGGAATTGATCCATGCCTTCTAGCTAGACTGTGGGTCCCCTCAGTCTTGGGCA
-+
-67777788888888388888/848777765555332-210,0/.-.-(,&+*)+')**&(((('(#'&$#&$%"#"
- at 30BB2AAXX080903:3:2:1482:1047#0
-TTTGGCACAGAATAATCCCGAGGGCTAAATGACATTGTTCCTACAGTGGGCACCTGAAGACAAGATCANCTCTCTC
-+
-67777788888888888(5888387.4765054132211.0*).,-"-,,+++*))'))))'&('&%'""$"#$""
- at 30BB2AAXX080903:3:50:636:1323#0
-GGTGGGCAGGTCACTTGAGGTCAGGAGTTCCAGACCAGCCTCGTCAACATGGCGACACCCTGTCTCTGCAGCACGG
-+
-677777888888888888888888777765$5443322000//..--,+-+++*+**)))))(((('"$#"$"##"
- at 30BB2AAXX080903:3:59:1629:55#0
-GTAATCCCAGCTACTTAGGAGGCTGAGGCAGGAGAATTCCTTGAACCCAGAAGGTGGAGGTTGCAGACACACCNNA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(('(''$$%%%#""$
- at 30BB2AAXX080903:3:39:1392:1551#0
-GGCAGATCACCTGAGGTCAGGAGTTCCAGACCAGCCGGGCCAACATGGTGAAATGTTGTGAGATCGGCACTCCCTC
-+
-67777788888888888288888,7/7.63*543%'(210/..().-,$,)++*#)(#)%)''(#%'"#$#""##$
- at 30BB2AAXX080903:3:40:910:769#0
-ACACACACACACACACACACACACACACATACACACAAACGCAAAAGCAGACTAAAACAGGAACTAATTAGACGAT
-+
-67777788888888888888888877776+55443.2110,/0.-++),+,(*+*')**(&')(%''"$&#%$"##
- at 30BB2AAXX080903:3:58:1402:1823#0
-GGGCAGGAAGACTATTTGAAGAAATGTGTTTGAAAGCTTCCCAAATTTCACTAAAAACAAATATATACATTACGCN
-+
-6777778888888888888888887777655544323211///..---,,+++**+)*)))()((''&"%$$$"""
- at 30BB2AAXX080903:3:3:1506:354#0
-CATCACCTACAATCTTACCAAAAATAGAACCAAGCACGTGTCCTAGTCAAACAGATCGGAAGAGCGGTNTATANAN
-+
-67777788888888888888888877776555443222100....--,,-+,+***(*)*)()('('%"""%#"#"
- at 30BB2AAXX080903:3:55:1172:1085#0
-TATGCAGTATCTGGCTTTCTGTGCCTGGATTATTTTACTCAGTATAATGTCCTCCCGGTTCATTCATGAGATCACA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((((&'%"%%$"#"
- at 30BB2AAXX080903:3:39:484:1224#0
-TGGGGGTGTTGTATAGCTTCAGTAATAGATCTGAATGAAGGCGGCCTAATCCTTCCTTGAGTAAACAGCTTAAATC
-+
-6777778888888888888888887777655544322.200//.-----,,,+*+*))))))(((((%$$&$%"""
- at 30BB2AAXX080903:3:43:759:622#0
-GCCTGTGCAGGCATTCTGCTGGGTCACAAAAAGAAAAAAAAAAAGCTGACTTTGCATGCATCCAGATTGAAAAGGG
-+
-67777788888888888888888877776555443222100//..-,-,,+,+****)))))((((''$%&$#"#"
- at 30BB2AAXX080903:3:46:179:1337#0
-GGTGGGGTAGCTCAGGATGCTGGTCCAGGTAGACAGGTGCTCCAATGCCTGAATTTCTGCCTGAGATCAAGCGAGG
-+
-67777788888888888888888877776555443222100//..---,,+++****))*)((('('&"""$$#"#
- at 30BB2AAXX080903:3:37:817:1511#0
-GAAAATTCCTCAAAGATCTAGAACCAGAAATGCCATTTGCCCCAGCAATCCCTTTACTGGATATATGACCACAGCN
-+
-6777778888888888,888888877776555(432.210///..--,-,+)+***))*))(((((($$%#"#"""
- at 30BB2AAXX080903:3:4:674:204#0
-CACGTGGATACATGGAGGGGAACAACACACACCAGGGCCTCTCAGCGGGAGAGGGGGAGGAGAACACANACCANCN
-+
-27377788888888888888,8)871436051(/3.2*01./,.-(-,,,&+++*+'*()')#''(#$"%&##"#"
- at 30BB2AAXX080903:3:33:598:321#0
-CAACACACACCAGGGCCTCTCAGGGGGACAGGGGTAGGAGACCATCAGGACAAACACATGGATACATNCTCGTCNN
-+
-677777888888888888888888777765554402221000/-/---,,++++****))))(((('"%"$"#%""
- at 30BB2AAXX080903:3:41:758:1171#0
-AAGGAGAAAGAGTATTTCCAAACTCATTTTAAAAGATCAGCATTATTGTTTTTTTTTTAAAGTGAAGTTCCCCTTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(((''&&&%%##$
- at 30BB2AAXX080903:3:50:754:114#0
-AGGGAGGTGCCCGCGCTGGGTCGGAGGAGCAGGAGTATGGAGGGAAGACTCCTGGGTGGCATGGAGCTGCTGCGCC
-+
-6777778488888888888888887777655542302210///.+--,,,++****%*)((((((''""###$##"
- at 30BB2AAXX080903:3:46:922:951#0
-CTAGGCACTGCCCAGCCCTGTGTCAGCCAGGGCTGAACACCCACAGGATAAGGAAGCCTGAGTGCGTACCTCTCCT
-+
---777788888888888808282/77772525443022*0./...(,,),+++***&*%('(%(((%%$$#$$##$
- at 30BB2AAXX080903:3:52:920:1172#0
-GAGCCAGACCACTTGGCTCCCTGGCTTCAGCCCCCTTTCCAGGAGAGAGAATGGTTCTGTCTTGTTGGTTGCCCCG
-+
-67777788888888888888888877776555443222200//-.--,,++++*****))())((('%$"""#"#"
- at 30BB2AAXX080903:3:33:488:391#0
-AGAGAGCAGCAGATCTCCCTGCACAGTATTCGAGCTCTGATAAGGGTCAGACTGCCTCCTCAAGTGGNACTTCANN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))'((('"%$#"$#""
- at 30BB2AAXX080903:3:4:1365:519#0
-GTCAGACTGCCTCCTCAAGTGGGTCCCTAACCCCCGTGTATCCTGACTGGGAGACACCTCCCAGTAGGNACACNGN
-+
-6777778888888888888888887777655144323220/././.---,+,++*)())()'((''#$"%%#$"""
- at 30BB2AAXX080903:3:3:1355:328#0
-AAATCAATAAACATAATTCATCATATAAATAGAACCAATGGCAAAAACCACATGCTTCTCTCAATAGANACACNCN
-+
-67777788888888888888888877776555443.22100./..---+,,++***)))())(((''%"#$%$"""
- at 30BB2AAXX080903:3:42:292:1971#0
-CACAGTGGTCCTTTTGTTCTTTGGTCCACCCATGTTTGTGTATACACGGCCACACCCTAATTCACAGATGGTCCAC
-+
-+7777788828888888888888877476055445222101//..---,,*++*)'**((')(('((%&%#"###"
- at 30BB2AAXX080903:3:58:334:753#0
-AGAATATGTATAAGTACAAATGGAATATGTTGGAAATGAGGAATAGTTAATATCACAGGTCATTTAAACACCTANA
-+
-67777788888888888888888877776555443222100./..---,-+,+****)*))))(((('&&&#"#"#
- at 30BB2AAXX080903:3:52:493:203#0
-CAGTCATGCACATCAGAAAATTAAATGGCGAGTCAAGACCAAATTCCTAGTCACAGTTATGTTCTGTTTCCCGGTC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((('''"$$$$#$$#
- at 30BB2AAXX080903:3:36:280:920#0
-TGGTGTATGTTGAAGCATACAGATTGTCTACATCCTAAAAATCATTTTGGTGAATAAAGGAAAATACTCACGCGCN
-+
-67777788888888888888888877776552433522011/.-..--,,+++***))))((((''#$$"$"#"#"
- at 30BB2AAXX080903:3:1:516:1108#0
-ATTTGAGGTCACTTAGTTTGCAGAAATTTGTTACAGCAGTAATAGAACAAGTGGTTATCCATATGAGTNCANTTAC
-+
-677777888888888888888888777765554432221.0//..--,,,+'+*'))*(((((((('$"#""""#"
- at 30BB2AAXX080903:3:55:382:1444#0
-CACACCTCAGAGATTCTGTACATGTTCTTCCTCCTGCCTAGAAAGGATCGTCCCTCCACTTTCGCCAGCTATCTCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''"&#%$$"$%
- at 30BB2AAXX080903:3:52:260:1286#0
-TGTTCAGCCACACTGCTTTGGTGTCACAACTGCACATTGGTTTCACAGCTGCAGGACAAGTTCGAGCACGTTAAAT
-+
-6777778888888888888882887777655544322210///..---,,+++****)))(((((''"$"&%$$#"
- at 30BB2AAXX080903:3:37:1165:1340#0
-TGGTGGGAGGTGAGCTTTTACCAAGTTCCACCACCCCCAAAGTGTGTGGGGTTGCGGGCCCTGGGCTNTCATCACN
-+
-67777788888888888888888877776555443222101/...---,,+++***))))()()(''"&&&$#"$"
- at 30BB2AAXX080903:3:35:588:449#0
-TCATGTCTCCTGACACCCAGTTGCCTCTACCACTCAGATGATGTCAGGCCCAGTCCCTCAGTGCCCTNACAGCANN
-+
-67777788888888888888888877776555443222101//..---+,,******))()')('('"$###$"""
- at 30BB2AAXX080903:3:50:542:52#0
-GTCCTCTGAACTCCTGTCAGTTGCAGCCCAAACACTCCAGAGCTCGGATACCAAGGAGCAGCTTCTGTACACCAGC
-+
-67777788888888888888888877776/+,44322200,/...--,,++++))*'*)')(#'('%""$"$#""$
- at 30BB2AAXX080903:3:44:1308:706#0
-GAAATAGACCGTCAGGCACTACGGGAACTGACACAGGTGGCGTCCGGCACTGCATCATACTAGATCGGCTCGTCCG
-+
-6777778888888888888888887777655334322110,/..'.-,,,,)+**)*())((((#''%"#%"""""
- at 30BB2AAXX080903:3:57:1344:1654#0
-TGAGGGAGGTGACCCGTGGGCAGCCCTGCTGTCGCCCACGCGAGCTGCTCATTCCATGCACATGGCCATGCACCAC
-+
-6777778888888888388833862747+55$24101,,0&/-,)+-+,+**+))##((''(#''&#"$#$"####
- at 30BB2AAXX080903:3:3:1418:1533#0
-TCCCCACTCTCACTCGGTCACCCACTCCTTGAACTTGAGATCGGTGTCGGTGGTGCTAAAGCCATCATNGGCANAC
-+
-67777788888888888888888877776555542022101//.--+,,+*++'*)(()(&#''#&%""""&$"##
- at 30BB2AAXX080903:3:43:1681:586#0
-CATCCGAGTATGTGTAGGAGGAGGACAGGGTGTGACCATAGACTGCCAAAAGCTGCAGGTGGATCGGGGGGGGGAG
-+
-67777788888888888888888877776565343222100//..---,,++++***))()()((('$%##"""#"
- at 30BB2AAXX080903:3:38:1253:755#0
-GCGACCTCCCAGGCCCAAGTCCCTGCCTACCTCCCAGCAGCCCGAGTGCGACCCTGTAGATCGGAAGCGCGCCGCG
-+
-677777888888888888888880777.655544332210///.,-)--,*)++))(*))'((('%'"""""$"#"
- at 30BB2AAXX080903:3:44:523:644#0
-CCACGCGGACAGAGGTCAGCGTGATCCCCTGCCTCAACAGGCCACCGTGAGGGGGGAACAGGATCGCAGTCGGGCG
-+
-67777788888888888888888877776555443222100/....-+,++,+**+()()))(((('&##%%$$""
- at 30BB2AAXX080903:3:56:391:186#0
-CTTGCCTCACACCGGCCCCTCCCACGCGGACAGAGGTCAGCGTGATCCCCTGCCTCAACAGGCCACCGTCTACCAC
-+
-677777888888888888888888777765554432/2100/..,---,,++++***()))))('('$%$"#"###
- at 30BB2AAXX080903:3:39:1589:255#0
-TCCGGTCGGTGGGCTCCTCCACGCCAAGGTTGGGCCTCCCGGCGACCGCCGCAAGACCGGAAGAGCGGATCAGACT
-+
-677772888.8888888888088871776$454412,101//./,-,+-+))#&*%#'&(''(''%%""""$"##"
- at 30BB2AAXX080903:3:53:658:868#0
-GCGGCCTTGGTCGGCCCACAGCTTCCTCAAGCCAAGCTCCCCAGGCCCAGGTCAGGCCTCACGGTGGCTCCTACAG
-+
-67777788883888888888888877776555443222100//.--.,,-++++**)))*))(((''%#"""#%##
- at 30BB2AAXX080903:3:42:1336:435#0
-TTGGGTCTCCAGGCCCGATTCCTGCCTCTCAACAACCTCTTTGGACTCAGTGCCTACCCATCTCCTGGCGGCCCCC
-+
-677777888888888888888888777765554232221010/..----,*++*****))))()('''&&&#"""#
- at 30BB2AAXX080903:3:42:1023:641#0
-GTAGACGCTGACAGGAGGCAGGAGCGGGGCATGGACAGGTCAACTTGAGGAGATTTTGGGCCTTCATAGGCCCAGC
-+
-6777778888808888888888*8377765/5443202.0,/.-)--,,-+*+(+*)(%*('(('&'%&"####"#
- at 30BB2AAXX080903:3:54:707:1524#0
-CAGGCATGAGCCACCATGCCTGGCCTGGGCTAGTCCCATATTCTCTAGAGTTCTCTTTACTCTGTGCTAGCCACCC
-+
-67777788888888888888888877776555443122100/...---,-,++***)*))))(((''""%#&$"$#
- at 30BB2AAXX080903:3:39:1503:787#0
-TACGAAAATTCCAAATGTTAGTTGGGCATAGTGGCAAGCACCTGTAGTCTCAGCCACGTGGGAGGGTTGTGACGCT
-+
-67777788888888888888888877776555443222100//.-----,+,+*)***()))(((#%"%#%#""$#
- at 30BB2AAXX080903:3:2:970:1734#0
-ACGCTGCTGCTCATCTGAGAAGGTGGAGCTCAGGCGGGAATGTGAGCAAAGGGGAGTGGCTGGGAAAANAGCACAC
-+
-6777778888888888888.888&77176555443222.0./-.---,,++++***())(()(%#%#""$#"#$##
- at 30BB2AAXX080903:3:44:1580:667#0
-AAAGAACTCATATTACTTTACTTGTCACATTTCAACATCTTTCCTCAGCTTATTAGCTCTATTTCTTTTCTGTCTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&'&&%&$$#
- at 30BB2AAXX080903:3:50:608:210#0
-ACGATGGAGCTGTGCCTGTGGAGGCTGGTGTGGGGCAGGAGGCTCATCTGCGGGGGCTGCCCCGGCGCCCGAGTCT
-+
-677777888888888888888888777*6545%43%,2..1/)#-+**&(+*+'**%#(&'%#(#%&""#"""##"
- at 30BB2AAXX080903:3:45:1267:1277#0
-ATAATCATGCCTCACTGCAGCCTTGACCTCCCAGGCTCAAACTTCAGCATTCCGAGTAGCTGGGACTACCGTTAGC
-+
-67777788888888888888888877776555443222100//..---,,+++++*()))))()(('""#"""""#
- at 30BB2AAXX080903:3:1:155:790#0
-TCAGCAAAGTGGGAATATTGTACAGTGTGTGTTGAAGTTCCTATACAACATTGTTTATCTAGTTTGGANTGNAGTC
-+
-6777778888888888888888887777655544322110,//.-'-,,,+)+***')#)()###('$""""####
- at 30BB2AAXX080903:3:35:28:1542#0
-AAAGTTCTTCTTGCTGTCAAAAGAATATGCGTGAATAAGTCATTTTTACTTATTCTTCTGTTTTTTTNTACTGCNN
-+
-67777788888888888,8888887/7765524532001*/./..-(,+,+*+*)*)))))())(%&""#$""#""
- at 30BB2AAXX080903:3:48:1531:1112#0
-TACCCTACGTCACGGCAGCCTTCGCAGAAGAGGCTAATGGCTCACAACACCCCCCCCAAGCACAACACGCGCTCTC
-+
-67777788888888888828'8)80377)5564$++(#(#)#*)'++$,$&)%&*'%'#(&&%'&&#&"$"""###
- at 30BB2AAXX080903:3:37:171:949#0
-GCTGTGCCTGTGGAGGCTGTTGTGAGGCAGGAGCCTCATCTGCGAAGGCTGGCGTGGCGTAGGGGGGCCCTGATCN
-+
-677777888888888888868888477005+11010,%/.--/.%.,-,(,&+***'(*##)(((##%%""##$$"
- at 30BB2AAXX080903:3:33:821:269#0
-CTTGTTTTCCTGCAACTGGATGTTCCCACCTGAGCGTGATGGGAGAAAGTGACAGATCAATAGGTATNACACTTNN
-+
-67777788888888888888882877776555443212100//...-,,+++++*)**)()))('('"$&###"""
- at 30BB2AAXX080903:3:2:1207:1193#0
-GGAATGTGAGCAAAGGGGAGTGGCTGTGAATACAGACGAAACTTACCCCACCCCCCCTCTCAGCACCANACACCTC
-+
-677777888888888888883388$7$&85,.$3/0/'&0&)).,.,,-(*$*+)#&#%'(###''%""$$###"#
- at 30BB2AAXX080903:3:51:246:835#0
-ACAGCAGGAGGTGAGCGGGGTCGAGTGAGGGAGTGAGGGAAGCTTCGTCTGTATTTACCGCCACTCCGCTGTACTC
-+
-6777778848888888885888857777645%4230221.0/'.-(-#,-+')***()#(')'&('%"##"#"#"#
- at 30BB2AAXX080903:3:42:632:166#0
-TCACCAACAGCCAAAGGCTTTATCAATCATGCTTGCATAATAAAGCCTCCATAAACACCCTGAAAGGGGTCGGCAC
-+
-67777788888888888-88888177776+5544322+0/0/0.-.-,,&)+*****)))()(((''&$##""#$"
- at 30BB2AAXX080903:3:36:113:1093#0
-GGCCAACACAACAAGACCCCATCTATACAAAAAATAAAAGAAACTAGCCAGATGTGGTGGGGGAGGGTGATACTGN
-+
-67777788888888888888888877776555443222100//..----,+++***)*))(('#((#""$$"$"#"
- at 30BB2AAXX080903:3:3:474:375#0
-AATGGTGCAGTCATAGCTCATTGCAGCCTTGATTGTCTGGGTTCCAGTGGTTCTCCCACCTCAGCCTCNCTCANCN
-+
-67777788888888883828888877456553443212100./,---,,-+,**()))'((((('&'&"&$&$"#"
- at 30BB2AAXX080903:3:42:876:1457#0
-CTGGAGTGCAGTGGTGCAATCAGGCTCACTGCAGCCTTGACCACCTGGGCTCAAGTAATAGATCGGAAGACTNCNC
-+
-67777788888888888888888877776555443122100//..---,,+,++**)*))))(((('&&$&$"#"#
- at 30BB2AAXX080903:3:42:318:823#0
-TAAGGAGTACACAACCTAGATCCCTCGCATGCACACTTCACAACAGAGTTTGTGCTCCTATGACAACCTAATGCTG
-+
-67777788888888888888888877776555443222100//..----,+++*****())(((((($&&%%%$##
- at 30BB2AAXX080903:3:3:160:1800#0
-ACCACCTGAGCTCCATGTCCTGTCAGATCAGCAGCAGCATTAGGTTGTCATAGGAGCACAAACTCTGTNGTGNNCT
-+
-677777888888888888888888/7/76/554422220./-/.,--++++)+*)))))')'('(''"""$#""##
- at 30BB2AAXX080903:3:47:1312:1872#0
-TGAGCCTGGCAGGTGGAGGCTGCAGTGAGCAGAGGTTGTGCCACTGTACTCCAGCCTGGGTGACAGAGTCCGTGTC
-+
-6777778888888888888888887777655544322200,-.-,---,-*+(+'***))((&#'(%$"#$%"""#
- at 30BB2AAXX080903:3:52:82:1955#0
-GGAACTAGCAGAGGCCAGGCATTGTGGCTCATGCCTGTAATCCCAGCAATTTGGGAAGCCTAGGCAGGACGGCACG
-+
-67777788888888888888888877776545413222100./.--,,+,++++*)))(()'(('''""##"""#"
- at 30BB2AAXX080903:3:40:721:346#0
-AGAGGAGAAAGAGTGTGCGTTCAAGGGGCAGATGAGGCTCAGTTGGACTCCATAGCAGATGAAATGGAGCGGGGTA
-+
-677777888888888888888&8877776555443222100/...--,-,+*+*****)))()((''$&#""""""
- at 30BB2AAXX080903:3:36:636:995#0
-GTATTTTTGATAGAGTCAGAGTTTCACCGTGTTGGCCAGGCTGGTCTCGAACTCCAGACTTCAGGTCGCGTGCCAN
-+
-6777778888888888888888887777655544322210.//...---,+++**)*)))(((((&&$%"""##""
- at 30BB2AAXX080903:3:1:83:1580#0
-GATCTCGTCTCTATGATAAAAAATTACCTGGACATGGTGGCACATGTCTGTAGTCCCAGCTACTTGGGNGCNCACA
-+
-677777888888888888888888777765544432221000/.-----,,++*+**)))()(((('""""""##$
- at 30BB2AAXX080903:3:49:1415:1092#0
-GCCCAGGCAGGGAAACCAGCACTATACAGACCTGAACAATGAAGATGGCACATTTTGTTCAGATCGGCACGGCTCA
-+
-67777788888888888888808877776555443222100/...---,,+++***))))))(((''$"$""#"##
- at 30BB2AAXX080903:3:41:862:1482#0
-CCACCCAGAGTAGTATGTAGAGGAGTCATTCAGGACCGTGCTCATACTTCATTGTATCAAATGGGAGATCCCTTTC
-+
-6777778888888888888888887777655544232200///..-,,,,,,++***()())()((&$%"&"""##
- at 30BB2AAXX080903:3:33:161:1240#0
-ATGAGCACGGTCCTGAATGACTCCTCTACATACTACTCTGGGTGGCTTGAAGTGAAAGATCGGAAGANTCTCACNN
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))((((''"$##$##""
- at 30BB2AAXX080903:3:49:1185:745#0
-CCCTACAAAAAAAGCACAAGACAGAATGTGAGCCAAGCAGCTTAGGGTTTAGGCAAGGCTTCTGCCTACACGCCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))(('('"#$%"#$#"
- at 30BB2AAXX080903:3:2:1543:2014#0
-AAGAAGCAGGCCCAGGCTGGGCGCAGTGGCTCATGCCTGTAATCCCAGCACTTTGGGAGATCGGAAGGNTGCNCTC
-+
-677777888888888888888883-7+765/5-&2/1*1&,+#,++&(++)&%&)))$(&##&'##%""%"#"#"$
- at 30BB2AAXX080903:3:44:1666:1166#0
-TGCCGTGGCTTGAGGGCAATGACGTGATCTCAGGTCACCACATTCTCTGCCTTCCAGGTTCAAGCAATTCTCTTGC
-+
-6777778888888818888888887777655544/2221/0//.----,,+++**))))())(((('%&%&&"#$$
- at 30BB2AAXX080903:3:36:1323:706#0
-CTTGAACCTGGAAGGCAGAGAATGTGGTGACCTGAGATCACGTCATTGCCCTCAAGATCGGAAGAGCGTNCTTCAN
-+
-67777788888888888888888877776555443222100//.,---,,++++)*))))))(((''$$"$"#%#"
- at 30BB2AAXX080903:3:49:40:1805#0
-CTGGAAGGCAGAGAATGTAGTGACCTGAGATGACGGCATTGCCCGCAAGAAACGGAAACAAGAAGACATATCGCTA
-+
-67777788888888888888888,7'776/5$44/022000+.+%+,+,(%*+**(&*%#((((%(#$"""$"#"#
- at 30BB2AAXX080903:3:47:999:1737#0
-TGCCTTAGCCTCCCAAGTCACTGGGATTACAGGTGCCCACCACCACACCAGGCTAATTTTTGTATTTTTAGCGGTG
-+
-6777778888888888888888887777655544321212///.,-.-,,+,++*(*)))(((((('"""##""""
- at 30BB2AAXX080903:3:33:1446:1159#0
-AGTTCGAGACCAGCCCAGCCAACATGGTGAAATGCCATCTATACAAAAAATACAAAAACTAGCCGGGNCATCTCNN
-+
-67777788888888888888888877736555443222100///.---,,+++***)))))(()(''"%"$$"#""
- at 30BB2AAXX080903:3:44:1695:922#0
-AAAAGTAGCTAGGGATTCCAACTAGGTGAGAAGGAGAGTGGGGCAGAGCCAGACCAGACAAGGACAGATCGGAACG
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*)(((('''"%&&"#"#
- at 30BB2AAXX080903:3:47:1571:861#0
-ACTGGCGTGCACTCCTCCCCCCCCTCAGGCAGTGGCATGAGTTCCATGTGAGCGCTGAGATCGGAAGAGAGCTATA
-+
-677777888888888*88888888(77765,5)430./1*0$++.,+,&-++(+(#*()('(((&'%$"""###"#
- at 30BB2AAXX080903:3:46:1273:785#0
-CACTGGCGTGCACTCCTCCCCCCCCTCAGGCAGTGGCATGAGTTCCATGTGAGCGCTGTCCTGCTCCATCTGCTAT
-+
-6777778888888888888888887777655541322210./....-,--+*+**)())((((((('""$%$#"""
- at 30BB2AAXX080903:3:41:251:1302#0
-TGAGGCAGGAGAATCACTTGAACCTGGGAGGTGCAGGTTGTAGTGTGGTGAGATCACGCCACTGCACGCCCGACCG
-+
-6777778888888888888888889777655241222010/./-.---,,,++*))))())((((('%&$%&$"#"
- at 30BB2AAXX080903:3:58:277:1811#0
-GAGACAGGGTTTCGCCATGTTGGGCAGGCTGGTCTTGAACTCCTGACCTCAGGTGATCCGACTGGCTCCGTGACNN
-+
-67717088888818/,8888083716770352.$//+,*&-+*,,(**++)))$''(''(''&('&&$&"""$$""
- at 30BB2AAXX080903:3:45:892:521#0
-TGGCCGGTTCTCCTAGCCCCATGGCTCTAGGGATGGAGGACGCTGCAGGAGATGCAGCGCTCACTTCCCCGCTGAG
-+
-6777778888888888888888887775655544322210///..-+-,+++)+*))()('(''&&&&"###"$"#
- at 30BB2AAXX080903:3:49:1133:1296#0
-TGGGAATGCCTACTGGTTACCTTGGTAACAGAGAACAAGGCATTTACCTGATATGAGTGTCTTGGTTCTCATCCTC
-+
-67777788888888888888888877776555443210100//..--,-,+++***)*))())((''&"%"#""#$
- at 30BB2AAXX080903:3:59:222:828#0
-ACACCCCACCTTACCTGGTTTCTTCCTGCCAGGGCCAATCTTCAGACCTCAGGACTTTACAGCCTATCCCACTNNC
-+
-67777788888888888888888877776555443220100//..---,,++++**)))))(()((('&&###""#
- at 30BB2AAXX080903:3:52:62:1203#0
-AGGCACTGCGCATCCATCCAGAGGGGCACTGCCTCAGGCTGCTCGCTGTTCACTGCCTTCTCAAGCAGGCCCTTGT
-+
-67777788888888888828888877776555443222100./..,,-)%*'***))&)(((#'&'%""#$$####
- at 30BB2AAXX080903:3:34:365:1159#0
-TTGGTAGCTGTGAACTCTCCATGCCTCAGGGACCTGCAGAACTGAGCTCTGTCTGAGCCAGGTTCCANTCCCTANN
-+
-6777778888888888888888887777655244322111/...--,,,,)+***)*(()))'('''""$##"#""
- at 30BB2AAXX080903:3:44:1376:1446#0
-TTTGAGATGGAGTCTTTCTATTGTCACCCAGGCTAGAGTGCAGTGGCGTGATCTTCGCTCACTGCAACTACCACCC
-+
-67777788888888888888888877776055243222$0,).#--"-)-+''(#()'((&'#'(##%"""%"#"$
- at 30BB2AAXX080903:3:50:1603:38#0
-TTGATGAACATAGAAGTACTGTATGTAGAATTGACCCAGTGCTGCCCTGGCAACTTTGTAGATCGGACACGACCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$"$""#""#
- at 30BB2AAXX080903:3:36:1529:604#0
-ATTTCAGGTCACTGTTGGCCTTAGAAGAAGAGCCCAAAGGCAACAAGCAAAGGCGCTGGAGATCGGCGGCCCCCNN
-+
-67777788888888888888888877776555443222100//..---,,++++***))())((((#$#$#$##""
- at 30BB2AAXX080903:3:53:310:2026#0
-AAATACAGCGTCCTTTACAAAAGCAGTTTTGTCTTTCAAAGCGCATAGATAAGGCACTCAAGTAAATCCGTCNGCT
-+
-67777788888888888888888897776555343112020./,----,,,,+**#()))(((('''$"##"""##
- at 30BB2AAXX080903:3:3:1210:143#0
-CTTGAACCCGGGAGGCAGAGGTTGCACTGTGAAAAGATCACACCACAGCACCACAGTGCGTGCGACGCNACACNAN
-+
-677777888888882,88,,%8*2(7/;6$+')&3,2*$*&/+&,-&$$,)$#$###&#(#'#&##%$"$&"#"""
- at 30BB2AAXX080903:3:49:1671:1599#0
-CCCAGCTACTTGAACCCAAAGGTTCAAGGCTCCAGTGAGCTATGATCCCACCACAGCATTCCAGCCTGCGCTCTCA
-+
-67777788888888888888888877776555443222120...-.,,+,+*+***))))((()'('$#%###"##
- at 30BB2AAXX080903:3:35:811:1022#0
-ATGCGCGCTCCTGGAAGAACCAGCAGCCCCCACCGCGAGTTCTGATTGGCCCTGCGTGAGTGGTAGTNCGCCTCCN
-+
-6777778888888888888888887777155244322-1000/..+-+,,+,****%)()()(#'(%"%"&$#"#"
- at 30BB2AAXX080903:3:57:881:338#0
-CGCAGAGTCTGGCCCTTGCTGCGCCCGGCGCCGAAGACCGGGAAGTCGTAAAGCTCCTCCTCGCGGCCTGTGTCTC
-+
-6777778888888888888888887757655541122-/00/+..'--%,+++***)(*)()(#(('$&"%%"$##
- at 30BB2AAXX080903:3:42:1438:281#0
-TGAGACCAGCCTGCAGTGAGCCGAGATTGCACCACTGCACTCCAGCCTGGGAGACAGAGTGAGACTCCATGGATCG
-+
-67777788888888888888888877776555443222101/./..-,,,+*+**))()'*)(((''&$%"%##"#
- at 30BB2AAXX080903:3:56:879:710#0
-TCGGCTCACTGCAACCTCCACCTCCTGAGTTCAAGCGATTCTCCTGCCTCAGCCTGCCAAGATCGGACGGTCCTCT
-+
-67777738888888388888888877736)55443020101//---,,+,,++**(#*)((('((''"&"#$#%"$
- at 30BB2AAXX080903:3:33:687:808#0
-AGCCTACTCCAGGCCAGAACTGTTCACGTGCCTCCTCTCTGCTCGTGTCCTATATATTACCTAGCAGNCACTAANN
-+
-67777738888888888888888877776550443222100//..---,)++++****))))()(('"%##"""""
- at 30BB2AAXX080903:3:49:1285:1095#0
-CAATCTTTTCCAAACTCAAGGGAACTAAAGAGGCATGAAATCTAAATGCTTAATTCTGGATTTCATCTCTCGTCTA
-+
-67777788888888888888888877776555423222100./..----,+++***))**)(()(('%#$####"#
- at 30BB2AAXX080903:3:57:1680:1669#0
-TTGCATTCCATTCCATCCCATTCCATTCCGTTCCATTCCATTCCATTACATTCCAATATCGTAAGACAAAACACAA
-+
-6770*78/-288.).8()).88**-87+(/01&$(11*&*/-'#%-+'$(+*#$#'#'(######%#""#%%$%$#
- at 30BB2AAXX080903:3:47:403:759#0
-GACACAAATGGAACCAAATGGAATGGAATGGACTCGAATGGAATACAATGGAATTTAATGGAATGGACTCTCATGA
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))))('''$%&%###$"
- at 30BB2AAXX080903:3:51:696:858#0
-TTCTATTCCATTCGAGTCCATTCCATTGCATTCCATACCATTCGAGCCTATTCCGTTCTATAGATCGGGTGATCGT
-+
-677777888888888888888888777765554432221/0//..-,,-,+*++**)*)))))(((%"""#""##"
- at 30BB2AAXX080903:3:8:1105:543#0
-GGAATGGTATGGAATAGAATGGAATGGAATGAAATGGAATATAATGGAATGGAATGGAATGGAATGGNTAGCGTNN
-+
-67777788888888888888888877776555543220100//..---,,+,++**)*())((((('""""#""""
- at 30BB2AAXX080903:3:44:1325:1215#0
-TCCATTCCATTCGAGTCCGTTCCATTCCATTCCATTCCATTCCTTTCCATTAGATCGGAAGAGCGGTTCCGCTGTA
-+
-6-+,7084,43882./.48823)2711*57.+)1+0,,00)*&+,+"*+(+)%))##(##%#(&#%#"##$"""""
- at 30BB2AAXX080903:3:34:1049:1521#0
-CAATGGAATCGACCCGAATGGAATGGAATGGAATGGAATGGAATGGAATGCAAGGGAATCGAATGGGNGTACTTNN
-+
-07777788888888888888880877776552443222100./(.---,,+++%**)()'))&('(&""$"%%"""
- at 30BB2AAXX080903:3:46:1548:427#0
-CATTCGAGACCATTCCATTGTATTCCATTCCAATCCTTTCGAGTCCATTCCATTCCATTCCATCTGAAGATCTGTT
-+
-67777788888888888888888877776555443222100//..----,+++***)*)))(()(('$$"""""""
- at 30BB2AAXX080903:3:51:1655:1952#0
-GAGTCCATTCCATTGCAGTCCATTCCATTCGAGTCCATTACATTCCATTCCATTCGATATCTTTCACACCCCCAAC
-+
-67777788888888888888888877776555443022100//.-.--,,+++*+*))))(((((#'&"""%$$%$
- at 30BB2AAXX080903:3:33:1648:1554#0
-GAATGGAATGGAATGTAATGGACTCGAATGGAATGGACTGCAATGGAATGGACTCGAGTGGAATTGANACGTGCNN
-+
-67777788888888888888888877776555443222100//..--,,,,++***)*)))((((('"$#"#"#""
- at 30BB2AAXX080903:3:59:912:629#0
-ATCGAATGGAATGGAATGGAATCGAATGGAATGGAATGCAATGGAATGGATTCAACTTGAATGGAATGGCAGCTAC
-+
-67777788888888888888888877776555443222000//..---,,,++**)**))))((((''$%&"""#$
- at 30BB2AAXX080903:3:57:751:206#0
-TCCATTCCATTCCATTCCATTCCAGTCCTTTCCATTCCATTCCACTCGGGTTAATTCCATTCTATTAGTGTCCAGC
-+
-67777788888888888888888877776555443222100//-..--,-)++****)()))(((('&$%$%$#"#
- at 30BB2AAXX080903:3:60:912:688#0
-TCCATTCCATTCCATTCCATTCCGTTCCATTCCATTCCATTCCATTCTATTCTGGTTAATTCCATTCTGTTNTANN
-+
-+77777888888888888588888777765554833010.0/.-.---+,,++)****&))((((''&%$%"%$""
- at 30BB2AAXX080903:3:43:993:1371#0
-TTCCATTCCATTCCATTCCGTTCCGTTCAATTCCATTCCATTCCATTCTATTCGGGTTAATTCCATTAGATCGGAC
-+
-67777788888888888888888877776455443222110//.-----,+++*****))))((('''$$&$%#""
- at 30BB2AAXX080903:3:44:1178:214#0
-TTCCATTCCATTCCATTCCGTTCCGTTCCATTCCATTCCATTCCATTCTATTCGGGTTAATTCCATTCCATTCCTT
-+
-67777788888888888888888877476415443222101./.,-,-,,+++*+*))*))))('('&#"&$%%#$
- at 30BB2AAXX080903:3:39:400:995#0
-CATTCCATTCCATTCCATTCCGTTCCGTTCCATTCCATTCCATTCCTTTCTATTCGGGTTAATTCCACTCTATTCC
-+
-6777778888888888888888887777655544322210.0/...--,,++++*+**)))()((''$'&&#%$#"
- at 30BB2AAXX080903:3:50:657:2028#0
-CATTCCATTCCATTCCATTCCGTTCCGTTCCATTCCATTCCATTCCATTCTATTCGGGTTAATTCCATCACTGCCC
-+
-677777888888888888888888727;6555442./210////.,--,,+,+***())*((((&'&"$"#""##"
- at 30BB2AAXX080903:3:59:1265:812#0
-TCATTCCATTCCATTCCATTCAATTCCATTCCGTTCCATTCCATTCCATTACATTCGGATTGATTCTANTCCACAC
-+
-67777788888888888888888877776555443222110//.----,,+,+**)))*))(((((&&"%$%#$$#
- at 30BB2AAXX080903:3:48:351:1053#0
-TTTCATTCCATTCCATTCCATTTCATTCCATTCCATTCCATTCGCTTCCATTCCATTCGTGTCCATTCCACTACAT
-+
-67777788888888888888888877776555423222100/..----,,+++*+***)))((((('%$"$%#$#"
- at 30BB2AAXX080903:3:54:1222:227#0
-AATGGAATTAACCCGAATAGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAACGGAGGTGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(('('$$$#$$%##
- at 30BB2AAXX080903:3:39:1420:1343#0
-ATGGAATTAACCCGAATAGAATGGAATGGAATGGAATGGAATGGAACGGAACGGAATGGAATGGAATGGATTGGCA
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((((('"%$"#$"#"
- at 30BB2AAXX080903:3:49:821:672#0
-ATGGAATTAACCCGAATAGAATGGAATGGAATGGAATGGAACGGAACGGAATGGAATGGAATGGAATGGTGGGGAG
-+
-677777888888888888888888777765554432221000/.--.-,,+++****))))(((('''##"#""""
- at 30BB2AAXX080903:3:34:280:817#0
-GGAATTAACCCGAATAGAATGGAATGGAATGGAATGGAACGGAATGGAATGGAATGGAATGGAATCANCTATCANN
-+
-67777788888888888888888877776555443222100/...--,,,++****)*)*)((((''"%"""$#""
- at 30BB2AAXX080903:3:48:16:1113#0
-AACCCGAATGGAATGGAATCGAACGGAATGGAATGGAATGGAATGGAATGGAATGGAATGAGATTCGCACCGCCAC
-+
-67777788888888888888888877076555443222000-/..-,,,,+)+***))*)))''#&''&%#"$#""
- at 30BB2AAXX080903:3:50:1555:334#0
-CGAATGGAATGGAATCGAATGGATTGGAATGAAATCGAATGGAACGGAATAGAATAGACTCGAATGTACTGGCGTC
-+
-67777788888888888888888877776555443222100/..---+-,+++***))))))'(((%$"#"""""#
- at 30BB2AAXX080903:3:2:192:240#0
-AATGGAATGGAATGGAATGGATTCGAATGGAATCGAATGGAACAATATGGAATGGTACCGAATGGAACNCAANNCA
-+
-6777778888888888888888887777655544322210//-..----,,,+***)))))))('('$"$$$""##
- at 30BB2AAXX080903:3:1:1473:728#0
-ATTGCATTCGATTCCATTCCATTCCATTCGATTCCATTCCATTACATTCCAGTCCATTCCAGTACATTNCTNTCCA
-+
-6777778888888888888'888837%76555-/02120(.//.----,&++%*'))*%(#'('(''&"%#""##"
- at 30BB2AAXX080903:3:57:904:835#0
-ATTCCATTCCATTCCATTCCATTTCATTCCATTCGATTCCATTCCATTCCACTAAATTCCATTACATTCCACTCCC
-+
-67777788888888888884888877776555443222010//.------+,+***)*))))(((('&%%"$"###
- at 30BB2AAXX080903:3:37:934:1167#0
-GAATGGAATGGAATGGAATTGAAATGAATGGAATGGAATCGAATGGAATGGACTGGAATGGAATGGAACCGCTTCN
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))(((('&$$$#"""#"
- at 30BB2AAXX080903:3:33:1272:1848#0
-AATGGAATGGACTTGAAAGGAATGGAATGGACTCAAATGGAATGGAATGGAATGGAATGGAATGGAANTCTCGCNN
-+
-6777778888888888888888887777655(44522210///..-,-,,++****)*))))(((('"%%"$"#""
- at 30BB2AAXX080903:3:44:337:904#0
-TTCCATTCCATTCCATTCCATTCCATTCCATTTCGTTCCATTCCATTCTATTCGGTACCATTCCATTCCATTCCAT
-+
-677777888888888888888888777765554432221/0//..--,,,++++***)()))(((('&&%%&%$#%
- at 30BB2AAXX080903:3:42:1397:1971#0
-GAATGGAATGGAAGCGAATGGAATGGAATGGAATGAAATGGAATGGAATGGAATGAAATGGAATGGAAACGAATAA
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*))))((((''#"&"%$""
- at 30BB2AAXX080903:3:49:1324:1312#0
-CGAGTCCATTCCATTCCATTGCATTCCATTCCATTCCGTTCCATTTGATTCCAATCCGTTCGATTCCACGANCTNC
-+
-67777788888888888888888877776555443222100//..---,,+)+***))))))((('%$$""""""#
- at 30BB2AAXX080903:3:36:1037:1830#0
-CATTCGAGTCGAAACCATTCCATTCCATTCCATTCCATTCCATTCCATGCCAATCCATTGCACACGGGCTCACTNN
-+
-6777778888888%88888888884777*5554/2+2-10//-.,---,,+,++)))')('((('(#"#$""#"""
- at 30BB2AAXX080903:3:33:1525:1009#0
-CGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAACGGACATGAATGGNCTCACTNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()((''"""##$"""
- at 30BB2AAXX080903:3:54:1169:1071#0
-TGGAAAGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGATTGAACCCGAATGAAATGGAAAGGGCTGTCAT
-+
-67777788888888888888888877776555443222100//..---,,,+++**)*)))((((('%""&&"###
- at 30BB2AAXX080903:3:43:1280:1724#0
-GGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGGTTCAACTCGAATGGAATGGAAAGGAGTGGCATC
-+
-67777788888888888888888877776555443222100//..----,,+++**)))))(((('&'"%%&"#""
- at 30BB2AAXX080903:3:48:183:1192#0
-GGAATGGAATGGCATGGAATGGAATGCAATGGAATGGACTCGAATGGAATGGAAAGGAATGGACCCGNCTGACACG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((&""#%"$###
- at 30BB2AAXX080903:3:3:62:194#0
-TAACCACCGACCTTTTCTCCTCTGCCCTCCACTCACACTCTGCTCCATCACCCTCAGCCACACAGCTANCGCTNCN
-+
-67777788888888888852888877174555413220100...-+-,&,***+*))(()'((((#'$"#"$""""
- at 30BB2AAXX080903:3:4:1448:1688#0
-CGGCTCACTGCAACCTCTGCTTCCTGGGTTCAAGCGATTCTCCAGCCTCAGCTTCCCGAGCAGCTCACNACATNGN
-+
-6777778888888888888,88887777(555.4222211///.---,-,**')*))(((((('&#%"""%#""""
- at 30BB2AAXX080903:3:47:1765:1261#0
-TGATCTGGCTGCCTCGGCCTCCCAAAGTGCTGGGATTGCAGGCGTTAGCCACCATAGATCGGAAGAGCACTGCGCT
-+
-677777888888888888888888777765554432221/0//..---,,+****)**)())(((('"""#""###
- at 30BB2AAXX080903:3:4:1279:1169#0
-AAGCTGGAAACCATTATTCTCAGCAAACTAACACGAGAACAGAAAACCAAACACCACATGTTCTTATTNATACNCN
-+
-67777788888888888888888877776555443220100//.--,,,,+++*))))))((()(('"""$$$"""
- at 30BB2AAXX080903:3:35:1255:1788#0
-TCCCAACACTTTGGGAGGCCGAGGCAGGTGGATTACTTGAGGTCAGGAGTTCAAGACCAGCCTGGCCNTCATTGCN
-+
-67777788888888888888888877773551243222100/.-/---,++*++**(**)(((((&'""%%$%%""
- at 30BB2AAXX080903:3:3:170:1262#0
-GTTTCAACTAGATATTTGTAACACCTACATCCTTACAATGCAGTTAATCAGATGATTTATGTATTTTGNATTTNTT
-+
-67777788888888888888888877776555443221100./...---,+++****))))))(('&""#&""""#
- at 30BB2AAXX080903:3:58:604:211#0
-TAAGCACCAGTTTTTTTGGTGTTTTGGGTTCTTGGCATCCGTGCTCCCAGCCTGAAAGCTGCCCGTGGTCGGANNT
-+
-67777788888888888888888877776555443222100//..---,,+++***()))*)((''(&%%$##"""
- at 30BB2AAXX080903:3:55:1653:659#0
-GACAAGCAGCAGGCACTTGCTCTATACCAGGTGAGGGTGTGGAGACATGACGTGGTGCAGGAGATCCACCTCCTCC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((((&&'#"%#"#%
- at 30BB2AAXX080903:3:48:1748:1106#0
-CTGCCCTCCAAAACACGCCACAGGGAGGACACATTCCCATCAGCATCAGGGGTTCATGCTAACACAGACGCACGCC
-+
-67777788888888888888888877776555443222100//.--.,,,++)+***)))()(((('$$"$"""##
- at 30BB2AAXX080903:3:3:277:575#0
-ACCATACATCCCACAGACCAATGTGTGCATAAATACATGCACAACCATACATACACACCATACATACCNTCACNCA
-+
-67777788888888888828888877776555843222100./.,,.,,,+++**)))())('((('$"$%$%"#%
- at 30BB2AAXX080903:3:46:1741:319#0
-ATACCACATGCACATGCAAGCACACACAATGGAGAATCACTGCCTCAAAAGCTCCTAGATCGGAAGAGCGTCATCG
-+
-67777788888888888888888877776555443222100//..---,,+'****))*))()(((($&%"#""#"
- at 30BB2AAXX080903:3:40:234:1345#0
-AAACATATCAAAGGAAAAGCACAAATACAATGTTCTCCAGAAATAGTGTCGCAGAAATAAAGACAGACTATGGAAC
-+
-67777788888888888888888877776555443221100//..---,,+++**))))*)(((('&"$%%%%$#"
- at 30BB2AAXX080903:3:1:9:362#0
-CTTTAAGACGGCGTTTCCCTTCTGCCAGATTGCACTCTGTGCACAGTGCAGTTGCTTCTCCCTGCGGCNCTNCACT
-+
-67777788888888888888880857774553082222100//..-+-,-+,++'+*()((((('''$"#""###"
- at 30BB2AAXX080903:3:48:14:1740#0
-TGAGTTAATTTTTGTATATGGTGAAAGGTAGGGGTCTGGCTTCAGTCTTCTGTATGTGGATAGCCAGACAGCGCAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))'))(((('"$#"$##"$
- at 30BB2AAXX080903:3:48:101:663#0
-ATGGGAACCACACATGTAAACACTGAGGTGCCCTGCCACGCCAGTGAAGTGCATGCTGCTCGAGATCNTCACAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()((('""$#$""##
- at 30BB2AAXX080903:3:1:1054:894#0
-AGCATGGGAACCACACATGTAAACACTGAGGTGCCCTGCCACGCCAGTGAAGTGCATGCTGCTCGTGTNACNTGTC
-+
-2777778888888888888888887777/55.4432220/.///-,,+-,++(+'*)*)))'('(('&""$""""#
- at 30BB2AAXX080903:3:54:1240:1096#0
-TGCAGCTGAGATGGCTGCTCCCCGGTGGGGTGTGTGCTCGGCCTGCAGTCCCCGCCCTCCGGACTCCGNGCGCCAC
-+
-67777788888888888&88888877776555243201100+./.-,-+(+**))))')(((&('('%""#"####
- at 30BB2AAXX080903:3:4:80:2016#0
-CTTGTAGGTCACGCAGTCCAGGGATGCAAAATTAGAAGACAATGACGAGGTGCAAACCTGAGAGCGGCNTCACNAN
-+
-6777778888888888888888817773)3,542323200./-.---,,,&++)*)((((()(((''$"#%$$"""
- at 30BB2AAXX080903:3:50:623:175#0
-GTGTAGACAGGGTAGTTCTGCTGTATAGGCAGGGAAAATAAACAGGGGGGGGTCTTTTGGGGGTCCACACCGCTCC
-+
-63777788888888888808878,767765,544-0%20/,-&,,--,,,&(#$*)**(#)&###%#$"$$"#"##
- at 30BB2AAXX080903:3:1:1446:870#0
-CTTGCCTGTCCAGCAGATCCACTCTGTCTACACTAACTGCCTGCCCAGCAGATCCACCCTGTCTATACNACNCATC
-+
-6777778888888888888888887777654544322111/./--&(,,+++))**())()%((&''&""%"###"
- at 30BB2AAXX080903:3:1:1329:683#0
-AGGGAGGTAGTGTAGACAGGGTGGACCTGCTGGATGGGCAGGGAGTATAGACAGGGGGGGTCTGCTAANCCNACGT
-+
-67777788888888888888888896636755461222.*0/#.-$+,+++(****'()####(###""#%""$""
- at 30BB2AAXX080903:3:3:1563:415#0
-AGAAGATCCACCCTGTCTACACTACCTTCCTTGCCAGTAATGCACGCTATCTACACTATCTGCCTGACNCCTANCN
-+
-67777788888888888888828877776355423220100/..,-+--,+++)*#**)(((''(('$"#""%"""
- at 30BB2AAXX080903:3:51:838:1846#0
-GTGGATCTGCTAGCCAGGCAGATAGTGTAGATAGCGTGCATTACTGGCAAGGAAGGTAGTGTAGACAGGTGGCGCA
-+
-67777788888888888888888877776555442222000//..---,-++++**&*)()'(((##"""####"#
- at 30BB2AAXX080903:3:3:745:1796#0
-ACTACCTGCCTGCTCAGCAGATCCACCCTGTCTATACTAACTGCCTGGCCAGCAGATCCACGCTGTCCNCACNNCG
-+
-67777788888888888888888877756503311.02././.-.(,++-+**))(#)())((''%&""#"%""##
- at 30BB2AAXX080903:3:45:1752:49#0
-TAGACAGGGTGCATCTGCTCGACAGTTAGGTAGTATAGACAGGGTGGATCTGCTGGACAGGCAGGGACACAGCCCT
-+
-6777778888888888888888887777655544322210///.%---+,,+++**))())(&((##$"#""#"#"
- at 30BB2AAXX080903:3:53:490:1603#0
-ACCTGCCTATCCTGCAGGTCCACCTTGTCTACACTACCTGCCTGCCCAGCAGATCCACCCTGTCTACACGACCTCC
-+
-67777788888888888888888877776555443222100//..--,,-++++*+**)*)()((('&&#&$&$"%
- at 30BB2AAXX080903:3:42:63:347#0
-GGCAGGTAGTGTAGACAGGGTGGATCTGCTGGGCAGGCAGGTAGTGTAGACAAGGGGGGCCTGCAGGAGCCACCAT
-+
-67777788888888888888088877776555443222100-/.----,,+)+**)))(')')('(&$"$""##""
- at 30BB2AAXX080903:3:54:1652:795#0
-CAGTAGATCCATGCTATCTACACTACCTGCCTGGCCGGCAGATCCACTCTGTCTACACTGCCTGCACACCAAAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((('(#%%%%&&%#"
- at 30BB2AAXX080903:3:52:1348:912#0
-ATATCCTCATTGAGTTTTAAAATTTATTTACATGGGTCTACAAATTTATTTCAAATCGTAGTCAAGATCGGAATAG
-+
-67777788888888888888888877776555443222100//..---,,+,+***()*))))((('"%&$""#$"
- at 30BB2AAXX080903:3:45:1412:902#0
-AAGGGAAGGCTATGGGTGAGTTGGGAAATGTGTTAGGCAGGGTCAGAGATTACCACATCCTAAGATCGGCGGGAGC
-+
-67777788888888888888888877776555443222100/).,-,-,,,+***))(()((((((&"&##"#"#"
- at 30BB2AAXX080903:3:51:263:649#0
-ATTCTGTCCTCCATATCTCTGCTGATTCCCATTTTGTCTATTTCCATTTACCCCACTACTGCTTGCTACTCTACAT
-+
-67777788888888888888888837776525443211100///-,--,,+*++*+*()))))((''"$"#""##"
- at 30BB2AAXX080903:3:55:458:1928#0
-CCATATCTCTGCTGATTCCCATTTTGTCTATTTCCATTTACCCCACTACTGCTTGCTCAGGTCACTCTTCTGCGCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))))(('&$$&$$##$
- at 30BB2AAXX080903:3:39:1734:535#0
-AATCGCCTCCCACTAGCGGTGACTGTTGGGTGTCTACCCTCCCGGAGTCCTCCTGAGATCGGAACAGCGTGTGTCT
-+
-677777488888888888838888777765253(*.2*+/1...-+-)-,&%+%+(%)('((''#%'&$$"&#%##
- at 30BB2AAXX080903:3:54:1563:87#0
-AAGGGTTGGGACTCTGCTTCCCAGATGGTACCTTGTGGCTGGGGCCTCACGCGGCAGGAGGGGGAAGCACAGAACA
-+
-67777788888888888888888877776555443222100//(*,,,,,++)*'&))&))')''#'$%%%"%#$$
- at 30BB2AAXX080903:3:4:1598:961#0
-TGGGAAGCAGAGTCCCAACCCTTGCCAGACACTGAGCCCACTGGTGCTTTATCTTGGACTCCCAGCCCNTCACNTN
-+
-6777778888888888888888887777655544322110///.,.--,,++)***)()(((('('#$"#"#$"""
- at 30BB2AAXX080903:3:40:661:1840#0
-TGCAGTGGCGTGATCTTGGCTCACTGCAGCCTCCACCTTAGAGCAATCCTCTTGCCTCCTCCTCCCGCCATATTCA
-+
-677777888888888888888888777765554432+,1/0//----*,,++++***)))(((('(("""""%##"
- at 30BB2AAXX080903:3:55:1134:126#0
-CACCTTGGCCCTGCTCGTGGTCCTGCTGTGGGGCACTGGTCAGGTGAGGGTGGGGGGTCTGCAGAGCCGCCGGCAA
-+
-677777888888888888888888777735554421221-0//.)---,+&++**)#))))('((#%"&##""$"#
- at 30BB2AAXX080903:3:2:606:1744#0
-CTGAGGACAAGCACAGGCTGAAGCAGGGGAGCCCTAGTCCTCTCAGTTGCAACTTCCTGGAACGGTGTNTCTTCAA
-+
-6777778888888888888888884777635544122//0.0.--.$,-+**)&((((&)'((((&'$"#$#"#"#
- at 30BB2AAXX080903:3:41:1024:24#0
-TGCCACACCTGGGATGGGGCTCCCACCCTCTGAGGACAAGCACAGGCTGAAGCAGGGGAGCCCCAGTCCTCTCACT
-+
-677777888888888888888888.7770525143012./1..-,-,+-+)++***))&('('#'&#%$%&$$"##
- at 30BB2AAXX080903:3:47:1021:565#0
-CCAGAGCGACACCCTTGCTGCATGAGCCAGTAGCTGGGTGGGCATGGTAGCCTCTTGTCTTCCTAGCTTGCTACCA
-+
-67777788888888888888888877776555443222000//..--,,,,++***)))))))((('$$"#""#""
- at 30BB2AAXX080903:3:55:1356:699#0
-GCTCTGATATTGCTCCTCAGAGGGCACAGCCTTGGACTAGCACACAGTCTCTCCGACCACCTGTGGTATCAGAACA
-+
-67777788888888888888888877776555443222100//..---,,+++**+)*))())(('''&$"$$$$$
- at 30BB2AAXX080903:3:36:1646:1470#0
-GACGCACACACCTGGACGCACACACCTAGACAAACACACCTGGACACACACACCTAGACACACACACTCACACCNN
-+
-67777788888888888888888877776555443222101//-.----,++++*****)))()(('"$%&%$#""
- at 30BB2AAXX080903:3:47:276:804#0
-AGGTGGACATGACCTCAAGCTCCTGGGCCCGTTGCCTGGGATGCATCCCAAGGCACGCACCAGGACCGAAGAGGAC
-+
-677+774888888888888883880774635.24"1-.10)+.*-,,,,++****()()('(((&'&$""""""##
- at 30BB2AAXX080903:3:46:234:1718#0
-GGAGACCTGTGGCTCTGGGAGCCCTTAGGTGGGAGGAAGGATCAGTGTCTCTTCCAGTTAGGTTTGAGGGGGGGGG
-+
-6777778888888888888884'87777645544321110-.,/.,-*+-+++$*(*'*()(#((%%"$""""#""
- at 30BB2AAXX080903:3:48:1600:567#0
-CTCTCTCCTTGGCGTGCAGATGCCATCCTCTGTGTCCTCACACGATCGTCCCTCTGTATGTGAGATCGGCTNACTC
-+
-67777788888888888888888877776555443222100//.-----,,++******))((((''&$##""###
- at 30BB2AAXX080903:3:37:1240:1356#0
-GATGTATCCAAGACATTTTCCCTGTTTCAGGTCATTACTCATCTTGCGCAGCCACTGAGCAAAGCGGGTCCTGCAN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))((''"&%$$%"$"
- at 30BB2AAXX080903:3:58:821:673#0
-GAGGAAGAAGCCGAGCGCGATTCTCCAACACACTGGGGTAAGTACTGGCTGGCCTATGTCCTGGGTCGTCCCAACA
-+
-67777788888888888888888877776555443222000//..---,,++'+'))*)')((('#''%##%"#$%
- at 30BB2AAXX080903:3:8:973:854#0
-TACTTAGGAGGCTGAGGTGGGAGGATCCCTTGAGCCCAGGAGTTCAAGTCTAGCCTGGGCAACATAANACACACNN
-+
-677777888888888888888888777765554402.010//+--.+-+,,++*))**)()''('(&"$$$&$#""
- at 30BB2AAXX080903:3:34:1467:1720#0
-ACTTTGGGAGGCCGAGGCGGGCAGATCACTTGAGGTCAGGAGTTCGATCGGAAGAGCGGGTCAGCAGNCACTGTNN
-+
-67777780888888888.88838847101/51-32,)-/10/,.',*+*++('*)*#)(#'%#(#''"&"$"""""
- at 30BB2AAXX080903:3:57:784:1586#0
-ATCCTCTAGGCCTCTGTAAGCTTCTAGAAGGAAGAAGTTACGTCCTTTAGAGTAATAAAATTCCTCAGATCTCGCT
-+
-67777788888888888888&.*8677765534432%21/&/...-+-,,&***+)))))(((&('''&%&##"#"
- at 30BB2AAXX080903:3:46:658:1178#0
-TTAGTCTGCTCTGGAAAGCAAGATGTGTGCAGATGAGTGACGCAGTGCATCGTGTGGATGCAAAGGGATCTAGCCC
-+
-67777788888888888888888877776555443222100//..----,,++***))))()(('('""#""""#"
- at 30BB2AAXX080903:3:59:979:1032#0
-AGCTCCCCTGGGCTTCACATGGCCATGGAGCACCCAGCAAGTGTAGGCTCTGAGCCTTCAGGGAGGGGGGNAACCA
-+
-67777788888888888888888877776555442222000-/-----,,,+****))*)))((((''"#"$###$
- at 30BB2AAXX080903:3:56:1003:1204#0
-CACATATACACCTGTGTGCATGTGTACATGGTATTTAAGCATGTTTGCACGTGTGTTTGTGCTTGCATGTTCACTC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))))('(''$$#"##"#
- at 30BB2AAXX080903:3:38:1745:1480#0
-CTCAATTCTCAGCCTCCCCACAGCCCAGACTTTCTGTTTTAACCTCACAGCTGCCCAGCGTGATGGCCTTGTAGNN
-+
-67777788888888888888888877776555443222100//..----,,,++*+**))')''((#%$"""""""
- at 30BB2AAXX080903:3:35:1708:161#0
-CCAGTGCTGTGTTGTCATTTGCAAGTTCTTCCTGTGACTGAACTCCAAATGGCACTGGGACTGCTGANCTCGCGNN
-+
-67777788888888888888888877776555441222100//..--,,,+,+*****))*(()(('"$#%"##""
- at 30BB2AAXX080903:3:57:1432:1376#0
-AGGAACTCATGCTGGCCTGCCGGTCCCACCTGACCTGAGAGTGGCGGGGACTCAGCGGGTTAGGAAGCAGTATCCT
-+
-67777788888888888888888877776555443222100//..---'&$&)**')##)%#'##%''""$""###
- at 30BB2AAXX080903:3:34:1180:687#0
-GAAACAAGAGGGCACTGTATGCAAACATCTCTTGAACTCTGGAGTCTGCTCACCTTCCTGCCTCAAGNGCCTCTNN
-+
-67777788888888888888888877776555443222100//.----,,+++++*))*))((((''""%##%#""
- at 30BB2AAXX080903:3:52:580:1028#0
-CCGGGTGGGGGACGGGAATGGTGGGACTGGGGATGCCACGGGACAAGGCTGCTGGCCTGGAAGGGAGCTACATAGT
-+
-67777/88888888888888878877776555443211200/0.,---,,++++*))())'()(#'($$$#"""""
- at 30BB2AAXX080903:3:51:1291:628#0
-CCATCCAGATGGGAGGCTGAGTGCAGAGCAAACGGAGCCCAGCACTCCAGAGCCGTGTCCCTTCACTGACGCCACA
-+
-6777778888888888888883887777:555443221)00//..---,,+++***)))()')((('"$#""#$$#
- at 30BB2AAXX080903:3:2:450:502#0
-GTAGTGATGATTCTAGCACCTTCCTCAGGTTTCTTTAGATTCCTGGTTCTACCTGCATGGAGCATTTCNAGCTACA
-+
-67777788888888888888888)77776/55443222000/.-.-+,+-,+)+**))*)(((((''"""#"####
- at 30BB2AAXX080903:3:46:1623:1211#0
-CTCTGGGCATCAGCGCCAGGCCAGCGAGTAGAGAAGTCCGGCTTGGAGAGTACAAAACAGGCGCGATGTCACTGGT
-+
-67777788888888888888888877776555443220000//..-,-,,*+*)***()))(('(#'$##""#"""
- at 30BB2AAXX080903:3:38:1060:1246#0
-CCCAGCATGGTCAGGGCATTCTGGGCAGAGGAACTGATAATCAGCCCCTCAGCAACCGCAGAGGGAATGCTGTCTC
-+
-6/777788888288888888888877776555.13220&0,//.,-,,+,**+$)*)))(((%(%%%"%$%$%$$$
- at 30BB2AAXX080903:3:2:913:963#0
-GTTCCCCTCTGATATGGAGATTGGTGGAGAATGACCAGGATATTTTATGTGGCAATGGGGGTTGAAGCNCTCACAG
-+
-67777788888888888888888877776555443512100//.,-.-,,++****)*)))%(('('&"&#%%%$$
- at 30BB2AAXX080903:3:44:1217:1380#0
-GAAAAGGAAGGGGGGCACCTACAGTTGCCAGTTCTGTTTGGAAGTGAGGGAGGGGAGGGCAGATTCCCATACTCGC
-+
-6777178888888%88888888882177635,4422)2100//.'---,,*+****))))()((&(#'#%#""""#
- at 30BB2AAXX080903:3:52:1334:429#0
-CTGGAAGTCCCAGGCTTTGCCATCTCTGGTTCCCCACTTCCCCAGTTTCGACGCTCTCCTCTCTCCCCCCCCGCTC
-+
-67777788888888888888888877776345443222100//-.-,-,,+,)+*))**(((((((("$#%%%#"$
- at 30BB2AAXX080903:3:58:1105:328#0
-TGCAGCTCTGGTCGGGCTCTAACACATGCATGGCTGGCATGGATGCCCAAGTGTGCCTGGGGAATAGACGCNTCNG
-+
-677772888888888888888888777765454432+-/10/.-,---&$)*+)*))'(()''&#'%&$&"""#"#
- at 30BB2AAXX080903:3:2:1622:87#0
-CAAACAGAAGGACATGCTCAGTCCTAAAGGTTCTTTGTGGCCCAAGATGTTCTGGCATGAGAACTGACNCACAGTA
-+
-67777788888888888888882/78746515-4521010,.-.,.,-,+*%***&)))((((&%'#'"$%##""#
- at 30BB2AAXX080903:3:47:1300:1883#0
-CACCTGTGCAGCTCATCTGGCCATGAACCTCTCCAGCTCACAACTCTGTTTTCTCCCTGTTGTTTCTCTGAAACCA
-+
-67777788888888888888888877776555443222100//...---,+++****))))((('('"&$"""##"
- at 30BB2AAXX080903:3:58:1536:676#0
-GGCTGTGATAGGGGTCAGATGGGTGACAGCCACATGAGAGGCCGTCCGCTTGGGTGTGATGAGGGGACACAACATN
-+
-6$.72'2,8888)/$88-2/0-4,7-(5+$$1'33-.,)-))','$+#+)+&#*##'(##''####&$$%&"#"""
- at 30BB2AAXX080903:3:35:516:1417#0
-ACGTGGAGGCTACCACGGGCATCGCTGCTCTGCAGTCTGTCAACCCGAGGCCCCTGGTGCTGAGATCNCTACGTAN
-+
-677777888888888888888888777765551/33021.-+.,-$-,-,*')*')*&*())'(''%"##"$"#""
- at 30BB2AAXX080903:3:51:1678:170#0
-CACGGCCTTGGCAGCTTCACCAACAGGAATGTGTTCTCCTAGGGTACTGGAGGGTGGCAGTCCCAGACAAAAACCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))('(&$$%%%&%$$
- at 30BB2AAXX080903:3:33:1002:1269#0
-CTCCCTCTGCACTCACATCCCTGACGTCCTCCCGTGCCCTCACGTGGTCCTCCCCCTGCACTCACAGNCTGCACNN
-+
-6777778888888888888888887777655548321-1000/.-.,,,,+,++**))))))(((('"%#"#"#""
- at 30BB2AAXX080903:3:49:742:220#0
-TGCCCTCACGTGGTCCTCCCCCTGCACTCACATCCCTGACGTCCTCCCGAGCCCTCACGTGGTCCTCCCTCTCCCC
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))(()(((('$%#%#$###
- at 30BB2AAXX080903:3:54:954:1661#0
-CACGTGAGGGCACGGGAGGACGTCAGGGATGTGAGTGCAGAGGGAGGACCATGTGAGGGCGCGGGAGGTAGACGTC
-+
-6777778888888888888818.87777*$53442221.00//.---,',,++))**()(%((((#&&"#%"#"""
- at 30BB2AAXX080903:3:40:1533:1397#0
-TCCTCCCCCTGCACTCACATCCCTGACGTCCTCCCGTGCCCTCACGTGGTACACCCCACGCACTGACTGCCCATCA
-+
-607777888888888888888$8*7777*5554432+210/1/..---,(++**))*)%&'(&'##'"&&%&#"$"
- at 30BB2AAXX080903:3:52:132:269#0
-CCTCACGTGGTCCTCCCCCTGCACTCACATCCCTGACGTCCTCCCGAGCCCTCACATGGTCCTCCCTCCTCCCTCA
-+
-67777788888888888888888877774555443222100//..-,--,,+++*(')((()((('#$#$%"###"
- at 30BB2AAXX080903:3:38:276:828#0
-GTCAGGGATGTGAGGGCAGGGGGAGGACCACGTGAGGGCTCGGGAGGACGTCAGGGATGGGAGTGCAAGCACGCAC
-+
-60777788888888.8888888887777656554-2221////..---,,+++++*())'*(('(&#"$###""##
- at 30BB2AAXX080903:3:37:121:300#0
-GCACGGGACGATGTCAGGGATGTGAGTGCAGGGGGAGGACCATGTGAGGGCTCGGGAGGACGTCAGGTCCACCTCN
-+
-6777778-888/8-888888888857676.55242.2201/.%-*.+,+,+%****)*)&((('#('&$%#$##$"
- at 30BB2AAXX080903:3:46:1353:1444#0
-CGTGAGGGCACGGGAGGATGTCAGGGATGTGAGAGCAGGGGGAGGACGATGTGAGGGATCGGGGGGACACGTAGAG
-+
-67777788888888888888/888771765514&3022100/)..,"&,,+'+***)*)'))(#(''%"$""##"#
- at 30BB2AAXX080903:3:1:464:1309#0
-ACCACGTGAGGGCACGGGAGGATGTCAGGGATGTGAGTGCAGGGGGAGGACCATGGGAGGGCGCGGGCNGCNCCTC
-+
-077777888888888888888308476765-541332/1.).+./----%()'(*#)$)()'#((''"""%"##"#
- at 30BB2AAXX080903:3:48:1739:132#0
-ACTCACATCCCTGACGTCCTCCCGTGCCCTCACATGGTCCTCCCCCTGCACTTGCATCCATGACGTCCGCCTGCAC
-+
-6777778888888888888888887777655544322.100//..-*-,,++%***))*)')(((&'%##"""##$
- at 30BB2AAXX080903:3:45:1790:766#0
-GGGCATGGGAGGACGTCATGGATGCAAGTGCAGGGGGAGGACCATGTGAGGGCACGGGAGGACGTCACGGCTGTGG
-+
-67777788888888888888888877776555443220100/.---,-,,+++++***)))()('('%%"#"#"#"
- at 30BB2AAXX080903:3:35:469:1825#0
-ATCCATGACGTCCTCCCATGCCCTCACGTGGTCCTCCCCCTGCACTCACATCCCTGACGTCCTCCCGNCCTCTACN
-+
-67777788888888888888888877776555333002100/.-/-,,,,,++***))))(()('('"#"#$"#$"
- at 30BB2AAXX080903:3:60:995:1902#0
-AAGACCTGCATTTCTTCAACAACCCACACTGAGAGGCTTTCCTGTACTTCTGACCTGTGAGGTCGGGACACNAANN
-+
-677777888888888888888888771745524432/210,./.,.,*-,+++*')*)*((&(&((#%$"$"$"""
- at 30BB2AAXX080903:3:54:332:584#0
-GTGTGTGCTCAGCAGCCACGTGGCTCATCTGCTGGGAGCTTGCTAAATACGATGTTCTACAACATTGCCTAACCAC
-+
-67777788888888888888888877776555443222100//.-.-,-,+++*)***))'()((('"$""$%##"
- at 30BB2AAXX080903:3:57:838:417#0
-AATACTTGATGTTACTTTGTTTTATATAAATGTGTATTTCTACGATAGTTTTAGTGTCATCTAATATTTTTTTGCT
-+
-67777788888888888888888877776555243222100//.-,,-+,++*)+*)())'((((''&&"&%$#$"
- at 30BB2AAXX080903:3:35:1555:774#0
-GGAGTCAAACCTGAGACGGGCTAACCTCGCTGCAGGTGGAGCAAATGAAACCCCCTCCCCCCGAGATNCGTGACCN
-+
-677777888888888888888888777765554432/21/0+/./,--,-,++**'***((%'&('#"$"#"###"
- at 30BB2AAXX080903:3:59:568:1055#0
-CATTTGCTCCACCTGCAGGGCGAATGGTGCTCTCACCTCACACGTGACACTTGGTCCTTTTTGCATTATGACGCGC
-+
-67777788888888888888888877776555443222100...,.,-,,,++***))()))((('('%&#$"$"#
- at 30BB2AAXX080903:3:43:29:929#0
-TGAGAGCTGTAACTGCCTGCAGGGTTTCCAGCTGACCCACTCCCTGGGTTGGGGGAGTGGGTCTGGGCGCTTGGAC
-+
-677777888888888.8888888877776552443'1.100/...---,,+*+***)))()'&(''&""#"""""#
- at 30BB2AAXX080903:3:3:1355:516#0
-GCCGTGACGGGGGTCACGGGCAGCCATCATGTTCTTAGCATCAAACATCTGCTGGGGGAGCTCAGCGCNATCANAC
-+
-677777888888888888881883177/5550413200/./-.--+,,$+******#(#'#&##'##""#"$#"##
- at 30BB2AAXX080903:3:1:711:1825#0
-ACACCGGGCTTGATTCCTGCCTAGTCCCTGCCAGATACCCCATGCCCACCTGGTGAAGAGAATGAGGCNCCNCACC
-+
-2177778888888888888888881717453-311.21//.+-.--,,,,*+*'*'()()'(&('(''"#%"####
- at 30BB2AAXX080903:3:43:408:934#0
-GAAGGGCCTATCCCCAAAGGTGCCACCCTCACCAGGCTCATCCTGACAATCTTGGATTATTTTTTCCCTGAAGTTT
-+
-67777788888888888888888877776755443212110//...-,,,,+++***)))))((((%'&%"##"$#
- at 30BB2AAXX080903:3:53:200:101#0
-ATGGGCATGCCTAGGGGACCTGGGGTAGCGCCTGTTCATCTCCCCACCCCTGGCCCATGCTGGCTTCAGTTTTTCT
-+
-6777778888888888888888887257652543222/00/0-.-)-,+,)*+&)#&('(''((&%#"#"%"""#$
- at 30BB2AAXX080903:3:3:755:871#0
-GTGGGCGAGCGTGGGGGAGCGTGGGGGGGTGTGAGAGATCGGAAGGGCGGTTGAGCGGGGAGGCCGGGNACACNAC
-+
-61777288828888.22-1)8&85*77$6+0'/$-((*%&/-#+,$(&+%&$#$#&##%#&####&#""$#"#"#$
- at 30BB2AAXX080903:3:60:1648:767#0
-CGCCCACACTCGCCCACACTCCCCCACACTCCCTCACAGTCGCCCACACTCCCCCACACTCCCCCAACACACCANN
-+
-67777788888888888888888877776555143222100//..---,,+,++)*)*))))(((&''"%%&"%""
- at 30BB2AAXX080903:3:33:643:1909#0
-TGGGGGAGCGTGGGCGAGTATGGGGGAGCGCGGGCGGGTGTGGGGGAGCGTGGGGGAGTGTGGGGGGNCTACCCNN
-+
-6777778888388888888888887707$5$944/0#1+%1/..-.+-),*++)*)&(#(&(&(''#"$""%##""
- at 30BB2AAXX080903:3:2:1122:671#0
-ATCACCCAGGCCCTGCAAAACTGAGCCACCAACAACCACCTGCACCACTTCCCAGGAGGCCAAATAATNCATAACC
-+
-677777888888888888888888777765553431-11-/-/,-',,,+,*)*#)()))#((('''$"%""####
- at 30BB2AAXX080903:3:3:1518:98#0
-GGAAGATTGAATCAGTAATCGAAAACCCAGCAACAATGAAAAGCCTGGAGCAGATGGCTTCACTGTTCNCACANCN
-+
-677777888.888888888&888873+165+54,3102100/.)'(,,*((+**(*(#''#'#((&%&"%#%#"#"
- at 30BB2AAXX080903:3:57:563:576#0
-TTTGTAGATTCTGGATATTAGCCCTTTGTCAGACAGATAGATTGCAAAAATTTTCTCCCGATCTGTAAGTGTACAT
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('''&&%"""##"
- at 30BB2AAXX080903:3:56:729:528#0
-TAGCAATTGTGAATGAATTTCATTCATGATTTGGCTCTCTACTTGCCTGTTGTTGATGTATAAGATCGGCTGAACG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('&&""""##"
- at 30BB2AAXX080903:3:47:1590:997#0
-TGAAGGGATGTTGAATTTCATTGAAGGCCTTTTCTGCATCTATTGAGATAGTCGTGTTGTTTTATGTTNCCTTATC
-+
-67777788888888888888888877776555443222100//...--,,+++****)))()(((''&"#%#"###
- at 30BB2AAXX080903:3:38:878:517#0
-CGCATGCCCCAGTGAGCCAGCGAGCATTCCGCCGAGACTCCACACAGCTCTGTGCTTCAGACCCAAGCTCATCTCC
-+
-6772478888888888888888887777235544022000,./--,--+,+,*+##'*)((('('%'"#%%""$##
- at 30BB2AAXX080903:3:50:765:1020#0
-AGCGAGCATTCCGCCGAGACTCCACACAGCTCTGTGCTTCAGACCCAAGATCGGAAGAGCGGGGCAGCACTCTCNG
-+
-67777788888888288888,88571(7)5150502/#0//..,,-*+,+($%*#)(((#()##'##""#"#"#""
- at 30BB2AAXX080903:3:54:955:1998#0
-ACACAGCTCTGTGCTTCAGACCCAAGGCCATGGTGGCTGAACTCATGAGGGGACCTCCTGATCTGCAGGCCTTATC
-+
-67777788888888888888888877706555443222110//-..-,,,+++)**()))))(((('%$#""""#"
- at 30BB2AAXX080903:3:59:1401:1441#0
-GTAACAAGATGTGAGTACCACTTCAAACTCCACAACTTCACTGGCAGTGTTTGGAGTTATGATTCATACCAACNCA
-+
-67777788888288888%8888)8777765'544322'00.//..+-+,,++'(***##)('((#'%'%"#%$"#%
- at 30BB2AAXX080903:3:51:1319:350#0
-TGGGGACGGAAAGGGAAGAGGAGCCAGCCACAGGCTACAGGCTGGTTGGTCACTCCGAAACGAAAAAGCCAGTGCG
-+
-6777778888888888888888887777655544322.000./.-'--%+&**&&&#)##''#(##&""$#"""#"
- at 30BB2AAXX080903:3:4:65:424#0
-AATATTGAAGCGTGTAACTCATGGCAGAAGGTGGAATATTTAAAAGGCAAAACTGCCTGGGTCACATANCAACNAN
-+
-67777788888888888888888877776551443522100//..--+,,,+*+*(())))((('('%"$$##"""
- at 30BB2AAXX080903:3:1:1354:1893#0
-AAATGGGTTAAAATGTCCCATTACATGGAGAGTGCTGATCCACAGGGTTGAGATCATTGACTTAGGGCNGTNCTCA
-+
-27777788888888888888888877776515343222000//..--+,-+++**)*))))((((('$""&"%$#"
- at 30BB2AAXX080903:3:34:1563:782#0
-GACATGAGTCCCATCACCTGGGTGATCAGTGCAGAGTTCTGTCACAATGCCCCTGTAGGCAGAGCCTNTCTACANN
-+
-67777788888888888888882877776555443222100//..---,-,,+**)**)))()(((&""$#"#"""
- at 30BB2AAXX080903:3:50:154:1256#0
-AATAAGTTGTCATTGTTGTTTACCTGTCACCCAGGTGATGTAACTCTTGTCTCGGCTCTGCCTACGACTGCACGCG
-+
-67777788888888888888888877776555443222100//..---,,,++***))))(()''(&$""&$#"#"
- at 30BB2AAXX080903:3:54:1676:251#0
-GAAAAGCCTAGACAAGAGTTACATCACCTGGGTGACAGGCAAACAACAATGACAACTTATTTTCACACAAACAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('%$%&%%%#$
- at 30BB2AAXX080903:3:58:1532:856#0
-TCAAATCCAAGCTCCACCCCTCGCTGTGTGAGCTTGCTCATGCTGCTAACCTCTCTGAGACTTGAGATAGTACAAN
-+
-67777788888888888888888877776555443222100/0..--,,,,++***)*))))(((''$$%"$$%#"
- at 30BB2AAXX080903:3:4:1497:1652#0
-ACTAAGAGAAGCTGAAAAGGAGCGGGGAGGAACTAACTGCAATGTTACATCAATGAGTTGCATCTTAANCCTCNTN
-+
-6177778888888888888888)877-125454/02220#0..$-.-,,,*++%)*'))(%(('(&'""$""$"""
- at 30BB2AAXX080903:3:51:298:898#0
-GGCATGGTCCCTCAGCCACCTTGTAGCCTTGGCTTGCAACATCTCGACATTGAAACCAAAACGCTGCACGGGCCAC
-+
-6777778888888888888888887777655544322210//...---,,,+***))*)()(((('&$#"#"##"#
- at 30BB2AAXX080903:3:42:791:927#0
-GCCTGGACAACTTTTCAGGAACCTTCAGATCACACGGGCCCTGCTGCATTTTGGTTTCCTTGTCGAGATGCTGCAG
-+
-67777788888888888888888877776545443222100./-.--+,++++*+)*()&))('(&'$%##%##"#
- at 30BB2AAXX080903:3:51:1007:190#0
-TTGAGACAAGGTCTCTCTCTAAGGTCTCACTCTGTTCCCCAGGCTGGAGTGCAGTAGTGGGACCAGAGACCACTGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))()(''$"#%#%$$#
- at 30BB2AAXX080903:3:33:64:358#0
-GCAGGAGAATTGCTCAAACCTGGGAGGTGGAGGTTGCAGTGAGCCAAGATTGTACCACTGTACTCCANCGACCANN
-+
-67777788888880888888888877776575443221100//,..--+(+++***)**))((((('"$""$"#""
- at 30BB2AAXX080903:3:38:1726:1013#0
-ACAAGCGGGCCGGGCGTGGTGGCTCACGCCTGTAAACCCAACACTTTGGGAGGCTTAGGCAGGCGGGTGCACTTNN
-+
-677777888888888882888888777765252322...///,,%---,,+++'()'))(''(#(&#"'&"$""""
- at 30BB2AAXX080903:3:55:637:831#0
-GGGACCTTTTGCAGGGGTTCCCCAGGCAGAGGGCTCACAGCTTTTGTGCAGCAGATCGGAAGAGCGGATACGCACG
-+
-67777788888888888888888877776455443122100//.,----,+,+*+**))))()(('&$$%%%$$"#
- at 30BB2AAXX080903:3:45:120:1660#0
-CTGGTTTGGTCTCCCATCCCACCCCATCCCTGCATCCCATCCTGTTTCAGCCAGTGTCCCACTTCCTGGGGCGGTC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))(((''('$%"#$#""
- at 30BB2AAXX080903:3:36:905:1336#0
-ATTTAGAACTATTCTGCACTGGAGATTTGTCTGTTCTCCCCCATGATAGATATTTAACCTCACGTTTACATCTCTN
-+
-67777788888888888888888877776555443222200//..--,,-+,++**)*())))(((&$%#"####"
- at 30BB2AAXX080903:3:48:49:1724#0
-TGCAGAGTGGAGGTCAGTGGTGGAGTGAAGACGGACCAGGGTTAACATCGGCAGGGGTCACGTGAGCTCACTGGAT
-+
-67777788888888888&88.888777-655.4430.'100-,.-..,--+)+*)*(##&%#'&##'"$#$#""""
- at 30BB2AAXX080903:3:49:1003:1049#0
-AGGAGGGCCAGTCAGGTATTTTGGAGAACGTCCCTCAATTAGGATTTGTCTATTTTCCTCAAGATCGGCAGCGCGT
-+
-6777778888888888888888887777655922321-10///-..--,-+*+***))*)()(((&(""""$"""#
- at 30BB2AAXX080903:3:37:1257:1176#0
-GACACTCGAGGGCTGCTTTTAGGAGTGCTGACTACATGCTTCCCTACCTCCATGTAGGCATGTGTGTCCACAACAN
-+
-677777888888888888888888767765554432221/0/..----,,-*++))**)')(((''#$#"%""##"
- at 30BB2AAXX080903:3:54:141:1721#0
-GACCCCGCGGCTTTGAGGGGGCCCCGGCACTCACGCCCTGACCCTGGCGTCCTGAGCCTGCGCCCAACGGACCCAC
-+
-6777778888888888888888887777655544321210.//.---,-++*+***)())()#''&%%%"#"#"#"
- at 30BB2AAXX080903:3:40:1123:1233#0
-AACGCGGCCTCCTCCTCCTCCGAACGCGGCCGCCTCCTCCTCCGAACGTGGCCGCCTCCGAACGTGGCCGCCGACC
-+
-6777778888888888888/188677776455313.21100/..-,-,*++)***''()(''''#%'&%#"#""##
- at 30BB2AAXX080903:3:2:1127:406#0
-GAGCTGAAGACTGGGCGCGTGCCGGCGGCAAATGTTCACAGCAAAGGGCGGCCCAGTGCGCAGCTGGANCATACTC
-+
-64777788888888838888888877772/554412/..00*,----,),+*'***(*()&(('(''%"$$#$#"#
- at 30BB2AAXX080903:3:59:1126:569#0
-GGTCGTGGTGGAGCCTGGGTGAGGGCAGAGGTGGTACACCCCAGAAGACCCTGCTCCAGGCAGCGGCGGGTAACCC
-+
-6777778888888888888888887777655244-2120/,//.,---,,+)+('))*()('((('%&$$"$"%##
- at 30BB2AAXX080903:3:49:1044:1595#0
-GGAGCAGGGTCTTCTGGGGTGTACCACCTCTGCCCTCACCCAGGCTCCACCACGACCAGCTTCGTCCACCCCGATC
-+
-67777788888888888888888877776555443222110//.---,,,,,+*+)**))))()(('%&%"$####
- at 30BB2AAXX080903:3:48:933:2045#0
-AGCCCACCCTCCCATCTCCCTGAACTACGGGTAGGACCCCTCTGGCCCCCAGCCCTGCCCTTGACCCAGACTACAT
-+
-677777888848888288288888477765514432+-*//./.-+++*,++*(())(''&'((###"""$""$##
- at 30BB2AAXX080903:3:48:105:1104#0
-AGTCTGCTGTCGCTTCCCCTTTAAGCACACTCATTCACCACACCCGAGGAGGCCAGAGGTGCAGGGACAGAGAACT
-+
-67777788888888888888888877776555443222100//..-.-,,++*+**))*&)((((''$$##"""##
- at 30BB2AAXX080903:3:3:910:1602#0
-CGGTCCCGACCTGCCTGGTCCCTGGAGCTGGGGTGGGAGTCGTGCCTTGAGATCGGAAGAGCGGCTCCNCGGCNAC
-+
-6737778888888888888888827777555541322.1%1/*.-$-,,(++*(*((()()#'(''%""#""#""#
- at 30BB2AAXX080903:3:52:1143:870#0
-TCCTGGGACCTCGGCCCTGGGCAGGATTTGGGGGATGGCCACGTCTCTCTGAGTGGGCTCTGCTCATGGCCCTCAC
-+
-677777888888888888888888777765554432221/0//..-----+*+**+)*)))()(((''$"""####
- at 30BB2AAXX080903:3:1:118:1172#0
-AGATAAACCTGGTGAGCTGCGCCTTTGTGCTCACACGCAGCTGGCAATGGCAAGTCAGTGGATTTGTANATNCACG
-+
-6777778888888888888888789777655544322210../-,,,+-,++)+)%&))))'('(('$""""#"#"
- at 30BB2AAXX080903:3:8:602:371#0
-CATGTGCTTGCGGGGGCTGGGGGCTGAGGGAGGCCATCTGGGATGTGGGGTCTGGGAGATCGGAAGGNGACTGCNN
-+
--777778888888288388/888/972765*52,(*0*20/.*--+,,,-&$***)#)#'&((##'&""##"#$""
- at 30BB2AAXX080903:3:54:118:214#0
-CAGCCACTGTGAGGTGGGTGCTGGTCCCACCTCCTTCACAGGTGCCAGCTGGCAGGTGGTGGAGGGGTCACNATNT
-+
-6777728888888888888888887777255444322-10..-...*-,,+++'**&*)#))#((%#"$""""$"#
- at 30BB2AAXX080903:3:52:680:247#0
-GACCCTGCAGCCACTGTGAGGTGGGTGCTGGTCCCACCTCCTTCACAGGTGCCAGCTGGCAGGTGGGAGAGGCTTC
-+
-67777388888888888888818873776)554432-2100./.,-*,-&,,+(**(**)()'&((#"$#%#""""
- at 30BB2AAXX080903:3:59:1497:1795#0
-CTTCACGCAGACACCAGTCCCCTCTCTCTATTCCTGTTCATCCTTGATGCCAATGTCAAAGATCGGACAACAANCA
-+
-6777778888888888888*838,77776755-53222//0.+..---,+++++*)))))((('(('$&%&%%"$$
- at 30BB2AAXX080903:3:44:567:1178#0
-TGCTGTGGAGTGCAGAAAAGGAAGCTCCAAGCTTGCACCTGGGGCGTGCAGAGCCACCTTCTGCCAAATGCTCCGC
-+
-67777788888888888888888877776555443011000//.----,++++&)*)'))&'('''&&#"##"#""
- at 30BB2AAXX080903:3:35:1685:634#0
-CATTGAGCGTGTGGGGTGGGGCAGAGACAGCCACCTTGCAGCTGGTGAGGCCCTTACAGCATCTGGTNCTCTCCAN
-+
-6777778888888888888888887777:550425002111....+-+,,)+**)))((&'''('(&"&%""$##"
- at 30BB2AAXX080903:3:47:1789:102#0
-CAAGATGAAATTAACATGCATTGAGCGTGTGGGGTGGGGCAGAGACAGCCACCTTGCAGCTGGTGAGGCCACTCGA
-+
-67777788888888888888888877776555441222100/....,-,-*++$**)())'((#('&&"###"""#
- at 30BB2AAXX080903:3:57:1453:1811#0
-TCGGCGTGAGCGCAGGGTAAACTCACGGACCCGAACTCTCAGATGTGCTTCCTGGGCTCAGCTTCCCCATACATGT
-+
-677777888888888888888388767763224032211/0//...-,,,+++**))*)))(((#'#$%#"$#""#
- at 30BB2AAXX080903:3:4:498:969#0
-TCCCACCTGCCCCCTCCTTTTCTGGTCTTGCCTGCGCTGGGCCCAGGGGCTCTGGCTGTGGGTTTTCTNCTCTNCN
-+
-677707888888888888888888777765724422-21/0.-.-.-,,,+*+**))*()))##'''"""""#"#"
- at 30BB2AAXX080903:3:1:56:933#0
-TCCAAGGCGGTGTCCTGGACTCCCACTGTGCTCCCCAGAGGGCAGGGTGAGTGCGTGGCATCCTTTTANGCNCGAA
-+
-67777788888888888888888877775556333202/00/...--+,,,(+)**))(()'(((('&"##"##"#
- at 30BB2AAXX080903:3:1:651:606#0
-CTGGGGGTAGCAGGCCCTCTGTCAGCACTGACTTCTGTATCATGTCAGGGATTTTTAGGGCGGCAAGCNCANCACT
-+
-677777888888888888888888777;65-0440222/0../.--.-,,,++**+))))())&''''"##"$#""
- at 30BB2AAXX080903:3:33:204:72#0
-ACCCAGGTCGCTGGCGTCTGTGCCATCTCTGCTCCACTGACCACTCGTGGTGGTCCTGGAGCTCCTGNGCACACNN
-+
-6777778888888888888888882777655)442.2-10/$,,,."-,,*,*$)*'&)#)'&#(#%""%$$"$""
- at 30BB2AAXX080903:3:46:1507:126#0
-TGCCACGCCACTGTCCAGGAGACTGTCTCCTGAGACTGACCTCCCCCTGCACTGGGCAATGTCTGCCTCACCACTC
-+
-677777888888888888888888777765154432221//+/..-&&,,*&****)&)(('(#(##$%"#$"$"#
- at 30BB2AAXX080903:3:59:491:1031#0
-GCCCACCCTCCCCTGGACACAATGGAGGACCCCGTGTGTGGTTTTCACTGACTGAGCACCTATCTCGTGCCATCCA
-+
-67777788,88888888888888877776555445222100././.--,,,,++****))(((((('%%#$""###
- at 30BB2AAXX080903:3:37:422:239#0
-CCTGTTACGCACGTTCTGGTCTCTCCGTGCCCACAGACCCGCCAAGCTCACCAGCCAATGTGCCGCCGGCTCTCCN
-+
-677777888888888888/8/8887/746)55-2/222(0//.,,*--,++)***#'(()%)'#&#'""%"#"##"
- at 30BB2AAXX080903:3:57:725:1925#0
-CGAGGCCGTCACACAGCACCTGTGCTGAGAGTGAGCTGACGTGGACGGCGGCACCGTGGCCGTGGCCGCGCCGCAC
-+
-67777788888888888888888877776555433222110-/.-,--,,+')*)*#*)(&(#((##'"&##"$##
- at 30BB2AAXX080903:3:56:341:1202#0
-TGACGTGGACGGCGGCACCGTGGCCGTGGCCGAGGCACCATCCCTCCACCCTCACTCATGTAGGGATGTGTCGCGC
-+
-67777788888888888888788877/765552432211//1..,.-,,-+'+)*()())#'(((#'$%"$""#"#
- at 30BB2AAXX080903:3:36:1112:1764#0
-GGGCTCCAGTCCGTGTGCCCCACATCCCTACATGAGTGAGGGTGGAGGGATGGTGCCTCGGCCACGGCAGCACTNN
-+
-67777788888888888888888877776555442212100/-...--,,,++)**()())(((((#&#"#"#"""
- at 30BB2AAXX080903:3:48:206:1195#0
-TCGGCTCCCAGAGTCTCCCACCCAATGTCAGAGAGGGGGCCGCAACAGTGGTTCGGGGGGTCCTGTTAGCACTCGA
-+
-677777888888888)888888817777155544322,1.,/'$.,,,$,$+)***)))(('#&('#""##$"#"#
- at 30BB2AAXX080903:3:37:1666:1038#0
-TTTCGAGGACGCAAGAAGGTGTTTCCAAGTCCAGTCTGTCCACCGACCTGAACCTTTACCATTGAAACACCCACNN
-+
-677777888888888888888888777765554432221000/./---+,,++*+**)))()(((('"&%"$#"""
- at 30BB2AAXX080903:3:2:1126:993#0
-GCTCCTGCAGAAGTGGCCAGGACCTCAGGAACGCACCTGCTCCTGGTCAGACAGGAGGGGCTGCCGTGNAGTCTCC
-+
-6777778888888888888888887777655544322221//0-.-,,,,,++)*)))*)#'(&''%%""""$""#
- at 30BB2AAXX080903:3:46:1601:201#0
-CAGAGGTGGGGTGGGGAGGAGAGAGATGGGGAAGCTGAGTCCGGGGCCACAGGTGCAGCCAGGAGGTGCACAGCCA
-+
-677777088881888888888883777765554432221.11..-..--++++&*)))('(()#('#&"$##"$##
- at 30BB2AAXX080903:3:42:308:880#0
-GAGGCGGCATGCGGGCTGGGGCAGCGGCCCCTGGCGCCCCCACACTCCCCCAGGACGTCTGGGGGCACCGCCTACT
-+
-677777888888888888888888777765513422020/1+.,---,,,+&*))))$((()((#%%$'%""""""
- at 30BB2AAXX080903:3:45:1270:921#0
-CATGGGACACAGGTGTGGTAGTGGAGGACACGTGTGAGCAAGTGAACACATCACACAGATGTGCGAGCAGACTCTA
-+
-67777788888888888888888877776555443222100/...-.-,,-++****))))((((('&&$##"#""
- at 30BB2AAXX080903:3:43:614:1567#0
-ATGGGACACAGGTGTGGTAGTGGAGGACACGTGTGAGCAAGTGAACACATCACACAGATGTGCGAGCAGACCTCCG
-+
-6777778888888888888888887777655544322/0/0-//.+,,,,,+****)))))(((((&%%#%"#"#"
- at 30BB2AAXX080903:3:59:189:1019#0
-CACGAGACACAGGTGTGGGAGTGGACACAGGTGTGTGGGAGTGGACACAGAACAGGGGGGAACATGGACTCTNNNC
-+
-67777788888888888888888877776555443222100-/...-++,+++***')#))(#(((''"%"&"""#
- at 30BB2AAXX080903:3:58:1720:376#0
-CCAGCATCACCCTTTTCCACGGGGGTGTGCCCCTTCCTTGGTCCTGTCCCCTCCCACACACCCGAGCCAACACANN
-+
-6777778888888888888888887777655544322*10.///--+-,+,++)*(*')()&((#('"$%%%$%""
- at 30BB2AAXX080903:3:8:864:1934#0
-CCCCAGCATCACCCTTTTCCACGGGGTTGTGCCCCTTCCTTGGTCCTGTCCACTCACACACACCCGTNACTCTANN
-+
-67777788888888888888888877476%555530212/00/.-,,-)++++****()())(((('""%#%"#""
- at 30BB2AAXX080903:3:4:1073:1492#0
-TGCCTGAGCAGAGCACCCCCGGCCCAGACCTCAATCCGCGGGCTGGCTGTGCGAGCACCAGAATCCTCNATCANCN
-+
-6777778888888888'88&8888707565-5413222200/#-,+,,-+,%+$&&)$%'(''#'##'"#"##"""
- at 30BB2AAXX080903:3:58:226:1271#0
-CTGGCCCCTGCCCTTGAGATGCAGCTGGCATGTCCCTGTGGGCATCTCCCAGAGCAGGTCCAGGGGTGAGCTGANC
-+
-67777788888888888888888877776335401212000/-.-,,,),+++++)*)(()())((''"&#""#"#
- at 30BB2AAXX080903:3:38:1483:1449#0
-GCTGTGCGGTGTTGCATCCACTAGAAAGGGGCCTCCTGTTCTGACCCTGGCCCCTGAGATCGGAAGAGCGCTACAC
-+
-67777788888888888888888877776555443222000//...--,,,,++*****(()(((('"%""""##"
- at 30BB2AAXX080903:3:42:1383:1032#0
-CTGACAGGTCAGTCTGGGCCCCAGTCCCTGGTTCCTGGTGAGCTTCCCATCACCCCCCACCTCCCTGCGCCCCCAC
-+
-677777888888888888888808-847655+442522000//-..,,+-++******')(((((&''$"####"#
- at 30BB2AAXX080903:3:52:1393:242#0
-TGCGCAAAGTCCCAGAGCCGCCGGCGCACGCTCACACCCCGGCGAGCAGCCCCCAGCTCCCTCCCTCTCAGGGCCA
-+
-67777788888888888888888877776555443222100//..---,,++++***)*))(()(''$##""""#"
- at 30BB2AAXX080903:3:53:889:985#0
-GCGGCTGGAATCCAGGACTCCGCGCGGGACTGGGATGGGCTGGGCTGGTCGCGGACCGGGCTCCTCTCGGAGGACG
-+
-6777778888888888888888887777055544222210.//.-.--+-+++**)***)'('((''"""""""#"
- at 30BB2AAXX080903:3:49:1195:77#0
-GGATCCTGCAGGTGCATCCTCCGATCTGCGACTGCCCGGGCTGCCGAATATCCTCCCCGGCGGTGAGATGTCGCGT
-+
-67777788888888888888888877776555243222100//....+-,*++**')*')#()&'&'""""%"#""
- at 30BB2AAXX080903:3:55:1286:840#0
-GATTGTGTGTCAGGTGGGCACATGGGTGAGGTGCGGCTGGGTCCCCTTCCCCTGCCCAACAAGCTGGGGTCATAAC
-+
-677777888888888888888888777765554432221-0+#.-.+,)++*')%))&)('#(&&(#"""""""#"
- at 30BB2AAXX080903:3:4:443:755#0
-ACACAGCCGCACCTCACCCATGTGCCCACCTGACACACAATCCGACATGGACCTGCACGCACAGGCACNCACANCN
-+
-67777788888888,8888288887'7165554122.10(0/..--,-,,*%*****)(&)(')'&&$"%$"#"#"
- at 30BB2AAXX080903:3:47:359:341#0
-CTGTCTCCCCCAAGCCCCATGCCAAATCCGCAGGCATGTGCACCTCATGGTCACAGATGCTCCGGGGCNCGAGGCC
-+
-67777788888888888883888877776555443222.000..-.,--,+++***)))()(('(('&"###""##
- at 30BB2AAXX080903:3:42:210:284#0
-GCCGAGTTTTCAGATCTGTGTGCTGTGGCCGAGGTCTCTAGTGTGGAGGAGGTGTGTTCTGTCCTTGAGNTACGNG
-+
-67774788888888888888888877776555443222100//..---,,++****()))))(((&'$&""%$""#
- at 30BB2AAXX080903:3:8:590:1890#0
-CTGGGGTGCCGGTGTGTCCCCACGCCCGACTCTGCGCATCACGGGGCTGAGGCTGGCATACAGCCTGNCCATCCNN
-+
-6777778888888888888888882767/565343220+11**.,,-&,++,+***))&)((&#'&'""%""$#""
- at 30BB2AAXX080903:3:52:1129:1306#0
-TGCCCGGGCCTCCGCGTGTCAGCTGGAGCTCGGGGGTCCCTTCAACAGCCACAGCCTGTCCGGAGTGTGACTGTCG
-+
-677777888888888888888888777765554432/0*//-,--,-,,,,,++*)*(((&)('(#($""#"%%#"
- at 30BB2AAXX080903:3:33:1368:1702#0
-ACAGACAGGCATCATACCTTCGGCCTTGGCCGCACTCTGTGGTCATTGGTGTTGGCGGCAGCCCAGGNTATCTGNN
-+
-67777788888888888888888877776555483220100/,.+----*+++*+**)%#(''''''"#""##"""
- at 30BB2AAXX080903:3:45:571:1217#0
-ATGTAGTAACAGGCCGCTGGCTCCGGGAGGTGGCAGAGCCCTTGAGAGCGTCTAACTCACTCCCTCCTCCGATCCG
-+
-6777778888888888888888887776650541322200/0..--,-,,+++*))))(((((((''"$%#"##"#
- at 30BB2AAXX080903:3:41:1484:384#0
-GCCCGCTGTGGTCCCTGCAGAGCACAGCCGAGCCCCGAGCTGACGCACACACGCGGCGGACGCGCCCGCGGCTCGC
-+
-6777778818888888888888887777645544321211//...-.-,,-+++*)*)((()#''''$$%$""$"%
- at 30BB2AAXX080903:3:48:855:533#0
-CTGAGAGAAATGCGGGGCAGGGTTTGCGGAACGGAGGACCTGGGCTGGTGAGGGCTCCTCGTCTGGTGCCCCGTGC
-+
-67777788888888888888888877776555443222200//..---,,+++****))))()(('#$"$#$#""#
- at 30BB2AAXX080903:3:3:8:941#0
-CTGTCTGAGCTGAACCCTCGCAGACTGCAGGCCCCGGGGCTCACAGGTCACCAGACGAGGAGCCCTCGNTACNNTT
-+
-67777788888888838888/8887778644013/20-2//..---,+)+(+***(*())((#''%'%"#$$""""
- at 30BB2AAXX080903:3:2:224:380#0
-GCCTGGTGCAAGGCCACTGGCAACTGTCTGAGCTGAACCCTCGCAGACTGCAGGCCCCGGGGCTCACANCTCNNCC
-+
-67777788888888888888,881737363.521322+0....-+,,,,+++***(&)))()((''%""$#"""##
- at 30BB2AAXX080903:3:60:1703:384#0
-TCACAAAGTACGGGTGGGATTGGCAGGCAGATAAAAGGAGGGAAAGAGAGGAATTGAGTGGAAGAACACACCAGNN
-+
-677777888888888888888883777+65554-3+02100//.,.&-%,%,%****)&)')')#'&$%%%$$"""
- at 30BB2AAXX080903:3:51:849:370#0
-GCAGGGGAGGGCTGAGCCAGTGGGCGTCGTCTGTAGGGGGATGCCCAACTGCGGCCCCGTCTCTCGAGACAAATAC
-+
-67777788888888888888088877776/5548322210,-/.,-,,,+++++*))*)(('(''%%%$%#""""#
- at 30BB2AAXX080903:3:58:487:704#0
-GGCCCGGTCCAGCCCCACCTTCCTCTCCTCCTGCCCCACCTTCCTCTCCTCCTGCCCCACCTTCCTCTCCTGCCGC
-+
-67777788888888888888888877776555443222100//..---,-++++*)))*))((((('&%%%"####
- at 30BB2AAXX080903:3:34:357:1406#0
-AGAACAGGACCGAGGCCCCTTCTCCCTACTGCTTGTTGCCGTGCACTAACACGAGCACTCCTGTTCTNCACGAGNN
-+
-67777788888888888(8/8)887787%542442/110/+-....,))&+'*)**))()'()''&%"$"%###""
- at 30BB2AAXX080903:3:49:525:2023#0
-GAAGGGTGTGTAGGAGCTCTAAGGTGAGGGGATGTATGCAGGGTGGGGGGAGAGGGGAGGGCGGAGATTCTCGCCA
-+
-6777778838888888-8&,,388$7%765554/3'12.#0$/-.-+,,)+')*+(#')()#&(#'#""#######
- at 30BB2AAXX080903:3:51:1323:735#0
-CCTGGAATCACACCCCCTACCGTCCTGCTTCCACAGCCTGAATCCAATCCCCTGTCTGCCAGGAAGGCCCCGCGCT
-+
-6777778888888888888888887777655544321210///..-.-,,,+++****))))(((('"$#$"#$#"
- at 30BB2AAXX080903:3:38:1490:1640#0
-GAAGGCCCAGGGGACCTGCGTGTCTTGGCTCCACGCCAGATGTGTTATTATTTATGTCTATGAGAAGCGAGGACAC
-+
-6777778888888888888888817777)53234302-1(,.*.,)+-,,+,+)*))'(#'(%(&''"""""%$##
- at 30BB2AAXX080903:3:35:68:1295#0
-GTCTGCCGTCAGTGCTGCCGAGGGACGCTGCATTCCCGAGGCCAGGCAGACGGAGGAGGGGGCTGCGNCCTCGACN
-+
-67777.88888888888888/8880/7$655-141../.-0/,...*,,+),*$**(*))'(##(#&"$###""#"
- at 30BB2AAXX080903:3:42:565:1695#0
-GGGGAGGGCGTGCTGGGGTCCCCGGAGGAGAAGGCCCAGCACACGCCTGAGTGGACTGAAGCCTCCGCCTGTCCAG
-+
-6777778888888888888803887177154,41--//.0/..,.*,,-+-)*+*()*)'''#''&'&%%%%$%$%
- at 30BB2AAXX080903:3:47:15:1542#0
-CTTCTGCCTCTGCAGGCTCCCACAGAAAACACTGCCAGGCCACCTCCATCTGTGTGTTCATTTGCTCCTGCGCACA
-+
-677777888888888888888888777&25554232.0100...).-+),)***()#)(((()('&'&""$"$#$#
- at 30BB2AAXX080903:3:49:634:380#0
-CCTCGAGCCATTGTTTGCAGGCGGGGGCTTGGCCCCTCTCTCCTGGGCCCCTGAGCTGGTGGGAAAACGCGNGACA
-+
-6777778888888888888888887777255544320200.//,,.-,,-,*+(+()*)'))(''''"$#""#"#"
- at 30BB2AAXX080903:3:47:244:560#0
-TCAGGGGAGCCGGGAGCTATTTAACGAGGTTTAGGGTAGGCTCCCAGGTCACTGCGCAGGACTGCTCCGCACACGC
-+
-6777778888888888888888887757655544320110///..,--+,,,+*)*))))(('((''"$""#####
- at 30BB2AAXX080903:3:42:1715:493#0
-AGGGGAGGCTGCTCCGTTACAGGTGGGCAGGGGAGGCGGCTCCGTTACAGGGGGGGAGGGGGGGGGGGCAGCGCNA
-+
-673177488/.888888183,88,171824153-2+).0##++&%$&#$,*$*)(&#'''#'####%$#""##""#
- at 30BB2AAXX080903:3:46:948:1513#0
-GAGCAGCCAGCCGGCTCTGCCTTCACGCCCTCCACAGGGAATCACAGTTATCTCACTCCCTGCCTCACNGCGCGGC
-+
-6777778888888888888888887777655544322212///..--,,,+++****)(*)((((('"""""#""#
- at 30BB2AAXX080903:3:42:43:813#0
-GGCGGCTGCGGTGGACGCTGGATATGAGGGTGGGAAGGTTGCCGTCCTGGCTGGAGAACGGGACCGGNATGCTCGC
-+
-677777888888888888888884771765'5440222%00*,.)(,,,-*'+%(*&)#)#('#''&""""#"#"#
- at 30BB2AAXX080903:3:34:375:1494#0
-TCCTCCTGCCTCTCTGGCTGCCTGCCAAGGCTGCTGGTGCTGAGTGGAGACGGCACCGTCCCCTGGCNCTCTGCNN
-+
-67777788888888,888/8'8387#)305.340322$1*//),,--',+)+%*'&)(#((''#&'%""%%%""""
- at 30BB2AAXX080903:3:58:114:1203#0
-ATCTGTGTCCCCCATCCATGGCCCCCATCCGCGTCCTCGGGCACCTAGGAAGGCCCTTAGATCGGAAGCGTCANNA
-+
-677777848888888-88888883779&)5554&23001./.,.-,*,,+*++')'((()&'#((%&'"%"##""#
- at 30BB2AAXX080903:3:33:1543:42#0
-ACAGTGGAAACTACCCTCTCCGTTCTGTGGGGGGCTAAGGCCTCCTCCTAGCCCGGGGGAGGGGGCGNTCGCCANN
-+
-677777888888888888/888'87777655544-52.11,/.-.,+-)&(+)$*)))(#((#####"$$"#$$""
- at 30BB2AAXX080903:3:50:1576:91#0
-CCACTGCTCAGGCCCCTGAGAAGCCATCGTCTCCCCCACAGCCTCCCGTGCCCGAGCTCGGTGGGCAGTGAGTCAA
-+
-67777788888888888888888877776.5544522210.//..--,+,++%*))*))()'(((&%%"""""#"#
- at 30BB2AAXX080903:3:3:1499:703#0
-GATGGCTTCTCAGGGGCCTGAGCAGTGGTGCCTGGATCCGTGTGTGGCCAGGGAGATCGGAAGGGGGGNCGTCNCN
-+
-67777788888888888/88888871779532441./')0)/./-,,*&&++#(*&(#()#%'#'#'""$"##"#"
- at 30BB2AAXX080903:3:58:307:224#0
-CAGTGGTGCCTGGATCCGTGTGTGGCCAGGTGCCCCCCGCCGCCCGCCGGGCCCAGCCCCCCGACCTCGNGCGNNC
-+
-677777888888888888381848777365,51/2222*00/..,+,,,+**#*'('(#(&(''#&%%&""$%""$
- at 30BB2AAXX080903:3:4:911:601#0
-GGGAGGACCTCAGGAGAGTGAGCTGGGCCTGGCCTGGGCCTCCCCTCTGCCACCTGCTGGGCTGTGTTNGATCNGN
-+
-67777784884888888288084677410440.,3212/0/**,-.,,,(*+*)**()(''#((''#$"#"%#"""
- at 30BB2AAXX080903:3:53:788:2041#0
-GGCCCAGTCCTGCCTGAGCTAGCACCCTGGCGTGGCTGGCATGGCCTTGTCCACCCGCCCAGCCAGGCACGCGGCG
-+
-67777788888888888888888877776545443322&%.--#,,(*))$(%&*#'&((#'''###$"#$"$"#"
- at 30BB2AAXX080903:3:38:1522:1373#0
-GACAAGGGCATGACAGCCACGCCAGGGTGCTAGCTCAGGCAGGACTGGGCCAGAGAGGAGGACGGGGCCCTCGCTG
-+
-677777888888888888888883777/655544223210///-,,-,,,+*+)+)*)))((((#'(""$##"#""
- at 30BB2AAXX080903:3:49:1121:995#0
-CTTGCCCAACAGGTCACCTGCGGGAGGGTAGTGAGTGCCCACCTGCATCTCAAGGAATGGAAGGGGACATCCGCCC
-+
-6777778888888888888888887777655544322011./...-.-,-+,****))))(((((('%"#$#"#$#
- at 30BB2AAXX080903:3:42:623:814#0
-TCGCTCAGTGCTGACACAAGCCGGCGGTAAAGGGCCTCCCGGCCCACGCTGGGTCCCAGCTCCCGCGGCAGCACGC
-+
-6177718888888888+8838888.77$*4$,4$*0)-&*/.'&,'"))+$')$')(###&#''#'#$$""#"#"$
- at 30BB2AAXX080903:3:34:1296:1102#0
-CGCCTCTACCACCTGGGCCTCCCCAGCCACGGTGAGGACCCACCCTGGCATGATCTCCCCTCATCACNGCATCANN
-+
-67777788888888888888888877776555-1020/./0-/-,)+-,+(+'***)()(&((#'%'""$""%$""
- at 30BB2AAXX080903:3:33:1275:1431#0
-GGACCTAGGGGACATGGAGGTGTGGCCCGCCCCAGGGGGCATGGGGCAGGACGTGTGGCAGAGGGGGNTCACAANN
-+
-677777888888888888888888777765554432221-.//..-,+,,**+'*(*)(()'(((('""%"%""""
- at 30BB2AAXX080903:3:57:203:182#0
-GGAGAACGTCCTGAGGTGGGGTGGACAGGGTCAGGGCCGACCCGGGGGAAGGGGCAGCCCCTCCAGCTGNATACCT
-+
-677747888888888888888888772765/51412221/0///---,)),*+**(*))()&'(&''"&"$&###"
- at 30BB2AAXX080903:3:2:1758:558#0
-CGGGTGCGCATCCCCTGGGAGCCCGCGTGGAGGCTCCCGGAGCCGGCCCCGGCCCCTCCCGGGGCCGCNCGTCTAC
-+
-677777888888888888888888777-6/354/10)*(&&#+,'+&++%$%)))%#######&###$""%"%##$
- at 30BB2AAXX080903:3:56:666:68#0
-GTTGAGTGGTGGCTCCTGGAGATTTGTGTGGCCCCACCCCTACCCCCGGCCACCTCAACACCGAGGCGTGCCGTCG
-+
-6777778888888888388884887757655544301210.+/-.-.,,+(++*&*%))((%'''('%"$##"##"
- at 30BB2AAXX080903:3:47:1097:1460#0
-CTCCAAGGCTGGCTTCTTCCTGATAAAGCAAAATTTATGTAGCCTCCATCTCTCCCCAGATCGGAAGTAGGTGCAA
-+
-67777788888888888888888877776555443222110///..,,,,+,+*+*)))())(((('"$""""#""
- at 30BB2AAXX080903:3:38:1185:987#0
-GAGAGGGCAGGGGCTGGCGGCCACAGCAGGGCCAGGCATCGCCAGACCCACCACCAGGGCCCCATGTGTCCCTCTC
-+
-6777778888888888888818-8077045514/32/0101./,-,,,,)+**)))(()((()(''#""#######
- at 30BB2AAXX080903:3:2:361:1667#0
-GCCTGGGAGAAGCTGACCCGGGAAGAGGGGACACCCCTGACCTTGTACTACAGCCACTGGCGCAAGCTNCGTNACT
-+
-6777778888888888888888.671776355181200*.-.,,-',+,,++****))(((((''('""#%"""##
- at 30BB2AAXX080903:3:42:1683:1627#0
-CTGGGGGGTTGGGGGAGTTCAGGGTCATGCCTCACCCTGGGCAAACCCCCACATGTAGCTGGGGCTATACCCTGCC
-+
-677777888888888888888888777763551312021./1.--,,-,,***(+))))((((('%'%$%$####"
- at 30BB2AAXX080903:3:41:65:1885#0
-TTCTCCTGAACCTTCCCAAGCAGCTGCTGCACCTGCCGGCAGTAGTTGGCCACCTTGCACTCCCGGGTTCTACCGC
-+
-6727/7888888888+88888888777765511132.011//.+-+-+,+*+*)&))(((('((''&""##"##"#
- at 30BB2AAXX080903:3:35:258:206#0
-AAACAGACCTCCCGTGGGGGCCCAGAAGGACCTTCTGAGGATAAGGAGAACCCCCTCCCCCACCCCANCTCTAGNN
-+
-6777778888888888888888887777655522322,10,./...-,,-****)(*)%')(((('%""$%"##""
- at 30BB2AAXX080903:3:54:1451:912#0
-CGGGATGGCCTGGGGAAGTGTGCGATCAGCGTACCAGCCTGAGCCAGGGTCGGCATGCTCAGTCCCACAGCCGCTG
-+
-67777788888888888888888877776555443221100///----,,+++***)))))(((('''&"%%##""
- at 30BB2AAXX080903:3:40:578:806#0
-TCCTGAATGGCTTAGAACCCCTCATCAGCCCCTCCAAGGGGGCCTCACGGGGCGCGTTGCCAAGATCTGTGATGNA
-+
-67777788888888888888888877776555443212100/.--.,,,,,+****)()''((((&#"$$#%"""#
- at 30BB2AAXX080903:3:56:1525:1088#0
-GGCCGAGTGCATCAGGGAGAGGCTGGGGCTGGGCACTCAGGCCCCTTCCCCACAGGCTGTCAGGGCACACACCCCT
-+
-67777788888888888888888877773555411020200.*.-++*,,+*+())%$)(((&'(#'$$&"$###"
- at 30BB2AAXX080903:3:33:1146:1424#0
-TTCGGACTCCAATCTTTCCCTACCGGAGTGGCATGTGCACGTGCAAAGATGCATACACACAGGGACANACACGTNN
-+
-67777788888888888,88888&&77765554432221/0..,,---,(+++**)*))(()(#(''""$#"#"""
- at 30BB2AAXX080903:3:4:1642:1404#0
-TACGTGTGTGCCTGTGCATGTGTGCGCCTGTGTGTACCTGTGTGTATGCATCTTTGCACGTGCACATANCAAANAN
-+
-6777778888888888888888887777655544322210///.--.--,,,++**)))))))(('#$"%#"""""
- at 30BB2AAXX080903:3:3:1569:678#0
-GAGTGGCATGTGCACGTGCAAAGATGCATACACACAGGTACACACAGGCGCACACATGCACAGGCACANATCTNGN
-+
-67777788888888888888888877776545441222.00/..-.--+,)*(+)*()()'((('(#$""%%$"#"
- at 30BB2AAXX080903:3:43:249:880#0
-TGCATCTGCATGTGTGTACTGTGCGTGTGTACCTGTGCGTGTACCTGTACACTTGGGTGCATGCATGCACGTCTGC
-+
-67777788888888888888888877776555443222100//----,+,-++++**)))(((((((&%&&#%$$#
- at 30BB2AAXX080903:3:1:1521:96#0
-TGGGCACCTATGTGCATACACACGTGTCTGTGTGCATTTGTGTGCATGCATTTGCATCTGCATGTGTTNCANTCTG
-+
-6727+7888888882888188888.77165454423%200./..----+,,)+*)**$)('(((('%""$#""$#"
- at 30BB2AAXX080903:3:57:1037:1080#0
-ATGCAAATGCATGCACACAAGTGCACACAGACACGTGTGTATGCACATAGGTGCACAAAGGTACATAGATCCCCTC
-+
-6777778888888888888888887777655544322210///..--,,,+++**+)*)))'((((''$"$$####
- at 30BB2AAXX080903:3:37:315:1077#0
-CAAATGCATGCACACAAGTGCACACAGACACGTGTGTATGCACATAGGTGCACAGATCGGAAGACGGCGCAGCCAN
-+
-67777788888888888808888877776555142222100//.----,,*++***)*))()()(''$#%#"$##"
- at 30BB2AAXX080903:3:34:1362:466#0
-TGCATGTGCGTCTGCGTGTATCTATGTACCTTTGTGCACCTATGTGCATACACACGTGTCTGTGTGCNCTCTCTNN
-+
-6777778888888888888888887777:555443222100//..-----++++**)*)))))('('"$%#"%$""
- at 30BB2AAXX080903:3:39:1328:1242#0
-TGTGTGCATCTGTGCGTGTGTACACCTGTGTGTATGCATGTGTGTACCTTTGCGTGAGATCGGAAGACCTGTCGCA
-+
-67777788888888888888888877776555443222100//...-,,,+++****))))()((''"$#$"""$#
- at 30BB2AAXX080903:3:45:97:971#0
-GTGTGCCTGCAGGTGTGTGCATCTGTGCGTGTGTACACCTGTGTGTATGCATGTGTGTACCTTTGCGAGGGGTTGG
-+
-67777788888888888888888877776555443222100//..---,-,+++**)*))(((('(&"%$""""##
- at 30BB2AAXX080903:3:3:477:2041#0
-CCACCTCCCTTCCCAGCCTTGAGTTTCTAAGGCTCAGCCAGACAGATGCCCCCTCCTGGCCAACGATCNCGGNNCA
-+
-677777888888888888888883237765521,22/12././.-+,+',++)(*)'((((%(&(%''"#"#""$%
- at 30BB2AAXX080903:3:33:1242:952#0
-CTGACCAGGAAACATACCAGTCTGTGTACAACTGGCAGTATGTGCACTGCCTCTTCCTGTGGTGCCGNGCAGTCNN
-+
-67777788888888888888888877776555443222100//./-.-,,++*+****)((((((''"#%""""""
- at 30BB2AAXX080903:3:49:205:1069#0
-CGCAGGTGTATGGCGAGCTGGAGGATGTAGAGGAAGGCGTGCTGGTAGGCCATACCTGGCACAAGGACAACACGTA
-+
-27777788888888888/888)88'77745554432221-0././+--,,++%*)*&)*))()'(''%"##$#""#
- at 30BB2AAXX080903:3:39:564:1845#0
-CCTGGTGCCCTCCCCTTCATCAGTTTCATGCAGTGGACCTTGACGGAGCTGCTGGCCCTGGAGCCGGGTAGANTCT
-+
-67707788-88888888888868877716555433220211/.-,.,-+,,+***(()((('('('&"$#%#"""#
- at 30BB2AAXX080903:3:2:1349:1656#0
-TGGAGGAGGACACTGGGTGTTGGGACCTGACGCCATGGCCAGGGGACAGTCCCACTGCCCGTCCCCACNACGTAGC
-+
-67777788888888888-827888777&3.$/441*)10.)..+%-*'*$**#')#'((('#(''('&""""#"""
- at 30BB2AAXX080903:3:8:571:770#0
-TTTGCCTGGCTGGGGAGGGCTGTGCTGGCCCTGGGGCATCCCTGCTGAGGAGGCTGGGGGGCCACCANTCTACTNN
-+
-6777778888888888888888887777635544322210....---,-,,++)*+**)))&''%'&""$#%%#""
- at 30BB2AAXX080903:3:4:1029:1789#0
-TTCACTTCTGTAACTGAGCACCTAACTCACGGCTCCCCCGAGGTGCTTTGGGAAGAGCTGGTGGCCACNCGCANGN
-+
-677777888888888888888882777765555632221/0..(,.,,+,*+*)*())(((#((&('%"$#$#"""
- at 30BB2AAXX080903:3:41:1592:2006#0
-GGTGCCCTGCTTCCTGACCTTCCCCAAGCAGTGCCGCATGCTGCTCAAGGTGGGTGGCCCAGTCCCCCGGCTCGAC
-+
-672777888888888888188318377785264/-0/.10,./)-,++++(*'*#)(#&##'###%#"""%"#""#
- at 30BB2AAXX080903:3:34:1734:1975#0
-TGGTGCCCTGCTTCCTGACCTTCCCCAAGCAGTGCCGCATGCTGCTCAAGGTGGGTGGCCCAGTCCCNATAGACNN
-+
-677777888888888*888888887727635554122-2/0+./,,+,,,+$**+#))'#('('&'%"$"#"##""
- at 30BB2AAXX080903:3:47:1091:942#0
-ACGACGGTGTTGGCGGACGTGCGGCGGCACATCAGCGTGCTGGCGCCCCACTTCCTGACCCTCCCCAACGACTCAT
-+
-6777778880888888#8828828/7731330-3320#1%.//#.**++&+*)$*&'((('''#(&%""""$"#""
- at 30BB2AAXX080903:3:53:717:875#0
-CTGGTGTCCTGTCTGTCGGAGACGACGGTGTTGGCGGCCGTGCTGCGGCACATCAGCGTGCTGGTGGCGCGGCGGN
-+
-6777778888888888888888887777355544222110-/+,-*,-&(+'(*'*')%)##((%(%"$#"""%$"
- at 30BB2AAXX080903:3:52:225:1682#0
-GAGCAGCCTCGCGTCCGAGCCGTGGGGCCTCCCAGCCAGGGGTGGGGGGTCTCTCTAGATCGGAAGAGNGTCGAGC
-+
-6777778888888888888888887777655544322-100/#..-$-,&++++))(*)(&)('#('$"#"""#"#
- at 30BB2AAXX080903:3:53:951:1893#0
-ACCCCTGGCTGGGAGGCCCCACGGCTCGGACGCGAGGCTGCTCAGCATGTTGGCGGGATCGGGAGGTGCGACCGAA
-+
-64777(88888888/88/882788777/65/5-4(32*./&.+,,++,+&+(*$*#)&&(&(#''##&$%%$#$"#
- at 30BB2AAXX080903:3:40:192:864#0
-TGAGCCACCAGGTCAGGGACCCCTGTCGAGGCAGCAGCTGTACCGGAGGGAGTCAGGCAGGGGGGGGTAGACGCCC
-+
-67777788888888888888888877776555543221100.+..-+-,,++*%*+)(#)#)(('('&"""#"###
- at 30BB2AAXX080903:3:35:1530:450#0
-CCTGGATGCCAGGCTCCCCCCAAGCTCACCAGCACTGTCCGTGACCTGGAATTTGTTGGCCTCAGCANCGCGACNN
-+
-67777788888888888888888877776555443220100-/-.---,,,+++**)*)))(((('%"%"$"#$""
- at 30BB2AAXX080903:3:55:1513:664#0
-TGAGAATTGAACTATGTGGTGGTTTGAGAGGAGGCACGAACGGGTTTGAAGGTGGTGAGATTGGGAACACAGCCAC
-+
-6777778888888888888888887777655544*22220.//&---,+,,+'+**)())&#((%(%$$&$"$###
- at 30BB2AAXX080903:3:43:535:1867#0
-GAAAGGAAGGACAGAGGGGCTGAAGAGAGAGTTGCAGGGGAGCCGAGTTGCTCTGTTAGAAGGAGCGGAGGGTGCG
-+
-67777788888888888888887873776355441122101/+..--+,,+,+**)*))()))((&'&"&""""##
- at 30BB2AAXX080903:3:39:758:317#0
-TTTGTGGGAGCTCTTTGCATAGGAGCCCCGCCGTTGCAGTCTGGCGTCCTCGCAGGCAGATCGGAAGAGGGGGGCA
-+
-677777888888888888888888777765554132221/0//..-,-,-+++*+**)))()))'('"&%%#####
- at 30BB2AAXX080903:3:57:1081:929#0
-AGGACCCGCGGGCTTAACGGACGCGGAGACTGCCGGAGGGCTGCTCGGCGGTGGCGGGCCGGCCAGAGTGTACACA
-+
-67777788888888888888888877776555443202100-/.-.,-,,+$+*)*)'(('&(%#'&%$%"##$$$
- at 30BB2AAXX080903:3:3:685:939#0
-AGAAGGGGCGGGGGCCGCTTCCGAGGGCCGGGGGAGGTCGGGACTCAGGGGCGGCGCTGGGGGCACTANAACANGA
-+
-67777788888888888488184,777./50545111,&///#(,+(-,$+$%*#)%&)&((###%%'"""$$"""
- at 30BB2AAXX080903:3:44:116:1187#0
-GCGCTGGCGCATGCGGCTCATGGCCACGAAGGCATCGTGGTAGGGCCGCTTGGAGTTGTGGGGCACGCCGTGAACG
-+
-6/777788888828883888888827670055/01(2/1/,..#-*&,$(,+)$*)((&()(%&%#'%$"""#"##
- at 30BB2AAXX080903:3:46:267:1348#0
-CCGGTGTCCCCCGACCCTGTGCCTCCCTCACCTGCCTCTCGGTGCCCCGTAGACTCTGCTCCCAGCCGTGCACGTC
-+
-67777788888888888888888877776555443221100//.-.--,,++++*)))))((((('''""##%"##
- at 30BB2AAXX080903:3:40:783:59#0
-GCTGCAGCACTTCGTGGACGTGGCCAAGACCGAGGAGTTTATGCTGCTGCCCCTGCAACAGGGAACACGTAGGCTG
-+
-677777888888888888888888774765550432201////.*.-,,++++'*())'()(#(&%'""%$""#"$
- at 30BB2AAXX080903:3:2:871:1669#0
-TGCCTAGGACGCCCCTCTGCTCAGGCAGCAGGTGGAACTTCAGGGCCTCGATGAGGAGGTCCTTGCCANGAGGCGC
-+
-67777788888888888888888877756/45&22-10000/....,(,,((+&*)&))''(#&(&#""""$"#"#
- at 30BB2AAXX080903:3:46:1730:424#0
-GCCGGCCGAGTACAGGAGTCCATGCAAGGCGGCCACACCCAGGCAGCTTCGGCTTGTGCCCATGGACGTCCTCTGT
-+
-67777788888888888888888877776555443211000.//-.-++-*%+*)*)))))(''(''""#"$#"#"
- at 30BB2AAXX080903:3:59:670:1635#0
-TCATAGCCGCCGGCCGAGTACAGGAGTCCATGCAAGGCGGCCACACCCAGGCAGCTTCGCCTTGTGCGCNTTCACA
-+
-67777788888888888888388877476555333220101..-,,,++,+****()))((&(('(%"$"####$$
- at 30BB2AAXX080903:3:1:818:1064#0
-AGGCAGCCAGGGTCCTGTGCCCACCAGCGGGCCCTGCCTGGTAGGACTTTGCGGTCTGAGTTTGACTCNCANGCGT
-+
-6777778888888888888838287715641232-5/-00-'*,,*+(++*)+)#('('(''((&%#%"#"""$""
- at 30BB2AAXX080903:3:51:1465:1764#0
-CAGCCATTCCGCTGGGGAGGGCAGGTCCTGGGGCCGGGACGCCTTTCTGTCAGATCGGAAGAGCGGTTCAGCAGGA
-+
-6777778888888888888888887777655541/222/00-...-,-,,*+++*))))()((((('"$"####$"
- at 30BB2AAXX080903:3:3:1580:1279#0
-TGGGAGTGGGGTCTCCACGGTGGGGGAAGGTGGGGATGCCCCCCAGGCGGGCCCCCTCACCCACCAACNCTACNTN
-+
--/7777.888888888888808757745/5'111/+-0&-,))+'',&%(+'#'&##&#%'#%%'##""#""""""
- at 30BB2AAXX080903:3:51:994:41#0
-AGGTGTGAGGAGCTGTCGTAGCCGCCCACAGCATACAGGTTCCCATCTGCCGGAAGTCAACACACCCGAGATACTC
-+
-67777788888888888888888877776555443222100//..---,,+++)**()))))(('('"$#"""#"#
- at 30BB2AAXX080903:3:54:1043:691#0
-GCCACGTACAGGGCACCCTCCAGCACGGCCACGCCCGCTGAGCTGCGTCGGCTCAGCATGGACGCCACCGCACCCC
-+
-6777778888888888888888887777655544322210///..--,,,+,+*****)))((('('%$#&&#"""
- at 30BB2AAXX080903:3:35:31:1731#0
-TGCCACGTACAGGGCACCCTCCAGCACGGCCACGCCCGCTGAGCTGCGTCGGCTCAGCATGGACGCCNACACGCAN
-+
-67777788888888888888888877776555443222000//..----,+++**))))))((((''"#$#$"%#"
- at 30BB2AAXX080903:3:58:1374:2026#0
-GGGGGGAGGGGCCACACCACAAAAAGGGGTGGTGGCGGGACATGCTCGCTGAGGGTGGGGGAACTCCCATTCTCCN
-+
-677777888.888888,882848477776.51240.21.-$*-,%'"+$&+'**'*'))#(#'####&"""#"$#"
- at 30BB2AAXX080903:3:42:719:901#0
-TGGTCCTCGGGTTGTACTTCTCGATGGAGTTGAGGCTGGAGCTACCGTCGTTACCCCCCACGGCGTACCACCATCC
-+
-677777888888888888888888777765554432221/00..-,,,,-*,)*&*)*)(('(((#'&"&%$###$
- at 30BB2AAXX080903:3:37:142:97#0
-CACCAGCCTCTGACCCACCTACCACCAGAGGCCTGCAGCCTCCCACATGCCTTAAGGGGACCGTGGCTGATACCNN
-+
-67777788888888888888888877776555443222000/...---,,,++&**))))()(((''"""""##""
- at 30BB2AAXX080903:3:38:1745:401#0
-CTCCACTGCCTGCATGGGGGGCGCGGGGAGTGACCAGGCGGGGGCCTCACCGCCCCAGGGCCGCTGCCAGTTCANN
-+
-67777788888888888888888877774545543222100/,.-.*-+,+*+***''((('(#%&&$"#""#"""
- at 30BB2AAXX080903:3:48:1343:884#0
-GGTCCAGGGTGAGGGGTGTGGGGGGGTGCCCTGAGATGCGCAGGCATCTGGGAGCTGCAAGGCAGAGCTGCGCGCG
-+
-677777888+8888888888888877276552443212200./.--.-,-,,)***))(('((((&'$"$%$$"#"
- at 30BB2AAXX080903:3:39:1428:819#0
-CCACATCGTGGGCTCTGGGGTTCGGGCTGGGGAGGACAGCCTTGCCCCCGAGCGCGCTGCCTGGCTGTGNTGNTCA
-+
-6777778888888888888888$877776555343+-011,*&--.+,,+*''*%'*&)'&((%#'#"&"%#""##
- at 30BB2AAXX080903:3:36:72:1028#0
-CCATGGGGAACAGCCACTGTGTCCCTCAGGCCCCCAGGAGGCTCCGGGCCTCCTTCTCCAGAAAGACTATCACAGN
-+
-677777888888888888888888777165554431/2200//..---),+,+(*+*))))((((#'$&#%#%"""
- at 30BB2AAXX080903:3:47:900:319#0
-AGGAAATGGGGCTGGGGGAGGAGCTCTGGGCCAGTCCTAGAGCCAGTGCTCCGCGGCCCTGTACCTGTGTCTGCTC
-+
-677377888188888888388642-80.0-73.1/.0.00,-+,-+*,++**+)))(#(#'#(&''&"""##"#"$
- at 30BB2AAXX080903:3:56:327:1058#0
-CACTGGGTGCAGAGCCCAGGTACAGGGCCGCGGAGCACTGGCTCTAGGACTGGCCCAGCGCTCCTCCTCCCATCAC
-+
-67777788888888888888*888767765554/3222,00//.%&,-,&&,+&)*))#%(#'(#''"&"%""%#$
- at 30BB2AAXX080903:3:39:478:1119#0
-CTTAGCACCGACCTGACCCCGCTCACTGGATCTATTGATTTGTCCCGTCGTGTGTCTCTGCCGTGGGCATATCTCA
-+
-67777788888888888888888877776355443222100//.,---,,+++***))))()((('&%$%#""$$"
- at 30BB2AAXX080903:3:56:497:804#0
-TCCAAGAATTCCTTTTCTGAAAGCCTTTCTAAAATTCCAGCCTTCCCTGATCCTCTGCACTCATCCCGTCCTGTCT
-+
-67777788888888888888888877776555443222100.-..--,,++*+)*'*)&&%('('''"$$&%"$#$
- at 30BB2AAXX080903:3:3:1247:224#0
-TTAACACCTGGTTCTACAAAAAACAGACACAGAAACACACCGATGCCCTGATTCGTAACGTTTGCCACNATCANCN
-+
-6777778888888888888888817777655544322/10,//..-*,,,+,+(+***()))))&&(""""%#"#"
- at 30BB2AAXX080903:3:54:1558:957#0
-GGTGTGCATGTGTATGTGTGCACGTGTGTATGTGCACGTGTGTATGTGTATACATGTGTATGGGTGTCACAGAGTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$$%&&"""$
- at 30BB2AAXX080903:3:37:431:514#0
-TGTATTTGCGTGTGGATATGTATGCATGTATGCACGTGTGTGCATATCTGTGTATGTGCAACTGTGTACTCGCACN
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))((('&"$##"$%$"
- at 30BB2AAXX080903:3:35:324:1083#0
-TGTGTATGTGTGCACGTGTGTATCCATGCATATGTGTGCGTGTGTGTACATGTGTGTATAAGTGCGTNTCTATTAN
-+
-67777788888888888888888877776555443222100//..-----+++****)*)(((((''"&$""""#"
- at 30BB2AAXX080903:3:59:243:1142#0
-AGGCAACATGCATGCATCCATATATGCGCACACATACACATGTATAAATGCACACACACACACATGCATGCACNNC
-+
-67777788888888888888888877776555443222100/...-,,,,++++****)*))((((''$#&%$""#
- at 30BB2AAXX080903:3:51:782:761#0
-TTATACATGTGTATGTGTGCGCATATATGGATGCATGCATGTTGCCTGCATGTGCACGTATCGGGTGATGCTCGGC
-+
-67777788888888888888888877776555443222100/..----,-+++***'))))((((''"""##$###
- at 30BB2AAXX080903:3:2:411:202#0
-CATACATATATGCATACATGCATATTCGTGTACACGTACACGCACACACACCCGATACGTGCACATGCNAGACACT
-+
-67777788888888888888188877476555342210.2////--,,*,+*)****))((((#'('%""""$##"
- at 30BB2AAXX080903:3:42:148:1556#0
-TGGGGGGCTGTTCTTCACATATGTGTTGTGTGGCTATGCACAGGCAGACCATGCTATAGTCCTGTAGNCTTGTGCT
-+
-67777788888888888888888877776555443222100//...--,,+,+***)*))')((('&""%"$#$""
- at 30BB2AAXX080903:3:39:481:1768#0
-GGCCATGGCCCCACCCCATTGCCCACCGCCTCACCTGAAATGTGAGTCCTTCCGAGCCGTGGGCCTGCACGCCACA
-+
-677777884888888833888782724765622/-31'.///..,-,*+,+)')')'()'()(#&''$"#######
- at 30BB2AAXX080903:3:39:150:1415#0
-CAGGGTGAGAACCTCAGGGCGGGCAGGGGCTCCTCCATGTCACAGCGGAGACCAGACAGATCGGAAGCGAGGCACT
-+
-67777288888888888888888877776655442222100//..---+,+'))***)*))(((&''%$#"""$#"
- at 30BB2AAXX080903:3:52:56:1514#0
-CCAGGGTTGGTGGTAGCCCCAGGAGACATGGGACCCACTGGCCTCCCTCAGGGTGGTGGCCTCGGTGCCTCGGCGC
-+
-67777788888888888888888877756555441222100/./---,,&+++(**(*)((('((%'$$""%"#"%
- at 30BB2AAXX080903:3:34:1535:321#0
-TCCGCGTGGTGTGCGCCAGCTACGAGGACTACGGTCACTGGCTGCTGTGGCTTCGCGCCGTCCCCCCNCGCCCTNN
-+
-67777788848888888888888877776343443222./0...)+-&-$+&)'()(&#%&%##'''"&"#$##""
- at 30BB2AAXX080903:3:41:166:573#0
-GTGCGCCACCACGCCCGGTCTGCTGCCCCCTTTTTACCACTGCCCAGGACCTGGGCTGTGGGGCCTANTGATCACT
-+
-67777788888888888888888877776555443222100//..----,+++**)*)*))((((('""$#"%"#"
- at 30BB2AAXX080903:3:49:560:1967#0
-GCCCAGGCTGCAGTACAGTGGCACGATCTCGGCTCACTGCAACCTCCGCCTCCTGGTCAAGCGATTCTCCTCACTG
-+
-6777778888888888888888887876645534/2.02//.'.-+,-,,,)****(((()((('(%"$#"$###"
- at 30BB2AAXX080903:3:8:699:670#0
-AGAGAAGAGGTGGCCTAGGCTGTTTCTAGCCGAGAAGCCCATTTCTCCCACCTCTGCCCTGCAGATCNATACACNN
-+
-6777778888888888888888887777635544312//0/1..,--,,,++****(()()((((('"$$##%$""
- at 30BB2AAXX080903:3:42:431:624#0
-TTTGGGGTTCCAGGTCTCCTCTGCCAGGGAAGGTTCGCCCGAACCATGGCTGCCTCTGACAGGTGAGTAGNGCGCG
-+
-677777888888888888888888777765554/3021100./-.'-,,,++%**)())(()(&(%&%"""%#$#%
- at 30BB2AAXX080903:3:55:1179:1147#0
-ACCGACCATCTGGTAGGGAAGGCAGAGATGTGTCAGCCTGTGGGAGGCAACAGGCACTCACCCCAGGCTCTACACA
-+
-67777788888888888888888877776555443222100//..---,,,++*+****))()((('""###""#"
- at 30BB2AAXX080903:3:55:813:1384#0
-TCCTCCCACCAGAAGTGCCCCCAGCTTGGAGGGCCTGAGGCCAGTGGGGGGCTTGTGCAGTGGATCTGGNGGCCCA
-+
-677777888888.8888888888877776555441222100//.,----,++++*')))*')(((''"""$""###
- at 30BB2AAXX080903:3:60:870:880#0
-CCCCATCCAAAGGATGCCCTGGCCAGCGAGGCTGGGTCACAGGTCAGGGAGGTCCTGGCAGATCGGAATGGCCANN
-+
-67777788888888888888888877779555443222100//./,--,,++%**))*)))(((('&%%"$$##""
- at 30BB2AAXX080903:3:55:817:1350#0
-CCTGTGACCCTCATGCCCTCTGACCTCACATACTCTGACCCTGCTGACCTTTCTCTGTCCTCCGACCCTCACGCCC
-+
-67777788888888888888888877776555443222100//..----,+++***)*)))))(((#$%%%&%#"%
- at 30BB2AAXX080903:3:54:752:1805#0
-TGTGAGGTCAGAGGGCATGAGGGTCACAGGTCAGCAAGGTGTGAGTAGCACAAGCCAGGGTGCCCCGAGAGCGTAC
-+
-677777888888888888888888777765554432221/0//..---,-+++*)*)))))()(((&$&"&"###"
- at 30BB2AAXX080903:3:1:281:879#0
-AGATCCCTGGACAGTGTGTGCCTGGGATCTGGACGGGCTGTGGGATCCGAGAGCACGTACCTGCCCGCNTCNCTGT
-+
-6777778888888888888888887797655511322120,./-,+++,*,*+&'')(&''&('#&'"""#"#"""
- at 30BB2AAXX080903:3:36:139:1021#0
-GCTAGAGGTGGCTTCATCTCCACCTGTCTCGGAGGCTGTGCCGAGGATGACCGAGTCCAGCGGGCTTGTTAAGCAN
-+
-6777778888888888888888887777655544322210.//..---,-+++**)))))(((((''%&"$""$#"
- at 30BB2AAXX080903:3:43:1425:1818#0
-ATGTGGCCTTGCCTACAGCAGGCCCAGTGGCTAAGCTAGAGGTGGCTTCATCTCCACAGATCGGAAGAGGACTCCC
-+
-67777788888888888888888877776555343.22120/+..&+-)++)*&*((())'%((&%'&$%"""#""
- at 30BB2AAXX080903:3:41:1248:213#0
-AGACACAGCCATGTCCGTGTCAGGTTGCGGCTCAGAGGCAGGGGGAGACACAACCATGTCCCCGTCAACGGGCGTA
-+
-677777888888888888888288/77765564(12220.0/..,.-++))('**)(('(((&'#&%"#%#%""#"
- at 30BB2AAXX080903:3:58:645:1784#0
-GAGGCTCCTGTGTGCCCACCCCCCTTGGCACCCACAGCTCGCCTCTTCTTTCGGCTGGGGCTCCGTGGGNCAGCTN
-+
-67777788888888888888838877776555283220000----.-,,--+*+)**))*''&((%&'&"$"#"""
- at 30BB2AAXX080903:3:55:692:1757#0
-GCCGGACCAGGGCAGGATGAGAACTGGCTGGGAGGGCTGGCGCCGGGGCCGAGGGGCGGGGGAGCGTCTCCCCGAC
-+
-67777788888888888888888877776555-432(010./-/----&$,)+**&(*)#()#(##'$""#$$"##
- at 30BB2AAXX080903:3:60:561:433#0
-CTCAGGGTGAGCCTGTCTTGGCCCTGGGGACCGGTCAGCAGACACCCAGCACGTCCGCACGGGCAGAANTAACANN
-+
-67777784888888888888888877776455442212100./-.--,,,+++(*)**)))(()(('%""####""
- at 30BB2AAXX080903:3:44:1788:613#0
-CTGGGTGTCTGCTGACCGGTCCCCAGGGCCAAGACAGGCTCACCCTGAGACCTGCTGACCGGCTGCTGTGCGGCCG
-+
-677777888888888888888888777765554432221/0//...-,,,+,+**))))*((('(&%&#&"$#""#
- at 30BB2AAXX080903:3:60:1629:1886#0
-CCCGGGCACCACCCTGCACATGCCGCCCCTGCCCCACGAGACCTGGGAGCTCACACGGCCTCAGAACACACNACNN
-+
-&777778881881888488888*1717-655.0$20./.0/+).---)+%*)%'*)%#('''('#'&$#"#"##""
- at 30BB2AAXX080903:3:1:1534:865#0
-TCCAGCTACAGTACATGAGGACGACTTCCTGGCACGGGGCCGGGCTGAGGTGGGGTCAGACATGGGCCNCGNCAGC
-+
-67777788888881888888782876/1.3002-+3210.01,-*+-',,$+**)##()##'#'#&#""#""$#"#
- at 30BB2AAXX080903:3:39:390:1656#0
-TCCCGTGCCTCCGCCACCCGCGGTGAAACCTCAGACCTGCCCTCCCTGCCGCCCCGGGAATGTTCCACATCGTGTG
-+
-+777728888888088-/18/88(772.*/5()4+',21.#..--+,,&+,+*))#((%'((%(##%&$$$%""#"
- at 30BB2AAXX080903:3:48:1788:1277#0
-GGTCAGGACCGGGAGGCACAAGCCCTGGCCGGGACACAGAGGCCATCTCAGAAGCAGGCCAGGAACATTGCTCCTC
-+
-67777788888888888888888877776555433221110/*-.',,,,,)*+*)))#('((#'#&"""%####$
- at 30BB2AAXX080903:3:33:1480:1507#0
-TCTGTCGCCCAGACTGGAGTGCAGTGGCGCAATCCCAGCTCACTGCAGCCTCCACCTCCCAGGCTCANGTATTCNN
-+
-67777788888888888888888877776555443312100/....--,,++*+****))))(((((""##$"#""
- at 30BB2AAXX080903:3:41:316:1689#0
-GTCCTGTACGAAGAAGGGCCCAGCGGACGATTCTAGCCAATGCAACTTACTCTGCAGGGACAGCGGANTCGGCCAT
-+
-6777778888888888888818887747635544222.0.0/..--.--,,*+**)**))(()((('"&$"%###"
- at 30BB2AAXX080903:3:42:727:764#0
-CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCTGATCACGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACCT
-+
-677777888888888888888888777765554423210/0//..-,-,,+,+$*))*))(()((''&%#"""#"#
- at 30BB2AAXX080903:3:57:378:2044#0
-CCACGCCCTCTGGGTAATTTTTTGTATTTTTATTAGAAACGGGGTTTCACCATGTTGGCCAAGATCGGACTATCAC
-+
-6777778888888888888888887'7765551332221*0//.%--,,-**++*)*()#(((('%'%&%""#$##
- at 30BB2AAXX080903:3:44:103:788#0
-ATATGAGATCATGCCATCTGAAAAGTTTCACATCTTTTTCTTTTCTTTTGAGACAAGGTCTCACTCTGTCATGCAG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('(&'"&#$%%#%
- at 30BB2AAXX080903:3:1:1120:1095#0
-CGCCCCACCTCAGCCTGCAGAGTAGCTGGGGCTGCAGGTGCACACCACTATGCCCCGCTGATTTTTGCNCTNTCTT
-+
-6777778888888888885858/8771;4771/1-)10(/.-/,+,$*'(&('&*#&'%(##(&'&%$"%%"$###
- at 30BB2AAXX080903:3:55:270:306#0
-TATTCCAGGTGTGGTTGTGTGTGCCTATAGTCCCAGCTACTCAAGATGCCAAGGCCAGCCTGGGCAACACAGCGAC
-+
-67777748838888888888888877776555443222101/,..---,,+++****)))'))((&'&#"%#%###
- at 30BB2AAXX080903:3:37:137:358#0
-GGTGGGCAGAGGAAGGCAGCGGCATCTGAGACGTTGGGATCACTCTGACCTGGACAGGGCAACGGGGCACTCTGCN
-+
-67777788888888888888888877776505443222+/01/..---+,&++*+)))))()((((#&"#"$""$"
- at 30BB2AAXX080903:3:45:1624:268#0
-GCTGAGAGTGAGACCCTGTCTCAGAAAAAAAAAGAAATCAGTTGACTGTAGATCGGAAGAGCGGTTCNGCAGGGCG
-+
-67777788888888888888888877776555443222100//..----,+++***)*))))((#('"%#"##""#
- at 30BB2AAXX080903:3:45:435:920#0
-GCCCTGGGGTGGCAGCCTCCCTGACGTCCCACTGTCCCCGTCTGGCATTCACACCTCAGTGTCCTGAGGGTGGCGA
-+
-677777888888888888888888777765554432221/0//..---,,+++*(+)*)))'''(('$#"##"#$"
- at 30BB2AAXX080903:3:53:442:1469#0
-GGTGCCCCCTCCAGCGGGGGGTCCTTTCTGCCCTCCCCACCCTGCATCCTGTGGCCCCAGACGTGGGGTGCCCCCC
-+
-67777788888888888888888877776575443222100....---,,+)+**))((((#)#(#'"$"$""###
- at 30BB2AAXX080903:3:35:1021:1097#0
-TGAGGGGGAGCCCAGGACAGCCCCTATGCTGCCCCCGTCCAGCCCGGCCCCTCAGGCTGTGTTTCCTNCCTCGCTN
-+
-67777788888888888888888877776555443222100//..---+,,+*)***()()&((#('""$"#"$#"
- at 30BB2AAXX080903:3:40:375:1791#0
-GAGGCCCCCTTCCCCTTGGGAGCTTGAGACCCCGTGAGGGAGGCCTCCTCAGCAGCACAGGAAGGGACGGGCGTAC
-+
-6777778888888288888888887777632134121200)//),-+,,++,+)*)))()(''((('$""#""""#
- at 30BB2AAXX080903:3:59:346:800#0
-CGAGCCCTCCCACCAGCACTGGCCCTCCAGGCCCCAGTCTGTGCCTCCATCAGGAGAGATCGGAAGAGCGCGTNNT
-+
-67777788888888888888888877776555443220100./.----+,+*++**)))(()('((''$%""""""
- at 30BB2AAXX080903:3:1:448:1126#0
-GGAGGCTGCGGGCAGGGCCGACGCCCTCGTGAGCGACGTCCTTGGCCCCGGCACTCGGTAGATCGGGCNCTNTCTC
-+
--71773.888888++,1().+).(*.--+%,',(*$%,$#&%&('%"&$&%$#&#&&'##'####%#%"#$""$"#
- at 30BB2AAXX080903:3:34:1184:718#0
-CAGCAGCGGGCGGCCCGCGTAGACCTCGGGCGCTGGGGCCTCTGCGGGGGCAGATCGGAAGAGCGGGNCACCATNN
-+
-67777788888888888888888877776555423222.00/../----,++++()**)()()'((#"&##$$#""
- at 30BB2AAXX080903:3:58:1383:65#0
-GAGGGCGTCCCGGCCGACGTGCGCTCCCGCCTGCTGGGCCACCTGGCAGCCTGCCTGAGATCGGAAGAGGACANNC
-+
-677777888888888888888388777763/94122220/11.).,+,,,()+&*)(()(''&('%'%"###"""$
- at 30BB2AAXX080903:3:43:733:935#0
-CCACCCGTGCGCCCCTTCGCCGTCCGCTGACTCCGCCCTCCCGCCTGCCGACCCGGCCGCCAACCTTCCCCCGGCC
-+
-67777788888888888888888877776555443222100//...-,,-++++**))*))''(('&&$%%%$""#
- at 30BB2AAXX080903:3:37:229:351#0
-GCAGGACCTCGAGGAGCAGAACGTGCGCGTGACGCGAGCGGGCTGGTGACGTCACCAGGCACCCGGGTCANCNTGN
-+
-6777778888888888888888887777655544322210//0..-",,,+**())())((((('('$$""""##"
- at 30BB2AAXX080903:3:42:1182:1353#0
-TGTGAGCCCCACTTTGCTGCTGCTGAGTTCGCCAGCGGGTCACCTGGAAGCACGTGGCGACACGGGCCACATGACG
-+
-677777888888888888888888777765554432221/0//...-,-,+++***)))))(((((&'%&&%%#"$
- at 30BB2AAXX080903:3:48:144:1354#0
-CCACGCACCTCAGCCTCCCAAAGTGCTGGGATTACAGGTGTGAGCCACCGTGCCAGATCGGAAGAGCGGTCACAAC
-+
-6777778838888888+888888877776555443222100//..---&,+++***))))))(((''$""$"#""#
- at 30BB2AAXX080903:3:52:820:775#0
-GTCGGCACCATCCTGGGCTGCAGCCCAGGATCCACCCCCACACTCAGAGCAAGGGAACCCCAAGGAGCACGCGCAC
-+
-677777888888888888888888777765554432221000/..--,,-,++**))**)()(((('""#&##"##
- at 30BB2AAXX080903:3:38:1086:618#0
-TGTCCCAGGACAGCGAGGTACGCATGGCGTCTTCCAAGTCAGCCTCAGAAGTCATGTCCTGCCAAACACACCATAC
-+
-67777788888888888888888877776555443222100//./---,-+++*******))(((''&&$%&#$$#
- at 30BB2AAXX080903:3:58:1140:1676#0
-AGTCGCTGAGCCTCTGCCTCTGTGGAAGAGAGGAAGGGATCAGCGAGGAGGGAGCAGGGGTGAGGAGGGCAGAGTN
-+
-67777788888888888888882877776555423222./)///-$--+-+,*+)))())&((((#%&"##""$""
- at 30BB2AAXX080903:3:1:488:1415#0
-TGTTGGGGGGTCTCCTCACATTGGGCCACTGTGGCCGCACTCCATGACCACAGCCAGTGTCCCCAGAANCGNATCC
-+
-6777778888888888888886807777655144352../0...,..,+,+++**))()'((&((''"""""#"#"
- at 30BB2AAXX080903:3:58:198:700#0
-GTGGCGAGATGGCAGCCGCCACCTCTGGGTCAGAGGTTGGGAGGGGAGGTCACAGCCAGCACCTAGATCGTCANNC
-+
-67777788888888888888888877776355443212100//..-,-,&+*+**))())(((%'('"&%#$"""#
- at 30BB2AAXX080903:3:54:1090:1969#0
-AGAGACCAGGACTCAGGCAGAAGCAGCAGCACGAGGCTGGCGCCACTGCCAACCCACCGGCATGCATGGCTCGCAC
-+
-67777188888888888888888&77776)55(4322210,//..-,-++$++*%())#)(('((''$"$"$$##$
- at 30BB2AAXX080903:3:39:1261:99#0
-CTGCTGAGAAGGCATGCAGGTGGGGTGGCAGTGGCACCAGCCTGGTGCTGCGGCCTCTGCCTGAGTCCGTGGTCAC
-+
-67777788888888888888/88877776521483%12000/&,,'-,,-+$**#(('(((%(#'#%$$#"%"###
- at 30BB2AAXX080903:3:52:1502:677#0
-CTTGGAGACACAGCTCCCACCGCTGCTGAGAAGGCATGCAGGTGGGGTGGCAGTGGCAGCAGCCTGGCAGCGCCNC
-+
-6777778888888888888888887777656554122..00/-..--,-,+++)**%)()(()('('$$#$"#$"%
- at 30BB2AAXX080903:3:3:1331:522#0
-AGCAGCACCAGGCTGGTGCCACTGCCACCCCACCTGCATGCCTTCTCAGCAGCGGTGGGGGCTGTGTCNCGCANCA
-+
-677777888888888888888188787626/54112/100.+,/,,,+,,++'**#(()#'##'#%#$"#"&#"##
- at 30BB2AAXX080903:3:60:1053:1721#0
-AGGCTGGTGCCACTGCCACCCCACCTGCATGCCTTCTCAGCAGCGGTGGGAGCTGGGTCTCCAAGCATGNGACANN
-+
-6777778888888888888888887777655144322200/-.-..&+,,$,%*+#*(&(''&&#&&"%""#%#""
- at 30BB2AAXX080903:3:2:1138:959#0
-GAAGTGGAAGCCTAGGGACTCTTGAGGCCAGGATCCAGAACGCACATAGTAAGATCGGAAGAGCGGGTNTCCGACC
-+
-613207-88888,1188-/8+388+31-)+*20-(%%/$-#*&)%&&'+%)'''##%(#'&#'#'&#"""###$#"
- at 30BB2AAXX080903:3:51:413:189#0
-CCACTGGAGACCCAGGCCCAGCTGTCCTGGGGGCACTGCTGCGGGGGGAACTGAGATCGGAAGAGCGAGTCTTNCT
-+
-677777888888888888888888777765554432121/0//..---+++*+)**))))('(((('""$%""""#
- at 30BB2AAXX080903:3:1:312:802#0
-CTCCACGGGCGAGGATCACGTAGAGACGTGTAGAGACGCGACGAAGCACGAAGACCCGCGTTTGACGTNAGNACAC
-+
-677777888888888888888888764765)5403,2210,-/,.--+,,&&+(''()#)#''(%&'"""""#%##
- at 30BB2AAXX080903:3:37:54:607#0
-GAGGCAGGAGAATCGCTTGAACCCGGGAGGTAAAGGTTATGGTGAGCCAAGATCATGCCACTGCACTCGCCACTAN
-+
-67777788888888888888888877776555443222100//..-.-,,+++***)*)))((((('%"##"$"$"
- at 30BB2AAXX080903:3:39:492:805#0
-GATCTCCTGACCTCGTGATCCGCCCGCCTCGGCCTCCCAAAGTGCTGGGATTACAGGCGTGAGCCACCGCGCCCCC
-+
-6777778888888888888888887777655544301210//..-.---,+,++***()()()''''$$%#$%###
- at 30BB2AAXX080903:3:58:1378:782#0
-CAGGAGTTCAAGACCAGCCTGGCCAACACAGTGAAACCCCGTCTCTACAAAGATCGGAAGAGCGGTTCAGCTCACA
-+
-67777788888888888888888877776555443222100/...---,,+++***)**))(()''''"%""#$$$
- at 30BB2AAXX080903:3:50:124:431#0
-CCAGGCTGGAGTGCAGTGTCGCAATCTCGGCTCACTGCATCCTCCGCCTCCCGGGTTCAGATCGGAAGAGAGCACA
-+
-67777788888888888888888877776555443222100//..---,,+++**)))))))(('''"""""#"##
- at 30BB2AAXX080903:3:45:37:146#0
-TGTCAGATGGTGGCTCACATCTGTAATTTCAGCACTTTGGAAGCAAAGCCTAGAGGATCGCTTGAGCTAGCGTACC
-+
-6777778888888888888888887777655544322210///...--,,+++***)))))))((''"$""#""#"
- at 30BB2AAXX080903:3:43:530:1752#0
-TCTCAAACTGCTGACCTCAGGTGATCTACCCGCCTCGGTCTCTCAAAGTGCTGGGATTACAGGTGAGCCACTGCGC
-+
-677777888888888888,8888877774555443222100//.,---,,+++**(())()((&('(%%$%$&#"$
- at 30BB2AAXX080903:3:8:1762:889#0
-CCCAGGAGACAGAGATTGTGGTGAGCCAAGATTGCACCAATGCACTCCAGCCTGGGCAGATCGGAAGNCAGTCANN
-+
-67777788888888888888888877776555443221110/..---,--+**+*)()))(((('''"%"""$#""
- at 30BB2AAXX080903:3:35:393:48#0
-GCTGGCACAGAGCCCACCTCCCCCCACCTGTGACATCTGCCTTACCATGGCTGTGGGCTGCCGGCTGNTGTCTCNN
-+
-6777778888888888%(8888887.70151,1,221110-.+-,--+',+'+$'*)(')##'&#%'"#"%#"$""
- at 30BB2AAXX080903:3:45:278:963#0
-GTGCCGCCTCCCCGCAGGCGCAGATTCATGAACACGGTGCTCAGGGGCTTGAGGCCGGACTCCCCCAGGGGGGGAG
-+
-67777788888888888888888877776555443222100//..---,,+,+***)#('('((((%&"%$##$"#
- at 30BB2AAXX080903:3:33:156:616#0
-CTGATCAGGCGGGTCCCTGCCTAAGCCGTCTGCTGTCCCAGATGGAGGACAGGCAGGATGGGCTCCANGTCACANN
-+
-67777788888888888888888877776555443222110//..----,,++***)()))((('('""#$"$"""
- at 30BB2AAXX080903:3:39:1125:878#0
-TTGAACTCCTGGCCTCAAGTGGTCCGCCTGCCTCGGGCTCCCAAAATGCTGGGATTACAGGTGTGAAGGTCGGATA
-+
-67777788888888888882888877775555443221101/.-.---,,++++***(())')&(&'""&#"#"""
- at 30BB2AAXX080903:3:34:214:1614#0
-AGGCAGTTTCACCATGTTGGTCAGGCTGGTCCCGAACTCCTGACCTTGTGATCCACTCCCCCCTTGGNAGGCATNN
-+
-67777788888888888888888877776555443222100/...-.-,,+++)**)*)())(((('"$""%#"""
- at 30BB2AAXX080903:3:36:1697:1705#0
-GCTAGACATAAATGTTCTCCAAGGTCTCACCAGAGTAGCTAGATACAGAGTGTAGATAGGAAGAGCGNCTCTCANN
-+
-6777778888888888888888887777655248303210//--.-,-,,(+%***($))#)('('&"""%"$"""
- at 30BB2AAXX080903:3:4:386:938#0
-GTTCTCCAAGGTCTCACCAGAGTAGCTAGATACAGAGTGTCCACTGGCGCATTCACAAACCCTGAGCANCGTCNAN
-+
-677777888888888888888885777765554431201.1./.-&-(,+*+*')))((((((('''&"#"#""#"
- at 30BB2AAXX080903:3:49:732:1128#0
-CACAGGGTGCTGATTGGTGTATTTACAATCCCTGAGCTAGACATAAAGGTTCTCCACGTCTCCACCACGCACAGNT
-+
-6777778888888888888888887777655544322220///..---,++,+*++**))))((('''"#""#"""
- at 30BB2AAXX080903:3:37:56:1616#0
-TCTCCACGTCTCCACCACTCAGGAGCCCAGCTGGCTTCACCCAGTGGATCCCGCACTGGGGCTGCACGCAGNTCAN
-+
-677777888888888888888888777765054432210//0,..--+,+*++***()*))%#(''#"&$#""$""
- at 30BB2AAXX080903:3:43:1004:645#0
-CCCCTGCTCCACCGTGCCTAGTCCCATGACCACCCAAGGGCTGAGGAGTGCGGGTGCACAGATCGGAAGGGCGGTC
-+
-67777788888888888888888877776555443222100//..----,,++***)))*))(((('%&"%"%#""
- at 30BB2AAXX080903:3:4:994:354#0
-CTGAGGCAGGAGAATCGCTTGAACCCAGGAGGCGGAGGTTGCAGTGAGCTGAGATAGATCGGAAGAGCNTTCANAN
-+
-67777788888888888888888677776-55343122200-..,.,-,-,)+)**)))'()('(('$"""%#"#"
- at 30BB2AAXX080903:3:47:333:508#0
-TGAGCACCACGTTCGCCTCCTCCTCGCGCCGCTCCAGCGCGCGCTCCGGGCATGTCCCGCCAGATCGGACCATTGT
-+
-67777788888888888888888877776555443/221000/.-.,,,,++*+*)))))((((&''"$##$""##
- at 30BB2AAXX080903:3:42:605:1576#0
-GGCGGGGCGGCAGGCGTCGCGAGGGGAGGCCGGGGTCCGGGTGGGCGCACCTTGCAGGAGTACGTGTGCTGCACCT
-+
-67777788888888888888888877576345445,,-100%/..'-'++*)+*'(**&)'&'('(''&"&&##$"
- at 30BB2AAXX080903:3:42:875:993#0
-TCCTGCGGGAACCGGGGCTCCCCACCCCGGGGATGGGAAGTTTCCCTGGTTTCTCCTTCAGGTGCTTCTGGGGGTC
-+
-6777778888888888888888887777655543322.200./------,+,)+***))(()'('''&%#$""""#
- at 30BB2AAXX080903:3:39:1305:1795#0
-CCAGTTGCGCAGGCAGAGCCTCTTCCACGCCCCCCAACAGTAGGCTCCAGGAGGCAGATGACCCAGGCACCGTTCG
-+
-6.777788888888888888888877776/)5343)-1/.)/.-*,,,),+(+*&)()'(('#'##'$""#"""#"
- at 30BB2AAXX080903:3:39:1706:1058#0
-AGGCCGAATTTGGGAAGGGGGCCCACCTGGCTTGGGGTGCCTGCCGTCCACACCTCTCCCCACAGCTCGTCAGCAG
-+
-677777888888888888*888887677655)&4322#000-.-,)+,)%&&%)**(((%'((''##$%&##&%$%
- at 30BB2AAXX080903:3:51:816:1387#0
-CACACGAGCCCCCCACCACGCACCTTCCACACAGAACTCCACCTCCTCCAGGTTCCGCAGGGTGATCCGACNCANG
-+
-67777788888888888888888877776555443222100/./.----+++)*****))((((((#%$"$"##""
- at 30BB2AAXX080903:3:60:760:824#0
-TGCCGGCCAACGGAGCAGATCGGAGAGACGGGAAGTCAGGACCCTTACCGTTGCCTTGAGGAGGAAGCACTCTGNN
-+
-67777788888888888888888877776555343522100//..,--,,+++***))))))((((&'"%"$"#""
- at 30BB2AAXX080903:3:47:925:1894#0
-GCCAGCCCTGGGCAGCTGGCACTGCGGAGGCCAGGCCACTTCCCTGACAAAGCAGGGGCGGGGGGCGACCTGTCCC
-+
-67.77788888888888888888877746542343.-02./'-+-.-+,,++)+*))(')()((###"""#""###
- at 30BB2AAXX080903:3:40:730:1742#0
-CTGGCCCCCTGCCCTGTCCCTGTGCCAGGCCCCGGCAGGGGCAGACAACACTCCCTTTCTCTGCTCCCGCCCCCGC
-+
-67777788888888888888,8887777636634330210/+-.,..(++++*)****))(()'('#$$""$##"$
- at 30BB2AAXX080903:3:1:1716:1165#0
-GCACCCTCCCTTCCTCCCTGCCTGGCCAGCTGCCTAGGCCTCAGGACGGCAGTCCTAGGGGAAGCCGCNCCNACCA
-+
-67777788888888/8882/8426.*41+3-1,1/(.-*-)-+)*'+++)*)#&###'&''######%"##""###
- at 30BB2AAXX080903:3:1:351:1530#0
-CAGGAGGGGGCAGGAGAGGGTGGCAGGAATGGGGAGGAGTTGGGGGCAGGAGCTGAGCCCTGGAGAGCNACNACAC
-+
-61777788888888188888,888*74-+05632(12'0$)..--.+*++%*#$*#)&(&#'(#(##$""%""$"#
- at 30BB2AAXX080903:3:60:1146:1564#0
-CAGCAAAGCCCCCCCCCAGGCCAAGGCAGGGACAAGCCCAGGAGAAGTCAAAGACGGGACAAGTCCACTCCATTNN
-+
-67777788888888888888888877776555242200*.0//.,--,,-++++'**))()((('&'&%"$#""""
- at 30BB2AAXX080903:3:52:1113:1194#0
-CCACCAGCGGCCTGGGTGGGGCAGGAACGGACCCCCTCCCTGCAGTCCTGGTTCTGGCACCCCCTCCCCCCTCTGC
-+
-677777888888888888888888767765564432220/,/../,-,+,+$*)**)(((''(((&'"$"&%""""
- at 30BB2AAXX080903:3:34:437:786#0
-ACGCATGTGTGTGCACGTGCCTGCAGCCTCAGATGTACCAGCCTGTGCACTTCAGAAGATCGGAAGANCACGACNN
-+
-677777888888888388888888777765554-322210///..*-,,,*,+**(*)))()('((&"$"$##$""
- at 30BB2AAXX080903:3:51:91:1306#0
-CTTGCTGTTGGTTGTCCACTCTCCTGCCCTCTGCTCACTGCGTCCAGCACGCTGCCCCGTGTCTGGCAACGCTCGC
-+
-677777888888888888888888777766554420220010../,--+++***))*))()'((''#""$"#"""#
- at 30BB2AAXX080903:3:41:1380:918#0
-TGATGAAATCAGTGAAGGTCATGGTGAGCCCTGCTCACACCCCAGCCTCCCCAGATCGGAAGAGCGGTTCAGCCTT
-+
-67777788888888888888888877776555443222100//..--,,,+++*+**)))(()((('%$$#$""""
- at 30BB2AAXX080903:3:47:1290:845#0
-TCCACGCCAGCTGTTTTCCTTGGTTGGGGTTGGGGGCACCGAGCGTTTGGGTGGACCGGAAGTCAGCGGCTGCTCT
-+
-67777788888888888888888877776355443222110-/..-.,,,+*+***)**(()%'('%""$#$#"$#
- at 30BB2AAXX080903:3:44:1188:1097#0
-TTGGCCCACGAGGGGCTGGGGCTCGGTTCCTTCGGAAAGGGTGGCGTGGGTGTGGGCGGCCTTGGCGCGCGGCGTA
-+
-6777778888888888888881887717.315343-2/110-..+.-,,,$('***(*(((#%(('#%"%%""#"#
- at 30BB2AAXX080903:3:55:344:1944#0
-GTGTGCCTGTGTCCACACGGGAACATATGGGTGGGAGGTGAGGAGAACGTGCCTTCCCAGTGTATGGGTGTGCTAC
-+
-67777788888888888888888877776555443222/0///...-+,++)*(*)()#)')#'(''"$#""####
- at 30BB2AAXX080903:3:1:145:2036#0
-CCCTCCACCTGCCCACATAGACGCGGGATGTCCCCCTCCCCCTACCTCCCTGCATAGACACTGATGTCNACNCACA
-+
-67777788888888+838388888637-05+55430+112//'*.-($,-&)+*&'(()')#(&#&#%"#$"##$"
- at 30BB2AAXX080903:3:60:627:1694#0
-GGTGCTGGGCAGGCCAGGAATACCCATTGTGTGGCCGTGTGTGTGTGTGCAGTGCATGGTGCTGTGAGCTAACANN
-+
-67777788888888888888888877776555443222100//..---,++++***)))()(((('''"$$"%$""
- at 30BB2AAXX080903:3:50:232:1691#0
-GCTGATCTCACAGCACCATGCACTGCACACACACATGATCTCACAGCACCATGCACTGCACACACACACACACATC
-+
-67777788888888888888888877776555443222100//..----,++++**)))))((((''$%"%"##"#
- at 30BB2AAXX080903:3:36:1047:646#0
-TGTGTGCAGTGCATGGTGCTGTGAGATCATGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGCTTGACACN
-+
-67777788888888888888888877776555443221100/...---,+-++****)))()(('%'%$%$$$$#"
- at 30BB2AAXX080903:3:39:595:1280#0
-TGTGAGATCAGCGTGTGTGTGTGCAGTGCATGGTGCTGTGAGTGTGAGATCGTGTGTGTGTGTGCAGAGTGTGGCC
-+
-67777788888888888888888877776555413222/01/..+----,$+***+***)()&)'''"&#"%$$""
- at 30BB2AAXX080903:3:44:88:600#0
-AGCGTGTGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCATGTGTGTGTGCAGTGCATGGTGCTGTGCGACACG
-+
-67777788888888888888888877776555443220100//..---,,,+++**)))))()(('&&&"%"""""
- at 30BB2AAXX080903:3:50:24:714#0
-CGCTGCACACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACACACACACGCTGATCTCAATCACC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('''%$""#"#"#
- at 30BB2AAXX080903:3:45:817:797#0
-ATGCTGATCTCACACAGCACCATGCACTGCACACACACATGCTGATCTCACAGCACCATGCACTGCACACACAAGC
-+
-67777788888888888888888877776555443222100//..---,,,++****))))()(((''$$"##"$"
- at 30BB2AAXX080903:3:43:39:1175#0
-TGTGCAGTGCATGGTGCTGTGAGATCAGCATGTGTGTGTGCAGTGCATGGTGCTGTGTGAGATCAGCATCTCACCG
-+
-67777788888888888888888877776555443222100//..---,,-++***)))))((((''%"#"#$#""
- at 30BB2AAXX080903:3:40:1414:1013#0
-CACACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACACACATGCTGATCTCACAGCACCNTGCCC
-+
-67777788888888888888888877776555443222100//..---,,+,++**)**)))((((''&%"#%"$"
- at 30BB2AAXX080903:3:45:1434:1505#0
-TCTCACAGCACCAGGCACTGCACACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACAGACACGCC
-+
-677777888888888888888888777765554422.11/0//--,-,,,*++*)))*)*('(('('%""#""#""
- at 30BB2AAXX080903:3:2:954:1913#0
-ATGGTGCTGTGTGAGATCAGCATGTGTGTGTGTGTGCAGTGCCTGGTGCTGTGAAGATCGGAAGAGCGNCTGNCGC
-+
-677777888888888888888888/7873555242222100//./.",+,+$+***)#()''((%(#$"#"""#"#
- at 30BB2AAXX080903:3:42:699:1233#0
-ATGGTGCTGTGTGAGATCAGCATGTGTGTGTGTGTGCAGTGCCTGGTGCTGTGAGATCAGCGTGTGTGTGTGCCCT
-+
-.7777788888888888888888877776555443221100/...-&--,++++***)())((((''&&%%%#""$
- at 30BB2AAXX080903:3:8:1779:873#0
-GATCTCACAGCACCATGCACTGCACACACACACACGCTGATCTCACAGCACCACGCACTGCACACACNCAACTGNN
-+
-6777778888888888888888887777655544323020/+..,.-()++''$)))*&%''&''''"&#"%##""
- at 30BB2AAXX080903:3:39:1663:397#0
-CTGTGAGATCAGCGTGTGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGTGCAGTGCGGGTCG
-+
-677777888888888888888888777765554432321000/..---,,+++***)))))(((((('&""""##"
- at 30BB2AAXX080903:3:36:432:1667#0
-CTGCACACACACACGCTGATCTCACAGCACCATGCACTGCACACACACACATGCTGATCTCACACAGTGCACATCN
-+
-67777788888888888888888877776555443222100//..-----,++**+))*))(()(''&"$"%###"
- at 30BB2AAXX080903:3:3:446:170#0
-CTCACACAGCACCATGCGCTGCACACACACACGCTGATCTCACAGCACCATGCACTGCACACACACATNCTACNCN
-+
-677757888888888848028)8146754.524132.,.0,.*..-++'+++)('*)#('((('(&%""%"$$"#"
- at 30BB2AAXX080903:3:33:860:1735#0
-TGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGCAGCGCATGGTGCTGTGTAGANCGCGCCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('"&$$###""
- at 30BB2AAXX080903:3:35:1594:1487#0
-CACACGCTGATCTCACACAGCACCATGCGCTGCACACACACACGCTGATCTCACAGCACCATGCACTNCACCGCAN
-+
-67777788888888888888888877776555443222100//...-,-,++++**))())'((((%"$"$#"$$"
- at 30BB2AAXX080903:3:43:1135:1584#0
-CACAGCACCATGCACTGCACACACACACACACATGCTGATCTCACACAGCACCATGCGCTGCACACAGATCGGAAG
-+
-6777778888888888888888887777655344352210//...---,,+++***)))()(('''''"%%&#%"#
- at 30BB2AAXX080903:3:34:898:1843#0
-ATGCACTGCACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACCCACACACACTTCTNGACAGCNN
-+
-67777788488888888(88880877716-$54,3302+100...,(-,,+++%(***#)&###%''"""####""
- at 30BB2AAXX080903:3:58:800:436#0
-TGAGATCAGCGTGTGTGTGTGTGCAGTGCATGGTGCTGCGTGAGATCAGCATGTGTGTGTGTGCAGTGCGTAACCA
-+
-67777788888888888888888877476555413222&0///...-,,,+++**))*))))((((''%"#####$
- at 30BB2AAXX080903:3:8:1007:1618#0
-TGTGTGTGTGTGCAGTGCATGGTGCTGTGTGAGATCAGCATGTGTGTGTGTGCAGTGCATGGTAGATNACCACANN
-+
-67777788888888888888880877736355442212000/..,-.-+,+++*+)))))))((((&"####%#""
- at 30BB2AAXX080903:3:52:1069:1270#0
-TGTGTGTGTGCAGCGCATGGTGCTGTGTGAGATCAGCGTGTGTGTGTGCAGCGCATGGTGCTGTGAGAGCGGCGTG
-+
-6777778888888888888888887777655544322210///.--.-+,+++)%***))'()((&'""""&#"##
- at 30BB2AAXX080903:3:34:1223:389#0
-ACACGCTGATCTCACAGCACCATGCGCTGCACACACACACGCTGATCTCACACAGCACCACGCGCCGNCAACTANN
-+
-6777778883-88888888888887277655544322210//'.,.--,,++***+)(((&((''#'"%##$#"""
- at 30BB2AAXX080903:3:3:1535:1296#0
-TGCACTGCACACACACACGCTGATCTCACAGCACCATGCACTGCACACACACACGCTGATCTCACAGCNTCACNCN
-+
-677777888888888888888888777765594612.000/...-,,+,,++***(&()(('('#%'"""&%%"#"
- at 30BB2AAXX080903:3:57:876:1633#0
-CTGTGAGATCAGCGTGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGCAGTGCATTGTCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('''%$%%$"###
- at 30BB2AAXX080903:3:38:439:1679#0
-TGAGATCAGCGTGTGTGTGTGCAGCGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGCAGTGCATGGAGCTCTTCC
-+
-67777788888888888888888877776555443222200/,-.--+,,+*++**)())()('(('""$##""##
- at 30BB2AAXX080903:3:51:757:258#0
-AGCGTGTGTGTGTGCAGCGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGCAGTGCATGGTGCTGTGTGACAGGGC
-+
-6777778888888888888888882777655544322210///.-----,+,+*****))(()((('"""#""""#
- at 30BB2AAXX080903:3:8:1553:738#0
-CGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGNGGCCACNN
-+
-677777888888888888888888777;6554443212./0/...,--,,,+*)'(*()()((('(&"$"####""
- at 30BB2AAXX080903:3:34:1493:416#0
-TGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGTGTGTGTGTGCAGTGCATGGTGCAGNCTGTCTNN
-+
-67777788838888888888888877776555443232001//.-----,,+***()))()(')'('"$$%"#"""
- at 30BB2AAXX080903:3:34:991:975#0
-TCACAGCACCATGCACTGCACACACACATGCTGATCTCACAGCACCATGCACTGCACACACACACACNCTGTCANN
-+
-67777788888888888888888877776555443222100/...,,'-,,+***+**)))((((('"#"""$"""
- at 30BB2AAXX080903:3:35:834:571#0
-TGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCATGTGTGTGCGCAGTGCATGGTGCTGTGAGATCANCACACCGN
-+
-67777788888888888808888877776555443222100/&..---,,++**+***()))(((''"#"$$#$#"
- at 30BB2AAXX080903:3:44:1385:690#0
-GCACACACACACACGCTGATCTCACAGCACCATGCACTGCACACACACATGCTGATCTCACAGCACCAGGCACACA
-+
-67777788888888888888888877776555443222100//..---,,+++**+**))))()(('%"$$"%"""
- at 30BB2AAXX080903:3:39:319:2022#0
-ATGCACTGCACACACACACACGCTGATCTCACAGCACCATGCACTGCACACACACACGCTGATCTCAGAGCCCCAC
-+
-67777.88888888880833+8/87371635(3411#-1-/..,,.,-,,++*+*)()(''((&'%'"$""#%###
- at 30BB2AAXX080903:3:39:34:1250#0
-GTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGTGCAGTGCATGGTGCTGTGTGAGATCAGACGATCTCT
-+
-67777788888888888888888877776555443222100//..-+-,,+++***)))))(((((&%$""##"#"
- at 30BB2AAXX080903:3:34:898:1844#0
-ATGCACTGCACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACACACACACGCTGATNCACAGCNN
-+
-67777788888888888888888877776555443222000//...---,+,+****)))((('(''"$""#"$""
- at 30BB2AAXX080903:3:54:256:1513#0
-TGTGTGAGATCAGCATGTGTGTGTGTGCAGTGCATGGTGCTGTGTGAGATCAGCATGTGTGTGTGTGTGGGGGGTG
-+
-67777788888888888888888877776555443222100//..----,+,+**+)))))((('(&$"$"##"""
- at 30BB2AAXX080903:3:56:1495:865#0
-ACACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACACACACACGCTGATCTCACAGCACCACCCC
-+
-67777788888888888888888877776555443222100//..---,,+,+*&*)&)()&)(('%$$%&&"##"
- at 30BB2AAXX080903:3:8:909:1802#0
-ATGTGTGTGCAGTGCATGGTGCTGTGAGTGTATCAGCATGTGTGTGTGTGCAGTGCATGTTGCTGTGNCTCAGANN
-+
-677777888888888888868888.777955544120110./,.,-,,+,+,+(*)'))(()(((&'"$"&"#"""
- at 30BB2AAXX080903:3:55:965:1270#0
-CACACACAATCACACTCACAGCACCATGCACTGCACACACACACATGCTGATACACTCACAGCACCACGCACCTCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('%$%&"$"##
- at 30BB2AAXX080903:3:37:448:860#0
-GCACACACACACACACAATCACACTCACAGCACCATGCACTGCACACACACACATGCTGATACACTCTNAGANTGN
-+
-67777788888888888888888877776555443222100//..---,,+++*****)*)((((''""$%#"%#"
- at 30BB2AAXX080903:3:48:1334:729#0
-GTGTGATTGTGTGTGTGTGTGTGCGGTGCATGGTGCTGTGTGAGATGTGTGTGTGTGCAGTGCATGGGAGTCGCAG
-+
-67777788888888888888888877776555433222100//..---,,+++***)**)()(((('"#""#""#"
- at 30BB2AAXX080903:3:44:1255:1397#0
-GGTGCATGGTGCTGTGTGAGATGTGTGTGTGTGCAGTGCATGGTGCTGTGTGAGATTGTGTGTGTGCAGGCTACGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''&"##"""#%
- at 30BB2AAXX080903:3:38:1048:217#0
-TGCTGTGTGAGATTGTGTGTGTGCAGTGCATGGTGCTGAGTGTGAGATCAGCATGTGTGTGTGCAGGCGCTCTCNN
-+
-67777788888888888888888877776555443222/0//..--.-,-++++*()*))))((('#$$&%&&$""
- at 30BB2AAXX080903:3:3:249:59#0
-GATTGTGTGTGTGCAGTGCATGGTGCTGAGTGTGAGATCAGCATGTGTGTGTGCAGTGCATGGTGCTCNCTGTNCN
-+
-6777778888888828880888817177.555241101&/0*-/.--,-,+++$#)')#&((('(#%&"#""""#"
- at 30BB2AAXX080903:3:37:1529:1008#0
-ATTGTGTGTGTGCAGTGCATGGTGCTGAGTGTGAGATCAGCATGTGTGTGTGCAGTGCATGGTGCTGATCGCCCGN
-+
-67777788888888888888888877766555443222100//.--.--,,++**))))*))&('('$##"$##""
- at 30BB2AAXX080903:3:48:241:1228#0
-TGTGTGTGCAGTGCATGGTGCTGTGAGTGTATCAGCATGTCTGTGTGTGTGCAGTGCATGGTGCTGAGTGATATGA
-+
-67777788888888888888888877776555443222100//..---,,++****)*)))((((''""$""""""
- at 30BB2AAXX080903:3:4:1098:711#0
-CACTCACAGCACCATGCACCGCACACACATACACACACATGCTGATCTCACACTCAGCACCATGCACCNCACCNAN
-+
-6777778888888888888888887777655544322221///.-.---,+++****))(((('(('""####"#"
- at 30BB2AAXX080903:3:56:529:265#0
-CTGGCCCCACCCAGCCCCAGTCAGTGTCTGAGCCCCCCACAGAGGCCCAGATGCCTTCAGAAAGACAGAGGGCCCG
-+
-67777788888888888888888837776555443222100/...---,,+*++***)))'(((((("""&#####
- at 30BB2AAXX080903:3:51:401:237#0
-CCAGGAAGGCAGCAGGTGTGGGCAGTGGGTCCTCTGGGGTGGACTGAGGTGAGGCCTGGGTGTGACCAGAGCGGGC
-+
-677777888888888828)888857777655$0,32221.0/..--+-,(+++**)))))')(((''"#""#"%""
- at 30BB2AAXX080903:3:42:1745:575#0
-TGCCGGCAGCCACCAGTGCCACCGCGTGGTCACACCCAGGCCTCACCTCAGTCCACCCCAGAGGACCCCCTCNCNG
-+
-67777788888888888888888877876/55443222100/..---+,,,*+***))*(('(((('&"%"#"%""
- at 30BB2AAXX080903:3:44:897:1052#0
-CAGCTGCCGGCAGCCACCAGTGCCACCGCGTGGTCACACCCAGGCCTCACCTCAGTCCACCCCAGAGGCCCCACTG
-+
-67777788888888888888888877776555433212000//.--,,,-++**+))))((((((''&"%$$$$##
- at 30BB2AAXX080903:3:54:51:775#0
-TGCCCCGGCCGCACCCGCCTCCGCTCCAGCACGCGACGCTGCCCGGCGCGACCCCTGCTCCCCAGACCGGACACAG
-+
-67777788888888888888888877776555443222100//..---,,+,***))*()))('(&#""""#"###
- at 30BB2AAXX080903:3:34:1736:404#0
-TGGCGCGGGACACCCGGCAGCCGCCTGGCGCCTCCCTGCTGGTGCGAGGCTTCATGGTGCCCAGATCNACACGANN
-+
-67777788888888888888,88876776/55/132+00-/-'-,,+++*$*)&(((#(#'(''##%"$%#%""""
- at 30BB2AAXX080903:3:35:1422:172#0
-CTTGTCCAGCCTCCTCCTCACTCCAGACACACTCCACACGTCTGGGTGCACACCTCCAAATGAGATCNACATGCNN
-+
-67777788888888888888888877776555443222100//..-,-,-,*+*++))())))((('""&"#"$""
- at 30BB2AAXX080903:3:52:43:932#0
-GGGGGCGGGCTGACCTTGTTGACCTGCTTTGTGAGGTGGGGCCTGTCCTCCCCGGGGTGCTCCTGGANCCGGGCAG
-+
-67777788888888888888888877776555443222100//....-,-+,+++*)()(('((((#"##"&$"##
- at 30BB2AAXX080903:3:36:1702:1668#0
-GTTGACCTGCTTTGTGAGGTGGGGCCTGTCCTCCCCGGGGTGCTCCTGGTGTTTGGGCGACTGTAGANTTCCTTNN
-+
-67777388888888888888888877776555413222/00/...---,,+(++**)(()(((((('"""###"""
- at 30BB2AAXX080903:3:60:1147:1574#0
-CCCCATCACTGGGTCTCACTTGCGTTCAGTTGTGTGTGCAGGGGTGTGTGTGAGGGCTTTGCTGGGGTCTCATCNN
-+
-67777788888888888888888877776555441222&/0//(---$-,,+%***(&(()&((%('$'$%%"$""
- at 30BB2AAXX080903:3:47:894:168#0
-GGAATGGGGAATGGTGGCTGTGGGAACCCGTCCTACCCCTGGGCTCTAGCCCTGCAACCTGCCCGTCTGANTATAC
-+
-67777788888888888888888857776/'242/5222(///-).+++(+*#)*()(*%'###&#%$"""""#""
- at 30BB2AAXX080903:3:43:1148:612#0
-GCTCTGGCCCGTAACTATGACCACAGTTAGGTGGCATGTGGGTCACGATGGCCTTGGTGTGGAGAGATCGGGGGCG
-+
-67777788888888888888888877776555443222100/0..---,,+++***)))))(((('&&&&##"#"#
- at 30BB2AAXX080903:3:43:842:1137#0
-ATGCGCTGTGCCTGGCGGGTACGTGCGTGTGTGCCATCACCACGTGCACCTGTCTTCAGGTGATCAGATCGCGCTC
-+
-67777788888888888888888877716.5044322-000/..---,+,-+**++***)'((('''""%%#"$"#
- at 30BB2AAXX080903:3:45:224:1085#0
-ATGGGGGGCCAGTGCTCAGCCTGGCTTCAAGGTCCCGCCAGGTACCCAAGGTCTCTCCACTGCCCTGCCACCTTGG
-+
-67777788888888888888888877776555443222100//...--,,+++*****))))((('''%"$"##$%
- at 30BB2AAXX080903:3:58:221:534#0
-CAAGGTCTCTCCACTGCCCTGCCACATTGGTCCAGCAGCTGGTCACTCAGAGCCTGTAGATCGGAAGGTGTACANA
-+
-67777788888888888888888877776555443212100/..-----,,+++*+**))))))'(&$$%"##%"#
- at 30BB2AAXX080903:3:3:434:949#0
-TCCAGGAACAGTGCCCTTGGCCATGGTGTCAGGGCCTTGGGAGAGGTCTGGCTGAGCCAAGGTGACCCNAAGANCA
-+
-67777788888888888888888877176555442322100//-.-,,,,-+****())())&)('#%"""##""#
- at 30BB2AAXX080903:3:57:197:1222#0
-ACCAAAAGGGGAGAAAGGCTCAGGAGCCCTGGTGCAGGGAGGTGACTGGGTCCTTGGCCATGGGGTTCGNGTCCAT
-+
-677777888888888888888888777765554432221/0/-.-.--,,+++***)))(()(((#'%$"""####
- at 30BB2AAXX080903:3:37:1335:1194#0
-TGGGCCAGTATCTGCAAAGCTTAGAGGGTGCCCAGCACACAGCGCTATGTGGCCCGTCTGCTGCCGTCGCTATCTN
-+
-6777778888888888888888887777654544322210//..------,++*)+(*))((((''%$$#"#"#""
- at 30BB2AAXX080903:3:55:357:1047#0
-GCTGTCTGTCTGGGTGTCCCTGCCCCCACCCCAGAAGGCTGAGTGAGGGCCATCAGCCTGCCATCCCTGCGTCTTG
-+
-67771788888888888888888877776555343222110//+.,.-,,,+)++*()()('(&(''$$$&$###"
- at 30BB2AAXX080903:3:4:576:1751#0
-AGGCTCGCGGGACCCCTGCTCCAACGTGACCTGCAGCTTCGGCAGCCCCCGTGCGCGCCCGGCCGCCCNCACANCN
-+
-6777778888888888888888037721/55153+01/.0,-,(,,&(*$+%*)*)((#('''''##%"$$%#"#"
- at 30BB2AAXX080903:3:52:797:592#0
-TGCAGCTTCGGCAGCACCTGTGCGCGCTCGGCCGACGGGCTGACGGCCTCGTGCCTGAGATCGGAAGGGTGGGTTC
-+
-6777778888888888888888887778655534-2121/-/-.---,+,+)+**(*()(''((#&%"""$"##"#
- at 30BB2AAXX080903:3:36:448:113#0
-AGTCAGGACGCTGTCGCCGCGCGCCCACAGAGCTCGAGCCGTGCGCCCGCCGCCGCGCTCACCACAANGTCANATN
-+
-67777788888888888888888877778545412212100*..-,,--,++***)((%(&('&'&%"$$&""$""
- at 30BB2AAXX080903:3:39:570:533#0
-TGGATGAAGATGGCATGTGATGTCCAGGCAGGGACTGACGCAGGAGCAGCCCACCCTGCCTGGCCTCCACCCCTGT
-+
-67777788888888888888888877776555443222100//..---,,,+*+*+)*))())((('&%&%%$%$$
- at 30BB2AAXX080903:3:41:827:453#0
-GGCGAACTGACCAAGACGAACACGACGGGACACGACGGCCACTGCCTCCCCCTGGCCCTTCAAGTCCTGCTCCNCA
-+
-67777788888888888888888877776455443222001/..,---,,+,%**))*%))'(((('&&""#""##
- at 30BB2AAXX080903:3:44:32:1733#0
-AGCGTGTGAAGGCCTGCAGGCGTGATCGAGGCTCTACGATCCTGTGTGCGGGAGCGACGGGGGCACAGTGACACGA
-+
-6777078888888)888)8,8886-377)5+5442.1200&//.----,,(&*+&)&''(&)#'('&"""#$#$""
- at 30BB2AAXX080903:3:53:1461:564#0
-ACACACGGGCTGGGCCAAAGCCACGCATTCAGAGGGGCACACGCAGCGCCCGGTCTCGGCCTCGCACAGACGACCA
-+
-67707788488881888888888878776555443222100//.---,,,,*++**)(*((#((('($$"&""$#"
- at 30BB2AAXX080903:3:44:1049:568#0
-GAGACCGGGCGCTGCGTGTGCCCCTCTGAATGCGTGGCTTTGGCCCAGCCCGTGTGAGATCGGAAGAGCGGGGGCG
-+
-67777788888888888888888877776555442222110//..---,,,+*****)*))((((((&%%$"#""#
- at 30BB2AAXX080903:3:51:413:713#0
-CACACCAGATCAGCCTGCACGTGGCCTCAGCTGGACCCTGTGGTGAGTGAGGCCCTGGGGCCGGGCGGGCCACTAC
-+
-67777788888888888888888877776555443222101///.--,,,+++***)**))))((('""####""$
- at 30BB2AAXX080903:3:35:1183:1815#0
-CGGCAGGCTCCCTGGGCCGCTACGTAGAGCCCTCGCTGTGACTCACACCTGGCCTTCTTCAGCTCACNCTCGGTCN
-+
-67777788888888888888888877776535443212100//...,,--++******)))(()(('"$%&%$#""
- at 30BB2AAXX080903:3:44:1273:1964#0
-GCACATTTGTGCAGCTGCGTGCGCGGGCGTGTGCGTCCATCAGTCAGTGGGCGTGCACCAGGCCAGGCGCGCGCGG
-+
-677777888888888888888'8*7773655(4&3..,0/-/.,-,-#-,,*+)*'&##'''##''&%"#""$#""
- at 30BB2AAXX080903:3:47:1328:800#0
-GTGTGGGCACTTTCTCTGCATACGTCCATCCGGTCGATGTATCACATCAATTAGGTAAAAGTGGTGCACGCGTAGC
-+
-6/7777888888888888838088777555554/32+,101..-.---+,+)***))(*'&%(&'''"$$$#$""#
- at 30BB2AAXX080903:3:41:174:332#0
-GTGGGCCTGGCTGGCTGCCCCAGTGAGTACCTGAGCTCAGCCCCGACCCCGGGCCTGGTGCGGCTGGACAGCCCGC
-+
-67777788888888.88888888,777-655544312/1000...,.,,*+*+****)())((('''&$$$###""
- at 30BB2AAXX080903:3:38:412:310#0
-AGGCCAGGGCAGGACAAGGTCACGTGGCCGCACAGCCGCACCAGGCCCGGGAGATCGGAAGAGCGGTGCTCTAGNG
-+
-6477728888888888888*8388$7779511&332/20*.-./*+)+,,+)+)*)((&&)'('('%"$"$%##"$
- at 30BB2AAXX080903:3:2:1644:1857#0
-CAGGGCCTGCAAATCTCTATCCAGAGCCTGGGCCCGTGCCAGGGTGAGGCCAGAAGACCGGAAGAGCGNCACNCAG
-+
-67777788888888888,8/88886777*5554332(.20-/..%+,,,,+&)*&*(''((&'(#'#&"%#$"%#"
- at 30BB2AAXX080903:3:52:1370:1334#0
-GAGCAGCAGCCCAACGCGGAGTTGTAGCAGGAAGCCCTCTCGACAGGTGGCCCAGGGGTGGCCACGCAGCTGACAC
-+
-6777778888888888888888887777655524101200//..-.-,-,+**(**)))*)#((&('"""&#$"#"
- at 30BB2AAXX080903:3:39:223:1250#0
-GATGTGCACTTTGACCCCAGTGAGACCTGCACCCTGGACCCTTCCTGGGAGGCAATGGGTGGGGGATCCCTGCCGC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((('''&%&%#"#"#
- at 30BB2AAXX080903:3:44:26:1712#0
-AGCCCGTTGCCAAGACCACGGCAGCCCCCACCACACGTCGGCCCCCCCCCGCTGCCCCCAGCCGTGTCTGACCGCT
-+
-6/.347888888888888288828.316.56-4/2,.,./,-+,-(+#&,*+*(%'')'''#''#'#%"""$###"
- at 30BB2AAXX080903:3:46:395:1067#0
-GGGGCCGGGCGATGGTCCTGAGCACCTGCTCCTGCCCTCAGGTTTGACACAGGTTCGGGGCCGGCGGCTTGCAGAG
-+
-67777788888888888888888877776555443122101/..---,,,,++(*((((((&'(''&$""$$#"""
- at 30BB2AAXX080903:3:2:1508:1015#0
-GACGGCCTCAACCTGGACACAGACCTCTTTGTGGGCGGCGTACCCGAGGACCAGATCGGAAGAGCGGTNCATCTAC
-+
-6777778888888888888888887777655544332200/0..,.,,-,+%)*)(())(&(&(#''""$##%###
- at 30BB2AAXX080903:3:52:326:99#0
-TCCAAGGGACTCACACGGCAGCCTGGTCCTCGGGTACGCCGCCCACAAAGAGGTCTGTGTCCAGGTTGCGGGGGGG
-+
-6777778888888888888888887777655544-022000//.-.+'+,*,+(***()()('((#'&"#%"""""
- at 30BB2AAXX080903:3:54:1436:208#0
-CCTCCTGGTGGCAGGGCGCTGGAGCGGACCTTCGTGGGCGCCGGCCTGAGGGGGTGCATCCGTTTGCACGTGAATC
-+
-6777778888888888888888887777:455443222100//.--.-,,+++***))))))('(('&'$$%$"#"
- at 30BB2AAXX080903:3:54:1437:207#0
-CCTCCTGGTGGCAGGGCGCTGGAGCGGACCTTCGTGGGCGCCGGCCTGAGGGGGTGCATCCGTTTGCACGNCGTCG
-+
-6777778888888888888888887770445544322210///.----,,+,+*)*))))))('(('%$$""%"#"
- at 30BB2AAXX080903:3:59:1062:1958#0
-AGAGGCCTGCACACCTTTGCACGGGACCTGGGGTCGGTGGGGCAGGAGCAGGGGGAAGGGCCGGCCCCGCACCTAT
-+
-6777778888888888888-84887.21454.4/*21,101.+,..),$),,+*)#(()(''('&&#&"$"%#"#"
- at 30BB2AAXX080903:3:44:1715:1810#0
-GGCCTCGTGCCAGGAACACGACCTCCAGCGCCATCTTCTCCCTGGGGTCATGGGGAGTCGGGGTGTCTTAGATCGG
-+
-67777788888888888888888877776555443222100//..--,,-+++***))()))(''(&$%%'%##$#
- at 30BB2AAXX080903:3:58:710:819#0
-CGGAACTCCAGGCGGCGGTCCCGCAGTGCCAGCGACACGAAGTCCCCCTTGCCGTCCGTCTTCTGCCCGGTACCAC
-+
-67777788888888888888888877176765343310/0//*-..,-)+++**&())&('(''(%%&&"#"$#$%
- at 30BB2AAXX080903:3:47:89:438#0
-GGGAGGAGCTACCCTAGGGGTTGAGGCGCCAGAGACGGTGAGCAGATGAGAGGCCGACAGTAAGATCGTGTGCTGT
-+
-67777788888888888888888877776555343222100//-.---,,+++***)*)))))(((''$""###$#
- at 30BB2AAXX080903:3:54:1694:93#0
-GCCAGCAGAGGATGGCACATTACCTCTCGGTCACAGCGTTGAGGGACTCGACAAAGGTCCGCCCGTCACCAAAAAA
-+
-677777888888888888888888777765554332/2100//.----,,+++***)')')(((''%&%%%%$$$$
- at 30BB2AAXX080903:3:60:528:332#0
-TCTACTCACACGGGGATCTCATTGGCCAGTTCGCTTGGAAACAAAGAGACAGACAGTGAGAGGCGGGAGGACACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('%%$$%"#""
- at 30BB2AAXX080903:3:42:948:1609#0
-GTGCAGTCGCCCCTCCCAGGGCACAGGCCGAGGGTCGCCCCACAGCCAACCCCCACCACTGAGGCTGTACACCACG
-+
-6777778888888888888888887777655544%022201/.-..,,+,++)*)*())()'((%''$$%"%#$#$
- at 30BB2AAXX080903:3:43:1581:1980#0
-CCAGCTGTGTGTGTGCATGGGTCCATGTATATGTGTGTGTGTATATGTGGGGGGGACAAGATCGGAAGAGCGGGTC
-+
-67777788888888888888888877776555443222100//..---,,+++**(#*))))&)(''&&%""""""
- at 30BB2AAXX080903:3:47:847:1461#0
-TGTGCACACACTATACACACATGGACCCATGCACACACACTCGGACACACACCTGCGTGTCTCCCTCACAACAACA
-+
-6777278838388888882874880.1,655-8/1-2/0./-.-''+++*)(*()((()(''('&%&""""%#"##
- at 30BB2AAXX080903:3:35:450:576#0
-ACACATGCATGTGTGCATGCACGCAAACCTACACACGGACACACACACCCCTCCATGTTAGATCGGANACATCCCN
-+
-67777788888888888888888877776555443222100//..-----+++***)*))))((('(""%#####"
- at 30BB2AAXX080903:3:45:1020:94#0
-GTAGGGTGGAATGGAGTGGAGACCAGGGGCTTGGATGCCCCAGTACACACATGCATGTGTGCATGCACGCGACCAC
-+
-67777788888888888888888877776555442220120*-),.++++*)*)'()()#)'(#''#$"###%#"#
- at 30BB2AAXX080903:3:33:812:26#0
-TTCCACCCTACGCCTACCTCCTTGATCTCTGCGCCCAGCCTTGGCTGTGCTCCCCTGCTGTCTGCACNCGCTGCNN
-+
-6777778888888888888888887777655542321212/-/..--)-+))+**'))(('('('#'"&$$""$""
- at 30BB2AAXX080903:3:53:257:1728#0
-GCCTACCTCCTTGATCTCTGCGCCCAGCCTTGGCTGTGCTCCCCTGCTGTCTGCACGTGGGTGTCTGCCAGNGANG
-+
-67777788888888888888888877776555443222//1//-,--,-,+*+)))*')))&(%&''$"#&"#"""
- at 30BB2AAXX080903:3:49:979:817#0
-ACACTTGAGGGCACAGACACCCACATGCAGACACCCACGTGCAGACACCCACGTGCAGACAGCAGGGCGGCCACGC
-+
-67777788888888888888888877776555445222100//..---,,+++)**))))*))((('"""#$"#"#
- at 30BB2AAXX080903:3:37:534:1546#0
-CCAAAGAGCCCAGCAGGGACACCTACACATGCTTGTGCGGACACGAGACACGTGAGGGTGCAGAGATCAGCTATCN
-+
-6777778888888888888888387777655541332.100-/-.,-*,,++++*)))#)#()((%#$"%&#""$"
- at 30BB2AAXX080903:3:47:293:910#0
-GTGGGGTGCAAGGAGCAGGCACCCACAGAAGACATGCGTGACCTCGAGGATCACTGGCCGCCCACCACAGACACGT
-+
-6777778888888888888888887777655544322220//...---,,+,*++**))))()((''%"#"#"##"
- at 30BB2AAXX080903:3:59:516:1825#0
-CCAGCAGGTGCAGCGGGTGCCGGCCCACCACCACATCCCGCAAGCAGCCCACAAAGCCTGTGCCGTAGNCAGCTAC
-+
-*7777788888888888888088/23676%5211/10-/0,-..,-,+++)+*)')(()(''''(%%$""""#"##
- at 30BB2AAXX080903:3:56:1616:1284#0
-GCCATCCACGCCGAGCCCTCCACGCTGCCACCTCGCCTGTCCATCCCTCAGCACTAGGTCTGTCTGACACCTCAAC
-+
-67777788888888888888888877776555443222100//..----,+++***)))))((('''$$%$"#$$%
- at 30BB2AAXX080903:3:3:1739:1235#0
-GATGGCAGCCTCAGGACACACACCCCTGCCTCAAGGTGCTGAGCCCCCGCCTTGCACTGCGCCTGCACNCCCANCN
-+
-67777788888888888888882477276533,422$20//*.,---++,)&**'(((('''##'&#&"#""""#"
- at 30BB2AAXX080903:3:38:1576:736#0
-CGATAGCCCCTCGCAGGGCCTGGGGTGTGGCAGAGGGATACGGTCATGTCCAGGGTGGCTGGGCAGGGCCTGCGTC
-+
-677777888888888888888888707365554432221/0//-..,-+,+)+**#))(')))'#''"&$""$"##
- at 30BB2AAXX080903:3:33:32:1145#0
-CACACGCACCCACACGCACATGCACCCACACGTACCCGCACCCACACGCACCCACACGTGCACGCCANACACACNN
-+
-67777788888888888888888877776555%43222100//..---,,+,+****)))*())'''"$#"##$""
- at 30BB2AAXX080903:3:34:1565:991#0
-GAGAGCAGGCACACGCACCCACACCCACACGTACCCACACGTGCACGCCAGAGAGCAGGCACACGCANGGTATCNN
-+
-67777788888888888888888877776551443221100+..---,,,+++**))()()((((''"""##$$""
- at 30BB2AAXX080903:3:50:461:948#0
-TGTGGGTGCATGTGCCTGCTCTCTGGCGTGCACGTGTGGGTGCGTGTGGGTGCGGGTGCGTGTGGGTGTACAATCG
-+
-6777778888388818888888887777655544222210//..,-+-,,*+****&(()')'(''#"#"#"""$#
- at 30BB2AAXX080903:3:54:1586:2029#0
-TGTGCCTGCTCTCTGGCGTGCACGTGTGGGTACGTGTGGGTGTGGGTGCGTGTGCCTGCTCTCCGAGCAACACAAC
-+
-67777788888888888888888877776555243222100//..---',+++*#)))')#)'''&#"$#######
- at 30BB2AAXX080903:3:49:577:1937#0
-GGTGCGTGTGCGTGTGGGGGCGTGTGCTTGCTCTCCGGCGTGCATGTGTGGGTGTATGTACGTGTGTGNCCNGACT
-+
-6717778888888828,8&8,828.72785'524..-000)/,.-.,-,,+,*+')(((('(()(''%""#"""#"
- at 30BB2AAXX080903:3:59:1028:261#0
-TGTGCCTGCTCTCCGGCGTGTACGTGTGGGTGCGTGTGCCTGCTCTCTGGCGTGCACGTGTGTGTGTGTGAGCTNA
-+
-677777888888888888888888977765/5443212000//..----,,+****))()()(('('&$%""#"""
- at 30BB2AAXX080903:3:48:1212:977#0
-TCTCACTATGTTGCCCAAGCTGATCTCCCACTCTTGGCCTCAAGCGATCCTCCAGCCTCAGCCTCAGACCGACATA
-+
-67777788888888888888888877776555443222100/...---,,+,++**)))*))()(('&#%%"#"""
- at 30BB2AAXX080903:3:50:124:1343#0
-GCACCGGCAGATGTGAGCCCTGGGGAGAAGCAGGGGGAGAAGGGGTAGGGTGTGTGGCGAGCTGGGTCAATCGACC
-+
-677777888888888883888888777065724432211.///..$--,,(+++**)$)))'(((''$"""$""##
- at 30BB2AAXX080903:3:54:407:660#0
-GGGAGGCTGAGGCACGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCACGATCGCACCAGTGCACCC
-+
-67777788888888888888888877776555443022100//.,--,,,,++*+***)))))((('&""&%"##$
- at 30BB2AAXX080903:3:43:344:1362#0
-CCTGCACACCGTCCAATGGACCCACACCACATGCCCCGCCTCTGGCCTCCTCACCTGCCCTCCCCCTGCTCATGCT
-+
-67777788888888888888888877776555422222100//.,+--,-,++**)*)())(((((''&&&$%$#$
- at 30BB2AAXX080903:3:58:1442:212#0
-CTGGTTCTGCGCACCCTCCTCCTACCCTCCGAGGTCCTCCTCCCTCCTCCATTTCTGGAGATCGGAAGCGTGCNNA
-+
-67777788888888888888888877776555443022210/../.-,,,,+++**))))))()(''&$%""%""$
- at 30BB2AAXX080903:3:56:72:129#0
-ACCTACAGGGAGGCGGACGCGGCACCGCCAGGGAGGTCGGTCCCGCGAGATCGGAAGAGCGGGGCAGAACAACGAC
-+
-6777778888888888888888817%776)554132%110,//.,-,',*$*+*#&*()'()&#(&'""%""%"##
- at 30BB2AAXX080903:3:40:860:2018#0
-GCCTGCCCCCCTCCACCCGCAGGCCCTGCCAGGACACTTTGGTCCCTGGCCCGCCAGGCCTAGATCGCAAGTGCGC
-+
-67777788888888888888888827973525433222000/.,-,,,+($'+)%%))#&('((%#'$""&#$$"#
- at 30BB2AAXX080903:3:49:1042:397#0
-CCTGGCAGGCCCAGGCGGTTGGAGGAGAAGTGGTCGGCTCTGGACACCTTTGTTGTTTTTTTGTTTTTCTTCTCAC
-+
-677777888888888888087878727153.94$-22-//,-.+)&)+&,+)*+*'(*)*(%(&(''"%""#"###
- at 30BB2AAXX080903:3:42:406:1519#0
-GGGCCCTTTGTCCTCCTCCTCGATGGGAGCCCCAGGCCCTGGCTCTTCTGTGTCTGCACAGAGTCTACGCTGGTAC
-+
-677777888888888888888888777763554430/11/,//..--+,,+++)**)((')(('('&$'"#%"###
- at 30BB2AAXX080903:3:37:661:533#0
-GGGCGGGACACGGCTCTGGAGATGAGGGAGAGGACGGGCCGTGCCGACCGGCACCGCGGTGTTCCTGAGCGCGAAN
-+
-67777788888888888888888877776565443222,00./---,*-,-+*)+)))*%)#('&''"$%%""#""
- at 30BB2AAXX080903:3:44:1326:910#0
-CAGACTAGGAAGGTCCTGGGACGGGGGGGATGTTCACCACAACAGGGCCAGGCTCCCGCCCCAGCCTCACATCCAC
-+
-6777778888.88888888888(827776/55)4*.)01-+*&,%--+%*))+%)'(*')''((''#%"$""####
- at 30BB2AAXX080903:3:2:1253:1523#0
-CTCTCCCCACTCCAGGTGGTTTCACCCCAACATCAGCAGGGTGGAGGCGGAGAAGCTGTTCCTATCCCNCTAGTCC
-+
-67777788888888888888888877776755363221100*/.----,,++*)+)')%(%(#''#'%"%"%##"#
- at 30BB2AAXX080903:3:50:109:485#0
-TGGACACGAGGACTTGGTGCGGGGGGCCGATGCCCTGGGAAGGTGGTGAGAGTTGGACGTGGTGCTGTCACACACT
-+
-67777788888888888888888877776555443222100//..---,,,+#***)))()('(#(&"%"$"$"#"
- at 30BB2AAXX080903:3:47:302:683#0
-GTTGGAGTGGTGAGCCCTGGCCCAGCATCCGCGTGTCAGCACACGTGTGTACGTGTGCATGTGTGTGTCCGATACT
-+
-6777778888388888888884887777555544331110.//..,-+,+++***))()()')((&&$##""#"#"
- at 30BB2AAXX080903:3:60:1175:1214#0
-CAGACGCCGTCCCTCAGGATGCAGGCACACGCACACACACACACACACATGCACACGCACACACATGNACACAANN
-+
-67777788888888888888888877776555443222100//...---+,,+*****)))'(((''"'&%#$"""
- at 30BB2AAXX080903:3:34:1508:481#0
-CTGGCTGGTACCCTGGGCTGAGCTGGTTCCTCCAGCCTCAGTTTCCCCACTGCAGCGGGCTGCATCTNCCCCACNN
-+
-67777788-88888888888882677269546532500/-0-./,,(-+,$+*)'))(&'#'%#&'#"$#"#"$""
- at 30BB2AAXX080903:3:33:976:1293#0
-CCTACCAGCCCCTCCGTGTGTCCTCCTGGCACATGGCGACCTCCATGACCCGATGAGGGTGCGGGGCNGTCTCANN
-+
-677777888888888888888888777765554/322211///,-.---,,+)**)**)')()((('""$$$%#""
- at 30BB2AAXX080903:3:50:878:487#0
-GGGGTGCGGGGCCCGGGGCAGCTGCCCTCGGTGGGAGGGGTGTGGTGTGGTCTGCGGGGCCCTGAGAACCGCGCAC
-+
-6777478888888888888888887775935(443.2210+/)..&-+,,*++*)*)))(%(&(%'#"$#"$"#"#
- at 30BB2AAXX080903:3:4:1709:1362#0
-GTACTCCTGGTTCCTCTTTGAAGTTCGTAGTAGATAGCGGTAGAAGAAATAGTGAAAGTCTTAAAGTCNGTTCNCN
-+
-6777778888888888888888887777655544322210////--+--,+++****)))))))(('%""&"#"""
- at 30BB2AAXX080903:3:52:1636:1138#0
-GGTAACGCCAGTGTCTGGGAAGGCACCCGTTACTGAGCAGACCGGGAAAGGGAGTCTCCTTTCCTTGCACAACATA
-+
-67777788888888888888888877776555443222100//..---,,+++**))*)))(((''%&&%&"$%""
- at 30BB2AAXX080903:3:55:352:598#0
-GCCCACCCCTCCCTTGGGGACCCTGGTTCGTCCTGAGCCCCCCAGGAGCAATGGGCACAGGCCCCGCATCTCGCCC
-+
-67177788888888888888888877176'5348312.10///,,-,,-,(&(***&)(%()('(('""##&$###
- at 30BB2AAXX080903:3:42:360:1451#0
-GCCCCGCTCCATCTCCCTGGTGGTCATGACGATGACACGCGTGTTCTCCTGGTGCACCGTGGCCCAAGATCGTACA
-+
-67777788888888888888888877776555443220120//...--,,,++***)))))((((''&&%&%#$#"
- at 30BB2AAXX080903:3:45:1097:1381#0
-TGCATCTGCACAGCCCGCGTGGGCCCGCCCCGCCGCAGCTGAAGTGCACCACCATGGGCCCGGCCCGCGCACCCGG
-+
-67777788888888888888888876776555433322200/-.--,--++)+*)**)(''(('(&'%"""$"#""
- at 30BB2AAXX080903:3:37:352:1667#0
-AGCCTCCGTCTGCACCATTCCCCAGTGCTGCCGCCAAACCAGCTGGATCGTCTTCGGGACGTCGGGGACTCCACCN
-+
-677777888888888888888888777765554432111////..---,,+++*)+)*'')'(((#&"%"#####"
- at 30BB2AAXX080903:3:3:854:402#0
-CCGAAGACGATCCAGCTGGTTTGGCGGCAGAACTGGGGAATGGTGCAGATGGAGGGTCCGGAGCATTCNGCNANTA
-+
-67717788/8888*8&888/8388178/4+$30)3522&/,-,&-(-,+$+,)**)##&(&%'#(##$"#%"""##
- at 30BB2AAXX080903:3:56:1025:867#0
-CGCAGGGCCACGCCCCCACCTGCTCGCGCAGGCGCAGTTACTCGCCCCGGCTGTGCCGCCGCAGCGCCAGACACGA
-+
-67777788888888888488888877776555540.2*10../.-,-,+,$*+)*))&(#(('('&&'$"$$##"#
- at 30BB2AAXX080903:3:38:571:1616#0
-GGGGCGAGTAACTGCGCCAGCGCGAGCAGGTGGGGGCGTGGCCCTGCGCGGCGTGGCCTGTGCGGGCGTACGCGAT
-+
-67774788+8888888-8881888/77165454432/2/00/..--,-',+)+%*)#&))#)#(((#$""#"###"
- at 30BB2AAXX080903:3:42:354:1525#0
-GCCGTCCCAGGGCTGCGGGGTTCTGCGCGTGGAGCAGCGGCTCAGCCCTGCATCCCGCACGTCCCAGACCCTCCAC
-+
-617777888888,8888888,8887/7764553410--20-/,+.'-,+,&)*'*'(()('%(('''%&&&$"%##
- at 30BB2AAXX080903:3:46:742:159#0
-GGAGTGGCCGAGCTGGGGGCGCACGCGGGTTCACACGTGGTCACCGGGGGGGTTCGCAGCCCGTCGCCACTCGCGG
-+
-67777788888888888888888877776.2512322,20./.--+-#+,,*%))*&')'(#(#'&%%"#"$"#"#
- at 30BB2AAXX080903:3:1:1624:303#0
-CACGGGTGGTCAAATGAATATGTCACACACACCTCACTCCACAGACATCCACCATGTGCCTGATGGGGNCGNCTAC
-+
-67777708888888888888887173786/41-/.21-1./-/..--++&,*%(**')#(((('(&'""#""#"##
- at 30BB2AAXX080903:3:51:1015:507#0
-AGGAAGTACCTGGGCTCTGGGGTCAGGGATGGGAAGGCTGAGGAGGCCTGCGTGCGCTGGACCTGGCCCCGGTCTA
-+
-67777788888888888888888877776-45443222000//..-----(++****)()())((&'"##"#"$""
- at 30BB2AAXX080903:3:49:714:1768#0
-CTTGCCGGGCTTCCACTCATGCTGACATTTCCCCGCGGGGCTGGTCCGGCAGATCTGAAGAGAGGGTGCGCACGTC
-+
-6777578,8888*8883-/88.88776765*1&23,'210,./.'+&+,+)&*)#()#()&(#&'#'"$"###"##
- at 30BB2AAXX080903:3:1:858:1885#0
-CTTGGCAAGGGGCTTCCCTGGCAGGCAGTTCACAGGGTGTGTGGGTGGGGGGGATGCTGACCAGCTGCNTCNCCGG
-+
-6777778888888888388888-8577722521,320*/-1-/-.+-,,+++*)())((((('''#&%""""##""
- at 30BB2AAXX080903:3:55:1596:432#0
-TACTGGGGAGGCTGAGGCAGGAGAACTGCTTGAACCGGGGAGGTGGAGGTGGCAGTGAGCCAAGATTCAAGAACAA
-+
-67777788888888888888888877776555443222100//-.---,,++++*))))()((('''"#$"####"
- at 30BB2AAXX080903:3:2:1718:1254#0
-TCCGAGCCAGGGGTGCCAGGGGACCTGGGGCTGCCGGCCGAGCTGGGGGGCCTGGCATCGGGGCGAGCNTGACCTC
-+
-6777778888888288848888807773.33.52212,10$-*&--,,+$$'#(*%'##&#'(####""#""##"#
- at 30BB2AAXX080903:3:48:639:1001#0
-GGCGGCCGGTGATTGCTTACCACAGTCCCTGTCCCACAGCTCAGAGACATGTCGTCAGGCCAGCAGGGCANGNCTC
-+
-67777788818888888888888877776555343221100//..-,,-,++***))*)((&)((('"%""""$"#
- at 30BB2AAXX080903:3:43:1641:1733#0
-CTCACATAGCTGCCTACAAATCAGGCCTGCACCGCCCAAGCCAGGCACCCATCCTGGGATAGATCGGACGACTGCC
-+
-67777788888888888888888877776555445110100/...--,+-++)*****)())(('('&"%"%"#$"
- at 30BB2AAXX080903:3:49:612:1479#0
-GGGGGCTTTGGGACGACAGGGAGGGCCCAGGCAGGGGCAGGGGTCAGTGCCCGAGGAAGGTGCACGTGTACTACAT
-+
-67777788888888888888888877776556542221200//--,-,,***+)*)()))#)'''('"$"#"##""
- at 30BB2AAXX080903:3:2:1466:634#0
-AGGTGGGACCCCTGTGGCTCCCTGCAGCGGATCCTGGGTGCAGGGGAGGGGCGGGGGGTGGAGCAGGGNTCNCAGG
-+
-67777788888888888888388877776545442222.0///..-,-,,+*+**'))#)(#'##%'""#%"#$""
- at 30BB2AAXX080903:3:42:424:701#0
-ATGGTGCCCCACCCTGAGCCTGTGCAGGTAAGGGGTGAACACGGGCTGAGCTGGCCTTACCTGGTGGCCGGGGGGN
-+
-67777788888888888888888877776555443222100//...---,,++*)**)))))(((''&&%#"##""
- at 30BB2AAXX080903:3:45:1728:1601#0
-GCGGGTGACGGCGCACGCATTCCTTGTGTCCCCGCCTGTCTTGGACAGAGCAGAAGCCACACCTGCCAGGCGAGTG
-+
-6777778888888888888888887777655544322210///.-,,-,-,+++**(*)))(('(''"""%""$"#
- at 30BB2AAXX080903:3:45:180:875#0
-CCCACACCCAGCAACTCACACCTGCCTCAGACCAGAGCTCTGTGCGGGTGACGGCGCACGCATTCCTTGTGTCCCC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))*))))(('&'&"$$""#$
- at 30BB2AAXX080903:3:51:145:928#0
-GGCTGGCTTCATCCTCTCCTTGGCGGGCCAGGCAGCTGGAGGGCAGGGGGGGGGGGGGGAGGGGGGGCGCGCGTGC
-+
-677777888888888888888888777763554432121&///(%---+,+++***)))#)(((#((%##""""##
- at 30BB2AAXX080903:3:47:990:425#0
-GTGGCTGCTCTCACACATGGGCCATGTGTTCACACGCTCTATGCCCCCGTGTCCACAGGCTCGCACCATCACATAT
-+
-617777882848888888888888/777851244313-20-/.*,-.-&$&&'*)*)((&&'#(#&#""%"####"
- at 30BB2AAXX080903:3:56:1073:1094#0
-TAGGGCATGTGGACATGGCATGTGTGTGTGTGTGGACACAGGGCACGTGTGTGAGAGCATGTGTACATGGCGAGCC
-+
-67777788888888888888888877776555443222010//..--,,+++++**))))))(((''"&&#"""##
- at 30BB2AAXX080903:3:46:1569:205#0
-AGTCTGCTAGGGCATGTGGACATGGCATGTGTGTGTGTGTGGACACAGGGCACGTGTGTGAGAGCATGTGTNCNAG
-+
-67777788888888888888888877776555443222100/...---,,+,+***))))))()(('&""#"$"#"
- at 30BB2AAXX080903:3:33:1211:314#0
-GCACAGACCAGTCCTGTAGTCTGCTAGGGCATGTGGACATGGCATGTGTGTGTGTGTGGACACAGGGNCCTCCCNN
-+
-67777788888888888888888877776555443222100/.-.-,-,,+++***)**())'((''""%"##$""
- at 30BB2AAXX080903:3:4:972:966#0
-TTCCTGAGCCCAAGTCCCTGTGCTCCTCCTCGGGGTGTTGCCCCCGGGCCTCTGCAGTCCTGGGTCCGNATTANAN
-+
-6777773888888888888888887777655544322/+00.-..'-++,,*++*)*))(((('(''%"""##"""
- at 30BB2AAXX080903:3:54:1671:1552#0
-ACGGAGTCCCCATAGCCTCAGCCTCCCCCCACGGAGTCCCCATAGCCTCAGCCTCAGATCGGAAGAGACCAAAACA
-+
-67777788888888888888888877776555443220000//..----,+,****)*)))()(''%"""%&$%$$
- at 30BB2AAXX080903:3:51:472:1192#0
-TGCGGGGTGGCTGAGGCTATGGGGACTCCGTGCCGGGAGGCTGAGGCTATGGGGACTCCAGATCGGACGGTCACAG
-+
-6777778088888888888888889773655534322110///-.---,,,++***((*&)'((((%$"""$"##"
- at 30BB2AAXX080903:3:40:596:230#0
-GTGCCGGGAGGCTGAGGCTATGGGGACTCCGTGCCGGGAGGCTGAGGCTATGGGGACTCCGTGGGGGTCGCGTGAT
-+
-67777788888888888888888877776555443222/00//.----,,,++****))))&)(((&"#&#$#"##
- at 30BB2AAXX080903:3:36:734:672#0
-CCACGGAGTCCCCATAGCCTCAGCCTCCCCCCACGGAGTCCCCATAGCCTCAGCCTCCCGGCACGGCATACCTNCN
-+
-67777788888888888888888877776555443232100///----,-+++**)*)*)((((('#$####%"#"
- at 30BB2AAXX080903:3:58:791:536#0
-TCCAGGCCTCGGTTACGGGTCACACCTGGCACTGCCAGGCCTGGGGACGTGGTGCGGCCGGTGCGGGGGGTCTCAC
-+
-677777888888888888888888777765554432221000/..-,,,,+,**)**))))'(((('&"%#$"###
- at 30BB2AAXX080903:3:42:1324:1277#0
-CGTGCCCCTCGCTGCCACAGGTCCTGGCTGACCACGTGCTGCCCAAGGGCCAATCGCGAGTGCGCAGGTGGGNCTC
-+
-677777888888888888888888777765554222/2100/0.,,,,,,+*+'&)&)((')'('&'&"$"""""#
- at 30BB2AAXX080903:3:42:1614:348#0
-ACAGCAGGTCCAGCCAGGCAGGGTCTGGAGGCCAGGCCAGACACAGACAGGCACCTCCCAGCCCACCCTCTGCAGC
-+
-67777788888888888888888,77776555443222.1///.--,-+,++*+*())*('((('''&$$#%""""
- at 30BB2AAXX080903:3:37:350:1141#0
-GAGGGAAGGAGTCCACATCCCCCTGGAAACTCCACTCCTGCATTTGCACCAGGCTGGGCGTCTGGTTTACATATCN
-+
-67777788888888888888888877776555443222100//..---,-,++*+*))))))(((('$###"#"#"
- at 30BB2AAXX080903:3:46:1540:1941#0
-CAGACGCCCAGCCTGGTGCAAATGCAGGAGTGGAGTTTCCAGGGGGATGTGGACTCCTTCCCTCCACGCCCGCCAC
-+
-67777788888888888888888877776555423222100//..-.-,,,++****))))((((''"##"%###"
- at 30BB2AAXX080903:3:52:421:1492#0
-CCCTGGCTGCAAACCTCAGGCTGGGGGTTTTTGGGGACAGGGATGCAGGTGTCTAAGGACACGACCCTTCAGGCAG
-+
-67777788888888888888888877736555443222100//..---,-+++**)*)))))((''&""$"&$$"#
- at 30BB2AAXX080903:3:53:481:2002#0
-GGACAGGGATGCAGGTGTCTAAGGACACGACCCTTCAGGCAGTGGATGTTTTAGATCGGGAGAGGGGGTCGACCGA
-+
-67777788888888888888888877776555443.2210./-..,"-&*+%'')&#()#'('(#'%"#%%""#""
- at 30BB2AAXX080903:3:4:955:1307#0
-CTCCAGGCAGTGGACGTTTCTGCCTGGGTGGAGGGCACGGTTACGAGAGCAGGGCCCGCGCTCTGGCTNCGACNAN
-+
-67777788888888883883888877770555443.000/&-**'+,),++)++'))((((#(##''$"$%$%"#"
- at 30BB2AAXX080903:3:57:1252:74#0
-GCCAGTGGGGAGGACACAGCCTAGGAACCAGCTGCCTGAGACCAGGGTGCCTCTGGGCTGTCCTCCCGTGACTCAC
-+
-677777888888888888888888777165554412220/1.-*---#,+,**)())()(''(&'#''"%%$####
- at 30BB2AAXX080903:3:53:812:126#0
-AAGTGCGTGGCGTGGTCTCGGCCTCCAGGTCAGACATTGCTGATACGGGCCTCCCCCGGGAAGGCCGCGCGCACAG
-+
-677777888888888888888888771765554622211////.--,+,+,(+)***(*('((('#'$$#$#"##"
- at 30BB2AAXX080903:3:47:746:1426#0
-GGCGCCCGGGGCTGTTTACTCTGACCAGGTGGGAACCCAGATGCCCCCTGCCCCTAAGGCGCCCTCANCGCTCCTC
-+
-67777788888888888888888877476/554350/1001..-,-,,+,+**+*)())()'&'''&"$"%###"#
- at 30BB2AAXX080903:3:52:763:1694#0
-GGCAGGGGCTGGGAAGGCAGACAGCGTCCTCCCCGAAGCCTCGGGAAGCGTGTGGCCTTGTGTGCCCCGCGGATGT
-+
-6777778888888888888888887777+5553432320(///..,,-,,+,***#))()(&((''#%$"&$"%""
- at 30BB2AAXX080903:3:39:781:949#0
-TGGGTCAGGCGGACCCAAGAGTCAGCCCGGTTAGGACCCATTTTATGTGCGGGGCCACAGACACAGGCTGAGATCA
-+
-67777788888888888888888878776555443210000//.,---,-+,+*)*))))))(((((&&&&$#$""
- at 30BB2AAXX080903:3:55:1627:829#0
-CAGCAGAGGCCCCGGGGCTGCAGGGTCTCCCCCAACCTCTCCCTGCGGTGCATCAGCCTGGCCCTCCACACACAAC
-+
-67777788888888888888888877776555443222100//..---,,,+++**))))))(('(%$$%%%$&$$
- at 30BB2AAXX080903:3:50:935:144#0
-CTCCGGGGCACGCACAGGTGCGGGGGCATCCCGAGCACCCCAGGGGAGTCCCCGCTCCCGGGACGCACTCTCCCAC
-+
-6.77778888881888-8-8888/777+6545%4'122100/-.-.+,+,+'+***)**#(&((&(&%$$"##$"#
- at 30BB2AAXX080903:3:60:626:592#0
-GTGGGGCTCAAAGCCACCTCGTGCCTGAGGCTCCTCCCGGGAGGGGGGGAGGGGAGCCCGTCCCCTGGTCACAANN
-+
-6777778888888888888808887777555546+2/2.00*...&--,+-++$'*)))'()'((#'$"%$&#"""
- at 30BB2AAXX080903:3:46:1773:1441#0
-TGACCCCTTCCCACTGGAGAGACGGCCTTGTGACTGTGGGGCCTTCAGGCGGGGGCGGGGTCTGGGANGTATACTA
-+
-677077888888888888888888777765554432-10-0#/&-+*,,++++++()*((#&((&'#""$""##""
- at 30BB2AAXX080903:3:50:820:1165#0
-CCCGCCTGAAGGCACCACAGTCACAAGGCCGTCTCTCCAGTGGGAAGGGGTCAGTGCCCAGGCCCGGGCGCTCTGG
-+
-6777778888888888888888887777655544322210.//...--,,+++***)))*)(((('(%$"""#"""
- at 30BB2AAXX080903:3:40:264:1575#0
-GAAACGCCTCTCCGATTCCAGTTGCCCCTGAAAGCCAGGGGGTTCTCAGCCTTGTTCCTTCCTCCGGACACACACC
-+
-6'*1.2+88281./188/068888+'1/6501483('1///.)-)-*),*(++&**'()('%('''#$&#&&$###
- at 30BB2AAXX080903:3:60:743:670#0
-GCTCACGGCCACACCGCACGCTCTTAGGTTCACACTTAAGGCTCACACTCACGGCTCACGCTGACACCCACAATNN
-+
-67777788888888888888888877776555443222000//..---,,+++*+**)*))(((('''$"&"#"""
- at 30BB2AAXX080903:3:37:680:901#0
-CATGGCTCACGGCCACACCGCACGCTCTTAGGTTCACACTTAAGGCTCACACTCACGGCTCACGCTGCNACGACCN
-+
-67777788888888888-8888887-7163/5/4322200/-/-..--,,++*()***)((()((''"""""$$#"
- at 30BB2AAXX080903:3:57:421:267#0
-CAGCGTGAGCCGTGAGTGTGAGCCTTAAGTGTGAACCTAAGAGCGTGCGGTGTGGCCGTGAGCCATGAGCGTATAT
-+
-67777788888888888888888877776755443222110//..---,,,++***))))(('('''&$#%#""##
- at 30BB2AAXX080903:3:8:591:1715#0
-AGAGCGTGCGGTGTGGCCGTGAGCCAGGAGTGGGAACCTGAGAGCGTGTGGCTGGGGGGGGAGGACGNGGCGACNN
-+
-67777788888888888888888877)765.5'4321210./,.--,-*,,*)*'*#*&#(#)%##'""%$#"#""
- at 30BB2AAXX080903:3:35:1260:433#0
-CTCTTCCCGAGTCTGCTGGGCCATTCGGGACAGCTCTGTGGTGAGGGCTGCTCCGCCCCCTCAGCCCNCTCTTANN
-+
-67777788888888888888888877776555443222000-/..--,+,+++*+)*))(()(((''"%"#""#""
- at 30BB2AAXX080903:3:52:471:1340#0
-TGCCCGGCTCCCCCCGGCTCCCTTCTCACAGCTCCAGCTGTGGGAGACACTGTGGGGGGTGGTGTCCTGTGTCTCC
-+
-677777888888888888888878727/65551,3220101//.--,,,,++#++*#)&&'#''###"""#"""##
- at 30BB2AAXX080903:3:41:1297:799#0
-GCTGTGAGAAGGGAGCCGGGGGGAGCCGGGCAGACCTACAGCTTCTACACTCGGAGCCGTTGTAGGCTGGGACCTC
-+
-67777788888888888888888577776555422501.00..-,,,+,,+***))'))#''#&(%#%$$""##"#
- at 30BB2AAXX080903:3:2:1772:883#0
-CCGGGGTGCTCGGCGTGGAGTGCAGCGTGGAGTACTCGGGGCTGGGGGGCTCGGCGTGGGGAGTGCGCNCTGCTCT
-+
-677777888888888888880888777;6555241202100*..,-.$,(*)+*&*#*)#)#(#(#%""$"####"
- at 30BB2AAXX080903:3:42:1535:1455#0
-CAGCGGGCACTTCTGGGGACAGTGCTGCGCTGGTGTTTGGCTCCCTGCCGTGGACTCCGTTCTTCGGCCTCCGGGC
-+
-67777788888888888888888877776555443222100//...--,,+++*****)()(((((''#%&###""
- at 30BB2AAXX080903:3:36:1009:517#0
-AGGACCCCAAGGTGCTCAGCTTCCTCCCAGCCCCTCTGTTCCCCCTCAGAGCGGTGCCCTCCTCCTCACTCGCGCN
-+
-677777888888888888888888772765550431%2//1$/...-,,++)*)#))')#'&(('%'"%#&####"
- at 30BB2AAXX080903:3:39:1638:1437#0
-AGGGCAGCCAGTGGGAGCAGCCAGGGGAGGGGAGGACAGAGTGAGAAGGTGCAAGGGCCACTCCTTGTACCGCACA
-+
-677777888888888888888888777765554432-2110-/..-,-,(+*++**)')'('(&#&'"""""###"
- at 30BB2AAXX080903:3:33:1418:466#0
-GCTTTGCCAGAGGCCCCTGGAGCCAGGACAGCCCCGTGAGAATGGCTGAGCTCATGGGAGATCGGGANAACAGTNN
-+
-67777788888888888-8888789777355,3212)2100/....*-&,+*+))**)))'((((#'"$##"""""
- at 30BB2AAXX080903:3:56:1363:157#0
-GCCAGCCAGGAGGGCGAGGTGCCGCAGCGCCATGCCAGGAGCAGATGCGCAGAGCCAGCCACAGGGCGAGTACATC
-+
-67777788884888888888888877776)55-4-222100*..,--+,-+****)%(#)(('('(#$"""$$"##
- at 30BB2AAXX080903:3:1:1668:1715#0
-TTGGCTCCGCATGCTCCTCCCTGTGGCAGGCTCTGCGCATCTGCTCCTGGCATGGCGCCGCGGCACCCNCCNCTCC
-+
-6777778888888888888882807771656,3-/0/1(*.)+,%,-&)++&#)**))#(''((%#'"""#"#%#"
- at 30BB2AAXX080903:3:50:55:1198#0
-CCAGTCCTGCAGATGAAGACAGCAGGTGAGGCCGTGGTCACGCGAGGGCAACCCAGGTGGGCCGTGGATTACGCTC
-+
-67777788888888888888888877776555443222100//..----,+,****)*))))(('''""""$"#"#
- at 30BB2AAXX080903:3:46:129:667#0
-TGTGCGGAGAGTGGACCGTCCCTGTGCAGAGACTGGAGCTGTGTCCTCCAGGGCCTCCGTCTCCCTGCAGACGCAC
-+
-67777788888888888888888877776555443222100//..---,,++++***))))((('(&&#""$##"#
- at 30BB2AAXX080903:3:40:1705:697#0
-ACGGACACCCTGCGTGCACCCACATCGCCAGTGGGAGGGTATACAGCACAGCCACTGTGGAAGACGGCTGCAGGCA
-+
-677777888888888888888888777765534432221/0//..----,++++*)))))))((((&&%%#"$"#"
- at 30BB2AAXX080903:3:57:105:1283#0
-ATACATAAGTCTGATGAAGAATATGTGTTTTAGCTGAGCGTGGTGGTGACGCACACCTCTAGTCTCAGCTCTCACA
-+
-67777788888888888888888877776555443222100//..---,,+++******)(((((('&&"$"$###
- at 30BB2AAXX080903:3:35:934:475#0
-GGCAGCACTTGCTTGTGTTCCAGCTACTTGGGAGGCTGAGGTGGGAGGATGGCCTGGGCCTGGGAGANCTCGGCAN
-+
-67777788888888888888888877776555443222200-/..---,,++******())))((('"$#$##$#"
- at 30BB2AAXX080903:3:55:1342:1356#0
-TCAATCTTTCCAATCTTTTAGGGAAAAAATCAGCTTTTGATATTGTTAAGTTTCTCCATTTTTCTCATGCTTTCAT
-+
-67777788888888888888888877776555443222110//..---,,++++*+**)))(()'('&%#&$%$##
- at 30BB2AAXX080903:3:1:611:1148#0
-CACATCACCACCACTCAAAGTCCATGGTTGACACGAGGGCGCACTCTTGGTGCTGCACGTTAGATCGANCANCGCC
-+
-67777788888888888888188897786579113/112./-+.,,*++,&+*))#(()#'#(#'#'""##"#""#
- at 30BB2AAXX080903:3:37:44:723#0
-TCTCACCCCGGCCTCCTGAATAGTTGGGACCTCAGGTGCACACCATTACACCCAGGTAACAGATCGGCGTCCTGTN
-+
-67777788888888888888888677776555443222100///.---,,+*++***)*))()((('%""#####"
- at 30BB2AAXX080903:3:56:732:1223#0
-TCCTGACCTCGTGATCCACCTGCCTCTGCCTCCCAAAGTGCTGGGATCACAGGCGTGAGCCACTGCATCACGTGCT
-+
-6777778888888888888888887777655544322210///..---,,+++***)*))'(()(('"$"%%$$"#
- at 30BB2AAXX080903:3:56:1532:1930#0
-GACCATGCAGGCTTGTTACTGCCCAGAGTTGAGCACCTGGGAAGCAACACCAGCGCCCACCGTCTAACACCTCCGC
-+
-67777788888888888888888877776555413//2100//.---+,++,+**)&))'()('(''$$%%$&#"$
- at 30BB2AAXX080903:3:41:918:1630#0
-GGCTGATGCAAGAGGACTGCTTGAGCCCAGGAGTTCGAAGCCGAAGTGCAGACGCATTCAAGCTGGTCGCGCAGCT
-+
-6777778888888888888888887777655/4432200/1-/-----+-,,)****))*'('(((%&$$%#%#$"
- at 30BB2AAXX080903:3:55:674:380#0
-ATAGGGCCTCGCTCTGTTGCCCAGGCTGCAGTGCAGGTGCGCTCCCGGCTCGACCAGCTTGCGTGTTGTCTCTGCG
-+
-2717,7232488)&&8)388%$08671&)+3'0,+0.*/..*-,-$*++&()#')#($&###&####"$""#""#"
- at 30BB2AAXX080903:3:42:22:1324#0
-CGCACCTGCACTCCAGCCTGGGCAACAGAGCGAGGCCCTGTCTCAAAGGAAAAAAAAAAAGCTTTGGCTCCTCACC
-+
-67777788888888888888888877776555443212100//.,).,,,*+++****))))(((('""$#"####
- at 30BB2AAXX080903:3:57:848:1966#0
-GGGAGGCTGAGGCAGGAGAATAGCATGAACCTGGGAAGGTGGAGCTTGCGGTGAGCCGAGATAGCACCACTCACCC
-+
-677777888888888888888888777765554432221.0//.-.--+,+++**'()))))((&(&''%##"$##
- at 30BB2AAXX080903:3:46:1634:372#0
-TGCCGGGCCTCAGCTGCCTCCCCGCGGGGCAGGGCTCGGCAGCCTGCCAGATCGGGAGGGCGGGTCCTCAGCACTA
-+
-67777788888888888888888877386401441/0-10,.,,%,*+&+&&)**#%)#(#'(##&#$$""$"$"#
- at 30BB2AAXX080903:3:3:193:405#0
-GAGCAGCGATTGGTGCATTTACAAACCTTGAGCTAGACACAAGGTGATGATTGGTGCGTTTACAAACCNACACNAC
-+
-677777888888888888888)8877772505&33220120//.'-$,-,+++*'+(*()((#((&#$"$"$#"#"
- at 30BB2AAXX080903:3:38:1659:1935#0
-TGCTGAGACATGGGGCTGTGGTGAATGGTGCTGCCGAGACATGGTGGCTGGGGGGGATGGGGGTGCTATACTGTGN
-+
-677770888888888888888+88777765-5443202010//.---++,&++%*)))))'('((&#%##"$###"
- at 30BB2AAXX080903:3:39:568:39#0
-GGTGCTGCTGAGACATGGTGGCTGTGGTGAACGGTGCTGAGACATGGTGGCTGGGGGGGGGGGGGCGTGGGGGGTA
-+
-677777888888888888888888777765554422221/0/0-.--',,*)+)**()))%((((#&"&#&$##$%
- at 30BB2AAXX080903:3:40:1067:1195#0
-ATGTCTCAGCACCGTTCACCACAGCCACCATGTCTCAGCAGCACCGTTCACCACAGCCACCATGTCTCGCCCCACT
-+
-67777788888888888888888877776555443222100//---,-,,,*****)))())((((''""#$$"#"
- at 30BB2AAXX080903:3:58:1528:1758#0
-ACATGGTGGCTGTGGTGAACGGTGCCAAGACATGGTGGCTGTGGGGGGGGGGGGTGGTGGGACATGGCAAAAAACN
-+
-6777778888888888888/888877776512443222+00$..'--+&,,**)#(()&()##''%($$"%%$%$"
- at 30BB2AAXX080903:3:58:510:184#0
-ACGGTGCTGCTGAGACATGGTGGCTGTGGTGAACGGTGCCGAGACATGGTGGCTGGGGGGGGAGGGGGGCGATNNA
-+
-677747888888888888888888771763554432,2100-/.-+,--+++***&)))))(#((%'$%##%#""#
- at 30BB2AAXX080903:3:43:1231:1156#0
-CGGCACCGTTCACCACAGCCACCATGTCTCAGCAGCACCGTCCACCACAGCCACCATGTAGATCGGAACGCGGACG
-+
-677777888888888888887888/7176555243+.210./...-,),,,+*+*())()))''(('%"$"""##"
- at 30BB2AAXX080903:3:43:755:369#0
-TCAGCAGCACCGTCCACCACAGCCACCATGTCTCGGCAGCACCGCCCACCACAGCCACCACGTCTCGGCACCACCC
-+
-677777888888888888888888777765354422211/...-%--+,,-+)*))(()(#'&(%'#'%#&$"#"#
- at 30BB2AAXX080903:3:45:1601:1697#0
-CAGCCACCATGTCTCGGCAGCACCGTCCACCACAGCCACCATGTCTCGGCACCGTTCACCACAGCCACCATGTCCG
-+
-67777788888888888888888877776555443.1210.0/-----,--++*)+)())(((((''$$""$"""$
- at 30BB2AAXX080903:3:2:1403:1054#0
-CACCATGTCTCGGCAGCACCGTCCACCACAGCCACCATGTCTCGGCACCGTTCACCACAGAAGATCGCNTGACACA
-+
-677777888888888888888888-77765554432..1/0./.-'(,*-**'')))))(#'((#&'"""&"##"#
- at 30BB2AAXX080903:3:50:732:1756#0
-CACCATGTCTCGGCACCATTCACCACAGCCACCATGTCTCGGCACCGTCCACCACAGCCACCATGTCGCGGCCCCC
-+
-67777788888888888888888877776555343222100//.,----,+++****))(((((('#"%"#"$###
- at 30BB2AAXX080903:3:49:121:2021#0
-ACCGTTCACCACAGCCACCATGTCTCAGCAGCACCGTCCACCACAGCCACCATGTCTCGGCAGCACCCGCAACACA
-+
-6777778888888888888888887777655540.21./2,./+-.,*-+*,***)))))'(''(##$#%#"###"
- at 30BB2AAXX080903:3:39:820:979#0
-CCATGTCTCGGCAGCACCGTTCACCACAGCCACCATGTCTCAGCACCATCCACCACGGCCACCATGTCTCAGCTAC
-+
-67777788888888888888888857776555442121.0/1/..--+,*+++*+*(*))()((''%$#"###"##
- at 30BB2AAXX080903:3:45:506:229#0
-GGACGGTGCTGCTGAGACATGGTGGCCGTGGTGGATGGTGCTGAGACATGGTGGCTGGGGGGGAAGGGTGCGCACA
-+
-67777788888888888888888877775551443222+00-/,..-,,,+*+*&*)'))%)('#''&"%#"#"#"
- at 30BB2AAXX080903:3:38:1077:875#0
-TGTGGTGAACGGTGCCGAGACATGGTGGCTGTGGTGAACGGGGCTGCCGAGACATGGGGGGTGGGGGCTGTTCTAC
-+
-6777778888888888888888887.77655244-230.00)/.,.,,-,,+*()**())%#)'(('"$""""""$
- at 30BB2AAXX080903:3:41:509:358#0
-TGTGGTGAACGGTGCCGAGACATGGTGGCTGTGGTGGACGGTGCTGCCGAGACATGGTGGCCGGGGGGGGGGCAAT
-+
-6777778888888888888888887/7765514412'2./0-//,-,,-+,,+*(**&*)##)'((("%"#"""#"
- at 30BB2AAXX080903:3:34:1765:1123#0
-TGCCGAGACATGGTGGCTGTGGTGGACGGTGCTGCTGAGACATGGTGGCCGGGGGGGGTGGGGGGGGNCACTAANN
-+
-6777778888888888888888787727635044322110&+...+,-&(+'++***(#))'(##''"%#%###""
- at 30BB2AAXX080903:3:58:136:1200#0
-GGACGGTGCTGCCGAGACATGGTGGCTGTGGTGGACGGGGCTGCTGAGACATGGGGGGTGGGGGGGGGTGTCTNNC
-+
-6777778888888888888888887777455+44+.22&0.-/),-"-,*)*++&))(#)(()((('&"%"$"""#
- at 30BB2AAXX080903:3:41:1452:1401#0
-GGTGCTGCCGAGACATGGTGGCTGTGGTGGACGGTGCTGCCGAGACATGGAGGCTGGGGGGGGCGGGGTCTNGACA
-+
-671777888888888888888888.77-650044'2)+1.0.+.,-,#-,$++$#)'))'(((#(('%$#""""""
- at 30BB2AAXX080903:3:60:1542:1754#0
-ACCGTCCACCACAGCCACCATGTCTCGGCAGCACCGTTCACCACAGCCACCATGTCTCAGGACCAACAAACACANN
-+
-67777788888888/88438888/7777455.1,+5/1//.-/+,.+#&$(%)()'(&(##(#'%%&$$%&&$%""
- at 30BB2AAXX080903:3:36:266:1657#0
-GTGGACGGTGCTGCTGAGACATGGTGGCCGTGGTGGATGGTGCTGAGGCGTGGTGGCTGTGGGGGGACACATCTTN
-+
-6777/7888888888888887888177105/54&32/110&/'+.'-(%(+++$*+%&)#()&('%%$#%#$%#""
- at 30BB2AAXX080903:3:44:1142:1341#0
-TGTGGTGAACAATGCTGCTGCAGACATGGTGGCTGGGGGGAACGGGGCCGGGACATGGGGGGGGGGGGGGCTAGCG
-+
-67777788888888888888888877776555443%2200,/'..,-*,,&)+')%)*&))'&('('&$"$$"###
- at 30BB2AAXX080903:3:58:1404:183#0
-CTCGGCACCGTTCACCACAGCCACCATGTCTGCAGCAGCATTGTTCACCACAGATGAATGGATAAACAAAATCNNA
-+
-677777888888888888888888777765554432221/0//..---,,+)++**)*))))()(('%%%##%""$
- at 30BB2AAXX080903:3:51:1451:282#0
-ACTAACTGACCCCCCATTTCACGGCCATAACTACAGCGTCACTTTCCATAACTTCCTCCTGATAAGACACTCTGGC
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))(((''&&"""$""$"
- at 30BB2AAXX080903:3:8:607:1304#0
-TTATGGAAAGTGACGCTGTAGTTATGGCCGTGAAATGGGGGGGCAGTTAGGGCCTGGCAGCGAGCCANCACTCANN
-+
-677777888888888888888888977765452/1012100/#+,-+,+,$+*)(*)'(('(#'#'&"$%##$$""
- at 30BB2AAXX080903:3:35:1505:1904#0
-CCGGATTTCATGTGTTTTCTAGCTATTGGGAGCCTGTCTTTCCCTGGCGCTGGGTGCAACCAGTTCTNGTCGCACN
-+
-67777788888888888888888877776555443210100-/.-.--,,+,+*#+%(('''('(&'""$#"###"
- at 30BB2AAXX080903:3:40:769:561#0
-ACACGCCGCCATTTTGCCCCTCAGTGCACACGCTTGAGCCAACTCGCCCAGTTCCTGAGATCGTATCAGGGTCTCT
-+
-677777888838888888&883486777455530*22210--+)-,-,-&+%*)*))()(('('(#%"%#$""##"
- at 30BB2AAXX080903:3:47:1683:2020#0
-TCCCTGGAGGGAGGGAGCATGCCCGGTGTGTTCACTGGAGGGAGGGAGGATGCCCCGTGTATTCAGGCATGCGTCA
-+
-6777778888888888888888)87777152544/220(00/,..-*,%)**#$##%#'###'####$"""$###"
- at 30BB2AAXX080903:3:55:287:410#0
-GCACCCCTTCTCCCCTGATCCTTCTTCAGGGTGGGCTGTCCACCCATGCAGCATCTTGCGAGAGATCGGCGGCGGT
-+
-67777788888888888888888,7777655/443222&00//+..,-,,+*(***'))'(((((''&"%&&""""
- at 30BB2AAXX080903:3:33:1562:607#0
-TGAGATGGAGTCTGTCTCTGTCGCCCAGGCTGAAGTCCAGTGGCACAATCTCCGCTCACTGCACGCTNGCCACTNN
-+
-67777788848888888888838877876.55'430011/)./--+-,++*&%*'(((&((#'#(%#""$#"#"""
- at 30BB2AAXX080903:3:53:173:884#0
-GCACTTGGGAGGGAGCATGCACAGAGTTTACTGGAGTTGTGCGCACGCTCCCTCGAGGCCTTTTTTTTCTTTTTTT
-+
-677777888088888888888888774763554422011/0//-,.-,+,+*)**())((('''(&'$$$$&%$$$
- at 30BB2AAXX080903:3:3:1044:1064#0
-CCCCCATTGTGCGGCGCGCGGAGGAGCCGCCAGCGCCTGGGCCCGCGTCCTCGTCGCCGCCAGATCGTNAGCCNCA
-+
-677777888888888888088+883784652,411.1-./1...,+,)++*)*$&(#()'%%'##%'""""$#"##
- at 30BB2AAXX080903:3:60:500:161#0
-CATGCGCCCGCGGACGTGCAGCTTCTGTGTCGGTCCCATTAAGAGGAACCCGGCCCAGATCGGAAGAGCCGCTCNN
-+
-6777778888888888888.8888777665554)222')/-.,,,-,,&+$*+)*#(''#(')#'(#%&#$$"#""
- at 30BB2AAXX080903:3:56:467:1684#0
-GCATGATCGTGGCTCACTGCAGCCTGGACCTCCTAGGCTCAAGCGATCCTCCACCTCAGCCTCCAGAGTCTCTCAC
-+
-67777788888888888888888877776555443222100./..---,,,+++*+**)))))(''''$"#$#$##
- at 30BB2AAXX080903:3:56:89:2027#0
-ACACACCCGTGGTCCCAGCTACTCTGGAGGCTGAGGTGGAGGATCGCTTGAGCCTAGGAGGTCCAGGCTGCTCGCC
-+
-677777888888888888888888777765544/32/2100/,.,-,,,,*+*)*%))((('&#&&%"$%#"####
- at 30BB2AAXX080903:3:8:1605:568#0
-CTGTGGCCCTGGGTGACCGTGTCCTTATGCTGGAGCTTGGTCCACAAGTGTCCCCGCCCCTAGATCGNCCTGCGNN
-+
-677777888888888888888888777765554431221000...-+-+,+***)*(*)((((('''""$$"#"""
- at 30BB2AAXX080903:3:35:1258:1134#0
-ACGCCGGCAGGGGCTCTGCTCCCAGAGATCAGGTGGGTGCTGGTCTCAGAGCACAGTTCAGCAGGGGNTCTATCAN
-+
-677777888888888888888884777864554-322.10///.--,,+,,*+$')#'((''(''#'"$$""#$#"
- at 30BB2AAXX080903:3:54:609:1219#0
-GTTCTCGGGAATGTGCACCCCGTGCGGTTACTCAGGAGGGAGCCTCCAGGGACATCTCGCATGGCCTAGACTCTCT
-+
-67777788888888888888888877775555443232100/...---,-+,+**+)))))))((''$%"$$$"$$
- at 30BB2AAXX080903:3:45:1228:510#0
-GCGGTGGCTCACGCCTGGAATCCCAGCACTCTTGAGAGGCCAAGGCGGGCGGAGCCCGTGGAGTCCGGCGNCTGCG
-+
-677777883818'88&88888888/77/6-5%4(103/11/./--+---+,*%)#'##)&%((##%%%##"#"###
- at 30BB2AAXX080903:3:37:502:284#0
-GACGCAACAGAAACCGAACCCCACCAAGGCCCCCAAAACCGAGCCCCACCGAGGCCCCCAAGATCGGACGTCGCCN
-+
-6777778888888888888888887777655542322001/../-.--,++*+)**)*)((((&((%%"""""##"
- at 30BB2AAXX080903:3:41:369:530#0
-TTGGGGGCCTTGGTGGGGTTCGGTTTCTGTTGCGTCACCTCTATGCGGTCCCTGGGGCTGGCGTGCCACGCGCNGG
-+
-67777788888888888888888877776555443222200//..---,,,,+***)*)))((('''%"%#%$""#
- at 30BB2AAXX080903:3:3:1454:1726#0
-GGGGGTAAAGGGCACCCAGCTGCAGTTCTGAGCCTCCCTCGTCCACGCACGTCCTGGTGTAGCTATGCNCATCNTA
-+
-6777778888888888888888887,$76-55441210(/00/.,.,,+,*)+**))#)'(((((&'"""#"%""#
- at 30BB2AAXX080903:3:49:1063:534#0
-GCTGCCTGGCTGGGCAGGAGGCTGGGGGGCCTCTGTCCCGCCATGGCTTCCCCGGGACCGCACCCCCCGCATACAC
-+
-677777888888888888888888777;655043321110///,--,++,+*+))*'())(''('#&$""""$""%
- at 30BB2AAXX080903:3:41:1725:888#0
-ACCTGCAGGCGGGCTCAGGGACCTGGCACTGGGGAGACGAGGGTCAGCGGGGGCCCCAGCCCGAGCTCCNAGCGTT
-+
-677777888888888888888.2'77719'3544/31-1.1/.&+$+(,,$$*$#&'#%#&#&#'%#%$"%#"""#
- at 30BB2AAXX080903:3:45:1667:1542#0
-GGCGGGGCTGCCTCCCATCAGCTCCGAAGATCCCCCAGGTCCTGAGAACCCCTGCTCCGGGTCTCCTGGGGGCCGG
-+
-6777778888888888888888887707665544322212//..--,,,,++*+*()$)(('('(''&"#""#"#"
- at 30BB2AAXX080903:3:51:1686:695#0
-TGAGCTTCGAGGTGCCGTAGCTTCACTTCCGAGGGAGCCGGCCTCACAGGCCGAGGCCAGGGGGCCTNCACACAAC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((((''"$&%$##$$
- at 30BB2AAXX080903:3:46:1033:1163#0
-CACAGGCCCCACCTCCCCACGGGCGAGGGGCACCCCTTGATTCAGGAGGTAGAATGTGGCAACAGAGCGATCTCAC
-+
-67777788888888888888888877776555243222100///.---,,++****))*))(('(((""#"#"#"#
- at 30BB2AAXX080903:3:43:1533:1444#0
-AGGAGAGCAACTGCGGAGAAGGCTGTGCCCTGAGGCGGCAGAGCTGAGGCCAACAGCAACCAGATCGGACAAGGCN
-+
-67777788888888888888888877776555443222210./,'-,-,+,*+*)*())'((((#&(&$#""""""
- at 30BB2AAXX080903:3:33:85:362#0
-AAGGTGGGGCTCTCCAGATGGGGCTGTAAACGCCGCGTCCTGTGTGCTCTGCCTGGGATGGCGCGCCNCACTATNN
-+
-6777178.8888888888888888777765554&3222101%-.,-**-,,++'**)*))))&(('&"%#$###""
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/illumina-as-standard.bam b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/illumina-as-standard.bam
deleted file mode 100644
index a98d864..0000000
Binary files a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/illumina-as-standard.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/s_1_sequence.txt b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/s_1_sequence.txt
deleted file mode 100644
index 8b96bba..0000000
--- a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/s_1_sequence.txt
+++ /dev/null
@@ -1,40 +0,0 @@
- at SL-XAP:1:1:0:1171#0/1
-NTGAGGAGGAATCAGATGAAGTGGAGGATAACGACAATGACTCTGAAATGGAGAGGCCTGTAAATAGAGGAGGCAG
-+SL-XAP:1:1:0:1171#0/1
-DNUYUPUNUXXYWYSYYSVYVRNSWUUYYYYVTSYYXWPWYVYVYPSRTRNPLTQLUYSFSVXXBBBBBBBBBBBB
- at SL-XAP:1:1:0:1477#0/1
-NCACTCGTTTATCCATCCTCTCGTTACTGGGTCATGTCATAAGACTGCAGCCATCTTGGAATCATAAGCTCTATCA
-+SL-XAP:1:1:0:1477#0/1
-DMWYUSUWVWYUQRSUSUWSWYWVWSYYVVVWNRTWROQUWBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:0:1733#0/1
-NAGAACGAGCAGTTTGGAAGTTGCTACCAATTTAATACTCAGACTGCTCTTTCTTGTAAAGAAGCTTATGTTTCAT
-+SL-XAP:1:1:0:1733#0/1
-DOTWZVRUNUVQV[VQNVRNUTKTZZZXVVY[YTQVXXZZRJQODEOYYYYZBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:0:1384#0/1
-NAAATTTATACTTTAAATTACCTTCACTGTTCCATCAAATGACCAAGAAAGCAGTCTTGAATTTTTCAATATTCTA
-+SL-XAP:1:1:0:1384#0/1
-DP[[[[[[Z[[[[[YZZ[[[Z[[[Z[[XRX[[ZZ[ZXXUVOV[[XTPWUUMXXIXZYTOTQVYYYY[WBBBBBBBB
- at SL-XAP:1:1:0:528#0/1
-NAGAAATAATATATATCCTATTTCTTAGTAAGCCACCTAGAACAGCAAGAGTGGCTAAAATGAGATGGTGTTCCTT
-+SL-XAP:1:1:0:528#0/1
-DOUVXXXXYZ[[[YXY[[YXY[[[[YSLVXURXZZ[[[TBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:1:408#0/1
-NGCCACTACGCCATGAAGATCCTCAACAAGCAGAAGGTGGTGAATATGAAGCATGTCTAGCACATACTTAACTAGA
-+SL-XAP:1:1:1:408#0/1
-DMWYVYWUUQUYYTLSWSVYYYYWVWYWVPBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:2:1424#0/1
-NTCAAGTTTCATTACTTTCTTAATTTATTTCCTAAATAGGCTGCCATGATGTCTTATGATCTTAAGAATTAACATT
-+SL-XAP:1:1:2:1424#0/1
-DO[[VLV[[[[[[[[[[[[[[[[[[[[[[[Y[[ZZZZBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:2:1419#0/1
-NGATCATAGGCAAGAGCCACCACATCGACCTAGCACTGCTTTNTAACCTGTGCTCTGACCTGCCCCTCCCAAGCAT
-+SL-XAP:1:1:2:1419#0/1
-DMWWXWXWURWWURWUUWWWWWXVWSKSWWWWUWWWUKSWXNDPUWWWNEMPSWWUOPVWTOTXWVWBBBBBBBBB
- at SL-XAP:1:1:2:1872#0/1
-NTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGTCCCACCGCTGCTTCGCAGGCGG
-+SL-XAP:1:1:2:1872#0/1
-DPWWUWXWRWTPUWWSPPTWUWVWSTNUUONUPTWBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:2:472#0/1
-NATGACTTGTGGGACATCACAGTAGAAGTTGTCCAGTTCATTGGGCCCACAGAAAGGCAGCTGTATGACTAGTATG
-+SL-XAP:1:1:2:472#0/1
-DNWVWYYWRVTSSVWVWYYYYVWUUUVSVTRTYWTRVYWVWUNFLTYWBBBBBBBBBBBBBBBBBBBBBBBBBBBB
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa-as-standard.bam b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa-as-standard.bam
deleted file mode 100644
index 7235dfa..0000000
Binary files a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa-as-standard.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa_full_range_as_solexa.fastq b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa_full_range_as_solexa.fastq
deleted file mode 100644
index 2154981..0000000
--- a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa_full_range_as_solexa.fastq
+++ /dev/null
@@ -1,8 +0,0 @@
- at FAKE0003 Original version has Solexa scores from 62 to -5 inclusive (in that order)
-ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
-+
-;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
- at FAKE0004 Original version has Solexa scores from -5 to 62 inclusive (in that order)
-TGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCA
-+
-~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/unmapped.sam b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/unmapped.sam
deleted file mode 100644
index b47ad2b..0000000
--- a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/unmapped.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at RG	ID:0	SM:Hi,Mom!	PL:ILLUMINA
-both_reads_align_clip_adapter	77	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0
-both_reads_align_clip_adapter	141	*	0	0	*	*	0	0	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0
-both_reads_align_clip_marked	77	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0	XT:i:97
-both_reads_align_clip_marked	141	*	0	0	*	*	0	0	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0	XT:i:97
-both_reads_present_only_first_aligns	77	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0
-both_reads_present_only_first_aligns	141	*	0	0	*	*	0	0	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0
-neither_read_aligns_or_present	77	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0
-neither_read_aligns_or_present	141	*	0	0	*	*	0	0	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0
-read_2_too_many_gaps	77	*	0	0	*	*	0	0	CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN	)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&	RG:Z:0
-read_2_too_many_gaps	141	*	0	0	*	*	0	0	NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA	&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1	RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/util/defective_bgzf.bam b/src/test/resources/htsjdk/samtools/util/defective_bgzf.bam
deleted file mode 100644
index 749b8e7..0000000
Binary files a/src/test/resources/htsjdk/samtools/util/defective_bgzf.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/util/no_bgzf_terminator.bam b/src/test/resources/htsjdk/samtools/util/no_bgzf_terminator.bam
deleted file mode 100644
index 0d9cbf7..0000000
Binary files a/src/test/resources/htsjdk/samtools/util/no_bgzf_terminator.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/util/whitespace_text_file.txt b/src/test/resources/htsjdk/samtools/util/whitespace_text_file.txt
deleted file mode 100644
index 21c7fd8..0000000
--- a/src/test/resources/htsjdk/samtools/util/whitespace_text_file.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Now			is       the time
-for all good				men			   
-to	  come	to the
-#This is a comment
-aid of their country.
-15.0   23  55			67.88888
diff --git a/src/test/resources/htsjdk/tribble/Tb.vcf.idx b/src/test/resources/htsjdk/tribble/Tb.vcf.idx
deleted file mode 100644
index daf3430..0000000
Binary files a/src/test/resources/htsjdk/tribble/Tb.vcf.idx and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/basicDbSNP.dbsnp b/src/test/resources/htsjdk/tribble/basicDbSNP.dbsnp
deleted file mode 100644
index fd1fc5e..0000000
--- a/src/test/resources/htsjdk/tribble/basicDbSNP.dbsnp
+++ /dev/null
@@ -1,43 +0,0 @@
-#bin	chrom	chromStart	chromEnd	name	score	strand	refNCBI	refUCSC	observed	molType	class	valid	avHet	avHetSE	func	locType	weight	
-585	1	259	260	rs72477211	0	+	C	C	A/G	genomic	single	unknown	0	0	unknown	exact	3
-585	1	433	433	rs56289060	0	+	-	-	-/C	genomic	insertion	unknown	0	0	unknown	between	1	
-585	1	491	492	rs55998931	0	+	C	C	C/T	genomic	single	unknown	0	0	unknown	exact	1
-585	1	518	519	rs62636508	0	+	G	G	C/G	genomic	single	unknown	0	0	unknown	exact	1
-585	1	582	583	rs58108140	0	+	G	G	A/G	genomic	single	unknown	0	0	unknown	exact	1
-585	1	690	691	rs10218492	0	+	G	G	A/G	genomic	single	by-cluster	0	0	unknown	exact	1
-585	1	766	767	rs10218493	0	+	G	G	A/G	genomic	single	by-cluster	0	0	unknown	exact	1
-585	1	789	790	rs10218527	0	+	A	A	A/G	genomic	single	by-cluster	0	0	unknown	exact	1
-585	1	800	801	rs28853987	0	+	G	G	A/G	genomic	single	unknown	0	0	unknown	exact	1
-585	1	876	877	rs28484712	0	+	G	G	A/G	genomic	single	unknown	0	0	unknown	exact	1
-585	1	884	885	rs28775022	0	+	G	G	A/G	genomic	single	unknown	0	0	unknown	exact	1
-585	1	884	885	rs62636509	0	+	G	G	A/G	genomic	single	unknown	0	0	unknown	exact	3
-585	1	943	944	rs10218495	0	+	G	G	G/T	genomic	single	by-cluster	0	0	unknown	exact	3
-585	1	1016	1017	rs62635278	0	+	A	A	A/C	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1029	1030	rs62635279	0	+	C	C	A/C	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1271	1272	rs2441671	0	-	A	A	C/T	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1271	1272	rs9803797	0	+	A	A	A/G	genomic	single	by-cluster	0	0	unknown	exact	3
-585	1	1319	1320	rs2758124	0	-	C	C	C/G	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1332	1333	rs3950659	0	-	G	G	C/T	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1370	1371	rs3877545	0	-	A	A	C/T	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1404	1405	rs2758123	0	-	A	A	A/T	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1427	1428	rs2691333	0	-	G	G	A/C	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1468	1469	rs62162368	0	-	A	A	C/T	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1539	1540	rs4030196	0	-	G	G	C/G	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1554	1555	rs2363296	0	-	A	A	G/T	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1591	1592	rs4592209	0	+	T	T	C/T	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1643	1644	rs61427470	0	-	C	C	A/G	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1643	1644	rs62162367	0	-	C	C	A/G	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1649	1650	rs57905273	0	-	T	T	-/A	genomic	deletion	unknown	0	0	unknown	exact	3
-585	1	1665	1666	rs62162366	0	-	T	T	A/G	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1730	1731	rs11510383	0	-	C	C	A/G	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1757	1758	rs4030194	0	-	G	G	C/T	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1783	1784	rs57442816	0	-	T	T	A/G	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1808	1809	rs4849250	0	-	C	C	A/G	genomic	single	by-2hit-2allele	0	0	unknown	exact	3
-585	1	1809	1810	rs7564627	0	-	G	G	C/T	genomic	single	by-cluster	0	0	unknown	exact	3
-585	1	1822	1823	rs71234145	0	+	C	C	C/T	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1823	1824	rs2981848	0	-	G	G	C/T	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1825	1826	rs2462500	0	-	G	G	A/C	genomic	single	by-cluster	0	0	unknown	exact	3
-585	1	1832	1833	rs7357973	0	-	A	A	C/T	genomic	single	by-cluster	0	0	unknown	exact	3
-585	1	1863	1864	rs62028714	0	+	C	C	C/G	genomic	single	unknown	0	0	unknown	exact	3
-585	1	1911	1912	rs7357889	0	-	C	C	C/G	genomic	single	by-cluster	0	0	unknown	exact	3
-585	1	1936	1937	rs11510263	0	-	T	T	A/G	genomic	single	unknown	0	0	unknown	exact	3
diff --git a/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19.bed b/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19.bed
deleted file mode 100644
index 36959bb..0000000
--- a/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19.bed
+++ /dev/null
@@ -1,35 +0,0 @@
-#comment
-1	25592413	25657872
-1	35101420	35111976
-1	110226277	110241477
-1	152555536	152587611
-2	34695828	34736559
-3	65188868	65214748
-3	162512133	162626335
-3	192875328	192885405
-4	10210770	10234599
-4	70130411	70231411
-4	116166903	116177179
-5	104432112	104503671
-6	55825956	55846709
-6	67008726	67048918
-6	78967153	79036479
-6	103737463	103762885
-7	141767909	141785939
-8	24972431	24990943
-8	39232073	39387227
-8	144700483	144714692
-9	23362800	23377775
-9	44242964	44280939
-10	53203675	53214217
-10	71281002	71291092
-11	51341924	51362954
-11	55366389	55376449
-11	55388020	55431449
-11	55445865	55456751
-14	73996607	74025282
-16	19945549	19967579
-19	20595809	20717976
-19	52133806	52150233
-20	1560965		1594435
-20	52647063	52658002
diff --git a/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19_fixed.bed b/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19_fixed.bed
deleted file mode 100644
index ea34a83..0000000
--- a/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19_fixed.bed
+++ /dev/null
@@ -1,36 +0,0 @@
-##########
-1	25592413	25657872
-1	35101420	35111976
-1	110226277	110241477
-1	152555536	152587611
-2	34695828	34736559
-3	65188868	65214748
-3	162512133	162626335
-3	192875328	192885405
-4	10210770	10234599
-4	70130411	70231411
-4	116166903	116177179
-5	104432112	104503671
-6	55825956	55846709
-6	67008726	67048918
-6	78967153	79036479
-6	103737463	103762885
-#########
-7	141767909	141785939
-8	24972431	24990943
-8	39232073	39387227
-8	144700483	144714692
-9	23362800	23377775
-9	44242964	44280939
-10	53203675	53214217
-10	71281002	71291092
-11	51341924	51362954
-11	55366389	55376449
-11	55388020	55431449
-11	55445865	55456751
-14	73996607	74025282
-16	19945549	19967579
-19	20595809	20717976
-19	52133806	52150233
-20	1560965	1594435
-20	52647063	52658002
diff --git a/src/test/resources/htsjdk/tribble/bed/Unigene.sample.bed b/src/test/resources/htsjdk/tribble/bed/Unigene.sample.bed
deleted file mode 100644
index 1628199..0000000
--- a/src/test/resources/htsjdk/tribble/bed/Unigene.sample.bed
+++ /dev/null
@@ -1,72 +0,0 @@
-chr2	1	200000000	LONG_FEATURE	0	+	178707289	178707561	0	3	85,177,8,	0,87,264,
-chr2	178707289	178707561	Hs.666133	0	+	178707289	178707561	0	3	85,177,8,	0,87,264,
-chr2	178709699	178711955	Hs.377257	0	+	178709699	178711955	0	1	2256,	0,
-chr2	178711404	178712057	Hs.688767	0	-	178711404	178712057	0	1	653,	0,
-chr2	178777793	178778272	Hs.541631	0	-	178777793	178778272	0	1	479,	0,
-chr2	178908612	178916376	Hs.318775	0	+	178908612	178916376	0	4	2644,3067,464,1588,	0,2645,5712,6176,
-chr2	178969501	178972156	Hs.593061	0	+	178969501	178972156	0	2	1262,1393,	0,1262,
-chr2	178969902	178971077	Hs.712020	0	-	178969902	178971077	0	1	1175,	0,
-chr2	178973806	178974450	Hs.634282	0	+	178973806	178974450	0	1	644,	0,
-chr2	178974749	178975493	Hs.323349	0	+	178974749	178975493	0	4	337,389,4,13,	0,337,726,731,
-chr2	179004517	179006503	Hs.632540	0	-	179004517	179006503	0	1	1986,	0,
-chr2	179004764	179005050	Hs.625283	0	+	179004764	179005050	0	2	9,276,	0,10,
-chr2	179007083	179007837	Hs.684082	0	+	179007083	179007837	0	5	28,30,20,226,79,	0,72,117,449,675,
-chr2	179008250	179008984	Hs.685223	0	+	179008250	179008984	0	1	734,	0,
-chr2	179008373	179013032	Hs.570274	0	+	179008373	179013032	0	3	2710,583,1365,	0,2711,3294,
-chr2	179011106	179011819	Hs.662660	0	+	179011106	179011819	0	8	556,6,22,98,12,6,6,5,	0,558,564,586,684,696,702,708,
-chr2	179012189	179013184	Hs.658781	0	-	179012189	179013184	0	7	5,9,22,99,844,4,6,	0,6,16,39,139,984,989,
-chr2	179018046	179018564	Hs.633180	0	-	179018046	179018564	0	1	518,	0,
-chr2	179020446	179020899	Hs.605693	0	-	179020446	179020899	0	1	453,	0,
-chr2	179026223	179034260	Hs.87734	0	+	179026223	179034260	0	5	1276,142,118,99,306,	0,2759,5259,7097,7731,
-chr2	179033863	179034261	Hs.607684	0	-	179033863	179034261	0	1	398,	0,
-chr2	179036643	179037341	Hs.645700	0	+	179036643	179037341	0	2	678,19,	0,679,
-chr2	179037911	179051526	Hs.410378	0	-	179037911	179051526	0	5	813,179,134,152,275,	0,814,4713,12123,13340,
-chr2	179052287	179052856	Hs.560940	0	-	179052287	179052856	0	2	291,277,	0,292,
-chr2	179053444	179078029	Hs.41086	0	+	179053444	179078029	0	8	438,117,156,137,165,44,116,1297,	0,5169,10187,13381,15024,18739,20589,23288,
-chr2	179053611	179058730	Hs.560270	0	+	179053611	179058730	0	7	105,37,4,23,99,9,107,	0,105,144,148,172,5002,5012,
-chr2	179078066	179078770	Hs.600801	0	-	179078066	179078770	0	2	350,8,	0,696,
-chr2	179078529	179079064	Hs.541630	0	+	179078529	179079064	0	1	535,	0,
-chr2	179087076	179087882	Hs.560768	0	+	179087076	179087882	0	11	586,90,17,10,22,7,14,23,8,13,10,	0,586,680,697,708,730,738,752,775,783,796,
-chr2	179088297	179088941	Hs.612551	0	+	179088297	179088941	0	7	383,4,214,16,6,5,12,	0,384,389,603,620,626,632,
-chr2	179088778	179089441	Hs.712123	0	-	179088778	179089441	0	8	7,6,8,7,9,12,17,588,	0,9,17,26,34,44,57,75,
-chr2	179088997	179089435	Hs.470769	0	-	179088997	179089435	0	1	438,	0,
-chr2	179095799	179178377	Hs.714450	0	+	179095799	179178377	0	17	34,185,97,331,1193,63,140,135,191,398,421,176,86,118,157,192,675,	0,625,12905,14534,15871,17280,19395,59745,60164,60697,61746,68312,74768,75728,76766,77648,81903,
-chr2	179098961	179380395	Hs.134602	0	-	179098961	179380395	0	314	1319,303,154,692,157,5609,594,306,576,300,306,585,303,303,300,288,594,282,306,306,297,291,306,303,2067,300,288,294,1767,306,303,300,288,297,303,588,297,17106,303,588,297,198,105,588,288,291,288,306,303,297,288,300,303,300,276,303,300,285,321,2967,294,300,282,309,303,300,282,303,303,38,243,151,149,315,300,295,27,292,300,130,33,149,309,430,191,309,300,294,285,297,300,303,363,303,300,279,306,197,106,300,300,116,187,297,288,122 [...]
-chr2	179114097	179114772	Hs.596354	0	-	179114097	179114772	0	1	675,	0,
-chr2	179115873	179116818	Hs.622912	0	-	179115873	179116818	0	2	67,603,	0,342,
-chr2	179121907	179122356	Hs.609542	0	-	179121907	179122356	0	2	224,224,	0,225,
-chr2	179122873	179123656	Hs.621944	0	-	179122873	179123656	0	1	783,	0,
-chr2	179123897	179124349	Hs.619377	0	-	179123897	179124349	0	1	452,	0,
-chr2	179127533	179131939	Hs.640473	0	+	179127533	179131939	0	1	4406,	0,
-chr2	179150961	179151480	Hs.609295	0	-	179150961	179151480	0	1	519,	0,
-chr2	179189619	179190087	Hs.710694	0	+	179189619	179190087	0	12	33,37,18,29,11,179,33,13,34,16,5,52,	0,34,72,91,120,131,311,344,358,393,409,416,
-chr2	179204887	179205401	Hs.661496	0	-	179204887	179205401	0	2	16,498,	0,16,
-chr2	179209546	179287210	Hs.620337	0	-	179209546	179287210	0	5	124,358,6,11,109,	0,77179,77537,77544,77555,
-chr2	179217688	179218151	Hs.603086	0	-	179217688	179218151	0	1	463,	0,
-chr2	179227481	179235392	Hs.678928	0	-	179227481	179235392	0	12	6,15,2,11,72,85,5,79,81,73,8,83,	0,7,23,235,247,402,990,7254,7438,7632,7705,7828,
-chr2	179266309	179266748	Hs.609465	0	-	179266309	179266748	0	1	439,	0,
-chr2	179296428	179300012	Hs.623987	0	+	179296428	179300012	0	1	3584,	0,
-chr2	179302952	179303488	Hs.594545	0	-	179302952	179303488	0	1	536,	0,
-chr2	179305908	179308754	Hs.595834	0	+	179305908	179308754	0	6	121,194,124,4,13,40,	0,701,1567,1691,2793,2806,
-chr2	179315565	179317384	Hs.628418	0	-	179315565	179317384	0	1	1819,	0,
-chr2	179315565	179316076	Hs.670754	0	+	179315565	179316076	0	1	511,	0,
-chr2	179317750	179337584	Hs.589824	0	+	179317750	179337584	0	6	64,57,54,75,373,53,	0,11487,14212,16161,19407,19781,
-chr2	179349897	179352934	Hs.570275	0	+	179349897	179352934	0	2	1830,125,	0,2912,
-chr2	179360386	179361066	Hs.711672	0	+	179360386	179361066	0	1	680,	0,
-chr2	179405591	179445166	Hs.324341	0	-	179405591	179445166	0	13	1821,236,352,117,113,184,195,141,150,180,189,126,62,	0,4274,4773,13006,17429,20821,22727,23637,33147,35406,36497,38807,39513,
-chr2	179433849	179434307	Hs.663044	0	-	179433849	179434307	0	1	458,	0,
-chr2	179445992	179623031	Hs.591627	0	-	179445992	179623031	0	19	283,2269,402,296,353,208,10,1299,192,120,142,173,195,117,254,109,192,123,220,	0,283,2553,2955,3252,3605,3813,3824,11880,13731,15506,32308,45692,71514,88209,102036,105463,174263,176819,
-chr2	179531336	179531470	Hs.610180	0	+	179531336	179531470	0	1	134,	0,
-chr2	179531674	179531995	Hs.610180	0	+	179531674	179531995	0	4	6,17,164,130,	0,10,27,191,
-chr2	179674663	179837595	Hs.30977	0	-	179674663	179837595	0	18	8337,122,192,123,82,160,115,195,123,212,56,98,114,114,91,109,80,125,	0,11032,13373,14976,15840,20078,22023,22672,30612,41900,44710,47605,49586,70428,74756,81388,90095,162807,
-chr2	179675396	179681310	Hs.714518	0	+	179675396	179681310	0	2	435,41,	0,5873,
-chr2	179675483	179675797	Hs.609408	0	+	179675483	179675797	0	1	314,	0,
-chr2	179698890	179699454	Hs.667783	0	-	179698890	179699454	0	2	436,125,	0,439,
-chr2	179702362	179702797	Hs.602509	0	+	179702362	179702797	0	1	435,	0,
-chr2	179714478	179714731	Hs.679403	0	-	179714478	179714731	0	1	253,	0,
-chr2	179720333	179721089	Hs.686454	0	+	179720333	179721089	0	1	756,	0,
-chr2	179820582	179821132	Hs.671087	0	+	179820582	179821132	0	1	550,	0,
-chr2	179820805	179821282	Hs.621019	0	-	179820805	179821282	0	2	264,205,	0,272,
-chr2	179908392	179909870	Hs.516555	0	-	179908392	179909870	0	3	227,147,6,	0,1115,1472,
-chr2	179929123	179929744	Hs.541629	0	-	179929123	179929744	0	4	18,41,385,164,	0,30,71,457,
-chr2	179972131	179973464	Hs.179697	0	-	179972131	179973464	0	3	4,1011,317,	0,5,1016,
diff --git a/src/test/resources/htsjdk/tribble/bed/disconcontigs.bed b/src/test/resources/htsjdk/tribble/bed/disconcontigs.bed
deleted file mode 100644
index 9f3334b..0000000
--- a/src/test/resources/htsjdk/tribble/bed/disconcontigs.bed
+++ /dev/null
@@ -1,5 +0,0 @@
-chr2	178707289	178707561	Hs.666133	0	+	178707289	178707561	0	3	85,177,8,	0,87,264,
-chr1	178709699	178711955	Hs.377257	0	+	178709699	178711955	0	1	2256,	0,
-chr1	178711404	178712057	Hs.688767	0	-	178711404	178712057	0	1	653,	0,
-chr2	178777793	178778272	Hs.541631	0	-	178777793	178778272	0	1	479,	0,
-chr2	178908612	178916376	Hs.318775	0	+	178908612	178916376	0	4	2644,3067,464,1588,	0,2645,5712,6176,
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/tribble/bed/unsorted.bed b/src/test/resources/htsjdk/tribble/bed/unsorted.bed
deleted file mode 100644
index 42500d8..0000000
--- a/src/test/resources/htsjdk/tribble/bed/unsorted.bed
+++ /dev/null
@@ -1,5 +0,0 @@
-chr2	178707289	178707561	Hs.666133	0	+	178707289	178707561	0	3	85,177,8,	0,87,264,
-chr2	178709699	178711955	Hs.377257	0	+	178709699	178711955	0	1	2256,	0,
-chr2	178711404	178712057	Hs.688767	0	-	178711404	178712057	0	1	653,	0,
-chr2	178908612	178916376	Hs.318775	0	+	178908612	178916376	0	4	2644,3067,464,1588,	0,2645,5712,6176,
-chr2	178777793	178778272	Hs.541631	0	-	178777793	178778272	0	1	479,	0,
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/tribble/complexExample.vcf b/src/test/resources/htsjdk/tribble/complexExample.vcf
deleted file mode 100644
index fb76a8d..0000000
--- a/src/test/resources/htsjdk/tribble/complexExample.vcf
+++ /dev/null
@@ -1,23 +0,0 @@
-##format=VCRv3.3
-##source=ArbitrarySource
-##FORMAT=DP,1,Integer,"Read Depth (only filtered reads used for calling)"
-##FORMAT=GQ,1,Integer,"Genotype Quality"
-##FORMAT=GT,1,String,"Genotype"
-##INFO=AB,1,Float,"Allele Balance for hets (ref/(ref+alt))"
-##INFO=AF,1,Float,"Allele Frequency"
-##INFO=DP,1,Integer,"Total Depth"
-##INFO=Dels,1,Float,"Fraction of Reads Containing Spanning Deletions"
-##reference=human_b36_both.fasta
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA00001	NA00002	NA00003	
-1	10001292	testid1	G	A	12.22	0	AF=0.50;AlleleBalance=0.57;DoC=23;HomopolymerRun=0;MAPQ0=8;NS=1;RMSMAPQ=46.31;SB=-24.92;SpanningDeletions=0	GT:DP:GQ	1/0:23:19.27	./.	./.
-1	10002963	.	C	G	22.22	.	AF=0.50;AlleleBalance=0.47;DoC=30;HomopolymerRun=0;MAPQ0=0;NS=1;RMSMAPQ=81.91;SB=-41.73;SpanningDeletions=0	GT:DP:GQ	0/1:30:33.07	./.	./.
-1	10005008	.	A	T,C	123.78	0	AF=1.00;DoC=30;HomopolymerRun=6;MAPQ0=2;NS=1;RMSMAPQ=61.05;SB=-75.45;SpanningDeletions=1	GT:DP:GQ	1/1:27:4.03	0/1:26:3.0	0/0:16:2.0
-1	10006296	.	C	T	42.23	0	AF=0.50;AlleleBalance=0.33;DoC=7;HomopolymerRun=0;MAPQ0=11;NS=1;RMSMAPQ=46.62;SB=-0.04;SpanningDeletions=0	GT:DP:GQ	0/1:7:2000000	./.	./.
-1	10023478	.	G	C,A,T	84.23	.	AF=1.00;DoC=27;HomopolymerRun=1;MAPQ0=10;NS=1;RMSMAPQ=42.16;SB=-48.38;SpanningDeletions=0	GT:DP:GQ	1/1:27:4.03	2/2:26:3.0	0/3:16:2.0
-1	10029362	.	T	C	52.22	.	AF=0.50;AlleleBalance=0.52;DoC=44;HomopolymerRun=0;MAPQ0=0;NS=1;RMSMAPQ=81.28;SB=-42.22;SpanningDeletions=0	GT:DP:GQ	./.	1/0:-1:36.62	./.
-1	10042312	.	G	C	31.81	.	AF=0.50;AlleleBalance=0.70;DoC=24;HomopolymerRun=1;MAPQ0=0;NS=1;RMSMAPQ=85.07;SB=0.00;SpanningDeletions=0	GT:DP:GQ	1/0::5.85	0/0::	0/1:4:
-1	10044557	.	C	T	62.22	.	AF=0.50;AlleleBalance=0.68;DoC=31;HomopolymerRun=16;MAPQ0=0;NS=1;RMSMAPQ=85.34;SB=-0.00;SpanningDeletions=0	GT:DP:GQ	./.	./.	0/1:31:15.01
-1	10045603	.	A	D3	40.26	0	AF=0.50	GT:DP:GQ	0/1:15:7.94	0/0:15:7.94	1/1:15:7.94
-1	10045604	.	A	ICAT	41.26	0	AF=0.50	GT:DP:GQ	1/1:14:6.94	0/0:15:7.94	1/0:15:7.94
-1	10048142	.	A	G	126.81	foo	AF=1.00;DoC=36;HomopolymerRun=4;MAPQ0=0;NS=1;RMSMAPQ=82.11;SB=-85.45;SpanningDeletions=0	GT:DP:GQ	0/1:15:7.94	0/0:15:7.94	1/1:15:7.94
-1	10048580	.	T	A	72.22	bar;baz	AF=0.50;AlleleBalance=0.69;DoC=33;HomopolymerRun=6;MAPQ0=0;NS=1;RMSMAPQ=84.45;SB=-27.41;SpanningDeletions=0	GT:DP:GQ	0/1:15:7.94	0/0:15:7.94	1/1:15:7.94
diff --git a/src/test/resources/htsjdk/tribble/fakeBed.bed b/src/test/resources/htsjdk/tribble/fakeBed.bed
deleted file mode 100644
index 0c46b81..0000000
--- a/src/test/resources/htsjdk/tribble/fakeBed.bed
+++ /dev/null
@@ -1,51 +0,0 @@
-chrM 1 1 TITLE
-chr1 1 1 TITLE
-chr1 101 101 TITLE
-chr1 201 201 TITLE
-chr1 301 301 TITLE
-chr1 401 401 TITLE
-chr1 501 501 TITLE
-chr1 601 601 TITLE
-chr1 701 701 TITLE
-chr1 801 801 TITLE
-chr1 901 901 TITLE
-chr1 1001 1001 TITLE
-chr1 1101 1101 TITLE
-chr1 1201 1201 TITLE
-chr1 1301 1301 TITLE
-chr1 1401 1401 TITLE
-chr1 1501 1501 TITLE
-chr1 1601 1601 TITLE
-chr1 1701 1701 TITLE
-chr1 1801 1801 TITLE
-chr1 1901 1901 TITLE
-chr1 2001 2001 TITLE
-chr1 2101 2101 TITLE
-chr1 2201 2201 TITLE
-chr1 2301 2301 TITLE
-chr1 2401 2401 TITLE
-chr1 2501 2501 TITLE
-chr1 2601 2601 TITLE
-chr1 2701 2701 TITLE
-chr1 2801 2801 TITLE
-chr1 2901 2901 TITLE
-chr1 3001 3001 TITLE
-chr1 3101 3101 TITLE
-chr1 3201 3201 TITLE
-chr1 3301 3301 TITLE
-chr1 3401 3401 TITLE
-chr1 3501 3501 TITLE
-chr1 3601 3601 TITLE
-chr1 3701 3701 TITLE
-chr1 3801 3801 TITLE
-chr1 3901 3901 TITLE
-chr1 4001 4001 TITLE
-chr1 4101 4101 TITLE
-chr1 4201 4201 TITLE
-chr1 4301 4301 TITLE
-chr1 4401 4401 TITLE
-chr1 4501 4501 TITLE
-chr1 4601 4601 TITLE
-chr1 4701 4701 TITLE
-chr1 4801 4801 TITLE
-chr1 4901 4901 TITLE
diff --git a/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz b/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz
deleted file mode 100644
index e8c7465..0000000
Binary files a/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz.tbi b/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz.tbi
deleted file mode 100644
index 0f71973..0000000
Binary files a/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/gwas/smallp.gwas b/src/test/resources/htsjdk/tribble/gwas/smallp.gwas
deleted file mode 100644
index 0344a98..0000000
--- a/src/test/resources/htsjdk/tribble/gwas/smallp.gwas
+++ /dev/null
@@ -1,20 +0,0 @@
-SNP     CHR     BP      P
-rs1233367       6       29622220        2.28235e-32
-rs29228 6       29623739        0.931148124684
-rs29228 6       29623739        1.70737e-89
-rs3130250       6       29625001        7.18775027174e-05
-rs2535260       6       29628883        0.00246256208471
-rs3129063       6       29645613        3.32185e-97
-rs387642        6       29645634        8.0006e-123
-rs385492        6       29649547        7.60380647336e-12
-rs3129045       6       29652576        4.16094765754e-07
-rs3129090       6       29664131        9.31671032411e-06
-rs3131886       6       29664452        1.85639e-21
-rs3129190       6       29669443        6.50202338003e-05
-rs6456993       6       29670536        5.71059057921e-05
-rs3129046       6       29670652        8.48154e-66
-rs3116788       6       29674197        2.1088206692e-07
-rs3131862       6       29675227        1.81790802347e-05
-rs1610584       6       29675615        7.97182551082e-08
-rs1610585       6       29675676        1.44138539548e-07
-rs9258126       6       29675791        0.000193925445894
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/tribble/index/chrY_Y4_small.bed b/src/test/resources/htsjdk/tribble/index/chrY_Y4_small.bed
deleted file mode 100644
index b85a841..0000000
--- a/src/test/resources/htsjdk/tribble/index/chrY_Y4_small.bed
+++ /dev/null
@@ -1,5000 +0,0 @@
-track name="chrY_Y4 Sequences" description="Illumina bowtie-aligned reads - Y4" visibility=4 priority=10 itemRgb="On"
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770199	2770251	CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA	0	+	2770199	2770251	255,0,0	
-chrY	2770217	2770269	GAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGCCAAACT	0	+	2770217	2770269	255,0,0	
-chrY	2770217	2770269	GAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCATTGGCTGCTTGACAAATT	0	+	2770217	2770269	255,0,0	
-chrY	2770220	2770272	GCNCTTAAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAAC	0	+	2770220	2770272	255,0,0	
-chrY	2770220	2770272	GCACTTAAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAAATAAC	0	+	2770220	2770272	255,0,0	
-chrY	2770222	2770274	ACTTAAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGG	0	+	2770222	2770274	255,0,0	
-chrY	2770222	2770274	ACTTAAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGG	0	+	2770222	2770274	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770226	2770278	AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT	0	+	2770226	2770278	255,0,0	
-chrY	2770229	2770281	GCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGGGTATT	0	+	2770229	2770281	255,0,0	
-chrY	2772150	2772202	GGAATGTCTTCCTCTGATCGTCTTCCTCAGGAATAGGCTCAAGTATGCGTG	0	-	2772150	2772202	0,0,255	
-chrY	2772150	2772202	GGAAGGTCTTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTG	0	-	2772150	2772202	0,0,255	
-chrY	2772157	2772209	CTTCCTCTGATCGTCTTCCTCAGGAATCGACTCAAGTATGCGTTGACTGGA	0	+	2772157	2772209	255,0,0	
-chrY	2772157	2772209	CCTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGA	0	+	2772157	2772209	255,0,0	
-chrY	2772157	2772209	CTTCCTCTGATGGTCTTCCCCGGGAATAGACTCAAGTATGCGTTGACTGGA	0	+	2772157	2772209	255,0,0	
-chrY	2772157	2772209	CTTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGG	0	+	2772157	2772209	255,0,0	
-chrY	2772158	2772210	TTCCTCTGATCGGCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAG	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGGCTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGATTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772158	2772210	TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA	0	-	2772158	2772210	0,0,255	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772160	2772212	TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT	0	+	2772160	2772212	255,0,0	
-chrY	2772187	2772239	CTCAAGCATGCGTTGACTGGAGATGAGGAAAAGAAGATATGTATGCAACGT	0	+	2772187	2772239	255,0,0	
-chrY	2772201	2772253	GACCGGAGATGAGGTAAAGAAGATATGTATGCAACGTTTCATCAAAATTGA	0	-	2772201	2772253	0,0,255	
-chrY	2772214	2772266	GTAAAGAAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGATCGA	0	+	2772214	2772266	255,0,0	
-chrY	2772214	2772266	GTAAAGACGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGA	0	+	2772214	2772266	255,0,0	
-chrY	2772215	2772267	AAAAGAAGATATGTATGCAACGTTTCATCAAAATAGATGGCAAGGTTCGAG	0	-	2772215	2772267	0,0,255	
-chrY	2772215	2772267	TAAAGAAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCTAG	0	-	2772215	2772267	0,0,255	
-chrY	2772215	2772267	TAAAGAAGATATGTATGCAACGTTTCATCAAAATTGGTGGCAAGGTTCGAG	0	-	2772215	2772267	0,0,255	
-chrY	2772215	2772267	TAAAGAGGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAG	0	-	2772215	2772267	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGACGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAATGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTAGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGAGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATAGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	+	2772220	2772272	255,0,0	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772220	2772272	AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT	0	-	2772220	2772272	0,0,255	
-chrY	2772223	2772275	ATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTC	0	-	2772223	2772275	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772224	2772276	TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA	0	-	2772224	2772276	0,0,255	
-chrY	2772226	2772278	TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA	0	+	2772226	2772278	255,0,0	
-chrY	2772226	2772278	TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA	0	+	2772226	2772278	255,0,0	
-chrY	2772226	2772278	TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA	0	+	2772226	2772278	255,0,0	
-chrY	2772226	2772278	TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA	0	+	2772226	2772278	255,0,0	
-chrY	2772226	2772278	TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA	0	+	2772226	2772278	255,0,0	
-chrY	2772226	2772278	TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA	0	+	2772226	2772278	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAGGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGCCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	NTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGATTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772227	2772279	GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT	0	+	2772227	2772279	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAAGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGGCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772229	2772281	ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC	0	+	2772229	2772281	255,0,0	
-chrY	2772230	2772282	TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC	0	+	2772230	2772282	255,0,0	
-chrY	2772230	2772282	TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC	0	+	2772230	2772282	255,0,0	
-chrY	2772230	2772282	TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC	0	+	2772230	2772282	255,0,0	
-chrY	2772230	2772282	TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC	0	+	2772230	2772282	255,0,0	
-chrY	2772230	2772282	TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC	0	+	2772230	2772282	255,0,0	
-chrY	2772230	2772282	TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC	0	+	2772230	2772282	255,0,0	
-chrY	2772230	2772282	TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC	0	+	2772230	2772282	255,0,0	
-chrY	2772230	2772282	TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC	0	+	2772230	2772282	255,0,0	
-chrY	2772230	2772282	TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC	0	+	2772230	2772282	255,0,0	
-chrY	2772231	2772283	GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC	0	+	2772231	2772283	255,0,0	
-chrY	2772231	2772283	GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC	0	+	2772231	2772283	255,0,0	
-chrY	2772231	2772283	GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC	0	+	2772231	2772283	255,0,0	
-chrY	2772231	2772283	GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC	0	+	2772231	2772283	255,0,0	
-chrY	2772231	2772283	GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC	0	+	2772231	2772283	255,0,0	
-chrY	2772231	2772283	GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC	0	+	2772231	2772283	255,0,0	
-chrY	2772231	2772283	GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC	0	+	2772231	2772283	255,0,0	
-chrY	2772231	2772283	GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC	0	+	2772231	2772283	255,0,0	
-chrY	2772231	2772283	GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC	0	+	2772231	2772283	255,0,0	
-chrY	2772231	2772283	GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC	0	+	2772231	2772283	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGTATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGAGGATGTCACATACCAT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGCTGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT	0	+	2772232	2772284	255,0,0	
-chrY	2772232	2772284	CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC	0	-	2772232	2772284	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772233	2772285	AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG	0	-	2772233	2772285	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATCGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGN	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772234	2772286	ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC	0	-	2772234	2772286	0,0,255	
-chrY	2772235	2772287	CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCG	0	-	2772235	2772287	0,0,255	
-chrY	2772235	2772287	CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCG	0	-	2772235	2772287	0,0,255	
-chrY	2772235	2772287	CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCG	0	-	2772235	2772287	0,0,255	
-chrY	2772235	2772287	CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCG	0	-	2772235	2772287	0,0,255	
-chrY	2772235	2772287	CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCT	0	+	2772235	2772287	255,0,0	
-chrY	2772235	2772287	CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCT	0	+	2772235	2772287	255,0,0	
-chrY	2772235	2772287	CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCT	0	+	2772235	2772287	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772236	2772288	GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG	0	+	2772236	2772288	255,0,0	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772237	2772289	TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG	0	-	2772237	2772289	0,0,255	
-chrY	2772244	2772296	AAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGGAGTCATG	0	-	2772244	2772296	0,0,255	
-chrY	2772244	2772296	AAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCGGGATTCATG	0	-	2772244	2772296	0,0,255	
-chrY	2772244	2772296	AAAAGTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGGATTCATG	0	-	2772244	2772296	0,0,255	
-chrY	2772244	2772296	AAAAGTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGGATTCATG	0	-	2772244	2772296	0,0,255	
-chrY	2772244	2772296	AAAAGTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGGATTCATG	0	-	2772244	2772296	0,0,255	
-chrY	2772244	2772296	AAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGGCTTCATG	0	+	2772244	2772296	255,0,0	
-chrY	2772244	2772296	AAAATTGATGGCAAGGTTCGAGTGGATGTCACATGCCCTGCTGGATTCATG	0	-	2772244	2772296	0,0,255	
-chrY	2772245	2772297	AAATTGATGGCAAGGTTCGAGTGGATGTCACGTACCCTGCTGGATTCATGG	0	+	2772245	2772297	255,0,0	
-chrY	2772245	2772297	AAATTGATGGCAAGGTTTGAGTGGATGTCACATACCCTGCTGGATTCATGG	0	+	2772245	2772297	255,0,0	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTTGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	GTCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ANCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773689	2773741	ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG	0	-	2773689	2773741	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCACGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	+	2773690	2773742	255,0,0	
-chrY	2773690	2773742	TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG	0	-	2773690	2773742	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGAGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG	0	-	2773694	2773746	0,0,255	
-chrY	2773694	2773746	CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA	0	-	2773694	2773746	0,0,255	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTTTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773699	2773751	AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG	0	+	2773699	2773751	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	GGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773702	2773754	AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG	0	+	2773702	2773754	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773703	2773755	GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT	0	+	2773703	2773755	255,0,0	
-chrY	2773709	2773761	TGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCG	0	+	2773709	2773761	255,0,0	
-chrY	2773709	2773761	TGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCG	0	+	2773709	2773761	255,0,0	
-chrY	2773709	2773761	TGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCG	0	+	2773709	2773761	255,0,0	
-chrY	2773709	2773761	TGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCG	0	+	2773709	2773761	255,0,0	
-chrY	2773709	2773761	TGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCG	0	+	2773709	2773761	255,0,0	
-chrY	2773710	2773762	GAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGC	0	-	2773710	2773762	0,0,255	
-chrY	2773710	2773762	GAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGC	0	-	2773710	2773762	0,0,255	
-chrY	2773710	2773762	GAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGC	0	-	2773710	2773762	0,0,255	
-chrY	2773710	2773762	GAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGC	0	-	2773710	2773762	0,0,255	
-chrY	2773710	2773762	GAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGC	0	-	2773710	2773762	0,0,255	
-chrY	2773715	2773767	TTTCCNCCTGGTCTATGACACCAAGGGCCGTTTTGCNGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773715	2773767	TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC	0	+	2773715	2773767	255,0,0	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCATTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCATTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773717	2773769	TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG	0	-	2773717	2773769	0,0,255	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTTCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773718	2773770	CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT	0	+	2773718	2773770	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773720	2773772	GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG	0	+	2773720	2773772	255,0,0	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773722	2773774	CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA	0	-	2773722	2773774	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773723	2773775	TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG	0	-	2773723	2773775	0,0,255	
-chrY	2773725	2773777	GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG	0	-	2773725	2773777	0,0,255	
-chrY	2773725	2773777	GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG	0	-	2773725	2773777	0,0,255	
-chrY	2773725	2773777	GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG	0	-	2773725	2773777	0,0,255	
-chrY	2773725	2773777	GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG	0	-	2773725	2773777	0,0,255	
-chrY	2773725	2773777	GTCTATGACACGAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG	0	-	2773725	2773777	0,0,255	
-chrY	2773725	2773777	GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG	0	-	2773725	2773777	0,0,255	
-chrY	2773725	2773777	GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG	0	-	2773725	2773777	0,0,255	
-chrY	2773725	2773777	GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG	0	-	2773725	2773777	0,0,255	
-chrY	2773725	2773777	GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG	0	-	2773725	2773777	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773727	2773779	CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC	0	-	2773727	2773779	0,0,255	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCNNGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCNA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTCCTGTTCACCGCATCCCAGTGGAAGAGCCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773729	2773781	ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGCCAA	0	+	2773729	2773781	255,0,0	
-chrY	2773731	2773783	GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG	0	-	2773731	2773783	0,0,255	
-chrY	2773731	2773783	GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG	0	-	2773731	2773783	0,0,255	
-chrY	2773731	2773783	GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG	0	-	2773731	2773783	0,0,255	
-chrY	2773731	2773783	GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG	0	-	2773731	2773783	0,0,255	
-chrY	2773731	2773783	GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG	0	-	2773731	2773783	0,0,255	
-chrY	2773731	2773783	GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG	0	-	2773731	2773783	0,0,255	
-chrY	2773731	2773783	GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG	0	-	2773731	2773783	0,0,255	
-chrY	2773731	2773783	GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG	0	-	2773731	2773783	0,0,255	
-chrY	2773731	2773783	GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG	0	-	2773731	2773783	0,0,255	
-chrY	2773731	2773783	GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG	0	-	2773731	2773783	0,0,255	
-chrY	2773733	2773785	CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA	0	+	2773733	2773785	255,0,0	
-chrY	2773733	2773785	CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA	0	+	2773733	2773785	255,0,0	
-chrY	2773733	2773785	CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA	0	+	2773733	2773785	255,0,0	
-chrY	2773733	2773785	CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA	0	+	2773733	2773785	255,0,0	
-chrY	2773733	2773785	CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA	0	+	2773733	2773785	255,0,0	
-chrY	2773733	2773785	CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA	0	+	2773733	2773785	255,0,0	
-chrY	2773733	2773785	CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA	0	+	2773733	2773785	255,0,0	
-chrY	2773733	2773785	CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA	0	+	2773733	2773785	255,0,0	
-chrY	2773733	2773785	CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA	0	+	2773733	2773785	255,0,0	
-chrY	2773733	2773785	CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA	0	+	2773733	2773785	255,0,0	
-chrY	2773733	2773785	CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA	0	+	2773733	2773785	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTATGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774693	2774745	TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT	0	+	2774693	2774745	255,0,0	
-chrY	2774811	2774863	AAATCAAAGCTGATGACTGGTTTCTGCTTTTGTATGGAATTTGGATCTCAA	0	-	2774811	2774863	0,0,255	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCCGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGACCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGNGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCTGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCCGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2774930	2774982	CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG	0	+	2774930	2774982	255,0,0	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	TCGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCAGTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775049	2775101	ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG	0	-	2775049	2775101	0,0,255	
-chrY	2775260	2775312	CAGGGAGCCTTTTCATAGTTTATTAATCCACCAGGTAGCATAGGTTAGTGG	0	+	2775260	2775312	255,0,0	
-chrY	2775260	2775312	CAGGGAGCCTTTTCATAGTTTATTAATCCACCAGGTAGCATAGGTTAGTGG	0	+	2775260	2775312	255,0,0	
-chrY	2775260	2775312	CAGGGAGCCTTTTCATAGTTTATTAATCCACCAGGTAGCATAGGTTAGTGG	0	+	2775260	2775312	255,0,0	
-chrY	2775260	2775312	CAGGGAGCCTTTTCATAGTTTATTAATCCACCAGGTAGCATAGGTTAGTGG	0	+	2775260	2775312	255,0,0	
-chrY	2775260	2775312	CAGGGAGCCTTTTCATAGTTTATTAATCCACCAGGTAGCATAGGTTAGTGG	0	+	2775260	2775312	255,0,0	
-chrY	2775362	2775414	GTGGTATTTTGTGGGTCTTGGGAAAACAGCCTGATGGATTTCAGACATAAT	0	-	2775362	2775414	0,0,255	
-chrY	2775362	2775414	GTGGTATTTTGTGGGTCTTGGGAAAACAGCCTGATGGATTTCAGACATAAT	0	-	2775362	2775414	0,0,255	
-chrY	2775362	2775414	GTGGTATTTTGTGGGTCTTGGGAAAACAGCCTGATGGATTTCAGACATAAT	0	-	2775362	2775414	0,0,255	
-chrY	2775362	2775414	GTGGTATTTTGTGGGTCTTGGGAAAACAGCCTGATGGATTTCAGACATAAT	0	-	2775362	2775414	0,0,255	
-chrY	2775362	2775414	GTGGTATTTTGTGGGTCTTGGGAAAACAGCCTGATGGATTTCAGACATAAT	0	-	2775362	2775414	0,0,255	
-chrY	2776928	2776980	GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT	0	+	2776928	2776980	255,0,0	
-chrY	2776928	2776980	GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT	0	+	2776928	2776980	255,0,0	
-chrY	2776928	2776980	GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT	0	+	2776928	2776980	255,0,0	
-chrY	2776928	2776980	GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT	0	+	2776928	2776980	255,0,0	
-chrY	2776928	2776980	GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT	0	+	2776928	2776980	255,0,0	
-chrY	2776928	2776980	GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT	0	+	2776928	2776980	255,0,0	
-chrY	2776928	2776980	GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT	0	+	2776928	2776980	255,0,0	
-chrY	2777048	2777100	ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT	0	-	2777048	2777100	0,0,255	
-chrY	2777048	2777100	ACTCATAGCAAGATGGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT	0	-	2777048	2777100	0,0,255	
-chrY	2777048	2777100	ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT	0	-	2777048	2777100	0,0,255	
-chrY	2777048	2777100	ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT	0	-	2777048	2777100	0,0,255	
-chrY	2777048	2777100	ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT	0	-	2777048	2777100	0,0,255	
-chrY	2777048	2777100	ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT	0	-	2777048	2777100	0,0,255	
-chrY	2777048	2777100	ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT	0	-	2777048	2777100	0,0,255	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777447	2777499	CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA	0	+	2777447	2777499	255,0,0	
-chrY	2777453	2777505	CCGAACTCTGATTCCTTTACCGCATAGAGGCTGAGCCCCATACTAGGAACT	0	+	2777453	2777505	255,0,0	
-chrY	2777453	2777505	CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT	0	+	2777453	2777505	255,0,0	
-chrY	2777453	2777505	CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT	0	+	2777453	2777505	255,0,0	
-chrY	2777453	2777505	CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT	0	+	2777453	2777505	255,0,0	
-chrY	2777453	2777505	CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT	0	+	2777453	2777505	255,0,0	
-chrY	2777453	2777505	CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT	0	+	2777453	2777505	255,0,0	
-chrY	2777453	2777505	CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT	0	+	2777453	2777505	255,0,0	
-chrY	2777453	2777505	CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT	0	+	2777453	2777505	255,0,0	
-chrY	2777453	2777505	CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT	0	+	2777453	2777505	255,0,0	
-chrY	2777453	2777505	CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT	0	+	2777453	2777505	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777539	2777591	CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT	0	+	2777539	2777591	255,0,0	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGGCGCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777561	2777613	GCCAGGGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA	0	-	2777561	2777613	0,0,255	
-chrY	2777581	2777633	CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG	0	-	2777581	2777633	0,0,255	
-chrY	2777581	2777633	CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG	0	-	2777581	2777633	0,0,255	
-chrY	2777581	2777633	CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG	0	-	2777581	2777633	0,0,255	
-chrY	2777581	2777633	CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG	0	-	2777581	2777633	0,0,255	
-chrY	2777581	2777633	CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG	0	-	2777581	2777633	0,0,255	
-chrY	2777581	2777633	CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG	0	-	2777581	2777633	0,0,255	
-chrY	2777581	2777633	CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG	0	-	2777581	2777633	0,0,255	
-chrY	2777581	2777633	CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG	0	-	2777581	2777633	0,0,255	
-chrY	2777581	2777633	CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG	0	-	2777581	2777633	0,0,255	
-chrY	2777581	2777633	CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG	0	-	2777581	2777633	0,0,255	
-chrY	2777631	2777683	GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA	0	+	2777631	2777683	255,0,0	
-chrY	2777631	2777683	GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA	0	+	2777631	2777683	255,0,0	
-chrY	2777631	2777683	GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA	0	+	2777631	2777683	255,0,0	
-chrY	2777631	2777683	GTCACATCTTTAAAATCTAAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA	0	+	2777631	2777683	255,0,0	
-chrY	2777631	2777683	GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA	0	+	2777631	2777683	255,0,0	
-chrY	2777631	2777683	GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA	0	+	2777631	2777683	255,0,0	
-chrY	2777631	2777683	GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA	0	+	2777631	2777683	255,0,0	
-chrY	2777631	2777683	GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA	0	+	2777631	2777683	255,0,0	
-chrY	2777631	2777683	GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA	0	+	2777631	2777683	255,0,0	
-chrY	2777631	2777683	GTTACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA	0	+	2777631	2777683	255,0,0	
-chrY	2777631	2777683	GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA	0	+	2777631	2777683	255,0,0	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAGTTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	CGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGCGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777667	2777719	TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC	0	-	2777667	2777719	0,0,255	
-chrY	2777745	2777797	AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC	0	-	2777745	2777797	0,0,255	
-chrY	2777745	2777797	AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC	0	-	2777745	2777797	0,0,255	
-chrY	2777745	2777797	AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC	0	-	2777745	2777797	0,0,255	
-chrY	2777745	2777797	AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC	0	-	2777745	2777797	0,0,255	
-chrY	2777745	2777797	AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC	0	-	2777745	2777797	0,0,255	
-chrY	2777745	2777797	AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC	0	-	2777745	2777797	0,0,255	
-chrY	2777745	2777797	AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC	0	-	2777745	2777797	0,0,255	
-chrY	2777745	2777797	AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC	0	-	2777745	2777797	0,0,255	
-chrY	2777745	2777797	AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC	0	-	2777745	2777797	0,0,255	
-chrY	2777745	2777797	AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC	0	-	2777745	2777797	0,0,255	
-chrY	2777745	2777797	AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC	0	-	2777745	2777797	0,0,255	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTATTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778418	2778470	AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT	0	+	2778418	2778470	255,0,0	
-chrY	2778697	2778749	TTAGAATCACCCAAGTAGGTTCAGGATGTCACATACAAAAAATGTGGAGGA	0	+	2778697	2778749	255,0,0	
-chrY	2778697	2778749	TTAGAATCACCCAAGTAGGTTCAGGATGTCACATACAAAAAATGTGGAGGA	0	+	2778697	2778749	255,0,0	
-chrY	2778697	2778749	TTAGAATCACCCAAGTAGGTTCAGGATGTCACATACAAAAAATGTGGAGGA	0	+	2778697	2778749	255,0,0	
-chrY	2778697	2778749	TTAGAATCACCCAAGTAGGTTCAGGATGTCACATACAAAAAATGTGGAGGA	0	+	2778697	2778749	255,0,0	
-chrY	2778697	2778749	TTAGAATCACCCAAGTAGGTTCAGGATGTCACATACAAAAAATGTGGAGGA	0	+	2778697	2778749	255,0,0	
-chrY	2778798	2778850	TCATGAAGTTGGAGGGGCAGAGGTAGAGAGCTTGCATTTCAGAGTTCTTTC	0	-	2778798	2778850	0,0,255	
-chrY	2778798	2778850	TCATGAAGTTGGAGGGGCAGAGGTAGAGAGCTTGCATTTCAGAGTTCTTTC	0	-	2778798	2778850	0,0,255	
-chrY	2778798	2778850	TCATGAAGTTGGAGGGGCAGAGGTAGAGAGCTTGCATTTCAGAGTTCTTTC	0	-	2778798	2778850	0,0,255	
-chrY	2778798	2778850	TCATGAAGTTGGAGGGGCAGAGGTAGAGAGCTTGCATTTCAGAGTTCTTTC	0	-	2778798	2778850	0,0,255	
-chrY	2778798	2778850	TCATGAAGTTGGAGGGGCAGAGGTAGAGAGCTTGCATTTCAGAGTTCTTTC	0	-	2778798	2778850	0,0,255	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779169	2779221	CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG	0	+	2779169	2779221	255,0,0	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779277	2779329	GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG	0	-	2779277	2779329	0,0,255	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779315	2779367	TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG	0	+	2779315	2779367	255,0,0	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAAGGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTGTGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779428	2779480	TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT	0	-	2779428	2779480	0,0,255	
-chrY	2779683	2779735	ATCCCTCTGTGCCCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTG	0	+	2779683	2779735	255,0,0	
-chrY	2779683	2779735	ATCCCTCTGTGCCCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTG	0	+	2779683	2779735	255,0,0	
-chrY	2779683	2779735	ATCCCTCTGTGCCCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTG	0	+	2779683	2779735	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779695	2779747	CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA	0	+	2779695	2779747	255,0,0	
-chrY	2779735	2779787	CTGCTTAGTGAACCTCCTTTCAGTACCCTGGACACTCTGTGTCTGTGTCCA	0	-	2779735	2779787	0,0,255	
-chrY	2779735	2779787	CTGCTTAGTGAACCTCCTTTCAGTACCCTGGACACTCTGTGTCTGTGTCCA	0	-	2779735	2779787	0,0,255	
-chrY	2779735	2779787	CTGCTTAGTGAACCTCCTTTCAGTACCCTGGACACTCTGTGTCTGTGTCCA	0	-	2779735	2779787	0,0,255	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779789	2779841	TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG	0	+	2779789	2779841	255,0,0	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779810	2779862	GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG	0	-	2779810	2779862	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2779899	2779951	TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA	0	-	2779899	2779951	0,0,255	
-chrY	2780254	2780306	ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT	0	+	2780254	2780306	255,0,0	
-chrY	2780254	2780306	ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT	0	+	2780254	2780306	255,0,0	
-chrY	2780254	2780306	ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT	0	+	2780254	2780306	255,0,0	
-chrY	2780254	2780306	ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT	0	+	2780254	2780306	255,0,0	
-chrY	2780254	2780306	ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT	0	+	2780254	2780306	255,0,0	
-chrY	2780254	2780306	ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT	0	+	2780254	2780306	255,0,0	
-chrY	2780254	2780306	ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT	0	+	2780254	2780306	255,0,0	
-chrY	2780254	2780306	ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT	0	+	2780254	2780306	255,0,0	
-chrY	2780254	2780306	ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT	0	+	2780254	2780306	255,0,0	
-chrY	2780254	2780306	ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT	0	+	2780254	2780306	255,0,0	
-chrY	2780385	2780437	TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA	0	-	2780385	2780437	0,0,255	
-chrY	2780385	2780437	TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA	0	-	2780385	2780437	0,0,255	
-chrY	2780385	2780437	TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA	0	-	2780385	2780437	0,0,255	
-chrY	2780385	2780437	TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA	0	-	2780385	2780437	0,0,255	
-chrY	2780385	2780437	TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA	0	-	2780385	2780437	0,0,255	
-chrY	2780385	2780437	TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA	0	-	2780385	2780437	0,0,255	
-chrY	2780385	2780437	TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA	0	-	2780385	2780437	0,0,255	
-chrY	2780385	2780437	TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA	0	-	2780385	2780437	0,0,255	
-chrY	2780385	2780437	TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA	0	-	2780385	2780437	0,0,255	
-chrY	2780385	2780437	TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA	0	-	2780385	2780437	0,0,255	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAACGCTGGCAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780563	2780615	GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT	0	+	2780563	2780615	255,0,0	
-chrY	2780640	2780692	AAATATGAGGTGGTGGTGGCAAACAAACTGACCACTCATTGGAGAATGCCT	0	+	2780640	2780692	255,0,0	
-chrY	2780640	2780692	AAATATGAGGTGGTGGTGGCAAACAAACTGAACACTCATTGGAGAATGCCT	0	+	2780640	2780692	255,0,0	
-chrY	2780640	2780692	AAATATGAGGTGGTGGTGGCAAACAAACTGAACACTCATTGGAGAATGCCT	0	+	2780640	2780692	255,0,0	
-chrY	2780640	2780692	AAATATGAGGTGGTGGTGGCAAACAAACTGAACACTCATTGGAGAATGCCT	0	+	2780640	2780692	255,0,0	
-chrY	2780640	2780692	AAATATGAGGTGGTGGTGGCAAACAAACTGAACACTCATTGGAGAATGCCT	0	+	2780640	2780692	255,0,0	
-chrY	2780640	2780692	AAATATGAGGTGGTGGTGGCAAACAAACTGAACACTCATTGGAGAATGCCT	0	+	2780640	2780692	255,0,0	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2780701	2780753	GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC	0	-	2780701	2780753	0,0,255	
-chrY	2781475	2781527	CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG	0	+	2781475	2781527	255,0,0	
-chrY	2781475	2781527	CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG	0	+	2781475	2781527	255,0,0	
-chrY	2781475	2781527	CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG	0	+	2781475	2781527	255,0,0	
-chrY	2781475	2781527	CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG	0	+	2781475	2781527	255,0,0	
-chrY	2781475	2781527	CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG	0	+	2781475	2781527	255,0,0	
-chrY	2781475	2781527	CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG	0	+	2781475	2781527	255,0,0	
-chrY	2781475	2781527	CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG	0	+	2781475	2781527	255,0,0	
-chrY	2781475	2781527	CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG	0	+	2781475	2781527	255,0,0	
-chrY	2781475	2781527	CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG	0	+	2781475	2781527	255,0,0	
-chrY	2781475	2781527	CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG	0	+	2781475	2781527	255,0,0	
-chrY	2781572	2781624	TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC	0	-	2781572	2781624	0,0,255	
-chrY	2781572	2781624	TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC	0	-	2781572	2781624	0,0,255	
-chrY	2781572	2781624	TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC	0	-	2781572	2781624	0,0,255	
-chrY	2781572	2781624	TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC	0	-	2781572	2781624	0,0,255	
-chrY	2781572	2781624	TATGTTGGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC	0	-	2781572	2781624	0,0,255	
-chrY	2781572	2781624	TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC	0	-	2781572	2781624	0,0,255	
-chrY	2781572	2781624	TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC	0	-	2781572	2781624	0,0,255	
-chrY	2781572	2781624	TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC	0	-	2781572	2781624	0,0,255	
-chrY	2781572	2781624	TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC	0	-	2781572	2781624	0,0,255	
-chrY	2781572	2781624	TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC	0	-	2781572	2781624	0,0,255	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781670	2781722	CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC	0	+	2781670	2781722	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781743	2781795	AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG	0	+	2781743	2781795	255,0,0	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781797	2781849	GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC	0	-	2781797	2781849	0,0,255	
-chrY	2781864	2781916	AGCCTCATGATTTTTTTTTTTTTTGAGACAGAGTTTCACTCTTGTTGCCCA	0	-	2781864	2781916	0,0,255	
-chrY	2781864	2781916	AGCCTCATGATTTTTTTTTTTTTTGAGACAGAGTTTCACTCTTGTTGCCCA	0	-	2781864	2781916	0,0,255	
-chrY	2781864	2781916	AGCCTCATGATTTTTTTTTTTTTTGAGACAGAGTTTCACTCTTGTTGCCCA	0	-	2781864	2781916	0,0,255	
-chrY	2781864	2781916	AGCCTCATGATTTTTTTTTTTTTTGAGACAGAGTTTCACTCTTGTTGCCCA	0	-	2781864	2781916	0,0,255	
-chrY	2781864	2781916	AGCCTCATGATTTTTTTTTTTTTTGAGACAGAGTTTCACTCTTGTTGCCCA	0	-	2781864	2781916	0,0,255	
-chrY	2781973	2782025	CGACTTTCCTGCCTCAGCCTCCCGAGTAGGTGGGATTACAGGCTTGTGCCC	0	+	2781973	2782025	255,0,0	
-chrY	2782189	2782241	GTTCTTAGTAGTGGTAGAGTTAAGTTTGTCTCTGGGGCTCTTTGTTACCAC	0	-	2782189	2782241	0,0,255	
-chrY	2782189	2782241	GTTCTTAGTAGTGGTAGAGTTAAGTTTGTCTCTGGGGCTCTTTGTTACCAC	0	-	2782189	2782241	0,0,255	
-chrY	2782189	2782241	GTTCTTAGTAGTGGTAGAGTTAAGTTTGTCTCTGGGGCTCTTTGTTACCAC	0	-	2782189	2782241	0,0,255	
-chrY	2782189	2782241	GTTCTTAGTAGTGGTAGAGTTAAGTTTGTCTCTGGGGCTCTTTGTTACCAC	0	-	2782189	2782241	0,0,255	
-chrY	2782189	2782241	GTTCTTAGTAGTGGTAGAGTTAAGTTTGTCTCTGGGGCTCTTTGTTACCAC	0	-	2782189	2782241	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCCGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782506	2782558	GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT	0	-	2782506	2782558	0,0,255	
-chrY	2782528	2782580	CTCTGACCGAGGAAATGCTGGAAATCGATGGGATAAGTAATGTCTGGGTGA	0	+	2782528	2782580	255,0,0	
-chrY	2782537	2782589	AGGAAATGCTGGAAATCGATGGGATAAGTAATGTCTGGGTGACTGCTTTAG	0	-	2782537	2782589	0,0,255	
-chrY	2782582	2782634	CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT	0	+	2782582	2782634	255,0,0	
-chrY	2782582	2782634	CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT	0	+	2782582	2782634	255,0,0	
-chrY	2782582	2782634	CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT	0	+	2782582	2782634	255,0,0	
-chrY	2782582	2782634	CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT	0	+	2782582	2782634	255,0,0	
-chrY	2782582	2782634	CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT	0	+	2782582	2782634	255,0,0	
-chrY	2782582	2782634	CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT	0	+	2782582	2782634	255,0,0	
-chrY	2782582	2782634	CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT	0	+	2782582	2782634	255,0,0	
-chrY	2782582	2782634	CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT	0	+	2782582	2782634	255,0,0	
-chrY	2782582	2782634	CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT	0	+	2782582	2782634	255,0,0	
-chrY	2782582	2782634	CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT	0	+	2782582	2782634	255,0,0	
-chrY	2782582	2782634	CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT	0	+	2782582	2782634	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782589	2782641	CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA	0	+	2782589	2782641	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	ACAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782632	2782684	GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA	0	+	2782632	2782684	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGCACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782633	2782685	CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA	0	+	2782633	2782685	255,0,0	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGTAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782634	2782686	AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT	0	-	2782634	2782686	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTCGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782636	2782688	AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC	0	-	2782636	2782688	0,0,255	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782638	2782690	TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT	0	+	2782638	2782690	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782641	2782693	AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC	0	+	2782641	2782693	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGTTTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782646	2782698	GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT	0	+	2782646	2782698	255,0,0	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782647	2782699	TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG	0	-	2782647	2782699	0,0,255	
-chrY	2782648	2782700	GCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGA	0	+	2782648	2782700	255,0,0	
-chrY	2782648	2782700	GCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGA	0	+	2782648	2782700	255,0,0	
-chrY	2782653	2782705	GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT	0	-	2782653	2782705	0,0,255	
-chrY	2782653	2782705	GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT	0	-	2782653	2782705	0,0,255	
-chrY	2782653	2782705	GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT	0	-	2782653	2782705	0,0,255	
-chrY	2782653	2782705	GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT	0	-	2782653	2782705	0,0,255	
-chrY	2782653	2782705	GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT	0	-	2782653	2782705	0,0,255	
-chrY	2782653	2782705	GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT	0	-	2782653	2782705	0,0,255	
-chrY	2782653	2782705	GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT	0	-	2782653	2782705	0,0,255	
-chrY	2782653	2782705	GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT	0	-	2782653	2782705	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782661	2782713	GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG	0	-	2782661	2782713	0,0,255	
-chrY	2782662	2782714	ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA	0	+	2782662	2782714	255,0,0	
-chrY	2782662	2782714	ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA	0	+	2782662	2782714	255,0,0	
-chrY	2782662	2782714	ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA	0	+	2782662	2782714	255,0,0	
-chrY	2782662	2782714	ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACCCATGATGCTCGA	0	+	2782662	2782714	255,0,0	
-chrY	2782662	2782714	ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA	0	+	2782662	2782714	255,0,0	
-chrY	2782662	2782714	ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA	0	+	2782662	2782714	255,0,0	
-chrY	2782662	2782714	ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA	0	+	2782662	2782714	255,0,0	
-chrY	2782662	2782714	ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGAGTCATGATGCTCGA	0	+	2782662	2782714	255,0,0	
-chrY	2782662	2782714	ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA	0	+	2782662	2782714	255,0,0	
-chrY	2782662	2782714	ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA	0	+	2782662	2782714	255,0,0	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782664	2782716	TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC	0	-	2782664	2782716	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782667	2782719	TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC	0	-	2782667	2782719	0,0,255	
-chrY	2782670	2782722	GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG	0	+	2782670	2782722	255,0,0	
-chrY	2782670	2782722	GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG	0	+	2782670	2782722	255,0,0	
-chrY	2782670	2782722	GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG	0	-	2782670	2782722	0,0,255	
-chrY	2782670	2782722	GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG	0	-	2782670	2782722	0,0,255	
-chrY	2782670	2782722	GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG	0	-	2782670	2782722	0,0,255	
-chrY	2782670	2782722	GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG	0	-	2782670	2782722	0,0,255	
-chrY	2782670	2782722	GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG	0	-	2782670	2782722	0,0,255	
-chrY	2782671	2782723	GATCTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGCGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782671	2782723	GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC	0	-	2782671	2782723	0,0,255	
-chrY	2782676	2782728	GAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCC	0	+	2782676	2782728	255,0,0	
-chrY	2782676	2782728	GAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCC	0	+	2782676	2782728	255,0,0	
-chrY	2782676	2782728	GAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCC	0	+	2782676	2782728	255,0,0	
-chrY	2782676	2782728	GAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCC	0	-	2782676	2782728	0,0,255	
-chrY	2782676	2782728	GAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCC	0	+	2782676	2782728	255,0,0	
-chrY	2782685	2782737	CCCTCACCTGGTGACTCATCATGCTCGAACCATCCGCTACCCAGATCCTGT	0	+	2782685	2782737	255,0,0	
-chrY	2782685	2782737	CCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCCAGATCCTGT	0	+	2782685	2782737	255,0,0	
-chrY	2782685	2782737	CCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCCAGATCCTGT	0	+	2782685	2782737	255,0,0	
-chrY	2782685	2782737	CCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCCAGATCCTGT	0	+	2782685	2782737	255,0,0	
-chrY	2782686	2782738	CCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTATCCAGATCCTGTC	0	+	2782686	2782738	255,0,0	
-chrY	2782690	2782742	CCCTGGTGACTCATGATGCTCGACCCATCCGCTACCCAGATCCTGTCATCA	0	-	2782690	2782742	0,0,255	
-chrY	2782710	2782762	CAACCCATCCGCTACCCAGATCCTGTCATCAAGGTGAACGATACTGTGCAG	0	-	2782710	2782762	0,0,255	
-chrY	2782710	2782762	CAACCCATCCGCTACCCAGATCCTGTCATCAAGGTGAACGATACTGTGCAG	0	-	2782710	2782762	0,0,255	
-chrY	2782710	2782762	CCACCCACCCGCTACCCAGATCCTGTCATCAAGGTGAACGATACTGTGCAG	0	-	2782710	2782762	0,0,255	
-chrY	2782710	2782762	AGACCCATCCGCTCCCCAGATCCTGTCATCAAGGTGAACGATACTGTGCAG	0	-	2782710	2782762	0,0,255	
-chrY	2782716	2782768	ATCCGCTACCCAGATCCTGTCATCAAGGTGAACGAAACTGTGCAGATTTAT	0	+	2782716	2782768	255,0,0	
-chrY	2782718	2782770	CCGCCACCCAGATCCTGTCATCAAGGTGAACGATACCGTGCAGCTTGATTT	0	+	2782718	2782770	255,0,0	
-chrY	2782755	2782807	GTGCAGATTGAATTAGGGGCTGGCAAGATAATCAACTTTATCAAATTTGAT	0	-	2782755	2782807	0,0,255	
-chrY	2782755	2782807	GTGTAGATTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGAT	0	-	2782755	2782807	0,0,255	
-chrY	2782756	2782808	TGCAGATTGATTTAGGGACTGGCAAGATAAACAACTTTATCAAATTTGATA	0	+	2782756	2782808	255,0,0	
-chrY	2782760	2782812	GATTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAAGTTGATACAGG	0	-	2782760	2782812	0,0,255	
-chrY	2782760	2782812	GATTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACTGG	0	-	2782760	2782812	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782762	2782814	TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG	0	-	2782762	2782814	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2782767	2782819	TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG	0	-	2782767	2782819	0,0,255	
-chrY	2789679	2789731	GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC	0	+	2789679	2789731	255,0,0	
-chrY	2789679	2789731	GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC	0	+	2789679	2789731	255,0,0	
-chrY	2789679	2789731	GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC	0	+	2789679	2789731	255,0,0	
-chrY	2789679	2789731	GTTTCATTCTTGTTGCCTGGGCTGGACTGCAGTGGTGACATCTCTGCTCAC	0	+	2789679	2789731	255,0,0	
-chrY	2789679	2789731	GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC	0	+	2789679	2789731	255,0,0	
-chrY	2789679	2789731	GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC	0	+	2789679	2789731	255,0,0	
-chrY	2789679	2789731	GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC	0	+	2789679	2789731	255,0,0	
-chrY	2789679	2789731	GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC	0	+	2789679	2789731	255,0,0	
-chrY	2789679	2789731	GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC	0	+	2789679	2789731	255,0,0	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2790238	2790290	GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC	0	-	2790238	2790290	0,0,255	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793126	2793178	GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA	0	+	2793126	2793178	255,0,0	
-chrY	2793133	2793185	GTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGATCACCAA	0	+	2793133	2793185	255,0,0	
-chrY	2793144	2793196	TGTGTGGGGCCAACCTCGGTCGTGTTGGTGTGATCACCAACAGGGAAAGAC	0	-	2793144	2793196	0,0,255	
-chrY	2793144	2793196	TTGGGGGAGCCAACCTCGGTCGTGTTGGTGTGATCACCAACAGGGAAAGAC	0	-	2793144	2793196	0,0,255	
-chrY	2793144	2793196	TGGGTGGAGCCAACCTCGGTCGTGTTGGTGTGATCACCAACAGGGAAAGAC	0	-	2793144	2793196	0,0,255	
-chrY	2793150	2793202	GAGCCTGCCTCGGTCGTGTTGGTGTGATCTCCAACAGGGAAAGACATCCTG	0	-	2793150	2793202	0,0,255	
-chrY	2793150	2793202	GAGCCAACCTCGGTCGTGTTGGTGTGATCAACAAAAGGGAAAGACATCCTG	0	+	2793150	2793202	255,0,0	
-chrY	2793150	2793202	GAGCCAACCTCGGTCGCGTTGGTGTGATCACCAACAGGGAACGACATCCTG	0	+	2793150	2793202	255,0,0	
-chrY	2793159	2793211	TCGGTCGTGTTGGTGTGATCCCCAACAGGGAAAGACATCCTGGTTCTTTTG	0	-	2793159	2793211	0,0,255	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGATCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793170	2793222	GGTGTGATCACCAACAGGGAAAGACAACCTGGTTCTTTTGATGTGGTGCAT	0	+	2793170	2793222	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	-	2793173	2793225	0,0,255	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	-	2793173	2793225	0,0,255	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	-	2793173	2793225	0,0,255	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	-	2793173	2793225	0,0,255	
-chrY	2793173	2793225	GTGATCGCCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	-	2793173	2793225	0,0,255	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	-	2793173	2793225	0,0,255	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	-	2793173	2793225	0,0,255	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	-	2793173	2793225	0,0,255	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	-	2793173	2793225	0,0,255	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	-	2793173	2793225	0,0,255	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	-	2793173	2793225	0,0,255	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793173	2793225	GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG	0	+	2793173	2793225	255,0,0	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACGGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAN	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793175	2793227	GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA	0	-	2793175	2793227	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATATGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793177	2793229	TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG	0	-	2793177	2793229	0,0,255	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	-	2793178	2793230	0,0,255	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	-	2793178	2793230	0,0,255	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	-	2793178	2793230	0,0,255	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	-	2793178	2793230	0,0,255	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	-	2793178	2793230	0,0,255	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	-	2793178	2793230	0,0,255	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	-	2793178	2793230	0,0,255	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	-	2793178	2793230	0,0,255	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	-	2793178	2793230	0,0,255	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	-	2793178	2793230	0,0,255	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCANGTGANGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793178	2793230	CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA	0	+	2793178	2793230	255,0,0	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATACTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793179	2793231	ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT	0	-	2793179	2793231	0,0,255	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGCAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	NAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793181	2793233	CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC	0	+	2793181	2793233	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793190	2793242	AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA	0	+	2793190	2793242	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793199	2793251	TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC	0	+	2793199	2793251	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GCTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGATGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	-	2793201	2793253	0,0,255	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	-	2793201	2793253	0,0,255	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	-	2793201	2793253	0,0,255	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	-	2793201	2793253	0,0,255	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	-	2793201	2793253	0,0,255	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	-	2793201	2793253	0,0,255	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	-	2793201	2793253	0,0,255	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	+	2793201	2793253	255,0,0	
-chrY	2793201	2793253	GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA	0	-	2793201	2793253	0,0,255	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCAAGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793204	2793256	CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA	0	+	2793204	2793256	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATCGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	-	2793205	2793257	0,0,255	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	-	2793205	2793257	0,0,255	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	-	2793205	2793257	0,0,255	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCACTGGCAACAGCTTTGCCACGCG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCAACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793205	2793257	TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG	0	+	2793205	2793257	255,0,0	
-chrY	2793206	2793258	TTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGG	0	+	2793206	2793258	255,0,0	
-chrY	2793206	2793258	TTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGG	0	+	2793206	2793258	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TCGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGACAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793207	2793259	TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC	0	+	2793207	2793259	255,0,0	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793213	2793265	TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA	0	-	2793213	2793265	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGTCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAATAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	+	2793215	2793267	255,0,0	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793215	2793267	GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC	0	-	2793215	2793267	0,0,255	
-chrY	2793221	2793273	GTGAAGGATGCCAATGAAAACAGCTTTGCCACGAGGATTTCCAACATTTTT	0	+	2793221	2793273	255,0,0	
-chrY	2793223	2793275	GAAGGATGCCAATGGCAACAGCTTTGCCACGGGGCTTTCCAACATTTTTGT	0	+	2793223	2793275	255,0,0	
-chrY	2793231	2793283	CCAATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATCGGCA	0	-	2793231	2793283	0,0,255	
-chrY	2793232	2793284	CAATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAN	0	-	2793232	2793284	0,0,255	
-chrY	2793232	2793284	CAATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCGTTGGCAA	0	-	2793232	2793284	0,0,255	
-chrY	2793232	2793284	CAATGGCAACAGCTTTGCCACGAGGCTTTCGAACATTTTTGTCATTGGCAA	0	-	2793232	2793284	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGCCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793233	2793285	AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC	0	-	2793233	2793285	0,0,255	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793336	2793388	ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT	0	+	2793336	2793388	255,0,0	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGAGCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAACCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793447	2793499	AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG	0	-	2793447	2793499	0,0,255	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAGGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793566	2793618	GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT	0	+	2793566	2793618	255,0,0	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793684	2793736	ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG	0	-	2793684	2793736	0,0,255	
-chrY	2793788	2793840	CTCTGGGATCTTTTGAGACCTTTTCAGTGAAGGAGCACCTCTGAAATCATG	0	+	2793788	2793840	255,0,0	
-chrY	2793788	2793840	CTCTGGGATCTTTTGAGACCTTTTCAGTGAAGGAGCACCTCTGAAATCATG	0	+	2793788	2793840	255,0,0	
-chrY	2793788	2793840	CTCTGGGATCTTTTGAGACCTTTTCAGTGAAGGAGCACCTCTGAAATCATG	0	+	2793788	2793840	255,0,0	
-chrY	2793788	2793840	CTCTGGGATCTTTTGAGACCTTTTCAGTGAAGGAGCACCTCTGAAATCATG	0	+	2793788	2793840	255,0,0	
-chrY	2793797	2793849	CTTTTGAGACCTTTTCAGTGAAGGAGCACCTCTGAAATCATGCAGTATCCT	0	+	2793797	2793849	255,0,0	
-chrY	2793868	2793920	CAAGACTTAAGGAAAGGGCAACGGACATAATTGAAAAGGCTTTTTATTTTT	0	+	2793868	2793920	255,0,0	
-chrY	2793868	2793920	CAAGACTTAAGGAAAGGGCAACGGACATAATTGAAAAGGCTTTTTATTTTT	0	+	2793868	2793920	255,0,0	
-chrY	2793868	2793920	CAAGACTTAAGGAAAGGGCAACGGACATAATTGAAAAGGCTTTTTATTTTT	0	+	2793868	2793920	255,0,0	
-chrY	2793868	2793920	CAAGACTTAAGGAAAGGGCAACGGACATAATTGAAAAGGCTTTTTATTTTT	0	+	2793868	2793920	255,0,0	
-chrY	2793894	2793946	ATAATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGG	0	-	2793894	2793946	0,0,255	
-chrY	2793895	2793947	TAATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGA	0	-	2793895	2793947	0,0,255	
-chrY	2793895	2793947	TAATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGA	0	-	2793895	2793947	0,0,255	
-chrY	2793895	2793947	TAATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGA	0	-	2793895	2793947	0,0,255	
-chrY	2793895	2793947	TAATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGA	0	-	2793895	2793947	0,0,255	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2793897	2793949	ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT	0	+	2793897	2793949	255,0,0	
-chrY	2794051	2794103	CTGGGACTAAGGCGCCCGCCACCAGACCTGGCTAATTTCTTTTTGTATTTT	0	+	2794051	2794103	255,0,0	
-chrY	2794051	2794103	CTGGGACTAAGGCGCCCGCCACCAGACCTGGCTAATTTCTTTTTGTATTTT	0	+	2794051	2794103	255,0,0	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATATCCTGACCTGGTGATCAACCAGCTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794124	2794176	TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC	0	-	2794124	2794176	0,0,255	
-chrY	2794138	2794190	GTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGCCTCCCAAAGTGCAG	0	-	2794138	2794190	0,0,255	
-chrY	2794138	2794190	GTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGCCTCCCAAAGTGCAG	0	-	2794138	2794190	0,0,255	
-chrY	2794216	2794268	GGCCAACTGAAAAGCTTTTCATCAAGCTATTCAGCCCCGGGAGCAGCATCT	0	+	2794216	2794268	255,0,0	
-chrY	2794216	2794268	GGCCAACTGAAAAGCTTTTCATCAAGCTATTCAGCCCCGGGAGCAGCATCT	0	+	2794216	2794268	255,0,0	
-chrY	2794297	2794349	TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG	0	+	2794297	2794349	255,0,0	
-chrY	2794297	2794349	TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG	0	+	2794297	2794349	255,0,0	
-chrY	2794297	2794349	TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG	0	+	2794297	2794349	255,0,0	
-chrY	2794297	2794349	TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG	0	+	2794297	2794349	255,0,0	
-chrY	2794297	2794349	TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG	0	+	2794297	2794349	255,0,0	
-chrY	2794297	2794349	TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG	0	+	2794297	2794349	255,0,0	
-chrY	2794312	2794364	ACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTGCCACTCAGAAGCTCT	0	-	2794312	2794364	0,0,255	
-chrY	2794312	2794364	ACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTGCCACTCAGAAGCTCT	0	-	2794312	2794364	0,0,255	
-chrY	2794400	2794452	AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG	0	-	2794400	2794452	0,0,255	
-chrY	2794400	2794452	AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG	0	-	2794400	2794452	0,0,255	
-chrY	2794400	2794452	AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG	0	-	2794400	2794452	0,0,255	
-chrY	2794400	2794452	AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG	0	-	2794400	2794452	0,0,255	
-chrY	2794400	2794452	AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG	0	-	2794400	2794452	0,0,255	
-chrY	2794400	2794452	AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG	0	-	2794400	2794452	0,0,255	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTAAGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794517	2794569	CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT	0	+	2794517	2794569	255,0,0	
-chrY	2794573	2794625	CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA	0	+	2794573	2794625	255,0,0	
-chrY	2794573	2794625	CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA	0	+	2794573	2794625	255,0,0	
-chrY	2794573	2794625	CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA	0	+	2794573	2794625	255,0,0	
-chrY	2794573	2794625	CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA	0	+	2794573	2794625	255,0,0	
-chrY	2794573	2794625	CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA	0	+	2794573	2794625	255,0,0	
-chrY	2794573	2794625	CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA	0	+	2794573	2794625	255,0,0	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794627	2794679	GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA	0	-	2794627	2794679	0,0,255	
-chrY	2794667	2794719	ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTTTGTTGGGTGGTGGTCTG	0	-	2794667	2794719	0,0,255	
-chrY	2794667	2794719	ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTTTGTTGGGTGGTGGTCTG	0	-	2794667	2794719	0,0,255	
-chrY	2794667	2794719	ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTGTGTTGGGTGGTGGTCTG	0	-	2794667	2794719	0,0,255	
-chrY	2794667	2794719	ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTTTGTTGGGTGGTGGTCTG	0	-	2794667	2794719	0,0,255	
-chrY	2794667	2794719	ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTTTGTTGGGTGGTGGTCTG	0	-	2794667	2794719	0,0,255	
-chrY	2794667	2794719	ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTTTGTTGGGTGGTGGTCTG	0	-	2794667	2794719	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794704	2794756	TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT	0	-	2794704	2794756	0,0,255	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794727	2794779	TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT	0	+	2794727	2794779	255,0,0	
-chrY	2794759	2794811	GTTTTGGTGGGATGTTGTTTTTCTCTCCTCCCTTTCTTTCTGTACTTACTT	0	+	2794759	2794811	255,0,0	
-chrY	2794759	2794811	GTTTTGGTGGGATGTTGTTTTTCTCTCCTCCCTTTCTTTCTGTACTTACTT	0	+	2794759	2794811	255,0,0	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794845	2794897	GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG	0	-	2794845	2794897	0,0,255	
-chrY	2794852	2794904	TTGCCCAGGGGAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAG	0	-	2794852	2794904	0,0,255	
-chrY	2794858	2794910	AGGGGAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTA	0	-	2794858	2794910	0,0,255	
-chrY	2794862	2794914	GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA	0	-	2794862	2794914	0,0,255	
-chrY	2794862	2794914	GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA	0	-	2794862	2794914	0,0,255	
-chrY	2794862	2794914	GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA	0	-	2794862	2794914	0,0,255	
-chrY	2794862	2794914	GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA	0	-	2794862	2794914	0,0,255	
-chrY	2794862	2794914	GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA	0	-	2794862	2794914	0,0,255	
-chrY	2794862	2794914	GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA	0	-	2794862	2794914	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794866	2794918	GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA	0	-	2794866	2794918	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794868	2794920	GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC	0	-	2794868	2794920	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794871	2794923	TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA	0	-	2794871	2794923	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794877	2794929	TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG	0	-	2794877	2794929	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794878	2794930	TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG	0	-	2794878	2794930	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	GGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794887	2794939	TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC	0	-	2794887	2794939	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAAAGGTTGGCCACCAAACAAAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794888	2794940	GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA	0	-	2794888	2794940	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794889	2794941	AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG	0	-	2794889	2794941	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794894	2794946	AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC	0	-	2794894	2794946	0,0,255	
-chrY	2794897	2794949	GATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCG	0	-	2794897	2794949	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794903	2794955	AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT	0	-	2794903	2794955	0,0,255	
-chrY	2794907	2794959	TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT	0	-	2794907	2794959	0,0,255	
-chrY	2794907	2794959	TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT	0	-	2794907	2794959	0,0,255	
-chrY	2794907	2794959	TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT	0	-	2794907	2794959	0,0,255	
-chrY	2794907	2794959	TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT	0	-	2794907	2794959	0,0,255	
-chrY	2794907	2794959	TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT	0	-	2794907	2794959	0,0,255	
-chrY	2794907	2794959	TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT	0	-	2794907	2794959	0,0,255	
-chrY	2794907	2794959	TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT	0	-	2794907	2794959	0,0,255	
-chrY	2794907	2794959	TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT	0	-	2794907	2794959	0,0,255	
-chrY	2794907	2794959	TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT	0	-	2794907	2794959	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGAAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794915	2794967	AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA	0	-	2794915	2794967	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATGGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794924	2794976	AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC	0	-	2794924	2794976	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTCTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GNAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2794936	2794988	GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA	0	-	2794936	2794988	0,0,255	
-chrY	2857835	2857887	TTCAACGTGAAATTCTAAGACAAAACTCATAGGCTGGCCAGCATGTGAGAA	0	+	2857835	2857887	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTCGCTCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863491	2863543	CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT	0	+	2863491	2863543	255,0,0	
-chrY	2863539	2863591	TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC	0	-	2863539	2863591	0,0,255	
-chrY	2863539	2863591	TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC	0	-	2863539	2863591	0,0,255	
-chrY	2863539	2863591	TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC	0	-	2863539	2863591	0,0,255	
-chrY	2863539	2863591	TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC	0	-	2863539	2863591	0,0,255	
-chrY	2863539	2863591	TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC	0	-	2863539	2863591	0,0,255	
-chrY	2863539	2863591	TGTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCGCCCGCGCTAGGCCGGCC	0	-	2863539	2863591	0,0,255	
-chrY	2863539	2863591	TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC	0	-	2863539	2863591	0,0,255	
-chrY	2863539	2863591	TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC	0	-	2863539	2863591	0,0,255	
-chrY	2863539	2863591	TTTGTGGCCGGGTCGGCGTCCCGGAGGGCGCCCTCCCGCGCTAGGCCGGAC	0	-	2863539	2863591	0,0,255	
-chrY	2863539	2863591	TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC	0	-	2863539	2863591	0,0,255	
-chrY	2863539	2863591	TTGGGGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC	0	-	2863539	2863591	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CGGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2863606	2863658	CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC	0	-	2863606	2863658	0,0,255	
-chrY	2865129	2865181	CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA	0	+	2865129	2865181	255,0,0	
-chrY	2865129	2865181	CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA	0	+	2865129	2865181	255,0,0	
-chrY	2865129	2865181	CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA	0	+	2865129	2865181	255,0,0	
-chrY	2865129	2865181	CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAC	0	+	2865129	2865181	255,0,0	
-chrY	2865129	2865181	CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA	0	+	2865129	2865181	255,0,0	
-chrY	2865129	2865181	CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA	0	+	2865129	2865181	255,0,0	
-chrY	2865129	2865181	CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA	0	+	2865129	2865181	255,0,0	
-chrY	2865129	2865181	CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA	0	+	2865129	2865181	255,0,0	
-chrY	2865129	2865181	CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA	0	+	2865129	2865181	255,0,0	
-chrY	2865241	2865293	CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC	0	-	2865241	2865293	0,0,255	
-chrY	2865241	2865293	CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC	0	-	2865241	2865293	0,0,255	
-chrY	2865241	2865293	CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC	0	-	2865241	2865293	0,0,255	
-chrY	2865241	2865293	CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC	0	-	2865241	2865293	0,0,255	
-chrY	2865241	2865293	CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC	0	-	2865241	2865293	0,0,255	
-chrY	2865241	2865293	CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC	0	-	2865241	2865293	0,0,255	
-chrY	2865241	2865293	CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC	0	-	2865241	2865293	0,0,255	
-chrY	2865241	2865293	CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC	0	-	2865241	2865293	0,0,255	
-chrY	2865241	2865293	CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC	0	-	2865241	2865293	0,0,255	
-chrY	2865316	2865368	GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA	0	+	2865316	2865368	255,0,0	
-chrY	2865316	2865368	GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA	0	+	2865316	2865368	255,0,0	
-chrY	2865316	2865368	GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA	0	+	2865316	2865368	255,0,0	
-chrY	2865316	2865368	GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA	0	+	2865316	2865368	255,0,0	
-chrY	2865316	2865368	GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA	0	+	2865316	2865368	255,0,0	
-chrY	2865316	2865368	GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA	0	+	2865316	2865368	255,0,0	
-chrY	2865316	2865368	GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA	0	+	2865316	2865368	255,0,0	
-chrY	2865316	2865368	GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA	0	+	2865316	2865368	255,0,0	
-chrY	2865316	2865368	GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA	0	+	2865316	2865368	255,0,0	
-chrY	2865423	2865475	CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC	0	-	2865423	2865475	0,0,255	
-chrY	2865423	2865475	CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC	0	-	2865423	2865475	0,0,255	
-chrY	2865423	2865475	CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC	0	-	2865423	2865475	0,0,255	
-chrY	2865423	2865475	CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC	0	-	2865423	2865475	0,0,255	
-chrY	2865423	2865475	CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC	0	-	2865423	2865475	0,0,255	
-chrY	2865423	2865475	CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC	0	-	2865423	2865475	0,0,255	
-chrY	2865423	2865475	CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC	0	-	2865423	2865475	0,0,255	
-chrY	2865423	2865475	CGGCGCGCGCCGGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC	0	-	2865423	2865475	0,0,255	
-chrY	2865423	2865475	CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC	0	-	2865423	2865475	0,0,255	
-chrY	2865423	2865475	CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC	0	-	2865423	2865475	0,0,255	
-chrY	2866382	2866434	CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC	0	+	2866382	2866434	255,0,0	
-chrY	2866382	2866434	CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC	0	+	2866382	2866434	255,0,0	
-chrY	2866382	2866434	CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC	0	+	2866382	2866434	255,0,0	
-chrY	2866382	2866434	CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC	0	+	2866382	2866434	255,0,0	
-chrY	2866382	2866434	CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC	0	+	2866382	2866434	255,0,0	
-chrY	2866382	2866434	CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC	0	+	2866382	2866434	255,0,0	
-chrY	2866382	2866434	CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC	0	+	2866382	2866434	255,0,0	
-chrY	2866382	2866434	CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC	0	+	2866382	2866434	255,0,0	
-chrY	2866382	2866434	CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC	0	+	2866382	2866434	255,0,0	
-chrY	2866472	2866524	CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA	0	-	2866472	2866524	0,0,255	
-chrY	2866472	2866524	CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA	0	-	2866472	2866524	0,0,255	
-chrY	2866472	2866524	CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA	0	-	2866472	2866524	0,0,255	
-chrY	2866472	2866524	CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA	0	-	2866472	2866524	0,0,255	
-chrY	2866472	2866524	CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA	0	-	2866472	2866524	0,0,255	
-chrY	2866472	2866524	CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA	0	-	2866472	2866524	0,0,255	
-chrY	2866472	2866524	CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA	0	-	2866472	2866524	0,0,255	
-chrY	2866472	2866524	CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA	0	-	2866472	2866524	0,0,255	
-chrY	2866472	2866524	CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA	0	-	2866472	2866524	0,0,255	
-chrY	2871012	2871064	CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA	0	+	2871012	2871064	255,0,0	
-chrY	2871012	2871064	CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA	0	+	2871012	2871064	255,0,0	
-chrY	2871012	2871064	CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA	0	+	2871012	2871064	255,0,0	
-chrY	2871012	2871064	CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA	0	+	2871012	2871064	255,0,0	
-chrY	2871012	2871064	CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA	0	+	2871012	2871064	255,0,0	
-chrY	2871012	2871064	CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA	0	+	2871012	2871064	255,0,0	
-chrY	2871111	2871163	GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT	0	-	2871111	2871163	0,0,255	
-chrY	2871111	2871163	GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT	0	-	2871111	2871163	0,0,255	
-chrY	2871111	2871163	GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT	0	-	2871111	2871163	0,0,255	
-chrY	2871111	2871163	GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT	0	-	2871111	2871163	0,0,255	
-chrY	2871111	2871163	GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT	0	-	2871111	2871163	0,0,255	
-chrY	2871111	2871163	GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT	0	-	2871111	2871163	0,0,255	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTGAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876103	2876155	GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT	0	+	2876103	2876155	255,0,0	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2876229	2876281	CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC	0	-	2876229	2876281	0,0,255	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGNNACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880278	2880330	TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT	0	+	2880278	2880330	255,0,0	
-chrY	2880395	2880447	TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2880395	2880447	ATAAGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2880395	2880447	TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2880395	2880447	TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2880395	2880447	TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2880395	2880447	TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2880395	2880447	TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2880395	2880447	TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2880395	2880447	TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2880395	2880447	TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2880395	2880447	TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2880395	2880447	TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT	0	-	2880395	2880447	0,0,255	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2881985	2882037	ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG	0	+	2881985	2882037	255,0,0	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2889166	2889218	CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG	0	-	2889166	2889218	0,0,255	
-chrY	2890047	2890099	TTTCCCCTTTTTTTCTACCTTATTGTCCGTTTTCTCTTTAAGTAATGATTT	0	+	2890047	2890099	255,0,0	
-chrY	2890134	2890186	AAATCTAGTGAATTCTCTGAAATACAGTGGTCTCACCAAGACCATCAACCG	0	-	2890134	2890186	0,0,255	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898706	2898758	CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG	0	+	2898706	2898758	255,0,0	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2898850	2898902	TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC	0	-	2898850	2898902	0,0,255	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2902594	2902646	TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA	0	+	2902594	2902646	255,0,0	
-chrY	2904753	2904805	GAGAGGAGGATGCTGCTGTTGCAGCAGCAGCAGCTGCTGTGCATGAGCAGC	0	+	2904753	2904805	255,0,0	
-chrY	2904753	2904805	GAGAGGAGGATGCTGCTGTTGCAGCAGCAGCAGCTGCTGTGCCTGAGCCGC	0	+	2904753	2904805	255,0,0	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907254	2907306	TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG	0	-	2907254	2907306	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCCTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2907629	2907681	CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT	0	-	2907629	2907681	0,0,255	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2908968	2909020	TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC	0	+	2908968	2909020	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCGAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909010	2909062	AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG	0	+	2909010	2909062	255,0,0	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909109	2909161	TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC	0	-	2909109	2909161	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTCGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909135	2909187	ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA	0	-	2909135	2909187	0,0,255	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909455	2909507	TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA	0	+	2909455	2909507	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909485	2909537	TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTCTAGGTTCCTTAA	0	+	2909485	2909537	255,0,0	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCNTCTNGCTTTAGTATGGTAGTGCTTCATNCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909596	2909648	ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT	0	-	2909596	2909648	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGCTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	ATAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909618	2909670	TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC	0	-	2909618	2909670	0,0,255	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909655	2909707	GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA	0	+	2909655	2909707	255,0,0	
-chrY	2909735	2909787	CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC	0	+	2909735	2909787	255,0,0	
-chrY	2909735	2909787	CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC	0	+	2909735	2909787	255,0,0	
-chrY	2909735	2909787	CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC	0	+	2909735	2909787	255,0,0	
-chrY	2909735	2909787	CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC	0	+	2909735	2909787	255,0,0	
-chrY	2909735	2909787	CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC	0	+	2909735	2909787	255,0,0	
-chrY	2909735	2909787	CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC	0	+	2909735	2909787	255,0,0	
-chrY	2909735	2909787	CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC	0	+	2909735	2909787	255,0,0	
-chrY	2909735	2909787	CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC	0	+	2909735	2909787	255,0,0	
-chrY	2909735	2909787	CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC	0	+	2909735	2909787	255,0,0	
-chrY	2909735	2909787	CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC	0	+	2909735	2909787	255,0,0	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909760	2909812	TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA	0	-	2909760	2909812	0,0,255	
-chrY	2909842	2909894	GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG	0	-	2909842	2909894	0,0,255	
-chrY	2909842	2909894	GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG	0	-	2909842	2909894	0,0,255	
-chrY	2909842	2909894	GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG	0	-	2909842	2909894	0,0,255	
-chrY	2909842	2909894	GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG	0	-	2909842	2909894	0,0,255	
-chrY	2909842	2909894	GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG	0	-	2909842	2909894	0,0,255	
-chrY	2909842	2909894	GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG	0	-	2909842	2909894	0,0,255	
-chrY	2909842	2909894	GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG	0	-	2909842	2909894	0,0,255	
-chrY	2909842	2909894	GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG	0	-	2909842	2909894	0,0,255	
-chrY	2909842	2909894	GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG	0	-	2909842	2909894	0,0,255	
-chrY	2909842	2909894	GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG	0	-	2909842	2909894	0,0,255	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGNN	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATACTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910075	2910127	AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA	0	+	2910075	2910127	255,0,0	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910182	2910234	ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT	0	-	2910182	2910234	0,0,255	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGGTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTACAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910224	2910276	TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA	0	+	2910224	2910276	255,0,0	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910330	2910382	AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG	0	-	2910330	2910382	0,0,255	
-chrY	2910400	2910452	CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA	0	+	2910400	2910452	255,0,0	
-chrY	2910400	2910452	CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA	0	+	2910400	2910452	255,0,0	
-chrY	2910400	2910452	CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA	0	+	2910400	2910452	255,0,0	
-chrY	2910400	2910452	CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTCTGAAGCATTCA	0	+	2910400	2910452	255,0,0	
-chrY	2910400	2910452	CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA	0	+	2910400	2910452	255,0,0	
-chrY	2910400	2910452	CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA	0	+	2910400	2910452	255,0,0	
-chrY	2910400	2910452	CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA	0	+	2910400	2910452	255,0,0	
-chrY	2910400	2910452	CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA	0	+	2910400	2910452	255,0,0	
-chrY	2910400	2910452	CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA	0	+	2910400	2910452	255,0,0	
-chrY	3547861	3547913	CACACCTGGCTAATTTTTTATATTTTTAGTGGAGACAGGGCTCCACCGTGC	0	-	3547861	3547913	0,0,255	
-chrY	3547861	3547913	CACACCTGGCTAATTTTTTATATTTTTAGTGGAGACAGGGCTCCACCGTGC	0	-	3547861	3547913	0,0,255	
diff --git a/src/test/resources/htsjdk/tribble/large.txt b/src/test/resources/htsjdk/tribble/large.txt
deleted file mode 100644
index 5f4e1d4..0000000
--- a/src/test/resources/htsjdk/tribble/large.txt
+++ /dev/null
@@ -1,165 +0,0 @@
-##fileformat=VCFv4.1
-##ApplyRecalibration="analysis_type=ApplyRecalibration input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/dax/t2d_genes/v1/t2d_genes.padded.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta nonDeterministicRandomSeed=false disableRandomization=false maxRuntime=-1 maxRuntimeUnits=MINUTES down [...]
-##CombineVariants="analysis_type=CombineVariants input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/dax/t2d_genes/v1/t2d_genes.padded.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta nonDeterministicRandomSeed=false disableRandomization=false maxRuntime=-1 maxRuntimeUnits=MINUTES downsampli [...]
-##FILTER=<ID=Indel_FS,Description="FS>200.0">
-##FILTER=<ID=Indel_InbreedingCoeff,Description="InbreedingCoeff<-0.8">
-##FILTER=<ID=Indel_QD,Description="QD<2.0">
-##FILTER=<ID=Indel_ReadPosRankSum,Description="ReadPosRankSum<-20.0">
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=VQSRTrancheSNP98.50to98.60,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -0.9687 <= x < -0.8298">
-##FILTER=<ID=VQSRTrancheSNP98.60to98.80,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -1.2821 <= x < -0.9687">
-##FILTER=<ID=VQSRTrancheSNP98.80to98.90,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -1.5011 <= x < -1.2821">
-##FILTER=<ID=VQSRTrancheSNP98.90to99.00,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -1.7494 <= x < -1.5011">
-##FILTER=<ID=VQSRTrancheSNP99.00to99.30,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -2.9782 <= x < -1.7494">
-##FILTER=<ID=VQSRTrancheSNP99.30to99.50,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -4.7694 <= x < -2.9782">
-##FILTER=<ID=VQSRTrancheSNP99.50to99.90,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -15.7985 <= x < -4.7694">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00+,Description="Truth sensitivity tranche level for SNP model at VQS Lod < -4789.109">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -4789.109 <= x < -15.7985">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth (reads with MQ=255 or with bad mates are filtered)">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=PL,Number=G,Type=Integer,Description="Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification">
-##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=BaseQRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt Vs. Ref base qualities">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth; some reads may have been filtered">
-##INFO=<ID=DS,Number=0,Type=Flag,Description="Were any of the samples downsampled?">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=END,Number=1,Type=Integer,Description="Stop position of the interval">
-##INFO=<ID=FS,Number=1,Type=Float,Description="Phred-scaled p-value using Fisher's exact test to detect strand bias">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with at most two segregating haplotypes">
-##INFO=<ID=InbreedingCoeff,Number=1,Type=Float,Description="Inbreeding coefficient as estimated from the genotype likelihoods per-sample when compared against the Hardy-Weinberg expectation">
-##INFO=<ID=MLEAC,Number=A,Type=Integer,Description="Maximum likelihood expectation (MLE) for the allele counts (not necessarily the same as the AC), for each ALT allele, in the same order as listed">
-##INFO=<ID=MLEAF,Number=A,Type=Float,Description="Maximum likelihood expectation (MLE) for the allele frequency (not necessarily the same as the AF), for each ALT allele, in the same order as listed">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=MQRankSum,Number=1,Type=Float,Description="Z-score From Wilcoxon rank sum test of Alt vs. Ref read mapping qualities">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=RPA,Number=.,Type=Integer,Description="Number of times tandem repeat unit is repeated, for each allele (including reference)">
-##INFO=<ID=RU,Number=1,Type=String,Description="Tandem repeat unit (bases)">
-##INFO=<ID=ReadPosRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt vs. Ref read position bias">
-##INFO=<ID=SNPEFF_AMINO_ACID_CHANGE,Number=1,Type=String,Description="Old/New amino acid for the highest-impact effect resulting from the current variant (in HGVS style)">
-##INFO=<ID=SNPEFF_CODON_CHANGE,Number=1,Type=String,Description="Old/New codon for the highest-impact effect resulting from the current variant">
-##INFO=<ID=SNPEFF_EFFECT,Number=1,Type=String,Description="The highest-impact effect resulting from the current variant (or one of the highest-impact effects, if there is a tie)">
-##INFO=<ID=SNPEFF_EXON_ID,Number=1,Type=String,Description="Exon ID for the highest-impact effect resulting from the current variant">
-##INFO=<ID=SNPEFF_FUNCTIONAL_CLASS,Number=1,Type=String,Description="Functional class of the highest-impact effect resulting from the current variant: [NONE, SILENT, MISSENSE, NONSENSE]">
-##INFO=<ID=SNPEFF_GENE_BIOTYPE,Number=1,Type=String,Description="Gene biotype for the highest-impact effect resulting from the current variant">
-##INFO=<ID=SNPEFF_GENE_NAME,Number=1,Type=String,Description="Gene name for the highest-impact effect resulting from the current variant">
-##INFO=<ID=SNPEFF_IMPACT,Number=1,Type=String,Description="Impact of the highest-impact effect resulting from the current variant [MODIFIER, LOW, MODERATE, HIGH]">
-##INFO=<ID=SNPEFF_TRANSCRIPT_ID,Number=1,Type=String,Description="Transcript ID for the highest-impact effect resulting from the current variant">
-##INFO=<ID=STR,Number=0,Type=Flag,Description="Variant is a short tandem repeat">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##INFO=<ID=set,Number=1,Type=String,Description="Source VCF for the merged record in CombineVariants">
-##OriginalSnpEffCmd="SnpEff eff -v -onlyCoding true -c /seq/references/Homo_sapiens_assembly19/v1/snpEff/Homo_sapiens_assembly19.snpEff.config -i vcf -o vcf GRCh37.64 /seq/dax/t2d_genes/v1/t2d_genes.unannotated.vcf "
-##OriginalSnpEffVersion="2.0.5 (build 2011-12-24), by Pablo Cingolani"
-##SelectVariants="analysis_type=SelectVariants input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/dax/t2d_genes/v1/t2d_genes.padded.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta nonDeterministicRandomSeed=false disableRandomization=false maxRuntime=-1 maxRuntimeUnits=MINUTES downsampling [...]
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/seq/dax/t2d_genes/v1/t2d_genes.bam.list] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/dax/t2d_genes/v1/scatter/temp_0001_of_2500/scattered.intervals] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta nonDeterministicRandomSeed=false disableRandomizati [...]
-##VariantAnnotator="analysis_type=VariantAnnotator input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/references/HybSelOligos/whole_exome_agilent_1.1_refseq_plus_3_boosters/whole_exome_agilent_1.1_refseq_plus_3_boosters.Homo_sapiens_assembly19.targets.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=50 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assemb [...]
-##VariantFiltration="analysis_type=VariantFiltration input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/dax/t2d_genes/v1/t2d_genes.padded.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta nonDeterministicRandomSeed=false disableRandomization=false maxRuntime=-1 maxRuntimeUnits=MINUTES downsa [...]
-##contig=<ID=1,length=249250621>
-##contig=<ID=2,length=243199373>
-##contig=<ID=3,length=198022430>
-##contig=<ID=4,length=191154276>
-##contig=<ID=5,length=180915260>
-##contig=<ID=6,length=171115067>
-##contig=<ID=7,length=159138663>
-##contig=<ID=8,length=146364022>
-##contig=<ID=9,length=141213431>
-##contig=<ID=10,length=135534747>
-##contig=<ID=11,length=135006516>
-##contig=<ID=12,length=133851895>
-##contig=<ID=13,length=115169878>
-##contig=<ID=14,length=107349540>
-##contig=<ID=15,length=102531392>
-##contig=<ID=16,length=90354753>
-##contig=<ID=17,length=81195210>
-##contig=<ID=18,length=78077248>
-##contig=<ID=19,length=59128983>
-##contig=<ID=20,length=63025520>
-##contig=<ID=21,length=48129895>
-##contig=<ID=22,length=51304566>
-##contig=<ID=X,length=155270560>
-##contig=<ID=Y,length=59373566>
-##contig=<ID=MT,length=16569>
-##contig=<ID=GL000207.1,length=4262>
-##contig=<ID=GL000226.1,length=15008>
-##contig=<ID=GL000229.1,length=19913>
-##contig=<ID=GL000231.1,length=27386>
-##contig=<ID=GL000210.1,length=27682>
-##contig=<ID=GL000239.1,length=33824>
-##contig=<ID=GL000235.1,length=34474>
-##contig=<ID=GL000201.1,length=36148>
-##contig=<ID=GL000247.1,length=36422>
-##contig=<ID=GL000245.1,length=36651>
-##contig=<ID=GL000197.1,length=37175>
-##contig=<ID=GL000203.1,length=37498>
-##contig=<ID=GL000246.1,length=38154>
-##contig=<ID=GL000249.1,length=38502>
-##contig=<ID=GL000196.1,length=38914>
-##contig=<ID=GL000248.1,length=39786>
-##contig=<ID=GL000244.1,length=39929>
-##contig=<ID=GL000238.1,length=39939>
-##contig=<ID=GL000202.1,length=40103>
-##contig=<ID=GL000234.1,length=40531>
-##contig=<ID=GL000232.1,length=40652>
-##contig=<ID=GL000206.1,length=41001>
-##contig=<ID=GL000240.1,length=41933>
-##contig=<ID=GL000236.1,length=41934>
-##contig=<ID=GL000241.1,length=42152>
-##contig=<ID=GL000243.1,length=43341>
-##contig=<ID=GL000242.1,length=43523>
-##contig=<ID=GL000230.1,length=43691>
-##contig=<ID=GL000237.1,length=45867>
-##contig=<ID=GL000233.1,length=45941>
-##contig=<ID=GL000204.1,length=81310>
-##contig=<ID=GL000198.1,length=90085>
-##contig=<ID=GL000208.1,length=92689>
-##contig=<ID=GL000191.1,length=106433>
-##contig=<ID=GL000227.1,length=128374>
-##contig=<ID=GL000228.1,length=129120>
-##contig=<ID=GL000214.1,length=137718>
-##contig=<ID=GL000221.1,length=155397>
-##contig=<ID=GL000209.1,length=159169>
-##contig=<ID=GL000218.1,length=161147>
-##contig=<ID=GL000220.1,length=161802>
-##contig=<ID=GL000213.1,length=164239>
-##contig=<ID=GL000211.1,length=166566>
-##contig=<ID=GL000199.1,length=169874>
-##contig=<ID=GL000217.1,length=172149>
-##contig=<ID=GL000216.1,length=172294>
-##contig=<ID=GL000215.1,length=172545>
-##contig=<ID=GL000205.1,length=174588>
-##contig=<ID=GL000219.1,length=179198>
-##contig=<ID=GL000224.1,length=179693>
-##contig=<ID=GL000223.1,length=180455>
-##contig=<ID=GL000195.1,length=182896>
-##contig=<ID=GL000212.1,length=186858>
-##contig=<ID=GL000222.1,length=186861>
-##contig=<ID=GL000200.1,length=187035>
-##contig=<ID=GL000193.1,length=189789>
-##contig=<ID=GL000194.1,length=191469>
-##contig=<ID=GL000225.1,length=211173>
-##contig=<ID=GL000192.1,length=547496>
-##contig=<ID=NC_007605,length=171823>
-##reference=file:///seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta
-##source=SelectVariants
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	100	1000-10D	1001	1001-10D	10018	1002-10D	10029	1003-10D	10032	1004-10D	10046	10049	1005	1005-10D	10050	10059	1006-10D	10069	1007-10BD	1008-10D	10088	1009-10D	10090	1010-10D	10105	10109	1011-10D	10110	10114	10118	1012-10D	1013-10D	1014-10D	10148	1015-10D	1016-10D	1018-10D	1019-10D	10191	10194	10196	1020-10D	10204.0	1021-10D	10210	10211.0	10221	10268	1028	10282	10304	10326	10330	10339	10356	10371	10376	10388.0	10397	10402	10434	10447	10451	104 [...]
-1	69270	.	A	G	67802.61	VQSRTrancheSNP99.50to99.90	AC=4763;AF=0.736;AN=6468;BaseQRankSum=-29.966;DP=1452155;Dels=0.00;FS=0.000;HaplotypeScore=0.0519;InbreedingCoeff=0.3564;MLEAC=3470;MLEAF=0.536;MQ=2.72;MQ0=522186;MQRankSum=17.776;QD=0.32;ReadPosRankSum=-9.274;SNPEFF_AMINO_ACID_CHANGE=S108;SNPEFF_CODON_CHANGE=tcA/tcG;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69037_69829;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT=LOW;S [...]
-1	69335	.	G	A	97.21	VQSRTrancheSNP99.90to100.00	AC=1;AF=6.701e-05;AN=14924;BaseQRankSum=3.221;DP=1123713;Dels=0.00;FS=0.000;HaplotypeScore=0.0941;InbreedingCoeff=-0.0589;MLEAC=1;MLEAF=6.701e-05;MQ=4.99;MQ0=459016;MQRankSum=0.427;QD=1.30;ReadPosRankSum=-1.122;SNPEFF_AMINO_ACID_CHANGE=R130H;SNPEFF_CODON_CHANGE=cGc/cAc;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69037_69829;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT [...]
-1	69366	.	T	G	871.42	VQSRTrancheSNP99.50to99.90	AC=2;AF=1.239e-04;AN=16146;BaseQRankSum=-1.719;DP=990333;Dels=0.00;FS=0.000;HaplotypeScore=0.0933;InbreedingCoeff=-0.0247;MLEAC=2;MLEAF=1.239e-04;MQ=5.96;MQ0=407294;MQRankSum=0.001;QD=21.25;ReadPosRankSum=0.517;SNPEFF_AMINO_ACID_CHANGE=V140;SNPEFF_CODON_CHANGE=gtT/gtG;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69037_69829;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT=LOW;SN [...]
-1	69409	.	A	G	4406.28	VQSRTrancheSNP99.50to99.90	AC=8;AF=4.147e-04;AN=19290;BaseQRankSum=13.621;DP=1362430;Dels=0.00;FS=26.031;HaplotypeScore=0.1448;InbreedingCoeff=0.0053;MLEAC=8;MLEAF=4.147e-04;MQ=11.68;MQ0=219922;MQRankSum=5.323;QD=9.71;ReadPosRankSum=-9.497;SNPEFF_AMINO_ACID_CHANGE=I107V;SNPEFF_CODON_CHANGE=Atc/Gtc;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMP [...]
-1	69428	rs140739101	T	G	419908.06	VQSRTrancheSNP99.50to99.90	AC=453;AF=0.022;AN=20242;BaseQRankSum=49.526;DB;DP=1394601;Dels=0.00;FS=975.380;HaplotypeScore=0.1195;InbreedingCoeff=0.2461;MLEAC=334;MLEAF=0.017;MQ=16.42;MQ0=138676;MQRankSum=-2.177;QD=17.57;ReadPosRankSum=-10.322;SNPEFF_AMINO_ACID_CHANGE=F113C;SNPEFF_CODON_CHANGE=tTt/tGt;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=O [...]
-1	69438	.	T	C	3107.59	VQSRTrancheSNP99.50to99.90	AC=2;AF=9.729e-05;AN=20558;BaseQRankSum=-2.899;DP=1379680;Dels=0.00;FS=8.925;HaplotypeScore=0.1499;InbreedingCoeff=0.0001;MLEAC=2;MLEAF=9.729e-05;MQ=22.72;MQ0=95489;MQRankSum=0.850;QD=24.66;ReadPosRankSum=-0.870;SNPEFF_AMINO_ACID_CHANGE=Y116;SNPEFF_CODON_CHANGE=taT/taC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT=LOW; [...]
-1	69453	rs142004627	G	A	923.30	VQSRTrancheSNP99.00to99.30	AC=141;AF=7.059e-03;AN=19974;BaseQRankSum=-19.711;DB;DP=1292464;Dels=0.00;FS=234.751;HaplotypeScore=0.2262;InbreedingCoeff=0.1247;MLEAC=44;MLEAF=2.203e-03;MQ=31.12;MQ0=15075;MQRankSum=-11.276;QD=1.14;ReadPosRankSum=-4.900;SNPEFF_AMINO_ACID_CHANGE=K121;SNPEFF_CODON_CHANGE=aaG/aaA;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5 [...]
-1	69478	.	T	C	625.46	VQSRTrancheSNP99.50to99.90	AC=2;AF=9.713e-05;AN=20590;BaseQRankSum=-5.701;DP=1224140;Dels=0.00;FS=9.248;HaplotypeScore=0.1621;InbreedingCoeff=-0.0073;MLEAC=1;MLEAF=4.857e-05;MQ=28.40;MQ0=31089;MQRankSum=-0.497;QD=7.19;ReadPosRankSum=-4.289;SNPEFF_AMINO_ACID_CHANGE=C130R;SNPEFF_CODON_CHANGE=Tgt/Cgt;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPA [...]
-1	69489	.	A	C	1035.55	VQSRTrancheSNP99.50to99.90	AC=3;AF=1.469e-04;AN=20422;BaseQRankSum=4.705;DP=1117540;Dels=0.00;FS=2.442;HaplotypeScore=0.1773;InbreedingCoeff=-0.0003;MLEAC=2;MLEAF=9.793e-05;MQ=28.74;MQ0=29993;MQRankSum=-1.170;QD=12.78;ReadPosRankSum=-2.427;SNPEFF_AMINO_ACID_CHANGE=A133;SNPEFF_CODON_CHANGE=gcA/gcC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT=LOW [...]
-1	69496	rs150690004	G	A	74883.53	VQSRTrancheSNP99.00to99.30	AC=33;AF=1.628e-03;AN=20272;BaseQRankSum=-5.450;DB;DP=993841;Dels=0.00;FS=22.218;HaplotypeScore=0.2924;InbreedingCoeff=0.0259;MLEAC=17;MLEAF=8.386e-04;MQ=29.16;MQ0=27895;MQRankSum=10.649;QD=70.12;ReadPosRankSum=0.884;SNPEFF_AMINO_ACID_CHANGE=G136S;SNPEFF_CODON_CHANGE=Ggc/Agc;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=O [...]
-1	69496	.	GGCATTATGGCTGTCA	G	555413.58	Indel_FS	AC=2988;AF=0.148;AN=20226;BaseQRankSum=43.899;DP=993841;FS=Infinity;HaplotypeScore=20.7358;InbreedingCoeff=0.7977;MLEAC=3420;MLEAF=0.169;MQ=29.16;MQ0=0;MQRankSum=-13.694;QD=3.63;ReadPosRankSum=37.478;SNPEFF_AMINO_ACID_CHANGE=GIMAVT136A;SNPEFF_CODON_CHANGE=ggcattatggctgtcaca/gca;SNPEFF_EFFECT=CODON_CHANGE_PLUS_CODON_DELETION;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4 [...]
-1	69502	.	A	G	509.73	VQSRTrancheSNP99.50to99.90	AC=2;AF=9.975e-05;AN=20050;BaseQRankSum=6.603;DP=919807;Dels=0.00;FS=1.954;HaplotypeScore=0.3679;InbreedingCoeff=-0.0070;MLEAC=1;MLEAF=4.988e-05;MQ=29.88;MQ0=25457;MQRankSum=-2.320;QD=6.22;ReadPosRankSum=-2.827;SNPEFF_AMINO_ACID_CHANGE=M138V;SNPEFF_CODON_CHANGE=Atg/Gtg;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT [...]
-1	69511	rs75062661	A	G	31383854.34	VQSRTrancheSNP99.50to99.90	AC=16694;AF=0.858;AN=19460;BaseQRankSum=60.147;DB;DP=773705;Dels=0.00;FS=138.417;HaplotypeScore=0.2818;InbreedingCoeff=0.5035;MLEAC=16887;MLEAF=0.868;MQ=31.39;MQ0=16811;MQRankSum=-164.893;QD=52.42;ReadPosRankSum=-36.782;SNPEFF_AMINO_ACID_CHANGE=T141A;SNPEFF_CODON_CHANGE=Aca/Gca;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_N [...]
-1	69521	.	T	C	722.77	VQSRTrancheSNP99.50to99.90	AC=2;AF=1.011e-04;AN=19776;BaseQRankSum=2.538;DP=915452;Dels=0.00;FS=1.110;HaplotypeScore=0.2063;InbreedingCoeff=-0.0088;MLEAC=2;MLEAF=1.011e-04;MQ=34.73;MQ0=15188;MQRankSum=-1.312;QD=4.82;ReadPosRankSum=-4.246;SNPEFF_AMINO_ACID_CHANGE=I144T;SNPEFF_CODON_CHANGE=aTt/aCt;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT [...]
-1	69534	rs190717287	T	C	10791.59	VQSRTrancheSNP99.50to99.90	AC=14;AF=7.034e-04;AN=19902;BaseQRankSum=15.572;DB;DP=1059436;Dels=0.00;FS=1.036;HaplotypeScore=0.1863;InbreedingCoeff=-0.0037;MLEAC=14;MLEAF=7.034e-04;MQ=35.59;MQ0=12762;MQRankSum=-2.121;QD=11.54;ReadPosRankSum=-6.516;SNPEFF_AMINO_ACID_CHANGE=H148;SNPEFF_CODON_CHANGE=caT/caC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5; [...]
diff --git a/src/test/resources/htsjdk/tribble/sites.bed b/src/test/resources/htsjdk/tribble/sites.bed
deleted file mode 100644
index 3750b3f..0000000
--- a/src/test/resources/htsjdk/tribble/sites.bed
+++ /dev/null
@@ -1,1000 +0,0 @@
-chr1	1245	1425	chr1.1	348	0.0432341
-chr1	1578	1818	chr1.2	430	0.314475
-chr1	2018	2318	chr1.3	345	0.038427
-chr1	10665	11465	chr1.4	478	0.589475
-chr1	18100	19780	chr1.5	558	1.22721
-chr1	81011	81491	chr1.6	460	0.474365
-chr1	227342	227822	chr1.7	415	0.245863
-chr1	409247	409627	chr1.8	349	0.045556
-chr1	481720	482000	chr1.9	415	0.245863
-chr1	501569	502049	chr1.10	415	0.245863
-chr1	580608	580888	chr1.11	465	0.502745
-chr1	580906	581246	chr1.12	418	0.256501
-chr1	604472	604712	chr1.13	446	0.395281
-chr1	604748	607828	chr1.14	564	1.28828
-chr1	607863	610103	chr1.15	558	1.2282
-chr1	613316	613496	chr1.16	380	0.118186
-chr1	613539	613919	chr1.17	415	0.245863
-chr1	659767	660147	chr1.18	349	0.045555
-chr1	753372	753552	chr1.19	430	0.312979
-chr1	753620	754600	chr1.20	773	4.13035
-chr1	763942	764200	chr1.21	442	0.372517
-chr1	766594	766939	chr1.22	546	1.11774
-chr1	792467	793007	chr1.23	433	0.330713
-chr1	801766	802806	chr1.24	580	1.44576
-chr1	802807	803681	chr1.25	575	1.39455
-chr1	815798	816776	chr1.26	447	0.398158
-chr1	817006	818146	chr1.27	520	0.897849
-chr1	819524	820204	chr1.28	488	0.65421
-chr1	832980	834171	chr1.29	520	0.897575
-chr1	834220	834309	chr1.30	346	0.0402192
-chr1	845033	845448	chr1.31	497	0.71717
-chr1	847812	848512	chr1.32	478	0.589475
-chr1	864905	865029	chr1.33	461	0.481443
-chr1	874965	875487	chr1.34	423	0.278914
-chr1	879344	880327	chr1.35	699	2.94227
-chr1	880399	880708	chr1.36	495	0.706021
-chr1	880819	881023	chr1.37	383	0.127674
-chr1	881317	881911	chr1.38	418	0.256617
-chr1	883868	883904	chr1.39	312	0.002659
-chr1	896391	896556	chr1.40	385	0.135142
-chr1	898579	898621	chr1.41	355	0.0577104
-chr1	898899	899244	chr1.42	465	0.502855
-chr1	899766	899825	chr1.43	370	0.090538
-chr1	900065	900365	chr1.44	380	0.120379
-chr1	915757	916630	chr1.46	503	0.763638
-chr1	916730	917500	chr1.47	497	0.717085
-chr1	918108	918284	chr1.48	364	0.076574
-chr1	933354	933459	chr1.49	334	0.022302
-chr1	934187	936901	chr1.50	633	2.05262
-chr1	941632	942976	chr1.51	724	3.32186
-chr1	950199	950539	chr1.52	379	0.116623
-chr1	950732	950911	chr1.53	397	0.173826
-chr1	951480	952193	chr1.54	540	1.06184
-chr1	959185	959967	chr1.55	547	1.1301
-chr1	974506	974514	chr1.56	464	0.498756
-chr1	974607	975915	chr1.57	511	0.820906
-chr1	976014	976607	chr1.58	520	0.896575
-chr1	977283	977586	chr1.59	476	0.570696
-chr1	977654	977656	chr1.60	321	0.00827205
-chr1	980210	980408	chr1.61	362	0.070928
-chr1	988439	989479	chr1.62	683	2.70895
-chr1	994719	995751	chr1.63	695	2.88776
-chr1	995982	996106	chr1.64	343	0.0347552
-chr1	1007846	1009215	chr1.65	543	1.09033
-chr1	1015954	1016662	chr1.66	844	5.46574
-chr1	1034335	1034386	chr1.67	352	0.0505361
-chr1	1034434	1035191	chr1.68	639	2.12808
-chr1	1035857	1035864	chr1.69	316	0.005078
-chr1	1038865	1039724	chr1.70	632	2.03877
-chr1	1043743	1045133	chr1.71	703	3.00446
-chr1	1045399	1045565	chr1.72	356	0.05951
-chr1	1051338	1055456	chr1.73	562	1.27378
-chr1	1066992	1067071	chr1.74	396	0.170616
-chr1	1074179	1074787	chr1.75	439	0.358819
-chr1	1074991	1075171	chr1.76	399	0.180898
-chr1	1090923	1092369	chr1.77	788	4.3897
-chr1	1092391	1092445	chr1.78	488	0.656287
-chr1	1097165	1097971	chr1.79	708	3.07697
-chr1	1109347	1109587	chr1.80	354	0.054381
-chr1	1111706	1111715	chr1.81	355	0.056866
-chr1	1112293	1113013	chr1.82	609	1.76339
-chr1	1114276	1114340	chr1.83	312	0.00306007
-chr1	1114376	1115977	chr1.84	557	1.22389
-chr1	1116001	1116077	chr1.85	356	0.0594875
-chr1	1116556	1116778	chr1.86	485	0.636473
-chr1	1119001	1120315	chr1.87	692	2.84254
-chr1	1132538	1133672	chr1.88	660	2.39289
-chr1	1147188	1147624	chr1.89	447	0.400542
-chr1	1148692	1149412	chr1.90	593	1.59091
-chr1	1150502	1150712	chr1.91	395	0.166746
-chr1	1175365	1175776	chr1.92	397	0.175746
-chr1	1175855	1175965	chr1.93	390	0.152057
-chr1	1175988	1176265	chr1.94	373	0.100502
-chr1	1176365	1177189	chr1.95	705	3.0325
-chr1	1179837	1179888	chr1.96	317	0.005669
-chr1	1181827	1181950	chr1.97	331	0.0186511
-chr1	1182204	1182342	chr1.98	372	0.096425
-chr1	1183309	1184620	chr1.99	596	1.62052
-chr1	1186006	1186106	chr1.100	387	0.141911
-chr1	1187635	1189712	chr1.101	466	0.512313
-chr1	1190211	1190243	chr1.102	341	0.0312
-chr1	1192080	1192764	chr1.103	514	0.847194
-chr1	1194721	1194953	chr1.104	413	0.23692
-chr1	1206466	1207907	chr1.105	964	8.1342
-chr1	1225896	1226676	chr1.106	677	2.62722
-chr1	1248823	1249818	chr1.107	679	2.65973
-chr1	1259437	1259474	chr1.108	373	0.099368
-chr1	1267142	1267455	chr1.109	467	0.518669
-chr1	1280573	1281286	chr1.110	546	1.12306
-chr1	1282929	1284571	chr1.111	782	4.2808
-chr1	1299611	1300483	chr1.113	508	0.80183
-chr1	1324330	1325361	chr1.114	655	2.33046
-chr1	1330452	1330468	chr1.115	334	0.0224878
-chr1	1330481	1331143	chr1.116	431	0.316867
-chr1	1346249	1347613	chr1.117	532	0.991835
-chr1	1347713	1347813	chr1.118	347	0.0411966
-chr1	1349983	1351025	chr1.119	545	1.10701
-chr1	1419517	1420926	chr1.120	629	1.99595
-chr1	1427488	1428398	chr1.121	525	0.935949
-chr1	1448100	1448474	chr1.122	470	0.536396
-chr1	1452780	1453180	chr1.123	364	0.076725
-chr1	1455704	1455804	chr1.124	345	0.03843
-chr1	1461588	1461788	chr1.125	402	0.193601
-chr1	1491957	1492840	chr1.126	539	1.05258
-chr1	1525496	1525636	chr1.127	366	0.081578
-chr1	1531949	1533247	chr1.128	799	4.59657
-chr1	1560514	1561514	chr1.129	619	1.87645
-chr1	1590384	1590764	chr1.130	410	0.223637
-chr1	1590893	1591133	chr1.131	421	0.273791
-chr1	1594138	1596142	chr1.132	778	4.21174
-chr1	1655537	1655677	chr1.133	377	0.109362
-chr1	1655705	1657274	chr1.134	561	1.26111
-chr1	1663663	1663999	chr1.135	364	0.076725
-chr1	1687411	1688491	chr1.136	608	1.75721
-chr1	1688694	1688834	chr1.137	354	0.054312
-chr1	1691755	1692664	chr1.138	526	0.947746
-chr1	1708812	1708952	chr1.139	377	0.109362
-chr1	1708980	1710540	chr1.140	557	1.22281
-chr1	1740616	1741256	chr1.141	419	0.264632
-chr1	1741318	1741356	chr1.142	319	0.00727334
-chr1	1741824	1743156	chr1.143	772	4.11305
-chr1	1743330	1744816	chr1.144	694	2.86169
-chr1	1746429	1746901	chr1.145	466	0.512036
-chr1	1747199	1747370	chr1.146	366	0.080847
-chr1	1807202	1807442	chr1.147	357	0.061208
-chr1	1808587	1808927	chr1.148	398	0.179818
-chr1	1822336	1822611	chr1.149	464	0.501034
-chr1	1844627	1844854	chr1.150	373	0.099617
-chr1	1852389	1852529	chr1.151	404	0.201567
-chr1	1852929	1853169	chr1.152	382	0.126305
-chr1	1853350	1855972	chr1.153	745	3.66134
-chr1	1869830	1869840	chr1.154	332	0.0200274
-chr1	1869854	1870110	chr1.155	421	0.2737
-chr1	1872207	1873215	chr1.157	847	5.52993
-chr1	1882469	1883811	chr1.158	882	6.24189
-chr1	1907330	1908222	chr1.159	558	1.23049
-chr1	1923744	1923940	chr1.160	390	0.152416
-chr1	1923977	1924078	chr1.161	448	0.405503
-chr1	1959820	1960149	chr1.162	410	0.225941
-chr1	1982813	1983428	chr1.163	494	0.69409
-chr1	1984368	1984428	chr1.164	362	0.071593
-chr1	1989288	1989779	chr1.165	470	0.535642
-chr1	2007586	2007647	chr1.166	400	0.185196
-chr1	2008131	2008215	chr1.167	433	0.328356
-chr1	2008217	2008948	chr1.168	605	1.71627
-chr1	2010135	2010260	chr1.169	350	0.047398
-chr1	2013529	2014584	chr1.170	979	8.49978
-chr1	2055212	2055259	chr1.171	382	0.124886
-chr1	2068581	2068781	chr1.172	381	0.122871
-chr1	2086746	2087226	chr1.173	418	0.25753
-chr1	2090656	2091256	chr1.174	414	0.242561
-chr1	2095779	2096421	chr1.175	536	1.03316
-chr1	2096481	2097513	chr1.176	878	6.17002
-chr1	2103292	2103757	chr1.177	412	0.231373
-chr1	2103804	2103951	chr1.178	390	0.151735
-chr1	2109803	2110443	chr1.179	466	0.507647
-chr1	2112092	2113186	chr1.180	628	1.98414
-chr1	2116483	2116895	chr1.181	556	1.21258
-chr1	2134155	2134284	chr1.182	359	0.064291
-chr1	2137988	2137998	chr1.183	333	0.0212074
-chr1	2138022	2138316	chr1.184	430	0.315656
-chr1	2152859	2153858	chr1.185	721	3.27329
-chr1	2158055	2159299	chr1.186	711	3.11241
-chr1	2162443	2163421	chr1.187	721	3.27972
-chr1	2168224	2169293	chr1.188	809	4.78985
-chr1	2175799	2176777	chr1.189	542	1.08667
-chr1	2190263	2190275	chr1.190	308	0.001444
-chr1	2190962	2191887	chr1.191	945	7.67556
-chr1	2191916	2192099	chr1.192	448	0.408285
-chr1	2192279	2192298	chr1.193	459	0.470934
-chr1	2192819	2196309	chr1.194	666	2.47055
-chr1	2196880	2196980	chr1.195	409	0.221254
-chr1	2197480	2198620	chr1.196	597	1.63065
-chr1	2200780	2201425	chr1.197	516	0.865186
-chr1	2201461	2201525	chr1.198	322	0.00900521
-chr1	2203957	2204865	chr1.199	495	0.703671
-chr1	2218787	2220327	chr1.200	629	2.00121
-chr1	2222381	2223142	chr1.201	508	0.799448
-chr1	2240080	2240229	chr1.202	336	0.024456
-chr1	2242187	2242252	chr1.203	339	0.028898
-chr1	2251956	2252371	chr1.204	470	0.533144
-chr1	2253682	2255082	chr1.205	631	2.01952
-chr1	2263846	2265446	chr1.206	802	4.65529
-chr1	2274218	2274318	chr1.207	394	0.16333
-chr1	2274518	2274818	chr1.208	400	0.184861
-chr1	2274918	2275118	chr1.209	405	0.205095
-chr1	2275146	2275641	chr1.210	462	0.489108
-chr1	2277948	2279581	chr1.211	694	2.86896
-chr1	2281005	2281170	chr1.212	355	0.057667
-chr1	2345305	2345741	chr1.213	584	1.48807
-chr1	2345971	2345977	chr1.214	463	0.493836
-chr1	2354701	2355774	chr1.215	899	6.63001
-chr1	2374003	2374258	chr1.216	379	0.116116
-chr1	2375777	2377035	chr1.217	948	7.74791
-chr1	2377735	2378575	chr1.218	692	2.84491
-chr1	2378809	2378949	chr1.219	406	0.207187
-chr1	2378999	2379885	chr1.220	504	0.768902
-chr1	2379906	2380606	chr1.221	541	1.07024
-chr1	2397286	2397294	chr1.222	348	0.042792
-chr1	2413260	2413261	chr1.223	438	0.352263
-chr1	2430347	2431135	chr1.224	441	0.367269
-chr1	2431624	2431978	chr1.225	424	0.284169
-chr1	2457576	2457707	chr1.226	346	0.039385
-chr1	2459172	2460272	chr1.227	552	1.17653
-chr1	2463388	2463823	chr1.228	417	0.253052
-chr1	2470454	2470461	chr1.229	390	0.150899
-chr1	2486936	2488236	chr1.230	636	2.09041
-chr1	2489257	2490776	chr1.231	817	4.93949
-chr1	2492492	2492761	chr1.232	364	0.0760051
-chr1	2493101	2493146	chr1.233	469	0.531862
-chr1	2493326	2493347	chr1.235	461	0.482003
-chr1	2494419	2494642	chr1.236	341	0.031532
-chr1	2507151	2507330	chr1.237	387	0.141125
-chr1	2509159	2512197	chr1.238	772	4.11993
-chr1	2512208	2512756	chr1.239	642	2.16565
-chr1	2512807	2513247	chr1.240	516	0.860853
-chr1	2528188	2529907	chr1.241	690	2.80766
-chr1	2530087	2530368	chr1.242	432	0.324825
-chr1	2541499	2541739	chr1.243	437	0.346076
-chr1	2541759	2542339	chr1.244	578	1.4257
-chr1	2547635	2548035	chr1.245	549	1.14232
-chr1	2548806	2551026	chr1.246	937	7.48971
-chr1	2592434	2592526	chr1.247	336	0.024189
-chr1	2598191	2598791	chr1.248	445	0.388726
-chr1	2605620	2607520	chr1.249	834	5.268
-chr1	2664089	2664689	chr1.250	471	0.543906
-chr1	2665089	2665155	chr1.251	323	0.0105816
-chr1	2665189	2665259	chr1.252	374	0.103334
-chr1	2665289	2665989	chr1.253	524	0.925015
-chr1	2726150	2726886	chr1.254	549	1.14798
-chr1	2741401	2741593	chr1.255	397	0.174468
-chr1	2761650	2762004	chr1.256	464	0.497814
-chr1	2779686	2780556	chr1.257	750	3.73479
-chr1	2787864	2787900	chr1.258	346	0.04022
-chr1	2803409	2803859	chr1.259	375	0.105857
-chr1	2807226	2807228	chr1.260	308	0.001362
-chr1	2825483	2825625	chr1.261	435	0.34042
-chr1	2834138	2834756	chr1.262	538	1.04609
-chr1	2838065	2838157	chr1.263	345	0.038829
-chr1	2861188	2862281	chr1.264	548	1.13627
-chr1	2952115	2952560	chr1.265	418	0.258463
-chr1	2972843	2973318	chr1.266	411	0.230882
-chr1	2989768	2989968	chr1.267	386	0.137707
-chr1	3009017	3009062	chr1.268	390	0.15157
-chr1	3017175	3017575	chr1.269	456	0.451931
-chr1	3100471	3100558	chr1.270	335	0.023096
-chr1	3100898	3100998	chr1.271	338	0.0268333
-chr1	3101023	3101198	chr1.272	379	0.115724
-chr1	3105089	3105689	chr1.273	448	0.406987
-chr1	3190046	3190546	chr1.274	391	0.155685
-chr1	3364248	3364299	chr1.275	337	0.0257644
-chr1	3364410	3364646	chr1.276	398	0.18047
-chr1	3392559	3393373	chr1.277	587	1.51733
-chr1	3393741	3393850	chr1.278	430	0.314211
-chr1	3394031	3394804	chr1.279	409	0.222675
-chr1	3395156	3395206	chr1.280	353	0.0526742
-chr1	3395208	3395317	chr1.281	385	0.135351
-chr1	3398334	3398339	chr1.282	320	0.00753599
-chr1	3416964	3417115	chr1.283	521	0.904628
-chr1	3423248	3424044	chr1.284	530	0.9811
-chr1	3430716	3431581	chr1.285	656	2.3428
-chr1	3441703	3441928	chr1.286	426	0.295677
-chr1	3470113	3471947	chr1.287	1000	11.4006
-chr1	3475465	3475504	chr1.288	374	0.101467
-chr1	3504471	3505271	chr1.289	527	0.953672
-chr1	3511697	3512037	chr1.290	459	0.466982
-chr1	3512150	3512990	chr1.291	537	1.04137
-chr1	3522919	3523619	chr1.292	433	0.326354
-chr1	3536918	3537783	chr1.293	633	2.04946
-chr1	3550327	3550461	chr1.294	330	0.0169024
-chr1	3550933	3551686	chr1.295	571	1.35693
-chr1	3558392	3559167	chr1.296	563	1.27809
-chr1	3563409	3563437	chr1.297	324	0.0106548
-chr1	3563440	3565944	chr1.298	1000	11.196
-chr1	3588610	3590407	chr1.300	768	4.04642
-chr1	3590997	3591377	chr1.301	376	0.107667
-chr1	3591959	3592119	chr1.302	338	0.0268488
-chr1	3592147	3592218	chr1.303	474	0.558572
-chr1	3596509	3596651	chr1.304	374	0.102515
-chr1	3635398	3635663	chr1.305	583	1.47628
-chr1	3643823	3643991	chr1.306	374	0.103457
-chr1	3663878	3664519	chr1.307	534	1.01189
-chr1	3686655	3687421	chr1.308	750	3.73117
-chr1	3711401	3713059	chr1.309	824	5.07398
-chr1	3715204	3715280	chr1.310	339	0.0290495
-chr1	3715304	3715504	chr1.311	390	0.151907
-chr1	3715577	3716104	chr1.312	540	1.06776
-chr1	3723440	3723532	chr1.313	320	0.00791382
-chr1	3723732	3724032	chr1.314	436	0.341917
-chr1	3724132	3724232	chr1.315	355	0.0573958
-chr1	3727297	3727730	chr1.316	424	0.285042
-chr1	3735696	3736832	chr1.317	824	5.06396
-chr1	3790191	3790391	chr1.318	397	0.173633
-chr1	3790591	3790791	chr1.319	377	0.111306
-chr1	3790891	3790991	chr1.320	363	0.074843
-chr1	3796408	3797763	chr1.321	980	8.53863
-chr1	3830679	3831134	chr1.322	430	0.315135
-chr1	3839363	3841336	chr1.323	781	4.26183
-chr1	3841840	3843168	chr1.324	588	1.52897
-chr1	4046527	4046867	chr1.325	447	0.399924
-chr1	4046958	4047138	chr1.326	414	0.24036
-chr1	4179552	4179952	chr1.327	416	0.249199
-chr1	4263232	4263472	chr1.328	394	0.16575
-chr1	4273382	4273755	chr1.329	746	3.66676
-chr1	4495319	4495376	chr1.330	343	0.03471
-chr1	4604953	4605053	chr1.331	369	0.088698
-chr1	4622971	4623877	chr1.332	552	1.178
-chr1	4744712	4745512	chr1.333	533	1.00327
-chr1	4940852	4941152	chr1.334	396	0.170009
-chr1	5047636	5047838	chr1.335	351	0.048973
-chr1	5048038	5048138	chr1.336	339	0.0282311
-chr1	5056002	5056102	chr1.337	362	0.072234
-chr1	5119853	5119944	chr1.338	330	0.016646
-chr1	5295783	5295854	chr1.339	340	0.030582
-chr1	5299567	5300031	chr1.340	462	0.484579
-chr1	5304398	5305198	chr1.341	521	0.90563
-chr1	5308358	5308368	chr1.342	318	0.006299
-chr1	5314173	5314313	chr1.343	359	0.06435
-chr1	5317356	5317596	chr1.344	412	0.231594
-chr1	5336290	5336503	chr1.345	341	0.032255
-chr1	5417389	5418189	chr1.346	489	0.662748
-chr1	5429980	5430720	chr1.347	501	0.747305
-chr1	5463124	5463804	chr1.348	438	0.352774
-chr1	5476109	5476633	chr1.349	485	0.633405
-chr1	5504277	5504573	chr1.350	433	0.329133
-chr1	5508837	5509421	chr1.351	562	1.26653
-chr1	5631634	5631785	chr1.352	380	0.118948
-chr1	5661217	5661497	chr1.353	384	0.131985
-chr1	5661536	5662716	chr1.354	544	1.09861
-chr1	5664507	5664525	chr1.355	409	0.219854
-chr1	5681109	5681436	chr1.356	358	0.062922
-chr1	5707550	5707830	chr1.357	418	0.258635
-chr1	5707893	5708339	chr1.358	411	0.230736
-chr1	5810885	5811785	chr1.359	487	0.646923
-chr1	5845657	5845897	chr1.360	383	0.128835
-chr1	5905304	5906204	chr1.361	540	1.06385
-chr1	5907432	5907824	chr1.362	470	0.538406
-chr1	5909947	5910847	chr1.363	558	1.2354
-chr1	5953137	5953377	chr1.364	384	0.130998
-chr1	5969567	5970207	chr1.365	435	0.33689
-chr1	5985436	5989627	chr1.366	937	7.48701
-chr1	6020073	6023367	chr1.367	763	3.95216
-chr1	6025268	6025914	chr1.369	416	0.250311
-chr1	6047083	6047181	chr1.370	381	0.123346
-chr1	6051121	6051151	chr1.371	349	0.045605
-chr1	6065059	6065145	chr1.372	367	0.084044
-chr1	6103157	6103198	chr1.373	393	0.160523
-chr1	6103280	6103514	chr1.374	400	0.184768
-chr1	6110849	6110906	chr1.375	322	0.00935
-chr1	6121907	6122607	chr1.376	566	1.3095
-chr1	6139611	6139786	chr1.377	350	0.047781
-chr1	6142543	6142589	chr1.378	347	0.0410937
-chr1	6142845	6143478	chr1.379	507	0.796213
-chr1	6174913	6174926	chr1.380	322	0.00919397
-chr1	6175613	6175672	chr1.381	344	0.037
-chr1	6179651	6179851	chr1.382	371	0.093017
-chr1	6193230	6194465	chr1.383	825	5.09165
-chr1	6194589	6194769	chr1.384	361	0.0694778
-chr1	6199507	6199764	chr1.385	542	1.08144
-chr1	6199776	6199845	chr1.386	470	0.532812
-chr1	6200213	6201182	chr1.387	470	0.532765
-chr1	6203569	6203691	chr1.388	326	0.013056
-chr1	6203924	6204029	chr1.389	427	0.298376
-chr1	6229736	6230720	chr1.390	663	2.43144
-chr1	6230962	6231102	chr1.391	397	0.175743
-chr1	6239308	6239343	chr1.392	490	0.671257
-chr1	6239348	6239881	chr1.393	609	1.76614
-chr1	6240252	6240434	chr1.394	359	0.0644718
-chr1	6240452	6241652	chr1.395	667	2.48376
-chr1	6254059	6254762	chr1.396	619	1.88495
-chr1	6255114	6255608	chr1.397	595	1.61068
-chr1	6276001	6276541	chr1.398	425	0.291287
-chr1	6342254	6343584	chr1.399	612	1.80057
-chr1	6353019	6354469	chr1.400	556	1.21155
-chr1	6359423	6359670	chr1.401	426	0.292977
-chr1	6387410	6388963	chr1.403	833	5.24564
-chr1	6398989	6399799	chr1.404	565	1.29732
-chr1	6408661	6409101	chr1.405	435	0.336793
-chr1	6413979	6414449	chr1.406	415	0.244244
-chr1	6414720	6414782	chr1.407	418	0.258695
-chr1	6417717	6419744	chr1.408	615	1.83352
-chr1	6431850	6432707	chr1.409	534	1.01216
-chr1	6434544	6435100	chr1.410	604	1.70279
-chr1	6441530	6442436	chr1.411	487	0.644963
-chr1	6443498	6444188	chr1.412	421	0.272466
-chr1	6444808	6444908	chr1.413	397	0.174494
-chr1	6453802	6455542	chr1.414	796	4.54512
-chr1	6458957	6460910	chr1.415	715	3.17974
-chr1	6469556	6470536	chr1.416	670	2.53514
-chr1	6479822	6480051	chr1.417	464	0.500152
-chr1	6480191	6481291	chr1.418	606	1.7329
-chr1	6484026	6485952	chr1.419	642	2.16671
-chr1	6485996	6486113	chr1.420	347	0.0424213
-chr1	6487684	6487830	chr1.421	375	0.104822
-chr1	6491298	6492410	chr1.422	690	2.80757
-chr1	6515040	6515180	chr1.423	329	0.016359
-chr1	6539345	6539585	chr1.424	439	0.358308
-chr1	6539609	6540252	chr1.425	549	1.14281
-chr1	6548511	6549715	chr1.426	713	3.1525
-chr1	6573604	6575104	chr1.427	805	4.70201
-chr1	6585740	6585839	chr1.428	354	0.054151
-chr1	6593261	6594397	chr1.429	564	1.28992
-chr1	6595174	6596474	chr1.430	693	2.85379
-chr1	6596574	6596606	chr1.431	335	0.0227389
-chr1	6596789	6598555	chr1.433	656	2.34421
-chr1	6606848	6609592	chr1.434	856	5.71167
-chr1	6618971	6620258	chr1.435	727	3.36245
-chr1	6640224	6640764	chr1.436	524	0.925278
-chr1	6640789	6641228	chr1.437	546	1.11628
-chr1	6645301	6645401	chr1.438	358	0.062647
-chr1	6645465	6645501	chr1.439	316	0.00506949
-chr1	6695708	6696512	chr1.440	700	2.9551
-chr1	6714442	6714554	chr1.441	356	0.059668
-chr1	6721933	6722127	chr1.442	369	0.089852
-chr1	6728819	6729659	chr1.443	523	0.919928
-chr1	6736584	6736598	chr1.444	319	0.007138
-chr1	6737420	6737700	chr1.445	444	0.384274
-chr1	6737762	6738402	chr1.446	485	0.633369
-chr1	6778180	6780361	chr1.447	924	7.17666
-chr1	6780589	6781263	chr1.448	432	0.325742
-chr1	6956891	6957167	chr1.449	397	0.174899
-chr1	6957391	6957964	chr1.450	504	0.769395
-chr1	7113515	7114155	chr1.451	440	0.363658
-chr1	7212679	7212780	chr1.452	336	0.024595
-chr1	7231995	7232034	chr1.453	314	0.004009
-chr1	7459398	7459598	chr1.454	372	0.096016
-chr1	7641508	7641952	chr1.455	553	1.18241
-chr1	7661729	7662412	chr1.456	530	0.979164
-chr1	7663793	7664125	chr1.457	452	0.430045
-chr1	7664193	7665093	chr1.458	492	0.679594
-chr1	7671588	7671988	chr1.459	396	0.172629
-chr1	7674459	7675524	chr1.460	582	1.47493
-chr1	7698392	7699989	chr1.461	672	2.55111
-chr1	7703712	7704052	chr1.462	338	0.027123
-chr1	7719286	7719826	chr1.463	436	0.343389
-chr1	7719860	7719966	chr1.464	318	0.00611124
-chr1	7720728	7721328	chr1.465	405	0.203769
-chr1	7727749	7728266	chr1.466	379	0.116645
-chr1	7730905	7731605	chr1.467	378	0.1146
-chr1	7746847	7747449	chr1.468	459	0.467609
-chr1	7761778	7761876	chr1.469	331	0.018436
-chr1	7764993	7765980	chr1.470	764	3.96799
-chr1	7776325	7776328	chr1.471	311	0.002269
-chr1	7777665	7779419	chr1.472	858	5.75116
-chr1	7821343	7822543	chr1.473	549	1.14715
-chr1	7880838	7881078	chr1.474	335	0.023662
-chr1	7897160	7897302	chr1.475	380	0.119257
-chr1	7897330	7897335	chr1.476	331	0.0180441
-chr1	7925170	7925557	chr1.477	462	0.485144
-chr1	7936502	7937182	chr1.478	539	1.06055
-chr1	7937244	7937484	chr1.479	421	0.272625
-chr1	7943310	7943950	chr1.480	537	1.04177
-chr1	7947986	7949355	chr1.481	660	2.39798
-chr1	7955338	7957402	chr1.482	824	5.07687
-chr1	7976547	7977227	chr1.483	536	1.03135
-chr1	8009415	8009785	chr1.484	428	0.305295
-chr1	8018822	8021099	chr1.485	612	1.80179
-chr1	8041607	8042107	chr1.486	376	0.10901
-chr1	8107706	8107849	chr1.487	372	0.096754
-chr1	8132243	8132543	chr1.488	382	0.125108
-chr1	8143554	8143894	chr1.489	433	0.327808
-chr1	8143933	8144213	chr1.490	480	0.597669
-chr1	8146312	8146674	chr1.491	439	0.358509
-chr1	8146925	8147810	chr1.492	582	1.47331
-chr1	8148073	8148653	chr1.493	499	0.732333
-chr1	8163643	8165099	chr1.494	652	2.28248
-chr1	8176501	8177381	chr1.495	624	1.93584
-chr1	8188192	8188532	chr1.496	425	0.289221
-chr1	8188549	8188889	chr1.497	403	0.197338
-chr1	8226358	8227023	chr1.498	493	0.690844
-chr1	8227114	8227294	chr1.499	431	0.318179
-chr1	8308676	8308954	chr1.500	430	0.315372
-chr1	8311985	8312979	chr1.501	709	3.08172
-chr1	8343035	8343828	chr1.502	627	1.97195
-chr1	8365384	8365684	chr1.503	399	0.180655
-chr1	8367944	8368781	chr1.504	392	0.158363
-chr1	8377207	8377958	chr1.505	485	0.633445
-chr1	8378241	8378299	chr1.506	319	0.00705539
-chr1	8389754	8391034	chr1.507	582	1.47437
-chr1	8391225	8391458	chr1.508	427	0.300652
-chr1	8391775	8392255	chr1.509	506	0.785274
-chr1	8392257	8392497	chr1.510	451	0.425152
-chr1	8401847	8401987	chr1.511	411	0.229506
-chr1	8401988	8403428	chr1.512	582	1.47017
-chr1	8403494	8403828	chr1.513	426	0.295087
-chr1	8406765	8406965	chr1.514	365	0.077851
-chr1	8413105	8413405	chr1.515	392	0.157024
-chr1	8415222	8415722	chr1.516	416	0.248503
-chr1	8416622	8419418	chr1.517	615	1.83419
-chr1	8421702	8422460	chr1.518	525	0.933497
-chr1	8443136	8443793	chr1.519	490	0.667712
-chr1	8445710	8446070	chr1.520	406	0.20897
-chr1	8455610	8455710	chr1.521	393	0.162064
-chr1	8455810	8456023	chr1.522	352	0.0506586
-chr1	8457410	8458110	chr1.523	481	0.60741
-chr1	8467012	8467112	chr1.524	392	0.15691
-chr1	8467212	8467289	chr1.525	309	0.00179666
-chr1	8473205	8473445	chr1.526	402	0.194979
-chr1	8504074	8505261	chr1.527	639	2.12098
-chr1	8505309	8505549	chr1.528	457	0.455829
-chr1	8518014	8521014	chr1.529	638	2.11
-chr1	8539553	8539588	chr1.530	308	0.001211
-chr1	8555596	8556022	chr1.531	407	0.211031
-chr1	8556483	8556583	chr1.532	338	0.027828
-chr1	8596816	8597258	chr1.533	505	0.774181
-chr1	8597269	8597809	chr1.534	540	1.06175
-chr1	8598776	8598916	chr1.535	402	0.193151
-chr1	8598936	8599276	chr1.536	431	0.316757
-chr1	8617713	8618353	chr1.537	421	0.272994
-chr1	8626317	8627317	chr1.538	549	1.14922
-chr1	8632762	8632902	chr1.539	385	0.133882
-chr1	8661178	8661718	chr1.540	438	0.353218
-chr1	8664366	8664706	chr1.541	407	0.211497
-chr1	8665732	8665919	chr1.542	372	0.096127
-chr1	8695228	8696331	chr1.543	715	3.176
-chr1	8697421	8698862	chr1.544	585	1.50209
-chr1	8698906	8699146	chr1.545	425	0.287892
-chr1	8706288	8707511	chr1.546	569	1.3331
-chr1	8731775	8731915	chr1.547	377	0.110385
-chr1	8731995	8732575	chr1.548	466	0.509635
-chr1	8809256	8809314	chr1.549	359	0.065604
-chr1	8810776	8813089	chr1.550	850	5.58414
-chr1	8824007	8824219	chr1.551	395	0.167879
-chr1	8843233	8843545	chr1.552	497	0.718104
-chr1	8853785	8854065	chr1.553	413	0.237218
-chr1	8855301	8855801	chr1.554	367	0.084444
-chr1	8868031	8868671	chr1.555	447	0.398462
-chr1	8872166	8873910	chr1.556	798	4.57685
-chr1	8894251	8894279	chr1.557	392	0.158434
-chr1	8894282	8894552	chr1.558	475	0.567848
-chr1	8907813	8908393	chr1.559	416	0.252026
-chr1	8912501	8912881	chr1.560	502	0.754464
-chr1	8920942	8921307	chr1.561	381	0.122501
-chr1	8939414	8940401	chr1.562	492	0.681736
-chr1	8957412	8957500	chr1.563	368	0.085716
-chr1	8961522	8961662	chr1.564	346	0.0405167
-chr1	8961759	8962339	chr1.565	448	0.408565
-chr1	8964588	8964813	chr1.566	416	0.248209
-chr1	8965060	8965759	chr1.567	592	1.57161
-chr1	8980485	8980585	chr1.568	326	0.012831
-chr1	8981022	8981340	chr1.569	424	0.287339
-chr1	8981392	8981424	chr1.570	402	0.193757
-chr1	8981992	8982827	chr1.571	545	1.1102
-chr1	8999149	8999943	chr1.572	580	1.44595
-chr1	9096355	9096448	chr1.573	349	0.044431
-chr1	9104051	9104214	chr1.574	333	0.021132
-chr1	9105039	9105050	chr1.575	322	0.00894791
-chr1	9105071	9105545	chr1.576	496	0.713335
-chr1	9116162	9116802	chr1.577	532	0.998398
-chr1	9122811	9124711	chr1.578	876	6.11381
-chr1	9136473	9136935	chr1.579	495	0.706033
-chr1	9175634	9176189	chr1.580	547	1.13023
-chr1	9176362	9176368	chr1.581	317	0.00586586
-chr1	9176450	9176468	chr1.582	331	0.018376
-chr1	9176470	9176541	chr1.583	325	0.0121209
-chr1	9177287	9177603	chr1.584	420	0.266916
-chr1	9190382	9191375	chr1.585	623	1.92201
-chr1	9195449	9196089	chr1.586	428	0.302592
-chr1	9228264	9229757	chr1.587	796	4.53492
-chr1	9229896	9229910	chr1.588	304	0.000402749
-chr1	9233829	9234632	chr1.589	525	0.934048
-chr1	9261379	9261919	chr1.590	519	0.889613
-chr1	9270017	9270163	chr1.591	490	0.66517
-chr1	9278539	9278796	chr1.592	454	0.438251
-chr1	9283189	9283674	chr1.593	456	0.452064
-chr1	9283688	9283928	chr1.594	394	0.166216
-chr1	9284257	9285108	chr1.595	431	0.320773
-chr1	9286721	9287687	chr1.596	650	2.25714
-chr1	9287823	9287962	chr1.597	492	0.679897
-chr1	9288179	9288206	chr1.598	347	0.0421743
-chr1	9288642	9289182	chr1.599	468	0.525884
-chr1	9289184	9289282	chr1.600	358	0.0623004
-chr1	9394854	9394931	chr1.601	333	0.020678
-chr1	9406782	9407951	chr1.602	539	1.05838
-chr1	9411837	9412817	chr1.603	579	1.43638
-chr1	9420268	9421248	chr1.604	679	2.64855
-chr1	9422600	9423877	chr1.605	717	3.21228
-chr1	9449753	9449853	chr1.606	341	0.0322128
-chr1	9449953	9450569	chr1.607	573	1.37542
-chr1	9467097	9467337	chr1.608	392	0.15655
-chr1	9467637	9467837	chr1.609	368	0.0858662
-chr1	9485361	9485821	chr1.610	513	0.840315
-chr1	9489645	9489876	chr1.611	413	0.235815
-chr1	9489953	9490033	chr1.612	415	0.247304
-chr1	9533273	9535021	chr1.613	709	3.08609
-chr1	9553064	9553181	chr1.614	350	0.0477783
-chr1	9553783	9554331	chr1.615	437	0.347944
-chr1	9568019	9568099	chr1.616	330	0.016923
-chr1	9582594	9583420	chr1.617	903	6.69798
-chr1	9583449	9584334	chr1.618	506	0.787083
-chr1	9610065	9610145	chr1.619	342	0.032849
-chr1	9610260	9610283	chr1.620	373	0.09963
-chr1	9621183	9621955	chr1.622	691	2.82618
-chr1	9622147	9622287	chr1.623	401	0.191001
-chr1	9622579	9624821	chr1.624	696	2.89883
-chr1	9645580	9646153	chr1.625	442	0.371898
-chr1	9646271	9648303	chr1.626	646	2.21344
-chr1	9648349	9649129	chr1.627	520	0.898129
-chr1	9649348	9650028	chr1.628	455	0.4443
-chr1	9681057	9681092	chr1.629	335	0.0229328
-chr1	9681190	9682723	chr1.630	582	1.47354
-chr1	9683237	9684175	chr1.631	732	3.45277
-chr1	9708410	9709147	chr1.632	562	1.27224
-chr1	9709689	9710489	chr1.633	529	0.968673
-chr1	9710538	9710589	chr1.634	343	0.0341791
-chr1	9711289	9711317	chr1.635	332	0.0199725
-chr1	9711389	9712729	chr1.636	770	4.0696
-chr1	9712751	9712891	chr1.637	398	0.178471
-chr1	9716067	9716402	chr1.638	429	0.309362
-chr1	9719049	9719682	chr1.639	549	1.14888
-chr1	9722503	9724028	chr1.640	651	2.27965
-chr1	9724115	9724128	chr1.641	309	0.0015425
-chr1	9766728	9766968	chr1.642	386	0.137728
-chr1	9778793	9779291	chr1.643	463	0.490789
-chr1	9782028	9782274	chr1.644	443	0.381381
-chr1	9817059	9817732	chr1.645	448	0.408183
-chr1	9817953	9820336	chr1.646	868	5.94748
-chr1	9820415	9820651	chr1.647	439	0.359755
-chr1	9830856	9831496	chr1.648	496	0.712757
-chr1	9844382	9845378	chr1.649	558	1.22972
-chr1	9861218	9862258	chr1.650	583	1.47632
-chr1	9868810	9869815	chr1.651	631	2.01853
-chr1	9876719	9877271	chr1.652	477	0.580527
-chr1	9903639	9905821	chr1.653	981	8.54314
-chr1	9926380	9926459	chr1.654	357	0.060471
-chr1	9936538	9938255	chr1.655	642	2.1585
-chr1	9944645	9945128	chr1.656	542	1.08591
-chr1	9991451	9991619	chr1.657	362	0.0722512
-chr1	9991905	9992075	chr1.658	430	0.312042
-chr1	10026446	10027898	chr1.659	901	6.66041
-chr1	10152497	10152897	chr1.660	415	0.244103
-chr1	10203931	10205596	chr1.661	844	5.46755
-chr1	10252928	10253558	chr1.662	453	0.436453
-chr1	10267847	10268147	chr1.663	398	0.179382
-chr1	10302008	10302908	chr1.664	555	1.20448
-chr1	10340217	10340457	chr1.665	380	0.118807
-chr1	10340474	10340654	chr1.666	353	0.0524881
-chr1	10368060	10368099	chr1.667	339	0.028562
-chr1	10392571	10395144	chr1.668	908	6.82367
-chr1	10422302	10422338	chr1.669	363	0.0739107
-chr1	10422348	10422721	chr1.670	535	1.02426
-chr1	10424138	10425705	chr1.671	776	4.17679
-chr1	10430996	10431476	chr1.672	414	0.242571
-chr1	10465584	10466024	chr1.673	422	0.276309
-chr1	10466142	10467509	chr1.674	701	2.9744
-chr1	10468986	10469846	chr1.675	639	2.11803
-chr1	10488894	10490094	chr1.676	637	2.09619
-chr1	10492577	10492817	chr1.677	354	0.054395
-chr1	10501511	10502108	chr1.678	445	0.390985
-chr1	10502491	10502504	chr1.679	348	0.042946
-chr1	10504244	10504584	chr1.680	431	0.318759
-chr1	10504616	10506302	chr1.681	680	2.67308
-chr1	10513400	10513700	chr1.682	395	0.167584
-chr1	10538500	10538537	chr1.683	308	0.00122817
-chr1	10538741	10538822	chr1.684	327	0.013649
-chr1	10589375	10589975	chr1.685	449	0.410125
-chr1	10632536	10633579	chr1.686	570	1.34375
-chr1	10646692	10646717	chr1.687	382	0.124599
-chr1	10661090	10661197	chr1.688	397	0.175384
-chr1	10686500	10689884	chr1.689	1000	9.21871
-chr1	10690597	10690937	chr1.690	347	0.041224
-chr1	10749912	10750903	chr1.691	614	1.81912
-chr1	10772740	10773080	chr1.692	377	0.109684
-chr1	10778350	10778391	chr1.693	318	0.005996
-chr1	10786017	10786025	chr1.694	324	0.010846
-chr1	10861097	10861213	chr1.695	444	0.384366
-chr1	10861380	10862435	chr1.696	640	2.1315
-chr1	10866122	10866302	chr1.697	371	0.095126
-chr1	10882982	10883087	chr1.698	426	0.294169
-chr1	10891540	10891604	chr1.699	320	0.007629
-chr1	10898133	10899553	chr1.700	514	0.849986
-chr1	10904157	10904210	chr1.701	410	0.224514
-chr1	10904269	10904564	chr1.702	469	0.528286
-chr1	10911375	10911665	chr1.703	431	0.316975
-chr1	10912049	10912921	chr1.704	516	0.861241
-chr1	10926584	10926733	chr1.705	359	0.065068
-chr1	10933863	10935019	chr1.706	510	0.817714
-chr1	10936200	10936966	chr1.707	506	0.786559
-chr1	10955303	10955741	chr1.708	543	1.09428
-chr1	10959321	10959801	chr1.709	477	0.583446
-chr1	10960104	10960341	chr1.710	425	0.290026
-chr1	10990398	10990778	chr1.711	405	0.206693
-chr1	11006124	11006152	chr1.712	338	0.0274196
-chr1	11006373	11008013	chr1.713	765	3.99066
-chr1	11018515	11019115	chr1.714	405	0.203476
-chr1	11024710	11024910	chr1.715	397	0.174439
-chr1	11031646	11032526	chr1.716	674	2.57742
-chr1	11032603	11032843	chr1.717	438	0.354543
-chr1	11053181	11053281	chr1.718	324	0.0114404
-chr1	11053875	11055539	chr1.719	935	7.44763
-chr1	11093526	11094719	chr1.720	760	3.90018
-chr1	11138750	11139150	chr1.721	452	0.428346
-chr1	11207178	11207878	chr1.722	487	0.64576
-chr1	11221841	11222026	chr1.723	380	0.1194
-chr1	11236089	11236216	chr1.724	452	0.429745
-chr1	11240175	11241255	chr1.725	549	1.14549
-chr1	11256285	11257525	chr1.726	833	5.23514
-chr1	11266912	11267010	chr1.727	440	0.363964
-chr1	11267052	11268289	chr1.728	720	3.26155
-chr1	11275264	11275760	chr1.729	511	0.826675
-chr1	11288942	11289089	chr1.730	364	0.076249
-chr1	11306190	11306330	chr1.732	391	0.153405
-chr1	11306357	11306597	chr1.733	454	0.438669
-chr1	11306897	11306997	chr1.734	331	0.0179042
-chr1	11314602	11314779	chr1.735	365	0.078178
-chr1	11331880	11331885	chr1.736	329	0.0160068
-chr1	11331990	11332094	chr1.737	354	0.053898
-chr1	11333774	11333923	chr1.738	403	0.197859
-chr1	11348931	11349031	chr1.739	359	0.0657591
-chr1	11349331	11349631	chr1.740	447	0.401474
-chr1	11378211	11378740	chr1.741	439	0.356991
-chr1	11472644	11473841	chr1.742	605	1.71862
-chr1	11474475	11474725	chr1.743	545	1.10582
-chr1	11532620	11532693	chr1.744	338	0.026821
-chr1	11548123	11548303	chr1.745	370	0.0902696
-chr1	11548367	11548507	chr1.746	391	0.154725
-chr1	11636532	11637090	chr1.747	528	0.962523
-chr1	11640057	11640342	chr1.748	545	1.11199
-chr1	11643261	11643263	chr1.749	454	0.442281
-chr1	11643310	11643450	chr1.750	372	0.0964662
-chr1	11644166	11645286	chr1.751	631	2.02555
-chr1	11648139	11648395	chr1.752	374	0.10208
-chr1	11648444	11649651	chr1.753	535	1.02368
-chr1	11649814	11649862	chr1.754	439	0.360995
-chr1	11658259	11659370	chr1.755	680	2.66911
-chr1	11674833	11676363	chr1.756	755	3.81803
-chr1	11685899	11685963	chr1.757	348	0.0427532
-chr1	11686103	11686203	chr1.758	386	0.137489
-chr1	11686723	11686803	chr1.759	358	0.0624899
-chr1	11687143	11687225	chr1.760	347	0.0419641
-chr1	11687275	11687853	chr1.761	421	0.270193
-chr1	11700314	11700321	chr1.762	320	0.007512
-chr1	11705512	11705965	chr1.763	454	0.440738
-chr1	11713519	11714464	chr1.764	641	2.14917
-chr1	11724399	11724538	chr1.765	324	0.0111745
-chr1	11724656	11725336	chr1.766	531	0.98641
-chr1	11730045	11731533	chr1.767	644	2.19209
-chr1	11734375	11735216	chr1.768	503	0.765884
-chr1	11735248	11735477	chr1.769	393	0.159503
-chr1	11743298	11743951	chr1.770	589	1.54117
-chr1	11756894	11757005	chr1.771	403	0.199074
-chr1	11797494	11798391	chr1.772	666	2.46757
-chr1	11798736	11799516	chr1.773	589	1.54157
-chr1	11799528	11801368	chr1.774	876	6.12942
-chr1	11832726	11833584	chr1.775	654	2.31091
-chr1	11839882	11840382	chr1.776	461	0.479399
-chr1	11853568	11854246	chr1.777	502	0.757542
-chr1	11888103	11888671	chr1.778	548	1.13601
-chr1	11900015	11900148	chr1.779	366	0.0825749
-chr1	11900247	11900335	chr1.780	400	0.18488
-chr1	11901991	11902909	chr1.781	608	1.7513
-chr1	11902976	11903612	chr1.782	711	3.12403
-chr1	11903696	11904564	chr1.783	518	0.882039
-chr1	11904863	11905003	chr1.784	396	0.170739
-chr1	11919310	11919389	chr1.785	352	0.050833
-chr1	11920555	11921134	chr1.786	637	2.09438
-chr1	11928312	11929587	chr1.787	706	3.04291
-chr1	11973919	11975541	chr1.788	778	4.21722
-chr1	11975727	11975967	chr1.789	434	0.332081
-chr1	12013365	12014345	chr1.790	869	5.96891
-chr1	12041403	12042004	chr1.791	453	0.435287
-chr1	12058298	12059198	chr1.792	505	0.780643
-chr1	12060328	12060406	chr1.793	321	0.00834494
-chr1	12060419	12060530	chr1.794	375	0.105754
-chr1	12072388	12072482	chr1.795	309	0.001827
-chr1	12081725	12083553	chr1.796	529	0.973503
-chr1	12083592	12084172	chr1.797	473	0.552283
-chr1	12100660	12100749	chr1.798	339	0.0294
-chr1	12112953	12113194	chr1.799	434	0.331642
-chr1	12119325	12119399	chr1.800	378	0.112809
-chr1	12127227	12127737	chr1.801	571	1.35524
-chr1	12137135	12138575	chr1.802	516	0.860251
-chr1	12144761	12145329	chr1.803	504	0.773191
-chr1	12146431	12146852	chr1.804	370	0.092743
-chr1	12147573	12148060	chr1.805	426	0.29298
-chr1	12152020	12152520	chr1.807	457	0.455083
-chr1	12154183	12154374	chr1.808	398	0.17961
-chr1	12155721	12155925	chr1.809	362	0.070915
-chr1	12156003	12156605	chr1.810	505	0.780809
-chr1	12160994	12161705	chr1.811	491	0.678695
-chr1	12162251	12162338	chr1.812	367	0.083161
-chr1	12166143	12166283	chr1.813	386	0.137527
-chr1	12166483	12166623	chr1.814	390	0.152242
-chr1	12166685	12166825	chr1.815	367	0.0831564
-chr1	12167125	12167365	chr1.816	365	0.0779965
-chr1	12167457	12168531	chr1.817	665	2.45889
-chr1	12171747	12172044	chr1.818	435	0.336281
-chr1	12172089	12173870	chr1.819	626	1.95922
-chr1	12183907	12183974	chr1.820	344	0.035861
-chr1	12197940	12198104	chr1.821	394	0.164764
-chr1	12198287	12199067	chr1.822	551	1.16823
-chr1	12202922	12203798	chr1.823	586	1.51165
-chr1	12204860	12205296	chr1.824	582	1.4676
-chr1	12223965	12223992	chr1.825	357	0.0617072
-chr1	12224082	12224704	chr1.826	776	4.18161
-chr1	12225014	12225192	chr1.827	360	0.0667278
-chr1	12225392	12225556	chr1.828	334	0.022319
-chr1	12237712	12238106	chr1.830	394	0.162787
-chr1	12238306	12238406	chr1.831	374	0.102884
-chr1	12250439	12251019	chr1.832	430	0.314475
-chr1	12296646	12296833	chr1.833	374	0.102431
-chr1	12308740	12309003	chr1.834	382	0.123975
-chr1	12332362	12333062	chr1.835	449	0.41104
-chr1	12336091	12336191	chr1.836	395	0.167755
-chr1	12336391	12336891	chr1.837	496	0.70959
-chr1	12338572	12340898	chr1.838	600	1.65857
-chr1	12379179	12380859	chr1.839	573	1.38276
-chr1	12402071	12402250	chr1.840	372	0.095808
-chr1	12404145	12404785	chr1.841	439	0.357204
-chr1	12427890	12428967	chr1.842	549	1.14903
-chr1	12429946	12430557	chr1.843	452	0.430647
-chr1	12430657	12430757	chr1.844	332	0.0193219
-chr1	12432758	12433138	chr1.845	450	0.419825
-chr1	12442728	12444136	chr1.846	576	1.40849
-chr1	12447658	12448191	chr1.847	393	0.159936
-chr1	12456074	12456274	chr1.849	381	0.123171
-chr1	12466961	12468243	chr1.850	579	1.44035
-chr1	12468308	12468343	chr1.851	317	0.00565047
-chr1	12469713	12470813	chr1.852	577	1.42181
-chr1	12472613	12473713	chr1.853	592	1.57865
-chr1	12474674	12475574	chr1.854	499	0.732854
-chr1	12504326	12505648	chr1.855	694	2.86522
-chr1	12507812	12508452	chr1.856	460	0.476398
-chr1	12589337	12590109	chr1.857	527	0.95416
-chr1	12595533	12595885	chr1.858	538	1.04484
-chr1	12595964	12596007	chr1.859	381	0.122329
-chr1	12598333	12599059	chr1.860	634	2.0554
-chr1	12602441	12602921	chr1.861	437	0.347268
-chr1	12609975	12615062	chr1.862	681	2.67612
-chr1	12628983	12629038	chr1.863	328	0.01499
-chr1	12653139	12653750	chr1.864	585	1.49641
-chr1	12709964	12710204	chr1.865	392	0.158386
-chr1	13536563	13536663	chr1.866	365	0.079255
-chr1	13648290	13648564	chr1.867	396	0.170599
-chr1	13648630	13648930	chr1.868	394	0.164951
-chr1	13662441	13662743	chr1.869	376	0.106974
-chr1	13664935	13665135	chr1.870	385	0.136126
-chr1	13737241	13738053	chr1.871	550	1.15861
-chr1	13771156	13773437	chr1.872	602	1.68301
-chr1	13774089	13774979	chr1.873	568	1.32514
-chr1	13802090	13803586	chr1.874	669	2.51079
-chr1	13805063	13805403	chr1.875	469	0.529197
-chr1	13805417	13805657	chr1.876	408	0.21799
-chr1	13806857	13807057	chr1.877	402	0.194273
-chr1	13807157	13807258	chr1.878	366	0.0805917
-chr1	13820234	13821790	chr1.879	863	5.85212
-chr1	13860441	13860681	chr1.881	405	0.206331
-chr1	13860716	13860994	chr1.882	425	0.289412
-chr1	13866367	13866907	chr1.883	419	0.263851
-chr1	13869148	13870002	chr1.884	499	0.730528
-chr1	14032227	14032506	chr1.885	412	0.232528
-chr1	14111264	14111804	chr1.886	402	0.192342
-chr1	14175862	14176462	chr1.887	401	0.190955
-chr1	14261116	14261256	chr1.888	348	0.043671
-chr1	14377545	14378045	chr1.889	447	0.398278
-chr1	14606946	14607186	chr1.890	354	0.054381
-chr1	14778554	14778888	chr1.891	414	0.240023
-chr1	14906714	14907214	chr1.892	434	0.333813
-chr1	14995701	14996075	chr1.893	565	1.3023
-chr1	14996277	14996382	chr1.894	466	0.512972
-chr1	15040834	15041229	chr1.895	431	0.319072
-chr1	15090292	15090325	chr1.896	331	0.018017
-chr1	15136259	15136736	chr1.897	448	0.404303
-chr1	15162138	15162749	chr1.898	409	0.221743
-chr1	15172653	15172993	chr1.899	443	0.377085
-chr1	15173052	15173192	chr1.900	393	0.160083
-chr1	15173226	15173392	chr1.901	352	0.0515823
-chr1	15200339	15200879	chr1.902	543	1.08883
-chr1	15209631	15210311	chr1.903	486	0.641895
-chr1	15257215	15257749	chr1.904	388	0.144293
-chr1	15276886	15277426	chr1.905	449	0.409087
-chr1	15394922	15395202	chr1.906	453	0.432337
-chr1	15395205	15395885	chr1.907	517	0.869571
-chr1	15395960	15396200	chr1.908	417	0.254147
-chr1	15404605	15405145	chr1.909	472	0.549452
-chr1	15413596	15414121	chr1.910	426	0.294237
-chr1	15417888	15418021	chr1.911	367	0.082711
-chr1	15480449	15480689	chr1.912	440	0.364072
-chr1	15480762	15483101	chr1.913	657	2.35582
-chr1	15483501	15484141	chr1.914	451	0.420121
-chr1	15488902	15489744	chr1.915	527	0.95526
-chr1	15502704	15503364	chr1.916	604	1.70467
-chr1	15523081	15523221	chr1.917	380	0.119752
-chr1	15595510	15597650	chr1.918	922	7.1369
-chr1	15597865	15599193	chr1.919	750	3.74345
-chr1	15649465	15650083	chr1.920	490	0.667183
-chr1	15650330	15651770	chr1.921	670	2.52282
-chr1	15655458	15655571	chr1.922	330	0.017011
-chr1	15656213	15656968	chr1.923	611	1.79092
-chr1	15674755	15675864	chr1.924	788	4.39598
-chr1	15688133	15690546	chr1.925	724	3.31213
-chr1	15733832	15734032	chr1.926	375	0.106116
-chr1	15755232	15755432	chr1.928	411	0.229849
-chr1	15755792	15757966	chr1.929	723	3.30323
-chr1	15768518	15769498	chr1.930	615	1.83402
-chr1	15769591	15769971	chr1.931	443	0.378344
-chr1	15812858	15813715	chr1.932	620	1.88854
-chr1	15828323	15828328	chr1.933	310	0.002096
-chr1	15829882	15830047	chr1.934	441	0.36691
-chr1	15830227	15830286	chr1.935	445	0.389135
-chr1	15830395	15830629	chr1.936	529	0.972392
-chr1	15863863	15864128	chr1.937	458	0.465222
-chr1	15875248	15875369	chr1.938	366	0.080629
-chr1	15887454	15887600	chr1.939	385	0.135358
-chr1	15905267	15905365	chr1.940	339	0.0289332
-chr1	15905461	15908288	chr1.941	827	5.1255
-chr1	15918864	15922205	chr1.942	738	3.54094
-chr1	15958522	15958769	chr1.943	419	0.264563
-chr1	15996735	15997035	chr1.944	414	0.239623
-chr1	16021081	16022481	chr1.945	707	3.05552
-chr1	16022581	16023617	chr1.946	452	0.430443
-chr1	16037778	16038658	chr1.947	505	0.776284
-chr1	16047135	16048662	chr1.948	774	4.14074
-chr1	16066441	16066479	chr1.949	331	0.018547
-chr1	16080746	16081381	chr1.950	441	0.371092
-chr1	16084523	16084632	chr1.951	456	0.450871
-chr1	16084650	16084783	chr1.952	344	0.0365067
-chr1	16127613	16128489	chr1.953	678	2.6351
-chr1	16142110	16142395	chr1.954	480	0.603216
-chr1	16145119	16145707	chr1.955	699	2.9408
-chr1	16145724	16145764	chr1.956	468	0.521564
-chr1	16150588	16151175	chr1.957	595	1.60769
-chr1	16215862	16216336	chr1.958	441	0.369728
-chr1	16226595	16227829	chr1.959	583	1.48114
-chr1	16229788	16230117	chr1.960	487	0.64524
-chr1	16231910	16232110	chr1.961	368	0.085952
-chr1	16233262	16233351	chr1.962	427	0.297411
-chr1	16233531	16234692	chr1.963	623	1.93145
-chr1	16239119	16240074	chr1.964	604	1.71212
-chr1	16259549	16259795	chr1.965	424	0.284513
-chr1	16259815	16259883	chr1.966	459	0.471239
-chr1	16277952	16279335	chr1.967	772	4.10972
-chr1	16287820	16289983	chr1.968	719	3.23859
-chr1	16307757	16309643	chr1.969	701	2.963
-chr1	16316085	16316553	chr1.970	459	0.469429
-chr1	16335846	16336486	chr1.971	442	0.372348
-chr1	16385123	16385373	chr1.972	375	0.105099
-chr1	16385463	16385803	chr1.973	369	0.0889854
-chr1	16423272	16424769	chr1.974	754	3.80381
-chr1	16424803	16425083	chr1.975	498	0.722923
-chr1	16438330	16440076	chr1.976	711	3.11638
-chr1	16448707	16448947	chr1.977	376	0.108169
-chr1	16458706	16458814	chr1.978	401	0.189876
-chr1	16459154	16459289	chr1.979	371	0.0930393
-chr1	16459554	16459754	chr1.980	372	0.0972496
-chr1	16492328	16492973	chr1.981	564	1.29202
-chr1	16511879	16513759	chr1.982	716	3.19559
-chr1	16524480	16524580	chr1.983	370	0.091235
-chr1	16567461	16567841	chr1.984	349	0.045555
-chr1	16570611	16571718	chr1.985	689	2.79814
-chr1	16584704	16585284	chr1.986	529	0.9694
-chr1	16585413	16586501	chr1.987	591	1.55995
-chr1	16586544	16587124	chr1.988	552	1.178
-chr1	16592295	16593134	chr1.989	526	0.945032
-chr1	16605956	16607226	chr1.990	578	1.42612
-chr1	16607330	16607426	chr1.991	331	0.018543
-chr1	16650721	16651561	chr1.992	495	0.703933
-chr1	16657017	16657717	chr1.993	447	0.399027
-chr1	16663475	16664375	chr1.994	538	1.05196
-chr1	16684068	16686560	chr1.995	820	4.99284
-chr1	16687546	16687708	chr1.996	348	0.043704
-chr1	16692836	16692860	chr1.997	395	0.16956
-chr1	16692903	16693329	chr1.998	557	1.21841
-chr1	16694833	16694937	chr1.999	372	0.097097
-chr1	16696709	16696711	chr1.1000	315	0.00459888
-chr1	16696773	16697030	chr1.1001	471	0.543454
-chr1	16703861	16703878	chr1.1003	312	0.002797
-chr1	16715636	16715735	chr1.1004	370	0.092628
-chr1	16715776	16717338	chr1.1005	868	5.95332
-chr1	16719238	16720038	chr1.1006	545	1.11388
-chr1	16724525	16725049	chr1.1007	379	0.116114
-chr1	16733239	16733339	chr1.1008	329	0.016083
-chr1	16737378	16737958	chr1.1009	536	1.02924
-chr1	16738014	16738594	chr1.1010	536	1.02924
-chr1	16738684	16739164	chr1.1011	512	0.83069
-chr1	16739206	16739786	chr1.1012	536	1.02924
-chr1	16770909	16770930	chr1.1013	376	0.108583
-chr1	16771358	16771728	chr1.1014	539	1.05694
-chr1	16771773	16772096	chr1.1015	373	0.0984549
-chr1	16772128	16773528	chr1.1016	617	1.85105
diff --git a/src/test/resources/htsjdk/tribble/soapsnp.txt b/src/test/resources/htsjdk/tribble/soapsnp.txt
deleted file mode 100644
index 906408c..0000000
--- a/src/test/resources/htsjdk/tribble/soapsnp.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-chr1       00024553502     C       T       8       T       34      2       2       C       0       0       0       2       2       1.00000 1.00000 1
-chr1       00032906555     T       Y       0       C       34      1       1       T       0       0       0       1       1       0.00000 1.00000 1
-chr1       00043851998     T       C       11      C       34      1       1       T       0       0       0       1       1       1.00000 1.00000 1
-chr1       00085336726     A       G       9       G       34      1       1       A       0       0       0       1       1       1.00000 1.00000 1
-chr1       00089619960     G       T       15      T       34      1       1       G       0       0       0       1       1       1.00000 1.00000 1
-chr1       00150459311     T       C       25      C       18      2       2       T       0       0       0       2       2       1.00000 1.00000 1
-chr1       00150542507     C       M       0       C       34      1       1       G       0       0       0       1       1       0.00000 1.00000 1
-chr1       00155208036     T       G       8       G       34      2       2       T       0       0       0       2       2       1.00000 1.00000 1
-chr1       00159060586     G       C       15      C       34      2       2       G       0       0       0       2       2       1.00000 1.00000 1
-chr1       00159279214     G       A       4       A       34      1       1       G       0       0       0       1       1       1.00000 1.00000 1
-chr1       00173313412     A       G       10      G       35      1       1       A       0       0       0       1       1       1.00000 1.00000 1
-chr1       00184407924     G       A       12      A       34      1       1       G       0       0       0       1       1       1.00000 1.00000 1
-chr1       00205302577     G       A       2       A       34      1       1       G       0       0       0       1       1       1.00000 1.00000 1
-chr2       00057129003     G       A       1       A       35      1       1       G       0       0       0       1       1       1.00000 1.00000 1
-chr2       00068399444     T       G       14      G       32      1       1       T       0       0       0       1       1       1.00000 1.00000 1
-chr2       00068399489     C       G       4       G       2       2       2       C       0       0       0       2       2       1.00000 1.00000 1
-chr2       00074039384     A       T       11      T       34      1       1       A       0       0       0       1       1       1.00000 1.00000 1
-chr2       00099388952     C       A       2       A       34      2       2       C       0       0       0       2       2       1.00000 1.00000 0
-chr2       00129970560     G       A       2       A       34      2       2       G       0       0       0       2       2       1.00000 1.00000 0
-chr2       00172106557     T       C       20      C       33      2       2       T       0       0       0       2       2       1.00000 1.00000 1
-chr2       00190398016     G       A       6       A       34      1       1       G       0       0       0       1       1       1.00000 1.00000 1
-chr2       00202177606     C       T       32      T       32      1       1       C       0       0       0       1       1       1.00000 1.00000 1
-chr2       00230378724     C       A       2       A       31      2       2       C       0       0       0       2       2       1.00000 1.00000 0
-chr2       00239133677     G       A       0       A       33      1       1       G       0       0       0       1       1       1.00000 1.00000 1
diff --git a/src/test/resources/htsjdk/tribble/split/test.bin.part1 b/src/test/resources/htsjdk/tribble/split/test.bin.part1
deleted file mode 100644
index a128411..0000000
Binary files a/src/test/resources/htsjdk/tribble/split/test.bin.part1 and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/split/test.bin.part2 b/src/test/resources/htsjdk/tribble/split/test.bin.part2
deleted file mode 100644
index 011fd79..0000000
Binary files a/src/test/resources/htsjdk/tribble/split/test.bin.part2 and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/split/test.bin.part3 b/src/test/resources/htsjdk/tribble/split/test.bin.part3
deleted file mode 100644
index b8aa567..0000000
Binary files a/src/test/resources/htsjdk/tribble/split/test.bin.part3 and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/split/test.bin.split b/src/test/resources/htsjdk/tribble/split/test.bin.split
deleted file mode 100644
index 8d0fb5a..0000000
--- a/src/test/resources/htsjdk/tribble/split/test.bin.split
+++ /dev/null
@@ -1,3 +0,0 @@
-test.bin.part1 4000
-test.bin.part2 4000
-test.bin.part3 4000
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz b/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz
deleted file mode 100644
index d98edfb..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz.tbi b/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz.tbi
deleted file mode 100644
index e80441b..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/tabix/bigger.vcf.gz.tbi b/src/test/resources/htsjdk/tribble/tabix/bigger.vcf.gz.tbi
deleted file mode 100644
index 232a1a2..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/bigger.vcf.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf b/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf
deleted file mode 100644
index ab31c59..0000000
--- a/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf
+++ /dev/null
@@ -1,51 +0,0 @@
-##fileformat=VCFv4.2
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=10,length=135534747,assembly=b37>
-##contig=<ID=11,length=135006516,assembly=b37>
-##contig=<ID=12,length=133851895,assembly=b37>
-##contig=<ID=13,length=115169878,assembly=b37>
-##contig=<ID=14,length=107349540,assembly=b37>
-##contig=<ID=15,length=102531392,assembly=b37>
-##contig=<ID=16,length=90354753,assembly=b37>
-##contig=<ID=17,length=81195210,assembly=b37>
-##contig=<ID=18,length=78077248,assembly=b37>
-##contig=<ID=19,length=59128983,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=20,length=63025520,assembly=b37>
-##contig=<ID=21,length=48129895,assembly=b37>
-##contig=<ID=22,length=51304566,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-##contig=<ID=4,length=191154276,assembly=b37>
-##contig=<ID=5,length=180915260,assembly=b37>
-##contig=<ID=6,length=171115067,assembly=b37>
-##contig=<ID=7,length=159138663,assembly=b37>
-##contig=<ID=8,length=146364022,assembly=b37>
-##contig=<ID=9,length=141213431,assembly=b37>
-##contig=<ID=X,length=155270560,assembly=b37>
-##contig=<ID=Y,length=59373566,assembly=b37>
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA19238	NA19239	NA19240
-1	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-2	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-3	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-4	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-4	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-5	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-6	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-7	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-8	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-9	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-10	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-11	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-12	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-13	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-14	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-15	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-16	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-17	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-18	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-19	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-20	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-21	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-22	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-X	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-Y	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
diff --git a/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz b/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz
deleted file mode 100644
index 761f6a3..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf b/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf
deleted file mode 100644
index 39e4b90..0000000
--- a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf
+++ /dev/null
@@ -1,75 +0,0 @@
-##fileformat=VCFv3.3
-##FILTER=GATK_STANDARD,"AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10"
-##FILTER=HARD_TO_VALIDATE,"MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1)"
-##FILTER=SnpCluster,"SNPs found in clusters,SNPs found in clusters,SNPs found in clusters"
-##FILTER=match-0,"(set eq 'Intersection' || set eq 'filteredInBoth')"
-##FORMAT=DP,1,Integer,"Read Depth (only filtered reads used for calling)"
-##FORMAT=GQ,1,Integer,"Genotype Quality"
-##FORMAT=GT,1,String,"Genotype"
-##INFO=AB,1,Float,"Allele Balance for hets (ref/(ref+alt))"
-##INFO=AC,1,Integer,"Allele count in genotypes, for each ALT allele, in the same order as listed"
-##INFO=AF,1,Float,"Allele Frequency"
-##INFO=AN,1,Integer,"Total number of alleles in called genotypes"
-##INFO=DB,1,Integer,"dbSNP membership"
-##INFO=DP,1,Integer,"Total Depth"
-##INFO=Dels,1,Float,"Fraction of Reads Containing Spanning Deletions"
-##INFO=HRun,1,Integer,"Largest Contiguous Homopolymer Run of Variant Allele In Either Direction"
-##INFO=MQ,1,Float,"RMS Mapping Quality"
-##INFO=MQ0,1,Integer,"Total Mapping Quality Zero Reads"
-##INFO=QD,1,Float,"Variant Confidence/Quality by Depth"
-##INFO=SB,1,Float,"Strand Bias"
-##NA19238=../depthFilter/filtered.NA19238.chromX.SLX.maq.SRP000032.2009_07.glf
-##NA19239=../depthFilter/filtered.NA19239.chromX.SLX.maq.SRP000032.2009_11.glf
-##NA19240=../merged/NA19240.chromX.merged.glf
-##UG_assume_single_sample_reads=null
-##UG_base_model=EMPIRICAL
-##UG_genotype=false
-##UG_genotype_model=JOINT_ESTIMATE
-##UG_heterozygosity=0.0010
-##UG_include_experimental_annotations=false
-##UG_max_deletion_fraction=0.05
-##UG_max_mismatches_in_40bp_window=3
-##UG_min_base_quality_score=10
-##UG_min_confidence_threshold=50.0
-##UG_min_mapping_quality_score=10
-##UG_noSLOD=false
-##UG_output_all_callable_bases=false
-##UG_platform=SOLID
-##UG_poolSize=0
-##UG_use_reads_with_bad_mates=false
-##maxTotalDepth=1000
-##minMapQuality=30
-##minPosterior=0.9990
-##minTotalDepth=0
-##program=glfTrio
-##reference=human_b36_both.fasta
-##source=UnifiedGenotyper
-##source=VariantFiltration
-##source=VariantSelect
-##versionDate=Sun Sep 20 17:38:54 2009
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA19238	NA19239	NA19240	
-1	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-2	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-3	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-4	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-4	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-5	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-6	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-7	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-8	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-9	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-10	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-11	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-12	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-13	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-14	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-15	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-16	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-17	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-18	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-19	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-20	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-21	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-22	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-X	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-Y	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
diff --git a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz b/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz
deleted file mode 100644
index ccda746..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz.tbi b/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz.tbi
deleted file mode 100644
index 6bc4be2..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/test with spaces.vcf b/src/test/resources/htsjdk/tribble/test with spaces.vcf
deleted file mode 100644
index 27d4500..0000000
--- a/src/test/resources/htsjdk/tribble/test with spaces.vcf	
+++ /dev/null
@@ -1,24 +0,0 @@
-##fileformat=VCFv4.1
-##fileDate=20090805
-##source=myImputationProgramV3.1
-##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta
-##contig=<ID=20,length=62435964,assembly=B36,md5=f126cdf8a6e0c7f379d618ff66beb2da,species="Homo sapiens",taxonomy=x>
-##phasing=partial
-##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency">
-##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
-##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
-##FILTER=<ID=q10,Description="Quality below 10">
-##FILTER=<ID=s50,Description="Less than 50% of samples have data">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
-##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA00001	NA00002	NA00003
-20	14370	rs6054257	G	A	29	PASS	NS=3;DP=14;AF=0.5;DB;H2	GT:GQ:DP:HQ	0|0:48:1:51,51	1|0:48:8:51,51	1/1:43:5:.,.
-20	17330	.	T	A	3	q10	NS=3;DP=11;AF=0.017	GT:GQ:DP:HQ	0|0:49:3:58,50	0|1:3:5:65,3	0/0:41:3
-20	1110696	rs6040355	A	G,T	67	PASS	NS=2;DP=10;AF=0.333,0.667;AA=T;DB	GT:GQ:DP:HQ	1|2:21:6:23,27	2|1:2:0:18,2	2/2:35:4
-20	1230237	.	T	.	47	PASS	NS=3;DP=13;AA=T	GT:GQ:DP:HQ	0|0:54:7:56,60	0|0:48:4:51,51	0/0:61:2
-20	1234567	microsat1	GTC	G,GTCT	50	PASS	NS=3;DP=9;AA=G	GT:GQ:DP	0/1:35:4	0/2:17:2	1/1:40:3
diff --git a/src/test/resources/htsjdk/tribble/test.bed b/src/test/resources/htsjdk/tribble/test.bed
deleted file mode 100644
index 2a68645..0000000
--- a/src/test/resources/htsjdk/tribble/test.bed
+++ /dev/null
@@ -1,9 +0,0 @@
-track name="test bed"
-#a comment
-chr1	100	101
-chr1	200	201
-chr1	300	301
-chr1	100000	100010
-chr1	100020	100040
-chr2	1	10
-chr2	20	30
diff --git a/src/test/resources/htsjdk/tribble/test.gff b/src/test/resources/htsjdk/tribble/test.gff
deleted file mode 100644
index 6a24793..0000000
--- a/src/test/resources/htsjdk/tribble/test.gff
+++ /dev/null
@@ -1,9 +0,0 @@
-#header
-#cont
-chr1    100   101
-chr1    200   201
-chr1    300   301
-chr1    100000   100010
-chr1    100020   100040
-chr2    1   10
-chr2    20   30
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/tribble/test.tabix.bed.gz b/src/test/resources/htsjdk/tribble/test.tabix.bed.gz
deleted file mode 100644
index 7c3b419..0000000
Binary files a/src/test/resources/htsjdk/tribble/test.tabix.bed.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/test.tabix.bed.gz.tbi b/src/test/resources/htsjdk/tribble/test.tabix.bed.gz.tbi
deleted file mode 100644
index b9d16c8..0000000
Binary files a/src/test/resources/htsjdk/tribble/test.tabix.bed.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/test.vcf b/src/test/resources/htsjdk/tribble/test.vcf
deleted file mode 100644
index 27d4500..0000000
--- a/src/test/resources/htsjdk/tribble/test.vcf
+++ /dev/null
@@ -1,24 +0,0 @@
-##fileformat=VCFv4.1
-##fileDate=20090805
-##source=myImputationProgramV3.1
-##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta
-##contig=<ID=20,length=62435964,assembly=B36,md5=f126cdf8a6e0c7f379d618ff66beb2da,species="Homo sapiens",taxonomy=x>
-##phasing=partial
-##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency">
-##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
-##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
-##FILTER=<ID=q10,Description="Quality below 10">
-##FILTER=<ID=s50,Description="Less than 50% of samples have data">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
-##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA00001	NA00002	NA00003
-20	14370	rs6054257	G	A	29	PASS	NS=3;DP=14;AF=0.5;DB;H2	GT:GQ:DP:HQ	0|0:48:1:51,51	1|0:48:8:51,51	1/1:43:5:.,.
-20	17330	.	T	A	3	q10	NS=3;DP=11;AF=0.017	GT:GQ:DP:HQ	0|0:49:3:58,50	0|1:3:5:65,3	0/0:41:3
-20	1110696	rs6040355	A	G,T	67	PASS	NS=2;DP=10;AF=0.333,0.667;AA=T;DB	GT:GQ:DP:HQ	1|2:21:6:23,27	2|1:2:0:18,2	2/2:35:4
-20	1230237	.	T	.	47	PASS	NS=3;DP=13;AA=T	GT:GQ:DP:HQ	0|0:54:7:56,60	0|0:48:4:51,51	0/0:61:2
-20	1234567	microsat1	GTC	G,GTCT	50	PASS	NS=3;DP=9;AA=G	GT:GQ:DP	0/1:35:4	0/2:17:2	1/1:40:3
diff --git a/src/test/resources/htsjdk/tribble/test.vcf.bgz b/src/test/resources/htsjdk/tribble/test.vcf.bgz
deleted file mode 100644
index 44072dc..0000000
Binary files a/src/test/resources/htsjdk/tribble/test.vcf.bgz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/test.vcf.gz b/src/test/resources/htsjdk/tribble/test.vcf.gz
deleted file mode 100644
index 0033290..0000000
Binary files a/src/test/resources/htsjdk/tribble/test.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/testGeliText.txt b/src/test/resources/htsjdk/tribble/testGeliText.txt
deleted file mode 100644
index 6c3d5cc..0000000
--- a/src/test/resources/htsjdk/tribble/testGeliText.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-22	14438070	A	0	0	GG	33.2618	33.2618	0	0	0	0	0	0	0	33.2618	0	0
-22	14438200	G	0	0	AA	1.1886	1.1886	1.1886	0	0	0	0	0	0	0	0	0
-22	14441250	T	0	0	CC	53.483	53.483	0	0	0	0	53.483	0	0	0	0	0
-22	14447887	G	0	0	AA	12.4813	12.4813	12.4813	0	0	0	0	0	0	0	0	0
-22	14457860	C	0	0	AA	12.4084	12.4084	12.4084	0	0	0	0	0	0	0	0	0
-22	14458514	C	0	0	TT	7.5213	7.5213	0	0	0	0	0	0	0	0	0	7.5213
-22	14461115	T	0	0	AA	16.8074	16.8074	16.8074	0	0	0	0	0	0	0	0	0
-22	14461207	G	0	0	AA	16.2602	16.2602	16.2602	0	0	0	0	0	0	0	0	0
-22	14461877	G	0	0	CC	38.4419	38.4419	0	0	0	0	38.4419	0	0	0	0	0
-22	14477581	G	0	0	CC	100.1684	100.1684	0	0	0	0	100.1684	0	0	0	0	0
-22	14478631	C	0	0	GG	183.3861	183.3861	0	0	0	0	0	0	0	183.3861	0	0
-22	14481814	T	0	0	CC	85.2846	85.2846	0	0	0	0	85.2846	0	0	0	0	0
-22	14483033	G	0	0	AA	31.8788	31.8788	31.8788	0	0	0	0	0	0	0	0	0
-22	14483299	A	0	0	GG	77.8744	77.8744	0	0	0	0	0	0	0	77.8744	0	0
-22	14485386	T	0	0	CC	74.4269	74.4269	0	0	0	0	74.4269	0	0	0	0	0
-22	14485626	C	0	0	TT	113.7914	113.7914	0	0	0	0	0	0	0	0	0	113.7914
-22	14493000	C	0	0	AA	80.076	80.076	80.076	0	0	0	0	0	0	0	0	0
-22	14493115	T	0	0	CC	13.3876	13.3876	0	0	0	0	13.3876	0	0	0	0	0
-22	14493547	C	0	0	AA	66.7446	66.7446	66.7446	0	0	0	0	0	0	0	0	0
-22	14498096	C	0	0	TT	22.2114	22.2114	0	0	0	0	0	0	0	0	0	22.2114
-22	14500486	A	0	0	CC	40.1737	40.1737	0	0	0	0	40.1737	0	0	0	0	0
-22	14500558	C	0	0	AA	9.7267	9.7267	9.7267	0	0	0	0	0	0	0	0	0
-22	14513510	T	0	0	CC	0.371	0.371	0	0	0	0	0.371	0	0	0	0	0
-22	14515016	C	0	0	TT	18.3656	18.3656	0	0	0	0	0	0	0	0	0	18.3656
-22	14515375	C	0	0	AA	8.0465	8.0465	8.0465	0	0	0	0	0	0	0	0	0
-22	14518569	T	0	0	CC	7.0936	7.0936	0	0	0	0	7.0936	0	0	0	0	0
-22	14521164	G	0	0	AA	14.6779	14.6779	14.6779	0	0	0	0	0	0	0	0	0
-22	14521784	T	0	0	AA	103.5567	103.5567	103.5567	0	0	0	0	0	0	0	0	0
-22	14523455	G	0	0	AA	111.3576	111.3576	111.3576	0	0	0	0	0	0	0	0	0
-22	14523946	A	0	0	GG	557.6265	557.6265	0	0	0	0	0	0	0	557.6265	0	0
-22	14524113	T	0	0	CC	13.5924	13.5924	0	0	0	0	13.5924	0	0	0	0	0
-22	14529743	T	0	0	AA	14.9931	14.9931	14.9931	0	0	0	0	0	0	0	0	0
-22	14529851	G	0	0	AA	36.2328	36.2328	36.2328	0	0	0	0	0	0	0	0	0
-22	14530198	C	0	0	TT	10.9314	10.9314	0	0	0	0	0	0	0	0	0	10.9314
-22	14530589	C	0	0	AA	5.7191	5.7191	5.7191	0	0	0	0	0	0	0	0	0
-22	14532450	A	0	0	GG	36.3551	36.3551	0	0	0	0	0	0	0	36.3551	0	0
-22	14532603	G	0	0	CC	1.1431	1.1431	0	0	0	0	1.1431	0	0	0	0	0
-22	14533615	A	0	0	CC	76.6265	76.6265	0	0	0	0	76.6265	0	0	0	0	0
-22	14535726	A	0	0	GG	16.5307	16.5307	0	0	0	0	0	0	0	16.5307	0	0
-22	14537455	G	0	0	TT	8.0559	8.0559	0	0	0	0	0	0	0	0	0	8.0559
-22	14539060	G	0	0	AA	11.4875	11.4875	11.4875	0	0	0	0	0	0	0	0	0
-22	14539158	A	0	0	GG	8.9543	8.9543	0	0	0	0	0	0	0	8.9543	0	0
-22	14541357	T	0	0	CC	2.2916	2.2916	0	0	0	0	2.2916	0	0	0	0	0
-22	14543758	C	0	0	TT	5.108	5.108	0	0	0	0	0	0	0	0	0	5.108
-22	14556926	T	0	0	AA	101.0105	101.0105	101.0105	0	0	0	0	0	0	0	0	0
-22	14561744	T	0	0	CC	2.4103	2.4103	0	0	0	0	2.4103	0	0	0	0	0
-22	14579503	C	0	0	TT	49.7801	49.7801	0	0	0	0	0	0	0	0	0	49.7801
-22	14582170	C	0	0	TT	37.9647	37.9647	0	0	0	0	0	0	0	0	0	37.9647
-22	14591631	T	0	0	CC	2.5744	2.5744	0	0	0	0	2.5744	0	0	0	0	0
-22	14592250	A	0	0	GG	16.8241	16.8241	0	0	0	0	0	0	0	16.8241	0	0
diff --git a/src/test/resources/htsjdk/tribble/testIntervalList.list b/src/test/resources/htsjdk/tribble/testIntervalList.list
deleted file mode 100644
index 304d8fb..0000000
--- a/src/test/resources/htsjdk/tribble/testIntervalList.list
+++ /dev/null
@@ -1,6 +0,0 @@
-chr1:1-100
-chr1:200-300
-chr1:500-600
-chr1:700-800
-chr1:900-1001
-chr1:1001-1002
diff --git a/src/test/resources/htsjdk/tribble/trio.vcf b/src/test/resources/htsjdk/tribble/trio.vcf
deleted file mode 100644
index 8a24fb2..0000000
--- a/src/test/resources/htsjdk/tribble/trio.vcf
+++ /dev/null
@@ -1,100 +0,0 @@
-##fileformat=VCFv3.2
-##fileformat=VCFv3.3
-##FILTER=GATK_STANDARD,"AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10"
-##FILTER=HARD_TO_VALIDATE,"MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1)"
-##FILTER=SnpCluster,"SNPs found in clusters,SNPs found in clusters,SNPs found in clusters"
-##FILTER=match-0,"(set eq 'Intersection' || set eq 'filteredInBoth')"
-##FORMAT=DP,1,Integer,"Read Depth (only filtered reads used for calling)"
-##FORMAT=GQ,1,Integer,"Genotype Quality"
-##FORMAT=GT,1,String,"Genotype"
-##INFO=AB,1,Float,"Allele Balance for hets (ref/(ref+alt))"
-##INFO=AC,1,Integer,"Allele count in genotypes, for each ALT allele, in the same order as listed"
-##INFO=AF,1,Float,"Allele Frequency"
-##INFO=AN,1,Integer,"Total number of alleles in called genotypes"
-##INFO=DB,1,Integer,"dbSNP membership"
-##INFO=DP,1,Integer,"Total Depth"
-##INFO=Dels,1,Float,"Fraction of Reads Containing Spanning Deletions"
-##INFO=HRun,1,Integer,"Largest Contiguous Homopolymer Run of Variant Allele In Either Direction"
-##INFO=MQ,1,Float,"RMS Mapping Quality"
-##INFO=MQ0,1,Integer,"Total Mapping Quality Zero Reads"
-##INFO=QD,1,Float,"Variant Confidence/Quality by Depth"
-##INFO=SB,1,Float,"Strand Bias"
-##NA19238=../depthFilter/filtered.NA19238.chromX.SLX.maq.SRP000032.2009_07.glf
-##NA19239=../depthFilter/filtered.NA19239.chromX.SLX.maq.SRP000032.2009_11.glf
-##NA19240=../merged/NA19240.chromX.merged.glf
-##UG_assume_single_sample_reads=null
-##UG_base_model=EMPIRICAL
-##UG_genotype=false
-##UG_genotype_model=JOINT_ESTIMATE
-##UG_heterozygosity=0.0010
-##UG_include_experimental_annotations=false
-##UG_max_deletion_fraction=0.05
-##UG_max_mismatches_in_40bp_window=3
-##UG_min_base_quality_score=10
-##UG_min_confidence_threshold=50.0
-##UG_min_mapping_quality_score=10
-##UG_noSLOD=false
-##UG_output_all_callable_bases=false
-##UG_platform=SOLID
-##UG_poolSize=0
-##UG_use_reads_with_bad_mates=false
-##maxTotalDepth=1000
-##minMapQuality=30
-##minPosterior=0.9990
-##minTotalDepth=0
-##program=glfTrio
-##reference=human_b36_both.fasta
-##source=UnifiedGenotyper
-##source=VariantFiltration
-##source=VariantSelect
-##versionDate=Sun Sep 20 17:38:54 2009
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA19238	NA19239	NA19240	
-1	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-1	4793	rs6682385	A	G	1687.16	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.54;AC=3;AF=0.50;AN=6;DB=1;DP=242;Dels=0.00;HRun=0;MQ=77.94;MQ0=43;QD=6.97;SB=-891.19;set=filteredInBoth	GT:DP:GQ	0/1:15:4.94	0/1:58:99.00	0/1:73:99.00
-1	45162	rs10399749	C	T	634.21	HARD_TO_VALIDATE	AB=0.63;AC=3;AF=0.50;AN=6;DB=1;DP=67;Dels=0.00;HRun=0;MQ=115.93;MQ0=7;QD=12.44;SB=-359.74;set=filteredInBoth	GT:DP:GQ	1/1:6:18.05	0/0:12:35.94	0/1:35:99.00
-1	48677	.	G	A	1049.06	HARD_TO_VALIDATE	AB=0.48;AC=2;AF=0.33;AN=6;DB=0;DP=88;Dels=0.00;HRun=1;MQ=120.08;MQ0=12;QD=14.78;SB=-423.81;set=filteredInBoth	GT:DP:GQ	1/0:16:99.00	0/0:12:36.07	1/0:42:99.00
-1	56724	rs28375825	C	T	65.41	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.88;AC=1;AF=0.50;AN=2;DB=1;DP=145;Dels=0.00;HRun=0;MQ=42.19;MQ0=140;QD=1.01;SB=-44.70;set=filteredInBoth	GT:DP:GQ	./.	./.	0/1:4:16.39
-1	61969	.	T	C	98.69	GATK_STANDARD;HARD_TO_VALIDATE	AC=2;AF=1.00;AN=2;DB=0;DP=83;Dels=0.00;HRun=0;MQ=62.34;MQ0=78;QD=2.30;SB=-40.43;set=filteredInBoth	GT:DP:GQ	./.	./.	1/1:5:15.00
-1	66069	rs6672770	T	C	129.77	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.79;AC=1;AF=0.50;AN=2;DB=1;DP=81;Dels=0.00;HRun=1;MQ=79.82;MQ0=72;QD=3.24;SB=-34.43;set=filteredInBoth	GT:DP:GQ	./.	./.	1/0:8:49.36
-1	72824	.	C	T	442.04	HARD_TO_VALIDATE	AB=0.64;AC=2;AF=0.33;AN=6;DB=0;DP=77;Dels=0.00;HRun=1;MQ=110.14;MQ0=34;QD=7.76;SB=-223.18;set=filteredInBoth	GT:DP:GQ	0/1:8:45.25	0/0:6:17.89	0/1:19:99.00
-1	77053	rs1524602	G	A	550.09	GATK_STANDARD;HARD_TO_VALIDATE	AC=4;AF=0.67;AN=6;DB=1;DP=79;Dels=0.00;HRun=0;MQ=107.50;MQ0=42;QD=9.02;SB=-259.27;set=filteredInBoth	GT:DP:GQ	1/1:1:3.00	0/0:8:23.91	1/1:15:45.14
-1	77999	rs59529791	G	A	405.10	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.54;AC=1;AF=0.50;AN=2;DB=1;DP=149;Dels=0.00;HRun=0;MQ=97.90;MQ0=125;QD=4.82;SB=-212.96;set=filteredInBoth	GT:DP:GQ	./.	./.	1/0:18:99.00
-1	78032	rs940550	C	T	326.66	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.62;AC=2;AF=0.33;AN=6;DB=1;DP=166;Dels=0.00;HRun=0;MQ=106.31;MQ0=90;QD=2.68;SB=-159.68;set=filteredInBoth	GT:DP:GQ	0/1:9:55.54	0/0:13:19.59	0/1:36:99.00
-1	78201	rs55700207	G	A	727.51	HARD_TO_VALIDATE	AB=0.69;AC=2;AF=0.33;AN=6;DB=1;DP=156;Dels=0.00;HRun=1;MQ=123.99;MQ0=18;QD=6.11;SB=-313.22;set=filteredInBoth	GT:DP:GQ	1/0:15:71.23	0/0:30:89.75	1/0:76:99.00
-1	79870	rs6600761	G	A	446.08	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.79;AC=5;AF=0.83;AN=6;DB=1;DP=144;Dels=0.00;HRun=0;MQ=63.25;MQ0=120;QD=3.10;SB=-207.47;set=filteredInBoth	GT:DP:GQ	1/1:1:3.01	1/0:4:39.73	1/1:16:1.78
-1	79914	rs7545609	C	T	330.71	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.43;AC=3;AF=0.75;AN=4;DB=1;DP=113;Dels=0.00;HRun=1;MQ=52.52;MQ0=95;QD=3.31;SB=-87.43;set=filteredInBoth	GT:DP:GQ	./.	1/1:3:8.99	0/1:11:15.70
-1	81468	rs13328714	C	T	1069.45	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.62;AC=3;AF=0.50;AN=6;DB=1;DP=140;Dels=0.00;HRun=0;MQ=54.71;MQ0=81;QD=7.64;SB=-475.44;set=filteredInBoth	GT:DP:GQ	0/1:10:34.30	0/1:6:59.37	0/1:31:84.17
-1	98093	rs9726668	C	T	112.02	GATK_STANDARD;HARD_TO_VALIDATE	AC=2;AF=1.00;AN=2;DB=1;DP=129;Dels=0.00;HRun=1;MQ=44.79;MQ0=116;QD=2.15;SB=-79.41;set=filteredInBoth	GT:DP:GQ	./.	./.	1/1:4:12.04
-1	130294	.	A	T	197.39	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.86;AC=1;AF=0.50;AN=2;DB=0;DP=103;Dels=0.00;HRun=0;MQ=90.59;MQ0=90;QD=3.72;SB=-106.74;set=filteredInBoth	GT:DP:GQ	./.	./.	0/1:11:99.00
-1	235923	.	G	A	594.00	HARD_TO_VALIDATE	AB=0.60;AC=2;AF=0.33;AN=6;DB=0;DP=109;Dels=0.00;HRun=2;MQ=79.25;MQ0=18;QD=6.91;SB=-296.81;set=filteredInBoth	GT:DP:GQ	0/0:18:52.41	1/0:21:99.00	1/0:38:99.00
-1	526849	rs9918921	G	T	729.63	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.70;AC=3;AF=0.50;AN=6;DB=1;DP=144;Dels=0.00;HRun=1;MQ=58.35;MQ0=63;QD=5.07;SB=-386.25;set=filteredInBoth	GT:DP:GQ	0/1:22:99.00	0/1:9:5.72	0/1:32:99.00
-1	554535	rs2792856	A	C	460.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.98;AC=2;AF=0.33;AN=6;DB=1;DP=5992;Dels=0.00;HRun=0;MQ=24.07;MQ0=3765;QD=0.17;SB=-263.03;set=filteredInBoth	GT:DP:GQ	0/1:11:11.51	0/0:1904:99.00	0/1:49:99.00
-1	555454	rs7416152	C	T	337.28	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.69;AC=1;AF=0.17;AN=6;DB=1;DP=613;Dels=0.00;HRun=0;MQ=69.04;MQ0=411;QD=1.44;SB=-37.69;set=filteredInBoth	GT:DP:GQ	0/0:28:10.08	0/0:15:44.56	0/1:45:99.00
-1	556655	rs9283152	T	C	271.50	HARD_TO_VALIDATE	AB=0.56;AC=3;AF=0.50;AN=6;DB=1;DP=143;Dels=0.00;HRun=0;MQ=113.17;MQ0=28;QD=1.90;SB=-150.20;set=filteredInBoth	GT:DP:GQ	1/0:15:11.69	1/0:6:0.60	1/0:43:99.00
-1	556738	rs2185539	C	T	969.07	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.98;AC=2;AF=0.33;AN=6;DB=1;DP=6824;Dels=0.00;HRun=0;MQ=14.67;MQ0=6699;QD=0.19;SB=-473.67;set=filteredInBoth	GT:DP:GQ	0/1:12:41.37	0/0:10:29.98	0/1:49:99.00
-1	557239	rs1972376	G	A	206.76	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.99;AC=2;AF=0.33;AN=6;DB=1;DP=9777;Dels=0.00;HRun=0;MQ=14.50;MQ0=9698;QD=0.03;SB=-116.61;set=filteredInBoth	GT:DP:GQ	0/0:12:35.59	1/0:6:3.58	1/0:34:99.00
-1	558119	rs4098612	C	T	883.08	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.68;AC=3;AF=0.50;AN=6;DB=1;DP=846;Dels=0.00;HRun=0;MQ=61.17;MQ0=599;QD=1.04;SB=-257.60;set=filteredInBoth	GT:DP:GQ	0/1:38:99.00	0/1:29:99.00	0/1:89:99.00
-1	558554	rs8179256	T	C	148.11	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.83;AC=2;AF=0.33;AN=6;DB=1;DP=203;Dels=0.00;HRun=1;MQ=120.71;MQ0=124;QD=0.87;SB=-66.34;set=filteredInBoth	GT:DP:GQ	1/0:4:18.64	0/0:5:15.05	1/0:51:99.00
-1	558581	rs7417964	C	T	290.58	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.82;AC=2;AF=0.33;AN=6;DB=1;DP=265;Dels=0.00;HRun=0;MQ=111.81;MQ0=79;QD=1.49;SB=-93.95;set=filteredInBoth	GT:DP:GQ	0/1:13:14.08	0/0:22:47.05	0/1:77:99.00
-1	588696	.	T	C	218.82	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.54;AC=2;AF=0.33;AN=6;DB=0;DP=134;Dels=0.00;HRun=0;MQ=83.72;MQ0=47;QD=2.77;SB=-104.66;set=filteredInBoth	GT:DP:GQ	1/0:24:61.33	1/0:20:99.00	0/0:26:78.22
-1	593378	.	C	A	251.81	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.79;AC=3;AF=0.50;AN=6;DB=0;DP=87;Dels=0.00;HRun=0;MQ=89.00;MQ0=57;QD=3.87;SB=-90.25;set=filteredInBoth	GT:DP:GQ	0/0:1:3.01	1/1:2:6.01	1/0:18:99.00
-1	593379	.	C	A	264.50	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.80;AC=3;AF=0.50;AN=6;DB=0;DP=88;Dels=0.00;HRun=0;MQ=88.49;MQ0=59;QD=4.01;SB=-90.26;set=filteredInBoth	GT:DP:GQ	0/0:2:6.02	1/1:2:6.02	1/0:17:99.00
-1	625979	rs3871845	G	C	930.94	GATK_STANDARD;HARD_TO_VALIDATE	AC=6;AF=1.00;AN=6;DB=1;DP=107;Dels=0.00;HRun=0;MQ=52.60;MQ0=65;QD=8.70;SB=-330.39;set=filteredInBoth	GT:DP:GQ	1/1:2:6.02	1/1:13:3.64	1/1:13:39.08
-1	658074	.	G	A	158.20	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.85;AC=1;AF=0.50;AN=2;DB=0;DP=128;Dels=0.00;HRun=1;MQ=107.95;MQ0=103;QD=2.11;SB=-62.45;set=filteredInBoth	GT:DP:GQ	./.	./.	1/0:18:99.00
-1	670109	.	G	A	261.26	SnpCluster;HARD_TO_VALIDATE	AB=0.64;AC=3;AF=0.50;AN=6;DB=0;DP=50;Dels=0.00;HRun=0;MQ=57.55;MQ0=22;QD=7.92;SB=-162.18;set=filteredInBoth	GT:DP:GQ	0/0:6:17.87	1/1:4:12.03	1/0:10:99.00
-1	670115	.	A	G	95.67	SnpCluster;HARD_TO_VALIDATE	AB=0.47;AC=1;AF=0.17;AN=6;DB=0;DP=49;Dels=0.00;HRun=0;MQ=45.30;MQ0=22;QD=6.38;SB=-48.65;set=filteredInBoth	GT:DP:GQ	0/1:6:17.65	0/0:4:12.03	0/0:9:27.08
-1	695744	.	C	T	287.83	0	AB=0.53;AC=2;AF=0.33;AN=6;DB=0;DP=115;Dels=0.00;HRun=0;MQ=134.37;MQ0=4;QD=8.72;SB=-139.69;set=Intersection	GT:DP:GQ	0/1:6:39.04	0/1:17:99.00	0/0:67:99.00
-1	705134	.	G	C	479.55	HARD_TO_VALIDATE	AB=0.46;AC=2;AF=0.33;AN=6;DB=0;DP=115;Dels=0.00;HRun=0;MQ=103.92;MQ0=31;QD=8.56;SB=-251.32;set=filteredInBoth	GT:DP:GQ	1/0:7:14.41	1/0:20:99.00	0/0:40:99.00
-1	713682	rs11804171	T	A	146.13	0	AB=0.49;AC=2;AF=0.33;AN=6;DB=1;DP=137;Dels=0.00;HRun=1;MQ=162.31;MQ0=7;QD=3.32;SB=-73.71;set=Intersection	GT:DP:GQ	1/0:10:99.00	1/0:23:78.43	0/0:80:99.00
-1	714613	.	T	A	128.46	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.85;AC=1;AF=0.17;AN=6;DB=0;DP=312;Dels=0.00;HRun=0;MQ=62.11;MQ0=223;QD=1.01;SB=-96.00;set=filteredInBoth	GT:DP:GQ	0/0:8:23.94	0/0:8:24.02	1/0:30:99.00
-1	714914	.	G	C	1014.25	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.89;AC=3;AF=0.50;AN=6;DB=0;DP=1105;Dels=0.00;HRun=0;MQ=40.04;MQ0=802;QD=0.92;SB=-342.49;set=filteredInBoth	GT:DP:GQ	1/0:19:99.00	1/0:63:99.00	1/0:121:99.00
-1	714919	.	C	T	182.40	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.93;AC=2;AF=0.33;AN=6;DB=0;DP=1718;Dels=0.00;HRun=1;MQ=31.70;MQ0=1407;QD=0.14;SB=-70.23;set=filteredInBoth	GT:DP:GQ	0/0:16:13.44	0/1:47:99.00	0/1:116:71.35
-1	715102	.	C	T	464.73	SnpCluster;GATK_STANDARD;HARD_TO_VALIDATE	AB=0.91;AC=2;AF=0.33;AN=6;DB=0;DP=1683;Dels=0.00;HRun=1;MQ=35.16;MQ0=913;QD=0.40;SB=-83.11;set=filteredInBoth	GT:DP:GQ	0/0:84:37.60	0/1:133:36.77	0/1:137:99.00
-1	715843	.	C	T	246.91	SnpCluster;GATK_STANDARD;HARD_TO_VALIDATE	AB=0.57;AC=3;AF=0.75;AN=4;DB=0;DP=573;Dels=0.00;HRun=1;MQ=54.60;MQ0=530;QD=0.60;SB=-78.54;set=filteredInBoth	GT:DP:GQ	./.	1/1:2:6.00	0/1:21:99.00
-1	716461	.	A	T	15831.28	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.39;AC=3;AF=0.50;AN=6;DB=0;DP=4568;Dels=0.00;HRun=1;MQ=25.76;MQ0=2971;QD=3.47;SB=-4224.71;set=filteredInBoth	GT:DP:GQ	0/1:198:99.00	0/1:47:99.00	0/1:355:99.00
-1	716471	.	A	T	63.29	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.84;AC=2;AF=0.33;AN=6;DB=0;DP=1752;Dels=0.00;HRun=1;MQ=26.79;MQ0=1662;QD=0.05;SB=-6.09;set=filteredInBoth	GT:DP:GQ	0/1:2:22.36	0/0:5:15.04	0/1:31:67.13
-1	716513	.	G	T	355.52	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.87;AC=1;AF=0.17;AN=6;DB=0;DP=432;Dels=0.00;HRun=1;MQ=67.96;MQ0=365;QD=1.74;SB=-22.88;set=filteredInBoth	GT:DP:GQ	0/0:5:15.03	0/0:9:26.77	0/1:37:99.00
-1	716514	.	C	A	297.66	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.90;AC=1;AF=0.17;AN=6;DB=0;DP=384;Dels=0.00;HRun=1;MQ=72.11;MQ0=313;QD=1.60;SB=-30.31;set=filteredInBoth	GT:DP:GQ	0/0:6:9.42	0/0:11:24.43	1/0:38:99.00
-1	716758	.	A	G	95.95	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.51;AC=2;AF=0.33;AN=6;DB=0;DP=484;Dels=0.00;HRun=1;MQ=36.47;MQ0=449;QD=0.26;SB=-91.54;set=filteredInBoth	GT:DP:GQ	0/0:1:3.01	0/1:4:18.64	0/1:17:99.00
-1	723728	.	A	G	314.08	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.56;AC=2;AF=0.33;AN=6;DB=0;DP=87;Dels=0.00;HRun=2;MQ=78.26;MQ0=55;QD=4.69;SB=-169.71;set=filteredInBoth	GT:DP:GQ	0/0:3:8.98	0/1:5:19.54	0/1:16:99.00
-1	726158	.	A	T	365.11	0	AB=0.53;AC=2;AF=0.33;AN=6;DB=0;DP=73;Dels=0.01;HRun=6;MQ=84.48;MQ0=0;QD=8.11;SB=-183.35;set=Intersection	GT:DP:GQ	0/1:17:99.00	0/1:23:99.00	0/0:26:75.17
diff --git a/src/test/resources/htsjdk/tribble/trio.vcf.idx b/src/test/resources/htsjdk/tribble/trio.vcf.idx
deleted file mode 100644
index b3aaaff..0000000
Binary files a/src/test/resources/htsjdk/tribble/trio.vcf.idx and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/trioDup.vcf b/src/test/resources/htsjdk/tribble/trioDup.vcf
deleted file mode 100644
index 39e4b90..0000000
--- a/src/test/resources/htsjdk/tribble/trioDup.vcf
+++ /dev/null
@@ -1,75 +0,0 @@
-##fileformat=VCFv3.3
-##FILTER=GATK_STANDARD,"AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10"
-##FILTER=HARD_TO_VALIDATE,"MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1)"
-##FILTER=SnpCluster,"SNPs found in clusters,SNPs found in clusters,SNPs found in clusters"
-##FILTER=match-0,"(set eq 'Intersection' || set eq 'filteredInBoth')"
-##FORMAT=DP,1,Integer,"Read Depth (only filtered reads used for calling)"
-##FORMAT=GQ,1,Integer,"Genotype Quality"
-##FORMAT=GT,1,String,"Genotype"
-##INFO=AB,1,Float,"Allele Balance for hets (ref/(ref+alt))"
-##INFO=AC,1,Integer,"Allele count in genotypes, for each ALT allele, in the same order as listed"
-##INFO=AF,1,Float,"Allele Frequency"
-##INFO=AN,1,Integer,"Total number of alleles in called genotypes"
-##INFO=DB,1,Integer,"dbSNP membership"
-##INFO=DP,1,Integer,"Total Depth"
-##INFO=Dels,1,Float,"Fraction of Reads Containing Spanning Deletions"
-##INFO=HRun,1,Integer,"Largest Contiguous Homopolymer Run of Variant Allele In Either Direction"
-##INFO=MQ,1,Float,"RMS Mapping Quality"
-##INFO=MQ0,1,Integer,"Total Mapping Quality Zero Reads"
-##INFO=QD,1,Float,"Variant Confidence/Quality by Depth"
-##INFO=SB,1,Float,"Strand Bias"
-##NA19238=../depthFilter/filtered.NA19238.chromX.SLX.maq.SRP000032.2009_07.glf
-##NA19239=../depthFilter/filtered.NA19239.chromX.SLX.maq.SRP000032.2009_11.glf
-##NA19240=../merged/NA19240.chromX.merged.glf
-##UG_assume_single_sample_reads=null
-##UG_base_model=EMPIRICAL
-##UG_genotype=false
-##UG_genotype_model=JOINT_ESTIMATE
-##UG_heterozygosity=0.0010
-##UG_include_experimental_annotations=false
-##UG_max_deletion_fraction=0.05
-##UG_max_mismatches_in_40bp_window=3
-##UG_min_base_quality_score=10
-##UG_min_confidence_threshold=50.0
-##UG_min_mapping_quality_score=10
-##UG_noSLOD=false
-##UG_output_all_callable_bases=false
-##UG_platform=SOLID
-##UG_poolSize=0
-##UG_use_reads_with_bad_mates=false
-##maxTotalDepth=1000
-##minMapQuality=30
-##minPosterior=0.9990
-##minTotalDepth=0
-##program=glfTrio
-##reference=human_b36_both.fasta
-##source=UnifiedGenotyper
-##source=VariantFiltration
-##source=VariantSelect
-##versionDate=Sun Sep 20 17:38:54 2009
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA19238	NA19239	NA19240	
-1	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-2	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-3	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-4	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-4	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-5	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-6	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-7	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-8	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-9	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-10	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-11	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-12	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-13	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-14	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-15	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-16	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-17	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-18	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-19	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-20	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-21	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-22	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-X	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
-Y	327	.	T	C	666.18	GATK_STANDARD;HARD_TO_VALIDATE	AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth	GT:DP:GQ	1/0:10:62.65	1/0:37:99.00	1/0:53:99.00
diff --git a/src/test/resources/htsjdk/tribble/vcfexample.vcf b/src/test/resources/htsjdk/tribble/vcfexample.vcf
deleted file mode 100644
index 5d482c9..0000000
--- a/src/test/resources/htsjdk/tribble/vcfexample.vcf
+++ /dev/null
@@ -1,12 +0,0 @@
-##format=VCRv3.2
-##fileDate=20090805
-##source=myImputationProgramV3.1
-##reference=1000GenomesPilot-NCBI36
-##phasing=partial
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA00001	NA00002	NA00003
-20	14370	rs6054257	G	A	29	0	NS=58;DP=258;AF=0.786	GT:GQ:DP:HQ	0|0:48:1:51,51	1|0:48:8:51,51	1/1:43:5
-20	15330	.	T	A	3	q10	NS=55;DP=202;AF=0.024	GT:GQ:DP:HQ	0|0:49:3:58,50	0|1:3:5:65,3	0/0:41:3
-20	111096	rs6040355	A	G	67	0	NS=55;DP=276;AF=0.421,0.579;AA=T	GT:GQ:DP:HQ	1|0:21:6:23,27	0|1:2:0:18,2	0/0:35:4
-20	120237	.	T	.	47	0	NS=57;DP=257;AA=T	GT:GQ:DP:HQ	0|0:54:7:56,60	0|0:48:4:51,51	0/0:61:2
-20	123456	microsat1	G	D4	50	0	NS=55;DP=250;AA=G	GT:GQ:DP	0/1:35:4	0/1:17:2	1/1:40:3
-20	123457	microsat1	G	IGA	50	0	NS=55;DP=250;AA=G	GT:GQ:DP	0/1:35:4	0/1:17:2	1/1:40:3
diff --git a/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz b/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz
deleted file mode 100644
index 9d2b1d0..0000000
Binary files a/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz.tbi b/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz.tbi
deleted file mode 100644
index 194073c..0000000
Binary files a/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.gz b/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.gz
deleted file mode 100644
index eaeb499..0000000
Binary files a/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.hdr.gz b/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.hdr.gz
deleted file mode 100644
index bbea6c9..0000000
Binary files a/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.hdr.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/variant/HiSeq.10000.vcf b/src/test/resources/htsjdk/variant/HiSeq.10000.vcf
deleted file mode 100644
index a304ba2..0000000
--- a/src/test/resources/htsjdk/variant/HiSeq.10000.vcf
+++ /dev/null
@@ -1,10001 +0,0 @@
-##fileformat=VCFv4.0
-##FILTER=<ID=ABFilter,Description="AB  0.75 && DP  40">
-##FILTER=<ID=DPFilter,Description="DP  120 || SB  -0.10">
-##FILTER=<ID=FDRtranche0.00to0.10,Description="FDR tranche level at qual 0.06">
-##FILTER=<ID=FDRtranche0.10to1.00,Description="FDR tranche level at qual 0.03">
-##FILTER=<ID=FDRtranche1.00to2.00,Description="FDR tranche level at qual 0.02">
-##FILTER=<ID=FDRtranche2.00to10.00+,Description="FDR tranche level at qual > 0.06">
-##FILTER=<ID=FDRtranche2.00to10.00,Description="FDR tranche level at qual unknown">
-##FILTER=<ID=HARD_TO_VALIDATE,Description="MQ0 = 4 && ((MQ0 / (1.0 * DP))  0.1)">
-##FILTER=<ID=Indel,Description="Overlaps a user-input mask">
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=LowQual,Description="QUAL  50.0">
-##FILTER=<ID=SnpCluster,Description="SNPs found in clusters">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth (only filtered reads used for calling)">
-##FORMAT=<ID=GL,Number=3,Type=Float,Description="Log-scaled likelihoods for AA,AB,BB genotypes where A=ref and B=alt; not applicable if site is not biallelic">
-##FORMAT=<ID=GQ,Number=1,Type=Float,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##INFO=<ID=AC,Number=.,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=HRun,Number=1,Type=Integer,Description="Largest Contiguous Homopolymer Run of Variant Allele In Either Direction">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with two (and only two) segregating haplotypes">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=OQ,Number=1,Type=Float,Description="The original variant quality score">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-23/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-24/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-5/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessi [...]
-##VariantFiltration="analysis_type=VariantFiltration input_file=[] read_buffer_size=null read_filter=[] intervals=null excludeIntervals=[chrM, chrY] reference_sequence=/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta rodBind=[variant,VCF,wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.vcf, mask,Bed,wgs.v9/HiSeq.WGS.cleaned.indels.10.mask] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null hapmap=null hapmap_chip=null out=wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.in [...]
-##VariantFiltration="analysis_type=VariantFiltration input_file=[] read_buffer_size=null read_filter=[] intervals=null excludeIntervals=[chrM, chrY] reference_sequence=/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta rodBind=[variant,VCF,wgs.v9/HiSeq.WGS.cleaned.ug.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null hapmap=null hapmap_chip=null out=wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.vcf err=null outerr=null filterZeroMappingQualityReads=false dow [...]
-##source=VariantOptimizer
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA12878	
-chr1	109	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=1019;Dels=0.00;HRun=0;HaplotypeScore=686.65;MQ=19.20;MQ0=288;OQ=2175.54;QD=2.13;SB=-1042.18	GT:AD:DP:GL:GQ	0/1:610,327:308:-316.30,-95.47,-803.03:99
-chr1	147	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=348;Dels=0.01;HRun=2;HaplotypeScore=268.66;MQ=20.23;MQ0=105;OQ=196.24;QD=0.56;SB=-76.48	GT:AD:DP:GL:GQ	0/1:294,49:118:-57.87,-34.96,-338.46:99
-chr1	177	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=432;Dels=0.02;HRun=2;HaplotypeScore=404.17;MQ=17.76;MQ0=153;OQ=697.20;QD=1.61;SB=-140.54	GT:AD:DP:GL:GQ	0/1:283,140:122:-108.58,-35.57,-292.84:99
-chr1	180	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=630;Dels=0.01;HRun=2;HaplotypeScore=495.41;MQ=14.22;MQ0=327;OQ=885.33;QD=1.41;SB=-412.44	GT:AD:DP:GL:GQ	0/1:466,154:104:-122.27,-30.46,-246.17:99
-chr1	234	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=336;Dels=0.00;HRun=1;HaplotypeScore=423.95;MQ=19.45;MQ0=111;OQ=596.60;QD=1.78;SB=-230.12	GT:AD:DP:GL:GQ	0/1:267,67:106:-94.87,-31.93,-297.68:99
-chr1	235	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=326;Dels=0.00;HRun=2;HaplotypeScore=391.04;MQ=19.68;MQ0=106;OQ=580.03;QD=1.78;SB=-219.50	GT:AD:DP:GL:GQ	0/1:274,47:105:-99.60,-38.31,-293.27:99
-chr1	250	.	A	C	22.88	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=182;Dels=0.01;HRun=3;HaplotypeScore=244.83;MQ=21.91;MQ0=52;QD=0.13;SB=-23.67	GT:AD:DP:GL:GQ	0/1:148,33:70:-26.66,-21.09,-215.78:55.69
-chr1	291	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=284.50;MQ=20.72;MQ0=39;OQ=529.94;QD=3.93;SB=-160.31	GT:AD:DP:GL:GQ	0/1:87,43:32:-69.55,-13.28,-54.44:99
-chr1	297	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=214.52;MQ=20.93;MQ0=36;OQ=101.21;QD=0.82;SB=-38.97	GT:AD:DP:GL:GQ	0/1:98,15:30:-33.20,-19.79,-87.91:99
-chr1	309	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=153.70;MQ=21.12;MQ0=35;OQ=53.98;QD=0.46;SB=-50.01	GT:AD:DP:GL:GQ	0/1:103,9:32:-18.33,-9.64,-96.32:86.82
-chr1	321	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=612.30;MQ=19.11;MQ0=29;OQ=136.39;QD=0.67;SB=-61.25	GT:AD:DP:GL:GQ	0/1:171,23:33:-33.14,-16.22,-92.98:99
-chr1	327	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=3;HaplotypeScore=227.75;MQ=19.74;MQ0=24;OQ=143.34;QD=0.69;SB=-63.56	GT:AD:DP:GL:GQ	0/1:183,21:38:-34.61,-16.99,-113.13:99
-chr1	352	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=325;Dels=0.00;HRun=1;HaplotypeScore=437.89;MQ=18.90;MQ0=142;OQ=774.23;QD=2.38;SB=-355.54	GT:AD:DP:GL:GQ	0/1:238,84:81:-104.82,-24.11,-183.81:99
-chr1	354	.	C	A	24.89	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=486;Dels=0.01;HRun=1;HaplotypeScore=281.11;MQ=16.12;MQ0=261;QD=0.05;SB=17.54	GT:AD:DP:GL:GQ	0/1:459,24:90:-32.28,-26.51,-269.47:57.71
-chr1	469	.	C	A	22.04	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=82.51;MQ=26.50;MQ0=12;QD=0.39;SB=-7.00	GT:AD:DP:GL:GQ	0/1:34,21:20:-11.52,-6.03,-45.07:54.85
-chr1	664	.	C	G	30.66	PASS	AC=2;AF=1.00;AN=2;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=50.85;QD=25.42;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,2:2:-8.49,-0.60,-0.00:6.02
-chr1	666	.	C	G	10.99	LowQual	AC=1;AF=0.50;AN=2;DP=1;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=10.99;SB=-10.00	GT:AD:DP:GL:GQ	0/1:0,1:1:-4.35,-0.30,-0.00:1.76
-chr1	2646	rs62635284	G	A	0.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=128;Dels=0.00;HRun=0;HaplotypeScore=9.27;MQ=6.23;MQ0=107;OQ=89.13;QD=0.70;SB=-10.00	GT:AD:DP:GL:GQ	1/1:53,75:3:-12.40,-0.90,-0.00:9.03
-chr1	2979	rs62635286	T	G	83.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=11.99;MQ0=41;OQ=300.29;QD=4.77;SB=-10.00	GT:AD:DP:GL:GQ	1/1:31,32:9:-33.61,-2.71,-0.00:27.09
-chr1	2981	rs62028691	A	G	14.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=11.89;MQ0=42;OQ=285.31;QD=4.46;SB=-10.00	GT:AD:DP:GL:GQ	1/1:31,33:9:-32.12,-2.71,-0.00:27.08
-chr1	3759	.	C	A	0.19	PASS	AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=9.71;MQ0=116;OQ=458.45;QD=3.14;SB=-211.61	GT:AD:DP:GL:GQ	0/1:106,40:25:-56.66,-7.53,-33.77:99
-chr1	4536	rs11582131	G	C	0.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=9.63;MQ=12.37;MQ0=52;OQ=335.66;QD=4.48;SB=8.06	GT:AD:DP:GL:GQ	0/1:42,33:16:-41.67,-4.82,-26.29:99
-chr1	4540	.	G	A	47.71	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=2;HaplotypeScore=11.12;MQ=11.52;MQ0=49;QD=0.67;SB=8.05	GT:AD:DP:GL:GQ	0/1:66,5:13:-11.97,-3.92,-35.35:80.54
-chr1	4562	rs11490464	C	G	0.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=2.62;MQ=11.28;MQ0=37;OQ=136.40;QD=2.44;SB=-10.00	GT:AD:DP:GL:GQ	0/1:26,30:9:-19.64,-2.72,-14.87:99
-chr1	4770	rs6682375	A	G	0.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=121;Dels=0.00;HRun=1;HaplotypeScore=1.93;MQ=26.23;MQ0=31;OQ=2992.25;QD=24.73;SB=-1410.84	GT:AD:DP:GL:GQ	1/1:9,111:84:-306.27,-28.58,-3.46:99
-chr1	4793	rs6682385	A	G	0.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=119;Dels=0.00;HRun=0;HaplotypeScore=8.98;MQ=29.61;MQ0=5;OQ=3517.41;QD=29.56;SB=-1722.01	GT:AD:DP:GL:GQ	1/1:4,115:109:-350.74,-32.88,-0.10:99
-chr1	5074	rs11586607	T	G	0.01	FDRtranche2.00to10.00	AC=2;AF=1.00;AN=2;DB;DP=126;Dels=0.00;HRun=1;HaplotypeScore=24.34;MQ=21.42;MQ0=68;OQ=1230.02;QD=9.76;SB=-234.94	GT:AD:DP:GL:GQ	1/1:29,97:39:-130.41,-11.75,-3.82:79.31
-chr1	5137	rs62636497	A	T	140.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=21.69;MQ0=25;OQ=1453.92;QD=17.73;SB=-222.33	GT:AD:DP:GL:GQ	1/1:0,74:39:-148.99,-11.75,-0.01:99
-chr1	5966	.	T	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=129;Dels=0.18;HRun=5;HaplotypeScore=140.84;MQ=21.40;MQ0=8;OQ=1764.68;QD=13.68;SB=-234.42	GT:AD:DP:GL:GQ	1/1:0,106:53:-180.07,-15.66,-0.02:99
-chr1	6092	.	C	A	11.16	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=9.08;MQ=27.90;MQ0=10;QD=0.08;SB=14.05	GT:AD:DP:GL:GQ	0/1:125,11:94:-32.68,-28.32,-307.61:43.65
-chr1	6120	rs11489794	G	C	0.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=3.83;MQ=27.31;MQ0=11;OQ=181.15;QD=2.01;SB=8.06	GT:AD:DP:GL:GQ	0/1:73,17:66:-41.29,-19.89,-251.91:99
-chr1	6151	rs62028673	C	G	0.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=22.13;MQ0=10;OQ=58.79;QD=1.73;SB=-6.99	GT:AD:DP:GL:GQ	0/1:24,10:14:-13.38,-4.22,-45.26:91.62
-chr1	6241	rs17041382	T	C	5.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=138;Dels=0.00;HRun=0;HaplotypeScore=4.98;MQ=14.62;MQ0=74;OQ=755.36;QD=5.47;SB=-258.37	GT:AD:DP:GL:GQ	0/1:39,99:33:-88.77,-9.95,-20.05:99
-chr1	6358	rs3210724	G	C	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=174;Dels=0.00;HRun=0;HaplotypeScore=19.20;MQ=25.41;MQ0=15;OQ=678.86;QD=3.90;SB=-150.77	GT:AD:DP:GL:GQ	0/1:131,42:113:-105.24,-34.07,-360.44:99
-chr1	6360	rs7359297	A	G	49.26	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=171;Dels=0.00;HRun=2;HaplotypeScore=19.20;MQ=25.54;MQ0=15;QD=0.29;SB=20.10	GT:AD:DP:GL:GQ	0/1:155,16:111:-41.64,-33.43,-398.12:82.10
-chr1	6397	rs15642	C	T	157.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=21.39;MQ0=24;OQ=850.53;QD=7.88;SB=-122.64	GT:AD:DP:GL:GQ	0/1:45,63:33:-98.28,-9.94,-33.57:99
-chr1	7270	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=0;HaplotypeScore=18.12;MQ=8.37;MQ0=128;OQ=66.01;QD=0.43;SB=-47.55	GT:AD:DP:GL:GQ	0/1:137,16:8:-12.30,-2.42,-14.38:98.84
-chr1	7558	rs7357853	G	A	28.66	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=123;Dels=0.00;HRun=0;HaplotypeScore=2.85;MQ=11.88;MQ0=88;QD=0.23;SB=-10.00	GT:AD:DP:GL:GQ	0/1:113,10:21:-12.48,-6.33,-62.63:61.49
-chr1	7609	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=1;HaplotypeScore=4.53;MQ=19.87;MQ0=60;OQ=69.47;QD=0.58;SB=-10.00	GT:AD:DP:GL:GQ	0/1:98,22:48:-24.69,-14.46,-166.38:99
-chr1	7766	.	C	T	24.46	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=9.88;MQ=9.94;MQ0=60;QD=0.35;SB=-10.00	GT:AD:DP:GL:GQ	0/1:66,3:7:-7.84,-2.11,-15.08:57.28
-chr1	9089	rs28609851	T	A	1.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=14.01;MQ0=34;OQ=172.68;QD=2.93;SB=-37.66	GT:AD:DP:GL:GQ	0/1:50,9:19:-26.28,-5.72,-45.27:99
-chr1	9185	rs2974813	C	T	45.14	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=3.92;MQ0=67;QD=0.65;SB=-47.56	GT:AD:DP:GL:GQ	1/1:67,2:2:-7.92,-0.60,-0.00:6.02
-chr1	9721	rs12354145	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=128;Dels=0.00;HRun=2;HaplotypeScore=26.09;MQ=12.03;MQ0=77;OQ=197.90;QD=1.55;SB=-10.00	GT:AD:DP:GL:GQ	0/1:97,31:18:-28.50,-5.42,-36.05:99
-chr1	9805	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=195;Dels=0.00;HRun=1;HaplotypeScore=1.10;MQ=10.83;MQ0=134;OQ=142.73;QD=0.73;SB=-10.00	GT:AD:DP:GL:GQ	0/1:171,24:24:-24.81,-7.25,-68.77:99
-chr1	9993	rs7354882	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=155;Dels=0.00;HRun=0;HaplotypeScore=22.48;MQ=21.20;MQ0=19;OQ=727.76;QD=4.70;SB=-285.16	GT:AD:DP:GL:GQ	0/1:126,29:124:-113.46,-37.39,-308.40:99
-chr1	10108	rs6682921	G	A	129.70	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=249;Dels=0.00;HRun=1;HaplotypeScore=98.13;MQ=8.71;MQ0=185;QD=0.52;SB=-64.03	GT:AD:DP:GL:GQ	0/1:175,74:25:-23.78,-7.53,-70.54:99
-chr1	10113	rs11490226	T	C	60.45	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=252;Dels=0.00;HRun=0;HaplotypeScore=99.00;MQ=8.29;MQ0=191;QD=0.24;SB=-6.56	GT:AD:DP:GL:GQ	0/1:200,52:22:-15.96,-6.63,-68.61:93.28
-chr1	10117	.	G	A	27.78	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=251;Dels=0.00;HRun=0;HaplotypeScore=92.18;MQ=8.29;MQ0=191;QD=0.11;SB=-12.58	GT:AD:DP:GL:GQ	0/1:210,41:21:-12.39,-6.33,-58.67:60.61
-chr1	10375	rs6683179	G	T	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=229;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=7.78;MQ0=173;OQ=50.55;QD=0.22;SB=-10.00	GT:AD:DP:GL:GQ	0/1:152,76:16:-13.16,-4.82,-44.89:83.39
-chr1	10410	rs11489908	A	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DB;DP=236;Dels=0.00;HRun=2;HaplotypeScore=3.67;MQ=7.06;MQ0=196;OQ=84.39;QD=0.36;SB=-10.00	GT:AD:DP:GL:GQ	0/1:188,48:18:-17.15,-5.42,-52.83:99
-chr1	16862	rs376349	A	G	0.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=2;HaplotypeScore=2.47;MQ=20.73;MQ0=3;OQ=399.27;QD=24.95;SB=-188.41	GT:AD:DP:GL:GQ	1/1:2,14:12:-43.52,-3.61,-0.00:36.11
-chr1	18110	rs4413987	G	A	0.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=114;Dels=0.00;HRun=0;HaplotypeScore=6.99;MQ=6.98;MQ0=101;OQ=80.12;QD=0.70;SB=-10.00	GT:AD:DP:GL:GQ	0/1:95,19:5:-12.80,-1.51,-7.39:58.87
-chr1	18357	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=8.76;MQ=5.01;MQ0=96;OQ=60.18;QD=0.60;SB=-6.99	GT:AD:DP:GL:GQ	0/1:80,21:4:-10.51,-1.20,-3.97:27.63
-chr1	18421	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=23.14;MQ=14.44;MQ0=48;OQ=339.38;QD=4.35;SB=-90.89	GT:AD:DP:GL:GQ	0/1:55,23:25:-44.76,-7.53,-46.87:99
-chr1	18426	rs4099234	A	G	0.05	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=22.14;MQ=14.77;MQ0=46;OQ=857.23;QD=11.13;SB=-429.56	GT:AD:DP:GL:GQ	1/1:24,53:25:-89.32,-7.53,-0.01:75.22
-chr1	18451	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=15;HaplotypeScore=19.76;MQ=19.64;MQ0=16;OQ=152.23;QD=2.67;SB=-85.40	GT:AD:DP:GL:GQ	0/1:45,12:33:-28.45,-9.95,-82.12:99
-chr1	18454	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=47.13;MQ=19.20;MQ0=19;OQ=58.45;QD=0.99;SB=-20.71	GT:AD:DP:GL:GQ	0/1:53,6:35:-19.67,-10.55,-115.15:91.28
-chr1	18526	rs2418705	T	A	37.69	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.43;MQ=4.16;MQ0=59;QD=0.62;SB=-10.00	GT:AD:DP:GL:GQ	1/1:52,9:2:-7.18,-0.60,-0.00:6.02
-chr1	18698	rs3871714	A	G	0.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=9.06;MQ0=38;OQ=98.37;QD=2.19;SB=-10.00	GT:AD:DP:GL:GQ	1/1:27,18:4:-13.37,-1.21,-0.00:12.03
-chr1	18726	rs16924801	C	A	45.81	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=3.57;MQ=10.40;MQ0=25;QD=1.27;SB=-10.00	GT:AD:DP:GL:GQ	1/1:31,5:2:-7.99,-0.60,-0.00:6.02
-chr1	20391	rs4248192	C	T	0.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=17.17;MQ0=74;OQ=114.21;QD=1.08;SB=-10.00	GT:AD:DP:GL:GQ	0/1:95,11:32:-24.34,-9.64,-88.28:99
-chr1	20411	rs62028215	T	G	8.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=109;Dels=0.00;HRun=0;HaplotypeScore=3.84;MQ=18.51;MQ0=71;OQ=573.84;QD=5.26;SB=-10.00	GT:AD:DP:GL:GQ	0/1:56,53:38:-72.12,-11.45,-46.57:99
-chr1	20723	rs28673882	G	C	0.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=113;Dels=0.00;HRun=0;HaplotypeScore=9.28;MQ=29.99;MQ0=37;OQ=163.32;QD=1.45;SB=40.84	GT:AD:DP:GL:GQ	0/1:100,13:69:-40.42,-20.80,-251.48:99
-chr1	20786	rs806731	G	T	139.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=34.31;MQ0=5;OQ=1407.60;QD=31.99;SB=-624.57	GT:AD:DP:GL:GQ	1/1:0,44:38:-144.35,-11.44,-0.01:99
-chr1	21158	rs806729	A	C	233.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.41;MQ0=5;OQ=71.14;QD=7.90;SB=-10.00	GT:AD:DP:GL:GQ	1/1:6,3:3:-10.60,-0.90,-0.00:9.03
-chr1	30569	rs62101646	G	A	24.23	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=13.59;MQ0=55;QD=0.37;SB=-0.99	GT:AD:DP:GL:GQ	0/1:53,12:8:-8.12,-2.41,-18.79:57.05
-chr1	30757	rs56954914	G	A	38.24	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=7.79;MQ0=81;QD=0.44;SB=-10.00	GT:AD:DP:GL:GQ	0/1:56,30:4:-8.31,-1.20,-6.94:57.33
-chr1	30916	.	C	T	44.25	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=6.25;MQ0=41;QD=1.03;SB=-10.00	GT:AD:DP:GL:GQ	1/1:40,3:2:-7.83,-0.60,-0.00:6.02
-chr1	41536	rs2531251	T	C	28.51	LowQual	AC=1;AF=0.50;AN=2;DB;DP=6;Dels=0.00;HRun=2;HaplotypeScore=0.95;MQ=19.20;MQ0=3;QD=4.75;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,2:3:-7.04,-0.90,-3.46:25.52
-chr1	41761	.	C	A	0.43	PASS	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=4.86;MQ=27.62;MQ0=8;OQ=172.06;QD=5.55;SB=14.07	GT:AD:DP:GL:GQ	0/1:17,14:19:-26.21,-5.72,-39.58:99
-chr1	41791	.	G	A	3.24	PASS	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.83;MQ=30.13;MQ0=12;OQ=368.88;QD=8.20;SB=14.07	GT:AD:DP:GL:GQ	0/1:28,17:31:-49.51,-9.34,-69.71:99
-chr1	42101	rs2691277	T	G	379.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=32.14;MQ0=8;OQ=1117.45;QD=27.25;SB=-498.06	GT:AD:DP:GL:GQ	1/1:0,41:32:-115.34,-9.64,-0.01:96.29
-chr1	44243	rs2691279	T	C	13.38	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=44.42;MQ0=2;QD=0.32;SB=29.13	GT:AD:DP:GL:GQ	0/1:35,7:40:-16.65,-12.05,-143.10:46.01
-chr1	44449	.	T	C	10.02	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=30.96;MQ0=0;QD=0.25;SB=38.15	GT:AD:DP:GL:GQ	0/1:31,9:34:-14.48,-10.24,-121.45:42.40
-chr1	44539	rs2462492	C	T	2.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=48.14;MQ0=0;OQ=219.90;QD=4.40;SB=-111.03	GT:AD:DP:GL:GQ	0/1:40,10:50:-40.33,-15.06,-146.68:99
-chr1	44571	.	G	C	349.91	SnpCluster	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=22.88;MQ=46.02;MQ0=0;QD=5.74;SB=-120.67	GT:AD:DP:GL:GQ	0/1:43,18:49:-53.04,-14.77,-155.67:99
-chr1	44573	.	A	T	77.97	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=5;HaplotypeScore=28.86;MQ=46.27;MQ0=0;QD=1.22;SB=18.79	GT:AD:DP:GL:GQ	0/1:55,9:53:-27.05,-15.97,-167.03:99
-chr1	44575	.	T	C	100.77	SnpCluster	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=36.58;MQ=45.60;MQ0=1;QD=1.53;SB=-17.16	GT:AD:DP:GL:GQ	0/1:57,9:54:-29.63,-16.27,-179.47:99
-chr1	44579	.	C	T	185.88	SnpCluster	AC=1;AF=0.50;AN=2;DP=83;Dels=0.04;HRun=5;HaplotypeScore=85.91;MQ=43.82;MQ0=2;QD=2.24;SB=-100.05	GT:AD:DP:GL:GQ	0/1:66,14:58:-39.34,-17.47,-169.22:99
-chr1	44707	.	G	A	14.95	PASS	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=25.67;MQ0=14;OQ=285.82;QD=6.35;SB=-102.92	GT:AD:DP:GL:GQ	0/1:29,16:26:-39.70,-7.83,-56.06:99
-chr1	44948	.	T	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=3.69;MQ=36.35;MQ0=4;OQ=152.52;QD=2.99;SB=0.17	GT:AD:DP:GL:GQ	0/1:39,12:36:-29.38,-10.84,-106.91:99
-chr1	45027	rs3091274	C	A	22.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=21.32;MQ0=9;OQ=324.14;QD=13.51;SB=-88.90	GT:AD:DP:GL:GQ	1/1:0,24:10:-36.00,-3.01,-0.00:30.09
-chr1	45162	rs10399749	C	T	268.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=27.59;MQ0=3;OQ=1749.04;QD=37.21;SB=-889.19	GT:AD:DP:GL:GQ	1/1:1,46:44:-178.50,-13.25,-0.01:99
-chr1	45189	rs3107975	T	C	528.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.64;MQ0=0;OQ=1690.04;QD=36.74;SB=-682.96	GT:AD:DP:GL:GQ	1/1:0,46:46:-172.60,-13.85,-0.01:99
-chr1	45408	rs28396308	C	T	25.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=23.65;MQ0=4;OQ=659.03;QD=19.97;SB=-174.67	GT:AD:DP:GL:GQ	1/1:0,33:17:-69.49,-5.12,-0.00:51.17
-chr1	46501	rs2691308	C	T	1.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=36.83;MQ0=2;OQ=218.70;QD=3.22;SB=47.17	GT:AD:DP:GL:GQ	0/1:55,13:65:-44.73,-19.58,-190.42:99
-chr1	46662	rs2691309	T	C	45.27	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=41.65;MQ0=3;QD=1.29;SB=26.11	GT:AD:DP:GL:GQ	0/1:27,8:32:-17.45,-9.64,-107.04:78.10
-chr1	46896	rs2691311	T	C	94.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=47.00;MQ0=0;OQ=492.79;QD=6.48;SB=-211.35	GT:AD:DP:GL:GQ	0/1:55,21:75:-75.15,-22.59,-219.09:99
-chr1	46927	rs2548884	G	A	0.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=44.33;MQ0=0;OQ=115.48;QD=1.89;SB=-71.32	GT:AD:DP:GL:GQ	0/1:53,8:60:-32.90,-18.07,-195.48:99
-chr1	47021	rs6658003	G	C	0.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=8.74;MQ0=44;OQ=79.96;QD=1.45;SB=-46.90	GT:AD:DP:GL:GQ	0/1:36,19:6:-13.09,-1.81,-12.99:99
-chr1	47109	rs2691313	C	G	35.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=36.99;MQ0=0;OQ=346.71;QD=6.80;SB=47.18	GT:AD:DP:GL:GQ	0/1:38,13:51:-53.32,-15.37,-164.95:99
-chr1	47155	.	C	T	135.45	PASS	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=34.92;MQ0=10;OQ=1281.86;QD=17.56;SB=-510.08	GT:AD:DP:GL:GQ	0/1:34,39:60:-149.57,-18.10,-69.03:99
-chr1	47239	rs2854673	C	T	32.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=43.73;MQ0=3;OQ=244.39;QD=4.61;SB=47.16	GT:AD:DP:GL:GQ	0/1:39,14:49:-42.48,-14.76,-140.73:99
-chr1	47719	.	T	A	0.78	PASS	AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=2;HaplotypeScore=3.14;MQ=19.08;MQ0=29;OQ=670.79;QD=8.49;SB=-194.63	GT:AD:DP:GL:GQ	0/1:47,32:46:-84.22,-13.86,-89.29:99
-chr1	48074	rs2691335	A	G	2.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=24.51;MQ0=2;OQ=156.22;QD=22.32;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,7:5:-19.18,-1.51,-0.00:15.05
-chr1	48634	.	T	C	2.39	PASS	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=2;HaplotypeScore=1.66;MQ=33.49;MQ0=8;OQ=733.26;QD=12.22;SB=-133.25	GT:AD:DP:GL:GQ	0/1:32,28:50:-91.67,-15.06,-103.96:99
-chr1	50195	rs62637816	T	C	137.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=17.45;MQ0=31;OQ=544.88;QD=7.46;SB=-273.42	GT:AD:DP:GL:GQ	0/1:46,26:42:-70.43,-12.65,-88.66:99
-chr1	50884	rs3844232	G	A	43.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.69;MQ0=8;OQ=74.12;QD=4.12;SB=-10.00	GT:AD:DP:GL:GQ	0/1:11,7:6:-12.50,-1.81,-9.19:73.80
-chr1	51151	.	T	A	30.50	LowQual	AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=24.43;MQ0=2;QD=5.08;SB=-37.96	GT:AD:DP:GL:GQ	0/1:4,2:4:-7.54,-1.20,-7.68:63.33
-chr1	51152	.	A	G	76.91	PASS	AC=1;AF=0.50;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=26.59;MQ0=2;OQ=62.44;QD=8.92;SB=-39.93	GT:AD:DP:GL:GQ	0/1:4,3:5:-11.03,-1.51,-8.33:68.29
-chr1	51305	rs2531261	A	G	318.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.94;MQ0=3;OQ=1035.37;QD=25.88;SB=-471.86	GT:AD:DP:GL:GQ	1/1:0,40:29:-107.13,-8.73,-0.01:87.27
-chr1	51850	.	A	G	82.68	PASS	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=39.81;MQ0=7;OQ=720.99;QD=12.22;SB=-171.50	GT:AD:DP:GL:GQ	0/1:32,27:50:-90.45,-15.06,-94.52:99
-chr1	51852	.	G	C	25.49	PASS	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=40.15;MQ0=6;OQ=1021.36;QD=17.61;SB=-245.09	GT:AD:DP:GL:GQ	0/1:31,27:50:-120.48,-15.06,-101.09:99
-chr1	52066	rs28402963	T	C	139.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.83;MQ=39.80;MQ0=3;OQ=684.28;QD=9.50;SB=-320.22	GT:AD:DP:GL:GQ	0/1:42,30:68:-92.19,-20.48,-169.52:99
-chr1	52134	rs28599927	A	G	180.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=31.13;MQ0=5;OQ=314.17;QD=8.73;SB=-124.71	GT:AD:DP:GL:GQ	0/1:23,13:30:-43.74,-9.04,-73.62:99
-chr1	52441	rs2531315	G	A	15.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.89;MQ0=7;OQ=286.62;QD=17.91;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,16:8:-32.24,-2.41,-0.00:24.08
-chr1	52640	rs3844233	A	T	1.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=20.92;MQ0=32;OQ=114.33;QD=2.04;SB=-23.31	GT:AD:DP:GL:GQ	0/1:45,11:17:-19.84,-5.12,-46.79:99
-chr1	53560	.	T	C	39.15	PASS	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.43;MQ=25.49;MQ0=11;OQ=919.76;QD=11.22;SB=-454.58	GT:AD:DP:GL:GQ	0/1:47,35:69:-116.05,-20.79,-145.77:99
-chr1	54476	rs1627939	T	A	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=2;HaplotypeScore=1.16;MQ=27.48;MQ0=38;OQ=233.94;QD=2.36;SB=-139.05	GT:AD:DP:GL:GQ	0/1:84,15:50:-41.74,-15.06,-148.46:99
-chr1	54790	rs996010	G	T	31.78	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=23.12;MQ0=20;QD=0.47;SB=29.08	GT:AD:DP:GL:GQ	0/1:55,13:40:-18.51,-12.05,-121.17:64.61
-chr1	54839	rs2854687	C	T	10.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=27.08;MQ0=0;OQ=1633.87;QD=34.04;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,48:40:-166.98,-12.05,-0.01:99
-chr1	55660	.	T	C	47.12	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=8.71;MQ0=70;QD=0.52;SB=-10.00	GT:AD:DP:GL:GQ	0/1:73,17:9:-10.71,-2.71,-24.43:79.96
-chr1	55735	.	T	G	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=7.24;MQ0=61;OQ=58.14;QD=0.81;SB=-10.00	GT:AD:DP:GL:GQ	0/1:55,17:5:-10.60,-1.51,-6.69:51.83
-chr1	56025	rs62639105	A	T	0.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=12;Dels=0.00;HRun=3;HaplotypeScore=1.00;MQ=23.00;MQ0=0;OQ=377.29;QD=31.44;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,11:12:-44.38,-3.61,-3.44:2.23
-chr1	60591	.	C	T	1.69	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=14.15;MQ0=46;OQ=324.67;QD=4.39;SB=-159.64	GT:AD:DP:GL:GQ	0/1:50,24:28:-44.18,-8.43,-61.59:99
-chr1	60624	.	T	C	29.51	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=5.38;MQ0=69;QD=0.40;SB=-6.99	GT:AD:DP:GL:GQ	0/1:53,20:3:-7.14,-0.90,-3.77:28.64
-chr1	63704	rs3020697	C	T	122.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.04;MQ=34.36;MQ0=1;OQ=168.10;QD=12.93;SB=-51.56	GT:AD:DP:GL:GQ	1/1:0,13:6:-20.39,-1.81,-0.01:18.05
-chr1	64418	.	A	G	43.84	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=98;Dels=0.00;HRun=1;HaplotypeScore=8.82;MQ=6.47;MQ0=82;QD=0.45;SB=-10.00	GT:AD:DP:GL:GQ	1/1:82,16:2:-7.79,-0.60,-0.00:6.02
-chr1	64433	.	T	A	31.10	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=2.89;MQ=7.92;MQ0=71;QD=0.33;SB=-10.00	GT:AD:DP:GL:GQ	0/1:82,12:3:-7.30,-0.90,-3.84:29.36
-chr1	64544	rs13328683	G	T	4.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=1.57;MQ=18.78;MQ0=9;OQ=435.52;QD=13.61;SB=-10.00	GT:AD:DP:GL:GQ	1/1:10,22:12:-47.14,-3.61,-0.00:36.12
-chr1	67325	rs2462497	G	A	48.02	LowQual	AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.51;MQ0=2;QD=12.01;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,4:2:-8.21,-0.60,-0.00:6.02
-chr1	72009	.	A	G	32.65	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=5.60;MQ=18.28;MQ0=7;QD=1.72;SB=-38.67	GT:AD:DP:GL:GQ	0/1:14,5:11:-9.86,-3.31,-31.53:65.48
-chr1	72112	rs1851945	A	G	1.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=25.77;MQ0=4;OQ=504.38;QD=26.55;SB=-10.00	GT:AD:DP:GL:GQ	1/1:4,15:15:-54.03,-4.52,-0.00:45.14
-chr1	72166	rs2907073	T	C	81.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=27.95;MQ0=1;OQ=468.64;QD=33.47;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,14:13:-50.45,-3.91,-0.00:39.13
-chr1	72179	rs2260604	A	C	22.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.51;MQ0=4;OQ=244.12;QD=17.44;SB=-10.00	GT:AD:DP:GL:GQ	1/1:4,10:10:-28.01,-3.01,-0.01:30.03
-chr1	72195	.	T	C	61.39	PASS	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.33;MQ0=10;OQ=206.79;QD=10.34;SB=-10.00	GT:AD:DP:GL:GQ	0/1:13,7:10:-26.97,-3.01,-11.90:88.90
-chr1	73690	.	A	G	59.97	Indel	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=8.93;MQ=23.64;MQ0=3;QD=4.28;SB=-6.99	GT:AD:DP:GL:GQ	0/1:7,7:8:-11.69,-2.41,-21.22:92.80
-chr1	73692	.	G	A	71.09	Indel	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=3;HaplotypeScore=9.93;MQ=23.64;MQ0=3;QD=5.08;SB=-6.99	GT:AD:DP:GL:GQ	0/1:7,7:8:-12.80,-2.41,-18.45:99
-chr1	73996	.	A	T	22.55	PASS	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=27.59;MQ0=22;OQ=466.23;QD=7.40;SB=-57.87	GT:AD:DP:GL:GQ	0/1:36,27:38:-61.35,-11.44,-82.94:99
-chr1	74170	rs4118012	C	A	85.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=197.97;QD=32.99;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,6:6:-23.37,-1.81,-0.00:18.06
-chr1	74355	rs3871778	C	G	11.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.46;MQ0=2;OQ=92.52;QD=18.50;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,5:3:-12.74,-0.90,-0.00:9.03
-chr1	74885	.	G	A	80.42	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=18.46;MQ0=14;OQ=538.01;QD=13.12;SB=-187.68	GT:AD:DP:GL:GQ	0/1:20,21:26:-64.92,-7.83,-36.63:99
-chr1	80719	.	G	A	41.54	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=8.20;MQ0=31;QD=1.19;SB=-10.00	GT:AD:DP:GL:GQ	0/1:32,2:3:-8.34,-0.91,-2.50:15.90
-chr1	81004	rs4245761	G	T	39.81	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=13.75;MQ0=7;QD=3.32;SB=-10.00	GT:AD:DP:GL:GQ	1/1:7,5:2:-7.39,-0.60,-0.00:6.02
-chr1	81077	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=13;HaplotypeScore=2.26;MQ=18.21;MQ0=7;OQ=85.86;QD=5.05;SB=-62.92	GT:AD:DP:GL:GQ	0/1:11,6:5:-13.38,-1.51,-3.74:22.35
-chr1	81199	rs4245763	A	T	30.68	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=13.70;MQ0=7;QD=3.07;SB=-10.00	GT:AD:DP:GL:GQ	1/1:6,4:2:-6.48,-0.60,-0.00:6.01
-chr1	81378	.	A	C	3.99	PASS	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=33.30;MQ0=0;OQ=188.72;QD=4.72;SB=-114.61	GT:AD:DP:GL:GQ	0/1:31,9:34:-32.39,-10.24,-89.64:99
-chr1	81399	rs6702460	G	T	307.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=32.81;MQ0=0;OQ=1379.58;QD=33.65;SB=-370.87	GT:AD:DP:GL:GQ	1/1:0,41:37:-141.55,-11.14,-0.01:99
-chr1	81444	rs1524604	G	A	325.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.68;MQ0=1;OQ=1101.93;QD=36.73;SB=-340.44	GT:AD:DP:GL:GQ	1/1:0,30:28:-113.78,-8.43,-0.01:84.28
-chr1	81611	rs4256762	C	T	100.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=17.29;MQ0=34;OQ=684.35;QD=12.01;SB=-10.00	GT:AD:DP:GL:GQ	1/1:14,43:19:-75.91,-5.72,-3.90:18.23
-chr1	82517	.	T	C	0.75	PASS	AC=2;AF=1.00;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=13.00;MQ0=6;OQ=70.17;QD=3.19;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,22:3:-10.51,-0.90,-0.00:9.03
-chr1	86134	.	C	G	0.28	PASS	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=17.64;MQ0=31;OQ=214.58;QD=2.38;SB=-33.05	GT:AD:DP:GL:GQ	0/1:81,9:51:-40.11,-15.36,-187.83:99
-chr1	88546	.	G	A	0.08	PASS	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=24.25;MQ0=8;OQ=736.28;QD=19.90;SB=-10.00	GT:AD:DP:GL:GQ	0/1:13,24:26:-84.74,-7.83,-23.08:99
-chr1	88616	rs4504463	T	C	1.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.27;MQ0=29;OQ=80.37;QD=1.55;SB=-10.00	GT:AD:DP:GL:GQ	0/1:43,9:21:-17.65,-6.33,-64.09:99
-chr1	88704	.	G	A	26.43	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=13.14;MQ0=25;QD=0.76;SB=-10.00	GT:AD:DP:GL:GQ	0/1:33,2:8:-8.34,-2.41,-22.88:59.26
-chr1	88715	.	A	G	0.29	PASS	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=13.96;MQ0=21;OQ=53.96;QD=1.74;SB=-10.00	GT:AD:DP:GL:GQ	0/1:28,3:8:-11.09,-2.41,-20.54:86.80
-chr1	88808	.	C	T	3.03	PASS	AC=2;AF=1.00;AN=2;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.56;MQ0=9;OQ=459.05;QD=18.36;SB=-49.56	GT:AD:DP:GL:GQ	1/1:1,24:12:-49.49,-3.61,-0.00:36.12
-chr1	88856	rs1851939	G	A	178.37	HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=30.10;MQ0=10;QD=3.64;SB=-37.62	GT:AD:DP:GL:GQ	0/1:36,12:37:-32.26,-11.14,-102.50:99
-chr1	88918	.	C	A	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=6.89;MQ=32.20;MQ0=8;OQ=309.74;QD=3.64;SB=-68.70	GT:AD:DP:GL:GQ	0/1:64,21:74:-56.55,-22.29,-199.33:99
-chr1	88963	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=30.09;MQ=26.41;MQ0=31;OQ=291.13;QD=2.62;SB=-116.74	GT:AD:DP:GL:GQ	0/1:88,23:71:-53.80,-21.40,-203.68:99
-chr1	88966	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=24.42;MQ=26.07;MQ0=32;OQ=253.10;QD=2.32;SB=-149.24	GT:AD:DP:GL:GQ	0/1:88,21:67:-48.78,-20.19,-197.64:99
-chr1	89000	.	A	G	0.14	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=15.31;MQ0=39;OQ=157.34;QD=2.76;SB=-51.84	GT:AD:DP:GL:GQ	0/1:48,9:10:-22.04,-3.02,-12.09:90.71
-chr1	89029	.	C	T	23.46	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.84;MQ=12.16;MQ0=50;QD=0.36;SB=5.02	GT:AD:DP:GL:GQ	0/1:50,16:9:-8.34,-2.71,-21.03:56.28
-chr1	89043	.	T	C	25.04	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=9.57;MQ0=58;QD=0.36;SB=-0.97	GT:AD:DP:GL:GQ	0/1:54,16:6:-7.59,-1.81,-16.33:57.86
-chr1	89188	.	C	T	0.06	PASS	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=1;HaplotypeScore=2.43;MQ=17.90;MQ0=10;OQ=61.10;QD=3.39;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,3:7:-11.50,-2.11,-14.49:93.93
-chr1	89528	.	C	T	1.15	PASS	AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=22.04;MQ0=0;OQ=168.19;QD=24.03;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,6:5:-20.38,-1.51,-0.00:15.05
-chr1	90974	rs62639107	G	T	14.16	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=10.20;MQ0=34;QD=0.33;SB=-0.97	GT:AD:DP:GL:GQ	0/1:33,10:6:-6.49,-1.81,-14.67:46.83
-chr1	91131	.	G	A	0.50	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=10.39;MQ0=55;OQ=206.73;QD=2.79;SB=-10.00	GT:AD:DP:GL:GQ	0/1:41,33:9:-26.67,-2.71,-7.60:48.84
-chr1	91212	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=134;Dels=0.01;HRun=13;HaplotypeScore=35.68;MQ=19.40;MQ0=63;OQ=147.19;QD=1.10;SB=-6.99	GT:AD:DP:GL:GQ	0/1:107,25:41:-30.37,-12.37,-109.55:99
-chr1	91252	.	A	C	43.23	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=1;HaplotypeScore=36.75;MQ=16.93;MQ0=85;QD=0.29;SB=-10.00	GT:AD:DP:GL:GQ	0/1:138,10:43:-20.56,-12.95,-127.64:76.06
-chr1	91549	.	A	G	49.47	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=209;Dels=0.00;HRun=0;HaplotypeScore=15.98;MQ=27.81;MQ0=39;QD=0.24;SB=65.80	GT:AD:DP:GL:GQ	0/1:179,30:144:-51.61,-43.38,-519.29:82.31
-chr1	91758	.	G	A	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.60;MQ=22.49;MQ0=25;OQ=143.40;QD=2.17;SB=15.64	GT:AD:DP:GL:GQ	0/1:56,10:34:-27.86,-10.24,-97.22:99
-chr1	91835	.	T	C	60.94	PASS	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.01;MQ0=36;OQ=785.45;QD=10.47;SB=-10.00	GT:AD:DP:GL:GQ	0/1:43,32:33:-91.79,-9.96,-12.24:22.78
-chr1	91851	rs4109800	G	C	35.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.96;MQ0=33;OQ=1198.57;QD=15.98;SB=-10.00	GT:AD:DP:GL:GQ	0/1:41,34:33:-133.08,-9.94,-16.89:69.53
-chr1	91938	.	G	A	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=2.53;MQ=14.92;MQ0=47;OQ=298.50;QD=3.21;SB=-10.00	GT:AD:DP:GL:GQ	0/1:77,15:21:-39.46,-6.32,-39.15:99
-chr1	92459	rs3912701	G	A	1.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=1.98;MQ=17.65;MQ0=34;OQ=809.52;QD=14.99;SB=-10.00	GT:AD:DP:GL:GQ	1/1:30,24:20:-84.54,-6.02,-0.00:60.20
-chr1	92527	rs4618909	A	G	1.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=102;Dels=0.00;HRun=1;HaplotypeScore=7.26;MQ=22.11;MQ0=40;OQ=1083.35;QD=10.62;SB=-10.00	GT:AD:DP:GL:GQ	0/1:55,47:51:-126.98,-15.36,-75.91:99
-chr1	92632	rs3872168	C	A	251.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=17.40;MQ0=16;OQ=274.62;QD=10.98;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,25:9:-31.05,-2.71,-0.00:27.07
-chr1	92814	.	C	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=170;Dels=0.00;HRun=1;HaplotypeScore=9.83;MQ=30.05;MQ0=21;OQ=659.75;QD=3.88;SB=-292.33	GT:AD:DP:GL:GQ	0/1:135,35:144:-112.64,-43.38,-415.54:99
-chr1	93070	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=1;HaplotypeScore=8.90;MQ=17.00;MQ0=65;OQ=190.64;QD=1.91;SB=-10.00	GT:AD:DP:GL:GQ	0/1:83,17:34:-32.59,-10.25,-92.04:99
-chr1	93104	rs62642109	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=120;Dels=0.00;HRun=0;HaplotypeScore=24.91;MQ=20.20;MQ0=60;OQ=819.40;QD=6.83;SB=-0.98	GT:AD:DP:GL:GQ	0/1:72,48:57:-102.42,-17.19,-99.00:99
-chr1	93113	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=17.60;MQ=21.02;MQ0=51;OQ=474.12;QD=4.23;SB=5.03	GT:AD:DP:GL:GQ	0/1:79,33:56:-67.57,-16.87,-129.01:99
-chr1	93181	.	T	C	7.86	PASS	AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=15.97;MQ0=67;OQ=759.85;QD=7.17;SB=20.10	GT:AD:DP:GL:GQ	0/1:53,53:35:-89.81,-10.54,-44.53:99
-chr1	93248	rs62639110	G	A	30.22	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=8.07;MQ0=76;QD=0.36;SB=-10.00	GT:AD:DP:GL:GQ	0/1:62,22:6:-8.11,-1.81,-14.17:63.05
-chr1	93307	.	G	A	47.02	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=5.80;MQ0=48;QD=0.94;SB=-10.00	GT:AD:DP:GL:GQ	1/1:44,6:2:-8.11,-0.60,-0.00:6.02
-chr1	93757	.	T	C	30.28	LowQual	AC=2;AF=1.00;AN=2;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.68;MQ0=1;QD=10.09;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,2:2:-6.44,-0.60,-0.00:6.01
-chr1	93896	rs4287120	T	C	0.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=174;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=4.84;MQ0=151;OQ=128.63;QD=0.74;SB=-81.37	GT:AD:DP:GL:GQ	1/1:41,133:5:-16.43,-1.51,-0.00:15.04
-chr1	93971	rs4492556	A	G	12.01	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=2.58;MQ=7.18;MQ0=71;QD=0.15;SB=-31.93	GT:AD:DP:GL:GQ	0/1:47,34:7:-6.57,-2.11,-19.60:44.57
-chr1	94001	.	G	T	0.94	PASS	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=16.11;MQ0=45;OQ=194.11;QD=3.35;SB=-41.38	GT:AD:DP:GL:GQ	0/1:51,7:13:-26.61,-3.91,-21.51:99
-chr1	94049	rs4288537	T	C	0.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=10.96;MQ=20.93;MQ0=24;OQ=438.79;QD=10.45;SB=-71.88	GT:AD:DP:GL:GQ	0/1:18,24:17:-52.28,-5.12,-8.24:31.18
-chr1	94088	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=3.06;MQ=13.40;MQ0=57;OQ=79.42;QD=1.15;SB=-38.36	GT:AD:DP:GL:GQ	0/1:64,5:10:-14.24,-3.02,-19.96:99
-chr1	94312	.	C	A	18.04	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=10.70;MQ0=65;QD=0.24;SB=-10.00	GT:AD:DP:GL:GQ	0/1:72,2:9:-7.79,-2.71,-24.60:50.81
-chr1	98160	rs4109806	A	C	199.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=17.46;MQ0=21;OQ=505.68;QD=12.97;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,39:15:-54.16,-4.52,-0.00:45.14
-chr1	98173	.	T	C	2.30	PASS	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=16.05;MQ0=20;OQ=109.74;QD=3.05;SB=-45.95	GT:AD:DP:GL:GQ	0/1:14,22:12:-17.87,-3.61,-27.89:99
-chr1	98191	rs4109805	A	G	15.99	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=16.84;MQ0=14;QD=0.50;SB=5.05	GT:AD:DP:GL:GQ	0/1:28,4:15:-9.39,-4.52,-49.05:48.72
-chr1	98276	rs4457511	T	G	0.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=105;Dels=0.00;HRun=0;HaplotypeScore=9.15;MQ=5.64;MQ0=97;OQ=125.84;QD=1.20;SB=-67.98	GT:AD:DP:GL:GQ	0/1:81,24:6:-17.67,-1.81,-3.90:20.89
-chr1	99188	.	T	C	0.10	PASS	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=8.00;MQ0=82;OQ=57.15;QD=0.64;SB=-10.00	GT:AD:DP:GL:GQ	0/1:85,4:6:-10.81,-1.81,-11.97:89.99
-chr1	99237	.	G	A	48.25	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=4.41;MQ0=117;QD=0.40;SB=-10.00	GT:AD:DP:GL:GQ	1/1:114,6:2:-8.23,-0.60,-0.00:6.02
-chr1	99503	rs4126043	T	A	232.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=24.79;MQ0=3;OQ=79.29;QD=11.33;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,7:3:-11.42,-0.90,-0.00:9.03
-chr1	110568	rs4117992	T	C	36.28	LowQual	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.68;MQ0=1;QD=12.09;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,3:2:-7.04,-0.60,-0.00:6.02
-chr1	110846	.	C	T	29.97	PASS	AC=2;AF=1.00;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=21.24;MQ0=9;OQ=175.53;QD=12.54;SB=-93.11	GT:AD:DP:GL:GQ	1/1:6,8:5:-21.11,-1.51,-0.00:15.05
-chr1	110872	rs1851943	C	T	61.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=26.59;MQ0=3;OQ=127.11;QD=18.16;SB=-91.11	GT:AD:DP:GL:GQ	1/1:0,7:4:-16.25,-1.20,-0.00:12.04
-chr1	117436	.	G	A	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=9.09;MQ0=104;OQ=195.33;QD=1.58;SB=-97.57	GT:AD:DP:GL:GQ	0/1:100,24:19:-28.54,-5.73,-40.13:99
-chr1	119192	.	C	G	13.29	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=6.87;MQ0=19;QD=0.58;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,8:1:-4.59,-0.30,-0.00:1.76
-chr1	125911	rs11531330	C	T	87.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=18.40;MQ0=3;OQ=89.79;QD=11.22;SB=-10.00	GT:AD:DP:GL:GQ	1/1:4,3:3:-12.47,-0.90,-0.00:9.03
-chr1	217782	.	A	T	46.88	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=14.40;MQ0=4;QD=5.86;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,8:2:-8.10,-0.60,-0.00:6.02
-chr1	219536	rs6678242	A	C	214.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=14.88;MQ0=9;OQ=112.38;QD=6.61;SB=-45.01	GT:AD:DP:GL:GQ	1/1:0,17:4:-14.77,-1.20,-0.00:12.04
-chr1	219731	.	C	T	12.21	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.96;MQ0=44;QD=0.17;SB=38.14	GT:AD:DP:GL:GQ	0/1:62,9:27:-12.61,-8.14,-82.06:44.77
-chr1	219921	rs12239119	T	G	63.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=23.26;MQ0=4;OQ=606.74;QD=25.28;SB=-312.56	GT:AD:DP:GL:GQ	1/1:0,24:18:-64.26,-5.42,-0.01:54.16
-chr1	221068	rs10047119	T	A	39.88	DPFilter;HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=254;Dels=0.00;HRun=1;HaplotypeScore=6.12;MQ=8.79;MQ0=135;QD=0.16;SB=-10.00	GT:AD:DP:GL:GQ	1/1:167,87:2:-7.40,-0.60,-0.00:6.02
-chr1	221077	rs10047174	C	A	38.69	DPFilter;HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=271;Dels=0.00;HRun=0;HaplotypeScore=6.64;MQ=8.55;MQ0=150;QD=0.14;SB=-10.00	GT:AD:DP:GL:GQ	1/1:181,90:2:-7.28,-0.60,-0.00:6.02
-chr1	221092	rs10047175	C	A	39.69	DPFilter;HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=283;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=7.57;MQ0=174;QD=0.14;SB=-10.00	GT:AD:DP:GL:GQ	1/1:201,82:2:-7.38,-0.60,-0.00:6.02
-chr1	221109	rs10047121	T	C	34.28	DPFilter;HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=275;Dels=0.00;HRun=0;HaplotypeScore=3.23;MQ=7.06;MQ0=184;QD=0.12;SB=-10.00	GT:AD:DP:GL:GQ	1/1:197,78:2:-6.84,-0.60,-0.00:6.02
-chr1	221318	.	T	A	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=241;Dels=0.00;HRun=0;HaplotypeScore=2.80;MQ=19.94;MQ0=85;OQ=462.52;QD=1.92;SB=39.55	GT:AD:DP:GL:GQ	0/1:212,29:108:-82.07,-32.53,-323.83:99
-chr1	221343	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=261;Dels=0.00;HRun=0;HaplotypeScore=2.12;MQ=22.79;MQ0=47;OQ=408.64;QD=1.57;SB=-215.29	GT:AD:DP:GL:GQ	0/1:222,38:157:-91.46,-47.31,-595.18:99
-chr1	221367	rs10047230	G	A	0.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=278;Dels=0.00;HRun=0;HaplotypeScore=11.19;MQ=25.20;MQ0=11;OQ=1571.46;QD=5.65;SB=-527.77	GT:AD:DP:GL:GQ	0/1:197,80:212:-224.34,-63.91,-509.11:99
-chr1	221389	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=260;Dels=0.00;HRun=1;HaplotypeScore=1.74;MQ=24.37;MQ0=22;OQ=840.34;QD=3.23;SB=-412.02	GT:AD:DP:GL:GQ	0/1:209,50:201:-147.86,-60.54,-597.88:99
-chr1	221420	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=210;Dels=0.00;HRun=1;HaplotypeScore=4.60;MQ=20.04;MQ0=77;OQ=83.18;QD=0.40;SB=26.98	GT:AD:DP:GL:GQ	0/1:192,14:117:-46.84,-35.24,-385.27:99
-chr1	222364	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=186;Dels=0.03;HRun=0;HaplotypeScore=32.96;MQ=22.76;MQ0=12;OQ=2072.95;QD=11.14;SB=59.21	GT:AD:DP:GL:GQ	0/1:70,111:137:-251.84,-41.26,-268.25:99
-chr1	222793	.	C	G	25.72	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=260;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=16.62;MQ0=87;QD=0.10;SB=81.54	GT:AD:DP:GL:GQ	0/1:230,30:110:-38.99,-33.14,-447.79:58.55
-chr1	223336	.	C	G	28.20	PASS	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=35.25;MQ0=2;OQ=1925.92;QD=21.40;SB=-854.31	GT:AD:DP:GL:GQ	0/1:39,51:87:-222.09,-26.21,-160.96:99
-chr1	224095	rs8179512	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=229;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=15.51;MQ0=125;OQ=91.58;QD=0.40;SB=-45.96	GT:AD:DP:GL:GQ	0/1:203,26:89:-39.28,-26.84,-255.40:99
-chr1	224171	rs7195389	A	G	40.71	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=269;Dels=0.00;HRun=0;HaplotypeScore=47.18;MQ=22.11;MQ0=18;QD=0.15;SB=122.50	GT:AD:DP:GL:GQ	0/1:232,36:234:-77.87,-70.51,-842.48:73.55
-chr1	224176	rs56055731	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=276;Dels=0.00;HRun=1;HaplotypeScore=39.67;MQ=21.41;MQ0=32;OQ=545.76;QD=1.98;SB=-248.71	GT:AD:DP:GL:GQ	0/1:242,34:226:-125.93,-68.07,-709.89:99
-chr1	224241	rs62053733	A	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DB;DP=216;Dels=0.00;HRun=0;HaplotypeScore=20.29;MQ=17.49;MQ0=74;OQ=1752.30;QD=8.11;SB=-714.08	GT:AD:DP:GL:GQ	0/1:103,113:104:-209.87,-31.36,-152.51:99
-chr1	224344	rs8179403	T	A	166.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=163;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=23.92;MQ0=45;OQ=2824.26;QD=17.33;SB=-725.16	GT:AD:DP:GL:GQ	0/1:38,125:108:-318.26,-32.55,-66.31:99
-chr1	224419	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=1;HaplotypeScore=18.87;MQ=14.35;MQ0=100;OQ=127.03;QD=0.68;SB=8.05	GT:AD:DP:GL:GQ	0/1:161,26:49:-30.75,-14.76,-153.48:99
-chr1	224472	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=261;Dels=0.00;HRun=1;HaplotypeScore=6.53;MQ=15.44;MQ0=125;OQ=992.61;QD=3.80;SB=-39.67	GT:AD:DP:GL:GQ	0/1:177,84:84:-127.86,-25.32,-192.69:99
-chr1	224623	rs7548182	A	T	1.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=107;Dels=0.00;HRun=3;HaplotypeScore=1.37;MQ=26.54;MQ0=23;OQ=863.08;QD=8.07;SB=50.19	GT:AD:DP:GL:GQ	0/1:39,68:64:-108.87,-19.28,-138.61:99
-chr1	225707	rs6603780	C	G	0.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=278;Dels=0.00;HRun=0;HaplotypeScore=6.28;MQ=15.73;MQ0=150;OQ=1742.87;QD=6.27;SB=-566.38	GT:AD:DP:GL:GQ	0/1:147,131:57:-194.74,-17.17,-58.86:99
-chr1	225839	rs6422503	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=215;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=34.58;MQ0=26;OQ=4599.62;QD=21.39;SB=-1688.57	GT:AD:DP:GL:GQ	0/1:70,145:162:-458.96,-48.79,-124.49:99
-chr1	226216	.	T	C	24.03	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=0;HaplotypeScore=3.20;MQ=9.23;MQ0=93;QD=0.13;SB=-10.00	GT:AD:DP:GL:GQ	0/1:162,19:7:-7.79,-2.11,-21.54:56.85
-chr1	227048	.	C	A	43.64	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=2.13;MQ=9.30;MQ0=121;QD=0.28;SB=-44.79	GT:AD:DP:GL:GQ	0/1:134,21:22:-14.27,-6.63,-62.25:76.48
-chr1	227333	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=5.51;MQ=14.65;MQ0=59;OQ=58.63;QD=0.42;SB=-10.00	GT:AD:DP:GL:GQ	0/1:125,16:25:-16.68,-7.54,-70.62:91.47
-chr1	227353	.	C	A	20.49	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=140;Dels=0.00;HRun=1;HaplotypeScore=4.94;MQ=14.92;MQ0=62;QD=0.15;SB=-10.00	GT:AD:DP:GL:GQ	0/1:122,18:29:-14.07,-8.74,-90.83:53.29
-chr1	227461	rs28618397	A	G	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=144;Dels=0.00;HRun=0;HaplotypeScore=6.94;MQ=8.17;MQ0=115;OQ=63.90;QD=0.44;SB=-10.00	GT:AD:DP:GL:GQ	0/1:131,13:8:-12.09,-2.41,-14.97:96.73
-chr1	227626	.	G	A	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=182;Dels=0.00;HRun=0;HaplotypeScore=4.92;MQ=20.49;MQ0=18;OQ=315.55;QD=1.73;SB=-168.42	GT:AD:DP:GL:GQ	0/1:163,19:138:-76.40,-41.57,-437.40:99
-chr1	227735	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=14.30;MQ=17.08;MQ0=35;OQ=66.90;QD=0.75;SB=20.77	GT:AD:DP:GL:GQ	0/1:78,11:41:-22.33,-12.35,-159.24:99
-chr1	230298	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=1;HaplotypeScore=4.58;MQ=24.72;MQ0=17;OQ=319.24;QD=2.47;SB=-97.27	GT:AD:DP:GL:GQ	0/1:109,19:104:-66.59,-31.38,-356.71:99
-chr1	230890	.	G	A	0.28	PASS	AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=4.05;MQ=28.42;MQ0=10;OQ=452.11;QD=3.77;SB=-186.08	GT:AD:DP:GL:GQ	0/1:99,21:95:-77.11,-28.62,-272.62:99
-chr1	231027	rs1917217	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=16;HaplotypeScore=20.40;MQ=32.62;MQ0=10;OQ=363.52;QD=5.05;SB=32.11	GT:AD:DP:GL:GQ	0/1:47,24:50:-54.70,-15.07,-118.26:99
-chr1	231044	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=16;HaplotypeScore=28.71;MQ=27.06;MQ0=9;OQ=128.09;QD=1.69;SB=39.29	GT:AD:DP:GL:GQ	0/1:63,12:57:-36.63,-20.54,-166.03:99
-chr1	231045	.	A	T	16.10	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=26.04;MQ=26.31;MQ0=9;QD=0.22;SB=44.16	GT:AD:DP:GL:GQ	0/1:63,8:54:-21.15,-16.27,-182.36:48.82
-chr1	231183	.	A	G	0.09	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=8.45;MQ=28.02;MQ0=10;OQ=325.16;QD=6.25;SB=-110.63	GT:AD:DP:GL:GQ	0/1:19,32:27:-43.95,-8.15,-48.50:99
-chr1	231232	rs11490246	C	T	142.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=27.55;MQ0=9;OQ=1010.69;QD=16.84;SB=-258.84	GT:AD:DP:GL:GQ	1/1:0,59:26:-104.66,-7.83,-0.01:78.25
-chr1	234887	.	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=210;Dels=0.00;HRun=0;HaplotypeScore=14.30;MQ=23.11;MQ0=12;OQ=591.52;QD=2.82;SB=-248.32	GT:AD:DP:GL:GQ	0/1:173,36:184:-117.86,-55.42,-542.00:99
-chr1	235002	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=3;HaplotypeScore=1.45;MQ=7.75;MQ0=92;OQ=65.10;QD=0.63;SB=-6.99	GT:AD:DP:GL:GQ	0/1:88,15:7:-11.90,-2.11,-15.26:97.93
-chr1	235268	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=1;HaplotypeScore=31.21;MQ=26.04;MQ0=17;OQ=96.26;QD=2.53;SB=-57.31	GT:AD:DP:GL:GQ	0/1:24,12:15:-17.43,-4.52,-39.23:99
-chr1	235318	.	C	G	0.88	PASS	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=31.66;MQ0=1;OQ=172.25;QD=9.57;SB=-27.84	GT:AD:DP:GL:GQ	0/1:12,6:17:-25.63,-5.12,-44.90:99
-chr1	237291	rs62639107	G	T	22.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=126;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=12.32;MQ0=83;OQ=830.85;QD=6.59;SB=-342.75	GT:AD:DP:GL:GQ	0/1:51,75:34:-96.61,-10.24,-28.48:99
-chr1	237573	.	T	C	21.25	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=174;Dels=0.00;HRun=0;HaplotypeScore=8.41;MQ=14.44;MQ0=98;QD=0.12;SB=17.09	GT:AD:DP:GL:GQ	0/1:155,19:37:-16.55,-11.15,-125.38:54.05
-chr1	238151	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=9.86;MQ0=83;OQ=59.88;QD=0.63;SB=-10.00	GT:AD:DP:GL:GQ	0/1:91,4:10:-12.29,-3.01,-24.61:92.72
-chr1	238167	rs4109800	G	C	1.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=9.69;MQ0=81;OQ=122.76;QD=1.31;SB=-10.00	GT:AD:DP:GL:GQ	0/1:83,11:9:-18.27,-2.71,-21.24:99
-chr1	238254	.	G	A	14.34	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=10.94;MQ0=73;QD=0.13;SB=-10.00	GT:AD:DP:GL:GQ	0/1:101,9:10:-7.71,-3.01,-28.55:47.01
-chr1	242992	rs4109808	G	C	0.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=205;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=17.96;MQ0=77;OQ=316.33;QD=1.54;SB=11.07	GT:AD:DP:GL:GQ	0/1:143,62:81:-59.32,-24.40,-284.11:99
-chr1	244543	rs62639119	A	G	39.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=1.69;MQ=13.13;MQ0=71;OQ=645.60;QD=5.98;SB=-100.72	GT:AD:DP:GL:GQ	0/1:56,52:34:-78.09,-10.25,-42.39:99
-chr1	244959	rs4096710	C	T	45.82	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=3.93;MQ=13.07;MQ0=59;QD=0.54;SB=-26.62	GT:AD:DP:GL:GQ	0/1:74,11:15:-12.39,-4.52,-39.32:78.66
-chr1	245030	rs4247528	T	G	34.76	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=14.80;MQ0=42;QD=0.49;SB=8.04	GT:AD:DP:GL:GQ	0/1:62,9:14:-10.98,-4.22,-38.66:67.59
-chr1	245496	.	A	G	44.84	LowQual	AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.49;MQ0=2;QD=7.47;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,5:2:-7.89,-0.60,-0.00:6.02
-chr1	314685	.	A	T	13.26	PASS	AC=2;AF=1.00;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=1.75;MQ=14.76;MQ0=13;OQ=314.43;QD=11.65;SB=-42.39	GT:AD:DP:GL:GQ	1/1:12,15:9:-35.03,-2.71,-0.00:27.09
-chr1	314938	.	G	C	1.97	PASS	AC=2;AF=1.00;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=12.45;MQ0=16;OQ=80.86;QD=3.23;SB=-10.00	GT:AD:DP:GL:GQ	1/1:16,9:3:-11.58,-0.91,-0.00:9.03
-chr1	314990	.	T	C	42.83	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=12.15;MQ0=12;QD=2.14;SB=-10.00	GT:AD:DP:GL:GQ	1/1:10,10:2:-7.69,-0.60,-0.00:6.02
-chr1	354114	rs3905534	G	T	4.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=2;HaplotypeScore=1.96;MQ=17.14;MQ0=8;OQ=149.39;QD=8.30;SB=-10.00	GT:AD:DP:GL:GQ	0/1:10,8:10:-21.23,-3.01,-14.53:99
-chr1	374336	rs4959767	C	G	48.85	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=9.01;MQ=5.04;MQ0=75;QD=0.57;SB=-10.00	GT:AD:DP:GL:GQ	1/1:78,7:2:-8.29,-0.60,-0.00:6.02
-chr1	374388	rs4120938	C	T	0.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=7.85;MQ=3.88;MQ0=74;OQ=50.25;QD=0.61;SB=-10.00	GT:AD:DP:GL:GQ	1/1:76,7:2:-8.43,-0.60,-0.00:6.02
-chr1	374916	.	A	C	6.13	PASS	AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.92;MQ0=3;OQ=209.71;QD=17.48;SB=-40.56	GT:AD:DP:GL:GQ	1/1:2,10:8:-24.56,-2.41,-0.01:24.03
-chr1	391491	.	T	G	33.28	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=1;HaplotypeScore=4.00;MQ=5.85;MQ0=67;QD=0.45;SB=-10.00	GT:AD:DP:GL:GQ	0/1:70,4:3:-7.51,-0.90,-3.44:25.36
-chr1	394166	.	C	T	0.46	PASS	AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=7.89;MQ0=95;OQ=178.49;QD=1.75;SB=-10.00	GT:AD:DP:GL:GQ	0/1:96,6:7:-23.23,-2.11,-3.57:14.61
-chr1	394272	.	T	G	16.31	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=17.93;MQ0=35;OQ=484.03;QD=7.81;SB=-10.00	GT:AD:DP:GL:GQ	0/1:39,23:22:-58.31,-6.63,-19.38:99
-chr1	394291	rs12121306	C	T	153.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=16.59;MQ0=30;OQ=364.11;QD=7.75;SB=-10.00	GT:AD:DP:GL:GQ	0/1:31,16:14:-43.91,-4.22,-11.01:67.92
-chr1	394310	.	C	T	0.18	PASS	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=12.47;MQ0=36;OQ=147.86;QD=3.21;SB=-10.00	GT:AD:DP:GL:GQ	0/1:41,5:8:-20.48,-2.41,-10.61:81.97
-chr1	394537	.	G	A	2.58	PASS	AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=6.78;MQ=23.70;MQ0=52;OQ=1238.38;QD=11.79;SB=-421.21	GT:AD:DP:GL:GQ	0/1:65,40:50:-142.19,-15.07,-44.99:99
-chr1	394765	.	A	G	0.18	PASS	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=7.43;MQ0=57;OQ=65.19;QD=1.07;SB=-10.00	GT:AD:DP:GL:GQ	0/1:58,3:4:-11.01,-1.20,-3.46:22.51
-chr1	394834	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=7.99;MQ=12.79;MQ0=47;OQ=202.79;QD=3.56;SB=-10.00	GT:AD:DP:GL:GQ	0/1:49,8:10:-26.57,-3.01,-12.50:94.91
-chr1	394837	.	A	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=7.99;MQ=12.80;MQ0=51;OQ=216.52;QD=3.49;SB=-10.00	GT:AD:DP:GL:GQ	0/1:48,14:11:-28.25,-3.31,-11.97:86.56
-chr1	404035	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=20.45;MQ=17.63;MQ0=51;OQ=155.60;QD=2.22;SB=-84.79	GT:AD:DP:GL:GQ	0/1:62,8:17:-23.97,-5.12,-38.73:99
-chr1	511466	rs3902909	G	A	114.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.37;MQ0=1;OQ=299.83;QD=6.00;SB=-10.00	GT:AD:DP:GL:GQ	0/1:35,15:40:-45.34,-12.07,-85.80:99
-chr1	513688	rs61767343	C	T	0.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=5.41;MQ=21.22;MQ0=15;OQ=264.79;QD=2.88;SB=32.01	GT:AD:DP:GL:GQ	0/1:78,14:66:-49.68,-19.91,-161.21:99
-chr1	522943	.	G	A	31.72	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=14;HaplotypeScore=31.16;MQ=21.11;MQ0=30;QD=0.33;SB=74.23	GT:AD:DP:GL:GQ	0/1:84,11:55:-23.03,-16.58,-166.54:64.56
-chr1	523155	.	C	T	20.46	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=7.86;MQ=11.23;MQ0=37;QD=0.34;SB=-10.00	GT:AD:DP:GL:GQ	0/1:56,5:10:-8.34,-3.02,-25.17:53.26
-chr1	523163	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=7.11;MQ=11.49;MQ0=30;OQ=99.30;QD=1.99;SB=-10.00	GT:AD:DP:GL:GQ	0/1:37,13:9:-15.92,-2.71,-17.34:99
-chr1	523812	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=9.50;MQ=11.52;MQ0=31;OQ=145.45;QD=2.05;SB=-10.00	GT:AD:DP:GL:GQ	0/1:61,10:10:-20.85,-3.02,-13.58:99
-chr1	523821	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=9.21;MQ=15.64;MQ0=25;OQ=121.38;QD=1.84;SB=-10.00	GT:AD:DP:GL:GQ	0/1:57,9:12:-19.04,-3.62,-21.78:99
-chr1	523868	.	G	A	13.34	PASS	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.79;MQ0=4;OQ=177.69;QD=5.08;SB=-10.00	GT:AD:DP:GL:GQ	0/1:21,14:15:-25.58,-4.53,-24.67:99
-chr1	524029	.	T	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=26.24;MQ0=29;OQ=72.18;QD=0.99;SB=-17.85	GT:AD:DP:GL:GQ	0/1:58,15:34:-20.75,-10.24,-100.17:99
-chr1	524055	rs6680723	C	T	0.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=2;HaplotypeScore=11.94;MQ=30.97;MQ0=23;OQ=525.09;QD=5.30;SB=-269.67	GT:AD:DP:GL:GQ	0/1:68,31:65:-75.37,-19.58,-166.45:99
-chr1	524061	rs6680725	C	T	44.53	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=105;Dels=0.00;HRun=0;HaplotypeScore=14.45;MQ=31.89;MQ0=22;QD=0.42;SB=98.20	GT:AD:DP:GL:GQ	0/1:92,13:70:-28.85,-21.11,-204.21:77.37
-chr1	524105	rs2792879	C	T	49.58	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=35.66;MQ0=5;QD=0.40;SB=82.58	GT:AD:DP:GL:GQ	0/1:106,18:95:-36.89,-28.65,-274.71:82.42
-chr1	524187	.	G	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=48;Dels=0.02;HRun=0;HaplotypeScore=13.69;MQ=38.72;MQ0=2;OQ=392.49;QD=8.18;SB=-133.62	GT:AD:DP:GL:GQ	0/1:25,22:25:-49.77,-7.23,-31.06:99
-chr1	524410	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=27.66;MQ=40.25;MQ0=9;OQ=582.52;QD=5.34;SB=-205.05	GT:AD:DP:GL:GQ	0/1:82,27:83:-86.53,-25.00,-225.34:99
-chr1	524592	rs61767348	C	T	0.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=125;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=35.17;MQ0=0;OQ=230.33;QD=1.84;SB=-71.36	GT:AD:DP:GL:GQ	0/1:109,16:125:-63.96,-37.65,-391.79:99
-chr1	524704	.	C	G	0.30	PASS	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=15.62;MQ0=42;OQ=247.71;QD=3.26;SB=-10.00	GT:AD:DP:GL:GQ	0/1:63,13:16:-32.88,-4.82,-37.64:99
-chr1	525671	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=125;Dels=0.00;HRun=0;HaplotypeScore=16.72;MQ=18.80;MQ0=44;OQ=189.70;QD=1.52;SB=-93.64	GT:AD:DP:GL:GQ	0/1:113,12:40:-34.30,-12.05,-118.97:99
-chr1	525779	.	A	G	0.63	PASS	AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=22.14;MQ0=11;OQ=348.30;QD=4.15;SB=-47.83	GT:AD:DP:GL:GQ	0/1:66,18:49:-52.88,-14.76,-137.92:99
-chr1	525958	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=25.63;MQ=21.45;MQ0=28;OQ=60.59;QD=0.61;SB=-44.97	GT:AD:DP:GL:GQ	0/1:86,13:50:-24.43,-15.08,-139.15:93.42
-chr1	526007	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=23.90;MQ=27.74;MQ0=20;OQ=72.77;QD=0.52;SB=-61.14	GT:AD:DP:GL:GQ	0/1:119,22:81:-34.97,-24.41,-279.63:99
-chr1	526679	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=6.10;MQ=15.23;MQ0=50;OQ=159.06;QD=1.64;SB=-10.00	GT:AD:DP:GL:GQ	0/1:72,25:19:-24.93,-5.74,-37.85:99
-chr1	526910	.	C	T	33.12	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=0;HaplotypeScore=15.09;MQ=12.21;MQ0=78;QD=0.31;SB=8.05	GT:AD:DP:GL:GQ	0/1:95,11:28:-15.03,-8.43,-86.21:65.95
-chr1	527066	rs1109924	C	T	18.08	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.21;MQ=24.80;MQ0=20;QD=0.22;SB=56.20	GT:AD:DP:GL:GQ	0/1:74,8:55:-21.66,-16.57,-168.07:50.84
-chr1	527350	rs1105044	C	T	0.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=5.45;MQ=30.46;MQ0=9;OQ=109.38;QD=3.91;SB=5.03	GT:AD:DP:GL:GQ	0/1:19,9:14:-18.45,-4.22,-27.73:99
-chr1	527399	.	C	G	0.15	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.45;MQ=22.48;MQ0=26;OQ=195.21;QD=3.42;SB=2.03	GT:AD:DP:GL:GQ	0/1:49,8:23:-29.74,-6.93,-66.80:99
-chr1	527400	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=1;HaplotypeScore=5.09;MQ=22.50;MQ0=26;OQ=149.94;QD=2.50;SB=3.82	GT:AD:DP:GL:GQ	0/1:51,8:23:-28.15,-9.87,-58.83:99
-chr1	527445	.	C	G	0.06	PASS	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=15.27;MQ0=33;OQ=120.74;QD=2.05;SB=-43.89	GT:AD:DP:GL:GQ	0/1:47,12:21:-21.68,-6.33,-71.74:99
-chr1	530476	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=150;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=20.30;MQ0=34;OQ=101.99;QD=0.68;SB=16.46	GT:AD:DP:GL:GQ	0/1:135,15:110:-46.63,-33.14,-338.24:99
-chr1	534258	rs61769278	G	A	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=121;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=9.91;MQ0=64;OQ=75.11;QD=0.62;SB=-10.00	GT:AD:DP:GL:GQ	0/1:81,40:6:-12.60,-1.81,-10.89:90.82
-chr1	534650	rs61769279	G	C	10.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=22.82;MQ0=11;OQ=171.47;QD=4.76;SB=-10.00	GT:AD:DP:GL:GQ	0/1:26,10:21:-26.76,-6.33,-62.71:99
-chr1	536560	rs12025928	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=3;HaplotypeScore=20.90;MQ=24.04;MQ0=6;OQ=206.19;QD=3.49;SB=8.06	GT:AD:DP:GL:GQ	0/1:26,33:37:-35.06,-11.16,-99.03:99
-chr1	536665	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=53.76;MQ=25.56;MQ0=32;OQ=200.39;QD=1.71;SB=-106.47	GT:AD:DP:GL:GQ	0/1:92,25:66:-43.22,-19.90,-241.56:99
-chr1	536668	rs61769283	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=116;Dels=0.00;HRun=0;HaplotypeScore=52.49;MQ=25.44;MQ0=31;OQ=176.14;QD=1.52;SB=-101.57	GT:AD:DP:GL:GQ	0/1:89,25:62:-39.59,-18.70,-187.95:99
-chr1	536745	rs9438485	T	C	0.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=10.16;MQ=22.38;MQ0=21;OQ=208.92;QD=2.37;SB=-117.20	GT:AD:DP:GL:GQ	0/1:59,28:39:-35.93,-11.75,-108.78:99
-chr1	536815	rs9438487	T	C	0.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=128;Dels=0.00;HRun=0;HaplotypeScore=5.65;MQ=26.07;MQ0=22;OQ=487.78;QD=3.81;SB=-195.14	GT:AD:DP:GL:GQ	0/1:76,52:82:-76.77,-24.71,-234.35:99
-chr1	536828	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=2.07;MQ=25.55;MQ0=22;OQ=75.76;QD=0.57;SB=28.89	GT:AD:DP:GL:GQ	0/1:122,12:82:-35.59,-24.73,-235.80:99
-chr1	537100	.	G	A	12.85	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=13.16;MQ0=46;QD=0.12;SB=-7.00	GT:AD:DP:GL:GQ	0/1:81,22:25:-12.08,-7.53,-73.93:45.46
-chr1	537113	.	C	T	31	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=12.14;MQ0=51;QD=0.29;SB=-6.99	GT:AD:DP:GL:GQ	0/1:84,22:18:-11.81,-5.42,-56.12:63.83
-chr1	537596	.	G	A	46.75	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=170;Dels=0.00;HRun=0;HaplotypeScore=23.62;MQ=12.88;MQ0=95;QD=0.28;SB=83.26	GT:AD:DP:GL:GQ	0/1:155,15:50:-23.03,-15.07,-148.87:79.59
-chr1	537643	rs9438495	T	C	0.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=12.92;MQ0=56;OQ=64.59;QD=0.65;SB=29.12	GT:AD:DP:GL:GQ	0/1:83,15:29:-18.49,-8.74,-88.70:97.43
-chr1	540378	.	T	C	1.66	PASS	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=10.44;MQ0=61;OQ=250.82;QD=2.82;SB=-10.00	GT:AD:DP:GL:GQ	0/1:69,20:17:-33.49,-5.12,-26.69:99
-chr1	543605	.	G	A	0.71	PASS	AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=19.26;MQ0=44;OQ=534.14;QD=4.38;SB=-165.55	GT:AD:DP:GL:GQ	0/1:95,27:72:-78.41,-21.71,-168.45:99
-chr1	544671	rs4120954	G	A	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=1;HaplotypeScore=17.61;MQ=20.21;MQ0=40;OQ=184.77;QD=1.55;SB=-112.49	GT:AD:DP:GL:GQ	0/1:103,16:61:-40.15,-18.39,-172.29:99
-chr1	549231	.	A	G	0.07	PASS	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=3.12;MQ=20.37;MQ0=37;OQ=179.14;QD=2.21;SB=30.55	GT:AD:DP:GL:GQ	0/1:67,14:40:-33.25,-12.05,-121.81:99
-chr1	549235	.	C	G	0.42	PASS	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=3.80;MQ=21.34;MQ0=35;OQ=329.96;QD=4.12;SB=-9.65	GT:AD:DP:GL:GQ	0/1:65,15:43:-49.24,-12.96,-142.49:99
-chr1	549756	.	G	A	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=4.27;MQ=22.29;MQ0=22;OQ=255.07;QD=4.40;SB=-111.11	GT:AD:DP:GL:GQ	0/1:45,13:33:-38.73,-9.94,-83.62:99
-chr1	551019	.	T	G	0.10	PASS	AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=0;HaplotypeScore=3.16;MQ=26.98;MQ0=20;OQ=197.80;QD=2.50;SB=4.26	GT:AD:DP:GL:GQ	0/1:67,12:53:-39.03,-15.96,-159.29:99
-chr1	551526	rs3908981	C	A	0.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=9.51;MQ0=72;OQ=83.63;QD=0.93;SB=-10.00	GT:AD:DP:GL:GQ	0/1:72,18:8:-14.06,-2.41,-15.23:99
-chr1	552065	.	T	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=19.90;MQ0=42;OQ=77.24;QD=1.04;SB=-15.93	GT:AD:DP:GL:GQ	0/1:68,6:22:-17.64,-6.63,-61.21:99
-chr1	553226	.	C	T	0.19	PASS	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=3;HaplotypeScore=1.62;MQ=24.97;MQ0=44;OQ=605.74;QD=6.51;SB=-203.18	GT:AD:DP:GL:GQ	0/1:67,26:42:-76.51,-12.65,-84.24:99
-chr1	553488	.	T	C	0.79	PASS	AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=309.81;QD=34.42;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,9:9:-34.57,-2.71,-0.00:27.09
-chr1	555282	rs55668158	C	G	1.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=111;Dels=0.00;HRun=0;HaplotypeScore=7.94;MQ=40.12;MQ0=17;OQ=1152.38;QD=10.38;SB=-595.15	GT:AD:DP:GL:GQ	0/1:77,33:92:-146.24,-27.72,-249.40:99
-chr1	555454	rs7416152	C	T	0.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=134;Dels=0.00;HRun=0;HaplotypeScore=6.80;MQ=46.34;MQ0=10;OQ=133.21;QD=0.99;SB=31.52	GT:AD:DP:GL:GQ	0/1:100,33:107:-48.84,-32.23,-339.95:99
-chr1	555839	rs9283151	C	T	3.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=45.60;MQ0=9;OQ=549.78;QD=4.07;SB=-291.62	GT:AD:DP:GL:GQ	0/1:100,35:123:-95.32,-37.06,-353.94:99
-chr1	555911	rs6421780	G	A	0.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=128;Dels=0.00;HRun=0;HaplotypeScore=11.39;MQ=39.59;MQ0=14;OQ=584.19;QD=4.56;SB=-299.10	GT:AD:DP:GL:GQ	0/1:90,32:104:-93.03,-31.32,-293.74:99
-chr1	557751	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=2961;Dels=0.00;HRun=2;HaplotypeScore=55.38;MQ=12.90;MQ0=2051;OQ=15633.32;QD=5.28;SB=59.42	GT:AD:DP:GL:GQ	0/1:109,2851:490:-1562.33,-147.66,-305.00:99
-chr1	558077	.	C	T	9.05	PASS	AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=0;HaplotypeScore=3.52;MQ=45.73;MQ0=8;OQ=1080.95;QD=8.72;SB=-436.58	GT:AD:DP:GL:GQ	0/1:87,37:109:-144.24,-32.87,-230.68:99
-chr1	559290	rs55665739	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=606;Dels=0.00;HRun=3;HaplotypeScore=17.31;MQ=15.96;MQ0=469;OQ=1033.33;QD=1.71;SB=-487.92	GT:AD:DP:GL:GQ	0/1:561,45:103:-137.67,-31.06,-222.34:99
-chr1	559575	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=286;Dels=0.00;HRun=0;HaplotypeScore=67.59;MQ=29.40;MQ0=143;OQ=1081.89;QD=3.78;SB=-504.88	GT:AD:DP:GL:GQ	0/1:248,38:131:-150.96,-39.49,-301.87:99
-chr1	560501	rs3912527	T	C	0.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=105;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=42.53;MQ0=1;OQ=256.32;QD=2.44;SB=101.36	GT:AD:DP:GL:GQ	0/1:81,24:98:-58.45,-29.53,-320.39:99
-chr1	561486	rs4951848	T	G	0.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=125;Dels=0.00;HRun=3;HaplotypeScore=1.10;MQ=14.41;MQ0=91;OQ=408.98;QD=3.27;SB=-10.00	GT:AD:DP:GL:GQ	0/1:75,49:28:-52.62,-8.43,-47.04:99
-chr1	561492	rs4951847	T	C	0.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=117;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=12.50;MQ0=93;OQ=266.80;QD=2.28;SB=-10.00	GT:AD:DP:GL:GQ	0/1:73,44:19:-35.69,-5.72,-37.10:99
-chr1	561756	rs4092521	C	A	0.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=234;Dels=0.00;HRun=0;HaplotypeScore=3.92;MQ=28.08;MQ0=93;OQ=133.54;QD=0.57;SB=-15.37	GT:AD:DP:GL:GQ	0/1:211,23:136:-57.61,-40.97,-421.13:99
-chr1	574427	rs4317776	G	T	26.75	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=197;Dels=0.00;HRun=9;HaplotypeScore=3.53;MQ=6.95;MQ0=179;QD=0.14;SB=-30.89	GT:AD:DP:GL:GQ	0/1:180,17:17:-11.08,-5.12,-48.02:59.57
-chr1	575363	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=0;HaplotypeScore=13.77;MQ=11.89;MQ0=66;OQ=93.79;QD=0.87;SB=-10.00	GT:AD:DP:GL:GQ	0/1:97,11:18:-18.09,-5.43,-51.57:99
-chr1	575571	.	A	G	44.95	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=5.95;MQ=12.50;MQ0=35;QD=0.49;SB=-7.00	GT:AD:DP:GL:GQ	0/1:88,3:9:-10.49,-2.71,-23.69:77.78
-chr1	575656	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=0;HaplotypeScore=17.86;MQ=21.34;MQ0=33;OQ=102.29;QD=0.86;SB=-15.11	GT:AD:DP:GL:GQ	0/1:101,18:60:-31.59,-18.08,-183.63:99
-chr1	577203	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=2;HaplotypeScore=18.06;MQ=18.60;MQ0=50;OQ=68.56;QD=0.90;SB=-15.46	GT:AD:DP:GL:GQ	0/1:71,5:16:-14.96,-4.82,-42.28:99
-chr1	578945	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=108;Dels=0.01;HRun=3;HaplotypeScore=26.60;MQ=35.12;MQ0=11;OQ=422.46;QD=3.91;SB=-212.09	GT:AD:DP:GL:GQ	0/1:86,21:88:-72.04,-26.51,-252.61:99
-chr1	581862	rs428603	C	T	12.84	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=117;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=16.17;MQ0=62;QD=0.11;SB=5.04	GT:AD:DP:GL:GQ	0/1:112,5:25:-12.07,-7.53,-76.64:45.44
-chr1	582131	rs2808300	G	T	0.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=133;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=20.19;MQ0=60;OQ=103.03;QD=0.77;SB=74.25	GT:AD:DP:GL:GQ	0/1:113,20:71:-34.97,-21.38,-223.52:99
-chr1	590341	.	G	A	2.32	PASS	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=4.02;MQ=31.66;MQ0=1;OQ=697.92;QD=5.91;SB=-148.83	GT:AD:DP:GL:GQ	0/1:88,30:101:-103.52,-30.45,-248.69:99
-chr1	591004	.	C	T	96.57	PASS	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=34.15;MQ0=0;OQ=697.04;QD=7.58;SB=-276.23	GT:AD:DP:GL:GQ	0/1:66,26:89:-99.83,-26.84,-204.19:99
-chr1	591498	rs2531322	C	A	0.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=129;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=32.80;MQ0=0;OQ=356.51;QD=2.76;SB=131.06	GT:AD:DP:GL:GQ	0/1:108,21:125:-76.61,-37.67,-331.80:99
-chr1	592316	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=5.89;MQ=8.09;MQ0=42;OQ=58.17;QD=0.88;SB=-10.00	GT:AD:DP:GL:GQ	0/1:52,12:5:-10.61,-1.51,-6.31:48.04
-chr1	592508	rs2686868	C	T	15.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=1;HaplotypeScore=3.16;MQ=34.52;MQ0=0;OQ=1500.76;QD=12.61;SB=-645.23	GT:AD:DP:GL:GQ	0/1:71,48:113:-187.40,-34.04,-240.50:99
-chr1	616184	rs2808330	A	G	13.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=103;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=40.61;MQ0=5;OQ=348.18;QD=3.38;SB=86.31	GT:AD:DP:GL:GQ	0/1:75,28:95:-66.73,-28.63,-299.16:99
-chr1	625884	rs3857304	G	A	2.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=6.38;MQ0=48;OQ=115.97;QD=2.23;SB=-51.67	GT:AD:DP:GL:GQ	1/1:47,5:4:-15.13,-1.21,-0.00:12.03
-chr1	625907	rs4030160	G	A	213.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=11.50;MQ0=27;OQ=320.38;QD=8.90;SB=-93.34	GT:AD:DP:GL:GQ	1/1:25,11:9:-35.62,-2.71,-0.00:27.09
-chr1	625979	rs3871845	G	C	249.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=11.96;MQ0=27;OQ=358.10;QD=9.68;SB=-129.40	GT:AD:DP:GL:GQ	1/1:26,11:9:-39.40,-2.71,-0.00:27.09
-chr1	626181	rs3873089	G	A	177.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.43;MQ0=3;OQ=376.84;QD=28.99;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,13:10:-41.27,-3.01,-0.00:30.10
-chr1	638976	.	C	T	0.12	PASS	AC=2;AF=1.00;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=4.06;MQ=23.85;MQ0=8;OQ=648.49;QD=24.02;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,27:17:-68.44,-5.12,-0.00:51.17
-chr1	640686	.	A	G	25.04	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=6.84;MQ0=102;QD=0.23;SB=-10.00	GT:AD:DP:GL:GQ	0/1:98,10:6:-7.60,-1.81,-15.47:57.87
-chr1	641012	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=157;Dels=0.00;HRun=1;HaplotypeScore=5.72;MQ=12.45;MQ0=138;OQ=282.66;QD=1.80;SB=-113.62	GT:AD:DP:GL:GQ	0/1:142,15:18:-36.97,-5.42,-32.71:99
-chr1	647651	.	G	C	91.46	PASS	AC=2;AF=1.00;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=15.14;MQ0=31;OQ=441.56;QD=9.39;SB=-238.61	GT:AD:DP:GL:GQ	1/1:28,19:11:-47.74,-3.31,-0.00:33.11
-chr1	652720	rs62639125	G	A	47.02	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=8.82;MQ0=19;QD=1.42;SB=-10.00	GT:AD:DP:GL:GQ	1/1:13,20:2:-8.11,-0.60,-0.00:6.02
-chr1	652960	rs61769340	G	C	105.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=20.58;MQ0=11;OQ=1522.59;QD=27.68;SB=-684.47	GT:AD:DP:GL:GQ	1/1:10,45:39:-155.88,-11.77,-0.03:99
-chr1	656406	.	G	A	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=11.93;MQ0=83;OQ=127.34;QD=1.14;SB=-0.98	GT:AD:DP:GL:GQ	0/1:95,17:17:-21.14,-5.12,-45.67:99
-chr1	662072	.	G	A	11.72	PASS	AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=4.71;MQ=27.50;MQ0=7;OQ=1481.48;QD=11.06;SB=-511.41	GT:AD:DP:GL:GQ	0/1:80,54:118:-187.00,-35.57,-233.79:99
-chr1	662535	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=1;HaplotypeScore=4.63;MQ=12.94;MQ0=86;OQ=221.86;QD=1.71;SB=-10.00	GT:AD:DP:GL:GQ	0/1:117,13:31:-34.81,-9.34,-77.61:99
-chr1	664297	.	A	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=194;Dels=0.00;HRun=1;HaplotypeScore=8.91;MQ=25.89;MQ0=44;OQ=139.99;QD=0.72;SB=29.32	GT:AD:DP:GL:GQ	0/1:135,59:118:-52.83,-35.54,-396.03:99
-chr1	664319	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=197;Dels=0.00;HRun=1;HaplotypeScore=4.98;MQ=25.84;MQ0=39;OQ=562.89;QD=2.86;SB=-70.36	GT:AD:DP:GL:GQ	0/1:152,44:131:-101.81,-42.24,-385.33:99
-chr1	665009	.	G	A	0.15	PASS	AC=2;AF=1.00;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=7.66;MQ=13.29;MQ0=30;OQ=394.21;QD=6.36;SB=-10.00	GT:AD:DP:GL:GQ	1/1:20,42:11:-43.01,-3.32,-0.01:33.10
-chr1	665981	.	C	T	314.88	PASS	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.49;MQ0=9;OQ=1228.86;QD=15.36;SB=-521.03	GT:AD:DP:GL:GQ	0/1:42,38:68:-146.65,-20.48,-114.04:99
-chr1	678857	.	T	C	37.39	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=9.96;MQ0=52;QD=0.58;SB=-41.94	GT:AD:DP:GL:GQ	0/1:58,5:10:-10.04,-3.02,-24.70:70.23
-chr1	681407	.	T	A	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=56;Dels=0.00;HRun=13;HaplotypeScore=8.39;MQ=28.14;MQ0=23;OQ=991.49;QD=17.71;SB=-487.41	GT:AD:DP:GL:GQ	1/1:17,39:33:-109.19,-9.95,-6.46:34.91
-chr1	681927	.	C	G	40.97	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=4.89;MQ=4.61;MQ0=72;QD=0.54;SB=-10.00	GT:AD:DP:GL:GQ	0/1:72,2:3:-8.29,-0.90,-4.05:31.44
-chr1	684740	rs1829739	A	C	31.20	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=3;HaplotypeScore=24.15;MQ=12.41;MQ0=41;QD=0.60;SB=-34.97	GT:AD:DP:GL:GQ	0/1:47,5:9:-9.12,-2.71,-21.21:64.03
-chr1	684742	.	C	A	14.57	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=37.61;MQ=12.41;MQ0=41;QD=0.28;SB=-31.35	GT:AD:DP:GL:GQ	0/1:46,6:9:-7.44,-2.71,-24.53:47.25
-chr1	684781	.	C	T	48.14	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=48;Dels=0.00;HRun=2;HaplotypeScore=2.66;MQ=4.69;MQ0=46;QD=1.00;SB=-49.56	GT:AD:DP:GL:GQ	1/1:40,8:2:-8.22,-0.60,-0.00:6.02
-chr1	684978	.	A	T	38.37	PASS	AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.29;MQ0=2;OQ=86.08;QD=14.35;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,6:3:-12.10,-0.90,-0.00:9.03
-chr1	690691	rs6685320	T	A	0.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=41.41;MQ0=1;OQ=71.22;QD=0.76;SB=149.48	GT:AD:DP:GL:GQ	0/1:83,11:90:-37.51,-27.11,-298.94:99
-chr1	692785	.	C	T	0.89	PASS	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=27.63;MQ0=14;OQ=282.72;QD=2.30;SB=-80.41	GT:AD:DP:GL:GQ	0/1:107,16:98:-61.07,-29.52,-300.46:99
-chr1	692834	.	C	T	2.02	PASS	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=26.70;MQ0=10;OQ=722.71;QD=6.12;SB=-381.76	GT:AD:DP:GL:GQ	0/1:89,29:108:-108.08,-32.53,-294.03:99
-chr1	692878	rs12124557	G	C	71.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.28;MQ0=34;OQ=350.61;QD=4.61;SB=-168.38	GT:AD:DP:GL:GQ	0/1:61,15:41:-50.70,-12.35,-126.27:99
-chr1	694230	rs9727436	T	C	8.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=32.48;MQ0=2;OQ=333.56;QD=17.56;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,18:12:-36.95,-3.62,-0.01:36.08
-chr1	695745	.	G	A	102.02	PASS	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=41.82;MQ0=0;OQ=1169.68;QD=16.02;SB=-501.47	GT:AD:DP:GL:GQ	0/1:36,37:71:-141.66,-21.41,-112.07:99
-chr1	696231	rs12029736	A	G	92.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=39.21;MQ0=1;OQ=1205.31;QD=20.78;SB=-587.73	GT:AD:DP:GL:GQ	0/1:5,53:49:-138.60,-14.79,-16.39:15.94
-chr1	696641	.	G	A	0.05	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=11.92;MQ=21.76;MQ0=28;OQ=1527.01;QD=18.18;SB=-47.56	GT:AD:DP:GL:GQ	1/1:26,58:39:-156.30,-11.75,-0.02:99
-chr1	704290	rs12028261	G	A	67.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.14;MQ=38.97;MQ0=0;OQ=1407.21;QD=35.18;SB=-656.37	GT:AD:DP:GL:GQ	1/1:0,40:36:-144.32,-10.85,-0.01:99
-chr1	705211	rs3131984	T	G	181.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=48.59;MQ0=0;OQ=1797.71;QD=32.69;SB=-808.10	GT:AD:DP:GL:GQ	1/1:0,55:52:-183.37,-15.66,-0.02:99
-chr1	705859	rs4614203	A	T	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=9;HaplotypeScore=9.09;MQ=20.66;MQ0=19;OQ=690.18;QD=13.80;SB=-46.39	GT:AD:DP:GL:GQ	1/1:1,48:20:-72.61,-6.03,-0.01:60.18
-chr1	708249	rs10900602	A	G	1.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.93;MQ=25.93;MQ0=21;OQ=1118.18;QD=17.47;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,63:38:-115.46,-11.48,-0.05:99
-chr1	708418	rs10751453	T	C	415.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.69;MQ0=5;OQ=1667.51;QD=27.79;SB=-566.12	GT:AD:DP:GL:GQ	1/1:4,56:54:-174.43,-16.28,-4.09:99
-chr1	710103	rs3121393	T	C	439.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.62;MQ0=19;OQ=1791.16;QD=20.59;SB=-717.22	GT:AD:DP:GL:GQ	1/1:0,87:51:-182.72,-15.36,-0.02:99
-chr1	710660	rs3115846	G	A	23.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=0.95;MQ=32.94;MQ0=7;OQ=1843.21;QD=32.91;SB=-738.02	GT:AD:DP:GL:GQ	1/1:0,56:47:-187.92,-14.16,-0.01:99
-chr1	713754	rs2977670	G	C	680.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.16;MQ0=0;OQ=1954.35;QD=36.87;SB=-819.16	GT:AD:DP:GL:GQ	1/1:0,53:49:-199.05,-14.78,-0.03:99
-chr1	714052	.	G	A	38.81	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=1;HaplotypeScore=27.06;MQ=47.82;MQ0=13;QD=0.40;SB=-19.66	GT:AD:DP:GL:GQ	0/1:88,9:69:-27.95,-20.79,-220.66:71.64
-chr1	714724	rs12123401	G	A	77.21	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=38.16;MQ=32.18;MQ0=19;QD=1.19;SB=53.18	GT:AD:DP:GL:GQ	0/1:50,14:32:-20.64,-9.64,-97.41:99
-chr1	714732	rs12735556	C	A	597.50	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=35.96;MQ=32.37;MQ0=15;QD=9.34;SB=-186.20	GT:AD:DP:GL:GQ	0/1:31,30:31:-72.37,-9.34,-42.36:99
-chr1	714734	rs12735557	C	G	606.51	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=32.96;MQ=32.01;MQ0=15;QD=9.48;SB=-232.37	GT:AD:DP:GL:GQ	0/1:31,33:32:-73.58,-9.64,-63.94:99
-chr1	714811	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=1;HaplotypeScore=105.18;MQ=32.80;MQ0=13;OQ=394.82;QD=4.11;SB=-25.79	GT:AD:DP:GL:GQ	0/1:48,48:42:-55.42,-12.65,-93.88:99
-chr1	714830	.	G	A	44.58	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=2;HaplotypeScore=123.02;MQ=32.55;MQ0=17;QD=0.46;SB=2.03	GT:AD:DP:GL:GQ	0/1:60,27:26:-15.57,-7.83,-82.81:77.42
-chr1	714865	.	G	A	118.87	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=2;HaplotypeScore=72.07;MQ=36.16;MQ0=17;QD=1.19;SB=45.52	GT:AD:DP:GL:GQ	0/1:83,11:39:-26.94,-11.77,-99.77:99
-chr1	714869	.	G	A	210.22	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=70.54;MQ=36.82;MQ0=18;QD=2.08;SB=89.30	GT:AD:DP:GL:GQ	0/1:78,22:52:-39.97,-15.66,-154.79:99
-chr1	714870	.	G	C	132.10	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=64.77;MQ=36.96;MQ0=18;QD=1.33;SB=86.32	GT:AD:DP:GL:GQ	0/1:81,18:51:-31.86,-15.37,-195.72:99
-chr1	714885	.	T	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=11.63;MQ=42.34;MQ0=19;OQ=59.67;QD=0.80;SB=57.28	GT:AD:DP:GL:GQ	0/1:59,16:42:-21.91,-12.66,-130.29:92.50
-chr1	714965	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=93;Dels=0.06;HRun=0;HaplotypeScore=109.90;MQ=37.50;MQ0=15;OQ=104.38;QD=1.12;SB=93.07	GT:AD:DP:GL:GQ	0/1:76,7:50:-34.61,-20.89,-189.48:99
-chr1	714987	.	A	T	75.82	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=80;Dels=0.03;HRun=1;HaplotypeScore=85.54;MQ=37.34;MQ0=12;QD=0.95;SB=77.28	GT:AD:DP:GL:GQ	0/1:70,6:44:-26.77,-15.90,-141.85:99
-chr1	714990	.	A	G	169.75	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=75;Dels=0.04;HRun=1;HaplotypeScore=76.84;MQ=38.08;MQ0=11;QD=2.26;SB=1.07	GT:AD:DP:GL:GQ	0/1:50,19:44:-36.22,-15.96,-136.58:99
-chr1	714991	.	A	G	49.83	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=75;Dels=0.01;HRun=0;HaplotypeScore=63.75;MQ=38.08;MQ0=11;QD=0.66;SB=86.30	GT:AD:DP:GL:GQ	0/1:68,6:44:-21.52,-13.26,-154.68:82.67
-chr1	714995	.	C	A	39.02	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=2;HaplotypeScore=68.11;MQ=38.07;MQ0=12;QD=0.54;SB=48.86	GT:AD:DP:GL:GQ	0/1:52,10:39:-31.66,-24.48,-125.33:71.86
-chr1	715012	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=28.31;MQ=43.81;MQ0=11;OQ=81.07;QD=1.33;SB=77.26	GT:AD:DP:GL:GQ	0/1:50,6:42:-27.43,-16.04,-129.03:99
-chr1	715014	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=1;HaplotypeScore=28.31;MQ=44.76;MQ0=10;OQ=135.00;QD=2.29;SB=80.30	GT:AD:DP:GL:GQ	0/1:48,10:43:-29.74,-12.96,-149.46:99
-chr1	715704	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=1;HaplotypeScore=25.25;MQ=54.80;MQ0=2;OQ=145.06;QD=1.23;SB=-43.38	GT:AD:DP:GL:GQ	0/1:97,21:107:-50.01,-32.22,-342.89:99
-chr1	716048	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=178;Dels=0.00;HRun=1;HaplotypeScore=18.47;MQ=39.54;MQ0=8;OQ=52.50;QD=0.29;SB=34.27	GT:AD:DP:GL:GQ	0/1:78,99:81:-32.94,-24.40,-274.16:85.34
-chr1	716061	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=0;HaplotypeScore=21.67;MQ=39.51;MQ0=6;OQ=115.15;QD=0.62;SB=43.85	GT:AD:DP:GL:GQ	0/1:135,49:85:-40.41,-25.61,-331.38:99
-chr1	716222	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=2;HaplotypeScore=139.36;MQ=31.95;MQ0=27;OQ=92.92;QD=0.79;SB=-50.76	GT:AD:DP:GL:GQ	0/1:103,13:47:-26.73,-14.16,-149.22:99
-chr1	716344	rs3131980	T	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=39.71;MQ=55.45;MQ0=6;OQ=2415.81;QD=31.79;SB=-1086.51	GT:AD:DP:GL:GQ	1/1:2,74:68:-245.18,-20.48,-0.02:99
-chr1	716802	rs4520358	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=160;Dels=0.00;HRun=0;HaplotypeScore=127.95;MQ=28.01;MQ0=48;OQ=1542.52;QD=9.64;SB=-717.92	GT:AD:DP:GL:GQ	0/1:109,49:76:-180.46,-22.93,-134.20:99
-chr1	716807	rs3131979	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=169;Dels=0.00;HRun=1;HaplotypeScore=146.45;MQ=27.53;MQ0=52;OQ=2520.74;QD=14.92;SB=-1257.54	GT:AD:DP:GL:GQ	0/1:69,89:79:-286.20,-30.85,-56.55:99
-chr1	717392	.	A	G	3.52	PASS	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=1;HaplotypeScore=3.37;MQ=24.74;MQ0=13;OQ=554.36;QD=8.66;SB=-175.95	GT:AD:DP:GL:GQ	0/1:36,28:38:-70.17,-11.45,-77.18:99
-chr1	717776	.	A	G	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=2.77;MQ=36.84;MQ0=8;OQ=198.21;QD=1.82;SB=-48.31	GT:AD:DP:GL:GQ	0/1:82,26:93:-51.12,-28.02,-315.62:99
-chr1	717825	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=45.12;MQ0=3;OQ=93.24;QD=0.90;SB=-41.95	GT:AD:DP:GL:GQ	0/1:87,17:97:-41.83,-29.22,-341.26:99
-chr1	718022	rs3131978	C	T	227.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=24.78;MQ0=12;OQ=2206.38;QD=27.93;SB=-528.20	GT:AD:DP:GL:GQ	1/1:0,79:55:-224.24,-16.57,-0.01:99
-chr1	718105	rs3131977	C	G	701.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.42;MQ0=9;OQ=2564.24;QD=33.30;SB=-886.52	GT:AD:DP:GL:GQ	1/1:0,77:61:-260.03,-18.38,-0.02:99
-chr1	718468	rs2977661	C	A	0.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=44.88;MQ0=1;OQ=306.65;QD=3.13;SB=125.41	GT:AD:DP:GL:GQ	0/1:81,17:92:-61.67,-27.72,-254.10:99
-chr1	719542	rs4951859	C	G	20.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=3;HaplotypeScore=0.73;MQ=51.87;MQ0=0;OQ=2314.11;QD=40.60;SB=-1158.05	GT:AD:DP:GL:GQ	1/1:0,57:55:-235.02,-16.58,-0.02:99
-chr1	722635	.	G	A	178.90	PASS	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.65;MQ0=17;OQ=703.25;QD=9.38;SB=-329.31	GT:AD:DP:GL:GQ	0/1:40,35:48:-88.07,-14.46,-95.92:99
-chr1	723861	rs3094321	C	T	2.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=4.03;MQ=14.10;MQ0=13;OQ=171.30;QD=5.53;SB=-52.67	GT:AD:DP:GL:GQ	1/1:0,31:5:-20.69,-1.51,-0.00:15.05
-chr1	723905	rs3115866	G	A	435.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.45;MQ0=11;OQ=1488.74;QD=31.02;SB=-417.55	GT:AD:DP:GL:GQ	1/1:0,48:37:-152.47,-11.14,-0.01:99
-chr1	724152	rs2427932	G	A	28.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=40.65;MQ0=10;OQ=544.36;QD=7.78;SB=29.11	GT:AD:DP:GL:GQ	0/1:46,24:57:-74.91,-17.19,-123.40:99
-chr1	724325	rs12564807	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.02;HRun=14;HaplotypeScore=12.95;MQ=25.23;MQ0=25;OQ=486.84;QD=10.36;SB=-195.27	GT:AD:DP:GL:GQ	0/1:7,39:20:-57.99,-6.03,-17.33:99
-chr1	724354	rs7518433	T	C	213.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=16.24;MQ0=8;OQ=108.50;QD=7.23;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,15:4:-14.38,-1.21,-0.00:12.04
-chr1	724429	.	G	A	5.67	PASS	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=39.71;MQ0=12;OQ=1919.08;QD=16.26;SB=-856.39	GT:AD:DP:GL:GQ	0/1:56,62:102:-225.91,-30.72,-172.49:99
-chr1	724483	rs2427930	A	G	156.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=120;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=45.92;MQ0=8;OQ=1015.40;QD=8.46;SB=-368.74	GT:AD:DP:GL:GQ	0/1:73,47:110:-137.96,-33.13,-289.42:99
-chr1	724814	rs61770166	A	G	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.01;HRun=0;HaplotypeScore=8.00;MQ=38.81;MQ0=11;OQ=57.16;QD=0.57;SB=101.37	GT:AD:DP:GL:GQ	0/1:74,25:85:-34.30,-25.30,-302.54:90
-chr1	725289	rs10900603	G	A	319.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.84;MQ0=12;OQ=1308.47;QD=22.56;SB=-614.32	GT:AD:DP:GL:GQ	1/1:0,58:33:-134.44,-9.94,-0.01:99
-chr1	727603	rs3893479	G	A	3.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=20.83;MQ0=35;OQ=241.46;QD=3.71;SB=-122.11	GT:AD:DP:GL:GQ	0/1:49,15:27:-35.56,-8.14,-65.14:99
-chr1	729005	rs2340527	T	A	17.56	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=11;HaplotypeScore=0.00;MQ=42.93;MQ0=12;QD=0.18;SB=2.25	GT:AD:DP:GL:GQ	0/1:70,25:68:-25.52,-20.49,-222.57:50.31
-chr1	729073	rs2427917	A	G	0.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=3;HaplotypeScore=1.32;MQ=36.83;MQ0=11;OQ=1725.34;QD=25.00;SB=-386.59	GT:AD:DP:GL:GQ	1/1:8,61:54:-180.20,-16.27,-4.08:99
-chr1	729289	rs3131973	A	G	242.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.01;MQ0=22;OQ=768.10;QD=13.48;SB=-48.96	GT:AD:DP:GL:GQ	1/1:0,57:23:-80.40,-6.93,-0.01:69.20
-chr1	729391	rs3094317	G	A	25.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=29.31;MQ0=14;OQ=1050.45;QD=23.87;SB=-501.02	GT:AD:DP:GL:GQ	1/1:0,44:27:-108.64,-8.13,-0.01:81.26
-chr1	731442	rs3115865	T	C	10.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=14.78;MQ0=18;OQ=257.65;QD=3.79;SB=-147.73	GT:AD:DP:GL:GQ	1/1:0,68:9:-29.35,-2.71,-0.01:27.07
-chr1	732688	.	A	G	132.94	PASS	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=40.79;MQ0=0;OQ=1231.30;QD=15.02;SB=-638.22	GT:AD:DP:GL:GQ	0/1:40,42:81:-150.81,-24.40,-157.55:99
-chr1	732884	rs2488925	T	C	45.12	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=12.78;MQ0=54;QD=0.47;SB=-0.97	GT:AD:DP:GL:GQ	0/1:72,25:9:-10.51,-2.71,-24.07:77.96
-chr1	732935	rs2488505	C	A	405.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=25.42;MQ0=21;OQ=984.68;QD=12.62;SB=-456.35	GT:AD:DP:GL:GQ	1/1:10,68:28:-102.06,-8.43,-0.01:84.26
-chr1	734986	rs61823337	A	C	21.52	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=121;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=22.23;MQ0=45;QD=0.18;SB=23.10	GT:AD:DP:GL:GQ	0/1:104,17:71:-26.81,-21.38,-234.10:54.33
-chr1	735210	rs2488501	T	C	0.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=117;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=29.20;MQ0=16;OQ=204.37;QD=1.75;SB=-126.97	GT:AD:DP:GL:GQ	0/1:101,16:100:-53.85,-30.13,-340.21:99
-chr1	736231	rs3925106	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=38.77;MQ0=4;OQ=87.62;QD=1.33;SB=28.85	GT:AD:DP:GL:GQ	0/1:58,8:62:-30.72,-18.67,-192.09:99
-chr1	736257	rs28622890	G	A	34.58	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=41.58;MQ0=5;QD=0.43;SB=53.57	GT:AD:DP:GL:GQ	0/1:73,8:73:-28.75,-22.01,-217.76:67.42
-chr1	737271	rs2427896	G	A	1.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.89;MQ0=27;OQ=95.91;QD=0.96;SB=26.10	GT:AD:DP:GL:GQ	0/1:78,22:62:-31.55,-18.68,-198.47:99
-chr1	737583	rs2488922	A	G	0.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=123;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=42.10;MQ0=2;OQ=266.56;QD=2.17;SB=-121.05	GT:AD:DP:GL:GQ	0/1:92,31:105:-61.60,-31.66,-333.56:99
-chr1	738741	rs2519043	G	T	42.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=26.82;MQ0=11;OQ=2109.65;QD=29.30;SB=-875.26	GT:AD:DP:GL:GQ	1/1:7,65:57:-214.56,-17.17,-0.01:99
-chr1	739128	rs2519041	G	A	43.02	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=8.37;MQ0=49;QD=0.61;SB=-10.00	GT:AD:DP:GL:GQ	1/1:19,51:2:-7.71,-0.60,-0.00:6.02
-chr1	739546	rs12184332	C	T	184.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=12.22;MQ0=29;OQ=412.05;QD=9.81;SB=-172.22	GT:AD:DP:GL:GQ	1/1:0,15:11:-44.79,-3.31,-0.00:33.11
-chr1	739719	rs12409679	C	T	476.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.16;MQ0=31;OQ=1249.90;QD=19.53;SB=-559.74	GT:AD:DP:GL:GQ	1/1:9,55:32:-128.58,-9.64,-0.01:96.31
-chr1	739852	rs12409693	C	T	32.23	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=4;HaplotypeScore=0.83;MQ=11.24;MQ0=16;QD=1.29;SB=-3.98	GT:AD:DP:GL:GQ	0/1:9,16:4:-7.71,-1.20,-7.59:63.88
-chr1	739860	rs12410209	A	G	6.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=11.03;MQ0=14;OQ=69.01;QD=3.14;SB=-6.99	GT:AD:DP:GL:GQ	0/1:7,15:4:-11.39,-1.20,-4.06:28.52
-chr1	742429	rs3094315	G	A	709.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.17;MQ0=0;OQ=3081.43;QD=40.02;SB=-1319.35	GT:AD:DP:GL:GQ	1/1:0,77:77:-311.75,-23.19,-0.02:99
-chr1	742584	rs3131972	A	G	25.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=3;HaplotypeScore=0.95;MQ=43.52;MQ0=0;OQ=2970.98;QD=35.37;SB=-1399.49	GT:AD:DP:GL:GQ	1/1:0,84:83:-300.71,-25.00,-0.02:99
-chr1	742757	rs3131971	T	C	41.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.21;MQ=23.17;MQ0=17;OQ=516.07;QD=12.59;SB=-10.00	GT:AD:DP:GL:GQ	1/1:4,37:19:-55.23,-5.74,-0.04:57.08
-chr1	743132	rs3115861	C	G	14.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.96;MQ=27.06;MQ0=17;OQ=1234.23;QD=26.26;SB=-15.29	GT:AD:DP:GL:GQ	1/1:0,46:29:-129.86,-11.46,-2.85:86.17
-chr1	743268	rs3115860	C	A	75.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.75;MQ0=7;OQ=486.16;QD=22.10;SB=-153.55	GT:AD:DP:GL:GQ	1/1:0,22:14:-52.20,-4.22,-0.00:42.13
-chr1	743288	rs3131970	T	C	362.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.31;MQ0=12;OQ=231.44;QD=11.57;SB=-100.85	GT:AD:DP:GL:GQ	1/1:0,20:8:-26.73,-2.41,-0.01:24.06
-chr1	743337	rs2073814	C	G	1.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=4;HaplotypeScore=1.47;MQ=27.30;MQ0=10;OQ=1125.84;QD=30.43;SB=-429.30	GT:AD:DP:GL:GQ	1/1:1,36:27:-116.18,-8.13,-0.01:81.27
-chr1	743712	rs56101360	G	T	37.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=10.96;MQ0=18;OQ=73.40;QD=3.50;SB=-44.39	GT:AD:DP:GL:GQ	1/1:0,21:3:-10.83,-0.90,-0.00:9.03
-chr1	744045	rs3131969	A	G	233.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.14;MQ0=6;OQ=1104.31;QD=23.50;SB=-502.19	GT:AD:DP:GL:GQ	1/1:0,47:36:-114.05,-10.86,-0.03:99
-chr1	744055	rs3131968	A	G	489.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.65;MQ0=5;OQ=1245.81;QD=27.08;SB=-566.90	GT:AD:DP:GL:GQ	1/1:0,46:40:-128.20,-12.07,-0.04:99
-chr1	744197	rs3131967	T	C	119.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=53.80;MQ0=2;OQ=2119.16;QD=28.26;SB=-841.48	GT:AD:DP:GL:GQ	1/1:1,74:67:-215.56,-20.21,-0.06:99
-chr1	744366	rs3115859	G	A	143.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.48;MQ0=0;OQ=2152.98;QD=37.77;SB=-958.79	GT:AD:DP:GL:GQ	1/1:0,55:55:-218.90,-16.57,-0.02:99
-chr1	744827	rs3131966	C	T	120.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=47.82;MQ0=1;OQ=2882.74;QD=38.96;SB=-1406.06	GT:AD:DP:GL:GQ	1/1:1,73:72:-291.88,-21.69,-0.02:99
-chr1	745638	rs3131965	A	G	37.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.96;MQ=59.56;MQ0=0;OQ=1308.09;QD=25.16;SB=-645.91	GT:AD:DP:GL:GQ	1/1:2,50:45:-138.61,-13.58,-4.21:93.63
-chr1	745750	rs3131964	C	G	3.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=53.42;MQ0=0;OQ=1959.71;QD=42.60;SB=-541.05	GT:AD:DP:GL:GQ	1/1:0,46:45:-199.57,-13.56,-0.01:99
-chr1	745753	rs3115858	A	T	53.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=52.51;MQ0=0;OQ=1749.78;QD=37.23;SB=-548.77	GT:AD:DP:GL:GQ	1/1:0,47:47:-178.57,-14.15,-0.01:99
-chr1	745791	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=2;HaplotypeScore=18.24;MQ=43.86;MQ0=9;OQ=50.05;QD=0.65;SB=68.26	GT:AD:DP:GL:GQ	0/1:71,6:65:-27.87,-19.59,-256.05:82.88
-chr1	745803	rs3115857	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=56.59;MQ=40.14;MQ0=10;OQ=1678.77;QD=22.69;SB=-752.72	GT:AD:DP:GL:GQ	0/1:24,50:53:-187.11,-15.98,-16.89:9.18
-chr1	745905	.	G	C	40.04	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=1;HaplotypeScore=109.46;MQ=39.52;MQ0=1;QD=0.47;SB=41.16	GT:AD:DP:GL:GQ	0/1:44,42:46:-21.15,-13.87,-174.52:72.88
-chr1	745926	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=1;HaplotypeScore=71.25;MQ=39.59;MQ0=1;OQ=190.93;QD=2.22;SB=53.16	GT:AD:DP:GL:GQ	0/1:47,39:55:-38.95,-16.57,-157.39:99
-chr1	745944	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=34.08;MQ=37.55;MQ0=2;OQ=183.15;QD=2.23;SB=41.15	GT:AD:DP:GL:GQ	0/1:68,13:63:-40.58,-18.98,-189.40:99
-chr1	745947	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=35.45;MQ=37.64;MQ0=2;OQ=144.60;QD=1.76;SB=41.13	GT:AD:DP:GL:GQ	0/1:61,21:63:-36.72,-18.98,-195.32:99
-chr1	745969	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=26.39;MQ=43.31;MQ0=1;OQ=191.12;QD=2.62;SB=65.24	GT:AD:DP:GL:GQ	0/1:56,17:62:-41.07,-18.68,-205.74:99
-chr1	745970	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=53.14;MQ=43.05;MQ0=1;OQ=181.87;QD=2.46;SB=65.22	GT:AD:DP:GL:GQ	0/1:57,13:62:-40.15,-18.68,-186.08:99
-chr1	746120	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=2;HaplotypeScore=45.83;MQ=41.92;MQ0=5;OQ=178.43;QD=2.66;SB=1.10	GT:AD:DP:GL:GQ	0/1:36,31:38:-32.58,-11.45,-99.35:99
-chr1	746127	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=64.18;MQ=39.79;MQ0=5;OQ=90.17;QD=1.29;SB=23.10	GT:AD:DP:GL:GQ	0/1:61,9:40:-24.35,-12.05,-113.93:99
-chr1	746131	rs12567639	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=86.22;MQ=40.15;MQ0=5;OQ=1193.97;QD=14.74;SB=-198.46	GT:AD:DP:GL:GQ	0/1:23,47:41:-137.40,-14.72,-24.14:94.15
-chr1	746140	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=67.36;MQ=39.96;MQ0=6;OQ=451.51;QD=4.47;SB=-226.37	GT:AD:DP:GL:GQ	0/1:64,37:56:-65.31,-16.87,-128.04:99
-chr1	746183	rs61768169	G	A	45.64	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=15.14;MQ=43.93;MQ0=4;QD=0.48;SB=0.06	GT:AD:DP:GL:GQ	0/1:84,10:80:-31.96,-24.11,-251.75:78.48
-chr1	746197	.	C	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=9.62;MQ=45.83;MQ0=2;OQ=266.46;QD=3.10;SB=-143.52	GT:AD:DP:GL:GQ	0/1:62,24:69:-50.72,-20.79,-191.84:99
-chr1	746210	.	C	G	29.36	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=1;HaplotypeScore=12.28;MQ=48.57;MQ0=1;QD=0.39;SB=83.30	GT:AD:DP:GL:GQ	0/1:61,15:60:-24.30,-18.08,-232.38:62.19
-chr1	746211	.	A	C	19.28	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=12.28;MQ=48.88;MQ0=1;QD=0.26;SB=56.68	GT:AD:DP:GL:GQ	0/1:55,20:60:-23.28,-18.07,-191.05:52.07
-chr1	746241	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=1;HaplotypeScore=37.04;MQ=43.41;MQ0=2;OQ=460.88;QD=4.90;SB=-102.94	GT:AD:DP:GL:GQ	0/1:66,28:77:-72.58,-23.21,-260.56:99
-chr1	746243	rs3131963	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=38.28;MQ=42.00;MQ0=2;OQ=2225.83;QD=20.61;SB=-986.67	GT:AD:DP:GL:GQ	0/1:37,71:77:-249.07,-23.20,-37.48:99
-chr1	746259	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=53.13;MQ=42.82;MQ0=2;OQ=115.63;QD=1.04;SB=-45.40	GT:AD:DP:GL:GQ	0/1:89,21:81:-39.28,-24.43,-223.64:99
-chr1	746271	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=0;HaplotypeScore=62.70;MQ=43.89;MQ0=1;OQ=73.67;QD=0.68;SB=-12.36	GT:AD:DP:GL:GQ	0/1:82,19:79:-37.12,-26.47,-271.48:99
-chr1	746467	rs3131962	A	G	256.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.92;MQ0=2;OQ=1247.82;QD=23.54;SB=-557.88	GT:AD:DP:GL:GQ	1/1:1,52:40:-128.40,-12.06,-0.04:99
-chr1	747503	rs3115853	G	A	25.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=3.30;MQ=58.23;MQ0=2;OQ=3098.30;QD=37.78;SB=-1549.56	GT:AD:DP:GL:GQ	1/1:0,81:79:-317.18,-27.31,-3.76:99
-chr1	747597	rs4951929	C	T	626.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=2652.10;QD=38.44;SB=-1324.28	GT:AD:DP:GL:GQ	1/1:0,69:67:-268.81,-20.18,-0.02:99
-chr1	747799	rs4951862	C	A	77.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=57.90;MQ0=0;OQ=1743.44;QD=32.90;SB=-442.30	GT:AD:DP:GL:GQ	1/1:0,53:51:-177.95,-15.36,-0.02:99
-chr1	748007	rs3131956	A	G	613.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=1973.59;QD=34.03;SB=-931.61	GT:AD:DP:GL:GQ	1/1:0,58:58:-200.97,-17.48,-0.03:99
-chr1	748187	rs3131955	T	C	137.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=2.43;MQ=57.23;MQ0=0;OQ=1684.65;QD=30.08;SB=-868.87	GT:AD:DP:GL:GQ	1/1:0,56:51:-172.08,-15.37,-0.03:99
-chr1	748489	rs3131954	C	T	606.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.38;MQ0=0;OQ=1957.02;QD=37.63;SB=-957.97	GT:AD:DP:GL:GQ	1/1:0,52:51:-199.31,-15.37,-0.02:99
-chr1	749563	rs3115852	T	C	295.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.43;MQ0=19;OQ=1638.73;QD=24.46;SB=-694.62	GT:AD:DP:GL:GQ	1/1:0,67:46:-167.47,-13.85,-0.01:99
-chr1	749700	rs3115851	T	A	246.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=37.92;MQ0=12;OQ=2113.34;QD=28.18;SB=-566.84	GT:AD:DP:GL:GQ	1/1:0,75:55:-214.93,-16.56,-0.01:99
-chr1	750775	rs1048488	C	T	147.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.94;MQ=55.79;MQ0=0;OQ=2544.23;QD=37.42;SB=-1282.72	GT:AD:DP:GL:GQ	1/1:0,68:64:-258.02,-19.28,-0.02:99
-chr1	751010	rs3115850	T	C	532.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.77;MQ0=0;OQ=2501.23;QD=35.73;SB=-1116.81	GT:AD:DP:GL:GQ	1/1:0,70:69:-253.73,-20.78,-0.02:99
-chr1	751595	rs2286139	C	T	599.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=41.46;MQ0=7;OQ=1283.06;QD=32.08;SB=-543.21	GT:AD:DP:GL:GQ	1/1:0,40:32:-131.90,-9.64,-0.01:96.32
-chr1	751615	rs1057213	C	T	31.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=31.78;MQ0=12;OQ=906.27;QD=25.17;SB=-453.10	GT:AD:DP:GL:GQ	1/1:0,36:23:-94.22,-6.93,-0.00:69.23
-chr1	751674	rs1057212	G	A	293.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=15.73;MQ0=12;OQ=176.65;QD=10.39;SB=-51.56	GT:AD:DP:GL:GQ	1/1:0,17:5:-21.22,-1.51,-0.00:15.05
-chr1	752136	rs3115849	G	A	60.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=27.04;MQ0=8;OQ=733.35;QD=26.19;SB=-160.21	GT:AD:DP:GL:GQ	1/1:0,28:19:-76.93,-5.73,-0.01:57.18
-chr1	752452	rs3115848	G	C	110.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=44.19;MQ0=1;OQ=1521.80;QD=34.59;SB=-621.54	GT:AD:DP:GL:GQ	1/1:1,43:40:-155.80,-12.08,-0.04:99
-chr1	752455	rs3131950	C	G	3.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=4.46;MQ=42.62;MQ0=2;OQ=1386.15;QD=32.24;SB=-555.07	GT:AD:DP:GL:GQ	1/1:1,42:36:-142.24,-10.87,-0.04:99
-chr1	752464	rs3131949	T	C	84.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=40.87;MQ0=2;OQ=1077.25;QD=28.35;SB=-454.51	GT:AD:DP:GL:GQ	1/1:1,37:32:-111.32,-9.64,-0.01:96.27
-chr1	752495	rs3131948	T	A	77.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=37.91;MQ0=2;OQ=926.17;QD=28.94;SB=-390.81	GT:AD:DP:GL:GQ	1/1:1,31:26:-96.21,-7.83,-0.01:78.23
-chr1	753257	rs3115847	G	A	0.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=27.21;MQ0=9;OQ=840.10;QD=24.71;SB=-20.92	GT:AD:DP:GL:GQ	1/1:5,28:22:-89.90,-8.89,-2.30:65.88
-chr1	755968	rs2519015	T	A	366.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.21;MQ0=48;OQ=1019.18;QD=12.90;SB=-121.94	GT:AD:DP:GL:GQ	1/1:23,56:29:-105.51,-8.74,-0.01:87.26
-chr1	757643	rs2905042	G	A	71.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=34.85;MQ0=1;OQ=1607.55;QD=32.81;SB=-663.38	GT:AD:DP:GL:GQ	1/1:0,49:41:-164.35,-12.35,-0.01:99
-chr1	758116	rs2977608	A	C	58.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=47.69;MQ0=11;OQ=2396.98;QD=30.34;SB=-914.67	GT:AD:DP:GL:GQ	1/1:4,75:68:-243.30,-20.48,-0.02:99
-chr1	759692	rs2977607	C	A	65.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=47.39;MQ0=6;OQ=1539.69;QD=31.42;SB=-733.73	GT:AD:DP:GL:GQ	1/1:0,49:42:-157.56,-12.65,-0.01:99
-chr1	759938	rs2977606	C	T	514.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.63;MQ0=7;OQ=1693.07;QD=33.20;SB=-574.34	GT:AD:DP:GL:GQ	1/1:0,51:44:-172.91,-13.26,-0.01:99
-chr1	760431	rs3131943	A	G	213.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=31.32;MQ0=2;OQ=527.61;QD=27.77;SB=-87.92	GT:AD:DP:GL:GQ	1/1:0,19:16:-56.35,-4.82,-0.00:48.14
-chr1	760781	rs3095826	T	G	40.05	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=15.14;MQ0=8;QD=3.64;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,11:2:-7.41,-0.60,-0.00:6.02
-chr1	761273	rs2519006	C	T	29.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=0.96;MQ=27.71;MQ0=20;OQ=1719.34;QD=22.33;SB=-558.69	GT:AD:DP:GL:GQ	1/1:18,59:45:-179.00,-13.55,-3.48:99
-chr1	761686	rs2977605	T	C	284.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=40.99;MQ0=4;OQ=744.87;QD=26.60;SB=-283.54	GT:AD:DP:GL:GQ	1/1:0,28:24:-78.09,-7.24,-0.02:72.16
-chr1	762618	rs2905039	A	C	494.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.90;MQ0=0;OQ=1864.52;QD=29.13;SB=-798.77	GT:AD:DP:GL:GQ	1/1:0,64:60:-190.09,-18.09,-0.06:99
-chr1	764599	rs28830877	A	C	154.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=49.78;MQ0=3;OQ=2217.13;QD=30.37;SB=-1008.12	GT:AD:DP:GL:GQ	1/1:0,73:64:-225.32,-19.28,-0.02:99
-chr1	764648	rs28873693	G	A	193.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=40.27;MQ0=2;OQ=1900.97;QD=32.22;SB=-951.98	GT:AD:DP:GL:GQ	1/1:0,59:49:-193.70,-14.76,-0.02:99
-chr1	764732	rs55994826	G	A	15.73	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=36.88;MQ0=1;QD=0.58;SB=17.08	GT:AD:DP:GL:GQ	0/1:24,3:23:-11.77,-6.93,-72.32:48.45
-chr1	764737	rs28810152	A	C	715.74	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=38.33;MQ0=0;QD=28.63;SB=-297.55	GT:AD:DP:GL:GQ	1/1:0,25:22:-75.17,-6.63,-0.01:66.18
-chr1	764742	.	A	T	46.72	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=39.13;MQ0=0;QD=2.03;SB=-38.86	GT:AD:DP:GL:GQ	0/1:19,4:18:-13.38,-5.42,-51.11:79.56
-chr1	764746	.	G	A	393.33	SnpCluster	AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=40.70;MQ0=1;QD=17.88;SB=-221.92	GT:AD:DP:GL:GQ	0/1:8,14:19:-48.34,-5.72,-22.76:99
-chr1	764763	rs28797844	C	G	118.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=44.74;MQ0=1;OQ=234.91;QD=8.39;SB=-89.25	GT:AD:DP:GL:GQ	0/1:20,8:26:-34.62,-7.84,-73.94:99
-chr1	764786	rs28769076	G	C	293.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=38.71;MQ0=4;OQ=1154.38;QD=32.98;SB=-346.74	GT:AD:DP:GL:GQ	1/1:0,35:27:-119.03,-8.14,-0.01:81.27
-chr1	765119	.	T	G	7.65	PASS	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=15.72;MQ0=15;OQ=87.25;QD=4.15;SB=-66.98	GT:AD:DP:GL:GQ	0/1:15,6:6:-13.82,-1.81,-7.64:58.28
-chr1	765289	rs2905037	G	A	284.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=48.40;MQ0=0;OQ=3000.65;QD=37.51;SB=-1455.38	GT:AD:DP:GL:GQ	1/1:0,80:75:-303.67,-22.59,-0.02:99
-chr1	765522	rs2905035	A	G	84.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=40.77;MQ0=3;OQ=2096.78;QD=30.39;SB=-645.26	GT:AD:DP:GL:GQ	1/1:0,68:58:-213.28,-17.47,-0.02:99
-chr1	766409	rs12124819	A	G	273.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=3.66;MQ=51.01;MQ0=0;OQ=1354.31;QD=15.75;SB=-621.86	GT:AD:DP:GL:GQ	0/1:41,45:85:-164.32,-25.60,-163.76:99
-chr1	766985	rs2980319	A	T	684.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.93;MQ0=0;OQ=2347.43;QD=37.26;SB=-849.94	GT:AD:DP:GL:GQ	1/1:0,63:62:-238.35,-18.68,-0.02:99
-chr1	768432	rs2977615	A	G	315.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=46.80;MQ0=5;OQ=1414.86;QD=25.27;SB=-618.23	GT:AD:DP:GL:GQ	1/1:0,56:46:-145.13,-13.88,-0.05:99
-chr1	769890	rs2977613	G	T	314.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=53.23;MQ0=0;OQ=2549.06;QD=34.45;SB=-1034.15	GT:AD:DP:GL:GQ	1/1:0,74:70:-258.51,-21.09,-0.02:99
-chr1	770648	rs2977612	T	A	316.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=55.02;MQ0=0;OQ=2471.78;QD=34.81;SB=-1070.63	GT:AD:DP:GL:GQ	1/1:1,70:68:-253.32,-20.49,-2.56:99
-chr1	773167	rs2980295	T	C	625.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=32.46;MQ0=0;OQ=2479.28;QD=34.43;SB=-1064.87	GT:AD:DP:GL:GQ	1/1:0,72:71:-251.54,-21.39,-0.02:99
-chr1	774913	rs2905062	G	A	647.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.25;MQ0=0;OQ=2057.09;QD=38.09;SB=-793.69	GT:AD:DP:GL:GQ	1/1:0,54:52:-209.31,-15.66,-0.01:99
-chr1	775852	rs2980300	T	C	398.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.91;MQ0=0;OQ=1925.83;QD=36.34;SB=-289.45	GT:AD:DP:GL:GQ	1/1:0,53:52:-196.18,-15.66,-0.01:99
-chr1	776110	rs59319764	G	A	135.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=22.95;MQ0=5;OQ=708.27;QD=21.46;SB=-330.44	GT:AD:DP:GL:GQ	1/1:5,28:18:-74.41,-5.42,-0.00:54.18
-chr1	776673	rs2905061	G	A	271.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.77;MQ0=2;OQ=243.21;QD=12.80;SB=-51.67	GT:AD:DP:GL:GQ	1/1:0,19:7:-27.90,-2.11,-0.00:21.07
-chr1	776882	rs2905060	C	T	28.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.47;MQ0=13;OQ=680.11;QD=21.25;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,32:18:-71.60,-5.42,-0.01:54.17
-chr1	776908	.	C	G	26.94	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=1;HaplotypeScore=2.47;MQ=23.04;MQ0=7;QD=1.35;SB=-10.00	GT:AD:DP:GL:GQ	0/1:11,8:6:-7.79,-1.82,-13.09:59.77
-chr1	776998	rs28753393	A	G	1.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=22.78;MQ0=8;OQ=492.59;QD=20.52;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,24:14:-52.85,-4.22,-0.00:42.13
-chr1	777048	rs2905058	G	A	64.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=2.66;MQ=17.04;MQ0=12;OQ=310.80;QD=12.43;SB=-128.67	GT:AD:DP:GL:GQ	1/1:0,25:9:-34.67,-2.71,-0.01:27.08
-chr1	777068	rs2905057	G	A	256.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=15.61;MQ0=17;OQ=265.15;QD=9.14;SB=-131.67	GT:AD:DP:GL:GQ	1/1:0,29:8:-30.10,-2.41,-0.01:24.07
-chr1	777125	rs2905056	C	G	369.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=42.20;MQ0=14;OQ=1716.63;QD=32.39;SB=-514.60	GT:AD:DP:GL:GQ	1/1:0,53:39:-175.26,-11.75,-0.01:99
-chr1	777262	rs2905055	G	T	436.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=43.93;MQ0=5;OQ=1457.00;QD=33.11;SB=-678.96	GT:AD:DP:GL:GQ	1/1:0,44:39:-149.29,-11.74,-0.01:99
-chr1	777290	.	C	T	29.42	PASS	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=32.80;MQ0=5;OQ=855.45;QD=17.11;SB=-308.80	GT:AD:DP:GL:GQ	0/1:21,29:44:-102.09,-13.26,-62.10:99
-chr1	777548	rs2905054	G	T	500.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.40;MQ0=0;OQ=2267.93;QD=36.00;SB=-851.89	GT:AD:DP:GL:GQ	1/1:0,63:62:-230.39,-18.67,-0.01:99
-chr1	777707	rs2905053	C	T	334.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=100;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=44.44;MQ0=2;OQ=3957.07;QD=39.57;SB=-1940.72	GT:AD:DP:GL:GQ	1/1:0,100:95:-394.71,-28.61,-0.02:99
-chr1	778576	rs2980306	T	C	128.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=33.51;MQ0=34;OQ=1562.02;QD=19.05;SB=-268.41	GT:AD:DP:GL:GQ	1/1:13,69:45:-159.81,-13.56,-0.02:99
-chr1	778703	rs10157303	T	C	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=3;HaplotypeScore=7.41;MQ=38.85;MQ0=14;OQ=444.81;QD=5.30;SB=-42.81	GT:AD:DP:GL:GQ	0/1:40,44:57:-64.95,-17.19,-138.39:99
-chr1	778707	rs10159337	C	G	0.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=6.67;MQ=39.47;MQ0=14;OQ=423.04;QD=5.29;SB=32.36	GT:AD:DP:GL:GQ	0/1:47,33:53:-61.57,-15.98,-162.13:99
-chr1	778752	rs10159341	C	T	0.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.10;MQ=43.79;MQ0=4;OQ=82.84;QD=1.45;SB=53.17	GT:AD:DP:GL:GQ	0/1:50,7:44:-24.83,-13.27,-122.87:99
-chr1	778808	.	G	C	4.86	PASS	AC=2;AF=1.00;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=23.40;MQ0=13;OQ=99.43;QD=5.52;SB=-51.47	GT:AD:DP:GL:GQ	1/1:11,7:3:-13.43,-0.90,-0.00:9.03
-chr1	778958	.	C	G	0.12	PASS	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=6.83;MQ=13.77;MQ0=12;OQ=373.21;QD=7.46;SB=-3.98	GT:AD:DP:GL:GQ	0/1:40,10:17:-45.73,-5.12,-29.92:99
-chr1	778962	rs10158938	G	A	0.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=6.77;MQ=13.74;MQ0=12;OQ=114.14;QD=2.24;SB=-77.09	GT:AD:DP:GL:GQ	0/1:17,34:17:-19.83,-5.13,-36.56:99
-chr1	779001	.	C	G	62.18	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=43.25;MQ=17.50;MQ0=24;QD=0.60;SB=-3.98	GT:AD:DP:GL:GQ	0/1:92,11:44:-22.76,-13.26,-160.88:95.02
-chr1	779004	.	G	C	379.18	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=41.31;MQ=17.52;MQ0=26;QD=3.61;SB=-3.98	GT:AD:DP:GL:GQ	0/1:83,21:42:-55.98,-14.78,-128.84:99
-chr1	779007	.	G	C	125.98	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=41.47;MQ=17.84;MQ0=24;QD=1.21;SB=-3.98	GT:AD:DP:GL:GQ	0/1:82,22:45:-29.45,-13.56,-167.32:99
-chr1	779046	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=13.36;MQ=16.85;MQ0=30;OQ=85.18;QD=0.76;SB=-0.98	GT:AD:DP:GL:GQ	0/1:103,9:39:-23.55,-11.75,-110.84:99
-chr1	779119	rs3131939	T	C	14.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=38.97;MQ0=6;OQ=1691.71;QD=26.03;SB=-847.52	GT:AD:DP:GL:GQ	1/1:0,65:53:-172.80,-15.99,-0.05:99
-chr1	782126	rs1044922	A	G	199.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=35.10;MQ0=8;OQ=1304.52;QD=20.38;SB=-463.86	GT:AD:DP:GL:GQ	1/1:3,61:42:-134.08,-12.67,-0.04:99
-chr1	782343	rs2905036	C	T	605.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=44.88;MQ0=2;OQ=3789.97;QD=39.07;SB=-1780.39	GT:AD:DP:GL:GQ	1/1:0,97:94:-378.00,-28.32,-0.03:99
-chr1	783071	rs2905029	C	G	4.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=24.02;MQ0=7;OQ=636.50;QD=15.91;SB=29.13	GT:AD:DP:GL:GQ	0/1:20,20:32:-76.58,-9.64,-67.00:99
-chr1	783292	rs2519067	T	C	14.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=32.87;MQ0=7;OQ=1046.72;QD=28.29;SB=-162.84	GT:AD:DP:GL:GQ	1/1:5,32:30:-108.26,-9.03,-0.01:90.27
-chr1	785455	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=20;HaplotypeScore=3.33;MQ=47.34;MQ0=4;OQ=246.17;QD=4.48;SB=-56.75	GT:AD:DP:GL:GQ	0/1:43,12:47:-42.06,-14.16,-132.17:99
-chr1	786397	.	T	C	0.59	PASS	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=41.18;MQ0=9;OQ=325.37;QD=4.52;SB=-24.72	GT:AD:DP:GL:GQ	0/1:50,22:59:-53.59,-17.77,-179.67:99
-chr1	786590	rs2909612	G	T	160.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=27.34;MQ0=10;OQ=1960.56;QD=30.63;SB=-1001.80	GT:AD:DP:GL:GQ	1/1:0,64:54:-199.65,-16.26,-0.01:99
-chr1	786630	rs12076540	G	A	0.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=7.41;MQ=41.01;MQ0=13;OQ=2659.94;QD=26.60;SB=-1327.51	GT:AD:DP:GL:GQ	0/1:23,77:83:-294.28,-25.01,-36.59:99
-chr1	786634	rs2909613	T	C	0.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=101;Dels=0.00;HRun=0;HaplotypeScore=7.24;MQ=42.00;MQ0=12;OQ=84.11;QD=0.83;SB=12.37	GT:AD:DP:GL:GQ	0/1:80,21:85:-37.30,-25.61,-300.66:99
-chr1	786902	.	A	G	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=48.19;MQ0=15;OQ=198.92;QD=1.55;SB=-72.06	GT:AD:DP:GL:GQ	0/1:96,32:111:-56.61,-33.43,-385.87:99
-chr1	787026	.	G	A	14.82	LowQual	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=46.76;MQ0=8;QD=0.17;SB=-27.80	GT:AD:DP:GL:GQ	0/1:74,15:80:-28.85,-24.10,-261.80:47.51
-chr1	787041	.	A	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=44.71;MQ0=13;OQ=84.25;QD=0.90;SB=-23.86	GT:AD:DP:GL:GQ	0/1:71,22:80:-37.92,-26.21,-271.06:99
-chr1	787889	rs4951864	C	T	266.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=45.78;MQ0=1;OQ=2714.18;QD=38.77;SB=-989.31	GT:AD:DP:GL:GQ	1/1:1,69:67:-275.02,-20.18,-0.01:99
-chr1	789326	rs4245756	T	C	211.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=58.75;MQ0=0;OQ=3107.92;QD=34.53;SB=-1502.55	GT:AD:DP:GL:GQ	1/1:0,90:89:-314.41,-26.81,-0.04:99
-chr1	789870	rs6681049	T	C	615.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=47.06;MQ0=1;OQ=2660.56;QD=34.55;SB=-1115.14	GT:AD:DP:GL:GQ	1/1:0,77:73:-269.66,-21.99,-0.02:99
-chr1	790246	rs4951931	C	T	190.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=47.97;MQ0=4;OQ=2808.35;QD=36.95;SB=-1258.17	GT:AD:DP:GL:GQ	1/1:1,75:70:-284.44,-21.09,-0.02:99
-chr1	791806	rs7516866	C	T	78.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.85;MQ=49.91;MQ0=4;OQ=2127.43;QD=34.88;SB=-1017.37	GT:AD:DP:GL:GQ	1/1:0,61:56:-216.36,-16.88,-0.03:99
-chr1	791858	rs7553084	G	A	0.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=36.92;MQ0=13;OQ=63.33;QD=1.47;SB=-33.64	GT:AD:DP:GL:GQ	0/1:29,14:21:-15.95,-6.33,-55.40:96.17
-chr1	791869	rs9700144	T	C	36.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=30.98;MQ0=16;OQ=499.95;QD=11.90;SB=-156.35	GT:AD:DP:GL:GQ	0/1:18,24:19:-59.00,-5.72,-11.19:54.70
-chr1	791956	rs7553197	G	A	67.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=36.93;MQ0=8;OQ=1294.09;QD=27.53;SB=-402.66	GT:AD:DP:GL:GQ	1/1:3,44:34:-133.00,-10.24,-0.01:99
-chr1	792054	.	G	A	0.09	PASS	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=2.92;MQ=30.80;MQ0=19;OQ=223.16;QD=2.37;SB=-57.50	GT:AD:DP:GL:GQ	0/1:66,28:40:-37.67,-12.07,-95.70:99
-chr1	792085	rs61768213	G	A	0.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=11.76;MQ=27.41;MQ0=19;OQ=204.34;QD=1.93;SB=-8.44	GT:AD:DP:GL:GQ	0/1:88,18:55:-40.31,-16.60,-140.17:99
-chr1	792094	rs59334306	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=46.76;MQ=26.45;MQ0=20;OQ=280.32;QD=2.64;SB=-7.86	GT:AD:DP:GL:GQ	0/1:75,30:53:-47.28,-15.96,-151.37:99
-chr1	792103	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=25.85;MQ=29.18;MQ0=20;OQ=339.53;QD=3.09;SB=-172.66	GT:AD:DP:GL:GQ	0/1:84,26:61:-55.65,-18.41,-142.90:99
-chr1	792163	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=94;Dels=0.02;HRun=3;HaplotypeScore=9.77;MQ=36.34;MQ0=8;OQ=472.25;QD=5.02;SB=-153.68	GT:AD:DP:GL:GQ	0/1:49,43:64:-69.50,-18.99,-156.72:99
-chr1	792183	.	G	A	7.22	PASS	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=4.86;MQ=42.20;MQ0=9;OQ=1359.41;QD=15.27;SB=-245.27	GT:AD:DP:GL:GQ	0/1:36,53:59:-157.01,-17.79,-57.64:99
-chr1	792201	.	G	A	0.06	PASS	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=43.46;MQ0=8;OQ=234.21;QD=2.47;SB=6.27	GT:AD:DP:GL:GQ	0/1:68,27:69:-47.53,-20.82,-170.85:99
-chr1	792244	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=1;HaplotypeScore=3.46;MQ=47.18;MQ0=4;OQ=75.38;QD=1.05;SB=92.33	GT:AD:DP:GL:GQ	0/1:49,23:53:-26.79,-15.97,-181.50:99
-chr1	793978	rs9725068	G	A	105.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.47;MQ0=13;OQ=1474.93;QD=26.34;SB=-321.42	GT:AD:DP:GL:GQ	1/1:0,56:37:-151.09,-11.15,-0.01:99
-chr1	794403	rs11240778	T	C	115.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.32;MQ0=0;OQ=2475.68;QD=30.95;SB=-1150.98	GT:AD:DP:GL:GQ	1/1:0,80:77:-251.22,-23.23,-0.07:99
-chr1	797375	rs10751454	A	G	614.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.93;MQ0=1;OQ=2184.15;QD=34.67;SB=-971.41	GT:AD:DP:GL:GQ	1/1:0,63:61:-222.02,-18.37,-0.02:99
-chr1	797624	rs4951932	C	A	532.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.69;MQ0=0;OQ=2699.27;QD=36.48;SB=-1270.15	GT:AD:DP:GL:GQ	1/1:0,74:72:-273.52,-21.68,-0.01:99
-chr1	798086	rs4951933	G	C	74.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=48.23;MQ0=3;OQ=1918.57;QD=25.24;SB=-881.14	GT:AD:DP:GL:GQ	1/1:5,71:54:-198.81,-16.33,-3.37:99
-chr1	798494	rs11240779	G	A	160.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=54.32;MQ0=0;OQ=2346.63;QD=37.85;SB=-859.15	GT:AD:DP:GL:GQ	1/1:0,62:60:-238.27,-18.08,-0.02:99
-chr1	798785	rs6594027	G	A	211.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.48;MQ=43.75;MQ0=6;OQ=1743.42;QD=29.06;SB=-625.73	GT:AD:DP:GL:GQ	1/1:3,57:47:-180.84,-14.16,-2.92:99
-chr1	798791	rs11240780	C	T	1.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.98;MQ=44.87;MQ0=5;OQ=1874.68;QD=30.73;SB=-625.19	GT:AD:DP:GL:GQ	1/1:3,58:49:-194.73,-14.76,-3.68:99
-chr1	801153	rs6683530	G	C	58.35	Indel	AC=1;AF=0.50;AN=2;DB;DP=8;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=47.12;MQ0=0;QD=7.29;SB=-48.46	GT:AD:DP:GL:GQ	0/1:3,5:6:-10.93,-1.81,-12.15:91.19
-chr1	801443	.	G	C	0.04	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DP=3;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=38.48;MQ0=1;OQ=52.85;QD=17.62;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,3:2:-8.69,-0.60,-0.00:6.02
-chr1	801493	.	G	A	49.74	LowQual	AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=43.23;MQ0=0;QD=5.53;SB=-18.25	GT:AD:DP:GL:GQ	0/1:2,4:4:-12.63,-4.37,-6.30:19.25
-chr1	801563	.	C	G	14.05	LowQual	AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=3.71;MQ=42.60;MQ0=0;QD=1.40;SB=-3.98	GT:AD:DP:GL:GQ	0/1:8,2:7:-6.79,-2.12,-21.33:46.71
-chr1	801598	.	T	C	10.44	PASS	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=49.26;MQ0=0;OQ=130.47;QD=6.21;SB=-25.63	GT:AD:DP:GL:GQ	0/1:13,8:15:-20.85,-4.52,-36.05:99
-chr1	801628	.	C	T	6.09	PASS	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=52.56;MQ0=0;OQ=245.60;QD=14.45;SB=-39.65	GT:AD:DP:GL:GQ	0/1:7,10:12:-31.46,-3.62,-11.96:83.42
-chr1	802130	rs7541694	A	G	69.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=3.34;MQ=55.65;MQ0=0;OQ=1955.23;QD=29.18;SB=-933.35	GT:AD:DP:GL:GQ	1/1:0,67:63:-199.17,-19.00,-0.06:99
-chr1	802147	rs7545373	C	G	33.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=3.57;MQ=55.54;MQ0=0;OQ=2348.31;QD=37.27;SB=-1198.48	GT:AD:DP:GL:GQ	1/1:2,61:60:-246.74,-18.09,-8.33:97.66
-chr1	802165	.	G	A	18.16	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.79;MQ=55.42;MQ0=0;QD=0.31;SB=71.21	GT:AD:DP:GL:GQ	0/1:51,8:51:-20.46,-15.37,-155.58:50.93
-chr1	802175	.	C	T	26.53	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=55.08;MQ0=0;QD=0.48;SB=56.20	GT:AD:DP:GL:GQ	0/1:46,8:48:-20.39,-14.46,-154.35:59.35
-chr1	802189	.	G	A	11.38	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=55.49;MQ0=0;QD=0.20;SB=56.19	GT:AD:DP:GL:GQ	0/1:49,8:51:-19.75,-15.37,-163.52:43.89
-chr1	802470	.	T	C	21.38	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=54.38;MQ0=1;QD=0.34;SB=62.23	GT:AD:DP:GL:GQ	0/1:57,6:59:-23.19,-17.77,-210.98:54.19
-chr1	802488	.	G	T	29.03	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=3.58;MQ=53.89;MQ0=1;QD=0.53;SB=65.21	GT:AD:DP:GL:GQ	0/1:49,6:52:-21.85,-15.66,-163.62:61.86
-chr1	802614	rs4246500	T	C	405.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=1600.84;QD=34.80;SB=-568.88	GT:AD:DP:GL:GQ	1/1:0,46:45:-163.68,-13.56,-0.02:99
-chr1	803503	rs16973606	A	G	11.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.56;MQ=28.75;MQ0=1;OQ=1669.54;QD=28.30;SB=-566.93	GT:AD:DP:GL:GQ	1/1:0,58:52:-170.59,-15.68,-0.05:99
-chr1	803610	rs4970388	G	A	620.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.63;MQ0=0;OQ=2297.43;QD=38.94;SB=-1171.71	GT:AD:DP:GL:GQ	1/1:0,59:58:-233.34,-17.47,-0.02:99
-chr1	803950	.	C	A	24.11	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=7.91;MQ=35.01;MQ0=10;QD=0.32;SB=59.14	GT:AD:DP:GL:GQ	0/1:54,21:50:-20.76,-15.06,-152.32:56.93
-chr1	803957	rs61768235	A	G	0.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=7.75;MQ=34.03;MQ0=10;OQ=322.16;QD=4.30;SB=35.12	GT:AD:DP:GL:GQ	0/1:42,30:47:-49.67,-14.18,-120.05:99
-chr1	803968	.	C	T	1.63	PASS	AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=30.80;MQ0=12;OQ=418.55;QD=4.81;SB=59.13	GT:AD:DP:GL:GQ	0/1:53,34:61:-63.53,-18.39,-146.32:99
-chr1	804010	rs4268301	G	C	0.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=0;HaplotypeScore=6.53;MQ=32.14;MQ0=12;OQ=1062.36;QD=10.84;SB=53.20	GT:AD:DP:GL:GQ	0/1:43,55:71:-130.91,-21.39,-167.36:99
-chr1	804023	.	C	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=2;HaplotypeScore=7.44;MQ=36.24;MQ0=5;OQ=967.44;QD=10.63;SB=62.24	GT:AD:DP:GL:GQ	0/1:48,43:70:-121.12,-21.09,-190.26:99
-chr1	804036	.	A	T	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=7.15;MQ=36.45;MQ0=7;OQ=717.66;QD=8.34;SB=65.21	GT:AD:DP:GL:GQ	0/1:47,38:68:-95.53,-20.48,-155.46:99
-chr1	804078	rs4468103	A	G	426.89	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=12.81;MQ=43.94;MQ0=3;QD=5.62;SB=77.26	GT:AD:DP:GL:GQ	0/1:53,23:63:-64.96,-18.98,-178.46:99
-chr1	804080	rs34234497	C	A	381.14	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=12.71;MQ=43.70;MQ0=3;QD=4.95;SB=89.27	GT:AD:DP:GL:GQ	0/1:53,24:67:-61.57,-20.18,-178.60:99
-chr1	804083	.	C	A	27.31	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=12.71;MQ=43.58;MQ0=4;QD=0.34;SB=86.24	GT:AD:DP:GL:GQ	0/1:70,11:67:-26.19,-20.18,-214.42:60.14
-chr1	804127	rs4571914	C	T	3.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=96;Dels=0.00;HRun=1;HaplotypeScore=3.93;MQ=47.10;MQ0=4;OQ=2988.66;QD=31.13;SB=-1433.34	GT:AD:DP:GL:GQ	1/1:3,93:75:-302.47,-22.59,-0.02:99
-chr1	804160	.	T	A	1.44	PASS	AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=46.18;MQ0=5;OQ=470.49;QD=4.06;SB=48.91	GT:AD:DP:GL:GQ	0/1:72,44:82:-75.03,-24.70,-237.11:99
-chr1	804163	.	T	A	0.61	PASS	AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=45.72;MQ0=5;OQ=536.43;QD=4.62;SB=45.90	GT:AD:DP:GL:GQ	0/1:71,45:81:-81.32,-24.40,-231.88:99
-chr1	804176	.	C	T	0.11	PASS	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=42.84;MQ0=5;OQ=284.28;QD=2.41;SB=31.59	GT:AD:DP:GL:GQ	0/1:90,28:84:-57.01,-25.30,-251.94:99
-chr1	804255	rs61768236	C	T	415.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=27.82;MQ0=7;OQ=1235.94;QD=11.44;SB=-464.41	GT:AD:DP:GL:GQ	0/1:49,59:70:-147.96,-21.08,-123.48:99
-chr1	804268	rs61768237	T	C	267.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=128;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.38;MQ0=8;OQ=1449.21;QD=11.32;SB=-624.62	GT:AD:DP:GL:GQ	0/1:53,75:88:-174.71,-26.51,-156.34:99
-chr1	804322	.	T	C	170.65	PASS	AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.67;MQ0=9;OQ=1734.45;QD=11.19;SB=-540.49	GT:AD:DP:GL:GQ	0/1:72,83:118:-212.27,-35.54,-249.66:99
-chr1	804353	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=4;HaplotypeScore=24.21;MQ=44.77;MQ0=2;OQ=299.39;QD=2.32;SB=-27.46	GT:AD:DP:GL:GQ	0/1:106,23:112:-66.96,-33.74,-330.98:99
-chr1	804358	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=1;HaplotypeScore=23.14;MQ=46.13;MQ0=0;OQ=958.19;QD=8.33;SB=-257.80	GT:AD:DP:GL:GQ	0/1:68,47:100:-129.23,-30.12,-232.16:99
-chr1	804472	.	A	T	0.19	PASS	AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=0;HaplotypeScore=5.00;MQ=48.14;MQ0=4;OQ=798.74;QD=6.89;SB=107.38	GT:AD:DP:GL:GQ	0/1:75,41:98:-112.67,-29.52,-266.53:99
-chr1	804474	.	A	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=2;HaplotypeScore=5.00;MQ=47.90;MQ0=4;OQ=704.41;QD=6.18;SB=101.34	GT:AD:DP:GL:GQ	0/1:73,41:96:-102.63,-28.91,-247.09:99
-chr1	804544	.	A	T	0.11	PASS	AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=0;HaplotypeScore=3.62;MQ=40.45;MQ0=6;OQ=406.04;QD=3.15;SB=95.34	GT:AD:DP:GL:GQ	0/1:99,30:89:-70.69,-26.81,-271.16:99
-chr1	804557	.	A	C	0.23	PASS	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=3.14;MQ=40.10;MQ0=5;OQ=416.51;QD=3.82;SB=86.28	GT:AD:DP:GL:GQ	0/1:65,43:73:-66.93,-21.99,-180.79:99
-chr1	804573	.	G	A	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=8.85;MQ=43.02;MQ0=4;OQ=579.16;QD=6.16;SB=83.29	GT:AD:DP:GL:GQ	0/1:56,38:69:-81.99,-20.79,-176.35:99
-chr1	804594	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=7.80;MQ=47.78;MQ0=4;OQ=294.82;QD=3.04;SB=104.36	GT:AD:DP:GL:GQ	0/1:66,31:74:-55.06,-22.29,-235.53:99
-chr1	804605	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=13.95;MQ=49.87;MQ0=3;OQ=284.24;QD=2.81;SB=113.40	GT:AD:DP:GL:GQ	0/1:73,28:82:-56.44,-24.73,-279.54:99
-chr1	804976	.	T	C	11.87	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=17.62;MQ=47.74;MQ0=10;QD=0.07;SB=128.44	GT:AD:DP:GL:GQ	0/1:107,52:112:-38.18,-33.74,-401.64:44.42
-chr1	805001	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=241;Dels=0.00;HRun=1;HaplotypeScore=76.93;MQ=42.40;MQ0=12;OQ=1246.68;QD=5.17;SB=146.50	GT:AD:DP:GL:GQ	0/1:129,112:153:-174.09,-46.14,-468.17:99
-chr1	805002	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=0;HaplotypeScore=75.93;MQ=42.40;MQ0=13;OQ=1673.16;QD=6.89;SB=-6.76	GT:AD:DP:GL:GQ	0/1:105,138:154:-217.01,-46.41,-335.99:99
-chr1	805021	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=298;Dels=0.00;HRun=1;HaplotypeScore=153.68;MQ=38.48;MQ0=13;OQ=1337.90;QD=4.49;SB=-19.37	GT:AD:DP:GL:GQ	0/1:146,152:156:-184.06,-46.99,-421.14:99
-chr1	805031	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=318;Dels=0.00;HRun=0;HaplotypeScore=207.07;MQ=37.99;MQ0=12;OQ=1684.06;QD=5.30;SB=131.37	GT:AD:DP:GL:GQ	0/1:175,143:165:-221.39,-49.70,-405.98:99
-chr1	805042	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=340;Dels=0.00;HRun=0;HaplotypeScore=155.12;MQ=37.32;MQ0=17;OQ=677.06;QD=1.99;SB=140.48	GT:AD:DP:GL:GQ	0/1:285,55:199:-130.92,-59.93,-605.02:99
-chr1	805044	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=339;Dels=0.00;HRun=1;HaplotypeScore=156.13;MQ=36.94;MQ0=19;OQ=889.27;QD=2.62;SB=-0.09	GT:AD:DP:GL:GQ	0/1:243,95:179:-146.12,-53.91,-499.80:99
-chr1	805060	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=354;Dels=0.00;HRun=0;HaplotypeScore=82.46;MQ=36.20;MQ0=28;OQ=262.53;QD=0.74;SB=131.47	GT:AD:DP:GL:GQ	0/1:269,85:206:-91.58,-62.05,-725.20:99
-chr1	805070	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=335;Dels=0.00;HRun=0;HaplotypeScore=72.27;MQ=36.04;MQ0=29;OQ=243.31;QD=0.73;SB=122.43	GT:AD:DP:GL:GQ	0/1:284,51:196:-86.65,-59.04,-686.22:99
-chr1	805096	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=276;Dels=0.00;HRun=1;HaplotypeScore=49.35;MQ=36.73;MQ0=27;OQ=2126.16;QD=7.70;SB=101.36	GT:AD:DP:GL:GQ	0/1:81,194:152:-261.68,-45.78,-320.28:99
-chr1	805097	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=277;Dels=0.00;HRun=0;HaplotypeScore=50.14;MQ=36.84;MQ0=27;OQ=2166.21;QD=7.82;SB=104.34	GT:AD:DP:GL:GQ	0/1:80,196:153:-269.55,-49.64,-287.57:99
-chr1	805200	.	G	T	14.62	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=163;Dels=0.00;HRun=0;HaplotypeScore=25.70;MQ=44.88;MQ0=22;QD=0.09;SB=134.45	GT:AD:DP:GL:GQ	0/1:137,26:122:-41.47,-36.74,-399.49:47.31
-chr1	805236	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=3;HaplotypeScore=58.62;MQ=48.88;MQ0=19;OQ=385.49;QD=2.77;SB=18.48	GT:AD:DP:GL:GQ	0/1:87,52:105:-73.46,-31.63,-322.22:99
-chr1	805261	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=234;Dels=0.00;HRun=0;HaplotypeScore=375.75;MQ=40.95;MQ0=20;OQ=701.87;QD=3.00;SB=-184.24	GT:AD:DP:GL:GQ	0/1:132,101:136:-114.44,-40.97,-420.32:99
-chr1	805262	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=240;Dels=0.00;HRun=0;HaplotypeScore=355.61;MQ=40.41;MQ0=21;OQ=112.78;QD=0.47;SB=-10.32	GT:AD:DP:GL:GQ	0/1:195,42:136:-62.96,-48.40,-549.49:99
-chr1	805283	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=350;Dels=0.00;HRun=0;HaplotypeScore=86.54;MQ=35.73;MQ0=32;OQ=70.17;QD=0.20;SB=7.66	GT:AD:DP:GL:GQ	0/1:314,35:208:-72.95,-62.65,-681.33:99
-chr1	805284	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=355;Dels=0.00;HRun=0;HaplotypeScore=88.37;MQ=35.41;MQ0=32;OQ=4656.41;QD=13.12;SB=-1324.68	GT:AD:DP:GL:GQ	0/1:83,272:209:-464.64,-62.96,-333.94:99
-chr1	805326	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=520;Dels=0.00;HRun=0;HaplotypeScore=98.56;MQ=31.27;MQ0=33;OQ=692.81;QD=1.33;SB=-240.64	GT:AD:DP:GL:GQ	0/1:439,81:305:-164.43,-91.87,-1058.15:99
-chr1	805332	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=545;Dels=0.00;HRun=2;HaplotypeScore=105.70;MQ=31.02;MQ0=35;OQ=141.69;QD=0.26;SB=-23.90	GT:AD:DP:GL:GQ	0/1:483,62:326:-115.64,-98.18,-1059.59:99
-chr1	805355	.	A	G	982.52	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=566;Dels=0.00;HRun=0;HaplotypeScore=511.67;MQ=31.08;MQ0=42;QD=1.74;SB=-163.90	GT:AD:DP:GL:GQ	0/1:444,82:337:-230.52,-128.98,-1164.43:99
-chr1	805360	.	A	G	1795.44	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=565;Dels=0.00;HRun=0;HaplotypeScore=478.07;MQ=31.09;MQ0=46;QD=3.18;SB=-791.73	GT:AD:DP:GL:GQ	0/1:432,132:335:-287.21,-104.38,-1038.16:99
-chr1	805365	.	T	C	1655.74	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=542;Dels=0.00;HRun=0;HaplotypeScore=449.89;MQ=31.32;MQ0=44;QD=3.05;SB=-765.34	GT:AD:DP:GL:GQ	0/1:385,157:321:-265.54,-96.68,-1024.45:99
-chr1	805383	rs61768238	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=498;Dels=0.00;HRun=3;HaplotypeScore=98.26;MQ=31.16;MQ0=41;OQ=7913.78;QD=15.89;SB=-2299.71	GT:AD:DP:GL:GQ	0/1:75,423:268:-790.38,-80.71,-278.68:99
-chr1	805386	rs61768239	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=483;Dels=0.00;HRun=1;HaplotypeScore=91.10;MQ=31.39;MQ0=41;OQ=3141.51;QD=6.50;SB=-667.16	GT:AD:DP:GL:GQ	0/1:227,256:265:-397.24,-79.81,-626.74:99
-chr1	805419	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=411;Dels=0.00;HRun=1;HaplotypeScore=30.13;MQ=32.93;MQ0=34;OQ=719.57;QD=1.75;SB=-330.57	GT:AD:DP:GL:GQ	0/1:225,186:205:-136.99,-61.75,-686.74:99
-chr1	805436	rs61768240	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=352;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=34.71;MQ0=24;OQ=2408.76;QD=6.84;SB=-1167.64	GT:AD:DP:GL:GQ	0/1:93,259:163:-293.26,-49.10,-323.35:99
-chr1	805464	.	T	C	90.93	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=2;HaplotypeScore=145.78;MQ=37.92;MQ0=13;QD=0.36;SB=50.70	GT:AD:DP:GL:GQ	0/1:218,34:131:-51.84,-39.46,-473.80:99
-chr1	805469	.	G	A	411.01	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=232;Dels=0.00;HRun=0;HaplotypeScore=129.65;MQ=39.23;MQ0=10;QD=1.77;SB=-144.72	GT:AD:DP:GL:GQ	0/1:163,68:125:-82.03,-37.65,-380.30:99
-chr1	805474	.	C	T	980.44	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=4;HaplotypeScore=70.79;MQ=41.63;MQ0=7;QD=4.83;SB=-326.68	GT:AD:DP:GL:GQ	0/1:87,114:116:-136.29,-34.97,-264.49:99
-chr1	805480	.	G	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=196;Dels=0.00;HRun=1;HaplotypeScore=5.97;MQ=42.07;MQ0=5;OQ=803.65;QD=4.10;SB=-259.91	GT:AD:DP:GL:GQ	0/1:87,109:116:-118.58,-34.93,-301.30:99
-chr1	805558	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=180;Dels=0.00;HRun=0;HaplotypeScore=21.59;MQ=45.69;MQ0=3;OQ=812.25;QD=4.51;SB=-279.67	GT:AD:DP:GL:GQ	0/1:110,69:130:-123.67,-39.16,-392.54:99
-chr1	805591	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=218;Dels=0.00;HRun=0;HaplotypeScore=34.23;MQ=41.40;MQ0=5;OQ=1850.17;QD=8.49;SB=-635.41	GT:AD:DP:GL:GQ	0/1:84,134:148:-232.88,-44.58,-338.13:99
-chr1	805603	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=239;Dels=0.00;HRun=0;HaplotypeScore=49.54;MQ=40.33;MQ0=6;OQ=1757.35;QD=7.35;SB=-559.93	GT:AD:DP:GL:GQ	0/1:109,130:154:-225.41,-46.39,-351.31:99
-chr1	805620	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=274;Dels=0.00;HRun=0;HaplotypeScore=50.16;MQ=37.51;MQ0=8;OQ=230.26;QD=0.84;SB=134.91	GT:AD:DP:GL:GQ	0/1:246,28:171:-77.81,-51.50,-552.70:99
-chr1	805666	.	G	A	1332.87	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=339;Dels=0.00;HRun=0;HaplotypeScore=203.60;MQ=35.75;MQ0=0;QD=3.93;SB=119.41	GT:AD:DP:GL:GQ	0/1:281,58:223:-203.73,-67.16,-610.84:99
-chr1	805667	.	T	G	1225.05	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=341;Dels=0.00;HRun=2;HaplotypeScore=286.55;MQ=35.76;MQ0=2;QD=3.59;SB=122.41	GT:AD:DP:GL:GQ	0/1:261,66:222:-230.10,-104.31,-623.63:99
-chr1	805699	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=311;Dels=0.00;HRun=0;HaplotypeScore=73.71;MQ=35.76;MQ0=12;OQ=1765.48;QD=5.68;SB=-47.39	GT:AD:DP:GL:GQ	0/1:139,171:182:-234.66,-54.83,-454.10:99
-chr1	805716	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=281;Dels=0.00;HRun=1;HaplotypeScore=131.75;MQ=37.99;MQ0=12;OQ=2170.35;QD=7.72;SB=-121.23	GT:AD:DP:GL:GQ	0/1:87,193:163:-269.41,-49.09,-357.63:99
-chr1	805720	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=282;Dels=0.00;HRun=0;HaplotypeScore=145.61;MQ=38.29;MQ0=13;OQ=527.98;QD=1.87;SB=137.43	GT:AD:DP:GL:GQ	0/1:237,44:165:-105.78,-49.70,-509.42:99
-chr1	805742	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=240;Dels=0.00;HRun=1;HaplotypeScore=47.83;MQ=40.90;MQ0=15;OQ=1225.89;QD=5.11;SB=-296.81	GT:AD:DP:GL:GQ	0/1:97,143:138:-167.44,-41.57,-348.72:99
-chr1	805786	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=0;HaplotypeScore=3.15;MQ=44.26;MQ0=7;OQ=155.59;QD=0.86;SB=-81.22	GT:AD:DP:GL:GQ	0/1:95,86:108:-51.37,-32.53,-383.93:99
-chr1	805792	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=0;HaplotypeScore=9.50;MQ=44.61;MQ0=6;OQ=192.56;QD=1.10;SB=-88.24	GT:AD:DP:GL:GQ	0/1:93,82:108:-55.07,-32.53,-377.29:99
-chr1	805825	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=165;Dels=0.00;HRun=0;HaplotypeScore=9.99;MQ=46.58;MQ0=3;OQ=327.36;QD=1.98;SB=-101.34	GT:AD:DP:GL:GQ	0/1:95,70:115:-70.67,-34.65,-378.60:99
-chr1	805831	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=154;Dels=0.00;HRun=0;HaplotypeScore=10.96;MQ=47.14;MQ0=3;OQ=324.94;QD=2.11;SB=-17.64	GT:AD:DP:GL:GQ	0/1:97,57:110:-68.91,-33.13,-331.34:99
-chr1	805897	.	G	T	104.51	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=0;HaplotypeScore=35.45;MQ=51.05;MQ0=2;QD=0.74;SB=119.34	GT:AD:DP:GL:GQ	0/1:121,19:121:-50.18,-36.44,-386.79:99
-chr1	805898	.	C	A	129.42	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=0;HaplotypeScore=35.61;MQ=51.05;MQ0=2;QD=0.91;SB=116.38	GT:AD:DP:GL:GQ	0/1:123,19:121:-52.67,-36.45,-375.35:99
-chr1	805905	.	T	G	13.51	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=0;HaplotypeScore=25.14;MQ=52.44;MQ0=2;QD=0.10;SB=92.42	GT:AD:DP:GL:GQ	0/1:98,32:107:-36.84,-32.23,-356.89:46.15
-chr1	806044	.	T	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=182;Dels=0.00;HRun=0;HaplotypeScore=16.71;MQ=40.59;MQ0=35;OQ=921.37;QD=5.06;SB=-438.60	GT:AD:DP:GL:GQ	0/1:71,111:106:-127.34,-31.92,-261.51:99
-chr1	806066	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=250;Dels=0.00;HRun=1;HaplotypeScore=9.43;MQ=37.37;MQ0=38;OQ=287.57;QD=1.15;SB=103.29	GT:AD:DP:GL:GQ	0/1:214,36:146:-76.01,-43.97,-467.77:99
-chr1	806081	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=255;Dels=0.00;HRun=0;HaplotypeScore=39.62;MQ=37.88;MQ0=27;OQ=908.24;QD=3.56;SB=97.71	GT:AD:DP:GL:GQ	0/1:178,77:158:-141.71,-47.60,-556.49:99
-chr1	806157	.	T	C	806.81	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=215;Dels=0.00;HRun=0;HaplotypeScore=71.06;MQ=40.64;MQ0=4;QD=3.75;SB=110.40	GT:AD:DP:GL:GQ	0/1:92,123:126:-121.92,-37.95,-368.73:99
-chr1	806159	.	A	C	141.17	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=219;Dels=0.00;HRun=0;HaplotypeScore=72.96;MQ=40.68;MQ0=4;QD=0.64;SB=110.38	GT:AD:DP:GL:GQ	0/1:166,49:128:-59.78,-42.38,-415.09:99
-chr1	806180	.	A	G	18.74	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=200;Dels=0.00;HRun=0;HaplotypeScore=59.33;MQ=41.65;MQ0=4;QD=0.09;SB=116.41	GT:AD:DP:GL:GQ	0/1:140,60:110:-38.29,-33.13,-408.92:51.52
-chr1	806197	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=201;Dels=0.00;HRun=1;HaplotypeScore=58.42;MQ=43.62;MQ0=5;OQ=190.94;QD=0.95;SB=134.47	GT:AD:DP:GL:GQ	0/1:110,91:116:-57.32,-34.94,-409.71:99
-chr1	806222	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=4;HaplotypeScore=6.94;MQ=47.96;MQ0=4;OQ=291.81;QD=1.80;SB=146.43	GT:AD:DP:GL:GQ	0/1:98,64:114:-66.80,-34.33,-354.69:99
-chr1	806232	.	T	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=151;Dels=0.00;HRun=1;HaplotypeScore=11.98;MQ=49.02;MQ0=3;OQ=233.87;QD=1.55;SB=140.48	GT:AD:DP:GL:GQ	0/1:96,55:110:-59.80,-33.13,-362.79:99
-chr1	806258	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=0;HaplotypeScore=10.30;MQ=50.03;MQ0=8;OQ=407.17;QD=2.51;SB=100.40	GT:AD:DP:GL:GQ	0/1:106,56:126:-81.95,-37.95,-384.61:99
-chr1	806268	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=1;HaplotypeScore=25.82;MQ=48.78;MQ0=9;OQ=670.14;QD=4.09;SB=84.39	GT:AD:DP:GL:GQ	0/1:109,55:126:-108.24,-37.95,-362.57:99
-chr1	806273	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=170;Dels=0.00;HRun=0;HaplotypeScore=24.82;MQ=48.14;MQ0=9;OQ=549.55;QD=3.23;SB=88.59	GT:AD:DP:GL:GQ	0/1:119,51:130:-97.39,-39.15,-372.33:99
-chr1	806316	.	T	G	0.95	PASS	AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=0;HaplotypeScore=6.00;MQ=41.01;MQ0=11;OQ=1685.25;QD=7.49;SB=-248.74	GT:AD:DP:GL:GQ	0/1:86,139:148:-216.38,-44.57,-322.16:99
-chr1	806332	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=267;Dels=0.00;HRun=0;HaplotypeScore=118.47;MQ=40.66;MQ0=10;OQ=669.93;QD=2.51;SB=-242.01	GT:AD:DP:GL:GQ	0/1:204,61:176:-123.31,-53.03,-632.31:99
-chr1	806338	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=0;HaplotypeScore=122.42;MQ=40.64;MQ0=8;OQ=2439.01;QD=9.17;SB=-856.79	GT:AD:DP:GL:GQ	0/1:98,144:180:-333.38,-86.20,-389.89:99
-chr1	806349	.	G	A	3132.30	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=280;Dels=0.07;HRun=0;HaplotypeScore=186.48;MQ=39.25;MQ0=4;QD=11.19;SB=-1153.15	GT:AD:DP:GL:GQ	0/1:91,170:182:-371.34,-54.83,-329.61:99
-chr1	806378	rs61768241	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=371;Dels=0.00;HRun=0;HaplotypeScore=37.20;MQ=35.74;MQ0=10;OQ=1136.07;QD=3.06;SB=-392.71	GT:AD:DP:GL:GQ	0/1:284,87:244:-190.38,-73.49,-742.15:99
-chr1	806405	.	A	T	171.83	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=402;Dels=0.02;HRun=5;HaplotypeScore=383.28;MQ=34.90;MQ0=14;QD=0.43;SB=-100.81	GT:AD:DP:GL:GQ	0/1:350,43:240:-91.25,-70.78,-803.92:99
-chr1	806411	.	A	T	5745.19	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=405;Dels=0.00;HRun=5;HaplotypeScore=552.66;MQ=35.31;MQ0=14;QD=14.19;SB=-2306.85	GT:AD:DP:GL:GQ	0/1:102,301:243:-573.52,-72.58,-344.41:99
-chr1	806412	.	A	T	2395.75	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=407;Dels=0.00;HRun=0;HaplotypeScore=506.57;MQ=35.27;MQ0=14;QD=5.89;SB=-1049.34	GT:AD:DP:GL:GQ	0/1:219,186:244:-315.74,-72.89,-600.57:99
-chr1	806419	.	G	T	930.64	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=433;Dels=0.00;HRun=4;HaplotypeScore=220.68;MQ=34.42;MQ0=17;QD=2.15;SB=-419.01	GT:AD:DP:GL:GQ	0/1:342,91:258:-174.05,-77.70,-758.54:99
-chr1	806424	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=450;Dels=0.00;HRun=4;HaplotypeScore=249.41;MQ=33.94;MQ0=20;OQ=971.28;QD=2.16;SB=-437.51	GT:AD:DP:GL:GQ	0/1:358,92:263:-179.62,-79.21,-806.78:99
-chr1	806430	rs61768242	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=441;Dels=0.01;HRun=1;HaplotypeScore=160.65;MQ=34.18;MQ0=22;OQ=1511.20;QD=3.43;SB=-624.36	GT:AD:DP:GL:GQ	0/1:304,134:257:-231.81,-77.41,-730.64:99
-chr1	806460	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=368;Dels=0.01;HRun=0;HaplotypeScore=18.13;MQ=35.78;MQ0=21;OQ=826.67;QD=2.25;SB=-89.07	GT:AD:DP:GL:GQ	0/1:306,59:217:-150.70,-64.75,-660.76:99
-chr1	806471	.	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=290;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=38.11;MQ0=12;OQ=2295.87;QD=7.92;SB=-836.85	GT:AD:DP:GL:GQ	0/1:88,202:166:-282.86,-49.99,-314.28:99
-chr1	806472	.	T	G	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=284;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=38.55;MQ0=12;OQ=2108.07;QD=7.42;SB=-683.52	GT:AD:DP:GL:GQ	0/1:91,193:165:-263.78,-49.69,-338.75:99
-chr1	806498	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=2;HaplotypeScore=28.30;MQ=42.69;MQ0=9;OQ=436.81;QD=2.11;SB=-20.91	GT:AD:DP:GL:GQ	0/1:161,46:144:-90.38,-43.41,-400.65:99
-chr1	806543	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=195;Dels=0.00;HRun=1;HaplotypeScore=100.50;MQ=43.92;MQ0=14;OQ=975.93;QD=5.00;SB=-107.11	GT:AD:DP:GL:GQ	0/1:89,101:124:-149.49,-48.61,-281.82:99
-chr1	806545	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=211;Dels=0.00;HRun=0;HaplotypeScore=104.33;MQ=43.14;MQ0=16;OQ=1451.12;QD=6.88;SB=-262.10	GT:AD:DP:GL:GQ	0/1:103,108:137:-189.66,-41.27,-324.56:99
-chr1	806559	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=338;Dels=0.00;HRun=5;HaplotypeScore=96.33;MQ=38.72;MQ0=24;OQ=1155.72;QD=3.42;SB=-374.82	GT:AD:DP:GL:GQ	0/1:243,83:209:-199.57,-80.72,-560.52:99
-chr1	806579	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=382;Dels=0.00;HRun=0;HaplotypeScore=77.21;MQ=36.57;MQ0=25;OQ=319.95;QD=0.84;SB=31.35	GT:AD:DP:GL:GQ	0/1:306,63:241:-152.76,-117.48,-790.42:99
-chr1	806588	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=408;Dels=0.00;HRun=0;HaplotypeScore=158.67;MQ=35.58;MQ0=25;OQ=4390.20;QD=10.76;SB=-833.37	GT:AD:DP:GL:GQ	0/1:156,252:245:-438.02,-73.80,-510.93:99
-chr1	806591	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=423;Dels=0.00;HRun=0;HaplotypeScore=153.73;MQ=35.14;MQ0=25;OQ=116.80;QD=0.28;SB=22.12	GT:AD:DP:GL:GQ	0/1:359,64:250:-90.26,-75.29,-922.92:99
-chr1	806599	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=465;Dels=0.00;HRun=3;HaplotypeScore=92.78;MQ=34.88;MQ0=25;OQ=533.96;QD=1.15;SB=-62.62	GT:AD:DP:GL:GQ	0/1:398,67:259:-134.68,-78.00,-790.36:99
-chr1	806614	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=552;Dels=0.00;HRun=4;HaplotypeScore=128.97;MQ=33.43;MQ0=27;OQ=171.34;QD=0.31;SB=81.53	GT:AD:DP:GL:GQ	0/1:512,39:328:-122.57,-102.16,-1083.77:99
-chr1	806616	.	A	C	48.77	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=560;Dels=0.00;HRun=0;HaplotypeScore=145.79;MQ=33.35;MQ0=27;QD=0.09;SB=125.19	GT:AD:DP:GL:GQ	0/1:521,38:333:-108.15,-99.99,-1104.08:81.61
-chr1	806647	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=500;Dels=0.00;HRun=1;HaplotypeScore=106.37;MQ=33.16;MQ0=15;OQ=6479.54;QD=12.96;SB=-2653.75	GT:AD:DP:GL:GQ	0/1:87,413:252:-646.95,-75.89,-317.53:99
-chr1	806652	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=463;Dels=0.00;HRun=0;HaplotypeScore=119.18;MQ=33.47;MQ0=16;OQ=6167.91;QD=13.32;SB=-2596.35	GT:AD:DP:GL:GQ	0/1:76,386:224:-615.79,-67.46,-279.43:99
-chr1	806659	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=412;Dels=0.00;HRun=0;HaplotypeScore=138.09;MQ=33.68;MQ0=14;OQ=4821.66;QD=11.70;SB=-2064.94	GT:AD:DP:GL:GQ	0/1:127,285:208:-481.17,-62.64,-276.81:99
-chr1	806663	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=403;Dels=0.00;HRun=1;HaplotypeScore=116.74;MQ=34.29;MQ0=14;OQ=4902.23;QD=12.16;SB=-2019.44	GT:AD:DP:GL:GQ	0/1:76,327:212:-489.22,-63.85,-279.67:99
-chr1	806698	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=346;Dels=0.00;HRun=0;HaplotypeScore=104.08;MQ=36.06;MQ0=23;OQ=205.16;QD=0.59;SB=41.51	GT:AD:DP:GL:GQ	0/1:305,41:216:-88.85,-65.05,-740.73:99
-chr1	806719	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=212;Dels=0.00;HRun=0;HaplotypeScore=400.08;MQ=40.22;MQ0=20;OQ=582.43;QD=2.75;SB=89.75	GT:AD:DP:GL:GQ	0/1:145,66:134:-101.59,-40.07,-419.05:99
-chr1	806735	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=218;Dels=0.00;HRun=0;HaplotypeScore=24.14;MQ=41.77;MQ0=24;OQ=129.16;QD=0.59;SB=143.49	GT:AD:DP:GL:GQ	0/1:169,49:138:-57.78,-41.58,-482.40:99
-chr1	806755	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=0;HaplotypeScore=72.66;MQ=42.05;MQ0=23;OQ=1702.34;QD=7.99;SB=-97.29	GT:AD:DP:GL:GQ	0/1:86,127:148:-218.09,-44.57,-348.93:99
-chr1	806758	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=212;Dels=0.00;HRun=0;HaplotypeScore=66.82;MQ=42.51;MQ0=24;OQ=101.05;QD=0.48;SB=140.48	GT:AD:DP:GL:GQ	0/1:180,31:147:-57.67,-44.28,-533.12:99
-chr1	806774	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=188;Dels=0.00;HRun=0;HaplotypeScore=33.98;MQ=43.76;MQ0=28;OQ=1370.17;QD=7.29;SB=4.43	GT:AD:DP:GL:GQ	0/1:94,94:136:-181.26,-40.96,-326.53:99
-chr1	806807	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=247;Dels=0.00;HRun=1;HaplotypeScore=84.17;MQ=41.43;MQ0=32;OQ=1901.04;QD=7.70;SB=-364.66	GT:AD:DP:GL:GQ	0/1:93,133:161:-255.61,-62.23,-399.73:99
-chr1	806819	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=264;Dels=0.00;HRun=1;HaplotypeScore=51.78;MQ=39.46;MQ0=35;OQ=117.55;QD=0.45;SB=-52.87	GT:AD:DP:GL:GQ	0/1:235,29:167:-65.33,-50.29,-569.53:99
-chr1	806835	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=278;Dels=0.00;HRun=0;HaplotypeScore=24.93;MQ=38.15;MQ0=32;OQ=3184.79;QD=11.46;SB=-1086.54	GT:AD:DP:GL:GQ	0/1:75,203:179:-375.67,-53.91,-276.38:99
-chr1	806857	.	A	G	426.69	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=388;Dels=0.00;HRun=0;HaplotypeScore=416.26;MQ=36.42;MQ0=33;QD=1.10;SB=-205.00	GT:AD:DP:GL:GQ	0/1:336,52:260:-124.27,-78.32,-915.07:99
-chr1	806858	.	A	C	2180.12	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=390;Dels=0.00;HRun=1;HaplotypeScore=419.10;MQ=36.36;MQ0=33;QD=5.59;SB=-410.18	GT:AD:DP:GL:GQ	0/1:135,134:259:-523.35,-302.06,-691.29:99
-chr1	806860	.	T	C	364.40	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=414;Dels=0.02;HRun=1;HaplotypeScore=391.10;MQ=36.35;MQ0=33;QD=0.88;SB=-200.49	GT:AD:DP:GL:GQ	0/1:360,44:277:-126.33,-86.61,-1004.70:99
-chr1	806864	.	G	A	1874.70	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=430;Dels=0.00;HRun=0;HaplotypeScore=443.75;MQ=36.02;MQ0=32;QD=4.36;SB=-378.35	GT:AD:DP:GL:GQ	0/1:340,90:284:-276.29,-85.54,-766.79:99
-chr1	806872	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=439;Dels=0.00;HRun=3;HaplotypeScore=61.91;MQ=35.95;MQ0=27;OQ=241.94;QD=0.55;SB=-56.85	GT:AD:DP:GL:GQ	0/1:394,45:294:-116.03,-88.55,-994.05:99
-chr1	806914	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=433;Dels=0.00;HRun=1;HaplotypeScore=82.84;MQ=36.13;MQ0=15;OQ=91.45;QD=0.21;SB=145.33	GT:AD:DP:GL:GQ	0/1:380,53:292:-100.38,-87.95,-1073.99:99
-chr1	806929	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=394;Dels=0.00;HRun=1;HaplotypeScore=53.78;MQ=36.16;MQ0=12;OQ=628.62;QD=1.60;SB=165.96	GT:AD:DP:GL:GQ	0/1:300,94:257:-143.55,-77.40,-778.57:99
-chr1	806933	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=384;Dels=0.00;HRun=1;HaplotypeScore=52.56;MQ=36.30;MQ0=13;OQ=624.21;QD=1.63;SB=148.11	GT:AD:DP:GL:GQ	0/1:298,86:253:-141.91,-76.20,-801.85:99
-chr1	807097	rs4970387	A	T	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=141;Dels=0.00;HRun=4;HaplotypeScore=35.71;MQ=49.47;MQ0=9;OQ=3569.50;QD=25.32;SB=-1647.14	GT:AD:DP:GL:GQ	1/1:0,141:95:-355.95,-28.62,-0.03:99
-chr1	807120	.	C	T	28.74	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=5;HaplotypeScore=8.47;MQ=47.00;MQ0=10;QD=0.19;SB=107.30	GT:AD:DP:GL:GQ	0/1:82,66:90:-33.27,-27.11,-295.41:61.57
-chr1	807127	.	C	G	240.31	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=32.57;MQ=46.64;MQ0=10;QD=1.61;SB=107.38	GT:AD:DP:GL:GQ	0/1:80,69:92:-55.04,-27.72,-340.23:99
-chr1	807132	.	T	C	652.10	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=152;Dels=0.00;HRun=1;HaplotypeScore=41.20;MQ=46.24;MQ0=10;QD=4.29;SB=107.38	GT:AD:DP:GL:GQ	0/1:77,75:102:-99.22,-30.73,-310.86:99
-chr1	807136	.	C	A	59.03	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=2;HaplotypeScore=75.46;MQ=45.64;MQ0=10;QD=0.36;SB=6.21	GT:AD:DP:GL:GQ	0/1:135,27:108:-41.72,-32.53,-330.47:91.87
-chr1	807137	.	T	G	132.15	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=74.46;MQ=45.79;MQ0=10;QD=0.83;SB=113.39	GT:AD:DP:GL:GQ	0/1:140,19:114:-50.84,-34.34,-356.98:99
-chr1	807144	.	G	C	321.19	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=0;HaplotypeScore=33.44;MQ=44.89;MQ0=10;QD=1.96;SB=17.66	GT:AD:DP:GL:GQ	0/1:131,27:122:-82.39,-46.99,-445.41:99
-chr1	807168	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=0;HaplotypeScore=236.47;MQ=42.45;MQ0=9;OQ=1209.57;QD=6.91;SB=-394.74	GT:AD:DP:GL:GQ	0/1:124,51:131:-163.71,-39.47,-414.74:99
-chr1	807169	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=262.45;MQ=42.56;MQ0=9;OQ=108.48;QD=0.61;SB=74.80	GT:AD:DP:GL:GQ	0/1:162,17:135:-54.79,-40.66,-456.43:99
-chr1	807188	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=186;Dels=0.01;HRun=8;HaplotypeScore=227.66;MQ=43.88;MQ0=1;OQ=1264.52;QD=6.80;SB=-460.79	GT:AD:DP:GL:GQ	0/1:118,67:149:-174.32,-44.58,-377.47:99
-chr1	807190	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=0;HaplotypeScore=246.34;MQ=43.75;MQ0=1;OQ=529.31;QD=2.86;SB=137.46	GT:AD:DP:GL:GQ	0/1:148,37:145:-99.89,-43.67,-443.33:99
-chr1	807204	.	A	C	36.37	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=188;Dels=0.00;HRun=0;HaplotypeScore=12.98;MQ=42.45;MQ0=6;QD=0.19;SB=109.90	GT:AD:DP:GL:GQ	0/1:167,21:153:-53.00,-46.08,-519.54:69.21
-chr1	807245	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=165;Dels=0.00;HRun=1;HaplotypeScore=17.90;MQ=38.97;MQ0=18;OQ=1145.58;QD=6.94;SB=-550.34	GT:AD:DP:GL:GQ	0/1:87,78:121:-154.28,-36.44,-312.35:99
-chr1	807259	.	G	A	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=152;Dels=0.00;HRun=1;HaplotypeScore=3.00;MQ=39.36;MQ0=20;OQ=646.71;QD=4.25;SB=-192.93	GT:AD:DP:GL:GQ	0/1:96,56:108:-100.48,-32.53,-300.21:99
-chr1	807350	rs4082611	G	A	0.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=152;Dels=0.00;HRun=0;HaplotypeScore=9.97;MQ=44.42;MQ0=8;OQ=866.67;QD=5.70;SB=98.31	GT:AD:DP:GL:GQ	0/1:80,69:106:-125.51,-35.56,-282.07:99
-chr1	807353	.	C	A	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=8.92;MQ=43.77;MQ0=8;OQ=867.33;QD=5.45;SB=95.29	GT:AD:DP:GL:GQ	0/1:76,83:108:-122.54,-32.52,-265.26:99
-chr1	807384	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=204;Dels=0.00;HRun=0;HaplotypeScore=61.52;MQ=40.31;MQ0=13;OQ=503.09;QD=2.47;SB=116.39	GT:AD:DP:GL:GQ	0/1:145,57:132:-93.37,-39.78,-338.75:99
-chr1	807385	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=1;HaplotypeScore=61.52;MQ=40.32;MQ0=13;OQ=1779.01;QD=8.76;SB=73.73	GT:AD:DP:GL:GQ	0/1:76,126:131:-220.64,-39.46,-278.09:99
-chr1	807400	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=1;HaplotypeScore=26.31;MQ=38.88;MQ0=12;OQ=2472.80;QD=10.18;SB=76.74	GT:AD:DP:GL:GQ	0/1:81,162:155:-297.25,-46.69,-297.33:99
-chr1	807412	rs4082610	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=262;Dels=0.00;HRun=4;HaplotypeScore=30.19;MQ=38.31;MQ0=9;OQ=2516.42;QD=9.60;SB=119.38	GT:AD:DP:GL:GQ	0/1:109,153:168:-305.53,-50.60,-311.50:99
-chr1	807432	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=262;Dels=0.00;HRun=0;HaplotypeScore=25.55;MQ=38.32;MQ0=6;OQ=4433.84;QD=16.92;SB=-160.81	GT:AD:DP:GL:GQ	0/1:80,182:176:-442.38,-53.03,-343.20:99
-chr1	807469	.	C	T	416.75	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=210;Dels=0.00;HRun=0;HaplotypeScore=92.28;MQ=41.14;MQ0=1;QD=1.98;SB=-49.34	GT:AD:DP:GL:GQ	0/1:84,126:97:-74.18,-29.22,-280.73:99
-chr1	807471	.	A	C	318.15	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=2;HaplotypeScore=90.45;MQ=41.29;MQ0=1;QD=1.49;SB=-31.35	GT:AD:DP:GL:GQ	0/1:85,128:99:-64.91,-29.81,-297.50:99
-chr1	807475	.	C	T	356.15	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=0;HaplotypeScore=174.77;MQ=40.93;MQ0=2;QD=1.67;SB=-36.29	GT:AD:DP:GL:GQ	0/1:85,128:101:-69.35,-30.45,-273.00:99
-chr1	807484	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=215;Dels=0.00;HRun=1;HaplotypeScore=266.19;MQ=40.31;MQ0=2;OQ=100.09;QD=0.47;SB=95.09	GT:AD:DP:GL:GQ	0/1:168,47:127:-51.55,-38.26,-450.15:99
-chr1	807508	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=1;HaplotypeScore=7.00;MQ=41.28;MQ0=4;OQ=211.72;QD=1.14;SB=90.69	GT:AD:DP:GL:GQ	0/1:142,43:119:-60.30,-35.84,-379.49:99
-chr1	807527	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=161;Dels=0.00;HRun=2;HaplotypeScore=9.95;MQ=41.68;MQ0=7;OQ=177.85;QD=1.10;SB=146.44	GT:AD:DP:GL:GQ	0/1:119,42:108:-53.60,-32.53,-346.10:99
-chr1	807556	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=137;Dels=0.00;HRun=1;HaplotypeScore=66.91;MQ=41.77;MQ0=6;OQ=532.40;QD=3.89;SB=-236.01	GT:AD:DP:GL:GQ	0/1:68,69:85:-82.13,-25.60,-230.23:99
-chr1	807561	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=140;Dels=0.00;HRun=0;HaplotypeScore=70.93;MQ=41.65;MQ0=7;OQ=124.65;QD=0.89;SB=101.32	GT:AD:DP:GL:GQ	0/1:96,44:87:-41.95,-26.20,-282.69:99
-chr1	807571	rs34106744	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=3;HaplotypeScore=33.63;MQ=41.31;MQ0=9;OQ=377.46;QD=2.80;SB=-157.65	GT:AD:DP:GL:GQ	0/1:62,73:80:-65.12,-24.09,-230.06:99
-chr1	807588	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=0;HaplotypeScore=29.86;MQ=39.35;MQ0=12;OQ=1527.96;QD=9.32;SB=-255.65	GT:AD:DP:GL:GQ	0/1:60,104:105:-187.72,-31.65,-191.88:99
-chr1	807611	.	G	C	0.98	PASS	AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=7.78;MQ=38.64;MQ0=13;OQ=1984.90;QD=11.81;SB=-213.08	GT:AD:DP:GL:GQ	0/1:60,108:111:-235.21,-33.44,-245.33:99
-chr1	807628	.	G	A	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=194;Dels=0.00;HRun=0;HaplotypeScore=15.09;MQ=38.17;MQ0=13;OQ=1889.96;QD=9.74;SB=-59.93	GT:AD:DP:GL:GQ	0/1:68,126:123:-229.33,-37.05,-239.27:99
-chr1	807662	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=324;Dels=0.00;HRun=0;HaplotypeScore=5.25;MQ=35.02;MQ0=24;OQ=5029.36;QD=15.52;SB=-1355.57	GT:AD:DP:GL:GQ	0/1:79,245:206:-501.94,-62.04,-299.38:99
-chr1	807698	rs61768243	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=413;Dels=0.00;HRun=1;HaplotypeScore=119.83;MQ=33.65;MQ0=41;OQ=7356.92;QD=17.81;SB=-2911.42	GT:AD:DP:GL:GQ	0/1:85,328:252:-734.69,-75.92,-368.28:99
-chr1	807726	rs61768244	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=451;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=33.55;MQ0=36;OQ=2315.76;QD=5.13;SB=-928.19	GT:AD:DP:GL:GQ	0/1:303,148:263:-314.08,-79.22,-727.35:99
-chr1	807759	rs4034377	A	C	755.20	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=336;Dels=0.00;HRun=0;HaplotypeScore=236.06;MQ=33.74;MQ0=39;QD=2.25;SB=-109.97	GT:AD:DP:GL:GQ	0/1:260,76:175:-131.50,-52.70,-521.92:99
-chr1	807761	.	A	G	2451.79	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=328;Dels=0.00;HRun=0;HaplotypeScore=310.08;MQ=33.84;MQ0=39;QD=7.47;SB=-739.45	GT:AD:DP:GL:GQ	0/1:164,163:171:-299.96,-51.50,-359.62:99
-chr1	807766	rs3969819	A	C	564.07	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=320;Dels=0.00;HRun=0;HaplotypeScore=284.38;MQ=33.76;MQ0=45;QD=1.76;SB=-303.05	GT:AD:DP:GL:GQ	0/1:266,53:164:-109.08,-49.39,-509.36:99
-chr1	807787	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=301;Dels=0.00;HRun=1;HaplotypeScore=10.94;MQ=35.09;MQ0=34;OQ=678.04;QD=2.25;SB=50.87	GT:AD:DP:GL:GQ	0/1:179,122:124:-108.43,-37.34,-358.12:99
-chr1	807799	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=330;Dels=0.00;HRun=1;HaplotypeScore=46.01;MQ=35.31;MQ0=34;OQ=1300.39;QD=3.94;SB=-358.87	GT:AD:DP:GL:GQ	0/1:191,139:161:-181.81,-48.48,-410.83:99
-chr1	807817	rs4034379	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=305;Dels=0.00;HRun=0;HaplotypeScore=40.59;MQ=36.43;MQ0=47;OQ=1097.69;QD=3.60;SB=-508.19	GT:AD:DP:GL:GQ	0/1:205,100:154:-159.44,-46.39,-521.49:99
-chr1	807831	rs4034380	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=324;Dels=0.00;HRun=0;HaplotypeScore=53.25;MQ=36.07;MQ0=54;OQ=860.18;QD=2.65;SB=-52.35	GT:AD:DP:GL:GQ	0/1:235,89:165:-139.00,-49.70,-477.57:99
-chr1	807843	rs61768247	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=340;Dels=0.00;HRun=3;HaplotypeScore=25.24;MQ=35.61;MQ0=59;OQ=2917.98;QD=8.58;SB=-1176.92	GT:AD:DP:GL:GQ	0/1:93,247:179:-348.99,-53.91,-340.62:99
-chr1	807878	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=340;Dels=0.00;HRun=3;HaplotypeScore=1.68;MQ=33.99;MQ0=59;OQ=2636.13;QD=7.75;SB=-1148.59	GT:AD:DP:GL:GQ	0/1:141,199:182:-321.71,-54.82,-379.20:99
-chr1	807900	rs61768248	A	G	107.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=254;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=36.51;MQ0=52;OQ=2423.92;QD=9.54;SB=-510.71	GT:AD:DP:GL:GQ	0/1:72,182:155:-292.36,-46.69,-288.83:99
-chr1	807921	rs4034381	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=238;Dels=0.00;HRun=0;HaplotypeScore=52.91;MQ=37.12;MQ0=38;OQ=730.38;QD=3.07;SB=87.15	GT:AD:DP:GL:GQ	0/1:169,69:152:-122.12,-45.80,-464.61:99
-chr1	807923	rs2311679	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=238;Dels=0.00;HRun=1;HaplotypeScore=53.91;MQ=36.90;MQ0=37;OQ=150.90;QD=0.63;SB=114.49	GT:AD:DP:GL:GQ	0/1:205,33:149:-63.25,-44.87,-483.89:99
-chr1	807940	rs61768249	C	T	132.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=201;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=39.52;MQ0=18;OQ=2365.28;QD=11.77;SB=-227.57	GT:AD:DP:GL:GQ	0/1:70,131:135:-280.47,-40.66,-242.20:99
-chr1	807969	.	G	T	0.34	PASS	AC=1;AF=0.50;AN=2;DP=201;Dels=0.00;HRun=0;HaplotypeScore=3.99;MQ=40.13;MQ0=16;OQ=852.49;QD=4.24;SB=25.59	GT:AD:DP:GL:GQ	0/1:139,62:138:-130.10,-41.57,-369.51:99
-chr1	807986	.	G	A	410.65	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=0;HaplotypeScore=37.75;MQ=40.61;MQ0=11;QD=2.15;SB=32.93	GT:AD:DP:GL:GQ	0/1:73,117:91:-71.78,-27.44,-235.41:99
-chr1	807989	.	A	G	41.79	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=1;HaplotypeScore=63.74;MQ=41.32;MQ0=11;QD=0.24;SB=71.44	GT:AD:DP:GL:GQ	0/1:71,104:80:-31.56,-24.09,-295.20:74.62
-chr1	807990	.	G	T	63.48	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=1;HaplotypeScore=63.74;MQ=41.32;MQ0=11;QD=0.36;SB=71.41	GT:AD:DP:GL:GQ	0/1:71,104:79:-33.42,-23.79,-250.10:96.32
-chr1	808001	rs2311681	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=186;Dels=0.00;HRun=1;HaplotypeScore=145.95;MQ=39.96;MQ0=12;OQ=189.55;QD=1.02;SB=-28.87	GT:AD:DP:GL:GQ	0/1:68,100:81:-53.53,-31.29,-271.83:99
-chr1	808002	.	C	T	30.08	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=188;Dels=0.00;HRun=1;HaplotypeScore=147.95;MQ=39.81;MQ0=12;QD=0.16;SB=5.97	GT:AD:DP:GL:GQ	0/1:124,64:83:-31.29,-25.00,-266.30:62.91
-chr1	808027	rs3969820	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=178;Dels=0.00;HRun=0;HaplotypeScore=57.38;MQ=38.17;MQ0=19;OQ=723.18;QD=4.06;SB=-165.45	GT:AD:DP:GL:GQ	0/1:134,44:108:-108.14,-32.53,-287.08:99
-chr1	808030	.	A	G	1086.71	DPFilter;HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=167;Dels=0.00;HRun=0;HaplotypeScore=42.92;MQ=38.47;MQ0=18;QD=6.51;SB=-568.31	GT:AD:DP:GL:GQ	0/1:57,109:99:-141.80,-29.84,-220.97:99
-chr1	808043	.	A	G	970.86	DPFilter;HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=1;HaplotypeScore=39.52;MQ=39.24;MQ0=20;QD=6.11;SB=-490.82	GT:AD:DP:GL:GQ	0/1:58,101:92:-128.08,-27.71,-229.15:99
-chr1	808058	rs4068670	A	G	19.55	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=148;Dels=0.00;HRun=0;HaplotypeScore=41.67;MQ=39.19;MQ0=26;QD=0.13;SB=-33.62	GT:AD:DP:GL:GQ	0/1:54,74:61:-37.68,-32.44,-211.21:52.34
-chr1	808064	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=133;Dels=0.00;HRun=1;HaplotypeScore=40.55;MQ=38.61;MQ0=24;OQ=246.33;QD=1.85;SB=-81.77	GT:AD:DP:GL:GQ	0/1:48,85:54:-44.19,-16.27,-162.59:99
-chr1	808071	.	C	T	20.12	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=40.24;MQ=40.16;MQ0=22;QD=0.15;SB=14.54	GT:AD:DP:GL:GQ	0/1:54,82:58:-22.76,-17.47,-182.75:52.91
-chr1	808112	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=227;Dels=0.00;HRun=2;HaplotypeScore=125.36;MQ=37.91;MQ0=32;OQ=1776.62;QD=7.83;SB=-160.46	GT:AD:DP:GL:GQ	0/1:73,153:125:-218.60,-37.66,-274.51:99
-chr1	808131	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=257;Dels=0.00;HRun=1;HaplotypeScore=46.49;MQ=37.72;MQ0=22;OQ=2127.72;QD=8.28;SB=-282.13	GT:AD:DP:GL:GQ	0/1:106,150:146:-260.04,-43.99,-307.83:99
-chr1	808143	rs2871830	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=266;Dels=0.00;HRun=0;HaplotypeScore=22.61;MQ=37.96;MQ0=21;OQ=255.61;QD=0.96;SB=23.44	GT:AD:DP:GL:GQ	0/1:214,51:151:-74.35,-45.50,-504.23:99
-chr1	808170	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=251;Dels=0.00;HRun=1;HaplotypeScore=39.92;MQ=39.75;MQ0=13;OQ=386.02;QD=1.54;SB=116.39	GT:AD:DP:GL:GQ	0/1:201,50:155:-88.58,-46.69,-468.07:99
-chr1	808187	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=220;Dels=0.00;HRun=7;HaplotypeScore=162.06;MQ=41.27;MQ0=11;OQ=363.00;QD=1.65;SB=17.72	GT:AD:DP:GL:GQ	0/1:176,44:136:-80.56,-40.98,-399.39:99
-chr1	808189	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=0;HaplotypeScore=288.29;MQ=41.39;MQ0=11;OQ=708.25;QD=3.28;SB=-149.01	GT:AD:DP:GL:GQ	0/1:142,53:138:-146.61,-72.50,-410.59:99
-chr1	808297	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=196;Dels=0.00;HRun=0;HaplotypeScore=21.45;MQ=38.78;MQ0=17;OQ=1228.84;QD=6.27;SB=-563.99	GT:AD:DP:GL:GQ	0/1:75,120:104:-157.52,-31.35,-213.62:99
-chr1	808336	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=282;Dels=0.00;HRun=1;HaplotypeScore=34.12;MQ=34.50;MQ0=28;OQ=414.84;QD=1.47;SB=-185.55	GT:AD:DP:GL:GQ	0/1:228,54:155:-91.47,-46.70,-585.75:99
-chr1	808347	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=278;Dels=0.00;HRun=0;HaplotypeScore=78.29;MQ=34.29;MQ0=30;OQ=600.10;QD=2.16;SB=-67.28	GT:AD:DP:GL:GQ	0/1:221,39:151:-138.41,-75.12,-545.71:99
-chr1	808349	rs61768250	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=274;Dels=0.00;HRun=0;HaplotypeScore=172.09;MQ=34.47;MQ0=30;OQ=2858.46;QD=10.43;SB=-822.44	GT:AD:DP:GL:GQ	0/1:82,190:149:-334.02,-44.89,-232.77:99
-chr1	808359	.	C	T	950.38	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=269;Dels=0.00;HRun=0;HaplotypeScore=192.43;MQ=34.52;MQ0=31;QD=3.53;SB=-243.11	GT:AD:DP:GL:GQ	0/1:178,83:148:-142.90,-44.58,-399.15:99
-chr1	808362	.	G	A	76.04	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=0;HaplotypeScore=113.80;MQ=34.64;MQ0=30;QD=0.28;SB=96.15	GT:AD:DP:GL:GQ	0/1:234,29:151:-56.37,-45.49,-495.71:99
-chr1	808363	.	C	A	14.91	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=279;Dels=0.00;HRun=0;HaplotypeScore=113.80;MQ=34.60;MQ0=34;QD=0.05;SB=125.29	GT:AD:DP:GL:GQ	0/1:250,29:157:-52.05,-47.29,-518.11:47.61
-chr1	808367	.	G	A	731.54	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=290;Dels=0.00;HRun=0;HaplotypeScore=120.25;MQ=34.34;MQ0=33;QD=2.52;SB=-82.29	GT:AD:DP:GL:GQ	0/1:229,61:165:-126.14,-49.70,-491.32:99
-chr1	808394	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=235;Dels=0.00;HRun=0;HaplotypeScore=10.16;MQ=37.74;MQ0=26;OQ=126.55;QD=0.54;SB=56.98	GT:AD:DP:GL:GQ	0/1:188,47:147:-60.25,-44.31,-434.17:99
-chr1	808413	.	T	G	317.98	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=2;HaplotypeScore=72.86;MQ=40.13;MQ0=20;QD=1.94;SB=-24.43	GT:AD:DP:GL:GQ	0/1:121,43:105:-66.71,-31.62,-317.98:99
-chr1	808417	.	G	A	68.93	DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=67.03;MQ=42.13;MQ0=16;QD=0.46;SB=83.26	GT:AD:DP:GL:GQ	0/1:135,13:103:-41.21,-31.03,-340.99:99
-chr1	808421	.	G	A	1042.35	DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=46.56;MQ=44.72;MQ0=15;QD=7.72;SB=-112.51	GT:AD:DP:GL:GQ	0/1:67,68:99:-137.34,-29.83,-234.94:99
-chr1	808447	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=2;HaplotypeScore=11.26;MQ=49.75;MQ0=9;OQ=392.50;QD=3.54;SB=-21.38	GT:AD:DP:GL:GQ	0/1:71,40:86:-68.46,-25.93,-223.10:99
-chr1	808451	.	A	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=1;HaplotypeScore=9.78;MQ=50.21;MQ0=9;OQ=368.72;QD=3.29;SB=-63.61	GT:AD:DP:GL:GQ	0/1:73,39:88:-66.66,-26.51,-263.45:99
-chr1	808566	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=0;HaplotypeScore=42.07;MQ=40.72;MQ0=9;OQ=262.25;QD=1.45;SB=83.19	GT:AD:DP:GL:GQ	0/1:73,108:86:-55.43,-25.93,-233.09:99
-chr1	808594	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=249;Dels=0.00;HRun=0;HaplotypeScore=18.85;MQ=37.64;MQ0=16;OQ=690.50;QD=2.77;SB=110.37	GT:AD:DP:GL:GQ	0/1:80,169:110:-105.47,-33.14,-280.23:99
-chr1	808641	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=283;Dels=0.00;HRun=1;HaplotypeScore=21.83;MQ=33.64;MQ0=19;OQ=2063.93;QD=7.29;SB=28.04	GT:AD:DP:GL:GQ	0/1:72,211:133:-249.73,-40.06,-265.59:99
-chr1	808664	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=245;Dels=0.00;HRun=1;HaplotypeScore=236.43;MQ=34.77;MQ0=16;OQ=159.51;QD=0.65;SB=12.22	GT:AD:DP:GL:GQ	0/1:197,22:147:-105.83,-86.60,-492.17:99
-chr1	808677	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=233;Dels=0.00;HRun=0;HaplotypeScore=83.64;MQ=35.28;MQ0=11;OQ=206.00;QD=0.88;SB=113.55	GT:AD:DP:GL:GQ	0/1:190,43:144:-67.26,-43.38,-499.53:99
-chr1	808728	.	C	A	203.60	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=1;HaplotypeScore=31.96;MQ=45.04;MQ0=12;QD=1.82;SB=15.39	GT:AD:DP:GL:GQ	0/1:87,25:80:-47.74,-24.10,-238.32:99
-chr1	808731	.	C	T	444.24	SnpCluster	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=24.97;MQ=46.65;MQ0=11;QD=4.04;SB=-165.40	GT:AD:DP:GL:GQ	0/1:69,41:86:-73.64,-25.93,-224.50:99
-chr1	808732	.	G	A	408.16	SnpCluster	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=24.97;MQ=46.65;MQ0=11;QD=3.71;SB=-130.98	GT:AD:DP:GL:GQ	0/1:69,41:85:-69.72,-25.62,-220.30:99
-chr1	808802	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=47.94;MQ=46.85;MQ0=10;OQ=50.85;QD=0.45;SB=55.37	GT:AD:DP:GL:GQ	0/1:67,39:74:-30.66,-22.29,-262.89:83.69
-chr1	808813	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=0;HaplotypeScore=9.12;MQ=42.90;MQ0=8;OQ=68.22;QD=0.48;SB=65.92	GT:AD:DP:GL:GQ	0/1:121,22:85:-35.73,-25.62,-328.85:99
-chr1	808837	.	A	G	640.03	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=0;HaplotypeScore=190.29;MQ=37.94;MQ0=4;QD=3.42;SB=66.67	GT:AD:DP:GL:GQ	0/1:64,123:88:-93.80,-26.51,-252.52:99
-chr1	808839	.	G	A	725.93	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=188;Dels=0.01;HRun=3;HaplotypeScore=118.63;MQ=37.90;MQ0=4;QD=3.86;SB=63.76	GT:AD:DP:GL:GQ	0/1:65,112:89:-102.68,-26.81,-229.73:99
-chr1	808842	.	A	G	234.46	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=195;Dels=0.00;HRun=1;HaplotypeScore=215.12;MQ=37.45;MQ0=5;QD=1.20;SB=62.67	GT:AD:DP:GL:GQ	0/1:152,43:87:-52.93,-26.20,-300.50:99
-chr1	808844	.	C	A	211.39	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=194;Dels=0.00;HRun=1;HaplotypeScore=139.43;MQ=37.30;MQ0=5;QD=1.09;SB=62.33	GT:AD:DP:GL:GQ	0/1:151,43:87:-50.63,-26.20,-257.94:99
-chr1	808878	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=228;Dels=0.00;HRun=0;HaplotypeScore=11.87;MQ=35.54;MQ0=6;OQ=484.59;QD=2.13;SB=67.42	GT:AD:DP:GL:GQ	0/1:69,159:88:-78.25,-26.50,-268.80:99
-chr1	808900	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=211;Dels=0.00;HRun=0;HaplotypeScore=53.01;MQ=34.26;MQ0=7;OQ=319.52;QD=1.51;SB=101.36	GT:AD:DP:GL:GQ	0/1:68,143:78:-58.73,-23.49,-234.89:99
-chr1	808952	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=8.99;MQ=30.36;MQ0=16;OQ=684.75;QD=4.08;SB=-303.13	GT:AD:DP:GL:GQ	0/1:69,99:91:-99.17,-27.41,-260.34:99
-chr1	808969	rs57185426	C	T	0.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=167;Dels=0.00;HRun=0;HaplotypeScore=6.98;MQ=27.19;MQ0=22;OQ=1308.35;QD=7.83;SB=-543.36	GT:AD:DP:GL:GQ	0/1:64,103:97:-163.35,-29.23,-183.79:99
-chr1	809028	rs61768251	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=152;Dels=0.00;HRun=0;HaplotypeScore=24.74;MQ=37.22;MQ0=19;OQ=1197.89;QD=7.88;SB=-487.91	GT:AD:DP:GL:GQ	0/1:69,83:107:-155.31,-32.23,-252.53:99
-chr1	809058	.	T	C	0.11	PASS	AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=4.46;MQ=47.89;MQ0=8;OQ=300.60;QD=2.95;SB=-111.38	GT:AD:DP:GL:GQ	0/1:71,31:84:-58.65,-25.31,-262.00:99
-chr1	809087	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=12.78;MQ=44.45;MQ0=38;OQ=174.63;QD=1.20;SB=29.35	GT:AD:DP:GL:GQ	0/1:79,66:90:-47.85,-27.11,-283.45:99
-chr1	809147	.	A	G	708.22	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=385;Dels=0.00;HRun=0;HaplotypeScore=142.43;MQ=32.08;MQ0=67;QD=1.84;SB=-338.08	GT:AD:DP:GL:GQ	0/1:273,112:167:-124.42,-50.31,-531.00:99
-chr1	809152	.	A	G	2828.87	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=380;Dels=0.00;HRun=0;HaplotypeScore=142.28;MQ=32.36;MQ0=64;QD=7.44;SB=-821.16	GT:AD:DP:GL:GQ	0/1:76,304:165:-335.87,-49.70,-295.78:99
-chr1	809155	.	G	A	906.28	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=379;Dels=0.00;HRun=1;HaplotypeScore=107.83;MQ=32.25;MQ0=64;QD=2.39;SB=-437.76	GT:AD:DP:GL:GQ	0/1:271,108:165:-143.61,-49.69,-484.11:99
-chr1	809196	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=249;Dels=0.00;HRun=2;HaplotypeScore=63.80;MQ=34.67;MQ0=22;OQ=1194.90;QD=4.80;SB=-269.68	GT:AD:DP:GL:GQ	0/1:67,182:101:-153.20,-30.42,-236.52:99
-chr1	809260	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=41.08;MQ0=8;OQ=376.66;QD=3.30;SB=116.36	GT:AD:DP:GL:GQ	0/1:80,34:93:-68.96,-28.01,-266.36:99
-chr1	809273	.	T	C	463.34	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=121;Dels=0.00;HRun=0;HaplotypeScore=8.66;MQ=40.73;MQ0=7;QD=3.83;SB=119.42	GT:AD:DP:GL:GQ	0/1:85,36:100:-79.74,-30.12,-319.61:99
-chr1	809278	.	T	A	448.40	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=125;Dels=0.00;HRun=0;HaplotypeScore=9.66;MQ=40.70;MQ0=10;QD=3.59;SB=128.40	GT:AD:DP:GL:GQ	0/1:95,30:101:-78.54,-30.42,-301.76:99
-chr1	809279	.	C	A	472.08	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=0;HaplotypeScore=9.66;MQ=40.57;MQ0=10;QD=3.72;SB=128.43	GT:AD:DP:GL:GQ	0/1:97,30:103:-81.51,-31.02,-300.46:99
-chr1	809374	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=126;Dels=0.00;HRun=0;HaplotypeScore=40.85;MQ=49.25;MQ0=14;OQ=274.74;QD=2.18;SB=128.46	GT:AD:DP:GL:GQ	0/1:85,41:95:-59.38,-28.62,-356.10:99
-chr1	809396	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=153;Dels=0.03;HRun=0;HaplotypeScore=81.33;MQ=46.63;MQ0=11;OQ=370.18;QD=2.42;SB=128.42	GT:AD:DP:GL:GQ	0/1:90,59:107:-71.93,-31.63,-311.43:99
-chr1	809418	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=208;Dels=0.00;HRun=0;HaplotypeScore=18.59;MQ=42.45;MQ0=17;OQ=1574.87;QD=7.57;SB=-383.90	GT:AD:DP:GL:GQ	0/1:84,123:141:-203.25,-42.48,-331.17:99
-chr1	809463	.	T	C	270.15	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=218;Dels=0.00;HRun=0;HaplotypeScore=113.69;MQ=41.23;MQ0=17;QD=1.24;SB=22.33	GT:AD:DP:GL:GQ	0/1:180,37:141:-72.78,-42.48,-486.18:99
-chr1	809466	.	G	A	91.66	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=2;HaplotypeScore=122.84;MQ=41.24;MQ0=16;QD=0.43;SB=110.32	GT:AD:DP:GL:GQ	0/1:181,32:144:-55.83,-43.38,-458.71:99
-chr1	809470	.	T	C	630.75	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=208;Dels=0.00;HRun=2;HaplotypeScore=238.78;MQ=41.40;MQ0=14;QD=3.03;SB=-114.41	GT:AD:DP:GL:GQ	0/1:153,55:135:-107.03,-40.67,-427.65:99
-chr1	809480	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=183;Dels=0.00;HRun=0;HaplotypeScore=103.82;MQ=41.73;MQ0=11;OQ=1974.03;QD=10.79;SB=-338.07	GT:AD:DP:GL:GQ	0/1:66,116:122:-237.45,-36.76,-206.62:99
-chr1	809721	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=3;HaplotypeScore=9.02;MQ=53.95;MQ0=4;OQ=80.85;QD=0.86;SB=59.35	GT:AD:DP:GL:GQ	0/1:75,18:84:-36.67,-25.30,-283.82:99
-chr1	809780	rs6605057	A	G	0.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=11.81;MQ=56.13;MQ0=2;OQ=3054.85;QD=32.85;SB=-1362.55	GT:AD:DP:GL:GQ	1/1:0,93:85:-309.09,-25.60,-0.02:99
-chr1	809879	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=195;Dels=0.00;HRun=0;HaplotypeScore=59.97;MQ=40.35;MQ0=14;OQ=622.51;QD=3.19;SB=42.71	GT:AD:DP:GL:GQ	0/1:76,119:98:-95.05,-29.52,-272.29:99
-chr1	809895	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=204;Dels=0.00;HRun=1;HaplotypeScore=66.59;MQ=38.60;MQ0=19;OQ=465.46;QD=2.28;SB=92.30	GT:AD:DP:GL:GQ	0/1:110,94:92:-77.54,-27.71,-254.54:99
-chr1	809906	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=201;Dels=0.00;HRun=0;HaplotypeScore=107.86;MQ=38.19;MQ0=19;OQ=204.28;QD=1.02;SB=98.35	GT:AD:DP:GL:GQ	0/1:163,38:93:-51.72,-28.01,-294.59:99
-chr1	810152	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=0;HaplotypeScore=23.45;MQ=46.60;MQ0=18;OQ=256.17;QD=1.80;SB=89.22	GT:AD:DP:GL:GQ	0/1:80,62:93:-56.93,-28.03,-260.32:99
-chr1	810179	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=166;Dels=0.00;HRun=0;HaplotypeScore=40.97;MQ=43.29;MQ0=18;OQ=423.48;QD=2.55;SB=-10.82	GT:AD:DP:GL:GQ	0/1:90,76:99:-75.44,-29.81,-289.52:99
-chr1	810200	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=157;Dels=0.00;HRun=0;HaplotypeScore=91.89;MQ=44.44;MQ0=8;OQ=93.53;QD=0.60;SB=79.37	GT:AD:DP:GL:GQ	0/1:113,44:97:-41.85,-29.21,-309.84:99
-chr1	810211	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=3;HaplotypeScore=28.81;MQ=44.83;MQ0=8;OQ=438.48;QD=2.67;SB=-23.86	GT:AD:DP:GL:GQ	0/1:92,72:104:-78.46,-31.33,-303.09:99
-chr1	810249	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=0;HaplotypeScore=54.95;MQ=45.56;MQ0=5;OQ=532.92;QD=3.29;SB=-263.19	GT:AD:DP:GL:GQ	0/1:92,70:108:-89.11,-32.53,-336.39:99
-chr1	810266	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=0;HaplotypeScore=6.95;MQ=49.31;MQ0=7;OQ=320.58;QD=2.31;SB=3.34	GT:AD:DP:GL:GQ	0/1:87,51:105:-66.97,-31.63,-352.01:99
-chr1	810282	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=2;HaplotypeScore=2.11;MQ=50.38;MQ0=7;OQ=214.82;QD=1.51;SB=75.99	GT:AD:DP:GL:GQ	0/1:98,44:111:-58.20,-33.43,-338.53:99
-chr1	810326	.	T	C	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=51.92;MQ0=10;OQ=89.69;QD=0.81;SB=59.40	GT:AD:DP:GL:GQ	0/1:87,24:95:-40.87,-28.62,-338.92:99
-chr1	810564	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=172;Dels=0.00;HRun=0;HaplotypeScore=14.88;MQ=44.23;MQ0=6;OQ=498.14;QD=2.90;SB=-150.99	GT:AD:DP:GL:GQ	0/1:102,70:118:-88.65,-35.55,-364.99:99
-chr1	810629	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=38.71;MQ=50.61;MQ0=2;OQ=253.97;QD=2.29;SB=-143.03	GT:AD:DP:GL:GQ	0/1:83,27:94:-56.99,-28.31,-290.69:99
-chr1	810683	.	T	C	21.46	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=45.49;MQ0=13;QD=0.17;SB=104.38	GT:AD:DP:GL:GQ	0/1:80,50:88:-31.93,-26.50,-325.33:54.27
-chr1	810696	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=154;Dels=0.00;HRun=0;HaplotypeScore=34.97;MQ=44.00;MQ0=14;OQ=294.30;QD=1.91;SB=110.32	GT:AD:DP:GL:GQ	0/1:85,69:98:-62.23,-29.52,-298.08:99
-chr1	810711	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=0;HaplotypeScore=44.23;MQ=40.46;MQ0=17;OQ=839.07;QD=4.51;SB=107.39	GT:AD:DP:GL:GQ	0/1:81,105:106:-119.13,-31.94,-347.53:99
-chr1	810733	.	C	A	43.01	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=1;HaplotypeScore=56.61;MQ=40.22;MQ0=16;QD=0.19;SB=125.38	GT:AD:DP:GL:GQ	0/1:192,33:131:-47.04,-39.45,-426.81:75.84
-chr1	810794	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=3;HaplotypeScore=52.64;MQ=44.21;MQ0=2;OQ=1066.68;QD=5.73;SB=31.06	GT:AD:DP:GL:GQ	0/1:92,94:128:-148.50,-38.55,-332.75:99
-chr1	810798	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=183;Dels=0.00;HRun=0;HaplotypeScore=60.51;MQ=44.84;MQ0=1;OQ=1224.15;QD=6.69;SB=34.50	GT:AD:DP:GL:GQ	0/1:93,90:127:-163.96,-38.27,-393.95:99
-chr1	810830	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=3;HaplotypeScore=77.56;MQ=44.23;MQ0=2;OQ=74.26;QD=0.42;SB=98.47	GT:AD:DP:GL:GQ	0/1:145,25:125:-59.06,-48.35,-399.04:99
-chr1	810842	.	C	G	7.71	PASS	AC=1;AF=0.50;AN=2;DP=180;Dels=0.00;HRun=1;HaplotypeScore=2.42;MQ=44.02;MQ0=3;OQ=1687.26;QD=9.37;SB=-373.48	GT:AD:DP:GL:GQ	0/1:84,96:131:-211.48,-39.47,-372.20:99
-chr1	810901	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=0;HaplotypeScore=76.75;MQ=45.85;MQ0=4;OQ=1193.00;QD=8.40;SB=-508.15	GT:AD:DP:GL:GQ	0/1:72,70:110:-155.72,-33.14,-263.20:99
-chr1	810906	.	T	C	38.41	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=133;Dels=0.00;HRun=0;HaplotypeScore=84.75;MQ=46.22;MQ0=3;QD=0.29;SB=-42.29	GT:AD:DP:GL:GQ	0/1:104,29:99:-36.95,-29.82,-359.79:71.24
-chr1	810914	rs2871831	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=126;Dels=0.00;HRun=0;HaplotypeScore=29.97;MQ=47.06;MQ0=6;OQ=781.68;QD=6.20;SB=-314.19	GT:AD:DP:GL:GQ	0/1:70,55:96:-110.36,-28.91,-259.38:99
-chr1	810923	.	A	T	0.10	PASS	AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=1;HaplotypeScore=7.81;MQ=46.94;MQ0=8;OQ=838.41;QD=6.60;SB=-348.34	GT:AD:DP:GL:GQ	0/1:70,57:101:-117.55,-30.42,-266.19:99
-chr1	810974	rs61768253	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=159;Dels=0.00;HRun=0;HaplotypeScore=90.96;MQ=39.12;MQ0=31;OQ=376.97;QD=2.37;SB=-131.06	GT:AD:DP:GL:GQ	0/1:90,68:97:-70.20,-29.22,-313.33:99
-chr1	810984	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=2;HaplotypeScore=97.32;MQ=34.90;MQ0=35;OQ=108.00;QD=0.52;SB=94.23	GT:AD:DP:GL:GQ	0/1:166,41:109:-46.91,-32.83,-360.50:99
-chr1	810998	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=239;Dels=0.00;HRun=0;HaplotypeScore=73.35;MQ=33.36;MQ0=43;OQ=73.40;QD=0.31;SB=-50.06	GT:AD:DP:GL:GQ	0/1:185,54:123:-47.67,-37.04,-404.38:99
-chr1	811006	rs61768254	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=248;Dels=0.00;HRun=1;HaplotypeScore=66.91;MQ=33.49;MQ0=48;OQ=832.91;QD=3.36;SB=-277.39	GT:AD:DP:GL:GQ	0/1:106,142:128:-125.13,-38.56,-331.35:99
-chr1	811069	rs35186927	T	A	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=481;Dels=0.00;HRun=1;HaplotypeScore=3.93;MQ=31.63;MQ0=35;OQ=1139.00;QD=2.37;SB=-237.78	GT:AD:DP:GL:GQ	0/1:346,135:257:-194.59,-77.40,-784.30:99
-chr1	811112	rs2311684	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=350;Dels=0.00;HRun=0;HaplotypeScore=77.41;MQ=35.82;MQ0=8;OQ=2362.85;QD=6.75;SB=-654.92	GT:AD:DP:GL:GQ	0/1:216,134:219:-305.59,-66.02,-466.00:99
-chr1	811131	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=248;Dels=0.00;HRun=0;HaplotypeScore=87.33;MQ=41.16;MQ0=2;OQ=4074.75;QD=16.43;SB=-1430.41	GT:AD:DP:GL:GQ	0/1:100,147:200:-406.47,-62.90,-355.42:99
-chr1	811184	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=2;HaplotypeScore=27.77;MQ=43.71;MQ0=0;OQ=460.52;QD=3.74;SB=149.45	GT:AD:DP:GL:GQ	0/1:91,32:108:-81.87,-32.53,-317.70:99
-chr1	811205	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=2;HaplotypeScore=18.01;MQ=44.82;MQ0=0;OQ=329.41;QD=2.86;SB=146.50	GT:AD:DP:GL:GQ	0/1:87,28:104:-67.56,-31.33,-345.48:99
-chr1	811285	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=150;Dels=0.00;HRun=0;HaplotypeScore=37.25;MQ=40.88;MQ0=3;OQ=828.79;QD=5.53;SB=-15.76	GT:AD:DP:GL:GQ	0/1:66,84:93:-114.20,-28.04,-207.99:99
-chr1	811292	.	G	C	33.11	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=58.15;MQ=39.23;MQ0=3;QD=0.21;SB=95.35	GT:AD:DP:GL:GQ	0/1:79,14:72:-31.92,-25.33,-286.41:65.95
-chr1	811309	.	A	C	218.07	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=180;Dels=0.00;HRun=0;HaplotypeScore=95.42;MQ=36.77;MQ0=3;QD=1.21;SB=75.78	GT:AD:DP:GL:GQ	0/1:95,84:77:-48.28,-23.19,-225.41:99
-chr1	811313	.	C	A	77.35	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=190;Dels=0.00;HRun=1;HaplotypeScore=126.41;MQ=36.87;MQ0=1;QD=0.41;SB=64.94	GT:AD:DP:GL:GQ	0/1:128,61:85:-36.63,-25.61,-260.99:99
-chr1	811315	.	G	A	900.17	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=189;Dels=0.00;HRun=1;HaplotypeScore=96.44;MQ=36.96;MQ0=1;QD=4.76;SB=64.69	GT:AD:DP:GL:GQ	0/1:57,131:88:-122.19,-28.89,-207.10:99
-chr1	811336	.	T	C	533.21	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=37.36;MQ0=1;QD=2.63;SB=59.62	GT:AD:DP:GL:GQ	0/1:62,140:81:-81.01,-24.41,-227.12:99
-chr1	811339	.	T	C	458.52	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=200;Dels=0.00;HRun=1;HaplotypeScore=44.80;MQ=38.07;MQ0=1;QD=2.29;SB=92.33	GT:AD:DP:GL:GQ	0/1:65,135:85:-74.74,-25.60,-261.77:99
-chr1	811347	.	T	G	278.98	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=226;Dels=0.00;HRun=3;HaplotypeScore=134.53;MQ=37.01;MQ0=0;QD=1.23;SB=83.27	GT:AD:DP:GL:GQ	0/1:65,161:80:-55.28,-24.10,-233.47:99
-chr1	811354	.	C	T	677.91	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=233;Dels=0.00;HRun=0;HaplotypeScore=163.01;MQ=36.31;MQ0=0;QD=2.91;SB=83.23	GT:AD:DP:GL:GQ	0/1:63,170:82:-95.80,-24.72,-187.92:99
-chr1	811362	.	C	T	454.65	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=0;HaplotypeScore=226.76;MQ=36.80;MQ0=0;QD=1.97;SB=83.14	GT:AD:DP:GL:GQ	0/1:64,167:80:-72.88,-24.13,-190.51:99
-chr1	811364	.	T	C	196.31	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=230;Dels=0.00;HRun=1;HaplotypeScore=66.22;MQ=36.51;MQ0=0;QD=0.85;SB=79.92	GT:AD:DP:GL:GQ	0/1:84,145:75:-47.99,-25.07,-244.42:99
-chr1	811375	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=0;HaplotypeScore=93.49;MQ=37.41;MQ0=0;OQ=1696.08;QD=7.34;SB=71.11	GT:AD:DP:GL:GQ	0/1:93,137:119:-208.77,-35.88,-209.62:99
-chr1	811378	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=239;Dels=0.00;HRun=1;HaplotypeScore=193.97;MQ=37.86;MQ0=0;OQ=1149.75;QD=4.81;SB=77.23	GT:AD:DP:GL:GQ	0/1:188,51:123:-155.31,-37.05,-314.47:99
-chr1	811386	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=227;Dels=0.00;HRun=2;HaplotypeScore=163.58;MQ=38.25;MQ0=0;OQ=516.99;QD=2.28;SB=29.28	GT:AD:DP:GL:GQ	0/1:149,78:121:-91.43,-36.45,-384.88:99
-chr1	811400	.	C	T	562.85	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=209;Dels=0.00;HRun=0;HaplotypeScore=151.19;MQ=39.64;MQ0=0;QD=2.69;SB=23.60	GT:AD:DP:GL:GQ	0/1:96,113:102:-90.30,-30.73,-291.44:99
-chr1	811402	.	C	T	93.97	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=206;Dels=0.00;HRun=1;HaplotypeScore=101.45;MQ=39.46;MQ0=1;QD=0.46;SB=62.16	GT:AD:DP:GL:GQ	0/1:188,18:99:-42.50,-29.82,-326.30:99
-chr1	811408	.	G	T	250.46	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=192;Dels=0.00;HRun=0;HaplotypeScore=79.23;MQ=40.75;MQ0=2;QD=1.30;SB=59.20	GT:AD:DP:GL:GQ	0/1:111,80:98:-57.85,-29.52,-298.59:99
-chr1	811413	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=188;Dels=0.00;HRun=0;HaplotypeScore=67.52;MQ=40.58;MQ0=2;OQ=77.44;QD=0.41;SB=62.19	GT:AD:DP:GL:GQ	0/1:97,91:86:-36.94,-25.92,-277.54:99
-chr1	811430	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=4;HaplotypeScore=58.87;MQ=40.65;MQ0=2;OQ=63.77;QD=0.39;SB=65.24	GT:AD:DP:GL:GQ	0/1:88,76:92:-37.38,-27.72,-324.79:96.61
-chr1	811435	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=19.26;MQ=40.95;MQ0=1;OQ=266.78;QD=1.72;SB=71.27	GT:AD:DP:GL:GQ	0/1:84,71:100:-60.08,-30.12,-340.43:99
-chr1	811443	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=2;HaplotypeScore=30.32;MQ=41.18;MQ0=1;OQ=189.19;QD=1.39;SB=77.28	GT:AD:DP:GL:GQ	0/1:79,56:91:-52.39,-30.19,-304.45:99
-chr1	811635	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=82.21;MQ=40.79;MQ0=16;OQ=141.45;QD=0.98;SB=-89.35	GT:AD:DP:GL:GQ	0/1:111,34:74:-39.73,-22.30,-281.80:99
-chr1	811650	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=95.82;MQ=42.47;MQ0=12;OQ=224.58;QD=1.65;SB=-61.36	GT:AD:DP:GL:GQ	0/1:66,70:76:-48.64,-22.89,-228.84:99
-chr1	811656	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=0;HaplotypeScore=71.17;MQ=43.15;MQ0=11;OQ=112.09;QD=0.87;SB=-75.98	GT:AD:DP:GL:GQ	0/1:102,27:76:-37.39,-22.90,-238.94:99
-chr1	811750	rs6677354	A	G	0.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=3;HaplotypeScore=4.05;MQ=50.03;MQ0=0;OQ=1811.37;QD=31.78;SB=-810.16	GT:AD:DP:GL:GQ	1/1:0,56:52:-184.74,-15.66,-0.02:99
-chr1	811789	rs35660652	C	G	23.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=4.89;MQ=49.27;MQ0=1;OQ=933.21;QD=16.97;SB=-483.19	GT:AD:DP:GL:GQ	0/1:25,30:48:-111.08,-14.47,-94.44:99
-chr1	811811	rs6671445	T	C	60.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=51.17;MQ0=1;OQ=1096.50;QD=26.11;SB=-519.10	GT:AD:DP:GL:GQ	1/1:0,42:35:-113.27,-10.56,-0.03:99
-chr1	811899	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=32.15;MQ=43.49;MQ0=20;OQ=124.06;QD=1.01;SB=92.32	GT:AD:DP:GL:GQ	0/1:62,60:72:-37.38,-21.69,-248.07:99
-chr1	812359	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=1;HaplotypeScore=23.61;MQ=48.84;MQ0=1;OQ=66.32;QD=0.77;SB=71.21	GT:AD:DP:GL:GQ	0/1:52,34:57:-27.09,-17.17,-171.46:99
-chr1	812367	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=15.11;MQ=47.39;MQ0=1;OQ=182.54;QD=1.77;SB=-16.56	GT:AD:DP:GL:GQ	0/1:55,46:66:-41.42,-19.89,-213.25:99
-chr1	812395	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=147;Dels=0.00;HRun=0;HaplotypeScore=16.89;MQ=44.59;MQ0=4;OQ=290.02;QD=1.97;SB=-35.46	GT:AD:DP:GL:GQ	0/1:75,71:87:-58.50,-26.21,-278.39:99
-chr1	812396	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=150;Dels=0.00;HRun=0;HaplotypeScore=12.57;MQ=44.24;MQ0=4;OQ=510.01;QD=3.40;SB=-121.97	GT:AD:DP:GL:GQ	0/1:77,73:89:-81.09,-26.81,-250.00:99
-chr1	812452	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=237;Dels=0.00;HRun=1;HaplotypeScore=44.19;MQ=38.30;MQ0=6;OQ=174.18;QD=0.73;SB=140.46	GT:AD:DP:GL:GQ	0/1:178,59:128:-59.25,-38.55,-429.97:99
-chr1	812470	.	G	A	3027.24	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=2;HaplotypeScore=95.67;MQ=37.00;MQ0=5;QD=11.38;SB=-136.01	GT:AD:DP:GL:GQ	0/1:72,177:161:-375.45,-69.45,-279.59:99
-chr1	812474	.	A	G	225.39	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=282;Dels=0.00;HRun=0;HaplotypeScore=98.08;MQ=36.45;MQ0=4;QD=0.80;SB=107.36	GT:AD:DP:GL:GQ	0/1:225,57:173:-77.95,-52.13,-605.26:99
-chr1	812476	.	G	A	4194.86	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=280;Dels=0.00;HRun=1;HaplotypeScore=148.97;MQ=36.56;MQ0=4;QD=14.98;SB=-125.96	GT:AD:DP:GL:GQ	0/1:71,208:172:-418.49,-51.81,-254.37:99
-chr1	812496	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=383;Dels=0.00;HRun=3;HaplotypeScore=110.05;MQ=34.24;MQ0=3;OQ=4072.28;QD=10.63;SB=-60.38	GT:AD:DP:GL:GQ	0/1:191,192:229:-406.23,-68.97,-420.64:99
-chr1	812509	.	A	G	1306.01	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=390;Dels=0.00;HRun=0;HaplotypeScore=338.39;MQ=34.90;MQ0=4;QD=3.35;SB=113.39	GT:AD:DP:GL:GQ	0/1:88,302:134:-174.25,-40.36,-354.14:99
-chr1	812511	.	C	T	253.04	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=392;Dels=0.00;HRun=1;HaplotypeScore=342.27;MQ=34.93;MQ0=3;QD=0.65;SB=107.37	GT:AD:DP:GL:GQ	0/1:210,181:105:-60.21,-31.62,-326.58:99
-chr1	812536	.	C	T	6216.93	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=431;Dels=0.00;HRun=0;HaplotypeScore=21.13;MQ=33.82;MQ0=5;QD=14.42;SB=89.30	GT:AD:DP:GL:GQ	0/1:86,345:239:-620.69,-71.99,-300.06:99
-chr1	812546	.	A	T	6301.61	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=411;Dels=0.00;HRun=5;HaplotypeScore=527.01;MQ=34.23;MQ0=5;QD=15.33;SB=95.32	GT:AD:DP:GL:GQ	0/1:107,219:261:-629.16,-251.98,-546.86:99
-chr1	812557	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=384;Dels=0.00;HRun=0;HaplotypeScore=98.60;MQ=34.24;MQ0=5;OQ=4742.49;QD=12.35;SB=92.31	GT:AD:DP:GL:GQ	0/1:201,182:235:-473.25,-70.78,-414.34:99
-chr1	812581	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=273;Dels=0.00;HRun=0;HaplotypeScore=142.64;MQ=35.76;MQ0=4;OQ=1205.24;QD=4.41;SB=74.26	GT:AD:DP:GL:GQ	0/1:167,71:149:-175.85,-52.04,-375.17:99
-chr1	812582	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=267;Dels=0.00;HRun=0;HaplotypeScore=141.33;MQ=35.99;MQ0=4;OQ=1716.18;QD=6.43;SB=71.26	GT:AD:DP:GL:GQ	0/1:103,164:146:-218.89,-43.99,-346.52:99
-chr1	812608	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=165;Dels=0.00;HRun=1;HaplotypeScore=67.91;MQ=41.17;MQ0=4;OQ=693.18;QD=4.20;SB=50.19	GT:AD:DP:GL:GQ	0/1:102,63:97:-101.82,-29.21,-294.33:99
-chr1	812623	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=28.33;MQ=46.60;MQ0=1;OQ=165.38;QD=1.61;SB=41.15	GT:AD:DP:GL:GQ	0/1:59,44:68:-40.30,-20.48,-216.18:99
-chr1	812625	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=1;HaplotypeScore=28.33;MQ=46.70;MQ0=1;OQ=134.52;QD=1.27;SB=44.17	GT:AD:DP:GL:GQ	0/1:60,46:69:-37.52,-20.78,-218.11:99
-chr1	812637	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=0;HaplotypeScore=37.48;MQ=47.73;MQ0=2;OQ=214.50;QD=1.87;SB=-61.85	GT:AD:DP:GL:GQ	0/1:67,48:77:-47.94,-23.20,-220.91:99
-chr1	812655	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=121;Dels=0.00;HRun=0;HaplotypeScore=33.89;MQ=47.71;MQ0=3;OQ=405.95;QD=3.35;SB=-136.06	GT:AD:DP:GL:GQ	0/1:68,53:87:-70.08,-26.20,-247.74:99
-chr1	812661	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=2;HaplotypeScore=21.84;MQ=47.58;MQ0=5;OQ=365.64;QD=2.95;SB=-168.82	GT:AD:DP:GL:GQ	0/1:87,37:88:-66.35,-26.51,-263.64:99
-chr1	812666	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=21.15;MQ=47.18;MQ0=5;OQ=451.13;QD=3.67;SB=-190.13	GT:AD:DP:GL:GQ	0/1:65,57:86:-74.30,-25.91,-260.71:99
-chr1	812725	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=137;Dels=0.00;HRun=2;HaplotypeScore=17.99;MQ=47.07;MQ0=7;OQ=51.25;QD=0.37;SB=36.23	GT:AD:DP:GL:GQ	0/1:99,33:95:-37.06,-28.65,-279.36:84.09
-chr1	812740	.	T	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=2;HaplotypeScore=10.99;MQ=47.57;MQ0=4;OQ=391.52;QD=3.08;SB=-178.55	GT:AD:DP:GL:GQ	0/1:69,58:85:-68.04,-25.60,-259.04:99
-chr1	812742	.	A	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=1;HaplotypeScore=11.99;MQ=46.41;MQ0=4;OQ=355.87;QD=2.58;SB=-160.38	GT:AD:DP:GL:GQ	0/1:72,66:89:-65.67,-26.80,-277.85:99
-chr1	812772	.	C	A	4524.81	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=340;Dels=0.00;HRun=1;HaplotypeScore=205.36;MQ=35.68;MQ0=5;QD=13.31;SB=-1151.01	GT:AD:DP:GL:GQ	0/1:83,257:202:-451.48,-60.83,-296.00:99
-chr1	812774	.	G	A	5465.17	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=359;Dels=0.00;HRun=1;HaplotypeScore=230.04;MQ=35.29;MQ0=5;QD=15.22;SB=-1392.69	GT:AD:DP:GL:GQ	0/1:83,276:217:-545.52,-65.36,-295.35:99
-chr1	812778	.	A	C	2967.60	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=395;Dels=0.00;HRun=0;HaplotypeScore=217.58;MQ=34.63;MQ0=8;QD=7.51;SB=-725.51	GT:AD:DP:GL:GQ	0/1:219,176:242:-372.92,-72.88,-512.65:99
-chr1	812823	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=734;Dels=0.00;HRun=0;HaplotypeScore=134.36;MQ=30.02;MQ0=41;OQ=617.75;QD=0.84;SB=-157.33	GT:AD:DP:GL:GQ	0/1:653,81:442:-198.19,-133.13,-1425.62:99
-chr1	812838	rs657923	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=716;Dels=0.00;HRun=1;HaplotypeScore=212.74;MQ=29.97;MQ0=41;OQ=1388.92;QD=1.94;SB=-7.94	GT:AD:DP:GL:GQ	0/1:599,117:439:-274.39,-132.21,-1407.52:99
-chr1	812875	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=465;Dels=0.00;HRun=0;HaplotypeScore=110.91;MQ=32.05;MQ0=37;OQ=83.36;QD=0.18;SB=55.37	GT:AD:DP:GL:GQ	0/1:398,67:296:-100.77,-89.15,-980.63:99
-chr1	812885	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=346;Dels=0.00;HRun=1;HaplotypeScore=111.42;MQ=33.27;MQ0=30;OQ=5208.47;QD=15.05;SB=-2233.36	GT:AD:DP:GL:GQ	0/1:69,277:208:-519.85,-62.65,-238.95:99
-chr1	812886	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=335;Dels=0.00;HRun=1;HaplotypeScore=55.46;MQ=33.49;MQ0=30;OQ=451.06;QD=1.35;SB=-154.07	GT:AD:DP:GL:GQ	0/1:302,33:200:-108.62,-60.23,-633.51:99
-chr1	812900	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=183;Dels=0.00;HRun=0;HaplotypeScore=14.94;MQ=39.79;MQ0=13;OQ=813.81;QD=4.45;SB=92.87	GT:AD:DP:GL:GQ	0/1:73,110:100:-114.78,-30.12,-260.13:99
-chr1	812923	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=1;HaplotypeScore=27.88;MQ=50.22;MQ0=2;OQ=306.33;QD=2.95;SB=-30.81	GT:AD:DP:GL:GQ	0/1:70,34:81:-58.31,-24.40,-238.03:99
-chr1	812935	.	G	A	2.07	PASS	AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=2.66;MQ=47.53;MQ0=2;OQ=744.11;QD=5.55;SB=-223.02	GT:AD:DP:GL:GQ	0/1:69,65:96:-106.61,-28.92,-247.13:99
-chr1	812951	.	G	T	11.25	PASS	AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=43.90;MQ0=5;OQ=1351.36;QD=8.72;SB=-400.31	GT:AD:DP:GL:GQ	0/1:63,92:108:-170.95,-32.53,-225.30:99
-chr1	812975	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=199;Dels=0.00;HRun=0;HaplotypeScore=28.65;MQ=40.87;MQ0=15;OQ=1862.55;QD=9.36;SB=-484.23	GT:AD:DP:GL:GQ	0/1:66,132:123:-230.20,-40.66,-212.95:99
-chr1	812981	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=1;HaplotypeScore=40.75;MQ=39.82;MQ0=15;OQ=1797.82;QD=8.86;SB=-460.63	GT:AD:DP:GL:GQ	0/1:63,140:120:-219.20,-36.14,-217.08:99
-chr1	812999	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=293;Dels=0.00;HRun=3;HaplotypeScore=112.34;MQ=35.70;MQ0=17;OQ=746.50;QD=2.55;SB=103.46	GT:AD:DP:GL:GQ	0/1:201,92:175:-130.64,-52.71,-522.15:99
-chr1	813018	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=409;Dels=0.00;HRun=4;HaplotypeScore=24.00;MQ=34.51;MQ0=18;OQ=2503.76;QD=6.12;SB=-85.25	GT:AD:DP:GL:GQ	0/1:266,142:285:-339.49,-85.83,-765.92:99
-chr1	813030	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=463;Dels=0.00;HRun=0;HaplotypeScore=48.87;MQ=34.17;MQ0=19;OQ=2316.95;QD=5.00;SB=-56.40	GT:AD:DP:GL:GQ	0/1:312,151:338:-336.77,-101.79,-911.65:99
-chr1	813038	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=491;Dels=0.00;HRun=0;HaplotypeScore=299.82;MQ=33.86;MQ0=19;OQ=574.58;QD=1.17;SB=49.00	GT:AD:DP:GL:GQ	0/1:442,49:363:-170.06,-109.32,-1157.10:99
-chr1	813041	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=493;Dels=0.00;HRun=0;HaplotypeScore=391.76;MQ=34.08;MQ0=19;OQ=10262.92;QD=20.82;SB=-1216.69	GT:AD:DP:GL:GQ	0/1:84,408:369:-1025.29,-114.38,-315.19:99
-chr1	813055	.	T	G	5105.47	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=534;Dels=0.00;HRun=1;HaplotypeScore=573.54;MQ=33.39;MQ0=15;QD=9.56;SB=-804.21	GT:AD:DP:GL:GQ	0/1:355,179:410:-509.55,-123.48,-999.47:99
-chr1	813070	.	G	T	1334.14	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=573;Dels=0.00;HRun=1;HaplotypeScore=588.05;MQ=33.10;MQ0=9;QD=2.33;SB=-193.13	GT:AD:DP:GL:GQ	0/1:472,101:440:-269.21,-132.51,-1306.87:99
-chr1	813073	.	C	G	2805.72	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=592;Dels=0.00;HRun=1;HaplotypeScore=532.94;MQ=33.08;MQ0=8;QD=4.74;SB=-566.71	GT:AD:DP:GL:GQ	0/1:469,123:455:-420.94,-137.09,-1553.33:99
-chr1	813077	.	G	A	139.61	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=606;Dels=0.00;HRun=1;HaplotypeScore=787.16;MQ=33.34;MQ0=7;QD=0.23;SB=20.29	GT:AD:DP:GL:GQ	0/1:564,42:462:-156.39,-139.14,-1597.16:99
-chr1	813078	.	C	G	7856.82	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=607;Dels=0.00;HRun=1;HaplotypeScore=894.22;MQ=33.34;MQ0=7;QD=12.94;SB=-567.18	GT:AD:DP:GL:GQ	0/1:367,165:476:-784.68,-363.52,-1514.16:99
-chr1	813086	.	C	G	6412.49	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=625;Dels=0.00;HRun=0;HaplotypeScore=667.82;MQ=33.46;MQ0=7;QD=10.26;SB=-767.41	GT:AD:DP:GL:GQ	0/1:438,186:509:-640.25,-153.35,-1590.01:99
-chr1	813088	.	G	A	7116.40	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=627;Dels=0.00;HRun=1;HaplotypeScore=625.87;MQ=33.36;MQ0=7;QD=11.35;SB=-863.76	GT:AD:DP:GL:GQ	0/1:405,186:507:-710.64,-256.24,-1344.66:99
-chr1	813094	.	C	T	2968.23	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=620;Dels=0.00;HRun=0;HaplotypeScore=211.21;MQ=33.22;MQ0=9;QD=4.79;SB=-1023.50	GT:AD:DP:GL:GQ	0/1:481,139:495:-449.19,-149.09,-1385.37:99
-chr1	813107	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=546;Dels=0.00;HRun=0;HaplotypeScore=55.14;MQ=33.11;MQ0=20;OQ=871.93;QD=1.60;SB=-175.62	GT:AD:DP:GL:GQ	0/1:477,69:368:-201.32,-110.84,-1286.63:99
-chr1	813112	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=540;Dels=0.00;HRun=1;HaplotypeScore=215.40;MQ=33.46;MQ0=24;OQ=633.86;QD=1.17;SB=-102.54	GT:AD:DP:GL:GQ	0/1:489,51:349:-171.78,-105.11,-1109.57:99
-chr1	813120	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=452;Dels=0.00;HRun=0;HaplotypeScore=223.96;MQ=34.07;MQ0=26;OQ=8026.64;QD=17.76;SB=-2723.00	GT:AD:DP:GL:GQ	0/1:104,348:294:-801.66,-88.56,-349.63:99
-chr1	813123	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=449;Dels=0.00;HRun=0;HaplotypeScore=337.04;MQ=33.84;MQ0=28;OQ=7271.87;QD=16.20;SB=-2574.23	GT:AD:DP:GL:GQ	0/1:72,377:266:-726.19,-80.11,-257.87:99
-chr1	813133	.	G	C	2818.75	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=399;Dels=0.00;HRun=0;HaplotypeScore=373.63;MQ=34.21;MQ0=30;QD=7.06;SB=-1307.24	GT:AD:DP:GL:GQ	0/1:279,119:209:-348.13,-62.97,-562.66:99
-chr1	813135	.	A	G	6195.50	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=391;Dels=0.00;HRun=0;HaplotypeScore=305.70;MQ=34.41;MQ0=29;QD=15.85;SB=-2650.19	GT:AD:DP:GL:GQ	0/1:69,321:237:-618.55,-71.38,-275.07:99
-chr1	813142	.	T	C	345.82	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=364;Dels=0.00;HRun=1;HaplotypeScore=286.54;MQ=33.82;MQ0=33;QD=0.95;SB=-108.69	GT:AD:DP:GL:GQ	0/1:317,47:188:-94.49,-56.62,-663.95:99
-chr1	813148	.	C	A	1435.04	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=349;Dels=0.00;HRun=2;HaplotypeScore=161.77;MQ=34.46;MQ0=34;QD=4.11;SB=-365.32	GT:AD:DP:GL:GQ	0/1:282,67:257:-224.19,-77.40,-705.20:99
-chr1	813156	.	T	A	297.72	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=308;Dels=0.00;HRun=0;HaplotypeScore=111.01;MQ=35.71;MQ0=35;QD=0.97;SB=9.92	GT:AD:DP:GL:GQ	0/1:276,32:221:-99.61,-66.55,-759.37:99
-chr1	813157	.	G	C	549.74	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=307;Dels=0.00;HRun=0;HaplotypeScore=111.01;MQ=35.86;MQ0=35;QD=1.79;SB=-210.25	GT:AD:DP:GL:GQ	0/1:247,59:221:-124.85,-66.59,-828.88:99
-chr1	813168	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=254;Dels=0.00;HRun=2;HaplotypeScore=4.86;MQ=37.54;MQ0=37;OQ=984.94;QD=3.88;SB=44.86	GT:AD:DP:GL:GQ	0/1:209,45:173:-153.88,-52.11,-496.83:99
-chr1	813186	.	G	C	76.25	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=160;Dels=0.00;HRun=0;HaplotypeScore=72.20;MQ=40.71;MQ0=36;QD=0.48;SB=71.95	GT:AD:DP:GL:GQ	0/1:148,12:83:-35.91,-25.01,-332.34:99
-chr1	813187	.	A	G	513.33	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=147;Dels=0.00;HRun=1;HaplotypeScore=71.20;MQ=41.66;MQ0=35;QD=3.49;SB=-73.38	GT:AD:DP:GL:GQ	0/1:75,50:94:-82.93,-28.31,-287.29:99
-chr1	813188	.	C	A	79.88	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=1;HaplotypeScore=71.20;MQ=41.50;MQ0=35;QD=0.55;SB=44.61	GT:AD:DP:GL:GQ	0/1:120,26:78:-34.77,-23.49,-243.41:99
-chr1	813189	.	C	A	521.18	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=0;HaplotypeScore=67.21;MQ=41.65;MQ0=35;QD=3.62;SB=-1.36	GT:AD:DP:GL:GQ	0/1:108,26:91:-101.37,-45.97,-249.59:99
-chr1	813208	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=2;HaplotypeScore=18.83;MQ=43.26;MQ0=23;OQ=418.24;QD=3.37;SB=-54.23	GT:AD:DP:GL:GQ	0/1:61,63:76:-68.00,-22.89,-206.10:99
-chr1	813240	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=154;Dels=0.00;HRun=2;HaplotypeScore=43.28;MQ=41.04;MQ0=25;OQ=943.89;QD=6.13;SB=-68.91	GT:AD:DP:GL:GQ	0/1:64,90:92:-125.38,-27.71,-227.61:99
-chr1	813250	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=195;Dels=0.00;HRun=0;HaplotypeScore=62.53;MQ=37.95;MQ0=22;OQ=226.25;QD=1.16;SB=14.99	GT:AD:DP:GL:GQ	0/1:153,42:96:-54.82,-28.92,-298.56:99
-chr1	813271	.	T	C	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=249;Dels=0.00;HRun=0;HaplotypeScore=8.46;MQ=34.98;MQ0=19;OQ=1147.61;QD=4.61;SB=-134.40	GT:AD:DP:GL:GQ	0/1:63,186:103:-149.07,-31.02,-256.47:99
-chr1	813292	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=382;Dels=0.00;HRun=2;HaplotypeScore=102.43;MQ=30.92;MQ0=23;OQ=1986.60;QD=5.20;SB=-566.46	GT:AD:DP:GL:GQ	0/1:105,277:133:-242.00,-40.06,-276.00:99
-chr1	813307	.	A	G	32.13	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=535;Dels=0.00;HRun=0;HaplotypeScore=181.84;MQ=30.25;MQ0=27;QD=0.06;SB=46.55	GT:AD:DP:GL:GQ	0/1:504,31:255:-83.31,-76.81,-935.22:64.97
-chr1	813316	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=619;Dels=0.00;HRun=2;HaplotypeScore=75.11;MQ=29.97;MQ0=27;OQ=3157.81;QD=5.10;SB=-1462.71	GT:AD:DP:GL:GQ	0/1:382,237:331:-418.76,-99.69,-846.79:99
-chr1	813335	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=826;Dels=0.00;HRun=1;HaplotypeScore=136.91;MQ=30.11;MQ0=21;OQ=7119.57;QD=8.62;SB=-2280.77	GT:AD:DP:GL:GQ	0/1:537,288:549:-710.96,-165.36,-1364.58:99
-chr1	813362	.	A	G	16357.98	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=920;Dels=0.00;HRun=1;HaplotypeScore=446.32;MQ=30.10;MQ0=24;QD=17.78;SB=-5014.09	GT:AD:DP:GL:GQ	0/1:273,494:683:-1634.80,-554.43,-1400.88:99
-chr1	813367	.	T	C	20902.62	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=914;Dels=0.00;HRun=0;HaplotypeScore=426.41;MQ=30.28;MQ0=24;QD=22.87;SB=-7448.46	GT:AD:DP:GL:GQ	0/1:141,716:687:-2089.26,-358.04,-691.48:99
-chr1	813368	rs13302980	T	C	206.93	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=916;Dels=0.00;HRun=0;HaplotypeScore=426.41;MQ=30.25;MQ0=24;QD=0.23;SB=-118.41	GT:AD:DP:GL:GQ	0/1:843,73:685:-230.32,-206.34,-2521.41:99
-chr1	813385	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=888;Dels=0.00;HRun=0;HaplotypeScore=40.71;MQ=30.82;MQ0=25;OQ=1088.75;QD=1.23;SB=-408.14	GT:AD:DP:GL:GQ	0/1:783,105:699:-322.70,-210.54,-2232.26:99
-chr1	813404	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=750;Dels=0.00;HRun=2;HaplotypeScore=134.73;MQ=32.26;MQ0=17;OQ=670.55;QD=0.89;SB=-191.51	GT:AD:DP:GL:GQ	0/1:685,65:613:-254.96,-184.62,-2037.75:99
-chr1	813405	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=741;Dels=0.00;HRun=2;HaplotypeScore=133.74;MQ=32.36;MQ0=17;OQ=1633.92;QD=2.21;SB=-672.01	GT:AD:DP:GL:GQ	0/1:597,144:607:-349.50,-182.82,-2122.95:99
-chr1	813418	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=590;Dels=0.00;HRun=0;HaplotypeScore=47.11;MQ=33.33;MQ0=15;OQ=65.79;QD=0.11;SB=206.84	GT:AD:DP:GL:GQ	0/1:544,46:476:-153.22,-143.35,-1574.37:98.63
-chr1	813443	.	T	G	3848.11	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=275;Dels=0.00;HRun=0;HaplotypeScore=38.86;MQ=37.99;MQ0=5;QD=13.99;SB=-1241.58	GT:AD:DP:GL:GQ	0/1:79,195:186:-383.81,-56.02,-279.85:99
-chr1	813451	.	C	T	1033.45	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=197;Dels=0.01;HRun=0;HaplotypeScore=22.13;MQ=41.75;MQ0=4;QD=5.25;SB=-217.95	GT:AD:DP:GL:GQ	0/1:81,115:114:-140.97,-34.34,-279.86:99
-chr1	813452	.	A	G	765.89	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=186;Dels=0.01;HRun=0;HaplotypeScore=26.12;MQ=42.21;MQ0=4;QD=4.12;SB=-130.38	GT:AD:DP:GL:GQ	0/1:79,106:109:-112.71,-32.84,-316.56:99
-chr1	813514	rs61768255	T	A	0.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=152;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=40.18;MQ0=52;OQ=194.92;QD=1.28;SB=-18.62	GT:AD:DP:GL:GQ	0/1:64,87:75:-45.36,-22.59,-238.39:99
-chr1	813576	.	G	T	36.42	DPFilter;Indel;LowQual	AC=1;AF=0.50;AN=2;DP=256;Dels=0.00;HRun=0;HaplotypeScore=114.90;MQ=32.12;MQ0=13;QD=0.14;SB=80.27	GT:AD:DP:GL:GQ	0/1:231,25:108:-39.45,-32.53,-355.25:69.25
-chr1	813577	.	C	T	12.25	DPFilter;Indel;LowQual	AC=1;AF=0.50;AN=2;DP=253;Dels=0.00;HRun=0;HaplotypeScore=118.76;MQ=32.29;MQ0=11;QD=0.05;SB=83.28	GT:AD:DP:GL:GQ	0/1:222,24:110:-47.87,-43.39,-370.50:44.82
-chr1	813595	.	G	A	14.36	DPFilter;Indel;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=304;Dels=0.02;HRun=3;HaplotypeScore=679.47;MQ=32.56;MQ0=1;QD=0.05;SB=59.22	GT:AD:DP:GL:GQ	0/1:279,19:122:-44.63,-39.92,-398.76:47.04
-chr1	813600	.	G	A	274.89	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=326;Dels=0.00;HRun=2;HaplotypeScore=874.07;MQ=32.03;MQ0=1;QD=0.84;SB=65.24	GT:AD:DP:GL:GQ	0/1:247,78:142:-73.54,-42.77,-440.28:99
-chr1	813603	.	G	A	897.36	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=326;Dels=0.00;HRun=2;HaplotypeScore=1015.89;MQ=31.94;MQ0=0;QD=2.75;SB=17.55	GT:AD:DP:GL:GQ	0/1:201,125:138:-134.59,-41.57,-374.40:99
-chr1	813618	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=385;Dels=0.01;HRun=2;HaplotypeScore=1064.00;MQ=30.68;MQ0=0;OQ=4144.71;QD=10.77;SB=-60.77	GT:AD:DP:GL:GQ	0/1:139,193:174:-413.47,-52.40,-263.62:99
-chr1	813640	.	G	A	6008.25	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=492;Dels=0.03;HRun=2;HaplotypeScore=778.76;MQ=30.34;MQ0=0;QD=12.21;SB=-280.67	GT:AD:DP:GL:GQ	0/1:225,249:279:-599.83,-82.23,-444.10:99
-chr1	813644	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=499;Dels=0.00;HRun=2;HaplotypeScore=589.76;MQ=30.13;MQ0=0;OQ=1319.59;QD=2.64;SB=-65.34	GT:AD:DP:GL:GQ	0/1:370,128:286:-221.39,-86.15,-815.48:99
-chr1	813653	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=493;Dels=0.00;HRun=1;HaplotypeScore=439.06;MQ=30.75;MQ0=0;OQ=617.48;QD=1.25;SB=-157.65	GT:AD:DP:GL:GQ	0/1:455,38:256:-142.14,-77.10,-775.99:99
-chr1	813667	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=450;Dels=0.03;HRun=0;HaplotypeScore=1087.09;MQ=31.84;MQ0=0;OQ=612.31;QD=1.36;SB=24.15	GT:AD:DP:GL:GQ	0/1:310,99:290:-203.97,-139.46,-953.68:99
-chr1	813680	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=385;Dels=0.03;HRun=2;HaplotypeScore=1191.21;MQ=32.81;MQ0=0;OQ=1213.04;QD=3.15;SB=-10.63	GT:AD:DP:GL:GQ	0/1:276,97:229:-193.56,-68.97,-645.40:99
-chr1	813720	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=252;Dels=0.06;HRun=1;HaplotypeScore=327.60;MQ=37.03;MQ0=0;OQ=194.28;QD=0.77;SB=110.38	GT:AD:DP:GL:GQ	0/1:205,33:146:-66.38,-43.67,-457.57:99
-chr1	813729	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=0;HaplotypeScore=373.81;MQ=39.70;MQ0=0;OQ=281.23;QD=1.50;SB=15.00	GT:AD:DP:GL:GQ	0/1:127,60:111:-64.84,-33.43,-345.95:99
-chr1	813820	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=81;Dels=0.05;HRun=2;HaplotypeScore=42.41;MQ=49.74;MQ0=3;OQ=162.06;QD=2.00;SB=-100.42	GT:AD:DP:GL:GQ	0/1:56,21:59:-37.26,-17.77,-183.03:99
-chr1	813869	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=73.61;MQ=47.62;MQ0=2;OQ=155.20;QD=1.94;SB=41.14	GT:AD:DP:GL:GQ	0/1:71,9:54:-35.07,-16.26,-160.29:99
-chr1	813877	.	G	A	25.05	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=66.85;MQ=49.86;MQ0=1;QD=0.34;SB=32.11	GT:AD:DP:GL:GQ	0/1:64,9:51:-21.15,-15.36,-169.54:57.88
-chr1	813907	.	G	A	23.05	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=73;Dels=0.04;HRun=1;HaplotypeScore=56.30;MQ=49.27;MQ0=1;QD=0.32;SB=38.13	GT:AD:DP:GL:GQ	0/1:63,7:54:-21.25,-15.66,-171.08:55.87
-chr1	813910	.	G	A	12.29	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=61.37;MQ=49.27;MQ0=1;QD=0.17;SB=35.12	GT:AD:DP:GL:GQ	0/1:63,10:55:-21.06,-16.57,-179.39:44.87
-chr1	813923	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=75;Dels=0.03;HRun=2;HaplotypeScore=23.38;MQ=50.12;MQ0=1;OQ=138.74;QD=1.85;SB=-24.20	GT:AD:DP:GL:GQ	0/1:50,23:55:-33.43,-16.28,-173.24:99
-chr1	813957	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=2;HaplotypeScore=18.68;MQ=43.32;MQ0=1;OQ=871.71;QD=6.86;SB=-275.74	GT:AD:DP:GL:GQ	0/1:65,62:85:-116.06,-25.61,-200.91:99
-chr1	813978	.	A	C	0.71	PASS	AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=39.28;MQ0=4;OQ=705.69;QD=4.77;SB=-252.74	GT:AD:DP:GL:GQ	0/1:54,94:80:-97.95,-24.09,-193.62:99
-chr1	814078	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=1;HaplotypeScore=6.42;MQ=36.79;MQ0=24;OQ=486.46;QD=2.55;SB=-267.20	GT:AD:DP:GL:GQ	0/1:63,128:82:-76.63,-24.70,-247.64:99
-chr1	814121	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=39.43;MQ=40.45;MQ0=17;OQ=289.94;QD=1.73;SB=-38.08	GT:AD:DP:GL:GQ	0/1:70,98:82:-56.99,-24.71,-295.92:99
-chr1	814147	.	C	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=151;Dels=0.00;HRun=0;HaplotypeScore=14.17;MQ=45.92;MQ0=13;OQ=964.78;QD=6.39;SB=-366.58	GT:AD:DP:GL:GQ	0/1:82,69:112:-133.50,-33.74,-285.66:99
-chr1	814171	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=1;HaplotypeScore=20.78;MQ=44.66;MQ0=14;OQ=904.13;QD=5.38;SB=-364.51	GT:AD:DP:GL:GQ	0/1:83,85:118:-129.23,-35.54,-305.53:99
-chr1	814202	.	C	A	1692.96	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=197;Dels=0.09;HRun=0;HaplotypeScore=162.31;MQ=41.97;MQ0=8;QD=8.59;SB=-578.48	GT:AD:DP:GL:GQ	0/1:79,100:139:-213.84,-41.26,-286.69:99
-chr1	814220	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=217;Dels=0.00;HRun=0;HaplotypeScore=50.82;MQ=39.65;MQ0=8;OQ=329.14;QD=1.52;SB=-86.50	GT:AD:DP:GL:GQ	0/1:161,56:136:-77.16,-40.96,-423.94:99
-chr1	814233	.	G	A	2067.86	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=224;Dels=0.00;HRun=0;HaplotypeScore=147.47;MQ=38.66;MQ0=13;QD=9.23;SB=-544.97	GT:AD:DP:GL:GQ	0/1:105,119:132:-249.86,-39.79,-228.63:99
-chr1	814239	.	A	G	1315.30	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=220;Dels=0.00;HRun=1;HaplotypeScore=123.50;MQ=38.45;MQ0=13;QD=5.98;SB=-142.40	GT:AD:DP:GL:GQ	0/1:70,150:114:-169.16,-34.34,-278.17:99
-chr1	814242	.	A	G	554.64	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=0;HaplotypeScore=125.56;MQ=38.13;MQ0=16;QD=2.40;SB=-155.01	GT:AD:DP:GL:GQ	0/1:172,59:130:-97.91,-39.16,-422.03:99
-chr1	814256	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=245;Dels=0.00;HRun=0;HaplotypeScore=21.41;MQ=37.07;MQ0=15;OQ=2324.45;QD=9.49;SB=-360.77	GT:AD:DP:GL:GQ	0/1:68,177:144:-279.11,-43.38,-270.96:99
-chr1	814273	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=0;HaplotypeScore=59.92;MQ=36.71;MQ0=15;OQ=51.68;QD=0.19;SB=122.32	GT:AD:DP:GL:GQ	0/1:221,49:163:-60.05,-51.60,-506.38:84.51
-chr1	814274	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=269;Dels=0.00;HRun=0;HaplotypeScore=59.77;MQ=36.62;MQ0=15;OQ=1850.48;QD=6.88;SB=-407.81	GT:AD:DP:GL:GQ	0/1:149,120:153:-234.45,-46.12,-315.76:99
-chr1	814294	.	A	G	2410.03	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=2;HaplotypeScore=103.79;MQ=37.05;MQ0=15;QD=9.06;SB=-443.47	GT:AD:DP:GL:GQ	0/1:75,191:153:-290.38,-46.10,-295.34:99
-chr1	814296	.	G	A	1211.04	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=274;Dels=0.00;HRun=0;HaplotypeScore=219.20;MQ=36.82;MQ0=15;QD=4.42;SB=-351.23	GT:AD:DP:GL:GQ	0/1:200,74:158:-171.99,-47.60,-420.58:99
-chr1	814301	.	A	G	978.34	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=274;Dels=0.00;HRun=0;HaplotypeScore=220.77;MQ=36.41;MQ0=15;QD=3.57;SB=-180.08	GT:AD:DP:GL:GQ	0/1:73,201:110:-134.26,-33.14,-291.65:99
-chr1	814305	.	T	C	45.78	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=278;Dels=0.00;HRun=0;HaplotypeScore=232.83;MQ=35.76;MQ0=15;QD=0.16;SB=-43.14	GT:AD:DP:GL:GQ	0/1:206,71:102:-38.59,-30.73,-365.14:78.61
-chr1	814318	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=278;Dels=0.00;HRun=0;HaplotypeScore=167.17;MQ=36.26;MQ0=13;OQ=2113.99;QD=7.60;SB=-387.55	GT:AD:DP:GL:GQ	0/1:72,191:148:-269.75,-55.07,-295.63:99
-chr1	814320	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=280;Dels=0.00;HRun=0;HaplotypeScore=167.17;MQ=36.49;MQ0=13;OQ=746.17;QD=2.66;SB=-108.14	GT:AD:DP:GL:GQ	0/1:218,62:140:-120.08,-42.18,-412.31:99
-chr1	814333	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=285;Dels=0.00;HRun=0;HaplotypeScore=281.15;MQ=35.53;MQ0=9;OQ=1990.33;QD=6.98;SB=-447.96	GT:AD:DP:GL:GQ	0/1:95,190:142:-245.09,-42.77,-288.22:99
-chr1	814346	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=251;Dels=0.00;HRun=0;HaplotypeScore=225.23;MQ=36.32;MQ0=4;OQ=1683.84;QD=6.71;SB=-421.88	GT:AD:DP:GL:GQ	0/1:107,144:128:-210.24,-38.57,-269.23:99
-chr1	814360	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=2;HaplotypeScore=149.83;MQ=38.08;MQ0=4;OQ=172.19;QD=0.77;SB=51.61	GT:AD:DP:GL:GQ	0/1:195,28:117:-55.74,-35.24,-362.13:99
-chr1	814384	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=1;HaplotypeScore=42.51;MQ=45.49;MQ0=3;OQ=551.67;QD=3.70;SB=-145.33	GT:AD:DP:GL:GQ	0/1:76,73:99:-88.27,-29.82,-286.26:99
-chr1	814428	.	T	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=0;HaplotypeScore=10.58;MQ=49.14;MQ0=17;OQ=342.52;QD=2.63;SB=-111.49	GT:AD:DP:GL:GQ	0/1:82,48:99:-67.35,-29.82,-298.71:99
-chr1	814439	.	C	T	20.82	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=47.72;MQ0=20;QD=0.14;SB=152.46	GT:AD:DP:GL:GQ	0/1:137,12:115:-40.00,-34.64,-383.60:53.62
-chr1	814456	.	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=1;HaplotypeScore=15.28;MQ=46.84;MQ0=26;OQ=753.94;QD=4.65;SB=-138.63	GT:AD:DP:GL:GQ	0/1:92,70:122:-115.43,-36.75,-321.50:99
-chr1	814470	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=189;Dels=0.00;HRun=1;HaplotypeScore=31.58;MQ=44.82;MQ0=39;OQ=884.58;QD=4.68;SB=-229.69	GT:AD:DP:GL:GQ	0/1:97,92:121:-128.25,-36.50,-368.74:99
-chr1	814488	.	C	A	76.03	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=247;Dels=0.00;HRun=0;HaplotypeScore=105.09;MQ=41.14;MQ0=41;QD=0.31;SB=176.55	GT:AD:DP:GL:GQ	0/1:229,16:148:-55.47,-44.58,-476.50:99
-chr1	814489	.	C	G	69.13	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=248;Dels=0.00;HRun=0;HaplotypeScore=89.81;MQ=41.12;MQ0=41;QD=0.28;SB=176.62	GT:AD:DP:GL:GQ	0/1:231,17:149:-55.10,-44.90,-596.57:99
-chr1	814495	.	T	C	1858.16	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=258;Dels=0.00;HRun=0;HaplotypeScore=56.93;MQ=40.44;MQ0=47;QD=7.20;SB=-760.45	GT:AD:DP:GL:GQ	0/1:92,166:157:-236.40,-47.30,-370.00:99
-chr1	814529	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=433;Dels=0.00;HRun=0;HaplotypeScore=120.51;MQ=38.11;MQ0=39;OQ=500.57;QD=1.16;SB=-243.42	GT:AD:DP:GL:GQ	0/1:383,50:261:-131.95,-78.61,-806.43:99
-chr1	814534	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=446;Dels=0.00;HRun=0;HaplotypeScore=107.63;MQ=38.32;MQ0=36;OQ=359.59;QD=0.81;SB=-173.49	GT:AD:DP:GL:GQ	0/1:401,44:272:-121.18,-81.93,-841.90:99
-chr1	814540	.	A	G	36.54	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=477;Dels=0.00;HRun=1;HaplotypeScore=62.33;MQ=38.25;MQ0=37;QD=0.08;SB=123.17	GT:AD:DP:GL:GQ	0/1:445,32:265:-86.76,-79.83,-986.21:69.37
-chr1	814554	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=529;Dels=0.00;HRun=0;HaplotypeScore=89.36;MQ=37.97;MQ0=32;OQ=9731.93;QD=18.40;SB=-1976.66	GT:AD:DP:GL:GQ	0/1:80,449:318:-972.19,-95.79,-281.92:99
-chr1	814557	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=552;Dels=0.00;HRun=0;HaplotypeScore=97.56;MQ=38.01;MQ0=31;OQ=8661.84;QD=15.69;SB=-1680.73	GT:AD:DP:GL:GQ	0/1:195,357:340:-865.18,-102.42,-472.42:99
-chr1	814572	rs564838	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=625;Dels=0.00;HRun=1;HaplotypeScore=63.63;MQ=38.08;MQ0=27;OQ=2371.32;QD=3.79;SB=-326.77	GT:AD:DP:GL:GQ	0/1:480,145:413:-364.80,-124.39,-1136.05:99
-chr1	814627	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=504;Dels=0.00;HRun=1;HaplotypeScore=183.33;MQ=39.27;MQ0=14;OQ=10984.00;QD=21.79;SB=-1265.89	GT:AD:DP:GL:GQ	0/1:67,203:343:-1097.40,-537.50,-676.52:99
-chr1	814675	.	G	A	2732.90	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=265;Dels=0.00;HRun=1;HaplotypeScore=261.45;MQ=41.69;MQ0=11;QD=10.31;SB=-108.93	GT:AD:DP:GL:GQ	0/1:161,102:166:-330.09,-53.51,-314.61:99
-chr1	814679	.	A	G	2402.46	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=237;Dels=0.00;HRun=1;HaplotypeScore=135.51;MQ=41.79;MQ0=13;QD=10.14;SB=-20.34	GT:AD:DP:GL:GQ	0/1:70,167:146:-287.52,-43.99,-273.83:99
-chr1	814680	.	C	T	2092.18	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=238;Dels=0.00;HRun=0;HaplotypeScore=134.51;MQ=41.43;MQ0=17;QD=8.79;SB=-7.62	GT:AD:DP:GL:GQ	0/1:151,86:144:-255.88,-43.38,-283.23:99
-chr1	814701	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=219;Dels=0.00;HRun=0;HaplotypeScore=51.82;MQ=41.75;MQ0=19;OQ=1622.55;QD=7.41;SB=-75.48	GT:AD:DP:GL:GQ	0/1:87,132:141:-208.02,-42.48,-267.24:99
-chr1	814708	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=222;Dels=0.00;HRun=0;HaplotypeScore=76.68;MQ=40.68;MQ0=25;OQ=2028.26;QD=9.14;SB=-58.81	GT:AD:DP:GL:GQ	0/1:84,138:144:-249.49,-43.38,-267.28:99
-chr1	814713	rs563211	T	C	1374.69	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=232;Dels=0.00;HRun=0;HaplotypeScore=105.58;MQ=40.40;MQ0=29;QD=5.93;SB=29.72	GT:AD:DP:GL:GQ	0/1:146,86:143:-183.83,-43.08,-359.04:99
-chr1	814720	.	T	C	689.97	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=0;HaplotypeScore=108.11;MQ=39.59;MQ0=32;QD=2.84;SB=46.65	GT:AD:DP:GL:GQ	0/1:85,157:115:-106.92,-34.64,-346.63:99
-chr1	814722	.	C	G	183.01	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=254;Dels=0.00;HRun=0;HaplotypeScore=126.09;MQ=39.61;MQ0=33;QD=0.72;SB=68.61	GT:AD:DP:GL:GQ	0/1:217,37:122:-58.35,-36.76,-472.38:99
-chr1	814737	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=299;Dels=0.00;HRun=0;HaplotypeScore=30.86;MQ=38.18;MQ0=38;OQ=2218.82;QD=7.42;SB=-36.77	GT:AD:DP:GL:GQ	0/1:186,113:186:-281.20,-56.03,-416.78:99
-chr1	814767	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=365;Dels=0.00;HRun=2;HaplotypeScore=49.56;MQ=35.63;MQ0=43;OQ=5264.89;QD=14.42;SB=-427.42	GT:AD:DP:GL:GQ	0/1:96,269:216:-525.49,-65.13,-366.09:99
-chr1	814784	.	A	G	211.71	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=402;Dels=0.00;HRun=0;HaplotypeScore=324.91;MQ=34.66;MQ0=41;QD=0.53;SB=-28.05	GT:AD:DP:GL:GQ	0/1:357,45:243:-97.65,-73.19,-885.32:99
-chr1	814787	.	A	G	1988.10	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=404;Dels=0.00;HRun=0;HaplotypeScore=288.76;MQ=34.45;MQ0=41;QD=4.92;SB=-448.31	GT:AD:DP:GL:GQ	0/1:239,165:199:-262.08,-59.99,-467.56:99
-chr1	814790	.	G	A	2076.12	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=406;Dels=0.00;HRun=0;HaplotypeScore=289.81;MQ=34.38;MQ0=42;QD=5.11;SB=-426.20	GT:AD:DP:GL:GQ	0/1:294,112:245:-284.69,-73.80,-651.34:99
-chr1	814794	.	G	C	5521.90	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=400;Dels=0.00;HRun=0;HaplotypeScore=359.70;MQ=34.34;MQ0=40;QD=13.80;SB=-919.83	GT:AD:DP:GL:GQ	0/1:77,252:207:-551.19,-211.22,-478.27:99
-chr1	814804	.	C	T	88.70	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=434;Dels=0.00;HRun=1;HaplotypeScore=347.22;MQ=35.87;MQ0=35;QD=0.20;SB=-33.30	GT:AD:DP:GL:GQ	0/1:387,47:188:-68.79,-56.64,-599.68:99
-chr1	814807	.	A	C	912.16	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=446;Dels=0.00;HRun=1;HaplotypeScore=302.12;MQ=36.31;MQ0=35;QD=2.05;SB=-348.23	GT:AD:DP:GL:GQ	0/1:319,127:242:-167.40,-72.90,-690.79:99
-chr1	814811	.	C	T	8629.57	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=472;Dels=0.00;HRun=2;HaplotypeScore=321.44;MQ=36.81;MQ0=35;QD=18.28;SB=-2662.56	GT:AD:DP:GL:GQ	0/1:133,339:310:-861.96,-93.38,-350.61:99
-chr1	814815	.	G	A	1219.97	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=497;Dels=0.00;HRun=1;HaplotypeScore=253.88;MQ=37.19;MQ0=33;QD=2.45;SB=-308.28	GT:AD:DP:GL:GQ	0/1:414,82:332:-225.30,-100.02,-991.58:99
-chr1	814833	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=552;Dels=0.00;HRun=0;HaplotypeScore=30.66;MQ=38.93;MQ0=25;OQ=13138.69;QD=23.80;SB=-5564.86	GT:AD:DP:GL:GQ	0/1:68,484:387:-1312.87,-116.58,-241.99:99
-chr1	814846	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=600;Dels=0.00;HRun=1;HaplotypeScore=69.54;MQ=39.19;MQ0=23;OQ=3136.64;QD=5.23;SB=-1237.78	GT:AD:DP:GL:GQ	0/1:435,165:409:-440.13,-123.18,-1039.78:99
-chr1	814879	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=693;Dels=0.00;HRun=0;HaplotypeScore=388.69;MQ=39.91;MQ0=7;OQ=8125.01;QD=11.72;SB=-2578.04	GT:AD:DP:GL:GQ	0/1:409,284:467:-811.50,-140.66,-960.39:99
-chr1	814880	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=692;Dels=0.00;HRun=2;HaplotypeScore=381.90;MQ=39.95;MQ0=7;OQ=2413.57;QD=3.49;SB=-960.49	GT:AD:DP:GL:GQ	0/1:533,158:465:-387.57,-142.93,-1289.43:99
-chr1	814900	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=699;Dels=0.00;HRun=0;HaplotypeScore=119.56;MQ=39.22;MQ0=14;OQ=14541.95;QD=20.80;SB=-4000.09	GT:AD:DP:GL:GQ	0/1:90,605:445:-1453.20,-134.09,-272.14:99
-chr1	814929	.	C	T	1261.33	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=562;Dels=0.00;HRun=0;HaplotypeScore=644.78;MQ=37.11;MQ0=29;QD=2.24;SB=-29.99	GT:AD:DP:GL:GQ	0/1:384,176:313:-223.70,-94.28,-953.66:99
-chr1	814931	.	T	C	7350.11	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=554;Dels=0.00;HRun=4;HaplotypeScore=616.85;MQ=36.93;MQ0=28;QD=13.27;SB=-1896.86	GT:AD:DP:GL:GQ	0/1:148,405:309:-734.01,-93.08,-440.40:99
-chr1	814932	rs4475692	G	A	10783.24	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=554;Dels=0.00;HRun=0;HaplotypeScore=621.95;MQ=36.79;MQ0=29;QD=19.46;SB=-2129.22	GT:AD:DP:GL:GQ	0/1:174,298:306:-1077.32,-380.57,-459.91:99
-chr1	814939	.	G	A	1306.21	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=568;Dels=0.00;HRun=1;HaplotypeScore=479.84;MQ=36.20;MQ0=35;QD=2.30;SB=-170.45	GT:AD:DP:GL:GQ	0/1:402,165:327:-232.39,-98.48,-986.51:99
-chr1	814952	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=543;Dels=0.00;HRun=0;HaplotypeScore=51.53;MQ=35.74;MQ0=35;OQ=140.17;QD=0.26;SB=144.16	GT:AD:DP:GL:GQ	0/1:482,61:349:-122.41,-105.11,-1207.38:99
-chr1	814967	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=541;Dels=0.00;HRun=0;HaplotypeScore=312.71;MQ=35.10;MQ0=40;OQ=7468.20;QD=13.80;SB=-2338.34	GT:AD:DP:GL:GQ	0/1:256,284:360:-745.82,-108.45,-622.35:99
-chr1	814975	.	C	T	35.90	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=483;Dels=0.00;HRun=0;HaplotypeScore=80.80;MQ=34.88;MQ0=44;QD=0.07;SB=387.40	GT:AD:DP:GL:GQ	0/1:418,42:326:-167.53,-160.66,-1098.08:68.73
-chr1	815007	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=591;Dels=0.00;HRun=1;HaplotypeScore=71.67;MQ=32.27;MQ0=41;OQ=5134.52;QD=8.69;SB=-1587.17	GT:AD:DP:GL:GQ	0/1:388,203:408:-512.45,-122.89,-966.60:99
-chr1	815060	rs7417801	G	A	11239.90	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=650;Dels=0.00;HRun=0;HaplotypeScore=316.82;MQ=33.42;MQ0=19;QD=17.29;SB=-4737.34	GT:AD:DP:GL:GQ	0/1:178,470:421:-1122.99,-126.87,-458.77:99
-chr1	815061	.	C	T	1691.04	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=650;Dels=0.00;HRun=1;HaplotypeScore=315.98;MQ=33.65;MQ0=19;QD=2.60;SB=-738.44	GT:AD:DP:GL:GQ	0/1:537,113:421:-299.19,-126.80,-1266.58:99
-chr1	815070	rs61768257	T	C	12258.60	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=631;Dels=0.00;HRun=0;HaplotypeScore=343.15;MQ=33.97;MQ0=16;QD=19.43;SB=-5504.71	GT:AD:DP:GL:GQ	0/1:80,551:412:-1224.86,-124.09,-309.22:99
-chr1	815113	rs61768258	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=470;Dels=0.00;HRun=0;HaplotypeScore=109.35;MQ=33.63;MQ0=24;OQ=6584.76;QD=14.01;SB=-2185.39	GT:AD:DP:GL:GQ	0/1:114,356:254:-657.48,-76.51,-273.29:99
-chr1	815129	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=382;Dels=0.00;HRun=3;HaplotypeScore=48.33;MQ=33.58;MQ0=23;OQ=4485.00;QD=11.74;SB=-986.12	GT:AD:DP:GL:GQ	0/1:120,260:190:-447.50,-57.26,-260.95:99
-chr1	815155	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=321;Dels=0.00;HRun=2;HaplotypeScore=58.38;MQ=34.02;MQ0=21;OQ=1737.47;QD=5.41;SB=15.00	GT:AD:DP:GL:GQ	0/1:189,132:155:-223.72,-46.69,-361.30:99
-chr1	815170	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=270;Dels=0.00;HRun=0;HaplotypeScore=137.94;MQ=34.80;MQ0=19;OQ=2424.70;QD=8.98;SB=14.59	GT:AD:DP:GL:GQ	0/1:64,205:125:-283.44,-37.69,-171.56:99
-chr1	815209	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=4;HaplotypeScore=80.30;MQ=38.66;MQ0=0;OQ=2224.65;QD=10.44;SB=11.50	GT:AD:DP:GL:GQ	0/1:67,146:136:-266.72,-40.97,-258.01:99
-chr1	815222	.	C	G	180.27	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=222;Dels=0.00;HRun=2;HaplotypeScore=142.18;MQ=38.40;MQ0=0;QD=0.81;SB=9.29	GT:AD:DP:GL:GQ	0/1:186,36:136:-62.35,-41.04,-500.13:99
-chr1	815223	.	G	T	2117.77	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=1;HaplotypeScore=129.82;MQ=38.70;MQ0=0;QD=9.80;SB=21.09	GT:AD:DP:GL:GQ	0/1:67,149:140:-257.24,-42.18,-220.42:99
-chr1	815225	.	C	A	1105.29	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=217;Dels=0.00;HRun=2;HaplotypeScore=129.82;MQ=38.83;MQ0=0;QD=5.09;SB=62.22	GT:AD:DP:GL:GQ	0/1:119,82:139:-174.62,-60.81,-341.62:99
-chr1	815273	rs13303179	G	A	2565.92	DPFilter;Indel	AC=1;AF=0.50;AN=2;DB;DP=228;Dels=0.03;HRun=0;HaplotypeScore=354.84;MQ=39.22;MQ0=2;QD=11.25;SB=-1159.78	GT:AD:DP:GL:GQ	0/1:137,80:90:-286.39,-26.51,-60.11:99
-chr1	815278	.	G	T	761.09	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=240;Dels=0.00;HRun=1;HaplotypeScore=623.87;MQ=38.93;MQ0=0;QD=3.17;SB=80.36	GT:AD:DP:GL:GQ	0/1:181,48:118:-132.78,-53.39,-296.79:99
-chr1	815284	.	A	T	612.72	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=234;Dels=0.01;HRun=0;HaplotypeScore=131.40;MQ=39.54;MQ0=0;QD=2.62;SB=-4.85	GT:AD:DP:GL:GQ	0/1:70,108:89:-96.12,-31.56,-237.53:99
-chr1	815299	.	C	T	462.61	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=1;HaplotypeScore=228.02;MQ=37.95;MQ0=1;QD=1.71;SB=107.29	GT:AD:DP:GL:GQ	0/1:137,134:104:-80.88,-31.33,-296.80:99
-chr1	815300	.	A	G	825.50	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=268;Dels=0.00;HRun=0;HaplotypeScore=227.74;MQ=37.73;MQ0=1;QD=3.08;SB=104.37	GT:AD:DP:GL:GQ	0/1:110,156:125:-123.50,-37.66,-346.20:99
-chr1	815308	.	A	G	1233.06	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=264;Dels=0.00;HRun=0;HaplotypeScore=419.76;MQ=37.40;MQ0=1;QD=4.67;SB=68.40	GT:AD:DP:GL:GQ	0/1:127,137:154:-172.99,-46.40,-402.39:99
-chr1	815312	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=276;Dels=0.00;HRun=0;HaplotypeScore=183.65;MQ=36.17;MQ0=1;OQ=3931.91;QD=14.25;SB=-32.81	GT:AD:DP:GL:GQ	0/1:62,214:156:-392.19,-47.02,-185.37:99
-chr1	815328	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=297;Dels=0.00;HRun=0;HaplotypeScore=61.42;MQ=35.05;MQ0=1;OQ=1563.62;QD=5.26;SB=37.57	GT:AD:DP:GL:GQ	0/1:210,87:190:-216.89,-57.25,-456.11:99
-chr1	815333	.	A	G	262.79	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=299;Dels=0.00;HRun=0;HaplotypeScore=239.02;MQ=35.16;MQ0=1;QD=0.88;SB=12.36	GT:AD:DP:GL:GQ	0/1:257,42:214:-94.06,-64.49,-716.97:99
-chr1	815339	.	G	A	1298.73	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=284;Dels=0.00;HRun=1;HaplotypeScore=174.26;MQ=34.74;MQ0=1;QD=4.57;SB=28.57	GT:AD:DP:GL:GQ	0/1:213,70:192:-191.01,-57.85,-488.27:99
-chr1	815340	.	C	A	157.45	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=279;Dels=0.00;HRun=0;HaplotypeScore=166.11;MQ=34.52;MQ0=1;QD=0.56;SB=56.17	GT:AD:DP:GL:GQ	0/1:238,39:195:-77.77,-58.74,-595.87:99
-chr1	815347	.	C	T	431.68	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=0;HaplotypeScore=149.67;MQ=34.21;MQ0=1;QD=1.59;SB=13.61	GT:AD:DP:GL:GQ	0/1:219,52:183:-101.60,-55.14,-567.56:99
-chr1	815356	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=282;Dels=0.00;HRun=0;HaplotypeScore=134.05;MQ=33.48;MQ0=1;OQ=648.64;QD=2.30;SB=53.15	GT:AD:DP:GL:GQ	0/1:240,42:173:-120.28,-52.13,-519.88:99
-chr1	815363	.	G	A	778.46	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=288;Dels=0.00;HRun=0;HaplotypeScore=145.91;MQ=33.47;MQ0=1;QD=2.70;SB=9.52	GT:AD:DP:GL:GQ	0/1:221,66:188:-137.76,-56.63,-540.20:99
-chr1	815371	.	T	A	4591.13	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=275;Dels=0.00;HRun=0;HaplotypeScore=258.43;MQ=32.98;MQ0=1;QD=16.70;SB=38.12	GT:AD:DP:GL:GQ	0/1:49,226:171:-458.11,-51.51,-170.42:99
-chr1	815373	.	A	T	533.41	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=286;Dels=0.00;HRun=2;HaplotypeScore=261.79;MQ=33.03;MQ0=1;QD=1.87;SB=35.14	GT:AD:DP:GL:GQ	0/1:246,39:154:-103.02,-46.39,-455.31:99
-chr1	815376	.	C	A	1170.34	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=282;Dels=0.00;HRun=0;HaplotypeScore=127.10;MQ=33.82;MQ0=1;QD=4.15;SB=38.15	GT:AD:DP:GL:GQ	0/1:188,94:146:-164.30,-43.98,-347.79:99
-chr1	815381	.	G	A	252.28	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=299;Dels=0.00;HRun=0;HaplotypeScore=149.34;MQ=33.65;MQ0=1;QD=0.84;SB=44.17	GT:AD:DP:GL:GQ	0/1:261,37:167:-78.82,-50.30,-512.70:99
-chr1	815393	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=275;Dels=0.00;HRun=2;HaplotypeScore=32.62;MQ=34.43;MQ0=1;OQ=361.63;QD=1.32;SB=59.23	GT:AD:DP:GL:GQ	0/1:214,61:130:-78.62,-39.18,-425.44:99
-chr1	815401	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=262;Dels=0.00;HRun=0;HaplotypeScore=139.53;MQ=35.48;MQ0=0;OQ=534.52;QD=2.04;SB=65.23	GT:AD:DP:GL:GQ	0/1:204,58:105:-88.37,-31.63,-309.51:99
-chr1	815405	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=256;Dels=0.00;HRun=0;HaplotypeScore=139.38;MQ=35.34;MQ0=0;OQ=1047.66;QD=4.09;SB=65.23	GT:AD:DP:GL:GQ	0/1:61,195:95:-136.67,-28.62,-215.61:99
-chr1	815412	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=227;Dels=0.00;HRun=1;HaplotypeScore=225.15;MQ=36.20;MQ0=0;OQ=276.35;QD=1.22;SB=65.25	GT:AD:DP:GL:GQ	0/1:61,166:74:-53.21,-22.29,-232.02:99
-chr1	815417	rs4970337	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=202;Dels=0.00;HRun=1;HaplotypeScore=585.49;MQ=36.06;MQ0=0;OQ=1433.41;QD=7.10;SB=-630.86	GT:AD:DP:GL:GQ	1/1:20,53:52:-158.74,-15.68,-11.81:38.71
-chr1	815425	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=183;Dels=0.00;HRun=0;HaplotypeScore=313.15;MQ=35.48;MQ0=0;OQ=58.46;QD=0.32;SB=65.13	GT:AD:DP:GL:GQ	0/1:47,51:54:-25.40,-16.27,-162.78:91.30
-chr1	815458	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=13.84;MQ=40.96;MQ0=1;OQ=53.27;QD=0.51;SB=62.22	GT:AD:DP:GL:GQ	0/1:68,36:55:-25.19,-16.58,-184.48:86.11
-chr1	815470	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=23.44;MQ=43.10;MQ0=1;OQ=126.81;QD=1.44;SB=62.23	GT:AD:DP:GL:GQ	0/1:44,44:50:-31.03,-15.06,-165.46:99
-chr1	815557	.	T	C	22.78	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=1;HaplotypeScore=22.31;MQ=51.18;MQ0=1;QD=0.27;SB=2.47	GT:AD:DP:GL:GQ	0/1:71,13:68:-26.06,-20.50,-237.08:55.60
-chr1	815639	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=2;HaplotypeScore=38.60;MQ=52.07;MQ0=2;OQ=197.56;QD=2.27;SB=80.29	GT:AD:DP:GL:GQ	0/1:75,12:73:-45.07,-22.03,-247.37:99
-chr1	815714	rs4549984	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=282;Dels=0.00;HRun=0;HaplotypeScore=45.55;MQ=35.23;MQ0=6;OQ=3065.05;QD=10.87;SB=-490.50	GT:AD:DP:GL:GQ	0/1:131,151:198:-369.43,-59.64,-380.00:99
-chr1	815740	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=388;Dels=0.00;HRun=1;HaplotypeScore=91.19;MQ=33.31;MQ0=8;OQ=203.81;QD=0.53;SB=46.30	GT:AD:DP:GL:GQ	0/1:351,35:273:-111.13,-87.46,-857.56:99
-chr1	815759	.	A	T	981.66	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=425;Dels=0.00;HRun=0;HaplotypeScore=319.89;MQ=33.30;MQ0=16;QD=2.31;SB=-282.31	GT:AD:DP:GL:GQ	0/1:309,70:292:-258.47,-157.02,-944.68:99
-chr1	815760	.	C	A	1978.15	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=424;Dels=0.00;HRun=3;HaplotypeScore=319.89;MQ=33.21;MQ0=16;QD=4.67;SB=-361.60	GT:AD:DP:GL:GQ	0/1:311,113:290:-288.45,-87.35,-755.50:99
-chr1	815761	.	C	A	1757.71	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=422;Dels=0.00;HRun=1;HaplotypeScore=319.47;MQ=33.03;MQ0=16;QD=4.17;SB=-393.48	GT:AD:DP:GL:GQ	0/1:295,112:286:-275.36,-96.30,-763.46:99
-chr1	815762	.	A	G	1602.96	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=423;Dels=0.00;HRun=0;HaplotypeScore=319.57;MQ=33.04;MQ0=16;QD=3.79;SB=-325.52	GT:AD:DP:GL:GQ	0/1:273,113:288:-310.25,-146.67,-857.16:99
-chr1	815765	.	G	A	2936.95	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=427;Dels=0.00;HRun=3;HaplotypeScore=320.41;MQ=33.17;MQ0=17;QD=6.88;SB=-566.97	GT:AD:DP:GL:GQ	0/1:277,150:291:-384.73,-87.75,-614.82:99
-chr1	815777	.	C	T	24.19	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=434;Dels=0.00;HRun=0;HaplotypeScore=73.54;MQ=32.97;MQ0=17;QD=0.06;SB=99.73	GT:AD:DP:GL:GQ	0/1:393,41:292:-93.65,-87.95,-958.63:57.01
-chr1	815780	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=432;Dels=0.00;HRun=1;HaplotypeScore=75.21;MQ=32.79;MQ0=17;OQ=115.11;QD=0.27;SB=79.01	GT:AD:DP:GL:GQ	0/1:399,33:289:-101.84,-87.05,-1076.94:99
-chr1	815810	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=3;HaplotypeScore=40.23;MQ=35.68;MQ0=17;OQ=207.08;QD=0.78;SB=-57.21	GT:AD:DP:GL:GQ	0/1:229,35:180:-78.22,-54.22,-636.76:99
-chr1	815845	.	C	G	0.13	PASS	AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=5.72;MQ=49.45;MQ0=9;OQ=487.79;QD=4.69;SB=-262.79	GT:AD:DP:GL:GQ	0/1:68,36:85:-77.68,-25.61,-285.79:99
-chr1	815857	.	T	A	21.33	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=5.01;MQ=54.04;MQ0=5;QD=0.23;SB=16.48	GT:AD:DP:GL:GQ	0/1:77,14:82:-30.11,-24.70,-281.02:54.14
-chr1	815931	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=2;HaplotypeScore=25.80;MQ=41.76;MQ0=34;OQ=413.34;QD=2.70;SB=-90.95	GT:AD:DP:GL:GQ	0/1:89,64:100:-74.74,-30.13,-291.31:99
-chr1	815936	.	T	G	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=41.51;MQ0=35;OQ=307.08;QD=1.93;SB=-87.61	GT:AD:DP:GL:GQ	0/1:91,68:101:-64.41,-30.42,-308.26:99
-chr1	815949	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=1;HaplotypeScore=25.06;MQ=39.71;MQ0=34;OQ=456.33;QD=2.82;SB=-102.31	GT:AD:DP:GL:GQ	0/1:134,28:100:-79.04,-30.12,-319.08:99
-chr1	815979	.	A	G	1177.05	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=1;HaplotypeScore=140.50;MQ=42.13;MQ0=3;QD=7.18;SB=-203.16	GT:AD:DP:GL:GQ	0/1:88,76:129:-159.86,-38.87,-326.00:99
-chr1	815980	.	T	C	32.10	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=144.97;MQ=42.03;MQ0=3;QD=0.19;SB=-40.00	GT:AD:DP:GL:GQ	0/1:145,23:122:-43.25,-36.76,-439.68:64.94
-chr1	815986	.	A	G	296.02	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=2;HaplotypeScore=92.41;MQ=40.86;MQ0=3;QD=1.64;SB=-47.33	GT:AD:DP:GL:GQ	0/1:153,28:121:-69.34,-36.45,-404.50:99
-chr1	816000	.	G	A	125.95	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=173;Dels=0.00;HRun=1;HaplotypeScore=82.29;MQ=39.25;MQ0=3;QD=0.73;SB=53.66	GT:AD:DP:GL:GQ	0/1:159,14:109:-48.71,-32.83,-348.18:99
-chr1	816001	.	G	A	216.96	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=171;Dels=0.00;HRun=0;HaplotypeScore=91.06;MQ=39.38;MQ0=3;QD=1.27;SB=50.65	GT:AD:DP:GL:GQ	0/1:127,38:117:-81.21,-56.23,-367.68:99
-chr1	816004	.	G	A	219.09	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=172;Dels=0.00;HRun=0;HaplotypeScore=92.89;MQ=39.19;MQ0=0;QD=1.27;SB=56.64	GT:AD:DP:GL:GQ	0/1:125,47:119:-61.04,-35.85,-362.44:99
-chr1	816007	.	G	A	88.79	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=173;Dels=0.02;HRun=1;HaplotypeScore=88.30;MQ=38.80;MQ0=0;QD=0.51;SB=95.33	GT:AD:DP:GL:GQ	0/1:131,39:117:-47.40,-35.24,-375.36:99
-chr1	816018	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=196;Dels=0.00;HRun=1;HaplotypeScore=112.53;MQ=36.89;MQ0=0;OQ=274.62;QD=1.40;SB=-52.14	GT:AD:DP:GL:GQ	0/1:173,23:109:-63.59,-32.85,-401.41:99
-chr1	816026	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=182;Dels=0.00;HRun=0;HaplotypeScore=509.63;MQ=37.96;MQ0=0;OQ=1247.86;QD=6.86;SB=56.18	GT:AD:DP:GL:GQ	0/1:108,73:128:-166.63,-38.56,-316.49:99
-chr1	816043	.	A	G	1178.79	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=281;Dels=0.00;HRun=0;HaplotypeScore=614.45;MQ=34.94;MQ0=1;QD=4.19;SB=56.21	GT:AD:DP:GL:GQ	0/1:198,83:191:-178.71,-57.55,-539.60:99
-chr1	816057	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=287;Dels=0.00;HRun=0;HaplotypeScore=198.13;MQ=34.34;MQ0=4;OQ=1603.81;QD=5.59;SB=62.23	GT:AD:DP:GL:GQ	0/1:144,109:196:-293.22,-129.56,-512.85:99
-chr1	816072	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=309;Dels=0.00;HRun=0;HaplotypeScore=33.06;MQ=33.48;MQ0=15;OQ=115.32;QD=0.37;SB=71.18	GT:AD:DP:GL:GQ	0/1:282,15:160:-71.44,-56.63,-531.53:99
-chr1	816077	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=299;Dels=0.00;HRun=0;HaplotypeScore=55.33;MQ=33.49;MQ0=15;OQ=4794.59;QD=16.04;SB=68.22	GT:AD:DP:GL:GQ	0/1:81,218:173:-478.46,-52.11,-201.39:99
-chr1	816088	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=278;Dels=0.00;HRun=1;HaplotypeScore=51.57;MQ=34.30;MQ0=16;OQ=4463.53;QD=16.06;SB=62.23	GT:AD:DP:GL:GQ	0/1:58,220:169:-445.35,-50.90,-214.04:99
-chr1	816103	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=237;Dels=0.00;HRun=0;HaplotypeScore=38.99;MQ=36.26;MQ0=16;OQ=1889.47;QD=7.97;SB=68.20	GT:AD:DP:GL:GQ	0/1:61,152:117:-237.42,-45.19,-199.18:99
-chr1	816115	.	C	T	1441.66	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=202;Dels=0.00;HRun=0;HaplotypeScore=145.73;MQ=37.27;MQ0=15;QD=7.14;SB=68.18	GT:AD:DP:GL:GQ	0/1:132,70:112:-181.22,-33.77,-214.53:99
-chr1	816118	.	A	T	125.43	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=0;HaplotypeScore=164.12;MQ=38.34;MQ0=15;QD=0.66;SB=77.28	GT:AD:DP:GL:GQ	0/1:145,37:109:-58.41,-42.58,-369.08:99
-chr1	816122	.	G	C	132.11	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=182;Dels=0.00;HRun=0;HaplotypeScore=159.96;MQ=38.91;MQ0=15;QD=0.73;SB=80.30	GT:AD:DP:GL:GQ	0/1:155,27:96:-45.43,-28.94,-364.83:99
-chr1	816123	.	A	G	766.79	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=157.96;MQ=38.91;MQ0=14;QD=4.28;SB=80.30	GT:AD:DP:GL:GQ	0/1:86,89:106:-121.93,-41.97,-306.67:99
-chr1	816140	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=2;HaplotypeScore=35.96;MQ=45.77;MQ0=9;OQ=496.37;QD=3.82;SB=92.32	GT:AD:DP:GL:GQ	0/1:81,49:95:-81.53,-28.61,-273.48:99
-chr1	817130	rs2879698	C	T	1.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=7.86;MQ=52.69;MQ0=4;OQ=2390.21;QD=32.30;SB=-1172.34	GT:AD:DP:GL:GQ	1/1:5,69:61:-242.62,-18.38,-0.02:99
-chr1	817140	rs4246498	T	C	134.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=52.12;MQ0=4;OQ=2043.04;QD=29.61;SB=-1026.82	GT:AD:DP:GL:GQ	1/1:0,69:59:-207.91,-17.78,-0.03:99
-chr1	817186	rs4970386	C	T	31.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=4.56;MQ=51.33;MQ0=3;OQ=2194.13;QD=35.39;SB=-970.28	GT:AD:DP:GL:GQ	1/1:3,59:55:-223.01,-16.57,-0.01:99
-chr1	819196	rs9778019	G	A	567.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.32;MQ0=0;OQ=1941.14;QD=39.62;SB=-968.30	GT:AD:DP:GL:GQ	1/1:0,49:49:-197.71,-14.76,-0.01:99
-chr1	819500	rs4437820	C	T	68.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=1.98;MQ=47.44;MQ0=2;OQ=2599.35;QD=37.13;SB=-1006.03	GT:AD:DP:GL:GQ	1/1:0,70:64:-263.53,-19.28,-0.01:99
-chr1	819787	.	G	A	25.28	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=9.99;MQ=51.75;MQ0=1;QD=0.29;SB=104.31	GT:AD:DP:GL:GQ	0/1:80,8:75:-28.42,-22.61,-220.79:58.10
-chr1	820044	rs28444699	A	G	2.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=5.59;MQ=55.18;MQ0=2;OQ=1994.05;QD=28.49;SB=-1022.00	GT:AD:DP:GL:GQ	1/1:9,61:60:-210.82,-18.07,-7.83:99
-chr1	820670	rs6422669	G	C	266.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.30;MQ0=1;OQ=1743.26;QD=40.54;SB=-467.22	GT:AD:DP:GL:GQ	1/1:1,42:42:-177.93,-12.66,-0.02:99
-chr1	821139	rs4024798	C	T	0.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=239;Dels=0.00;HRun=1;HaplotypeScore=9.98;MQ=39.26;MQ0=24;OQ=434.25;QD=1.82;SB=23.91	GT:AD:DP:GL:GQ	0/1:189,50:167:-97.03,-50.32,-487.12:99
-chr1	821171	rs477080	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=308;Dels=0.00;HRun=0;HaplotypeScore=33.10;MQ=34.56;MQ0=43;OQ=282.37;QD=0.92;SB=137.47	GT:AD:DP:GL:GQ	0/1:233,75:190:-88.75,-57.23,-688.44:99
-chr1	821352	rs4970385	C	T	0.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=12.93;MQ=49.51;MQ0=5;OQ=2978.23;QD=32.02;SB=-1308.26	GT:AD:DP:GL:GQ	1/1:14,79:78:-308.32,-23.50,-6.91:99
-chr1	821772	rs9697642	C	T	1.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=6.48;MQ=53.07;MQ0=1;OQ=2639.96;QD=38.26;SB=-935.74	GT:AD:DP:GL:GQ	1/1:1,68:65:-267.59,-19.58,-0.01:99
-chr1	821923	rs9697378	G	A	628.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=46.85;MQ0=2;OQ=2615.06;QD=34.87;SB=-1164.40	GT:AD:DP:GL:GQ	1/1:9,66:67:-268.90,-20.18,-3.81:99
-chr1	821929	rs9697380	G	C	204.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=46.00;MQ0=2;OQ=2952.34;QD=37.85;SB=-1375.91	GT:AD:DP:GL:GQ	1/1:9,69:70:-303.53,-21.09,-4.71:99
-chr1	821975	rs9697725	T	C	60.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=42.31;MQ0=7;OQ=2446.13;QD=25.75;SB=-880.44	GT:AD:DP:GL:GQ	1/1:20,75:74:-256.35,-22.29,-8.15:99
-chr1	822041	rs13302934	A	G	54.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=37.41;MQ0=11;OQ=2291.03;QD=26.64;SB=-1047.92	GT:AD:DP:GL:GQ	1/1:17,69:67:-236.77,-20.18,-4.08:99
-chr1	822181	rs4500250	C	A	165.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=54.49;MQ0=0;OQ=2287.58;QD=33.15;SB=-1055.56	GT:AD:DP:GL:GQ	1/1:2,67:63:-232.36,-18.97,-0.02:99
-chr1	822261	rs4553118	T	C	105.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=53.16;MQ0=0;OQ=2074.16;QD=32.41;SB=-1031.91	GT:AD:DP:GL:GQ	1/1:0,64:58:-211.02,-17.47,-0.02:99
-chr1	827077	.	G	C	11.08	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1103.43;QD=20.06;SB=-557.74	GT:AD:DP:GL:GQ	0/1:23,32:50:-128.70,-15.07,-86.51:99
-chr1	832688	rs7519340	A	G	206.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.92;MQ0=0;OQ=2256.38;QD=34.19;SB=-897.99	GT:AD:DP:GL:GQ	1/1:0,66:64:-229.25,-19.28,-0.02:99
-chr1	833268	rs11516185	A	G	180.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.49;MQ=58.03;MQ0=0;OQ=720.81;QD=12.65;SB=-270.98	GT:AD:DP:GL:GQ	0/1:24,33:50:-90.45,-15.09,-82.68:99
-chr1	834163	rs61769713	C	G	7.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=34.66;MQ0=0;OQ=386.18;QD=32.18;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,12:11:-42.22,-3.32,-0.01:33.11
-chr1	834187	rs61769714	G	A	6.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=34.17;MQ0=0;OQ=258.44;QD=25.84;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,9:8:-29.44,-2.42,-0.01:24.06
-chr1	834206	rs61769715	A	G	21	PASS	AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=32.88;MQ0=0;OQ=98.47;QD=14.07;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,7:4:-13.38,-1.21,-0.00:12.03
-chr1	834961	.	T	G	0.56	PASS	AC=2;AF=1.00;AN=2;DP=11;Dels=0.00;HRun=2;HaplotypeScore=0.74;MQ=16.23;MQ0=3;OQ=70.14;QD=6.38;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,10:3:-10.50,-0.90,-0.00:9.03
-chr1	835146	rs7366404	G	T	7.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=37.00;MQ0=0;OQ=260.28;QD=32.54;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,8:8:-29.61,-2.41,-0.00:24.08
-chr1	836201	rs4970334	A	G	56.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.61;MQ=57.95;MQ0=0;OQ=1280.53;QD=26.68;SB=-522.83	GT:AD:DP:GL:GQ	1/1:0,47:43:-131.69,-12.98,-0.05:99
-chr1	836352	rs4970333	T	C	54.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.98;MQ=58.58;MQ0=0;OQ=1607.31;QD=32.80;SB=-789.15	GT:AD:DP:GL:GQ	1/1:0,49:46:-164.33,-13.86,-0.02:99
-chr1	837113	rs7416129	G	A	502.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=3431.98;QD=39.91;SB=-1125.99	GT:AD:DP:GL:GQ	1/1:0,85:84:-342.20,-25.31,-0.02:99
-chr1	839861	rs13303222	A	G	170.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=59.09;MQ0=0;OQ=2748.15;QD=33.51;SB=-1203.79	GT:AD:DP:GL:GQ	1/1:0,81:78:-278.43,-23.50,-0.03:99
-chr1	840081	rs6664536	T	A	113.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=58.64;MQ0=0;OQ=1837.58;QD=35.34;SB=-814.88	GT:AD:DP:GL:GQ	1/1:0,52:50:-187.36,-15.06,-0.02:99
-chr1	840234	rs6679046	G	T	614.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.48;MQ0=0;OQ=2550.23;QD=33.56;SB=-1032.51	GT:AD:DP:GL:GQ	1/1:0,76:73:-258.64,-22.00,-0.04:99
-chr1	840643	rs6657440	C	T	589.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=2334.22;QD=36.47;SB=-836.99	GT:AD:DP:GL:GQ	1/1:0,64:61:-237.03,-18.38,-0.02:99
-chr1	841253	.	G	T	87.70	PASS	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=2.68;MQ=59.70;MQ0=0;OQ=1174.44;QD=15.25;SB=-547.82	GT:AD:DP:GL:GQ	0/1:37,40:75:-143.32,-22.59,-125.03:99
-chr1	841362	rs4970465	A	G	15.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=2.07;MQ=60.00;MQ0=0;OQ=1972.18;QD=30.34;SB=-856.55	GT:AD:DP:GL:GQ	1/1:0,65:61:-200.85,-18.39,-0.05:99
-chr1	841500	.	G	C	11.73	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=3;HaplotypeScore=11.47;MQ=56.60;MQ0=0;QD=0.26;SB=59.23	GT:AD:DP:GL:GQ	0/1:36,10:33:-14.38,-9.96,-126.72:44.27
-chr1	841620	rs62677860	A	G	51.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=60.00;MQ0=0;OQ=1201.63;QD=27.31;SB=-317.48	GT:AD:DP:GL:GQ	1/1:0,43:38:-123.78,-11.46,-0.03:99
-chr1	841900	rs4970463	G	A	437.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=1176.31;QD=36.76;SB=-508.18	GT:AD:DP:GL:GQ	1/1:0,32:31:-121.23,-9.34,-0.01:93.29
-chr1	841926	rs28436996	G	A	99.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.22;MQ=58.05;MQ0=0;OQ=1247.42;QD=34.65;SB=-580.28	GT:AD:DP:GL:GQ	1/1:0,35:33:-128.34,-9.94,-0.01:99
-chr1	841996	rs7518702	C	T	517.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1573.23;QD=37.46;SB=-692.34	GT:AD:DP:GL:GQ	1/1:0,41:40:-160.92,-12.05,-0.01:99
-chr1	842738	rs13303369	C	T	76.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.63;MQ=58.47;MQ0=0;OQ=2145.17;QD=36.99;SB=-908.72	GT:AD:DP:GL:GQ	1/1:0,58:57:-218.13,-17.18,-0.03:99
-chr1	842827	rs4970461	T	G	8.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=2.36;MQ=59.03;MQ0=0;OQ=1414.13;QD=29.46;SB=-684.25	GT:AD:DP:GL:GQ	1/1:0,48:47:-145.05,-14.17,-0.05:99
-chr1	843817	rs1806509	C	A	190.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.61;MQ0=0;OQ=1993.99;QD=33.80;SB=-878.64	GT:AD:DP:GL:GQ	1/1:0,59:57:-203.01,-17.17,-0.02:99
-chr1	844640	rs13303019	A	G	51.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.20;MQ0=0;OQ=644.86;QD=22.24;SB=-345.42	GT:AD:DP:GL:GQ	1/1:0,29:23:-68.11,-6.95,-0.04:69.10
-chr1	844841	rs13303057	A	C	5.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.91;MQ=58.36;MQ0=0;OQ=1059.33;QD=26.48;SB=-412.87	GT:AD:DP:GL:GQ	1/1:0,40:35:-109.55,-10.55,-0.04:99
-chr1	844938	rs6673914	C	G	24.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.27;MQ0=0;OQ=1048.92;QD=37.46;SB=-371.18	GT:AD:DP:GL:GQ	1/1:0,28:26:-108.49,-7.84,-0.02:78.26
-chr1	847591	rs6689107	T	G	181.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.19;MQ0=0;OQ=1848.72;QD=32.43;SB=-803.49	GT:AD:DP:GL:GQ	1/1:0,57:54:-188.48,-16.27,-0.02:99
-chr1	848664	rs7418179	A	G	160.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=1692.05;QD=34.53;SB=-783.00	GT:AD:DP:GL:GQ	1/1:0,49:48:-172.81,-14.46,-0.02:99
-chr1	850279	rs61464428	G	A	12.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=57.66;MQ0=0;OQ=337.99;QD=33.80;SB=-134.01	GT:AD:DP:GL:GQ	1/1:0,10:10:-37.39,-3.02,-0.01:30.09
-chr1	850324	rs57465118	G	A	8.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=54.65;MQ0=0;OQ=218.19;QD=24.24;SB=-48.67	GT:AD:DP:GL:GQ	1/1:0,9:7:-25.40,-2.11,-0.00:21.06
-chr1	850384	rs57924093	C	A	117.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.88;MQ0=0;OQ=151.15;QD=25.19;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,5:5:-18.67,-1.51,-0.00:15.05
-chr1	850551	rs60837925	G	A	175.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.04;MQ0=0;OQ=188.60;QD=31.43;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,6:6:-22.43,-1.81,-0.00:18.06
-chr1	850660	.	G	T	32.80	LowQual	AC=2;AF=1.00;AN=2;DP=2;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=65.19;MQ0=0;QD=16.40;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,2:2:-6.69,-0.60,-0.00:6.02
-chr1	850717	rs57816555	T	C	168.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=49.96;MQ0=0;OQ=139.82;QD=27.96;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,5:5:-17.54,-1.51,-0.00:15.04
-chr1	850871	rs28521172	G	C	136.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.04;MQ0=0;OQ=409.27;QD=34.11;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,12:11:-44.52,-3.32,-0.00:33.11
-chr1	851493	rs2879816	G	A	181.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=58.51;MQ0=0;OQ=1761.97;QD=35.24;SB=-837.99	GT:AD:DP:GL:GQ	1/1:0,50:46:-179.80,-13.86,-0.02:99
-chr1	851671	rs13302982	A	G	540.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.19;MQ0=0;OQ=1746.20;QD=30.64;SB=-800.68	GT:AD:DP:GL:GQ	1/1:0,57:56:-178.25,-16.89,-0.05:99
-chr1	851956	rs13303291	T	C	0.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=5;HaplotypeScore=0.79;MQ=59.54;MQ0=0;OQ=1647.69;QD=32.95;SB=-763.57	GT:AD:DP:GL:GQ	1/1:0,50:48:-168.38,-14.46,-0.02:99
-chr1	851987	rs13303101	A	G	75.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.28;MQ=58.42;MQ0=0;OQ=1718.71;QD=29.13;SB=-814.55	GT:AD:DP:GL:GQ	1/1:0,59:55:-175.51,-16.59,-0.06:99
-chr1	852246	rs6680268	C	T	87.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.89;MQ0=0;OQ=1535.86;QD=36.57;SB=-649.38	GT:AD:DP:GL:GQ	1/1:0,42:40:-157.19,-12.05,-0.02:99
-chr1	852252	rs6693546	A	G	8.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=57.97;MQ0=0;OQ=1460.23;QD=31.74;SB=-743.12	GT:AD:DP:GL:GQ	1/1:0,45:42:-149.63,-12.66,-0.02:99
-chr1	852729	rs3892970	C	T	119.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=1397.63;QD=34.09;SB=-551.29	GT:AD:DP:GL:GQ	1/1:0,41:38:-143.37,-11.46,-0.02:99
-chr1	852987	rs4040604	G	T	33.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=3.00;MQ=59.28;MQ0=0;OQ=1900.46;QD=32.77;SB=-758.90	GT:AD:DP:GL:GQ	1/1:0,58:55:-193.66,-16.57,-0.02:99
-chr1	853374	rs28626846	T	C	176.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=56.72;MQ0=0;OQ=383.16;QD=9.12;SB=-198.44	GT:AD:DP:GL:GQ	0/1:24,18:39:-53.37,-11.77,-80.00:99
-chr1	853419	rs7410998	G	A	181.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=49.05;MQ0=1;OQ=787.22;QD=31.49;SB=-167.67	GT:AD:DP:GL:GQ	1/1:1,24:21:-82.31,-6.33,-0.01:63.20
-chr1	853425	rs7417972	A	C	3.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=51.24;MQ0=1;OQ=853.26;QD=25.86;SB=-413.26	GT:AD:DP:GL:GQ	1/1:1,32:29:-88.94,-8.74,-0.03:87.12
-chr1	853552	rs7417994	A	G	58.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=47.89;MQ0=0;OQ=1045.12;QD=27.50;SB=-347.41	GT:AD:DP:GL:GQ	1/1:0,38:34:-108.13,-10.26,-0.03:99
-chr1	854589	rs2340590	T	A	319.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.35;MQ0=0;OQ=1082.41;QD=34.92;SB=-267.73	GT:AD:DP:GL:GQ	1/1:0,31:30:-111.84,-9.04,-0.02:90.27
-chr1	854618	rs2340589	A	G	2.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=57.47;MQ0=0;OQ=1104.04;QD=28.31;SB=-284.44	GT:AD:DP:GL:GQ	1/1:0,39:37:-114.04,-11.17,-0.05:99
-chr1	854620	rs2340588	G	A	306.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.47;MQ0=0;OQ=1407.34;QD=36.09;SB=-288.88	GT:AD:DP:GL:GQ	1/1:0,39:36:-144.33,-10.85,-0.01:99
-chr1	854801	.	G	A	27.13	PASS	AC=2;AF=1.00;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=59.52;MQ0=0;OQ=1814.99;QD=37.81;SB=-848.99	GT:AD:DP:GL:GQ	1/1:0,48:46:-185.10,-13.86,-0.01:99
-chr1	856182	rs9988021	G	A	414.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=1807.60;QD=37.66;SB=-511.65	GT:AD:DP:GL:GQ	1/1:0,48:47:-184.36,-14.16,-0.02:99
-chr1	856756	rs2880024	T	C	439.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.61;MQ0=0;OQ=1661.89;QD=33.92;SB=-660.32	GT:AD:DP:GL:GQ	1/1:0,49:47:-169.79,-14.16,-0.01:99
-chr1	856783	rs2341361	A	G	391.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=1555.14;QD=34.56;SB=-535.20	GT:AD:DP:GL:GQ	1/1:0,45:44:-159.12,-13.26,-0.02:99
-chr1	857447	rs2341360	A	T	453.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1951.43;QD=37.53;SB=-755.79	GT:AD:DP:GL:GQ	1/1:0,51:51:-198.74,-15.36,-0.01:99
-chr1	858192	rs2341359	A	C	117.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=55.20;MQ0=0;OQ=1194.83;QD=30.64;SB=-603.64	GT:AD:DP:GL:GQ	1/1:0,39:36:-123.08,-10.85,-0.02:99
-chr1	858267	rs13302914	C	T	413.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.75;MQ0=0;OQ=1181.60;QD=33.76;SB=-589.79	GT:AD:DP:GL:GQ	1/1:0,35:32:-121.76,-9.65,-0.02:96.30
-chr1	858654	rs13303003	C	T	431.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=892.14;QD=35.69;SB=-459.35	GT:AD:DP:GL:GQ	1/1:1,24:23:-92.80,-6.93,-0.01:69.23
-chr1	858754	rs13303066	A	G	117.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=59.96;MQ0=0;OQ=1127.68;QD=32.22;SB=-537.22	GT:AD:DP:GL:GQ	1/1:0,35:32:-116.36,-9.64,-0.01:96.29
-chr1	858844	rs13303037	C	T	239.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.36;MQ0=0;OQ=920.18;QD=35.39;SB=-178.71	GT:AD:DP:GL:GQ	1/1:0,26:25:-95.62,-7.54,-0.02:75.23
-chr1	859186	rs13303207	T	C	5.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=2;HaplotypeScore=1.75;MQ=49.46;MQ0=0;OQ=860.62;QD=31.87;SB=-321.13	GT:AD:DP:GL:GQ	1/1:0,27:25:-89.66,-7.53,-0.01:75.22
-chr1	859220	.	G	T	15.33	LowQual	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=44.47;MQ0=0;QD=0.73;SB=-4.00	GT:AD:DP:GL:GQ	0/1:18,3:16:-9.63,-4.82,-45.13:48.04
-chr1	859232	rs13303328	G	T	26.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=42.12;MQ0=0;OQ=238.10;QD=15.87;SB=-41.94	GT:AD:DP:GL:GQ	0/1:4,11:12:-30.71,-3.62,-8.58:49.58
-chr1	859236	rs13303330	G	C	2.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=42.12;MQ0=0;OQ=289.97;QD=19.33;SB=-45.46	GT:AD:DP:GL:GQ	0/1:4,11:11:-35.60,-3.32,-10.54:72.26
-chr1	859264	rs13303353	G	C	17.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=12;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=37.87;MQ0=1;OQ=164.66;QD=13.72;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,7:8:-22.16,-2.41,-12.54:99
-chr1	859992	.	G	C	97.38	PASS	AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.96;MQ0=0;OQ=93.52;QD=10.39;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,9:3:-12.84,-0.90,-0.00:9.03
-chr1	860032	.	G	T	37.54	PASS	AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.43;MQ0=0;OQ=70.96;QD=5.46;SB=-10.00	GT:AD:DP:GL:GQ	1/1:8,5:3:-10.58,-0.90,-0.00:9.03
-chr1	860180	rs28451560	G	A	12.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.95;MQ0=0;OQ=73.11;QD=18.28;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,3:3:-10.80,-0.90,-0.00:9.03
-chr1	860766	rs13303094	T	C	16.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=59.17;MQ0=0;OQ=826.94;QD=29.53;SB=-125.69	GT:AD:DP:GL:GQ	1/1:0,28:25:-86.29,-7.54,-0.02:75.20
-chr1	861197	rs4072383	G	T	400.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.63;MQ0=0;OQ=731.30;QD=30.47;SB=-355.85	GT:AD:DP:GL:GQ	1/1:0,24:22:-76.73,-6.63,-0.01:66.18
-chr1	861546	rs4504834	G	A	1.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=53.70;MQ0=0;OQ=257.15;QD=25.71;SB=-133.67	GT:AD:DP:GL:GQ	1/1:0,10:8:-29.30,-2.41,-0.01:24.07
-chr1	863421	rs1110052	G	T	380.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=1308.42;QD=32.71;SB=-530.08	GT:AD:DP:GL:GQ	1/1:0,40:39:-134.45,-11.76,-0.03:99
-chr1	865499	.	C	T	29.46	LowQual	AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.04;MQ0=0;QD=4.91;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,2:5:-7.74,-1.51,-8.99:62.30
-chr1	865506	rs7411115	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=5;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=55.21;MQ0=0;OQ=112.00;QD=22.40;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,4:5:-15.99,-1.51,-3.39:18.84
-chr1	866063	.	G	C	0.28	PASS	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.80;MQ=60.00;MQ0=0;OQ=689.42;QD=21.54;SB=-257.43	GT:AD:DP:GL:GQ	0/1:12,20:31:-81.58,-9.35,-46.59:99
-chr1	866362	rs4372192	A	G	0.01	FDRtranche2.00to10.00	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=6;HaplotypeScore=0.89;MQ=56.86;MQ0=0;OQ=933.15;QD=29.16;SB=-432.49	GT:AD:DP:GL:GQ	1/1:0,31:29:-96.92,-8.74,-0.02:87.21
-chr1	867578	rs6605066	C	G	7.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=93.52;QD=31.17;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,3:3:-12.84,-0.90,-0.00:9.03
-chr1	867694	rs6672356	T	C	3.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=52.96;QD=17.65;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,3:3:-8.79,-0.91,-0.01:9.01
-chr1	868792	.	G	C	15.78	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=42;Dels=0.02;HRun=2;HaplotypeScore=22.45;MQ=51.57;MQ0=2;QD=0.38;SB=59.22	GT:AD:DP:GL:GQ	0/1:36,4:34:-14.81,-9.96,-119.24:48.50
-chr1	869539	rs6605067	G	A	19.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=0.58;MQ=56.16;MQ0=0;OQ=2221.47;QD=39.67;SB=-1054.70	GT:AD:DP:GL:GQ	1/1:0,56:55:-225.74,-16.57,-0.01:99
-chr1	869550	rs2839	T	C	133.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=56.64;MQ0=0;OQ=2001.68;QD=34.51;SB=-1024.77	GT:AD:DP:GL:GQ	1/1:0,58:57:-203.78,-17.17,-0.02:99
-chr1	870101	rs3748592	A	G	495.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.39;MQ0=0;OQ=1890.23;QD=34.37;SB=-862.36	GT:AD:DP:GL:GQ	1/1:0,55:54:-192.63,-16.27,-0.02:99
-chr1	871490	rs2272757	G	A	6.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.19;MQ=57.04;MQ0=0;OQ=1394.54;QD=37.69;SB=-510.64	GT:AD:DP:GL:GQ	1/1:0,37:36:-143.05,-10.85,-0.01:99
-chr1	872666	rs2340582	A	G	42.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=4.34;MQ=59.14;MQ0=0;OQ=1872.55;QD=34.68;SB=-917.03	GT:AD:DP:GL:GQ	1/1:0,54:54:-190.86,-16.27,-0.02:99
-chr1	873488	rs4970378	A	G	248.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=1449.35;QD=35.35;SB=-732.23	GT:AD:DP:GL:GQ	1/1:0,41:41:-148.53,-12.35,-0.01:99
-chr1	873762	.	T	G	3.38	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=2;HaplotypeScore=3.82;MQ=57.58;MQ0=0;OQ=623.05;QD=12.98;SB=-319.82	GT:AD:DP:GL:GQ	0/1:24,24:47:-79.75,-14.16,-84.17:99
-chr1	873892	.	A	C	58.62	SnpCluster	AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=53.03;MQ0=0;QD=2.09;SB=-41.91	GT:AD:DP:GL:GQ	0/1:23,5:28:-17.58,-8.43,-82.84:91.46
-chr1	873894	.	C	T	82.90	SnpCluster	AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.03;MQ0=0;QD=2.96;SB=-56.23	GT:AD:DP:GL:GQ	0/1:23,5:28:-20.01,-8.43,-84.10:99
-chr1	873895	.	C	T	48.24	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=51.20;MQ0=0;QD=1.56;SB=-25.58	GT:AD:DP:GL:GQ	0/1:26,5:28:-16.54,-8.43,-88.26:81.07
-chr1	873901	.	T	G	115.57	SnpCluster	AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.52;MQ0=0;QD=3.50;SB=-81.81	GT:AD:DP:GL:GQ	0/1:26,7:33:-24.78,-9.94,-99.02:99
-chr1	873954	rs7522415	C	G	8.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=1.52;MQ=43.40;MQ0=0;OQ=1100.42;QD=22.93;SB=-415.98	GT:AD:DP:GL:GQ	0/1:16,32:45:-126.89,-13.56,-66.90:99
-chr1	873964	rs4970455	A	C	1.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=3;HaplotypeScore=2.44;MQ=43.46;MQ0=0;OQ=358.55;QD=6.77;SB=-63.88	GT:AD:DP:GL:GQ	0/1:38,15:50:-54.21,-15.07,-122.51:99
-chr1	874630	.	G	A	13.69	PASS	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=47.61;MQ0=0;OQ=1000.31;QD=21.75;SB=-485.51	GT:AD:DP:GL:GQ	0/1:17,29:46:-117.17,-13.86,-57.54:99
-chr1	874678	rs4246503	A	G	158.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=55.11;MQ0=0;OQ=1771.59;QD=30.03;SB=-814.69	GT:AD:DP:GL:GQ	1/1:0,59:55:-180.79,-16.58,-0.04:99
-chr1	875539	rs4970377	C	A	535.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.40;MQ0=0;OQ=2636.42;QD=36.12;SB=-1177.36	GT:AD:DP:GL:GQ	1/1:1,72:71:-267.24,-21.38,-0.02:99
-chr1	875552	rs4970452	G	A	0.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=10.99;MQ=56.01;MQ0=0;OQ=2730.82;QD=37.93;SB=-1364.34	GT:AD:DP:GL:GQ	1/1:1,71:70:-276.69,-21.09,-0.03:99
-chr1	875562	rs4970376	A	G	1.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=9.96;MQ=55.41;MQ0=0;OQ=2063.84;QD=30.35;SB=-1045.24	GT:AD:DP:GL:GQ	1/1:1,67:64:-210.02,-19.30,-0.05:99
-chr1	875869	rs4970375	T	C	458.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.16;MQ0=0;OQ=1904.11;QD=35.26;SB=-492.54	GT:AD:DP:GL:GQ	1/1:0,54:53:-194.01,-15.96,-0.01:99
-chr1	876651	rs10465242	G	A	37.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=58.78;MQ0=0;OQ=1853.33;QD=37.07;SB=-743.49	GT:AD:DP:GL:GQ	1/1:0,50:47:-188.93,-14.16,-0.01:99
-chr1	876680	rs10465241	C	T	139.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=1420.84;QD=37.39;SB=-598.99	GT:AD:DP:GL:GQ	1/1:0,38:38:-145.68,-11.45,-0.02:99
-chr1	877423	rs3748595	A	C	60.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=58.73;MQ0=0;OQ=1913.10;QD=31.88;SB=-946.06	GT:AD:DP:GL:GQ	1/1:0,60:56:-194.92,-16.87,-0.02:99
-chr1	877664	rs3828047	A	G	27.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.65;MQ=59.38;MQ0=0;OQ=1254.26;QD=33.90;SB=-513.49	GT:AD:DP:GL:GQ	1/1:0,37:36:-129.02,-10.84,-0.01:99
-chr1	878502	rs3748596	T	C	69.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=55.26;MQ0=0;OQ=1390.46;QD=33.11;SB=-577.30	GT:AD:DP:GL:GQ	1/1:0,42:41:-142.65,-12.35,-0.02:99
-chr1	878522	rs3748597	T	C	420.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.43;MQ0=0;OQ=1101.61;QD=31.47;SB=-433.56	GT:AD:DP:GL:GQ	1/1:0,35:33:-113.76,-9.94,-0.02:99
-chr1	879021	rs56262069	G	C	15.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=1649.51;QD=39.27;SB=-490.55	GT:AD:DP:GL:GQ	1/1:0,42:39:-168.56,-11.76,-0.02:99
-chr1	879022	rs13302945	A	C	102.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=1299.59;QD=30.94;SB=-461.34	GT:AD:DP:GL:GQ	1/1:0,42:39:-133.56,-11.75,-0.02:99
-chr1	879501	rs13303206	G	C	38.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=58.78;MQ0=0;OQ=1536.75;QD=40.44;SB=-636.90	GT:AD:DP:GL:GQ	1/1:0,38:37:-157.27,-11.15,-0.01:99
-chr1	879576	rs13303051	C	A	192.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.48;MQ=59.05;MQ0=0;OQ=1663.22;QD=33.94;SB=-850.81	GT:AD:DP:GL:GQ	1/1:1,48:46:-169.92,-13.85,-0.01:99
-chr1	880884	rs13302957	G	A	138.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.43;MQ=59.32;MQ0=0;OQ=2228.59;QD=40.52;SB=-1097.37	GT:AD:DP:GL:GQ	1/1:0,55:55:-226.45,-16.57,-0.01:99
-chr1	880922	rs13303065	C	T	237.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2022.89;QD=39.66;SB=-914.68	GT:AD:DP:GL:GQ	1/1:0,51:51:-205.89,-15.36,-0.01:99
-chr1	881808	rs13303106	A	G	3.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=3.33;MQ=59.21;MQ0=0;OQ=1343.98;QD=25.36;SB=-644.88	GT:AD:DP:GL:GQ	1/1:0,53:43:-138.03,-12.97,-0.04:99
-chr1	882608	rs13303227	G	A	569.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2091.00;QD=38.72;SB=-899.68	GT:AD:DP:GL:GQ	1/1:0,54:53:-212.70,-15.97,-0.01:99
-chr1	883143	rs4970371	G	A	143.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=57.73;MQ0=0;OQ=2249.45;QD=37.49;SB=-940.26	GT:AD:DP:GL:GQ	1/1:0,60:57:-228.55,-17.17,-0.02:99
-chr1	883494	rs6605069	A	G	58.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=58.62;MQ0=0;OQ=2094.43;QD=32.73;SB=-870.68	GT:AD:DP:GL:GQ	1/1:0,64:60:-213.05,-18.07,-0.02:99
-chr1	883582	rs4970445	G	A	189.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.14;MQ0=0;OQ=1807.99;QD=33.48;SB=-798.52	GT:AD:DP:GL:GQ	1/1:1,53:49:-184.42,-14.78,-0.04:99
-chr1	884436	rs13303010	G	A	1.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=3.16;MQ=58.63;MQ0=0;OQ=585.11;QD=34.42;SB=-52.67	GT:AD:DP:GL:GQ	1/1:0,17:16:-62.10,-4.82,-0.01:48.15
-chr1	885569	rs13303327	G	A	161.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=61.07;MQ0=0;OQ=743.89;QD=37.19;SB=-245.00	GT:AD:DP:GL:GQ	1/1:0,20:20:-77.98,-6.03,-0.01:60.19
-chr1	887188	rs4970441	G	C	2.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=753.54;QD=39.66;SB=-289.25	GT:AD:DP:GL:GQ	1/1:0,19:18:-78.95,-5.42,-0.01:54.18
-chr1	887427	rs13303229	T	C	257.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1210.82;QD=33.63;SB=-286.61	GT:AD:DP:GL:GQ	1/1:0,36:36:-124.69,-10.85,-0.02:99
-chr1	888186	rs6605071	T	C	17.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=3.35;MQ=58.67;MQ0=0;OQ=1185.73;QD=33.88;SB=-618.22	GT:AD:DP:GL:GQ	1/1:0,35:34:-122.17,-10.24,-0.01:99
-chr1	889791	rs6677386	G	C	245.35	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=39.71;MQ0=0;QD=16.36;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,15:8:-28.14,-2.43,-0.02:24.07
-chr1	889800	.	G	T	344.36	SnpCluster	AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=39.12;MQ0=0;QD=28.70;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,12:11:-38.03,-3.31,-0.01:33.08
-chr1	889801	.	G	C	465.29	SnpCluster	AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=39.12;MQ0=0;QD=38.77;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,12:11:-50.12,-3.31,-0.00:33.11
-chr1	889805	.	G	A	501.88	SnpCluster	AC=2;AF=1.00;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=39.71;MQ0=0;QD=33.46;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,15:14:-53.78,-4.22,-0.01:42.13
-chr1	889852	rs6669071	A	C	11.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=44.10;MQ0=0;OQ=318.72;QD=26.56;SB=-44.57	GT:AD:DP:GL:GQ	1/1:0,12:11:-35.46,-3.31,-0.01:33.07
-chr1	889864	rs28754834	G	A	283.84	Indel	AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=44.79;MQ0=0;QD=31.54;SB=-93.34	GT:AD:DP:GL:GQ	1/1:0,9:8:-31.97,-2.41,-0.00:24.08
-chr1	889872	rs6704181	C	G	264.94	Indel	AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=6;HaplotypeScore=0.00;MQ=42.50;MQ0=0;QD=33.12;SB=-56.93	GT:AD:DP:GL:GQ	1/1:0,8:7:-30.07,-2.11,-0.00:21.07
-chr1	890148	rs4970435	C	T	1.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=54.37;MQ0=0;OQ=1059.65;QD=35.32;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,29:28:-109.56,-8.43,-0.01:84.27
-chr1	890149	rs4970434	A	G	1.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=54.37;MQ0=0;OQ=1048.98;QD=34.97;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,30:29:-108.49,-8.74,-0.01:87.27
-chr1	890161	.	C	G	0.39	PASS	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.89;MQ=54.80;MQ0=0;OQ=464.33;QD=12.55;SB=-10.00	GT:AD:DP:GL:GQ	0/1:16,21:31:-59.09,-9.37,-60.44:99
-chr1	890593	rs3935066	G	A	1827.67	Indel	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=54.80;MQ0=0;QD=38.08;SB=-380.50	GT:AD:DP:GL:GQ	1/1:0,48:46:-186.37,-13.86,-0.02:99
-chr1	890835	rs9697711	T	G	5.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=3.09;MQ=57.77;MQ0=0;OQ=1087.73;QD=27.19;SB=-563.56	GT:AD:DP:GL:GQ	1/1:0,40:34:-112.38,-10.25,-0.03:99
-chr1	890886	rs13303351	T	C	4.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=5.09;MQ=56.17;MQ0=0;OQ=1868.96;QD=27.89;SB=-762.95	GT:AD:DP:GL:GQ	1/1:0,67:61:-190.56,-18.41,-0.08:99
-chr1	891422	rs13303160	G	A	335.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=1009.81;QD=38.84;SB=-456.35	GT:AD:DP:GL:GQ	1/1:0,26:26:-104.57,-7.83,-0.01:78.26
-chr1	891470	rs13302996	C	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=6;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=1288.09;QD=33.03;SB=-383.20	GT:AD:DP:GL:GQ	1/1:0,39:34:-132.43,-10.27,-0.04:99
-chr1	891515	rs2879814	A	G	4.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=3.80;MQ=59.05;MQ0=0;OQ=1360.05;QD=30.91;SB=-420.15	GT:AD:DP:GL:GQ	1/1:0,44:40:-139.61,-12.06,-0.03:99
-chr1	892627	rs28416780	C	G	985.40	Indel	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=3.73;MQ=60.94;MQ0=0;QD=29.86;SB=-516.60	GT:AD:DP:GL:GQ	1/1:0,33:26:-102.16,-7.86,-0.03:78.25
-chr1	892860	rs7524174	G	A	607.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2039.21;QD=35.78;SB=-884.69	GT:AD:DP:GL:GQ	1/1:0,57:52:-207.52,-15.67,-0.02:99
-chr1	893108	rs28690976	A	G	19.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=1.31;MQ=59.50;MQ0=0;OQ=1221.87;QD=33.02;SB=-508.55	GT:AD:DP:GL:GQ	1/1:0,37:34:-125.78,-10.24,-0.01:99
-chr1	893184	rs6669800	G	A	536.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1821.94;QD=35.04;SB=-645.66	GT:AD:DP:GL:GQ	1/1:0,52:47:-185.80,-14.16,-0.02:99
-chr1	895023	rs7555426	C	T	0.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.03;HRun=0;HaplotypeScore=12.36;MQ=55.36;MQ0=0;OQ=2346.52;QD=37.25;SB=-860.64	GT:AD:DP:GL:GQ	1/1:0,60:62:-238.26,-18.08,-0.02:99
-chr1	895028	rs7522959	A	G	167.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=55.43;MQ0=0;OQ=2120.68;QD=33.14;SB=-824.97	GT:AD:DP:GL:GQ	1/1:0,63:62:-215.68,-18.68,-0.03:99
-chr1	899282	rs28548431	C	T	198.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.43;MQ0=0;OQ=508.80;QD=15.42;SB=-237.75	GT:AD:DP:GL:GQ	0/1:15,18:31:-63.51,-9.35,-46.57:99
-chr1	899418	rs2340594	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=6;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=1231.29;QD=30.03;SB=-602.23	GT:AD:DP:GL:GQ	1/1:0,41:40:-126.75,-12.06,-0.03:99
-chr1	899631	rs2340593	A	G	106.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1110.83;QD=35.83;SB=-387.48	GT:AD:DP:GL:GQ	1/1:0,31:31:-114.68,-9.34,-0.01:93.28
-chr1	900257	rs28477686	C	T	200.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=716.99;QD=16.30;SB=-337.87	GT:AD:DP:GL:GQ	0/1:20,24:40:-87.03,-12.05,-62.41:99
-chr1	900301	rs6685581	A	G	61.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=58.90;MQ0=0;OQ=1025.59;QD=26.99;SB=-469.48	GT:AD:DP:GL:GQ	1/1:0,38:34:-106.18,-10.26,-0.04:99
-chr1	900766	rs4970429	T	C	21.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=1255.50;QD=27.90;SB=-520.11	GT:AD:DP:GL:GQ	1/1:0,45:41:-129.18,-12.37,-0.04:99
-chr1	901458	rs7417106	A	G	62.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=56.69;MQ0=0;OQ=1131.68;QD=22.63;SB=-392.29	GT:AD:DP:GL:GQ	1/1:0,48:37:-116.79,-11.16,-0.04:99
-chr1	901912	rs9803103	T	C	68.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.16;MQ0=0;OQ=72.78;QD=4.85;SB=-10.00	GT:AD:DP:GL:GQ	0/1:10,5:15:-15.08,-4.52,-39.48:99
-chr1	901966	rs9803017	G	A	5.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=48.89;MQ0=0;OQ=164.19;QD=23.46;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,5:5:-19.98,-1.51,-0.00:15.05
-chr1	903262	.	C	T	47.02	LowQual	AC=2;AF=1.00;AN=2;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.12;MQ0=0;QD=23.51;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,2:2:-8.11,-0.60,-0.00:6.02
-chr1	903752	rs2340596	G	A	213.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=58.63;MQ0=0;OQ=437.08;QD=12.86;SB=-239.73	GT:AD:DP:GL:GQ	0/1:19,15:34:-57.25,-10.26,-59.16:99
-chr1	904055	rs2340595	G	C	462.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1540.41;QD=36.68;SB=-743.79	GT:AD:DP:GL:GQ	1/1:0,42:38:-157.65,-11.46,-0.02:99
-chr1	904196	rs13302979	C	G	14.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=2;HaplotypeScore=1.72;MQ=60.00;MQ0=0;OQ=238.96;QD=11.95;SB=-110.33	GT:AD:DP:GL:GQ	0/1:12,8:19:-32.91,-5.73,-43.20:99
-chr1	904715	rs13303368	G	C	150.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=58.83;MQ0=0;OQ=429.52;QD=11.93;SB=-165.16	GT:AD:DP:GL:GQ	0/1:21,15:34:-56.48,-10.25,-87.94:99
-chr1	904739	rs13302983	T	C	1.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=3.25;MQ=59.49;MQ0=0;OQ=1146.65;QD=25.48;SB=-382.24	GT:AD:DP:GL:GQ	1/1:0,45:37:-118.29,-11.16,-0.04:99
-chr1	904803	rs13303033	T	C	97.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=3.63;MQ=59.44;MQ0=0;OQ=505.70;QD=12.33;SB=-138.55	GT:AD:DP:GL:GQ	0/1:20,21:40:-65.92,-12.07,-67.38:99
-chr1	905090	rs13303355	A	G	1.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=8.34;MQ=56.14;MQ0=0;OQ=1675.03;QD=29.39;SB=-822.95	GT:AD:DP:GL:GQ	1/1:1,56:50:-171.12,-15.07,-0.03:99
-chr1	906412	rs6660139	A	G	108.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=506.06;QD=14.88;SB=-146.57	GT:AD:DP:GL:GQ	0/1:14,20:33:-63.84,-9.95,-51.10:99
-chr1	906453	rs28566954	G	A	282.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.36;MQ0=0;OQ=491.61;QD=13.66;SB=-253.24	GT:AD:DP:GL:GQ	0/1:20,16:35:-62.99,-10.55,-63.70:99
-chr1	906697	rs6694632	G	A	262.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.25;MQ0=0;OQ=424.41;QD=13.69;SB=-233.73	GT:AD:DP:GL:GQ	0/1:16,15:29:-54.46,-8.74,-53.31:99
-chr1	906923	rs6605058	C	G	4.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=59.45;MQ0=0;OQ=1718.51;QD=40.92;SB=-739.75	GT:AD:DP:GL:GQ	1/1:0,42:41:-175.45,-12.36,-0.02:99
-chr1	907503	rs41285816	G	A	149.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.47;MQ0=0;OQ=650.11;QD=15.12;SB=-327.85	GT:AD:DP:GL:GQ	0/1:21,22:41:-80.65,-12.35,-76.53:99
-chr1	908101	rs28552711	C	G	269.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.03;MQ0=0;OQ=561.89;QD=11.71;SB=-234.09	GT:AD:DP:GL:GQ	0/1:27,21:45:-73.04,-13.57,-111.91:99
-chr1	908247	rs13303118	G	T	75.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.58;MQ0=0;OQ=378.28;QD=8.60;SB=-112.78	GT:AD:DP:GL:GQ	0/1:27,17:40:-53.17,-12.06,-75.89:99
-chr1	908436	rs2341354	A	G	288.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=59.09;MQ0=0;OQ=687.85;QD=13.49;SB=-217.36	GT:AD:DP:GL:GQ	0/1:22,29:47:-86.23,-14.17,-83.30:99
-chr1	908990	rs28469033	T	C	203.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=58.06;MQ0=0;OQ=712.75;QD=12.29;SB=-242.27	GT:AD:DP:GL:GQ	0/1:29,28:55:-91.13,-16.57,-114.97:99
-chr1	909282	rs6605059	T	C	230.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=181.71;QD=7.57;SB=-100.01	GT:AD:DP:GL:GQ	0/1:13,11:22:-28.09,-6.63,-51.27:99
-chr1	909352	rs61606412	C	T	41.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=53.76;MQ0=0;OQ=576.99;QD=16.03;SB=-77.09	GT:AD:DP:GL:GQ	0/1:16,19:32:-70.62,-9.64,-54.85:99
-chr1	909718	.	G	A	32.42	PASS	AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.35;MQ0=0;OQ=82.61;QD=6.35;SB=-28.51	GT:AD:DP:GL:GQ	0/1:9,4:13:-15.46,-3.92,-29.36:99
-chr1	909851	.	C	T	379.69	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=2;HaplotypeScore=14.99;MQ=38.66;MQ0=0;QD=8.44;SB=-209.86	GT:AD:DP:GL:GQ	0/1:32,13:38:-52.70,-11.44,-90.66:99
-chr1	909854	.	C	A	33.53	Indel;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=23.31;MQ=39.61;MQ0=0;QD=0.73;SB=-35.83	GT:AD:DP:GL:GQ	0/1:41,3:18:-18.90,-12.26,-52.66:66.37
-chr1	909858	.	T	A	34.25	Indel;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=85.24;MQ=39.71;MQ0=0;QD=0.69;SB=-24.32	GT:AD:DP:GL:GQ	0/1:46,4:25:-14.24,-7.53,-79.28:67.09
-chr1	909861	rs2341357	A	C	442.96	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=92.23;MQ=37.93;MQ0=0;QD=9.23;SB=-187.18	GT:AD:DP:GL:GQ	0/1:13,31:32:-70.70,-23.12,-57.83:99
-chr1	909862	.	T	C	28.94	Indel;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=90.34;MQ=37.54;MQ0=1;QD=0.59;SB=-27.89	GT:AD:DP:GL:GQ	0/1:45,4:23:-13.11,-6.93,-76.03:61.77
-chr1	909865	rs55746336	A	C	368.04	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=65.88;MQ=38.28;MQ0=1;QD=7.51;SB=-150.94	GT:AD:DP:GL:GQ	0/1:20,29:28:-48.52,-8.43,-49.13:99
-chr1	910511	rs6677020	T	C	126.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=58.99;MQ0=0;OQ=1842.74;QD=30.71;SB=-555.07	GT:AD:DP:GL:GQ	1/1:0,60:57:-187.90,-17.18,-0.04:99
-chr1	910596	rs6677131	T	C	281.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.54;MQ0=0;OQ=1029.24;QD=25.10;SB=-459.07	GT:AD:DP:GL:GQ	1/1:0,41:35:-106.55,-10.56,-0.04:99
-chr1	911433	rs6662128	T	C	65.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=42.74;MQ0=0;OQ=1332.64;QD=27.76;SB=-494.18	GT:AD:DP:GL:GQ	1/1:0,48:43:-136.89,-12.97,-0.04:99
-chr1	911523	rs6703008	C	T	253.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.87;MQ0=0;OQ=592.10;QD=14.44;SB=-247.55	GT:AD:DP:GL:GQ	0/1:21,20:40:-74.55,-12.06,-68.34:99
-chr1	911579	rs13303278	C	A	321.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=57.82;MQ0=0;OQ=846.22;QD=16.27;SB=-412.14	GT:AD:DP:GL:GQ	0/1:22,30:49:-102.67,-14.76,-65.25:99
-chr1	911872	rs6693747	G	A	247.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=57.81;MQ0=0;OQ=692.72;QD=11.94;SB=-247.55	GT:AD:DP:GL:GQ	0/1:34,24:51:-87.93,-15.37,-94.90:99
-chr1	912939	rs6605060	A	G	422.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1569.95;QD=29.62;SB=-431.82	GT:AD:DP:GL:GQ	1/1:0,53:52:-160.64,-15.69,-0.06:99
-chr1	913322	rs9442609	A	G	120.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=58.95;MQ0=0;OQ=1780.01;QD=28.25;SB=-752.61	GT:AD:DP:GL:GQ	1/1:0,63:58:-181.64,-17.49,-0.06:99
-chr1	913612	rs9442610	T	C	76.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.45;MQ0=1;OQ=2496.82;QD=28.70;SB=-1150.17	GT:AD:DP:GL:GQ	1/1:1,86:79:-253.33,-23.82,-0.07:99
-chr1	913974	rs28447224	T	A	288.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.45;MQ0=0;OQ=731.87;QD=12.20;SB=-322.51	GT:AD:DP:GL:GQ	0/1:33,27:58:-93.94,-17.47,-123.87:99
-chr1	914034	.	A	T	3.99	PASS	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.53;MQ0=0;OQ=328.12;QD=3.57;SB=-36.46	GT:AD:DP:GL:GQ	0/1:74,18:90:-63.21,-27.12,-275.61:99
-chr1	914043	.	A	T	0.15	PASS	AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=53.25;MQ0=0;OQ=310.60;QD=3.20;SB=-88.90	GT:AD:DP:GL:GQ	0/1:71,26:82:-59.05,-24.71,-248.58:99
-chr1	914057	rs36034299	T	A	46.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=123;Dels=0.00;HRun=0;HaplotypeScore=4.71;MQ=52.48;MQ0=0;OQ=1254.45;QD=10.20;SB=-515.06	GT:AD:DP:GL:GQ	0/1:78,44:120:-164.87,-36.14,-292.57:99
-chr1	914062	rs34208189	G	T	4.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=120;Dels=0.00;HRun=1;HaplotypeScore=4.71;MQ=52.50;MQ0=0;OQ=1304.79;QD=10.87;SB=-551.46	GT:AD:DP:GL:GQ	0/1:72,47:118:-172.13,-38.37,-252.01:99
-chr1	914098	rs28489602	G	A	178.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=123;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=53.92;MQ0=0;OQ=1142.45;QD=9.29;SB=-414.29	GT:AD:DP:GL:GQ	0/1:80,43:115:-152.18,-34.65,-273.57:99
-chr1	914111	.	T	G	3.17	PASS	AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=54.02;MQ0=0;OQ=717.31;QD=5.56;SB=-222.67	GT:AD:DP:GL:GQ	0/1:95,34:128:-113.56,-38.55,-355.41:99
-chr1	914118	rs59424352	T	G	15.06	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=131;Dels=0.00;HRun=2;HaplotypeScore=1.56;MQ=54.89;MQ0=0;QD=0.11;SB=-22.32	GT:AD:DP:GL:GQ	0/1:103,28:116:-39.71,-34.94,-387.42:47.76
-chr1	914126	rs28607403	A	T	0.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=126;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=56.46;MQ0=0;OQ=177.88;QD=1.41;SB=-25.34	GT:AD:DP:GL:GQ	0/1:106,20:118:-56.62,-35.55,-387.33:99
-chr1	914231	rs35562283	C	T	2.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=100;Dels=0.00;HRun=2;HaplotypeScore=2.10;MQ=59.39;MQ0=0;OQ=4072.19;QD=40.72;SB=-2034.20	GT:AD:DP:GL:GQ	1/1:0,100:100:-406.22,-30.12,-0.03:99
-chr1	914391	rs34712273	C	A	51.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=5.23;MQ=56.94;MQ0=0;OQ=1123.83;QD=11.59;SB=-531.23	GT:AD:DP:GL:GQ	0/1:55,42:95:-144.28,-28.62,-196.31:99
-chr1	914466	rs28422907	T	C	454.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=3679.99;QD=36.08;SB=-1782.71	GT:AD:DP:GL:GQ	1/1:0,102:101:-367.00,-30.42,-0.03:99
-chr1	914492	rs28622096	A	G	82.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=92;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.55;MQ0=0;OQ=2947.74;QD=32.04;SB=-1451.63	GT:AD:DP:GL:GQ	1/1:0,92:91:-298.43,-27.44,-0.07:99
-chr1	914761	rs6665000	C	A	607.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3789.11;QD=37.15;SB=-1446.45	GT:AD:DP:GL:GQ	1/1:0,101:101:-377.91,-33.59,-3.42:99
-chr1	915547	rs6605061	T	C	196.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=57.81;MQ0=0;OQ=1982.79;QD=33.05;SB=-855.97	GT:AD:DP:GL:GQ	1/1:0,60:57:-201.89,-17.17,-0.03:99
-chr1	916214	rs6671243	C	T	469.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2468.85;QD=39.82;SB=-737.98	GT:AD:DP:GL:GQ	1/1:0,62:61:-250.48,-18.37,-0.01:99
-chr1	916294	rs4970403	A	T	304.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.55;MQ=59.43;MQ0=0;OQ=2680.54;QD=36.72;SB=-1154.05	GT:AD:DP:GL:GQ	1/1:1,72:71:-271.66,-21.39,-0.02:99
-chr1	916484	rs4970351	A	C	485.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=1740.98;QD=35.53;SB=-550.05	GT:AD:DP:GL:GQ	1/1:0,49:49:-177.70,-14.76,-0.01:99
-chr1	917172	rs2341362	T	C	555.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1855.09;QD=30.92;SB=-890.64	GT:AD:DP:GL:GQ	1/1:0,60:59:-189.15,-17.80,-0.06:99
-chr1	917604	rs6665587	G	A	343.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.08;MQ0=0;OQ=746.63;QD=16.23;SB=-250.74	GT:AD:DP:GL:GQ	0/1:23,23:45:-91.50,-13.55,-86.19:99
-chr1	918279	.	G	A	19.72	PASS	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.39;MQ=64.12;MQ0=0;OQ=347.49;QD=8.91;SB=-127.57	GT:AD:DP:GL:GQ	0/1:25,14:32:-47.68,-9.65,-62.78:99
-chr1	918383	rs35002855	A	G	36.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.30;MQ0=0;OQ=923.20;QD=27.98;SB=-310.47	GT:AD:DP:GL:GQ	1/1:0,33:30:-95.93,-9.05,-0.03:90.20
-chr1	918441	rs28394749	G	A	367.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=1345.86;QD=38.45;SB=-480.97	GT:AD:DP:GL:GQ	1/1:0,35:35:-138.18,-10.55,-0.01:99
-chr1	918699	rs9777703	C	T	463.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.88;MQ0=0;OQ=1525.43;QD=38.14;SB=-621.02	GT:AD:DP:GL:GQ	1/1:0,40:39:-156.14,-11.75,-0.01:99
-chr1	919053	rs9777939	A	G	223.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.27;MQ0=0;OQ=1351.32;QD=33.78;SB=-678.95	GT:AD:DP:GL:GQ	1/1:0,40:38:-138.73,-11.45,-0.01:99
-chr1	919179	rs9777893	C	T	85.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=55.86;MQ0=0;OQ=1631.07;QD=35.46;SB=-540.88	GT:AD:DP:GL:GQ	1/1:0,46:44:-166.72,-13.27,-0.03:99
-chr1	919184	rs13302916	A	C	0.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=5;HaplotypeScore=2.13;MQ=54.60;MQ0=0;OQ=1536.74;QD=31.36;SB=-480.03	GT:AD:DP:GL:GQ	1/1:0,49:45:-157.28,-13.56,-0.02:99
-chr1	919190	rs13302924	A	G	46.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=54.92;MQ0=0;OQ=1263.79;QD=24.30;SB=-518.21	GT:AD:DP:GL:GQ	1/1:0,52:42:-130.02,-12.68,-0.06:99
-chr1	919921	.	C	A	110.32	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=58.99;MQ0=0;OQ=1041.89;QD=15.10;SB=-490.89	GT:AD:DP:GL:GQ	0/1:34,35:65:-127.06,-19.58,-99.23:99
-chr1	920192	rs3128108	C	T	194.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=58.69;MQ0=0;OQ=711.37;QD=14.23;SB=-187.15	GT:AD:DP:GL:GQ	0/1:24,26:47:-88.59,-14.17,-77.59:99
-chr1	920240	rs3128109	C	T	215.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.70;MQ0=0;OQ=1131.05;QD=17.95;SB=-367.88	GT:AD:DP:GL:GQ	0/1:29,34:63:-135.38,-18.99,-92.17:99
-chr1	920396	rs3128110	C	G	210.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.83;MQ=58.26;MQ0=0;OQ=1157.59;QD=14.84;SB=-599.54	GT:AD:DP:GL:GQ	0/1:41,37:77:-142.27,-23.22,-177.91:99
-chr1	920430	rs3121574	A	G	364.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.06;MQ0=0;OQ=652.89;QD=9.60;SB=-349.53	GT:AD:DP:GL:GQ	0/1:41,27:65:-88.16,-19.59,-156.95:99
-chr1	920614	rs3128111	C	G	139.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=58.99;MQ0=0;OQ=1461.73;QD=21.18;SB=-736.36	GT:AD:DP:GL:GQ	0/1:28,41:68:-169.95,-20.49,-124.60:99
-chr1	920786	rs2710882	A	G	12.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=2.97;MQ=49.62;MQ0=0;OQ=1291.93;QD=28.71;SB=-670.84	GT:AD:DP:GL:GQ	1/1:0,45:41:-132.82,-12.37,-0.04:99
-chr1	920877	rs2710881	A	G	324.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.30;MQ0=0;OQ=966.43;QD=26.85;SB=-364.34	GT:AD:DP:GL:GQ	1/1:0,36:31:-100.25,-9.35,-0.03:93.22
-chr1	921029	rs2710880	A	G	58.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=3.24;MQ=56.56;MQ0=0;OQ=562.50;QD=14.06;SB=-270.38	GT:AD:DP:GL:GQ	0/1:15,25:36:-70.39,-10.85,-55.63:99
-chr1	921225	rs2799060	G	A	150.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=3.04;MQ=54.08;MQ0=0;OQ=614.91;QD=17.08;SB=-332.87	GT:AD:DP:GL:GQ	0/1:15,21:29:-73.51,-8.74,-35.50:99
-chr1	921371	rs2799061	T	A	126.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=52.82;MQ0=0;OQ=1479.30;QD=33.62;SB=-589.54	GT:AD:DP:GL:GQ	1/1:0,44:41:-151.53,-12.35,-0.02:99
-chr1	921411	rs2799062	G	T	122.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=53.36;MQ0=0;OQ=738.91;QD=16.06;SB=-235.96	GT:AD:DP:GL:GQ	0/1:19,27:43:-90.13,-12.95,-62.40:99
-chr1	921593	rs2005437	A	G	3.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=3.71;MQ=50.61;MQ0=0;OQ=1146.23;QD=32.75;SB=-497.46	GT:AD:DP:GL:GQ	1/1:0,35:33:-118.22,-9.94,-0.01:99
-chr1	921666	rs1891908	C	T	2.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.85;MQ=32.06;MQ0=2;OQ=160.89;QD=4.35;SB=-6.43	GT:AD:DP:GL:GQ	0/1:19,17:19:-25.09,-5.72,-45.39:99
-chr1	921743	rs2710878	G	A	0.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=13.34;MQ=30.42;MQ0=11;OQ=92.22;QD=1.77;SB=38.12	GT:AD:DP:GL:GQ	0/1:43,9:31:-21.85,-9.35,-87.56:99
-chr1	921798	rs59581901	T	C	0.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=13.36;MQ=44.02;MQ0=2;OQ=265.71;QD=4.66;SB=-27.22	GT:AD:DP:GL:GQ	0/1:37,20:42:-42.52,-12.66,-114.67:99
-chr1	921802	rs13303155	G	A	0.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=12.88;MQ=43.29;MQ0=2;OQ=165.28;QD=2.85;SB=-96.56	GT:AD:DP:GL:GQ	0/1:44,13:47:-33.98,-14.17,-116.58:99
-chr1	921917	rs13302969	G	T	74.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.19;MQ=21.41;MQ0=5;OQ=283.37;QD=8.86;SB=-65.73	GT:AD:DP:GL:GQ	0/1:6,26:13:-35.54,-3.92,-11.08:71.59
-chr1	921950	rs4350142	T	G	3.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=16.76;MQ0=5;OQ=77.67;QD=4.32;SB=-39.55	GT:AD:DP:GL:GQ	0/1:13,5:9:-13.76,-2.71,-16.22:99
-chr1	922320	rs1891910	G	A	55.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=1.92;MQ=54.96;MQ0=0;OQ=908.58;QD=18.93;SB=-365.40	GT:AD:DP:GL:GQ	0/1:20,28:47:-108.30,-14.16,-73.49:99
-chr1	922481	rs3128112	C	G	140.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.00;MQ0=0;OQ=2826.91;QD=42.19;SB=-1373.36	GT:AD:DP:GL:GQ	1/1:0,67:66:-286.30,-19.89,-0.02:99
-chr1	923653	rs9442392	G	A	34.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=57.66;MQ0=0;OQ=346.01;QD=17.30;SB=-99.62	GT:AD:DP:GL:GQ	0/1:8,12:18:-43.31,-5.43,-22.69:99
-chr1	923962	rs2710867	G	C	179.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.52;MQ0=0;OQ=491.87;QD=30.74;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,16:14:-52.79,-4.24,-0.02:42.13
-chr1	923969	rs2799063	A	G	177.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.52;MQ0=0;OQ=467.35;QD=31.16;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,15:15:-50.33,-4.52,-0.01:45.12
-chr1	923984	rs2488989	G	A	4.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=52.45;MQ0=0;OQ=54.72;QD=4.21;SB=-10.00	GT:AD:DP:GL:GQ	0/1:9,4:12:-12.37,-3.61,-31.32:87.56
-chr1	924007	rs9697551	C	G	2.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=52.65;MQ0=0;OQ=378.82;QD=37.88;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,10:10:-41.47,-3.01,-0.00:30.10
-chr1	925085	rs2298214	C	A	41.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=126.82;QD=15.85;SB=-10.00	GT:AD:DP:GL:GQ	0/1:3,5:8:-18.37,-2.41,-10.50:80.94
-chr1	925696	rs3128115	C	G	0.04	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=4;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=341.24;QD=28.44;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,12:10:-37.72,-3.03,-0.02:30.09
-chr1	925974	rs1936360	C	T	39.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=58.35;MQ0=0;OQ=214.61;QD=12.62;SB=-42.53	GT:AD:DP:GL:GQ	0/1:9,8:14:-28.97,-4.22,-22.12:99
-chr1	926057	rs3121570	A	G	2.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=311.77;QD=28.34;SB=-100.02	GT:AD:DP:GL:GQ	1/1:0,11:11:-34.77,-3.32,-0.01:33.06
-chr1	926073	rs3121569	C	A	189.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.87;MQ0=0;OQ=295.10;QD=26.83;SB=-77.88	GT:AD:DP:GL:GQ	1/1:0,11:10:-33.10,-3.01,-0.01:30.07
-chr1	927551	rs2489000	T	C	23.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.20;MQ0=0;OQ=869.96;QD=30.00;SB=-383.48	GT:AD:DP:GL:GQ	1/1:0,29:26:-90.60,-7.84,-0.01:78.21
-chr1	927679	.	G	T	11.95	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=20;HaplotypeScore=4.44;MQ=51.49;MQ0=1;QD=0.30;SB=29.12	GT:AD:DP:GL:GQ	0/1:35,5:33:-14.39,-9.94,-101.16:44.50
-chr1	927979	rs2710869	T	G	68.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=52.06;MQ0=0;OQ=1400.53;QD=31.83;SB=-711.32	GT:AD:DP:GL:GQ	1/1:0,44:41:-143.66,-12.35,-0.02:99
-chr1	927988	rs2710868	G	A	255.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.36;MQ0=0;OQ=410.87;QD=10.02;SB=-73.54	GT:AD:DP:GL:GQ	0/1:27,14:38:-55.83,-11.46,-75.32:99
-chr1	928076	rs2799058	A	G	513.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.12;MQ0=1;OQ=1982.35;QD=34.78;SB=-956.40	GT:AD:DP:GL:GQ	1/1:0,57:56:-201.84,-16.87,-0.02:99
-chr1	929868	rs2799056	A	G	83.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=2.34;MQ=60.00;MQ0=0;OQ=292.67;QD=13.30;SB=-94.98	GT:AD:DP:GL:GQ	0/1:10,12:19:-38.28,-5.73,-31.90:99
-chr1	929959	rs4503294	C	T	66.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.74;MQ=59.48;MQ0=0;OQ=871.55;QD=19.81;SB=-434.84	GT:AD:DP:GL:GQ	0/1:17,27:40:-102.50,-12.06,-44.62:99
-chr1	931147	rs3128116	C	T	186.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.94;MQ=58.74;MQ0=0;OQ=584.87;QD=15.81;SB=-318.85	GT:AD:DP:GL:GQ	0/1:17,20:34:-72.02,-10.25,-50.30:99
-chr1	931197	rs57683598	G	A	242.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=58.63;MQ0=0;OQ=443.86;QD=13.05;SB=-202.91	GT:AD:DP:GL:GQ	0/1:19,15:33:-57.62,-9.95,-57.41:99
-chr1	931402	rs9778087	C	T	103.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.28;MQ=58.18;MQ0=0;OQ=521.73;QD=14.49;SB=-147.61	GT:AD:DP:GL:GQ	0/1:17,19:30:-64.50,-9.04,-41.68:99
-chr1	933113	rs3121568	C	T	81.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=27.66;MQ0=1;OQ=764.02;QD=34.73;SB=-301.68	GT:AD:DP:GL:GQ	1/1:1,21:20:-79.99,-6.02,-0.00:60.20
-chr1	933331	rs3121567	T	C	90.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=52.92;MQ0=0;OQ=1930.66;QD=28.39;SB=-605.93	GT:AD:DP:GL:GQ	1/1:0,67:59:-196.69,-17.79,-0.04:99
-chr1	933550	rs2465140	G	C	10.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=52.98;MQ0=0;OQ=1826.77;QD=24.04;SB=-482.83	GT:AD:DP:GL:GQ	0/1:29,47:76:-208.87,-22.91,-115.72:99
-chr1	933770	rs2488992	C	G	622.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=2496.05;QD=39.00;SB=-1249.63	GT:AD:DP:GL:GQ	1/1:1,63:62:-253.23,-18.70,-0.04:99
-chr1	933831	rs13303313	C	T	77.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=54.98;MQ0=1;OQ=1022.40;QD=21.30;SB=-421.46	GT:AD:DP:GL:GQ	0/1:17,31:46:-119.39,-13.87,-49.73:99
-chr1	934427	rs3128117	T	C	70.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=3.79;MQ=59.48;MQ0=0;OQ=1012.81;QD=12.50;SB=-424.88	GT:AD:DP:GL:GQ	0/1:46,35:81:-128.96,-24.40,-186.84:99
-chr1	934959	rs3135457	C	T	611.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.45;MQ0=0;OQ=2185.20;QD=35.82;SB=-904.70	GT:AD:DP:GL:GQ	1/1:0,61:55:-222.12,-16.57,-0.02:99
-chr1	934974	rs13303172	C	T	140.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=58.59;MQ0=0;OQ=2216.02;QD=34.63;SB=-887.19	GT:AD:DP:GL:GQ	1/1:0,63:58:-225.21,-17.48,-0.03:99
-chr1	935337	rs3121566	C	T	64.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.42;MQ=57.82;MQ0=0;OQ=2650.36;QD=37.33;SB=-1265.29	GT:AD:DP:GL:GQ	1/1:0,71:68:-268.65,-20.49,-0.03:99
-chr1	935475	rs3121565	C	T	3.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=5.58;MQ=54.82;MQ0=0;OQ=1712.26;QD=33.57;SB=-826.14	GT:AD:DP:GL:GQ	1/1:0,51:46:-174.83,-13.86,-0.02:99
-chr1	935997	rs2341364	T	G	377.30	Indel	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=10.97;MQ=57.32;MQ0=2;QD=7.12;SB=-202.78	GT:AD:DP:GL:GQ	0/1:37,16:48:-55.47,-14.46,-118.77:99
-chr1	935998	rs9723307	T	G	915.61	Indel	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=11.45;MQ=57.32;MQ0=2;QD=17.28;SB=-353.60	GT:AD:DP:GL:GQ	0/1:21,32:48:-109.30,-14.46,-57.43:99
-chr1	936897	rs2465126	G	A	228.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.52;MQ0=0;OQ=1823.18;QD=37.98;SB=-798.06	GT:AD:DP:GL:GQ	1/1:0,48:47:-185.92,-14.16,-0.02:99
-chr1	937401	rs2465125	C	T	186.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.20;MQ0=0;OQ=2163.80;QD=37.31;SB=-987.00	GT:AD:DP:GL:GQ	1/1:0,58:56:-219.99,-16.88,-0.02:99
-chr1	938555	rs2341365	G	A	140.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.55;MQ0=0;OQ=1650.26;QD=34.38;SB=-693.43	GT:AD:DP:GL:GQ	1/1:0,47:44:-168.63,-13.26,-0.02:99
-chr1	938733	rs4615788	C	G	63.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=59.05;MQ0=0;OQ=1777.68;QD=37.82;SB=-661.48	GT:AD:DP:GL:GQ	1/1:0,47:45:-181.39,-13.58,-0.03:99
-chr1	938784	rs15842	T	C	63.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=51.15;MQ0=0;OQ=1180.61;QD=25.67;SB=-593.57	GT:AD:DP:GL:GQ	1/1:0,46:38:-121.68,-11.46,-0.04:99
-chr1	939098	rs2465124	G	A	101.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=58.32;MQ0=0;OQ=1385.28;QD=35.52;SB=-635.85	GT:AD:DP:GL:GQ	1/1:0,39:36:-142.13,-10.85,-0.02:99
-chr1	939471	rs1921	G	A	210.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=59.46;MQ0=0;OQ=818.95;QD=19.05;SB=-428.80	GT:AD:DP:GL:GQ	0/1:17,25:41:-97.53,-12.36,-57.36:99
-chr1	939517	rs8997	A	G	93.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.52;MQ=58.71;MQ0=0;OQ=1127.57;QD=31.32;SB=-511.18	GT:AD:DP:GL:GQ	1/1:0,36:33:-116.36,-9.94,-0.02:99
-chr1	939788	rs2799070	C	T	122.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=60.00;MQ0=0;OQ=1513.64;QD=36.92;SB=-701.35	GT:AD:DP:GL:GQ	1/1:0,40:39:-154.96,-11.75,-0.01:99
-chr1	940106	rs1891906	A	C	58.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=59.38;MQ0=0;OQ=496.04;QD=13.41;SB=-49.04	GT:AD:DP:GL:GQ	0/1:19,18:37:-64.03,-11.14,-68.15:99
-chr1	940540	rs9331223	T	C	228.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=58.40;MQ0=0;OQ=564.77;QD=13.45;SB=-287.31	GT:AD:DP:GL:GQ	0/1:17,25:39:-71.52,-11.76,-66.74:99
-chr1	940579	rs2799069	A	T	132.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=57.66;MQ0=0;OQ=1217.27;QD=32.90;SB=-595.76	GT:AD:DP:GL:GQ	1/1:0,37:34:-125.32,-10.24,-0.01:99
-chr1	941146	rs9442363	C	T	200.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=29.19;MQ0=1;OQ=502.68;QD=12.89;SB=-262.28	GT:AD:DP:GL:GQ	0/1:16,22:28:-61.99,-8.44,-37.57:99
-chr1	941158	rs9442388	C	T	75.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=4.38;MQ=27.92;MQ0=1;OQ=496.98;QD=10.80;SB=-155.64	GT:AD:DP:GL:GQ	0/1:24,22:37:-64.14,-11.16,-65.52:99
-chr1	941185	rs9697362	C	T	0.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=4;HaplotypeScore=0.96;MQ=26.62;MQ0=0;OQ=1253.78;QD=25.59;SB=-636.34	GT:AD:DP:GL:GQ	1/1:0,49:34:-128.98,-10.25,-0.02:99
-chr1	941193	rs9697717	G	A	313.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=26.36;MQ0=0;OQ=1030.78;QD=25.77;SB=-468.62	GT:AD:DP:GL:GQ	1/1:0,40:27:-106.67,-8.14,-0.01:81.26
-chr1	941427	rs2465141	A	G	200.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.01;MQ=50.56;MQ0=1;OQ=585.65;QD=10.65;SB=-303.21	GT:AD:DP:GL:GQ	0/1:29,26:48:-76.32,-14.47,-98.65:99
-chr1	941491	.	A	T	28.08	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=45.78;MQ0=3;QD=0.52;SB=41.14	GT:AD:DP:GL:GQ	0/1:46,8:45:-19.65,-13.56,-148.74:60.91
-chr1	941866	rs3128118	G	A	182.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.48;MQ=58.42;MQ0=1;OQ=769.91;QD=13.27;SB=-278.19	GT:AD:DP:GL:GQ	0/1:30,27:54:-96.56,-16.28,-93.17:99
-chr1	942291	rs9442611	G	A	158.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=58.27;MQ0=0;OQ=928.32;QD=19.34;SB=-479.01	GT:AD:DP:GL:GQ	0/1:19,29:48:-110.59,-14.48,-59.61:99
-chr1	943087	rs4970390	C	T	107.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=50.43;MQ0=1;OQ=376.23;QD=6.60;SB=-175.84	GT:AD:DP:GL:GQ	0/1:38,19:49:-55.68,-14.78,-111.95:99
-chr1	943217	rs61766298	G	A	33.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=54.66;MQ0=1;OQ=355.20;QD=4.80;SB=-58.95	GT:AD:DP:GL:GQ	0/1:57,16:65:-58.41,-19.60,-158.72:99
-chr1	943541	rs2952918	T	C	3.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=5.78;MQ=53.39;MQ0=0;OQ=348.13;QD=8.70;SB=-186.61	GT:AD:DP:GL:GQ	0/1:24,16:38:-49.55,-11.46,-86.70:99
-chr1	943815	rs9442612	G	A	205.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=57.73;MQ0=0;OQ=533.79;QD=13.02;SB=-257.75	GT:AD:DP:GL:GQ	0/1:22,19:39:-68.42,-11.76,-70.56:99
-chr1	944640	rs61766299	C	A	104.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=57.66;MQ0=0;OQ=76.34;QD=7.63;SB=-34.38	GT:AD:DP:GL:GQ	0/1:6,4:9:-13.63,-2.71,-15.11:99
-chr1	946715	rs9777931	C	T	99.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=1.79;MQ=60.00;MQ0=0;OQ=313.20;QD=12.05;SB=-129.12	GT:AD:DP:GL:GQ	0/1:14,11:22:-41.23,-6.63,-41.31:99
-chr1	949018	rs3845291	G	A	42.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=1.63;MQ=59.54;MQ0=0;OQ=843.29;QD=16.87;SB=-349.52	GT:AD:DP:GL:GQ	0/1:23,27:47:-101.78,-14.17,-66.18:99
-chr1	949032	rs3845292	G	C	180	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=59.52;MQ0=0;OQ=777.11;QD=16.19;SB=-360.45	GT:AD:DP:GL:GQ	0/1:22,26:45:-94.57,-13.58,-90.66:99
-chr1	949094	rs4039721	G	A	273.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.09;MQ0=0;OQ=688.73;QD=16.80;SB=-366.42	GT:AD:DP:GL:GQ	0/1:19,22:36:-83.01,-10.86,-46.17:99
-chr1	950272	rs4970392	G	C	3.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=3;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=405.25;QD=17.62;SB=-227.38	GT:AD:DP:GL:GQ	0/1:10,13:21:-50.14,-6.33,-36.47:99
-chr1	951690	rs3121556	G	A	175.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=59.49;MQ0=0;OQ=541.95;QD=12.04;SB=-261.27	GT:AD:DP:GL:GQ	0/1:25,20:39:-69.24,-11.76,-65.32:99
-chr1	952469	rs4970393	G	A	53.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=4.24;MQ=58.80;MQ0=0;OQ=631.93;QD=18.06;SB=-331.90	GT:AD:DP:GL:GQ	0/1:14,21:33:-76.42,-9.95,-42.13:99
-chr1	952754	rs4970394	C	T	113.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=59.23;MQ0=0;OQ=488.22;QD=16.27;SB=-210.21	GT:AD:DP:GL:GQ	0/1:14,15:29:-60.84,-8.74,-49.96:99
-chr1	953112	rs2710870	C	T	198.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.50;MQ=60.00;MQ0=0;OQ=692.82;QD=14.74;SB=-280.19	GT:AD:DP:GL:GQ	0/1:24,23:46:-86.43,-13.86,-83.87:99
-chr1	953580	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=16;HaplotypeScore=1.95;MQ=42.79;MQ0=0;OQ=89.92;QD=8.17;SB=-0.97	GT:AD:DP:GL:GQ	0/1:7,4:8:-14.69,-2.41,-16.44:99
-chr1	953584	rs2465127	T	C	0.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=12;Dels=0.00;HRun=3;HaplotypeScore=3.77;MQ=52.61;MQ0=0;OQ=94.29;QD=7.86;SB=-65.34	GT:AD:DP:GL:GQ	0/1:4,8:9:-15.43,-2.71,-16.16:99
-chr1	954093	.	G	A	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=9.68;MQ=33.26;MQ0=5;OQ=209.72;QD=5.67;SB=-3.99	GT:AD:DP:GL:GQ	0/1:21,12:15:-28.78,-4.52,-24.72:99
-chr1	954161	rs61766303	C	G	18.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=31.02;MQ0=1;OQ=184.53;QD=5.27;SB=-0.98	GT:AD:DP:GL:GQ	0/1:19,16:16:-26.57,-4.83,-37.31:99
-chr1	954252	rs4970397	C	T	103.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=32.94;MQ0=3;OQ=204.52;QD=7.57;SB=-35.64	GT:AD:DP:GL:GQ	0/1:17,10:18:-29.16,-5.43,-34.74:99
-chr1	954703	rs4970343	T	C	2.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=6.47;MQ=58.52;MQ0=0;OQ=457.55;QD=14.30;SB=-98.71	GT:AD:DP:GL:GQ	0/1:14,18:30:-58.08,-9.04,-50.50:99
-chr1	954711	rs4970344	A	T	37.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.43;MQ0=0;OQ=626.99;QD=19.00;SB=-168.81	GT:AD:DP:GL:GQ	0/1:12,21:33:-75.92,-9.94,-45.13:99
-chr1	954872	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=20.43;MQ=48.78;MQ0=1;OQ=116.04;QD=3.14;SB=-52.28	GT:AD:DP:GL:GQ	0/1:25,12:25:-22.42,-7.54,-71.63:99
-chr1	955038	rs28373660	A	G	250.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=55.30;MQ0=0;OQ=611.00;QD=13.28;SB=-229.46	GT:AD:DP:GL:GQ	0/1:20,26:39:-76.13,-11.75,-66.91:99
-chr1	955106	.	A	G	23.39	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=10.05;MQ=39.47;MQ0=7;QD=0.46;SB=-5.58	GT:AD:DP:GL:GQ	0/1:38,13:31:-14.97,-9.35,-98.23:56.21
-chr1	955141	rs28433148	T	C	0.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.04;HRun=0;HaplotypeScore=16.86;MQ=40.85;MQ0=6;OQ=407.46;QD=7.41;SB=-215.36	GT:AD:DP:GL:GQ	0/1:25,28:41:-56.09,-12.06,-84.28:99
-chr1	955386	rs4970404	A	G	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.02;HRun=0;HaplotypeScore=18.83;MQ=42.69;MQ0=11;OQ=218.68;QD=3.58;SB=-113.62	GT:AD:DP:GL:GQ	0/1:39,21:33:-35.11,-9.95,-82.73:99
-chr1	955467	rs4970345	C	T	151.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=44.49;MQ0=2;OQ=398.93;QD=9.73;SB=-192.19	GT:AD:DP:GL:GQ	0/1:19,21:26:-51.01,-7.84,-42.93:99
-chr1	955802	rs4970398	A	T	97.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=4.10;MQ=47.03;MQ0=2;OQ=550.07;QD=10.19;SB=-184.73	GT:AD:DP:GL:GQ	0/1:27,27:47:-72.45,-14.16,-100.00:99
-chr1	955812	rs4970399	A	G	52.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.02;HRun=0;HaplotypeScore=3.69;MQ=45.58;MQ0=2;OQ=418.21;QD=7.47;SB=-156.96	GT:AD:DP:GL:GQ	0/1:27,28:43:-57.78,-12.67,-88.06:99
-chr1	955927	.	T	C	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.47;MQ=51.74;MQ0=5;OQ=79.40;QD=1.80;SB=-44.68	GT:AD:DP:GL:GQ	0/1:30,14:34:-21.47,-10.25,-106.58:99
-chr1	955942	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=21.62;MQ=50.59;MQ0=7;OQ=96.72;QD=1.97;SB=-71.62	GT:AD:DP:GL:GQ	0/1:29,17:31:-22.31,-9.35,-90.50:99
-chr1	956010	.	A	G	17.59	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=45.86;MQ0=9;QD=0.35;SB=1.17	GT:AD:DP:GL:GQ	0/1:36,13:34:-15.29,-10.25,-111.87:50.35
-chr1	957521	rs4970349	C	T	109.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.54;MQ=59.65;MQ0=0;OQ=696.48;QD=12.90;SB=-243.23	GT:AD:DP:GL:GQ	0/1:30,24:51:-88.30,-15.37,-100.68:99
-chr1	960023	.	C	T	7.39	PASS	AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=53.50;MQ0=0;OQ=70.28;QD=5.86;SB=-0.98	GT:AD:DP:GL:GQ	0/1:7,5:10:-13.33,-3.02,-17.80:99
-chr1	960078	rs9442364	G	C	190.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=59.38;QD=8.48;SB=-32.42	GT:AD:DP:GL:GQ	0/1:3,4:6:-11.04,-1.82,-11.54:92.22
-chr1	961087	rs2799055	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=6;HaplotypeScore=0.98;MQ=59.32;MQ0=0;OQ=442.07;QD=13.00;SB=-186.63	GT:AD:DP:GL:GQ	0/1:16,18:32:-57.14,-9.65,-55.82:99
-chr1	961230	rs2710883	T	C	342.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=662.38;QD=14.09;SB=-345.94	GT:AD:DP:GL:GQ	0/1:23,24:47:-83.68,-14.16,-90.90:99
-chr1	961997	rs3121575	C	T	135.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=582.22;QD=15.32;SB=-286.19	GT:AD:DP:GL:GQ	0/1:17,20:35:-72.05,-10.55,-56.30:99
-chr1	962043	rs4970350	G	A	118.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=762.03;QD=19.05;SB=-359.38	GT:AD:DP:GL:GQ	0/1:16,24:38:-90.95,-11.46,-47.96:99
-chr1	963199	rs2488993	A	G	276.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=691.22;QD=14.71;SB=-269.95	GT:AD:DP:GL:GQ	0/1:22,25:46:-86.26,-13.86,-87.86:99
-chr1	963240	rs2465129	G	A	277.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.66;MQ=58.44;MQ0=0;OQ=598.48;QD=15.35;SB=-309.81	GT:AD:DP:GL:GQ	0/1:19,20:36:-73.98,-10.85,-56.47:99
-chr1	963321	rs2465130	C	T	51.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=517.87;QD=11.26;SB=-211.85	GT:AD:DP:GL:GQ	0/1:28,18:43:-68.02,-12.95,-92.79:99
-chr1	963531	rs2488994	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=4;HaplotypeScore=7.50;MQ=58.37;MQ0=0;OQ=421.46;QD=9.80;SB=-94.66	GT:AD:DP:GL:GQ	0/1:26,17:40:-57.48,-12.05,-93.15:99
-chr1	964043	rs3121577	G	T	194.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=59.29;MQ0=0;OQ=740.60;QD=11.39;SB=-370.98	GT:AD:DP:GL:GQ	0/1:36,29:64:-96.63,-19.29,-128.48:99
-chr1	964062	rs2465131	C	T	262.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.28;MQ0=0;OQ=941.69;QD=14.71;SB=-361.86	GT:AD:DP:GL:GQ	0/1:34,30:62:-116.13,-18.68,-116.79:99
-chr1	964088	rs2488995	A	G	204.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=60.00;MQ0=0;OQ=709.06;QD=12.66;SB=-311.29	GT:AD:DP:GL:GQ	0/1:29,27:55:-90.77,-16.58,-108.13:99
-chr1	964159	rs2488996	A	G	168.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=2.14;MQ=59.09;MQ0=0;OQ=732.05;QD=15.91;SB=-365.63	GT:AD:DP:GL:GQ	0/1:18,28:43:-89.45,-12.96,-67.34:99
-chr1	964218	rs2488997	G	A	8.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=4.51;MQ=58.80;MQ0=0;OQ=657.04;QD=18.77;SB=-348.46	GT:AD:DP:GL:GQ	0/1:15,20:35:-79.53,-10.55,-53.54:99
-chr1	964219	rs2465132	T	C	152.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=3.54;MQ=58.80;MQ0=0;OQ=438.83;QD=12.54;SB=-221.28	GT:AD:DP:GL:GQ	0/1:15,20:33:-57.12,-9.95,-56.00:99
-chr1	964357	rs2465133	G	T	31.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=5.89;MQ=58.66;MQ0=0;OQ=971.31;QD=14.72;SB=-505.87	GT:AD:DP:GL:GQ	0/1:30,36:62:-119.10,-18.68,-97.98:99
-chr1	964433	rs2465134	T	G	140.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=2.32;MQ=58.54;MQ0=0;OQ=578.70;QD=12.58;SB=-251.93	GT:AD:DP:GL:GQ	0/1:22,23:38:-72.60,-11.45,-62.23:99
-chr1	964525	rs2465135	G	T	124.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.24;MQ=58.59;MQ0=0;OQ=621.72;QD=18.84;SB=-320.48	GT:AD:DP:GL:GQ	0/1:13,20:32:-75.10,-9.64,-38.41:99
-chr1	964757	rs3121578	C	T	344.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.81;MQ0=0;OQ=283.06;QD=10.11;SB=-156.67	GT:AD:DP:GL:GQ	0/1:18,10:26:-39.43,-7.84,-52.76:99
-chr1	964996	rs3121579	T	A	109.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.40;MQ0=0;OQ=475.63;QD=15.34;SB=-146.82	GT:AD:DP:GL:GQ	0/1:15,16:30:-59.88,-9.04,-53.03:99
-chr1	965565	rs9331224	A	G	58.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=1.21;MQ=58.67;MQ0=0;OQ=414.04;QD=11.83;SB=-233.27	GT:AD:DP:GL:GQ	0/1:19,16:32:-54.33,-9.64,-64.60:99
-chr1	967066	rs3121552	G	C	40.51	LowQual	AC=1;AF=0.50;AN=2;DB;DP=5;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;QD=8.10;SB=-43.44	GT:AD:DP:GL:GQ	0/1:3,2:4:-8.54,-1.21,-8.39:71.79
-chr1	967193	rs2799066	T	C	15.85	LowQual	AC=1;AF=0.50;AN=2;DB;DP=8;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.05;MQ0=0;QD=1.98;SB=-24.63	GT:AD:DP:GL:GQ	0/1:6,2:8:-7.27,-2.41,-22.53:48.57
-chr1	967433	rs2710876	G	A	2.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=7.34;MQ=57.29;MQ0=0;OQ=207.99;QD=8.00;SB=-101.60	GT:AD:DP:GL:GQ	0/1:14,12:21:-30.42,-6.34,-38.59:99
-chr1	967643	rs2710875	C	T	1.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=4.71;MQ=57.25;MQ0=0;OQ=665.34;QD=21.46;SB=-289.34	GT:AD:DP:GL:GQ	0/1:11,20:28:-78.26,-8.44,-23.82:99
-chr1	970323	rs3128097	G	A	1.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=9.72;MQ=59.47;MQ0=0;OQ=926.21;QD=16.84;SB=-308.84	GT:AD:DP:GL:GQ	0/1:24,31:51:-111.27,-15.36,-80.98:99
-chr1	970950	rs3128098	A	G	264.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=57.28;MQ0=0;OQ=593.17;QD=14.83;SB=-270.38	GT:AD:DP:GL:GQ	0/1:15,24:36:-73.46,-10.85,-50.98:99
-chr1	971794	rs2465128	A	G	68.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=60.00;MQ0=0;OQ=206.80;QD=7.66;SB=-83.65	GT:AD:DP:GL:GQ	0/1:13,14:23:-30.90,-6.93,-51.94:99
-chr1	972307	rs3128099	A	G	0.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=7.82;MQ=57.77;MQ0=0;OQ=622.11;QD=14.81;SB=-282.64	GT:AD:DP:GL:GQ	0/1:15,25:37:-76.65,-11.15,-58.34:99
-chr1	972325	rs3128100	T	C	8.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=4.33;MQ=57.56;MQ0=0;OQ=1298.64;QD=27.06;SB=-459.21	GT:AD:DP:GL:GQ	1/1:0,48:42:-133.49,-12.67,-0.04:99
-chr1	972376	rs3128101	T	C	10.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=5.66;MQ=56.76;MQ0=0;OQ=571.56;QD=13.94;SB=-141.55	GT:AD:DP:GL:GQ	0/1:15,25:36:-73.37,-12.93,-53.37:99
-chr1	972804	rs3128102	T	C	4.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=3.75;MQ=59.50;MQ0=0;OQ=547.08;QD=11.89;SB=-200.60	GT:AD:DP:GL:GQ	0/1:23,23:37:-69.14,-11.15,-71.89:99
-chr1	972857	rs10267	T	C	1.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=2.51;MQ=58.63;MQ0=0;OQ=633.32;QD=18.63;SB=-175.96	GT:AD:DP:GL:GQ	0/1:12,21:33:-76.56,-9.94,-48.12:99
-chr1	974010	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=20;HaplotypeScore=11.22;MQ=50.83;MQ0=0;OQ=57.83;QD=3.04;SB=2.03	GT:AD:DP:GL:GQ	0/1:15,4:17:-14.19,-5.12,-41.74:90.67
-chr1	974165	rs9442391	T	C	32.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=1.12;MQ=57.07;MQ0=0;OQ=302.47;QD=11.63;SB=-10.00	GT:AD:DP:GL:GQ	0/1:13,13:22:-40.16,-6.63,-43.34:99
-chr1	975129	rs2275813	C	T	11.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.16;MQ0=0;OQ=102.58;QD=20.52;SB=-45.66	GT:AD:DP:GL:GQ	0/1:1,4:5:-15.04,-1.51,-2.70:11.90
-chr1	975309	rs2275812	G	T	1.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=7.77;MQ=59.16;MQ0=0;OQ=108.56;QD=9.87;SB=-36.92	GT:AD:DP:GL:GQ	0/1:5,6:10:-17.15,-3.01,-16.77:99
-chr1	975312	rs56255212	G	A	0.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=7.96;MQ=57.00;MQ0=0;OQ=248.84;QD=22.62;SB=-118.97	GT:AD:DP:GL:GQ	0/1:2,9:10:-31.18,-3.01,-6.57:35.54
-chr1	976306	rs2710887	C	T	180.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=498.86;QD=13.13;SB=-206.20	GT:AD:DP:GL:GQ	0/1:21,17:37:-64.33,-11.16,-66.50:99
-chr1	977063	rs9803031	C	T	254.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.50;MQ0=0;OQ=585.89;QD=18.90;SB=-309.86	GT:AD:DP:GL:GQ	0/1:13,18:30:-70.92,-9.05,-35.55:99
-chr1	977533	rs13303287	T	G	495.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=796.56;QD=13.73;SB=-424.70	GT:AD:DP:GL:GQ	0/1:25,33:58:-100.42,-17.48,-92.24:99
-chr1	978366	rs2799071	A	T	261.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=849.34;QD=16.33;SB=-440.60	GT:AD:DP:GL:GQ	0/1:23,29:48:-102.68,-14.47,-71.41:99
-chr1	978795	rs2710871	G	C	22.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=0.83;MQ=58.33;MQ0=0;OQ=743.65;QD=17.71;SB=-370.12	GT:AD:DP:GL:GQ	0/1:18,24:36:-88.51,-10.86,-57.89:99
-chr1	980143	rs4275402	C	T	40.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=58.13;MQ0=0;OQ=896.64;QD=35.87;SB=-438.31	GT:AD:DP:GL:GQ	1/1:0,25:24:-93.26,-7.23,-0.01:72.23
-chr1	980380	rs2710872	C	T	78.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=549.92;QD=18.33;SB=-189.29	GT:AD:DP:GL:GQ	0/1:12,18:27:-66.42,-8.14,-30.90:99
-chr1	980636	rs2799072	C	T	101.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=60.00;MQ0=0;OQ=1104.80;QD=20.09;SB=-396.92	GT:AD:DP:GL:GQ	0/1:22,33:54:-130.03,-16.27,-75.12:99
-chr1	980669	rs2799073	G	A	136.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=60.00;MQ0=0;OQ=1001.06;QD=20.02;SB=-407.16	GT:AD:DP:GL:GQ	0/1:17,32:47:-117.55,-14.17,-57.43:99
-chr1	980847	rs8014	G	A	99.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=656.29;QD=17.27;SB=-261.26	GT:AD:DP:GL:GQ	0/1:18,20:38:-80.37,-11.45,-56.60:99
-chr1	981587	rs3121562	C	T	350.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.79;MQ0=0;OQ=354.87;QD=13.14;SB=-164.15	GT:AD:DP:GL:GQ	0/1:12,15:25:-46.32,-7.55,-37.60:99
-chr1	981840	rs4970400	G	A	115.33	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=38.45;MQ=54.81;MQ0=0;QD=3.04;SB=-51.02	GT:AD:DP:GL:GQ	0/1:30,8:33:-24.78,-9.96,-81.20:99
-chr1	981844	rs13303259	A	G	138.38	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=33.28;MQ=55.32;MQ0=0;QD=3.29;SB=-90.63	GT:AD:DP:GL:GQ	0/1:32,10:37:-28.28,-11.16,-110.43:99
-chr1	981845	rs2710885	T	C	325.46	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=29.31;MQ=55.32;MQ0=0;QD=7.75;SB=-95.70	GT:AD:DP:GL:GQ	0/1:24,18:34:-46.08,-10.25,-78.60:99
-chr1	981905	rs3121564	C	T	503.25	Indel	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.81;MQ=56.07;MQ0=0;QD=13.24;SB=-230.23	GT:AD:DP:GL:GQ	0/1:19,19:34:-63.86,-10.25,-57.54:99
-chr1	981947	rs2710886	T	C	139.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.81;MQ=57.30;MQ0=0;OQ=454.51;QD=9.88;SB=-191.43	GT:AD:DP:GL:GQ	0/1:25,21:45:-62.31,-13.57,-94.53:99
-chr1	981957	rs2799074	T	C	39.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=2.69;MQ=57.39;MQ0=0;OQ=362.93;QD=6.48;SB=-127.51	GT:AD:DP:GL:GQ	0/1:32,23:44:-52.84,-13.27,-101.58:99
-chr1	982190	rs2245754	C	T	115.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=2.93;MQ=56.87;MQ0=0;OQ=667.97;QD=12.60;SB=-322.42	GT:AD:DP:GL:GQ	0/1:29,24:49:-84.84,-14.76,-98.05:99
-chr1	982682	rs9331226	G	A	139.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=47.23;MQ0=0;OQ=1563.99;QD=20.85;SB=-791.90	GT:AD:DP:GL:GQ	0/1:29,46:74:-181.97,-22.29,-107.08:99
-chr1	983223	rs13303240	C	A	201.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=58.32;MQ0=0;OQ=838.66;QD=15.82;SB=-290.67	GT:AD:DP:GL:GQ	0/1:25,28:52:-102.82,-15.67,-74.49:99
-chr1	984254	rs2488991	G	T	204.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=58.59;MQ0=0;OQ=458.34;QD=13.89;SB=-201.49	GT:AD:DP:GL:GQ	0/1:13,19:30:-58.16,-9.04,-45.43:99
-chr1	985344	rs9442393	T	G	429.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=599.53;QD=14.99;SB=-298.50	GT:AD:DP:GL:GQ	0/1:18,22:39:-74.98,-11.75,-60.16:99
-chr1	987271	rs28397086	T	C	29.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.90;MQ0=0;OQ=513.69;QD=32.11;SB=-117.05	GT:AD:DP:GL:GQ	1/1:0,16:15:-54.96,-4.52,-0.01:45.13
-chr1	988258	rs7526076	A	G	181.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=59.56;MQ0=0;OQ=852.42;QD=16.08;SB=-332.31	GT:AD:DP:GL:GQ	0/1:24,29:52:-104.19,-15.67,-91.85:99
-chr1	988445	rs3813194	G	C	229.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.48;MQ0=0;OQ=676.17;QD=16.90;SB=-324.02	GT:AD:DP:GL:GQ	0/1:19,21:38:-82.36,-11.46,-78.97:99
-chr1	990019	rs11584349	C	T	5.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=221.74;QD=18.48;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,7:12:-29.08,-3.62,-14.98:99
-chr1	991040	rs4970401	G	C	199.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=1348.36;QD=21.75;SB=-452.37	GT:AD:DP:GL:GQ	0/1:27,35:61:-156.51,-18.39,-101.07:99
-chr1	992297	rs11260596	C	T	126.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.11;MQ0=0;OQ=235.14;QD=11.76;SB=-75.09	GT:AD:DP:GL:GQ	0/1:10,10:18:-32.23,-5.43,-30.14:99
-chr1	992795	rs4246502	C	G	1.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.20;MQ0=0;OQ=331.32;QD=25.49;SB=-10.00	GT:AD:DP:GL:GQ	0/1:3,10:12:-40.03,-3.62,-11.85:82.27
-chr1	992916	rs4074992	C	T	64.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.96;MQ0=0;OQ=236.09;QD=13.12;SB=-45.65	GT:AD:DP:GL:GQ	0/1:9,9:18:-32.32,-5.43,-28.25:99
-chr1	993492	rs4075116	C	T	510.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=697.41;QD=15.16;SB=-277.76	GT:AD:DP:GL:GQ	0/1:23,23:43:-85.98,-12.96,-73.34:99
-chr1	994820	rs4073176	G	A	10.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=141.42;QD=15.71;SB=-0.98	GT:AD:DP:GL:GQ	0/1:4,5:9:-20.14,-2.71,-13.80:99
-chr1	994843	rs4073177	G	A	1.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=225.74;QD=20.52;SB=-3.99	GT:AD:DP:GL:GQ	0/1:4,7:11:-29.17,-3.31,-13.13:98.16
-chr1	995932	rs55918415	G	A	129.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=57.98;MQ0=1;OQ=500.10;QD=13.89;SB=-124.09	GT:AD:DP:GL:GQ	0/1:20,16:33:-63.24,-9.94,-54.88:99
-chr1	996086	rs9442394	G	A	160.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=2.17;MQ=59.51;MQ0=0;OQ=685.95;QD=14.59;SB=-304.81	GT:AD:DP:GL:GQ	0/1:25,22:45:-85.44,-13.56,-78.07:99
-chr1	996853	rs4326571	G	A	22.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=3.32;MQ=58.90;MQ0=0;OQ=529.40;QD=13.93;SB=-35.65	GT:AD:DP:GL:GQ	0/1:21,17:38:-67.68,-11.45,-66.25:99
-chr1	999097	rs9442366	T	C	69.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=59.30;MQ0=0;OQ=217.52;QD=6.59;SB=-81.95	GT:AD:DP:GL:GQ	0/1:21,12:31:-34.38,-9.34,-81.07:99
-chr1	999304	.	G	A	28.33	PASS	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=57.94;MQ0=0;OQ=327.19;QD=9.62;SB=-182.19	GT:AD:DP:GL:GQ	0/1:21,13:31:-45.35,-9.34,-65.26:99
-chr1	999341	rs9442367	G	C	25.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=2;HaplotypeScore=0.81;MQ=58.59;MQ0=0;OQ=590.30;QD=17.89;SB=-256.14	GT:AD:DP:GL:GQ	0/1:14,19:30:-71.37,-9.06,-48.75:99
-chr1	1000580	rs9442368	C	T	47.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=4.96;MQ=54.71;MQ0=0;OQ=650.78;QD=15.49;SB=-262.79	GT:AD:DP:GL:GQ	0/1:21,21:39:-80.11,-11.75,-60.91:99
-chr1	1000958	rs11810785	A	G	695.93	Indel	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=6;HaplotypeScore=2.96;MQ=54.24;MQ0=1;QD=26.77;SB=-339.63	GT:AD:DP:GL:GQ	1/1:0,26:21:-73.19,-6.33,-0.01:63.17
-chr1	1001394	.	T	C	34.95	LowQual	AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=41.30;MQ0=1;QD=3.88;SB=-6.99	GT:AD:DP:GL:GQ	0/1:6,3:8:-9.19,-2.41,-20.53:67.78
-chr1	1001500	.	A	T	20.13	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=16.78;MQ0=8;QD=0.81;SB=-10.00	GT:AD:DP:GL:GQ	0/1:19,5:9:-8.01,-2.72,-22.07:52.92
-chr1	1002064	.	G	C	10.08	LowQual	AC=1;AF=0.50;AN=2;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.77;MQ0=0;QD=5.04;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,1:1:-4.25,-0.30,-0.00:1.76
-chr1	1002464	.	A	T	1.23	PASS	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=18.46;MQ0=3;OQ=57.47;QD=3.59;SB=-37.37	GT:AD:DP:GL:GQ	0/1:8,7:4:-10.24,-1.21,-3.80:25.95
-chr1	1002488	.	A	T	34.11	LowQual	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=7.23;MQ=19.96;MQ0=3;QD=2.27;SB=-4.00	GT:AD:DP:GL:GQ	0/1:9,6:4:-7.90,-1.21,-5.60:43.89
-chr1	1002494	.	A	T	35.11	LowQual	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=4.75;MQ=19.72;MQ0=3;QD=2.51;SB=-7.00	GT:AD:DP:GL:GQ	0/1:7,7:3:-7.70,-0.90,-3.30:23.95
-chr1	1002516	.	G	A	46.02	LowQual	AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=4.77;MQ=18.44;MQ0=1;QD=4.60;SB=-10.00	GT:AD:DP:GL:GQ	1/1:5,5:2:-8.01,-0.60,-0.00:6.02
-chr1	1002856	.	T	G	12.29	PASS	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.33;MQ0=1;OQ=106.33;QD=5.32;SB=-21.95	GT:AD:DP:GL:GQ	0/1:10,10:13:-17.84,-3.92,-27.80:99
-chr1	1003100	.	C	T	26.46	LowQual	AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=39.70;MQ0=0;QD=2.65;SB=-3.99	GT:AD:DP:GL:GQ	0/1:8,2:6:-7.74,-1.81,-13.13:59.28
-chr1	1003243	.	G	C	4.11	PASS	AC=2;AF=1.00;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=4.94;MQ=27.95;MQ0=9;OQ=330.47;QD=13.77;SB=-94.94	GT:AD:DP:GL:GQ	1/1:14,10:9:-36.64,-2.72,-0.01:27.09
-chr1	1003514	.	C	A	42.25	LowQual	AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=28.30;MQ0=1;QD=7.04;SB=-46.39	GT:AD:DP:GL:GQ	1/1:0,6:2:-7.63,-0.60,-0.00:6.02
-chr1	1003557	.	T	A	0.08	PASS	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=5.02;MQ=17.13;MQ0=14;OQ=71.49;QD=2.98;SB=-43.38	GT:AD:DP:GL:GQ	0/1:21,3:4:-11.64,-1.20,-3.64:24.35
-chr1	1003864	.	G	C	10.99	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=9.87;MQ=5.60;MQ0=15;QD=0.58;SB=-10.00	GT:AD:DP:GL:GQ	0/1:17,2:1:-4.35,-0.30,-0.00:1.76
-chr1	1004168	.	A	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=12.18;MQ=19.95;MQ0=11;OQ=53.86;QD=2.56;SB=-37.95	GT:AD:DP:GL:GQ	0/1:14,6:6:-10.48,-1.81,-11.22:86.70
-chr1	1004254	.	G	C	33.05	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=1;HaplotypeScore=6.90;MQ=13.09;MQ0=11;QD=1.32;SB=-10.00	GT:AD:DP:GL:GQ	0/1:13,12:4:-7.80,-1.21,-8.59:65.89
-chr1	1004313	.	G	C	21.04	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=11.38;MQ0=14;QD=0.84;SB=-3.98	GT:AD:DP:GL:GQ	0/1:23,2:6:-7.19,-1.81,-17.58:53.84
-chr1	1004699	rs12401605	A	G	193.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=54.82;MQ0=0;OQ=256.92;QD=8.56;SB=-154.32	GT:AD:DP:GL:GQ	0/1:17,12:28:-37.42,-8.44,-63.53:99
-chr1	1004727	rs12411041	T	A	29.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=54.35;MQ0=0;OQ=225.92;QD=6.11;SB=-72.06	GT:AD:DP:GL:GQ	0/1:25,11:32:-35.52,-9.65,-76.83:99
-chr1	1004989	rs36027499	A	G	65.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=54.55;MQ0=0;OQ=184.41;QD=7.38;SB=-109.60	GT:AD:DP:GL:GQ	0/1:16,9:24:-28.96,-7.24,-58.60:99
-chr1	1005120	rs9442369	A	G	5.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.83;MQ=59.36;MQ0=0;OQ=146.76;QD=4.08;SB=-64.75	GT:AD:DP:GL:GQ	0/1:26,10:34:-28.21,-10.25,-99.59:99
-chr1	1005414	rs9442370	C	T	185.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.23;MQ0=0;OQ=413.23;QD=13.77;SB=-165.25	GT:AD:DP:GL:GQ	0/1:14,16:26:-52.45,-7.84,-38.57:99
-chr1	1005680	rs12746483	G	A	50.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=2.06;MQ=55.16;MQ0=0;OQ=462.98;QD=16.54;SB=-241.55	GT:AD:DP:GL:GQ	0/1:13,15:28:-58.02,-8.44,-44.58:99
-chr1	1007033	rs3766193	C	G	206.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.18;MQ=57.65;MQ0=0;OQ=606.89;QD=15.97;SB=-241.40	GT:AD:DP:GL:GQ	0/1:19,19:36:-74.82,-10.85,-77.35:99
-chr1	1007060	rs3766192	C	T	263.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=59.03;MQ0=0;OQ=740.51;QD=17.22;SB=-335.87	GT:AD:DP:GL:GQ	0/1:19,24:42:-90.01,-12.67,-54.97:99
-chr1	1007204	rs1133647	G	T	220.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=58.63;MQ0=0;OQ=352.30;QD=10.36;SB=-144.83	GT:AD:DP:GL:GQ	0/1:20,14:34:-48.76,-10.25,-68.42:99
-chr1	1008007	rs9442395	T	C	79.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=3.17;MQ=58.20;MQ0=0;OQ=515.12;QD=11.71;SB=-260.59	GT:AD:DP:GL:GQ	0/1:23,21:43:-67.76,-12.96,-87.04:99
-chr1	1008425	rs9442371	C	T	263.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=58.95;MQ0=0;OQ=629.69;QD=14.31;SB=-217.52	GT:AD:DP:GL:GQ	0/1:24,20:39:-78.01,-11.76,-59.01:99
-chr1	1008567	rs9442372	A	G	252.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.72;MQ=58.97;MQ0=0;OQ=538.45;QD=11.97;SB=-254.34	GT:AD:DP:GL:GQ	0/1:20,24:42:-69.79,-12.66,-79.04:99
-chr1	1009038	rs2298215	C	G	217.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=60.00;MQ0=0;OQ=687.91;QD=14.95;SB=-237.07	GT:AD:DP:GL:GQ	0/1:26,20:46:-85.94,-13.87,-107.64:99
-chr1	1009043	rs9442396	T	C	432.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=537.22;QD=11.94;SB=-291.59	GT:AD:DP:GL:GQ	0/1:24,21:42:-69.65,-12.65,-93.39:99
-chr1	1010269	rs9442397	T	C	3.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.96;MQ=59.38;MQ0=0;OQ=202.19;QD=5.46;SB=-53.82	GT:AD:DP:GL:GQ	0/1:25,12:35:-34.05,-10.54,-100.39:99
-chr1	1011278	rs3737728	A	G	36.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=3.58;MQ=58.01;MQ0=0;OQ=401.40;QD=7.72;SB=-209.34	GT:AD:DP:GL:GQ	0/1:32,20:49:-58.20,-14.77,-121.11:99
-chr1	1011558	rs9442398	A	G	416.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.92;MQ0=0;OQ=544.78;QD=12.67;SB=-280.28	GT:AD:DP:GL:GQ	0/1:17,25:38:-69.23,-11.47,-56.30:99
-chr1	1011900	rs6701114	C	T	240.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.59;MQ=59.30;MQ0=0;OQ=587.87;QD=17.81;SB=-314.84	GT:AD:DP:GL:GQ	0/1:13,20:30:-71.11,-9.04,-40.79:99
-chr1	1013307	rs9442399	C	G	25.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=338.37;QD=37.60;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,9:9:-37.42,-2.71,-0.00:27.09
-chr1	1015133	.	C	T	6.55	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=4.91;MQ=59.48;MQ0=0;OQ=504.60;QD=11.47;SB=-145.62	GT:AD:DP:GL:GQ	0/1:26,18:38:-65.20,-11.46,-67.24:99
-chr1	1015164	rs9442400	T	C	212.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.61;MQ0=0;OQ=1416.80;QD=29.52;SB=-594.18	GT:AD:DP:GL:GQ	1/1:0,48:47:-145.32,-14.18,-0.06:99
-chr1	1016570	rs4074137	C	A	81.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=60.00;MQ0=0;OQ=196.23;QD=6.33;SB=-112.43	GT:AD:DP:GL:GQ	0/1:22,9:30:-31.95,-9.04,-69.97:99
-chr1	1016664	rs4562563	T	A	69.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=58.99;MQ0=0;OQ=428.33;QD=18.62;SB=-222.84	GT:AD:DP:GL:GQ	0/1:8,15:23:-53.05,-6.93,-28.44:99
-chr1	1021403	rs9651273	A	G	292.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=648.57;QD=9.40;SB=-308.20	GT:AD:DP:GL:GQ	0/1:44,25:69:-88.92,-20.78,-180.93:99
-chr1	1022047	rs9651272	A	G	123.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=59.58;MQ0=0;OQ=389.06;QD=8.84;SB=-195.60	GT:AD:DP:GL:GQ	0/1:25,19:42:-54.85,-12.66,-100.05:99
-chr1	1023862	rs4970353	C	T	10.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=5;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=971.03;QD=16.18;SB=-472.48	GT:AD:DP:GL:GQ	0/1:30,30:59:-118.16,-17.77,-101.63:99
-chr1	1025668	rs12759295	G	A	84.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=59.60;MQ0=0;OQ=2089.51;QD=36.03;SB=-522.67	GT:AD:DP:GL:GQ	1/1:0,58:54:-212.56,-16.27,-0.02:99
-chr1	1026680	rs61766341	T	C	205.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=959.29;QD=13.51;SB=-415.84	GT:AD:DP:GL:GQ	0/1:32,39:68:-119.71,-20.50,-125.74:99
-chr1	1026910	rs12134754	C	T	210.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=59.33;MQ0=0;OQ=1080.76;QD=17.43;SB=-366.87	GT:AD:DP:GL:GQ	0/1:30,32:60:-129.44,-18.08,-89.78:99
-chr1	1027893	.	T	A	15.04	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=20;HaplotypeScore=5.87;MQ=44.25;MQ0=4;QD=0.40;SB=32.13	GT:AD:DP:GL:GQ	0/1:33,5:23:-11.70,-6.93,-76.52:47.73
-chr1	1037844	rs11584392	G	A	163.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.18;MQ=59.82;MQ0=0;OQ=608.74;QD=14.16;SB=-241.74	GT:AD:DP:GL:GQ	0/1:22,21:40:-76.22,-12.06,-65.82:99
-chr1	1043248	rs4970408	C	T	441.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.36;MQ0=0;OQ=945.52;QD=17.51;SB=-425.94	GT:AD:DP:GL:GQ	0/1:25,29:54:-114.11,-16.27,-86.23:99
-chr1	1050037	rs7548798	C	T	114.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=3.36;MQ=58.61;MQ0=0;OQ=733.89;QD=15.61;SB=-330.30	GT:AD:DP:GL:GQ	0/1:24,23:47:-90.84,-14.17,-83.86:99
-chr1	1050038	rs7556082	T	C	10.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=4;HaplotypeScore=2.36;MQ=58.61;MQ0=0;OQ=528.95;QD=11.25;SB=-283.60	GT:AD:DP:GL:GQ	0/1:24,23:46:-70.05,-13.87,-95.38:99
-chr1	1050218	rs12567855	G	C	18.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=1.10;MQ=59.48;MQ0=0;OQ=549.12;QD=15.25;SB=-150.55	GT:AD:DP:GL:GQ	0/1:19,17:33:-68.15,-9.95,-68.62:99
-chr1	1050923	.	C	G	38.31	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=2;HaplotypeScore=7.12;MQ=59.57;MQ0=0;QD=0.71;SB=62.24	GT:AD:DP:GL:GQ	0/1:40,14:36:-17.98,-10.86,-134.66:71.15
-chr1	1051029	rs11807848	T	C	153.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.10;MQ=60.00;MQ0=0;OQ=328.64;QD=9.39;SB=-171.94	GT:AD:DP:GL:GQ	0/1:21,14:34:-46.39,-10.24,-82.90:99
-chr1	1051657	rs34530354	A	G	139.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.25;MQ0=0;OQ=341.50;QD=11.02;SB=-128.73	GT:AD:DP:GL:GQ	0/1:17,14:30:-46.47,-9.04,-63.98:99
-chr1	1051711	rs35207507	A	G	157.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=57.36;MQ0=0;OQ=232.59;QD=9.30;SB=-75.78	GT:AD:DP:GL:GQ	0/1:12,13:22:-33.17,-6.63,-47.34:99
-chr1	1051888	rs9329411	A	G	8.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=3;HaplotypeScore=0.32;MQ=58.95;MQ0=0;OQ=307.14;QD=13.96;SB=-152.31	GT:AD:DP:GL:GQ	0/1:10,12:20:-40.02,-6.03,-35.33:99
-chr1	1052501	rs9442373	C	A	218.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.03;MQ0=0;OQ=1229.67;QD=18.35;SB=-293.35	GT:AD:DP:GL:GQ	0/1:29,38:65:-145.84,-19.58,-78.11:99
-chr1	1052907	rs7545801	A	G	1.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=2.49;MQ=60.00;MQ0=0;OQ=935.67;QD=29.24;SB=-247.57	GT:AD:DP:GL:GQ	1/1:0,32:30:-97.17,-9.04,-0.02:90.21
-chr1	1053104	rs4970413	G	T	111.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.50;MQ=59.42;MQ0=0;OQ=637.82;QD=15.95;SB=-209.62	GT:AD:DP:GL:GQ	0/1:16,24:36:-77.92,-10.85,-38.08:99
-chr1	1053355	rs55945496	G	A	154.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=58.97;MQ0=0;OQ=692.26;QD=15.38;SB=-240.56	GT:AD:DP:GL:GQ	0/1:24,21:40:-84.57,-12.06,-60.15:99
-chr1	1054398	rs6682475	G	C	62.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=3.35;MQ=57.20;MQ0=0;OQ=522.88;QD=16.34;SB=-284.57	GT:AD:DP:GL:GQ	0/1:16,16:32:-65.22,-9.65,-67.94:99
-chr1	1054533	rs7547403	C	G	0.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=4;HaplotypeScore=0.79;MQ=59.42;MQ0=0;OQ=1637.77;QD=40.94;SB=-672.45	GT:AD:DP:GL:GQ	1/1:0,40:39:-167.38,-11.75,-0.02:99
-chr1	1054665	rs2298216	T	C	152.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=59.60;MQ0=0;OQ=1938.74;QD=34.01;SB=-772.11	GT:AD:DP:GL:GQ	1/1:0,57:57:-197.48,-17.17,-0.02:99
-chr1	1055159	rs4072537	T	C	138.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=51.50;MQ0=0;OQ=1817.15;QD=30.80;SB=-665.83	GT:AD:DP:GL:GQ	1/1:0,59:56:-185.34,-16.89,-0.04:99
-chr1	1055460	rs9442357	C	A	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.04;HRun=20;HaplotypeScore=17.31;MQ=48.11;MQ0=2;OQ=1123.16;QD=23.90;SB=-311.46	GT:AD:DP:GL:GQ	1/1:9,36:37:-122.62,-11.15,-6.72:44.32
-chr1	1056122	rs4072496	G	C	273.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=828.08;QD=31.85;SB=-146.57	GT:AD:DP:GL:GQ	1/1:0,26:22:-86.41,-6.64,-0.02:66.21
-chr1	1056145	rs10907181	A	G	65.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=60.00;MQ0=0;OQ=849.61;QD=28.32;SB=-350.43	GT:AD:DP:GL:GQ	1/1:0,30:29:-88.58,-8.75,-0.04:87.15
-chr1	1056266	rs10907182	T	C	152.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.47;MQ0=0;OQ=1343.61;QD=29.86;SB=-493.15	GT:AD:DP:GL:GQ	1/1:0,45:43:-137.99,-12.97,-0.04:99
-chr1	1056679	.	A	G	17.68	PASS	AC=2;AF=1.00;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.92;MQ0=0;OQ=622.64;QD=23.06;SB=-77.91	GT:AD:DP:GL:GQ	1/1:0,27:19:-65.86,-5.72,-0.01:57.16
-chr1	1056682	rs7513297	A	G	4.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=33.92;MQ0=0;OQ=613.60;QD=22.73;SB=-73.89	GT:AD:DP:GL:GQ	1/1:0,27:19:-64.96,-5.73,-0.01:57.15
-chr1	1056691	rs7553878	C	G	182.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=38.04;MQ0=0;OQ=986.57;QD=30.83;SB=-182.68	GT:AD:DP:GL:GQ	1/1:0,32:25:-102.26,-7.54,-0.01:75.24
-chr1	1056809	rs7513404	A	G	1483.16	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=11.12;MQ=36.69;MQ0=3;QD=26.02;SB=-571.97	GT:AD:DP:GL:GQ	1/1:2,55:47:-151.94,-14.18,-0.04:99
-chr1	1056815	rs7513405	A	G	1422.20	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=12.03;MQ=35.94;MQ0=3;QD=26.83;SB=-591.02	GT:AD:DP:GL:GQ	1/1:4,49:44:-145.84,-13.27,-0.03:99
-chr1	1056816	rs7516160	T	C	1466.09	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=12.03;MQ=36.53;MQ0=3;QD=27.15;SB=-727.28	GT:AD:DP:GL:GQ	1/1:3,50:47:-150.24,-14.18,-0.04:99
-chr1	1057725	rs9442374	T	G	13.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=58.50;MQ0=0;OQ=951.55;QD=30.70;SB=-471.37	GT:AD:DP:GL:GQ	1/1:0,31:29:-98.75,-8.74,-0.01:87.23
-chr1	1057728	rs9442358	A	C	4.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=3;HaplotypeScore=0.48;MQ=58.50;MQ0=0;OQ=931.22;QD=30.04;SB=-418.04	GT:AD:DP:GL:GQ	1/1:1,30:28:-96.72,-8.44,-0.02:84.22
-chr1	1059288	rs9442375	C	A	11.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.68;MQ=37.62;MQ0=0;OQ=1307.51;QD=33.53;SB=-359.86	GT:AD:DP:GL:GQ	1/1:0,39:37:-134.35,-11.15,-0.01:99
-chr1	1059306	rs9442376	G	A	317.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=30.41;MQ0=0;OQ=1189.43;QD=32.15;SB=-404.66	GT:AD:DP:GL:GQ	1/1:0,37:31:-122.54,-9.34,-0.01:93.30
-chr1	1059314	rs9442377	G	A	1.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=4.82;MQ=29.14;MQ0=0;OQ=1298.78;QD=30.92;SB=-496.01	GT:AD:DP:GL:GQ	1/1:0,42:35:-133.48,-10.55,-0.02:99
-chr1	1059991	rs9442378	T	G	44.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=59.34;MQ0=0;OQ=1111.12;QD=31.75;SB=-500.92	GT:AD:DP:GL:GQ	1/1:0,35:33:-114.71,-9.94,-0.02:99
-chr1	1060304	rs9442379	C	T	128.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=1793.65;QD=37.37;SB=-715.98	GT:AD:DP:GL:GQ	1/1:0,48:46:-182.96,-13.86,-0.01:99
-chr1	1060981	rs10907183	G	C	289	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.17;MQ=58.88;MQ0=0;OQ=1986.90;QD=34.26;SB=-998.16	GT:AD:DP:GL:GQ	1/1:0,58:51:-202.32,-15.40,-0.05:99
-chr1	1061055	rs6604971	T	C	165.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=59.35;MQ0=0;OQ=1959.28;QD=30.61;SB=-872.00	GT:AD:DP:GL:GQ	1/1:0,64:62:-199.57,-18.70,-0.06:99
-chr1	1062361	rs9442360	G	C	41.74	LowQual	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.77;MQ0=0;QD=13.91;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,3:2:-7.58,-0.60,-0.00:6.02
-chr1	1063812	.	C	A	39.60	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=20;HaplotypeScore=10.99;MQ=49.89;MQ0=1;QD=0.94;SB=53.19	GT:AD:DP:GL:GQ	0/1:34,7:30:-16.28,-9.04,-89.71:72.44
-chr1	1064433	.	T	C	21.13	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=43.11;MQ0=1;QD=1.11;SB=5.04	GT:AD:DP:GL:GQ	0/1:14,5:14:-9.62,-4.23,-37.37:53.93
-chr1	1064508	.	A	G	48.32	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=5;HaplotypeScore=5.11;MQ=25.52;MQ0=20;QD=0.93;SB=-10.00	GT:AD:DP:GL:GQ	0/1:42,6:27:-16.25,-8.14,-83.13:81.15
-chr1	1064534	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=3;HaplotypeScore=5.91;MQ=22.24;MQ0=19;OQ=77.81;QD=1.62;SB=-10.00	GT:AD:DP:GL:GQ	0/1:26,22:23:-17.99,-6.93,-63.10:99
-chr1	1064544	.	G	A	18.70	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=9.26;MQ=23.84;MQ0=13;QD=0.45;SB=-10.00	GT:AD:DP:GL:GQ	0/1:39,3:23:-12.08,-6.93,-67.67:51.47
-chr1	1064666	.	G	A	28.24	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=4.04;MQ=17.49;MQ0=7;QD=1.34;SB=-10.00	GT:AD:DP:GL:GQ	0/1:19,2:4:-7.31,-1.21,-6.24:50.32
-chr1	1064676	.	G	A	32.25	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=1;HaplotypeScore=3.94;MQ=15.31;MQ0=8;QD=1.61;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,4:3:-7.41,-0.90,-3.57:26.65
-chr1	1064678	.	A	G	13.68	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=15.31;MQ0=8;QD=0.68;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,5:3:-5.54,-0.90,-4.06:31.54
-chr1	1065083	.	T	G	0.75	PASS	AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=3;HaplotypeScore=1.47;MQ=13.28;MQ0=6;OQ=72.14;QD=8.02;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,7:3:-10.70,-0.90,-0.00:9.03
-chr1	1065545	.	A	T	15.58	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=6.82;MQ=15.84;MQ0=10;QD=0.78;SB=-20.32	GT:AD:DP:GL:GQ	0/1:16,4:8:-7.24,-2.41,-23.49:48.29
-chr1	1065754	.	T	G	10.50	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=3;HaplotypeScore=0.98;MQ=26.23;MQ0=5;QD=0.50;SB=-7.00	GT:AD:DP:GL:GQ	0/1:10,11:9:-7.00,-2.71,-25.01:42.93
-chr1	1065788	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=4;HaplotypeScore=1.91;MQ=35.15;MQ0=3;OQ=426.85;QD=16.42;SB=-65.33	GT:AD:DP:GL:GQ	0/1:10,16:20:-52.00,-6.03,-21.27:99
-chr1	1065876	rs34294086	G	T	14.09	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=3.05;MQ=16.68;MQ0=19;QD=0.25;SB=-0.98	GT:AD:DP:GL:GQ	0/1:47,10:18:-10.10,-5.43,-46.58:46.75
-chr1	1065896	rs34976191	A	G	3.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=5.11;MQ=25.24;MQ0=16;OQ=221.06;QD=5.02;SB=-47.30	GT:AD:DP:GL:GQ	0/1:32,12:17:-30.51,-5.13,-29.81:99
-chr1	1065898	rs35853231	G	A	14.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=25.42;MQ0=15;OQ=228.24;QD=5.43;SB=-22.49	GT:AD:DP:GL:GQ	0/1:33,9:15:-30.63,-4.52,-21.87:99
-chr1	1066927	rs4970357	C	A	263.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=704.25;QD=32.01;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,22:21:-74.02,-6.32,-0.01:63.19
-chr1	1067825	rs55750860	C	T	23.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.51;MQ=58.95;MQ0=0;OQ=1494.41;QD=37.36;SB=-613.01	GT:AD:DP:GL:GQ	1/1:0,40:39:-153.04,-11.75,-0.01:99
-chr1	1070149	rs1539638	G	A	498.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1278.23;QD=37.59;SB=-657.67	GT:AD:DP:GL:GQ	1/1:0,34:33:-131.42,-9.94,-0.01:99
-chr1	1070766	.	C	G	0.10	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.74;MQ=47.59;MQ0=0;OQ=113.71;QD=2.58;SB=-2.32	GT:AD:DP:GL:GQ	0/1:34,9:39:-26.42,-11.76,-133.80:99
-chr1	1070768	.	C	T	0.13	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=46.93;MQ0=0;OQ=115.95;QD=2.64;SB=-32.19	GT:AD:DP:GL:GQ	0/1:34,10:38:-26.33,-11.45,-104.66:99
-chr1	1070788	rs1539637	G	C	8.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=3;HaplotypeScore=2.86;MQ=44.98;MQ0=0;OQ=574.54;QD=14.73;SB=-154.58	GT:AD:DP:GL:GQ	0/1:22,17:37:-71.91,-11.17,-77.14:99
-chr1	1070790	rs4512588	T	C	118.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.33;MQ=44.52;MQ0=0;OQ=439.51;QD=11.57;SB=-120.73	GT:AD:DP:GL:GQ	0/1:20,18:36:-58.08,-10.85,-73.14:99
-chr1	1070804	.	T	C	317.73	Indel	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=1;HaplotypeScore=1.72;MQ=43.50;MQ0=0;QD=8.83;SB=-125.65	GT:AD:DP:GL:GQ	0/1:20,16:34:-45.31,-10.25,-78.50:99
-chr1	1070810	.	T	C	59.59	Indel	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=2;HaplotypeScore=0.92;MQ=42.56;MQ0=0;QD=1.92;SB=-21.88	GT:AD:DP:GL:GQ	0/1:21,10:26:-17.08,-7.83,-82.36:92.43
-chr1	1070825	.	C	T	12.15	LowQual	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=46.99;MQ0=0;QD=0.45;SB=-5.49	GT:AD:DP:GL:GQ	0/1:24,3:26:-12.31,-7.84,-75.55:44.71
-chr1	1070828	.	C	T	17.92	LowQual	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=46.99;MQ0=0;QD=0.66;SB=-11.45	GT:AD:DP:GL:GQ	0/1:24,3:24:-12.30,-7.23,-73.32:50.69
-chr1	1074807	.	T	G	14.10	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=4;HaplotypeScore=1.72;MQ=58.59;MQ0=0;QD=0.43;SB=59.21	GT:AD:DP:GL:GQ	0/1:24,8:27:-12.81,-8.13,-82.30:46.77
-chr1	1075432	.	C	T	38.87	PASS	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.24;MQ=57.97;MQ0=0;OQ=818.81;QD=17.80;SB=-345.86	GT:AD:DP:GL:GQ	0/1:20,26:46:-99.04,-13.88,-63.69:99
-chr1	1077546	rs9442380	T	C	202.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.63;MQ0=0;OQ=2295.26;QD=29.81;SB=-1162.13	GT:AD:DP:GL:GQ	1/1:0,76:73:-233.18,-22.02,-0.07:99
-chr1	1079125	rs4970358	A	G	12.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=5.70;MQ=59.35;MQ0=0;OQ=2374.58;QD=33.44;SB=-995.95	GT:AD:DP:GL:GQ	1/1:0,69:68:-244.00,-23.26,-2.96:99
-chr1	1079873	rs9442361	C	A	5.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=3;HaplotypeScore=1.89;MQ=53.07;MQ0=0;OQ=1204.88;QD=33.47;SB=-532.76	GT:AD:DP:GL:GQ	1/1:0,36:34:-124.08,-10.24,-0.01:99
-chr1	1080440	rs6604972	A	G	531.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.88;MQ0=0;OQ=1807.70;QD=30.64;SB=-735.76	GT:AD:DP:GL:GQ	1/1:0,59:56:-184.40,-16.89,-0.04:99
-chr1	1082462	rs56863140	G	C	99.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.04;MQ0=0;OQ=146.93;QD=24.49;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,6:5:-18.26,-1.52,-0.01:15.05
-chr1	1084348	rs4970360	C	T	64.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=1.36;MQ=58.41;MQ0=0;OQ=1613.83;QD=36.68;SB=-777.04	GT:AD:DP:GL:GQ	1/1:0,44:42:-164.99,-12.66,-0.02:99
-chr1	1084535	rs4970361	A	C	88.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=58.78;MQ0=1;OQ=1424.16;QD=32.37;SB=-688.05	GT:AD:DP:GL:GQ	1/1:1,43:41:-146.01,-12.35,-0.01:99
-chr1	1084601	rs4970362	A	G	229.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.71;MQ=59.53;MQ0=0;OQ=1464.98;QD=29.90;SB=-668.84	GT:AD:DP:GL:GQ	1/1:0,49:47:-150.13,-14.18,-0.04:99
-chr1	1084842	rs7538773	G	A	9.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=58.13;MQ0=0;OQ=1279.59;QD=36.56;SB=-199.76	GT:AD:DP:GL:GQ	1/1:0,33:33:-131.55,-9.94,-0.01:99
-chr1	1085246	rs6604973	G	A	85.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.20;MQ=59.42;MQ0=0;OQ=1511.71;QD=37.79;SB=-646.86	GT:AD:DP:GL:GQ	1/1:0,40:38:-154.76,-11.45,-0.01:99
-chr1	1085482	rs4970419	C	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=7;HaplotypeScore=2.24;MQ=59.45;MQ0=0;OQ=1670.84;QD=39.78;SB=-828.31	GT:AD:DP:GL:GQ	1/1:0,42:40:-170.69,-12.06,-0.02:99
-chr1	1085874	rs9442381	C	G	314.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.11;MQ0=0;OQ=1195.39;QD=38.56;SB=-412.65	GT:AD:DP:GL:GQ	1/1:0,31:28:-123.13,-8.44,-0.01:84.28
-chr1	1086061	rs9442382	C	T	139.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=990.01;QD=38.08;SB=-164.21	GT:AD:DP:GL:GQ	1/1:0,26:26:-102.60,-7.84,-0.01:78.25
-chr1	1086771	rs1539636	T	C	148.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=60.00;MQ0=0;OQ=1262.30;QD=33.22;SB=-642.89	GT:AD:DP:GL:GQ	1/1:0,38:37:-129.83,-11.15,-0.02:99
-chr1	1086955	rs1539635	G	A	48.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.31;MQ=56.37;MQ0=0;OQ=1687.66;QD=35.91;SB=-612.00	GT:AD:DP:GL:GQ	1/1:0,47:43:-172.36,-12.95,-0.01:99
-chr1	1086963	rs1539634	C	T	83.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.95;MQ0=0;OQ=1761.33;QD=36.69;SB=-642.86	GT:AD:DP:GL:GQ	1/1:0,48:45:-179.73,-13.56,-0.02:99
-chr1	1087150	rs9442384	T	C	36.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.26;MQ=59.81;MQ0=0;OQ=1429.90;QD=29.79;SB=-636.25	GT:AD:DP:GL:GQ	1/1:0,48:46:-146.63,-13.88,-0.05:99
-chr1	1087198	rs9442385	T	G	89.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=57.84;MQ0=0;OQ=1240.37;QD=26.39;SB=-556.87	GT:AD:DP:GL:GQ	1/1:0,47:40:-127.66,-12.06,-0.04:99
-chr1	1087800	rs1891907	A	G	2.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=57.36;MQ0=0;OQ=810.89;QD=32.44;SB=-193.80	GT:AD:DP:GL:GQ	1/1:0,25:24:-84.68,-7.23,-0.01:72.21
-chr1	1088284	rs12135382	C	T	198.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=312.05;QD=28.37;SB=-50.56	GT:AD:DP:GL:GQ	1/1:0,11:9:-34.79,-2.71,-0.00:27.09
-chr1	1088577	rs4379629	C	G	8.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=217.53;QD=24.17;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,9:7:-25.35,-2.12,-0.02:21.06
-chr1	1089205	rs9660710	A	C	62.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.52;MQ=60.00;MQ0=0;OQ=1253.07;QD=26.66;SB=-477.88	GT:AD:DP:GL:GQ	1/1:0,47:40:-128.93,-12.06,-0.03:99
-chr1	1090080	rs1891905	C	T	107.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=58.89;MQ0=0;OQ=1593.75;QD=37.95;SB=-678.31	GT:AD:DP:GL:GQ	1/1:0,42:41:-162.97,-12.35,-0.01:99
-chr1	1090182	rs1891904	C	A	413.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=739.19;QD=30.80;SB=-375.45	GT:AD:DP:GL:GQ	1/1:0,24:22:-77.51,-6.63,-0.01:66.17
-chr1	1090866	rs7549819	C	T	73.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=59.25;MQ0=0;OQ=998.72;QD=32.22;SB=-450.59	GT:AD:DP:GL:GQ	1/1:1,30:27:-103.47,-8.14,-0.02:81.25
-chr1	1091932	rs9442386	A	G	1.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=172.84;QD=21.61;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,8:7:-20.87,-2.12,-0.01:21.04
-chr1	1093405	rs7518873	T	C	57.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.77;MQ0=0;OQ=646.68;QD=30.79;SB=-268.71	GT:AD:DP:GL:GQ	1/1:0,21:20:-68.26,-6.03,-0.01:60.16
-chr1	1093821	rs7521584	T	G	116.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.95;MQ0=0;OQ=1316.49;QD=29.92;SB=-587.88	GT:AD:DP:GL:GQ	1/1:0,44:43:-135.27,-12.96,-0.04:99
-chr1	1095101	rs9442362	T	C	65.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.90;MQ=60.00;MQ0=0;OQ=375.39;QD=7.99;SB=-207.86	GT:AD:DP:GL:GQ	0/1:27,20:44:-54.09,-13.27,-100.76:99
-chr1	1095924	rs6656236	G	A	130.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=57.77;MQ0=0;OQ=609.61;QD=16.04;SB=-273.30	GT:AD:DP:GL:GQ	0/1:18,20:34:-74.49,-10.25,-50.31:99
-chr1	1096647	rs4442317	T	C	203.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=59.13;MQ0=0;OQ=506.89;QD=10.56;SB=-244.47	GT:AD:DP:GL:GQ	0/1:29,19:48:-68.44,-14.47,-111.87:99
-chr1	1114401	rs11577350	G	A	483.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=1009.34;QD=13.28;SB=-463.05	GT:AD:DP:GL:GQ	0/1:45,31:75:-126.83,-22.61,-139.35:99
-chr1	1114613	rs6702156	T	C	467.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.71;MQ0=0;OQ=978.73;QD=12.23;SB=-374.99	GT:AD:DP:GL:GQ	0/1:42,38:78:-124.66,-23.50,-162.90:99
-chr1	1127805	.	C	T	17.93	LowQual	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.76;MQ=47.96;MQ0=1;QD=0.48;SB=-4.44	GT:AD:DP:GL:GQ	0/1:29,6:21:-11.40,-6.33,-63.23:50.69
-chr1	1133298	rs55945303	G	A	59.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.92;MQ0=0;OQ=925.55;QD=21.52;SB=-252.58	GT:AD:DP:GL:GQ	0/1:14,29:40:-107.89,-12.05,-42.24:99
-chr1	1139524	rs35878953	C	T	131.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.33;MQ=58.24;MQ0=0;OQ=799.98;QD=18.60;SB=-423.99	GT:AD:DP:GL:GQ	0/1:17,25:37:-94.44,-11.16,-36.66:99
-chr1	1148494	rs6603781	A	G	136.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.05;MQ0=0;OQ=1330.48;QD=27.15;SB=-433.29	GT:AD:DP:GL:GQ	1/1:0,49:42:-136.66,-12.66,-0.03:99
-chr1	1149380	rs6702268	T	C	227.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.80;MQ0=0;OQ=961.17;QD=27.46;SB=-122.75	GT:AD:DP:GL:GQ	1/1:0,35:31:-99.73,-9.35,-0.03:93.18
-chr1	1152189	rs4970423	A	G	15.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=59.39;MQ0=0;OQ=1088.52;QD=28.65;SB=-378.40	GT:AD:DP:GL:GQ	1/1:0,38:34:-112.46,-10.25,-0.02:99
-chr1	1161280	rs6603782	C	T	102.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=59.00;MQ0=0;OQ=708.75;QD=16.88;SB=-201.20	GT:AD:DP:GL:GQ	0/1:20,22:40:-86.21,-12.05,-64.42:99
-chr1	1162770	rs715643	C	T	309.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.45;MQ=57.65;MQ0=0;OQ=561.34;QD=14.77;SB=-301.32	GT:AD:DP:GL:GQ	0/1:18,19:36:-70.27,-10.85,-55.47:99
-chr1	1171665	.	C	T	4.62	PASS	AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.39;MQ0=0;OQ=105.76;QD=11.75;SB=-6.99	GT:AD:DP:GL:GQ	0/1:5,4:9:-16.57,-2.71,-16.65:99
-chr1	1178813	.	G	C	27.28	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=1;HaplotypeScore=10.95;MQ=55.60;MQ0=0;QD=0.43;SB=74.28	GT:AD:DP:GL:GQ	0/1:46,17:41:-18.38,-12.37,-155.87:60.10
-chr1	1182131	.	G	A	44.09	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=52;Dels=0.04;HRun=20;HaplotypeScore=11.11;MQ=50.33;MQ0=0;QD=0.85;SB=65.22	GT:AD:DP:GL:GQ	0/1:38,12:42:-20.05,-12.36,-125.30:76.92
-chr1	1183574	.	T	C	30.78	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=5;HaplotypeScore=13.00;MQ=56.93;MQ0=0;QD=0.83;SB=23.10	GT:AD:DP:GL:GQ	0/1:22,15:21:-12.69,-6.33,-67.62:63.61
-chr1	1186726	rs6659787	T	C	444.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1920.21;QD=33.11;SB=-425.81	GT:AD:DP:GL:GQ	1/1:0,58:55:-195.63,-16.57,-0.02:99
-chr1	1194535	.	A	G	16.67	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=6.08;MQ=52.52;MQ0=1;QD=0.32;SB=29.11	GT:AD:DP:GL:GQ	0/1:42,10:39:-16.70,-11.76,-128.34:49.41
-chr1	1204684	rs34258594	C	T	26.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=41.53;MQ0=1;OQ=534.60;QD=15.27;SB=-99.92	GT:AD:DP:GL:GQ	0/1:16,19:32:-66.39,-9.65,-50.26:99
-chr1	1206810	.	C	A	15.67	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=59.17;MQ0=0;QD=0.56;SB=17.05	GT:AD:DP:GL:GQ	0/1:19,7:21:-11.17,-6.33,-52.97:48.38
-chr1	1212553	.	C	T	5.74	PASS	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=5.06;MQ=57.97;MQ0=0;OQ=298.13;QD=12.96;SB=-173.70	GT:AD:DP:GL:GQ	0/1:12,11:19:-38.83,-5.73,-27.23:99
-chr1	1213523	.	A	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=15.57;MQ=33.50;MQ0=4;OQ=59.03;QD=3.28;SB=2.04	GT:AD:DP:GL:GQ	0/1:9,9:9:-11.90,-2.71,-23.47:91.86
-chr1	1213617	.	C	T	7.11	PASS	AC=2;AF=1.00;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=3.14;MQ=18.72;MQ0=10;OQ=134.34;QD=6.72;SB=-10.00	GT:AD:DP:GL:GQ	1/1:5,15:4:-16.97,-1.20,-0.00:12.04
-chr1	1213622	.	T	C	11.33	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=2;HaplotypeScore=3.30;MQ=19.74;MQ0=10;QD=0.49;SB=-3.98	GT:AD:DP:GL:GQ	0/1:20,3:7:-6.49,-2.11,-18.92:43.83
-chr1	1213635	.	C	T	23.33	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=18.06;MQ0=13;QD=0.75;SB=-33.62	GT:AD:DP:GL:GQ	0/1:24,7:9:-8.33,-2.71,-24.32:56.15
-chr1	1213653	.	C	T	47.94	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.74;MQ=17.89;MQ0=21;QD=1.00;SB=-23.48	GT:AD:DP:GL:GQ	0/1:37,11:13:-11.99,-3.92,-35.04:80.78
-chr1	1213671	.	C	T	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.88;MQ=22.77;MQ0=22;OQ=90.19;QD=1.80;SB=-17.46	GT:AD:DP:GL:GQ	0/1:28,22:20:-18.33,-6.03,-51.67:99
-chr1	1213694	.	T	C	39.97	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=2;HaplotypeScore=8.39;MQ=23.73;MQ0=21;QD=0.73;SB=-15.88	GT:AD:DP:GL:GQ	0/1:51,4:21:-13.61,-6.33,-64.53:72.80
-chr1	1213750	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=7.03;MQ=25.74;MQ0=11;OQ=59.44;QD=1.56;SB=-49.23	GT:AD:DP:GL:GQ	0/1:22,16:17:-14.35,-5.12,-45.82:92.28
-chr1	1213763	.	C	T	47.85	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=26.61;MQ0=8;QD=1.65;SB=-29.61	GT:AD:DP:GL:GQ	0/1:21,8:13:-11.99,-3.92,-33.55:80.68
-chr1	1213781	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=1;HaplotypeScore=3.20;MQ=28.82;MQ0=7;OQ=70.59;QD=2.82;SB=-20.63	GT:AD:DP:GL:GQ	0/1:21,4:13:-14.26,-3.92,-34.86:99
-chr1	1213884	.	C	T	18.32	PASS	AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=20.52;MQ0=9;OQ=123.88;QD=9.53;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,11:4:-15.92,-1.20,-0.00:12.04
-chr1	1213994	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=2;HaplotypeScore=2.99;MQ=9.42;MQ0=22;OQ=67.77;QD=1.94;SB=-42.68	GT:AD:DP:GL:GQ	0/1:31,4:4:-11.26,-1.21,-2.97:17.61
-chr1	1214386	.	C	T	18.53	PASS	AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=12.80;MQ0=7;OQ=79.89;QD=6.15;SB=-52.67	GT:AD:DP:GL:GQ	1/1:3,10:3:-11.48,-0.90,-0.00:9.03
-chr1	1214538	.	C	T	13.99	PASS	AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.76;MQ0=3;OQ=222.41;QD=22.24;SB=-119.99	GT:AD:DP:GL:GQ	1/1:1,9:7:-25.82,-2.11,-0.00:21.06
-chr1	1214556	.	C	T	78.88	PASS	AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.62;MQ0=3;OQ=125.22;QD=13.91;SB=-42.55	GT:AD:DP:GL:GQ	1/1:2,7:4:-16.06,-1.21,-0.00:12.04
-chr1	1214569	.	C	T	4.09	PASS	AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=21.21;MQ0=3;OQ=121.10;QD=17.30;SB=-81.10	GT:AD:DP:GL:GQ	1/1:3,4:4:-15.65,-1.21,-0.00:12.04
-chr1	1214849	.	T	C	10.83	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=11.01;MQ0=15;QD=0.39;SB=-10.00	GT:AD:DP:GL:GQ	0/1:20,8:6:-6.14,-1.81,-16.12:43.30
-chr1	1214919	.	A	T	0.53	PASS	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=4.77;MQ=20.32;MQ0=10;OQ=98.85;QD=4.94;SB=-69.74	GT:AD:DP:GL:GQ	0/1:10,9:7:-15.28,-2.11,-10.80:86.87
-chr1	1215102	.	A	T	1.26	PASS	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=2.90;MQ=20.59;MQ0=9;OQ=98.25;QD=4.91;SB=-47.98	GT:AD:DP:GL:GQ	0/1:4,16:7:-15.22,-2.11,-12.20:99
-chr1	1215147	.	T	C	24.78	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=2;HaplotypeScore=5.19;MQ=18.98;MQ0=32;QD=0.28;SB=-36.82	GT:AD:DP:GL:GQ	0/1:83,7:38:-17.21,-11.45,-127.57:57.61
-chr1	1215165	.	C	T	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=3.30;MQ=20.48;MQ0=21;OQ=101.26;QD=1.35;SB=26.10	GT:AD:DP:GL:GQ	0/1:48,27:30:-22.45,-9.04,-79.18:99
-chr1	1215324	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=4.60;MQ=26.05;MQ0=19;OQ=186.49;QD=2.49;SB=8.19	GT:AD:DP:GL:GQ	0/1:60,15:45:-35.50,-13.57,-130.76:99
-chr1	1227467	rs2296475	T	C	67.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=59.44;MQ0=0;OQ=1380.81;QD=33.68;SB=-616.59	GT:AD:DP:GL:GQ	1/1:0,40:39:-141.68,-11.75,-0.01:99
-chr1	1227692	rs11586188	G	A	13.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=2.73;MQ=60.00;MQ0=0;OQ=456.88;QD=14.74;SB=-204.92	GT:AD:DP:GL:GQ	0/1:15,16:30:-58.02,-9.04,-49.24:99
-chr1	1228900	.	T	C	25.48	LowQual	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=4;HaplotypeScore=1.75;MQ=56.48;MQ0=0;QD=0.75;SB=-20.62	GT:AD:DP:GL:GQ	0/1:26,7:28:-14.27,-8.44,-89.93:58.30
-chr1	1229202	rs11260584	T	G	37.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=976.99;QD=27.91;SB=-499.87	GT:AD:DP:GL:GQ	1/1:0,35:32:-101.31,-9.64,-0.03:96.16
-chr1	1229816	rs10399878	A	G	473.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1102.82;QD=26.90;SB=-522.83	GT:AD:DP:GL:GQ	1/1:0,41:37:-113.91,-11.17,-0.05:99
-chr1	1231392	rs1536168	A	G	97.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.82;MQ0=0;OQ=1395.06;QD=27.90;SB=-606.94	GT:AD:DP:GL:GQ	1/1:0,50:45:-143.13,-13.57,-0.04:99
-chr1	1231663	rs3737720	A	G	139.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.21;MQ=58.81;MQ0=0;OQ=1690.11;QD=30.73;SB=-679.26	GT:AD:DP:GL:GQ	1/1:0,55:50:-172.62,-15.06,-0.03:99
-chr1	1231766	rs3737719	C	G	2.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=2;HaplotypeScore=1.43;MQ=58.78;MQ0=0;OQ=1400.23;QD=36.85;SB=-370.18	GT:AD:DP:GL:GQ	1/1:0,38:34:-143.63,-10.26,-0.03:99
-chr1	1232078	rs4970431	A	G	216.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1612.70;QD=32.91;SB=-685.61	GT:AD:DP:GL:GQ	1/1:0,49:46:-164.87,-13.86,-0.01:99
-chr1	1232570	rs2274262	A	G	6.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=2.33;MQ=58.39;MQ0=0;OQ=927.22;QD=31.97;SB=-261.82	GT:AD:DP:GL:GQ	1/1:0,28:29:-99.47,-11.27,-3.16:81.12
-chr1	1232846	rs2887285	G	A	7.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=60.00;MQ0=0;OQ=156.17;QD=26.03;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,5:5:-19.18,-1.51,-0.00:15.05
-chr1	1233759	rs61766198	C	T	47.25	LowQual	AC=2;AF=1.00;AN=2;DB;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;QD=23.62;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,2:2:-8.13,-0.60,-0.00:6.02
-chr1	1235231	rs11590283	G	A	557.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1461.68;QD=36.54;SB=-745.00	GT:AD:DP:GL:GQ	1/1:1,39:37:-149.76,-11.15,-0.01:99
-chr1	1235867	rs2296474	A	G	712.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.51;MQ0=0;OQ=1812.39;QD=34.20;SB=-908.32	GT:AD:DP:GL:GQ	1/1:0,53:53:-184.85,-15.97,-0.02:99
-chr1	1237357	rs12103	T	C	207.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=647.94;QD=29.45;SB=-286.45	GT:AD:DP:GL:GQ	1/1:0,22:21:-68.40,-6.33,-0.02:63.15
-chr1	1237452	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=10;HaplotypeScore=2.81;MQ=58.76;MQ0=0;OQ=54.80;QD=4.98;SB=-3.98	GT:AD:DP:GL:GQ	0/1:7,4:6:-10.58,-1.82,-11.64:87.64
-chr1	1239050	rs12142199	G	A	66.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=3;HaplotypeScore=1.62;MQ=58.97;MQ0=0;OQ=2440.21;QD=38.73;SB=-1144.03	GT:AD:DP:GL:GQ	1/1:1,62:62:-247.62,-18.68,-0.02:99
-chr1	1239352	.	C	G	26.31	PASS	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=58.82;MQ0=0;OQ=1214.59;QD=20.59;SB=-515.28	GT:AD:DP:GL:GQ	0/1:25,34:56:-141.62,-16.88,-95.25:99
-chr1	1242263	rs55998830	C	T	160.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=57.24;MQ0=0;OQ=503.69;QD=12.29;SB=-134.60	GT:AD:DP:GL:GQ	0/1:23,18:39:-65.41,-11.76,-71.08:99
-chr1	1243999	rs4970432	G	A	36.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=2.94;MQ=58.63;MQ0=0;OQ=2692.59;QD=39.60;SB=-1179.08	GT:AD:DP:GL:GQ	1/1:0,68:67:-272.86,-20.18,-0.01:99
-chr1	1244299	rs1886773	A	G	203.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=59.11;MQ0=0;OQ=1463.44;QD=28.14;SB=-748.56	GT:AD:DP:GL:GQ	1/1:0,52:48:-149.98,-14.48,-0.05:99
-chr1	1244306	rs1886772	G	A	170.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.23;MQ=58.89;MQ0=0;OQ=2428.21;QD=38.54;SB=-1150.05	GT:AD:DP:GL:GQ	1/1:0,63:62:-246.42,-18.68,-0.02:99
-chr1	1244704	rs10907179	C	G	226.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=2474.22;QD=40.56;SB=-1116.55	GT:AD:DP:GL:GQ	1/1:0,61:58:-251.03,-17.48,-0.03:99
-chr1	1245150	rs10449892	C	T	372.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1031.28;QD=35.56;SB=-512.17	GT:AD:DP:GL:GQ	1/1:0,29:28:-106.73,-8.44,-0.02:84.26
-chr1	1247456	rs1810745	A	G	110.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=54.75;MQ0=0;OQ=1043.28;QD=28.20;SB=-313.49	GT:AD:DP:GL:GQ	1/1:0,37:33:-107.94,-9.95,-0.02:99
-chr1	1256339	rs28704486	A	G	29.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=16.01;MQ0=0;OQ=60.16;QD=4.63;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,13:3:-9.51,-0.90,-0.00:9.02
-chr1	1258710	rs307378	T	G	2.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=76.83;QD=25.61;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,3:3:-11.17,-0.90,-0.00:9.03
-chr1	1259417	rs307377	T	C	101.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=21.92;MQ0=3;OQ=105.39;QD=15.06;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,7:4:-14.07,-1.20,-0.00:12.04
-chr1	1260192	rs188647	A	G	29.27	LowQual	AC=2;AF=1.00;AN=2;DB;DP=2;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=14.64;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,2:2:-6.34,-0.60,-0.00:6.01
-chr1	1260222	rs307374	T	C	0.04	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=63.98;QD=21.33;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,3:3:-9.89,-0.91,-0.00:9.02
-chr1	1262360	rs307372	A	G	1.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.52;MQ=35.06;MQ0=0;OQ=290.20;QD=24.18;SB=-151.34	GT:AD:DP:GL:GQ	1/1:0,12:11:-32.62,-3.32,-0.02:33.05
-chr1	1262979	rs307371	A	G	118.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.17;MQ0=0;OQ=96.93;QD=24.23;SB=-72.91	GT:AD:DP:GL:GQ	1/1:0,4:4:-13.23,-1.21,-0.00:12.03
-chr1	1263141	rs307370	A	G	373.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.14;MQ0=0;OQ=479.19;QD=34.23;SB=-188.41	GT:AD:DP:GL:GQ	1/1:0,14:14:-51.51,-4.22,-0.00:42.13
-chr1	1265154	rs11582808	G	A	10.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=44.52;MQ0=0;OQ=273.35;QD=19.53;SB=-116.97	GT:AD:DP:GL:GQ	0/1:5,9:13:-34.54,-3.92,-12.73:88.15
-chr1	1266341	rs307364	T	G	24.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=1;HaplotypeScore=1.44;MQ=22.99;MQ0=5;OQ=64.81;QD=5.40;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,10:3:-9.97,-0.90,-0.00:9.02
-chr1	1267396	rs17854636	T	C	111.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=34.81;MQ0=1;OQ=372.39;QD=23.27;SB=-142.72	GT:AD:DP:GL:GQ	1/1:0,16:13:-40.84,-3.92,-0.02:39.08
-chr1	1268100	rs307361	T	C	193.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.78;MQ0=3;OQ=449.98;QD=25.00;SB=-194.71	GT:AD:DP:GL:GQ	1/1:0,18:15:-48.59,-4.52,-0.01:45.11
-chr1	1268888	rs307360	A	G	2.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=29.77;MQ0=0;OQ=268.28;QD=26.83;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,9:9:-30.42,-2.71,-0.01:27.07
-chr1	1270382	rs307358	T	C	22.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=83.45;QD=20.86;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,4:4:-11.88,-1.21,-0.01:12.02
-chr1	1276604	.	G	C	27.05	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.66;MQ=11.97;MQ0=10;QD=1.29;SB=-10.00	GT:AD:DP:GL:GQ	0/1:9,12:4:-7.20,-1.21,-7.49:59.88
-chr1	1276657	rs35104845	C	T	49.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=2.90;MQ=23.40;MQ0=3;OQ=76.78;QD=6.98;SB=-10.00	GT:AD:DP:GL:GQ	1/1:5,5:3:-11.17,-0.90,-0.00:9.03
-chr1	1276684	rs61766214	G	C	3.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=32.46;MQ0=2;OQ=374.70;QD=28.82;SB=-82.81	GT:AD:DP:GL:GQ	1/1:1,12:10:-41.06,-3.02,-0.01:30.10
-chr1	1276760	rs34380086	G	C	256.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.61;MQ0=0;OQ=915.51;QD=35.21;SB=-194.53	GT:AD:DP:GL:GQ	1/1:0,26:24:-95.15,-7.24,-0.02:72.23
-chr1	1276990	rs56165241	G	A	0.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=23.71;MQ0=1;OQ=124.88;QD=20.81;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,6:4:-16.02,-1.20,-0.00:12.04
-chr1	1278208	rs13249	A	G	0.03	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=4;HaplotypeScore=0.79;MQ=29.00;MQ0=0;OQ=519.51;QD=34.63;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,15:15:-55.54,-4.52,-0.01:45.13
-chr1	1278334	rs3766183	C	T	70.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=12.77;MQ0=25;OQ=129.88;QD=4.48;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,29:4:-16.52,-1.20,-0.00:12.04
-chr1	1279774	rs4970365	G	A	205.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=37.02;MQ0=1;OQ=413.00;QD=27.53;SB=-81.33	GT:AD:DP:GL:GQ	1/1:0,15:12:-44.89,-3.62,-0.01:36.11
-chr1	1283627	rs34841888	G	C	242.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=17.25;MQ0=18;OQ=165.64;QD=7.20;SB=-87.83	GT:AD:DP:GL:GQ	1/1:0,23:5:-20.13,-1.51,-0.00:15.05
-chr1	1284791	rs2649608	A	G	15.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=325.53;QD=25.04;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,13:12:-36.15,-3.62,-0.02:36.07
-chr1	1285186	rs34389364	G	A	48.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=44.84;MQ0=0;OQ=775.48;QD=28.72;SB=-269.63	GT:AD:DP:GL:GQ	1/1:0,25:23:-81.16,-6.94,-0.03:69.18
-chr1	1285266	rs34876581	T	C	166.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=42.89;MQ0=0;OQ=1629.47;QD=31.95;SB=-823.96	GT:AD:DP:GL:GQ	1/1:0,51:47:-166.55,-14.16,-0.02:99
-chr1	1285545	rs61766236	A	G	14.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=53.58;MQ0=0;OQ=756.88;QD=26.10;SB=-99.85	GT:AD:DP:GL:GQ	1/1:0,29:25:-79.29,-7.54,-0.02:75.15
-chr1	1285750	.	T	C	31.55	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=14.50;MQ0=6;QD=3.94;SB=-38.95	GT:AD:DP:GL:GQ	1/1:0,8:2:-6.56,-0.60,-0.00:6.01
-chr1	1286016	rs2765027	T	G	82.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=481.12;QD=30.07;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,16:16:-51.71,-4.82,-0.01:48.07
-chr1	1286554	rs2765025	C	G	315.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=27.90;MQ0=0;OQ=1204.51;QD=36.50;SB=-193.69	GT:AD:DP:GL:GQ	1/1:0,33:29:-124.04,-8.74,-0.01:87.29
-chr1	1286681	rs2765024	C	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=6;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=715.35;QD=35.77;SB=-192.69	GT:AD:DP:GL:GQ	1/1:0,20:18:-75.13,-5.42,-0.01:54.18
-chr1	1286922	rs35056373	G	A	454.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.41;MQ0=1;OQ=1368.71;QD=34.22;SB=-459.59	GT:AD:DP:GL:GQ	1/1:0,40:36:-140.48,-10.85,-0.02:99
-chr1	1287079	rs2649611	A	G	142	PASS	AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.17;MQ0=0;OQ=99.93;QD=24.98;SB=-76.36	GT:AD:DP:GL:GQ	1/1:0,4:4:-13.53,-1.21,-0.00:12.03
-chr1	1287285	rs2765021	C	T	19.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=27.13;MQ0=1;OQ=211.29;QD=26.41;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,8:6:-24.70,-1.81,-0.00:18.06
-chr1	1287346	.	G	A	32.26	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.41;MQ=19.54;MQ0=6;QD=3.23;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,5:4:-7.72,-1.21,-5.84:46.31
-chr1	1287498	rs34896744	G	A	28.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=522.90;QD=37.35;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,14:14:-55.88,-4.22,-0.00:42.14
-chr1	1288153	.	C	T	10.16	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=6.84;MQ0=17;QD=0.56;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,3:1:-4.26,-0.30,-0.00:1.76
-chr1	1288274	rs4970439	C	T	158.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.76;MQ0=1;OQ=198.94;QD=24.87;SB=-120.99	GT:AD:DP:GL:GQ	1/1:0,8:6:-23.47,-1.81,-0.00:18.06
-chr1	1288396	rs9700464	T	G	39.49	LowQual	AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.48;MQ0=3;QD=7.90;SB=-46.01	GT:AD:DP:GL:GQ	1/1:0,5:2:-7.36,-0.60,-0.00:6.02
-chr1	1288400	rs2477784	C	T	45.25	LowQual	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.37;MQ0=1;QD=15.08;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,3:2:-7.93,-0.60,-0.00:6.02
-chr1	1288965	.	T	C	42.83	LowQual	AC=2;AF=1.00;AN=2;DP=5;Dels=0.00;HRun=3;HaplotypeScore=1.16;MQ=15.81;MQ0=3;QD=8.57;SB=-10.00	GT:AD:DP:GL:GQ	1/1:3,2:2:-7.69,-0.60,-0.00:6.02
-chr1	1288989	.	G	A	32	LowQual	AC=2;AF=1.00;AN=2;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=17.68;MQ0=2;QD=8.00;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,2:2:-6.61,-0.60,-0.00:6.01
-chr1	1288993	.	G	A	39.02	LowQual	AC=2;AF=1.00;AN=2;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=17.68;MQ0=2;QD=9.75;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,2:2:-7.31,-0.60,-0.00:6.02
-chr1	1289038	.	G	A	46.02	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=8.33;MQ0=16;QD=2.56;SB=-10.00	GT:AD:DP:GL:GQ	1/1:16,2:2:-8.01,-0.60,-0.00:6.02
-chr1	1289229	rs28368296	C	T	48.25	LowQual	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.68;MQ0=1;QD=16.08;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,2:2:-8.23,-0.60,-0.00:6.02
-chr1	1292190	.	A	C	28.74	DPFilter;HARD_TO_VALIDATE;Indel;LowQual	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=31.67;MQ=32.93;MQ0=5;QD=1.44;SB=2.03	GT:AD:DP:GL:GQ	0/1:14,6:12:-9.77,-3.62,-33.18:61.57
-chr1	1292271	rs61766242	A	G	18.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=30.84;MQ0=4;OQ=1066.32;QD=26.66;SB=-193.80	GT:AD:DP:GL:GQ	1/1:0,40:32:-110.23,-9.64,-0.01:96.27
-chr1	1292418	rs3104610	C	T	418.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=45.84;MQ0=1;OQ=2220.73;QD=38.96;SB=-760.52	GT:AD:DP:GL:GQ	1/1:0,57:55:-225.67,-16.57,-0.01:99
-chr1	1297501	rs2649597	T	C	2.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.11;MQ0=4;OQ=360.28;QD=22.52;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,16:12:-39.62,-3.62,-0.01:36.08
-chr1	1298491	rs2477775	A	G	32.28	LowQual	AC=2;AF=1.00;AN=2;DB;DP=2;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=16.14;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,2:2:-6.64,-0.60,-0.00:6.02
-chr1	1298734	rs2649595	A	T	1.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.11;MQ0=1;OQ=88.08;QD=22.02;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,4:3:-12.30,-0.90,-0.00:9.03
-chr1	1300531	rs2242398	A	C	250.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=40.82;MQ0=0;OQ=470.94;QD=31.40;SB=-111.01	GT:AD:DP:GL:GQ	1/1:0,15:15:-50.69,-4.52,-0.01:45.12
-chr1	1300838	rs2649594	C	T	51.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.25;MQ0=5;OQ=315.14;QD=22.51;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,14:9:-35.10,-2.71,-0.01:27.08
-chr1	1300941	rs2649592	G	T	12.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.29;MQ0=5;OQ=256.28;QD=18.31;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,14:8:-29.21,-2.41,-0.00:24.07
-chr1	1302674	rs34582295	C	T	6.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=2;HaplotypeScore=3.06;MQ=25.59;MQ0=11;OQ=374.66;QD=16.29;SB=-144.64	GT:AD:DP:GL:GQ	1/1:0,23:11:-41.06,-3.32,-0.01:33.10
-chr1	1303447	rs11489820	G	C	2.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=7.53;MQ0=41;OQ=125.53;QD=2.73;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,46:4:-16.09,-1.21,-0.00:12.04
-chr1	1304035	rs2477777	C	T	175.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=34.74;MQ0=4;OQ=578.49;QD=28.92;SB=-248.33	GT:AD:DP:GL:GQ	1/1:0,20:15:-61.44,-4.52,-0.00:45.15
-chr1	1304333	rs2313135	T	G	34.29	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.98;MQ0=4;QD=4.90;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,2:3:-7.61,-0.90,-3.34:24.36
-chr1	1304907	rs2368566	G	A	186.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.16;MQ0=0;OQ=83.01;QD=27.67;SB=-45.55	GT:AD:DP:GL:GQ	1/1:0,3:3:-11.79,-0.90,-0.00:9.03
-chr1	1305206	rs2368565	G	A	178.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=123.88;QD=30.97;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,4:4:-15.92,-1.20,-0.00:12.04
-chr1	1305756	rs2454652	C	T	47.02	LowQual	AC=2;AF=1.00;AN=2;DB;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=23.51;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,2:2:-8.11,-0.60,-0.00:6.02
-chr1	1306033	rs2649587	G	A	6.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=34.70;MQ0=1;OQ=503.12;QD=31.45;SB=-129.67	GT:AD:DP:GL:GQ	1/1:0,16:14:-53.90,-4.22,-0.01:42.13
-chr1	1306331	rs2649586	A	G	0.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=2;HaplotypeScore=0.63;MQ=29.00;MQ0=0;OQ=293.94;QD=24.50;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,11:10:-32.98,-3.01,-0.01:30.07
-chr1	1307502	.	C	G	13.29	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=4.50;MQ0=24;QD=0.49;SB=-10.00	GT:AD:DP:GL:GQ	0/1:26,1:1:-4.59,-0.30,-0.00:1.76
-chr1	1307925	.	G	C	0.13	PASS	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=13.45;MQ0=29;OQ=83.85;QD=1.78;SB=-0.97	GT:AD:DP:GL:GQ	0/1:38,9:8:-14.08,-2.41,-22.17:99
-chr1	1307979	.	T	C	42.83	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=18;Dels=0.00;HRun=1;HaplotypeScore=2.20;MQ=7.67;MQ0=16;QD=2.38;SB=-10.00	GT:AD:DP:GL:GQ	1/1:13,5:2:-7.69,-0.60,-0.00:6.02
-chr1	1308095	.	C	G	10.99	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=29;Dels=0.17;HRun=1;HaplotypeScore=14.74;MQ=6.41;MQ0=25;QD=0.38;SB=-10.00	GT:AD:DP:GL:GQ	0/1:20,4:1:-4.35,-0.30,-0.00:1.76
-chr1	1321841	.	G	T	47.94	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=20;HaplotypeScore=6.03;MQ=23.98;MQ0=9;QD=1.65;SB=-0.97	GT:AD:DP:GL:GQ	0/1:18,11:6:-9.89,-1.81,-11.27:80.77
-chr1	1323299	rs1240743	C	A	6.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.08;MQ=38.33;MQ0=6;OQ=144.07;QD=3.27;SB=50.03	GT:AD:DP:GL:GQ	0/1:30,14:36:-28.54,-10.85,-84.17:99
-chr1	1332475	rs2275915	G	C	24.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=16;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=31.54;MQ0=6;OQ=92.26;QD=5.77;SB=-43.44	GT:AD:DP:GL:GQ	0/1:8,8:10:-15.53,-3.02,-24.58:99
-chr1	1346911	.	G	A	0.08	PASS	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=8.57;MQ=40.33;MQ0=2;OQ=331.50;QD=8.72;SB=-7.00	GT:AD:DP:GL:GQ	0/1:22,16:33:-46.38,-9.94,-72.87:99
-chr1	1349702	.	C	A	0.66	PASS	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=1;HaplotypeScore=5.78;MQ=19.45;MQ0=7;OQ=297.18;QD=9.29;SB=-141.76	GT:AD:DP:GL:GQ	0/1:14,17:13:-36.92,-3.92,-7.86:39.43
-chr1	1352746	rs58304223	G	C	14.25	LowQual	AC=1;AF=0.50;AN=2;DB;DP=1;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=14.25;SB=-10.00	GT:AD:DP:GL:GQ	0/1:0,1:1:-4.69,-0.30,-0.00:1.76
-chr1	1353363	.	G	T	42.81	LowQual	AC=2;AF=1.00;AN=2;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=37.00;MQ0=0;QD=21.40;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,2:2:-7.69,-0.60,-0.00:6.02
-chr1	1355197	rs1781138	A	G	15.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=39.89;MQ0=3;OQ=305.23;QD=16.96;SB=-38.95	GT:AD:DP:GL:GQ	1/1:0,18:10:-34.11,-3.01,-0.00:30.08
-chr1	1358462	rs1240703	A	C	0.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=3;HaplotypeScore=0.32;MQ=21.92;MQ0=3;OQ=100.91;QD=14.42;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,7:4:-13.63,-1.21,-0.00:12.03
-chr1	1358648	.	C	G	24.94	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=3;HaplotypeScore=2.70;MQ=19.30;MQ0=6;QD=1.19;SB=5.05	GT:AD:DP:GL:GQ	0/1:13,8:7:-7.89,-2.11,-21.96:57.76
-chr1	1377530	rs1781144	C	G	16.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=20.51;MQ0=10;OQ=394.74;QD=19.74;SB=-103.85	GT:AD:DP:GL:GQ	1/1:0,20:10:-43.06,-3.01,-0.00:30.10
-chr1	1380491	.	G	A	10.40	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=6;HaplotypeScore=29.42;MQ=36.22;MQ0=8;QD=0.18;SB=26.07	GT:AD:DP:GL:GQ	0/1:33,26:17:-9.41,-5.13,-45.72:42.82
-chr1	1390605	rs1240723	T	C	30.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=3.36;MQ=30.70;MQ0=2;OQ=239.92;QD=7.06;SB=-41.82	GT:AD:DP:GL:GQ	0/1:20,14:26:-35.12,-7.84,-56.30:99
-chr1	1390829	.	C	T	33.01	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=3;HaplotypeScore=8.88;MQ=28.73;MQ0=9;QD=1.00;SB=26.10	GT:AD:DP:GL:GQ	0/1:27,6:18:-12.01,-5.42,-52.81:65.84
-chr1	1394381	.	T	G	40.77	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=20.66;MQ0=17;QD=0.91;SB=-10.00	GT:AD:DP:GL:GQ	0/1:31,13:12:-10.98,-3.61,-30.75:73.61
-chr1	1398226	.	C	T	36.49	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=10.21;MQ0=21;QD=1.46;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,13:3:-7.84,-0.90,-3.10:21.92
-chr1	1410500	rs35871802	C	T	116.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.49;MQ0=17;OQ=181.39;QD=6.05;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,18:11:-24.74,-3.31,-17.34:99
-chr1	1413144	.	G	A	12.73	PASS	AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=22.29;MQ0=2;OQ=489.12;QD=14.82;SB=-131.14	GT:AD:DP:GL:GQ	0/1:17,16:30:-61.25,-9.05,-41.87:99
-chr1	1414249	.	G	C	31.95	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=2;HaplotypeScore=6.60;MQ=15.28;MQ0=13;QD=1.33;SB=-10.00	GT:AD:DP:GL:GQ	0/1:18,6:4:-7.69,-1.21,-7.60:63.89
-chr1	1423959	rs1781141	T	G	30.05	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=21.23;MQ0=4;QD=1.58;SB=5.04	GT:AD:DP:GL:GQ	0/1:13,6:14:-10.50,-4.22,-40.36:62.88
-chr1	1424829	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=20;HaplotypeScore=5.78;MQ=28.83;MQ0=9;OQ=77.31;QD=1.98;SB=59.13	GT:AD:DP:GL:GQ	0/1:32,7:28:-19.45,-8.44,-75.28:99
-chr1	1424855	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=20;HaplotypeScore=4.13;MQ=29.08;MQ0=4;OQ=54.78;QD=1.96;SB=29.12	GT:AD:DP:GL:GQ	0/1:21,7:17:-13.88,-5.12,-48.25:87.62
-chr1	1425922	rs28755011	C	T	122.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=53.56;MQ0=1;OQ=756.68;QD=16.45;SB=-222.92	GT:AD:DP:GL:GQ	0/1:21,25:43:-91.92,-12.96,-62.88:99
-chr1	1430132	rs3104609	A	G	485.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=42.69;MQ0=1;OQ=1088.71;QD=31.11;SB=-534.36	GT:AD:DP:GL:GQ	1/1:0,35:33:-112.47,-9.94,-0.02:99
-chr1	1447936	rs3118507	A	G	40.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=47.98;MQ0=0;OQ=209.16;QD=6.97;SB=-124.72	GT:AD:DP:GL:GQ	0/1:20,10:26:-32.03,-7.83,-67.04:99
-chr1	1450120	rs6603789	G	C	0.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=28.41;MQ0=9;OQ=784.91;QD=23.09;SB=-55.93	GT:AD:DP:GL:GQ	1/1:6,28:20:-82.08,-6.03,-0.01:60.20
-chr1	1450953	rs3128345	A	G	6.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=8.00;MQ=58.21;MQ0=0;OQ=533.48;QD=10.67;SB=-234.27	GT:AD:DP:GL:GQ	0/1:28,22:48:-71.10,-14.47,-106.23:99
-chr1	1457784	.	T	A	85.12	PASS	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.74;MQ0=0;OQ=950.58;QD=15.09;SB=-335.63	GT:AD:DP:GL:GQ	0/1:32,31:63:-117.32,-18.98,-122.45:99
-chr1	1458041	rs6694994	T	C	138.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=49.26;MQ0=0;OQ=499.68;QD=12.19;SB=-117.64	GT:AD:DP:GL:GQ	0/1:20,21:38:-64.71,-11.46,-68.00:99
-chr1	1459409	rs3128344	G	A	558.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.45;MQ0=0;OQ=1638.56;QD=37.24;SB=-778.68	GT:AD:DP:GL:GQ	1/1:0,43:42:-167.45,-12.65,-0.01:99
-chr1	1461502	.	A	C	42.07	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=2;HaplotypeScore=1.74;MQ=57.05;MQ0=0;QD=2.63;SB=14.06	GT:AD:DP:GL:GQ	0/1:8,8:12:-11.11,-3.62,-27.42:74.90
-chr1	1461910	rs3118505	C	T	45.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.75;MQ=58.35;MQ0=0;OQ=649.92;QD=17.57;SB=-339.91	GT:AD:DP:GL:GQ	0/1:17,20:34:-78.52,-10.25,-48.35:99
-chr1	1462403	rs1571148	T	G	289.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=414.06;QD=9.41;SB=-126.87	GT:AD:DP:GL:GQ	0/1:27,17:41:-57.04,-12.35,-89.89:99
-chr1	1462736	rs4259576	T	A	334.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.42;MQ=60.00;MQ0=0;OQ=380.45;QD=11.19;SB=-195.57	GT:AD:DP:GL:GQ	0/1:20,14:33:-51.27,-9.94,-69.97:99
-chr1	1464030	rs1571149	A	G	400.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=60.00;MQ0=0;OQ=649.88;QD=11.01;SB=-311.08	GT:AD:DP:GL:GQ	0/1:30,29:55:-84.85,-16.58,-112.84:99
-chr1	1464167	rs1571150	C	A	91.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.52;MQ0=0;OQ=665.06;QD=17.05;SB=-221.93	GT:AD:DP:GL:GQ	0/1:16,23:39:-81.54,-11.75,-55.47:99
-chr1	1464327	rs56239289	T	C	341.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=731.44;QD=11.99;SB=-372.97	GT:AD:DP:GL:GQ	0/1:31,30:58:-93.91,-17.48,-117.75:99
-chr1	1464734	rs9439465	G	C	86.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=410.54;QD=15.21;SB=-187.22	GT:AD:DP:GL:GQ	0/1:13,14:25:-51.89,-7.55,-46.69:99
-chr1	1468557	rs55694463	C	G	72.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.11;MQ0=0;OQ=367.44;QD=14.13;SB=-116.67	GT:AD:DP:GL:GQ	0/1:13,13:22:-46.66,-6.63,-46.00:99
-chr1	1468920	rs61777888	A	T	11.23	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=40.58;MQ0=0;QD=1.12;SB=2.00	GT:AD:DP:GL:GQ	0/1:8,2:6:-6.19,-1.81,-11.86:43.73
-chr1	1471211	rs3766177	T	C	144.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.26;MQ=59.42;MQ0=0;OQ=424.79;QD=8.50;SB=-61.74	GT:AD:DP:GL:GQ	0/1:28,22:46:-59.63,-13.86,-111.57:99
-chr1	1472873	rs7517401	G	A	289.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.75;MQ=59.55;MQ0=0;OQ=742.89;QD=14.57;SB=-367.87	GT:AD:DP:GL:GQ	0/1:27,24:48:-92.05,-14.47,-78.97:99
-chr1	1474833	rs7515814	C	G	227.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.23;MQ0=0;OQ=1418.95;QD=20.87;SB=-692.35	GT:AD:DP:GL:GQ	0/1:30,38:67:-165.38,-20.20,-121.41:99
-chr1	1476697	rs3128342	C	A	175.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=1.77;MQ=59.37;MQ0=0;OQ=1038.77;QD=15.74;SB=-518.96	GT:AD:DP:GL:GQ	0/1:32,34:66:-127.04,-19.88,-111.54:99
-chr1	1478935	rs3930748	A	G	131.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=57.35;MQ0=0;OQ=678.62;QD=14.44;SB=-210.49	GT:AD:DP:GL:GQ	0/1:18,29:41:-83.51,-12.36,-58.93:99
-chr1	1479484	rs11590038	T	C	187.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=3.28;MQ=60.00;MQ0=0;OQ=498.05;QD=12.45;SB=-267.61	GT:AD:DP:GL:GQ	0/1:17,23:38:-64.56,-11.47,-62.93:99
-chr1	1479489	rs11588893	C	T	162.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=60.00;MQ0=0;OQ=580.48;QD=15.69;SB=-263.76	GT:AD:DP:GL:GQ	0/1:17,20:34:-71.58,-10.25,-50.12:99
-chr1	1479533	rs7531530	C	T	220.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.91;MQ=59.18;MQ0=1;OQ=444.32;QD=12.01;SB=-149.64	GT:AD:DP:GL:GQ	0/1:19,18:31:-57.07,-9.35,-49.87:99
-chr1	1479791	rs7366884	T	C	122.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=59.38;MQ0=0;OQ=816.32;QD=13.61;SB=-418.23	GT:AD:DP:GL:GQ	0/1:30,30:57:-102.08,-17.17,-116.37:99
-chr1	1479937	rs7366635	A	G	20.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=2.12;MQ=59.07;MQ0=0;OQ=292.89;QD=6.51;SB=-136.53	GT:AD:DP:GL:GQ	0/1:30,15:42:-45.23,-12.66,-112.08:99
-chr1	1480024	rs3753332	A	G	36.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=1.31;MQ=59.44;MQ0=0;OQ=490.38;QD=11.96;SB=-170.97	GT:AD:DP:GL:GQ	0/1:21,20:37:-63.47,-11.15,-78.00:99
-chr1	1480095	rs3753331	T	C	462.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=783.79;QD=15.07;SB=-339.35	GT:AD:DP:GL:GQ	0/1:24,28:51:-97.03,-15.37,-89.70:99
-chr1	1480422	rs3820075	A	G	268.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.65;MQ0=0;OQ=768.88;QD=14.24;SB=-360.10	GT:AD:DP:GL:GQ	0/1:23,31:53:-96.15,-15.98,-92.13:99
-chr1	1480490	rs3753330	T	A	237.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.22;MQ0=0;OQ=615.93;QD=11.41;SB=-300.65	GT:AD:DP:GL:GQ	0/1:28,26:50:-79.94,-15.07,-101.11:99
-chr1	1480556	.	C	T	26.64	PASS	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.18;MQ=59.59;MQ0=0;OQ=854.85;QD=18.58;SB=-376.92	GT:AD:DP:GL:GQ	0/1:20,26:44:-102.04,-13.27,-56.58:99
-chr1	1481114	rs12048706	T	C	201.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=57.91;MQ0=0;OQ=878.58;QD=11.87;SB=-292.17	GT:AD:DP:GL:GQ	0/1:36,38:70:-112.24,-21.10,-138.24:99
-chr1	1484218	rs3118509	T	C	19.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1926.74;QD=28.76;SB=-881.49	GT:AD:DP:GL:GQ	1/1:0,67:60:-196.31,-18.09,-0.05:99
-chr1	1484946	rs6667347	G	C	188.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.64;MQ0=0;OQ=1104.15;QD=17.25;SB=-384.86	GT:AD:DP:GL:GQ	0/1:33,31:63:-132.69,-18.99,-142.09:99
-chr1	1485056	rs3118508	A	G	123.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.54;MQ0=0;OQ=1673.18;QD=28.36;SB=-768.59	GT:AD:DP:GL:GQ	1/1:0,59:54:-170.96,-16.29,-0.05:99
-chr1	1486871	rs3766170	T	C	6.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=4;HaplotypeScore=1.66;MQ=57.15;MQ0=0;OQ=440.82;QD=8.82;SB=-192.43	GT:AD:DP:GL:GQ	0/1:28,22:46:-61.23,-13.87,-105.72:99
-chr1	1488802	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=20;HaplotypeScore=27.79;MQ=52.29;MQ0=1;OQ=57.57;QD=0.82;SB=89.30	GT:AD:DP:GL:GQ	0/1:49,20:48:-23.51,-14.47,-151.88:90.40
-chr1	1489161	rs9439468	A	G	111.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=2.15;MQ=56.25;MQ0=0;OQ=911.03;QD=16.56;SB=-250.50	GT:AD:DP:GL:GQ	0/1:21,34:50:-109.45,-15.06,-75.57:99
-chr1	1490804	rs6603791	A	G	440.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=55.41;MQ0=0;OQ=778.85;QD=12.98;SB=-348.06	GT:AD:DP:GL:GQ	0/1:28,32:58:-98.65,-17.48,-110.76:99
-chr1	1490867	.	C	G	0.31	PASS	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=53.32;MQ0=0;OQ=206.00;QD=2.71;SB=-32.07	GT:AD:DP:GL:GQ	0/1:64,12:75:-46.49,-22.61,-271.24:99
-chr1	1490871	.	A	G	0.08	PASS	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=1.61;MQ=53.82;MQ0=0;OQ=220.05;QD=2.75;SB=-14.75	GT:AD:DP:GL:GQ	0/1:66,14:78:-48.79,-23.50,-263.73:99
-chr1	1490927	rs6656541	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=3;HaplotypeScore=23.59;MQ=53.32;MQ0=0;OQ=1558.39;QD=20.51;SB=-788.78	GT:AD:DP:GL:GQ	0/1:23,53:74:-181.42,-22.29,-76.04:99
-chr1	1490930	rs12730242	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=22.45;MQ=53.65;MQ0=0;OQ=417.53;QD=5.49;SB=-224.35	GT:AD:DP:GL:GQ	0/1:55,21:70:-66.13,-21.09,-238.86:99
-chr1	1490948	rs12742689	T	C	0.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.65;MQ=53.98;MQ0=0;OQ=96.30;QD=1.23;SB=-34.35	GT:AD:DP:GL:GQ	0/1:66,12:72:-34.61,-21.70,-240.60:99
-chr1	1490950	rs12730248	C	T	0.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=2.65;MQ=54.06;MQ0=0;OQ=172.01;QD=2.18;SB=-98.81	GT:AD:DP:GL:GQ	0/1:67,11:73:-45.59,-25.10,-225.19:99
-chr1	1491329	rs7543799	G	A	29	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=5.33;MQ=58.37;MQ0=0;OQ=592.32;QD=13.16;SB=-320.34	GT:AD:DP:GL:GQ	0/1:24,21:38:-73.97,-11.45,-67.99:99
-chr1	1492958	rs7367692	G	A	226.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.69;MQ=59.16;MQ0=0;OQ=759.07;QD=13.80;SB=-311.80	GT:AD:DP:GL:GQ	0/1:31,24:51:-94.56,-15.37,-89.99:99
-chr1	1492962	rs7364711	A	C	163.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.69;MQ=59.20;MQ0=0;OQ=581.10;QD=10.02;SB=-270.86	GT:AD:DP:GL:GQ	0/1:35,23:56:-78.26,-16.87,-122.50:99
-chr1	1493671	rs11578409	C	G	251.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=59.04;MQ0=0;OQ=1371.84;QD=13.45;SB=-443.87	GT:AD:DP:GL:GQ	0/1:57,45:96:-169.40,-28.93,-244.12:99
-chr1	1493791	rs7550471	G	A	6.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=5.83;MQ=58.91;MQ0=0;OQ=1272.31;QD=21.21;SB=-593.09	GT:AD:DP:GL:GQ	0/1:20,38:56:-150.16,-19.64,-65.04:99
-chr1	1494423	rs7552586	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=6;HaplotypeScore=3.99;MQ=59.04;MQ0=0;OQ=1025.73;QD=12.36;SB=-469.22	GT:AD:DP:GL:GQ	0/1:45,38:80:-129.96,-24.11,-158.72:99
-chr1	1494904	rs6603792	T	C	342.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=427.21;QD=9.94;SB=-158.94	GT:AD:DP:GL:GQ	0/1:24,19:43:-58.97,-12.96,-97.93:99
-chr1	1495118	rs6603793	C	T	185.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=59.74;MQ0=0;OQ=1162.21;QD=15.92;SB=-407.71	GT:AD:DP:GL:GQ	0/1:38,35:73:-141.49,-21.99,-140.54:99
-chr1	1495830	rs7548959	C	T	131.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=3.07;MQ=58.74;MQ0=0;OQ=1025.47;QD=14.65;SB=-444.99	GT:AD:DP:GL:GQ	0/1:38,32:69:-126.64,-20.81,-114.78:99
-chr1	1495898	rs7540231	G	A	67.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=2;HaplotypeScore=1.75;MQ=58.44;MQ0=0;OQ=3508.72;QD=37.73;SB=-1621.33	GT:AD:DP:GL:GQ	1/1:0,92:90:-349.87,-27.12,-0.03:99
-chr1	1497229	rs9439469	G	A	187.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.17;MQ0=0;OQ=210.39;QD=8.42;SB=-10.00	GT:AD:DP:GL:GQ	0/1:17,8:25:-31.85,-7.53,-57.26:99
-chr1	1497775	rs61774865	A	C	52.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=53.97;MQ0=0;OQ=260.15;QD=7.88;SB=-10.00	GT:AD:DP:GL:GQ	0/1:20,13:31:-38.64,-9.34,-70.58:99
-chr1	1498322	rs9439473	A	G	18.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=3.82;MQ=56.11;MQ0=0;OQ=610.76;QD=13.57;SB=-249.32	GT:AD:DP:GL:GQ	0/1:21,24:44:-77.63,-13.27,-79.03:99
-chr1	1498506	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=5;HaplotypeScore=2.45;MQ=50.85;MQ0=0;OQ=161.89;QD=3.37;SB=24.24	GT:AD:DP:GL:GQ	0/1:38,10:40:-31.52,-12.05,-112.23:99
-chr1	1498508	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=15;HaplotypeScore=1.82;MQ=51.05;MQ0=0;OQ=196.72;QD=4.01;SB=27.81	GT:AD:DP:GL:GQ	0/1:38,11:41:-35.31,-12.36,-104.62:99
-chr1	1498897	rs7520996	T	C	291.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=2.95;MQ=56.74;MQ0=0;OQ=1344.56;QD=17.46;SB=-662.63	GT:AD:DP:GL:GQ	0/1:31,46:75:-160.33,-22.59,-123.58:99
-chr1	1499019	rs7518083	A	G	453.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.97;MQ0=0;OQ=1144.84;QD=14.49;SB=-308.25	GT:AD:DP:GL:GQ	0/1:39,40:76:-140.66,-22.89,-155.49:99
-chr1	1499688	rs6666293	A	G	47.16	LowQual	AC=1;AF=0.50;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=1.90;MQ=53.03;MQ0=0;QD=6.74;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,3:5:-9.51,-1.51,-8.01:65.07
-chr1	1500664	rs7519837	C	T	335.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=543.75;QD=13.59;SB=-294.78	GT:AD:DP:GL:GQ	0/1:21,19:39:-69.41,-11.75,-74.55:99
-chr1	1500967	rs7556282	G	C	209.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=56.81;MQ0=0;OQ=874.72;QD=17.85;SB=-362.79	GT:AD:DP:GL:GQ	0/1:21,27:44:-104.04,-13.28,-69.73:99
-chr1	1501107	rs4590622	G	A	74.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.06;MQ=35.43;MQ0=2;OQ=406.87;QD=8.30;SB=-78.55	GT:AD:DP:GL:GQ	0/1:30,19:38:-55.43,-11.46,-75.84:99
-chr1	1501178	rs4618908	T	C	437.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.31;MQ0=1;OQ=645.96;QD=14.68;SB=-291.48	GT:AD:DP:GL:GQ	0/1:19,25:40:-79.93,-12.05,-65.32:99
-chr1	1504046	.	C	T	7.57	PASS	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=3.52;MQ=59.17;MQ0=0;OQ=1022.24;QD=18.25;SB=-279.21	GT:AD:DP:GL:GQ	0/1:26,30:52:-121.18,-15.67,-71.09:99
-chr1	1504960	rs9331751	T	A	36.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=4.88;MQ=56.51;MQ0=1;OQ=1100.76;QD=14.11;SB=-360.40	GT:AD:DP:GL:GQ	0/1:39,39:73:-135.35,-21.99,-132.17:99
-chr1	1506133	rs9442407	C	T	139.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=4.15;MQ=35.12;MQ0=12;OQ=825.82;QD=11.16;SB=-394.16	GT:AD:DP:GL:GQ	0/1:42,32:54:-102.14,-16.28,-92.88:99
-chr1	1509564	rs9442406	T	C	136.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.76;MQ=56.80;MQ0=0;OQ=711.41;QD=13.42;SB=-198.20	GT:AD:DP:GL:GQ	0/1:27,26:51:-89.79,-15.37,-103.56:99
-chr1	1510588	rs28788874	C	T	634.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.10;MQ0=1;OQ=2154.00;QD=35.90;SB=-1071.35	GT:AD:DP:GL:GQ	1/1:0,60:56:-219.01,-16.88,-0.03:99
-chr1	1510832	rs6666084	A	G	27.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=29.16;MQ0=1;OQ=863.94;QD=22.15;SB=-357.32	GT:AD:DP:GL:GQ	1/1:0,34:29:-93.05,-11.63,-3.07:85.61
-chr1	1511143	rs6679999	C	T	270.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=46.32;MQ0=0;OQ=967.03;QD=37.19;SB=-287.88	GT:AD:DP:GL:GQ	1/1:0,26:25:-100.30,-7.53,-0.01:75.24
-chr1	1511216	.	T	A	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=2;HaplotypeScore=0.79;MQ=40.83;MQ0=0;OQ=921.95;QD=25.61;SB=-124.48	GT:AD:DP:GL:GQ	0/1:7,29:35:-106.02,-10.55,-27.02:99
-chr1	1511668	rs4648786	A	G	87.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=58.14;MQ0=0;OQ=1843.13;QD=31.78;SB=-498.18	GT:AD:DP:GL:GQ	1/1:0,58:57:-187.94,-17.18,-0.05:99
-chr1	1511869	rs4648787	C	T	29.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=3.56;MQ=56.20;MQ0=1;OQ=2155.57;QD=37.82;SB=-1079.94	GT:AD:DP:GL:GQ	1/1:1,56:55:-219.17,-16.58,-0.02:99
-chr1	1511922	rs4648612	C	T	25.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=42.53;MQ0=1;OQ=1102.46;QD=35.56;SB=-299.68	GT:AD:DP:GL:GQ	1/1:1,30:28:-113.84,-8.43,-0.01:84.28
-chr1	1512199	rs4648613	T	C	554.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.33;MQ0=0;OQ=1584.81;QD=33.02;SB=-688.28	GT:AD:DP:GL:GQ	1/1:0,48:45:-162.08,-13.55,-0.01:99
-chr1	1512230	rs28809773	G	A	465.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=52.87;MQ0=0;OQ=1755.99;QD=36.58;SB=-748.51	GT:AD:DP:GL:GQ	1/1:0,48:45:-179.20,-13.56,-0.01:99
-chr1	1512325	.	G	A	85.65	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.80;MQ=55.47;MQ0=0;OQ=776.49;QD=14.65;SB=-378.86	GT:AD:DP:GL:GQ	0/1:28,24:51:-96.30,-15.37,-89.39:99
-chr1	1512595	rs4366263	A	G	19.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=3.13;MQ=56.40;MQ0=0;OQ=1310.46;QD=34.49;SB=-610.36	GT:AD:DP:GL:GQ	1/1:0,38:38:-134.64,-11.45,-0.01:99
-chr1	1512656	rs28778974	C	T	131.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=49.50;MQ0=1;OQ=1426.66;QD=34.80;SB=-730.49	GT:AD:DP:GL:GQ	1/1:1,40:37:-146.26,-11.15,-0.01:99
-chr1	1512790	rs61774869	C	T	40.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=4.10;MQ=48.67;MQ0=1;OQ=1682.46;QD=36.58;SB=-840.63	GT:AD:DP:GL:GQ	1/1:2,44:43:-171.84,-12.95,-0.01:99
-chr1	1513302	rs9725077	G	A	148.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=48.17;MQ0=1;OQ=1464.10;QD=34.05;SB=-687.33	GT:AD:DP:GL:GQ	1/1:1,42:38:-150.01,-11.45,-0.01:99
-chr1	1514300	rs9442423	T	C	34.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.59;MQ0=0;OQ=266.23;QD=6.83;SB=-0.97	GT:AD:DP:GL:GQ	0/1:24,15:34:-40.16,-10.25,-85.89:99
-chr1	1514394	.	C	T	901.86	Indel	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.65;MQ0=0;QD=14.78;SB=-128.11	GT:AD:DP:GL:GQ	0/1:33,28:59:-111.26,-17.79,-98.57:99
-chr1	1514734	rs9442403	A	G	0.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=12.23;MQ=53.49;MQ0=0;OQ=367.70;QD=7.99;SB=-54.31	GT:AD:DP:GL:GQ	0/1:25,19:37:-51.21,-11.16,-85.57:99
-chr1	1514861	.	A	T	164.64	PASS	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.34;MQ0=0;OQ=646.82;QD=13.76;SB=-331.07	GT:AD:DP:GL:GQ	0/1:25,22:46:-81.82,-13.86,-91.60:99
-chr1	1515925	rs6681422	T	C	152.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=56.53;MQ0=0;OQ=534.97;QD=11.15;SB=-174.52	GT:AD:DP:GL:GQ	0/1:23,25:43:-69.74,-12.96,-84.05:99
-chr1	1516662	rs12735276	A	G	21.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.05;MQ=57.32;MQ0=1;OQ=2133.75;QD=30.05;SB=-1092.47	GT:AD:DP:GL:GQ	1/1:2,69:66:-217.02,-19.91,-0.06:99
-chr1	1516946	rs10157140	T	C	503.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.65;MQ0=0;OQ=1116.09;QD=14.69;SB=-475.23	GT:AD:DP:GL:GQ	0/1:37,39:76:-137.79,-22.90,-145.96:99
-chr1	1517815	.	T	C	151.98	PASS	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=58.19;MQ0=0;OQ=718.93;QD=11.41;SB=-330.87	GT:AD:DP:GL:GQ	0/1:32,31:61:-93.57,-18.39,-126.83:99
-chr1	1518089	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=69;Dels=0.01;HRun=19;HaplotypeScore=19.37;MQ=53.15;MQ0=1;OQ=397.54;QD=5.76;SB=50.30	GT:AD:DP:GL:GQ	0/1:45,23:60:-60.81,-17.78,-147.22:99
-chr1	1518109	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=82;Dels=0.01;HRun=19;HaplotypeScore=9.39;MQ=51.76;MQ0=1;OQ=216.06;QD=2.63;SB=62.19	GT:AD:DP:GL:GQ	0/1:54,27:58:-42.07,-17.18,-142.92:99
-chr1	1518112	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=77;Dels=0.01;HRun=4;HaplotypeScore=9.55;MQ=51.62;MQ0=1;OQ=92.02;QD=1.20;SB=65.18	GT:AD:DP:GL:GQ	0/1:56,20:51:-27.56,-15.07,-144.06:99
-chr1	1518863	rs12725297	G	C	139.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=58.84;MQ0=0;OQ=1568.02;QD=18.67;SB=-365.83	GT:AD:DP:GL:GQ	0/1:39,45:81:-184.49,-24.41,-167.76:99
-chr1	1518975	rs12725449	G	C	178.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.97;MQ0=0;OQ=2276.77;QD=38.59;SB=-1002.01	GT:AD:DP:GL:GQ	1/1:0,59:56:-231.29,-16.89,-0.03:99
-chr1	1519320	rs28566709	T	C	64.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=4.25;MQ=59.59;MQ0=0;OQ=477.78;QD=8.53;SB=-190.61	GT:AD:DP:GL:GQ	0/1:33,23:51:-66.44,-15.38,-114.90:99
-chr1	1519374	rs28662991	T	C	77.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=59.56;MQ0=0;OQ=635.95;QD=12.23;SB=-285.60	GT:AD:DP:GL:GQ	0/1:29,23:51:-82.25,-15.37,-108.55:99
-chr1	1519813	rs28503881	A	G	211.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.02;MQ0=0;OQ=531.98;QD=8.58;SB=-234.91	GT:AD:DP:GL:GQ	0/1:35,27:58:-73.97,-17.49,-134.84:99
-chr1	1519842	rs4648788	T	C	59.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.96;MQ=56.83;MQ0=0;OQ=1829.71;QD=27.72;SB=-554.05	GT:AD:DP:GL:GQ	1/1:0,66:57:-186.60,-17.18,-0.04:99
-chr1	1519857	.	G	C	3.15	PASS	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=1;HaplotypeScore=5.53;MQ=56.98;MQ0=0;OQ=985.46;QD=15.64;SB=-338.06	GT:AD:DP:GL:GQ	0/1:28,35:57:-119.03,-17.20,-116.72:99
-chr1	1519861	rs28689700	C	G	213.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=56.88;MQ0=0;OQ=841.97;QD=13.80;SB=-287.94	GT:AD:DP:GL:GQ	0/1:30,31:57:-104.69,-17.21,-125.41:99
-chr1	1520060	rs4648789	A	C	15.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=4;HaplotypeScore=1.27;MQ=50.71;MQ0=0;OQ=838.47;QD=14.46;SB=-329.82	GT:AD:DP:GL:GQ	0/1:26,32:54:-103.41,-16.28,-79.25:99
-chr1	1520063	rs4648790	C	T	336.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=51.65;MQ0=0;OQ=926.60;QD=15.19;SB=-418.36	GT:AD:DP:GL:GQ	0/1:30,31:60:-114.03,-18.08,-107.59:99
-chr1	1520195	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=113;Dels=0.02;HRun=0;HaplotypeScore=46.04;MQ=50.13;MQ0=3;OQ=55.61;QD=0.49;SB=110.40	GT:AD:DP:GL:GQ	0/1:96,14:92:-36.27,-27.42,-356.52:88.45
-chr1	1520222	.	G	A	94.09	SnpCluster	AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=77.51;MQ=46.35;MQ0=0;QD=0.80;SB=-48.89	GT:AD:DP:GL:GQ	0/1:102,15:106:-44.62,-31.93,-348.40:99
-chr1	1520225	.	G	C	344.68	SnpCluster	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=69.75;MQ=44.94;MQ0=0;QD=2.92;SB=-153.13	GT:AD:DP:GL:GQ	0/1:100,18:110:-70.90,-33.15,-412.65:99
-chr1	1520229	.	C	G	412.05	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=121;Dels=0.00;HRun=0;HaplotypeScore=94.26;MQ=43.35;MQ0=0;QD=3.41;SB=-151.44	GT:AD:DP:GL:GQ	0/1:103,18:106:-76.44,-31.95,-372.75:99
-chr1	1520237	.	G	C	91.10	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=128;Dels=0.05;HRun=0;HaplotypeScore=131.86;MQ=42.98;MQ0=0;QD=0.71;SB=13.51	GT:AD:DP:GL:GQ	0/1:106,16:113:-45.55,-33.15,-430.26:99
-chr1	1520238	rs61774873	T	A	718.56	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=125;Dels=0.05;HRun=0;HaplotypeScore=125.70;MQ=43.01;MQ0=0;QD=5.75;SB=-75.62	GT:AD:DP:GL:GQ	0/1:71,41:100:-122.71,-47.57,-247.49:99
-chr1	1520243	.	C	G	225.05	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=0;HaplotypeScore=118.32;MQ=42.36;MQ0=0;QD=1.77;SB=107.39	GT:AD:DP:GL:GQ	0/1:107,20:111:-59.26,-33.47,-404.28:99
-chr1	1520250	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=130;Dels=0.03;HRun=1;HaplotypeScore=70.65;MQ=43.20;MQ0=0;OQ=629.57;QD=4.84;SB=-297.59	GT:AD:DP:GL:GQ	0/1:85,37:107:-98.49,-32.25,-308.33:99
-chr1	1520281	rs61774874	G	C	511.99	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.00;HRun=0;HaplotypeScore=95.68;MQ=43.19;MQ0=0;QD=4.13;SB=-246.08	GT:AD:DP:GL:GQ	0/1:99,25:103:-85.52,-31.04,-362.79:99
-chr1	1520285	.	G	C	387.17	SnpCluster	AC=1;AF=0.50;AN=2;DP=119;Dels=0.01;HRun=0;HaplotypeScore=65.61;MQ=43.42;MQ0=0;QD=3.25;SB=-155.15	GT:AD:DP:GL:GQ	0/1:98,20:100:-71.84,-29.84,-355.29:99
-chr1	1520289	rs62642589	C	G	93.31	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=121;Dels=0.01;HRun=0;HaplotypeScore=35.98;MQ=43.17;MQ0=0;QD=0.77;SB=134.48	GT:AD:DP:GL:GQ	0/1:107,13:109:-45.17,-32.56,-411.19:99
-chr1	1520331	rs28654137	C	G	48.96	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.01;HRun=0;HaplotypeScore=27.98;MQ=47.63;MQ0=0;QD=0.60;SB=18.43	GT:AD:DP:GL:GQ	0/1:72,9:75:-30.78,-22.60,-290.44:81.79
-chr1	1520344	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=73;Dels=0.01;HRun=0;HaplotypeScore=35.55;MQ=46.62;MQ0=0;OQ=147.13;QD=2.02;SB=-55.25	GT:AD:DP:GL:GQ	0/1:57,14:62:-36.39,-18.39,-179.58:99
-chr1	1520377	.	C	G	26.02	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=20.54;MQ=46.26;MQ0=1;QD=0.42;SB=59.22	GT:AD:DP:GL:GQ	0/1:52,10:48:-20.35,-14.47,-182.03:58.84
-chr1	1520381	rs28593368	C	G	11.70	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=9.32;MQ=47.21;MQ0=1;QD=0.18;SB=37.38	GT:AD:DP:GL:GQ	0/1:58,8:56:-21.30,-16.87,-217.45:44.23
-chr1	1520469	rs11488585	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.01;HRun=0;HaplotypeScore=36.86;MQ=43.53;MQ0=4;OQ=2355.10;QD=23.55;SB=-1049.66	GT:AD:DP:GL:GQ	0/1:35,63:89:-265.31,-26.51,-115.33:99
-chr1	1520498	.	G	A	0.22	PASS	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=42.41;MQ0=4;OQ=313.12;QD=3.48;SB=-164.48	GT:AD:DP:GL:GQ	0/1:71,19:76:-57.51,-22.91,-206.14:99
-chr1	1520609	.	G	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=0;HaplotypeScore=16.97;MQ=45.11;MQ0=1;OQ=1017.74;QD=9.51;SB=-327.71	GT:AD:DP:GL:GQ	0/1:72,34:94:-133.38,-28.32,-275.79:99
-chr1	1520627	.	T	C	0.10	PASS	AC=2;AF=1.00;AN=2;DP=106;Dels=0.00;HRun=0;HaplotypeScore=10.65;MQ=46.29;MQ0=2;OQ=3224.03;QD=30.42;SB=-1396.99	GT:AD:DP:GL:GQ	1/1:0,101:93:-329.81,-30.68,-3.83:99
-chr1	1520757	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=47.64;MQ0=6;OQ=89.81;QD=0.88;SB=110.39	GT:AD:DP:GL:GQ	0/1:91,11:89:-39.08,-26.81,-310.80:99
-chr1	1520774	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=99;Dels=0.01;HRun=0;HaplotypeScore=56.31;MQ=48.08;MQ0=6;OQ=62.24;QD=0.63;SB=110.34	GT:AD:DP:GL:GQ	0/1:89,9:83:-34.23,-24.72,-231.51:95.08
-chr1	1520787	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=96;Dels=0.04;HRun=0;HaplotypeScore=27.20;MQ=49.95;MQ0=4;OQ=173.92;QD=1.81;SB=77.51	GT:AD:DP:GL:GQ	0/1:78,14:87:-45.69,-25.01,-305.10:99
-chr1	1520821	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=37.97;MQ=51.43;MQ0=1;OQ=216.93;QD=2.55;SB=101.36	GT:AD:DP:GL:GQ	0/1:69,16:80:-49.07,-24.10,-269.00:99
-chr1	1520848	.	G	A	0.20	PASS	AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=2.89;MQ=50.21;MQ0=2;OQ=302.35;QD=3.44;SB=74.15	GT:AD:DP:GL:GQ	0/1:72,16:76:-56.43,-22.92,-203.92:99
-chr1	1520892	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=1;HaplotypeScore=71.05;MQ=51.39;MQ0=2;OQ=950.76;QD=9.51;SB=-387.75	GT:AD:DP:GL:GQ	0/1:63,37:86:-124.27,-25.91,-211.22:99
-chr1	1520953	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=74;Dels=0.01;HRun=0;HaplotypeScore=47.85;MQ=52.80;MQ0=2;OQ=265.98;QD=3.59;SB=-146.32	GT:AD:DP:GL:GQ	0/1:59,14:61:-47.97,-18.09,-205.99:99
-chr1	1520957	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=21.78;MQ=53.36;MQ0=2;OQ=105.70;QD=1.55;SB=-47.11	GT:AD:DP:GL:GQ	0/1:59,9:55:-30.43,-16.57,-209.84:99
-chr1	1520979	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=45.80;MQ=49.11;MQ0=2;OQ=234.58;QD=3.72;SB=-118.04	GT:AD:DP:GL:GQ	0/1:53,10:50:-41.81,-15.07,-172.68:99
-chr1	1521029	.	C	G	208.12	Indel	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=31.42;MQ=47.45;MQ0=1;QD=3.20;SB=-33.62	GT:AD:DP:GL:GQ	0/1:53,12:61:-42.48,-18.38,-218.36:99
-chr1	1521111	.	C	G	34.71	LowQual	AC=1;AF=0.50;AN=2;DP=75;Dels=0.05;HRun=0;HaplotypeScore=51.94;MQ=49.50;MQ0=5;QD=0.46;SB=-34.07	GT:AD:DP:GL:GQ	0/1:62,9:60:-24.84,-18.09,-231.30:67.54
-chr1	1521139	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=19.29;MQ=49.73;MQ0=4;OQ=471.32;QD=8.42;SB=-237.06	GT:AD:DP:GL:GQ	0/1:38,18:43:-63.38,-12.96,-121.81:99
-chr1	1521149	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=50;Dels=0.04;HRun=0;HaplotypeScore=25.97;MQ=51.25;MQ0=5;OQ=94.80;QD=1.90;SB=0.71	GT:AD:DP:GL:GQ	0/1:42,6:42:-25.43,-12.66,-151.77:99
-chr1	1521416	.	G	A	908.87	Indel	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=49.66;MQ0=7;QD=12.12;SB=-403.37	GT:AD:DP:GL:GQ	0/1:47,28:66:-114.05,-19.88,-141.06:99
-chr1	1521692	.	G	A	0.94	PASS	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=9.14;MQ=58.40;MQ0=0;OQ=1252.37;QD=15.27;SB=-600.00	GT:AD:DP:GL:GQ	0/1:41,41:79:-152.32,-23.80,-150.35:99
-chr1	1521772	rs36210710	A	G	0.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=15.96;MQ=57.04;MQ0=1;OQ=875.12;QD=13.46;SB=-359.37	GT:AD:DP:GL:GQ	0/1:32,33:57:-107.96,-17.17,-110.70:99
-chr1	1522125	rs28569178	A	G	2.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=5.24;MQ=53.41;MQ0=0;OQ=1519.29;QD=31.65;SB=-783.99	GT:AD:DP:GL:GQ	1/1:0,48:43:-155.53,-12.95,-0.01:99
-chr1	1522142	rs35051391	A	C	34.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=4.14;MQ=53.19;MQ0=0;OQ=509.94;QD=11.86;SB=-251.92	GT:AD:DP:GL:GQ	0/1:20,23:38:-65.73,-11.45,-61.61:99
-chr1	1522705	.	C	T	4.71	PASS	AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=50.65;MQ0=0;OQ=133.19;QD=16.65;SB=-79.09	GT:AD:DP:GL:GQ	0/1:3,5:8:-19.01,-2.41,-10.59:81.80
-chr1	1524477	rs11552172	T	C	56.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.17;MQ0=0;OQ=436.12;QD=15.58;SB=-113.68	GT:AD:DP:GL:GQ	0/1:12,16:28:-55.34,-8.44,-45.31:99
-chr1	1527039	rs4075469	A	C	248.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.34;MQ0=0;OQ=696.22;QD=16.58;SB=-340.88	GT:AD:DP:GL:GQ	0/1:16,26:40:-84.95,-12.05,-59.28:99
-chr1	1527300	rs7554569	C	T	296.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=424.42;QD=8.16;SB=-236.55	GT:AD:DP:GL:GQ	0/1:35,17:46:-59.60,-13.87,-96.44:99
-chr1	1527750	.	C	A	254.99	PASS	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.50;MQ0=0;OQ=986.18;QD=16.71;SB=-374.21	GT:AD:DP:GL:GQ	0/1:26,33:55:-118.47,-16.57,-69.65:99
-chr1	1527909	.	G	A	103.61	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.52;MQ0=0;OQ=783.03;QD=16.31;SB=-358.36	GT:AD:DP:GL:GQ	0/1:23,25:47:-95.76,-14.17,-71.60:99
-chr1	1528300	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=3;HaplotypeScore=10.61;MQ=58.05;MQ0=0;OQ=286.83;QD=5.98;SB=62.19	GT:AD:DP:GL:GQ	0/1:26,22:41:-44.32,-12.35,-90.74:99
-chr1	1529232	rs6656591	T	C	65.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=3.39;MQ=56.33;MQ0=0;OQ=1005.79;QD=17.65;SB=-491.70	GT:AD:DP:GL:GQ	0/1:23,34:55:-120.43,-16.57,-83.35:99
-chr1	1529445	rs6691649	G	A	161.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=59.46;MQ0=0;OQ=1057.94;QD=19.59;SB=-480.07	GT:AD:DP:GL:GQ	0/1:20,34:51:-124.45,-15.37,-67.92:99
-chr1	1529817	rs4075275	G	C	15.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=2.13;MQ=58.35;MQ0=0;OQ=1607.65;QD=30.92;SB=-720.33	GT:AD:DP:GL:GQ	1/1:0,52:40:-164.38,-12.07,-0.03:99
-chr1	1530590	.	C	T	27.41	PASS	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=55.36;MQ0=0;OQ=363.07;QD=13.45;SB=-133.59	GT:AD:DP:GL:GQ	0/1:14,13:26:-47.43,-7.84,-42.81:99
-chr1	1530910	.	G	C	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=6.92;MQ=37.58;MQ0=2;OQ=79.86;QD=5.32;SB=-10.00	GT:AD:DP:GL:GQ	0/1:7,8:5:-12.78,-1.51,-7.90:63.88
-chr1	1530912	.	C	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=2;HaplotypeScore=4.15;MQ=38.11;MQ0=2;OQ=71.50;QD=5.11;SB=-6.99	GT:AD:DP:GL:GQ	0/1:4,10:6:-12.24,-1.81,-12.03:99
-chr1	1530952	.	G	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=8.79;MQ=42.16;MQ0=2;OQ=53.35;QD=3.33;SB=-39.44	GT:AD:DP:GL:GQ	0/1:11,5:9:-11.33,-2.71,-25.48:86.19
-chr1	1530975	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=5.18;MQ=46.58;MQ0=0;OQ=57.06;QD=3.57;SB=5.04	GT:AD:DP:GL:GQ	0/1:12,4:12:-12.60,-3.61,-32.43:89.90
-chr1	1531008	.	C	G	10.82	LowQual	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=2;HaplotypeScore=6.64;MQ=46.16;MQ0=1;QD=0.52;SB=-26.85	GT:AD:DP:GL:GQ	0/1:16,5:11:-7.66,-3.33,-32.36:43.28
-chr1	1531060	.	A	C	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=9.36;MQ=36.61;MQ0=1;OQ=116.93;QD=7.31;SB=-3.99	GT:AD:DP:GL:GQ	0/1:5,10:9:-17.69,-2.71,-12.57:98.57
-chr1	1531096	.	C	T	31.46	LowQual	AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=8.94;MQ=35.04;MQ0=1;QD=3.15;SB=-6.99	GT:AD:DP:GL:GQ	0/1:5,5:4:-7.64,-1.21,-6.67:54.60
-chr1	1531214	.	C	T	12.58	LowQual	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=48.08;MQ0=0;QD=0.90;SB=-28.53	GT:AD:DP:GL:GQ	0/1:11,2:10:-7.53,-3.02,-23.43:45.17
-chr1	1531255	.	G	A	2.13	PASS	AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=54.60;MQ0=0;OQ=208.62;QD=17.39;SB=-121.64	GT:AD:DP:GL:GQ	0/1:2,10:8:-26.44,-2.41,-2.60:1.87
-chr1	1531316	.	A	T	48.17	LowQual	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=3.10;MQ=48.85;MQ0=0;QD=2.01;SB=-30.94	GT:AD:DP:GL:GQ	0/1:15,8:14:-12.32,-4.22,-35.65:81.01
-chr1	1531334	.	C	T	13.43	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=4.16;MQ=45.60;MQ0=1;QD=0.56;SB=5.01	GT:AD:DP:GL:GQ	0/1:15,7:11:-7.93,-3.32,-25.96:46.07
-chr1	1531359	.	G	A	17.07	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=4.20;MQ=46.76;MQ0=1;QD=0.74;SB=11.04	GT:AD:DP:GL:GQ	0/1:19,4:19:-10.71,-5.73,-55.15:49.82
-chr1	1531380	.	C	G	42.65	LowQual	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=3;HaplotypeScore=7.66;MQ=46.38;MQ0=2;QD=1.42;SB=-45.68	GT:AD:DP:GL:GQ	0/1:23,7:24:-14.78,-7.24,-85.75:75.49
-chr1	1531419	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=2;HaplotypeScore=5.63;MQ=45.92;MQ0=1;OQ=63.73;QD=3.03;SB=23.10	GT:AD:DP:GL:GQ	0/1:16,5:18:-15.09,-5.43,-50.86:96.57
-chr1	1531527	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=2;HaplotypeScore=3.70;MQ=32.41;MQ0=1;OQ=75.08;QD=3.75;SB=-44.95	GT:AD:DP:GL:GQ	0/1:9,10:9:-13.51,-2.71,-17.78:99
-chr1	1531545	.	G	C	27.47	LowQual	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=8.08;MQ=36.24;MQ0=1;QD=1.37;SB=-32.85	GT:AD:DP:GL:GQ	0/1:18,2:9:-8.74,-2.71,-27.23:60.30
-chr1	1531547	.	C	G	25.49	LowQual	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=2;HaplotypeScore=8.42;MQ=36.81;MQ0=1;QD=1.34;SB=-27.40	GT:AD:DP:GL:GQ	0/1:14,5:6:-7.64,-1.81,-15.17:58.31
-chr1	1532873	rs9442420	T	C	73.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.50;MQ0=0;OQ=1279.49;QD=27.81;SB=-597.57	GT:AD:DP:GL:GQ	1/1:0,46:41:-131.57,-12.37,-0.04:99
-chr1	1533487	rs61774903	T	C	6.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=59.07;MQ0=0;OQ=267.71;QD=10.71;SB=-22.90	GT:AD:DP:GL:GQ	0/1:12,13:23:-36.99,-6.93,-45.73:99
-chr1	1533846	.	C	A	150.54	PASS	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=607.30;QD=13.20;SB=-294.38	GT:AD:DP:GL:GQ	0/1:23,23:45:-77.57,-13.56,-81.22:99
-chr1	1534313	.	G	A	286.31	PASS	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.20;MQ0=0;OQ=679.07;QD=15.09;SB=-355.53	GT:AD:DP:GL:GQ	0/1:22,23:43:-84.16,-12.97,-66.20:99
-chr1	1535152	rs6671612	G	T	108.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=2.91;MQ=57.71;MQ0=0;OQ=838.64;QD=11.98;SB=-304.64	GT:AD:DP:GL:GQ	0/1:41,29:64:-106.43,-19.29,-110.69:99
-chr1	1536167	rs11492279	C	T	248.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.77;MQ=60.00;MQ0=0;OQ=1040.79;QD=15.31;SB=-440.43	GT:AD:DP:GL:GQ	0/1:36,32:64:-126.65,-19.29,-102.67:99
-chr1	1536812	rs4612573	T	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.03;HRun=1;HaplotypeScore=39.15;MQ=49.08;MQ0=0;OQ=1478.03;QD=23.09;SB=-556.56	GT:AD:DP:GL:GQ	1/1:5,57:50:-162.89,-15.07,-11.50:35.64
-chr1	1537429	rs4369171	A	G	1.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=7.54;MQ=57.32;MQ0=0;OQ=2121.87;QD=33.68;SB=-744.31	GT:AD:DP:GL:GQ	1/1:0,62:59:-215.79,-17.77,-0.02:99
-chr1	1537803	.	G	T	52.70	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=13;HaplotypeScore=28.28;MQ=58.09;MQ0=1;QD=0.71;SB=63.90	GT:AD:DP:GL:GQ	0/1:60,13:55:-25.14,-16.58,-155.96:85.54
-chr1	1537805	.	T	C	135.64	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=41.12;MQ=58.24;MQ0=1;QD=2.02;SB=15.89	GT:AD:DP:GL:GQ	0/1:57,10:56:-33.73,-16.88,-176.73:99
-chr1	1538333	.	A	G	136.38	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=58.86;MQ0=0;OQ=748.93;QD=13.87;SB=-356.58	GT:AD:DP:GL:GQ	0/1:27,27:53:-94.15,-15.98,-99.69:99
-chr1	1538565	rs9442431	T	C	829.64	Indel	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=2;HaplotypeScore=7.58;MQ=50.06;MQ0=1;QD=21.83;SB=-151.73	GT:AD:DP:GL:GQ	1/1:0,37:28:-86.58,-8.45,-0.03:84.18
-chr1	1538664	rs9442430	T	C	1.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.01;HRun=1;HaplotypeScore=8.39;MQ=59.12;MQ0=0;OQ=2182.53;QD=31.63;SB=-555.08	GT:AD:DP:GL:GQ	1/1:0,68:67:-221.88,-20.20,-0.05:99
-chr1	1539012	rs34501155	C	T	24.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=2;HaplotypeScore=0.10;MQ=59.44;MQ0=0;OQ=1523.49;QD=20.31;SB=-698.38	GT:AD:DP:GL:GQ	0/1:29,46:74:-177.93,-22.30,-104.96:99
-chr1	1539217	rs12066	G	A	112.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2269.66;QD=38.47;SB=-1077.37	GT:AD:DP:GL:GQ	1/1:0,59:57:-230.57,-17.17,-0.02:99
-chr1	1539583	.	C	T	13.58	PASS	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=2;HaplotypeScore=2.17;MQ=59.69;MQ0=0;OQ=849.58;QD=14.16;SB=-408.41	GT:AD:DP:GL:GQ	0/1:34,26:60:-106.31,-18.07,-125.62:99
-chr1	1540565	rs4648611	A	G	1.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=2;HaplotypeScore=4.13;MQ=58.95;MQ0=0;OQ=632.46;QD=28.75;SB=-329.75	GT:AD:DP:GL:GQ	1/1:0,22:20:-66.85,-6.03,-0.02:60.13
-chr1	1541790	rs7418389	T	C	9.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=60.00;MQ0=0;OQ=644.37;QD=28.02;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,23:21:-68.04,-6.33,-0.01:63.14
-chr1	1542618	rs6604985	T	C	187.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.49;MQ0=0;OQ=2789.66;QD=34.02;SB=-860.05	GT:AD:DP:GL:GQ	1/1:0,82:81:-282.58,-24.40,-0.03:99
-chr1	1543361	rs28546565	G	A	262.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=59.46;MQ0=0;OQ=627.76;QD=14.60;SB=-285.20	GT:AD:DP:GL:GQ	0/1:20,23:40:-78.11,-12.05,-70.94:99
-chr1	1543456	rs28623434	C	G	8.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=2.93;MQ=59.20;MQ0=0;OQ=2332.23;QD=40.21;SB=-1030.14	GT:AD:DP:GL:GQ	1/1:0,58:55:-236.83,-16.57,-0.02:99
-chr1	1543533	rs9442410	G	C	82.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=2713.47;QD=43.07;SB=-1108.14	GT:AD:DP:GL:GQ	1/1:0,63:62:-274.95,-18.68,-0.02:99
-chr1	1544225	rs9442425	G	A	33.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.11;MQ=59.22;MQ0=0;OQ=1855.01;QD=38.65;SB=-869.17	GT:AD:DP:GL:GQ	1/1:0,48:47:-189.10,-14.16,-0.01:99
-chr1	1545229	rs9329576	T	C	4.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=2.58;MQ=60.00;MQ0=0;OQ=1266.55;QD=28.15;SB=-625.18	GT:AD:DP:GL:GQ	1/1:0,45:39:-130.27,-11.76,-0.03:99
-chr1	1545852	rs7543265	G	A	8.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=6.32;MQ=58.20;MQ0=0;OQ=611.29;QD=15.67;SB=-238.27	GT:AD:DP:GL:GQ	0/1:17,20:35:-74.97,-10.56,-46.23:99
-chr1	1546595	rs34983251	G	A	45.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=2.69;MQ=59.23;MQ0=0;OQ=349.98;QD=11.67;SB=-133.57	GT:AD:DP:GL:GQ	0/1:16,14:26:-46.12,-7.83,-51.50:99
-chr1	1547538	rs28710339	G	C	59.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=3.45;MQ=58.50;MQ0=0;OQ=866.08;QD=15.47;SB=-347.43	GT:AD:DP:GL:GQ	0/1:31,25:53:-105.89,-16.00,-107.63:99
-chr1	1547753	.	C	T	52.88	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.60;MQ0=0;OQ=1139.64;QD=19.99;SB=-512.06	GT:AD:DP:GL:GQ	0/1:22,35:54:-133.53,-16.28,-63.46:99
-chr1	1548655	rs12755088	T	C	97.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=439.27;QD=24.40;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,18:16:-47.54,-4.84,-0.03:48.08
-chr1	1548983	.	C	G	40.73	LowQual	AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=5;HaplotypeScore=1.58;MQ=47.12;MQ0=0;QD=6.79;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,5:2:-7.48,-0.61,-0.00:6.02
-chr1	1549329	rs28617190	G	A	97.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=1.74;MQ=57.37;MQ0=0;OQ=547.08;QD=16.09;SB=-253.53	GT:AD:DP:GL:GQ	0/1:16,18:32:-67.63,-9.64,-54.05:99
-chr1	1549834	rs12748433	C	T	442.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.23;MQ0=0;OQ=1400.65;QD=37.86;SB=-569.32	GT:AD:DP:GL:GQ	1/1:0,37:36:-143.66,-10.85,-0.01:99
-chr1	1549963	rs28441650	G	A	319.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.05;MQ0=0;OQ=739.99;QD=15.10;SB=-342.91	GT:AD:DP:GL:GQ	0/1:25,24:48:-91.75,-14.47,-81.34:99
-chr1	1551048	.	G	A	13.72	PASS	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=55.20;MQ0=0;OQ=331.40;QD=13.81;SB=-96.94	GT:AD:DP:GL:GQ	0/1:12,12:21:-42.75,-6.33,-33.17:99
-chr1	1551194	.	G	A	9.75	PASS	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=59.45;MQ0=0;OQ=497.08;QD=14.62;SB=-108.95	GT:AD:DP:GL:GQ	0/1:18,16:33:-62.94,-9.95,-55.65:99
-chr1	1552758	rs12735861	C	T	11.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=56.58;MQ0=0;OQ=143.44;QD=15.94;SB=-6.99	GT:AD:DP:GL:GQ	0/1:3,6:8:-20.04,-2.41,-9.16:67.50
-chr1	1553652	.	C	A	57.28	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=59.52;MQ0=0;OQ=736.76;QD=15.35;SB=-347.43	GT:AD:DP:GL:GQ	0/1:23,25:44:-90.22,-13.26,-60.84:99
-chr1	1554057	rs3935032	C	T	0.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=59.31;MQ0=0;OQ=580.92;QD=21.52;SB=-104.60	GT:AD:DP:GL:GQ	0/1:9,18:26:-69.21,-7.83,-32.29:99
-chr1	1555931	rs28730454	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=7;HaplotypeScore=0.32;MQ=55.21;MQ0=0;OQ=59.16;QD=11.83;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,5:3:-9.41,-0.90,-0.00:9.02
-chr1	1556023	rs28464684	T	C	13.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=73.72;QD=24.57;SB=-40.68	GT:AD:DP:GL:GQ	1/1:0,3:3:-10.86,-0.90,-0.00:9.03
-chr1	1556952	rs28451771	T	C	12.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=601.05;QD=31.63;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,19:19:-63.70,-5.72,-0.01:57.14
-chr1	1561503	rs61774909	G	T	0.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.92;MQ=9.65;MQ0=29;OQ=78.96;QD=2.47;SB=-10.00	GT:AD:DP:GL:GQ	1/1:16,16:3:-11.38,-0.90,-0.00:9.03
-chr1	1563882	rs61774911	A	G	1.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.88;MQ=39.06;MQ0=5;OQ=124.38;QD=2.76;SB=-85.66	GT:AD:DP:GL:GQ	0/1:34,10:35:-26.27,-10.55,-104.24:99
-chr1	1563939	rs9442413	G	A	8.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=40.26;MQ0=2;OQ=315.22;QD=4.50;SB=-153.56	GT:AD:DP:GL:GQ	0/1:51,19:59:-52.60,-17.79,-143.72:99
-chr1	1564183	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=20;HaplotypeScore=14.98;MQ=46.49;MQ0=5;OQ=64.66;QD=1.80;SB=35.13	GT:AD:DP:GL:GQ	0/1:31,5:28:-18.18,-8.44,-79.86:97.49
-chr1	1564572	rs28401288	T	G	29.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=41.92;MQ0=1;OQ=1158.48;QD=27.58;SB=-476.97	GT:AD:DP:GL:GQ	1/1:0,42:35:-119.45,-10.55,-0.02:99
-chr1	1565479	rs28394074	T	C	98.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=12.86;MQ0=16;OQ=207.25;QD=7.68;SB=-36.94	GT:AD:DP:GL:GQ	1/1:0,27:7:-24.31,-2.11,-0.00:21.06
-chr1	1565699	.	C	G	5.41	PASS	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=1;HaplotypeScore=2.34;MQ=26.47;MQ0=10;OQ=657.44;QD=8.65;SB=-346.42	GT:AD:DP:GL:GQ	0/1:55,21:62:-87.73,-18.71,-164.80:99
-chr1	1566499	rs3765908	G	A	18.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.75;MQ=37.81;MQ0=3;OQ=1730.84;QD=29.34;SB=-752.15	GT:AD:DP:GL:GQ	1/1:8,51:54:-192.27,-16.27,-15.84:4.30
-chr1	1566866	rs3819995	C	T	33.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=17.30;MQ0=34;OQ=418.63;QD=7.34;SB=-10.00	GT:AD:DP:GL:GQ	0/1:21,36:18:-50.57,-5.43,-18.99:99
-chr1	1567043	rs1137001	C	T	0.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=9.65;MQ0=38;OQ=66.77;QD=1.34;SB=-10.00	GT:AD:DP:GL:GQ	0/1:35,15:6:-11.77,-1.81,-10.91:90.99
-chr1	1569585	rs61774912	C	T	0.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=1;HaplotypeScore=8.98;MQ=13.84;MQ0=43;OQ=132.92;QD=1.51;SB=-3.99	GT:AD:DP:GL:GQ	0/1:64,24:26:-24.41,-7.83,-74.67:99
-chr1	1569917	rs6688326	C	A	0.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=2.45;MQ=26.34;MQ0=26;OQ=227.69;QD=3.04;SB=-87.75	GT:AD:DP:GL:GQ	0/1:58,17:44:-39.31,-13.26,-117.30:99
-chr1	1570601	rs4648767	T	A	243.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=24.85;MQ0=18;OQ=1006.84;QD=11.57;SB=-380.53	GT:AD:DP:GL:GQ	0/1:42,45:58:-121.45,-17.48,-87.58:99
-chr1	1570928	.	G	C	0.90	PASS	AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=0;HaplotypeScore=3.62;MQ=32.27;MQ0=14;OQ=845.01;QD=5.52;SB=-333.79	GT:AD:DP:GL:GQ	0/1:113,40:123:-124.85,-37.07,-408.45:99
-chr1	1570959	.	C	T	0.27	PASS	AC=1;AF=0.50;AN=2;DP=165;Dels=0.00;HRun=2;HaplotypeScore=4.89;MQ=34.90;MQ0=12;OQ=2272.40;QD=13.77;SB=-727.55	GT:AD:DP:GL:GQ	0/1:85,80:144:-273.90,-43.38,-268.43:99
-chr1	1571421	rs61774913	C	T	442.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.06;MQ0=31;OQ=744.27;QD=14.31;SB=-218.78	GT:AD:DP:GL:GQ	1/1:0,52:19:-78.02,-5.72,-0.00:57.19
-chr1	1571449	rs61774914	T	C	385.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=19.48;MQ0=37;OQ=993.50;QD=14.19;SB=-324.14	GT:AD:DP:GL:GQ	1/1:0,70:28:-102.94,-8.43,-0.01:84.26
-chr1	1571467	.	G	A	0.11	PASS	AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=5.46;MQ=31.83;MQ0=25;OQ=330.51;QD=3.76;SB=-146.19	GT:AD:DP:GL:GQ	0/1:69,19:55:-52.91,-16.58,-135.58:99
-chr1	1571576	.	A	C	50.03	PASS	AC=2;AF=1.00;AN=2;DP=93;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=35.58;MQ0=13;OQ=1974.59;QD=21.23;SB=-847.56	GT:AD:DP:GL:GQ	1/1:0,61:79:-282.59,-90.56,-81.54:90.13
-chr1	1571744	rs61774916	T	C	0.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.00;HRun=0;HaplotypeScore=9.99;MQ=43.65;MQ0=18;OQ=618.53;QD=4.99;SB=-195.46	GT:AD:DP:GL:GQ	0/1:91,33:103:-96.17,-31.03,-294.76:99
-chr1	1571789	rs61774917	G	T	99.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=114;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=40.38;MQ0=17;OQ=858.73;QD=7.53;SB=-166.41	GT:AD:DP:GL:GQ	0/1:66,48:94:-117.47,-28.31,-223.12:99
-chr1	1571821	rs4279785	T	C	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=125;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=33.09;MQ0=22;OQ=74.70;QD=0.60;SB=13.40	GT:AD:DP:GL:GQ	0/1:103,22:85:-36.35,-25.60,-306.33:99
-chr1	1571969	rs4648753	T	C	252.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.21;MQ0=23;OQ=2308.47;QD=23.08;SB=-928.73	GT:AD:DP:GL:GQ	1/1:1,99:73:-234.50,-22.02,-0.07:99
-chr1	1572065	rs61774918	C	T	271.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=40.98;MQ0=5;OQ=1993.46;QD=16.08;SB=-715.20	GT:AD:DP:GL:GQ	0/1:57,67:116:-237.58,-34.95,-201.11:99
-chr1	1572318	rs61774919	G	A	28.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=173;Dels=0.00;HRun=0;HaplotypeScore=4.27;MQ=26.57;MQ0=15;OQ=1639.76;QD=9.48;SB=-550.56	GT:AD:DP:GL:GQ	0/1:104,69:121:-203.75,-36.49,-222.67:99
-chr1	1572479	.	T	C	0.14	PASS	AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=45.14;MQ0=0;OQ=1750.04;QD=12.24;SB=-888.87	GT:AD:DP:GL:GQ	0/1:83,60:141:-220.76,-42.47,-332.08:99
-chr1	1572504	.	T	C	0.71	PASS	AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=1.61;MQ=42.33;MQ0=3;OQ=1049.29;QD=7.72;SB=-546.16	GT:AD:DP:GL:GQ	0/1:84,52:129:-147.09,-38.88,-337.66:99
-chr1	1572657	rs4648754	C	A	97.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=118;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=39.40;MQ0=0;OQ=4131.60;QD=35.01;SB=-1448.13	GT:AD:DP:GL:GQ	1/1:1,117:114:-412.16,-34.34,-0.04:99
-chr1	1572704	rs61774920	A	G	0.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=29.04;MQ0=13;OQ=131.71;QD=1.78;SB=23.25	GT:AD:DP:GL:GQ	0/1:54,20:56:-33.33,-16.87,-184.69:99
-chr1	1572707	rs61774921	G	T	0.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=28.52;MQ0=13;OQ=177.56;QD=2.50;SB=-37.61	GT:AD:DP:GL:GQ	0/1:52,19:55:-37.61,-16.57,-159.55:99
-chr1	1572743	rs3820000	G	C	38.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=26.84;MQ0=19;OQ=650.68;QD=7.75;SB=38.16	GT:AD:DP:GL:GQ	0/1:50,34:58:-85.85,-17.49,-156.24:99
-chr1	1572824	rs3820001	G	C	184.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=41.82;MQ0=4;OQ=1359.68;QD=17.43;SB=-597.25	GT:AD:DP:GL:GQ	0/1:31,47:67:-159.47,-20.22,-110.10:99
-chr1	1572866	rs61776849	C	T	39.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=4.48;MQ=49.73;MQ0=0;OQ=1155.72;QD=12.70;SB=-351.36	GT:AD:DP:GL:GQ	0/1:50,41:84:-144.17,-25.32,-161.47:99
-chr1	1572951	.	A	G	0.08	PASS	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=47.33;MQ0=7;OQ=238.29;QD=2.91;SB=26.27	GT:AD:DP:GL:GQ	0/1:60,22:73:-49.11,-21.99,-235.06:99
-chr1	1573358	rs61774952	T	C	32.21	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=47.33;MQ0=8;QD=0.37;SB=67.42	GT:AD:DP:GL:GQ	0/1:70,16:71:-27.89,-21.39,-252.84:65.04
-chr1	1573532	.	C	T	35.47	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=10.41;MQ0=15;QD=1.97;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,3:3:-7.73,-0.90,-3.80:28.93
-chr1	1573550	.	T	C	24.36	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=33.97;MQ0=17;QD=0.72;SB=-17.89	GT:AD:DP:GL:GQ	0/1:23,11:14:-9.94,-4.22,-42.08:57.18
-chr1	1573618	.	C	T	2.54	PASS	AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=5.35;MQ=45.15;MQ0=15;OQ=814.16;QD=7.75;SB=-232.64	GT:AD:DP:GL:GQ	0/1:66,38:82:-109.43,-24.73,-173.93:99
-chr1	1573625	.	G	A	3.56	PASS	AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=45.17;MQ0=14;OQ=654.74;QD=6.18;SB=-207.09	GT:AD:DP:GL:GQ	0/1:70,36:84:-94.09,-25.34,-189.03:99
-chr1	1573865	rs6691927	A	G	0.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=13.93;MQ=47.63;MQ0=8;OQ=1026.45;QD=17.40;SB=-411.69	GT:AD:DP:GL:GQ	0/1:13,46:46:-119.80,-13.87,-37.07:99
-chr1	1573965	rs28525262	G	A	126.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=48.13;MQ0=7;OQ=3091.70;QD=33.97;SB=-1505.87	GT:AD:DP:GL:GQ	1/1:7,83:80:-316.25,-24.10,-3.49:99
-chr1	1573980	rs4648756	G	C	18.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=4.39;MQ=47.15;MQ0=6;OQ=3392.36;QD=38.99;SB=-1642.01	GT:AD:DP:GL:GQ	1/1:0,87:79:-338.24,-23.81,-0.03:99
-chr1	1574055	rs4648606	G	A	59.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=37.73;MQ0=7;OQ=2424.32;QD=33.21;SB=-1231.00	GT:AD:DP:GL:GQ	1/1:0,72:61:-246.03,-18.38,-0.02:99
-chr1	1574081	rs4648607	T	C	84.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=40.76;MQ0=4;OQ=2240.23;QD=31.55;SB=-1072.45	GT:AD:DP:GL:GQ	1/1:0,71:63:-227.63,-18.98,-0.02:99
-chr1	1574087	rs4648757	G	C	98.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=43.14;MQ0=1;OQ=2791.35;QD=39.31;SB=-1268.99	GT:AD:DP:GL:GQ	1/1:0,71:65:-282.74,-19.59,-0.02:99
-chr1	1574123	.	A	C	149.77	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=169.77;MQ=39.72;MQ0=1;QD=1.63;SB=83.29	GT:AD:DP:GL:GQ	0/1:79,13:73:-40.25,-21.99,-225.95:99
-chr1	1574124	.	A	G	50.98	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=0;HaplotypeScore=170.51;MQ=39.99;MQ0=1;QD=0.55;SB=86.31	GT:AD:DP:GL:GQ	0/1:80,13:72:-30.08,-21.70,-250.90:83.81
-chr1	1574131	.	A	G	472.59	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=2;HaplotypeScore=66.93;MQ=41.08;MQ0=1;QD=5.25;SB=86.31	GT:AD:DP:GL:GQ	0/1:61,29:78:-74.04,-23.50,-234.93:99
-chr1	1574135	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=78.57;MQ=41.20;MQ0=1;OQ=155.65;QD=1.75;SB=86.32	GT:AD:DP:GL:GQ	0/1:76,13:71:-40.23,-21.39,-240.65:99
-chr1	1574143	.	A	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=43.74;MQ0=1;OQ=78.06;QD=1.07;SB=89.31	GT:AD:DP:GL:GQ	0/1:60,13:65:-30.68,-19.59,-219.52:99
-chr1	1574152	.	C	T	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=43.30;MQ0=0;OQ=130.78;QD=1.92;SB=41.52	GT:AD:DP:GL:GQ	0/1:58,10:59:-34.15,-17.79,-160.93:99
-chr1	1574339	.	T	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=12.88;MQ=42.39;MQ0=0;OQ=429.14;QD=5.50;SB=104.35	GT:AD:DP:GL:GQ	0/1:59,19:76:-69.09,-22.90,-217.44:99
-chr1	1574367	rs12749208	C	T	7.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=1.32;MQ=36.29;MQ0=0;OQ=733.94;QD=10.48;SB=80.18	GT:AD:DP:GL:GQ	0/1:43,27:66:-96.58,-19.90,-132.61:99
-chr1	1574398	rs12756960	A	G	17.43	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=34.26;MQ0=0;QD=0.28;SB=39.57	GT:AD:DP:GL:GQ	0/1:29,33:32:-14.67,-9.65,-103.72:50.18
-chr1	1574404	rs12756961	A	T	204.46	Indel	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=35.46;MQ0=0;QD=3.01;SB=-19.65	GT:AD:DP:GL:GQ	0/1:32,36:41:-36.08,-12.35,-112.04:99
-chr1	1574410	rs12749336	C	G	884.89	Indel	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=10.32;MQ=35.72;MQ0=0;QD=12.82;SB=-17.81	GT:AD:DP:GL:GQ	0/1:40,29:35:-102.33,-10.56,-39.37:99
-chr1	1574434	rs61774954	A	C	428.65	DPFilter;Indel	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=8.25;MQ=34.95;MQ0=1;QD=6.30;SB=56.20	GT:AD:DP:GL:GQ	0/1:39,29:57:-63.32,-17.18,-124.62:99
-chr1	1574437	rs61774955	A	C	431.78	DPFilter;Indel	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=7.93;MQ=34.95;MQ0=1;QD=6.35;SB=56.19	GT:AD:DP:GL:GQ	0/1:38,30:51:-61.82,-15.36,-118.50:99
-chr1	1574456	rs12749364	C	A	1380.74	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=20.46;MQ=37.20;MQ0=1;QD=17.26;SB=-577.01	GT:AD:DP:GL:GQ	1/1:30,50:46:-152.08,-13.86,-10.42:34.36
-chr1	1574458	.	G	C	45.27	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=79;Dels=0.01;HRun=0;HaplotypeScore=10.44;MQ=37.76;MQ0=1;QD=0.57;SB=71.27	GT:AD:DP:GL:GQ	0/1:52,26:51:-22.87,-15.06,-200.14:78.10
-chr1	1574459	.	G	A	19.52	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=78;Dels=0.01;HRun=1;HaplotypeScore=9.38;MQ=37.85;MQ0=1;QD=0.25;SB=68.24	GT:AD:DP:GL:GQ	0/1:50,27:51:-20.29,-15.06,-165.60:52.31
-chr1	1574490	.	C	T	446.32	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=13.97;MQ=40.46;MQ0=1;QD=6.11;SB=62.20	GT:AD:DP:GL:GQ	0/1:48,25:59:-65.69,-17.77,-151.07:99
-chr1	1574491	.	A	G	363.54	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=14.98;MQ=40.79;MQ0=1;QD=4.91;SB=65.24	GT:AD:DP:GL:GQ	0/1:48,26:58:-57.11,-17.48,-164.32:99
-chr1	1574495	.	G	A	435.54	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=16.96;MQ=40.97;MQ0=1;QD=5.73;SB=65.16	GT:AD:DP:GL:GQ	0/1:50,26:61:-65.23,-18.39,-146.68:99
-chr1	1574611	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=41.66;MQ0=2;OQ=80.08;QD=1.13;SB=68.24	GT:AD:DP:GL:GQ	0/1:54,17:60:-29.38,-18.09,-195.87:99
-chr1	1574622	.	G	A	0.30	PASS	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=40.91;MQ0=2;OQ=251.34;QD=3.44;SB=59.11	GT:AD:DP:GL:GQ	0/1:55,18:61:-46.81,-18.39,-160.50:99
-chr1	1574627	.	C	T	0.19	PASS	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.69;MQ=42.21;MQ0=2;OQ=221.98;QD=2.88;SB=74.24	GT:AD:DP:GL:GQ	0/1:61,16:67:-45.68,-20.20,-184.31:99
-chr1	1574705	rs12753686	C	T	533.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=47.26;MQ0=1;OQ=2577.15;QD=38.46;SB=-1301.71	GT:AD:DP:GL:GQ	1/1:1,66:64:-261.31,-19.28,-0.01:99
-chr1	1574781	rs12753729	C	T	0.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=7.51;MQ=55.74;MQ0=0;OQ=2039.46;QD=37.77;SB=-910.24	GT:AD:DP:GL:GQ	1/1:1,53:52:-207.55,-15.67,-0.02:99
-chr1	1575120	rs4648758	A	G	435.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.79;MQ0=0;OQ=1070.30;QD=28.93;SB=-511.19	GT:AD:DP:GL:GQ	1/1:0,37:35:-110.65,-10.56,-0.04:99
-chr1	1575210	rs4648760	T	C	43.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=63.90;MQ0=0;OQ=1693.31;QD=34.56;SB=-784.12	GT:AD:DP:GL:GQ	1/1:0,49:49:-172.94,-14.76,-0.02:99
-chr1	1575251	rs4648761	A	G	5.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=60.80;MQ0=0;OQ=1436.67;QD=28.17;SB=-671.85	GT:AD:DP:GL:GQ	1/1:0,51:45:-147.29,-13.57,-0.04:99
-chr1	1575460	rs7531938	A	G	536.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.20;MQ0=0;OQ=2059.81;QD=30.29;SB=-875.65	GT:AD:DP:GL:GQ	1/1:0,68:66:-209.63,-19.91,-0.06:99
-chr1	1575505	rs3936009	G	T	209.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=57.75;MQ0=0;OQ=2310.00;QD=35.54;SB=-1127.37	GT:AD:DP:GL:GQ	1/1:0,65:65:-234.60,-19.58,-0.02:99
-chr1	1576615	rs11486023	T	C	106.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=57.19;MQ0=0;OQ=1526.39;QD=31.15;SB=-484.14	GT:AD:DP:GL:GQ	1/1:0,49:47:-156.26,-14.17,-0.04:99
-chr1	1577178	rs4648762	A	G	161.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=54.74;MQ0=0;OQ=2251.82;QD=30.85;SB=-761.70	GT:AD:DP:GL:GQ	1/1:0,72:69:-228.82,-20.80,-0.05:99
-chr1	1578533	rs61774958	G	A	209.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=136;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.20;MQ0=11;OQ=1051.54;QD=7.73;SB=-56.39	GT:AD:DP:GL:GQ	0/1:86,50:122:-145.19,-36.75,-299.83:99
-chr1	1578580	rs61774959	G	A	15.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=103;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=42.73;MQ0=4;OQ=297.29;QD=2.89;SB=-52.85	GT:AD:DP:GL:GQ	0/1:73,30:83:-58.01,-25.00,-251.41:99
-chr1	1578600	rs61776760	C	T	0.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=43.98;MQ0=2;OQ=158.49;QD=1.69;SB=-47.28	GT:AD:DP:GL:GQ	0/1:69,25:74:-41.42,-22.29,-233.46:99
-chr1	1579194	rs28530622	C	G	155.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.72;MQ0=1;OQ=430.39;QD=33.11;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,13:10:-46.62,-3.01,-0.00:30.10
-chr1	1579428	rs61776762	A	G	153.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.52;MQ0=1;OQ=97.37;QD=13.91;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,7:4:-13.27,-1.21,-0.00:12.02
-chr1	1580015	rs11486024	G	A	46.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=22.93;MQ0=7;OQ=160.84;QD=5.96;SB=11.04	GT:AD:DP:GL:GQ	0/1:15,12:15:-23.90,-4.53,-24.75:99
-chr1	1580190	rs7547516	A	G	298.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=32.87;MQ0=6;OQ=291.00;QD=13.23;SB=-79.37	GT:AD:DP:GL:GQ	1/1:0,22:11:-32.70,-3.32,-0.02:33.05
-chr1	1580389	rs9329573	G	C	27.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=38.23;MQ0=0;OQ=1419.74;QD=36.40;SB=-378.04	GT:AD:DP:GL:GQ	1/1:0,39:37:-145.59,-11.17,-0.03:99
-chr1	1580438	rs9661285	G	A	38.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=39.42;MQ0=4;OQ=1274.78;QD=31.87;SB=-484.63	GT:AD:DP:GL:GQ	1/1:2,38:33:-131.07,-9.94,-0.01:99
-chr1	1580544	rs9661500	G	A	46.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=56.47;MQ0=0;OQ=1331.19;QD=35.03;SB=-445.09	GT:AD:DP:GL:GQ	1/1:0,38:35:-136.72,-10.55,-0.02:99
-chr1	1581642	.	C	T	0.06	PASS	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.20;MQ=10.78;MQ0=31;OQ=96.64;QD=2.06;SB=-42.54	GT:AD:DP:GL:GQ	0/1:28,19:6:-14.76,-1.81,-6.20:43.86
-chr1	1581652	rs61776763	A	G	3.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=2.07;MQ=12.19;MQ0=23;OQ=234.90;QD=5.87;SB=-48.96	GT:AD:DP:GL:GQ	1/1:0,40:8:-27.08,-2.41,-0.00:24.06
-chr1	1581732	.	C	T	10.55	PASS	AC=2;AF=1.00;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.72;MQ0=12;OQ=388.23;QD=16.18;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,24:11:-42.41,-3.31,-0.00:33.10
-chr1	1581758	rs61776764	C	G	0.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=4.17;MQ=24.63;MQ0=12;OQ=1218.98;QD=26.50;SB=-184.87	GT:AD:DP:GL:GQ	1/1:2,44:29:-125.50,-8.74,-0.02:87.29
-chr1	1582007	rs28625763	T	C	180.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.96;MQ0=0;OQ=1011.19;QD=29.74;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,34:31:-104.72,-9.34,-0.02:93.23
-chr1	1582130	rs4648770	T	G	609.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=44.32;MQ0=0;OQ=2027.74;QD=33.24;SB=-1018.12	GT:AD:DP:GL:GQ	1/1:1,60:58:-206.38,-17.47,-0.02:99
-chr1	1582744	rs4648774	A	C	3.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=4.26;MQ=37.79;MQ0=0;OQ=1971.73;QD=29.87;SB=-941.08	GT:AD:DP:GL:GQ	1/1:1,65:56:-200.78,-16.87,-0.02:99
-chr1	1582886	rs1062088	G	C	0.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=28.33;MQ0=1;OQ=872.58;QD=39.66;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,22:20:-90.85,-6.03,-0.01:60.20
-chr1	1584178	rs1061892	C	T	196.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=53.48;MQ0=0;OQ=3220.76;QD=38.34;SB=-1363.82	GT:AD:DP:GL:GQ	1/1:0,84:80:-325.67,-24.10,-0.02:99
-chr1	1584256	rs6659270	T	A	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=6;HaplotypeScore=1.24;MQ=50.39;MQ0=3;OQ=904.07;QD=12.05;SB=-396.42	GT:AD:DP:GL:GQ	0/1:40,35:71:-115.08,-21.39,-150.96:99
-chr1	1584361	rs7416520	C	T	137.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=54.09;MQ0=1;OQ=651.60;QD=13.86;SB=-179.69	GT:AD:DP:GL:GQ	0/1:25,22:41:-80.80,-12.36,-66.61:99
-chr1	1585061	rs4307513	A	G	66.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=51.44;MQ0=9;OQ=1311.89;QD=23.85;SB=-662.93	GT:AD:DP:GL:GQ	1/1:0,55:42:-134.81,-12.67,-0.04:99
-chr1	1585263	rs4313339	A	G	2.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=25.65;MQ0=5;OQ=594.23;QD=25.84;SB=-123.88	GT:AD:DP:GL:GQ	1/1:0,23:18:-63.01,-5.42,-0.01:54.15
-chr1	1585730	rs4443835	C	A	38.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=31.44;MQ0=8;OQ=878.16;QD=23.73;SB=-366.86	GT:AD:DP:GL:GQ	1/1:0,37:25:-91.41,-7.53,-0.01:75.22
-chr1	1586059	rs1109644	C	T	45.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=26.30;MQ0=10;OQ=1336.40;QD=26.73;SB=-334.34	GT:AD:DP:GL:GQ	1/1:3,47:35:-137.24,-10.55,-0.01:99
-chr1	1586167	rs1109645	G	A	15.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=25.64;MQ0=10;OQ=920.81;QD=25.58;SB=-127.66	GT:AD:DP:GL:GQ	1/1:5,31:24:-95.67,-7.23,-0.01:72.23
-chr1	1586837	rs4074020	C	T	96.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=59.56;MQ0=0;OQ=1972.50;QD=37.93;SB=-886.69	GT:AD:DP:GL:GQ	1/1:0,52:51:-200.86,-15.37,-0.02:99
-chr1	1588296	.	A	C	37.76	DPFilter;Indel;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=3.93;MQ=44.22;MQ0=1;QD=2.36;SB=20.08	GT:AD:DP:GL:GQ	0/1:12,4:13:-10.98,-3.92,-35.85:70.59
-chr1	1588297	.	C	T	55.71	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=2;HaplotypeScore=3.93;MQ=44.22;MQ0=1;QD=3.48;SB=17.08	GT:AD:DP:GL:GQ	0/1:12,4:12:-12.47,-3.61,-34.17:88.55
-chr1	1588300	.	G	T	70.59	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=2;HaplotypeScore=3.93;MQ=44.22;MQ0=1;QD=4.41;SB=-0.98	GT:AD:DP:GL:GQ	0/1:12,4:13:-14.26,-3.92,-32.75:99
-chr1	1588313	.	A	G	0.48	PASS	AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=34.54;MQ0=0;OQ=106.39;QD=17.73;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,6:4:-14.17,-1.20,-0.00:12.04
-chr1	1588430	.	A	C	41.05	HARD_TO_VALIDATE;LowQual;SnpCluster	AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=1;HaplotypeScore=7.96;MQ=16.51;MQ0=4;QD=5.86;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,5:2:-7.51,-0.60,-0.00:6.02
-chr1	1588435	.	G	A	88.13	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=3.96;MQ=17.24;MQ0=5;QD=8.81;SB=-10.00	GT:AD:DP:GL:GQ	1/1:5,5:3:-12.30,-0.90,-0.00:9.03
-chr1	1588436	.	C	T	85.79	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=17.47;MQ0=5;QD=9.53;SB=-10.00	GT:AD:DP:GL:GQ	1/1:4,5:3:-12.07,-0.90,-0.00:9.03
-chr1	1588443	.	T	A	229.32	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=32.72;MQ0=5;QD=15.29;SB=-115.17	GT:AD:DP:GL:GQ	1/1:5,10:7:-26.51,-2.11,-0.00:21.07
-chr1	1589024	rs6604981	A	G	620.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.22;MQ0=0;OQ=1995.26;QD=35.00;SB=-949.98	GT:AD:DP:GL:GQ	1/1:0,57:56:-203.13,-16.87,-0.02:99
-chr1	1589224	rs6662227	A	G	24.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=48.28;MQ0=4;OQ=837.14;QD=23.92;SB=-301.43	GT:AD:DP:GL:GQ	1/1:0,35:27:-87.33,-8.14,-0.03:81.18
-chr1	1589250	.	A	G	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=2;HaplotypeScore=3.35;MQ=44.60;MQ0=6;OQ=197.93;QD=4.95;SB=-12.85	GT:AD:DP:GL:GQ	0/1:24,16:34:-33.32,-10.25,-92.46:99
-chr1	1589410	rs12725286	C	T	1.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=10.99;MQ=39.64;MQ0=8;OQ=1191.02;QD=13.38;SB=-569.58	GT:AD:DP:GL:GQ	0/1:50,39:71:-143.77,-21.38,-134.51:99
-chr1	1589675	rs12729295	C	T	309.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.48;MQ0=3;OQ=671.60;QD=8.72;SB=-350.30	GT:AD:DP:GL:GQ	0/1:53,24:68:-90.94,-20.50,-145.90:99
-chr1	1589751	rs2072923	A	G	247.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=29.67;MQ0=6;OQ=1186.35;QD=17.98;SB=-547.83	GT:AD:DP:GL:GQ	0/1:14,52:56:-138.81,-16.89,-48.69:99
-chr1	1589844	.	C	T	0.07	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=10.53;MQ=52.48;MQ0=3;OQ=898.69;QD=17.28;SB=-297.81	GT:AD:DP:GL:GQ	0/1:24,28:47:-107.32,-14.16,-70.31:99
-chr1	1589914	.	C	G	0.11	PASS	AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=2;HaplotypeScore=0.33;MQ=46.80;MQ0=0;OQ=573.53;QD=6.52;SB=39.39	GT:AD:DP:GL:GQ	0/1:67,21:88:-87.20,-26.56,-264.39:99
-chr1	1589924	.	G	A	1.33	PASS	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=1;HaplotypeScore=0.49;MQ=46.92;MQ0=0;OQ=633.71;QD=6.67;SB=49.65	GT:AD:DP:GL:GQ	0/1:70,25:92:-94.37,-27.71,-247.48:99
-chr1	1590019	.	C	G	30.30	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=49.37;MQ0=3;OQ=641.05;QD=9.29;SB=-314.06	GT:AD:DP:GL:GQ	0/1:47,21:64:-90.20,-22.81,-187.56:99
-chr1	1590023	.	C	T	0.46	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=8.72;MQ=48.76;MQ0=3;OQ=551.31;QD=8.89;SB=-275.75	GT:AD:DP:GL:GQ	0/1:40,22:54:-74.68,-16.27,-125.00:99
-chr1	1590878	.	G	A	29.06	PASS	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=3.16;MQ=58.63;MQ0=0;OQ=418.19;QD=12.30;SB=-160.22	GT:AD:DP:GL:GQ	0/1:18,16:32:-54.75,-9.64,-59.96:99
-chr1	1590915	.	G	A	47.89	PASS	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.20;MQ0=0;OQ=322.06;QD=8.26;SB=-141.18	GT:AD:DP:GL:GQ	0/1:27,12:38:-46.95,-11.46,-84.40:99
-chr1	1592399	rs4648609	G	C	54.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=906.62;QD=20.60;SB=-310.97	GT:AD:DP:GL:GQ	0/1:19,25:42:-106.61,-12.66,-75.02:99
-chr1	1592450	rs4233029	C	T	90.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.31;MQ=60.00;MQ0=0;OQ=849.63;QD=19.76;SB=-437.98	GT:AD:DP:GL:GQ	0/1:15,28:37:-99.40,-11.15,-39.71:99
-chr1	1592650	rs4639697	G	T	61.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=1.87;MQ=58.92;MQ0=0;OQ=2757.17;QD=35.35;SB=-1369.99	GT:AD:DP:GL:GQ	1/1:1,77:76:-279.32,-22.89,-0.02:99
-chr1	1593099	rs11523819	G	A	285.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.60;MQ0=0;OQ=1010.41;QD=14.43;SB=-280.29	GT:AD:DP:GL:GQ	0/1:39,31:68:-124.83,-20.51,-114.09:99
-chr1	1593297	rs6699975	G	T	40.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=6.04;MQ=58.42;MQ0=0;OQ=872.27;QD=15.58;SB=-424.16	GT:AD:DP:GL:GQ	0/1:24,32:48:-104.97,-14.46,-59.27:99
-chr1	1594362	rs36048328	G	A	212.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=53.76;MQ0=0;OQ=936.15;QD=14.86;SB=-437.40	GT:AD:DP:GL:GQ	0/1:33,30:61:-115.28,-18.38,-109.00:99
-chr1	1595120	rs12736155	A	C	482.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=48.94;MQ0=1;OQ=857.21;QD=13.61;SB=-454.19	GT:AD:DP:GL:GQ	0/1:31,32:60:-107.08,-18.07,-108.87:99
-chr1	1595458	.	A	G	4.92	PASS	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=5.30;MQ=27.16;MQ0=16;OQ=685.03;QD=9.01;SB=-336.52	GT:AD:DP:GL:GQ	0/1:42,34:52:-87.45,-15.67,-106.28:99
-chr1	1595935	.	C	A	13.79	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=13;HaplotypeScore=5.11;MQ=47.25;MQ0=0;QD=0.27;SB=44.14	GT:AD:DP:GL:GQ	0/1:44,8:42:-17.30,-12.66,-119.04:46.44
-chr1	1596150	rs28678861	G	C	0.01	FDRtranche2.00to10.00	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=6;HaplotypeScore=0.16;MQ=35.71;MQ0=1;OQ=1428.28;QD=37.59;SB=-739.75	GT:AD:DP:GL:GQ	1/1:0,38:34:-146.42,-10.25,-0.01:99
-chr1	1596170	rs61776786	G	A	218.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.46;MQ=33.82;MQ0=1;OQ=367.66;QD=11.86;SB=-172.25	GT:AD:DP:GL:GQ	0/1:17,14:26:-47.89,-7.84,-41.82:99
-chr1	1596393	.	A	G	1.96	PASS	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=2;HaplotypeScore=1.79;MQ=38.63;MQ0=2;OQ=223.84;QD=8.95;SB=-123.74	GT:AD:DP:GL:GQ	0/1:13,12:22:-32.30,-6.64,-46.25:99
-chr1	1596434	rs61776787	A	G	239.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.20;MQ=27.74;MQ0=11;OQ=461.68;QD=12.82;SB=-213.08	GT:AD:DP:GL:GQ	1/1:0,36:16:-49.77,-4.83,-0.02:48.10
-chr1	1598092	rs61776790	C	T	85.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=16.88;MQ0=18;OQ=268.46;QD=6.88;SB=-142.62	GT:AD:DP:GL:GQ	0/1:27,12:20:-36.16,-6.04,-33.65:99
-chr1	1599022	rs12724172	T	G	248.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=48.86;MQ0=1;OQ=792.00;QD=12.00;SB=-236.82	GT:AD:DP:GL:GQ	0/1:30,36:59:-100.27,-17.78,-99.33:99
-chr1	1599028	rs12757736	A	T	344.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=49.16;MQ0=1;OQ=842.96;QD=13.82;SB=-342.44	GT:AD:DP:GL:GQ	0/1:27,34:53:-103.55,-15.97,-87.26:99
-chr1	1600387	rs7544851	T	C	182.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=59.17;MQ0=0;OQ=618.77;QD=11.05;SB=-250.34	GT:AD:DP:GL:GQ	0/1:28,28:48:-79.63,-14.47,-94.46:99
-chr1	1601295	rs6700884	A	G	128.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=57.79;MQ0=0;OQ=747.49;QD=15.90;SB=-253.32	GT:AD:DP:GL:GQ	0/1:21,26:46:-91.89,-13.86,-83.83:99
-chr1	1601516	rs6695303	T	C	234.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.59;MQ=57.63;MQ0=0;OQ=837.86;QD=14.45;SB=-344.58	GT:AD:DP:GL:GQ	0/1:27,31:54:-103.34,-16.27,-95.10:99
-chr1	1601858	rs4074196	A	G	175.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=56.26;MQ0=0;OQ=386.06;QD=8.39;SB=-209.64	GT:AD:DP:GL:GQ	0/1:26,20:39:-53.65,-11.76,-84.70:99
-chr1	1601974	rs4074197	C	T	305.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.98;MQ0=0;OQ=818.07;QD=17.41;SB=-411.47	GT:AD:DP:GL:GQ	0/1:22,25:46:-98.95,-13.86,-71.35:99
-chr1	1602466	rs4074198	G	A	258.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.07;MQ0=0;OQ=1998.12;QD=19.98;SB=-732.09	GT:AD:DP:GL:GQ	0/1:43,57:99:-232.92,-29.82,-143.69:99
-chr1	1602672	rs4076580	T	G	4.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=6.99;MQ=58.71;MQ0=0;OQ=379.11;QD=10.53;SB=-115.90	GT:AD:DP:GL:GQ	0/1:20,16:35:-51.74,-10.54,-71.19:99
-chr1	1603230	.	C	A	105.90	PASS	AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.30;MQ0=0;OQ=439.60;QD=13.32;SB=-227.94	GT:AD:DP:GL:GQ	0/1:17,16:31:-56.59,-9.34,-45.91:99
-chr1	1605211	rs7520934	A	C	437.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=732.80;QD=12.42;SB=-285.83	GT:AD:DP:GL:GQ	0/1:28,31:56:-93.43,-16.87,-99.80:99
-chr1	1605568	rs28774670	T	C	204.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.50;MQ0=0;OQ=582.27;QD=9.87;SB=-203.22	GT:AD:DP:GL:GQ	0/1:33,26:57:-78.69,-17.18,-127.49:99
-chr1	1605610	rs28435953	G	C	130.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.47;MQ=58.73;MQ0=0;OQ=779.25;QD=14.17;SB=-322.40	GT:AD:DP:GL:GQ	0/1:29,26:52:-96.88,-15.68,-122.76:99
-chr1	1605921	rs28464677	G	A	40.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=6.09;MQ=58.05;MQ0=1;OQ=855.32;QD=14.50;SB=-377.37	GT:AD:DP:GL:GQ	0/1:31,28:56:-105.70,-16.88,-92.60:99
-chr1	1606119	rs61776792	G	C	0.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=15.64;MQ=49.02;MQ0=1;OQ=469.22;QD=9.02;SB=-238.10	GT:AD:DP:GL:GQ	0/1:28,21:33:-60.17,-9.96,-72.09:99
-chr1	1606735	.	G	A	20.16	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=18;HaplotypeScore=5.53;MQ=52.51;MQ0=0;QD=0.29;SB=62.21	GT:AD:DP:GL:GQ	0/1:55,14:41:-17.65,-12.36,-123.60:52.96
-chr1	1607449	rs28736713	T	G	133.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.99;MQ=58.63;MQ0=0;OQ=1023.89;QD=16.00;SB=-507.80	GT:AD:DP:GL:GQ	0/1:29,35:64:-124.95,-19.28,-105.76:99
-chr1	1607623	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=18;HaplotypeScore=7.66;MQ=51.83;MQ0=1;OQ=52.14;QD=1.00;SB=0.53	GT:AD:DP:GL:GQ	0/1:41,11:37:-19.66,-11.16,-103.64:84.98
-chr1	1608184	rs28367203	T	C	304.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=56.41;MQ0=0;OQ=680.60;QD=12.15;SB=-333.30	GT:AD:DP:GL:GQ	0/1:31,25:55:-87.91,-16.57,-127.27:99
-chr1	1608363	rs28463291	C	T	163.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1453.08;QD=22.02;SB=-689.01	GT:AD:DP:GL:GQ	0/1:22,44:66:-168.48,-19.89,-77.76:99
-chr1	1608455	rs28366981	A	G	89.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=1.13;MQ=57.97;MQ0=0;OQ=661.92;QD=12.98;SB=-317.10	GT:AD:DP:GL:GQ	0/1:21,30:45:-83.04,-13.57,-76.52:99
-chr1	1608461	rs28561498	G	T	18.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=3.73;MQ=57.75;MQ0=0;OQ=745.42;QD=16.20;SB=-317.33	GT:AD:DP:GL:GQ	0/1:20,26:44:-91.08,-13.26,-59.03:99
-chr1	1608538	rs28541555	T	G	156.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=57.89;MQ0=0;OQ=606.69;QD=12.91;SB=-204.78	GT:AD:DP:GL:GQ	0/1:20,27:44:-77.21,-13.26,-75.77:99
-chr1	1608823	rs4648780	T	C	124.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=58.99;MQ0=0;OQ=1965.86;QD=28.49;SB=-779.58	GT:AD:DP:GL:GQ	1/1:0,69:63:-200.23,-19.00,-0.06:99
-chr1	1608945	rs7524863	G	A	246.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=57.51;MQ0=0;OQ=796.58;QD=15.03;SB=-348.35	GT:AD:DP:GL:GQ	0/1:28,25:52:-98.61,-15.67,-100.29:99
-chr1	1609404	rs28487995	G	A	270.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=56.05;MQ0=0;OQ=943.08;QD=14.97;SB=-428.82	GT:AD:DP:GL:GQ	0/1:34,29:58:-115.07,-17.48,-93.42:99
-chr1	1609630	rs9442411	T	C	340.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=54.02;MQ0=2;OQ=562.05;QD=9.37;SB=-254.95	GT:AD:DP:GL:GQ	0/1:29,31:53:-75.47,-15.98,-117.16:99
-chr1	1609711	rs61776794	G	C	177	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=50.27;MQ0=2;OQ=557.29;QD=11.15;SB=-303.13	GT:AD:DP:GL:GQ	0/1:25,25:40:-71.08,-12.07,-91.96:99
-chr1	1609833	.	C	T	8.33	PASS	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.64;MQ=46.17;MQ0=4;OQ=546.56;QD=9.42;SB=-24.96	GT:AD:DP:GL:GQ	0/1:34,24:50:-73.01,-15.07,-102.31:99
-chr1	1609872	.	T	A	2.74	PASS	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=43.11;MQ0=2;OQ=308.49;QD=7.17;SB=35.14	GT:AD:DP:GL:GQ	0/1:26,17:38:-45.58,-11.45,-97.07:99
-chr1	1609888	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=6.91;MQ=43.11;MQ0=0;OQ=145.44;QD=3.93;SB=26.10	GT:AD:DP:GL:GQ	0/1:23,14:31:-27.18,-9.35,-84.75:99
-chr1	1609946	.	A	G	0.35	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=42.17;MQ0=4;OQ=138.81;QD=3.39;SB=-12.69	GT:AD:DP:GL:GQ	0/1:29,12:37:-28.31,-11.14,-120.75:99
-chr1	1610085	rs61776797	A	G	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=4;HaplotypeScore=1.23;MQ=52.83;MQ0=0;OQ=168.50;QD=4.32;SB=29.12	GT:AD:DP:GL:GQ	0/1:29,10:36:-30.98,-10.85,-111.33:99
-chr1	1610720	rs3737622	A	G	151.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=52.83;MQ0=0;OQ=742.56;QD=16.14;SB=-328.41	GT:AD:DP:GL:GQ	0/1:21,25:45:-91.09,-13.55,-80.03:99
-chr1	1610745	rs3737623	C	T	272.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=54.47;MQ0=0;OQ=1103.20;QD=18.09;SB=-448.99	GT:AD:DP:GL:GQ	0/1:28,33:59:-131.40,-17.79,-81.29:99
-chr1	1610764	rs3737624	G	A	559.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.35;MQ0=0;OQ=1181.67;QD=16.88;SB=-410.16	GT:AD:DP:GL:GQ	0/1:34,36:69:-142.24,-20.78,-119.02:99
-chr1	1612040	.	T	A	0.13	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=3;HaplotypeScore=1.10;MQ=42.64;MQ0=1;OQ=306.88;QD=6.39;SB=17.08	GT:AD:DP:GL:GQ	0/1:34,14:39:-45.73,-11.76,-89.73:99
-chr1	1612676	rs1855706	C	T	48.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=4.57;MQ=18.63;MQ0=42;OQ=747.37;QD=8.59;SB=-370.40	GT:AD:DP:GL:GQ	0/1:52,35:41:-90.38,-12.36,-60.67:99
-chr1	1612716	rs61776798	T	C	0.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=7.54;MQ0=54;OQ=87.83;QD=1.39;SB=-10.00	GT:AD:DP:GL:GQ	0/1:40,23:6:-13.87,-1.81,-8.21:64.05
-chr1	1613585	rs7542306	C	A	20.92	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.83;MQ=15.32;MQ0=21;QD=0.67;SB=-10.00	GT:AD:DP:GL:GQ	0/1:18,13:6:-7.18,-1.81,-14.53:53.72
-chr1	1614256	rs368915	T	G	26.47	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=20.52;MQ0=9;QD=2.04;SB=-32.98	GT:AD:DP:GL:GQ	1/1:0,13:2:-6.06,-0.60,-0.00:6
-chr1	1614726	rs4648651	G	A	96.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.04;MQ0=5;OQ=94.30;QD=5.55;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,5:9:-15.42,-2.71,-17.14:99
-chr1	1615466	rs35947799	G	A	107.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=52.41;MQ0=0;OQ=601.60;QD=18.23;SB=-258.27	GT:AD:DP:GL:GQ	0/1:13,20:32:-73.09,-9.64,-46.27:99
-chr1	1616758	rs28587348	A	G	239	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=22.66;MQ0=5;OQ=648.18;QD=9.53;SB=-227.25	GT:AD:DP:GL:GQ	0/1:39,28:59:-88.06,-19.96,-129.14:99
-chr1	1617046	rs1932228	C	T	15.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=15.02;MQ0=16;OQ=210.38;QD=4.29;SB=-111.61	GT:AD:DP:GL:GQ	0/1:30,19:14:-28.54,-4.22,-22.09:99
-chr1	1617416	rs61776801	G	A	266.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=37.27;MQ0=15;OQ=982.95;QD=15.60;SB=-353.39	GT:AD:DP:GL:GQ	0/1:28,35:47:-115.75,-14.17,-56.63:99
-chr1	1617665	rs601141	A	C	373.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=54.30;MQ0=0;OQ=987.22;QD=15.19;SB=-461.24	GT:AD:DP:GL:GQ	0/1:31,34:63:-120.98,-18.98,-104.99:99
-chr1	1618057	rs61776802	A	G	60.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=53.96;MQ0=1;OQ=690.37;QD=9.86;SB=-238.28	GT:AD:DP:GL:GQ	0/1:36,33:62:-91.01,-18.69,-134.09:99
-chr1	1618313	rs61776803	G	T	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=3;HaplotypeScore=2.46;MQ=39.85;MQ0=11;OQ=285.62;QD=3.97;SB=-133.03	GT:AD:DP:GL:GQ	0/1:51,21:59:-49.62,-17.77,-159.76:99
-chr1	1618571	rs12081891	G	A	12.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=28.69;MQ0=14;OQ=348.19;QD=5.36;SB=-177.80	GT:AD:DP:GL:GQ	0/1:47,18:38:-49.56,-11.46,-83.32:99
-chr1	1618766	rs61776804	G	A	86.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=43.94;MQ0=0;OQ=732.16;QD=19.27;SB=-352.49	GT:AD:DP:GL:GQ	0/1:16,22:37:-87.65,-11.15,-51.61:99
-chr1	1619321	rs4648621	G	A	136.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=27.57;MQ0=5;OQ=508.21;QD=13.37;SB=-144.61	GT:AD:DP:GL:GQ	0/1:18,20:30:-63.15,-9.04,-45.60:99
-chr1	1619347	rs34716550	T	C	0.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=6.10;MQ=29.73;MQ0=3;OQ=380.00;QD=9.05;SB=-24.63	GT:AD:DP:GL:GQ	0/1:23,19:33:-51.24,-9.95,-72.01:99
-chr1	1624864	rs874516	T	C	339.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=46.52;MQ0=1;OQ=784.43;QD=15.38;SB=-383.28	GT:AD:DP:GL:GQ	0/1:22,29:49:-96.49,-14.76,-89.37:99
-chr1	1625479	rs2076329	T	C	1.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=3.63;MQ=58.85;MQ0=0;OQ=346.77;QD=7.08;SB=-173.37	GT:AD:DP:GL:GQ	0/1:30,19:42:-50.63,-12.67,-103.10:99
-chr1	1625609	rs1136997	C	A	28.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.88;MQ=49.57;MQ0=0;OQ=129.32;QD=4.62;SB=-74.73	GT:AD:DP:GL:GQ	0/1:19,9:24:-23.45,-7.23,-57.11:99
-chr1	1625904	rs1059822	G	A	133.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=49.02;MQ0=1;OQ=290.88;QD=7.65;SB=-88.57	GT:AD:DP:GL:GQ	0/1:22,16:33:-42.33,-9.95,-69.30:99
-chr1	1626134	rs2179381	C	T	246.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=42.93;MQ0=0;OQ=354.22;QD=9.84;SB=-190.16	GT:AD:DP:GL:GQ	0/1:22,14:30:-47.74,-9.04,-64.17:99
-chr1	1626190	.	G	A	71.25	PASS	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=48.48;MQ0=0;OQ=619.32;QD=15.48;SB=-321.82	GT:AD:DP:GL:GQ	0/1:21,19:40:-77.26,-12.05,-77.19:99
-chr1	1627098	rs61774911	A	G	6.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.86;MQ0=3;OQ=57.73;QD=2.14;SB=17.07	GT:AD:DP:GL:GQ	0/1:19,8:19:-14.79,-5.73,-53.94:90.57
-chr1	1627115	rs9439480	A	G	25.79	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=40.42;MQ0=0;QD=1.07;SB=26.10	GT:AD:DP:GL:GQ	0/1:18,5:21:-12.19,-6.33,-66.21:58.62
-chr1	1627865	rs17162876	G	C	61.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=1.72;MQ=50.90;MQ0=0;OQ=596.59;QD=13.56;SB=-287.98	GT:AD:DP:GL:GQ	0/1:25,19:41:-75.32,-12.38,-88.05:99
-chr1	1628397	.	C	T	6.47	PASS	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=1;HaplotypeScore=1.69;MQ=17.03;MQ0=21;OQ=258.72;QD=7.19;SB=-86.31	GT:AD:DP:GL:GQ	0/1:19,17:11:-32.47,-3.31,-10.93:76.22
-chr1	1628516	.	G	A	0.42	PASS	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=23.14;MQ0=15;OQ=161.97;QD=3.60;SB=-32.64	GT:AD:DP:GL:GQ	0/1:32,13:24:-26.72,-7.23,-54.65:99
-chr1	1629661	.	T	C	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=34.50;MQ0=9;OQ=82.09;QD=2.22;SB=-48.26	GT:AD:DP:GL:GQ	0/1:21,16:24:-18.73,-7.24,-70.81:99
-chr1	1631887	rs61776845	C	T	226.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.12;MQ0=0;OQ=487.31;QD=34.81;SB=-143.63	GT:AD:DP:GL:GQ	1/1:0,14:14:-52.32,-4.22,-0.01:42.13
-chr1	1633129	rs6688326	C	A	4.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=11.56;MQ0=25;OQ=150.41;QD=4.30;SB=-10.00	GT:AD:DP:GL:GQ	0/1:25,10:8:-20.73,-2.41,-7.32:49.07
-chr1	1634432	rs2143105	A	G	2.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=3.86;MQ=24.63;MQ0=4;OQ=286.53;QD=16.85;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,17:11:-32.26,-3.33,-0.02:33.05
-chr1	1634696	rs2179382	G	A	8.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=3.64;MQ=32.34;MQ0=16;OQ=279.13;QD=3.58;SB=-95.45	GT:AD:DP:GL:GQ	0/1:61,16:59:-48.98,-17.78,-155.91:99
-chr1	1634768	rs2179383	C	T	205.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=11.72;MQ0=13;OQ=127.00;QD=6.35;SB=-51.67	GT:AD:DP:GL:GQ	1/1:0,20:4:-16.23,-1.20,-0.00:12.04
-chr1	1634910	.	C	T	73.11	PASS	AC=2;AF=1.00;AN=2;DP=32;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=12.98;MQ0=22;OQ=295.97;QD=9.25;SB=-135.01	GT:AD:DP:GL:GQ	1/1:0,32:8:-33.18,-2.41,-0.00:24.08
-chr1	1634953	.	C	T	62.81	PASS	AC=2;AF=1.00;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=17.86;MQ0=18;OQ=384.85;QD=13.27;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,29:10:-42.07,-3.01,-0.00:30.10
-chr1	1634973	.	T	C	4.22	PASS	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.05;MQ0=18;OQ=118.84;QD=3.71;SB=-10.00	GT:AD:DP:GL:GQ	0/1:22,10:13:-19.08,-3.92,-33.24:99
-chr1	1634975	.	C	T	14.66	PASS	AC=2;AF=1.00;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.05;MQ0=18;OQ=504.84;QD=15.78;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,32:13:-54.07,-3.92,-0.00:39.13
-chr1	1635050	rs4279785	T	C	293.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=22.94;MQ0=12;OQ=364.98;QD=8.90;SB=-161.33	GT:AD:DP:GL:GQ	0/1:23,18:28:-48.21,-8.43,-62.26:99
-chr1	1635547	rs61774919	G	A	162.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=14.59;MQ0=11;OQ=173.64;QD=7.55;SB=-50.56	GT:AD:DP:GL:GQ	1/1:6,17:5:-20.92,-1.51,-0.00:15.05
-chr1	1635860	rs3819996	T	C	34.28	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=13.67;MQ0=7;QD=3.81;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,9:2:-6.84,-0.60,-0.00:6.02
-chr1	1635866	rs3819997	A	G	27.83	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=14.50;MQ0=6;QD=3.48;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,8:2:-6.19,-0.60,-0.00:6.01
-chr1	1635934	rs3819998	A	G	17.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=5.04;MQ=31.93;MQ0=9;OQ=462.29;QD=12.84;SB=-95.99	GT:AD:DP:GL:GQ	0/1:9,27:21:-55.85,-6.34,-11.59:52.52
-chr1	1635937	rs3819999	G	T	0.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=5.04;MQ=31.93;MQ0=9;OQ=663.10;QD=18.42;SB=-104.11	GT:AD:DP:GL:GQ	0/1:9,26:24:-76.82,-7.23,-11.28:40.49
-chr1	1635973	rs3820000	G	C	54.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=28.49;MQ0=15;OQ=883.63;QD=21.55;SB=-127.19	GT:AD:DP:GL:GQ	1/1:8,33:25:-95.91,-7.54,-3.96:35.78
-chr1	1636091	rs3820002	T	C	108.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=27.55;MQ0=2;OQ=418.10;QD=27.87;SB=-161.84	GT:AD:DP:GL:GQ	1/1:0,15:13:-45.40,-3.92,-0.01:39.10
-chr1	1636096	rs61776849	C	T	171.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=27.06;MQ0=2;OQ=513.34;QD=30.20;SB=-178.68	GT:AD:DP:GL:GQ	1/1:0,17:14:-54.92,-4.22,-0.01:42.13
-chr1	1636231	rs61776850	G	T	45.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=2.84;MQ=41.85;MQ0=7;OQ=641.89;QD=13.95;SB=-342.30	GT:AD:DP:GL:GQ	0/1:20,26:39:-79.22,-11.75,-58.73:99
-chr1	1636287	rs61776851	T	G	219.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=36.80;MQ0=8;OQ=1107.10;QD=20.13;SB=-508.74	GT:AD:DP:GL:GQ	1/1:4,51:37:-114.34,-11.16,-0.05:99
-chr1	1636310	rs3820004	G	A	84.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=34.50;MQ0=11;OQ=1585.10;QD=27.33;SB=-811.33	GT:AD:DP:GL:GQ	1/1:6,52:41:-162.11,-12.35,-0.01:99
-chr1	1636434	rs56030177	T	C	84.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=28.90;MQ0=10;OQ=1324.64;QD=27.60;SB=-500.48	GT:AD:DP:GL:GQ	1/1:0,48:38:-136.06,-11.45,-0.01:99
-chr1	1636517	rs760926	T	C	66.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=26.90;MQ0=7;OQ=976.98;QD=25.05;SB=-384.56	GT:AD:DP:GL:GQ	1/1:1,38:28:-101.29,-8.43,-0.01:84.25
-chr1	1636649	rs760927	T	C	127.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.47;MQ0=5;OQ=898.10;QD=25.66;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,35:25:-93.41,-7.53,-0.01:75.22
-chr1	1636735	.	C	G	66.44	PASS	AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=39.28;MQ0=9;OQ=1254.01;QD=12.80;SB=-309.31	GT:AD:DP:GL:GQ	0/1:56,42:83:-153.70,-25.01,-208.71:99
-chr1	1636777	.	C	T	31.32	PASS	AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=2.39;MQ=38.96;MQ0=9;OQ=1301.14;QD=13.41;SB=-647.75	GT:AD:DP:GL:GQ	0/1:49,48:84:-158.72,-25.32,-141.36:99
-chr1	1636840	rs61776853	A	C	1.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=3;HaplotypeScore=0.97;MQ=31.48;MQ0=5;OQ=997.06;QD=27.70;SB=-256.95	GT:AD:DP:GL:GQ	1/1:0,36:30:-103.31,-9.04,-0.02:90.22
-chr1	1636845	rs61776854	C	T	13.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=31.12;MQ0=5;OQ=595.02;QD=17.50;SB=-27.62	GT:AD:DP:GL:GQ	0/1:11,23:28:-71.23,-8.44,-30.58:99
-chr1	1636852	rs35642458	G	A	71.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=28.10;MQ0=4;OQ=612.21;QD=24.49;SB=-39.52	GT:AD:DP:GL:GQ	0/1:3,22:20:-70.53,-6.02,-10.71:46.85
-chr1	1637044	rs61073446	G	A	19.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=5.47;MQ=48.10;MQ0=1;OQ=604.36;QD=8.06;SB=-316.73	GT:AD:DP:GL:GQ	0/1:54,21:68:-84.21,-20.50,-156.95:99
-chr1	1637060	.	G	C	0.16	PASS	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=1;HaplotypeScore=3.23;MQ=46.92;MQ0=1;OQ=770.35;QD=8.37;SB=83.29	GT:AD:DP:GL:GQ	0/1:66,26:89:-107.18,-26.86,-257.87:99
-chr1	1637092	.	A	G	13.80	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=45.24;MQ0=3;OQ=524.47;QD=7.09;SB=62.24	GT:AD:DP:GL:GQ	0/1:50,24:71:-77.11,-21.38,-201.71:99
-chr1	1637137	rs4437818	C	T	70.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.48;MQ=37.21;MQ0=3;OQ=419.91;QD=7.63;SB=-236.03	GT:AD:DP:GL:GQ	0/1:38,17:49:-60.03,-14.76,-127.40:99
-chr1	1637159	rs760928	C	T	610.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.78;MQ0=3;OQ=1773.57;QD=35.47;SB=-891.67	GT:AD:DP:GL:GQ	1/1:0,50:45:-180.95,-13.56,-0.01:99
-chr1	1637161	rs760929	G	A	499.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=39.49;MQ0=3;OQ=1819.83;QD=36.40;SB=-852.64	GT:AD:DP:GL:GQ	1/1:0,50:45:-185.58,-13.55,-0.01:99
-chr1	1637349	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=1;HaplotypeScore=12.15;MQ=53.21;MQ0=0;OQ=258.06;QD=3.04;SB=74.27	GT:AD:DP:GL:GQ	0/1:68,17:73:-51.13,-22.04,-238.97:99
-chr1	1637350	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=13.99;MQ=53.21;MQ0=0;OQ=156.60;QD=1.84;SB=74.27	GT:AD:DP:GL:GQ	0/1:68,16:78:-42.44,-23.50,-258.99:99
-chr1	1637384	rs760930	C	T	155.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=57.38;MQ0=0;OQ=2369.71;QD=38.22;SB=-867.02	GT:AD:DP:GL:GQ	1/1:0,62:60:-240.58,-18.08,-0.02:99
-chr1	1637388	rs760931	G	C	174.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=56.72;MQ0=0;OQ=2115.79;QD=36.48;SB=-781.25	GT:AD:DP:GL:GQ	1/1:0,58:53:-215.20,-15.99,-0.03:99
-chr1	1637546	rs56081394	A	C	94.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=52.34;MQ0=0;OQ=2774.94;QD=32.65;SB=-1180.71	GT:AD:DP:GL:GQ	1/1:0,85:81:-281.12,-24.40,-0.04:99
-chr1	1637613	.	C	T	21.89	LowQual	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=3;HaplotypeScore=1.05;MQ=50.67;MQ0=0;QD=0.27;SB=-29.39	GT:AD:DP:GL:GQ	0/1:68,12:72:-27.16,-21.69,-231.62:54.70
-chr1	1637638	.	C	G	0.51	PASS	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=4.82;MQ=47.75;MQ0=0;OQ=459.74;QD=4.84;SB=-189.88	GT:AD:DP:GL:GQ	0/1:65,30:83:-74.29,-25.03,-272.64:99
-chr1	1637674	.	T	C	96.11	PASS	AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.42;MQ0=0;OQ=794.87;QD=7.87;SB=-336.87	GT:AD:DP:GL:GQ	0/1:55,46:82:-107.47,-24.70,-217.72:99
-chr1	1637731	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=1;HaplotypeScore=1.79;MQ=47.58;MQ0=0;OQ=197.23;QD=2.38;SB=-124.83	GT:AD:DP:GL:GQ	0/1:61,22:74:-45.30,-22.29,-250.27:99
-chr1	1637788	rs1883424	A	G	452.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.70;MQ0=0;OQ=1180.37;QD=13.26;SB=-539.57	GT:AD:DP:GL:GQ	0/1:48,41:89:-148.13,-26.81,-196.69:99
-chr1	1637887	rs61776857	T	C	8.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=37.62;MQ0=3;OQ=1207.11;QD=23.21;SB=-211.69	GT:AD:DP:GL:GQ	1/1:2,49:41:-124.35,-12.38,-0.05:99
-chr1	1638000	.	G	C	4.04	PASS	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=49.72;MQ0=1;OQ=363.96;QD=6.17;SB=-28.72	GT:AD:DP:GL:GQ	0/1:37,21:48:-56.87,-17.19,-155.52:99
-chr1	1638008	.	G	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=51.97;MQ0=1;OQ=62.73;QD=1.08;SB=29.80	GT:AD:DP:GL:GQ	0/1:41,17:44:-22.82,-13.26,-168.23:95.57
-chr1	1638068	rs61776858	C	T	414.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.78;MQ0=0;OQ=1645.34;QD=38.26;SB=-705.35	GT:AD:DP:GL:GQ	1/1:1,42:42:-168.13,-12.65,-0.01:99
-chr1	1638095	rs28722732	A	C	115.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=48.13;MQ0=1;OQ=1285.24;QD=32.95;SB=-522.05	GT:AD:DP:GL:GQ	1/1:1,38:38:-132.12,-11.45,-0.02:99
-chr1	1638236	.	G	A	17.91	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=2;HaplotypeScore=8.77;MQ=38.97;MQ0=0;QD=0.34;SB=23.08	GT:AD:DP:GL:GQ	0/1:43,6:25:-15.81,-10.75,-74.55:50.67
-chr1	1638252	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=56.73;MQ=41.68;MQ0=0;OQ=220.25;QD=3.86;SB=17.08	GT:AD:DP:GL:GQ	0/1:43,13:37:-36.47,-11.16,-97.19:99
-chr1	1638265	rs28669101	A	G	1.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=5.08;MQ=44.94;MQ0=1;OQ=1841.80;QD=27.49;SB=-530.20	GT:AD:DP:GL:GQ	1/1:1,66:52:-187.79,-15.67,-0.02:99
-chr1	1638282	.	T	C	372.16	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=2;HaplotypeScore=20.32;MQ=48.81;MQ0=1;QD=5.64;SB=53.20	GT:AD:DP:GL:GQ	0/1:48,18:62:-59.18,-18.68,-176.85:99
-chr1	1638285	.	G	A	362.16	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=22.88;MQ=49.05;MQ0=1;QD=5.57;SB=50.16	GT:AD:DP:GL:GQ	0/1:45,17:60:-57.59,-18.09,-158.00:99
-chr1	1638291	.	G	T	350.74	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=1;HaplotypeScore=36.28;MQ=47.79;MQ0=1;QD=5.48;SB=47.16	GT:AD:DP:GL:GQ	0/1:46,17:57:-55.53,-17.18,-142.31:99
-chr1	1638353	.	T	C	4.41	PASS	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=49.10;MQ0=0;OQ=579.45;QD=7.24;SB=-118.38	GT:AD:DP:GL:GQ	0/1:52,28:75:-83.82,-22.59,-209.22:99
-chr1	1638397	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=103;Dels=0.02;HRun=4;HaplotypeScore=13.77;MQ=49.39;MQ0=0;OQ=1251.99;QD=12.16;SB=-214.10	GT:AD:DP:GL:GQ	0/1:54,47:95:-156.50,-28.02,-195.84:99
-chr1	1638484	rs61776859	C	A	0.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=1;HaplotypeScore=3.66;MQ=44.01;MQ0=0;OQ=2573.54;QD=19.06;SB=-1062.18	GT:AD:DP:GL:GQ	0/1:54,81:126:-298.59,-37.95,-167.48:99
-chr1	1638485	.	A	G	2.65	PASS	AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=2.76;MQ=44.20;MQ0=0;OQ=954.08;QD=7.07;SB=27.40	GT:AD:DP:GL:GQ	0/1:81,54:124:-136.06,-37.37,-329.92:99
-chr1	1638496	.	A	C	4.42	PASS	AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=3.74;MQ=43.37;MQ0=0;OQ=1281.45;QD=9.42;SB=-10.58	GT:AD:DP:GL:GQ	0/1:80,56:126:-169.38,-37.95,-296.59:99
-chr1	1638502	.	T	C	3.56	PASS	AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=44.49;MQ0=0;OQ=1373.44;QD=10.25;SB=-79.40	GT:AD:DP:GL:GQ	0/1:76,58:123:-177.67,-37.05,-300.79:99
-chr1	1638544	.	C	T	171.39	PASS	AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=48.39;MQ0=0;OQ=1993.39;QD=14.44;SB=-439.97	GT:AD:DP:GL:GQ	0/1:62,76:123:-239.68,-37.06,-213.30:99
-chr1	1638628	.	C	T	21.95	PASS	AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=49.90;MQ0=0;OQ=1604.78;QD=15.14;SB=-725.65	GT:AD:DP:GL:GQ	0/1:52,53:100:-193.90,-30.14,-170.77:99
-chr1	1638640	.	A	C	22.88	PASS	AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=47.54;MQ0=0;OQ=1027.76;QD=10.18;SB=-470.68	GT:AD:DP:GL:GQ	0/1:56,45:93:-134.07,-28.01,-207.58:99
-chr1	1638645	.	G	C	1.18	PASS	AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=6.44;MQ=47.94;MQ0=0;OQ=1189.28;QD=12.14;SB=-604.90	GT:AD:DP:GL:GQ	0/1:56,42:91:-149.63,-27.42,-247.05:99
-chr1	1638691	rs61777460	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=113;Dels=0.00;HRun=1;HaplotypeScore=70.95;MQ=45.55;MQ0=0;OQ=1598.01;QD=14.14;SB=-702.52	GT:AD:DP:GL:GQ	0/1:53,60:107:-195.32,-32.23,-214.62:99
-chr1	1638728	.	T	A	0.06	PASS	AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=48.71;MQ0=0;OQ=2481.89;QD=16.22;SB=-1020.86	GT:AD:DP:GL:GQ	0/1:71,82:150:-296.65,-45.18,-270.24:99
-chr1	1638806	rs909824	T	C	0.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=154;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=50.30;MQ0=0;OQ=2209.99;QD=14.35;SB=-996.92	GT:AD:DP:GL:GQ	0/1:79,75:150:-269.47,-45.19,-301.46:99
-chr1	1638825	rs61777461	C	T	0.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=143;Dels=0.00;HRun=1;HaplotypeScore=2.68;MQ=50.48;MQ0=0;OQ=2137.82;QD=14.95;SB=-1070.06	GT:AD:DP:GL:GQ	0/1:71,72:135:-257.74,-40.67,-255.42:99
-chr1	1638946	.	C	T	467.64	SnpCluster	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=32.37;MQ=43.71;MQ0=5;QD=7.19;SB=-205.68	GT:AD:DP:GL:GQ	0/1:44,21:47:-64.21,-14.16,-108.79:99
-chr1	1638954	.	T	C	736.34	SnpCluster	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=21.87;MQ=42.89;MQ0=5;QD=12.70;SB=-358.18	GT:AD:DP:GL:GQ	0/1:23,35:42:-89.58,-12.66,-57.09:99
-chr1	1638955	.	G	A	193.46	SnpCluster	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=28.88;MQ=42.53;MQ0=5;QD=3.39;SB=-66.48	GT:AD:DP:GL:GQ	0/1:44,13:42:-35.29,-12.66,-112.58:99
-chr1	1638965	rs61777464	A	G	0.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=17.05;MQ=41.40;MQ0=5;OQ=280.02;QD=5.83;SB=-138.25	GT:AD:DP:GL:GQ	0/1:30,18:32:-40.93,-9.64,-84.27:99
-chr1	1638997	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=10.71;MQ=41.45;MQ0=4;OQ=154.17;QD=3.08;SB=35.12	GT:AD:DP:GL:GQ	0/1:37,12:37:-29.85,-11.15,-98.68:99
-chr1	1639030	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=25.29;MQ=40.65;MQ0=7;OQ=247.09;QD=2.75;SB=50.20	GT:AD:DP:GL:GQ	0/1:68,21:63:-46.97,-18.98,-193.46:99
-chr1	1639109	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=25.12;MQ=46.53;MQ0=4;OQ=115.22;QD=1.05;SB=83.25	GT:AD:DP:GL:GQ	0/1:96,13:84:-40.14,-25.34,-234.06:99
-chr1	1639113	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=24.12;MQ=46.66;MQ0=4;OQ=396.71;QD=3.64;SB=8.10	GT:AD:DP:GL:GQ	0/1:82,27:87:-69.20,-26.24,-219.98:99
-chr1	1639145	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=1;HaplotypeScore=44.81;MQ=46.42;MQ0=3;OQ=230.67;QD=1.94;SB=-28.38	GT:AD:DP:GL:GQ	0/1:92,27:94:-54.66,-28.31,-297.41:99
-chr1	1639152	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=23.68;MQ=46.30;MQ0=1;OQ=1088.67;QD=9.07;SB=-62.94	GT:AD:DP:GL:GQ	0/1:69,50:95:-140.79,-28.64,-195.69:99
-chr1	1639166	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=19.38;MQ=46.56;MQ0=1;OQ=479.08;QD=3.89;SB=-121.97	GT:AD:DP:GL:GQ	0/1:92,31:101:-81.65,-30.45,-258.17:99
-chr1	1639203	.	C	T	59.61	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=106;Dels=0.01;HRun=4;HaplotypeScore=28.93;MQ=49.66;MQ0=0;QD=0.56;SB=37.04	GT:AD:DP:GL:GQ	0/1:84,20:85:-34.85,-25.61,-268.94:92.45
-chr1	1639204	.	A	G	88.80	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=1;HaplotypeScore=34.26;MQ=50.07;MQ0=0;QD=0.81;SB=122.42	GT:AD:DP:GL:GQ	0/1:87,23:90:-39.28,-27.11,-316.10:99
-chr1	1639210	.	T	G	106.61	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=1;HaplotypeScore=109.94;MQ=48.22;MQ0=0;QD=0.90;SB=107.36	GT:AD:DP:GL:GQ	0/1:99,20:91:-41.35,-27.41,-290.49:99
-chr1	1639221	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=0;HaplotypeScore=51.18;MQ=48.34;MQ0=0;OQ=110.59;QD=0.87;SB=-36.37	GT:AD:DP:GL:GQ	0/1:109,18:89:-41.16,-26.82,-305.73:99
-chr1	1639227	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=3;HaplotypeScore=53.65;MQ=47.85;MQ0=2;OQ=61.26;QD=0.48;SB=63.76	GT:AD:DP:GL:GQ	0/1:90,38:88:-35.92,-26.51,-284.90:94.09
-chr1	1639237	.	A	T	220.03	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=2;HaplotypeScore=39.50;MQ=47.38;MQ0=3;QD=1.53;SB=98.34	GT:AD:DP:GL:GQ	0/1:108,36:102:-56.01,-30.73,-323.39:99
-chr1	1639238	.	T	C	363.43	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=40.62;MQ=46.99;MQ0=4;QD=2.51;SB=-35.37	GT:AD:DP:GL:GQ	0/1:115,29:91:-67.04,-27.41,-296.52:99
-chr1	1639239	.	T	G	307.74	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=0;HaplotypeScore=40.46;MQ=46.55;MQ0=5;QD=2.08;SB=5.35	GT:AD:DP:GL:GQ	0/1:110,36:106:-65.98,-31.93,-325.39:99
-chr1	1639244	.	C	G	433.01	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=151;Dels=0.00;HRun=0;HaplotypeScore=72.81;MQ=46.68;MQ0=6;QD=2.87;SB=-83.32	GT:AD:DP:GL:GQ	0/1:112,37:109:-82.29,-35.70,-402.49:99
-chr1	1639252	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=152;Dels=0.00;HRun=2;HaplotypeScore=45.12;MQ=45.10;MQ0=7;OQ=932.16;QD=6.13;SB=-397.36	GT:AD:DP:GL:GQ	0/1:117,33:103:-127.53,-31.03,-261.51:99
-chr1	1639301	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=21.56;MQ=40.71;MQ0=20;OQ=622.52;QD=6.35;SB=-215.64	GT:AD:DP:GL:GQ	0/1:52,46:51:-80.90,-15.37,-137.71:99
-chr1	1639318	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=38.28;MQ=34.31;MQ0=28;OQ=125.27;QD=1.35;SB=-14.91	GT:AD:DP:GL:GQ	0/1:76,17:35:-26.35,-10.54,-101.55:99
-chr1	1639325	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=5.46;MQ=33.52;MQ0=28;OQ=116.93;QD=1.38;SB=23.07	GT:AD:DP:GL:GQ	0/1:73,12:33:-24.93,-9.95,-86.29:99
-chr1	1639374	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=1;HaplotypeScore=20.02;MQ=34.37;MQ0=20;OQ=192.31;QD=2.19;SB=-88.00	GT:AD:DP:GL:GQ	0/1:73,15:45:-36.07,-13.55,-128.18:99
-chr1	1639407	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=10.99;MQ=42.54;MQ0=9;OQ=114.05;QD=1.02;SB=-8.75	GT:AD:DP:GL:GQ	0/1:85,19:71:-46.36,-31.67,-236.26:99
-chr1	1639417	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=4;HaplotypeScore=17.30;MQ=43.78;MQ0=5;OQ=74.87;QD=0.61;SB=-8.76	GT:AD:DP:GL:GQ	0/1:106,16:83:-35.80,-25.03,-240.05:99
-chr1	1639441	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=3;HaplotypeScore=5.23;MQ=45.90;MQ0=8;OQ=109.77;QD=0.77;SB=-10.15	GT:AD:DP:GL:GQ	0/1:120,22:103:-45.28,-31.02,-334.31:99
-chr1	1639479	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=26.42;MQ=48.72;MQ0=12;OQ=76.35;QD=0.64;SB=70.54	GT:AD:DP:GL:GQ	0/1:100,20:90:-38.04,-27.12,-310.60:99
-chr1	1639492	.	C	T	15.20	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=3;HaplotypeScore=52.40;MQ=48.82;MQ0=15;QD=0.14;SB=67.73	GT:AD:DP:GL:GQ	0/1:90,22:79:-28.59,-23.80,-254.17:47.90
-chr1	1639499	rs36141200	G	A	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=107;Dels=0.01;HRun=0;HaplotypeScore=32.74;MQ=48.53;MQ0=15;OQ=2982.80;QD=27.88;SB=-1344.29	GT:AD:DP:GL:GQ	1/1:0,106:74:-301.88,-22.29,-0.02:99
-chr1	1639600	rs36135823	C	T	0.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=3;HaplotypeScore=14.31;MQ=43.93;MQ0=12;OQ=2247.07;QD=26.44;SB=-416.38	GT:AD:DP:GL:GQ	1/1:10,75:60:-232.21,-18.08,-3.91:99
-chr1	1639610	rs34963151	A	T	0.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=15.64;MQ=43.34;MQ0=11;OQ=1936.12;QD=25.14;SB=-344.48	GT:AD:DP:GL:GQ	1/1:5,72:55:-200.25,-16.56,-3.05:99
-chr1	1639612	rs36137888	T	G	0.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=11.64;MQ=43.34;MQ0=11;OQ=1831.08;QD=23.78;SB=-311.74	GT:AD:DP:GL:GQ	1/1:2,72:55:-190.04,-16.56,-3.35:99
-chr1	1639702	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=132;Dels=0.00;HRun=0;HaplotypeScore=34.54;MQ=35.32;MQ0=37;OQ=98.37;QD=0.75;SB=39.28	GT:AD:DP:GL:GQ	0/1:59,72:53:-29.08,-15.96,-156.59:99
-chr1	1639726	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=70.45;MQ=36.36;MQ0=39;OQ=52.18;QD=0.37;SB=48.69	GT:AD:DP:GL:GQ	0/1:67,74:65:-28.09,-19.58,-201.69:85.02
-chr1	1639861	.	C	T	25.55	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=0;HaplotypeScore=57.75;MQ=41.48;MQ0=14;QD=0.18;SB=-23.37	GT:AD:DP:GL:GQ	0/1:90,50:90:-32.98,-27.15,-260.27:58.37
-chr1	1639867	.	C	T	19.37	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=3;HaplotypeScore=75.47;MQ=41.18;MQ0=14;QD=0.14;SB=-17.32	GT:AD:DP:GL:GQ	0/1:97,46:92:-32.93,-27.71,-303.81:52.16
-chr1	1639892	rs61777469	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=134;Dels=0.04;HRun=2;HaplotypeScore=74.14;MQ=41.98;MQ0=12;OQ=2469.47;QD=18.43;SB=-1178.56	GT:AD:DP:GL:GQ	0/1:25,104:86:-276.13,-25.90,-32.75:68.49
-chr1	1639893	rs61777470	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=134;Dels=0.00;HRun=0;HaplotypeScore=137.24;MQ=41.98;MQ0=12;OQ=2615.52;QD=19.52;SB=-1204.51	GT:AD:DP:GL:GQ	0/1:44,90:89:-291.64,-26.81,-37.18:99
-chr1	1639911	.	G	A	14.93	LowQual	AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=0;HaplotypeScore=26.42;MQ=45.76;MQ0=10;QD=0.13;SB=-12.75	GT:AD:DP:GL:GQ	0/1:81,37:78:-28.28,-23.52,-231.19:47.63
-chr1	1639962	rs61777471	C	T	260.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=54.09;MQ0=1;OQ=1805.36;QD=37.61;SB=-829.34	GT:AD:DP:GL:GQ	1/1:0,48:47:-184.14,-14.16,-0.02:99
-chr1	1640060	rs1969650	A	C	38.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=47.36;MQ0=0;OQ=1283.12;QD=25.66;SB=-659.19	GT:AD:DP:GL:GQ	1/1:0,50:43:-131.95,-12.97,-0.05:99
-chr1	1640123	rs1967676	G	T	619.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.68;MQ0=0;OQ=2013.64;QD=35.33;SB=-938.04	GT:AD:DP:GL:GQ	1/1:0,57:55:-204.96,-16.56,-0.01:99
-chr1	1640270	rs1967677	T	C	0.01	FDRtranche2.00to10.00	AC=2;AF=1.00;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=23.68;MQ=51.29;MQ0=1;OQ=2260.88;QD=25.69;SB=-1076.20	GT:AD:DP:GL:GQ	1/1:7,81:78:-241.90,-23.52,-12.23:99
-chr1	1640284	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=21.65;MQ=49.80;MQ0=1;OQ=283.77;QD=2.56;SB=107.23	GT:AD:DP:GL:GQ	0/1:95,16:94:-60.00,-28.34,-253.49:99
-chr1	1640321	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=250.42;MQ=48.13;MQ0=0;OQ=561.76;QD=3.98;SB=122.35	GT:AD:DP:GL:GQ	0/1:98,27:119:-99.13,-39.67,-333.17:99
-chr1	1640332	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=158;Dels=0.00;HRun=0;HaplotypeScore=133.26;MQ=46.63;MQ0=0;OQ=950.96;QD=6.02;SB=119.36	GT:AD:DP:GL:GQ	0/1:94,64:124:-135.74,-37.36,-315.76:99
-chr1	1640347	.	T	C	550.46	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=0;HaplotypeScore=23.57;MQ=45.32;MQ0=0;QD=3.72;SB=95.35	GT:AD:DP:GL:GQ	0/1:118,30:114:-92.67,-34.34,-350.75:99
-chr1	1640368	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=1;HaplotypeScore=38.96;MQ=45.47;MQ0=0;OQ=414.73;QD=2.94;SB=65.22	GT:AD:DP:GL:GQ	0/1:119,22:108:-77.29,-32.53,-317.79:99
-chr1	1640378	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=4;HaplotypeScore=21.61;MQ=45.56;MQ0=0;OQ=227.10;QD=1.77;SB=59.14	GT:AD:DP:GL:GQ	0/1:110,18:98:-55.53,-29.53,-284.49:99
-chr1	1640389	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=23.69;MQ=45.00;MQ0=0;OQ=372.62;QD=3.11;SB=38.14	GT:AD:DP:GL:GQ	0/1:83,37:73:-62.56,-22.01,-186.44:99
-chr1	1640393	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=0;HaplotypeScore=31.49;MQ=46.43;MQ0=0;OQ=193.70;QD=1.67;SB=47.18	GT:AD:DP:GL:GQ	0/1:63,52:78:-46.16,-23.50,-255.92:99
-chr1	1640402	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=3;HaplotypeScore=44.61;MQ=47.57;MQ0=0;OQ=589.53;QD=5.51;SB=47.18	GT:AD:DP:GL:GQ	0/1:71,36:90:-89.34,-27.11,-243.28:99
-chr1	1640405	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=1;HaplotypeScore=32.67;MQ=47.67;MQ0=0;OQ=576.56;QD=5.54;SB=44.17	GT:AD:DP:GL:GQ	0/1:79,25:85:-86.54,-25.60,-227.82:99
-chr1	1640428	.	C	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=1;HaplotypeScore=12.31;MQ=51.68;MQ0=0;OQ=687.66;QD=7.47;SB=59.21	GT:AD:DP:GL:GQ	0/1:63,29:86:-97.95,-25.90,-226.28:99
-chr1	1640435	.	T	C	0.39	PASS	AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=52.41;MQ0=0;OQ=479.95;QD=4.95;SB=65.24	GT:AD:DP:GL:GQ	0/1:69,28:91:-78.69,-27.41,-274.97:99
-chr1	1640479	.	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=10.56;MQ=53.01;MQ0=0;OQ=125.57;QD=1.23;SB=55.33	GT:AD:DP:GL:GQ	0/1:77,25:89:-42.65,-26.81,-277.44:99
-chr1	1640500	.	C	A	40.46	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=1;HaplotypeScore=5.00;MQ=52.43;MQ0=0;QD=0.42;SB=79.01	GT:AD:DP:GL:GQ	0/1:71,25:78:-30.82,-23.49,-254.06:73.30
-chr1	1640502	.	T	G	39.38	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=5.00;MQ=52.41;MQ0=0;QD=0.40;SB=58.40	GT:AD:DP:GL:GQ	0/1:73,26:82:-31.92,-24.69,-274.53:72.21
-chr1	1640517	.	C	G	1.85	PASS	AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=50.82;MQ0=0;OQ=540.14;QD=4.54;SB=-210.84	GT:AD:DP:GL:GQ	0/1:81,38:99:-87.13,-29.83,-340.31:99
-chr1	1640647	rs17845218	T	C	5.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=139;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=46.16;MQ0=1;OQ=829.41;QD=5.97;SB=-392.09	GT:AD:DP:GL:GQ	0/1:85,54:124:-123.60,-37.37,-339.83:99
-chr1	1640657	rs1059830	A	G	689.07	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=136;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=46.01;MQ0=1;QD=5.07;SB=-273.97	GT:AD:DP:GL:GQ	0/1:84,52:114:-106.55,-34.36,-315.05:99
-chr1	1640661	rs1137004	T	C	924.56	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=137;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=45.08;MQ0=1;QD=6.75;SB=-478.80	GT:AD:DP:GL:GQ	0/1:82,55:116:-130.68,-34.94,-330.64:99
-chr1	1640667	rs3200657	T	C	2206.14	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=133;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=43.98;MQ0=1;QD=16.59;SB=-708.39	GT:AD:DP:GL:GQ	0/1:59,73:112:-259.82,-35.92,-162.90:99
-chr1	1640692	.	A	G	15.57	PASS	AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=41.55;MQ0=0;OQ=1129.49;QD=8.89;SB=-491.78	GT:AD:DP:GL:GQ	0/1:59,68:99:-146.06,-29.83,-231.81:99
-chr1	1640705	rs1059831	G	A	307.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=41.79;MQ0=0;OQ=1854.51;QD=15.72;SB=-686.99	GT:AD:DP:GL:GQ	0/1:63,55:86:-214.65,-25.92,-105.31:99
-chr1	1640780	rs36191908	G	A	2.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=50.84;MQ0=0;OQ=222.00;QD=2.52;SB=-69.38	GT:AD:DP:GL:GQ	0/1:66,22:78:-49.00,-23.51,-215.31:99
-chr1	1640799	.	G	A	26.24	LowQual	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=54.16;MQ0=0;QD=0.29;SB=-18.77	GT:AD:DP:GL:GQ	0/1:79,12:87:-32.13,-26.22,-265.70:59.07
-chr1	1640856	.	T	C	1.18	PASS	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=51.06;MQ0=0;OQ=537.04;QD=4.84;SB=42.60	GT:AD:DP:GL:GQ	0/1:73,38:93:-85.00,-28.02,-284.38:99
-chr1	1640863	.	G	A	0.15	PASS	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=2;HaplotypeScore=0.93;MQ=50.41;MQ0=0;OQ=682.37;QD=6.20;SB=40.52	GT:AD:DP:GL:GQ	0/1:69,41:93:-99.55,-28.03,-223.44:99
-chr1	1640907	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=91;Dels=0.01;HRun=2;HaplotypeScore=10.49;MQ=48.20;MQ0=0;OQ=731.52;QD=8.04;SB=71.23	GT:AD:DP:GL:GQ	0/1:53,37:73:-98.42,-21.99,-174.07:99
-chr1	1640923	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=64.78;MQ=43.84;MQ0=1;OQ=272.78;QD=3.17;SB=56.20	GT:AD:DP:GL:GQ	0/1:67,19:80:-54.67,-24.11,-250.01:99
-chr1	1640931	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=98.55;MQ=40.13;MQ0=1;OQ=147.14;QD=2.16;SB=38.15	GT:AD:DP:GL:GQ	0/1:57,11:64:-37.28,-19.28,-217.64:99
-chr1	1640986	.	A	C	0.64	PASS	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.69;MQ=43.40;MQ0=0;OQ=371.72;QD=5.81;SB=77.22	GT:AD:DP:GL:GQ	0/1:47,17:62:-59.13,-18.68,-158.05:99
-chr1	1640996	.	C	T	0.49	PASS	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.63;MQ=45.56;MQ0=0;OQ=291.78;QD=4.63;SB=80.17	GT:AD:DP:GL:GQ	0/1:49,14:56:-49.34,-16.88,-145.60:99
-chr1	1641016	.	C	T	53.74	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=51.28;MQ0=0;QD=0.87;SB=74.21	GT:AD:DP:GL:GQ	0/1:47,15:50:-23.72,-15.06,-152.06:86.58
-chr1	1641017	.	A	G	257.15	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=51.43;MQ0=0;QD=4.08;SB=80.28	GT:AD:DP:GL:GQ	0/1:48,15:61:-47.39,-18.39,-179.46:99
-chr1	1641026	.	C	T	369.95	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=52.99;MQ0=0;QD=5.97;SB=74.25	GT:AD:DP:GL:GQ	0/1:47,15:60:-58.35,-18.07,-168.55:99
-chr1	1641040	.	G	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=2;HaplotypeScore=2.80;MQ=51.94;MQ0=0;OQ=253.54;QD=4.23;SB=74.26	GT:AD:DP:GL:GQ	0/1:44,15:55:-45.26,-16.62,-168.61:99
-chr1	1641126	rs12137617	A	G	24.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=2.12;MQ=54.87;MQ0=0;OQ=1275.18;QD=31.10;SB=-536.43	GT:AD:DP:GL:GQ	1/1:0,41:37:-131.12,-11.15,-0.02:99
-chr1	1641482	rs11260627	C	T	34.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=55.33;MQ0=0;OQ=1435.98;QD=36.82;SB=-496.00	GT:AD:DP:GL:GQ	1/1:0,39:37:-147.19,-11.15,-0.01:99
-chr1	1641491	rs12135951	T	G	20.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=56.50;MQ0=0;OQ=197.57;QD=5.20;SB=-66.56	GT:AD:DP:GL:GQ	0/1:25,13:35:-33.59,-10.55,-90.46:99
-chr1	1641587	rs12044811	G	A	0.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=15.92;MQ=55.20;MQ0=1;OQ=1462.24;QD=35.66;SB=-578.76	GT:AD:DP:GL:GQ	1/1:1,40:37:-149.82,-11.15,-0.01:99
-chr1	1641608	rs12044814	G	C	398.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.85;MQ0=0;OQ=998.26;QD=30.25;SB=-358.22	GT:AD:DP:GL:GQ	1/1:1,32:26:-103.43,-7.84,-0.02:78.25
-chr1	1641675	rs4648768	T	C	52.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.85;MQ=49.39;MQ0=0;OQ=640.24;QD=18.29;SB=-205.57	GT:AD:DP:GL:GQ	1/1:0,32:21:-67.63,-6.34,-0.02:63.13
-chr1	1641761	rs4648772	T	C	503.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.21;MQ0=0;OQ=1369.78;QD=30.44;SB=-625.00	GT:AD:DP:GL:GQ	1/1:0,45:43:-140.60,-12.97,-0.03:99
-chr1	1641771	rs4648773	C	A	18.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=2.41;MQ=54.78;MQ0=0;OQ=1559.28;QD=33.90;SB=-751.90	GT:AD:DP:GL:GQ	1/1:0,46:44:-159.53,-13.25,-0.02:99
-chr1	1641797	rs4648775	G	A	91.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=54.06;MQ0=0;OQ=1591.86;QD=36.18;SB=-734.99	GT:AD:DP:GL:GQ	1/1:0,44:41:-162.79,-12.35,-0.01:99
-chr1	1641822	rs4648776	G	A	529.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.06;MQ0=0;OQ=1730.65;QD=38.46;SB=-774.66	GT:AD:DP:GL:GQ	1/1:0,45:44:-176.66,-13.26,-0.01:99
-chr1	1642086	rs4648777	A	G	238.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.56;MQ0=1;OQ=1172.89;QD=24.44;SB=-406.15	GT:AD:DP:GL:GQ	1/1:1,47:39:-120.92,-11.77,-0.04:99
-chr1	1642864	rs36039898	T	C	113.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=54.55;MQ0=0;OQ=2211.83;QD=36.26;SB=-727.29	GT:AD:DP:GL:GQ	1/1:0,61:61:-224.79,-18.37,-0.02:99
-chr1	1642888	rs16825265	C	T	105.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=54.90;MQ0=0;OQ=2464.17;QD=40.40;SB=-985.30	GT:AD:DP:GL:GQ	1/1:0,61:61:-250.01,-18.37,-0.01:99
-chr1	1643163	rs35548050	T	C	620.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.02;MQ0=0;OQ=2383.87;QD=34.06;SB=-1115.83	GT:AD:DP:GL:GQ	1/1:0,70:67:-241.99,-20.18,-0.02:99
-chr1	1643221	rs2206307	C	T	629.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.40;MQ0=0;OQ=2196.71;QD=34.87;SB=-1116.03	GT:AD:DP:GL:GQ	1/1:0,63:57:-223.28,-17.18,-0.02:99
-chr1	1643274	rs2206308	C	T	615.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.68;MQ0=0;OQ=2077.20;QD=37.77;SB=-1010.04	GT:AD:DP:GL:GQ	1/1:0,55:53:-211.32,-15.97,-0.02:99
-chr1	1643659	rs2223485	C	T	454.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.70;MQ0=1;OQ=1724.40;QD=36.69;SB=-535.21	GT:AD:DP:GL:GQ	1/1:0,47:43:-176.03,-12.95,-0.01:99
-chr1	1643745	rs61777493	C	A	268.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=53.15;MQ0=3;OQ=2449.58;QD=34.50;SB=-1240.29	GT:AD:DP:GL:GQ	1/1:3,68:66:-248.56,-19.87,-0.01:99
-chr1	1643867	.	A	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=19.40;MQ0=14;OQ=84.98;QD=3.04;SB=-10.00	GT:AD:DP:GL:GQ	0/1:13,15:12:-15.40,-3.61,-30.71:99
-chr1	1643873	.	C	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=27;Dels=0.41;HRun=0;HaplotypeScore=83.92;MQ=18.34;MQ0=14;OQ=350.65;QD=12.99;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,15:10:-42.29,-6.54,-3.64:28.97
-chr1	1643898	rs61777494	G	A	157	PASS	AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.17;MQ0=2;OQ=461.81;QD=27.17;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,16:12:-49.77,-3.61,-0.00:36.12
-chr1	1643918	rs61777495	C	T	757.85	Indel	AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.37;MQ0=1;QD=31.58;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,23:19:-79.37,-5.72,-0.00:57.19
-chr1	1643924	.	A	T	950.73	Indel	AC=2;AF=1.00;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.62;MQ0=1;QD=30.67;SB=-180.94	GT:AD:DP:GL:GQ	1/1:1,30:26:-98.67,-7.83,-0.01:78.24
-chr1	1644591	rs61777496	G	A	138.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.34;MQ0=0;OQ=130.88;QD=26.18;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,5:4:-16.62,-1.20,-0.00:12.04
-chr1	1644813	rs2056977	A	G	170.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=26.65;MQ0=9;OQ=292.06;QD=7.69;SB=-147.83	GT:AD:DP:GL:GQ	1/1:7,31:10:-32.80,-3.01,-0.01:30.08
-chr1	1645334	rs11486024	G	A	35.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=22.46;MQ0=10;OQ=345.89;QD=5.67;SB=32.11	GT:AD:DP:GL:GQ	0/1:46,15:32:-47.52,-9.65,-66.64:99
-chr1	1645788	rs28649027	G	C	26.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=2.58;MQ=53.44;MQ0=0;OQ=593.92;QD=15.23;SB=-280.31	GT:AD:DP:GL:GQ	0/1:20,19:36:-73.54,-10.87,-73.49:99
-chr1	1646881	rs61777497	T	C	0.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=11.68;MQ0=43;OQ=71.62;QD=1.23;SB=-32.65	GT:AD:DP:GL:GQ	0/1:40,18:10:-13.46,-3.01,-23.67:99
-chr1	1646928	.	C	T	0.40	PASS	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=15.38;MQ0=21;OQ=97.42;QD=2.87;SB=-39.65	GT:AD:DP:GL:GQ	0/1:20,14:7:-15.13,-2.11,-10.71:85.98
-chr1	1646938	rs61776763	A	G	17.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=2.10;MQ=17.28;MQ0=15;OQ=266.90;QD=8.34;SB=-88.98	GT:AD:DP:GL:GQ	1/1:0,32:9:-30.28,-2.71,-0.01:27.04
-chr1	1646996	rs4648783	T	C	206.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=31.62;MQ0=1;OQ=494.82;QD=9.00;SB=-214.36	GT:AD:DP:GL:GQ	0/1:25,30:43:-65.73,-12.96,-90.44:99
-chr1	1647044	rs4648784	C	G	2.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=1.82;MQ=32.49;MQ0=8;OQ=1818.45;QD=23.93;SB=-827.04	GT:AD:DP:GL:GQ	0/1:14,62:58:-202.62,-17.49,-37.52:99
-chr1	1647352	rs9439501	G	C	210.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=45.38;MQ0=4;OQ=1643.24;QD=34.96;SB=-614.99	GT:AD:DP:GL:GQ	1/1:0,47:39:-167.92,-11.75,-0.01:99
-chr1	1647425	rs11576302	G	A	125.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=52.45;MQ0=0;OQ=868.24;QD=17.72;SB=-259.77	GT:AD:DP:GL:GQ	0/1:23,26:49:-104.87,-14.76,-83.38:99
-chr1	1647461	rs11589282	T	C	44.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=0.94;MQ=51.71;MQ0=1;OQ=1927.78;QD=33.24;SB=-715.12	GT:AD:DP:GL:GQ	1/1:0,58:56:-196.39,-16.87,-0.02:99
-chr1	1648203	rs4648785	T	C	8.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=3.12;MQ=39.29;MQ0=4;OQ=1376.56;QD=30.59;SB=-396.50	GT:AD:DP:GL:GQ	1/1:0,45:38:-141.25,-11.44,-0.01:99
-chr1	1648805	rs1062057	T	C	6.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=1;HaplotypeScore=3.69;MQ=25.80;MQ0=25;OQ=1469.54;QD=13.86;SB=-734.60	GT:AD:DP:GL:GQ	0/1:45,61:78:-173.74,-23.50,-116.68:99
-chr1	1649970	rs1801781	C	A	600.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.53;MQ0=0;OQ=2075.47;QD=36.41;SB=-874.83	GT:AD:DP:GL:GQ	1/1:0,57:57:-211.15,-17.17,-0.01:99
-chr1	1650495	rs2377220	T	G	497.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=28.20;MQ0=1;OQ=1908.80;QD=31.81;SB=-547.03	GT:AD:DP:GL:GQ	1/1:0,60:54:-194.48,-16.27,-0.02:99
-chr1	1650579	.	G	C	24.29	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=1;HaplotypeScore=9.52;MQ=48.11;MQ0=12;QD=0.34;SB=80.30	GT:AD:DP:GL:GQ	0/1:60,12:43:-18.68,-12.97,-167.36:57.11
-chr1	1650586	rs28662997	T	C	0.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=7.30;MQ=48.54;MQ0=13;OQ=175.02;QD=2.22;SB=-47.44	GT:AD:DP:GL:GQ	0/1:53,26:60:-38.86,-18.08,-194.29:99
-chr1	1650595	rs1061883	T	C	0.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=3.64;MQ=49.38;MQ0=13;OQ=60.20;QD=0.69;SB=-8.74	GT:AD:DP:GL:GQ	0/1:58,29:65:-28.90,-19.59,-216.78:93.04
-chr1	1651158	rs1546882	A	G	91.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=1.86;MQ=36.24;MQ0=1;OQ=1126.99;QD=14.09;SB=-474.67	GT:AD:DP:GL:GQ	0/1:32,48:73:-138.00,-22.01,-116.79:99
-chr1	1651704	rs61777505	G	C	26.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.62;MQ=32.64;MQ0=2;OQ=1226.35;QD=32.27;SB=-479.52	GT:AD:DP:GL:GQ	1/1:4,34:33:-134.22,-9.95,-8.01:19.39
-chr1	1652175	.	C	G	107.65	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.31;MQ0=18;OQ=446.15;QD=8.42;SB=-112.32	GT:AD:DP:GL:GQ	0/1:32,21:35:-58.45,-10.56,-85.98:99
-chr1	1652288	rs2281171	A	G	55.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.68;MQ=47.07;MQ0=0;OQ=1046.84;QD=33.77;SB=-483.46	GT:AD:DP:GL:GQ	1/1:0,31:31:-108.28,-9.34,-0.01:93.26
-chr1	1652674	rs61777506	T	C	260.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=54.10;MQ0=0;OQ=1515.24;QD=32.94;SB=-289.56	GT:AD:DP:GL:GQ	1/1:0,46:45:-155.13,-13.56,-0.02:99
-chr1	1652697	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=17;HaplotypeScore=26.60;MQ=53.41;MQ0=0;OQ=216.45;QD=3.80;SB=47.16	GT:AD:DP:GL:GQ	0/1:42,15:40:-36.99,-12.06,-92.34:99
-chr1	1652700	.	G	A	48.19	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=2;HaplotypeScore=19.75;MQ=52.95;MQ0=0;QD=0.96;SB=53.18	GT:AD:DP:GL:GQ	0/1:40,10:33:-18.05,-9.95,-95.61:81.03
-chr1	1652755	rs61777507	A	G	615.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.03;MQ0=0;OQ=1969.12;QD=34.55;SB=-927.86	GT:AD:DP:GL:GQ	1/1:0,57:57:-200.52,-17.17,-0.03:99
-chr1	1653262	rs34298494	A	C	3.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=4.92;MQ=57.93;MQ0=0;OQ=1820.14;QD=28.89;SB=-933.22	GT:AD:DP:GL:GQ	1/1:0,63:59:-185.65,-17.78,-0.05:99
-chr1	1653465	.	A	G	0.67	PASS	AC=2;AF=1.00;AN=2;DP=43;Dels=0.00;HRun=3;HaplotypeScore=0.82;MQ=58.69;MQ0=0;OQ=1218.77;QD=28.34;SB=-585.02	GT:AD:DP:GL:GQ	1/1:0,43:39:-125.50,-11.76,-0.03:99
-chr1	1653691	rs3817856	C	T	262.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=59.21;MQ0=0;OQ=2006.29;QD=37.85;SB=-990.80	GT:AD:DP:GL:GQ	1/1:0,53:51:-204.23,-15.37,-0.02:99
-chr1	1653879	rs2294488	T	C	118.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=52.10;MQ0=0;OQ=1419.75;QD=28.40;SB=-681.96	GT:AD:DP:GL:GQ	1/1:0,49:45:-145.60,-13.57,-0.04:99
-chr1	1653984	rs2294489	T	C	14.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=3;HaplotypeScore=0.63;MQ=58.58;MQ0=0;OQ=1353.88;QD=31.49;SB=-691.09	GT:AD:DP:GL:GQ	1/1:0,43:40:-138.99,-12.05,-0.02:99
-chr1	1655431	rs61777508	T	G	492.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.47;MQ0=3;OQ=2585.92;QD=31.92;SB=-532.88	GT:AD:DP:GL:GQ	1/1:0,81:75:-262.21,-22.59,-0.04:99
-chr1	1655473	rs4648764	A	G	513.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.46;MQ0=4;OQ=2874.97;QD=29.64;SB=-827.61	GT:AD:DP:GL:GQ	1/1:1,96:86:-291.13,-25.92,-0.05:99
-chr1	1655600	rs2281176	T	C	43.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=43.78;MQ0=0;OQ=2374.61;QD=30.44;SB=-588.04	GT:AD:DP:GL:GQ	1/1:0,78:71:-241.09,-21.40,-0.04:99
-chr1	1655607	rs2281177	T	C	16.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=43.12;MQ0=0;OQ=1801.45;QD=22.24;SB=-550.84	GT:AD:DP:GL:GQ	0/1:17,64:75:-206.03,-22.60,-57.34:99
-chr1	1656111	.	G	A	19.94	PASS	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=24.98;MQ0=9;OQ=1269.10;QD=20.14;SB=-363.89	GT:AD:DP:GL:GQ	0/1:20,43:51:-145.56,-15.37,-46.93:99
-chr1	1656198	rs2072924	G	A	130.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=-0.06;MQ=29.23;MQ0=3;OQ=1510.31;QD=34.33;SB=-636.84	GT:AD:DP:GL:GQ	1/1:0,44:39:-154.63,-11.75,-0.02:99
-chr1	1656202	rs2072925	A	G	35.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=31.20;MQ0=3;OQ=1130.90;QD=24.58;SB=-545.87	GT:AD:DP:GL:GQ	1/1:0,46:37:-116.71,-11.16,-0.04:99
-chr1	1656475	rs2076325	C	T	114.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=50.53;MQ0=0;OQ=1787.32;QD=37.24;SB=-867.16	GT:AD:DP:GL:GQ	1/1:0,48:46:-182.33,-13.86,-0.01:99
-chr1	1657113	rs1474648	T	C	589.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.20;MQ0=0;OQ=2447.49;QD=32.63;SB=-1145.82	GT:AD:DP:GL:GQ	1/1:0,75:68:-248.35,-20.48,-0.02:99
-chr1	1657231	rs1474649	A	G	31.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=4.15;MQ=49.42;MQ0=0;OQ=1497.15;QD=33.27;SB=-642.31	GT:AD:DP:GL:GQ	1/1:0,45:43:-153.31,-12.95,-0.02:99
-chr1	1657279	rs2377208	A	C	135.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=44.04;MQ0=1;OQ=1645.48;QD=30.47;SB=-668.23	GT:AD:DP:GL:GQ	1/1:0,54:48:-168.15,-14.46,-0.02:99
-chr1	1658028	rs28718827	G	T	1.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=10.14;MQ=51.62;MQ0=0;OQ=1872.10;QD=31.73;SB=-828.68	GT:AD:DP:GL:GQ	1/1:2,57:55:-190.82,-16.57,-0.03:99
-chr1	1658119	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=69;Dels=0.03;HRun=18;HaplotypeScore=24.79;MQ=51.46;MQ0=0;OQ=102.87;QD=1.49;SB=-23.99	GT:AD:DP:GL:GQ	0/1:55,12:49:-28.05,-14.47,-131.71:99
-chr1	1658135	rs2889577	A	G	0.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=15.54;MQ=53.86;MQ0=0;OQ=1611.78;QD=21.78;SB=-529.45	GT:AD:DP:GL:GQ	1/1:8,66:53:-172.54,-15.98,-7.77:82.05
-chr1	1658803	rs28537345	A	C	60.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.02;HRun=1;HaplotypeScore=0.16;MQ=51.80;MQ0=0;OQ=1884.76;QD=31.95;SB=-820.50	GT:AD:DP:GL:GQ	1/1:0,58:56:-192.08,-16.57,-0.02:99
-chr1	1659088	rs11485870	T	C	2.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=5.25;MQ=48.74;MQ0=0;OQ=1314.03;QD=25.77;SB=-582.00	GT:AD:DP:GL:GQ	1/1:2,49:46:-142.54,-13.87,-7.55:63.21
-chr1	1659426	rs9442408	C	T	56.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.73;MQ=38.94;MQ0=1;OQ=469.40;QD=7.96;SB=-62.79	GT:AD:DP:GL:GQ	0/1:41,18:57:-67.39,-17.17,-141.22:99
-chr1	1659594	rs61777512	G	T	329.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.52;MQ0=1;OQ=761.00;QD=27.18;SB=-349.52	GT:AD:DP:GL:GQ	1/1:2,26:23:-79.70,-6.93,-0.01:69.17
-chr1	1659896	.	C	A	16.91	PASS	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=18.32;MQ0=25;OQ=324.85;QD=7.55;SB=-33.35	GT:AD:DP:GL:GQ	0/1:14,29:14:-39.99,-4.22,-11.38:71.59
-chr1	1659905	.	C	T	19.49	PASS	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=18.62;MQ0=24;OQ=356.25;QD=8.28;SB=-31.52	GT:AD:DP:GL:GQ	0/1:14,29:15:-43.43,-4.52,-12.58:80.58
-chr1	1661214	rs2005995	G	A	408.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=11.78;MQ0=23;OQ=327.72;QD=9.93;SB=-165.22	GT:AD:DP:GL:GQ	1/1:16,17:9:-36.36,-2.71,-0.00:27.09
-chr1	1661590	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=3.96;MQ=36.56;MQ0=3;OQ=54.36;QD=1.05;SB=68.26	GT:AD:DP:GL:GQ	0/1:38,14:35:-19.28,-10.56,-129.90:87.20
-chr1	1661642	rs4648793	C	T	457.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.04;MQ0=0;OQ=1470.76;QD=37.71;SB=-587.27	GT:AD:DP:GL:GQ	1/1:0,39:38:-150.68,-11.45,-0.01:99
-chr1	1661726	rs7364986	A	T	4.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=5.15;MQ=47.34;MQ0=1;OQ=2656.76;QD=33.63;SB=-1106.52	GT:AD:DP:GL:GQ	1/1:0,79:72:-269.28,-21.69,-0.02:99
-chr1	1662002	.	C	T	0.16	PASS	AC=2;AF=1.00;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=5.72;MQ=52.52;MQ0=1;OQ=1857.08;QD=37.14;SB=-705.36	GT:AD:DP:GL:GQ	1/1:0,50:47:-189.31,-14.16,-0.02:99
-chr1	1662772	.	C	T	43.11	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=50.80;MQ0=2;QD=0.70;SB=83.20	GT:AD:DP:GL:GQ	0/1:53,9:53:-23.58,-15.98,-150.38:75.94
-chr1	1663032	.	T	C	46.58	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.24;MQ=53.54;MQ0=2;QD=0.93;SB=38.12	GT:AD:DP:GL:GQ	0/1:38,9:34:-18.20,-10.26,-102.10:79.41
-chr1	1663379	rs35790103	T	C	8.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=-0.24;MQ=57.22;MQ0=0;OQ=1409.71;QD=33.56;SB=-634.30	GT:AD:DP:GL:GQ	1/1:0,42:41:-144.58,-12.35,-0.02:99
-chr1	1663767	rs35678883	G	C	8.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=2.38;MQ=50.72;MQ0=2;OQ=2425.38;QD=39.12;SB=-647.42	GT:AD:DP:GL:GQ	1/1:0,62:56:-246.15,-16.88,-0.03:99
-chr1	1663886	rs36050429	G	C	377.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.29;MQ0=3;OQ=1259.11;QD=34.03;SB=-328.71	GT:AD:DP:GL:GQ	1/1:0,37:30:-129.51,-9.04,-0.01:90.30
-chr1	1664767	.	G	C	282.90	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.97;MQ0=0;OQ=606.08;QD=13.77;SB=-320.01	GT:AD:DP:GL:GQ	0/1:24,20:40:-75.96,-12.06,-88.71:99
-chr1	1664855	.	A	G	129.97	Indel	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=1;HaplotypeScore=9.28;MQ=43.11;MQ0=1;QD=4.06;SB=-24.89	GT:AD:DP:GL:GQ	0/1:24,8:26:-24.12,-7.84,-71.93:99
-chr1	1664856	.	G	A	433.28	Indel	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=12;HaplotypeScore=9.83;MQ=42.77;MQ0=1;QD=12.74;SB=-25.59	GT:AD:DP:GL:GQ	0/1:18,16:29:-55.35,-8.74,-47.19:99
-chr1	1665027	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=13;HaplotypeScore=3.74;MQ=53.18;MQ0=0;OQ=78.07;QD=1.28;SB=0.76	GT:AD:DP:GL:GQ	0/1:47,14:45:-24.65,-13.56,-131.48:99
-chr1	1665395	.	C	T	17.70	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.53;MQ=22.06;MQ0=30;QD=0.34;SB=14.07	GT:AD:DP:GL:GQ	0/1:42,10:21:-11.37,-6.32,-66.25:50.46
-chr1	1667416	rs16824474	G	C	10.38	LowQual	AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=47.86;MQ0=3;QD=0.61;SB=-0.97	GT:AD:DP:GL:GQ	0/1:12,5:14:-8.50,-4.22,-50.97:42.79
-chr1	1670869	.	G	C	14.33	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=45.06;MQ0=4;QD=0.19;SB=74.28	GT:AD:DP:GL:GQ	0/1:64,12:62:-23.39,-18.69,-239.55:47
-chr1	1670881	.	G	C	19.24	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=4.38;MQ=42.81;MQ0=4;QD=0.27;SB=74.28	GT:AD:DP:GL:GQ	0/1:59,12:59:-22.99,-17.79,-226.11:52.02
-chr1	1670904	.	C	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=38.22;MQ0=4;OQ=63.86;QD=0.91;SB=56.13	GT:AD:DP:GL:GQ	0/1:50,20:51:-25.06,-15.39,-141.72:96.69
-chr1	1670928	.	G	A	848.58	HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=30.83;MQ0=10;QD=13.91;SB=-297.25	GT:AD:DP:GL:GQ	0/1:30,31:35:-98.68,-10.54,-33.99:99
-chr1	1670936	.	G	T	255.10	DPFilter;HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=3;HaplotypeScore=4.00;MQ=28.80;MQ0=12;QD=3.99;SB=20.07	GT:AD:DP:GL:GQ	0/1:33,31:36:-39.64,-10.84,-86.07:99
-chr1	1671525	rs35301881	C	T	26.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=43.35;MQ0=4;OQ=980.88;QD=30.65;SB=-483.00	GT:AD:DP:GL:GQ	1/1:4,28:26:-101.68,-7.83,-0.01:78.25
-chr1	1672234	rs4648812	G	A	127.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=26.23;MQ0=1;OQ=275.04;QD=7.86;SB=-150.63	GT:AD:DP:GL:GQ	0/1:24,11:30:-39.83,-9.05,-63.69:99
-chr1	1673187	rs14390	C	T	78.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=730.68;QD=36.53;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,20:19:-76.66,-5.72,-0.00:57.19
-chr1	1673425	rs12588	G	A	34.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=30.14;MQ0=16;OQ=466.02;QD=6.66;SB=-83.01	GT:AD:DP:GL:GQ	0/1:47,23:47:-64.06,-14.17,-100.00:99
-chr1	1675073	rs2072928	C	G	44.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=1.71;MQ=59.55;MQ0=0;OQ=1934.62;QD=37.93;SB=-835.43	GT:AD:DP:GL:GQ	1/1:0,51:47:-197.07,-14.17,-0.02:99
-chr1	1675900	rs4751	G	T	24.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=1.42;MQ=59.65;MQ0=0;OQ=1889.22;QD=34.99;SB=-617.91	GT:AD:DP:GL:GQ	1/1:0,54:52:-192.52,-15.66,-0.02:99
-chr1	1676803	rs2072929	T	C	69.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.48;MQ0=0;OQ=1256.22;QD=28.55;SB=-491.53	GT:AD:DP:GL:GQ	1/1:0,44:41:-129.26,-12.37,-0.05:99
-chr1	1676822	rs2076327	C	T	34.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=4.10;MQ=58.97;MQ0=0;OQ=1637.49;QD=36.39;SB=-774.03	GT:AD:DP:GL:GQ	1/1:0,45:43:-167.35,-12.96,-0.02:99
-chr1	1677485	rs34306661	T	C	77.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.61;MQ=60.00;MQ0=0;OQ=1787.88;QD=27.94;SB=-566.94	GT:AD:DP:GL:GQ	1/1:0,64:57:-182.43,-17.19,-0.05:99
-chr1	1677651	.	C	T	157.32	PASS	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.08;MQ0=0;OQ=1381.04;QD=20.92;SB=-549.37	GT:AD:DP:GL:GQ	0/1:23,43:64:-160.68,-19.29,-80.55:99
-chr1	1677956	.	C	T	7.81	PASS	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.35;MQ=59.68;MQ0=0;OQ=1209.30;QD=20.50;SB=-531.10	GT:AD:DP:GL:GQ	0/1:22,37:56:-141.09,-16.88,-73.03:99
-chr1	1678052	rs2281173	A	G	576.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1215.40;QD=30.39;SB=-536.99	GT:AD:DP:GL:GQ	1/1:0,40:39:-125.17,-11.77,-0.04:99
-chr1	1678329	rs4648623	C	G	0.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=58.16;MQ0=0;OQ=844.68;QD=36.73;SB=-124.74	GT:AD:DP:GL:GQ	1/1:0,23:22:-88.07,-6.64,-0.02:66.21
-chr1	1678373	rs4648624	G	T	1.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=58.84;MQ0=0;OQ=639.15;QD=31.96;SB=-120.84	GT:AD:DP:GL:GQ	1/1:0,20:19:-67.51,-5.72,-0.01:57.16
-chr1	1679024	rs2235536	C	T	173.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=58.47;MQ0=0;OQ=2302.66;QD=39.70;SB=-1126.49	GT:AD:DP:GL:GQ	1/1:0,58:58:-233.87,-17.47,-0.02:99
-chr1	1679622	rs2235537	T	C	108.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=59.56;MQ0=0;OQ=1772.95;QD=33.45;SB=-589.32	GT:AD:DP:GL:GQ	1/1:0,53:52:-180.90,-15.67,-0.02:99
-chr1	1681624	.	G	A	66.45	PASS	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=58.28;MQ0=0;OQ=379.97;QD=10.00;SB=-141.64	GT:AD:DP:GL:GQ	0/1:24,13:33:-51.23,-9.94,-69.72:99
-chr1	1682181	rs1107910	T	C	610.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1733.17;QD=30.41;SB=-652.94	GT:AD:DP:GL:GQ	1/1:0,57:55:-176.95,-16.58,-0.05:99
-chr1	1683963	rs2011384	A	G	3.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=4.20;MQ=58.55;MQ0=0;OQ=1546.21;QD=34.36;SB=-525.21	GT:AD:DP:GL:GQ	1/1:0,45:43:-158.22,-12.95,-0.01:99
-chr1	1684111	.	C	T	6.27	PASS	AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=0;HaplotypeScore=5.81;MQ=58.90;MQ0=0;OQ=1337.84;QD=16.12;SB=-601.14	GT:AD:DP:GL:GQ	0/1:40,41:79:-160.90,-23.83,-119.77:99
-chr1	1685322	rs4648629	C	A	210.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.13;MQ0=0;OQ=2599.96;QD=34.67;SB=-1123.97	GT:AD:DP:GL:GQ	1/1:0,75:71:-263.60,-21.38,-0.02:99
-chr1	1685434	rs876029	G	T	83.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1202.21;QD=31.64;SB=-492.27	GT:AD:DP:GL:GQ	1/1:0,38:36:-123.83,-10.85,-0.02:99
-chr1	1685691	rs63093560	C	T	514.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.49;MQ0=0;OQ=1899.13;QD=37.98;SB=-713.35	GT:AD:DP:GL:GQ	1/1:0,50:49:-193.52,-14.77,-0.02:99
-chr1	1686194	rs35270315	A	C	13.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=3.38;MQ=58.28;MQ0=0;OQ=2324.40;QD=30.19;SB=-1042.79	GT:AD:DP:GL:GQ	1/1:0,77:73:-236.08,-22.00,-0.06:99
-chr1	1686519	.	A	G	162.43	PASS	AC=2;AF=1.00;AN=2;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=1839.98;QD=29.21;SB=-784.98	GT:AD:DP:GL:GQ	1/1:0,63:60:-187.66,-18.11,-0.08:99
-chr1	1687967	rs35086222	C	T	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=6;HaplotypeScore=6.25;MQ=58.18;MQ0=0;OQ=2341.51;QD=37.77;SB=-1078.61	GT:AD:DP:GL:GQ	1/1:1,61:60:-237.76,-18.08,-0.02:99
-chr1	1688667	rs4648826	C	G	14.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.45;MQ=58.62;MQ0=0;OQ=2540.02;QD=41.64;SB=-864.78	GT:AD:DP:GL:GQ	1/1:0,61:58:-257.61,-17.48,-0.02:99
-chr1	1689061	rs4648827	C	A	174	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2030.67;QD=34.42;SB=-1001.13	GT:AD:DP:GL:GQ	1/1:1,58:58:-206.68,-17.47,-0.02:99
-chr1	1692374	rs6658139	T	C	285.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.82;MQ0=0;OQ=1093.26;QD=29.55;SB=-273.03	GT:AD:DP:GL:GQ	0/1:3,34:37:-123.62,-11.15,-11.29:1.44
-chr1	1694514	rs61774982	C	A	248.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.73;MQ0=0;OQ=726.51;QD=34.60;SB=-285.07	GT:AD:DP:GL:GQ	1/1:0,21:21:-76.24,-6.33,-0.01:63.18
-chr1	1695016	.	T	A	11.74	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=37;Dels=0.03;HRun=0;HaplotypeScore=27.67;MQ=32.06;MQ0=0;QD=0.32;SB=-25.92	GT:AD:DP:GL:GQ	0/1:10,26:10:-7.44,-3.01,-29.53:44.28
-chr1	1695024	.	T	A	13.63	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=9.62;MQ=29.68;MQ0=0;QD=0.39;SB=-25.92	GT:AD:DP:GL:GQ	0/1:9,26:10:-7.64,-3.01,-29.53:46.28
-chr1	1695026	.	T	A	81.80	SnpCluster	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=6.65;MQ=32.06;MQ0=0;QD=2.21;SB=-59.89	GT:AD:DP:GL:GQ	0/1:8,29:12:-15.08,-3.61,-28.63:99
-chr1	1695028	.	T	A	128.81	SnpCluster	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.66;MQ=32.06;MQ0=0;QD=3.48;SB=-77.75	GT:AD:DP:GL:GQ	0/1:7,30:9:-18.88,-2.71,-13.92:99
-chr1	1695464	rs61774983	A	G	565.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.28;MQ0=0;OQ=1675.23;QD=34.19;SB=-712.27	GT:AD:DP:GL:GQ	1/1:0,49:49:-171.13,-14.76,-0.02:99
-chr1	1695607	rs6603809	G	A	610.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.73;MQ0=0;OQ=1827.34;QD=36.55;SB=-919.23	GT:AD:DP:GL:GQ	1/1:0,50:48:-186.34,-14.47,-0.02:99
-chr1	1695633	rs6603810	A	G	70.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.63;MQ0=1;OQ=1141.91;QD=27.85;SB=-557.89	GT:AD:DP:GL:GQ	1/1:0,41:37:-117.81,-11.16,-0.04:99
-chr1	1695996	rs6603811	T	C	513.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1134.00;QD=29.08;SB=-433.18	GT:AD:DP:GL:GQ	1/1:0,39:37:-117.03,-11.17,-0.04:99
-chr1	1696020	rs7531583	A	G	565.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1293.98;QD=28.76;SB=-649.94	GT:AD:DP:GL:GQ	1/1:0,45:43:-133.03,-12.97,-0.04:99
-chr1	1697600	rs12041925	T	G	3.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=58.61;MQ0=0;OQ=1724.62;QD=29.73;SB=-619.85	GT:AD:DP:GL:GQ	1/1:0,58:53:-176.09,-15.97,-0.04:99
-chr1	1702090	rs10907194	C	T	0.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=5.73;MQ=57.94;MQ0=0;OQ=1197.78;QD=35.23;SB=-529.68	GT:AD:DP:GL:GQ	1/1:1,33:31:-123.37,-9.34,-0.01:93.30
-chr1	1703208	rs10907195	C	T	76.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.55;MQ0=0;OQ=1814.27;QD=37.80;SB=-686.40	GT:AD:DP:GL:GQ	1/1:0,48:45:-185.02,-13.55,-0.01:99
-chr1	1703574	rs454577	T	G	67.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=652.72;QD=31.08;SB=-294.53	GT:AD:DP:GL:GQ	1/1:0,21:20:-68.87,-6.03,-0.01:60.16
-chr1	1703729	rs7534617	T	G	38.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.32;MQ=59.38;MQ0=0;OQ=1200.11;QD=32.44;SB=-519.95	GT:AD:DP:GL:GQ	1/1:0,37:36:-123.61,-10.85,-0.02:99
-chr1	1704871	rs742359	C	A	251.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.49;MQ0=0;OQ=1398.04;QD=31.07;SB=-698.80	GT:AD:DP:GL:GQ	1/1:0,45:41:-143.41,-12.36,-0.02:99
-chr1	1706848	.	G	A	26.61	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=2;HaplotypeScore=3.11;MQ=59.44;MQ0=0;QD=0.65;SB=62.22	GT:AD:DP:GL:GQ	0/1:33,8:34:-16.19,-10.25,-103.26:59.43
-chr1	1709327	.	C	A	45.07	LowQual	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=18;HaplotypeScore=15.97;MQ=51.18;MQ0=0;QD=1.07;SB=-1.26	GT:AD:DP:GL:GQ	0/1:34,8:30:-16.83,-9.04,-86.61:77.90
-chr1	1710980	.	G	C	20.70	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=2.37;MQ=53.66;MQ0=1;QD=0.48;SB=38.15	GT:AD:DP:GL:GQ	0/1:38,5:37:-16.51,-11.16,-138.32:53.50
-chr1	1712688	rs3737627	G	A	389.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1534.00;QD=37.41;SB=-461.61	GT:AD:DP:GL:GQ	1/1:0,41:41:-157.01,-12.36,-0.03:99
-chr1	1715121	rs7545812	A	G	362.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=2055.38;QD=33.69;SB=-1042.38	GT:AD:DP:GL:GQ	1/1:0,61:58:-209.15,-17.47,-0.02:99
-chr1	1715620	rs6690956	C	T	11.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=5.08;MQ=58.81;MQ0=0;OQ=2937.89;QD=37.67;SB=-1197.36	GT:AD:DP:GL:GQ	1/1:0,77:75:-297.40,-22.60,-0.03:99
-chr1	1716741	.	G	A	184.26	PASS	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=52.39;MQ0=0;OQ=1148.50;QD=16.18;SB=-579.64	GT:AD:DP:GL:GQ	0/1:37,34:69:-138.94,-20.80,-109.67:99
-chr1	1718547	rs6603794	C	G	73.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=3.81;MQ=57.85;MQ0=0;OQ=2921.36;QD=42.96;SB=-1363.94	GT:AD:DP:GL:GQ	1/1:0,68:67:-295.74,-20.18,-0.02:99
-chr1	1722071	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=84;Dels=0.01;HRun=18;HaplotypeScore=24.45;MQ=58.30;MQ0=0;OQ=60.55;QD=0.72;SB=155.39	GT:AD:DP:GL:GQ	0/1:70,13:70:-30.14,-20.80,-197.36:93.38
-chr1	1724830	rs12077553	C	T	351.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.34;MQ0=0;OQ=2450.74;QD=39.53;SB=-952.27	GT:AD:DP:GL:GQ	1/1:0,62:62:-248.68,-18.68,-0.02:99
-chr1	1726513	rs12134783	T	G	35.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=59.11;MQ0=0;OQ=1936.28;QD=28.47;SB=-959.69	GT:AD:DP:GL:GQ	1/1:0,68:64:-197.28,-19.30,-0.07:99
-chr1	1726715	rs11260613	A	G	12.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=55.98;MQ0=0;OQ=727.27;QD=23.46;SB=-220.64	GT:AD:DP:GL:GQ	1/1:0,31:24:-76.34,-7.24,-0.02:72.14
-chr1	1728231	rs11585349	C	T	444.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.78;MQ0=0;OQ=853.44;QD=13.13;SB=-325.29	GT:AD:DP:GL:GQ	0/1:37,28:63:-107.61,-18.98,-131.07:99
-chr1	1728793	.	C	A	11.24	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=87;Dels=0.01;HRun=20;HaplotypeScore=12.66;MQ=49.01;MQ0=7;QD=0.13;SB=83.42	GT:AD:DP:GL:GQ	0/1:67,19:60:-22.45,-18.07,-182.40:43.74
-chr1	1731385	rs12407008	A	G	570.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=1462.68;QD=34.02;SB=-730.24	GT:AD:DP:GL:GQ	1/1:0,43:43:-149.87,-12.95,-0.02:99
-chr1	1733337	rs4648725	G	C	64.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=54.96;MQ0=0;OQ=2515.07;QD=40.57;SB=-1047.66	GT:AD:DP:GL:GQ	1/1:0,62:59:-255.12,-17.78,-0.02:99
-chr1	1733967	rs6603795	T	C	231.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.62;MQ0=0;OQ=1265.69;QD=28.77;SB=-184.41	GT:AD:DP:GL:GQ	1/1:0,44:42:-130.20,-12.68,-0.05:99
-chr1	1736016	rs12408690	A	G	634.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1961.02;QD=35.02;SB=-638.31	GT:AD:DP:GL:GQ	1/1:0,56:56:-199.70,-16.87,-0.02:99
-chr1	1736120	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=20;HaplotypeScore=11.72;MQ=42.99;MQ0=2;OQ=648.30;QD=8.64;SB=8.14	GT:AD:DP:GL:GQ	0/1:44,31:58:-85.60,-17.49,-115.79:99
-chr1	1737932	.	A	T	32.39	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=5;HaplotypeScore=48.11;MQ=56.04;MQ0=0;QD=0.40;SB=116.40	GT:AD:DP:GL:GQ	0/1:65,15:66:-26.41,-19.89,-217.38:65.23
-chr1	1737943	.	C	T	27.67	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=20;HaplotypeScore=10.01;MQ=51.69;MQ0=1;QD=0.36;SB=101.33	GT:AD:DP:GL:GQ	0/1:61,16:52:-21.72,-15.67,-162.40:60.50
-chr1	1739272	.	T	G	33.88	PASS	AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=1;HaplotypeScore=2.35;MQ=58.21;MQ0=0;OQ=1071.30;QD=13.56;SB=-555.72	GT:AD:DP:GL:GQ	0/1:40,39:77:-133.61,-23.19,-145.75:99
-chr1	1741546	rs12140085	T	C	459.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.38;MQ0=0;OQ=960.01;QD=14.12;SB=-398.30	GT:AD:DP:GL:GQ	0/1:32,36:66:-119.17,-19.88,-129.12:99
-chr1	1741636	rs11260615	A	G	471.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.06;MQ0=1;OQ=1308.14;QD=29.07;SB=-638.27	GT:AD:DP:GL:GQ	1/1:1,44:42:-134.44,-12.67,-0.04:99
-chr1	1742815	rs4648726	C	T	274.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=3089.56;QD=40.12;SB=-1427.40	GT:AD:DP:GL:GQ	1/1:0,77:77:-312.56,-23.19,-0.02:99
-chr1	1743224	rs7542340	T	C	171.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=3;HaplotypeScore=-0.06;MQ=58.50;MQ0=0;OQ=2101.69;QD=35.62;SB=-1028.76	GT:AD:DP:GL:GQ	1/1:0,59:59:-213.77,-17.77,-0.02:99
-chr1	1744541	.	G	A	32.03	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=61;Dels=0.03;HRun=20;HaplotypeScore=23.82;MQ=51.57;MQ0=1;QD=0.53;SB=71.26	GT:AD:DP:GL:GQ	0/1:45,13:49:-20.64,-14.16,-151.56:64.87
-chr1	1748886	rs9786963	T	C	652.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1920.23;QD=32.55;SB=-686.89	GT:AD:DP:GL:GQ	1/1:0,59:59:-195.65,-17.79,-0.04:99
-chr1	1748914	rs10907187	G	A	586.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2397.92;QD=36.89;SB=-817.09	GT:AD:DP:GL:GQ	1/1:0,65:65:-243.43,-19.61,-0.05:99
-chr1	1750849	rs12568603	A	C	141.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=1462.88;QD=34.02;SB=-618.64	GT:AD:DP:GL:GQ	1/1:0,43:43:-149.89,-12.95,-0.02:99
-chr1	1751196	rs1999704	A	C	13.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=2.14;MQ=56.69;MQ0=1;OQ=2047.05;QD=32.49;SB=-593.04	GT:AD:DP:GL:GQ	1/1:1,62:59:-208.31,-17.77,-0.02:99
-chr1	1751865	rs11260616	A	T	0.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=6;HaplotypeScore=1.13;MQ=59.11;MQ0=0;OQ=1852.12;QD=35.62;SB=-771.53	GT:AD:DP:GL:GQ	1/1:0,52:52:-188.82,-15.67,-0.02:99
-chr1	1751874	rs7553640	T	C	711.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1893.02;QD=35.06;SB=-889.04	GT:AD:DP:GL:GQ	1/1:0,54:53:-192.90,-15.97,-0.02:99
-chr1	1752558	rs6603796	T	C	171.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=56.20;MQ0=0;OQ=1646.02;QD=32.27;SB=-583.16	GT:AD:DP:GL:GQ	1/1:0,51:48:-168.22,-14.47,-0.03:99
-chr1	1755443	rs6603797	T	C	720.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=2694.93;QD=35.46;SB=-935.73	GT:AD:DP:GL:GQ	1/1:0,76:74:-273.10,-22.29,-0.02:99
-chr1	1755954	rs6663586	A	C	220.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.45;MQ0=0;OQ=1370.69;QD=32.64;SB=-604.02	GT:AD:DP:GL:GQ	1/1:0,42:40:-140.67,-12.05,-0.02:99
-chr1	1756219	rs6603798	A	G	29.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=55.51;MQ0=2;OQ=1475.64;QD=28.38;SB=-669.92	GT:AD:DP:GL:GQ	1/1:2,50:47:-151.19,-14.18,-0.04:99
-chr1	1757221	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=20;HaplotypeScore=10.23;MQ=53.30;MQ0=1;OQ=618.88;QD=9.67;SB=31.58	GT:AD:DP:GL:GQ	0/1:38,25:58:-82.66,-17.49,-122.37:99
-chr1	1758520	rs10752417	C	G	0.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=106;Dels=0.00;HRun=1;HaplotypeScore=5.58;MQ=57.83;MQ0=0;OQ=4550.45;QD=42.93;SB=-2086.29	GT:AD:DP:GL:GQ	1/1:0,106:103:-454.04,-31.03,-0.03:99
-chr1	1758754	rs10907188	C	T	32.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=2.66;MQ=58.85;MQ0=1;OQ=2558.37;QD=38.18;SB=-882.18	GT:AD:DP:GL:GQ	1/1:1,66:64:-259.44,-19.28,-0.02:99
-chr1	1759918	rs6603799	T	C	1.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=10.20;MQ=56.09;MQ0=0;OQ=1988.53;QD=33.14;SB=-981.94	GT:AD:DP:GL:GQ	1/1:1,59:56:-202.45,-16.87,-0.02:99
-chr1	1760648	rs6657357	C	G	301.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.38;MQ0=0;OQ=2954.84;QD=38.37;SB=-1347.06	GT:AD:DP:GL:GQ	1/1:0,77:74:-299.12,-22.32,-0.05:99
-chr1	1760649	rs6665287	T	A	112.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=59.39;MQ0=0;OQ=2934.49;QD=37.15;SB=-1492.41	GT:AD:DP:GL:GQ	1/1:0,79:78:-297.05,-23.49,-0.02:99
-chr1	1762348	rs6603800	T	G	88.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=59.54;MQ0=0;OQ=1401.85;QD=28.04;SB=-481.90	GT:AD:DP:GL:GQ	1/1:0,50:43:-143.80,-12.96,-0.03:99
-chr1	1762595	rs10907189	T	C	215.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=58.73;MQ0=1;OQ=2558.08;QD=35.53;SB=-1178.50	GT:AD:DP:GL:GQ	1/1:1,71:71:-259.41,-21.39,-0.02:99
-chr1	1763512	rs11260618	A	G	251.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=34.24;MQ0=0;OQ=1296.92;QD=19.36;SB=-537.23	GT:AD:DP:GL:GQ	1/1:0,67:42:-133.32,-12.67,-0.05:99
-chr1	1763520	rs11260619	C	G	204.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=32.31;MQ0=0;OQ=1789.21;QD=27.11;SB=-722.93	GT:AD:DP:GL:GQ	1/1:0,66:41:-182.52,-12.35,-0.01:99
-chr1	1763525	rs11260620	T	C	490.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.33;MQ0=0;OQ=1197.40;QD=18.42;SB=-469.25	GT:AD:DP:GL:GQ	1/1:0,65:37:-123.35,-11.15,-0.02:99
-chr1	1763536	rs11260621	T	C	53.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=2.15;MQ=32.77;MQ0=1;OQ=1342.11;QD=19.74;SB=-614.98	GT:AD:DP:GL:GQ	1/1:1,67:42:-137.83,-12.66,-0.03:99
-chr1	1763632	rs10907190	G	A	500.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.92;MQ0=0;OQ=2342.36;QD=38.40;SB=-955.26	GT:AD:DP:GL:GQ	1/1:0,61:60:-237.85,-18.08,-0.03:99
-chr1	1765035	rs11260622	A	G	3.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=4.83;MQ=58.68;MQ0=1;OQ=1949.34;QD=28.25;SB=-876.43	GT:AD:DP:GL:GQ	1/1:0,68:61:-198.58,-18.40,-0.06:99
-chr1	1766129	rs4648727	C	A	222.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=59.39;MQ0=0;OQ=2474.83;QD=35.87;SB=-1254.46	GT:AD:DP:GL:GQ	1/1:0,69:68:-251.09,-20.48,-0.02:99
-chr1	1768896	rs6692959	T	C	606.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=2761.38;QD=31.74;SB=-1372.68	GT:AD:DP:GL:GQ	1/1:0,87:87:-279.80,-26.24,-0.08:99
-chr1	1769657	.	A	T	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=45;Dels=0.02;HRun=0;HaplotypeScore=8.89;MQ=56.00;MQ0=1;OQ=229.76;QD=5.11;SB=-125.76	GT:AD:DP:GL:GQ	0/1:24,18:27:-34.10,-7.84,-57.21:99
-chr1	1770738	rs6603801	T	C	614.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1986.61;QD=34.85;SB=-910.02	GT:AD:DP:GL:GQ	1/1:0,57:57:-202.27,-17.17,-0.02:99
-chr1	1771205	rs6664578	G	A	696.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=3186.74;QD=38.39;SB=-1518.58	GT:AD:DP:GL:GQ	1/1:0,83:81:-322.28,-24.40,-0.02:99
-chr1	1772480	rs12066667	C	T	200.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.77;MQ0=0;OQ=1986.28;QD=37.48;SB=-1001.85	GT:AD:DP:GL:GQ	1/1:0,53:51:-202.23,-15.37,-0.02:99
-chr1	1773061	rs12402876	G	A	282.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=57.70;MQ0=0;OQ=2522.68;QD=37.10;SB=-929.21	GT:AD:DP:GL:GQ	1/1:0,68:65:-255.88,-19.59,-0.03:99
-chr1	1773444	rs7526236	G	A	531.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=1822.31;QD=37.96;SB=-748.50	GT:AD:DP:GL:GQ	1/1:0,48:47:-185.83,-14.16,-0.02:99
-chr1	1782409	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=18;HaplotypeScore=10.25;MQ=50.63;MQ0=2;OQ=451.92;QD=7.66;SB=-97.66	GT:AD:DP:GL:GQ	0/1:39,20:52:-64.14,-15.67,-118.24:99
-chr1	1782428	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=65;Dels=0.02;HRun=18;HaplotypeScore=18.34;MQ=52.25;MQ0=1;OQ=88.42;QD=1.36;SB=56.19	GT:AD:DP:GL:GQ	0/1:56,8:49:-26.89,-14.77,-145.13:99
-chr1	1782863	rs1889678	A	G	536.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.83;MQ0=0;OQ=1352.43;QD=28.18;SB=-598.57	GT:AD:DP:GL:GQ	1/1:0,48:43:-138.86,-12.97,-0.04:99
-chr1	1782931	rs12076620	A	G	575.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=1635.06;QD=34.79;SB=-754.18	GT:AD:DP:GL:GQ	1/1:0,47:46:-167.10,-13.85,-0.01:99
-chr1	1782971	rs10907192	A	G	594.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=1599.36;QD=34.03;SB=-532.43	GT:AD:DP:GL:GQ	1/1:0,47:46:-163.54,-13.86,-0.02:99
-chr1	1783646	rs7511905	A	C	266.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1582.35;QD=31.65;SB=-751.07	GT:AD:DP:GL:GQ	1/1:0,50:47:-161.84,-14.16,-0.02:99
-chr1	1785347	rs6660452	A	C	506.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.51;MQ0=0;OQ=1748.60;QD=30.15;SB=-666.84	GT:AD:DP:GL:GQ	1/1:0,58:55:-178.49,-16.58,-0.04:99
-chr1	1785613	.	C	A	22.53	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=20;HaplotypeScore=2.54;MQ=46.56;MQ0=0;QD=0.48;SB=89.31	GT:AD:DP:GL:GQ	0/1:40,7:41:-17.88,-12.35,-133.39:55.34
-chr1	1785636	rs6697311	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=101;Dels=0.01;HRun=20;HaplotypeScore=31.36;MQ=43.36;MQ0=1;OQ=989.12;QD=9.79;SB=-44.45	GT:AD:DP:GL:GQ	0/1:50,49:75:-124.51,-22.31,-136.94:99
-chr1	1785639	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=98;Dels=0.01;HRun=4;HaplotypeScore=41.45;MQ=42.87;MQ0=1;OQ=381.85;QD=3.90;SB=86.26	GT:AD:DP:GL:GQ	0/1:59,38:65:-60.76,-19.29,-163.75:99
-chr1	1785649	rs12036384	C	T	5.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=10.21;MQ=50.24;MQ0=1;OQ=2105.43;QD=30.96;SB=-932.26	GT:AD:DP:GL:GQ	1/1:2,63:54:-214.14,-16.27,-0.02:99
-chr1	1786577	rs12134553	A	C	2.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=7.76;MQ=57.97;MQ0=1;OQ=1915.32;QD=26.98;SB=-959.05	GT:AD:DP:GL:GQ	1/1:3,68:63:-201.59,-18.99,-6.48:99
-chr1	1787250	rs6670246	T	A	192	PASS	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.78;MQ0=0;OQ=2864.46;QD=33.70;SB=-1257.90	GT:AD:DP:GL:GQ	1/1:2,83:84:-296.95,-25.31,-6.91:99
-chr1	1789560	rs4648591	T	C	58.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=47.68;MQ0=0;OQ=1563.80;QD=30.66;SB=-605.93	GT:AD:DP:GL:GQ	1/1:0,51:49:-160.01,-14.78,-0.04:99
-chr1	1789813	rs7516995	T	C	114.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.57;MQ0=0;OQ=1801.38;QD=30.53;SB=-555.03	GT:AD:DP:GL:GQ	1/1:0,59:55:-183.76,-16.58,-0.04:99
-chr1	1790511	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=100;Dels=0.02;HRun=20;HaplotypeScore=40.13;MQ=50.15;MQ0=2;OQ=70.47;QD=0.70;SB=149.46	GT:AD:DP:GL:GQ	0/1:69,28:73:-32.03,-21.69,-222.30:99
-chr1	1790894	rs4648592	G	A	598.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.49;MQ0=0;OQ=2599.64;QD=38.23;SB=-928.70	GT:AD:DP:GL:GQ	1/1:0,68:65:-263.57,-19.58,-0.02:99
-chr1	1792032	rs6666068	A	G	457.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2160.60;QD=28.43;SB=-673.85	GT:AD:DP:GL:GQ	1/1:0,76:67:-219.70,-20.20,-0.05:99
-chr1	1794162	rs3855951	C	T	52.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=2.26;MQ=59.71;MQ0=0;OQ=3179.43;QD=39.74;SB=-1555.57	GT:AD:DP:GL:GQ	1/1:0,80:79:-321.55,-23.80,-0.02:99
-chr1	1795251	rs10907193	G	A	266.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.20;MQ=60.00;MQ0=0;OQ=1860.92;QD=32.65;SB=-731.44	GT:AD:DP:GL:GQ	1/1:0,56:50:-189.71,-15.08,-0.03:99
-chr1	1796166	rs10399762	A	G	54.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=58.73;MQ0=0;OQ=1409.98;QD=25.64;SB=-484.50	GT:AD:DP:GL:GQ	1/1:0,55:46:-144.64,-13.88,-0.05:99
-chr1	1798609	.	A	T	162.96	SnpCluster	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=74.10;MQ=46.50;MQ0=2;QD=4.29;SB=-81.05	GT:AD:DP:GL:GQ	0/1:27,11:32:-29.22,-9.64,-87.24:99
-chr1	1798611	.	A	T	632.57	SnpCluster	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=43.92;MQ=46.08;MQ0=2;QD=17.10;SB=-306.76	GT:AD:DP:GL:GQ	0/1:10,25:30:-75.58,-9.04,-33.08:99
-chr1	1798613	rs57488553	A	T	825.28	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=35.29;MQ=45.64;MQ0=2;QD=22.92;SB=-393.55	GT:AD:DP:GL:GQ	0/1:7,29:31:-95.15,-9.34,-18.41:90.67
-chr1	1798615	rs58263709	A	T	846.29	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=33.82;MQ=45.64;MQ0=2;QD=23.51;SB=-402.56	GT:AD:DP:GL:GQ	0/1:6,30:30:-96.95,-9.04,-14.67:56.29
-chr1	1799369	rs11260624	C	T	198.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.40;MQ0=0;OQ=2735.01;QD=39.07;SB=-1363.94	GT:AD:DP:GL:GQ	1/1:0,69:70:-279.86,-23.72,-2.77:99
-chr1	1799950	rs7525092	C	T	160.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=3.58;MQ=59.72;MQ0=0;OQ=3051.79;QD=36.77;SB=-1420.35	GT:AD:DP:GL:GQ	1/1:0,83:79:-308.79,-23.80,-0.03:99
-chr1	1800981	rs12133865	G	A	87.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=56.12;MQ0=0;OQ=1844.69;QD=38.43;SB=-730.97	GT:AD:DP:GL:GQ	1/1:0,48:48:-188.07,-14.47,-0.02:99
-chr1	1802311	.	A	G	78.46	Indel	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=3;HaplotypeScore=2.28;MQ=57.45;MQ0=0;QD=1.09;SB=-6.51	GT:AD:DP:GL:GQ	0/1:62,10:70:-32.22,-21.09,-246.49:99
-chr1	1802688	rs6670776	G	A	560.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.03;MQ0=0;OQ=2301.44;QD=40.38;SB=-996.99	GT:AD:DP:GL:GQ	1/1:0,57:57:-233.74,-17.17,-0.01:99
-chr1	1805482	rs12138152	G	A	76.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.49;MQ0=0;OQ=2306.96;QD=39.10;SB=-1138.66	GT:AD:DP:GL:GQ	1/1:0,59:59:-234.30,-17.78,-0.02:99
-chr1	1807030	rs10796396	G	A	291.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=49.36;MQ0=0;OQ=1090.79;QD=38.96;SB=-403.67	GT:AD:DP:GL:GQ	1/1:0,28:28:-112.67,-8.43,-0.01:84.28
-chr1	1809238	rs6603804	T	C	659.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=2030.11;QD=33.84;SB=-689.61	GT:AD:DP:GL:GQ	1/1:0,60:59:-206.62,-17.78,-0.03:99
-chr1	1809966	rs28608797	A	C	520.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.00;MQ0=0;OQ=1235.99;QD=32.53;SB=-595.06	GT:AD:DP:GL:GQ	1/1:1,37:36:-127.20,-10.84,-0.01:99
-chr1	1813782	rs6688000	A	G	233.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=58.61;MQ0=0;OQ=1439.33;QD=30.62;SB=-681.87	GT:AD:DP:GL:GQ	1/1:0,46:46:-147.56,-13.87,-0.04:99
-chr1	1818624	rs12045595	G	A	59.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=59.53;MQ0=0;OQ=1836.38;QD=37.48;SB=-594.97	GT:AD:DP:GL:GQ	1/1:0,49:48:-187.24,-14.46,-0.02:99
-chr1	1821118	rs6603808	A	G	79.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.43;MQ=60.00;MQ0=0;OQ=1052.30;QD=28.44;SB=-413.55	GT:AD:DP:GL:GQ	1/1:0,37:31:-108.83,-9.34,-0.01:93.27
-chr1	1822217	rs941531	G	A	113.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=58.68;MQ0=0;OQ=2643.63;QD=39.46;SB=-1073.33	GT:AD:DP:GL:GQ	1/1:0,67:66:-267.97,-19.88,-0.02:99
-chr1	1822410	.	A	G	49.96	LowQual	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.13;MQ0=0;QD=0.89;SB=-35.78	GT:AD:DP:GL:GQ	0/1:49,7:55:-24.85,-16.57,-195.12:82.80
-chr1	1822442	rs4996032	G	A	113.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.02;HRun=2;HaplotypeScore=1.09;MQ=59.55;MQ0=0;OQ=884.12;QD=14.03;SB=-419.83	GT:AD:DP:GL:GQ	0/1:35,27:62:-110.37,-18.67,-127.42:99
-chr1	1822448	rs4996031	A	G	133.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=3.02;MQ=59.08;MQ0=1;OQ=897.87;QD=14.03;SB=-423.51	GT:AD:DP:GL:GQ	0/1:31,33:61:-111.45,-18.38,-115.75:99
-chr1	1823355	rs10454464	G	A	100.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=57.95;MQ0=0;OQ=1113.42;QD=34.79;SB=-534.62	GT:AD:DP:GL:GQ	1/1:0,31:31:-117.34,-11.71,-2.42:92.95
-chr1	1824608	rs4648731	A	G	30.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=54.33;MQ0=0;OQ=891.08;QD=28.74;SB=-233.75	GT:AD:DP:GL:GQ	1/1:0,31:26:-92.71,-7.84,-0.01:78.21
-chr1	1824902	rs11260625	G	A	47.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=46.58;MQ0=0;OQ=814.82;QD=27.16;SB=-295.36	GT:AD:DP:GL:GQ	1/1:0,25:22:-85.08,-6.64,-0.02:66.19
-chr1	1824916	rs11260626	C	T	92.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.94;MQ=48.72;MQ0=0;OQ=1289.62;QD=36.85;SB=-588.96	GT:AD:DP:GL:GQ	1/1:0,35:34:-132.56,-10.25,-0.01:99
-chr1	1825136	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=16;HaplotypeScore=8.80;MQ=56.14;MQ0=0;OQ=163.77;QD=3.72;SB=41.15	GT:AD:DP:GL:GQ	0/1:27,17:32:-29.31,-9.65,-83.86:99
-chr1	1826546	rs2748989	C	G	308.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.60;MQ0=0;OQ=2438.44;QD=41.33;SB=-736.72	GT:AD:DP:GL:GQ	1/1:0,59:58:-247.45,-17.48,-0.02:99
-chr1	1827738	rs4648732	C	T	470.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.97;MQ0=0;OQ=1741.59;QD=38.70;SB=-666.40	GT:AD:DP:GL:GQ	1/1:0,45:44:-177.75,-13.25,-0.01:99
-chr1	1828376	rs2377037	C	A	189.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=60.00;MQ0=0;OQ=1605.71;QD=33.45;SB=-826.68	GT:AD:DP:GL:GQ	1/1:1,47:46:-164.17,-13.86,-0.02:99
-chr1	1828498	rs28672079	A	G	314.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.92;MQ0=0;OQ=1270.30;QD=29.54;SB=-594.88	GT:AD:DP:GL:GQ	1/1:0,43:41:-130.66,-12.37,-0.05:99
-chr1	1829551	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=17.55;MQ=56.35;MQ0=0;OQ=57.59;QD=1.48;SB=26.11	GT:AD:DP:GL:GQ	0/1:19,19:17:-14.19,-5.14,-50.87:90.43
-chr1	1829898	rs2474461	T	C	40.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=579.60;QD=34.09;SB=-105.03	GT:AD:DP:GL:GQ	1/1:0,17:17:-61.55,-5.12,-0.01:51.14
-chr1	1830536	rs28384316	G	T	112.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=125.10;QD=25.02;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,5:5:-16.07,-1.51,-0.01:15.03
-chr1	1832651	.	A	G	0.32	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=3;HaplotypeScore=1.47;MQ=60.00;MQ0=0;OQ=742.60;QD=18.11;SB=-247.32	GT:AD:DP:GL:GQ	0/1:17,24:40:-89.59,-12.05,-62.50:99
-chr1	1834219	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=20;HaplotypeScore=9.36;MQ=53.72;MQ0=0;OQ=93.63;QD=2.46;SB=11.06	GT:AD:DP:GL:GQ	0/1:25,13:25:-20.18,-7.53,-63.71:99
-chr1	1834282	.	T	C	14.27	PASS	AC=2;AF=1.00;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=417.56;QD=26.10;SB=-221.65	GT:AD:DP:GL:GQ	1/1:0,16:14:-45.35,-4.22,-0.01:42.10
-chr1	1834553	rs28842562	C	T	275.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.51;MQ0=1;OQ=892.93;QD=34.34;SB=-192.75	GT:AD:DP:GL:GQ	1/1:0,26:23:-92.88,-6.93,-0.01:69.22
-chr1	1836321	rs41306992	C	T	57.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=59.24;MQ0=0;OQ=2100.54;QD=38.19;SB=-756.01	GT:AD:DP:GL:GQ	1/1:0,55:53:-213.65,-15.97,-0.01:99
-chr1	1836442	rs2748987	A	G	431.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.71;MQ0=0;OQ=1604.85;QD=34.15;SB=-631.28	GT:AD:DP:GL:GQ	1/1:0,47:47:-164.09,-14.16,-0.02:99
-chr1	1838594	rs941532	A	G	20.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=58.71;MQ0=0;OQ=477.15;QD=26.51;SB=-129.69	GT:AD:DP:GL:GQ	1/1:0,18:17:-51.32,-5.13,-0.02:51.08
-chr1	1839996	rs2295364	C	T	1.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.59;MQ0=0;OQ=1245.14;QD=37.73;SB=-117.65	GT:AD:DP:GL:GQ	1/1:0,33:32:-128.11,-9.64,-0.01:96.31
-chr1	1841796	rs2474458	C	A	22.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=3.16;MQ=58.78;MQ0=0;OQ=1243.51;QD=32.72;SB=-630.04	GT:AD:DP:GL:GQ	1/1:0,38:36:-127.95,-10.85,-0.01:99
-chr1	1842344	rs28508199	A	G	34.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=58.67;MQ0=0;OQ=1404.62;QD=28.67;SB=-672.87	GT:AD:DP:GL:GQ	1/1:0,49:45:-144.09,-13.57,-0.04:99
-chr1	1843148	rs1884454	G	T	340.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=56.74;MQ0=0;OQ=831.99;QD=14.34;SB=-322.02	GT:AD:DP:GL:GQ	0/1:28,30:55:-103.05,-16.57,-95.32:99
-chr1	1844181	rs2250833	A	G	20.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=995.90;QD=27.66;SB=-313.46	GT:AD:DP:GL:GQ	1/1:0,36:31:-103.20,-9.35,-0.02:93.22
-chr1	1845310	rs28423370	A	G	170.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=608.06;QD=32.00;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,19:19:-64.40,-5.72,-0.01:57.14
-chr1	1845407	.	C	A	46.94	LowQual	AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=55.21;MQ0=0;QD=9.39;SB=-10.00	GT:AD:DP:GL:GQ	0/1:2,3:5:-9.49,-1.51,-6.80:52.97
-chr1	1845958	rs752965	C	T	17.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.17;MQ0=0;OQ=985.76;QD=35.21;SB=-88.34	GT:AD:DP:GL:GQ	1/1:0,28:26:-102.17,-7.83,-0.01:78.25
-chr1	1846560	rs2092922	C	T	67.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.95;MQ0=0;OQ=1561.86;QD=36.32;SB=-529.71	GT:AD:DP:GL:GQ	1/1:0,43:41:-159.79,-12.36,-0.02:99
-chr1	1848991	rs4648734	C	T	0.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=7.13;MQ=58.00;MQ0=0;OQ=1973.99;QD=36.56;SB=-772.04	GT:AD:DP:GL:GQ	1/1:0,53:53:-203.45,-18.19,-2.47:99
-chr1	1849418	rs28670388	T	C	0.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=3;HaplotypeScore=7.22;MQ=55.28;MQ0=2;OQ=1025.15;QD=29.29;SB=-496.47	GT:AD:DP:GL:GQ	1/1:3,32:30:-106.11,-9.04,-0.01:90.24
-chr1	1850605	rs28685049	C	T	18.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=778.38;QD=38.92;SB=-47.56	GT:AD:DP:GL:GQ	1/1:0,20:20:-81.43,-6.03,-0.01:60.20
-chr1	1850678	.	T	A	0.69	PASS	AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=41.96;MQ0=0;OQ=61.03;QD=6.78;SB=5.04	GT:AD:DP:GL:GQ	0/1:6,3:9:-12.10,-2.71,-21.43:93.87
-chr1	1850683	.	G	A	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=10.93;MQ=35.14;MQ0=0;OQ=63.11;QD=9.02;SB=-3.99	GT:AD:DP:GL:GQ	0/1:4,3:6:-11.40,-1.81,-10.53:87.27
-chr1	1851012	rs55825112	G	A	257.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.15;MQ0=0;OQ=1284.14;QD=38.91;SB=-355.97	GT:AD:DP:GL:GQ	1/1:0,33:33:-132.01,-9.94,-0.01:99
-chr1	1852535	rs2474449	C	T	115.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=42.11;MQ0=1;OQ=2050.54;QD=37.28;SB=-856.64	GT:AD:DP:GL:GQ	1/1:1,54:53:-211.75,-15.96,-3.11:99
-chr1	1852731	.	T	A	22.37	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=63;Dels=0.05;HRun=20;HaplotypeScore=13.90;MQ=48.22;MQ0=0;QD=0.36;SB=16.21	GT:AD:DP:GL:GQ	0/1:42,18:40:-16.96,-11.45,-121.97:55.18
-chr1	1852818	rs4648595	A	G	3.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=3.78;MQ=50.34;MQ0=1;OQ=917.27;QD=25.48;SB=-127.78	GT:AD:DP:GL:GQ	1/1:1,35:28:-95.33,-8.44,-0.02:84.22
-chr1	1853042	.	C	A	10.89	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=20;HaplotypeScore=9.56;MQ=49.02;MQ0=4;QD=0.19;SB=86.27	GT:AD:DP:GL:GQ	0/1:51,7:42:-16.99,-12.66,-132.54:43.35
-chr1	1853068	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=2;HaplotypeScore=13.43;MQ=48.98;MQ0=4;OQ=94.12;QD=1.00;SB=104.36	GT:AD:DP:GL:GQ	0/1:70,24:65:-32.29,-19.60,-195.03:99
-chr1	1853265	rs60147457	T	C	26.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=56.17;MQ0=0;OQ=1299.21;QD=28.24;SB=-640.40	GT:AD:DP:GL:GQ	1/1:1,45:44:-136.91,-13.28,-3.40:98.74
-chr1	1855559	.	C	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=1;HaplotypeScore=1.77;MQ=58.15;MQ0=0;OQ=143.93;QD=1.87;SB=17.18	GT:AD:DP:GL:GQ	0/1:67,10:76:-40.57,-22.90,-237.26:99
-chr1	1855612	rs2748968	C	T	224.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=53.49;MQ0=2;OQ=1207.94;QD=15.10;SB=-597.02	GT:AD:DP:GL:GQ	0/1:40,40:73:-146.08,-22.00,-120.30:99
-chr1	1855646	.	T	C	0.93	PASS	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=9.48;MQ=53.45;MQ0=2;OQ=1049.44;QD=14.78;SB=-537.98	GT:AD:DP:GL:GQ	0/1:31,40:66:-128.11,-19.89,-114.90:99
-chr1	1855674	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=15.63;MQ=50.86;MQ0=1;OQ=126.19;QD=2.25;SB=-24.71	GT:AD:DP:GL:GQ	0/1:49,7:53:-31.88,-15.98,-189.82:99
-chr1	1855675	.	A	G	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=14.63;MQ=50.86;MQ0=1;OQ=886.43;QD=15.83;SB=-281.60	GT:AD:DP:GL:GQ	0/1:21,35:52:-107.60,-15.67,-76.26:99
-chr1	1856033	rs34454803	C	G	2.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=4.56;MQ=48.03;MQ0=9;OQ=1928.44;QD=26.78;SB=-825.04	GT:AD:DP:GL:GQ	1/1:9,62:49:-203.74,-17.80,-7.31:99
-chr1	1856195	rs61775027	C	T	136.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=55.46;MQ0=1;OQ=2158.57;QD=29.98;SB=-1089.45	GT:AD:DP:GL:GQ	1/1:8,64:59:-222.77,-17.79,-3.33:99
-chr1	1856465	rs34793596	C	G	37.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=2.87;MQ=54.29;MQ0=1;OQ=3153.75;QD=39.92;SB=-1439.03	GT:AD:DP:GL:GQ	1/1:3,76:75:-323.13,-22.60,-4.17:99
-chr1	1856473	rs35531706	C	G	44.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=2.23;MQ=55.29;MQ0=1;OQ=2974.48;QD=40.20;SB=-1193.83	GT:AD:DP:GL:GQ	1/1:1,73:71:-301.06,-21.40,-0.03:99
-chr1	1858345	rs28658236	G	A	98.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=0.98;MQ=60.00;MQ0=0;OQ=1111.27;QD=16.34;SB=-403.37	GT:AD:DP:GL:GQ	0/1:35,33:68:-134.91,-20.49,-114.02:99
-chr1	1859106	.	T	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=2;HaplotypeScore=6.59;MQ=57.30;MQ0=0;OQ=100.83;QD=1.80;SB=56.18	GT:AD:DP:GL:GQ	0/1:31,25:39:-25.12,-11.75,-106.73:99
-chr1	1859766	rs28592294	C	T	2.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=5.60;MQ=57.03;MQ0=0;OQ=2783.58;QD=37.62;SB=-907.72	GT:AD:DP:GL:GQ	1/1:1,72:73:-285.26,-22.00,-3.32:99
-chr1	1860070	rs2803323	G	A	91.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=58.89;MQ0=0;OQ=1564.69;QD=37.25;SB=-659.28	GT:AD:DP:GL:GQ	1/1:0,42:41:-160.07,-12.36,-0.02:99
-chr1	1861277	rs2803324	T	C	62.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=848.26;QD=30.30;SB=-320.13	GT:AD:DP:GL:GQ	1/1:0,28:28:-88.44,-8.45,-0.03:84.18
-chr1	1863485	rs12758705	G	A	595.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2263.21;QD=38.36;SB=-926.70	GT:AD:DP:GL:GQ	1/1:0,59:57:-229.92,-17.17,-0.01:99
-chr1	1864441	rs2803329	A	G	280.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=1008.85;QD=27.27;SB=-491.17	GT:AD:DP:GL:GQ	1/1:0,37:33:-104.50,-9.95,-0.03:99
-chr1	1864697	rs2803330	A	G	60.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.49;MQ0=0;OQ=756.37;QD=30.25;SB=-313.68	GT:AD:DP:GL:GQ	1/1:0,25:22:-79.23,-6.63,-0.01:66.20
-chr1	1865005	rs2803331	C	T	233.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=58.84;MQ0=0;OQ=1354.55;QD=33.86;SB=-668.39	GT:AD:DP:GL:GQ	1/1:0,37:37:-139.06,-11.16,-0.02:99
-chr1	1865127	rs2262190	A	G	525.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.03;MQ0=0;OQ=948.06;QD=30.58;SB=-404.33	GT:AD:DP:GL:GQ	1/1:0,31:30:-98.41,-9.05,-0.02:90.22
-chr1	1867098	rs2748978	T	G	544.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.39;MQ0=0;OQ=1416.47;QD=34.55;SB=-657.23	GT:AD:DP:GL:GQ	1/1:0,41:41:-145.24,-12.35,-0.01:99
-chr1	1867212	rs2803339	T	C	83.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=54.90;MQ0=0;OQ=1104.15;QD=27.60;SB=-492.17	GT:AD:DP:GL:GQ	1/1:1,39:37:-114.04,-11.17,-0.04:99
-chr1	1868944	rs2490543	C	T	282.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=58.05;MQ0=0;OQ=849.11;QD=14.15;SB=-315.86	GT:AD:DP:GL:GQ	0/1:33,27:55:-104.77,-16.57,-95.97:99
-chr1	1868947	rs28573337	G	A	161.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=57.95;MQ0=0;OQ=983.65;QD=17.26;SB=-292.79	GT:AD:DP:GL:GQ	0/1:26,31:55:-118.23,-16.58,-80.47:99
-chr1	1869420	rs28498068	T	G	172.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=56.75;MQ0=0;OQ=395.95;QD=11.31;SB=-182.88	GT:AD:DP:GL:GQ	0/1:18,17:34:-53.12,-10.25,-61.66:99
-chr1	1869908	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=14;HaplotypeScore=14.65;MQ=46.99;MQ0=0;OQ=127.58;QD=2.90;SB=11.06	GT:AD:DP:GL:GQ	0/1:29,15:29:-24.78,-8.74,-71.11:99
-chr1	1870211	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=105;Dels=0.02;HRun=2;HaplotypeScore=156.21;MQ=37.45;MQ0=0;OQ=89.02;QD=0.85;SB=-10.74	GT:AD:DP:GL:GQ	0/1:91,12:93:-39.61,-27.42,-314.70:99
-chr1	1870216	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=95;Dels=0.13;HRun=3;HaplotypeScore=129.57;MQ=35.88;MQ0=0;OQ=216.82;QD=2.28;SB=-71.49	GT:AD:DP:GL:GQ	0/1:69,14:77:-47.26,-22.30,-241.64:99
-chr1	1870237	.	C	T	350.17	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=136.82;MQ=33.84;MQ0=0;QD=4.38;SB=-96.57	GT:AD:DP:GL:GQ	0/1:64,16:68:-58.79,-20.48,-197.51:99
-chr1	1870241	.	T	C	795.72	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=2;HaplotypeScore=105.65;MQ=33.28;MQ0=0;QD=10.33;SB=-171.98	GT:AD:DP:GL:GQ	0/1:49,28:68:-103.35,-20.49,-158.12:99
-chr1	1870246	.	T	C	783.37	SnpCluster	AC=1;AF=0.50;AN=2;DP=75;Dels=0.01;HRun=3;HaplotypeScore=106.17;MQ=32.28;MQ0=0;QD=10.44;SB=-190.65	GT:AD:DP:GL:GQ	0/1:44,29:65:-101.22,-19.60,-139.10:99
-chr1	1870249	rs28490251	C	T	536.49	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=65.25;MQ=33.25;MQ0=0;QD=8.01;SB=-19.48	GT:AD:DP:GL:GQ	0/1:45,22:60:-75.01,-18.07,-158.51:99
-chr1	1870263	.	T	C	67.37	SnpCluster	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=2;HaplotypeScore=102.33;MQ=35.77;MQ0=0;QD=1.07;SB=-0.98	GT:AD:DP:GL:GQ	0/1:55,8:53:-25.99,-15.97,-184.95:99
-chr1	1870272	.	C	T	96.33	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=2;HaplotypeScore=53.42;MQ=40.73;MQ0=0;QD=1.55;SB=5.03	GT:AD:DP:GL:GQ	0/1:52,10:55:-29.48,-16.57,-180.28:99
-chr1	1870273	.	T	C	72.37	SnpCluster	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=2;HaplotypeScore=53.42;MQ=40.73;MQ0=0;QD=1.17;SB=-0.98	GT:AD:DP:GL:GQ	0/1:55,7:53:-26.49,-15.97,-188.35:99
-chr1	1870281	.	C	T	187.69	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=96.79;MQ=44.56;MQ0=0;QD=3.24;SB=5.04	GT:AD:DP:GL:GQ	0/1:46,12:51:-37.41,-15.36,-160.10:99
-chr1	1870294	.	T	C	11.65	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=10.99;MQ=47.97;MQ0=0;QD=0.19;SB=8.05	GT:AD:DP:GL:GQ	0/1:55,6:59:-22.20,-17.78,-213.89:44.18
-chr1	1870405	.	C	A	16.24	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=38.44;MQ0=0;OQ=457.23;QD=8.97;SB=-4.29	GT:AD:DP:GL:GQ	0/1:33,18:50:-64.07,-15.06,-117.59:99
-chr1	1870410	.	T	C	0.86	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=38.95;MQ0=0;OQ=422.51;QD=8.80;SB=-31.25	GT:AD:DP:GL:GQ	0/1:31,17:47:-59.69,-14.16,-126.57:99
-chr1	1870428	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=1;HaplotypeScore=20.35;MQ=41.74;MQ0=0;OQ=75.20;QD=2.15;SB=23.10	GT:AD:DP:GL:GQ	0/1:27,8:31:-20.14,-9.34,-96.20:99
-chr1	1870432	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=16.08;MQ=42.82;MQ0=0;OQ=52.58;QD=1.81;SB=29.11	GT:AD:DP:GL:GQ	0/1:24,5:28:-16.98,-8.43,-86.35:85.42
-chr1	1870446	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=25;Dels=0.04;HRun=2;HaplotypeScore=17.65;MQ=47.45;MQ0=0;OQ=105.58;QD=4.22;SB=-62.85	GT:AD:DP:GL:GQ	0/1:18,6:24:-20.77,-6.93,-68.32:99
-chr1	1871370	rs2490541	C	A	191.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.38;MQ0=1;OQ=2594.06;QD=33.69;SB=-1155.38	GT:AD:DP:GL:GQ	1/1:0,76:73:-263.01,-21.99,-0.02:99
-chr1	1872147	rs2490540	A	G	201.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.87;MQ0=0;OQ=2121.33;QD=34.22;SB=-1028.42	GT:AD:DP:GL:GQ	1/1:0,62:60:-215.74,-18.07,-0.02:99
-chr1	1872797	rs28754760	C	T	596.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.63;MQ0=0;OQ=2762.82;QD=40.63;SB=-1367.30	GT:AD:DP:GL:GQ	1/1:0,68:68:-279.88,-20.48,-0.01:99
-chr1	1872809	rs2490564	A	G	614.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.49;MQ0=0;OQ=2664.00;QD=34.60;SB=-1257.66	GT:AD:DP:GL:GQ	1/1:0,77:76:-270.02,-22.89,-0.03:99
-chr1	1872820	rs2490563	C	A	537.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.73;MQ0=0;OQ=2673.37;QD=36.62;SB=-1103.59	GT:AD:DP:GL:GQ	1/1:0,73:73:-270.94,-21.99,-0.02:99
-chr1	1872941	rs28505085	C	T	182.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.70;MQ0=0;OQ=3049.13;QD=40.12;SB=-1406.71	GT:AD:DP:GL:GQ	1/1:0,76:76:-308.51,-22.89,-0.02:99
-chr1	1873219	rs2490562	A	G	659.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=2029.90;QD=31.23;SB=-828.58	GT:AD:DP:GL:GQ	1/1:0,65:64:-206.63,-19.30,-0.05:99
-chr1	1874915	rs2474455	C	T	626.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=2935.86;QD=37.64;SB=-1349.01	GT:AD:DP:GL:GQ	1/1:0,78:74:-297.19,-22.29,-0.02:99
-chr1	1876080	rs4648738	C	T	622.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.86;MQ0=0;OQ=2172.76;QD=36.21;SB=-969.30	GT:AD:DP:GL:GQ	1/1:0,60:56:-220.88,-16.87,-0.02:99
-chr1	1876082	rs2803287	T	G	577.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.86;MQ0=0;OQ=1927.37;QD=32.12;SB=-839.09	GT:AD:DP:GL:GQ	1/1:0,60:56:-196.35,-16.87,-0.02:99
-chr1	1876206	.	G	A	152.24	Indel	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=32.79;MQ=48.52;MQ0=0;QD=4.91;SB=-65.27	GT:AD:DP:GL:GQ	0/1:20,7:27:-34.54,-16.03,-70.20:99
-chr1	1876245	rs2803286	T	C	61.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=51.77;MQ0=0;OQ=999.35;QD=27.76;SB=-355.43	GT:AD:DP:GL:GQ	1/1:0,36:34:-103.57,-10.26,-0.05:99
-chr1	1876361	rs2748976	C	A	113.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=45.22;MQ0=0;OQ=179.32;QD=6.90;SB=-106.45	GT:AD:DP:GL:GQ	0/1:18,8:25:-28.75,-7.53,-52.51:99
-chr1	1876371	.	C	A	48.69	LowQual	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=43.76;MQ0=0;QD=2.03;SB=-50.67	GT:AD:DP:GL:GQ	0/1:20,4:23:-15.08,-6.93,-60.82:81.52
-chr1	1876379	rs2748975	C	A	111.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=47.73;MQ0=0;OQ=820.31;QD=34.18;SB=-360.86	GT:AD:DP:GL:GQ	1/1:0,24:23:-85.62,-6.93,-0.01:69.21
-chr1	1876719	rs3795290	C	T	341.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.08;MQ0=0;OQ=1064.55;QD=38.02;SB=-422.06	GT:AD:DP:GL:GQ	1/1:0,28:28:-110.05,-8.44,-0.01:84.27
-chr1	1876879	rs28548017	A	G	12.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=3.36;MQ=59.09;MQ0=0;OQ=1547.11;QD=33.63;SB=-748.91	GT:AD:DP:GL:GQ	1/1:0,45:45:-158.32,-13.56,-0.02:99
-chr1	1877105	rs28575980	G	A	126.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=58.88;MQ0=0;OQ=2123.64;QD=39.33;SB=-940.36	GT:AD:DP:GL:GQ	1/1:0,54:54:-215.96,-16.27,-0.02:99
-chr1	1878053	rs3820011	C	A	596.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1358.01;QD=33.95;SB=-534.23	GT:AD:DP:GL:GQ	1/1:0,40:39:-139.40,-11.75,-0.01:99
-chr1	1878190	rs28535696	C	T	4.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=5.27;MQ=59.60;MQ0=0;OQ=1961.78;QD=33.82;SB=-651.37	GT:AD:DP:GL:GQ	1/1:0,56:52:-199.79,-15.68,-0.03:99
-chr1	1878229	rs2803285	A	G	106.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.79;MQ=60.00;MQ0=0;OQ=1952.57;QD=31.49;SB=-789.62	GT:AD:DP:GL:GQ	1/1:0,62:61:-198.90,-18.40,-0.05:99
-chr1	1878313	rs28549710	G	A	560.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=1883.77;QD=38.44;SB=-852.64	GT:AD:DP:GL:GQ	1/1:0,49:48:-191.98,-14.46,-0.02:99
-chr1	1878885	rs2748974	A	G	5.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.37;MQ=58.15;MQ0=0;OQ=1276.90;QD=26.60;SB=-511.07	GT:AD:DP:GL:GQ	1/1:1,47:40:-131.31,-12.06,-0.03:99
-chr1	1878935	rs941533	C	T	78.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.81;MQ0=0;OQ=1331.51;QD=34.14;SB=-642.34	GT:AD:DP:GL:GQ	1/1:0,39:35:-136.75,-10.55,-0.02:99
-chr1	1879652	rs2748973	A	T	145.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=1566.33;QD=34.81;SB=-658.70	GT:AD:DP:GL:GQ	1/1:0,44:44:-160.23,-13.26,-0.02:99
-chr1	1881908	rs2803292	G	C	343.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=1280.73;QD=16.85;SB=-445.74	GT:AD:DP:GL:GQ	0/1:41,35:73:-153.35,-22.00,-166.87:99
-chr1	1882185	rs2803291	T	C	583.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1616.58;QD=28.87;SB=-749.95	GT:AD:DP:GL:GQ	1/1:0,56:52:-165.29,-15.68,-0.05:99
-chr1	1883521	rs9777849	T	C	52.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=1.11;MQ=58.55;MQ0=0;OQ=2600.99;QD=33.78;SB=-793.15	GT:AD:DP:GL:GQ	1/1:0,77:75:-263.71,-22.59,-0.03:99
-chr1	1883775	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=18;HaplotypeScore=34.55;MQ=54.67;MQ0=0;OQ=115.46;QD=1.72;SB=60.06	GT:AD:DP:GL:GQ	0/1:50,15:53:-37.44,-22.61,-153.19:99
-chr1	1884144	rs4648739	T	C	265.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=56.66;MQ0=0;OQ=1089.11;QD=12.10;SB=-234.30	GT:AD:DP:GL:GQ	0/1:41,48:84:-137.52,-25.33,-160.93:99
-chr1	1884622	.	T	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=2;HaplotypeScore=7.50;MQ=53.07;MQ0=0;OQ=108.82;QD=2.02;SB=71.24	GT:AD:DP:GL:GQ	0/1:31,23:39:-25.91,-11.75,-106.64:99
-chr1	1884705	rs9697615	G	A	136.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=58.71;MQ0=0;OQ=608.41;QD=12.94;SB=-170.23	GT:AD:DP:GL:GQ	0/1:24,22:44:-77.39,-13.26,-79.80:99
-chr1	1884754	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=43.50;MQ=52.44;MQ0=1;OQ=107.17;QD=1.76;SB=65.22	GT:AD:DP:GL:GQ	0/1:47,13:52:-29.66,-15.66,-164.16:99
-chr1	1884755	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=20;HaplotypeScore=45.92;MQ=52.41;MQ0=1;OQ=326.78;QD=5.11;SB=65.23	GT:AD:DP:GL:GQ	0/1:48,16:59:-53.73,-17.77,-157.95:99
-chr1	1884837	rs35817970	T	C	556.60	Indel	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.07;MQ=55.91;MQ0=0;QD=10.91;SB=-219.26	GT:AD:DP:GL:GQ	0/1:29,21:48:-73.41,-14.46,-106.68:99
-chr1	1885037	rs7523728	C	T	495.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.35;MQ0=0;OQ=754.75;QD=13.98;SB=-403.19	GT:AD:DP:GL:GQ	0/1:30,24:50:-93.83,-15.07,-88.75:99
-chr1	1885400	rs28561741	A	G	4.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=3;HaplotypeScore=1.47;MQ=59.52;MQ0=0;OQ=350.23;QD=7.30;SB=-137.55	GT:AD:DP:GL:GQ	0/1:31,17:46:-52.17,-13.87,-117.69:99
-chr1	1885962	rs13302978	G	A	113.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.25;MQ=53.12;MQ0=0;OQ=689.28;QD=12.53;SB=-222.75	GT:AD:DP:GL:GQ	0/1:26,26:49:-87.00,-14.79,-79.84:99
-chr1	1886045	rs13303324	T	C	252.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.41;MQ0=0;OQ=434.96;QD=11.15;SB=-181.59	GT:AD:DP:GL:GQ	0/1:18,21:37:-57.94,-11.16,-71.83:99
-chr1	1886083	rs13303202	C	T	406.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=730.31;QD=16.98;SB=-346.33	GT:AD:DP:GL:GQ	0/1:21,22:43:-89.27,-12.95,-73.96:99
-chr1	1886300	rs16824585	G	A	23.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=56.05;MQ0=0;OQ=933.53;QD=20.75;SB=-382.89	GT:AD:DP:GL:GQ	0/1:18,27:45:-110.19,-13.56,-62.00:99
-chr1	1886413	rs28625839	C	T	106.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.20;MQ0=0;OQ=181.47;QD=6.98;SB=-69.07	GT:AD:DP:GL:GQ	0/1:17,9:21:-27.77,-6.34,-42.14:99
-chr1	1887329	rs28523363	A	G	314.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=60.00;MQ0=0;OQ=843.98;QD=13.40;SB=-333.92	GT:AD:DP:GL:GQ	0/1:32,31:62:-106.36,-18.68,-128.89:99
-chr1	1887451	rs4648599	C	T	245.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=58.01;MQ0=0;OQ=690.92;QD=14.70;SB=-275.28	GT:AD:DP:GL:GQ	0/1:24,23:44:-85.64,-13.26,-73.07:99
-chr1	1887613	rs4648600	C	G	12.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=4.38;MQ=58.99;MQ0=0;OQ=734.25;QD=15.96;SB=-239.38	GT:AD:DP:GL:GQ	0/1:23,23:42:-89.37,-12.66,-89.33:99
-chr1	1887905	rs28712827	G	A	21.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=6.31;MQ=57.89;MQ0=0;OQ=502.21;QD=13.22;SB=-250.22	GT:AD:DP:GL:GQ	0/1:20,17:35:-64.07,-10.57,-52.53:99
-chr1	1888209	rs28414188	C	T	21.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=2.66;MQ=59.03;MQ0=0;OQ=593.85;QD=13.81;SB=-128.12	GT:AD:DP:GL:GQ	0/1:24,19:42:-75.32,-12.65,-82.23:99
-chr1	1888229	rs28629936	G	A	50.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.95;MQ0=0;OQ=708.17;QD=17.70;SB=-204.21	GT:AD:DP:GL:GQ	0/1:19,21:39:-85.85,-11.75,-58.81:99
-chr1	1888545	rs17715950	T	C	188.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=392.93;QD=12.68;SB=-143.27	GT:AD:DP:GL:GQ	0/1:16,15:29:-51.31,-8.74,-58.30:99
-chr1	1888637	rs34506333	G	C	174.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.80;MQ=57.85;MQ0=0;OQ=1081.48;QD=18.97;SB=-492.64	GT:AD:DP:GL:GQ	0/1:26,30:56:-128.32,-16.89,-103.04:99
-chr1	1888639	rs35698161	C	A	246.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.80;MQ=57.81;MQ0=0;OQ=901.53;QD=16.10;SB=-413.05	GT:AD:DP:GL:GQ	0/1:26,30:56:-110.30,-16.87,-89.43:99
-chr1	1888688	rs34824947	T	C	245.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=58.71;MQ0=0;OQ=584.90;QD=12.44;SB=-198.60	GT:AD:DP:GL:GQ	0/1:25,22:46:-75.63,-13.86,-99.35:99
-chr1	1888695	rs34586002	C	A	280.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.48;MQ0=0;OQ=561.20;QD=12.75;SB=-230.89	GT:AD:DP:GL:GQ	0/1:24,20:42:-72.05,-12.65,-79.10:99
-chr1	1888719	rs35031992	G	A	261.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=534.91;QD=11.38;SB=-199.88	GT:AD:DP:GL:GQ	0/1:28,19:46:-70.65,-13.87,-88.35:99
-chr1	1888794	rs35186797	T	C	29.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=2.78;MQ=57.65;MQ0=0;OQ=525.33;QD=10.94;SB=-267.94	GT:AD:DP:GL:GQ	0/1:23,25:43:-68.78,-12.96,-87.05:99
-chr1	1888798	rs13303138	G	A	173.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=57.75;MQ0=0;OQ=779.95;QD=15.60;SB=-266.18	GT:AD:DP:GL:GQ	0/1:24,26:46:-95.14,-13.87,-72.15:99
-chr1	1888835	rs34940616	G	A	9.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.88;MQ0=0;OQ=741.91;QD=23.93;SB=-335.86	GT:AD:DP:GL:GQ	0/1:9,22:29:-86.21,-8.74,-25.83:99
-chr1	1889024	rs17778128	G	C	179.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=57.35;MQ0=0;OQ=668.72;QD=10.79;SB=-360.78	GT:AD:DP:GL:GQ	0/1:38,24:59:-87.94,-17.79,-162.55:99
-chr1	1889139	rs61775058	A	T	458.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.25;MQ0=0;OQ=787.44;QD=13.58;SB=-299.67	GT:AD:DP:GL:GQ	0/1:31,27:58:-99.50,-17.47,-121.67:99
-chr1	1889179	rs61775059	T	C	275.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.27;MQ0=0;OQ=765.16;QD=11.42;SB=-328.14	GT:AD:DP:GL:GQ	0/1:35,32:66:-99.69,-19.89,-140.70:99
-chr1	1889260	rs13303007	G	A	42.33	Indel;LowQual	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=6.98;MQ=52.93;MQ0=0;QD=0.73;SB=-30.38	GT:AD:DP:GL:GQ	0/1:52,6:58:-24.99,-17.47,-182.54:75.16
-chr1	1889721	rs4648601	C	T	94.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=56.35;MQ0=0;OQ=530.41;QD=10.20;SB=-77.51	GT:AD:DP:GL:GQ	0/1:33,19:47:-70.50,-14.17,-95.11:99
-chr1	1890092	rs16824588	T	C	13.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=57.02;MQ0=0;OQ=150.77;QD=3.97;SB=-54.71	GT:AD:DP:GL:GQ	0/1:26,12:35:-28.91,-10.55,-104.30:99
-chr1	1890192	rs55709963	A	G	31.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=56.20;MQ0=0;OQ=293.66;QD=11.75;SB=-65.87	GT:AD:DP:GL:GQ	0/1:12,13:24:-39.88,-7.23,-45.12:99
-chr1	1890199	rs56126097	A	G	24.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=55.86;MQ0=0;OQ=270.97;QD=11.78;SB=-47.83	GT:AD:DP:GL:GQ	0/1:11,12:22:-37.01,-6.63,-43.67:99
-chr1	1890235	rs55676322	G	A	36.70	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.45;MQ0=0;QD=2.82;SB=-3.98	GT:AD:DP:GL:GQ	0/1:10,3:12:-10.57,-3.62,-30.38:69.54
-chr1	1890236	.	C	T	56.05	SnpCluster	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.03;MQ0=0;QD=4.00;SB=-3.98	GT:AD:DP:GL:GQ	0/1:11,3:13:-12.81,-3.92,-36.41:88.89
-chr1	1890241	rs55784504	G	A	37.70	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=53.95;MQ0=0;QD=2.36;SB=-0.97	GT:AD:DP:GL:GQ	0/1:13,3:15:-11.57,-4.52,-40.91:70.54
-chr1	1890268	rs61776961	A	G	12.56	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=1;HaplotypeScore=1.72;MQ=53.61;MQ0=0;QD=0.66;SB=-31.93	GT:AD:DP:GL:GQ	0/1:15,4:17:-9.64,-5.12,-56.10:45.15
-chr1	1890270	rs61776962	C	T	67.49	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=53.03;MQ0=0;QD=3.21;SB=-45.25	GT:AD:DP:GL:GQ	0/1:16,5:19:-15.77,-5.74,-45.89:99
-chr1	1890274	rs61776963	T	C	59.17	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=2;HaplotypeScore=2.43;MQ=51.33;MQ0=0;QD=2.96;SB=-53.70	GT:AD:DP:GL:GQ	0/1:14,6:19:-14.93,-5.73,-56.51:92.01
-chr1	1890292	rs61776964	T	G	172.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=50.53;MQ0=0;OQ=263.44;QD=9.08;SB=-95.94	GT:AD:DP:GL:GQ	0/1:17,12:28:-38.07,-8.44,-56.66:99
-chr1	1890305	rs61776965	C	T	161.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=1.46;MQ=50.32;MQ0=0;OQ=365.34;QD=11.79;SB=-175.70	GT:AD:DP:GL:GQ	0/1:18,13:27:-47.95,-8.13,-56.49:99
-chr1	1890314	rs6681749	A	G	143.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=50.65;MQ0=0;OQ=306.18;QD=9.57;SB=-129.77	GT:AD:DP:GL:GQ	0/1:17,15:29:-42.64,-8.74,-64.98:99
-chr1	1890507	.	T	C	42.73	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=2;HaplotypeScore=3.92;MQ=54.77;MQ0=0;QD=1.86;SB=14.07	GT:AD:DP:GL:GQ	0/1:16,7:17:-12.68,-5.13,-48.62:75.57
-chr1	1890548	.	A	T	8.30	PASS	AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=2.73;MQ=60.00;MQ0=0;OQ=79.81;QD=7.98;SB=-57.71	GT:AD:DP:GL:GQ	0/1:6,4:10:-14.28,-3.01,-22.53:99
-chr1	1890778	rs28707401	G	A	84.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.74;MQ=58.33;MQ0=0;OQ=401.02;QD=14.32;SB=-129.13	GT:AD:DP:GL:GQ	0/1:13,14:24:-53.53,-10.14,-35.22:99
-chr1	1892326	.	A	C	112.36	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=59.24;MQ0=0;OQ=852.28;QD=15.50;SB=-429.85	GT:AD:DP:GL:GQ	0/1:26,29:52:-104.18,-15.67,-81.22:99
-chr1	1892422	rs7367171	A	G	220.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.60;MQ0=0;OQ=514.17;QD=9.02;SB=-267.96	GT:AD:DP:GL:GQ	0/1:32,25:54:-70.98,-16.28,-126.05:99
-chr1	1892426	rs7367879	G	A	251.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=59.60;MQ0=0;OQ=832.91;QD=14.36;SB=-352.38	GT:AD:DP:GL:GQ	0/1:32,26:52:-102.26,-15.68,-81.39:99
-chr1	1892733	rs7366028	C	T	234.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.35;MQ0=0;OQ=1086.69;QD=15.31;SB=-535.37	GT:AD:DP:GL:GQ	0/1:36,35:67:-132.15,-20.20,-106.68:99
-chr1	1893163	rs4648603	C	T	25.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=59.48;MQ0=0;OQ=261.75;QD=5.95;SB=-111.10	GT:AD:DP:GL:GQ	0/1:32,12:41:-41.83,-12.38,-90.87:99
-chr1	1893572	rs13303201	C	A	360.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=57.58;MQ0=0;OQ=726.40;QD=15.46;SB=-340.06	GT:AD:DP:GL:GQ	0/1:22,25:44:-89.18,-13.26,-62.88:99
-chr1	1895166	rs56313717	C	A	171.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=635.59;QD=15.13;SB=-197.47	GT:AD:DP:GL:GQ	0/1:18,24:41:-79.20,-12.35,-61.36:99
-chr1	1897772	rs7528894	C	T	135.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=58.63;MQ0=0;OQ=607.52;QD=11.91;SB=-152.65	GT:AD:DP:GL:GQ	0/1:30,21:44:-77.30,-13.26,-84.20:99
-chr1	1897865	rs7536087	T	C	25.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=54.74;MQ0=0;OQ=378.78;QD=5.83;SB=-147.48	GT:AD:DP:GL:GQ	0/1:38,27:56:-58.05,-16.88,-148.17:99
-chr1	1897872	rs28588807	T	C	29.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.38;MQ=53.22;MQ0=0;OQ=367.97;QD=6.24;SB=-166.50	GT:AD:DP:GL:GQ	0/1:36,23:50:-55.16,-15.08,-127.98:99
-chr1	1897899	rs4388640	C	T	188.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=52.25;MQ0=0;OQ=499.97;QD=8.20;SB=-247.55	GT:AD:DP:GL:GQ	0/1:39,22:51:-68.65,-15.37,-112.84:99
-chr1	1897945	rs28410799	A	G	3.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.71;MQ=54.36;MQ0=0;OQ=341.23;QD=5.59;SB=-142.90	GT:AD:DP:GL:GQ	0/1:39,21:52:-53.08,-15.68,-138.70:99
-chr1	1897960	rs28789409	G	T	236.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=55.27;MQ0=0;OQ=569.89;QD=9.19;SB=-286.60	GT:AD:DP:GL:GQ	0/1:38,24:59:-78.04,-17.77,-137.70:99
-chr1	1898245	rs13303203	C	T	367.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.47;MQ0=0;OQ=546.46;QD=10.31;SB=-185.87	GT:AD:DP:GL:GQ	0/1:33,20:47:-72.10,-14.17,-90.13:99
-chr1	1898289	rs28545809	T	C	170.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=55.94;MQ0=0;OQ=320.54;QD=7.82;SB=-173.95	GT:AD:DP:GL:GQ	0/1:24,16:37:-46.49,-11.16,-87.43:99
-chr1	1898563	rs4233027	C	G	427.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.18;MQ0=0;OQ=977.32;QD=15.27;SB=-297.92	GT:AD:DP:GL:GQ	0/1:36,28:63:-120.00,-18.99,-153.02:99
-chr1	1899064	rs35953639	A	G	134.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=58.52;MQ0=0;OQ=901.65;QD=15.82;SB=-439.15	GT:AD:DP:GL:GQ	0/1:25,32:55:-110.02,-16.57,-94.81:99
-chr1	1899178	rs61776976	G	A	36.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.28;MQ=59.15;MQ0=0;OQ=1106.44;QD=22.13;SB=-371.92	GT:AD:DP:GL:GQ	0/1:16,34:48:-128.39,-14.47,-53.19:99
-chr1	1899305	rs55863117	A	G	206.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=59.24;MQ0=0;OQ=872.61;QD=14.31;SB=-340.17	GT:AD:DP:GL:GQ	0/1:25,35:57:-107.73,-17.18,-95.38:99
-chr1	1899354	rs28716654	C	T	202.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=59.30;MQ0=0;OQ=1176.35;QD=17.82;SB=-612.15	GT:AD:DP:GL:GQ	0/1:31,35:62:-139.59,-18.67,-102.07:99
-chr1	1899413	rs28680595	T	A	360.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.29;MQ0=0;OQ=1036.44;QD=15.95;SB=-464.88	GT:AD:DP:GL:GQ	0/1:30,35:63:-125.91,-18.98,-108.28:99
-chr1	1899561	rs28613404	C	T	21.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=5.89;MQ=58.07;MQ0=0;OQ=742.01;QD=16.13;SB=-312.34	GT:AD:DP:GL:GQ	0/1:20,25:42:-90.15,-12.66,-60.03:99
-chr1	1899593	rs28491083	G	T	384.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=572.46;QD=14.31;SB=-222.49	GT:AD:DP:GL:GQ	0/1:17,23:37:-71.67,-11.14,-60.73:99
-chr1	1899703	rs28433557	C	T	153.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=58.28;MQ0=0;OQ=695.04;QD=16.55;SB=-241.74	GT:AD:DP:GL:GQ	0/1:19,23:39:-84.54,-11.75,-59.04:99
-chr1	1899714	rs28448395	G	A	59.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=57.87;MQ0=0;OQ=975.55;QD=21.68;SB=-411.21	GT:AD:DP:GL:GQ	0/1:16,29:43:-113.79,-12.96,-49.10:99
-chr1	1899728	rs28539219	G	A	22.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=58.50;MQ0=0;OQ=1039.92;QD=21.66;SB=-531.16	GT:AD:DP:GL:GQ	0/1:16,32:45:-120.83,-13.56,-54.90:99
-chr1	1899861	rs28468541	C	G	2.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=9.03;MQ=56.76;MQ0=0;OQ=898.89;QD=17.63;SB=-410.04	GT:AD:DP:GL:GQ	0/1:24,26:48:-107.64,-14.46,-99.37:99
-chr1	1899872	rs28588737	T	C	12.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=3.04;MQ=57.56;MQ0=0;OQ=448.65;QD=9.35;SB=-239.28	GT:AD:DP:GL:GQ	0/1:25,23:43:-61.11,-12.96,-97.10:99
-chr1	1899946	rs28645949	G	T	144.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=60.00;MQ0=0;OQ=332.80;QD=10.40;SB=-155.69	GT:AD:DP:GL:GQ	0/1:19,13:30:-45.61,-9.04,-50.81:99
-chr1	1900096	rs28651716	T	C	225.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=54.90;MQ0=0;OQ=686.40;QD=12.71;SB=-338.36	GT:AD:DP:GL:GQ	0/1:28,26:53:-87.90,-15.97,-105.41:99
-chr1	1900231	rs28642304	G	A	31.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=5.35;MQ=52.67;MQ0=2;OQ=686.17;QD=14.00;SB=-341.85	GT:AD:DP:GL:GQ	0/1:25,24:43:-84.86,-12.96,-72.07:99
-chr1	1900342	.	C	G	14.82	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=12.94;MQ=53.14;MQ0=2;QD=0.37;SB=26.12	GT:AD:DP:GL:GQ	0/1:35,5:34:-15.00,-10.25,-129.63:47.51
-chr1	1900344	.	T	C	47.56	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=13.10;MQ=54.07;MQ0=2;QD=1.16;SB=26.11	GT:AD:DP:GL:GQ	0/1:32,9:34:-18.29,-10.25,-109.75:80.39
-chr1	1900366	.	T	C	19.64	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=56.14;MQ0=0;QD=0.48;SB=17.08	GT:AD:DP:GL:GQ	0/1:34,7:35:-15.79,-10.55,-116.81:52.43
-chr1	1900466	rs7550407	A	G	75.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=45.89;MQ0=2;OQ=380.59;QD=19.03;SB=-189.68	GT:AD:DP:GL:GQ	1/1:0,20:13:-41.66,-3.92,-0.01:39.09
-chr1	1900518	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=10.99;MQ=35.59;MQ0=6;OQ=55.62;QD=1.29;SB=-13.87	GT:AD:DP:GL:GQ	0/1:29,14:19:-14.57,-5.73,-56.56:88.46
-chr1	1900571	.	C	T	45.32	LowQual	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=19.95;MQ=36.93;MQ0=3;QD=0.91;SB=-24.62	GT:AD:DP:GL:GQ	0/1:41,9:25:-15.36,-7.54,-65.46:78.16
-chr1	1900816	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=6.83;MQ=47.18;MQ0=2;OQ=71.50;QD=1.79;SB=-42.78	GT:AD:DP:GL:GQ	0/1:30,10:31:-19.78,-9.34,-96.64:99
-chr1	1900861	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=8.07;MQ=42.04;MQ0=5;OQ=136.19;QD=2.67;SB=-39.59	GT:AD:DP:GL:GQ	0/1:31,18:36:-30.43,-13.53,-101.33:99
-chr1	1900880	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=21.93;MQ=42.64;MQ0=5;OQ=81.77;QD=1.99;SB=26.03	GT:AD:DP:GL:GQ	0/1:32,9:28:-19.91,-8.45,-71.11:99
-chr1	1900981	.	G	A	32.02	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=14.77;MQ=47.97;MQ0=0;QD=1.07;SB=20.08	GT:AD:DP:GL:GQ	0/1:27,3:20:-12.51,-6.03,-56.06:64.85
-chr1	1900982	.	C	T	11.94	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=14.77;MQ=47.50;MQ0=0;QD=0.41;SB=35.07	GT:AD:DP:GL:GQ	0/1:26,3:25:-11.99,-7.54,-69.22:44.49
-chr1	1900987	.	C	G	179.53	SnpCluster	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=1;HaplotypeScore=15.25;MQ=49.14;MQ0=0;QD=5.79;SB=-106.68	GT:AD:DP:GL:GQ	0/1:23,8:22:-27.88,-6.64,-59.47:99
-chr1	1901007	.	A	G	17.82	PASS	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=50.60;MQ0=0;OQ=269.42;QD=8.42;SB=-129.64	GT:AD:DP:GL:GQ	0/1:19,13:29:-38.97,-8.74,-66.56:99
-chr1	1901025	.	T	C	1.37	PASS	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=50.85;MQ0=0;OQ=146.63;QD=3.67;SB=-63.91	GT:AD:DP:GL:GQ	0/1:26,13:31:-27.31,-9.36,-79.17:99
-chr1	1901036	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=7.09;MQ=51.49;MQ0=1;OQ=87.37;QD=1.99;SB=-8.61	GT:AD:DP:GL:GQ	0/1:38,6:38:-23.49,-11.46,-98.15:99
-chr1	1901053	.	T	C	11.36	LowQual	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=52.41;MQ0=1;QD=0.25;SB=-25.22	GT:AD:DP:GL:GQ	0/1:37,8:38:-15.84,-11.45,-126.44:43.87
-chr1	1901418	rs28645431	C	T	0.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=3.95;MQ=41.39;MQ0=1;OQ=172.22;QD=4.53;SB=-89.91	GT:AD:DP:GL:GQ	0/1:29,9:21:-26.84,-6.33,-42.67:99
-chr1	1901574	rs13303001	G	A	41.49	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=7.68;MQ=10.86;MQ0=15;QD=1.66;SB=-10.00	GT:AD:DP:GL:GQ	0/1:20,5:3:-8.34,-0.90,-3.10:21.92
-chr1	1901637	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=16.41;MQ=17.84;MQ0=13;OQ=157.79;QD=2.87;SB=-10.00	GT:AD:DP:GL:GQ	0/1:44,10:26:-26.90,-7.83,-65.70:99
-chr1	1901664	.	G	A	34.02	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.20;MQ=18.33;MQ0=14;QD=0.67;SB=-10.00	GT:AD:DP:GL:GQ	0/1:42,9:17:-11.81,-5.13,-50.35:66.86
-chr1	1901668	.	G	A	0.06	PASS	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.04;MQ=18.51;MQ0=13;OQ=99.32;QD=2.03;SB=-7.00	GT:AD:DP:GL:GQ	0/1:40,9:16:-18.04,-4.83,-38.64:99
-chr1	1901732	rs13303290	T	C	12.82	LowQual	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.55;MQ0=0;QD=0.64;SB=-24.62	GT:AD:DP:GL:GQ	0/1:15,5:16:-9.37,-4.82,-51.21:45.43
-chr1	1901798	rs4648740	A	G	153	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=48.72;MQ0=0;OQ=495.24;QD=14.15;SB=-240.44	GT:AD:DP:GL:GQ	0/1:16,19:34:-63.06,-10.25,-57.72:99
-chr1	1901828	rs4648741	T	A	223.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=49.47;MQ0=0;OQ=518.42;QD=14.01;SB=-218.56	GT:AD:DP:GL:GQ	0/1:16,21:33:-65.07,-9.94,-58.68:99
-chr1	1902252	rs35209771	G	A	29.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.72;MQ=59.38;MQ0=0;OQ=570.39;QD=15.42;SB=-188.28	GT:AD:DP:GL:GQ	0/1:17,20:31:-69.66,-9.34,-43.55:99
-chr1	1902361	rs35032062	A	G	8.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=3;HaplotypeScore=1.19;MQ=56.62;MQ0=0;OQ=288.56;QD=9.31;SB=-81.77	GT:AD:DP:GL:GQ	0/1:15,16:27:-40.29,-8.15,-49.29:99
-chr1	1902443	rs4648742	T	G	2.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=3;HaplotypeScore=1.88;MQ=52.64;MQ0=0;OQ=307.57;QD=13.98;SB=-102.98	GT:AD:DP:GL:GQ	0/1:8,14:19:-39.76,-5.72,-27.07:99
-chr1	1902590	rs34957887	A	G	5.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=54.60;MQ0=0;OQ=111.21;QD=3.83;SB=-42.82	GT:AD:DP:GL:GQ	0/1:21,8:27:-22.55,-8.14,-76.38:99
-chr1	1902594	rs34699657	T	C	6.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=55.30;MQ0=0;OQ=114.19;QD=4.08;SB=-28.64	GT:AD:DP:GL:GQ	0/1:19,9:26:-22.55,-7.85,-71.28:99
-chr1	1902618	rs13302917	G	C	80.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=55.30;MQ0=0;OQ=235.26;QD=8.40;SB=8.06	GT:AD:DP:GL:GQ	0/1:18,10:26:-34.65,-7.84,-76.52:99
-chr1	1902752	.	G	A	16.41	LowQual	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=23.04;MQ0=3;QD=0.82;SB=-30.52	GT:AD:DP:GL:GQ	0/1:17,3:9:-7.63,-2.71,-23.66:49.15
-chr1	1902780	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=12.84;MQ=20.15;MQ0=3;OQ=68.78;QD=3.62;SB=-7.00	GT:AD:DP:GL:GQ	0/1:14,5:6:-11.97,-1.81,-9.13:73.25
-chr1	1902787	.	G	A	0.55	PASS	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=20.15;MQ0=3;OQ=103.65;QD=5.46;SB=-46.55	GT:AD:DP:GL:GQ	0/1:13,6:5:-15.16,-1.51,-3.80:22.92
-chr1	1902803	.	A	G	0.43	PASS	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=19.89;MQ0=3;OQ=59.98;QD=3.75;SB=-6.99	GT:AD:DP:GL:GQ	0/1:11,5:6:-11.09,-1.81,-11.69:92.82
-chr1	1902817	.	T	C	41.42	LowQual	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=9.95;MQ=22.02;MQ0=2;QD=2.96;SB=-35.94	GT:AD:DP:GL:GQ	0/1:9,4:6:-9.23,-1.81,-11.87:74.25
-chr1	1902835	rs61776983	A	C	26.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=1.55;MQ=20.97;MQ0=2;OQ=78.83;QD=5.63;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,12:3:-11.37,-0.90,-0.00:9.03
-chr1	1903052	.	G	A	0.07	PASS	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=10.18;MQ=21.19;MQ0=5;OQ=185.24;QD=7.12;SB=-114.97	GT:AD:DP:GL:GQ	0/1:13,13:10:-24.83,-3.02,-9.74:67.23
-chr1	1903096	.	C	T	19.36	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=27.09;MQ=29.12;MQ0=4;QD=0.84;SB=-32.50	GT:AD:DP:GL:GQ	0/1:20,3:10:-8.23,-3.01,-26.23:52.14
-chr1	1903103	.	G	A	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=11.25;MQ=32.31;MQ0=4;OQ=203.36;QD=8.13;SB=-108.63	GT:AD:DP:GL:GQ	0/1:11,14:13:-27.54,-3.92,-21.98:99
-chr1	1903122	.	G	A	1.51	PASS	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=5.86;MQ=37.50;MQ0=2;OQ=277.72;QD=11.11;SB=-116.63	GT:AD:DP:GL:GQ	0/1:11,14:14:-35.28,-4.22,-14.88:99
-chr1	1903133	.	C	T	26.70	DPFilter;HARD_TO_VALIDATE;Indel;LowQual	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=14.79;MQ=33.51;MQ0=4;QD=0.92;SB=2.00	GT:AD:DP:GL:GQ	0/1:25,3:16:-10.78,-4.83,-41.60:59.53
-chr1	1903194	.	G	A	0.17	PASS	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=22.60;MQ0=6;OQ=59.87;QD=3.15;SB=-29.63	GT:AD:DP:GL:GQ	0/1:15,4:8:-11.68,-2.41,-15.55:92.71
-chr1	1903256	rs56273126	A	C	0.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=9.88;MQ=34.34;MQ0=2;OQ=157.91;QD=8.77;SB=-43.00	GT:AD:DP:GL:GQ	0/1:8,10:11:-22.39,-3.31,-17.60:99
-chr1	1903263	rs56067355	C	T	0.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=9.27;MQ=35.40;MQ0=1;OQ=103.77;QD=4.72;SB=-3.99	GT:AD:DP:GL:GQ	0/1:16,6:17:-18.78,-5.12,-41.68:99
-chr1	1903283	.	G	A	8.07	PASS	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=3.95;MQ=39.68;MQ0=0;OQ=372.77;QD=10.96;SB=-73.09	GT:AD:DP:GL:GQ	0/1:17,16:22:-47.20,-6.63,-29.71:99
-chr1	1903404	.	C	T	39.84	LowQual	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=6.15;MQ=48.13;MQ0=1;QD=1.73;SB=-35.65	GT:AD:DP:GL:GQ	0/1:19,4:16:-12.09,-4.83,-40.40:72.68
-chr1	1903423	rs58434854	A	G	0.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=7.95;MQ=46.73;MQ0=3;OQ=182.58;QD=6.30;SB=-71.95	GT:AD:DP:GL:GQ	0/1:18,11:23:-28.48,-6.94,-51.85:99
-chr1	1903439	rs58923167	C	T	0.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=17.53;MQ=42.29;MQ0=6;OQ=136.42;QD=4.01;SB=-25.62	GT:AD:DP:GL:GQ	0/1:26,8:22:-23.56,-6.63,-53.26:99
-chr1	1903440	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=17.53;MQ=42.29;MQ0=6;OQ=187.84;QD=5.52;SB=-110.54	GT:AD:DP:GL:GQ	0/1:26,8:23:-29.00,-6.94,-48.31:99
-chr1	1903458	rs55879512	A	G	0.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=7.35;MQ=44.38;MQ0=5;OQ=75.85;QD=1.85;SB=-63.75	GT:AD:DP:GL:GQ	0/1:26,14:24:-18.11,-7.24,-65.52:99
-chr1	1903493	.	G	A	1.04	PASS	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=47.31;MQ0=2;OQ=168.07;QD=4.31;SB=-57.28	GT:AD:DP:GL:GQ	0/1:31,8:25:-27.63,-7.54,-58.38:99
-chr1	1903509	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=11.62;MQ=39.25;MQ0=5;OQ=92.69;QD=2.73;SB=5.04	GT:AD:DP:GL:GQ	0/1:25,9:18:-17.98,-5.43,-46.46:99
-chr1	1903540	.	G	A	33.23	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=27.81;MQ=22.93;MQ0=9;QD=1.15;SB=-3.98	GT:AD:DP:GL:GQ	0/1:26,3:5:-8.11,-1.51,-11.06:66.06
-chr1	1903547	.	T	A	34.51	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=29.76;MQ=15.81;MQ0=9;QD=1.33;SB=-42.38	GT:AD:DP:GL:GQ	0/1:19,6:3:-7.64,-0.90,-3.64:27.36
-chr1	1903587	rs4648605	C	T	0.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=14.50;MQ=19.08;MQ0=11;OQ=79.27;QD=1.98;SB=-3.99	GT:AD:DP:GL:GQ	0/1:27,13:10:-14.23,-3.02,-19.87:99
-chr1	1904125	rs4648745	T	C	247.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=59.25;MQ0=0;OQ=694.34;QD=11.20;SB=-245.29	GT:AD:DP:GL:GQ	0/1:33,29:61:-91.10,-18.39,-129.32:99
-chr1	1904347	rs4648746	A	G	176.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=59.39;MQ0=0;OQ=338.48;QD=8.91;SB=-150.90	GT:AD:DP:GL:GQ	0/1:21,17:36:-47.98,-10.85,-82.55:99
-chr1	1904465	rs28737396	A	T	328.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1094.85;QD=18.56;SB=-354.42	GT:AD:DP:GL:GQ	0/1:24,35:59:-130.54,-17.77,-93.43:99
-chr1	1904806	rs61776990	C	T	103.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=56.91;MQ0=0;OQ=639.60;QD=17.29;SB=-221.92	GT:AD:DP:GL:GQ	0/1:15,22:35:-77.80,-10.56,-46.60:99
-chr1	1905885	rs4648747	G	A	213.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=54.80;MQ0=0;OQ=758.00;QD=15.16;SB=-295.79	GT:AD:DP:GL:GQ	0/1:26,24:49:-93.85,-14.76,-88.23:99
-chr1	1905894	rs13303091	C	T	219.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=53.79;MQ0=0;OQ=656.87;QD=13.14;SB=-261.28	GT:AD:DP:GL:GQ	0/1:27,22:45:-82.54,-13.57,-75.64:99
-chr1	1905900	rs13302998	T	C	119.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=54.88;MQ0=0;OQ=405.99;QD=8.83;SB=-193.60	GT:AD:DP:GL:GQ	0/1:27,19:44:-57.15,-13.26,-102.12:99
-chr1	1906158	rs13302999	C	T	171.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=58.63;MQ0=0;OQ=813.49;QD=15.95;SB=-262.17	GT:AD:DP:GL:GQ	0/1:25,26:49:-99.40,-14.77,-77.74:99
-chr1	1906389	rs3795284	C	T	21.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=3;HaplotypeScore=2.33;MQ=60.00;MQ0=0;OQ=758.20;QD=14.04;SB=-278.28	GT:AD:DP:GL:GQ	0/1:28,26:52:-94.77,-15.67,-93.68:99
-chr1	1906447	rs3795283	G	T	377.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=60.00;MQ0=0;OQ=998.45;QD=16.37;SB=-378.14	GT:AD:DP:GL:GQ	0/1:26,35:60:-121.20,-18.07,-93.96:99
-chr1	1906750	rs3795280	C	T	425.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=568.99;QD=13.55;SB=-250.75	GT:AD:DP:GL:GQ	0/1:24,18:42:-72.83,-12.65,-87.72:99
-chr1	1906918	rs34331632	A	G	117.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=58.45;MQ0=0;OQ=396.71;QD=8.82;SB=-212.27	GT:AD:DP:GL:GQ	0/1:26,19:41:-55.32,-12.36,-92.05:99
-chr1	1907309	rs34567059	T	G	9.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=3;HaplotypeScore=0.99;MQ=59.28;MQ0=0;OQ=266.80;QD=8.34;SB=-138.72	GT:AD:DP:GL:GQ	0/1:18,13:26:-37.80,-7.84,-51.38:99
-chr1	1907332	rs13303173	G	A	219.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=59.50;MQ0=0;OQ=402.42;QD=8.75;SB=-215.71	GT:AD:DP:GL:GQ	0/1:30,16:41:-55.89,-12.37,-85.41:99
-chr1	1907475	rs13302992	A	T	11.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=5.57;MQ=54.24;MQ0=0;OQ=373.16;QD=8.88;SB=-86.42	GT:AD:DP:GL:GQ	0/1:20,21:33:-50.55,-9.95,-63.90:99
-chr1	1907510	rs13302993	T	C	10.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=3.38;MQ=53.93;MQ0=0;OQ=691.42;QD=12.35;SB=-327.29	GT:AD:DP:GL:GQ	0/1:24,32:51:-87.80,-15.38,-95.79:99
-chr1	1907689	rs4648748	T	G	25.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.34;MQ=60.00;MQ0=0;OQ=189.73;QD=5.93;SB=-95.86	GT:AD:DP:GL:GQ	0/1:21,11:31:-31.60,-9.34,-75.09:99
-chr1	1907731	rs4648749	T	A	88.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=58.55;MQ0=0;OQ=1056.82;QD=33.03;SB=-482.74	GT:AD:DP:GL:GQ	1/1:0,32:31:-109.29,-9.34,-0.02:93.25
-chr1	1907768	rs4648750	A	C	41.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.92;MQ=58.69;MQ0=0;OQ=501.71;QD=15.68;SB=-178.91	GT:AD:DP:GL:GQ	0/1:13,18:31:-62.79,-9.34,-46.86:99
-chr1	1908051	rs4233028	A	G	0.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=11.36;MQ=58.24;MQ0=0;OQ=590.53;QD=10.36;SB=-318.09	GT:AD:DP:GL:GQ	0/1:28,29:51:-77.71,-15.37,-108.19:99
-chr1	1908348	rs4350140	A	G	295.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=483.27;QD=11.51;SB=-249.48	GT:AD:DP:GL:GQ	0/1:22,19:40:-63.66,-12.05,-87.28:99
-chr1	1908395	rs4535948	A	T	243.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=60.00;MQ0=0;OQ=561.16;QD=14.03;SB=-291.34	GT:AD:DP:GL:GQ	0/1:20,20:38:-70.85,-11.45,-68.83:99
-chr1	1908444	rs4603072	C	T	95.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.91;MQ=59.00;MQ0=0;OQ=825.49;QD=16.19;SB=-274.16	GT:AD:DP:GL:GQ	0/1:24,27:46:-99.69,-13.86,-72.18:99
-chr1	1908455	rs4466593	G	A	154	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=59.00;MQ0=0;OQ=749.94;QD=14.70;SB=-209.69	GT:AD:DP:GL:GQ	0/1:25,26:47:-92.45,-14.17,-73.64:99
-chr1	1910822	rs13303020	T	C	316	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.07;MQ0=0;OQ=856.90;QD=15.30;SB=-348.06	GT:AD:DP:GL:GQ	0/1:22,34:54:-105.26,-16.29,-79.82:99
-chr1	1912163	rs13303195	C	T	281.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.42;MQ0=0;OQ=1071.80;QD=15.76;SB=-460.45	GT:AD:DP:GL:GQ	0/1:35,33:67:-130.66,-20.19,-113.97:99
-chr1	1912512	rs13303233	T	C	59.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=5.24;MQ=56.21;MQ0=1;OQ=632.02;QD=12.15;SB=-238.92	GT:AD:DP:GL:GQ	0/1:24,28:49:-81.26,-14.77,-90.12:99
-chr1	1912694	rs6605075	T	C	195.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=97;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.81;MQ0=0;OQ=3518.98;QD=36.28;SB=-1667.64	GT:AD:DP:GL:GQ	1/1:0,97:97:-350.90,-29.22,-0.04:99
-chr1	1912989	rs13303332	A	G	477.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.92;MQ0=0;OQ=1063.77;QD=12.66;SB=-392.88	GT:AD:DP:GL:GQ	0/1:42,42:74:-131.95,-22.29,-145.18:99
-chr1	1913060	rs13303315	T	C	275.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=55.32;MQ0=0;OQ=932.62;QD=13.14;SB=-432.88	GT:AD:DP:GL:GQ	0/1:32,39:67:-116.74,-20.20,-124.71:99
-chr1	1913077	rs7529662	A	G	28.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=4.09;MQ=51.94;MQ0=0;OQ=415.73;QD=6.60;SB=-158.33	GT:AD:DP:GL:GQ	0/1:37,26:55:-61.45,-16.59,-136.84:99
-chr1	1913121	rs6605076	G	A	18.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=2.95;MQ=38.45;MQ0=0;OQ=1375.58;QD=22.55;SB=-647.86	GT:AD:DP:GL:GQ	1/1:0,60:36:-143.81,-13.38,-2.67:99
-chr1	1913134	rs6662056	C	T	90.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=31.19;MQ0=0;OQ=470.14;QD=8.11;SB=-253.79	GT:AD:DP:GL:GQ	0/1:33,25:32:-59.95,-9.65,-52.35:99
-chr1	1913140	rs6605077	T	C	265.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=26.77;MQ0=0;OQ=931.68;QD=17.25;SB=-415.14	GT:AD:DP:GL:GQ	1/1:0,54:27:-96.76,-8.13,-0.01:81.23
-chr1	1913166	rs6605078	A	G	225.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=29.40;MQ0=0;OQ=379.61;QD=9.73;SB=-193.70	GT:AD:DP:GL:GQ	1/1:0,39:13:-41.56,-3.92,-0.01:39.09
-chr1	1913525	rs13303140	A	G	349.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.90;MQ0=0;OQ=337.35;QD=9.92;SB=-170.51	GT:AD:DP:GL:GQ	0/1:16,18:26:-44.86,-7.84,-45.87:99
-chr1	1913541	rs6675865	A	G	238.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=54.81;MQ0=0;OQ=476.22;QD=12.53;SB=-203.64	GT:AD:DP:GL:GQ	0/1:19,19:32:-60.55,-9.64,-59.13:99
-chr1	1914266	rs35822535	A	G	10.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=4.48;MQ=52.01;MQ0=0;OQ=172.60;QD=5.57;SB=-106.80	GT:AD:DP:GL:GQ	0/1:17,12:25:-30.72,-10.17,-62.92:99
-chr1	1914406	rs28674034	C	A	137.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.38;MQ=56.09;MQ0=0;OQ=479.30;QD=11.15;SB=-93.09	GT:AD:DP:GL:GQ	0/1:24,19:37:-62.36,-11.14,-73.40:99
-chr1	1914407	.	C	G	17.06	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=1;HaplotypeScore=1.38;MQ=56.18;MQ0=0;OQ=578.11;QD=13.14;SB=-126.71	GT:AD:DP:GL:GQ	0/1:24,20:35:-71.66,-10.56,-69.93:99
-chr1	1914645	rs58504758	G	A	76.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=56.31;MQ0=0;OQ=649.38;QD=14.43;SB=-87.56	GT:AD:DP:GL:GQ	0/1:23,22:44:-81.48,-13.26,-81.33:99
-chr1	1914669	rs57460771	C	G	59.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=52.90;MQ0=0;OQ=635.24;QD=15.88;SB=-152.79	GT:AD:DP:GL:GQ	0/1:17,23:37:-77.97,-11.16,-71.80:99
-chr1	1915019	rs5021356	C	T	38.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=38.83;MQ0=0;OQ=299.26;QD=5.16;SB=-51.25	GT:AD:DP:GL:GQ	0/1:26,32:29:-41.96,-8.75,-54.57:99
-chr1	1915025	rs5021357	C	T	0.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=37.79;MQ0=0;OQ=104.46;QD=1.66;SB=-36.16	GT:AD:DP:GL:GQ	0/1:31,32:32:-23.37,-9.64,-89.65:99
-chr1	1915153	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=18.97;MQ=41.21;MQ0=1;OQ=317.64;QD=7.56;SB=-31.63	GT:AD:DP:GL:GQ	0/1:23,16:24:-42.29,-7.24,-39.07:99
-chr1	1915186	rs2377036	C	A	0.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=2.46;MQ=38.80;MQ0=2;OQ=789.31;QD=23.22;SB=-127.84	GT:AD:DP:GL:GQ	1/1:3,31:25:-82.54,-7.54,-0.02:75.13
-chr1	1915197	.	C	T	2.41	PASS	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=35.96;MQ0=2;OQ=151.83;QD=4.34;SB=2.02	GT:AD:DP:GL:GQ	0/1:24,11:24:-25.70,-7.23,-56.48:99
-chr1	1915324	rs2889540	C	T	459.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.97;MQ0=0;OQ=2370.24;QD=35.38;SB=-497.01	GT:AD:DP:GL:GQ	1/1:1,66:63:-240.64,-18.99,-0.03:99
-chr1	1915581	rs6691182	G	A	155.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=58.09;MQ0=0;OQ=1565.00;QD=18.20;SB=-799.86	GT:AD:DP:GL:GQ	0/1:40,46:84:-185.10,-25.32,-125.47:99
-chr1	1915947	rs6661597	T	C	434.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.43;MQ0=0;OQ=753.37;QD=11.59;SB=-273.59	GT:AD:DP:GL:GQ	0/1:32,33:62:-97.31,-18.69,-126.97:99
-chr1	1915962	rs6675751	G	C	346.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1124.09;QD=17.56;SB=-315.97	GT:AD:DP:GL:GQ	0/1:34,30:64:-134.99,-19.30,-134.99:99
-chr1	1916138	rs6667687	A	T	24.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=5.93;MQ=59.44;MQ0=0;OQ=1046.27;QD=14.14;SB=-543.64	GT:AD:DP:GL:GQ	0/1:37,36:71:-129.30,-21.39,-135.06:99
-chr1	1917124	rs13302991	A	G	77.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=48.19;MQ0=0;OQ=664.15;QD=15.09;SB=-132.68	GT:AD:DP:GL:GQ	0/1:17,27:41:-82.05,-12.36,-62.14:99
-chr1	1918235	rs58325500	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.01;HRun=15;HaplotypeScore=12.28;MQ=47.41;MQ0=2;OQ=54.80;QD=0.68;SB=8.48	GT:AD:DP:GL:GQ	0/1:66,14:56:-25.35,-16.59,-150.42:87.64
-chr1	1918448	rs28827857	G	A	289.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=57.61;MQ0=0;OQ=1091.40;QD=15.82;SB=-363.89	GT:AD:DP:GL:GQ	0/1:36,33:66:-132.32,-19.90,-105.59:99
-chr1	1918459	rs28770275	C	T	156.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.33;MQ0=0;OQ=990.70;QD=15.98;SB=-272.19	GT:AD:DP:GL:GQ	0/1:31,31:62:-121.04,-18.69,-98.12:99
-chr1	1919267	rs6672175	T	C	222.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=3.35;MQ=59.22;MQ0=0;OQ=1139.84;QD=14.61;SB=-513.90	GT:AD:DP:GL:GQ	0/1:38,40:77:-140.46,-23.19,-152.92:99
-chr1	1919526	rs7532409	A	G	229.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.27;MQ0=0;OQ=832.47;QD=13.21;SB=-385.03	GT:AD:DP:GL:GQ	0/1:26,37:58:-104.01,-17.48,-104.69:99
-chr1	1919694	rs7532529	A	C	228.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=57.10;MQ0=0;OQ=714.32;QD=14.58;SB=-265.84	GT:AD:DP:GL:GQ	0/1:24,25:47:-88.87,-14.15,-84.13:99
-chr1	1919719	rs7527169	T	C	335.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.16;MQ0=0;OQ=729.87;QD=16.59;SB=-259.34	GT:AD:DP:GL:GQ	0/1:16,28:43:-89.23,-12.96,-64.51:99
-chr1	1919737	rs7520124	C	A	233.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.52;MQ0=0;OQ=916.99;QD=20.84;SB=-414.85	GT:AD:DP:GL:GQ	0/1:15,29:44:-108.24,-13.26,-45.66:99
-chr1	1919954	rs7542825	G	A	154.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=58.01;MQ0=0;OQ=805.39;QD=15.79;SB=-224.54	GT:AD:DP:GL:GQ	0/1:26,25:50:-98.90,-15.08,-78.21:99
-chr1	1920251	rs6605079	C	G	333.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=1146.24;QD=15.08;SB=-200.61	GT:AD:DP:GL:GQ	0/1:45,31:76:-140.81,-22.90,-188.17:99
-chr1	1920372	rs6605080	A	G	234.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=57.79;MQ0=0;OQ=682.29;QD=12.87;SB=-281.00	GT:AD:DP:GL:GQ	0/1:25,28:47:-85.67,-14.16,-99.05:99
-chr1	1920614	rs6605081	C	T	426.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=58.39;MQ0=0;OQ=1403.83;QD=17.12;SB=-667.29	GT:AD:DP:GL:GQ	0/1:39,43:80:-167.77,-24.10,-135.75:99
-chr1	1920665	rs6605082	G	C	238.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=58.49;MQ0=0;OQ=1324.95;QD=16.99;SB=-669.29	GT:AD:DP:GL:GQ	0/1:42,36:76:-158.70,-22.92,-158.25:99
-chr1	1920803	rs13303035	C	T	159	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=2.47;MQ=59.45;MQ0=0;OQ=1062.14;QD=13.98;SB=-530.37	GT:AD:DP:GL:GQ	0/1:41,35:73:-131.51,-22.01,-125.50:99
-chr1	1920841	rs13303352	T	C	445.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.82;MQ0=0;OQ=837.48;QD=11.63;SB=-306.06	GT:AD:DP:GL:GQ	0/1:38,34:70:-108.13,-21.10,-146.79:99
-chr1	1921055	rs13303031	G	T	88.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=1.13;MQ=58.92;MQ0=0;OQ=786.34;QD=15.12;SB=-342.30	GT:AD:DP:GL:GQ	0/1:26,26:52:-97.58,-15.66,-91.48:99
-chr1	1921356	rs6685055	A	G	17.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=2.97;MQ=59.49;MQ0=0;OQ=448.41;QD=9.96;SB=-237.28	GT:AD:DP:GL:GQ	0/1:26,19:44:-61.39,-13.26,-100.60:99
-chr1	1921389	rs6679335	T	G	83.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=1.67;MQ=59.13;MQ0=0;OQ=685.03;QD=12.93;SB=-353.06	GT:AD:DP:GL:GQ	0/1:29,24:52:-87.45,-15.66,-100.08:99
-chr1	1922327	rs28588769	G	A	183.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.89;MQ0=1;OQ=778.96;QD=15.58;SB=-259.18	GT:AD:DP:GL:GQ	0/1:25,25:47:-95.35,-14.17,-73.16:99
-chr1	1922868	rs2376808	G	A	157.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=59.34;MQ0=0;OQ=723.69;QD=10.34;SB=-347.08	GT:AD:DP:GL:GQ	0/1:45,25:64:-94.96,-19.30,-123.08:99
-chr1	1922895	rs2376807	G	A	266.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=58.98;MQ0=0;OQ=1217.48;QD=13.99;SB=-488.00	GT:AD:DP:GL:GQ	0/1:49,38:84:-150.33,-25.30,-168.79:99
-chr1	1923727	rs4434797	T	C	63.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.46;MQ0=0;OQ=1150.76;QD=28.77;SB=-542.44	GT:AD:DP:GL:GQ	1/1:1,39:35:-118.68,-10.55,-0.02:99
-chr1	1923976	rs2376806	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=7;HaplotypeScore=3.79;MQ=59.30;MQ0=0;OQ=886.58;QD=14.78;SB=-242.95	GT:AD:DP:GL:GQ	0/1:31,29:60:-110.01,-18.07,-107.98:99
-chr1	1924507	rs6682175	C	G	459.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1286.38;QD=16.93;SB=-654.00	GT:AD:DP:GL:GQ	0/1:39,37:74:-154.22,-22.30,-163.90:99
-chr1	1925440	.	A	C	17.47	PASS	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=54.31;MQ0=0;OQ=233.12;QD=9.71;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,12:20:-32.62,-6.03,-38.03:99
-chr1	1925994	rs13303219	G	A	173.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.24;MQ0=0;OQ=2130.07;QD=38.04;SB=-927.23	GT:AD:DP:GL:GQ	1/1:0,56:55:-216.61,-16.57,-0.02:99
-chr1	1927245	.	C	A	6.32	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.74;MQ=50.81;MQ0=0;OQ=1490.54;QD=26.15;SB=-627.15	GT:AD:DP:GL:GQ	0/1:11,46:54:-168.60,-16.27,-27.03:99
-chr1	1929194	.	G	A	93.04	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.76;MQ=54.76;MQ0=0;OQ=934.74;QD=16.40;SB=-478.51	GT:AD:DP:GL:GQ	0/1:29,28:56:-113.63,-16.87,-101.37:99
-chr1	1929934	.	G	A	0.59	PASS	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=6.95;MQ=58.36;MQ0=1;OQ=902.25;QD=19.20;SB=-435.95	GT:AD:DP:GL:GQ	0/1:20,27:46:-107.37,-13.86,-69.60:99
-chr1	1931518	rs6605072	C	T	176.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.65;MQ0=0;OQ=1960.94;QD=37.71;SB=-913.32	GT:AD:DP:GL:GQ	1/1:0,52:51:-199.70,-15.37,-0.02:99
-chr1	1931688	rs13303071	T	C	1556.10	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.24;MQ0=0;QD=27.79;SB=-792.66	GT:AD:DP:GL:GQ	1/1:0,56:50:-159.24,-15.08,-0.05:99
-chr1	1931693	.	A	G	1848.16	SnpCluster	AC=2;AF=1.00;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=49.03;MQ0=0;QD=33.60;SB=-934.96	GT:AD:DP:GL:GQ	1/1:0,55:53:-188.42,-15.97,-0.02:99
-chr1	1931694	.	T	A	1917.61	SnpCluster	AC=2;AF=1.00;AN=2;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=49.24;MQ0=0;QD=35.51;SB=-952.61	GT:AD:DP:GL:GQ	1/1:0,54:52:-195.36,-15.66,-0.02:99
-chr1	1931789	rs6656398	G	A	540.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.77;MQ0=0;OQ=2040.90;QD=38.51;SB=-804.04	GT:AD:DP:GL:GQ	1/1:0,53:51:-207.69,-15.36,-0.01:99
-chr1	1931893	rs13303124	C	A	616.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.54;MQ0=0;OQ=2901.26;QD=36.72;SB=-1390.14	GT:AD:DP:GL:GQ	1/1:0,79:79:-293.73,-23.79,-0.02:99
-chr1	1933151	rs6672254	C	T	447.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=1292.37;QD=33.14;SB=-431.53	GT:AD:DP:GL:GQ	1/1:0,39:34:-132.84,-10.25,-0.02:99
-chr1	1933961	rs6605073	C	G	112.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=54.93;MQ0=0;OQ=3433.93;QD=42.39;SB=-1558.19	GT:AD:DP:GL:GQ	1/1:0,81:81:-342.39,-24.42,-0.04:99
-chr1	1936451	rs13303016	G	A	86.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=58.88;MQ0=0;OQ=2221.58;QD=38.30;SB=-691.42	GT:AD:DP:GL:GQ	1/1:0,56:56:-225.76,-16.87,-0.02:99
-chr1	1936669	rs4648752	C	T	217.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=2508.96;QD=37.45;SB=-1210.99	GT:AD:DP:GL:GQ	1/1:0,67:64:-254.50,-19.28,-0.02:99
-chr1	1937615	rs2376804	C	A	568.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.26;MQ0=0;OQ=1581.66;QD=34.38;SB=-723.87	GT:AD:DP:GL:GQ	1/1:0,46:45:-161.77,-13.56,-0.02:99
-chr1	1938260	rs13303344	C	A	671.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.98;MQ0=0;OQ=1865.08;QD=33.91;SB=-728.87	GT:AD:DP:GL:GQ	1/1:0,55:54:-190.12,-16.27,-0.02:99
-chr1	1938665	rs4481796	T	C	1.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=7.00;MQ=59.19;MQ0=0;OQ=1999.82;QD=33.90;SB=-790.00	GT:AD:DP:GL:GQ	1/1:1,58:55:-203.58,-16.56,-0.01:99
-chr1	1939404	rs3121818	G	T	55.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=4.13;MQ=57.70;MQ0=0;OQ=2038.83;QD=32.88;SB=-977.56	GT:AD:DP:GL:GQ	1/1:1,61:60:-210.75,-18.07,-3.28:99
-chr1	1940481	rs28603108	G	A	85.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=244.10;QD=30.51;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,8:7:-27.99,-2.11,-0.00:21.07
-chr1	1941687	rs3121819	A	G	228.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2020.01;QD=32.58;SB=-994.40	GT:AD:DP:GL:GQ	1/1:0,62:62:-205.63,-18.69,-0.05:99
-chr1	1942465	rs28502222	T	C	371.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.43;MQ0=0;OQ=1719.40;QD=30.16;SB=-855.54	GT:AD:DP:GL:GQ	1/1:0,57:54:-175.57,-16.29,-0.05:99
-chr1	1942470	rs28407473	T	C	563.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=1937.81;QD=31.25;SB=-894.53	GT:AD:DP:GL:GQ	1/1:0,62:60:-197.41,-18.09,-0.05:99
-chr1	1942642	rs3128318	C	A	368.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=1363.24;QD=34.95;SB=-493.39	GT:AD:DP:GL:GQ	1/1:0,39:38:-139.92,-11.45,-0.01:99
-chr1	1943112	rs3128321	T	C	309.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.60;MQ0=0;OQ=865.40;QD=28.85;SB=-224.64	GT:AD:DP:GL:GQ	1/1:0,30:27:-90.14,-8.14,-0.02:81.21
-chr1	1943436	rs28595482	G	A	148.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.62;MQ0=0;OQ=1902.67;QD=38.83;SB=-885.18	GT:AD:DP:GL:GQ	1/1:0,49:48:-193.87,-14.46,-0.01:99
-chr1	1943672	rs4648614	C	T	198.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.32;MQ0=0;OQ=2028.99;QD=36.89;SB=-959.37	GT:AD:DP:GL:GQ	1/1:0,55:53:-206.51,-15.97,-0.03:99
-chr1	1944296	rs3128322	G	A	216.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=59.01;MQ0=0;OQ=2427.18;QD=36.78;SB=-1173.08	GT:AD:DP:GL:GQ	1/1:0,65:64:-246.33,-19.29,-0.03:99
-chr1	1944940	rs3128323	G	A	20.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=4.15;MQ=59.13;MQ0=0;OQ=1516.55;QD=28.61;SB=-577.76	GT:AD:DP:GL:GQ	1/1:0,53:41:-155.26,-12.36,-0.02:99
-chr1	1945844	rs2889475	C	T	626.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.31;MQ0=0;OQ=2161.84;QD=35.44;SB=-988.03	GT:AD:DP:GL:GQ	1/1:0,61:56:-219.79,-16.87,-0.02:99
-chr1	1946222	rs2376805	G	A	202.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=58.86;MQ0=0;OQ=2273.19;QD=37.27;SB=-1064.36	GT:AD:DP:GL:GQ	1/1:0,61:58:-230.92,-17.47,-0.02:99
-chr1	1946897	rs2229110	T	C	11.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.69;MQ=58.29;MQ0=0;OQ=1169.00;QD=28.51;SB=-410.54	GT:AD:DP:GL:GQ	1/1:1,40:35:-120.50,-10.54,-0.02:99
-chr1	1947159	rs3820007	C	T	19.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=59.17;MQ0=0;OQ=557.21;QD=19.90;SB=-159.09	GT:AD:DP:GL:GQ	1/1:0,24:17:-62.02,-7.79,-2.71:50.81
-chr1	1949121	rs28574670	A	G	500.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1666.55;QD=35.46;SB=-850.35	GT:AD:DP:GL:GQ	1/1:0,47:47:-170.25,-14.16,-0.02:99
-chr1	1949838	rs28409373	C	T	14.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.07;MQ0=0;OQ=1034.54;QD=34.48;SB=-177.68	GT:AD:DP:GL:GQ	1/1:0,30:29:-107.06,-8.75,-0.02:87.26
-chr1	1950786	rs28581504	T	C	332.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.64;MQ0=0;OQ=1013.22;QD=32.68;SB=-423.78	GT:AD:DP:GL:GQ	1/1:0,31:30:-104.92,-9.04,-0.02:90.23
-chr1	1953035	rs13302932	A	G	11.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=3.55;MQ=60.00;MQ0=0;OQ=905.11;QD=24.46;SB=-434.83	GT:AD:DP:GL:GQ	1/1:0,37:30:-94.12,-9.05,-0.03:90.20
-chr1	1953275	rs17715203	A	G	438.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=1126.75;QD=30.45;SB=-438.29	GT:AD:DP:GL:GQ	1/1:0,37:35:-116.28,-10.55,-0.02:99
-chr1	1955750	.	G	C	30.56	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=3;HaplotypeScore=5.70;MQ=42.68;MQ0=2;QD=0.27;SB=83.98	GT:AD:DP:GL:GQ	0/1:64,50:68:-26.83,-20.49,-269.17:63.39
-chr1	1955789	.	C	G	28.79	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=1;HaplotypeScore=3.29;MQ=41.60;MQ0=2;QD=0.26;SB=62.45	GT:AD:DP:GL:GQ	0/1:60,50:64:-25.45,-19.29,-247.08:61.62
-chr1	1956476	rs3128311	A	G	7.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=2.79;MQ=58.13;MQ0=0;OQ=1189.30;QD=33.98;SB=-560.89	GT:AD:DP:GL:GQ	1/1:0,35:34:-122.53,-10.24,-0.01:99
-chr1	1956519	rs3128312	A	G	0.03	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=5;HaplotypeScore=2.16;MQ=57.85;MQ0=0;OQ=1010.92;QD=30.63;SB=-251.77	GT:AD:DP:GL:GQ	1/1:0,33:30:-104.69,-9.04,-0.02:90.25
-chr1	1956874	.	G	A	318.30	PASS	AC=2;AF=1.00;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=1884.66;QD=38.46;SB=-687.34	GT:AD:DP:GL:GQ	1/1:0,49:48:-192.06,-14.46,-0.01:99
-chr1	1957814	rs2376803	C	T	3.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=5.41;MQ=59.46;MQ0=0;OQ=1636.24;QD=38.05;SB=-662.40	GT:AD:DP:GL:GQ	1/1:0,43:42:-167.22,-12.65,-0.01:99
-chr1	1958691	rs9442614	A	G	93.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.19;MQ0=0;OQ=1548.19;QD=27.16;SB=-690.61	GT:AD:DP:GL:GQ	1/1:0,57:50:-158.45,-15.08,-0.05:99
-chr1	1958819	rs13303086	G	A	42.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.38;MQ0=0;OQ=1355.91;QD=36.65;SB=-559.75	GT:AD:DP:GL:GQ	1/1:0,37:35:-139.19,-10.54,-0.01:99
-chr1	1961249	rs3121820	G	C	348.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.98;MQ0=0;OQ=1964.71;QD=40.10;SB=-703.68	GT:AD:DP:GL:GQ	1/1:0,49:48:-200.08,-14.47,-0.02:99
-chr1	1964088	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=20;HaplotypeScore=27.35;MQ=45.54;MQ0=0;OQ=216.77;QD=4.93;SB=-12.47	GT:AD:DP:GL:GQ	0/1:28,16:30:-34.00,-9.04,-73.59:99
-chr1	1966711	rs28394674	G	T	70.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.59;MQ=58.47;MQ0=0;OQ=2068.09;QD=33.90;SB=-496.39	GT:AD:DP:GL:GQ	1/1:0,60:58:-210.42,-17.47,-0.02:99
-chr1	1974087	rs3128319	C	T	215.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=59.66;MQ0=0;OQ=974.85;QD=17.72;SB=-353.37	GT:AD:DP:GL:GQ	0/1:25,30:52:-116.43,-15.67,-87.00:99
-chr1	1974552	rs3121826	A	G	92.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.67;MQ0=0;OQ=1020.08;QD=29.15;SB=-506.02	GT:AD:DP:GL:GQ	1/1:0,35:33:-105.63,-9.96,-0.04:99
-chr1	1974671	rs3121827	G	T	491.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.58;MQ0=0;OQ=1710.64;QD=34.91;SB=-820.86	GT:AD:DP:GL:GQ	1/1:0,49:48:-174.66,-14.46,-0.02:99
-chr1	1975030	rs35020387	G	A	113.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.07;MQ=60.00;MQ0=0;OQ=1769.06;QD=36.10;SB=-889.65	GT:AD:DP:GL:GQ	1/1:0,49:46:-180.51,-13.86,-0.02:99
-chr1	1982066	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=2;HaplotypeScore=0.95;MQ=56.20;MQ0=0;OQ=60.60;QD=2.42;SB=35.14	GT:AD:DP:GL:GQ	0/1:18,7:19:-15.09,-5.75,-56.99:93.44
-chr1	1982837	rs17777295	G	T	2.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=4.79;MQ=57.88;MQ0=0;OQ=1411.52;QD=35.29;SB=-620.56	GT:AD:DP:GL:GQ	1/1:0,40:39:-144.75,-11.75,-0.01:99
-chr1	1987331	rs56136180	A	G	202.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=1;HaplotypeScore=1.52;MQ=55.14;MQ0=0;OQ=1346.89;QD=15.85;SB=-685.93	GT:AD:DP:GL:GQ	0/1:38,47:81:-162.37,-24.40,-147.70:99
-chr1	1989540	rs28479788	G	A	186.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=58.66;MQ0=0;OQ=851.87;QD=16.38;SB=-358.89	GT:AD:DP:GL:GQ	0/1:25,27:48:-102.94,-14.47,-69.44:99
-chr1	1995600	rs2459986	T	C	313.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.14;MQ0=0;OQ=733.38;QD=27.16;SB=-310.12	GT:AD:DP:GL:GQ	1/1:0,27:25:-76.96,-7.55,-0.03:75.14
-chr1	1996588	rs2678943	T	C	52.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.08;MQ0=0;OQ=1052.54;QD=26.99;SB=-491.16	GT:AD:DP:GL:GQ	1/1:0,38:34:-108.87,-10.26,-0.03:99
-chr1	1997534	rs2803307	A	G	10.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=3.74;MQ=59.13;MQ0=0;OQ=1580.39;QD=29.82;SB=-788.60	GT:AD:DP:GL:GQ	1/1:0,53:50:-161.67,-15.08,-0.05:99
-chr1	1999411	.	C	T	1.67	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=5.65;MQ=58.95;MQ0=0;OQ=1145.66;QD=18.48;SB=-378.12	GT:AD:DP:GL:GQ	0/1:25,36:58:-135.32,-17.47,-87.50:99
-chr1	2004056	rs28436686	G	A	119.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=59.61;MQ0=0;OQ=2326.78;QD=39.44;SB=-1079.37	GT:AD:DP:GL:GQ	1/1:0,59:59:-236.28,-17.77,-0.01:99
-chr1	2014367	rs9729600	T	C	414.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.74;MQ0=0;OQ=1723.74;QD=27.36;SB=-655.55	GT:AD:DP:GL:GQ	1/1:0,63:57:-176.03,-17.20,-0.07:99
-chr1	2015467	rs61775405	G	A	154	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=3.51;MQ=57.06;MQ0=0;OQ=444.57;QD=10.84;SB=-245.22	GT:AD:DP:GL:GQ	0/1:23,18:37:-58.92,-11.18,-62.94:99
-chr1	2015957	.	T	A	20.13	LowQual	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.77;MQ0=3;QD=0.75;SB=-6.99	GT:AD:DP:GL:GQ	0/1:17,10:5:-6.80,-1.51,-8.98:52.92
-chr1	2015991	.	G	T	43.95	LowQual	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=23.36;MQ0=2;QD=1.19;SB=-6.99	GT:AD:DP:GL:GQ	0/1:34,3:8:-10.09,-2.41,-13.96:76.78
-chr1	2017284	rs12123775	G	A	100.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=256.85;QD=11.17;SB=-34.51	GT:AD:DP:GL:GQ	0/1:14,9:22:-35.60,-6.63,-46.44:99
-chr1	2019252	rs3128329	T	C	18.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=2.93;MQ=58.39;MQ0=0;OQ=1634.16;QD=29.71;SB=-754.64	GT:AD:DP:GL:GQ	1/1:0,55:52:-167.05,-15.69,-0.05:99
-chr1	2019320	.	T	G	18.93	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=4;HaplotypeScore=7.98;MQ=58.04;MQ0=0;QD=0.34;SB=68.22	GT:AD:DP:GL:GQ	0/1:29,26:34:-15.41,-10.24,-102.90:51.71
-chr1	2019693	.	T	G	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=2;HaplotypeScore=1.11;MQ=51.54;MQ0=0;OQ=164.91;QD=4.34;SB=47.17	GT:AD:DP:GL:GQ	0/1:19,19:29:-28.51,-8.74,-68.55:99
-chr1	2023899	rs7521371	A	G	276.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.14;MQ0=0;OQ=762.93;QD=15.26;SB=-284.46	GT:AD:DP:GL:GQ	0/1:23,27:49:-94.34,-14.76,-92.20:99
-chr1	2025239	rs10910029	A	G	201.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.60;MQ0=0;OQ=1376.71;QD=29.29;SB=-649.94	GT:AD:DP:GL:GQ	1/1:0,47:44:-141.29,-13.27,-0.04:99
-chr1	2025544	rs10910030	C	T	525.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1279.25;QD=36.55;SB=-479.12	GT:AD:DP:GL:GQ	1/1:0,35:34:-131.53,-10.25,-0.02:99
-chr1	2025659	rs10752741	G	A	653.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2163.55;QD=37.96;SB=-800.07	GT:AD:DP:GL:GQ	1/1:0,57:55:-219.96,-16.57,-0.02:99
-chr1	2025837	rs10752742	G	T	4.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=6.39;MQ=58.92;MQ0=0;OQ=1340.29;QD=31.17;SB=-640.07	GT:AD:DP:GL:GQ	1/1:0,43:38:-137.63,-11.45,-0.01:99
-chr1	2026123	rs10797413	G	A	219.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.78;MQ0=0;OQ=1381.00;QD=36.34;SB=-700.35	GT:AD:DP:GL:GQ	1/1:0,38:36:-141.70,-10.85,-0.01:99
-chr1	2026457	rs3128332	G	T	494.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=1536.71;QD=35.74;SB=-400.25	GT:AD:DP:GL:GQ	1/1:0,43:42:-157.27,-12.65,-0.01:99
-chr1	2027806	.	A	G	242.28	HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=33.01;MQ0=5;QD=9.69;SB=-135.79	GT:AD:DP:GL:GQ	0/1:9,16:13:-31.43,-3.92,-15.54:99
-chr1	2027817	.	A	G	86.37	HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=28.31;MQ0=5;QD=5.08;SB=-66.32	GT:AD:DP:GL:GQ	0/1:7,10:8:-14.33,-2.41,-15.43:99
-chr1	2027825	rs7364595	T	C	235.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=23.06;MQ0=5;OQ=93.65;QD=7.80;SB=-40.95	GT:AD:DP:GL:GQ	1/1:0,12:4:-12.90,-1.21,-0.00:12.03
-chr1	2027884	.	A	G	40.99	LowQual	AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=37.48;MQ0=2;QD=4.10;SB=-10.00	GT:AD:DP:GL:GQ	0/1:3,7:4:-8.59,-1.21,-3.37:21.64
-chr1	2027902	.	C	T	0.78	PASS	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=45.01;MQ0=2;OQ=55.77;QD=3.49;SB=-10.00	GT:AD:DP:GL:GQ	0/1:13,3:11:-12.18,-3.32,-23.75:88.60
-chr1	2027903	.	A	G	47.94	LowQual	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=45.01;MQ0=2;QD=3.00;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,4:11:-11.39,-3.31,-30.54:80.77
-chr1	2027922	rs61775410	A	G	254.38	Indel	AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=10.71;MQ=52.34;MQ0=2;QD=12.11;SB=-40.68	GT:AD:DP:GL:GQ	0/1:8,13:15:-33.24,-4.52,-21.40:99
-chr1	2027961	rs12745429	G	A	0.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=3.42;MQ=51.66;MQ0=4;OQ=50.47;QD=1.58;SB=-46.03	GT:AD:DP:GL:GQ	0/1:27,5:21:-14.67,-6.34,-51.74:83.30
-chr1	2027962	rs12723086	T	C	0.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=3.42;MQ=51.66;MQ0=4;OQ=55.89;QD=1.75;SB=-41.82	GT:AD:DP:GL:GQ	0/1:25,7:25:-16.41,-7.54,-72.40:88.73
-chr1	2027980	.	A	G	0.42	PASS	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=49.52;MQ0=4;OQ=96.12;QD=2.75;SB=-41.28	GT:AD:DP:GL:GQ	0/1:27,8:28:-21.34,-8.45,-80.79:99
-chr1	2027991	.	A	G	34.81	PASS	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.55;MQ=51.01;MQ0=3;OQ=431.23;QD=9.58;SB=-194.62	GT:AD:DP:GL:GQ	0/1:24,21:36:-57.25,-10.85,-78.85:99
-chr1	2028038	rs7349084	A	G	0.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=7.00;MQ=50.77;MQ0=1;OQ=115.20;QD=1.99;SB=-64.54	GT:AD:DP:GL:GQ	0/1:47,10:48:-29.27,-14.47,-151.97:99
-chr1	2028049	rs12133181	A	G	36.56	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=65.95;MQ=50.10;MQ0=2;QD=0.48;SB=17.41	GT:AD:DP:GL:GQ	0/1:60,12:63:-25.92,-18.99,-218.94:69.39
-chr1	2028057	rs7514664	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=1;HaplotypeScore=92.07;MQ=50.08;MQ0=4;OQ=1734.98;QD=17.53;SB=-712.36	GT:AD:DP:GL:GQ	0/1:13,84:69:-197.59,-20.81,-27.48:66.63
-chr1	2028096	rs7349113	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=144;Dels=0.00;HRun=1;HaplotypeScore=338.66;MQ=50.60;MQ0=2;OQ=249.31;QD=1.73;SB=17.40	GT:AD:DP:GL:GQ	0/1:107,21:99:-60.23,-32.01,-282.27:99
-chr1	2028116	rs61775411	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=130;Dels=0.00;HRun=1;HaplotypeScore=156.17;MQ=50.22;MQ0=2;OQ=1368.71;QD=10.53;SB=-489.55	GT:AD:DP:GL:GQ	0/1:47,78:82:-164.90,-24.74,-105.56:99
-chr1	2028135	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=77.77;MQ=49.84;MQ0=2;OQ=170.97;QD=2.04;SB=-24.42	GT:AD:DP:GL:GQ	0/1:67,11:63:-39.37,-18.98,-181.92:99
-chr1	2028136	rs12080420	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=76.98;MQ=49.85;MQ0=2;OQ=157.43;QD=1.94;SB=-74.46	GT:AD:DP:GL:GQ	0/1:62,16:61:-37.41,-18.38,-198.10:99
-chr1	2028154	rs3753241	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=33.73;MQ=52.95;MQ0=1;OQ=379.95;QD=7.31;SB=-7.96	GT:AD:DP:GL:GQ	0/1:34,16:44:-54.55,-13.27,-93.77:99
-chr1	2028522	rs3128334	G	A	30.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.73;MQ=59.44;MQ0=0;OQ=1539.70;QD=37.55;SB=-534.21	GT:AD:DP:GL:GQ	1/1:0,39:39:-157.57,-11.75,-0.01:99
-chr1	2028753	rs908744	G	A	89.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.73;MQ=58.80;MQ0=0;OQ=1922.45;QD=33.15;SB=-549.87	GT:AD:DP:GL:GQ	1/1:0,58:52:-195.86,-15.68,-0.03:99
-chr1	2029096	rs1040231	G	T	78.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.23;MQ=58.48;MQ0=0;OQ=1527.94;QD=33.22;SB=-620.05	GT:AD:DP:GL:GQ	1/1:1,45:45:-156.40,-13.56,-0.02:99
-chr1	2029381	rs16824792	G	T	92.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.28;MQ0=0;OQ=1106.74;QD=34.59;SB=-441.64	GT:AD:DP:GL:GQ	1/1:0,32:31:-114.27,-9.34,-0.01:93.28
-chr1	2029579	rs1878752	G	A	107.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=58.58;MQ0=0;OQ=1364.65;QD=36.88;SB=-510.18	GT:AD:DP:GL:GQ	1/1:0,37:36:-140.06,-10.85,-0.01:99
-chr1	2029956	rs6666117	T	C	57.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=967.27;QD=27.64;SB=-467.25	GT:AD:DP:GL:GQ	1/1:0,35:31:-100.34,-9.35,-0.03:93.22
-chr1	2030248	rs6683011	G	A	365.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.46;MQ0=0;OQ=938.15;QD=36.08;SB=-369.99	GT:AD:DP:GL:GQ	1/1:0,26:24:-97.41,-7.23,-0.01:72.24
-chr1	2030623	rs4648805	G	A	629.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.87;MQ0=0;OQ=1690.17;QD=38.41;SB=-769.01	GT:AD:DP:GL:GQ	1/1:0,44:44:-172.62,-13.26,-0.02:99
-chr1	2030637	rs4648806	C	T	94.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=56.04;MQ0=0;OQ=1691.52;QD=35.24;SB=-723.01	GT:AD:DP:GL:GQ	1/1:0,48:44:-172.75,-13.26,-0.02:99
-chr1	2030645	rs6674878	A	G	54.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=55.66;MQ0=0;OQ=1170.82;QD=26.61;SB=-567.76	GT:AD:DP:GL:GQ	1/1:0,44:39:-120.72,-11.78,-0.06:99
-chr1	2030758	rs4648807	T	C	223.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.74;MQ=59.17;MQ0=0;OQ=1628.83;QD=29.09;SB=-733.30	GT:AD:DP:GL:GQ	1/1:0,56:52:-166.52,-15.69,-0.05:99
-chr1	2030796	rs4648808	T	C	215.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=59.65;MQ0=0;OQ=1868.75;QD=28.75;SB=-846.52	GT:AD:DP:GL:GQ	1/1:0,65:59:-190.51,-17.80,-0.05:99
-chr1	2031015	rs10910046	C	T	236.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=54.92;MQ0=0;OQ=619.66;QD=30.98;SB=-276.86	GT:AD:DP:GL:GQ	1/1:0,20:17:-65.56,-5.12,-0.01:51.16
-chr1	2031321	rs12059660	C	T	236.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.27;MQ0=0;OQ=1048.92;QD=38.85;SB=-437.08	GT:AD:DP:GL:GQ	1/1:0,27:27:-108.48,-8.13,-0.01:81.26
-chr1	2032403	rs11584491	A	G	58.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=59.38;MQ0=0;OQ=893.06;QD=29.77;SB=-424.80	GT:AD:DP:GL:GQ	1/1:0,30:30:-92.92,-9.05,-0.03:90.18
-chr1	2032854	rs3128336	C	G	73.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.85;MQ=59.29;MQ0=0;OQ=1394.69;QD=35.76;SB=-622.82	GT:AD:DP:GL:GQ	1/1:0,39:35:-143.08,-10.56,-0.03:99
-chr1	2033844	rs3107141	C	T	92.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=4.37;MQ=59.25;MQ0=0;OQ=2275.40;QD=36.70;SB=-1025.90	GT:AD:DP:GL:GQ	1/1:0,62:59:-231.15,-17.78,-0.02:99
-chr1	2033897	rs925905	T	C	149.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.07;MQ0=0;OQ=2152.92;QD=34.17;SB=-821.32	GT:AD:DP:GL:GQ	1/1:0,63:61:-218.90,-18.38,-0.02:99
-chr1	2033914	rs925906	A	C	279.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.02;HRun=0;HaplotypeScore=0.48;MQ=59.34;MQ0=0;OQ=1986.91;QD=33.12;SB=-865.63	GT:AD:DP:GL:GQ	1/1:0,59:59:-202.29,-17.47,-0.02:99
-chr1	2034402	rs3107142	T	C	2.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.38;MQ0=0;OQ=862.83;QD=28.76;SB=-292.45	GT:AD:DP:GL:GQ	1/1:0,30:25:-89.88,-7.54,-0.02:75.20
-chr1	2035025	rs1467217	G	A	101.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=58.81;MQ0=0;OQ=1215.26;QD=31.16;SB=-472.57	GT:AD:DP:GL:GQ	1/1:2,37:32:-125.13,-9.65,-0.02:96.30
-chr1	2035232	rs3107143	G	C	1383.32	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=3;HaplotypeScore=1.46;MQ=53.42;MQ0=0;QD=40.69;SB=-202.29	GT:AD:DP:GL:GQ	1/1:0,34:32:-141.93,-9.65,-0.01:96.32
-chr1	2035236	rs61775448	A	G	957.24	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=52.98;MQ0=0;QD=29.91;SB=-159.74	GT:AD:DP:GL:GQ	1/1:0,32:29:-99.32,-8.74,-0.01:87.24
-chr1	2035240	rs3107144	C	A	1108.98	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=53.21;MQ0=0;QD=33.61;SB=-288.09	GT:AD:DP:GL:GQ	1/1:0,33:31:-114.49,-9.34,-0.01:93.28
-chr1	2035742	rs3128337	A	G	495.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.14;MQ0=0;OQ=2084.14;QD=30.20;SB=-613.59	GT:AD:DP:GL:GQ	1/1:0,69:67:-212.07,-20.22,-0.07:99
-chr1	2036646	rs3128338	G	A	633.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2283.85;QD=36.84;SB=-1084.46	GT:AD:DP:GL:GQ	1/1:0,61:60:-232.00,-18.09,-0.03:99
-chr1	2036798	rs3128339	G	T	418.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.44;MQ0=0;OQ=1615.06;QD=33.65;SB=-604.54	GT:AD:DP:GL:GQ	1/1:0,48:46:-165.11,-13.86,-0.02:99
-chr1	2037356	rs3128340	C	G	20.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=1.21;MQ=59.34;MQ0=0;OQ=2469.41;QD=39.20;SB=-820.16	GT:AD:DP:GL:GQ	1/1:0,63:62:-250.56,-18.70,-0.04:99
-chr1	2037407	rs3107145	G	A	220.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.18;MQ=59.05;MQ0=0;OQ=2392.58;QD=37.38;SB=-1173.71	GT:AD:DP:GL:GQ	1/1:0,64:62:-242.87,-18.68,-0.02:99
-chr1	2037444	rs3107146	T	C	445.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.92;MQ0=0;OQ=1708.25;QD=30.50;SB=-576.98	GT:AD:DP:GL:GQ	1/1:0,56:53:-174.45,-15.98,-0.04:99
-chr1	2038589	rs3107147	G	A	179.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.78;MQ0=0;OQ=3375.92;QD=40.19;SB=-1379.05	GT:AD:DP:GL:GQ	1/1:0,83:83:-336.59,-25.00,-0.02:99
-chr1	2039293	.	A	T	534.23	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=3;HaplotypeScore=26.93;MQ=46.16;MQ0=1;QD=5.40;SB=50.36	GT:AD:DP:GL:GQ	0/1:64,35:82:-81.41,-24.70,-228.25:99
-chr1	2039297	.	C	T	849.12	Indel	AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=16;HaplotypeScore=37.86;MQ=45.71;MQ0=2;QD=8.01;SB=-44.28	GT:AD:DP:GL:GQ	0/1:72,34:90:-115.31,-27.11,-215.41:99
-chr1	2039368	rs3128290	G	T	199.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=57.68;MQ0=0;OQ=1893.89;QD=32.65;SB=-943.62	GT:AD:DP:GL:GQ	1/1:0,58:54:-193.00,-16.27,-0.02:99
-chr1	2039459	rs3107148	T	C	580.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.55;MQ0=0;OQ=1837.96;QD=36.04;SB=-792.00	GT:AD:DP:GL:GQ	1/1:0,51:51:-187.40,-15.36,-0.01:99
-chr1	2040055	rs3107149	A	T	0.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=7.05;MQ=47.19;MQ0=2;OQ=1180.60;QD=26.83;SB=-338.84	GT:AD:DP:GL:GQ	1/1:1,43:33:-121.66,-9.94,-0.01:99
-chr1	2040785	rs3107150	T	A	621.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.05;MQ0=0;OQ=2606.94;QD=34.76;SB=-964.53	GT:AD:DP:GL:GQ	1/1:0,75:72:-264.30,-21.69,-0.03:99
-chr1	2041373	rs3107151	T	G	405.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.29;MQ0=0;OQ=1384.90;QD=30.11;SB=-485.99	GT:AD:DP:GL:GQ	1/1:0,46:41:-142.10,-12.35,-0.02:99
-chr1	2042357	rs3107152	T	C	727.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2187.52;QD=34.72;SB=-1010.74	GT:AD:DP:GL:GQ	1/1:0,63:62:-222.36,-18.68,-0.02:99
-chr1	2042782	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.57;MQ=44.83;MQ0=0;OQ=64.06;QD=1.26;SB=2.03	GT:AD:DP:GL:GQ	0/1:44,7:48:-24.15,-14.46,-148.69:96.90
-chr1	2042814	.	C	G	7.67	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.26;MQ=39.19;MQ0=0;OQ=415.49;QD=7.69;SB=-85.80	GT:AD:DP:GL:GQ	0/1:38,16:51:-60.21,-15.38,-162.70:99
-chr1	2042818	.	A	G	548.88	SnpCluster	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=2;HaplotypeScore=3.40;MQ=38.13;MQ0=0;QD=9.15;SB=-238.62	GT:AD:DP:GL:GQ	0/1:35,25:55:-74.74,-16.57,-136.02:99
-chr1	2042827	rs56946456	C	T	974.86	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.38;MQ=37.16;MQ0=0;QD=15.23;SB=-13.45	GT:AD:DP:GL:GQ	0/1:33,30:59:-118.54,-17.77,-108.89:99
-chr1	2042828	rs59510407	A	G	718.63	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=2.75;MQ=36.52;MQ0=0;QD=11.98;SB=-10.84	GT:AD:DP:GL:GQ	0/1:33,26:56:-92.01,-16.87,-122.40:99
-chr1	2042846	rs58866862	A	G	74.49	DPFilter;Indel	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=35.77;MQ0=0;QD=1.16;SB=32.14	GT:AD:DP:GL:GQ	0/1:43,21:44:-23.99,-13.25,-151.62:99
-chr1	2042857	rs61526019	C	T	19.11	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=37.11;MQ0=1;QD=0.30;SB=35.13	GT:AD:DP:GL:GQ	0/1:49,15:46:-19.05,-13.86,-151.53:51.90
-chr1	2042876	.	G	T	13.23	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=1;HaplotypeScore=9.69;MQ=38.17;MQ0=2;QD=0.18;SB=41.11	GT:AD:DP:GL:GQ	0/1:58,9:53:-20.55,-15.96,-167.03:45.86
-chr1	2042878	.	T	C	0.10	PASS	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=11.69;MQ=38.38;MQ0=2;OQ=1187.23;QD=16.96;SB=-479.73	GT:AD:DP:GL:GQ	0/1:15,55:50:-137.09,-15.08,-24.25:91.67
-chr1	2042931	.	A	G	53.02	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=15.54;MQ=37.98;MQ0=2;QD=0.69;SB=20.09	GT:AD:DP:GL:GQ	0/1:67,10:63:-27.57,-18.98,-213.37:85.85
-chr1	2042932	.	C	T	144.76	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=10.55;MQ=37.98;MQ0=2;QD=1.88;SB=20.04	GT:AD:DP:GL:GQ	0/1:64,13:62:-36.47,-18.71,-162.72:99
-chr1	2042933	rs61775451	A	G	2056.36	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=7.24;MQ=37.41;MQ0=2;QD=27.79;SB=-304.45	GT:AD:DP:GL:GQ	1/1:0,74:61:-209.25,-18.38,-0.03:99
-chr1	2042939	rs61775452	A	G	1556.23	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=44.30;MQ=35.88;MQ0=3;QD=19.21;SB=-241.65	GT:AD:DP:GL:GQ	0/1:26,55:67:-179.09,-20.18,-61.01:99
-chr1	2042967	.	G	A	494.62	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=42.03;MQ=31.07;MQ0=2;QD=5.75;SB=-10.00	GT:AD:DP:GL:GQ	0/1:65,21:57:-69.92,-17.17,-132.17:99
-chr1	2042968	.	T	C	324.84	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=41.51;MQ=30.57;MQ0=2;QD=3.82;SB=-7.00	GT:AD:DP:GL:GQ	0/1:68,17:56:-52.65,-16.88,-157.62:99
-chr1	2042975	.	G	A	918.15	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=43.08;MQ=30.97;MQ0=1;QD=11.92;SB=-7.00	GT:AD:DP:GL:GQ	0/1:43,34:50:-110.16,-15.06,-77.95:99
-chr1	2042993	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=37.83;MQ=26.92;MQ0=1;OQ=262.34;QD=4.60;SB=-10.00	GT:AD:DP:GL:GQ	0/1:38,19:39:-41.26,-11.74,-103.99:99
-chr1	2043003	.	A	G	593.68	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=39;Dels=0.03;HRun=0;HaplotypeScore=30.47;MQ=26.18;MQ0=1;QD=15.22;SB=-10.00	GT:AD:DP:GL:GQ	0/1:16,22:23:-69.27,-6.63,-8.02:13.91
-chr1	2043004	.	C	T	763.57	Indel;SnpCluster	AC=2;AF=1.00;AN=2;DP=36;Dels=0.06;HRun=0;HaplotypeScore=22.21;MQ=26.52;MQ0=1;QD=21.21;SB=-10.00	GT:AD:DP:GL:GQ	1/1:3,31:22:-82.94,-6.33,-3.00:33.26
-chr1	2043011	.	A	G	85.38	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=1;HaplotypeScore=13.94;MQ=26.97;MQ0=0;QD=3.28;SB=-10.00	GT:AD:DP:GL:GQ	0/1:19,7:20:-17.84,-6.02,-61.94:99
-chr1	2043025	.	C	T	0.23	PASS	AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=7.88;MQ=23.26;MQ0=0;OQ=89.13;QD=11.14;SB=-10.00	GT:AD:DP:GL:GQ	1/1:3,5:3:-12.40,-0.90,-0.00:9.03
-chr1	2043058	.	C	T	0.16	PASS	AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=7.97;MQ=18.94;MQ0=5;OQ=124.33;QD=12.43;SB=-10.00	GT:AD:DP:GL:GQ	1/1:4,6:4:-15.97,-1.21,-0.00:12.04
-chr1	2043061	.	C	T	0.16	PASS	AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=9.08;MQ=17.30;MQ0=6;OQ=117.32;QD=9.78;SB=-10.00	GT:AD:DP:GL:GQ	1/1:4,8:4:-15.27,-1.21,-0.00:12.04
-chr1	2043097	.	C	T	1.40	PASS	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=4.78;MQ=17.14;MQ0=7;OQ=117.84;QD=7.86;SB=-10.00	GT:AD:DP:GL:GQ	0/1:11,4:5:-16.57,-1.51,-3.10:15.90
-chr1	2043134	rs62641630	A	G	85.81	Indel	AC=1;AF=0.50;AN=2;DB;DP=16;Dels=0.00;HRun=1;HaplotypeScore=34.82;MQ=24.20;MQ0=2;QD=5.36;SB=-10.00	GT:AD:DP:GL:GQ	0/1:8,7:9:-14.57,-2.71,-19.58:99
-chr1	2043141	.	T	G	143.26	Indel	AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=21.33;MQ0=2;QD=11.94;SB=-10.00	GT:AD:DP:GL:GQ	1/1:3,9:5:-17.89,-1.51,-0.00:15.05
-chr1	2043178	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=18.82;MQ=19.76;MQ0=6;OQ=129.40;QD=2.70;SB=-10.00	GT:AD:DP:GL:GQ	0/1:34,14:15:-20.75,-4.53,-30.16:99
-chr1	2043181	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=18.51;MQ=19.26;MQ0=7;OQ=70.77;QD=1.31;SB=-10.00	GT:AD:DP:GL:GQ	0/1:41,12:15:-14.88,-4.52,-41.18:99
-chr1	2043199	.	T	C	326.46	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=71.39;MQ=18.51;MQ0=9;QD=3.23;SB=5.04	GT:AD:DP:GL:GQ	0/1:73,28:19:-41.66,-5.73,-27.12:99
-chr1	2043200	.	G	T	127.31	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=1;HaplotypeScore=109.06;MQ=18.45;MQ0=9;QD=1.24;SB=5.04	GT:AD:DP:GL:GQ	0/1:88,15:19:-21.74,-5.72,-47.36:99
-chr1	2043203	.	A	G	195.43	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=1;HaplotypeScore=58.32;MQ=18.15;MQ0=10;QD=1.74;SB=5.04	GT:AD:DP:GL:GQ	0/1:95,17:20:-28.85,-6.02,-47.43:99
-chr1	2043227	rs61775455	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=139;Dels=0.00;HRun=1;HaplotypeScore=26.18;MQ=17.76;MQ0=15;OQ=512.67;QD=3.69;SB=-282.20	GT:AD:DP:GL:GQ	0/1:22,117:18:-59.98,-5.43,-16.39:99
-chr1	2043250	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=40.25;MQ=18.52;MQ0=5;OQ=52.10;QD=0.80;SB=5.03	GT:AD:DP:GL:GQ	0/1:47,18:9:-11.21,-2.71,-18.54:84.93
-chr1	2043253	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=69.74;MQ=17.96;MQ0=6;OQ=126.28;QD=2.18;SB=-31.52	GT:AD:DP:GL:GQ	0/1:37,20:7:-18.02,-2.11,-6.74:46.31
-chr1	2043286	.	C	T	29.35	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=15.82;MQ=16.30;MQ0=5;QD=1.47;SB=-39.54	GT:AD:DP:GL:GQ	0/1:10,10:4:-7.42,-1.21,-6.19:49.87
-chr1	2043289	.	C	T	29.39	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=12.80;MQ=15.14;MQ0=5;QD=1.73;SB=-36.53	GT:AD:DP:GL:GQ	0/1:8,8:3:-7.13,-0.91,-2.70:17.92
-chr1	2043333	.	T	G	28.03	LowQual	AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=18.60;MQ0=2;QD=4.00;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,7:2:-6.21,-0.60,-0.00:6.01
-chr1	2043370	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=30.96;MQ=17.94;MQ0=3;OQ=266.78;QD=3.51;SB=-158.18	GT:AD:DP:GL:GQ	0/1:20,55:9:-32.59,-2.71,-3.10:3.86
-chr1	2043387	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=305.93;MQ=17.79;MQ0=4;OQ=61.76;QD=0.60;SB=5.03	GT:AD:DP:GL:GQ	0/1:70,33:9:-12.17,-2.71,-18.55:94.59
-chr1	2043399	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=1;HaplotypeScore=80.07;MQ=17.30;MQ0=8;OQ=50.40;QD=0.46;SB=-41.37	GT:AD:DP:GL:GQ	0/1:77,30:6:-10.13,-1.81,-8.76:69.51
-chr1	2043410	.	G	A	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=62.95;MQ=16.84;MQ0=8;OQ=120.99;QD=1.22;SB=-42.66	GT:AD:DP:GL:GQ	1/1:14,85:4:-15.63,-1.21,-0.00:12.04
-chr1	2043421	.	C	T	40.51	LowQual	AC=1;AF=0.50;AN=2;DP=97;Dels=0.01;HRun=0;HaplotypeScore=78.29;MQ=16.56;MQ0=9;QD=0.42;SB=-7.00	GT:AD:DP:GL:GQ	0/1:75,21:3:-8.24,-0.90,-2.77:18.65
-chr1	2043428	.	G	A	73.75	Indel	AC=2;AF=1.00;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=65.46;MQ=16.72;MQ0=6;QD=0.88;SB=-10.00	GT:AD:DP:GL:GQ	1/1:16,68:3:-10.87,-0.91,-0.00:9.02
-chr1	2043438	.	G	A	70.80	Indel	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=64.65;MQ=17.33;MQ0=2;QD=1.00;SB=-10.00	GT:AD:DP:GL:GQ	0/1:44,27:4:-11.57,-1.20,-3.47:22.64
-chr1	2043560	.	G	C	29.95	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=54.01;MQ=17.20;MQ0=4;QD=0.86;SB=-10.00	GT:AD:DP:GL:GQ	0/1:29,6:4:-7.49,-1.21,-7.00:57.86
-chr1	2043565	.	C	T	49.25	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=47.09;MQ=17.14;MQ0=4;QD=1.37;SB=-10.00	GT:AD:DP:GL:GQ	1/1:19,17:2:-8.33,-0.60,-0.00:6.02
-chr1	2043572	.	G	A	46.02	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=33.86;MQ=16.62;MQ0=6;QD=1.18;SB=-10.00	GT:AD:DP:GL:GQ	1/1:22,17:2:-8.01,-0.60,-0.00:6.02
-chr1	2043583	.	C	T	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=32.32;MQ=16.61;MQ0=6;OQ=173.76;QD=4.57;SB=-10.00	GT:AD:DP:GL:GQ	1/1:16,22:5:-20.94,-1.51,-0.00:15.05
-chr1	2043590	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=28.82;MQ=16.31;MQ0=5;OQ=78.84;QD=2.39;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,18:4:-12.37,-1.20,-2.87:16.64
-chr1	2043797	.	C	T	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=30.70;MQ=15.39;MQ0=12;OQ=90.55;QD=2.66;SB=-10.00	GT:AD:DP:GL:GQ	1/1:10,21:4:-15.80,-4.21,-3.24:9.74
-chr1	2043818	.	T	C	79	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=39.74;MQ=12.98;MQ0=29;QD=1.39;SB=-10.00	GT:AD:DP:GL:GQ	1/1:42,15:3:-11.39,-0.90,-0.00:9.03
-chr1	2043819	.	G	T	74.28	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=66.63;MQ=12.86;MQ0=30;QD=1.28;SB=-10.00	GT:AD:DP:GL:GQ	1/1:43,15:3:-10.92,-0.90,-0.00:9.03
-chr1	2043822	.	G	A	85.78	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=66.31;MQ=12.73;MQ0=32;QD=1.41;SB=-10.00	GT:AD:DP:GL:GQ	1/1:35,26:3:-12.07,-0.90,-0.00:9.03
-chr1	2043840	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=53.86;MQ=13.17;MQ0=31;OQ=75.78;QD=1.28;SB=-3.99	GT:AD:DP:GL:GQ	0/1:33,26:5:-12.37,-1.51,-6.39:48.86
-chr1	2043865	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=1;HaplotypeScore=29.69;MQ=17.30;MQ0=6;OQ=56.87;QD=2.19;SB=-30.92	GT:AD:DP:GL:GQ	0/1:19,7:4:-10.17,-1.21,-3.00:17.97
-chr1	2043873	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=65.88;MQ=20.81;MQ0=0;OQ=78.81;QD=5.63;SB=-7.00	GT:AD:DP:GL:GQ	0/1:7,7:4:-12.37,-1.21,-3.20:19.92
-chr1	2044254	.	A	G	32.28	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=17;Dels=0.00;HRun=1;HaplotypeScore=4.00;MQ=14.52;MQ0=7;QD=1.90;SB=-10.00	GT:AD:DP:GL:GQ	1/1:8,9:2:-6.64,-0.60,-0.00:6.02
-chr1	2044261	.	G	T	34.69	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=14.97;MQ0=6;QD=2.17;SB=-10.00	GT:AD:DP:GL:GQ	1/1:8,8:2:-6.88,-0.60,-0.00:6.02
-chr1	2045053	.	A	G	0.05	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=1;HaplotypeScore=13.98;MQ=19.49;MQ0=2;OQ=141.20;QD=10.86;SB=-10.00	GT:AD:DP:GL:GQ	1/1:5,8:5:-17.68,-1.51,-0.00:15.04
-chr1	2045060	.	G	T	46.93	LowQual	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=16.54;MQ=19.21;MQ0=2;QD=3.35;SB=-10.00	GT:AD:DP:GL:GQ	0/1:9,5:5:-9.49,-1.51,-6.61:50.97
-chr1	2045064	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=17.54;MQ=18.55;MQ0=3;OQ=51.75;QD=3.45;SB=-10.00	GT:AD:DP:GL:GQ	0/1:6,9:5:-9.97,-1.51,-6.44:49.32
-chr1	2045454	.	C	T	0.01	FDRtranche2.00to10.00	AC=2;AF=1.00;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=19.88;MQ=20.43;MQ0=9;OQ=198.28;QD=7.34;SB=-10.00	GT:AD:DP:GL:GQ	1/1:7,20:6:-23.40,-1.81,-0.00:18.06
-chr1	2045469	.	C	T	0.06	PASS	AC=2;AF=1.00;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=12.29;MQ=20.17;MQ0=11;OQ=284.41;QD=8.89;SB=-48.56	GT:AD:DP:GL:GQ	1/1:9,23:8:-32.02,-2.41,-0.00:24.08
-chr1	2045505	.	C	T	28.68	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=18.97;MQ=24.13;MQ0=5;QD=0.54;SB=11.04	GT:AD:DP:GL:GQ	0/1:44,9:20:-12.18,-6.03,-54.06:61.51
-chr1	2045518	.	C	G	738.24	SnpCluster	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=15.01;MQ=25.23;MQ0=2;QD=13.67;SB=-291.20	GT:AD:DP:GL:GQ	0/1:10,44:25:-84.64,-7.53,-25.69:99
-chr1	2045519	.	G	A	107.30	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=14.97;MQ=25.69;MQ0=2;QD=1.95;SB=11.06	GT:AD:DP:GL:GQ	0/1:46,9:22:-20.64,-6.63,-60.44:99
-chr1	2045523	rs61775456	C	T	1156.65	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=31.40;MQ=26.13;MQ0=1;QD=21.03;SB=-340.35	GT:AD:DP:GL:GQ	1/1:5,50:30:-119.26,-9.04,-0.01:90.29
-chr1	2045530	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=38.81;MQ=25.91;MQ0=2;OQ=314.66;QD=4.56;SB=14.05	GT:AD:DP:GL:GQ	0/1:30,39:21:-41.08,-6.33,-36.84:99
-chr1	2045541	rs61775457	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=85.67;MQ=25.28;MQ0=4;OQ=1042.79;QD=14.28;SB=-111.96	GT:AD:DP:GL:GQ	0/1:30,43:36:-118.41,-10.85,-17.33:64.79
-chr1	2045548	rs61775458	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=80.30;MQ=24.94;MQ0=7;OQ=952.67;QD=11.48;SB=11.05	GT:AD:DP:GL:GQ	0/1:35,48:39:-110.31,-11.76,-31.30:99
-chr1	2045552	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=3;HaplotypeScore=82.09;MQ=25.54;MQ0=10;OQ=109.35;QD=1.09;SB=14.08	GT:AD:DP:GL:GQ	0/1:83,17:53:-30.20,-15.98,-173.43:99
-chr1	2045562	rs61775459	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=103;Dels=0.00;HRun=0;HaplotypeScore=44.83;MQ=25.87;MQ0=15;OQ=1085.84;QD=10.54;SB=-112.96	GT:AD:DP:GL:GQ	0/1:18,82:44:-125.15,-13.28,-24.49:99
-chr1	2045577	rs61776561	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=71.26;MQ=25.93;MQ0=17;OQ=471.38;QD=4.36;SB=-66.29	GT:AD:DP:GL:GQ	0/1:83,25:48:-64.89,-14.47,-100.62:99
-chr1	2045590	rs61776562	C	G	1122.80	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=71.62;MQ=27.29;MQ0=12;QD=12.62;SB=-466.47	GT:AD:DP:GL:GQ	0/1:38,51:51:-130.94,-15.38,-82.60:99
-chr1	2045591	.	G	A	91.87	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=67.28;MQ=27.29;MQ0=12;QD=1.03;SB=20.08	GT:AD:DP:GL:GQ	0/1:68,21:39:-24.23,-11.76,-108.70:99
-chr1	2045595	rs61776563	C	T	1533.88	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=45.58;MQ=27.30;MQ0=11;QD=17.43;SB=-260.54	GT:AD:DP:GL:GQ	1/1:9,79:49:-170.95,-14.77,-14.14:6.27
-chr1	2045606	.	A	G	34.51	DPFilter;HARD_TO_VALIDATE;Indel;LowQual	AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=3;HaplotypeScore=43.22;MQ=27.00;MQ0=12;QD=0.42;SB=23.11	GT:AD:DP:GL:GQ	0/1:76,7:41:-19.11,-12.37,-129.33:67.35
-chr1	2045616	.	T	C	78.88	DPFilter;HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=250.84;MQ=27.16;MQ0=10;QD=1.21;SB=21.87	GT:AD:DP:GL:GQ	0/1:53,10:39:-22.94,-11.77,-110.81:99
-chr1	2045620	rs61776564	G	A	378.54	DPFilter;HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=91.32;MQ=25.99;MQ0=10;QD=7.14;SB=2.03	GT:AD:DP:GL:GQ	0/1:31,22:26:-48.98,-7.84,-44.75:99
-chr1	2045631	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=20.68;MQ=23.69;MQ0=10;OQ=345.67;QD=8.43;SB=-190.29	GT:AD:DP:GL:GQ	0/1:16,25:18:-43.28,-5.43,-21.54:99
-chr1	2045638	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=35.28;MQ=23.82;MQ0=10;OQ=167.44;QD=4.29;SB=-58.06	GT:AD:DP:GL:GQ	0/1:24,15:14:-24.25,-4.23,-24.00:99
-chr1	2045652	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=49.08;MQ=21.77;MQ0=9;OQ=173.85;QD=5.43;SB=-84.31	GT:AD:DP:GL:GQ	0/1:13,19:7:-22.76,-2.11,-3.10:9.89
-chr1	2045656	.	G	A	40.26	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=55.88;MQ=22.32;MQ0=8;QD=1.34;SB=-10.00	GT:AD:DP:GL:GQ	0/1:16,14:3:-8.21,-0.90,-3.07:21.65
-chr1	2045667	.	C	T	56.78	SnpCluster	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=27.04;MQ=25.03;MQ0=2;QD=2.18;SB=-3.99	GT:AD:DP:GL:GQ	0/1:9,17:7:-11.07,-2.11,-11.53:89.62
-chr1	2045670	.	C	T	22.25	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=24.25;MQ=25.19;MQ0=1;QD=0.93;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,19:3:-6.41,-0.91,-3.37:24.66
-chr1	2045674	.	G	A	38.46	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=35.09;MQ=29.74;MQ0=1;QD=1.54;SB=-10.00	GT:AD:DP:GL:GQ	0/1:10,15:4:-8.34,-1.21,-6.59:53.87
-chr1	2045688	rs61776565	C	T	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=37.51;MQ=32.86;MQ0=0;OQ=472.91;QD=12.78;SB=-219.35	GT:AD:DP:GL:GQ	1/1:8,29:13:-50.88,-3.92,-0.00:39.13
-chr1	2045716	rs11589827	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=37.92;MQ=32.79;MQ0=0;OQ=1051.52;QD=19.47;SB=-363.54	GT:AD:DP:GL:GQ	0/1:22,32:36:-119.28,-10.85,-21.22:99
-chr1	2045975	rs56260599	A	G	8.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=2.17;MQ=48.30;MQ0=0;OQ=1370.04;QD=29.78;SB=-550.86	GT:AD:DP:GL:GQ	1/1:0,45:39:-140.61,-11.75,-0.02:99
-chr1	2047610	rs3107154	A	C	149.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.43;MQ0=0;OQ=1416.93;QD=32.20;SB=-509.01	GT:AD:DP:GL:GQ	1/1:0,44:41:-145.30,-12.35,-0.02:99
-chr1	2047883	rs3128291	A	G	544.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1311.92;QD=28.52;SB=-584.18	GT:AD:DP:GL:GQ	1/1:0,46:44:-134.83,-13.28,-0.06:99
-chr1	2050384	rs3107155	T	C	5.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=1.93;MQ=59.45;MQ0=0;OQ=1167.72;QD=27.80;SB=-528.96	GT:AD:DP:GL:GQ	1/1:0,42:38:-120.40,-11.47,-0.04:99
-chr1	2050490	rs3107156	T	C	249.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=60.00;MQ0=0;OQ=2021.38;QD=30.17;SB=-957.45	GT:AD:DP:GL:GQ	1/1:0,67:63:-205.77,-19.00,-0.05:99
-chr1	2050592	rs10797427	C	T	209.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=2020.11;QD=36.73;SB=-999.03	GT:AD:DP:GL:GQ	1/1:0,54:53:-205.62,-15.97,-0.03:99
-chr1	2051236	rs6603815	T	C	200	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.85;MQ0=0;OQ=2560.21;QD=35.07;SB=-874.04	GT:AD:DP:GL:GQ	1/1:0,73:73:-259.63,-21.99,-0.03:99
-chr1	2051829	rs3107157	T	C	631.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.47;MQ0=0;OQ=1661.55;QD=30.21;SB=-807.71	GT:AD:DP:GL:GQ	1/1:0,55:52:-169.78,-15.68,-0.04:99
-chr1	2053024	rs2222217	G	A	330.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.94;MQ0=0;OQ=1814.00;QD=39.43;SB=-879.02	GT:AD:DP:GL:GQ	1/1:0,46:46:-185.00,-13.86,-0.01:99
-chr1	2055199	rs3128293	A	G	0.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=4;HaplotypeScore=2.50;MQ=57.87;MQ0=0;OQ=714.48;QD=32.48;SB=-354.81	GT:AD:DP:GL:GQ	1/1:0,22:21:-75.04,-6.33,-0.01:63.18
-chr1	2055203	rs3128294	G	C	31.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=2.50;MQ=59.11;MQ0=0;OQ=958.73;QD=36.87;SB=-480.55	GT:AD:DP:GL:GQ	1/1:0,26:24:-99.47,-7.24,-0.01:72.23
-chr1	2056850	rs55958603	C	T	1.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=3.45;MQ=57.77;MQ0=0;OQ=633.04;QD=15.07;SB=-129.09	GT:AD:DP:GL:GQ	0/1:21,21:38:-78.03,-11.45,-68.95:99
-chr1	2058340	rs3128295	C	T	135.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=57.98;MQ0=0;OQ=1478.85;QD=33.61;SB=-754.65	GT:AD:DP:GL:GQ	1/1:0,43:39:-151.49,-11.75,-0.02:99
-chr1	2058766	rs3128296	G	T	62.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=59.52;MQ0=0;OQ=1387.47;QD=35.58;SB=-366.86	GT:AD:DP:GL:GQ	1/1:0,39:38:-142.34,-11.45,-0.01:99
-chr1	2060181	rs411021	T	C	39.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.62;MQ0=0;OQ=1893.37;QD=29.58;SB=-877.01	GT:AD:DP:GL:GQ	1/1:0,64:60:-192.98,-18.10,-0.06:99
-chr1	2061200	rs424079	C	A	282.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=59.70;MQ0=0;OQ=2061.38;QD=33.25;SB=-816.15	GT:AD:DP:GL:GQ	1/1:2,60:59:-209.75,-17.78,-0.03:99
-chr1	2061416	rs436045	A	G	341.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1852.88;QD=31.95;SB=-463.52	GT:AD:DP:GL:GQ	1/1:0,58:55:-188.90,-16.57,-0.02:99
-chr1	2061625	rs364677	A	G	92.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=2.94;MQ=57.88;MQ0=0;OQ=1754.29;QD=33.10;SB=-829.10	GT:AD:DP:GL:GQ	1/1:0,53:50:-179.03,-15.06,-0.02:99
-chr1	2062860	rs2945573	A	G	10.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=3.09;MQ=53.50;MQ0=0;OQ=1269.78;QD=34.32;SB=-473.51	GT:AD:DP:GL:GQ	1/1:0,37:36:-130.57,-10.84,-0.01:99
-chr1	2063413	rs643076	A	G	32.55	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=23.27;MQ0=4;QD=3.26;SB=-41.68	GT:AD:DP:GL:GQ	1/1:0,9:2:-6.66,-0.60,-0.00:6.02
-chr1	2063477	.	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=1;HaplotypeScore=9.72;MQ=34.90;MQ0=16;OQ=82.45;QD=1.04;SB=5.04	GT:AD:DP:GL:GQ	0/1:72,7:47:-25.69,-14.16,-141.31:99
-chr1	2063706	rs56038539	T	C	3.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=41.37;MQ0=1;OQ=139.38;QD=19.91;SB=-78.92	GT:AD:DP:GL:GQ	1/1:0,7:5:-17.50,-1.51,-0.00:15.04
-chr1	2068664	.	C	T	1.14	PASS	AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=1;HaplotypeScore=4.59;MQ=58.77;MQ0=0;OQ=1604.59;QD=18.44;SB=-789.85	GT:AD:DP:GL:GQ	0/1:40,47:84:-189.05,-25.30,-139.35:99
-chr1	2076421	rs2459983	A	G	9.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=6.88;MQ=57.31;MQ0=0;OQ=556.13;QD=9.43;SB=-262.92	GT:AD:DP:GL:GQ	0/1:36,23:54:-75.17,-16.28,-123.64:99
-chr1	2080370	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=7.10;MQ=51.87;MQ0=1;OQ=83.25;QD=1.63;SB=68.25	GT:AD:DP:GL:GQ	0/1:34,17:35:-22.19,-10.58,-111.66:99
-chr1	2084392	rs12132341	G	A	174.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.02;MQ=59.31;MQ0=0;OQ=863.52;QD=15.99;SB=-268.13	GT:AD:DP:GL:GQ	0/1:26,28:52:-105.30,-15.67,-88.61:99
-chr1	2089742	rs12137653	G	A	181.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.72;MQ=58.90;MQ0=0;OQ=1123.18;QD=19.04;SB=-544.82	GT:AD:DP:GL:GQ	0/1:23,36:56:-132.48,-16.88,-70.24:99
-chr1	2096700	rs12135175	T	C	69.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=484.58;QD=34.61;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,14:14:-52.05,-4.22,-0.00:42.13
-chr1	2096756	rs12135178	T	C	1.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=63.69;QD=21.23;SB=-45.69	GT:AD:DP:GL:GQ	1/1:0,3:3:-9.86,-0.91,-0.00:9.02
-chr1	2097150	.	G	T	29.88	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=2;HaplotypeScore=4.60;MQ=59.01;MQ0=0;QD=1.57;SB=20.09	GT:AD:DP:GL:GQ	0/1:12,7:13:-10.19,-3.92,-36.97:62.71
-chr1	2103132	.	T	G	33.73	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=2;HaplotypeScore=13.23;MQ=58.26;MQ0=0;QD=0.50;SB=77.26	GT:AD:DP:GL:GQ	0/1:40,27:45:-20.22,-13.56,-132.60:66.56
-chr1	2103519	.	T	G	34.88	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=1;HaplotypeScore=24.16;MQ=56.69;MQ0=0;QD=0.66;SB=65.20	GT:AD:DP:GL:GQ	0/1:32,21:34:-17.01,-10.24,-99.26:67.71
-chr1	2110321	rs12145923	A	C	0.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=12.44;MQ=52.00;MQ0=0;OQ=558.55;QD=9.01;SB=-276.83	GT:AD:DP:GL:GQ	0/1:36,25:56:-76.01,-16.87,-110.27:99
-chr1	2119788	.	T	C	18.51	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=3;HaplotypeScore=2.86;MQ=58.76;MQ0=0;QD=0.33;SB=56.21	GT:AD:DP:GL:GQ	0/1:41,15:42:-17.79,-12.66,-139.27:51.28
-chr1	2129255	.	C	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=12.54;MQ=53.09;MQ0=0;OQ=134.48;QD=3.96;SB=-44.78	GT:AD:DP:GL:GQ	0/1:28,6:25:-24.27,-7.54,-83.09:99
-chr1	2130727	.	C	A	3.24	PASS	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=883.89;QD=21.05;SB=-232.51	GT:AD:DP:GL:GQ	0/1:13,29:42:-104.32,-12.65,-47.37:99
-chr1	2133967	rs2503715	A	G	158.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=60.00;MQ0=0;OQ=295.10;QD=12.30;SB=-168.37	GT:AD:DP:GL:GQ	0/1:13,11:24:-40.02,-7.23,-52.87:99
-chr1	2146787	.	G	T	26.55	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=20;HaplotypeScore=12.86;MQ=49.19;MQ0=1;QD=0.48;SB=62.22	GT:AD:DP:GL:GQ	0/1:43,12:38:-17.39,-11.45,-117.88:59.38
-chr1	2157661	.	T	G	18.80	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=2;HaplotypeScore=22.82;MQ=58.47;MQ0=0;QD=0.32;SB=110.33	GT:AD:DP:GL:GQ	0/1:45,13:50:-20.22,-15.06,-154.85:51.58
-chr1	2158219	.	G	A	102.84	PASS	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=58.11;MQ0=0;OQ=732.58;QD=15.59;SB=-362.51	GT:AD:DP:GL:GQ	0/1:23,24:45:-90.10,-13.56,-76.34:99
-chr1	2159397	.	G	A	168.87	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=557.34;QD=13.59;SB=-169.24	GT:AD:DP:GL:GQ	0/1:23,18:39:-70.77,-11.75,-72.68:99
-chr1	2162698	rs55996607	T	A	417.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=618.41;QD=12.13;SB=-230.72	GT:AD:DP:GL:GQ	0/1:28,23:50:-80.19,-15.06,-104.77:99
-chr1	2164572	rs263525	T	C	240.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.18;MQ=58.19;MQ0=0;OQ=1470.94;QD=30.02;SB=-709.84	GT:AD:DP:GL:GQ	1/1:0,49:48:-150.72,-14.48,-0.04:99
-chr1	2166877	rs4648817	C	T	227.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=42.45;MQ0=0;OQ=888.81;QD=15.06;SB=-258.26	GT:AD:DP:GL:GQ	0/1:29,28:53:-108.14,-15.97,-85.30:99
-chr1	2167087	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=78;Dels=0.03;HRun=20;HaplotypeScore=33.19;MQ=45.08;MQ0=3;OQ=60.74;QD=0.78;SB=86.28	GT:AD:DP:GL:GQ	0/1:57,18:48:-23.51,-14.16,-146.86:93.57
-chr1	2172859	rs55827021	G	A	215.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=60.00;MQ0=0;OQ=711.82;QD=15.47;SB=-343.87	GT:AD:DP:GL:GQ	0/1:21,25:42:-87.13,-12.66,-66.29:99
-chr1	2181828	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=69;Dels=0.01;HRun=5;HaplotypeScore=57.83;MQ=51.68;MQ0=2;OQ=160.28;QD=2.32;SB=74.25	GT:AD:DP:GL:GQ	0/1:46,21:51:-34.38,-15.07,-143.28:99
-chr1	2181834	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=20;HaplotypeScore=10.75;MQ=49.92;MQ0=3;OQ=651.07;QD=8.57;SB=86.24	GT:AD:DP:GL:GQ	0/1:47,28:67:-88.59,-20.20,-142.58:99
-chr1	2190201	rs4648625	G	T	81.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=2.89;MQ=59.03;MQ0=0;OQ=1500.00;QD=34.88;SB=-738.07	GT:AD:DP:GL:GQ	1/1:0,43:43:-153.60,-12.95,-0.02:99
-chr1	2194650	rs4648819	G	A	133.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=743.48;QD=16.52;SB=-314.80	GT:AD:DP:GL:GQ	0/1:22,23:44:-90.89,-13.26,-76.95:99
-chr1	2200056	rs55778641	A	C	21.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=4.74;MQ=60.00;MQ0=0;OQ=608.53;QD=12.95;SB=-87.63	GT:AD:DP:GL:GQ	0/1:21,26:44:-77.39,-13.25,-77.32:99
-chr1	2201955	.	C	T	11.73	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=16.61;MQ=30.48;MQ0=8;QD=0.49;SB=-3.98	GT:AD:DP:GL:GQ	0/1:18,6:8:-6.84,-2.41,-19.02:44.27
-chr1	2202003	.	A	G	11.74	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=1;HaplotypeScore=7.13;MQ=18.21;MQ0=12;QD=0.30;SB=-3.98	GT:AD:DP:GL:GQ	0/1:31,8:9:-7.14,-2.71,-26.71:44.28
-chr1	2202019	.	C	A	24.05	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=18.13;MQ0=6;QD=1.05;SB=-6.99	GT:AD:DP:GL:GQ	0/1:15,8:6:-7.50,-1.81,-11.06:56.87
-chr1	2202047	.	A	G	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=1;HaplotypeScore=10.59;MQ=18.96;MQ0=8;OQ=148.17;QD=5.93;SB=-3.98	GT:AD:DP:GL:GQ	0/1:17,8:9:-20.81,-2.71,-12.59:98.81
-chr1	2202060	.	C	T	1.87	PASS	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=3.16;MQ=16.70;MQ0=15;OQ=178.09;QD=5.94;SB=-4.00	GT:AD:DP:GL:GQ	0/1:17,12:9:-23.81,-2.71,-8.44:57.22
-chr1	2202081	.	C	T	18.49	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=39;Dels=0.03;HRun=0;HaplotypeScore=43.99;MQ=16.84;MQ0=21;QD=0.47;SB=-6.99	GT:AD:DP:GL:GQ	0/1:31,7:8:-7.54,-2.41,-18.75:51.27
-chr1	2202085	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=40;Dels=0.03;HRun=0;HaplotypeScore=35.15;MQ=14.59;MQ0=24;OQ=74.01;QD=1.85;SB=-48.55	GT:AD:DP:GL:GQ	0/1:30,9:6:-12.50,-1.81,-8.79:69.79
-chr1	2202103	.	C	T	23.47	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=12.67;MQ=15.94;MQ0=20;QD=0.57;SB=-6.99	GT:AD:DP:GL:GQ	0/1:31,9:7:-7.74,-2.11,-15.15:56.28
-chr1	2202167	.	C	A	13.22	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=1;HaplotypeScore=11.12;MQ=8.91;MQ0=36;QD=0.22;SB=-10.00	GT:AD:DP:GL:GQ	0/1:51,9:4:-5.79,-1.21,-5.41:41.98
-chr1	2202296	.	C	A	18.94	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=1;HaplotypeScore=9.91;MQ=10.32;MQ0=37;QD=0.39;SB=-10.00	GT:AD:DP:GL:GQ	0/1:36,13:6:-6.98,-1.81,-13.53:51.72
-chr1	2202348	.	A	G	10.17	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=23.55;MQ=13.35;MQ0=40;QD=0.15;SB=-25.65	GT:AD:DP:GL:GQ	0/1:57,8:7:-6.37,-2.11,-18.82:42.57
-chr1	2202364	.	C	T	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=20.33;MQ0=13;OQ=62.56;QD=1.49;SB=-32.09	GT:AD:DP:GL:GQ	0/1:34,6:7:-15.23,-5.69,-14.13:84.42
-chr1	2202391	.	A	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=5.05;MQ=22.23;MQ0=9;OQ=175.98;QD=4.09;SB=-54.84	GT:AD:DP:GL:GQ	0/1:26,17:18:-26.30,-5.42,-41.13:99
-chr1	2202434	.	A	G	21.78	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=15.47;MQ=13.87;MQ0=17;QD=0.81;SB=-34.93	GT:AD:DP:GL:GQ	0/1:19,8:5:-6.97,-1.51,-11.89:54.59
-chr1	2202602	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=59.56;MQ=10.62;MQ0=43;OQ=145.43;QD=2.24;SB=-6.99	GT:AD:DP:GL:GQ	0/1:30,35:7:-19.94,-2.11,-6.77:46.57
-chr1	2202632	.	G	T	82.62	HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=11.21;MQ0=49;QD=1.18;SB=-10.00	GT:AD:DP:GL:GQ	0/1:61,9:9:-14.26,-2.71,-18.59:99
-chr1	2202667	.	A	C	16.33	DPFilter;HARD_TO_VALIDATE;Indel;LowQual	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=25.34;MQ=10.07;MQ0=49;QD=0.22;SB=8.05	GT:AD:DP:GL:GQ	0/1:64,9:8:-7.32,-2.41,-22.67:49.06
-chr1	2202682	.	G	A	36.23	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=78.01;MQ=9.70;MQ0=44;QD=0.48;SB=-3.98	GT:AD:DP:GL:GQ	0/1:63,12:4:-8.11,-1.20,-7.39:61.88
-chr1	2202686	.	G	A	35.24	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=79.87;MQ=9.88;MQ0=42;QD=0.50;SB=-3.99	GT:AD:DP:GL:GQ	0/1:59,12:4:-8.01,-1.21,-5.99:47.86
-chr1	2202707	.	C	T	38.48	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=10.09;MQ=9.21;MQ0=26;QD=0.82;SB=-10.00	GT:AD:DP:GL:GQ	0/1:44,3:4:-8.34,-1.21,-5.59:43.85
-chr1	2202728	.	T	C	26.83	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=9.84;MQ=8.94;MQ0=16;QD=1.07;SB=-10.00	GT:AD:DP:GL:GQ	1/1:12,12:2:-6.09,-0.60,-0.00:6.01
-chr1	2202823	.	G	A	38.25	LowQual	AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=1;HaplotypeScore=5.28;MQ=19.51;MQ0=2;QD=3.82;SB=-10.00	GT:AD:DP:GL:GQ	0/1:2,8:3:-8.01,-0.90,-3.57:26.65
-chr1	2203054	.	A	C	12.92	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=9.60;MQ0=26;QD=0.31;SB=-27.98	GT:AD:DP:GL:GQ	0/1:36,6:4:-5.76,-1.21,-6.84:45.53
-chr1	2203334	.	C	T	27.36	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=7.10;MQ=12.34;MQ0=21;QD=0.94;SB=-37.65	GT:AD:DP:GL:GQ	0/1:21,8:4:-7.23,-1.21,-5.77:45.59
-chr1	2203377	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=20.17;MQ=13.03;MQ0=22;OQ=140.31;QD=3.79;SB=-42.53	GT:AD:DP:GL:GQ	0/1:23,14:7:-19.42,-2.11,-7.14:50.30
-chr1	2203636	.	C	T	0.06	PASS	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=18.31;MQ0=12;OQ=75.25;QD=2.03;SB=-3.99	GT:AD:DP:GL:GQ	0/1:28,9:19:-16.53,-5.73,-47.88:99
-chr1	2203679	rs2643914	C	T	0.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=6.14;MQ=18.30;MQ0=12;OQ=93.96;QD=1.92;SB=-63.48	GT:AD:DP:GL:GQ	0/1:36,12:24:-19.91,-7.23,-64.90:99
-chr1	2203718	rs2645079	T	C	32.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.98;MQ0=8;OQ=123.75;QD=3.75;SB=-10.00	GT:AD:DP:GL:GQ	0/1:13,20:15:-20.18,-4.52,-29.86:99
-chr1	2203765	rs12117574	T	C	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=5.02;MQ=32.99;MQ0=11;OQ=133.28;QD=2.18;SB=-88.55	GT:AD:DP:GL:GQ	0/1:50,11:38:-28.07,-11.46,-111.19:99
-chr1	2204009	.	C	G	47.74	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=47.05;MQ0=0;OQ=366.61;QD=8.94;SB=-120.51	GT:AD:DP:GL:GQ	0/1:27,14:39:-51.71,-11.77,-108.96:99
-chr1	2206228	rs4648821	T	G	261.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=59.19;MQ0=0;OQ=657.01;QD=12.63;SB=-349.05	GT:AD:DP:GL:GQ	0/1:29,23:51:-84.34,-15.36,-102.93:99
-chr1	2206251	rs6689315	A	G	495.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.86;MQ0=0;OQ=794.59;QD=13.94;SB=-403.30	GT:AD:DP:GL:GQ	0/1:29,28:56:-99.61,-16.87,-113.15:99
-chr1	2206925	rs61759158	G	A	51.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=54.01;MQ0=0;OQ=371.96;QD=12.40;SB=-7.00	GT:AD:DP:GL:GQ	0/1:17,13:28:-48.92,-8.45,-48.51:99
-chr1	2207673	.	G	C	46.34	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=3;HaplotypeScore=11.90;MQ=55.68;MQ0=0;QD=1.03;SB=71.27	GT:AD:DP:GL:GQ	0/1:33,12:36:-18.77,-10.85,-141.59:79.18
-chr1	2207894	.	C	T	62.11	PASS	AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=0;HaplotypeScore=3.51;MQ=60.00;MQ0=0;OQ=1408.04;QD=16.96;SB=-562.41	GT:AD:DP:GL:GQ	0/1:38,45:79:-167.91,-23.82,-117.96:99
-chr1	2208688	rs10910049	G	T	213.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=47.61;MQ0=2;OQ=399.96;QD=8.89;SB=-196.49	GT:AD:DP:GL:GQ	0/1:28,17:40:-55.33,-12.05,-79.33:99
-chr1	2208825	rs6691983	C	T	81.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.59;MQ=52.03;MQ0=1;OQ=657.40;QD=17.30;SB=-233.73	GT:AD:DP:GL:GQ	0/1:18,20:35:-79.57,-10.55,-49.20:99
-chr1	2208828	rs6682474	G	A	54.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=3.33;MQ=53.40;MQ0=1;OQ=696.36;QD=18.33;SB=-278.18	GT:AD:DP:GL:GQ	0/1:17,21:37:-84.07,-11.15,-57.35:99
-chr1	2209299	rs56051051	T	G	55.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=58.49;MQ0=0;OQ=442.31;QD=9.41;SB=-244.75	GT:AD:DP:GL:GQ	0/1:22,25:42:-60.17,-12.66,-79.16:99
-chr1	2209740	rs17372827	A	C	232.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=877.78;QD=13.10;SB=-279.93	GT:AD:DP:GL:GQ	0/1:36,31:66:-110.94,-19.88,-129.70:99
-chr1	2209930	rs4648823	T	A	295.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=59.11;MQ0=0;OQ=697.00;QD=13.40;SB=-278.32	GT:AD:DP:GL:GQ	0/1:27,24:50:-88.05,-15.06,-97.62:99
-chr1	2210285	rs2643884	T	C	4	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=5.32;MQ=58.60;MQ0=0;OQ=1465.33;QD=29.31;SB=-698.59	GT:AD:DP:GL:GQ	1/1:0,50:47:-150.17,-14.18,-0.05:99
-chr1	2210377	rs1039065	A	C	393.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.65;MQ0=0;OQ=1107.46;QD=29.14;SB=-383.86	GT:AD:DP:GL:GQ	1/1:0,38:36:-114.37,-10.85,-0.04:99
-chr1	2210509	rs2017143	C	T	306.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.15;MQ0=0;OQ=1280.02;QD=38.79;SB=-395.53	GT:AD:DP:GL:GQ	1/1:0,33:33:-131.60,-9.94,-0.01:99
-chr1	2211082	rs2643885	A	C	289.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.73;MQ0=0;OQ=1017.95;QD=35.10;SB=-113.02	GT:AD:DP:GL:GQ	1/1:0,29:29:-105.39,-8.74,-0.01:87.26
-chr1	2211133	rs2843166	C	A	247.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.20;MQ0=0;OQ=767.67;QD=31.99;SB=-111.83	GT:AD:DP:GL:GQ	1/1:0,24:23:-80.36,-6.93,-0.01:69.19
-chr1	2211394	rs903924	A	G	577.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=1710.61;QD=33.54;SB=-819.09	GT:AD:DP:GL:GQ	1/1:0,51:49:-174.66,-14.76,-0.02:99
-chr1	2211494	rs903923	G	C	2.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=5.22;MQ=56.20;MQ0=0;OQ=1828.69;QD=36.57;SB=-846.47	GT:AD:DP:GL:GQ	1/1:0,50:45:-186.48,-13.57,-0.02:99
-chr1	2211496	rs903922	A	T	57.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.95;MQ=56.42;MQ0=0;OQ=1691.54;QD=31.92;SB=-801.63	GT:AD:DP:GL:GQ	1/1:0,53:49:-172.77,-14.77,-0.03:99
-chr1	2211936	rs903921	G	A	86.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=57.20;MQ0=0;OQ=1373.97;QD=32.71;SB=-609.72	GT:AD:DP:GL:GQ	1/1:1,40:39:-143.60,-11.76,-2.62:91.42
-chr1	2212420	rs903920	A	G	98.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.39;MQ0=0;OQ=1274.47;QD=33.54;SB=-555.35	GT:AD:DP:GL:GQ	1/1:0,38:37:-131.05,-11.15,-0.02:99
-chr1	2212443	rs903919	T	C	439.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=897.63;QD=27.20;SB=-373.47	GT:AD:DP:GL:GQ	1/1:0,33:30:-93.38,-9.05,-0.03:90.19
-chr1	2212983	rs2172900	T	C	377	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1306.72;QD=32.67;SB=-161.75	GT:AD:DP:GL:GQ	1/1:0,40:40:-134.28,-12.05,-0.02:99
-chr1	2213118	rs2132303	T	C	18.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.55;MQ0=0;OQ=1347.55;QD=32.08;SB=-116.87	GT:AD:DP:GL:GQ	1/1:0,41:39:-138.35,-11.75,-0.01:99
-chr1	2214142	rs903617	A	G	32.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=2.29;MQ=58.97;MQ0=0;OQ=1261.61;QD=28.04;SB=-567.89	GT:AD:DP:GL:GQ	1/1:0,45:41:-129.80,-12.38,-0.05:99
-chr1	2214469	rs2643886	T	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=5;HaplotypeScore=4.66;MQ=57.70;MQ0=0;OQ=1258.31;QD=26.77;SB=-451.03	GT:AD:DP:GL:GQ	1/1:1,46:38:-129.44,-11.45,-0.02:99
-chr1	2214505	rs2645091	A	G	160.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=58.58;MQ0=0;OQ=1430.84;QD=31.11;SB=-424.25	GT:AD:DP:GL:GQ	1/1:0,46:44:-146.70,-13.26,-0.03:99
-chr1	2214736	rs10910050	A	C	929.01	Indel	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=9;HaplotypeScore=4.06;MQ=59.20;MQ0=0;QD=27.32;SB=-435.82	GT:AD:DP:GL:GQ	1/1:1,33:28:-96.50,-8.43,-0.01:84.23
-chr1	2215144	rs1532385	G	A	183.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=59.56;MQ0=0;OQ=1969.69;QD=37.88;SB=-987.83	GT:AD:DP:GL:GQ	1/1:1,51:50:-200.57,-15.06,-0.01:99
-chr1	2216193	rs903918	T	A	121.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.63;MQ=60.00;MQ0=0;OQ=1515.17;QD=34.44;SB=-696.39	GT:AD:DP:GL:GQ	1/1:0,44:41:-155.11,-12.35,-0.01:99
-chr1	2216414	.	T	G	45.79	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=2;HaplotypeScore=10.58;MQ=58.61;MQ0=0;QD=0.68;SB=86.26	GT:AD:DP:GL:GQ	0/1:37,30:42:-20.52,-12.66,-118.85:78.63
-chr1	2217282	rs2843163	C	T	190.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=4.18;MQ=57.17;MQ0=0;OQ=844.33;QD=16.89;SB=-357.35	GT:AD:DP:GL:GQ	0/1:22,28:45:-101.28,-13.56,-64.72:99
-chr1	2217535	rs56117572	A	C	228.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=59.71;MQ0=0;OQ=819.93;QD=12.61;SB=-293.99	GT:AD:DP:GL:GQ	0/1:33,32:61:-103.65,-18.38,-105.35:99
-chr1	2219307	rs2643888	A	G	69.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=2.64;MQ=59.39;MQ0=0;OQ=1301.49;QD=34.25;SB=-624.24	GT:AD:DP:GL:GQ	1/1:0,38:38:-133.76,-11.45,-0.02:99
-chr1	2219413	rs2843161	C	T	101.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=1668.32;QD=37.92;SB=-845.15	GT:AD:DP:GL:GQ	1/1:0,44:43:-170.43,-12.96,-0.01:99
-chr1	2219777	.	C	T	48.76	PASS	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=3.44;MQ=59.45;MQ0=0;OQ=599.56;QD=14.28;SB=-283.32	GT:AD:DP:GL:GQ	0/1:19,21:37:-74.40,-11.16,-63.66:99
-chr1	2220425	rs56341331	C	G	57.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.43;MQ=59.52;MQ0=0;OQ=468.59;QD=12.02;SB=-132.55	GT:AD:DP:GL:GQ	0/1:23,16:35:-60.70,-10.56,-79.04:99
-chr1	2221427	rs1809823	G	T	87.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=59.54;MQ0=0;OQ=673.61;QD=16.43;SB=-228.53	GT:AD:DP:GL:GQ	0/1:18,23:40:-82.70,-12.05,-57.34:99
-chr1	2221826	rs55710545	G	C	290.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.48;MQ0=0;OQ=503.65;QD=11.45;SB=-276.95	GT:AD:DP:GL:GQ	0/1:26,18:42:-66.31,-12.67,-107.95:99
-chr1	2223172	rs903618	A	G	139.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=1447.93;QD=30.17;SB=-664.81	GT:AD:DP:GL:GQ	1/1:0,48:47:-148.43,-14.18,-0.05:99
-chr1	2224111	rs1496555	A	G	103.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=57.88;MQ0=0;OQ=1360.32;QD=32.39;SB=-504.48	GT:AD:DP:GL:GQ	1/1:0,42:39:-139.63,-11.75,-0.01:99
-chr1	2224763	rs2256178	C	T	433.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.54;MQ0=0;OQ=665.60;QD=16.23;SB=-342.52	GT:AD:DP:GL:GQ	0/1:20,21:41:-82.21,-12.37,-61.19:99
-chr1	2225516	rs11577387	G	A	98.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=58.87;MQ0=0;OQ=626.11;QD=16.92;SB=-209.93	GT:AD:DP:GL:GQ	0/1:17,20:32:-75.54,-9.65,-40.72:99
-chr1	2226199	rs4648825	T	C	63.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=3.65;MQ=59.17;MQ0=0;OQ=999.95;QD=17.24;SB=-492.13	GT:AD:DP:GL:GQ	0/1:22,36:55:-119.85,-16.57,-85.50:99
-chr1	2226557	rs2643904	A	G	112.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.91;MQ=59.50;MQ0=0;OQ=1489.85;QD=32.39;SB=-771.11	GT:AD:DP:GL:GQ	1/1:0,46:44:-152.59,-13.26,-0.02:99
-chr1	2226618	rs2843158	G	C	77.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=1399.75;QD=34.99;SB=-297.26	GT:AD:DP:GL:GQ	1/1:0,40:37:-143.60,-11.18,-0.04:99
-chr1	2227108	rs11580302	A	G	15.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=4.17;MQ=58.99;MQ0=0;OQ=1313.96;QD=28.56;SB=-483.14	GT:AD:DP:GL:GQ	1/1:0,46:42:-135.02,-12.67,-0.04:99
-chr1	2228420	.	T	C	34.45	PASS	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.20;MQ0=0;OQ=345.13;QD=11.90;SB=-158.70	GT:AD:DP:GL:GQ	0/1:16,13:29:-46.53,-8.74,-63.45:99
-chr1	2229866	rs2173049	T	C	234.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.01;MQ0=0;OQ=1791.17;QD=29.36;SB=-845.65	GT:AD:DP:GL:GQ	1/1:0,60:57:-182.75,-17.19,-0.05:99
-chr1	2230243	rs2843157	C	T	3.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=2;HaplotypeScore=5.43;MQ=58.16;MQ0=0;OQ=293.03;QD=7.71;SB=-52.03	GT:AD:DP:GL:GQ	0/1:21,15:25:-40.13,-7.54,-43.56:99
-chr1	2233378	rs2843156	C	T	2.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=59.97;MQ0=0;OQ=1676.83;QD=39.00;SB=-476.64	GT:AD:DP:GL:GQ	1/1:0,43:42:-171.28,-12.65,-0.01:99
-chr1	2234765	rs2843154	C	T	245.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.42;MQ0=0;OQ=364.59;QD=11.39;SB=-94.60	GT:AD:DP:GL:GQ	0/1:19,13:29:-48.48,-8.74,-59.24:99
-chr1	2235081	rs2843153	C	T	158.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.00;MQ0=0;OQ=1550.87;QD=36.93;SB=-657.38	GT:AD:DP:GL:GQ	1/1:0,42:40:-158.69,-12.05,-0.01:99
-chr1	2235299	rs2643902	T	C	83.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=58.80;MQ0=0;OQ=1694.87;QD=26.90;SB=-805.69	GT:AD:DP:GL:GQ	1/1:0,63:54:-173.12,-16.28,-0.05:99
-chr1	2235430	rs2843152	C	G	36.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.38;MQ0=0;OQ=1353.71;QD=36.59;SB=-455.86	GT:AD:DP:GL:GQ	1/1:0,37:35:-138.99,-10.57,-0.03:99
-chr1	2235493	rs2843151	C	T	341.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=1519.57;QD=37.99;SB=-552.74	GT:AD:DP:GL:GQ	1/1:0,40:39:-155.55,-11.75,-0.01:99
-chr1	2237259	rs2643903	T	C	68.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.78;MQ0=0;OQ=1099.17;QD=28.93;SB=-371.38	GT:AD:DP:GL:GQ	1/1:0,38:35:-113.53,-10.55,-0.03:99
-chr1	2237347	rs2645076	A	G	8.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=892.74;QD=27.90;SB=-347.40	GT:AD:DP:GL:GQ	1/1:0,32:29:-92.89,-8.75,-0.03:87.17
-chr1	2237604	rs2843150	G	C	105.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.39;MQ0=0;OQ=929.83;QD=32.06;SB=-483.10	GT:AD:DP:GL:GQ	1/1:0,29:23:-96.58,-6.93,-0.01:69.23
-chr1	2237845	rs2643905	T	C	349.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=1229.58;QD=32.36;SB=-467.52	GT:AD:DP:GL:GQ	1/1:0,38:37:-126.56,-11.15,-0.02:99
-chr1	2238243	rs60565777	G	T	1452.57	Indel	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.48;MQ0=0;QD=34.58;SB=-671.66	GT:AD:DP:GL:GQ	1/1:0,42:42:-148.86,-12.66,-0.02:99
-chr1	2238484	rs12035836	A	C	189.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.53;MQ0=0;OQ=471.85;QD=11.80;SB=-205.81	GT:AD:DP:GL:GQ	0/1:20,20:36:-61.31,-10.85,-64.85:99
-chr1	2239096	rs2645077	G	A	27.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=2;HaplotypeScore=1.28;MQ=59.32;MQ0=0;OQ=1136.46;QD=33.43;SB=-382.99	GT:AD:DP:GL:GQ	1/1:0,33:31:-117.25,-9.35,-0.02:93.28
-chr1	2241682	.	G	A	17.89	PASS	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=4.02;MQ=57.94;MQ0=0;OQ=417.19;QD=12.27;SB=-164.16	GT:AD:DP:GL:GQ	0/1:17,17:31:-54.36,-9.35,-49.53:99
-chr1	2243754	rs56393204	G	A	58.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=58.84;MQ0=0;OQ=282.27;QD=14.11;SB=-81.31	GT:AD:DP:GL:GQ	0/1:7,11:14:-35.73,-4.22,-15.87:99
-chr1	2244770	rs2645075	T	C	149.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.02;MQ0=0;OQ=1276.49;QD=27.75;SB=-655.75	GT:AD:DP:GL:GQ	1/1:0,46:42:-131.28,-12.68,-0.05:99
-chr1	2245871	rs2645074	A	G	281.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.11;MQ0=0;OQ=516.48;QD=10.99;SB=-220.38	GT:AD:DP:GL:GQ	0/1:24,23:43:-67.90,-12.97,-87.14:99
-chr1	2246105	rs2843148	A	T	522.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.70;MQ0=0;OQ=1342.05;QD=33.55;SB=-593.22	GT:AD:DP:GL:GQ	1/1:0,40:36:-137.80,-10.84,-0.01:99
-chr1	2246150	.	C	T	22.21	PASS	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=51.90;MQ0=0;OQ=477.24;QD=15.39;SB=-219.23	GT:AD:DP:GL:GQ	0/1:15,16:26:-58.85,-7.84,-34.36:99
-chr1	2246331	.	T	A	1.20	PASS	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=56.18;MQ0=0;OQ=642.82;QD=20.09;SB=-121.93	GT:AD:DP:GL:GQ	0/1:11,21:32:-77.21,-9.64,-40.89:99
-chr1	2246422	.	C	T	17.03	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=2;HaplotypeScore=46.69;MQ=32.60;MQ0=2;QD=0.46;SB=17.08	GT:AD:DP:GL:GQ	0/1:33,4:25:-12.51,-7.53,-79.77:49.78
-chr1	2246424	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=2;HaplotypeScore=54.85;MQ=32.43;MQ0=2;OQ=173.30;QD=4.56;SB=-18.60	GT:AD:DP:GL:GQ	0/1:26,12:25:-28.15,-7.53,-68.25:99
-chr1	2246439	rs9725291	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=64.95;MQ=33.89;MQ0=1;OQ=86.92;QD=2.12;SB=-39.19	GT:AD:DP:GL:GQ	0/1:33,8:25:-19.51,-7.53,-71.60:99
-chr1	2246445	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=1;HaplotypeScore=48.09;MQ=35.48;MQ0=0;OQ=216.97;QD=4.82;SB=-10.56	GT:AD:DP:GL:GQ	0/1:34,11:29:-33.72,-8.74,-70.74:99
-chr1	2246456	.	C	T	34.43	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=27.71;MQ=37.83;MQ0=0;QD=0.69;SB=1.58	GT:AD:DP:GL:GQ	0/1:43,7:33:-16.67,-9.94,-103.65:67.27
-chr1	2246469	.	T	C	28.75	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=49;Dels=0.02;HRun=2;HaplotypeScore=77.34;MQ=40.72;MQ0=0;QD=0.59;SB=44.16	GT:AD:DP:GL:GQ	0/1:38,10:28:-14.30,-8.14,-89.44:61.58
-chr1	2246471	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=2;HaplotypeScore=72.35;MQ=42.43;MQ0=0;OQ=76.08;QD=1.58;SB=-6.17	GT:AD:DP:GL:GQ	0/1:36,12:29:-19.64,-8.74,-87.84:99
-chr1	2246484	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=2;HaplotypeScore=51.65;MQ=47.04;MQ0=0;OQ=81.71;QD=2.15;SB=50.19	GT:AD:DP:GL:GQ	0/1:29,8:26:-19.29,-7.83,-83.08:99
-chr1	2246793	.	G	A	5.64	PASS	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=3.91;MQ=55.18;MQ0=1;OQ=1074.55;QD=18.53;SB=-560.61	GT:AD:DP:GL:GQ	0/1:23,35:54:-127.01,-16.27,-81.39:99
-chr1	2247067	rs35006635	C	A	47.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.81;MQ0=0;OQ=1074.59;QD=21.07;SB=-429.40	GT:AD:DP:GL:GQ	1/1:0,28:51:-197.40,-96.91,-86.36:99
-chr1	2247213	rs12566205	C	T	241.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=57.90;MQ0=0;OQ=759.24;QD=13.09;SB=-368.12	GT:AD:DP:GL:GQ	0/1:33,25:57:-96.39,-17.18,-106.07:99
-chr1	2247351	rs2643892	C	T	241.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.94;MQ0=0;OQ=665.97;QD=19.59;SB=-340.91	GT:AD:DP:GL:GQ	0/1:14,20:33:-79.82,-9.94,-42.88:99
-chr1	2247555	rs10910051	G	A	197.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=4.80;MQ=58.86;MQ0=0;OQ=1049.52;QD=16.15;SB=-447.98	GT:AD:DP:GL:GQ	0/1:31,34:61:-126.63,-18.39,-90.57:99
-chr1	2247587	rs2643893	C	T	300.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=58.44;MQ0=0;OQ=2112.94;QD=35.22;SB=-1052.32	GT:AD:DP:GL:GQ	1/1:0,60:56:-214.91,-16.88,-0.03:99
-chr1	2247723	rs2645092	C	T	700.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.71;MQ0=0;OQ=2085.22;QD=38.62;SB=-998.04	GT:AD:DP:GL:GQ	1/1:0,54:53:-212.12,-15.97,-0.01:99
-chr1	2247791	rs2645093	G	A	189.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=60.00;MQ0=0;OQ=700.42;QD=15.92;SB=-289.76	GT:AD:DP:GL:GQ	0/1:22,22:42:-85.99,-12.66,-67.45:99
-chr1	2248183	rs2643894	C	T	135.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.68;MQ=57.95;MQ0=0;OQ=1940.09;QD=35.27;SB=-797.32	GT:AD:DP:GL:GQ	1/1:0,55:52:-197.62,-15.67,-0.03:99
-chr1	2248333	rs2643895	G	A	408.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=2697.00;QD=39.09;SB=-1222.14	GT:AD:DP:GL:GQ	1/1:0,69:68:-273.30,-20.48,-0.02:99
-chr1	2248552	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.80;MQ=51.38;MQ0=0;OQ=50.72;QD=0.83;SB=23.47	GT:AD:DP:GL:GQ	0/1:53,7:56:-28.20,-19.84,-214.64:83.56
-chr1	2248554	.	G	A	35.21	LowQual	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=3;HaplotypeScore=5.80;MQ=51.10;MQ0=0;QD=0.57;SB=-8.06	GT:AD:DP:GL:GQ	0/1:56,6:58:-24.27,-17.47,-188.51:68.04
-chr1	2248658	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=56.92;MQ0=0;OQ=60.63;QD=0.88;SB=6.91	GT:AD:DP:GL:GQ	0/1:61,8:68:-29.84,-20.49,-240.21:93.47
-chr1	2249886	.	C	T	54.96	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=-0.12;MQ=60.00;MQ0=0;OQ=750.55;QD=14.72;SB=-348.88	GT:AD:DP:GL:GQ	0/1:25,26:44:-91.61,-13.27,-61.40:99
-chr1	2249910	rs2645063	G	A	24.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=5.82;MQ=59.50;MQ0=0;OQ=758.18;QD=16.48;SB=-336.52	GT:AD:DP:GL:GQ	0/1:22,24:45:-92.67,-13.57,-67.35:99
-chr1	2250405	rs2645064	G	A	151.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=58.71;MQ0=0;OQ=569.60;QD=15.82;SB=-242.53	GT:AD:DP:GL:GQ	0/1:16,20:34:-70.49,-10.25,-54.37:99
-chr1	2251037	rs35273536	C	T	60.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=4.05;MQ=58.82;MQ0=0;OQ=1072.47;QD=18.18;SB=-334.93	GT:AD:DP:GL:GQ	0/1:24,34:52:-128.89,-18.36,-63.36:99
-chr1	2253264	.	T	C	16.56	Indel;LowQual	AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=51.77;MQ0=0;QD=2.76;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,2:6:-6.74,-1.81,-16.62:49.30
-chr1	2253282	.	C	G	16.92	PASS	AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=51.16;MQ0=0;OQ=118.58;QD=9.88;SB=-10.00	GT:AD:DP:GL:GQ	0/1:6,6:11:-18.46,-3.32,-24.69:99
-chr1	2253362	rs12752072	T	C	172.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=253.44;QD=12.07;SB=-10.00	GT:AD:DP:GL:GQ	0/1:10,11:21:-34.96,-6.33,-38.76:99
-chr1	2254886	rs2645066	G	A	78.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=5.62;MQ=59.17;MQ0=0;OQ=893.72;QD=15.96;SB=-436.47	GT:AD:DP:GL:GQ	0/1:25,31:52:-108.33,-15.67,-85.72:99
-chr1	2255036	rs2645067	T	C	87.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.60;MQ0=0;OQ=995.78;QD=33.19;SB=-523.42	GT:AD:DP:GL:GQ	1/1:0,30:29:-103.17,-8.74,-0.01:87.25
-chr1	2255079	rs2643898	C	T	28.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=5.95;MQ=59.03;MQ0=0;OQ=590.58;QD=13.73;SB=-262.25	GT:AD:DP:GL:GQ	0/1:23,20:42:-75.01,-12.66,-72.41:99
-chr1	2255654	rs7546567	G	A	132.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=58.73;MQ0=0;OQ=454.68;QD=13.78;SB=-126.36	GT:AD:DP:GL:GQ	0/1:16,16:32:-61.47,-12.72,-52.76:99
-chr1	2255829	rs2843146	T	G	0.05	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=5;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=441.34;QD=27.58;SB=-113.02	GT:AD:DP:GL:GQ	1/1:0,16:14:-47.73,-4.22,-0.01:42.10
-chr1	2255938	rs2643899	T	C	18.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=58.69;MQ0=0;OQ=756.05;QD=23.63;SB=-323.76	GT:AD:DP:GL:GQ	1/1:0,32:26:-79.22,-7.85,-0.03:78.14
-chr1	2256793	rs903905	C	T	99.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=58.29;MQ0=0;OQ=354.28;QD=16.10;SB=-192.21	GT:AD:DP:GL:GQ	0/1:10,12:21:-45.05,-6.33,-27.84:99
-chr1	2258430	rs12091632	A	G	318.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.32;MQ0=0;OQ=1030.69;QD=30.31;SB=-507.55	GT:AD:DP:GL:GQ	1/1:0,34:33:-106.69,-9.95,-0.03:99
-chr1	2258440	rs12085675	G	A	96.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.39;MQ0=0;OQ=1318.84;QD=34.71;SB=-520.68	GT:AD:DP:GL:GQ	1/1:0,37:35:-135.49,-10.55,-0.02:99
-chr1	2258510	rs28394874	C	G	5.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=4.06;MQ=57.77;MQ0=0;OQ=783.94;QD=18.67;SB=-330.90	GT:AD:DP:GL:GQ	0/1:17,25:36:-92.55,-10.88,-48.65:99
-chr1	2258528	rs35986070	A	G	102.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.27;MQ0=0;OQ=457.65;QD=16.95;SB=-106.83	GT:AD:DP:GL:GQ	0/1:11,16:27:-57.18,-8.13,-41.35:99
-chr1	2258538	rs2645069	T	C	177.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.13;MQ0=0;OQ=677.36;QD=27.09;SB=-198.05	GT:AD:DP:GL:GQ	1/1:0,25:23:-71.35,-6.94,-0.03:69.14
-chr1	2258598	rs2645070	A	G	16.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=60.00;MQ0=0;OQ=322.02;QD=18.94;SB=-156.34	GT:AD:DP:GL:GQ	0/1:4,13:17:-40.61,-5.13,-15.36:99
-chr1	2258651	rs2843145	A	G	4.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=3;HaplotypeScore=2.01;MQ=59.14;MQ0=0;OQ=426.64;QD=15.80;SB=-196.02	GT:AD:DP:GL:GQ	0/1:8,19:23:-52.88,-6.93,-31.12:99
-chr1	2258910	.	A	G	4.11	PASS	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=1;HaplotypeScore=4.17;MQ=58.13;MQ0=0;OQ=457.98;QD=13.09;SB=-246.31	GT:AD:DP:GL:GQ	0/1:17,18:33:-59.02,-9.94,-70.06:99
-chr1	2259759	rs2036085	T	C	103.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=626.01;QD=14.56;SB=-172.51	GT:AD:DP:GL:GQ	0/1:16,27:40:-77.94,-12.06,-63.91:99
-chr1	2259869	rs12734736	C	T	347.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=60.00;MQ0=0;OQ=965.34;QD=16.64;SB=-492.13	GT:AD:DP:GL:GQ	0/1:29,29:54:-116.09,-16.28,-80.58:99
-chr1	2259958	rs2843142	A	G	263.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=2.46;MQ=59.76;MQ0=0;OQ=1095.49;QD=13.87;SB=-502.48	GT:AD:DP:GL:GQ	0/1:40,39:78:-136.33,-23.50,-157.46:99
-chr1	2261724	rs2843141	C	T	591.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=1956.29;QD=36.91;SB=-863.62	GT:AD:DP:GL:GQ	1/1:0,53:52:-199.24,-15.68,-0.03:99
-chr1	2262086	rs1472318	C	T	44.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=57.36;MQ0=0;OQ=484.27;QD=19.37;SB=-215.23	GT:AD:DP:GL:GQ	0/1:8,16:22:-58.34,-6.63,-21.67:99
-chr1	2262763	rs2843139	A	G	28.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=0.87;MQ=58.77;MQ0=0;OQ=1612.91;QD=30.43;SB=-829.43	GT:AD:DP:GL:GQ	1/1:0,53:52:-164.94,-15.69,-0.06:99
-chr1	2262883	.	G	A	16	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=49.61;MQ0=5;QD=0.44;SB=-17.46	GT:AD:DP:GL:GQ	0/1:28,8:25:-12.42,-7.54,-69.64:48.73
-chr1	2263004	rs12730050	A	G	0.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=14.25;MQ=55.46;MQ0=1;OQ=1032.60;QD=11.35;SB=-477.87	GT:AD:DP:GL:GQ	0/1:51,40:84:-131.86,-25.32,-172.18:99
-chr1	2263146	rs2843138	T	C	3.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.02;HRun=0;HaplotypeScore=5.34;MQ=54.41;MQ0=0;OQ=1335.96;QD=29.04;SB=-625.83	GT:AD:DP:GL:GQ	1/1:0,44:44:-137.23,-12.97,-0.04:99
-chr1	2263291	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=4;HaplotypeScore=15.31;MQ=57.02;MQ0=0;OQ=65.39;QD=1.72;SB=65.25	GT:AD:DP:GL:GQ	0/1:31,7:33:-19.78,-9.96,-120.76:98.22
-chr1	2263292	.	A	G	14.86	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=3.96;MQ=57.52;MQ0=0;QD=0.41;SB=62.21	GT:AD:DP:GL:GQ	0/1:29,6:31:-14.10,-9.35,-99.44:47.55
-chr1	2263765	rs1472319	T	C	33.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=3.68;MQ=59.72;MQ0=0;OQ=1846.27;QD=27.56;SB=-842.46	GT:AD:DP:GL:GQ	1/1:0,67:60:-188.28,-18.10,-0.07:99
-chr1	2264170	rs12735747	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=4;HaplotypeScore=15.88;MQ=53.27;MQ0=1;OQ=600.98;QD=16.24;SB=-322.72	GT:AD:DP:GL:GQ	0/1:17,20:33:-73.32,-9.94,-46.93:99
-chr1	2264171	rs12740557	T	A	0.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=15.88;MQ=53.27;MQ0=1;OQ=596.15;QD=16.11;SB=-294.37	GT:AD:DP:GL:GQ	0/1:17,20:33:-72.84,-9.94,-48.77:99
-chr1	2264298	rs61288374	A	G	10.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=4.66;MQ=58.45;MQ0=0;OQ=219.39;QD=7.31;SB=-3.98	GT:AD:DP:GL:GQ	0/1:16,13:26:-33.06,-7.84,-58.70:99
-chr1	2264816	rs4648828	G	A	38.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.55;MQ=58.44;MQ0=0;OQ=661.80;QD=16.97;SB=-286.79	GT:AD:DP:GL:GQ	0/1:17,22:36:-80.32,-10.86,-47.76:99
-chr1	2264998	rs4648829	C	T	229.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.45;MQ0=0;OQ=171.83;QD=11.46;SB=-76.07	GT:AD:DP:GL:GQ	0/1:9,6:13:-24.38,-3.92,-22.89:99
-chr1	2265236	rs4648830	T	G	6.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=58.55;MQ0=0;OQ=452.22;QD=28.26;SB=-174.97	GT:AD:DP:GL:GQ	1/1:0,16:15:-48.82,-4.52,-0.01:45.09
-chr1	2265809	rs2643909	C	G	56	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=57.02;MQ0=0;OQ=1592.56;QD=34.62;SB=-562.49	GT:AD:DP:GL:GQ	1/1:0,46:39:-162.87,-11.76,-0.03:99
-chr1	2265882	.	G	A	8.69	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.87;MQ0=0;OQ=753.33;QD=18.37;SB=-247.76	GT:AD:DP:GL:GQ	0/1:17,24:37:-89.77,-11.15,-48.26:99
-chr1	2265933	.	T	C	0.10	PASS	AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=3;HaplotypeScore=2.25;MQ=58.59;MQ0=0;OQ=218.96;QD=6.64;SB=-11.87	GT:AD:DP:GL:GQ	0/1:21,12:30:-34.22,-9.04,-78.51:99
-chr1	2266056	rs11589063	C	A	17.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=3.57;MQ=58.25;MQ0=0;OQ=453.86;QD=11.35;SB=-250.27	GT:AD:DP:GL:GQ	0/1:23,17:40:-60.72,-12.05,-77.71:99
-chr1	2266060	rs2843137	T	A	278.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=57.66;MQ0=0;OQ=421.83;QD=10.55;SB=-226.71	GT:AD:DP:GL:GQ	0/1:23,17:37:-56.61,-11.15,-79.80:99
-chr1	2266231	rs11589451	C	A	57.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=5.26;MQ=58.41;MQ0=0;OQ=597.75;QD=10.67;SB=-255.49	GT:AD:DP:GL:GQ	0/1:32,24:50:-78.13,-15.07,-90.69:99
-chr1	2266279	rs11590175	A	G	185.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=59.15;MQ0=0;OQ=537.72;QD=10.97;SB=-262.22	GT:AD:DP:GL:GQ	0/1:22,25:41:-69.42,-12.37,-72.12:99
-chr1	2266621	.	G	A	34.89	PASS	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=3.35;MQ=59.21;MQ0=0;OQ=474.72;QD=13.56;SB=-211.70	GT:AD:DP:GL:GQ	0/1:17,18:29:-59.50,-8.75,-41.35:99
-chr1	2267026	.	G	A	47.30	PASS	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.99;MQ0=0;OQ=613.73;QD=16.59;SB=-254.78	GT:AD:DP:GL:GQ	0/1:17,20:34:-74.91,-10.25,-50.44:99
-chr1	2267073	.	T	C	188.99	PASS	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.75;MQ0=0;OQ=394.61;QD=9.87;SB=-211.55	GT:AD:DP:GL:GQ	0/1:22,18:38:-54.20,-11.45,-84.44:99
-chr1	2267410	rs61762093	G	C	176.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=3.35;MQ=56.22;MQ0=0;OQ=747.58;QD=15.26;SB=-308.18	GT:AD:DP:GL:GQ	0/1:27,22:44:-91.30,-13.26,-97.18:99
-chr1	2267687	rs2843134	G	A	624.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.67;MQ0=0;OQ=2217.24;QD=36.95;SB=-1015.91	GT:AD:DP:GL:GQ	1/1:0,60:58:-225.33,-17.48,-0.02:99
-chr1	2267975	rs12409523	G	C	1.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=5.47;MQ=59.03;MQ0=0;OQ=822.23;QD=17.13;SB=-209.63	GT:AD:DP:GL:GQ	0/1:24,24:46:-99.39,-13.88,-93.78:99
-chr1	2268100	rs2132595	C	T	240.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=58.35;MQ0=0;OQ=844.37;QD=16.56;SB=-387.19	GT:AD:DP:GL:GQ	0/1:23,28:47:-101.89,-14.17,-71.24:99
-chr1	2268508	rs2843133	A	G	0.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=4;HaplotypeScore=2.38;MQ=57.65;MQ0=0;OQ=995.04;QD=26.19;SB=-340.62	GT:AD:DP:GL:GQ	1/1:0,38:30:-103.10,-9.04,-0.01:90.24
-chr1	2268841	rs2643910	C	T	6.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=3.07;MQ=58.25;MQ0=0;OQ=784.65;QD=19.62;SB=-334.39	GT:AD:DP:GL:GQ	0/1:16,24:39:-93.50,-11.75,-52.91:99
-chr1	2269677	rs56030548	C	T	80.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=57.12;MQ0=0;OQ=443.83;QD=15.85;SB=-131.12	GT:AD:DP:GL:GQ	0/1:13,15:27:-55.80,-8.14,-42.23:99
-chr1	2269999	rs35941092	C	T	0.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=8.68;MQ=48.71;MQ0=0;OQ=64.58;QD=4.61;SB=-21.48	GT:AD:DP:GL:GQ	0/1:10,4:14:-13.97,-4.23,-30.76:97.42
-chr1	2270100	.	T	A	5.69	PASS	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=56.04;MQ0=0;OQ=92.13;QD=5.12;SB=-47.85	GT:AD:DP:GL:GQ	0/1:13,5:18:-17.92,-5.42,-46.07:99
-chr1	2270283	rs2645072	A	C	0.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=4;HaplotypeScore=0.16;MQ=56.22;MQ0=0;OQ=963.23;QD=33.21;SB=-173.01	GT:AD:DP:GL:GQ	1/1:0,29:28:-99.92,-8.44,-0.01:84.24
-chr1	2270521	rs2055204	G	A	60.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=3.82;MQ=59.66;MQ0=0;OQ=983.74;QD=17.89;SB=-468.43	GT:AD:DP:GL:GQ	0/1:22,33:52:-117.32,-15.67,-79.90:99
-chr1	2271586	rs7527871	A	C	436.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=784.91;QD=12.08;SB=-319.01	GT:AD:DP:GL:GQ	0/1:36,29:64:-101.05,-19.28,-130.62:99
-chr1	2271838	rs1039063	T	G	2.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=5;HaplotypeScore=1.22;MQ=60.00;MQ0=0;OQ=495.93;QD=11.27;SB=-259.90	GT:AD:DP:GL:GQ	0/1:22,22:41:-65.23,-12.35,-74.62:99
-chr1	2271995	rs10910053	G	A	269.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=60.00;MQ0=0;OQ=928.57;QD=18.95;SB=-437.81	GT:AD:DP:GL:GQ	0/1:20,29:47:-110.30,-14.16,-67.66:99
-chr1	2272064	.	G	A	22.07	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=4.67;MQ=59.48;MQ0=0;OQ=676.05;QD=15.36;SB=-356.51	GT:AD:DP:GL:GQ	0/1:22,22:42:-83.55,-12.66,-69.45:99
-chr1	2272233	.	C	T	4.84	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=3.42;MQ=59.14;MQ0=0;OQ=912.77;QD=16.90;SB=-354.47	GT:AD:DP:GL:GQ	0/1:26,28:53:-110.53,-15.96,-92.85:99
-chr1	2272335	.	T	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=2.06;MQ=56.98;MQ0=0;OQ=124.90;QD=3.20;SB=56.19	GT:AD:DP:GL:GQ	0/1:24,15:32:-25.41,-9.64,-85.35:99
-chr1	2272540	rs2279704	C	T	249.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=59.55;MQ0=0;OQ=742.26;QD=14.55;SB=-245.76	GT:AD:DP:GL:GQ	0/1:25,25:47:-91.67,-14.16,-87.05:99
-chr1	2272636	rs2254874	G	C	9.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=3.74;MQ=56.62;MQ0=0;OQ=1562.16;QD=37.19;SB=-628.86	GT:AD:DP:GL:GQ	1/1:0,42:38:-159.82,-11.46,-0.02:99
-chr1	2272850	rs2036082	C	T	429.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=669.32;QD=14.55;SB=-278.20	GT:AD:DP:GL:GQ	0/1:25,21:46:-84.08,-13.87,-81.55:99
-chr1	2273702	rs2643912	G	T	414.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=338.96;QD=15.41;SB=-195.57	GT:AD:DP:GL:GQ	0/1:9,13:21:-43.50,-6.33,-31.88:99
-chr1	2273756	rs2840528	A	G	171.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.44;MQ0=0;OQ=666.96;QD=16.27;SB=-294.48	GT:AD:DP:GL:GQ	0/1:18,23:41:-82.33,-12.35,-70.40:99
-chr1	2273863	rs2645082	T	C	3.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=2.08;MQ=58.41;MQ0=0;OQ=1044.33;QD=23.73;SB=-369.45	GT:AD:DP:GL:GQ	1/1:0,44:35:-108.06,-10.56,-0.04:99
-chr1	2274055	rs3795272	T	C	1.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=3;HaplotypeScore=4.58;MQ=58.20;MQ0=0;OQ=382.95;QD=8.15;SB=-128.51	GT:AD:DP:GL:GQ	0/1:28,19:44:-54.84,-13.26,-106.89:99
-chr1	2274346	rs12049067	C	T	357.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=57.77;MQ0=0;OQ=508.21;QD=12.71;SB=-252.25	GT:AD:DP:GL:GQ	0/1:22,18:38:-65.56,-11.45,-75.12:99
-chr1	2274758	rs2840529	T	G	24.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=3;HaplotypeScore=0.63;MQ=59.39;MQ0=0;OQ=311.73;QD=8.20;SB=-145.73	GT:AD:DP:GL:GQ	0/1:25,13:34:-44.70,-10.25,-72.81:99
-chr1	2275042	rs2036083	A	T	221.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.71;MQ=59.63;MQ0=0;OQ=509.88;QD=10.20;SB=-241.63	GT:AD:DP:GL:GQ	0/1:29,21:43:-67.22,-12.95,-90.87:99
-chr1	2275274	rs2843129	G	A	298.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.43;MQ0=0;OQ=2821.79;QD=38.65;SB=-1326.28	GT:AD:DP:GL:GQ	1/1:0,73:71:-285.78,-21.39,-0.02:99
-chr1	2276807	rs1039100	A	G	434.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1195.19;QD=31.45;SB=-467.43	GT:AD:DP:GL:GQ	1/1:0,38:36:-123.12,-10.85,-0.02:99
-chr1	2277377	rs2645083	T	C	625.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=1448.36;QD=34.48;SB=-607.22	GT:AD:DP:GL:GQ	1/1:0,42:42:-148.44,-12.65,-0.02:99
-chr1	2277394	rs11577374	C	T	128.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=58.95;MQ0=0;OQ=767.18;QD=17.44;SB=-322.88	GT:AD:DP:GL:GQ	0/1:20,24:40:-92.06,-12.06,-52.10:99
-chr1	2277476	rs2645085	T	C	300.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.58;MQ0=0;OQ=627.13;QD=11.40;SB=-216.37	GT:AD:DP:GL:GQ	0/1:27,28:51:-81.37,-15.38,-100.48:99
-chr1	2277708	rs16825067	G	C	15.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=3.52;MQ=58.92;MQ0=0;OQ=727.07;QD=18.64;SB=-379.89	GT:AD:DP:GL:GQ	0/1:17,22:37:-87.14,-11.15,-70.33:99
-chr1	2278607	rs2645086	T	C	275.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.11;MQ0=0;OQ=269.17;QD=10.35;SB=-101.72	GT:AD:DP:GL:GQ	0/1:13,13:25:-37.74,-7.54,-47.79:99
-chr1	2279110	rs903912	C	G	0.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=12.20;MQ=57.42;MQ0=0;OQ=679.10;QD=12.81;SB=-356.81	GT:AD:DP:GL:GQ	0/1:28,25:46:-85.06,-13.87,-109.25:99
-chr1	2279111	rs903913	T	C	0.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.02;HRun=1;HaplotypeScore=12.09;MQ=57.42;MQ0=0;OQ=643.89;QD=12.15;SB=-297.64	GT:AD:DP:GL:GQ	0/1:27,25:52:-83.04,-15.37,-108.03:99
-chr1	2279181	rs903914	G	A	327.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=59.27;MQ0=0;OQ=1113.86;QD=17.68;SB=-571.62	GT:AD:DP:GL:GQ	0/1:30,33:61:-133.06,-18.39,-88.20:99
-chr1	2280148	rs2840544	T	C	12.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=59.49;MQ0=0;OQ=176.15;QD=3.91;SB=-95.61	GT:AD:DP:GL:GQ	0/1:34,11:43:-33.87,-12.97,-121.04:99
-chr1	2280520	rs2645088	T	C	494.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=961.96;QD=28.29;SB=-437.29	GT:AD:DP:GL:GQ	1/1:0,34:31:-99.81,-9.35,-0.03:93.20
-chr1	2280750	rs2840543	C	T	201	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.69;MQ0=0;OQ=2174.81;QD=36.25;SB=-926.73	GT:AD:DP:GL:GQ	1/1:0,60:56:-221.09,-16.88,-0.02:99
-chr1	2280771	rs2645089	G	A	262.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.63;MQ0=0;OQ=676.44;QD=13.53;SB=-331.88	GT:AD:DP:GL:GQ	0/1:29,21:47:-85.09,-14.16,-84.51:99
-chr1	2281127	rs6424093	A	G	144.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.16;MQ0=0;OQ=492.45;QD=11.73;SB=-156.68	GT:AD:DP:GL:GQ	0/1:23,19:40:-64.58,-12.05,-85.73:99
-chr1	2281540	rs2840542	T	C	309.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=56.56;MQ0=0;OQ=2607.54;QD=33.86;SB=-1074.11	GT:AD:DP:GL:GQ	1/1:0,77:73:-264.36,-21.99,-0.02:99
-chr1	2282015	rs2840541	T	C	311.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.30;MQ0=0;OQ=585.20;QD=9.75;SB=-280.12	GT:AD:DP:GL:GQ	0/1:36,24:60:-79.89,-18.08,-145.26:99
-chr1	2282269	rs2645090	T	C	432.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=613.50;QD=9.16;SB=-290.16	GT:AD:DP:GL:GQ	0/1:38,29:64:-83.92,-19.29,-153.60:99
-chr1	2283026	rs2250799	G	A	138.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.62;MQ0=0;OQ=1864.73;QD=38.06;SB=-791.54	GT:AD:DP:GL:GQ	1/1:0,49:48:-190.08,-14.47,-0.02:99
-chr1	2284017	rs10797420	G	A	1.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=10.89;MQ=55.69;MQ0=1;OQ=1110.47;QD=17.63;SB=-493.05	GT:AD:DP:GL:GQ	0/1:28,34:55:-130.90,-16.57,-82.96:99
-chr1	2284704	rs55873848	C	T	485.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.27;MQ0=0;OQ=939.68;QD=16.78;SB=-471.48	GT:AD:DP:GL:GQ	0/1:26,30:53:-113.22,-15.97,-82.15:99
-chr1	2284890	rs7530501	T	G	19.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=5.02;MQ=57.51;MQ0=0;OQ=731.65;QD=13.80;SB=-124.84	GT:AD:DP:GL:GQ	0/1:25,28:51:-91.81,-15.36,-86.72:99
-chr1	2285068	rs57840322	G	A	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=6;HaplotypeScore=29.71;MQ=39.31;MQ0=0;OQ=1533.11;QD=35.65;SB=-660.69	GT:AD:DP:GL:GQ	1/1:0,43:40:-156.91,-12.05,-0.01:99
-chr1	2285112	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=42;Dels=0.05;HRun=7;HaplotypeScore=20.40;MQ=45.44;MQ0=0;OQ=661.72;QD=15.76;SB=-259.95	GT:AD:DP:GL:GQ	0/1:19,21:41:-81.21,-11.75,-63.70:99
-chr1	2285126	rs6682345	A	T	200.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=50.08;MQ0=0;OQ=1898.67;QD=35.16;SB=-880.24	GT:AD:DP:GL:GQ	1/1:1,53:53:-197.20,-15.96,-3.75:99
-chr1	2285128	rs6682346	A	T	359.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=50.28;MQ0=0;OQ=737.49;QD=13.41;SB=-376.75	GT:AD:DP:GL:GQ	0/1:30,25:55:-93.60,-16.56,-117.95:99
-chr1	2285638	rs10910055	A	C	76.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=3.44;MQ=49.97;MQ0=2;OQ=838.51;QD=11.65;SB=-398.65	GT:AD:DP:GL:GQ	0/1:39,33:60:-105.20,-18.07,-117.50:99
-chr1	2285783	rs12026746	C	T	166.61	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=27.98;MQ=27.61;MQ0=1;QD=3.54;SB=-10.00	GT:AD:DP:GL:GQ	0/1:32,15:30:-28.99,-9.05,-73.71:99
-chr1	2285784	.	A	G	712.90	SnpCluster	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=27.98;MQ=27.61;MQ0=1;QD=15.17;SB=-10.00	GT:AD:DP:GL:GQ	0/1:13,34:30:-83.61,-9.04,-20.49:99
-chr1	2285789	.	T	C	107.62	SnpCluster	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=51.95;MQ=27.67;MQ0=1;QD=2.20;SB=-10.00	GT:AD:DP:GL:GQ	0/1:37,12:31:-23.38,-9.34,-102.78:99
-chr1	2285797	.	C	T	99.87	SnpCluster	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=37.97;MQ=27.29;MQ0=3;QD=1.72;SB=-6.99	GT:AD:DP:GL:GQ	0/1:46,12:38:-24.73,-11.46,-107.35:99
-chr1	2285798	rs6685453	A	G	587.05	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=37.13;MQ=27.02;MQ0=4;QD=10.12;SB=-34.94	GT:AD:DP:GL:GQ	0/1:35,23:38:-73.44,-11.45,-64.40:99
-chr1	2285805	rs2840539	G	A	1277.62	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=29.98;MQ=27.32;MQ0=3;QD=21.65;SB=-159.63	GT:AD:DP:GL:GQ	0/1:13,46:41:-143.39,-12.35,-21.42:90.69
-chr1	2285956	rs7539098	A	T	36.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=32.84;MQ0=4;OQ=256.31;QD=4.93;SB=-97.36	GT:AD:DP:GL:GQ	0/1:30,22:31:-38.25,-9.34,-84.38:99
-chr1	2285957	rs7539099	A	T	39.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=32.84;MQ0=4;OQ=262.32;QD=5.04;SB=-99.37	GT:AD:DP:GL:GQ	0/1:29,23:31:-38.85,-9.34,-83.38:99
-chr1	2286519	rs12029098	A	G	0.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=10.29;MQ=20.58;MQ0=25;OQ=214.67;QD=3.41;SB=-10.00	GT:AD:DP:GL:GQ	0/1:52,10:32:-34.39,-9.64,-87.93:99
-chr1	2286535	rs10910056	C	T	41.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=18.11;MQ0=29;OQ=264.94;QD=4.49;SB=-10.00	GT:AD:DP:GL:GQ	0/1:49,10:24:-37.01,-7.23,-58.35:99
-chr1	2286632	rs12062221	G	A	163.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.73;MQ0=23;OQ=318.86;QD=6.13;SB=-122.97	GT:AD:DP:GL:GQ	0/1:37,15:21:-41.50,-6.33,-38.58:99
-chr1	2286682	rs10910057	T	C	259.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=21.36;MQ0=18;OQ=880.98;QD=17.98;SB=-392.60	GT:AD:DP:GL:GQ	1/1:18,31:25:-91.69,-7.53,-0.01:75.23
-chr1	2287320	rs7366927	T	C	67.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=20.66;MQ0=24;OQ=467.32;QD=6.97;SB=-192.02	GT:AD:DP:GL:GQ	0/1:40,27:33:-59.96,-9.95,-57.33:99
-chr1	2287795	rs10910058	A	T	108.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.68;MQ0=0;OQ=672.40;QD=13.18;SB=-131.84	GT:AD:DP:GL:GQ	0/1:26,25:50:-85.58,-15.06,-97.61:99
-chr1	2287854	rs10910059	G	C	295.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.70;MQ0=0;OQ=1098.70;QD=16.90;SB=-242.39	GT:AD:DP:GL:GQ	0/1:34,31:65:-132.74,-19.58,-150.89:99
-chr1	2288115	rs4648834	A	G	229.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=58.69;MQ0=0;OQ=974.25;QD=11.88;SB=-367.23	GT:AD:DP:GL:GQ	0/1:45,37:80:-124.81,-24.10,-176.65:99
-chr1	2288354	rs55960350	C	A	363.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=56.19;MQ0=0;OQ=926.53;QD=15.44;SB=-445.49	GT:AD:DP:GL:GQ	0/1:29,31:60:-114.01,-18.07,-107.19:99
-chr1	2288496	rs10453826	G	A	57.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=3;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=1349.11;QD=17.75;SB=-668.70	GT:AD:DP:GL:GQ	0/1:36,39:75:-160.78,-22.59,-131.92:99
-chr1	2288624	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=61;Dels=0.02;HRun=18;HaplotypeScore=24.48;MQ=54.73;MQ0=1;OQ=401.02;QD=6.57;SB=-41.45	GT:AD:DP:GL:GQ	0/1:43,17:55:-59.67,-16.28,-122.97:99
-chr1	2288630	rs28792725	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.02;HRun=6;HaplotypeScore=25.44;MQ=54.48;MQ0=1;OQ=211.43;QD=3.92;SB=68.22	GT:AD:DP:GL:GQ	0/1:42,11:47:-38.29,-13.87,-121.95:99
-chr1	2288943	rs6704200	G	A	186.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.03;MQ0=0;OQ=2659.42;QD=39.69;SB=-1189.57	GT:AD:DP:GL:GQ	1/1:0,67:67:-269.55,-20.19,-0.02:99
-chr1	2289098	rs12069579	C	T	14.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=4;HaplotypeScore=1.46;MQ=57.20;MQ0=1;OQ=865.75;QD=14.43;SB=-343.49	GT:AD:DP:GL:GQ	0/1:32,28:57:-107.04,-17.18,-97.55:99
-chr1	2289170	rs12069588	C	T	455.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.87;MQ0=0;OQ=1016.01;QD=15.88;SB=-357.83	GT:AD:DP:GL:GQ	0/1:33,31:64:-124.17,-19.28,-114.93:99
-chr1	2289171	rs12071572	A	G	466.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.87;MQ0=0;OQ=819.05;QD=12.80;SB=-318.26	GT:AD:DP:GL:GQ	0/1:33,31:63:-104.18,-18.99,-126.28:99
-chr1	2289487	rs7545940	T	C	276.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.92;MQ=59.67;MQ0=0;OQ=618.09;QD=11.04;SB=-316.36	GT:AD:DP:GL:GQ	0/1:32,24:55:-81.66,-16.57,-127.86:99
-chr1	2289511	rs2840538	T	C	82.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=3.41;MQ=59.24;MQ0=0;OQ=1874.35;QD=34.08;SB=-939.34	GT:AD:DP:GL:GQ	1/1:0,55:54:-191.04,-16.27,-0.02:99
-chr1	2289772	rs7546224	T	C	223.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=58.97;MQ0=0;OQ=650.32;QD=11.02;SB=-248.17	GT:AD:DP:GL:GQ	0/1:33,26:58:-85.80,-17.48,-124.44:99
-chr1	2290017	rs12070927	C	A	51.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=3;HaplotypeScore=0.98;MQ=59.12;MQ0=0;OQ=1316.41;QD=19.08;SB=-657.73	GT:AD:DP:GL:GQ	0/1:26,43:67:-155.11,-20.18,-89.64:99
-chr1	2290238	rs7514750	G	C	5.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=1.63;MQ=56.12;MQ0=0;OQ=999.16;QD=16.93;SB=-161.14	GT:AD:DP:GL:GQ	0/1:29,30:55:-119.78,-16.58,-120.03:99
-chr1	2290509	rs7542190	C	T	358.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.38;MQ0=0;OQ=592.85;QD=11.62;SB=-156.20	GT:AD:DP:GL:GQ	0/1:31,20:49:-77.34,-14.77,-99.87:99
-chr1	2290635	rs7554609	A	G	100.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.39;MQ=57.81;MQ0=0;OQ=439.50;QD=11.27;SB=-190.14	GT:AD:DP:GL:GQ	0/1:19,19:37:-60.47,-13.23,-75.89:99
-chr1	2290654	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=20;HaplotypeScore=28.09;MQ=53.25;MQ0=0;OQ=241.28;QD=4.02;SB=92.32	GT:AD:DP:GL:GQ	0/1:44,16:53:-43.38,-15.97,-152.46:99
-chr1	2290675	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=69;Dels=0.01;HRun=20;HaplotypeScore=29.22;MQ=49.62;MQ0=0;OQ=64.81;QD=0.94;SB=71.20	GT:AD:DP:GL:GQ	0/1:52,14:46:-23.33,-13.56,-132.10:97.65
-chr1	2291469	rs2840535	G	T	504.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=896.75;QD=14.95;SB=-459.55	GT:AD:DP:GL:GQ	0/1:30,30:59:-110.74,-17.78,-88.69:99
-chr1	2291551	rs6665546	G	A	392.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=1434.00;QD=17.70;SB=-726.06	GT:AD:DP:GL:GQ	0/1:39,42:81:-171.09,-24.41,-128.82:99
-chr1	2292331	rs2453567	C	T	202.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=54.48;MQ0=0;OQ=1114.28;QD=17.14;SB=-425.43	GT:AD:DP:GL:GQ	0/1:31,34:60:-132.80,-18.08,-88.05:99
-chr1	2292376	rs2453566	T	C	254.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=52.46;MQ0=0;OQ=498.58;QD=10.18;SB=-208.48	GT:AD:DP:GL:GQ	0/1:22,27:40:-65.21,-12.06,-74.69:99
-chr1	2293426	rs2840534	A	G	74.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=4.04;MQ=59.63;MQ0=0;OQ=998.53;QD=16.11;SB=-332.38	GT:AD:DP:GL:GQ	0/1:27,35:61:-121.51,-18.38,-106.86:99
-chr1	2297776	rs2843165	A	C	120.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=714.07;QD=14.28;SB=-105.81	GT:AD:DP:GL:GQ	0/1:23,27:49:-89.45,-14.76,-84.29:99
-chr1	2298377	rs2843162	C	G	368.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=490.57;QD=15.82;SB=-257.11	GT:AD:DP:GL:GQ	0/1:17,14:31:-61.68,-9.34,-73.31:99
-chr1	2298942	rs2843160	T	G	117.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=5.47;MQ=59.17;MQ0=0;OQ=634.08;QD=11.32;SB=-278.70	GT:AD:DP:GL:GQ	0/1:27,29:53:-82.67,-15.98,-90.35:99
-chr1	2302255	rs2643908	C	T	314.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.96;MQ=59.55;MQ0=0;OQ=684.01;QD=13.41;SB=-309.40	GT:AD:DP:GL:GQ	0/1:26,25:46:-85.54,-13.86,-88.50:99
-chr1	2303400	rs2843132	A	G	8.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=3.40;MQ=59.58;MQ0=0;OQ=438.03;QD=9.96;SB=-158.56	GT:AD:DP:GL:GQ	0/1:24,20:38:-58.54,-11.45,-84.41:99
-chr1	2304179	rs2643901	T	C	196.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.98;MQ=59.45;MQ0=0;OQ=721.33;QD=17.17;SB=-281.01	GT:AD:DP:GL:GQ	0/1:15,26:39:-87.17,-11.75,-56.36:99
-chr1	2305298	rs2645060	G	A	178.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=3.33;MQ=60.00;MQ0=0;OQ=1082.92;QD=18.05;SB=-486.00	GT:AD:DP:GL:GQ	0/1:25,35:57:-128.76,-17.18,-76.49:99
-chr1	2305540	rs2843128	A	G	194.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=59.59;MQ0=0;OQ=482.38;QD=10.49;SB=-248.93	GT:AD:DP:GL:GQ	0/1:24,22:42:-64.18,-12.66,-86.34:99
-chr1	2305577	rs2843127	A	G	547.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.15;MQ0=0;OQ=527.20;QD=11.98;SB=-284.59	GT:AD:DP:GL:GQ	0/1:25,19:44:-69.26,-13.26,-98.42:99
-chr1	2306175	rs2843126	A	G	188.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.18;MQ=58.39;MQ0=0;OQ=344.67;QD=9.07;SB=-143.56	GT:AD:DP:GL:GQ	0/1:18,19:33:-47.70,-9.95,-71.62:99
-chr1	2306848	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=13;HaplotypeScore=4.17;MQ=55.00;MQ0=0;OQ=100.30;QD=4.18;SB=17.09	GT:AD:DP:GL:GQ	0/1:17,7:16:-18.14,-4.82,-46.21:99
-chr1	2309288	rs903903	A	G	560.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1265.25;QD=17.33;SB=-657.78	GT:AD:DP:GL:GQ	0/1:28,45:70:-150.90,-21.10,-100.41:99
-chr1	2309390	rs2645061	G	T	558.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=773.84;QD=12.28;SB=-380.71	GT:AD:DP:GL:GQ	0/1:36,27:63:-99.64,-18.97,-129.32:99
-chr1	2310428	.	G	A	99.95	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=70;Dels=0.04;HRun=15;HaplotypeScore=39.00;MQ=46.05;MQ0=0;QD=1.43;SB=52.68	GT:AD:DP:GL:GQ	0/1:53,14:55:-29.56,-16.28,-149.90:99
-chr1	2313868	rs2840533	C	T	252.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.46;MQ=59.24;MQ0=0;OQ=794.28;QD=14.44;SB=-234.49	GT:AD:DP:GL:GQ	0/1:29,26:54:-98.98,-16.27,-105.03:99
-chr1	2314319	.	A	G	42.45	LowQual	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=50.37;MQ0=0;QD=0.63;SB=-7.70	GT:AD:DP:GL:GQ	0/1:58,9:63:-26.51,-18.98,-220.77:75.28
-chr1	2314326	.	A	G	0.25	PASS	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=50.58;MQ0=0;OQ=173.32;QD=2.44;SB=-79.68	GT:AD:DP:GL:GQ	0/1:59,12:69:-41.40,-20.79,-226.63:99
-chr1	2314333	rs41315342	C	T	21.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=49.96;MQ0=0;OQ=309.71;QD=4.62;SB=-180.11	GT:AD:DP:GL:GQ	0/1:53,14:62:-52.95,-18.70,-157.19:99
-chr1	2315408	.	G	A	4.80	PASS	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=3.55;MQ=59.13;MQ0=0;OQ=1258.74;QD=16.78;SB=-356.05	GT:AD:DP:GL:GQ	0/1:37,38:74:-151.46,-22.30,-126.73:99
-chr1	2315869	rs1123571	G	A	390.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=58.65;MQ0=0;OQ=976.67;QD=13.95;SB=-457.41	GT:AD:DP:GL:GQ	0/1:38,32:64:-120.23,-19.28,-120.05:99
-chr1	2316672	rs903911	A	G	4.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=4.83;MQ=58.81;MQ0=0;OQ=646.68;QD=16.58;SB=-230.30	GT:AD:DP:GL:GQ	0/1:16,22:38:-79.40,-11.45,-61.89:99
-chr1	2317675	rs2840532	C	T	230.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.10;MQ=59.63;MQ0=0;OQ=2453.68;QD=38.95;SB=-993.83	GT:AD:DP:GL:GQ	1/1:0,63:62:-248.97,-18.68,-0.02:99
-chr1	2318574	rs2645081	A	G	8.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=6.83;MQ=58.95;MQ0=0;OQ=2467.67;QD=30.85;SB=-995.94	GT:AD:DP:GL:GQ	1/1:0,79:71:-250.38,-21.39,-0.03:99
-chr1	2319521	rs6698680	A	G	273.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=59.27;MQ0=0;OQ=618.22;QD=12.12;SB=-195.44	GT:AD:DP:GL:GQ	0/1:27,24:49:-79.88,-14.77,-98.83:99
-chr1	2319668	rs3001344	A	G	117.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=59.27;MQ0=0;OQ=3223.06;QD=35.42;SB=-1436.46	GT:AD:DP:GL:GQ	1/1:0,91:90:-325.91,-27.11,-0.03:99
-chr1	2319862	rs6698978	A	G	270.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=53.38;MQ0=0;OQ=935.78;QD=15.60;SB=-478.67	GT:AD:DP:GL:GQ	0/1:27,33:58:-114.34,-17.47,-100.10:99
-chr1	2319876	rs6685829	C	T	18.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=6.10;MQ=50.59;MQ0=0;OQ=722.12;QD=12.24;SB=-192.86	GT:AD:DP:GL:GQ	0/1:35,24:57:-92.67,-17.18,-109.45:99
-chr1	2320050	rs6693447	T	G	274.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=59.41;MQ0=0;OQ=1099.08;QD=15.48;SB=-483.82	GT:AD:DP:GL:GQ	0/1:33,38:70:-134.27,-21.08,-119.27:99
-chr1	2321898	rs55912310	A	G	16.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=2;HaplotypeScore=6.30;MQ=59.22;MQ0=0;OQ=1063.46;QD=13.63;SB=-443.56	GT:AD:DP:GL:GQ	0/1:40,38:76:-132.53,-22.90,-155.79:99
-chr1	2322251	rs12037485	C	T	255.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=54.76;MQ0=0;OQ=603.45;QD=12.57;SB=-317.81	GT:AD:DP:GL:GQ	0/1:27,21:45:-77.19,-13.56,-84.03:99
-chr1	2322525	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=3;HaplotypeScore=18.90;MQ=37.53;MQ0=0;OQ=105.39;QD=3.90;SB=-31.65	GT:AD:DP:GL:GQ	0/1:20,7:25:-21.36,-7.54,-75.64:99
-chr1	2322526	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=17.62;MQ=38.02;MQ0=0;OQ=76.24;QD=2.63;SB=-0.98	GT:AD:DP:GL:GQ	0/1:23,6:24:-18.14,-7.23,-69.35:99
-chr1	2322566	.	C	T	184.67	Indel	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=7.93;MQ=44.33;MQ0=0;QD=9.72;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,7:16:-26.58,-4.82,-31.47:99
-chr1	2322586	.	T	C	43.94	LowQual	AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=2;HaplotypeScore=6.02;MQ=50.39;MQ0=0;QD=3.38;SB=-10.00	GT:AD:DP:GL:GQ	0/1:9,4:11:-10.99,-3.32,-30.04:76.77
-chr1	2322650	.	T	C	18.09	LowQual	AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=2;HaplotypeScore=5.99;MQ=43.00;MQ0=0;QD=3.01;SB=-3.98	GT:AD:DP:GL:GQ	0/1:4,2:6:-6.89,-1.81,-15.35:50.86
-chr1	2322668	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=1;HaplotypeScore=16.47;MQ=36.20;MQ0=0;OQ=99.28;QD=6.62;SB=-3.98	GT:AD:DP:GL:GQ	0/1:11,4:11:-16.52,-3.31,-24.94:99
-chr1	2322705	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=18.95;MQ=39.10;MQ0=0;OQ=127.82;QD=7.99;SB=-6.99	GT:AD:DP:GL:GQ	0/1:11,5:12:-19.68,-3.62,-24.01:99
-chr1	2322711	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=2;HaplotypeScore=13.96;MQ=44.08;MQ0=0;OQ=161.06;QD=8.05;SB=-38.94	GT:AD:DP:GL:GQ	0/1:13,7:16:-24.21,-4.82,-34.51:99
-chr1	2322848	rs3001337	T	C	21.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.78;MQ0=0;OQ=436.82;QD=19.86;SB=-71.91	GT:AD:DP:GL:GQ	1/1:0,22:15:-47.28,-4.52,-0.02:45.08
-chr1	2322891	rs3001336	G	A	52.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.61;MQ=57.77;MQ0=0;OQ=1380.55;QD=34.51;SB=-210.77	GT:AD:DP:GL:GQ	1/1:0,39:36:-141.66,-10.85,-0.02:99
-chr1	2324121	.	G	T	2.67	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=60.00;MQ0=0;OQ=1012.17;QD=19.85;SB=-217.60	GT:AD:DP:GL:GQ	0/1:19,32:51:-119.87,-15.37,-54.76:99
-chr1	2324716	rs41315648	C	T	55.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=58.50;MQ0=0;OQ=419.39;QD=13.53;SB=-59.02	GT:AD:DP:GL:GQ	0/1:17,14:29:-53.97,-8.74,-50.19:99
-chr1	2325536	rs1129333	A	G	283.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.63;MQ0=0;OQ=1733.67;QD=33.99;SB=-802.65	GT:AD:DP:GL:GQ	1/1:0,51:50:-176.97,-15.06,-0.02:99
-chr1	2327137	rs11586985	C	T	102.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=429.81;QD=12.28;SB=-139.15	GT:AD:DP:GL:GQ	0/1:21,14:35:-56.82,-10.56,-64.66:99
-chr1	2327397	rs2494426	C	G	233.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=927.58;QD=37.10;SB=-342.73	GT:AD:DP:GL:GQ	1/1:0,25:23:-96.36,-6.94,-0.02:69.23
-chr1	2327420	rs55746053	G	A	222.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.19;MQ0=0;OQ=251.55;QD=10.94;SB=-144.16	GT:AD:DP:GL:GQ	0/1:13,10:21:-34.77,-6.33,-37.00:99
-chr1	2327986	rs3795269	C	A	81.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=3.48;MQ=59.11;MQ0=0;OQ=721.54;QD=13.88;SB=-337.19	GT:AD:DP:GL:GQ	0/1:25,27:47:-89.60,-14.16,-76.64:99
-chr1	2328429	rs2494427	T	C	699.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=1614.58;QD=34.35;SB=-832.33	GT:AD:DP:GL:GQ	1/1:0,47:46:-165.06,-13.86,-0.02:99
-chr1	2328739	rs6671420	G	A	245.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.24;MQ=58.64;MQ0=0;OQ=433.47;QD=13.98;SB=-240.76	GT:AD:DP:GL:GQ	0/1:16,15:30:-55.68,-9.05,-50.08:99
-chr1	2328934	rs2494428	C	T	252.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=60.00;MQ0=0;OQ=2537.82;QD=38.45;SB=-908.73	GT:AD:DP:GL:GQ	1/1:0,66:65:-257.39,-19.59,-0.03:99
-chr1	2328975	rs2494599	T	C	150.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.94;MQ=60.00;MQ0=0;OQ=1601.93;QD=34.08;SB=-647.90	GT:AD:DP:GL:GQ	1/1:0,47:46:-163.80,-13.86,-0.02:99
-chr1	2328999	rs6671730	G	A	141.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=617.02;QD=15.43;SB=-196.85	GT:AD:DP:GL:GQ	0/1:20,20:39:-76.74,-11.75,-69.55:99
-chr1	2329255	rs2494429	A	G	318.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.40;MQ0=0;OQ=347.51;QD=11.21;SB=-114.76	GT:AD:DP:GL:GQ	0/1:16,15:29:-46.78,-8.74,-56.84:99
-chr1	2329287	rs4648634	C	T	185.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.86;MQ=59.06;MQ0=0;OQ=270.55;QD=13.53;SB=-158.18	GT:AD:DP:GL:GQ	0/1:11,9:17:-35.47,-5.13,-24.67:99
-chr1	2329933	.	C	G	22.59	PASS	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=4.69;MQ=58.67;MQ0=0;OQ=614.01;QD=12.53;SB=-287.97	GT:AD:DP:GL:GQ	0/1:22,27:40:-76.76,-12.08,-83.82:99
-chr1	2330060	rs2494598	T	C	290.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=58.95;MQ0=0;OQ=481.10;QD=12.03;SB=-246.32	GT:AD:DP:GL:GQ	0/1:19,21:39:-63.16,-11.76,-72.17:99
-chr1	2332427	.	C	T	0.21	PASS	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=10.66;MQ=58.03;MQ0=0;OQ=1034.47;QD=16.96;SB=-503.70	GT:AD:DP:GL:GQ	0/1:28,33:58:-124.21,-17.48,-97.70:99
-chr1	2333054	rs2494597	T	C	55.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=59.48;MQ0=0;OQ=1376.62;QD=31.29;SB=-454.42	GT:AD:DP:GL:GQ	1/1:0,44:41:-141.27,-12.35,-0.02:99
-chr1	2334551	rs2494595	A	G	104.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=58.99;MQ0=0;OQ=304.12;QD=13.22;SB=-164.34	GT:AD:DP:GL:GQ	0/1:12,11:22:-40.32,-6.63,-44.91:99
-chr1	2334785	rs9424320	T	C	95.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=59.20;MQ0=0;OQ=385.94;QD=13.31;SB=-75.78	GT:AD:DP:GL:GQ	0/1:11,17:25:-49.42,-7.54,-38.41:99
-chr1	2335959	rs7556447	C	G	349.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=56.82;MQ0=0;OQ=713.10;QD=13.71;SB=-329.23	GT:AD:DP:GL:GQ	0/1:30,22:47:-88.76,-14.16,-115.39:99
-chr1	2336342	rs4648839	T	C	24.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=49.60;MQ0=0;OQ=479.90;QD=20.87;SB=-161.36	GT:AD:DP:GL:GQ	1/1:1,22:17:-51.60,-5.13,-0.02:51.09
-chr1	2336383	rs10910065	G	C	120.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=52.63;MQ0=0;OQ=649.76;QD=18.05;SB=-286.56	GT:AD:DP:GL:GQ	0/1:17,19:34:-78.51,-10.25,-66.28:99
-chr1	2336384	rs10910066	T	C	189.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=52.63;MQ0=0;OQ=539.82;QD=14.99;SB=-236.31	GT:AD:DP:GL:GQ	0/1:17,19:36:-68.12,-10.85,-65.37:99
-chr1	2336612	.	G	A	111.33	PASS	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=53.01;MQ0=0;OQ=620.89;QD=13.80;SB=-302.81	GT:AD:DP:GL:GQ	0/1:24,21:40:-77.43,-12.05,-71.03:99
-chr1	2337326	rs12746918	C	T	6.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=7.69;MQ=54.86;MQ0=0;OQ=484.18;QD=9.68;SB=-259.25	GT:AD:DP:GL:GQ	0/1:29,21:42:-64.36,-12.66,-87.95:99
-chr1	2337359	.	C	T	7.61	PASS	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=4.85;MQ=55.32;MQ0=0;OQ=435.73;QD=9.68;SB=-169.11	GT:AD:DP:GL:GQ	0/1:27,17:41:-59.22,-12.37,-82.09:99
-chr1	2337436	.	G	T	34.30	PASS	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=57.73;MQ0=0;OQ=368.11;QD=11.87;SB=-146.62	GT:AD:DP:GL:GQ	0/1:16,15:30:-49.13,-9.04,-55.91:99
-chr1	2337592	rs12184328	G	A	0.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=8.46;MQ=57.94;MQ0=0;OQ=510.09;QD=15.00;SB=-111.95	GT:AD:DP:GL:GQ	0/1:17,16:33:-64.24,-9.94,-57.68:99
-chr1	2337900	rs10910068	T	C	14.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=3;HaplotypeScore=1.32;MQ=56.47;MQ0=0;OQ=310.27;QD=9.13;SB=-165.49	GT:AD:DP:GL:GQ	0/1:15,19:29:-43.06,-8.75,-59.62:99
-chr1	2339629	rs2494432	G	A	402.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.15;MQ0=0;OQ=824.63;QD=16.83;SB=-334.87	GT:AD:DP:GL:GQ	0/1:23,26:44:-99.01,-13.26,-63.50:99
-chr1	2339896	.	C	T	167.28	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=60.00;MQ0=0;OQ=715.32;QD=13.50;SB=-333.31	GT:AD:DP:GL:GQ	0/1:31,22:52:-90.49,-15.68,-97.09:99
-chr1	2340772	rs10910070	G	A	197.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.11;MQ=60.00;MQ0=0;OQ=631.24;QD=14.35;SB=-260.25	GT:AD:DP:GL:GQ	0/1:23,21:43:-79.37,-12.96,-74.56:99
-chr1	2340956	rs11577147	A	G	10.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=289.51;QD=8.77;SB=-78.79	GT:AD:DP:GL:GQ	0/1:19,14:32:-41.88,-9.65,-72.03:99
-chr1	2341435	rs11590507	G	A	0.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=5.72;MQ=57.66;MQ0=0;OQ=472.75;QD=15.76;SB=-44.54	GT:AD:DP:GL:GQ	0/1:14,15:29:-59.30,-8.74,-51.63:99
-chr1	2341559	rs3935659	T	C	7.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=2;HaplotypeScore=3.23;MQ=59.25;MQ0=0;OQ=287.36;QD=11.49;SB=-29.91	GT:AD:DP:GL:GQ	0/1:13,12:25:-39.55,-7.53,-50.79:99
-chr1	2341739	rs3935660	C	T	165.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=58.09;MQ0=0;OQ=670.17;QD=13.68;SB=-195.21	GT:AD:DP:GL:GQ	0/1:27,21:42:-82.97,-12.67,-64.00:99
-chr1	2342006	rs12731309	C	T	203.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=58.88;MQ0=0;OQ=846.80;QD=15.68;SB=-399.13	GT:AD:DP:GL:GQ	0/1:28,26:51:-103.32,-15.36,-93.02:99
-chr1	2342252	.	A	T	13.40	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=20.03;MQ=56.40;MQ0=0;QD=0.29;SB=20.83	GT:AD:DP:GL:GQ	0/1:37,6:32:-14.24,-9.64,-106.31:46.04
-chr1	2342253	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=16;HaplotypeScore=7.92;MQ=56.40;MQ0=0;OQ=132.41;QD=2.82;SB=14.63	GT:AD:DP:GL:GQ	0/1:39,8:37:-27.67,-11.15,-101.20:99
-chr1	2342945	rs10910071	A	G	300.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=58.83;MQ0=0;OQ=1016.43;QD=13.20;SB=-494.01	GT:AD:DP:GL:GQ	0/1:41,36:76:-127.82,-22.90,-155.86:99
-chr1	2343155	rs12143389	C	T	127	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=58.70;MQ0=1;OQ=925.95;QD=15.69;SB=-402.44	GT:AD:DP:GL:GQ	0/1:31,28:58:-113.35,-17.47,-107.32:99
-chr1	2343729	rs35799953	G	T	69.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.02;MQ0=0;OQ=852.19;QD=13.75;SB=-419.16	GT:AD:DP:GL:GQ	0/1:33,29:62:-107.18,-18.68,-104.15:99
-chr1	2343876	rs34574702	C	T	503.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=1119.07;QD=15.54;SB=-507.56	GT:AD:DP:GL:GQ	0/1:37,35:71:-136.60,-21.41,-114.39:99
-chr1	2344230	rs12022832	T	C	209.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=1.97;MQ=58.42;MQ0=0;OQ=1122.84;QD=12.62;SB=-438.76	GT:AD:DP:GL:GQ	0/1:44,45:86:-141.48,-25.92,-179.52:99
-chr1	2344260	rs12096965	C	T	229.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.88;MQ0=0;OQ=1606.93;QD=18.26;SB=-801.37	GT:AD:DP:GL:GQ	0/1:41,47:83:-188.99,-25.01,-117.57:99
-chr1	2344423	rs12097032	C	T	484.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=986.20;QD=13.33;SB=-465.97	GT:AD:DP:GL:GQ	0/1:43,31:74:-124.19,-22.29,-159.47:99
-chr1	2344746	rs10797421	G	A	65.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.32;MQ0=1;OQ=3166.01;QD=39.09;SB=-1482.03	GT:AD:DP:GL:GQ	1/1:0,81:79:-320.20,-23.80,-0.02:99
-chr1	2345260	.	A	G	75.95	PASS	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=1;HaplotypeScore=1.32;MQ=59.23;MQ0=0;OQ=680.86;QD=11.35;SB=-282.57	GT:AD:DP:GL:GQ	0/1:36,24:58:-88.84,-17.47,-139.70:99
-chr1	2346437	rs4648840	A	G	47.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=56.94;MQ0=0;OQ=537.49;QD=18.53;SB=-194.00	GT:AD:DP:GL:GQ	0/1:11,18:29:-65.77,-8.74,-43.90:99
-chr1	2346772	rs2494433	G	A	58.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=3.58;MQ=56.91;MQ0=0;OQ=1163.67;QD=17.63;SB=-493.51	GT:AD:DP:GL:GQ	0/1:29,36:61:-138.03,-18.37,-99.55:99
-chr1	2347335	rs2494434	T	C	559.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.75;MQ0=0;OQ=1472.38;QD=29.45;SB=-544.87	GT:AD:DP:GL:GQ	1/1:0,50:48:-150.87,-14.48,-0.05:99
-chr1	2347933	rs2494588	C	T	188.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=57.48;MQ0=0;OQ=702.34;QD=16.33;SB=-327.35	GT:AD:DP:GL:GQ	0/1:19,24:41:-85.88,-12.36,-61.93:99
-chr1	2348381	rs55852252	G	A	9.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=6.28;MQ=58.74;MQ0=0;OQ=406.10;QD=10.98;SB=-128.60	GT:AD:DP:GL:GQ	0/1:20,16:33:-53.85,-9.96,-60.26:99
-chr1	2348618	rs2494587	C	T	128.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=58.45;MQ0=0;OQ=376.88;QD=12.56;SB=-173.14	GT:AD:DP:GL:GQ	0/1:17,13:28:-49.41,-8.44,-50.72:99
-chr1	2348708	rs12116913	G	C	294.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.74;MQ0=0;OQ=640.63;QD=17.31;SB=-259.09	GT:AD:DP:GL:GQ	0/1:14,23:34:-77.61,-10.26,-60.10:99
-chr1	2349777	rs2494436	T	C	163.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=59.34;MQ0=0;OQ=309.46;QD=8.84;SB=-92.69	GT:AD:DP:GL:GQ	0/1:19,16:32:-43.87,-9.64,-70.50:99
-chr1	2349800	rs7515934	C	T	251.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=58.83;MQ0=0;OQ=424.25;QD=11.78;SB=-175.26	GT:AD:DP:GL:GQ	0/1:19,17:28:-54.15,-8.45,-42.69:99
-chr1	2350992	rs10910075	C	T	473.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=647.50;QD=14.08;SB=-334.47	GT:AD:DP:GL:GQ	0/1:24,22:45:-81.60,-13.57,-79.99:99
-chr1	2351241	.	T	G	21.83	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=2;HaplotypeScore=2.69;MQ=59.58;MQ0=0;QD=0.40;SB=68.21	GT:AD:DP:GL:GQ	0/1:36,19:40:-17.52,-12.05,-117.29:54.64
-chr1	2351880	rs4531246	G	T	25.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=6.77;MQ=57.66;MQ0=0;OQ=504.52;QD=12.61;SB=-172.18	GT:AD:DP:GL:GQ	0/1:16,23:33:-63.68,-9.95,-50.73:99
-chr1	2352624	rs10797424	A	T	924.88	Indel	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=6.64;MQ=59.45;MQ0=0;QD=16.52;SB=-353.59	GT:AD:DP:GL:GQ	0/1:25,31:52:-111.44,-15.67,-81.17:99
-chr1	2352687	rs2494641	C	T	290.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=59.48;MQ0=0;OQ=558.90;QD=11.89;SB=-269.24	GT:AD:DP:GL:GQ	0/1:28,19:43:-72.14,-12.96,-80.82:99
-chr1	2353187	rs2494640	G	C	26.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=4.41;MQ=59.56;MQ0=0;OQ=532.94;QD=10.25;SB=-240.06	GT:AD:DP:GL:GQ	0/1:33,18:51:-71.97,-15.39,-132.20:99
-chr1	2361858	rs12756220	T	C	1.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=140;Dels=0.00;HRun=2;HaplotypeScore=7.14;MQ=34.26;MQ0=3;OQ=1721.38;QD=12.30;SB=-137.87	GT:AD:DP:GL:GQ	0/1:41,97:98:-204.99,-29.57,-118.98:99
-chr1	2361893	rs34648463	T	G	24.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=3.90;MQ=42.90;MQ0=5;OQ=1167.25;QD=12.83;SB=-195.79	GT:AD:DP:GL:GQ	0/1:32,58:69:-140.80,-20.79,-99.18:99
-chr1	2361936	rs28669301	A	C	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=18.37;MQ=47.88;MQ0=0;OQ=797.11;QD=9.96;SB=-212.34	GT:AD:DP:GL:GQ	0/1:30,48:65:-102.59,-19.60,-99.90:99
-chr1	2361993	rs2494638	G	C	0.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=3.02;MQ=48.10;MQ0=3;OQ=294.71;QD=3.68;SB=53.21	GT:AD:DP:GL:GQ	0/1:57,23:60:-50.84,-18.09,-206.36:99
-chr1	2363043	.	G	A	28.79	PASS	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=1.42;MQ=59.14;MQ0=0;OQ=346.36;QD=12.83;SB=-157.68	GT:AD:DP:GL:GQ	0/1:14,13:24:-45.16,-7.24,-42.35:99
-chr1	2380627	.	C	G	34.70	LowQual	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=57.50;MQ0=0;QD=0.48;SB=-30.39	GT:AD:DP:GL:GQ	0/1:66,6:63:-25.74,-18.99,-243.93:67.54
-chr1	2380700	rs28508164	T	C	2.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.08;MQ0=1;OQ=73.76;QD=1.76;SB=-56.90	GT:AD:DP:GL:GQ	0/1:36,6:33:-20.60,-9.94,-107.88:99
-chr1	2380723	.	G	C	46.32	LowQual	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=2;HaplotypeScore=2.29;MQ=49.69;MQ0=1;QD=2.72;SB=-23.39	GT:AD:DP:GL:GQ	0/1:12,5:11:-11.23,-3.32,-34.81:79.16
-chr1	2380725	.	C	T	43.06	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=4.03;MQ=49.69;MQ0=1;QD=2.53;SB=5.04	GT:AD:DP:GL:GQ	0/1:12,5:11:-10.90,-3.32,-27.83:75.90
-chr1	2380739	.	G	C	31.92	LowQual	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=2;HaplotypeScore=1.16;MQ=44.53;MQ0=1;QD=1.88;SB=-3.98	GT:AD:DP:GL:GQ	0/1:10,7:9:-9.19,-2.71,-29.02:64.75
-chr1	2380741	.	C	T	23.47	LowQual	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=43.38;MQ0=1;QD=1.47;SB=-3.99	GT:AD:DP:GL:GQ	0/1:10,6:8:-8.04,-2.42,-18.12:56.29
-chr1	2380787	.	C	G	11.87	PASS	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=3.66;MQ=41.08;MQ0=2;OQ=228.10;QD=9.12;SB=-107.32	GT:AD:DP:GL:GQ	0/1:13,12:14:-30.31,-4.22,-31.36:99
-chr1	2380789	.	T	C	0.06	PASS	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=2;HaplotypeScore=3.66;MQ=41.08;MQ0=2;OQ=146.59;QD=5.86;SB=-69.76	GT:AD:DP:GL:GQ	0/1:13,12:14:-22.16,-4.22,-27.36:99
-chr1	2380812	.	C	T	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=1;HaplotypeScore=13.92;MQ=46.38;MQ0=1;OQ=329.40;QD=9.98;SB=-91.91	GT:AD:DP:GL:GQ	0/1:15,18:19:-41.95,-5.73,-28.82:99
-chr1	2380819	.	C	G	37.83	LowQual	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=9.81;MQ=46.57;MQ0=1;QD=1.08;SB=-27.83	GT:AD:DP:GL:GQ	0/1:27,8:18:-12.49,-5.42,-65.92:70.67
-chr1	2382567	.	A	G	10.80	PASS	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.42;MQ0=0;OQ=573.70;QD=14.34;SB=-186.56	GT:AD:DP:GL:GQ	0/1:16,24:36:-71.50,-10.85,-55.65:99
-chr1	2390539	rs56368227	C	T	147.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.76;MQ=58.63;MQ0=0;OQ=772.55;QD=15.15;SB=-231.31	GT:AD:DP:GL:GQ	0/1:25,25:47:-96.89,-16.35,-71.90:99
-chr1	2391510	rs942818	T	C	169.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.03;MQ0=0;OQ=1503.43;QD=30.07;SB=-692.23	GT:AD:DP:GL:GQ	1/1:0,50:44:-153.95,-13.26,-0.02:99
-chr1	2393714	rs10910080	G	A	120.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=2.52;MQ=58.38;MQ0=0;OQ=343.05;QD=13.19;SB=-140.60	GT:AD:DP:GL:GQ	0/1:13,13:24:-44.83,-7.24,-36.59:99
-chr1	2394116	rs2494626	C	T	263.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=58.95;MQ0=0;OQ=492.85;QD=12.32;SB=-207.19	GT:AD:DP:GL:GQ	0/1:23,17:37:-63.72,-11.16,-67.50:99
-chr1	2398521	rs1536155	A	G	7.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=3;HaplotypeScore=2.26;MQ=58.44;MQ0=0;OQ=280.60;QD=10.39;SB=-38.80	GT:AD:DP:GL:GQ	0/1:14,13:25:-38.88,-7.54,-51.71:99
-chr1	2399136	rs12049628	A	G	275.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=58.16;MQ0=0;OQ=457.42;QD=9.94;SB=-243.30	GT:AD:DP:GL:GQ	0/1:24,22:43:-61.98,-12.96,-96.02:99
-chr1	2399220	rs59417818	G	A	58.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=60.00;MQ0=0;OQ=406.26;QD=15.63;SB=-103.61	GT:AD:DP:GL:GQ	0/1:12,13:24:-51.14,-7.23,-38.48:99
-chr1	2399752	rs12727342	A	G	0.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=4.77;MQ=57.40;MQ0=0;OQ=225.70;QD=6.10;SB=-108.60	GT:AD:DP:GL:GQ	0/1:20,17:31:-35.20,-9.35,-75.95:99
-chr1	2399993	.	G	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=1;HaplotypeScore=4.11;MQ=57.31;MQ0=0;OQ=125.38;QD=3.58;SB=53.21	GT:AD:DP:GL:GQ	0/1:25,10:27:-23.96,-8.14,-94.75:99
-chr1	2400649	rs11799501	C	T	116.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=4.89;MQ=60.00;MQ0=0;OQ=748.36;QD=14.39;SB=-393.78	GT:AD:DP:GL:GQ	0/1:28,24:51:-93.50,-15.38,-86.98:99
-chr1	2401311	rs10797428	A	G	76.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=3;HaplotypeScore=1.05;MQ=59.53;MQ0=0;OQ=638.41;QD=15.96;SB=-314.23	GT:AD:DP:GL:GQ	0/1:15,25:38:-78.58,-11.46,-54.60:99
-chr1	2402139	rs4648638	A	T	283.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.43;MQ0=0;OQ=382.69;QD=11.60;SB=-121.80	GT:AD:DP:GL:GQ	0/1:19,14:31:-50.89,-9.34,-63.99:99
-chr1	2403494	rs942817	G	C	329.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=58.68;MQ0=0;OQ=865.92;QD=18.82;SB=-441.92	GT:AD:DP:GL:GQ	0/1:21,25:43:-102.83,-12.96,-79.86:99
-chr1	2404788	rs4995304	G	A	54.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=55.45;MQ0=0;OQ=801.00;QD=19.54;SB=-282.18	GT:AD:DP:GL:GQ	0/1:16,24:39:-95.13,-11.75,-53.28:99
-chr1	2405062	.	T	G	6.04	PASS	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=55.86;MQ0=0;OQ=164.49;QD=7.15;SB=2.04	GT:AD:DP:GL:GQ	0/1:15,8:23:-26.66,-6.93,-55.71:99
-chr1	2405078	.	C	T	5.98	PASS	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=52.76;MQ0=0;OQ=151.99;QD=6.61;SB=-0.99	GT:AD:DP:GL:GQ	0/1:16,7:20:-24.51,-6.03,-50.27:99
-chr1	2405106	.	G	T	34.21	LowQual	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=1;HaplotypeScore=4.38;MQ=49.04;MQ0=0;QD=1.63;SB=-10.00	GT:AD:DP:GL:GQ	0/1:16,5:14:-10.92,-4.22,-37.23:67.05
-chr1	2405179	.	T	G	0.09	PASS	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=3;HaplotypeScore=3.52;MQ=52.14;MQ0=0;OQ=147.78;QD=8.21;SB=-98.66	GT:AD:DP:GL:GQ	0/1:11,7:13:-21.98,-3.92,-24.09:99
-chr1	2405189	.	T	C	0.04	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DP=19;Dels=0.00;HRun=3;HaplotypeScore=5.56;MQ=47.05;MQ0=0;OQ=344.28;QD=18.12;SB=-173.40	GT:AD:DP:GL:GQ	1/1:0,19:11:-38.02,-3.32,-0.01:33.08
-chr1	2405210	.	C	A	0.76	PASS	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=2.86;MQ=39.01;MQ0=0;OQ=86.77;QD=6.20;SB=-60.75	GT:AD:DP:GL:GQ	0/1:10,4:8:-14.37,-2.41,-11.67:92.61
-chr1	2405220	.	G	C	0.99	PASS	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=2.07;MQ=39.01;MQ0=0;OQ=62.38;QD=4.46;SB=-40.43	GT:AD:DP:GL:GQ	0/1:10,4:7:-11.64,-2.12,-15.93:95.21
-chr1	2405254	.	T	C	25.50	LowQual	AC=1;AF=0.50;AN=2;DP=7;Dels=0.00;HRun=3;HaplotypeScore=1.85;MQ=37.93;MQ0=1;QD=3.64;SB=-6.99	GT:AD:DP:GL:GQ	0/1:3,4:4:-7.04,-1.21,-6.92:57.17
-chr1	2405275	.	C	A	10.07	PASS	AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=1;HaplotypeScore=2.14;MQ=32.15;MQ0=1;OQ=98.76;QD=10.97;SB=-39.94	GT:AD:DP:GL:GQ	1/1:5,4:4:-13.41,-1.21,-0.00:12.03
-chr1	2405285	.	G	C	5.32	PASS	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=2.30;MQ=37.51;MQ0=1;OQ=185.89;QD=12.39;SB=-10.00	GT:AD:DP:GL:GQ	0/1:8,7:7:-23.98,-2.11,-4.50:23.85
-chr1	2405307	.	G	C	0.94	PASS	AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=44.11;MQ0=0;OQ=225.33;QD=17.33;SB=-6.99	GT:AD:DP:GL:GQ	0/1:5,8:9:-28.53,-2.71,-8.94:62.30
-chr1	2405357	rs61763948	T	C	6.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=58.63;MQ0=0;OQ=296.15;QD=17.42;SB=-3.98	GT:AD:DP:GL:GQ	0/1:4,13:16:-37.72,-4.82,-15.46:99
-chr1	2406217	rs4648639	G	A	225.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=51.38;MQ0=0;OQ=834.51;QD=18.14;SB=-265.24	GT:AD:DP:GL:GQ	0/1:20,26:45:-100.29,-13.55,-72.00:99
-chr1	2407818	rs4648640	G	A	162.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.42;MQ=59.09;MQ0=0;OQ=709.86;QD=15.43;SB=-272.15	GT:AD:DP:GL:GQ	0/1:23,23:44:-87.53,-13.26,-76.87:99
-chr1	2408795	rs10910082	C	T	122.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=59.49;MQ0=0;OQ=319.86;QD=7.11;SB=-107.45	GT:AD:DP:GL:GQ	0/1:33,12:44:-48.52,-13.25,-117.65:99
-chr1	2410450	rs10752744	T	C	140.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=1.65;MQ=60.00;MQ0=0;OQ=499.26;QD=10.62;SB=-158.91	GT:AD:DP:GL:GQ	0/1:28,19:47:-67.37,-14.16,-113.54:99
-chr1	2410773	rs6668720	A	G	120.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=58.84;MQ0=0;OQ=320.90;QD=8.02;SB=-52.83	GT:AD:DP:GL:GQ	0/1:24,16:36:-46.22,-10.85,-86.61:99
-chr1	2412474	rs2477699	G	A	360.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=58.60;MQ0=0;OQ=676.25;QD=13.52;SB=-318.34	GT:AD:DP:GL:GQ	0/1:25,25:46:-84.77,-13.86,-87.14:99
-chr1	2413426	rs3001349	C	G	122.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=4.47;MQ=59.07;MQ0=0;OQ=984.04;QD=19.68;SB=-507.27	GT:AD:DP:GL:GQ	0/1:22,28:50:-116.76,-15.07,-93.45:99
-chr1	2414277	rs2477701	T	C	471.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=1313.31;QD=32.03;SB=-482.12	GT:AD:DP:GL:GQ	1/1:0,41:41:-134.95,-12.36,-0.03:99
-chr1	2414754	rs2477702	T	C	257.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=58.58;MQ0=0;OQ=407.32;QD=11.31;SB=-181.54	GT:AD:DP:GL:GQ	0/1:18,17:33:-53.96,-9.95,-62.99:99
-chr1	2415234	.	G	A	52.54	PASS	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=3.50;MQ=58.25;MQ0=0;OQ=558.86;QD=13.97;SB=-294.85	GT:AD:DP:GL:GQ	0/1:20,20:36:-70.03,-10.86,-54.36:99
-chr1	2415852	rs2477703	C	T	47.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=7.69;MQ=58.80;MQ0=0;OQ=763.15;QD=13.16;SB=-352.50	GT:AD:DP:GL:GQ	0/1:34,24:57:-96.78,-17.18,-104.35:99
-chr1	2416626	rs3001347	A	G	166.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=58.74;MQ0=0;OQ=303.26;QD=8.20;SB=-170.50	GT:AD:DP:GL:GQ	0/1:20,17:33:-43.56,-9.95,-71.18:99
-chr1	2417572	rs3762444	C	T	276.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=447.88;QD=14.93;SB=-199.90	GT:AD:DP:GL:GQ	0/1:15,15:29:-56.82,-8.74,-44.39:99
-chr1	2418734	rs2477706	T	C	40.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.30;MQ=58.67;MQ0=0;OQ=224.99;QD=6.43;SB=-131.52	GT:AD:DP:GL:GQ	0/1:20,15:30:-34.83,-9.05,-71.11:99
-chr1	2422191	rs4648641	C	A	142.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.65;MQ0=0;OQ=139.36;QD=6.33;SB=-88.78	GT:AD:DP:GL:GQ	0/1:13,9:20:-23.25,-6.03,-44.88:99
-chr1	2422622	rs4648642	G	A	142.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.94;MQ=59.39;MQ0=0;OQ=411.20;QD=10.82;SB=-172.27	GT:AD:DP:GL:GQ	0/1:23,15:36:-55.26,-10.86,-70.83:99
-chr1	2422899	.	G	A	37.84	PASS	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.95;MQ=59.45;MQ0=0;OQ=458.87;QD=13.50;SB=-199.87	GT:AD:DP:GL:GQ	0/1:18,16:31:-58.52,-9.34,-51.58:99
-chr1	2423328	.	G	A	53.96	PASS	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=296.62;QD=12.90;SB=-35.64	GT:AD:DP:GL:GQ	0/1:13,10:22:-39.58,-6.63,-40.93:99
-chr1	2423754	rs55874156	G	A	35.47	LowQual	AC=1;AF=0.50;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;QD=5.91;SB=-7.00	GT:AD:DP:GL:GQ	0/1:3,3:5:-8.34,-1.51,-8.96:68.30
-chr1	2423760	rs12736998	C	T	230.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=70.89;QD=11.81;SB=-46.66	GT:AD:DP:GL:GQ	0/1:3,3:6:-12.18,-1.81,-9.71:78.98
-chr1	2424604	rs3814298	C	T	190.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=60.00;MQ0=0;OQ=798.59;QD=18.57;SB=-384.92	GT:AD:DP:GL:GQ	0/1:19,24:41:-95.50,-12.36,-53.02:99
-chr1	2428628	rs12725663	C	T	86.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=59.46;MQ0=0;OQ=892.70;QD=20.76;SB=-466.01	GT:AD:DP:GL:GQ	0/1:16,27:41:-104.92,-12.36,-47.45:99
-chr1	2429459	rs2494621	C	A	2.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=3;HaplotypeScore=1.26;MQ=59.48;MQ0=0;OQ=889.11;QD=20.21;SB=-361.22	GT:AD:DP:GL:GQ	0/1:15,29:43:-105.15,-12.95,-49.46:99
-chr1	2429541	rs4648559	C	T	370.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=862.47;QD=17.60;SB=-340.86	GT:AD:DP:GL:GQ	0/1:22,27:49:-104.31,-14.78,-68.65:99
-chr1	2429545	rs3791180	G	C	362.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.63;MQ0=0;OQ=669.25;QD=13.12;SB=-329.42	GT:AD:DP:GL:GQ	0/1:24,27:45:-83.79,-13.58,-96.76:99
-chr1	2434274	rs7535528	G	A	398.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=57.41;MQ0=0;OQ=974.09;QD=16.23;SB=-447.47	GT:AD:DP:GL:GQ	0/1:29,31:55:-117.28,-16.58,-80.59:99
-chr1	2440170	rs56168662	G	C	440.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=641.06;QD=13.94;SB=-291.00	GT:AD:DP:GL:GQ	0/1:24,22:44:-80.67,-13.28,-95.39:99
-chr1	2442429	rs2985862	T	C	118.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=58.11;MQ0=0;OQ=446.59;QD=12.07;SB=-57.29	GT:AD:DP:GL:GQ	0/1:20,17:36:-58.79,-10.85,-82.58:99
-chr1	2442985	.	C	G	26.50	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=2.73;MQ=57.66;MQ0=0;QD=0.66;SB=53.21	GT:AD:DP:GL:GQ	0/1:27,13:28:-14.38,-8.45,-107.19:59.33
-chr1	2443996	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=0;HaplotypeScore=42.41;MQ=51.42;MQ0=0;OQ=532.54;QD=4.29;SB=-103.57	GT:AD:DP:GL:GQ	0/1:93,31:115:-91.18,-34.64,-325.86:99
-chr1	2444008	rs12757829	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=141;Dels=0.00;HRun=1;HaplotypeScore=24.89;MQ=51.04;MQ0=0;OQ=890.38;QD=6.31;SB=-413.05	GT:AD:DP:GL:GQ	0/1:89,52:127:-130.59,-38.27,-352.78:99
-chr1	2444025	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=0;HaplotypeScore=101.62;MQ=51.11;MQ0=0;OQ=575.04;QD=3.76;SB=-161.02	GT:AD:DP:GL:GQ	0/1:119,34:145:-104.47,-43.68,-467.68:99
-chr1	2444046	rs11582708	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=169;Dels=0.00;HRun=3;HaplotypeScore=36.45;MQ=48.57;MQ0=0;OQ=119.48;QD=0.71;SB=230.81	GT:AD:DP:GL:GQ	0/1:152,17:154:-61.64,-46.41,-606.32:99
-chr1	2444064	rs11583446	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=165;Dels=0.00;HRun=0;HaplotypeScore=21.72;MQ=47.52;MQ0=0;OQ=2894.91;QD=17.54;SB=-1278.77	GT:AD:DP:GL:GQ	0/1:56,109:148:-337.38,-44.60,-196.45:99
-chr1	2444078	rs2494629	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=179;Dels=0.00;HRun=0;HaplotypeScore=85.91;MQ=46.23;MQ0=1;OQ=3166.59;QD=17.69;SB=-903.91	GT:AD:DP:GL:GQ	0/1:79,100:143:-363.06,-43.11,-245.67:99
-chr1	2444084	rs11583448	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=183;Dels=0.00;HRun=0;HaplotypeScore=146.19;MQ=45.66;MQ0=1;OQ=1337.56;QD=7.31;SB=32.08	GT:AD:DP:GL:GQ	0/1:128,54:167:-187.36,-50.32,-447.47:99
-chr1	2444090	rs11582711	C	T	0.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=184;Dels=0.00;HRun=1;HaplotypeScore=9.96;MQ=45.23;MQ0=1;OQ=1767.35;QD=9.61;SB=-110.22	GT:AD:DP:GL:GQ	0/1:119,64:165:-229.73,-49.72,-378.76:99
-chr1	2444114	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=167;Dels=0.00;HRun=1;HaplotypeScore=224.24;MQ=44.82;MQ0=1;OQ=1189.56;QD=7.12;SB=-484.53	GT:AD:DP:GL:GQ	0/1:105,62:153:-168.35,-46.11,-399.99:99
-chr1	2444123	rs60947977	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=164;Dels=0.00;HRun=1;HaplotypeScore=187.19;MQ=44.56;MQ0=1;OQ=222.03;QD=1.35;SB=140.46	GT:AD:DP:GL:GQ	0/1:146,18:145:-69.17,-43.68,-451.95:99
-chr1	2444144	rs12735280	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=159;Dels=0.00;HRun=0;HaplotypeScore=41.21;MQ=45.78;MQ0=2;OQ=126.97;QD=0.80;SB=158.55	GT:AD:DP:GL:GQ	0/1:146,13:126:-53.98,-38.00,-474.20:99
-chr1	2444156	rs61763952	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=143;Dels=0.00;HRun=1;HaplotypeScore=50.63;MQ=44.65;MQ0=2;OQ=841.78;QD=5.89;SB=-177.38	GT:AD:DP:GL:GQ	0/1:107,36:119:-123.33,-35.87,-307.59:99
-chr1	2444175	.	A	G	1992.57	SnpCluster	AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=1;HaplotypeScore=57.72;MQ=43.73;MQ0=1;QD=16.74;SB=-969.28	GT:AD:DP:GL:GQ	0/1:46,73:107:-234.78,-32.23,-167.74:99
-chr1	2444179	.	C	T	733.69	SnpCluster	AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=1;HaplotypeScore=94.68;MQ=43.15;MQ0=1;QD=6.79;SB=-249.70	GT:AD:DP:GL:GQ	0/1:79,29:94:-104.98,-28.32,-236.84:99
-chr1	2444180	.	T	C	74.50	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=1;HaplotypeScore=102.88;MQ=43.30;MQ0=1;QD=0.72;SB=40.74	GT:AD:DP:GL:GQ	0/1:89,15:92:-38.46,-27.73,-318.94:99
-chr1	2444188	.	C	T	230.63	SnpCluster	AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=1;HaplotypeScore=69.58;MQ=42.94;MQ0=1;QD=2.33;SB=-68.96	GT:AD:DP:GL:GQ	0/1:80,18:83:-51.35,-25.01,-254.74:99
-chr1	2444203	rs12723596	A	G	0.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=13.04;MQ=41.89;MQ0=1;OQ=932.46;QD=10.25;SB=-166.34	GT:AD:DP:GL:GQ	0/1:48,43:72:-118.23,-21.70,-146.57:99
-chr1	2444214	.	T	G	33.51	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=1;HaplotypeScore=90.11;MQ=41.94;MQ0=0;QD=0.39;SB=20.19	GT:AD:DP:GL:GQ	0/1:75,10:71:-28.02,-21.39,-222.83:66.35
-chr1	2444236	rs3001351	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=107;Dels=0.00;HRun=1;HaplotypeScore=44.56;MQ=42.21;MQ0=1;OQ=1478.32;QD=13.82;SB=-341.03	GT:AD:DP:GL:GQ	0/1:32,75:79:-174.93,-23.81,-103.79:99
-chr1	2444239	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=1;HaplotypeScore=57.18;MQ=42.22;MQ0=1;OQ=253.01;QD=2.32;SB=-45.72	GT:AD:DP:GL:GQ	0/1:94,15:81:-52.98,-24.40,-242.61:99
-chr1	2444569	rs2494625	T	C	30.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.30;MQ0=0;OQ=234.27;QD=7.10;SB=-122.64	GT:AD:DP:GL:GQ	0/1:20,13:30:-35.75,-9.04,-76.61:99
-chr1	2445722	rs12131236	C	T	283.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=971.15;QD=13.87;SB=-406.34	GT:AD:DP:GL:GQ	0/1:39,31:69:-121.19,-20.79,-133.37:99
-chr1	2446063	rs3122922	A	G	422.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.95;MQ0=0;OQ=840.10;QD=14.48;SB=-338.93	GT:AD:DP:GL:GQ	0/1:28,30:57:-104.46,-17.17,-113.53:99
-chr1	2452678	rs2494603	T	C	117.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.28;MQ0=0;OQ=471.49;QD=14.73;SB=-130.66	GT:AD:DP:GL:GQ	0/1:12,20:28:-58.88,-8.44,-38.02:99
-chr1	2452695	rs10910087	A	G	48.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=58.97;MQ0=0;OQ=650.54;QD=14.46;SB=-235.28	GT:AD:DP:GL:GQ	0/1:22,23:45:-81.90,-13.56,-89.06:99
-chr1	2453274	rs11583602	G	A	37.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.57;MQ0=0;OQ=1048.89;QD=19.42;SB=-532.12	GT:AD:DP:GL:GQ	0/1:23,31:52:-123.83,-15.66,-80.52:99
-chr1	2453609	rs4648645	G	T	421.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=634.41;QD=13.22;SB=-255.25	GT:AD:DP:GL:GQ	0/1:25,23:48:-81.19,-14.46,-89.13:99
-chr1	2453905	rs6694195	G	A	6.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=641.00;QD=22.10;SB=-187.27	GT:AD:DP:GL:GQ	0/1:9,20:26:-75.22,-7.83,-25.34:99
-chr1	2454427	rs12406506	G	T	168.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.39;MQ0=0;OQ=384.63;QD=10.12;SB=-161.15	GT:AD:DP:GL:GQ	0/1:22,16:36:-52.59,-10.85,-75.30:99
-chr1	2454955	rs11585747	C	T	158.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=58.68;MQ0=0;OQ=442.85;QD=9.63;SB=-209.92	GT:AD:DP:GL:GQ	0/1:30,16:43:-60.53,-12.97,-87.57:99
-chr1	2455004	rs9803764	C	T	21.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.43;MQ0=0;OQ=718.09;QD=21.76;SB=-255.79	GT:AD:DP:GL:GQ	0/1:12,21:31:-84.43,-9.34,-35.39:99
-chr1	2455189	rs11584295	G	A	326.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.20;MQ=59.30;MQ0=0;OQ=897.10;QD=14.95;SB=-369.89	GT:AD:DP:GL:GQ	0/1:30,30:57:-110.18,-17.19,-92.60:99
-chr1	2455531	rs4648561	T	C	59.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=4.71;MQ=60.00;MQ0=0;OQ=506.09;QD=9.04;SB=-221.92	GT:AD:DP:GL:GQ	0/1:28,28:51:-69.27,-15.38,-110.78:99
-chr1	2455652	rs3001339	C	T	0.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=4;HaplotypeScore=3.44;MQ=59.16;MQ0=0;OQ=1028.71;QD=18.70;SB=-294.19	GT:AD:DP:GL:GQ	0/1:22,32:53:-122.12,-15.97,-77.91:99
-chr1	2455772	rs6661956	C	T	143.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=537.50;QD=14.93;SB=-189.16	GT:AD:DP:GL:GQ	0/1:19,17:35:-67.58,-10.55,-58.49:99
-chr1	2455810	rs2494605	A	G	6.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=3.59;MQ=59.41;MQ0=0;OQ=1343.57;QD=34.45;SB=-641.25	GT:AD:DP:GL:GQ	1/1:0,39:38:-137.96,-11.45,-0.01:99
-chr1	2456285	rs2985860	T	G	0.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=9.84;MQ=58.13;MQ0=0;OQ=394.22;QD=7.88;SB=-79.96	GT:AD:DP:GL:GQ	0/1:20,30:34:-52.96,-10.25,-63.38:99
-chr1	2456493	rs2494606	A	G	522.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=1382.51;QD=30.72;SB=-394.30	GT:AD:DP:GL:GQ	1/1:0,45:44:-141.87,-13.27,-0.04:99
-chr1	2460535	.	T	C	626.63	Indel	AC=1;AF=0.50;AN=2;DP=47;Dels=0.04;HRun=0;HaplotypeScore=9.81;MQ=45.54;MQ0=0;QD=13.33;SB=-234.30	GT:AD:DP:GL:GQ	0/1:22,23:45:-78.90,-12.95,-84.01:99
-chr1	2460708	rs12042279	G	A	153.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.69;MQ=58.99;MQ0=0;OQ=696.74;QD=15.15;SB=-237.53	GT:AD:DP:GL:GQ	0/1:24,22:46:-86.83,-13.87,-76.84:99
-chr1	2461941	rs1886731	T	C	87.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=203.62;QD=14.54;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,9:14:-27.87,-4.22,-19.55:99
-chr1	2462004	rs4487972	G	C	44.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=1.24;MQ=56.62;MQ0=0;OQ=71.85;QD=10.26;SB=-10.00	GT:AD:DP:GL:GQ	0/1:3,4:6:-12.28,-1.81,-12.84:99
-chr1	2464065	rs942824	T	C	72.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=1.60;MQ=59.36;MQ0=0;OQ=370.87;QD=10.30;SB=-61.73	GT:AD:DP:GL:GQ	0/1:20,16:34:-50.61,-10.24,-77.88:99
-chr1	2465072	rs10797429	G	C	201.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=57.71;MQ0=0;OQ=487.96;QD=13.19;SB=-257.25	GT:AD:DP:GL:GQ	0/1:21,16:34:-62.33,-10.25,-80.32:99
-chr1	2465334	rs55929178	C	T	11.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=4.63;MQ=56.91;MQ0=0;OQ=721.66;QD=14.73;SB=-233.74	GT:AD:DP:GL:GQ	0/1:26,23:43:-88.40,-12.95,-74.05:99
-chr1	2467218	rs12097268	T	A	23.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=190.70;QD=11.22;SB=-35.94	GT:AD:DP:GL:GQ	0/1:9,8:17:-27.48,-5.13,-30.96:99
-chr1	2468371	rs2477678	T	A	119.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=60.00;MQ0=0;OQ=463.47;QD=13.24;SB=-147.88	GT:AD:DP:GL:GQ	0/1:17,17:32:-59.27,-9.64,-59.80:99
-chr1	2469843	rs1974044	A	G	45.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=3.40;MQ=59.34;MQ0=0;OQ=371.34;QD=10.61;SB=-193.60	GT:AD:DP:GL:GQ	0/1:21,14:32:-50.06,-9.64,-71.49:99
-chr1	2471303	.	C	T	62.24	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=41.42;MQ0=6;OQ=776.47;QD=14.38;SB=-282.22	GT:AD:DP:GL:GQ	0/1:29,25:42:-93.59,-12.66,-60.88:99
-chr1	2472781	rs2147905	T	C	210.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=57.08;MQ0=0;OQ=779.17;QD=15.90;SB=-258.93	GT:AD:DP:GL:GQ	0/1:21,26:47:-95.36,-14.16,-80.25:99
-chr1	2473130	rs3748825	T	C	24.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=50.53;MQ0=0;OQ=489.49;QD=14.40;SB=-174.97	GT:AD:DP:GL:GQ	0/1:17,17:34:-62.48,-10.24,-67.15:99
-chr1	2473158	rs2985858	C	G	170.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.64;MQ=52.63;MQ0=0;OQ=759.64;QD=17.67;SB=-375.14	GT:AD:DP:GL:GQ	0/1:22,21:42:-91.90,-12.65,-91.93:99
-chr1	2474608	rs4449972	T	C	1.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=17.16;MQ0=14;OQ=59.70;QD=2.60;SB=-42.68	GT:AD:DP:GL:GQ	0/1:13,10:7:-11.36,-2.11,-16.47:92.53
-chr1	2474629	rs2764846	G	T	13.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=13.44;MQ0=12;OQ=72.28;QD=4.25;SB=-10.00	GT:AD:DP:GL:GQ	1/1:7,10:3:-10.72,-0.90,-0.00:9.03
-chr1	2474959	rs10910088	A	G	3.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=22.58;MQ0=15;OQ=106.75;QD=3.44;SB=-10.00	GT:AD:DP:GL:GQ	0/1:16,14:12:-17.58,-3.63,-21.51:99
-chr1	2475164	rs2182176	C	T	397.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=48.51;MQ0=0;OQ=552.02;QD=13.14;SB=-223.69	GT:AD:DP:GL:GQ	0/1:24,18:39:-70.24,-11.76,-69.97:99
-chr1	2475556	rs1555791	C	G	11.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=2.88;MQ=58.58;MQ0=0;OQ=550.02;QD=11.96;SB=-241.08	GT:AD:DP:GL:GQ	0/1:27,19:40:-70.37,-12.08,-87.80:99
-chr1	2475800	rs10910089	C	A	3.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=9.04;MQ=58.28;MQ0=0;OQ=671.47;QD=13.70;SB=-238.39	GT:AD:DP:GL:GQ	0/1:23,26:46:-84.29,-13.86,-77.00:99
-chr1	2476366	rs61054170	G	A	7.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=6.03;MQ=57.64;MQ0=0;OQ=224.60;QD=8.64;SB=-97.61	GT:AD:DP:GL:GQ	0/1:16,10:23:-32.68,-6.93,-48.70:99
-chr1	2476391	rs2495365	T	C	262.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=56.62;MQ0=0;OQ=373.37;QD=12.04;SB=-190.59	GT:AD:DP:GL:GQ	0/1:16,15:29:-49.36,-8.74,-57.56:99
-chr1	2476740	rs11577783	T	C	207.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=58.69;MQ0=0;OQ=459.72;QD=9.19;SB=-194.29	GT:AD:DP:GL:GQ	0/1:30,20:49:-64.03,-14.78,-111.22:99
-chr1	2476777	rs7550231	C	T	162.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.21;MQ0=0;OQ=483.70;QD=13.44;SB=-69.05	GT:AD:DP:GL:GQ	0/1:20,15:32:-61.30,-9.65,-52.93:99
-chr1	2477765	rs7515633	T	C	23.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=58.71;MQ0=0;OQ=253.35;QD=14.07;SB=-51.83	GT:AD:DP:GL:GQ	0/1:8,10:18:-34.04,-5.43,-30.81:99
-chr1	2477769	rs7544646	G	C	297.66	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=2;HaplotypeScore=6.07;MQ=56.04;MQ0=0;QD=16.54;SB=-32.86	GT:AD:DP:GL:GQ	0/1:9,9:14:-37.27,-4.22,-20.23:99
-chr1	2477776	.	G	C	10.29	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=1;HaplotypeScore=18.19;MQ=56.92;MQ0=0;QD=0.45;SB=20.10	GT:AD:DP:GL:GQ	0/1:13,10:13:-8.19,-3.92,-49.87:42.70
-chr1	2477778	.	A	C	172	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=2;HaplotypeScore=22.60;MQ=57.66;MQ0=0;QD=5.73;SB=23.08	GT:AD:DP:GL:GQ	0/1:12,18:21:-26.81,-6.33,-40.53:99
-chr1	2477836	rs2843396	C	G	11.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=3.04;MQ=59.36;MQ0=0;OQ=1290.53;QD=35.85;SB=-556.54	GT:AD:DP:GL:GQ	1/1:0,36:34:-132.68,-10.27,-0.04:99
-chr1	2478204	rs10910090	G	A	182.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=59.53;MQ0=0;OQ=449.68;QD=11.24;SB=-202.69	GT:AD:DP:GL:GQ	0/1:23,17:38:-59.71,-11.46,-71.62:99
-chr1	2479633	rs8725	C	T	49.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=1.46;MQ=59.51;MQ0=0;OQ=577.64;QD=12.29;SB=-219.70	GT:AD:DP:GL:GQ	0/1:27,20:42:-73.71,-12.66,-80.51:99
-chr1	2480088	rs2234167	C	T	215.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=60.00;MQ0=0;OQ=519.75;QD=13.33;SB=-131.13	GT:AD:DP:GL:GQ	0/1:22,17:38:-66.72,-11.46,-63.96:99
-chr1	2481753	rs11573988	C	A	159.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=59.54;MQ0=0;OQ=542.33;QD=13.23;SB=-158.65	GT:AD:DP:GL:GQ	0/1:20,21:37:-68.66,-11.14,-62.61:99
-chr1	2483213	rs2234161	G	A	326.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.71;MQ0=0;OQ=435.68;QD=12.10;SB=-173.67	GT:AD:DP:GL:GQ	0/1:20,16:32:-56.50,-9.65,-56.89:99
-chr1	2483476	rs2281852	G	T	352.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=59.50;MQ0=0;OQ=604.05;QD=13.13;SB=-299.46	GT:AD:DP:GL:GQ	0/1:23,23:43:-76.65,-12.96,-66.34:99
-chr1	2483520	rs2257763	G	T	186.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.87;MQ=58.41;MQ0=0;OQ=599.64;QD=13.63;SB=-190.60	GT:AD:DP:GL:GQ	0/1:21,23:41:-75.60,-12.36,-64.98:99
-chr1	2485488	rs2495366	C	T	214.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=59.54;MQ0=0;OQ=410.34;QD=10.01;SB=-177.87	GT:AD:DP:GL:GQ	0/1:24,17:33:-54.27,-9.95,-57.69:99
-chr1	2485810	rs1886730	A	G	395.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=201.47;QD=10.07;SB=-95.61	GT:AD:DP:GL:GQ	0/1:11,9:20:-29.46,-6.03,-42.35:99
-chr1	2486265	rs4870	T	C	17.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=53.94;MQ0=0;OQ=133.00;QD=5.54;SB=-10.85	GT:AD:DP:GL:GQ	0/1:16,8:22:-23.21,-6.63,-59.96:99
-chr1	2486652	rs2227313	A	G	323.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=361.41;QD=9.04;SB=-171.95	GT:AD:DP:GL:GQ	0/1:24,16:39:-51.18,-11.76,-90.45:99
-chr1	2486755	rs2227312	G	T	192.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.51;MQ0=0;OQ=435.37;QD=11.46;SB=-199.58	GT:AD:DP:GL:GQ	0/1:21,17:35:-57.36,-10.54,-70.01:99
-chr1	2489670	rs4449972	A	G	6.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=14.84;MQ0=21;OQ=104.96;QD=3.09;SB=-10.00	GT:AD:DP:GL:GQ	0/1:18,15:5:-15.28,-1.51,-4.27:27.62
-chr1	2489758	rs4385650	G	C	16.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=2.00;MQ=35.98;MQ0=1;OQ=450.14;QD=15.00;SB=-208.64	GT:AD:DP:GL:GQ	0/1:17,13:27:-56.44,-8.15,-54.66:99
-chr1	2490753	rs4648647	G	A	26.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=1.33;MQ=50.09;MQ0=0;OQ=371.65;QD=10.04;SB=-147.20	GT:AD:DP:GL:GQ	0/1:24,13:35:-51.00,-10.56,-68.63:99
-chr1	2490924	.	G	A	58.67	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=40.19;MQ0=3;OQ=773.22;QD=14.59;SB=-281.28	GT:AD:DP:GL:GQ	0/1:27,26:42:-93.26,-12.65,-67.56:99
-chr1	2491198	rs10797432	C	T	12.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=7.73;MQ=51.44;MQ0=1;OQ=449.43;QD=8.48;SB=-221.51	GT:AD:DP:GL:GQ	0/1:35,17:47:-62.39,-14.17,-101.99:99
-chr1	2491376	rs10910092	A	G	353.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.86;MQ0=0;OQ=953.50;QD=15.89;SB=-479.29	GT:AD:DP:GL:GQ	0/1:27,33:59:-116.41,-17.77,-105.03:99
-chr1	2491870	rs10797433	T	C	399.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.09;MQ0=0;OQ=643.74;QD=13.99;SB=-281.26	GT:AD:DP:GL:GQ	0/1:20,26:45:-81.22,-13.56,-79.26:99
-chr1	2492640	rs6667605	C	T	284.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=60.00;MQ0=0;OQ=1076.76;QD=20.32;SB=-511.53	GT:AD:DP:GL:GQ	0/1:22,31:53:-126.92,-15.96,-81.92:99
-chr1	2492694	rs6672381	A	G	59.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=2.96;MQ=59.67;MQ0=0;OQ=836.72;QD=14.68;SB=-261.21	GT:AD:DP:GL:GQ	0/1:25,31:56:-103.83,-16.88,-100.88:99
-chr1	2493042	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=3;HaplotypeScore=24.29;MQ=58.55;MQ0=0;OQ=229.07;QD=5.45;SB=41.17	GT:AD:DP:GL:GQ	0/1:24,18:31:-35.54,-9.35,-97.62:99
-chr1	2494094	rs6671426	C	A	112.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=782.65;QD=13.98;SB=-297.63	GT:AD:DP:GL:GQ	0/1:30,26:56:-98.41,-16.86,-108.17:99
-chr1	2494223	rs28734787	T	C	285.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.94;MQ=59.74;MQ0=0;OQ=1016.84;QD=14.32;SB=-488.08	GT:AD:DP:GL:GQ	0/1:37,34:71:-126.35,-21.38,-153.97:99
-chr1	2495573	rs10910093	C	T	602.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1162.34;QD=15.92;SB=-466.49	GT:AD:DP:GL:GQ	0/1:38,35:73:-141.53,-22.01,-121.32:99
-chr1	2496089	rs55658746	T	C	89.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.87;MQ=57.64;MQ0=0;OQ=790.54;QD=12.35;SB=-411.26	GT:AD:DP:GL:GQ	0/1:36,28:63:-101.32,-18.98,-139.07:99
-chr1	2496219	rs2477685	G	T	165.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=55.91;MQ0=0;OQ=1646.89;QD=32.29;SB=-779.73	GT:AD:DP:GL:GQ	1/1:1,50:48:-168.30,-14.46,-0.02:99
-chr1	2496348	rs10910094	C	T	138.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=47.91;MQ0=1;OQ=444.30;QD=9.66;SB=-141.63	GT:AD:DP:GL:GQ	0/1:26,19:40:-59.77,-12.06,-79.45:99
-chr1	2497303	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=4;HaplotypeScore=6.77;MQ=59.20;MQ0=0;OQ=63.06;QD=2.17;SB=17.06	GT:AD:DP:GL:GQ	0/1:13,16:15:-14.11,-4.52,-33.25:95.89
-chr1	2497798	rs10752745	A	G	23.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=2.74;MQ=53.22;MQ0=0;OQ=566.34;QD=12.59;SB=-208.51	GT:AD:DP:GL:GQ	0/1:24,21:42:-72.57,-12.65,-89.49:99
-chr1	2498203	rs6675676	G	C	138.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=30.17;MQ0=2;OQ=540.65;QD=15.02;SB=-227.70	GT:AD:DP:GL:GQ	0/1:18,18:32:-67.01,-9.66,-62.30:99
-chr1	2500615	rs10910095	G	A	293.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=53.83;MQ0=0;OQ=619.40;QD=15.49;SB=-326.87	GT:AD:DP:GL:GQ	0/1:18,21:35:-75.77,-10.55,-51.15:99
-chr1	2501140	rs10797434	C	T	359.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.30;MQ=59.72;MQ0=0;OQ=1006.21;QD=15.25;SB=-442.36	GT:AD:DP:GL:GQ	0/1:35,31:65:-123.49,-19.58,-121.16:99
-chr1	2501248	rs12129508	G	A	509.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1099.72;QD=18.33;SB=-426.78	GT:AD:DP:GL:GQ	0/1:28,32:59:-131.03,-17.77,-95.59:99
-chr1	2502312	rs4648648	G	A	10.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=5.67;MQ=56.86;MQ0=0;OQ=538.80;QD=17.96;SB=-254.77	GT:AD:DP:GL:GQ	0/1:13,17:27:-65.30,-8.13,-39.62:99
-chr1	2502510	rs4648649	T	C	255.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=58.39;MQ0=0;OQ=590.46;QD=13.42;SB=-228.32	GT:AD:DP:GL:GQ	0/1:17,27:40:-74.40,-12.07,-60.31:99
-chr1	2502570	rs10910096	T	C	112.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.22;MQ0=0;OQ=671.99;QD=19.20;SB=-218.66	GT:AD:DP:GL:GQ	0/1:13,22:35:-81.03,-10.54,-52.21:99
-chr1	2502755	.	G	A	190.59	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=20;HaplotypeScore=16.86;MQ=48.05;MQ0=1;QD=2.32;SB=89.22	GT:AD:DP:GL:GQ	0/1:62,20:60:-40.44,-18.10,-157.12:99
-chr1	2502759	.	G	A	95.63	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=4;HaplotypeScore=8.02;MQ=49.03;MQ0=1;QD=1.15;SB=92.21	GT:AD:DP:GL:GQ	0/1:62,21:60:-30.94,-18.09,-170.87:99
-chr1	2502764	.	G	A	61.94	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=4;HaplotypeScore=11.73;MQ=52.06;MQ0=1;QD=0.77;SB=101.27	GT:AD:DP:GL:GQ	0/1:64,16:66:-29.37,-19.89,-196.86:94.78
-chr1	2502769	.	G	A	36.83	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=4;HaplotypeScore=29.21;MQ=54.00;MQ0=1;QD=0.49;SB=101.32	GT:AD:DP:GL:GQ	0/1:66,9:67:-27.16,-20.19,-206.36:69.66
-chr1	2502915	rs4486391	A	T	575.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=706.11;QD=12.61;SB=-348.36	GT:AD:DP:GL:GQ	0/1:31,25:55:-90.46,-16.56,-121.47:99
-chr1	2502965	rs735000	C	T	134.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=59.41;MQ0=0;OQ=774.05;QD=19.85;SB=-347.38	GT:AD:DP:GL:GQ	0/1:16,23:37:-91.84,-11.15,-44.36:99
-chr1	2503076	rs734999	C	T	284.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=51.96;MQ0=0;OQ=837.38;QD=13.51;SB=-164.65	GT:AD:DP:GL:GQ	0/1:35,27:61:-105.40,-18.37,-127.82:99
-chr1	2503492	rs2016175	C	G	123.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.61;MQ=50.82;MQ0=0;OQ=1084.11;QD=19.71;SB=-398.00	GT:AD:DP:GL:GQ	0/1:24,31:54:-127.97,-16.28,-102.13:99
-chr1	2503538	rs2016366	A	T	76.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=3.79;MQ=51.20;MQ0=0;OQ=1061.50;QD=16.33;SB=-509.95	GT:AD:DP:GL:GQ	0/1:31,34:63:-128.41,-18.98,-104.88:99
-chr1	2504435	rs2094074	C	T	20.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=6.13;MQ=59.30;MQ0=0;OQ=1039.69;QD=17.04;SB=-426.84	GT:AD:DP:GL:GQ	0/1:29,32:61:-125.64,-18.39,-96.67:99
-chr1	2506299	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=15.52;MQ=57.83;MQ0=0;OQ=93.19;QD=2.39;SB=56.19	GT:AD:DP:GL:GQ	0/1:27,12:31:-21.95,-9.34,-90.63:99
-chr1	2511290	rs10910097	C	T	251.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=59.70;MQ0=0;OQ=1148.10;QD=18.52;SB=-511.69	GT:AD:DP:GL:GQ	0/1:27,35:61:-136.47,-18.38,-99.00:99
-chr1	2512252	rs2296443	G	A	195.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=59.53;MQ0=0;OQ=544.43;QD=13.61;SB=-235.74	GT:AD:DP:GL:GQ	0/1:18,22:33:-67.68,-9.95,-51.18:99
-chr1	2515036	.	A	C	42.97	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=58.51;MQ0=0;OQ=337.76;QD=7.68;SB=-183.81	GT:AD:DP:GL:GQ	0/1:27,17:42:-49.72,-12.66,-93.24:99
-chr1	2517538	rs2260976	A	G	4.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=2.14;MQ=56.76;MQ0=0;OQ=1272.91;QD=31.05;SB=-372.36	GT:AD:DP:GL:GQ	1/1:0,41:39:-130.90,-11.76,-0.03:99
-chr1	2517993	rs2843401	T	C	105.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=57.77;MQ0=0;OQ=962.33;QD=26.73;SB=-342.23	GT:AD:DP:GL:GQ	1/1:0,36:31:-99.85,-9.36,-0.04:93.19
-chr1	2518542	rs2843402	T	C	221.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=60.00;MQ0=0;OQ=1968.59;QD=35.79;SB=-942.98	GT:AD:DP:GL:GQ	1/1:0,55:55:-200.46,-16.56,-0.01:99
-chr1	2518859	rs2764845	G	T	123.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=60.00;MQ0=0;OQ=1822.58;QD=33.75;SB=-893.66	GT:AD:DP:GL:GQ	1/1:0,54:52:-185.86,-15.67,-0.02:99
-chr1	2518957	rs2843403	T	C	21.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=1.02;MQ=56.17;MQ0=0;OQ=926.62;QD=29.89;SB=-317.56	GT:AD:DP:GL:GQ	1/1:0,31:28:-96.27,-8.44,-0.02:84.21
-chr1	2519052	rs2764842	A	G	76.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=1201.00;QD=30.79;SB=-460.21	GT:AD:DP:GL:GQ	1/1:0,39:38:-123.72,-11.46,-0.03:99
-chr1	2519220	rs2764841	G	A	268.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=59.01;MQ0=0;OQ=1602.47;QD=34.10;SB=-756.02	GT:AD:DP:GL:GQ	1/1:0,46:43:-163.85,-12.96,-0.02:99
-chr1	2519297	rs2764840	C	T	22.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=4.04;MQ=57.55;MQ0=0;OQ=1701.90;QD=37.00;SB=-691.34	GT:AD:DP:GL:GQ	1/1:0,46:43:-173.78,-12.95,-0.01:99
-chr1	2520418	rs2843404	T	C	200.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.75;MQ0=0;OQ=2535.27;QD=33.80;SB=-857.06	GT:AD:DP:GL:GQ	1/1:0,75:73:-257.13,-21.99,-0.02:99
-chr1	2520554	rs2764848	G	A	508.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2620.71;QD=40.32;SB=-1288.71	GT:AD:DP:GL:GQ	1/1:0,65:65:-265.67,-19.58,-0.01:99
-chr1	2521232	rs2985855	A	C	625.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.53;MQ0=0;OQ=2344.13;QD=34.47;SB=-1125.14	GT:AD:DP:GL:GQ	1/1:0,68:67:-238.02,-20.18,-0.02:99
-chr1	2521327	rs6689711	T	C	152.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.71;MQ0=0;OQ=2140.18;QD=32.93;SB=-405.31	GT:AD:DP:GL:GQ	1/1:0,65:64:-217.64,-19.29,-0.04:99
-chr1	2521365	rs6681973	C	T	205.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=1951.81;QD=38.27;SB=-716.95	GT:AD:DP:GL:GQ	1/1:0,51:50:-198.79,-15.07,-0.02:99
-chr1	2521374	rs6682043	C	A	555.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=1757.71;QD=35.87;SB=-715.96	GT:AD:DP:GL:GQ	1/1:0,49:49:-179.37,-14.76,-0.01:99
-chr1	2521839	.	A	G	1244.02	Indel	AC=2;AF=1.00;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.74;MQ0=0;QD=31.90;SB=-233.75	GT:AD:DP:GL:GQ	1/1:1,38:37:-132.07,-11.15,-4.08:70.65
-chr1	2522276	rs2985859	T	C	630.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=55.35;MQ0=0;OQ=2205.91;QD=35.58;SB=-1051.93	GT:AD:DP:GL:GQ	1/1:0,62:62:-224.19,-18.67,-0.02:99
-chr1	2522366	rs3001837	G	A	528.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.76;MQ0=0;OQ=2660.16;QD=39.12;SB=-1251.03	GT:AD:DP:GL:GQ	1/1:0,68:68:-269.62,-20.49,-0.02:99
-chr1	2522484	rs2985857	C	T	472.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=3579.52;QD=41.62;SB=-1476.96	GT:AD:DP:GL:GQ	1/1:0,86:86:-356.95,-25.90,-0.02:99
-chr1	2522759	rs6424092	C	A	529.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2798.98;QD=36.83;SB=-1322.91	GT:AD:DP:GL:GQ	1/1:0,76:75:-283.50,-22.58,-0.01:99
-chr1	2523213	.	A	C	18.95	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=2;HaplotypeScore=7.65;MQ=59.48;MQ0=0;QD=0.43;SB=47.15	GT:AD:DP:GL:GQ	0/1:27,17:32:-14.82,-9.65,-87.52:51.73
-chr1	2530333	.	T	C	29.61	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=7.38;MQ=54.61;MQ0=1;QD=0.64;SB=33.57	GT:AD:DP:GL:GQ	0/1:37,5:39:-21.30,-15.06,-133.42:62.44
-chr1	2530381	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=20.91;MQ=54.33;MQ0=2;OQ=131.02;QD=2.85;SB=56.21	GT:AD:DP:GL:GQ	0/1:39,7:40:-28.44,-12.05,-138.25:99
-chr1	2537888	rs4379628	A	G	6.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=4.46;MQ=59.75;MQ0=0;OQ=2299.26;QD=31.07;SB=-964.39	GT:AD:DP:GL:GQ	1/1:0,74:72:-233.58,-21.72,-0.07:99
-chr1	2541362	.	T	C	301.82	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=1099.72;QD=15.94;SB=-567.63	GT:AD:DP:GL:GQ	0/1:31,38:67:-133.44,-20.18,-122.76:99
-chr1	2541645	rs12117343	C	T	412.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=59.64;MQ0=0;OQ=1073.30;QD=16.77;SB=-513.05	GT:AD:DP:GL:GQ	0/1:32,32:63:-129.60,-18.99,-99.14:99
-chr1	2543980	rs61765771	T	G	318.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=60.00;MQ0=0;OQ=635.63;QD=14.45;SB=-332.88	GT:AD:DP:GL:GQ	0/1:20,24:43:-79.80,-12.95,-72.63:99
-chr1	2546847	.	G	A	17.21	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=58.27;MQ0=0;OQ=1072.92;QD=19.87;SB=-329.89	GT:AD:DP:GL:GQ	0/1:19,35:49:-125.34,-14.77,-58.33:99
-chr1	2547051	rs7523364	C	T	194.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=55.15;MQ0=0;OQ=3310.62;QD=39.41;SB=-1353.31	GT:AD:DP:GL:GQ	1/1:0,84:83:-330.06,-25.01,-0.03:99
-chr1	2547391	rs6422657	C	T	186.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=60.00;MQ0=0;OQ=2783.42;QD=38.13;SB=-1334.38	GT:AD:DP:GL:GQ	1/1:1,71:72:-284.61,-21.69,-2.69:99
-chr1	2548168	rs6668149	A	C	205.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.44;MQ0=0;OQ=2627.68;QD=35.04;SB=-1288.37	GT:AD:DP:GL:GQ	1/1:0,75:74:-266.37,-22.29,-0.02:99
-chr1	2548600	rs12748729	C	T	627.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=2890.24;QD=37.05;SB=-1331.37	GT:AD:DP:GL:GQ	1/1:0,78:77:-292.65,-23.21,-0.04:99
-chr1	2549449	rs12730932	T	G	82.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.16;MQ0=0;OQ=1601.53;QD=32.03;SB=-737.35	GT:AD:DP:GL:GQ	1/1:0,50:47:-163.76,-14.16,-0.02:99
-chr1	2550595	rs4648657	A	G	5.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.33;MQ0=0;OQ=350.17;QD=25.01;SB=-43.68	GT:AD:DP:GL:GQ	1/1:0,14:13:-38.62,-3.93,-0.02:39.06
-chr1	2550742	rs4648658	G	A	10.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.23;MQ0=0;OQ=551.80;QD=32.46;SB=-125.66	GT:AD:DP:GL:GQ	1/1:0,17:15:-58.77,-4.52,-0.01:45.14
-chr1	2550763	rs4648659	T	G	0.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=55.52;MQ0=0;OQ=309.18;QD=19.32;SB=-86.14	GT:AD:DP:GL:GQ	1/1:0,16:12:-34.52,-3.62,-0.02:36.01
-chr1	2551146	rs28532547	T	G	110.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=53.21;MQ0=0;OQ=1059.23;QD=30.26;SB=-548.02	GT:AD:DP:GL:GQ	1/1:0,35:32:-109.53,-9.64,-0.02:96.26
-chr1	2552029	rs4648564	C	T	0.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=7.47;MQ=58.85;MQ0=1;OQ=2625.23;QD=39.18;SB=-1028.39	GT:AD:DP:GL:GQ	1/1:1,66:66:-266.13,-19.88,-0.02:99
-chr1	2553110	rs12749591	G	T	349.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=723.50;QD=32.89;SB=-266.61	GT:AD:DP:GL:GQ	1/1:0,22:22:-75.95,-6.63,-0.01:66.17
-chr1	2553270	.	G	T	45.57	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=10.71;MQ=58.27;MQ0=0;QD=1.69;SB=20.06	GT:AD:DP:GL:GQ	0/1:17,10:20:-13.87,-6.03,-50.95:78.40
-chr1	2554043	rs6698817	T	C	9.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.30;MQ0=0;OQ=887.43;QD=26.89;SB=-424.17	GT:AD:DP:GL:GQ	1/1:0,33:29:-92.36,-8.75,-0.03:87.20
-chr1	2554325	rs12752515	T	C	17.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.11;MQ0=0;OQ=775.65;QD=29.83;SB=-403.34	GT:AD:DP:GL:GQ	1/1:0,26:25:-81.17,-7.54,-0.02:75.18
-chr1	2554665	rs12723864	A	G	160.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=60.00;MQ0=0;OQ=414.17;QD=9.86;SB=-197.61	GT:AD:DP:GL:GQ	0/1:26,16:42:-57.35,-12.65,-104.43:99
-chr1	2555187	rs55649610	G	T	258.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=951.34;QD=20.68;SB=-431.11	GT:AD:DP:GL:GQ	0/1:14,32:46:-112.28,-13.86,-47.81:99
-chr1	2555885	.	C	T	1.81	PASS	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=57.89;MQ0=0;OQ=690.84;QD=23.82;SB=-291.84	GT:AD:DP:GL:GQ	0/1:8,21:28:-80.81,-8.44,-25.16:99
-chr1	2556197	.	T	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=1;HaplotypeScore=11.22;MQ=54.79;MQ0=0;OQ=66.20;QD=3.31;SB=-59.09	GT:AD:DP:GL:GQ	0/1:16,4:14:-14.12,-4.22,-33.87:99
-chr1	2556342	rs6657378	T	G	21.29	LowQual	AC=1;AF=0.50;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=3.31;MQ=37.32;MQ0=0;QD=3.04;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,2:5:-6.92,-1.51,-9.22:54.10
-chr1	2556350	rs6671623	G	A	0.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=1;HaplotypeScore=6.12;MQ=40.03;MQ0=1;OQ=207.84;QD=25.98;SB=-95.34	GT:AD:DP:GL:GQ	1/1:1,7:6:-24.36,-1.81,-0.00:18.06
-chr1	2556357	rs6671625	G	A	182.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.68;MQ0=1;OQ=89.01;QD=14.84;SB=-50.56	GT:AD:DP:GL:GQ	1/1:1,5:3:-12.39,-0.90,-0.00:9.03
-chr1	2556483	rs61765773	C	T	0.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=11.29;MQ=45.87;MQ0=1;OQ=153.35;QD=5.11;SB=26.06	GT:AD:DP:GL:GQ	0/1:23,7:20:-24.65,-6.03,-43.69:99
-chr1	2556797	rs61765774	G	C	178.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.58;MQ0=0;OQ=587.02;QD=17.79;SB=-197.49	GT:AD:DP:GL:GQ	0/1:16,17:32:-71.63,-9.64,-64.58:99
-chr1	2557281	rs12756665	C	T	187.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.25;MQ=59.28;MQ0=0;OQ=722.29;QD=11.29;SB=-327.75	GT:AD:DP:GL:GQ	0/1:40,24:64:-94.79,-19.28,-146.15:99
-chr1	2557351	rs12739597	A	G	96.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=59.10;MQ0=0;OQ=470.82;QD=7.03;SB=-215.20	GT:AD:DP:GL:GQ	0/1:44,23:67:-70.56,-20.20,-177.79:99
-chr1	2557360	rs6666788	A	G	33.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=2.28;MQ=59.11;MQ0=0;OQ=2385.56;QD=35.08;SB=-1067.87	GT:AD:DP:GL:GQ	1/1:0,68:67:-242.16,-20.18,-0.02:99
-chr1	2558285	rs4648661	T	C	264.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.64;MQ=58.76;MQ0=0;OQ=708.13;QD=11.80;SB=-352.07	GT:AD:DP:GL:GQ	0/1:29,30:58:-91.59,-17.49,-110.76:99
-chr1	2559883	rs4648565	A	G	68.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=1657.37;QD=34.53;SB=-734.30	GT:AD:DP:GL:GQ	1/1:0,48:47:-169.34,-14.16,-0.02:99
-chr1	2561683	rs28690427	A	G	44.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.48;MQ0=0;OQ=1625.27;QD=33.17;SB=-564.36	GT:AD:DP:GL:GQ	1/1:0,49:47:-166.13,-14.16,-0.02:99
-chr1	2563059	rs4648662	A	G	36.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=57.88;MQ0=0;OQ=986.78;QD=31.83;SB=-278.44	GT:AD:DP:GL:GQ	1/1:0,30:28:-102.27,-8.43,-0.01:84.25
-chr1	2563587	rs4648663	A	C	432.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=1398.67;QD=33.30;SB=-656.05	GT:AD:DP:GL:GQ	1/1:0,42:41:-143.47,-12.35,-0.02:99
-chr1	2563763	rs12726651	C	T	270.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.90;MQ0=0;OQ=164.81;QD=9.69;SB=-74.06	GT:AD:DP:GL:GQ	0/1:11,6:16:-24.59,-4.82,-34.68:99
-chr1	2563938	rs9970196	T	C	22.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.81;MQ=59.28;MQ0=0;OQ=1014.31;QD=31.70;SB=-295.06	GT:AD:DP:GL:GQ	1/1:0,32:30:-105.04,-9.04,-0.02:90.22
-chr1	2566315	rs6604989	T	C	18.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.60;MQ0=0;OQ=1647.45;QD=28.40;SB=-794.64	GT:AD:DP:GL:GQ	1/1:0,58:52:-168.38,-15.68,-0.05:99
-chr1	2568080	rs12744876	G	T	183.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.61;MQ=58.84;MQ0=0;OQ=1106.09;QD=17.02;SB=-318.70	GT:AD:DP:GL:GQ	0/1:29,35:64:-133.17,-19.27,-104.78:99
-chr1	2571402	rs28611770	A	G	632.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.32;MQ0=1;OQ=2534.42;QD=35.20;SB=-1124.79	GT:AD:DP:GL:GQ	1/1:0,72:70:-257.05,-21.08,-0.02:99
-chr1	2571473	.	C	T	26.42	PASS	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=54.51;MQ0=1;OQ=420.48;QD=8.58;SB=-192.15	GT:AD:DP:GL:GQ	0/1:33,16:41:-57.68,-12.35,-93.81:99
-chr1	2571476	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=3;HaplotypeScore=3.65;MQ=54.65;MQ0=1;OQ=290.92;QD=5.94;SB=-124.22	GT:AD:DP:GL:GQ	0/1:34,15:41:-44.73,-12.36,-110.26:99
-chr1	2571505	.	C	T	0.62	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=52.42;MQ0=0;OQ=231.01;QD=4.20;SB=-18.13	GT:AD:DP:GL:GQ	0/1:42,13:52:-42.05,-15.67,-144.47:99
-chr1	2571527	.	A	T	14.96	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.42;MQ=51.64;MQ0=0;OQ=434.87;QD=7.91;SB=-142.65	GT:AD:DP:GL:GQ	0/1:35,20:51:-62.14,-15.37,-122.01:99
-chr1	2572200	rs12732266	C	G	51.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=5.49;MQ=58.04;MQ0=0;OQ=559.70;QD=11.91;SB=-261.11	GT:AD:DP:GL:GQ	0/1:26,21:41:-71.62,-12.36,-99.19:99
-chr1	2573315	rs12738064	C	T	887.13	DPFilter;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=133;Dels=0.00;HRun=0;HaplotypeScore=171.89;MQ=24.26;MQ0=9;QD=6.67;SB=-137.01	GT:AD:DP:GL:GQ	1/1:10,119:25:-96.41,-11.12,-4.11:70.06
-chr1	2573322	.	T	G	343.20	DPFilter;SnpCluster	AC=2;AF=1.00;AN=2;DP=144;Dels=0.01;HRun=0;HaplotypeScore=333.45;MQ=22.10;MQ0=11;QD=2.38;SB=-10.00	GT:AD:DP:GL:GQ	1/1:29,104:11:-37.91,-3.31,-0.00:33.09
-chr1	2573323	.	C	G	95.88	DPFilter;SnpCluster	AC=2;AF=1.00;AN=2;DP=144;Dels=0.01;HRun=1;HaplotypeScore=342.46;MQ=22.10;MQ0=11;QD=0.67;SB=-10.00	GT:AD:DP:GL:GQ	1/1:103,36:3:-13.08,-0.90,-0.00:9.03
-chr1	2573324	.	G	C	506.46	DPFilter;Indel;SnpCluster	AC=2;AF=1.00;AN=2;DP=147;Dels=0.01;HRun=1;HaplotypeScore=339.64;MQ=22.28;MQ0=11;QD=3.45;SB=-10.00	GT:AD:DP:GL:GQ	1/1:15,116:14:-57.88,-7.75,-3.65:41.01
-chr1	2573329	rs12734173	G	A	146.94	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=218;Dels=0.00;HRun=1;HaplotypeScore=513.41;MQ=21.01;MQ0=20;QD=0.67;SB=-10.00	GT:AD:DP:GL:GQ	0/1:132,84:24:-25.21,-7.23,-67.73:99
-chr1	2573338	.	C	G	83.26	DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=290;Dels=0.00;HRun=0;HaplotypeScore=710.09;MQ=20.03;MQ0=40;QD=0.29;SB=-0.97	GT:AD:DP:GL:GQ	0/1:254,26:38:-23.06,-11.45,-135.55:99
-chr1	2573342	.	C	A	213.70	DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=322;Dels=0.00;HRun=1;HaplotypeScore=673.88;MQ=20.07;MQ0=46;QD=0.66;SB=1.99	GT:AD:DP:GL:GQ	0/1:277,45:41:-37.01,-12.35,-108.15:99
-chr1	2573345	.	A	C	1425.86	DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=338;Dels=0.02;HRun=3;HaplotypeScore=632.90;MQ=20.26;MQ0=48;QD=4.22;SB=-172.79	GT:AD:DP:GL:GQ	0/1:132,186:90:-176.25,-30.38,-146.77:99
-chr1	2573350	.	T	C	293.04	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=399;Dels=0.00;HRun=0;HaplotypeScore=691.94;MQ=19.84;MQ0=54;QD=0.73;SB=44.71	GT:AD:DP:GL:GQ	0/1:277,71:78:-104.74,-72.15,-238.43:99
-chr1	2573354	.	C	A	62.42	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=432;Dels=0.00;HRun=1;HaplotypeScore=848.73;MQ=19.94;MQ0=56;QD=0.14;SB=50.16	GT:AD:DP:GL:GQ	0/1:379,40:51:-24.89,-15.36,-155.69:95.25
-chr1	2573358	.	T	C	129.61	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=457;Dels=0.00;HRun=1;HaplotypeScore=683.78;MQ=19.93;MQ0=58;QD=0.28;SB=-34.65	GT:AD:DP:GL:GQ	0/1:367,56:52:-42.68,-26.43,-169.09:99
-chr1	2573364	rs55738582	C	G	575.47	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=473;Dels=0.00;HRun=1;HaplotypeScore=961.37;MQ=19.71;MQ0=62;QD=1.22;SB=-67.52	GT:AD:DP:GL:GQ	0/1:411,23:43:-73.79,-12.96,-105.12:99
-chr1	2573370	rs55790383	G	A	775.08	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=470;Dels=0.00;HRun=1;HaplotypeScore=917.62;MQ=19.72;MQ0=61;QD=1.65;SB=-367.90	GT:AD:DP:GL:GQ	0/1:265,173:48:-98.76,-17.97,-89.48:99
-chr1	2573371	rs55657722	G	C	3489.08	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=470;Dels=0.00;HRun=0;HaplotypeScore=944.58;MQ=19.72;MQ0=61;QD=7.42;SB=-1002.13	GT:AD:DP:GL:GQ	1/1:47,398:84:-347.91,-28.85,-3.68:99
-chr1	2573372	.	A	G	46.25	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=482;Dels=0.00;HRun=2;HaplotypeScore=999.26;MQ=19.79;MQ0=62;QD=0.10;SB=26.11	GT:AD:DP:GL:GQ	0/1:425,48:54:-24.18,-16.27,-184.96:79.08
-chr1	2573374	.	C	A	193.31	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=490;Dels=0.00;HRun=1;HaplotypeScore=979.59;MQ=19.99;MQ0=60;QD=0.39;SB=-75.64	GT:AD:DP:GL:GQ	0/1:438,45:65:-48.93,-26.32,-189.47:99
-chr1	2573382	.	C	A	261.06	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=502;Dels=0.01;HRun=1;HaplotypeScore=946.29;MQ=19.95;MQ0=64;QD=0.52;SB=17.04	GT:AD:DP:GL:GQ	0/1:391,72:71:-67.99,-38.60,-197.52:99
-chr1	2573383	.	C	G	55.13	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=502;Dels=0.00;HRun=0;HaplotypeScore=899.21;MQ=20.04;MQ0=63;QD=0.11;SB=37.79	GT:AD:DP:GL:GQ	0/1:438,33:65:-35.38,-26.59,-240.37:87.97
-chr1	2573385	.	C	A	145.75	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=503;Dels=0.00;HRun=0;HaplotypeScore=828.45;MQ=20.02;MQ0=64;QD=0.29;SB=-23.06	GT:AD:DP:GL:GQ	0/1:432,48:49:-35.99,-18.13,-141.74:99
-chr1	2573390	.	T	C	166.49	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=483;Dels=0.01;HRun=0;HaplotypeScore=660.44;MQ=20.15;MQ0=61;QD=0.34;SB=-43.82	GT:AD:DP:GL:GQ	0/1:342,96:43:-35.67,-15.74,-120.66:99
-chr1	2573404	rs56352113	A	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=412;Dels=0.00;HRun=1;HaplotypeScore=785.14;MQ=20.24;MQ0=50;OQ=1746.05;QD=4.24;SB=-272.76	GT:AD:DP:GL:GQ	1/1:48,316:72:-242.08,-66.55,-63.89:26.61
-chr1	2573410	rs12759490	A	G	148.65	DPFilter;HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DB;DP=383;Dels=0.00;HRun=0;HaplotypeScore=682.21;MQ=20.35;MQ0=44;QD=0.39;SB=-43.26	GT:AD:DP:GL:GQ	0/1:276,96:57:-35.34,-17.19,-178.84:99
-chr1	2573423	.	C	A	163.64	DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=284;Dels=0.00;HRun=1;HaplotypeScore=927.03;MQ=21.34;MQ0=33;QD=0.58;SB=26.07	GT:AD:DP:GL:GQ	0/1:224,38:48:-34.11,-14.46,-128.40:99
-chr1	2573426	.	C	A	487.43	DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=275;Dels=0.00;HRun=0;HaplotypeScore=598.86;MQ=21.74;MQ0=31;QD=1.77;SB=-144.61	GT:AD:DP:GL:GQ	0/1:229,39:67:-72.21,-20.18,-167.89:99
-chr1	2573431	.	T	A	55.01	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=244;Dels=0.00;HRun=0;HaplotypeScore=414.88;MQ=22.20;MQ0=23;QD=0.23;SB=-37.64	GT:AD:DP:GL:GQ	0/1:198,17:62:-42.64,-33.85,-190.83:87.85
-chr1	2573439	rs12738268	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=199;Dels=0.00;HRun=0;HaplotypeScore=197.41;MQ=23.56;MQ0=17;OQ=1379.28;QD=6.93;SB=-473.52	GT:AD:DP:GL:GQ	0/1:75,107:51:-156.58,-15.37,-36.65:99
-chr1	2573442	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=194;Dels=0.00;HRun=0;HaplotypeScore=181.20;MQ=23.67;MQ0=14;OQ=103.36;QD=0.53;SB=32.13	GT:AD:DP:GL:GQ	0/1:179,11:55:-39.39,-25.77,-162.27:99
-chr1	2573451	.	A	G	329.45	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=156;Dels=0.00;HRun=0;HaplotypeScore=168.85;MQ=25.71;MQ0=9;QD=2.11;SB=-36.23	GT:AD:DP:GL:GQ	0/1:80,76:54:-52.50,-16.27,-154.97:99
-chr1	2573454	rs55760918	C	G	556.39	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=140;Dels=0.00;HRun=0;HaplotypeScore=206.74;MQ=26.90;MQ0=8;QD=3.97;SB=-52.80	GT:AD:DP:GL:GQ	0/1:46,88:51:-74.30,-15.38,-138.45:99
-chr1	2573455	rs56258540	A	C	134.39	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=145;Dels=0.00;HRun=1;HaplotypeScore=218.70;MQ=26.73;MQ0=9;QD=0.93;SB=-34.89	GT:AD:DP:GL:GQ	0/1:91,52:51:-34.62,-17.90,-142.52:99
-chr1	2573485	rs55714819	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=241;Dels=0.00;HRun=1;HaplotypeScore=172.11;MQ=27.92;MQ0=9;OQ=766.38;QD=3.18;SB=-61.60	GT:AD:DP:GL:GQ	0/1:152,84:106:-115.24,-35.32,-271.38:99
-chr1	2573510	rs61765777	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=332;Dels=0.00;HRun=1;HaplotypeScore=336.11;MQ=27.14;MQ0=14;OQ=2271.13;QD=6.84;SB=-383.23	GT:AD:DP:GL:GQ	0/1:103,229:130:-269.56,-39.16,-232.28:99
-chr1	2573523	.	C	T	271.88	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=476;Dels=0.00;HRun=0;HaplotypeScore=388.59;MQ=26.03;MQ0=25;QD=0.57;SB=-54.44	GT:AD:DP:GL:GQ	0/1:421,51:171:-82.00,-51.53,-495.80:99
-chr1	2573524	.	G	A	673.59	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=489;Dels=0.00;HRun=0;HaplotypeScore=381.72;MQ=26.07;MQ0=26;QD=1.38;SB=-235.66	GT:AD:DP:GL:GQ	0/1:348,136:174:-123.14,-52.50,-452.42:99
-chr1	2573532	.	A	G	266.78	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=584;Dels=0.00;HRun=0;HaplotypeScore=454.81;MQ=26.29;MQ0=38;QD=0.46;SB=-50.09	GT:AD:DP:GL:GQ	0/1:462,118:225:-100.76,-70.80,-803.69:99
-chr1	2573533	.	C	T	518.62	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=590;Dels=0.00;HRun=0;HaplotypeScore=454.86;MQ=26.25;MQ0=38;QD=0.88;SB=-177.22	GT:AD:DP:GL:GQ	0/1:555,34:221:-123.94,-68.80,-639.87:99
-chr1	2573545	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=760;Dels=0.00;HRun=0;HaplotypeScore=554.01;MQ=25.28;MQ0=58;OQ=2752.41;QD=3.62;SB=-334.08	GT:AD:DP:GL:GQ	0/1:504,247:275:-368.19,-89.67,-758.94:99
-chr1	2573551	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=816;Dels=0.00;HRun=0;HaplotypeScore=706.82;MQ=24.77;MQ0=61;OQ=92.57;QD=0.11;SB=99.33	GT:AD:DP:GL:GQ	0/1:767,48:306:-104.74,-92.20,-1021.89:99
-chr1	2573560	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=935;Dels=0.00;HRun=0;HaplotypeScore=771.90;MQ=24.19;MQ0=82;OQ=1354.07;QD=1.45;SB=-436.68	GT:AD:DP:GL:GQ	0/1:723,199:339:-248.95,-110.26,-942.99:99
-chr1	2573563	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=967;Dels=0.00;HRun=0;HaplotypeScore=867.36;MQ=23.97;MQ0=86;OQ=1389.93;QD=1.44;SB=161.22	GT:AD:DP:GL:GQ	0/1:819,137:345:-262.46,-120.18,-962.42:99
-chr1	2573572	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=1012;Dels=0.00;HRun=0;HaplotypeScore=731.51;MQ=23.62;MQ0=98;OQ=634.63;QD=0.63;SB=-79.47	GT:AD:DP:GL:GQ	0/1:773,210:334:-172.80,-106.05,-1139.69:99
-chr1	2573600	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=878;Dels=0.00;HRun=0;HaplotypeScore=653.71;MQ=23.12;MQ0=120;OQ=1122.68;QD=1.28;SB=-567.08	GT:AD:DP:GL:GQ	0/1:678,154:296:-246.10,-130.55,-807.07:99
-chr1	2573603	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=862;Dels=0.00;HRun=0;HaplotypeScore=618.67;MQ=23.10;MQ0=123;OQ=316.50;QD=0.37;SB=-169.71	GT:AD:DP:GL:GQ	0/1:783,67:305:-136.37,-101.44,-918.41:99
-chr1	2573643	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=406;Dels=0.00;HRun=0;HaplotypeScore=240.70;MQ=22.59;MQ0=105;OQ=101.01;QD=0.25;SB=40.47	GT:AD:DP:GL:GQ	0/1:341,64:133:-53.47,-40.09,-445.02:99
-chr1	2573645	.	T	G	27.32	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=393;Dels=0.00;HRun=0;HaplotypeScore=214.15;MQ=22.61;MQ0=102;QD=0.07;SB=22.12	GT:AD:DP:GL:GQ	0/1:333,60:125:-43.68,-37.67,-396.83:60.15
-chr1	2573659	rs28581291	G	C	4615.63	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=333;Dels=0.00;HRun=1;HaplotypeScore=205.79;MQ=24.13;MQ0=78;QD=13.86;SB=-1212.00	GT:AD:DP:GL:GQ	0/1:35,294:132:-460.56,-39.52,-82.06:99
-chr1	2573662	.	C	T	559.05	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=354;Dels=0.00;HRun=0;HaplotypeScore=280.21;MQ=24.11;MQ0=79;QD=1.58;SB=-274.91	GT:AD:DP:GL:GQ	0/1:309,45:145:-102.89,-43.70,-398.94:99
-chr1	2573665	.	C	G	1510.34	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=408;Dels=0.00;HRun=0;HaplotypeScore=325.78;MQ=24.58;MQ0=76;QD=3.70;SB=-297.94	GT:AD:DP:GL:GQ	0/1:264,141:179:-211.73,-57.41,-536.45:99
-chr1	2573688	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=651;Dels=0.00;HRun=2;HaplotypeScore=395.85;MQ=24.99;MQ0=65;OQ=362.26;QD=0.56;SB=-155.57	GT:AD:DP:GL:GQ	0/1:581,65:307:-140.30,-100.79,-1081.14:99
-chr1	2573689	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=665;Dels=0.00;HRun=0;HaplotypeScore=525.06;MQ=24.91;MQ0=65;OQ=1827.67;QD=2.75;SB=-517.28	GT:AD:DP:GL:GQ	0/1:550,112:319:-282.15,-96.10,-903.12:99
-chr1	2573699	rs28514305	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=700;Dels=0.00;HRun=1;HaplotypeScore=627.89;MQ=25.13;MQ0=51;OQ=504.00;QD=0.72;SB=-50.28	GT:AD:DP:GL:GQ	0/1:553,135:325:-164.84,-111.15,-1100.31:99
-chr1	2573722	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=939;Dels=0.00;HRun=0;HaplotypeScore=511.14;MQ=24.55;MQ0=41;OQ=652.05;QD=0.69;SB=-156.78	GT:AD:DP:GL:GQ	0/1:833,100:448:-203.46,-134.97,-1376.56:99
-chr1	2573743	.	C	A	1376.46	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=920;Dels=0.01;HRun=1;HaplotypeScore=1049.31;MQ=24.03;MQ0=45;QD=1.50;SB=-654.94	GT:AD:DP:GL:GQ	0/1:771,125:393:-273.72,-132.79,-1119.66:99
-chr1	2573744	.	C	A	2246.36	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=920;Dels=0.00;HRun=0;HaplotypeScore=1100.48;MQ=24.05;MQ0=45;QD=2.44;SB=-774.39	GT:AD:DP:GL:GQ	0/1:696,198:389:-363.03,-135.11,-1033.83:99
-chr1	2573747	.	C	T	2541.21	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=900;Dels=0.00;HRun=0;HaplotypeScore=1014.50;MQ=23.93;MQ0=43;QD=2.82;SB=-593.64	GT:AD:DP:GL:GQ	0/1:671,157:361:-422.27,-164.86,-953.11:99
-chr1	2573753	.	A	T	936.20	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=863;Dels=0.00;HRun=0;HaplotypeScore=1289.29;MQ=23.50;MQ0=46;QD=1.08;SB=-444.50	GT:AD:DP:GL:GQ	0/1:735,98:311:-195.18,-98.28,-961.18:99
-chr1	2573759	.	C	T	306.11	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=786;Dels=0.00;HRun=0;HaplotypeScore=944.88;MQ=23.40;MQ0=46;QD=0.39;SB=80.59	GT:AD:DP:GL:GQ	0/1:568,186:262:-146.29,-112.39,-779.46:99
-chr1	2573762	.	C	T	1224.46	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=751;Dels=0.00;HRun=0;HaplotypeScore=1008.25;MQ=23.38;MQ0=43;QD=1.63;SB=32.31	GT:AD:DP:GL:GQ	0/1:549,181:260:-207.81,-82.08,-705.47:99
-chr1	2573768	.	G	A	69.35	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=690;Dels=0.00;HRun=0;HaplotypeScore=1128.47;MQ=23.25;MQ0=39;QD=0.10;SB=181.10	GT:AD:DP:GL:GQ	0/1:645,45:222:-77.09,-66.88,-732.33:99
-chr1	2573775	rs61765778	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=598;Dels=0.00;HRun=0;HaplotypeScore=829.09;MQ=23.11;MQ0=35;OQ=51.56;QD=0.09;SB=-51.39	GT:AD:DP:GL:GQ	0/1:411,178:176:-78.89,-70.45,-552.62:84.40
-chr1	2573784	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=482;Dels=0.00;HRun=0;HaplotypeScore=533.05;MQ=23.86;MQ0=35;OQ=97.06;QD=0.20;SB=-41.06	GT:AD:DP:GL:GQ	0/1:428,39:135:-57.53,-44.54,-428.93:99
-chr1	2573791	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=376;Dels=0.00;HRun=0;HaplotypeScore=279.62;MQ=25.08;MQ0=23;OQ=809.10;QD=2.15;SB=-122.99	GT:AD:DP:GL:GQ	0/1:249,119:103:-122.37,-38.18,-240.78:99
-chr1	2573803	rs61765779	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=238;Dels=0.00;HRun=0;HaplotypeScore=273.29;MQ=27.85;MQ0=11;OQ=738.52;QD=3.10;SB=-305.23	GT:AD:DP:GL:GQ	0/1:82,152:68:-97.64,-20.50,-141.62:99
-chr1	2573809	rs61765805	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=171;Dels=0.00;HRun=1;HaplotypeScore=207.51;MQ=30.86;MQ0=7;OQ=486.71;QD=2.85;SB=-123.47	GT:AD:DP:GL:GQ	0/1:47,107:55:-75.59,-23.64,-159.88:99
-chr1	2573825	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=103;Dels=0.04;HRun=2;HaplotypeScore=133.51;MQ=37.12;MQ0=1;OQ=152.18;QD=1.48;SB=68.24	GT:AD:DP:GL:GQ	0/1:42,51:50:-47.81,-29.31,-160.18:99
-chr1	2573831	rs55855140	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=0;HaplotypeScore=126.91;MQ=39.65;MQ0=1;OQ=158.89;QD=1.62;SB=62.19	GT:AD:DP:GL:GQ	0/1:53,43:46:-39.96,-20.79,-124.08:99
-chr1	2573842	.	A	C	115.63	SnpCluster	AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=142.04;MQ=40.93;MQ0=1;QD=1.17;SB=-71.86	GT:AD:DP:GL:GQ	0/1:45,45:51:-30.22,-15.37,-141.99:99
-chr1	2573846	rs61765806	C	G	427.99	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=128;Dels=0.00;HRun=0;HaplotypeScore=158.02;MQ=39.65;MQ0=2;QD=3.34;SB=50.19	GT:AD:DP:GL:GQ	0/1:94,33:65:-65.70,-19.61,-201.59:99
-chr1	2573851	.	G	A	820.83	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=140;Dels=0.00;HRun=1;HaplotypeScore=122.19;MQ=40.52;MQ0=2;QD=5.86;SB=-152.15	GT:AD:DP:GL:GQ	0/1:66,72:74:-107.66,-22.30,-166.53:99
-chr1	2573859	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=126.84;MQ=40.41;MQ0=2;OQ=121.72;QD=0.77;SB=152.53	GT:AD:DP:GL:GQ	0/1:122,36:93:-43.49,-28.03,-346.24:99
-chr1	2573901	rs35515286	G	C	550.86	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=206;Dels=0.00;HRun=0;HaplotypeScore=105.96;MQ=43.03;MQ0=1;QD=2.67;SB=237.50	GT:AD:DP:GL:GQ	0/1:135,63:142:-119.31,-60.94,-520.06:99
-chr1	2573904	.	G	C	824.37	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=204;Dels=0.00;HRun=3;HaplotypeScore=109.03;MQ=42.87;MQ0=2;QD=4.04;SB=193.35	GT:AD:DP:GL:GQ	0/1:129,71:137:-131.62,-45.90,-468.47:99
-chr1	2573907	.	C	T	232.33	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=234;Dels=0.00;HRun=0;HaplotypeScore=169.38;MQ=41.15;MQ0=2;QD=0.99;SB=246.29	GT:AD:DP:GL:GQ	0/1:198,35:151:-72.01,-45.49,-466.42:99
-chr1	2573937	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=313;Dels=0.00;HRun=2;HaplotypeScore=156.05;MQ=41.48;MQ0=6;OQ=610.21;QD=1.95;SB=184.28	GT:AD:DP:GL:GQ	0/1:179,131:178:-121.09,-56.78,-561.52:99
-chr1	2573955	rs4648664	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=309;Dels=0.01;HRun=0;HaplotypeScore=189.00;MQ=39.75;MQ0=9;OQ=5144.30;QD=16.65;SB=-1373.56	GT:AD:DP:GL:GQ	0/1:99,207:204:-513.43,-64.42,-219.84:99
-chr1	2573957	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=309;Dels=0.00;HRun=0;HaplotypeScore=210.03;MQ=39.51;MQ0=9;OQ=1411.76;QD=4.57;SB=186.52	GT:AD:DP:GL:GQ	0/1:164,144:192:-204.89,-60.43,-482.07:99
-chr1	2573977	rs36074084	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=329;Dels=0.14;HRun=3;HaplotypeScore=420.13;MQ=34.94;MQ0=9;OQ=1855.95;QD=5.64;SB=145.19	GT:AD:DP:GL:GQ	0/1:152,125:193:-244.66,-55.78,-561.08:99
-chr1	2573987	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=436;Dels=0.02;HRun=3;HaplotypeScore=523.62;MQ=29.87;MQ0=18;OQ=97.02;QD=0.22;SB=235.20	GT:AD:DP:GL:GQ	0/1:315,109:216:-76.87,-63.88,-657.84:99
-chr1	2574006	rs56001931	C	A	193.50	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=578;Dels=0.00;HRun=0;HaplotypeScore=796.32;MQ=26.82;MQ0=27;QD=0.33;SB=-95.26	GT:AD:DP:GL:GQ	0/1:506,46:197:-84.56,-61.92,-620.37:99
-chr1	2574010	.	G	A	47.43	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=576;Dels=0.00;HRun=1;HaplotypeScore=936.31;MQ=26.86;MQ0=27;QD=0.08;SB=305.98	GT:AD:DP:GL:GQ	0/1:514,37:196:-70.15,-62.12,-641.00:80.27
-chr1	2574012	.	G	A	1112.09	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=567;Dels=0.00;HRun=1;HaplotypeScore=881.66;MQ=26.70;MQ0=27;QD=1.96;SB=173.94	GT:AD:DP:GL:GQ	0/1:337,218:205:-176.25,-61.76,-573.77:99
-chr1	2574013	rs35375421	G	C	2739.83	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=556;Dels=0.00;HRun=0;HaplotypeScore=907.42;MQ=26.74;MQ0=27;QD=4.93;SB=-98.82	GT:AD:DP:GL:GQ	0/1:185,358:186:-340.69,-63.42,-477.87:99
-chr1	2574046	rs61765808	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=633;Dels=0.00;HRun=1;HaplotypeScore=769.62;MQ=25.77;MQ0=33;OQ=2369.47;QD=3.74;SB=-14.31	GT:AD:DP:GL:GQ	0/1:214,394:219:-332.81,-92.58,-459.77:99
-chr1	2574062	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=571;Dels=0.02;HRun=0;HaplotypeScore=1395.05;MQ=27.31;MQ0=25;OQ=270.74;QD=0.47;SB=9.21	GT:AD:DP:GL:GQ	0/1:393,159:156:-79.45,-49.09,-466.84:99
-chr1	2574081	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=574;Dels=0.00;HRun=0;HaplotypeScore=636.02;MQ=28.62;MQ0=23;OQ=102.79;QD=0.18;SB=258.30	GT:AD:DP:GL:GQ	0/1:339,178:156:-99.87,-86.31,-482.50:99
-chr1	2574099	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=481;Dels=0.01;HRun=2;HaplotypeScore=469.12;MQ=32.08;MQ0=15;OQ=332.15;QD=0.69;SB=-15.43	GT:AD:DP:GL:GQ	0/1:184,278:155:-88.85,-52.35,-456.19:99
-chr1	2574112	rs4648665	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=407;Dels=0.00;HRun=1;HaplotypeScore=376.40;MQ=32.86;MQ0=13;OQ=5520.38;QD=13.56;SB=-1708.96	GT:AD:DP:GL:GQ	1/1:7,385:151:-551.04,-45.49,-0.05:99
-chr1	2574233	rs6678571	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=482;Dels=0.00;HRun=0;HaplotypeScore=317.44;MQ=37.14;MQ0=103;OQ=51.18;QD=0.11;SB=33.13	GT:AD:DP:GL:GQ	0/1:400,76:222:-75.35,-66.94,-654.61:84.02
-chr1	2574280	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=411;Dels=0.00;HRun=0;HaplotypeScore=206.24;MQ=40.63;MQ0=25;OQ=702.83;QD=1.71;SB=165.25	GT:AD:DP:GL:GQ	0/1:262,145:248:-148.35,-74.78,-882.77:99
-chr1	2574370	rs56005609	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=224;Dels=0.00;HRun=0;HaplotypeScore=51.47;MQ=47.47;MQ0=12;OQ=160.10;QD=0.71;SB=-105.06	GT:AD:DP:GL:GQ	0/1:203,21:172:-71.19,-51.89,-483.26:99
-chr1	2574383	rs4648666	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=215;Dels=0.00;HRun=0;HaplotypeScore=154.22;MQ=48.52;MQ0=8;OQ=4531.65;QD=21.08;SB=-1293.59	GT:AD:DP:GL:GQ	0/1:45,169:169:-452.16,-50.92,-131.50:99
-chr1	2574398	rs4648667	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=297;Dels=0.00;HRun=0;HaplotypeScore=177.69;MQ=43.72;MQ0=17;OQ=1775.91;QD=5.98;SB=-869.96	GT:AD:DP:GL:GQ	0/1:211,86:190:-238.16,-57.29,-446.26:99
-chr1	2574435	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=784;Dels=0.00;HRun=0;HaplotypeScore=476.42;MQ=30.94;MQ0=61;OQ=552.66;QD=0.70;SB=-126.39	GT:AD:DP:GL:GQ	0/1:497,287:235:-129.39,-70.84,-631.70:99
-chr1	2574468	.	A	C	45.91	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=925;Dels=0.00;HRun=3;HaplotypeScore=499.34;MQ=30.78;MQ0=79;QD=0.05;SB=344.95	GT:AD:DP:GL:GQ	0/1:799,98:301:-105.40,-97.53,-960.73:78.74
-chr1	2574499	.	C	A	22.95	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=665;Dels=0.00;HRun=2;HaplotypeScore=681.86;MQ=36.15;MQ0=63;QD=0.03;SB=89.36	GT:AD:DP:GL:GQ	0/1:533,92:270:-145.98,-140.40,-853.73:55.76
-chr1	2574516	rs61765812	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=416;Dels=0.00;HRun=0;HaplotypeScore=217.32;MQ=43.57;MQ0=35;OQ=129.59;QD=0.31;SB=68.68	GT:AD:DP:GL:GQ	0/1:278,133:243:-89.48,-73.24,-851.13:99
-chr1	2574566	rs28558799	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=282;Dels=0.00;HRun=0;HaplotypeScore=119.44;MQ=43.46;MQ0=13;OQ=5625.16;QD=19.95;SB=-2459.11	GT:AD:DP:GL:GQ	0/1:49,230:200:-561.52,-60.25,-174.15:99
-chr1	2574594	rs56062029	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=452;Dels=0.00;HRun=2;HaplotypeScore=294.75;MQ=33.13;MQ0=30;OQ=1117.30;QD=2.47;SB=-453.09	GT:AD:DP:GL:GQ	0/1:369,56:211:-181.97,-66.96,-565.43:99
-chr1	2574621	rs57267388	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=571;Dels=0.00;HRun=0;HaplotypeScore=771.91;MQ=31.23;MQ0=33;OQ=342.14;QD=0.60;SB=-185.77	GT:AD:DP:GL:GQ	0/1:283,102:222:-153.52,-116.02,-729.22:99
-chr1	2574649	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=993;Dels=0.00;HRun=0;HaplotypeScore=693.61;MQ=28.27;MQ0=75;OQ=1079.32;QD=1.09;SB=-556.01	GT:AD:DP:GL:GQ	0/1:844,137:401:-235.64,-124.42,-1471.20:99
-chr1	2574659	.	A	C	29.66	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=980;Dels=0.00;HRun=3;HaplotypeScore=948.25;MQ=27.73;MQ0=79;QD=0.03;SB=242.38	GT:AD:DP:GL:GQ	0/1:842,123:385:-128.64,-122.39,-1217.71:62.50
-chr1	2574737	rs61765814	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=400;Dels=0.00;HRun=0;HaplotypeScore=203.09;MQ=41.26;MQ0=24;OQ=736.68;QD=1.84;SB=-0.60	GT:AD:DP:GL:GQ	0/1:202,185:205:-145.42,-68.47,-717.91:99
-chr1	2574757	rs61765815	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=370;Dels=0.00;HRun=0;HaplotypeScore=249.27;MQ=42.55;MQ0=25;OQ=384.28;QD=1.04;SB=73.46	GT:AD:DP:GL:GQ	0/1:205,136:201:-108.67,-66.96,-637.57:99
-chr1	2574806	rs61765816	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=433;Dels=0.00;HRun=0;HaplotypeScore=271.20;MQ=41.78;MQ0=23;OQ=447.69;QD=1.03;SB=-108.45	GT:AD:DP:GL:GQ	0/1:271,156:236:-119.20,-71.14,-762.60:99
-chr1	2574851	rs6691639	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=333;Dels=0.00;HRun=0;HaplotypeScore=216.92;MQ=45.13;MQ0=5;OQ=7151.39;QD=21.48;SB=-2958.67	GT:AD:DP:GL:GQ	0/1:25,306:212:-714.14,-63.86,-81.27:99
-chr1	2574904	rs6604990	T	C	6413.62	DPFilter;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=427;Dels=0.06;HRun=3;HaplotypeScore=563.84;MQ=34.54;MQ0=9;QD=15.02;SB=-2045.14	GT:AD:DP:GL:GQ	1/1:119,272:189:-640.36,-56.34,-15.02:99
-chr1	2574911	.	A	C	149.58	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=456;Dels=0.00;HRun=3;HaplotypeScore=557.08;MQ=32.46;MQ0=11;QD=0.33;SB=-79.57	GT:AD:DP:GL:GQ	0/1:298,141:171:-69.76,-51.52,-530.42:99
-chr1	2574914	.	A	G	786.99	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=464;Dels=0.02;HRun=1;HaplotypeScore=590.68;MQ=31.99;MQ0=11;QD=1.70;SB=-166.87	GT:AD:DP:GL:GQ	0/1:189,264:184:-140.25,-58.27,-581.91:99
-chr1	2574924	rs61765818	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=562;Dels=0.00;HRun=1;HaplotypeScore=584.85;MQ=29.44;MQ0=16;OQ=664.13;QD=1.18;SB=-72.04	GT:AD:DP:GL:GQ	0/1:412,132:178:-126.09,-56.39,-566.98:99
-chr1	2574942	rs60506177	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=681;Dels=0.00;HRun=2;HaplotypeScore=1240.22;MQ=29.22;MQ0=28;OQ=4364.77;QD=6.41;SB=-1487.53	GT:AD:DP:GL:GQ	0/1:160,495:256:-435.48,-89.03,-503.32:99
-chr1	2574956	rs59191334	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=906;Dels=0.00;HRun=0;HaplotypeScore=851.71;MQ=29.72;MQ0=44;OQ=1149.69;QD=1.27;SB=-284.23	GT:AD:DP:GL:GQ	0/1:632,252:274:-200.91,-82.66,-713.01:99
-chr1	2574986	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=944;Dels=0.00;HRun=1;HaplotypeScore=1818.61;MQ=31.01;MQ0=59;OQ=1122.41;QD=1.19;SB=-398.32	GT:AD:DP:GL:GQ	0/1:745,146:351:-246.18,-130.65,-980.48:99
-chr1	2575019	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=719;Dels=0.00;HRun=0;HaplotypeScore=472.84;MQ=36.86;MQ0=62;OQ=2013.75;QD=2.80;SB=-548.67	GT:AD:DP:GL:GQ	0/1:509,205:351:-310.40,-105.75,-919.85:99
-chr1	2575034	rs61763547	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=646;Dels=0.00;HRun=1;HaplotypeScore=246.19;MQ=38.01;MQ0=57;OQ=1218.08;QD=1.89;SB=297.56	GT:AD:DP:GL:GQ	0/1:304,285:351:-300.74,-175.64,-1150.43:99
-chr1	2575068	.	C	G	824.18	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=841;Dels=0.00;HRun=0;HaplotypeScore=834.43;MQ=32.24;MQ0=93;QD=0.98;SB=69.34	GT:AD:DP:GL:GQ	0/1:592,151:395:-352.89,-267.19,-1451.52:99
-chr1	2575069	rs11510858	C	A	2054.73	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=851;Dels=0.00;HRun=0;HaplotypeScore=833.69;MQ=32.03;MQ0=94;QD=2.41;SB=-732.04	GT:AD:DP:GL:GQ	0/1:701,130:386:-337.44,-128.68,-1037.66:99
-chr1	2575076	.	C	G	56.74	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=869;Dels=0.00;HRun=2;HaplotypeScore=716.58;MQ=31.37;MQ0=95;QD=0.07;SB=276.82	GT:AD:DP:GL:GQ	0/1:773,41:392:-146.00,-137.04,-1458.73:89.57
-chr1	2575191	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=619;Dels=0.01;HRun=3;HaplotypeScore=666.18;MQ=32.68;MQ0=22;OQ=1037.47;QD=1.68;SB=-98.59	GT:AD:DP:GL:GQ	0/1:385,224:265:-186.87,-79.84,-734.84:99
-chr1	2575196	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=669;Dels=0.00;HRun=0;HaplotypeScore=585.81;MQ=31.95;MQ0=25;OQ=410.40;QD=0.61;SB=138.71	GT:AD:DP:GL:GQ	0/1:518,139:278:-128.14,-83.81,-902.17:99
-chr1	2575224	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=936;Dels=0.00;HRun=0;HaplotypeScore=711.05;MQ=30.70;MQ0=52;OQ=206.48;QD=0.22;SB=16.18	GT:AD:DP:GL:GQ	0/1:817,101:399:-165.30,-141.37,-1545.34:99
-chr1	2575246	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=981;Dels=0.00;HRun=1;HaplotypeScore=733.47;MQ=31.11;MQ0=67;OQ=1892.73;QD=1.93;SB=-760.65	GT:AD:DP:GL:GQ	0/1:771,204:430:-322.12,-129.56,-1274.76:99
-chr1	2575261	rs6692051	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=945;Dels=0.00;HRun=3;HaplotypeScore=358.84;MQ=32.03;MQ0=68;OQ=2338.43;QD=2.47;SB=-661.83	GT:AD:DP:GL:GQ	0/1:802,142:427:-365.78,-128.65,-1131.84:99
-chr1	2575299	.	G	T	161.49	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=614;Dels=0.00;HRun=1;HaplotypeScore=591.39;MQ=37.63;MQ0=50;QD=0.26;SB=20.79	GT:AD:DP:GL:GQ	0/1:494,69:362:-227.05,-207.62,-1136.93:99
-chr1	2575300	rs61765821	T	C	1192.57	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=603;Dels=0.00;HRun=0;HaplotypeScore=567.88;MQ=38.04;MQ0=47;QD=1.98;SB=-535.85	GT:AD:DP:GL:GQ	0/1:348,222:348:-246.80,-124.26,-1045.28:99
-chr1	2575308	.	C	A	283.33	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=591;Dels=0.00;HRun=1;HaplotypeScore=502.16;MQ=39.21;MQ0=53;QD=0.48;SB=90.50	GT:AD:DP:GL:GQ	0/1:465,102:356:-142.06,-110.45,-1099.38:99
-chr1	2575350	rs28411086	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=541;Dels=0.00;HRun=2;HaplotypeScore=281.76;MQ=38.20;MQ0=48;OQ=2021.31;QD=3.74;SB=-545.18	GT:AD:DP:GL:GQ	0/1:247,291:277:-288.88,-83.46,-673.01:99
-chr1	2575391	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=992;Dels=0.00;HRun=2;HaplotypeScore=510.05;MQ=30.36;MQ0=68;OQ=227.39;QD=0.23;SB=145.08	GT:AD:DP:GL:GQ	0/1:854,132:434:-160.44,-134.42,-1359.22:99
-chr1	2575398	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=1075;Dels=0.00;HRun=0;HaplotypeScore=310.34;MQ=30.19;MQ0=65;OQ=528.27;QD=0.49;SB=20.12	GT:AD:DP:GL:GQ	0/1:895,162:479:-203.83,-147.72,-1593.06:99
-chr1	2575422	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=1315;Dels=0.00;HRun=1;HaplotypeScore=628.02;MQ=29.05;MQ0=70;OQ=417.47;QD=0.32;SB=307.23	GT:AD:DP:GL:GQ	0/1:1146,168:592:-223.40,-178.37,-1814.12:99
-chr1	2575443	rs6678990	C	G	1968.81	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=1397;Dels=0.00;HRun=0;HaplotypeScore=834.10;MQ=29.41;MQ0=63;QD=1.41;SB=-880.90	GT:AD:DP:GL:GQ	0/1:1263,104:657:-428.32,-228.16,-2407.74:99
-chr1	2575448	.	C	T	306.07	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=1347;Dels=0.00;HRun=0;HaplotypeScore=969.72;MQ=29.55;MQ0=58;QD=0.23;SB=98.85	GT:AD:DP:GL:GQ	0/1:1166,127:596:-237.42,-203.53,-1765.67:99
-chr1	2575453	.	G	A	633.22	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=1324;Dels=0.01;HRun=0;HaplotypeScore=1094.28;MQ=29.55;MQ0=52;QD=0.48;SB=22.83	GT:AD:DP:GL:GQ	0/1:1098,210:631:-255.45,-188.85,-1774.06:99
-chr1	2575459	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=1275;Dels=0.00;HRun=1;HaplotypeScore=976.35;MQ=29.72;MQ0=48;OQ=260.30;QD=0.20;SB=456.22	GT:AD:DP:GL:GQ	0/1:1186,88:626:-217.90,-188.59,-2068.65:99
-chr1	2575467	.	A	T	1827.05	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=1257;Dels=0.00;HRun=0;HaplotypeScore=1002.71;MQ=30.06;MQ0=39;QD=1.45;SB=-471.84	GT:AD:DP:GL:GQ	0/1:1025,208:608:-372.29,-186.30,-1881.69:99
-chr1	2575472	.	C	A	9687.38	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=1255;Dels=0.00;HRun=1;HaplotypeScore=858.65;MQ=30.07;MQ0=41;QD=7.72;SB=-1503.87	GT:AD:DP:GL:GQ	0/1:729,316:639:-967.74,-542.07,-1662.70:99
-chr1	2575476	rs28479903	C	T	328.26	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=1232;Dels=0.00;HRun=0;HaplotypeScore=989.29;MQ=30.12;MQ0=43;QD=0.27;SB=122.56	GT:AD:DP:GL:GQ	0/1:1040,174:572:-219.19,-183.08,-1716.97:99
-chr1	2575484	rs61765822	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=1214;Dels=0.00;HRun=0;HaplotypeScore=468.08;MQ=30.51;MQ0=43;OQ=1888.53;QD=1.56;SB=-874.96	GT:AD:DP:GL:GQ	0/1:984,212:602:-396.91,-204.77,-1679.64:99
-chr1	2575509	rs7367485	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=1003;Dels=0.00;HRun=3;HaplotypeScore=708.39;MQ=31.59;MQ0=44;OQ=1317.31;QD=1.31;SB=-683.17	GT:AD:DP:GL:GQ	0/1:599,311:447:-397.20,-262.18,-1298.11:99
-chr1	2575527	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=899;Dels=0.00;HRun=1;HaplotypeScore=616.46;MQ=32.40;MQ0=36;OQ=2129.63;QD=2.37;SB=-658.87	GT:AD:DP:GL:GQ	0/1:666,188:432:-362.76,-146.52,-1154.94:99
-chr1	2575536	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=816;Dels=0.00;HRun=1;HaplotypeScore=629.02;MQ=33.06;MQ0=36;OQ=245.82;QD=0.30;SB=187.48	GT:AD:DP:GL:GQ	0/1:660,150:389:-147.61,-119.74,-1232.57:99
-chr1	2575553	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=672;Dels=0.00;HRun=0;HaplotypeScore=869.01;MQ=35.62;MQ0=23;OQ=1048.35;QD=1.56;SB=44.73	GT:AD:DP:GL:GQ	0/1:542,123:340:-220.20,-112.08,-1057.17:99
-chr1	2575577	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=529;Dels=0.00;HRun=0;HaplotypeScore=616.14;MQ=41.10;MQ0=11;OQ=295.55;QD=0.56;SB=93.12	GT:AD:DP:GL:GQ	0/1:363,155:340:-135.27,-102.43,-1079.29:99
-chr1	2575583	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=497;Dels=0.00;HRun=0;HaplotypeScore=739.15;MQ=41.67;MQ0=9;OQ=177.97;QD=0.36;SB=340.79	GT:AD:DP:GL:GQ	0/1:426,63:314:-122.58,-101.50,-1218.09:99
-chr1	2575632	rs6686754	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=363;Dels=0.00;HRun=1;HaplotypeScore=439.13;MQ=46.08;MQ0=4;OQ=7215.73;QD=19.88;SB=-2967.87	GT:AD:DP:GL:GQ	0/1:59,294:248:-720.57,-74.71,-189.55:99
-chr1	2575661	rs28498367	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=482;Dels=0.00;HRun=0;HaplotypeScore=598.03;MQ=41.57;MQ0=4;OQ=4453.10;QD=9.24;SB=-977.05	GT:AD:DP:GL:GQ	0/1:194,269:275:-444.31,-82.91,-730.02:99
-chr1	2575692	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=647;Dels=0.00;HRun=1;HaplotypeScore=594.08;MQ=36.97;MQ0=17;OQ=2155.18;QD=3.33;SB=272.10	GT:AD:DP:GL:GQ	0/1:259,365:295:-329.81,-111.01,-802.38:99
-chr1	2575711	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=667;Dels=0.00;HRun=3;HaplotypeScore=1191.59;MQ=36.49;MQ0=18;OQ=1467.43;QD=2.20;SB=-170.23	GT:AD:DP:GL:GQ	0/1:245,407:245:-231.00,-80.98,-619.30:99
-chr1	2575718	.	C	T	91.63	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=668;Dels=0.07;HRun=0;HaplotypeScore=726.36;MQ=36.74;MQ0=18;QD=0.14;SB=390.06	GT:AD:DP:GL:GQ	0/1:453,157:278:-93.88,-81.43,-798.07:99
-chr1	2575725	.	C	T	321.62	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=662;Dels=0.00;HRun=1;HaplotypeScore=724.85;MQ=36.17;MQ0=17;QD=0.49;SB=411.17	GT:AD:DP:GL:GQ	0/1:600,56:323:-132.74,-97.29,-1057.81:99
-chr1	2575728	.	A	T	148.72	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=660;Dels=0.00;HRun=0;HaplotypeScore=737.53;MQ=36.50;MQ0=17;QD=0.23;SB=417.37	GT:AD:DP:GL:GQ	0/1:600,48:321:-114.85,-96.69,-1096.48:99
-chr1	2575731	.	G	A	128.25	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=638;Dels=0.00;HRun=1;HaplotypeScore=523.34;MQ=37.45;MQ0=16;QD=0.20;SB=259.66	GT:AD:DP:GL:GQ	0/1:525,83:335:-143.82,-127.71,-1107.68:99
-chr1	2575750	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=473;Dels=0.00;HRun=1;HaplotypeScore=339.24;MQ=40.86;MQ0=6;OQ=314.90;QD=0.67;SB=-156.95	GT:AD:DP:GL:GQ	0/1:417,42:281:-123.25,-88.47,-781.88:99
-chr1	2575766	rs6694964	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=418;Dels=0.00;HRun=0;HaplotypeScore=190.54;MQ=43.00;MQ0=6;OQ=9217.59;QD=22.05;SB=-3555.11	GT:AD:DP:GL:GQ	0/1:33,383:267:-920.76,-80.43,-83.85:34.20
-chr1	2575784	rs28583924	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=426;Dels=0.00;HRun=0;HaplotypeScore=272.61;MQ=42.95;MQ0=8;OQ=181.28;QD=0.43;SB=6.29	GT:AD:DP:GL:GQ	0/1:359,64:257:-98.92,-77.51,-960.45:99
-chr1	2575825	rs6689281	T	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=557;Dels=0.01;HRun=2;HaplotypeScore=469.61;MQ=35.81;MQ0=25;OQ=9475.08;QD=17.01;SB=-3650.18	GT:AD:DP:GL:GQ	1/1:3,541:282:-946.51,-86.27,-2.51:99
-chr1	2575851	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=634;Dels=0.00;HRun=0;HaplotypeScore=686.59;MQ=33.18;MQ0=30;OQ=77.00;QD=0.12;SB=-18.66	GT:AD:DP:GL:GQ	0/1:437,151:251:-86.73,-75.75,-723.32:99
-chr1	2575861	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=670;Dels=0.00;HRun=0;HaplotypeScore=1084.95;MQ=32.16;MQ0=34;OQ=174.30;QD=0.26;SB=144.01	GT:AD:DP:GL:GQ	0/1:448,201:255:-97.68,-76.97,-707.97:99
-chr1	2575918	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=659;Dels=0.00;HRun=0;HaplotypeScore=602.10;MQ=33.55;MQ0=33;OQ=1205.47;QD=1.83;SB=-331.68	GT:AD:DP:GL:GQ	0/1:520,139:294:-212.43,-88.60,-836.61:99
-chr1	2575963	rs61765824	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=414;Dels=0.00;HRun=0;HaplotypeScore=225.65;MQ=45.71;MQ0=16;OQ=175.37;QD=0.42;SB=-3.54	GT:AD:DP:GL:GQ	0/1:256,154:262:-99.81,-78.99,-882.64:99
-chr1	2576027	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=375;Dels=0.00;HRun=0;HaplotypeScore=441.20;MQ=41.08;MQ0=22;OQ=359.44;QD=0.96;SB=-25.38	GT:AD:DP:GL:GQ	0/1:347,27:212:-103.15,-63.92,-790.76:99
-chr1	2576035	rs55917765	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=384;Dels=0.02;HRun=4;HaplotypeScore=406.51;MQ=41.42;MQ0=19;OQ=289.17;QD=0.75;SB=-132.89	GT:AD:DP:GL:GQ	0/1:212,141:214:-106.50,-74.30,-717.21:99
-chr1	2576075	rs57994724	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=300;Dels=0.03;HRun=4;HaplotypeScore=363.80;MQ=42.84;MQ0=2;OQ=76.42;QD=0.25;SB=-28.60	GT:AD:DP:GL:GQ	0/1:192,90:162:-61.96,-51.03,-580.93:99
-chr1	2576111	rs58221160	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=281;Dels=0.00;HRun=1;HaplotypeScore=182.21;MQ=43.93;MQ0=7;OQ=597.72;QD=2.13;SB=-221.46	GT:AD:DP:GL:GQ	0/1:232,45:207:-125.42,-62.37,-596.71:99
-chr1	2576240	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=1159;Dels=0.00;HRun=0;HaplotypeScore=623.69;MQ=25.02;MQ0=69;OQ=409.78;QD=0.35;SB=-223.95	GT:AD:DP:GL:GQ	0/1:968,178:369:-162.51,-118.25,-1426.92:99
-chr1	2576263	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=1066;Dels=0.00;HRun=1;HaplotypeScore=622.37;MQ=26.52;MQ0=59;OQ=159.54;QD=0.15;SB=19.45	GT:AD:DP:GL:GQ	0/1:984,81:387:-135.82,-116.58,-1209.01:99
-chr1	2576333	.	C	G	40.07	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=224;Dels=0.00;HRun=1;HaplotypeScore=154.83;MQ=40.65;MQ0=29;QD=0.18;SB=-8.93	GT:AD:DP:GL:GQ	0/1:181,32:158:-64.21,-56.92,-644.64:72.91
-chr1	2576335	.	C	T	1221.15	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=0;HaplotypeScore=167.65;MQ=40.55;MQ0=30;QD=5.65;SB=-581.17	GT:AD:DP:GL:GQ	0/1:122,94:144:-168.83,-43.43,-331.79:99
-chr1	2576336	rs28676518	G	A	1105.16	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=214;Dels=0.00;HRun=0;HaplotypeScore=205.71;MQ=40.45;MQ0=30;QD=5.16;SB=-168.80	GT:AD:DP:GL:GQ	0/1:170,44:143:-156.87,-43.08,-364.02:99
-chr1	2576346	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=74.98;MQ=40.01;MQ0=31;OQ=210.24;QD=1.17;SB=-126.34	GT:AD:DP:GL:GQ	0/1:138,41:111:-57.78,-33.47,-394.51:99
-chr1	2576366	rs61765835	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=158;Dels=0.00;HRun=0;HaplotypeScore=35.61;MQ=33.02;MQ0=57;OQ=96.35;QD=0.61;SB=-36.52	GT:AD:DP:GL:GQ	0/1:92,66:79:-36.73,-23.81,-255.03:99
-chr1	2576428	rs61765837	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=303;Dels=0.00;HRun=2;HaplotypeScore=260.74;MQ=16.89;MQ0=145;OQ=101.18;QD=0.33;SB=-66.11	GT:AD:DP:GL:GQ	0/1:155,144:52:-29.09,-15.69,-174.52:99
-chr1	2576448	rs61765838	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=595;Dels=0.00;HRun=0;HaplotypeScore=426.54;MQ=17.45;MQ0=199;OQ=372.66;QD=0.63;SB=-42.53	GT:AD:DP:GL:GQ	0/1:377,206:114:-74.98,-34.43,-280.80:99
-chr1	2576460	rs61765839	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=687;Dels=0.00;HRun=1;HaplotypeScore=471.75;MQ=17.40;MQ0=212;OQ=453.85;QD=0.66;SB=-3.98	GT:AD:DP:GL:GQ	0/1:511,164:138:-90.25,-41.59,-375.50:99
-chr1	2576472	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=774;Dels=0.03;HRun=1;HaplotypeScore=800.59;MQ=17.54;MQ0=228;OQ=234.98;QD=0.30;SB=-38.37	GT:AD:DP:GL:GQ	0/1:618,98:166:-76.78,-50.00,-493.07:99
-chr1	2576534	rs57105227	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=374;Dels=0.00;HRun=1;HaplotypeScore=347.91;MQ=18.87;MQ0=112;OQ=329.07;QD=0.88;SB=-154.80	GT:AD:DP:GL:GQ	0/1:156,198:111:-73.27,-37.08,-391.39:99
-chr1	2576577	rs4648668	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=122;Dels=0.00;HRun=1;HaplotypeScore=59.62;MQ=22.81;MQ0=26;OQ=851.22;QD=6.98;SB=10.08	GT:AD:DP:GL:GQ	0/1:55,66:69:-109.20,-20.79,-201.97:99
-chr1	2576600	rs4648566	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=1;HaplotypeScore=109.15;MQ=20.95;MQ0=39;OQ=455.68;QD=3.38;SB=83.24	GT:AD:DP:GL:GQ	0/1:105,30:52:-64.51,-15.66,-117.10:99
-chr1	2576616	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=0;HaplotypeScore=178.18;MQ=20.10;MQ0=38;OQ=374.43;QD=2.62;SB=-39.54	GT:AD:DP:GL:GQ	0/1:116,27:44:-54.00,-13.27,-93.80:99
-chr1	2576848	rs61765840	G	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=141;Dels=0.00;HRun=1;HaplotypeScore=22.44;MQ=39.05;MQ0=35;OQ=52.46;QD=0.37;SB=-15.32	GT:AD:DP:GL:GQ	0/1:129,12:77:-31.72,-23.19,-231.93:85.30
-chr1	2577010	rs4648671	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=239;Dels=0.00;HRun=0;HaplotypeScore=65.16;MQ=37.14;MQ0=12;OQ=5199.52;QD=21.76;SB=-2266.90	GT:AD:DP:GL:GQ	1/1:7,232:163:-518.95,-49.17,-3.73:99
-chr1	2577062	rs28507281	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=295;Dels=0.00;HRun=0;HaplotypeScore=78.67;MQ=40.58;MQ0=11;OQ=1143.65;QD=3.88;SB=-492.64	GT:AD:DP:GL:GQ	0/1:238,57:237:-189.11,-71.46,-605.04:99
-chr1	2577084	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=307;Dels=0.00;HRun=0;HaplotypeScore=72.39;MQ=39.59;MQ0=17;OQ=519.07;QD=1.69;SB=-15.56	GT:AD:DP:GL:GQ	0/1:259,48:248:-129.89,-74.70,-751.71:99
-chr1	2577123	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=291;Dels=0.00;HRun=1;HaplotypeScore=84.53;MQ=39.37;MQ0=26;OQ=265.40;QD=0.91;SB=-39.23	GT:AD:DP:GL:GQ	0/1:250,41:219:-95.80,-65.98,-773.71:99
-chr1	2577397	rs58719822	G	C	0.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=190;Dels=0.00;HRun=0;HaplotypeScore=14.16;MQ=39.42;MQ0=19;OQ=6097.98;QD=32.09;SB=-764.81	GT:AD:DP:GL:GQ	1/1:1,189:137:-608.80,-41.28,-0.05:99
-chr1	2577433	rs60264562	G	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=207;Dels=0.05;HRun=4;HaplotypeScore=105.46;MQ=35.87;MQ0=25;OQ=5113.11;QD=24.70;SB=-614.98	GT:AD:DP:GL:GQ	1/1:9,184:123:-510.31,-38.53,-16.18:99
-chr1	2577515	.	A	C	17.95	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=331;Dels=0.00;HRun=3;HaplotypeScore=311.11;MQ=35.94;MQ0=23;QD=0.05;SB=173.50	GT:AD:DP:GL:GQ	0/1:258,71:167:-55.40,-50.33,-521.31:50.72
-chr1	2577549	rs4648567	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=289;Dels=0.00;HRun=0;HaplotypeScore=107.18;MQ=38.40;MQ0=7;OQ=5448.91;QD=18.85;SB=-2125.98	GT:AD:DP:GL:GQ	1/1:24,231:174:-543.89,-82.79,-51.97:99
-chr1	2577655	.	G	C	44.44	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=2;HaplotypeScore=58.73;MQ=26.75;MQ0=23;QD=0.33;SB=26.12	GT:AD:DP:GL:GQ	0/1:116,10:43:-24.31,-16.59,-159.35:77.27
-chr1	2577671	rs58842912	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=0;HaplotypeScore=128.81;MQ=16.71;MQ0=28;OQ=137.08;QD=1.46;SB=-35.94	GT:AD:DP:GL:GQ	0/1:63,25:12:-20.61,-3.62,-16.30:99
-chr1	2577677	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=3;HaplotypeScore=117.98;MQ=17.54;MQ0=28;OQ=281.66;QD=3.03;SB=-45.56	GT:AD:DP:GL:GQ	0/1:33,58:12:-35.06,-3.61,-7.69:40.79
-chr1	2577682	.	T	C	14.20	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=57.79;MQ=17.58;MQ0=34;QD=0.14;SB=-10.00	GT:AD:DP:GL:GQ	0/1:68,26:4:-5.89,-1.21,-7.84:46.86
-chr1	2577700	.	T	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=167.08;MQ=18.58;MQ0=41;OQ=266.89;QD=2.36;SB=-10.00	GT:AD:DP:GL:GQ	1/1:35,36:10:-34.52,-6.65,-4.25:23.97
-chr1	2577709	.	C	T	15.40	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=131;Dels=0.00;HRun=0;HaplotypeScore=233.03;MQ=18.07;MQ0=48;QD=0.12;SB=-10.00	GT:AD:DP:GL:GQ	0/1:96,13:7:-9.83,-5.02,-17.83:48.10
-chr1	2577721	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=182;Dels=0.00;HRun=0;HaplotypeScore=74.87;MQ=18.10;MQ0=63;OQ=399.60;QD=2.20;SB=-10.00	GT:AD:DP:GL:GQ	0/1:147,35:41:-55.60,-12.35,-87.25:99
-chr1	2577722	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=0;HaplotypeScore=54.78;MQ=18.15;MQ0=62;OQ=179.28;QD=0.99;SB=-10.00	GT:AD:DP:GL:GQ	0/1:160,20:38:-32.69,-11.48,-98.33:99
-chr1	2577735	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=1;HaplotypeScore=37.61;MQ=17.86;MQ0=65;OQ=262.32;QD=1.37;SB=-10.00	GT:AD:DP:GL:GQ	0/1:173,18:55:-46.08,-16.57,-148.55:99
-chr1	2577740	rs61763463	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=186;Dels=0.00;HRun=1;HaplotypeScore=34.83;MQ=17.84;MQ0=63;OQ=1671.60;QD=8.99;SB=-10.00	GT:AD:DP:GL:GQ	0/1:52,133:54:-186.71,-16.27,-40.75:99
-chr1	2577765	.	C	A	125.78	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=0;HaplotypeScore=41.35;MQ=16.77;MQ0=52;QD=0.87;SB=-10.00	GT:AD:DP:GL:GQ	0/1:91,53:26:-23.70,-7.84,-54.51:99
-chr1	2577769	.	C	T	71.72	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=43.82;MQ=16.10;MQ0=52;QD=0.54;SB=-10.00	GT:AD:DP:GL:GQ	0/1:87,47:21:-16.80,-6.34,-49.74:99
-chr1	2577770	.	G	C	89.65	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=133;Dels=0.00;HRun=1;HaplotypeScore=42.82;MQ=16.09;MQ0=52;QD=0.67;SB=-10.00	GT:AD:DP:GL:GQ	0/1:85,48:21:-18.58,-6.33,-66.40:99
-chr1	2577784	rs61761450	G	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=93.26;MQ=15.12;MQ0=44;OQ=499.20;QD=4.62;SB=-10.00	GT:AD:DP:GL:GQ	1/1:36,72:12:-53.51,-3.62,-0.00:36.12
-chr1	2577796	rs28368363	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=154.23;MQ=14.20;MQ0=39;OQ=53.95;QD=0.56;SB=-10.00	GT:AD:DP:GL:GQ	0/1:68,23:5:-10.19,-1.51,-6.10:45.96
-chr1	2577799	rs61765844	A	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=89;Dels=0.00;HRun=4;HaplotypeScore=106.56;MQ=13.50;MQ0=38;OQ=136.44;QD=1.53;SB=-10.00	GT:AD:DP:GL:GQ	1/1:37,52:5:-17.20,-1.51,-0.00:15.04
-chr1	2577815	rs61761446	G	A	0.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=16.91;MQ=12.99;MQ0=33;OQ=113.87;QD=2.19;SB=-10.00	GT:AD:DP:GL:GQ	1/1:30,21:4:-14.92,-1.21,-0.00:12.04
-chr1	2577825	.	G	A	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=32.84;MQ=14.16;MQ0=28;OQ=149.17;QD=3.17;SB=-10.00	GT:AD:DP:GL:GQ	1/1:28,19:5:-18.48,-1.51,-0.00:15.04
-chr1	2577833	.	C	T	42.25	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=22.86;MQ=13.04;MQ0=28;QD=0.98;SB=-10.00	GT:AD:DP:GL:GQ	1/1:33,10:2:-7.63,-0.60,-0.00:6.02
-chr1	2577851	.	G	T	0.04	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=11.27;MQ=14.57;MQ0=20;OQ=148.54;QD=4.24;SB=-10.00	GT:AD:DP:GL:GQ	1/1:17,14:6:-18.43,-1.81,-0.01:18.02
-chr1	2577883	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=114.78;MQ=19.71;MQ0=31;OQ=87.78;QD=0.84;SB=-10.00	GT:AD:DP:GL:GQ	0/1:82,22:16:-16.89,-4.83,-35.06:99
-chr1	2577892	rs61761448	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.00;HRun=0;HaplotypeScore=139.63;MQ=19.08;MQ0=41;OQ=358.39;QD=3.04;SB=-10.00	GT:AD:DP:GL:GQ	0/1:46,69:13:-43.04,-3.92,-5.80:18.77
-chr1	2577904	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=1;HaplotypeScore=169.18;MQ=18.99;MQ0=45;OQ=432.72;QD=3.38;SB=-10.00	GT:AD:DP:GL:GQ	0/1:56,72:16:-51.38,-4.83,-6.85:20.23
-chr1	2577913	.	A	G	43.14	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=228.63;MQ=18.89;MQ0=43;QD=0.37;SB=-10.00	GT:AD:DP:GL:GQ	0/1:102,14:7:-9.71,-2.11,-14.52:75.98
-chr1	2577923	.	G	A	12.44	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=0;HaplotypeScore=139.34;MQ=19.75;MQ0=38;QD=0.10;SB=-10.00	GT:AD:DP:GL:GQ	0/1:84,37:10:-7.51,-3.01,-26.55:45.02
-chr1	2577924	.	T	C	61.88	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=137.09;MQ=19.68;MQ0=38;QD=0.52;SB=-10.00	GT:AD:DP:GL:GQ	0/1:94,23:11:-12.79,-3.32,-26.27:94.71
-chr1	2577931	rs61763465	G	C	371.46	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=106.32;MQ=19.54;MQ0=35;QD=3.50;SB=-10.00	GT:AD:DP:GL:GQ	1/1:30,75:9:-40.73,-2.71,-0.00:27.09
-chr1	2577945	rs61765845	G	C	1059.87	HARD_TO_VALIDATE;Indel	AC=2;AF=1.00;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=141.04;MQ=19.73;MQ0=38;QD=10.00;SB=-10.00	GT:AD:DP:GL:GQ	1/1:31,70:26:-113.65,-11.26,-4.08:71.85
-chr1	2577953	.	A	G	356.53	HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=136.50;MQ=18.50;MQ0=43;QD=3.64;SB=-10.00	GT:AD:DP:GL:GQ	0/1:78,20:16:-43.76,-4.82,-8.02:32
-chr1	2577977	.	G	A	20.69	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=1;HaplotypeScore=16.21;MQ=15.79;MQ0=48;QD=0.27;SB=-10.00	GT:AD:DP:GL:GQ	0/1:72,5:20:-11.37,-6.02,-58.36:53.49
-chr1	2579397	rs61761374	C	G	193.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=22.35;MQ0=6;OQ=1341.59;QD=14.91;SB=-551.47	GT:AD:DP:GL:GQ	0/1:44,46:77:-160.66,-23.22,-161.20:99
-chr1	2580726	.	T	G	35.92	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.11;MQ=5.25;MQ0=59;QD=0.59;SB=-10.00	GT:AD:DP:GL:GQ	1/1:58,2:2:-7.00,-0.60,-0.00:6.02
-chr1	2580768	.	T	C	36.28	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=5.74;MQ0=49;QD=0.71;SB=-10.00	GT:AD:DP:GL:GQ	1/1:46,5:2:-7.04,-0.60,-0.00:6.02
-chr1	2580784	rs11488598	T	A	45.88	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=6.33;MQ0=40;QD=1.09;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,41:2:-8.00,-0.60,-0.00:6.02
-chr1	2581065	rs61761440	A	C	33.92	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=9.03;MQ=10.33;MQ0=29;QD=0.71;SB=-10.00	GT:AD:DP:GL:GQ	1/1:28,20:2:-6.80,-0.60,-0.00:6.02
-chr1	2581076	.	T	A	42.69	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=11.35;MQ0=18;QD=1.33;SB=-10.00	GT:AD:DP:GL:GQ	1/1:16,15:2:-7.68,-0.60,-0.00:6.02
-chr1	2581088	.	A	C	35.92	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=11;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=15.32;MQ0=5;QD=3.27;SB=-10.00	GT:AD:DP:GL:GQ	1/1:3,8:2:-7.00,-0.60,-0.00:6.02
-chr1	2581203	.	C	G	46.77	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=12.99;MQ=10.81;MQ0=53;QD=0.69;SB=5.05	GT:AD:DP:GL:GQ	0/1:57,11:14:-12.18,-4.22,-47.55:79.61
-chr1	2581221	rs4648702	C	A	0.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=1;HaplotypeScore=12.38;MQ=17.15;MQ0=42;OQ=109.22;QD=1.11;SB=-5.56	GT:AD:DP:GL:GQ	0/1:80,16:46:-28.07,-13.86,-128.22:99
-chr1	2581257	rs4648701	T	A	0.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=134;Dels=0.00;HRun=0;HaplotypeScore=5.16;MQ=20.38;MQ0=25;OQ=3859.45;QD=28.80;SB=-1801.06	GT:AD:DP:GL:GQ	1/1:0,134:101:-384.94,-30.42,-0.03:99
-chr1	2587428	.	A	C	37.49	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=14.36;MQ0=8;QD=1.10;SB=-45.01	GT:AD:DP:GL:GQ	1/1:0,34:2:-7.16,-0.60,-0.00:6.02
-chr1	2593169	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=425;Dels=0.00;HRun=1;HaplotypeScore=105.62;MQ=17.46;MQ0=82;OQ=848.96;QD=2.00;SB=-332.82	GT:AD:DP:GL:GQ	0/1:365,60:163:-137.29,-49.11,-428.79:99
-chr1	2596443	.	C	T	41.24	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=11;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=12.40;MQ0=7;QD=3.75;SB=-10.00	GT:AD:DP:GL:GQ	1/1:7,4:2:-7.53,-0.60,-0.00:6.02
-chr1	2596445	.	T	G	36.05	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=1;HaplotypeScore=2.31;MQ=11.87;MQ0=8;QD=3.00;SB=-10.00	GT:AD:DP:GL:GQ	1/1:5,7:2:-7.01,-0.60,-0.00:6.02
-chr1	2596476	.	G	A	46.02	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=60;Dels=0.00;HRun=1;HaplotypeScore=26.89;MQ=5.53;MQ0=56;QD=0.77;SB=-10.00	GT:AD:DP:GL:GQ	1/1:58,2:2:-8.01,-0.60,-0.00:6.02
-chr1	2596850	.	G	C	35.05	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=11.43;MQ0=28;QD=0.82;SB=-10.00	GT:AD:DP:GL:GQ	0/1:29,14:5:-8.30,-1.51,-13.08:67.88
-chr1	2596943	.	C	A	49.59	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=50.99;MQ=11.35;MQ0=54;QD=0.70;SB=-6.99	GT:AD:DP:GL:GQ	0/1:65,5:13:-12.16,-3.92,-30.66:82.43
-chr1	2597318	.	T	C	31.81	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=14.62;MQ=5.54;MQ0=70;QD=0.42;SB=-10.00	GT:AD:DP:GL:GQ	1/1:73,2:2:-6.59,-0.60,-0.00:6.01
-chr1	2598250	.	T	A	27.90	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=1;HaplotypeScore=2.24;MQ=16.56;MQ0=5;QD=1.27;SB=-0.98	GT:AD:DP:GL:GQ	0/1:19,3:5:-7.58,-1.51,-10.62:60.73
-chr1	2598257	.	G	T	12.16	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=10.71;MQ=15.61;MQ0=8;QD=0.55;SB=-0.98	GT:AD:DP:GL:GQ	0/1:19,3:5:-5.98,-1.51,-10.70:44.72
-chr1	2598656	.	G	A	10.26	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=1;HaplotypeScore=114.17;MQ=5.78;MQ0=152;QD=0.06;SB=-10.00	GT:AD:DP:GL:GQ	0/1:161,14:1:-4.27,-0.30,-0.00:1.76
-chr1	2598795	.	G	A	10.26	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=47.85;MQ=7.17;MQ0=69;QD=0.12;SB=-10.00	GT:AD:DP:GL:GQ	0/1:84,2:1:-4.27,-0.30,-0.00:1.76
-chr1	2598944	.	A	C	17.83	HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=1;HaplotypeScore=67.67;MQ=10.48;MQ0=39;QD=0.27;SB=-25.99	GT:AD:DP:GL:GQ	0/1:48,17:3:-5.96,-0.91,-2.50:15.92
-chr1	2598946	.	A	G	34.06	HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=82.40;MQ=11.36;MQ0=42;QD=0.46;SB=-10.00	GT:AD:DP:GL:GQ	0/1:70,4:3:-7.59,-0.90,-4.17:32.64
-chr1	2598950	.	C	A	54.26	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=105.52;MQ=12.29;MQ0=47;QD=0.53;SB=-3.99	GT:AD:DP:GL:GQ	0/1:94,7:7:-10.82,-2.11,-14.32:87.10
-chr1	2599001	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=133;Dels=0.00;HRun=0;HaplotypeScore=31.75;MQ=12.68;MQ0=54;OQ=83.85;QD=0.63;SB=-3.99	GT:AD:DP:GL:GQ	0/1:91,33:10:-18.26,-6.59,-21.60:99
-chr1	2599015	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=2;HaplotypeScore=24.68;MQ=11.50;MQ0=72;OQ=64.97;QD=0.46;SB=-43.54	GT:AD:DP:GL:GQ	0/1:128,12:9:-12.49,-2.71,-23.15:97.80
-chr1	2599040	rs61761456	A	T	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=133;Dels=0.00;HRun=0;HaplotypeScore=87.15;MQ=9.23;MQ0=88;OQ=72.77;QD=0.55;SB=-10.00	GT:AD:DP:GL:GQ	1/1:81,14:5:-17.43,-7.71,-6.64:10.71
-chr1	2599044	rs61761457	T	A	33.25	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=131;Dels=0.00;HRun=1;HaplotypeScore=64.29;MQ=9.30;MQ0=86;QD=0.25;SB=-10.00	GT:AD:DP:GL:GQ	0/1:104,11:6:-11.67,-5.06,-13.57:66.08
-chr1	2599198	.	C	T	23.45	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=16.24;MQ=14.99;MQ0=19;QD=0.50;SB=-3.99	GT:AD:DP:GL:GQ	0/1:29,18:5:-7.14,-1.51,-10.24:56.27
-chr1	2599218	.	G	A	105.55	HARD_TO_VALIDATE;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=106.10;MQ=16.73;MQ0=11;QD=2.29;SB=-69.07	GT:AD:DP:GL:GQ	0/1:28,17:6:-15.65,-1.81,-6.14:43.30
-chr1	2599225	.	C	G	35.32	HARD_TO_VALIDATE;Indel;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=82.64;MQ=16.87;MQ0=11;QD=0.78;SB=-10.88	GT:AD:DP:GL:GQ	0/1:36,6:7:-14.02,-7.20,-19.31:68.16
-chr1	2599228	.	G	A	323.86	HARD_TO_VALIDATE;Indel;SnpCluster	AC=2;AF=1.00;AN=2;DP=46;Dels=0.04;HRun=0;HaplotypeScore=68.32;MQ=16.68;MQ0=12;QD=7.04;SB=-89.34	GT:AD:DP:GL:GQ	1/1:16,28:10:-35.98,-3.02,-0.01:30.08
-chr1	2599239	.	T	A	19.57	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=43.45;MQ=14.62;MQ0=19;QD=0.36;SB=-4.42	GT:AD:DP:GL:GQ	0/1:49,2:7:-12.49,-7.25,-17.00:52.36
-chr1	2599247	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=40.77;MQ=14.18;MQ0=20;OQ=70.13;QD=1.35;SB=-7.01	GT:AD:DP:GL:GQ	0/1:29,21:6:-12.11,-1.81,-8.56:67.52
-chr1	2599654	.	G	C	12.35	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=1;HaplotypeScore=26.39;MQ=2.65;MQ0=119;QD=0.10;SB=-10.00	GT:AD:DP:GL:GQ	0/1:119,1:1:-4.49,-0.30,-0.00:1.76
-chr1	2601422	.	A	G	25.82	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=114;Dels=0.00;HRun=0;HaplotypeScore=10.71;MQ=4.09;MQ0=110;QD=0.23;SB=-10.00	GT:AD:DP:GL:GQ	1/1:99,14:2:-5.99,-0.60,-0.00:6.01
-chr1	2601437	.	T	C	35.28	DPFilter;HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=133;Dels=0.00;HRun=0;HaplotypeScore=12.99;MQ=3.79;MQ0=129;QD=0.27;SB=-10.00	GT:AD:DP:GL:GQ	1/1:103,30:2:-6.94,-0.60,-0.00:6.02
-chr1	2601504	.	G	A	41.24	DPFilter;HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=19.74;MQ=3.30;MQ0=165;QD=0.25;SB=-10.00	GT:AD:DP:GL:GQ	1/1:158,9:2:-7.53,-0.60,-0.00:6.02
-chr1	2601515	.	A	C	43.05	DPFilter;HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=155;Dels=0.00;HRun=2;HaplotypeScore=7.29;MQ=3.29;MQ0=153;QD=0.28;SB=-10.00	GT:AD:DP:GL:GQ	1/1:91,64:2:-7.71,-0.60,-0.00:6.02
-chr1	2601516	.	G	A	0.02	FDRtranche1.00to2.00	AC=2;AF=1.00;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=6.38;MQ=3.29;MQ0=153;OQ=51.25;QD=0.33;SB=-10.00	GT:AD:DP:GL:GQ	1/1:89,66:2:-8.53,-0.60,-0.00:6.02
-chr1	2601859	.	G	A	39.02	DPFilter;HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=164;Dels=0.00;HRun=0;HaplotypeScore=20.82;MQ=4.64;MQ0=146;QD=0.24;SB=-10.00	GT:AD:DP:GL:GQ	1/1:150,13:2:-7.31,-0.60,-0.00:6.02
-chr1	2603248	rs11486046	A	C	0.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=4;HaplotypeScore=1.14;MQ=19.37;MQ0=3;OQ=283.27;QD=11.33;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,23:9:-31.91,-2.71,-0.00:27.08
-chr1	2603587	.	A	G	31.28	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=24.46;MQ=5.10;MQ0=81;QD=0.34;SB=-10.00	GT:AD:DP:GL:GQ	1/1:74,19:2:-6.54,-0.60,-0.00:6.01
-chr1	2603630	.	C	T	0.04	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=4.88;MQ=7.26;MQ0=55;OQ=82.12;QD=1.35;SB=-10.00	GT:AD:DP:GL:GQ	1/1:51,10:3:-11.70,-0.90,-0.00:9.03
-chr1	2603684	.	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=23.79;MQ=8.35;MQ0=58;OQ=160.35;QD=2.36;SB=-10.00	GT:AD:DP:GL:GQ	1/1:55,13:6:-19.61,-1.81,-0.00:18.04
-chr1	2603850	.	C	G	10.08	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=0;HaplotypeScore=68.31;MQ=3.10;MQ0=215;QD=0.04;SB=-10.00	GT:AD:DP:GL:GQ	0/1:213,10:1:-4.25,-0.30,-0.00:1.76
-chr1	2604182	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=169;Dels=0.00;HRun=1;HaplotypeScore=49.21;MQ=7.86;MQ0=143;OQ=70.78;QD=0.42;SB=-10.00	GT:AD:DP:GL:GQ	0/1:162,7:11:-13.68,-3.31,-27.79:99
-chr1	2604202	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=174;Dels=0.00;HRun=0;HaplotypeScore=66.53;MQ=7.81;MQ0=146;OQ=55.73;QD=0.32;SB=-10.00	GT:AD:DP:GL:GQ	0/1:164,10:11:-12.17,-3.31,-27.45:88.56
-chr1	2604211	.	C	A	34.20	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=202;Dels=0.00;HRun=0;HaplotypeScore=110.16;MQ=8.09;MQ0=168;QD=0.17;SB=-10.00	GT:AD:DP:GL:GQ	0/1:190,11:14:-10.92,-4.22,-40.03:67.04
-chr1	2604257	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=0;HaplotypeScore=82.11;MQ=12.16;MQ0=114;OQ=80.38;QD=0.46;SB=32.96	GT:AD:DP:GL:GQ	0/1:146,20:31:-22.91,-11.59,-89.29:99
-chr1	2604263	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=1;HaplotypeScore=133.02;MQ=12.71;MQ0=105;OQ=191.66;QD=1.14;SB=50.18	GT:AD:DP:GL:GQ	0/1:122,46:33:-32.40,-9.95,-88.01:99
-chr1	2604269	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=0;HaplotypeScore=77.37;MQ=13.05;MQ0=90;OQ=192.77;QD=1.32;SB=17.43	GT:AD:DP:GL:GQ	0/1:70,69:33:-34.89,-12.33,-71.96:99
-chr1	2604305	.	T	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=7.47;MQ=17.34;MQ0=29;OQ=55.74;QD=0.69;SB=74.25	GT:AD:DP:GL:GQ	0/1:58,22:37:-20.01,-11.15,-121.92:88.58
-chr1	2604310	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=4.63;MQ=18.11;MQ0=23;OQ=69.18;QD=0.93;SB=74.24	GT:AD:DP:GL:GQ	0/1:55,19:37:-21.34,-11.14,-111.00:99
-chr1	2604358	.	C	T	71.23	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=0;HaplotypeScore=145.78;MQ=14.15;MQ0=44;QD=0.82;SB=11.06	GT:AD:DP:GL:GQ	0/1:71,13:12:-14.02,-3.62,-30.75:99
-chr1	2604359	.	C	A	74.64	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=131.89;MQ=14.13;MQ0=41;QD=0.91;SB=5.02	GT:AD:DP:GL:GQ	0/1:26,56:10:-13.76,-3.01,-18.66:99
-chr1	2604363	.	G	C	180.85	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=2;HaplotypeScore=137.79;MQ=13.57;MQ0=46;QD=2.10;SB=2.04	GT:AD:DP:GL:GQ	0/1:29,40:11:-24.68,-3.31,-21.48:99
-chr1	2604377	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=82.82;MQ=13.39;MQ0=50;OQ=54.76;QD=0.61;SB=-10.00	GT:AD:DP:GL:GQ	0/1:65,25:4:-9.97,-1.21,-3.57:23.65
-chr1	2604397	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=1;HaplotypeScore=150.87;MQ=13.17;MQ0=49;OQ=71.12;QD=0.83;SB=-10.00	GT:AD:DP:GL:GQ	0/1:47,38:4:-11.60,-1.21,-3.90:26.92
-chr1	2604403	.	T	C	38.45	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=82;Dels=0.00;HRun=2;HaplotypeScore=145.51;MQ=12.80;MQ0=46;QD=0.47;SB=-10.00	GT:AD:DP:GL:GQ	1/1:13,58:3:-10.84,-4.28,-3.54:7.45
-chr1	2604424	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=48.30;MQ=13.20;MQ0=33;OQ=76.83;QD=1.35;SB=-6.99	GT:AD:DP:GL:GQ	0/1:21,30:6:-12.78,-1.81,-6.73:49.16
-chr1	2604431	.	C	T	25.24	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=33.49;MQ=13.71;MQ0=25;QD=0.55;SB=-7.01	GT:AD:DP:GL:GQ	0/1:40,3:5:-7.32,-1.51,-9.43:58.07
-chr1	2604444	.	G	C	43.47	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=1;HaplotypeScore=38.64;MQ=15.55;MQ0=13;QD=1.67;SB=-10.00	GT:AD:DP:GL:GQ	0/1:8,16:4:-12.26,-4.63,-7.13:24.99
-chr1	2604449	.	G	C	30.45	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=21;Dels=0.10;HRun=4;HaplotypeScore=30.98;MQ=14.63;MQ0=12;QD=1.45;SB=-10.00	GT:AD:DP:GL:GQ	0/1:6,6:4:-11.16,-4.83,-7.63:28
-chr1	2604508	.	G	C	0.07	PASS	AC=2;AF=1.00;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=11.01;MQ=14.95;MQ0=13;OQ=265.66;QD=7.81;SB=-10.00	GT:AD:DP:GL:GQ	1/1:9,25:7:-30.15,-2.11,-0.00:21.07
-chr1	2604516	.	G	T	0.07	PASS	AC=2;AF=1.00;AN=2;DP=41;Dels=0.00;HRun=1;HaplotypeScore=5.00;MQ=14.42;MQ0=18;OQ=191.90;QD=4.68;SB=-10.00	GT:AD:DP:GL:GQ	1/1:15,26:7:-22.77,-2.11,-0.00:21.05
-chr1	2604535	rs61763522	A	G	0.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=9.63;MQ=11.76;MQ0=38;OQ=251.64;QD=3.87;SB=-10.00	GT:AD:DP:GL:GQ	1/1:12,53:8:-28.75,-2.41,-0.00:24.07
-chr1	2604555	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=35.24;MQ=12.18;MQ0=57;OQ=115.73;QD=1.24;SB=14.08	GT:AD:DP:GL:GQ	0/1:66,27:12:-18.47,-3.62,-35.84:99
-chr1	2604572	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=137;Dels=0.00;HRun=3;HaplotypeScore=50.74;MQ=13.39;MQ0=78;OQ=55.27;QD=0.40;SB=20.07	GT:AD:DP:GL:GQ	0/1:127,10:20:-14.84,-6.03,-56.38:88.11
-chr1	2604579	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=1;HaplotypeScore=62.98;MQ=13.28;MQ0=75;OQ=144.76;QD=1.05;SB=20.08	GT:AD:DP:GL:GQ	0/1:125,13:18:-23.19,-5.43,-45.19:99
-chr1	2604585	rs61763523	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=140;Dels=0.00;HRun=1;HaplotypeScore=70.32;MQ=13.11;MQ0=76;OQ=158.49;QD=1.13;SB=-6.99	GT:AD:DP:GL:GQ	0/1:102,37:9:-21.84,-2.71,-10.97:82.64
-chr1	2604597	.	A	G	110.83	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=107.90;MQ=13.27;MQ0=78;QD=0.74;SB=8.05	GT:AD:DP:GL:GQ	0/1:135,14:14:-18.58,-4.22,-35.74:99
-chr1	2604601	.	A	C	218.40	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=111.25;MQ=13.41;MQ0=75;QD=1.51;SB=4.22	GT:AD:DP:GL:GQ	0/1:108,36:15:-33.23,-8.10,-26.51:99
-chr1	2604603	.	T	C	273.40	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=2;HaplotypeScore=107.87;MQ=13.23;MQ0=76;QD=1.89;SB=-75.88	GT:AD:DP:GL:GQ	0/1:65,76:14:-34.84,-4.22,-16.55:99
-chr1	2604631	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=169;Dels=0.00;HRun=1;HaplotypeScore=78.83;MQ=15.93;MQ0=66;OQ=130.30;QD=0.77;SB=-43.00	GT:AD:DP:GL:GQ	0/1:129,40:31:-25.65,-9.34,-87.13:99
-chr1	2604640	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=154;Dels=0.00;HRun=0;HaplotypeScore=101.27;MQ=16.99;MQ0=53;OQ=84.42;QD=0.55;SB=-10.00	GT:AD:DP:GL:GQ	0/1:93,61:34:-21.98,-10.25,-116.76:99
-chr1	2604659	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=1;HaplotypeScore=114.19;MQ=17.85;MQ0=39;OQ=180.46;QD=1.31;SB=-10.00	GT:AD:DP:GL:GQ	0/1:106,32:34:-31.57,-10.24,-88.52:99
-chr1	2604673	rs7415296	T	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=120;Dels=0.00;HRun=1;HaplotypeScore=73.29;MQ=18.57;MQ0=29;OQ=1125.63;QD=9.38;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,107:33:-116.16,-9.94,-0.01:99
-chr1	2604706	rs6673862	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=0;HaplotypeScore=39.35;MQ=23.53;MQ0=16;OQ=454.13;QD=4.83;SB=-3.99	GT:AD:DP:GL:GQ	0/1:51,43:41:-61.05,-12.35,-88.54:99
-chr1	2604709	rs6604993	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=41.02;MQ=25.10;MQ0=15;OQ=512.66;QD=5.40;SB=-34.93	GT:AD:DP:GL:GQ	0/1:48,47:45:-68.11,-13.56,-92.92:99
-chr1	2604721	rs61763524	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=115.04;MQ=25.76;MQ0=12;OQ=386.36;QD=4.15;SB=-44.44	GT:AD:DP:GL:GQ	0/1:49,44:40:-53.97,-12.05,-114.41:99
-chr1	2604728	rs61763525	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=150.75;MQ=27.24;MQ0=8;OQ=52.75;QD=0.62;SB=-10.00	GT:AD:DP:GL:GQ	0/1:49,22:37:-19.70,-11.14,-117.15:85.59
-chr1	2604813	rs6687492	A	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.04;HRun=2;HaplotypeScore=47.11;MQ=23.79;MQ0=20;OQ=1537.32;QD=16.53;SB=-154.02	GT:AD:DP:GL:GQ	1/1:2,87:44:-157.33,-12.95,-0.02:99
-chr1	2604848	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=9.77;MQ=17.69;MQ0=30;OQ=71.77;QD=1.30;SB=-10.00	GT:AD:DP:GL:GQ	0/1:37,18:14:-14.68,-4.22,-36.61:99
-chr1	2604864	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=28.67;MQ=16.02;MQ0=35;OQ=77.33;QD=1.17;SB=-10.00	GT:AD:DP:GL:GQ	0/1:62,4:12:-14.63,-3.61,-28.91:99
-chr1	2604867	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=23.02;MQ=16.18;MQ0=37;OQ=170.35;QD=2.43;SB=-10.00	GT:AD:DP:GL:GQ	0/1:59,11:15:-24.84,-4.52,-31.52:99
-chr1	2604879	.	A	G	48.78	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=25.49;MQ=18.59;MQ0=41;QD=0.57;SB=-6.99	GT:AD:DP:GL:GQ	0/1:79,7:20:-14.19,-6.03,-66.66:81.62
-chr1	2604892	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=1;HaplotypeScore=62.88;MQ=20.71;MQ0=36;OQ=145.34;QD=1.60;SB=-40.00	GT:AD:DP:GL:GQ	0/1:67,21:27:-25.95,-8.13,-71.88:99
-chr1	2604894	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=93;Dels=0.01;HRun=1;HaplotypeScore=55.68;MQ=20.44;MQ0=36;OQ=138.96;QD=1.49;SB=-41.95	GT:AD:DP:GL:GQ	0/1:67,21:26:-25.01,-7.83,-77.06:99
-chr1	2604912	rs61763528	T	G	20.95	HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=112;Dels=0.00;HRun=0;HaplotypeScore=50.36;MQ=22.66;MQ0=25;QD=0.19;SB=-10.00	GT:AD:DP:GL:GQ	0/1:76,35:29:-14.11,-8.74,-95.07:53.75
-chr1	2604916	rs61763529	T	G	194.85	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=113;Dels=0.00;HRun=0;HaplotypeScore=46.31;MQ=24.02;MQ0=23;QD=1.72;SB=-10.00	GT:AD:DP:GL:GQ	0/1:75,37:38:-34.21,-11.44,-107.06:99
-chr1	2604917	rs61763530	C	G	1480.34	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=112;Dels=0.00;HRun=0;HaplotypeScore=47.31;MQ=24.13;MQ0=22;QD=13.22;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,96:38:-168.50,-25.75,-16.88:88.75
-chr1	2604946	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=236;Dels=0.00;HRun=1;HaplotypeScore=63.84;MQ=27.71;MQ0=21;OQ=79.42;QD=0.34;SB=27.56	GT:AD:DP:GL:GQ	0/1:204,31:106:-43.16,-31.93,-335.49:99
-chr1	2604947	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=236;Dels=0.00;HRun=1;HaplotypeScore=57.70;MQ=27.78;MQ0=20;OQ=56.57;QD=0.24;SB=26.25	GT:AD:DP:GL:GQ	0/1:201,34:107:-41.17,-32.23,-378.22:89.40
-chr1	2604959	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=241;Dels=0.00;HRun=1;HaplotypeScore=113.45;MQ=29.01;MQ0=17;OQ=854.86;QD=3.55;SB=-18.43	GT:AD:DP:GL:GQ	0/1:165,75:109:-121.61,-32.84,-284.29:99
-chr1	2604960	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=240;Dels=0.00;HRun=1;HaplotypeScore=123.76;MQ=29.06;MQ0=17;OQ=593.64;QD=2.47;SB=71.18	GT:AD:DP:GL:GQ	0/1:190,50:108:-95.18,-32.53,-286.72:99
-chr1	2604983	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=224;Dels=0.00;HRun=1;HaplotypeScore=495.52;MQ=29.66;MQ0=13;OQ=71.64;QD=0.32;SB=60.44	GT:AD:DP:GL:GQ	0/1:161,61:71:-31.89,-21.44,-242.50:99
-chr1	2604984	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=1;HaplotypeScore=666.90;MQ=29.67;MQ0=14;OQ=53.59;QD=0.24;SB=51.85	GT:AD:DP:GL:GQ	0/1:162,59:73:-33.13,-24.49,-250.82:86.43
-chr1	2604994	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=301;Dels=0.00;HRun=1;HaplotypeScore=445.50;MQ=27.33;MQ0=32;OQ=911.93;QD=3.03;SB=-289.52	GT:AD:DP:GL:GQ	0/1:244,47:103:-139.58,-45.10,-310.97:99
-chr1	2605000	.	A	G	39.90	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=313;Dels=0.00;HRun=0;HaplotypeScore=296.02;MQ=26.42;MQ0=37;QD=0.13;SB=95.30	GT:AD:DP:GL:GQ	0/1:236,73:110:-42.96,-35.69,-387.52:72.73
-chr1	2605008	.	C	A	80.14	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=308;Dels=0.00;HRun=1;HaplotypeScore=230.13;MQ=26.37;MQ0=45;QD=0.26;SB=104.26	GT:AD:DP:GL:GQ	0/1:278,18:127:-64.22,-52.92,-396.67:99
-chr1	2605010	.	C	A	77.92	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=309;Dels=0.00;HRun=1;HaplotypeScore=334.39;MQ=26.26;MQ0=46;QD=0.25;SB=101.18	GT:AD:DP:GL:GQ	0/1:276,18:125:-51.79,-40.71,-371.85:99
-chr1	2605026	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=292;Dels=0.00;HRun=0;HaplotypeScore=503.51;MQ=24.87;MQ0=63;OQ=127.24;QD=0.44;SB=-33.91	GT:AD:DP:GL:GQ	0/1:107,181:82:-40.71,-24.70,-242.51:99
-chr1	2605040	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=333;Dels=0.00;HRun=0;HaplotypeScore=585.35;MQ=23.26;MQ0=69;OQ=164.03;QD=0.49;SB=60.04	GT:AD:DP:GL:GQ	0/1:234,98:87:-48.89,-29.20,-293.13:99
-chr1	2605055	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=394;Dels=0.00;HRun=0;HaplotypeScore=493.35;MQ=22.62;MQ0=80;OQ=367.10;QD=0.93;SB=90.44	GT:AD:DP:GL:GQ	0/1:300,89:126:-77.94,-37.95,-375.51:99
-chr1	2605064	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=394;Dels=0.00;HRun=1;HaplotypeScore=562.83;MQ=22.35;MQ0=77;OQ=111.09;QD=0.28;SB=241.07	GT:AD:DP:GL:GQ	0/1:342,17:127:-65.55,-51.15,-483.41:99
-chr1	2605074	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=367;Dels=0.02;HRun=1;HaplotypeScore=550.64;MQ=22.20;MQ0=72;OQ=1826.16;QD=4.98;SB=11.30	GT:AD:DP:GL:GQ	0/1:140,136:125:-251.01,-65.11,-307.30:99
-chr1	2605078	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=360;Dels=0.00;HRun=1;HaplotypeScore=645.39;MQ=22.69;MQ0=67;OQ=145.82;QD=0.41;SB=80.26	GT:AD:DP:GL:GQ	0/1:281,25:108:-50.40,-32.54,-347.91:99
-chr1	2605087	rs9442451	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=302;Dels=0.00;HRun=1;HaplotypeScore=515.01;MQ=23.21;MQ0=61;OQ=1550.28;QD=5.13;SB=0.26	GT:AD:DP:GL:GQ	0/1:127,172:83:-183.36,-25.04,-152.30:99
-chr1	2605095	rs7411254	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=295;Dels=0.00;HRun=0;HaplotypeScore=864.08;MQ=22.89;MQ0=61;OQ=861.12;QD=2.92;SB=-439.01	GT:AD:DP:GL:GQ	0/1:231,62:100:-119.53,-30.13,-233.73:99
-chr1	2605099	rs61763531	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=268;Dels=0.03;HRun=1;HaplotypeScore=671.07;MQ=23.34;MQ0=56;OQ=331.54;QD=1.24;SB=62.18	GT:AD:DP:GL:GQ	0/1:101,158:88:-62.36,-25.93,-228.22:99
-chr1	2605116	rs61763532	G	T	727.77	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=280;Dels=0.00;HRun=0;HaplotypeScore=340.71;MQ=26.06;MQ0=38;QD=2.60;SB=80.25	GT:AD:DP:GL:GQ	0/1:98,160:86:-122.32,-46.26,-192.83:99
-chr1	2605118	.	G	A	130.78	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=290;Dels=0.00;HRun=2;HaplotypeScore=353.34;MQ=26.07;MQ0=39;QD=0.45;SB=68.17	GT:AD:DP:GL:GQ	0/1:266,20:82:-41.07,-24.71,-249.92:99
-chr1	2605120	.	A	G	143.56	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=286;Dels=0.00;HRun=0;HaplotypeScore=391.53;MQ=26.07;MQ0=38;QD=0.50;SB=44.57	GT:AD:DP:GL:GQ	0/1:230,56:92:-45.37,-27.73,-305.63:99
-chr1	2605121	.	C	A	843.63	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=283;Dels=0.00;HRun=2;HaplotypeScore=384.52;MQ=26.08;MQ0=38;QD=2.98;SB=80.20	GT:AD:DP:GL:GQ	0/1:195,69:112:-123.96,-36.31,-258.00:99
-chr1	2605143	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=261;Dels=0.00;HRun=0;HaplotypeScore=165.80;MQ=26.36;MQ0=57;OQ=2061.60;QD=7.90;SB=82.92	GT:AD:DP:GL:GQ	0/1:135,121:131:-251.29,-41.84,-249.16:99
-chr1	2605152	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=276;Dels=0.00;HRun=0;HaplotypeScore=166.41;MQ=25.95;MQ0=68;OQ=1747.63;QD=6.33;SB=68.24	GT:AD:DP:GL:GQ	0/1:180,94:128:-216.61,-38.56,-254.69:99
-chr1	2605164	rs56278231	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=278;Dels=0.00;HRun=0;HaplotypeScore=99.67;MQ=26.36;MQ0=65;OQ=2109.83;QD=7.59;SB=62.23	GT:AD:DP:GL:GQ	0/1:140,134:129:-253.13,-38.87,-210.06:99
-chr1	2605176	rs61763533	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=283;Dels=0.00;HRun=4;HaplotypeScore=192.72;MQ=26.37;MQ0=64;OQ=2285.97;QD=8.08;SB=50.20	GT:AD:DP:GL:GQ	0/1:155,126:135:-272.62,-40.74,-266.81:99
-chr1	2605179	rs7415101	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=293;Dels=0.00;HRun=0;HaplotypeScore=210.05;MQ=26.19;MQ0=65;OQ=1158.68;QD=3.95;SB=-384.91	GT:AD:DP:GL:GQ	0/1:236,57:97:-148.38,-29.23,-220.79:99
-chr1	2605208	.	C	A	465.30	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=269;Dels=0.00;HRun=1;HaplotypeScore=227.21;MQ=26.15;MQ0=63;QD=1.73;SB=32.07	GT:AD:DP:GL:GQ	0/1:153,116:69:-70.60,-20.78,-175.32:99
-chr1	2605210	.	C	A	482.33	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=1;HaplotypeScore=189.40;MQ=26.42;MQ0=62;QD=1.81;SB=32.08	GT:AD:DP:GL:GQ	0/1:149,115:67:-71.70,-20.18,-161.20:99
-chr1	2605214	rs61082664	T	C	967.30	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=276;Dels=0.00;HRun=2;HaplotypeScore=127.28;MQ=27.64;MQ0=60;QD=3.50;SB=23.10	GT:AD:DP:GL:GQ	0/1:97,178:76:-122.91,-22.90,-161.42:99
-chr1	2605243	.	G	T	751.64	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=305;Dels=0.00;HRun=1;HaplotypeScore=253.27;MQ=31.30;MQ0=36;QD=2.46;SB=71.20	GT:AD:DP:GL:GQ	0/1:173,132:102:-109.18,-30.73,-247.59:99
-chr1	2605244	rs28455054	T	C	853.34	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=304;Dels=0.00;HRun=0;HaplotypeScore=224.13;MQ=31.61;MQ0=34;QD=2.81;SB=-69.58	GT:AD:DP:GL:GQ	0/1:99,183:104:-137.17,-48.55,-265.91:99
-chr1	2605247	.	C	T	78.33	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=307;Dels=0.00;HRun=0;HaplotypeScore=241.73;MQ=32.15;MQ0=30;QD=0.26;SB=92.28	GT:AD:DP:GL:GQ	0/1:261,44:108:-43.66,-32.54,-342.18:99
-chr1	2605252	.	C	A	302.63	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=316;Dels=0.00;HRun=1;HaplotypeScore=325.23;MQ=32.85;MQ0=33;QD=0.96;SB=113.24	GT:AD:DP:GL:GQ	0/1:197,119:109:-66.39,-32.84,-311.74:99
-chr1	2605255	rs55876897	A	C	449.77	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=317;Dels=0.00;HRun=3;HaplotypeScore=260.93;MQ=33.01;MQ0=35;QD=1.42;SB=-150.70	GT:AD:DP:GL:GQ	0/1:239,77:117:-83.21,-34.95,-326.08:99
-chr1	2605259	rs56999649	T	G	716.83	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=300;Dels=0.00;HRun=1;HaplotypeScore=227.19;MQ=34.47;MQ0=29;QD=2.39;SB=-184.23	GT:AD:DP:GL:GQ	0/1:116,182:121:-111.42,-36.45,-316.52:99
-chr1	2605264	rs4648676	C	T	210.17	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=316;Dels=0.00;HRun=0;HaplotypeScore=557.56;MQ=35.06;MQ0=25;QD=0.67;SB=-21.82	GT:AD:DP:GL:GQ	0/1:289,24:136:-67.74,-43.44,-416.85:99
-chr1	2605334	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=408;Dels=0.00;HRun=4;HaplotypeScore=186.79;MQ=36.75;MQ0=7;OQ=1485.59;QD=3.64;SB=-538.59	GT:AD:DP:GL:GQ	0/1:275,118:294:-243.85,-92.01,-1014.23:99
-chr1	2605341	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=415;Dels=0.00;HRun=0;HaplotypeScore=229.92;MQ=36.33;MQ0=7;OQ=215.75;QD=0.52;SB=102.02	GT:AD:DP:GL:GQ	0/1:365,48:297:-114.34,-89.49,-957.91:99
-chr1	2605353	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=430;Dels=0.00;HRun=0;HaplotypeScore=200.04;MQ=35.29;MQ0=7;OQ=112.93;QD=0.26;SB=60.60	GT:AD:DP:GL:GQ	0/1:389,39:313:-108.94,-94.36,-1191.77:99
-chr1	2605354	rs4648678	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=435;Dels=0.00;HRun=0;HaplotypeScore=203.33;MQ=35.33;MQ0=8;OQ=1038.03;QD=2.39;SB=-273.03	GT:AD:DP:GL:GQ	0/1:373,60:307:-199.57,-92.49,-955.77:99
-chr1	2605374	rs61763535	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=451;Dels=0.00;HRun=4;HaplotypeScore=174.52;MQ=33.98;MQ0=15;OQ=1772.73;QD=3.93;SB=-155.11	GT:AD:DP:GL:GQ	0/1:257,185:286:-266.74,-86.18,-803.52:99
-chr1	2605416	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=641;Dels=0.00;HRun=0;HaplotypeScore=116.73;MQ=29.52;MQ0=38;OQ=101.05;QD=0.16;SB=-26.09	GT:AD:DP:GL:GQ	0/1:592,49:383:-128.76,-115.37,-1229.08:99
-chr1	2605473	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=505;Dels=0.00;HRun=1;HaplotypeScore=72.40;MQ=31.01;MQ0=19;OQ=529.76;QD=1.05;SB=-238.32	GT:AD:DP:GL:GQ	0/1:450,54:383:-171.63,-115.37,-1165.16:99
-chr1	2605495	rs56293461	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=486;Dels=0.00;HRun=0;HaplotypeScore=95.08;MQ=32.56;MQ0=15;OQ=821.52;QD=1.69;SB=-409.31	GT:AD:DP:GL:GQ	0/1:403,80:369:-196.58,-111.15,-1127.43:99
-chr1	2605529	rs28651038	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=428;Dels=0.00;HRun=0;HaplotypeScore=82.79;MQ=34.53;MQ0=16;OQ=2602.34;QD=6.08;SB=-653.43	GT:AD:DP:GL:GQ	0/1:288,123:298:-353.40,-89.88,-659.17:99
-chr1	2605657	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=389;Dels=0.01;HRun=3;HaplotypeScore=175.38;MQ=30.03;MQ0=70;OQ=99.64;QD=0.26;SB=74.25	GT:AD:DP:GL:GQ	0/1:326,61:215:-77.75,-64.51,-660.65:99
-chr1	2605686	.	A	C	325.50	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=398;Dels=0.00;HRun=0;HaplotypeScore=501.75;MQ=28.89;MQ0=57;QD=0.82;SB=95.28	GT:AD:DP:GL:GQ	0/1:281,115:207:-98.21,-62.38,-634.44:99
-chr1	2605688	.	T	C	330.54	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=397;Dels=0.00;HRun=2;HaplotypeScore=497.47;MQ=28.92;MQ0=57;QD=0.83;SB=65.64	GT:AD:DP:GL:GQ	0/1:226,152:200:-122.31,-85.97,-661.75:99
-chr1	2605695	rs55827558	C	T	892.89	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=401;Dels=0.00;HRun=0;HaplotypeScore=534.98;MQ=29.24;MQ0=57;QD=2.23;SB=9.18	GT:AD:DP:GL:GQ	0/1:315,49:193:-153.53,-60.96,-575.72:99
-chr1	2605725	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=284;Dels=0.00;HRun=0;HaplotypeScore=360.95;MQ=32.85;MQ0=34;OQ=61.42;QD=0.22;SB=89.31	GT:AD:DP:GL:GQ	0/1:168,111:137:-50.75,-41.32,-529.65:94.25
-chr1	2605754	.	C	T	591.89	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=279;Dels=0.00;HRun=0;HaplotypeScore=467.58;MQ=37.63;MQ0=15;QD=2.12;SB=140.37	GT:AD:DP:GL:GQ	0/1:235,40:127:-100.77,-38.29,-327.93:99
-chr1	2605755	.	G	A	525.10	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=0;HaplotypeScore=436.48;MQ=37.79;MQ0=15;QD=1.94;SB=80.56	GT:AD:DP:GL:GQ	0/1:156,112:135:-96.50,-40.71,-357.83:99
-chr1	2605761	rs61763538	C	G	1339.29	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=259;Dels=0.00;HRun=1;HaplotypeScore=254.24;MQ=38.34;MQ0=17;QD=5.17;SB=4.72	GT:AD:DP:GL:GQ	0/1:84,169:121:-173.69,-36.48,-327.29:99
-chr1	2605783	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=297;Dels=0.00;HRun=0;HaplotypeScore=293.73;MQ=35.79;MQ0=20;OQ=562.93;QD=1.90;SB=121.81	GT:AD:DP:GL:GQ	0/1:195,74:123:-135.97,-76.40,-335.89:99
-chr1	2605795	.	G	A	252.45	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=324;Dels=0.00;HRun=0;HaplotypeScore=499.11;MQ=34.45;MQ0=20;QD=0.78;SB=203.66	GT:AD:DP:GL:GQ	0/1:201,116:126:-66.49,-37.96,-390.94:99
-chr1	2605804	.	C	T	66.11	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=356;Dels=0.00;HRun=0;HaplotypeScore=268.83;MQ=34.41;MQ0=22;QD=0.19;SB=-31.15	GT:AD:DP:GL:GQ	0/1:312,39:152:-58.55,-48.66,-460.06:98.95
-chr1	2605805	.	G	A	2340.79	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=356;Dels=0.00;HRun=0;HaplotypeScore=224.04;MQ=34.36;MQ0=23;QD=6.58;SB=164.74	GT:AD:DP:GL:GQ	0/1:199,157:186:-293.46,-56.10,-343.74:99
-chr1	2605831	.	C	T	1118.55	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=295;Dels=0.00;HRun=0;HaplotypeScore=238.92;MQ=35.23;MQ0=23;QD=3.79;SB=174.98	GT:AD:DP:GL:GQ	0/1:220,69:156:-162.17,-47.03,-376.03:99
-chr1	2605834	.	C	T	954.45	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=279;Dels=0.00;HRun=0;HaplotypeScore=236.05;MQ=35.80;MQ0=20;QD=3.42;SB=200.51	GT:AD:DP:GL:GQ	0/1:218,59:162:-147.54,-48.81,-432.29:99
-chr1	2605836	.	T	G	306.78	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=263;Dels=0.00;HRun=0;HaplotypeScore=206.04;MQ=36.89;MQ0=20;QD=1.17;SB=188.58	GT:AD:DP:GL:GQ	0/1:205,52:142:-88.13,-54.17,-440.06:99
-chr1	2605841	.	A	G	545.99	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=232;Dels=0.00;HRun=1;HaplotypeScore=155.67;MQ=38.58;MQ0=20;QD=2.35;SB=182.62	GT:AD:DP:GL:GQ	0/1:160,70:131:-97.35,-39.47,-411.37:99
-chr1	2605874	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=232;Dels=0.00;HRun=0;HaplotypeScore=124.99;MQ=42.37;MQ0=11;OQ=512.21;QD=2.21;SB=-14.46	GT:AD:DP:GL:GQ	0/1:155,74:147:-102.43,-47.93,-470.53:99
-chr1	2605886	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=201;Dels=0.00;HRun=0;HaplotypeScore=108.30;MQ=44.38;MQ0=8;OQ=363.46;QD=1.81;SB=149.68	GT:AD:DP:GL:GQ	0/1:128,71:139:-81.51,-41.88,-451.45:99
-chr1	2605893	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=197;Dels=0.00;HRun=0;HaplotypeScore=120.52;MQ=42.83;MQ0=17;OQ=327.45;QD=1.66;SB=185.60	GT:AD:DP:GL:GQ	0/1:128,68:129:-77.12,-41.09,-417.50:99
-chr1	2605899	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=204;Dels=0.00;HRun=1;HaplotypeScore=109.97;MQ=40.67;MQ0=24;OQ=225.12;QD=1.10;SB=176.57	GT:AD:DP:GL:GQ	0/1:183,21:132:-65.55,-39.76,-408.38:99
-chr1	2605937	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=199;Dels=0.00;HRun=2;HaplotypeScore=54.75;MQ=35.12;MQ0=33;OQ=125.52;QD=0.63;SB=203.69	GT:AD:DP:GL:GQ	0/1:151,48:110:-48.99,-33.15,-378.43:99
-chr1	2605949	rs55869659	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=295;Dels=0.00;HRun=1;HaplotypeScore=266.34;MQ=30.03;MQ0=43;OQ=1589.71;QD=5.39;SB=-453.79	GT:AD:DP:GL:GQ	0/1:231,64:135:-202.93,-40.67,-294.60:99
-chr1	2605976	rs6683769	G	C	6974.39	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=343;Dels=0.02;HRun=3;HaplotypeScore=423.51;MQ=29.44;MQ0=37;QD=20.33;SB=-2874.56	GT:AD:DP:GL:GQ	1/1:19,284:159:-696.44,-51.43,-8.07:99
-chr1	2605977	rs6661848	C	T	1027.05	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=358;Dels=0.00;HRun=0;HaplotypeScore=456.32;MQ=29.31;MQ0=37;QD=2.87;SB=-210.09	GT:AD:DP:GL:GQ	0/1:307,50:125:-143.65,-37.67,-316.41:99
-chr1	2605979	.	C	A	1028.24	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=357;Dels=0.00;HRun=1;HaplotypeScore=354.37;MQ=29.31;MQ0=37;QD=2.88;SB=152.21	GT:AD:DP:GL:GQ	0/1:297,56:154:-152.50,-46.39,-400.06:99
-chr1	2605985	.	A	G	302.88	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=344;Dels=0.00;HRun=1;HaplotypeScore=327.75;MQ=29.96;MQ0=33;QD=0.88;SB=170.59	GT:AD:DP:GL:GQ	0/1:269,70:128:-72.14,-38.56,-425.79:99
-chr1	2606004	.	C	T	951.09	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=290;Dels=0.00;HRun=0;HaplotypeScore=672.95;MQ=32.63;MQ0=23;QD=3.28;SB=87.89	GT:AD:DP:GL:GQ	0/1:220,66:128:-136.98,-38.59,-302.88:99
-chr1	2606005	rs6683777	G	A	1342.36	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=287;Dels=0.00;HRun=0;HaplotypeScore=631.13;MQ=33.21;MQ0=21;QD=4.68;SB=-76.00	GT:AD:DP:GL:GQ	0/1:85,177:126:-230.50,-92.98,-257.82:99
-chr1	2606006	rs57008511	G	T	1549.99	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=289;Dels=0.00;HRun=0;HaplotypeScore=644.99;MQ=33.16;MQ0=21;QD=5.36;SB=-385.70	GT:AD:DP:GL:GQ	0/1:228,60:127:-196.55,-38.27,-243.78:99
-chr1	2606009	.	A	T	459	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=281;Dels=0.00;HRun=0;HaplotypeScore=430.52;MQ=33.69;MQ0=19;QD=1.63;SB=105.62	GT:AD:DP:GL:GQ	0/1:113,66:123:-152.84,-103.65,-371.87:99
-chr1	2606031	.	C	G	597.38	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=222;Dels=0.00;HRun=1;HaplotypeScore=164.77;MQ=37.58;MQ0=8;QD=2.69;SB=139.07	GT:AD:DP:GL:GQ	0/1:114,51:127:-143.77,-80.75,-412.83:99
-chr1	2606038	.	C	A	277.03	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=217;Dels=0.00;HRun=0;HaplotypeScore=107.00;MQ=38.94;MQ0=8;QD=1.28;SB=120.78	GT:AD:DP:GL:GQ	0/1:160,54:121:-67.44,-36.45,-363.09:99
-chr1	2606041	.	G	T	124.23	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=206;Dels=0.00;HRun=0;HaplotypeScore=125.82;MQ=39.98;MQ0=7;QD=0.60;SB=144.54	GT:AD:DP:GL:GQ	0/1:161,44:113:-49.75,-34.04,-340.70:99
-chr1	2606206	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=315;Dels=0.00;HRun=1;HaplotypeScore=256.44;MQ=28.06;MQ0=39;OQ=155.48;QD=0.49;SB=-29.90	GT:AD:DP:GL:GQ	0/1:209,63:107:-66.50,-47.67,-397.67:99
-chr1	2606217	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=250;Dels=0.00;HRun=3;HaplotypeScore=224.65;MQ=29.86;MQ0=28;OQ=458.20;QD=1.83;SB=-95.78	GT:AD:DP:GL:GQ	0/1:87,160:81:-76.54,-27.44,-208.99:99
-chr1	2606220	rs36162961	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=249;Dels=0.00;HRun=0;HaplotypeScore=180.31;MQ=29.93;MQ0=27;OQ=201.47;QD=0.81;SB=-7.21	GT:AD:DP:GL:GQ	0/1:213,32:103:-54.47,-31.04,-311.81:99
-chr1	2606247	rs6662065	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=156;Dels=0.00;HRun=0;HaplotypeScore=58.65;MQ=36.60;MQ0=15;OQ=2337.23;QD=14.98;SB=-1097.47	GT:AD:DP:GL:GQ	0/1:41,86:97:-280.18,-43.17,-102.47:99
-chr1	2606279	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=1;HaplotypeScore=25.92;MQ=42.76;MQ0=2;OQ=312.76;QD=2.56;SB=-74.63	GT:AD:DP:GL:GQ	0/1:94,28:104:-65.90,-31.34,-343.27:99
-chr1	2606294	rs28562476	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=129;Dels=0.00;HRun=0;HaplotypeScore=45.48;MQ=41.64;MQ0=3;OQ=158.71;QD=1.23;SB=-91.27	GT:AD:DP:GL:GQ	0/1:99,30:98:-48.69,-29.54,-326.61:99
-chr1	2606300	rs6662172	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=148;Dels=0.00;HRun=1;HaplotypeScore=45.57;MQ=40.35;MQ0=4;OQ=2445.81;QD=16.53;SB=-1064.82	GT:AD:DP:GL:GQ	0/1:63,84:112:-281.60,-33.73,-119.13:99
-chr1	2606379	rs28410393	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=122;Dels=0.00;HRun=0;HaplotypeScore=27.63;MQ=39.78;MQ0=6;OQ=368.46;QD=3.02;SB=6.71	GT:AD:DP:GL:GQ	0/1:95,26:92:-67.86,-27.73,-327.77:99
-chr1	2606380	rs28520729	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=0;HaplotypeScore=27.50;MQ=39.82;MQ0=6;OQ=559.99;QD=4.71;SB=-194.85	GT:AD:DP:GL:GQ	0/1:94,25:96:-88.22,-28.94,-322.33:99
-chr1	2606465	rs28436923	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=147;Dels=0.00;HRun=0;HaplotypeScore=131.13;MQ=40.98;MQ0=13;OQ=2035.71;QD=13.85;SB=-905.49	GT:AD:DP:GL:GQ	0/1:80,64:81:-231.26,-24.41,-73.56:99
-chr1	2606518	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=0;HaplotypeScore=218.01;MQ=25.24;MQ0=20;OQ=216.97;QD=1.17;SB=68.19	GT:AD:DP:GL:GQ	0/1:119,56:69:-45.78,-20.79,-195.94:99
-chr1	2606520	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=182;Dels=0.01;HRun=1;HaplotypeScore=197.55;MQ=24.90;MQ0=18;OQ=425.87;QD=2.34;SB=7.72	GT:AD:DP:GL:GQ	0/1:98,71:68:-66.40,-20.53,-203.96:99
-chr1	2606555	rs55641610	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=142;Dels=0.00;HRun=0;HaplotypeScore=86.83;MQ=22.44;MQ0=15;OQ=611.31;QD=4.31;SB=-217.67	GT:AD:DP:GL:GQ	0/1:66,72:64:-83.70,-19.29,-186.04:99
-chr1	2606567	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=132;Dels=0.00;HRun=1;HaplotypeScore=115.34;MQ=22.30;MQ0=19;OQ=114.64;QD=0.87;SB=-3.31	GT:AD:DP:GL:GQ	0/1:113,14:59:-32.52,-17.77,-180.72:99
-chr1	2606594	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=41.70;MQ=23.56;MQ0=16;OQ=75.03;QD=0.63;SB=28.48	GT:AD:DP:GL:GQ	0/1:83,36:66:-30.68,-19.89,-255.45:99
-chr1	2606643	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=21.80;MQ=30.64;MQ0=12;OQ=1721.23;QD=15.37;SB=-793.00	GT:AD:DP:GL:GQ	0/1:46,66:82:-200.11,-24.70,-94.60:99
-chr1	2606798	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=16.08;MQ=18.33;MQ0=33;OQ=155.22;QD=2.13;SB=-92.26	GT:AD:DP:GL:GQ	0/1:36,34:23:-29.36,-10.56,-75.52:99
-chr1	2607095	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=174;Dels=0.00;HRun=0;HaplotypeScore=115.98;MQ=20.76;MQ0=93;OQ=63.80;QD=0.37;SB=-35.41	GT:AD:DP:GL:GQ	0/1:164,10:54:-25.95,-16.29,-195.04:96.63
-chr1	2607127	rs28555663	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=120;Dels=0.00;HRun=0;HaplotypeScore=71.01;MQ=31.05;MQ0=18;OQ=1628.35;QD=13.57;SB=-397.76	GT:AD:DP:GL:GQ	0/1:27,60:78:-215.41,-49.30,-93.76:99
-chr1	2607162	rs61763542	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=215;Dels=0.00;HRun=1;HaplotypeScore=85.56;MQ=29.70;MQ0=30;OQ=368.13;QD=1.71;SB=-56.56	GT:AD:DP:GL:GQ	0/1:178,35:124:-77.45,-37.35,-360.47:99
-chr1	2607163	.	G	A	13.12	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=217;Dels=0.00;HRun=2;HaplotypeScore=87.56;MQ=29.61;MQ0=31;QD=0.06;SB=-11.83	GT:AD:DP:GL:GQ	0/1:187,28:129:-43.44,-38.86,-425.52:45.74
-chr1	2607204	.	G	C	43.54	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=196;Dels=0.00;HRun=0;HaplotypeScore=43.04;MQ=31.64;MQ0=30;QD=0.22;SB=-29.18	GT:AD:DP:GL:GQ	0/1:170,26:109:-40.50,-32.86,-424.67:76.37
-chr1	2607231	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=1;HaplotypeScore=72.77;MQ=31.17;MQ0=24;OQ=125.47;QD=0.87;SB=-42.71	GT:AD:DP:GL:GQ	0/1:125,19:75:-38.43,-22.60,-228.94:99
-chr1	2607242	rs61763545	G	T	46.85	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.00;HRun=0;HaplotypeScore=36.90;MQ=31.04;MQ0=29;QD=0.40;SB=43.89	GT:AD:DP:GL:GQ	0/1:84,30:54:-24.25,-16.28,-154.98:79.69
-chr1	2607298	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=0;HaplotypeScore=68.12;MQ=14.41;MQ0=82;OQ=66.90;QD=0.45;SB=20.86	GT:AD:DP:GL:GQ	0/1:129,10:21:-19.87,-9.89,-58.18:99
-chr1	2607355	rs61765818	C	T	12.91	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.00;HRun=0;HaplotypeScore=56.37;MQ=16.61;MQ0=62;QD=0.11;SB=29.06	GT:AD:DP:GL:GQ	0/1:90,27:23:-11.49,-6.94,-61.93:45.51
-chr1	2607366	.	A	G	13.05	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=2;HaplotypeScore=34.50;MQ=17.10;MQ0=55;QD=0.12;SB=29.12	GT:AD:DP:GL:GQ	0/1:102,6:22:-11.19,-6.63,-75.23:45.67
-chr1	2607368	rs61763546	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=35.70;MQ=17.26;MQ0=53;OQ=303.93;QD=2.87;SB=-146.92	GT:AD:DP:GL:GQ	0/1:46,59:26:-41.51,-7.84,-47.60:99
-chr1	2607409	.	G	A	15.60	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=56.89;MQ=28.46;MQ0=6;QD=0.24;SB=38.64	GT:AD:DP:GL:GQ	0/1:41,24:37:-15.99,-11.15,-106.07:48.31
-chr1	2607422	rs56133135	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=3;HaplotypeScore=19.37;MQ=32.69;MQ0=0;OQ=693.38;QD=12.61;SB=2.03	GT:AD:DP:GL:GQ	0/1:26,28:39:-84.38,-11.76,-83.37:99
-chr1	2607465	rs61763547	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=40.98;MQ=25.86;MQ0=35;OQ=388.51;QD=4.63;SB=-36.91	GT:AD:DP:GL:GQ	0/1:60,23:42:-54.79,-12.65,-94.92:99
-chr1	2607520	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=176;Dels=0.00;HRun=1;HaplotypeScore=43.55;MQ=22.90;MQ0=79;OQ=121.23;QD=0.69;SB=8.68	GT:AD:DP:GL:GQ	0/1:158,14:67:-35.59,-20.18,-205.83:99
-chr1	2607562	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=147;Dels=0.00;HRun=0;HaplotypeScore=58.31;MQ=31.97;MQ0=28;OQ=222.37;QD=1.51;SB=-108.77	GT:AD:DP:GL:GQ	0/1:118,16:74:-51.32,-25.80,-191.60:99
-chr1	2607568	rs61763549	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=0;HaplotypeScore=80.59;MQ=33.84;MQ0=16;OQ=1066.74;QD=7.90;SB=-480.14	GT:AD:DP:GL:GQ	0/1:64,70:72:-131.67,-21.72,-176.26:99
-chr1	2607579	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=1;HaplotypeScore=59.49;MQ=32.83;MQ0=15;OQ=376.87;QD=2.37;SB=-134.64	GT:AD:DP:GL:GQ	0/1:129,30:89:-67.78,-26.81,-244.98:99
-chr1	2607622	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=166;Dels=0.00;HRun=1;HaplotypeScore=74.61;MQ=28.79;MQ0=41;OQ=121.71;QD=0.73;SB=1.49	GT:AD:DP:GL:GQ	0/1:144,22:68:-35.94,-20.49,-206.61:99
-chr1	2607635	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=177;Dels=0.00;HRun=1;HaplotypeScore=30.67;MQ=24.43;MQ0=69;OQ=168.44;QD=0.95;SB=-26.38	GT:AD:DP:GL:GQ	0/1:144,24:48:-34.61,-14.49,-156.01:99
-chr1	2607650	.	G	A	36.08	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=194;Dels=0.00;HRun=1;HaplotypeScore=75.42;MQ=22.15;MQ0=92;QD=0.19;SB=17.06	GT:AD:DP:GL:GQ	0/1:183,11:48:-21.35,-14.46,-155.19:68.92
-chr1	2607670	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=229;Dels=0.00;HRun=0;HaplotypeScore=160.50;MQ=16.74;MQ0=141;OQ=99.29;QD=0.43;SB=62.11	GT:AD:DP:GL:GQ	0/1:219,9:33:-23.18,-9.97,-80.62:99
-chr1	2607674	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=226;Dels=0.00;HRun=0;HaplotypeScore=115.26;MQ=15.31;MQ0=147;OQ=144.37;QD=0.64;SB=59.23	GT:AD:DP:GL:GQ	0/1:144,82:32:-27.37,-9.65,-111.07:99
-chr1	2607705	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=307;Dels=0.00;HRun=0;HaplotypeScore=135.41;MQ=9.50;MQ0=238;OQ=88.23;QD=0.29;SB=44.16	GT:AD:DP:GL:GQ	0/1:293,13:26:-19.94,-7.83,-70.73:99
-chr1	2607732	.	A	G	46.69	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=264;Dels=0.00;HRun=0;HaplotypeScore=160.28;MQ=9.40;MQ0=205;QD=0.18;SB=38.16	GT:AD:DP:GL:GQ	0/1:246,15:21:-14.28,-6.33,-70.03:79.52
-chr1	2607768	.	C	G	49.76	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=0;HaplotypeScore=95.94;MQ=10.01;MQ0=124;QD=0.30;SB=-3.98	GT:AD:DP:GL:GQ	0/1:136,25:16:-13.08,-4.82,-52.20:82.60
-chr1	2607891	rs7416366	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=122;Dels=0.00;HRun=0;HaplotypeScore=58.84;MQ=34.41;MQ0=14;OQ=1644.48;QD=13.48;SB=-506.65	GT:AD:DP:GL:GQ	0/1:59,63:73:-189.73,-22.00,-69.36:99
-chr1	2607919	.	C	G	24.55	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=221;Dels=0.00;HRun=0;HaplotypeScore=83.78;MQ=30.54;MQ0=25;QD=0.11;SB=109.84	GT:AD:DP:GL:GQ	0/1:205,16:120:-41.91,-36.17,-462.22:57.38
-chr1	2607925	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=1;HaplotypeScore=102.41;MQ=29.59;MQ0=28;OQ=208.07;QD=0.92;SB=12.89	GT:AD:DP:GL:GQ	0/1:171,51:116:-59.04,-34.95,-344.67:99
-chr1	2607990	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=215;Dels=0.00;HRun=0;HaplotypeScore=62.53;MQ=19.75;MQ0=60;OQ=143.02;QD=0.67;SB=-11.93	GT:AD:DP:GL:GQ	0/1:169,45:70:-38.68,-21.10,-211.21:99
-chr1	2608016	rs61763552	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=154;Dels=0.00;HRun=1;HaplotypeScore=33.08;MQ=18.38;MQ0=35;OQ=157.73;QD=1.02;SB=-56.91	GT:AD:DP:GL:GQ	0/1:74,80:55:-35.63,-16.57,-153.82:99
-chr1	2608035	rs60386739	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=141;Dels=0.00;HRun=1;HaplotypeScore=68.10;MQ=20.23;MQ0=19;OQ=139.83;QD=0.99;SB=-34.61	GT:AD:DP:GL:GQ	0/1:123,11:68:-37.75,-20.49,-226.75:99
-chr1	2608187	.	T	A	19.78	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=0;HaplotypeScore=100.91;MQ=20.82;MQ0=35;QD=0.14;SB=68.21	GT:AD:DP:GL:GQ	0/1:73,68:45:-18.82,-13.56,-139.70:52.57
-chr1	2608269	rs28464857	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=186;Dels=0.00;HRun=0;HaplotypeScore=134.04;MQ=20.25;MQ0=84;OQ=169.32;QD=0.91;SB=-92.57	GT:AD:DP:GL:GQ	0/1:170,15:57:-37.38,-17.17,-176.94:99
-chr1	2608484	rs28436796	C	G	0.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=9.24;MQ=47.84;MQ0=1;OQ=487.04;QD=5.47;SB=-196.59	GT:AD:DP:GL:GQ	0/1:66,21:74:-74.31,-22.32,-232.63:99
-chr1	2608664	rs4074927	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=182;Dels=0.01;HRun=1;HaplotypeScore=99.89;MQ=34.06;MQ0=19;OQ=2375.90;QD=13.05;SB=-939.83	GT:AD:DP:GL:GQ	0/1:91,85:111:-274.32,-33.45,-107.97:99
-chr1	2608867	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=118;Dels=0.01;HRun=2;HaplotypeScore=20.49;MQ=45.47;MQ0=7;OQ=974.46;QD=8.26;SB=-210.08	GT:AD:DP:GL:GQ	0/1:62,55:87:-126.99,-26.26,-221.81:99
-chr1	2609068	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=221;Dels=0.00;HRun=3;HaplotypeScore=118.35;MQ=34.13;MQ0=24;OQ=526.94;QD=2.38;SB=137.47	GT:AD:DP:GL:GQ	0/1:93,112:118:-95.11,-39.14,-362.67:99
-chr1	2609088	rs6604995	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=244;Dels=0.00;HRun=1;HaplotypeScore=80.61;MQ=35.58;MQ0=31;OQ=2415.96;QD=9.90;SB=-1183.52	GT:AD:DP:GL:GQ	0/1:168,75:136:-285.85,-40.97,-232.15:99
-chr1	2609117	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=242;Dels=0.00;HRun=0;HaplotypeScore=86.85;MQ=40.05;MQ0=22;OQ=564.86;QD=2.33;SB=136.90	GT:AD:DP:GL:GQ	0/1:188,54:147:-104.06,-44.29,-429.75:99
-chr1	2609119	.	T	A	10.35	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=240;Dels=0.00;HRun=1;HaplotypeScore=66.02;MQ=40.40;MQ0=19;QD=0.04;SB=-13.71	GT:AD:DP:GL:GQ	0/1:216,24:153:-50.36,-46.09,-521.00:42.77
-chr1	2609136	rs6680012	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=252;Dels=0.00;HRun=0;HaplotypeScore=138.11;MQ=41.19;MQ0=14;OQ=1288.83;QD=5.11;SB=-20.42	GT:AD:DP:GL:GQ	0/1:111,140:159:-180.06,-47.89,-385.06:99
-chr1	2609225	rs61765683	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=279;Dels=0.00;HRun=0;HaplotypeScore=196.30;MQ=28.44;MQ0=55;OQ=715.74;QD=2.57;SB=-196.88	GT:AD:DP:GL:GQ	0/1:215,53:119:-124.19,-49.34,-290.35:99
-chr1	2609273	rs4648680	A	T	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=189;Dels=0.00;HRun=0;HaplotypeScore=41.61;MQ=19.84;MQ0=34;OQ=2444.19;QD=12.93;SB=-891.61	GT:AD:DP:GL:GQ	1/1:0,186:71:-248.05,-21.40,-0.04:99
-chr1	2609305	rs6672446	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=196;Dels=0.00;HRun=1;HaplotypeScore=44.27;MQ=21.28;MQ0=40;OQ=1443.42;QD=7.36;SB=-313.15	GT:AD:DP:GL:GQ	0/1:121,75:90:-174.74,-27.11,-141.16:99
-chr1	2609332	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=1;HaplotypeScore=25.23;MQ=24.42;MQ0=31;OQ=1010.88;QD=5.29;SB=-411.33	GT:AD:DP:GL:GQ	0/1:130,60:101:-134.82,-30.45,-224.41:99
-chr1	2609354	rs61765685	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=264;Dels=0.00;HRun=0;HaplotypeScore=43.36;MQ=26.38;MQ0=47;OQ=877.95;QD=3.33;SB=-290.40	GT:AD:DP:GL:GQ	0/1:123,140:122:-127.86,-36.78,-326.56:99
-chr1	2609381	.	C	A	220.25	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=378;Dels=0.00;HRun=0;HaplotypeScore=205.42;MQ=26.54;MQ0=63;QD=0.58;SB=-92.16	GT:AD:DP:GL:GQ	0/1:327,50:132:-65.07,-39.76,-400.14:99
-chr1	2609387	.	C	A	185.57	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=439;Dels=0.00;HRun=0;HaplotypeScore=250.48;MQ=26.77;MQ0=67;QD=0.42;SB=5.95	GT:AD:DP:GL:GQ	0/1:387,52:145:-65.52,-43.68,-445.14:99
-chr1	2609389	.	C	T	92.18	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=450;Dels=0.00;HRun=0;HaplotypeScore=251.37;MQ=26.71;MQ0=67;QD=0.20;SB=175.01	GT:AD:DP:GL:GQ	0/1:391,58:155:-59.19,-46.69,-504.94:99
-chr1	2609452	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=378;Dels=0.00;HRun=2;HaplotypeScore=241.26;MQ=31.94;MQ0=54;OQ=971.37;QD=2.57;SB=-357.67	GT:AD:DP:GL:GQ	0/1:305,73:146:-144.40,-43.98,-395.70:99
-chr1	2609455	rs58318704	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=356;Dels=0.00;HRun=0;HaplotypeScore=220.51;MQ=31.91;MQ0=49;OQ=2158.97;QD=6.06;SB=-1017.43	GT:AD:DP:GL:GQ	0/1:79,219:141:-270.22,-51.04,-310.17:99
-chr1	2609547	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=1;HaplotypeScore=66.94;MQ=35.31;MQ0=17;OQ=674.03;QD=3.60;SB=-244.40	GT:AD:DP:GL:GQ	0/1:135,50:133:-110.75,-40.07,-356.06:99
-chr1	2609555	rs28575476	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=171;Dels=0.00;HRun=0;HaplotypeScore=68.51;MQ=35.35;MQ0=12;OQ=1288.35;QD=7.53;SB=-481.51	GT:AD:DP:GL:GQ	0/1:88,78:120:-168.27,-36.15,-252.36:99
-chr1	2609591	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=172;Dels=0.00;HRun=0;HaplotypeScore=34.97;MQ=33.84;MQ0=11;OQ=2484.13;QD=14.44;SB=-938.03	GT:AD:DP:GL:GQ	0/1:84,88:135:-292.43,-40.73,-257.29:99
-chr1	2609644	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=353;Dels=0.00;HRun=1;HaplotypeScore=213.12;MQ=29.19;MQ0=26;OQ=1530.86;QD=4.34;SB=-311.00	GT:AD:DP:GL:GQ	0/1:205,118:177:-209.80,-53.43,-491.62:99
-chr1	2609668	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=375;Dels=0.01;HRun=0;HaplotypeScore=299.53;MQ=28.31;MQ0=38;OQ=119.51;QD=0.32;SB=-39.52	GT:AD:DP:GL:GQ	0/1:330,33:168:-65.89,-50.66,-484.68:99
-chr1	2609669	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=370;Dels=0.01;HRun=3;HaplotypeScore=295.29;MQ=28.20;MQ0=38;OQ=509.10;QD=1.38;SB=-148.65	GT:AD:DP:GL:GQ	0/1:202,146:144:-97.68,-43.48,-474.43:99
-chr1	2609682	.	T	C	10.13	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=358;Dels=0.00;HRun=1;HaplotypeScore=318.76;MQ=28.20;MQ0=43;QD=0.03;SB=29.61	GT:AD:DP:GL:GQ	0/1:328,21:141:-56.49,-52.23,-495.36:42.52
-chr1	2609688	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=357;Dels=0.00;HRun=0;HaplotypeScore=304.49;MQ=28.68;MQ0=43;OQ=540.31;QD=1.51;SB=-146.86	GT:AD:DP:GL:GQ	0/1:288,44:135:-97.99,-40.67,-405.76:99
-chr1	2609713	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=325;Dels=0.00;HRun=2;HaplotypeScore=235.46;MQ=29.07;MQ0=50;OQ=183.31;QD=0.56;SB=-70.06	GT:AD:DP:GL:GQ	0/1:293,30:98:-51.18,-29.56,-309.43:99
-chr1	2609764	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=67.69;MQ=41.15;MQ0=28;OQ=547.70;QD=3.06;SB=-220.32	GT:AD:DP:GL:GQ	0/1:154,22:97:-87.34,-29.29,-296.73:99
-chr1	2609770	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=0;HaplotypeScore=51.04;MQ=41.72;MQ0=28;OQ=50.39;QD=0.29;SB=107.80	GT:AD:DP:GL:GQ	0/1:92,83:96:-37.25,-28.93,-332.67:83.23
-chr1	2609843	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=18.24;MQ=41.49;MQ0=22;OQ=514.69;QD=3.78;SB=-103.96	GT:AD:DP:GL:GQ	0/1:89,47:97:-83.99,-29.23,-261.15:99
-chr1	2609879	rs60995822	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.00;HRun=0;HaplotypeScore=53.77;MQ=31.75;MQ0=20;OQ=1688.97;QD=13.62;SB=-590.07	GT:AD:DP:GL:GQ	0/1:21,102:69:-192.97,-20.79,-48.84:99
-chr1	2609938	rs61765691	T	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=210;Dels=0.00;HRun=0;HaplotypeScore=78.06;MQ=23.32;MQ0=40;OQ=3717.12;QD=17.70;SB=-1751.06	GT:AD:DP:GL:GQ	1/1:3,206:105:-370.71,-31.64,-0.05:99
-chr1	2610024	rs60041779	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=125;Dels=0.00;HRun=0;HaplotypeScore=93.88;MQ=40.95;MQ0=10;OQ=112.09;QD=0.90;SB=83.51	GT:AD:DP:GL:GQ	0/1:77,47:69:-35.30,-20.81,-248.60:99
-chr1	2610174	rs61765693	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=331;Dels=0.00;HRun=1;HaplotypeScore=45.52;MQ=28.55;MQ0=47;OQ=762.69;QD=2.30;SB=-121.02	GT:AD:DP:GL:GQ	0/1:162,168:127:-117.91,-38.35,-381.81:99
-chr1	2610186	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=354;Dels=0.00;HRun=0;HaplotypeScore=102.42;MQ=26.42;MQ0=47;OQ=1467.29;QD=4.14;SB=-129.66	GT:AD:DP:GL:GQ	0/1:303,49:127:-191.55,-41.54,-284.06:99
-chr1	2610220	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=358;Dels=0.00;HRun=0;HaplotypeScore=158.15;MQ=26.10;MQ0=33;OQ=52.73;QD=0.15;SB=-33.83	GT:AD:DP:GL:GQ	0/1:323,33:128:-47.12,-38.57,-405.99:85.57
-chr1	2610228	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=347;Dels=0.00;HRun=0;HaplotypeScore=258.31;MQ=25.86;MQ0=32;OQ=417.23;QD=1.20;SB=-217.33	GT:AD:DP:GL:GQ	0/1:235,103:129:-86.15,-41.14,-407.87:99
-chr1	2610288	rs61765694	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=240;Dels=0.00;HRun=0;HaplotypeScore=161.76;MQ=34.28;MQ0=24;OQ=460.60;QD=1.92;SB=-235.27	GT:AD:DP:GL:GQ	0/1:119,106:122:-91.58,-42.24,-307.51:99
-chr1	2610304	rs57887432	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=214;Dels=0.00;HRun=1;HaplotypeScore=126.12;MQ=34.24;MQ0=19;OQ=2078.47;QD=9.71;SB=-912.59	GT:AD:DP:GL:GQ	0/1:141,72:106:-243.09,-31.96,-204.85:99
-chr1	2610325	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=0;HaplotypeScore=58.60;MQ=38.14;MQ0=8;OQ=610.61;QD=3.94;SB=-307.83	GT:AD:DP:GL:GQ	0/1:117,38:94:-92.67,-28.33,-261.00:99
-chr1	2610342	rs58318302	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=111;Dels=0.00;HRun=0;HaplotypeScore=64.33;MQ=41.99;MQ0=6;OQ=1628.60;QD=14.67;SB=-308.68	GT:AD:DP:GL:GQ	0/1:43,66:83:-191.15,-25.00,-121.94:99
-chr1	2610414	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=331;Dels=0.00;HRun=0;HaplotypeScore=235.51;MQ=30.47;MQ0=22;OQ=935.47;QD=2.83;SB=-429.72	GT:AD:DP:GL:GQ	0/1:275,53:139:-142.25,-45.42,-348.13:99
-chr1	2610415	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=337;Dels=0.00;HRun=1;HaplotypeScore=237.48;MQ=30.55;MQ0=22;OQ=1122.12;QD=3.33;SB=-419.64	GT:AD:DP:GL:GQ	0/1:156,170:150:-188.30,-72.80,-443.59:99
-chr1	2610441	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=398;Dels=0.00;HRun=0;HaplotypeScore=305.07;MQ=30.41;MQ0=29;OQ=523.24;QD=1.31;SB=-254.15	GT:AD:DP:GL:GQ	0/1:145,184:159:-118.96,-63.35,-451.63:99
-chr1	2610473	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=351;Dels=0.00;HRun=1;HaplotypeScore=331.68;MQ=29.41;MQ0=37;OQ=1376.69;QD=3.92;SB=-162.02	GT:AD:DP:GL:GQ	0/1:286,64:127:-179.22,-38.27,-253.78:99
-chr1	2610474	rs28418735	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=350;Dels=0.03;HRun=3;HaplotypeScore=309.89;MQ=29.49;MQ0=38;OQ=65.43;QD=0.19;SB=221.76	GT:AD:DP:GL:GQ	0/1:271,68:132:-49.66,-39.83,-486.19:98.27
-chr1	2610506	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=199;Dels=0.00;HRun=0;HaplotypeScore=143.13;MQ=32.96;MQ0=24;OQ=241.48;QD=1.21;SB=-28.90	GT:AD:DP:GL:GQ	0/1:85,107:74:-49.73,-22.29,-227.60:99
-chr1	2610517	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=3;HaplotypeScore=142.26;MQ=34.55;MQ0=20;OQ=220.80;QD=1.35;SB=75.68	GT:AD:DP:GL:GQ	0/1:65,82:63:-52.24,-26.88,-202.10:99
-chr1	2610573	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=104.72;MQ=37.56;MQ0=8;OQ=553.10;QD=3.29;SB=-39.90	GT:AD:DP:GL:GQ	0/1:88,80:80:-82.71,-24.12,-188.70:99
-chr1	2610594	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=122;Dels=0.02;HRun=0;HaplotypeScore=84.91;MQ=43.41;MQ0=3;OQ=1001.55;QD=8.21;SB=-522.00	GT:AD:DP:GL:GQ	0/1:52,66:81:-127.86,-24.42,-216.74:99
-chr1	2610598	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=2;HaplotypeScore=59.26;MQ=42.74;MQ0=3;OQ=1239.36;QD=9.61;SB=-593.34	GT:AD:DP:GL:GQ	0/1:51,77:86:-153.17,-25.95,-194.38:99
-chr1	2610632	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=184;Dels=0.00;HRun=0;HaplotypeScore=151.91;MQ=39.51;MQ0=6;OQ=369.19;QD=2.01;SB=-62.83	GT:AD:DP:GL:GQ	0/1:154,30:112:-73.95,-33.75,-316.70:99
-chr1	2610635	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=139.15;MQ=38.51;MQ0=6;OQ=274.48;QD=1.35;SB=-41.80	GT:AD:DP:GL:GQ	0/1:164,37:123:-67.82,-37.08,-455.22:99
-chr1	2610665	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=215;Dels=0.00;HRun=1;HaplotypeScore=315.73;MQ=36.51;MQ0=11;OQ=1591.77;QD=7.40;SB=-670.77	GT:AD:DP:GL:GQ	0/1:149,65:109:-195.35,-32.89,-252.45:99
-chr1	2610712	rs55957791	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=278;Dels=0.00;HRun=0;HaplotypeScore=331.10;MQ=30.73;MQ0=38;OQ=351.17;QD=1.26;SB=50.69	GT:AD:DP:GL:GQ	0/1:157,116:120:-81.22,-42.82,-389.65:99
-chr1	2610714	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=276;Dels=0.03;HRun=1;HaplotypeScore=276.80;MQ=30.44;MQ0=40;OQ=799.29;QD=2.90;SB=-215.74	GT:AD:DP:GL:GQ	0/1:208,58:112:-116.35,-33.14,-272.42:99
-chr1	2610938	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=0;HaplotypeScore=61.08;MQ=40.33;MQ0=9;OQ=2312.34;QD=13.21;SB=-496.11	GT:AD:DP:GL:GQ	0/1:80,95:114:-268.87,-34.35,-152.15:99
-chr1	2610982	rs61765696	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=168;Dels=0.00;HRun=1;HaplotypeScore=77.40;MQ=36.09;MQ0=4;OQ=730.22;QD=4.35;SB=-250.72	GT:AD:DP:GL:GQ	0/1:133,34:93:-104.33,-28.02,-240.35:99
-chr1	2610988	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=177;Dels=0.00;HRun=2;HaplotypeScore=104.66;MQ=37.43;MQ0=4;OQ=180.91;QD=1.02;SB=-14.66	GT:AD:DP:GL:GQ	0/1:124,53:103:-52.42,-31.04,-397.79:99
-chr1	2611005	rs28657620	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=175;Dels=0.00;HRun=0;HaplotypeScore=240.92;MQ=35.09;MQ0=11;OQ=589.04;QD=3.37;SB=-319.71	GT:AD:DP:GL:GQ	0/1:148,26:83:-87.21,-25.02,-177.35:99
-chr1	2611008	rs61765697	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=177;Dels=0.00;HRun=0;HaplotypeScore=268.58;MQ=34.75;MQ0=11;OQ=814.23;QD=4.60;SB=-203.16	GT:AD:DP:GL:GQ	0/1:94,75:81:-109.12,-24.42,-183.44:99
-chr1	2611037	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=212;Dels=0.00;HRun=3;HaplotypeScore=47.75;MQ=33.75;MQ0=25;OQ=310.37;QD=1.46;SB=128.35	GT:AD:DP:GL:GQ	0/1:180,32:105:-65.95,-31.63,-301.79:99
-chr1	2611075	.	C	A	675.15	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=198;Dels=0.00;HRun=0;HaplotypeScore=289.45;MQ=35.67;MQ0=15;QD=3.41;SB=-245.12	GT:AD:DP:GL:GQ	0/1:138,49:92:-105.75,-34.95,-225.78:99
-chr1	2611076	.	C	A	59.41	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=199;Dels=0.00;HRun=0;HaplotypeScore=288.77;MQ=35.79;MQ0=15;QD=0.30;SB=-43.36	GT:AD:DP:GL:GQ	0/1:179,20:91:-36.64,-27.42,-281.03:92.25
-chr1	2611077	.	T	C	1287	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=199;Dels=0.00;HRun=3;HaplotypeScore=272.49;MQ=35.97;MQ0=16;QD=6.47;SB=-518.91	GT:AD:DP:GL:GQ	0/1:56,142:93:-160.01,-28.02,-190.32:99
-chr1	2611149	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=0;HaplotypeScore=128.93;MQ=29.89;MQ0=30;OQ=118.35;QD=0.49;SB=-20.53	GT:AD:DP:GL:GQ	0/1:190,53:92:-42.83,-27.72,-276.95:99
-chr1	2611155	rs61765698	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=245;Dels=0.00;HRun=0;HaplotypeScore=130.50;MQ=30.96;MQ0=25;OQ=203.44;QD=0.83;SB=-29.37	GT:AD:DP:GL:GQ	0/1:191,50:97:-52.56,-28.94,-359.64:99
-chr1	2611193	rs61029569	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=154;Dels=0.01;HRun=0;HaplotypeScore=78.67;MQ=38.69;MQ0=8;OQ=1417.86;QD=9.21;SB=-633.08	GT:AD:DP:GL:GQ	0/1:43,100:84:-170.37,-25.30,-121.64:99
-chr1	2611212	rs28774982	C	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=125;Dels=0.00;HRun=0;HaplotypeScore=29.20;MQ=42.14;MQ0=3;OQ=3660.18;QD=29.28;SB=-1724.01	GT:AD:DP:GL:GQ	1/1:0,124:85:-365.02,-25.61,-0.03:99
-chr1	2611218	rs28581654	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=132;Dels=0.00;HRun=1;HaplotypeScore=33.13;MQ=42.84;MQ0=2;OQ=1779.64;QD=13.48;SB=-735.33	GT:AD:DP:GL:GQ	0/1:39,85:92:-211.73,-30.48,-139.53:99
-chr1	2611236	rs61765699	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=181;Dels=0.00;HRun=1;HaplotypeScore=137.95;MQ=39.80;MQ0=14;OQ=1598.49;QD=8.83;SB=-821.38	GT:AD:DP:GL:GQ	0/1:99,78:96:-192.06,-28.93,-137.58:99
-chr1	2611310	.	G	C	25	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=214;Dels=0.00;HRun=2;HaplotypeScore=68.15;MQ=29.71;MQ0=28;QD=0.12;SB=77.64	GT:AD:DP:GL:GQ	0/1:182,25:80:-33.47,-27.69,-302.15:57.82
-chr1	2611331	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=170;Dels=0.00;HRun=0;HaplotypeScore=171.01;MQ=28.57;MQ0=19;OQ=169.19;QD=1.00;SB=32.13	GT:AD:DP:GL:GQ	0/1:101,40:47:-34.37,-14.17,-141.57:99
-chr1	2611336	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=160;Dels=0.00;HRun=0;HaplotypeScore=142.89;MQ=27.04;MQ0=20;OQ=617.89;QD=3.86;SB=-201.64	GT:AD:DP:GL:GQ	0/1:32,126:45:-78.63,-13.56,-88.17:99
-chr1	2611359	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=160;Dels=0.00;HRun=2;HaplotypeScore=100.78;MQ=27.44;MQ0=19;OQ=605.72;QD=3.79;SB=-223.68	GT:AD:DP:GL:GQ	0/1:36,124:39:-75.62,-11.76,-86.35:99
-chr1	2611360	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=172;Dels=0.01;HRun=0;HaplotypeScore=100.05;MQ=27.08;MQ0=24;OQ=169.30;QD=0.98;SB=23.10	GT:AD:DP:GL:GQ	0/1:135,36:41:-32.56,-12.35,-112.95:99
-chr1	2611385	.	A	G	25.43	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=202;Dels=0.00;HRun=0;HaplotypeScore=141.90;MQ=28.13;MQ0=36;QD=0.13;SB=77.25	GT:AD:DP:GL:GQ	0/1:184,18:55:-22.41,-16.58,-186.56:58.25
-chr1	2611395	.	C	A	10.87	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=190;Dels=0.00;HRun=1;HaplotypeScore=214.46;MQ=28.47;MQ0=34;QD=0.06;SB=44.16	GT:AD:DP:GL:GQ	0/1:160,27:48:-18.79,-14.46,-145.75:43.33
-chr1	2611409	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=176;Dels=0.00;HRun=0;HaplotypeScore=170.63;MQ=30.96;MQ0=28;OQ=246.71;QD=1.40;SB=-63.23	GT:AD:DP:GL:GQ	0/1:66,90:51:-46.30,-18.34,-146.08:99
-chr1	2611417	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=201.92;MQ=31.46;MQ0=25;OQ=276.60;QD=1.55;SB=-61.04	GT:AD:DP:GL:GQ	0/1:50,88:59:-67.59,-36.64,-159.73:99
-chr1	2611440	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=180;Dels=0.00;HRun=0;HaplotypeScore=297.52;MQ=31.70;MQ0=24;OQ=229.57;QD=1.28;SB=65.18	GT:AD:DP:GL:GQ	0/1:152,22:68:-46.74,-20.49,-196.70:99
-chr1	2611441	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=4;HaplotypeScore=281.36;MQ=31.83;MQ0=24;OQ=677.61;QD=3.87;SB=-187.78	GT:AD:DP:GL:GQ	0/1:57,116:70:-92.13,-21.09,-155.28:99
-chr1	2611460	.	G	C	143.72	DPFilter;HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=209;Dels=0.02;HRun=1;HaplotypeScore=206.53;MQ=28.72;MQ0=29;QD=0.69;SB=95.33	GT:AD:DP:GL:GQ	0/1:169,33:67:-37.89,-20.23,-223.47:99
-chr1	2611462	.	G	C	346.96	DPFilter;HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=206;Dels=0.00;HRun=0;HaplotypeScore=159.36;MQ=28.99;MQ0=26;QD=1.68;SB=95.35	GT:AD:DP:GL:GQ	0/1:176,30:73:-60.00,-22.02,-249.89:99
-chr1	2611473	.	C	A	226.87	DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=197;Dels=0.00;HRun=0;HaplotypeScore=716.79;MQ=27.80;MQ0=23;QD=1.15;SB=98.33	GT:AD:DP:GL:GQ	0/1:167,28:68:-46.46,-20.49,-193.68:99
-chr1	2611481	.	A	C	47.15	DPFilter;HARD_TO_VALIDATE;Indel;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=3;HaplotypeScore=376.14;MQ=26.76;MQ0=25;QD=0.22;SB=4.29	GT:AD:DP:GL:GQ	0/1:158,51:68:-32.16,-24.16,-211.95:79.99
-chr1	2611482	rs28657015	C	T	493.48	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=216;Dels=0.03;HRun=0;HaplotypeScore=277.76;MQ=26.81;MQ0=24;QD=2.28;SB=-58.33	GT:AD:DP:GL:GQ	0/1:180,23:71:-73.42,-20.79,-178.37:99
-chr1	2611484	.	G	A	123.65	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=217;Dels=0.00;HRun=1;HaplotypeScore=257.24;MQ=26.43;MQ0=26;QD=0.57;SB=52.66	GT:AD:DP:GL:GQ	0/1:181,35:66:-35.53,-19.88,-208.25:99
-chr1	2611506	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=1;HaplotypeScore=227.39;MQ=23.92;MQ0=38;OQ=83.72;QD=0.34;SB=1.08	GT:AD:DP:GL:GQ	0/1:205,36:67:-31.84,-20.19,-209.30:99
-chr1	2611529	.	G	C	1369.67	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=0;HaplotypeScore=198.19;MQ=24.21;MQ0=25;QD=7.40;SB=-595.38	GT:AD:DP:GL:GQ	0/1:36,136:57:-168.20,-27.95,-90.83:99
-chr1	2611531	.	T	A	49.73	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=1;HaplotypeScore=167.31;MQ=24.09;MQ0=26;QD=0.27;SB=30.12	GT:AD:DP:GL:GQ	0/1:175,9:48:-26.14,-17.88,-160.86:82.57
-chr1	2611537	.	A	C	10.75	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=1;HaplotypeScore=150.76;MQ=24.75;MQ0=25;QD=0.06;SB=49.53	GT:AD:DP:GL:GQ	0/1:160,17:47:-21.51,-17.19,-149.44:43.20
-chr1	2611551	.	C	A	34.16	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=166;Dels=0.02;HRun=1;HaplotypeScore=423.66;MQ=25.51;MQ0=20;QD=0.21;SB=47.16	GT:AD:DP:GL:GQ	0/1:139,17:37:-21.33,-14.63,-112.07:67
-chr1	2611559	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=150;Dels=0.01;HRun=3;HaplotypeScore=531.42;MQ=25.48;MQ0=17;OQ=388.67;QD=2.59;SB=-7.62	GT:AD:DP:GL:GQ	0/1:47,82:45:-90.78,-48.63,-105.70:99
-chr1	2611586	.	G	A	21.13	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=158;Dels=0.00;HRun=1;HaplotypeScore=127.50;MQ=28.93;MQ0=18;QD=0.13;SB=47.15	GT:AD:DP:GL:GQ	0/1:123,29:42:-18.05,-12.65,-132.34:53.94
-chr1	2611593	.	C	A	39.57	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=0;HaplotypeScore=189.22;MQ=30.35;MQ0=16;QD=0.29;SB=47.17	GT:AD:DP:GL:GQ	0/1:123,13:39:-18.99,-11.75,-120.10:72.41
-chr1	2611600	.	T	C	291.60	SnpCluster	AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=2;HaplotypeScore=197.17;MQ=32.27;MQ0=10;QD=2.58;SB=-146.84	GT:AD:DP:GL:GQ	0/1:38,66:38:-47.43,-14.99,-100.79:99
-chr1	2611602	.	C	G	76.87	SnpCluster	AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=173.17;MQ=32.76;MQ0=9;QD=0.68;SB=-63.17	GT:AD:DP:GL:GQ	0/1:81,31:39:-22.73,-11.76,-142.68:99
-chr1	2611613	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=122.16;MQ=34.85;MQ0=5;OQ=326.72;QD=4.08;SB=-171.57	GT:AD:DP:GL:GQ	0/1:20,59:33:-49.07,-13.11,-79.40:99
-chr1	2611623	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=1;HaplotypeScore=114.07;MQ=31.99;MQ0=3;OQ=59.10;QD=0.57;SB=53.18	GT:AD:DP:GL:GQ	0/1:44,51:42:-30.56,-21.37,-135.55:91.94
-chr1	2611678	.	C	A	64.73	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=1;HaplotypeScore=80.70;MQ=27.19;MQ0=13;QD=0.45;SB=-53.00	GT:AD:DP:GL:GQ	0/1:121,21:50:-24.83,-15.07,-143.50:97.56
-chr1	2611679	.	C	T	18.94	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=0;HaplotypeScore=77.77;MQ=26.46;MQ0=13;QD=0.14;SB=-28.00	GT:AD:DP:GL:GQ	0/1:130,7:48:-19.64,-14.46,-152.87:51.72
-chr1	2611680	.	C	A	348.12	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=72.18;MQ=26.57;MQ0=13;QD=2.58;SB=-130.78	GT:AD:DP:GL:GQ	0/1:71,64:46:-51.95,-13.86,-109.26:99
-chr1	2611697	rs28420770	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.01;HRun=1;HaplotypeScore=63.25;MQ=30.55;MQ0=12;OQ=549.37;QD=5.97;SB=-271.47	GT:AD:DP:GL:GQ	0/1:70,21:28:-66.35,-8.13,-30.04:99
-chr1	2611699	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=39.05;MQ=32.12;MQ0=10;OQ=169.31;QD=2.23;SB=14.08	GT:AD:DP:GL:GQ	0/1:20,50:24:-27.45,-7.24,-73.47:99
-chr1	2611710	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=70.70;MQ=31.94;MQ0=10;OQ=120.36;QD=1.56;SB=14.06	GT:AD:DP:GL:GQ	0/1:29,48:25:-22.85,-7.53,-69.69:99
-chr1	2611716	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=60.36;MQ=32.04;MQ0=11;OQ=222.09;QD=2.71;SB=-31.85	GT:AD:DP:GL:GQ	0/1:24,55:26:-33.33,-7.83,-79.05:99
-chr1	2611761	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=2;HaplotypeScore=77.17;MQ=34.64;MQ0=9;OQ=73.97;QD=1.01;SB=-32.72	GT:AD:DP:GL:GQ	0/1:30,33:31:-23.41,-12.73,-88.75:99
-chr1	2611777	.	A	C	23.19	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=20.98;MQ=38.72;MQ0=5;QD=0.42;SB=23.10	GT:AD:DP:GL:GQ	0/1:24,30:28:-14.03,-8.43,-89.75:56.01
-chr1	2611805	.	A	G	44.82	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=14.04;MQ=39.70;MQ0=6;QD=0.79;SB=-36.77	GT:AD:DP:GL:GQ	0/1:29,28:32:-17.41,-9.64,-104.85:77.66
-chr1	2611822	.	C	T	55.46	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=121;Dels=0.00;HRun=0;HaplotypeScore=122.77;MQ=30.12;MQ0=10;QD=0.46;SB=-42.84	GT:AD:DP:GL:GQ	0/1:92,29:48:-23.31,-14.48,-136.72:88.30
-chr1	2611823	.	G	A	42.96	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=122.08;MQ=30.26;MQ0=10;QD=0.35;SB=5.54	GT:AD:DP:GL:GQ	0/1:91,15:51:-29.64,-22.06,-149.48:75.79
-chr1	2611827	.	C	G	117.16	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=1;HaplotypeScore=109.01;MQ=29.94;MQ0=10;QD=0.92;SB=-46.17	GT:AD:DP:GL:GQ	0/1:97,15:52:-50.99,-35.99,-189.94:99
-chr1	2611857	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=244;Dels=0.00;HRun=1;HaplotypeScore=130.70;MQ=25.34;MQ0=25;OQ=261.41;QD=1.07;SB=-55.24	GT:AD:DP:GL:GQ	0/1:221,22:85:-55.03,-25.61,-242.15:99
-chr1	2611880	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=0;HaplotypeScore=242.50;MQ=25.49;MQ0=23;OQ=371.36;QD=1.47;SB=-110.03	GT:AD:DP:GL:GQ	0/1:223,22:91:-74.78,-34.36,-326.09:99
-chr1	2611909	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=0;HaplotypeScore=117.77;MQ=27.67;MQ0=16;OQ=1593.34;QD=8.80;SB=-695.72	GT:AD:DP:GL:GQ	0/1:25,155:74:-184.91,-22.29,-95.32:99
-chr1	2611913	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=162;Dels=0.01;HRun=0;HaplotypeScore=121.10;MQ=28.43;MQ0=16;OQ=688.73;QD=4.25;SB=-310.55	GT:AD:DP:GL:GQ	0/1:24,47:69:-160.80,-88.65,-165.59:99
-chr1	2611940	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=1;HaplotypeScore=46.12;MQ=30.62;MQ0=15;OQ=640.18;QD=4.61;SB=-181.43	GT:AD:DP:GL:GQ	0/1:50,89:56:-84.19,-16.88,-155.00:99
-chr1	2611948	.	A	C	23.15	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=1;HaplotypeScore=36.39;MQ=28.65;MQ0=12;QD=0.17;SB=47.17	GT:AD:DP:GL:GQ	0/1:116,20:55:-22.17,-16.57,-171.47:55.97
-chr1	2612014	rs28499205	G	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=56.64;MQ=32.76;MQ0=15;OQ=1145.21;QD=14.50;SB=-563.07	GT:AD:DP:GL:GQ	1/1:1,78:27:-118.11,-8.13,-0.01:81.27
-chr1	2612058	rs61765702	C	T	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=180;Dels=0.00;HRun=0;HaplotypeScore=18.96;MQ=27.13;MQ0=31;OQ=323.91;QD=1.80;SB=-155.18	GT:AD:DP:GL:GQ	0/1:143,37:66:-55.56,-19.88,-179.35:99
-chr1	2612062	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=184;Dels=0.00;HRun=0;HaplotypeScore=39.83;MQ=27.44;MQ0=33;OQ=304.96;QD=1.66;SB=-159.14	GT:AD:DP:GL:GQ	0/1:147,37:67:-53.98,-20.20,-229.14:99
-chr1	2612081	rs61765703	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=136;Dels=0.01;HRun=2;HaplotypeScore=85.10;MQ=27.93;MQ0=25;OQ=1205.35;QD=8.86;SB=-216.92	GT:AD:DP:GL:GQ	0/1:19,114:53:-139.78,-15.97,-53.09:99
-chr1	2612085	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=1;HaplotypeScore=63.07;MQ=28.64;MQ0=22;OQ=1108.83;QD=8.66;SB=-225.89	GT:AD:DP:GL:GQ	0/1:16,110:51:-129.53,-15.36,-50.00:99
-chr1	2612107	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=161;Dels=0.00;HRun=1;HaplotypeScore=61.85;MQ=27.81;MQ0=21;OQ=276.90;QD=1.72;SB=-68.50	GT:AD:DP:GL:GQ	0/1:116,39:58:-48.45,-17.48,-165.18:99
-chr1	2612151	rs61765704	A	C	24.50	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=129;Dels=0.02;HRun=0;HaplotypeScore=220.24;MQ=28.08;MQ0=15;QD=0.19;SB=6.59	GT:AD:DP:GL:GQ	0/1:44,80:28:-14.16,-8.43,-88.22:57.33
-chr1	2612161	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=149;Dels=0.05;HRun=2;HaplotypeScore=289.32;MQ=26.74;MQ0=14;OQ=154.71;QD=1.04;SB=-60.88	GT:AD:DP:GL:GQ	0/1:35,100:29:-27.20,-8.44,-77.78:99
-chr1	2612175	rs61765705	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=189;Dels=0.00;HRun=1;HaplotypeScore=208.27;MQ=26.09;MQ0=18;OQ=54.71;QD=0.29;SB=-8.07	GT:AD:DP:GL:GQ	0/1:131,51:39:-26.91,-18.15,-132.87:87.54
-chr1	2612187	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=1;HaplotypeScore=211.77;MQ=24.98;MQ0=26;OQ=72.89;QD=0.35;SB=45.47	GT:AD:DP:GL:GQ	0/1:143,55:44:-28.75,-18.18,-125.97:99
-chr1	2612211	.	C	A	45.89	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=208;Dels=0.00;HRun=1;HaplotypeScore=262.96;MQ=25.29;MQ0=30;QD=0.22;SB=-5.55	GT:AD:DP:GL:GQ	0/1:190,13:50:-25.52,-17.65,-153.60:78.73
-chr1	2612261	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=1;HaplotypeScore=73.22;MQ=36.24;MQ0=2;OQ=156.42;QD=1.55;SB=-48.52	GT:AD:DP:GL:GQ	0/1:66,32:53:-34.90,-15.97,-147.29:99
-chr1	2612283	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=69;Dels=0.01;HRun=4;HaplotypeScore=43.06;MQ=38.47;MQ0=2;OQ=327.02;QD=4.74;SB=-23.62	GT:AD:DP:GL:GQ	0/1:32,34:36:-46.54,-10.55,-82.71:99
-chr1	2612309	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=19.73;MQ=36.93;MQ0=0;OQ=479.11;QD=9.39;SB=-112.96	GT:AD:DP:GL:GQ	0/1:16,33:31:-63.92,-12.72,-54.61:99
-chr1	2612321	rs58055515	A	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.06;HRun=2;HaplotypeScore=36.08;MQ=38.02;MQ0=0;OQ=654.82;QD=13.64;SB=-115.75	GT:AD:DP:GL:GQ	1/1:1,35:27:-89.55,-24.40,-20.49:39.17
-chr1	2612344	.	C	G	24.81	LowQual	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=2;HaplotypeScore=34.46;MQ=40.80;MQ0=2;QD=0.48;SB=-19.81	GT:AD:DP:GL:GQ	0/1:23,28:23:-12.71,-6.94,-79.49:57.63
-chr1	2612349	rs56814247	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=26.66;MQ=40.32;MQ0=2;OQ=741.43;QD=14.54;SB=-345.45	GT:AD:DP:GL:GQ	1/1:6,45:24:-77.75,-7.24,-0.02:72.17
-chr1	2612359	.	A	C	18.09	LowQual	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=26.16;MQ=43.64;MQ0=3;QD=0.33;SB=-28.97	GT:AD:DP:GL:GQ	0/1:34,20:31:-14.42,-9.34,-99.97:50.86
-chr1	2612360	.	A	C	30.50	LowQual	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=3;HaplotypeScore=20.17;MQ=44.05;MQ0=2;QD=0.58;SB=-0.42	GT:AD:DP:GL:GQ	0/1:26,25:28:-14.77,-8.43,-87.24:63.33
-chr1	2612401	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=2;HaplotypeScore=42.26;MQ=44.22;MQ0=1;OQ=144.16;QD=2.72;SB=-18.17	GT:AD:DP:GL:GQ	0/1:29,20:34:-31.58,-13.88,-103.42:99
-chr1	2612402	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=41.27;MQ=43.87;MQ0=1;OQ=96.43;QD=1.85;SB=-29.80	GT:AD:DP:GL:GQ	0/1:26,21:30:-21.97,-9.04,-85.20:99
-chr1	2612447	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=39.94;MQ=46.94;MQ0=0;OQ=81.12;QD=1.66;SB=23.03	GT:AD:DP:GL:GQ	0/1:31,17:32:-23.40,-12.01,-88.55:99
-chr1	2612451	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=20.86;MQ=47.66;MQ0=0;OQ=53.68;QD=1.14;SB=26.08	GT:AD:DP:GL:GQ	0/1:30,14:32:-18.30,-9.65,-100.77:86.52
-chr1	2612461	.	A	C	44.60	LowQual	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=34.01;MQ=47.11;MQ0=0;QD=0.86;SB=-23.85	GT:AD:DP:GL:GQ	0/1:42,10:33:-17.68,-9.94,-101.23:77.43
-chr1	2612468	.	C	G	44.05	LowQual	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=46.41;MQ=45.54;MQ0=0;QD=0.76;SB=-1.30	GT:AD:DP:GL:GQ	0/1:51,7:35:-18.24,-10.55,-129.78:76.89
-chr1	2612500	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=0;HaplotypeScore=111.55;MQ=36.58;MQ0=2;OQ=75.18;QD=0.91;SB=-6.47	GT:AD:DP:GL:GQ	0/1:42,40:29:-19.55,-8.75,-75.63:99
-chr1	2612520	.	C	T	19.28	LowQual	AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=133.17;MQ=33.82;MQ0=3;QD=0.19;SB=-16.60	GT:AD:DP:GL:GQ	0/1:87,13:36:-16.06,-10.85,-103.87:52.07
-chr1	2612521	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=3;HaplotypeScore=133.17;MQ=33.95;MQ0=3;OQ=122.65;QD=1.20;SB=-13.90	GT:AD:DP:GL:GQ	0/1:59,34:32:-39.02,-23.47,-101.66:99
-chr1	2612546	rs56822453	C	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=1;HaplotypeScore=145.71;MQ=34.54;MQ0=2;OQ=1448.77;QD=15.58;SB=-452.10	GT:AD:DP:GL:GQ	1/1:7,78:40:-172.07,-31.81,-23.61:81.95
-chr1	2612548	.	A	G	23.46	LowQual	AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=0;HaplotypeScore=130.25;MQ=34.63;MQ0=2;QD=0.24;SB=-12.60	GT:AD:DP:GL:GQ	0/1:76,19:32:-15.27,-9.65,-107.66:56.27
-chr1	2612572	rs61765712	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=119.88;MQ=29.64;MQ0=12;OQ=136.28;QD=1.57;SB=-70.93	GT:AD:DP:GL:GQ	0/1:30,56:22:-23.54,-6.63,-51.28:99
-chr1	2612576	.	C	G	19.60	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=1;HaplotypeScore=117.65;MQ=28.19;MQ0=14;QD=0.19;SB=-14.55	GT:AD:DP:GL:GQ	0/1:68,14:25:-20.23,-14.99,-84.25:52.39
-chr1	2612600	.	A	C	31.76	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=221;Dels=0.00;HRun=4;HaplotypeScore=156.76;MQ=23.41;MQ0=28;QD=0.14;SB=30.15	GT:AD:DP:GL:GQ	0/1:163,45:61:-27.98,-21.52,-181.64:64.60
-chr1	2612627	.	A	C	39.29	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=0;HaplotypeScore=198.32;MQ=23.30;MQ0=41;QD=0.16;SB=-11.41	GT:AD:DP:GL:GQ	0/1:198,41:66:-27.09,-19.88,-204.81:72.12
-chr1	2612682	.	A	C	10.13	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=3;HaplotypeScore=52.92;MQ=47.05;MQ0=0;QD=0.24;SB=14.06	GT:AD:DP:GL:GQ	0/1:27,14:23:-11.18,-6.93,-67.83:42.53
-chr1	2612696	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=17.87;MQ=44.37;MQ0=2;OQ=127.11;QD=2.08;SB=-25.83	GT:AD:DP:GL:GQ	0/1:32,29:31:-25.34,-9.35,-104.60:99
-chr1	2612737	rs61765713	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=31.73;MQ=37.37;MQ0=1;OQ=431.17;QD=5.01;SB=-153.88	GT:AD:DP:GL:GQ	0/1:41,45:46:-60.27,-13.87,-108.65:99
-chr1	2612767	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=55.42;MQ=39.20;MQ0=1;OQ=525.18;QD=6.48;SB=-145.82	GT:AD:DP:GL:GQ	0/1:30,49:46:-69.66,-13.86,-97.51:99
-chr1	2612773	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=50.07;MQ=38.87;MQ0=1;OQ=424.50;QD=5.31;SB=-154.37	GT:AD:DP:GL:GQ	0/1:53,27:45:-59.30,-13.57,-131.50:99
-chr1	2612799	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=27.45;MQ=41.43;MQ0=1;OQ=164.57;QD=2.70;SB=-62.57	GT:AD:DP:GL:GQ	0/1:27,34:35:-30.28,-10.54,-94.10:99
-chr1	2612844	rs55724072	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=94.30;MQ=38.07;MQ0=8;OQ=665.81;QD=9.12;SB=-251.98	GT:AD:DP:GL:GQ	0/1:45,26:28:-81.79,-11.92,-21.81:98.87
-chr1	2612950	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=215;Dels=0.00;HRun=0;HaplotypeScore=255.70;MQ=27.55;MQ0=15;OQ=78.72;QD=0.37;SB=19.51	GT:AD:DP:GL:GQ	0/1:145,61:50:-33.24,-22.08,-169.61:99
-chr1	2612958	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=205;Dels=0.05;HRun=2;HaplotypeScore=345.72;MQ=28.14;MQ0=11;OQ=268.77;QD=1.31;SB=-87.58	GT:AD:DP:GL:GQ	0/1:82,113:44:-43.44,-13.28,-132.37:99
-chr1	2612962	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=206;Dels=0.01;HRun=1;HaplotypeScore=293.73;MQ=28.22;MQ0=11;OQ=53.07;QD=0.26;SB=-7.29	GT:AD:DP:GL:GQ	0/1:160,36:46:-29.48,-20.89,-140.25:85.91
-chr1	2612982	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=165;Dels=0.00;HRun=0;HaplotypeScore=272.98;MQ=28.95;MQ0=11;OQ=81.29;QD=0.49;SB=23.09	GT:AD:DP:GL:GQ	0/1:43,117:27:-19.56,-8.14,-70.61:99
-chr1	2612988	rs28729890	C	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=157;Dels=0.00;HRun=1;HaplotypeScore=282.08;MQ=29.13;MQ0=10;OQ=1088.24;QD=6.93;SB=-426.67	GT:AD:DP:GL:GQ	1/1:3,146:27:-116.69,-11.76,-4.28:74.86
-chr1	2613013	.	G	A	31.52	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=131;Dels=0.00;HRun=1;HaplotypeScore=164.33;MQ=32.03;MQ0=7;QD=0.24;SB=26.10	GT:AD:DP:GL:GQ	0/1:117,14:35:-16.98,-10.54,-112.15:64.35
-chr1	2613017	.	T	C	180.98	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=137.52;MQ=33.34;MQ0=7;QD=1.65;SB=26.11	GT:AD:DP:GL:GQ	0/1:27,81:34:-31.63,-10.24,-97.73:99
-chr1	2613018	rs28484972	G	C	140.73	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=110;Dels=0.00;HRun=0;HaplotypeScore=137.35;MQ=33.34;MQ0=7;QD=1.28;SB=31.01	GT:AD:DP:GL:GQ	0/1:28,44:35:-37.27,-19.91,-118.50:99
-chr1	2613040	rs55713073	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=61.60;MQ=39.34;MQ0=3;OQ=876.14;QD=14.13;SB=-413.05	GT:AD:DP:GL:GQ	0/1:33,24:31:-100.24,-9.35,-30.73:99
-chr1	2613043	.	T	C	38.29	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=3;HaplotypeScore=55.65;MQ=43.83;MQ0=2;QD=0.78;SB=29.13	GT:AD:DP:GL:GQ	0/1:25,20:28:-15.55,-8.44,-93.33:71.12
-chr1	2613090	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=62.85;MQ=32.34;MQ0=20;OQ=113.77;QD=0.92;SB=20.02	GT:AD:DP:GL:GQ	0/1:89,34:35:-25.22,-10.56,-90.70:99
-chr1	2613132	.	T	C	17.83	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=135.62;MQ=34.15;MQ0=7;QD=0.19;SB=20.93	GT:AD:DP:GL:GQ	0/1:49,17:34:-18.39,-13.34,-109.40:50.59
-chr1	2613155	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=54.50;MQ=36.94;MQ0=5;OQ=56.13;QD=0.85;SB=-8.31	GT:AD:DP:GL:GQ	0/1:26,40:25:-16.44,-7.54,-66.14:88.97
-chr1	2613166	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=54;Dels=0.04;HRun=0;HaplotypeScore=39.25;MQ=40.07;MQ0=1;OQ=108.06;QD=2.00;SB=-13.35	GT:AD:DP:GL:GQ	0/1:25,27:25:-21.62,-7.53,-86.20:99
-chr1	2613178	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=39.82;MQ=40.42;MQ0=1;OQ=87.18;QD=1.53;SB=-9.45	GT:AD:DP:GL:GQ	0/1:38,18:28:-20.44,-8.44,-74.35:99
-chr1	2613186	rs28398452	A	T	0.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=19.52;MQ=46.06;MQ0=0;OQ=818.22;QD=19.96;SB=-414.28	GT:AD:DP:GL:GQ	1/1:0,40:23:-85.41,-6.93,-0.01:69.21
-chr1	2613234	.	C	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=40.12;MQ=46.29;MQ0=1;OQ=1357.25;QD=31.56;SB=-584.52	GT:AD:DP:GL:GQ	1/1:1,41:32:-139.32,-9.64,-0.01:96.32
-chr1	2613318	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=61.23;MQ=29.57;MQ0=14;OQ=124.73;QD=1.48;SB=-14.36	GT:AD:DP:GL:GQ	0/1:67,16:36:-26.61,-10.86,-123.23:99
-chr1	2613323	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=0;HaplotypeScore=72.34;MQ=25.61;MQ0=20;OQ=95.66;QD=0.62;SB=33.80	GT:AD:DP:GL:GQ	0/1:133,12:61:-34.86,-22.01,-226.45:99
-chr1	2613370	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=400;Dels=0.00;HRun=0;HaplotypeScore=293.23;MQ=21.10;MQ0=61;OQ=714.05;QD=1.79;SB=-288.95	GT:AD:DP:GL:GQ	0/1:327,73:124:-112.05,-37.36,-344.59:99
-chr1	2613374	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=416;Dels=0.00;HRun=0;HaplotypeScore=328.46;MQ=20.95;MQ0=62;OQ=571.93;QD=1.37;SB=-114.36	GT:AD:DP:GL:GQ	0/1:288,118:123:-97.54,-37.07,-375.44:99
-chr1	2613385	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=437;Dels=0.00;HRun=0;HaplotypeScore=225.97;MQ=20.17;MQ0=68;OQ=628.49;QD=1.44;SB=-284.83	GT:AD:DP:GL:GQ	0/1:363,65:125:-113.05,-46.91,-348.87:99
-chr1	2613405	rs61765715	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=430;Dels=0.00;HRun=0;HaplotypeScore=214.90;MQ=20.78;MQ0=65;OQ=1559.54;QD=3.63;SB=-415.95	GT:AD:DP:GL:GQ	0/1:296,132:120:-195.39,-36.15,-225.88:99
-chr1	2613406	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=428;Dels=0.00;HRun=0;HaplotypeScore=190.35;MQ=20.81;MQ0=64;OQ=96.31;QD=0.23;SB=35.50	GT:AD:DP:GL:GQ	0/1:369,32:113:-77.37,-64.46,-359.74:99
-chr1	2613418	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=358;Dels=0.00;HRun=0;HaplotypeScore=49.55;MQ=21.34;MQ0=50;OQ=281.60;QD=0.79;SB=32.81	GT:AD:DP:GL:GQ	0/1:313,45:98:-60.98,-29.53,-359.08:99
-chr1	2613432	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=200;Dels=0.00;HRun=2;HaplotypeScore=59.86;MQ=23.20;MQ0=28;OQ=127.98;QD=0.64;SB=-77.60	GT:AD:DP:GL:GQ	0/1:175,24:60:-37.72,-21.64,-201.76:99
-chr1	2613443	rs61765716	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=4;HaplotypeScore=21.82;MQ=28.33;MQ0=15;OQ=129.32;QD=1.54;SB=2.14	GT:AD:DP:GL:GQ	0/1:37,47:28:-24.65,-8.44,-74.06:99
-chr1	2613523	rs61765738	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=4;HaplotypeScore=30.76;MQ=30.14;MQ0=9;OQ=85.37;QD=1.61;SB=5.05	GT:AD:DP:GL:GQ	0/1:23,13:17:-22.76,-10.94,-45.61:99
-chr1	2613566	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=71;Dels=0.04;HRun=3;HaplotypeScore=57.78;MQ=26.34;MQ0=13;OQ=54.80;QD=0.77;SB=8.05	GT:AD:DP:GL:GQ	0/1:32,29:23:-15.40,-6.63,-70.44:87.64
-chr1	2613630	.	G	A	0.07	PASS	AC=2;AF=1.00;AN=2;DP=19;Dels=0.00;HRun=1;HaplotypeScore=13.24;MQ=22.14;MQ0=5;OQ=193.82;QD=10.20;SB=-82.32	GT:AD:DP:GL:GQ	1/1:2,17:6:-22.96,-1.81,-0.00:18.06
-chr1	2613635	.	G	A	0.05	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=13.88;MQ=20.75;MQ0=5;OQ=116.09;QD=7.26;SB=-82.32	GT:AD:DP:GL:GQ	1/1:1,15:4:-15.15,-1.21,-0.00:12.04
-chr1	2613646	.	G	C	10.99	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=14;Dels=0.07;HRun=2;HaplotypeScore=14.02;MQ=19.81;MQ0=4;QD=0.79;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,8:1:-4.35,-0.30,-0.00:1.76
-chr1	2613690	.	T	C	13.23	HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=116.33;MQ=18.38;MQ0=8;QD=0.19;SB=-10.00	GT:AD:DP:GL:GQ	0/1:49,18:4:-5.79,-1.21,-8.34:45.86
-chr1	2613693	.	G	C	35.94	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=149.70;MQ=18.45;MQ0=8;QD=0.45;SB=-10.00	GT:AD:DP:GL:GQ	0/1:76,3:6:-8.69,-1.81,-15.69:68.78
-chr1	2613698	.	T	G	15.64	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=2;HaplotypeScore=190.59;MQ=18.98;MQ0=9;QD=0.16;SB=-10.00	GT:AD:DP:GL:GQ	0/1:64,7:8:-12.71,-7.87,-20.94:48.35
-chr1	2613700	.	G	A	196.12	SnpCluster	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=236.20;MQ=18.98;MQ0=9;QD=2.06;SB=-10.00	GT:AD:DP:GL:GQ	0/1:6,83:8:-25.29,-2.41,-3.47:10.61
-chr1	2613710	.	G	A	290.78	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=258.37;MQ=18.71;MQ0=19;QD=1.88;SB=-45.65	GT:AD:DP:GL:GQ	0/1:71,77:15:-43.35,-10.99,-17.24:62.53
-chr1	2613712	.	A	G	19.12	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=1;HaplotypeScore=303.47;MQ=18.88;MQ0=19;QD=0.12;SB=-3.98	GT:AD:DP:GL:GQ	0/1:153,6:17:-10.32,-5.13,-49.10:51.90
-chr1	2613717	.	C	G	26.91	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=0;HaplotypeScore=408.47;MQ=18.72;MQ0=23;QD=0.14;SB=-6.99	GT:AD:DP:GL:GQ	0/1:167,10:18:-16.44,-10.47,-59.87:59.74
-chr1	2613725	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=210;Dels=0.00;HRun=0;HaplotypeScore=344.41;MQ=18.80;MQ0=26;OQ=51.69;QD=0.25;SB=-6.99	GT:AD:DP:GL:GQ	0/1:188,19:21:-17.15,-8.70,-57.87:84.53
-chr1	2613732	.	A	C	62.04	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=212;Dels=0.00;HRun=0;HaplotypeScore=339.87;MQ=19.08;MQ0=26;QD=0.29;SB=-6.99	GT:AD:DP:GL:GQ	0/1:184,21:14:-13.71,-4.22,-32.30:94.88
-chr1	2613741	.	C	T	167.14	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=1;HaplotypeScore=432.19;MQ=19.10;MQ0=22;QD=0.81;SB=-10.00	GT:AD:DP:GL:GQ	0/1:175,24:13:-27.15,-7.15,-25.74:99
-chr1	2613742	.	T	A	554.18	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=437.29;MQ=19.15;MQ0=21;QD=2.73;SB=-10.00	GT:AD:DP:GL:GQ	1/1:10,159:27:-96.09,-42.87,-37.09:57.79
-chr1	2613744	.	C	T	234.43	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=208;Dels=0.00;HRun=0;HaplotypeScore=584.09;MQ=19.37;MQ0=21;QD=1.13;SB=-10.00	GT:AD:DP:GL:GQ	0/1:171,26:22:-36.59,-9.87,-49.51:99
-chr1	2613745	.	C	G	76.87	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=0;HaplotypeScore=579.63;MQ=19.38;MQ0=20;QD=0.37;SB=-10.00	GT:AD:DP:GL:GQ	0/1:148,19:15:-15.49,-4.52,-49.92:99
-chr1	2613750	.	G	A	306.03	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=1;HaplotypeScore=658.57;MQ=19.32;MQ0=20;QD=1.48;SB=-7.01	GT:AD:DP:GL:GQ	0/1:99,104:19:-39.62,-5.73,-26.69:99
-chr1	2613754	.	C	A	11.17	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=223;Dels=0.00;HRun=1;HaplotypeScore=578.78;MQ=19.04;MQ0=24;QD=0.05;SB=-7.00	GT:AD:DP:GL:GQ	0/1:199,19:23:-11.29,-6.93,-65.57:43.66
-chr1	2613765	.	C	A	112.66	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=230;Dels=0.00;HRun=0;HaplotypeScore=358.32;MQ=18.80;MQ0=30;QD=0.49;SB=-6.99	GT:AD:DP:GL:GQ	0/1:192,30:26:-22.38,-7.83,-66.37:99
-chr1	2613766	.	C	G	145.08	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=229;Dels=0.00;HRun=0;HaplotypeScore=340.83;MQ=18.60;MQ0=30;QD=0.63;SB=-3.99	GT:AD:DP:GL:GQ	0/1:197,20:34:-28.04,-10.25,-119.31:99
-chr1	2613770	.	T	C	33.51	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=219;Dels=0.00;HRun=0;HaplotypeScore=286.65;MQ=18.56;MQ0=29;QD=0.15;SB=-3.99	GT:AD:DP:GL:GQ	0/1:176,33:38:-18.09,-11.45,-126.83:66.35
-chr1	2613772	.	A	G	57.20	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=1;HaplotypeScore=261.18;MQ=18.59;MQ0=29;QD=0.26;SB=-0.97	GT:AD:DP:GL:GQ	0/1:199,13:41:-24.12,-15.12,-140.12:90.03
-chr1	2613796	.	G	C	177.04	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=135;Dels=0.04;HRun=2;HaplotypeScore=330.87;MQ=18.33;MQ0=22;QD=1.31;SB=-45.45	GT:AD:DP:GL:GQ	0/1:71,48:21:-34.21,-13.22,-61.82:99
-chr1	2613800	.	G	A	69.22	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=111;Dels=0.04;HRun=0;HaplotypeScore=218.43;MQ=17.88;MQ0=19;QD=0.62;SB=-7.00	GT:AD:DP:GL:GQ	0/1:92,15:13:-14.13,-3.92,-31.45:99
-chr1	2613801	.	C	G	13.55	HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=1;HaplotypeScore=246.51;MQ=18.17;MQ0=17;QD=0.12;SB=-7.00	GT:AD:DP:GL:GQ	0/1:104,4:15:-12.67,-8.05,-55.30:46.19
-chr1	2613803	.	C	A	151.29	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=1;HaplotypeScore=241.51;MQ=18.66;MQ0=17;QD=1.36;SB=-3.98	GT:AD:DP:GL:GQ	0/1:89,19:17:-27.02,-8.61,-39.19:99
-chr1	2613805	.	C	T	87.71	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=208.83;MQ=18.81;MQ0=15;QD=0.80;SB=-0.98	GT:AD:DP:GL:GQ	0/1:93,15:13:-15.97,-3.92,-32.68:99
-chr1	2613807	.	C	T	57.07	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=0;HaplotypeScore=165.36;MQ=18.87;MQ0=15;QD=0.53;SB=-3.99	GT:AD:DP:GL:GQ	0/1:93,9:11:-12.30,-3.31,-28.01:89.90
-chr1	2613812	.	G	A	29.24	HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=106.13;MQ=18.30;MQ0=14;QD=0.32;SB=-3.99	GT:AD:DP:GL:GQ	0/1:75,16:5:-7.71,-1.51,-10.06:62.07
-chr1	2613813	.	T	C	74.94	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=91.21;MQ=18.35;MQ0=14;QD=0.88;SB=-6.99	GT:AD:DP:GL:GQ	0/1:16,66:5:-12.29,-1.51,-3.76:22.52
-chr1	2613826	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=1;HaplotypeScore=36.04;MQ=20.56;MQ0=13;OQ=192.78;QD=2.30;SB=-28.63	GT:AD:DP:GL:GQ	0/1:21,57:13:-29.99,-7.43,-22.77:99
-chr1	2613831	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=1;HaplotypeScore=23.92;MQ=20.73;MQ0=14;OQ=180.38;QD=2.20;SB=-29.94	GT:AD:DP:GL:GQ	0/1:21,61:13:-25.24,-3.92,-19.14:99
-chr1	2613859	.	G	T	41.43	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=24.92;MQ=20.48;MQ0=13;QD=0.62;SB=-43.38	GT:AD:DP:GL:GQ	0/1:19,47:11:-10.74,-3.32,-20.71:74.26
-chr1	2613869	rs28391329	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=60.53;MQ=21.20;MQ0=15;OQ=293.59;QD=2.94;SB=-0.98	GT:AD:DP:GL:GQ	0/1:82,18:19:-38.38,-5.73,-37.90:99
-chr1	2613889	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=1;HaplotypeScore=72.75;MQ=25.64;MQ0=15;OQ=180.19;QD=1.96;SB=-114.68	GT:AD:DP:GL:GQ	0/1:18,61:28:-47.05,-25.75,-76.38:99
-chr1	2613903	rs11486068	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=0;HaplotypeScore=48.68;MQ=24.40;MQ0=19;OQ=50.76;QD=0.51;SB=-13.14	GT:AD:DP:GL:GQ	0/1:40,15:30:-30.07,-21.71,-94.96:83.60
-chr1	2613959	rs61765741	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=152;Dels=0.00;HRun=0;HaplotypeScore=30.66;MQ=19.75;MQ0=50;OQ=129.32;QD=0.85;SB=-3.99	GT:AD:DP:GL:GQ	0/1:135,11:45:-36.43,-20.22,-129.55:99
-chr1	2613977	rs61765742	T	A	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=20.51;MQ=18.10;MQ0=36;OQ=631.54;QD=6.19;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,87:32:-76.08,-9.64,-40.58:99
-chr1	2614061	.	C	G	47.32	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=9.70;MQ=18.60;MQ0=18;QD=1.05;SB=-42.45	GT:AD:DP:GL:GQ	0/1:29,16:12:-11.64,-3.62,-36.27:80.16
-chr1	2614087	rs61765744	A	C	20.16	HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=3;HaplotypeScore=20.71;MQ=12.14;MQ0=19;QD=0.63;SB=-6.99	GT:AD:DP:GL:GQ	0/1:25,7:6:-7.10,-1.81,-13.92:52.96
-chr1	2614090	.	A	G	19.51	HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=1;HaplotypeScore=20.91;MQ=12.88;MQ0=18;QD=0.59;SB=-6.99	GT:AD:DP:GL:GQ	0/1:21,12:7:-7.34,-2.11,-20.39:52.30
-chr1	2614091	.	G	C	37.94	HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=1;HaplotypeScore=21.91;MQ=12.37;MQ0=20;QD=1.05;SB=-6.99	GT:AD:DP:GL:GQ	0/1:28,8:7:-9.19,-2.11,-21.58:70.77
-chr1	2614114	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=32.88;MQ=18.47;MQ0=36;OQ=121.42;QD=1.52;SB=-36.64	GT:AD:DP:GL:GQ	0/1:36,44:20:-21.46,-6.03,-44.98:99
-chr1	2614128	.	T	C	13.34	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=4;HaplotypeScore=47.41;MQ=18.72;MQ0=40;QD=0.11;SB=-2.29	GT:AD:DP:GL:GQ	0/1:78,34:26:-19.39,-14.79,-91.44:45.97
-chr1	2614209	.	G	A	41.24	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=1;HaplotypeScore=24.29;MQ=22.02;MQ0=31;QD=0.45;SB=-24.59	GT:AD:DP:GL:GQ	0/1:55,36:29:-16.14,-8.74,-87.91:74.08
-chr1	2614364	rs28730517	A	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=4;HaplotypeScore=28.46;MQ=18.26;MQ0=16;OQ=311.67;QD=6.23;SB=-151.28	GT:AD:DP:GL:GQ	1/1:14,32:12:-37.44,-3.62,-2.80:8.16
-chr1	2614590	rs28497985	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=112;Dels=0.00;HRun=0;HaplotypeScore=34.12;MQ=28.69;MQ0=18;OQ=755.20;QD=6.74;SB=-383.20	GT:AD:DP:GL:GQ	0/1:87,25:65:-98.40,-19.59,-181.93:99
-chr1	2614771	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=1;HaplotypeScore=33.03;MQ=8.84;MQ0=54;OQ=63.99;QD=0.94;SB=-10.00	GT:AD:DP:GL:GQ	0/1:54,14:6:-11.49,-1.81,-12.10:96.82
-chr1	2614794	.	A	C	36.23	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=12.63;MQ=15.22;MQ0=54;QD=0.39;SB=8.03	GT:AD:DP:GL:GQ	0/1:56,38:25:-14.44,-7.53,-71.85:69.07
-chr1	2614835	rs61765748	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=146;Dels=0.00;HRun=0;HaplotypeScore=67.43;MQ=23.43;MQ0=43;OQ=134.71;QD=0.92;SB=83.23	GT:AD:DP:GL:GQ	0/1:105,39:61:-35.15,-18.40,-166.15:99
-chr1	2615014	.	A	G	45.47	PASS	AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=21.27;MQ0=3;OQ=106.85;QD=8.90;SB=-34.66	GT:AD:DP:GL:GQ	1/1:0,12:5:-14.25,-1.51,-0.01:15.01
-chr1	2615159	.	C	A	49.14	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=220;Dels=0.00;HRun=2;HaplotypeScore=142.59;MQ=8.79;MQ0=169;QD=0.22;SB=-7.86	GT:AD:DP:GL:GQ	0/1:185,31:17:-13.32,-5.12,-43.12:81.98
-chr1	2615230	.	C	G	11.72	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=1;HaplotypeScore=6.15;MQ=11.52;MQ0=52;QD=0.14;SB=-26.39	GT:AD:DP:GL:GQ	0/1:72,12:14:-8.65,-4.23,-47.78:44.25
-chr1	2615372	.	G	A	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=85;Dels=0.00;HRun=1;HaplotypeScore=29.65;MQ=17.03;MQ0=60;OQ=691.36;QD=8.13;SB=-292.88	GT:AD:DP:GL:GQ	1/1:59,24:18:-72.73,-5.42,-0.01:54.18
-chr1	2615442	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=52.99;MQ=12.22;MQ0=96;OQ=368.66;QD=2.38;SB=-99.96	GT:AD:DP:GL:GQ	0/1:30,125:25:-47.68,-7.53,-41.84:99
-chr1	2615466	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=61.50;MQ=14.17;MQ0=69;OQ=112.35;QD=0.77;SB=-18.60	GT:AD:DP:GL:GQ	0/1:116,29:31:-23.86,-9.34,-81.69:99
-chr1	2615470	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=0;HaplotypeScore=63.31;MQ=14.07;MQ0=68;OQ=351.94;QD=2.53;SB=-90.74	GT:AD:DP:GL:GQ	0/1:65,72:34:-48.72,-10.24,-70.14:99
-chr1	2615502	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=0;HaplotypeScore=32.33;MQ=16.10;MQ0=38;OQ=288.56;QD=3.65;SB=2.03	GT:AD:DP:GL:GQ	0/1:49,30:24:-39.38,-7.24,-59.32:99
-chr1	2615515	.	T	G	27.54	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=32.70;MQ=13.65;MQ0=43;QD=0.37;SB=-0.98	GT:AD:DP:GL:GQ	0/1:31,13:15:-18.30,-12.26,-45.52:60.37
-chr1	2615553	.	G	A	21.44	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=1;HaplotypeScore=33.08;MQ=9.60;MQ0=74;QD=0.23;SB=-3.99	GT:AD:DP:GL:GQ	0/1:70,24:9:-8.14,-2.71,-26.22:54.25
-chr1	2615563	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=52.83;MQ=8.09;MQ0=76;OQ=64.78;QD=0.70;SB=-10.00	GT:AD:DP:GL:GQ	0/1:82,10:5:-11.27,-1.51,-6.24:47.31
-chr1	2615689	.	T	C	30.94	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=1;HaplotypeScore=62.56;MQ=10.13;MQ0=88;QD=0.28;SB=-3.98	GT:AD:DP:GL:GQ	0/1:18,89:9:-9.09,-2.71,-22.98:63.77
-chr1	2615717	rs61765669	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=109;Dels=0.00;HRun=0;HaplotypeScore=37.80;MQ=10.99;MQ0=80;OQ=103.09;QD=0.95;SB=-3.99	GT:AD:DP:GL:GQ	0/1:26,83:10:-16.61,-3.01,-17.76:99
-chr1	2615757	.	C	A	39.74	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=1;HaplotypeScore=30.17;MQ=13.18;MQ0=60;QD=0.43;SB=0.17	GT:AD:DP:GL:GQ	0/1:71,20:17:-15.95,-8.69,-48.17:72.57
-chr1	2615837	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=39.99;MQ=26.86;MQ0=21;OQ=73.19;QD=1.33;SB=-36.22	GT:AD:DP:GL:GQ	0/1:29,26:20:-16.63,-6.03,-56.46:99
-chr1	2615892	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=3;HaplotypeScore=44.02;MQ=30.58;MQ0=2;OQ=63.96;QD=1.12;SB=26.10	GT:AD:DP:GL:GQ	0/1:25,32:26:-17.51,-7.83,-73.92:96.79
-chr1	2615945	rs28619423	T	C	0.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=1;HaplotypeScore=8.32;MQ=22.59;MQ0=1;OQ=99.94;QD=5.26;SB=-76.91	GT:AD:DP:GL:GQ	1/1:3,15:4:-13.53,-1.21,-0.00:12.03
-chr1	2615949	rs28373809	G	A	10.26	LowQual	AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=9.32;MQ=19.47;MQ0=1;QD=0.68;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,14:1:-4.27,-0.30,-0.00:1.76
-chr1	2615990	.	C	G	0.11	PASS	AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=8.97;MQ=20.31;MQ0=1;OQ=58.76;QD=6.53;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,9:2:-9.28,-0.60,-0.00:6.02
-chr1	2615997	.	G	A	36.46	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=29.63;MQ=20.63;MQ0=6;QD=1.35;SB=-7.00	GT:AD:DP:GL:GQ	0/1:18,9:5:-8.44,-1.51,-10.16:69.30
-chr1	2616009	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=2;HaplotypeScore=37.74;MQ=29.64;MQ0=6;OQ=112.90;QD=3.53;SB=-3.99	GT:AD:DP:GL:GQ	0/1:15,17:12:-18.19,-3.62,-24.59:99
-chr1	2616012	.	A	C	43.77	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=2;HaplotypeScore=39.70;MQ=31.56;MQ0=5;QD=1.41;SB=-0.98	GT:AD:DP:GL:GQ	0/1:13,18:11:-10.97,-3.31,-27.78:76.61
-chr1	2616021	.	C	A	30.19	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=71.42;MQ=30.54;MQ0=5;QD=0.70;SB=-0.98	GT:AD:DP:GL:GQ	0/1:37,6:16:-11.12,-4.82,-46.67:63.02
-chr1	2616048	.	A	C	104.33	Indel	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=256.69;MQ=33.48;MQ0=5;QD=1.53;SB=-0.98	GT:AD:DP:GL:GQ	0/1:26,38:27:-21.85,-8.13,-76.79:99
-chr1	2616053	.	A	C	36.21	Indel;LowQual	AC=1;AF=0.50;AN=2;DP=80;Dels=0.06;HRun=3;HaplotypeScore=159.99;MQ=31.20;MQ0=8;QD=0.45;SB=-3.99	GT:AD:DP:GL:GQ	0/1:43,32:27:-15.04,-8.13,-81.51:69.04
-chr1	2616066	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=0;HaplotypeScore=127.16;MQ=28.37;MQ0=17;OQ=116.17;QD=0.90;SB=11.03	GT:AD:DP:GL:GQ	0/1:64,41:40:-43.16,-28.26,-112.08:99
-chr1	2616091	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=152;Dels=0.02;HRun=3;HaplotypeScore=245.31;MQ=26.01;MQ0=24;OQ=74.30;QD=0.49;SB=8.05	GT:AD:DP:GL:GQ	0/1:77,30:40:-32.83,-22.11,-117.91:99
-chr1	2616098	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=238.65;MQ=25.86;MQ0=23;OQ=203.33;QD=1.36;SB=8.03	GT:AD:DP:GL:GQ	0/1:83,65:39:-35.37,-11.76,-97.26:99
-chr1	2616121	rs28707614	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=109;Dels=0.00;HRun=1;HaplotypeScore=348.16;MQ=25.38;MQ0=21;OQ=754.79;QD=6.92;SB=-132.69	GT:AD:DP:GL:GQ	0/1:14,95:27:-86.90,-8.14,-12.11:39.77
-chr1	2616201	rs28495110	G	T	0.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=18.82;MQ=45.96;MQ0=6;OQ=1088.68;QD=25.92;SB=-422.58	GT:AD:DP:GL:GQ	1/1:8,34:31:-112.47,-9.34,-0.01:93.25
-chr1	2616235	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=22.81;MQ=34.27;MQ0=9;OQ=189.73;QD=2.67;SB=-88.83	GT:AD:DP:GL:GQ	0/1:28,43:31:-31.59,-9.34,-82.55:99
-chr1	2616250	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=198;Dels=0.00;HRun=1;HaplotypeScore=98.35;MQ=24.83;MQ0=26;OQ=53.95;QD=0.27;SB=-52.26	GT:AD:DP:GL:GQ	0/1:175,16:77:-39.01,-30.33,-235.94:86.79
-chr1	2616284	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=316;Dels=0.00;HRun=0;HaplotypeScore=207.75;MQ=22.41;MQ0=34;OQ=472.89;QD=1.50;SB=-261.05	GT:AD:DP:GL:GQ	0/1:280,35:108:-83.11,-32.54,-299.84:99
-chr1	2616291	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=308;Dels=0.00;HRun=0;HaplotypeScore=168.73;MQ=22.17;MQ0=35;OQ=503.17;QD=1.63;SB=-147.25	GT:AD:DP:GL:GQ	0/1:228,77:110:-86.74,-33.14,-306.67:99
-chr1	2616303	rs61765755	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=285;Dels=0.00;HRun=0;HaplotypeScore=48.79;MQ=22.14;MQ0=36;OQ=3893.80;QD=13.66;SB=-1294.80	GT:AD:DP:GL:GQ	0/1:13,240:102:-388.38,-54.71,-62.45:77.36
-chr1	2616333	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=234;Dels=0.00;HRun=0;HaplotypeScore=268.36;MQ=23.38;MQ0=29;OQ=127.30;QD=0.54;SB=-30.73	GT:AD:DP:GL:GQ	0/1:215,16:95:-44.63,-28.62,-299.60:99
-chr1	2616354	rs7544898	A	C	1854.66	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=113;Dels=0.00;HRun=1;HaplotypeScore=61.29;MQ=28.89;MQ0=15;QD=16.41;SB=-484.04	GT:AD:DP:GL:GQ	1/1:2,105:53:-193.02,-19.43,-3.97:99
-chr1	2616358	.	A	G	865.25	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=1;HaplotypeScore=46.74;MQ=30.83;MQ0=11;QD=8.83;SB=-6.56	GT:AD:DP:GL:GQ	0/1:29,69:51:-105.17,-15.36,-93.21:99
-chr1	2616363	.	G	C	842.15	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=1;HaplotypeScore=46.38;MQ=31.26;MQ0=12;QD=8.68;SB=-14.79	GT:AD:DP:GL:GQ	0/1:55,42:53:-103.48,-15.98,-115.82:99
-chr1	2616398	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=48.31;MQ=34.63;MQ0=12;OQ=554.46;QD=5.84;SB=10.29	GT:AD:DP:GL:GQ	0/1:66,29:54:-75.00,-16.28,-154.28:99
-chr1	2616612	.	G	C	20.97	LowQual	AC=1;AF=0.50;AN=2;DP=70;Dels=0.01;HRun=0;HaplotypeScore=165.26;MQ=30.37;MQ0=2;QD=0.30;SB=-32.74	GT:AD:DP:GL:GQ	0/1:19,45:24:-19.94,-14.57,-91.68:53.77
-chr1	2616615	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=3;HaplotypeScore=70.16;MQ=28.36;MQ0=2;OQ=89.21;QD=1.29;SB=-14.35	GT:AD:DP:GL:GQ	0/1:26,38:19:-17.94,-5.74,-58.45:99
-chr1	2616647	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=137;Dels=0.00;HRun=0;HaplotypeScore=217.54;MQ=24.00;MQ0=30;OQ=94.92;QD=0.69;SB=35.11	GT:AD:DP:GL:GQ	0/1:84,43:37:-23.93,-11.16,-103.88:99
-chr1	2616654	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=1;HaplotypeScore=223.04;MQ=23.83;MQ0=42;OQ=359.87;QD=1.99;SB=35.13	GT:AD:DP:GL:GQ	0/1:140,35:44:-52.54,-13.27,-92.39:99
-chr1	2616670	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=198;Dels=0.00;HRun=0;HaplotypeScore=299.99;MQ=23.86;MQ0=44;OQ=60.86;QD=0.31;SB=35.11	GT:AD:DP:GL:GQ	0/1:127,67:50:-24.46,-15.09,-137.52:93.69
-chr1	2616692	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=167;Dels=0.00;HRun=0;HaplotypeScore=231.37;MQ=26.06;MQ0=26;OQ=91.62;QD=0.55;SB=35.13	GT:AD:DP:GL:GQ	0/1:91,73:56:-32.64,-20.19,-183.88:99
-chr1	2616713	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=1;HaplotypeScore=98.28;MQ=31.06;MQ0=12;OQ=565.06;QD=6.81;SB=-40.25	GT:AD:DP:GL:GQ	0/1:27,50:40:-78.76,-18.97,-82.14:99
-chr1	2616803	.	G	C	11.63	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=76;Dels=0.01;HRun=0;HaplotypeScore=115.33;MQ=32.59;MQ0=10;QD=0.15;SB=23.09	GT:AD:DP:GL:GQ	0/1:27,42:23:-11.36,-6.95,-79.45:44.16
-chr1	2616826	.	T	C	18.72	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=39.74;MQ=39.24;MQ0=2;QD=0.38;SB=20.09	GT:AD:DP:GL:GQ	0/1:24,24:22:-11.78,-6.63,-68.52:51.50
-chr1	2616954	rs28486014	C	A	1246.57	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=172;Dels=0.00;HRun=0;HaplotypeScore=118.85;MQ=19.01;MQ0=19;QD=7.25;SB=-604.12	GT:AD:DP:GL:GQ	1/1:2,165:36:-131.25,-13.77,-3.01:99
-chr1	2616962	.	A	G	25.32	DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=218;Dels=0.00;HRun=0;HaplotypeScore=150.59;MQ=18.32;MQ0=25;QD=0.12;SB=17.48	GT:AD:DP:GL:GQ	0/1:179,39:39:-17.57,-11.75,-132.90:58.14
-chr1	2616963	.	C	G	90.14	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=222;Dels=0.00;HRun=0;HaplotypeScore=167.60;MQ=18.42;MQ0=25;QD=0.41;SB=8.17	GT:AD:DP:GL:GQ	0/1:182,34:40:-27.79,-15.49,-139.11:99
-chr1	2616976	.	C	A	13.99	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=267;Dels=0.00;HRun=0;HaplotypeScore=283.46;MQ=18.62;MQ0=35;QD=0.05;SB=55.93	GT:AD:DP:GL:GQ	0/1:236,26:51:-20.03,-15.36,-160.20:46.65
-chr1	2616982	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=280;Dels=0.00;HRun=0;HaplotypeScore=251.51;MQ=19.64;MQ0=37;OQ=486.76;QD=1.74;SB=8.99	GT:AD:DP:GL:GQ	0/1:187,73:54:-71.97,-20.01,-131.66:99
-chr1	2617013	.	A	C	16.86	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=5;HaplotypeScore=227.22;MQ=22.36;MQ0=34;QD=0.07;SB=14.07	GT:AD:DP:GL:GQ	0/1:208,22:59:-25.00,-20.04,-187.42:49.60
-chr1	2617015	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=222;Dels=0.00;HRun=0;HaplotypeScore=200.07;MQ=22.66;MQ0=33;OQ=161.89;QD=0.73;SB=20.10	GT:AD:DP:GL:GQ	0/1:186,27:59:-43.12,-23.65,-203.21:99
-chr1	2617028	rs61765757	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=178;Dels=0.00;HRun=0;HaplotypeScore=111.43;MQ=24.75;MQ0=28;OQ=1236.03;QD=6.94;SB=-23.31	GT:AD:DP:GL:GQ	0/1:36,141:55:-143.45,-16.57,-61.22:99
-chr1	2617033	rs61765759	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=173;Dels=0.00;HRun=0;HaplotypeScore=123.68;MQ=24.76;MQ0=29;OQ=945.67;QD=5.47;SB=-60.88	GT:AD:DP:GL:GQ	0/1:19,129:49:-112.61,-14.76,-62.28:99
-chr1	2617058	rs28585375	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=236;Dels=0.00;HRun=0;HaplotypeScore=112.06;MQ=22.97;MQ0=54;OQ=357.80;QD=1.52;SB=-120.52	GT:AD:DP:GL:GQ	0/1:214,20:72:-60.76,-21.69,-192.59:99
-chr1	2617101	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=1;HaplotypeScore=89.01;MQ=23.73;MQ0=48;OQ=1884.44;QD=9.10;SB=-387.68	GT:AD:DP:GL:GQ	0/1:34,172:76:-214.63,-22.90,-42.31:99
-chr1	2617123	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=48.50;MQ=26.08;MQ0=56;OQ=129.18;QD=0.64;SB=-72.20	GT:AD:DP:GL:GQ	0/1:185,17:80:-40.33,-24.13,-284.57:99
-chr1	2617151	.	G	C	42.86	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=2;HaplotypeScore=97.11;MQ=23.22;MQ0=69;QD=0.22;SB=-10.77	GT:AD:DP:GL:GQ	0/1:167,21:55:-24.18,-16.61,-193.30:75.70
-chr1	2617160	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=1;HaplotypeScore=68.35;MQ=20.95;MQ0=76;OQ=103.39;QD=0.57;SB=17.08	GT:AD:DP:GL:GQ	0/1:148,32:50:-28.69,-15.07,-157.59:99
-chr1	2617178	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=141;Dels=0.01;HRun=4;HaplotypeScore=67.98;MQ=19.71;MQ0=69;OQ=224.46;QD=1.59;SB=-23.83	GT:AD:DP:GL:GQ	0/1:56,82:32:-35.39,-9.66,-90.46:99
-chr1	2617216	.	T	C	14.18	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=2;HaplotypeScore=54.33;MQ=16.92;MQ0=58;QD=0.13;SB=5.04	GT:AD:DP:GL:GQ	0/1:54,55:21:-11.01,-6.33,-70.16:46.85
-chr1	2617218	.	C	G	13.85	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=0;HaplotypeScore=69.57;MQ=15.97;MQ0=58;QD=0.13;SB=5.05	GT:AD:DP:GL:GQ	0/1:87,20:21:-10.98,-6.33,-76.68:46.51
-chr1	2617261	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=41.53;MQ=20.71;MQ0=16;OQ=109.26;QD=1.79;SB=-48.91	GT:AD:DP:GL:GQ	0/1:26,35:19:-19.93,-5.73,-46.91:99
-chr1	2617273	rs61466658	T	C	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=31.65;MQ=19.33;MQ0=33;OQ=744.68;QD=8.97;SB=-307.99	GT:AD:DP:GL:GQ	1/1:6,73:24:-80.83,-7.23,-2.78:44.58
-chr1	2617320	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=383;Dels=0.00;HRun=2;HaplotypeScore=179.89;MQ=20.12;MQ0=69;OQ=511.87;QD=1.34;SB=-192.93	GT:AD:DP:GL:GQ	0/1:271,102:88:-80.98,-26.51,-240.14:99
-chr1	2617333	.	A	C	189.16	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=412;Dels=0.00;HRun=1;HaplotypeScore=324.51;MQ=20.25;MQ0=68;QD=0.46;SB=-46.42	GT:AD:DP:GL:GQ	0/1:362,48:102:-52.93,-30.73,-310.85:99
-chr1	2617334	.	C	T	347.52	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=413;Dels=0.00;HRun=0;HaplotypeScore=315.80;MQ=20.22;MQ0=68;QD=0.84;SB=-93.66	GT:AD:DP:GL:GQ	0/1:367,35:98:-67.59,-29.55,-258.47:99
-chr1	2617338	.	C	G	222.34	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=432;Dels=0.00;HRun=0;HaplotypeScore=396.78;MQ=20.69;MQ0=66;QD=0.51;SB=19.38	GT:AD:DP:GL:GQ	0/1:381,42:103:-66.44,-40.92,-386.05:99
-chr1	2617341	.	G	T	154.66	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=435;Dels=0.00;HRun=1;HaplotypeScore=393.28;MQ=20.73;MQ0=66;QD=0.36;SB=-27.31	GT:AD:DP:GL:GQ	0/1:377,44:114:-56.17,-37.42,-341.25:99
-chr1	2617354	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=456;Dels=0.00;HRun=0;HaplotypeScore=284.18;MQ=21.50;MQ0=65;OQ=410.45;QD=0.90;SB=-157.97	GT:AD:DP:GL:GQ	0/1:367,88:128:-86.24,-41.91,-394.71:99
-chr1	2617375	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=397;Dels=0.00;HRun=0;HaplotypeScore=286.33;MQ=23.04;MQ0=37;OQ=238.47;QD=0.60;SB=-127.61	GT:AD:DP:GL:GQ	0/1:316,80:131:-66.59,-39.46,-400.07:99
-chr1	2617377	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=393;Dels=0.00;HRun=0;HaplotypeScore=264.38;MQ=23.09;MQ0=38;OQ=52.53;QD=0.13;SB=34.31	GT:AD:DP:GL:GQ	0/1:349,42:132:-48.29,-39.76,-421.34:85.37
-chr1	2617406	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=0;HaplotypeScore=150.38;MQ=24.81;MQ0=30;OQ=1026.09;QD=4.44;SB=-81.56	GT:AD:DP:GL:GQ	0/1:71,150:85:-131.52,-25.63,-230.33:99
-chr1	2617434	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=0;HaplotypeScore=111.67;MQ=24.27;MQ0=28;OQ=290.81;QD=2.02;SB=-29.80	GT:AD:DP:GL:GQ	0/1:61,70:56:-59.33,-26.96,-156.98:99
-chr1	2617463	rs56282610	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=58.94;MQ=24.92;MQ0=20;OQ=411.11;QD=4.42;SB=-153.67	GT:AD:DP:GL:GQ	0/1:29,63:36:-55.25,-10.85,-76.21:99
-chr1	2617490	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=85.26;MQ=28.92;MQ0=14;OQ=93.54;QD=0.96;SB=32.09	GT:AD:DP:GL:GQ	0/1:84,12:39:-24.38,-11.75,-112.74:99
-chr1	2617496	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=107.91;MQ=30.31;MQ0=12;OQ=102.53;QD=1.11;SB=32.10	GT:AD:DP:GL:GQ	0/1:79,12:38:-24.98,-11.44,-111.78:99
-chr1	2617505	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=81.67;MQ=32.33;MQ0=11;OQ=247.78;QD=2.69;SB=-60.73	GT:AD:DP:GL:GQ	0/1:40,39:40:-40.11,-12.05,-107.49:99
-chr1	2617521	rs56279030	G	C	42.50	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=107;Dels=0.00;HRun=0;HaplotypeScore=51.30;MQ=31.83;MQ0=12;QD=0.40;SB=0.26	GT:AD:DP:GL:GQ	0/1:94,13:44:-20.79,-13.26,-170.49:75.34
-chr1	2617526	rs28536771	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=105;Dels=0.00;HRun=0;HaplotypeScore=63.55;MQ=32.40;MQ0=9;OQ=160.23;QD=1.53;SB=-3.57	GT:AD:DP:GL:GQ	0/1:45,55:37:-30.46,-11.15,-113.20:99
-chr1	2617584	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=0;HaplotypeScore=87.31;MQ=28.18;MQ0=10;OQ=524.04;QD=3.59;SB=-151.92	GT:AD:DP:GL:GQ	0/1:49,97:62:-74.37,-18.69,-162.12:99
-chr1	2617611	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=154;Dels=0.01;HRun=0;HaplotypeScore=176.05;MQ=27.08;MQ0=16;OQ=81.66;QD=0.53;SB=-0.83	GT:AD:DP:GL:GQ	0/1:126,24:59:-29.22,-17.77,-179.32:99
-chr1	2617617	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=150;Dels=0.00;HRun=0;HaplotypeScore=177.05;MQ=27.20;MQ0=14;OQ=126.07;QD=0.84;SB=8.21	GT:AD:DP:GL:GQ	0/1:125,25:58:-33.36,-17.47,-170.99:99
-chr1	2617626	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=140;Dels=0.00;HRun=0;HaplotypeScore=162.52;MQ=28.40;MQ0=11;OQ=508.32;QD=3.63;SB=-161.48	GT:AD:DP:GL:GQ	0/1:40,77:57:-73.89,-19.78,-125.32:99
-chr1	2617630	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=1;HaplotypeScore=122.08;MQ=28.20;MQ0=11;OQ=734.14;QD=5.13;SB=-361.31	GT:AD:DP:GL:GQ	0/1:73,47:61:-98.65,-21.95,-111.48:99
-chr1	2617659	rs55801140	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=159;Dels=0.00;HRun=0;HaplotypeScore=125.08;MQ=27.55;MQ0=12;OQ=175.93;QD=1.11;SB=23.11	GT:AD:DP:GL:GQ	0/1:141,12:44:-34.15,-13.27,-148.76:99
-chr1	2617668	rs28535687	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=0;HaplotypeScore=255.63;MQ=27.99;MQ0=8;OQ=172.40;QD=1.28;SB=-72.12	GT:AD:DP:GL:GQ	0/1:31,69:32:-40.65,-20.12,-107.26:99
-chr1	2617672	.	G	T	32.81	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=132;Dels=0.00;HRun=0;HaplotypeScore=245.46;MQ=28.29;MQ0=7;QD=0.25;SB=11.06	GT:AD:DP:GL:GQ	0/1:84,46:25:-14.10,-7.54,-64.41:65.64
-chr1	2617713	.	C	T	25.50	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=172;Dels=0.00;HRun=0;HaplotypeScore=235.92;MQ=23.71;MQ0=16;QD=0.15;SB=11.61	GT:AD:DP:GL:GQ	0/1:80,75:31:-15.18,-9.35,-88.30:58.32
-chr1	2617737	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=1;HaplotypeScore=196.10;MQ=25.34;MQ0=20;OQ=242.18;QD=1.19;SB=-124.57	GT:AD:DP:GL:GQ	0/1:154,44:50:-42.56,-15.06,-131.92:99
-chr1	2617767	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=0;HaplotypeScore=115.66;MQ=29.10;MQ0=18;OQ=374.38;QD=2.92;SB=-46.69	GT:AD:DP:GL:GQ	0/1:37,72:41:-53.07,-12.35,-97.04:99
-chr1	2617781	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=0;HaplotypeScore=110.28;MQ=28.42;MQ0=22;OQ=65.20;QD=0.50;SB=26.12	GT:AD:DP:GL:GQ	0/1:110,18:43:-22.77,-12.97,-156.99:98.03
-chr1	2617809	rs28698520	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=120;Dels=0.01;HRun=1;HaplotypeScore=154.47;MQ=26.46;MQ0=29;OQ=544.53;QD=4.54;SB=20.07	GT:AD:DP:GL:GQ	0/1:74,45:37:-68.88,-11.15,-59.02:99
-chr1	2617834	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=1;HaplotypeScore=142.69;MQ=25.75;MQ0=33;OQ=247.39;QD=1.66;SB=-8.79	GT:AD:DP:GL:GQ	0/1:101,20:44:-48.54,-20.52,-132.57:99
-chr1	2617846	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=163;Dels=0.00;HRun=0;HaplotypeScore=110.83;MQ=27.45;MQ0=31;OQ=574.67;QD=3.53;SB=-169.29	GT:AD:DP:GL:GQ	0/1:34,98:52:-84.16,-23.41,-106.75:99
-chr1	2617859	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=258;Dels=0.00;HRun=0;HaplotypeScore=189.65;MQ=26.24;MQ0=36;OQ=661.11;QD=2.56;SB=-188.93	GT:AD:DP:GL:GQ	0/1:183,74:74:-91.72,-22.32,-216.13:99
-chr1	2617878	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=308;Dels=0.00;HRun=0;HaplotypeScore=214.86;MQ=26.40;MQ0=36;OQ=1364.14;QD=4.43;SB=-695.16	GT:AD:DP:GL:GQ	0/1:245,61:100:-169.82,-30.12,-204.71:99
-chr1	2617913	rs61766463	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=276;Dels=0.00;HRun=0;HaplotypeScore=33.34;MQ=34.26;MQ0=23;OQ=345.85;QD=1.25;SB=54.43	GT:AD:DP:GL:GQ	0/1:130,145:134:-78.24,-40.37,-397.42:99
-chr1	2617929	rs61766464	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=313;Dels=0.00;HRun=0;HaplotypeScore=209.86;MQ=34.59;MQ0=24;OQ=2475.95;QD=7.91;SB=-469.20	GT:AD:DP:GL:GQ	0/1:207,106:147:-295.16,-44.28,-232.82:99
-chr1	2617945	rs61766465	G	A	678.02	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=327;Dels=0.00;HRun=0;HaplotypeScore=293.41;MQ=35.76;MQ0=33;QD=2.07;SB=57.72	GT:AD:DP:GL:GQ	0/1:285,42:156:-118.09,-47.00,-457.61:99
-chr1	2617948	.	A	T	1515.78	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=339;Dels=0.00;HRun=0;HaplotypeScore=339.78;MQ=35.84;MQ0=34;QD=4.47;SB=-315.59	GT:AD:DP:GL:GQ	0/1:267,71:155:-201.56,-46.69,-377.16:99
-chr1	2617953	rs61766466	C	A	621.95	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=348;Dels=0.00;HRun=0;HaplotypeScore=257.70;MQ=36.09;MQ0=43;QD=1.79;SB=55.33	GT:AD:DP:GL:GQ	0/1:287,49:168:-116.08,-50.61,-483.68:99
-chr1	2618063	rs28379532	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=143;Dels=0.02;HRun=0;HaplotypeScore=36.25;MQ=31.70;MQ0=29;OQ=1863.52;QD=13.03;SB=-253.52	GT:AD:DP:GL:GQ	0/1:27,111:85:-215.25,-25.61,-83.05:99
-chr1	2618135	rs28499404	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=183;Dels=0.00;HRun=0;HaplotypeScore=48.32;MQ=27.35;MQ0=42;OQ=347.83;QD=1.90;SB=-174.55	GT:AD:DP:GL:GQ	0/1:162,21:105:-69.72,-31.65,-366.58:99
-chr1	2618152	rs61766467	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=192;Dels=0.00;HRun=1;HaplotypeScore=85.82;MQ=26.36;MQ0=44;OQ=458.63;QD=2.39;SB=-15.83	GT:AD:DP:GL:GQ	0/1:151,41:104:-80.48,-31.33,-290.41:99
-chr1	2618186	rs28655771	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=193;Dels=0.00;HRun=1;HaplotypeScore=114.84;MQ=21.49;MQ0=56;OQ=2645.92;QD=13.71;SB=-1050.69	GT:AD:DP:GL:GQ	1/1:5,188:77:-268.22,-23.20,-0.04:99
-chr1	2618191	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=161.00;MQ=22.90;MQ0=57;OQ=50.10;QD=0.25;SB=39.02	GT:AD:DP:GL:GQ	0/1:173,30:86:-34.21,-25.91,-268.48:82.93
-chr1	2618226	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=268;Dels=0.00;HRun=0;HaplotypeScore=192.42;MQ=33.49;MQ0=36;OQ=337.18;QD=1.26;SB=-53.39	GT:AD:DP:GL:GQ	0/1:227,40:152:-82.80,-45.80,-457.42:99
-chr1	2618254	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=296;Dels=0.00;HRun=0;HaplotypeScore=166.54;MQ=37.41;MQ0=24;OQ=808.97;QD=2.73;SB=-397.12	GT:AD:DP:GL:GQ	0/1:225,67:181:-140.83,-56.65,-515.36:99
-chr1	2618301	.	C	A	998.94	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=292;Dels=0.00;HRun=0;HaplotypeScore=277.61;MQ=43.53;MQ0=9;QD=3.42;SB=-458.03	GT:AD:DP:GL:GQ	0/1:215,74:195:-161.93,-58.75,-524.06:99
-chr1	2618303	.	C	A	591.91	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=295;Dels=0.00;HRun=0;HaplotypeScore=301.39;MQ=43.31;MQ0=10;QD=2.01;SB=-293.38	GT:AD:DP:GL:GQ	0/1:236,56:205:-124.23,-61.75,-600.14:99
-chr1	2618307	.	G	A	971.72	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=283;Dels=0.00;HRun=0;HaplotypeScore=193.14;MQ=43.47;MQ0=11;QD=3.43;SB=-273.43	GT:AD:DP:GL:GQ	0/1:228,48:199:-160.42,-59.96,-556.19:99
-chr1	2618320	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=309;Dels=0.00;HRun=0;HaplotypeScore=150.76;MQ=41.04;MQ0=29;OQ=452.34;QD=1.46;SB=-151.56	GT:AD:DP:GL:GQ	0/1:223,31:184:-121.13,-72.62,-509.07:99
-chr1	2618366	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=558;Dels=0.00;HRun=0;HaplotypeScore=219.65;MQ=26.44;MQ0=134;OQ=289.23;QD=0.52;SB=167.70	GT:AD:DP:GL:GQ	0/1:454,69:221:-105.97,-73.77,-728.70:99
-chr1	2618375	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=585;Dels=0.00;HRun=0;HaplotypeScore=337.36;MQ=25.16;MQ0=141;OQ=507.21;QD=0.87;SB=196.74	GT:AD:DP:GL:GQ	0/1:487,75:227:-128.47,-74.47,-700.80:99
-chr1	2618378	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=594;Dels=0.00;HRun=0;HaplotypeScore=307.01;MQ=24.92;MQ0=142;OQ=386.51;QD=0.65;SB=-74.59	GT:AD:DP:GL:GQ	0/1:524,66:225:-115.59,-73.65,-670.89:99
-chr1	2618414	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=573;Dels=0.00;HRun=1;HaplotypeScore=206.56;MQ=24.36;MQ0=140;OQ=719.44;QD=1.26;SB=-72.20	GT:AD:DP:GL:GQ	0/1:439,119:210:-138.50,-63.27,-592.09:99
-chr1	2618418	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=531;Dels=0.00;HRun=0;HaplotypeScore=181.25;MQ=24.54;MQ0=131;OQ=939.27;QD=1.77;SB=-76.38	GT:AD:DP:GL:GQ	0/1:427,103:204:-158.68,-61.47,-574.55:99
-chr1	2618432	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=412;Dels=0.00;HRun=0;HaplotypeScore=70.50;MQ=25.62;MQ0=105;OQ=877.24;QD=2.13;SB=-428.33	GT:AD:DP:GL:GQ	0/1:368,44:152:-136.86,-45.86,-364.87:99
-chr1	2618444	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=352;Dels=0.00;HRun=1;HaplotypeScore=46.24;MQ=26.18;MQ0=89;OQ=1301.34;QD=3.70;SB=170.58	GT:AD:DP:GL:GQ	0/1:167,181:143:-176.57,-43.15,-394.32:99
-chr1	2618459	rs61766471	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=309;Dels=0.00;HRun=0;HaplotypeScore=122.77;MQ=27.15;MQ0=60;OQ=430.68;QD=1.39;SB=-167.89	GT:AD:DP:GL:GQ	0/1:283,25:135:-87.04,-40.69,-380.50:99
-chr1	2618482	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=224;Dels=0.00;HRun=0;HaplotypeScore=91.95;MQ=32.62;MQ0=31;OQ=752.10;QD=3.36;SB=-248.53	GT:AD:DP:GL:GQ	0/1:115,107:101:-108.92,-30.43,-254.35:99
-chr1	2618501	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=234;Dels=0.01;HRun=4;HaplotypeScore=341.35;MQ=30.82;MQ0=33;OQ=155.62;QD=0.67;SB=92.01	GT:AD:DP:GL:GQ	0/1:155,66:98:-53.97,-35.12,-329.58:99
-chr1	2618530	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=0;HaplotypeScore=168.93;MQ=32.32;MQ0=29;OQ=236.35;QD=1.02;SB=-122.19	GT:AD:DP:GL:GQ	0/1:211,19:107:-59.16,-32.24,-318.05:99
-chr1	2618557	rs28411025	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=156;Dels=0.00;HRun=0;HaplotypeScore=133.44;MQ=39.19;MQ0=9;OQ=2883.82;QD=18.49;SB=-1383.19	GT:AD:DP:GL:GQ	0/1:27,128:92:-319.41,-27.74,-64.72:99
-chr1	2618577	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=228;Dels=0.01;HRun=1;HaplotypeScore=243.04;MQ=34.35;MQ0=14;OQ=206.46;QD=0.91;SB=-125.59	GT:AD:DP:GL:GQ	0/1:119,105:92:-51.66,-27.73,-260.87:99
-chr1	2618590	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=341;Dels=0.00;HRun=0;HaplotypeScore=269.37;MQ=32.40;MQ0=23;OQ=694.60;QD=2.04;SB=-10.03	GT:AD:DP:GL:GQ	0/1:206,129:134:-115.74,-43.00,-326.10:99
-chr1	2618603	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=385;Dels=0.00;HRun=0;HaplotypeScore=742.67;MQ=32.24;MQ0=20;OQ=374.09;QD=0.97;SB=-84.54	GT:AD:DP:GL:GQ	0/1:213,140:157:-94.37,-53.68,-577.68:99
-chr1	2618613	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=414;Dels=0.00;HRun=1;HaplotypeScore=803.50;MQ=31.66;MQ0=23;OQ=626.38;QD=1.51;SB=181.82	GT:AD:DP:GL:GQ	0/1:349,58:175:-118.68,-52.76,-621.84:99
-chr1	2618617	.	A	C	34.85	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=417;Dels=0.00;HRun=1;HaplotypeScore=645.23;MQ=31.22;MQ0=23;QD=0.08;SB=-15.32	GT:AD:DP:GL:GQ	0/1:232,176:163:-62.01,-55.24,-512.02:67.68
-chr1	2618648	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=485;Dels=0.00;HRun=0;HaplotypeScore=582.18;MQ=29.51;MQ0=32;OQ=1313.91;QD=2.71;SB=163.03	GT:AD:DP:GL:GQ	0/1:367,113:208:-197.35,-62.68,-695.38:99
-chr1	2618651	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=487;Dels=0.00;HRun=0;HaplotypeScore=686.95;MQ=29.46;MQ0=33;OQ=108.10;QD=0.22;SB=256.13	GT:AD:DP:GL:GQ	0/1:431,46:211:-84.08,-69.98,-671.09:99
-chr1	2618685	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=500;Dels=0.00;HRun=1;HaplotypeScore=291.67;MQ=27.86;MQ0=33;OQ=4318.30;QD=8.64;SB=-761.47	GT:AD:DP:GL:GQ	0/1:182,284:216:-430.83,-67.58,-458.35:99
-chr1	2618707	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=462;Dels=0.01;HRun=4;HaplotypeScore=721.39;MQ=29.06;MQ0=34;OQ=2615.02;QD=5.66;SB=-699.35	GT:AD:DP:GL:GQ	0/1:165,282:202:-327.27,-62.48,-383.70:99
-chr1	2618711	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=464;Dels=0.00;HRun=0;HaplotypeScore=458.70;MQ=28.79;MQ0=35;OQ=1658.43;QD=3.57;SB=-180.55	GT:AD:DP:GL:GQ	0/1:156,178:185:-246.74,-77.62,-433.93:99
-chr1	2618743	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=565;Dels=0.00;HRun=1;HaplotypeScore=594.08;MQ=28.52;MQ0=39;OQ=195.57;QD=0.35;SB=27.58	GT:AD:DP:GL:GQ	0/1:503,58:268:-103.62,-80.78,-771.76:99
-chr1	2618776	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=541;Dels=0.00;HRun=0;HaplotypeScore=502.52;MQ=30.93;MQ0=35;OQ=5244.83;QD=9.69;SB=-856.66	GT:AD:DP:GL:GQ	0/1:182,353:279:-523.48,-84.06,-514.94:99
-chr1	2618784	.	C	T	23.85	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=542;Dels=0.00;HRun=0;HaplotypeScore=612.02;MQ=31.33;MQ0=33;QD=0.04;SB=67.53	GT:AD:DP:GL:GQ	0/1:386,152:218:-71.34,-65.68,-703.92:56.67
-chr1	2618799	rs61766473	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=520;Dels=0.00;HRun=1;HaplotypeScore=456.03;MQ=31.14;MQ0=35;OQ=4809.01;QD=9.25;SB=-828.34	GT:AD:DP:GL:GQ	0/1:169,328:274:-479.90,-94.56,-523.76:99
-chr1	2618813	rs28570043	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=586;Dels=0.00;HRun=0;HaplotypeScore=299.20;MQ=30.92;MQ0=47;OQ=1856.68;QD=3.17;SB=-717.31	GT:AD:DP:GL:GQ	0/1:501,75:250:-270.75,-81.80,-777.18:99
-chr1	2618823	rs61766474	A	T	4860.03	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=562;Dels=0.00;HRun=0;HaplotypeScore=709.32;MQ=30.48;MQ0=44;QD=8.65;SB=-560.15	GT:AD:DP:GL:GQ	0/1:287,273:277:-485.00,-83.44,-550.46:99
-chr1	2618832	.	C	G	1479.75	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=512;Dels=0.00;HRun=2;HaplotypeScore=411.64;MQ=30.81;MQ0=42;QD=2.89;SB=-17.36	GT:AD:DP:GL:GQ	0/1:367,94:241:-231.26,-80.00,-778.36:99
-chr1	2618833	.	G	C	375.40	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=513;Dels=0.00;HRun=1;HaplotypeScore=505.52;MQ=30.67;MQ0=42;QD=0.73;SB=152.53	GT:AD:DP:GL:GQ	0/1:466,47:236:-112.05,-71.23,-847.97:99
-chr1	2618853	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=470;Dels=0.00;HRun=0;HaplotypeScore=742.82;MQ=31.02;MQ0=40;OQ=917.98;QD=1.95;SB=-4.91	GT:AD:DP:GL:GQ	0/1:336,89:211:-236.75,-141.67,-586.15:99
-chr1	2618854	rs61766475	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=465;Dels=0.00;HRun=1;HaplotypeScore=675.66;MQ=31.14;MQ0=39;OQ=3030.86;QD=6.52;SB=-170.15	GT:AD:DP:GL:GQ	0/1:129,210:216:-470.96,-164.59,-497.24:99
-chr1	2618865	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=505;Dels=0.00;HRun=0;HaplotypeScore=338.61;MQ=30.47;MQ0=44;OQ=342.56;QD=0.68;SB=-14.42	GT:AD:DP:GL:GQ	0/1:439,53:231:-117.83,-80.29,-726.19:99
-chr1	2618904	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=499;Dels=0.00;HRun=4;HaplotypeScore=608.12;MQ=29.15;MQ0=44;OQ=1769.15;QD=3.55;SB=89.28	GT:AD:DP:GL:GQ	0/1:280,197:227:-252.16,-71.97,-553.68:99
-chr1	2618905	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=514;Dels=0.00;HRun=0;HaplotypeScore=596.36;MQ=29.03;MQ0=46;OQ=337.81;QD=0.66;SB=-30.28	GT:AD:DP:GL:GQ	0/1:424,43:227:-138.22,-101.16,-705.27:99
-chr1	2618928	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=624;Dels=0.00;HRun=2;HaplotypeScore=323.04;MQ=29.42;MQ0=49;OQ=696.10;QD=1.12;SB=42.74	GT:AD:DP:GL:GQ	0/1:499,120:322:-169.90,-97.01,-976.27:99
-chr1	2618942	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=632;Dels=0.00;HRun=0;HaplotypeScore=427.92;MQ=29.57;MQ0=51;OQ=1430.20;QD=2.26;SB=-6.35	GT:AD:DP:GL:GQ	0/1:441,177:340:-255.05,-108.75,-1027.84:99
-chr1	2618944	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=660;Dels=0.01;HRun=1;HaplotypeScore=381.00;MQ=29.09;MQ0=58;OQ=94.18;QD=0.14;SB=-52.32	GT:AD:DP:GL:GQ	0/1:544,51:336:-209.60,-196.90,-1072.15:99
-chr1	2619010	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=979;Dels=0.00;HRun=0;HaplotypeScore=447.29;MQ=26.60;MQ0=70;OQ=796.25;QD=0.81;SB=-92.06	GT:AD:DP:GL:GQ	0/1:864,98:425:-220.34,-137.43,-1275.90:99
-chr1	2619053	rs28733941	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=909;Dels=0.00;HRun=0;HaplotypeScore=595.79;MQ=27.09;MQ0=60;OQ=13631.67;QD=15.00;SB=-2975.80	GT:AD:DP:GL:GQ	0/1:104,553:419:-1362.17,-600.80,-836.54:99
-chr1	2619065	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=1083;Dels=0.00;HRun=0;HaplotypeScore=883.09;MQ=27.27;MQ0=55;OQ=741.35;QD=0.68;SB=-174.53	GT:AD:DP:GL:GQ	0/1:939,125:552:-281.40,-203.98,-1716.07:99
-chr1	2619068	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=1124;Dels=0.00;HRun=1;HaplotypeScore=958.29;MQ=27.28;MQ0=55;OQ=693.79;QD=0.62;SB=-203.14	GT:AD:DP:GL:GQ	0/1:985,132:593:-257.34,-184.67,-1827.88:99
-chr1	2619088	rs28368434	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=1328;Dels=0.00;HRun=2;HaplotypeScore=334.46;MQ=28.00;MQ0=46;OQ=7035.59;QD=5.30;SB=-1628.81	GT:AD:DP:GL:GQ	0/1:1024,295:793:-702.56,-254.86,-2119.90:99
-chr1	2619105	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=1330;Dels=0.00;HRun=0;HaplotypeScore=932.09;MQ=28.23;MQ0=29;OQ=2367.59;QD=1.78;SB=-1159.72	GT:AD:DP:GL:GQ	0/1:991,151:799:-779.65,-539.60,-2921.50:99
-chr1	2619148	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=990;Dels=0.00;HRun=0;HaplotypeScore=340.48;MQ=27.70;MQ0=55;OQ=2332.09;QD=2.36;SB=-739.43	GT:AD:DP:GL:GQ	0/1:796,178:558:-439.22,-202.73,-1989.78:99
-chr1	2619186	.	A	C	371.93	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=419;Dels=0.00;HRun=2;HaplotypeScore=464.28;MQ=28.43;MQ0=32;QD=0.89;SB=-209.63	GT:AD:DP:GL:GQ	0/1:320,97:190:-97.71,-57.24,-585.62:99
-chr1	2619187	.	A	C	430.91	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=400;Dels=0.00;HRun=1;HaplotypeScore=324.16;MQ=28.26;MQ0=30;QD=1.08;SB=-112.57	GT:AD:DP:GL:GQ	0/1:310,88:169:-97.29,-50.91,-502.75:99
-chr1	2619196	rs61766477	C	T	639.34	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=339;Dels=0.00;HRun=0;HaplotypeScore=406.21;MQ=29.84;MQ0=24;QD=1.89;SB=-240.09	GT:AD:DP:GL:GQ	0/1:283,37:141:-134.06,-66.84,-411.36:99
-chr1	2619205	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=257;Dels=0.00;HRun=0;HaplotypeScore=259.69;MQ=32.70;MQ0=16;OQ=1928.35;QD=7.50;SB=-426.10	GT:AD:DP:GL:GQ	0/1:80,173:106:-228.05,-31.94,-159.03:99
-chr1	2619218	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=235;Dels=0.00;HRun=1;HaplotypeScore=278.38;MQ=35.10;MQ0=10;OQ=372.83;QD=1.59;SB=-167.14	GT:AD:DP:GL:GQ	0/1:174,58:82:-65.27,-24.71,-216.22:99
-chr1	2619230	.	G	A	206.96	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=238;Dels=0.00;HRun=1;HaplotypeScore=422.57;MQ=34.96;MQ0=8;QD=0.87;SB=86.30	GT:AD:DP:GL:GQ	0/1:192,38:100:-59.43,-35.45,-312.61:99
-chr1	2619232	.	T	C	831.94	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=232;Dels=0.00;HRun=0;HaplotypeScore=355.75;MQ=35.18;MQ0=8;QD=3.59;SB=-351.57	GT:AD:DP:GL:GQ	0/1:163,64:87:-112.72,-26.24,-194.80:99
-chr1	2619238	.	G	T	230.19	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=214;Dels=0.00;HRun=0;HaplotypeScore=374.27;MQ=36.67;MQ0=6;QD=1.08;SB=104.29	GT:AD:DP:GL:GQ	0/1:105,106:92:-54.02,-27.71,-267.56:99
-chr1	2619244	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=201;Dels=0.00;HRun=0;HaplotypeScore=269.42;MQ=37.21;MQ0=7;OQ=1921.19;QD=9.56;SB=-479.90	GT:AD:DP:GL:GQ	0/1:57,142:93:-223.42,-28.02,-104.14:99
-chr1	2619306	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=2;HaplotypeScore=23.50;MQ=42.95;MQ0=2;OQ=983.37;QD=8.48;SB=-151.45	GT:AD:DP:GL:GQ	0/1:49,66:80:-128.94,-27.32,-178.83:99
-chr1	2619313	.	T	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=14.58;MQ=45.37;MQ0=2;OQ=717.70;QD=7.40;SB=-61.81	GT:AD:DP:GL:GQ	0/1:47,50:71:-96.45,-21.40,-150.45:99
-chr1	2619324	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=29.83;MQ=44.91;MQ0=2;OQ=606.68;QD=6.74;SB=-59.89	GT:AD:DP:GL:GQ	0/1:45,45:58:-81.45,-17.50,-117.39:99
-chr1	2619346	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=198;Dels=0.01;HRun=2;HaplotypeScore=304.95;MQ=34.96;MQ0=2;OQ=1893.09;QD=9.56;SB=62.22	GT:AD:DP:GL:GQ	0/1:48,144:92:-224.02,-31.43,-163.64:99
-chr1	2619351	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=249;Dels=0.00;HRun=1;HaplotypeScore=417.56;MQ=32.10;MQ0=4;OQ=1347.04;QD=5.41;SB=71.23	GT:AD:DP:GL:GQ	0/1:80,143:111:-171.44,-33.46,-209.78:99
-chr1	2619360	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=388;Dels=0.00;HRun=1;HaplotypeScore=438.87;MQ=28.93;MQ0=6;OQ=112.12;QD=0.29;SB=98.35	GT:AD:DP:GL:GQ	0/1:301,77:156:-68.00,-53.51,-526.40:99
-chr1	2619395	rs61766478	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=748;Dels=0.00;HRun=0;HaplotypeScore=964.64;MQ=26.94;MQ0=26;OQ=5287.26;QD=7.07;SB=128.59	GT:AD:DP:GL:GQ	0/1:216,518:288:-527.73,-89.49,-471.13:99
-chr1	2619416	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=775;Dels=0.00;HRun=0;HaplotypeScore=727.49;MQ=27.55;MQ0=26;OQ=6889.43;QD=8.89;SB=178.09	GT:AD:DP:GL:GQ	0/1:249,511:342:-687.94,-103.01,-497.11:99
-chr1	2619432	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=738;Dels=0.01;HRun=0;HaplotypeScore=785.98;MQ=28.56;MQ0=15;OQ=287.49;QD=0.39;SB=162.31	GT:AD:DP:GL:GQ	0/1:586,116:299:-161.89,-129.86,-1001.87:99
-chr1	2619446	rs61766479	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=555;Dels=0.00;HRun=1;HaplotypeScore=580.47;MQ=30.08;MQ0=12;OQ=4833.38;QD=8.71;SB=183.30	GT:AD:DP:GL:GQ	0/1:214,317:283:-482.34,-118.04,-540.99:99
-chr1	2619465	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=306;Dels=0.02;HRun=1;HaplotypeScore=404.44;MQ=32.23;MQ0=6;OQ=129.50;QD=0.42;SB=102.00	GT:AD:DP:GL:GQ	0/1:203,74:120:-64.50,-48.27,-416.86:99
-chr1	2619467	rs61766480	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=303;Dels=0.02;HRun=1;HaplotypeScore=363.13;MQ=31.91;MQ0=6;OQ=4502.12;QD=14.86;SB=-1253.39	GT:AD:DP:GL:GQ	0/1:40,252:153:-449.21,-45.80,-111.82:99
-chr1	2619477	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=279;Dels=0.00;HRun=0;HaplotypeScore=335.87;MQ=32.02;MQ0=7;OQ=542.66;QD=1.95;SB=122.33	GT:AD:DP:GL:GQ	0/1:161,107:129:-96.42,-38.87,-351.57:99
-chr1	2619489	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=268;Dels=0.00;HRun=1;HaplotypeScore=215.67;MQ=32.52;MQ0=8;OQ=1128.11;QD=4.21;SB=95.32	GT:AD:DP:GL:GQ	0/1:114,145:131:-166.02,-49.92,-331.55:99
-chr1	2619505	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=0;HaplotypeScore=305.81;MQ=31.15;MQ0=10;OQ=135.21;QD=0.50;SB=68.22	GT:AD:DP:GL:GQ	0/1:237,31:129:-55.67,-38.86,-389.56:99
-chr1	2619511	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=262;Dels=0.00;HRun=0;HaplotypeScore=356.76;MQ=30.03;MQ0=11;OQ=250.01;QD=0.95;SB=47.18	GT:AD:DP:GL:GQ	0/1:212,49:118:-63.84,-35.55,-351.09:99
-chr1	2619524	rs34081960	A	G	343.80	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=216;Dels=0.00;HRun=1;HaplotypeScore=217.57;MQ=30.42;MQ0=7;QD=1.59;SB=47.18	GT:AD:DP:GL:GQ	0/1:179,33:102:-68.39,-30.73,-325.69:99
-chr1	2619526	.	C	A	23.86	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=205;Dels=0.00;HRun=1;HaplotypeScore=236.96;MQ=30.18;MQ0=8;QD=0.12;SB=44.17	GT:AD:DP:GL:GQ	0/1:190,11:95:-34.28,-28.61,-300.58:56.68
-chr1	2619527	.	A	C	538.74	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=197;Dels=0.00;HRun=1;HaplotypeScore=224.55;MQ=30.05;MQ0=8;QD=2.73;SB=-87.11	GT:AD:DP:GL:GQ	0/1:122,73:87:-83.37,-26.21,-226.60:99
-chr1	2619530	.	T	G	866.27	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=215.21;MQ=31.06;MQ0=6;QD=4.84;SB=12.12	GT:AD:DP:GL:GQ	0/1:87,85:86:-126.63,-36.72,-179.70:99
-chr1	2619534	.	A	G	264.68	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=172;Dels=0.00;HRun=1;HaplotypeScore=280.66;MQ=30.98;MQ0=7;QD=1.54;SB=41.16	GT:AD:DP:GL:GQ	0/1:139,33:74:-52.04,-22.29,-233.98:99
-chr1	2619544	.	C	T	108.85	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=155;Dels=0.06;HRun=0;HaplotypeScore=267.97;MQ=31.40;MQ0=5;QD=0.70;SB=38.12	GT:AD:DP:GL:GQ	0/1:124,16:57:-34.75,-20.58,-177.62:99
-chr1	2619546	.	C	G	37.35	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=150;Dels=0.00;HRun=0;HaplotypeScore=251.96;MQ=31.91;MQ0=5;QD=0.25;SB=38.15	GT:AD:DP:GL:GQ	0/1:138,7:61:-25.40,-18.38,-245.36:70.19
-chr1	2619553	.	A	G	821.41	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=113.41;MQ=33.54;MQ0=5;QD=6.96;SB=23.10	GT:AD:DP:GL:GQ	0/1:33,83:56:-102.29,-16.87,-105.73:99
-chr1	2619570	rs12757527	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=61.91;MQ=39.68;MQ0=1;OQ=223.25;QD=2.51;SB=41.15	GT:AD:DP:GL:GQ	0/1:39,49:45:-39.17,-13.56,-132.69:99
-chr1	2619576	rs11516512	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=85.98;MQ=40.41;MQ0=1;OQ=1215.90;QD=15.59;SB=-537.94	GT:AD:DP:GL:GQ	0/1:9,69:47:-139.03,-14.16,-23.39:92.31
-chr1	2619644	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=167.24;MQ=38.77;MQ0=11;OQ=65.21;QD=0.53;SB=59.09	GT:AD:DP:GL:GQ	0/1:83,36:47:-23.99,-14.18,-125.75:98.05
-chr1	2619667	rs12757684	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=110;Dels=0.02;HRun=3;HaplotypeScore=150.20;MQ=38.48;MQ0=2;OQ=87.98;QD=0.80;SB=-4.94	GT:AD:DP:GL:GQ	0/1:62,46:39:-23.84,-11.75,-110.18:99
-chr1	2619672	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=2;HaplotypeScore=165.55;MQ=38.18;MQ0=2;OQ=67.69;QD=0.61;SB=56.21	GT:AD:DP:GL:GQ	0/1:58,23:45:-37.64,-27.58,-156.78:99
-chr1	2619717	rs35537872	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=101;Dels=0.00;HRun=0;HaplotypeScore=158.55;MQ=37.91;MQ0=1;OQ=82.21;QD=0.81;SB=12.47	GT:AD:DP:GL:GQ	0/1:41,55:41:-23.87,-12.36,-127.50:99
-chr1	2619725	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=160.68;MQ=38.53;MQ0=0;OQ=110.57;QD=1.00;SB=59.22	GT:AD:DP:GL:GQ	0/1:96,15:49:-29.10,-14.76,-154.28:99
-chr1	2619755	rs35198281	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=0;HaplotypeScore=135.67;MQ=40.63;MQ0=1;OQ=77.36;QD=0.78;SB=-26.15	GT:AD:DP:GL:GQ	0/1:44,49:41:-23.37,-12.36,-121.95:99
-chr1	2619802	.	G	A	11.69	LowQual	AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=1;HaplotypeScore=127.16;MQ=33.63;MQ0=4;QD=0.12;SB=-22.48	GT:AD:DP:GL:GQ	0/1:79,20:38:-15.87,-11.45,-120.55:44.22
-chr1	2619811	rs11516513	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=1;HaplotypeScore=94.34;MQ=31.96;MQ0=5;OQ=1057.97;QD=11.02;SB=-282.04	GT:AD:DP:GL:GQ	0/1:29,63:37:-120.23,-11.15,-15.87:47.21
-chr1	2619844	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=163.21;MQ=35.54;MQ0=9;OQ=150.26;QD=1.60;SB=-85.59	GT:AD:DP:GL:GQ	0/1:35,58:32:-27.96,-9.65,-83.83:99
-chr1	2619873	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=1;HaplotypeScore=84.94;MQ=33.03;MQ0=22;OQ=528.32;QD=3.80;SB=-259.93	GT:AD:DP:GL:GQ	0/1:45,94:55:-72.69,-16.57,-137.30:99
-chr1	2619885	rs4648686	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=143;Dels=0.00;HRun=0;HaplotypeScore=76.46;MQ=34.20;MQ0=29;OQ=72.77;QD=0.51;SB=-32.15	GT:AD:DP:GL:GQ	0/1:107,35:58:-28.03,-17.47,-178.69:99
-chr1	2619907	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=129;Dels=0.02;HRun=0;HaplotypeScore=75.23;MQ=35.05;MQ0=37;OQ=78.76;QD=0.61;SB=20.08	GT:AD:DP:GL:GQ	0/1:80,29:48:-28.88,-17.72,-148.42:99
-chr1	2619934	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=0;HaplotypeScore=66.32;MQ=35.85;MQ0=29;OQ=172.74;QD=1.52;SB=-28.24	GT:AD:DP:GL:GQ	0/1:48,66:48:-35.03,-14.47,-147.33:99
-chr1	2619955	rs6604996	C	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=109;Dels=0.00;HRun=0;HaplotypeScore=63.40;MQ=33.93;MQ0=36;OQ=1440.37;QD=13.21;SB=-479.54	GT:AD:DP:GL:GQ	1/1:0,108:38:-147.67,-11.48,-0.04:99
-chr1	2620070	rs12740972	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=47.55;MQ=45.30;MQ0=8;OQ=554.48;QD=5.72;SB=-255.88	GT:AD:DP:GL:GQ	0/1:70,21:53:-74.72,-15.98,-142.31:99
-chr1	2620085	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=54.16;MQ=39.71;MQ0=11;OQ=120.34;QD=1.02;SB=-33.16	GT:AD:DP:GL:GQ	0/1:69,45:56:-32.19,-16.87,-164.99:99
-chr1	2620124	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=0;HaplotypeScore=63.81;MQ=34.92;MQ0=3;OQ=525.60;QD=3.65;SB=47.19	GT:AD:DP:GL:GQ	0/1:42,93:57:-80.08,-24.23,-172.63:99
-chr1	2620133	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=151;Dels=0.00;HRun=1;HaplotypeScore=107.36;MQ=34.37;MQ0=3;OQ=432.59;QD=2.86;SB=-11.69	GT:AD:DP:GL:GQ	0/1:52,96:55:-63.12,-16.58,-172.84:99
-chr1	2620148	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=170;Dels=0.00;HRun=3;HaplotypeScore=138.11;MQ=33.81;MQ0=6;OQ=406.05;QD=2.39;SB=-68.70	GT:AD:DP:GL:GQ	0/1:52,113:57:-61.06,-17.17,-159.71:99
-chr1	2620167	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=206;Dels=0.00;HRun=1;HaplotypeScore=129.33;MQ=31.98;MQ0=15;OQ=238.76;QD=1.16;SB=-5.73	GT:AD:DP:GL:GQ	0/1:136,68:69:-47.94,-20.78,-212.90:99
-chr1	2620268	rs12741311	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=74.94;MQ=48.87;MQ0=0;OQ=615.93;QD=7.90;SB=-166.53	GT:AD:DP:GL:GQ	0/1:39,39:52:-80.54,-15.66,-101.64:99
-chr1	2620338	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=0;HaplotypeScore=10.27;MQ=42.72;MQ0=7;OQ=159.57;QD=1.60;SB=-79.74	GT:AD:DP:GL:GQ	0/1:47,53:53:-35.21,-15.97,-154.39:99
-chr1	2620373	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=37.37;MQ=38.59;MQ0=9;OQ=479.31;QD=3.40;SB=-63.47	GT:AD:DP:GL:GQ	0/1:49,92:64:-70.51,-19.30,-148.48:99
-chr1	2620382	.	G	A	119.16	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=95.95;MQ=37.22;MQ0=9;QD=0.82;SB=68.14	GT:AD:DP:GL:GQ	0/1:86,59:65:-34.81,-19.61,-177.00:99
-chr1	2620388	.	A	C	105.30	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=1;HaplotypeScore=83.57;MQ=35.41;MQ0=9;QD=0.69;SB=-45.48	GT:AD:DP:GL:GQ	0/1:132,21:67:-34.00,-20.19,-204.42:99
-chr1	2620390	rs28376921	A	C	238.82	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=152;Dels=0.00;HRun=3;HaplotypeScore=84.30;MQ=34.68;MQ0=9;QD=1.57;SB=-137.48	GT:AD:DP:GL:GQ	0/1:57,64:66:-69.75,-42.59,-188.12:99
-chr1	2620438	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=39.76;MQ=41.64;MQ0=7;OQ=388.27;QD=3.70;SB=-212.33	GT:AD:DP:GL:GQ	0/1:46,59:60:-60.19,-18.08,-149.44:99
-chr1	2620448	.	T	C	36.03	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=55.60;MQ=44.75;MQ0=3;QD=0.36;SB=59.63	GT:AD:DP:GL:GQ	0/1:72,27:62:-25.58,-18.69,-209.22:68.86
-chr1	2620451	rs28507126	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=42.59;MQ=44.33;MQ0=4;OQ=207.39;QD=2.07;SB=-2.70	GT:AD:DP:GL:GQ	0/1:56,44:55:-40.61,-16.58,-162.04:99
-chr1	2620498	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=0;HaplotypeScore=117.30;MQ=35.77;MQ0=21;OQ=96.72;QD=0.68;SB=-10.89	GT:AD:DP:GL:GQ	0/1:119,24:63:-31.93,-18.98,-196.03:99
-chr1	2620509	.	C	A	44.02	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=149.75;MQ=36.71;MQ0=19;QD=0.28;SB=8.48	GT:AD:DP:GL:GQ	0/1:122,32:70:-28.77,-21.09,-215.81:76.85
-chr1	2620530	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=120;Dels=0.01;HRun=0;HaplotypeScore=86.24;MQ=39.02;MQ0=10;OQ=202.63;QD=1.69;SB=-58.78	GT:AD:DP:GL:GQ	0/1:60,45:53:-46.29,-22.74,-131.05:99
-chr1	2620553	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=4;HaplotypeScore=12.66;MQ=42.96;MQ0=4;OQ=154.29;QD=1.66;SB=6.59	GT:AD:DP:GL:GQ	0/1:47,46:55:-35.28,-16.57,-164.62:99
-chr1	2620589	rs4648687	C	A	0.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=19.10;MQ=49.13;MQ0=2;OQ=495.80;QD=9.01;SB=-265.29	GT:AD:DP:GL:GQ	0/1:36,19:38:-64.31,-11.45,-69.99:99
-chr1	2620786	rs12742092	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=51.45;MQ=48.85;MQ0=1;OQ=289.75;QD=5.57;SB=-99.04	GT:AD:DP:GL:GQ	0/1:36,16:30:-41.30,-9.04,-64.97:99
-chr1	2620835	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=99.62;MQ=36.59;MQ0=7;OQ=441.17;QD=4.64;SB=-224.20	GT:AD:DP:GL:GQ	0/1:74,18:36:-60.73,-13.33,-87.56:99
-chr1	2620875	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=107.69;MQ=35.97;MQ0=15;OQ=95.46;QD=0.71;SB=-26.90	GT:AD:DP:GL:GQ	0/1:113,19:59:-30.61,-17.78,-174.51:99
-chr1	2620960	.	T	A	14.94	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=17.98;MQ=48.66;MQ0=1;QD=0.38;SB=38.15	GT:AD:DP:GL:GQ	0/1:35,4:38:-16.21,-11.45,-119.38:47.63
-chr1	2621024	.	C	A	47.37	LowQual	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=15.73;MQ=45.56;MQ0=1;QD=1.18;SB=-9.87	GT:AD:DP:GL:GQ	0/1:33,7:35:-18.56,-10.54,-104.34:80.21
-chr1	2621154	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=51.59;MQ=53.22;MQ0=2;OQ=488.50;QD=9.77;SB=-206.66	GT:AD:DP:GL:GQ	0/1:29,19:38:-63.61,-11.47,-88.44:99
-chr1	2621346	rs12746691	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=78.63;MQ=48.13;MQ0=0;OQ=876.62;QD=14.61;SB=-440.96	GT:AD:DP:GL:GQ	0/1:34,26:44:-104.20,-13.26,-62.31:99
-chr1	2621414	rs12746841	C	G	50.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=5.31;MQ=55.95;MQ0=0;OQ=526.83;QD=11.97;SB=-219.19	GT:AD:DP:GL:GQ	0/1:24,20:36:-66.82,-10.85,-82.62:99
-chr1	2621575	rs61766505	T	A	0.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=9.78;MQ=51.58;MQ0=2;OQ=514.79;QD=12.26;SB=-105.13	GT:AD:DP:GL:GQ	0/1:24,18:33:-64.70,-9.94,-57.89:99
-chr1	2621592	rs11516514	C	A	2.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=7.05;MQ=51.18;MQ0=2;OQ=412.67;QD=8.78;SB=-93.77	GT:AD:DP:GL:GQ	0/1:31,16:35:-55.10,-10.55,-68.38:99
-chr1	2621664	rs12743419	G	A	126.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=54.07;MQ0=3;OQ=805.45;QD=17.14;SB=-279.82	GT:AD:DP:GL:GQ	0/1:16,31:40:-95.89,-12.06,-46.66:99
-chr1	2621957	rs12751643	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.02;HRun=1;HaplotypeScore=33.34;MQ=53.32;MQ0=0;OQ=1019.18;QD=17.27;SB=-299.66	GT:AD:DP:GL:GQ	0/1:24,34:54:-121.47,-16.27,-70.01:99
-chr1	2622417	.	C	G	34.36	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=22.88;MQ0=7;QD=1.01;SB=-10.00	GT:AD:DP:GL:GQ	0/1:28,6:20:-12.75,-6.03,-74.77:67.20
-chr1	2622422	rs11488613	G	T	0.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=6.76;MQ=21.77;MQ0=7;OQ=525.32;QD=15.45;SB=-10.00	GT:AD:DP:GL:GQ	1/1:3,31:16:-56.12,-4.82,-0.00:48.14
-chr1	2622433	rs12752340	C	A	26.89	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=20.67;MQ0=10;QD=0.75;SB=-10.00	GT:AD:DP:GL:GQ	0/1:30,6:16:-10.79,-4.82,-42.41:59.72
-chr1	2674088	.	C	G	42.96	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=0;HaplotypeScore=11.98;MQ=19.55;MQ0=6;QD=3.91;SB=-10.00	GT:AD:DP:GL:GQ	0/1:8,3:5:-9.09,-1.51,-12.64:75.79
-chr1	2674094	.	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=17.86;MQ=18.47;MQ0=6;OQ=64.31;QD=4.95;SB=-10.00	GT:AD:DP:GL:GQ	0/1:10,3:4:-10.92,-1.20,-3.26:20.53
-chr1	2674111	.	T	A	27.07	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=32.32;MQ0=6;QD=1.80;SB=-6.99	GT:AD:DP:GL:GQ	0/1:12,3:7:-8.10,-2.11,-18.86:59.90
-chr1	2674112	.	A	G	16.12	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=32.32;MQ0=6;QD=1.07;SB=-6.99	GT:AD:DP:GL:GQ	0/1:12,3:7:-6.99,-2.11,-20.42:48.85
-chr1	2674407	.	A	G	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=13.44;MQ=45.39;MQ0=5;OQ=445.12;QD=11.41;SB=-215.68	GT:AD:DP:GL:GQ	0/1:16,22:32:-57.44,-9.65,-56.21:99
-chr1	2674852	rs61766513	G	A	450.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=13.17;MQ0=18;OQ=519.69;QD=10.39;SB=-286.88	GT:AD:DP:GL:GQ	1/1:0,50:14:-55.56,-4.22,-0.00:42.14
-chr1	2676124	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=1;HaplotypeScore=15.64;MQ=24.04;MQ0=14;OQ=178.81;QD=2.03;SB=-90.56	GT:AD:DP:GL:GQ	0/1:59,29:40:-33.21,-12.05,-114.97:99
-chr1	2676150	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=19.23;MQ=23.09;MQ0=22;OQ=221.70;QD=2.33;SB=-83.88	GT:AD:DP:GL:GQ	0/1:54,41:38:-36.91,-11.46,-90.41:99
-chr1	2676190	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=39.71;MQ=18.24;MQ0=31;OQ=65.56;QD=0.85;SB=-25.50	GT:AD:DP:GL:GQ	0/1:64,13:22:-16.48,-6.63,-57.54:98.40
-chr1	2676191	.	G	A	29.02	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=39.71;MQ=17.81;MQ0=31;QD=0.39;SB=26.10	GT:AD:DP:GL:GQ	0/1:60,14:18:-11.61,-5.43,-50.51:61.85
-chr1	2676208	.	G	A	16.39	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=4.26;MQ=15.36;MQ0=32;QD=0.30;SB=-24.49	GT:AD:DP:GL:GQ	0/1:43,10:12:-8.53,-3.62,-33.94:49.13
-chr1	2676293	rs11486072	G	T	42.12	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.44;MQ0=18;QD=0.68;SB=83.26	GT:AD:DP:GL:GQ	0/1:53,9:41:-19.85,-12.35,-121.85:74.96
-chr1	2676409	.	C	G	16.08	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=0;HaplotypeScore=24.91;MQ=14.80;MQ0=58;QD=0.16;SB=-10.00	GT:AD:DP:GL:GQ	0/1:83,17:12:-8.50,-3.62,-44.92:48.81
-chr1	2677515	.	G	T	19.05	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=14.46;MQ=8.37;MQ0=110;QD=0.16;SB=-10.00	GT:AD:DP:GL:GQ	0/1:117,3:8:-7.59,-2.41,-19.90:51.83
-chr1	2677525	.	C	T	16.29	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=1;HaplotypeScore=20.34;MQ=9.26;MQ0=102;QD=0.14;SB=-10.00	GT:AD:DP:GL:GQ	0/1:110,4:10:-7.91,-3.01,-27.95:49.02
-chr1	2677552	.	A	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=12.35;MQ=15.52;MQ0=82;OQ=53.71;QD=0.48;SB=0.32	GT:AD:DP:GL:GQ	0/1:89,18:28:-23.83,-15.18,-91.71:86.54
-chr1	2677675	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=15.33;MQ=33.22;MQ0=25;OQ=57.19;QD=0.55;SB=35.14	GT:AD:DP:GL:GQ	0/1:87,15:66:-28.89,-19.89,-231.82:90.03
-chr1	2677743	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=0;HaplotypeScore=4.26;MQ=19.03;MQ0=67;OQ=90.19;QD=0.78;SB=-10.00	GT:AD:DP:GL:GQ	0/1:98,17:39:-24.05,-11.75,-110.96:99
-chr1	2677829	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=0;HaplotypeScore=23.79;MQ=23.13;MQ0=70;OQ=279.18;QD=2.18;SB=-0.99	GT:AD:DP:GL:GQ	0/1:107,21:47:-45.38,-14.18,-109.88:99
-chr1	2677890	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=41.46;MQ=39.72;MQ0=24;OQ=334.00;QD=2.24;SB=-111.40	GT:AD:DP:GL:GQ	0/1:125,24:98:-66.21,-29.53,-281.36:99
-chr1	2677918	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=22.75;MQ=42.78;MQ0=7;OQ=406.29;QD=3.01;SB=-222.57	GT:AD:DP:GL:GQ	0/1:111,24:99:-73.74,-29.83,-281.76:99
-chr1	2678023	rs4601526	G	T	43.97	LowQual	AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=8.77;MQ=39.66;MQ0=3;QD=0.46;SB=-45.56	GT:AD:DP:GL:GQ	0/1:69,27:71:-29.07,-21.39,-211.74:76.81
-chr1	2678153	rs4287119	C	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DB;DP=112;Dels=0.00;HRun=0;HaplotypeScore=21.76;MQ=40.92;MQ0=5;OQ=2547.58;QD=22.75;SB=-1076.65	GT:AD:DP:GL:GQ	0/1:21,91:87:-284.26,-26.22,-47.57:99
-chr1	2679458	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=42.73;MQ=34.12;MQ0=11;OQ=188.41;QD=2.36;SB=-47.79	GT:AD:DP:GL:GQ	0/1:51,29:31:-31.49,-9.36,-91.42:99
-chr1	2679642	.	C	G	45.83	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=7.58;MQ=33.48;MQ0=11;QD=0.45;SB=71.27	GT:AD:DP:GL:GQ	0/1:93,9:79:-31.68,-23.81,-299.21:78.67
-chr1	2679803	rs56221638	T	A	49.73	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=28.41;MQ=20.22;MQ0=17;QD=0.80;SB=-24.63	GT:AD:DP:GL:GQ	0/1:36,25:21:-14.59,-6.33,-59.48:82.57
-chr1	2679816	rs4648571	G	A	0.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=13.76;MQ=19.63;MQ0=17;OQ=484.56;QD=8.35;SB=18.94	GT:AD:DP:GL:GQ	1/1:9,49:16:-54.94,-4.82,-2.91:19.19
-chr1	2680538	rs58288263	C	A	0.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=103;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=19.45;MQ0=42;OQ=235.18;QD=2.28;SB=-135.60	GT:AD:DP:GL:GQ	0/1:70,33:45:-40.37,-13.56,-115.16:99
-chr1	2681143	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=43.31;MQ=7.59;MQ0=129;OQ=216.62;QD=1.54;SB=-10.00	GT:AD:DP:GL:GQ	0/1:128,12:8:-27.36,-2.41,-6.90:44.81
-chr1	2681205	.	C	T	16.27	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=11.46;MQ=9.18;MQ0=122;QD=0.12;SB=-10.00	GT:AD:DP:GL:GQ	0/1:130,4:11:-8.21,-3.31,-32.22:49.01
-chr1	2681386	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=85;Dels=0.02;HRun=1;HaplotypeScore=17.33;MQ=40.82;MQ0=2;OQ=547.52;QD=6.44;SB=26.11	GT:AD:DP:GL:GQ	0/1:58,25:71:-78.82,-20.79,-186.55:99
-chr1	2681420	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=0;HaplotypeScore=13.55;MQ=31.27;MQ0=32;OQ=249.95;QD=2.34;SB=17.08	GT:AD:DP:GL:GQ	0/1:90,15:70:-49.36,-21.09,-234.22:99
-chr1	2681440	.	T	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=2;HaplotypeScore=12.17;MQ=28.00;MQ0=51;OQ=57.67;QD=0.49;SB=-0.98	GT:AD:DP:GL:GQ	0/1:103,11:57:-26.23,-17.18,-176.09:90.51
-chr1	2681463	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=17.45;MQ=24.10;MQ0=61;OQ=86.42;QD=0.77;SB=-10.00	GT:AD:DP:GL:GQ	0/1:104,8:47:-26.08,-14.16,-135.23:99
-chr1	2681473	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=1;HaplotypeScore=11.36;MQ=22.15;MQ0=63;OQ=86.11;QD=0.79;SB=-10.00	GT:AD:DP:GL:GQ	0/1:101,7:42:-24.54,-12.65,-127.26:99
-chr1	2681679	rs61766519	A	T	2.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=109;Dels=0.00;HRun=0;HaplotypeScore=3.86;MQ=46.07;MQ0=2;OQ=403.94;QD=3.71;SB=-208.28	GT:AD:DP:GL:GQ	0/1:86,23:102:-74.40,-30.73,-305.98:99
-chr1	2681697	.	C	G	10.09	PASS	AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=45.11;MQ0=2;OQ=843.38;QD=7.21;SB=-230.77	GT:AD:DP:GL:GQ	0/1:84,33:113:-121.68,-34.06,-367.48:99
-chr1	2681715	rs4430271	G	A	32.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=112;Dels=0.00;HRun=1;HaplotypeScore=3.54;MQ=44.60;MQ0=4;OQ=4104.48;QD=36.65;SB=-1313.32	GT:AD:DP:GL:GQ	1/1:1,111:104:-409.45,-31.34,-0.04:99
-chr1	2681869	.	T	C	23.42	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=42.88;MQ0=2;QD=0.35;SB=71.26	GT:AD:DP:GL:GQ	0/1:51,15:54:-21.90,-16.27,-186.51:56.24
-chr1	2681986	rs11586212	G	A	7.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.27;MQ=47.82;MQ0=3;OQ=510.08;QD=6.80;SB=56.19	GT:AD:DP:GL:GQ	0/1:53,22:70:-75.38,-21.09,-180.91:99
-chr1	2682337	.	G	A	7.34	PASS	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=27.22;MQ0=23;OQ=345.10;QD=8.03;SB=-10.00	GT:AD:DP:GL:GQ	0/1:20,23:16:-42.61,-4.82,-16.65:99
-chr1	2682347	.	G	T	0.70	PASS	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=19.93;MQ0=26;OQ=183.77;QD=4.59;SB=-10.00	GT:AD:DP:GL:GQ	0/1:20,20:10:-24.67,-3.01,-11.27:82.62
-chr1	2682645	.	C	A	19.07	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=2.93;MQ=11.47;MQ0=37;QD=0.33;SB=-0.98	GT:AD:DP:GL:GQ	0/1:31,27:8:-7.60,-2.41,-19.17:51.85
-chr1	2683816	rs10909957	C	T	271.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.42;MQ=46.26;MQ0=0;OQ=686.46;QD=13.46;SB=-268.23	GT:AD:DP:GL:GQ	0/1:24,27:45:-85.49,-13.56,-81.02:99
-chr1	2684356	rs6424062	G	A	144.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=59.15;MQ0=0;OQ=655.97;QD=13.39;SB=-112.11	GT:AD:DP:GL:GQ	0/1:26,23:46:-82.76,-13.88,-73.01:99
-chr1	2687573	rs4648459	G	T	323.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=60.00;MQ0=0;OQ=991.84;QD=18.37;SB=-411.82	GT:AD:DP:GL:GQ	0/1:20,34:49:-117.23,-14.76,-57.58:99
-chr1	2689509	rs4648499	A	C	571.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=812.32;QD=13.32;SB=-346.80	GT:AD:DP:GL:GQ	0/1:31,30:60:-102.59,-18.07,-113.17:99
-chr1	2689977	rs4648502	C	G	37.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=4.68;MQ=58.83;MQ0=0;OQ=362.80;QD=11.34;SB=-98.64	GT:AD:DP:GL:GQ	0/1:15,17:26:-47.41,-7.85,-58.24:99
-chr1	2691287	rs10909982	A	C	5.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=1.88;MQ=58.74;MQ0=0;OQ=1314.76;QD=31.30;SB=-536.04	GT:AD:DP:GL:GQ	1/1:0,42:39:-135.08,-11.75,-0.02:99
-chr1	2691405	.	T	C	26.51	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.83;MQ=54.55;MQ0=0;QD=0.72;SB=1.18	GT:AD:DP:GL:GQ	0/1:31,6:36:-16.78,-10.85,-121.87:59.34
-chr1	2691676	rs1456462	C	G	51.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=3.07;MQ=56.36;MQ0=0;OQ=806.36;QD=17.53;SB=-304.60	GT:AD:DP:GL:GQ	0/1:21,25:41:-96.28,-12.36,-77.64:99
-chr1	2694331	rs12748553	C	T	3.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=8.78;MQ=58.48;MQ0=0;OQ=835.97;QD=17.06;SB=-250.13	GT:AD:DP:GL:GQ	0/1:21,26:46:-100.74,-13.86,-71.99:99
-chr1	2694778	rs55972083	G	T	162.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.66;MQ0=0;OQ=915.47;QD=16.64;SB=-316.68	GT:AD:DP:GL:GQ	0/1:25,30:54:-111.10,-16.27,-82.95:99
-chr1	2697298	rs7526311	A	T	117.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.01;MQ0=0;OQ=185.29;QD=9.75;SB=-41.37	GT:AD:DP:GL:GQ	0/1:12,7:18:-27.23,-5.42,-39.59:99
-chr1	2697760	.	G	T	0.81	PASS	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=2;HaplotypeScore=0.96;MQ=60.00;MQ0=0;OQ=344.69;QD=12.77;SB=-29.36	GT:AD:DP:GL:GQ	0/1:13,14:25:-45.29,-7.54,-35.79:99
-chr1	2697817	rs57572926	T	A	7.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.48;MQ0=0;OQ=773.03;QD=21.47;SB=-134.51	GT:AD:DP:GL:GQ	0/1:11,25:35:-91.13,-10.54,-41.10:99
-chr1	2699252	rs12044475	G	A	223.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=59.73;MQ0=0;OQ=1184.05;QD=17.41;SB=-586.14	GT:AD:DP:GL:GQ	0/1:32,36:66:-141.59,-19.90,-99.06:99
-chr1	2699436	rs12024170	C	T	193.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=59.75;MQ0=0;OQ=1445.81;QD=19.54;SB=-655.75	GT:AD:DP:GL:GQ	0/1:31,43:72:-169.56,-21.69,-100.95:99
-chr1	2699862	rs6687680	G	A	230.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.28;MQ0=0;OQ=1732.28;QD=19.25;SB=-761.79	GT:AD:DP:GL:GQ	0/1:40,50:89:-203.33,-26.82,-125.78:99
-chr1	2700237	.	G	A	246.23	PASS	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=1343.35;QD=18.92;SB=-523.75	GT:AD:DP:GL:GQ	0/1:31,40:71:-159.02,-21.40,-102.65:99
-chr1	2702030	rs12731995	A	G	434.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=677.81;QD=11.11;SB=-347.04	GT:AD:DP:GL:GQ	0/1:33,28:60:-89.15,-18.08,-132.37:99
-chr1	2703187	rs2377041	C	T	502.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=621.61;QD=15.54;SB=-277.29	GT:AD:DP:GL:GQ	0/1:21,19:39:-77.20,-11.76,-63.03:99
-chr1	2704632	.	T	C	38.02	LowQual	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=4;HaplotypeScore=7.59;MQ=52.48;MQ0=0;QD=2.38;SB=-19.89	GT:AD:DP:GL:GQ	0/1:10,6:12:-10.71,-3.62,-29.51:70.86
-chr1	2704685	.	G	A	22.35	LowQual	AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=7.62;MQ=56.04;MQ0=0;QD=1.86;SB=-34.51	GT:AD:DP:GL:GQ	0/1:9,2:7:-7.63,-2.11,-16.67:55.16
-chr1	2704950	.	A	G	2.25	PASS	AC=2;AF=1.00;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=48.87;MQ0=0;OQ=588.34;QD=32.69;SB=-143.72	GT:AD:DP:GL:GQ	1/1:0,18:17:-62.42,-5.12,-0.01:51.15
-chr1	2705371	.	T	C	47.74	LowQual	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=1;HaplotypeScore=3.65;MQ=60.80;MQ0=0;QD=2.51;SB=-6.99	GT:AD:DP:GL:GQ	0/1:12,6:14:-12.28,-4.22,-38.37:80.58
-chr1	2705380	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=2;HaplotypeScore=2.68;MQ=59.93;MQ0=0;OQ=62.82;QD=3.31;SB=-3.98	GT:AD:DP:GL:GQ	0/1:14,5:17:-14.69,-5.13,-40.99:95.66
-chr1	2706146	.	A	G	47.67	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=5;HaplotypeScore=3.46;MQ=57.94;MQ0=0;QD=1.40;SB=47.18	GT:AD:DP:GL:GQ	0/1:26,7:27:-16.19,-8.14,-86.26:80.50
-chr1	2706767	rs751358	G	C	35.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=240.08;QD=16.01;SB=-112.68	GT:AD:DP:GL:GQ	0/1:7,8:15:-31.82,-4.53,-27.47:99
-chr1	2708350	rs897627	T	C	68.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.23;MQ0=0;OQ=241.23;QD=8.04;SB=-88.78	GT:AD:DP:GL:GQ	0/1:18,12:26:-35.25,-7.84,-56.33:99
-chr1	2709162	rs897626	T	C	124.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.89;MQ=58.50;MQ0=0;OQ=297.67;QD=9.60;SB=-169.49	GT:AD:DP:GL:GQ	0/1:13,16:23:-39.99,-6.94,-39.26:99
-chr1	2709764	rs12725202	C	A	209.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=59.58;MQ0=0;OQ=806.35;QD=14.66;SB=-275.34	GT:AD:DP:GL:GQ	0/1:27,28:48:-98.38,-14.47,-61.56:99
-chr1	2711436	rs897623	A	G	190.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=58.98;MQ0=0;OQ=627.29;QD=15.30;SB=-199.45	GT:AD:DP:GL:GQ	0/1:15,26:39:-77.77,-11.76,-60.17:99
-chr1	2712708	rs6692145	C	T	11.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=7.75;MQ=59.11;MQ0=0;OQ=873.72;QD=16.80;SB=-440.44	GT:AD:DP:GL:GQ	0/1:21,31:48:-105.13,-14.48,-65.51:99
-chr1	2713074	rs4648450	C	A	220.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=59.19;MQ0=0;OQ=931.32;QD=16.34;SB=-352.41	GT:AD:DP:GL:GQ	0/1:24,33:49:-111.18,-14.76,-58.95:99
-chr1	2713205	rs4648360	C	T	362.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.64;MQ0=0;OQ=808.14;QD=12.63;SB=-348.52	GT:AD:DP:GL:GQ	0/1:38,26:64:-103.39,-19.29,-126.27:99
-chr1	2713822	rs11588256	T	C	179.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.44;MQ0=0;OQ=1164.73;QD=28.41;SB=-522.80	GT:AD:DP:GL:GQ	1/1:0,40:39:-122.64,-14.15,-2.58:99
-chr1	2715335	rs7537581	C	A	258.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=59.30;MQ0=0;OQ=476.92;QD=14.45;SB=-256.43	GT:AD:DP:GL:GQ	0/1:16,17:32:-60.62,-9.64,-51.47:99
-chr1	2715367	rs56038961	C	T	199.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.45;MQ0=0;OQ=479.64;QD=15.99;SB=-264.20	GT:AD:DP:GL:GQ	0/1:12,18:27:-59.39,-8.14,-35.88:99
-chr1	2716724	rs17387572	C	G	92.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=2.10;MQ=58.95;MQ0=0;OQ=183.11;QD=8.32;SB=-57.73	GT:AD:DP:GL:GQ	0/1:14,8:19:-27.33,-5.74,-48.15:99
-chr1	2717498	rs10909879	G	A	568.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=638.90;QD=14.20;SB=-321.91	GT:AD:DP:GL:GQ	0/1:24,21:43:-80.13,-12.96,-77.89:99
-chr1	2717664	rs10909880	C	T	111.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=3.85;MQ=58.20;MQ0=0;OQ=901.98;QD=16.40;SB=-412.72	GT:AD:DP:GL:GQ	0/1:27,27:53:-109.45,-15.96,-95.84:99
-chr1	2718581	rs2290583	C	T	466.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.90;MQ0=0;OQ=858.25;QD=15.60;SB=-364.54	GT:AD:DP:GL:GQ	0/1:27,28:51:-104.48,-15.37,-82.61:99
-chr1	2720957	rs56242447	T	C	191.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=60.00;MQ0=0;OQ=720.09;QD=11.43;SB=-266.23	GT:AD:DP:GL:GQ	0/1:29,34:60:-93.39,-18.10,-112.64:99
-chr1	2725957	rs4648454	C	A	155.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=59.23;MQ0=0;OQ=2137.84;QD=35.63;SB=-968.57	GT:AD:DP:GL:GQ	1/1:0,60:60:-217.39,-18.07,-0.02:99
-chr1	2727346	rs4515734	C	T	401.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=1193.72;QD=37.30;SB=-333.34	GT:AD:DP:GL:GQ	1/1:0,32:32:-122.97,-9.64,-0.01:96.30
-chr1	2728125	rs11584658	C	T	220.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=58.92;MQ0=0;OQ=363.72;QD=9.33;SB=-203.89	GT:AD:DP:GL:GQ	0/1:25,14:38:-51.11,-11.46,-81.85:99
-chr1	2728509	.	C	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=2;HaplotypeScore=7.07;MQ=57.48;MQ0=0;OQ=153.44;QD=5.48;SB=38.15	GT:AD:DP:GL:GQ	0/1:17,11:22:-25.28,-6.65,-60.78:99
-chr1	2728983	rs12025517	T	C	254.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.46;MQ0=0;OQ=692.09;QD=16.10;SB=-320.61	GT:AD:DP:GL:GQ	0/1:17,25:42:-87.78,-15.29,-69.40:99
-chr1	2731560	rs897622	T	C	5.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=1.40;MQ=59.38;MQ0=0;OQ=1158.40;QD=31.31;SB=-281.53	GT:AD:DP:GL:GQ	1/1:0,37:35:-119.44,-10.55,-0.02:99
-chr1	2734276	rs56400103	G	A	253.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=949.71;QD=17.92;SB=-409.46	GT:AD:DP:GL:GQ	0/1:24,29:51:-113.64,-15.38,-67.18:99
-chr1	2734570	rs12747919	T	C	241.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=59.34;MQ0=0;OQ=778.48;QD=12.36;SB=-342.05	GT:AD:DP:GL:GQ	0/1:32,31:63:-100.12,-18.99,-128.39:99
-chr1	2734737	rs12125787	G	A	71.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.70;MQ=57.83;MQ0=0;OQ=2028.15;QD=37.56;SB=-957.98	GT:AD:DP:GL:GQ	1/1:0,54:53:-206.42,-15.97,-0.02:99
-chr1	2735743	rs4609377	C	T	266.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=3.54;MQ=58.76;MQ0=0;OQ=803.58;QD=14.35;SB=-286.83	GT:AD:DP:GL:GQ	0/1:31,25:54:-99.92,-16.28,-93.51:99
-chr1	2735926	rs1001620	G	C	451.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=58.61;MQ0=0;OQ=977.15;QD=12.69;SB=-354.56	GT:AD:DP:GL:GQ	0/1:46,31:77:-124.21,-23.21,-202.34:99
-chr1	2739474	rs10797389	G	A	308.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=60.00;MQ0=0;OQ=750.99;QD=15.65;SB=-309.79	GT:AD:DP:GL:GQ	0/1:23,25:47:-92.55,-14.16,-81.12:99
-chr1	2739576	rs4648481	G	T	368.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=60.00;MQ0=0;OQ=793.99;QD=14.70;SB=-305.02	GT:AD:DP:GL:GQ	0/1:26,28:52:-98.35,-15.67,-82.42:99
-chr1	2739781	rs4648482	T	C	14.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=4.29;MQ=58.44;MQ0=0;OQ=365.14;QD=8.69;SB=-69.92	GT:AD:DP:GL:GQ	0/1:24,18:40:-51.86,-12.06,-91.45:99
-chr1	2740297	rs1563471	C	T	85.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=5.94;MQ=59.22;MQ0=0;OQ=682.02;QD=11.56;SB=-286.79	GT:AD:DP:GL:GQ	0/1:33,26:55:-88.08,-16.60,-99.20:99
-chr1	2740756	rs12132067	G	A	288.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=59.52;MQ0=0;OQ=623.21;QD=12.98;SB=-250.12	GT:AD:DP:GL:GQ	0/1:27,21:48:-80.07,-14.46,-95.69:99
-chr1	2742125	rs7511879	A	G	408.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=59.68;MQ0=0;OQ=942.16;QD=16.24;SB=-438.99	GT:AD:DP:GL:GQ	0/1:24,34:55:-114.07,-16.57,-91.14:99
-chr1	2742553	rs10797390	C	T	146.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.59;MQ0=0;OQ=1057.36;QD=18.88;SB=-301.83	GT:AD:DP:GL:GQ	0/1:24,32:56:-125.89,-16.87,-83.67:99
-chr1	2743097	rs12031493	A	G	99.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=5.23;MQ=59.34;MQ0=0;OQ=647.93;QD=9.26;SB=-314.90	GT:AD:DP:GL:GQ	0/1:40,29:67:-88.27,-20.19,-156.45:99
-chr1	2743232	rs11803074	T	C	136.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=59.52;MQ0=0;OQ=450.58;QD=9.39;SB=-159.47	GT:AD:DP:GL:GQ	0/1:26,22:43:-61.31,-12.96,-94.61:99
-chr1	2743923	rs2377040	G	A	85.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.57;MQ0=0;OQ=1679.85;QD=39.07;SB=-699.34	GT:AD:DP:GL:GQ	1/1:0,43:43:-171.58,-12.96,-0.02:99
-chr1	2744048	rs6691019	A	G	253.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=599.61;QD=12.24;SB=-315.28	GT:AD:DP:GL:GQ	0/1:24,25:46:-77.11,-13.87,-86.95:99
-chr1	2744266	rs729045	A	G	494.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=550.14;QD=10.19;SB=-251.93	GT:AD:DP:GL:GQ	0/1:30,24:53:-74.27,-15.97,-120.98:99
-chr1	2744372	rs6680471	C	T	188.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=58.81;MQ0=0;OQ=743.73;QD=13.52;SB=-388.16	GT:AD:DP:GL:GQ	0/1:30,25:50:-92.73,-15.07,-87.39:99
-chr1	2744840	rs7541827	T	G	3.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=3.30;MQ=53.60;MQ0=0;OQ=317.87;QD=7.95;SB=-163.88	GT:AD:DP:GL:GQ	0/1:27,13:38:-46.52,-11.45,-85.79:99
-chr1	2745157	rs10909938	C	G	278.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.10;MQ0=0;OQ=946.24;QD=11.98;SB=-426.32	GT:AD:DP:GL:GQ	0/1:47,32:78:-121.44,-23.53,-202.08:99
-chr1	2745633	rs10909941	A	G	382.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=59.59;MQ0=0;OQ=1890.77;QD=33.76;SB=-793.15	GT:AD:DP:GL:GQ	1/1:0,56:54:-192.68,-16.26,-0.02:99
-chr1	2746148	rs4648382	C	T	75.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=4.95;MQ=58.25;MQ0=0;OQ=1103.18;QD=17.24;SB=-437.97	GT:AD:DP:GL:GQ	0/1:30,34:62:-132.29,-18.69,-91.91:99
-chr1	2746257	rs4648383	C	T	112.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=59.45;MQ0=0;OQ=1198.75;QD=17.63;SB=-573.37	GT:AD:DP:GL:GQ	0/1:33,35:67:-143.34,-20.18,-115.97:99
-chr1	2746481	rs4648384	C	A	147.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=2.23;MQ=58.55;MQ0=0;OQ=974.97;QD=15.98;SB=-482.87	GT:AD:DP:GL:GQ	0/1:29,32:59:-118.55,-17.77,-93.40:99
-chr1	2746667	rs7516014	G	T	183	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.66;MQ=60.00;MQ0=0;OQ=529.64;QD=10.81;SB=-238.43	GT:AD:DP:GL:GQ	0/1:28,20:47:-70.41,-14.16,-95.06:99
-chr1	2746749	rs7548023	T	G	93.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=3.08;MQ=57.92;MQ0=0;OQ=762.24;QD=14.12;SB=-346.84	GT:AD:DP:GL:GQ	0/1:27,27:54:-95.77,-16.26,-99.72:99
-chr1	2747056	rs4648495	T	C	0.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=4;HaplotypeScore=4.04;MQ=53.57;MQ0=0;OQ=334.06;QD=9.83;SB=-158.61	GT:AD:DP:GL:GQ	0/1:15,19:25:-44.23,-7.54,-43.47:99
-chr1	2747271	rs4648496	A	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=20.04;MQ=49.89;MQ0=0;OQ=70.38;QD=0.95;SB=-47.55	GT:AD:DP:GL:GQ	0/1:64,10:68:-30.81,-20.49,-219.78:99
-chr1	2747291	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=65;Dels=0.03;HRun=0;HaplotypeScore=32.13;MQ=46.89;MQ0=0;OQ=444.72;QD=6.84;SB=-168.12	GT:AD:DP:GL:GQ	0/1:44,19:62:-65.84,-18.08,-149.47:99
-chr1	2747315	.	A	T	0.07	PASS	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=12.70;MQ=47.25;MQ0=0;OQ=757.92;QD=13.53;SB=-390.15	GT:AD:DP:GL:GQ	0/1:29,27:49:-93.84,-14.77,-85.21:99
-chr1	2747334	rs36040910	C	G	1014.60	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.02;HRun=0;HaplotypeScore=10.13;MQ=46.42;MQ0=0;QD=19.14;SB=-531.73	GT:AD:DP:GL:GQ	0/1:24,28:52:-120.42,-15.67,-100.79:99
-chr1	2747338	.	G	C	826.30	SnpCluster	AC=1;AF=0.50;AN=2;DP=48;Dels=0.02;HRun=0;HaplotypeScore=9.97;MQ=47.26;MQ0=0;QD=17.21;SB=-358.43	GT:AD:DP:GL:GQ	0/1:23,24:47:-99.78,-13.86,-101.33:99
-chr1	2747339	.	A	T	752.39	SnpCluster	AC=1;AF=0.50;AN=2;DP=48;Dels=0.02;HRun=0;HaplotypeScore=3.00;MQ=47.26;MQ0=0;QD=15.67;SB=-313.68	GT:AD:DP:GL:GQ	0/1:23,24:47:-92.38,-13.86,-82.64:99
-chr1	2747369	.	A	T	3.22	PASS	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=5.95;MQ=49.16;MQ0=0;OQ=703.99;QD=14.37;SB=-261.27	GT:AD:DP:GL:GQ	0/1:25,24:47:-87.84,-14.16,-92.00:99
-chr1	2747375	rs61766530	T	A	10.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=7.95;MQ=48.99;MQ0=0;OQ=615.25;QD=13.37;SB=-274.62	GT:AD:DP:GL:GQ	0/1:24,22:43:-77.76,-12.95,-81.15:99
-chr1	2747387	rs34464542	A	T	0.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.05;HRun=0;HaplotypeScore=17.99;MQ=50.33;MQ0=0;OQ=475.32;QD=10.80;SB=-181.51	GT:AD:DP:GL:GQ	0/1:25,17:43:-63.16,-12.35,-94.24:99
-chr1	2747397	rs12739189	C	T	56.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=5.47;MQ=51.77;MQ0=0;OQ=606.36;QD=14.44;SB=-321.86	GT:AD:DP:GL:GQ	0/1:23,19:42:-76.58,-12.66,-74.78:99
-chr1	2747562	rs35401657	A	G	338.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=54.94;MQ0=0;OQ=916.49;QD=12.73;SB=-443.41	GT:AD:DP:GL:GQ	0/1:37,34:70:-119.52,-24.59,-154.08:99
-chr1	2747592	rs34262355	G	A	349.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=54.28;MQ0=0;OQ=1032.22;QD=12.74;SB=-451.44	GT:AD:DP:GL:GQ	0/1:45,35:78:-130.02,-23.51,-145.95:99
-chr1	2747610	rs34202711	A	G	414.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.97;MQ0=0;OQ=1011.04;QD=11.89;SB=-504.68	GT:AD:DP:GL:GQ	0/1:42,43:82:-129.10,-24.71,-172.46:99
-chr1	2747660	rs1456461	C	T	603.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.82;MQ0=0;OQ=891.16;QD=15.63;SB=-457.95	GT:AD:DP:GL:GQ	0/1:30,27:57:-109.57,-17.17,-111.30:99
-chr1	2748044	rs12740180	C	A	413.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=606.44;QD=10.83;SB=-262.28	GT:AD:DP:GL:GQ	0/1:33,23:54:-80.19,-16.26,-114.41:99
-chr1	2748753	rs2889541	G	A	337.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.41;MQ0=0;OQ=1139.69;QD=16.05;SB=-477.50	GT:AD:DP:GL:GQ	0/1:37,34:70:-138.35,-21.10,-115.20:99
-chr1	2749666	rs12037615	A	T	1.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=5;HaplotypeScore=1.16;MQ=59.20;MQ0=0;OQ=1128.99;QD=14.86;SB=-549.41	GT:AD:DP:GL:GQ	0/1:40,36:76:-139.07,-22.89,-148.90:99
-chr1	2749715	rs12047690	C	T	131.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.63;MQ0=0;OQ=816.13;QD=12.95;SB=-150.20	GT:AD:DP:GL:GQ	0/1:36,27:60:-102.99,-18.09,-107.52:99
-chr1	2751235	rs12049543	C	A	405.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.56;MQ0=0;OQ=1060.86;QD=12.63;SB=-512.22	GT:AD:DP:GL:GQ	0/1:47,37:84:-134.67,-25.30,-168.73:99
-chr1	2751390	rs1840738	T	C	158.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=56.95;MQ0=0;OQ=466.03;QD=9.14;SB=-238.28	GT:AD:DP:GL:GQ	0/1:29,21:47:-64.06,-14.17,-105.57:99
-chr1	2751392	rs1840737	T	C	150.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=56.89;MQ0=0;OQ=432.09;QD=8.64;SB=-211.35	GT:AD:DP:GL:GQ	0/1:30,20:46:-60.36,-13.87,-105.49:99
-chr1	2751468	rs1840736	C	T	225.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=58.99;MQ0=0;OQ=538.81;QD=11.71;SB=-284.82	GT:AD:DP:GL:GQ	0/1:28,18:46:-71.04,-13.87,-86.92:99
-chr1	2751723	rs1456460	G	T	356.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=57.19;MQ0=0;OQ=1157.64;QD=13.31;SB=-342.38	GT:AD:DP:GL:GQ	0/1:48,39:87:-145.25,-26.21,-162.75:99
-chr1	2753129	rs6424080	T	C	316.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.51;MQ0=0;OQ=966.99;QD=12.24;SB=-274.18	GT:AD:DP:GL:GQ	0/1:43,36:77:-123.19,-23.21,-165.41:99
-chr1	2753241	rs6424081	G	C	7.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=4;HaplotypeScore=2.76;MQ=58.85;MQ0=0;OQ=855.86;QD=17.47;SB=-443.74	GT:AD:DP:GL:GQ	0/1:25,24:49:-103.64,-14.77,-108.86:99
-chr1	2753928	rs10909950	G	C	275.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.98;MQ0=0;OQ=738.28;QD=13.67;SB=-369.83	GT:AD:DP:GL:GQ	0/1:27,27:50:-92.19,-15.07,-120.46:99
-chr1	2754032	rs7553697	T	C	122.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=50.90;MQ0=0;OQ=845.37;QD=27.27;SB=-371.38	GT:AD:DP:GL:GQ	1/1:0,31:28:-88.15,-8.45,-0.03:84.18
-chr1	2754183	rs6424082	A	G	8.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=5.05;MQ=58.51;MQ0=0;OQ=416.20;QD=9.46;SB=-192.43	GT:AD:DP:GL:GQ	0/1:23,21:40:-56.97,-12.06,-83.18:99
-chr1	2754298	rs6424083	C	G	173.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=55.35;MQ0=0;OQ=1296.80;QD=37.05;SB=-603.86	GT:AD:DP:GL:GQ	1/1:0,35:33:-133.29,-9.95,-0.02:99
-chr1	2754773	.	G	A	0.64	PASS	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=1;HaplotypeScore=3.22;MQ=60.00;MQ0=0;OQ=1109.61;QD=18.81;SB=-280.74	GT:AD:DP:GL:GQ	0/1:25,34:58:-131.72,-17.47,-86.47:99
-chr1	2754949	rs34133714	C	T	67.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=57.50;MQ0=0;OQ=577.42;QD=16.98;SB=-168.27	GT:AD:DP:GL:GQ	0/1:16,18:34:-71.28,-10.25,-51.84:99
-chr1	2755031	rs34352177	T	C	19.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=7.41;MQ=59.06;MQ0=0;OQ=899.29;QD=13.03;SB=-455.95	GT:AD:DP:GL:GQ	0/1:36,31:67:-116.13,-22.92,-145.73:99
-chr1	2755403	rs11806141	T	G	18.81	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=6.77;MQ=51.89;MQ0=9;QD=0.27;SB=74.23	GT:AD:DP:GL:GQ	0/1:49,20:51:-20.52,-15.36,-159.70:51.59
-chr1	2755508	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=79;Dels=0.06;HRun=2;HaplotypeScore=38.09;MQ=49.34;MQ0=4;OQ=65.07;QD=0.82;SB=71.26	GT:AD:DP:GL:GQ	0/1:58,15:62:-27.57,-17.78,-196.95:97.90
-chr1	2755529	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=65.45;MQ=46.51;MQ0=7;OQ=513.73;QD=7.04;SB=-185.79	GT:AD:DP:GL:GQ	0/1:43,30:51:-70.02,-15.37,-107.03:99
-chr1	2755532	.	A	G	42.46	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=67.89;MQ=46.23;MQ0=7;QD=0.57;SB=41.14	GT:AD:DP:GL:GQ	0/1:61,13:50:-22.60,-15.07,-170.16:75.29
-chr1	2755579	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=21.20;MQ=45.33;MQ0=9;OQ=157.48;QD=2.02;SB=-23.25	GT:AD:DP:GL:GQ	0/1:60,12:47:-33.22,-14.19,-119.56:99
-chr1	2755596	rs11806928	A	G	0.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=12.62;MQ=45.10;MQ0=9;OQ=205.66;QD=2.78;SB=-15.21	GT:AD:DP:GL:GQ	0/1:58,16:54:-40.13,-16.28,-162.81:99
-chr1	2755612	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=11.17;MQ=46.38;MQ0=5;OQ=126.58;QD=1.73;SB=14.62	GT:AD:DP:GL:GQ	0/1:63,10:57:-33.13,-17.19,-158.30:99
-chr1	2755632	rs10909952	C	T	0.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=10.73;MQ=46.85;MQ0=3;OQ=64.17;QD=0.87;SB=26.06	GT:AD:DP:GL:GQ	0/1:61,13:47:-23.87,-14.17,-131.74:97
-chr1	2755643	.	C	T	0.06	PASS	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=7.11;MQ=46.66;MQ0=2;OQ=370.42;QD=5.22;SB=-83.91	GT:AD:DP:GL:GQ	0/1:46,20:49:-55.11,-14.78,-108.17:99
-chr1	2755657	rs61763677	G	T	0.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=8.88;MQ=44.97;MQ0=5;OQ=282.63;QD=3.29;SB=-9.61	GT:AD:DP:GL:GQ	0/1:69,17:72:-53.24,-21.69,-193.61:99
-chr1	2755674	rs61763678	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=23.01;MQ=44.47;MQ0=7;OQ=292.56;QD=2.76;SB=-24.23	GT:AD:DP:GL:GQ	0/1:76,27:79:-56.37,-23.83,-203.58:99
-chr1	2755706	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=0;HaplotypeScore=46.46;MQ=43.46;MQ0=6;OQ=100.65;QD=1.01;SB=48.33	GT:AD:DP:GL:GQ	0/1:73,19:68:-33.86,-20.51,-216.35:99
-chr1	2755733	rs10909953	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=0;HaplotypeScore=134.56;MQ=44.60;MQ0=11;OQ=218.03;QD=1.83;SB=-68.77	GT:AD:DP:GL:GQ	0/1:91,18:82:-72.98,-47.89,-237.50:99
-chr1	2755738	rs10909954	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.00;HRun=0;HaplotypeScore=94.54;MQ=44.07;MQ0=12;OQ=119.63;QD=1.01;SB=15.66	GT:AD:DP:GL:GQ	0/1:86,29:80:-42.04,-26.79,-256.64:99
-chr1	2755753	.	G	A	11.77	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=126;Dels=0.00;HRun=1;HaplotypeScore=33.32;MQ=44.33;MQ0=10;QD=0.09;SB=66.29	GT:AD:DP:GL:GQ	0/1:116,10:95:-33.05,-28.62,-308.21:44.31
-chr1	2755755	rs57067996	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=130;Dels=0.00;HRun=1;HaplotypeScore=39.46;MQ=44.65;MQ0=10;OQ=1208.64;QD=9.30;SB=-349.24	GT:AD:DP:GL:GQ	0/1:72,52:91:-151.57,-27.42,-186.87:99
-chr1	2755787	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=209;Dels=0.00;HRun=0;HaplotypeScore=9.86;MQ=44.22;MQ0=18;OQ=212.29;QD=1.02;SB=84.79	GT:AD:DP:GL:GQ	0/1:175,28:147:-68.83,-44.32,-479.03:99
-chr1	2755816	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=1;HaplotypeScore=62.94;MQ=43.89;MQ0=23;OQ=172.99;QD=0.80;SB=63.05	GT:AD:DP:GL:GQ	0/1:192,24:159:-68.50,-47.92,-487.91:99
-chr1	2755844	rs4991850	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=164;Dels=0.00;HRun=0;HaplotypeScore=53.96;MQ=43.72;MQ0=16;OQ=1135.99;QD=6.93;SB=-394.17	GT:AD:DP:GL:GQ	0/1:112,52:121:-153.35,-36.47,-275.01:99
-chr1	2755847	rs57868894	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=161;Dels=0.00;HRun=1;HaplotypeScore=64.38;MQ=43.84;MQ0=16;OQ=859.67;QD=5.34;SB=-128.73	GT:AD:DP:GL:GQ	0/1:103,58:122:-126.01,-36.76,-296.17:99
-chr1	2755864	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=0;HaplotypeScore=32.56;MQ=44.46;MQ0=14;OQ=96.62;QD=0.70;SB=30.17	GT:AD:DP:GL:GQ	0/1:117,20:102:-43.73,-30.78,-282.87:99
-chr1	2755889	rs4991849	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=114;Dels=0.04;HRun=2;HaplotypeScore=40.28;MQ=47.08;MQ0=9;OQ=2321.13;QD=20.36;SB=-1120.12	GT:AD:DP:GL:GQ	0/1:18,92:93:-262.51,-27.11,-65.29:99
-chr1	2755910	rs12728224	T	G	16.56	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=1;HaplotypeScore=2.13;MQ=49.38;MQ0=5;QD=0.17;SB=88.35	GT:AD:DP:GL:GQ	0/1:84,11:79:-28.73,-23.80,-253.95:49.30
-chr1	2755924	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=18.40;MQ=49.90;MQ0=6;OQ=1394.92;QD=15.16;SB=-476.13	GT:AD:DP:GL:GQ	0/1:39,53:66:-162.68,-19.90,-75.57:99
-chr1	2755992	.	G	A	33.66	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=19.55;MQ=45.20;MQ0=8;QD=0.40;SB=27.48	GT:AD:DP:GL:GQ	0/1:73,12:61:-25.05,-18.40,-176.14:66.50
-chr1	2756013	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=17.90;MQ=45.32;MQ0=5;OQ=157.50;QD=2.67;SB=-33.78	GT:AD:DP:GL:GQ	0/1:38,21:37:-30.19,-11.15,-106.30:99
-chr1	2756025	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=4.66;MQ=45.60;MQ0=4;OQ=63.13;QD=1.15;SB=26.12	GT:AD:DP:GL:GQ	0/1:45,10:38:-21.07,-11.48,-129.01:95.97
-chr1	2756051	rs4992290	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=36.34;MQ=44.26;MQ0=6;OQ=205.91;QD=3.38;SB=35.13	GT:AD:DP:GL:GQ	0/1:37,24:36:-34.74,-10.86,-87.18:99
-chr1	2756088	rs6676347	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=50.22;MQ=41.73;MQ0=14;OQ=1315.11;QD=15.29;SB=-568.14	GT:AD:DP:GL:GQ	0/1:37,49:48:-149.26,-14.46,-35.10:99
-chr1	2756101	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=1;HaplotypeScore=21.36;MQ=40.87;MQ0=15;OQ=73.71;QD=0.88;SB=47.17	GT:AD:DP:GL:GQ	0/1:64,20:51:-26.02,-15.36,-158.57:99
-chr1	2756151	rs4648513	T	C	97.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=4.14;MQ=50.77;MQ0=9;OQ=1380.54;QD=20.92;SB=-651.39	GT:AD:DP:GL:GQ	1/1:9,57:48:-150.01,-14.48,-8.38:61.01
-chr1	2756174	rs59048447	G	A	70.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=5.41;MQ=56.28;MQ0=2;OQ=675.24;QD=12.74;SB=-328.31	GT:AD:DP:GL:GQ	0/1:26,27:46:-84.67,-13.86,-86.53:99
-chr1	2756831	rs4648515	C	T	238.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.65;MQ=59.11;MQ0=0;OQ=2661.31;QD=39.14;SB=-1337.11	GT:AD:DP:GL:GQ	1/1:1,67:68:-272.30,-20.49,-2.59:99
-chr1	2757061	rs4648518	A	G	438.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1894.09;QD=32.66;SB=-719.10	GT:AD:DP:GL:GQ	1/1:0,58:55:-193.02,-16.57,-0.02:99
-chr1	2757563	rs4648519	C	T	617.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=2063.43;QD=38.21;SB=-1058.93	GT:AD:DP:GL:GQ	1/1:0,54:53:-209.94,-15.97,-0.02:99
-chr1	2758482	.	C	T	0.54	PASS	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=50.17;MQ0=3;OQ=191.27;QD=4.25;SB=-120.51	GT:AD:DP:GL:GQ	0/1:31,14:38:-33.86,-11.45,-100.08:99
-chr1	2758751	.	T	G	48.69	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=34.31;MQ0=7;QD=1.62;SB=-11.91	GT:AD:DP:GL:GQ	0/1:21,9:22:-14.78,-6.63,-62.96:81.53
-chr1	2758819	.	A	G	182.25	PASS	AC=2;AF=1.00;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=42.84;MQ0=2;OQ=868.67;QD=27.15;SB=-395.30	GT:AD:DP:GL:GQ	1/1:1,31:28:-90.48,-8.45,-0.03:84.20
-chr1	2758861	.	T	C	30.75	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=1;HaplotypeScore=1.14;MQ=44.85;MQ0=1;QD=0.90;SB=29.12	GT:AD:DP:GL:GQ	0/1:26,7:26:-14.19,-7.84,-86.43:63.58
-chr1	2758882	.	G	A	6.14	PASS	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=4.04;MQ=35.37;MQ0=5;OQ=748.79;QD=17.41;SB=-255.79	GT:AD:DP:GL:GQ	0/1:14,29:29:-86.90,-8.74,-21.14:99
-chr1	2758933	.	T	C	5.05	PASS	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=4.40;MQ=30.24;MQ0=6;OQ=270.13;QD=7.50;SB=-156.34	GT:AD:DP:GL:GQ	0/1:9,26:16:-35.12,-4.83,-17.51:99
-chr1	2758959	.	T	G	27.66	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=27.02;MQ0=8;QD=0.92;SB=-23.52	GT:AD:DP:GL:GQ	0/1:24,6:11:-9.36,-3.32,-25.67:60.48
-chr1	2759011	.	T	G	0.06	PASS	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=3.83;MQ=18.26;MQ0=23;OQ=314.04;QD=4.42;SB=-69.87	GT:AD:DP:GL:GQ	0/1:37,34:26:-42.52,-7.83,-50.68:99
-chr1	2759038	.	G	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=15.13;MQ=25.49;MQ0=29;OQ=89.07;QD=0.97;SB=-9.29	GT:AD:DP:GL:GQ	0/1:85,7:35:-22.74,-10.55,-90.79:99
-chr1	2759090	.	G	T	15.10	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=11.61;MQ=28.51;MQ0=10;QD=0.35;SB=-6.99	GT:AD:DP:GL:GQ	0/1:32,11:16:-9.61,-4.83,-35.57:47.80
-chr1	2759130	rs61763686	T	C	37.28	LowQual	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.78;MQ0=1;QD=12.43;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,3:2:-7.14,-0.60,-0.00:6.02
-chr1	2759142	.	G	A	1.53	PASS	AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=-0.12;MQ=18.78;MQ0=2;OQ=80.16;QD=13.36;SB=-10.00	GT:AD:DP:GL:GQ	0/1:3,3:4:-12.50,-1.21,-3.10:18.91
-chr1	2759167	.	G	T	2.82	PASS	AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=26.71;MQ0=4;OQ=151.71;QD=6.90;SB=-6.99	GT:AD:DP:GL:GQ	0/1:16,6:14:-22.67,-4.22,-28.76:99
-chr1	2759193	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=15.10;MQ=26.07;MQ0=10;OQ=142.00;QD=2.90;SB=-61.29	GT:AD:DP:GL:GQ	0/1:38,11:32:-27.13,-9.65,-83.88:99
-chr1	2759219	.	G	T	0.58	PASS	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.57;MQ=27.42;MQ0=13;OQ=233.66;QD=3.03;SB=-10.31	GT:AD:DP:GL:GQ	0/1:59,18:48:-41.11,-14.46,-126.09:99
-chr1	2759237	rs10909961	G	A	0.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=9.56;MQ=30.14;MQ0=15;OQ=68.31;QD=0.77;SB=29.11	GT:AD:DP:GL:GQ	0/1:82,7:55:-26.69,-16.57,-172.16:99
-chr1	2759271	.	G	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=31.60;MQ0=17;OQ=103.26;QD=1.09;SB=14.07	GT:AD:DP:GL:GQ	0/1:79,16:53:-29.57,-15.96,-157.88:99
-chr1	2759402	rs10752737	G	A	706.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.81;MQ0=0;OQ=3330.93;QD=38.29;SB=-1475.63	GT:AD:DP:GL:GQ	1/1:0,87:84:-332.09,-25.31,-0.03:99
-chr1	2759793	rs6665646	C	T	285.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.67;MQ0=0;OQ=1210.11;QD=17.54;SB=-511.14	GT:AD:DP:GL:GQ	0/1:33,36:69:-145.09,-20.79,-106.44:99
-chr1	2760042	rs6679343	A	T	0.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=6;HaplotypeScore=1.76;MQ=59.01;MQ0=0;OQ=2240.29;QD=33.94;SB=-793.89	GT:AD:DP:GL:GQ	1/1:0,66:63:-227.64,-18.99,-0.03:99
-chr1	2761186	.	C	G	0.63	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=4;HaplotypeScore=1.71;MQ=59.37;MQ0=0;OQ=541.38;QD=12.30;SB=-216.32	GT:AD:DP:GL:GQ	0/1:26,18:41:-69.78,-12.36,-101.99:99
-chr1	2761364	rs12743952	G	A	204.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.30;MQ=59.65;MQ0=0;OQ=611.70;QD=11.33;SB=-279.20	GT:AD:DP:GL:GQ	0/1:32,22:50:-79.52,-15.07,-100.94:99
-chr1	2761375	rs12743965	G	A	240.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=59.65;MQ0=0;OQ=726.42;QD=13.45;SB=-307.80	GT:AD:DP:GL:GQ	0/1:31,23:53:-91.89,-15.96,-108.39:99
-chr1	2761483	rs34161193	G	A	219.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=58.78;MQ0=0;OQ=505.10;QD=13.29;SB=-258.15	GT:AD:DP:GL:GQ	0/1:20,17:37:-64.94,-11.15,-70.90:99
-chr1	2761516	rs35134901	G	C	42.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=0.79;MQ=58.89;MQ0=0;OQ=485.26;QD=11.55;SB=-253.13	GT:AD:DP:GL:GQ	0/1:25,17:38:-63.28,-11.47,-90.46:99
-chr1	2761538	rs35767265	C	A	434.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=663.44;QD=13.54;SB=-277.32	GT:AD:DP:GL:GQ	0/1:26,23:47:-83.79,-14.16,-83.28:99
-chr1	2761907	rs35313744	A	C	3.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=4;HaplotypeScore=1.29;MQ=59.00;MQ0=0;OQ=545.25;QD=12.98;SB=-173.29	GT:AD:DP:GL:GQ	0/1:20,22:40:-69.86,-12.05,-71.88:99
-chr1	2762054	rs6694484	G	A	356.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.79;MQ0=0;OQ=715.90;QD=13.26;SB=-315.29	GT:AD:DP:GL:GQ	0/1:29,25:51:-90.24,-15.37,-99.20:99
-chr1	2762207	rs6675221	C	A	216.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=59.45;MQ0=0;OQ=527.73;QD=12.57;SB=-249.28	GT:AD:DP:GL:GQ	0/1:21,20:39:-67.80,-11.75,-71.40:99
-chr1	2762658	rs12727394	T	C	169.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=60.00;MQ0=0;OQ=383.94;QD=11.63;SB=-133.29	GT:AD:DP:GL:GQ	0/1:17,15:29:-50.42,-8.74,-57.72:99
-chr1	2763115	rs12729596	C	T	224.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.16;MQ0=0;OQ=609.66;QD=12.19;SB=-271.12	GT:AD:DP:GL:GQ	0/1:30,20:50:-79.31,-15.06,-107.78:99
-chr1	2763349	rs6660680	C	G	206.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=2.16;MQ=59.65;MQ0=0;OQ=809.85;QD=15.28;SB=-407.93	GT:AD:DP:GL:GQ	0/1:28,25:49:-99.04,-14.78,-104.68:99
-chr1	2763426	rs6660759	C	T	169.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.89;MQ0=0;OQ=778.20;QD=18.53;SB=-350.90	GT:AD:DP:GL:GQ	0/1:15,27:38:-92.57,-11.46,-40.16:99
-chr1	2763555	rs6674204	A	G	358.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=1244.75;QD=33.64;SB=-466.51	GT:AD:DP:GL:GQ	1/1:0,37:36:-128.07,-10.85,-0.01:99
-chr1	2763913	rs7529000	A	G	539.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=590.27;QD=13.73;SB=-268.99	GT:AD:DP:GL:GQ	0/1:19,24:38:-73.77,-11.46,-59.16:99
-chr1	2765576	.	A	G	299.17	PASS	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.30;MQ0=1;OQ=708.87;QD=14.18;SB=-362.49	GT:AD:DP:GL:GQ	0/1:25,25:46:-88.03,-13.85,-86.85:99
-chr1	2765703	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=40;Dels=0.03;HRun=1;HaplotypeScore=65.65;MQ=34.06;MQ0=6;OQ=224.51;QD=5.61;SB=-69.85	GT:AD:DP:GL:GQ	0/1:16,18:20:-31.76,-6.02,-57.23:99
-chr1	2765716	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=2;HaplotypeScore=45.86;MQ=31.67;MQ0=6;OQ=473.81;QD=11.56;SB=-227.60	GT:AD:DP:GL:GQ	0/1:7,34:22:-57.29,-6.63,-24.20:99
-chr1	2765718	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=49.51;MQ=31.73;MQ0=6;OQ=139.31;QD=3.48;SB=14.07	GT:AD:DP:GL:GQ	0/1:34,6:18:-22.64,-5.42,-43.65:99
-chr1	2765729	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=2;HaplotypeScore=101.24;MQ=39.70;MQ0=5;OQ=348.53;QD=8.30;SB=-73.03	GT:AD:DP:GL:GQ	0/1:25,16:29:-48.99,-10.85,-57.39:99
-chr1	2765740	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=21.54;MQ=47.97;MQ0=0;OQ=288.34;QD=9.94;SB=-104.59	GT:AD:DP:GL:GQ	0/1:16,13:26:-39.95,-7.84,-58.99:99
-chr1	2765813	.	A	G	11.29	PASS	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=3.58;MQ=51.84;MQ0=0;OQ=780.70;QD=15.61;SB=-390.27	GT:AD:DP:GL:GQ	0/1:21,28:48:-95.81,-14.46,-83.37:99
-chr1	2765894	.	A	C	0.06	PASS	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=11.31;MQ=45.14;MQ0=0;OQ=337.42;QD=9.37;SB=-140.89	GT:AD:DP:GL:GQ	0/1:21,15:33:-46.96,-9.94,-71.34:99
-chr1	2765910	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=53;Dels=0.02;HRun=1;HaplotypeScore=33.31;MQ=38.51;MQ0=0;OQ=588.92;QD=11.11;SB=23.11	GT:AD:DP:GL:GQ	0/1:28,24:46:-75.73,-13.55,-102.75:99
-chr1	2765957	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=2;HaplotypeScore=176.91;MQ=27.98;MQ0=17;OQ=352.77;QD=3.12;SB=2.45	GT:AD:DP:GL:GQ	0/1:85,28:53:-54.54,-15.98,-142.28:99
-chr1	2765968	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=1;HaplotypeScore=118.45;MQ=28.99;MQ0=17;OQ=151.04;QD=1.26;SB=-15.93	GT:AD:DP:GL:GQ	0/1:95,25:59:-36.17,-17.78,-173.10:99
-chr1	2765995	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=52.19;MQ=34.85;MQ0=7;OQ=128.24;QD=1.78;SB=-51.69	GT:AD:DP:GL:GQ	0/1:61,11:54:-32.38,-16.27,-203.82:99
-chr1	2765996	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=51.72;MQ=35.05;MQ0=7;OQ=180.10;QD=2.54;SB=-41.96	GT:AD:DP:GL:GQ	0/1:59,12:54:-37.57,-16.27,-158.22:99
-chr1	2766902	rs34376289	C	T	393.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.48;MQ0=0;OQ=811.67;QD=17.64;SB=-367.51	GT:AD:DP:GL:GQ	0/1:20,26:45:-98.01,-13.56,-71.88:99
-chr1	2768626	rs10909992	C	T	335.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.57;MQ0=0;OQ=811.02;QD=12.48;SB=-416.42	GT:AD:DP:GL:GQ	0/1:35,29:62:-103.08,-18.70,-112.11:99
-chr1	2768752	rs12409918	A	C	74.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.55;MQ=59.57;MQ0=0;OQ=965.61;QD=17.88;SB=-402.66	GT:AD:DP:GL:GQ	0/1:20,34:50:-114.91,-15.06,-60.43:99
-chr1	2768903	rs12409348	T	C	172.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.28;MQ=60.00;MQ0=0;OQ=398.89;QD=10.50;SB=-78.75	GT:AD:DP:GL:GQ	0/1:20,17:35:-53.71,-10.54,-80.33:99
-chr1	2769019	rs10909995	C	G	17.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=58.48;MQ0=0;OQ=1462.05;QD=36.55;SB=-653.43	GT:AD:DP:GL:GQ	1/1:0,40:35:-149.81,-10.55,-0.02:99
-chr1	2769620	rs28600853	C	T	67.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=57.53;MQ0=0;OQ=1091.29;QD=28.72;SB=-540.63	GT:AD:DP:GL:GQ	0/1:4,33:36:-123.26,-10.85,-13.62:27.66
-chr1	2769674	rs4648542	G	A	90.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=3.80;MQ=51.80;MQ0=1;OQ=271.91;QD=9.71;SB=-148.61	GT:AD:DP:GL:GQ	0/1:13,15:21:-36.80,-6.33,-39.42:99
-chr1	2769679	rs28367217	C	G	36.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=51.80;MQ0=1;OQ=209.26;QD=8.37;SB=2.04	GT:AD:DP:GL:GQ	0/1:15,10:18:-29.64,-5.43,-44.14:99
-chr1	2769692	rs28478242	A	G	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=4;HaplotypeScore=0.82;MQ=53.88;MQ0=1;OQ=89.42;QD=4.26;SB=5.05	GT:AD:DP:GL:GQ	0/1:15,6:17:-17.35,-5.12,-46.13:99
-chr1	2769752	rs7542593	T	C	75.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=56.77;MQ0=0;OQ=136.56;QD=6.21;SB=-67.76	GT:AD:DP:GL:GQ	0/1:10,12:17:-22.07,-5.13,-38.52:99
-chr1	2769805	rs4648543	T	G	0.02	FDRtranche1.00to2.00	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=4;HaplotypeScore=2.68;MQ=55.12;MQ0=0;OQ=754.89;QD=29.03;SB=-110.69	GT:AD:DP:GL:GQ	1/1:0,26:23:-79.08,-6.93,-0.01:69.18
-chr1	2770855	rs729178	T	G	35.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=57.97;MQ0=0;OQ=332.17;QD=14.44;SB=-62.09	GT:AD:DP:GL:GQ	0/1:7,16:18:-41.92,-5.42,-18.71:99
-chr1	2770856	rs729177	T	C	47.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=57.97;MQ0=0;OQ=319.36;QD=13.89;SB=-53.86	GT:AD:DP:GL:GQ	0/1:7,16:20:-41.25,-6.03,-26.63:99
-chr1	2772453	rs12119163	G	A	585.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1388.32;QD=37.52;SB=-625.84	GT:AD:DP:GL:GQ	1/1:0,37:36:-142.43,-10.85,-0.01:99
-chr1	2772603	rs7551868	T	C	19.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=3.77;MQ=58.92;MQ0=0;OQ=1140.34;QD=29.24;SB=-578.97	GT:AD:DP:GL:GQ	1/1:0,39:37:-117.66,-11.16,-0.04:99
-chr1	2772900	rs4648402	T	C	156.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.00;MQ0=0;OQ=994.66;QD=28.42;SB=-468.49	GT:AD:DP:GL:GQ	1/1:0,35:33:-103.09,-9.96,-0.03:99
-chr1	2773675	rs12752112	G	C	9.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=58.95;MQ0=0;OQ=859.11;QD=39.05;SB=-325.45	GT:AD:DP:GL:GQ	1/1:0,22:21:-89.50,-6.33,-0.01:63.21
-chr1	2776554	rs1563470	T	C	23.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.69;MQ=60.00;MQ0=0;OQ=1838.24;QD=33.42;SB=-908.03	GT:AD:DP:GL:GQ	1/1:0,55:52:-187.42,-15.66,-0.02:99
-chr1	2777013	rs897616	C	G	7.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=3;HaplotypeScore=1.07;MQ=58.26;MQ0=0;OQ=1193.61;QD=34.10;SB=-446.20	GT:AD:DP:GL:GQ	1/1:0,35:30:-122.96,-9.05,-0.02:90.29
-chr1	2777567	rs897620	C	G	317.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1920.95;QD=42.69;SB=-716.92	GT:AD:DP:GL:GQ	1/1:0,45:44:-195.69,-13.26,-0.01:99
-chr1	2778573	rs56273341	A	G	89.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.42;MQ0=0;OQ=1164.73;QD=29.12;SB=-590.57	GT:AD:DP:GL:GQ	1/1:0,40:37:-120.09,-11.16,-0.03:99
-chr1	2779035	rs12569164	T	C	119.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=49.75;MQ0=0;OQ=1623.80;QD=28.49;SB=-755.66	GT:AD:DP:GL:GQ	1/1:0,57:53:-166.02,-15.99,-0.06:99
-chr1	2779347	.	T	C	140.90	Indel	AC=1;AF=0.50;AN=2;DP=70;Dels=0.03;HRun=0;HaplotypeScore=53.64;MQ=31.59;MQ0=1;QD=2.01;SB=-93.61	GT:AD:DP:GL:GQ	0/1:59,9:55:-33.34,-15.96,-177.98:99
-chr1	2779357	rs55740077	T	C	137.39	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=61.84;MQ=29.83;MQ0=1;QD=1.99;SB=-25.89	GT:AD:DP:GL:GQ	0/1:28,41:15:-21.54,-4.52,-37.07:99
-chr1	2779361	rs55927204	T	C	380.25	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=52.10;MQ=29.71;MQ0=1;QD=5.51;SB=-184.74	GT:AD:DP:GL:GQ	0/1:7,62:16:-46.13,-4.82,-12.60:77.76
-chr1	2779365	.	T	C	528.78	SnpCluster	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=50.77;MQ=30.92;MQ0=1;QD=7.24;SB=-289.59	GT:AD:DP:GL:GQ	0/1:6,67:20:-62.19,-6.02,-12.60:65.71
-chr1	2779369	.	T	C	809.75	SnpCluster	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=40.71;MQ=31.11;MQ0=1;QD=10.52;SB=-337.36	GT:AD:DP:GL:GQ	0/1:9,68:31:-93.60,-9.34,-19.91:99
-chr1	2779373	rs56012041	T	C	260.44	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=37.08;MQ=32.24;MQ0=1;QD=3.38;SB=-116.63	GT:AD:DP:GL:GQ	0/1:28,49:21:-35.65,-6.33,-44.87:99
-chr1	2779421	rs5023660	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.02;HRun=3;HaplotypeScore=23.36;MQ=40.90;MQ0=1;OQ=1397.64;QD=21.18;SB=-647.72	GT:AD:DP:GL:GQ	0/1:24,41:55:-159.31,-16.27,-52.10:99
-chr1	2779423	rs56155638	T	C	0.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.02;HRun=0;HaplotypeScore=20.03;MQ=40.90;MQ0=1;OQ=1243.01;QD=18.83;SB=-541.02	GT:AD:DP:GL:GQ	0/1:23,42:56:-144.15,-16.57,-59.53:99
-chr1	2779766	rs2124661	C	G	42.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=49.71;MQ0=0;OQ=2767.03;QD=41.92;SB=-1222.51	GT:AD:DP:GL:GQ	1/1:0,66:63:-280.30,-18.98,-0.02:99
-chr1	2779832	rs2168531	C	T	260.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.21;MQ=50.55;MQ0=0;OQ=2553.68;QD=38.69;SB=-1139.52	GT:AD:DP:GL:GQ	1/1:0,66:66:-258.98,-19.89,-0.03:99
-chr1	2780005	.	G	C	32.52	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=15.63;MQ=58.92;MQ0=0;QD=0.76;SB=44.18	GT:AD:DP:GL:GQ	0/1:33,10:29:-15.29,-8.76,-103.60:65.36
-chr1	2781003	rs10910023	C	T	121.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.11;MQ0=0;OQ=1930.80;QD=37.13;SB=-708.95	GT:AD:DP:GL:GQ	1/1:0,52:49:-196.68,-14.76,-0.01:99
-chr1	2781813	rs12131393	C	T	195.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=701.85;QD=13.76;SB=-265.19	GT:AD:DP:GL:GQ	0/1:28,23:44:-86.73,-13.26,-75.43:99
-chr1	2781975	rs12131450	C	T	0.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=915.40;QD=20.80;SB=-418.48	GT:AD:DP:GL:GQ	0/1:17,27:44:-108.08,-13.26,-61.20:99
-chr1	2784004	rs10909791	C	T	0.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=18.57;MQ=55.20;MQ0=0;OQ=554.87;QD=8.95;SB=-141.63	GT:AD:DP:GL:GQ	0/1:38,21:51:-74.16,-15.38,-99.65:99
-chr1	2784009	rs6673503	T	C	0.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=15.72;MQ=55.44;MQ0=0;OQ=828.36;QD=14.04;SB=-284.66	GT:AD:DP:GL:GQ	0/1:19,40:49:-100.91,-14.79,-59.84:99
-chr1	2784113	rs6658584	G	A	324.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.61;MQ0=0;OQ=573.55;QD=11.95;SB=-252.51	GT:AD:DP:GL:GQ	0/1:29,19:42:-73.29,-12.65,-86.05:99
-chr1	2784397	rs6668620	C	T	83.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=58.97;MQ0=0;OQ=989.63;QD=21.99;SB=-434.99	GT:AD:DP:GL:GQ	0/1:12,32:41:-114.60,-12.35,-43.77:99
-chr1	2784411	rs10909793	G	T	285.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=987.49;QD=22.44;SB=-485.97	GT:AD:DP:GL:GQ	0/1:11,33:43:-114.99,-12.95,-39.80:99
-chr1	2785397	rs6679954	T	C	177.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=1.43;MQ=57.39;MQ0=0;OQ=162.89;QD=9.05;SB=-99.99	GT:AD:DP:GL:GQ	0/1:9,8:15:-24.09,-4.52,-32.21:99
-chr1	2785861	rs10797340	G	C	110.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=2067.39;QD=39.01;SB=-1035.13	GT:AD:DP:GL:GQ	1/1:0,53:49:-210.35,-14.77,-0.02:99
-chr1	2786415	rs10752722	A	G	154.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=59.07;MQ0=0;OQ=1517.85;QD=30.36;SB=-724.72	GT:AD:DP:GL:GQ	1/1:0,50:49:-155.42,-14.78,-0.05:99
-chr1	2786479	rs4648406	T	C	92.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.34;MQ0=0;OQ=883.04;QD=25.23;SB=-376.38	GT:AD:DP:GL:GQ	1/1:0,35:29:-91.92,-8.75,-0.03:87.18
-chr1	2787126	rs6424057	T	G	92.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=59.46;MQ0=0;OQ=1311.97;QD=30.51;SB=-464.84	GT:AD:DP:GL:GQ	1/1:0,43:41:-134.82,-12.36,-0.04:99
-chr1	2787716	rs10797342	C	T	575.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=717.10;QD=14.63;SB=-344.49	GT:AD:DP:GL:GQ	0/1:27,22:49:-89.77,-14.77,-84.62:99
-chr1	2788065	rs2124662	G	C	9.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=5.21;MQ=57.80;MQ0=0;OQ=437.50;QD=13.67;SB=-215.17	GT:AD:DP:GL:GQ	0/1:15,17:26:-54.88,-7.85,-48.57:99
-chr1	2788136	rs1563472	G	A	261.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.38;MQ0=0;OQ=469.47;QD=12.69;SB=-131.12	GT:AD:DP:GL:GQ	0/1:19,18:28:-58.68,-8.45,-41.51:99
-chr1	2788195	rs1563473	T	G	178.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.69;MQ=57.45;MQ0=0;OQ=577.74;QD=12.56;SB=-216.84	GT:AD:DP:GL:GQ	0/1:19,27:43:-74.02,-12.96,-66.19:99
-chr1	2788317	rs1563474	G	A	94.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=3.84;MQ=58.45;MQ0=0;OQ=661.75;QD=14.71;SB=-298.81	GT:AD:DP:GL:GQ	0/1:21,24:41:-81.83,-12.37,-60.24:99
-chr1	2788572	rs4373707	T	C	44.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=5.22;MQ=58.97;MQ0=0;OQ=526.05;QD=11.69;SB=-185.63	GT:AD:DP:GL:GQ	0/1:22,23:42:-68.55,-12.66,-84.21:99
-chr1	2788907	rs2377038	A	G	118.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.81;MQ=59.09;MQ0=0;OQ=482.56;QD=10.49;SB=-194.43	GT:AD:DP:GL:GQ	0/1:24,21:41:-63.90,-12.36,-79.61:99
-chr1	2789039	rs729965	G	C	149.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=2442.19;QD=42.11;SB=-956.71	GT:AD:DP:GL:GQ	1/1:0,58:57:-247.82,-17.18,-0.02:99
-chr1	2789321	rs897629	T	C	12.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=3.68;MQ=58.87;MQ0=0;OQ=1220.90;QD=29.78;SB=-560.89	GT:AD:DP:GL:GQ	1/1:0,40:39:-125.71,-11.76,-0.03:99
-chr1	2789340	rs11580768	C	T	285.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.21;MQ=58.92;MQ0=0;OQ=699.84;QD=16.28;SB=-316.84	GT:AD:DP:GL:GQ	0/1:20,23:40:-85.33,-12.06,-59.14:99
-chr1	2789623	rs729419	G	T	32.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=4.03;MQ=56.89;MQ0=0;OQ=1157.82;QD=30.47;SB=-604.54	GT:AD:DP:GL:GQ	1/1:0,38:33:-119.38,-9.94,-0.01:99
-chr1	2789978	rs4233022	T	C	8.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=58.32;MQ0=0;OQ=1306.00;QD=33.49;SB=-393.50	GT:AD:DP:GL:GQ	1/1:0,38:38:-137.49,-14.36,-3.31:99
-chr1	2790214	rs61763695	G	T	159.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=59.41;MQ0=0;OQ=678.47;QD=17.40;SB=-357.12	GT:AD:DP:GL:GQ	0/1:15,24:37:-82.28,-11.15,-45.69:99
-chr1	2790614	rs2061229	A	G	424.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=1321.60;QD=28.73;SB=-492.17	GT:AD:DP:GL:GQ	1/1:0,46:43:-135.79,-12.97,-0.04:99
-chr1	2791688	rs4648429	A	G	0.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.02;HRun=3;HaplotypeScore=3.60;MQ=59.05;MQ0=0;OQ=1300.58;QD=29.56;SB=-615.14	GT:AD:DP:GL:GQ	1/1:0,43:39:-133.67,-11.76,-0.03:99
-chr1	2791895	rs10737188	A	G	0.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=3;HaplotypeScore=11.58;MQ=57.39;MQ0=0;OQ=1158.45;QD=32.18;SB=-423.17	GT:AD:DP:GL:GQ	1/1:0,36:33:-119.44,-9.94,-0.01:99
-chr1	2791912	rs12127835	C	T	0.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=15.40;MQ=57.73;MQ0=0;OQ=440.23;QD=14.20;SB=-189.24	GT:AD:DP:GL:GQ	0/1:15,16:28:-55.74,-8.44,-48.73:99
-chr1	2791917	rs12124890	G	A	0.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=10.20;MQ=56.96;MQ0=0;OQ=462.23;QD=14.91;SB=-204.21	GT:AD:DP:GL:GQ	0/1:14,16:28:-57.95,-8.44,-40.79:99
-chr1	2792072	rs10752725	T	C	491.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=1748.59;QD=30.68;SB=-570.96	GT:AD:DP:GL:GQ	1/1:0,57:55:-178.49,-16.59,-0.05:99
-chr1	2792208	rs7552943	A	G	158.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=59.00;MQ0=0;OQ=672.02;QD=16.00;SB=-219.52	GT:AD:DP:GL:GQ	0/1:13,29:36:-81.33,-10.85,-44.36:99
-chr1	2792422	.	G	A	42.68	PASS	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=59.28;MQ0=0;OQ=1176.82;QD=18.39;SB=-377.70	GT:AD:DP:GL:GQ	0/1:28,36:64:-140.25,-19.29,-99.03:99
-chr1	2793407	rs3001793	G	A	9.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=1.66;MQ=57.81;MQ0=0;OQ=925.83;QD=30.86;SB=-281.35	GT:AD:DP:GL:GQ	1/1:0,30:25:-96.18,-7.54,-0.02:75.22
-chr1	2793666	rs2377039	C	T	77.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=60.00;MQ0=0;OQ=452.51;QD=18.10;SB=-252.58	GT:AD:DP:GL:GQ	0/1:10,15:20:-54.56,-6.03,-20.77:99
-chr1	2794138	rs3001794	C	G	65.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=352.40;QD=13.05;SB=-39.43	GT:AD:DP:GL:GQ	0/1:15,12:26:-46.37,-7.84,-60.81:99
-chr1	2800878	rs2842928	T	C	235.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=901.11;QD=33.37;SB=-249.77	GT:AD:DP:GL:GQ	1/1:0,27:26:-93.71,-7.83,-0.01:78.23
-chr1	2802104	rs10909834	G	C	0.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=3;HaplotypeScore=3.91;MQ=59.36;MQ0=0;OQ=721.69;QD=20.05;SB=-360.48	GT:AD:DP:GL:GQ	0/1:15,21:32:-85.11,-9.65,-46.55:99
-chr1	2803334	rs10909835	C	A	282.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.29;MQ0=0;OQ=1113.78;QD=16.14;SB=-524.88	GT:AD:DP:GL:GQ	0/1:32,37:69:-135.44,-20.78,-115.35:99
-chr1	2809215	.	C	A	24.19	LowQual	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=33.87;MQ0=3;QD=0.67;SB=-3.99	GT:AD:DP:GL:GQ	0/1:32,3:16:-10.52,-4.82,-48.73:57.01
-chr1	2812608	rs12091184	T	C	225.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=59.35;MQ0=0;OQ=707.81;QD=11.06;SB=-307.08	GT:AD:DP:GL:GQ	0/1:33,31:62:-92.76,-18.69,-131.04:99
-chr1	2813319	rs12035436	G	T	336.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.54;MQ0=0;OQ=779.74;QD=15.59;SB=-317.29	GT:AD:DP:GL:GQ	0/1:23,27:47:-95.42,-14.16,-69.60:99
-chr1	2815014	rs880724	C	T	302.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.57;MQ0=0;OQ=894.47;QD=16.56;SB=-357.16	GT:AD:DP:GL:GQ	0/1:25,29:52:-108.41,-15.68,-73.43:99
-chr1	2816229	rs34114281	G	A	56.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=59.49;MQ0=0;OQ=818.99;QD=18.20;SB=-240.71	GT:AD:DP:GL:GQ	0/1:20,25:44:-98.44,-13.25,-71.30:99
-chr1	2816447	rs12738063	G	A	183.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=60.00;MQ0=0;OQ=436.36;QD=11.79;SB=-199.90	GT:AD:DP:GL:GQ	0/1:21,16:33:-56.87,-9.95,-58.54:99
-chr1	2819411	rs1869970	A	G	323.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=58.68;MQ0=0;OQ=562.16;QD=12.22;SB=-263.95	GT:AD:DP:GL:GQ	0/1:23,23:46:-73.37,-13.87,-93.65:99
-chr1	2819722	rs10797359	G	A	80.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=58.97;MQ0=0;OQ=661.62;QD=14.70;SB=-329.32	GT:AD:DP:GL:GQ	0/1:24,21:45:-83.00,-13.56,-85.88:99
-chr1	2819782	rs10797360	T	C	62.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=58.11;MQ0=0;OQ=276.31;QD=7.47;SB=-143.57	GT:AD:DP:GL:GQ	0/1:22,15:35:-41.46,-10.55,-86.74:99
-chr1	2821229	rs2606408	T	C	106.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=3.39;MQ=59.56;MQ0=0;OQ=598.54;QD=11.51;SB=-201.20	GT:AD:DP:GL:GQ	0/1:29,23:50:-78.20,-15.07,-111.31:99
-chr1	2821448	rs1563475	G	T	119.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=513.38;QD=12.83;SB=-112.67	GT:AD:DP:GL:GQ	0/1:19,21:38:-66.07,-11.45,-67.04:99
-chr1	2821650	rs11590100	A	G	136.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=59.60;MQ0=0;OQ=943.28;QD=10.14;SB=-480.61	GT:AD:DP:GL:GQ	0/1:51,42:88:-124.13,-26.52,-198.52:99
-chr1	2822111	rs3001796	T	C	212.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.85;MQ=55.14;MQ0=0;OQ=802.13;QD=11.80;SB=-349.06	GT:AD:DP:GL:GQ	0/1:33,34:64:-102.79,-19.29,-127.57:99
-chr1	2822273	rs3001797	G	A	0.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=14.80;MQ=58.82;MQ0=1;OQ=1009.61;QD=19.42;SB=-317.35	GT:AD:DP:GL:GQ	0/1:22,30:49:-119.01,-14.77,-60.02:99
-chr1	2822628	rs6696129	C	T	18.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=6.89;MQ=57.91;MQ0=1;OQ=832.22;QD=14.35;SB=-326.29	GT:AD:DP:GL:GQ	0/1:32,26:55:-103.07,-16.57,-105.26:99
-chr1	2823020	rs1869971	C	T	374.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=57.94;MQ0=0;OQ=535.79;QD=14.48;SB=-291.84	GT:AD:DP:GL:GQ	0/1:19,18:35:-67.42,-10.56,-54.80:99
-chr1	2823154	rs7339944	G	A	129.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=59.45;MQ0=0;OQ=957.99;QD=19.16;SB=-392.16	GT:AD:DP:GL:GQ	0/1:19,31:48:-113.55,-14.46,-66.11:99
-chr1	2823192	rs7340016	A	G	29.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=3.35;MQ=59.34;MQ0=0;OQ=422.29;QD=10.05;SB=-179.53	GT:AD:DP:GL:GQ	0/1:21,21:36:-56.37,-10.85,-73.83:99
-chr1	2823287	rs2124663	C	T	42.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=59.59;MQ0=0;OQ=634.70;QD=14.10;SB=-71.85	GT:AD:DP:GL:GQ	0/1:24,21:45:-80.32,-13.56,-82.96:99
-chr1	2823310	rs1563466	T	C	23.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.63;MQ=58.92;MQ0=0;OQ=514.85;QD=13.20;SB=-114.69	GT:AD:DP:GL:GQ	0/1:19,20:38:-66.22,-11.45,-76.59:99
-chr1	2823513	rs11587665	C	T	40.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=6.13;MQ=59.14;MQ0=0;OQ=737.31;QD=13.65;SB=-373.35	GT:AD:DP:GL:GQ	0/1:29,25:51:-92.39,-15.38,-90.11:99
-chr1	2823603	rs1563468	T	C	458.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.00;MQ0=0;OQ=947.27;QD=14.14;SB=-372.60	GT:AD:DP:GL:GQ	0/1:28,39:64:-117.31,-19.30,-107.37:99
-chr1	2823870	rs11809099	C	T	295.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.56;MQ0=0;OQ=690.45;QD=13.28;SB=-256.23	GT:AD:DP:GL:GQ	0/1:28,23:49:-87.09,-14.76,-98.54:99
-chr1	2823885	rs2842926	G	A	181.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=59.53;MQ0=0;OQ=786.09;QD=16.04;SB=-320.86	GT:AD:DP:GL:GQ	0/1:23,26:46:-95.76,-13.86,-71.19:99
-chr1	2825347	rs897633	A	C	527.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=683.77;QD=14.86;SB=-280.84	GT:AD:DP:GL:GQ	0/1:21,25:45:-85.22,-13.56,-75.45:99
-chr1	2825552	rs897634	T	C	95.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1172.99;QD=30.08;SB=-560.88	GT:AD:DP:GL:GQ	1/1:0,39:37:-120.91,-11.16,-0.03:99
-chr1	2825769	rs2606409	A	G	32.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=5.74;MQ=57.77;MQ0=0;OQ=329.46;QD=7.84;SB=-164.95	GT:AD:DP:GL:GQ	0/1:25,16:40:-48.29,-12.06,-98.69:99
-chr1	2825959	rs2606410	C	T	311.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.19;MQ=59.57;MQ0=0;OQ=951.03;QD=17.61;SB=-434.47	GT:AD:DP:GL:GQ	0/1:25,29:51:-113.75,-15.36,-82.67:99
-chr1	2827304	rs55855166	G	A	337.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.37;MQ0=0;OQ=391.24;QD=9.10;SB=-201.88	GT:AD:DP:GL:GQ	0/1:27,16:41:-54.76,-12.35,-93.92:99
-chr1	2828084	rs35844499	A	C	0.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=8.95;MQ=33.58;MQ0=13;OQ=215.00;QD=4.89;SB=-66.98	GT:AD:DP:GL:GQ	0/1:23,20:16:-29.61,-4.82,-23.59:99
-chr1	2831038	.	C	T	212.41	PASS	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=614.63;QD=14.29;SB=-239.55	GT:AD:DP:GL:GQ	0/1:23,20:43:-77.70,-12.96,-79.28:99
-chr1	2833249	.	C	T	39.44	LowQual	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=2.90;MQ=56.74;MQ0=0;QD=1.36;SB=-41.03	GT:AD:DP:GL:GQ	0/1:24,4:19:-12.96,-5.74,-47.17:72.28
-chr1	2833472	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=11.49;MQ=58.05;MQ0=0;OQ=54.69;QD=1.52;SB=-45.69	GT:AD:DP:GL:GQ	0/1:28,8:19:-14.49,-5.74,-59.79:87.52
-chr1	2837348	rs2606411	T	C	351.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=583.14;QD=14.58;SB=-128.66	GT:AD:DP:GL:GQ	0/1:14,26:36:-72.45,-10.85,-55.84:99
-chr1	2838116	rs35880479	G	A	202.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=58.64;MQ0=0;OQ=848.27;QD=13.05;SB=-379.33	GT:AD:DP:GL:GQ	0/1:37,28:62:-106.79,-18.68,-116.44:99
-chr1	2844321	rs12120163	C	T	361.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.44;MQ0=0;OQ=1226.99;QD=16.58;SB=-528.52	GT:AD:DP:GL:GQ	0/1:36,38:72:-147.69,-21.70,-111.75:99
-chr1	2849584	rs2842909	C	T	85.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=5.45;MQ=57.20;MQ0=0;OQ=445.80;QD=10.87;SB=-188.84	GT:AD:DP:GL:GQ	0/1:22,19:36:-58.71,-10.85,-74.85:99
-chr1	2850791	rs2925499	C	T	367.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=59.73;MQ0=0;OQ=1163.55;QD=17.11;SB=-509.17	GT:AD:DP:GL:GQ	0/1:33,35:67:-139.83,-20.19,-105.50:99
-chr1	2856184	.	C	T	37.47	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=14.17;MQ0=11;QD=1.63;SB=-10.00	GT:AD:DP:GL:GQ	0/1:13,10:4:-8.24,-1.21,-6.09:48.87
-chr1	2856380	rs3010827	T	C	18.54	LowQual	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=1.43;MQ=21.91;MQ0=3;QD=0.66;SB=-6.99	GT:AD:DP:GL:GQ	0/1:20,8:5:-6.64,-1.51,-11.98:51.31
-chr1	2865080	rs2788089	G	A	618.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2745.57;QD=39.79;SB=-1234.70	GT:AD:DP:GL:GQ	1/1:0,69:69:-278.16,-20.78,-0.02:99
-chr1	2866385	rs10909845	T	C	68.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=1.49;MQ=58.86;MQ0=0;OQ=1786.40;QD=31.34;SB=-680.16	GT:AD:DP:GL:GQ	1/1:0,57:53:-182.25,-15.97,-0.03:99
-chr1	2866462	rs6663830	A	G	10.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.42;MQ=57.19;MQ0=0;OQ=455.20;QD=23.96;SB=-149.73	GT:AD:DP:GL:GQ	1/1:1,18:16:-49.13,-4.83,-0.02:48.09
-chr1	2866480	rs12132266	C	G	0.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=2;HaplotypeScore=2.31;MQ=54.22;MQ0=2;OQ=483.83;QD=32.26;SB=-138.40	GT:AD:DP:GL:GQ	1/1:2,13:12:-51.97,-3.62,-0.01:36.12
-chr1	2866511	rs12129394	G	A	181.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.76;MQ0=0;OQ=82.01;QD=27.34;SB=-47.56	GT:AD:DP:GL:GQ	1/1:0,3:3:-11.69,-0.90,-0.00:9.03
-chr1	2866552	rs11582761	G	A	15.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=47.10;MQ0=0;OQ=87.13;QD=17.43;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,4:3:-12.20,-0.90,-0.00:9.03
-chr1	2868226	rs11583804	G	A	591.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.37;MQ0=0;OQ=1019.85;QD=15.45;SB=-422.44	GT:AD:DP:GL:GQ	0/1:35,31:65:-124.85,-19.58,-125.50:99
-chr1	2872997	rs10909848	G	T	338.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=59.67;MQ0=0;OQ=904.50;QD=15.87;SB=-468.05	GT:AD:DP:GL:GQ	0/1:25,32:54:-110.00,-16.27,-78.02:99
-chr1	2873890	.	G	C	11.21	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=4;HaplotypeScore=5.27;MQ=55.45;MQ0=0;QD=0.59;SB=14.08	GT:AD:DP:GL:GQ	0/1:10,9:11:-7.69,-3.32,-38.19:43.71
-chr1	2874116	rs2993507	T	C	16.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=3;HaplotypeScore=1.05;MQ=58.76;MQ0=0;OQ=1405.38;QD=31.23;SB=-680.25	GT:AD:DP:GL:GQ	1/1:0,45:40:-144.14,-12.05,-0.01:99
-chr1	2876216	rs2842925	A	G	411.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=1144.93;QD=30.13;SB=-502.20	GT:AD:DP:GL:GQ	1/1:0,38:36:-118.11,-10.86,-0.03:99
-chr1	2876326	rs12752801	C	T	372.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.51;MQ0=0;OQ=555.75;QD=11.82;SB=-279.71	GT:AD:DP:GL:GQ	0/1:29,18:46:-72.72,-13.86,-94.69:99
-chr1	2876664	rs1104934	C	T	153.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.11;MQ0=0;OQ=873.37;QD=18.58;SB=-376.40	GT:AD:DP:GL:GQ	0/1:19,28:45:-104.19,-13.57,-58.40:99
-chr1	2876848	rs4072769	G	A	397.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.29;MQ0=0;OQ=569.53;QD=13.56;SB=-264.25	GT:AD:DP:GL:GQ	0/1:22,20:41:-72.60,-12.36,-71.89:99
-chr1	2877278	rs12731895	T	A	88.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.47;MQ0=0;OQ=1142.36;QD=32.64;SB=-433.66	GT:AD:DP:GL:GQ	1/1:0,35:33:-117.84,-9.95,-0.02:99
-chr1	2877329	rs12727338	A	G	1.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=6.87;MQ=57.26;MQ0=0;OQ=1138.52;QD=25.30;SB=-341.40	GT:AD:DP:GL:GQ	1/1:0,45:36:-117.47,-10.86,-0.03:99
-chr1	2877535	rs4648443	G	C	93.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=59.43;MQ0=0;OQ=1023.89;QD=31.03;SB=-246.78	GT:AD:DP:GL:GQ	1/1:0,33:28:-106.01,-8.47,-0.04:84.26
-chr1	2878321	rs10797371	T	C	561.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=1137.37;QD=29.16;SB=-576.99	GT:AD:DP:GL:GQ	1/1:0,39:37:-117.36,-11.16,-0.04:99
-chr1	2878374	rs10797372	A	G	151.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=58.80;MQ0=0;OQ=958.51;QD=27.39;SB=-485.14	GT:AD:DP:GL:GQ	1/1:0,35:31:-99.47,-9.35,-0.03:93.21
-chr1	2878478	rs57027760	G	T	756.85	Indel	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=16.93;MQ=60.84;MQ0=0;QD=20.46;SB=-136.60	GT:AD:DP:GL:GQ	0/1:7,30:29:-87.69,-8.74,-9.78:10.36
-chr1	2879008	rs56619891	G	A	46.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=58.68;MQ0=0;OQ=1774.48;QD=38.58;SB=-601.31	GT:AD:DP:GL:GQ	1/1:0,46:45:-181.04,-13.56,-0.01:99
-chr1	2879409	rs2495273	T	A	230.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=58.81;MQ0=0;OQ=1962.54;QD=35.68;SB=-1002.53	GT:AD:DP:GL:GQ	1/1:0,55:54:-199.86,-16.27,-0.02:99
-chr1	2879437	rs12044030	C	T	157.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=1.24;MQ=58.72;MQ0=0;OQ=1987.31;QD=38.97;SB=-989.84	GT:AD:DP:GL:GQ	1/1:0,51:51:-202.33,-15.37,-0.02:99
-chr1	2880205	rs4648445	G	A	0.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=7.53;MQ=59.36;MQ0=0;OQ=1380.04;QD=38.33;SB=-528.20	GT:AD:DP:GL:GQ	1/1:1,35:35:-141.60,-10.54,-0.01:99
-chr1	2880574	rs4648446	C	T	93.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.43;MQ=58.80;MQ0=0;OQ=2154.57;QD=37.15;SB=-942.74	GT:AD:DP:GL:GQ	1/1:0,58:56:-219.07,-16.88,-0.03:99
-chr1	2880814	rs35060945	G	T	115.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=59.36;MQ0=0;OQ=1511.10;QD=32.85;SB=-647.26	GT:AD:DP:GL:GQ	1/1:0,46:43:-154.71,-12.95,-0.02:99
-chr1	2880975	rs9661752	C	T	171.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.26;MQ=57.35;MQ0=0;OQ=1967.63;QD=36.44;SB=-881.18	GT:AD:DP:GL:GQ	1/1:0,54:51:-200.37,-15.37,-0.02:99
-chr1	2880988	rs35377179	C	A	115.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=57.03;MQ0=0;OQ=1298.02;QD=29.50;SB=-650.95	GT:AD:DP:GL:GQ	1/1:1,43:37:-133.40,-11.15,-0.01:99
-chr1	2881030	.	C	A	0.40	PASS	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=1;HaplotypeScore=3.41;MQ=54.52;MQ0=1;OQ=214.49;QD=8.25;SB=26.09	GT:AD:DP:GL:GQ	0/1:17,8:22:-34.34,-9.60,-47.09:99
-chr1	2881446	rs12046122	C	A	164.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=56.73;MQ0=0;OQ=1555.86;QD=34.57;SB=-803.87	GT:AD:DP:GL:GQ	1/1:0,45:44:-159.18,-13.25,-0.01:99
-chr1	2881573	rs12046158	C	T	78.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=1075.02;QD=38.39;SB=-495.01	GT:AD:DP:GL:GQ	1/1:0,28:28:-111.09,-8.43,-0.01:84.27
-chr1	2882784	rs12096719	A	G	679.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.77;MQ0=0;OQ=1529.67;QD=33.99;SB=-756.19	GT:AD:DP:GL:GQ	1/1:0,45:44:-156.57,-13.25,-0.01:99
-chr1	2883117	rs34709641	C	A	0.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=10.20;MQ=27.00;MQ0=0;OQ=541.23;QD=24.60;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,21:16:-57.72,-4.82,-0.01:48.13
-chr1	2883336	.	T	C	0.07	PASS	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=2.02;MQ=28.41;MQ0=1;OQ=55.83;QD=2.15;SB=35.13	GT:AD:DP:GL:GQ	0/1:19,7:19:-14.60,-5.73,-55.04:88.67
-chr1	2883474	.	C	T	16.42	PASS	AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=1;HaplotypeScore=1.15;MQ=19.09;MQ0=3;OQ=91.28;QD=9.13;SB=-10.00	GT:AD:DP:GL:GQ	1/1:6,3:4:-15.26,-3.77,-2.60:11.70
-chr1	2883529	.	A	G	32.82	LowQual	AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=16.58;MQ0=2;QD=4.69;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,7:2:-6.69,-0.60,-0.00:6.01
-chr1	2883801	.	G	C	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=4.62;MQ=34.13;MQ0=1;OQ=549.05;QD=22.88;SB=-205.68	GT:AD:DP:GL:GQ	0/1:3,21:17:-63.31,-5.13,-9.19:40.68
-chr1	2883821	.	C	G	1.10	PASS	AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=5.35;MQ=22.36;MQ0=5;OQ=186.32;QD=8.47;SB=-39.88	GT:AD:DP:GL:GQ	0/1:7,15:10:-24.93,-3.02,-15.34:99
-chr1	2883940	.	C	G	0.08	PASS	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=7.32;MQ=24.85;MQ0=3;OQ=119.37;QD=7.02;SB=-3.99	GT:AD:DP:GL:GQ	0/1:4,13:7:-17.34,-2.12,-7.20:50.86
-chr1	2883991	.	G	A	9.80	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=39.91;MQ0=4;OQ=393.88;QD=7.16;SB=-196.17	GT:AD:DP:GL:GQ	0/1:36,19:38:-54.13,-11.46,-77.08:99
-chr1	2884111	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=5.45;MQ=48.57;MQ0=0;OQ=67.53;QD=1.73;SB=-58.84	GT:AD:DP:GL:GQ	0/1:29,10:26:-17.87,-7.84,-79.49:99
-chr1	2884204	.	C	G	13.82	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=48;Dels=0.02;HRun=0;HaplotypeScore=10.52;MQ=37.87;MQ0=5;QD=0.29;SB=17.09	GT:AD:DP:GL:GQ	0/1:44,3:31:-13.69,-9.05,-110.48:46.47
-chr1	2884224	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=7.14;MQ=33.65;MQ0=6;OQ=99.62;QD=2.69;SB=-73.89	GT:AD:DP:GL:GQ	0/1:22,14:21:-19.58,-6.34,-62.85:99
-chr1	2884275	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=8.64;MQ=43.29;MQ0=0;OQ=54.38;QD=1.36;SB=23.10	GT:AD:DP:GL:GQ	0/1:34,6:34:-18.98,-10.26,-119.97:87.22
-chr1	2884325	.	G	C	41.80	PASS	AC=2;AF=1.00;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=49.14;MQ0=0;OQ=1253.36;QD=33.87;SB=-646.42	GT:AD:DP:GL:GQ	1/1:0,37:34:-128.97,-10.28,-0.05:99
-chr1	2885060	rs63721360	G	T	452.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=1106.85;QD=29.13;SB=-549.16	GT:AD:DP:GL:GQ	1/1:0,38:32:-114.28,-9.64,-0.01:96.27
-chr1	2885413	rs34183832	C	T	53.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=60.00;MQ0=0;OQ=1297.32;QD=37.07;SB=-499.18	GT:AD:DP:GL:GQ	1/1:0,35:34:-133.33,-10.25,-0.01:99
-chr1	2885666	rs12746525	C	T	345.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.87;MQ0=0;OQ=771.21;QD=35.05;SB=-307.40	GT:AD:DP:GL:GQ	1/1:0,22:21:-80.72,-6.33,-0.01:63.20
-chr1	2885725	rs12731464	G	A	43.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=59.36;MQ0=0;OQ=1296.44;QD=36.01;SB=-473.63	GT:AD:DP:GL:GQ	1/1:0,36:34:-133.24,-10.25,-0.01:99
-chr1	2885912	rs12746985	C	T	116.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.54;MQ0=0;OQ=1570.34;QD=38.30;SB=-739.01	GT:AD:DP:GL:GQ	1/1:0,40:40:-160.63,-12.05,-0.01:99
-chr1	2886057	rs12747179	C	G	228.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1558.47;QD=39.96;SB=-692.89	GT:AD:DP:GL:GQ	1/1:0,39:37:-159.45,-11.15,-0.01:99
-chr1	2886368	rs7519674	G	T	104.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.51;MQ=58.92;MQ0=0;OQ=1251.61;QD=32.09;SB=-486.26	GT:AD:DP:GL:GQ	1/1:0,39:37:-128.76,-11.15,-0.02:99
-chr1	2886595	rs7533362	A	G	145.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.95;MQ=59.61;MQ0=0;OQ=2108.67;QD=35.74;SB=-1026.73	GT:AD:DP:GL:GQ	1/1:0,59:59:-214.47,-17.77,-0.02:99
-chr1	2886944	rs10909849	A	G	437.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.80;MQ0=0;OQ=1258.82;QD=27.97;SB=-649.76	GT:AD:DP:GL:GQ	1/1:0,45:41:-129.52,-12.37,-0.05:99
-chr1	2886953	rs2788088	G	A	571.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.80;MQ0=0;OQ=615.00;QD=13.67;SB=-320.48	GT:AD:DP:GL:GQ	0/1:23,22:41:-77.15,-12.37,-67.43:99
-chr1	2887315	rs3001801	T	C	293.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.55;MQ0=0;OQ=285.37;QD=12.41;SB=-113.63	GT:AD:DP:GL:GQ	0/1:11,12:22:-38.45,-6.63,-44.08:99
-chr1	2887325	rs2495272	A	G	0.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=3;HaplotypeScore=1.25;MQ=56.85;MQ0=0;OQ=451.51;QD=25.08;SB=-251.59	GT:AD:DP:GL:GQ	1/1:0,18:15:-48.75,-4.52,-0.01:45.11
-chr1	2887439	.	A	G	0.37	PASS	AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=2;HaplotypeScore=3.88;MQ=55.21;MQ0=0;OQ=257.68;QD=9.20;SB=-92.00	GT:AD:DP:GL:GQ	0/1:17,11:26:-36.89,-7.84,-61.45:99
-chr1	2887454	.	A	G	0.28	PASS	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=2;HaplotypeScore=5.31;MQ=55.54;MQ0=0;OQ=380.48;QD=12.68;SB=-84.99	GT:AD:DP:GL:GQ	0/1:15,15:27:-49.47,-8.14,-52.46:99
-chr1	2887461	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=9.99;MQ=56.64;MQ0=0;OQ=82.14;QD=2.65;SB=-24.50	GT:AD:DP:GL:GQ	0/1:26,5:30:-20.54,-9.04,-87.21:99
-chr1	2887469	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=2;HaplotypeScore=10.99;MQ=56.64;MQ0=0;OQ=56.39;QD=1.82;SB=-10.59	GT:AD:DP:GL:GQ	0/1:26,5:30:-17.96,-9.04,-99.17:89.23
-chr1	2887476	rs61763639	G	A	1.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=10.80;MQ=56.85;MQ0=0;OQ=400.87;QD=12.15;SB=-209.95	GT:AD:DP:GL:GQ	0/1:19,13:29:-55.44,-12.07,-58.42:99
-chr1	2887567	rs61763640	G	C	352.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=547.00;QD=15.63;SB=-239.40	GT:AD:DP:GL:GQ	0/1:19,16:35:-68.53,-10.55,-82.14:99
-chr1	2887764	rs35529252	C	G	80.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=1.06;MQ=57.39;MQ0=0;OQ=226.67;QD=8.40;SB=2.03	GT:AD:DP:GL:GQ	0/1:18,9:23:-32.89,-6.94,-62.31:99
-chr1	2887828	rs56335850	C	G	110.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=4.16;MQ=58.45;MQ0=0;OQ=748.06;QD=17.40;SB=-393.99	GT:AD:DP:GL:GQ	0/1:21,22:42:-90.75,-12.66,-91.15:99
-chr1	2888083	rs56195961	C	T	7.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=2.95;MQ=60.00;MQ0=0;OQ=1112.19;QD=20.22;SB=-391.16	GT:AD:DP:GL:GQ	0/1:22,33:55:-131.08,-16.58,-71.48:99
-chr1	2888354	rs17391563	T	C	531.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=612.67;QD=11.56;SB=-261.21	GT:AD:DP:GL:GQ	0/1:27,26:52:-80.22,-15.67,-108.53:99
-chr1	2888416	rs6681331	C	T	397.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=59.62;MQ0=0;OQ=831.46;QD=13.63;SB=-416.81	GT:AD:DP:GL:GQ	0/1:34,27:59:-104.22,-17.79,-102.21:99
-chr1	2888820	rs6681741	C	T	399.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=60.00;MQ0=0;OQ=909.46;QD=13.78;SB=-406.91	GT:AD:DP:GL:GQ	0/1:37,29:64:-113.53,-19.30,-110.49:99
-chr1	2889209	rs12043738	C	T	43	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=2.99;MQ=59.70;MQ0=0;OQ=782.92;QD=12.63;SB=-392.82	GT:AD:DP:GL:GQ	0/1:36,26:56:-98.47,-16.89,-96.75:99
-chr1	2889348	rs12046140	T	C	210.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.64;MQ=58.78;MQ0=0;OQ=758.51;QD=11.67;SB=-309.09	GT:AD:DP:GL:GQ	0/1:33,31:62:-97.83,-18.69,-124.67:99
-chr1	2891988	rs1572657	C	T	224.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=58.69;MQ0=0;OQ=1966.14;QD=39.32;SB=-982.30	GT:AD:DP:GL:GQ	1/1:0,50:49:-200.21,-14.76,-0.01:99
-chr1	2893019	rs16823303	A	G	473.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=1016.72;QD=15.17;SB=-513.96	GT:AD:DP:GL:GQ	0/1:31,36:67:-125.14,-20.19,-125.83:99
-chr1	2893437	rs4350139	T	C	494.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=627.58;QD=13.35;SB=-219.43	GT:AD:DP:GL:GQ	0/1:23,24:46:-79.90,-13.86,-93.15:99
-chr1	2893916	rs10797373	G	A	257.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.18;MQ=59.61;MQ0=0;OQ=845.53;QD=14.33;SB=-302.29	GT:AD:DP:GL:GQ	0/1:31,28:56:-104.72,-16.88,-95.11:99
-chr1	2895465	rs10909852	T	C	196.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=3.24;MQ=59.46;MQ0=0;OQ=1273.07;QD=16.32;SB=-516.27	GT:AD:DP:GL:GQ	0/1:36,42:76:-153.48,-22.89,-141.76:99
-chr1	2897295	rs7546695	C	A	472.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.44;MQ0=0;OQ=1069.83;QD=15.97;SB=-543.65	GT:AD:DP:GL:GQ	0/1:30,37:66:-130.15,-19.88,-106.29:99
-chr1	2897527	rs12411019	T	C	97.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.42;MQ0=0;OQ=164.92;QD=5.15;SB=-60.30	GT:AD:DP:GL:GQ	0/1:21,11:29:-28.52,-8.74,-78.99:99
-chr1	2897840	rs58882615	A	T	78.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=58.81;MQ0=0;OQ=696.78;QD=12.67;SB=-96.85	GT:AD:DP:GL:GQ	0/1:28,27:52:-88.62,-15.66,-107.99:99
-chr1	2897930	rs10909854	A	G	302.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=59.44;MQ0=0;OQ=922.43;QD=11.25;SB=-327.10	GT:AD:DP:GL:GQ	0/1:45,37:81:-119.94,-24.41,-179.92:99
-chr1	2898248	rs10909855	C	T	438.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.39;MQ0=0;OQ=1131.76;QD=16.40;SB=-432.83	GT:AD:DP:GL:GQ	0/1:34,35:68:-136.95,-20.49,-112.64:99
-chr1	2898666	.	G	A	72.98	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.34;MQ=60.00;MQ0=0;OQ=1136.24;QD=18.33;SB=-578.42	GT:AD:DP:GL:GQ	0/1:27,35:58:-134.38,-17.48,-83.03:99
-chr1	2898708	rs56000855	G	T	262.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=393.56;QD=10.09;SB=-213.51	GT:AD:DP:GL:GQ	0/1:23,16:38:-54.09,-11.45,-79.61:99
-chr1	2899110	rs16823315	A	G	251.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.58;MQ=58.82;MQ0=0;OQ=851.48;QD=14.43;SB=-403.32	GT:AD:DP:GL:GQ	0/1:28,31:58:-105.90,-17.47,-115.59:99
-chr1	2899231	rs17391750	G	A	437.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.91;MQ0=0;OQ=1161.97;QD=13.51;SB=-467.04	GT:AD:DP:GL:GQ	0/1:50,36:85:-145.10,-25.62,-160.28:99
-chr1	2899576	rs4335321	A	G	105.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=58.00;MQ0=0;OQ=946.55;QD=13.52;SB=-144.87	GT:AD:DP:GL:GQ	0/1:37,33:68:-118.42,-20.48,-143.93:99
-chr1	2899597	.	A	T	1.69	PASS	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=3.60;MQ=57.30;MQ0=0;OQ=711.73;QD=11.67;SB=-108.79	GT:AD:DP:GL:GQ	0/1:34,27:58:-91.93,-17.47,-124.49:99
-chr1	2899698	.	C	A	3.06	PASS	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=964.27;QD=14.39;SB=-495.28	GT:AD:DP:GL:GQ	0/1:34,33:65:-119.29,-19.58,-112.82:99
-chr1	2899893	.	T	C	127.63	PASS	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.77;MQ=59.43;MQ0=0;OQ=700.47;QD=10.61;SB=-280.59	GT:AD:DP:GL:GQ	0/1:36,30:65:-92.92,-19.59,-144.88:99
-chr1	2900185	rs57720952	A	G	235.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=59.13;MQ0=0;OQ=624.52;QD=11.78;SB=-194.60	GT:AD:DP:GL:GQ	0/1:27,26:53:-81.72,-15.98,-107.90:99
-chr1	2900204	rs58538272	A	G	481.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=755.97;QD=13.50;SB=-350.98	GT:AD:DP:GL:GQ	0/1:26,30:55:-95.46,-16.58,-99.09:99
-chr1	2900256	rs60017523	T	C	269.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=59.37;MQ0=0;OQ=740.61;QD=11.22;SB=-378.62	GT:AD:DP:GL:GQ	0/1:33,33:62:-96.04,-18.69,-126.33:99
-chr1	2901217	rs58445466	T	C	331.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=47.93;MQ0=0;OQ=860.37;QD=15.36;SB=-212.50	GT:AD:DP:GL:GQ	0/1:26,30:54:-105.58,-16.26,-101.98:99
-chr1	2901454	rs56337009	G	A	18.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=49.33;MQ0=1;OQ=975.13;QD=34.83;SB=-240.32	GT:AD:DP:GL:GQ	1/1:2,26:25:-101.11,-7.53,-0.01:75.24
-chr1	2902060	rs12022594	C	T	230.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=53.29;MQ0=0;OQ=1320.21;QD=14.67;SB=-682.37	GT:AD:DP:GL:GQ	0/1:48,42:84:-160.62,-25.31,-148.07:99
-chr1	2902087	rs12059864	C	T	220.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=4.77;MQ=55.08;MQ0=0;OQ=1120.96;QD=14.95;SB=-477.46	GT:AD:DP:GL:GQ	0/1:41,34:69:-136.16,-20.78,-131.24:99
-chr1	2902707	rs10909856	T	C	237.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=59.08;MQ0=0;OQ=1121.38;QD=13.04;SB=-473.58	GT:AD:DP:GL:GQ	0/1:47,39:85:-141.02,-25.60,-190.53:99
-chr1	2902862	rs12401989	C	A	536.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=929.32;QD=11.47;SB=-426.42	GT:AD:DP:GL:GQ	0/1:49,32:81:-120.61,-24.40,-176.66:99
-chr1	2903095	rs60435231	A	G	179.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=2.39;MQ=59.67;MQ0=0;OQ=920.63;QD=13.15;SB=-378.56	GT:AD:DP:GL:GQ	0/1:39,31:70:-116.43,-21.08,-161.00:99
-chr1	2903159	rs59407673	T	C	419.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=752.64;QD=11.07;SB=-260.51	GT:AD:DP:GL:GQ	0/1:41,27:66:-98.43,-19.88,-155.58:99
-chr1	2903756	.	C	T	100.01	PASS	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=59.38;MQ0=0;OQ=1160.57;QD=15.47;SB=-488.46	GT:AD:DP:GL:GQ	0/1:41,34:75:-141.93,-22.59,-152.72:99
-chr1	2903757	.	C	T	97.23	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=59.38;MQ0=0;OQ=1040.83;QD=14.07;SB=-405.37	GT:AD:DP:GL:GQ	0/1:41,33:72:-129.05,-21.68,-151.62:99
-chr1	2903785	.	C	T	13.14	PASS	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=3;HaplotypeScore=0.97;MQ=59.68;MQ0=0;OQ=1201.38;QD=16.69;SB=-623.18	GT:AD:DP:GL:GQ	0/1:36,36:71:-144.81,-21.39,-125.25:99
-chr1	2904148	rs34909435	G	C	261.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.06;MQ0=0;OQ=923.50;QD=16.20;SB=-375.83	GT:AD:DP:GL:GQ	0/1:30,27:56:-112.51,-16.88,-128.89:99
-chr1	2904478	rs34453862	G	T	153.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.73;MQ=59.34;MQ0=0;OQ=843.87;QD=14.80;SB=-424.19	GT:AD:DP:GL:GQ	0/1:29,28:55:-104.24,-16.57,-85.73:99
-chr1	2904922	.	G	A	6.65	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=986.03;QD=18.26;SB=-298.76	GT:AD:DP:GL:GQ	0/1:24,30:53:-117.86,-15.97,-81.07:99
-chr1	2904988	.	G	T	192.75	PASS	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.69;MQ0=0;OQ=850.19;QD=14.17;SB=-430.19	GT:AD:DP:GL:GQ	0/1:30,30:56:-105.17,-16.87,-90.14:99
-chr1	2905123	rs12049173	C	A	190.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.62;MQ0=0;OQ=810.47;QD=14.22;SB=-367.40	GT:AD:DP:GL:GQ	0/1:30,27:57:-101.50,-17.17,-107.52:99
-chr1	2905133	rs12046411	G	A	347.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.57;MQ0=0;OQ=1037.17;QD=16.73;SB=-437.83	GT:AD:DP:GL:GQ	0/1:30,32:59:-124.78,-17.78,-92.83:99
-chr1	2905422	rs12049274	C	T	603.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=930.71;QD=16.05;SB=-490.47	GT:AD:DP:GL:GQ	0/1:30,28:58:-113.82,-17.47,-110.72:99
-chr1	2905744	.	G	A	180.07	PASS	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=873.90;QD=13.87;SB=-441.80	GT:AD:DP:GL:GQ	0/1:36,27:62:-109.35,-18.68,-126.71:99
-chr1	2905997	rs12239064	T	G	232.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=59.60;MQ0=0;OQ=846.38;QD=14.85;SB=-338.82	GT:AD:DP:GL:GQ	0/1:27,30:56:-104.79,-16.87,-99.38:99
-chr1	2906020	rs12240128	G	A	259.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=59.61;MQ0=0;OQ=950.01;QD=16.10;SB=-410.72	GT:AD:DP:GL:GQ	0/1:30,29:59:-116.06,-17.77,-109.83:99
-chr1	2906205	.	C	T	60.99	PASS	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=59.51;MQ0=0;OQ=509.22;QD=13.40;SB=-258.23	GT:AD:DP:GL:GQ	0/1:18,20:34:-64.46,-10.25,-58.74:99
-chr1	2906216	rs59653178	T	C	119.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=2.26;MQ=59.54;MQ0=0;OQ=444.86;QD=10.85;SB=-210.25	GT:AD:DP:GL:GQ	0/1:22,19:37:-58.92,-11.15,-79.90:99
-chr1	2906318	.	G	C	294.79	PASS	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=687.54;QD=14.03;SB=-349.42	GT:AD:DP:GL:GQ	0/1:28,21:48:-86.50,-14.46,-122.06:99
-chr1	2906331	.	T	C	64.13	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=486.38;QD=9.01;SB=-239.89	GT:AD:DP:GL:GQ	0/1:34,20:53:-67.89,-15.97,-133.79:99
-chr1	2906530	rs16823325	A	G	170.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.48;MQ0=0;OQ=627.60;QD=14.26;SB=-219.26	GT:AD:DP:GL:GQ	0/1:22,22:44:-79.30,-13.26,-90.47:99
-chr1	2906541	rs57711454	A	G	139.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.54;MQ0=0;OQ=394.78;QD=7.90;SB=-84.54	GT:AD:DP:GL:GQ	0/1:29,20:47:-56.93,-14.17,-116.48:99
-chr1	2906996	rs10909857	T	C	66.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=3.62;MQ=57.79;MQ0=0;OQ=652.62;QD=12.31;SB=-287.16	GT:AD:DP:GL:GQ	0/1:27,26:51:-83.92,-15.38,-97.87:99
-chr1	2907051	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=17;HaplotypeScore=24.33;MQ=55.91;MQ0=0;OQ=72.31;QD=0.98;SB=54.68	GT:AD:DP:GL:GQ	0/1:56,17:51:-25.89,-15.37,-146.19:99
-chr1	2907237	rs12025260	T	C	432.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.22;MQ0=0;OQ=586.66;QD=11.73;SB=-318.24	GT:AD:DP:GL:GQ	0/1:25,25:46:-75.82,-13.87,-89.45:99
-chr1	2907320	rs10797374	C	G	183.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=56.79;MQ0=0;OQ=866.79;QD=16.35;SB=-401.99	GT:AD:DP:GL:GQ	0/1:26,27:47:-104.13,-14.17,-96.80:99
-chr1	2907323	rs10797375	C	T	107.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=56.36;MQ0=0;OQ=897.14;QD=16.31;SB=-320.30	GT:AD:DP:GL:GQ	0/1:27,28:53:-108.97,-15.97,-91.39:99
-chr1	2907332	rs10797376	A	G	569.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.97;MQ0=0;OQ=769.31;QD=13.26;SB=-314.20	GT:AD:DP:GL:GQ	0/1:28,30:54:-96.49,-16.28,-97.60:99
-chr1	2907425	rs17389607	C	T	13.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=8.86;MQ=57.83;MQ0=0;OQ=822.69;QD=15.82;SB=-373.37	GT:AD:DP:GL:GQ	0/1:24,28:48:-100.02,-14.47,-70.94:99
-chr1	2907558	rs10909859	C	T	467.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=759.55;QD=17.26;SB=-317.87	GT:AD:DP:GL:GQ	0/1:21,23:40:-91.30,-12.06,-54.32:99
-chr1	2907881	rs56008028	A	G	101.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.69;MQ=60.00;MQ0=0;OQ=314.58;QD=9.83;SB=-73.78	GT:AD:DP:GL:GQ	0/1:16,16:27:-42.88,-8.14,-52.46:99
-chr1	2908045	rs12562237	C	T	38.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=3.04;MQ=57.73;MQ0=0;OQ=402.69;QD=12.99;SB=-180.26	GT:AD:DP:GL:GQ	0/1:14,17:26:-51.39,-7.84,-42.83:99
-chr1	2908055	rs3924055	G	A	76.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=57.57;MQ0=0;OQ=483.15;QD=16.66;SB=-242.76	GT:AD:DP:GL:GQ	0/1:13,16:26:-59.44,-7.84,-34.72:99
-chr1	2908089	rs16823330	C	T	124.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.14;MQ0=0;OQ=508.46;QD=18.83;SB=-215.91	GT:AD:DP:GL:GQ	0/1:11,16:27:-62.27,-8.14,-34.10:99
-chr1	2908371	.	G	A	74.23	PASS	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.57;MQ0=0;OQ=788.94;QD=18.35;SB=-397.93	GT:AD:DP:GL:GQ	0/1:18,24:36:-93.03,-10.85,-43.26:99
-chr1	2908432	.	T	C	8.81	PASS	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=56.92;MQ0=0;OQ=358.32;QD=15.58;SB=-114.66	GT:AD:DP:GL:GQ	0/1:9,14:19:-44.84,-5.73,-23.69:99
-chr1	2908471	.	G	A	46.40	LowQual	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=4.79;MQ=51.77;MQ0=0;QD=1.93;SB=-32.97	GT:AD:DP:GL:GQ	0/1:20,4:22:-14.55,-6.63,-62.87:79.23
-chr1	2908486	.	G	A	26.78	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=9.20;MQ=53.95;MQ0=0;QD=1.12;SB=-23.58	GT:AD:DP:GL:GQ	0/1:21,3:20:-11.99,-6.02,-60.39:59.60
-chr1	2908487	.	G	A	23.81	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=9.20;MQ=53.95;MQ0=0;QD=0.99;SB=-23.59	GT:AD:DP:GL:GQ	0/1:21,3:20:-11.69,-6.03,-57.69:56.63
-chr1	2908489	rs7413322	A	G	127.27	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=7.20;MQ=53.67;MQ0=0;QD=5.53;SB=-41.81	GT:AD:DP:GL:GQ	0/1:15,7:21:-22.34,-6.33,-53.28:99
-chr1	2908502	.	G	A	0.58	PASS	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=3.89;MQ=54.56;MQ0=0;OQ=132.59;QD=4.28;SB=-84.55	GT:AD:DP:GL:GQ	0/1:22,9:26:-24.37,-7.83,-71.82:99
-chr1	2908503	.	G	A	2.61	PASS	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=3.89;MQ=54.56;MQ0=0;OQ=189.68;QD=6.12;SB=-101.89	GT:AD:DP:GL:GQ	0/1:22,9:28:-30.69,-8.44,-70.32:99
-chr1	2908532	.	T	C	3.50	PASS	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=3.76;MQ=54.67;MQ0=0;OQ=250.55;QD=6.77;SB=-66.91	GT:AD:DP:GL:GQ	0/1:24,13:35:-38.89,-10.55,-92.28:99
-chr1	2908533	.	G	A	0.93	PASS	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=4.66;MQ=54.15;MQ0=0;OQ=217.08;QD=5.71;SB=-54.22	GT:AD:DP:GL:GQ	0/1:25,13:33:-34.93,-9.94,-84.25:99
-chr1	2908644	.	G	A	90.84	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=1;HaplotypeScore=1.24;MQ=55.47;MQ0=0;OQ=799.27;QD=15.67;SB=-377.10	GT:AD:DP:GL:GQ	0/1:25,26:51:-98.58,-15.37,-88.82:99
-chr1	2908650	.	T	C	65.40	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=55.56;MQ0=0;OQ=744.55;QD=14.32;SB=-322.26	GT:AD:DP:GL:GQ	0/1:26,26:52:-93.41,-15.67,-101.68:99
-chr1	2908671	.	T	C	96.67	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=55.57;MQ0=0;OQ=663.38;QD=13.01;SB=-328.92	GT:AD:DP:GL:GQ	0/1:26,25:50:-84.69,-15.07,-101.18:99
-chr1	2908691	rs7524813	A	G	287.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=53.53;MQ0=0;OQ=655.21;QD=13.10;SB=-352.07	GT:AD:DP:GL:GQ	0/1:22,28:47:-82.98,-14.17,-84.04:99
-chr1	2908767	.	C	T	11.79	PASS	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=50.29;MQ0=0;OQ=630.57;QD=18.02;SB=-203.89	GT:AD:DP:GL:GQ	0/1:14,21:32:-75.99,-9.65,-40.87:99
-chr1	2908798	rs7520336	C	T	363.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=53.82;MQ0=0;OQ=459.08;QD=13.12;SB=-219.69	GT:AD:DP:GL:GQ	0/1:20,15:31:-58.54,-9.34,-53.07:99
-chr1	2909329	rs6424067	A	G	0.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=4;HaplotypeScore=3.24;MQ=54.59;MQ0=0;OQ=434.74;QD=9.88;SB=-243.29	GT:AD:DP:GL:GQ	0/1:26,18:41:-59.12,-12.36,-92.44:99
-chr1	2909490	rs12025062	C	T	390.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.85;MQ0=0;OQ=616.92;QD=11.64;SB=-324.31	GT:AD:DP:GL:GQ	0/1:32,21:52:-80.64,-15.67,-112.78:99
-chr1	2909802	rs12022429	G	A	318.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=605.69;QD=12.36;SB=-271.15	GT:AD:DP:GL:GQ	0/1:27,22:47:-78.02,-14.16,-93.88:99
-chr1	2909879	rs12025167	C	T	200.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.12;MQ=58.32;MQ0=0;OQ=594.51;QD=15.24;SB=-283.81	GT:AD:DP:GL:GQ	0/1:20,19:35:-73.29,-10.56,-48.45:99
-chr1	2909902	rs12022456	G	A	164.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=4.51;MQ=58.51;MQ0=0;OQ=722.60;QD=16.42;SB=-335.48	GT:AD:DP:GL:GQ	0/1:20,24:41:-87.91,-12.37,-56.64:99
-chr1	2910018	rs16823332	C	T	243.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=942.08;QD=19.23;SB=-418.46	GT:AD:DP:GL:GQ	0/1:20,28:45:-111.06,-13.56,-54.54:99
-chr1	2910291	rs12066017	A	G	366.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=575.67;QD=14.76;SB=-270.53	GT:AD:DP:GL:GQ	0/1:19,20:38:-72.30,-11.45,-69.20:99
-chr1	2911142	.	G	A	41.67	PASS	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=1;HaplotypeScore=2.51;MQ=59.36;MQ0=0;OQ=1099.50;QD=16.92;SB=-501.68	GT:AD:DP:GL:GQ	0/1:32,33:61:-131.61,-18.38,-102.89:99
-chr1	2911277	.	C	G	44.53	PASS	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.86;MQ=58.95;MQ0=0;OQ=436.44;QD=10.91;SB=-233.06	GT:AD:DP:GL:GQ	0/1:26,14:40:-58.99,-12.06,-109.38:99
-chr1	2911306	.	G	C	234.71	PASS	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.10;MQ0=0;OQ=519.44;QD=14.04;SB=-251.08	GT:AD:DP:GL:GQ	0/1:21,16:36:-66.08,-10.85,-90.14:99
-chr1	2911720	rs16823335	G	A	261.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=2.20;MQ=59.20;MQ0=0;OQ=681.92;QD=11.76;SB=-297.82	GT:AD:DP:GL:GQ	0/1:33,24:53:-87.45,-15.98,-100.90:99
-chr1	2912187	rs12028094	C	T	355.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.31;MQ0=0;OQ=839.47;QD=15.55;SB=-427.81	GT:AD:DP:GL:GQ	0/1:28,26:51:-102.60,-15.37,-81.01:99
-chr1	2912604	rs10797377	G	A	324.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.07;MQ=59.31;MQ0=0;OQ=1121.19;QD=18.38;SB=-566.38	GT:AD:DP:GL:GQ	0/1:27,34:59:-133.18,-17.78,-89.26:99
-chr1	2913061	.	G	A	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=14.44;MQ=58.67;MQ0=0;OQ=1557.84;QD=18.11;SB=-803.34	GT:AD:DP:GL:GQ	0/1:39,47:82:-183.77,-24.70,-131.16:99
-chr1	2913244	rs12063869	T	A	356.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.21;MQ0=0;OQ=1259.24;QD=16.35;SB=-327.01	GT:AD:DP:GL:GQ	0/1:37,40:76:-152.10,-22.89,-141.13:99
-chr1	2913685	.	T	A	78.15	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=72;Dels=0.01;HRun=7;HaplotypeScore=10.99;MQ=58.04;MQ0=0;QD=1.09;SB=89.27	GT:AD:DP:GL:GQ	0/1:54,17:56:-27.67,-16.57,-168.58:99
-chr1	2914586	rs2889476	T	C	86.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=59.50;MQ0=0;OQ=1018.41;QD=13.58;SB=-348.57	GT:AD:DP:GL:GQ	0/1:38,37:73:-127.11,-21.99,-156.39:99
-chr1	2915216	.	C	A	133.06	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=840.99;QD=15.57;SB=-328.03	GT:AD:DP:GL:GQ	0/1:26,28:54:-103.65,-16.27,-91.36:99
-chr1	2915282	rs946175	A	G	382.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.34;MQ0=0;OQ=951.27;QD=13.59;SB=-404.30	GT:AD:DP:GL:GQ	0/1:37,33:69:-119.20,-20.78,-144.79:99
-chr1	2915357	rs946176	C	T	193.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=2.81;MQ=60.00;MQ0=0;OQ=877.87;QD=15.14;SB=-352.31	GT:AD:DP:GL:GQ	0/1:30,28:58:-108.55,-17.48,-106.40:99
-chr1	2915382	rs946177	A	G	311.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=60.00;MQ0=0;OQ=696.00;QD=12.21;SB=-254.19	GT:AD:DP:GL:GQ	0/1:29,28:55:-89.46,-16.58,-112.38:99
-chr1	2916239	rs2027262	T	C	443.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=530.92;QD=9.65;SB=-168.92	GT:AD:DP:GL:GQ	0/1:28,27:51:-71.75,-15.38,-111.87:99
-chr1	2916397	rs2027263	A	G	6.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=4.33;MQ=58.92;MQ0=0;OQ=1007.60;QD=17.99;SB=-520.31	GT:AD:DP:GL:GQ	0/1:22,34:54:-120.31,-16.27,-82.47:99
-chr1	2916415	rs2027264	G	A	412.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.63;MQ0=0;OQ=890.12;QD=17.45;SB=-464.45	GT:AD:DP:GL:GQ	0/1:23,27:49:-107.06,-14.77,-75.59:99
-chr1	2916645	.	C	T	34.34	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=56.98;MQ0=0;OQ=878.75;QD=16.90;SB=-242.23	GT:AD:DP:GL:GQ	0/1:24,28:50:-106.23,-15.07,-83.70:99
-chr1	2916833	rs11802804	T	G	172.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=4.04;MQ=53.08;MQ0=1;OQ=929.71;QD=12.91;SB=-466.74	GT:AD:DP:GL:GQ	0/1:38,34:69:-117.04,-20.78,-128.73:99
-chr1	2916871	.	T	G	0.62	PASS	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=5.93;MQ=46.04;MQ0=1;OQ=612.93;QD=10.57;SB=-101.87	GT:AD:DP:GL:GQ	0/1:33,25:54:-80.84,-16.27,-108.92:99
-chr1	2916874	.	G	A	4.25	PASS	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=3.93;MQ=45.85;MQ0=1;OQ=812.26;QD=13.32;SB=-234.49	GT:AD:DP:GL:GQ	0/1:33,28:56:-101.38,-16.87,-110.18:99
-chr1	2917035	rs12028439	A	G	6.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=4.28;MQ=54.23;MQ0=0;OQ=1040.90;QD=18.93;SB=-369.97	GT:AD:DP:GL:GQ	0/1:20,35:53:-123.34,-15.97,-76.66:99
-chr1	2917114	rs12024879	G	A	187.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.10;MQ=55.08;MQ0=0;OQ=934.32;QD=17.30;SB=-362.51	GT:AD:DP:GL:GQ	0/1:25,29:52:-112.38,-15.67,-83.45:99
-chr1	2917331	rs12027818	C	T	143.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=58.15;MQ0=1;OQ=1252.97;QD=20.21;SB=-536.07	GT:AD:DP:GL:GQ	0/1:25,37:61:-146.97,-18.38,-79.78:99
-chr1	2917538	rs12027883	C	T	346.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=58.55;MQ0=0;OQ=1081.24;QD=14.42;SB=-345.82	GT:AD:DP:GL:GQ	0/1:42,33:74:-133.70,-22.29,-151.25:99
-chr1	2918836	rs6681651	C	T	64.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=454.13;QD=15.66;SB=-29.51	GT:AD:DP:GL:GQ	0/1:13,16:27:-56.83,-8.14,-47.37:99
-chr1	2921187	rs6691208	C	A	92.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.63;MQ0=0;OQ=715.52;QD=11.36;SB=-355.27	GT:AD:DP:GL:GQ	0/1:37,26:61:-93.21,-18.38,-116.36:99
-chr1	2921274	rs4357486	G	C	320.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=59.45;MQ0=0;OQ=673.44;QD=16.03;SB=-361.79	GT:AD:DP:GL:GQ	0/1:20,22:41:-83.00,-12.37,-84.03:99
-chr1	2921300	rs4486390	C	T	182.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=3.96;MQ=59.45;MQ0=0;OQ=737.41;QD=17.56;SB=-360.43	GT:AD:DP:GL:GQ	0/1:18,24:38:-88.48,-11.46,-48.81:99
-chr1	2922007	rs59869348	T	C	59.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=2.22;MQ=59.22;MQ0=0;OQ=864.59;QD=16.01;SB=-414.28	GT:AD:DP:GL:GQ	0/1:23,31:52:-105.41,-15.67,-90.49:99
-chr1	2922076	rs59041920	C	T	58.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=4.59;MQ=59.36;MQ0=0;OQ=1222.53;QD=18.81;SB=-446.93	GT:AD:DP:GL:GQ	0/1:26,38:58:-143.01,-17.47,-78.18:99
-chr1	2922420	.	C	T	142.55	PASS	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=58.20;MQ0=0;OQ=828.62;QD=13.81;SB=-355.45	GT:AD:DP:GL:GQ	0/1:34,26:58:-103.62,-17.47,-119.28:99
-chr1	2922927	.	A	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=1;HaplotypeScore=3.70;MQ=45.44;MQ0=1;OQ=81.65;QD=2.92;SB=-41.94	GT:AD:DP:GL:GQ	0/1:20,8:20:-17.47,-6.02,-59.35:99
-chr1	2923073	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=21;Dels=0.05;HRun=1;HaplotypeScore=30.97;MQ=45.34;MQ0=0;OQ=111.92;QD=5.33;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,8:13:-18.39,-3.92,-26.21:99
-chr1	2923110	.	A	C	47.42	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=28.91;MQ=36.30;MQ0=0;QD=3.65;SB=5.05	GT:AD:DP:GL:GQ	0/1:6,4:10:-13.77,-5.74,-26.81:80.25
-chr1	2923762	rs6680573	C	G	6.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=3.37;MQ=60.00;MQ0=0;OQ=313.93;QD=10.46;SB=-109.66	GT:AD:DP:GL:GQ	0/1:20,10:28:-43.13,-8.46,-67.50:99
-chr1	2924595	rs56200661	C	T	138.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=58.81;MQ0=0;OQ=702.85;QD=18.02;SB=-315.84	GT:AD:DP:GL:GQ	0/1:17,22:37:-84.72,-11.16,-50.65:99
-chr1	2924706	.	G	A	66.14	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.09;MQ0=0;OQ=681.79;QD=16.63;SB=-295.78	GT:AD:DP:GL:GQ	0/1:19,22:39:-83.22,-11.75,-60.51:99
-chr1	2926246	rs12564456	C	G	10.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=2.61;MQ=58.69;MQ0=0;OQ=646.12;QD=12.92;SB=-206.63	GT:AD:DP:GL:GQ	0/1:26,24:45:-81.49,-13.60,-94.41:99
-chr1	2926340	rs10752732	T	C	133.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.12;MQ=58.78;MQ0=0;OQ=1282.63;QD=33.75;SB=-620.25	GT:AD:DP:GL:GQ	1/1:0,38:38:-131.87,-11.45,-0.02:99
-chr1	2926606	rs55949537	A	T	46.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=3.14;MQ=59.67;MQ0=0;OQ=1017.41;QD=14.13;SB=-469.52	GT:AD:DP:GL:GQ	0/1:36,35:69:-125.81,-20.79,-130.04:99
-chr1	2926614	rs55784203	G	T	254.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=59.65;MQ0=0;OQ=972.92;QD=14.31;SB=-412.15	GT:AD:DP:GL:GQ	0/1:33,35:66:-120.46,-19.89,-108.03:99
-chr1	2926663	rs56091202	A	G	268.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.61;MQ=59.60;MQ0=0;OQ=738.64;QD=12.74;SB=-307.21	GT:AD:DP:GL:GQ	0/1:29,29:57:-94.32,-17.18,-112.23:99
-chr1	2926891	.	A	G	0.34	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=3;HaplotypeScore=3.44;MQ=59.42;MQ0=0;OQ=538.71;QD=11.22;SB=-143.63	GT:AD:DP:GL:GQ	0/1:27,21:47:-71.31,-14.16,-109.92:99
-chr1	2927088	rs61266721	G	A	167.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=3.88;MQ=59.23;MQ0=0;OQ=1016.77;QD=16.95;SB=-453.45	GT:AD:DP:GL:GQ	0/1:30,30:57:-122.14,-17.18,-86.53:99
-chr1	2927410	rs12033927	A	G	358.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=1.45;MQ=59.13;MQ0=0;OQ=706.05;QD=14.71;SB=-368.25	GT:AD:DP:GL:GQ	0/1:23,25:48:-88.35,-14.46,-94.54:99
-chr1	2927411	rs12034794	T	G	337.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.45;MQ=59.15;MQ0=0;OQ=614.57;QD=12.54;SB=-294.80	GT:AD:DP:GL:GQ	0/1:24,25:47:-78.90,-14.16,-89.23:99
-chr1	2928125	rs4576609	C	T	277.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=4.12;MQ=57.60;MQ0=0;OQ=875.52;QD=14.35;SB=-423.82	GT:AD:DP:GL:GQ	0/1:31,30:59:-108.62,-17.78,-98.44:99
-chr1	2928429	rs35806103	C	T	10.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=2.15;MQ=59.80;MQ0=0;OQ=886.08;QD=19.69;SB=-315.84	GT:AD:DP:GL:GQ	0/1:17,27:42:-104.54,-12.65,-59.38:99
-chr1	2928557	rs3795262	T	G	88	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.78;MQ0=0;OQ=296.95;QD=7.81;SB=-58.83	GT:AD:DP:GL:GQ	0/1:21,17:33:-42.92,-9.94,-74.02:99
-chr1	2928784	.	T	G	4.50	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=2;HaplotypeScore=2.61;MQ=58.98;MQ0=0;OQ=615.11;QD=15.00;SB=-301.85	GT:AD:DP:GL:GQ	0/1:17,24:38:-76.24,-11.45,-59.09:99
-chr1	2929872	rs55873718	A	G	218.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.73;MQ0=0;OQ=845.74;QD=10.07;SB=-404.66	GT:AD:DP:GL:GQ	0/1:48,36:83:-112.88,-25.02,-189.40:99
-chr1	2930858	rs56176404	A	G	226.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.44;MQ0=0;OQ=1022.49;QD=13.82;SB=-491.10	GT:AD:DP:GL:GQ	0/1:38,36:73:-127.52,-21.99,-154.69:99
-chr1	2932289	rs55885250	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.04;HRun=0;HaplotypeScore=32.21;MQ=45.88;MQ0=1;OQ=148.06;QD=1.90;SB=104.37	GT:AD:DP:GL:GQ	0/1:58,16:68:-38.29,-20.20,-216.63:99
-chr1	2932299	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=92;Dels=0.02;HRun=0;HaplotypeScore=97.52;MQ=43.85;MQ0=0;OQ=59.90;QD=0.65;SB=104.31	GT:AD:DP:GL:GQ	0/1:78,12:69:-29.77,-20.49,-208.32:92.74
-chr1	2932325	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=91;Dels=0.02;HRun=1;HaplotypeScore=195.32;MQ=42.40;MQ0=0;OQ=612.63;QD=6.73;SB=-162.19	GT:AD:DP:GL:GQ	0/1:51,38:73:-86.24,-21.70,-183.14:99
-chr1	2932341	.	A	G	250.48	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=1;HaplotypeScore=40.55;MQ=40.81;MQ0=0;QD=2.04;SB=89.32	GT:AD:DP:GL:GQ	0/1:96,27:107:-60.57,-32.24,-364.33:99
-chr1	2932343	.	G	A	487.06	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=123;Dels=0.01;HRun=0;HaplotypeScore=44.00;MQ=40.81;MQ0=0;QD=3.96;SB=58.75	GT:AD:DP:GL:GQ	0/1:99,23:108:-84.22,-32.23,-314.56:99
-chr1	2932349	.	G	A	708.07	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=1;HaplotypeScore=35.72;MQ=40.62;MQ0=0;QD=5.80;SB=89.29	GT:AD:DP:GL:GQ	0/1:95,27:119:-109.94,-35.84,-335.64:99
-chr1	2932354	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=126;Dels=0.00;HRun=0;HaplotypeScore=77.99;MQ=40.25;MQ0=0;OQ=691.65;QD=5.49;SB=86.28	GT:AD:DP:GL:GQ	0/1:97,29:123:-109.51,-37.06,-349.27:99
-chr1	2932376	.	T	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=2;HaplotypeScore=11.36;MQ=39.42;MQ0=0;OQ=679.31;QD=5.27;SB=92.31	GT:AD:DP:GL:GQ	0/1:96,32:117:-106.47,-35.26,-303.35:99
-chr1	2932379	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=125;Dels=0.01;HRun=1;HaplotypeScore=36.27;MQ=39.15;MQ0=0;OQ=716.76;QD=5.73;SB=92.27	GT:AD:DP:GL:GQ	0/1:94,28:121:-111.11,-36.16,-333.12:99
-chr1	2932387	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=36.67;MQ=38.20;MQ0=0;OQ=140.95;QD=1.25;SB=77.24	GT:AD:DP:GL:GQ	0/1:93,19:101:-47.83,-30.45,-304.67:99
-chr1	2932417	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=80.35;MQ=36.74;MQ0=0;OQ=291.45;QD=2.83;SB=86.26	GT:AD:DP:GL:GQ	0/1:76,27:77:-55.63,-23.21,-217.09:99
-chr1	2932437	.	G	A	14.74	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=80.96;MQ=35.05;MQ0=0;QD=0.16;SB=80.26	GT:AD:DP:GL:GQ	0/1:79,12:67:-24.93,-20.19,-214.14:47.43
-chr1	2932441	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=78.31;MQ=34.28;MQ0=0;OQ=251.61;QD=2.83;SB=77.24	GT:AD:DP:GL:GQ	0/1:70,19:66:-48.33,-19.89,-185.59:99
-chr1	2932450	rs55992205	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=52.98;MQ=32.53;MQ0=0;OQ=616.18;QD=7.16;SB=92.26	GT:AD:DP:GL:GQ	0/1:64,22:76:-87.80,-22.90,-186.06:99
-chr1	2932474	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=98;Dels=0.05;HRun=0;HaplotypeScore=121.87;MQ=31.47;MQ0=0;OQ=770.86;QD=7.87;SB=104.31	GT:AD:DP:GL:GQ	0/1:66,27:80:-104.48,-24.11,-189.46:99
-chr1	2932495	.	A	G	458.76	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=1;HaplotypeScore=104.10;MQ=35.05;MQ0=0;QD=4.59;SB=98.32	GT:AD:DP:GL:GQ	0/1:77,23:78:-72.67,-23.51,-220.09:99
-chr1	2932498	.	G	A	771.99	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=0;HaplotypeScore=85.95;MQ=35.28;MQ0=0;QD=8.04;SB=59.63	GT:AD:DP:GL:GQ	0/1:70,26:76:-103.38,-22.90,-174.72:99
-chr1	2932501	.	G	A	15.55	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=78.10;MQ=36.15;MQ0=0;QD=0.16;SB=-7.88	GT:AD:DP:GL:GQ	0/1:82,13:64:-24.12,-19.29,-198.59:48.26
-chr1	2932516	.	A	G	437.11	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=100;Dels=0.02;HRun=2;HaplotypeScore=90.55;MQ=38.01;MQ0=0;QD=4.37;SB=68.24	GT:AD:DP:GL:GQ	0/1:78,20:76:-69.30,-22.30,-207.20:99
-chr1	2932519	.	A	G	420.64	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=1;HaplotypeScore=127.72;MQ=37.64;MQ0=1;QD=3.72;SB=86.29	GT:AD:DP:GL:GQ	0/1:90,23:88:-71.87,-26.52,-261.50:99
-chr1	2932522	.	A	G	354.05	SnpCluster	AC=1;AF=0.50;AN=2;DP=116;Dels=0.02;HRun=1;HaplotypeScore=155.74;MQ=37.22;MQ0=2;QD=3.05;SB=-178.30	GT:AD:DP:GL:GQ	0/1:89,24:100:-68.22,-29.53,-308.19:99
-chr1	2932531	.	G	A	40.28	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=127;Dels=0.02;HRun=0;HaplotypeScore=95.96;MQ=37.07;MQ0=3;QD=0.32;SB=-35.75	GT:AD:DP:GL:GQ	0/1:114,11:85:-32.32,-25.01,-255.84:73.11
-chr1	2932543	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=125;Dels=0.00;HRun=0;HaplotypeScore=90.42;MQ=36.51;MQ0=3;OQ=448.17;QD=3.59;SB=-29.75	GT:AD:DP:GL:GQ	0/1:94,23:99:-91.60,-43.50,-272.82:99
-chr1	2932549	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=1;HaplotypeScore=106.24;MQ=36.58;MQ0=3;OQ=776.41;QD=6.81;SB=20.21	GT:AD:DP:GL:GQ	0/1:80,34:91:-108.36,-27.43,-223.52:99
-chr1	2932558	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=87.01;MQ=36.91;MQ0=2;OQ=55.94;QD=0.53;SB=50.16	GT:AD:DP:GL:GQ	0/1:89,16:77:-32.08,-23.20,-238.58:88.78
-chr1	2932594	.	A	G	95.90	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=101;Dels=0.01;HRun=2;HaplotypeScore=79.79;MQ=37.41;MQ0=0;QD=0.95;SB=41.16	GT:AD:DP:GL:GQ	0/1:85,15:78:-36.37,-23.50,-267.93:99
-chr1	2932595	.	G	T	858.77	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=99;Dels=0.01;HRun=0;HaplotypeScore=92.92;MQ=37.56;MQ0=0;QD=8.67;SB=50.17	GT:AD:DP:GL:GQ	0/1:57,41:82:-113.86,-24.70,-181.24:99
-chr1	2932597	.	A	G	613.75	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=100;Dels=0.01;HRun=2;HaplotypeScore=83.48;MQ=37.85;MQ0=0;QD=6.14;SB=53.19	GT:AD:DP:GL:GQ	0/1:69,29:84:-89.97,-25.31,-224.02:99
-chr1	2932647	.	A	G	424.25	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=1;HaplotypeScore=36.34;MQ=40.26;MQ0=1;QD=3.82;SB=65.23	GT:AD:DP:GL:GQ	0/1:87,24:95:-74.33,-28.62,-285.65:99
-chr1	2932650	.	G	A	15.47	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=0;HaplotypeScore=35.26;MQ=39.92;MQ0=1;QD=0.13;SB=83.21	GT:AD:DP:GL:GQ	0/1:106,9:104:-36.16,-31.34,-318.46:48.18
-chr1	2932656	.	G	A	597.61	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=0;HaplotypeScore=41.23;MQ=39.70;MQ0=1;QD=5.24;SB=83.24	GT:AD:DP:GL:GQ	0/1:85,29:104:-94.39,-31.34,-268.84:99
-chr1	2932671	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=1;HaplotypeScore=55.64;MQ=38.11;MQ0=1;OQ=790.23;QD=6.17;SB=74.25	GT:AD:DP:GL:GQ	0/1:94,34:113:-116.34,-34.04,-292.03:99
-chr1	2932680	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=0;HaplotypeScore=32.69;MQ=37.68;MQ0=1;OQ=1237.37;QD=9.67;SB=74.20	GT:AD:DP:GL:GQ	0/1:85,43:122:-163.79,-36.76,-270.86:99
-chr1	2932682	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=0;HaplotypeScore=26.80;MQ=37.61;MQ0=1;OQ=704.94;QD=5.42;SB=71.27	GT:AD:DP:GL:GQ	0/1:103,27:122:-110.54,-36.77,-411.49:99
-chr1	2932721	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=36.50;MQ=39.93;MQ0=0;OQ=181.45;QD=1.51;SB=92.30	GT:AD:DP:GL:GQ	0/1:93,27:104:-52.76,-31.33,-321.47:99
-chr1	2932727	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=27.86;MQ=40.16;MQ0=0;OQ=588.52;QD=5.35;SB=83.30	GT:AD:DP:GL:GQ	0/1:83,27:109:-94.97,-32.83,-329.92:99
-chr1	2932738	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=1;HaplotypeScore=39.11;MQ=39.53;MQ0=0;OQ=873.00;QD=7.94;SB=74.25	GT:AD:DP:GL:GQ	0/1:74,36:108:-123.12,-32.54,-289.99:99
-chr1	2932769	.	G	A	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=7.13;MQ=40.78;MQ0=0;OQ=619.13;QD=6.59;SB=56.17	GT:AD:DP:GL:GQ	0/1:71,23:91:-92.61,-27.42,-231.77:99
-chr1	2933043	rs7412983	A	C	563.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=861.61;QD=12.67;SB=-438.69	GT:AD:DP:GL:GQ	0/1:37,31:65:-109.02,-19.58,-126.93:99
-chr1	2933258	rs58265521	C	A	261.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=59.67;MQ0=0;OQ=928.26;QD=16.29;SB=-439.21	GT:AD:DP:GL:GQ	0/1:24,33:53:-112.08,-15.97,-65.68:99
-chr1	2933528	rs60287244	A	G	23.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=7.04;MQ=58.03;MQ0=0;OQ=739.69;QD=12.98;SB=-372.23	GT:AD:DP:GL:GQ	0/1:30,27:55:-93.82,-16.57,-116.71:99
-chr1	2933898	rs12034766	A	G	35.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=3;HaplotypeScore=1.69;MQ=58.27;MQ0=0;OQ=600.73;QD=11.12;SB=-275.56	GT:AD:DP:GL:GQ	0/1:26,28:51:-78.73,-15.38,-104.98:99
-chr1	2933946	rs12033401	C	T	155.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=3.82;MQ=57.46;MQ0=0;OQ=525.20;QD=14.19;SB=-282.22	GT:AD:DP:GL:GQ	0/1:16,21:31:-65.15,-9.35,-44.32:99
-chr1	2934531	rs57893585	T	A	124.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.24;MQ0=0;OQ=372.99;QD=15.54;SB=-168.83	GT:AD:DP:GL:GQ	0/1:10,14:21:-46.91,-6.33,-28.06:99
-chr1	2935764	rs12035292	C	T	0.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=10.18;MQ=43.51;MQ0=2;OQ=248.84;QD=4.70;SB=-149.59	GT:AD:DP:GL:GQ	0/1:30,23:31:-37.51,-9.34,-74.68:99
-chr1	2935800	rs6693975	G	A	0.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=6.49;MQ=45.50;MQ0=1;OQ=189.85;QD=4.75;SB=-111.56	GT:AD:DP:GL:GQ	0/1:24,16:23:-29.21,-6.94,-45.54:99
-chr1	2935836	rs6693982	G	A	38.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.48;MQ=49.72;MQ0=2;OQ=286.18;QD=6.36;SB=-139.13	GT:AD:DP:GL:GQ	0/1:25,20:29:-40.65,-8.75,-58.79:99
-chr1	2936586	rs12038530	T	A	386.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=538.23;QD=11.21;SB=-193.51	GT:AD:DP:GL:GQ	0/1:29,19:46:-70.96,-13.86,-104.56:99
-chr1	2937616	rs12037307	C	A	453.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=785.06;QD=15.10;SB=-326.01	GT:AD:DP:GL:GQ	0/1:25,27:52:-97.46,-15.67,-88.48:99
-chr1	2937769	rs12039548	T	C	374.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.69;MQ=59.62;MQ0=0;OQ=1018.45;QD=16.97;SB=-485.32	GT:AD:DP:GL:GQ	0/1:25,35:58:-122.60,-17.48,-90.45:99
-chr1	2937880	rs12034573	G	A	539.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.97;MQ0=0;OQ=601.18;QD=13.36;SB=-263.26	GT:AD:DP:GL:GQ	0/1:25,20:44:-76.67,-13.27,-77.09:99
-chr1	2938038	rs10909864	T	C	31.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=3.17;MQ=58.15;MQ0=0;OQ=603.85;QD=12.58;SB=-301.61	GT:AD:DP:GL:GQ	0/1:20,28:44:-76.94,-13.27,-79.42:99
-chr1	2938888	rs1890338	C	T	331.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.34;MQ=59.50;MQ0=0;OQ=622.92;QD=13.54;SB=-315.86	GT:AD:DP:GL:GQ	0/1:22,23:40:-77.64,-12.06,-61.98:99
-chr1	2939215	rs12039132	C	T	18.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.11;MQ=58.67;MQ0=0;OQ=590.59;QD=16.87;SB=-94.60	GT:AD:DP:GL:GQ	0/1:16,19:32:-71.99,-9.65,-41.59:99
-chr1	2939467	rs7514166	G	C	161.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=58.11;MQ0=0;OQ=380.76;QD=10.29;SB=-57.73	GT:AD:DP:GL:GQ	0/1:23,14:34:-51.61,-10.25,-87.39:99
-chr1	2939859	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=9;HaplotypeScore=3.75;MQ=51.46;MQ0=0;OQ=333.21;QD=11.49;SB=-54.83	GT:AD:DP:GL:GQ	0/1:17,12:25:-44.15,-7.55,-58.82:99
-chr1	2939927	rs34408665	T	C	431.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.91;MQ0=0;OQ=752.79;QD=11.76;SB=-348.05	GT:AD:DP:GL:GQ	0/1:32,32:61:-96.95,-18.39,-123.70:99
-chr1	2939954	rs58052947	T	C	258.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=58.84;MQ0=0;OQ=891.02;QD=13.92;SB=-428.88	GT:AD:DP:GL:GQ	0/1:28,36:63:-111.38,-19.00,-108.25:99
-chr1	2940097	rs56398543	G	A	185.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=57.77;MQ0=0;OQ=622.10;QD=14.81;SB=-266.78	GT:AD:DP:GL:GQ	0/1:21,21:40:-77.55,-12.06,-68.06:99
-chr1	2940194	rs6661908	G	A	424.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.03;MQ0=0;OQ=1140.17;QD=20.00;SB=-442.95	GT:AD:DP:GL:GQ	0/1:24,33:57:-134.47,-17.17,-86.30:99
-chr1	2940230	rs41334845	G	T	113.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.36;MQ0=0;OQ=1373.67;QD=21.13;SB=-590.07	GT:AD:DP:GL:GQ	0/1:21,44:63:-159.63,-18.98,-64.63:99
-chr1	2940454	rs6679678	T	C	216.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=522.35;QD=9.16;SB=-250.32	GT:AD:DP:GL:GQ	0/1:31,26:48:-69.99,-14.47,-101.54:99
-chr1	2940732	rs12042403	T	C	312.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=888.06;QD=12.51;SB=-433.91	GT:AD:DP:GL:GQ	0/1:39,32:70:-113.18,-21.09,-157.81:99
-chr1	2940746	rs12041583	A	G	452.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=809.95;QD=12.27;SB=-418.24	GT:AD:DP:GL:GQ	0/1:35,31:63:-103.26,-18.98,-134.35:99
-chr1	2940894	rs12041634	A	T	208.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=886.35;QD=14.77;SB=-371.51	GT:AD:DP:GL:GQ	0/1:30,30:60:-110.00,-18.08,-114.34:99
-chr1	2940901	rs12040299	C	T	487.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=953.57;QD=15.63;SB=-409.79	GT:AD:DP:GL:GQ	0/1:31,30:60:-116.73,-18.09,-97.56:99
-chr1	2941104	rs10489589	T	C	232.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=59.67;MQ0=0;OQ=498.13;QD=8.90;SB=-202.46	GT:AD:DP:GL:GQ	0/1:33,23:54:-69.37,-16.27,-132.36:99
-chr1	2941207	.	G	A	104.13	PASS	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=59.25;MQ0=0;OQ=904.38;QD=16.15;SB=-378.12	GT:AD:DP:GL:GQ	0/1:27,29:55:-110.29,-16.57,-94.24:99
-chr1	2941209	.	T	C	102.69	PASS	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=59.25;MQ0=0;OQ=663.66;QD=11.85;SB=-280.62	GT:AD:DP:GL:GQ	0/1:26,30:53:-85.63,-15.98,-103.85:99
-chr1	2941371	rs12408197	C	T	428.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=717.16;QD=12.36;SB=-246.23	GT:AD:DP:GL:GQ	0/1:33,25:52:-90.68,-15.68,-91.34:99
-chr1	2941666	.	T	C	142.44	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.70;MQ0=0;OQ=433.61;QD=8.50;SB=-223.24	GT:AD:DP:GL:GQ	0/1:30,21:49:-61.42,-14.77,-117.95:99
-chr1	2941694	rs10489588	G	A	184.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.01;MQ=58.17;MQ0=0;OQ=458.21;QD=8.98;SB=-152.21	GT:AD:DP:GL:GQ	0/1:34,17:47:-63.28,-14.17,-98.47:99
-chr1	2941849	.	C	T	36.18	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=3.75;MQ=59.44;MQ0=0;OQ=1385.60;QD=18.72;SB=-578.48	GT:AD:DP:GL:GQ	0/1:29,44:70:-162.94,-21.10,-91.88:99
-chr1	2942163	rs2017600	A	C	566.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=2376.48;QD=32.55;SB=-930.21	GT:AD:DP:GL:GQ	1/1:0,72:69:-241.26,-20.78,-0.03:99
-chr1	2942474	rs1005471	T	C	5.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=4;HaplotypeScore=1.12;MQ=60.00;MQ0=0;OQ=441.09;QD=10.02;SB=-191.58	GT:AD:DP:GL:GQ	0/1:27,17:44:-60.65,-13.26,-106.56:99
-chr1	2942683	rs9660819	C	T	0.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=5.17;MQ=58.20;MQ0=0;OQ=155.13;QD=5.97;SB=-65.81	GT:AD:DP:GL:GQ	0/1:19,7:24:-26.03,-7.23,-63.04:99
-chr1	2942700	rs9661525	T	G	36.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=59.11;MQ0=0;OQ=126.09;QD=4.85;SB=-19.97	GT:AD:DP:GL:GQ	0/1:19,7:25:-23.42,-7.53,-64.66:99
-chr1	2943003	.	G	A	0.16	PASS	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=59.14;MQ0=0;OQ=556.71;QD=20.62;SB=-180.72	GT:AD:DP:GL:GQ	0/1:10,17:27:-67.10,-8.14,-31.23:99
-chr1	2943693	rs16823392	C	G	180.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.22;MQ=57.09;MQ0=0;OQ=626.82;QD=16.07;SB=-312.19	GT:AD:DP:GL:GQ	0/1:21,18:38:-77.42,-11.46,-83.70:99
-chr1	2943891	.	A	G	12.02	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=54.82;MQ0=0;OQ=422.22;QD=8.28;SB=-205.52	GT:AD:DP:GL:GQ	0/1:33,18:49:-60.27,-14.76,-127.83:99
-chr1	2943911	.	C	T	10.41	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.91;MQ=52.84;MQ0=0;QD=0.25;SB=11.05	GT:AD:DP:GL:GQ	0/1:24,17:24:-11.53,-7.24,-65.03:42.84
-chr1	2943915	.	A	G	396.79	SnpCluster	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=3;HaplotypeScore=1.74;MQ=53.20;MQ0=0;QD=9.23;SB=-114.71	GT:AD:DP:GL:GQ	0/1:25,18:39:-54.71,-11.75,-89.79:99
-chr1	2943921	.	G	A	412.53	SnpCluster	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=53.30;MQ0=0;QD=10.31;SB=-110.52	GT:AD:DP:GL:GQ	0/1:23,17:37:-55.69,-11.15,-76.61:99
-chr1	2943983	.	T	C	18.12	PASS	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.49;MQ=57.65;MQ0=0;OQ=359.40;QD=9.46;SB=-125.65	GT:AD:DP:GL:GQ	0/1:21,17:36:-50.07,-10.85,-82.05:99
-chr1	2944025	.	C	T	103.45	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=58.94;MQ0=0;OQ=634.89;QD=13.23;SB=-327.90	GT:AD:DP:GL:GQ	0/1:27,21:45:-80.34,-13.56,-81.81:99
-chr1	2944063	.	C	T	0.51	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=4;HaplotypeScore=2.62;MQ=59.46;MQ0=0;OQ=776.27;QD=15.22;SB=-389.17	GT:AD:DP:GL:GQ	0/1:26,25:47:-95.07,-14.16,-76.30:99
-chr1	2944068	.	G	A	119.57	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.51;MQ=59.46;MQ0=0;OQ=782.48;QD=15.34;SB=-373.90	GT:AD:DP:GL:GQ	0/1:25,26:49:-96.29,-14.76,-89.91:99
-chr1	2944090	.	T	C	3.70	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=2;HaplotypeScore=2.56;MQ=59.48;MQ0=0;OQ=656.17;QD=12.38;SB=-215.36	GT:AD:DP:GL:GQ	0/1:27,26:49:-83.67,-14.77,-97.10:99
-chr1	2944157	.	T	C	29.83	PASS	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=59.30;MQ0=0;OQ=936.38;QD=15.61;SB=-205.50	GT:AD:DP:GL:GQ	0/1:27,33:58:-114.40,-17.47,-101.34:99
-chr1	2944208	rs4996810	A	C	0.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=3.45;MQ=56.26;MQ0=1;OQ=219.14;QD=3.48;SB=-132.81	GT:AD:DP:GL:GQ	0/1:47,15:56:-42.07,-16.87,-150.42:99
-chr1	2944226	.	G	A	136.97	PASS	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.40;MQ0=1;OQ=501.67;QD=8.36;SB=-261.69	GT:AD:DP:GL:GQ	0/1:41,19:55:-70.03,-16.58,-122.86:99
-chr1	2944238	.	T	C	5.54	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=54.51;MQ0=0;OQ=327.91;QD=6.43;SB=-156.50	GT:AD:DP:GL:GQ	0/1:37,14:48:-50.53,-14.46,-136.22:99
-chr1	2944239	.	T	C	1.08	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=4.23;MQ=54.83;MQ0=0;OQ=279.86;QD=5.18;SB=-104.43	GT:AD:DP:GL:GQ	0/1:40,14:49:-46.04,-14.77,-139.11:99
-chr1	2945018	rs12036378	G	A	163.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=59.58;MQ0=0;OQ=895.36;QD=16.28;SB=-275.78	GT:AD:DP:GL:GQ	0/1:27,28:53:-108.80,-15.98,-79.65:99
-chr1	2945105	rs55863899	C	G	134.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.52;MQ0=0;OQ=868.77;QD=18.10;SB=-284.96	GT:AD:DP:GL:GQ	0/1:21,27:46:-104.04,-13.88,-85.12:99
-chr1	2945790	.	A	G	4.08	PASS	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=57.28;MQ0=0;OQ=318.97;QD=15.19;SB=-83.80	GT:AD:DP:GL:GQ	0/1:8,13:20:-41.21,-6.03,-32.48:99
-chr1	2946023	rs10909865	A	G	147.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.15;MQ=60.00;MQ0=0;OQ=547.73;QD=10.74;SB=-195.64	GT:AD:DP:GL:GQ	0/1:24,27:47:-72.23,-14.17,-93.16:99
-chr1	2946442	.	A	G	66.31	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.61;MQ0=0;OQ=798.37;QD=10.79;SB=-385.01	GT:AD:DP:GL:GQ	0/1:39,35:70:-104.22,-21.10,-152.02:99
-chr1	2946526	rs2993510	T	C	256.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=59.44;MQ0=0;OQ=807.53;QD=9.73;SB=-328.89	GT:AD:DP:GL:GQ	0/1:47,36:81:-108.45,-24.41,-191.18:99
-chr1	2946859	rs12567620	T	G	251.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.22;MQ0=0;OQ=588.28;QD=9.97;SB=-221.33	GT:AD:DP:GL:GQ	0/1:35,23:57:-79.28,-17.17,-127.60:99
-chr1	2947460	rs12409277	T	C	554.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1261.63;QD=14.67;SB=-598.55	GT:AD:DP:GL:GQ	0/1:39,47:86:-155.36,-25.92,-158.90:99
-chr1	2948421	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=83;Dels=0.02;HRun=17;HaplotypeScore=13.52;MQ=50.26;MQ0=0;OQ=57.24;QD=0.69;SB=67.75	GT:AD:DP:GL:GQ	0/1:69,12:60:-26.49,-17.48,-170.55:90.07
-chr1	2948568	rs12044162	A	G	115.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=57.63;MQ0=0;OQ=498.67;QD=9.23;SB=-105.58	GT:AD:DP:GL:GQ	0/1:33,21:52:-68.82,-15.67,-126.86:99
-chr1	2949062	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=21.05;MQ=49.42;MQ0=0;OQ=103.70;QD=2.53;SB=-31.97	GT:AD:DP:GL:GQ	0/1:35,6:34:-23.91,-10.25,-88.62:99
-chr1	2949076	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=103.01;MQ=49.60;MQ0=0;OQ=345.15;QD=7.50;SB=-146.53	GT:AD:DP:GL:GQ	0/1:33,13:40:-49.87,-12.07,-111.45:99
-chr1	2949080	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=47.15;MQ=49.74;MQ0=0;OQ=115.37;QD=2.35;SB=-79.50	GT:AD:DP:GL:GQ	0/1:37,11:45:-31.37,-16.54,-140.93:99
-chr1	2949088	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=39.37;MQ=50.39;MQ0=0;OQ=395.27;QD=7.60;SB=-176.85	GT:AD:DP:GL:GQ	0/1:38,14:46:-56.68,-13.87,-100.52:99
-chr1	2949107	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=4.13;MQ=51.92;MQ0=0;OQ=58.43;QD=0.96;SB=-33.78	GT:AD:DP:GL:GQ	0/1:53,8:55:-25.70,-16.57,-188.08:91.26
-chr1	2949470	rs6692292	T	C	310.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=58.36;MQ0=0;OQ=1146.89;QD=15.93;SB=-322.30	GT:AD:DP:GL:GQ	0/1:33,39:71:-139.36,-21.39,-132.11:99
-chr1	2949881	rs56213325	G	A	8.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=3;HaplotypeScore=3.87;MQ=58.97;MQ0=0;OQ=1032.99;QD=16.40;SB=-387.12	GT:AD:DP:GL:GQ	0/1:30,33:61:-124.96,-18.37,-109.42:99
-chr1	2950052	rs12045368	A	G	278.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=53.32;MQ0=0;OQ=936.38;QD=14.41;SB=-275.26	GT:AD:DP:GL:GQ	0/1:28,37:62:-115.61,-18.69,-106.66:99
-chr1	2950232	rs10909866	C	T	182.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=57.68;MQ0=0;OQ=969.99;QD=15.90;SB=-309.81	GT:AD:DP:GL:GQ	0/1:32,29:61:-118.67,-18.38,-109.12:99
-chr1	2950468	rs12046233	A	G	39.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=2.71;MQ=59.23;MQ0=0;OQ=754.54;QD=12.58;SB=-279.44	GT:AD:DP:GL:GQ	0/1:30,30:55:-95.31,-16.57,-110.00:99
-chr1	2950650	rs12044848	C	T	194.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=59.52;MQ0=0;OQ=784.81;QD=16.35;SB=-285.29	GT:AD:DP:GL:GQ	0/1:24,24:47:-95.92,-14.16,-84.23:99
-chr1	2950883	.	C	A	3.38	PASS	AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=1;HaplotypeScore=2.94;MQ=60.00;MQ0=0;OQ=1395.15;QD=16.81;SB=-283.26	GT:AD:DP:GL:GQ	0/1:36,46:82:-170.17,-27.37,-127.09:99
-chr1	2951230	rs56088946	T	C	7.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=59.61;MQ0=0;OQ=1944.95;QD=16.34;SB=-964.49	GT:AD:DP:GL:GQ	0/1:53,66:118:-233.32,-35.54,-213.54:99
-chr1	2951262	rs10909867	G	T	333.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=59.76;MQ0=0;OQ=1581.91;QD=16.48;SB=-612.08	GT:AD:DP:GL:GQ	0/1:44,52:95:-190.09,-28.61,-155.75:99
-chr1	2952067	rs10909868	A	C	183.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=60.00;MQ0=0;OQ=929.11;QD=14.75;SB=-149.21	GT:AD:DP:GL:GQ	0/1:29,34:62:-114.87,-18.67,-108.28:99
-chr1	2952085	rs12048975	T	C	158.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=956.32;QD=14.94;SB=-180.58	GT:AD:DP:GL:GQ	0/1:30,34:62:-117.59,-18.68,-121.18:99
-chr1	2952452	rs2981859	G	A	525.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=2597.04;QD=39.95;SB=-874.18	GT:AD:DP:GL:GQ	1/1:0,65:65:-263.30,-19.58,-0.02:99
-chr1	2953353	rs7339938	G	C	184.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1644.05;QD=21.35;SB=-832.89	GT:AD:DP:GL:GQ	0/1:34,43:75:-190.30,-22.61,-128.08:99
-chr1	2954257	rs12044831	A	C	328.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.75;MQ0=0;OQ=969.03;QD=12.75;SB=-480.26	GT:AD:DP:GL:GQ	0/1:35,41:74:-122.48,-22.29,-132.71:99
-chr1	2956899	rs2993479	A	T	39.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=7.90;MQ=58.88;MQ0=0;OQ=639.75;QD=11.85;SB=-334.02	GT:AD:DP:GL:GQ	0/1:32,22:53:-83.22,-15.96,-119.83:99
-chr1	2958839	.	C	T	167.01	PASS	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.03;MQ0=0;OQ=1118.18;QD=16.69;SB=-463.99	GT:AD:DP:GL:GQ	0/1:31,36:62:-133.80,-18.70,-86.01:99
-chr1	2958843	.	G	C	98.75	PASS	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=58.98;MQ0=0;OQ=1122.63;QD=17.54;SB=-409.32	GT:AD:DP:GL:GQ	0/1:29,34:58:-133.03,-17.49,-113.54:99
-chr1	2960143	rs56298939	A	T	308.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.67;MQ0=0;OQ=788.46;QD=14.08;SB=-295.64	GT:AD:DP:GL:GQ	0/1:29,27:56:-99.00,-16.87,-109.64:99
-chr1	2960324	rs717795	T	C	9.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=3;HaplotypeScore=2.74;MQ=59.13;MQ0=0;OQ=443.35;QD=8.37;SB=-240.88	GT:AD:DP:GL:GQ	0/1:32,21:49:-62.39,-14.77,-120.82:99
-chr1	2961312	rs56069604	T	C	18.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=3;HaplotypeScore=0.73;MQ=58.64;MQ0=0;OQ=450.45;QD=14.53;SB=-212.67	GT:AD:DP:GL:GQ	0/1:13,18:29:-57.07,-8.74,-51.18:99
-chr1	2961381	rs2981857	T	C	166.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.57;MQ=60.00;MQ0=0;OQ=428.10;QD=15.29;SB=-207.68	GT:AD:DP:GL:GQ	0/1:10,18:28:-54.54,-8.45,-38.77:99
-chr1	2962384	rs2981856	T	C	282.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=862.73;QD=12.32;SB=-362.96	GT:AD:DP:GL:GQ	0/1:34,36:67:-109.75,-20.19,-134.76:99
-chr1	2963182	rs2993480	C	T	393.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=959.18;QD=15.72;SB=-400.92	GT:AD:DP:GL:GQ	0/1:31,30:60:-117.29,-18.09,-96.43:99
-chr1	2963293	rs2993481	A	T	141.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=2.01;MQ=59.62;MQ0=0;OQ=743.23;QD=12.39;SB=-349.56	GT:AD:DP:GL:GQ	0/1:34,26:58:-95.08,-17.48,-119.69:99
-chr1	2963436	rs1109251	G	A	197.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=1.34;MQ=60.00;MQ0=0;OQ=932.59;QD=15.04;SB=-469.42	GT:AD:DP:GL:GQ	0/1:34,28:62:-115.22,-18.68,-120.45:99
-chr1	2963924	.	A	G	132.32	PASS	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.54;MQ0=0;OQ=1229.61;QD=13.51;SB=-579.93	GT:AD:DP:GL:GQ	0/1:47,44:90:-153.35,-27.11,-189.83:99
-chr1	2964602	rs1125017	A	C	413.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=60.00;MQ0=0;OQ=773.70;QD=11.90;SB=-364.77	GT:AD:DP:GL:GQ	0/1:35,30:63:-99.63,-18.98,-121.64:99
-chr1	2964712	rs2376821	T	C	458.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.91;MQ0=0;OQ=2329.60;QD=30.25;SB=-1071.67	GT:AD:DP:GL:GQ	1/1:0,77:75:-236.63,-22.63,-0.08:99
-chr1	2964979	rs55775305	C	G	191.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=59.60;MQ0=0;OQ=1095.41;QD=18.89;SB=-526.68	GT:AD:DP:GL:GQ	0/1:27,31:56:-129.70,-16.87,-112.36:99
-chr1	2966676	rs1138513	T	C	342.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=60.00;MQ0=0;OQ=1004.23;QD=15.45;SB=-395.31	GT:AD:DP:GL:GQ	0/1:29,36:64:-122.99,-19.29,-112.84:99
-chr1	2967377	rs2981855	A	G	110.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=58.78;MQ0=0;OQ=2017.68;QD=35.40;SB=-766.96	GT:AD:DP:GL:GQ	1/1:0,57:57:-205.37,-17.17,-0.02:99
-chr1	2967903	rs2075969	G	C	175.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=59.42;MQ0=0;OQ=486.84;QD=12.17;SB=-253.09	GT:AD:DP:GL:GQ	0/1:21,19:36:-62.83,-10.86,-80.92:99
-chr1	2969034	rs41315262	C	T	141.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=432.24;QD=14.90;SB=-163.20	GT:AD:DP:GL:GQ	0/1:14,15:28:-54.95,-8.44,-49.21:99
-chr1	2970137	rs2072732	T	C	36.95	LowQual	AC=1;AF=0.50;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.39;MQ0=0;QD=4.11;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,4:7:-9.09,-2.11,-16.67:69.79
-chr1	2970438	.	C	T	1.69	PASS	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=3.02;MQ=60.00;MQ0=0;OQ=106.79;QD=5.62;SB=-10.00	GT:AD:DP:GL:GQ	0/1:13,5:16:-18.78,-4.82,-35.96:99
-chr1	2973178	rs2788091	T	C	354.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=59.56;MQ0=0;OQ=657.96;QD=12.65;SB=-286.58	GT:AD:DP:GL:GQ	0/1:29,23:52:-84.74,-15.66,-115.27:99
-chr1	2973823	rs2297828	G	A	18.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=95.21;QD=3.97;SB=-16.50	GT:AD:DP:GL:GQ	0/1:18,6:22:-19.43,-6.63,-57.66:99
-chr1	2975672	.	C	G	0.31	PASS	AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=1;HaplotypeScore=6.00;MQ=60.00;MQ0=0;OQ=69.47;QD=7.72;SB=-10.00	GT:AD:DP:GL:GQ	1/1:3,6:3:-10.44,-0.91,-0.01:9.02
-chr1	2977743	rs909510	G	C	79.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=3.50;MQ=58.73;MQ0=0;OQ=593.38;QD=17.98;SB=-309.99	GT:AD:DP:GL:GQ	0/1:15,18:31:-71.97,-9.35,-58.08:99
-chr1	2979403	rs1572656	T	G	132.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=58.39;MQ0=0;OQ=227.87;QD=7.86;SB=-74.87	GT:AD:DP:GL:GQ	0/1:16,12:27:-34.21,-8.14,-59.65:99
-chr1	2982894	rs2981889	T	C	0.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=4;HaplotypeScore=3.40;MQ=59.07;MQ0=0;OQ=530.79;QD=10.62;SB=-197.61	GT:AD:DP:GL:GQ	0/1:25,25:44:-69.63,-13.27,-84.86:99
-chr1	2983498	rs2993486	G	A	189.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.11;MQ0=0;OQ=2009.66;QD=38.65;SB=-804.34	GT:AD:DP:GL:GQ	1/1:0,52:51:-204.56,-15.36,-0.01:99
-chr1	2983667	rs2981888	C	G	249.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=760.63;QD=16.54;SB=-378.87	GT:AD:DP:GL:GQ	0/1:20,26:44:-92.63,-13.28,-85.11:99
-chr1	2984196	rs4648359	G	C	304.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=59.62;MQ0=0;OQ=739.36;QD=15.09;SB=-327.39	GT:AD:DP:GL:GQ	0/1:26,23:45:-90.79,-13.57,-98.24:99
-chr1	2984400	rs2788092	C	G	25.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=59.57;MQ0=0;OQ=997.66;QD=18.48;SB=-280.54	GT:AD:DP:GL:GQ	0/1:23,31:51:-118.43,-15.38,-97.87:99
-chr1	2985122	rs2742689	T	G	341.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=58.79;MQ0=0;OQ=737.00;QD=13.65;SB=-353.07	GT:AD:DP:GL:GQ	0/1:26,28:52:-92.65,-15.66,-91.92:99
-chr1	2985309	rs7515436	G	A	254.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=59.36;MQ0=0;OQ=1107.59;QD=17.04;SB=-525.74	GT:AD:DP:GL:GQ	0/1:30,35:61:-132.42,-18.38,-99.41:99
-chr1	2985493	rs2788093	C	T	164.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=52.54;MQ0=0;OQ=672.12;QD=14.61;SB=-188.18	GT:AD:DP:GL:GQ	0/1:25,21:45:-84.06,-13.57,-76.74:99
-chr1	2985947	.	G	A	42.58	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=2.35;MQ=59.42;MQ0=0;QD=1.06;SB=86.29	GT:AD:DP:GL:GQ	0/1:35,5:38:-18.99,-11.45,-122.25:75.41
-chr1	2986056	rs7525173	C	G	198.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=57.11;MQ0=0;OQ=1235.82;QD=21.68;SB=-610.55	GT:AD:DP:GL:GQ	0/1:22,35:54:-143.14,-16.27,-91.10:99
-chr1	2986416	rs1569420	C	G	131.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.22;MQ0=0;OQ=1047.24;QD=19.39;SB=-356.09	GT:AD:DP:GL:GQ	0/1:24,30:53:-123.98,-15.97,-102.98:99
-chr1	2986462	rs1569419	T	C	443.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1686.91;QD=29.59;SB=-810.28	GT:AD:DP:GL:GQ	1/1:0,57:54:-172.33,-16.29,-0.05:99
-chr1	2988794	rs2742686	T	C	110.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.81;MQ=59.55;MQ0=0;OQ=633.23;QD=12.42;SB=-265.98	GT:AD:DP:GL:GQ	0/1:26,25:48:-81.08,-14.47,-95.70:99
-chr1	2988858	rs10909873	C	G	203.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.25;MQ=59.51;MQ0=0;OQ=629.03;QD=13.38;SB=-304.03	GT:AD:DP:GL:GQ	0/1:24,23:43:-79.16,-12.98,-98.92:99
-chr1	2988928	rs2981886	T	G	27.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=1.77;MQ=60.00;MQ0=0;OQ=713.08;QD=17.39;SB=-342.06	GT:AD:DP:GL:GQ	0/1:16,25:41:-86.94,-12.35,-58.67:99
-chr1	2989062	rs2742685	T	C	91.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=3.60;MQ=59.38;MQ0=0;OQ=332.13;QD=8.98;SB=-168.61	GT:AD:DP:GL:GQ	0/1:21,16:36:-47.35,-10.86,-77.27:99
-chr1	2989275	rs760570	T	C	183.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.10;MQ=60.00;MQ0=0;OQ=452.99;QD=11.62;SB=-195.61	GT:AD:DP:GL:GQ	0/1:18,21:37:-59.74,-11.16,-71.21:99
-chr1	2989352	rs11580403	C	T	17.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=6.35;MQ=58.51;MQ0=0;OQ=786.31;QD=16.73;SB=-390.18	GT:AD:DP:GL:GQ	0/1:22,25:44:-95.18,-13.26,-64.65:99
-chr1	2989378	rs11581212	A	G	26.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=4.12;MQ=58.01;MQ0=0;OQ=610.70;QD=12.99;SB=-220.27	GT:AD:DP:GL:GQ	0/1:23,24:41:-76.70,-12.35,-80.42:99
-chr1	2989575	rs6674036	G	T	86.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=60.00;MQ0=0;OQ=295.75;QD=8.45;SB=-112.67	GT:AD:DP:GL:GQ	0/1:22,13:32:-42.50,-9.64,-70.40:99
-chr1	2989750	rs6683976	C	G	152.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=58.25;MQ0=0;OQ=588.86;QD=14.72;SB=-197.30	GT:AD:DP:GL:GQ	0/1:21,19:38:-73.63,-11.46,-80.42:99
-chr1	2989984	rs760569	A	G	0.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=3;HaplotypeScore=3.04;MQ=55.35;MQ0=1;OQ=203.26;QD=6.78;SB=-13.61	GT:AD:DP:GL:GQ	0/1:16,14:25:-31.15,-7.54,-61.01:99
-chr1	2990301	rs760568	A	G	305.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=56.76;MQ0=0;OQ=713.37;QD=13.99;SB=-336.34	GT:AD:DP:GL:GQ	0/1:22,29:50:-89.69,-15.07,-88.33:99
-chr1	2990325	rs760567	A	G	357.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=57.34;MQ0=0;OQ=769.95;QD=14.53;SB=-388.67	GT:AD:DP:GL:GQ	0/1:25,28:52:-95.94,-15.67,-100.59:99
-chr1	2990784	rs6695131	T	C	278.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.71;MQ=59.69;MQ0=0;OQ=1038.17;QD=17.02;SB=-324.30	GT:AD:DP:GL:GQ	0/1:25,36:59:-124.87,-17.77,-99.97:99
-chr1	2991113	rs760566	T	C	528.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.67;MQ0=0;OQ=1563.77;QD=31.91;SB=-755.58	GT:AD:DP:GL:GQ	1/1:0,49:46:-159.99,-13.86,-0.02:99
-chr1	2991563	rs6690540	C	T	182.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.74;MQ=58.34;MQ0=0;OQ=662.57;QD=14.72;SB=-343.52	GT:AD:DP:GL:GQ	0/1:23,22:42:-82.21,-12.67,-65.85:99
-chr1	2991617	rs2742682	T	C	232.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.38;MQ0=0;OQ=410.76;QD=11.10;SB=-215.29	GT:AD:DP:GL:GQ	0/1:16,19:33:-54.32,-9.96,-57.14:99
-chr1	2991708	rs2742681	T	G	14.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=58.98;MQ0=0;OQ=365.17;QD=8.91;SB=-102.16	GT:AD:DP:GL:GQ	0/1:24,17:38:-51.25,-11.45,-78.22:99
-chr1	2992174	rs2742680	C	G	300.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.13;MQ=58.66;MQ0=0;OQ=934.85;QD=17.98;SB=-447.39	GT:AD:DP:GL:GQ	0/1:22,30:49:-111.56,-14.79,-83.87:99
-chr1	2992195	rs2742679	C	T	269.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=58.13;MQ0=0;OQ=860.87;QD=17.22;SB=-384.13	GT:AD:DP:GL:GQ	0/1:23,27:48:-103.84,-14.47,-74.36:99
-chr1	2992210	rs2742678	G	A	296.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=57.39;MQ0=0;OQ=701.27;QD=15.58;SB=-336.35	GT:AD:DP:GL:GQ	0/1:23,22:43:-86.37,-12.96,-74.58:99
-chr1	2993392	rs11801109	G	A	5.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=59.59;MQ0=0;OQ=759.83;QD=16.52;SB=-91.91	GT:AD:DP:GL:GQ	0/1:23,23:45:-92.82,-13.56,-77.23:99
-chr1	2993874	rs2981883	T	C	12.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=4.37;MQ=58.95;MQ0=0;OQ=1316.25;QD=29.91;SB=-475.45	GT:AD:DP:GL:GQ	1/1:0,44:39:-135.23,-11.75,-0.02:99
-chr1	2994092	rs2981882	A	G	168.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=59.63;MQ0=0;OQ=1897.54;QD=30.61;SB=-828.34	GT:AD:DP:GL:GQ	1/1:0,62:61:-193.40,-18.40,-0.06:99
-chr1	2994217	rs2981881	T	C	270.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=58.88;MQ0=0;OQ=1946.57;QD=31.40;SB=-838.62	GT:AD:DP:GL:GQ	1/1:1,61:56:-198.26,-16.87,-0.02:99
-chr1	2994648	rs2981880	T	C	6.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=4.30;MQ=56.36;MQ0=0;OQ=1597.03;QD=34.72;SB=-433.18	GT:AD:DP:GL:GQ	1/1:0,45:44:-163.30,-13.25,-0.01:99
-chr1	2994734	rs2981879	T	C	43.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.75;MQ0=0;OQ=1057.22;QD=35.24;SB=-208.08	GT:AD:DP:GL:GQ	1/1:0,30:30:-109.32,-9.04,-0.01:90.26
-chr1	2994945	rs34014659	G	A	271.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.59;MQ0=1;OQ=187.11;QD=9.85;SB=-73.30	GT:AD:DP:GL:GQ	0/1:11,8:17:-27.12,-5.12,-33.00:99
-chr1	2995445	rs2981878	A	G	132.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=56.06;MQ0=1;OQ=382.82;QD=11.96;SB=-131.28	GT:AD:DP:GL:GQ	0/1:16,16:31:-50.91,-9.34,-62.42:99
-chr1	2995487	rs6676479	G	A	196.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=57.97;MQ0=1;OQ=534.41;QD=14.06;SB=-244.76	GT:AD:DP:GL:GQ	0/1:21,17:34:-66.98,-10.25,-53.48:99
-chr1	2995498	rs34884268	C	T	260.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=626.01;QD=14.90;SB=-317.32	GT:AD:DP:GL:GQ	0/1:22,20:41:-78.24,-12.36,-68.94:99
-chr1	2995610	rs34782467	G	A	183.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.56;MQ0=0;OQ=857.05;QD=16.48;SB=-325.85	GT:AD:DP:GL:GQ	0/1:26,26:50:-104.07,-15.08,-74.92:99
-chr1	2995991	rs926246	T	C	314.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=57.39;MQ0=0;OQ=671.24;QD=12.43;SB=-260.51	GT:AD:DP:GL:GQ	0/1:30,24:53:-86.37,-15.96,-115.93:99
-chr1	2996058	rs926245	C	A	105.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=53.36;MQ0=0;OQ=705.06;QD=12.82;SB=-99.80	GT:AD:DP:GL:GQ	0/1:29,26:52:-89.45,-15.66,-93.51:99
-chr1	2996143	rs926244	A	G	215.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=58.61;MQ0=0;OQ=1978.79;QD=31.92;SB=-947.90	GT:AD:DP:GL:GQ	1/1:0,60:58:-201.49,-17.47,-0.03:99
-chr1	2996175	rs926243	T	G	426.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.31;MQ0=0;OQ=690.75;QD=11.32;SB=-265.78	GT:AD:DP:GL:GQ	0/1:31,30:58:-89.83,-17.48,-108.47:99
-chr1	2996487	rs55932943	C	T	3.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=10.54;MQ=58.03;MQ0=1;OQ=1021.25;QD=14.80;SB=-443.45	GT:AD:DP:GL:GQ	0/1:37,31:63:-124.40,-18.99,-104.76:99
-chr1	2996899	rs2817165	A	G	93.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=58.80;MQ0=0;OQ=288.71;QD=8.25;SB=-166.95	GT:AD:DP:GL:GQ	0/1:21,13:29:-40.90,-8.74,-67.04:99
-chr1	2997535	rs34300623	G	A	185.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=59.69;MQ0=0;OQ=968.84;QD=15.88;SB=-326.31	GT:AD:DP:GL:GQ	0/1:32,29:60:-118.25,-18.08,-106.92:99
-chr1	2997956	rs6693385	C	T	247.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=59.55;MQ0=0;OQ=876.50;QD=17.19;SB=-364.90	GT:AD:DP:GL:GQ	0/1:22,29:45:-104.50,-13.57,-57.88:99
-chr1	2998547	rs2376820	C	G	2318.28	Indel	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=17.39;MQ=51.50;MQ0=0;QD=40.67;SB=-1149.31	GT:AD:DP:GL:GQ	1/1:0,55:56:-238.28,-19.61,-2.86:99
-chr1	3000177	rs760565	A	T	219.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=60.00;MQ0=0;OQ=708.84;QD=15.75;SB=-333.07	GT:AD:DP:GL:GQ	0/1:21,24:41:-86.52,-12.35,-66.91:99
-chr1	3001189	rs2981873	T	C	24.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=57.66;MQ0=0;OQ=381.92;QD=12.73;SB=-154.31	GT:AD:DP:GL:GQ	0/1:16,14:30:-50.52,-9.04,-62.50:99
-chr1	3002186	rs12135325	T	C	1.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=4.32;MQ=58.67;MQ0=0;OQ=210.96;QD=6.03;SB=-111.21	GT:AD:DP:GL:GQ	0/1:22,13:32:-34.02,-9.64,-84.87:99
-chr1	3002840	rs6666748	A	G	255.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.28;MQ=60.00;MQ0=0;OQ=801.41;QD=14.84;SB=-400.31	GT:AD:DP:GL:GQ	0/1:21,33:50:-98.50,-15.08,-74.39:99
-chr1	3003005	rs2788097	A	C	59.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=3.07;MQ=59.05;MQ0=0;OQ=463.07;QD=10.52;SB=-200.91	GT:AD:DP:GL:GQ	0/1:25,19:39:-61.34,-11.75,-74.66:99
-chr1	3005383	rs2981870	G	A	337.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=59.45;MQ0=0;OQ=532.89;QD=12.69;SB=-258.26	GT:AD:DP:GL:GQ	0/1:23,19:40:-68.63,-12.06,-71.78:99
-chr1	3005452	rs55674255	C	T	63.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=3.20;MQ=60.00;MQ0=0;OQ=640.76;QD=14.56;SB=-293.19	GT:AD:DP:GL:GQ	0/1:24,20:44:-80.62,-13.26,-82.30:99
-chr1	3005702	rs55784774	G	A	50.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=2.79;MQ=59.56;MQ0=0;OQ=701.05;QD=13.23;SB=-358.53	GT:AD:DP:GL:GQ	0/1:30,23:49:-88.16,-14.77,-89.46:99
-chr1	3005947	.	C	T	228.82	PASS	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.77;MQ0=0;OQ=514.40;QD=13.54;SB=-233.73	GT:AD:DP:GL:GQ	0/1:21,17:37:-65.88,-11.16,-63.18:99
-chr1	3005977	.	G	A	25.43	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=57.94;MQ0=0;OQ=561.32;QD=13.69;SB=-151.18	GT:AD:DP:GL:GQ	0/1:21,20:37:-70.56,-11.15,-69.03:99
-chr1	3006143	rs2981869	C	T	155.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=58.84;MQ0=0;OQ=588.68;QD=14.72;SB=-230.75	GT:AD:DP:GL:GQ	0/1:19,21:38:-73.61,-11.45,-64.86:99
-chr1	3007018	.	G	A	13.33	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=4.77;MQ=59.05;MQ0=0;OQ=465.01;QD=10.57;SB=-225.50	GT:AD:DP:GL:GQ	0/1:25,18:41:-64.52,-14.73,-86.50:99
-chr1	3008086	rs2993492	G	A	197.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=59.53;MQ0=0;OQ=913.42;QD=18.64;SB=-406.43	GT:AD:DP:GL:GQ	0/1:20,29:46:-108.49,-13.86,-62.00:99
-chr1	3009487	rs12131890	G	A	77.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.17;MQ0=0;OQ=935.16;QD=20.78;SB=-364.90	GT:AD:DP:GL:GQ	0/1:15,30:42:-109.46,-12.66,-48.94:99
-chr1	3010048	rs56029998	T	C	182.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.92;MQ=59.24;MQ0=0;OQ=609.91;QD=11.09;SB=-261.57	GT:AD:DP:GL:GQ	0/1:31,24:54:-80.54,-16.27,-125.83:99
-chr1	3010106	rs2993493	C	A	285.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=59.63;MQ0=0;OQ=789.70;QD=15.48;SB=-315.68	GT:AD:DP:GL:GQ	0/1:25,26:51:-97.62,-15.36,-86.35:99
-chr1	3010923	rs2993494	G	A	362.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.94;MQ0=0;OQ=449.17;QD=13.21;SB=-177.14	GT:AD:DP:GL:GQ	0/1:18,16:33:-58.15,-9.95,-61.38:99
-chr1	3011156	rs55898371	A	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=5;HaplotypeScore=4.00;MQ=58.74;MQ0=0;OQ=420.03;QD=11.35;SB=-193.92	GT:AD:DP:GL:GQ	0/1:18,19:33:-55.23,-9.95,-57.05:99
-chr1	3011412	rs12133978	G	A	162.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=59.34;MQ0=0;OQ=429.68;QD=12.28;SB=-187.26	GT:AD:DP:GL:GQ	0/1:20,15:33:-56.20,-9.95,-61.55:99
-chr1	3011547	rs11808136	C	T	5.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.91;MQ=59.52;MQ0=0;OQ=731.81;QD=18.76;SB=-195.18	GT:AD:DP:GL:GQ	0/1:16,23:36:-87.31,-10.85,-49.60:99
-chr1	3012571	rs2993495	A	G	13.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=549.01;QD=28.90;SB=-194.71	GT:AD:DP:GL:GQ	1/1:0,19:18:-58.50,-5.43,-0.01:54.13
-chr1	3012575	rs2993496	T	C	83.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=58.78;MQ0=0;OQ=196.75;QD=10.36;SB=-98.00	GT:AD:DP:GL:GQ	0/1:9,10:18:-28.39,-5.43,-32.68:99
-chr1	3012992	rs2993497	G	A	7	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=1.90;MQ=59.59;MQ0=0;OQ=932.60;QD=20.72;SB=-424.82	GT:AD:DP:GL:GQ	0/1:16,29:42:-109.20,-12.66,-48.01:99
-chr1	3013111	rs56363358	C	A	42.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=58.28;MQ0=0;OQ=749.52;QD=19.72;SB=-289.38	GT:AD:DP:GL:GQ	0/1:12,26:36:-89.08,-10.85,-37.10:99
-chr1	3013255	rs2993498	T	C	497.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=1211.16;QD=31.87;SB=-545.88	GT:AD:DP:GL:GQ	1/1:0,38:36:-124.72,-10.85,-0.02:99
-chr1	3013565	rs6667850	A	C	171.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.41;MQ0=0;OQ=400.63;QD=10.27;SB=-101.88	GT:AD:DP:GL:GQ	0/1:20,19:37:-54.50,-11.15,-69.04:99
-chr1	3013819	rs1890337	A	G	45.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.68;MQ=58.49;MQ0=0;OQ=1788.78;QD=31.38;SB=-712.22	GT:AD:DP:GL:GQ	1/1:0,56:52:-182.49,-15.67,-0.02:99
-chr1	3014125	rs1890336	A	C	168.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.71;MQ0=0;OQ=1775.96;QD=32.89;SB=-886.08	GT:AD:DP:GL:GQ	1/1:0,54:51:-181.20,-15.36,-0.02:99
-chr1	3014227	rs2993499	T	C	143.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=0.04;MQ=59.50;MQ0=0;OQ=1217.03;QD=32.89;SB=-587.31	GT:AD:DP:GL:GQ	1/1:0,37:36:-125.31,-10.85,-0.02:99
-chr1	3014565	rs2993500	C	T	15.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=4.44;MQ=59.65;MQ0=0;OQ=1234.24;QD=18.99;SB=-544.80	GT:AD:DP:GL:GQ	0/1:29,36:64:-145.99,-19.28,-92.77:99
-chr1	3015706	rs12137954	T	A	122.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=57.40;MQ0=0;OQ=345.66;QD=6.91;SB=-177.77	GT:AD:DP:GL:GQ	0/1:35,15:48:-52.31,-14.46,-129.85:99
-chr1	3015846	rs2993501	A	C	217.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=57.44;MQ0=0;OQ=1649.50;QD=29.99;SB=-596.80	GT:AD:DP:GL:GQ	1/1:0,55:53:-168.59,-15.98,-0.05:99
-chr1	3015960	rs12135664	C	T	346.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=60.00;MQ0=0;OQ=1146.10;QD=16.85;SB=-550.79	GT:AD:DP:GL:GQ	0/1:34,34:67:-138.08,-20.19,-108.20:99
-chr1	3016120	rs2981868	T	A	119.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=4.10;MQ=59.44;MQ0=0;OQ=1114.65;QD=15.06;SB=-570.99	GT:AD:DP:GL:GQ	0/1:37,36:67:-134.93,-20.18,-118.55:99
-chr1	3016369	rs59909070	G	A	353.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.69;MQ0=0;OQ=434.09;QD=10.10;SB=-171.10	GT:AD:DP:GL:GQ	0/1:27,16:42:-59.35,-12.65,-95.52:99
-chr1	3016502	.	T	C	0.18	PASS	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=2;HaplotypeScore=5.91;MQ=44.72;MQ0=3;OQ=351.94;QD=7.65;SB=-166.48	GT:AD:DP:GL:GQ	0/1:25,21:36:-49.33,-10.85,-81.52:99
-chr1	3016606	.	A	C	15.74	PASS	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=3.75;MQ=48.95;MQ0=1;OQ=373.22;QD=9.82;SB=-133.20	GT:AD:DP:GL:GQ	0/1:18,17:27:-48.74,-8.13,-43.17:99
-chr1	3016839	rs56010213	A	T	12.71	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=38.33;MQ0=7;QD=0.33;SB=20.09	GT:AD:DP:GL:GQ	0/1:34,5:23:-11.46,-6.93,-70.69:45.31
-chr1	3017201	rs2993502	C	T	589.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.38;MQ0=0;OQ=2029.57;QD=38.29;SB=-936.75	GT:AD:DP:GL:GQ	1/1:0,53:51:-206.56,-15.36,-0.01:99
-chr1	3017765	.	T	C	156.29	PASS	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=257.37;QD=12.26;SB=-133.69	GT:AD:DP:GL:GQ	0/1:7,14:18:-34.45,-5.43,-28.78:99
-chr1	3017780	.	C	T	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=1;HaplotypeScore=2.01;MQ=59.03;MQ0=0;OQ=567.81;QD=23.66;SB=-154.18	GT:AD:DP:GL:GQ	0/1:6,18:22:-66.70,-6.63,-18.59:99
-chr1	3018779	rs11808946	C	T	272.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=781.20;QD=16.62;SB=-355.56	GT:AD:DP:GL:GQ	0/1:22,25:44:-94.67,-13.26,-66.92:99
-chr1	3018847	rs2993503	A	G	82.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=59.16;MQ0=0;OQ=1494.14;QD=27.17;SB=-767.73	GT:AD:DP:GL:GQ	1/1:0,55:49:-153.05,-14.78,-0.05:99
-chr1	3018941	rs2072733	C	T	12.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=2;HaplotypeScore=2.15;MQ=59.46;MQ0=0;OQ=605.93;QD=14.09;SB=-165.23	GT:AD:DP:GL:GQ	0/1:22,21:41:-76.24,-12.36,-69.17:99
-chr1	3019072	rs10909875	C	T	272.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.03;MQ0=0;OQ=534.00;QD=11.12;SB=-208.44	GT:AD:DP:GL:GQ	0/1:28,20:45:-70.25,-13.56,-92.78:99
-chr1	3019517	rs12136745	G	A	248.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=59.62;MQ0=0;OQ=984.07;QD=16.40;SB=-470.51	GT:AD:DP:GL:GQ	0/1:28,32:55:-118.26,-16.57,-87.88:99
-chr1	3019842	rs58968988	G	A	56.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=4.37;MQ=58.92;MQ0=0;OQ=590.92;QD=13.74;SB=-159.22	GT:AD:DP:GL:GQ	0/1:22,21:39:-74.13,-11.75,-67.01:99
-chr1	3020484	rs2981867	G	C	387.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.97;MQ0=0;OQ=547.74;QD=12.17;SB=-190.58	GT:AD:DP:GL:GQ	0/1:29,16:44:-71.32,-13.26,-119.60:99
-chr1	3020597	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=37.34;MQ=39.25;MQ0=1;OQ=144.44;QD=4.25;SB=-87.67	GT:AD:DP:GL:GQ	0/1:24,10:27:-25.87,-8.14,-74.17:99
-chr1	3020599	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=45.49;MQ=39.25;MQ0=1;OQ=360.48;QD=10.60;SB=-127.10	GT:AD:DP:GL:GQ	0/1:21,13:31:-48.68,-9.35,-60.35:99
-chr1	3020611	.	A	G	19.24	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=21.97;MQ=37.81;MQ0=1;QD=0.62;SB=-30.78	GT:AD:DP:GL:GQ	0/1:24,7:24:-12.43,-7.23,-80.13:52.02
-chr1	3020613	rs6691894	A	G	41.97	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=22.61;MQ=37.81;MQ0=1;QD=1.35;SB=-10.86	GT:AD:DP:GL:GQ	0/1:24,7:20:-13.51,-6.02,-64.69:74.80
-chr1	3020615	rs6691895	A	G	400.54	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=24.36;MQ=38.97;MQ0=1;QD=12.92;SB=-173.99	GT:AD:DP:GL:GQ	0/1:14,17:24:-50.58,-7.24,-30.30:99
-chr1	3020629	.	A	G	22.23	LowQual	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=19.42;MQ=38.02;MQ0=1;QD=0.85;SB=-32.78	GT:AD:DP:GL:GQ	0/1:21,5:22:-12.14,-6.63,-70.51:55.04
-chr1	3020688	rs6691996	A	G	381.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.90;MQ0=0;OQ=370.45;QD=11.58;SB=-184.01	GT:AD:DP:GL:GQ	0/1:14,18:30:-49.38,-9.05,-56.94:99
-chr1	3020691	rs6695017	T	C	343.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.28;MQ0=0;OQ=495.78;QD=14.58;SB=-192.66	GT:AD:DP:GL:GQ	0/1:16,18:34:-63.11,-10.25,-58.83:99
-chr1	3020744	rs6687292	C	T	95.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=3.34;MQ=56.56;MQ0=0;OQ=522.71;QD=9.33;SB=-137.11	GT:AD:DP:GL:GQ	0/1:34,22:53:-71.53,-15.97,-120.29:99
-chr1	3020924	rs2981866	G	A	33.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=57.17;MQ0=0;OQ=1933.34;QD=38.67;SB=-489.14	GT:AD:DP:GL:GQ	1/1:0,50:49:-196.94,-14.76,-0.02:99
-chr1	3020982	rs10909876	A	G	347.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=54.47;MQ0=0;OQ=796.80;QD=13.06;SB=-340.94	GT:AD:DP:GL:GQ	0/1:29,32:61:-101.36,-18.40,-112.11:99
-chr1	3020998	rs10909877	T	A	2173.88	Indel	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=54.79;MQ0=0;QD=36.23;SB=-1033.22	GT:AD:DP:GL:GQ	1/1:0,60:59:-220.99,-17.77,-0.02:99
-chr1	3021182	.	G	A	53.76	PASS	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=59.25;MQ0=0;OQ=405.03;QD=13.07;SB=-180.66	GT:AD:DP:GL:GQ	0/1:18,13:30:-52.83,-9.04,-54.54:99
-chr1	3022425	rs2981865	G	C	1.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=57.81;MQ0=0;OQ=743.56;QD=24.79;SB=-346.46	GT:AD:DP:GL:GQ	0/1:9,21:29:-86.39,-8.75,-34.33:99
-chr1	3024466	rs10909878	A	G	299.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=58.18;MQ0=0;OQ=619.53;QD=13.18;SB=-324.31	GT:AD:DP:GL:GQ	0/1:20,27:45:-78.81,-13.57,-80.16:99
-chr1	3024530	rs12141827	T	C	99.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=53.26;MQ0=0;OQ=329.91;QD=8.25;SB=-169.50	GT:AD:DP:GL:GQ	0/1:24,16:37:-47.43,-11.15,-87.85:99
-chr1	3025087	rs6690373	A	G	254.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.67;MQ0=0;OQ=819.31;QD=14.63;SB=-343.19	GT:AD:DP:GL:GQ	0/1:23,33:54:-101.49,-16.28,-89.82:99
-chr1	3025597	rs2981864	A	G	2.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=1.66;MQ=59.23;MQ0=0;OQ=762.15;QD=25.41;SB=-232.49	GT:AD:DP:GL:GQ	1/1:0,28:25:-82.46,-10.02,-2.66:73.60
-chr1	3025622	rs12409836	A	G	68.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=58.74;MQ0=0;OQ=225.89;QD=6.11;SB=-44.83	GT:AD:DP:GL:GQ	0/1:23,14:30:-34.92,-9.04,-72.62:99
-chr1	3025639	rs2472822	C	G	79.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.42;MQ0=0;OQ=1446.74;QD=36.17;SB=-602.98	GT:AD:DP:GL:GQ	1/1:0,40:36:-148.28,-10.86,-0.02:99
-chr1	3027473	rs876740	C	T	271.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=2215.19;QD=38.19;SB=-1128.00	GT:AD:DP:GL:GQ	1/1:0,58:56:-225.12,-16.87,-0.02:99
-chr1	3028483	rs2742672	A	G	23.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.51;MQ0=0;OQ=1087.23;QD=28.61;SB=-502.17	GT:AD:DP:GL:GQ	1/1:0,38:36:-112.35,-10.86,-0.04:99
-chr1	3029008	rs2817171	C	A	191.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=59.65;MQ0=0;OQ=733.04;QD=13.57;SB=-391.11	GT:AD:DP:GL:GQ	0/1:29,25:54:-92.85,-16.26,-102.92:99
-chr1	3030045	rs2981863	G	C	66.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=59.63;MQ0=0;OQ=889.03;QD=17.78;SB=-256.52	GT:AD:DP:GL:GQ	0/1:23,27:46:-106.06,-13.87,-86.32:99
-chr1	3030624	rs2012731	G	A	16.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=4.70;MQ=59.61;MQ0=0;OQ=1536.02;QD=32.00;SB=-433.32	GT:AD:DP:GL:GQ	1/1:0,48:41:-157.21,-12.36,-0.02:99
-chr1	3031379	rs2817172	T	C	144.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=1381.66;QD=30.70;SB=-636.88	GT:AD:DP:GL:GQ	1/1:0,45:44:-141.79,-13.27,-0.04:99
-chr1	3032241	rs2472820	G	A	108.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=58.74;MQ0=0;OQ=572.26;QD=15.47;SB=-176.66	GT:AD:DP:GL:GQ	0/1:19,18:36:-71.36,-10.85,-60.89:99
-chr1	3032694	.	C	T	55.78	PASS	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=60.00;MQ0=0;OQ=546.49;QD=14.77;SB=-205.90	GT:AD:DP:GL:GQ	0/1:19,18:36:-68.78,-10.85,-58.80:99
-chr1	3033426	rs12410830	A	G	6.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=3.60;MQ=59.16;MQ0=0;OQ=614.56;QD=12.29;SB=-235.29	GT:AD:DP:GL:GQ	0/1:27,23:49:-79.50,-14.76,-107.00:99
-chr1	3034041	rs2817174	T	C	277.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.38;MQ0=0;OQ=1499.60;QD=26.78;SB=-664.93	GT:AD:DP:GL:GQ	1/1:0,56:48:-153.59,-14.48,-0.05:99
-chr1	3034512	rs35529420	C	T	72.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.41;MQ=59.18;MQ0=0;OQ=899.04;QD=15.77;SB=-264.19	GT:AD:DP:GL:GQ	0/1:27,29:53:-109.16,-15.97,-86.82:99
-chr1	3034731	rs35951269	T	C	58.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=2.40;MQ=58.97;MQ0=0;OQ=780.41;QD=12.39;SB=-339.30	GT:AD:DP:GL:GQ	0/1:36,27:63:-100.30,-18.98,-146.89:99
-chr1	3035225	rs2742670	A	G	75.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.62;MQ=60.00;MQ0=0;OQ=1811.56;QD=33.55;SB=-920.03	GT:AD:DP:GL:GQ	1/1:0,54:51:-184.76,-15.36,-0.02:99
-chr1	3035475	rs2817175	T	C	135.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=57.17;MQ0=0;OQ=1487.18;QD=29.74;SB=-663.57	GT:AD:DP:GL:GQ	1/1:0,50:49:-152.36,-14.79,-0.06:99
-chr1	3035871	rs2817176	A	G	10.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=4.69;MQ=58.80;MQ0=0;OQ=1642.91;QD=28.33;SB=-799.47	GT:AD:DP:GL:GQ	1/1:0,58:54:-167.94,-16.30,-0.07:99
-chr1	3036323	rs2817177	T	C	492.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=1385.60;QD=34.64;SB=-536.41	GT:AD:DP:GL:GQ	1/1:0,40:39:-142.16,-11.75,-0.01:99
-chr1	3036571	rs35625823	T	G	1.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.02;HRun=1;HaplotypeScore=8.04;MQ=58.17;MQ0=0;OQ=682.10;QD=13.37;SB=-105.91	GT:AD:DP:GL:GQ	0/1:25,25:50:-86.26,-14.76,-86.59:99
-chr1	3036686	rs35201154	G	T	212.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.64;MQ0=0;OQ=542.18;QD=11.30;SB=-157.49	GT:AD:DP:GL:GQ	0/1:27,21:48:-71.97,-14.46,-93.11:99
-chr1	3037032	rs2788086	A	G	87.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=59.14;MQ0=0;OQ=1440.07;QD=26.67;SB=-745.96	GT:AD:DP:GL:GQ	1/1:1,53:49:-151.81,-14.78,-4.21:99
-chr1	3037112	rs2817178	T	C	138.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.50;MQ=59.01;MQ0=0;OQ=1783.83;QD=33.66;SB=-780.99	GT:AD:DP:GL:GQ	1/1:0,53:51:-182.00,-15.37,-0.03:99
-chr1	3037307	rs10797378	T	C	263.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=57.77;MQ0=0;OQ=673.03;QD=12.02;SB=-270.24	GT:AD:DP:GL:GQ	0/1:24,31:50:-85.66,-15.07,-91.32:99
-chr1	3037312	rs2788087	A	G	5.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=3;HaplotypeScore=4.61;MQ=57.43;MQ0=0;OQ=719.26;QD=12.40;SB=-323.12	GT:AD:DP:GL:GQ	0/1:28,30:54:-91.49,-16.28,-101.63:99
-chr1	3037323	rs10909881	G	A	169.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=4.31;MQ=57.69;MQ0=0;OQ=859.60;QD=14.57;SB=-445.45	GT:AD:DP:GL:GQ	0/1:30,29:55:-105.83,-16.59,-85.38:99
-chr1	3038158	rs2817180	T	C	101.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.60;MQ0=0;OQ=1662.63;QD=29.17;SB=-686.71	GT:AD:DP:GL:GQ	1/1:0,57:52:-169.90,-15.69,-0.05:99
-chr1	3038602	rs35360783	A	G	220.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.65;MQ0=0;OQ=463.18;QD=8.74;SB=-235.89	GT:AD:DP:GL:GQ	0/1:32,21:53:-65.58,-15.98,-127.69:99
-chr1	3039222	rs12024620	C	T	40.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=4.42;MQ=59.20;MQ0=0;OQ=839.66;QD=14.48;SB=-156.21	GT:AD:DP:GL:GQ	0/1:32,26:56:-104.13,-16.88,-98.69:99
-chr1	3039241	rs12021948	G	C	56.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.56;MQ0=0;OQ=946.79;QD=17.86;SB=-223.20	GT:AD:DP:GL:GQ	0/1:25,28:53:-113.94,-15.98,-109.97:99
-chr1	3039433	rs12740389	C	T	216.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.36;MQ0=0;OQ=1244.61;QD=19.15;SB=-628.67	GT:AD:DP:GL:GQ	0/1:28,37:63:-146.73,-18.98,-86.83:99
-chr1	3039715	rs35999894	C	T	445.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1131.40;QD=18.86;SB=-581.12	GT:AD:DP:GL:GQ	0/1:26,34:58:-133.91,-17.48,-78.73:99
-chr1	3039945	rs34733164	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=4;HaplotypeScore=2.38;MQ=59.17;MQ0=0;OQ=103.23;QD=3.69;SB=-48.95	GT:AD:DP:GL:GQ	0/1:18,10:23:-20.53,-6.93,-62.39:99
-chr1	3040081	rs12022170	G	A	254.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.17;MQ0=0;OQ=717.02;QD=15.93;SB=-327.88	GT:AD:DP:GL:GQ	0/1:23,22:43:-87.95,-12.96,-65.92:99
-chr1	3040191	rs12028027	T	C	223.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.03;MQ0=0;OQ=428.68;QD=8.93;SB=-212.28	GT:AD:DP:GL:GQ	0/1:28,20:45:-59.72,-13.57,-97.74:99
-chr1	3040222	rs12027117	A	G	229.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=59.46;MQ0=0;OQ=557.56;QD=12.97;SB=-281.47	GT:AD:DP:GL:GQ	0/1:21,22:42:-71.69,-12.65,-82.66:99
-chr1	3040357	rs10909883	A	G	344.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.62;MQ0=0;OQ=754.58;QD=12.37;SB=-348.58	GT:AD:DP:GL:GQ	0/1:28,33:59:-96.53,-17.79,-109.54:99
-chr1	3040454	rs12120879	C	G	45.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=2.33;MQ=58.92;MQ0=0;OQ=1009.80;QD=18.03;SB=-357.43	GT:AD:DP:GL:GQ	0/1:27,29:53:-120.25,-15.98,-106.43:99
-chr1	3040798	rs35848773	T	C	267.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=59.65;MQ0=0;OQ=685.07;QD=12.69;SB=-277.27	GT:AD:DP:GL:GQ	0/1:21,33:48:-86.26,-14.47,-82.32:99
-chr1	3040900	rs12731315	G	C	3.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=3;HaplotypeScore=3.13;MQ=60.00;MQ0=0;OQ=656.27;QD=17.74;SB=-310.23	GT:AD:DP:GL:GQ	0/1:18,19:37:-80.07,-11.16,-76.94:99
-chr1	3041210	rs12724921	T	A	454.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=611.82;QD=12.00;SB=-313.55	GT:AD:DP:GL:GQ	0/1:28,23:48:-78.92,-14.46,-101.94:99
-chr1	3041481	rs909509	A	G	48.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=4.12;MQ=59.51;MQ0=0;OQ=373.32;QD=7.94;SB=-138.54	GT:AD:DP:GL:GQ	0/1:28,18:38:-52.08,-11.46,-81.04:99
-chr1	3041609	rs12725529	T	C	111.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=58.62;MQ0=0;OQ=287.04;QD=7.76;SB=-113.62	GT:AD:DP:GL:GQ	0/1:21,16:34:-42.24,-10.25,-81.99:99
-chr1	3042125	rs7535865	A	C	10.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=7.89;MQ=58.97;MQ0=0;OQ=623.66;QD=13.86;SB=-308.90	GT:AD:DP:GL:GQ	0/1:18,27:40:-77.70,-12.05,-63.90:99
-chr1	3042361	rs4648363	C	T	227.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.42;MQ0=0;OQ=413.64;QD=10.34;SB=-159.64	GT:AD:DP:GL:GQ	0/1:26,14:37:-55.80,-11.16,-73.37:99
-chr1	3043023	rs35794895	G	A	293.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=58.64;MQ0=0;OQ=693.50;QD=14.45;SB=-320.87	GT:AD:DP:GL:GQ	0/1:21,26:42:-85.30,-12.67,-60.57:99
-chr1	3043817	rs12741594	A	T	497.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.30;MQ0=0;OQ=877.02;QD=14.62;SB=-406.56	GT:AD:DP:GL:GQ	0/1:31,29:60:-109.06,-18.07,-115.07:99
-chr1	3043966	rs2235176	T	C	337.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=677.48;QD=12.55;SB=-208.33	GT:AD:DP:GL:GQ	0/1:27,27:53:-87.00,-15.97,-104.05:99
-chr1	3044349	rs35877876	C	T	270.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.61;MQ0=0;OQ=969.79;QD=16.44;SB=-358.48	GT:AD:DP:GL:GQ	0/1:30,29:59:-118.04,-17.77,-107.71:99
-chr1	3045481	rs10797379	T	C	126.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=58.62;MQ0=0;OQ=1290.17;QD=29.32;SB=-604.23	GT:AD:DP:GL:GQ	1/1:0,44:42:-132.64,-12.67,-0.04:99
-chr1	3045736	rs10797380	A	G	12.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=4.39;MQ=59.03;MQ0=0;OQ=1384.53;QD=28.84;SB=-697.60	GT:AD:DP:GL:GQ	1/1:0,48:44:-142.08,-13.27,-0.04:99
-chr1	3046509	rs7354964	C	G	181.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.06;MQ0=0;OQ=756.10;QD=18.90;SB=-387.98	GT:AD:DP:GL:GQ	0/1:19,21:40:-90.95,-12.05,-80.97:99
-chr1	3047001	rs2817181	A	G	378.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.74;MQ0=0;OQ=2402.64;QD=34.32;SB=-979.90	GT:AD:DP:GL:GQ	1/1:0,70:68:-243.87,-20.48,-0.03:99
-chr1	3047521	rs7538096	T	C	291.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=59.64;MQ0=0;OQ=861.01;QD=13.45;SB=-250.18	GT:AD:DP:GL:GQ	0/1:31,33:64:-108.67,-19.29,-124.47:99
-chr1	3048093	rs2742666	T	C	36.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=6.22;MQ=57.02;MQ0=0;OQ=594.94;QD=12.93;SB=-209.63	GT:AD:DP:GL:GQ	0/1:23,23:42:-75.43,-12.65,-85.93:99
-chr1	3048098	rs2742665	A	C	100.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=57.17;MQ0=0;OQ=617.42;QD=15.44;SB=-256.42	GT:AD:DP:GL:GQ	0/1:17,23:38:-76.47,-11.45,-58.49:99
-chr1	3048109	rs2817183	A	G	380.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.05;MQ0=0;OQ=578.38;QD=14.46;SB=-222.56	GT:AD:DP:GL:GQ	0/1:19,21:39:-72.87,-11.75,-75.47:99
-chr1	3048230	rs2817184	G	A	543.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=743.48;QD=15.82;SB=-334.86	GT:AD:DP:GL:GQ	0/1:23,24:46:-91.50,-13.86,-76.30:99
-chr1	3050041	rs6684093	C	T	40.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=5.68;MQ=58.71;MQ0=0;OQ=937.27;QD=17.36;SB=-475.05	GT:AD:DP:GL:GQ	0/1:24,30:51:-112.38,-15.37,-76.51:99
-chr1	3051143	rs1875449	C	A	6.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=5.78;MQ=59.44;MQ0=0;OQ=367.51;QD=8.96;SB=-206.89	GT:AD:DP:GL:GQ	0/1:23,18:37:-51.19,-11.15,-77.66:99
-chr1	3052735	rs2817187	G	T	176.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.61;MQ0=0;OQ=2057.17;QD=34.87;SB=-1041.53	GT:AD:DP:GL:GQ	1/1:0,59:58:-209.32,-17.47,-0.02:99
-chr1	3066300	.	C	T	85.23	PASS	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=59.28;MQ0=0;OQ=957.84;QD=16.51;SB=-344.34	GT:AD:DP:GL:GQ	0/1:29,29:58:-116.54,-17.47,-102.34:99
-chr1	3068821	.	G	A	12.77	PASS	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.86;MQ=59.41;MQ0=0;OQ=492.51;QD=12.63;SB=-226.54	GT:AD:DP:GL:GQ	0/1:19,20:34:-62.79,-10.25,-59.33:99
-chr1	3069601	rs34175350	G	C	4.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=15.60;MQ0=24;OQ=307.57;QD=4.16;SB=-10.00	GT:AD:DP:GL:GQ	0/1:61,13:26:-41.87,-7.83,-71.98:99
-chr1	3071991	.	T	C	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=7.33;MQ=54.00;MQ0=2;OQ=261.16;QD=5.02;SB=-67.51	GT:AD:DP:GL:GQ	0/1:33,19:40:-41.45,-12.05,-111.58:99
-chr1	3072015	.	C	T	17.95	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=6.27;MQ=51.72;MQ0=4;QD=0.46;SB=-17.49	GT:AD:DP:GL:GQ	0/1:29,10:20:-11.10,-6.03,-56.69:50.72
-chr1	3077233	rs10909887	A	T	53.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=3.52;MQ=59.65;MQ0=0;OQ=1671.94;QD=31.55;SB=-810.23	GT:AD:DP:GL:GQ	1/1:0,53:48:-170.81,-14.47,-0.03:99
-chr1	3078302	rs2817127	C	G	3.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=58.92;MQ0=0;OQ=1590.78;QD=40.79;SB=-669.44	GT:AD:DP:GL:GQ	1/1:0,39:38:-162.68,-11.46,-0.02:99
-chr1	3078602	rs2651936	C	T	556.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1763.78;QD=38.34;SB=-617.01	GT:AD:DP:GL:GQ	1/1:0,46:45:-179.97,-13.55,-0.01:99
-chr1	3078803	rs2817128	T	C	41.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=3;HaplotypeScore=0.92;MQ=58.79;MQ0=0;OQ=1700.76;QD=31.50;SB=-627.85	GT:AD:DP:GL:GQ	1/1:0,54:53:-173.71,-15.98,-0.05:99
-chr1	3078920	rs2817129	G	C	420.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2270.90;QD=42.85;SB=-927.24	GT:AD:DP:GL:GQ	1/1:0,53:53:-230.70,-15.98,-0.02:99
-chr1	3079836	rs3795268	G	A	518.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2012.53;QD=38.70;SB=-765.66	GT:AD:DP:GL:GQ	1/1:0,52:51:-204.85,-15.36,-0.01:99
-chr1	3082486	rs61759169	A	T	0.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=17.96;MQ=49.98;MQ0=1;OQ=467.66;QD=5.85;SB=-63.76	GT:AD:DP:GL:GQ	0/1:57,23:74:-72.34,-22.29,-212.74:99
-chr1	3082576	rs59307218	T	C	89.31	Indel	AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=1;HaplotypeScore=16.28;MQ=58.32;MQ0=0;QD=0.84;SB=-6.84	GT:AD:DP:GL:GQ	0/1:94,12:100:-42.34,-30.13,-353.31:99
-chr1	3082715	rs61759170	T	C	0.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=1;HaplotypeScore=13.70;MQ=54.13;MQ0=0;OQ=433.59;QD=4.61;SB=-120.39	GT:AD:DP:GL:GQ	0/1:66,28:84:-71.95,-25.31,-255.13:99
-chr1	3082724	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=20.17;MQ=53.56;MQ0=0;OQ=265.77;QD=3.09;SB=-1.90	GT:AD:DP:GL:GQ	0/1:64,21:77:-55.36,-25.50,-226.03:99
-chr1	3082730	rs61759171	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=25.02;MQ=53.60;MQ0=0;OQ=115.19;QD=1.46;SB=35.65	GT:AD:DP:GL:GQ	0/1:62,16:69:-35.59,-20.79,-209.49:99
-chr1	3083610	rs2817131	T	C	1.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=7.31;MQ=58.76;MQ0=0;OQ=2679.05;QD=35.25;SB=-1269.49	GT:AD:DP:GL:GQ	1/1:0,76:75:-271.51,-22.59,-0.03:99
-chr1	3086215	rs868718	G	A	224.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.60;MQ0=0;OQ=2257.57;QD=38.92;SB=-929.74	GT:AD:DP:GL:GQ	1/1:0,58:57:-229.36,-17.17,-0.02:99
-chr1	3086338	rs2817132	T	C	256.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.55;MQ0=0;OQ=1749.39;QD=34.30;SB=-792.14	GT:AD:DP:GL:GQ	1/1:0,51:49:-178.54,-14.76,-0.01:99
-chr1	3086971	.	G	A	6.54	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.12;MQ=59.63;MQ0=0;OQ=869.92;QD=17.06;SB=-366.15	GT:AD:DP:GL:GQ	0/1:23,28:49:-105.05,-14.78,-70.17:99
-chr1	3087284	rs28576654	G	A	0.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=8.45;MQ=55.21;MQ0=0;OQ=1827.21;QD=37.29;SB=-761.03	GT:AD:DP:GL:GQ	1/1:1,48:47:-186.32,-14.16,-0.02:99
-chr1	3087324	rs36042320	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=36.16;MQ=53.71;MQ0=0;OQ=1199.13;QD=20.32;SB=-596.19	GT:AD:DP:GL:GQ	1/1:10,49:47:-136.03,-14.18,-12.56:16.27
-chr1	3087368	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=62.15;MQ=52.02;MQ0=2;OQ=84.05;QD=0.99;SB=68.22	GT:AD:DP:GL:GQ	0/1:64,20:65:-31.27,-19.58,-199.12:99
-chr1	3087405	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=0;HaplotypeScore=113.18;MQ=45.62;MQ0=12;OQ=152.20;QD=1.23;SB=83.17	GT:AD:DP:GL:GQ	0/1:93,25:100:-54.91,-36.41,-286.94:99
-chr1	3087421	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=108;Dels=0.01;HRun=1;HaplotypeScore=157.91;MQ=45.44;MQ0=13;OQ=317.87;QD=2.94;SB=62.22	GT:AD:DP:GL:GQ	0/1:65,42:72:-56.46,-21.39,-222.98:99
-chr1	3087430	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=100;Dels=0.09;HRun=0;HaplotypeScore=131.45;MQ=45.35;MQ0=13;OQ=71.40;QD=0.71;SB=68.23	GT:AD:DP:GL:GQ	0/1:57,34:61:-28.82,-18.40,-174.57:99
-chr1	3087432	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=125.43;MQ=44.68;MQ0=16;OQ=349.00;QD=3.39;SB=68.23	GT:AD:DP:GL:GQ	0/1:85,18:67:-58.39,-20.20,-173.08:99
-chr1	3087446	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=34.86;MQ=42.41;MQ0=15;OQ=253.15;QD=2.81;SB=53.16	GT:AD:DP:GL:GQ	0/1:47,43:54:-44.89,-16.29,-135.66:99
-chr1	3087456	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=33.91;MQ=40.94;MQ0=15;OQ=574.41;QD=6.38;SB=41.15	GT:AD:DP:GL:GQ	0/1:47,43:59:-78.52,-17.79,-127.78:99
-chr1	3087469	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=37.75;MQ=38.93;MQ0=14;OQ=420.06;QD=4.94;SB=41.09	GT:AD:DP:GL:GQ	0/1:56,29:63:-64.29,-19.00,-146.93:99
-chr1	3087482	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=75.90;MQ=37.38;MQ0=13;OQ=93.48;QD=1.23;SB=56.14	GT:AD:DP:GL:GQ	0/1:55,21:54:-28.92,-16.29,-150.91:99
-chr1	3087484	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=59.86;MQ=36.69;MQ0=13;OQ=224.49;QD=2.95;SB=47.15	GT:AD:DP:GL:GQ	0/1:64,12:51:-41.12,-15.38,-130.32:99
-chr1	3087496	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=57;Dels=0.18;HRun=0;HaplotypeScore=92.35;MQ=35.16;MQ0=7;OQ=80.55;QD=1.41;SB=-35.75	GT:AD:DP:GL:GQ	0/1:30,16:29:-20.09,-8.75,-100.50:99
-chr1	3087498	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=70.78;MQ=33.76;MQ0=7;OQ=147.15;QD=2.58;SB=-95.04	GT:AD:DP:GL:GQ	0/1:41,16:33:-27.95,-9.95,-82.07:99
-chr1	3087509	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=61;Dels=0.05;HRun=0;HaplotypeScore=74.81;MQ=32.58;MQ0=5;OQ=64.70;QD=1.06;SB=56.11	GT:AD:DP:GL:GQ	0/1:52,6:35:-20.32,-10.56,-93.36:97.54
-chr1	3087512	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=54.96;MQ=31.97;MQ0=5;OQ=503.11;QD=8.11;SB=-236.10	GT:AD:DP:GL:GQ	0/1:31,31:45:-67.16,-13.57,-94.41:99
-chr1	3087536	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=33.03;MQ=32.40;MQ0=3;OQ=59.37;QD=0.74;SB=89.25	GT:AD:DP:GL:GQ	0/1:72,7:63:-28.22,-18.99,-181.57:92.21
-chr1	3087538	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=37.44;MQ=32.40;MQ0=3;OQ=247.27;QD=3.09;SB=80.25	GT:AD:DP:GL:GQ	0/1:65,15:63:-46.99,-18.98,-180.33:99
-chr1	3087608	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=168;Dels=0.01;HRun=0;HaplotypeScore=54.40;MQ=37.28;MQ0=13;OQ=1887.72;QD=11.24;SB=-729.24	GT:AD:DP:GL:GQ	0/1:104,63:145:-235.47,-43.42,-271.37:99
-chr1	3087617	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=0;HaplotypeScore=53.68;MQ=37.94;MQ0=15;OQ=1635.04;QD=8.84;SB=-493.28	GT:AD:DP:GL:GQ	0/1:114,71:160:-215.01,-48.22,-344.93:99
-chr1	3087664	.	A	G	18.84	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=189;Dels=0.01;HRun=0;HaplotypeScore=131.51;MQ=40.84;MQ0=15;QD=0.10;SB=241.96	GT:AD:DP:GL:GQ	0/1:170,18:163:-53.97,-48.81,-580.79:51.62
-chr1	3087667	.	C	T	165.92	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=188;Dels=0.01;HRun=0;HaplotypeScore=132.64;MQ=41.11;MQ0=15;QD=0.88;SB=179.60	GT:AD:DP:GL:GQ	0/1:167,20:158:-67.18,-47.30,-486.26:99
-chr1	3087668	.	A	G	310.08	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=187;Dels=0.01;HRun=1;HaplotypeScore=124.54;MQ=41.17;MQ0=15;QD=1.66;SB=124.04	GT:AD:DP:GL:GQ	0/1:158,28:160:-82.20,-47.90,-540.31:99
-chr1	3087734	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=1;HaplotypeScore=13.23;MQ=44.53;MQ0=2;OQ=55.34;QD=0.49;SB=-14.90	GT:AD:DP:GL:GQ	0/1:101,11:104:-40.16,-31.34,-369.37:88.18
-chr1	3087747	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=23.95;MQ=43.49;MQ0=2;OQ=1649.29;QD=15.71;SB=-709.98	GT:AD:DP:GL:GQ	0/1:48,57:100:-198.34,-30.13,-180.84:99
-chr1	3087772	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=133;Dels=0.00;HRun=0;HaplotypeScore=99.40;MQ=37.75;MQ0=7;OQ=762.57;QD=5.73;SB=-239.63	GT:AD:DP:GL:GQ	0/1:102,30:117:-114.83,-35.29,-281.68:99
-chr1	3087833	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=152;Dels=0.00;HRun=1;HaplotypeScore=261.50;MQ=29.30;MQ0=7;OQ=1486.23;QD=9.78;SB=-676.51	GT:AD:DP:GL:GQ	0/1:100,52:130:-191.07,-39.17,-253.74:99
-chr1	3087850	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=0;HaplotypeScore=106.63;MQ=29.08;MQ0=7;OQ=1055.92;QD=7.23;SB=-459.23	GT:AD:DP:GL:GQ	0/1:100,46:125:-146.56,-37.68,-289.33:99
-chr1	3087853	.	C	A	11.81	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=0;HaplotypeScore=84.96;MQ=29.13;MQ0=6;QD=0.08;SB=22.69	GT:AD:DP:GL:GQ	0/1:134,14:133:-44.49,-40.06,-434.86:44.36
-chr1	3087861	.	A	C	168.29	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=23.28;MQ=29.00;MQ0=4;QD=1.25;SB=-17.42	GT:AD:DP:GL:GQ	0/1:115,20:120:-56.26,-36.15,-379.05:99
-chr1	3087900	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=22.94;MQ=28.28;MQ0=1;OQ=423.78;QD=5.81;SB=-214.40	GT:AD:DP:GL:GQ	0/1:51,22:68:-66.15,-20.49,-189.92:99
-chr1	3087911	.	C	T	880.08	SnpCluster	AC=1;AF=0.50;AN=2;DP=69;Dels=0.03;HRun=0;HaplotypeScore=32.89;MQ=28.46;MQ0=0;QD=12.75;SB=-315.83	GT:AD:DP:GL:GQ	0/1:40,27:49:-105.45,-14.16,-69.50:99
-chr1	3087912	.	A	G	1267.81	SnpCluster	AC=1;AF=0.50;AN=2;DP=68;Dels=0.03;HRun=1;HaplotypeScore=32.88;MQ=28.45;MQ0=0;QD=18.64;SB=-474.20	GT:AD:DP:GL:GQ	0/1:22,44:48:-143.92,-13.86,-20.32:64.59
-chr1	3087920	.	G	A	574.31	SnpCluster	AC=1;AF=0.50;AN=2;DP=74;Dels=0.04;HRun=0;HaplotypeScore=182.60;MQ=28.60;MQ0=0;QD=7.76;SB=-289.69	GT:AD:DP:GL:GQ	0/1:50,21:71:-81.21,-20.50,-157.25:99
-chr1	3087952	.	G	A	1075.62	Indel	AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=0;HaplotypeScore=58.78;MQ=31.99;MQ0=0;QD=13.62;SB=-555.39	GT:AD:DP:GL:GQ	0/1:45,34:75:-133.45,-22.61,-136.49:99
-chr1	3087978	.	A	G	38.22	DPFilter;Indel;LowQual	AC=1;AF=0.50;AN=2;DP=109;Dels=0.02;HRun=1;HaplotypeScore=54.40;MQ=36.04;MQ0=0;QD=0.35;SB=94.63	GT:AD:DP:GL:GQ	0/1:93,14:103:-37.54,-30.43,-360.90:71.06
-chr1	3088004	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=30.72;MQ=40.10;MQ0=2;OQ=423.13;QD=3.00;SB=9.29	GT:AD:DP:GL:GQ	0/1:121,20:123:-82.68,-37.08,-335.63:99
-chr1	3088013	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=142;Dels=0.03;HRun=0;HaplotypeScore=47.98;MQ=41.19;MQ0=4;OQ=426.97;QD=3.01;SB=-54.18	GT:AD:DP:GL:GQ	0/1:112,26:133:-84.85,-38.87,-412.97:99
-chr1	3088015	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=42.51;MQ=41.21;MQ0=4;OQ=465.21;QD=3.21;SB=-60.11	GT:AD:DP:GL:GQ	0/1:116,29:131:-89.28,-39.48,-409.01:99
-chr1	3088100	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=132;Dels=0.00;HRun=0;HaplotypeScore=4.53;MQ=40.45;MQ0=11;OQ=130.52;QD=0.99;SB=-31.41	GT:AD:DP:GL:GQ	0/1:119,13:106:-48.30,-31.97,-302.63:99
-chr1	3088101	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=0;HaplotypeScore=4.53;MQ=40.49;MQ0=10;OQ=71.07;QD=0.55;SB=-5.78	GT:AD:DP:GL:GQ	0/1:117,11:111:-47.37,-36.98,-326.83:99
-chr1	3088217	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=80;Dels=0.01;HRun=0;HaplotypeScore=17.08;MQ=42.86;MQ0=1;OQ=126.54;QD=1.58;SB=-85.23	GT:AD:DP:GL:GQ	0/1:66,13:74:-37.94,-22.00,-241.16:99
-chr1	3088220	rs34886760	A	G	0.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.01;HRun=1;HaplotypeScore=12.97;MQ=43.96;MQ0=1;OQ=1584.16;QD=20.84;SB=-521.89	GT:AD:DP:GL:GQ	0/1:11,64:65:-181.29,-19.59,-39.63:99
-chr1	3088304	rs61759175	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.08;HRun=0;HaplotypeScore=55.59;MQ=46.00;MQ0=11;OQ=251.71;QD=2.13;SB=81.71	GT:AD:DP:GL:GQ	0/1:90,18:102:-58.89,-30.43,-301.97:99
-chr1	3088575	rs2817134	T	C	3.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=5.64;MQ=59.45;MQ0=0;OQ=1472.39;QD=35.06;SB=-604.20	GT:AD:DP:GL:GQ	1/1:0,42:42:-150.84,-12.65,-0.02:99
-chr1	3088745	rs2651931	C	T	32.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.49;MQ=59.44;MQ0=0;OQ=1502.67;QD=36.65;SB=-632.85	GT:AD:DP:GL:GQ	1/1:0,40:38:-153.86,-11.45,-0.01:99
-chr1	3088761	rs2817135	T	C	98.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.39;MQ0=0;OQ=1114.54;QD=29.33;SB=-484.51	GT:AD:DP:GL:GQ	1/1:0,38:36:-115.07,-10.86,-0.04:99
-chr1	3089054	rs950200	A	G	135.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.38;MQ0=0;OQ=1494.35;QD=33.21;SB=-586.20	GT:AD:DP:GL:GQ	1/1:0,45:43:-153.04,-12.95,-0.02:99
-chr1	3091593	rs9660914	G	A	174.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.63;MQ0=0;OQ=2157.13;QD=34.24;SB=-1073.97	GT:AD:DP:GL:GQ	1/1:0,63:58:-219.33,-17.49,-0.04:99
-chr1	3093686	rs4233024	C	T	199.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.75;MQ0=0;OQ=1964.65;QD=37.78;SB=-829.97	GT:AD:DP:GL:GQ	1/1:0,52:51:-200.08,-15.37,-0.03:99
-chr1	3094490	rs10752733	A	G	125.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=1561.08;QD=30.61;SB=-635.88	GT:AD:DP:GL:GQ	1/1:0,51:49:-159.74,-14.78,-0.04:99
-chr1	3094942	rs2817136	G	A	89.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=1690.06;QD=36.74;SB=-568.32	GT:AD:DP:GL:GQ	1/1:0,46:44:-172.61,-13.26,-0.02:99
-chr1	3095136	rs2817138	T	G	4.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=6.65;MQ=58.92;MQ0=0;OQ=1072.43;QD=24.94;SB=-511.45	GT:AD:DP:GL:GQ	1/1:0,43:37:-110.87,-11.16,-0.04:99
-chr1	3095423	rs2651919	G	T	722.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=2110.88;QD=35.78;SB=-952.39	GT:AD:DP:GL:GQ	1/1:0,59:58:-214.69,-17.47,-0.02:99
-chr1	3095697	rs2651918	T	C	14.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=3.68;MQ=59.20;MQ0=0;OQ=1955.56;QD=33.72;SB=-956.98	GT:AD:DP:GL:GQ	1/1:0,58:55:-199.16,-16.57,-0.02:99
-chr1	3095769	rs2817139	A	G	514.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.29;MQ0=0;OQ=1684.86;QD=27.18;SB=-755.66	GT:AD:DP:GL:GQ	1/1:0,62:53:-172.12,-15.99,-0.05:99
-chr1	3095922	rs7530075	G	A	526.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1784.81;QD=39.66;SB=-851.64	GT:AD:DP:GL:GQ	1/1:0,45:45:-182.08,-13.55,-0.01:99
-chr1	3096128	rs2651917	C	G	97.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.80;MQ0=0;OQ=1717.27;QD=36.54;SB=-542.46	GT:AD:DP:GL:GQ	1/1:0,47:42:-175.34,-12.67,-0.03:99
-chr1	3096165	rs7545798	A	G	335.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=1218.45;QD=30.46;SB=-546.04	GT:AD:DP:GL:GQ	1/1:0,40:39:-125.47,-11.76,-0.04:99
-chr1	3096243	rs7545871	A	G	179.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1274.76;QD=30.35;SB=-481.26	GT:AD:DP:GL:GQ	1/1:0,42:39:-131.09,-11.76,-0.02:99
-chr1	3096257	rs2651916	C	T	670.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=1810.18;QD=36.20;SB=-763.02	GT:AD:DP:GL:GQ	1/1:0,50:47:-184.62,-14.16,-0.02:99
-chr1	3096476	rs2817140	A	G	6.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=1038.30;QD=28.84;SB=-515.16	GT:AD:DP:GL:GQ	1/1:0,36:34:-107.45,-10.26,-0.04:99
-chr1	3096661	rs61759179	G	A	1.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=5.55;MQ=53.62;MQ0=2;OQ=1172.74;QD=30.07;SB=-520.65	GT:AD:DP:GL:GQ	1/1:8,31:31:-120.87,-9.34,-0.01:93.29
-chr1	3096814	rs2817141	T	C	22.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=1.30;MQ=59.19;MQ0=0;OQ=1269.17;QD=27.59;SB=-620.79	GT:AD:DP:GL:GQ	1/1:0,46:42:-130.56,-12.68,-0.06:99
-chr1	3097140	rs1875451	C	T	277.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.63;MQ0=0;OQ=1807.86;QD=35.45;SB=-805.30	GT:AD:DP:GL:GQ	1/1:0,51:46:-184.39,-13.86,-0.02:99
-chr1	3098276	rs2651914	T	G	143.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=2148.66;QD=35.22;SB=-1029.38	GT:AD:DP:GL:GQ	1/1:0,61:61:-218.47,-18.37,-0.02:99
-chr1	3098356	rs10737190	G	A	615.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.78;MQ0=0;OQ=3298.92;QD=39.75;SB=-1410.68	GT:AD:DP:GL:GQ	1/1:0,83:81:-328.89,-24.40,-0.02:99
-chr1	3098377	rs6685614	G	A	280.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=59.78;MQ0=0;OQ=3233.06;QD=38.95;SB=-1261.68	GT:AD:DP:GL:GQ	1/1:0,83:82:-327.11,-24.71,-0.03:99
-chr1	3099011	rs7539775	G	A	230.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=59.47;MQ0=0;OQ=1818.76;QD=34.98;SB=-678.01	GT:AD:DP:GL:GQ	1/1:1,51:49:-188.18,-14.77,-2.72:99
-chr1	3100277	rs2651913	C	G	465.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1755.38;QD=41.79;SB=-899.81	GT:AD:DP:GL:GQ	1/1:0,42:41:-179.13,-12.35,-0.01:99
-chr1	3100595	rs2651912	T	C	68.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=4.22;MQ=58.95;MQ0=0;OQ=646.58;QD=10.43;SB=-279.12	GT:AD:DP:GL:GQ	0/1:33,29:56:-84.82,-16.88,-119.30:99
-chr1	3104232	.	G	A	37.52	PASS	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=60.00;MQ0=0;OQ=572.60;QD=16.36;SB=-260.57	GT:AD:DP:GL:GQ	0/1:16,19:33:-70.49,-9.94,-51.89:99
-chr1	3105581	rs950449	C	G	114.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=1.91;MQ=60.00;MQ0=0;OQ=352.20;QD=14.09;SB=-136.76	GT:AD:DP:GL:GQ	0/1:14,11:24:-45.74,-7.23,-56.39:99
-chr1	3106518	rs2651923	T	C	555.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.18;MQ0=0;OQ=1262.70;QD=28.70;SB=-607.93	GT:AD:DP:GL:GQ	1/1:0,44:40:-129.89,-12.07,-0.04:99
-chr1	3110061	rs2817142	T	C	84.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=58.76;MQ0=0;OQ=950.22;QD=27.95;SB=-463.20	GT:AD:DP:GL:GQ	1/1:1,33:31:-98.64,-9.35,-0.03:93.20
-chr1	3113619	rs2817143	T	C	475.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.53;MQ0=0;OQ=1485.25;QD=30.31;SB=-541.01	GT:AD:DP:GL:GQ	1/1:0,49:46:-152.15,-13.87,-0.04:99
-chr1	3119305	.	C	T	6.85	PASS	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=482.22;QD=12.06;SB=-197.28	GT:AD:DP:GL:GQ	0/1:23,17:38:-62.96,-11.45,-76.10:99
-chr1	3119433	rs60892783	T	A	341.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.85;MQ0=0;OQ=778.15;QD=15.26;SB=-381.44	GT:AD:DP:GL:GQ	0/1:26,25:51:-96.46,-15.36,-96.60:99
-chr1	3124191	rs12124147	C	T	18.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=4;HaplotypeScore=1.41;MQ=60.00;MQ0=0;OQ=2106.36;QD=38.30;SB=-923.21	GT:AD:DP:GL:GQ	1/1:0,55:54:-214.24,-16.27,-0.02:99
-chr1	3125697	.	G	A	48.02	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=3.90;MQ=59.58;MQ0=0;OQ=894.40;QD=16.26;SB=-426.44	GT:AD:DP:GL:GQ	0/1:28,27:53:-108.70,-15.98,-81.48:99
-chr1	3133804	rs10737191	T	C	216.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.05;MQ0=0;OQ=1310.90;QD=29.79;SB=-629.85	GT:AD:DP:GL:GQ	1/1:0,44:43:-134.73,-12.98,-0.05:99
-chr1	3137939	rs2651921	T	C	31.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=1.62;MQ=57.88;MQ0=0;OQ=1318.12;QD=31.38;SB=-539.87	GT:AD:DP:GL:GQ	1/1:0,42:38:-135.41,-11.45,-0.01:99
-chr1	3139859	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=4;HaplotypeScore=1.59;MQ=58.84;MQ0=0;OQ=177.35;QD=4.43;SB=56.21	GT:AD:DP:GL:GQ	0/1:24,16:34:-31.27,-10.25,-94.47:99
-chr1	3140395	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=1;HaplotypeScore=11.19;MQ=58.95;MQ0=0;OQ=93.28;QD=2.12;SB=71.27	GT:AD:DP:GL:GQ	0/1:31,13:33:-22.56,-9.95,-125.01:99
-chr1	3146326	rs2455112	A	G	135.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=60.00;MQ0=0;OQ=1096.93;QD=16.88;SB=-503.18	GT:AD:DP:GL:GQ	0/1:28,37:65:-132.56,-19.58,-110.95:99
-chr1	3151094	.	T	G	27.85	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=10.51;MQ=58.72;MQ0=0;QD=0.55;SB=62.22	GT:AD:DP:GL:GQ	0/1:29,22:34:-16.31,-10.24,-101.82:60.68
-chr1	3154977	.	C	T	20.55	PASS	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=59.05;MQ0=0;OQ=960.26;QD=19.60;SB=-359.36	GT:AD:DP:GL:GQ	0/1:20,29:48:-113.77,-14.46,-73.03:99
-chr1	3155966	rs1105111	C	A	740.08	Indel	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=6;HaplotypeScore=0.00;MQ=60.39;MQ0=0;QD=13.46;SB=-187.60	GT:AD:DP:GL:GQ	0/1:28,27:54:-93.56,-16.26,-102.62:99
-chr1	3156860	.	C	A	1.29	PASS	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=2.70;MQ=59.41;MQ0=0;OQ=714.68;QD=18.33;SB=-335.33	GT:AD:DP:GL:GQ	0/1:15,24:39:-86.50,-11.75,-50.10:99
-chr1	3157063	rs60443258	C	G	197.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.43;MQ0=0;OQ=467.30;QD=14.16;SB=-190.23	GT:AD:DP:GL:GQ	0/1:18,15:33:-59.97,-9.95,-75.73:99
-chr1	3158034	rs11589327	C	T	221.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=55.82;MQ0=0;OQ=602.02;QD=14.68;SB=-226.92	GT:AD:DP:GL:GQ	0/1:22,19:39:-75.24,-11.75,-65.81:99
-chr1	3158063	rs61759183	G	A	105.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.23;MQ=54.25;MQ0=0;OQ=859.64;QD=18.29;SB=-349.39	GT:AD:DP:GL:GQ	0/1:17,30:44:-102.53,-13.28,-49.01:99
-chr1	3158107	rs55987640	G	A	184.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=55.61;MQ0=0;OQ=836.43;QD=16.73;SB=-292.80	GT:AD:DP:GL:GQ	0/1:21,29:42:-99.58,-12.65,-57.74:99
-chr1	3158110	rs10909910	G	C	37.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.63;MQ=55.78;MQ0=0;OQ=2043.92;QD=39.31;SB=-983.24	GT:AD:DP:GL:GQ	1/1:0,52:49:-208.00,-14.77,-0.02:99
-chr1	3158140	rs10797386	A	G	147.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=58.66;MQ0=0;OQ=1752.75;QD=33.71;SB=-820.65	GT:AD:DP:GL:GQ	1/1:0,52:49:-178.87,-14.76,-0.02:99
-chr1	3158322	rs12143201	C	T	107.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=58.81;MQ0=0;OQ=1087.80;QD=19.78;SB=-426.85	GT:AD:DP:GL:GQ	0/1:23,32:54:-128.34,-16.28,-69.54:99
-chr1	3158948	rs7539489	G	A	212.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.64;MQ=59.50;MQ0=0;OQ=701.66;QD=15.25;SB=-203.89	GT:AD:DP:GL:GQ	0/1:22,24:42:-86.11,-12.66,-64.73:99
-chr1	3160428	rs56015432	C	G	319.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=42.71;MQ0=18;OQ=1056.37;QD=11.61;SB=-361.10	GT:AD:DP:GL:GQ	0/1:52,38:68:-131.78,-22.86,-160.18:99
-chr1	3160647	rs2376494	T	C	490.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.54;MQ0=5;OQ=1049.98;QD=13.46;SB=-449.81	GT:AD:DP:GL:GQ	0/1:34,44:69:-129.08,-20.80,-121.01:99
-chr1	3160969	rs61691507	T	C	83.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=3;HaplotypeScore=0.96;MQ=48.88;MQ0=0;OQ=936.08;QD=14.18;SB=-414.90	GT:AD:DP:GL:GQ	0/1:32,34:63:-115.87,-18.98,-126.60:99
-chr1	3161244	rs28883366	T	C	328.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=20.07;MQ0=44;OQ=827.10;QD=11.18;SB=-204.07	GT:AD:DP:GL:GQ	1/1:25,49:28:-86.33,-8.45,-0.03:84.18
-chr1	3161789	rs4648464	G	A	197.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=53.22;MQ0=0;OQ=1078.68;QD=20.35;SB=-414.45	GT:AD:DP:GL:GQ	0/1:21,32:51:-126.53,-15.37,-60.62:99
-chr1	3161922	rs4648465	G	A	93.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=50.73;MQ0=0;OQ=1117.60;QD=22.35;SB=-454.98	GT:AD:DP:GL:GQ	0/1:18,32:50:-130.11,-15.06,-59.43:99
-chr1	3162133	rs2455100	T	C	1.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=5.09;MQ=58.24;MQ0=0;OQ=1353.88;QD=28.21;SB=-366.45	GT:AD:DP:GL:GQ	1/1:0,48:45:-139.02,-13.58,-0.05:99
-chr1	3162911	rs6699624	G	C	272.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.50;MQ0=0;OQ=1093.08;QD=16.07;SB=-449.43	GT:AD:DP:GL:GQ	0/1:32,35:63:-131.59,-19.00,-134.16:99
-chr1	3163088	rs1971330	C	T	114.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=49.78;MQ0=0;OQ=900.72;QD=19.58;SB=-445.49	GT:AD:DP:GL:GQ	0/1:19,27:44:-106.61,-13.25,-68.73:99
-chr1	3163142	rs1971331	A	G	155.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=39.25;MQ0=0;OQ=1400.23;QD=30.44;SB=-715.29	GT:AD:DP:GL:GQ	1/1:0,46:45:-143.65,-13.57,-0.04:99
-chr1	3165231	rs10909912	T	G	383.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.06;MQ0=0;OQ=430.36;QD=10.76;SB=-234.78	GT:AD:DP:GL:GQ	0/1:20,20:39:-58.07,-11.75,-73.52:99
-chr1	3165588	rs2455101	A	G	194.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.36;MQ0=0;OQ=514.34;QD=12.86;SB=-185.55	GT:AD:DP:GL:GQ	0/1:18,22:37:-65.87,-11.15,-65.63:99
-chr1	3165783	.	C	T	13.80	PASS	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=427.64;QD=9.30;SB=-160.18	GT:AD:DP:GL:GQ	0/1:30,16:42:-58.70,-12.66,-94.89:99
-chr1	3166230	.	C	G	139.63	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=825.87;QD=15.88;SB=-367.51	GT:AD:DP:GL:GQ	0/1:23,29:49:-100.65,-14.78,-100.14:99
-chr1	3167106	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=181.43;MQ=36.47;MQ0=0;OQ=530.53;QD=4.31;SB=-209.32	GT:AD:DP:GL:GQ	0/1:66,39:92:-95.27,-38.93,-253.94:99
-chr1	3167116	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=174;Dels=0.01;HRun=1;HaplotypeScore=260.94;MQ=34.61;MQ0=0;OQ=942.41;QD=5.42;SB=-369.43	GT:AD:DP:GL:GQ	0/1:66,57:123:-208.12,-110.59,-323.19:99
-chr1	3167119	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=1;HaplotypeScore=217.51;MQ=34.08;MQ0=0;OQ=198.48;QD=1.04;SB=93.36	GT:AD:DP:GL:GQ	0/1:148,42:118:-61.70,-38.57,-398.62:99
-chr1	3167131	.	G	A	38.92	DPFilter;Indel;LowQual	AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=0;HaplotypeScore=418.78;MQ=33.67;MQ0=0;QD=0.18;SB=-15.26	GT:AD:DP:GL:GQ	0/1:171,44:118:-42.73,-35.55,-373.47:71.75
-chr1	3167160	.	G	A	609.50	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=190;Dels=0.00;HRun=0;HaplotypeScore=319.28;MQ=32.32;MQ0=1;QD=3.21;SB=-149.32	GT:AD:DP:GL:GQ	0/1:134,56:72:-85.93,-21.70,-173.92:99
-chr1	3167161	.	T	C	245.51	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=188;Dels=0.00;HRun=0;HaplotypeScore=318.96;MQ=32.30;MQ0=1;QD=1.31;SB=53.20	GT:AD:DP:GL:GQ	0/1:174,14:59:-45.63,-17.79,-171.10:99
-chr1	3167162	.	G	A	200.87	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=0;HaplotypeScore=336.60;MQ=32.32;MQ0=1;QD=1.07;SB=56.18	GT:AD:DP:GL:GQ	0/1:174,10:62:-51.08,-27.71,-180.52:99
-chr1	3167163	.	G	A	107.11	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=184;Dels=0.00;HRun=0;HaplotypeScore=325.93;MQ=32.20;MQ0=1;QD=0.58;SB=-62.93	GT:AD:DP:GL:GQ	0/1:163,18:64:-33.28,-19.29,-195.22:99
-chr1	3167166	.	A	G	243.37	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=314.12;MQ=31.98;MQ0=1;QD=1.36;SB=56.35	GT:AD:DP:GL:GQ	0/1:138,41:62:-46.30,-18.68,-187.52:99
-chr1	3167169	.	A	G	120.84	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=1;HaplotypeScore=387.92;MQ=32.13;MQ0=1;QD=0.65;SB=76.41	GT:AD:DP:GL:GQ	0/1:141,44:79:-39.18,-23.81,-262.75:99
-chr1	3167180	rs57179041	G	A	114.65	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=141;Dels=0.00;HRun=1;HaplotypeScore=408.58;MQ=31.71;MQ0=1;QD=0.81;SB=86.30	GT:AD:DP:GL:GQ	0/1:118,23:43:-27.70,-12.95,-132.25:99
-chr1	3167181	.	A	G	38.85	DPFilter;Indel;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=1;HaplotypeScore=419.93;MQ=31.63;MQ0=1;QD=0.28;SB=86.30	GT:AD:DP:GL:GQ	0/1:108,33:42:-19.82,-12.66,-143.77:71.68
-chr1	3167187	.	T	C	11.48	DPFilter;Indel;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=120;Dels=0.41;HRun=0;HaplotypeScore=330.20;MQ=31.90;MQ0=1;QD=0.10;SB=5.04	GT:AD:DP:GL:GQ	0/1:52,5:44:-17.05,-12.65,-148.02:44
-chr1	3167189	.	G	A	33.08	DPFilter;Indel;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=123;Dels=0.12;HRun=1;HaplotypeScore=208.65;MQ=32.18;MQ0=1;QD=0.27;SB=8.05	GT:AD:DP:GL:GQ	0/1:103,5:46:-20.45,-13.86,-154.58:65.91
-chr1	3167200	rs57648616	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=0;HaplotypeScore=125.27;MQ=33.30;MQ0=1;OQ=406.22;QD=3.41;SB=39.53	GT:AD:DP:GL:GQ	0/1:44,74:56:-63.73,-19.82,-152.72:99
-chr1	3167205	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=1;HaplotypeScore=95.81;MQ=33.44;MQ0=1;OQ=560.09;QD=4.87;SB=72.41	GT:AD:DP:GL:GQ	0/1:70,45:71:-80.68,-21.39,-190.32:99
-chr1	3167222	rs57879698	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=105.67;MQ=36.94;MQ0=1;OQ=371.38;QD=4.08;SB=65.41	GT:AD:DP:GL:GQ	0/1:54,36:67:-60.61,-20.18,-198.91:99
-chr1	3167226	.	A	G	25.97	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=1;HaplotypeScore=94.17;MQ=37.02;MQ0=1;QD=0.29;SB=104.36	GT:AD:DP:GL:GQ	0/1:77,13:68:-26.37,-20.49,-239.07:58.80
-chr1	3167247	.	A	G	94.62	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=9.30;MQ=43.30;MQ0=0;QD=1.30;SB=66.40	GT:AD:DP:GL:GQ	0/1:60,13:64:-32.03,-19.29,-213.53:99
-chr1	3167248	rs61151413	C	T	166.25	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=15.29;MQ=43.46;MQ0=0;QD=2.31;SB=80.73	GT:AD:DP:GL:GQ	0/1:59,13:65:-39.51,-19.60,-174.44:99
-chr1	3167253	.	A	G	43.60	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=1;HaplotypeScore=18.65;MQ=43.75;MQ0=0;QD=0.56;SB=110.39	GT:AD:DP:GL:GQ	0/1:68,10:69:-28.43,-20.79,-243.20:76.44
-chr1	3167258	.	G	A	29.42	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=1;HaplotypeScore=29.46;MQ=43.75;MQ0=0;QD=0.38;SB=107.33	GT:AD:DP:GL:GQ	0/1:71,7:70:-27.32,-21.09,-225.20:62.25
-chr1	3167340	rs3002685	A	G	235.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=44.86;MQ0=0;OQ=812.94;QD=11.29;SB=-432.88	GT:AD:DP:GL:GQ	0/1:35,37:64:-103.87,-19.29,-131.86:99
-chr1	3167551	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=15;HaplotypeScore=12.64;MQ=52.48;MQ0=0;OQ=368.96;QD=5.95;SB=77.28	GT:AD:DP:GL:GQ	0/1:44,18:52:-55.84,-15.67,-137.44:99
-chr1	3168576	.	C	T	188.74	PASS	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.69;MQ0=0;OQ=823.49;QD=13.72;SB=-404.84	GT:AD:DP:GL:GQ	0/1:34,26:58:-103.11,-17.48,-109.21:99
-chr1	3169081	.	C	T	79.34	PASS	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=59.66;MQ0=0;OQ=1096.77;QD=16.37;SB=-547.56	GT:AD:DP:GL:GQ	0/1:32,35:63:-131.94,-18.98,-108.41:99
-chr1	3169567	rs1501611	G	A	10.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=8.26;MQ=58.29;MQ0=0;OQ=520.16;QD=12.69;SB=-281.22	GT:AD:DP:GL:GQ	0/1:21,20:36:-66.15,-10.85,-62.40:99
-chr1	3169746	rs2455106	G	C	285.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=1036.68;QD=23.56;SB=-535.79	GT:AD:DP:GL:GQ	0/1:15,29:43:-119.91,-12.96,-65.17:99
-chr1	3170018	rs2455107	T	G	277.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.18;MQ=59.50;MQ0=0;OQ=669.75;QD=14.56;SB=-280.87	GT:AD:DP:GL:GQ	0/1:21,25:42:-82.91,-12.65,-66.12:99
-chr1	3170493	rs2455102	A	G	356.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.62;MQ0=0;OQ=653.73;QD=10.21;SB=-205.32	GT:AD:DP:GL:GQ	0/1:37,27:63:-87.64,-18.99,-144.47:99
-chr1	3170958	.	C	T	1.10	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=5.86;MQ=59.55;MQ0=0;OQ=1035.67;QD=20.31;SB=-528.11	GT:AD:DP:GL:GQ	0/1:20,31:50:-121.92,-15.07,-64.72:99
-chr1	3171559	rs2500250	T	C	389.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=559.12;QD=10.55;SB=-252.33	GT:AD:DP:GL:GQ	0/1:30,23:52:-74.86,-15.66,-123.43:99
-chr1	3171782	rs10909913	A	G	116.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=2.90;MQ=59.63;MQ0=0;OQ=1003.48;QD=15.93;SB=-509.29	GT:AD:DP:GL:GQ	0/1:27,35:61:-122.01,-18.38,-106.15:99
-chr1	3172391	rs2455096	A	C	43.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=287.98;QD=8.47;SB=-120.97	GT:AD:DP:GL:GQ	0/1:18,16:31:-41.43,-9.34,-63.22:99
-chr1	3172429	rs56042628	C	T	96.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=60.00;MQ0=0;OQ=280.31;QD=9.34;SB=-80.59	GT:AD:DP:GL:GQ	0/1:19,11:28:-39.76,-8.44,-58.47:99
-chr1	3173020	rs2455094	G	A	166.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=59.53;MQ0=0;OQ=444.07;QD=11.10;SB=-203.69	GT:AD:DP:GL:GQ	0/1:22,17:34:-57.94,-10.25,-64.34:99
-chr1	3173727	rs2455093	A	G	256.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=832.24;QD=16.98;SB=-357.94	GT:AD:DP:GL:GQ	0/1:20,29:47:-100.67,-14.16,-75.12:99
-chr1	3174715	rs2455119	G	T	285.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.49;MQ0=0;OQ=576.42;QD=12.81;SB=-209.45	GT:AD:DP:GL:GQ	0/1:23,22:42:-73.58,-12.65,-77.54:99
-chr1	3176001	.	C	T	83.35	PASS	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.70;MQ0=0;OQ=696.01;QD=13.92;SB=-293.84	GT:AD:DP:GL:GQ	0/1:26,23:46:-86.76,-13.88,-73.45:99
-chr1	3176267	.	T	G	76.55	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.02;MQ=60.00;MQ0=0;OQ=841.56;QD=14.76;SB=-394.65	GT:AD:DP:GL:GQ	0/1:27,30:56:-104.31,-16.87,-93.27:99
-chr1	3177045	rs3002687	T	G	225.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.21;MQ=59.59;MQ0=0;OQ=571.62;QD=12.43;SB=-258.88	GT:AD:DP:GL:GQ	0/1:24,22:45:-74.00,-13.56,-84.05:99
-chr1	3177468	.	C	T	3.04	PASS	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=59.42;MQ0=0;OQ=538.59;QD=16.83;SB=-100.92	GT:AD:DP:GL:GQ	0/1:14,18:31:-66.48,-9.34,-49.83:99
-chr1	3177939	rs2500308	A	G	95.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=1.13;MQ=59.39;MQ0=0;OQ=763.00;QD=10.04;SB=-332.88	GT:AD:DP:GL:GQ	0/1:45,31:71:-100.98,-21.39,-171.46:99
-chr1	3178661	.	G	A	33.39	PASS	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=60.00;MQ0=0;OQ=796.34;QD=18.96;SB=-401.21	GT:AD:DP:GL:GQ	0/1:18,24:42:-95.58,-12.66,-58.00:99
-chr1	3178998	rs2455127	A	G	173.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=58.67;MQ0=0;OQ=507.17;QD=14.49;SB=-257.35	GT:AD:DP:GL:GQ	0/1:11,24:30:-63.05,-9.05,-41.23:99
-chr1	3179379	.	A	G	65.56	PASS	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=58.32;MQ0=0;OQ=481.41;QD=12.34;SB=-241.93	GT:AD:DP:GL:GQ	0/1:18,21:37:-62.58,-11.16,-65.22:99
-chr1	3179574	rs2455128	A	G	108.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=59.62;MQ0=0;OQ=838.70;QD=13.98;SB=-378.24	GT:AD:DP:GL:GQ	0/1:31,29:59:-104.93,-17.77,-121.27:99
-chr1	3179592	rs2500307	T	A	726.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2101.50;QD=36.23;SB=-987.86	GT:AD:DP:GL:GQ	1/1:0,58:58:-213.75,-17.47,-0.02:99
-chr1	3182386	rs2500304	T	C	246	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=59.51;MQ0=0;OQ=550.86;QD=11.72;SB=-174.37	GT:AD:DP:GL:GQ	0/1:23,24:45:-71.94,-13.57,-90.75:99
-chr1	3182819	rs2455131	A	G	160.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=4.10;MQ=53.72;MQ0=0;OQ=380.67;QD=9.28;SB=-185.58	GT:AD:DP:GL:GQ	0/1:26,15:41:-53.71,-12.35,-99.70:99
-chr1	3183091	.	T	G	31.12	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.54;MQ=48.96;MQ0=0;QD=0.80;SB=16.16	GT:AD:DP:GL:GQ	0/1:34,5:37:-17.54,-11.14,-116.34:63.95
-chr1	3183092	.	C	A	30.14	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=9.54;MQ=48.87;MQ0=0;QD=0.74;SB=14.77	GT:AD:DP:GL:GQ	0/1:36,5:37:-17.45,-11.16,-100.79:62.97
-chr1	3183861	rs55923982	G	C	139.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.45;MQ=57.45;MQ0=0;OQ=542.30;QD=11.79;SB=-148.38	GT:AD:DP:GL:GQ	0/1:27,19:44:-70.78,-13.27,-111.52:99
-chr1	3184193	rs2455115	A	G	314.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=53.52;MQ0=0;OQ=598.87;QD=12.22;SB=-281.59	GT:AD:DP:GL:GQ	0/1:25,24:48:-77.64,-14.47,-94.87:99
-chr1	3185401	.	G	T	101.68	PASS	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=59.51;MQ0=0;OQ=440.43;QD=11.59;SB=-233.97	GT:AD:DP:GL:GQ	0/1:19,19:33:-57.27,-9.94,-56.75:99
-chr1	3187015	.	G	A	77.56	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=59.67;MQ0=0;OQ=971.62;QD=17.05;SB=-421.44	GT:AD:DP:GL:GQ	0/1:28,29:55:-117.01,-16.57,-95.93:99
-chr1	3188693	rs905137	A	G	186.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=59.61;MQ0=0;OQ=484.36;QD=10.09;SB=-266.22	GT:AD:DP:GL:GQ	0/1:25,23:44:-64.98,-13.26,-96.26:99
-chr1	3189244	rs905136	A	G	4.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=4;HaplotypeScore=2.03;MQ=60.00;MQ0=0;OQ=654.87;QD=15.97;SB=-328.31	GT:AD:DP:GL:GQ	0/1:18,23:38:-80.22,-11.45,-60.36:99
-chr1	3189344	rs905135	A	C	1.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=6.41;MQ=59.54;MQ0=0;OQ=215.02;QD=4.30;SB=-100.13	GT:AD:DP:GL:GQ	0/1:35,15:44:-38.04,-13.26,-114.24:99
-chr1	3189859	rs2500302	T	C	241.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.92;MQ0=0;OQ=339.74;QD=8.71;SB=-144.67	GT:AD:DP:GL:GQ	0/1:23,16:37:-48.41,-11.15,-86.58:99
-chr1	3190143	rs56004439	G	A	2.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=8.41;MQ=57.37;MQ0=0;OQ=401.65;QD=8.37;SB=-155.21	GT:AD:DP:GL:GQ	0/1:33,15:46:-57.32,-13.87,-99.82:99
-chr1	3190754	.	G	A	32.75	PASS	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=1225.08;QD=18.85;SB=-426.92	GT:AD:DP:GL:GQ	0/1:29,36:64:-145.07,-19.28,-99.09:99
-chr1	3190930	rs6685398	C	A	88.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=4.12;MQ=60.00;MQ0=0;OQ=531.21;QD=13.28;SB=-273.35	GT:AD:DP:GL:GQ	0/1:21,19:39:-68.15,-11.75,-68.57:99
-chr1	3190993	rs6690217	A	C	128.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.55;MQ0=0;OQ=1454.60;QD=28.52;SB=-648.68	GT:AD:DP:GL:GQ	1/1:0,51:48:-149.09,-14.47,-0.05:99
-chr1	3192051	.	C	T	11.01	PASS	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.25;MQ0=0;OQ=927.90;QD=18.56;SB=-215.90	GT:AD:DP:GL:GQ	0/1:20,30:48:-110.53,-14.46,-70.14:99
-chr1	3192870	rs10797387	A	C	142.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=1.89;MQ=59.80;MQ0=0;OQ=775.82;QD=12.93;SB=-322.85	GT:AD:DP:GL:GQ	0/1:30,30:54:-97.13,-16.27,-96.18:99
-chr1	3193262	.	A	G	27.47	PASS	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=60.00;MQ0=0;OQ=435.09;QD=14.04;SB=-158.61	GT:AD:DP:GL:GQ	0/1:13,18:29:-55.53,-8.74,-48.24:99
-chr1	3193691	rs12024838	G	C	0.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=9.20;MQ=52.13;MQ0=0;OQ=313.95;QD=12.08;SB=-105.65	GT:AD:DP:GL:GQ	0/1:16,10:19:-40.41,-5.73,-35.18:99
-chr1	3193692	rs61759191	C	T	0.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=9.20;MQ=52.13;MQ0=0;OQ=179.56;QD=6.91;SB=-26.50	GT:AD:DP:GL:GQ	0/1:18,8:19:-26.97,-5.73,-38.66:99
-chr1	3193738	rs10909916	C	G	2.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=6.33;MQ=40.46;MQ0=4;OQ=154.87;QD=11.06;SB=-44.90	GT:AD:DP:GL:GQ	0/1:9,5:7:-20.88,-2.11,-8.99:68.77
-chr1	3194086	rs6687930	T	C	3.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=48.01;MQ0=1;OQ=344.21;QD=18.12;SB=-6.99	GT:AD:DP:GL:GQ	0/1:2,17:14:-41.92,-4.22,-8.13:39.10
-chr1	3194355	rs2134119	C	G	59.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=4.23;MQ=54.23;MQ0=0;OQ=781.76;QD=15.95;SB=-353.76	GT:AD:DP:GL:GQ	0/1:22,27:44:-94.74,-13.28,-81.77:99
-chr1	3194394	rs2455117	T	A	339.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=56.31;MQ0=0;OQ=679.10;QD=15.43;SB=-276.72	GT:AD:DP:GL:GQ	0/1:22,22:42:-83.84,-12.65,-73.08:99
-chr1	3197040	rs2250291	C	T	260.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=59.34;MQ0=0;OQ=469.67;QD=13.42;SB=-216.70	GT:AD:DP:GL:GQ	0/1:18,17:34:-60.50,-10.25,-62.96:99
-chr1	3197640	rs55866132	G	A	241.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.46;MQ=60.00;MQ0=0;OQ=793.46;QD=13.45;SB=-307.77	GT:AD:DP:GL:GQ	0/1:34,25:59:-100.40,-17.77,-123.91:99
-chr1	3197902	rs2500297	C	T	238.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=60.00;MQ0=0;OQ=756.06;QD=14.00;SB=-170.24	GT:AD:DP:GL:GQ	0/1:30,24:49:-93.65,-14.77,-87.43:99
-chr1	3198235	rs10909918	A	G	238.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=60.00;MQ0=0;OQ=490.49;QD=8.92;SB=-208.46	GT:AD:DP:GL:GQ	0/1:32,23:51:-67.70,-15.37,-121.94:99
-chr1	3198466	.	G	A	262.64	PASS	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=604.73;QD=12.34;SB=-281.22	GT:AD:DP:GL:GQ	0/1:28,21:46:-77.62,-13.87,-86.11:99
-chr1	3199356	rs2500295	T	C	571.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.75;MQ0=0;OQ=1482.44;QD=28.51;SB=-763.58	GT:AD:DP:GL:GQ	1/1:0,52:48:-151.88,-14.48,-0.05:99
-chr1	3199491	rs4648376	G	A	14.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=4.90;MQ=58.90;MQ0=0;OQ=2231.72;QD=37.83;SB=-1015.37	GT:AD:DP:GL:GQ	1/1:0,59:58:-226.79,-17.49,-0.03:99
-chr1	3199627	rs2500294	C	T	622.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=2326.22;QD=38.77;SB=-1091.37	GT:AD:DP:GL:GQ	1/1:0,60:58:-236.22,-17.47,-0.02:99
-chr1	3199783	rs1553291	A	G	564.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=1581.83;QD=29.29;SB=-575.98	GT:AD:DP:GL:GQ	1/1:0,54:51:-161.82,-15.38,-0.05:99
-chr1	3200187	.	C	T	35.88	PASS	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.26;MQ=59.60;MQ0=0;OQ=491.30;QD=10.45;SB=-217.71	GT:AD:DP:GL:GQ	0/1:29,18:43:-65.37,-12.96,-91.60:99
-chr1	3200810	rs4648468	A	G	447.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=1398.57;QD=30.40;SB=-596.06	GT:AD:DP:GL:GQ	1/1:0,46:43:-143.47,-12.96,-0.03:99
-chr1	3201105	rs10047257	C	T	220.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=596.34;QD=15.29;SB=-318.86	GT:AD:DP:GL:GQ	0/1:20,19:38:-74.37,-11.45,-63.70:99
-chr1	3201318	rs4648377	A	C	538.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=1615.09;QD=33.65;SB=-661.05	GT:AD:DP:GL:GQ	1/1:0,48:47:-165.11,-14.16,-0.02:99
-chr1	3201410	rs4648469	A	G	202.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1230.36;QD=30.76;SB=-513.23	GT:AD:DP:GL:GQ	1/1:0,39:38:-126.64,-11.45,-0.02:99
-chr1	3201613	rs4648470	C	T	79.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=60.00;MQ0=0;OQ=1081.89;QD=24.59;SB=-515.59	GT:AD:DP:GL:GQ	0/1:12,32:43:-124.44,-12.96,-36.35:99
-chr1	3202053	rs2500292	A	G	471	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=1432.25;QD=32.55;SB=-511.16	GT:AD:DP:GL:GQ	1/1:0,44:41:-146.83,-12.35,-0.02:99
-chr1	3202174	rs2500291	C	T	728.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=2429.46;QD=38.56;SB=-1207.61	GT:AD:DP:GL:GQ	1/1:1,62:61:-246.55,-18.37,-0.01:99
-chr1	3202451	rs2500290	G	C	18.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.98;MQ=58.98;MQ0=0;OQ=1616.44;QD=39.43;SB=-797.54	GT:AD:DP:GL:GQ	1/1:0,41:39:-165.25,-11.76,-0.02:99
-chr1	3202782	rs1875452	C	G	157.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.36;MQ=59.54;MQ0=0;OQ=2035.33;QD=40.71;SB=-884.21	GT:AD:DP:GL:GQ	1/1:0,50:48:-207.14,-14.47,-0.02:99
-chr1	3202806	rs2500289	A	G	260.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=59.19;MQ0=0;OQ=1923.10;QD=33.74;SB=-724.29	GT:AD:DP:GL:GQ	1/1:0,57:54:-195.91,-16.27,-0.02:99
-chr1	3203962	rs2500288	T	C	186.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.58;MQ0=0;OQ=1801.36;QD=32.75;SB=-828.32	GT:AD:DP:GL:GQ	1/1:0,55:51:-183.74,-15.36,-0.02:99
-chr1	3204030	rs7553849	T	C	226.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=56.20;MQ0=0;OQ=1684.70;QD=29.05;SB=-851.52	GT:AD:DP:GL:GQ	1/1:0,58:53:-172.10,-15.99,-0.05:99
-chr1	3204380	rs10442593	A	G	67.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=958.98;QD=29.97;SB=-369.57	GT:AD:DP:GL:GQ	1/1:0,32:28:-99.49,-8.43,-0.01:84.24
-chr1	3204592	rs2455144	A	G	617.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=2332.51;QD=29.90;SB=-1027.75	GT:AD:DP:GL:GQ	1/1:0,78:74:-236.91,-22.33,-0.08:99
-chr1	3204835	.	G	A	53.06	PASS	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.06;MQ=60.00;MQ0=0;OQ=892.55;QD=15.13;SB=-296.23	GT:AD:DP:GL:GQ	0/1:30,29:55:-109.11,-16.57,-93.52:99
-chr1	3204852	rs2500287	G	T	86	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=60.00;MQ0=0;OQ=2470.97;QD=33.85;SB=-613.02	GT:AD:DP:GL:GQ	1/1:1,71:71:-250.71,-21.39,-0.03:99
-chr1	3205054	.	A	G	35.05	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.07;MQ=60.00;MQ0=0;OQ=563.88;QD=10.44;SB=-299.62	GT:AD:DP:GL:GQ	0/1:29,25:52:-75.34,-15.67,-118.24:99
-chr1	3205180	rs2455143	A	T	124.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=2.69;MQ=58.71;MQ0=0;OQ=2383.23;QD=36.67;SB=-1091.65	GT:AD:DP:GL:GQ	1/1:0,65:64:-241.93,-19.28,-0.02:99
-chr1	3205492	rs2455142	T	G	512.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=49.74;MQ0=0;OQ=2083.81;QD=29.77;SB=-759.91	GT:AD:DP:GL:GQ	1/1:0,70:70:-212.03,-21.10,-0.07:99
-chr1	3205734	rs2455141	A	C	27.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=40.69;MQ0=0;OQ=504.37;QD=19.40;SB=-155.27	GT:AD:DP:GL:GQ	1/1:2,24:21:-57.94,-6.33,-3.92:24.11
-chr1	3205761	rs2455140	T	G	0.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=2.39;MQ=22.97;MQ0=1;OQ=235.32;QD=18.10;SB=-39.00	GT:AD:DP:GL:GQ	0/1:2,10:9:-29.50,-2.71,-3.64:9.30
-chr1	3205805	rs12728296	T	C	26.83	LowQual	AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=13.68;MQ0=0;QD=1.79;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,15:2:-6.09,-0.60,-0.00:6.01
-chr1	3205846	.	G	A	232.99	PASS	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.36;MQ0=0;OQ=538.85;QD=13.47;SB=-237.77	GT:AD:DP:GL:GQ	0/1:19,21:21:-63.50,-6.33,-16.25:99
-chr1	3206300	rs12036713	A	G	35.28	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=14.04;MQ0=4;QD=5.04;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,7:2:-6.94,-0.60,-0.00:6.02
-chr1	3206493	.	T	G	46.28	PASS	AC=2;AF=1.00;AN=2;DP=11;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=17.34;MQ0=4;OQ=70.14;QD=6.38;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,10:3:-10.50,-0.90,-0.00:9.03
-chr1	3206505	.	T	C	3.40	PASS	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=18.66;MQ0=4;OQ=95.85;QD=6.85;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,9:5:-14.37,-1.51,-4.06:25.51
-chr1	3206506	.	A	G	5.49	PASS	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=18.66;MQ0=4;OQ=74.94;QD=5.35;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,9:5:-12.29,-1.51,-3.97:24.63
-chr1	3206538	.	G	A	1.11	PASS	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=18.43;MQ0=3;OQ=73.15;QD=5.23;SB=-10.00	GT:AD:DP:GL:GQ	0/1:7,7:4:-11.80,-1.21,-3.10:18.92
-chr1	3206554	rs56276321	T	G	10.51	LowQual	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.60;MQ0=3;QD=0.53;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,5:8:-6.70,-2.41,-21.47:42.94
-chr1	3206566	.	T	C	28.09	PASS	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=22.53;MQ0=2;OQ=145.15;QD=6.91;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,9:12:-21.41,-3.62,-22.84:99
-chr1	3206567	.	A	G	6.01	PASS	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.53;MQ0=2;OQ=85.83;QD=4.09;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,9:11:-15.19,-3.32,-21.71:99
-chr1	3206577	.	C	T	7.20	PASS	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=22.19;MQ0=2;OQ=218.94;QD=10.43;SB=-10.00	GT:AD:DP:GL:GQ	0/1:10,11:11:-28.49,-3.31,-13.17:98.62
-chr1	3206588	.	A	C	10.65	LowQual	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=1;HaplotypeScore=2.88;MQ=22.98;MQ0=0;QD=0.59;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,6:7:-6.42,-2.11,-14.50:43.09
-chr1	3206599	.	G	A	2.11	PASS	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=22.00;MQ0=0;OQ=65.71;QD=4.11;SB=-10.00	GT:AD:DP:GL:GQ	0/1:7,9:7:-11.98,-2.12,-8.40:62.78
-chr1	3206700	.	A	G	0.69	PASS	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.64;MQ0=1;OQ=276.82;QD=18.45;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,14:12:-34.36,-3.62,-3.48:2.36
-chr1	3206761	.	A	G	22.65	LowQual	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=26.60;MQ0=1;QD=0.54;SB=-10.00	GT:AD:DP:GL:GQ	0/1:32,10:32:-15.20,-9.65,-103.92:55.47
-chr1	3206926	rs61759194	A	G	113.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=2.49;MQ=46.00;MQ0=0;OQ=649.36;QD=10.82;SB=-346.23	GT:AD:DP:GL:GQ	0/1:29,31:46:-82.08,-13.86,-88.11:99
-chr1	3207011	rs2455137	C	T	379.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=48.62;MQ0=0;OQ=1983.22;QD=35.41;SB=-860.00	GT:AD:DP:GL:GQ	1/1:0,56:50:-201.92,-15.06,-0.01:99
-chr1	3207294	rs2500284	G	A	102.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=1.30;MQ=58.88;MQ0=0;OQ=2616.26;QD=39.05;SB=-1335.76	GT:AD:DP:GL:GQ	1/1:1,66:66:-265.23,-19.89,-0.02:99
-chr1	3208189	rs2455136	A	T	142.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=2.14;MQ=59.12;MQ0=0;OQ=2529.01;QD=36.65;SB=-1261.52	GT:AD:DP:GL:GQ	1/1:0,69:68:-256.50,-20.48,-0.02:99
-chr1	3208783	rs2500283	G	C	612.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2831.75;QD=42.91;SB=-1184.48	GT:AD:DP:GL:GQ	1/1:0,66:66:-286.78,-19.89,-0.02:99
-chr1	3209357	rs2500282	A	G	594.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1981.22;QD=32.48;SB=-526.13	GT:AD:DP:GL:GQ	1/1:0,61:61:-201.75,-18.39,-0.04:99
-chr1	3209761	rs2455135	A	G	63.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1623.95;QD=30.64;SB=-619.36	GT:AD:DP:GL:GQ	1/1:0,53:46:-165.99,-13.85,-0.01:99
-chr1	3210242	rs2500281	G	A	563.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.01;MQ0=0;OQ=1613.10;QD=35.07;SB=-716.96	GT:AD:DP:GL:GQ	1/1:0,46:42:-164.91,-12.65,-0.01:99
-chr1	3210275	rs2455134	A	G	102.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=34.21;MQ0=0;OQ=983.95;QD=25.89;SB=-399.50	GT:AD:DP:GL:GQ	1/1:0,38:28:-101.99,-8.43,-0.01:84.26
-chr1	3210353	rs2455133	C	G	65.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.54;MQ=35.62;MQ0=2;OQ=1518.72;QD=29.78;SB=-723.73	GT:AD:DP:GL:GQ	1/1:4,47:41:-164.26,-12.36,-8.80:35.57
-chr1	3210943	rs2455132	T	C	34.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=58.65;MQ0=0;OQ=1292.96;QD=28.73;SB=-546.03	GT:AD:DP:GL:GQ	1/1:1,44:43:-137.07,-12.97,-4.19:87.75
-chr1	3211298	rs56357655	G	T	236.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.31;MQ0=0;OQ=570.69;QD=13.59;SB=-286.33	GT:AD:DP:GL:GQ	0/1:20,22:39:-72.10,-11.75,-66.92:99
-chr1	3211481	rs4648378	A	T	264.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1968.99;QD=35.80;SB=-994.60	GT:AD:DP:GL:GQ	1/1:0,55:54:-200.50,-16.27,-0.02:99
-chr1	3212566	rs3923081	A	G	604.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1445.27;QD=30.75;SB=-602.58	GT:AD:DP:GL:GQ	1/1:0,47:46:-148.15,-13.87,-0.04:99
-chr1	3213090	rs4648471	A	G	181.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=58.96;MQ0=0;OQ=1176.67;QD=14.53;SB=-570.90	GT:AD:DP:GL:GQ	0/1:40,41:78:-144.45,-23.50,-149.52:99
-chr1	3213140	rs4233025	C	T	288.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.52;MQ0=0;OQ=3371.29;QD=38.75;SB=-1393.36	GT:AD:DP:GL:GQ	1/1:0,86:84:-336.13,-25.31,-0.03:99
-chr1	3213393	rs4648472	G	A	290.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=58.95;MQ0=0;OQ=2168.73;QD=34.98;SB=-915.32	GT:AD:DP:GL:GQ	1/1:0,61:56:-220.48,-16.87,-0.02:99
-chr1	3213624	rs4648473	A	G	299.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=60.00;MQ0=0;OQ=2351.35;QD=35.09;SB=-1180.73	GT:AD:DP:GL:GQ	1/1:0,67:67:-238.75,-20.18,-0.03:99
-chr1	3213815	rs4145901	A	G	578.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=1913.13;QD=34.78;SB=-765.19	GT:AD:DP:GL:GQ	1/1:0,55:55:-194.92,-16.57,-0.02:99
-chr1	3214070	rs4145900	C	T	633.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.20;MQ0=0;OQ=2312.37;QD=39.87;SB=-883.19	GT:AD:DP:GL:GQ	1/1:0,58:58:-234.84,-17.47,-0.01:99
-chr1	3214663	rs2483258	A	G	141.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.74;MQ=58.20;MQ0=0;OQ=1545.60;QD=32.89;SB=-781.14	GT:AD:DP:GL:GQ	1/1:0,47:45:-158.16,-13.56,-0.02:99
-chr1	3215654	rs2500279	A	G	10.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=3;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=1630.84;QD=29.65;SB=-792.65	GT:AD:DP:GL:GQ	1/1:0,55:51:-166.71,-15.38,-0.04:99
-chr1	3215800	rs2500278	C	T	196.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.49;MQ=60.00;MQ0=0;OQ=2097.43;QD=35.55;SB=-1034.29	GT:AD:DP:GL:GQ	1/1:1,57:55:-213.35,-16.58,-0.03:99
-chr1	3216399	rs59127130	T	A	71.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=3.18;MQ=59.01;MQ0=0;OQ=500.47;QD=10.65;SB=-267.66	GT:AD:DP:GL:GQ	0/1:27,19:45:-66.90,-13.56,-91.26:99
-chr1	3218505	.	G	T	13.88	PASS	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.49;MQ=59.42;MQ0=0;OQ=562.03;QD=14.05;SB=-143.82	GT:AD:DP:GL:GQ	0/1:17,23:34:-69.73,-10.24,-51.47:99
-chr1	3223491	rs2500277	T	C	605.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1039.56;QD=14.85;SB=-437.57	GT:AD:DP:GL:GQ	0/1:34,36:70:-128.33,-21.09,-137.20:99
-chr1	3227069	rs2500274	G	A	733.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2547.84;QD=38.03;SB=-1230.64	GT:AD:DP:GL:GQ	1/1:0,67:65:-258.39,-19.58,-0.02:99
-chr1	3231689	rs2500271	A	G	65.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=6.09;MQ=58.05;MQ0=0;OQ=618.77;QD=12.89;SB=-326.13	GT:AD:DP:GL:GQ	0/1:22,25:43:-80.91,-15.74,-76.88:99
-chr1	3232314	rs2500270	C	T	276.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=58.93;MQ0=0;OQ=890.12;QD=13.69;SB=-466.96	GT:AD:DP:GL:GQ	0/1:37,28:63:-111.27,-18.97,-132.21:99
-chr1	3232391	rs7521865	T	C	80.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=59.46;MQ0=0;OQ=581.07;QD=12.11;SB=-302.66	GT:AD:DP:GL:GQ	0/1:25,23:45:-74.95,-13.56,-94.63:99
-chr1	3232424	rs11576578	C	T	337.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=583.63;QD=16.21;SB=-245.53	GT:AD:DP:GL:GQ	0/1:18,18:35:-72.19,-10.55,-57.05:99
-chr1	3232513	rs2500268	C	T	2.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=60.10;MQ0=0;OQ=81.92;QD=2.64;SB=-51.23	GT:AD:DP:GL:GQ	0/1:26,5:28:-19.91,-8.44,-80.68:99
-chr1	3232545	rs7550743	G	C	135.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=204.00;QD=6.18;SB=-89.25	GT:AD:DP:GL:GQ	0/1:25,8:26:-31.53,-7.85,-72.48:99
-chr1	3233210	rs2483268	C	T	55.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=59.45;MQ0=0;OQ=685.34;QD=20.16;SB=-292.33	GT:AD:DP:GL:GQ	0/1:13,21:31:-81.16,-9.34,-34.58:99
-chr1	3233282	rs2483269	C	T	150.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.51;MQ0=0;OQ=931.05;QD=19.81;SB=-450.84	GT:AD:DP:GL:GQ	0/1:20,27:46:-110.24,-13.86,-67.60:99
-chr1	3234117	rs2483270	T	C	92.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=1;HaplotypeScore=1.03;MQ=54.48;MQ0=0;OQ=186.80;QD=8.90;SB=-89.99	GT:AD:DP:GL:GQ	0/1:13,8:21:-28.30,-6.33,-49.94:99
-chr1	3235659	rs56368529	T	G	3.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=4.81;MQ=58.01;MQ0=0;OQ=299.04;QD=9.06;SB=-59.90	GT:AD:DP:GL:GQ	0/1:16,17:27:-41.32,-8.14,-54.29:99
-chr1	3236031	rs55929121	A	G	111.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=59.44;MQ0=0;OQ=382.21;QD=9.32;SB=-138.40	GT:AD:DP:GL:GQ	0/1:24,17:41:-53.86,-12.36,-96.85:99
-chr1	3237249	rs2483272	T	C	227.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=58.89;MQ0=0;OQ=695.19;QD=16.55;SB=-364.39	GT:AD:DP:GL:GQ	0/1:17,25:40:-84.86,-12.05,-61.97:99
-chr1	3237696	rs11577229	A	C	60.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.98;MQ=59.46;MQ0=0;OQ=605.90;QD=14.09;SB=-151.87	GT:AD:DP:GL:GQ	0/1:20,23:42:-76.53,-12.66,-70.16:99
-chr1	3237725	rs2483273	C	T	273.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=458.56;QD=11.46;SB=-253.26	GT:AD:DP:GL:GQ	0/1:23,17:37:-60.29,-11.15,-74.02:99
-chr1	3237958	rs2483274	A	G	334.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=489.91;QD=10.42;SB=-162.48	GT:AD:DP:GL:GQ	0/1:24,23:45:-65.84,-13.57,-92.79:99
-chr1	3238582	rs56033677	T	C	21.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=59.43;MQ0=0;OQ=296.91;QD=9.00;SB=-160.33	GT:AD:DP:GL:GQ	0/1:18,15:30:-42.02,-9.04,-67.71:99
-chr1	3238892	rs55807399	G	T	41.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=58.83;MQ0=0;OQ=103.10;QD=6.44;SB=-69.87	GT:AD:DP:GL:GQ	0/1:10,6:13:-17.51,-3.92,-27.55:99
-chr1	3239158	.	C	T	1.04	PASS	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.48;MQ0=0;OQ=666.04;QD=18.50;SB=-35.64	GT:AD:DP:GL:GQ	0/1:16,20:35:-80.44,-10.55,-47.82:99
-chr1	3239323	.	G	A	79.22	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=885.68;QD=16.10;SB=-289.76	GT:AD:DP:GL:GQ	0/1:28,27:52:-107.52,-15.67,-84.40:99
-chr1	3240283	rs1889121	A	G	183.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=58.44;MQ0=0;OQ=423.56;QD=10.86;SB=-163.96	GT:AD:DP:GL:GQ	0/1:18,20:36:-60.24,-14.60,-67.49:99
-chr1	3241019	rs1110307	T	C	317.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.03;MQ0=0;OQ=790.39;QD=11.80;SB=-362.96	GT:AD:DP:GL:GQ	0/1:34,33:66:-102.22,-19.90,-132.82:99
-chr1	3241835	rs4648477	G	A	340.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.63;MQ0=0;OQ=880.63;QD=17.27;SB=-457.99	GT:AD:DP:GL:GQ	0/1:24,27:48:-105.81,-14.46,-75.34:99
-chr1	3241867	rs4648478	C	T	165.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.81;MQ=58.72;MQ0=0;OQ=927.39;QD=18.18;SB=-291.79	GT:AD:DP:GL:GQ	0/1:22,29:49:-110.80,-14.77,-66.95:99
-chr1	3241964	rs2483278	C	T	199.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=4.49;MQ=58.47;MQ0=0;OQ=815.99;QD=11.33;SB=-270.80	GT:AD:DP:GL:GQ	0/1:44,28:65:-104.47,-19.59,-130.43:99
-chr1	3242641	rs10797388	C	T	87.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=59.66;MQ0=0;OQ=1468.23;QD=21.91;SB=-716.28	GT:AD:DP:GL:GQ	0/1:24,43:63:-169.09,-18.98,-69.99:99
-chr1	3243022	rs4648479	C	G	270.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.32;MQ0=0;OQ=1259.62;QD=18.52;SB=-604.54	GT:AD:DP:GL:GQ	0/1:33,35:68:-149.74,-20.49,-145.47:99
-chr1	3243475	rs2500264	A	G	371.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=57.70;MQ0=0;OQ=965.24;QD=13.04;SB=-435.59	GT:AD:DP:GL:GQ	0/1:35,39:72:-121.52,-21.71,-132.46:99
-chr1	3243538	rs2500263	C	T	449.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=59.43;MQ0=0;OQ=1163.15;QD=14.36;SB=-551.30	GT:AD:DP:GL:GQ	0/1:44,37:79:-143.40,-23.80,-157.59:99
-chr1	3243563	rs10909933	A	T	21.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=5.38;MQ=58.82;MQ0=0;OQ=1256.33;QD=15.90;SB=-624.35	GT:AD:DP:GL:GQ	0/1:39,40:77:-152.11,-23.19,-142.90:99
-chr1	3243699	rs7516137	C	G	384.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=58.95;MQ0=1;OQ=1414.58;QD=19.38;SB=-612.10	GT:AD:DP:GL:GQ	0/1:31,42:71:-166.15,-21.41,-133.01:99
-chr1	3243749	rs7516150	C	T	110.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=4.27;MQ=59.28;MQ0=0;OQ=1059.88;QD=16.56;SB=-511.08	GT:AD:DP:GL:GQ	0/1:31,33:63:-128.25,-18.98,-110.55:99
-chr1	3243801	rs7552331	G	A	50.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=3.37;MQ=59.68;MQ0=0;OQ=1395.05;QD=19.38;SB=-586.45	GT:AD:DP:GL:GQ	0/1:31,41:71:-164.18,-21.39,-100.20:99
-chr1	3244201	rs1572038	G	A	223.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.63;MQ=60.00;MQ0=0;OQ=849.89;QD=14.40;SB=-320.28	GT:AD:DP:GL:GQ	0/1:33,26:58:-105.75,-17.48,-105.23:99
-chr1	3244229	rs1572037	T	C	103.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=1.14;MQ=59.74;MQ0=0;OQ=759.65;QD=10.70;SB=-211.19	GT:AD:DP:GL:GQ	0/1:40,31:70:-100.34,-21.09,-160.53:99
-chr1	3245634	.	G	A	2.67	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=2;HaplotypeScore=5.38;MQ=59.21;MQ0=0;OQ=768.53;QD=14.50;SB=-362.88	GT:AD:DP:GL:GQ	0/1:27,25:49:-94.91,-14.77,-78.82:99
-chr1	3245968	rs1999527	C	A	270.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.55;MQ0=0;OQ=832.76;QD=16.33;SB=-309.70	GT:AD:DP:GL:GQ	0/1:20,31:46:-100.42,-13.86,-57.62:99
-chr1	3246110	rs1999526	G	A	145.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.11;MQ=60.00;MQ0=0;OQ=722.36;QD=13.89;SB=-206.02	GT:AD:DP:GL:GQ	0/1:25,26:46:-91.77,-16.25,-79.35:99
-chr1	3247225	rs944819	T	G	210.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=59.73;MQ0=0;OQ=1004.82;QD=11.68;SB=-427.67	GT:AD:DP:GL:GQ	0/1:50,36:86:-129.67,-25.90,-183.72:99
-chr1	3247599	rs2483281	C	T	240.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=58.98;MQ0=0;OQ=504.82;QD=12.31;SB=-180.16	GT:AD:DP:GL:GQ	0/1:24,17:38:-65.21,-11.45,-77.36:99
-chr1	3251376	rs4648379	C	T	354.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=1.15;MQ=59.76;MQ0=0;OQ=1302.21;QD=16.91;SB=-654.31	GT:AD:DP:GL:GQ	0/1:37,40:76:-156.40,-22.89,-133.27:99
-chr1	3251542	rs4415513	C	T	583.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=1033.27;QD=16.67;SB=-449.45	GT:AD:DP:GL:GQ	0/1:31,31:61:-125.00,-18.39,-98.88:99
-chr1	3252129	rs12564920	A	G	258.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.38;MQ0=0;OQ=448.15;QD=9.96;SB=-222.39	GT:AD:DP:GL:GQ	0/1:23,22:39:-59.86,-11.76,-74.90:99
-chr1	3253722	.	G	A	5.82	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=951.14;QD=18.65;SB=-376.90	GT:AD:DP:GL:GQ	0/1:22,29:50:-113.46,-15.06,-78.22:99
-chr1	3254050	rs2483289	A	C	189.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=800.56;QD=13.80;SB=-367.58	GT:AD:DP:GL:GQ	0/1:28,30:55:-99.91,-16.57,-92.54:99
-chr1	3254157	rs2500257	A	G	11.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=2;HaplotypeScore=3.42;MQ=59.13;MQ0=0;OQ=570.29;QD=13.26;SB=-176.97	GT:AD:DP:GL:GQ	0/1:21,22:40:-72.37,-12.05,-79.78:99
-chr1	3257948	.	G	C	98.91	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=35.14;MQ0=0;QD=7.07;SB=14.07	GT:AD:DP:GL:GQ	0/1:10,4:12:-16.79,-3.62,-31.08:99
-chr1	3257994	rs60920916	T	C	0.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=2;HaplotypeScore=2.63;MQ=42.15;MQ0=0;OQ=77.87;QD=4.58;SB=20.08	GT:AD:DP:GL:GQ	0/1:13,4:15:-15.59,-4.52,-39.62:99
-chr1	3258005	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=3;HaplotypeScore=6.10;MQ=42.12;MQ0=0;OQ=65.85;QD=3.29;SB=23.09	GT:AD:DP:GL:GQ	0/1:16,4:17:-15.00,-5.13,-47.65:98.69
-chr1	3258920	.	C	T	2.85	PASS	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=553.46;QD=12.87;SB=-213.92	GT:AD:DP:GL:GQ	0/1:24,19:40:-70.69,-12.06,-71.24:99
-chr1	3262401	rs7550526	G	A	60.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=58.89;MQ0=0;OQ=1567.02;QD=37.31;SB=-629.85	GT:AD:DP:GL:GQ	1/1:0,42:40:-160.30,-12.05,-0.01:99
-chr1	3262685	rs946759	C	A	62.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=-0.12;MQ=57.75;MQ0=0;OQ=630.41;QD=19.70;SB=-314.39	GT:AD:DP:GL:GQ	1/1:3,29:21:-69.14,-6.33,-2.51:38.17
-chr1	3262923	rs946758	G	A	287.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=59.58;MQ0=0;OQ=2113.36;QD=38.42;SB=-1046.71	GT:AD:DP:GL:GQ	1/1:0,55:53:-214.93,-15.96,-0.01:99
-chr1	3263976	rs55805251	C	T	94.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=58.59;MQ0=0;OQ=518.72;QD=15.72;SB=-142.59	GT:AD:DP:GL:GQ	0/1:15,18:30:-64.20,-9.04,-43.17:99
-chr1	3264566	rs2483265	T	C	43.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=868.82;QD=26.33;SB=-460.17	GT:AD:DP:GL:GQ	1/1:0,33:29:-90.50,-8.75,-0.03:87.17
-chr1	3265009	rs12748963	C	T	26.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=5.21;MQ=58.97;MQ0=0;OQ=826.30;QD=18.36;SB=-347.35	GT:AD:DP:GL:GQ	0/1:19,25:43:-98.87,-12.96,-59.86:99
-chr1	3266234	rs12073172	G	A	592.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.50;MQ0=0;OQ=1102.37;QD=35.56;SB=-562.26	GT:AD:DP:GL:GQ	1/1:0,31:30:-113.84,-9.05,-0.02:90.27
-chr1	3266600	rs2500280	G	C	2.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=8.93;MQ=59.31;MQ0=0;OQ=2375.28;QD=38.94;SB=-992.26	GT:AD:DP:GL:GQ	1/1:0,60:56:-241.13,-16.87,-0.02:99
-chr1	3266936	.	G	A	52.38	PASS	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.54;MQ=59.62;MQ0=0;OQ=518.77;QD=10.59;SB=-162.22	GT:AD:DP:GL:GQ	0/1:32,17:48:-69.63,-14.47,-101.23:99
-chr1	3267606	rs884308	C	T	94.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1579.42;QD=39.49;SB=-771.63	GT:AD:DP:GL:GQ	1/1:0,40:40:-161.54,-12.05,-0.01:99
-chr1	3268390	rs11583116	G	A	130.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=58.33;MQ0=0;OQ=690.56;QD=13.81;SB=-242.25	GT:AD:DP:GL:GQ	0/1:26,24:43:-85.30,-12.96,-65.77:99
-chr1	3269184	rs7524171	A	G	11.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=5.01;MQ=59.60;MQ0=0;OQ=1781.26;QD=30.71;SB=-880.26	GT:AD:DP:GL:GQ	1/1:0,58:53:-181.75,-15.98,-0.04:99
-chr1	3269881	rs2500262	T	C	201.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=59.11;MQ0=0;OQ=1534.16;QD=29.50;SB=-546.01	GT:AD:DP:GL:GQ	1/1:0,52:49:-157.05,-14.78,-0.05:99
-chr1	3271322	.	C	T	58.72	PASS	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=59.40;MQ0=0;OQ=375.26;QD=12.11;SB=-208.89	GT:AD:DP:GL:GQ	0/1:17,14:28:-49.26,-8.45,-45.56:99
-chr1	3273388	rs4648485	G	A	602.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2075.89;QD=37.74;SB=-912.72	GT:AD:DP:GL:GQ	1/1:0,55:53:-211.19,-15.97,-0.02:99
-chr1	3275010	rs4648486	C	T	123.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.32;MQ=58.75;MQ0=0;OQ=2039.90;QD=39.23;SB=-914.69	GT:AD:DP:GL:GQ	1/1:0,52:51:-207.59,-15.36,-0.01:99
-chr1	3275164	rs4648487	T	C	21.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=5.20;MQ=59.14;MQ0=0;OQ=1843.56;QD=34.14;SB=-799.67	GT:AD:DP:GL:GQ	1/1:0,54:53:-187.96,-15.97,-0.02:99
-chr1	3275488	rs6424073	G	A	234.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2488.63;QD=39.50;SB=-1214.11	GT:AD:DP:GL:GQ	1/1:0,63:63:-252.47,-18.98,-0.02:99
-chr1	3277411	rs12138292	A	G	1.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.96;MQ=56.17;MQ0=0;OQ=1416.27;QD=24.85;SB=-414.15	GT:AD:DP:GL:GQ	1/1:0,57:48:-145.28,-14.50,-0.07:99
-chr1	3279384	rs12135987	G	A	273.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.39;MQ0=0;OQ=2572.74;QD=37.83;SB=-927.33	GT:AD:DP:GL:GQ	1/1:0,68:65:-260.88,-19.58,-0.02:99
-chr1	3279467	rs6688949	T	C	3.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=2.45;MQ=57.66;MQ0=0;OQ=1297.10;QD=25.94;SB=-450.26	GT:AD:DP:GL:GQ	1/1:0,50:40:-133.33,-12.06,-0.03:99
-chr1	3279589	rs1333190	C	T	668.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=1807.78;QD=36.89;SB=-784.69	GT:AD:DP:GL:GQ	1/1:0,49:46:-184.37,-13.86,-0.01:99
-chr1	3279831	rs1333189	C	T	229.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=57.13;MQ0=0;OQ=1483.34;QD=36.18;SB=-765.52	GT:AD:DP:GL:GQ	1/1:0,40:38:-151.93,-11.45,-0.01:99
-chr1	3280999	rs2249860	A	C	81.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=57.93;MQ0=0;OQ=1454.60;QD=33.83;SB=-752.07	GT:AD:DP:GL:GQ	1/1:0,43:42:-149.06,-12.65,-0.01:99
-chr1	3281067	rs2368593	G	T	64.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=3.86;MQ=58.09;MQ0=0;OQ=2257.03;QD=31.79;SB=-1064.90	GT:AD:DP:GL:GQ	1/1:0,70:66:-229.32,-19.89,-0.04:99
-chr1	3281249	.	G	A	160.30	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.53;MQ0=0;OQ=717.46;QD=13.54;SB=-318.84	GT:AD:DP:GL:GQ	0/1:27,26:46:-88.90,-13.87,-75.19:99
-chr1	3282736	rs4648488	C	T	347.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.52;MQ0=0;OQ=841.46;QD=17.53;SB=-434.81	GT:AD:DP:GL:GQ	0/1:21,27:46:-101.29,-13.86,-70.83:99
-chr1	3283525	rs4648489	A	G	474.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=1662.64;QD=30.23;SB=-834.46	GT:AD:DP:GL:GQ	1/1:0,55:53:-169.90,-15.99,-0.06:99
-chr1	3284832	rs1538693	G	A	695.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1980.96;QD=38.10;SB=-939.35	GT:AD:DP:GL:GQ	1/1:0,52:51:-201.70,-15.37,-0.02:99
-chr1	3285724	.	G	A	0.22	PASS	AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=1;HaplotypeScore=6.56;MQ=21.51;MQ0=1;OQ=72.03;QD=9.00;SB=-40.54	GT:AD:DP:GL:GQ	0/1:2,5:4:-11.69,-1.21,-3.37:21.64
-chr1	3285990	.	G	A	25.35	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=1;HaplotypeScore=5.35;MQ=15.41;MQ0=12;QD=0.85;SB=-32.52	GT:AD:DP:GL:GQ	0/1:21,9:5:-7.32,-1.51,-9.51:58.18
-chr1	3286144	.	A	G	36.06	LowQual	AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=14.48;MQ0=3;QD=4.51;SB=-6.99	GT:AD:DP:GL:GQ	0/1:4,3:3:-7.79,-0.90,-4.06:31.52
-chr1	3286152	.	A	C	0.09	PASS	AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=27.22;MQ0=3;OQ=114.38;QD=16.34;SB=-46.01	GT:AD:DP:GL:GQ	1/1:0,7:4:-14.97,-1.20,-0.00:12.04
-chr1	3286284	.	G	A	36.93	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=3.77;MQ=31.49;MQ0=4;QD=1.27;SB=-29.53	GT:AD:DP:GL:GQ	0/1:22,7:15:-11.50,-4.52,-41.17:69.76
-chr1	3286312	.	G	A	19.94	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=1;HaplotypeScore=9.31;MQ=28.36;MQ0=5;QD=0.59;SB=-24.50	GT:AD:DP:GL:GQ	0/1:27,6:17:-10.40,-5.13,-47.64:52.73
-chr1	3286320	.	C	A	227.39	HARD_TO_VALIDATE;Indel	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=8.75;MQ=31.04;MQ0=4;QD=5.98;SB=-25.91	GT:AD:DP:GL:GQ	0/1:27,11:20:-32.05,-6.03,-35.21:99
-chr1	3286354	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=1;HaplotypeScore=6.21;MQ=33.14;MQ0=5;OQ=87.60;QD=2.92;SB=-62.36	GT:AD:DP:GL:GQ	0/1:22,7:14:-19.10,-7.05,-34.67:99
-chr1	3286558	rs61043152	G	A	1.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=8.99;MQ=54.01;MQ0=1;OQ=487.76;QD=11.09;SB=-75.56	GT:AD:DP:GL:GQ	0/1:23,21:40:-64.12,-12.06,-79.70:99
-chr1	3286811	.	T	C	44.59	PASS	AC=2;AF=1.00;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.88;MQ=60.00;MQ0=0;OQ=1964.33;QD=34.46;SB=-944.38	GT:AD:DP:GL:GQ	1/1:0,57:56:-200.04,-16.87,-0.02:99
-chr1	3287141	rs11584942	G	A	391.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.82;MQ0=0;OQ=780.63;QD=15.31;SB=-324.32	GT:AD:DP:GL:GQ	0/1:25,26:47:-95.51,-14.16,-75.83:99
-chr1	3287246	rs11584967	G	A	573.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=877.40;QD=15.67;SB=-384.91	GT:AD:DP:GL:GQ	0/1:28,28:54:-107.29,-16.27,-98.41:99
-chr1	3287659	rs4648490	A	C	117.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.24;MQ=58.26;MQ0=0;OQ=1692.37;QD=33.18;SB=-840.06	GT:AD:DP:GL:GQ	1/1:0,51:50:-172.85,-15.06,-0.02:99
-chr1	3290667	rs868688	C	T	279.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=58.44;MQ0=0;OQ=2018.08;QD=35.40;SB=-933.25	GT:AD:DP:GL:GQ	1/1:0,57:52:-205.41,-15.67,-0.02:99
-chr1	3290990	rs868689	T	G	679.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.27;MQ0=0;OQ=1815.91;QD=31.86;SB=-898.65	GT:AD:DP:GL:GQ	1/1:0,57:52:-185.19,-15.66,-0.02:99
-chr1	3292591	rs11810266	C	G	73.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=59.54;MQ0=0;OQ=822.36;QD=20.06;SB=-350.43	GT:AD:DP:GL:GQ	0/1:18,23:40:-97.58,-12.06,-74.61:99
-chr1	3293306	rs2245703	T	C	622.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2385.34;QD=35.60;SB=-962.70	GT:AD:DP:GL:GQ	1/1:0,67:67:-242.14,-20.18,-0.02:99
-chr1	3293627	rs6676024	C	T	186.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.97;MQ0=0;OQ=1016.67;QD=17.23;SB=-303.79	GT:AD:DP:GL:GQ	0/1:29,30:58:-122.43,-17.48,-92.51:99
-chr1	3293798	rs2065525	C	G	62.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=58.34;MQ0=0;OQ=2298.73;QD=40.33;SB=-651.91	GT:AD:DP:GL:GQ	1/1:0,56:54:-233.47,-16.27,-0.01:99
-chr1	3294876	rs17399998	C	T	445.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=1142.20;QD=15.23;SB=-563.39	GT:AD:DP:GL:GQ	0/1:40,35:73:-139.51,-22.00,-126.39:99
-chr1	3295312	rs6687463	A	G	1.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=5.24;MQ=59.03;MQ0=0;OQ=1175.21;QD=27.33;SB=-477.09	GT:AD:DP:GL:GQ	1/1:0,42:38:-121.14,-11.46,-0.04:99
-chr1	3295326	.	C	A	16.33	PASS	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=58.87;MQ0=0;OQ=469.13;QD=12.68;SB=-130.80	GT:AD:DP:GL:GQ	0/1:19,18:34:-60.44,-10.25,-57.03:99
-chr1	3295820	.	C	T	40.94	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=844.76;QD=17.60;SB=-369.85	GT:AD:DP:GL:GQ	0/1:21,27:46:-101.62,-13.86,-70.72:99
-chr1	3296384	rs6686140	C	A	6.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=6.50;MQ=59.17;MQ0=0;OQ=324.87;QD=11.60;SB=-121.49	GT:AD:DP:GL:GQ	0/1:8,20:20:-41.81,-6.04,-18.74:99
-chr1	3296715	rs2151350	T	G	0.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=4;HaplotypeScore=2.18;MQ=58.99;MQ0=0;OQ=1168.63;QD=25.41;SB=-611.86	GT:AD:DP:GL:GQ	1/1:0,46:39:-120.49,-11.76,-0.04:99
-chr1	3297308	rs2493281	A	G	8.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.21;MQ=58.18;MQ0=1;OQ=1041.73;QD=26.04;SB=-499.54	GT:AD:DP:GL:GQ	1/1:1,39:33:-107.79,-9.95,-0.03:99
-chr1	3297606	rs2493278	T	C	732.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.88;MQ0=0;OQ=2573.66;QD=35.26;SB=-1043.85	GT:AD:DP:GL:GQ	1/1:0,73:73:-260.97,-21.99,-0.02:99
-chr1	3298358	rs2493268	T	C	154.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.44;MQ=58.22;MQ0=0;OQ=1688.23;QD=33.76;SB=-851.05	GT:AD:DP:GL:GQ	1/1:0,50:48:-172.42,-14.46,-0.02:99
-chr1	3298817	rs12139767	G	C	583.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=898.96;QD=13.62;SB=-383.19	GT:AD:DP:GL:GQ	0/1:39,27:65:-112.80,-19.62,-153.47:99
-chr1	3299326	rs35864014	G	A	497.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=1037.02;QD=15.25;SB=-535.48	GT:AD:DP:GL:GQ	0/1:36,32:68:-127.47,-20.48,-131.88:99
-chr1	3301121	rs6702992	C	T	313.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.53;MQ0=0;OQ=194.21;QD=10.22;SB=-113.94	GT:AD:DP:GL:GQ	0/1:12,7:19:-28.43,-5.72,-42.63:99
-chr1	3301284	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=11;HaplotypeScore=19.15;MQ=56.72;MQ0=0;OQ=88.35;QD=1.38;SB=59.21	GT:AD:DP:GL:GQ	0/1:53,11:56:-28.99,-16.87,-158.63:99
-chr1	3301891	rs883678	C	G	91.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.56;MQ0=0;OQ=812.38;QD=19.34;SB=-299.58	GT:AD:DP:GL:GQ	0/1:20,22:42:-97.18,-12.66,-83.21:99
-chr1	3302116	rs17822575	T	G	316.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.54;MQ0=0;OQ=510.49;QD=12.45;SB=-250.83	GT:AD:DP:GL:GQ	0/1:20,21:40:-66.39,-12.05,-67.05:99
-chr1	3302296	rs10909937	C	T	502.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1321.67;QD=36.71;SB=-625.01	GT:AD:DP:GL:GQ	1/1:0,36:34:-135.76,-10.24,-0.01:99
-chr1	3302524	rs56378103	C	T	103.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=58.71;MQ0=0;OQ=1572.33;QD=29.12;SB=-689.92	GT:AD:DP:GL:GQ	1/1:0,52:42:-160.84,-12.66,-0.02:99
-chr1	3302527	.	C	T	6.09	PASS	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=5.35;MQ=58.33;MQ0=0;OQ=1011.78;QD=18.07;SB=-471.49	GT:AD:DP:GL:GQ	0/1:25,31:52:-120.14,-15.67,-71.42:99
-chr1	3302823	rs12726710	C	T	452.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=952.26;QD=17.31;SB=-305.83	GT:AD:DP:GL:GQ	0/1:25,30:55:-115.09,-16.58,-80.89:99
-chr1	3303142	rs7535965	G	A	141.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=58.64;MQ0=0;OQ=1848.10;QD=38.50;SB=-836.62	GT:AD:DP:GL:GQ	1/1:0,48:47:-188.41,-14.16,-0.02:99
-chr1	3304456	rs17822581	A	G	359.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=58.93;MQ0=0;OQ=1113.18;QD=17.13;SB=-574.04	GT:AD:DP:GL:GQ	0/1:27,38:62:-133.28,-18.68,-95.39:99
-chr1	3304922	rs57432749	C	T	181.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=2.15;MQ=59.75;MQ0=0;OQ=993.31;QD=13.07;SB=-496.07	GT:AD:DP:GL:GQ	0/1:41,34:74:-127.49,-24.88,-150.46:99
-chr1	3305219	rs12144338	C	T	131.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=59.67;MQ0=0;OQ=987.68;QD=17.33;SB=-284.79	GT:AD:DP:GL:GQ	0/1:26,31:53:-118.03,-15.98,-72.20:99
-chr1	3305551	.	G	A	103.37	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=2.10;MQ=59.39;MQ0=0;OQ=1099.92;QD=15.94;SB=-511.04	GT:AD:DP:GL:GQ	0/1:36,33:68:-133.77,-20.49,-112.10:99
-chr1	3305678	rs7542793	G	A	440.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.35;MQ0=0;OQ=1064.35;QD=16.63;SB=-455.47	GT:AD:DP:GL:GQ	0/1:30,34:62:-128.41,-18.69,-93.40:99
-chr1	3305692	rs12737284	G	A	493.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.31;MQ0=0;OQ=901.95;QD=14.79;SB=-398.19	GT:AD:DP:GL:GQ	0/1:31,30:59:-111.27,-17.79,-96.32:99
-chr1	3305845	rs12117228	T	C	284.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=60.00;MQ0=0;OQ=892.28;QD=11.74;SB=-260.21	GT:AD:DP:GL:GQ	0/1:38,38:73:-114.51,-22.00,-150.21:99
-chr1	3305873	rs7551733	C	G	174.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.43;MQ=60.00;MQ0=0;OQ=1089.18;QD=17.02;SB=-530.69	GT:AD:DP:GL:GQ	0/1:32,32:62:-130.89,-18.69,-134.52:99
-chr1	3306535	rs10909939	T	C	528.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=956.73;QD=17.08;SB=-375.64	GT:AD:DP:GL:GQ	0/1:23,33:55:-115.53,-16.57,-90.24:99
-chr1	3306616	rs10909940	G	A	39.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=60.00;MQ0=0;OQ=1181.64;QD=23.63;SB=-497.15	GT:AD:DP:GL:GQ	0/1:15,35:49:-136.22,-14.77,-45.61:99
-chr1	3306995	rs12743248	G	A	92.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=59.54;MQ0=0;OQ=921.67;QD=15.36;SB=-465.48	GT:AD:DP:GL:GQ	0/1:29,31:55:-112.03,-16.58,-86.62:99
-chr1	3307093	rs12747145	G	A	172.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.50;MQ0=0;OQ=526.33;QD=14.23;SB=-229.52	GT:AD:DP:GL:GQ	0/1:18,17:34:-69.44,-13.52,-51.06:99
-chr1	3307640	rs6424074	A	G	354.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.52;MQ0=0;OQ=483.77;QD=10.08;SB=-196.29	GT:AD:DP:GL:GQ	0/1:28,20:48:-66.12,-14.46,-114.20:99
-chr1	3307747	rs6424075	G	T	374.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.24;MQ0=0;OQ=884.55;QD=14.04;SB=-359.35	GT:AD:DP:GL:GQ	0/1:31,32:59:-109.52,-17.78,-88.61:99
-chr1	3308193	rs7551796	G	A	363.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.69;MQ0=0;OQ=1293.28;QD=17.24;SB=-465.48	GT:AD:DP:GL:GQ	0/1:35,40:71:-154.00,-21.39,-119.84:99
-chr1	3308294	rs11576794	C	T	278.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.09;MQ=57.73;MQ0=0;OQ=809.01;QD=14.19;SB=-410.42	GT:AD:DP:GL:GQ	0/1:31,26:56:-101.07,-16.88,-98.51:99
-chr1	3308295	rs11577526	A	G	45.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=4.09;MQ=57.69;MQ0=0;OQ=1861.63;QD=33.24;SB=-741.99	GT:AD:DP:GL:GQ	1/1:0,56:55:-189.77,-16.57,-0.03:99
-chr1	3308392	rs11578011	T	C	195.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=59.80;MQ0=0;OQ=1812.46;QD=30.21;SB=-790.65	GT:AD:DP:GL:GQ	1/1:0,59:59:-188.08,-20.60,-3.25:99
-chr1	3308574	rs5024246	G	A	333.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.97;MQ0=0;OQ=876.20;QD=19.47;SB=-325.85	GT:AD:DP:GL:GQ	0/1:19,26:45:-104.46,-13.56,-63.60:99
-chr1	3308629	rs10909942	C	G	63.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.03;HRun=0;HaplotypeScore=2.61;MQ=58.12;MQ0=0;OQ=1384.57;QD=36.44;SB=-590.68	GT:AD:DP:GL:GQ	1/1:0,37:37:-142.07,-10.86,-0.03:99
-chr1	3308702	rs56148282	G	A	636.18	Indel	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.59;MQ0=0;QD=19.28;SB=-248.56	GT:AD:DP:GL:GQ	0/1:12,21:30:-75.94,-9.04,-37.32:99
-chr1	3308921	rs1889124	A	G	16.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=1.23;MQ=58.83;MQ0=0;OQ=1016.70;QD=28.24;SB=-485.51	GT:AD:DP:GL:GQ	1/1:0,36:33:-105.29,-9.95,-0.03:99
-chr1	3309492	rs4353034	G	A	0.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=16.76;MQ=57.87;MQ0=0;OQ=200.25;QD=6.07;SB=-37.01	GT:AD:DP:GL:GQ	0/1:23,8:31:-40.02,-16.71,-79.20:99
-chr1	3309534	rs12562397	C	T	380.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.05;MQ0=0;OQ=1380.14;QD=38.34;SB=-494.65	GT:AD:DP:GL:GQ	1/1:0,36:35:-141.61,-10.54,-0.01:99
-chr1	3309541	rs12562399	C	G	28.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.39;MQ0=0;OQ=1543.76;QD=40.63;SB=-639.90	GT:AD:DP:GL:GQ	1/1:0,38:37:-157.97,-11.15,-0.01:99
-chr1	3309637	rs4471209	G	A	344.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.51;MQ0=0;OQ=382.91;QD=10.08;SB=-184.19	GT:AD:DP:GL:GQ	0/1:25,13:37:-52.73,-11.16,-73.72:99
-chr1	3309732	rs6664364	C	T	134.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.91;MQ0=0;OQ=1699.09;QD=36.15;SB=-803.59	GT:AD:DP:GL:GQ	1/1:0,47:44:-173.51,-13.26,-0.01:99
-chr1	3309737	rs6664369	C	T	130.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.53;MQ0=0;OQ=1859.42;QD=37.95;SB=-907.23	GT:AD:DP:GL:GQ	1/1:0,49:48:-189.54,-14.46,-0.02:99
-chr1	3309924	rs6669407	A	G	328.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=995.86;QD=29.29;SB=-353.80	GT:AD:DP:GL:GQ	1/1:0,34:32:-103.20,-9.65,-0.03:96.22
-chr1	3310023	rs2493286	G	C	420.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1672.06;QD=40.78;SB=-718.73	GT:AD:DP:GL:GQ	1/1:0,41:40:-170.80,-12.05,-0.01:99
-chr1	3310336	rs6657675	G	A	148.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=58.38;MQ0=0;OQ=936.76;QD=20.36;SB=-332.89	GT:AD:DP:GL:GQ	0/1:17,29:43:-109.92,-12.96,-52.69:99
-chr1	3310582	rs55820208	C	T	260.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=862.76;QD=19.61;SB=-355.48	GT:AD:DP:GL:GQ	0/1:19,25:43:-102.51,-12.95,-64.90:99
-chr1	3311027	rs41315264	C	A	149.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=59.45;MQ0=0;OQ=411.02;QD=12.09;SB=-182.52	GT:AD:DP:GL:GQ	0/1:19,15:31:-53.72,-9.34,-57.20:99
-chr1	3311596	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=4;HaplotypeScore=11.58;MQ=54.22;MQ0=0;OQ=65.40;QD=1.42;SB=47.17	GT:AD:DP:GL:GQ	0/1:36,10:29:-18.61,-8.78,-88.90:98.24
-chr1	3312969	rs2483222	T	C	325.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.04;MQ0=0;OQ=585.55;QD=11.71;SB=-306.07	GT:AD:DP:GL:GQ	0/1:25,25:48:-76.31,-14.47,-93.64:99
-chr1	3313057	rs2483223	T	G	88.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.28;MQ0=0;OQ=1723.37;QD=26.93;SB=-826.52	GT:AD:DP:GL:GQ	1/1:0,64:57:-175.98,-17.18,-0.06:99
-chr1	3313337	rs2493304	A	G	110.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.72;MQ=57.61;MQ0=0;OQ=687.56;QD=10.91;SB=-122.49	GT:AD:DP:GL:GQ	0/1:35,28:61:-90.42,-18.38,-140.37:99
-chr1	3313476	rs2483224	C	T	77.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=3.15;MQ=58.48;MQ0=0;OQ=742.74;QD=16.15;SB=-389.41	GT:AD:DP:GL:GQ	0/1:21,25:42:-90.21,-12.66,-65.08:99
-chr1	3314069	rs2493303	G	C	188.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=4.50;MQ=59.20;MQ0=0;OQ=943.60;QD=16.27;SB=-364.47	GT:AD:DP:GL:GQ	0/1:29,29:57:-114.83,-17.19,-120.69:99
-chr1	3314293	rs2493302	A	T	133.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=59.50;MQ0=0;OQ=1593.32;QD=34.64;SB=-633.61	GT:AD:DP:GL:GQ	1/1:0,46:43:-162.93,-12.95,-0.01:99
-chr1	3314897	rs2483225	T	C	612.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.62;MQ0=0;OQ=1899.06;QD=30.14;SB=-687.73	GT:AD:DP:GL:GQ	1/1:0,63:60:-193.54,-18.10,-0.05:99
-chr1	3315120	rs12063572	A	G	188.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.59;MQ0=0;OQ=550.32;QD=9.83;SB=-278.26	GT:AD:DP:GL:GQ	0/1:32,24:53:-74.29,-15.98,-116.93:99
-chr1	3315180	rs12063579	A	G	62.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=5.22;MQ=57.82;MQ0=1;OQ=599.80;QD=10.91;SB=-262.60	GT:AD:DP:GL:GQ	0/1:27,28:47:-77.44,-14.18,-83.26:99
-chr1	3315190	rs2493301	G	C	0.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=15.61;MQ=57.11;MQ0=1;OQ=860.03;QD=14.83;SB=-355.44	GT:AD:DP:GL:GQ	0/1:31,27:50:-104.37,-15.08,-104.68:99
-chr1	3315194	rs12063613	A	G	1.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=10.46;MQ=56.06;MQ0=1;OQ=577.86;QD=9.47;SB=-271.10	GT:AD:DP:GL:GQ	0/1:30,31:51:-76.46,-15.39,-99.42:99
-chr1	3315219	.	C	T	17.67	DPFilter;Indel;LowQual	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=15.64;MQ=52.76;MQ0=1;QD=0.26;SB=34.67	GT:AD:DP:GL:GQ	0/1:62,6:62:-23.74,-18.70,-180.77:50.43
-chr1	3315354	rs12065021	T	C	254.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=59.68;MQ0=0;OQ=519.08;QD=13.66;SB=-277.27	GT:AD:DP:GL:GQ	0/1:17,21:38:-66.65,-11.46,-65.47:99
-chr1	3315386	rs2493300	A	G	19.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=60.00;MQ0=0;OQ=1158.12;QD=28.95;SB=-549.05	GT:AD:DP:GL:GQ	1/1:0,40:37:-119.43,-11.16,-0.04:99
-chr1	3315441	rs2493299	A	G	105.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.81;MQ=60.00;MQ0=0;OQ=1355.37;QD=28.24;SB=-603.93	GT:AD:DP:GL:GQ	1/1:0,48:44:-139.17,-13.27,-0.04:99
-chr1	3315528	rs55929648	C	T	143.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=56.18;MQ0=0;OQ=1041.13;QD=18.59;SB=-362.91	GT:AD:DP:GL:GQ	0/1:25,31:52:-123.07,-15.67,-66.96:99
-chr1	3315772	rs2493298	C	A	135.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.28;MQ=60.00;MQ0=0;OQ=850.76;QD=17.72;SB=-447.55	GT:AD:DP:GL:GQ	0/1:19,29:48:-102.82,-14.46,-64.75:99
-chr1	3315954	rs36070715	C	G	3.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.72;MQ=51.04;MQ0=0;OQ=1102.41;QD=21.62;SB=-424.97	GT:AD:DP:GL:GQ	0/1:21,30:46:-127.39,-13.87,-69.58:99
-chr1	3316002	rs60965010	G	A	53.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=3;HaplotypeScore=0.89;MQ=53.52;MQ0=0;OQ=683.65;QD=15.19;SB=-341.33	GT:AD:DP:GL:GQ	0/1:23,22:41:-84.00,-12.35,-71.37:99
-chr1	3316048	rs59831144	A	G	16.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=6.55;MQ=58.48;MQ0=0;OQ=584.41;QD=12.70;SB=-233.93	GT:AD:DP:GL:GQ	0/1:24,22:41:-74.08,-12.36,-76.23:99
-chr1	3316091	rs2493297	G	A	148.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.53;MQ0=0;OQ=1649.32;QD=33.66;SB=-643.25	GT:AD:DP:GL:GQ	1/1:0,49:44:-168.54,-13.26,-0.02:99
-chr1	3316251	.	G	A	182.76	SnpCluster	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=43.92;MQ0=0;QD=3.10;SB=-111.51	GT:AD:DP:GL:GQ	0/1:47,12:54:-37.83,-16.27,-156.64:99
-chr1	3316256	.	T	C	219.54	SnpCluster	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=43.18;MQ0=0;QD=3.66;SB=-32.48	GT:AD:DP:GL:GQ	0/1:44,16:55:-41.82,-16.58,-163.02:99
-chr1	3316258	rs7364679	G	T	370	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=43.51;MQ0=0;QD=6.07;SB=-108.68	GT:AD:DP:GL:GQ	0/1:43,18:56:-57.15,-16.87,-140.13:99
-chr1	3316271	.	G	T	44.21	PASS	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.38;MQ=42.99;MQ0=0;OQ=836.87;QD=13.72;SB=-249.23	GT:AD:DP:GL:GQ	0/1:29,32:52:-102.65,-15.68,-71.94:99
-chr1	3316274	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=55.35;MQ=42.03;MQ0=0;OQ=122.20;QD=2.07;SB=-76.97	GT:AD:DP:GL:GQ	0/1:47,12:53:-31.48,-15.98,-148.32:99
-chr1	3316287	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=56;Dels=0.04;HRun=0;HaplotypeScore=28.34;MQ=46.39;MQ0=0;OQ=249.44;QD=4.45;SB=13.22	GT:AD:DP:GL:GQ	0/1:42,12:52:-43.29,-15.07,-133.82:99
-chr1	3316288	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=24.35;MQ=46.92;MQ0=0;OQ=241.94;QD=4.17;SB=40.21	GT:AD:DP:GL:GQ	0/1:44,14:54:-43.75,-16.27,-150.33:99
-chr1	3316304	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=2;HaplotypeScore=31.71;MQ=50.98;MQ0=0;OQ=105.86;QD=1.79;SB=47.12	GT:AD:DP:GL:GQ	0/1:51,8:50:-28.93,-15.06,-145.13:99
-chr1	3316355	.	A	G	40.11	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=6.42;MQ=53.40;MQ0=0;QD=0.79;SB=24.53	GT:AD:DP:GL:GQ	0/1:42,9:48:-21.76,-14.47,-159.00:72.94
-chr1	3316370	.	G	A	1.13	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=7.87;MQ=52.81;MQ0=0;OQ=530.25;QD=10.40;SB=-291.29	GT:AD:DP:GL:GQ	0/1:31,20:45:-69.88,-13.57,-88.85:99
-chr1	3316500	rs4648494	A	G	396.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.41;MQ0=0;OQ=1411.68;QD=27.15;SB=-591.87	GT:AD:DP:GL:GQ	1/1:0,52:46:-144.80,-13.88,-0.05:99
-chr1	3316656	rs6670123	C	G	292.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=1.36;MQ=56.33;MQ0=0;OQ=1404.84;QD=19.79;SB=-673.50	GT:AD:DP:GL:GQ	0/1:33,38:68:-164.26,-20.49,-128.05:99
-chr1	3316892	rs2493296	C	T	338.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.07;MQ0=0;OQ=702.09;QD=14.04;SB=-332.51	GT:AD:DP:GL:GQ	0/1:27,23:46:-87.37,-13.87,-76.76:99
-chr1	3317409	rs1106270	A	G	118.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.41;MQ0=0;OQ=1192.84;QD=30.59;SB=-537.44	GT:AD:DP:GL:GQ	1/1:0,39:35:-122.88,-10.54,-0.02:99
-chr1	3317462	rs1106271	T	G	1.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=4;HaplotypeScore=1.32;MQ=56.98;MQ0=0;OQ=1224.22;QD=31.39;SB=-406.92	GT:AD:DP:GL:GQ	1/1:0,39:38:-126.04,-11.45,-0.03:99
-chr1	3317665	rs57382922	C	T	121.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=3.88;MQ=57.50;MQ0=0;OQ=526.20;QD=15.48;SB=-279.22	GT:AD:DP:GL:GQ	0/1:15,19:32:-65.55,-9.65,-47.15:99
-chr1	3318218	rs870124	T	C	46.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=58.35;MQ0=0;OQ=987.47;QD=31.85;SB=-495.44	GT:AD:DP:GL:GQ	1/1:0,30:29:-102.35,-8.74,-0.01:87.24
-chr1	3318519	rs2493292	C	T	35.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=5.38;MQ=58.81;MQ0=0;OQ=410.88;QD=10.54;SB=-213.48	GT:AD:DP:GL:GQ	0/1:22,17:36:-55.22,-10.85,-74.55:99
-chr1	3319244	rs2493291	C	T	128.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=57.07;MQ0=0;OQ=113.91;QD=8.76;SB=-36.64	GT:AD:DP:GL:GQ	0/1:8,5:13:-18.59,-3.92,-28.88:99
-chr1	3319441	.	G	A	108.40	PASS	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=283.86;QD=13.52;SB=-108.97	GT:AD:DP:GL:GQ	0/1:11,10:21:-38.00,-6.33,-35.64:99
-chr1	3320120	.	C	T	102.17	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=60.00;MQ0=0;OQ=709.62;QD=14.78;SB=-362.53	GT:AD:DP:GL:GQ	0/1:24,23:45:-87.81,-13.57,-69.77:99
-chr1	3320537	rs2493290	G	A	97.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=2.41;MQ=59.54;MQ0=0;OQ=872.79;QD=17.46;SB=-392.92	GT:AD:DP:GL:GQ	0/1:24,26:48:-105.02,-14.46,-80.60:99
-chr1	3320607	rs11578951	G	A	205.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=56.45;MQ0=0;OQ=183.21;QD=9.16;SB=-114.08	GT:AD:DP:GL:GQ	0/1:13,7:17:-26.73,-5.12,-34.52:99
-chr1	3320622	rs2493289	A	G	29.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=56.62;MQ0=0;OQ=591.39;QD=28.16;SB=-179.75	GT:AD:DP:GL:GQ	1/1:0,20:19:-62.74,-5.73,-0.02:57.13
-chr1	3320744	rs2493288	G	A	319.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.00;MQ0=0;OQ=558.26;QD=13.29;SB=-286.76	GT:AD:DP:GL:GQ	0/1:23,19:41:-71.47,-12.36,-76.00:99
-chr1	3321412	rs60973157	G	C	340.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=59.61;MQ0=0;OQ=1008.01;QD=17.08;SB=-510.27	GT:AD:DP:GL:GQ	0/1:31,28:58:-121.57,-17.48,-125.42:99
-chr1	3321593	rs2483228	T	C	57.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.22;MQ=59.17;MQ0=0;OQ=862.49;QD=30.80;SB=-342.44	GT:AD:DP:GL:GQ	1/1:0,28:27:-89.85,-8.14,-0.02:81.21
-chr1	3321759	rs1999528	A	G	88.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=1263.70;QD=30.82;SB=-424.24	GT:AD:DP:GL:GQ	1/1:0,41:41:-129.99,-12.37,-0.04:99
-chr1	3322543	rs2483229	T	C	158.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.98;MQ0=0;OQ=401.83;QD=7.31;SB=-190.61	GT:AD:DP:GL:GQ	0/1:33,22:50:-58.54,-15.08,-123.40:99
-chr1	3322811	rs1889123	T	C	57.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.68;MQ=60.00;MQ0=0;OQ=1553.51;QD=34.52;SB=-743.30	GT:AD:DP:GL:GQ	1/1:0,45:44:-158.95,-13.25,-0.01:99
-chr1	3323101	rs55713431	A	G	0.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=4;HaplotypeScore=1.93;MQ=59.65;MQ0=0;OQ=422.62;QD=7.97;SB=-123.50	GT:AD:DP:GL:GQ	0/1:32,21:47:-59.71,-14.17,-112.42:99
-chr1	3323323	rs2068354	A	G	160.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.65;MQ0=0;OQ=738.34;QD=11.36;SB=-391.91	GT:AD:DP:GL:GQ	0/1:34,31:64:-96.41,-19.29,-135.43:99
-chr1	3324752	rs2483230	A	G	139.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=59.42;MQ0=0;OQ=1229.51;QD=30.74;SB=-406.34	GT:AD:DP:GL:GQ	1/1:0,40:38:-126.56,-11.45,-0.03:99
-chr1	3326060	rs1984069	C	T	66.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=2062.28;QD=37.50;SB=-721.47	GT:AD:DP:GL:GQ	1/1:0,55:53:-209.83,-15.97,-0.02:99
-chr1	3327403	rs1572040	A	G	479.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1561.86;QD=33.95;SB=-803.63	GT:AD:DP:GL:GQ	1/1:0,46:45:-159.79,-13.56,-0.02:99
-chr1	3327481	.	A	G	13.29	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=3.51;MQ=58.78;MQ0=0;OQ=805.84;QD=11.68;SB=-333.16	GT:AD:DP:GL:GQ	0/1:35,34:66:-103.76,-19.89,-136.42:99
-chr1	3327496	rs11579873	G	A	76.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=5.52;MQ=59.07;MQ0=0;OQ=1231.78;QD=17.60;SB=-403.19	GT:AD:DP:GL:GQ	0/1:34,36:67:-146.65,-20.19,-102.53:99
-chr1	3328305	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=2;HaplotypeScore=9.54;MQ=57.05;MQ0=0;OQ=81.44;QD=1.66;SB=56.21	GT:AD:DP:GL:GQ	0/1:35,13:31:-20.79,-9.36,-100.83:99
-chr1	3328931	rs2483231	A	G	0.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=2.58;MQ=57.64;MQ0=0;OQ=961.69;QD=26.71;SB=-96.83	GT:AD:DP:GL:GQ	1/1:0,35:29:-99.77,-8.74,-0.01:87.24
-chr1	3329199	rs10492937	C	A	94.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=591.17;QD=15.16;SB=-220.88	GT:AD:DP:GL:GQ	0/1:18,21:38:-73.85,-11.45,-60.07:99
-chr1	3329740	.	G	T	6.44	PASS	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=1;HaplotypeScore=3.49;MQ=59.36;MQ0=0;OQ=539.79;QD=14.99;SB=-294.29	GT:AD:DP:GL:GQ	0/1:15,21:33:-67.21,-9.94,-47.46:99
-chr1	3329976	rs2483232	A	G	146.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.83;MQ=59.54;MQ0=0;OQ=1387.79;QD=27.76;SB=-682.70	GT:AD:DP:GL:GQ	1/1:0,49:45:-142.42,-13.58,-0.05:99
-chr1	3330129	rs4648385	C	T	62.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=59.51;MQ0=0;OQ=1421.02;QD=37.40;SB=-712.36	GT:AD:DP:GL:GQ	1/1:0,38:36:-145.70,-10.84,-0.01:99
-chr1	3330207	rs2483233	A	G	536.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1265.03;QD=33.29;SB=-631.30	GT:AD:DP:GL:GQ	1/1:0,38:37:-130.10,-11.15,-0.02:99
-chr1	3330527	rs2483234	A	G	229.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1088.75;QD=27.92;SB=-544.02	GT:AD:DP:GL:GQ	1/1:0,38:35:-112.49,-10.56,-0.04:99
-chr1	3330619	rs2483235	A	G	461.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.29;MQ0=0;OQ=1699.01;QD=28.80;SB=-626.83	GT:AD:DP:GL:GQ	1/1:0,59:55:-173.55,-16.59,-0.06:99
-chr1	3330715	rs4648500	A	C	461.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.69;MQ0=0;OQ=953.20;QD=15.63;SB=-476.30	GT:AD:DP:GL:GQ	0/1:28,33:61:-116.98,-18.37,-104.31:99
-chr1	3331400	rs2483236	C	T	56.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=55.81;MQ0=0;OQ=1168.69;QD=36.52;SB=-534.21	GT:AD:DP:GL:GQ	1/1:0,31:30:-120.46,-9.04,-0.01:90.29
-chr1	3331651	rs1970118	A	G	69.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=50.87;MQ0=0;OQ=938.62;QD=27.61;SB=-452.46	GT:AD:DP:GL:GQ	1/1:0,34:32:-97.49,-9.66,-0.04:96.17
-chr1	3331969	rs41303861	G	T	165.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=56.82;MQ0=0;OQ=610.74;QD=12.99;SB=-193.66	GT:AD:DP:GL:GQ	0/1:23,24:44:-77.62,-13.26,-67.40:99
-chr1	3332390	rs2244013	G	A	343.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.76;MQ=59.53;MQ0=0;OQ=624.83;QD=12.75;SB=-319.81	GT:AD:DP:GL:GQ	0/1:27,22:47:-79.93,-14.16,-96.24:99
-chr1	3332664	rs870171	G	T	453.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=726.05;QD=12.10;SB=-151.13	GT:AD:DP:GL:GQ	0/1:34,26:59:-93.67,-17.78,-105.77:99
-chr1	3333105	rs7549050	A	G	414.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=796.44;QD=10.62;SB=-292.01	GT:AD:DP:GL:GQ	0/1:42,33:74:-105.23,-22.30,-168.30:99
-chr1	3333795	rs55833861	T	C	103.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=2.59;MQ=58.97;MQ0=0;OQ=717.11;QD=11.38;SB=-232.86	GT:AD:DP:GL:GQ	0/1:36,27:59:-92.78,-17.78,-129.42:99
-chr1	3333920	rs56196310	G	T	246.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=59.56;MQ0=0;OQ=564.40;QD=10.65;SB=-293.98	GT:AD:DP:GL:GQ	0/1:32,21:49:-74.48,-14.76,-99.79:99
-chr1	3334336	rs61759212	A	G	99.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=59.13;MQ0=0;OQ=418.37;QD=9.73;SB=-116.62	GT:AD:DP:GL:GQ	0/1:23,20:40:-57.18,-12.06,-85.13:99
-chr1	3334647	rs2483240	A	G	15.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=55.38;MQ0=1;OQ=79.23;QD=3.96;SB=-53.29	GT:AD:DP:GL:GQ	0/1:13,7:16:-16.03,-4.82,-44.27:99
-chr1	3335005	rs2483242	A	T	508.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.64;MQ0=0;OQ=469.82;QD=13.82;SB=-232.91	GT:AD:DP:GL:GQ	0/1:18,16:34:-60.51,-10.24,-69.68:99
-chr1	3335714	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=2;HaplotypeScore=9.36;MQ=57.49;MQ0=0;OQ=205.84;QD=4.57;SB=56.19	GT:AD:DP:GL:GQ	0/1:25,20:36:-34.71,-10.85,-86.86:99
-chr1	3336208	rs2493277	C	G	559.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=642.22;QD=14.94;SB=-326.21	GT:AD:DP:GL:GQ	0/1:23,20:42:-80.17,-12.66,-97.68:99
-chr1	3336263	rs11583353	C	T	94.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.90;MQ0=0;OQ=708.85;QD=18.65;SB=-324.84	GT:AD:DP:GL:GQ	0/1:17,21:37:-85.32,-11.15,-51.45:99
-chr1	3339994	rs10752734	T	C	155.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=27.27;MQ0=2;OQ=107.39;QD=6.32;SB=-10.00	GT:AD:DP:GL:GQ	1/1:8,9:4:-14.27,-1.20,-0.00:12.04
-chr1	3342087	rs1537406	T	C	266.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=59.23;MQ0=0;OQ=2135.99;QD=33.90;SB=-825.32	GT:AD:DP:GL:GQ	1/1:0,63:60:-217.21,-18.07,-0.02:99
-chr1	3342088	rs12735779	G	C	80.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=59.25;MQ0=0;OQ=2678.31;QD=41.20;SB=-987.13	GT:AD:DP:GL:GQ	1/1:0,65:62:-271.44,-18.68,-0.02:99
-chr1	3342207	rs1537405	T	C	92.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=60.00;MQ0=0;OQ=1223.31;QD=28.45;SB=-485.50	GT:AD:DP:GL:GQ	1/1:0,43:40:-125.96,-12.07,-0.04:99
-chr1	3342363	rs1537404	G	C	0.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=4;HaplotypeScore=2.53;MQ=57.71;MQ0=0;OQ=1605.19;QD=37.33;SB=-574.94	GT:AD:DP:GL:GQ	1/1:0,43:39:-164.12,-11.76,-0.02:99
-chr1	3342401	rs1065247	T	C	218.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=58.89;MQ0=0;OQ=523.80;QD=12.47;SB=-250.33	GT:AD:DP:GL:GQ	0/1:20,21:38:-67.12,-11.46,-67.07:99
-chr1	3342439	rs1537402	T	C	329.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.61;MQ0=0;OQ=1390.94;QD=29.59;SB=-663.80	GT:AD:DP:GL:GQ	1/1:0,47:44:-142.72,-13.27,-0.04:99
-chr1	3342644	rs2493267	A	G	426.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1871.16;QD=31.71;SB=-785.23	GT:AD:DP:GL:GQ	1/1:0,59:54:-190.73,-16.27,-0.03:99
-chr1	3342725	rs35015571	C	T	160.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=59.43;MQ0=0;OQ=266.00;QD=8.06;SB=-157.61	GT:AD:DP:GL:GQ	0/1:23,10:28:-38.32,-8.44,-61.48:99
-chr1	3342732	rs2236518	A	C	16.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=2;HaplotypeScore=2.32;MQ=59.45;MQ0=0;OQ=611.30;QD=17.98;SB=-246.93	GT:AD:DP:GL:GQ	0/1:10,24:30:-73.45,-9.04,-31.78:99
-chr1	3343497	rs35837267	G	A	179.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=1.81;MQ=58.20;MQ0=0;OQ=412.37;QD=12.13;SB=-230.72	GT:AD:DP:GL:GQ	0/1:20,14:34:-54.77,-10.25,-72.54:99
-chr1	3343750	rs2493265	A	G	92.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.09;MQ0=0;OQ=1343.75;QD=27.42;SB=-616.98	GT:AD:DP:GL:GQ	1/1:0,49:43:-138.00,-12.97,-0.04:99
-chr1	3343809	rs2493264	A	G	123.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.40;MQ=58.91;MQ0=0;OQ=1865.11;QD=29.14;SB=-622.24	GT:AD:DP:GL:GQ	1/1:0,64:61:-190.17,-18.41,-0.07:99
-chr1	3344455	rs2483249	T	C	577.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2266.24;QD=31.92;SB=-1078.24	GT:AD:DP:GL:GQ	1/1:0,71:70:-230.26,-21.11,-0.05:99
-chr1	3344475	rs2493263	T	C	726.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2858.56;QD=35.29;SB=-1249.13	GT:AD:DP:GL:GQ	1/1:0,81:80:-289.47,-24.10,-0.03:99
-chr1	3345122	rs55729137	G	A	38.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=59.48;MQ0=0;OQ=807.80;QD=18.36;SB=-199.91	GT:AD:DP:GL:GQ	0/1:20,24:42:-96.73,-12.66,-57.09:99
-chr1	3346265	rs2483250	A	C	12.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=3;HaplotypeScore=0.89;MQ=59.52;MQ0=0;OQ=1256.35;QD=32.21;SB=-315.07	GT:AD:DP:GL:GQ	1/1:0,39:37:-129.23,-11.15,-0.01:99
-chr1	3346495	rs2483251	T	C	2.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=2;HaplotypeScore=1.13;MQ=60.00;MQ0=0;OQ=525.69;QD=27.67;SB=-225.75	GT:AD:DP:GL:GQ	1/1:0,19:16:-56.16,-4.82,-0.01:48.13
-chr1	3346655	rs2493262	C	G	18.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=2;HaplotypeScore=2.19;MQ=59.17;MQ0=0;OQ=878.66;QD=31.38;SB=-427.67	GT:AD:DP:GL:GQ	1/1:0,27:23:-91.47,-6.94,-0.02:69.23
-chr1	3346875	rs12745100	C	T	10.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=496.33;QD=18.38;SB=-39.63	GT:AD:DP:GL:GQ	0/1:12,15:27:-61.05,-8.13,-42.91:99
-chr1	3347097	rs55892133	A	G	803.11	Indel	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=3.17;MQ=58.79;MQ0=0;QD=12.55;SB=-200.20	GT:AD:DP:GL:GQ	0/1:34,30:60:-101.69,-18.09,-118.87:99
-chr1	3347896	rs10797392	T	G	467.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.49;MQ0=1;OQ=720.09;QD=12.20;SB=-372.76	GT:AD:DP:GL:GQ	0/1:27,32:54:-91.57,-16.27,-88.57:99
-chr1	3348782	rs2483252	G	C	20.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=1.07;MQ=58.41;MQ0=0;OQ=1754.48;QD=39.87;SB=-676.45	GT:AD:DP:GL:GQ	1/1:0,43:42:-179.05,-12.66,-0.02:99
-chr1	3348792	rs35536718	C	G	187.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=58.60;MQ0=0;OQ=722.68;QD=14.45;SB=-275.28	GT:AD:DP:GL:GQ	0/1:28,22:46:-89.42,-13.87,-106.46:99
-chr1	3349040	rs2493261	C	G	241.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=2328.68;QD=40.85;SB=-454.11	GT:AD:DP:GL:GQ	1/1:0,57:55:-236.48,-16.59,-0.03:99
-chr1	3349142	rs56009352	G	T	195.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=58.75;MQ0=0;OQ=381.64;QD=9.09;SB=-161.15	GT:AD:DP:GL:GQ	0/1:24,18:38:-52.90,-11.45,-81.46:99
-chr1	3349843	rs11588737	T	C	126.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.70;MQ0=0;OQ=680.83;QD=8.96;SB=-348.93	GT:AD:DP:GL:GQ	0/1:44,32:72:-93.07,-21.70,-169.44:99
-chr1	3349896	rs9424295	C	A	298.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.90;MQ0=0;OQ=883.58;QD=12.27;SB=-371.71	GT:AD:DP:GL:GQ	0/1:40,32:69:-112.42,-20.78,-136.87:99
-chr1	3350654	.	A	G	19.67	PASS	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=4.82;MQ=58.94;MQ0=0;OQ=752.06;QD=11.22;SB=-353.94	GT:AD:DP:GL:GQ	0/1:36,30:64:-97.78,-19.29,-134.25:99
-chr1	3350874	rs2493260	A	T	152.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1881.55;QD=33.01;SB=-813.90	GT:AD:DP:GL:GQ	1/1:0,54:52:-191.76,-15.67,-0.02:99
-chr1	3351164	rs2483254	G	A	165.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.02;MQ=57.99;MQ0=0;OQ=1923.46;QD=34.35;SB=-708.45	GT:AD:DP:GL:GQ	1/1:0,56:52:-195.97,-15.68,-0.04:99
-chr1	3351668	rs61759222	T	C	292.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.16;MQ0=0;OQ=649.71;QD=12.99;SB=-320.27	GT:AD:DP:GL:GQ	0/1:27,23:50:-83.32,-15.07,-104.64:99
-chr1	3351675	rs61759223	T	C	215.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.56;MQ0=0;OQ=453.74;QD=8.73;SB=-214.35	GT:AD:DP:GL:GQ	0/1:31,21:51:-64.03,-15.38,-121.39:99
-chr1	3351951	rs61759224	A	G	132.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=58.69;MQ0=0;OQ=462.74;QD=9.25;SB=-204.32	GT:AD:DP:GL:GQ	0/1:29,21:49:-64.32,-14.77,-119.90:99
-chr1	3352116	rs867814	C	T	338.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.66;MQ0=0;OQ=1015.19;QD=15.15;SB=-259.14	GT:AD:DP:GL:GQ	0/1:34,33:66:-124.69,-19.89,-112.54:99
-chr1	3352233	rs55781247	C	T	0.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=12.27;MQ=55.55;MQ0=1;OQ=438.31;QD=8.59;SB=-227.00	GT:AD:DP:GL:GQ	0/1:27,22:35:-60.74,-13.63,-60.12:99
-chr1	3352662	.	G	C	94.32	PASS	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.30;MQ0=0;OQ=750.60;QD=12.94;SB=-224.33	GT:AD:DP:GL:GQ	0/1:34,23:56:-95.22,-16.87,-149.91:99
-chr1	3353096	rs11808277	C	G	337.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.63;MQ0=0;OQ=1053.89;QD=17.00;SB=-489.21	GT:AD:DP:GL:GQ	0/1:30,32:59:-126.45,-17.78,-131.54:99
-chr1	3353132	.	G	A	167.12	PASS	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.73;MQ0=0;OQ=1096.75;QD=16.13;SB=-431.84	GT:AD:DP:GL:GQ	0/1:34,34:67:-133.15,-20.19,-109.37:99
-chr1	3353327	rs10158332	A	T	108.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=58.82;MQ0=0;OQ=1002.21;QD=14.12;SB=-515.47	GT:AD:DP:GL:GQ	0/1:38,33:71:-124.89,-21.39,-148.24:99
-chr1	3353449	rs10157570	G	A	490.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=905.02;QD=15.88;SB=-430.82	GT:AD:DP:GL:GQ	0/1:30,27:56:-110.66,-16.88,-93.98:99
-chr1	3353662	rs2483255	A	T	46.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=4.02;MQ=59.30;MQ0=0;OQ=2470.87;QD=37.44;SB=-912.35	GT:AD:DP:GL:GQ	1/1:0,66:64:-250.68,-19.27,-0.01:99
-chr1	3353786	rs2493258	A	G	307.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.56;MQ0=0;OQ=1182.18;QD=13.91;SB=-595.40	GT:AD:DP:GL:GQ	0/1:39,46:85:-147.12,-25.62,-159.37:99
-chr1	3354380	rs61759225	T	C	235.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=921.81;QD=12.29;SB=-424.06	GT:AD:DP:GL:GQ	0/1:42,33:74:-117.76,-22.29,-166.03:99
-chr1	3354597	rs2263010	T	C	533.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2222.94;QD=35.85;SB=-1114.11	GT:AD:DP:GL:GQ	1/1:0,62:62:-225.90,-18.68,-0.02:99
-chr1	3354829	rs61759226	A	T	251.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.16;MQ0=0;OQ=1748.33;QD=17.48;SB=-874.02	GT:AD:DP:GL:GQ	0/1:46,54:99:-207.93,-29.81,-176.30:99
-chr1	3355107	rs4648386	A	G	12.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.00;MQ=59.31;MQ0=0;OQ=1773.45;QD=34.77;SB=-505.48	GT:AD:DP:GL:GQ	1/1:0,51:51:-180.95,-15.36,-0.02:99
-chr1	3355113	rs61759227	G	A	0.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=6.85;MQ=58.80;MQ0=0;OQ=911.32;QD=18.60;SB=-216.88	GT:AD:DP:GL:GQ	0/1:22,27:48:-108.87,-14.46,-75.78:99
-chr1	3355993	rs55913848	G	T	115.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=58.15;MQ0=0;OQ=1046.84;QD=16.62;SB=-492.93	GT:AD:DP:GL:GQ	0/1:29,34:61:-126.34,-18.38,-91.26:99
-chr1	3356353	rs2096102	C	A	344.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.20;MQ=61.19;MQ0=0;OQ=1204.86;QD=17.21;SB=-565.00	GT:AD:DP:GL:GQ	0/1:30,40:67:-143.95,-20.18,-94.79:99
-chr1	3356461	.	G	A	34.92	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=63.59;MQ=46.78;MQ0=1;QD=0.83;SB=-40.97	GT:AD:DP:GL:GQ	0/1:36,6:34:-17.03,-10.25,-100.31:67.76
-chr1	3356464	.	T	G	27.11	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=13.28;MQ=49.36;MQ0=1;QD=0.85;SB=-38.91	GT:AD:DP:GL:GQ	0/1:28,4:29:-14.73,-8.74,-84.74:59.94
-chr1	3356466	.	G	T	324.76	SnpCluster	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=10.60;MQ=48.57;MQ0=1;QD=10.83;SB=-127.64	GT:AD:DP:GL:GQ	0/1:15,15:26:-43.60,-7.84,-42.90:99
-chr1	3357640	rs2487679	A	G	123.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.76;MQ=59.32;MQ0=0;OQ=2260.98;QD=33.25;SB=-697.21	GT:AD:DP:GL:GQ	1/1:0,68:67:-229.71,-20.18,-0.03:99
-chr1	3357895	rs6697669	T	C	43.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.03;HRun=0;HaplotypeScore=3.79;MQ=57.15;MQ0=0;OQ=335.02;QD=10.15;SB=-38.93	GT:AD:DP:GL:GQ	0/1:18,13:30:-45.82,-9.04,-67.57:99
-chr1	3357991	rs4648501	G	A	122.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.97;MQ0=0;OQ=545.72;QD=10.70;SB=-291.79	GT:AD:DP:GL:GQ	0/1:33,18:50:-72.92,-15.06,-113.74:99
-chr1	3358003	rs2487670	G	A	120.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.77;MQ0=0;OQ=1144.78;QD=22.01;SB=-472.53	GT:AD:DP:GL:GQ	0/1:18,34:50:-132.83,-15.07,-51.40:99
-chr1	3358201	rs55902179	A	G	118.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=60.00;MQ0=0;OQ=620.71;QD=14.78;SB=-241.29	GT:AD:DP:GL:GQ	0/1:20,22:41:-77.71,-12.35,-78.03:99
-chr1	3359613	rs2487668	G	A	227.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=59.61;MQ0=0;OQ=985.10;QD=16.70;SB=-425.79	GT:AD:DP:GL:GQ	0/1:26,32:57:-118.97,-17.18,-94.23:99
-chr1	3359684	rs34681041	A	G	13.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=2;HaplotypeScore=1.71;MQ=60.00;MQ0=0;OQ=330.72;QD=8.70;SB=-110.60	GT:AD:DP:GL:GQ	0/1:21,17:34:-46.60,-10.25,-79.14:99
-chr1	3361330	.	G	C	0.29	PASS	AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=68.48;QD=6.85;SB=-10.00	GT:AD:DP:GL:GQ	0/1:6,4:9:-12.85,-2.72,-22.16:99
-chr1	3361841	rs55858614	G	C	94.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.70;MQ0=0;OQ=503.58;QD=17.36;SB=-238.39	GT:AD:DP:GL:GQ	0/1:14,15:29:-62.38,-8.74,-58.19:99
-chr1	3362331	rs10909946	A	C	12.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=3;HaplotypeScore=2.71;MQ=58.18;MQ0=0;OQ=655.84;QD=12.15;SB=-228.89	GT:AD:DP:GL:GQ	0/1:26,28:47:-83.03,-14.16,-81.70:99
-chr1	3362529	rs61759232	T	C	1.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=3.67;MQ=58.99;MQ0=0;OQ=549.81;QD=11.95;SB=-107.61	GT:AD:DP:GL:GQ	0/1:22,24:42:-70.93,-12.66,-83.77:99
-chr1	3362717	.	A	G	41.71	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=1;HaplotypeScore=2.52;MQ=59.65;MQ0=0;OQ=773.42;QD=14.59;SB=-374.28	GT:AD:DP:GL:GQ	0/1:23,30:49:-95.39,-14.76,-86.55:99
-chr1	3363471	rs56365322	C	G	249.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.24;MQ0=0;OQ=638.66;QD=11.61;SB=-240.06	GT:AD:DP:GL:GQ	0/1:30,25:50:-82.23,-15.08,-125.58:99
-chr1	3363827	rs2493256	A	G	265.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=58.48;MQ0=0;OQ=531.11;QD=12.35;SB=-221.59	GT:AD:DP:GL:GQ	0/1:23,19:42:-71.22,-14.82,-89.22:99
-chr1	3364220	rs12745860	C	T	264.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=58.78;MQ0=0;OQ=718.26;QD=12.60;SB=-212.70	GT:AD:DP:GL:GQ	0/1:33,24:53:-91.09,-15.98,-94.23:99
-chr1	3364244	rs12758368	T	A	250.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.60;MQ=59.27;MQ0=0;OQ=910.80;QD=14.46;SB=-359.58	GT:AD:DP:GL:GQ	0/1:33,30:62:-113.04,-18.68,-119.17:99
-chr1	3364803	rs56242281	A	G	70.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=3.36;MQ=59.30;MQ0=0;OQ=300.82;QD=9.12;SB=-84.67	GT:AD:DP:GL:GQ	0/1:18,14:30:-42.41,-9.04,-64.59:99
-chr1	3365228	rs61759235	A	G	136.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.88;MQ=58.63;MQ0=0;OQ=478.85;QD=9.39;SB=-239.48	GT:AD:DP:GL:GQ	0/1:30,21:48:-65.63,-14.46,-116.95:99
-chr1	3365583	rs61759236	C	G	131.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=835.90;QD=18.58;SB=-383.86	GT:AD:DP:GL:GQ	0/1:22,23:43:-99.85,-12.97,-77.78:99
-chr1	3366053	rs61759237	C	T	131.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=735.43;QD=17.10;SB=-313.83	GT:AD:DP:GL:GQ	0/1:21,22:42:-89.48,-12.65,-70.75:99
-chr1	3366393	rs12059504	T	C	302.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=60.00;MQ0=0;OQ=609.78;QD=12.70;SB=-240.29	GT:AD:DP:GL:GQ	0/1:24,24:48:-78.73,-14.47,-96.53:99
-chr1	3366983	rs59183260	C	T	199.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.76;MQ=59.56;MQ0=0;OQ=586.61;QD=13.97;SB=-272.28	GT:AD:DP:GL:GQ	0/1:22,20:39:-73.71,-11.76,-62.95:99
-chr1	3367203	rs2487681	T	C	222.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=60.00;MQ0=0;OQ=351.40;QD=8.79;SB=-154.93	GT:AD:DP:GL:GQ	0/1:22,18:38:-49.88,-11.46,-85.17:99
-chr1	3372040	rs10909947	G	T	39.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.75;MQ0=0;OQ=1667.04;QD=35.47;SB=-355.84	GT:AD:DP:GL:GQ	1/1:0,47:46:-170.30,-13.86,-0.01:99
-chr1	3372773	.	T	G	28.89	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=2;HaplotypeScore=4.07;MQ=59.49;MQ0=0;QD=0.64;SB=56.17	GT:AD:DP:GL:GQ	0/1:32,13:34:-16.42,-10.24,-99.13:61.72
-chr1	3372898	rs947351	G	A	372.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.19;MQ0=0;OQ=649.44;QD=12.49;SB=-216.21	GT:AD:DP:GL:GQ	0/1:28,24:49:-83.00,-14.77,-93.12:99
-chr1	3373453	rs3893316	G	T	349.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=441.10;QD=14.70;SB=-201.58	GT:AD:DP:GL:GQ	0/1:13,17:29:-56.13,-8.74,-43.76:99
-chr1	3373525	rs7550948	G	A	64.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.53;MQ0=0;OQ=1066.26;QD=21.76;SB=-418.80	GT:AD:DP:GL:GQ	0/1:18,31:47:-124.08,-14.17,-50.84:99
-chr1	3373758	rs6424078	A	G	63.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=2.28;MQ=58.45;MQ0=0;OQ=303.09;QD=10.10;SB=-109.62	GT:AD:DP:GL:GQ	0/1:15,15:29:-42.34,-8.75,-57.35:99
-chr1	3373912	rs45512802	C	T	115.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.77;MQ=58.81;MQ0=0;OQ=487.90;QD=12.51;SB=-154.65	GT:AD:DP:GL:GQ	0/1:21,18:37:-63.22,-11.15,-77.33:99
-chr1	3374091	rs6667361	A	G	15.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=3;HaplotypeScore=1.91;MQ=58.45;MQ0=0;OQ=441.93;QD=9.82;SB=-196.52	GT:AD:DP:GL:GQ	0/1:26,19:43:-60.43,-12.96,-100.55:99
-chr1	3374466	rs7522513	A	G	114.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.36;MQ0=0;OQ=449.01;QD=11.23;SB=-195.64	GT:AD:DP:GL:GQ	0/1:20,20:37:-59.34,-11.16,-69.75:99
-chr1	3374989	rs2493250	G	A	285.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.52;MQ0=0;OQ=823.07;QD=17.15;SB=-412.42	GT:AD:DP:GL:GQ	0/1:23,25:48:-100.06,-14.47,-73.79:99
-chr1	3374999	rs2487673	G	T	438.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=759.07;QD=16.87;SB=-384.82	GT:AD:DP:GL:GQ	0/1:19,26:45:-92.75,-13.56,-63.83:99
-chr1	3375110	rs1417897	C	A	224.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=57.71;MQ0=0;OQ=613.48;QD=15.73;SB=-271.51	GT:AD:DP:GL:GQ	0/1:18,21:37:-75.78,-11.15,-51.34:99
-chr1	3375116	rs1891143	A	G	122.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=57.71;MQ0=0;OQ=346.85;QD=8.89;SB=-128.27	GT:AD:DP:GL:GQ	0/1:22,17:35:-48.52,-10.55,-81.11:99
-chr1	3375190	rs2493249	T	C	0.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=3;HaplotypeScore=2.59;MQ=59.45;MQ0=0;OQ=889.42;QD=26.16;SB=-381.39	GT:AD:DP:GL:GQ	1/1:0,34:28:-92.55,-8.44,-0.02:84.20
-chr1	3377520	.	G	A	54.48	PASS	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.18;MQ=60.00;MQ0=0;OQ=404.10;QD=10.92;SB=-123.57	GT:AD:DP:GL:GQ	0/1:21,16:32:-53.34,-9.65,-57.04:99
-chr1	3379133	rs2298082	T	C	273.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.53;MQ=58.32;MQ0=0;OQ=528.06;QD=13.20;SB=-222.68	GT:AD:DP:GL:GQ	0/1:19,21:37:-67.24,-11.15,-73.98:99
-chr1	3379181	rs2487687	C	T	16.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=60.00;MQ0=0;OQ=545.94;QD=21.00;SB=-232.27	GT:AD:DP:GL:GQ	0/1:9,17:25:-65.41,-7.53,-31.41:99
-chr1	3379587	rs2185639	C	T	119.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=58.13;MQ0=0;OQ=232.01;QD=9.28;SB=-26.61	GT:AD:DP:GL:GQ	0/1:14,10:22:-33.12,-6.63,-45.28:99
-chr1	3380098	rs2493323	T	A	210.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=1873.41;QD=38.23;SB=-364.88	GT:AD:DP:GL:GQ	1/1:0,49:49:-190.94,-14.76,-0.01:99
-chr1	3380882	rs2493322	G	A	155.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.57;MQ0=0;OQ=666.25;QD=12.34;SB=-269.17	GT:AD:DP:GL:GQ	0/1:33,21:52:-85.58,-15.67,-103.39:99
-chr1	3381466	.	A	G	34.09	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.23;MQ=18.93;MQ0=48;QD=0.47;SB=2.04	GT:AD:DP:GL:GQ	0/1:58,15:13:-10.61,-3.92,-40.00:66.92
-chr1	3381536	rs2493320	G	A	66.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=9.35;MQ0=30;OQ=163.18;QD=3.98;SB=-10.00	GT:AD:DP:GL:GQ	1/1:12,29:5:-19.88,-1.51,-0.00:15.05
-chr1	3381776	rs56863381	G	A	0.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=12.80;MQ0=34;OQ=57.75;QD=1.03;SB=5.02	GT:AD:DP:GL:GQ	0/1:40,16:11:-12.38,-3.32,-24.49:90.59
-chr1	3382016	.	A	G	35.80	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=12.28;MQ0=39;QD=0.55;SB=-10.00	GT:AD:DP:GL:GQ	0/1:54,11:16:-11.69,-4.82,-49.41:68.63
-chr1	3382186	rs2493318	A	G	275.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=47.26;MQ0=1;OQ=747.71;QD=13.35;SB=-372.26	GT:AD:DP:GL:GQ	0/1:27,29:52:-93.72,-15.67,-105.01:99
-chr1	3382897	rs12124163	G	T	198.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.56;MQ0=0;OQ=598.86;QD=14.26;SB=-222.53	GT:AD:DP:GL:GQ	0/1:21,21:41:-75.52,-12.35,-66.44:99
-chr1	3383727	rs10797394	G	A	171.07	DPFilter;Indel	AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=49.26;MQ0=0;QD=13.16;SB=8.03	GT:AD:DP:GL:GQ	0/1:7,6:12:-24.01,-3.62,-19.11:99
-chr1	3383981	rs56341824	G	T	14.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=1.70;MQ=59.25;MQ0=0;OQ=147.62;QD=5.90;SB=-6.99	GT:AD:DP:GL:GQ	0/1:17,8:23:-24.98,-6.93,-50.77:99
-chr1	3384110	rs10909948	C	T	220.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=54.75;MQ0=0;OQ=493.02;QD=17.00;SB=-263.55	GT:AD:DP:GL:GQ	0/1:13,16:28:-61.02,-8.44,-45.99:99
-chr1	3384316	rs4638054	T	C	12.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.07;MQ0=0;OQ=1239.78;QD=27.55;SB=-421.16	GT:AD:DP:GL:GQ	1/1:0,45:41:-127.61,-12.37,-0.05:99
-chr1	3384500	rs4422946	A	G	10.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=2;HaplotypeScore=1.93;MQ=60.00;MQ0=0;OQ=259.70;QD=9.27;SB=-73.94	GT:AD:DP:GL:GQ	0/1:16,12:25:-36.79,-7.54,-56.39:99
-chr1	3384534	rs4534324	T	C	47.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.99;MQ0=0;OQ=674.08;QD=29.31;SB=-343.44	GT:AD:DP:GL:GQ	1/1:0,23:22:-71.01,-6.63,-0.02:66.16
-chr1	3384899	rs10797395	G	A	51.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.52;MQ=59.38;MQ0=0;OQ=712.83;QD=19.27;SB=-338.87	GT:AD:DP:GL:GQ	0/1:16,21:35:-85.11,-10.54,-50.14:99
-chr1	3385089	rs4553117	T	C	310.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=892.31;QD=26.24;SB=-387.26	GT:AD:DP:GL:GQ	1/1:0,34:29:-92.85,-8.75,-0.03:87.19
-chr1	3385248	rs28568519	C	G	124.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=59.45;MQ0=0;OQ=725.71;QD=17.28;SB=-286.30	GT:AD:DP:GL:GQ	0/1:20,22:38:-87.31,-11.46,-71.37:99
-chr1	3386469	rs881978	C	T	144.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=2.64;MQ=59.25;MQ0=0;OQ=1109.69;QD=19.82;SB=-578.43	GT:AD:DP:GL:GQ	0/1:23,33:55:-130.82,-16.57,-79.57:99
-chr1	3386922	rs56309807	G	A	10.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=6.20;MQ=58.23;MQ0=0;OQ=434.23;QD=11.74;SB=-179.25	GT:AD:DP:GL:GQ	0/1:20,16:31:-56.05,-9.34,-54.39:99
-chr1	3387048	rs2487677	T	C	22.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=1.93;MQ=58.11;MQ0=0;OQ=1498.47;QD=31.88;SB=-723.23	GT:AD:DP:GL:GQ	1/1:0,46:43:-153.45,-12.96,-0.02:99
-chr1	3387315	rs1051515	G	A	124.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=59.55;MQ0=0;OQ=661.19;QD=15.03;SB=-242.52	GT:AD:DP:GL:GQ	0/1:21,23:41:-81.76,-12.36,-69.63:99
-chr1	3387424	rs1051517	C	T	185.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.57;MQ0=0;OQ=722.32;QD=16.80;SB=-358.40	GT:AD:DP:GL:GQ	0/1:21,22:42:-88.17,-12.66,-71.34:99
-chr1	3387765	rs2487676	G	C	0.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=1.72;MQ=59.56;MQ0=0;OQ=985.55;QD=23.47;SB=-402.96	GT:AD:DP:GL:GQ	0/1:13,29:39:-113.61,-11.77,-48.31:99
-chr1	3387785	rs10797396	G	A	343.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=869.16;QD=19.75;SB=-452.50	GT:AD:DP:GL:GQ	0/1:15,29:41:-102.56,-12.36,-46.08:99
-chr1	3388739	.	G	C	3.92	PASS	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=47.12;MQ0=0;OQ=99.91;QD=7.14;SB=-0.98	GT:AD:DP:GL:GQ	0/1:10,4:13:-17.20,-3.93,-33.90:99
-chr1	3388844	rs11579276	C	T	89.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=228.92;QD=8.80;SB=-0.98	GT:AD:DP:GL:GQ	0/1:16,10:21:-32.51,-6.33,-40.91:99
-chr1	3389315	rs2493316	T	C	332.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=364.79;QD=11.40;SB=-143.65	GT:AD:DP:GL:GQ	0/1:18,14:32:-49.41,-9.65,-68.22:99
-chr1	3390585	rs12124659	C	T	210.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.96;MQ0=0;OQ=1350.80;QD=37.52;SB=-227.30	GT:AD:DP:GL:GQ	1/1:0,36:35:-138.68,-10.55,-0.01:99
-chr1	3391131	rs2487674	A	G	49.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=60.00;MQ0=0;OQ=2482.25;QD=31.82;SB=-1068.16	GT:AD:DP:GL:GQ	1/1:0,78:76:-251.87,-22.92,-0.06:99
-chr1	3392093	rs4648504	C	T	77.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.60;MQ=53.45;MQ0=1;OQ=1952.99;QD=36.17;SB=-850.15	GT:AD:DP:GL:GQ	1/1:1,53:50:-198.90,-15.06,-0.02:99
-chr1	3394087	rs2821041	C	T	330.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=59.75;MQ0=0;OQ=1098.32;QD=14.64;SB=-325.80	GT:AD:DP:GL:GQ	0/1:41,34:73:-135.10,-21.99,-140.04:99
-chr1	3394997	rs61759244	C	G	135	PASS	AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=59.37;MQ0=0;OQ=1716.91;QD=17.88;SB=-792.82	GT:AD:DP:GL:GQ	0/1:43,53:93:-203.04,-28.07,-171.23:99
-chr1	3395156	rs4648505	T	C	309	PASS	AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.51;MQ0=0;OQ=921.20;QD=9.70;SB=-319.80	GT:AD:DP:GL:GQ	0/1:57,38:95:-124.03,-28.62,-233.81:99
-chr1	3401826	rs2821034	T	C	25.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=5.69;MQ=57.22;MQ0=0;OQ=336.60;QD=15.30;SB=-157.73	GT:AD:DP:GL:GQ	1/1:0,21:12:-37.26,-3.62,-0.02:36.06
-chr1	3406983	.	G	A	147.34	PASS	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=493.27;QD=14.51;SB=-172.20	GT:AD:DP:GL:GQ	0/1:17,17:33:-62.55,-9.94,-60.75:99
-chr1	3408031	rs7516662	A	G	45.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.10;MQ=59.41;MQ0=0;OQ=599.81;QD=15.38;SB=-119.66	GT:AD:DP:GL:GQ	0/1:18,21:37:-74.41,-11.15,-64.16:99
-chr1	3408425	rs2821030	T	C	291.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=44.95;MQ0=0;OQ=775.65;QD=13.61;SB=-335.17	GT:AD:DP:GL:GQ	0/1:17,40:43:-93.82,-12.97,-49.21:99
-chr1	3408438	rs56284135	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=5;HaplotypeScore=43.60;MQ=44.49;MQ0=0;OQ=630.57;QD=9.70;SB=-139.40	GT:AD:DP:GL:GQ	0/1:28,36:49:-81.11,-14.77,-94.33:99
-chr1	3408476	rs57408931	G	C	181.30	DPFilter;Indel	AC=1;AF=0.50;AN=2;DB;DP=164;Dels=0.03;HRun=1;HaplotypeScore=218.91;MQ=41.51;MQ0=3;QD=1.11;SB=-63.16	GT:AD:DP:GL:GQ	0/1:117,24:115:-89.58,-68.17,-379.21:99
-chr1	3408478	rs57082253	G	A	513.03	DPFilter;Indel	AC=1;AF=0.50;AN=2;DB;DP=180;Dels=0.00;HRun=0;HaplotypeScore=193.59;MQ=41.21;MQ0=2;QD=2.85;SB=-274.73	GT:AD:DP:GL:GQ	0/1:134,38:129:-95.85,-41.26,-324.12:99
-chr1	3408517	rs7368034	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=115;Dels=0.00;HRun=0;HaplotypeScore=120.54;MQ=42.22;MQ0=3;OQ=514.65;QD=4.48;SB=-116.36	GT:AD:DP:GL:GQ	0/1:73,33:82:-88.72,-33.97,-192.96:99
-chr1	3411446	rs6669870	C	T	607.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.14;MQ0=0;OQ=1485.27;QD=36.23;SB=-614.81	GT:AD:DP:GL:GQ	1/1:0,41:39:-152.13,-11.76,-0.02:99
-chr1	3411518	rs2821009	A	T	529.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.77;MQ0=0;OQ=1252.41;QD=34.79;SB=-623.61	GT:AD:DP:GL:GQ	1/1:0,36:35:-128.84,-10.55,-0.01:99
-chr1	3411757	rs2821008	A	G	31.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.15;MQ=59.41;MQ0=0;OQ=238.32;QD=6.11;SB=-110.60	GT:AD:DP:GL:GQ	0/1:25,14:37:-38.27,-11.15,-99.52:99
-chr1	3413327	rs947344	C	T	169.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=58.66;MQ0=0;OQ=1006.19;QD=19.35;SB=-478.56	GT:AD:DP:GL:GQ	0/1:21,31:45:-117.47,-13.57,-45.94:99
-chr1	3413493	rs2821006	A	G	514.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1416.92;QD=30.15;SB=-704.80	GT:AD:DP:GL:GQ	1/1:0,47:45:-145.32,-13.57,-0.04:99
-chr1	3413602	rs10797397	C	A	230.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.01;MQ=59.11;MQ0=0;OQ=969.58;QD=16.43;SB=-386.82	GT:AD:DP:GL:GQ	0/1:25,34:55:-116.81,-16.57,-75.73:99
-chr1	3414248	rs947345	G	A	253.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.28;MQ=59.23;MQ0=0;OQ=855.83;QD=14.26;SB=-381.90	GT:AD:DP:GL:GQ	0/1:31,29:53:-104.84,-15.98,-85.70:99
-chr1	3415290	rs2794358	A	G	117.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1082.49;QD=30.93;SB=-492.45	GT:AD:DP:GL:GQ	1/1:0,35:32:-111.85,-9.64,-0.02:96.25
-chr1	3416927	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=1;HaplotypeScore=20.42;MQ=57.31;MQ0=0;OQ=341.32;QD=7.11;SB=-84.89	GT:AD:DP:GL:GQ	0/1:26,19:38:-51.91,-14.49,-87.40:99
-chr1	3416981	rs56310990	G	C	2.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=51.26;MQ0=0;OQ=93.69;QD=3.02;SB=-14.81	GT:AD:DP:GL:GQ	0/1:25,6:25:-20.20,-7.54,-81.40:99
-chr1	3416998	.	C	T	35.62	PASS	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=49.93;MQ0=0;OQ=473.15;QD=15.77;SB=-230.75	GT:AD:DP:GL:GQ	0/1:10,20:24:-57.83,-7.23,-29.03:99
-chr1	3418020	rs2820999	T	G	23.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=1.35;MQ=59.30;MQ0=0;OQ=1099.49;QD=33.32;SB=-419.27	GT:AD:DP:GL:GQ	1/1:0,32:32:-113.54,-9.64,-0.01:96.28
-chr1	3418284	rs4648391	G	T	480.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=1326.40;QD=33.16;SB=-497.29	GT:AD:DP:GL:GQ	1/1:0,40:39:-136.24,-11.75,-0.02:99
-chr1	3418288	rs4648514	C	T	298.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=1504.64;QD=38.58;SB=-514.18	GT:AD:DP:GL:GQ	1/1:0,39:39:-154.07,-11.75,-0.02:99
-chr1	3418468	rs11585362	G	A	504.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1061.06;QD=36.59;SB=-446.58	GT:AD:DP:GL:GQ	1/1:0,29:29:-109.71,-8.74,-0.02:87.27
-chr1	3419555	rs11587354	C	A	388.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=2174.38;QD=35.07;SB=-358.82	GT:AD:DP:GL:GQ	1/1:0,62:58:-221.04,-17.47,-0.02:99
-chr1	3420506	.	T	A	214.92	PASS	AC=2;AF=1.00;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1094.09;QD=36.47;SB=-408.28	GT:AD:DP:GL:GQ	1/1:0,30:30:-113.00,-9.04,-0.01:90.28
-chr1	3422067	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=4;HaplotypeScore=5.56;MQ=56.93;MQ0=0;OQ=142.54;QD=3.85;SB=26.11	GT:AD:DP:GL:GQ	0/1:17,20:22:-24.18,-6.64,-53.52:99
-chr1	3422138	rs12045137	C	G	147.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1703.92;QD=40.57;SB=-765.63	GT:AD:DP:GL:GQ	1/1:0,42:41:-174.00,-12.36,-0.02:99
-chr1	3422853	rs11587498	G	A	175.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.43;MQ=60.00;MQ0=0;OQ=415.52;QD=12.22;SB=-203.18	GT:AD:DP:GL:GQ	0/1:20,14:31:-54.19,-9.35,-54.52:99
-chr1	3424377	rs2820995	A	G	162.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=58.66;MQ0=0;OQ=1805.64;QD=27.36;SB=-525.83	GT:AD:DP:GL:GQ	1/1:0,66:60:-184.23,-18.11,-0.08:99
-chr1	3424844	rs2794362	G	C	500.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=1899.04;QD=42.20;SB=-801.86	GT:AD:DP:GL:GQ	1/1:0,45:44:-193.50,-13.26,-0.01:99
-chr1	3427795	rs2794365	T	C	272.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.56;MQ0=0;OQ=540.74;QD=12.87;SB=-223.28	GT:AD:DP:GL:GQ	0/1:22,20:39:-69.11,-11.75,-73.06:99
-chr1	3428053	rs11587384	G	A	58.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=2.73;MQ=58.59;MQ0=0;OQ=656.10;QD=19.88;SB=-350.39	GT:AD:DP:GL:GQ	0/1:13,20:30:-77.94,-9.05,-31.18:99
-chr1	3428530	rs10909958	C	T	169.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=60.00;MQ0=0;OQ=649.49;QD=10.31;SB=-164.81	GT:AD:DP:GL:GQ	0/1:40,23:61:-86.62,-18.39,-128.91:99
-chr1	3429888	rs10797398	G	C	1.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=0.26;MQ=58.87;MQ0=0;OQ=1501.66;QD=40.59;SB=-598.80	GT:AD:DP:GL:GQ	1/1:0,37:37:-153.77,-11.16,-0.02:99
-chr1	3430507	rs2794322	T	C	118.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=864.34;QD=26.19;SB=-416.15	GT:AD:DP:GL:GQ	1/1:0,33:29:-90.06,-8.75,-0.04:87.16
-chr1	3430803	rs12049449	A	C	10.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=3;HaplotypeScore=1.13;MQ=59.39;MQ0=0;OQ=1279.24;QD=33.66;SB=-506.06	GT:AD:DP:GL:GQ	1/1:0,38:37:-131.52,-11.15,-0.02:99
-chr1	3431124	rs12093117	G	A	200.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.17;MQ=59.61;MQ0=0;OQ=828.18;QD=17.25;SB=-263.28	GT:AD:DP:GL:GQ	0/1:20,28:45:-99.67,-13.57,-58.69:99
-chr1	3432615	rs11589895	G	A	209.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=58.89;MQ0=0;OQ=771.91;QD=18.38;SB=-386.90	GT:AD:DP:GL:GQ	0/1:19,23:42:-93.13,-12.66,-62.18:99
-chr1	3433053	.	C	T	70.11	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=58.26;MQ0=0;OQ=707.05;QD=13.86;SB=-362.49	GT:AD:DP:GL:GQ	0/1:26,25:48:-88.45,-14.46,-91.49:99
-chr1	3435213	rs2821068	G	C	38.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=58.11;MQ0=0;OQ=1371.97;QD=37.08;SB=-540.03	GT:AD:DP:GL:GQ	1/1:0,36:33:-140.79,-9.95,-0.01:99
-chr1	3435771	rs883427	G	A	416.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.00;MQ0=0;OQ=1899.02;QD=38.76;SB=-741.50	GT:AD:DP:GL:GQ	1/1:0,49:48:-193.50,-14.46,-0.01:99
-chr1	3436171	rs11589175	G	A	118.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=494.22;QD=9.88;SB=-114.31	GT:AD:DP:GL:GQ	0/1:32,17:48:-69.83,-17.13,-113.83:99
-chr1	3436855	rs11811714	C	T	197.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.64;MQ=58.93;MQ0=0;OQ=2210.05;QD=36.23;SB=-988.23	GT:AD:DP:GL:GQ	1/1:0,61:58:-224.62,-17.49,-0.03:99
-chr1	3436977	rs56103034	G	C	151.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=60.00;MQ0=0;OQ=361.61;QD=12.91;SB=-169.18	GT:AD:DP:GL:GQ	0/1:15,13:27:-47.59,-8.14,-66.07:99
-chr1	3437069	.	A	C	13.05	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=2;HaplotypeScore=6.13;MQ=58.68;MQ0=0;QD=0.25;SB=74.24	GT:AD:DP:GL:GQ	0/1:37,15:37:-15.71,-11.15,-109.98:45.67
-chr1	3438669	rs61762171	G	A	197.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.08;MQ=59.50;MQ0=0;OQ=831.35;QD=18.07;SB=-356.42	GT:AD:DP:GL:GQ	0/1:21,25:43:-99.38,-12.97,-55.25:99
-chr1	3438727	rs55762450	C	A	163.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=59.54;MQ0=0;OQ=660.37;QD=13.21;SB=-236.28	GT:AD:DP:GL:GQ	0/1:20,30:45:-82.89,-13.57,-69.96:99
-chr1	3440115	rs2493313	T	C	297.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=56.74;MQ0=0;OQ=1008.77;QD=34.79;SB=-528.20	GT:AD:DP:GL:GQ	1/1:0,29:29:-104.47,-8.74,-0.01:87.25
-chr1	3444452	rs9970944	G	T	111.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.08;MQ=58.11;MQ0=0;OQ=1564.30;QD=32.59;SB=-784.47	GT:AD:DP:GL:GQ	1/1:1,47:45:-160.04,-13.56,-0.02:99
-chr1	3445102	rs12049456	G	A	432	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.32;MQ0=0;OQ=1256.64;QD=36.96;SB=-508.18	GT:AD:DP:GL:GQ	1/1:0,34:33:-129.26,-9.95,-0.01:99
-chr1	3445120	.	C	G	39.08	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.43;MQ=55.59;MQ0=2;QD=0.85;SB=59.22	GT:AD:DP:GL:GQ	0/1:40,6:41:-19.55,-12.36,-150.78:71.92
-chr1	3448511	rs2821064	A	T	100.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.44;MQ=58.81;MQ0=0;OQ=526.36;QD=13.50;SB=-238.77	GT:AD:DP:GL:GQ	0/1:20,19:39:-67.67,-11.75,-70.26:99
-chr1	3448541	rs2794331	G	C	111.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=58.71;MQ0=0;OQ=556.37;QD=15.45;SB=-245.10	GT:AD:DP:GL:GQ	0/1:19,17:32:-68.58,-9.65,-62.08:99
-chr1	3448992	rs12065874	C	T	177.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=59.46;MQ0=0;OQ=793.34;QD=18.45;SB=-374.15	GT:AD:DP:GL:GQ	0/1:19,24:39:-94.38,-11.76,-47.24:99
-chr1	3452764	rs10797401	T	C	166.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.03;MQ=59.52;MQ0=0;OQ=647.76;QD=16.61;SB=-319.33	GT:AD:DP:GL:GQ	0/1:16,23:38:-79.51,-11.45,-58.06:99
-chr1	3453088	rs28479691	G	A	97.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=55.43;MQ0=1;OQ=249.39;QD=11.34;SB=-131.56	GT:AD:DP:GL:GQ	0/1:11,11:18:-33.65,-5.43,-32.56:99
-chr1	3453209	rs13374309	C	G	5.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=2;HaplotypeScore=3.14;MQ=57.20;MQ0=0;OQ=292.98;QD=15.42;SB=-154.58	GT:AD:DP:GL:GQ	0/1:9,10:17:-37.71,-5.13,-33.06:99
-chr1	3455556	rs7539836	A	G	113.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=359.37;QD=13.82;SB=-189.55	GT:AD:DP:GL:GQ	0/1:12,14:25:-46.76,-7.53,-43.20:99
-chr1	3458010	rs7533321	G	A	155.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.46;MQ0=0;OQ=810.48;QD=18.85;SB=-428.48	GT:AD:DP:GL:GQ	0/1:17,25:39:-96.09,-11.75,-47.40:99
-chr1	3458818	rs6413780	A	C	146.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.53;MQ0=0;OQ=401.98;QD=8.20;SB=-115.74	GT:AD:DP:GL:GQ	0/1:29,20:47:-57.64,-14.16,-107.92:99
-chr1	3458949	rs7355038	G	A	151.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.86;MQ=59.19;MQ0=0;OQ=998.13;QD=19.19;SB=-471.50	GT:AD:DP:GL:GQ	0/1:22,30:52:-118.77,-15.67,-71.64:99
-chr1	3460223	rs10909965	T	G	23.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=1;HaplotypeScore=2.59;MQ=58.78;MQ0=0;OQ=201.44;QD=10.60;SB=-54.94	GT:AD:DP:GL:GQ	0/1:10,9:17:-28.55,-5.12,-30.64:99
-chr1	3460241	rs12078542	T	C	57.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=58.39;MQ0=0;OQ=207.08;QD=7.14;SB=-117.62	GT:AD:DP:GL:GQ	0/1:17,12:22:-30.63,-6.64,-46.05:99
-chr1	3460729	rs1557089	T	G	340.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.05;MQ0=0;OQ=311.87;QD=12.99;SB=-162.75	GT:AD:DP:GL:GQ	0/1:12,12:20:-40.49,-6.02,-30.26:99
-chr1	3462253	rs7516641	A	G	481.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=514.29;QD=11.96;SB=-180.52	GT:AD:DP:GL:GQ	0/1:23,20:43:-67.67,-12.96,-92.19:99
-chr1	3466443	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=45;Dels=0.02;HRun=17;HaplotypeScore=21.57;MQ=53.85;MQ0=0;OQ=205.19;QD=4.56;SB=-78.83	GT:AD:DP:GL:GQ	0/1:24,20:32:-33.15,-9.34,-78.96:99
-chr1	3466697	.	C	G	64.69	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=58.96;MQ0=0;OQ=671.74;QD=12.44;SB=-259.12	GT:AD:DP:GL:GQ	0/1:31,23:50:-85.55,-15.09,-116.59:99
-chr1	3474782	rs56410789	G	A	184.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=59.61;MQ0=0;OQ=703.19;QD=14.65;SB=-349.63	GT:AD:DP:GL:GQ	0/1:25,22:45:-89.80,-16.20,-75.19:99
-chr1	3480873	.	T	C	0.25	PASS	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=3;HaplotypeScore=1.82;MQ=59.06;MQ0=0;OQ=234.33;QD=11.72;SB=-33.65	GT:AD:DP:GL:GQ	0/1:10,10:19:-32.44,-5.72,-41.44:99
-chr1	3480967	rs4431782	T	C	9.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=2.79;MQ=59.14;MQ0=0;OQ=141.27;QD=5.23;SB=-37.66	GT:AD:DP:GL:GQ	0/1:16,11:24:-24.65,-7.24,-64.66:99
-chr1	3482056	rs2821057	A	G	50.28	Indel	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.04;HRun=0;HaplotypeScore=40.06;MQ=43.76;MQ0=3;QD=0.93;SB=-23.61	GT:AD:DP:GL:GQ	0/1:44,8:48:-22.18,-13.87,-154.71:83.12
-chr1	3483124	rs2821056	A	T	583.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.89;MQ0=0;OQ=1839.69;QD=37.54;SB=-868.96	GT:AD:DP:GL:GQ	1/1:0,49:49:-187.56,-14.76,-0.01:99
-chr1	3483560	rs2821055	T	C	111.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.95;MQ=57.13;MQ0=0;OQ=1375.27;QD=31.98;SB=-687.18	GT:AD:DP:GL:GQ	1/1:0,43:41:-141.13,-12.35,-0.02:99
-chr1	3483710	rs2821054	G	T	266.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.07;MQ0=0;OQ=1733.58;QD=34.67;SB=-747.08	GT:AD:DP:GL:GQ	1/1:0,50:50:-176.97,-15.07,-0.02:99
-chr1	3484389	rs2794348	A	G	1.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=6.39;MQ=58.05;MQ0=0;OQ=1127.20;QD=31.31;SB=-545.88	GT:AD:DP:GL:GQ	1/1:0,36:34:-116.33,-10.25,-0.02:99
-chr1	3484478	rs2794347	G	C	132.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.47;MQ0=0;OQ=1529.91;QD=34.77;SB=-715.91	GT:AD:DP:GL:GQ	1/1:0,44:40:-156.62,-12.09,-0.05:99
-chr1	3484580	rs2794346	G	A	64.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=980.89;QD=28.85;SB=-342.41	GT:AD:DP:GL:GQ	1/1:1,32:27:-101.70,-8.14,-0.02:81.23
-chr1	3485237	rs2794344	G	A	227.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=58.20;MQ0=0;OQ=1135.92;QD=18.03;SB=-434.44	GT:AD:DP:GL:GQ	0/1:26,37:58:-134.36,-17.49,-77.46:99
-chr1	3485276	rs2794343	G	T	262.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=58.14;MQ0=0;OQ=635.86;QD=12.00;SB=-319.27	GT:AD:DP:GL:GQ	0/1:28,25:50:-81.94,-15.07,-81.25:99
-chr1	3485297	rs2794342	T	C	164.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.19;MQ=55.76;MQ0=0;OQ=873.19;QD=16.17;SB=-382.03	GT:AD:DP:GL:GQ	0/1:20,34:51:-105.98,-15.38,-70.34:99
-chr1	3485317	.	C	T	0.61	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=55.51;MQ0=0;OQ=217.69;QD=4.03;SB=-62.86	GT:AD:DP:GL:GQ	0/1:42,11:46:-38.92,-13.87,-116.02:99
-chr1	3485320	.	C	T	0.57	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=55.81;MQ0=0;OQ=186.10;QD=3.58;SB=-62.80	GT:AD:DP:GL:GQ	0/1:41,10:44:-35.15,-13.26,-125.21:99
-chr1	3485329	rs56044258	C	G	8.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=4.19;MQ=55.35;MQ0=0;OQ=1813.27;QD=38.58;SB=-922.42	GT:AD:DP:GL:GQ	1/1:0,47:43:-184.93,-12.96,-0.02:99
-chr1	3485401	rs2821053	T	C	608.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.09;MQ0=0;OQ=2115.06;QD=34.11;SB=-1060.08	GT:AD:DP:GL:GQ	1/1:0,62:60:-215.11,-18.07,-0.02:99
-chr1	3485841	rs2794341	T	C	133.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.28;MQ=59.57;MQ0=0;OQ=1280.08;QD=29.77;SB=-579.98	GT:AD:DP:GL:GQ	1/1:0,43:41:-131.63,-12.37,-0.04:99
-chr1	3485914	rs2821052	G	C	139.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=59.60;MQ0=0;OQ=1918.65;QD=40.82;SB=-901.42	GT:AD:DP:GL:GQ	1/1:0,47:46:-195.47,-13.86,-0.02:99
-chr1	3486188	rs2821051	T	C	180.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.51;MQ0=0;OQ=1502.08;QD=31.96;SB=-651.24	GT:AD:DP:GL:GQ	1/1:0,47:44:-153.81,-13.26,-0.02:99
-chr1	3486339	rs2794340	T	C	195.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=747.54;QD=27.69;SB=-185.41	GT:AD:DP:GL:GQ	1/1:0,27:25:-78.37,-7.54,-0.03:75.17
-chr1	3486805	rs2794339	G	A	3.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=790.02;QD=34.35;SB=-39.54	GT:AD:DP:GL:GQ	1/1:0,23:21:-82.60,-6.33,-0.01:63.20
-chr1	3486898	.	C	G	23.94	LowQual	AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=1;HaplotypeScore=3.33;MQ=60.00;MQ0=0;QD=2.18;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,7:5:-7.19,-1.52,-10.35:56.76
-chr1	3486969	rs2821050	A	G	170.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.66;MQ0=0;OQ=230.85;QD=23.09;SB=-101.03	GT:AD:DP:GL:GQ	1/1:0,10:9:-26.68,-2.72,-0.01:27.04
-chr1	3487085	rs2821049	G	A	44.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.41;MQ0=1;OQ=1103.43;QD=35.59;SB=-441.32	GT:AD:DP:GL:GQ	1/1:0,31:29:-113.94,-8.74,-0.01:87.28
-chr1	3487785	rs2821048	T	C	3.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=3;HaplotypeScore=0.79;MQ=59.07;MQ0=0;OQ=795.96;QD=29.48;SB=-323.61	GT:AD:DP:GL:GQ	1/1:0,26:24:-83.19,-7.23,-0.01:72.20
-chr1	3488346	rs2821047	A	C	41.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=59.50;MQ0=0;OQ=1833.45;QD=33.34;SB=-923.21	GT:AD:DP:GL:GQ	1/1:0,55:53:-186.95,-15.96,-0.02:99
-chr1	3488543	rs2794338	G	A	5.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=2.25;MQ=59.38;MQ0=0;OQ=1108.21;QD=36.94;SB=-425.07	GT:AD:DP:GL:GQ	1/1:0,30:29:-114.42,-8.74,-0.01:87.27
-chr1	3488600	rs2821046	T	C	153.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.59;MQ=59.16;MQ0=0;OQ=1640.68;QD=29.83;SB=-825.95	GT:AD:DP:GL:GQ	1/1:0,55:53:-167.70,-15.99,-0.05:99
-chr1	3488885	rs2794337	T	G	92.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.67;MQ0=0;OQ=1036.65;QD=29.62;SB=-469.86	GT:AD:DP:GL:GQ	1/1:0,35:34:-107.28,-10.25,-0.03:99
-chr1	3488911	rs2794336	C	A	491.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=1159.72;QD=31.34;SB=-543.79	GT:AD:DP:GL:GQ	1/1:0,37:35:-119.58,-10.55,-0.02:99
-chr1	3489106	rs2821045	A	G	0.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=15.70;MQ=58.09;MQ0=0;OQ=1342.02;QD=27.39;SB=-607.24	GT:AD:DP:GL:GQ	1/1:1,48:44:-137.83,-13.27,-0.05:99
-chr1	3489389	rs2794335	C	G	104.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=56.91;MQ0=0;OQ=2044.98;QD=41.73;SB=-1038.63	GT:AD:DP:GL:GQ	1/1:0,49:48:-208.10,-14.46,-0.02:99
-chr1	3489541	rs2821044	A	G	154.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=51.93;MQ0=0;OQ=1856.46;QD=32.01;SB=-939.38	GT:AD:DP:GL:GQ	1/1:0,58:53:-189.25,-15.96,-0.02:99
-chr1	3489730	.	G	A	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=5.70;MQ=38.46;MQ0=13;OQ=219.88;QD=2.71;SB=-20.96	GT:AD:DP:GL:GQ	0/1:65,15:58:-42.77,-17.50,-145.53:99
-chr1	3489856	rs61762194	A	G	22.79	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=13.90;MQ=6.46;MQ0=57;QD=0.35;SB=-34.94	GT:AD:DP:GL:GQ	0/1:19,46:3:-6.46,-0.90,-4.17:32.64
-chr1	3490108	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=0;HaplotypeScore=22.57;MQ=11.21;MQ0=79;OQ=52.09;QD=0.43;SB=2.03	GT:AD:DP:GL:GQ	0/1:64,55:12:-12.11,-3.62,-27.46:84.92
-chr1	3490124	.	G	C	37.51	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=28.89;MQ=9.24;MQ0=69;QD=0.40;SB=-36.43	GT:AD:DP:GL:GQ	0/1:52,37:3:-7.94,-0.91,-4.59:36.89
-chr1	3490204	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=9.07;MQ=18.33;MQ0=40;OQ=221.10;QD=2.91;SB=-48.02	GT:AD:DP:GL:GQ	0/1:38,34:16:-30.22,-4.83,-23.80:99
-chr1	3490220	.	G	C	14.47	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=1;HaplotypeScore=18.26;MQ=21.29;MQ0=44;QD=0.14;SB=5.04	GT:AD:DP:GL:GQ	0/1:89,13:27:-12.87,-8.16,-91.89:47.15
-chr1	3490238	.	G	C	29.48	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=1;HaplotypeScore=19.99;MQ=24.83;MQ0=54;QD=0.24;SB=65.23	GT:AD:DP:GL:GQ	0/1:92,32:39:-18.02,-11.79,-132.68:62.32
-chr1	3490274	rs61762197	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=195;Dels=0.00;HRun=0;HaplotypeScore=31.55;MQ=26.52;MQ0=97;OQ=140.78;QD=0.72;SB=53.20	GT:AD:DP:GL:GQ	0/1:172,21:60:-35.47,-18.11,-209.36:99
-chr1	3490294	rs61762198	G	A	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=144;Dels=0.00;HRun=0;HaplotypeScore=18.88;MQ=30.38;MQ0=61;OQ=410.69;QD=2.85;SB=-6.44	GT:AD:DP:GL:GQ	0/1:110,32:48:-58.84,-14.49,-102.11:99
-chr1	3490309	rs61762199	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=126;Dels=0.00;HRun=0;HaplotypeScore=43.37;MQ=33.08;MQ0=48;OQ=683.06;QD=5.42;SB=-30.63	GT:AD:DP:GL:GQ	0/1:101,25:47:-85.76,-14.17,-79.46:99
-chr1	3490312	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=46.24;MQ=34.26;MQ0=40;OQ=200.77;QD=1.72;SB=-32.50	GT:AD:DP:GL:GQ	0/1:85,31:40:-35.43,-12.07,-95.25:99
-chr1	3490435	rs2995009	G	A	597.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.35;MQ0=0;OQ=1467.09;QD=38.61;SB=-711.36	GT:AD:DP:GL:GQ	1/1:0,38:38:-150.31,-11.45,-0.01:99
-chr1	3491040	rs2995008	T	C	284.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=1828.19;QD=32.07;SB=-897.29	GT:AD:DP:GL:GQ	1/1:0,57:55:-186.44,-16.58,-0.04:99
-chr1	3492147	.	G	A	23.72	PASS	AC=2;AF=1.00;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=55.26;MQ0=1;OQ=1679.66;QD=32.93;SB=-585.96	GT:AD:DP:GL:GQ	1/1:1,50:45:-171.57,-13.56,-0.02:99
-chr1	3492404	rs2487682	G	A	109.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=55.97;MQ0=0;OQ=1664.54;QD=34.68;SB=-566.34	GT:AD:DP:GL:GQ	1/1:2,46:43:-170.05,-12.95,-0.01:99
-chr1	3493214	rs10909977	C	T	290.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.46;MQ0=0;OQ=982.44;QD=37.79;SB=-341.35	GT:AD:DP:GL:GQ	1/1:0,26:26:-101.84,-7.83,-0.01:78.25
-chr1	3493427	rs12133810	G	A	0.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=6.10;MQ=60.00;MQ0=0;OQ=1731.58;QD=36.07;SB=-586.35	GT:AD:DP:GL:GQ	1/1:0,47:45:-176.76,-13.56,-0.02:99
-chr1	3493933	rs12139206	T	C	718.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.76;MQ0=0;OQ=2133.52;QD=33.87;SB=-1000.69	GT:AD:DP:GL:GQ	1/1:0,63:61:-216.96,-18.38,-0.03:99
-chr1	3494278	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=29.95;MQ=39.18;MQ0=0;OQ=57.06;QD=1.00;SB=32.12	GT:AD:DP:GL:GQ	0/1:51,6:50:-24.05,-15.06,-154.00:89.90
-chr1	3494280	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=31.95;MQ=39.34;MQ0=0;OQ=98.32;QD=1.76;SB=29.10	GT:AD:DP:GL:GQ	0/1:46,10:49:-27.88,-14.76,-138.47:99
-chr1	3494307	.	T	G	201.76	SnpCluster	AC=1;AF=0.50;AN=2;DP=58;Dels=0.10;HRun=2;HaplotypeScore=112.88;MQ=32.38;MQ0=0;QD=3.48;SB=-117.62	GT:AD:DP:GL:GQ	0/1:34,18:28:-31.59,-8.13,-64.60:99
-chr1	3494310	rs61762200	C	A	192.29	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=121.85;MQ=30.79;MQ0=0;QD=3.43;SB=-60.75	GT:AD:DP:GL:GQ	0/1:36,18:28:-30.95,-8.43,-66.22:99
-chr1	3494317	.	G	T	32.47	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=81.33;MQ=29.05;MQ0=0;QD=0.60;SB=-10.00	GT:AD:DP:GL:GQ	0/1:41,11:25:-14.06,-7.53,-79.10:65.31
-chr1	3494320	.	G	A	676.99	SnpCluster	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=53.82;MQ=29.06;MQ0=0;QD=13.02;SB=-10.00	GT:AD:DP:GL:GQ	0/1:6,41:24:-78.21,-7.23,-14.28:70.50
-chr1	3494331	.	C	T	224.74	SnpCluster	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=74.35;MQ=28.87;MQ0=0;QD=4.68;SB=-10.00	GT:AD:DP:GL:GQ	0/1:29,19:11:-29.07,-3.31,-14.19:99
-chr1	3494338	.	G	A	223.95	SnpCluster	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=78.36;MQ=28.88;MQ0=0;QD=4.76;SB=-10.00	GT:AD:DP:GL:GQ	0/1:25,22:10:-28.69,-3.01,-9.91:68.95
-chr1	3494340	.	G	A	250.50	SnpCluster	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=74.35;MQ=28.88;MQ0=0;QD=5.33;SB=-10.00	GT:AD:DP:GL:GQ	0/1:9,38:10:-31.35,-3.01,-6.64:36.27
-chr1	3494344	.	G	A	85.25	SnpCluster	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=68.88;MQ=28.67;MQ0=0;QD=1.85;SB=-10.00	GT:AD:DP:GL:GQ	0/1:41,5:14:-16.03,-4.22,-34.38:99
-chr1	3494347	.	A	T	143.02	SnpCluster	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=69.92;MQ=28.59;MQ0=0;QD=3.87;SB=-10.00	GT:AD:DP:GL:GQ	0/1:2,19:7:-19.69,-2.11,-6.98:48.71
-chr1	3494357	.	G	T	24.90	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=73.10;MQ=28.56;MQ0=0;QD=0.73;SB=-10.00	GT:AD:DP:GL:GQ	0/1:18,15:5:-7.28,-1.51,-10.87:57.73
-chr1	3494360	.	G	A	23.23	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=81.86;MQ=28.53;MQ0=0;QD=0.73;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,11:6:-7.41,-1.81,-14.17:56.05
-chr1	3494364	.	G	A	65.76	SnpCluster	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=1;HaplotypeScore=67.04;MQ=28.12;MQ0=1;QD=1.93;SB=-10.00	GT:AD:DP:GL:GQ	0/1:29,5:7:-11.97,-2.11,-13.57:98.60
-chr1	3494367	.	G	T	116.01	SnpCluster	AC=1;AF=0.50;AN=2;DP=34;Dels=0.03;HRun=0;HaplotypeScore=76.86;MQ=28.12;MQ0=1;QD=3.41;SB=-10.00	GT:AD:DP:GL:GQ	0/1:14,19:9:-17.59,-2.71,-15.13:99
-chr1	3494370	.	G	C	77.61	SnpCluster	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=62.98;MQ=28.25;MQ0=1;QD=2.87;SB=-10.00	GT:AD:DP:GL:GQ	0/1:8,7:9:-20.69,-9.65,-24.68:99
-chr1	3494377	.	G	T	26.91	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=64.80;MQ=28.23;MQ0=1;QD=1.03;SB=-10.00	GT:AD:DP:GL:GQ	0/1:20,4:4:-7.18,-1.20,-7.71:59.73
-chr1	3494378	.	G	A	98.30	SnpCluster	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=59.24;MQ=28.44;MQ0=1;QD=3.78;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,11:7:-15.22,-2.11,-10.61:84.98
-chr1	3494380	.	G	A	43.51	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=65.22;MQ=28.44;MQ0=1;QD=1.67;SB=-10.00	GT:AD:DP:GL:GQ	0/1:8,15:4:-12.40,-4.77,-6.87:20.98
-chr1	3494384	.	G	A	26.23	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=1;HaplotypeScore=51.99;MQ=28.44;MQ0=1;QD=1.01;SB=-10.00	GT:AD:DP:GL:GQ	0/1:20,6:7:-8.02,-2.11,-15.94:59.06
-chr1	3494390	.	G	A	130.87	SnpCluster	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=39.84;MQ=28.27;MQ0=1;QD=6.54;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,12:6:-18.18,-1.81,-3.67:18.63
-chr1	3494414	.	G	A	19.25	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=1;HaplotypeScore=22.06;MQ=28.20;MQ0=1;QD=1.13;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,2:8:-7.61,-2.41,-20.11:52.04
-chr1	3494416	.	G	C	113.75	SnpCluster	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=18.24;MQ=27.40;MQ0=1;QD=6.32;SB=-10.00	GT:AD:DP:GL:GQ	0/1:14,4:8:-17.07,-2.41,-16.09:99
-chr1	3494417	.	A	T	24.41	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=25.18;MQ=27.40;MQ0=1;QD=1.36;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,5:8:-14.34,-8.61,-21.17:57.23
-chr1	3494420	.	C	A	17.09	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=28.79;MQ=27.40;MQ0=1;QD=0.95;SB=-10.00	GT:AD:DP:GL:GQ	0/1:7,11:6:-6.79,-1.81,-13.20:49.84
-chr1	3494428	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=21.58;MQ=27.57;MQ0=1;OQ=101.33;QD=5.07;SB=-10.00	GT:AD:DP:GL:GQ	0/1:14,6:9:-16.13,-2.71,-15.44:99
-chr1	3494440	.	A	G	20.51	LowQual	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=4;HaplotypeScore=16.99;MQ=27.20;MQ0=1;QD=1.28;SB=-10.00	GT:AD:DP:GL:GQ	0/1:14,2:6:-7.14,-1.81,-14.72:53.31
-chr1	3494450	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=19.98;MQ=27.07;MQ0=1;OQ=136.86;QD=9.12;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,11:7:-19.08,-2.11,-6.94:48.30
-chr1	3494456	.	G	A	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=17;Dels=0.12;HRun=1;HaplotypeScore=13.10;MQ=27.31;MQ0=1;OQ=95.30;QD=5.61;SB=-10.00	GT:AD:DP:GL:GQ	0/1:10,5:11:-16.13,-3.31,-22.08:99
-chr1	3494463	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=1;HaplotypeScore=15.99;MQ=27.75;MQ0=0;OQ=76.78;QD=6.98;SB=-10.00	GT:AD:DP:GL:GQ	0/1:8,3:5:-12.47,-1.51,-7.14:56.32
-chr1	3494470	.	G	A	37.25	LowQual	AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=9.99;MQ=29.00;MQ0=0;QD=4.66;SB=-10.00	GT:AD:DP:GL:GQ	0/1:2,6:3:-7.91,-0.90,-3.57:26.65
-chr1	3494476	.	C	G	10.99	LowQual	AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=6.99;MQ=29.00;MQ0=0;QD=1.83;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,3:1:-4.35,-0.30,-0.00:1.76
-chr1	3494500	.	C	A	20.04	LowQual	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=24.21;MQ=29.00;MQ0=0;QD=1.43;SB=-10.00	GT:AD:DP:GL:GQ	0/1:6,8:6:-7.09,-1.81,-14.10:52.83
-chr1	3494506	.	G	A	17.29	LowQual	AC=1;AF=0.50;AN=2;DP=19;Dels=0.05;HRun=1;HaplotypeScore=32.64;MQ=29.00;MQ0=0;QD=0.91;SB=-10.00	GT:AD:DP:GL:GQ	0/1:14,4:10:-8.02,-3.01,-25.65:50.04
-chr1	3494513	.	G	A	25.23	LowQual	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=1;HaplotypeScore=41.45;MQ=31.40;MQ0=0;QD=1.33;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,4:6:-7.61,-1.81,-13.27:58.06
-chr1	3494520	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=37.55;MQ=33.42;MQ0=0;OQ=64.77;QD=3.24;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,13:7:-11.87,-2.11,-12.97:97.60
-chr1	3494524	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=1;HaplotypeScore=27.25;MQ=33.22;MQ0=0;OQ=65.77;QD=3.13;SB=-10.00	GT:AD:DP:GL:GQ	0/1:18,3:5:-11.37,-1.51,-6.04:45.31
-chr1	3494544	.	G	A	102.31	SnpCluster	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=1;HaplotypeScore=60.62;MQ=32.58;MQ0=0;QD=4.09;SB=-10.00	GT:AD:DP:GL:GQ	0/1:21,4:9:-16.23,-2.71,-16.04:99
-chr1	3494547	.	G	T	87.64	SnpCluster	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=65.61;MQ=32.58;MQ0=0;QD=3.51;SB=-10.00	GT:AD:DP:GL:GQ	0/1:19,5:8:-14.46,-2.41,-14.43:99
-chr1	3494550	.	A	C	79.94	SnpCluster	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=1;HaplotypeScore=55.04;MQ=32.72;MQ0=0;QD=3.33;SB=-10.00	GT:AD:DP:GL:GQ	0/1:14,6:8:-16.58,-5.30,-13.73:84.35
-chr1	3494557	.	G	T	60.29	SnpCluster	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=39.81;MQ=31.18;MQ0=0;QD=2.87;SB=-10.00	GT:AD:DP:GL:GQ	0/1:11,8:4:-10.52,-1.20,-3.86:26.53
-chr1	3494560	.	G	A	91.28	SnpCluster	AC=2;AF=1.00;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=38.65;MQ=31.18;MQ0=0;QD=4.35;SB=-10.00	GT:AD:DP:GL:GQ	1/1:7,11:4:-16.06,-4.57,-3.40:11.70
-chr1	3494564	.	G	A	29.24	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=1;HaplotypeScore=32.50;MQ=31.29;MQ0=0;QD=1.46;SB=-10.00	GT:AD:DP:GL:GQ	0/1:18,2:6:-8.02,-1.81,-12.47:62.07
-chr1	3494574	.	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=26.98;MQ=29.00;MQ0=0;OQ=69.17;QD=4.94;SB=-10.00	GT:AD:DP:GL:GQ	1/1:6,8:3:-10.41,-0.90,-0.00:9.03
-chr1	3494590	.	G	A	142.91	SnpCluster	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=22.40;MQ=29.00;MQ0=0;QD=9.53;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,8:6:-19.38,-1.81,-3.57:17.63
-chr1	3494597	.	G	T	106.99	SnpCluster	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=25.38;MQ=29.00;MQ0=0;QD=7.64;SB=-10.00	GT:AD:DP:GL:GQ	0/1:9,5:11:-17.30,-3.31,-21.74:99
-chr1	3494600	.	G	A	30.23	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=11.39;MQ=29.00;MQ0=0;QD=3.02;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,6:5:-7.81,-1.51,-10.71:63.06
-chr1	3494624	.	A	G	3.02	PASS	AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=1;HaplotypeScore=2.14;MQ=23.68;MQ0=1;OQ=61.17;QD=10.20;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,5:4:-10.61,-1.20,-4.06:28.52
-chr1	3494941	rs3122612	T	C	27.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.13;MQ0=0;OQ=190.96;QD=21.22;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,9:7:-22.68,-2.11,-0.00:21.05
-chr1	3496357	rs2794320	A	G	629.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.59;MQ0=0;OQ=2197.16;QD=34.88;SB=-1063.87	GT:AD:DP:GL:GQ	1/1:0,63:62:-223.32,-18.67,-0.02:99
-chr1	3497672	rs12138013	G	A	514.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1894.53;QD=36.43;SB=-916.70	GT:AD:DP:GL:GQ	1/1:0,52:50:-193.07,-15.07,-0.03:99
-chr1	3497721	rs4648527	G	A	5.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=5.91;MQ=58.60;MQ0=0;OQ=1808.59;QD=36.17;SB=-904.68	GT:AD:DP:GL:GQ	1/1:0,50:47:-184.46,-14.16,-0.02:99
-chr1	3497811	rs4233026	A	G	453.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=985.33;QD=29.86;SB=-500.18	GT:AD:DP:GL:GQ	1/1:0,33:33:-102.16,-9.96,-0.04:99
-chr1	3499530	rs10909980	C	T	12.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.36;MQ0=0;OQ=831.01;QD=36.13;SB=-270.86	GT:AD:DP:GL:GQ	1/1:0,23:22:-86.69,-6.63,-0.01:66.21
-chr1	3501794	rs7513275	A	G	98.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=60.00;MQ0=0;OQ=215.59;QD=10.78;SB=-81.80	GT:AD:DP:GL:GQ	0/1:7,13:17:-29.97,-5.13,-27.54:99
-chr1	3502201	rs2794327	C	T	251.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=60.00;MQ0=0;OQ=1770.81;QD=37.68;SB=-842.63	GT:AD:DP:GL:GQ	1/1:0,47:45:-180.68,-13.55,-0.01:99
-chr1	3502376	rs2821025	T	C	189.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=58.06;MQ0=0;OQ=1399.30;QD=34.13;SB=-531.22	GT:AD:DP:GL:GQ	1/1:1,40:40:-143.53,-12.05,-0.02:99
-chr1	3502406	rs2821024	G	A	10.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.84;MQ=59.12;MQ0=0;OQ=1381.75;QD=37.34;SB=-602.98	GT:AD:DP:GL:GQ	1/1:0,37:36:-141.77,-10.85,-0.01:99
-chr1	3502660	rs2821023	T	C	164.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=55.31;MQ0=0;OQ=631.91;QD=27.47;SB=-134.71	GT:AD:DP:GL:GQ	1/1:0,23:22:-66.81,-6.64,-0.03:66.13
-chr1	3503040	rs3001104	T	C	11.75	LowQual	AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=3;HaplotypeScore=0.89;MQ=53.43;MQ0=0;QD=0.90;SB=-7.00	GT:AD:DP:GL:GQ	0/1:11,2:9:-7.15,-2.72,-25.40:44.29
-chr1	3503107	rs6697282	T	C	2.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=57.92;MQ0=0;OQ=303.24;QD=27.57;SB=-40.95	GT:AD:DP:GL:GQ	1/1:0,11:10:-33.91,-3.01,-0.00:30.08
-chr1	3503479	rs55936822	G	A	66.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=385.29;QD=13.76;SB=-81.58	GT:AD:DP:GL:GQ	0/1:14,14:27:-49.96,-8.15,-41.31:99
-chr1	3504130	rs3001107	A	T	92.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=60.00;MQ0=0;OQ=1158.27;QD=35.10;SB=-515.45	GT:AD:DP:GL:GQ	1/1:0,33:32:-119.42,-9.64,-0.01:96.30
-chr1	3504221	rs2995006	A	G	438.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=1363.50;QD=34.96;SB=-648.28	GT:AD:DP:GL:GQ	1/1:0,39:39:-139.95,-11.75,-0.02:99
-chr1	3504611	rs6701230	T	C	61.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=1071.54;QD=26.79;SB=-482.12	GT:AD:DP:GL:GQ	1/1:0,40:34:-110.77,-10.26,-0.03:99
-chr1	3505152	.	C	G	6.95	PASS	AC=2;AF=1.00;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=54.64;MQ0=0;OQ=215.54;QD=15.40;SB=-56.93	GT:AD:DP:GL:GQ	1/1:2,12:6:-25.13,-1.81,-0.00:18.06
-chr1	3505256	rs2794328	C	A	31.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.33;MQ0=0;OQ=824.44;QD=29.44;SB=-191.27	GT:AD:DP:GL:GQ	1/1:1,27:24:-86.04,-7.23,-0.01:72.19
-chr1	3505590	rs2821011	T	C	3.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=58.95;MQ0=0;OQ=1307.30;QD=29.71;SB=-329.39	GT:AD:DP:GL:GQ	1/1:0,44:40:-134.34,-12.06,-0.03:99
-chr1	3506096	rs4648395	G	A	428.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.73;MQ0=0;OQ=1105.43;QD=35.66;SB=-453.34	GT:AD:DP:GL:GQ	1/1:0,31:29:-114.14,-8.74,-0.01:87.28
-chr1	3506280	rs7552280	C	T	597.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1498.57;QD=38.42;SB=-699.42	GT:AD:DP:GL:GQ	1/1:0,39:38:-153.45,-11.45,-0.01:99
-chr1	3506640	rs4018202	C	T	591.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.53;MQ0=0;OQ=1796.97;QD=36.67;SB=-852.00	GT:AD:DP:GL:GQ	1/1:0,49:46:-183.30,-13.86,-0.02:99
-chr1	3507139	rs4648528	C	T	150.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=58.89;MQ0=0;OQ=1470.55;QD=35.01;SB=-673.24	GT:AD:DP:GL:GQ	1/1:0,42:39:-150.66,-11.76,-0.02:99
-chr1	3507337	rs61373700	C	G	106.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.76;MQ=57.26;MQ0=0;OQ=1716.27;QD=39.91;SB=-832.44	GT:AD:DP:GL:GQ	1/1:1,42:42:-175.24,-12.66,-0.02:99
-chr1	3507396	rs6693958	G	A	63.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=58.29;MQ0=0;OQ=1559.78;QD=38.04;SB=-721.97	GT:AD:DP:GL:GQ	1/1:0,41:40:-159.58,-12.05,-0.01:99
-chr1	3507433	rs59013990	G	C	40.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=59.41;MQ0=0;OQ=1114.70;QD=28.58;SB=-265.33	GT:AD:DP:GL:GQ	1/1:0,38:29:-115.08,-8.75,-0.02:87.28
-chr1	3508244	rs2821012	T	C	433.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.32;MQ0=0;OQ=981.44;QD=28.87;SB=-510.19	GT:AD:DP:GL:GQ	1/1:0,34:32:-101.76,-9.65,-0.03:96.21
-chr1	3508275	rs12410528	G	A	77.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=59.32;MQ0=0;OQ=639.66;QD=18.81;SB=-281.31	GT:AD:DP:GL:GQ	0/1:14,20:31:-76.59,-9.34,-39.32:99
-chr1	3508279	rs12401505	C	T	12.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=2.61;MQ=59.32;MQ0=0;OQ=621.28;QD=18.27;SB=-279.19	GT:AD:DP:GL:GQ	0/1:14,19:31:-74.75,-9.34,-43.77:99
-chr1	3508347	rs56770023	C	T	305.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.60;MQ0=0;OQ=1098.04;QD=36.60;SB=-308.27	GT:AD:DP:GL:GQ	1/1:0,30:29:-113.40,-8.74,-0.01:87.27
-chr1	3508348	rs60957843	A	G	332.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=996.70;QD=34.37;SB=-270.42	GT:AD:DP:GL:GQ	1/1:0,29:29:-103.27,-8.74,-0.01:87.25
-chr1	3508499	rs2821013	C	A	29.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=4.32;MQ=59.05;MQ0=0;OQ=1719.86;QD=35.10;SB=-757.10	GT:AD:DP:GL:GQ	1/1:0,49:47:-175.58,-14.15,-0.01:99
-chr1	3508603	rs7514061	C	T	105.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.33;MQ0=0;OQ=1426.84;QD=33.97;SB=-607.00	GT:AD:DP:GL:GQ	1/1:0,42:38:-146.28,-11.45,-0.02:99
-chr1	3508717	rs2821014	A	C	0.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=3;HaplotypeScore=1.13;MQ=59.42;MQ0=0;OQ=907.74;QD=22.69;SB=-295.54	GT:AD:DP:GL:GQ	1/1:0,37:28:-94.37,-8.43,-0.01:84.22
-chr1	3508804	rs7521546	T	C	5.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=2;HaplotypeScore=1.42;MQ=57.17;MQ0=0;OQ=713.23;QD=28.53;SB=-330.78	GT:AD:DP:GL:GQ	1/1:0,25:24:-74.93,-7.24,-0.02:72.16
-chr1	3509294	rs12024499	A	G	18.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=58.37;MQ0=0;OQ=1073.16;QD=24.96;SB=-338.38	GT:AD:DP:GL:GQ	1/1:0,43:37:-110.95,-11.17,-0.05:99
-chr1	3509463	rs12025426	T	C	57.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=59.00;MQ0=0;OQ=1068.56;QD=25.44;SB=-559.52	GT:AD:DP:GL:GQ	1/1:0,42:36:-110.49,-10.87,-0.05:99
-chr1	3509651	rs56328010	C	G	123.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.54;MQ=58.84;MQ0=0;OQ=608.86;QD=15.22;SB=-231.35	GT:AD:DP:GL:GQ	0/1:21,19:38:-75.63,-11.46,-87.10:99
-chr1	3509894	rs10752738	A	G	106.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=57.39;MQ0=0;OQ=1124.20;QD=31.23;SB=-480.45	GT:AD:DP:GL:GQ	1/1:0,36:33:-116.02,-9.94,-0.01:99
-chr1	3509987	rs2821015	T	C	88.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.95;MQ0=0;OQ=1023.67;QD=31.99;SB=-513.41	GT:AD:DP:GL:GQ	1/1:0,31:32:-108.71,-12.22,-2.76:94.68
-chr1	3510191	rs2794356	C	A	66.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=58.63;MQ0=0;OQ=1082.36;QD=31.83;SB=-352.40	GT:AD:DP:GL:GQ	1/1:0,34:33:-111.84,-9.95,-0.02:99
-chr1	3510399	rs2794355	C	T	148.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.22;MQ0=0;OQ=1723.81;QD=37.47;SB=-800.07	GT:AD:DP:GL:GQ	1/1:0,46:45:-175.99,-13.56,-0.02:99
-chr1	3510532	rs2821016	A	C	65.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.42;MQ0=0;OQ=868.96;QD=27.16;SB=-409.86	GT:AD:DP:GL:GQ	1/1:0,32:29:-90.51,-8.74,-0.03:87.13
-chr1	3511971	rs56140438	T	C	2680.91	Indel	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.68;MQ0=0;QD=34.82;SB=-1364.21	GT:AD:DP:GL:GQ	1/1:0,77:76:-271.70,-22.89,-0.02:99
-chr1	3513689	rs2794354	T	C	23.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=1.40;MQ=60.00;MQ0=0;OQ=1332.54;QD=30.29;SB=-459.40	GT:AD:DP:GL:GQ	1/1:0,44:41:-136.87,-12.36,-0.03:99
-chr1	3513757	rs2821018	T	C	1.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=4;HaplotypeScore=0.16;MQ=52.28;MQ0=0;OQ=1127.31;QD=32.21;SB=-555.88	GT:AD:DP:GL:GQ	1/1:0,35:33:-116.33,-9.94,-0.01:99
-chr1	3513776	rs2821019	A	C	16.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=3.24;MQ=52.84;MQ0=0;OQ=1256.82;QD=30.65;SB=-634.67	GT:AD:DP:GL:GQ	1/1:0,41:37:-129.29,-11.15,-0.02:99
-chr1	3513778	rs2821020	G	A	39.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=4.08;MQ=53.03;MQ0=0;OQ=1497.87;QD=35.66;SB=-772.68	GT:AD:DP:GL:GQ	1/1:0,42:39:-153.39,-11.75,-0.01:99
-chr1	3515181	rs2794353	G	C	0.02	FDRtranche1.00to2.00	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=5;HaplotypeScore=0.32;MQ=58.30;MQ0=0;OQ=1440.93;QD=40.03;SB=-600.98	GT:AD:DP:GL:GQ	1/1:0,36:34:-147.69,-10.24,-0.01:99
-chr1	3515467	rs36031771	G	A	114.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=1598.59;QD=36.33;SB=-811.32	GT:AD:DP:GL:GQ	1/1:0,44:42:-163.46,-12.66,-0.02:99
-chr1	3515500	rs34852522	G	A	546.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1591.31;QD=37.01;SB=-737.47	GT:AD:DP:GL:GQ	1/1:1,42:41:-162.73,-12.35,-0.01:99
-chr1	3515696	rs10909986	G	A	566.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.67;MQ0=0;OQ=1907.24;QD=38.92;SB=-905.69	GT:AD:DP:GL:GQ	1/1:0,49:48:-194.32,-14.46,-0.01:99
-chr1	3516250	rs12121341	A	G	86.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1093.76;QD=29.56;SB=-543.02	GT:AD:DP:GL:GQ	1/1:0,37:35:-112.99,-10.56,-0.03:99
-chr1	3518397	rs57902798	C	A	88.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.13;MQ0=0;OQ=809.40;QD=32.38;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,25:24:-84.53,-7.23,-0.01:72.21
-chr1	3518534	rs1539126	G	A	66.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=60.00;MQ0=0;OQ=1266.77;QD=36.19;SB=-476.64	GT:AD:DP:GL:GQ	1/1:0,34:33:-130.27,-9.94,-0.01:99
-chr1	3518701	rs2794326	T	C	149.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.07;MQ0=0;OQ=1658.37;QD=33.17;SB=-790.25	GT:AD:DP:GL:GQ	1/1:0,50:49:-169.45,-14.76,-0.03:99
-chr1	3519249	rs10909987	G	C	637.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=1866.21;QD=40.57;SB=-960.72	GT:AD:DP:GL:GQ	1/1:0,45:44:-190.22,-13.26,-0.01:99
-chr1	3521082	rs4648396	C	T	0.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=5;HaplotypeScore=1.32;MQ=59.36;MQ0=0;OQ=2285.23;QD=39.40;SB=-1043.37	GT:AD:DP:GL:GQ	1/1:0,58:57:-232.12,-17.17,-0.02:99
-chr1	3521301	rs4648397	T	C	39.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=59.20;MQ0=0;OQ=1821.49;QD=31.41;SB=-869.61	GT:AD:DP:GL:GQ	1/1:0,58:57:-185.78,-17.19,-0.04:99
-chr1	3521455	rs4648398	C	T	121.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.69;MQ=58.90;MQ0=0;OQ=2021.45;QD=34.26;SB=-686.93	GT:AD:DP:GL:GQ	1/1:0,59:53:-205.75,-15.97,-0.02:99
-chr1	3522563	rs6693192	A	G	270.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=513.63;QD=9.88;SB=-275.26	GT:AD:DP:GL:GQ	0/1:30,22:52:-70.32,-15.67,-121.33:99
-chr1	3522569	rs6678958	G	A	350.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=670.10;QD=13.14;SB=-343.79	GT:AD:DP:GL:GQ	0/1:29,22:51:-85.67,-15.38,-96.37:99
-chr1	3523424	rs55728961	C	A	42.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=240.49;QD=10.46;SB=-10.00	GT:AD:DP:GL:GQ	0/1:14,9:23:-34.26,-6.93,-47.21:99
-chr1	3523484	rs56385042	T	C	1.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=3;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=309.24;QD=11.89;SB=-6.99	GT:AD:DP:GL:GQ	0/1:12,14:26:-42.05,-7.84,-46.91:99
-chr1	3523847	rs10797404	T	C	200.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=602.56;QD=14.01;SB=-77.79	GT:AD:DP:GL:GQ	0/1:21,22:42:-76.19,-12.65,-81.56:99
-chr1	3524383	rs4648532	A	G	19.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=2.34;MQ=56.80;MQ0=0;OQ=354.98;QD=11.45;SB=-152.32	GT:AD:DP:GL:GQ	0/1:16,15:28:-47.22,-8.44,-59.85:99
-chr1	3524566	rs10909988	A	G	146.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=60.00;MQ0=0;OQ=306.09;QD=9.28;SB=-127.66	GT:AD:DP:GL:GQ	0/1:17,15:30:-42.93,-9.04,-69.22:99
-chr1	3524652	rs7522500	G	C	8.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=6.16;MQ=57.13;MQ0=0;OQ=583.92;QD=14.24;SB=-274.31	GT:AD:DP:GL:GQ	0/1:21,20:34:-71.93,-10.26,-66.25:99
-chr1	3524668	rs7522507	G	A	205.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.19;MQ=57.92;MQ0=0;OQ=639.63;QD=14.21;SB=-315.32	GT:AD:DP:GL:GQ	0/1:22,23:42:-79.91,-12.67,-66.98:99
-chr1	3525324	rs7538707	A	G	23.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=845.73;QD=19.67;SB=-223.67	GT:AD:DP:GL:GQ	0/1:16,27:42:-100.51,-12.65,-58.85:99
-chr1	3526188	rs4648533	G	A	210.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.95;MQ=59.62;MQ0=0;OQ=1070.40;QD=17.55;SB=-483.49	GT:AD:DP:GL:GQ	0/1:29,32:60:-128.41,-18.08,-91.39:99
-chr1	3526260	rs4648534	T	C	399.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.82;MQ0=0;OQ=652.36;QD=10.19;SB=-312.36	GT:AD:DP:GL:GQ	0/1:38,26:63:-87.50,-18.98,-151.40:99
-chr1	3526320	rs4648535	C	A	306.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=54.45;MQ0=1;OQ=780.07;QD=10.99;SB=-371.06	GT:AD:DP:GL:GQ	0/1:40,31:67:-101.47,-20.18,-141.37:99
-chr1	3526422	rs4648399	A	G	309.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.19;MQ0=0;OQ=1278.95;QD=17.52;SB=-632.97	GT:AD:DP:GL:GQ	0/1:30,43:71:-152.57,-21.39,-116.57:99
-chr1	3527222	rs4648400	A	G	9.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=7.73;MQ=57.63;MQ0=0;OQ=603.16;QD=10.40;SB=-310.07	GT:AD:DP:GL:GQ	0/1:32,26:56:-80.48,-16.88,-126.15:99
-chr1	3527718	rs4648401	A	G	74.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=2;HaplotypeScore=1.41;MQ=56.19;MQ0=0;OQ=587.94;QD=13.67;SB=-299.61	GT:AD:DP:GL:GQ	0/1:18,25:41:-74.44,-12.36,-73.19:99
-chr1	3528340	rs4400556	A	T	87.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=59.12;MQ0=0;OQ=994.97;QD=12.59;SB=-457.52	GT:AD:DP:GL:GQ	0/1:45,34:78:-126.28,-23.49,-166.80:99
-chr1	3528361	rs4364818	C	T	460.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=58.38;MQ0=0;OQ=945.91;QD=13.14;SB=-450.44	GT:AD:DP:GL:GQ	0/1:42,30:72:-119.57,-21.70,-148.80:99
-chr1	3528695	rs6424087	G	C	115.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=3.80;MQ=59.24;MQ0=0;OQ=909.93;QD=16.54;SB=-215.65	GT:AD:DP:GL:GQ	0/1:28,26:51:-109.65,-15.37,-108.54:99
-chr1	3528942	rs10909989	A	G	309.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.12;MQ=59.00;MQ0=0;OQ=981.47;QD=13.82;SB=-369.60	GT:AD:DP:GL:GQ	0/1:36,35:70:-122.52,-21.09,-148.98:99
-chr1	3529341	rs10909990	A	G	374.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=58.19;MQ0=0;OQ=916.10;QD=14.78;SB=-423.95	GT:AD:DP:GL:GQ	0/1:29,33:61:-113.27,-18.38,-114.82:99
-chr1	3529884	rs12757620	T	G	87.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=3;HaplotypeScore=2.04;MQ=59.45;MQ0=0;OQ=798.71;QD=11.75;SB=-349.72	GT:AD:DP:GL:GQ	0/1:29,39:61:-101.54,-18.38,-103.90:99
-chr1	3532172	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=4.52;MQ=58.17;MQ0=0;OQ=111.86;QD=2.19;SB=68.21	GT:AD:DP:GL:GQ	0/1:30,21:37:-25.62,-11.15,-96.21:99
-chr1	3535452	rs41315304	G	A	150.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.69;MQ=58.25;MQ0=0;OQ=1069.05;QD=16.70;SB=-525.75	GT:AD:DP:GL:GQ	0/1:32,32:63:-129.18,-18.99,-99.29:99
-chr1	3536795	rs2821007	G	A	330.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.23;MQ0=0;OQ=1047.23;QD=17.45;SB=-508.04	GT:AD:DP:GL:GQ	0/1:27,33:59:-125.78,-17.78,-94.59:99
-chr1	3537996	rs2760321	T	C	53.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=58.11;MQ0=0;OQ=916.84;QD=24.78;SB=-335.79	GT:AD:DP:GL:GQ	1/1:0,37:31:-95.30,-9.36,-0.04:93.19
-chr1	3538692	rs2760320	G	C	208.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=1.05;MQ=58.15;MQ0=0;OQ=946.49;QD=15.02;SB=-485.84	GT:AD:DP:GL:GQ	0/1:35,28:62:-116.63,-18.70,-140.41:99
-chr1	3540707	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=4;HaplotypeScore=6.24;MQ=58.05;MQ0=0;OQ=310.07;QD=8.61;SB=35.15	GT:AD:DP:GL:GQ	0/1:20,16:27:-42.43,-8.14,-74.49:99
-chr1	3542640	rs2821061	A	G	174.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.68;MQ=60.00;MQ0=0;OQ=519.03;QD=10.38;SB=-253.57	GT:AD:DP:GL:GQ	0/1:27,23:48:-69.65,-14.47,-105.26:99
-chr1	3543649	rs2821058	T	C	578.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.21;MQ0=0;OQ=1559.49;QD=29.42;SB=-616.98	GT:AD:DP:GL:GQ	1/1:0,53:50:-159.58,-15.08,-0.04:99
-chr1	3545730	rs2760318	T	G	276.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=500.47;QD=13.53;SB=-245.40	GT:AD:DP:GL:GQ	0/1:16,21:34:-63.58,-10.25,-53.36:99
-chr1	3546316	rs2760317	T	C	74.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=1.30;MQ=59.23;MQ0=0;OQ=365.54;QD=12.18;SB=-82.96	GT:AD:DP:GL:GQ	0/1:16,13:27:-47.97,-8.14,-53.97:99
-chr1	3546766	rs2821032	A	G	15.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=5.71;MQ=58.45;MQ0=0;OQ=501.73;QD=10.45;SB=-117.63	GT:AD:DP:GL:GQ	0/1:27,21:44:-66.72,-13.26,-92.65:99
-chr1	3546958	.	G	C	33.36	PASS	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=52.99;MQ0=1;OQ=414.27;QD=15.34;SB=-224.70	GT:AD:DP:GL:GQ	0/1:11,16:20:-50.74,-6.03,-33.52:99
-chr1	3550868	rs12408890	C	T	50.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=714.51;QD=21.65;SB=-10.00	GT:AD:DP:GL:GQ	0/1:11,22:31:-84.07,-9.34,-33.99:99
-chr1	3556431	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=2;HaplotypeScore=3.37;MQ=56.43;MQ0=0;OQ=64.63;QD=2.69;SB=26.11	GT:AD:DP:GL:GQ	0/1:20,4:17:-14.89,-5.14,-48.86:97.47
-chr1	3556566	rs2251098	G	A	89.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=58.00;MQ0=0;OQ=575.61;QD=16.45;SB=-81.09	GT:AD:DP:GL:GQ	0/1:16,19:34:-71.09,-10.24,-59.62:99
-chr1	3560743	rs6697769	C	T	108.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=2.77;MQ=59.11;MQ0=0;OQ=591.49;QD=14.08;SB=-304.84	GT:AD:DP:GL:GQ	0/1:21,21:39:-74.19,-11.76,-62.78:99
-chr1	3562592	rs10752739	A	G	278.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.27;MQ=56.42;MQ0=0;OQ=804.83;QD=14.63;SB=-300.66	GT:AD:DP:GL:GQ	0/1:25,30:50:-98.83,-15.07,-88.55:99
-chr1	3562634	rs2181484	A	G	237.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=59.09;MQ0=0;OQ=421.19;QD=9.16;SB=-138.88	GT:AD:DP:GL:GQ	0/1:25,21:41:-57.77,-12.36,-88.24:99
-chr1	3564279	rs9662739	T	A	199.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.11;MQ=58.99;MQ0=0;OQ=516.88;QD=11.24;SB=-252.67	GT:AD:DP:GL:GQ	0/1:26,19:44:-68.23,-13.26,-93.50:99
-chr1	3564280	rs9662052	C	A	196.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=58.99;MQ0=0;OQ=511.23;QD=11.11;SB=-234.91	GT:AD:DP:GL:GQ	0/1:27,19:44:-67.66,-13.26,-88.90:99
-chr1	3565050	rs2368543	T	C	86.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=1.56;MQ=57.97;MQ0=0;OQ=928.11;QD=12.89;SB=-445.02	GT:AD:DP:GL:GQ	0/1:38,33:71:-117.49,-21.39,-151.96:99
-chr1	3565471	rs4648544	C	T	133.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=3;HaplotypeScore=1.75;MQ=59.57;MQ0=0;OQ=791.33;QD=14.65;SB=-418.72	GT:AD:DP:GL:GQ	0/1:30,24:54:-98.68,-16.27,-109.24:99
-chr1	3565693	rs2208993	C	G	156.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=59.21;MQ0=0;OQ=372.36;QD=11.28;SB=-74.78	GT:AD:DP:GL:GQ	0/1:21,12:29:-49.27,-8.75,-66.40:99
-chr1	3565739	rs2208992	C	T	135.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=555.57;QD=16.34;SB=-208.21	GT:AD:DP:GL:GQ	0/1:17,17:34:-69.09,-10.25,-52.42:99
-chr1	3565920	rs2224718	T	C	463.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.60;MQ0=0;OQ=705.17;QD=14.10;SB=-316.42	GT:AD:DP:GL:GQ	0/1:24,26:48:-88.27,-14.47,-84.73:99
-chr1	3567181	rs4648545	A	G	559.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.78;MQ0=0;OQ=1256.11;QD=14.78;SB=-595.27	GT:AD:DP:GL:GQ	0/1:42,43:84:-154.20,-25.30,-171.31:99
-chr1	3568175	rs1885863	C	T	33.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.95;MQ0=0;OQ=503.58;QD=17.98;SB=-117.62	GT:AD:DP:GL:GQ	0/1:13,15:28:-62.07,-8.43,-48.10:99
-chr1	3569688	rs1885861	A	T	263.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=805.05;QD=14.38;SB=-228.60	GT:AD:DP:GL:GQ	0/1:30,26:55:-100.35,-16.57,-108.86:99
-chr1	3572104	rs6679556	T	A	168.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.18;MQ0=0;OQ=534.82;QD=14.07;SB=-147.78	GT:AD:DP:GL:GQ	0/1:19,19:35:-67.31,-10.54,-60.93:99
-chr1	3572105	rs6679560	T	G	310.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.18;MQ0=0;OQ=483.25;QD=12.72;SB=-122.88	GT:AD:DP:GL:GQ	0/1:19,19:35:-62.15,-10.55,-61.28:99
-chr1	3572847	rs1885860	T	C	202.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=55.65;MQ0=0;OQ=1537.12;QD=28.47;SB=-796.29	GT:AD:DP:GL:GQ	1/1:0,54:50:-157.34,-15.08,-0.05:99
-chr1	3573552	rs1885859	G	C	126.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=931.27;QD=19.81;SB=-452.38	GT:AD:DP:GL:GQ	0/1:21,26:45:-109.97,-13.56,-87.15:99
-chr1	3575442	rs3765694	G	A	29.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=58.20;MQ0=0;OQ=1425.18;QD=36.54;SB=-559.30	GT:AD:DP:GL:GQ	1/1:0,39:37:-146.12,-11.15,-0.01:99
-chr1	3575611	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=3;HaplotypeScore=1.74;MQ=57.17;MQ0=0;OQ=76.89;QD=3.08;SB=14.07	GT:AD:DP:GL:GQ	0/1:14,11:13:-14.90,-3.93,-34.07:99
-chr1	3576288	rs1009345	G	A	91.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=59.80;MQ0=0;OQ=1800.40;QD=39.14;SB=-661.66	GT:AD:DP:GL:GQ	1/1:0,46:46:-183.64,-13.86,-0.02:99
-chr1	3576560	rs6657895	G	A	60.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=4.17;MQ=59.27;MQ0=0;OQ=1276.11;QD=33.58;SB=-586.96	GT:AD:DP:GL:GQ	1/1:1,37:35:-131.22,-10.55,-0.02:99
-chr1	3577406	rs3765697	C	T	0.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=5.64;MQ=56.35;MQ0=0;OQ=1305.04;QD=33.46;SB=-441.58	GT:AD:DP:GL:GQ	1/1:0,39:35:-134.11,-10.55,-0.02:99
-chr1	3578761	rs3765700	G	C	611.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.19;MQ0=0;OQ=1985.98;QD=38.19;SB=-981.19	GT:AD:DP:GL:GQ	1/1:0,52:47:-202.21,-14.17,-0.02:99
-chr1	3578861	rs3765701	T	A	287.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.60;MQ0=0;OQ=1646.63;QD=35.03;SB=-839.93	GT:AD:DP:GL:GQ	1/1:0,47:46:-168.27,-13.86,-0.02:99
-chr1	3579831	rs56255778	C	A	326.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=59.60;MQ0=0;OQ=723.70;QD=12.70;SB=-343.37	GT:AD:DP:GL:GQ	0/1:30,27:51:-91.02,-15.37,-85.23:99
-chr1	3580285	rs6671482	G	A	126.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=1575.76;QD=35.81;SB=-662.31	GT:AD:DP:GL:GQ	1/1:1,43:41:-161.17,-12.35,-0.01:99
-chr1	3587189	.	C	T	94.68	PASS	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=58.81;MQ0=0;OQ=415.33;QD=10.65;SB=-200.88	GT:AD:DP:GL:GQ	0/1:25,14:37:-55.97,-11.16,-70.24:99
-chr1	3594672	rs12562573	G	A	160.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=59.53;MQ0=0;OQ=1829.37;QD=37.33;SB=-900.21	GT:AD:DP:GL:GQ	1/1:0,49:48:-186.54,-14.47,-0.02:99
-chr1	3594957	rs1885872	G	A	83.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.18;MQ=59.07;MQ0=0;OQ=1704.97;QD=37.89;SB=-859.63	GT:AD:DP:GL:GQ	1/1:0,45:44:-174.10,-13.26,-0.02:99
-chr1	3595447	rs1885870	G	C	563.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.58;MQ0=0;OQ=1514.49;QD=32.92;SB=-721.32	GT:AD:DP:GL:GQ	1/1:1,45:40:-155.08,-12.08,-0.04:99
-chr1	3596410	rs3765725	C	T	84.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.54;MQ0=0;OQ=1239.60;QD=30.23;SB=-472.10	GT:AD:DP:GL:GQ	1/1:0,41:33:-127.56,-9.95,-0.02:99
-chr1	3596486	rs3765727	G	A	208.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.62;MQ0=0;OQ=883.29;QD=18.03;SB=-364.54	GT:AD:DP:GL:GQ	0/1:22,27:47:-105.77,-14.16,-69.54:99
-chr1	3596710	rs3765728	G	A	119.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.63;MQ0=0;OQ=1974.23;QD=38.71;SB=-814.08	GT:AD:DP:GL:GQ	1/1:0,51:50:-201.02,-15.06,-0.01:99
-chr1	3597380	rs3765730	G	A	180.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.40;MQ0=0;OQ=530.99;QD=17.13;SB=-202.91	GT:AD:DP:GL:GQ	0/1:13,18:30:-65.42,-9.04,-41.88:99
-chr1	3597871	rs10732965	C	T	75.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=57.81;MQ0=0;OQ=940.44;QD=33.59;SB=-454.61	GT:AD:DP:GL:GQ	1/1:0,27:25:-97.64,-7.53,-0.01:75.24
-chr1	3598087	rs34868661	A	G	136.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=59.05;MQ0=0;OQ=432.49;QD=9.83;SB=-227.39	GT:AD:DP:GL:GQ	0/1:23,20:41:-58.89,-12.36,-89.12:99
-chr1	3598141	rs12126706	C	T	141.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.13;MQ0=0;OQ=455.42;QD=13.01;SB=-109.06	GT:AD:DP:GL:GQ	0/1:19,16:32:-58.47,-9.65,-57.68:99
-chr1	3598905	rs1078687	G	A	163.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=58.42;MQ0=0;OQ=1623.93;QD=33.83;SB=-687.95	GT:AD:DP:GL:GQ	1/1:0,47:43:-166.00,-12.96,-0.02:99
-chr1	3599033	rs879622	G	A	151.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.44;MQ0=0;OQ=684.79;QD=16.70;SB=-307.82	GT:AD:DP:GL:GQ	0/1:19,22:37:-82.91,-11.15,-57.20:99
-chr1	3599257	rs879621	C	A	346.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.17;MQ0=0;OQ=766.56;QD=13.69;SB=-343.33	GT:AD:DP:GL:GQ	0/1:29,27:55:-96.51,-16.57,-104.71:99
-chr1	3599783	rs2146660	A	G	32.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=3.25;MQ=57.85;MQ0=0;OQ=1704.59;QD=34.79;SB=-814.09	GT:AD:DP:GL:GQ	1/1:0,49:49:-174.06,-14.76,-0.02:99
-chr1	3600146	.	T	C	37.22	LowQual	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=2;HaplotypeScore=1.56;MQ=40.64;MQ0=2;QD=1.16;SB=-35.23	GT:AD:DP:GL:GQ	0/1:25,6:25:-14.54,-7.54,-78.76:70.05
-chr1	3600159	rs34095686	C	A	8.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=38.58;MQ0=3;OQ=139.88;QD=4.37;SB=-64.01	GT:AD:DP:GL:GQ	0/1:23,9:27:-25.41,-8.14,-69.86:99
-chr1	3600191	.	C	G	0.30	PASS	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=5.79;MQ=36.62;MQ0=7;OQ=200.47;QD=5.90;SB=-62.84	GT:AD:DP:GL:GQ	0/1:21,13:22:-29.96,-6.63,-63.33:99
-chr1	3600194	rs34612797	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=3;HaplotypeScore=5.12;MQ=34.72;MQ0=8;OQ=74.27;QD=2.12;SB=-16.93	GT:AD:DP:GL:GQ	0/1:24,11:20:-16.74,-6.03,-51.18:99
-chr1	3600242	.	C	T	27.02	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=7.00;MQ=31.01;MQ0=9;QD=0.82;SB=14.05	GT:AD:DP:GL:GQ	0/1:28,5:16:-10.81,-4.82,-45.03:59.85
-chr1	3600252	.	G	A	0.25	PASS	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=5.21;MQ=33.15;MQ0=7;OQ=119.84;QD=4.99;SB=-7.00	GT:AD:DP:GL:GQ	0/1:19,5:10:-18.28,-3.02,-16.17:99
-chr1	3600264	rs61762234	A	C	2.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=2;HaplotypeScore=2.09;MQ=34.74;MQ0=5;OQ=244.22;QD=13.57;SB=-10.00	GT:AD:DP:GL:GQ	1/1:4,14:8:-28.01,-2.41,-0.00:24.07
-chr1	3600309	.	C	A	44.81	LowQual	AC=2;AF=1.00;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=28.74;MQ0=1;QD=8.96;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,5:2:-7.89,-0.60,-0.00:6.02
-chr1	3600350	.	C	T	27.34	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=1;HaplotypeScore=4.81;MQ=17.75;MQ0=4;QD=2.28;SB=-31.62	GT:AD:DP:GL:GQ	0/1:8,4:3:-6.92,-0.91,-3.40:24.94
-chr1	3600367	rs35012159	G	C	33.49	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=10.16;MQ=14.95;MQ0=16;QD=0.93;SB=-40.88	GT:AD:DP:GL:GQ	0/1:29,7:6:-8.44,-1.81,-16.03:66.33
-chr1	3600427	.	C	T	85.30	DPFilter;HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=22.31;MQ=14.22;MQ0=48;QD=0.87;SB=11.05	GT:AD:DP:GL:GQ	0/1:88,10:24:-19.05,-7.24,-63.74:99
-chr1	3600428	.	G	A	105.38	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=22.15;MQ=14.50;MQ0=46;QD=1.12;SB=-26.63	GT:AD:DP:GL:GQ	0/1:84,9:25:-21.36,-7.54,-60.74:99
-chr1	3600437	.	G	C	161.98	HARD_TO_VALIDATE;SnpCluster	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=2;HaplotypeScore=28.11;MQ=14.54;MQ0=44;QD=1.78;SB=-27.40	GT:AD:DP:GL:GQ	0/1:81,9:25:-27.02,-7.53,-80.42:99
-chr1	3600440	.	A	C	23.09	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=2;HaplotypeScore=12.59;MQ=14.51;MQ0=44;QD=0.25;SB=-17.83	GT:AD:DP:GL:GQ	0/1:72,19:25:-13.12,-7.53,-77.67:55.91
-chr1	3600470	.	C	T	26.44	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=13.21;MQ=11.80;MQ0=28;QD=0.61;SB=2.03	GT:AD:DP:GL:GQ	0/1:41,2:8:-8.34,-2.41,-20.77:59.27
-chr1	3600475	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=2;HaplotypeScore=2.58;MQ=10.93;MQ0=23;OQ=89.38;QD=2.48;SB=-3.98	GT:AD:DP:GL:GQ	0/1:21,15:6:-14.03,-1.81,-7.79:59.84
-chr1	3600532	.	C	T	45.13	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=11.72;MQ0=9;QD=2.65;SB=-47.67	GT:AD:DP:GL:GQ	1/1:12,5:2:-7.92,-0.60,-0.00:6.02
-chr1	3600545	.	A	C	20.73	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=18.85;MQ0=10;QD=0.80;SB=-32.99	GT:AD:DP:GL:GQ	0/1:14,12:4:-6.56,-1.20,-7.53:53.53
-chr1	3600575	.	C	T	0.06	PASS	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=7.34;MQ=23.21;MQ0=9;OQ=164.83;QD=5.49;SB=-77.08	GT:AD:DP:GL:GQ	0/1:24,6:9:-22.48,-2.71,-11.26:85.52
-chr1	3600578	.	C	T	0.49	PASS	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=5.98;MQ=23.98;MQ0=9;OQ=197.36;QD=6.81;SB=-112.62	GT:AD:DP:GL:GQ	0/1:22,7:11:-26.34,-3.32,-14.46:99
-chr1	3600596	.	C	T	0.28	PASS	AC=2;AF=1.00;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=33.58;MQ0=0;OQ=353.36;QD=25.24;SB=-175.22	GT:AD:DP:GL:GQ	1/1:0,14:10:-38.92,-3.01,-0.01:30.09
-chr1	3600667	.	C	T	19.38	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=1;HaplotypeScore=14.09;MQ=16.96;MQ0=7;QD=1.08;SB=-29.64	GT:AD:DP:GL:GQ	0/1:14,4:7:-7.33,-2.11,-16.23:52.17
-chr1	3600709	.	C	T	32.48	PASS	AC=2;AF=1.00;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=3.31;MQ=14.75;MQ0=16;OQ=271.94;QD=8.77;SB=-129.00	GT:AD:DP:GL:GQ	1/1:10,20:8:-30.78,-2.41,-0.00:24.07
-chr1	3600734	.	C	A	11.22	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=2.94;MQ=17.16;MQ0=10;QD=0.59;SB=-7.00	GT:AD:DP:GL:GQ	0/1:17,2:6:-6.18,-1.81,-13.77:43.72
-chr1	3600738	.	C	T	23.24	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=1;HaplotypeScore=5.72;MQ=17.16;MQ0=10;QD=1.22;SB=-6.99	GT:AD:DP:GL:GQ	0/1:14,5:6:-7.41,-1.81,-13.10:56.06
-chr1	3600746	.	G	A	0.90	PASS	AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=5.14;MQ=19.46;MQ0=10;OQ=147.44;QD=6.70;SB=-47.55	GT:AD:DP:GL:GQ	0/1:6,16:6:-19.82,-1.81,-3.10:12.90
-chr1	3600943	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=1;HaplotypeScore=3.94;MQ=10.81;MQ0=18;OQ=79.37;QD=2.27;SB=-10.00	GT:AD:DP:GL:GQ	0/1:27,8:5:-12.73,-1.51,-3.55:20.36
-chr1	3600944	.	G	A	31.47	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=1;HaplotypeScore=3.94;MQ=10.97;MQ0=17;QD=0.93;SB=-10.00	GT:AD:DP:GL:GQ	0/1:32,2:5:-7.94,-1.51,-9.29:64.30
-chr1	3600955	.	C	T	29.25	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=3.80;MQ=11.72;MQ0=17;QD=0.91;SB=-10.00	GT:AD:DP:GL:GQ	0/1:25,7:6:-8.02,-1.81,-11.97:62.08
-chr1	3600968	.	A	C	27.28	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=2;HaplotypeScore=4.96;MQ=11.75;MQ0=20;QD=0.80;SB=-10.00	GT:AD:DP:GL:GQ	0/1:18,16:5:-7.52,-1.51,-9.32:60.10
-chr1	3601000	.	G	C	23.03	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=2;HaplotypeScore=12.60;MQ=11.01;MQ0=30;QD=0.46;SB=-6.99	GT:AD:DP:GL:GQ	0/1:44,6:9:-8.30,-2.71,-30.70:55.84
-chr1	3601003	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=15.11;MQ=12.05;MQ0=28;OQ=191.04;QD=3.75;SB=-6.99	GT:AD:DP:GL:GQ	0/1:28,23:11:-25.70,-3.31,-14.21:99
-chr1	3601025	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=13.71;MQ=14.27;MQ0=33;OQ=53.75;QD=0.96;SB=-3.99	GT:AD:DP:GL:GQ	0/1:46,9:10:-11.67,-3.01,-22.44:86.59
-chr1	3601070	rs36156048	C	G	0.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=10.95;MQ=20.17;MQ0=10;OQ=79.41;QD=3.18;SB=-46.45	GT:AD:DP:GL:GQ	0/1:14,11:6:-13.03,-1.81,-11.69:98.78
-chr1	3601096	.	G	A	20.37	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=8.03;MQ=17.90;MQ0=5;QD=1.20;SB=-27.52	GT:AD:DP:GL:GQ	0/1:13,3:5:-6.83,-1.51,-8.44:53.16
-chr1	3601143	.	A	C	0.18	PASS	AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=20.37;MQ0=7;OQ=150.35;QD=6.54;SB=-72.98	GT:AD:DP:GL:GQ	0/1:14,9:10:-21.33,-3.01,-13.91:99
-chr1	3601165	.	C	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=11.69;MQ=24.21;MQ0=10;OQ=173.39;QD=5.78;SB=-3.99	GT:AD:DP:GL:GQ	0/1:22,8:11:-23.94,-3.31,-15.90:99
-chr1	3601175	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=2;HaplotypeScore=35.74;MQ=29.63;MQ0=10;OQ=194.57;QD=4.75;SB=-123.70	GT:AD:DP:GL:GQ	0/1:27,14:21:-29.07,-6.33,-61.55:99
-chr1	3601178	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=2;HaplotypeScore=14.60;MQ=30.57;MQ0=8;OQ=427.34;QD=9.94;SB=-58.96	GT:AD:DP:GL:GQ	0/1:21,22:25:-53.55,-7.53,-34.82:99
-chr1	3601218	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=2;HaplotypeScore=16.31;MQ=41.71;MQ0=5;OQ=182.10;QD=2.43;SB=-33.64	GT:AD:DP:GL:GQ	0/1:61,14:63:-40.49,-19.00,-224.09:99
-chr1	3601225	rs12722819	A	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=3;HaplotypeScore=15.63;MQ=42.30;MQ0=5;OQ=524.29;QD=6.32;SB=-141.88	GT:AD:DP:GL:GQ	0/1:52,30:59:-73.50,-17.79,-124.07:99
-chr1	3601229	rs12727450	T	C	0.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=3;HaplotypeScore=5.92;MQ=43.45;MQ0=6;OQ=762.30;QD=9.07;SB=-332.31	GT:AD:DP:GL:GQ	0/1:49,35:67:-99.71,-20.19,-147.26:99
-chr1	3601341	rs12239528	C	T	0.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.01;HRun=0;HaplotypeScore=14.56;MQ=44.93;MQ0=17;OQ=62.54;QD=0.70;SB=44.13	GT:AD:DP:GL:GQ	0/1:79,8:62:-27.92,-18.38,-184.40:95.37
-chr1	3601342	rs11581562	G	A	0.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.01;HRun=0;HaplotypeScore=14.40;MQ=44.68;MQ0=18;OQ=819.35;QD=9.10;SB=-177.16	GT:AD:DP:GL:GQ	0/1:53,33:59:-102.70,-17.49,-103.40:99
-chr1	3601389	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=2;HaplotypeScore=7.82;MQ=44.29;MQ0=18;OQ=186.02;QD=2.30;SB=-61.02	GT:AD:DP:GL:GQ	0/1:62,19:52:-37.55,-15.67,-142.29:99
-chr1	3601457	rs10910012	A	G	122.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=54.59;MQ0=0;OQ=1506.74;QD=29.54;SB=-756.93	GT:AD:DP:GL:GQ	1/1:0,51:48:-154.31,-14.48,-0.05:99
-chr1	3601752	rs3765731	G	A	361.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=59.28;MQ0=0;OQ=1001.62;QD=15.65;SB=-488.04	GT:AD:DP:GL:GQ	0/1:31,33:59:-121.23,-17.79,-88.90:99
-chr1	3601820	rs3765732	G	A	2.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=5.00;MQ=59.03;MQ0=0;OQ=1613.11;QD=33.61;SB=-476.00	GT:AD:DP:GL:GQ	1/1:0,46:44:-167.13,-15.44,-2.23:99
-chr1	3602293	rs1885869	T	C	376.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1214.50;QD=32.82;SB=-519.18	GT:AD:DP:GL:GQ	1/1:0,37:35:-125.05,-10.54,-0.02:99
-chr1	3603630	rs10910013	C	T	111.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.47;MQ0=0;OQ=534.95;QD=15.28;SB=-205.85	GT:AD:DP:GL:GQ	0/1:18,17:34:-67.02,-10.25,-59.55:99
-chr1	3603781	rs35837097	A	G	62.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=1.60;MQ=59.60;MQ0=0;OQ=546.71;QD=11.63;SB=-279.27	GT:AD:DP:GL:GQ	0/1:23,24:43:-70.92,-12.96,-83.70:99
-chr1	3605288	rs11580811	G	A	73.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.02;MQ=59.17;MQ0=0;OQ=263.75;QD=9.42;SB=-51.00	GT:AD:DP:GL:GQ	0/1:17,11:22:-36.29,-6.63,-43.95:99
-chr1	3606461	rs3765736	C	T	194.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=57.38;MQ0=0;OQ=406.81;QD=15.07;SB=-214.90	GT:AD:DP:GL:GQ	0/1:13,14:23:-50.90,-6.93,-35.03:99
-chr1	3606652	rs3765737	A	G	468.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=799.22;QD=12.89;SB=-323.13	GT:AD:DP:GL:GQ	0/1:30,32:60:-101.29,-18.08,-117.49:99
-chr1	3606658	rs3765738	G	A	253.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=58.79;MQ0=0;OQ=935.05;QD=15.08;SB=-404.78	GT:AD:DP:GL:GQ	0/1:33,29:61:-115.17,-18.38,-103.51:99
-chr1	3606835	rs4610947	C	A	292.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.39;MQ0=0;OQ=957.03;QD=17.09;SB=-493.95	GT:AD:DP:GL:GQ	0/1:24,31:55:-115.55,-16.56,-86.20:99
-chr1	3606979	rs4378145	G	A	258.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=57.58;MQ0=5;OQ=1287.24;QD=16.29;SB=-484.49	GT:AD:DP:GL:GQ	0/1:40,39:72:-153.70,-21.69,-124.59:99
-chr1	3607481	rs3765739	A	G	35.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=2.69;MQ=56.52;MQ0=0;OQ=316.46;QD=9.31;SB=-99.71	GT:AD:DP:GL:GQ	0/1:16,18:27:-43.07,-8.14,-49.38:99
-chr1	3608425	rs3819959	T	C	21.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=2.02;MQ=53.67;MQ0=0;OQ=372.33;QD=9.08;SB=-195.61	GT:AD:DP:GL:GQ	0/1:23,18:34:-50.76,-10.24,-80.92:99
-chr1	3608574	rs3765740	T	G	43.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=2;HaplotypeScore=1.03;MQ=59.11;MQ0=0;OQ=373.92;QD=14.38;SB=-208.83	GT:AD:DP:GL:GQ	0/1:12,14:26:-48.51,-7.83,-42.30:99
-chr1	3608643	rs3765741	A	G	139.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.25;MQ0=0;OQ=277.44;QD=11.10;SB=-3.99	GT:AD:DP:GL:GQ	0/1:13,12:23:-37.96,-6.93,-45.69:99
-chr1	3608686	rs3765742	G	A	11.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=299.52;QD=14.98;SB=-7.00	GT:AD:DP:GL:GQ	0/1:9,11:19:-38.96,-5.72,-31.25:99
-chr1	3608969	rs3765743	C	T	17.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=315.53;QD=15.78;SB=-3.99	GT:AD:DP:GL:GQ	0/1:10,10:19:-40.56,-5.72,-31.07:99
-chr1	3609567	rs4648550	T	A	206.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.98;MQ0=0;OQ=1535.78;QD=37.46;SB=-673.01	GT:AD:DP:GL:GQ	1/1:0,41:41:-157.17,-12.35,-0.01:99
-chr1	3609807	rs34881405	T	C	7.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=0.49;MQ=57.54;MQ0=0;OQ=345.64;QD=7.86;SB=-128.25	GT:AD:DP:GL:GQ	0/1:24,20:40:-49.91,-12.06,-96.00:99
-chr1	3610040	rs17379833	A	T	163.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=59.52;MQ0=0;OQ=999.11;QD=20.81;SB=-480.53	GT:AD:DP:GL:GQ	0/1:16,32:47:-117.35,-14.16,-58.41:99
-chr1	3610295	rs12742969	A	G	136.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=514.16;QD=10.49;SB=-277.41	GT:AD:DP:GL:GQ	0/1:28,21:47:-68.86,-14.16,-115.22:99
-chr1	3610320	rs12735439	C	A	230.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=60.00;MQ0=0;OQ=801.03;QD=16.35;SB=-378.77	GT:AD:DP:GL:GQ	0/1:22,27:48:-97.85,-14.46,-70.21:99
-chr1	3611339	rs3765749	A	T	129.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=60.00;MQ0=0;OQ=640.71;QD=17.32;SB=-252.96	GT:AD:DP:GL:GQ	0/1:16,21:36:-78.20,-10.84,-56.57:99
-chr1	3612044	rs3765751	A	G	0.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=6.05;MQ=58.84;MQ0=0;OQ=1141.41;QD=28.54;SB=-361.32	GT:AD:DP:GL:GQ	1/1:0,39:37:-117.76,-11.16,-0.04:99
-chr1	3612141	rs3765752	G	A	98.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.42;MQ0=0;OQ=790.33;QD=19.76;SB=-403.21	GT:AD:DP:GL:GQ	0/1:16,24:40:-94.37,-12.05,-52.81:99
-chr1	3612166	rs3765753	T	G	307.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=1135.84;QD=31.55;SB=-218.90	GT:AD:DP:GL:GQ	1/1:0,36:34:-117.19,-10.25,-0.02:99
-chr1	3612496	rs12086279	A	T	144.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=53.76;MQ0=0;OQ=264.24;QD=12.01;SB=-145.87	GT:AD:DP:GL:GQ	0/1:12,10:20:-35.73,-6.03,-37.15:99
-chr1	3612742	rs56124535	A	G	117.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=57.14;MQ0=0;OQ=143.16;QD=7.53;SB=-61.32	GT:AD:DP:GL:GQ	0/1:9,9:16:-22.43,-4.83,-33.66:99
-chr1	3612752	rs55976062	T	C	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=2;HaplotypeScore=16.88;MQ=55.46;MQ0=1;OQ=130.66;QD=6.88;SB=-60.86	GT:AD:DP:GL:GQ	0/1:11,8:16:-21.17,-4.82,-37.90:99
-chr1	3612857	rs10910014	T	C	4.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.85;MQ=45.10;MQ0=1;OQ=122.28;QD=3.82;SB=-65.87	GT:AD:DP:GL:GQ	0/1:18,14:19:-21.24,-5.73,-45.71:99
-chr1	3612894	rs58140697	A	G	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=4;HaplotypeScore=5.46;MQ=58.05;MQ0=0;OQ=210.19;QD=8.76;SB=-118.71	GT:AD:DP:GL:GQ	0/1:15,9:22:-30.93,-6.63,-52.73:99
-chr1	3612902	rs60071664	T	C	130.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=57.06;MQ0=0;OQ=194.42;QD=7.48;SB=-106.60	GT:AD:DP:GL:GQ	0/1:16,10:25:-30.26,-7.53,-62.36:99
-chr1	3613185	rs12564843	G	C	7.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=1.11;MQ=53.89;MQ0=0;OQ=1382.10;QD=38.39;SB=-571.48	GT:AD:DP:GL:GQ	1/1:0,36:33:-141.81,-9.95,-0.02:99
-chr1	3613274	rs9786966	A	G	67.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.62;MQ=57.45;MQ0=0;OQ=414.03;QD=10.62;SB=-167.59	GT:AD:DP:GL:GQ	0/1:21,18:36:-55.53,-10.85,-77.07:99
-chr1	3613481	rs55657548	C	T	77.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=58.92;MQ0=0;OQ=252.32;QD=6.47;SB=-105.49	GT:AD:DP:GL:GQ	0/1:27,11:38:-39.97,-11.45,-93.41:99
-chr1	3614769	rs10910016	G	A	258.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=59.57;MQ0=0;OQ=815.07;QD=15.09;SB=-428.45	GT:AD:DP:GL:GQ	0/1:27,26:50:-99.87,-15.07,-79.93:99
-chr1	3615542	rs3765755	G	C	6.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=2;HaplotypeScore=3.76;MQ=57.56;MQ0=0;OQ=289.35;QD=10.72;SB=-124.51	GT:AD:DP:GL:GQ	0/1:17,10:20:-38.26,-6.05,-38.86:99
-chr1	3615628	rs2368540	G	A	45.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=57.64;MQ0=0;OQ=1334.80;QD=39.26;SB=-676.69	GT:AD:DP:GL:GQ	1/1:0,34:34:-137.07,-10.24,-0.01:99
-chr1	3615736	rs2368539	G	A	82.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.19;MQ=58.99;MQ0=0;OQ=1720.73;QD=37.41;SB=-824.61	GT:AD:DP:GL:GQ	1/1:0,46:45:-175.68,-13.56,-0.02:99
-chr1	3616028	rs12130809	G	A	272.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=838.34;QD=17.11;SB=-389.14	GT:AD:DP:GL:GQ	0/1:23,26:48:-101.58,-14.46,-75.57:99
-chr1	3616588	rs3753208	C	T	1.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=2.44;MQ=57.64;MQ0=0;OQ=539.82;QD=20.76;SB=-254.78	GT:AD:DP:GL:GQ	0/1:9,17:24:-64.50,-7.23,-25.72:99
-chr1	3616624	rs3753209	G	A	11.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=58.89;MQ0=0;OQ=522.74;QD=24.89;SB=-281.33	GT:AD:DP:GL:GQ	0/1:4,17:19:-61.28,-5.73,-9.34:36.13
-chr1	3618071	rs3819961	T	C	130.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=2.02;MQ=59.30;MQ0=0;OQ=302.64;QD=9.17;SB=-168.93	GT:AD:DP:GL:GQ	0/1:19,14:29:-42.29,-8.74,-60.25:99
-chr1	3618163	rs3819962	C	T	161.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.36;MQ0=0;OQ=457.21;QD=12.70;SB=-166.18	GT:AD:DP:GL:GQ	0/1:20,16:35:-59.55,-10.55,-68.25:99
-chr1	3618201	rs3819963	C	T	122.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=60.00;MQ0=0;OQ=469.25;QD=9.98;SB=-160.23	GT:AD:DP:GL:GQ	0/1:28,19:40:-62.27,-12.06,-77.68:99
-chr1	3618523	rs6424089	A	G	234.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.55;MQ0=0;OQ=515.26;QD=10.10;SB=-135.54	GT:AD:DP:GL:GQ	0/1:28,23:50:-69.88,-15.07,-112.69:99
-chr1	3618537	rs6424090	A	G	547.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.83;MQ0=0;OQ=1664.50;QD=30.82;SB=-446.16	GT:AD:DP:GL:GQ	1/1:0,54:52:-170.07,-15.68,-0.04:99
-chr1	3619132	rs61568045	A	T	75.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=1.40;MQ=60.00;MQ0=0;OQ=702.41;QD=14.05;SB=-308.70	GT:AD:DP:GL:GQ	0/1:27,23:49:-88.29,-14.76,-94.54:99
-chr1	3619452	rs3765758	A	G	47.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.30;MQ0=0;OQ=878.57;QD=26.62;SB=-355.42	GT:AD:DP:GL:GQ	1/1:0,33:30:-91.48,-9.06,-0.04:90.16
-chr1	3620336	rs3765761	C	T	430.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.64;MQ0=0;OQ=893.13;QD=17.18;SB=-472.49	GT:AD:DP:GL:GQ	0/1:25,27:51:-107.96,-15.36,-81.84:99
-chr1	3620975	rs3765763	C	A	252.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.39;MQ0=0;OQ=502.24;QD=13.22;SB=-232.36	GT:AD:DP:GL:GQ	0/1:20,18:37:-64.65,-11.14,-68.16:99
-chr1	3621759	rs61759267	C	T	206.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=58.40;MQ0=0;OQ=667.68;QD=16.28;SB=-326.34	GT:AD:DP:GL:GQ	0/1:19,22:40:-82.11,-12.06,-61.46:99
-chr1	3622468	rs3753211	T	C	35.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=6.67;MQ=58.45;MQ0=0;OQ=511.74;QD=11.37;SB=-197.62	GT:AD:DP:GL:GQ	0/1:23,22:42:-67.14,-12.68,-73.45:99
-chr1	3622590	rs4648551	G	A	13.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=8.04;MQ=59.11;MQ0=0;OQ=881.37;QD=14.94;SB=-385.40	GT:AD:DP:GL:GQ	0/1:30,29:55:-108.00,-16.58,-90.70:99
-chr1	3623397	rs3765764	G	A	5.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=59.59;MQ0=0;OQ=1699.76;QD=37.77;SB=-349.25	GT:AD:DP:GL:GQ	1/1:0,44:44:-176.03,-15.59,-2.47:99
-chr1	3624319	rs3765765	C	A	38.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=752.18;QD=20.33;SB=-184.22	GT:AD:DP:GL:GQ	0/1:13,24:36:-89.34,-10.84,-42.24:99
-chr1	3624520	rs3765766	T	C	10.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=2;HaplotypeScore=2.32;MQ=58.08;MQ0=0;OQ=679.70;QD=30.90;SB=-324.14	GT:AD:DP:GL:GQ	1/1:0,22:21:-71.57,-6.33,-0.02:63.16
-chr1	3625325	rs3765767	G	C	128.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=59.30;MQ0=0;OQ=648.42;QD=19.65;SB=-303.36	GT:AD:DP:GL:GQ	0/1:15,18:33:-78.07,-9.95,-65.85:99
-chr1	3625451	rs3765768	C	T	99.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=57.87;MQ0=0;OQ=372.64;QD=16.94;SB=-111.62	GT:AD:DP:GL:GQ	0/1:9,13:20:-46.58,-6.03,-24.55:99
-chr1	3625480	rs3819968	G	T	164.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.32;MQ0=0;OQ=519.45;QD=15.28;SB=-228.94	GT:AD:DP:GL:GQ	0/1:15,19:32:-64.87,-9.64,-47.62:99
-chr1	3627107	rs3765771	G	C	208.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.53;MQ0=0;OQ=1861.37;QD=37.99;SB=-769.21	GT:AD:DP:GL:GQ	1/1:0,49:48:-189.76,-14.49,-0.04:99
-chr1	3627319	rs12731705	C	T	198.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.16;MQ0=0;OQ=1887.80;QD=37.76;SB=-826.61	GT:AD:DP:GL:GQ	1/1:0,50:48:-192.38,-14.46,-0.01:99
-chr1	3627473	rs2146658	T	G	374.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.91;MQ0=0;OQ=603.03;QD=10.05;SB=-295.81	GT:AD:DP:GL:GQ	0/1:35,25:58:-81.06,-17.47,-122.08:99
-chr1	3627672	rs2181487	C	A	40.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=4.14;MQ=58.10;MQ0=0;OQ=433.83;QD=7.35;SB=-156.52	GT:AD:DP:GL:GQ	0/1:34,22:49:-61.43,-14.77,-105.52:99
-chr1	3628534	rs1801174	C	T	158.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=59.66;MQ0=0;OQ=2550.78;QD=38.07;SB=-965.29	GT:AD:DP:GL:GQ	1/1:0,67:65:-258.68,-19.58,-0.02:99
-chr1	3628694	rs12737840	C	T	176.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.52;MQ=58.05;MQ0=0;OQ=694.01;QD=14.46;SB=-295.84	GT:AD:DP:GL:GQ	0/1:22,26:42:-85.35,-12.67,-62.54:99
-chr1	3629503	rs4648552	T	C	338.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=1294.39;QD=30.10;SB=-605.94	GT:AD:DP:GL:GQ	1/1:0,43:41:-133.06,-12.37,-0.04:99
-chr1	3629584	rs7537335	G	A	0.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=6.65;MQ=58.30;MQ0=0;OQ=677.32;QD=21.85;SB=-284.30	GT:AD:DP:GL:GQ	0/1:10,21:29:-79.75,-8.74,-30.01:99
-chr1	3629945	rs6424091	C	G	0.03	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=5;HaplotypeScore=2.31;MQ=58.54;MQ0=0;OQ=1470.54;QD=38.70;SB=-622.99	GT:AD:DP:GL:GQ	1/1:0,38:35:-150.65,-10.55,-0.01:99
-chr1	3630886	rs6687491	G	A	255.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.48;MQ0=0;OQ=516.42;QD=12.91;SB=-227.77	GT:AD:DP:GL:GQ	0/1:22,18:36:-65.79,-10.86,-57.81:99
-chr1	3630983	rs6701784	A	C	437.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=1276.86;QD=28.37;SB=-579.85	GT:AD:DP:GL:GQ	1/1:0,45:42:-131.31,-12.66,-0.04:99
-chr1	3632013	rs34178965	G	C	41.74	LowQual	AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;QD=13.91;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,3:2:-7.58,-0.60,-0.00:6.02
-chr1	3632108	.	A	G	92.54	PASS	AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.46;MQ0=0;OQ=246.19;QD=30.77;SB=-85.92	GT:AD:DP:GL:GQ	1/1:0,8:8:-28.20,-2.41,-0.00:24.07
-chr1	3633787	rs2296031	A	G	6.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=452.89;QD=19.69;SB=-150.34	GT:AD:DP:GL:GQ	0/1:6,16:22:-55.20,-6.63,-22.30:99
-chr1	3634209	rs2181486	A	G	1.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=4;HaplotypeScore=1.69;MQ=58.39;MQ0=0;OQ=887.40;QD=30.60;SB=-422.16	GT:AD:DP:GL:GQ	1/1:0,29:29:-92.36,-8.75,-0.03:87.19
-chr1	3634234	rs2146657	A	G	3.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=2.86;MQ=58.55;MQ0=0;OQ=912.28;QD=28.51;SB=-446.82	GT:AD:DP:GL:GQ	1/1:0,32:28:-94.83,-8.44,-0.02:84.21
-chr1	3634529	rs2236367	C	T	14.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=-0.18;MQ=58.05;MQ0=0;OQ=381.45;QD=15.89;SB=-87.90	GT:AD:DP:GL:GQ	0/1:11,13:23:-48.37,-6.94,-31.96:99
-chr1	3634665	rs2236366	A	G	76.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.83;MQ=58.92;MQ0=0;OQ=536.64;QD=13.76;SB=-250.32	GT:AD:DP:GL:GQ	0/1:16,23:35:-67.50,-10.56,-54.78:99
-chr1	3634718	rs2236365	G	C	250.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=58.69;MQ0=0;OQ=951.80;QD=19.04;SB=-496.24	GT:AD:DP:GL:GQ	0/1:20,30:47:-112.65,-14.19,-78.43:99
-chr1	3634912	rs12095248	A	G	50.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=529.65;QD=10.81;SB=-225.29	GT:AD:DP:GL:GQ	0/1:29,20:49:-71.01,-14.76,-117.85:99
-chr1	3635695	rs2254530	C	A	234.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=56.85;MQ0=0;OQ=701.30;QD=15.58;SB=-270.34	GT:AD:DP:GL:GQ	0/1:17,28:43:-86.38,-12.96,-55.17:99
-chr1	3635704	rs2096224	G	A	61.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.39;MQ0=0;OQ=843.06;QD=18.33;SB=-255.19	GT:AD:DP:GL:GQ	0/1:18,27:42:-100.25,-12.66,-49.65:99
-chr1	3635997	rs11589885	C	T	153.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.19;MQ=58.55;MQ0=0;OQ=582.90;QD=18.22;SB=-289.86	GT:AD:DP:GL:GQ	0/1:14,18:32:-71.22,-9.65,-43.73:99
-chr1	3636052	rs1885867	G	A	143.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=59.44;MQ0=0;OQ=1392.32;QD=33.96;SB=-648.62	GT:AD:DP:GL:GQ	1/1:1,40:37:-142.84,-11.16,-0.02:99
-chr1	3636074	rs1885866	T	C	394.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=1194.73;QD=27.15;SB=-580.01	GT:AD:DP:GL:GQ	1/1:0,44:39:-123.10,-11.76,-0.04:99
-chr1	3636151	rs1885865	G	A	33.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.52;MQ=59.03;MQ0=0;OQ=1851.65;QD=38.58;SB=-906.66	GT:AD:DP:GL:GQ	1/1:0,48:47:-188.76,-14.16,-0.01:99
-chr1	3637822	rs1745813	T	C	55.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=5.13;MQ=58.97;MQ0=0;OQ=680.74;QD=15.13;SB=-289.66	GT:AD:DP:GL:GQ	0/1:18,27:43:-84.33,-12.97,-62.63:99
-chr1	3638114	rs34661835	G	A	68.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=3.56;MQ=59.01;MQ0=0;OQ=1063.39;QD=15.19;SB=-366.89	GT:AD:DP:GL:GQ	0/1:37,33:66:-129.52,-19.90,-102.17:99
-chr1	3638739	rs4648553	G	A	223.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.68;MQ=58.64;MQ0=0;OQ=511.89;QD=10.66;SB=-215.18	GT:AD:DP:GL:GQ	0/1:26,22:40:-66.54,-12.07,-70.14:99
-chr1	3640958	rs1181869	C	T	138.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=782.45;QD=20.06;SB=-285.16	GT:AD:DP:GL:GQ	0/1:16,23:38:-92.98,-11.45,-54.47:99
-chr1	3640986	rs1181868	G	T	357.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=59.51;MQ0=0;OQ=742.19;QD=14.55;SB=-306.02	GT:AD:DP:GL:GQ	0/1:23,27:47:-91.66,-14.16,-72.26:99
-chr1	3641178	rs1181867	A	G	3.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=11.13;MQ=59.11;MQ0=0;OQ=463.08;QD=9.85;SB=-239.29	GT:AD:DP:GL:GQ	0/1:24,23:43:-62.56,-12.97,-88.46:99
-chr1	3642477	rs1047928	G	C	24.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=59.25;MQ0=0;OQ=1110.64;QD=19.83;SB=-354.44	GT:AD:DP:GL:GQ	0/1:25,31:54:-130.64,-16.30,-94.09:99
-chr1	3642678	rs61759293	G	A	143.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=59.59;MQ0=0;OQ=746.17;QD=16.22;SB=-262.29	GT:AD:DP:GL:GQ	0/1:23,23:46:-91.76,-13.86,-82.87:99
-chr1	3642682	rs9800	C	G	193.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.34;MQ=59.59;MQ0=0;OQ=608.81;QD=13.23;SB=-238.07	GT:AD:DP:GL:GQ	0/1:25,21:45:-77.74,-13.57,-107.75:99
-chr1	3643272	rs1181866	A	C	242.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=1714.13;QD=34.28;SB=-732.08	GT:AD:DP:GL:GQ	1/1:0,50:49:-175.01,-14.76,-0.02:99
-chr1	3643286	rs1181865	T	C	423.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1563.43;QD=32.57;SB=-664.24	GT:AD:DP:GL:GQ	1/1:0,48:46:-159.95,-13.86,-0.02:99
-chr1	3644050	rs1181864	A	G	156.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=57.94;MQ0=0;OQ=704.72;QD=10.36;SB=-357.09	GT:AD:DP:GL:GQ	0/1:38,30:68:-94.25,-20.50,-152.69:99
-chr1	3644355	rs41315308	C	T	206.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.64;MQ=57.86;MQ0=0;OQ=957.61;QD=14.96;SB=-405.80	GT:AD:DP:GL:GQ	0/1:34,30:63:-118.03,-18.99,-105.73:99
-chr1	3646184	rs1181863	T	C	89.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=57.04;MQ0=1;OQ=1725.96;QD=27.84;SB=-738.77	GT:AD:DP:GL:GQ	1/1:0,62:55:-176.23,-16.59,-0.05:99
-chr1	3647330	rs61339658	C	T	216.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.48;MQ0=0;OQ=622.56;QD=14.15;SB=-204.90	GT:AD:DP:GL:GQ	0/1:24,20:43:-78.50,-12.96,-75.30:99
-chr1	3647619	rs12117836	G	A	258.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=59.76;MQ0=0;OQ=3087.35;QD=39.58;SB=-1142.52	GT:AD:DP:GL:GQ	1/1:0,78:77:-312.34,-23.20,-0.02:99
-chr1	3647643	rs55704710	C	T	372.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1117.31;QD=14.14;SB=-441.41	GT:AD:DP:GL:GQ	0/1:44,35:79:-138.82,-23.81,-145.27:99
-chr1	3648097	rs10797409	G	A	267.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.27;MQ0=0;OQ=783.87;QD=15.37;SB=-396.73	GT:AD:DP:GL:GQ	0/1:26,25:51:-97.04,-15.37,-93.66:99
-chr1	3648630	rs12068191	T	C	36.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=59.42;MQ0=0;OQ=210.22;QD=6.57;SB=-113.63	GT:AD:DP:GL:GQ	0/1:20,12:30:-33.36,-9.05,-73.41:99
-chr1	3649517	rs2298222	G	A	272.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.08;MQ=58.64;MQ0=0;OQ=639.47;QD=13.32;SB=-210.21	GT:AD:DP:GL:GQ	0/1:28,20:45:-80.80,-13.57,-77.92:99
-chr1	3650201	rs10910020	A	G	239.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=60.00;MQ0=0;OQ=830.62;QD=14.32;SB=-256.96	GT:AD:DP:GL:GQ	0/1:22,36:55:-102.93,-16.58,-89.31:99
-chr1	3650655	rs61759295	C	T	319.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=56.32;MQ0=0;OQ=1049.42;QD=17.20;SB=-513.15	GT:AD:DP:GL:GQ	0/1:29,32:58:-125.70,-17.48,-89.86:99
-chr1	3650715	.	C	T	1.43	PASS	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=1;HaplotypeScore=2.94;MQ=58.05;MQ0=0;OQ=1053.29;QD=21.50;SB=-546.76	GT:AD:DP:GL:GQ	0/1:18,30:49:-126.44,-17.83,-68.95:99
-chr1	3650833	rs61759296	C	T	365.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=780.11;QD=18.14;SB=-365.90	GT:AD:DP:GL:GQ	0/1:18,25:43:-94.25,-12.96,-66.61:99
-chr1	3650834	rs61759297	A	G	444.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=732.78;QD=16.65;SB=-378.33	GT:AD:DP:GL:GQ	0/1:18,26:44:-89.82,-13.26,-70.47:99
-chr1	3651042	.	A	G	50.56	PASS	AC=2;AF=1.00;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.01;MQ0=0;OQ=2317.73;QD=30.50;SB=-942.03	GT:AD:DP:GL:GQ	1/1:0,76:75:-235.44,-22.63,-0.08:99
-chr1	3651109	.	A	G	1.79	PASS	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=5.08;MQ=56.71;MQ0=0;OQ=273.27;QD=7.01;SB=-125.50	GT:AD:DP:GL:GQ	0/1:24,15:37:-41.77,-11.16,-93.00:99
-chr1	3651611	rs61759298	C	T	14.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=6.20;MQ=59.36;MQ0=0;OQ=487.25;QD=13.53;SB=-201.22	GT:AD:DP:GL:GQ	0/1:19,17:31:-61.35,-9.34,-53.39:99
-chr1	3651666	rs61759299	G	A	290.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=58.58;MQ0=0;OQ=537.51;QD=11.69;SB=-229.48	GT:AD:DP:GL:GQ	0/1:28,18:45:-70.60,-13.56,-93.90:99
-chr1	3652705	rs3737589	A	G	232.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=1820.89;QD=33.11;SB=-644.31	GT:AD:DP:GL:GQ	1/1:0,55:53:-185.70,-15.97,-0.02:99
-chr1	3652806	.	C	A	30.45	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=2;HaplotypeScore=18.21;MQ=58.71;MQ0=0;QD=0.56;SB=77.26	GT:AD:DP:GL:GQ	0/1:38,16:41:-18.69,-12.36,-124.87:63.28
-chr1	3652917	rs3737590	A	T	248.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.59;MQ0=0;OQ=534.27;QD=11.87;SB=-180.50	GT:AD:DP:GL:GQ	0/1:25,20:43:-69.67,-12.96,-88.74:99
-chr1	3652988	rs3737591	G	A	355.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=743.37;QD=18.13;SB=-354.36	GT:AD:DP:GL:GQ	0/1:19,22:40:-89.67,-12.05,-59.56:99
-chr1	3653501	.	C	T	1.63	PASS	AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=1;HaplotypeScore=4.19;MQ=56.43;MQ0=0;OQ=295.19;QD=12.30;SB=-147.16	GT:AD:DP:GL:GQ	0/1:12,11:20:-38.83,-6.03,-35.51:99
-chr1	3654278	rs61759300	C	T	319.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=59.50;MQ0=0;OQ=838.34;QD=14.71;SB=-382.16	GT:AD:DP:GL:GQ	0/1:29,28:55:-103.70,-16.58,-94.60:99
-chr1	3654412	.	G	A	1.87	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=3.14;MQ=59.58;MQ0=0;OQ=1116.86;QD=20.31;SB=-482.46	GT:AD:DP:GL:GQ	0/1:23,32:54:-131.23,-16.26,-80.42:99
-chr1	3655727	rs12120656	G	T	277.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=59.16;MQ0=0;OQ=2493.88;QD=34.64;SB=-1022.51	GT:AD:DP:GL:GQ	1/1:0,71:69:-252.99,-20.78,-0.02:99
-chr1	3657359	rs61759301	C	A	268.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.18;MQ=59.56;MQ0=0;OQ=858.70;QD=16.20;SB=-443.00	GT:AD:DP:GL:GQ	0/1:24,29:52:-104.82,-15.66,-81.51:99
-chr1	3657864	rs4648554	T	C	343.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=57.67;MQ0=0;OQ=2306.57;QD=35.49;SB=-875.99	GT:AD:DP:GL:GQ	1/1:0,65:64:-234.26,-19.28,-0.02:99
-chr1	3658613	rs12128253	A	C	493.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=800.32;QD=17.40;SB=-351.83	GT:AD:DP:GL:GQ	0/1:19,27:46:-97.17,-13.85,-71.32:99
-chr1	3658641	rs12123850	G	T	445.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1182.07;QD=31.95;SB=-471.02	GT:AD:DP:GL:GQ	1/1:0,37:33:-121.80,-9.94,-0.01:99
-chr1	3659032	rs41315312	C	T	393.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.19;MQ0=0;OQ=747.09;QD=16.24;SB=-297.79	GT:AD:DP:GL:GQ	0/1:23,23:45:-91.55,-13.56,-71.39:99
-chr1	3659061	rs10797410	A	G	617.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1286.97;QD=30.64;SB=-659.94	GT:AD:DP:GL:GQ	1/1:0,42:41:-132.32,-12.36,-0.04:99
-chr1	3659065	rs10910021	C	G	483.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.53;MQ0=0;OQ=1547.05;QD=38.68;SB=-689.48	GT:AD:DP:GL:GQ	1/1:0,40:36:-158.30,-10.85,-0.01:99
-chr1	3659480	rs10797411	T	C	0.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=7.27;MQ=57.71;MQ0=0;OQ=1720.61;QD=33.09;SB=-601.34	GT:AD:DP:GL:GQ	1/1:0,51:50:-175.67,-15.06,-0.02:99
-chr1	3659744	.	C	T	75.39	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=20;HaplotypeScore=21.91;MQ=50.61;MQ0=1;QD=1.13;SB=59.16	GT:AD:DP:GL:GQ	0/1:57,10:52:-26.50,-15.68,-150.70:99
-chr1	3659750	.	T	C	207.45	SnpCluster	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=50.10;MQ=49.95;MQ0=1;QD=3.05;SB=-120.43	GT:AD:DP:GL:GQ	0/1:53,15:58:-41.51,-17.48,-178.17:99
-chr1	3659751	.	T	C	331.47	SnpCluster	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=48.26;MQ=49.78;MQ0=1;QD=4.95;SB=-162.44	GT:AD:DP:GL:GQ	0/1:46,21:55:-53.00,-16.57,-149.72:99
-chr1	3660887	rs1181889	T	C	275.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.83;MQ=59.11;MQ0=0;OQ=722.62;QD=13.90;SB=-328.30	GT:AD:DP:GL:GQ	0/1:24,28:49:-90.30,-14.76,-97.70:99
-chr1	3661651	rs1181888	A	G	399.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=490.27;QD=11.14;SB=-251.93	GT:AD:DP:GL:GQ	0/1:22,22:42:-64.98,-12.67,-82.79:99
-chr1	3662016	rs4648555	C	A	364.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=510.62;QD=9.46;SB=-259.25	GT:AD:DP:GL:GQ	0/1:34,20:53:-70.31,-15.96,-121.67:99
-chr1	3662783	rs12128087	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=13;HaplotypeScore=8.43;MQ=60.15;MQ0=0;OQ=558.18;QD=10.94;SB=-253.17	GT:AD:DP:GL:GQ	0/1:30,21:47:-73.27,-14.17,-94.61:99
-chr1	3663356	rs4648405	T	G	117.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.45;MQ0=0;OQ=421.62;QD=10.04;SB=-89.84	GT:AD:DP:GL:GQ	0/1:24,18:40:-57.50,-12.05,-84.73:99
-chr1	3663862	rs1181887	T	G	544.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1620.49;QD=34.48;SB=-656.23	GT:AD:DP:GL:GQ	1/1:0,47:47:-165.65,-14.16,-0.01:99
-chr1	3664012	rs7542464	C	T	327.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.16;MQ0=0;OQ=1410.26;QD=37.11;SB=-358.47	GT:AD:DP:GL:GQ	1/1:0,38:38:-144.63,-11.46,-0.02:99
-chr1	3664166	.	G	A	2.11	PASS	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=3;HaplotypeScore=2.17;MQ=59.59;MQ0=0;OQ=801.46;QD=17.81;SB=-414.44	GT:AD:DP:GL:GQ	0/1:20,25:43:-96.39,-12.96,-61.16:99
-chr1	3664614	rs1181886	A	T	88.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=59.65;MQ0=0;OQ=779.71;QD=14.44;SB=-332.65	GT:AD:DP:GL:GQ	0/1:28,26:52:-96.92,-15.66,-100.50:99
-chr1	3664618	rs9424312	T	A	76.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=946.40;QD=17.53;SB=-254.96	GT:AD:DP:GL:GQ	0/1:24,30:54:-114.19,-16.27,-85.78:99
-chr1	3664638	rs59291549	A	G	339.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.66;MQ0=0;OQ=754.74;QD=11.44;SB=-151.30	GT:AD:DP:GL:GQ	0/1:31,35:62:-97.45,-18.69,-125.83:99
-chr1	3664862	rs6682863	G	A	201.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=59.78;MQ0=0;OQ=631.54;QD=12.63;SB=-190.86	GT:AD:DP:GL:GQ	0/1:30,20:45:-80.00,-13.57,-81.03:99
-chr1	3665697	rs12128570	C	G	270.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=50.42;MQ0=0;OQ=767.84;QD=13.01;SB=-344.88	GT:AD:DP:GL:GQ	0/1:34,25:56:-96.94,-16.88,-141.00:99
-chr1	3665819	rs12131045	T	G	461.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.52;MQ0=0;OQ=642.50;QD=12.12;SB=-333.74	GT:AD:DP:GL:GQ	0/1:24,29:50:-82.60,-15.07,-87.60:99
-chr1	3665937	rs12128669	C	T	521.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.12;MQ0=0;OQ=862.45;QD=14.37;SB=-269.15	GT:AD:DP:GL:GQ	0/1:32,28:59:-107.30,-17.77,-116.90:99
-chr1	3666427	rs1181885	C	T	33.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.66;MQ0=0;OQ=1204.99;QD=21.91;SB=-603.11	GT:AD:DP:GL:GQ	0/1:19,36:52:-139.46,-15.68,-54.65:99
-chr1	3666458	rs1181884	T	C	438.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=1123.89;QD=17.56;SB=-533.09	GT:AD:DP:GL:GQ	0/1:26,38:63:-134.65,-18.98,-101.24:99
-chr1	3666632	rs12406474	T	C	126.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=3;HaplotypeScore=1.53;MQ=58.86;MQ0=0;OQ=740.89;QD=13.00;SB=-344.59	GT:AD:DP:GL:GQ	0/1:29,28:56:-94.24,-16.87,-116.11:99
-chr1	3667793	rs1181883	T	C	251.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=59.64;MQ0=0;OQ=2030.56;QD=31.73;SB=-682.90	GT:AD:DP:GL:GQ	1/1:0,64:64:-206.69,-19.29,-0.05:99
-chr1	3668081	rs1181882	G	C	162.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=60.00;MQ0=0;OQ=1618.57;QD=31.13;SB=-715.93	GT:AD:DP:GL:GQ	1/1:0,52:43:-165.50,-13.00,-0.06:99
-chr1	3668091	rs7516756	A	G	107.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=613.13;QD=11.57;SB=-116.72	GT:AD:DP:GL:GQ	0/1:27,26:49:-79.36,-14.77,-98.00:99
-chr1	3668371	rs7516968	A	G	62.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=209.36;QD=9.10;SB=-37.93	GT:AD:DP:GL:GQ	0/1:13,10:22:-30.85,-6.63,-52.05:99
-chr1	3668596	.	G	A	15.65	PASS	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=57.44;MQ0=0;OQ=384.28;QD=10.98;SB=-65.05	GT:AD:DP:GL:GQ	0/1:22,13:35:-52.26,-10.55,-81.04:99
-chr1	3668758	rs1181881	A	G	16.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=1.26;MQ=57.96;MQ0=0;OQ=916.82;QD=30.56;SB=-341.43	GT:AD:DP:GL:GQ	1/1:0,30:29:-95.29,-8.74,-0.02:87.21
-chr1	3668764	rs1181880	C	T	45.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.66;MQ0=0;OQ=531.41;QD=18.98;SB=-213.73	GT:AD:DP:GL:GQ	0/1:11,17:28:-64.87,-8.45,-34.91:99
-chr1	3668999	rs1181879	T	C	13.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=2.38;MQ=59.44;MQ0=0;OQ=1208.95;QD=29.49;SB=-449.15	GT:AD:DP:GL:GQ	1/1:0,41:38:-124.52,-11.46,-0.04:99
-chr1	3669006	rs4648556	G	A	196.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.40;MQ=59.44;MQ0=0;OQ=524.36;QD=12.79;SB=-228.74	GT:AD:DP:GL:GQ	0/1:24,17:40:-67.77,-12.05,-80.81:99
-chr1	3669167	rs4648557	T	C	163.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=60.00;MQ0=0;OQ=314.58;QD=10.15;SB=-171.98	GT:AD:DP:GL:GQ	0/1:15,16:28:-43.19,-8.45,-53.69:99
-chr1	3669321	rs4648558	A	T	213.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=59.30;MQ0=0;OQ=430.63;QD=13.05;SB=-151.85	GT:AD:DP:GL:GQ	0/1:18,15:33:-56.29,-9.94,-66.61:99
-chr1	3669635	rs10910024	C	T	223.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=60.00;MQ0=0;OQ=261.53;QD=10.46;SB=-131.12	GT:AD:DP:GL:GQ	0/1:15,10:24:-36.67,-7.23,-47.59:99
-chr1	3669916	rs56079032	G	A	49.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.11;MQ0=0;OQ=457.75;QD=17.61;SB=-143.18	GT:AD:DP:GL:GQ	0/1:10,16:25:-56.59,-7.54,-35.59:99
-chr1	3670503	rs1181878	G	A	204.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.96;MQ=58.92;MQ0=0;OQ=593.13;QD=15.21;SB=-209.18	GT:AD:DP:GL:GQ	0/1:21,18:39:-74.34,-11.75,-76.92:99
-chr1	3670589	rs1181877	C	T	442.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=59.71;MQ0=0;OQ=1051.46;QD=16.43;SB=-536.72	GT:AD:DP:GL:GQ	0/1:31,33:61:-126.81,-18.38,-107.46:99
-chr1	3670923	rs6669358	A	G	271.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.35;MQ=59.49;MQ0=0;OQ=863.52;QD=11.83;SB=-442.10	GT:AD:DP:GL:GQ	0/1:40,33:71:-111.03,-21.40,-156.37:99
-chr1	3671541	rs1181876	A	G	312.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.35;MQ0=0;OQ=557.92;QD=8.72;SB=-268.23	GT:AD:DP:GL:GQ	0/1:36,28:60:-77.16,-18.08,-144.69:99
-chr1	3671691	rs1181875	T	C	354.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.69;MQ0=0;OQ=768.78;QD=12.60;SB=-310.35	GT:AD:DP:GL:GQ	0/1:32,29:59:-97.93,-17.77,-128.86:99
-chr1	3671930	rs1181874	C	A	548.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=111;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=1553.48;QD=14.00;SB=-588.81	GT:AD:DP:GL:GQ	0/1:58,53:110:-191.77,-33.14,-192.67:99
-chr1	3673550	rs1181873	A	C	65.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=59.41;MQ0=0;OQ=502.42;QD=12.88;SB=-249.39	GT:AD:DP:GL:GQ	0/1:20,19:38:-64.97,-11.45,-71.58:99
-chr1	3673967	rs1181872	T	A	314.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=59.13;MQ0=0;OQ=665.69;QD=15.48;SB=-321.70	GT:AD:DP:GL:GQ	0/1:19,24:41:-82.21,-12.35,-69.45:99
-chr1	3674181	rs1181871	A	G	201.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=52.16;MQ0=0;OQ=271.85;QD=7.55;SB=-59.74	GT:AD:DP:GL:GQ	0/1:21,15:32:-40.11,-9.65,-77.03:99
-chr1	3674814	rs1181870	C	A	305.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=57.69;MQ0=0;OQ=866.35;QD=12.93;SB=-280.62	GT:AD:DP:GL:GQ	0/1:36,31:65:-109.50,-19.58,-123.19:99
-chr1	3677599	rs1175552	C	A	135.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.12;MQ=60.00;MQ0=0;OQ=585.48;QD=10.09;SB=-188.53	GT:AD:DP:GL:GQ	0/1:34,24:53:-77.81,-15.97,-102.27:99
-chr1	3678505	rs1175551	T	C	166.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=58.20;MQ0=0;OQ=103.01;QD=7.92;SB=-65.87	GT:AD:DP:GL:GQ	0/1:7,6:12:-17.20,-3.62,-26.14:99
-chr1	3679407	.	C	G	26.93	LowQual	AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=1;HaplotypeScore=2.22;MQ=48.93;MQ0=0;QD=2.45;SB=-6.99	GT:AD:DP:GL:GQ	0/1:3,8:4:-7.19,-1.21,-8.24:59.76
-chr1	3681100	rs1184341	C	T	108.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=3.04;MQ=59.23;MQ0=0;OQ=426.67;QD=14.22;SB=-164.69	GT:AD:DP:GL:GQ	0/1:15,15:28:-54.39,-8.44,-49.07:99
-chr1	3681124	rs2797432	A	G	199.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=396.40;QD=12.39;SB=-160.61	GT:AD:DP:GL:GQ	0/1:13,19:29:-51.67,-8.74,-51.47:99
-chr1	3681330	rs1181893	A	C	235.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.61;MQ0=0;OQ=409.25;QD=27.28;SB=-143.01	GT:AD:DP:GL:GQ	1/1:0,15:13:-44.52,-3.92,-0.01:39.10
-chr1	3681388	rs1175550	A	G	206.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=59.14;MQ0=0;OQ=268.33;QD=9.94;SB=-118.66	GT:AD:DP:GL:GQ	0/1:16,11:27:-38.26,-8.14,-61.45:99
-chr1	3681587	rs1175549	A	C	56.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=1.73;MQ=59.28;MQ0=0;OQ=317.74;QD=9.93;SB=-135.67	GT:AD:DP:GL:GQ	0/1:18,14:31:-44.40,-9.34,-64.53:99
-chr1	3682892	rs1175548	A	G	294.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=58.99;MQ0=0;OQ=521.21;QD=11.33;SB=-266.55	GT:AD:DP:GL:GQ	0/1:25,21:43:-68.36,-12.95,-93.71:99
-chr1	3683615	rs1175547	G	T	106.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=58.25;MQ0=0;OQ=658.75;QD=16.47;SB=-219.58	GT:AD:DP:GL:GQ	0/1:18,22:39:-80.91,-11.75,-53.72:99
-chr1	3683769	rs1175546	C	T	14.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=58.95;MQ0=0;OQ=845.89;QD=19.22;SB=-175.68	GT:AD:DP:GL:GQ	0/1:18,26:42:-100.52,-12.65,-61.88:99
-chr1	3684656	rs1891934	G	A	75.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=59.58;MQ0=0;OQ=574.95;QD=13.07;SB=-268.25	GT:AD:DP:GL:GQ	0/1:26,18:41:-73.14,-12.36,-73.56:99
-chr1	3684836	.	T	G	29.95	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=2;HaplotypeScore=5.28;MQ=57.94;MQ0=0;QD=0.88;SB=50.17	GT:AD:DP:GL:GQ	0/1:20,14:25:-13.81,-7.53,-70.58:62.78
-chr1	3685860	rs2799182	T	C	179.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.18;MQ=58.63;MQ0=0;OQ=681.56;QD=13.36;SB=-324.12	GT:AD:DP:GL:GQ	0/1:23,28:50:-86.51,-15.07,-94.22:99
-chr1	3686231	rs61759305	C	T	280.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=512.50;QD=17.08;SB=-238.52	GT:AD:DP:GL:GQ	0/1:14,16:29:-63.27,-8.74,-47.74:99
-chr1	3686750	rs8379	A	C	132.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.70;MQ0=0;OQ=512.51;QD=8.27;SB=-204.80	GT:AD:DP:GL:GQ	0/1:39,23:59:-72.31,-17.77,-139.60:99
-chr1	3687151	rs2996428	C	T	323.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.20;MQ=59.68;MQ0=0;OQ=1332.10;QD=18.25;SB=-588.63	GT:AD:DP:GL:GQ	0/1:30,43:68:-156.98,-20.49,-102.01:99
-chr1	3688388	rs2799186	C	G	198.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=60.00;MQ0=0;OQ=1120.38;QD=14.55;SB=-296.13	GT:AD:DP:GL:GQ	0/1:44,32:77:-141.06,-25.73,-190.14:99
-chr1	3688807	rs12122058	C	T	132.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=1.81;MQ=60.00;MQ0=0;OQ=788.10;QD=15.16;SB=-353.46	GT:AD:DP:GL:GQ	0/1:27,25:50:-97.16,-15.07,-93.28:99
-chr1	3689428	rs2799185	G	C	86.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=58.23;MQ0=0;OQ=644.64;QD=17.42;SB=-205.64	GT:AD:DP:GL:GQ	0/1:18,19:35:-78.30,-10.56,-70.47:99
-chr1	3689489	rs2799184	T	G	198.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.30;MQ=56.35;MQ0=0;OQ=514.42;QD=13.19;SB=-238.40	GT:AD:DP:GL:GQ	0/1:19,20:37:-65.87,-11.14,-65.31:99
-chr1	3689844	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=16;HaplotypeScore=12.40;MQ=56.82;MQ0=0;OQ=207.53;QD=3.10;SB=47.88	GT:AD:DP:GL:GQ	0/1:50,16:53:-40.01,-15.97,-140.82:99
-chr1	3691351	rs2996426	A	G	107.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=2.66;MQ=59.77;MQ0=0;OQ=576.97;QD=11.10;SB=-273.25	GT:AD:DP:GL:GQ	0/1:26,26:49:-75.76,-14.78,-98.82:99
-chr1	3693197	rs2368537	G	C	138.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.55;MQ0=0;OQ=1805.49;QD=35.40;SB=-781.23	GT:AD:DP:GL:GQ	1/1:0,51:46:-184.17,-13.88,-0.03:99
-chr1	3693570	rs2253143	G	A	60.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=3.58;MQ=58.41;MQ0=0;OQ=495.55;QD=11.26;SB=-141.61	GT:AD:DP:GL:GQ	0/1:26,18:41:-65.20,-12.37,-77.20:99
-chr1	3694312	rs12142183	T	G	312.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=59.65;MQ0=0;OQ=615.52;QD=11.61;SB=-311.76	GT:AD:DP:GL:GQ	0/1:22,31:47:-79.00,-14.16,-79.12:99
-chr1	3694564	.	G	C	39.33	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=6.24;MQ=58.81;MQ0=0;QD=0.72;SB=44.18	GT:AD:DP:GL:GQ	0/1:42,12:37:-18.38,-11.17,-134.23:72.16
-chr1	3701498	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=71;Dels=0.03;HRun=20;HaplotypeScore=51.30;MQ=52.45;MQ0=0;OQ=259.27;QD=3.65;SB=80.25	GT:AD:DP:GL:GQ	0/1:46,23:54:-44.89,-15.68,-134.64:99
-chr1	3708347	rs6681383	G	A	128.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.34;MQ0=0;OQ=1078.39;QD=18.92;SB=-322.85	GT:AD:DP:GL:GQ	0/1:24,33:53:-127.10,-15.97,-69.66:99
-chr1	3712148	rs2996425	A	T	193.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.11;MQ=59.02;MQ0=0;OQ=2222.50;QD=35.85;SB=-1018.88	GT:AD:DP:GL:GQ	1/1:0,62:60:-225.85,-18.07,-0.02:99
-chr1	3714307	rs61759320	G	A	326.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=53.55;MQ0=0;OQ=770.50;QD=14.01;SB=-354.84	GT:AD:DP:GL:GQ	0/1:29,25:53:-96.31,-15.97,-95.14:99
-chr1	3714663	.	A	C	15.04	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=2;HaplotypeScore=8.17;MQ=57.66;MQ0=0;QD=0.38;SB=56.19	GT:AD:DP:GL:GQ	0/1:24,16:28:-13.21,-8.44,-81.36:47.74
-chr1	3727878	.	C	T	38.08	PASS	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=2.42;MQ=59.48;MQ0=0;OQ=1399.61;QD=17.28;SB=-662.18	GT:AD:DP:GL:GQ	0/1:40,41:81:-167.65,-24.40,-140.98:99
-chr1	3731503	.	A	G	18.90	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=3;HaplotypeScore=1.79;MQ=54.69;MQ0=0;QD=0.73;SB=5.04	GT:AD:DP:GL:GQ	0/1:21,5:21:-11.50,-6.33,-70.25:51.68
-chr1	3735976	rs1836	A	G	124.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.96;MQ=59.74;MQ0=0;OQ=2210.40;QD=31.13;SB=-963.45	GT:AD:DP:GL:GQ	1/1:0,70:69:-227.21,-23.18,-2.59:99
-chr1	3736114	rs2275830	T	C	634.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=2088.07;QD=30.71;SB=-734.31	GT:AD:DP:GL:GQ	1/1:0,68:67:-212.46,-20.22,-0.07:99
-chr1	3736443	rs2275828	G	T	17.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=3.28;MQ=59.05;MQ0=0;OQ=2655.56;QD=36.38;SB=-1342.28	GT:AD:DP:GL:GQ	1/1:0,73:72:-269.16,-21.68,-0.02:99
-chr1	3736449	rs2275826	C	G	89.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.10;MQ0=0;OQ=3375.97;QD=43.84;SB=-1685.64	GT:AD:DP:GL:GQ	1/1:0,77:77:-336.60,-23.20,-0.02:99
-chr1	3737179	rs4648417	C	T	55.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=58.05;MQ0=0;OQ=1230.92;QD=34.19;SB=-377.48	GT:AD:DP:GL:GQ	1/1:0,35:33:-126.70,-9.95,-0.02:99
-chr1	3737440	rs6424058	C	T	106.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=3.83;MQ=56.84;MQ0=0;OQ=1463.09;QD=34.84;SB=-699.35	GT:AD:DP:GL:GQ	1/1:0,42:38:-149.91,-11.45,-0.01:99
-chr1	3737463	rs6413779	T	C	36.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=57.40;MQ0=0;OQ=1023.14;QD=33.00;SB=-220.63	GT:AD:DP:GL:GQ	1/1:0,31:31:-105.92,-9.34,-0.02:93.25
-chr1	3737945	rs7522227	A	G	230.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.22;MQ0=0;OQ=2674.63;QD=34.29;SB=-1340.60	GT:AD:DP:GL:GQ	1/1:0,77:76:-271.07,-22.89,-0.02:99
-chr1	3738031	rs7524765	T	C	717.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2886.44;QD=35.20;SB=-1305.64	GT:AD:DP:GL:GQ	1/1:0,82:82:-292.25,-24.70,-0.03:99
-chr1	3738548	rs17403836	A	C	593.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.20;MQ0=0;OQ=3340.65;QD=35.92;SB=-1448.19	GT:AD:DP:GL:GQ	1/1:0,93:93:-333.07,-28.01,-0.02:99
-chr1	3738842	rs61768911	C	G	310.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.39;MQ0=2;OQ=606.83;QD=30.34;SB=-199.55	GT:AD:DP:GL:GQ	1/1:0,19:16:-64.28,-4.83,-0.01:48.16
-chr1	3738927	.	T	C	23.45	LowQual	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=5.48;MQ=47.67;MQ0=1;QD=0.60;SB=-5.57	GT:AD:DP:GL:GQ	0/1:32,7:31:-14.97,-9.34,-106.27:56.26
-chr1	3738930	.	T	C	7.68	PASS	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=3.51;MQ=48.29;MQ0=0;OQ=738.60;QD=19.44;SB=-353.38	GT:AD:DP:GL:GQ	0/1:6,32:31:-86.49,-9.35,-16.38:70.33
-chr1	3738954	rs61768912	T	C	1249.83	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.18;MQ0=0;QD=28.41;SB=-561.89	GT:AD:DP:GL:GQ	1/1:0,43:40:-128.60,-12.06,-0.04:99
-chr1	3738962	rs61768913	A	G	1521.07	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=53.09;MQ0=0;QD=28.17;SB=-501.21	GT:AD:DP:GL:GQ	1/1:0,54:48:-155.73,-14.47,-0.04:99
-chr1	3738964	rs61768914	A	G	1823.57	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=53.35;MQ0=0;QD=32.56;SB=-678.27	GT:AD:DP:GL:GQ	1/1:0,56:52:-185.96,-15.66,-0.02:99
-chr1	3738975	rs61768915	T	C	185.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.64;MQ=53.83;MQ0=0;OQ=2377.40;QD=34.96;SB=-853.97	GT:AD:DP:GL:GQ	1/1:0,68:67:-241.35,-20.18,-0.03:99
-chr1	3739217	rs6684560	G	A	167.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=55.03;MQ0=0;OQ=2027.81;QD=36.87;SB=-859.02	GT:AD:DP:GL:GQ	1/1:1,54:53:-206.39,-15.97,-0.02:99
-chr1	3739448	rs6676260	T	C	481.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.47;MQ0=0;OQ=1276.86;QD=30.40;SB=-555.08	GT:AD:DP:GL:GQ	1/1:0,42:41:-131.31,-12.36,-0.03:99
-chr1	3739507	rs10797344	C	G	65.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.02;MQ=59.28;MQ0=0;OQ=2404.57;QD=37.57;SB=-1028.99	GT:AD:DP:GL:GQ	1/1:0,64:58:-244.08,-17.49,-0.04:99
-chr1	3739508	rs10797345	G	A	56.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.68;MQ=59.28;MQ0=0;OQ=2416.64;QD=37.76;SB=-1154.54	GT:AD:DP:GL:GQ	1/1:0,64:63:-245.28,-18.99,-0.03:99
-chr1	3739554	rs6673716	A	G	130.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.53;MQ0=0;OQ=1461.81;QD=29.83;SB=-615.96	GT:AD:DP:GL:GQ	1/1:0,49:46:-149.80,-13.87,-0.04:99
-chr1	3739633	rs6673807	A	G	581.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.88;MQ0=0;OQ=2050.62;QD=35.36;SB=-778.99	GT:AD:DP:GL:GQ	1/1:0,58:58:-208.67,-17.47,-0.02:99
-chr1	3740027	rs2368533	G	A	618.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=2881.32;QD=38.94;SB=-1374.05	GT:AD:DP:GL:GQ	1/1:0,74:73:-291.74,-21.99,-0.02:99
-chr1	3740589	rs6677381	A	G	634.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=2780.11;QD=35.64;SB=-1088.76	GT:AD:DP:GL:GQ	1/1:0,78:77:-281.62,-23.19,-0.02:99
-chr1	3740591	rs6680017	T	G	509.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=2637.83;QD=34.26;SB=-1082.49	GT:AD:DP:GL:GQ	1/1:0,77:75:-267.39,-22.59,-0.02:99
-chr1	3740758	.	T	A	7.56	PASS	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=55.28;MQ0=1;OQ=174.11;QD=4.71;SB=-20.31	GT:AD:DP:GL:GQ	0/1:28,9:34:-30.93,-10.24,-98.40:99
-chr1	3741138	rs2887273	C	G	484.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2855.33;QD=43.26;SB=-1170.05	GT:AD:DP:GL:GQ	1/1:0,66:66:-289.13,-19.88,-0.02:99
-chr1	3741826	rs4648419	C	G	552.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.30;MQ0=0;OQ=3843.78;QD=42.24;SB=-1290.87	GT:AD:DP:GL:GQ	1/1:0,91:88:-383.38,-26.52,-0.03:99
-chr1	3742892	.	G	T	16.29	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=20;HaplotypeScore=18.89;MQ=55.03;MQ0=1;QD=0.28;SB=44.02	GT:AD:DP:GL:GQ	0/1:50,6:41:-19.70,-14.80,-98.51:49.02
-chr1	3742917	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=52;Dels=0.02;HRun=20;HaplotypeScore=34.21;MQ=57.45;MQ0=0;OQ=170.67;QD=3.28;SB=56.18	GT:AD:DP:GL:GQ	0/1:37,14:43:-33.01,-12.65,-114.45:99
-chr1	3742996	rs2275824	A	T	710.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.86;MQ0=0;OQ=2009.53;QD=35.25;SB=-882.57	GT:AD:DP:GL:GQ	1/1:0,57:56:-204.56,-16.87,-0.02:99
-chr1	3744349	rs12409082	G	C	531.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3059.06;QD=43.09;SB=-1422.83	GT:AD:DP:GL:GQ	1/1:0,71:71:-309.52,-21.40,-0.02:99
-chr1	3744456	rs6683827	G	T	2.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=4.28;MQ=58.86;MQ0=0;OQ=2501.40;QD=35.73;SB=-1071.46	GT:AD:DP:GL:GQ	1/1:0,70:69:-253.75,-20.78,-0.02:99
-chr1	3745535	rs1891941	T	C	731.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2479.06;QD=35.42;SB=-1217.69	GT:AD:DP:GL:GQ	1/1:0,70:69:-251.51,-20.78,-0.02:99
-chr1	3745729	rs1891940	T	C	456.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.01;MQ0=0;OQ=1634.49;QD=34.78;SB=-697.28	GT:AD:DP:GL:GQ	1/1:0,47:46:-167.05,-13.85,-0.01:99
-chr1	3745735	rs1891939	T	G	249.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=1553.73;QD=33.78;SB=-800.51	GT:AD:DP:GL:GQ	1/1:0,46:45:-158.97,-13.55,-0.02:99
-chr1	3745980	rs1539649	A	G	625.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.71;MQ0=0;OQ=2553.81;QD=30.77;SB=-1180.11	GT:AD:DP:GL:GQ	1/1:0,83:80:-259.03,-24.12,-0.06:99
-chr1	3746353	rs7535887	T	C	654.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1854.47;QD=30.91;SB=-854.01	GT:AD:DP:GL:GQ	1/1:0,60:59:-189.08,-17.79,-0.05:99
-chr1	3746392	rs10797346	T	C	305.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2579.74;QD=35.83;SB=-1200.15	GT:AD:DP:GL:GQ	1/1:0,72:72:-261.58,-21.69,-0.02:99
-chr1	3747160	rs10909800	C	T	207.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2281.73;QD=39.34;SB=-904.67	GT:AD:DP:GL:GQ	1/1:0,58:58:-231.78,-17.47,-0.02:99
-chr1	3748578	rs4381131	T	C	118.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=57.58;MQ0=0;OQ=1302.81;QD=35.21;SB=-612.36	GT:AD:DP:GL:GQ	1/1:0,37:37:-133.88,-11.14,-0.01:99
-chr1	3748616	rs4411084	A	G	124.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=57.27;MQ0=0;OQ=1453.01;QD=29.06;SB=-634.87	GT:AD:DP:GL:GQ	1/1:0,50:46:-148.93,-13.88,-0.04:99
-chr1	3749212	rs3765774	T	A	197.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=2826.29;QD=36.71;SB=-1358.75	GT:AD:DP:GL:GQ	1/1:0,77:76:-286.23,-22.89,-0.02:99
-chr1	3749644	rs10797347	A	G	265.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=59.07;MQ0=0;OQ=1626.88;QD=34.61;SB=-812.67	GT:AD:DP:GL:GQ	1/1:0,47:46:-166.29,-13.86,-0.01:99
-chr1	3749797	rs10909801	A	G	1.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=13.74;MQ=53.38;MQ0=0;OQ=1309.63;QD=23.81;SB=-631.48	GT:AD:DP:GL:GQ	1/1:0,53:41:-134.59,-12.37,-0.04:99
-chr1	3749921	rs6701360	G	A	575.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.91;MQ0=0;OQ=2426.40;QD=38.51;SB=-904.68	GT:AD:DP:GL:GQ	1/1:0,63:63:-246.25,-18.99,-0.03:99
-chr1	3749974	rs6690371	A	G	48.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=1.93;MQ=58.34;MQ0=0;OQ=1681.22;QD=35.03;SB=-728.27	GT:AD:DP:GL:GQ	1/1:0,48:48:-171.73,-14.47,-0.03:99
-chr1	3749989	rs6678020	C	T	441.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.59;MQ0=0;OQ=1518.29;QD=37.96;SB=-571.34	GT:AD:DP:GL:GQ	1/1:0,40:39:-155.43,-11.75,-0.01:99
-chr1	3750090	rs6680552	C	T	728	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.60;MQ0=1;OQ=1998.34;QD=35.06;SB=-998.84	GT:AD:DP:GL:GQ	1/1:0,57:51:-203.43,-15.36,-0.01:99
-chr1	3750216	rs6695657	T	C	130.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.67;MQ0=0;OQ=1753.47;QD=29.72;SB=-613.96	GT:AD:DP:GL:GQ	1/1:0,59:56:-178.99,-16.89,-0.06:99
-chr1	3750378	rs10752723	A	G	15.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=1.50;MQ=56.80;MQ0=0;OQ=1482.59;QD=32.95;SB=-488.54	GT:AD:DP:GL:GQ	1/1:1,43:41:-151.86,-12.35,-0.01:99
-chr1	3751141	rs6698930	T	A	637.91	DPFilter;Indel	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=7;HaplotypeScore=46.26;MQ=41.75;MQ0=0;QD=7.78;SB=8.51	GT:AD:DP:GL:GQ	0/1:49,33:69:-87.87,-20.79,-167.40:99
-chr1	3751339	rs2275822	C	T	226.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.23;MQ0=0;OQ=2373.96;QD=39.57;SB=-964.37	GT:AD:DP:GL:GQ	1/1:0,60:60:-241.00,-18.08,-0.02:99
-chr1	3751510	rs2275821	A	G	573.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=99;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.31;MQ0=0;OQ=3500.46;QD=35.36;SB=-1716.03	GT:AD:DP:GL:GQ	1/1:0,99:96:-349.05,-28.91,-0.03:99
-chr1	3751936	rs6699784	T	C	22.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1634.61;QD=34.05;SB=-680.60	GT:AD:DP:GL:GQ	1/1:0,48:47:-167.07,-14.16,-0.02:99
-chr1	3751940	rs6699785	T	C	457.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1716.61;QD=35.76;SB=-707.61	GT:AD:DP:GL:GQ	1/1:0,48:48:-175.26,-14.46,-0.02:99
-chr1	3752276	rs6687498	C	A	0.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=7.86;MQ=58.29;MQ0=1;OQ=1565.75;QD=34.79;SB=-714.95	GT:AD:DP:GL:GQ	1/1:1,44:44:-160.17,-13.25,-0.01:99
-chr1	3752464	rs4494088	C	T	130.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.01;MQ0=0;OQ=2585.87;QD=39.18;SB=-1275.71	GT:AD:DP:GL:GQ	1/1:0,66:65:-262.19,-19.58,-0.02:99
-chr1	3752510	.	C	A	11.64	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=20;HaplotypeScore=16.03;MQ=54.71;MQ0=1;QD=0.16;SB=98.34	GT:AD:DP:GL:GQ	0/1:63,8:53:-20.38,-15.96,-171.47:44.17
-chr1	3752581	rs4534323	A	T	713.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=2157.31;QD=36.56;SB=-930.57	GT:AD:DP:GL:GQ	1/1:0,59:59:-219.34,-17.77,-0.02:99
-chr1	3753724	rs12047360	G	A	108.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=59.36;MQ0=0;OQ=1255.98;QD=34.89;SB=-564.33	GT:AD:DP:GL:GQ	1/1:0,36:33:-129.19,-9.94,-0.01:99
-chr1	3754321	rs34401151	C	T	220.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.55;MQ0=0;OQ=2357.19;QD=36.83;SB=-1184.12	GT:AD:DP:GL:GQ	1/1:0,63:62:-242.18,-21.42,-2.88:99
-chr1	3754471	rs55873991	T	C	460.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=2216.85;QD=34.64;SB=-478.52	GT:AD:DP:GL:GQ	1/1:0,64:60:-225.28,-18.07,-0.01:99
-chr1	3755409	rs4648346	G	A	377.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=56.94;MQ0=0;OQ=2718.34;QD=38.83;SB=-1289.71	GT:AD:DP:GL:GQ	1/1:0,70:68:-275.43,-20.48,-0.02:99
-chr1	3755538	rs4648423	C	T	3.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=5.11;MQ=59.49;MQ0=0;OQ=1662.33;QD=36.94;SB=-681.30	GT:AD:DP:GL:GQ	1/1:0,44:44:-169.84,-13.26,-0.02:99
-chr1	3755615	rs4648347	T	C	415.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=60.19;MQ0=0;OQ=2002.26;QD=34.52;SB=-940.97	GT:AD:DP:GL:GQ	1/1:0,58:56:-203.83,-16.87,-0.02:99
-chr1	3755919	rs12097923	G	T	175.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=59.51;MQ0=0;OQ=2007.64;QD=34.03;SB=-971.58	GT:AD:DP:GL:GQ	1/1:0,58:57:-204.37,-17.17,-0.02:99
-chr1	3756146	rs17404435	G	T	642.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.27;MQ0=0;OQ=1775.93;QD=34.82;SB=-654.09	GT:AD:DP:GL:GQ	1/1:0,51:50:-181.19,-15.06,-0.02:99
-chr1	3756301	rs6683156	C	T	153.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=59.62;MQ0=0;OQ=3593.95;QD=38.64;SB=-1767.70	GT:AD:DP:GL:GQ	1/1:0,92:90:-358.39,-27.12,-0.03:99
-chr1	3757458	rs3765779	A	G	312.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1547.17;QD=29.19;SB=-677.55	GT:AD:DP:GL:GQ	1/1:0,53:50:-158.35,-15.08,-0.05:99
-chr1	3757556	rs3765780	C	T	73.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=1220.87;QD=37.00;SB=-540.71	GT:AD:DP:GL:GQ	1/1:0,33:32:-125.68,-9.64,-0.01:96.30
-chr1	3758579	rs1539647	T	C	5.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=2;HaplotypeScore=3.94;MQ=58.65;MQ0=1;OQ=2215.43;QD=29.94;SB=-922.78	GT:AD:DP:GL:GQ	1/1:1,73:71:-228.15,-21.41,-3.03:99
-chr1	3758589	rs1539648	T	C	162.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=59.09;MQ0=0;OQ=2319.86;QD=30.52;SB=-925.48	GT:AD:DP:GL:GQ	1/1:0,76:73:-235.63,-22.01,-0.06:99
-chr1	3759091	rs6657021	A	G	451.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.04;MQ0=0;OQ=2173.33;QD=30.19;SB=-1093.08	GT:AD:DP:GL:GQ	1/1:0,72:68:-220.98,-20.51,-0.06:99
-chr1	3759136	rs6668213	G	C	44.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.72;MQ0=0;OQ=2874.30;QD=41.66;SB=-1253.95	GT:AD:DP:GL:GQ	1/1:0,69:66:-291.04,-19.89,-0.02:99
-chr1	3759146	rs6693152	C	T	203.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.07;MQ0=0;OQ=2711.10;QD=38.73;SB=-1194.58	GT:AD:DP:GL:GQ	1/1:0,70:68:-274.71,-20.49,-0.02:99
-chr1	3759189	rs6657132	A	G	408.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=1707.03;QD=31.04;SB=-847.00	GT:AD:DP:GL:GQ	1/1:0,55:50:-174.32,-15.07,-0.03:99
-chr1	3759225	rs6668306	G	C	258.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=59.53;MQ0=0;OQ=1917.17;QD=39.13;SB=-849.44	GT:AD:DP:GL:GQ	1/1:0,49:46:-195.32,-13.87,-0.02:99
-chr1	3759237	rs6693259	C	T	255.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1813.57;QD=38.59;SB=-875.61	GT:AD:DP:GL:GQ	1/1:0,47:47:-184.96,-14.17,-0.02:99
-chr1	3759339	.	T	C	4.24	PASS	AC=2;AF=1.00;AN=2;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=37.66;MQ0=0;OQ=1291.89;QD=29.36;SB=-665.80	GT:AD:DP:GL:GQ	1/1:0,44:41:-132.82,-12.37,-0.04:99
-chr1	3759424	rs11576718	T	C	18.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.78;MQ0=0;OQ=1915.98;QD=34.84;SB=-646.27	GT:AD:DP:GL:GQ	1/1:0,55:53:-195.20,-15.96,-0.02:99
-chr1	3759450	rs11578021	G	C	393.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=2482.73;QD=42.08;SB=-1009.18	GT:AD:DP:GL:GQ	1/1:0,59:57:-251.88,-17.18,-0.02:99
-chr1	3760255	rs4130539	C	A	200.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.57;MQ=59.43;MQ0=0;OQ=2921.40;QD=36.07;SB=-1317.55	GT:AD:DP:GL:GQ	1/1:0,81:81:-295.75,-24.40,-0.03:99
-chr1	3760285	rs4233023	G	A	128.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.42;MQ0=0;OQ=2979.99;QD=37.25;SB=-1007.64	GT:AD:DP:GL:GQ	1/1:0,80:76:-301.61,-22.90,-0.03:99
-chr1	3760596	rs4582731	T	C	194.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1740.97;QD=31.65;SB=-868.36	GT:AD:DP:GL:GQ	1/1:0,55:54:-177.73,-16.29,-0.05:99
-chr1	3760968	rs12023761	T	C	207.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=57.12;MQ0=0;OQ=2651.31;QD=33.99;SB=-1110.83	GT:AD:DP:GL:GQ	1/1:0,78:75:-268.74,-22.59,-0.02:99
-chr1	3760980	rs12023762	T	C	71.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=2.08;MQ=56.93;MQ0=0;OQ=2310.56;QD=34.49;SB=-1074.87	GT:AD:DP:GL:GQ	1/1:0,66:64:-234.66,-19.27,-0.02:99
-chr1	3761023	rs12026284	G	A	45.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=57.92;MQ0=0;OQ=1613.24;QD=38.41;SB=-773.05	GT:AD:DP:GL:GQ	1/1:0,42:41:-164.92,-12.35,-0.01:99
-chr1	3761229	rs12024538	T	C	108.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=57.43;MQ0=0;OQ=2622.46;QD=34.06;SB=-1093.09	GT:AD:DP:GL:GQ	1/1:0,77:74:-265.86,-22.29,-0.03:99
-chr1	3761407	rs7552678	C	T	182.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.23;MQ=55.63;MQ0=0;OQ=2322.80;QD=37.46;SB=-1101.95	GT:AD:DP:GL:GQ	1/1:0,61:58:-235.88,-17.47,-0.01:99
-chr1	3761583	rs10909805	A	T	36.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=57.39;MQ0=0;OQ=1183.25;QD=32.87;SB=-378.79	GT:AD:DP:GL:GQ	1/1:0,36:34:-121.93,-10.24,-0.02:99
-chr1	3762135	rs4648348	G	T	313.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.61;MQ0=0;OQ=2805.56;QD=36.44;SB=-1091.90	GT:AD:DP:GL:GQ	1/1:0,77:77:-284.17,-23.19,-0.03:99
-chr1	3762966	rs6424059	C	T	50.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1794.59;QD=39.88;SB=-207.77	GT:AD:DP:GL:GQ	1/1:0,45:45:-183.06,-13.56,-0.01:99
-chr1	3763112	rs6424060	C	A	1.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=57.94;MQ0=0;OQ=1225.37;QD=36.04;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,34:33:-126.13,-9.94,-0.01:99
-chr1	3763448	rs7542369	C	G	0.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=407.00;QD=27.13;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,15:12:-44.31,-3.64,-0.03:36.11
-chr1	3763578	rs4648428	A	G	5.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=286.53;QD=20.47;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,13:11:-32.26,-3.33,-0.02:33.05
-chr1	3764486	rs10909806	C	A	23.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=2.13;MQ=58.37;MQ0=0;OQ=1559.40;QD=35.44;SB=-546.78	GT:AD:DP:GL:GQ	1/1:0,44:43:-159.54,-12.95,-0.01:99
-chr1	3765314	rs4376673	C	G	417.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1404.99;QD=36.03;SB=-615.54	GT:AD:DP:GL:GQ	1/1:0,39:36:-144.12,-10.87,-0.03:99
-chr1	3765882	rs9786959	A	G	29.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=59.70;MQ0=0;OQ=1920.48;QD=30.48;SB=-862.57	GT:AD:DP:GL:GQ	1/1:0,63:60:-195.68,-18.09,-0.05:99
-chr1	3767471	rs11800725	A	G	13.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=58.98;MQ0=0;OQ=1927.36;QD=30.11;SB=-765.33	GT:AD:DP:GL:GQ	1/1:0,64:61:-196.39,-18.41,-0.06:99
-chr1	3767577	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=17;HaplotypeScore=9.33;MQ=55.19;MQ0=0;OQ=73.00;QD=1.66;SB=10.79	GT:AD:DP:GL:GQ	0/1:33,10:33:-20.53,-9.94,-95.54:99
-chr1	3767595	.	G	A	13.29	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=17;HaplotypeScore=14.08;MQ=55.46;MQ0=0;QD=0.23;SB=74.24	GT:AD:DP:GL:GQ	0/1:47,10:46:-18.45,-13.86,-142.27:45.92
-chr1	3769011	rs4400555	C	T	258.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.08;MQ0=0;OQ=2381.95;QD=39.05;SB=-1005.83	GT:AD:DP:GL:GQ	1/1:0,61:61:-241.80,-18.38,-0.02:99
-chr1	3769497	rs4573474	G	C	208.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.06;MQ0=0;OQ=1909.70;QD=37.45;SB=-679.47	GT:AD:DP:GL:GQ	1/1:0,51:49:-194.60,-14.79,-0.05:99
-chr1	3769504	rs4475689	T	C	437.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.81;MQ0=0;OQ=1544.26;QD=28.60;SB=-549.88	GT:AD:DP:GL:GQ	1/1:0,54:50:-158.07,-15.09,-0.05:99
-chr1	3769540	rs4393098	C	T	134.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.73;MQ0=0;OQ=2714.04;QD=39.33;SB=-879.18	GT:AD:DP:GL:GQ	1/1:0,69:68:-275.01,-20.48,-0.02:99
-chr1	3770416	rs10909807	A	G	70.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=59.66;MQ0=0;OQ=2327.40;QD=34.23;SB=-632.25	GT:AD:DP:GL:GQ	1/1:0,68:65:-236.35,-19.58,-0.03:99
-chr1	3770956	rs10797348	C	A	725.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2194.69;QD=35.40;SB=-970.66	GT:AD:DP:GL:GQ	1/1:0,62:61:-223.07,-18.37,-0.02:99
-chr1	3770996	rs10752724	C	G	36.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.68;MQ0=0;OQ=3059.04;QD=41.90;SB=-884.77	GT:AD:DP:GL:GQ	1/1:0,73:70:-309.51,-21.10,-0.03:99
-chr1	3772468	rs10909809	C	T	66.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.41;MQ=58.92;MQ0=0;OQ=1387.22;QD=35.57;SB=-471.11	GT:AD:DP:GL:GQ	1/1:0,38:37:-142.33,-11.16,-0.02:99
-chr1	3773138	rs10909810	A	C	280.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.04;MQ0=0;OQ=955.91;QD=32.96;SB=-323.98	GT:AD:DP:GL:GQ	1/1:0,29:29:-99.19,-8.74,-0.02:87.21
-chr1	3773433	rs10797349	C	T	164.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=58.68;MQ0=0;OQ=1490.84;QD=33.88;SB=-752.63	GT:AD:DP:GL:GQ	1/1:0,44:39:-152.69,-11.75,-0.02:99
-chr1	3773480	rs10797350	T	C	13.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=2.15;MQ=58.30;MQ0=0;OQ=1471.72;QD=30.66;SB=-684.88	GT:AD:DP:GL:GQ	1/1:0,48:45:-150.79,-13.57,-0.03:99
-chr1	3773523	rs10752726	T	G	347.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=1497.10;QD=33.27;SB=-446.81	GT:AD:DP:GL:GQ	1/1:0,45:43:-153.31,-12.95,-0.01:99
-chr1	3773611	rs12035912	C	T	197.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=58.30;MQ0=0;OQ=2493.51;QD=37.78;SB=-1130.03	GT:AD:DP:GL:GQ	1/1:0,66:64:-252.96,-19.28,-0.02:99
-chr1	3775032	.	T	C	552.80	SnpCluster	AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=33.42;MQ=46.78;MQ0=0;QD=6.28;SB=-111.60	GT:AD:DP:GL:GQ	0/1:60,28:83:-83.58,-25.02,-222.80:99
-chr1	3775037	.	G	T	197.57	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=30.55;MQ=47.65;MQ0=0;QD=2.00;SB=65.19	GT:AD:DP:GL:GQ	0/1:82,15:90:-57.60,-34.56,-265.76:99
-chr1	3775038	rs11801559	A	G	304.07	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=1;HaplotypeScore=31.22;MQ=47.58;MQ0=0;QD=3.07;SB=-149.93	GT:AD:DP:GL:GQ	0/1:75,24:82:-58.40,-24.71,-264.98:99
-chr1	3775067	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=55.99;MQ=43.63;MQ0=2;OQ=741.54;QD=4.41;SB=-115.85	GT:AD:DP:GL:GQ	0/1:87,38:131:-206.86,-129.42,-352.70:99
-chr1	3775068	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=171;Dels=0.00;HRun=2;HaplotypeScore=57.14;MQ=43.69;MQ0=2;OQ=621.12;QD=3.63;SB=-22.34	GT:AD:DP:GL:GQ	0/1:130,41:133:-105.49,-40.09,-359.21:99
-chr1	3775097	.	C	T	202.73	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=156;Dels=0.02;HRun=0;HaplotypeScore=180.15;MQ=42.01;MQ0=2;QD=1.30;SB=-48.46	GT:AD:DP:GL:GQ	0/1:127,21:125:-62.81,-39.25,-356.59:99
-chr1	3775132	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=0;HaplotypeScore=17.94;MQ=41.24;MQ0=3;OQ=65.49;QD=0.68;SB=-47.12	GT:AD:DP:GL:GQ	0/1:77,9:78:-49.90,-40.06,-295.84:98.32
-chr1	3779522	rs11581471	A	G	100.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.41;MQ0=0;OQ=1287.54;QD=29.26;SB=-667.82	GT:AD:DP:GL:GQ	1/1:0,44:42:-132.38,-12.67,-0.05:99
-chr1	3779990	rs12130391	G	A	164	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.47;MQ0=0;OQ=2160.23;QD=35.41;SB=-916.74	GT:AD:DP:GL:GQ	1/1:0,60:57:-219.63,-17.18,-0.03:99
-chr1	3780767	.	T	C	4.63	PASS	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=30.96;MQ0=11;OQ=368.82;QD=6.36;SB=-104.61	GT:AD:DP:GL:GQ	0/1:34,24:38:-51.63,-11.46,-83.55:99
-chr1	3781074	rs10752727	C	T	2.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=7.70;MQ=37.12;MQ0=12;OQ=1286.15;QD=21.08;SB=-457.95	GT:AD:DP:GL:GQ	1/1:3,58:36:-135.18,-10.85,-2.98:78.66
-chr1	3783772	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=19;HaplotypeScore=32.14;MQ=55.75;MQ0=0;OQ=200.26;QD=4.01;SB=53.19	GT:AD:DP:GL:GQ	0/1:32,18:38:-34.76,-11.45,-99.41:99
-chr1	3784133	rs12132240	C	T	668.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.52;MQ0=0;OQ=2396.10;QD=39.93;SB=-998.03	GT:AD:DP:GL:GQ	1/1:0,60:60:-243.21,-18.07,-0.02:99
-chr1	3785251	rs10737189	T	C	42.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=4.18;MQ=59.45;MQ0=0;OQ=2617.88;QD=31.17;SB=-945.37	GT:AD:DP:GL:GQ	1/1:0,84:80:-265.43,-24.12,-0.06:99
-chr1	3786402	rs12071660	G	A	151.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2743.00;QD=38.63;SB=-1108.49	GT:AD:DP:GL:GQ	1/1:0,71:69:-277.90,-20.79,-0.02:99
-chr1	3787079	rs4074710	T	C	1.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=9.84;MQ=58.78;MQ0=0;OQ=1684.95;QD=27.18;SB=-797.66	GT:AD:DP:GL:GQ	1/1:2,60:56:-176.09,-16.89,-4.01:99
-chr1	3787169	rs61768959	C	T	435.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1824.58;QD=38.82;SB=-789.07	GT:AD:DP:GL:GQ	1/1:0,47:46:-186.05,-13.86,-0.01:99
-chr1	3787855	rs4073324	C	T	458.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=1383.49;QD=37.39;SB=-414.06	GT:AD:DP:GL:GQ	1/1:0,37:37:-141.95,-11.15,-0.02:99
-chr1	3787909	rs4073323	A	G	2.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=3.99;MQ=59.35;MQ0=0;OQ=1345.64;QD=32.04;SB=-424.45	GT:AD:DP:GL:GQ	1/1:0,42:40:-138.17,-12.05,-0.02:99
-chr1	3788260	rs12084944	C	T	298.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=888.25;QD=37.01;SB=-436.08	GT:AD:DP:GL:GQ	1/1:0,24:23:-92.42,-6.93,-0.01:69.22
-chr1	3788534	rs12030906	T	C	0.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.02;HRun=0;HaplotypeScore=9.00;MQ=56.58;MQ0=0;OQ=1607.45;QD=29.23;SB=-436.47	GT:AD:DP:GL:GQ	1/1:0,54:48:-164.35,-14.16,-0.02:99
-chr1	3789424	rs4382652	G	A	2153.41	Indel	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=4.66;MQ=56.10;MQ0=0;QD=35.30;SB=-1010.66	GT:AD:DP:GL:GQ	1/1:0,61:57:-218.95,-17.18,-0.03:99
-chr1	3790102	rs3205087	A	G	382.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.28;MQ0=0;OQ=1027.83;QD=26.35;SB=-300.09	GT:AD:DP:GL:GQ	1/1:0,39:35:-106.42,-10.57,-0.05:99
-chr1	3790340	rs7555538	G	T	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=8;HaplotypeScore=0.92;MQ=59.43;MQ0=0;OQ=2444.86;QD=33.49;SB=-1058.90	GT:AD:DP:GL:GQ	1/1:0,73:70:-248.10,-21.09,-0.03:99
-chr1	3791107	rs10909817	T	G	151.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.65;MQ=57.75;MQ0=0;OQ=1681.31;QD=32.33;SB=-830.07	GT:AD:DP:GL:GQ	1/1:0,51:49:-171.73,-14.76,-0.02:99
-chr1	3792631	rs11584721	G	C	5.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=5.57;MQ=57.48;MQ0=0;OQ=2243.27;QD=40.06;SB=-1057.19	GT:AD:DP:GL:GQ	1/1:1,55:53:-227.93,-15.97,-0.02:99
-chr1	3793561	rs12136187	C	A	227.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.95;MQ0=0;OQ=1328.46;QD=34.06;SB=-683.01	GT:AD:DP:GL:GQ	1/1:0,39:37:-136.44,-11.15,-0.01:99
-chr1	3793615	rs7367066	T	C	611.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.19;MQ0=0;OQ=1618.23;QD=29.97;SB=-707.63	GT:AD:DP:GL:GQ	1/1:0,53:51:-165.45,-15.38,-0.04:99
-chr1	3795300	rs6678851	C	T	1.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=5.47;MQ=59.65;MQ0=0;OQ=2468.27;QD=37.97;SB=-809.33	GT:AD:DP:GL:GQ	1/1:0,65:63:-250.43,-18.98,-0.02:99
-chr1	3795934	rs4075974	G	A	558.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.49;MQ0=0;OQ=2140.67;QD=39.64;SB=-940.34	GT:AD:DP:GL:GQ	1/1:0,54:54:-217.66,-16.27,-0.01:99
-chr1	3796218	rs10909819	T	C	98.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=58.14;MQ0=0;OQ=2198.60;QD=32.33;SB=-948.97	GT:AD:DP:GL:GQ	1/1:0,68:64:-223.47,-19.28,-0.03:99
-chr1	3796503	rs4520357	T	A	245.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.09;MQ0=0;OQ=3186.37;QD=35.40;SB=-1505.31	GT:AD:DP:GL:GQ	1/1:0,90:85:-322.25,-25.60,-0.02:99
-chr1	3797453	rs4274008	G	C	114.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=1.18;MQ=59.65;MQ0=0;OQ=2739.80;QD=42.15;SB=-1186.93	GT:AD:DP:GL:GQ	1/1:0,65:64:-277.59,-19.29,-0.02:99
-chr1	3798031	rs6701422	T	C	38.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=4.04;MQ=51.74;MQ0=0;OQ=1832.37;QD=30.04;SB=-733.76	GT:AD:DP:GL:GQ	1/1:0,60:57:-186.87,-17.19,-0.05:99
-chr1	3798222	rs4446914	G	A	207.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.90;MQ=50.14;MQ0=0;OQ=2015.61;QD=38.03;SB=-988.99	GT:AD:DP:GL:GQ	1/1:0,53:52:-205.17,-15.67,-0.02:99
-chr1	3798375	.	A	G	51.46	PASS	AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=16.12;MQ0=4;OQ=176.38;QD=13.57;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,13:6:-21.21,-1.81,-0.00:18.05
-chr1	3798911	rs12757258	A	C	37.05	LowQual	AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.57;MQ0=1;QD=7.41;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,3:2:-7.11,-0.60,-0.00:6.02
-chr1	3798957	rs12757292	A	C	18.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.60;MQ0=1;OQ=75.37;QD=3.14;SB=-10.00	GT:AD:DP:GL:GQ	0/1:11,13:13:-14.74,-3.92,-26.95:99
-chr1	3799283	rs11807227	G	A	605.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.57;MQ0=0;OQ=2371.97;QD=38.88;SB=-744.48	GT:AD:DP:GL:GQ	1/1:0,61:60:-240.80,-18.08,-0.02:99
-chr1	3800246	rs4568776	A	G	199.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=2257.59;QD=31.80;SB=-934.52	GT:AD:DP:GL:GQ	1/1:0,71:68:-229.39,-20.50,-0.04:99
-chr1	3801063	rs7515869	A	T	278.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=61.08;MQ0=0;OQ=1948.49;QD=33.03;SB=-981.77	GT:AD:DP:GL:GQ	1/1:0,57:54:-198.46,-16.27,-0.03:99
-chr1	3801228	rs6674160	G	A	506.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.72;MQ0=0;OQ=1203.93;QD=37.62;SB=-496.15	GT:AD:DP:GL:GQ	1/1:0,32:32:-124.00,-9.65,-0.02:96.29
-chr1	3801965	rs10909822	A	C	705.90	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=42.43;MQ0=0;QD=30.69;SB=-332.99	GT:AD:DP:GL:GQ	1/1:1,22:22:-74.19,-6.63,-0.02:66.14
-chr1	3801968	.	T	A	440.70	SnpCluster	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=38.89;MQ0=0;QD=11.60;SB=-170.81	GT:AD:DP:GL:GQ	0/1:21,17:32:-56.99,-9.64,-61.90:99
-chr1	3801971	.	G	T	508.15	SnpCluster	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=35.42;MQ0=0;QD=14.52;SB=-198.56	GT:AD:DP:GL:GQ	0/1:17,18:35:-64.64,-10.54,-61.42:99
-chr1	3801978	.	G	C	1059.09	Indel;SnpCluster	AC=2;AF=1.00;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=45.04;MQ0=0;QD=40.73;SB=-392.21	GT:AD:DP:GL:GQ	1/1:0,26:25:-109.50,-7.53,-0.01:75.25
-chr1	3802009	rs12133786	A	C	321.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=52.45;MQ0=0;OQ=1401.55;QD=33.37;SB=-709.03	GT:AD:DP:GL:GQ	1/1:0,42:41:-143.76,-12.35,-0.02:99
-chr1	3802570	rs10797352	T	C	148.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.68;MQ0=0;OQ=1740.38;QD=32.84;SB=-623.49	GT:AD:DP:GL:GQ	1/1:0,53:51:-177.65,-15.37,-0.03:99
-chr1	3802708	rs10797353	C	G	720.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2712.05;QD=38.74;SB=-1379.38	GT:AD:DP:GL:GQ	1/1:0,69:70:-279.01,-24.65,-4.23:99
-chr1	3804150	rs10797354	T	C	170.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=59.56;MQ0=0;OQ=1825.12;QD=32.59;SB=-712.23	GT:AD:DP:GL:GQ	1/1:0,56:54:-186.12,-16.27,-0.03:99
-chr1	3804602	rs6658198	T	C	302.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=59.62;MQ0=0;OQ=2079.20;QD=34.65;SB=-977.94	GT:AD:DP:GL:GQ	1/1:0,60:60:-211.53,-18.07,-0.02:99
-chr1	3806368	rs35131135	T	C	13.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.92;MQ=58.87;MQ0=0;OQ=1257.30;QD=30.67;SB=-415.16	GT:AD:DP:GL:GQ	1/1:0,40:36:-129.33,-10.85,-0.01:99
-chr1	3806714	rs61770363	G	A	10.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.71;MQ0=0;OQ=641.87;QD=35.66;SB=-278.65	GT:AD:DP:GL:GQ	1/1:0,18:18:-67.78,-5.43,-0.01:54.17
-chr1	3806753	rs4072725	C	T	77.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.52;MQ0=0;OQ=544.23;QD=34.01;SB=-280.66	GT:AD:DP:GL:GQ	1/1:0,16:15:-58.01,-4.52,-0.01:45.14
-chr1	3808604	rs10797355	T	C	125.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=53.60;MQ0=1;OQ=2350.13;QD=34.56;SB=-914.68	GT:AD:DP:GL:GQ	1/1:0,68:66:-238.63,-19.89,-0.03:99
-chr1	3808731	rs10797356	G	A	43.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=2.07;MQ=58.71;MQ0=0;OQ=2012.52;QD=37.27;SB=-776.06	GT:AD:DP:GL:GQ	1/1:0,54:52:-204.86,-15.67,-0.02:99
-chr1	3809184	rs6672335	A	G	119.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.56;MQ0=0;OQ=1683.69;QD=31.77;SB=-530.84	GT:AD:DP:GL:GQ	1/1:0,53:48:-171.97,-14.46,-0.02:99
-chr1	3809865	rs10909828	G	A	654.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.19;MQ0=0;OQ=2184.41;QD=38.32;SB=-826.35	GT:AD:DP:GL:GQ	1/1:0,57:56:-222.04,-16.87,-0.02:99
-chr1	3809876	rs12139857	G	C	137.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.22;MQ0=0;OQ=2518.12;QD=42.68;SB=-984.74	GT:AD:DP:GL:GQ	1/1:0,59:58:-255.41,-17.48,-0.02:99
-chr1	3811076	rs6687869	G	A	107.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.45;MQ0=0;OQ=1628.97;QD=38.79;SB=-568.34	GT:AD:DP:GL:GQ	1/1:0,42:42:-166.50,-12.65,-0.01:99
-chr1	3811194	rs10797357	G	A	521.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.15;MQ0=0;OQ=1858.19;QD=37.92;SB=-535.68	GT:AD:DP:GL:GQ	1/1:0,49:48:-189.42,-14.46,-0.01:99
-chr1	3812563	rs10909830	C	T	206.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=58.81;MQ0=0;OQ=2305.91;QD=36.60;SB=-919.31	GT:AD:DP:GL:GQ	1/1:0,63:60:-234.20,-18.08,-0.02:99
-chr1	3812792	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=14.74;MQ=58.39;MQ0=0;OQ=154.04;QD=2.80;SB=80.30	GT:AD:DP:GL:GQ	0/1:43,12:42:-31.36,-12.67,-148.77:99
-chr1	3816486	rs35332894	A	G	12.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.52;MQ=58.25;MQ0=1;OQ=1726.98;QD=27.41;SB=-682.71	GT:AD:DP:GL:GQ	1/1:0,63:54:-176.33,-16.29,-0.05:99
-chr1	3817341	rs61770379	C	T	109.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.38;MQ0=0;OQ=1418.14;QD=38.33;SB=-728.97	GT:AD:DP:GL:GQ	1/1:0,37:36:-145.41,-10.84,-0.01:99
-chr1	3819020	rs34825671	C	T	409.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1564.33;QD=39.11;SB=-750.02	GT:AD:DP:GL:GQ	1/1:0,40:40:-160.03,-12.05,-0.01:99
-chr1	3819278	rs35368826	T	C	12.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.26;MQ=60.00;MQ0=0;OQ=1199.67;QD=27.90;SB=-424.22	GT:AD:DP:GL:GQ	1/1:0,43:38:-123.59,-11.46,-0.04:99
-chr1	3819474	rs35583447	A	G	89.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.69;MQ0=0;OQ=1939.06;QD=31.79;SB=-974.91	GT:AD:DP:GL:GQ	1/1:0,61:57:-197.52,-17.18,-0.03:99
-chr1	3819901	rs34284135	A	G	55.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=58.81;MQ0=0;OQ=1296.25;QD=30.15;SB=-641.91	GT:AD:DP:GL:GQ	1/1:0,43:38:-133.23,-11.45,-0.02:99
-chr1	3820479	rs4073647	C	A	185.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.94;MQ=59.55;MQ0=0;OQ=1638.97;QD=32.14;SB=-804.86	GT:AD:DP:GL:GQ	1/1:0,51:47:-167.50,-14.16,-0.02:99
-chr1	3820963	rs35355307	G	A	127.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.69;MQ0=0;OQ=2262.75;QD=37.09;SB=-711.99	GT:AD:DP:GL:GQ	1/1:0,61:59:-229.89,-17.78,-0.03:99
-chr1	3821092	rs35241263	A	G	89.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=58.63;MQ0=0;OQ=1378.97;QD=27.04;SB=-599.21	GT:AD:DP:GL:GQ	1/1:0,51:45:-141.53,-13.58,-0.05:99
-chr1	3821416	rs34803434	G	A	80.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=58.07;MQ0=0;OQ=1633.32;QD=35.51;SB=-688.34	GT:AD:DP:GL:GQ	1/1:1,45:44:-166.94,-13.26,-0.02:99
-chr1	3823053	rs61770387	C	T	609.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=2714.99;QD=39.35;SB=-1139.68	GT:AD:DP:GL:GQ	1/1:0,69:68:-275.10,-20.48,-0.02:99
-chr1	3823181	rs61770388	T	C	199.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.19;MQ0=0;OQ=1728.56;QD=33.24;SB=-864.04	GT:AD:DP:GL:GQ	1/1:0,52:50:-176.46,-15.06,-0.02:99
-chr1	3824979	rs61770390	T	C	82.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=55.31;MQ0=0;OQ=486.55;QD=7.85;SB=-261.22	GT:AD:DP:GL:GQ	0/1:37,25:59:-69.72,-17.78,-147.85:99
-chr1	3824990	.	C	T	3.46	PASS	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=1;HaplotypeScore=3.66;MQ=55.46;MQ0=0;OQ=1251.91;QD=19.56;SB=-545.38	GT:AD:DP:GL:GQ	0/1:27,37:61:-146.86,-18.39,-82.02:99
-chr1	3825051	.	C	A	3.22	PASS	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=2;HaplotypeScore=3.18;MQ=58.29;MQ0=0;OQ=820.60;QD=11.56;SB=-414.89	GT:AD:DP:GL:GQ	0/1:42,29:71:-106.73,-21.38,-145.16:99
-chr1	3825054	.	T	C	10.09	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=3.18;MQ=58.08;MQ0=0;OQ=722.16;QD=10.47;SB=-351.97	GT:AD:DP:GL:GQ	0/1:40,28:65:-95.08,-19.58,-155.89:99
-chr1	3825324	rs61770392	A	T	88.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=57.20;MQ0=0;OQ=1894.97;QD=35.09;SB=-920.36	GT:AD:DP:GL:GQ	1/1:0,54:51:-193.10,-15.37,-0.02:99
-chr1	3827005	.	C	T	22.22	LowQual	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=43.17;MQ0=3;QD=1.48;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,3:9:-8.21,-2.71,-24.78:55.03
-chr1	3827011	.	C	T	25.21	LowQual	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=2.11;MQ=38.99;MQ0=3;QD=1.80;SB=-10.00	GT:AD:DP:GL:GQ	0/1:12,2:8:-8.21,-2.41,-21.31:58.03
-chr1	3830505	rs35265992	A	G	0.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=4;HaplotypeScore=5.22;MQ=58.50;MQ0=0;OQ=970.90;QD=17.34;SB=-315.39	GT:AD:DP:GL:GQ	0/1:20,36:52:-116.04,-15.67,-75.68:99
-chr1	3830738	rs35974482	G	A	171.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.40;MQ=57.87;MQ0=0;OQ=551.40;QD=12.53;SB=-198.84	GT:AD:DP:GL:GQ	0/1:25,19:40:-70.48,-12.05,-78.52:99
-chr1	3830888	rs35314156	G	C	209.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.07;MQ0=0;OQ=668.40;QD=13.37;SB=-257.46	GT:AD:DP:GL:GQ	0/1:30,20:50:-85.20,-15.08,-125.99:99
-chr1	3831972	rs34835780	T	C	632.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.64;MQ0=0;OQ=2285.64;QD=35.16;SB=-1132.81	GT:AD:DP:GL:GQ	1/1:0,65:64:-232.17,-19.28,-0.02:99
-chr1	3833915	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=0;HaplotypeScore=17.15;MQ=47.19;MQ0=1;OQ=288.77;QD=3.66;SB=-113.05	GT:AD:DP:GL:GQ	0/1:64,15:78:-55.66,-23.49,-226.25:99
-chr1	3895148	.	C	A	18	PASS	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=35.10;MQ0=1;OQ=333.31;QD=9.80;SB=-100.81	GT:AD:DP:GL:GQ	0/1:15,18:23:-43.54,-6.93,-34.49:99
-chr1	3895632	.	G	A	3.06	PASS	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=4;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=959.16;QD=14.11;SB=-372.32	GT:AD:DP:GL:GQ	0/1:38,30:68:-119.69,-20.49,-137.83:99
-chr1	3895766	rs61770398	T	C	202.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=59.18;MQ0=0;OQ=960.24;QD=12.98;SB=-389.21	GT:AD:DP:GL:GQ	0/1:40,34:73:-121.30,-21.99,-162.55:99
-chr1	3899769	.	C	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=2;HaplotypeScore=8.09;MQ=59.49;MQ0=0;OQ=340.78;QD=7.57;SB=47.18	GT:AD:DP:GL:GQ	0/1:26,19:34:-47.63,-10.27,-85.91:99
-chr1	3902626	rs12073174	A	G	196.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=56.14;MQ0=0;OQ=542.74;QD=11.31;SB=-148.64	GT:AD:DP:GL:GQ	0/1:27,21:46:-71.41,-13.85,-105.98:99
-chr1	3902680	rs61770400	C	T	70.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.09;MQ=59.24;MQ0=0;OQ=954.92;QD=15.65;SB=-346.04	GT:AD:DP:GL:GQ	0/1:29,32:59:-116.56,-17.78,-99.06:99
-chr1	3903888	.	C	T	983.33	SnpCluster	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.15;MQ0=0;QD=17.88;SB=-501.10	GT:AD:DP:GL:GQ	0/1:24,31:52:-117.28,-15.67,-81.69:99
-chr1	3903897	rs12076404	C	T	1044.63	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.20;MQ0=0;QD=18.01;SB=-538.06	GT:AD:DP:GL:GQ	0/1:25,33:54:-124.01,-16.27,-82.66:99
-chr1	3903898	.	G	A	621.65	SnpCluster	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.17;MQ0=0;QD=11.10;SB=-272.76	GT:AD:DP:GL:GQ	0/1:33,23:52:-81.12,-15.67,-110.15:99
-chr1	3904122	.	C	T	64.01	PASS	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=58.92;MQ0=0;OQ=1312.00;QD=16.00;SB=-449.98	GT:AD:DP:GL:GQ	0/1:43,39:81:-158.89,-24.40,-148.69:99
-chr1	3904123	rs7518198	G	A	275.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=58.92;MQ0=0;OQ=1318.95;QD=16.08;SB=-404.76	GT:AD:DP:GL:GQ	0/1:38,44:78:-158.67,-23.50,-132.87:99
-chr1	3904259	rs55651676	C	G	11.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=3;HaplotypeScore=0.67;MQ=58.80;MQ0=0;OQ=719.49;QD=18.45;SB=-354.47	GT:AD:DP:GL:GQ	0/1:17,22:35:-85.79,-10.56,-59.36:99
-chr1	3904673	rs56300127	T	C	189.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.07;MQ0=0;OQ=384.21;QD=11.30;SB=-194.60	GT:AD:DP:GL:GQ	0/1:17,17:31:-51.05,-9.34,-58.99:99
-chr1	3905021	rs10915614	A	G	3.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=4;HaplotypeScore=1.21;MQ=59.48;MQ0=0;OQ=428.89;QD=9.75;SB=-152.44	GT:AD:DP:GL:GQ	0/1:24,19:41:-58.53,-12.36,-93.35:99
-chr1	3905038	.	G	A	50.50	PASS	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.41;MQ0=0;OQ=477.39;QD=12.24;SB=-188.87	GT:AD:DP:GL:GQ	0/1:22,17:37:-62.18,-11.16,-67.50:99
-chr1	3905246	.	C	T	93.17	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=58.57;MQ0=0;OQ=1011.86;QD=16.32;SB=-440.98	GT:AD:DP:GL:GQ	0/1:30,32:58:-121.96,-17.49,-85.78:99
-chr1	3905920	rs7548668	T	C	26.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=6.64;MQ=59.57;MQ0=0;OQ=666.76;QD=12.35;SB=-179.62	GT:AD:DP:GL:GQ	0/1:27,27:46:-83.82,-13.86,-87.80:99
-chr1	3906227	rs9793287	T	C	337.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.61;MQ0=0;OQ=444.12;QD=9.25;SB=-215.36	GT:AD:DP:GL:GQ	0/1:27,21:46:-61.57,-13.87,-101.57:99
-chr1	3906248	rs12562706	C	A	152.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=59.59;MQ0=0;OQ=415.45;QD=9.23;SB=-231.91	GT:AD:DP:GL:GQ	0/1:25,20:41:-57.18,-12.35,-86.80:99
-chr1	3906531	rs7526903	G	A	280.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.63;MQ0=0;OQ=909.30;QD=17.83;SB=-442.97	GT:AD:DP:GL:GQ	0/1:23,27:47:-108.38,-14.16,-65.40:99
-chr1	3906648	rs7551771	C	T	37.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=2.80;MQ=60.06;MQ0=0;OQ=776.93;QD=15.54;SB=-354.36	GT:AD:DP:GL:GQ	0/1:26,24:48:-95.43,-14.46,-92.96:99
-chr1	3906868	rs7519349	A	G	578.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=764.11;QD=13.64;SB=-362.95	GT:AD:DP:GL:GQ	0/1:26,30:56:-96.58,-16.88,-105.57:99
-chr1	3906970	rs7519458	A	G	232.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.80;MQ=60.00;MQ0=0;OQ=762.22;QD=13.14;SB=-199.60	GT:AD:DP:GL:GQ	0/1:26,31:57:-96.69,-17.19,-106.25:99
-chr1	3907888	rs10799162	T	C	190.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=58.79;MQ0=0;OQ=719.58;QD=13.33;SB=-230.44	GT:AD:DP:GL:GQ	0/1:27,27:53:-91.22,-15.97,-102.46:99
-chr1	3907889	rs10799163	G	T	86.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.13;MQ=58.79;MQ0=0;OQ=758.50;QD=14.05;SB=-193.54	GT:AD:DP:GL:GQ	0/1:27,26:51:-94.50,-15.37,-86.70:99
-chr1	3907912	rs10915345	G	A	203.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=59.62;MQ0=0;OQ=1037.45;QD=17.01;SB=-258.26	GT:AD:DP:GL:GQ	0/1:29,32:57:-124.21,-17.18,-83.11:99
-chr1	3909896	rs6683165	G	A	201.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=59.62;MQ0=0;OQ=837.44;QD=12.88;SB=-252.13	GT:AD:DP:GL:GQ	0/1:38,27:62:-105.71,-18.68,-120.77:99
-chr1	3910104	rs10799194	C	T	90.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=1.69;MQ=60.00;MQ0=0;OQ=794.06;QD=13.23;SB=-418.44	GT:AD:DP:GL:GQ	0/1:34,26:57:-99.88,-17.19,-98.75:99
-chr1	3919557	rs9426474	A	G	111.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.97;MQ0=0;OQ=1753.83;QD=29.73;SB=-828.62	GT:AD:DP:GL:GQ	1/1:0,59:55:-179.01,-16.59,-0.05:99
-chr1	3922104	rs9426475	T	C	209.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=54.82;MQ0=0;OQ=1570.14;QD=28.55;SB=-720.64	GT:AD:DP:GL:GQ	1/1:0,55:50:-160.65,-15.09,-0.06:99
-chr1	3922325	rs10915469	T	C	562.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1863.57;QD=28.24;SB=-798.65	GT:AD:DP:GL:GQ	1/1:0,66:58:-189.99,-17.49,-0.05:99
-chr1	3922572	rs7540846	C	T	41.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=2;HaplotypeScore=0.57;MQ=53.34;MQ0=0;OQ=2905.34;QD=34.59;SB=-1359.03	GT:AD:DP:GL:GQ	1/1:0,81:75:-294.15,-22.60,-0.03:99
-chr1	3922839	rs7516192	G	C	540.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.04;MQ0=0;OQ=2588.44;QD=42.43;SB=-1244.89	GT:AD:DP:GL:GQ	1/1:0,61:60:-262.44,-18.08,-0.02:99
-chr1	3922855	rs9426476	A	G	185.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.74;MQ=58.63;MQ0=0;OQ=2064.09;QD=34.40;SB=-842.35	GT:AD:DP:GL:GQ	1/1:0,60:58:-210.01,-17.47,-0.02:99
-chr1	3922974	rs7541241	C	A	552.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.64;MQ0=0;OQ=1520.98;QD=33.80;SB=-673.30	GT:AD:DP:GL:GQ	1/1:0,45:44:-155.71,-13.26,-0.03:99
-chr1	3923246	rs9426498	T	C	9.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=52.33;MQ0=0;OQ=1450.84;QD=25.91;SB=-720.70	GT:AD:DP:GL:GQ	1/1:0,56:46:-148.71,-13.88,-0.05:99
-chr1	3923458	rs9426499	A	C	507.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1349.47;QD=30.67;SB=-364.89	GT:AD:DP:GL:GQ	1/1:0,44:42:-138.57,-12.66,-0.04:99
-chr1	3923596	rs9426477	A	G	619.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=2188.14;QD=34.73;SB=-945.36	GT:AD:DP:GL:GQ	1/1:0,63:61:-222.42,-18.37,-0.02:99
-chr1	3923941	rs6698811	T	C	664.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=2773.83;QD=33.83;SB=-1404.50	GT:AD:DP:GL:GQ	1/1:0,82:80:-281.00,-24.10,-0.03:99
-chr1	3936055	rs10753378	T	C	376.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.51;MQ0=0;OQ=543.43;QD=11.56;SB=-218.27	GT:AD:DP:GL:GQ	0/1:23,24:45:-71.19,-13.57,-90.09:99
-chr1	3938219	.	C	T	61.19	PASS	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.45;MQ=59.60;MQ0=0;OQ=740.10;QD=12.76;SB=-319.83	GT:AD:DP:GL:GQ	0/1:30,28:53:-93.28,-15.99,-88.25:99
-chr1	3940015	rs4654525	C	T	311.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.10;MQ0=0;OQ=1004.75;QD=15.00;SB=-479.00	GT:AD:DP:GL:GQ	0/1:36,31:66:-123.64,-19.88,-133.78:99
-chr1	3942839	rs60972376	A	C	11.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=4.30;MQ=58.67;MQ0=0;OQ=585.81;QD=11.96;SB=-197.90	GT:AD:DP:GL:GQ	0/1:20,28:43:-74.82,-12.96,-73.58:99
-chr1	3942909	rs55887893	C	T	197.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.21;MQ=60.00;MQ0=0;OQ=588.30;QD=11.77;SB=-314.85	GT:AD:DP:GL:GQ	0/1:29,21:47:-76.28,-14.17,-92.23:99
-chr1	3944651	rs59118111	G	C	246.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=60.00;MQ0=0;OQ=1068.67;QD=16.44;SB=-449.44	GT:AD:DP:GL:GQ	0/1:32,33:64:-129.45,-19.30,-140.55:99
-chr1	3945187	rs4654538	G	A	29.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.53;MQ=58.81;MQ0=0;OQ=1094.72;QD=19.90;SB=-430.80	GT:AD:DP:GL:GQ	0/1:23,32:55:-129.32,-16.57,-83.23:99
-chr1	3947137	rs4654543	T	C	110.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=60.00;MQ0=0;OQ=382.96;QD=9.82;SB=-135.53	GT:AD:DP:GL:GQ	0/1:21,18:38:-53.04,-11.46,-84.39:99
-chr1	3947479	rs10449244	C	A	197.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=60.00;MQ0=0;OQ=744.81;QD=13.07;SB=-230.89	GT:AD:DP:GL:GQ	0/1:29,28:53:-93.73,-15.97,-94.52:99
-chr1	3948534	rs4654544	A	G	534.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=551.19;QD=12.53;SB=-251.96	GT:AD:DP:GL:GQ	0/1:21,23:44:-71.67,-13.27,-84.12:99
-chr1	3949636	rs4654436	T	C	195.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=3.10;MQ=59.16;MQ0=0;OQ=834.97;QD=11.60;SB=-298.88	GT:AD:DP:GL:GQ	0/1:38,34:66:-106.67,-19.89,-140.32:99
-chr1	3949646	rs6426416	A	T	32.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=3;HaplotypeScore=2.47;MQ=59.20;MQ0=0;OQ=1168.58;QD=15.38;SB=-401.17	GT:AD:DP:GL:GQ	0/1:38,38:72:-141.84,-21.70,-126.75:99
-chr1	3950380	.	A	G	266.35	PASS	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=1356.42;QD=15.96;SB=-652.62	GT:AD:DP:GL:GQ	0/1:40,45:85:-164.53,-25.60,-164.89:99
-chr1	3950813	rs10737411	A	G	175.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=1;HaplotypeScore=2.09;MQ=59.83;MQ0=0;OQ=1386.28;QD=12.84;SB=-502.53	GT:AD:DP:GL:GQ	0/1:55,53:107:-174.15,-32.24,-226.13:99
-chr1	3951883	rs6657331	G	C	1.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=2.77;MQ=59.14;MQ0=0;OQ=976.24;QD=22.70;SB=-437.36	GT:AD:DP:GL:GQ	0/1:16,27:40:-112.97,-12.06,-59.28:99
-chr1	3951915	rs12145443	C	T	0.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=14.98;MQ=58.72;MQ0=0;OQ=829.82;QD=21.84;SB=-313.85	GT:AD:DP:GL:GQ	0/1:13,25:37:-97.41,-11.15,-45.43:99
-chr1	3952816	rs10799236	A	G	574.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=747.27;QD=14.10;SB=-330.89	GT:AD:DP:GL:GQ	0/1:27,26:52:-93.67,-15.66,-106.05:99
-chr1	3953295	rs12038964	T	C	361.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.86;MQ0=0;OQ=750.82;QD=12.31;SB=-348.04	GT:AD:DP:GL:GQ	0/1:30,31:60:-96.45,-18.08,-120.40:99
-chr1	3953370	rs12040628	A	G	147.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.81;MQ=59.55;MQ0=0;OQ=749.75;QD=14.70;SB=-277.27	GT:AD:DP:GL:GQ	0/1:21,30:49:-93.03,-14.77,-83.59:99
-chr1	3954832	rs9426500	A	C	437.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=970.97;QD=16.46;SB=-363.09	GT:AD:DP:GL:GQ	0/1:25,34:59:-118.15,-17.77,-92.14:99
-chr1	3955140	rs7413013	G	C	5.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.97;MQ=59.17;MQ0=0;OQ=1282.99;QD=22.91;SB=-362.10	GT:AD:DP:GL:GQ	0/1:21,35:56:-148.46,-16.87,-92.34:99
-chr1	3955487	rs9426501	T	C	61.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=4.29;MQ=58.95;MQ0=0;OQ=1025.38;QD=16.54;SB=-268.62	GT:AD:DP:GL:GQ	0/1:26,36:60:-123.90,-18.08,-97.56:99
-chr1	3956324	rs28609919	G	C	274.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=59.69;MQ0=0;OQ=890.13;QD=14.84;SB=-464.74	GT:AD:DP:GL:GQ	0/1:33,27:59:-110.08,-17.78,-139.21:99
-chr1	3957249	rs12756251	G	A	25.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=2;HaplotypeScore=3.32;MQ=59.14;MQ0=0;OQ=1510.62;QD=18.65;SB=-581.41	GT:AD:DP:GL:GQ	0/1:36,45:78:-177.84,-23.50,-121.43:99
-chr1	3957262	rs12733769	T	A	184.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=3.12;MQ=59.13;MQ0=0;OQ=1410.63;QD=17.63;SB=-590.40	GT:AD:DP:GL:GQ	0/1:34,46:77:-167.55,-23.20,-118.80:99
-chr1	3957348	rs12135298	A	G	336.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=58.25;MQ0=0;OQ=781.36;QD=12.21;SB=-403.89	GT:AD:DP:GL:GQ	0/1:34,30:63:-100.41,-18.99,-132.61:99
-chr1	3959579	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=7.87;MQ=33.13;MQ0=5;OQ=83.58;QD=1.58;SB=-67.89	GT:AD:DP:GL:GQ	0/1:44,9:38:-23.11,-11.47,-97.21:99
-chr1	3959589	.	G	A	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=1;HaplotypeScore=8.30;MQ=33.13;MQ0=5;OQ=210.60;QD=3.76;SB=-42.01	GT:AD:DP:GL:GQ	0/1:42,14:42:-37.00,-12.66,-114.99:99
-chr1	3959610	rs4654559	T	C	0.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=19.50;MQ=38.33;MQ0=4;OQ=745.10;QD=13.55;SB=-325.28	GT:AD:DP:GL:GQ	0/1:20,35:43:-90.76,-12.97,-56.11:99
-chr1	3959618	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=35.45;MQ=40.78;MQ0=4;OQ=377.28;QD=6.50;SB=-163.72	GT:AD:DP:GL:GQ	0/1:35,17:42:-66.15,-25.14,-90.45:99
-chr1	3959638	rs12137425	A	G	6.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=49.20;MQ0=1;OQ=205.57;QD=4.28;SB=-109.83	GT:AD:DP:GL:GQ	0/1:33,15:40:-35.90,-12.06,-107.08:99
-chr1	3959766	.	G	A	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=11.71;MQ=40.06;MQ0=2;OQ=205.60;QD=3.54;SB=-53.76	GT:AD:DP:GL:GQ	0/1:44,14:49:-38.61,-14.76,-139.54:99
-chr1	3959787	rs11807610	T	C	0.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=13.45;MQ=43.41;MQ0=2;OQ=585.11;QD=10.45;SB=-259.35	GT:AD:DP:GL:GQ	0/1:22,34:43:-74.76,-12.96,-79.59:99
-chr1	3959815	rs10915563	A	G	47.44	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=13.21;MQ=50.51;MQ0=1;QD=0.72;SB=62.23	GT:AD:DP:GL:GQ	0/1:56,10:52:-23.70,-15.67,-173.58:80.28
-chr1	3959825	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=18.02;MQ=51.36;MQ0=1;OQ=581.75;QD=8.19;SB=-258.36	GT:AD:DP:GL:GQ	0/1:43,28:61:-79.84,-18.38,-149.14:99
-chr1	3959826	.	A	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=1;HaplotypeScore=9.14;MQ=50.86;MQ0=1;OQ=291.12;QD=3.93;SB=-139.48	GT:AD:DP:GL:GQ	0/1:51,23:56:-49.27,-16.88,-163.75:99
-chr1	3959854	rs10799245	C	A	521.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.17;MQ0=0;OQ=879.17;QD=14.65;SB=-268.32	GT:AD:DP:GL:GQ	0/1:29,31:55:-107.78,-16.58,-78.49:99
-chr1	3961215	rs6670453	G	C	331.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=59.13;MQ0=0;OQ=833.59;QD=15.73;SB=-292.89	GT:AD:DP:GL:GQ	0/1:29,24:53:-102.62,-15.98,-127.58:99
-chr1	3961230	rs6672877	G	T	118.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.94;MQ=59.07;MQ0=0;OQ=633.10;QD=12.66;SB=-213.34	GT:AD:DP:GL:GQ	0/1:27,23:49:-81.35,-14.76,-89.22:99
-chr1	3961237	rs12045715	G	A	510.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=793.63;QD=15.56;SB=-285.83	GT:AD:DP:GL:GQ	0/1:26,25:51:-98.03,-15.38,-79.59:99
-chr1	3961468	rs12045781	G	A	286.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=60.00;MQ0=0;OQ=606.20;QD=13.78;SB=-238.18	GT:AD:DP:GL:GQ	0/1:24,20:42:-76.57,-12.66,-72.65:99
-chr1	3961548	rs10799247	A	G	169.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.55;MQ=58.33;MQ0=0;OQ=674.03;QD=12.04;SB=-151.92	GT:AD:DP:GL:GQ	0/1:31,24:52:-86.36,-15.67,-108.75:99
-chr1	3962010	rs4654565	G	A	105.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=336.97;QD=12.96;SB=-103.61	GT:AD:DP:GL:GQ	0/1:14,12:25:-44.52,-7.54,-43.04:99
-chr1	3962589	rs4654447	A	G	258.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=59.65;MQ0=0;OQ=712.70;QD=13.45;SB=-356.22	GT:AD:DP:GL:GQ	0/1:26,27:50:-89.62,-15.07,-95.62:99
-chr1	3962703	rs4654448	A	C	265.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=756.85;QD=13.52;SB=-251.86	GT:AD:DP:GL:GQ	0/1:29,27:55:-95.53,-16.56,-103.20:99
-chr1	3962856	rs4654567	T	C	95.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.58;MQ=59.17;MQ0=0;OQ=415.90;QD=9.24;SB=-159.46	GT:AD:DP:GL:GQ	0/1:25,20:42:-57.53,-12.66,-94.60:99
-chr1	3962899	rs4654449	G	A	419.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=60.00;MQ0=0;OQ=648.86;QD=14.75;SB=-335.88	GT:AD:DP:GL:GQ	0/1:22,22:42:-80.82,-12.65,-78.42:99
-chr1	3963307	rs7520607	T	C	230.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.28;MQ=58.42;MQ0=0;OQ=845.59;QD=14.58;SB=-424.34	GT:AD:DP:GL:GQ	0/1:26,32:53:-103.81,-15.97,-95.34:99
-chr1	3963607	rs4654568	T	G	463.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.07;MQ0=0;OQ=931.94;QD=16.64;SB=-413.80	GT:AD:DP:GL:GQ	0/1:24,32:56:-113.34,-16.87,-88.78:99
-chr1	3963626	rs12027462	C	T	248.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=57.57;MQ0=0;OQ=963.52;QD=17.21;SB=-429.93	GT:AD:DP:GL:GQ	0/1:26,30:55:-116.20,-16.57,-93.29:99
-chr1	3963784	rs4654451	G	A	171.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=59.79;MQ0=0;OQ=912.02;QD=16.00;SB=-225.51	GT:AD:DP:GL:GQ	0/1:28,28:53:-110.46,-15.98,-78.09:99
-chr1	3964643	rs6426429	A	G	60.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=1.27;MQ=59.56;MQ0=0;OQ=582.81;QD=11.00;SB=-285.59	GT:AD:DP:GL:GQ	0/1:28,25:51:-76.94,-15.38,-106.26:99
-chr1	3965132	rs4074993	C	G	325.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.87;MQ=59.28;MQ0=0;OQ=814.87;QD=14.05;SB=-345.07	GT:AD:DP:GL:GQ	0/1:34,24:55:-101.37,-16.60,-121.74:99
-chr1	3965479	rs4074994	T	C	268.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=52.28;MQ0=0;OQ=617.78;QD=12.36;SB=-300.36	GT:AD:DP:GL:GQ	0/1:25,25:49:-79.83,-14.77,-98.86:99
-chr1	3965536	rs57323923	T	C	0.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=4;HaplotypeScore=2.11;MQ=50.55;MQ0=0;OQ=424.15;QD=8.48;SB=-173.38	GT:AD:DP:GL:GQ	0/1:29,21:47:-59.86,-14.17,-115.12:99
-chr1	3965975	.	C	G	7.70	PASS	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=58.67;MQ0=0;OQ=589.92;QD=12.04;SB=-25.38	GT:AD:DP:GL:GQ	0/1:32,17:46:-76.14,-13.87,-119.93:99
-chr1	3965977	.	T	C	0.69	PASS	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=2;HaplotypeScore=1.11;MQ=58.22;MQ0=0;OQ=427.57;QD=8.55;SB=-16.87	GT:AD:DP:GL:GQ	0/1:33,17:49:-60.80,-14.76,-127.29:99
-chr1	3966027	rs7414863	A	C	144.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.13;MQ0=0;OQ=452.26;QD=9.42;SB=-62.85	GT:AD:DP:GL:GQ	0/1:27,21:45:-62.07,-13.56,-92.65:99
-chr1	3966540	rs3935559	C	G	391.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=1031.71;QD=18.42;SB=-312.99	GT:AD:DP:GL:GQ	0/1:24,32:56:-123.36,-16.90,-103.47:99
-chr1	3966816	.	G	A	1.68	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=5.13;MQ=57.97;MQ0=0;OQ=1415.89;QD=20.52;SB=-484.12	GT:AD:DP:GL:GQ	0/1:24,45:61:-163.26,-18.38,-64.39:99
-chr1	3967294	rs12747294	C	T	4.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=8.87;MQ=56.15;MQ0=1;OQ=813.80;QD=16.95;SB=-391.14	GT:AD:DP:GL:GQ	0/1:22,26:45:-98.22,-13.56,-71.93:99
-chr1	3967372	rs6702213	C	T	194.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=34.49;MQ0=0;OQ=718.26;QD=12.17;SB=-239.54	GT:AD:DP:GL:GQ	0/1:33,26:54:-91.39,-16.28,-98.59:99
-chr1	3967404	rs6661264	T	C	167.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=40.81;MQ0=0;OQ=475.36;QD=8.80;SB=-244.91	GT:AD:DP:GL:GQ	0/1:34,20:52:-66.49,-15.67,-131.05:99
-chr1	3967405	rs6675434	G	A	377.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=40.63;MQ0=0;OQ=533.67;QD=9.70;SB=-290.77	GT:AD:DP:GL:GQ	0/1:34,21:52:-72.31,-15.66,-122.28:99
-chr1	3967434	rs12747604	C	T	38.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=46.12;MQ0=0;OQ=331.44;QD=7.71;SB=-108.07	GT:AD:DP:GL:GQ	0/1:29,14:41:-48.79,-12.36,-91.55:99
-chr1	3967444	rs56081307	C	A	64.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=45.65;MQ0=0;OQ=391.03;QD=8.32;SB=-188.48	GT:AD:DP:GL:GQ	0/1:31,16:44:-55.64,-13.25,-103.38:99
-chr1	3967458	rs6661363	T	C	158.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=46.22;MQ0=0;OQ=383.22;QD=7.82;SB=-172.51	GT:AD:DP:GL:GQ	0/1:29,19:44:-54.87,-13.26,-104.62:99
-chr1	3967912	rs6675979	G	A	278.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=58.64;MQ0=0;OQ=1206.49;QD=19.46;SB=-623.12	GT:AD:DP:GL:GQ	0/1:25,37:60:-142.02,-18.08,-76.63:99
-chr1	3968006	rs12731145	A	G	28.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=5.76;MQ=59.49;MQ0=0;OQ=439.53;QD=9.77;SB=-228.43	GT:AD:DP:GL:GQ	0/1:27,18:43:-60.19,-12.95,-105.51:99
-chr1	3968073	rs6426431	G	A	223.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=59.56;MQ0=0;OQ=482.88;QD=9.29;SB=-221.45	GT:AD:DP:GL:GQ	0/1:34,18:50:-66.64,-15.07,-119.13:99
-chr1	3968105	rs12744667	G	A	365.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=59.56;MQ0=0;OQ=827.90;QD=15.62;SB=-433.93	GT:AD:DP:GL:GQ	0/1:27,26:51:-101.44,-15.36,-92.63:99
-chr1	3968106	rs55866108	A	G	217.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=59.57;MQ0=0;OQ=738.88;QD=13.68;SB=-284.42	GT:AD:DP:GL:GQ	0/1:27,27:53:-93.14,-15.96,-108.96:99
-chr1	3968537	rs12753281	C	G	269.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.90;MQ0=0;OQ=1244.08;QD=14.99;SB=-559.96	GT:AD:DP:GL:GQ	0/1:45,38:83:-152.72,-25.03,-193.42:99
-chr1	3968581	rs12736036	A	G	78.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=3.15;MQ=57.56;MQ0=0;OQ=949.82;QD=11.58;SB=-430.05	GT:AD:DP:GL:GQ	0/1:44,38:77:-121.46,-23.19,-177.75:99
-chr1	3968726	rs34940664	G	T	190.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.33;MQ0=0;OQ=1575.63;QD=16.24;SB=-709.50	GT:AD:DP:GL:GQ	0/1:45,52:96:-189.76,-28.91,-164.22:99
-chr1	3968753	rs35749996	A	G	455.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=1487.59;QD=17.92;SB=-656.99	GT:AD:DP:GL:GQ	0/1:35,48:83:-177.04,-25.00,-145.40:99
-chr1	3968768	rs12753644	C	G	340.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.54;MQ0=0;OQ=1876.77;QD=20.85;SB=-779.42	GT:AD:DP:GL:GQ	0/1:40,50:90:-218.08,-27.12,-169.27:99
-chr1	3968858	rs12045134	A	C	23.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=5.51;MQ=58.42;MQ0=0;OQ=708.96;QD=8.54;SB=-321.59	GT:AD:DP:GL:GQ	0/1:52,31:81:-98.58,-24.40,-189.89:99
-chr1	3968949	rs12047590	G	T	243.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.77;MQ=59.74;MQ0=0;OQ=980.09;QD=13.61;SB=-395.21	GT:AD:DP:GL:GQ	0/1:39,33:71:-122.68,-21.39,-124.97:99
-chr1	3969008	rs12027284	C	T	226.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.68;MQ0=0;OQ=1351.13;QD=18.77;SB=-463.00	GT:AD:DP:GL:GQ	0/1:32,40:69:-159.19,-20.80,-95.94:99
-chr1	3969221	rs12045225	A	G	0.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=9.56;MQ=58.22;MQ0=0;OQ=654.37;QD=13.09;SB=-95.63	GT:AD:DP:GL:GQ	0/1:21,29:44:-81.99,-13.27,-67.60:99
-chr1	3969391	rs12046014	A	G	106.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.88;MQ=58.95;MQ0=0;OQ=580.96;QD=9.37;SB=-244.16	GT:AD:DP:GL:GQ	0/1:36,26:57:-78.56,-17.18,-134.21:99
-chr1	3969440	rs12044268	T	C	521.33	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=58.87;MQ0=0;QD=12.72;SB=-263.94	GT:AD:DP:GL:GQ	0/1:19,21:40:-67.48,-12.06,-76.36:99
-chr1	3969444	rs12048464	G	T	535.50	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.71;MQ0=0;QD=14.88;SB=-256.96	GT:AD:DP:GL:GQ	0/1:18,18:36:-67.68,-10.85,-54.15:99
-chr1	3969450	rs34283588	G	A	563.46	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.55;MQ0=0;QD=17.61;SB=-257.77	GT:AD:DP:GL:GQ	0/1:15,17:30:-68.67,-9.04,-41.92:99
-chr1	3969504	rs12028147	C	A	128.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.50;MQ0=0;OQ=1173.33;QD=18.92;SB=-401.82	GT:AD:DP:GL:GQ	0/1:25,37:62:-139.29,-18.67,-88.93:99
-chr1	3969731	rs35514116	C	A	193.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=2.36;MQ=59.11;MQ0=0;OQ=1169.40;QD=14.99;SB=-425.64	GT:AD:DP:GL:GQ	0/1:38,39:78:-146.50,-26.28,-138.29:99
-chr1	3969738	rs35902612	G	T	87.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=3.60;MQ=59.14;MQ0=0;OQ=1314.22;QD=16.22;SB=-492.89	GT:AD:DP:GL:GQ	0/1:38,43:80:-158.80,-24.09,-135.14:99
-chr1	3969835	rs34306433	G	C	322.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=60.00;MQ0=0;OQ=1225.99;QD=18.03;SB=-578.33	GT:AD:DP:GL:GQ	0/1:31,36:68:-148.71,-22.83,-138.52:99
-chr1	3970192	rs34458454	T	C	115.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=60.00;MQ0=0;OQ=393.81;QD=8.04;SB=-222.38	GT:AD:DP:GL:GQ	0/1:28,21:43:-55.63,-12.97,-98.60:99
-chr1	3970255	rs34994381	G	A	356.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=1045.77;QD=16.09;SB=-475.47	GT:AD:DP:GL:GQ	0/1:34,31:61:-126.25,-18.39,-98.09:99
-chr1	3970431	rs35579324	A	T	318.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.56;MQ0=0;OQ=768.67;QD=14.78;SB=-345.07	GT:AD:DP:GL:GQ	0/1:26,26:52:-95.82,-15.67,-98.48:99
-chr1	3970448	rs35474759	C	T	457.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=955.78;QD=18.03;SB=-501.52	GT:AD:DP:GL:GQ	0/1:25,28:52:-114.52,-15.66,-86.38:99
-chr1	3970842	rs12049555	G	A	157.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=59.39;MQ0=0;OQ=384.99;QD=10.13;SB=-163.62	GT:AD:DP:GL:GQ	0/1:23,15:35:-52.33,-10.55,-71.59:99
-chr1	3970912	rs6664533	C	T	146.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=3.51;MQ=58.67;MQ0=0;OQ=505.76;QD=14.45;SB=-247.75	GT:AD:DP:GL:GQ	0/1:19,16:34:-64.11,-10.25,-57.21:99
-chr1	3971010	rs6664655	C	G	360.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.39;MQ=59.06;MQ0=0;OQ=1105.77;QD=14.94;SB=-455.72	GT:AD:DP:GL:GQ	0/1:42,32:74:-136.16,-22.30,-181.19:99
-chr1	3971024	rs6686502	G	A	241.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=59.09;MQ0=0;OQ=1058.60;QD=13.93;SB=-346.09	GT:AD:DP:GL:GQ	0/1:42,34:75:-131.76,-22.62,-128.76:99
-chr1	3971052	rs6672264	T	C	278.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.20;MQ0=0;OQ=887.02;QD=10.95;SB=-268.12	GT:AD:DP:GL:GQ	0/1:49,32:80:-116.09,-24.10,-192.61:99
-chr1	3971195	rs6686709	G	C	441.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=533.40;QD=11.85;SB=-281.29	GT:AD:DP:GL:GQ	0/1:29,16:42:-69.28,-12.66,-112.85:99
-chr1	3971259	rs6680847	A	G	343.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=805.68;QD=13.21;SB=-291.63	GT:AD:DP:GL:GQ	0/1:33,28:60:-101.92,-18.07,-129.04:99
-chr1	3971430	rs6675053	T	C	59.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=57.14;MQ0=0;OQ=478.62;QD=6.74;SB=-133.24	GT:AD:DP:GL:GQ	0/1:48,23:70:-72.24,-21.10,-194.61:99
-chr1	3971753	.	C	A	69.39	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=12;HaplotypeScore=26.59;MQ=52.60;MQ0=0;QD=1.16;SB=62.22	GT:AD:DP:GL:GQ	0/1:50,10:49:-24.98,-14.76,-146.09:99
-chr1	3971766	rs12030209	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=12;HaplotypeScore=17.56;MQ=52.68;MQ0=0;OQ=817.96;QD=12.39;SB=-315.05	GT:AD:DP:GL:GQ	0/1:32,34:60:-103.15,-18.07,-109.51:99
-chr1	3972069	rs55798869	G	T	4.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=3;HaplotypeScore=5.71;MQ=56.04;MQ0=0;OQ=802.09;QD=13.37;SB=-418.83	GT:AD:DP:GL:GQ	0/1:32,28:52:-99.17,-15.67,-74.15:99
-chr1	3972136	rs55745368	T	C	189.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=59.03;MQ0=0;OQ=1099.26;QD=12.08;SB=-445.57	GT:AD:DP:GL:GQ	0/1:52,39:91:-140.63,-27.42,-210.68:99
-chr1	3972189	rs7414301	T	C	60.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=5.42;MQ=59.51;MQ0=0;OQ=1011.76;QD=11.76;SB=-466.68	GT:AD:DP:GL:GQ	0/1:46,40:86:-130.38,-25.92,-186.30:99
-chr1	3972623	.	A	C	192.74	PASS	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.77;MQ0=0;OQ=1230.69;QD=15.38;SB=-527.79	GT:AD:DP:GL:GQ	0/1:36,44:79:-150.15,-23.80,-134.39:99
-chr1	3972753	rs10915589	G	A	130.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=59.30;MQ0=0;OQ=1165.16;QD=17.65;SB=-331.36	GT:AD:DP:GL:GQ	0/1:30,36:63:-138.78,-18.98,-103.29:99
-chr1	3972924	rs12023372	G	C	321.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.20;MQ0=0;OQ=1325.91;QD=18.94;SB=-613.61	GT:AD:DP:GL:GQ	0/1:33,37:69:-156.66,-20.79,-145.10:99
-chr1	3973210	rs12023479	G	A	281.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.70;MQ0=0;OQ=1046.55;QD=13.59;SB=-512.32	GT:AD:DP:GL:GQ	0/1:44,33:77:-131.15,-23.21,-144.02:99
-chr1	3973292	.	A	G	33.55	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=55.10;MQ0=0;OQ=633.05;QD=11.94;SB=-175.56	GT:AD:DP:GL:GQ	0/1:28,25:47:-80.75,-14.16,-95.41:99
-chr1	3973506	.	G	A	176.17	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.46;MQ0=0;OQ=876.83;QD=12.71;SB=-380.14	GT:AD:DP:GL:GQ	0/1:42,27:67:-111.16,-20.19,-131.21:99
-chr1	3973875	rs4654459	T	A	52.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=2.73;MQ=58.55;MQ0=0;OQ=1176.09;QD=14.70;SB=-563.67	GT:AD:DP:GL:GQ	0/1:41,39:78:-144.39,-23.49,-149.95:99
-chr1	3973955	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=17;HaplotypeScore=22.03;MQ=54.06;MQ0=0;OQ=55.47;QD=1.03;SB=65.23	GT:AD:DP:GL:GQ	0/1:43,10:44:-22.08,-13.25,-133.74:88.31
-chr1	3974003	.	A	G	105.47	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.51;MQ0=0;OQ=461.72;QD=11.26;SB=-234.29	GT:AD:DP:GL:GQ	0/1:22,19:40:-61.51,-12.06,-83.11:99
-chr1	3974203	.	T	G	66.57	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=57.62;MQ0=0;OQ=954.85;QD=13.84;SB=-428.75	GT:AD:DP:GL:GQ	0/1:35,34:68:-119.25,-20.48,-128.89:99
-chr1	3974239	rs35998568	G	A	463.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.48;MQ0=0;OQ=1184.56;QD=17.95;SB=-510.14	GT:AD:DP:GL:GQ	0/1:31,35:66:-141.63,-19.89,-102.39:99
-chr1	3974376	rs57696600	C	T	6.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=4;HaplotypeScore=1.87;MQ=59.16;MQ0=0;OQ=1418.07;QD=19.70;SB=-722.06	GT:AD:DP:GL:GQ	0/1:30,42:71:-166.49,-21.40,-92.47:99
-chr1	3974614	rs4457544	A	T	403.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=1649.20;QD=19.18;SB=-732.91	GT:AD:DP:GL:GQ	0/1:34,52:86:-194.11,-25.90,-133.63:99
-chr1	3974846	rs12025374	G	A	466.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.31;MQ0=0;OQ=1051.59;QD=16.43;SB=-403.40	GT:AD:DP:GL:GQ	0/1:31,33:63:-127.44,-18.99,-100.16:99
-chr1	3975091	rs12049502	T	C	199.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=58.55;MQ0=0;OQ=805.28;QD=16.78;SB=-288.47	GT:AD:DP:GL:GQ	0/1:19,29:47:-97.97,-14.16,-75.75:99
-chr1	3975721	rs34928897	A	G	109.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=2.98;MQ=59.19;MQ0=1;OQ=1038.58;QD=10.93;SB=-532.63	GT:AD:DP:GL:GQ	0/1:53,42:94:-135.47,-28.33,-210.33:99
-chr1	3975829	rs12060834	A	C	406.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1062.88;QD=14.56;SB=-251.81	GT:AD:DP:GL:GQ	0/1:37,36:73:-131.56,-21.98,-139.84:99
-chr1	3975904	rs12026411	G	T	347.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=57.00;MQ0=0;OQ=1228.86;QD=14.99;SB=-454.51	GT:AD:DP:GL:GQ	0/1:42,40:82:-150.86,-24.69,-151.44:99
-chr1	3976117	rs12034312	C	T	244.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=60.00;MQ0=0;OQ=1562.01;QD=18.38;SB=-442.95	GT:AD:DP:GL:GQ	0/1:40,45:84:-184.80,-25.32,-123.96:99
-chr1	3976389	rs35297022	T	C	334.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=962.55;QD=13.95;SB=-357.60	GT:AD:DP:GL:GQ	0/1:35,34:68:-120.03,-20.49,-141.31:99
-chr1	3976394	rs35043594	A	T	325.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=916.45;QD=13.68;SB=-308.03	GT:AD:DP:GL:GQ	0/1:36,31:67:-115.11,-20.18,-137.00:99
-chr1	3976477	rs4641284	A	G	171.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=58.95;MQ0=0;OQ=487.70;QD=11.08;SB=-180.60	GT:AD:DP:GL:GQ	0/1:26,18:42:-64.71,-12.65,-94.45:99
-chr1	3976506	rs34448752	C	T	57.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=56.85;MQ0=0;OQ=445.94;QD=14.86;SB=-105.62	GT:AD:DP:GL:GQ	0/1:16,14:29:-56.62,-8.74,-46.04:99
-chr1	3976567	.	C	T	0.32	PASS	AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=1.54;MQ=51.77;MQ0=0;OQ=226.37;QD=18.86;SB=-10.00	GT:AD:DP:GL:GQ	0/1:3,9:11:-29.24,-3.32,-8.40:50.74
-chr1	3976658	rs35326871	G	T	11.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.52;MQ0=0;OQ=1096.88;QD=17.41;SB=-10.00	GT:AD:DP:GL:GQ	0/1:25,38:62:-131.64,-18.67,-93.14:99
-chr1	3977151	rs10915596	T	G	1.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=3.48;MQ=59.09;MQ0=0;OQ=756.41;QD=14.83;SB=-45.56	GT:AD:DP:GL:GQ	0/1:22,29:48:-93.38,-14.46,-82.79:99
-chr1	3977453	rs4654599	G	T	361.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.46;MQ0=0;OQ=1289.21;QD=16.74;SB=-567.82	GT:AD:DP:GL:GQ	0/1:35,42:77:-155.40,-23.19,-125.68:99
-chr1	3977541	rs4654600	T	C	61.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=3.43;MQ=59.43;MQ0=0;OQ=838.26;QD=17.11;SB=-388.65	GT:AD:DP:GL:GQ	0/1:18,30:47:-103.58,-16.47,-75.42:99
-chr1	3977567	rs4654601	G	A	272.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.55;MQ0=0;OQ=1148.82;QD=18.83;SB=-426.81	GT:AD:DP:GL:GQ	0/1:26,35:60:-136.24,-18.08,-87.47:99
-chr1	3977950	rs4654604	T	C	322.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.77;MQ=59.65;MQ0=0;OQ=975.26;QD=14.78;SB=-339.18	GT:AD:DP:GL:GQ	0/1:28,38:65:-120.40,-19.59,-110.65:99
-chr1	3978231	rs4129099	T	C	330.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=733.04;QD=11.64;SB=-345.90	GT:AD:DP:GL:GQ	0/1:32,31:62:-95.28,-18.69,-130.06:99
-chr1	3978308	rs4129100	G	A	317.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.48;MQ0=0;OQ=1482.59;QD=16.85;SB=-689.02	GT:AD:DP:GL:GQ	0/1:42,46:86:-177.46,-25.92,-132.95:99
-chr1	3980624	rs4323679	C	T	566.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=703.77;QD=12.13;SB=-349.85	GT:AD:DP:GL:GQ	0/1:35,23:57:-90.85,-17.19,-108.01:99
-chr1	3980746	rs35182639	G	A	123.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=4.13;MQ=59.70;MQ0=0;OQ=1453.16;QD=18.63;SB=-621.68	GT:AD:DP:GL:GQ	0/1:35,43:76:-171.51,-22.91,-105.10:99
-chr1	3980982	rs12747944	G	A	386.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=60.00;MQ0=0;OQ=715.67;QD=12.56;SB=-369.37	GT:AD:DP:GL:GQ	0/1:32,24:53:-90.82,-15.97,-105.07:99
-chr1	3981385	rs17404600	C	T	307.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.06;MQ=59.56;MQ0=0;OQ=909.30;QD=17.16;SB=-459.01	GT:AD:DP:GL:GQ	0/1:26,27:49:-108.98,-14.77,-70.07:99
-chr1	3981945	.	G	C	7.35	PASS	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=2;HaplotypeScore=2.62;MQ=59.25;MQ0=0;OQ=783.42;QD=13.99;SB=-334.02	GT:AD:DP:GL:GQ	0/1:33,23:54:-97.92,-16.29,-122.30:99
-chr1	3981947	rs10799260	C	T	127.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=2.62;MQ=59.25;MQ0=0;OQ=721.41;QD=12.88;SB=-288.75	GT:AD:DP:GL:GQ	0/1:33,23:55:-91.99,-16.57,-116.30:99
-chr1	3982051	rs10753384	A	G	287.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.81;MQ=59.62;MQ0=0;OQ=891.61;QD=14.62;SB=-286.59	GT:AD:DP:GL:GQ	0/1:30,31:60:-110.52,-18.08,-117.65:99
-chr1	3982227	rs10799261	T	C	592.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=920.95;QD=13.35;SB=-433.27	GT:AD:DP:GL:GQ	0/1:35,34:67:-115.56,-20.18,-140.96:99
-chr1	3982891	rs12023925	T	C	257.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=59.13;MQ0=0;OQ=486.42;QD=9.18;SB=-229.40	GT:AD:DP:GL:GQ	0/1:30,23:50:-67.00,-15.07,-113.54:99
-chr1	3984164	rs7418256	T	G	46.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=4;HaplotypeScore=1.00;MQ=59.72;MQ0=0;OQ=1495.13;QD=18.23;SB=-531.78	GT:AD:DP:GL:GQ	0/1:33,49:80:-176.89,-24.10,-113.02:99
-chr1	3984958	rs6426436	A	G	575.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=842.05;QD=12.95;SB=-332.89	GT:AD:DP:GL:GQ	0/1:35,30:64:-106.77,-19.28,-141.35:99
-chr1	3985143	rs5015188	T	C	159.92	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=12.99;MQ=58.62;MQ0=0;QD=2.25;SB=-60.43	GT:AD:DP:GL:GQ	0/1:60,11:70:-40.36,-21.09,-240.05:99
-chr1	3985147	rs5015187	T	C	314.93	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=67.96;MQ=58.31;MQ0=0;QD=4.37;SB=-165.46	GT:AD:DP:GL:GQ	0/1:57,15:70:-55.86,-21.08,-223.89:99
-chr1	3985151	rs5015186	T	C	601.51	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.01;HRun=1;HaplotypeScore=11.99;MQ=58.34;MQ0=0;QD=8.24;SB=-304.19	GT:AD:DP:GL:GQ	0/1:49,23:71:-84.52,-21.09,-190.22:99
-chr1	3985364	rs4233266	A	G	350.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=58.47;MQ0=0;OQ=817.82;QD=10.76;SB=-299.84	GT:AD:DP:GL:GQ	0/1:41,35:71:-106.46,-21.39,-162.85:99
-chr1	3985761	rs4654611	G	C	378.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=59.78;MQ0=0;OQ=1274.73;QD=15.36;SB=-534.37	GT:AD:DP:GL:GQ	0/1:45,38:78:-154.27,-23.51,-187.35:99
-chr1	3985811	rs4654612	C	T	99.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=4.68;MQ=59.17;MQ0=0;OQ=618.20;QD=11.04;SB=-273.28	GT:AD:DP:GL:GQ	0/1:30,25:47:-79.28,-14.18,-83.87:99
-chr1	3988267	rs3829818	C	G	50.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.32;MQ0=0;OQ=1075.32;QD=19.55;SB=-391.87	GT:AD:DP:GL:GQ	0/1:26,29:54:-127.10,-16.29,-99.01:99
-chr1	3988626	rs34649702	A	C	437.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=920.32;QD=18.41;SB=-485.28	GT:AD:DP:GL:GQ	0/1:20,30:49:-110.07,-14.76,-69.08:99
-chr1	3988704	rs55889146	T	A	313.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=59.71;MQ0=0;OQ=1088.43;QD=16.75;SB=-492.44	GT:AD:DP:GL:GQ	0/1:29,36:65:-131.71,-19.58,-109.61:99
-chr1	3989745	rs35412083	G	A	332.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.92;MQ0=0;OQ=1097.15;QD=11.93;SB=-405.76	GT:AD:DP:GL:GQ	0/1:55,36:89:-139.82,-26.82,-176.39:99
-chr1	3990405	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=94;Dels=0.03;HRun=18;HaplotypeScore=33.42;MQ=54.32;MQ0=1;OQ=80.49;QD=0.86;SB=90.81	GT:AD:DP:GL:GQ	0/1:76,15:73:-32.44,-21.10,-200.50:99
-chr1	3990446	rs34385055	G	A	276.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=58.88;MQ0=0;OQ=865.10;QD=15.73;SB=-440.45	GT:AD:DP:GL:GQ	0/1:26,29:49:-104.56,-14.77,-74.37:99
-chr1	3990572	rs10915650	T	C	322.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=53.91;MQ0=0;OQ=802.60;QD=15.43;SB=-363.11	GT:AD:DP:GL:GQ	0/1:19,33:50:-98.61,-15.07,-76.41:99
-chr1	3990932	rs4654614	C	T	267.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.78;MQ0=0;OQ=1697.75;QD=19.97;SB=-727.98	GT:AD:DP:GL:GQ	0/1:36,49:85:-198.66,-25.60,-134.20:99
-chr1	3991939	.	G	T	133.26	Indel	AC=1;AF=0.50;AN=2;DP=31;Dels=0.03;HRun=0;HaplotypeScore=37.12;MQ=55.25;MQ0=0;QD=4.30;SB=-33.93	GT:AD:DP:GL:GQ	0/1:22,8:23:-23.24,-6.63,-47.74:99
-chr1	3992866	rs34160796	A	G	334.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.66;MQ0=0;OQ=483.28;QD=9.29;SB=-177.56	GT:AD:DP:GL:GQ	0/1:33,19:51:-66.97,-15.36,-129.46:99
-chr1	3993123	rs10915661	A	G	223.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.93;MQ=58.90;MQ0=0;OQ=752.89;QD=12.76;SB=-356.58	GT:AD:DP:GL:GQ	0/1:32,27:57:-95.74,-17.17,-122.04:99
-chr1	3993398	rs10799273	A	G	39.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=1.05;MQ=58.69;MQ0=0;OQ=432.60;QD=13.52;SB=-183.96	GT:AD:DP:GL:GQ	0/1:16,16:30:-55.58,-9.04,-60.72:99
-chr1	3993415	rs55877711	T	C	152.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=59.43;MQ0=0;OQ=474.94;QD=14.39;SB=-232.31	GT:AD:DP:GL:GQ	0/1:16,17:31:-60.12,-9.34,-57.39:99
-chr1	3993656	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=16;HaplotypeScore=11.17;MQ=56.96;MQ0=0;OQ=77.46;QD=1.25;SB=65.19	GT:AD:DP:GL:GQ	0/1:50,11:45:-24.60,-13.57,-123.37:99
-chr1	3994923	rs4654469	G	A	168.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.96;MQ=59.68;MQ0=0;OQ=1491.96;QD=20.44;SB=-717.78	GT:AD:DP:GL:GQ	0/1:30,43:72:-174.18,-21.70,-94.37:99
-chr1	3995705	rs34085171	T	G	1347.57	Indel	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=60.38;MQ0=0;QD=15.85;SB=-684.75	GT:AD:DP:GL:GQ	0/1:40,45:84:-163.34,-25.30,-143.02:99
-chr1	3997814	.	A	G	166.71	PASS	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.77;MQ0=0;OQ=1047.22;QD=13.09;SB=-493.22	GT:AD:DP:GL:GQ	0/1:44,36:80:-132.11,-24.10,-175.80:99
-chr1	3999521	rs7533488	A	C	424.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=59.32;MQ0=0;OQ=1161.71;QD=14.17;SB=-423.73	GT:AD:DP:GL:GQ	0/1:41,40:80:-143.55,-24.09,-150.24:99
-chr1	4000164	rs10753345	T	C	207.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=54.60;MQ0=3;OQ=972.02;QD=12.62;SB=-388.88	GT:AD:DP:GL:GQ	0/1:39,38:72:-122.18,-21.70,-141.20:99
-chr1	4000350	rs10915304	A	G	90.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=1.40;MQ=49.42;MQ0=0;OQ=302.07;QD=8.39;SB=-112.62	GT:AD:DP:GL:GQ	0/1:20,15:32:-43.14,-9.65,-72.05:99
-chr1	4001557	rs35079847	T	C	179.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=42.74;MQ0=4;OQ=737.26;QD=10.24;SB=-356.16	GT:AD:DP:GL:GQ	0/1:43,29:67:-97.19,-20.18,-162.42:99
-chr1	4002410	rs9792845	T	A	39.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=2;HaplotypeScore=2.16;MQ=49.63;MQ0=6;OQ=1137.13;QD=12.92;SB=-561.60	GT:AD:DP:GL:GQ	0/1:48,40:80:-141.09,-24.09,-168.17:99
-chr1	4002600	.	C	T	9.93	PASS	AC=1;AF=0.50;AN=2;DP=126;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=34.65;MQ0=18;OQ=1297.58;QD=10.30;SB=-536.53	GT:AD:DP:GL:GQ	0/1:72,54:87:-159.25,-26.21,-171.14:99
-chr1	4003027	rs7539155	C	T	270.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=49.52;MQ0=2;OQ=1241.45;QD=15.71;SB=-511.02	GT:AD:DP:GL:GQ	0/1:40,39:77:-150.62,-23.19,-144.23:99
-chr1	4003660	rs34911143	C	G	406.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1137.88;QD=19.96;SB=-593.22	GT:AD:DP:GL:GQ	0/1:26,31:56:-133.94,-16.87,-107.70:99
-chr1	4003790	.	T	C	0.57	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=5.22;MQ=56.08;MQ0=0;OQ=469.98;QD=8.55;SB=-182.54	GT:AD:DP:GL:GQ	0/1:35,20:52:-65.94,-15.66,-138.69:99
-chr1	4003932	rs60522686	C	T	104.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=60.00;MQ0=0;OQ=1130.00;QD=21.32;SB=-533.08	GT:AD:DP:GL:GQ	0/1:20,33:53:-132.25,-15.97,-67.95:99
-chr1	4004106	rs12036981	T	A	126.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=56.22;MQ0=2;OQ=519.83;QD=10.19;SB=-138.13	GT:AD:DP:GL:GQ	0/1:29,21:47:-69.43,-14.17,-100.44:99
-chr1	4004617	rs12036953	A	G	190.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.43;MQ0=0;OQ=561.78;QD=8.64;SB=-245.46	GT:AD:DP:GL:GQ	0/1:41,24:63:-78.44,-18.98,-164.76:99
-chr1	4005149	rs5018354	G	T	769.64	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=5;HaplotypeScore=8.12;MQ=53.93;MQ0=0;QD=10.84;SB=-410.03	GT:AD:DP:GL:GQ	0/1:41,30:69:-101.03,-20.78,-142.34:99
-chr1	4005155	.	A	T	709.63	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=5;HaplotypeScore=11.69;MQ=54.09;MQ0=0;QD=10.28;SB=-304.00	GT:AD:DP:GL:GQ	0/1:43,26:65:-93.83,-19.58,-142.00:99
-chr1	4005156	.	A	T	576.66	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=13.11;MQ=54.00;MQ0=0;QD=8.48;SB=-291.97	GT:AD:DP:GL:GQ	0/1:44,24:63:-79.93,-18.98,-151.00:99
-chr1	4005449	rs34905442	A	G	30.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=5.92;MQ=57.79;MQ0=0;OQ=842.19;QD=15.89;SB=-428.92	GT:AD:DP:GL:GQ	0/1:23,30:52:-103.18,-15.68,-83.89:99
-chr1	4010416	rs55645535	A	G	3.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=3;HaplotypeScore=0.83;MQ=58.64;MQ0=0;OQ=504.55;QD=16.28;SB=-163.34	GT:AD:DP:GL:GQ	0/1:10,21:29:-62.49,-8.75,-36.79:99
-chr1	4012539	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=20;HaplotypeScore=3.78;MQ=46.27;MQ0=3;OQ=496.42;QD=5.23;SB=131.33	GT:AD:DP:GL:GQ	0/1:70,25:77:-76.14,-23.22,-185.60:99
-chr1	4012545	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=7;HaplotypeScore=6.81;MQ=48.30;MQ0=1;OQ=296.48;QD=3.12;SB=125.35	GT:AD:DP:GL:GQ	0/1:68,26:74:-55.23,-22.30,-199.64:99
-chr1	4015436	rs10799171	T	C	582.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=1395.24;QD=29.69;SB=-603.59	GT:AD:DP:GL:GQ	1/1:0,47:45:-143.16,-13.58,-0.05:99
-chr1	4015788	rs6426377	G	C	79.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=58.24;MQ0=0;OQ=2118.03;QD=39.96;SB=-1018.28	GT:AD:DP:GL:GQ	1/1:0,53:49:-215.40,-14.76,-0.01:99
-chr1	4016464	rs3856168	T	C	206.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=58.60;MQ0=0;OQ=1420.67;QD=28.41;SB=-682.89	GT:AD:DP:GL:GQ	1/1:0,50:45:-145.69,-13.57,-0.04:99
-chr1	4017003	rs4654403	T	C	46.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.69;MQ=59.61;MQ0=0;OQ=1716.77;QD=29.10;SB=-823.60	GT:AD:DP:GL:GQ	1/1:0,59:55:-175.31,-16.59,-0.05:99
-chr1	4017098	rs4654404	C	T	8.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=4.56;MQ=58.64;MQ0=0;OQ=1853.34;QD=38.61;SB=-777.68	GT:AD:DP:GL:GQ	1/1:0,48:47:-188.93,-14.16,-0.01:99
-chr1	4018431	rs4654475	T	C	39.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=59.54;MQ0=0;OQ=1443.50;QD=28.87;SB=-682.71	GT:AD:DP:GL:GQ	1/1:0,50:46:-147.99,-13.88,-0.05:99
-chr1	4018760	rs7419106	C	G	402.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=1082.64;QD=34.92;SB=-389.10	GT:AD:DP:GL:GQ	1/1:0,31:28:-111.87,-8.45,-0.02:84.27
-chr1	4018847	rs10799175	T	C	20.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=4.16;MQ=58.50;MQ0=0;OQ=814.89;QD=26.29;SB=-376.57	GT:AD:DP:GL:GQ	1/1:1,29:28:-88.39,-10.61,-3.32:72.94
-chr1	4019483	rs10799177	G	A	473.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.36;MQ0=0;OQ=1615.08;QD=33.65;SB=-313.91	GT:AD:DP:GL:GQ	1/1:0,48:42:-165.11,-12.66,-0.02:99
-chr1	4019522	rs9792946	G	A	281.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=54.50;MQ0=0;OQ=2603.69;QD=38.29;SB=-1110.00	GT:AD:DP:GL:GQ	1/1:0,68:66:-263.98,-19.89,-0.02:99
-chr1	4019590	rs7418034	G	A	135.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=43.49;MQ0=0;OQ=1841.94;QD=30.70;SB=-845.46	GT:AD:DP:GL:GQ	1/1:0,59:50:-190.21,-17.45,-2.43:99
-chr1	4019593	rs7412152	A	C	123.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=42.41;MQ0=0;OQ=1763.32;QD=29.89;SB=-853.08	GT:AD:DP:GL:GQ	1/1:0,59:51:-179.93,-15.36,-0.02:99
-chr1	4019614	rs7411249	C	G	15.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=3.88;MQ=36.55;MQ0=1;OQ=1713.38;QD=32.33;SB=-801.51	GT:AD:DP:GL:GQ	1/1:0,53:41:-174.94,-12.36,-0.02:99
-chr1	4019841	rs7412217	A	G	301.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=36.34;MQ0=0;OQ=1308.64;QD=29.08;SB=-633.25	GT:AD:DP:GL:GQ	1/1:0,45:37:-134.46,-11.14,-0.01:99
-chr1	4019863	rs4310408	A	G	15.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=44.42;MQ0=0;OQ=1396.45;QD=30.36;SB=-620.23	GT:AD:DP:GL:GQ	1/1:0,46:40:-143.25,-12.05,-0.02:99
-chr1	4019987	rs10737398	C	T	456.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.86;MQ0=6;OQ=1422.85;QD=30.93;SB=-467.35	GT:AD:DP:GL:GQ	1/1:0,46:37:-145.88,-11.15,-0.01:99
-chr1	4020055	rs7411353	C	A	1052.58	Indel;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=9;HaplotypeScore=6.69;MQ=42.23;MQ0=1;QD=22.40;SB=-302.56	GT:AD:DP:GL:GQ	1/1:0,47:31:-108.85,-9.34,-0.01:93.27
-chr1	4020059	.	T	A	16.07	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=4;HaplotypeScore=6.64;MQ=40.62;MQ0=1;QD=0.41;SB=14.07	GT:AD:DP:GL:GQ	0/1:27,12:17:-10.01,-5.13,-48.93:48.79
-chr1	4020065	rs6426379	G	C	834.47	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=40.47;MQ0=0;QD=30.91;SB=-369.17	GT:AD:DP:GL:GQ	1/1:1,26:20:-87.04,-6.03,-0.01:60.20
-chr1	4020216	rs6426380	C	T	178.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=56.52;MQ0=0;OQ=2286.70;QD=38.76;SB=-938.24	GT:AD:DP:GL:GQ	1/1:0,59:59:-232.28,-17.78,-0.03:99
-chr1	4020359	rs4233255	T	A	506.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.30;MQ0=1;OQ=1405.72;QD=30.56;SB=-629.64	GT:AD:DP:GL:GQ	1/1:0,46:40:-144.18,-12.05,-0.02:99
-chr1	4020451	rs4654476	A	G	27.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.11;MQ0=0;OQ=1489.65;QD=28.65;SB=-689.96	GT:AD:DP:GL:GQ	1/1:0,52:47:-152.59,-14.18,-0.04:99
-chr1	4020454	rs4654477	T	C	48.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.13;MQ=59.54;MQ0=0;OQ=1536.11;QD=30.72;SB=-613.94	GT:AD:DP:GL:GQ	1/1:0,50:48:-157.24,-14.48,-0.04:99
-chr1	4020656	rs4233256	A	C	90.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.86;MQ=59.09;MQ0=0;OQ=1344.37;QD=29.23;SB=-633.78	GT:AD:DP:GL:GQ	1/1:0,46:45:-138.07,-13.57,-0.05:99
-chr1	4020738	rs4233257	G	A	285.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=56.81;MQ0=0;OQ=1954.21;QD=35.53;SB=-857.02	GT:AD:DP:GL:GQ	1/1:0,55:50:-199.02,-15.06,-0.01:99
-chr1	4020758	rs4233258	T	C	590.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.92;MQ0=0;OQ=1509.42;QD=29.03;SB=-773.63	GT:AD:DP:GL:GQ	1/1:0,52:49:-154.57,-14.78,-0.05:99
-chr1	4020965	rs10915373	A	G	41.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=3.05;MQ=59.15;MQ0=0;OQ=2124.75;QD=32.19;SB=-981.05	GT:AD:DP:GL:GQ	1/1:0,66:61:-216.09,-18.38,-0.03:99
-chr1	4021209	rs12087801	A	G	66.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=59.44;MQ0=0;OQ=1399.12;QD=34.12;SB=-653.32	GT:AD:DP:GL:GQ	1/1:0,41:40:-143.51,-12.05,-0.01:99
-chr1	4021244	rs7524590	A	G	21.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.56;MQ0=0;OQ=1518.93;QD=29.21;SB=-554.05	GT:AD:DP:GL:GQ	1/1:0,52:47:-155.52,-14.17,-0.04:99
-chr1	4021467	rs6426381	T	C	70.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=57.82;MQ0=0;OQ=1271.75;QD=29.58;SB=-623.00	GT:AD:DP:GL:GQ	1/1:0,43:40:-130.79,-12.06,-0.03:99
-chr1	4021470	rs6665286	C	T	565.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.82;MQ0=0;OQ=1632.61;QD=37.97;SB=-837.35	GT:AD:DP:GL:GQ	1/1:0,43:42:-166.86,-12.66,-0.02:99
-chr1	4021576	rs10799179	C	T	140.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.60;MQ0=0;OQ=2105.87;QD=36.95;SB=-1023.68	GT:AD:DP:GL:GQ	1/1:0,57:54:-214.19,-16.27,-0.02:99
-chr1	4022324	rs10799180	T	C	96.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1478.38;QD=30.80;SB=-697.61	GT:AD:DP:GL:GQ	1/1:0,48:47:-151.47,-14.18,-0.04:99
-chr1	4023064	rs12044274	A	T	27.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.00;MQ0=0;OQ=1175.00;QD=33.57;SB=-370.25	GT:AD:DP:GL:GQ	1/1:0,34:33:-121.10,-9.94,-0.02:99
-chr1	4023346	rs12728781	C	T	64.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=58.67;MQ0=0;OQ=1081.51;QD=30.90;SB=-492.01	GT:AD:DP:GL:GQ	1/1:1,34:29:-111.75,-8.74,-0.01:87.27
-chr1	4023709	rs10915381	G	C	0.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=3.44;MQ=58.92;MQ0=0;OQ=2348.10;QD=41.93;SB=-727.93	GT:AD:DP:GL:GQ	1/1:0,56:54:-238.42,-16.28,-0.02:99
-chr1	4024015	rs6672626	C	T	663.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=46.30;MQ0=0;OQ=1764.84;QD=37.55;SB=-805.32	GT:AD:DP:GL:GQ	1/1:0,47:46:-180.09,-13.86,-0.02:99
-chr1	4024120	rs6672716	C	T	182.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=36.16;MQ0=0;OQ=1966.97;QD=37.83;SB=-833.61	GT:AD:DP:GL:GQ	1/1:0,51:51:-203.16,-18.10,-2.88:99
-chr1	4024270	.	T	A	112.05	Indel	AC=1;AF=0.50;AN=2;DP=33;Dels=0.03;HRun=0;HaplotypeScore=2.93;MQ=35.48;MQ0=0;QD=3.40;SB=-51.99	GT:AD:DP:GL:GQ	0/1:21,11:28:-22.63,-8.14,-76.45:99
-chr1	4024272	.	A	T	86.10	Indel	AC=1;AF=0.50;AN=2;DP=34;Dels=0.03;HRun=0;HaplotypeScore=5.09;MQ=34.14;MQ0=0;QD=2.53;SB=-27.82	GT:AD:DP:GL:GQ	0/1:23,10:27:-19.73,-7.83,-71.54:99
-chr1	4024295	rs6683289	T	C	432.26	Indel;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=27.02;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,16:16:-46.84,-4.84,-0.03:48.07
-chr1	4024297	rs6665849	G	C	696.90	Indel;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=43.56;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,16:16:-73.28,-4.82,-0.00:48.16
-chr1	4024305	.	T	C	154.38	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=7.02;SB=-40.68	GT:AD:DP:GL:GQ	0/1:15,7:22:-25.35,-6.63,-60.61:99
-chr1	4024357	.	T	G	116.82	Indel	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=28.57;MQ0=0;QD=4.67;SB=-30.96	GT:AD:DP:GL:GQ	0/1:17,8:23:-21.89,-6.93,-59.79:99
-chr1	4024403	.	G	T	1246.60	Indel	AC=2;AF=1.00;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=28.45;MQ0=0;QD=33.69;SB=-622.14	GT:AD:DP:GL:GQ	1/1:0,37:35:-128.26,-10.54,-0.01:99
-chr1	4024413	.	C	T	38.79	Indel;LowQual	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=14.98;MQ=32.72;MQ0=0;QD=0.90;SB=-26.14	GT:AD:DP:GL:GQ	0/1:37,6:40:-19.21,-12.05,-127.12:71.63
-chr1	4024463	.	G	C	836.03	Indel	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=5.63;MQ=36.44;MQ0=0;QD=16.39;SB=-259.21	GT:AD:DP:GL:GQ	0/1:27,24:51:-102.25,-15.37,-114.08:99
-chr1	4024467	.	C	T	697.56	Indel	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=4.47;MQ=36.57;MQ0=0;QD=13.95;SB=-194.79	GT:AD:DP:GL:GQ	0/1:28,22:49:-87.80,-14.76,-98.23:99
-chr1	4024517	rs28542205	C	G	1129.16	Indel	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=18.36;MQ=32.35;MQ0=0;QD=26.26;SB=-522.33	GT:AD:DP:GL:GQ	0/1:8,31:35:-126.75,-10.55,-27.16:99
-chr1	4024521	.	G	C	975.12	Indel	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=18.89;MQ=30.36;MQ0=0;QD=23.78;SB=-491.19	GT:AD:DP:GL:GQ	0/1:9,27:35:-115.01,-14.21,-36.24:99
-chr1	4024603	.	G	C	2.26	PASS	AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=24.41;MQ0=0;OQ=50.98;QD=5.66;SB=-6.99	GT:AD:DP:GL:GQ	0/1:1,8:3:-9.29,-0.90,-4.69:37.89
-chr1	4024673	.	T	C	8.19	PASS	AC=2;AF=1.00;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=30.71;MQ0=0;OQ=656.07;QD=31.24;SB=-288.45	GT:AD:DP:GL:GQ	1/1:0,21:20:-69.20,-6.03,-0.01:60.17
-chr1	4024788	.	T	C	850.29	Indel	AC=2;AF=1.00;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=32.58;MQ0=0;QD=34.01;SB=-338.76	GT:AD:DP:GL:GQ	1/1:0,25:25:-88.63,-7.53,-0.01:75.20
-chr1	4024845	.	T	G	1.74	PASS	AC=1;AF=0.50;AN=2;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=68.85;QD=17.21;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,3:4:-11.37,-1.20,-3.44:22.35
-chr1	4024894	.	T	C	62.45	Indel	AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=7.00;MQ=29.00;MQ0=0;QD=12.49;SB=-41.94	GT:AD:DP:GL:GQ	0/1:2,3:4:-10.73,-1.20,-4.27:30.63
-chr1	4024923	.	G	A	22.24	Indel;LowQual	AC=1;AF=0.50;AN=2;DP=8;Dels=0.25;HRun=0;HaplotypeScore=23.92;MQ=29.00;MQ0=0;QD=2.78;SB=-0.97	GT:AD:DP:GL:GQ	0/1:4,2:6:-7.31,-1.81,-14.76:55.05
-chr1	4024936	.	T	G	14.90	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=16;Dels=0.06;HRun=0;HaplotypeScore=31.98;MQ=29.00;MQ0=0;QD=0.93;SB=4.38	GT:AD:DP:GL:GQ	0/1:12,2:8:-11.00,-6.24,-20.74:47.59
-chr1	4024944	.	C	T	21.22	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=58.95;MQ=29.00;MQ0=0;QD=1.25;SB=8.05	GT:AD:DP:GL:GQ	0/1:15,2:9:-8.11,-2.71,-25.25:54.02
-chr1	4024945	.	A	T	15.01	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=58.95;MQ=29.00;MQ0=0;QD=0.88;SB=8.04	GT:AD:DP:GL:GQ	0/1:13,4:9:-7.48,-2.71,-24.43:47.70
-chr1	4024946	.	C	T	97.28	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=64.95;MQ=29.00;MQ0=0;QD=5.72;SB=8.05	GT:AD:DP:GL:GQ	0/1:13,4:11:-16.32,-3.31,-25.25:99
-chr1	4024979	.	C	T	611.81	Indel;SnpCluster	AC=2;AF=1.00;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=6.71;MQ=29.00;MQ0=0;QD=33.99;SB=-293.67	GT:AD:DP:GL:GQ	1/1:0,16:16:-64.77,-4.82,-0.00:48.16
-chr1	4024982	.	T	G	173	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=11.86;MQ=29.00;MQ0=0;QD=9.11;SB=14.07	GT:AD:DP:GL:GQ	0/1:10,7:16:-25.40,-4.82,-33.30:99
-chr1	4024983	.	C	T	250.37	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=1;HaplotypeScore=11.86;MQ=29.00;MQ0=0;QD=13.18;SB=14.06	GT:AD:DP:GL:GQ	0/1:11,8:16:-33.14,-4.82,-27.15:99
-chr1	4025014	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=2;HaplotypeScore=18.19;MQ=29.00;MQ0=0;OQ=197.67;QD=9.88;SB=17.08	GT:AD:DP:GL:GQ	0/1:13,7:18:-28.47,-5.42,-39.21:99
-chr1	4025033	.	G	A	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=9.30;MQ=27.51;MQ0=1;OQ=89.74;QD=8.97;SB=2.03	GT:AD:DP:GL:GQ	0/1:5,5:9:-14.97,-2.71,-16.97:99
-chr1	4025048	.	C	T	21.22	DPFilter;Indel;LowQual	AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=1;HaplotypeScore=32.62;MQ=27.51;MQ0=1;QD=2.12;SB=2.04	GT:AD:DP:GL:GQ	0/1:8,2:9:-8.11,-2.71,-25.19:54.03
-chr1	4025070	.	G	A	35.48	LowQual	AC=1;AF=0.50;AN=2;DP=4;Dels=0.00;HRun=1;HaplotypeScore=6.00;MQ=29.00;MQ0=0;QD=8.87;SB=-6.99	GT:AD:DP:GL:GQ	0/1:2,2:3:-7.73,-0.90,-3.47:25.65
-chr1	4025144	.	C	T	71.12	Indel	AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=8.89;SB=-10.00	GT:AD:DP:GL:GQ	0/1:2,6:5:-11.90,-1.51,-7.69:61.87
-chr1	4025168	.	G	C	48.97	LowQual	AC=1;AF=0.50;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=29.00;MQ0=0;QD=7.00;SB=-10.00	GT:AD:DP:GL:GQ	0/1:2,5:4:-9.39,-1.21,-8.09:68.89
-chr1	4025186	.	C	T	0.12	PASS	AC=1;AF=0.50;AN=2;DP=4;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=78.13;QD=19.53;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,3:4:-12.30,-1.20,-3.90:26.92
-chr1	4025245	.	C	T	49.25	LowQual;SnpCluster	AC=2;AF=1.00;AN=2;DP=3;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=23.68;MQ0=1;QD=16.42;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,2:2:-8.33,-0.60,-0.00:6.02
-chr1	4025247	.	G	C	137.89	SnpCluster	AC=2;AF=1.00;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.94;MQ0=1;QD=27.58;SB=-52.47	GT:AD:DP:GL:GQ	1/1:1,4:4:-17.32,-1.21,-0.00:12.04
-chr1	4025253	.	T	C	341.02	SnpCluster	AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=26.68;MQ0=2;QD=26.23;SB=-182.78	GT:AD:DP:GL:GQ	1/1:1,12:11:-37.69,-3.31,-0.01:33.09
-chr1	4025355	.	C	T	528.21	SnpCluster	AC=2;AF=1.00;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=33.01;SB=-144.72	GT:AD:DP:GL:GQ	1/1:1,15:16:-59.68,-4.82,-3.30:15.20
-chr1	4025359	.	T	C	305.09	SnpCluster	AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=29.00;MQ0=0;QD=23.47;SB=-70.88	GT:AD:DP:GL:GQ	0/1:2,11:13:-37.71,-3.92,-7.64:37.23
-chr1	4025364	.	T	A	90.08	SnpCluster	AC=2;AF=1.00;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=29.00;MQ0=0;QD=18.02;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,3:3:-12.50,-0.90,-0.00:9.03
-chr1	4025431	.	G	C	10.49	LowQual	AC=1;AF=0.50;AN=2;DP=1;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=10.49;SB=-10.00	GT:AD:DP:GL:GQ	0/1:0,1:1:-4.29,-0.30,-0.00:1.76
-chr1	4025466	.	T	C	25.23	LowQual	AC=1;AF=0.50;AN=2;DP=3;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=29.00;MQ0=0;QD=8.41;SB=-10.00	GT:AD:DP:GL:GQ	0/1:0,2:3:-9.75,-4.24,-3.95:1.79
-chr1	4025523	.	A	C	21.19	LowQual	AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=1;HaplotypeScore=4.30;MQ=29.00;MQ0=0;QD=4.24;SB=-10.00	GT:AD:DP:GL:GQ	0/1:3,2:3:-6.30,-0.90,-3.10:21.92
-chr1	4025542	.	T	C	37.83	LowQual	AC=2;AF=1.00;AN=2;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=12.61;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,2:2:-7.19,-0.60,-0.00:6.02
-chr1	4025586	.	G	C	7.40	PASS	AC=1;AF=0.50;AN=2;DP=5;Dels=0.20;HRun=0;HaplotypeScore=2.25;MQ=29.00;MQ0=0;OQ=51.98;QD=10.40;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,3:3:-9.39,-0.90,-3.95:30.43
-chr1	4025618	.	C	T	7.86	PASS	AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=29.00;MQ0=0;OQ=87.13;QD=12.45;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,5:3:-12.20,-0.90,-0.00:9.03
-chr1	4025642	.	T	C	158.22	Indel	AC=2;AF=1.00;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=31.64;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,5:5:-19.38,-1.51,-0.00:15.05
-chr1	4025697	.	A	T	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=29.00;MQ0=0;OQ=113.07;QD=22.61;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,4:5:-16.09,-1.51,-3.64:21.34
-chr1	4025746	.	T	G	32.28	LowQual	AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=3.93;MQ=23.71;MQ0=1;QD=6.46;SB=-10.00	GT:AD:DP:GL:GQ	0/1:2,2:3:-7.41,-0.90,-3.74:28.36
-chr1	4025760	.	T	C	33.23	LowQual	AC=1;AF=0.50;AN=2;DP=4;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=26.51;MQ0=0;QD=8.31;SB=-10.00	GT:AD:DP:GL:GQ	0/1:1,2:3:-10.45,-4.14,-3.85:1.79
-chr1	4026171	.	A	T	209.87	Indel	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=25.28;MQ0=0;QD=14.99;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,9:8:-26.67,-2.41,-4.00:15.91
-chr1	4026180	.	C	G	33.92	Indel;LowQual	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.28;MQ0=0;QD=2.42;SB=-10.00	GT:AD:DP:GL:GQ	0/1:9,5:9:-9.39,-2.71,-29.13:66.75
-chr1	4026184	.	C	T	21.22	LowQual	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.28;MQ0=0;QD=1.52;SB=-10.00	GT:AD:DP:GL:GQ	0/1:9,5:9:-8.11,-2.71,-25.08:54.02
-chr1	4026206	.	C	G	51.98	Indel	AC=1;AF=0.50;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.01;MQ0=1;QD=7.43;SB=-10.00	GT:AD:DP:GL:GQ	0/1:2,5:3:-9.39,-0.90,-4.15:32.44
-chr1	4026210	.	G	C	48.85	LowQual	AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.61;MQ0=1;QD=8.14;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,5:2:-8.29,-0.60,-0.00:6.02
-chr1	4026326	.	G	C	28.47	Indel;LowQual	AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=22.92;MQ=30.24;MQ0=0;QD=1.90;SB=-27.39	GT:AD:DP:GL:GQ	0/1:8,6:9:-8.84,-2.71,-32.55:61.30
-chr1	4026330	.	C	T	15.30	Indel;LowQual	AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=20.94;MQ=33.42;MQ0=0;QD=0.96;SB=-6.99	GT:AD:DP:GL:GQ	0/1:14,2:11:-8.11,-3.31,-31.44:48.01
-chr1	4026341	.	A	T	151.96	Indel	AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=32.82;MQ=37.84;MQ0=1;QD=7.24;SB=-45.98	GT:AD:DP:GL:GQ	0/1:14,7:14:-22.70,-4.22,-31.99:99
-chr1	4026383	.	A	G	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=27.11;MQ=37.86;MQ0=1;OQ=685.36;QD=14.58;SB=-116.05	GT:AD:DP:GL:GQ	1/1:7,40:26:-76.32,-7.85,-4.20:36.49
-chr1	4026434	.	C	G	29.02	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.33;MQ0=0;QD=0.81;SB=5.05	GT:AD:DP:GL:GQ	0/1:34,2:8:-8.60,-2.41,-25.63:61.85
-chr1	4026435	.	A	T	728.54	SnpCluster	AC=2;AF=1.00;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.33;MQ0=0;QD=20.24;SB=-50.99	GT:AD:DP:GL:GQ	1/1:2,34:20:-76.44,-6.02,-0.00:60.19
-chr1	4026437	.	T	A	762.24	SnpCluster	AC=2;AF=1.00;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.33;MQ0=0;QD=21.17;SB=-46.39	GT:AD:DP:GL:GQ	1/1:2,34:20:-79.81,-6.02,-0.00:60.20
-chr1	4026440	.	T	G	564.23	SnpCluster	AC=2;AF=1.00;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.87;MQ0=0;QD=17.10;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,31:17:-60.01,-5.12,-0.00:51.15
-chr1	4026444	.	C	G	41.07	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=34.30;MQ0=1;QD=1.28;SB=-6.99	GT:AD:DP:GL:GQ	0/1:30,2:3:-8.29,-0.90,-4.25:33.44
-chr1	4026449	.	A	T	483.60	SnpCluster	AC=2;AF=1.00;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=34.81;MQ0=1;QD=16.68;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,29:14:-51.95,-4.22,-0.00:42.13
-chr1	4026483	.	G	A	173.76	Indel	AC=2;AF=1.00;AN=2;DP=7;Dels=0.14;HRun=0;HaplotypeScore=0.00;MQ=25.96;MQ0=0;QD=24.82;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,6:5:-20.94,-1.51,-0.00:15.05
-chr1	4026581	.	T	C	45.31	PASS	AC=2;AF=1.00;AN=2;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=26.51;MQ0=0;OQ=56.13;QD=14.03;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,4:3:-9.11,-0.91,-0.01:9
-chr1	4026636	.	T	A	64.25	PASS	AC=2;AF=1.00;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=32.75;MQ0=0;OQ=1092.89;QD=35.25;SB=-113.17	GT:AD:DP:GL:GQ	1/1:0,31:29:-112.88,-8.73,-0.01:87.28
-chr1	4026761	.	T	A	283.60	PASS	AC=2;AF=1.00;AN=2;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=39.63;MQ0=0;OQ=910.42;QD=32.51;SB=-440.82	GT:AD:DP:GL:GQ	1/1:0,28:25:-94.63,-7.53,-0.01:75.24
-chr1	4026798	.	G	C	10.99	LowQual	AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=12.99;MQ=22.58;MQ0=0;QD=2.20;SB=-10.00	GT:AD:DP:GL:GQ	0/1:2,3:1:-4.35,-0.30,-0.00:1.76
-chr1	4026914	.	T	C	49.44	PASS	AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.57;MQ0=0;OQ=246.59;QD=24.66;SB=-150.73	GT:AD:DP:GL:GQ	1/1:0,10:9:-28.25,-2.72,-0.01:27.05
-chr1	4026927	.	A	T	206.91	PASS	AC=2;AF=1.00;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.61;MQ0=0;OQ=634.07;QD=30.19;SB=-308.12	GT:AD:DP:GL:GQ	1/1:0,21:18:-67.00,-5.42,-0.01:54.16
-chr1	4027026	.	C	T	64.95	Indel	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=32.20;MQ0=1;QD=1.71;SB=-49.74	GT:AD:DP:GL:GQ	0/1:32,6:37:-20.92,-11.15,-115.91:97.79
-chr1	4027042	.	T	C	614.97	Indel	AC=2;AF=1.00;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=29.00;MQ0=0;QD=27.95;SB=-154.73	GT:AD:DP:GL:GQ	1/1:0,22:21:-65.11,-6.34,-0.03:63.13
-chr1	4027052	.	T	C	696.49	Indel	AC=2;AF=1.00;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=34.82;SB=-114.05	GT:AD:DP:GL:GQ	1/1:0,20:20:-73.24,-6.03,-0.01:60.18
-chr1	4027210	.	G	C	19.50	Indel;LowQual	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=26.88;MQ0=0;QD=1.39;SB=-27.39	GT:AD:DP:GL:GQ	0/1:12,2:10:-8.24,-3.01,-36.19:52.28
-chr1	4027332	.	C	G	36.70	PASS	AC=2;AF=1.00;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.49;MQ0=0;OQ=1976.71;QD=43.93;SB=-544.06	GT:AD:DP:GL:GQ	1/1:0,45:45:-201.27,-13.56,-0.01:99
-chr1	4027338	.	T	C	290.59	PASS	AC=2;AF=1.00;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.34;MQ0=0;OQ=1625.12;QD=35.33;SB=-497.48	GT:AD:DP:GL:GQ	1/1:0,46:46:-166.11,-13.85,-0.01:99
-chr1	4027382	rs4654478	T	C	529.46	Indel	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=8.99;MQ=33.88;MQ0=0;QD=11.77;SB=-150.80	GT:AD:DP:GL:GQ	0/1:25,20:45:-69.78,-13.55,-102.60:99
-chr1	4027391	.	A	T	124.12	Indel	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=29.00;MQ0=0;QD=3.18;SB=-45.98	GT:AD:DP:GL:GQ	0/1:32,7:37:-26.84,-11.14,-119.06:99
-chr1	4027395	.	T	A	21.79	Indel;LowQual	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=29.00;MQ0=0;QD=0.61;SB=-10.00	GT:AD:DP:GL:GQ	0/1:32,4:36:-16.30,-10.84,-120.25:54.60
-chr1	4027428	rs4654405	C	A	54.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=1067.75;QD=35.59;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,30:30:-110.36,-9.03,-0.00:90.28
-chr1	4027512	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=38;Dels=0.03;HRun=0;HaplotypeScore=41.12;MQ=30.70;MQ0=0;OQ=583.71;QD=15.36;SB=-96.83	GT:AD:DP:GL:GQ	0/1:11,26:29:-70.09,-8.44,-49.32:99
-chr1	4027516	.	C	G	4.55	PASS	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=30.66;MQ0=0;OQ=294.17;QD=7.54;SB=2.04	GT:AD:DP:GL:GQ	0/1:30,9:29:-41.44,-8.74,-84.22:99
-chr1	4027660	rs4654407	G	A	193.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=42.76;MQ0=0;OQ=2435.59;QD=39.28;SB=-760.64	GT:AD:DP:GL:GQ	1/1:0,62:62:-247.16,-18.68,-0.02:99
-chr1	4027721	rs4654408	C	T	529.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.67;MQ0=0;OQ=1726.14;QD=39.23;SB=-623.32	GT:AD:DP:GL:GQ	1/1:0,44:43:-176.21,-12.95,-0.01:99
-chr1	4027907	rs4654409	G	A	268.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.85;MQ0=0;OQ=2188.75;QD=36.48;SB=-1120.98	GT:AD:DP:GL:GQ	1/1:0,60:57:-222.49,-17.18,-0.03:99
-chr1	4028014	rs10915398	T	C	85.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.65;MQ0=0;OQ=1826.56;QD=33.83;SB=-678.24	GT:AD:DP:GL:GQ	1/1:0,54:52:-186.26,-15.66,-0.02:99
-chr1	4028230	rs10753357	A	C	280.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.61;MQ0=0;OQ=1933.90;QD=32.78;SB=-901.67	GT:AD:DP:GL:GQ	1/1:0,59:56:-196.99,-16.87,-0.02:99
-chr1	4028383	rs10753358	C	A	101.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=2;HaplotypeScore=0.96;MQ=59.50;MQ0=0;OQ=3292.23;QD=35.40;SB=-1450.96	GT:AD:DP:GL:GQ	1/1:0,93:90:-328.22,-27.11,-0.03:99
-chr1	4028555	rs10915400	C	T	609.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=2231.72;QD=39.15;SB=-1113.00	GT:AD:DP:GL:GQ	1/1:0,57:57:-226.78,-17.18,-0.02:99
-chr1	4028627	rs11586513	G	A	570.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2205.25;QD=39.38;SB=-957.37	GT:AD:DP:GL:GQ	1/1:0,56:55:-224.12,-16.57,-0.01:99
-chr1	4029107	rs17404781	C	A	590.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=2642.82;QD=36.71;SB=-848.25	GT:AD:DP:GL:GQ	1/1:0,72:72:-267.88,-21.68,-0.02:99
-chr1	4029794	rs4603097	A	G	153.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=2799.69;QD=36.36;SB=-819.68	GT:AD:DP:GL:GQ	1/1:1,76:76:-283.57,-22.89,-0.02:99
-chr1	4030208	rs4130940	A	G	693.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3003.68;QD=34.53;SB=-1360.53	GT:AD:DP:GL:GQ	1/1:0,87:86:-303.98,-25.91,-0.03:99
-chr1	4030429	rs4130941	T	C	169.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=60.00;MQ0=0;OQ=3432.78;QD=35.76;SB=-1689.36	GT:AD:DP:GL:GQ	1/1:0,96:95:-342.28,-28.61,-0.03:99
-chr1	4030544	rs4391636	T	C	184.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2626.35;QD=31.27;SB=-1250.03	GT:AD:DP:GL:GQ	1/1:0,84:83:-266.29,-25.03,-0.07:99
-chr1	4030874	rs4262509	T	C	686.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=2253.22;QD=36.34;SB=-816.67	GT:AD:DP:GL:GQ	1/1:0,62:62:-228.93,-18.68,-0.02:99
-chr1	4031041	rs4400586	C	T	220	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=2740.70;QD=40.30;SB=-1397.85	GT:AD:DP:GL:GQ	1/1:0,68:68:-277.67,-20.48,-0.01:99
-chr1	4031109	rs7537141	A	G	223.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=3.17;MQ=58.69;MQ0=0;OQ=2389.72;QD=33.66;SB=-1060.09	GT:AD:DP:GL:GQ	1/1:0,70:68:-242.58,-20.48,-0.02:99
-chr1	4031170	rs7537236	A	G	284.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.42;MQ0=0;OQ=1865.29;QD=33.31;SB=-585.57	GT:AD:DP:GL:GQ	1/1:0,56:52:-190.13,-15.66,-0.02:99
-chr1	4031176	rs7537237	A	G	151.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=58.47;MQ0=0;OQ=1912.22;QD=32.97;SB=-672.55	GT:AD:DP:GL:GQ	1/1:0,58:55:-194.84,-16.57,-0.03:99
-chr1	4031220	rs7532788	C	T	294.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.01;MQ0=0;OQ=2323.83;QD=38.10;SB=-1060.94	GT:AD:DP:GL:GQ	1/1:0,60:59:-235.99,-17.78,-0.02:99
-chr1	4031586	rs3936238	A	G	138.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=58.69;MQ0=0;OQ=2519.09;QD=35.48;SB=-1162.71	GT:AD:DP:GL:GQ	1/1:0,71:71:-255.52,-21.39,-0.03:99
-chr1	4031878	rs9628649	C	T	644.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.66;MQ0=0;OQ=2284.52;QD=38.72;SB=-825.09	GT:AD:DP:GL:GQ	1/1:0,59:58:-232.06,-17.48,-0.02:99
-chr1	4031986	rs9628650	G	T	130.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=0.92;MQ=59.09;MQ0=0;OQ=2689.72;QD=35.39;SB=-1301.17	GT:AD:DP:GL:GQ	1/1:0,75:74:-272.58,-22.29,-0.02:99
-chr1	4032433	rs7529548	G	C	483.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=2621.92;QD=40.34;SB=-1086.06	GT:AD:DP:GL:GQ	1/1:0,65:62:-265.80,-18.69,-0.02:99
-chr1	4032637	rs7538658	C	T	720.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2747.15;QD=39.25;SB=-1233.63	GT:AD:DP:GL:GQ	1/1:0,70:70:-278.33,-21.09,-0.03:99
-chr1	4032742	rs7529853	G	C	195.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.01;HRun=0;HaplotypeScore=1.43;MQ=59.67;MQ0=0;OQ=2970.07;QD=42.43;SB=-1256.98	GT:AD:DP:GL:GQ	1/1:0,69:70:-300.61,-20.79,-0.02:99
-chr1	4032815	rs10157040	T	G	55.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.79;MQ=60.00;MQ0=0;OQ=2073.63;QD=33.99;SB=-743.38	GT:AD:DP:GL:GQ	1/1:0,61:60:-210.97,-18.07,-0.02:99
-chr1	4032895	rs60405213	A	G	332.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=1606.75;QD=29.75;SB=-645.91	GT:AD:DP:GL:GQ	1/1:0,54:50:-164.30,-15.08,-0.04:99
-chr1	4032956	rs10157057	T	C	590.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.21;MQ0=0;OQ=1852.28;QD=34.95;SB=-804.30	GT:AD:DP:GL:GQ	1/1:0,53:53:-188.83,-15.97,-0.02:99
-chr1	4033505	.	A	T	38.74	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=20;HaplotypeScore=16.08;MQ=50.01;MQ0=1;QD=0.73;SB=62.20	GT:AD:DP:GL:GQ	0/1:43,10:38:-18.61,-11.45,-119.32:71.58
-chr1	4035925	rs6686087	G	A	676.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.29;MQ0=0;OQ=1910.92;QD=36.06;SB=-777.68	GT:AD:DP:GL:GQ	1/1:0,53:52:-194.71,-15.68,-0.03:99
-chr1	4036210	rs7553013	A	G	89.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=60.00;MQ0=0;OQ=1455.02;QD=35.49;SB=-567.89	GT:AD:DP:GL:GQ	1/1:0,41:41:-149.10,-12.35,-0.01:99
-chr1	4037078	rs6671404	G	A	595.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=49.26;MQ0=0;OQ=2338.43;QD=39.63;SB=-1084.95	GT:AD:DP:GL:GQ	1/1:0,59:59:-237.45,-17.77,-0.02:99
-chr1	4037233	.	C	T	0.09	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=10.47;MQ=23.53;MQ0=14;OQ=386.45;QD=7.43;SB=-174.70	GT:AD:DP:GL:GQ	0/1:24,28:16:-46.75,-4.82,-13.21:83.85
-chr1	4037300	rs12731949	G	A	33.47	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=10.93;MQ=13.10;MQ0=15;QD=0.96;SB=-6.99	GT:AD:DP:GL:GQ	0/1:26,6:3:-7.53,-0.90,-3.57:26.65
-chr1	4037316	.	A	G	19.58	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=4.32;MQ=10.60;MQ0=15;QD=0.68;SB=-10.00	GT:AD:DP:GL:GQ	0/1:25,4:3:-6.14,-0.91,-2.76:18.51
-chr1	4037317	rs12747176	C	T	33.48	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=4.32;MQ=10.78;MQ0=15;QD=1.20;SB=-10.00	GT:AD:DP:GL:GQ	0/1:25,3:3:-7.53,-0.90,-3.30:23.93
-chr1	4037349	rs55974954	C	T	4.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=2.86;MQ=15.25;MQ0=10;OQ=78.13;QD=3.91;SB=-10.00	GT:AD:DP:GL:GQ	0/1:11,9:5:-12.60,-1.51,-5.79:42.85
-chr1	4037373	.	C	T	49.25	HARD_TO_VALIDATE;LowQual;SnpCluster	AC=2;AF=1.00;AN=2;DP=23;Dels=0.09;HRun=0;HaplotypeScore=5.10;MQ=12.43;MQ0=14;QD=2.14;SB=-10.00	GT:AD:DP:GL:GQ	1/1:17,4:2:-8.33,-0.60,-0.00:6.02
-chr1	4037374	rs58910132	A	G	67.17	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.10;HRun=0;HaplotypeScore=2.46;MQ=12.64;MQ0=13;QD=3.20;SB=-10.00	GT:AD:DP:GL:GQ	1/1:14,5:3:-10.21,-0.90,-0.00:9.03
-chr1	4037375	.	C	T	89.13	HARD_TO_VALIDATE;SnpCluster	AC=2;AF=1.00;AN=2;DP=21;Dels=0.10;HRun=0;HaplotypeScore=2.62;MQ=12.64;MQ0=13;QD=4.24;SB=-10.00	GT:AD:DP:GL:GQ	1/1:14,5:3:-12.40,-0.90,-0.00:9.03
-chr1	4037523	.	C	T	36.25	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=8.14;MQ=8.07;MQ0=27;QD=0.91;SB=-10.00	GT:AD:DP:GL:GQ	0/1:35,5:3:-7.81,-0.90,-3.47:25.65
-chr1	4037532	.	G	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=7.98;MQ=8.93;MQ0=30;OQ=75.12;QD=1.67;SB=-10.00	GT:AD:DP:GL:GQ	0/1:32,13:5:-12.30,-1.51,-6.19:46.86
-chr1	4037589	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=30.55;MQ=12.67;MQ0=42;OQ=141.32;QD=1.74;SB=-10.00	GT:AD:DP:GL:GQ	0/1:62,18:18:-22.84,-5.42,-40.02:99
-chr1	4037590	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=31.66;MQ=13.12;MQ0=42;OQ=99.34;QD=1.18;SB=-10.00	GT:AD:DP:GL:GQ	0/1:65,14:18:-18.65,-5.43,-43.06:99
-chr1	4037755	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=10.80;MQ=28.57;MQ0=9;OQ=123.11;QD=4.25;SB=-10.00	GT:AD:DP:GL:GQ	0/1:16,13:15:-20.11,-4.52,-34.90:99
-chr1	4037764	.	G	A	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=11.39;MQ=27.02;MQ0=10;OQ=406.03;QD=10.68;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,21:18:-49.31,-5.43,-18.48:99
-chr1	4037797	.	G	A	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=1;HaplotypeScore=2.36;MQ=25.37;MQ0=16;OQ=242.41;QD=2.96;SB=-0.99	GT:AD:DP:GL:GQ	0/1:69,13:49:-42.29,-14.76,-143.27:99
-chr1	4037813	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=1;HaplotypeScore=30.43;MQ=23.50;MQ0=19;OQ=796.43;QD=8.38;SB=2.04	GT:AD:DP:GL:GQ	0/1:48,46:55:-99.50,-16.57,-97.10:99
-chr1	4037822	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=126;Dels=0.00;HRun=0;HaplotypeScore=35.10;MQ=23.24;MQ0=31;OQ=606.69;QD=4.81;SB=-57.33	GT:AD:DP:GL:GQ	0/1:70,54:63:-82.95,-19.00,-147.74:99
-chr1	4037843	rs61768802	C	A	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=180;Dels=0.00;HRun=1;HaplotypeScore=17.92;MQ=21.78;MQ0=58;OQ=417.65;QD=2.32;SB=-34.91	GT:AD:DP:GL:GQ	0/1:148,32:87:-71.25,-26.21,-246.67:99
-chr1	4037880	rs61768803	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=196;Dels=0.00;HRun=0;HaplotypeScore=29.31;MQ=22.28;MQ0=61;OQ=120.84;QD=0.62;SB=11.02	GT:AD:DP:GL:GQ	0/1:165,26:69:-36.22,-20.85,-175.88:99
-chr1	4037929	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=1;HaplotypeScore=2.77;MQ=21.90;MQ0=34;OQ=107.87;QD=1.14;SB=35.15	GT:AD:DP:GL:GQ	0/1:76,17:46:-27.95,-13.88,-137.64:99
-chr1	4037943	.	C	T	85.40	PASS	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=21.61;MQ0=16;OQ=809.30;QD=13.95;SB=-392.58	GT:AD:DP:GL:GQ	0/1:14,44:31:-93.56,-9.34,-20.82:99
-chr1	4037953	.	T	C	0.02	FDRtranche1.00to2.00	AC=2;AF=1.00;AN=2;DP=38;Dels=0.00;HRun=3;HaplotypeScore=11.12;MQ=21.57;MQ0=12;OQ=534.72;QD=14.07;SB=-137.10	GT:AD:DP:GL:GQ	1/1:2,36:20:-60.44,-6.03,-3.38:26.46
-chr1	4037971	.	G	A	35.49	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=11.71;MQ0=7;QD=2.96;SB=-7.00	GT:AD:DP:GL:GQ	0/1:2,10:3:-7.73,-0.90,-2.97:20.65
-chr1	4038007	.	C	T	11.96	PASS	AC=2;AF=1.00;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=24.37;MQ0=17;OQ=478.18;QD=12.58;SB=-0.67	GT:AD:DP:GL:GQ	1/1:9,29:15:-54.99,-4.52,-3.70:8.18
-chr1	4038085	.	G	A	6.73	PASS	AC=2;AF=1.00;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=25.54;MQ0=21;OQ=1434.12;QD=19.65;SB=-222.29	GT:AD:DP:GL:GQ	1/1:0,70:37:-147.01,-11.15,-0.01:99
-chr1	4038095	.	A	C	37.18	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=2;HaplotypeScore=5.05;MQ=31.28;MQ0=12;QD=0.48;SB=35.10	GT:AD:DP:GL:GQ	0/1:67,11:51:-22.37,-15.37,-153.89:70.01
-chr1	4038119	rs61768805	A	G	52.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=34.39;MQ0=8;OQ=2201.59;QD=25.60;SB=-880.89	GT:AD:DP:GL:GQ	1/1:0,86:64:-223.78,-19.28,-0.04:99
-chr1	4038137	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=1;HaplotypeScore=16.06;MQ=35.46;MQ0=14;OQ=344.80;QD=2.45;SB=-97.28	GT:AD:DP:GL:GQ	0/1:105,36:95:-66.41,-28.65,-282.14:99
-chr1	4038181	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=35.03;MQ0=15;OQ=1093.66;QD=4.11;SB=-524.11	GT:AD:DP:GL:GQ	0/1:186,80:195:-171.41,-58.76,-524.00:99
-chr1	4038248	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=280;Dels=0.00;HRun=0;HaplotypeScore=30.85;MQ=29.46;MQ0=44;OQ=1065.01;QD=3.80;SB=-230.16	GT:AD:DP:GL:GQ	0/1:155,104:139:-156.85,-47.07,-312.49:99
-chr1	4038269	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=221;Dels=0.00;HRun=2;HaplotypeScore=13.90;MQ=27.15;MQ0=44;OQ=427.47;QD=1.93;SB=-154.75	GT:AD:DP:GL:GQ	0/1:158,62:110:-79.18,-33.15,-296.78:99
-chr1	4038306	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=30.95;MQ=24.15;MQ0=24;OQ=80.75;QD=0.71;SB=17.44	GT:AD:DP:GL:GQ	0/1:88,21:54:-27.64,-16.28,-152.20:99
-chr1	4038311	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=30.17;MQ=23.18;MQ0=20;OQ=320.40;QD=3.56;SB=-113.10	GT:AD:DP:GL:GQ	0/1:60,30:46:-49.20,-13.87,-108.56:99
-chr1	4038321	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=3;HaplotypeScore=15.26;MQ=23.68;MQ0=14;OQ=766.53;QD=12.99;SB=-327.28	GT:AD:DP:GL:GQ	0/1:10,49:31:-89.28,-9.34,-16.69:73.43
-chr1	4038334	.	G	A	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.69;MQ=25.40;MQ0=9;OQ=78.94;QD=1.49;SB=-27.72	GT:AD:DP:GL:GQ	0/1:40,11:25:-21.55,-10.37,-63.16:99
-chr1	4038397	.	A	G	17.54	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.28;MQ=29.53;MQ0=4;OQ=326.31;QD=7.42;SB=-58.84	GT:AD:DP:GL:GQ	0/1:24,20:28:-44.35,-8.44,-57.72:99
-chr1	4038422	rs61768806	G	A	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=18.20;MQ=33.84;MQ0=4;OQ=183.71;QD=3.40;SB=-62.31	GT:AD:DP:GL:GQ	0/1:35,13:24:-31.46,-9.80,-50.09:99
-chr1	4038450	rs9426493	G	A	0.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=7.50;MQ=40.53;MQ0=7;OQ=257.95;QD=3.31;SB=38.10	GT:AD:DP:GL:GQ	0/1:50,27:46:-42.95,-13.87,-108.04:99
-chr1	4038485	.	T	C	49.84	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=1;HaplotypeScore=36.99;MQ=38.79;MQ0=13;QD=0.38;SB=-42.38	GT:AD:DP:GL:GQ	0/1:107,23:79:-32.08,-23.81,-273.26:82.67
-chr1	4038495	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=3;HaplotypeScore=26.37;MQ=38.36;MQ0=11;OQ=110.49;QD=0.81;SB=81.70	GT:AD:DP:GL:GQ	0/1:101,35:77:-37.55,-23.22,-250.69:99
-chr1	4038559	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=2;HaplotypeScore=4.40;MQ=37.40;MQ0=14;OQ=181.94;QD=1.28;SB=76.72	GT:AD:DP:GL:GQ	0/1:114,27:102:-52.21,-30.74,-302.69:99
-chr1	4038595	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=10.57;MQ=44.92;MQ0=10;OQ=118.91;QD=1.67;SB=44.58	GT:AD:DP:GL:GQ	0/1:49,22:52:-30.86,-15.68,-162.15:99
-chr1	4038920	rs12240075	G	A	506.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.13;MQ0=0;OQ=3029.69;QD=39.35;SB=-1486.40	GT:AD:DP:GL:GQ	1/1:0,77:75:-306.57,-22.59,-0.02:99
-chr1	4039098	rs4073835	G	A	496.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2305.48;QD=39.08;SB=-997.03	GT:AD:DP:GL:GQ	1/1:0,59:59:-234.15,-17.78,-0.02:99
-chr1	4039791	rs4639725	C	T	236.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.86;MQ=59.67;MQ0=0;OQ=2672.94;QD=38.18;SB=-1315.36	GT:AD:DP:GL:GQ	1/1:0,70:69:-270.90,-20.79,-0.02:99
-chr1	4039890	rs4436359	C	A	272.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.38;MQ=60.00;MQ0=0;OQ=1804.54;QD=34.70;SB=-797.85	GT:AD:DP:GL:GQ	1/1:1,51:51:-184.06,-15.36,-0.02:99
-chr1	4040736	rs6684922	G	A	149.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.70;MQ0=0;OQ=2464.15;QD=39.74;SB=-984.31	GT:AD:DP:GL:GQ	1/1:0,62:61:-250.01,-18.37,-0.01:99
-chr1	4041212	rs7418376	A	G	9.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=4.36;MQ=59.69;MQ0=0;OQ=2587.00;QD=34.49;SB=-1318.64	GT:AD:DP:GL:GQ	1/1:0,75:71:-262.30,-21.38,-0.02:99
-chr1	4041774	rs6657076	T	C	524.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.94;MQ0=0;OQ=2268.81;QD=30.25;SB=-1070.20	GT:AD:DP:GL:GQ	1/1:0,75:71:-230.53,-21.41,-0.06:99
-chr1	4045735	rs10915422	A	C	14.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=4.42;MQ=59.68;MQ0=0;OQ=2455.12;QD=33.63;SB=-728.83	GT:AD:DP:GL:GQ	1/1:0,73:71:-249.12,-21.38,-0.02:99
-chr1	4045888	rs10915423	A	C	727.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2031.28;QD=35.02;SB=-998.12	GT:AD:DP:GL:GQ	1/1:0,58:58:-206.73,-17.47,-0.02:99
-chr1	4046948	rs10915425	T	G	80.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=53.47;MQ0=0;OQ=1869.59;QD=31.69;SB=-736.37	GT:AD:DP:GL:GQ	1/1:0,59:55:-190.57,-16.57,-0.02:99
-chr1	4046996	rs55774050	C	G	2240.61	Indel	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=9.46;MQ=51.11;MQ0=0;QD=43.09;SB=-978.74	GT:AD:DP:GL:GQ	1/1:0,52:52:-227.66,-15.67,-0.01:99
-chr1	4047821	rs11578552	T	C	402.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.32;MQ0=0;OQ=2100.45;QD=30.89;SB=-846.51	GT:AD:DP:GL:GQ	1/1:0,68:66:-213.69,-19.91,-0.06:99
-chr1	4047883	rs11577344	C	T	490.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1935.40;QD=37.95;SB=-660.87	GT:AD:DP:GL:GQ	1/1:0,51:48:-197.13,-14.46,-0.01:99
-chr1	4049164	rs7411603	A	G	3.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=6.69;MQ=58.71;MQ0=0;OQ=1270.28;QD=27.03;SB=-493.17	GT:AD:DP:GL:GQ	1/1:0,47:41:-130.65,-12.36,-0.04:99
-chr1	4050387	rs10753365	G	A	99.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=58.61;MQ0=0;OQ=1534.51;QD=32.65;SB=-464.08	GT:AD:DP:GL:GQ	1/1:0,46:42:-157.07,-12.67,-0.03:99
-chr1	4051611	rs4548406	T	C	78.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.20;MQ0=0;OQ=1346.57;QD=28.65;SB=-544.85	GT:AD:DP:GL:GQ	1/1:0,47:44:-138.29,-13.28,-0.05:99
-chr1	4051999	rs12123119	C	T	624.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2169.89;QD=37.41;SB=-1044.39	GT:AD:DP:GL:GQ	1/1:0,58:55:-220.59,-16.57,-0.02:99
-chr1	4052066	rs4654410	C	T	678.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=2087.99;QD=37.96;SB=-873.17	GT:AD:DP:GL:GQ	1/1:0,55:53:-212.40,-15.97,-0.02:99
-chr1	4052788	rs4481820	C	A	313.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=58.81;MQ0=0;OQ=1188.08;QD=18.86;SB=-612.83	GT:AD:DP:GL:GQ	0/1:26,37:61:-140.47,-18.38,-73.47:99
-chr1	4052947	rs6676961	T	G	272.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=60.00;MQ0=0;OQ=1401.56;QD=15.75;SB=-713.67	GT:AD:DP:GL:GQ	0/1:39,50:87:-169.64,-26.20,-144.08:99
-chr1	4053067	rs12125719	A	G	101.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.17;MQ0=0;OQ=1483.09;QD=29.08;SB=-606.95	GT:AD:DP:GL:GQ	1/1:0,51:48:-151.94,-14.48,-0.05:99
-chr1	4053090	rs12125725	A	G	83.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.17;MQ0=0;OQ=1585.81;QD=31.09;SB=-493.18	GT:AD:DP:GL:GQ	1/1:0,51:49:-162.20,-14.77,-0.03:99
-chr1	4053122	rs12126649	T	C	176.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.71;MQ=59.24;MQ0=0;OQ=907.97;QD=14.88;SB=-331.31	GT:AD:DP:GL:GQ	0/1:25,36:59:-111.87,-17.79,-96.53:99
-chr1	4055170	rs12033210	T	C	0.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=1.74;MQ=28.53;MQ0=2;OQ=209.19;QD=4.65;SB=-102.57	GT:AD:DP:GL:GQ	0/1:32,13:39:-35.96,-11.75,-110.64:99
-chr1	4056038	rs10799198	G	A	260.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=3.90;MQ=58.67;MQ0=0;OQ=782.28;QD=15.96;SB=-386.17	GT:AD:DP:GL:GQ	0/1:25,24:47:-95.68,-14.17,-75.73:99
-chr1	4057058	rs4600014	A	G	442.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=917.69;QD=13.70;SB=-389.30	GT:AD:DP:GL:GQ	0/1:34,33:66:-114.93,-19.88,-136.81:99
-chr1	4057633	rs4361964	G	C	120.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=2.73;MQ=59.22;MQ0=0;OQ=837.80;QD=15.51;SB=-437.88	GT:AD:DP:GL:GQ	0/1:29,25:53:-103.04,-15.97,-126.00:99
-chr1	4057702	rs4351611	C	T	297.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=59.56;MQ0=0;OQ=594.05;QD=11.21;SB=-284.78	GT:AD:DP:GL:GQ	0/1:33,20:53:-78.67,-15.98,-105.42:99
-chr1	4057917	.	A	T	65.58	PASS	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.62;MQ0=0;OQ=752.30;QD=12.54;SB=-170.72	GT:AD:DP:GL:GQ	0/1:33,27:58:-95.98,-17.47,-122.23:99
-chr1	4058815	rs10915428	G	T	369.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.39;MQ0=0;OQ=1224.65;QD=16.11;SB=-630.74	GT:AD:DP:GL:GQ	0/1:35,41:75:-148.34,-22.59,-115.71:99
-chr1	4059239	rs10799199	C	T	251.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.66;MQ0=0;OQ=1243.57;QD=18.84;SB=-304.82	GT:AD:DP:GL:GQ	0/1:29,37:64:-146.92,-19.28,-100.42:99
-chr1	4059378	.	C	T	11.57	PASS	AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=3;HaplotypeScore=0.47;MQ=59.47;MQ0=0;OQ=1236.26;QD=14.72;SB=-551.55	GT:AD:DP:GL:GQ	0/1:45,38:82:-151.61,-24.70,-168.36:99
-chr1	4060338	rs10799200	T	C	170.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=152.75;QD=7.64;SB=-10.00	GT:AD:DP:GL:GQ	0/1:13,7:19:-24.28,-5.72,-48.27:99
-chr1	4064782	rs61768818	G	A	481.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.07;MQ0=0;OQ=848.15;QD=13.90;SB=-350.47	GT:AD:DP:GL:GQ	0/1:34,27:59:-105.87,-17.77,-118.54:99
-chr1	4066674	rs12032257	C	T	294.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=59.36;MQ0=0;OQ=916.01;QD=14.09;SB=-410.80	GT:AD:DP:GL:GQ	0/1:35,30:64:-114.18,-19.29,-113.47:99
-chr1	4067283	.	T	C	0.61	PASS	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=2;HaplotypeScore=4.39;MQ=59.62;MQ0=0;OQ=557.04;QD=9.13;SB=-241.90	GT:AD:DP:GL:GQ	0/1:35,25:58:-76.48,-17.49,-133.72:99
-chr1	4067926	rs7542313	A	G	387.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=220.94;QD=10.52;SB=-100.82	GT:AD:DP:GL:GQ	0/1:11,10:19:-31.10,-5.72,-40.90:99
-chr1	4075727	.	C	T	158.87	PASS	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.34;MQ=59.67;MQ0=0;OQ=1143.65;QD=16.34;SB=-503.75	GT:AD:DP:GL:GQ	0/1:35,35:66:-137.54,-19.89,-102.02:99
-chr1	4075966	rs6670920	T	C	606.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=1104.32;QD=15.13;SB=-452.80	GT:AD:DP:GL:GQ	0/1:30,43:71:-135.11,-21.40,-121.92:99
-chr1	4077630	rs4654486	G	A	691.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2711.47;QD=39.87;SB=-1087.95	GT:AD:DP:GL:GQ	1/1:0,68:68:-274.75,-20.48,-0.02:99
-chr1	4078163	rs10737402	T	C	504.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=530.04;QD=10.82;SB=-231.26	GT:AD:DP:GL:GQ	0/1:26,23:49:-71.06,-14.78,-100.24:99
-chr1	4080498	rs12042946	T	C	249.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=60.30;MQ0=0;OQ=891.53;QD=12.56;SB=-237.45	GT:AD:DP:GL:GQ	0/1:37,34:69:-113.22,-20.78,-148.64:99
-chr1	4080702	rs12040805	C	T	139.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.60;MQ0=0;OQ=776.81;QD=15.54;SB=-108.61	GT:AD:DP:GL:GQ	0/1:26,24:46:-94.83,-13.87,-71.68:99
-chr1	4081256	rs10753367	T	C	35.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=3;HaplotypeScore=2.04;MQ=59.74;MQ0=0;OQ=1167.96;QD=12.98;SB=-513.88	GT:AD:DP:GL:GQ	0/1:48,42:88:-146.59,-26.51,-188.24:99
-chr1	4081433	rs10799203	T	G	17.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=0.74;MQ=59.59;MQ0=0;OQ=328.89;QD=7.15;SB=-123.86	GT:AD:DP:GL:GQ	0/1:29,17:43:-49.13,-12.95,-102.00:99
-chr1	4082645	rs4400585	G	T	491.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.19;MQ0=0;OQ=492.73;QD=10.71;SB=-210.53	GT:AD:DP:GL:GQ	0/1:27,19:44:-65.81,-13.26,-82.00:99
-chr1	4082866	rs10915437	A	G	75.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=4.59;MQ=58.36;MQ0=0;OQ=891.90;QD=12.56;SB=-289.16	GT:AD:DP:GL:GQ	0/1:37,34:68:-112.97,-20.49,-138.67:99
-chr1	4083359	rs56090673	C	T	320.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1009.69;QD=17.11;SB=-451.46	GT:AD:DP:GL:GQ	0/1:27,32:58:-121.73,-17.48,-93.77:99
-chr1	4083978	rs7531421	A	G	116.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=57.42;MQ0=0;OQ=435.48;QD=7.02;SB=-215.25	GT:AD:DP:GL:GQ	0/1:41,21:60:-64.91,-18.08,-162.54:99
-chr1	4084862	rs6675734	C	T	47.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=5.09;MQ=59.20;MQ0=0;OQ=1105.86;QD=19.07;SB=-554.64	GT:AD:DP:GL:GQ	0/1:25,33:57:-131.05,-17.18,-82.44:99
-chr1	4084986	rs10753368	A	G	566.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.78;MQ0=0;OQ=1198.41;QD=14.10;SB=-565.61	GT:AD:DP:GL:GQ	0/1:44,41:83:-148.13,-25.00,-168.94:99
-chr1	4085630	rs6679136	C	T	24.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=4.32;MQ=58.42;MQ0=0;OQ=804.43;QD=14.36;SB=-252.24	GT:AD:DP:GL:GQ	0/1:29,27:53:-99.70,-15.97,-99.87:99
-chr1	4085663	rs6669476	G	A	136.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=57.81;MQ0=0;OQ=833.61;QD=13.89;SB=-171.20	GT:AD:DP:GL:GQ	0/1:32,27:56:-103.51,-16.87,-106.04:99
-chr1	4086169	rs6426389	C	T	138.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=59.69;MQ0=0;OQ=1183.25;QD=19.72;SB=-609.44	GT:AD:DP:GL:GQ	0/1:26,34:60:-139.68,-18.07,-94.16:99
-chr1	4086333	rs6663976	C	G	599.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=3962.79;QD=44.03;SB=-1451.88	GT:AD:DP:GL:GQ	1/1:0,90:89:-395.28,-26.81,-0.02:99
-chr1	4087812	rs4654487	T	C	259.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.38;MQ=59.52;MQ0=0;OQ=1480.85;QD=30.85;SB=-766.73	GT:AD:DP:GL:GQ	1/1:0,48:47:-151.71,-14.17,-0.04:99
-chr1	4089403	.	G	C	16.75	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.80;MQ=58.74;MQ0=0;QD=0.45;SB=53.21	GT:AD:DP:GL:GQ	0/1:27,10:26:-12.79,-7.84,-102.04:49.49
-chr1	4089489	rs7536041	T	C	90.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=59.19;MQ0=0;OQ=812.10;QD=15.62;SB=-146.31	GT:AD:DP:GL:GQ	0/1:23,29:51:-99.86,-15.37,-93.49:99
-chr1	4090545	rs4282783	T	G	725.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=2332.11;QD=35.34;SB=-970.80	GT:AD:DP:GL:GQ	1/1:0,66:66:-236.81,-19.88,-0.02:99
-chr1	4091584	rs4654488	A	T	219.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=2.30;MQ=60.00;MQ0=0;OQ=743.21;QD=16.52;SB=-370.44	GT:AD:DP:GL:GQ	0/1:20,25:44:-90.86,-13.25,-75.80:99
-chr1	4092168	rs10915441	C	G	2.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=4;HaplotypeScore=3.62;MQ=59.69;MQ0=0;OQ=1389.48;QD=18.78;SB=-645.48	GT:AD:DP:GL:GQ	0/1:35,39:69:-163.06,-20.83,-116.77:99
-chr1	4092567	rs10915442	A	G	394.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.42;MQ0=0;OQ=572.04;QD=14.30;SB=-311.22	GT:AD:DP:GL:GQ	0/1:18,22:39:-72.24,-11.76,-67.58:99
-chr1	4093270	rs10799206	C	G	674.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.42;MQ0=0;OQ=2045.47;QD=38.59;SB=-902.40	GT:AD:DP:GL:GQ	1/1:0,52:50:-208.16,-15.07,-0.02:99
-chr1	4093286	rs12409803	G	A	414.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=57.03;MQ0=0;OQ=773.71;QD=14.33;SB=-322.45	GT:AD:DP:GL:GQ	0/1:28,26:51:-96.03,-15.38,-79.04:99
-chr1	4093324	rs10915443	G	C	254.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=58.02;MQ0=0;OQ=1430.72;QD=20.15;SB=-674.45	GT:AD:DP:GL:GQ	0/1:30,40:69:-167.15,-20.79,-134.28:99
-chr1	4093733	rs6693173	A	G	464.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=1381.36;QD=28.78;SB=-644.93	GT:AD:DP:GL:GQ	1/1:0,48:45:-141.76,-13.57,-0.04:99
-chr1	4094457	rs4131506	A	C	340.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=59.60;MQ0=0;OQ=704.94;QD=12.15;SB=-316.99	GT:AD:DP:GL:GQ	0/1:32,26:58:-91.25,-17.47,-120.43:99
-chr1	4094660	rs4131508	A	G	571.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.76;MQ0=0;OQ=1332.71;QD=17.31;SB=-634.89	GT:AD:DP:GL:GQ	0/1:33,44:77:-159.75,-23.19,-134.55:99
-chr1	4094683	rs4630099	A	G	443.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1288.63;QD=16.31;SB=-670.63	GT:AD:DP:GL:GQ	0/1:36,43:77:-155.34,-23.19,-143.15:99
-chr1	4095397	rs10915444	T	C	1.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=8.82;MQ=58.53;MQ0=0;OQ=789.45;QD=10.25;SB=-380.13	GT:AD:DP:GL:GQ	0/1:49,28:72:-103.91,-21.68,-179.32:99
-chr1	4095558	rs35986531	G	A	271.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=1.49;MQ=56.64;MQ0=0;OQ=1336.75;QD=16.71;SB=-522.69	GT:AD:DP:GL:GQ	0/1:36,44:75:-159.55,-22.59,-133.47:99
-chr1	4095815	rs12118815	A	T	0.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=1;HaplotypeScore=13.10;MQ=57.70;MQ0=3;OQ=1249.48;QD=13.88;SB=-570.06	GT:AD:DP:GL:GQ	0/1:44,46:80:-152.33,-24.10,-146.70:99
-chr1	4095919	.	A	T	39.64	LowQual	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=51.56;MQ0=5;QD=0.50;SB=-37.91	GT:AD:DP:GL:GQ	0/1:71,9:66:-27.13,-19.88,-223.94:72.48
-chr1	4096225	.	A	G	48.26	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=1.44;MQ=52.24;MQ0=7;QD=0.68;SB=74.28	GT:AD:DP:GL:GQ	0/1:64,7:63:-27.09,-18.98,-229.53:81.10
-chr1	4096236	.	T	G	0.06	PASS	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=54.07;MQ0=3;OQ=91.64;QD=1.31;SB=86.24	GT:AD:DP:GL:GQ	0/1:61,9:66:-32.33,-19.88,-208.22:99
-chr1	4096240	.	A	T	0.08	PASS	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=53.91;MQ0=2;OQ=161.77;QD=2.16;SB=86.29	GT:AD:DP:GL:GQ	0/1:64,11:72:-41.14,-21.68,-231.71:99
-chr1	4096257	.	A	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=3.00;MQ=53.32;MQ0=2;OQ=207.48;QD=2.56;SB=92.31	GT:AD:DP:GL:GQ	0/1:68,13:79:-47.82,-23.79,-251.49:99
-chr1	4096278	.	A	G	232.76	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=0;HaplotypeScore=27.32;MQ=52.46;MQ0=1;QD=2.68;SB=98.35	GT:AD:DP:GL:GQ	0/1:72,15:85:-52.16,-25.60,-288.15:99
-chr1	4096286	.	G	A	106.04	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=1;HaplotypeScore=48.93;MQ=51.56;MQ0=1;QD=1.18;SB=98.32	GT:AD:DP:GL:GQ	0/1:78,12:85:-39.49,-25.60,-276.62:99
-chr1	4096288	rs34088827	G	A	955.67	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=1;HaplotypeScore=48.46;MQ=51.26;MQ0=1;QD=10.62;SB=-379.33	GT:AD:DP:GL:GQ	0/1:57,33:88:-125.36,-26.51,-207.05:99
-chr1	4096294	.	A	T	86.31	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=1;HaplotypeScore=32.32;MQ=50.46;MQ0=1;QD=0.97;SB=89.30	GT:AD:DP:GL:GQ	0/1:73,16:80:-36.01,-24.10,-264.64:99
-chr1	4096606	rs28726337	A	G	0.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=2;HaplotypeScore=13.44;MQ=43.57;MQ0=1;OQ=262.51;QD=2.76;SB=-123.92	GT:AD:DP:GL:GQ	0/1:75,20:86:-55.44,-25.91,-287.10:99
-chr1	4096617	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=1;HaplotypeScore=34.91;MQ=42.33;MQ0=1;OQ=1160.59;QD=10.01;SB=-606.06	GT:AD:DP:GL:GQ	0/1:70,46:109:-152.17,-32.83,-258.54:99
-chr1	4096620	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=123;Dels=0.01;HRun=0;HaplotypeScore=30.11;MQ=42.25;MQ0=1;OQ=989.14;QD=8.04;SB=-388.23	GT:AD:DP:GL:GQ	0/1:72,50:106:-134.12,-31.93,-263.47:99
-chr1	4096638	rs28412783	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=181;Dels=0.02;HRun=0;HaplotypeScore=64.64;MQ=40.70;MQ0=1;OQ=1178.07;QD=6.51;SB=-446.63	GT:AD:DP:GL:GQ	0/1:123,47:169:-194.38,-73.29,-545.37:99
-chr1	4096655	rs61768832	A	G	321.42	DPFilter;Indel	AC=1;AF=0.50;AN=2;DB;DP=228;Dels=0.00;HRun=1;HaplotypeScore=261.82;MQ=41.93;MQ0=0;QD=1.41;SB=-157.54	GT:AD:DP:GL:GQ	0/1:199,29:224:-102.90,-67.48,-791.83:99
-chr1	4096678	.	T	G	1342.80	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=236;Dels=0.00;HRun=0;HaplotypeScore=216.99;MQ=43.01;MQ0=0;QD=5.69;SB=-512.77	GT:AD:DP:GL:GQ	0/1:166,63:218:-227.86,-90.30,-587.53:99
-chr1	4096685	.	A	G	1626.24	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=239;Dels=0.00;HRun=1;HaplotypeScore=162.66;MQ=41.97;MQ0=0;QD=6.80;SB=-808.35	GT:AD:DP:GL:GQ	0/1:167,72:225:-233.68,-67.78,-652.24:99
-chr1	4096698	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=228;Dels=0.00;HRun=0;HaplotypeScore=76.98;MQ=42.62;MQ0=0;OQ=2269.48;QD=9.95;SB=-1066.45	GT:AD:DP:GL:GQ	0/1:129,90:219:-325.16,-94.93,-493.11:99
-chr1	4096706	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=230;Dels=0.00;HRun=1;HaplotypeScore=79.95;MQ=43.15;MQ0=0;OQ=1034.27;QD=4.50;SB=-170.01	GT:AD:DP:GL:GQ	0/1:185,45:223:-173.88,-67.17,-658.24:99
-chr1	4096718	rs61768834	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=216;Dels=0.00;HRun=0;HaplotypeScore=38.48;MQ=44.61;MQ0=0;OQ=645.34;QD=2.99;SB=-265.93	GT:AD:DP:GL:GQ	0/1:168,32:157:-165.70,-97.89,-554.00:99
-chr1	4096731	.	G	A	559.62	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=83.54;MQ=45.39;MQ0=0;QD=3.13;SB=44.95	GT:AD:DP:GL:GQ	0/1:150,29:155:-105.94,-46.69,-468.61:99
-chr1	4096732	rs61768835	A	G	2251.43	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=171;Dels=0.00;HRun=2;HaplotypeScore=115.12;MQ=45.31;MQ0=0;QD=13.17;SB=-1083.79	GT:AD:DP:GL:GQ	0/1:80,91:158:-276.04,-47.61,-312.72:99
-chr1	4096736	rs61768836	A	G	2066.81	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=169;Dels=0.02;HRun=0;HaplotypeScore=91.40;MQ=45.63;MQ0=0;QD=12.23;SB=-1029.89	GT:AD:DP:GL:GQ	0/1:85,81:160:-257.27,-47.30,-336.21:99
-chr1	4096755	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=1;HaplotypeScore=46.33;MQ=46.26;MQ0=0;OQ=201.55;QD=1.56;SB=65.52	GT:AD:DP:GL:GQ	0/1:112,17:113:-57.49,-34.05,-383.82:99
-chr1	4096759	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=0;HaplotypeScore=42.17;MQ=46.84;MQ0=0;OQ=310.94;QD=2.51;SB=-151.81	GT:AD:DP:GL:GQ	0/1:106,18:122:-71.13,-36.75,-367.88:99
-chr1	4096775	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=30.95;MQ=47.51;MQ0=0;OQ=647.24;QD=5.73;SB=52.09	GT:AD:DP:GL:GQ	0/1:87,26:107:-100.24,-32.23,-298.38:99
-chr1	4096805	.	A	G	20.07	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=1;HaplotypeScore=14.94;MQ=48.07;MQ0=0;QD=0.18;SB=107.37	GT:AD:DP:GL:GQ	0/1:94,15:99:-35.11,-29.83,-355.50:52.86
-chr1	4096811	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=1;HaplotypeScore=14.56;MQ=47.07;MQ0=0;OQ=301.49;QD=2.87;SB=92.31	GT:AD:DP:GL:GQ	0/1:85,20:99:-63.26,-29.83,-325.00:99
-chr1	4096845	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=1;HaplotypeScore=27.21;MQ=46.78;MQ0=0;OQ=135.08;QD=1.34;SB=107.37	GT:AD:DP:GL:GQ	0/1:86,15:98:-46.31,-29.52,-344.47:99
-chr1	4096895	rs6702633	G	A	282.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.30;MQ=48.03;MQ0=0;OQ=1209.14;QD=19.50;SB=-562.59	GT:AD:DP:GL:GQ	0/1:26,36:60:-142.27,-18.07,-91.55:99
-chr1	4097116	rs6663939	C	T	575.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=1353.52;QD=17.35;SB=-623.00	GT:AD:DP:GL:GQ	0/1:38,40:78:-162.13,-23.49,-140.27:99
-chr1	4097278	rs4408122	C	T	90.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=3.55;MQ=60.00;MQ0=0;OQ=1285.61;QD=19.78;SB=-663.71	GT:AD:DP:GL:GQ	0/1:26,39:64:-151.13,-19.28,-94.25:99
-chr1	4097502	rs10915445	G	A	15.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=4.76;MQ=58.14;MQ0=0;OQ=1551.73;QD=21.26;SB=-659.25	GT:AD:DP:GL:GQ	0/1:29,44:69:-179.24,-20.78,-91.34:99
-chr1	4097702	rs4233259	G	A	393.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=57.88;MQ0=0;OQ=488.96;QD=11.64;SB=-238.49	GT:AD:DP:GL:GQ	0/1:23,19:39:-63.93,-11.75,-79.38:99
-chr1	4097847	rs4233260	A	G	265.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=58.25;MQ0=0;OQ=841.80;QD=15.31;SB=-425.02	GT:AD:DP:GL:GQ	0/1:21,34:53:-103.45,-15.98,-81.47:99
-chr1	4098460	rs4654489	C	T	575.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1233.62;QD=17.37;SB=-483.09	GT:AD:DP:GL:GQ	0/1:34,37:71:-148.05,-21.40,-108.91:99
-chr1	4098462	rs4654412	C	G	408.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=1295.21;QD=18.24;SB=-423.31	GT:AD:DP:GL:GQ	0/1:36,35:70:-153.90,-21.10,-151.48:99
-chr1	4098561	rs4654490	T	C	109.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=5.61;MQ=59.35;MQ0=0;OQ=707.20;QD=11.05;SB=-320.12	GT:AD:DP:GL:GQ	0/1:35,29:62:-92.69,-18.69,-135.70:99
-chr1	4098636	rs4654491	A	T	298.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.55;MQ=58.32;MQ0=0;OQ=679.16;QD=12.81;SB=-348.54	GT:AD:DP:GL:GQ	0/1:28,25:51:-86.56,-15.36,-108.00:99
-chr1	4101675	rs4654492	C	T	166.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=985.64;QD=17.92;SB=-310.22	GT:AD:DP:GL:GQ	0/1:24,31:53:-117.81,-15.96,-85.09:99
-chr1	4102203	rs10799207	G	A	234.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=645.03;QD=15.36;SB=-340.37	GT:AD:DP:GL:GQ	0/1:22,20:41:-80.15,-12.36,-66.12:99
-chr1	4102678	rs7542208	A	G	473.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.58;MQ0=0;OQ=945.73;QD=14.78;SB=-439.91	GT:AD:DP:GL:GQ	0/1:26,38:62:-116.54,-18.69,-104.23:99
-chr1	4102853	rs12143662	C	T	77.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=3.06;MQ=59.31;MQ0=0;OQ=653.08;QD=14.51;SB=-306.78	GT:AD:DP:GL:GQ	0/1:23,22:43:-81.54,-12.95,-84.16:99
-chr1	4103423	rs12096127	C	T	146.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=3;HaplotypeScore=0.93;MQ=59.48;MQ0=0;OQ=1299.31;QD=16.24;SB=-452.94	GT:AD:DP:GL:GQ	0/1:42,38:79:-157.01,-23.79,-152.41:99
-chr1	4104350	.	G	A	39.75	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=50.14;MQ=43.88;MQ0=0;QD=0.41;SB=41.13	GT:AD:DP:GL:GQ	0/1:55,43:59:-25.05,-17.79,-166.63:72.58
-chr1	4104372	.	C	A	158.64	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=1;HaplotypeScore=261.20;MQ=40.26;MQ0=0;QD=1.18;SB=50.16	GT:AD:DP:GL:GQ	0/1:118,16:102:-49.87,-30.72,-316.01:99
-chr1	4104378	.	T	C	1045.41	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=132;Dels=0.09;HRun=0;HaplotypeScore=252.28;MQ=39.40;MQ0=0;QD=7.92;SB=47.18	GT:AD:DP:GL:GQ	0/1:70,50:112:-140.05,-32.23,-268.85:99
-chr1	4104379	.	G	A	1387.27	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=131;Dels=0.09;HRun=0;HaplotypeScore=164.33;MQ=39.20;MQ0=0;QD=10.59;SB=44.10	GT:AD:DP:GL:GQ	0/1:65,54:109:-173.34,-31.33,-223.67:99
-chr1	4104399	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=192;Dels=0.00;HRun=0;HaplotypeScore=398.28;MQ=38.87;MQ0=2;OQ=296.43;QD=1.54;SB=-98.03	GT:AD:DP:GL:GQ	0/1:164,28:154:-79.31,-46.39,-472.12:99
-chr1	4104401	rs61768839	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=194;Dels=0.00;HRun=0;HaplotypeScore=419.03;MQ=39.00;MQ0=2;OQ=166.93;QD=0.86;SB=-91.09	GT:AD:DP:GL:GQ	0/1:156,37:153:-66.06,-46.09,-471.26:99
-chr1	4104420	rs56397723	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=252;Dels=0.01;HRun=1;HaplotypeScore=92.55;MQ=41.09;MQ0=3;OQ=4650.56;QD=18.45;SB=-702.42	GT:AD:DP:GL:GQ	0/1:91,159:212:-464.06,-63.56,-317.29:99
-chr1	4104448	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=303;Dels=0.00;HRun=1;HaplotypeScore=67.42;MQ=41.21;MQ0=8;OQ=4147.70;QD=13.69;SB=-263.14	GT:AD:DP:GL:GQ	0/1:172,131:260:-413.77,-78.32,-559.37:99
-chr1	4104453	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=303;Dels=0.00;HRun=0;HaplotypeScore=122.24;MQ=41.63;MQ0=7;OQ=1110.55;QD=3.67;SB=-37.03	GT:AD:DP:GL:GQ	0/1:232,70:246:-188.46,-74.12,-759.14:99
-chr1	4104461	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=296;Dels=0.01;HRun=1;HaplotypeScore=119.61;MQ=41.59;MQ0=7;OQ=214.27;QD=0.72;SB=-23.14	GT:AD:DP:GL:GQ	0/1:251,42:244:-97.34,-72.63,-828.00:99
-chr1	4104464	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=293;Dels=0.00;HRun=0;HaplotypeScore=47.37;MQ=41.56;MQ0=7;OQ=330.17;QD=1.13;SB=-9.81	GT:AD:DP:GL:GQ	0/1:251,41:246:-110.42,-74.12,-748.00:99
-chr1	4104493	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=1;HaplotypeScore=30.82;MQ=42.50;MQ0=6;OQ=2710.70;QD=12.73;SB=-739.33	GT:AD:DP:GL:GQ	0/1:93,120:174:-326.79,-52.44,-298.85:99
-chr1	4104517	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=157;Dels=0.00;HRun=0;HaplotypeScore=91.08;MQ=42.89;MQ0=5;OQ=579.51;QD=3.69;SB=-277.61	GT:AD:DP:GL:GQ	0/1:123,34:134:-101.62,-40.38,-368.83:99
-chr1	4104540	rs62641248	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=101.41;MQ=39.74;MQ0=1;OQ=311.08;QD=3.34;SB=-25.45	GT:AD:DP:GL:GQ	0/1:75,18:80:-58.50,-24.10,-250.10:99
-chr1	4104551	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=87.22;MQ=37.20;MQ0=4;OQ=331.14;QD=4.87;SB=-44.20	GT:AD:DP:GL:GQ	0/1:51,17:54:-52.67,-16.27,-140.50:99
-chr1	4104561	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=32.90;MQ=39.14;MQ0=4;OQ=99.56;QD=1.56;SB=92.30	GT:AD:DP:GL:GQ	0/1:53,11:58:-30.72,-17.48,-172.38:99
-chr1	4104601	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=204;Dels=0.00;HRun=0;HaplotypeScore=38.41;MQ=39.91;MQ0=6;OQ=155.34;QD=0.76;SB=68.34	GT:AD:DP:GL:GQ	0/1:183,21:180:-73.04,-54.23,-586.07:99
-chr1	4104605	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=211;Dels=0.00;HRun=1;HaplotypeScore=39.02;MQ=40.58;MQ0=6;OQ=226.77;QD=1.07;SB=164.51	GT:AD:DP:GL:GQ	0/1:188,23:190:-83.19,-57.23,-627.45:99
-chr1	4104633	rs56023565	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=168;Dels=0.00;HRun=0;HaplotypeScore=43.28;MQ=41.56;MQ0=5;OQ=1077.06;QD=6.41;SB=128.56	GT:AD:DP:GL:GQ	0/1:117,50:150:-156.17,-45.18,-408.43:99
-chr1	4104638	rs62641251	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=155;Dels=0.00;HRun=1;HaplotypeScore=82.61;MQ=42.16;MQ0=4;OQ=1017.44;QD=6.56;SB=-202.97	GT:AD:DP:GL:GQ	0/1:99,56:128:-143.60,-38.57,-325.85:99
-chr1	4104646	rs56328141	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=133;Dels=0.05;HRun=0;HaplotypeScore=83.44;MQ=42.94;MQ0=3;OQ=598.93;QD=4.50;SB=-113.26	GT:AD:DP:GL:GQ	0/1:76,33:104:-104.27,-41.10,-292.97:99
-chr1	4104661	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=114;Dels=0.03;HRun=0;HaplotypeScore=168.88;MQ=43.79;MQ0=2;OQ=339.54;QD=2.98;SB=-7.31	GT:AD:DP:GL:GQ	0/1:92,17:99:-69.57,-32.33,-280.39:99
-chr1	4104695	rs58865682	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=107;Dels=0.00;HRun=0;HaplotypeScore=26.95;MQ=46.39;MQ0=1;OQ=148.27;QD=1.39;SB=113.35	GT:AD:DP:GL:GQ	0/1:90,17:100:-48.23,-30.12,-318.63:99
-chr1	4104698	rs59763636	A	C	13.51	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=104;Dels=0.00;HRun=0;HaplotypeScore=26.94;MQ=46.80;MQ0=1;QD=0.13;SB=110.36	GT:AD:DP:GL:GQ	0/1:87,17:97:-33.83,-29.22,-321.32:46.15
-chr1	4104799	rs56113813	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=1;HaplotypeScore=110.54;MQ=45.23;MQ0=4;OQ=195.94;QD=2.13;SB=86.31	GT:AD:DP:GL:GQ	0/1:78,14:77:-46.07,-23.20,-257.99:99
-chr1	4106070	rs9426471	T	C	595.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=1098.91;QD=16.16;SB=-453.97	GT:AD:DP:GL:GQ	0/1:32,36:68:-133.66,-20.48,-129.09:99
-chr1	4106148	rs9426494	C	T	344.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=60.00;MQ0=0;OQ=1566.25;QD=17.40;SB=-768.74	GT:AD:DP:GL:GQ	0/1:44,46:88:-186.42,-26.51,-142.07:99
-chr1	4107203	rs6680278	C	T	328.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.92;MQ0=0;OQ=777.87;QD=13.89;SB=-285.17	GT:AD:DP:GL:GQ	0/1:32,24:55:-97.64,-16.57,-110.93:99
-chr1	4107258	rs6672998	G	A	334.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=520.45;QD=13.01;SB=-193.18	GT:AD:DP:GL:GQ	0/1:23,17:40:-67.38,-12.05,-82.67:99
-chr1	4107272	rs17406305	C	T	361.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=435.04;QD=9.89;SB=-220.70	GT:AD:DP:GL:GQ	0/1:26,18:41:-59.15,-12.36,-84.72:99
-chr1	4108156	rs7528351	G	A	171.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=978.84;QD=16.88;SB=-340.32	GT:AD:DP:GL:GQ	0/1:29,29:58:-118.64,-17.47,-104.14:99
-chr1	4108402	rs7539733	C	T	327.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=58.92;MQ0=0;OQ=799.67;QD=15.38;SB=-336.43	GT:AD:DP:GL:GQ	0/1:24,28:47:-97.41,-14.16,-80.03:99
-chr1	4108778	rs9426495	G	A	284.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=3.59;MQ=59.34;MQ0=0;OQ=895.14;QD=14.21;SB=-321.33	GT:AD:DP:GL:GQ	0/1:34,29:62:-111.48,-18.68,-120.65:99
-chr1	4108797	rs9426472	G	C	415.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.20;MQ=59.27;MQ0=0;OQ=1011.60;QD=17.75;SB=-519.74	GT:AD:DP:GL:GQ	0/1:27,30:53:-120.42,-15.97,-106.06:99
-chr1	4109900	.	A	G	31.51	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=2;HaplotypeScore=6.53;MQ=57.95;MQ0=0;QD=0.55;SB=59.23	GT:AD:DP:GL:GQ	0/1:35,22:36:-17.29,-10.85,-119.86:64.34
-chr1	4110024	rs6690263	C	T	117.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=60.00;MQ0=0;OQ=1118.91;QD=21.11;SB=-400.94	GT:AD:DP:GL:GQ	0/1:20,32:53:-134.68,-19.51,-68.02:99
-chr1	4110064	rs6695126	A	G	708.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1770.58;QD=35.41;SB=-875.05	GT:AD:DP:GL:GQ	1/1:0,50:50:-180.66,-15.06,-0.02:99
-chr1	4110262	rs6683453	G	A	435.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.65;MQ0=0;OQ=1205.59;QD=18.27;SB=-574.05	GT:AD:DP:GL:GQ	0/1:29,37:64:-143.13,-19.28,-100.61:99
-chr1	4110315	rs9426473	G	A	464.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=896.46;QD=18.68;SB=-396.93	GT:AD:DP:GL:GQ	0/1:19,29:46:-106.79,-13.86,-67.55:99
-chr1	4110338	rs9426496	A	G	430.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=545.25;QD=11.36;SB=-275.98	GT:AD:DP:GL:GQ	0/1:25,23:47:-71.97,-14.16,-100.50:99
-chr1	4111600	rs12752733	G	A	194.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=59.12;MQ0=0;OQ=1088.74;QD=20.54;SB=-407.75	GT:AD:DP:GL:GQ	0/1:20,33:51:-127.52,-15.37,-66.14:99
-chr1	4111741	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=11;HaplotypeScore=4.85;MQ=55.91;MQ0=0;OQ=88.59;QD=2.16;SB=32.11	GT:AD:DP:GL:GQ	0/1:33,8:32:-21.79,-9.64,-86.81:99
-chr1	4112024	.	C	T	265.51	PASS	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.50;MQ0=0;OQ=941.42;QD=16.81;SB=-396.13	GT:AD:DP:GL:GQ	0/1:27,29:55:-113.99,-16.57,-97.04:99
-chr1	4112929	rs4654494	C	G	169.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=2.42;MQ=60.00;MQ0=0;OQ=822.69;QD=13.27;SB=-341.77	GT:AD:DP:GL:GQ	0/1:34,28:54:-101.84,-16.28,-127.78:99
-chr1	4113201	rs55759139	G	A	249.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.37;MQ=59.68;MQ0=0;OQ=761.01;QD=13.12;SB=-311.83	GT:AD:DP:GL:GQ	0/1:32,26:53:-95.35,-15.97,-100.34:99
-chr1	4113760	rs4498774	A	C	130.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.50;MQ=58.71;MQ0=0;OQ=628.38;QD=9.67;SB=-313.59	GT:AD:DP:GL:GQ	0/1:36,29:64:-85.41,-19.28,-138.00:99
-chr1	4114825	rs7339911	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=10;HaplotypeScore=3.32;MQ=58.55;MQ0=0;OQ=757.63;QD=12.42;SB=-183.20	GT:AD:DP:GL:GQ	0/1:36,25:59:-96.82,-17.77,-126.07:99
-chr1	4116025	rs9988443	G	A	336.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.45;MQ0=0;OQ=1567.78;QD=20.63;SB=-720.28	GT:AD:DP:GL:GQ	0/1:30,46:75:-182.67,-22.61,-94.32:99
-chr1	4116630	rs4336820	T	C	72.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.26;MQ=59.52;MQ0=0;OQ=1667.19;QD=34.73;SB=-687.27	GT:AD:DP:GL:GQ	1/1:0,48:47:-170.32,-14.16,-0.01:99
-chr1	4116791	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=2;HaplotypeScore=12.66;MQ=58.95;MQ0=0;OQ=57.38;QD=1.43;SB=71.25	GT:AD:DP:GL:GQ	0/1:31,9:34:-19.31,-10.29,-109.30:90.22
-chr1	4117150	rs12062237	T	C	0.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=3;HaplotypeScore=3.14;MQ=57.94;MQ0=0;OQ=1345.47;QD=32.82;SB=-624.25	GT:AD:DP:GL:GQ	1/1:0,41:39:-138.15,-11.75,-0.02:99
-chr1	4118916	rs3890798	A	G	534.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.32;MQ0=0;OQ=2055.84;QD=30.23;SB=-868.59	GT:AD:DP:GL:GQ	1/1:0,68:65:-209.23,-19.60,-0.06:99
-chr1	4119595	rs6426391	A	T	243.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=59.73;MQ0=0;OQ=1272.79;QD=18.45;SB=-602.37	GT:AD:DP:GL:GQ	0/1:28,41:68:-151.04,-20.48,-104.90:99
-chr1	4119856	.	G	A	80.75	PASS	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=54.88;MQ0=1;OQ=952.98;QD=16.15;SB=-461.48	GT:AD:DP:GL:GQ	0/1:28,31:56:-115.46,-16.88,-95.51:99
-chr1	4120161	rs7549636	G	A	106.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=3.96;MQ=59.21;MQ0=1;OQ=708.05;QD=15.39;SB=-359.50	GT:AD:DP:GL:GQ	0/1:23,23:43:-87.04,-12.95,-74.47:99
-chr1	4120271	rs6426392	T	C	252.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.44;MQ0=0;OQ=208.98;QD=7.74;SB=-130.51	GT:AD:DP:GL:GQ	0/1:16,11:25:-31.72,-7.54,-55.62:99
-chr1	4121295	rs4414012	C	T	109.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=243.26;QD=16.22;SB=-32.52	GT:AD:DP:GL:GQ	0/1:7,8:15:-32.13,-4.52,-23.19:99
-chr1	4121459	rs4614226	C	T	3.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.33;MQ0=0;OQ=708.73;QD=25.31;SB=-192.72	GT:AD:DP:GL:GQ	0/1:8,20:25:-81.69,-7.53,-15.26:77.23
-chr1	4122266	rs4654495	C	T	267.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.05;MQ0=0;OQ=844.66;QD=17.24;SB=-383.42	GT:AD:DP:GL:GQ	0/1:22,27:48:-102.21,-14.46,-81.80:99
-chr1	4122640	.	C	T	27.21	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=1;HaplotypeScore=9.85;MQ=48.82;MQ0=0;QD=3.40;SB=2.03	GT:AD:DP:GL:GQ	0/1:6,2:7:-8.11,-2.11,-18.35:60.04
-chr1	4122866	rs4654413	A	G	16.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.58;MQ0=0;OQ=1224.52;QD=28.48;SB=-81.37	GT:AD:DP:GL:GQ	1/1:0,43:41:-126.09,-12.38,-0.05:99
-chr1	4122935	rs4654414	G	A	17.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=53.29;MQ0=0;OQ=1666.36;QD=36.23;SB=-267.85	GT:AD:DP:GL:GQ	1/1:1,45:42:-170.23,-12.65,-0.01:99
-chr1	4123288	rs4233261	T	C	17.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=4.16;MQ=58.63;MQ0=0;OQ=2395.13;QD=34.71;SB=-1054.42	GT:AD:DP:GL:GQ	1/1:0,69:66:-243.12,-19.88,-0.02:99
-chr1	4123748	rs6679293	T	C	176.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.14;MQ0=0;OQ=1906.56;QD=31.26;SB=-831.63	GT:AD:DP:GL:GQ	1/1:0,61:59:-194.29,-17.79,-0.05:99
-chr1	4123963	rs4654496	C	T	83.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=60.00;MQ0=0;OQ=2067.60;QD=39.01;SB=-750.62	GT:AD:DP:GL:GQ	1/1:0,53:53:-210.36,-15.97,-0.02:99
-chr1	4124418	rs4654497	T	C	597.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.67;MQ0=0;OQ=1506.19;QD=30.74;SB=-582.98	GT:AD:DP:GL:GQ	1/1:0,49:47:-154.24,-14.17,-0.04:99
-chr1	4126306	rs4367764	C	T	454.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2115.14;QD=39.17;SB=-864.64	GT:AD:DP:GL:GQ	1/1:0,54:53:-215.11,-15.97,-0.01:99
-chr1	4127324	rs12123330	C	T	249.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1048.68;QD=17.77;SB=-496.03	GT:AD:DP:GL:GQ	0/1:27,32:56:-125.03,-16.88,-80.71:99
-chr1	4127494	rs4468133	G	A	195.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=2.26;MQ=60.00;MQ0=0;OQ=1260.59;QD=18.01;SB=-425.95	GT:AD:DP:GL:GQ	0/1:31,38:68:-152.64,-23.30,-109.48:99
-chr1	4128172	rs4654498	A	G	107.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.33;MQ=59.19;MQ0=0;OQ=2014.82;QD=35.35;SB=-1032.76	GT:AD:DP:GL:GQ	1/1:0,57:56:-205.08,-16.87,-0.01:99
-chr1	4128310	rs4654499	G	T	305.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=983.44;QD=17.88;SB=-296.34	GT:AD:DP:GL:GQ	0/1:22,33:55:-118.19,-16.56,-78.95:99
-chr1	4130572	rs3890729	A	T	141.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.07;MQ=59.18;MQ0=0;OQ=905.47;QD=17.75;SB=-227.90	GT:AD:DP:GL:GQ	0/1:23,28:51:-109.19,-15.36,-88.04:99
-chr1	4131311	rs10915460	G	A	189.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=57.39;MQ0=0;OQ=480.50;QD=13.35;SB=-233.54	GT:AD:DP:GL:GQ	0/1:19,17:33:-61.28,-9.95,-54.49:99
-chr1	4131491	rs10915461	A	G	151.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.56;MQ=51.87;MQ0=0;OQ=492.21;QD=9.65;SB=-268.94	GT:AD:DP:GL:GQ	0/1:28,23:49:-67.28,-14.77,-113.16:99
-chr1	4131545	rs10915462	T	C	155.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=54.56;MQ0=0;OQ=299.94;QD=7.69;SB=-143.28	GT:AD:DP:GL:GQ	0/1:25,14:37:-44.43,-11.15,-99.76:99
-chr1	4131617	rs6688343	T	C	208.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=2.28;MQ=58.31;MQ0=0;OQ=662.26;QD=13.25;SB=-230.45	GT:AD:DP:GL:GQ	0/1:25,25:48:-83.97,-14.46,-97.39:99
-chr1	4131656	rs6688428	T	C	133.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.51;MQ=58.40;MQ0=0;OQ=444.13;QD=10.83;SB=-97.71	GT:AD:DP:GL:GQ	0/1:22,19:40:-59.75,-12.06,-84.80:99
-chr1	4131666	rs6688431	T	C	70.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=58.40;MQ0=0;OQ=339.10;QD=8.27;SB=-98.71	GT:AD:DP:GL:GQ	0/1:23,18:37:-48.34,-11.15,-87.20:99
-chr1	4131704	.	G	A	41.43	PASS	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.69;MQ=58.60;MQ0=0;OQ=706.66;QD=14.13;SB=-238.75	GT:AD:DP:GL:GQ	0/1:28,22:49:-88.72,-14.77,-84.55:99
-chr1	4131824	rs12032295	C	T	752.83	Indel	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.96;MQ0=0;QD=14.20;SB=-367.84	GT:AD:DP:GL:GQ	0/1:30,23:51:-93.93,-15.37,-94.00:99
-chr1	4132377	rs12405392	C	T	226.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=4.69;MQ=59.66;MQ0=0;OQ=1021.86;QD=15.03;SB=-451.99	GT:AD:DP:GL:GQ	0/1:34,34:62:-124.15,-18.68,-109.47:99
-chr1	4132399	rs56827341	A	G	272.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=59.66;MQ0=0;OQ=903.58;QD=13.29;SB=-319.89	GT:AD:DP:GL:GQ	0/1:32,36:65:-113.24,-19.60,-113.27:99
-chr1	4132555	rs11580927	G	A	598.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=853.00;QD=13.76;SB=-450.44	GT:AD:DP:GL:GQ	0/1:34,28:61:-106.96,-18.38,-120.31:99
-chr1	4132654	rs11583685	T	C	237.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=2.58;MQ=60.00;MQ0=0;OQ=809.75;QD=12.46;SB=-338.53	GT:AD:DP:GL:GQ	0/1:35,30:64:-103.54,-19.28,-136.81:99
-chr1	4134373	rs6690519	C	T	596.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2577.92;QD=39.66;SB=-1051.40	GT:AD:DP:GL:GQ	1/1:0,65:64:-261.39,-19.28,-0.02:99
-chr1	4134652	rs12743431	G	A	916.73	Indel	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=58.05;MQ0=0;QD=16.08;SB=-472.04	GT:AD:DP:GL:GQ	0/1:25,32:53:-110.92,-15.97,-91.04:99
-chr1	4134672	rs61037363	C	T	207.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=58.34;MQ0=0;OQ=1244.96;QD=19.15;SB=-619.07	GT:AD:DP:GL:GQ	0/1:27,38:61:-146.16,-18.38,-83.21:99
-chr1	4135628	rs4654501	G	A	449.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.45;MQ0=0;OQ=800.03;QD=17.78;SB=-327.85	GT:AD:DP:GL:GQ	0/1:21,24:44:-96.54,-13.26,-71.19:99
-chr1	4136297	rs4531262	C	T	292.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.55;MQ0=0;OQ=900.23;QD=17.65;SB=-443.97	GT:AD:DP:GL:GQ	0/1:23,28:50:-108.37,-15.06,-81.34:99
-chr1	4136842	rs4233262	C	T	514.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1175.57;QD=19.27;SB=-513.00	GT:AD:DP:GL:GQ	0/1:27,34:61:-139.22,-18.38,-97.14:99
-chr1	4137022	rs12726068	G	A	202.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1078.50;QD=19.97;SB=-346.48	GT:AD:DP:GL:GQ	0/1:22,32:54:-127.40,-16.27,-78.49:99
-chr1	4137146	rs12741551	C	T	188.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=2.60;MQ=60.00;MQ0=0;OQ=744.97;QD=14.06;SB=-275.26	GT:AD:DP:GL:GQ	0/1:28,23:51:-95.75,-17.97,-99.94:99
-chr1	4137455	rs34927664	C	T	374.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.87;MQ0=0;OQ=672.79;QD=16.41;SB=-286.16	GT:AD:DP:GL:GQ	0/1:20,21:40:-82.61,-12.05,-71.71:99
-chr1	4137533	rs6687719	A	G	359.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.55;MQ0=0;OQ=693.89;QD=13.61;SB=-371.11	GT:AD:DP:GL:GQ	0/1:24,27:51:-88.05,-15.37,-93.98:99
-chr1	4137942	rs4654415	A	G	54.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=3;HaplotypeScore=0.52;MQ=59.28;MQ0=0;OQ=812.82;QD=15.63;SB=-375.38	GT:AD:DP:GL:GQ	0/1:23,29:51:-99.93,-15.36,-91.58:99
-chr1	4137964	rs4654416	T	C	201.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=58.39;MQ0=0;OQ=863.33;QD=15.70;SB=-318.29	GT:AD:DP:GL:GQ	0/1:25,30:54:-105.89,-16.27,-96.91:99
-chr1	4138124	rs4654417	A	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.04;HRun=0;HaplotypeScore=22.45;MQ=53.05;MQ0=0;OQ=979.60;QD=14.62;SB=-425.14	GT:AD:DP:GL:GQ	0/1:30,34:67:-120.52,-19.28,-120.75:99
-chr1	4138539	rs10915465	C	T	116.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=932.04;QD=16.95;SB=-231.54	GT:AD:DP:GL:GQ	0/1:26,28:51:-111.86,-15.37,-73.76:99
-chr1	4138848	rs4233263	T	C	563.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.57;MQ0=0;OQ=1932.95;QD=31.18;SB=-950.38	GT:AD:DP:GL:GQ	1/1:0,61:61:-196.93,-18.40,-0.06:99
-chr1	4140038	rs4233264	T	C	391.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.43;MQ0=0;OQ=1125.34;QD=13.89;SB=-437.57	GT:AD:DP:GL:GQ	0/1:41,40:80:-139.92,-24.10,-167.96:99
-chr1	4140287	rs4654502	A	G	258.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=716.89;QD=12.36;SB=-328.15	GT:AD:DP:GL:GQ	0/1:28,30:57:-92.15,-17.18,-113.12:99
-chr1	4140357	rs4654503	A	G	175.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.08;MQ=60.00;MQ0=0;OQ=528.96;QD=9.98;SB=-287.63	GT:AD:DP:GL:GQ	0/1:26,24:47:-70.35,-14.17,-96.77:99
-chr1	4140721	rs12074230	G	C	441.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=1211.59;QD=19.54;SB=-432.34	GT:AD:DP:GL:GQ	0/1:29,33:61:-142.82,-18.38,-122.06:99
-chr1	4141214	rs61770887	T	A	176.81	Indel	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=41.85;MQ0=5;QD=2.39;SB=-58.97	GT:AD:DP:GL:GQ	0/1:35,39:44:-34.22,-13.25,-135.84:99
-chr1	4141739	.	C	G	151.90	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.44;MQ0=0;OQ=861.28;QD=11.64;SB=-403.50	GT:AD:DP:GL:GQ	0/1:45,29:72:-111.12,-21.71,-193.89:99
-chr1	4143108	rs7544125	G	A	98.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=44.58;MQ0=4;OQ=463.56;QD=6.62;SB=-223.67	GT:AD:DP:GL:GQ	0/1:38,32:54:-65.91,-16.27,-136.81:99
-chr1	4143110	rs7515133	T	G	11.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=44.83;MQ0=4;OQ=280.65;QD=3.95;SB=-136.72	GT:AD:DP:GL:GQ	0/1:40,31:55:-47.92,-16.57,-148.31:99
-chr1	4143183	rs4408123	T	C	60.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=1.41;MQ=54.71;MQ0=0;OQ=2012.85;QD=31.45;SB=-855.54	GT:AD:DP:GL:GQ	1/1:0,63:62:-204.92,-18.70,-0.05:99
-chr1	4143665	rs4654505	C	T	14.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=7.02;MQ=58.52;MQ0=0;OQ=1278.62;QD=17.05;SB=-644.75	GT:AD:DP:GL:GQ	0/1:36,39:72:-152.84,-21.70,-110.95:99
-chr1	4143971	rs56322069	G	A	219.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=58.68;MQ0=0;OQ=1179.12;QD=14.38;SB=-509.98	GT:AD:DP:GL:GQ	0/1:47,35:78:-144.69,-23.49,-153.28:99
-chr1	4144717	rs4654419	G	T	409.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.48;MQ0=0;OQ=576.97;QD=11.10;SB=-278.60	GT:AD:DP:GL:GQ	0/1:31,21:52:-76.65,-15.66,-108.30:99
-chr1	4144899	rs4654506	A	G	59.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=3;HaplotypeScore=1.57;MQ=57.19;MQ0=0;OQ=798.47;QD=12.67;SB=-355.09	GT:AD:DP:GL:GQ	0/1:32,31:63:-102.12,-18.99,-128.03:99
-chr1	4145034	rs4654420	T	C	208.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=57.63;MQ0=0;OQ=567.20;QD=9.30;SB=-299.19	GT:AD:DP:GL:GQ	0/1:35,26:59:-77.79,-17.78,-138.00:99
-chr1	4145265	rs10799210	A	G	75.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=52.55;MQ0=0;OQ=2612.65;QD=35.79;SB=-1182.09	GT:AD:DP:GL:GQ	1/1:0,72:73:-267.51,-24.47,-2.66:99
-chr1	4146179	rs4354511	G	A	19.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=3;HaplotypeScore=1.79;MQ=39.00;MQ0=1;OQ=2945.76;QD=39.28;SB=-1473.93	GT:AD:DP:GL:GQ	1/1:0,75:73:-298.18,-21.99,-0.02:99
-chr1	4146185	rs61770891	T	G	349.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=40.44;MQ0=1;OQ=1123.38;QD=15.18;SB=-586.47	GT:AD:DP:GL:GQ	0/1:35,39:73:-137.61,-21.99,-124.99:99
-chr1	4146278	rs35969529	A	C	46.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=2.80;MQ=52.18;MQ0=0;OQ=652.54;QD=12.55;SB=-341.77	GT:AD:DP:GL:GQ	0/1:27,25:52:-84.21,-15.67,-95.88:99
-chr1	4146315	rs34096100	G	A	254.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=57.76;MQ0=0;OQ=657.20;QD=13.41;SB=-218.51	GT:AD:DP:GL:GQ	0/1:28,21:47:-83.18,-14.17,-82.42:99
-chr1	4146537	.	C	T	111.88	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=53.66;MQ0=1;OQ=1107.86;QD=16.06;SB=-448.39	GT:AD:DP:GL:GQ	0/1:34,35:67:-134.26,-20.19,-114.24:99
-chr1	4146953	rs4654421	T	C	433.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.82;MQ0=0;OQ=2189.94;QD=31.74;SB=-1040.77	GT:AD:DP:GL:GQ	1/1:0,69:68:-222.64,-20.51,-0.06:99
-chr1	4147013	rs4654422	T	A	163.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.20;MQ0=1;OQ=3024.40;QD=36.88;SB=-1331.44	GT:AD:DP:GL:GQ	1/1:1,80:81:-309.61,-27.75,-3.59:99
-chr1	4148323	rs35837871	C	T	12.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=2.85;MQ=58.88;MQ0=0;OQ=689.43;QD=12.77;SB=-158.63	GT:AD:DP:GL:GQ	0/1:29,24:49:-86.99,-14.77,-93.34:99
-chr1	4148556	rs10753370	A	G	191.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.30;MQ=57.40;MQ0=0;OQ=2083.85;QD=34.73;SB=-1040.92	GT:AD:DP:GL:GQ	1/1:0,60:59:-211.99,-17.77,-0.02:99
-chr1	4149011	rs12084286	A	G	120.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=57.86;MQ0=0;OQ=472.12;QD=10.26;SB=-116.70	GT:AD:DP:GL:GQ	0/1:26,20:42:-63.15,-12.65,-98.66:99
-chr1	4149320	rs10733015	T	C	59.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=3.72;MQ=56.65;MQ0=0;OQ=2004.37;QD=30.37;SB=-729.73	GT:AD:DP:GL:GQ	1/1:0,65:63:-204.08,-19.00,-0.06:99
-chr1	4149923	rs4654507	T	C	369.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.77;MQ0=0;OQ=1162.12;QD=14.53;SB=-509.31	GT:AD:DP:GL:GQ	0/1:40,40:79:-143.29,-23.80,-162.73:99
-chr1	4150793	rs11808641	A	G	288.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=1163.51;QD=16.62;SB=-493.62	GT:AD:DP:GL:GQ	0/1:32,38:70:-140.72,-21.09,-129.98:99
-chr1	4151258	rs35392680	C	A	277.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=1.25;MQ=59.48;MQ0=0;OQ=1358.51;QD=16.77;SB=-581.67	GT:AD:DP:GL:GQ	0/1:37,44:80:-163.23,-24.09,-127.72:99
-chr1	4151486	rs35452955	A	T	64.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=0.98;MQ=60.00;MQ0=0;OQ=1469.46;QD=19.34;SB=-729.32	GT:AD:DP:GL:GQ	0/1:30,45:74:-172.52,-22.29,-110.18:99
-chr1	4151668	rs6703301	G	T	631.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.77;MQ0=0;OQ=3028.09;QD=37.38;SB=-1101.60	GT:AD:DP:GL:GQ	1/1:0,81:80:-306.41,-24.09,-0.01:99
-chr1	4151981	rs34414875	C	T	365.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1305.64;QD=16.32;SB=-537.52	GT:AD:DP:GL:GQ	0/1:41,39:80:-157.95,-24.10,-144.69:99
-chr1	4152854	rs10915467	A	T	474.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=1268.93;QD=17.38;SB=-610.43	GT:AD:DP:GL:GQ	0/1:33,40:72:-151.86,-21.68,-124.21:99
-chr1	4153158	rs12722935	C	T	465.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1317.34;QD=16.26;SB=-636.13	GT:AD:DP:GL:GQ	0/1:41,40:80:-159.12,-24.10,-137.48:99
-chr1	4153203	rs55974255	T	G	492.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1277.21;QD=15.39;SB=-533.71	GT:AD:DP:GL:GQ	0/1:38,45:83:-156.01,-25.00,-142.96:99
-chr1	4153672	rs6679104	T	C	519.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=1796.89;QD=30.98;SB=-648.94	GT:AD:DP:GL:GQ	1/1:0,58:56:-183.31,-16.88,-0.04:99
-chr1	4153751	rs12750830	G	A	339.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=841.06;QD=12.19;SB=-424.91	GT:AD:DP:GL:GQ	0/1:41,27:67:-107.58,-20.19,-146.61:99
-chr1	4153835	rs12740143	T	G	222.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=59.66;MQ0=0;OQ=767.69;QD=11.29;SB=-346.80	GT:AD:DP:GL:GQ	0/1:40,28:68:-100.53,-20.48,-145.06:99
-chr1	4154543	rs12143082	T	C	171.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=2;HaplotypeScore=1.73;MQ=59.61;MQ0=1;OQ=1104.97;QD=14.17;SB=-407.20	GT:AD:DP:GL:GQ	0/1:39,39:74:-136.07,-22.29,-143.19:99
-chr1	4154828	rs4578184	A	T	236.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=59.74;MQ0=0;OQ=3286.63;QD=37.35;SB=-1618.09	GT:AD:DP:GL:GQ	1/1:0,87:86:-327.66,-25.90,-0.02:99
-chr1	4156046	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=80;Dels=0.01;HRun=20;HaplotypeScore=22.75;MQ=49.75;MQ0=0;OQ=501.86;QD=6.27;SB=92.27	GT:AD:DP:GL:GQ	0/1:48,31:64:-72.46,-18.99,-149.51:99
-chr1	4157196	rs4276878	C	G	356.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=1452.13;QD=15.78;SB=-539.06	GT:AD:DP:GL:GQ	0/1:47,45:92:-176.24,-27.75,-207.05:99
-chr1	4159822	rs34626829	T	C	256.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=60.00;MQ0=0;OQ=966.32;QD=13.24;SB=-369.17	GT:AD:DP:GL:GQ	0/1:40,33:72:-121.60,-21.69,-157.15:99
-chr1	4159905	rs4654509	T	C	45.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=1.31;MQ=59.48;MQ0=0;OQ=2796.88;QD=34.96;SB=-1388.49	GT:AD:DP:GL:GQ	1/1:0,80:80:-283.30,-24.10,-0.03:99
-chr1	4160278	rs6667065	G	A	347.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=1508.83;QD=20.12;SB=-751.28	GT:AD:DP:GL:GQ	0/1:32,43:74:-176.46,-22.30,-103.02:99
-chr1	4160487	rs6426401	C	G	585.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=2415.89;QD=43.14;SB=-1118.15	GT:AD:DP:GL:GQ	1/1:0,56:56:-245.19,-16.88,-0.02:99
-chr1	4163843	rs4654511	A	G	129.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=2;HaplotypeScore=0.90;MQ=59.46;MQ0=0;OQ=1014.81;QD=11.80;SB=-473.86	GT:AD:DP:GL:GQ	0/1:46,40:85:-130.38,-25.61,-186.22:99
-chr1	4163857	rs4654512	A	G	307.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=59.44;MQ0=0;OQ=1070.59;QD=12.90;SB=-521.48	GT:AD:DP:GL:GQ	0/1:46,37:83:-135.34,-25.00,-185.85:99
-chr1	4164344	rs4529679	G	C	272.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.61;MQ=59.36;MQ0=0;OQ=772.49;QD=10.73;SB=-392.69	GT:AD:DP:GL:GQ	0/1:46,26:70:-101.64,-21.10,-199.05:99
-chr1	4166949	rs16840901	T	C	388.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=59.68;MQ0=0;OQ=1039.54;QD=14.24;SB=-434.53	GT:AD:DP:GL:GQ	0/1:37,36:73:-129.23,-21.99,-150.63:99
-chr1	4167749	rs10915471	T	G	58.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=3.59;MQ=59.58;MQ0=0;OQ=744.43;QD=13.54;SB=-264.89	GT:AD:DP:GL:GQ	0/1:27,27:49:-92.49,-14.76,-80.31:99
-chr1	4168111	rs35122589	C	T	228.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=1.76;MQ=59.26;MQ0=0;OQ=1364.57;QD=16.64;SB=-443.34	GT:AD:DP:GL:GQ	0/1:40,41:80:-163.84,-24.10,-142.82:99
-chr1	4168454	rs12095632	C	G	92.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=2.95;MQ=59.32;MQ0=0;OQ=1054.00;QD=19.16;SB=-475.80	GT:AD:DP:GL:GQ	0/1:24,31:54:-124.96,-16.28,-104.73:99
-chr1	4168730	rs4130091	T	C	180.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.33;MQ0=0;OQ=1367.19;QD=28.48;SB=-696.78	GT:AD:DP:GL:GQ	1/1:0,48:44:-140.35,-13.27,-0.05:99
-chr1	4169351	rs6426402	G	T	131.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=3.41;MQ=58.55;MQ0=0;OQ=809.13;QD=11.40;SB=-425.17	GT:AD:DP:GL:GQ	0/1:41,30:69:-104.98,-20.78,-138.71:99
-chr1	4169394	rs6426403	C	G	338.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=57.89;MQ0=0;OQ=727.35;QD=12.99;SB=-274.92	GT:AD:DP:GL:GQ	0/1:33,23:54:-92.30,-16.28,-134.02:99
-chr1	4169498	rs6426404	G	A	414.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=58.75;MQ0=0;OQ=1380.19;QD=18.40;SB=-605.61	GT:AD:DP:GL:GQ	0/1:34,41:72:-163.00,-21.69,-105.58:99
-chr1	4169658	rs60017975	A	G	318.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.77;MQ0=0;OQ=1450.14;QD=18.13;SB=-530.63	GT:AD:DP:GL:GQ	0/1:31,49:79:-172.10,-23.80,-127.67:99
-chr1	4170881	rs7550659	A	G	248.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=51.70;MQ0=0;OQ=2075.07;QD=30.97;SB=-804.69	GT:AD:DP:GL:GQ	1/1:0,66:63:-211.13,-18.99,-0.04:99
-chr1	4171135	rs10799212	A	G	40.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=3.91;MQ=40.70;MQ0=1;OQ=2175.11;QD=31.07;SB=-612.96	GT:AD:DP:GL:GQ	1/1:1,69:67:-221.14,-20.20,-0.04:99
-chr1	4171182	rs12410442	G	A	385.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=27.19;MQ0=4;OQ=361.27;QD=10.95;SB=-197.20	GT:AD:DP:GL:GQ	0/1:20,13:27:-47.55,-8.14,-48.20:99
-chr1	4171315	.	C	A	41.63	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=20;HaplotypeScore=7.30;MQ=33.40;MQ0=5;QD=0.97;SB=41.16	GT:AD:DP:GL:GQ	0/1:37,6:31:-16.79,-9.34,-90.98:74.46
-chr1	4171344	rs10799213	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.01;HRun=20;HaplotypeScore=28.32;MQ=47.02;MQ0=1;OQ=768.09;QD=11.30;SB=-343.49	GT:AD:DP:GL:GQ	0/1:35,32:53:-95.75,-15.66,-101.72:99
-chr1	4171386	rs12022636	C	A	71.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=6.39;MQ=55.43;MQ0=0;OQ=1032.82;QD=16.66;SB=-507.94	GT:AD:DP:GL:GQ	0/1:28,34:59:-124.34,-17.77,-88.85:99
-chr1	4171443	rs10799214	T	A	380.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.02;MQ=52.31;MQ0=0;OQ=893.79;QD=14.65;SB=-401.19	GT:AD:DP:GL:GQ	0/1:30,31:58:-110.14,-17.48,-102.42:99
-chr1	4171775	rs7553814	A	G	404.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.01;MQ0=0;OQ=970.08;QD=12.93;SB=-503.90	GT:AD:DP:GL:GQ	0/1:40,35:74:-122.58,-22.29,-161.95:99
-chr1	4171833	rs7553919	A	G	37.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=3;HaplotypeScore=0.95;MQ=59.60;MQ0=0;OQ=2384.19;QD=34.55;SB=-1112.82	GT:AD:DP:GL:GQ	1/1:0,69:66:-242.02,-19.88,-0.02:99
-chr1	4171990	rs7554028	A	G	628.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.32;MQ0=1;OQ=2341.28;QD=30.02;SB=-854.63	GT:AD:DP:GL:GQ	1/1:0,78:76:-237.79,-22.93,-0.08:99
-chr1	4173512	rs7517572	T	A	699.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.76;MQ0=0;OQ=2653.94;QD=34.47;SB=-1331.37	GT:AD:DP:GL:GQ	1/1:0,77:72:-269.00,-21.69,-0.02:99
-chr1	4173702	rs10753372	T	C	483.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.88;MQ0=0;OQ=510.62;QD=9.82;SB=-265.21	GT:AD:DP:GL:GQ	0/1:30,22:52:-70.02,-15.68,-118.09:99
-chr1	4173822	rs10737404	T	C	229.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1647.35;QD=29.95;SB=-655.93	GT:AD:DP:GL:GQ	1/1:0,55:53:-168.37,-15.99,-0.05:99
-chr1	4174045	rs10915473	C	T	65.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=45.21;MQ0=0;OQ=1332.73;QD=36.02;SB=-585.26	GT:AD:DP:GL:GQ	1/1:0,37:35:-136.87,-10.55,-0.02:99
-chr1	4174057	.	C	T	1039.01	SnpCluster	AC=2;AF=1.00;AN=2;DP=31;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=42.84;MQ0=0;QD=33.52;SB=-399.52	GT:AD:DP:GL:GQ	1/1:2,29:27:-107.50,-8.14,-0.01:81.26
-chr1	4174060	.	A	C	853.72	SnpCluster	AC=2;AF=1.00;AN=2;DP=31;Dels=0.00;HRun=2;HaplotypeScore=1.07;MQ=43.67;MQ0=0;QD=27.54;SB=-294.55	GT:AD:DP:GL:GQ	1/1:0,31:26:-88.97,-7.83,-0.01:78.20
-chr1	4174064	.	A	C	949.90	SnpCluster	AC=2;AF=1.00;AN=2;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=44.60;MQ0=0;QD=28.78;SB=-378.69	GT:AD:DP:GL:GQ	1/1:0,33:28:-98.58,-8.43,-0.01:84.24
-chr1	4174382	rs1908491	C	T	0.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=6.22;MQ=54.65;MQ0=0;OQ=1883.08;QD=36.21;SB=-503.01	GT:AD:DP:GL:GQ	1/1:0,52:48:-191.91,-14.46,-0.01:99
-chr1	4174484	rs10915474	T	A	225.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.59;MQ=55.68;MQ0=0;OQ=801.30;QD=15.41;SB=-299.67	GT:AD:DP:GL:GQ	0/1:26,26:51:-98.78,-15.36,-93.02:99
-chr1	4174489	rs1908492	C	T	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=7;HaplotypeScore=1.12;MQ=55.99;MQ0=0;OQ=1860.19;QD=37.20;SB=-932.70	GT:AD:DP:GL:GQ	1/1:0,50:48:-189.62,-14.46,-0.02:99
-chr1	4174597	rs1908493	C	T	268.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=59.04;MQ0=0;OQ=2611.89;QD=38.41;SB=-1140.03	GT:AD:DP:GL:GQ	1/1:0,68:66:-264.79,-19.88,-0.02:99
-chr1	4174874	rs1495245	T	A	732.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=2554.22;QD=37.56;SB=-1304.61	GT:AD:DP:GL:GQ	1/1:0,68:68:-259.02,-20.48,-0.02:99
-chr1	4174974	rs11578399	C	A	12.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=3.61;MQ=59.22;MQ0=0;OQ=421.58;QD=7.81;SB=-139.06	GT:AD:DP:GL:GQ	0/1:37,17:52:-61.11,-15.67,-117.17:99
-chr1	4175032	rs1495246	C	G	204.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=56.85;MQ0=0;OQ=2607.23;QD=39.50;SB=-1308.71	GT:AD:DP:GL:GQ	1/1:0,66:62:-264.33,-18.68,-0.02:99
-chr1	4175046	.	T	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=2;HaplotypeScore=9.95;MQ=56.80;MQ0=0;OQ=180.72;QD=2.78;SB=92.29	GT:AD:DP:GL:GQ	0/1:40,25:50:-36.42,-15.06,-130.62:99
-chr1	4175151	rs10915476	G	A	237.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.01;MQ0=0;OQ=567.09;QD=12.07;SB=-92.91	GT:AD:DP:GL:GQ	0/1:29,18:45:-73.55,-13.56,-90.83:99
-chr1	4175279	rs1495247	C	T	209.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=2597.96;QD=37.11;SB=-1279.76	GT:AD:DP:GL:GQ	1/1:0,70:67:-263.40,-20.19,-0.02:99
-chr1	4175302	rs7411802	C	A	438.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=58.93;MQ0=0;OQ=2181.45;QD=35.76;SB=-1110.34	GT:AD:DP:GL:GQ	1/1:0,61:61:-221.75,-18.37,-0.02:99
-chr1	4175576	rs4326593	G	A	325.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=55.58;MQ0=0;OQ=888.28;QD=16.76;SB=-433.95	GT:AD:DP:GL:GQ	0/1:25,28:48:-106.58,-14.47,-68.77:99
-chr1	4175736	rs4615813	G	C	667.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.55;MQ0=0;OQ=2403.10;QD=41.43;SB=-1195.96	GT:AD:DP:GL:GQ	1/1:0,58:56:-243.91,-16.87,-0.02:99
-chr1	4175807	rs28600106	C	T	6.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=7.59;MQ=48.39;MQ0=0;OQ=365.75;QD=9.89;SB=-206.69	GT:AD:DP:GL:GQ	0/1:22,15:31:-49.20,-9.35,-60.01:99
-chr1	4175944	rs2898790	T	C	0.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=5.41;MQ=54.62;MQ0=0;OQ=1686.61;QD=30.67;SB=-329.61	GT:AD:DP:GL:GQ	1/1:0,55:50:-172.27,-15.06,-0.02:99
-chr1	4176053	rs2411737	G	C	0.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=4.08;MQ=49.96;MQ0=0;OQ=907.29;QD=30.24;SB=-45.91	GT:AD:DP:GL:GQ	1/1:0,30:23:-94.32,-6.93,-0.01:69.23
-chr1	4176083	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=2;HaplotypeScore=5.12;MQ=50.79;MQ0=0;OQ=53.84;QD=1.17;SB=68.23	GT:AD:DP:GL:GQ	0/1:30,16:35:-19.21,-10.54,-99.51:86.68
-chr1	4176698	rs10915477	G	A	75.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=2;HaplotypeScore=1.92;MQ=55.80;MQ0=0;OQ=3415.18;QD=40.18;SB=-1433.92	GT:AD:DP:GL:GQ	1/1:0,85:84:-340.52,-25.30,-0.02:99
-chr1	4176748	rs12060660	A	C	70.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=3.65;MQ=58.23;MQ0=0;OQ=2781.95;QD=35.21;SB=-941.32	GT:AD:DP:GL:GQ	1/1:0,78:78:-285.04,-25.98,-3.27:99
-chr1	4176763	rs10915478	T	C	721.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.18;MQ0=0;OQ=2617.35;QD=33.99;SB=-1088.89	GT:AD:DP:GL:GQ	1/1:0,77:74:-265.34,-22.29,-0.02:99
-chr1	4176794	rs12060664	A	G	585.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2362.72;QD=33.28;SB=-1094.09	GT:AD:DP:GL:GQ	1/1:0,71:67:-239.88,-20.19,-0.03:99
-chr1	4177795	rs4654423	T	C	596.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1639.97;QD=29.29;SB=-739.78	GT:AD:DP:GL:GQ	1/1:0,56:52:-167.62,-15.68,-0.04:99
-chr1	4177808	rs10915479	T	C	281.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.62;MQ0=0;OQ=507.44;QD=10.36;SB=-255.93	GT:AD:DP:GL:GQ	0/1:30,19:46:-67.89,-13.86,-108.27:99
-chr1	4179046	rs12116719	G	A	182.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=2853.60;QD=39.09;SB=-1453.00	GT:AD:DP:GL:GQ	1/1:0,73:73:-288.97,-22.00,-0.02:99
-chr1	4179422	rs59176411	C	T	132.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=3.16;MQ=56.41;MQ0=0;OQ=2598.61;QD=37.12;SB=-1098.00	GT:AD:DP:GL:GQ	1/1:1,69:68:-267.13,-20.49,-3.69:99
-chr1	4179485	rs10737405	A	G	230.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.59;MQ0=0;OQ=1795.14;QD=34.52;SB=-680.95	GT:AD:DP:GL:GQ	1/1:1,51:52:-187.08,-15.66,-3.98:99
-chr1	4180030	rs6657617	C	T	6.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=3;HaplotypeScore=2.45;MQ=59.28;MQ0=0;OQ=2474.15;QD=38.66;SB=-836.62	GT:AD:DP:GL:GQ	1/1:0,64:62:-251.01,-18.68,-0.02:99
-chr1	4180081	rs6426405	G	A	604.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2617.17;QD=39.06;SB=-1069.36	GT:AD:DP:GL:GQ	1/1:0,67:67:-265.32,-20.19,-0.02:99
-chr1	4180490	rs4592237	G	A	306.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.29;MQ0=0;OQ=1850.80;QD=34.92;SB=-947.36	GT:AD:DP:GL:GQ	1/1:0,53:49:-188.69,-14.77,-0.02:99
-chr1	4181020	rs10799216	G	A	235.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=1.51;MQ=59.57;MQ0=0;OQ=3471.51;QD=40.37;SB=-1574.60	GT:AD:DP:GL:GQ	1/1:0,86:85:-346.15,-25.60,-0.02:99
-chr1	4181670	rs4233265	T	C	517.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.29;MQ0=0;OQ=2065.74;QD=31.30;SB=-824.68	GT:AD:DP:GL:GQ	1/1:0,66:65:-210.21,-19.60,-0.06:99
-chr1	4182159	rs4654425	A	G	260.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=1828.94;QD=35.17;SB=-776.99	GT:AD:DP:GL:GQ	1/1:0,52:51:-186.50,-15.36,-0.02:99
-chr1	4182646	rs11579829	C	T	305.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.69;MQ0=0;OQ=2773.62;QD=37.48;SB=-1347.81	GT:AD:DP:GL:GQ	1/1:0,74:71:-280.97,-21.39,-0.02:99
-chr1	4183175	rs2132177	C	A	639.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2919.91;QD=36.50;SB=-1144.30	GT:AD:DP:GL:GQ	1/1:0,80:79:-295.60,-23.79,-0.02:99
-chr1	4184348	rs55978003	G	A	105.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.52;MQ=59.27;MQ0=0;OQ=776.05;QD=15.22;SB=-305.78	GT:AD:DP:GL:GQ	0/1:27,23:48:-95.35,-14.46,-90.95:99
-chr1	4184779	rs7528938	C	T	220.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=59.11;MQ0=0;OQ=1623.71;QD=34.55;SB=-657.89	GT:AD:DP:GL:GQ	1/1:1,44:43:-165.98,-12.96,-0.02:99
-chr1	4185286	rs17415519	A	G	242.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.28;MQ=60.00;MQ0=0;OQ=1345.26;QD=33.63;SB=-658.93	GT:AD:DP:GL:GQ	1/1:0,40:39:-138.12,-11.75,-0.01:99
-chr1	4185339	.	G	T	41.06	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=12;HaplotypeScore=2.80;MQ=54.83;MQ0=0;QD=0.98;SB=22.81	GT:AD:DP:GL:GQ	0/1:35,7:35:-17.93,-10.54,-103.81:73.90
-chr1	4185557	rs4654516	G	C	54.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=1.67;MQ=58.74;MQ0=0;OQ=2607.62;QD=37.25;SB=-842.00	GT:AD:DP:GL:GQ	1/1:1,69:66:-264.40,-19.92,-0.05:99
-chr1	4187570	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=2;HaplotypeScore=8.14;MQ=58.89;MQ0=0;OQ=68.10;QD=0.81;SB=131.41	GT:AD:DP:GL:GQ	0/1:59,24:60:-28.18,-18.09,-178.30:99
-chr1	4188372	rs1874267	T	G	455.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=59.37;MQ0=0;OQ=1048.28;QD=15.88;SB=-524.40	GT:AD:DP:GL:GQ	0/1:29,37:66:-127.99,-19.88,-107.31:99
-chr1	4188412	rs1874266	A	G	468.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.24;MQ0=0;OQ=798.75;QD=14.52;SB=-409.67	GT:AD:DP:GL:GQ	0/1:23,32:52:-98.84,-15.68,-83.89:99
-chr1	4188663	rs10915480	A	G	337.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=59.23;MQ0=0;OQ=1153.25;QD=13.73;SB=-560.60	GT:AD:DP:GL:GQ	0/1:38,45:83:-146.27,-27.66,-153.88:99
-chr1	4188905	rs10753374	A	G	386.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1195.33;QD=15.73;SB=-552.85	GT:AD:DP:GL:GQ	0/1:35,41:76:-145.71,-22.90,-141.29:99
-chr1	4189544	rs10753375	T	G	601.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1995.47;QD=35.01;SB=-845.10	GT:AD:DP:GL:GQ	1/1:0,57:56:-203.15,-16.86,-0.01:99
-chr1	4189582	rs10799217	A	G	68.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=-0.06;MQ=59.39;MQ0=0;OQ=909.16;QD=14.90;SB=-461.96	GT:AD:DP:GL:GQ	0/1:30,31:61:-112.58,-18.38,-119.06:99
-chr1	4189759	rs10799218	T	C	84.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=3;HaplotypeScore=1.76;MQ=58.80;MQ0=0;OQ=827.52;QD=11.18;SB=-285.14	GT:AD:DP:GL:GQ	0/1:41,32:73:-108.03,-22.00,-167.09:99
-chr1	4191122	rs6426406	T	C	3.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=7.31;MQ=59.57;MQ0=0;OQ=717.35;QD=10.71;SB=-224.24	GT:AD:DP:GL:GQ	0/1:37,30:64:-94.30,-19.28,-145.85:99
-chr1	4191702	rs7541544	T	C	425.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=59.70;MQ0=0;OQ=729.14;QD=11.76;SB=-343.04	GT:AD:DP:GL:GQ	0/1:32,30:60:-94.28,-18.09,-122.33:99
-chr1	4191813	rs7534461	C	G	457.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.78;MQ0=0;OQ=1324.41;QD=15.96;SB=-593.50	GT:AD:DP:GL:GQ	0/1:46,37:83:-160.73,-25.00,-206.24:99
-chr1	4191898	rs7534558	C	T	290.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=2.06;MQ=60.00;MQ0=0;OQ=1246.57;QD=14.17;SB=-621.73	GT:AD:DP:GL:GQ	0/1:50,38:86:-153.86,-25.92,-153.30:99
-chr1	4191985	rs10799219	G	C	69.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=2.07;MQ=59.38;MQ0=0;OQ=1617.32;QD=21.86;SB=-548.71	GT:AD:DP:GL:GQ	0/1:32,42:72:-186.71,-21.70,-128.86:99
-chr1	4192218	rs10159168	A	T	343.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=1388.76;QD=16.94;SB=-472.56	GT:AD:DP:GL:GQ	0/1:39,43:82:-166.86,-24.70,-146.13:99
-chr1	4195817	rs1390135	T	G	143.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=4.15;MQ=58.67;MQ0=0;OQ=705.86;QD=11.20;SB=-334.03	GT:AD:DP:GL:GQ	0/1:33,30:61:-92.25,-18.38,-113.54:99
-chr1	4197896	.	G	A	10.32	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.52;MQ0=0;OQ=1035.41;QD=21.57;SB=-410.45	GT:AD:DP:GL:GQ	0/1:18,30:48:-121.29,-14.46,-58.46:99
-chr1	4198535	rs1495242	A	G	438.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1076.27;QD=12.97;SB=-544.21	GT:AD:DP:GL:GQ	0/1:44,39:81:-135.31,-24.40,-175.25:99
-chr1	4199191	rs12124378	C	T	379.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.35;MQ0=0;OQ=1302.45;QD=20.35;SB=-581.61	GT:AD:DP:GL:GQ	0/1:26,38:63:-152.50,-18.97,-95.47:99
-chr1	4199881	.	G	T	32.56	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=2;HaplotypeScore=5.28;MQ=57.83;MQ0=0;QD=0.74;SB=74.26	GT:AD:DP:GL:GQ	0/1:31,13:34:-16.78,-10.24,-105.31:65.40
-chr1	4200007	.	G	A	96.98	PASS	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=59.35;MQ0=0;OQ=1236.21;QD=18.45;SB=-537.73	GT:AD:DP:GL:GQ	0/1:28,39:63:-145.88,-18.98,-96.95:99
-chr1	4200165	rs6426407	A	G	72.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=58.49;MQ0=0;OQ=1344.67;QD=18.17;SB=-519.96	GT:AD:DP:GL:GQ	0/1:29,44:72:-159.44,-21.69,-113.24:99
-chr1	4200817	rs4654518	G	A	711.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=2818.25;QD=39.69;SB=-1209.38	GT:AD:DP:GL:GQ	1/1:0,71:70:-285.42,-21.08,-0.01:99
-chr1	4202021	rs12124548	G	A	209.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.70;MQ0=0;OQ=1241.05;QD=20.02;SB=-465.47	GT:AD:DP:GL:GQ	0/1:26,36:61:-145.77,-18.38,-85.04:99
-chr1	4202445	rs12405770	A	G	576.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1249.87;QD=15.62;SB=-595.92	GT:AD:DP:GL:GQ	0/1:37,43:79:-152.07,-23.80,-148.48:99
-chr1	4202474	rs6426409	T	G	405.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.78;MQ0=0;OQ=1102.86;QD=13.13;SB=-556.72	GT:AD:DP:GL:GQ	0/1:44,40:82:-138.27,-24.70,-157.66:99
-chr1	4204888	rs12132080	A	T	242.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=1.72;MQ=45.12;MQ0=6;OQ=964.76;QD=12.69;SB=-408.56	GT:AD:DP:GL:GQ	0/1:34,42:65:-119.34,-19.58,-129.51:99
-chr1	4208143	rs6690300	T	G	448.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.45;MQ0=0;OQ=967.38;QD=12.73;SB=-340.51	GT:AD:DP:GL:GQ	0/1:41,35:76:-122.91,-22.89,-152.81:99
-chr1	4208388	rs12239600	T	C	466.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.66;MQ0=0;OQ=937.21;QD=13.78;SB=-484.77	GT:AD:DP:GL:GQ	0/1:32,36:68:-117.50,-20.50,-127.59:99
-chr1	4208894	rs12078298	T	A	402.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=59.48;MQ0=0;OQ=1434.64;QD=16.12;SB=-624.40	GT:AD:DP:GL:GQ	0/1:43,46:88:-173.25,-26.51,-162.85:99
-chr1	4209813	rs6679489	G	A	164.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=2;HaplotypeScore=1.52;MQ=60.00;MQ0=0;OQ=1435.86;QD=16.89;SB=-638.14	GT:AD:DP:GL:GQ	0/1:41,44:83:-171.87,-25.00,-148.88:99
-chr1	4211295	rs4654519	C	T	437.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.97;MQ0=0;OQ=1264.42;QD=19.76;SB=-439.80	GT:AD:DP:GL:GQ	0/1:26,38:62:-148.40,-18.68,-90.27:99
-chr1	4211773	rs10915487	T	G	175.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=59.23;MQ0=0;OQ=638.07;QD=10.29;SB=-306.76	GT:AD:DP:GL:GQ	0/1:37,25:61:-85.47,-18.38,-128.27:99
-chr1	4212065	rs1908490	C	T	369.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=57.82;MQ0=0;OQ=1109.73;QD=15.20;SB=-541.53	GT:AD:DP:GL:GQ	0/1:40,33:71:-135.64,-21.39,-134.48:99
-chr1	4213163	rs12741715	A	T	578.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1267.51;QD=16.90;SB=-452.19	GT:AD:DP:GL:GQ	0/1:35,40:74:-152.32,-22.29,-133.91:99
-chr1	4215064	rs966321	G	T	6.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=4;HaplotypeScore=2.95;MQ=59.70;MQ0=0;OQ=1037.52;QD=13.65;SB=-540.72	GT:AD:DP:GL:GQ	0/1:40,36:75:-129.62,-22.59,-142.94:99
-chr1	4215408	rs12691488	C	T	601.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=1073.26;QD=16.02;SB=-541.06	GT:AD:DP:GL:GQ	0/1:35,32:66:-130.50,-19.89,-109.64:99
-chr1	4216644	rs964715	T	C	389.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=939.74;QD=14.46;SB=-445.57	GT:AD:DP:GL:GQ	0/1:32,33:65:-116.84,-19.58,-130.15:99
-chr1	4217111	rs1495250	T	C	316.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=60.00;MQ0=0;OQ=777.71;QD=11.44;SB=-393.04	GT:AD:DP:GL:GQ	0/1:36,32:67:-101.25,-20.19,-143.99:99
-chr1	4218910	rs11583756	G	A	393.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=562.25;QD=10.41;SB=-300.82	GT:AD:DP:GL:GQ	0/1:33,21:51:-74.88,-15.38,-106.07:99
-chr1	4219107	rs7545415	G	A	274.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=59.24;MQ0=0;OQ=794.53;QD=14.45;SB=-389.90	GT:AD:DP:GL:GQ	0/1:30,25:51:-98.11,-15.38,-85.30:99
-chr1	4221548	rs1826719	G	A	1.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.02;HRun=1;HaplotypeScore=9.57;MQ=59.01;MQ0=0;OQ=1104.32;QD=16.73;SB=-370.86	GT:AD:DP:GL:GQ	0/1:31,34:63:-132.39,-18.68,-107.97:99
-chr1	4221834	rs1390137	T	A	402.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.24;MQ0=0;OQ=1338.31;QD=14.71;SB=-600.22	GT:AD:DP:GL:GQ	0/1:48,43:91:-164.52,-27.41,-184.18:99
-chr1	4222993	rs7526339	A	G	180.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=860.50;QD=13.04;SB=-424.26	GT:AD:DP:GL:GQ	0/1:36,30:65:-108.91,-19.58,-143.92:99
-chr1	4225449	rs9286982	A	C	384.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.50;MQ0=0;OQ=1099.77;QD=14.66;SB=-338.80	GT:AD:DP:GL:GQ	0/1:38,37:74:-135.55,-22.29,-134.84:99
-chr1	4226228	rs2411738	G	A	332.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=60.00;MQ0=0;OQ=1328.38;QD=18.98;SB=-511.52	GT:AD:DP:GL:GQ	0/1:30,40:68:-156.63,-20.50,-89.85:99
-chr1	4227495	rs2101576	C	T	457.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.43;MQ0=0;OQ=1111.42;QD=15.22;SB=-551.59	GT:AD:DP:GL:GQ	0/1:39,34:73:-136.43,-22.01,-124.07:99
-chr1	4227724	rs10915493	G	A	108.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.47;MQ=60.00;MQ0=0;OQ=1106.23;QD=18.75;SB=-402.40	GT:AD:DP:GL:GQ	0/1:26,33:59:-131.68,-17.78,-92.93:99
-chr1	4228365	.	G	A	59.74	PASS	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=2.28;MQ=58.73;MQ0=0;OQ=1218.17;QD=16.69;SB=-516.71	GT:AD:DP:GL:GQ	0/1:36,37:71:-146.49,-21.39,-124.67:99
-chr1	4228440	rs11586171	G	A	378.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.94;MQ=59.25;MQ0=0;OQ=793.38;QD=14.17;SB=-261.74	GT:AD:DP:GL:GQ	0/1:30,26:52:-98.30,-15.68,-86.01:99
-chr1	4228626	rs10799221	A	G	244.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=59.55;MQ0=0;OQ=773.13;QD=15.16;SB=-359.35	GT:AD:DP:GL:GQ	0/1:24,27:50:-95.66,-15.07,-89.39:99
-chr1	4230147	rs6677984	A	G	313.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.80;MQ0=0;OQ=752.97;QD=10.61;SB=-294.25	GT:AD:DP:GL:GQ	0/1:36,35:64:-97.88,-19.30,-127.54:99
-chr1	4231035	.	G	A	41.87	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.60;MQ=59.27;MQ0=0;OQ=1023.37;QD=17.95;SB=-471.06	GT:AD:DP:GL:GQ	0/1:23,34:54:-121.89,-16.27,-83.08:99
-chr1	4231643	rs4654426	A	G	357.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=59.13;MQ0=0;OQ=804.91;QD=14.63;SB=-368.10	GT:AD:DP:GL:GQ	0/1:22,33:51:-99.15,-15.37,-84.11:99
-chr1	4232195	.	G	A	71.35	PASS	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=60.00;MQ0=0;OQ=896.42;QD=13.18;SB=-396.87	GT:AD:DP:GL:GQ	0/1:39,29:68:-113.42,-20.50,-128.87:99
-chr1	4232590	rs7527612	G	A	196.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.22;MQ=59.61;MQ0=0;OQ=598.22;QD=12.46;SB=-285.21	GT:AD:DP:GL:GQ	0/1:26,20:44:-76.37,-13.26,-81.07:99
-chr1	4233150	rs10737406	C	T	190.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1662.89;QD=19.34;SB=-750.79	GT:AD:DP:GL:GQ	0/1:38,48:86:-195.48,-25.90,-136.98:99
-chr1	4233365	rs10737407	T	C	106.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=2.10;MQ=59.79;MQ0=0;OQ=829.78;QD=9.43;SB=-420.85	GT:AD:DP:GL:GQ	0/1:52,36:87:-112.48,-26.22,-211.16:99
-chr1	4233528	rs10737408	T	C	490.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=1057.73;QD=14.90;SB=-414.29	GT:AD:DP:GL:GQ	0/1:30,41:71:-130.46,-21.40,-122.91:99
-chr1	4233635	rs10799223	G	C	53.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=0;HaplotypeScore=4.97;MQ=59.34;MQ0=0;OQ=1650.26;QD=16.67;SB=-729.99	GT:AD:DP:GL:GQ	0/1:53,46:99:-198.14,-29.83,-227.12:99
-chr1	4234047	rs12095914	C	T	0.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=9.26;MQ=42.37;MQ0=0;OQ=137.29;QD=9.81;SB=-42.54	GT:AD:DP:GL:GQ	0/1:9,5:10:-20.03,-3.01,-17.15:99
-chr1	4234051	rs56077919	C	T	1.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=12;Dels=0.00;HRun=0;HaplotypeScore=7.11;MQ=38.66;MQ0=0;OQ=106.65;QD=8.89;SB=-40.54	GT:AD:DP:GL:GQ	0/1:8,4:8:-16.36,-2.41,-14.46:99
-chr1	4234076	.	T	C	1.57	PASS	AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=36.23;MQ0=1;OQ=55.15;QD=6.13;SB=-6.99	GT:AD:DP:GL:GQ	0/1:6,3:7:-10.91,-2.11,-15.53:87.98
-chr1	4234095	rs12752111	C	T	29.22	LowQual	AC=1;AF=0.50;AN=2;DB;DP=8;Dels=0.00;HRun=1;HaplotypeScore=2.44;MQ=42.08;MQ0=1;QD=3.65;SB=-10.00	GT:AD:DP:GL:GQ	0/1:5,3:6:-8.01,-1.81,-14.07:62.05
-chr1	4234115	.	T	C	41.10	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=27.16;MQ=46.57;MQ0=0;QD=2.94;SB=-6.99	GT:AD:DP:GL:GQ	0/1:10,4:11:-10.71,-3.31,-31.76:73.94
-chr1	4234119	.	T	C	26.07	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=23.15;MQ=48.70;MQ0=0;QD=1.37;SB=-6.99	GT:AD:DP:GL:GQ	0/1:13,6:15:-10.41,-4.52,-48.38:58.90
-chr1	4234123	.	T	C	99.42	SnpCluster	AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=15.26;MQ=47.83;MQ0=0;QD=4.52;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,7:16:-18.04,-4.82,-44.01:99
-chr1	4234141	.	C	T	11.93	LowQual	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=3;HaplotypeScore=2.90;MQ=45.82;MQ0=0;QD=0.38;SB=-10.00	GT:AD:DP:GL:GQ	0/1:27,4:24:-11.68,-7.23,-69.44:44.48
-chr1	4234162	rs55680202	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.02;HRun=14;HaplotypeScore=7.57;MQ=46.57;MQ0=0;OQ=162.83;QD=3.54;SB=-20.39	GT:AD:DP:GL:GQ	0/1:36,9:39:-31.01,-11.45,-100.16:99
-chr1	4234461	rs2898791	C	A	324.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=54.58;MQ0=0;OQ=1440.90;QD=17.57;SB=-669.70	GT:AD:DP:GL:GQ	0/1:33,49:78:-170.87,-23.50,-98.97:99
-chr1	4235747	rs1495243	G	A	21.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=0.87;MQ=59.34;MQ0=0;OQ=727.40;QD=20.78;SB=-304.24	GT:AD:DP:GL:GQ	0/1:14,21:34:-86.27,-10.24,-44.00:99
-chr1	4235753	rs903541	A	G	320.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.74;MQ0=0;OQ=658.30;QD=17.79;SB=-304.49	GT:AD:DP:GL:GQ	0/1:15,22:36:-79.96,-10.84,-57.03:99
-chr1	4236215	rs2411739	T	C	3.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=4;HaplotypeScore=1.73;MQ=54.14;MQ0=0;OQ=570.50;QD=9.84;SB=-308.25	GT:AD:DP:GL:GQ	0/1:27,31:50:-75.41,-15.07,-105.40:99
-chr1	4243198	rs6658727	T	C	21.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.26;MQ=56.21;MQ0=0;OQ=1400.87;QD=30.45;SB=-402.32	GT:AD:DP:GL:GQ	1/1:0,46:43:-143.70,-12.96,-0.03:99
-chr1	4254604	rs1495248	G	A	254.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.88;MQ0=0;OQ=575.96;QD=13.39;SB=-220.90	GT:AD:DP:GL:GQ	0/1:24,19:42:-73.53,-12.65,-79.75:99
-chr1	4255328	rs2130621	G	A	47.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=4.28;MQ=59.31;MQ0=0;OQ=1064.10;QD=15.88;SB=-426.97	GT:AD:DP:GL:GQ	0/1:33,34:65:-129.28,-19.59,-111.47:99
-chr1	4255353	rs12123539	G	C	316.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=60.00;MQ0=0;OQ=1198.39;QD=17.89;SB=-531.27	GT:AD:DP:GL:GQ	0/1:31,36:67:-143.33,-20.20,-136.21:99
-chr1	4255453	rs2029490	A	G	353.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=59.70;MQ0=0;OQ=1028.79;QD=13.19;SB=-497.67	GT:AD:DP:GL:GQ	0/1:34,44:74:-128.48,-22.32,-128.69:99
-chr1	4256070	rs61769407	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.03;HRun=0;HaplotypeScore=33.48;MQ=52.67;MQ0=1;OQ=340.13;QD=5.08;SB=-156.75	GT:AD:DP:GL:GQ	0/1:47,18:58:-54.18,-16.88,-142.71:99
-chr1	4256256	rs12563155	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=93.47;MQ=55.97;MQ0=0;OQ=536.64;QD=7.56;SB=-213.44	GT:AD:DP:GL:GQ	0/1:49,22:63:-75.92,-18.98,-150.16:99
-chr1	4256294	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=8.05;MQ=57.07;MQ0=1;OQ=87.19;QD=1.23;SB=41.60	GT:AD:DP:GL:GQ	0/1:61,10:65:-31.59,-19.59,-196.34:99
-chr1	4256295	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=7.58;MQ=57.07;MQ0=1;OQ=86.67;QD=1.22;SB=35.22	GT:AD:DP:GL:GQ	0/1:61,10:60:-30.03,-18.08,-181.58:99
-chr1	4256665	rs11487456	A	C	56.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=1;HaplotypeScore=2.90;MQ=57.92;MQ0=0;OQ=976.57;QD=11.10;SB=-464.71	GT:AD:DP:GL:GQ	0/1:50,38:85:-126.54,-25.60,-185.54:99
-chr1	4258667	rs10753377	G	C	1.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=5;HaplotypeScore=1.15;MQ=59.53;MQ0=0;OQ=783.06;QD=15.98;SB=-363.09	GT:AD:DP:GL:GQ	0/1:26,23:47:-95.76,-14.17,-99.93:99
-chr1	4259991	rs592323	G	T	282.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=1759.13;QD=36.65;SB=-870.26	GT:AD:DP:GL:GQ	1/1:0,48:48:-179.51,-14.45,-0.01:99
-chr1	4261395	rs513096	G	A	177.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=58.45;MQ0=0;OQ=707.77;QD=15.73;SB=-231.55	GT:AD:DP:GL:GQ	0/1:23,22:44:-87.33,-13.26,-70.99:99
-chr1	4262899	.	A	G	18.25	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=43.81;MQ=48.38;MQ0=0;QD=0.33;SB=-10.00	GT:AD:DP:GL:GQ	0/1:50,5:40:-17.15,-12.05,-140.45:51.02
-chr1	4262904	rs28675202	G	A	73.10	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=14.98;MQ=50.70;MQ0=0;QD=1.43;SB=-10.00	GT:AD:DP:GL:GQ	0/1:40,11:45:-24.15,-13.55,-132.97:99
-chr1	4262909	.	G	A	79.12	SnpCluster	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=5.00;MQ=50.76;MQ0=0;QD=1.65;SB=-10.00	GT:AD:DP:GL:GQ	0/1:37,11:43:-24.15,-12.95,-125.43:99
-chr1	4262914	rs629808	G	A	33.56	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=52.89;MQ=50.96;MQ0=0;QD=0.68;SB=-10.00	GT:AD:DP:GL:GQ	0/1:39,10:44:-19.89,-13.25,-132.97:66.40
-chr1	4262923	.	C	T	231.89	SnpCluster	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=36.64;MQ=51.44;MQ0=0;QD=5.27;SB=-10.00	GT:AD:DP:GL:GQ	0/1:30,14:37:-37.63,-11.16,-89.50:99
-chr1	4262924	rs3124336	G	A	119.70	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=42.63;MQ=51.44;MQ0=0;QD=2.72;SB=-10.00	GT:AD:DP:GL:GQ	0/1:30,14:37:-26.40,-11.15,-102.56:99
-chr1	4262928	.	C	T	227.91	SnpCluster	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=40.91;MQ=51.65;MQ0=0;QD=5.06;SB=-10.00	GT:AD:DP:GL:GQ	0/1:31,14:38:-37.54,-11.47,-89.09:99
-chr1	4262934	.	G	A	212.81	SnpCluster	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=38.78;MQ=51.84;MQ0=0;QD=4.63;SB=-10.00	GT:AD:DP:GL:GQ	0/1:35,11:39:-36.31,-11.75,-102.65:99
-chr1	4262955	.	C	T	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=10.30;MQ=55.28;MQ0=0;OQ=119.85;QD=3.24;SB=-10.00	GT:AD:DP:GL:GQ	0/1:30,7:34:-25.51,-10.24,-106.69:99
-chr1	4262965	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=55.83;MQ0=0;OQ=58.64;QD=1.63;SB=-10.00	GT:AD:DP:GL:GQ	0/1:31,5:33:-19.09,-9.94,-116.28:91.47
-chr1	4263200	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=16.50;MQ=29.51;MQ0=20;OQ=97.44;QD=2.38;SB=-10.00	GT:AD:DP:GL:GQ	0/1:35,5:14:-17.24,-4.22,-36.40:99
-chr1	4263205	rs12035244	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=20.28;MQ=30.89;MQ0=18;OQ=95.43;QD=2.27;SB=-10.00	GT:AD:DP:GL:GQ	0/1:37,5:15:-17.34,-4.52,-40.16:99
-chr1	4263595	rs34429154	C	A	184.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=59.01;MQ0=0;OQ=488.72;QD=10.40;SB=-267.26	GT:AD:DP:GL:GQ	0/1:29,18:46:-66.01,-13.86,-101.87:99
-chr1	4263832	rs584035	G	A	216.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=59.61;MQ0=0;OQ=1091.44;QD=18.50;SB=-496.53	GT:AD:DP:GL:GQ	0/1:27,32:59:-130.21,-17.78,-86.40:99
-chr1	4263930	rs503536	G	A	202.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=59.57;MQ0=0;OQ=661.52;QD=12.25;SB=-344.44	GT:AD:DP:GL:GQ	0/1:32,22:49:-84.20,-14.76,-96.54:99
-chr1	4264086	rs693734	C	T	101.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=2.89;MQ=58.91;MQ0=0;OQ=1021.37;QD=17.02;SB=-501.11	GT:AD:DP:GL:GQ	0/1:29,31:59:-123.20,-17.78,-92.76:99
-chr1	4264332	rs1106307	A	G	290.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.63;MQ=59.33;MQ0=0;OQ=913.45;QD=14.73;SB=-354.33	GT:AD:DP:GL:GQ	0/1:28,34:58:-112.10,-17.47,-104.59:99
-chr1	4264424	rs2132176	A	G	368.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=613.38;QD=11.15;SB=-237.28	GT:AD:DP:GL:GQ	0/1:30,25:53:-80.60,-15.97,-111.46:99
-chr1	4264542	rs2132174	T	A	221.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=52.27;MQ0=0;OQ=1008.56;QD=17.69;SB=-458.63	GT:AD:DP:GL:GQ	0/1:21,35:54:-122.63,-18.49,-81.00:99
-chr1	4264801	rs3007778	G	C	66.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=58.11;MQ0=0;OQ=580.26;QD=12.35;SB=-271.29	GT:AD:DP:GL:GQ	0/1:28,19:44:-74.59,-13.28,-102.55:99
-chr1	4265009	rs3007777	C	A	272.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.09;MQ0=0;OQ=812.00;QD=17.65;SB=-415.86	GT:AD:DP:GL:GQ	0/1:19,27:45:-98.04,-13.55,-64.20:99
-chr1	4265174	.	G	A	199.75	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.87;MQ0=0;OQ=560.44;QD=13.67;SB=-202.85	GT:AD:DP:GL:GQ	0/1:23,18:41:-71.68,-12.35,-78.36:99
-chr1	4265866	rs56198562	A	G	125.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=2.61;MQ=59.78;MQ0=0;OQ=979.47;QD=11.66;SB=-298.20	GT:AD:DP:GL:GQ	0/1:43,41:82:-125.95,-24.72,-170.33:99
-chr1	4266398	rs1495240	C	T	180.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=59.09;MQ0=0;OQ=962.96;QD=18.88;SB=-480.01	GT:AD:DP:GL:GQ	0/1:23,28:47:-113.74,-14.16,-62.01:99
-chr1	4266494	rs1845634	G	A	227.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=1124.56;QD=17.85;SB=-553.73	GT:AD:DP:GL:GQ	0/1:30,33:63:-134.72,-18.98,-108.50:99
-chr1	4267183	rs1490413	G	A	163.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=1.58;MQ=59.39;MQ0=0;OQ=1192.58;QD=17.54;SB=-578.10	GT:AD:DP:GL:GQ	0/1:31,37:66:-142.43,-19.88,-110.71:99
-chr1	4267249	rs16838591	G	A	109.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.45;MQ0=0;OQ=560.73;QD=16.49;SB=-154.59	GT:AD:DP:GL:GQ	0/1:17,17:34:-69.60,-10.24,-59.00:99
-chr1	4267670	rs17448695	C	T	256.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=2.17;MQ=59.11;MQ0=0;OQ=785.86;QD=16.72;SB=-406.95	GT:AD:DP:GL:GQ	0/1:22,24:45:-95.42,-13.55,-80.15:99
-chr1	4267782	rs1817914	T	C	324.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.97;MQ0=0;OQ=827.52;QD=14.03;SB=-394.24	GT:AD:DP:GL:GQ	0/1:29,30:58:-103.51,-17.47,-117.96:99
-chr1	4267840	rs2934983	G	A	322.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.36;MQ0=0;OQ=1060.38;QD=18.28;SB=-513.09	GT:AD:DP:GL:GQ	0/1:26,32:57:-126.49,-17.17,-95.38:99
-chr1	4267886	rs1817913	A	G	440.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=738.48;QD=13.43;SB=-393.26	GT:AD:DP:GL:GQ	0/1:24,31:50:-92.21,-15.08,-81.77:99
-chr1	4268301	rs351622	A	T	719.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=1814.47;QD=35.58;SB=-930.73	GT:AD:DP:GL:GQ	1/1:0,51:49:-185.04,-14.76,-0.01:99
-chr1	4268579	rs351621	T	C	72.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=59.25;MQ0=0;OQ=1364.91;QD=27.30;SB=-524.09	GT:AD:DP:GL:GQ	1/1:0,50:43:-140.11,-12.97,-0.04:99
-chr1	4268604	rs351620	C	T	134.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=59.46;MQ0=0;OQ=1433.75;QD=33.34;SB=-736.64	GT:AD:DP:GL:GQ	1/1:0,43:39:-146.99,-11.76,-0.03:99
-chr1	4268679	rs351619	G	A	84.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1739.98;QD=37.83;SB=-519.64	GT:AD:DP:GL:GQ	1/1:0,46:44:-177.59,-13.26,-0.01:99
-chr1	4268802	rs351618	T	C	98.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=1092.21;QD=26.64;SB=-356.42	GT:AD:DP:GL:GQ	1/1:0,41:37:-112.85,-11.17,-0.05:99
-chr1	4268811	rs351617	C	T	143.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1491.48;QD=36.38;SB=-509.63	GT:AD:DP:GL:GQ	1/1:1,40:39:-152.75,-11.76,-0.02:99
-chr1	4268960	rs2087571	C	T	152.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=53.63;MQ0=0;OQ=643.83;QD=17.40;SB=-299.23	GT:AD:DP:GL:GQ	0/1:15,22:34:-77.91,-10.25,-47.03:99
-chr1	4269767	rs351616	A	G	168.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=58.87;MQ0=0;OQ=1214.77;QD=29.63;SB=-431.27	GT:AD:DP:GL:GQ	1/1:0,41:38:-125.09,-11.46,-0.03:99
-chr1	4270245	rs351615	G	A	292.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=58.55;MQ0=0;OQ=1966.57;QD=35.76;SB=-975.01	GT:AD:DP:GL:GQ	1/1:0,54:52:-200.27,-15.67,-0.02:99
-chr1	4271723	rs351614	C	T	601.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=2473.56;QD=39.90;SB=-1111.03	GT:AD:DP:GL:GQ	1/1:0,62:62:-250.96,-18.68,-0.01:99
-chr1	4271809	rs12132314	C	T	430.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.65;MQ0=0;OQ=1181.91;QD=18.18;SB=-613.64	GT:AD:DP:GL:GQ	0/1:30,35:65:-141.06,-19.59,-97.20:99
-chr1	4273032	rs171260	A	C	300.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=1.30;MQ=60.00;MQ0=0;OQ=870.08;QD=12.08;SB=-225.83	GT:AD:DP:GL:GQ	0/1:41,31:71:-111.68,-21.38,-150.14:99
-chr1	4274131	rs351613	A	C	265.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.14;MQ0=0;OQ=2299.32;QD=35.37;SB=-1119.04	GT:AD:DP:GL:GQ	1/1:0,65:65:-233.54,-19.58,-0.02:99
-chr1	4277771	rs351596	C	T	568.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=2579.09;QD=39.68;SB=-949.23	GT:AD:DP:GL:GQ	1/1:0,65:64:-261.51,-19.28,-0.02:99
-chr1	4279737	rs876273	C	G	132.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=4.17;MQ=59.56;MQ0=0;OQ=768.76;QD=14.78;SB=-189.63	GT:AD:DP:GL:GQ	0/1:23,29:48:-94.65,-14.49,-97.38:99
-chr1	4279818	rs351598	A	T	381.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.53;MQ=59.66;MQ0=0;OQ=991.33;QD=14.58;SB=-452.46	GT:AD:DP:GL:GQ	0/1:35,33:67:-122.60,-20.18,-130.61:99
-chr1	4280055	rs1874269	C	T	619.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=2766.74;QD=39.52;SB=-1179.55	GT:AD:DP:GL:GQ	1/1:0,70:69:-280.28,-20.79,-0.02:99
-chr1	4280204	rs2411741	C	A	180.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=2;HaplotypeScore=1.15;MQ=60.13;MQ0=0;OQ=1218.75;QD=14.51;SB=-564.82	GT:AD:DP:GL:GQ	0/1:42,42:82:-149.85,-24.70,-149.73:99
-chr1	4280489	rs351599	C	T	413.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=59.72;MQ0=0;OQ=1071.03;QD=16.23;SB=-457.49	GT:AD:DP:GL:GQ	0/1:33,33:66:-130.29,-19.90,-102.77:99
-chr1	4285644	.	A	G	0.07	PASS	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=4;HaplotypeScore=2.54;MQ=57.79;MQ0=0;OQ=595.83;QD=12.16;SB=-120.71	GT:AD:DP:GL:GQ	0/1:26,23:47:-77.03,-14.16,-95.21:99
-chr1	4288221	.	G	A	0.84	PASS	AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=1;HaplotypeScore=8.13;MQ=58.71;MQ0=0;OQ=1360.73;QD=16.39;SB=-394.38	GT:AD:DP:GL:GQ	0/1:43,40:81:-163.76,-24.40,-149.01:99
-chr1	4289709	.	T	G	46.86	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=1;HaplotypeScore=16.54;MQ=56.55;MQ0=0;QD=0.98;SB=53.18	GT:AD:DP:GL:GQ	0/1:27,21:32:-17.62,-9.65,-87.21:79.70
-chr1	4292594	rs34245285	G	C	0.05	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=3.96;MQ=50.65;MQ0=4;OQ=195.36;QD=3.15;SB=-102.43	GT:AD:DP:GL:GQ	0/1:47,15:34:-33.09,-10.27,-97.74:99
-chr1	4293081	rs34762254	C	G	17.74	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=35.42;MQ0=7;QD=0.43;SB=11.07	GT:AD:DP:GL:GQ	0/1:35,5:26:-12.90,-7.85,-90.70:50.51
-chr1	4293374	.	G	A	3.97	PASS	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=44.45;MQ0=2;OQ=329.37;QD=6.59;SB=0.51	GT:AD:DP:GL:GQ	0/1:31,19:40:-48.28,-12.06,-89.72:99
-chr1	4296431	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=120;Dels=0.01;HRun=0;HaplotypeScore=166.11;MQ=33.71;MQ0=1;OQ=76.77;QD=0.64;SB=116.41	GT:AD:DP:GL:GQ	0/1:95,22:100:-40.80,-29.83,-343.52:99
-chr1	4296441	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=126;Dels=0.07;HRun=0;HaplotypeScore=204.38;MQ=34.16;MQ0=1;OQ=63.06;QD=0.50;SB=111.78	GT:AD:DP:GL:GQ	0/1:104,10:96:-43.83,-34.24,-290.54:95.89
-chr1	4296449	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=184.01;MQ=35.76;MQ0=1;OQ=76.57;QD=0.81;SB=108.85	GT:AD:DP:GL:GQ	0/1:78,6:65:-53.79,-42.85,-256.56:99
-chr1	4296459	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=1;HaplotypeScore=225.82;MQ=37.43;MQ0=0;OQ=345.89;QD=3.98;SB=26.09	GT:AD:DP:GL:GQ	0/1:63,24:68:-58.36,-20.48,-198.46:99
-chr1	4296469	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=1;HaplotypeScore=189.98;MQ=37.41;MQ0=0;OQ=75.74;QD=0.80;SB=12.63	GT:AD:DP:GL:GQ	0/1:84,11:69:-31.64,-20.79,-221.92:99
-chr1	4296493	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=88.30;MQ=41.30;MQ0=0;OQ=474.04;QD=4.65;SB=-167.48	GT:AD:DP:GL:GQ	0/1:59,36:81:-93.85,-43.16,-272.31:99
-chr1	4296506	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=103;Dels=0.03;HRun=1;HaplotypeScore=78.61;MQ=43.01;MQ0=0;OQ=51.88;QD=0.50;SB=101.36	GT:AD:DP:GL:GQ	0/1:87,13:87:-34.09,-25.62,-299.11:84.72
-chr1	4296513	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=100;Dels=0.02;HRun=0;HaplotypeScore=60.45;MQ=43.56;MQ0=0;OQ=185.47;QD=1.85;SB=-3.86	GT:AD:DP:GL:GQ	0/1:80,18:74:-44.13,-22.29,-236.48:99
-chr1	4296520	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=1;HaplotypeScore=86.57;MQ=43.66;MQ0=0;OQ=90.49;QD=0.82;SB=69.81	GT:AD:DP:GL:GQ	0/1:99,12:95:-40.96,-28.62,-301.41:99
-chr1	4296571	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=100;Dels=0.02;HRun=0;HaplotypeScore=148.81;MQ=42.35;MQ0=0;OQ=149.13;QD=1.49;SB=56.28	GT:AD:DP:GL:GQ	0/1:64,20:79:-66.77,-48.58,-247.91:99
-chr1	4296587	.	G	A	55.07	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=113;Dels=0.02;HRun=0;HaplotypeScore=138.42;MQ=36.11;MQ0=2;QD=0.49;SB=3.46	GT:AD:DP:GL:GQ	0/1:83,28:77:-31.99,-23.20,-236.17:87.91
-chr1	4296590	.	A	G	63.20	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=113;Dels=0.01;HRun=1;HaplotypeScore=134.39;MQ=36.11;MQ0=2;QD=0.56;SB=44.15	GT:AD:DP:GL:GQ	0/1:101,11:84:-34.62,-25.01,-283.57:96.04
-chr1	4296596	.	G	A	133.96	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=190.44;MQ=35.58;MQ0=2;QD=1.09;SB=41.12	GT:AD:DP:GL:GQ	0/1:107,16:99:-46.51,-29.83,-296.83:99
-chr1	4296607	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=125;Dels=0.00;HRun=1;HaplotypeScore=185.73;MQ=34.74;MQ0=2;OQ=309.12;QD=2.47;SB=41.15	GT:AD:DP:GL:GQ	0/1:106,19:100:-64.31,-30.12,-298.02:99
-chr1	4296636	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=0;HaplotypeScore=188.32;MQ=35.30;MQ0=3;OQ=116.48;QD=0.91;SB=56.18	GT:AD:DP:GL:GQ	0/1:110,17:102:-45.68,-30.75,-346.20:99
-chr1	4296642	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=1;HaplotypeScore=236.73;MQ=34.36;MQ0=5;OQ=253.36;QD=1.95;SB=47.15	GT:AD:DP:GL:GQ	0/1:113,17:102:-59.34,-30.72,-306.11:99
-chr1	4296665	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=107.40;MQ=33.96;MQ0=6;OQ=319.22;QD=2.73;SB=50.15	GT:AD:DP:GL:GQ	0/1:91,24:96:-64.13,-28.92,-272.83:99
-chr1	4296668	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=119;Dels=0.01;HRun=0;HaplotypeScore=114.24;MQ=34.12;MQ0=7;OQ=295.42;QD=2.48;SB=-19.17	GT:AD:DP:GL:GQ	0/1:99,19:98:-62.05,-29.23,-276.38:99
-chr1	4296677	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=110;Dels=0.03;HRun=0;HaplotypeScore=117.38;MQ=34.73;MQ0=5;OQ=320.24;QD=2.91;SB=47.14	GT:AD:DP:GL:GQ	0/1:86,21:91:-62.13,-26.82,-250.93:99
-chr1	4296686	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=54.93;MQ=36.96;MQ0=5;OQ=147.08;QD=1.67;SB=50.15	GT:AD:DP:GL:GQ	0/1:78,10:74:-40.29,-22.30,-219.44:99
-chr1	4308180	.	C	T	161.22	PASS	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.53;MQ0=0;OQ=1282.15;QD=17.56;SB=-488.11	GT:AD:DP:GL:GQ	0/1:35,38:73:-153.50,-22.00,-116.62:99
-chr1	4309112	.	A	C	86.02	PASS	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.15;MQ=59.03;MQ0=0;OQ=562.66;QD=13.09;SB=-287.67	GT:AD:DP:GL:GQ	0/1:22,20:43:-74.67,-15.12,-82.44:99
-chr1	4310347	.	C	T	101.72	PASS	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=59.41;MQ0=0;OQ=1172.68;QD=16.52;SB=-579.36	GT:AD:DP:GL:GQ	0/1:36,35:70:-141.64,-21.08,-130.80:99
-chr1	4314528	.	T	C	249.50	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1047.71;QD=18.38;SB=-476.64	GT:AD:DP:GL:GQ	0/1:22,35:57:-125.23,-17.17,-90.17:99
-chr1	4316332	.	T	G	43.87	PASS	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.09;MQ=59.28;MQ0=0;OQ=471.43;QD=14.73;SB=-242.41	GT:AD:DP:GL:GQ	0/1:14,18:31:-59.77,-9.34,-47.32:99
-chr1	4316334	.	C	G	15.52	PASS	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=59.32;MQ0=0;OQ=676.22;QD=19.89;SB=-323.04	GT:AD:DP:GL:GQ	0/1:15,19:34:-81.16,-10.25,-60.88:99
-chr1	4318103	rs349395	A	G	659.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=1716.14;QD=31.20;SB=-834.63	GT:AD:DP:GL:GQ	1/1:0,55:54:-175.24,-16.28,-0.05:99
-chr1	4319680	rs349393	A	C	563.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=813.26;QD=15.95;SB=-376.77	GT:AD:DP:GL:GQ	0/1:23,28:51:-99.97,-15.36,-86.41:99
-chr1	4319765	rs102083	A	T	361.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=55.80;MQ0=0;OQ=747.97;QD=14.96;SB=-385.65	GT:AD:DP:GL:GQ	0/1:24,26:48:-92.54,-14.46,-85.84:99
-chr1	4319782	rs28431405	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=20;HaplotypeScore=17.05;MQ=53.28;MQ0=0;OQ=875.22;QD=14.59;SB=-406.12	GT:AD:DP:GL:GQ	0/1:25,35:49:-105.57,-14.76,-69.63:99
-chr1	4319814	rs102085	G	A	15.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=5.54;MQ=52.08;MQ0=0;OQ=929.67;QD=17.22;SB=-462.49	GT:AD:DP:GL:GQ	0/1:25,29:49:-111.01,-14.76,-74.46:99
-chr1	4319857	rs17410050	C	T	91.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=57.83;MQ0=0;OQ=1009.89;QD=18.36;SB=-347.35	GT:AD:DP:GL:GQ	0/1:26,29:55:-120.84,-16.57,-94.75:99
-chr1	4320268	rs349392	G	T	359.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.27;MQ=58.71;MQ0=0;OQ=818.84;QD=15.16;SB=-433.16	GT:AD:DP:GL:GQ	0/1:23,30:49:-99.94,-14.77,-68.96:99
-chr1	4320352	rs101287	A	C	9.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=3;HaplotypeScore=2.94;MQ=58.91;MQ0=0;OQ=686.61;QD=10.73;SB=-323.81	GT:AD:DP:GL:GQ	0/1:36,28:61:-90.33,-18.38,-119.68:99
-chr1	4321671	rs56216403	A	T	13.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=7.66;MQ=57.98;MQ0=0;OQ=569.50;QD=12.94;SB=-290.67	GT:AD:DP:GL:GQ	0/1:24,20:41:-72.59,-12.36,-76.85:99
-chr1	4321865	rs349391	T	C	61.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.58;MQ=58.51;MQ0=0;OQ=775.30;QD=16.50;SB=-140.34	GT:AD:DP:GL:GQ	0/1:20,26:42:-93.47,-12.66,-62.46:99
-chr1	4321866	rs56376431	G	A	8.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.58;MQ=58.51;MQ0=0;OQ=873.71;QD=18.59;SB=-178.26	GT:AD:DP:GL:GQ	0/1:21,26:42:-103.31,-12.65,-56.39:99
-chr1	4322006	rs56162804	C	T	116.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.53;MQ0=0;OQ=1021.04;QD=20.84;SB=-534.77	GT:AD:DP:GL:GQ	0/1:19,30:49:-120.16,-14.77,-59.62:99
-chr1	4322030	rs55838104	C	T	52.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.96;MQ=60.00;MQ0=0;OQ=1120.64;QD=21.14;SB=-534.76	GT:AD:DP:GL:GQ	0/1:20,33:52:-131.01,-15.67,-66.54:99
-chr1	4322090	rs16838800	A	G	416.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=910.62;QD=19.80;SB=-423.34	GT:AD:DP:GL:GQ	0/1:16,30:46:-108.20,-13.86,-64.49:99
-chr1	4322538	rs12403556	C	G	69.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=60.00;MQ0=0;OQ=1513.57;QD=24.81;SB=-525.74	GT:AD:DP:GL:GQ	0/1:20,41:61:-173.03,-18.39,-83.32:99
-chr1	4322543	rs12404034	A	G	25.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=3.64;MQ=60.00;MQ0=0;OQ=1221.46;QD=20.02;SB=-417.22	GT:AD:DP:GL:GQ	0/1:20,41:60:-143.50,-18.07,-80.25:99
-chr1	4322609	rs12404038	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=5;HaplotypeScore=9.16;MQ=59.56;MQ0=0;OQ=664.61;QD=12.54;SB=-143.41	GT:AD:DP:GL:GQ	0/1:24,29:49:-84.51,-14.77,-94.35:99
-chr1	4322739	rs12404366	T	C	226.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=432.95;QD=9.41;SB=-158.54	GT:AD:DP:GL:GQ	0/1:29,17:46:-60.44,-13.86,-115.98:99
-chr1	4322916	rs12402553	G	A	357.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.62;MQ0=0;OQ=842.62;QD=13.81;SB=-393.36	GT:AD:DP:GL:GQ	0/1:35,26:59:-105.32,-17.77,-117.60:99
-chr1	4323438	rs16838810	A	G	123.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=0.32;MQ=59.40;MQ0=0;OQ=808.90;QD=13.05;SB=-366.96	GT:AD:DP:GL:GQ	0/1:30,32:61:-102.56,-18.39,-119.19:99
-chr1	4323490	rs55944275	G	A	62.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.36;MQ0=0;OQ=1153.53;QD=19.89;SB=-343.36	GT:AD:DP:GL:GQ	0/1:24,34:57:-135.81,-17.17,-85.54:99
-chr1	4323756	rs349390	T	C	313.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.62;MQ0=0;OQ=671.97;QD=11.20;SB=-140.85	GT:AD:DP:GL:GQ	0/1:34,26:58:-87.95,-17.47,-136.36:99
-chr1	4323757	rs58351078	G	A	132.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.61;MQ0=0;OQ=802.14;QD=13.60;SB=-181.76	GT:AD:DP:GL:GQ	0/1:34,25:59:-101.27,-17.77,-124.39:99
-chr1	4323928	rs61676533	C	T	374.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.48;MQ0=0;OQ=1036.80;QD=14.40;SB=-477.00	GT:AD:DP:GL:GQ	0/1:40,32:72:-128.65,-21.69,-142.77:99
-chr1	4323975	rs16838812	A	G	340.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=59.17;MQ0=0;OQ=822.30;QD=12.09;SB=-364.22	GT:AD:DP:GL:GQ	0/1:38,30:68:-106.00,-20.49,-150.74:99
-chr1	4324005	rs16838813	G	A	586.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.08;MQ0=0;OQ=833.74;QD=14.13;SB=-356.82	GT:AD:DP:GL:GQ	0/1:33,26:58:-104.14,-17.48,-106.56:99
-chr1	4324062	rs56775247	A	G	352.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.86;MQ0=0;OQ=755.78;QD=11.81;SB=-150.88	GT:AD:DP:GL:GQ	0/1:37,27:64:-98.14,-19.28,-148.79:99
-chr1	4324102	rs57599092	A	T	199.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.94;MQ=53.27;MQ0=0;OQ=1008.31;QD=14.83;SB=-333.61	GT:AD:DP:GL:GQ	0/1:34,34:66:-123.99,-19.88,-127.49:99
-chr1	4324399	rs11804096	T	C	269.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=45.70;MQ0=1;OQ=598.48;QD=11.29;SB=-306.38	GT:AD:DP:GL:GQ	0/1:28,25:48:-77.59,-14.46,-100.69:99
-chr1	4324626	rs11803736	A	G	203.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=51.26;MQ0=1;OQ=569.48;QD=10.55;SB=-273.41	GT:AD:DP:GL:GQ	0/1:32,22:52:-75.89,-15.66,-126.39:99
-chr1	4324693	rs11801800	G	A	371.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=50.70;MQ0=1;OQ=920.80;QD=14.85;SB=-460.99	GT:AD:DP:GL:GQ	0/1:32,30:59:-113.14,-17.77,-113.29:99
-chr1	4324939	rs12729994	C	A	219.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=56.71;MQ0=0;OQ=746.98;QD=16.98;SB=-320.72	GT:AD:DP:GL:GQ	0/1:18,26:42:-90.63,-12.65,-55.46:99
-chr1	4325115	rs12742617	T	G	433.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.56;MQ0=0;OQ=1013.88;QD=12.07;SB=-397.13	GT:AD:DP:GL:GQ	0/1:47,37:83:-129.67,-25.00,-173.24:99
-chr1	4325508	rs34012704	A	G	166.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.90;MQ=59.63;MQ0=0;OQ=986.31;QD=19.34;SB=-504.18	GT:AD:DP:GL:GQ	0/1:17,34:49:-116.68,-14.77,-62.75:99
-chr1	4325583	.	G	A	54.73	PASS	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=60.00;MQ0=0;OQ=709.46;QD=16.50;SB=-303.82	GT:AD:DP:GL:GQ	0/1:18,25:41:-86.59,-12.36,-64.70:99
-chr1	4325707	rs12405082	A	G	0.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=6.04;MQ=58.57;MQ0=0;OQ=521.78;QD=8.42;SB=-177.38	GT:AD:DP:GL:GQ	0/1:38,24:56:-72.34,-16.88,-134.28:99
-chr1	4325759	.	C	T	1.66	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=2;HaplotypeScore=2.89;MQ=58.50;MQ0=0;OQ=768.28;QD=12.39;SB=-160.15	GT:AD:DP:GL:GQ	0/1:32,29:57:-97.29,-17.18,-106.60:99
-chr1	4325887	rs12403671	G	C	245.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.67;MQ0=0;OQ=1119.45;QD=19.64;SB=-552.71	GT:AD:DP:GL:GQ	0/1:24,33:54:-131.50,-16.27,-104.02:99
-chr1	4325945	rs12404619	C	T	347.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.65;MQ0=0;OQ=874.85;QD=15.91;SB=-387.13	GT:AD:DP:GL:GQ	0/1:26,29:53:-106.74,-15.97,-91.70:99
-chr1	4326338	rs16838819	A	C	229.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=4.02;MQ=58.63;MQ0=0;OQ=550.44;QD=10.79;SB=-296.79	GT:AD:DP:GL:GQ	0/1:29,22:49:-73.09,-14.76,-103.75:99
-chr1	4327728	rs34472761	G	C	257.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=59.05;MQ0=0;OQ=1072.08;QD=16.75;SB=-550.71	GT:AD:DP:GL:GQ	0/1:32,32:62:-129.19,-18.70,-130.17:99
-chr1	4328031	rs56108323	G	A	198.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=626.21;QD=12.28;SB=-249.12	GT:AD:DP:GL:GQ	0/1:27,24:48:-80.37,-14.46,-97.54:99
-chr1	4329322	rs483344	A	G	283.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=59.34;MQ0=0;OQ=672.82;QD=9.61;SB=-273.11	GT:AD:DP:GL:GQ	0/1:41,29:68:-91.06,-20.50,-159.89:99
-chr1	4331124	rs572439	A	C	450.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.73;MQ0=0;OQ=1069.67;QD=15.73;SB=-417.82	GT:AD:DP:GL:GQ	0/1:30,38:67:-130.43,-20.18,-110.75:99
-chr1	4331158	rs572343	G	A	289.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.72;MQ0=0;OQ=1247.65;QD=18.62;SB=-597.10	GT:AD:DP:GL:GQ	0/1:31,36:64:-147.32,-19.27,-103.83:99
-chr1	4331483	rs12750862	T	C	292.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.22;MQ=59.55;MQ0=0;OQ=752.94;QD=14.76;SB=-378.63	GT:AD:DP:GL:GQ	0/1:24,27:49:-93.35,-14.77,-86.37:99
-chr1	4331508	.	C	T	49.49	PASS	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=60.00;MQ0=0;OQ=892.12;QD=17.84;SB=-369.91	GT:AD:DP:GL:GQ	0/1:18,31:43:-105.46,-12.97,-47.94:99
-chr1	4333712	rs2926485	T	C	268.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.56;MQ=59.83;MQ0=0;OQ=1004.92;QD=15.70;SB=-484.15	GT:AD:DP:GL:GQ	0/1:28,35:61:-122.15,-18.38,-108.51:99
-chr1	4334184	rs57575485	C	T	360.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.70;MQ0=0;OQ=1292.51;QD=16.79;SB=-566.07	GT:AD:DP:GL:GQ	0/1:37,40:76:-155.43,-22.90,-133.07:99
-chr1	4334834	rs661536	A	G	714.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1993.62;QD=34.98;SB=-900.02	GT:AD:DP:GL:GQ	1/1:0,57:57:-202.97,-17.17,-0.02:99
-chr1	4339520	rs902403	T	C	449.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=846.06;QD=12.44;SB=-357.94	GT:AD:DP:GL:GQ	0/1:35,33:68:-108.38,-20.49,-140.89:99
-chr1	4339677	rs2926482	C	G	218.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2219.96;QD=42.69;SB=-974.35	GT:AD:DP:GL:GQ	1/1:0,52:52:-225.60,-15.67,-0.01:99
-chr1	4340373	rs590798	A	C	514.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=2632.91;QD=34.64;SB=-1142.61	GT:AD:DP:GL:GQ	1/1:0,76:76:-266.90,-22.89,-0.03:99
-chr1	4344158	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=3;HaplotypeScore=3.49;MQ=60.00;MQ0=0;OQ=63.29;QD=1.07;SB=56.21	GT:AD:DP:GL:GQ	0/1:42,17:47:-23.79,-14.18,-151.98:96.13
-chr1	4344566	rs349413	C	A	606.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1116.07;QD=14.69;SB=-454.53	GT:AD:DP:GL:GQ	0/1:39,37:76:-137.78,-22.89,-141.17:99
-chr1	4345038	rs164598	G	A	482.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.02;MQ0=0;OQ=1164.61;QD=17.38;SB=-524.70	GT:AD:DP:GL:GQ	0/1:32,35:67:-139.93,-20.18,-113.85:99
-chr1	4347591	rs4654526	C	T	500.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1310.21;QD=20.16;SB=-660.78	GT:AD:DP:GL:GQ	0/1:25,40:61:-152.69,-18.39,-71.94:99
-chr1	4351708	rs11585123	G	T	52.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=3;HaplotypeScore=1.96;MQ=59.43;MQ0=0;OQ=956.92;QD=13.11;SB=-391.99	GT:AD:DP:GL:GQ	0/1:39,34:73:-120.97,-21.99,-133.39:99
-chr1	4352257	rs627555	G	A	556.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.08;MQ0=0;OQ=1274.67;QD=14.01;SB=-577.49	GT:AD:DP:GL:GQ	0/1:53,38:91:-158.16,-27.41,-187.48:99
-chr1	4352698	.	A	C	145.09	PASS	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=1251.00;QD=14.55;SB=-612.69	GT:AD:DP:GL:GQ	0/1:43,43:84:-153.68,-25.30,-154.64:99
-chr1	4353326	rs7523383	C	T	223.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=1125.20;QD=18.75;SB=-322.36	GT:AD:DP:GL:GQ	0/1:24,35:55:-132.39,-16.58,-65.47:99
-chr1	4354986	rs55703746	G	T	228.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=1494.65;QD=18.68;SB=-625.43	GT:AD:DP:GL:GQ	0/1:32,48:80:-176.84,-24.10,-112.47:99
-chr1	4358435	.	C	T	24.59	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=3.25;MQ=55.69;MQ0=0;QD=0.61;SB=41.14	GT:AD:DP:GL:GQ	0/1:35,4:36:-16.60,-10.86,-102.91:57.41
-chr1	4358482	.	C	G	35.61	LowQual	AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=3.12;MQ=54.32;MQ0=0;QD=1.05;SB=-23.70	GT:AD:DP:GL:GQ	0/1:30,4:32:-16.49,-9.64,-124.37:68.45
-chr1	4359549	rs6679220	T	C	288.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=543.81;QD=10.66;SB=-272.37	GT:AD:DP:GL:GQ	0/1:30,21:50:-72.72,-15.06,-124.68:99
-chr1	4360825	rs56081339	G	A	327.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=59.43;MQ0=0;OQ=993.85;QD=13.61;SB=-456.06	GT:AD:DP:GL:GQ	0/1:40,33:70:-123.78,-21.11,-120.70:99
-chr1	4363525	rs349402	G	A	561.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.26;MQ0=0;OQ=1290.95;QD=16.99;SB=-425.80	GT:AD:DP:GL:GQ	0/1:36,40:74:-154.68,-22.30,-119.31:99
-chr1	4367389	rs4654429	G	A	56.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=5.58;MQ=57.65;MQ0=0;OQ=1142.68;QD=16.80;SB=-522.78	GT:AD:DP:GL:GQ	0/1:32,36:64:-136.84,-19.29,-93.56:99
-chr1	4367566	rs4654430	T	C	472.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=611.79;QD=10.92;SB=-199.58	GT:AD:DP:GL:GQ	0/1:34,22:55:-81.03,-16.57,-131.86:99
-chr1	4368744	rs547923	C	A	335.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=58.91;MQ0=0;OQ=794.59;QD=12.42;SB=-343.21	GT:AD:DP:GL:GQ	0/1:34,30:61:-101.12,-18.38,-116.77:99
-chr1	4369295	rs6687224	C	G	567.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1064.80;QD=17.75;SB=-495.28	GT:AD:DP:GL:GQ	0/1:29,31:59:-127.55,-17.78,-120.89:99
-chr1	4369728	rs733308	T	G	295.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=1.39;MQ=59.19;MQ0=1;OQ=894.22;QD=10.65;SB=-355.63	GT:AD:DP:GL:GQ	0/1:48,36:83:-117.71,-25.00,-176.40:99
-chr1	4370735	rs2926477	A	G	468.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=995.20;QD=15.31;SB=-357.26	GT:AD:DP:GL:GQ	0/1:29,36:64:-122.09,-19.28,-116.14:99
-chr1	4371593	rs505933	A	G	376.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.99;MQ0=0;OQ=894.44;QD=10.78;SB=-423.73	GT:AD:DP:GL:GQ	0/1:45,38:82:-117.44,-24.72,-179.72:99
-chr1	4371867	rs693045	T	C	492.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.26;MQ0=0;OQ=669.20;QD=9.99;SB=-303.21	GT:AD:DP:GL:GQ	0/1:37,30:64:-89.50,-19.29,-143.01:99
-chr1	4371873	rs10915529	G	C	482.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.33;MQ0=0;OQ=903.58;QD=12.91;SB=-393.25	GT:AD:DP:GL:GQ	0/1:40,30:69:-114.44,-20.80,-177.40:99
-chr1	4371886	rs659514	T	C	97.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=1.39;MQ=58.28;MQ0=0;OQ=683.73;QD=10.05;SB=-268.51	GT:AD:DP:GL:GQ	0/1:42,26:67:-91.84,-20.18,-171.36:99
-chr1	4372308	rs4654533	C	G	209.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.20;MQ0=0;OQ=1490.53;QD=19.61;SB=-620.61	GT:AD:DP:GL:GQ	0/1:35,41:72:-174.05,-21.72,-126.16:99
-chr1	4375044	rs349405	A	C	311.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=541.86;QD=10.62;SB=-270.89	GT:AD:DP:GL:GQ	0/1:31,20:51:-72.83,-15.36,-116.45:99
-chr1	4375626	rs349406	T	C	212.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=2.99;MQ=59.38;MQ0=0;OQ=1112.63;QD=14.84;SB=-554.63	GT:AD:DP:GL:GQ	0/1:36,39:72:-136.23,-21.69,-140.85:99
-chr1	4375771	rs12562242	G	T	432.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=59.23;MQ0=0;OQ=915.50;QD=12.54;SB=-381.76	GT:AD:DP:GL:GQ	0/1:39,34:71:-116.22,-21.39,-137.78:99
-chr1	4376133	rs349407	G	A	305.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.03;MQ0=1;OQ=1382.00;QD=18.43;SB=-530.55	GT:AD:DP:GL:GQ	0/1:31,44:71:-162.87,-21.39,-107.28:99
-chr1	4376945	rs10915530	C	T	589.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1129.31;QD=16.13;SB=-586.64	GT:AD:DP:GL:GQ	0/1:35,35:68:-136.71,-20.50,-105.26:99
-chr1	4377252	rs1490416	T	A	34.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.01;HRun=1;HaplotypeScore=4.80;MQ=59.18;MQ0=0;OQ=1402.77;QD=16.50;SB=-436.53	GT:AD:DP:GL:GQ	0/1:39,45:80:-167.66,-24.10,-131.13:99
-chr1	4377771	rs349409	C	T	337.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.02;MQ=59.15;MQ0=0;OQ=1097.95;QD=15.46;SB=-477.48	GT:AD:DP:GL:GQ	0/1:37,34:69:-133.86,-20.78,-131.05:99
-chr1	4377899	rs349410	C	A	42.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=4.55;MQ=59.19;MQ0=0;OQ=1054.50;QD=18.50;SB=-399.14	GT:AD:DP:GL:GQ	0/1:22,35:56:-125.60,-16.87,-75.99:99
-chr1	4377949	rs349411	C	T	2.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=11.72;MQ=58.87;MQ0=0;OQ=1481.01;QD=18.06;SB=-689.93	GT:AD:DP:GL:GQ	0/1:37,45:80:-175.49,-24.10,-130.86:99
-chr1	4377999	rs10915531	A	G	391.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.24;MQ0=0;OQ=1298.04;QD=16.23;SB=-576.28	GT:AD:DP:GL:GQ	0/1:36,44:80:-157.19,-24.10,-146.95:99
-chr1	4380137	rs493178	G	C	0.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.09;MQ=57.06;MQ0=0;OQ=874.81;QD=23.64;SB=-165.59	GT:AD:DP:GL:GQ	0/1:11,26:34:-101.01,-10.25,-40.96:99
-chr1	4380197	.	G	A	21.03	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=23.38;MQ=29.95;MQ0=2;QD=0.68;SB=41.12	GT:AD:DP:GL:GQ	0/1:26,5:22:-12.01,-6.63,-63.36:53.84
-chr1	4380201	rs59237016	A	T	117.83	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=21.39;MQ=30.09;MQ0=2;QD=4.36;SB=-11.73	GT:AD:DP:GL:GQ	0/1:19,6:13:-24.36,-9.29,-27.60:99
-chr1	4380203	.	A	G	41.11	LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=24.37;MQ=28.28;MQ0=2;QD=1.64;SB=-10.00	GT:AD:DP:GL:GQ	0/1:17,7:10:-10.41,-3.01,-27.49:73.95
-chr1	4380215	.	G	A	523.36	SnpCluster	AC=2;AF=1.00;AN=2;DP=19;Dels=0.05;HRun=0;HaplotypeScore=13.20;MQ=29.01;MQ0=2;QD=27.55;SB=-164.67	GT:AD:DP:GL:GQ	1/1:1,17:14:-55.92,-4.22,-0.00:42.14
-chr1	4380217	rs60888156	G	A	452.59	SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.05;HRun=0;HaplotypeScore=13.68;MQ=29.01;MQ0=2;QD=23.82;SB=-163.66	GT:AD:DP:GL:GQ	1/1:4,14:14:-51.77,-4.22,-2.97:12.46
-chr1	4380219	.	G	A	274.46	SnpCluster	AC=1;AF=0.50;AN=2;DP=17;Dels=0.06;HRun=0;HaplotypeScore=11.89;MQ=29.85;MQ0=1;QD=16.14;SB=-148.61	GT:AD:DP:GL:GQ	0/1:5,11:13:-34.65,-3.92,-13.88:99
-chr1	4380249	.	G	A	49.25	LowQual	AC=2;AF=1.00;AN=2;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.68;MQ0=1;QD=16.42;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,3:2:-8.33,-0.60,-0.00:6.02
-chr1	4380271	rs6697112	G	A	9.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=37.32;MQ0=0;OQ=124.22;QD=24.84;SB=-44.55	GT:AD:DP:GL:GQ	1/1:1,4:4:-15.96,-1.21,-0.00:12.04
-chr1	4380311	rs1309838	C	A	157.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=54.85;MQ0=0;OQ=623.10;QD=14.84;SB=-208.87	GT:AD:DP:GL:GQ	0/1:19,23:41:-77.95,-12.35,-68.48:99
-chr1	4380330	rs1309839	C	T	0.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=7.73;MQ=55.45;MQ0=0;OQ=843.65;QD=20.09;SB=-255.33	GT:AD:DP:GL:GQ	0/1:15,27:37:-98.80,-11.15,-35.58:99
-chr1	4380929	.	T	C	25.32	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=2;HaplotypeScore=5.44;MQ=59.32;MQ0=0;QD=0.37;SB=122.43	GT:AD:DP:GL:GQ	0/1:48,20:54:-22.08,-16.27,-188.06:58.14
-chr1	4380941	rs349386	C	T	474.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.84;MQ0=0;OQ=1352.78;QD=17.80;SB=-554.75	GT:AD:DP:GL:GQ	0/1:36,40:74:-160.85,-22.29,-128.59:99
-chr1	4381075	rs4654432	C	T	88.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=3;HaplotypeScore=1.63;MQ=60.32;MQ0=0;OQ=870.11;QD=12.80;SB=-258.77	GT:AD:DP:GL:GQ	0/1:40,28:66:-110.19,-19.90,-123.57:99
-chr1	4381353	rs35799150	A	G	389.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=820.10;QD=12.06;SB=-192.18	GT:AD:DP:GL:GQ	0/1:39,29:68:-105.78,-20.48,-159.19:99
-chr1	4381492	rs4654433	G	A	604.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=1070.93;QD=15.98;SB=-493.09	GT:AD:DP:GL:GQ	0/1:35,32:67:-130.57,-20.19,-112.83:99
-chr1	4382470	rs737324	G	C	535.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.88;MQ0=0;OQ=1310.24;QD=17.47;SB=-409.80	GT:AD:DP:GL:GQ	0/1:38,37:74:-156.61,-22.31,-151.67:99
-chr1	4382624	rs349385	A	G	200.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=56.49;MQ0=0;OQ=1553.01;QD=28.76;SB=-619.97	GT:AD:DP:GL:GQ	1/1:0,53:51:-158.94,-15.39,-0.06:99
-chr1	4383263	rs41266223	T	C	212.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.22;MQ=57.69;MQ0=0;OQ=666.08;QD=11.29;SB=-355.38	GT:AD:DP:GL:GQ	0/1:32,27:53:-85.86,-15.97,-114.12:99
-chr1	4385955	rs4654537	A	G	109.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=60.00;MQ0=0;OQ=187.72;QD=8.16;SB=-92.99	GT:AD:DP:GL:GQ	0/1:12,10:21:-28.39,-6.33,-46.97:99
-chr1	4386470	rs1762818	A	G	620.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=2262.65;QD=34.81;SB=-1121.77	GT:AD:DP:GL:GQ	1/1:0,65:63:-229.87,-18.98,-0.02:99
-chr1	4386565	rs2035009	T	C	346.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=58.05;MQ0=0;OQ=655.98;QD=10.93;SB=-329.97	GT:AD:DP:GL:GQ	0/1:30,30:56:-85.78,-16.89,-109.09:99
-chr1	4386918	rs2035008	T	A	56.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=1.25;MQ=55.07;MQ0=0;OQ=728.43;QD=12.14;SB=-228.91	GT:AD:DP:GL:GQ	0/1:33,27:58:-93.60,-17.47,-122.91:99
-chr1	4387800	.	G	A	279.77	PASS	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1023.92;QD=16.25;SB=-391.36	GT:AD:DP:GL:GQ	0/1:32,31:61:-124.06,-18.39,-99.73:99
-chr1	4388151	rs4654542	C	T	244.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=60.00;MQ0=0;OQ=1264.25;QD=16.63;SB=-528.76	GT:AD:DP:GL:GQ	0/1:37,39:75:-152.31,-22.60,-121.60:99
-chr1	4388316	rs4654434	G	A	492.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1047.13;QD=14.54;SB=-490.97	GT:AD:DP:GL:GQ	0/1:40,32:72:-129.68,-21.69,-147.17:99
-chr1	4388691	rs6667927	C	T	322.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.79;MQ0=0;OQ=1604.10;QD=18.23;SB=-806.38	GT:AD:DP:GL:GQ	0/1:41,47:88:-190.20,-26.51,-149.18:99
-chr1	4388839	rs6658372	G	A	449.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.10;MQ0=0;OQ=954.40;QD=14.24;SB=-360.06	GT:AD:DP:GL:GQ	0/1:36,31:66:-118.61,-19.88,-128.27:99
-chr1	4389258	rs6678792	T	C	469.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.45;MQ0=0;OQ=1167.87;QD=15.37;SB=-534.97	GT:AD:DP:GL:GQ	0/1:37,39:76:-142.96,-22.89,-149.63:99
-chr1	4389389	rs10915533	G	A	316.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.43;MQ=59.63;MQ0=0;OQ=829.91;QD=13.39;SB=-417.75	GT:AD:DP:GL:GQ	0/1:33,29:58:-103.75,-17.48,-109.80:99
-chr1	4389459	rs995749	T	C	99.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=3.02;MQ=59.19;MQ0=0;OQ=673.64;QD=11.82;SB=-297.62	GT:AD:DP:GL:GQ	0/1:29,28:55:-87.23,-16.58,-114.38:99
-chr1	4390198	rs6676603	A	T	439.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.38;MQ0=0;OQ=1300.48;QD=17.57;SB=-634.13	GT:AD:DP:GL:GQ	0/1:32,42:73:-155.32,-21.99,-116.56:99
-chr1	4390481	rs12128251	T	C	259.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=57.96;MQ0=0;OQ=632.69;QD=11.94;SB=-295.21	GT:AD:DP:GL:GQ	0/1:28,25:50:-81.62,-15.07,-105.90:99
-chr1	4391861	rs2007533	T	A	193.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=57.74;MQ0=0;OQ=586.86;QD=11.51;SB=-140.76	GT:AD:DP:GL:GQ	0/1:30,21:48:-76.43,-14.46,-99.70:99
-chr1	4391958	rs1809702	T	C	301.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=1033.40;QD=12.45;SB=-514.71	GT:AD:DP:GL:GQ	0/1:39,44:81:-131.04,-24.42,-155.02:99
-chr1	4392226	rs736265	G	A	87.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=4.07;MQ=59.56;MQ0=0;OQ=793.67;QD=14.97;SB=-313.81	GT:AD:DP:GL:GQ	0/1:27,26:51:-98.01,-15.36,-98.57:99
-chr1	4393075	rs1556691	A	G	599.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.74;MQ0=0;OQ=937.52;QD=14.88;SB=-473.07	GT:AD:DP:GL:GQ	0/1:29,34:61:-115.41,-18.38,-116.29:99
-chr1	4393225	rs4654435	T	C	403.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=690.21;QD=11.50;SB=-328.14	GT:AD:DP:GL:GQ	0/1:28,31:55:-88.89,-16.58,-104.73:99
-chr1	4394358	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=18;HaplotypeScore=18.20;MQ=57.05;MQ0=0;OQ=138.13;QD=2.76;SB=68.21	GT:AD:DP:GL:GQ	0/1:39,11:43:-30.06,-12.96,-119.55:99
-chr1	4394377	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=18;HaplotypeScore=17.15;MQ=55.75;MQ0=0;OQ=145.86;QD=2.75;SB=25.24	GT:AD:DP:GL:GQ	0/1:40,13:43:-30.82,-12.95,-126.23:99
-chr1	4394834	rs12072315	G	A	483.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=835.16;QD=15.47;SB=-392.90	GT:AD:DP:GL:GQ	0/1:29,25:53:-102.78,-15.98,-90.62:99
-chr1	4394951	rs7546444	A	G	181.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.12;MQ0=0;OQ=846.04;QD=12.26;SB=-340.27	GT:AD:DP:GL:GQ	0/1:38,31:68:-108.38,-20.49,-147.54:99
-chr1	4395538	rs1591426	T	C	726.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=2474.70;QD=34.37;SB=-1102.69	GT:AD:DP:GL:GQ	1/1:0,72:71:-251.09,-21.39,-0.04:99
-chr1	4395562	rs1591425	A	G	113.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.25;MQ0=0;OQ=1914.52;QD=29.01;SB=-807.30	GT:AD:DP:GL:GQ	1/1:0,66:62:-195.10,-18.70,-0.06:99
-chr1	4396040	rs10915536	C	T	108.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.40;MQ0=0;OQ=3075.21;QD=39.94;SB=-1236.02	GT:AD:DP:GL:GQ	1/1:0,77:77:-311.12,-23.19,-0.02:99
-chr1	4396189	rs1762813	C	T	709.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.85;MQ0=0;OQ=1988.33;QD=37.52;SB=-957.81	GT:AD:DP:GL:GQ	1/1:0,52:51:-202.43,-15.36,-0.01:99
-chr1	4396377	rs1674876	G	A	690.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=3414.62;QD=39.70;SB=-1526.04	GT:AD:DP:GL:GQ	1/1:0,86:85:-340.46,-25.61,-0.02:99
-chr1	4396770	rs1335365	G	A	180.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=3218.44;QD=38.31;SB=-1546.06	GT:AD:DP:GL:GQ	1/1:0,84:82:-325.46,-24.71,-0.03:99
-chr1	4396978	rs6660514	C	T	529.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=2569.74;QD=40.15;SB=-881.18	GT:AD:DP:GL:GQ	1/1:0,64:63:-260.57,-18.97,-0.01:99
-chr1	4396990	rs1335363	G	A	705.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=2655.20;QD=39.05;SB=-1068.35	GT:AD:DP:GL:GQ	1/1:0,68:67:-269.12,-20.18,-0.02:99
-chr1	4397408	rs35211041	C	G	282.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.56;MQ0=0;OQ=845.74;QD=15.96;SB=-404.93	GT:AD:DP:GL:GQ	0/1:28,25:51:-103.22,-15.37,-116.49:99
-chr1	4397651	rs1234932	T	C	32.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=2.62;MQ=59.08;MQ0=0;OQ=2038.22;QD=30.88;SB=-895.04	GT:AD:DP:GL:GQ	1/1:0,66:64:-207.46,-19.30,-0.06:99
-chr1	4399691	rs780572	T	C	25.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=3.98;MQ=59.66;MQ0=0;OQ=2164.78;QD=32.31;SB=-610.95	GT:AD:DP:GL:GQ	1/1:0,67:65:-220.10,-19.59,-0.04:99
-chr1	4400105	rs12727067	C	T	348.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.54;MQ0=0;OQ=3168.12;QD=39.11;SB=-1535.71	GT:AD:DP:GL:GQ	1/1:0,81:79:-320.41,-23.80,-0.02:99
-chr1	4400296	rs12731060	C	T	672.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2631.07;QD=38.69;SB=-901.20	GT:AD:DP:GL:GQ	1/1:0,68:67:-266.72,-20.19,-0.02:99
-chr1	4401014	rs6674190	C	T	89.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.77;MQ0=0;OQ=3223.06;QD=39.79;SB=-1621.16	GT:AD:DP:GL:GQ	1/1:0,81:80:-325.90,-24.10,-0.02:99
-chr1	4401844	rs780573	A	G	655.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=2538.38;QD=30.96;SB=-1020.34	GT:AD:DP:GL:GQ	1/1:0,82:80:-257.49,-24.12,-0.07:99
-chr1	4403585	rs780581	T	C	628.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=2729.37;QD=35.91;SB=-1251.85	GT:AD:DP:GL:GQ	1/1:0,76:75:-276.54,-22.59,-0.02:99
-chr1	4405826	rs780587	T	C	579.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=1799.99;QD=35.29;SB=-764.96	GT:AD:DP:GL:GQ	1/1:0,51:50:-183.60,-15.06,-0.02:99
-chr1	4406185	rs780588	T	G	731.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.29;MQ0=0;OQ=2276.92;QD=35.03;SB=-1150.64	GT:AD:DP:GL:GQ	1/1:0,65:65:-231.29,-19.58,-0.02:99
-chr1	4407102	rs780589	G	T	206.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.17;MQ0=0;OQ=2615.53;QD=35.83;SB=-1329.09	GT:AD:DP:GL:GQ	1/1:0,73:72:-265.16,-21.68,-0.02:99
-chr1	4407119	rs12032561	A	G	117.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.23;MQ0=0;OQ=2421.51;QD=30.65;SB=-1099.12	GT:AD:DP:GL:GQ	1/1:0,79:76:-245.80,-22.92,-0.06:99
-chr1	4407230	rs780590	C	A	140.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=2388.18;QD=35.64;SB=-981.59	GT:AD:DP:GL:GQ	1/1:0,67:66:-242.42,-19.88,-0.02:99
-chr1	4407326	rs780591	G	C	50.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=59.66;MQ0=0;OQ=2352.09;QD=42.77;SB=-1101.12	GT:AD:DP:GL:GQ	1/1:0,54:54:-238.81,-16.27,-0.01:99
-chr1	4407520	rs780592	G	A	361.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.77;MQ0=0;OQ=3300.47;QD=41.26;SB=-1496.40	GT:AD:DP:GL:GQ	1/1:0,80:80:-329.05,-24.10,-0.02:99
-chr1	4407623	rs780594	T	C	139.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=2.07;MQ=59.52;MQ0=0;OQ=2627.95;QD=34.13;SB=-1058.85	GT:AD:DP:GL:GQ	1/1:0,77:75:-266.41,-22.59,-0.03:99
-chr1	4408032	rs705684	C	T	627.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2940.63;QD=39.21;SB=-1334.78	GT:AD:DP:GL:GQ	1/1:0,75:74:-297.67,-22.29,-0.02:99
-chr1	4408272	rs780595	C	G	8.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=58.81;MQ0=0;OQ=2333.53;QD=42.43;SB=-1051.66	GT:AD:DP:GL:GQ	1/1:0,55:54:-236.95,-16.27,-0.02:99
-chr1	4408429	rs2054268	A	G	302.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=59.14;MQ0=0;OQ=2648.73;QD=34.85;SB=-1019.36	GT:AD:DP:GL:GQ	1/1:0,76:74:-268.49,-22.29,-0.03:99
-chr1	4408966	rs780596	C	G	540.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=3023.42;QD=42.58;SB=-1306.69	GT:AD:DP:GL:GQ	1/1:0,71:71:-305.95,-21.40,-0.02:99
-chr1	4409197	rs2054269	G	A	716.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.30;MQ0=0;OQ=2812.55;QD=39.06;SB=-1393.37	GT:AD:DP:GL:GQ	1/1:0,72:71:-284.86,-21.39,-0.02:99
-chr1	4409239	rs2054270	C	A	370.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.01;MQ0=0;OQ=2523.69;QD=36.05;SB=-1226.28	GT:AD:DP:GL:GQ	1/1:0,70:69:-255.97,-20.78,-0.02:99
-chr1	4411281	rs922114	C	T	206.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.24;MQ=60.00;MQ0=0;OQ=2458.23;QD=37.82;SB=-1122.24	GT:AD:DP:GL:GQ	1/1:0,65:63:-249.43,-18.99,-0.03:99
-chr1	4411941	rs56397589	A	G	10.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=3;HaplotypeScore=1.47;MQ=60.00;MQ0=0;OQ=772.90;QD=13.56;SB=-158.90	GT:AD:DP:GL:GQ	0/1:30,27:56:-97.44,-16.87,-122.46:99
-chr1	4412859	.	G	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=17.52;MQ=58.30;MQ0=0;OQ=443.68;QD=5.55;SB=107.30	GT:AD:DP:GL:GQ	0/1:54,26:67:-67.84,-20.19,-156.44:99
-chr1	4413809	rs780599	T	C	203.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=933.92;QD=15.06;SB=-130.24	GT:AD:DP:GL:GQ	0/1:31,31:62:-115.35,-18.67,-127.44:99
-chr1	4413942	rs1235308	A	G	208.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=59.56;MQ0=0;OQ=574.66;QD=10.84;SB=-295.15	GT:AD:DP:GL:GQ	0/1:24,29:45:-74.32,-13.57,-86.44:99
-chr1	4413949	rs12135334	A	G	227.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.57;MQ0=0;OQ=600.78;QD=11.13;SB=-278.65	GT:AD:DP:GL:GQ	0/1:25,29:50:-78.44,-15.07,-99.43:99
-chr1	4414313	rs11584026	G	A	462.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.70;MQ0=0;OQ=1258.44;QD=16.56;SB=-579.09	GT:AD:DP:GL:GQ	0/1:37,39:74:-151.43,-22.31,-123.49:99
-chr1	4415137	rs1213919	T	C	340.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.64;MQ0=0;OQ=1036.94;QD=16.20;SB=-428.11	GT:AD:DP:GL:GQ	0/1:27,37:63:-125.96,-18.98,-110.60:99
-chr1	4415275	rs6426411	G	A	271.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.51;MQ=58.90;MQ0=0;OQ=891.44;QD=15.11;SB=-416.76	GT:AD:DP:GL:GQ	0/1:31,28:59:-110.20,-17.77,-112.97:99
-chr1	4415367	rs6663198	A	C	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=21.51;MQ=59.22;MQ0=0;OQ=1036.43;QD=12.49;SB=-473.70	GT:AD:DP:GL:GQ	0/1:44,39:81:-131.33,-24.40,-153.13:99
-chr1	4416433	rs12131294	C	T	93.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.89;MQ=59.15;MQ0=0;OQ=414.02;QD=9.20;SB=-113.50	GT:AD:DP:GL:GQ	0/1:24,20:37:-55.83,-11.15,-84.17:99
-chr1	4416884	.	G	A	3.05	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=5.94;MQ=57.87;MQ0=0;OQ=823.53;QD=14.97;SB=-276.27	GT:AD:DP:GL:GQ	0/1:30,25:53:-101.62,-15.98,-87.09:99
-chr1	4417194	rs7550318	A	T	249.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=2.46;MQ=57.79;MQ0=0;OQ=1140.48;QD=17.28;SB=-502.48	GT:AD:DP:GL:GQ	0/1:29,37:65:-136.91,-19.58,-108.54:99
-chr1	4417494	.	G	A	25.73	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=20;HaplotypeScore=6.20;MQ=50.61;MQ0=1;QD=0.42;SB=98.27	GT:AD:DP:GL:GQ	0/1:53,9:50:-20.92,-15.07,-146.64:58.56
-chr1	4417741	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=20;HaplotypeScore=20.09;MQ=49.19;MQ0=1;OQ=84.58;QD=2.17;SB=26.11	GT:AD:DP:GL:GQ	0/1:26,12:27:-19.88,-8.14,-73.60:99
-chr1	4417905	rs642409	A	G	618.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.41;MQ0=0;OQ=2544.54;QD=34.39;SB=-1201.82	GT:AD:DP:GL:GQ	1/1:0,74:71:-258.06,-21.38,-0.02:99
-chr1	4418004	rs10127576	A	G	16.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=5.95;MQ=57.57;MQ0=1;OQ=493.53;QD=8.97;SB=-221.25	GT:AD:DP:GL:GQ	0/1:34,21:50:-67.70,-15.07,-117.20:99
-chr1	4420145	rs6426412	G	T	345.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.50;MQ0=0;OQ=1296.90;QD=17.29;SB=-663.60	GT:AD:DP:GL:GQ	0/1:33,42:75:-155.57,-22.59,-114.39:99
-chr1	4420362	.	C	T	102.52	PASS	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.20;MQ=60.52;MQ0=0;OQ=920.19;QD=15.34;SB=-456.47	GT:AD:DP:GL:GQ	0/1:27,31:53:-111.28,-15.98,-79.42:99
-chr1	4421024	rs12137057	A	C	291.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=701.05;QD=10.62;SB=-364.06	GT:AD:DP:GL:GQ	0/1:39,27:63:-92.36,-18.97,-137.12:99
-chr1	4421180	rs61771168	T	G	222.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.81;MQ=59.49;MQ0=0;OQ=588.51;QD=13.08;SB=-310.47	GT:AD:DP:GL:GQ	0/1:23,22:43:-75.09,-12.95,-79.35:99
-chr1	4421771	.	C	T	52.82	PASS	AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=58.00;MQ0=0;OQ=457.94;QD=13.08;SB=-230.51	GT:AD:DP:GL:GQ	0/1:18,17:32:-58.72,-9.64,-61.49:99
-chr1	4422658	.	C	T	17.02	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=1;HaplotypeScore=3.11;MQ=59.25;MQ0=0;OQ=990.31;QD=15.97;SB=-404.43	GT:AD:DP:GL:GQ	0/1:32,30:60:-120.40,-18.09,-95.94:99
-chr1	4423184	.	G	A	28.31	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=59.25;MQ0=0;OQ=1264.58;QD=20.40;SB=-650.72	GT:AD:DP:GL:GQ	0/1:26,36:62:-148.42,-18.68,-94.18:99
-chr1	4423217	rs664520	C	T	648.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=1886.50;QD=38.50;SB=-821.33	GT:AD:DP:GL:GQ	1/1:0,49:49:-192.25,-14.76,-0.02:99
-chr1	4423270	rs17453664	G	A	225.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.40;MQ=58.29;MQ0=0;OQ=839.10;QD=16.14;SB=-245.23	GT:AD:DP:GL:GQ	0/1:25,27:50:-102.26,-15.06,-88.51:99
-chr1	4424136	.	C	G	13.14	PASS	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=4.07;MQ=59.20;MQ0=0;OQ=717.79;QD=15.27;SB=-220.02	GT:AD:DP:GL:GQ	0/1:26,21:46:-88.93,-13.87,-108.02:99
-chr1	4424195	rs16839046	G	A	266.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=59.35;MQ0=0;OQ=1078.45;QD=16.85;SB=-521.17	GT:AD:DP:GL:GQ	0/1:30,33:62:-129.81,-18.69,-96.72:99
-chr1	4424280	rs17419859	G	A	351.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=59.18;MQ0=0;OQ=665.56;QD=13.05;SB=-350.50	GT:AD:DP:GL:GQ	0/1:25,26:46:-83.71,-13.87,-77.13:99
-chr1	4424589	rs681175	T	C	281.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=1804.45;QD=35.38;SB=-864.37	GT:AD:DP:GL:GQ	1/1:0,51:50:-184.04,-15.06,-0.01:99
-chr1	4426611	rs16839061	C	T	6.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=8.78;MQ=59.11;MQ0=0;OQ=724.58;QD=13.42;SB=-330.47	GT:AD:DP:GL:GQ	0/1:31,23:51:-91.11,-15.37,-92.01:99
-chr1	4427201	rs350167	T	C	190.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=59.66;MQ0=0;OQ=925.11;QD=16.82;SB=-378.98	GT:AD:DP:GL:GQ	0/1:23,32:53:-111.76,-15.96,-93.83:99
-chr1	4427323	.	G	A	294.49	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=680.55;QD=13.09;SB=-356.53	GT:AD:DP:GL:GQ	0/1:28,24:44:-84.60,-13.26,-76.63:99
-chr1	4433698	.	G	A	123.19	PASS	AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.52;MQ0=0;OQ=1403.52;QD=17.99;SB=-721.04	GT:AD:DP:GL:GQ	0/1:36,42:75:-166.24,-22.60,-109.14:99
-chr1	4433807	.	T	G	23.74	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=3;HaplotypeScore=5.51;MQ=60.00;MQ0=0;QD=0.37;SB=80.27	GT:AD:DP:GL:GQ	0/1:45,20:51:-21.03,-15.37,-149.91:56.55
-chr1	4434327	rs645724	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=38.18;MQ=55.12;MQ0=0;OQ=2008.88;QD=24.50;SB=-765.25	GT:AD:DP:GL:GQ	0/1:13,69:74:-226.47,-22.30,-33.80:99
-chr1	4434328	rs55641638	T	A	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=5;HaplotypeScore=34.59;MQ=55.12;MQ0=0;OQ=2483.75;QD=30.29;SB=-1104.11	GT:AD:DP:GL:GQ	1/1:7,75:79:-274.28,-23.80,-22.35:14.43
-chr1	4434380	rs350168	C	T	706.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.94;MQ0=0;OQ=2402.65;QD=38.14;SB=-988.02	GT:AD:DP:GL:GQ	1/1:0,63:61:-243.87,-18.38,-0.02:99
-chr1	4434761	.	C	A	101.78	PASS	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=59.39;MQ0=0;OQ=1132.04;QD=16.65;SB=-530.30	GT:AD:DP:GL:GQ	0/1:30,38:67:-136.67,-20.18,-105.81:99
-chr1	4435588	rs350169	T	A	602.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=1092.18;QD=14.76;SB=-420.48	GT:AD:DP:GL:GQ	0/1:38,36:74:-134.79,-22.29,-147.43:99
-chr1	4439106	rs610189	T	C	76.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=98;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.49;MQ0=0;OQ=3044.46;QD=31.07;SB=-1448.66	GT:AD:DP:GL:GQ	1/1:0,98:95:-308.11,-28.64,-0.07:99
-chr1	4440903	rs13376654	C	A	79.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=3.21;MQ=58.73;MQ0=0;OQ=748.18;QD=13.60;SB=-293.00	GT:AD:DP:GL:GQ	0/1:29,26:54:-94.37,-16.27,-89.76:99
-chr1	4440904	rs638289	A	G	184.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.21;MQ=59.14;MQ0=0;OQ=1717.40;QD=31.80;SB=-743.85	GT:AD:DP:GL:GQ	1/1:0,54:53:-175.37,-15.98,-0.04:99
-chr1	4441250	rs11799990	A	C	16.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.98;MQ=58.47;MQ0=0;OQ=285.71;QD=5.19;SB=-147.75	GT:AD:DP:GL:GQ	0/1:37,17:50:-46.92,-15.06,-127.84:99
-chr1	4441285	rs6426418	T	C	92.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.50;MQ=58.52;MQ0=0;OQ=434.66;QD=7.63;SB=-199.21	GT:AD:DP:GL:GQ	0/1:38,19:55:-63.32,-16.57,-152.10:99
-chr1	4441304	rs16839089	G	A	505.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.35;MQ0=0;OQ=685.41;QD=10.71;SB=-336.42	GT:AD:DP:GL:GQ	0/1:40,24:63:-90.81,-18.98,-145.42:99
-chr1	4441520	.	C	T	159.13	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.36;MQ=59.58;MQ0=0;OQ=767.39;QD=13.95;SB=-405.80	GT:AD:DP:GL:GQ	0/1:29,25:52:-95.70,-15.68,-88.39:99
-chr1	4441584	rs28597953	G	C	102.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.54;MQ0=0;OQ=377.89;QD=7.56;SB=-189.56	GT:AD:DP:GL:GQ	0/1:35,14:50:-59.58,-18.50,-155.34:99
-chr1	4441595	rs12057544	C	T	296.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=442.52;QD=10.06;SB=-117.50	GT:AD:DP:GL:GQ	0/1:29,15:44:-60.79,-13.25,-105.58:99
-chr1	4441615	rs12094629	G	A	446.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=438.29;QD=12.17;SB=-145.60	GT:AD:DP:GL:GQ	0/1:21,15:35:-57.67,-10.56,-64.23:99
-chr1	4442760	rs705686	T	G	190.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=58.65;MQ0=0;OQ=1305.06;QD=29.00;SB=-525.86	GT:AD:DP:GL:GQ	1/1:0,45:42:-134.13,-12.66,-0.04:99
-chr1	4443102	rs16839093	T	A	368.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=60.00;MQ0=0;OQ=943.42;QD=16.85;SB=-414.85	GT:AD:DP:GL:GQ	0/1:25,31:55:-114.19,-16.57,-93.32:99
-chr1	4443523	rs6656245	A	G	229.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=4.49;MQ=59.68;MQ0=0;OQ=985.54;QD=13.50;SB=-516.93	GT:AD:DP:GL:GQ	0/1:35,37:70:-125.21,-23.37,-142.93:99
-chr1	4444038	rs350170	T	C	370.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=60.00;MQ0=0;OQ=854.91;QD=14.49;SB=-264.93	GT:AD:DP:GL:GQ	0/1:30,29:59:-106.55,-17.78,-120.47:99
-chr1	4444166	.	C	T	124.24	PASS	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.74;MQ0=0;OQ=1098.39;QD=15.05;SB=-487.09	GT:AD:DP:GL:GQ	0/1:39,34:70:-134.21,-21.09,-126.03:99
-chr1	4446069	rs16839101	C	T	439.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.34;MQ0=0;OQ=969.43;QD=15.39;SB=-381.11	GT:AD:DP:GL:GQ	0/1:31,32:61:-118.60,-18.38,-109.31:99
-chr1	4448313	rs705687	A	G	587.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.53;MQ0=0;OQ=1218.14;QD=32.06;SB=-513.41	GT:AD:DP:GL:GQ	1/1:0,38:37:-125.42,-11.15,-0.02:99
-chr1	4448490	rs10799234	G	A	167.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=924.80;QD=18.50;SB=-481.51	GT:AD:DP:GL:GQ	0/1:22,28:50:-110.83,-15.07,-72.35:99
-chr1	4449095	.	G	T	15.09	PASS	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=59.46;MQ0=0;OQ=820.94;QD=19.09;SB=-383.80	GT:AD:DP:GL:GQ	0/1:15,28:42:-98.03,-12.65,-50.79:99
-chr1	4449190	.	G	A	102.60	PASS	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.43;MQ0=0;OQ=1775.95;QD=21.93;SB=-864.43	GT:AD:DP:GL:GQ	0/1:30,51:79:-204.67,-23.80,-104.40:99
-chr1	4449240	rs705690	G	A	133.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.24;MQ0=0;OQ=3632.63;QD=39.92;SB=-1598.65	GT:AD:DP:GL:GQ	1/1:0,91:90:-362.26,-27.11,-0.03:99
-chr1	4449262	rs780606	A	G	76.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=2;HaplotypeScore=0.63;MQ=59.06;MQ0=0;OQ=718.78;QD=9.71;SB=-329.85	GT:AD:DP:GL:GQ	0/1:44,30:73:-97.16,-22.00,-175.35:99
-chr1	4449723	.	G	A	148.11	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.81;MQ=59.52;MQ0=0;OQ=713.60;QD=14.87;SB=-335.48	GT:AD:DP:GL:GQ	0/1:25,23:48:-89.11,-14.47,-81.14:99
-chr1	4449964	rs706145	G	A	636.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=2653.69;QD=37.38;SB=-1188.98	GT:AD:DP:GL:GQ	1/1:0,71:69:-268.98,-20.79,-0.03:99
-chr1	4452662	rs1878052	G	A	714.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2298.20;QD=38.95;SB=-1111.02	GT:AD:DP:GL:GQ	1/1:0,59:59:-233.42,-17.78,-0.02:99
-chr1	4454614	.	A	C	20.74	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=601.74;QD=13.68;SB=-220.89	GT:AD:DP:GL:GQ	0/1:20,24:43:-76.41,-12.95,-71.27:99
-chr1	4455561	rs10737412	T	A	735.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=2244.31;QD=37.41;SB=-1132.68	GT:AD:DP:GL:GQ	1/1:0,60:60:-228.03,-18.07,-0.02:99
-chr1	4455707	rs4654547	C	T	580.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=1;OQ=2435.91;QD=38.67;SB=-681.41	GT:AD:DP:GL:GQ	1/1:0,63:61:-247.19,-18.38,-0.02:99
-chr1	4456823	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=121.08;MQ=43.96;MQ0=0;OQ=445.21;QD=5.86;SB=-205.75	GT:AD:DP:GL:GQ	0/1:54,22:71:-69.19,-21.39,-207.74:99
-chr1	4456825	rs61765158	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=3;HaplotypeScore=133.78;MQ=43.18;MQ0=0;OQ=324.30;QD=4.44;SB=-88.42	GT:AD:DP:GL:GQ	0/1:59,14:70:-56.80,-21.09,-201.65:99
-chr1	4456850	rs780601	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=50.11;MQ=42.32;MQ0=0;OQ=775.14;QD=10.77;SB=-395.42	GT:AD:DP:GL:GQ	0/1:41,31:67:-100.98,-20.18,-144.33:99
-chr1	4457263	rs780603	T	C	535.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=1544.09;QD=29.13;SB=-491.17	GT:AD:DP:GL:GQ	1/1:0,53:48:-158.03,-14.47,-0.03:99
-chr1	4457873	rs9659744	G	A	216.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.18;MQ=58.81;MQ0=0;OQ=722.66;QD=13.14;SB=-250.79	GT:AD:DP:GL:GQ	0/1:29,25:52:-94.30,-18.75,-103.70:99
-chr1	4457887	rs12029583	T	C	182.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.02;MQ=58.88;MQ0=0;OQ=815.22;QD=14.06;SB=-229.41	GT:AD:DP:GL:GQ	0/1:25,33:54:-101.08,-16.28,-89.40:99
-chr1	4458652	rs10915548	G	A	313.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=58.63;MQ0=0;OQ=1202.04;QD=18.21;SB=-612.14	GT:AD:DP:GL:GQ	0/1:31,35:64:-142.78,-19.29,-94.64:99
-chr1	4458793	rs609506	T	C	135.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=58.91;MQ0=0;OQ=2002.23;QD=32.82;SB=-965.38	GT:AD:DP:GL:GQ	1/1:0,61:57:-203.83,-17.17,-0.03:99
-chr1	4458832	rs13374152	G	A	510.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.65;MQ0=0;OQ=1323.30;QD=19.75;SB=-559.77	GT:AD:DP:GL:GQ	0/1:28,39:65:-155.19,-19.58,-97.96:99
-chr1	4459077	rs10799235	G	C	517.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2392.46;QD=41.97;SB=-1062.67	GT:AD:DP:GL:GQ	1/1:0,57:55:-242.85,-16.57,-0.02:99
-chr1	4459761	rs4654438	T	C	731.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.40;MQ0=0;OQ=2338.83;QD=34.91;SB=-1062.10	GT:AD:DP:GL:GQ	1/1:0,67:66:-237.49,-19.88,-0.02:99
-chr1	4460253	.	G	A	71.25	PASS	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=54.34;MQ0=0;OQ=761.29;QD=16.20;SB=-383.16	GT:AD:DP:GL:GQ	0/1:23,24:45:-92.98,-13.56,-67.37:99
-chr1	4460265	rs9660574	G	A	698.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.97;MQ0=0;OQ=1971.68;QD=38.66;SB=-993.84	GT:AD:DP:GL:GQ	1/1:0,51:50:-200.77,-15.06,-0.01:99
-chr1	4460731	rs675509	A	G	75.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.19;MQ0=0;OQ=1733.09;QD=33.33;SB=-850.97	GT:AD:DP:GL:GQ	1/1:0,52:50:-176.92,-15.06,-0.02:99
-chr1	4460821	rs675641	C	T	619.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2267.76;QD=39.10;SB=-1112.00	GT:AD:DP:GL:GQ	1/1:0,58:57:-230.38,-17.17,-0.02:99
-chr1	4462336	rs4654548	G	A	293.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.55;MQ0=0;OQ=1820.62;QD=35.70;SB=-883.64	GT:AD:DP:GL:GQ	1/1:0,51:47:-185.66,-14.16,-0.02:99
-chr1	4462612	rs661886	C	G	122.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1803.84;QD=41.95;SB=-867.51	GT:AD:DP:GL:GQ	1/1:0,43:43:-183.98,-12.96,-0.01:99
-chr1	4462757	rs597453	T	C	1.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=3;HaplotypeScore=2.36;MQ=60.00;MQ0=0;OQ=1873.91;QD=29.28;SB=-570.21	GT:AD:DP:GL:GQ	1/1:0,64:56:-191.00,-16.87,-0.03:99
-chr1	4463867	rs10799237	G	A	181.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=59.13;MQ0=0;OQ=2001.42;QD=37.76;SB=-711.98	GT:AD:DP:GL:GQ	1/1:0,53:51:-203.74,-15.36,-0.01:99
-chr1	4464187	.	T	C	30.12	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.10;MQ=59.33;MQ0=0;OQ=552.68;QD=8.91;SB=-289.28	GT:AD:DP:GL:GQ	0/1:39,23:60:-76.63,-18.08,-155.34:99
-chr1	4465057	rs4654549	G	A	100.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=3.11;MQ=59.46;MQ0=0;OQ=1572.23;QD=20.42;SB=-717.81	GT:AD:DP:GL:GQ	0/1:31,46:75:-183.10,-22.59,-108.27:99
-chr1	4465240	rs4654439	A	G	186.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=59.65;MQ0=0;OQ=1824.70;QD=28.07;SB=-920.11	GT:AD:DP:GL:GQ	1/1:1,64:61:-189.47,-18.40,-3.41:99
-chr1	4465350	rs4654550	C	T	464.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.14;MQ0=0;OQ=1183.55;QD=15.57;SB=-491.13	GT:AD:DP:GL:GQ	0/1:39,37:73:-143.65,-22.01,-117.80:99
-chr1	4465703	rs16839157	C	G	292.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=2.96;MQ=59.46;MQ0=0;OQ=1332.22;QD=15.49;SB=-637.02	GT:AD:DP:GL:GQ	0/1:48,38:85:-162.12,-25.61,-205.23:99
-chr1	4465766	rs10753381	C	T	668.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=2452.18;QD=39.55;SB=-960.97	GT:AD:DP:GL:GQ	1/1:0,62:62:-248.82,-18.68,-0.02:99
-chr1	4465913	rs10753382	A	C	344.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.23;MQ=42.45;MQ0=0;OQ=1152.30;QD=15.16;SB=-375.76	GT:AD:DP:GL:GQ	0/1:35,41:75:-141.10,-22.59,-129.43:99
-chr1	4465925	rs4654440	A	G	314.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=45.24;MQ0=0;OQ=2545.78;QD=35.36;SB=-1008.34	GT:AD:DP:GL:GQ	1/1:0,72:72:-258.19,-21.69,-0.03:99
-chr1	4466035	rs4654551	T	C	137.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=59.71;MQ0=0;OQ=2345.07;QD=29.31;SB=-919.32	GT:AD:DP:GL:GQ	1/1:0,80:75:-238.17,-22.62,-0.07:99
-chr1	4466375	rs4654441	A	G	153.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=1.97;MQ=59.14;MQ0=0;OQ=1252.72;QD=16.48;SB=-599.98	GT:AD:DP:GL:GQ	0/1:32,44:75:-151.15,-22.60,-128.71:99
-chr1	4466539	.	G	C	13.68	PASS	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.10;MQ=60.00;MQ0=0;OQ=1133.87;QD=19.22;SB=-442.73	GT:AD:DP:GL:GQ	0/1:26,33:58:-134.16,-17.49,-113.78:99
-chr1	4466591	rs7537577	T	C	558.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1692.69;QD=36.01;SB=-710.63	GT:AD:DP:GL:GQ	1/1:0,47:47:-172.87,-14.16,-0.01:99
-chr1	4466655	rs1870509	A	G	172.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=58.79;MQ0=0;OQ=1784.46;QD=27.04;SB=-725.30	GT:AD:DP:GL:GQ	1/1:0,66:58:-182.10,-17.50,-0.07:99
-chr1	4467025	rs1018306	G	A	522.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=2397.83;QD=37.47;SB=-678.32	GT:AD:DP:GL:GQ	1/1:0,64:61:-243.39,-18.38,-0.02:99
-chr1	4467405	.	G	A	173.51	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=60.00;MQ0=0;OQ=1037.40;QD=16.73;SB=-505.13	GT:AD:DP:GL:GQ	0/1:31,31:60:-125.11,-18.08,-96.58:99
-chr1	4467882	rs10799238	G	A	201.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=57.23;MQ0=0;OQ=2039.74;QD=37.09;SB=-730.98	GT:AD:DP:GL:GQ	1/1:0,54:52:-207.58,-15.67,-0.02:99
-chr1	4468054	rs10799239	G	T	526.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.10;MQ0=0;OQ=2381.50;QD=35.54;SB=-1199.06	GT:AD:DP:GL:GQ	1/1:0,67:66:-241.76,-19.88,-0.02:99
-chr1	4468702	rs780570	T	C	301.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=55.66;MQ0=0;OQ=692.07;QD=31.46;SB=-209.70	GT:AD:DP:GL:GQ	1/1:0,22:21:-72.80,-6.33,-0.01:63.17
-chr1	4468728	.	G	A	3.90	PASS	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=1.85;MQ=52.20;MQ0=0;OQ=192.92;QD=6.65;SB=-94.59	GT:AD:DP:GL:GQ	0/1:18,10:25:-30.11,-7.53,-60.00:99
-chr1	4468760	rs60725706	C	T	2.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=2.68;MQ=47.80;MQ0=0;OQ=892.66;QD=25.50;SB=-420.32	GT:AD:DP:GL:GQ	1/1:1,34:26:-92.87,-7.84,-0.02:78.22
-chr1	4468793	.	C	T	155.10	SnpCluster	AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=2;HaplotypeScore=28.66;MQ=43.47;MQ0=0;QD=3.45;SB=-75.82	GT:AD:DP:GL:GQ	0/1:34,11:31:-28.13,-9.34,-89.19:99
-chr1	4468798	rs57105176	C	T	210.28	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=33.72;MQ=43.23;MQ0=0;QD=4.38;SB=-105.47	GT:AD:DP:GL:GQ	0/1:33,15:33:-34.25,-9.94,-88.69:99
-chr1	4468800	.	C	T	23.55	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=2;HaplotypeScore=34.30;MQ=43.63;MQ0=0;QD=0.48;SB=32.09	GT:AD:DP:GL:GQ	0/1:44,5:35:-16.18,-10.54,-113.19:56.36
-chr1	4468801	.	T	C	10.10	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=1;HaplotypeScore=35.27;MQ=44.04;MQ0=0;QD=0.21;SB=32.13	GT:AD:DP:GL:GQ	0/1:43,5:35:-14.79,-10.54,-128.12:42.49
-chr1	4469243	rs12031045	G	A	324.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=623.89;QD=15.22;SB=-230.72	GT:AD:DP:GL:GQ	0/1:20,21:41:-78.04,-12.36,-70.49:99
-chr1	4469296	rs780569	T	A	228.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.28;MQ0=0;OQ=1316.01;QD=34.63;SB=-627.73	GT:AD:DP:GL:GQ	1/1:0,38:37:-135.20,-11.15,-0.01:99
-chr1	4469318	rs12035160	A	T	129.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=57.81;MQ0=0;OQ=613.76;QD=19.18;SB=-234.94	GT:AD:DP:GL:GQ	0/1:11,21:31:-74.00,-9.34,-42.52:99
-chr1	4469407	rs10799241	A	G	224.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.03;MQ=57.87;MQ0=0;OQ=407.85;QD=8.87;SB=-207.21	GT:AD:DP:GL:GQ	0/1:29,17:45:-57.62,-13.55,-119.36:99
-chr1	4469520	rs16839168	G	A	432.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=846.65;QD=16.28;SB=-413.43	GT:AD:DP:GL:GQ	0/1:26,26:51:-103.31,-15.37,-89.05:99
-chr1	4469555	rs16839171	G	T	425.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.63;MQ0=0;OQ=647.76;QD=12.70;SB=-289.64	GT:AD:DP:GL:GQ	0/1:27,24:51:-83.43,-15.37,-93.72:99
-chr1	4469694	rs780568	A	G	87.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=1.60;MQ=59.63;MQ0=0;OQ=1699.95;QD=33.33;SB=-755.94	GT:AD:DP:GL:GQ	1/1:0,51:49:-173.60,-14.76,-0.02:99
-chr1	4470136	rs16839175	T	C	275.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.63;MQ0=0;OQ=746.25;QD=11.85;SB=-286.15	GT:AD:DP:GL:GQ	0/1:31,32:61:-96.29,-18.39,-125.52:99
-chr1	4470246	rs1612698	A	G	417.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.34;MQ=60.15;MQ0=0;OQ=917.82;QD=12.40;SB=-358.93	GT:AD:DP:GL:GQ	0/1:42,32:74:-117.36,-22.29,-169.05:99
-chr1	4470842	rs4654552	C	T	182.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.85;MQ=59.68;MQ0=0;OQ=1084.53;QD=15.28;SB=-349.06	GT:AD:DP:GL:GQ	0/1:37,34:71:-133.13,-21.39,-131.43:99
-chr1	4471600	rs1710415	A	G	89.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=59.45;MQ0=0;OQ=1235.30;QD=29.41;SB=-309.47	GT:AD:DP:GL:GQ	1/1:0,42:39:-127.15,-11.76,-0.03:99
-chr1	4471806	rs1762825	T	A	126.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.16;MQ0=0;OQ=1997.53;QD=36.32;SB=-643.98	GT:AD:DP:GL:GQ	1/1:0,55:54:-203.35,-16.27,-0.02:99
-chr1	4471883	rs10915549	G	A	333.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.45;MQ0=0;OQ=443.28;QD=10.55;SB=-159.64	GT:AD:DP:GL:GQ	0/1:26,16:40:-59.67,-12.06,-79.56:99
-chr1	4472000	rs4654442	G	A	195.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.37;MQ0=0;OQ=2467.21;QD=37.38;SB=-970.01	GT:AD:DP:GL:GQ	1/1:0,66:62:-250.32,-18.68,-0.02:99
-chr1	4472928	rs4568797	G	T	198.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.61;MQ=59.01;MQ0=0;OQ=1306.78;QD=17.19;SB=-394.04	GT:AD:DP:GL:GQ	0/1:30,46:73:-155.95,-21.99,-98.20:99
-chr1	4472959	rs4480324	A	G	92.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.63;MQ0=0;OQ=1914.93;QD=30.40;SB=-560.92	GT:AD:DP:GL:GQ	1/1:0,63:60:-195.13,-18.10,-0.06:99
-chr1	4472994	rs4323680	T	C	685.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1931.20;QD=32.73;SB=-824.33	GT:AD:DP:GL:GQ	1/1:0,59:55:-196.72,-16.57,-0.02:99
-chr1	4473017	rs4437847	T	C	44.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.88;MQ0=0;OQ=1770.27;QD=28.55;SB=-781.74	GT:AD:DP:GL:GQ	1/1:0,62:55:-180.66,-16.58,-0.05:99
-chr1	4473102	rs4442344	T	C	686.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=1772.96;QD=35.46;SB=-792.00	GT:AD:DP:GL:GQ	1/1:0,50:50:-180.90,-15.06,-0.02:99
-chr1	4473320	rs1710418	A	G	44.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1771.10;QD=32.20;SB=-713.21	GT:AD:DP:GL:GQ	1/1:0,54:51:-180.72,-15.36,-0.02:99
-chr1	4473327	rs1762828	G	A	169.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.60;MQ0=0;OQ=2054.72;QD=36.05;SB=-823.34	GT:AD:DP:GL:GQ	1/1:0,57:53:-209.08,-15.97,-0.02:99
-chr1	4473546	rs1710419	C	A	168.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.06;MQ=57.84;MQ0=0;OQ=1495.45;QD=32.51;SB=-770.46	GT:AD:DP:GL:GQ	1/1:0,46:43:-153.15,-12.95,-0.02:99
-chr1	4473664	rs1710420	C	T	149.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=59.20;MQ0=0;OQ=902.97;QD=15.57;SB=-230.52	GT:AD:DP:GL:GQ	0/1:30,28:57:-110.76,-17.18,-94.35:99
-chr1	4473849	rs1710421	C	T	247.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.67;MQ0=0;OQ=2607.62;QD=37.79;SB=-1041.32	GT:AD:DP:GL:GQ	1/1:0,69:66:-264.37,-19.88,-0.02:99
-chr1	4473977	rs1710422	C	T	77.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=58.90;MQ0=0;OQ=2084.84;QD=37.91;SB=-795.07	GT:AD:DP:GL:GQ	1/1:0,55:54:-212.09,-16.27,-0.02:99
-chr1	4473997	rs1710423	T	C	135.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=59.07;MQ0=0;OQ=1147.64;QD=25.50;SB=-601.59	GT:AD:DP:GL:GQ	1/1:0,45:37:-118.39,-11.16,-0.04:99
-chr1	4474861	rs1710424	A	G	675.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.21;MQ0=0;OQ=2263.90;QD=31.89;SB=-1103.74	GT:AD:DP:GL:GQ	1/1:0,71:67:-230.02,-20.19,-0.04:99
-chr1	4475148	rs12036337	G	A	158.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=3.64;MQ=56.87;MQ0=1;OQ=1002.66;QD=14.75;SB=-286.76	GT:AD:DP:GL:GQ	0/1:34,34:59:-121.33,-17.78,-94.02:99
-chr1	4475283	.	G	A	82.68	PASS	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=59.35;MQ0=0;OQ=845.94;QD=13.22;SB=-362.87	GT:AD:DP:GL:GQ	0/1:34,30:60:-105.97,-18.09,-111.99:99
-chr1	4475382	rs10915550	C	T	345.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=58.10;MQ0=0;OQ=927.67;QD=14.96;SB=-380.90	GT:AD:DP:GL:GQ	0/1:33,29:62:-114.73,-18.68,-118.48:99
-chr1	4476131	rs10737413	C	T	15.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=59.60;MQ0=0;OQ=1742.86;QD=37.08;SB=-655.67	GT:AD:DP:GL:GQ	1/1:0,47:45:-177.88,-13.56,-0.01:99
-chr1	4476657	rs1710430	C	G	535.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=2311.95;QD=41.28;SB=-1026.21	GT:AD:DP:GL:GQ	1/1:0,56:54:-234.80,-16.27,-0.02:99
-chr1	4476980	rs4654443	C	T	562.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1325.65;QD=15.60;SB=-630.22	GT:AD:DP:GL:GQ	0/1:45,40:85:-161.45,-25.60,-165.34:99
-chr1	4477487	rs12033789	G	T	214.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.85;MQ=60.00;MQ0=0;OQ=905.30;QD=15.34;SB=-363.43	GT:AD:DP:GL:GQ	0/1:29,30:59:-111.58,-17.77,-100.35:99
-chr1	4477488	rs12036603	C	T	258.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=60.00;MQ0=0;OQ=969.57;QD=16.16;SB=-419.81	GT:AD:DP:GL:GQ	0/1:30,30:59:-118.02,-17.78,-101.27:99
-chr1	4478406	rs596607	G	A	55.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=59.40;MQ0=0;OQ=1761.44;QD=22.88;SB=-768.34	GT:AD:DP:GL:GQ	0/1:27,50:75:-202.03,-22.60,-83.51:99
-chr1	4478558	rs12039806	T	A	70.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=6.67;MQ=59.12;MQ0=0;OQ=1156.91;QD=14.64;SB=-441.48	GT:AD:DP:GL:GQ	0/1:42,37:77:-142.17,-23.19,-150.58:99
-chr1	4478614	rs12039814	T	C	10.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=7.09;MQ=59.66;MQ0=0;OQ=671.25;QD=10.02;SB=-294.21	GT:AD:DP:GL:GQ	0/1:37,30:64:-89.71,-19.30,-136.10:99
-chr1	4478650	rs12038994	A	T	269.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.65;MQ0=0;OQ=1147.45;QD=17.39;SB=-509.94	GT:AD:DP:GL:GQ	0/1:28,38:64:-137.31,-19.28,-105.10:99
-chr1	4478709	.	A	C	2.11	PASS	AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=7.65;MQ=58.73;MQ0=0;OQ=1101.58;QD=15.09;SB=-425.69	GT:AD:DP:GL:GQ	0/1:30,42:69:-134.23,-20.79,-106.44:99
-chr1	4478753	rs16839198	G	T	52.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=7.25;MQ=58.23;MQ0=0;OQ=906.23;QD=13.73;SB=-344.31	GT:AD:DP:GL:GQ	0/1:32,33:64:-113.20,-19.29,-98.09:99
-chr1	4478891	.	A	G	89.93	PASS	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=59.39;MQ0=0;OQ=917.93;QD=13.50;SB=-396.16	GT:AD:DP:GL:GQ	0/1:36,32:68:-115.57,-20.49,-141.62:99
-chr1	4478991	rs12039070	A	G	301.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=3.59;MQ=59.71;MQ0=0;OQ=1280.19;QD=16.00;SB=-441.58	GT:AD:DP:GL:GQ	0/1:37,43:80:-155.40,-24.10,-149.81:99
-chr1	4479035	rs12034930	G	A	326.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=59.68;MQ0=0;OQ=1133.14;QD=15.74;SB=-491.00	GT:AD:DP:GL:GQ	0/1:34,37:69:-137.39,-20.79,-119.61:99
-chr1	4479073	rs12039100	A	G	27.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=3.20;MQ=58.95;MQ0=0;OQ=915.49;QD=13.87;SB=-279.55	GT:AD:DP:GL:GQ	0/1:35,31:66:-114.72,-19.89,-140.84:99
-chr1	4479099	rs12039101	A	G	318.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=59.02;MQ0=0;OQ=1020.75;QD=14.38;SB=-348.94	GT:AD:DP:GL:GQ	0/1:36,35:70:-126.45,-21.09,-134.68:99
-chr1	4479118	rs1229148	A	G	277.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.65;MQ=59.11;MQ0=0;OQ=784.46;QD=10.75;SB=-374.59	GT:AD:DP:GL:GQ	0/1:37,36:67:-101.94,-20.21,-133.99:99
-chr1	4479593	rs12035830	G	A	298.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=59.59;MQ0=0;OQ=906.38;QD=16.19;SB=-375.12	GT:AD:DP:GL:GQ	0/1:28,28:56:-110.79,-16.87,-99.66:99
-chr1	4479841	rs13375249	G	C	20.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=1.63;MQ=59.73;MQ0=0;OQ=1230.24;QD=17.57;SB=-290.56	GT:AD:DP:GL:GQ	0/1:33,37:66:-146.20,-19.90,-135.57:99
-chr1	4479995	rs13375764	T	C	66.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=4.40;MQ=59.54;MQ0=0;OQ=574.33;QD=11.49;SB=-245.91	GT:AD:DP:GL:GQ	0/1:28,22:47:-74.88,-14.16,-104.49:99
-chr1	4480068	rs56226943	T	C	40.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=4.82;MQ=59.62;MQ0=0;OQ=881.12;QD=14.44;SB=-433.94	GT:AD:DP:GL:GQ	0/1:29,32:60:-109.48,-18.08,-115.28:99
-chr1	4480417	.	C	T	49.35	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=55.69;MQ0=0;OQ=1159.90;QD=16.81;SB=-282.22	GT:AD:DP:GL:GQ	0/1:33,36:66:-139.16,-19.89,-99.45:99
-chr1	4480560	rs61765366	A	G	285.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=56.94;MQ0=0;OQ=701.52;QD=11.89;SB=-268.60	GT:AD:DP:GL:GQ	0/1:29,30:57:-90.62,-17.18,-111.39:99
-chr1	4480691	rs61765367	A	G	0.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=4.75;MQ=57.81;MQ0=0;OQ=122.26;QD=1.63;SB=-4.55	GT:AD:DP:GL:GQ	0/1:63,11:59:-33.30,-17.79,-184.25:99
-chr1	4480787	rs61765379	A	G	0.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=7.68;MQ=56.41;MQ0=0;OQ=64.97;QD=0.82;SB=-50.25	GT:AD:DP:GL:GQ	0/1:64,12:67:-29.98,-20.20,-222.76:97.81
-chr1	4480849	rs549627	C	T	251.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=56.04;MQ0=0;OQ=1162.07;QD=16.37;SB=-467.11	GT:AD:DP:GL:GQ	0/1:33,37:67:-139.69,-20.20,-99.87:99
-chr1	4480920	rs548786	G	A	173	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=56.79;MQ0=1;OQ=670.11;QD=12.41;SB=-198.20	GT:AD:DP:GL:GQ	0/1:30,24:48:-84.77,-14.47,-84.01:99
-chr1	4481090	rs12039682	C	T	474.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.78;MQ0=0;OQ=980.72;QD=14.21;SB=-480.03	GT:AD:DP:GL:GQ	0/1:39,30:68:-121.84,-20.48,-138.54:99
-chr1	4481198	rs12039710	C	A	19.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=3;HaplotypeScore=2.99;MQ=59.79;MQ0=0;OQ=1468.40;QD=16.69;SB=-755.87	GT:AD:DP:GL:GQ	0/1:41,47:88:-176.63,-26.50,-144.72:99
-chr1	4481445	rs608203	T	C	400.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=60.00;MQ0=0;OQ=763.64;QD=11.93;SB=-242.90	GT:AD:DP:GL:GQ	0/1:33,31:64:-98.94,-19.29,-134.86:99
-chr1	4481949	rs518456	T	G	602.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1221.17;QD=15.26;SB=-525.73	GT:AD:DP:GL:GQ	0/1:37,43:77:-148.59,-23.19,-127.99:99
-chr1	4481956	rs57010025	C	T	238.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.40;MQ0=0;OQ=1419.96;QD=18.44;SB=-598.08	GT:AD:DP:GL:GQ	0/1:35,42:76:-168.18,-22.90,-116.42:99
-chr1	4482059	rs10489135	T	C	436.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.51;MQ0=0;OQ=1051.73;QD=13.84;SB=-549.55	GT:AD:DP:GL:GQ	0/1:39,37:73:-130.44,-21.99,-146.62:99
-chr1	4482139	rs57559146	A	C	431.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=970.54;QD=17.33;SB=-397.86	GT:AD:DP:GL:GQ	0/1:23,33:54:-116.60,-16.26,-81.57:99
-chr1	4482422	rs60071491	T	C	92.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=2;HaplotypeScore=0.92;MQ=56.24;MQ0=0;OQ=1374.62;QD=16.76;SB=-668.88	GT:AD:DP:GL:GQ	0/1:37,45:82:-165.44,-24.69,-153.42:99
-chr1	4482693	rs4112336	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=102.81;MQ=56.77;MQ0=0;OQ=769.43;QD=9.27;SB=-197.80	GT:AD:DP:GL:GQ	0/1:55,28:82:-104.92,-24.70,-193.00:99
-chr1	4482708	.	C	A	39.18	Indel;LowQual	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=48.79;MQ=55.68;MQ0=0;QD=0.43;SB=-10.83	GT:AD:DP:GL:GQ	0/1:82,10:90:-34.30,-27.10,-291.82:72.01
-chr1	4482756	rs1229150	T	G	280.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=57.57;MQ0=0;OQ=1600.43;QD=18.83;SB=-735.72	GT:AD:DP:GL:GQ	0/1:32,53:82:-188.02,-24.70,-112.53:99
-chr1	4482784	rs1229151	A	G	1304.96	Indel	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=53.27;MQ0=0;QD=17.88;SB=-660.04	GT:AD:DP:GL:GQ	0/1:30,43:72:-155.47,-21.69,-120.71:99
-chr1	4482854	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=78.29;MQ=48.56;MQ0=0;OQ=195.41;QD=2.87;SB=-84.58	GT:AD:DP:GL:GQ	0/1:55,13:66:-42.70,-19.88,-199.63:99
-chr1	4482959	rs2097536	C	T	73.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.49;MQ0=0;OQ=999.17;QD=22.20;SB=-274.28	GT:AD:DP:GL:GQ	0/1:16,29:44:-116.46,-13.25,-55.39:99
-chr1	4486372	rs12040164	C	T	326.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=59.42;MQ0=0;OQ=1051.54;QD=14.60;SB=-388.33	GT:AD:DP:GL:GQ	0/1:40,32:72:-130.14,-21.70,-132.54:99
-chr1	4487829	rs241237	C	T	194.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.46;MQ0=0;OQ=801.99;QD=18.65;SB=-287.22	GT:AD:DP:GL:GQ	0/1:18,25:42:-96.14,-12.66,-58.53:99
-chr1	4488590	.	G	A	17.21	PASS	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1047.83;QD=22.78;SB=-295.25	GT:AD:DP:GL:GQ	0/1:15,31:44:-121.33,-13.26,-41.74:99
-chr1	4489266	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=19.48;MQ=53.94;MQ0=1;OQ=546.80;QD=8.68;SB=-157.24	GT:AD:DP:GL:GQ	0/1:31,26:42:-73.40,-15.44,-84.22:99
-chr1	4489270	rs241234	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=25.61;MQ=53.85;MQ0=1;OQ=785.85;QD=12.28;SB=-389.60	GT:AD:DP:GL:GQ	0/1:33,31:57:-99.04,-17.17,-115.38:99
-chr1	4490410	rs241233	T	C	169.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=1.70;MQ=59.74;MQ0=0;OQ=1074.01;QD=14.92;SB=-553.96	GT:AD:DP:GL:GQ	0/1:36,36:72:-132.37,-21.68,-149.45:99
-chr1	4490829	rs241232	G	A	84.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=59.60;MQ0=0;OQ=913.96;QD=19.45;SB=-389.16	GT:AD:DP:GL:GQ	0/1:20,27:47:-108.84,-14.16,-68.00:99
-chr1	4492019	.	C	T	107.27	PASS	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.07;MQ0=0;OQ=862.99;QD=13.28;SB=-457.42	GT:AD:DP:GL:GQ	0/1:38,27:64:-108.86,-19.28,-134.13:99
-chr1	4492104	rs241229	G	A	148.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=59.63;MQ0=0;OQ=584.46;QD=9.28;SB=-212.39	GT:AD:DP:GL:GQ	0/1:43,20:63:-80.71,-18.98,-155.69:99
-chr1	4494463	rs537398	T	C	597.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=930.45;QD=15.51;SB=-426.29	GT:AD:DP:GL:GQ	0/1:29,31:60:-114.40,-18.07,-118.90:99
-chr1	4494858	rs34231005	T	G	11.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=4;HaplotypeScore=0.14;MQ=59.76;MQ0=0;OQ=881.39;QD=11.30;SB=-322.46	GT:AD:DP:GL:GQ	0/1:45,33:76:-114.31,-22.89,-158.76:99
-chr1	4495171	rs509960	T	C	253.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=2.40;MQ=60.00;MQ0=0;OQ=1172.46;QD=18.04;SB=-611.00	GT:AD:DP:GL:GQ	0/1:27,38:65:-140.10,-19.58,-110.54:99
-chr1	4495869	.	C	T	861.60	Indel	AC=1;AF=0.50;AN=2;DP=74;Dels=0.04;HRun=1;HaplotypeScore=22.99;MQ=51.44;MQ0=0;QD=11.64;SB=-342.41	GT:AD:DP:GL:GQ	0/1:44,27:74:-110.83,-21.38,-161.62:99
-chr1	4495871	.	C	A	736.52	Indel	AC=1;AF=0.50;AN=2;DP=74;Dels=0.04;HRun=0;HaplotypeScore=22.99;MQ=51.44;MQ0=0;QD=9.95;SB=-304.20	GT:AD:DP:GL:GQ	0/1:44,27:74:-98.32,-21.38,-161.31:99
-chr1	4496138	rs10915553	T	C	458.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.54;MQ0=0;OQ=880.60;QD=11.90;SB=-349.17	GT:AD:DP:GL:GQ	0/1:42,32:72:-113.03,-21.69,-158.51:99
-chr1	4496148	rs10915554	G	A	271.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=55.61;MQ0=0;OQ=1132.53;QD=15.10;SB=-504.97	GT:AD:DP:GL:GQ	0/1:40,35:73:-138.53,-22.00,-129.42:99
-chr1	4496394	rs12084169	C	T	196.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=59.54;MQ0=0;OQ=1321.84;QD=16.12;SB=-685.73	GT:AD:DP:GL:GQ	0/1:41,41:80:-159.57,-24.10,-141.56:99
-chr1	4496424	rs12086217	A	G	463.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.43;MQ0=0;OQ=859.99;QD=13.23;SB=-378.26	GT:AD:DP:GL:GQ	0/1:34,31:65:-108.86,-19.58,-137.17:99
-chr1	4496942	rs623217	G	C	175.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=59.66;MQ0=0;OQ=1355.72;QD=19.94;SB=-471.80	GT:AD:DP:GL:GQ	0/1:31,37:66:-158.75,-19.89,-127.17:99
-chr1	4496949	rs472113	G	A	230.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.66;MQ0=0;OQ=1272.49;QD=18.99;SB=-462.43	GT:AD:DP:GL:GQ	0/1:30,37:67:-150.71,-20.18,-109.30:99
-chr1	4497460	rs556890	A	G	2.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=9.81;MQ=58.48;MQ0=0;OQ=661.76;QD=14.39;SB=-333.32	GT:AD:DP:GL:GQ	0/1:21,24:43:-82.42,-12.96,-78.26:99
-chr1	4497578	.	G	A	145.29	PASS	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=55.81;MQ0=2;OQ=939.73;QD=13.42;SB=-372.83	GT:AD:DP:GL:GQ	0/1:38,32:59:-115.04,-17.78,-100.90:99
-chr1	4497715	rs609304	T	C	122.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=59.55;MQ0=0;OQ=597.13;QD=11.71;SB=-145.28	GT:AD:DP:GL:GQ	0/1:26,25:50:-78.07,-15.08,-99.80:99
-chr1	4497726	rs554335	A	T	316.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=640.98;QD=12.57;SB=-272.29	GT:AD:DP:GL:GQ	0/1:29,22:51:-82.74,-15.36,-107.67:99
-chr1	4497802	rs16838465	A	G	196.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=59.68;MQ0=0;OQ=953.26;QD=13.06;SB=-260.95	GT:AD:DP:GL:GQ	0/1:33,40:71:-120.01,-21.40,-135.23:99
-chr1	4497821	rs553435	A	G	265.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=3.67;MQ=59.70;MQ0=0;OQ=1049.73;QD=13.63;SB=-281.63	GT:AD:DP:GL:GQ	0/1:34,43:75:-130.87,-22.61,-136.05:99
-chr1	4497861	rs608492	G	C	466.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.05;MQ0=0;OQ=1478.41;QD=20.82;SB=-714.38	GT:AD:DP:GL:GQ	0/1:30,41:69:-171.91,-20.79,-131.74:99
-chr1	4497881	rs12726510	T	C	431.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=56.08;MQ0=0;OQ=981.66;QD=11.69;SB=-387.89	GT:AD:DP:GL:GQ	0/1:41,43:78:-124.95,-23.50,-161.69:99
-chr1	4497887	rs12752601	C	A	191.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=1.76;MQ=56.08;MQ0=0;OQ=1107.25;QD=13.18;SB=-552.73	GT:AD:DP:GL:GQ	0/1:44,40:81:-138.40,-24.39,-157.12:99
-chr1	4497950	rs12737521	G	A	266.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.10;MQ0=0;OQ=874.33;QD=12.67;SB=-378.16	GT:AD:DP:GL:GQ	0/1:41,28:69:-111.51,-20.80,-136.23:99
-chr1	4498077	rs551359	A	G	240.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=2.63;MQ=59.32;MQ0=0;OQ=1496.06;QD=16.81;SB=-547.59	GT:AD:DP:GL:GQ	0/1:39,50:88:-179.39,-26.50,-159.21:99
-chr1	4498168	rs495682	T	C	312.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.73;MQ0=0;OQ=1219.53;QD=14.52;SB=-615.78	GT:AD:DP:GL:GQ	0/1:41,43:83:-150.24,-25.00,-166.52:99
-chr1	4498170	rs596848	G	A	305.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.72;MQ0=0;OQ=1391.50;QD=16.77;SB=-693.72	GT:AD:DP:GL:GQ	0/1:40,43:81:-166.83,-24.40,-145.63:99
-chr1	4498284	rs596360	G	A	603.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=984.96;QD=14.92;SB=-509.05	GT:AD:DP:GL:GQ	0/1:36,30:66:-121.68,-19.90,-113.72:99
-chr1	4498314	rs494638	T	C	459.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.34;MQ0=0;OQ=1145.34;QD=15.69;SB=-585.28	GT:AD:DP:GL:GQ	0/1:33,40:71:-139.20,-21.39,-128.86:99
-chr1	4498825	rs489371	A	G	35.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=1;HaplotypeScore=4.84;MQ=56.29;MQ0=0;OQ=1173.41;QD=12.62;SB=-564.58	GT:AD:DP:GL:GQ	0/1:51,42:90:-147.73,-27.11,-207.42:99
-chr1	4498854	rs489316	A	G	383.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=53.44;MQ0=0;OQ=1022.72;QD=11.24;SB=-456.67	GT:AD:DP:GL:GQ	0/1:50,41:90:-132.68,-27.12,-202.80:99
-chr1	4499103	rs592726	C	T	522.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.01;MQ0=0;OQ=1251.74;QD=14.06;SB=-614.59	GT:AD:DP:GL:GQ	0/1:50,39:87:-154.68,-26.22,-160.76:99
-chr1	4499256	rs6673713	A	T	601.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.46;MQ0=0;OQ=969.14;QD=15.38;SB=-478.55	GT:AD:DP:GL:GQ	0/1:32,31:63:-119.17,-18.97,-123.21:99
-chr1	4499545	rs6677142	T	C	474.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=56.97;MQ0=0;OQ=1056.33;QD=15.77;SB=-489.28	GT:AD:DP:GL:GQ	0/1:31,36:67:-129.10,-20.18,-124.32:99
-chr1	4499557	rs10158638	A	G	600.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.01;MQ0=0;OQ=954.47;QD=14.46;SB=-498.28	GT:AD:DP:GL:GQ	0/1:33,33:66:-118.61,-19.88,-133.94:99
-chr1	4499695	rs28694108	C	T	122.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=2.23;MQ=60.16;MQ0=0;OQ=1387.28;QD=20.11;SB=-460.49	GT:AD:DP:GL:GQ	0/1:27,42:67:-162.21,-20.20,-83.84:99
-chr1	4499852	rs569392	T	C	181.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=1.97;MQ=59.40;MQ0=0;OQ=1301.88;QD=15.50;SB=-652.84	GT:AD:DP:GL:GQ	0/1:40,44:84:-158.78,-25.30,-162.80:99
-chr1	4499866	rs638811	G	A	371.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.47;MQ0=0;OQ=1161.22;QD=14.70;SB=-516.05	GT:AD:DP:GL:GQ	0/1:40,38:72:-141.11,-21.71,-113.94:99
-chr1	4500093	rs627374	C	A	201.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=3.04;MQ=56.24;MQ0=0;OQ=1409.06;QD=17.18;SB=-575.67	GT:AD:DP:GL:GQ	0/1:36,45:77:-170.76,-26.57,-102.66:99
-chr1	4500144	rs1612095	G	C	191.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=58.14;MQ0=0;OQ=1652.98;QD=16.87;SB=-714.30	GT:AD:DP:GL:GQ	0/1:51,47:96:-197.51,-28.93,-219.71:99
-chr1	4500181	rs1612008	C	T	343.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.55;MQ0=0;OQ=1543.90;QD=16.78;SB=-630.74	GT:AD:DP:GL:GQ	0/1:42,49:86:-183.59,-25.91,-132.31:99
-chr1	4500274	rs544513	A	G	399.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=703.77;QD=11.00;SB=-261.96	GT:AD:DP:GL:GQ	0/1:33,31:62:-92.35,-18.69,-134.62:99
-chr1	4500351	rs543653	T	G	570.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=699.52;QD=12.27;SB=-362.58	GT:AD:DP:GL:GQ	0/1:31,26:56:-90.10,-16.87,-111.77:99
-chr1	4500481	rs542688	C	G	360.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=59.76;MQ0=0;OQ=1267.59;QD=16.05;SB=-449.73	GT:AD:DP:GL:GQ	0/1:41,38:77:-153.25,-23.20,-181.78:99
-chr1	4500512	rs625627	C	T	286.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=59.08;MQ0=0;OQ=914.91;QD=12.89;SB=-281.75	GT:AD:DP:GL:GQ	0/1:39,32:67:-114.97,-20.19,-123.19:99
-chr1	4500529	rs541929	A	G	325.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=59.16;MQ0=0;OQ=945.37;QD=12.28;SB=-290.30	GT:AD:DP:GL:GQ	0/1:42,34:76:-120.71,-22.89,-170.67:99
-chr1	4500606	rs10915556	C	T	355.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1316.31;QD=19.65;SB=-489.56	GT:AD:DP:GL:GQ	0/1:29,38:66:-154.80,-19.88,-102.91:99
-chr1	4500644	rs2051642	G	T	498.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1142.97;QD=16.33;SB=-501.30	GT:AD:DP:GL:GQ	0/1:32,38:70:-138.67,-21.09,-110.82:99
-chr1	4500677	rs2051641	C	T	126.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=2.61;MQ=60.00;MQ0=0;OQ=1424.93;QD=18.04;SB=-396.12	GT:AD:DP:GL:GQ	0/1:37,42:79:-169.57,-23.79,-134.20:99
-chr1	4500995	rs694361	G	A	987.12	Indel	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=10;HaplotypeScore=19.73;MQ=59.67;MQ0=0;QD=14.31;SB=-451.85	GT:AD:DP:GL:GQ	0/1:36,33:64:-121.28,-19.29,-109.34:99
-chr1	4501161	rs10915557	A	C	322.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.59;MQ0=0;OQ=772.74;QD=13.80;SB=-198.82	GT:AD:DP:GL:GQ	0/1:27,28:54:-96.83,-16.27,-94.26:99
-chr1	4501182	rs10915558	G	T	398.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=829.24;QD=13.16;SB=-280.30	GT:AD:DP:GL:GQ	0/1:32,31:61:-104.58,-18.38,-107.72:99
-chr1	4501418	rs988089	G	T	231.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=59.83;MQ0=0;OQ=785.83;QD=14.29;SB=-379.13	GT:AD:DP:GL:GQ	0/1:28,27:55:-98.43,-16.57,-95.26:99
-chr1	4501445	rs988088	G	A	287.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=59.35;MQ0=0;OQ=635.25;QD=14.77;SB=-270.30	GT:AD:DP:GL:GQ	0/1:21,22:39:-78.57,-11.76,-58.80:99
-chr1	4501584	rs1988134	A	T	372.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.72;MQ0=0;OQ=1235.61;QD=14.89;SB=-511.29	GT:AD:DP:GL:GQ	0/1:43,40:83:-151.84,-25.00,-162.60:99
-chr1	4501936	rs508056	T	C	0.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.01;HRun=1;HaplotypeScore=15.97;MQ=59.84;MQ0=0;OQ=1145.11;QD=15.07;SB=-479.27	GT:AD:DP:GL:GQ	0/1:36,39:76:-140.39,-22.59,-147.97:99
-chr1	4501948	rs594535	A	T	38.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.01;HRun=0;HaplotypeScore=7.00;MQ=59.51;MQ0=0;OQ=1283.54;QD=17.83;SB=-623.13	GT:AD:DP:GL:GQ	0/1:31,40:72:-153.02,-21.38,-116.42:99
-chr1	4502177	rs640624	T	C	14.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=7.76;MQ=59.57;MQ0=0;OQ=1108.01;QD=16.29;SB=-573.02	GT:AD:DP:GL:GQ	0/1:30,38:66:-133.97,-19.88,-116.04:99
-chr1	4502677	.	A	G	145.65	PASS	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.30;MQ0=0;OQ=805.91;QD=12.21;SB=-395.14	GT:AD:DP:GL:GQ	0/1:37,29:66:-103.76,-19.88,-150.61:99
-chr1	4502871	rs2411775	C	T	188.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.39;MQ0=0;OQ=1230.48;QD=17.83;SB=-330.32	GT:AD:DP:GL:GQ	0/1:32,36:67:-146.52,-20.19,-100.70:99
-chr1	4503184	rs694935	T	A	28.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=2.73;MQ=59.33;MQ0=0;OQ=840.35;QD=13.55;SB=-222.90	GT:AD:DP:GL:GQ	0/1:31,31:58:-104.80,-17.48,-105.42:99
-chr1	4503230	rs694967	T	G	352.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.39;MQ=57.78;MQ0=0;OQ=1098.27;QD=15.25;SB=-535.44	GT:AD:DP:GL:GQ	0/1:33,39:72:-134.80,-21.69,-119.88:99
-chr1	4503601	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=1;HaplotypeScore=106.52;MQ=39.06;MQ0=0;OQ=897.90;QD=7.48;SB=-269.21	GT:AD:DP:GL:GQ	0/1:86,34:118:-128.61,-35.54,-314.22:99
-chr1	4503616	.	T	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=137;Dels=0.00;HRun=1;HaplotypeScore=12.83;MQ=37.47;MQ0=0;OQ=467.51;QD=3.41;SB=-122.22	GT:AD:DP:GL:GQ	0/1:111,26:134:-90.40,-40.36,-439.82:99
-chr1	4503623	rs241214	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=148;Dels=0.00;HRun=0;HaplotypeScore=94.05;MQ=37.91;MQ0=0;OQ=4273.01;QD=28.87;SB=-1538.72	GT:AD:DP:GL:GQ	0/1:32,114:147:-426.30,-51.49,-123.04:99
-chr1	4503639	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=260.99;MQ=37.36;MQ0=0;OQ=1166.38;QD=7.34;SB=-484.60	GT:AD:DP:GL:GQ	0/1:114,44:124:-157.27,-37.35,-295.16:99
-chr1	4503657	rs12754029	A	C	1394.26	DPFilter;Indel	AC=1;AF=0.50;AN=2;DB;DP=153;Dels=0.00;HRun=1;HaplotypeScore=166.14;MQ=39.29;MQ0=0;QD=9.11;SB=-599.12	GT:AD:DP:GL:GQ	0/1:73,77:122:-190.87,-48.16,-269.49:99
-chr1	4503674	rs61111938	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=147;Dels=0.00;HRun=0;HaplotypeScore=137.11;MQ=42.18;MQ0=0;OQ=392.40;QD=2.67;SB=-58.59	GT:AD:DP:GL:GQ	0/1:124,23:123:-79.58,-37.06,-405.54:99
-chr1	4503686	rs61202630	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.03;HRun=0;HaplotypeScore=163.66;MQ=45.68;MQ0=0;OQ=981.22;QD=7.91;SB=-498.66	GT:AD:DP:GL:GQ	0/1:79,40:116:-138.71,-37.31,-281.28:99
-chr1	4503715	.	T	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=16.61;MQ=53.48;MQ0=0;OQ=158.20;QD=1.86;SB=-90.66	GT:AD:DP:GL:GQ	0/1:72,13:84:-44.41,-25.30,-293.89:99
-chr1	4503964	rs241215	T	A	444.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=54.88;MQ0=0;OQ=1312.48;QD=17.50;SB=-618.08	GT:AD:DP:GL:GQ	0/1:34,41:75:-157.12,-22.59,-129.67:99
-chr1	4504029	rs241216	G	A	155.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=4.03;MQ=59.43;MQ0=0;OQ=1251.65;QD=17.15;SB=-469.46	GT:AD:DP:GL:GQ	0/1:35,38:70:-149.55,-21.10,-107.16:99
-chr1	4504349	rs241217	C	G	275.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1603.60;QD=22.59;SB=-778.42	GT:AD:DP:GL:GQ	0/1:29,42:71:-185.04,-21.39,-125.25:99
-chr1	4505282	rs241218	T	C	43.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=7.22;MQ=59.15;MQ0=0;OQ=812.13;QD=11.44;SB=-395.26	GT:AD:DP:GL:GQ	0/1:37,34:67:-104.70,-20.20,-130.72:99
-chr1	4506052	rs241219	T	C	334.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=2.94;MQ=59.17;MQ0=0;OQ=741.75;QD=13.25;SB=-389.65	GT:AD:DP:GL:GQ	0/1:27,29:55:-94.04,-16.58,-103.55:99
-chr1	4508064	rs241220	G	A	334	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=60.00;MQ0=0;OQ=1163.49;QD=17.37;SB=-431.97	GT:AD:DP:GL:GQ	0/1:32,35:66:-139.53,-19.90,-98.33:99
-chr1	4508910	rs241221	T	C	373.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.20;MQ0=0;OQ=874.89;QD=15.08;SB=-418.55	GT:AD:DP:GL:GQ	0/1:25,33:55:-107.34,-16.57,-97.13:99
-chr1	4509116	rs241222	G	C	267.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=3.24;MQ=59.18;MQ0=0;OQ=1337.43;QD=18.07;SB=-676.08	GT:AD:DP:GL:GQ	0/1:37,37:72:-158.72,-21.69,-154.68:99
-chr1	4510110	rs241244	A	T	180.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.78;MQ=60.38;MQ0=0;OQ=930.99;QD=16.33;SB=-387.46	GT:AD:DP:GL:GQ	0/1:27,30:57:-113.55,-17.17,-101.72:99
-chr1	4510493	rs241245	T	C	361.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=60.00;MQ0=0;OQ=851.20;QD=14.43;SB=-421.93	GT:AD:DP:GL:GQ	0/1:29,30:57:-105.58,-17.17,-107.45:99
-chr1	4510920	rs241246	T	C	463.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.63;MQ0=0;OQ=864.46;QD=13.94;SB=-382.19	GT:AD:DP:GL:GQ	0/1:32,30:62:-108.40,-18.67,-129.80:99
-chr1	4510938	rs241247	G	T	223.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=4.47;MQ=59.71;MQ0=0;OQ=1111.82;QD=14.07;SB=-561.61	GT:AD:DP:GL:GQ	0/1:42,37:78:-137.96,-23.49,-147.67:99
-chr1	4511101	rs241248	G	A	90.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=4.65;MQ=58.90;MQ0=0;OQ=1137.70;QD=15.80;SB=-412.89	GT:AD:DP:GL:GQ	0/1:38,34:72:-138.74,-21.69,-139.14:99
-chr1	4512226	rs241249	C	A	118.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=2704.76;QD=36.06;SB=-1203.75	GT:AD:DP:GL:GQ	1/1:0,75:73:-274.08,-21.98,-0.01:99
-chr1	4512612	rs12117466	C	T	434.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=1595.86;QD=21.57;SB=-705.78	GT:AD:DP:GL:GQ	0/1:28,46:74:-185.16,-22.29,-104.90:99
-chr1	4512789	rs2222050	C	G	399.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=51.66;MQ0=0;OQ=560.26;QD=12.18;SB=-284.90	GT:AD:DP:GL:GQ	0/1:29,17:46:-73.17,-13.86,-129.73:99
-chr1	4512997	.	G	C	109.15	PASS	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.26;MQ0=0;OQ=1039.37;QD=14.64;SB=-540.64	GT:AD:DP:GL:GQ	0/1:41,30:70:-128.31,-21.09,-176.73:99
-chr1	4513093	rs241250	C	T	592.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.64;MQ0=0;OQ=2215.68;QD=40.29;SB=-1120.49	GT:AD:DP:GL:GQ	1/1:0,55:55:-225.17,-16.57,-0.01:99
-chr1	4513279	rs241251	T	C	191.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=56.17;MQ0=0;OQ=859.05;QD=12.10;SB=-428.93	GT:AD:DP:GL:GQ	0/1:40,31:71:-110.57,-21.39,-162.21:99
-chr1	4513371	rs241252	G	A	678.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2454.05;QD=39.58;SB=-997.85	GT:AD:DP:GL:GQ	1/1:0,61:61:-249.00,-18.37,-0.01:99
-chr1	4513556	rs56948682	G	C	523.60	Indel	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=3.31;MQ=55.31;MQ0=0;QD=11.90;SB=-218.66	GT:AD:DP:GL:GQ	0/1:25,19:40:-67.72,-12.07,-92.30:99
-chr1	4513868	rs241254	G	A	271.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.27;MQ=58.71;MQ0=0;OQ=649.43;QD=12.03;SB=-239.26	GT:AD:DP:GL:GQ	0/1:28,25:50:-83.30,-15.07,-98.60:99
-chr1	4513881	rs241255	G	C	176.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=58.80;MQ0=0;OQ=2370.20;QD=40.87;SB=-1167.06	GT:AD:DP:GL:GQ	1/1:0,58:55:-240.62,-16.57,-0.01:99
-chr1	4514372	rs241256	C	T	582.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=913.61;QD=13.44;SB=-345.84	GT:AD:DP:GL:GQ	0/1:39,29:68:-115.13,-20.48,-142.92:99
-chr1	4514476	rs6426419	T	A	347.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.60;MQ0=0;OQ=541.18;QD=9.33;SB=-252.68	GT:AD:DP:GL:GQ	0/1:37,21:57:-74.57,-17.17,-137.52:99
-chr1	4514682	rs241257	C	T	286.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=2358.24;QD=39.97;SB=-1174.07	GT:AD:DP:GL:GQ	1/1:0,59:59:-239.42,-17.77,-0.01:99
-chr1	4514873	rs171319	C	T	380.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.42;MQ0=0;OQ=1086.37;QD=13.58;SB=-534.53	GT:AD:DP:GL:GQ	0/1:46,34:78:-135.44,-23.52,-140.72:99
-chr1	4515369	rs241258	G	A	48.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=47.21;MQ0=0;OQ=749.09;QD=17.42;SB=-181.27	GT:AD:DP:GL:GQ	0/1:20,23:42:-90.85,-12.66,-63.49:99
-chr1	4515444	rs241259	C	G	22.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=50.43;MQ0=0;OQ=2118.85;QD=40.75;SB=-972.73	GT:AD:DP:GL:GQ	1/1:0,52:49:-215.48,-14.76,-0.01:99
-chr1	4515588	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=15;HaplotypeScore=4.97;MQ=51.27;MQ0=0;OQ=250.35;QD=4.47;SB=56.21	GT:AD:DP:GL:GQ	0/1:42,14:49:-43.09,-14.77,-129.95:99
-chr1	4515926	rs241260	C	G	33.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=2;HaplotypeScore=2.19;MQ=55.21;MQ0=0;OQ=3292.12;QD=42.21;SB=-1616.25	GT:AD:DP:GL:GQ	1/1:0,78:75:-328.21,-22.60,-0.02:99
-chr1	4515962	rs241261	T	C	602.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.64;MQ0=0;OQ=2469.23;QD=29.75;SB=-1091.36	GT:AD:DP:GL:GQ	1/1:0,83:79:-250.58,-23.83,-0.08:99
-chr1	4516659	rs241262	T	G	634.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2557.93;QD=35.53;SB=-1149.62	GT:AD:DP:GL:GQ	1/1:0,72:72:-259.40,-21.69,-0.02:99
-chr1	4517716	rs10799244	T	C	405.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.15;MQ0=0;OQ=1346.22;QD=18.96;SB=-628.34	GT:AD:DP:GL:GQ	0/1:27,44:70:-158.99,-21.09,-107.87:99
-chr1	4518111	rs6685798	G	A	309.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.32;MQ0=0;OQ=1238.56;QD=18.21;SB=-627.62	GT:AD:DP:GL:GQ	0/1:30,37:65:-146.72,-19.58,-98.24:99
-chr1	4518139	rs916408	T	C	232.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.86;MQ=59.63;MQ0=0;OQ=609.90;QD=9.84;SB=-241.88	GT:AD:DP:GL:GQ	0/1:34,28:60:-82.36,-18.09,-138.61:99
-chr1	4518389	rs916407	C	A	294.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.44;MQ0=0;OQ=593.42;QD=10.99;SB=-258.24	GT:AD:DP:GL:GQ	0/1:32,22:53:-78.59,-15.97,-110.59:99
-chr1	4518393	rs916406	T	C	102.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=58.50;MQ0=0;OQ=426.60;QD=7.62;SB=-216.22	GT:AD:DP:GL:GQ	0/1:34,22:50:-61.02,-15.07,-122.30:99
-chr1	4518582	rs241263	T	C	395.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2663.66;QD=36.49;SB=-1355.60	GT:AD:DP:GL:GQ	1/1:0,73:73:-269.97,-21.98,-0.02:99
-chr1	4518898	rs241264	C	T	593.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.77;MQ0=0;OQ=3315.63;QD=40.93;SB=-1267.69	GT:AD:DP:GL:GQ	1/1:0,81:81:-330.56,-24.40,-0.02:99
-chr1	4519253	rs241265	G	T	396.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=442.53;QD=9.42;SB=-108.63	GT:AD:DP:GL:GQ	0/1:30,17:47:-61.69,-14.15,-109.08:99
-chr1	4520150	rs241266	G	A	572.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1309.70;QD=16.79;SB=-634.24	GT:AD:DP:GL:GQ	0/1:38,40:77:-157.45,-23.20,-135.23:99
-chr1	4520783	rs10915560	T	C	479.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=617.89;QD=10.13;SB=-279.12	GT:AD:DP:GL:GQ	0/1:36,25:60:-83.15,-18.08,-142.30:99
-chr1	4520856	rs12120353	C	A	156.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=694.57;QD=12.19;SB=-303.22	GT:AD:DP:GL:GQ	0/1:32,25:54:-89.01,-16.27,-103.65:99
-chr1	4521323	rs241267	C	T	378.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.60;MQ0=0;OQ=620.84;QD=13.21;SB=-243.25	GT:AD:DP:GL:GQ	0/1:25,22:45:-78.94,-13.58,-74.16:99
-chr1	4521646	rs12748186	C	T	419.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=983.89;QD=18.92;SB=-364.52	GT:AD:DP:GL:GQ	0/1:23,29:52:-117.34,-15.67,-75.86:99
-chr1	4522500	rs241268	A	G	490.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1548.29;QD=30.97;SB=-704.61	GT:AD:DP:GL:GQ	1/1:0,50:49:-158.46,-14.78,-0.04:99
-chr1	4523101	.	G	T	20.08	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=16;HaplotypeScore=10.17;MQ=50.32;MQ0=0;QD=0.35;SB=50.87	GT:AD:DP:GL:GQ	0/1:48,10:42:-17.95,-12.66,-121.78:52.87
-chr1	4523283	rs241269	C	T	335.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=806.86;QD=12.81;SB=-308.31	GT:AD:DP:GL:GQ	0/1:36,27:61:-102.37,-18.40,-111.88:99
-chr1	4523749	rs55956326	C	T	46.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=776.69;QD=17.65;SB=-140.14	GT:AD:DP:GL:GQ	0/1:21,23:44:-94.21,-13.26,-66.49:99
-chr1	4524365	rs497517	C	A	203.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=57.23;MQ0=0;OQ=2311.84;QD=35.57;SB=-943.65	GT:AD:DP:GL:GQ	1/1:0,65:64:-234.79,-19.27,-0.02:99
-chr1	4524639	rs190250	T	C	96.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=54.62;MQ0=1;OQ=1410.76;QD=28.22;SB=-520.24	GT:AD:DP:GL:GQ	1/1:1,49:43:-144.69,-12.96,-0.03:99
-chr1	4525049	rs241270	T	A	128.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=57.31;MQ0=0;OQ=2756.56;QD=35.80;SB=-964.62	GT:AD:DP:GL:GQ	1/1:0,76:75:-279.26,-22.59,-0.02:99
-chr1	4525775	.	C	T	82.15	PASS	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=60.00;MQ0=0;OQ=631.76;QD=12.39;SB=-287.21	GT:AD:DP:GL:GQ	0/1:28,23:47:-80.62,-14.16,-88.43:99
-chr1	4526115	rs241271	T	C	508.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=1796.29;QD=29.45;SB=-877.68	GT:AD:DP:GL:GQ	1/1:0,61:57:-183.26,-17.19,-0.05:99
-chr1	4526127	rs241272	T	G	620.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.35;MQ0=0;OQ=2425.30;QD=34.16;SB=-1142.12	GT:AD:DP:GL:GQ	1/1:0,71:70:-246.14,-21.08,-0.02:99
-chr1	4526146	rs1515670	A	G	180.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=3.98;MQ=58.96;MQ0=0;OQ=860.15;QD=12.84;SB=-436.91	GT:AD:DP:GL:GQ	0/1:37,30:66:-109.18,-19.88,-145.10:99
-chr1	4526937	rs241273	A	C	421.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=1105.42;QD=16.02;SB=-515.69	GT:AD:DP:GL:GQ	0/1:31,38:69:-134.61,-20.78,-114.90:99
-chr1	4527342	rs241274	A	C	51.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=1996.50;QD=32.20;SB=-821.03	GT:AD:DP:GL:GQ	1/1:0,62:58:-203.26,-17.47,-0.02:99
-chr1	4527839	rs241275	A	G	555.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=2594.28;QD=29.48;SB=-1228.48	GT:AD:DP:GL:GQ	1/1:0,88:82:-263.09,-24.73,-0.08:99
-chr1	4528191	rs28665533	G	A	434.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1407.19;QD=19.02;SB=-661.67	GT:AD:DP:GL:GQ	0/1:32,42:74:-166.29,-22.29,-115.61:99
-chr1	4528559	rs241276	C	T	153.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=4.22;MQ=59.30;MQ0=0;OQ=909.72;QD=13.78;SB=-324.82	GT:AD:DP:GL:GQ	0/1:37,29:65:-113.86,-19.61,-110.36:99
-chr1	4529046	rs241277	A	C	117.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=2.18;MQ=60.00;MQ0=0;OQ=2433.72;QD=33.34;SB=-1159.13	GT:AD:DP:GL:GQ	1/1:0,73:69:-246.98,-20.78,-0.02:99
-chr1	4529268	rs241278	T	C	273.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.43;MQ=59.61;MQ0=0;OQ=2074.79;QD=35.17;SB=-848.12	GT:AD:DP:GL:GQ	1/1:0,59:58:-211.08,-17.47,-0.02:99
-chr1	4530244	rs7531281	A	C	607.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2071.97;QD=33.42;SB=-943.11	GT:AD:DP:GL:GQ	1/1:0,62:60:-210.80,-18.07,-0.02:99
-chr1	4530343	rs7526879	C	T	127.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=59.29;MQ0=0;OQ=2841.32;QD=39.46;SB=-1410.68	GT:AD:DP:GL:GQ	1/1:0,72:71:-287.74,-21.39,-0.02:99
-chr1	4531126	rs241212	G	T	328.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=59.37;MQ0=0;OQ=847.33;QD=14.36;SB=-341.38	GT:AD:DP:GL:GQ	0/1:30,29:58:-105.49,-17.47,-104.18:99
-chr1	4531264	rs55850443	C	A	105.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=3.29;MQ=59.66;MQ0=0;OQ=907.20;QD=13.54;SB=-364.99	GT:AD:DP:GL:GQ	0/1:34,33:65:-113.58,-19.58,-115.11:99
-chr1	4532420	rs980092	A	G	568.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.63;MQ0=0;OQ=2136.98;QD=31.43;SB=-1016.73	GT:AD:DP:GL:GQ	1/1:0,68:67:-217.34,-20.21,-0.06:99
-chr1	4532678	rs34339970	T	C	238.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=59.68;MQ0=0;OQ=686.96;QD=9.41;SB=-234.24	GT:AD:DP:GL:GQ	0/1:42,31:70:-93.08,-21.10,-159.73:99
-chr1	4532688	rs171317	C	A	295.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.69;MQ0=0;OQ=2546.98;QD=34.42;SB=-1274.23	GT:AD:DP:GL:GQ	1/1:0,74:71:-258.31,-21.38,-0.02:99
-chr1	4532830	rs35748829	C	T	224.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.37;MQ0=0;OQ=1280.71;QD=19.40;SB=-516.15	GT:AD:DP:GL:GQ	0/1:29,37:64:-150.64,-19.29,-86.56:99
-chr1	4532839	rs35106071	C	T	30.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=3;HaplotypeScore=0.47;MQ=59.31;MQ0=0;OQ=1092.68;QD=17.91;SB=-426.77	GT:AD:DP:GL:GQ	0/1:29,32:61:-130.92,-18.37,-105.58:99
-chr1	4533414	rs6673089	G	A	59.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=5.78;MQ=59.66;MQ0=0;OQ=1175.25;QD=17.54;SB=-391.70	GT:AD:DP:GL:GQ	0/1:31,35:66:-140.69,-19.88,-114.80:99
-chr1	4533499	rs6426421	C	T	279.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=56.21;MQ0=0;OQ=3052.51;QD=38.64;SB=-1294.73	GT:AD:DP:GL:GQ	1/1:0,79:78:-308.86,-23.50,-0.03:99
-chr1	4533545	rs7527742	G	A	582.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.29;MQ0=0;OQ=1245.18;QD=15.19;SB=-388.08	GT:AD:DP:GL:GQ	0/1:45,37:81:-152.20,-24.40,-157.64:99
-chr1	4533745	rs241208	T	C	151.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.23;MQ0=0;OQ=641.89;QD=11.07;SB=-289.57	GT:AD:DP:GL:GQ	0/1:35,23:57:-84.64,-17.17,-139.99:99
-chr1	4533782	rs17344823	A	T	343.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=50.31;MQ0=0;OQ=1106.34;QD=17.56;SB=-567.72	GT:AD:DP:GL:GQ	0/1:26,37:60:-131.99,-18.07,-92.40:99
-chr1	4533944	rs241207	T	G	366.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.27;MQ0=0;OQ=1080.62;QD=29.21;SB=-322.00	GT:AD:DP:GL:GQ	1/1:0,37:32:-111.66,-9.64,-0.02:96.25
-chr1	4534250	rs11584033	T	C	380.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=58.88;MQ0=0;OQ=947.57;QD=16.34;SB=-494.15	GT:AD:DP:GL:GQ	0/1:26,32:58:-115.51,-17.47,-106.56:99
-chr1	4534838	rs1541318	A	G	459.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1096.76;QD=16.87;SB=-540.58	GT:AD:DP:GL:GQ	0/1:28,37:65:-132.54,-19.58,-112.37:99
-chr1	4535109	rs2411777	C	T	151.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=59.69;MQ0=0;OQ=1491.80;QD=20.16;SB=-710.25	GT:AD:DP:GL:GQ	0/1:30,44:73:-174.45,-21.99,-106.04:99
-chr1	4536054	rs10799246	T	A	279.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=56.28;MQ0=1;OQ=1123.37;QD=19.37;SB=-579.73	GT:AD:DP:GL:GQ	0/1:23,35:56:-132.49,-16.87,-78.58:99
-chr1	4536627	rs1157688	T	C	729.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2286.18;QD=34.64;SB=-1059.42	GT:AD:DP:GL:GQ	1/1:1,65:64:-232.22,-19.28,-0.02:99
-chr1	4537253	rs12746043	A	G	196.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=59.75;MQ0=0;OQ=742.34;QD=10.03;SB=-306.91	GT:AD:DP:GL:GQ	0/1:43,31:74:-99.82,-22.30,-175.74:99
-chr1	4537334	rs12073968	A	T	357.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=1269.08;QD=15.67;SB=-567.67	GT:AD:DP:GL:GQ	0/1:40,41:80:-154.29,-24.09,-150.38:99
-chr1	4537921	rs12724503	G	A	310.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=101;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=60.00;MQ0=0;OQ=1523.81;QD=15.09;SB=-617.07	GT:AD:DP:GL:GQ	0/1:55,46:100:-185.79,-30.12,-188.53:99
-chr1	4538097	rs4654561	G	A	508.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=94;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.71;MQ0=0;OQ=3756.30;QD=39.96;SB=-1777.79	GT:AD:DP:GL:GQ	1/1:0,92:93:-374.63,-34.91,-7.66:99
-chr1	4538181	rs4654562	G	A	215.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=2.80;MQ=59.13;MQ0=0;OQ=1260.80;QD=15.19;SB=-602.60	GT:AD:DP:GL:GQ	0/1:45,38:82:-154.08,-24.71,-143.05:99
-chr1	4538603	rs4654563	G	A	371.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=1202.15;QD=16.03;SB=-528.76	GT:AD:DP:GL:GQ	0/1:39,36:74:-145.80,-22.30,-125.85:99
-chr1	4538973	rs7543382	T	C	333.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=59.17;MQ0=0;OQ=1070.40;QD=14.66;SB=-356.54	GT:AD:DP:GL:GQ	0/1:37,36:73:-132.31,-21.99,-147.75:99
-chr1	4539030	rs7540656	A	G	325.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.39;MQ0=0;OQ=796.84;QD=11.72;SB=-299.04	GT:AD:DP:GL:GQ	0/1:36,32:68:-103.46,-20.49,-144.09:99
-chr1	4540675	rs1963269	C	G	227.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.54;MQ0=0;OQ=1695.02;QD=16.62;SB=-763.36	GT:AD:DP:GL:GQ	0/1:55,47:97:-202.01,-29.22,-223.35:99
-chr1	4540762	rs1024139	T	C	542	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.15;MQ0=0;OQ=842.09;QD=11.70;SB=-437.91	GT:AD:DP:GL:GQ	0/1:42,30:72:-109.18,-21.69,-170.21:99
-chr1	4541602	rs241225	G	A	260.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=59.63;MQ0=0;OQ=2333.57;QD=37.04;SB=-1016.38	GT:AD:DP:GL:GQ	1/1:0,63:59:-236.96,-17.77,-0.01:99
-chr1	4541659	rs241224	G	T	284.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.28;MQ0=0;OQ=2085.58;QD=35.96;SB=-859.24	GT:AD:DP:GL:GQ	1/1:0,58:57:-212.16,-17.17,-0.02:99
-chr1	4541986	rs61765446	G	A	358.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=942.30;QD=14.28;SB=-483.10	GT:AD:DP:GL:GQ	0/1:37,29:65:-117.11,-19.59,-114.27:99
-chr1	4542017	rs241223	C	T	513.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2827.32;QD=39.82;SB=-1402.70	GT:AD:DP:GL:GQ	1/1:0,71:71:-286.34,-21.39,-0.02:99
-chr1	4542337	rs184781	C	T	269.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=2680.27;QD=40.00;SB=-1072.41	GT:AD:DP:GL:GQ	1/1:0,67:66:-271.63,-19.88,-0.01:99
-chr1	4542995	.	A	T	0.76	PASS	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=53.06;MQ0=0;OQ=196.97;QD=3.28;SB=-90.71	GT:AD:DP:GL:GQ	0/1:48,11:53:-38.95,-15.97,-156.27:99
-chr1	4543292	rs2078573	A	C	86.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=6.05;MQ=56.75;MQ0=0;OQ=1341.41;QD=16.77;SB=-537.82	GT:AD:DP:GL:GQ	0/1:31,48:77:-160.62,-23.19,-115.03:99
-chr1	4543548	rs515279	T	C	17.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=59.29;MQ0=0;OQ=1923.64;QD=29.59;SB=-45.69	GT:AD:DP:GL:GQ	1/1:0,65:64:-196.03,-19.32,-0.08:99
-chr1	4543717	rs587108	T	G	137.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=716.08;QD=34.10;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,21:21:-75.20,-6.33,-0.01:63.19
-chr1	4543945	rs588347	C	T	45.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=256.94;QD=10.71;SB=-10.00	GT:AD:DP:GL:GQ	0/1:15,9:24:-36.21,-7.23,-52.03:99
-chr1	4544067	rs588861	G	A	43.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=54.12;MQ0=0;OQ=1783.57;QD=37.95;SB=-560.73	GT:AD:DP:GL:GQ	1/1:0,47:45:-181.96,-13.56,-0.01:99
-chr1	4544173	rs488684	T	A	310.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.99;MQ0=0;OQ=2644.21;QD=36.73;SB=-1277.61	GT:AD:DP:GL:GQ	1/1:0,72:70:-268.02,-21.08,-0.01:99
-chr1	4545564	rs616180	T	G	115.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=58.74;MQ0=0;OQ=2469.47;QD=35.28;SB=-1055.12	GT:AD:DP:GL:GQ	1/1:0,70:69:-250.55,-20.78,-0.02:99
-chr1	4545738	rs617046	T	C	49.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=60.00;MQ0=0;OQ=1303.79;QD=31.80;SB=-288.55	GT:AD:DP:GL:GQ	1/1:0,41:40:-133.99,-12.05,-0.02:99
-chr1	4545788	rs57374319	C	T	229.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.48;MQ0=0;OQ=594.52;QD=13.51;SB=-275.28	GT:AD:DP:GL:GQ	0/1:24,20:43:-75.69,-12.95,-87.49:99
-chr1	4545807	rs563158	G	C	408.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=2250.93;QD=42.47;SB=-845.32	GT:AD:DP:GL:GQ	1/1:0,53:52:-228.70,-15.67,-0.02:99
-chr1	4545915	rs617610	A	G	103.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=58.73;MQ0=0;OQ=1514.17;QD=27.53;SB=-766.72	GT:AD:DP:GL:GQ	1/1:0,55:49:-155.05,-14.78,-0.05:99
-chr1	4545933	rs561468	C	A	155.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.22;MQ0=0;OQ=1902.16;QD=32.24;SB=-898.65	GT:AD:DP:GL:GQ	1/1:0,59:54:-193.82,-16.27,-0.02:99
-chr1	4546125	rs538655	G	A	601.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.21;MQ0=0;OQ=2022.14;QD=38.15;SB=-935.74	GT:AD:DP:GL:GQ	1/1:0,53:52:-205.82,-15.67,-0.02:99
-chr1	4546239	rs619364	G	A	445.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=837.24;QD=13.95;SB=-392.12	GT:AD:DP:GL:GQ	0/1:34,26:60:-105.08,-18.07,-121.77:99
-chr1	4546345	rs536749	A	G	482	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1853.11;QD=30.38;SB=-858.57	GT:AD:DP:GL:GQ	1/1:0,61:58:-188.95,-17.49,-0.05:99
-chr1	4546432	rs4654446	C	T	238.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.88;MQ=59.28;MQ0=0;OQ=947.38;QD=16.33;SB=-474.49	GT:AD:DP:GL:GQ	0/1:28,30:56:-114.89,-16.87,-97.02:99
-chr1	4546657	rs562787	A	G	229.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=1701.20;QD=30.38;SB=-810.66	GT:AD:DP:GL:GQ	1/1:0,56:54:-173.76,-16.29,-0.05:99
-chr1	4546823	rs532259	C	T	169.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.40;MQ0=0;OQ=2521.38;QD=40.67;SB=-1140.51	GT:AD:DP:GL:GQ	1/1:0,62:62:-255.74,-18.67,-0.01:99
-chr1	4547018	rs559200	G	C	1813.47	Indel	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.18;MQ0=0;QD=40.30;SB=-734.75	GT:AD:DP:GL:GQ	1/1:0,44:43:-184.95,-12.96,-0.01:99
-chr1	4547035	rs6691728	C	T	1783.47	Indel	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=57.64;MQ0=0;QD=39.63;SB=-856.02	GT:AD:DP:GL:GQ	1/1:0,45:45:-181.94,-13.55,-0.01:99
-chr1	4547069	rs558411	G	C	0.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=4;HaplotypeScore=0.63;MQ=58.20;MQ0=0;OQ=1617.71;QD=41.48;SB=-687.82	GT:AD:DP:GL:GQ	1/1:0,39:38:-165.37,-11.45,-0.01:99
-chr1	4547307	rs634075	C	T	118.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=59.44;MQ0=0;OQ=1786.25;QD=34.35;SB=-705.43	GT:AD:DP:GL:GQ	1/1:0,51:47:-182.23,-14.17,-0.02:99
-chr1	4547329	rs644647	C	A	608.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.55;MQ0=0;OQ=1779.42;QD=34.89;SB=-902.65	GT:AD:DP:GL:GQ	1/1:0,51:50:-181.54,-15.06,-0.02:99
-chr1	4547506	rs2674014	C	T	604.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.76;MQ0=0;OQ=3048.33;QD=39.08;SB=-1465.48	GT:AD:DP:GL:GQ	1/1:0,78:77:-308.44,-23.20,-0.02:99
-chr1	4548034	rs669252	A	G	36.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=59.78;MQ0=0;OQ=2568.64;QD=30.58;SB=-1254.84	GT:AD:DP:GL:GQ	1/1:0,84:80:-260.52,-24.13,-0.08:99
-chr1	4548229	rs527146	C	T	195.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.54;MQ0=0;OQ=2361.57;QD=37.49;SB=-975.04	GT:AD:DP:GL:GQ	1/1:2,61:63:-246.39,-18.98,-6.65:99
-chr1	4548230	rs553803	A	G	202.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.54;MQ0=0;OQ=2093.62;QD=33.23;SB=-906.61	GT:AD:DP:GL:GQ	1/1:2,61:63:-221.00,-18.97,-8.05:99
-chr1	4548433	rs504274	C	T	6.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=4;HaplotypeScore=2.30;MQ=59.56;MQ0=0;OQ=3385.81;QD=39.83;SB=-1431.01	GT:AD:DP:GL:GQ	1/1:0,85:84:-337.58,-25.30,-0.02:99
-chr1	4548537	rs916404	A	G	176.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.01;MQ=59.60;MQ0=0;OQ=1563.60;QD=27.43;SB=-730.94	GT:AD:DP:GL:GQ	1/1:0,57:51:-160.00,-15.38,-0.05:99
-chr1	4548552	rs1811133	G	A	623.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=2054.70;QD=38.77;SB=-776.53	GT:AD:DP:GL:GQ	1/1:0,53:52:-209.07,-15.66,-0.01:99
-chr1	4548640	rs10915566	C	T	338.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.69;MQ=59.67;MQ0=0;OQ=1058.12;QD=15.12;SB=-552.39	GT:AD:DP:GL:GQ	0/1:37,33:67:-129.29,-20.20,-113.66:99
-chr1	4548685	rs2176113	C	T	467.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1206.49;QD=16.76;SB=-424.43	GT:AD:DP:GL:GQ	0/1:37,35:72:-145.62,-21.68,-138.53:99
-chr1	4548689	rs549918	C	T	547.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2745.70;QD=39.22;SB=-872.18	GT:AD:DP:GL:GQ	1/1:0,70:69:-278.17,-20.79,-0.02:99
-chr1	4548722	rs549150	C	T	597.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=3119.07;QD=40.51;SB=-1266.19	GT:AD:DP:GL:GQ	1/1:0,77:77:-315.51,-23.19,-0.01:99
-chr1	4548785	rs548958	A	C	587.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=3225.28;QD=33.25;SB=-1553.11	GT:AD:DP:GL:GQ	1/1:0,97:93:-326.16,-28.01,-0.03:99
-chr1	4548901	rs683704	G	A	493.67	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2363.22;QD=39.39;SB=-1015.37	GT:AD:DP:GL:GQ	1/1:0,60:60:-239.92,-18.08,-0.02:99
-chr1	4549335	rs572875	G	A	610.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.57;MQ0=0;OQ=2583.49;QD=39.75;SB=-1223.62	GT:AD:DP:GL:GQ	1/1:0,65:64:-261.95,-19.28,-0.01:99
-chr1	4549598	rs520532	C	T	634.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=1;OQ=2560.49;QD=37.65;SB=-1198.62	GT:AD:DP:GL:GQ	1/1:0,68:66:-259.66,-19.89,-0.02:99
-chr1	4550061	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=20;HaplotypeScore=23.52;MQ=43.78;MQ0=0;OQ=658.49;QD=6.86;SB=83.26	GT:AD:DP:GL:GQ	0/1:53,43:71:-90.53,-21.40,-163.68:99
-chr1	4550163	rs189538	T	C	1.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=4.99;MQ=53.64;MQ0=0;OQ=1059.98;QD=26.50;SB=-540.85	GT:AD:DP:GL:GQ	1/1:0,40:35:-109.62,-10.56,-0.04:99
-chr1	4550501	rs10915567	A	T	204.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=58.86;MQ0=0;OQ=971.67;QD=17.35;SB=-337.66	GT:AD:DP:GL:GQ	0/1:25,31:54:-116.71,-16.26,-86.04:99
-chr1	4550640	rs241213	G	A	356.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=2857.67;QD=40.25;SB=-1367.83	GT:AD:DP:GL:GQ	1/1:0,71:71:-289.37,-21.39,-0.02:99
-chr1	4550851	rs164775	A	G	34.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=5.34;MQ=59.24;MQ0=0;OQ=775.11;QD=14.09;SB=-373.36	GT:AD:DP:GL:GQ	0/1:28,27:55:-97.36,-16.57,-110.68:99
-chr1	4551064	rs12079284	G	A	324.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=2.40;MQ=59.55;MQ0=0;OQ=1490.67;QD=17.96;SB=-575.98	GT:AD:DP:GL:GQ	0/1:39,44:83:-177.35,-25.00,-139.24:99
-chr1	4551090	rs164774	A	C	75.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=0.79;MQ=59.47;MQ0=0;OQ=2365.79;QD=33.80;SB=-1092.51	GT:AD:DP:GL:GQ	1/1:0,70:67:-240.18,-20.18,-0.02:99
-chr1	4551865	rs10489134	G	C	328.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=59.44;MQ0=0;OQ=1198.12;QD=16.19;SB=-348.77	GT:AD:DP:GL:GQ	0/1:36,38:72:-144.81,-21.71,-156.52:99
-chr1	4552887	rs7554766	G	A	776.54	Indel	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.13;MQ0=0;QD=12.13;SB=-327.33	GT:AD:DP:GL:GQ	0/1:39,25:57:-98.11,-17.17,-116.23:99
-chr1	4552953	rs7518655	C	T	177.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=2.86;MQ=58.99;MQ0=0;OQ=677.30;QD=14.72;SB=-320.35	GT:AD:DP:GL:GQ	0/1:23,23:43:-83.97,-12.96,-72.15:99
-chr1	4553124	rs7518781	C	A	341.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.10;MQ=59.31;MQ0=0;OQ=849.36;QD=13.92;SB=-331.16	GT:AD:DP:GL:GQ	0/1:30,31:56:-105.09,-16.87,-90.31:99
-chr1	4553830	rs164770	A	G	0.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=3;HaplotypeScore=7.02;MQ=59.30;MQ0=0;OQ=1972.78;QD=32.88;SB=-746.94	GT:AD:DP:GL:GQ	1/1:2,57:55:-200.88,-16.57,-0.02:99
-chr1	4554084	rs61767667	T	A	362.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=502.84;QD=10.48;SB=-173.16	GT:AD:DP:GL:GQ	0/1:30,18:48:-68.02,-14.46,-113.49:99
-chr1	4554189	rs61767668	G	A	492.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=958.92;QD=14.31;SB=-387.15	GT:AD:DP:GL:GQ	0/1:38,29:66:-119.06,-19.89,-123.05:99
-chr1	4555833	rs540572	C	A	391.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=602.48;QD=12.30;SB=-99.63	GT:AD:DP:GL:GQ	0/1:24,25:46:-77.39,-13.85,-83.99:99
-chr1	4556007	rs6426423	C	A	388.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=59.29;MQ0=0;OQ=809.24;QD=15.27;SB=-378.16	GT:AD:DP:GL:GQ	0/1:24,29:51:-99.57,-15.36,-78.05:99
-chr1	4556396	rs531363	C	T	270.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=785.64;QD=14.03;SB=-358.40	GT:AD:DP:GL:GQ	0/1:30,26:54:-98.13,-16.29,-91.52:99
-chr1	4556558	rs129794	G	A	506.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=510.17;QD=11.09;SB=-262.22	GT:AD:DP:GL:GQ	0/1:29,17:46:-68.16,-13.86,-103.52:99
-chr1	4556721	rs10799248	G	A	151.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=483.34;QD=15.10;SB=-178.66	GT:AD:DP:GL:GQ	0/1:17,15:30:-60.66,-9.04,-48.95:99
-chr1	4556909	rs526695	T	C	306.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=58.98;MQ0=0;OQ=2857.53;QD=34.85;SB=-1208.70	GT:AD:DP:GL:GQ	1/1:0,82:80:-289.36,-24.10,-0.02:99
-chr1	4556982	rs516947	G	A	448.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=2681.00;QD=38.86;SB=-634.83	GT:AD:DP:GL:GQ	1/1:0,69:67:-271.71,-20.19,-0.02:99
-chr1	4556992	rs516977	A	G	448.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.27;MQ0=0;OQ=1828.72;QD=29.03;SB=-545.85	GT:AD:DP:GL:GQ	1/1:0,63:60:-186.53,-18.11,-0.07:99
-chr1	4557030	rs517092	A	C	349.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1428.85;QD=26.46;SB=-498.86	GT:AD:DP:GL:GQ	1/1:0,54:46:-146.51,-13.87,-0.04:99
-chr1	4557056	rs524982	C	T	158.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=59.64;MQ0=0;OQ=2000.95;QD=38.48;SB=-916.28	GT:AD:DP:GL:GQ	1/1:0,52:51:-203.70,-15.37,-0.02:99
-chr1	4557155	rs651695	A	T	85.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=3;HaplotypeScore=2.39;MQ=59.42;MQ0=0;OQ=1262.50;QD=15.98;SB=-615.05	GT:AD:DP:GL:GQ	0/1:40,39:78:-153.02,-23.49,-149.00:99
-chr1	4557694	rs653988	C	T	110.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.82;MQ0=0;OQ=2793.65;QD=39.91;SB=-1109.49	GT:AD:DP:GL:GQ	1/1:0,70:70:-282.97,-21.09,-0.02:99
-chr1	4558171	rs549239	T	C	727.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.17;MQ0=0;OQ=2944.97;QD=35.06;SB=-1221.82	GT:AD:DP:GL:GQ	1/1:0,84:83:-298.11,-25.00,-0.03:99
-chr1	4558199	rs12726702	T	A	2233	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=6;HaplotypeScore=61.64;MQ=53.38;MQ0=0;QD=26.58;SB=-718.98	GT:AD:DP:GL:GQ	0/1:14,70:81:-250.99,-24.40,-50.82:99
-chr1	4558206	rs549087	T	A	2870.37	Indel;SnpCluster	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.01;HRun=6;HaplotypeScore=46.58;MQ=52.93;MQ0=0;QD=35.88;SB=-1138.04	GT:AD:DP:GL:GQ	1/1:0,79:79:-290.65,-23.50,-0.03:99
-chr1	4558209	rs28687799	A	T	819.27	Indel;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=4;HaplotypeScore=29.81;MQ=52.84;MQ0=0;QD=10.37;SB=-175.59	GT:AD:DP:GL:GQ	0/1:49,30:77:-108.41,-23.20,-171.08:99
-chr1	4558214	rs59930628	A	T	84.16	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.03;HRun=4;HaplotypeScore=38.67;MQ=53.63;MQ0=0;QD=1.09;SB=56.66	GT:AD:DP:GL:GQ	0/1:66,9:73:-33.09,-21.39,-235.05:99
-chr1	4558250	rs666799	A	C	496.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=54.14;MQ0=0;OQ=2047.56;QD=34.70;SB=-847.08	GT:AD:DP:GL:GQ	1/1:0,59:58:-208.36,-17.47,-0.02:99
-chr1	4558398	rs12567277	C	T	337.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.53;MQ0=0;OQ=912.06;QD=18.61;SB=-436.84	GT:AD:DP:GL:GQ	0/1:22,27:48:-108.95,-14.46,-68.62:99
-chr1	4558676	rs553691	C	T	200.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.21;MQ0=0;OQ=1974.68;QD=37.26;SB=-1009.66	GT:AD:DP:GL:GQ	1/1:0,53:52:-201.08,-15.67,-0.02:99
-chr1	4560412	rs589176	A	G	118.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=2.29;MQ=58.87;MQ0=0;OQ=545.72;QD=13.31;SB=-145.53	GT:AD:DP:GL:GQ	0/1:20,21:40:-69.91,-12.06,-74.33:99
-chr1	4561004	rs602244	T	C	195.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.83;MQ=59.64;MQ0=0;OQ=1077.64;QD=16.84;SB=-452.16	GT:AD:DP:GL:GQ	0/1:26,38:63:-130.03,-18.98,-104.11:99
-chr1	4561499	rs604465	G	A	250.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=59.13;MQ0=0;OQ=735.55;QD=15.32;SB=-280.30	GT:AD:DP:GL:GQ	0/1:25,23:45:-90.40,-13.56,-80.37:99
-chr1	4561737	rs563481	C	T	22.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=747.56;QD=17.80;SB=-287.30	GT:AD:DP:GL:GQ	0/1:20,22:42:-90.69,-12.65,-73.13:99
-chr1	4562268	rs537761	C	A	317.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=820.87;QD=16.75;SB=-394.13	GT:AD:DP:GL:GQ	0/1:21,28:48:-99.83,-14.46,-74.67:99
-chr1	4562392	rs618751	G	A	349.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=60.00;MQ0=0;OQ=1032.44;QD=14.14;SB=-366.34	GT:AD:DP:GL:GQ	0/1:41,32:73:-128.52,-21.99,-148.49:99
-chr1	4562641	rs534159	C	T	355.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=808.69;QD=13.71;SB=-376.39	GT:AD:DP:GL:GQ	0/1:33,26:58:-101.65,-17.50,-100.37:99
-chr1	4565129	rs241243	A	G	370.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=694.01;QD=8.07;SB=-138.39	GT:AD:DP:GL:GQ	0/1:53,33:82:-97.39,-24.71,-212.58:99
-chr1	4565904	rs10915569	C	A	242.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.39;MQ0=0;OQ=1490.43;QD=19.61;SB=-754.94	GT:AD:DP:GL:GQ	0/1:27,49:74:-174.61,-22.29,-94.95:99
-chr1	4566354	rs164780	C	G	240.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=59.64;MQ0=0;OQ=2456.30;QD=38.38;SB=-1204.26	GT:AD:DP:GL:GQ	1/1:0,64:63:-249.27,-19.01,-0.05:99
-chr1	4566679	rs151716	A	G	365.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=59.43;MQ0=0;OQ=771.72;QD=11.87;SB=-373.98	GT:AD:DP:GL:GQ	0/1:33,32:64:-99.75,-19.29,-131.65:99
-chr1	4567238	rs4654450	G	A	244.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=59.42;MQ0=0;OQ=1219.09;QD=16.93;SB=-598.62	GT:AD:DP:GL:GQ	0/1:35,37:71:-146.59,-21.39,-121.89:99
-chr1	4567954	rs151715	A	G	136	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.44;MQ0=0;OQ=821.52;QD=10.95;SB=-417.84	GT:AD:DP:GL:GQ	0/1:41,34:74:-107.74,-22.30,-168.10:99
-chr1	4568017	rs241242	G	T	115.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=60.00;MQ0=0;OQ=1682.11;QD=33.64;SB=-638.02	GT:AD:DP:GL:GQ	1/1:0,49:48:-171.82,-14.46,-0.02:99
-chr1	4568283	rs11590266	A	G	358.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=59.56;MQ0=0;OQ=565.36;QD=10.87;SB=-241.59	GT:AD:DP:GL:GQ	0/1:27,24:51:-77.60,-17.78,-112.88:99
-chr1	4571271	rs164779	C	G	314.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=59.44;MQ0=0;OQ=1283.51;QD=17.11;SB=-664.28	GT:AD:DP:GL:GQ	0/1:38,37:72:-153.33,-21.69,-161.13:99
-chr1	4571572	.	C	T	90.66	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=59.56;MQ0=0;OQ=626.01;QD=12.04;SB=-331.33	GT:AD:DP:GL:GQ	0/1:32,20:47:-80.06,-14.17,-86.19:99
-chr1	4572354	rs164778	T	C	225.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1559.84;QD=35.45;SB=-660.32	GT:AD:DP:GL:GQ	1/1:0,44:44:-159.58,-13.25,-0.01:99
-chr1	4572615	rs6703429	T	C	577.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=862.43;QD=13.07;SB=-402.26	GT:AD:DP:GL:GQ	0/1:35,31:65:-109.11,-19.58,-142.67:99
-chr1	4574299	.	C	A	554.66	Indel	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.59;MQ0=0;QD=10.47;SB=-260.28	GT:AD:DP:GL:GQ	0/1:31,22:48:-73.21,-14.46,-96.27:99
-chr1	4576029	rs164776	C	T	259.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.56;MQ0=0;OQ=893.05;QD=17.17;SB=-421.82	GT:AD:DP:GL:GQ	0/1:24,28:50:-107.66,-15.07,-72.44:99
-chr1	4576797	rs2411886	G	C	186.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.24;MQ=59.03;MQ0=0;OQ=1978.62;QD=41.22;SB=-1006.27	GT:AD:DP:GL:GQ	1/1:0,47:46:-201.46,-13.86,-0.01:99
-chr1	4576947	rs2411887	C	T	275.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=58.35;MQ0=0;OQ=1931.75;QD=37.88;SB=-945.28	GT:AD:DP:GL:GQ	1/1:0,51:50:-196.78,-15.07,-0.02:99
-chr1	4577395	rs4403602	C	G	245.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=59.46;MQ0=0;OQ=1536.03;QD=35.72;SB=-775.22	GT:AD:DP:GL:GQ	1/1:0,43:41:-157.23,-12.38,-0.05:99
-chr1	4577589	rs7554628	T	C	1.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=57.95;MQ0=0;OQ=730.12;QD=22.82;SB=-185.76	GT:AD:DP:GL:GQ	1/1:0,31:25:-79.87,-10.17,-3.27:69.05
-chr1	4577983	rs7555011	T	C	161.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=59.09;MQ0=0;OQ=1457.56;QD=28.58;SB=-435.18	GT:AD:DP:GL:GQ	1/1:0,51:47:-149.39,-14.18,-0.05:99
-chr1	4578231	rs35259920	T	A	832.15	Indel	AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.20;MQ0=0;QD=28.69;SB=-10.00	GT:AD:DP:GL:GQ	1/1:1,28:26:-86.82,-7.84,-0.02:78.19
-chr1	4578361	rs7554792	A	C	303.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.92;MQ0=0;OQ=236.46;QD=26.27;SB=-138.00	GT:AD:DP:GL:GQ	1/1:0,9:8:-27.23,-2.41,-0.00:24.06
-chr1	4578400	.	A	T	84.19	Indel	AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=46.65;MQ0=0;QD=6.01;SB=-42.96	GT:AD:DP:GL:GQ	0/1:10,4:13:-15.62,-3.92,-34.97:99
-chr1	4579811	rs1905304	C	A	19.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=5;HaplotypeScore=0.00;MQ=58.10;MQ0=0;OQ=2321.72;QD=36.28;SB=-1110.43	GT:AD:DP:GL:GQ	1/1:0,64:63:-235.77,-18.97,-0.01:99
-chr1	4580559	rs56945522	G	A	92.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=61.48;MQ0=0;OQ=2293.20;QD=38.87;SB=-907.71	GT:AD:DP:GL:GQ	1/1:0,59:58:-232.92,-17.48,-0.02:99
-chr1	4581964	rs6668002	T	C	241.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=60.00;MQ0=0;OQ=2274.26;QD=30.73;SB=-1092.12	GT:AD:DP:GL:GQ	1/1:0,73:71:-231.07,-21.41,-0.06:99
-chr1	4583570	rs1573748	A	G	1957.91	Indel	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.66;MQ=60.10;MQ0=0;QD=31.08;SB=-816.28	GT:AD:DP:GL:GQ	1/1:0,63:58:-199.41,-17.48,-0.04:99
-chr1	4584109	rs6657421	G	A	130.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.13;MQ0=0;OQ=1834.09;QD=38.21;SB=-703.35	GT:AD:DP:GL:GQ	1/1:0,48:47:-187.01,-14.16,-0.01:99
-chr1	4584165	rs6674936	T	C	66.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=2.13;MQ=59.25;MQ0=0;OQ=1819.57;QD=32.49;SB=-925.04	GT:AD:DP:GL:GQ	1/1:0,56:51:-185.56,-15.36,-0.01:99
-chr1	4585082	rs1107467	G	A	137.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=1423.05;QD=35.58;SB=-452.60	GT:AD:DP:GL:GQ	1/1:0,39:38:-145.91,-11.45,-0.02:99
-chr1	4585332	rs1483199	A	G	386.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2234.69;QD=31.04;SB=-675.88	GT:AD:DP:GL:GQ	1/1:0,72:67:-227.10,-20.19,-0.04:99
-chr1	4585508	rs875808	G	A	162.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.39;MQ=60.00;MQ0=0;OQ=2216.84;QD=38.89;SB=-1106.64	GT:AD:DP:GL:GQ	1/1:0,57:57:-225.29,-17.17,-0.02:99
-chr1	4585532	rs875807	A	G	300.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.66;MQ0=0;OQ=1870.43;QD=34.01;SB=-960.39	GT:AD:DP:GL:GQ	1/1:0,55:53:-190.65,-15.97,-0.02:99
-chr1	4585731	rs875806	G	C	165.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2133.21;QD=42.66;SB=-847.32	GT:AD:DP:GL:GQ	1/1:0,50:49:-216.92,-14.76,-0.01:99
-chr1	4586501	rs56028718	G	A	84.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=3.12;MQ=59.59;MQ0=0;OQ=1260.05;QD=18.53;SB=-634.67	GT:AD:DP:GL:GQ	0/1:31,37:66:-149.17,-19.88,-106.57:99
-chr1	4587142	rs2269620	C	T	114.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.59;MQ0=0;OQ=2196.52;QD=39.22;SB=-630.34	GT:AD:DP:GL:GQ	1/1:0,56:56:-223.26,-16.87,-0.02:99
-chr1	4587674	rs4654576	A	C	214.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=886.13;QD=32.82;SB=-420.04	GT:AD:DP:GL:GQ	1/1:0,27:26:-92.21,-7.83,-0.01:78.22
-chr1	4587807	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=2;HaplotypeScore=15.00;MQ=58.93;MQ0=0;OQ=113.78;QD=1.87;SB=74.25	GT:AD:DP:GL:GQ	0/1:34,27:42:-27.32,-12.66,-112.79:99
-chr1	4587893	rs6662425	C	G	115.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=59.36;MQ0=0;OQ=2651.42;QD=40.79;SB=-1007.19	GT:AD:DP:GL:GQ	1/1:0,65:61:-268.75,-18.38,-0.02:99
-chr1	4588021	rs6426430	G	T	639.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1436.10;QD=35.90;SB=-672.10	GT:AD:DP:GL:GQ	1/1:0,40:40:-147.21,-12.05,-0.01:99
-chr1	4590753	rs7527078	C	T	465.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.20;MQ0=0;OQ=2043.97;QD=40.08;SB=-576.76	GT:AD:DP:GL:GQ	1/1:0,51:50:-207.99,-15.06,-0.01:99
-chr1	4591042	rs4654577	A	G	251.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=58.37;MQ0=0;OQ=1466.76;QD=34.11;SB=-679.59	GT:AD:DP:GL:GQ	1/1:0,43:43:-150.28,-12.96,-0.02:99
-chr1	4592515	.	G	C	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.74;MQ=48.08;MQ0=6;OQ=54.55;QD=1.03;SB=38.38	GT:AD:DP:GL:GQ	0/1:45,8:39:-20.50,-11.76,-139.98:87.39
-chr1	4592571	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=14.42;MQ=41.26;MQ0=11;OQ=65.05;QD=1.07;SB=-23.62	GT:AD:DP:GL:GQ	0/1:49,12:36:-20.65,-10.86,-123.87:97.89
-chr1	4592585	.	G	C	20.06	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.14;MQ=40.25;MQ0=10;QD=0.33;SB=-5.33	GT:AD:DP:GL:GQ	0/1:54,7:37:-16.45,-11.17,-134.84:52.86
-chr1	4592620	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=1;HaplotypeScore=15.36;MQ=35.46;MQ0=10;OQ=92.00;QD=1.46;SB=0.26	GT:AD:DP:GL:GQ	0/1:54,9:42:-25.15,-12.66,-150.31:99
-chr1	4592627	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=1;HaplotypeScore=16.06;MQ=35.72;MQ0=7;OQ=153.87;QD=2.75;SB=-54.16	GT:AD:DP:GL:GQ	0/1:46,10:37:-29.82,-11.15,-128.78:99
-chr1	4592634	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=17.36;MQ=35.58;MQ0=7;OQ=255.85;QD=4.57;SB=-124.48	GT:AD:DP:GL:GQ	0/1:41,15:33:-38.82,-9.95,-100.95:99
-chr1	4592642	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=1;HaplotypeScore=28.60;MQ=35.10;MQ0=5;OQ=106.45;QD=2.01;SB=3.57	GT:AD:DP:GL:GQ	0/1:41,12:38:-25.38,-11.45,-106.45:99
-chr1	4592649	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=27.47;MQ=35.61;MQ0=5;OQ=241.86;QD=4.65;SB=-127.53	GT:AD:DP:GL:GQ	0/1:36,16:37:-38.62,-11.15,-91.45:99
-chr1	4592656	.	C	A	10.05	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=32.68;MQ=34.61;MQ0=6;QD=0.18;SB=-22.79	GT:AD:DP:GL:GQ	0/1:46,10:31:-13.58,-9.34,-92.74:42.43
-chr1	4592670	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=26.44;MQ=31.55;MQ0=8;OQ=92.67;QD=1.54;SB=-36.78	GT:AD:DP:GL:GQ	0/1:47,13:38:-24.00,-11.45,-105.70:99
-chr1	4592691	.	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=17.99;MQ=28.93;MQ0=15;OQ=182.04;QD=2.64;SB=-62.36	GT:AD:DP:GL:GQ	0/1:58,11:38:-32.95,-11.46,-95.16:99
-chr1	4592711	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=1;HaplotypeScore=17.40;MQ=30.26;MQ0=13;OQ=418.56;QD=8.21;SB=-184.24	GT:AD:DP:GL:GQ	0/1:21,29:22:-51.78,-6.64,-35.47:99
-chr1	4592725	rs7533445	C	G	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=21.58;MQ=31.66;MQ0=7;OQ=325.36;QD=9.30;SB=-162.82	GT:AD:DP:GL:GQ	0/1:18,17:13:-39.75,-3.93,-11.50:75.69
-chr1	4592733	.	C	A	17.31	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=13.87;MQ=30.28;MQ0=8;QD=0.56;SB=5.02	GT:AD:DP:GL:GQ	0/1:27,3:12:-8.63,-3.62,-27.94:50.06
-chr1	4592740	rs7537972	A	C	0.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=10.05;MQ=27.67;MQ0=11;OQ=104.80;QD=3.38;SB=-67.99	GT:AD:DP:GL:GQ	0/1:22,9:8:-16.18,-2.41,-9.32:69.09
-chr1	4592747	rs7537975	A	C	18.33	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=1;HaplotypeScore=8.21;MQ=28.35;MQ0=11;QD=0.76;SB=-7.00	GT:AD:DP:GL:GQ	0/1:17,7:4:-6.32,-1.21,-6.24:50.29
-chr1	4592767	rs7533530	C	G	42.27	HARD_TO_VALIDATE;LowQual	AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=11.04;MQ=30.06;MQ0=7;QD=3.02;SB=-43.89	GT:AD:DP:GL:GQ	1/1:8,5:2:-7.64,-0.61,-0.00:6.02
-chr1	4592837	.	C	G	13.29	LowQual	AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=1;HaplotypeScore=4.96;MQ=12.04;MQ0=3;QD=2.66;SB=-10.00	GT:AD:DP:GL:GQ	0/1:4,1:1:-4.59,-0.30,-0.00:1.76
-chr1	4592901	.	T	C	5.07	PASS	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=42.32;MQ0=2;OQ=126.93;QD=6.35;SB=-77.93	GT:AD:DP:GL:GQ	0/1:9,11:15:-20.50,-4.52,-36.40:99
-chr1	4592906	.	T	C	0.11	PASS	AC=2;AF=1.00;AN=2;DP=23;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=41.84;MQ0=3;OQ=578.85;QD=25.17;SB=-157.83	GT:AD:DP:GL:GQ	1/1:0,23:17:-61.47,-5.12,-0.00:51.15
-chr1	4592960	.	G	C	0.12	PASS	AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=4.10;MQ=41.92;MQ0=6;OQ=217.66;QD=2.79;SB=-81.57	GT:AD:DP:GL:GQ	0/1:56,22:47:-39.23,-14.18,-153.65:99
-chr1	4592971	.	T	C	18.17	PASS	AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=3.38;MQ=41.63;MQ0=7;OQ=666.60;QD=8.55;SB=-228.49	GT:AD:DP:GL:GQ	0/1:28,48:45:-83.52,-13.57,-69.37:99
-chr1	4592996	.	A	C	48.48	HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=4.82;MQ=40.87;MQ0=9;QD=0.70;SB=-26.49	GT:AD:DP:GL:GQ	0/1:54,15:47:-22.29,-14.16,-139.10:81.32
-chr1	4593024	.	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=14.22;MQ=41.13;MQ0=10;OQ=73.34;QD=1.41;SB=-39.79	GT:AD:DP:GL:GQ	0/1:35,17:30:-19.66,-9.04,-83.95:99
-chr1	4593037	.	G	C	11.64	DPFilter;HARD_TO_VALIDATE;LowQual	AC=1;AF=0.50;AN=2;DP=41;Dels=0.02;HRun=0;HaplotypeScore=21.01;MQ=42.10;MQ0=8;QD=0.28;SB=26.12	GT:AD:DP:GL:GQ	0/1:33,7:20:-10.45,-6.03,-72.33:44.16
-chr1	4593066	.	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=16.64;MQ=38.83;MQ0=9;OQ=95.97;QD=2.23;SB=-64.04	GT:AD:DP:GL:GQ	0/1:31,12:22:-19.51,-6.63,-53.44:99
-chr1	4593072	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=12.35;MQ=36.60;MQ0=11;OQ=58.68;QD=1.25;SB=-50.80	GT:AD:DP:GL:GQ	0/1:40,7:24:-16.40,-7.25,-78.79:91.52
-chr1	4593128	.	G	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=7.00;MQ=42.60;MQ0=10;OQ=87.22;QD=1.86;SB=11.06	GT:AD:DP:GL:GQ	0/1:39,8:24:-19.25,-7.24,-80.14:99
-chr1	4593184	.	G	C	48.23	LowQual	AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=5.25;MQ=50.03;MQ0=1;QD=1.51;SB=-24.84	GT:AD:DP:GL:GQ	0/1:27,5:22:-14.75,-6.64,-72.91:81.07
-chr1	4593205	.	G	C	35.18	LowQual	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=3.11;MQ=47.39;MQ0=4;QD=0.88;SB=-15.82	GT:AD:DP:GL:GQ	0/1:35,5:30:-15.86,-9.06,-106.35:68.02
-chr1	4593241	rs12752874	A	C	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=2.83;MQ=43.47;MQ0=5;OQ=55.07;QD=1.28;SB=-27.98	GT:AD:DP:GL:GQ	0/1:30,13:26:-16.62,-7.83,-74.90:87.90
-chr1	4594330	rs34642555	G	A	223.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.30;MQ=59.56;MQ0=0;OQ=741.34;QD=13.99;SB=-378.39	GT:AD:DP:GL:GQ	0/1:29,24:52:-93.10,-15.68,-88.17:99
-chr1	4599106	rs10753383	T	G	347.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.01;MQ0=0;OQ=412.58;QD=12.50;SB=-151.92	GT:AD:DP:GL:GQ	0/1:17,16:32:-54.18,-9.64,-62.40:99
-chr1	4599463	rs7513957	G	C	46.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=2;HaplotypeScore=1.18;MQ=57.56;MQ0=0;OQ=399.60;QD=12.11;SB=-196.33	GT:AD:DP:GL:GQ	0/1:20,13:31:-52.60,-9.35,-73.06:99
-chr1	4600658	rs12122002	G	A	36.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=2.74;MQ=58.47;MQ0=0;OQ=1298.26;QD=21.28;SB=-656.75	GT:AD:DP:GL:GQ	0/1:24,37:59:-150.88,-17.77,-80.26:99
-chr1	4601609	rs55711858	A	G	373.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.77;MQ0=0;OQ=1068.23;QD=10.68;SB=-465.77	GT:AD:DP:GL:GQ	0/1:56,44:100:-140.25,-30.14,-225.51:99
-chr1	4601750	rs2411891	G	A	156.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=3;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1085.67;QD=16.96;SB=-561.13	GT:AD:DP:GL:GQ	0/1:31,33:63:-130.83,-18.98,-106.71:99
-chr1	4602156	rs61764994	A	G	74.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=60.00;MQ0=0;OQ=509.21;QD=7.60;SB=-244.13	GT:AD:DP:GL:GQ	0/1:40,27:63:-73.19,-18.99,-161.05:99
-chr1	4602810	rs61764995	C	T	382.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=850.22;QD=17.35;SB=-339.44	GT:AD:DP:GL:GQ	0/1:22,27:48:-102.77,-14.46,-79.78:99
-chr1	4602966	rs34993795	C	T	235.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=59.03;MQ0=0;OQ=1118.32;QD=16.69;SB=-465.43	GT:AD:DP:GL:GQ	0/1:34,33:66:-135.00,-19.88,-119.08:99
-chr1	4604462	rs2035452	C	G	271.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=397.56;QD=15.29;SB=-96.30	GT:AD:DP:GL:GQ	0/1:14,12:25:-50.58,-7.54,-52.60:99
-chr1	4606381	rs10915576	T	C	220.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=882.56;QD=16.97;SB=-410.32	GT:AD:DP:GL:GQ	0/1:21,31:51:-106.90,-15.36,-86.72:99
-chr1	4606615	rs12125737	C	T	418.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.71;MQ0=0;OQ=1209.07;QD=18.60;SB=-598.14	GT:AD:DP:GL:GQ	0/1:29,36:62:-142.87,-18.68,-88.99:99
-chr1	4607135	rs12122921	G	A	2.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=10.90;MQ=57.40;MQ0=0;OQ=881.42;QD=13.16;SB=-408.91	GT:AD:DP:GL:GQ	0/1:36,31:56:-108.31,-16.88,-93.30:99
-chr1	4607451	rs28759408	G	T	57.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=5.28;MQ=57.88;MQ0=1;OQ=710.71;QD=10.45;SB=-279.36	GT:AD:DP:GL:GQ	0/1:39,29:61:-92.73,-18.38,-123.60:99
-chr1	4608914	rs7535194	C	A	224.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=57.78;MQ0=0;OQ=1544.72;QD=16.26;SB=-662.45	GT:AD:DP:GL:GQ	0/1:44,51:95:-186.37,-28.61,-160.23:99
-chr1	4609123	.	C	T	10.31	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=56.96;MQ0=2;QD=0.17;SB=19.65	GT:AD:DP:GL:GQ	0/1:53,6:55:-20.84,-16.57,-182.90:42.72
-chr1	4609208	rs7539862	A	C	150.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=258.18;QD=5.87;SB=-149.80	GT:AD:DP:GL:GQ	0/1:32,12:43:-42.05,-12.95,-117.22:99
-chr1	4609234	.	G	A	18.35	LowQual	AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=3.99;MQ=56.87;MQ0=1;QD=0.46;SB=-22.94	GT:AD:DP:GL:GQ	0/1:35,5:36:-15.96,-10.84,-114.15:51.13
-chr1	4609248	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=1;HaplotypeScore=35.67;MQ=56.49;MQ0=1;OQ=135.28;QD=2.42;SB=50.20	GT:AD:DP:GL:GQ	0/1:46,10:51:-32.18,-15.36,-170.39:99
-chr1	4609249	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=97.70;MQ=56.55;MQ0=1;OQ=82.36;QD=1.44;SB=50.16	GT:AD:DP:GL:GQ	0/1:47,10:52:-27.18,-15.66,-163.18:99
-chr1	4609260	rs61764999	C	T	6.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=5.81;MQ=56.56;MQ0=1;OQ=641.66;QD=10.03;SB=-130.56	GT:AD:DP:GL:GQ	0/1:42,22:63:-86.43,-18.98,-148.93:99
-chr1	4609527	rs4654581	C	G	33.46	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=59.43;MQ0=0;QD=0.67;SB=28.36	GT:AD:DP:GL:GQ	0/1:45,5:49:-21.39,-14.76,-192.44:66.29
-chr1	4610341	rs10799250	T	C	191.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.62;MQ0=0;OQ=886.46;QD=10.43;SB=-400.18	GT:AD:DP:GL:GQ	0/1:51,34:83:-116.93,-25.00,-199.77:99
-chr1	4610346	rs10915577	A	G	286.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=59.62;MQ0=0;OQ=927.42;QD=11.04;SB=-372.61	GT:AD:DP:GL:GQ	0/1:50,34:82:-120.73,-24.70,-201.64:99
-chr1	4611161	rs12405862	C	T	55.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=2.70;MQ=59.65;MQ0=0;OQ=705.61;QD=13.31;SB=-372.08	GT:AD:DP:GL:GQ	0/1:30,23:53:-89.81,-15.97,-107.55:99
-chr1	4612905	rs1466520	A	G	508.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.49;MQ0=0;OQ=1092.36;QD=32.13;SB=-567.90	GT:AD:DP:GL:GQ	1/1:0,34:32:-112.83,-9.64,-0.01:96.28
-chr1	4613357	rs4144451	T	C	2.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=4;HaplotypeScore=1.16;MQ=60.00;MQ0=0;OQ=378.96;QD=8.81;SB=-197.21	GT:AD:DP:GL:GQ	0/1:27,16:40:-53.24,-12.06,-95.58:99
-chr1	4616788	rs12127797	G	C	214.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=4.57;MQ=59.39;MQ0=0;OQ=1251.84;QD=16.47;SB=-458.74	GT:AD:DP:GL:GQ	0/1:41,34:72:-150.17,-21.70,-159.82:99
-chr1	4619890	rs7544371	G	A	283.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.45;MQ0=0;OQ=1234.26;QD=22.04;SB=-596.70	GT:AD:DP:GL:GQ	0/1:21,35:56:-143.59,-16.88,-63.94:99
-chr1	4621067	rs6426432	G	C	375.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=60.00;MQ0=0;OQ=975.42;QD=15.73;SB=-398.88	GT:AD:DP:GL:GQ	0/1:35,27:62:-119.51,-18.68,-150.23:99
-chr1	4621285	rs6658403	C	T	186.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=59.63;MQ0=0;OQ=651.01;QD=10.50;SB=-348.83	GT:AD:DP:GL:GQ	0/1:39,23:60:-86.46,-18.07,-139.05:99
-chr1	4622291	rs2035454	A	G	361.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=59.15;MQ0=0;OQ=932.32;QD=13.13;SB=-403.21	GT:AD:DP:GL:GQ	0/1:39,32:70:-117.60,-21.09,-152.00:99
-chr1	4622303	rs1531830	T	C	306.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=1.43;MQ=59.12;MQ0=0;OQ=753.21;QD=10.92;SB=-275.11	GT:AD:DP:GL:GQ	0/1:39,30:68:-99.09,-20.49,-155.18:99
-chr1	4623109	rs10799251	G	A	463.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=863.86;QD=15.43;SB=-362.38	GT:AD:DP:GL:GQ	0/1:30,26:56:-106.54,-16.87,-110.57:99
-chr1	4623282	rs10799252	G	C	114.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=53.79;MQ0=0;OQ=899.36;QD=20.92;SB=-445.94	GT:AD:DP:GL:GQ	0/1:17,26:42:-105.88,-12.66,-71.37:99
-chr1	4623298	rs10799253	T	C	313.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=52.77;MQ0=0;OQ=616.14;QD=14.00;SB=-298.33	GT:AD:DP:GL:GQ	0/1:18,26:39:-76.66,-11.76,-55.81:99
-chr1	4623777	rs10915578	A	G	84.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=0.82;MQ=58.86;MQ0=0;OQ=552.36;QD=9.69;SB=-296.32	GT:AD:DP:GL:GQ	0/1:35,22:57:-75.70,-17.18,-138.68:99
-chr1	4623873	rs10915579	T	C	271.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=57.84;MQ0=0;OQ=661.07;QD=10.17;SB=-259.38	GT:AD:DP:GL:GQ	0/1:40,25:64:-88.68,-19.29,-154.96:99
-chr1	4624091	rs12135245	G	C	41.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=1.89;MQ=59.70;MQ0=0;OQ=1186.96;QD=19.14;SB=-476.78	GT:AD:DP:GL:GQ	0/1:28,34:59:-139.77,-17.79,-108.63:99
-chr1	4624130	rs12140542	T	C	140.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=2.13;MQ=59.74;MQ0=0;OQ=656.89;QD=9.12;SB=-348.92	GT:AD:DP:GL:GQ	0/1:43,29:71:-90.37,-21.40,-172.64:99
-chr1	4624492	rs2035455	C	T	468.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=702.27;QD=12.54;SB=-335.31	GT:AD:DP:GL:GQ	0/1:34,22:55:-90.09,-16.58,-106.86:99
-chr1	4624817	rs17421247	C	T	331.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=59.65;MQ0=0;OQ=1014.16;QD=15.37;SB=-402.77	GT:AD:DP:GL:GQ	0/1:35,31:64:-123.99,-19.29,-104.67:99
-chr1	4626224	rs10915580	G	C	281.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=58.07;MQ0=0;OQ=1106.61;QD=18.14;SB=-348.42	GT:AD:DP:GL:GQ	0/1:31,30:61:-132.34,-18.40,-124.48:99
-chr1	4626314	rs12567266	T	C	443.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=51.48;MQ0=0;OQ=855.53;QD=18.20;SB=-345.35	GT:AD:DP:GL:GQ	0/1:19,28:47:-102.99,-14.16,-75.71:99
-chr1	4626341	rs12752003	A	G	152.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=47.43;MQ0=0;OQ=459.90;QD=12.10;SB=-75.78	GT:AD:DP:GL:GQ	0/1:17,21:35:-59.82,-10.55,-67.90:99
-chr1	4626392	rs12565906	G	A	175.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=1.36;MQ=51.30;MQ0=0;OQ=647.78;QD=15.42;SB=-283.17	GT:AD:DP:GL:GQ	0/1:21,21:41:-80.41,-12.35,-73.25:99
-chr1	4626545	rs12137938	T	C	1.78	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=2;HaplotypeScore=6.74;MQ=54.18;MQ0=1;OQ=220.73;QD=6.49;SB=-111.61	GT:AD:DP:GL:GQ	0/1:20,14:29:-34.11,-8.75,-66.24:99
-chr1	4626759	rs10799254	A	G	12.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=7.18;MQ=56.44;MQ0=0;OQ=516.47;QD=13.59;SB=-271.00	GT:AD:DP:GL:GQ	0/1:15,23:33:-64.88,-9.95,-53.03:99
-chr1	4626886	rs12137092	A	G	70.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=50.68;MQ0=3;OQ=425.89;QD=8.19;SB=-166.49	GT:AD:DP:GL:GQ	0/1:30,22:47:-60.04,-14.17,-111.36:99
-chr1	4627103	rs6663166	A	G	61.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=1.05;MQ=58.88;MQ0=0;OQ=507.83;QD=9.40;SB=-149.43	GT:AD:DP:GL:GQ	0/1:33,21:53:-70.04,-15.97,-130.76:99
-chr1	4627150	rs12138132	T	C	261.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.66;MQ0=0;OQ=429.65;QD=7.81;SB=-213.21	GT:AD:DP:GL:GQ	0/1:37,18:55:-62.82,-16.57,-149.18:99
-chr1	4627390	rs12133670	G	A	454.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.64;MQ0=0;OQ=810.38;QD=15.58;SB=-415.38	GT:AD:DP:GL:GQ	0/1:28,24:51:-99.69,-15.36,-91.80:99
-chr1	4628089	rs12133909	G	T	196.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=59.88;MQ0=0;OQ=673.35;QD=10.52;SB=-318.02	GT:AD:DP:GL:GQ	0/1:40,24:62:-89.30,-18.68,-116.17:99
-chr1	4628258	rs6703379	G	A	0.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=13.50;MQ=55.99;MQ0=1;OQ=611.30;QD=11.32;SB=-213.68	GT:AD:DP:GL:GQ	0/1:33,21:47:-78.59,-14.17,-86.02:99
-chr1	4628265	rs6672122	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.04;HRun=0;HaplotypeScore=25.47;MQ=56.13;MQ0=1;OQ=602.93;QD=10.77;SB=-162.48	GT:AD:DP:GL:GQ	0/1:29,25:52:-78.65,-15.07,-102.50:99
-chr1	4628677	rs6703802	G	A	334.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=937.15;QD=18.02;SB=-393.92	GT:AD:DP:GL:GQ	0/1:24,28:51:-112.37,-15.37,-73.40:99
-chr1	4630143	rs4654582	T	A	2.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=10.18;MQ=58.22;MQ0=0;OQ=526.78;QD=10.54;SB=-97.11	GT:AD:DP:GL:GQ	0/1:25,22:38:-67.41,-11.45,-72.86:99
-chr1	4630312	rs4654583	T	C	361.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1108.52;QD=16.07;SB=-319.34	GT:AD:DP:GL:GQ	0/1:31,38:68:-134.62,-20.48,-127.03:99
-chr1	4630977	rs12141394	A	G	593.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.47;MQ0=0;OQ=900.99;QD=13.45;SB=-440.92	GT:AD:DP:GL:GQ	0/1:31,36:65:-112.97,-19.59,-120.61:99
-chr1	4631016	rs12139858	C	T	367.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=891.25;QD=15.37;SB=-441.97	GT:AD:DP:GL:GQ	0/1:31,27:57:-109.59,-17.18,-94.97:99
-chr1	4631110	rs12141432	A	G	226.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=58.67;MQ0=0;OQ=787.70;QD=12.50;SB=-349.34	GT:AD:DP:GL:GQ	0/1:35,28:62:-100.73,-18.67,-138.62:99
-chr1	4631448	rs4144452	A	G	502.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=648.74;QD=10.64;SB=-332.00	GT:AD:DP:GL:GQ	0/1:33,28:59:-85.94,-17.78,-131.20:99
-chr1	4631992	rs12138000	G	A	396.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=1014.12;QD=15.85;SB=-413.79	GT:AD:DP:GL:GQ	0/1:32,32:63:-123.69,-18.99,-104.09:99
-chr1	4632333	rs1564667	A	G	289.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.70;MQ0=0;OQ=656.79;QD=8.64;SB=-323.90	GT:AD:DP:GL:GQ	0/1:44,32:72:-90.67,-21.71,-171.92:99
-chr1	4633099	rs4654585	T	C	336.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.88;MQ=59.60;MQ0=0;OQ=968.60;QD=16.70;SB=-498.14	GT:AD:DP:GL:GQ	0/1:26,32:58:-117.61,-17.47,-104.79:99
-chr1	4633208	rs4654586	T	A	613.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2145.98;QD=37.00;SB=-956.61	GT:AD:DP:GL:GQ	1/1:0,58:58:-218.20,-17.47,-0.01:99
-chr1	4633215	rs4654455	T	C	484.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1991.47;QD=34.94;SB=-790.66	GT:AD:DP:GL:GQ	1/1:0,57:56:-202.75,-16.87,-0.02:99
-chr1	4636316	rs10915584	G	T	377.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.90;MQ=59.34;MQ0=0;OQ=844.77;QD=13.41;SB=-404.78	GT:AD:DP:GL:GQ	0/1:32,31:58:-105.23,-17.47,-102.72:99
-chr1	4637265	.	T	C	225.79	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=776.05;QD=14.64;SB=-255.94	GT:AD:DP:GL:GQ	0/1:26,27:53:-96.86,-15.97,-103.32:99
-chr1	4638345	.	G	A	67.79	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.29;MQ0=0;OQ=991.16;QD=18.70;SB=-412.80	GT:AD:DP:GL:GQ	0/1:24,29:51:-117.77,-15.37,-70.20:99
-chr1	4642883	rs2859392	C	G	348.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=1.26;MQ=59.71;MQ0=0;OQ=833.93;QD=12.83;SB=-304.28	GT:AD:DP:GL:GQ	0/1:37,28:61:-105.07,-18.39,-160.99:99
-chr1	4643564	rs763238	C	T	66.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.77;MQ0=0;OQ=1042.05;QD=19.66;SB=-208.90	GT:AD:DP:GL:GQ	0/1:21,32:50:-122.56,-15.07,-63.38:99
-chr1	4644154	rs4993529	C	T	334.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=60.00;MQ0=0;OQ=1314.27;QD=19.62;SB=-670.69	GT:AD:DP:GL:GQ	0/1:27,40:65:-154.30,-19.59,-85.13:99
-chr1	4646074	rs242043	T	C	1.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=13.28;MQ=59.47;MQ0=0;OQ=1026.27;QD=14.45;SB=-395.20	GT:AD:DP:GL:GQ	0/1:34,37:70:-127.00,-21.09,-134.39:99
-chr1	4646297	rs61765026	G	A	183.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=1519.28;QD=17.87;SB=-749.72	GT:AD:DP:GL:GQ	0/1:39,46:84:-180.53,-25.32,-123.19:99
-chr1	4646496	rs10915587	C	T	288.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.87;MQ=60.00;MQ0=0;OQ=1042.81;QD=16.04;SB=-490.54	GT:AD:DP:GL:GQ	0/1:32,33:64:-126.86,-19.30,-98.43:99
-chr1	4646880	rs17344953	G	A	102.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=5.33;MQ=59.62;MQ0=0;OQ=1025.96;QD=17.10;SB=-396.44	GT:AD:DP:GL:GQ	0/1:26,33:55:-122.45,-16.57,-85.52:99
-chr1	4647597	rs12747700	G	A	323.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=59.29;MQ0=0;OQ=999.88;QD=16.95;SB=-503.14	GT:AD:DP:GL:GQ	0/1:28,31:57:-120.45,-17.18,-86.54:99
-chr1	4648034	rs6684528	G	T	259.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.52;MQ0=0;OQ=808.60;QD=16.85;SB=-296.69	GT:AD:DP:GL:GQ	0/1:20,28:48:-98.60,-14.46,-70.03:99
-chr1	4648165	rs1076944	G	T	243.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=58.38;MQ0=0;OQ=602.15;QD=11.58;SB=-146.14	GT:AD:DP:GL:GQ	0/1:27,25:49:-78.26,-14.76,-94.92:99
-chr1	4648936	rs4092257	G	A	283.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=57.56;MQ0=0;OQ=450.85;QD=13.66;SB=-204.90	GT:AD:DP:GL:GQ	0/1:17,16:32:-58.02,-9.65,-54.32:99
-chr1	4649873	rs187148	C	G	93.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=3.10;MQ=59.76;MQ0=0;OQ=296.24;QD=8.98;SB=-132.74	GT:AD:DP:GL:GQ	0/1:22,11:31:-42.26,-9.35,-85.65:99
-chr1	4651624	.	C	A	146.63	PASS	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=797.72;QD=17.34;SB=-280.69	GT:AD:DP:GL:GQ	0/1:17,29:42:-95.71,-12.66,-50.88:99
-chr1	4652138	rs171380	A	G	10.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=3.45;MQ=58.45;MQ0=0;OQ=324.85;QD=10.83;SB=-162.34	GT:AD:DP:GL:GQ	0/1:14,16:28:-44.21,-8.45,-55.22:99
-chr1	4653917	rs7525374	A	G	301.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=624.45;QD=13.58;SB=-244.30	GT:AD:DP:GL:GQ	0/1:21,25:46:-79.59,-13.86,-85.75:99
-chr1	4653963	rs7528195	T	C	276.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.00;MQ0=0;OQ=479.46;QD=11.42;SB=-265.36	GT:AD:DP:GL:GQ	0/1:21,21:39:-62.99,-11.76,-78.32:99
-chr1	4654404	rs1076945	C	T	142.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=4.82;MQ=58.13;MQ0=0;OQ=818.85;QD=13.65;SB=-233.53	GT:AD:DP:GL:GQ	0/1:33,27:59:-102.95,-17.78,-107.70:99
-chr1	4655581	.	C	T	85.40	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=59.44;MQ0=0;OQ=1224.61;QD=16.55;SB=-495.16	GT:AD:DP:GL:GQ	0/1:36,38:73:-147.75,-22.00,-119.12:99
-chr1	4656328	rs10915588	T	C	75.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=629.83;QD=11.88;SB=-281.45	GT:AD:DP:GL:GQ	0/1:30,23:52:-81.93,-15.66,-115.22:99
-chr1	4656461	rs3886389	A	G	234.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=59.53;MQ0=0;OQ=467.67;QD=9.54;SB=-232.27	GT:AD:DP:GL:GQ	0/1:28,21:49:-64.82,-14.77,-113.76:99
-chr1	4657736	rs6669203	T	C	161.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=58.29;MQ0=0;OQ=397.97;QD=9.71;SB=-145.57	GT:AD:DP:GL:GQ	0/1:23,18:37:-54.24,-11.16,-78.29:99
-chr1	4658187	rs12121882	C	T	363.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=849.30;QD=18.07;SB=-359.52	GT:AD:DP:GL:GQ	0/1:21,26:46:-102.08,-13.87,-62.23:99
-chr1	4659178	rs242054	A	G	123.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=57.49;MQ0=0;OQ=1370.79;QD=30.46;SB=-653.90	GT:AD:DP:GL:GQ	1/1:0,45:44:-140.71,-13.27,-0.04:99
-chr1	4660176	rs61765031	A	G	230.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=59.01;MQ0=0;OQ=811.95;QD=12.30;SB=-390.16	GT:AD:DP:GL:GQ	0/1:34,31:61:-102.85,-18.37,-129.51:99
-chr1	4663049	rs6686733	T	C	216.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=4.72;MQ=59.04;MQ0=0;OQ=1082.32;QD=15.92;SB=-503.34	GT:AD:DP:GL:GQ	0/1:29,39:64:-130.80,-19.28,-107.21:99
-chr1	4663261	rs6681520	C	T	227.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1006.77;QD=22.88;SB=-416.49	GT:AD:DP:GL:GQ	0/1:15,29:43:-116.92,-12.96,-47.72:99
-chr1	4665250	rs12131565	A	G	49.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=2.95;MQ=47.43;MQ0=2;OQ=1030.19;QD=13.38;SB=-443.10	GT:AD:DP:GL:GQ	0/1:41,36:75:-128.89,-22.59,-163.25:99
-chr1	4665448	rs10915590	T	C	343.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.85;MQ0=0;OQ=469.57;QD=9.58;SB=-224.22	GT:AD:DP:GL:GQ	0/1:29,20:48:-64.71,-14.47,-110.90:99
-chr1	4665815	rs10915592	T	C	6.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=2.44;MQ=60.00;MQ0=0;OQ=940.71;QD=17.75;SB=-259.53	GT:AD:DP:GL:GQ	0/1:21,32:50:-112.42,-15.06,-71.48:99
-chr1	4667613	rs2101196	A	G	254.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=2.34;MQ=56.97;MQ0=0;OQ=1013.81;QD=15.13;SB=-354.95	GT:AD:DP:GL:GQ	0/1:32,35:65:-124.25,-19.58,-123.74:99
-chr1	4667836	.	T	C	82.17	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=758.61;QD=12.24;SB=-402.64	GT:AD:DP:GL:GQ	0/1:31,31:61:-97.53,-18.39,-127.98:99
-chr1	4667882	rs2086718	C	T	43.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.02;HRun=0;HaplotypeScore=5.21;MQ=57.79;MQ0=0;OQ=518.41;QD=9.43;SB=-229.72	GT:AD:DP:GL:GQ	0/1:31,22:40:-66.89,-11.76,-68.62:99
-chr1	4667894	.	G	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=12;HaplotypeScore=6.56;MQ=55.45;MQ0=0;OQ=63.00;QD=0.98;SB=-8.73	GT:AD:DP:GL:GQ	0/1:54,10:56:-26.47,-16.89,-148.75:95.84
-chr1	4668291	rs6670802	G	A	143.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.43;MQ=56.73;MQ0=0;OQ=372.96;QD=8.29;SB=-147.60	GT:AD:DP:GL:GQ	0/1:28,16:38:-52.04,-11.46,-80.12:99
-chr1	4668400	rs6688423	T	C	371.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=710.41;QD=13.16;SB=-359.33	GT:AD:DP:GL:GQ	0/1:26,28:52:-89.99,-15.67,-104.81:99
-chr1	4668882	.	T	C	49.86	LowQual	AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=3;HaplotypeScore=9.17;MQ=57.66;MQ0=0;QD=2.49;SB=-0.98	GT:AD:DP:GL:GQ	0/1:11,9:11:-11.59,-3.32,-24.54:82.70
-chr1	4669925	rs12760917	T	C	439.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.29;MQ0=0;OQ=917.38;QD=14.11;SB=-279.27	GT:AD:DP:GL:GQ	0/1:29,36:64:-114.31,-19.29,-115.57:99
-chr1	4670306	rs4654594	T	C	240.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=58.06;MQ0=0;OQ=1070.08;QD=17.54;SB=-482.88	GT:AD:DP:GL:GQ	0/1:21,40:58:-127.77,-17.48,-76.71:99
-chr1	4670764	rs1483197	T	C	225.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=4.25;MQ=58.29;MQ0=0;OQ=709.74;QD=13.65;SB=-285.29	GT:AD:DP:GL:GQ	0/1:22,29:49:-89.03,-14.77,-80.10:99
-chr1	4670879	.	G	T	21.82	PASS	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=60.00;MQ0=0;OQ=722.25;QD=15.70;SB=-186.19	GT:AD:DP:GL:GQ	0/1:22,24:42:-88.16,-12.65,-60.03:99
-chr1	4671525	rs989309	G	C	65.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=2.50;MQ=60.00;MQ0=0;OQ=327.78;QD=9.93;SB=-148.55	GT:AD:DP:GL:GQ	0/1:21,12:30:-45.12,-9.05,-74.66:99
-chr1	4671555	rs989310	G	C	120.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=60.00;MQ0=0;OQ=521.90;QD=14.11;SB=-193.59	GT:AD:DP:GL:GQ	0/1:21,16:35:-66.02,-10.55,-86.58:99
-chr1	4671913	rs1061968	T	C	32.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=58.55;MQ0=0;OQ=101.72;QD=6.36;SB=-10.00	GT:AD:DP:GL:GQ	0/1:10,6:16:-18.28,-4.82,-40.28:99
-chr1	4672577	rs242056	G	A	47.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.45;MQ0=0;OQ=1114.83;QD=37.16;SB=-369.99	GT:AD:DP:GL:GQ	1/1:0,30:28:-115.07,-8.43,-0.01:84.28
-chr1	4673126	rs2071999	A	C	360.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=60.00;MQ0=0;OQ=766.03;QD=12.77;SB=-408.20	GT:AD:DP:GL:GQ	0/1:27,33:59:-97.67,-17.78,-97.47:99
-chr1	4673232	rs56401224	C	G	273.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.62;MQ=59.63;MQ0=0;OQ=825.52;QD=16.51;SB=-362.08	GT:AD:DP:GL:GQ	0/1:25,25:46:-99.70,-13.86,-96.30:99
-chr1	4673712	rs242057	G	A	40.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=3;HaplotypeScore=2.46;MQ=59.65;MQ0=0;OQ=947.24;QD=14.35;SB=-485.02	GT:AD:DP:GL:GQ	0/1:36,30:63:-116.99,-18.98,-120.15:99
-chr1	4674298	rs242058	T	C	345.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.63;MQ0=0;OQ=778.59;QD=15.27;SB=-272.44	GT:AD:DP:GL:GQ	0/1:23,28:50:-96.21,-15.07,-89.60:99
-chr1	4676145	rs4654595	A	C	407.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2257.07;QD=35.83;SB=-1055.12	GT:AD:DP:GL:GQ	1/1:0,63:63:-229.31,-18.97,-0.02:99
-chr1	4676402	rs4654596	G	A	207.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.44;MQ0=0;OQ=2768.52;QD=37.41;SB=-1042.40	GT:AD:DP:GL:GQ	1/1:0,74:71:-280.46,-21.39,-0.02:99
-chr1	4678092	rs3766959	C	T	358.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.73;MQ0=0;OQ=1524.54;QD=23.10;SB=-743.34	GT:AD:DP:GL:GQ	0/1:22,44:65:-175.33,-19.59,-68.56:99
-chr1	4679148	rs242040	A	G	228.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=60.00;MQ0=0;OQ=836.32;QD=13.07;SB=-312.23	GT:AD:DP:GL:GQ	0/1:34,30:63:-105.89,-18.98,-137.28:99
-chr1	4679557	rs242041	G	C	23.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=3;HaplotypeScore=1.52;MQ=58.81;MQ0=0;OQ=500.09;QD=9.81;SB=-250.11	GT:AD:DP:GL:GQ	0/1:32,19:47:-67.48,-14.18,-123.03:99
-chr1	4681011	rs3820251	C	T	321.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=59.05;MQ0=0;OQ=1264.98;QD=15.06;SB=-599.08	GT:AD:DP:GL:GQ	0/1:45,39:83:-154.80,-25.02,-140.75:99
-chr1	4683002	rs12566272	G	A	75.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=6.06;MQ=59.60;MQ0=0;OQ=811.79;QD=14.00;SB=-379.10	GT:AD:DP:GL:GQ	0/1:30,28:55:-101.04,-16.58,-98.62:99
-chr1	4683215	rs12085854	C	T	250.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.71;MQ0=0;OQ=595.12;QD=16.53;SB=-237.77	GT:AD:DP:GL:GQ	0/1:12,24:28:-71.24,-8.44,-31.48:99
-chr1	4684416	rs3820252	C	T	67.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.40;MQ=59.16;MQ0=0;OQ=1099.71;QD=21.99;SB=-407.20	GT:AD:DP:GL:GQ	0/1:18,32:50:-128.32,-15.07,-57.31:99
-chr1	4684710	rs4554693	C	T	27.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.03;MQ=59.86;MQ0=0;OQ=1309.90;QD=22.98;SB=-464.01	GT:AD:DP:GL:GQ	0/1:20,37:57:-151.45,-17.18,-62.35:99
-chr1	4685955	rs11586740	G	T	36.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=7.65;MQ=60.00;MQ0=0;OQ=1269.15;QD=17.39;SB=-560.71	GT:AD:DP:GL:GQ	0/1:30,43:69:-150.98,-20.79,-94.07:99
-chr1	4686129	.	A	G	0.31	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.20;MQ0=0;OQ=188.73;QD=3.63;SB=-3.68	GT:AD:DP:GL:GQ	0/1:41,11:52:-37.84,-15.68,-155.85:99
-chr1	4686130	.	G	C	4.40	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.20;MQ0=0;OQ=258.95;QD=4.98;SB=-16.68	GT:AD:DP:GL:GQ	0/1:42,10:52:-44.85,-15.67,-182.52:99
-chr1	4686979	rs242044	A	G	24.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=0.79;MQ=59.56;MQ0=0;OQ=1479.37;QD=27.91;SB=-538.14	GT:AD:DP:GL:GQ	1/1:0,52:45:-151.55,-13.56,-0.03:99
-chr1	4687176	rs242045	T	C	255.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=1371.92;QD=34.30;SB=-697.63	GT:AD:DP:GL:GQ	1/1:0,40:40:-140.79,-12.05,-0.02:99
-chr1	4687868	rs242047	A	C	103.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=2.65;MQ=59.62;MQ0=0;OQ=770.92;QD=12.85;SB=-248.85	GT:AD:DP:GL:GQ	0/1:32,28:59:-98.15,-17.77,-114.07:99
-chr1	4688746	rs242048	A	G	112.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.71;MQ=59.36;MQ0=0;OQ=768.10;QD=21.34;SB=-331.78	GT:AD:DP:GL:GQ	1/1:0,36:26:-80.42,-7.84,-0.03:78.16
-chr1	4688889	rs242049	T	G	239.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=60.00;MQ0=0;OQ=1481.34;QD=32.92;SB=-635.03	GT:AD:DP:GL:GQ	1/1:0,45:44:-151.74,-13.26,-0.02:99
-chr1	4695274	rs446529	T	C	363.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=55.31;MQ0=0;OQ=516.35;QD=9.93;SB=-227.25	GT:AD:DP:GL:GQ	0/1:29,23:50:-69.99,-15.07,-114.97:99
-chr1	4695606	rs648712	C	T	1.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=10.04;MQ=47.15;MQ0=0;OQ=816.40;QD=17.01;SB=-434.45	GT:AD:DP:GL:GQ	0/1:23,25:46:-98.78,-13.86,-79.74:99
-chr1	4695607	.	T	G	0.18	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=11.01;MQ=47.15;MQ0=0;OQ=688.64;QD=14.35;SB=-357.86	GT:AD:DP:GL:GQ	0/1:23,25:47:-86.31,-14.16,-83.32:99
-chr1	4695638	rs432330	T	A	460.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.80;MQ0=0;OQ=772.11;QD=15.14;SB=-337.40	GT:AD:DP:GL:GQ	0/1:24,27:50:-95.56,-15.06,-90.18:99
-chr1	4695654	rs449261	T	C	245.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=2.57;MQ=53.57;MQ0=0;OQ=702.97;QD=13.52;SB=-345.62	GT:AD:DP:GL:GQ	0/1:26,26:49:-88.35,-14.77,-92.65:99
-chr1	4695676	rs435239	G	C	185.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=2.08;MQ=57.17;MQ0=0;OQ=826.31;QD=16.53;SB=-414.36	GT:AD:DP:GL:GQ	0/1:24,26:47:-100.09,-14.18,-90.75:99
-chr1	4695734	rs416953	T	C	152.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=59.13;MQ0=0;OQ=882.63;QD=16.65;SB=-283.45	GT:AD:DP:GL:GQ	0/1:22,31:50:-106.61,-15.06,-78.94:99
-chr1	4696083	rs383650	C	G	345.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=59.10;MQ0=0;OQ=1382.15;QD=17.95;SB=-715.96	GT:AD:DP:GL:GQ	0/1:38,39:75:-164.11,-22.61,-152.21:99
-chr1	4696156	rs436132	G	C	8.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=1112.40;QD=19.86;SB=-564.68	GT:AD:DP:GL:GQ	0/1:25,31:56:-131.40,-16.88,-111.00:99
-chr1	4696361	.	A	C	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=2;HaplotypeScore=10.18;MQ=60.26;MQ0=0;OQ=143.73;QD=2.08;SB=104.31	GT:AD:DP:GL:GQ	0/1:45,24:52:-33.32,-15.67,-137.68:99
-chr1	4696418	rs392630	A	G	270.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=59.71;MQ0=0;OQ=1265.58;QD=13.76;SB=-582.79	GT:AD:DP:GL:GQ	0/1:45,47:87:-156.05,-26.21,-176.07:99
-chr1	4697358	rs544738	C	A	298.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.61;MQ=59.01;MQ0=0;OQ=538.34;QD=14.17;SB=-233.94	GT:AD:DP:GL:GQ	0/1:19,19:37:-68.26,-11.15,-60.83:99
-chr1	4697618	rs445060	G	A	155.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=2.45;MQ=59.60;MQ0=0;OQ=740.87;QD=12.77;SB=-313.26	GT:AD:DP:GL:GQ	0/1:32,26:54:-93.63,-16.26,-111.70:99
-chr1	4698713	rs578528	A	G	87.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=59.36;MQ0=0;OQ=385.70;QD=10.71;SB=-193.63	GT:AD:DP:GL:GQ	0/1:21,15:36:-52.70,-10.85,-81.97:99
-chr1	4699130	rs449181	G	A	397.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.84;MQ=59.67;MQ0=0;OQ=927.44;QD=16.56;SB=-380.14	GT:AD:DP:GL:GQ	0/1:27,29:54:-112.30,-16.28,-85.10:99
-chr1	4700289	rs13376290	T	G	0.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=4;HaplotypeScore=0.10;MQ=48.01;MQ0=0;OQ=193.53;QD=7.44;SB=-0.43	GT:AD:DP:GL:GQ	0/1:15,11:24:-29.87,-7.23,-54.19:99
-chr1	4700426	.	C	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=2;HaplotypeScore=11.52;MQ=48.42;MQ0=0;OQ=136.63;QD=5.25;SB=-6.99	GT:AD:DP:GL:GQ	0/1:7,19:10:-19.97,-3.02,-19.59:99
-chr1	4700705	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=20;HaplotypeScore=32.92;MQ=48.95;MQ0=0;OQ=199.23;QD=3.83;SB=71.25	GT:AD:DP:GL:GQ	0/1:35,17:41:-35.56,-12.35,-113.25:99
-chr1	4700881	rs529853	G	C	174.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=3.66;MQ=53.91;MQ0=0;OQ=810.63;QD=16.54;SB=-402.70	GT:AD:DP:GL:GQ	0/1:22,27:47:-98.53,-14.18,-93.65:99
-chr1	4701141	rs381339	T	C	9.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=2.72;MQ=59.22;MQ0=0;OQ=750.05;QD=11.54;SB=-112.61	GT:AD:DP:GL:GQ	0/1:29,33:53:-94.27,-15.98,-96.69:99
-chr1	4701497	rs382623	T	C	282.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=59.48;MQ0=0;OQ=1093.69;QD=13.50;SB=-513.56	GT:AD:DP:GL:GQ	0/1:38,43:80:-136.77,-24.11,-153.00:99
-chr1	4701516	rs382646	T	C	490.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1091.01;QD=14.36;SB=-413.27	GT:AD:DP:GL:GQ	0/1:38,38:75:-134.98,-22.59,-157.29:99
-chr1	4701783	rs392620	C	T	260.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.19;MQ=59.38;MQ0=0;OQ=1111.05;QD=15.01;SB=-420.88	GT:AD:DP:GL:GQ	0/1:41,33:73:-136.38,-21.99,-143.11:99
-chr1	4702373	rs448741	C	T	315.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.33;MQ0=0;OQ=1161.48;QD=16.83;SB=-516.10	GT:AD:DP:GL:GQ	0/1:33,36:68:-139.92,-20.49,-116.50:99
-chr1	4702588	rs431966	C	G	301.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.74;MQ0=0;OQ=1167.37;QD=16.21;SB=-392.89	GT:AD:DP:GL:GQ	0/1:35,37:71:-141.44,-21.42,-151.57:99
-chr1	4703125	rs367673	G	C	285.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.24;MQ0=0;OQ=1282.03;QD=21.02;SB=-602.59	GT:AD:DP:GL:GQ	0/1:26,35:61:-149.87,-18.38,-114.22:99
-chr1	4703446	rs540299	A	G	321.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=59.10;MQ0=0;OQ=1141.42;QD=14.82;SB=-449.59	GT:AD:DP:GL:GQ	0/1:36,41:75:-140.02,-22.60,-142.02:99
-chr1	4703496	rs648346	G	A	131.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=58.29;MQ0=0;OQ=1435.37;QD=17.50;SB=-321.28	GT:AD:DP:GL:GQ	0/1:40,42:79:-170.63,-23.81,-120.02:99
-chr1	4703694	rs393976	G	A	298.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=59.30;MQ0=0;OQ=1022.50;QD=17.04;SB=-396.14	GT:AD:DP:GL:GQ	0/1:30,30:58:-123.01,-17.47,-100.86:99
-chr1	4704145	rs375781	T	C	253.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=57.53;MQ0=0;OQ=380.91;QD=10.02;SB=-211.48	GT:AD:DP:GL:GQ	0/1:19,19:35:-51.92,-10.55,-74.06:99
-chr1	4704212	rs406065	A	T	598.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.74;MQ0=0;OQ=1026.86;QD=14.88;SB=-405.55	GT:AD:DP:GL:GQ	0/1:35,34:69:-126.75,-20.78,-135.77:99
-chr1	4704412	rs396199	G	A	86.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.14;MQ=59.62;MQ0=0;OQ=915.71;QD=18.69;SB=-324.82	GT:AD:DP:GL:GQ	0/1:21,28:47:-109.02,-14.16,-69.65:99
-chr1	4704606	rs413178	A	G	154.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=56.43;MQ0=0;OQ=958.14;QD=15.45;SB=-233.27	GT:AD:DP:GL:GQ	0/1:25,37:59:-116.89,-17.79,-90.61:99
-chr1	4704966	rs414176	A	C	426.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.63;MQ0=0;OQ=751.31;QD=11.93;SB=-297.47	GT:AD:DP:GL:GQ	0/1:31,32:62:-97.10,-18.68,-109.53:99
-chr1	4705294	rs371605	A	G	188.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.08;MQ=59.55;MQ0=0;OQ=418.07;QD=8.20;SB=-210.35	GT:AD:DP:GL:GQ	0/1:28,23:46:-58.96,-13.87,-104.25:99
-chr1	4705534	rs409048	T	C	345.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=59.35;MQ0=0;OQ=802.66;QD=12.54;SB=-363.20	GT:AD:DP:GL:GQ	0/1:35,29:64:-102.83,-19.28,-139.39:99
-chr1	4706241	rs368808	A	G	17.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=2;HaplotypeScore=4.09;MQ=59.49;MQ0=0;OQ=756.36;QD=9.22;SB=-230.86	GT:AD:DP:GL:GQ	0/1:48,34:80:-103.04,-24.12,-189.26:99
-chr1	4707706	rs368940	A	G	105.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=599.08;QD=17.12;SB=-212.56	GT:AD:DP:GL:GQ	0/1:14,21:35:-73.73,-10.54,-57.28:99
-chr1	4707911	.	C	A	31.90	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=13;HaplotypeScore=26.77;MQ=58.47;MQ0=0;QD=0.52;SB=52.91	GT:AD:DP:GL:GQ	0/1:52,9:48:-20.93,-14.46,-146.08:64.73
-chr1	4708314	rs2802721	G	A	450.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=56.44;MQ0=0;OQ=981.54;QD=15.34;SB=-489.03	GT:AD:DP:GL:GQ	0/1:28,36:59:-119.22,-17.78,-99.55:99
-chr1	4708405	rs394808	C	A	233.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.96;MQ=56.69;MQ0=0;OQ=782.76;QD=14.77;SB=-324.34	GT:AD:DP:GL:GQ	0/1:26,27:51:-96.92,-15.37,-78.87:99
-chr1	4708536	rs395145	C	T	383.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1269.10;QD=19.83;SB=-521.54	GT:AD:DP:GL:GQ	0/1:25,39:63:-149.18,-18.98,-84.36:99
-chr1	4708674	rs4654602	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=69.80;MQ=46.48;MQ0=0;OQ=293.59;QD=4.19;SB=-93.14	GT:AD:DP:GL:GQ	0/1:56,14:66:-52.53,-19.89,-198.60:99
-chr1	4708678	rs406913	A	G	32.76	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=20.07;MQ=45.13;MQ0=0;QD=0.48;SB=9.87	GT:AD:DP:GL:GQ	0/1:59,9:58:-24.04,-17.48,-194.48:65.59
-chr1	4708830	rs433427	A	G	13.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=6.55;MQ=59.08;MQ0=0;OQ=748.71;QD=10.55;SB=-350.04	GT:AD:DP:GL:GQ	0/1:40,31:70:-99.25,-21.09,-163.31:99
-chr1	4708980	rs2802720	C	T	373.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=55.41;MQ0=0;OQ=1008.97;QD=15.29;SB=-359.05	GT:AD:DP:GL:GQ	0/1:35,31:66:-124.06,-19.88,-124.56:99
-chr1	4710412	rs364642	C	T	180.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=3.52;MQ=58.91;MQ0=0;OQ=814.43;QD=13.57;SB=-402.86	GT:AD:DP:GL:GQ	0/1:32,28:58:-102.20,-17.48,-113.74:99
-chr1	4712675	rs381240	A	G	265.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=57.93;MQ0=0;OQ=805.26;QD=10.19;SB=-382.86	GT:AD:DP:GL:GQ	0/1:44,35:76:-106.72,-22.91,-172.59:99
-chr1	4712931	rs448221	T	C	105.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=56.15;MQ0=0;OQ=384.09;QD=10.38;SB=-115.63	GT:AD:DP:GL:GQ	0/1:18,19:34:-51.95,-10.25,-67.62:99
-chr1	4712934	rs431884	C	T	132.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=56.04;MQ0=0;OQ=441.73;QD=12.27;SB=-157.22	GT:AD:DP:GL:GQ	0/1:18,18:33:-57.41,-9.95,-59.19:99
-chr1	4712975	rs380239	A	G	454.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=55.78;MQ0=0;OQ=728.95;QD=12.57;SB=-369.58	GT:AD:DP:GL:GQ	0/1:31,26:56:-93.05,-16.87,-121.44:99
-chr1	4713977	rs434474	A	T	435.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.38;MQ0=0;OQ=788.95;QD=11.78;SB=-384.44	GT:AD:DP:GL:GQ	0/1:40,27:64:-101.46,-19.28,-136.23:99
-chr1	4714260	rs428001	G	A	188.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=394.17;QD=7.58;SB=-208.83	GT:AD:DP:GL:GQ	0/1:37,15:47:-56.86,-14.16,-117.42:99
-chr1	4714368	rs413383	G	C	359.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=902.57;QD=15.56;SB=-389.66	GT:AD:DP:GL:GQ	0/1:30,28:56:-110.43,-16.89,-123.48:99
-chr1	4714807	rs401110	C	T	341.51	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=642.13;QD=13.96;SB=-230.50	GT:AD:DP:GL:GQ	0/1:24,21:44:-80.76,-13.26,-78.68:99
-chr1	4715337	rs434504	G	A	250	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.39;MQ0=0;OQ=582.19;QD=15.32;SB=-195.19	GT:AD:DP:GL:GQ	0/1:19,19:36:-72.35,-10.85,-57.76:99
-chr1	4718265	rs423796	G	A	245.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=58.44;MQ0=0;OQ=1032.37;QD=16.92;SB=-496.08	GT:AD:DP:GL:GQ	0/1:28,33:59:-124.29,-17.77,-98.91:99
-chr1	4718977	rs41511844	A	C	15.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=3;HaplotypeScore=0.79;MQ=59.53;MQ0=0;OQ=807.51;QD=16.48;SB=-276.90	GT:AD:DP:GL:GQ	0/1:21,28:49:-98.80,-14.76,-77.17:99
-chr1	4719527	rs523141	G	A	331.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.63;MQ0=1;OQ=362.25;QD=9.29;SB=-60.24	GT:AD:DP:GL:GQ	0/1:25,14:36:-50.35,-10.84,-83.10:99
-chr1	4719663	rs368420	T	C	450.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=60.00;MQ0=0;OQ=1132.30;QD=16.90;SB=-528.33	GT:AD:DP:GL:GQ	0/1:29,38:66:-136.39,-19.88,-119.33:99
-chr1	4720200	rs34125417	T	A	155.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.33;MQ=59.59;MQ0=0;OQ=796.97;QD=13.51;SB=-224.76	GT:AD:DP:GL:GQ	0/1:29,29:54:-99.25,-16.27,-103.01:99
-chr1	4720659	rs397559	C	T	380.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.71;MQ0=0;OQ=1207.74;QD=18.87;SB=-534.79	GT:AD:DP:GL:GQ	0/1:27,37:63:-143.05,-18.99,-86.17:99
-chr1	4721157	rs443850	C	T	216.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=4.76;MQ=59.51;MQ0=0;OQ=1138.02;QD=14.97;SB=-525.69	GT:AD:DP:GL:GQ	0/1:42,34:73:-139.07,-21.99,-142.33:99
-chr1	4721448	rs9426481	G	T	366.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=988.26;QD=14.53;SB=-519.87	GT:AD:DP:GL:GQ	0/1:35,33:67:-122.29,-20.18,-120.50:99
-chr1	4722600	rs742245	A	C	591.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1064.86;QD=15.00;SB=-554.90	GT:AD:DP:GL:GQ	0/1:34,37:68:-130.25,-20.48,-117.18:99
-chr1	4722971	rs760815	C	A	224.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=59.29;MQ0=0;OQ=950.16;QD=16.10;SB=-349.23	GT:AD:DP:GL:GQ	0/1:26,33:58:-115.77,-17.47,-92.37:99
-chr1	4723061	rs2743978	G	A	259.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=60.00;MQ0=0;OQ=829.12;QD=15.07;SB=-390.87	GT:AD:DP:GL:GQ	0/1:28,27:53:-102.17,-15.97,-92.75:99
-chr1	4723683	rs411832	G	C	0.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.02;HRun=0;HaplotypeScore=12.73;MQ=59.54;MQ0=0;OQ=809.82;QD=16.20;SB=-394.90	GT:AD:DP:GL:GQ	0/1:25,24:48:-98.44,-14.17,-99.99:99
-chr1	4723923	rs425005	C	A	167.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=59.70;MQ0=0;OQ=997.52;QD=16.09;SB=-361.25	GT:AD:DP:GL:GQ	0/1:28,34:61:-121.41,-18.38,-98.67:99
-chr1	4724602	rs424723	C	T	274.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.39;MQ0=0;OQ=1215.08;QD=19.92;SB=-584.11	GT:AD:DP:GL:GQ	0/1:24,36:58:-142.27,-17.47,-75.15:99
-chr1	4725012	rs2743979	G	A	336.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.68;MQ0=0;OQ=1008.07;QD=17.38;SB=-481.48	GT:AD:DP:GL:GQ	0/1:28,30:57:-121.27,-17.17,-91.06:99
-chr1	4725752	rs57646199	C	T	319.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1002.06;QD=17.89;SB=-467.46	GT:AD:DP:GL:GQ	0/1:26,30:56:-120.36,-16.87,-93.54:99
-chr1	4725910	rs2802717	C	T	220.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=59.68;MQ0=0;OQ=1230.52;QD=17.09;SB=-300.80	GT:AD:DP:GL:GQ	0/1:35,36:70:-147.42,-21.09,-124.52:99
-chr1	4725964	rs2802716	C	A	41.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=4;HaplotypeScore=0.93;MQ=59.48;MQ0=0;OQ=1484.28;QD=18.55;SB=-734.49	GT:AD:DP:GL:GQ	0/1:32,48:80:-175.81,-24.10,-113.80:99
-chr1	4726365	rs9426502	G	A	127.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.67;MQ0=0;OQ=1140.71;QD=16.53;SB=-410.70	GT:AD:DP:GL:GQ	0/1:35,34:69:-138.14,-20.78,-128.81:99
-chr1	4726520	rs2743980	G	A	355.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=1.45;MQ=59.68;MQ0=0;OQ=913.23;QD=12.68;SB=-432.39	GT:AD:DP:GL:GQ	0/1:43,29:72:-116.30,-21.69,-156.11:99
-chr1	4726900	rs7548728	G	A	477.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=780.16;QD=13.69;SB=-340.47	GT:AD:DP:GL:GQ	0/1:32,25:55:-97.88,-16.58,-97.83:99
-chr1	4727923	rs426095	G	A	378.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.64;MQ0=0;OQ=878.95;QD=13.73;SB=-378.83	GT:AD:DP:GL:GQ	0/1:36,28:61:-109.56,-18.38,-120.39:99
-chr1	4728243	rs396629	C	T	353.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.62;MQ0=0;OQ=1145.27;QD=18.77;SB=-564.43	GT:AD:DP:GL:GQ	0/1:27,34:61:-136.20,-18.39,-85.13:99
-chr1	4728440	.	G	A	47.68	PASS	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=2.39;MQ=58.84;MQ0=0;OQ=1100.89;QD=19.66;SB=-554.66	GT:AD:DP:GL:GQ	0/1:23,33:56:-130.25,-16.88,-72.13:99
-chr1	4730266	rs410413	T	C	266.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=57.84;MQ0=0;OQ=500.27;QD=10.01;SB=-265.95	GT:AD:DP:GL:GQ	0/1:25,25:45:-66.88,-13.57,-94.91:99
-chr1	4730269	rs410414	T	C	250.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=57.08;MQ0=0;OQ=462.87;QD=9.85;SB=-198.61	GT:AD:DP:GL:GQ	0/1:25,22:45:-63.14,-13.57,-96.77:99
-chr1	4730645	rs395467	A	G	11.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=4.91;MQ=52.28;MQ0=0;OQ=653.20;QD=9.90;SB=-279.13	GT:AD:DP:GL:GQ	0/1:38,27:64:-87.89,-19.29,-148.52:99
-chr1	4730689	rs9426503	G	C	129.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=1.89;MQ=56.81;MQ0=0;OQ=1027.62;QD=14.27;SB=-322.37	GT:AD:DP:GL:GQ	0/1:41,31:67:-126.24,-20.20,-160.02:99
-chr1	4730760	rs9426483	C	T	334.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=58.90;MQ0=0;OQ=750.53;QD=13.65;SB=-332.36	GT:AD:DP:GL:GQ	0/1:31,24:54:-94.60,-16.27,-107.97:99
-chr1	4730936	rs423285	C	T	421.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=56.95;MQ0=0;OQ=670.76;QD=11.37;SB=-300.79	GT:AD:DP:GL:GQ	0/1:33,25:55:-86.95,-16.59,-101.75:99
-chr1	4730990	rs395508	G	A	57.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=59.27;MQ0=0;OQ=529.54;QD=9.29;SB=-260.10	GT:AD:DP:GL:GQ	0/1:38,19:53:-72.20,-15.97,-127.10:99
-chr1	4731053	rs418045	T	C	525.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=529.19;QD=11.50;SB=-290.44	GT:AD:DP:GL:GQ	0/1:26,20:45:-69.76,-13.55,-105.89:99
-chr1	4731180	rs396112	G	A	318.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=740.76;QD=17.64;SB=-379.17	GT:AD:DP:GL:GQ	0/1:19,23:39:-89.12,-11.76,-51.25:99
-chr1	4731341	rs406847	A	G	411.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.80;MQ0=0;OQ=513.60;QD=14.67;SB=-259.91	GT:AD:DP:GL:GQ	0/1:17,18:35:-65.19,-10.54,-67.57:99
-chr1	4731471	rs428580	C	T	186.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=867.64;QD=20.18;SB=-459.01	GT:AD:DP:GL:GQ	0/1:17,26:42:-102.70,-12.65,-55.85:99
-chr1	4731684	rs407301	C	T	107.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=57.23;MQ0=0;OQ=697.47;QD=20.51;SB=-327.88	GT:AD:DP:GL:GQ	0/1:12,22:33:-82.98,-9.95,-39.91:99
-chr1	4732014	.	T	A	875.95	Indel	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=12.12;MQ=51.16;MQ0=0;QD=14.13;SB=-350.44	GT:AD:DP:GL:GQ	0/1:31,31:60:-108.95,-18.08,-110.80:99
-chr1	4732015	.	T	A	970.99	Indel	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=9;HaplotypeScore=12.28;MQ=51.00;MQ0=0;QD=15.92;SB=-364.45	GT:AD:DP:GL:GQ	0/1:29,32:58:-117.85,-17.47,-98.32:99
-chr1	4733241	rs414434	G	C	239.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1334.69;QD=20.22;SB=-556.62	GT:AD:DP:GL:GQ	0/1:28,38:63:-155.75,-19.00,-107.17:99
-chr1	4734056	rs9426504	G	A	5.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=4;HaplotypeScore=2.44;MQ=58.18;MQ0=0;OQ=895.74;QD=16.59;SB=-312.82	GT:AD:DP:GL:GQ	0/1:25,29:51:-108.23,-15.38,-75.31:99
-chr1	4734062	rs451162	G	C	249.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=58.57;MQ0=0;OQ=977.80;QD=18.80;SB=-417.05	GT:AD:DP:GL:GQ	0/1:24,28:49:-115.83,-14.77,-93.28:99
-chr1	4734089	rs388631	T	C	200.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.48;MQ=59.01;MQ0=0;OQ=598.20;QD=12.73;SB=-188.41	GT:AD:DP:GL:GQ	0/1:21,25:44:-76.37,-13.27,-78.74:99
-chr1	4734466	rs389959	T	C	132.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=60.00;MQ0=0;OQ=323.31;QD=6.22;SB=-138.87	GT:AD:DP:GL:GQ	0/1:33,18:48:-50.08,-14.47,-128.38:99
-chr1	4734711	rs397852	T	C	337.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=60.00;MQ0=0;OQ=458.03;QD=9.35;SB=-228.25	GT:AD:DP:GL:GQ	0/1:29,20:49:-63.86,-14.77,-115.16:99
-chr1	4735235	rs399377	T	C	222.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=339.75;QD=9.71;SB=-124.62	GT:AD:DP:GL:GQ	0/1:21,14:33:-47.20,-9.94,-76.89:99
-chr1	4735981	rs394594	A	G	305.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.38;MQ0=0;OQ=773.72;QD=10.46;SB=-332.92	GT:AD:DP:GL:GQ	0/1:41,33:73:-102.66,-22.01,-163.48:99
-chr1	4738101	rs414909	C	T	441.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=1084.42;QD=16.19;SB=-452.94	GT:AD:DP:GL:GQ	0/1:35,32:67:-131.91,-20.18,-129.56:99
-chr1	4738908	rs381304	A	G	65.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=2;HaplotypeScore=2.37;MQ=58.77;MQ0=0;OQ=1458.03;QD=16.76;SB=-529.55	GT:AD:DP:GL:GQ	0/1:36,51:84:-174.40,-25.31,-140.93:99
-chr1	4739028	rs392984	T	C	105.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=5.08;MQ=58.80;MQ0=0;OQ=588.16;QD=10.14;SB=-181.39	GT:AD:DP:GL:GQ	0/1:30,28:53:-78.07,-15.97,-115.29:99
-chr1	4739512	rs2802719	A	G	384.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=757.23;QD=14.85;SB=-244.45	GT:AD:DP:GL:GQ	0/1:23,28:48:-93.47,-14.47,-78.98:99
-chr1	4739710	rs2802718	G	C	11.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=3;HaplotypeScore=0.83;MQ=56.67;MQ0=0;OQ=1199.49;QD=18.74;SB=-370.48	GT:AD:DP:GL:GQ	0/1:31,33:60:-141.32,-18.09,-113.09:99
-chr1	4740018	rs7544523	T	C	161.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=58.16;MQ0=0;OQ=429.98;QD=11.94;SB=-175.51	GT:AD:DP:GL:GQ	0/1:18,18:35:-56.83,-10.55,-68.38:99
-chr1	4744236	rs9426506	C	T	327.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.29;MQ=58.57;MQ0=0;OQ=856.13;QD=13.81;SB=-428.92	GT:AD:DP:GL:GQ	0/1:35,27:62:-107.57,-18.68,-125.85:99
-chr1	4744972	rs9426484	G	A	347.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=59.65;MQ0=0;OQ=799.48;QD=12.30;SB=-407.88	GT:AD:DP:GL:GQ	0/1:38,27:60:-101.32,-18.09,-111.41:99
-chr1	4745752	rs6426434	G	A	271.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=60.00;MQ0=0;OQ=1169.68;QD=19.49;SB=-538.80	GT:AD:DP:GL:GQ	0/1:24,36:57:-137.43,-17.18,-72.34:99
-chr1	4747705	rs4654460	G	A	332.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=755.91;QD=18.90;SB=-379.91	GT:AD:DP:GL:GQ	0/1:17,23:38:-90.34,-11.46,-46.09:99
-chr1	4748668	rs12133924	A	G	455.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=1019.13;QD=13.07;SB=-468.04	GT:AD:DP:GL:GQ	0/1:42,36:77:-128.39,-23.20,-162.75:99
-chr1	4748969	rs6701069	A	G	376.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.72;MQ0=0;OQ=1003.27;QD=12.39;SB=-469.20	GT:AD:DP:GL:GQ	0/1:46,35:80:-127.71,-24.10,-182.44:99
-chr1	4749244	rs2235438	T	C	581.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=891.88;QD=13.12;SB=-467.00	GT:AD:DP:GL:GQ	0/1:32,36:65:-112.06,-19.59,-124.79:99
-chr1	4750683	rs909757	T	C	410.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.22;MQ0=0;OQ=683.00;QD=11.78;SB=-347.56	GT:AD:DP:GL:GQ	0/1:31,27:55:-88.15,-16.57,-119.32:99
-chr1	4751405	rs17345239	T	G	179.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=774.24;QD=13.12;SB=-344.85	GT:AD:DP:GL:GQ	0/1:30,29:56:-97.57,-16.87,-106.85:99
-chr1	4753272	rs742246	A	C	355.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=617.26;QD=14.03;SB=-196.34	GT:AD:DP:GL:GQ	0/1:21,23:43:-77.96,-12.95,-77.17:99
-chr1	4753548	rs932350	T	C	408.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.22;MQ0=0;OQ=924.37;QD=14.22;SB=-295.30	GT:AD:DP:GL:GQ	0/1:29,36:64:-115.01,-19.29,-116.32:99
-chr1	4753607	rs12082538	G	C	138.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.84;MQ=60.48;MQ0=0;OQ=606.35;QD=13.47;SB=-132.52	GT:AD:DP:GL:GQ	0/1:25,20:43:-76.88,-12.96,-107.57:99
-chr1	4753770	rs7519688	C	T	2.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=3;HaplotypeScore=5.33;MQ=59.09;MQ0=0;OQ=802.41;QD=15.73;SB=-282.79	GT:AD:DP:GL:GQ	0/1:25,26:48:-97.99,-14.47,-73.03:99
-chr1	4755384	rs727906	C	T	371.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=60.00;MQ0=0;OQ=954.50;QD=12.40;SB=-422.82	GT:AD:DP:GL:GQ	0/1:47,30:76:-121.64,-22.91,-153.23:99
-chr1	4756029	rs2411946	T	A	426.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.59;MQ0=0;OQ=610.43;QD=13.57;SB=-308.69	GT:AD:DP:GL:GQ	0/1:23,22:44:-77.58,-13.26,-87.22:99
-chr1	4756791	rs760816	A	G	307.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=2.08;MQ=60.00;MQ0=0;OQ=644.43;QD=11.51;SB=-270.35	GT:AD:DP:GL:GQ	0/1:29,27:54:-84.00,-16.27,-113.95:99
-chr1	4758251	.	A	G	4.99	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=3;HaplotypeScore=0.95;MQ=59.34;MQ0=1;OQ=796.90;QD=10.77;SB=-383.18	GT:AD:DP:GL:GQ	0/1:42,32:64:-102.26,-19.28,-139.02:99
-chr1	4758268	rs4654606	T	G	84.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=4.06;MQ=59.35;MQ0=0;OQ=681.65;QD=10.65;SB=-311.85	GT:AD:DP:GL:GQ	0/1:38,26:61:-89.83,-18.38,-124.54:99
-chr1	4759471	rs2142949	C	T	488.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=986.38;QD=17.01;SB=-326.41	GT:AD:DP:GL:GQ	0/1:27,31:57:-119.09,-17.17,-96.06:99
-chr1	4761020	rs4654607	C	T	187.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.53;MQ0=0;OQ=1317.32;QD=16.67;SB=-650.17	GT:AD:DP:GL:GQ	0/1:40,39:77:-158.21,-23.19,-137.71:99
-chr1	4763236	rs2064168	C	T	278.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=1185.65;QD=19.12;SB=-513.73	GT:AD:DP:GL:GQ	0/1:25,37:60:-139.92,-18.08,-90.33:99
-chr1	4763773	rs760817	T	C	455.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.94;MQ=59.11;MQ0=0;OQ=932.67;QD=12.78;SB=-440.55	GT:AD:DP:GL:GQ	0/1:40,33:73:-118.54,-21.99,-163.26:99
-chr1	4764845	rs10915606	A	G	585.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1075.05;QD=14.15;SB=-528.93	GT:AD:DP:GL:GQ	0/1:37,39:74:-133.08,-22.29,-148.56:99
-chr1	4765718	rs10429868	G	A	452.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=1155.78;QD=15.62;SB=-602.60	GT:AD:DP:GL:GQ	0/1:39,35:74:-141.15,-22.29,-141.78:99
-chr1	4766001	rs12022466	T	A	597.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1259.06;QD=15.94;SB=-558.66	GT:AD:DP:GL:GQ	0/1:39,40:79:-152.98,-23.79,-151.51:99
-chr1	4766045	.	G	A	13.96	PASS	AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=1207.52;QD=14.55;SB=-582.08	GT:AD:DP:GL:GQ	0/1:47,36:81:-148.43,-24.40,-164.42:99
-chr1	4766280	rs12752806	G	T	477.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.50;MQ0=0;OQ=1250.24;QD=15.06;SB=-480.84	GT:AD:DP:GL:GQ	0/1:42,41:81:-152.70,-24.39,-146.62:99
-chr1	4767409	rs7534770	A	T	437.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1042.20;QD=14.28;SB=-531.39	GT:AD:DP:GL:GQ	0/1:39,34:72:-129.19,-21.69,-145.29:99
-chr1	4767544	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=6;HaplotypeScore=47.32;MQ=56.17;MQ0=2;OQ=190.67;QD=2.98;SB=86.31	GT:AD:DP:GL:GQ	0/1:48,16:57:-39.52,-17.17,-173.24:99
-chr1	4769118	rs10915610	A	C	208.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=4.78;MQ=58.87;MQ0=0;OQ=1164.63;QD=14.93;SB=-551.67	GT:AD:DP:GL:GQ	0/1:37,39:77:-145.10,-25.36,-142.76:99
-chr1	4770972	.	C	A	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=2;HaplotypeScore=8.28;MQ=56.35;MQ0=0;OQ=111.37;QD=1.89;SB=65.23	GT:AD:DP:GL:GQ	0/1:35,24:40:-26.47,-12.05,-113.84:99
-chr1	4771531	rs1118009	A	G	323.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=56.74;MQ0=0;OQ=1333.25;QD=15.32;SB=-605.42	GT:AD:DP:GL:GQ	0/1:38,49:86:-162.53,-25.92,-151.96:99
-chr1	4771617	rs1118010	C	T	407.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=1431.00;QD=18.58;SB=-550.33	GT:AD:DP:GL:GQ	0/1:34,43:77:-169.58,-23.20,-123.43:99
-chr1	4772431	rs10799262	G	A	68.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=59.76;MQ0=0;OQ=1610.76;QD=20.65;SB=-755.30	GT:AD:DP:GL:GQ	0/1:32,46:78:-187.86,-23.50,-115.14:99
-chr1	4772511	rs10915611	C	T	585.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=1219.72;QD=17.42;SB=-547.54	GT:AD:DP:GL:GQ	0/1:34,36:70:-146.34,-21.08,-121.82:99
-chr1	4772916	rs10915612	A	G	195.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=58.68;MQ0=0;OQ=1058.43;QD=15.80;SB=-539.98	GT:AD:DP:GL:GQ	0/1:30,37:67:-129.31,-20.19,-122.36:99
-chr1	4773270	rs7540367	G	A	242.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.44;MQ0=0;OQ=792.22;QD=13.66;SB=-213.92	GT:AD:DP:GL:GQ	0/1:33,25:57:-99.68,-17.18,-105.56:99
-chr1	4773658	.	G	A	112.25	PASS	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.50;MQ0=0;OQ=985.30;QD=17.59;SB=-495.06	GT:AD:DP:GL:GQ	0/1:26,30:55:-118.38,-16.57,-94.83:99
-chr1	4773754	rs12120205	T	A	372.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=1585.82;QD=16.18;SB=-556.42	GT:AD:DP:GL:GQ	0/1:49,49:98:-191.38,-29.51,-188.67:99
-chr1	4774287	rs10799263	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=7;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1045.47;QD=15.84;SB=-449.52	GT:AD:DP:GL:GQ	0/1:30,36:65:-127.41,-19.58,-109.32:99
-chr1	4774365	rs10915613	G	A	361.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1223.17;QD=16.31;SB=-630.64	GT:AD:DP:GL:GQ	0/1:38,37:73:-147.61,-22.01,-118.37:99
-chr1	4776755	rs12145180	C	G	356.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.24;MQ=59.64;MQ0=0;OQ=975.57;QD=15.24;SB=-415.28	GT:AD:DP:GL:GQ	0/1:32,32:62:-119.54,-18.70,-139.99:99
-chr1	4776903	rs10915615	C	A	330.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.69;MQ0=0;OQ=909.18;QD=12.12;SB=-404.10	GT:AD:DP:GL:GQ	0/1:43,32:72:-115.90,-21.70,-128.82:99
-chr1	4777460	rs12118812	T	G	167.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=842.15;QD=11.86;SB=-431.75	GT:AD:DP:GL:GQ	0/1:41,30:70:-108.58,-21.08,-144.58:99
-chr1	4777525	rs12118818	T	G	101.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=1.33;MQ=59.72;MQ0=0;OQ=940.16;QD=13.63;SB=-473.22	GT:AD:DP:GL:GQ	0/1:36,33:67:-117.48,-20.18,-125.31:99
-chr1	4777535	rs12143219	G	T	70.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=4;HaplotypeScore=0.27;MQ=60.00;MQ0=0;OQ=1005.40;QD=15.47;SB=-447.46	GT:AD:DP:GL:GQ	0/1:32,33:65:-123.40,-19.58,-114.32:99
-chr1	4778731	rs1120120	C	T	347.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=1;HaplotypeScore=1.94;MQ=59.78;MQ0=0;OQ=1277.01;QD=15.02;SB=-471.94	GT:AD:DP:GL:GQ	0/1:47,38:84:-156.28,-25.30,-171.76:99
-chr1	4780340	rs10915616	C	T	196.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=881.43;QD=16.95;SB=-113.96	GT:AD:DP:GL:GQ	0/1:26,26:52:-107.09,-15.66,-92.07:99
-chr1	4780435	rs12121890	T	C	347.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.73;MQ0=0;OQ=1105.50;QD=16.26;SB=-426.60	GT:AD:DP:GL:GQ	0/1:30,38:67:-134.02,-20.18,-117.11:99
-chr1	4781127	rs12122126	T	C	314.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=58.69;MQ0=0;OQ=674.99;QD=13.50;SB=-298.62	GT:AD:DP:GL:GQ	0/1:26,24:49:-85.54,-14.76,-106.72:99
-chr1	4781899	rs12117810	G	A	242.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.88;MQ0=0;OQ=1031.36;QD=17.78;SB=-437.45	GT:AD:DP:GL:GQ	0/1:28,30:56:-123.30,-16.88,-83.86:99
-chr1	4782182	rs10915619	A	T	438.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=58.65;MQ0=0;OQ=1009.97;QD=12.47;SB=-431.43	GT:AD:DP:GL:GQ	0/1:47,34:80:-128.38,-24.10,-172.98:99
-chr1	4782516	rs1883345	G	A	146.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=59.45;MQ0=0;OQ=906.47;QD=11.93;SB=-338.27	GT:AD:DP:GL:GQ	0/1:44,32:71:-115.32,-21.39,-152.63:99
-chr1	4782885	rs1883346	T	A	397.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=58.75;MQ0=0;OQ=1064.02;QD=14.99;SB=-456.50	GT:AD:DP:GL:GQ	0/1:37,34:70:-130.77,-21.08,-141.61:99
-chr1	4782955	rs1883347	T	C	221.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=4.24;MQ=59.50;MQ0=0;OQ=856.09;QD=11.57;SB=-450.96	GT:AD:DP:GL:GQ	0/1:43,30:73:-110.88,-21.99,-176.74:99
-chr1	4783491	rs4654610	T	C	960.35	Indel	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=11.46;MQ=47.61;MQ0=0;QD=14.12;SB=-407.25	GT:AD:DP:GL:GQ	0/1:31,37:63:-118.30,-18.98,-112.03:99
-chr1	4793106	rs61766789	G	A	240.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.34;MQ=58.98;MQ0=1;OQ=1230.74;QD=17.33;SB=-554.58	GT:AD:DP:GL:GQ	0/1:35,36:69:-147.14,-20.78,-120.71:99
-chr1	4794663	.	C	T	274.23	PASS	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.43;MQ0=0;OQ=833.44;QD=12.63;SB=-440.37	GT:AD:DP:GL:GQ	0/1:40,26:66:-106.51,-19.88,-144.25:99
-chr1	4794952	rs12074481	C	A	271.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=57.82;MQ0=0;OQ=1066.30;QD=15.02;SB=-452.97	GT:AD:DP:GL:GQ	0/1:33,38:69:-130.70,-20.79,-110.83:99
-chr1	4798693	rs7522386	A	G	341.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=1.98;MQ=58.39;MQ0=0;OQ=1056.56;QD=15.77;SB=-495.12	GT:AD:DP:GL:GQ	0/1:31,36:65:-128.52,-19.58,-122.92:99
-chr1	4801597	rs7527319	C	A	582.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=923.07;QD=13.78;SB=-344.17	GT:AD:DP:GL:GQ	0/1:34,33:66:-115.47,-19.88,-121.89:99
-chr1	4806096	rs7547779	T	C	457.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.53;MQ0=0;OQ=897.02;QD=13.39;SB=-364.21	GT:AD:DP:GL:GQ	0/1:34,33:65:-112.57,-19.58,-135.93:99
-chr1	4807563	rs11582327	T	C	467.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.73;MQ0=0;OQ=911.00;QD=13.40;SB=-422.86	GT:AD:DP:GL:GQ	0/1:32,36:67:-114.58,-20.19,-127.73:99
-chr1	4807672	rs7536960	T	C	326.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=60.00;MQ0=0;OQ=720.71;QD=12.64;SB=-286.29	GT:AD:DP:GL:GQ	0/1:27,30:55:-91.93,-16.58,-105.91:99
-chr1	4808516	rs6669130	G	A	323.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=1.64;MQ=59.98;MQ0=0;OQ=1529.46;QD=17.58;SB=-724.76	GT:AD:DP:GL:GQ	0/1:42,45:83:-181.23,-25.00,-146.35:99
-chr1	4808719	.	T	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=2;HaplotypeScore=4.69;MQ=58.91;MQ0=0;OQ=57.76;QD=0.90;SB=95.29	GT:AD:DP:GL:GQ	0/1:40,24:48:-23.52,-14.46,-139.84:90.60
-chr1	4808761	rs6683849	A	G	156.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=737.58;QD=13.17;SB=-272.54	GT:AD:DP:GL:GQ	0/1:30,26:56:-93.91,-16.87,-119.65:99
-chr1	4808953	rs12725011	G	A	96.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=1.25;MQ=59.67;MQ0=0;OQ=1362.18;QD=19.46;SB=-645.68	GT:AD:DP:GL:GQ	0/1:29,41:69:-160.29,-20.79,-101.64:99
-chr1	4808976	rs11582462	A	G	74	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=3.61;MQ=59.32;MQ0=0;OQ=923.86;QD=13.59;SB=-481.59	GT:AD:DP:GL:GQ	0/1:33,35:64:-114.94,-19.28,-135.51:99
-chr1	4809567	rs11582936	A	C	302.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.32;MQ=59.67;MQ0=0;OQ=605.80;QD=10.63;SB=-281.94	GT:AD:DP:GL:GQ	0/1:26,30:52:-79.53,-15.67,-97.13:99
-chr1	4809668	rs7543326	T	C	173.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=2;HaplotypeScore=1.68;MQ=59.71;MQ0=0;OQ=1092.10;QD=13.82;SB=-474.60	GT:AD:DP:GL:GQ	0/1:37,42:79:-136.31,-23.81,-148.02:99
-chr1	4811032	rs6693945	T	C	292.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=59.41;MQ0=0;OQ=916.53;QD=14.55;SB=-321.25	GT:AD:DP:GL:GQ	0/1:30,31:62:-117.13,-22.19,-125.33:99
-chr1	4811983	rs2209167	G	A	414.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.70;MQ0=0;OQ=1021.76;QD=13.10;SB=-414.40	GT:AD:DP:GL:GQ	0/1:45,33:75:-128.08,-22.62,-135.03:99
-chr1	4813003	rs6426439	C	T	133.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=3.37;MQ=59.50;MQ0=0;OQ=1367.37;QD=18.48;SB=-705.27	GT:AD:DP:GL:GQ	0/1:34,40:72:-161.71,-21.69,-122.06:99
-chr1	4813419	rs1886113	T	G	294.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=612.34;QD=12.76;SB=-248.40	GT:AD:DP:GL:GQ	0/1:25,23:47:-78.67,-14.15,-95.57:99
-chr1	4813733	rs10915628	T	C	146.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=870.49;QD=12.26;SB=-270.52	GT:AD:DP:GL:GQ	0/1:41,30:71:-111.72,-21.39,-167.00:99
-chr1	4813800	rs10915631	C	T	467.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=60.00;MQ0=0;OQ=1109.44;QD=15.20;SB=-509.01	GT:AD:DP:GL:GQ	0/1:39,34:73:-136.22,-21.99,-139.36:99
-chr1	4813826	rs10799266	A	G	440.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=1025.69;QD=13.50;SB=-528.56	GT:AD:DP:GL:GQ	0/1:40,36:76:-128.75,-22.90,-159.57:99
-chr1	4814770	rs6426440	C	A	361.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=60.00;MQ0=0;OQ=964.05;QD=12.68;SB=-378.13	GT:AD:DP:GL:GQ	0/1:42,34:76:-122.59,-22.91,-131.06:99
-chr1	4814802	rs6426441	A	T	191.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=5.04;MQ=59.57;MQ0=0;OQ=882.35;QD=13.17;SB=-416.80	GT:AD:DP:GL:GQ	0/1:37,30:65:-111.10,-19.58,-134.21:99
-chr1	4815146	rs2411949	G	T	0.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=15.15;MQ=59.31;MQ0=0;OQ=1233.12;QD=16.23;SB=-582.79	GT:AD:DP:GL:GQ	0/1:35,40:72:-148.29,-21.69,-101.37:99
-chr1	4815330	rs6658680	A	G	154.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=57.17;MQ0=0;OQ=454.29;QD=9.09;SB=-126.50	GT:AD:DP:GL:GQ	0/1:29,21:47:-62.88,-14.17,-108.85:99
-chr1	4815340	rs6692964	G	T	169.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=56.50;MQ0=0;OQ=607.11;QD=11.90;SB=-203.41	GT:AD:DP:GL:GQ	0/1:29,22:51:-79.35,-15.36,-103.70:99
-chr1	4815344	rs6692966	G	A	446.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.57;MQ0=0;OQ=669.90;QD=12.88;SB=-297.81	GT:AD:DP:GL:GQ	0/1:28,24:50:-85.35,-15.08,-90.67:99
-chr1	4815634	rs2147028	C	A	82.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=1.79;MQ=59.43;MQ0=0;OQ=1001.39;QD=15.41;SB=-277.32	GT:AD:DP:GL:GQ	0/1:32,33:62:-122.10,-18.67,-102.09:99
-chr1	4815904	rs2209166	G	A	117.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=1754.50;QD=22.21;SB=-892.01	GT:AD:DP:GL:GQ	0/1:28,51:79:-202.53,-23.80,-99.82:99
-chr1	4816064	rs6693706	G	T	446.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.64;MQ0=0;OQ=733.52;QD=14.11;SB=-350.37	GT:AD:DP:GL:GQ	0/1:26,26:52:-92.30,-15.67,-93.55:99
-chr1	4816465	rs1535736	C	T	112.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=1112.33;QD=17.38;SB=-338.80	GT:AD:DP:GL:GQ	0/1:31,33:64:-133.80,-19.28,-110.54:99
-chr1	4816766	rs1535734	A	G	420.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=908.64;QD=12.62;SB=-359.52	GT:AD:DP:GL:GQ	0/1:39,33:70:-115.23,-21.09,-156.36:99
-chr1	4817101	rs6693352	A	G	227.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=59.68;MQ0=0;OQ=949.71;QD=13.19;SB=-443.55	GT:AD:DP:GL:GQ	0/1:38,34:70:-119.35,-21.09,-147.05:99
-chr1	4817128	rs2898848	G	A	216.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1195.65;QD=16.61;SB=-558.57	GT:AD:DP:GL:GQ	0/1:36,36:72:-144.54,-21.69,-131.83:99
-chr1	4817320	rs2209165	C	T	145.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=59.39;MQ0=0;OQ=1415.52;QD=20.82;SB=-731.10	GT:AD:DP:GL:GQ	0/1:27,41:68:-165.32,-20.49,-90.68:99
-chr1	4817405	rs2209164	A	G	118.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.63;MQ0=0;OQ=527.84;QD=8.51;SB=-187.44	GT:AD:DP:GL:GQ	0/1:40,22:60:-74.14,-18.07,-157.62:99
-chr1	4817514	rs2209163	G	A	238.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.72;MQ0=0;OQ=933.49;QD=13.93;SB=-217.50	GT:AD:DP:GL:GQ	0/1:38,29:66:-116.53,-19.90,-117.09:99
-chr1	4817749	rs3938469	A	G	107.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=486.41;QD=8.11;SB=-117.18	GT:AD:DP:GL:GQ	0/1:41,19:60:-70.00,-18.07,-168.54:99
-chr1	4817969	rs2093769	G	A	229.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.14;MQ=59.44;MQ0=0;OQ=1190.09;QD=14.51;SB=-381.33	GT:AD:DP:GL:GQ	0/1:44,38:79:-146.09,-23.80,-153.77:99
-chr1	4818044	rs2093768	A	G	314.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.33;MQ0=0;OQ=811.36;QD=13.09;SB=-280.55	GT:AD:DP:GL:GQ	0/1:29,33:61:-102.81,-18.39,-114.06:99
-chr1	4818509	rs10159142	G	A	308.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.55;MQ=58.95;MQ0=0;OQ=899.59;QD=15.51;SB=-448.42	GT:AD:DP:GL:GQ	0/1:30,28:58:-110.72,-17.47,-107.08:99
-chr1	4818666	rs10799268	T	C	278.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=1.43;MQ=59.42;MQ0=0;OQ=887.47;QD=13.87;SB=-404.24	GT:AD:DP:GL:GQ	0/1:33,31:62:-110.70,-18.67,-130.15:99
-chr1	4818872	rs10753387	T	C	88.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.63;MQ=55.54;MQ0=0;OQ=718.25;QD=13.30;SB=-324.13	GT:AD:DP:GL:GQ	0/1:25,29:53:-91.08,-15.98,-99.45:99
-chr1	4819100	rs10753388	G	A	0.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=17.64;MQ=55.33;MQ0=0;OQ=1324.27;QD=17.66;SB=-679.33	GT:AD:DP:GL:GQ	0/1:36,39:70:-156.80,-21.09,-111.06:99
-chr1	4819163	rs10753389	A	G	70.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=49.63;MQ0=1;OQ=764.05;QD=12.53;SB=-256.89	GT:AD:DP:GL:GQ	0/1:33,28:59:-97.46,-17.77,-133.52:99
-chr1	4819348	rs10915632	G	A	8.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=2;HaplotypeScore=6.46;MQ=58.48;MQ0=0;OQ=1415.77;QD=15.91;SB=-658.28	GT:AD:DP:GL:GQ	0/1:47,42:87:-171.06,-26.20,-164.95:99
-chr1	4819622	rs10799269	C	G	347.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.05;MQ0=0;OQ=934.79;QD=12.98;SB=-429.59	GT:AD:DP:GL:GQ	0/1:41,31:69:-117.56,-20.80,-181.53:99
-chr1	4819655	rs10799270	G	A	353.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.56;MQ0=0;OQ=1064.88;QD=14.39;SB=-436.38	GT:AD:DP:GL:GQ	0/1:41,33:74:-132.06,-22.29,-148.73:99
-chr1	4819737	rs2147027	T	C	200.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.22;MQ=55.94;MQ0=0;OQ=778.52;QD=14.69;SB=-321.29	GT:AD:DP:GL:GQ	0/1:25,28:51:-96.50,-15.36,-95.69:99
-chr1	4820060	rs2181701	T	C	0.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=11.39;MQ=52.25;MQ0=0;OQ=485.51;QD=9.52;SB=-244.48	GT:AD:DP:GL:GQ	0/1:29,22:49:-66.61,-14.77,-110.48:99
-chr1	4820091	rs4265399	G	A	243.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.14;MQ0=0;OQ=512.92;QD=10.06;SB=-45.99	GT:AD:DP:GL:GQ	0/1:32,19:48:-69.05,-14.48,-96.83:99
-chr1	4820096	rs2181700	T	G	75.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=50.99;MQ0=0;OQ=433.90;QD=8.34;SB=-40.01	GT:AD:DP:GL:GQ	0/1:33,19:51:-62.03,-15.36,-122.01:99
-chr1	4820154	rs9725470	C	T	281.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.90;MQ0=2;OQ=495.62;QD=9.01;SB=-102.52	GT:AD:DP:GL:GQ	0/1:37,18:51:-68.22,-15.38,-108.69:99
-chr1	4820216	rs9726479	T	G	79.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=1.15;MQ=45.62;MQ0=0;OQ=697.41;QD=12.24;SB=-299.44	GT:AD:DP:GL:GQ	0/1:30,27:55:-89.59,-16.56,-110.14:99
-chr1	4820227	rs9725796	C	A	40.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=0.33;MQ=47.59;MQ0=0;OQ=717.90;QD=11.58;SB=-300.16	GT:AD:DP:GL:GQ	0/1:34,28:59:-92.84,-17.77,-118.69:99
-chr1	4820388	rs9726805	T	C	201.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=2.98;MQ=51.02;MQ0=0;OQ=985.45;QD=12.17;SB=-457.03	GT:AD:DP:GL:GQ	0/1:42,39:76:-124.72,-22.89,-168.04:99
-chr1	4820748	.	A	G	1.13	PASS	AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.54;MQ=35.53;MQ0=6;OQ=268.28;QD=5.37;SB=-1.83	GT:AD:DP:GL:GQ	0/1:28,21:34:-40.35,-10.24,-88.65:99
-chr1	4820850	.	T	C	0.21	PASS	AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=43.66;MQ0=1;OQ=84.14;QD=3.12;SB=-53.32	GT:AD:DP:GL:GQ	0/1:14,12:16:-16.52,-4.83,-39.77:99
-chr1	4820858	.	G	A	0.93	PASS	AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=4.23;MQ=41.11;MQ0=1;OQ=153.45;QD=5.29;SB=-40.65	GT:AD:DP:GL:GQ	0/1:13,15:17:-23.75,-5.12,-38.01:99
-chr1	4820952	rs61766808	C	T	152.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=38.70;MQ0=1;OQ=409.25;QD=9.09;SB=-225.93	GT:AD:DP:GL:GQ	0/1:30,15:42:-56.86,-12.66,-95.36:99
-chr1	4821240	rs9726227	C	T	470.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=37.63;MQ0=1;OQ=887.90;QD=12.87;SB=-408.68	GT:AD:DP:GL:GQ	0/1:36,33:62:-110.75,-18.67,-130.57:99
-chr1	4821376	rs9726241	C	A	8.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=39.07;MQ0=5;OQ=305.92;QD=4.86;SB=-1.55	GT:AD:DP:GL:GQ	0/1:37,26:47:-48.04,-14.16,-121.88:99
-chr1	4821609	rs9726885	A	C	47.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=36.89;MQ0=14;OQ=448.17;QD=5.67;SB=-207.28	GT:AD:DP:GL:GQ	0/1:47,32:61:-66.47,-18.37,-159.23:99
-chr1	4821773	rs9726925	A	G	101.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=38.22;MQ0=2;OQ=859.75;QD=9.35;SB=-417.48	GT:AD:DP:GL:GQ	0/1:47,45:74:-111.55,-22.29,-173.37:99
-chr1	4821818	rs12135318	C	A	320.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=44.85;MQ0=0;OQ=1111.50;QD=12.21;SB=-470.83	GT:AD:DP:GL:GQ	0/1:41,50:79:-138.22,-23.79,-149.34:99
-chr1	4821875	rs10915634	A	G	55.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=46.72;MQ0=5;OQ=657.16;QD=7.64;SB=-166.48	GT:AD:DP:GL:GQ	0/1:46,40:75:-91.61,-22.61,-188.45:99
-chr1	4822060	rs7411909	A	G	472.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.58;MQ0=0;OQ=844.08;QD=14.07;SB=-331.93	GT:AD:DP:GL:GQ	0/1:31,29:60:-105.77,-18.08,-125.13:99
-chr1	4822115	rs4617370	G	A	221.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=59.00;MQ0=0;OQ=1387.37;QD=17.13;SB=-675.38	GT:AD:DP:GL:GQ	0/1:40,41:81:-166.44,-24.42,-127.76:99
-chr1	4822681	rs6660173	C	T	0.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.01;HRun=3;HaplotypeScore=10.96;MQ=52.45;MQ0=0;OQ=1014.70;QD=13.71;SB=-426.92	GT:AD:DP:GL:GQ	0/1:42,31:73:-126.44,-21.69,-150.88:99
-chr1	4822687	rs6660177	C	A	163.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=52.56;MQ0=0;OQ=900.97;QD=12.01;SB=-430.11	GT:AD:DP:GL:GQ	0/1:44,31:74:-115.67,-22.28,-156.45:99
-chr1	4822710	rs6668068	T	C	72.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=2.96;MQ=50.82;MQ0=0;OQ=906.69;QD=11.78;SB=-477.93	GT:AD:DP:GL:GQ	0/1:44,33:75:-116.54,-22.59,-176.01:99
-chr1	4822958	rs6665282	A	G	464.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.16;MQ0=0;OQ=785.44;QD=13.78;SB=-331.28	GT:AD:DP:GL:GQ	0/1:30,27:57:-99.00,-17.17,-122.67:99
-chr1	4823049	rs6665388	A	G	56.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=2.47;MQ=55.61;MQ0=0;OQ=907.22;QD=12.60;SB=-445.14	GT:AD:DP:GL:GQ	0/1:36,36:67:-114.19,-20.18,-139.94:99
-chr1	4823137	rs12087020	A	G	358.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=54.38;MQ0=0;OQ=1125.73;QD=15.86;SB=-588.93	GT:AD:DP:GL:GQ	0/1:32,39:69:-136.64,-20.78,-130.19:99
-chr1	4823207	rs10915638	C	T	285.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=57.74;MQ0=0;OQ=1338.14;QD=15.93;SB=-487.03	GT:AD:DP:GL:GQ	0/1:44,40:82:-161.79,-24.70,-152.84:99
-chr1	4823247	rs10915639	C	T	70.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=3;HaplotypeScore=1.40;MQ=59.24;MQ0=0;OQ=1272.31;QD=17.19;SB=-602.12	GT:AD:DP:GL:GQ	0/1:37,37:73:-152.51,-22.00,-119.03:99
-chr1	4823334	rs10915640	G	T	485.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.40;MQ0=0;OQ=978.54;QD=13.05;SB=-397.99	GT:AD:DP:GL:GQ	0/1:40,35:71:-122.52,-21.38,-136.84:99
-chr1	4823422	rs10915641	G	A	453.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.14;MQ0=3;OQ=955.26;QD=11.79;SB=-332.42	GT:AD:DP:GL:GQ	0/1:46,35:73:-120.80,-21.99,-150.35:99
-chr1	4824006	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=60;Dels=0.03;HRun=20;HaplotypeScore=17.44;MQ=44.47;MQ0=0;OQ=216.45;QD=3.61;SB=56.16	GT:AD:DP:GL:GQ	0/1:34,24:43:-37.29,-12.36,-108.08:99
-chr1	4824255	rs6656943	G	A	241.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=48.13;MQ0=0;OQ=486.99;QD=9.37;SB=-207.48	GT:AD:DP:GL:GQ	0/1:29,22:45:-65.55,-13.57,-87.60:99
-chr1	4824523	rs6674586	T	A	163.54	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=48.28;MQ0=0;OQ=656.95;QD=12.17;SB=-109.40	GT:AD:DP:GL:GQ	0/1:27,27:47:-83.14,-14.16,-95.96:99
-chr1	4824573	rs6674680	T	C	13.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.68;MQ=52.32;MQ0=0;OQ=270.57;QD=5.11;SB=-156.88	GT:AD:DP:GL:GQ	0/1:35,18:46:-44.20,-13.86,-137.80:99
-chr1	4824574	.	G	A	7.24	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.68;MQ=52.42;MQ0=0;OQ=361.86;QD=6.83;SB=-143.57	GT:AD:DP:GL:GQ	0/1:34,19:46:-53.32,-13.85,-117.68:99
-chr1	4824682	rs12135493	G	A	249.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=51.42;MQ0=1;OQ=988.12;QD=12.83;SB=-444.35	GT:AD:DP:GL:GQ	0/1:44,32:73:-124.08,-21.99,-153.59:99
-chr1	4824703	rs6671779	A	G	149.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.56;MQ=45.45;MQ0=6;OQ=857.95;QD=10.46;SB=-366.21	GT:AD:DP:GL:GQ	0/1:48,33:70:-110.16,-21.08,-158.61:99
-chr1	4824716	rs6674795	T	A	84.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=5.06;MQ=43.80;MQ0=7;OQ=985.67;QD=11.60;SB=-441.50	GT:AD:DP:GL:GQ	0/1:51,34:73:-123.84,-21.98,-157.76:99
-chr1	4824850	rs36062377	G	T	24.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=3;HaplotypeScore=2.62;MQ=51.81;MQ0=1;OQ=1235.06;QD=17.15;SB=-475.54	GT:AD:DP:GL:GQ	0/1:30,42:67:-146.97,-20.18,-98.26:99
-chr1	4825033	rs7529540	T	C	245.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=39.74;MQ0=8;OQ=558.43;QD=7.55;SB=-301.05	GT:AD:DP:GL:GQ	0/1:47,27:63:-78.11,-18.99,-158.23:99
-chr1	4825352	rs4559467	G	A	108.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=5.62;MQ=48.67;MQ0=0;OQ=560.80;QD=11.22;SB=-300.78	GT:AD:DP:GL:GQ	0/1:27,20:40:-71.42,-12.05,-75.01:99
-chr1	4825513	rs4638087	G	C	326.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.47;MQ0=0;OQ=1176.04;QD=19.60;SB=-421.03	GT:AD:DP:GL:GQ	0/1:27,33:59:-138.66,-17.78,-117.95:99
-chr1	4825553	rs4551566	C	G	30.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.33;MQ0=0;OQ=1250.51;QD=22.33;SB=-448.38	GT:AD:DP:GL:GQ	0/1:22,34:55:-144.91,-16.57,-96.90:99
-chr1	4826034	rs7529926	A	G	223.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=2.45;MQ=57.60;MQ0=0;OQ=1139.50;QD=13.57;SB=-533.50	GT:AD:DP:GL:GQ	0/1:44,39:83:-142.23,-25.00,-178.33:99
-chr1	4826162	rs7525613	C	T	13.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=2;HaplotypeScore=3.45;MQ=59.36;MQ0=1;OQ=993.15;QD=10.80;SB=-409.28	GT:AD:DP:GL:GQ	0/1:59,33:90:-129.72,-27.12,-195.16:99
-chr1	4826345	rs2104305	G	T	184.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=57.85;MQ0=1;OQ=505.67;QD=12.64;SB=-209.45	GT:AD:DP:GL:GQ	0/1:21,19:39:-65.60,-11.75,-75.98:99
-chr1	4826423	rs2093767	G	A	138.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=58.83;MQ0=0;OQ=815.33;QD=15.68;SB=-288.73	GT:AD:DP:GL:GQ	0/1:27,25:52:-100.48,-15.67,-95.85:99
-chr1	4826585	rs2093766	C	T	86.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=59.52;MQ0=0;OQ=705.53;QD=13.07;SB=-332.40	GT:AD:DP:GL:GQ	0/1:31,23:54:-90.10,-16.27,-110.86:99
-chr1	4826810	rs10915643	T	G	203.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=57.12;MQ0=0;OQ=525.52;QD=11.94;SB=-258.86	GT:AD:DP:GL:GQ	0/1:23,21:42:-68.49,-12.65,-82.71:99
-chr1	4827586	rs55916988	A	T	25.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=889.58;QD=14.35;SB=-432.48	GT:AD:DP:GL:GQ	0/1:33,29:62:-110.92,-18.68,-123.75:99
-chr1	4827658	rs10915644	C	T	105.99	PASS	AC=1;AF=0.50;AN=2;DB;DP=104;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=60.00;MQ0=0;OQ=1865.95;QD=17.94;SB=-912.01	GT:AD:DP:GL:GQ	0/1:46,58:101:-220.30,-30.43,-168.62:99
-chr1	4828047	rs10915645	G	T	162.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=59.35;MQ0=0;OQ=1117.38;QD=13.97;SB=-570.65	GT:AD:DP:GL:GQ	0/1:41,39:77:-138.21,-23.19,-142.58:99
-chr1	4828218	rs10915646	T	C	280.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.03;MQ=59.65;MQ0=0;OQ=827.35;QD=15.32;SB=-429.21	GT:AD:DP:GL:GQ	0/1:26,28:54:-102.28,-16.26,-103.92:99
-chr1	4829521	rs7525315	A	G	34.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=1.86;MQ=60.00;MQ0=0;OQ=437.24;QD=11.82;SB=-193.62	GT:AD:DP:GL:GQ	0/1:19,18:35:-57.55,-10.55,-75.26:99
-chr1	4829549	rs7511935	G	C	92.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.47;MQ=60.00;MQ0=0;OQ=512.56;QD=13.85;SB=-232.38	GT:AD:DP:GL:GQ	0/1:19,18:33:-64.49,-9.95,-73.26:99
-chr1	4829662	rs7512035	G	A	4.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=9.93;MQ=58.76;MQ0=0;OQ=838.03;QD=17.10;SB=-374.88	GT:AD:DP:GL:GQ	0/1:21,27:46:-104.45,-17.36,-74.24:99
-chr1	4830041	rs1886112	T	C	323.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=58.39;MQ0=0;OQ=754.42;QD=11.79;SB=-313.28	GT:AD:DP:GL:GQ	0/1:35,29:61:-97.11,-18.38,-135.74:99
-chr1	4830111	rs2411950	A	G	299.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=59.44;MQ0=0;OQ=788.01;QD=11.76;SB=-302.20	GT:AD:DP:GL:GQ	0/1:34,33:66:-101.98,-19.90,-134.57:99
-chr1	4831214	rs11588518	A	G	386.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.12;MQ=58.39;MQ0=0;OQ=816.62;QD=14.85;SB=-422.33	GT:AD:DP:GL:GQ	0/1:26,29:53:-100.91,-15.96,-102.18:99
-chr1	4832304	rs10915647	T	G	357.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=59.21;MQ0=0;OQ=992.87;QD=12.89;SB=-411.65	GT:AD:DP:GL:GQ	0/1:36,41:75:-125.17,-22.60,-131.25:99
-chr1	4833095	rs10489136	G	A	381.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=597.16;QD=11.94;SB=-271.12	GT:AD:DP:GL:GQ	0/1:30,20:49:-77.76,-14.76,-108.40:99
-chr1	4833385	rs11809159	G	A	313.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.57;MQ0=0;OQ=671.57;QD=12.44;SB=-350.34	GT:AD:DP:GL:GQ	0/1:33,21:52:-86.11,-15.67,-111.35:99
-chr1	4834568	rs12691490	G	A	57.53	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=2;HaplotypeScore=1.52;MQ=59.19;MQ0=0;OQ=1072.80;QD=14.30;SB=-179.14	GT:AD:DP:GL:GQ	0/1:41,34:74:-132.86,-22.29,-148.17:99
-chr1	4834712	rs11810903	C	T	299.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=59.50;MQ0=0;OQ=847.25;QD=15.99;SB=-334.31	GT:AD:DP:GL:GQ	0/1:27,26:50:-103.07,-15.06,-90.22:99
-chr1	4835505	.	G	A	70.11	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.18;MQ0=2;OQ=1406.02;QD=19.00;SB=-566.58	GT:AD:DP:GL:GQ	0/1:33,41:71:-165.27,-21.39,-109.48:99
-chr1	4835574	rs60862815	A	G	389.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.44;MQ0=0;OQ=1406.97;QD=14.66;SB=-683.24	GT:AD:DP:GL:GQ	0/1:48,48:95:-172.59,-28.61,-196.25:99
-chr1	4835660	.	A	G	23.51	PASS	AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=53.01;MQ0=0;OQ=1833.96;QD=19.10;SB=-522.87	GT:AD:DP:GL:GQ	0/1:39,57:96:-215.59,-28.91,-159.74:99
-chr1	4837550	rs35283465	T	G	356.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=1133.74;QD=16.67;SB=-504.82	GT:AD:DP:GL:GQ	0/1:30,38:68:-137.14,-20.48,-110.12:99
-chr1	4837913	rs10753390	T	C	137.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=2.60;MQ=60.00;MQ0=0;OQ=941.83;QD=14.72;SB=-459.61	GT:AD:DP:GL:GQ	0/1:30,34:62:-116.15,-18.68,-119.75:99
-chr1	4839426	rs942248	G	A	447.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.57;MQ=60.00;MQ0=0;OQ=1139.23;QD=16.75;SB=-553.39	GT:AD:DP:GL:GQ	0/1:34,34:68:-137.70,-20.50,-108.59:99
-chr1	4841270	rs10915651	A	G	240.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=57.66;MQ0=0;OQ=816.55;QD=11.66;SB=-378.12	GT:AD:DP:GL:GQ	0/1:39,31:68:-105.42,-20.48,-155.28:99
-chr1	4841714	rs4654463	A	C	478.61	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=555.94;QD=9.75;SB=-254.73	GT:AD:DP:GL:GQ	0/1:35,22:56:-75.74,-16.86,-132.35:99
-chr1	4844074	rs10733017	T	C	2.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=11.82;MQ=59.63;MQ0=0;OQ=699.51;QD=11.10;SB=-327.09	GT:AD:DP:GL:GQ	0/1:36,27:62:-91.91,-18.68,-144.88:99
-chr1	4844167	rs11576728	C	A	571.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.76;MQ0=0;OQ=1050.49;QD=13.64;SB=-532.68	GT:AD:DP:GL:GQ	0/1:42,35:77:-131.52,-23.19,-153.03:99
-chr1	4844702	rs7543026	G	A	584.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.93;MQ0=0;OQ=948.11;QD=15.54;SB=-391.87	GT:AD:DP:GL:GQ	0/1:33,28:60:-116.18,-18.08,-104.09:99
-chr1	4845341	rs6658585	A	C	76.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=4.00;MQ=59.18;MQ0=0;OQ=1071.52;QD=16.74;SB=-367.56	GT:AD:DP:GL:GQ	0/1:26,38:62:-129.11,-18.67,-97.88:99
-chr1	4845498	rs12057393	G	A	364.71	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=12;HaplotypeScore=3.79;MQ=47.74;MQ0=0;QD=4.19;SB=-24.81	GT:AD:DP:GL:GQ	0/1:67,20:77:-62.95,-23.20,-211.18:99
-chr1	4845501	.	G	A	272.57	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=2;HaplotypeScore=5.43;MQ=47.58;MQ0=0;QD=3.17;SB=59.32	GT:AD:DP:GL:GQ	0/1:69,17:79:-54.34,-23.80,-226.78:99
-chr1	4845504	.	G	A	237.01	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=2;HaplotypeScore=5.58;MQ=47.42;MQ0=0;QD=2.79;SB=100.89	GT:AD:DP:GL:GQ	0/1:69,16:79:-50.79,-23.80,-233.92:99
-chr1	4846112	rs34320332	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=25.56;MQ=59.10;MQ0=1;OQ=980.42;QD=12.41;SB=-508.92	GT:AD:DP:GL:GQ	0/1:43,36:73:-123.31,-21.99,-148.19:99
-chr1	4846138	rs4141866	T	G	321.22	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=1084.74;QD=12.91;SB=-515.88	GT:AD:DP:GL:GQ	0/1:44,39:81:-136.16,-24.40,-149.14:99
-chr1	4846537	rs2224810	C	T	118.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=2;HaplotypeScore=2.15;MQ=60.00;MQ0=0;OQ=819.69;QD=11.71;SB=-407.37	GT:AD:DP:GL:GQ	0/1:43,26:69:-109.19,-23.93,-141.50:99
-chr1	4846628	rs2209160	C	T	102.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=6.02;MQ=59.71;MQ0=0;OQ=1103.05;QD=13.96;SB=-498.70	GT:AD:DP:GL:GQ	0/1:45,34:78:-137.10,-23.51,-139.74:99
-chr1	4847013	rs4654617	G	A	341.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.65;MQ=60.12;MQ0=0;OQ=1328.73;QD=14.44;SB=-558.05	GT:AD:DP:GL:GQ	0/1:51,41:91:-163.57,-27.42,-178.46:99
-chr1	4847234	rs4654618	G	A	257.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.79;MQ0=0;OQ=1473.23;QD=16.93;SB=-644.65	GT:AD:DP:GL:GQ	0/1:44,43:86:-176.51,-25.90,-155.83:99
-chr1	4847304	rs11576619	A	C	410.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1115.68;QD=12.54;SB=-555.85	GT:AD:DP:GL:GQ	0/1:50,39:89:-141.65,-26.80,-188.69:99
-chr1	4848245	rs10915655	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.04;HRun=13;HaplotypeScore=40.55;MQ=53.84;MQ0=0;OQ=783.98;QD=11.53;SB=-399.49	GT:AD:DP:GL:GQ	0/1:35,30:57:-98.55,-16.87,-112.34:99
-chr1	4848259	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=13;HaplotypeScore=8.75;MQ=53.39;MQ0=0;OQ=145.61;QD=2.24;SB=43.71	GT:AD:DP:GL:GQ	0/1:50,15:51:-33.22,-15.38,-143.27:99
-chr1	4848272	rs59534952	C	T	83.18	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.85;MQ=55.61;MQ0=0;OQ=567.99;QD=11.83;SB=-226.73	GT:AD:DP:GL:GQ	0/1:29,19:46:-73.94,-13.86,-98.14:99
-chr1	4849613	rs2224809	G	T	40.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=5.98;MQ=59.05;MQ0=0;OQ=753.24;QD=11.77;SB=-371.10	GT:AD:DP:GL:GQ	0/1:36,28:62:-97.28,-18.68,-118.15:99
-chr1	4851425	rs4654464	C	A	99.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=3;HaplotypeScore=1.30;MQ=59.74;MQ0=0;OQ=1201.43;QD=13.50;SB=-585.67	GT:AD:DP:GL:GQ	0/1:47,42:87:-149.63,-26.21,-164.62:99
-chr1	4851649	rs1544062	A	C	506.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.80;MQ0=0;OQ=1031.53;QD=11.21;SB=-464.74	GT:AD:DP:GL:GQ	0/1:52,40:90:-133.54,-27.11,-194.44:99
-chr1	4852648	rs6664880	A	G	404.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=757.37;QD=15.15;SB=-338.35	GT:AD:DP:GL:GQ	0/1:21,29:49:-93.79,-14.77,-78.78:99
-chr1	4853388	rs16839786	G	T	224.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=53.58;MQ0=0;OQ=920.28;QD=16.43;SB=-211.55	GT:AD:DP:GL:GQ	0/1:26,30:55:-111.88,-16.57,-81.39:99
-chr1	4853673	rs61764897	T	A	731.06	Indel	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=49.62;MQ0=0;QD=11.25;SB=-257.66	GT:AD:DP:GL:GQ	0/1:39,26:64:-95.67,-19.28,-148.40:99
-chr1	4854729	rs11578197	G	A	258.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=59.65;MQ0=0;OQ=1050.33;QD=16.16;SB=-476.48	GT:AD:DP:GL:GQ	0/1:33,32:63:-127.30,-18.99,-107.48:99
-chr1	4855018	rs16839789	C	T	363.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=59.33;MQ0=0;OQ=1117.05;QD=14.70;SB=-538.76	GT:AD:DP:GL:GQ	0/1:39,37:73:-136.99,-22.00,-128.05:99
-chr1	4855722	rs6426446	C	T	346.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.43;MQ0=0;OQ=1302.13;QD=17.84;SB=-634.73	GT:AD:DP:GL:GQ	0/1:34,39:71:-154.89,-21.40,-105.41:99
-chr1	4855930	rs6426447	T	C	166.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=57.78;MQ0=0;OQ=489.14;QD=8.58;SB=-219.87	GT:AD:DP:GL:GQ	0/1:31,26:53:-68.18,-15.98,-120.90:99
-chr1	4856415	rs7547152	G	C	495.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=942.12;QD=15.20;SB=-441.90	GT:AD:DP:GL:GQ	0/1:35,27:61:-115.88,-18.38,-149.41:99
-chr1	4857229	rs58851741	C	T	459.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=966.78;QD=16.67;SB=-403.91	GT:AD:DP:GL:GQ	0/1:27,31:57:-117.15,-17.19,-83.93:99
-chr1	4857438	rs6663654	A	G	150.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=1.74;MQ=59.66;MQ0=0;OQ=1188.14;QD=17.73;SB=-597.99	GT:AD:DP:GL:GQ	0/1:26,41:63:-141.07,-18.98,-97.28:99
-chr1	4857938	rs4654466	T	G	14.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=3;HaplotypeScore=2.02;MQ=60.00;MQ0=0;OQ=2439.19;QD=33.41;SB=-1032.90	GT:AD:DP:GL:GQ	1/1:0,73:72:-247.54,-21.70,-0.04:99
-chr1	4857962	rs4654620	T	C	617.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2216.51;QD=34.63;SB=-1013.85	GT:AD:DP:GL:GQ	1/1:0,64:63:-225.26,-18.98,-0.03:99
-chr1	4858133	rs12026056	C	T	160.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.48;MQ0=0;OQ=1391.17;QD=19.32;SB=-472.46	GT:AD:DP:GL:GQ	0/1:31,41:70:-163.49,-21.09,-105.37:99
-chr1	4858331	rs2411952	T	G	714.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2714.55;QD=33.93;SB=-941.23	GT:AD:DP:GL:GQ	1/1:0,80:78:-275.06,-23.49,-0.02:99
-chr1	4858799	rs10915656	A	G	325.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=541.63;QD=8.88;SB=-253.33	GT:AD:DP:GL:GQ	0/1:37,24:61:-75.83,-18.39,-146.51:99
-chr1	4859646	rs2031246	A	G	219.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=58.68;MQ0=0;OQ=1950.88;QD=29.12;SB=-966.30	GT:AD:DP:GL:GQ	1/1:0,67:62:-198.73,-18.70,-0.06:99
-chr1	4859671	.	T	C	13.11	PASS	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=3.64;MQ=59.06;MQ0=0;OQ=883.63;QD=12.81;SB=-329.17	GT:AD:DP:GL:GQ	0/1:37,32:67:-111.83,-20.19,-139.59:99
-chr1	4859954	rs34895557	G	T	206.38	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.25;MQ=59.24;MQ0=0;OQ=744.21;QD=13.53;SB=-251.43	GT:AD:DP:GL:GQ	0/1:28,27:52:-93.37,-15.67,-91.09:99
-chr1	4860771	rs1998542	A	G	287.69	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.36;MQ0=0;OQ=1092.68;QD=14.57;SB=-569.57	GT:AD:DP:GL:GQ	0/1:37,38:74:-134.84,-22.29,-148.74:99
-chr1	4861394	rs12564397	A	T	437.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=1000.40;QD=17.86;SB=-441.86	GT:AD:DP:GL:GQ	0/1:25,31:56:-120.19,-16.87,-93.72:99
-chr1	4861557	rs35411636	G	A	169.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=59.72;MQ0=0;OQ=1208.45;QD=18.04;SB=-440.97	GT:AD:DP:GL:GQ	0/1:30,37:64:-143.41,-19.28,-105.19:99
-chr1	4863429	.	C	T	229.25	PASS	AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.78;MQ0=0;OQ=1493.09;QD=17.36;SB=-728.57	GT:AD:DP:GL:GQ	0/1:41,45:85:-178.20,-25.60,-151.88:99
-chr1	4863497	rs7524606	G	A	427.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=1.18;MQ=60.00;MQ0=0;OQ=1511.71;QD=17.58;SB=-634.67	GT:AD:DP:GL:GQ	0/1:42,44:85:-180.06,-25.60,-147.35:99
-chr1	4863865	rs1980722	C	T	503.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3056.08;QD=40.21;SB=-645.86	GT:AD:DP:GL:GQ	1/1:0,76:76:-309.21,-22.89,-0.02:99
-chr1	4864428	rs11580747	G	C	245.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=59.63;MQ0=0;OQ=942.97;QD=14.97;SB=-334.34	GT:AD:DP:GL:GQ	0/1:36,27:61:-115.96,-18.38,-154.60:99
-chr1	4865012	rs17345545	A	C	595.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=1349.09;QD=16.06;SB=-446.78	GT:AD:DP:GL:GQ	0/1:36,48:82:-162.89,-24.70,-132.81:99
-chr1	4865105	rs57839229	A	T	93.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=1.14;MQ=59.34;MQ0=0;OQ=1132.50;QD=17.98;SB=-522.98	GT:AD:DP:GL:GQ	0/1:27,36:62:-135.21,-18.67,-99.92:99
-chr1	4865351	rs4654467	A	G	16.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.01;HRun=0;HaplotypeScore=4.70;MQ=59.78;MQ0=0;OQ=2675.08;QD=31.11;SB=-1049.26	GT:AD:DP:GL:GQ	1/1:0,84:83:-271.15,-24.72,-0.06:99
-chr1	4866087	rs10915662	A	T	363.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.38;MQ0=0;OQ=1323.19;QD=19.75;SB=-593.71	GT:AD:DP:GL:GQ	0/1:27,40:67:-155.78,-20.18,-103.30:99
-chr1	4866400	rs12064982	G	A	103.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.34;MQ=60.00;MQ0=0;OQ=973.54;QD=18.03;SB=-247.54	GT:AD:DP:GL:GQ	0/1:25,29:53:-116.61,-15.97,-79.83:99
-chr1	4866918	rs12031154	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=24.82;MQ=54.18;MQ0=0;OQ=935.81;QD=11.27;SB=-380.06	GT:AD:DP:GL:GQ	0/1:43,40:73:-118.86,-22.00,-142.88:99
-chr1	4866921	rs12026933	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.03;HRun=18;HaplotypeScore=19.70;MQ=54.46;MQ0=0;OQ=1554.81;QD=17.87;SB=-743.33	GT:AD:DP:GL:GQ	0/1:33,51:81:-182.28,-23.51,-100.13:99
-chr1	4867019	rs11803696	A	G	583.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=1173.47;QD=12.90;SB=-430.96	GT:AD:DP:GL:GQ	0/1:48,43:89:-147.44,-26.81,-193.48:99
-chr1	4867070	rs6672145	C	T	154.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=58.49;MQ0=0;OQ=2949.30;QD=37.81;SB=-1148.66	GT:AD:DP:GL:GQ	1/1:0,78:74:-298.53,-22.29,-0.02:99
-chr1	4867333	rs10737414	C	T	577.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=3774.90;QD=40.59;SB=-1090.96	GT:AD:DP:GL:GQ	1/1:0,93:91:-376.49,-27.41,-0.02:99
-chr1	4867363	rs7533707	A	T	409.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=3186.97;QD=36.63;SB=-1277.61	GT:AD:DP:GL:GQ	1/1:0,87:84:-322.30,-25.30,-0.02:99
-chr1	4867599	rs7520488	G	C	176.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.17;MQ=58.98;MQ0=0;OQ=1260.85;QD=19.70;SB=-431.87	GT:AD:DP:GL:GQ	0/1:29,35:63:-148.35,-18.98,-119.77:99
-chr1	4867836	rs10753391	C	T	252.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.73;MQ=58.82;MQ0=0;OQ=2192.96;QD=37.17;SB=-1090.48	GT:AD:DP:GL:GQ	1/1:0,58:57:-222.90,-17.17,-0.02:99
-chr1	4869610	rs10753392	A	G	2.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=12.66;MQ=58.15;MQ0=0;OQ=2566.56;QD=33.77;SB=-1061.07	GT:AD:DP:GL:GQ	1/1:1,75:72:-260.27,-21.69,-0.02:99
-chr1	4869715	rs10753393	A	G	57.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.94;MQ=55.52;MQ0=0;OQ=2164.34;QD=32.79;SB=-1098.81	GT:AD:DP:GL:GQ	1/1:0,66:62:-220.05,-18.68,-0.03:99
-chr1	4869773	rs10737415	G	A	79.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=59.56;MQ0=0;OQ=867.20;QD=16.36;SB=-154.19	GT:AD:DP:GL:GQ	0/1:24,29:51:-105.37,-15.37,-83.26:99
-chr1	4869802	rs10753394	T	C	256.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.38;MQ=60.00;MQ0=0;OQ=1715.99;QD=30.64;SB=-772.60	GT:AD:DP:GL:GQ	1/1:0,56:56:-175.25,-16.90,-0.06:99
-chr1	4869982	rs10915666	G	A	210.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.64;MQ=58.75;MQ0=0;OQ=1883.17;QD=36.21;SB=-696.34	GT:AD:DP:GL:GQ	1/1:0,50:49:-191.92,-14.76,-0.02:99
-chr1	4870346	rs6675549	G	A	170.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=4.29;MQ=57.91;MQ0=0;OQ=1211.32;QD=19.23;SB=-547.10	GT:AD:DP:GL:GQ	0/1:28,35:62:-143.11,-18.69,-84.61:99
-chr1	4870866	rs60530383	A	G	40.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=2.54;MQ=60.00;MQ0=0;OQ=824.16;QD=14.46;SB=-305.38	GT:AD:DP:GL:GQ	0/1:28,29:56:-102.57,-16.87,-109.85:99
-chr1	4871367	rs12034557	C	T	506.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1054.17;QD=18.82;SB=-458.82	GT:AD:DP:GL:GQ	0/1:25,31:55:-125.27,-16.57,-85.80:99
-chr1	4871442	rs11584441	T	G	5.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=1.95;MQ=57.60;MQ0=1;OQ=392.05;QD=7.00;SB=-149.17	GT:AD:DP:GL:GQ	0/1:35,21:54:-58.76,-16.27,-123.74:99
-chr1	4871485	rs12034590	C	T	165.34	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.35;MQ0=0;OQ=1273.44;QD=19.90;SB=-540.59	GT:AD:DP:GL:GQ	0/1:26,38:62:-149.30,-18.68,-91.11:99
-chr1	4871683	rs10915667	G	A	252.09	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.13;MQ=59.56;MQ0=0;OQ=868.47;QD=16.70;SB=-440.82	GT:AD:DP:GL:GQ	0/1:26,26:50:-105.19,-15.06,-84.43:99
-chr1	4872046	rs41524347	T	G	240.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=531.74;QD=7.28;SB=-248.55	GT:AD:DP:GL:GQ	0/1:47,26:72:-78.15,-21.69,-181.81:99
-chr1	4872269	rs7549400	A	G	96.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=1.52;MQ=58.82;MQ0=1;OQ=894.68;QD=13.76;SB=-387.61	GT:AD:DP:GL:GQ	0/1:34,31:64:-112.04,-19.29,-126.05:99
-chr1	4872967	rs11805753	C	T	385.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.68;MQ0=0;OQ=1214.98;QD=17.11;SB=-484.47	GT:AD:DP:GL:GQ	0/1:35,36:70:-145.88,-21.10,-111.38:99
-chr1	4873161	rs10915668	C	T	676.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=2872.25;QD=39.89;SB=-1024.38	GT:AD:DP:GL:GQ	1/1:0,72:72:-290.83,-21.69,-0.02:99
-chr1	4874423	rs10915669	T	C	15.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=2.47;MQ=59.06;MQ0=0;OQ=1979.91;QD=28.69;SB=-648.94	GT:AD:DP:GL:GQ	1/1:0,69:62:-201.63,-18.69,-0.05:99
-chr1	4875425	rs10157835	A	G	332.29	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.11;MQ0=0;OQ=1038.14;QD=16.48;SB=-539.00	GT:AD:DP:GL:GQ	0/1:28,35:63:-126.07,-18.98,-114.44:99
-chr1	4877097	rs12565275	C	G	395.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.57;MQ0=0;OQ=611.15;QD=11.32;SB=-239.42	GT:AD:DP:GL:GQ	0/1:33,21:54:-80.69,-16.29,-144.98:99
-chr1	4877956	rs2898849	G	C	124.47	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=59.05;MQ0=0;OQ=3110.04;QD=42.60;SB=-1016.57	GT:AD:DP:GL:GQ	1/1:0,72:72:-314.62,-21.70,-0.03:99
-chr1	4878047	rs12564793	G	C	328.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.70;MQ0=0;OQ=765.57;QD=12.15;SB=-303.80	GT:AD:DP:GL:GQ	0/1:37,26:61:-98.24,-18.40,-159.57:99
-chr1	4880219	rs11585512	A	G	134.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=3.24;MQ=59.43;MQ0=0;OQ=632.04;QD=9.58;SB=-314.90	GT:AD:DP:GL:GQ	0/1:35,31:61:-84.88,-18.39,-132.31:99
-chr1	4880279	rs11583660	G	A	590.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.47;MQ0=0;OQ=976.49;QD=13.95;SB=-412.71	GT:AD:DP:GL:GQ	0/1:40,30:69:-121.72,-20.78,-142.93:99
-chr1	4880552	rs12035499	G	A	202.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.63;MQ0=0;OQ=1072.23;QD=21.02;SB=-458.86	GT:AD:DP:GL:GQ	0/1:20,31:50:-125.57,-15.06,-66.05:99
-chr1	4881363	rs942245	A	G	135.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=2549.24;QD=35.41;SB=-1267.52	GT:AD:DP:GL:GQ	1/1:0,72:71:-258.53,-21.38,-0.02:99
-chr1	4882246	rs6698453	G	A	17.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=3;HaplotypeScore=2.99;MQ=60.00;MQ0=0;OQ=1152.61;QD=20.22;SB=-564.76	GT:AD:DP:GL:GQ	0/1:24,33:57:-135.71,-17.17,-88.68:99
-chr1	4883339	rs12043326	T	C	559.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=840.35;QD=11.84;SB=-378.86	GT:AD:DP:GL:GQ	0/1:36,35:67:-107.51,-20.19,-138.68:99
-chr1	4883603	rs10915672	C	A	302.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=917.14;QD=15.81;SB=-477.86	GT:AD:DP:GL:GQ	0/1:28,30:58:-112.47,-17.47,-92.34:99
-chr1	4883658	rs4141867	T	C	369.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=1888.75;QD=33.14;SB=-779.12	GT:AD:DP:GL:GQ	1/1:0,57:54:-192.48,-16.27,-0.02:99
-chr1	4883885	rs6702564	G	A	362.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=1074.71;QD=17.62;SB=-363.86	GT:AD:DP:GL:GQ	0/1:29,32:61:-129.13,-18.37,-105.65:99
-chr1	4884232	rs1535733	T	C	178.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=1.73;MQ=59.20;MQ0=1;OQ=1010.15;QD=15.08;SB=-514.02	GT:AD:DP:GL:GQ	0/1:32,35:66:-124.18,-19.88,-130.89:99
-chr1	4884527	rs6666792	C	A	73.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=3;HaplotypeScore=1.81;MQ=60.00;MQ0=0;OQ=1017.13;QD=16.14;SB=-354.42	GT:AD:DP:GL:GQ	0/1:29,34:62:-123.67,-18.68,-100.25:99
-chr1	4884742	rs2093765	A	G	735.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=2661.52;QD=35.97;SB=-1066.10	GT:AD:DP:GL:GQ	1/1:0,74:74:-269.76,-22.29,-0.02:99
-chr1	4885223	rs6667433	C	T	727.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=1991.58;QD=36.21;SB=-991.61	GT:AD:DP:GL:GQ	1/1:1,54:54:-205.04,-16.28,-2.29:99
-chr1	4885428	rs10753395	A	C	505.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.54;MQ0=0;OQ=2504.61;QD=34.79;SB=-1254.33	GT:AD:DP:GL:GQ	1/1:0,72:71:-254.07,-21.38,-0.02:99
-chr1	4885629	rs10915675	C	T	373.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=59.20;MQ0=0;OQ=841.96;QD=14.52;SB=-410.79	GT:AD:DP:GL:GQ	0/1:31,27:56:-104.36,-16.88,-95.31:99
-chr1	4886330	rs2411956	G	T	352.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.52;MQ=59.33;MQ0=0;OQ=915.03;QD=14.76;SB=-419.13	GT:AD:DP:GL:GQ	0/1:29,33:59:-112.57,-17.78,-93.60:99
-chr1	4886464	rs2898852	G	A	427.35	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.69;MQ0=0;OQ=1311.14;QD=17.48;SB=-649.71	GT:AD:DP:GL:GQ	0/1:36,39:74:-156.69,-22.29,-124.22:99
-chr1	4887284	rs6666453	T	G	591.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=819.61;QD=13.22;SB=-407.64	GT:AD:DP:GL:GQ	0/1:31,31:61:-103.62,-18.37,-115.39:99
-chr1	4887891	rs61271613	G	A	361.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.32;MQ0=0;OQ=1029.14;QD=15.13;SB=-413.79	GT:AD:DP:GL:GQ	0/1:37,31:68:-126.69,-20.50,-120.37:99
-chr1	4887923	rs12567162	A	C	597.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=1047.19;QD=16.36;SB=-475.28	GT:AD:DP:GL:GQ	0/1:27,37:63:-126.98,-18.97,-102.36:99
-chr1	4888122	rs11584727	G	A	343.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=58.62;MQ0=0;OQ=960.03;QD=15.74;SB=-414.74	GT:AD:DP:GL:GQ	0/1:31,30:58:-116.76,-17.47,-107.44:99
-chr1	4888166	rs10799275	T	C	449.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=759.70;QD=14.07;SB=-405.31	GT:AD:DP:GL:GQ	0/1:28,26:54:-95.52,-16.26,-116.08:99
-chr1	4888741	rs6667349	A	G	162.92	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=1.54;MQ=60.00;MQ0=0;OQ=906.44;QD=15.63;SB=-403.28	GT:AD:DP:GL:GQ	0/1:26,32:57:-111.10,-17.17,-105.01:99
-chr1	4891078	rs10915677	A	C	501.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=791.64;QD=10.84;SB=-393.76	GT:AD:DP:GL:GQ	0/1:42,31:72:-104.14,-21.69,-153.97:99
-chr1	4891278	rs10753396	A	G	48.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.33;MQ=59.27;MQ0=0;OQ=705.13;QD=13.83;SB=-249.29	GT:AD:DP:GL:GQ	0/1:25,26:49:-88.56,-14.77,-92.96:99
-chr1	4892541	rs6675977	C	T	304.31	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.24;MQ0=0;OQ=854.23;QD=15.53;SB=-341.48	GT:AD:DP:GL:GQ	0/1:29,26:53:-104.68,-15.97,-89.47:99
-chr1	4893597	rs9426511	G	A	254.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.65;MQ=59.63;MQ0=0;OQ=950.24;QD=15.08;SB=-473.01	GT:AD:DP:GL:GQ	0/1:32,31:60:-116.38,-18.07,-112.58:99
-chr1	4894312	rs12409253	G	A	317.80	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.37;MQ0=0;OQ=1178.40;QD=17.85;SB=-478.44	GT:AD:DP:GL:GQ	0/1:31,35:66:-141.01,-19.88,-111.62:99
-chr1	4894801	rs12044092	G	A	352.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=58.46;MQ0=0;OQ=1019.91;QD=14.36;SB=-390.41	GT:AD:DP:GL:GQ	0/1:36,34:67:-125.46,-20.19,-124.85:99
-chr1	4894886	rs12049256	T	C	300.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.80;MQ=59.40;MQ0=0;OQ=829.82;QD=11.85;SB=-433.52	GT:AD:DP:GL:GQ	0/1:40,30:69:-107.05,-20.79,-158.76:99
-chr1	4895006	rs11588368	G	A	587.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=820.91;QD=16.10;SB=-424.82	GT:AD:DP:GL:GQ	0/1:26,25:51:-100.74,-15.37,-86.84:99
-chr1	4895035	rs11591047	T	C	208.88	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=456.13;QD=9.70;SB=-221.38	GT:AD:DP:GL:GQ	0/1:26,21:45:-62.46,-13.57,-101.40:99
-chr1	4895453	rs10915681	C	A	168.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=58.81;MQ0=0;OQ=612.66;QD=11.14;SB=-214.30	GT:AD:DP:GL:GQ	0/1:31,24:51:-79.91,-15.36,-100.29:99
-chr1	4895802	rs10915682	G	C	444.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.75;MQ0=0;OQ=770.78;QD=14.82;SB=-369.80	GT:AD:DP:GL:GQ	0/1:29,22:52:-98.80,-18.44,-131.37:99
-chr1	4896045	rs10915683	A	G	284.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.68;MQ0=0;OQ=528.33;QD=8.95;SB=-128.57	GT:AD:DP:GL:GQ	0/1:38,21:56:-72.98,-16.87,-140.47:99
-chr1	4896086	rs4654470	A	G	55.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.44;MQ=59.62;MQ0=0;OQ=494.74;QD=8.11;SB=-214.66	GT:AD:DP:GL:GQ	0/1:40,20:59:-73.24,-20.48,-157.99:99
-chr1	4896521	rs12037632	T	C	412.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.62;MQ0=0;OQ=681.99;QD=11.18;SB=-282.28	GT:AD:DP:GL:GQ	0/1:32,29:59:-89.26,-17.78,-128.31:99
-chr1	4896528	.	C	T	86.04	PASS	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.85;MQ=59.65;MQ0=0;OQ=946.41;QD=14.34;SB=-376.12	GT:AD:DP:GL:GQ	0/1:36,30:66:-117.81,-19.89,-127.23:99
-chr1	4896632	rs12040043	G	A	26.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=5.45;MQ=59.30;MQ0=0;OQ=1274.10;QD=19.30;SB=-654.71	GT:AD:DP:GL:GQ	0/1:28,38:65:-150.27,-19.58,-99.74:99
-chr1	4897223	rs9426467	A	G	376.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=60.00;MQ0=0;OQ=1052.07;QD=15.47;SB=-512.94	GT:AD:DP:GL:GQ	0/1:31,37:66:-128.37,-19.88,-120.24:99
-chr1	4897430	.	C	G	135.89	PASS	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1675.35;QD=20.68;SB=-845.32	GT:AD:DP:GL:GQ	0/1:35,46:79:-194.65,-23.83,-135.28:99
-chr1	4898245	rs9426468	A	G	643.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=1735.77;QD=32.14;SB=-669.84	GT:AD:DP:GL:GQ	1/1:0,54:54:-177.21,-16.28,-0.04:99
-chr1	4899159	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=3;HaplotypeScore=6.05;MQ=46.85;MQ0=0;OQ=120.33;QD=2.27;SB=65.24	GT:AD:DP:GL:GQ	0/1:32,21:41:-27.68,-12.36,-128.17:99
-chr1	4899332	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=18.81;MQ=41.26;MQ0=0;OQ=75.19;QD=0.84;SB=83.30	GT:AD:DP:GL:GQ	0/1:74,15:82:-35.50,-24.70,-289.36:99
-chr1	4899338	rs61764934	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=103;Dels=0.00;HRun=1;HaplotypeScore=53.72;MQ=39.00;MQ0=0;OQ=98.84;QD=0.96;SB=80.29	GT:AD:DP:GL:GQ	0/1:81,22:86:-39.08,-25.91,-300.72:99
-chr1	4899353	.	A	G	53.98	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=1;HaplotypeScore=114.06;MQ=38.02;MQ0=0;QD=0.50;SB=80.29	GT:AD:DP:GL:GQ	0/1:92,15:73:-30.68,-22.00,-253.39:86.82
-chr1	4899362	.	C	T	241.59	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=82.55;MQ=36.98;MQ0=0;QD=2.20;SB=83.28	GT:AD:DP:GL:GQ	0/1:96,14:84:-52.74,-25.30,-256.82:99
-chr1	4899363	.	A	G	254.83	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=0;HaplotypeScore=89.52;MQ=36.48;MQ0=0;QD=2.38;SB=77.27	GT:AD:DP:GL:GQ	0/1:93,14:79:-52.57,-23.80,-259.03:99
-chr1	4899383	.	A	G	183.41	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=0;HaplotypeScore=35.87;MQ=33.65;MQ0=0;QD=1.73;SB=12.92	GT:AD:DP:GL:GQ	0/1:63,43:62:-40.31,-18.69,-193.47:99
-chr1	4899387	.	G	A	263.62	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=1;HaplotypeScore=43.90;MQ=33.13;MQ0=0;QD=2.66;SB=77.22	GT:AD:DP:GL:GQ	0/1:87,12:64:-48.92,-19.28,-184.60:99
-chr1	4899389	.	C	T	535.44	SnpCluster	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=0;HaplotypeScore=29.97;MQ=33.38;MQ0=0;QD=5.76;SB=-42.73	GT:AD:DP:GL:GQ	0/1:50,43:64:-76.11,-19.28,-160.16:99
-chr1	4899390	.	A	G	274.25	SnpCluster	AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=29.97;MQ=32.97;MQ0=0;QD=2.98;SB=-22.76	GT:AD:DP:GL:GQ	0/1:49,43:57:-47.88,-17.17,-174.44:99
-chr1	4899396	.	A	G	365.84	SnpCluster	AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=37.97;MQ=32.55;MQ0=0;QD=4.02;SB=-65.46	GT:AD:DP:GL:GQ	0/1:57,34:58:-57.34,-17.48,-166.05:99
-chr1	4899406	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=33.13;MQ=34.08;MQ0=0;OQ=385.33;QD=4.76;SB=65.23	GT:AD:DP:GL:GQ	0/1:64,17:63:-60.79,-18.98,-180.67:99
-chr1	4899410	.	A	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=33.12;MQ=33.37;MQ0=0;OQ=280.21;QD=3.64;SB=-127.85	GT:AD:DP:GL:GQ	0/1:61,16:68:-51.79,-20.49,-213.95:99
-chr1	4899418	rs61764937	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=24.96;MQ=35.60;MQ0=0;OQ=416.78;QD=5.56;SB=-32.80	GT:AD:DP:GL:GQ	0/1:58,17:68:-65.44,-20.48,-183.51:99
-chr1	4899454	.	A	G	399.94	SnpCluster	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=32.10;MQ=40.74;MQ0=0;QD=4.49;SB=-98.78	GT:AD:DP:GL:GQ	0/1:68,21:81:-67.68,-24.40,-246.97:99
-chr1	4899458	.	A	G	39.06	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=68.26;MQ=40.42;MQ0=0;QD=0.40;SB=83.30	GT:AD:DP:GL:GQ	0/1:88,9:79:-30.98,-23.79,-291.61:71.90
-chr1	4899460	.	A	G	118.03	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=0;HaplotypeScore=72.96;MQ=40.46;MQ0=0;QD=1.18;SB=77.27	GT:AD:DP:GL:GQ	0/1:89,11:76:-37.98,-22.90,-265.09:99
-chr1	4899462	.	C	T	72.49	SnpCluster	AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=1;HaplotypeScore=75.80;MQ=40.64;MQ0=0;QD=0.70;SB=-1.28	GT:AD:DP:GL:GQ	0/1:95,8:73:-32.52,-21.98,-238.14:99
-chr1	4899467	.	A	G	135.65	SnpCluster	AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=98.40;MQ=41.18;MQ0=0;QD=1.23;SB=-29.35	GT:AD:DP:GL:GQ	0/1:96,14:86:-42.76,-25.91,-295.60:99
-chr1	4899468	rs12745382	A	T	958.03	SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=110;Dels=0.00;HRun=0;HaplotypeScore=107.35;MQ=41.23;MQ0=0;QD=8.71;SB=-316.45	GT:AD:DP:GL:GQ	0/1:64,46:95:-127.70,-28.61,-236.36:99
-chr1	4899487	rs12745394	A	G	720.77	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=218;Dels=0.00;HRun=0;HaplotypeScore=160.10;MQ=38.29;MQ0=1;QD=3.31;SB=-244.39	GT:AD:DP:GL:GQ	0/1:161,57:163:-124.48,-49.12,-501.88:99
-chr1	4899493	.	T	C	260.40	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=248;Dels=0.00;HRun=0;HaplotypeScore=303.17;MQ=38.85;MQ0=1;QD=1.05;SB=56.79	GT:AD:DP:GL:GQ	0/1:215,32:203:-90.48,-61.15,-713.61:99
-chr1	4899494	.	G	A	174.70	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=0;HaplotypeScore=310.33;MQ=39.06;MQ0=1;QD=0.69;SB=21.87	GT:AD:DP:GL:GQ	0/1:226,26:203:-81.91,-61.15,-646.58:99
-chr1	4899498	.	A	G	872.52	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=0;HaplotypeScore=250.40;MQ=38.78;MQ0=1;QD=3.46;SB=78.26	GT:AD:DP:GL:GQ	0/1:199,53:211:-154.09,-63.56,-686.66:99
-chr1	4899500	rs12724550	G	A	2189.95	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=250;Dels=0.00;HRun=0;HaplotypeScore=245.89;MQ=38.85;MQ0=1;QD=8.76;SB=-1087.26	GT:AD:DP:GL:GQ	0/1:149,76:205:-341.91,-119.63,-478.96:99
-chr1	4899501	.	T	G	179.31	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=1;HaplotypeScore=255.20;MQ=39.12;MQ0=1;QD=0.71;SB=215.88	GT:AD:DP:GL:GQ	0/1:226,25:204:-82.66,-61.45,-660.80:99
-chr1	4899507	.	A	G	466.12	DPFilter;Indel;SnpCluster	AC=1;AF=0.50;AN=2;DP=254;Dels=0.00;HRun=0;HaplotypeScore=236.48;MQ=39.39;MQ0=1;QD=1.84;SB=155.66	GT:AD:DP:GL:GQ	0/1:206,47:211:-113.47,-63.57,-712.04:99
-chr1	4899538	.	A	G	1219.52	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=258;Dels=0.00;HRun=0;HaplotypeScore=176.47;MQ=39.21;MQ0=0;QD=4.73;SB=-218.54	GT:AD:DP:GL:GQ	0/1:190,68:212:-189.10,-63.86,-642.45:99
-chr1	4899540	.	A	G	894.27	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=255;Dels=0.00;HRun=0;HaplotypeScore=176.74;MQ=39.03;MQ0=0;QD=3.51;SB=-184.63	GT:AD:DP:GL:GQ	0/1:181,72:195:-154.12,-61.41,-609.10:99
-chr1	4899547	rs61764939	G	A	1318.72	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DB;DP=260;Dels=0.00;HRun=0;HaplotypeScore=220.06;MQ=39.48;MQ0=0;QD=5.07;SB=-35.22	GT:AD:DP:GL:GQ	0/1:180,80:174:-187.61,-52.45,-416.57:99
-chr1	4899554	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=0;HaplotypeScore=215.32;MQ=39.44;MQ0=0;OQ=71.48;QD=0.28;SB=245.79	GT:AD:DP:GL:GQ	0/1:233,19:178:-64.05,-53.62,-575.35:99
-chr1	4899560	.	A	G	527.43	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=244;Dels=0.00;HRun=0;HaplotypeScore=182.32;MQ=39.84;MQ0=0;QD=2.16;SB=62.05	GT:AD:DP:GL:GQ	0/1:191,43:207:-132.12,-76.10,-688.26:99
-chr1	4899566	.	C	T	228.85	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=230;Dels=0.00;HRun=0;HaplotypeScore=151.86;MQ=39.79;MQ0=0;QD=0.99;SB=29.83	GT:AD:DP:GL:GQ	0/1:207,23:173:-78.29,-52.12,-551.64:99
-chr1	4899567	.	A	G	591.79	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=224;Dels=0.00;HRun=0;HaplotypeScore=146.70;MQ=39.85;MQ0=0;QD=2.64;SB=-287.04	GT:AD:DP:GL:GQ	0/1:172,52:165:-112.16,-49.70,-538.18:99
-chr1	4899578	.	G	A	586.91	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=167;Dels=0.00;HRun=1;HaplotypeScore=122.95;MQ=41.57;MQ0=0;QD=3.51;SB=-235.54	GT:AD:DP:GL:GQ	0/1:137,30:123:-99.03,-37.05,-345.51:99
-chr1	4899580	.	G	A	442.86	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=161;Dels=0.00;HRun=0;HaplotypeScore=120.46;MQ=41.82;MQ0=0;QD=2.75;SB=-225.49	GT:AD:DP:GL:GQ	0/1:135,26:120:-83.72,-36.15,-349.19:99
-chr1	4899586	.	T	C	690.02	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=1;HaplotypeScore=129.55;MQ=42.82;MQ0=0;QD=4.63;SB=-75.61	GT:AD:DP:GL:GQ	0/1:103,46:129:-111.14,-38.86,-403.04:99
-chr1	4899587	.	G	A	484.27	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=0;HaplotypeScore=116.82;MQ=42.67;MQ0=0;QD=3.32;SB=137.44	GT:AD:DP:GL:GQ	0/1:119,26:124:-89.06,-37.35,-358.44:99
-chr1	4899593	.	C	T	11.57	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=60.92;MQ=43.18;MQ0=0;QD=0.10;SB=158.52	GT:AD:DP:GL:GQ	0/1:100,17:99:-34.23,-29.82,-323.42:44.09
-chr1	4899594	.	A	G	11.09	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=0;HaplotypeScore=60.92;MQ=43.00;MQ0=0;QD=0.10;SB=173.58	GT:AD:DP:GL:GQ	0/1:99,17:103:-35.39,-31.03,-369.44:43.58
-chr1	4899610	.	C	T	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=9.15;MQ=43.55;MQ0=0;OQ=197.17;QD=2.22;SB=-29.37	GT:AD:DP:GL:GQ	0/1:75,14:86:-48.93,-25.93,-238.79:99
-chr1	4899946	rs4654471	T	C	43.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=5.91;MQ=59.14;MQ0=0;OQ=975.13;QD=18.06;SB=-440.01	GT:AD:DP:GL:GQ	0/1:20,34:52:-116.46,-15.67,-76.61:99
-chr1	4902227	rs7555212	C	T	596.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=2926.83;QD=40.65;SB=-1218.62	GT:AD:DP:GL:GQ	1/1:0,72:72:-296.28,-21.69,-0.02:99
-chr1	4902317	rs6426367	G	T	224.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=2;HaplotypeScore=-0.06;MQ=59.74;MQ0=0;OQ=3145.50;QD=36.16;SB=-1581.61	GT:AD:DP:GL:GQ	1/1:0,87:85:-318.15,-25.60,-0.02:99
-chr1	4902486	rs6426368	C	T	717.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.86;MQ0=0;OQ=2201.20;QD=38.62;SB=-1092.00	GT:AD:DP:GL:GQ	1/1:0,57:56:-223.72,-16.87,-0.02:99
-chr1	4902573	rs6669905	T	C	700.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.30;MQ0=0;OQ=2165.11;QD=36.09;SB=-859.36	GT:AD:DP:GL:GQ	1/1:0,60:59:-220.11,-17.77,-0.01:99
-chr1	4903007	rs6678838	G	T	279.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=56.35;MQ0=0;OQ=1768.51;QD=34.01;SB=-813.84	GT:AD:DP:GL:GQ	1/1:0,52:50:-180.45,-15.06,-0.02:99
-chr1	4903027	rs12142452	G	T	0	FDRtranche2.00to10.00+	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.05;HRun=16;HaplotypeScore=13.19;MQ=49.10;MQ0=0;OQ=2384.03;QD=31.37;SB=-1040.48	GT:AD:DP:GL:GQ	1/1:0,72:70:-242.01,-20.48,-0.02:99
-chr1	4903364	rs9286971	G	A	258.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=52.70;MQ0=0;OQ=2159.66;QD=37.89;SB=-926.32	GT:AD:DP:GL:GQ	1/1:0,57:54:-219.56,-16.27,-0.01:99
-chr1	4904108	rs10799141	A	G	488.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.61;MQ0=0;OQ=2393.63;QD=33.71;SB=-1173.70	GT:AD:DP:GL:GQ	1/1:0,71:69:-242.98,-20.79,-0.03:99
-chr1	4904115	rs10753341	C	T	707.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.70;MQ0=0;OQ=2995.63;QD=39.42;SB=-1442.45	GT:AD:DP:GL:GQ	1/1:0,76:76:-303.17,-22.90,-0.02:99
-chr1	4904188	rs10753342	G	A	611.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3529.10;QD=39.65;SB=-1221.14	GT:AD:DP:GL:GQ	1/1:0,89:89:-351.91,-26.82,-0.03:99
-chr1	4905340	rs7531490	A	G	249.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.93;MQ0=0;OQ=2004.17;QD=30.83;SB=-867.03	GT:AD:DP:GL:GQ	1/1:0,65:64:-204.06,-19.31,-0.06:99
-chr1	4905635	rs7534281	T	C	82.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=2.19;MQ=59.65;MQ0=0;OQ=2315.03;QD=35.08;SB=-1175.74	GT:AD:DP:GL:GQ	1/1:0,66:65:-235.11,-19.58,-0.02:99
-chr1	4905656	rs7542048	G	A	139.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=59.63;MQ0=0;OQ=2472.89;QD=39.25;SB=-1234.03	GT:AD:DP:GL:GQ	1/1:0,62:62:-250.89,-18.68,-0.02:99
-chr1	4906196	rs6426371	T	C	169.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=58.85;MQ0=0;OQ=1914.58;QD=30.88;SB=-835.64	GT:AD:DP:GL:GQ	1/1:0,62:59:-195.09,-17.79,-0.04:99
-chr1	4906502	rs6426372	G	C	538.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.04;MQ0=0;OQ=3170.49;QD=42.84;SB=-1473.31	GT:AD:DP:GL:GQ	1/1:0,73:73:-320.65,-21.99,-0.02:99
-chr1	4907095	rs10915296	T	C	149.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=1;HaplotypeScore=1.07;MQ=58.97;MQ0=0;OQ=3030.02;QD=34.83;SB=-1495.63	GT:AD:DP:GL:GQ	1/1:0,87:84:-306.61,-25.30,-0.03:99
-chr1	4907407	rs6702058	C	T	201.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=59.72;MQ0=0;OQ=3144.08;QD=38.34;SB=-1502.68	GT:AD:DP:GL:GQ	1/1:0,81:79:-318.01,-23.80,-0.02:99
-chr1	4907813	rs6677619	G	T	634.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2646.47;QD=36.25;SB=-1071.58	GT:AD:DP:GL:GQ	1/1:0,73:72:-268.25,-21.68,-0.02:99
-chr1	4909109	rs7413385	A	G	73.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=58.33;MQ0=0;OQ=950.25;QD=33.94;SB=-350.81	GT:AD:DP:GL:GQ	1/1:0,28:27:-98.62,-8.13,-0.01:81.24
-chr1	4909713	rs7413847	A	G	78.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.66;MQ=58.99;MQ0=0;OQ=2491.44;QD=34.13;SB=-1130.80	GT:AD:DP:GL:GQ	1/1:0,72:69:-252.75,-20.78,-0.02:99
-chr1	4909933	rs7411727	C	T	614.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=2836.35;QD=38.85;SB=-1407.70	GT:AD:DP:GL:GQ	1/1:0,73:71:-287.24,-21.39,-0.02:99
-chr1	4910002	rs10915297	T	C	288.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.37;MQ0=0;OQ=2563.56;QD=35.12;SB=-1064.10	GT:AD:DP:GL:GQ	1/1:0,73:72:-259.97,-21.69,-0.02:99
-chr1	4910067	rs10799142	G	A	129.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=58.55;MQ0=0;OQ=2372.23;QD=38.89;SB=-1035.39	GT:AD:DP:GL:GQ	1/1:0,61:60:-240.82,-18.08,-0.02:99
-chr1	4910738	rs6426373	T	C	29.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=4;HaplotypeScore=1.33;MQ=59.62;MQ0=0;OQ=2095.65;QD=34.35;SB=-1007.72	GT:AD:DP:GL:GQ	1/1:0,61:59:-213.17,-17.77,-0.02:99
-chr1	4910848	rs6664358	C	T	341.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.71;MQ0=0;OQ=2577.25;QD=39.65;SB=-933.73	GT:AD:DP:GL:GQ	1/1:0,65:64:-261.33,-19.28,-0.02:99
-chr1	4911242	rs9426489	G	T	99.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=59.58;MQ0=0;OQ=1563.55;QD=28.43;SB=-641.98	GT:AD:DP:GL:GQ	1/1:2,53:45:-159.96,-13.56,-0.02:99
-chr1	4911262	rs9426490	A	G	133.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=1.03;MQ=60.00;MQ0=0;OQ=2076.79;QD=34.05;SB=-972.82	GT:AD:DP:GL:GQ	1/1:0,61:59:-211.29,-17.77,-0.02:99
-chr1	4911898	rs7522655	C	T	592.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2724.61;QD=40.67;SB=-1189.07	GT:AD:DP:GL:GQ	1/1:0,67:67:-276.06,-20.18,-0.01:99
-chr1	4911961	rs7544541	G	A	150.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=1.61;MQ=59.39;MQ0=0;OQ=2947.98;QD=38.79;SB=-1404.70	GT:AD:DP:GL:GQ	1/1:1,75:74:-298.40,-22.29,-0.02:99
-chr1	4911968	rs7544542	G	A	170.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=59.72;MQ0=0;OQ=3112.64;QD=37.96;SB=-1553.08	GT:AD:DP:GL:GQ	1/1:0,82:78:-314.87,-23.50,-0.02:99
-chr1	4912150	rs9426469	G	A	193	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.69;MQ0=0;OQ=2864.62;QD=38.19;SB=-1302.32	GT:AD:DP:GL:GQ	1/1:0,75:72:-290.07,-21.69,-0.02:99
-chr1	4913505	rs9426491	A	G	394.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.04;MQ0=0;OQ=3121.73;QD=35.88;SB=-1295.55	GT:AD:DP:GL:GQ	1/1:0,87:85:-315.78,-25.60,-0.02:99
-chr1	4914443	rs6692780	T	C	192.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=103;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=59.62;MQ0=0;OQ=3691.18;QD=35.84;SB=-1586.36	GT:AD:DP:GL:GQ	1/1:1,102:102:-368.12,-30.72,-0.04:99
-chr1	4914588	rs6701289	G	A	24.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=4;HaplotypeScore=1.20;MQ=58.58;MQ0=0;OQ=3206.41;QD=40.08;SB=-1396.85	GT:AD:DP:GL:GQ	1/1:0,80:78:-324.24,-23.49,-0.01:99
-chr1	4915327	rs6693486	A	T	79.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=3;HaplotypeScore=0.67;MQ=59.04;MQ0=0;OQ=2495.92;QD=36.70;SB=-983.49	GT:AD:DP:GL:GQ	1/1:0,68:67:-253.20,-20.19,-0.02:99
-chr1	4915704	rs6656223	G	A	492.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1843.82;QD=39.23;SB=-720.96	GT:AD:DP:GL:GQ	1/1:0,47:46:-187.98,-13.86,-0.01:99
-chr1	4917206	rs12098076	G	A	321.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=59.37;MQ0=0;OQ=1024.17;QD=17.36;SB=-411.74	GT:AD:DP:GL:GQ	0/1:27,32:58:-123.18,-17.47,-93.16:99
-chr1	4918178	rs9426470	C	A	210.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=2272.14;QD=33.41;SB=-999.37	GT:AD:DP:GL:GQ	1/1:0,68:66:-230.83,-19.89,-0.03:99
-chr1	4918637	rs6696925	G	C	480.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=1020.90;QD=16.74;SB=-452.39	GT:AD:DP:GL:GQ	0/1:33,28:59:-123.15,-17.78,-134.82:99
-chr1	4920934	rs7546019	A	G	7.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.94;MQ=55.17;MQ0=0;OQ=1312.69;QD=25.74;SB=-576.91	GT:AD:DP:GL:GQ	1/1:0,51:42:-134.90,-12.67,-0.04:99
-chr1	4920939	rs10799143	A	G	1.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=9.55;MQ=55.37;MQ0=0;OQ=685.84;QD=14.29;SB=-109.82	GT:AD:DP:GL:GQ	1/1:0,38:24:-75.74,-10.17,-3.57:66.02
-chr1	4920972	rs10753343	C	T	150.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.67;MQ0=0;OQ=1219.60;QD=34.85;SB=-488.14	GT:AD:DP:GL:GQ	1/1:0,34:33:-125.56,-9.95,-0.02:99
-chr1	4921030	rs10799144	A	G	161.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=58.57;MQ0=0;OQ=1984.77;QD=33.64;SB=-769.10	GT:AD:DP:GL:GQ	1/1:0,59:57:-202.08,-17.17,-0.02:99
-chr1	4921060	rs10799145	T	G	245.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=58.90;MQ0=0;OQ=1759.60;QD=29.82;SB=-867.69	GT:AD:DP:GL:GQ	1/1:0,59:58:-179.61,-17.49,-0.06:99
-chr1	4921319	.	C	T	71.66	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=56.87;MQ0=0;OQ=1537.50;QD=20.78;SB=-754.34	GT:AD:DP:GL:GQ	0/1:29,45:71:-178.43,-21.40,-86.91:99
-chr1	4921542	.	G	A	297.10	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=827.15;QD=15.32;SB=-385.90	GT:AD:DP:GL:GQ	0/1:29,25:54:-102.27,-16.28,-92.99:99
-chr1	4921651	.	A	G	14.60	PASS	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=3;HaplotypeScore=0.89;MQ=59.42;MQ0=0;OQ=1167.54;QD=16.22;SB=-587.69	GT:AD:DP:GL:GQ	0/1:31,41:71:-141.43,-21.39,-125.09:99
-chr1	4921748	.	T	C	1.07	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=7.77;MQ=59.39;MQ0=0;OQ=610.60;QD=12.72;SB=-231.30	GT:AD:DP:GL:GQ	0/1:26,22:47:-78.51,-14.17,-96.88:99
-chr1	4921801	.	A	G	290.73	PASS	AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=740.93;QD=13.98;SB=-339.17	GT:AD:DP:GL:GQ	0/1:24,29:53:-93.36,-15.98,-94.97:99
-chr1	4921915	rs12118118	A	G	141.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=59.65;MQ0=0;OQ=641.25;QD=9.87;SB=-176.55	GT:AD:DP:GL:GQ	0/1:39,26:63:-86.39,-18.98,-152.81:99
-chr1	4922627	rs12119864	T	C	423.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=1.43;MQ=58.63;MQ0=0;OQ=1289.06;QD=15.17;SB=-556.56	GT:AD:DP:GL:GQ	0/1:33,52:81:-156.60,-24.41,-132.69:99
-chr1	4923016	rs6426374	A	G	591.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.54;MQ0=0;OQ=2408.23;QD=29.37;SB=-1057.43	GT:AD:DP:GL:GQ	1/1:0,82:76:-244.48,-22.92,-0.07:99
-chr1	4923151	.	C	T	132.84	PASS	AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.33;MQ0=0;OQ=908.76;QD=16.23;SB=-453.45	GT:AD:DP:GL:GQ	0/1:28,28:56:-111.04,-16.88,-89.80:99
-chr1	4923249	.	A	G	76.65	PASS	AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=58.95;MQ0=0;OQ=491.85;QD=11.18;SB=-227.32	GT:AD:DP:GL:GQ	0/1:25,19:38:-63.92,-11.45,-77.07:99
-chr1	4923272	.	A	G	41.93	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.77;MQ=59.16;MQ0=0;OQ=549.57;QD=9.99;SB=-300.17	GT:AD:DP:GL:GQ	0/1:32,23:55:-74.82,-16.58,-127.48:99
-chr1	4923290	rs6702660	A	G	624.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1543.54;QD=30.27;SB=-737.76	GT:AD:DP:GL:GQ	1/1:0,51:50:-157.99,-15.08,-0.05:99
-chr1	4923916	.	G	A	53.20	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=57.14;MQ0=0;OQ=1330.08;QD=17.97;SB=-412.89	GT:AD:DP:GL:GQ	0/1:35,39:72:-157.99,-21.70,-107.79:99
-chr1	4923977	.	T	C	92.93	PASS	AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=56.31;MQ0=0;OQ=878.08;QD=13.94;SB=-397.92	GT:AD:DP:GL:GQ	0/1:29,34:62:-109.78,-18.69,-109.67:99
-chr1	4924245	rs7523398	G	T	624.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.01;HRun=0;HaplotypeScore=0.00;MQ=52.50;MQ0=0;OQ=2976.14;QD=35.01;SB=-1222.44	GT:AD:DP:GL:GQ	1/1:0,84:82:-301.22,-24.40,-0.02:99
-chr1	4924289	.	C	T	145.80	Indel	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=20.35;MQ=47.42;MQ0=2;QD=1.80;SB=-17.33	GT:AD:DP:GL:GQ	0/1:69,12:76:-40.75,-22.89,-240.21:99
-chr1	4924318	.	A	G	303.69	PASS	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.53;MQ0=0;OQ=1150.10;QD=15.13;SB=-395.92	GT:AD:DP:GL:GQ	0/1:29,47:72:-140.00,-21.70,-115.03:99
-chr1	4924353	.	A	G	6.39	PASS	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=4.52;MQ=59.31;MQ0=0;OQ=1199.85;QD=16.00;SB=-524.06	GT:AD:DP:GL:GQ	0/1:32,42:73:-145.26,-21.99,-127.06:99
-chr1	4924370	.	T	G	76.39	PASS	AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=60.52;MQ0=0;OQ=1415.60;QD=18.15;SB=-500.81	GT:AD:DP:GL:GQ	0/1:31,47:78:-168.34,-23.49,-113.39:99
-chr1	4924651	rs140619	A	C	98.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=1.45;MQ=58.44;MQ0=0;OQ=1008.29;QD=14.00;SB=-504.32	GT:AD:DP:GL:GQ	0/1:36,36:69:-124.90,-20.78,-122.36:99
-chr1	4924659	rs140620	C	G	66.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=3.55;MQ=58.47;MQ0=0;OQ=1278.05;QD=17.51;SB=-626.38	GT:AD:DP:GL:GQ	0/1:37,36:72:-152.80,-21.71,-149.62:99
-chr1	4924842	rs3101217	G	A	427.04	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=60.00;MQ0=0;OQ=946.64;QD=12.46;SB=-438.36	GT:AD:DP:GL:GQ	0/1:44,31:68:-118.44,-20.49,-128.20:99
-chr1	4924889	rs3101218	G	C	576.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1334.27;QD=16.68;SB=-624.99	GT:AD:DP:GL:GQ	0/1:41,39:77:-159.91,-23.20,-177.20:99
-chr1	4924920	rs3101219	T	C	593.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=1041.98;QD=16.28;SB=-455.18	GT:AD:DP:GL:GQ	0/1:28,36:64:-126.76,-19.28,-110.51:99
-chr1	4924999	rs3101220	G	C	298.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.20;MQ0=0;OQ=811.79;QD=14.00;SB=-233.01	GT:AD:DP:GL:GQ	0/1:32,26:57:-101.64,-17.18,-138.57:99
-chr1	4925039	rs3128678	A	G	0.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=4;HaplotypeScore=3.38;MQ=59.22;MQ0=0;OQ=1744.26;QD=32.30;SB=-816.04	GT:AD:DP:GL:GQ	1/1:0,54:50:-178.03,-15.06,-0.02:99
-chr1	4925077	rs3101221	C	A	25.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=6.44;MQ=58.58;MQ0=0;OQ=647.61;QD=11.56;SB=-325.00	GT:AD:DP:GL:GQ	0/1:30,26:49:-82.82,-14.77,-78.79:99
-chr1	4925169	rs3128679	A	G	107.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=60.00;MQ0=0;OQ=535.15;QD=8.92;SB=-144.42	GT:AD:DP:GL:GQ	0/1:36,24:59:-74.58,-17.78,-140.21:99
-chr1	4925429	rs3128680	G	A	469.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=766.43;QD=14.46;SB=-348.86	GT:AD:DP:GL:GQ	0/1:29,24:53:-95.89,-15.97,-104.44:99
-chr1	4925430	rs3101222	C	G	427.23	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=771.83;QD=15.13;SB=-299.97	GT:AD:DP:GL:GQ	0/1:28,23:50:-95.55,-15.08,-110.57:99
-chr1	4925635	rs3101223	A	G	252.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.74;MQ0=0;OQ=1091.51;QD=12.26;SB=-378.11	GT:AD:DP:GL:GQ	0/1:48,41:87:-138.64,-26.21,-194.64:99
-chr1	4926101	rs3128681	G	A	350.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=59.68;MQ0=0;OQ=1174.87;QD=16.55;SB=-610.10	GT:AD:DP:GL:GQ	0/1:35,35:70:-141.86,-21.09,-114.49:99
-chr1	4926299	rs1017724	C	T	190.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1174.58;QD=15.06;SB=-383.10	GT:AD:DP:GL:GQ	0/1:41,37:77:-143.94,-23.19,-149.98:99
-chr1	4926372	rs1017726	A	G	298.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=60.00;MQ0=0;OQ=887.74;QD=17.07;SB=-423.28	GT:AD:DP:GL:GQ	0/1:22,30:52:-107.72,-15.67,-84.02:99
-chr1	4926476	rs3128682	A	G	470.65	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=981.70;QD=13.27;SB=-502.91	GT:AD:DP:GL:GQ	0/1:33,41:71:-122.87,-21.41,-123.57:99
-chr1	4926532	rs3128683	G	T	372.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.69;MQ0=0;OQ=1069.82;QD=14.26;SB=-471.94	GT:AD:DP:GL:GQ	0/1:37,38:72:-131.95,-21.69,-128.03:99
-chr1	4926586	rs34841047	T	C	307.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.74;MQ0=0;OQ=1407.30;QD=15.64;SB=-662.64	GT:AD:DP:GL:GQ	0/1:42,48:89:-170.82,-26.81,-167.25:99
-chr1	4926613	rs7547938	A	C	101.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=59.79;MQ0=0;OQ=2670.20;QD=30.00;SB=-1246.34	GT:AD:DP:GL:GQ	1/1:1,88:87:-270.68,-26.22,-0.07:99
-chr1	4926617	.	G	A	38.65	PASS	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=1;HaplotypeScore=1.60;MQ=59.78;MQ0=0;OQ=1691.34;QD=19.90;SB=-782.69	GT:AD:DP:GL:GQ	0/1:36,49:84:-197.72,-25.30,-133.23:99
-chr1	4926705	rs10799146	C	G	149.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.64;MQ0=0;OQ=2201.93;QD=42.34;SB=-980.37	GT:AD:DP:GL:GQ	1/1:0,52:52:-223.80,-15.67,-0.02:99
-chr1	4926719	.	T	C	99.55	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=59.60;MQ0=0;OQ=721.00;QD=12.65;SB=-331.93	GT:AD:DP:GL:GQ	0/1:26,31:55:-91.96,-16.58,-103.71:99
-chr1	4926770	.	T	G	92.62	PASS	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=58.93;MQ0=0;OQ=842.91;QD=13.82;SB=-346.83	GT:AD:DP:GL:GQ	0/1:28,33:58:-105.05,-17.47,-101.93:99
-chr1	4926781	rs10915300	G	A	186.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=58.91;MQ0=0;OQ=2257.64;QD=37.63;SB=-1055.32	GT:AD:DP:GL:GQ	1/1:0,60:57:-229.37,-17.17,-0.02:99
-chr1	4927339	rs6426375	C	A	293.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.65;MQ=59.63;MQ0=0;OQ=1104.83;QD=17.54;SB=-437.22	GT:AD:DP:GL:GQ	0/1:25,38:59:-131.54,-17.77,-79.77:99
-chr1	4927361	rs12122012	G	C	449.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=855.62;QD=14.50;SB=-302.94	GT:AD:DP:GL:GQ	0/1:34,25:57:-106.02,-17.18,-140.73:99
-chr1	4927449	rs12129823	C	A	265.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=58.95;MQ0=0;OQ=867.88;QD=14.00;SB=-380.76	GT:AD:DP:GL:GQ	0/1:32,30:60:-108.15,-18.08,-97.33:99
-chr1	4927847	rs12122183	G	A	490.19	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1239.90;QD=16.31;SB=-577.98	GT:AD:DP:GL:GQ	0/1:38,38:75:-149.87,-22.60,-137.70:99
-chr1	4928324	rs10799147	T	G	316.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.64;MQ0=0;OQ=672.70;QD=12.94;SB=-277.80	GT:AD:DP:GL:GQ	0/1:27,25:51:-85.91,-15.36,-101.41:99
-chr1	4928782	.	A	T	20.70	PASS	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.98;MQ0=0;OQ=748.61;QD=18.26;SB=-256.98	GT:AD:DP:GL:GQ	0/1:17,24:41:-90.49,-12.35,-66.37:99
-chr1	4930115	rs10799148	T	G	517.72	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=2291.16;QD=34.71;SB=-1027.09	GT:AD:DP:GL:GQ	1/1:0,66:65:-232.72,-19.58,-0.02:99
-chr1	4930427	rs34645017	G	C	291.45	PASS	AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=722.42;QD=16.05;SB=-202.61	GT:AD:DP:GL:GQ	0/1:25,20:45:-89.08,-13.56,-109.77:99
-chr1	4930735	rs11578909	A	G	280.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=59.36;MQ0=0;OQ=698.77;QD=12.05;SB=-374.99	GT:AD:DP:GL:GQ	0/1:29,28:57:-90.34,-17.18,-117.72:99
-chr1	4931239	rs10799149	G	A	641.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.08;MQ0=0;OQ=2438.74;QD=39.98;SB=-916.20	GT:AD:DP:GL:GQ	1/1:0,61:60:-247.47,-18.07,-0.01:99
-chr1	4931421	rs7518523	A	G	261.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.88;MQ0=0;OQ=2083.34;QD=31.09;SB=-1042.40	GT:AD:DP:GL:GQ	1/1:0,67:65:-211.96,-19.60,-0.05:99
-chr1	4931997	rs10753344	T	C	618.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2888.62;QD=33.98;SB=-1001.71	GT:AD:DP:GL:GQ	1/1:0,85:82:-292.48,-24.71,-0.04:99
-chr1	4932316	rs12127329	G	A	183.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=2411.54;QD=39.53;SB=-1136.02	GT:AD:DP:GL:GQ	1/1:0,61:61:-244.76,-18.38,-0.02:99
-chr1	4932881	rs11585724	C	T	291.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=59.24;MQ0=0;OQ=985.86;QD=16.16;SB=-484.11	GT:AD:DP:GL:GQ	0/1:30,31:59:-119.65,-17.78,-92.67:99
-chr1	4932899	rs56016205	G	C	205.73	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=58.78;MQ0=0;OQ=942.89;QD=16.54;SB=-283.52	GT:AD:DP:GL:GQ	0/1:30,27:56:-114.45,-16.88,-128.26:99
-chr1	4933102	rs56190527	G	A	17.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=7.39;MQ=59.07;MQ0=0;OQ=754.79;QD=15.10;SB=-398.92	GT:AD:DP:GL:GQ	0/1:26,24:48:-93.22,-14.46,-90.86:99
-chr1	4933190	rs56216708	T	C	104.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.13;MQ0=0;OQ=1884.00;QD=35.55;SB=-879.00	GT:AD:DP:GL:GQ	1/1:0,53:53:-192.00,-15.97,-0.02:99
-chr1	4933296	.	G	A	768.22	SnpCluster	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.45;MQ0=0;QD=12.59;SB=-376.12	GT:AD:DP:GL:GQ	0/1:35,26:58:-97.59,-17.48,-110.76:99
-chr1	4933297	.	C	T	815.45	SnpCluster	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.45;MQ0=0;QD=13.37;SB=-431.91	GT:AD:DP:GL:GQ	0/1:35,26:61:-103.20,-18.37,-126.35:99
-chr1	4933303	.	G	A	803.12	SnpCluster	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.37;MQ0=0;QD=13.39;SB=-365.85	GT:AD:DP:GL:GQ	0/1:35,25:58:-101.08,-17.48,-105.94:99
-chr1	4933521	rs7535462	G	A	371.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=1957.02;QD=39.14;SB=-986.02	GT:AD:DP:GL:GQ	1/1:0,50:49:-199.30,-14.76,-0.01:99
-chr1	4933673	.	C	G	6.69	PASS	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=58.23;MQ0=0;OQ=1494.10;QD=22.64;SB=-505.26	GT:AD:DP:GL:GQ	0/1:26,40:63:-171.68,-18.99,-100.63:99
-chr1	4934014	rs12128545	G	A	43.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=0.74;MQ=59.66;MQ0=0;OQ=1421.27;QD=20.90;SB=-664.71	GT:AD:DP:GL:GQ	0/1:27,41:67:-165.59,-20.18,-95.71:99
-chr1	4934078	rs12136209	C	G	149.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.61;MQ=60.00;MQ0=0;OQ=1636.42;QD=21.82;SB=-832.32	GT:AD:DP:GL:GQ	0/1:31,44:75:-189.53,-22.60,-132.33:99
-chr1	4934416	rs12126894	T	G	441.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.57;MQ0=0;OQ=586.00;QD=11.49;SB=-304.83	GT:AD:DP:GL:GQ	0/1:29,22:51:-77.25,-15.36,-105.02:99
-chr1	4935048	rs10915303	A	G	334.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.69;MQ=51.50;MQ0=0;OQ=770.15;QD=12.84;SB=-364.97	GT:AD:DP:GL:GQ	0/1:27,33:52:-95.98,-15.68,-87.76:99
-chr1	4935474	rs34001007	G	A	343.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=962.36;QD=16.88;SB=-495.13	GT:AD:DP:GL:GQ	0/1:27,30:56:-116.40,-16.88,-86.00:99
-chr1	4935789	rs12128035	T	C	226.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.43;MQ=58.94;MQ0=0;OQ=796.37;QD=12.64;SB=-306.28	GT:AD:DP:GL:GQ	0/1:34,29:62:-101.60,-18.68,-137.85:99
-chr1	4936034	rs6689050	G	C	388.76	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1874.06;QD=42.59;SB=-652.91	GT:AD:DP:GL:GQ	1/1:0,44:44:-191.00,-13.26,-0.01:99
-chr1	4936094	rs12757902	G	A	302.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=59.62;MQ0=0;OQ=578.28;QD=11.80;SB=-268.20	GT:AD:DP:GL:GQ	0/1:27,21:43:-74.09,-12.98,-70.80:99
-chr1	4936362	rs12126016	G	T	367.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.41;MQ0=0;OQ=1064.42;QD=14.99;SB=-543.63	GT:AD:DP:GL:GQ	0/1:34,37:71:-131.11,-21.39,-120.19:99
-chr1	4936409	rs11581023	G	A	329.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=58.70;MQ0=0;OQ=1088.63;QD=16.49;SB=-413.38	GT:AD:DP:GL:GQ	0/1:32,34:63:-131.13,-18.99,-102.39:99
-chr1	4936482	rs12122541	A	G	353.13	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.04;MQ0=0;OQ=684.77;QD=12.45;SB=-247.32	GT:AD:DP:GL:GQ	0/1:27,28:52:-87.43,-15.67,-100.04:99
-chr1	4936602	rs11584985	C	T	191.63	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=59.29;MQ0=0;OQ=1088.30;QD=18.45;SB=-387.41	GT:AD:DP:GL:GQ	0/1:25,34:57:-129.30,-17.18,-77.34:99
-chr1	4936637	rs898335	T	G	589.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=2347.69;QD=35.57;SB=-808.10	GT:AD:DP:GL:GQ	1/1:0,66:66:-238.37,-19.88,-0.02:99
-chr1	4937911	rs12739724	G	A	135.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=59.34;MQ0=0;OQ=1173.07;QD=20.58;SB=-518.55	GT:AD:DP:GL:GQ	0/1:24,33:57:-137.76,-17.17,-89.96:99
-chr1	4937953	rs6666618	A	C	126.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=2.81;MQ=60.00;MQ0=0;OQ=1008.55;QD=15.28;SB=-391.76	GT:AD:DP:GL:GQ	0/1:30,36:65:-123.72,-19.58,-111.64:99
-chr1	4939240	rs1841241	A	G	358.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=59.68;MQ0=0;OQ=900.69;QD=12.34;SB=-390.90	GT:AD:DP:GL:GQ	0/1:37,36:72:-115.05,-21.70,-146.81:99
-chr1	4939654	rs6660626	C	G	245.03	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=1.40;MQ=59.55;MQ0=0;OQ=1495.04;QD=18.01;SB=-651.03	GT:AD:DP:GL:GQ	0/1:41,42:81:-177.21,-24.42,-163.44:99
-chr1	4940611	.	A	G	75.27	PASS	AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.50;MQ0=0;OQ=761.25;QD=16.55;SB=-322.41	GT:AD:DP:GL:GQ	0/1:18,28:44:-92.67,-13.26,-69.31:99
-chr1	4941180	rs12138041	C	G	147.56	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.43;MQ0=0;OQ=1446.36;QD=22.25;SB=-675.09	GT:AD:DP:GL:GQ	0/1:27,38:64:-167.20,-19.28,-114.12:99
-chr1	4941754	rs6426376	A	C	0.05	FDRtranche0.10to1.00	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=6;HaplotypeScore=1.65;MQ=58.89;MQ0=0;OQ=2125.54;QD=33.74;SB=-942.08	GT:AD:DP:GL:GQ	1/1:0,63:61:-216.16,-18.37,-0.02:99
-chr1	4942581	.	C	G	69.18	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.19;MQ0=0;OQ=1081.86;QD=18.98;SB=-432.32	GT:AD:DP:GL:GQ	0/1:28,29:57:-128.65,-17.18,-121.65:99
-chr1	4942801	rs12132419	G	A	594.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=1256.99;QD=16.76;SB=-497.49	GT:AD:DP:GL:GQ	0/1:35,40:73:-150.98,-21.99,-126.45:99
-chr1	4943594	rs1563791	C	A	403.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=58.68;MQ0=0;OQ=828.65;QD=15.63;SB=-357.20	GT:AD:DP:GL:GQ	0/1:25,28:53:-102.11,-15.96,-89.65:99
-chr1	4943942	rs10737391	T	A	518.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.47;MQ0=0;OQ=2837.87;QD=37.84;SB=-993.50	GT:AD:DP:GL:GQ	1/1:0,75:74:-287.39,-22.29,-0.02:99
-chr1	4943949	rs6674570	C	G	129.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.29;MQ0=0;OQ=3029.36;QD=43.28;SB=-1059.65	GT:AD:DP:GL:GQ	1/1:0,70:69:-306.54,-20.79,-0.02:99
-chr1	4943976	rs6689766	T	C	365.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=56.77;MQ0=0;OQ=827.54;QD=14.03;SB=-391.26	GT:AD:DP:GL:GQ	0/1:29,30:57:-103.21,-17.17,-110.62:99
-chr1	4943997	rs6698166	G	T	369.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=57.73;MQ0=0;OQ=860.15;QD=13.87;SB=-411.14	GT:AD:DP:GL:GQ	0/1:31,31:60:-107.37,-18.08,-104.72:99
-chr1	4943998	rs6698167	G	A	353.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=57.73;MQ0=0;OQ=1051.24;QD=16.96;SB=-519.06	GT:AD:DP:GL:GQ	0/1:30,32:61:-126.79,-18.38,-103.11:99
-chr1	4944360	rs12131010	A	G	342.06	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.85;MQ0=0;OQ=760.68;QD=9.88;SB=-317.87	GT:AD:DP:GL:GQ	0/1:43,34:75:-101.96,-22.60,-172.57:99
-chr1	4944890	rs1106586	G	A	276.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.40;MQ=59.59;MQ0=0;OQ=802.40;QD=14.33;SB=-392.78	GT:AD:DP:GL:GQ	0/1:30,26:55:-100.10,-16.58,-95.63:99
-chr1	4945646	rs898336	G	C	25.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=96;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=56.72;MQ0=0;OQ=4154.41;QD=43.28;SB=-1921.01	GT:AD:DP:GL:GQ	1/1:0,96:94:-414.44,-28.32,-0.03:99
-chr1	4945654	rs7417805	T	C	207.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=101;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=56.30;MQ0=0;OQ=3685.03;QD=36.49;SB=-1843.78	GT:AD:DP:GL:GQ	1/1:0,101:100:-367.50,-30.12,-0.02:99
-chr1	4946090	rs12046931	C	T	231	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=56.28;MQ0=0;OQ=1030.23;QD=13.56;SB=-511.04	GT:AD:DP:GL:GQ	0/1:44,32:74:-128.62,-22.31,-131.20:99
-chr1	4946898	rs6679312	A	G	627.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=2846.93;QD=36.04;SB=-1277.52	GT:AD:DP:GL:GQ	1/1:0,79:79:-288.30,-23.79,-0.02:99
-chr1	4947277	.	A	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=1;HaplotypeScore=4.31;MQ=58.55;MQ0=0;OQ=58.76;QD=0.92;SB=83.26	GT:AD:DP:GL:GQ	0/1:39,25:47:-23.33,-14.17,-133.19:91.60
-chr1	4947969	rs716671	G	T	362.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=59.37;MQ0=0;OQ=959.61;QD=14.54;SB=-385.78	GT:AD:DP:GL:GQ	0/1:32,34:63:-118.22,-18.98,-106.13:99
-chr1	4948484	rs7541612	T	C	301.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.16;MQ0=0;OQ=2459.32;QD=34.16;SB=-1006.88	GT:AD:DP:GL:GQ	1/1:0,72:70:-249.54,-21.08,-0.02:99
-chr1	4948794	rs10737392	A	C	185.94	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2094.20;QD=29.50;SB=-992.36	GT:AD:DP:GL:GQ	1/1:0,71:69:-213.07,-20.80,-0.07:99
-chr1	4951092	rs12725971	A	G	439.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.52;MQ0=0;OQ=1026.84;QD=13.16;SB=-423.90	GT:AD:DP:GL:GQ	0/1:43,35:78:-129.46,-23.49,-174.67:99
-chr1	4951570	rs6683624	C	T	353.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=2.63;MQ=59.06;MQ0=0;OQ=1065.83;QD=15.45;SB=-486.02	GT:AD:DP:GL:GQ	0/1:35,34:67:-130.05,-20.19,-121.88:99
-chr1	4953123	rs7418901	T	C	620.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=2650.80;QD=31.56;SB=-1309.87	GT:AD:DP:GL:GQ	1/1:0,84:83:-268.73,-25.03,-0.06:99
-chr1	4955464	rs1459754	T	C	197.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.56;MQ0=0;OQ=2710.14;QD=31.88;SB=-1351.75	GT:AD:DP:GL:GQ	1/1:0,85:84:-274.67,-25.33,-0.07:99
-chr1	4956424	rs12566071	T	C	456.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.68;MQ0=0;OQ=1092.05;QD=27.30;SB=-412.16	GT:AD:DP:GL:GQ	1/1:0,40:36:-112.83,-10.86,-0.04:99
-chr1	4956725	rs12047194	C	T	71.14	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.61;MQ=60.00;MQ0=0;OQ=1049.88;QD=16.93;SB=-178.21	GT:AD:DP:GL:GQ	0/1:29,33:61:-126.65,-18.37,-103.04:99
-chr1	4957085	.	G	A	6.71	PASS	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.62;MQ0=0;OQ=1318.00;QD=21.61;SB=-441.83	GT:AD:DP:GL:GQ	0/1:23,38:60:-153.16,-18.08,-75.01:99
-chr1	4957708	rs9701766	C	T	287.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.24;MQ0=0;OQ=1921.26;QD=34.93;SB=-917.67	GT:AD:DP:GL:GQ	1/1:0,55:50:-195.73,-15.07,-0.02:99
-chr1	4957732	rs12134477	T	G	328.37	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=59.35;MQ0=0;OQ=737.05;QD=11.52;SB=-389.76	GT:AD:DP:GL:GQ	0/1:34,30:62:-95.67,-18.68,-123.44:99
-chr1	4960336	rs9286972	T	C	80.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=3;HaplotypeScore=0.87;MQ=59.38;MQ0=0;OQ=2352.51;QD=35.11;SB=-877.01	GT:AD:DP:GL:GQ	1/1:0,67:65:-238.86,-19.58,-0.02:99
-chr1	4960363	rs9286973	A	G	217.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.91;MQ=58.74;MQ0=0;OQ=2328.65;QD=33.27;SB=-776.20	GT:AD:DP:GL:GQ	1/1:0,68:66:-236.47,-19.88,-0.02:99
-chr1	4960544	rs10158116	T	C	435.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=930.68;QD=33.24;SB=-423.17	GT:AD:DP:GL:GQ	1/1:0,28:27:-96.66,-8.13,-0.01:81.23
-chr1	4961077	rs1380469	C	T	600.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=88;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3571.25;QD=40.58;SB=-1432.72	GT:AD:DP:GL:GQ	1/1:0,88:87:-356.13,-26.20,-0.02:99
-chr1	4961379	rs10158288	T	C	503.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=2541.28;QD=30.99;SB=-793.00	GT:AD:DP:GL:GQ	1/1:0,82:80:-257.79,-24.13,-0.07:99
-chr1	4963153	rs10915307	G	A	69.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=1.45;MQ=59.07;MQ0=0;OQ=713.61;QD=14.27;SB=-252.29	GT:AD:DP:GL:GQ	0/1:25,25:45:-88.21,-13.57,-68.76:99
-chr1	4964065	rs10737393	G	C	566.31	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1749.68;QD=40.69;SB=-797.25	GT:AD:DP:GL:GQ	1/1:0,43:42:-178.57,-12.66,-0.02:99
-chr1	4964532	rs28667637	T	C	501.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1316.20;QD=16.05;SB=-509.69	GT:AD:DP:GL:GQ	0/1:33,49:82:-159.62,-24.71,-131.78:99
-chr1	4964976	rs12027167	C	T	376.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.50;MQ0=0;OQ=1085.57;QD=14.47;SB=-544.31	GT:AD:DP:GL:GQ	0/1:42,33:75:-134.44,-22.60,-148.57:99
-chr1	4965052	rs28444318	G	A	401.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.69;MQ0=0;OQ=1204.51;QD=18.82;SB=-457.96	GT:AD:DP:GL:GQ	0/1:28,36:62:-142.42,-18.68,-88.92:99
-chr1	4965449	rs10915308	C	T	686.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=2543.15;QD=38.53;SB=-937.28	GT:AD:DP:GL:GQ	1/1:0,66:64:-257.91,-19.28,-0.02:99
-chr1	4965556	rs12123277	C	A	350.21	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=722.36;QD=9.63;SB=-338.31	GT:AD:DP:GL:GQ	0/1:48,27:74:-97.81,-22.29,-174.39:99
-chr1	4965577	rs1380470	A	G	738.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2392.77;QD=36.25;SB=-1196.76	GT:AD:DP:GL:GQ	1/1:0,66:66:-242.88,-19.88,-0.01:99
-chr1	4965710	rs10915309	G	A	204.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=59.60;MQ0=0;OQ=2319.12;QD=39.98;SB=-986.30	GT:AD:DP:GL:GQ	1/1:0,58:58:-235.51,-17.47,-0.02:99
-chr1	4968070	rs10915310	A	G	390.05	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=59.15;MQ0=0;OQ=1179.59;QD=14.39;SB=-449.76	GT:AD:DP:GL:GQ	0/1:38,44:81:-145.65,-24.41,-157.59:99
-chr1	4968105	rs10799151	A	G	154.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=3.73;MQ=58.89;MQ0=0;OQ=1031.60;QD=12.74;SB=-406.80	GT:AD:DP:GL:GQ	0/1:40,41:78:-129.95,-23.51,-157.15:99
-chr1	4968710	.	C	G	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=53.48;MQ0=0;OQ=64.03;QD=1.56;SB=-49.12	GT:AD:DP:GL:GQ	0/1:36,5:37:-20.84,-11.15,-143.24:96.86
-chr1	4968815	rs10915311	A	C	217.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.03;MQ0=0;OQ=2004.53;QD=29.92;SB=-920.78	GT:AD:DP:GL:GQ	1/1:0,66:64:-204.09,-19.29,-0.06:99
-chr1	4969030	rs34951087	G	T	218.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.09;MQ0=0;OQ=572.86;QD=11.23;SB=-277.34	GT:AD:DP:GL:GQ	0/1:30,21:51:-75.93,-15.36,-106.99:99
-chr1	4970267	rs10915312	A	G	154.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=1.56;MQ=58.90;MQ0=0;OQ=985.64;QD=12.32;SB=-409.96	GT:AD:DP:GL:GQ	0/1:41,39:79:-125.65,-23.81,-166.76:99
-chr1	4970523	rs12045336	A	G	132	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.57;MQ=59.62;MQ0=0;OQ=1080.57;QD=17.71;SB=-383.65	GT:AD:DP:GL:GQ	0/1:25,36:60:-129.41,-18.07,-101.07:99
-chr1	4971344	.	A	C	49.60	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=0;HaplotypeScore=45.73;MQ=55.38;MQ0=0;QD=0.57;SB=95.30	GT:AD:DP:GL:GQ	0/1:77,10:78:-31.75,-23.50,-240.44:82.44
-chr1	4972155	rs1870516	C	T	119.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=2;HaplotypeScore=2.64;MQ=59.76;MQ0=0;OQ=1584.03;QD=16.67;SB=-599.54	GT:AD:DP:GL:GQ	0/1:49,46:91:-189.10,-27.42,-151.90:99
-chr1	4972838	rs1459756	T	C	570.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=978.37;QD=13.22;SB=-505.27	GT:AD:DP:GL:GQ	0/1:38,36:72:-122.81,-21.69,-153.16:99
-chr1	4972952	rs9286975	G	A	397.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2673.75;QD=39.91;SB=-1305.72	GT:AD:DP:GL:GQ	1/1:0,67:67:-270.98,-20.18,-0.02:99
-chr1	4973015	rs9662653	T	A	589.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.20;MQ0=0;OQ=1272.49;QD=16.74;SB=-576.01	GT:AD:DP:GL:GQ	0/1:36,40:76:-153.42,-22.89,-135.61:99
-chr1	4973096	rs9701780	T	C	360.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.34;MQ0=0;OQ=907.74;QD=12.97;SB=-427.52	GT:AD:DP:GL:GQ	0/1:38,32:70:-115.14,-21.08,-154.90:99
-chr1	4973099	rs1459757	A	G	435.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.36;MQ0=0;OQ=906.72;QD=12.59;SB=-477.95	GT:AD:DP:GL:GQ	0/1:40,32:72:-115.64,-21.69,-161.61:99
-chr1	4973396	rs10753346	T	C	325.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.65;MQ0=0;OQ=745.38;QD=11.29;SB=-293.22	GT:AD:DP:GL:GQ	0/1:39,27:65:-97.40,-19.58,-152.44:99
-chr1	4973518	rs10799152	A	C	461.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.77;MQ0=0;OQ=1062.89;QD=13.29;SB=-461.68	GT:AD:DP:GL:GQ	0/1:43,37:80:-133.67,-24.09,-159.84:99
-chr1	4974497	rs35292186	A	G	69.66	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=59.78;MQ0=0;OQ=1148.97;QD=13.84;SB=-573.87	GT:AD:DP:GL:GQ	0/1:43,40:81:-142.58,-24.40,-174.12:99
-chr1	4976182	rs10915314	G	C	291.75	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.96;MQ=60.00;MQ0=0;OQ=1306.22;QD=17.65;SB=-415.30	GT:AD:DP:GL:GQ	0/1:38,36:73:-155.90,-22.00,-163.97:99
-chr1	4977412	rs12047764	T	C	324.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=59.63;MQ0=0;OQ=712.65;QD=11.49;SB=-368.84	GT:AD:DP:GL:GQ	0/1:33,29:62:-93.24,-18.69,-135.85:99
-chr1	4978209	rs10915315	A	G	314.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.17;MQ0=0;OQ=593.55;QD=8.73;SB=-263.22	GT:AD:DP:GL:GQ	0/1:42,26:67:-82.83,-20.19,-168.85:99
-chr1	4978799	rs10915316	T	C	253.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=3.42;MQ=59.03;MQ0=0;OQ=793.88;QD=11.03;SB=-421.21	GT:AD:DP:GL:GQ	0/1:40,31:69:-103.46,-20.78,-159.70:99
-chr1	4980236	.	G	A	100.41	PASS	AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=1786.33;QD=21.02;SB=-886.64	GT:AD:DP:GL:GQ	0/1:34,51:83:-206.92,-25.00,-119.27:99
-chr1	4980926	rs10915317	T	C	438.47	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.66;MQ0=0;OQ=838.53;QD=12.33;SB=-314.09	GT:AD:DP:GL:GQ	0/1:34,34:67:-107.33,-20.19,-138.42:99
-chr1	4981033	rs898337	G	A	348.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.70;MQ0=0;OQ=1302.29;QD=16.91;SB=-502.50	GT:AD:DP:GL:GQ	0/1:36,41:75:-156.11,-22.60,-126.45:99
-chr1	4981597	rs7516703	C	T	165.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=60.19;MQ0=0;OQ=561.42;QD=9.85;SB=-184.86	GT:AD:DP:GL:GQ	0/1:36,21:54:-75.71,-16.28,-112.37:99
-chr1	4982000	rs10799153	A	G	596.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.94;MQ0=0;OQ=1157.46;QD=16.30;SB=-464.59	GT:AD:DP:GL:GQ	0/1:32,39:71:-140.42,-21.40,-120.74:99
-chr1	4983908	.	G	A	17.79	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=16;HaplotypeScore=7.18;MQ=55.71;MQ0=0;QD=0.27;SB=86.25	GT:AD:DP:GL:GQ	0/1:51,16:49:-19.83,-14.77,-145.36:50.55
-chr1	4985809	rs9439574	C	T	11.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=4;HaplotypeScore=0.16;MQ=58.95;MQ0=0;OQ=1576.28;QD=19.70;SB=-625.03	GT:AD:DP:GL:GQ	0/1:34,46:79:-184.71,-23.79,-124.63:99
-chr1	4985815	rs9439575	A	G	487	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.98;MQ0=0;OQ=1410.52;QD=17.20;SB=-545.94	GT:AD:DP:GL:GQ	0/1:36,46:82:-169.04,-24.70,-144.72:99
-chr1	4986567	rs10218468	A	C	245.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.31;MQ0=0;OQ=789.54;QD=11.78;SB=-394.67	GT:AD:DP:GL:GQ	0/1:34,33:66:-102.12,-19.88,-128.07:99
-chr1	4987124	rs10442625	A	G	373.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=59.63;MQ0=0;OQ=720.29;QD=11.43;SB=-219.26	GT:AD:DP:GL:GQ	0/1:37,26:62:-93.99,-18.68,-145.68:99
-chr1	4988477	rs2169089	A	G	373.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.69;MQ0=0;OQ=1114.19;QD=14.86;SB=-356.97	GT:AD:DP:GL:GQ	0/1:29,45:72:-136.41,-21.71,-118.67:99
-chr1	4988875	rs716112	A	G	453.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=842.62;QD=12.58;SB=-426.87	GT:AD:DP:GL:GQ	0/1:33,34:66:-107.44,-19.90,-129.75:99
-chr1	4990575	rs1459764	C	T	573.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.71;MQ0=0;OQ=1234.93;QD=15.63;SB=-612.07	GT:AD:DP:GL:GQ	0/1:42,37:78:-150.28,-23.50,-132.81:99
-chr1	4990857	rs9439507	A	G	285	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.35;MQ0=0;OQ=2461.09;QD=34.66;SB=-1130.69	GT:AD:DP:GL:GQ	1/1:0,71:71:-249.72,-21.39,-0.03:99
-chr1	4991092	rs10442626	G	C	211.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=59.60;MQ0=0;OQ=718.97;QD=12.61;SB=-159.21	GT:AD:DP:GL:GQ	0/1:31,26:54:-91.46,-16.28,-132.88:99
-chr1	4991687	rs4949164	A	G	470.49	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=1103.70;QD=13.80;SB=-401.93	GT:AD:DP:GL:GQ	0/1:38,42:79:-137.46,-23.80,-155.83:99
-chr1	4993546	rs7533014	T	C	526.25	PASS	AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1036.32;QD=11.39;SB=-442.91	GT:AD:DP:GL:GQ	0/1:49,42:90:-134.04,-27.12,-197.59:99
-chr1	4993852	rs11580542	A	G	170.64	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=650.23;QD=9.56;SB=-317.81	GT:AD:DP:GL:GQ	0/1:43,25:66:-88.19,-19.88,-168.41:99
-chr1	4994065	.	C	T	20.53	PASS	AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1330.95;QD=18.75;SB=-592.09	GT:AD:DP:GL:GQ	0/1:33,38:71:-157.76,-21.38,-120.30:99
-chr1	4994295	rs6693990	G	A	335.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.95;MQ=57.88;MQ0=0;OQ=1019.69;QD=16.19;SB=-465.42	GT:AD:DP:GL:GQ	0/1:31,32:60:-123.32,-18.07,-111.15:99
-chr1	4994563	rs1459763	A	G	13.43	PASS	AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=5.21;MQ=58.04;MQ0=0;OQ=377.66;QD=9.21;SB=-181.57	GT:AD:DP:GL:GQ	0/1:25,16:38:-52.50,-11.45,-93.25:99
-chr1	4995722	rs1459762	C	T	513.24	PASS	AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=1249.58;QD=19.22;SB=-511.06	GT:AD:DP:GL:GQ	0/1:27,38:64:-147.53,-19.29,-84.78:99
-chr1	4996533	.	T	G	102.56	PASS	AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.08;MQ0=0;OQ=597.86;QD=9.80;SB=-320.69	GT:AD:DP:GL:GQ	0/1:35,26:61:-81.45,-18.38,-132.05:99
-chr1	4999697	.	C	G	5.71	PASS	AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.53;MQ0=0;OQ=2076.06;QD=23.59;SB=-758.01	GT:AD:DP:GL:GQ	0/1:34,54:87:-237.12,-26.23,-133.95:99
-chr1	4999785	.	A	G	153.89	PASS	AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.27;MQ=59.42;MQ0=0;OQ=950.41;QD=13.20;SB=-485.20	GT:AD:DP:GL:GQ	0/1:39,33:71:-119.71,-21.39,-153.18:99
-chr1	5000124	rs35565495	A	G	217.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=57.68;MQ0=0;OQ=905.68;QD=12.41;SB=-443.62	GT:AD:DP:GL:GQ	0/1:40,33:73:-115.85,-22.00,-156.82:99
-chr1	5000551	rs1459761	A	G	316.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=59.68;MQ0=0;OQ=1082.64;QD=18.35;SB=-522.18	GT:AD:DP:GL:GQ	0/1:24,35:59:-129.32,-17.77,-97.53:99
-chr1	5002004	rs12403444	A	G	454.86	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=59.69;MQ0=0;OQ=1008.17;QD=13.62;SB=-385.25	GT:AD:DP:GL:GQ	0/1:38,36:71:-125.49,-21.39,-141.83:99
-chr1	5002384	rs12403749	A	G	334.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.18;MQ0=0;OQ=762.42;QD=12.92;SB=-306.27	GT:AD:DP:GL:GQ	0/1:32,27:59:-97.30,-17.77,-132.93:99
-chr1	5002965	rs55998096	C	T	265.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1237.12;QD=16.95;SB=-623.66	GT:AD:DP:GL:GQ	0/1:35,38:72:-148.68,-21.69,-128.69:99
-chr1	5003908	rs1459759	T	G	287.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=59.68;MQ0=0;OQ=1018.83;QD=14.15;SB=-495.74	GT:AD:DP:GL:GQ	0/1:34,38:70:-126.25,-21.08,-125.30:99
-chr1	5004548	.	C	T	0.18	PASS	AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=4;HaplotypeScore=0.97;MQ=55.65;MQ0=0;OQ=1952.83;QD=19.15;SB=-933.54	GT:AD:DP:GL:GQ	0/1:44,58:102:-229.30,-30.73,-156.88:99
-chr1	5004874	rs55883351	G	A	211.60	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=41.17;MQ0=0;OQ=1434.24;QD=17.49;SB=-707.75	GT:AD:DP:GL:GQ	0/1:39,43:79:-170.52,-23.81,-118.83:99
-chr1	5005796	.	T	G	22.56	PASS	AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=52.68;MQ0=0;OQ=1101.12;QD=15.73;SB=-417.74	GT:AD:DP:GL:GQ	0/1:29,41:66:-133.27,-19.88,-106.95:99
-chr1	5005889	rs10737394	A	G	342.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.43;MQ0=0;OQ=434.38;QD=9.05;SB=-233.28	GT:AD:DP:GL:GQ	0/1:27,21:46:-60.59,-13.87,-106.69:99
-chr1	5006532	rs10799156	G	C	195.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=38.14;MQ0=9;OQ=508.53;QD=10.38;SB=-226.35	GT:AD:DP:GL:GQ	0/1:19,30:34:-64.39,-10.25,-81.21:99
-chr1	5007005	rs6603829	T	C	0.07	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=16.12;MQ=27.87;MQ0=17;OQ=171.08;QD=2.19;SB=-108.70	GT:AD:DP:GL:GQ	0/1:51,27:35:-30.94,-10.55,-97.26:99
-chr1	5007006	rs6603830	G	A	0.04	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=18.32;MQ=27.85;MQ0=18;OQ=165.82;QD=2.13;SB=-81.55	GT:AD:DP:GL:GQ	0/1:59,19:36:-30.72,-10.85,-97.29:99
-chr1	5007287	.	C	G	0.46	PASS	AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=8.19;MQ=48.27;MQ0=4;OQ=754.87;QD=14.52;SB=-244.08	GT:AD:DP:GL:GQ	0/1:26,25:44:-92.04,-13.27,-89.64:99
-chr1	5007421	.	A	G	0.01	FDRtranche2.00to10.00	AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=1;HaplotypeScore=5.43;MQ=22.24;MQ0=26;OQ=110.20;QD=1.12;SB=7.49	GT:AD:DP:GL:GQ	0/1:85,12:42:-26.95,-12.65,-140.65:99
-chr1	5007424	.	G	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=2;HaplotypeScore=3.53;MQ=23.00;MQ0=24;OQ=143.47;QD=1.54;SB=3.27	GT:AD:DP:GL:GQ	0/1:81,12:42:-30.29,-12.66,-152.47:99
-chr1	5011084	.	C	G	46.29	PASS	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=45.50;MQ0=2;OQ=1885.25;QD=20.27;SB=-717.97	GT:AD:DP:GL:GQ	0/1:41,52:88:-218.32,-26.51,-163.98:99
-chr1	5011731	.	C	T	18.24	PASS	AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=2;HaplotypeScore=0.79;MQ=54.65;MQ0=1;OQ=1577.37;QD=18.13;SB=-623.62	GT:AD:DP:GL:GQ	0/1:41,46:86:-186.92,-25.90,-147.64:99
-chr1	5012084	rs10915327	C	T	347.57	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=48.94;MQ0=2;OQ=1240.99;QD=17.24;SB=-606.09	GT:AD:DP:GL:GQ	0/1:32,40:68:-147.88,-20.49,-101.20:99
-chr1	5012508	.	G	A	165.62	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=34.81;MQ0=2;OQ=954.73;QD=16.75;SB=-470.48	GT:AD:DP:GL:GQ	0/1:23,33:48:-113.23,-14.48,-57.23:99
-chr1	5014453	.	C	A	65.76	PASS	AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=59.79;MQ0=0;OQ=1613.72;QD=18.13;SB=-734.55	GT:AD:DP:GL:GQ	0/1:38,51:88:-191.16,-26.50,-131.97:99
-chr1	5016018	.	T	G	165.96	PASS	AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=1295.09;QD=17.50;SB=-624.73	GT:AD:DP:GL:GQ	0/1:31,43:74:-155.08,-22.29,-116.52:99
-chr1	5018516	rs4262591	A	T	76.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=2;HaplotypeScore=0.94;MQ=59.27;MQ0=0;OQ=1137.62;QD=12.78;SB=-520.24	GT:AD:DP:GL:GQ	0/1:50,39:87:-143.25,-26.20,-190.22:99
-chr1	5020923	rs970119	A	C	493.82	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=718.78;QD=10.27;SB=-241.77	GT:AD:DP:GL:GQ	0/1:40,30:69:-95.95,-20.78,-149.31:99
-chr1	5023267	.	C	G	91.77	PASS	AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.92;MQ0=0;OQ=800.92;QD=19.07;SB=-315.01	GT:AD:DP:GL:GQ	0/1:20,22:41:-95.73,-12.36,-81.61:99
-chr1	5024719	rs1563792	G	A	196.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=59.54;MQ0=0;OQ=1348.55;QD=16.45;SB=-599.05	GT:AD:DP:GL:GQ	0/1:42,40:80:-162.25,-24.11,-132.60:99
-chr1	5027451	rs56184292	G	T	6.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=4;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=1415.10;QD=15.05;SB=-721.57	GT:AD:DP:GL:GQ	0/1:44,49:93:-172.81,-28.02,-154.91:99
-chr1	5029434	rs2061494	T	A	49.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=2;HaplotypeScore=1.72;MQ=59.72;MQ0=0;OQ=1567.79;QD=19.36;SB=-635.43	GT:AD:DP:GL:GQ	0/1:33,47:79:-183.86,-23.79,-122.93:99
-chr1	5029438	rs2061493	T	A	66.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=2;HaplotypeScore=1.72;MQ=59.72;MQ0=0;OQ=1477.11;QD=18.24;SB=-663.80	GT:AD:DP:GL:GQ	0/1:33,48:80:-175.09,-24.10,-128.48:99
-chr1	5029774	rs55724572	C	A	223.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=101;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.17;MQ0=0;OQ=1394.44;QD=13.81;SB=-671.07	GT:AD:DP:GL:GQ	0/1:55,46:101:-173.14,-30.41,-200.20:99
-chr1	5029802	rs56297253	G	A	420.62	PASS	AC=1;AF=0.50;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.18;MQ0=0;OQ=1452.74;QD=14.24;SB=-632.72	GT:AD:DP:GL:GQ	0/1:58,44:100:-178.69,-30.14,-182.65:99
-chr1	5030141	rs1459758	C	G	545.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2835.80;QD=42.33;SB=-1264.90	GT:AD:DP:GL:GQ	1/1:0,67:65:-287.18,-19.58,-0.01:99
-chr1	5032542	rs977665	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=14;HaplotypeScore=4.90;MQ=58.74;MQ0=0;OQ=53.47;QD=0.58;SB=128.44	GT:AD:DP:GL:GQ	0/1:77,15:69:-29.43,-20.80,-218.90:86.30
-chr1	5036504	rs922123	T	C	526.95	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.12;MQ0=0;OQ=805.20;QD=10.88;SB=-361.22	GT:AD:DP:GL:GQ	0/1:44,30:74:-106.10,-22.29,-176.34:99
-chr1	5036703	rs55875722	T	A	259.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.65;MQ0=0;OQ=1241.65;QD=18.81;SB=-625.13	GT:AD:DP:GL:GQ	0/1:28,38:64:-146.72,-19.28,-96.42:99
-chr1	5036704	rs922124	T	A	61.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=59.67;MQ0=0;OQ=2561.19;QD=37.12;SB=-1099.66	GT:AD:DP:GL:GQ	1/1:0,69:68:-259.72,-20.48,-0.02:99
-chr1	5036974	rs56077964	G	A	617	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=2268.61;QD=38.45;SB=-1080.42	GT:AD:DP:GL:GQ	1/1:0,59:56:-230.46,-16.87,-0.01:99
-chr1	5039060	rs56186517	C	T	567.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.53;MQ0=0;OQ=3555.73;QD=39.95;SB=-1607.16	GT:AD:DP:GL:GQ	1/1:0,89:87:-354.57,-26.20,-0.02:99
-chr1	5039732	rs56347558	T	C	203.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=59.06;MQ0=0;OQ=2530.73;QD=34.20;SB=-928.36	GT:AD:DP:GL:GQ	1/1:0,73:71:-256.68,-21.39,-0.02:99
-chr1	5040152	rs3128686	G	T	232.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=59.70;MQ0=0;OQ=2534.37;QD=32.49;SB=-1255.28	GT:AD:DP:GL:GQ	1/1:1,77:71:-257.05,-21.39,-0.03:99
-chr1	5040933	rs12045197	A	T	91.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.81;MQ=44.79;MQ0=0;OQ=1582.06;QD=35.96;SB=-689.38	GT:AD:DP:GL:GQ	1/1:0,44:44:-161.81,-13.26,-0.02:99
-chr1	5041153	rs3128687	G	T	199.02	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=55.94;MQ0=0;OQ=2861.17;QD=36.22;SB=-1432.06	GT:AD:DP:GL:GQ	1/1:0,79:77:-289.72,-23.19,-0.02:99
-chr1	5041314	rs3128688	A	T	418.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.72;MQ0=0;OQ=2724.95;QD=37.85;SB=-1190.46	GT:AD:DP:GL:GQ	1/1:0,72:72:-276.10,-21.69,-0.02:99
-chr1	5041500	rs3128689	C	A	313.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.24;MQ=59.77;MQ0=0;OQ=2974.21;QD=36.27;SB=-1175.38	GT:AD:DP:GL:GQ	1/1:0,82:81:-301.03,-24.39,-0.02:99
-chr1	5042266	rs10915339	G	A	611.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.20;MQ0=0;OQ=2730.95;QD=39.01;SB=-1105.02	GT:AD:DP:GL:GQ	1/1:0,70:70:-276.70,-21.09,-0.02:99
-chr1	5042286	rs10915340	T	C	619.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.86;MQ0=0;OQ=2323.00;QD=35.20;SB=-939.39	GT:AD:DP:GL:GQ	1/1:0,65:65:-235.90,-19.58,-0.02:99
-chr1	5042412	rs10915341	T	G	227.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.39;MQ0=0;OQ=2175.06;QD=35.66;SB=-984.12	GT:AD:DP:GL:GQ	1/1:0,61:61:-221.11,-18.37,-0.01:99
-chr1	5042489	rs12029437	C	G	85.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=2.70;MQ=59.16;MQ0=0;OQ=2913.26;QD=40.46;SB=-1456.73	GT:AD:DP:GL:GQ	1/1:0,72:69:-294.94,-20.80,-0.03:99
-chr1	5042644	rs12047111	A	G	505.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=1237.53;QD=28.78;SB=-430.81	GT:AD:DP:GL:GQ	1/1:0,43:41:-127.38,-12.37,-0.05:99
-chr1	5042678	rs2334263	T	C	624.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.35;MQ0=0;OQ=1911.69;QD=29.87;SB=-888.47	GT:AD:DP:GL:GQ	1/1:0,64:60:-194.81,-18.10,-0.06:99
-chr1	5043104	rs10799159	C	A	257.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.14;MQ0=0;OQ=3046.41;QD=35.84;SB=-1505.91	GT:AD:DP:GL:GQ	1/1:0,85:84:-308.25,-25.30,-0.02:99
-chr1	5043177	rs10799160	G	A	205.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=59.29;MQ0=0;OQ=2756.78;QD=37.25;SB=-1155.91	GT:AD:DP:GL:GQ	1/1:1,72:71:-282.75,-21.39,-3.49:99
-chr1	5043218	rs10799161	A	C	127.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.10;MQ0=0;OQ=2285.87;QD=29.69;SB=-810.83	GT:AD:DP:GL:GQ	1/1:0,77:71:-232.22,-21.39,-0.05:99
-chr1	5048318	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=4;HaplotypeScore=11.35;MQ=48.17;MQ0=0;OQ=57.54;QD=0.83;SB=77.27	GT:AD:DP:GL:GQ	0/1:47,22:47:-23.20,-14.17,-150.00:90.38
-chr1	5048545	rs10915343	T	C	699.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.89;MQ0=0;OQ=1690.53;QD=34.50;SB=-831.35	GT:AD:DP:GL:GQ	1/1:0,49:48:-172.65,-14.46,-0.01:99
-chr1	5050626	rs3101213	A	G	203.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=59.71;MQ0=0;OQ=2864.75;QD=36.26;SB=-1335.60	GT:AD:DP:GL:GQ	1/1:0,79:79:-290.08,-23.79,-0.02:99
-chr1	5051336	rs2199215	T	C	701.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=2974.37;QD=35.84;SB=-1419.92	GT:AD:DP:GL:GQ	1/1:0,83:83:-301.05,-25.00,-0.02:99
-chr1	5052019	rs12121092	G	T	639.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2775.75;QD=36.52;SB=-1128.45	GT:AD:DP:GL:GQ	1/1:0,76:76:-281.18,-22.89,-0.02:99
-chr1	5057740	rs55852005	G	A	37.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=3;HaplotypeScore=1.46;MQ=59.22;MQ0=0;OQ=1090.29;QD=18.48;SB=-513.03	GT:AD:DP:GL:GQ	0/1:26,33:57:-129.48,-17.17,-87.67:99
-chr1	5058085	rs4949171	C	T	168.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=59.33;MQ0=0;OQ=2116.23;QD=37.79;SB=-957.98	GT:AD:DP:GL:GQ	1/1:0,56:55:-215.23,-16.58,-0.02:99
-chr1	5058717	rs9803863	G	A	206.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.13;MQ0=0;OQ=2766.44;QD=39.52;SB=-1272.71	GT:AD:DP:GL:GQ	1/1:0,69:70:-283.01,-23.72,-2.78:99
-chr1	5059210	rs982156	T	C	60.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.49;MQ=59.24;MQ0=0;OQ=1823.01;QD=33.15;SB=-568.39	GT:AD:DP:GL:GQ	1/1:0,55:54:-185.91,-16.27,-0.03:99
-chr1	5060220	rs992597	C	T	157.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=59.01;MQ0=0;OQ=2915.53;QD=38.36;SB=-981.32	GT:AD:DP:GL:GQ	1/1:0,76:74:-295.16,-22.30,-0.02:99
-chr1	5060522	rs2242157	G	T	298.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.45;MQ0=0;OQ=2405.81;QD=35.38;SB=-942.03	GT:AD:DP:GL:GQ	1/1:0,68:68:-244.19,-20.49,-0.03:99
-chr1	5060591	rs1459766	T	G	395.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=2600.59;QD=35.14;SB=-1143.14	GT:AD:DP:GL:GQ	1/1:0,74:73:-263.67,-21.99,-0.02:99
-chr1	5061734	rs9439532	C	T	112.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.81;MQ=59.34;MQ0=0;OQ=2118.20;QD=37.16;SB=-1042.39	GT:AD:DP:GL:GQ	1/1:0,57:54:-215.42,-16.27,-0.02:99
-chr1	5062366	rs6683881	C	T	35.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=1.70;MQ=59.80;MQ0=0;OQ=3619.28;QD=39.77;SB=-1734.02	GT:AD:DP:GL:GQ	1/1:0,91:89:-360.93,-26.81,-0.02:99
-chr1	5062541	rs4949170	A	G	156.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=59.71;MQ0=0;OQ=2632.93;QD=33.33;SB=-1332.58	GT:AD:DP:GL:GQ	1/1:0,79:75:-266.90,-22.59,-0.03:99
-chr1	5062567	rs4949169	A	T	172.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=59.68;MQ0=0;OQ=2759.54;QD=37.80;SB=-995.13	GT:AD:DP:GL:GQ	1/1:0,73:72:-279.55,-21.68,-0.01:99
-chr1	5063485	rs9439576	C	G	98.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=59.17;MQ0=0;OQ=3111.26;QD=39.89;SB=-1145.60	GT:AD:DP:GL:GQ	1/1:0,77:71:-314.73,-21.39,-0.02:99
-chr1	5063671	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=2;HaplotypeScore=26.54;MQ=57.06;MQ0=0;OQ=128.17;QD=2.14;SB=77.28	GT:AD:DP:GL:GQ	0/1:38,22:39:-27.89,-11.79,-122.93:99
-chr1	5064284	rs2169090	T	C	707.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=3152.45;QD=35.42;SB=-1370.23	GT:AD:DP:GL:GQ	1/1:0,89:88:-318.85,-26.50,-0.02:99
-chr1	5066340	rs57000660	A	G	484.39	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=766.60;QD=12.99;SB=-402.18	GT:AD:DP:GL:GQ	0/1:32,27:59:-97.71,-17.77,-131.87:99
-chr1	5066393	rs1037809	C	T	706.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3074.28;QD=39.41;SB=-1449.38	GT:AD:DP:GL:GQ	1/1:0,78:78:-311.04,-23.50,-0.02:99
-chr1	5068397	rs6659363	G	C	337.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.22;MQ0=0;OQ=768.71;QD=14.24;SB=-229.04	GT:AD:DP:GL:GQ	0/1:31,23:53:-96.12,-15.97,-137.34:99
-chr1	5068500	rs12124337	A	C	365.74	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=1243.29;QD=15.94;SB=-471.71	GT:AD:DP:GL:GQ	0/1:35,43:77:-150.81,-23.19,-127.77:99
-chr1	5068523	rs10733013	C	T	471.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1107.71;QD=14.39;SB=-422.79	GT:AD:DP:GL:GQ	0/1:43,34:75:-136.66,-22.60,-133.09:99
-chr1	5069554	rs2722789	G	A	592.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1009.56;QD=14.02;SB=-503.00	GT:AD:DP:GL:GQ	0/1:41,31:72:-125.95,-21.71,-131.55:99
-chr1	5070551	rs4949160	A	T	476.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.42;MQ0=0;OQ=1068.05;QD=14.83;SB=-488.53	GT:AD:DP:GL:GQ	0/1:37,35:71:-131.47,-21.38,-142.74:99
-chr1	5071819	.	G	A	258.71	PASS	AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=1213.24;QD=16.18;SB=-353.81	GT:AD:DP:GL:GQ	0/1:39,36:75:-147.20,-22.59,-142.20:99
-chr1	5071854	.	T	A	81.17	PASS	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=1149.23;QD=14.19;SB=-304.96	GT:AD:DP:GL:GQ	0/1:43,38:80:-142.31,-24.10,-164.66:99
-chr1	5072229	.	G	A	304.80	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=81;Dels=0.01;HRun=0;HaplotypeScore=64.90;MQ=44.02;MQ0=0;QD=3.76;SB=86.27	GT:AD:DP:GL:GQ	0/1:66,14:79:-57.26,-23.50,-230.57:99
-chr1	5072230	.	C	G	37.37	DPFilter;LowQual;SnpCluster	AC=1;AF=0.50;AN=2;DP=83;Dels=0.01;HRun=2;HaplotypeScore=55.89;MQ=43.72;MQ0=0;QD=0.45;SB=80.30	GT:AD:DP:GL:GQ	0/1:67,6:72:-38.59,-31.57,-277.78:70.20
-chr1	5072236	.	A	G	214.30	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=80;Dels=0.08;HRun=2;HaplotypeScore=77.80;MQ=44.49;MQ0=0;QD=2.68;SB=83.29	GT:AD:DP:GL:GQ	0/1:56,12:72:-66.82,-42.10,-235.08:99
-chr1	5072261	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=81;Dels=0.05;HRun=0;HaplotypeScore=73.45;MQ=43.15;MQ0=0;OQ=399.38;QD=4.93;SB=83.29	GT:AD:DP:GL:GQ	0/1:51,25:67:-62.51,-19.29,-172.53:99
-chr1	5072278	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=86;Dels=0.01;HRun=1;HaplotypeScore=43.28;MQ=42.83;MQ0=0;OQ=260.49;QD=3.03;SB=63.28	GT:AD:DP:GL:GQ	0/1:59,19:75:-74.72,-45.39,-204.92:99
-chr1	5072305	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=82;Dels=0.04;HRun=0;HaplotypeScore=77.14;MQ=40.79;MQ0=0;OQ=744.26;QD=9.08;SB=-270.19	GT:AD:DP:GL:GQ	0/1:44,35:70:-97.91,-20.20,-140.23:99
-chr1	5072314	.	C	A	26.92	LowQual	AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=53.92;MQ=40.19;MQ0=0;QD=0.34;SB=-28.60	GT:AD:DP:GL:GQ	0/1:60,11:56:-29.71,-23.73,-169.35:59.74
-chr1	5072329	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=71;Dels=0.01;HRun=0;HaplotypeScore=74.94;MQ=38.44;MQ0=0;OQ=775.14;QD=10.92;SB=-292.22	GT:AD:DP:GL:GQ	0/1:41,28:64:-99.78,-18.98,-129.83:99
-chr1	5072338	.	C	G	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=63;Dels=0.02;HRun=2;HaplotypeScore=51.40;MQ=37.08;MQ0=0;OQ=162.47;QD=2.58;SB=101.36	GT:AD:DP:GL:GQ	0/1:48,8:57:-50.13,-30.60,-201.42:99
-chr1	5072354	.	A	G	70.72	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=68;Dels=0.01;HRun=3;HaplotypeScore=80.87;MQ=34.07;MQ0=1;QD=1.04;SB=50.19	GT:AD:DP:GL:GQ	0/1:55,12:60:-28.14,-17.78,-195.72:99
-chr1	5072357	.	A	G	633.36	SnpCluster	AC=1;AF=0.50;AN=2;DP=67;Dels=0.01;HRun=1;HaplotypeScore=71.93;MQ=33.53;MQ0=1;QD=9.45;SB=-235.45	GT:AD:DP:GL:GQ	0/1:28,25:61:-115.70,-49.08,-135.16:99
-chr1	5072359	.	A	C	486.53	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=69;Dels=0.03;HRun=0;HaplotypeScore=52.12;MQ=33.41;MQ0=1;QD=7.05;SB=62.18	GT:AD:DP:GL:GQ	0/1:42,24:63:-73.40,-21.46,-136.62:99
-chr1	5072383	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=1;HaplotypeScore=82.78;MQ=35.86;MQ0=1;OQ=50.85;QD=0.50;SB=43.30	GT:AD:DP:GL:GQ	0/1:88,10:72:-37.48,-29.11,-217.86:83.68
-chr1	5072395	.	C	A	570.19	SnpCluster	AC=1;AF=0.50;AN=2;DP=99;Dels=0.02;HRun=1;HaplotypeScore=88.86;MQ=38.13;MQ0=1;QD=5.76;SB=-12.89	GT:AD:DP:GL:GQ	0/1:64,28:75:-96.04,-35.74,-177.41:99
-chr1	5072402	.	A	G	56.63	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=3;HaplotypeScore=106.83;MQ=38.72;MQ0=1;QD=0.58;SB=77.28	GT:AD:DP:GL:GQ	0/1:88,10:70:-30.04,-21.10,-237.13:89.47
-chr1	5072405	.	G	T	211.27	DPFilter;SnpCluster	AC=1;AF=0.50;AN=2;DP=95;Dels=0.03;HRun=0;HaplotypeScore=106.15;MQ=39.10;MQ0=1;QD=2.22;SB=86.26	GT:AD:DP:GL:GQ	0/1:74,17:80:-48.52,-24.11,-223.42:99
-chr1	5072419	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=52.76;MQ=39.26;MQ0=1;OQ=413.09;QD=4.44;SB=8.43	GT:AD:DP:GL:GQ	0/1:71,20:77:-71.28,-26.69,-194.57:99
-chr1	5072442	.	A	G	31.37	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=2;HaplotypeScore=72.31;MQ=41.30;MQ0=0;QD=0.48;SB=47.17	GT:AD:DP:GL:GQ	0/1:57,8:62:-25.11,-18.69,-212.28:64.20
-chr1	5073664	rs2611423	C	A	218.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=2432.37;QD=35.25;SB=-1208.34	GT:AD:DP:GL:GQ	1/1:0,69:67:-246.84,-20.18,-0.02:99
-chr1	5073938	rs2611424	A	G	134.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=59.25;MQ0=0;OQ=2912.91;QD=35.96;SB=-1287.55	GT:AD:DP:GL:GQ	1/1:0,81:80:-294.90,-24.09,-0.02:99
-chr1	5074030	rs2611425	C	T	598.88	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.51;MQ0=0;OQ=2372.22;QD=38.89;SB=-1023.68	GT:AD:DP:GL:GQ	1/1:0,61:60:-240.82,-18.07,-0.01:99
-chr1	5074510	rs9439534	C	T	637.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.93;MQ0=0;OQ=2321.21;QD=36.27;SB=-1159.05	GT:AD:DP:GL:GQ	1/1:0,64:59:-235.72,-17.77,-0.02:99
-chr1	5074638	rs57003830	G	C	372.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=43.54;MQ0=4;OQ=1370.10;QD=15.75;SB=-494.22	GT:AD:DP:GL:GQ	0/1:45,42:79:-164.10,-23.81,-179.75:99
-chr1	5075049	rs9439577	C	T	95.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.23;MQ=38.28;MQ0=7;OQ=1971.59;QD=31.30;SB=-484.14	GT:AD:DP:GL:GQ	1/1:0,62:51:-200.77,-15.37,-0.03:99
-chr1	5075121	rs9439535	A	G	238.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=43.82;MQ0=4;OQ=1529.43;QD=28.32;SB=-495.19	GT:AD:DP:GL:GQ	1/1:0,54:47:-156.56,-14.17,-0.03:99
-chr1	5075150	rs9439578	T	G	135.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=50.05;MQ0=3;OQ=2063.78;QD=31.75;SB=-748.06	GT:AD:DP:GL:GQ	1/1:0,65:60:-209.99,-18.08,-0.02:99
-chr1	5075197	rs10915347	C	T	55.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=2.29;MQ=47.56;MQ0=6;OQ=2171.81;QD=32.91;SB=-915.72	GT:AD:DP:GL:GQ	1/1:0,65:56:-220.79,-16.88,-0.02:99
-chr1	5075319	rs28828787	G	A	102.87	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=26.02;MQ0=15;OQ=432.78;QD=8.32;SB=-48.66	GT:AD:DP:GL:GQ	0/1:29,23:28:-55.00,-8.44,-46.26:99
-chr1	5075370	rs10799164	C	T	16.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=20.22;MQ0=13;OQ=746.84;QD=17.78;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,40:19:-78.27,-5.72,-0.00:57.19
-chr1	5075558	rs10799165	C	T	9.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=9.90;MQ=22.74;MQ0=30;OQ=955.91;QD=12.58;SB=-324.43	GT:AD:DP:GL:GQ	1/1:31,45:25:-99.18,-7.53,-0.01:75.24
-chr1	5075601	rs10753349	C	T	1.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=10.53;MQ=14.77;MQ0=51;OQ=525.81;QD=6.49;SB=-249.33	GT:AD:DP:GL:GQ	1/1:43,38:14:-56.17,-4.22,-0.00:42.14
-chr1	5075696	rs4949168	A	G	0.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=5.94;MQ=11.29;MQ0=39;OQ=183.21;QD=2.91;SB=-118.05	GT:AD:DP:GL:GQ	1/1:33,30:6:-21.89,-1.81,-0.00:18.06
-chr1	5075699	rs10799166	G	C	0.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=5.78;MQ=10.86;MQ0=38;OQ=173.64;QD=2.85;SB=-103.85	GT:AD:DP:GL:GQ	1/1:32,29:5:-20.93,-1.51,-0.00:15.05
-chr1	5075751	rs4949159	C	A	0.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=9.84;MQ=21.77;MQ0=1;OQ=523.96;QD=14.55;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,33:15:-55.98,-4.52,-0.00:45.14
-chr1	5075757	rs4949167	T	C	1.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=5.17;MQ=21.64;MQ0=3;OQ=605.43;QD=14.41;SB=-10.00	GT:AD:DP:GL:GQ	1/1:7,35:18:-64.13,-5.42,-0.00:54.16
-chr1	5076314	rs9439579	C	G	74.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.92;MQ=43.71;MQ0=2;OQ=2095.83;QD=33.80;SB=-956.72	GT:AD:DP:GL:GQ	1/1:3,59:49:-213.18,-14.76,-0.01:99
-chr1	5076393	rs10915349	G	A	1.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=6.65;MQ=47.36;MQ0=1;OQ=1988.87;QD=34.29;SB=-955.74	GT:AD:DP:GL:GQ	1/1:1,57:52:-202.50,-15.68,-0.03:99
-chr1	5076841	rs10799167	C	T	211.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=45.50;MQ0=4;OQ=2210.86;QD=35.66;SB=-962.98	GT:AD:DP:GL:GQ	1/1:1,61:56:-224.69,-16.87,-0.02:99
-chr1	5077036	rs10799168	A	G	167.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=21.14;MQ0=7;OQ=400.64;QD=14.84;SB=-196.71	GT:AD:DP:GL:GQ	1/1:8,19:13:-43.66,-3.92,-0.01:39.11
-chr1	5077055	rs7414866	A	G	123.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=21.33;MQ0=4;OQ=281.43;QD=13.40;SB=-64.87	GT:AD:DP:GL:GQ	1/1:4,17:10:-31.74,-3.02,-0.01:30.04
-chr1	5077077	rs7412613	C	T	3.36	PASS	AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=1.37;MQ=22.40;MQ0=3;OQ=333.18;QD=18.51;SB=-10.00	GT:AD:DP:GL:GQ	1/1:2,15:9:-36.90,-2.71,-0.00:27.09
-chr1	5077090	.	C	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=2;HaplotypeScore=4.92;MQ=29.30;MQ0=3;OQ=51.83;QD=1.85;SB=-3.99	GT:AD:DP:GL:GQ	0/1:19,9:11:-11.79,-3.32,-22.43:84.66
-chr1	5077136	rs55919453	T	G	371.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=38.18;MQ0=2;OQ=1590.74;QD=31.81;SB=-546.07	GT:AD:DP:GL:GQ	1/1:0,50:44:-162.67,-13.25,-0.01:99
-chr1	5077346	rs28778348	C	A	55.21	PASS	AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=26.70;MQ0=2;OQ=838.40;QD=27.95;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,29:24:-87.43,-7.23,-0.01:72.21
-chr1	5077349	rs28898289	T	G	16.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=26.06;MQ0=2;OQ=780.24;QD=25.17;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,31:23:-81.62,-6.93,-0.01:69.20
-chr1	5077435	rs7415381	A	T	121.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=26.22;MQ0=5;OQ=1349.62;QD=28.72;SB=-637.67	GT:AD:DP:GL:GQ	1/1:0,47:37:-138.56,-11.15,-0.01:99
-chr1	5077528	rs56184987	T	C	231.69	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.13;MQ0=2;OQ=814.91;QD=18.95;SB=-252.77	GT:AD:DP:GL:GQ	1/1:0,43:27:-85.10,-8.15,-0.03:81.19
-chr1	5077549	rs55934905	G	A	0.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=0.98;MQ=23.80;MQ0=7;OQ=1118.88;QD=22.38;SB=-246.01	GT:AD:DP:GL:GQ	1/1:0,50:29:-115.48,-8.74,-0.01:87.28
-chr1	5077770	rs60669416	C	A	584.28	Indel	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=10;HaplotypeScore=19.78;MQ=46.83;MQ0=2;QD=11.69;SB=-270.35	GT:AD:DP:GL:GQ	0/1:25,24:45:-75.27,-13.56,-79.00:99
-chr1	5077806	rs2334261	C	T	3.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.02;HRun=2;HaplotypeScore=6.33;MQ=31.47;MQ0=13;OQ=1098.90;QD=20.35;SB=-473.36	GT:AD:DP:GL:GQ	1/1:5,48:29:-113.48,-8.43,-0.01:84.27
-chr1	5077915	rs11582268	A	T	437.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.80;MQ0=5;OQ=869.48;QD=19.32;SB=-460.68	GT:AD:DP:GL:GQ	1/1:0,44:25:-90.55,-7.54,-0.02:75.21
-chr1	5078308	rs12043988	C	A	291.59	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=47.74;MQ0=0;OQ=2467.70;QD=37.39;SB=-935.67	GT:AD:DP:GL:GQ	1/1:0,66:65:-250.36,-19.57,-0.01:99
-chr1	5078509	rs9439503	T	C	20.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=4.15;MQ=38.39;MQ0=4;OQ=1877.97;QD=28.03;SB=-657.32	GT:AD:DP:GL:GQ	1/1:1,66:53:-191.40,-15.96,-0.02:99
-chr1	5078532	rs9439504	C	G	494.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.41;MQ0=3;OQ=2205.88;QD=36.16;SB=-588.53	GT:AD:DP:GL:GQ	1/1:0,61:50:-224.18,-15.06,-0.01:99
-chr1	5078612	rs10915350	C	T	169.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=47.49;MQ0=1;OQ=2196.12;QD=36.60;SB=-847.62	GT:AD:DP:GL:GQ	1/1:1,58:57:-223.22,-17.18,-0.02:99
-chr1	5079390	rs10799170	A	C	350.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.35;MQ0=0;OQ=2787.95;QD=35.29;SB=-1421.63	GT:AD:DP:GL:GQ	1/1:0,79:78:-282.40,-23.49,-0.02:99
-chr1	5079434	rs10915352	G	T	571.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.02;MQ0=0;OQ=3162.32;QD=36.77;SB=-1557.78	GT:AD:DP:GL:GQ	1/1:0,86:86:-319.84,-25.90,-0.02:99
-chr1	5079595	rs10915353	G	C	43.37	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.36;MQ0=0;OQ=2638.35;QD=40.59;SB=-999.16	GT:AD:DP:GL:GQ	1/1:0,65:61:-267.45,-18.39,-0.03:99
-chr1	5079666	rs6701939	T	C	563.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2172.86;QD=35.05;SB=-713.27	GT:AD:DP:GL:GQ	1/1:0,62:60:-220.89,-18.07,-0.02:99
-chr1	5080376	.	C	T	202.08	PASS	AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.09;MQ0=0;OQ=426.51;QD=11.22;SB=-188.16	GT:AD:DP:GL:GQ	0/1:24,14:37:-57.08,-11.15,-81.03:99
-chr1	5080399	.	C	A	264.12	DPFilter;Indel	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=20;HaplotypeScore=11.69;MQ=57.12;MQ0=0;QD=4.63;SB=53.19	GT:AD:DP:GL:GQ	0/1:38,19:40:-41.75,-12.05,-100.11:99
-chr1	5080680	rs10753350	A	G	105.81	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=58.32;MQ0=0;OQ=1525.28;QD=28.25;SB=-610.83	GT:AD:DP:GL:GQ	1/1:0,54:51:-156.18,-15.39,-0.07:99
-chr1	5080690	rs10753351	A	C	1.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=3;HaplotypeScore=2.95;MQ=55.25;MQ0=0;OQ=2140.46;QD=31.48;SB=-1004.07	GT:AD:DP:GL:GQ	1/1:0,68:63:-217.66,-18.98,-0.03:99
-chr1	5081475	rs10737396	T	C	76.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=3;HaplotypeScore=0.91;MQ=60.00;MQ0=0;OQ=2367.06;QD=33.34;SB=-935.73	GT:AD:DP:GL:GQ	1/1:0,71:67:-240.32,-20.19,-0.03:99
-chr1	5081878	rs2722794	T	G	569.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.93;MQ0=0;OQ=2825.92;QD=34.89;SB=-1425.62	GT:AD:DP:GL:GQ	1/1:0,81:79:-286.20,-23.79,-0.02:99
-chr1	5081972	rs2611426	T	A	81.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.88;MQ=59.18;MQ0=0;OQ=2310.37;QD=35.01;SB=-624.95	GT:AD:DP:GL:GQ	1/1:0,66:62:-234.64,-18.68,-0.02:99
-chr1	5083407	rs2045587	A	G	34.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.31;MQ0=0;OQ=1821.48;QD=33.73;SB=-913.93	GT:AD:DP:GL:GQ	1/1:0,54:52:-185.75,-15.67,-0.02:99
-chr1	5083733	rs4313443	C	T	652.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2295.78;QD=39.58;SB=-913.70	GT:AD:DP:GL:GQ	1/1:0,58:58:-233.18,-17.47,-0.01:99
-chr1	5083785	rs4356099	G	A	29.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.30;MQ=60.00;MQ0=0;OQ=1676.22;QD=38.98;SB=-527.70	GT:AD:DP:GL:GQ	1/1:0,43:43:-171.22,-12.96,-0.02:99
-chr1	5083937	rs2722793	G	T	729.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=2771.95;QD=36.96;SB=-1328.90	GT:AD:DP:GL:GQ	1/1:0,75:75:-280.80,-22.59,-0.02:99
-chr1	5084549	rs10753352	G	C	80.52	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.74;MQ0=0;OQ=3116.41;QD=42.69;SB=-1439.29	GT:AD:DP:GL:GQ	1/1:0,73:73:-315.25,-22.00,-0.03:99
-chr1	5085006	rs2722792	C	A	486.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=3029.86;QD=36.95;SB=-1518.84	GT:AD:DP:GL:GQ	1/1:0,82:81:-306.59,-24.39,-0.02:99
-chr1	5085686	rs2611419	A	C	735.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2513.45;QD=35.40;SB=-1104.10	GT:AD:DP:GL:GQ	1/1:0,71:71:-254.95,-21.38,-0.02:99
-chr1	5087139	rs2611420	C	G	615.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3365.59;QD=43.15;SB=-1251.98	GT:AD:DP:GL:GQ	1/1:0,78:76:-335.56,-22.90,-0.03:99
-chr1	5087240	rs2611421	C	T	489.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=3117.95;QD=41.03;SB=-1433.39	GT:AD:DP:GL:GQ	1/1:0,76:76:-315.39,-22.89,-0.01:99
-chr1	5087511	rs2722791	G	A	190.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=2.68;MQ=59.73;MQ0=0;OQ=3174.39;QD=37.35;SB=-1593.03	GT:AD:DP:GL:GQ	1/1:0,85:81:-321.05,-24.40,-0.02:99
-chr1	5088299	rs2611422	C	T	24.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.01;HRun=4;HaplotypeScore=1.63;MQ=59.49;MQ0=0;OQ=3139.82;QD=38.29;SB=-1155.06	GT:AD:DP:GL:GQ	1/1:0,81:82:-317.60,-24.41,-0.03:99
-chr1	5088851	rs898338	G	T	586.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1967.21;QD=32.25;SB=-901.77	GT:AD:DP:GL:GQ	1/1:0,61:55:-200.32,-16.57,-0.02:99
-chr1	5091688	rs11588537	G	C	0.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=2.02;MQ=59.44;MQ0=0;OQ=1667.23;QD=40.66;SB=-503.13	GT:AD:DP:GL:GQ	1/1:0,41:41:-170.32,-12.36,-0.02:99
-chr1	5092085	rs4245628	G	A	151.82	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=59.41;MQ0=0;OQ=3066.13;QD=39.31;SB=-1187.61	GT:AD:DP:GL:GQ	1/1:0,78:77:-310.22,-23.19,-0.02:99
-chr1	5092563	rs6671889	C	A	625.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.16;MQ0=0;OQ=3060.89;QD=36.88;SB=-1358.20	GT:AD:DP:GL:GQ	1/1:0,83:82:-309.69,-24.69,-0.01:99
-chr1	5092609	rs4949165	G	C	633.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=3087.67;QD=42.88;SB=-1533.25	GT:AD:DP:GL:GQ	1/1:0,72:72:-312.37,-21.69,-0.02:99
-chr1	5092886	rs10492923	A	G	560.12	PASS	AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=897.90;QD=12.47;SB=-469.86	GT:AD:DP:GL:GQ	0/1:34,38:69:-113.87,-20.80,-132.03:99
-chr1	5093533	rs9439505	C	T	206.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=59.13;MQ0=0;OQ=1236.94;QD=16.49;SB=-238.14	GT:AD:DP:GL:GQ	0/1:38,37:73:-148.98,-22.00,-117.20:99
-chr1	5093841	rs12143009	G	A	1328.69	Indel	AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=3;HaplotypeScore=2.85;MQ=59.81;MQ0=1;QD=15.27;SB=-676.33	GT:AD:DP:GL:GQ	0/1:46,41:84:-161.46,-25.31,-156.05:99
-chr1	5094064	rs16840020	C	T	380.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=59.40;MQ0=0;OQ=843.58;QD=13.61;SB=-387.37	GT:AD:DP:GL:GQ	0/1:36,26:61:-106.01,-18.37,-128.57:99
-chr1	5094308	rs9439536	C	G	94.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=-0.06;MQ=57.94;MQ0=0;OQ=2369.61;QD=43.08;SB=-1192.92	GT:AD:DP:GL:GQ	1/1:0,55:55:-240.56,-16.57,-0.02:99
-chr1	5094675	rs9439537	G	A	205.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=56.69;MQ0=0;OQ=2327.54;QD=36.95;SB=-997.02	GT:AD:DP:GL:GQ	1/1:0,63:59:-236.35,-17.77,-0.02:99
-chr1	5095027	rs10737397	A	C	379.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.02;HRun=2;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1853.36;QD=34.97;SB=-880.10	GT:AD:DP:GL:GQ	1/1:0,52:52:-188.93,-15.66,-0.01:99
-chr1	5095151	rs10915359	A	G	343.67	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=1130.12;QD=15.92;SB=-404.21	GT:AD:DP:GL:GQ	0/1:33,38:69:-137.08,-20.78,-130.21:99
-chr1	5095177	rs12122020	C	T	430.32	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1196.16;QD=13.91;SB=-341.80	GT:AD:DP:GL:GQ	0/1:49,37:84:-148.20,-25.30,-177.14:99
-chr1	5095231	rs10492925	T	C	590.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1272.89;QD=14.98;SB=-556.65	GT:AD:DP:GL:GQ	0/1:35,50:83:-155.59,-25.02,-138.70:99
-chr1	5095242	rs12045223	A	T	548.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1555.76;QD=18.52;SB=-658.48	GT:AD:DP:GL:GQ	0/1:35,49:82:-183.56,-24.70,-128.89:99
-chr1	5096599	rs9439506	A	G	501.16	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=607.79;QD=10.30;SB=-265.38	GT:AD:DP:GL:GQ	0/1:36,23:58:-81.54,-17.47,-140.55:99
-chr1	5097069	.	C	T	27.83	PASS	AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.95;MQ0=0;OQ=280.61;QD=35.08;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,8:8:-31.64,-2.41,-0.00:24.08
-chr1	5097076	.	C	A	58.51	PASS	AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.95;MQ0=0;OQ=242.27;QD=30.28;SB=-10.00	GT:AD:DP:GL:GQ	1/1:0,8:8:-27.81,-2.41,-0.00:24.07
-chr1	5097414	rs34593428	C	T	209.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.12;MQ=60.00;MQ0=0;OQ=915.00;QD=14.52;SB=-282.17	GT:AD:DP:GL:GQ	0/1:34,29:62:-113.46,-18.67,-123.11:99
-chr1	5097811	rs10799172	T	C	730.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=2361.85;QD=34.73;SB=-1109.84	GT:AD:DP:GL:GQ	1/1:0,68:67:-239.79,-20.18,-0.02:99
-chr1	5097837	rs10799173	C	T	610.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=2894.02;QD=39.64;SB=-1458.48	GT:AD:DP:GL:GQ	1/1:0,73:72:-293.00,-21.69,-0.02:99
-chr1	5098649	rs16840051	C	T	466.71	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.76;MQ0=0;OQ=1115.98;QD=14.31;SB=-521.66	GT:AD:DP:GL:GQ	0/1:43,35:76:-137.77,-22.89,-150.84:99
-chr1	5099594	rs61576661	T	C	2.98	PASS	AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.02;HRun=0;HaplotypeScore=9.91;MQ=59.43;MQ0=0;OQ=660.15;QD=12.23;SB=-250.93	GT:AD:DP:GL:GQ	0/1:29,24:54:-85.27,-15.97,-115.92:99
-chr1	5100592	rs6681359	C	T	709.39	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=3001.23;QD=40.02;SB=-1288.71	GT:AD:DP:GL:GQ	1/1:0,75:75:-303.72,-22.59,-0.02:99
-chr1	5102008	rs7543139	A	C	24.50	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=8.00;MQ=58.40;MQ0=0;OQ=1023.25;QD=14.62;SB=-311.81	GT:AD:DP:GL:GQ	0/1:35,35:67:-125.80,-20.19,-114.71:99
-chr1	5102179	rs16840055	A	G	103.26	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=59.41;MQ0=0;OQ=1029.92;QD=14.51;SB=-438.97	GT:AD:DP:GL:GQ	0/1:36,35:69:-127.06,-20.79,-136.54:99
-chr1	5103146	rs4484964	T	C	669.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.67;MQ0=0;OQ=2031.10;QD=32.24;SB=-774.73	GT:AD:DP:GL:GQ	1/1:0,63:62:-206.74,-18.69,-0.04:99
-chr1	5103788	.	G	T	167.53	PASS	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.70;MQ0=0;OQ=1064.37;QD=14.00;SB=-541.64	GT:AD:DP:GL:GQ	0/1:38,38:74:-132.01,-22.29,-131.40:99
-chr1	5106305	rs9439509	G	A	600.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.19;MQ0=0;OQ=2218.17;QD=38.92;SB=-991.33	GT:AD:DP:GL:GQ	1/1:0,57:57:-225.42,-17.18,-0.02:99
-chr1	5106499	rs4345839	A	G	149.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=59.43;MQ0=0;OQ=2177.60;QD=33.50;SB=-1108.75	GT:AD:DP:GL:GQ	1/1:0,64:62:-221.38,-18.68,-0.03:99
-chr1	5107407	rs4584438	T	G	105.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=1.66;MQ=60.00;MQ0=0;OQ=2390.91;QD=33.67;SB=-961.60	GT:AD:DP:GL:GQ	1/1:0,70:70:-246.35,-24.25,-3.68:99
-chr1	5107616	rs4543848	T	C	111.63	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=2.89;MQ=59.72;MQ0=0;OQ=2325.30;QD=34.71;SB=-962.92	GT:AD:DP:GL:GQ	1/1:0,67:66:-236.14,-19.88,-0.02:99
-chr1	5107713	.	A	C	103.40	PASS	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1036.38;QD=12.79;SB=-351.52	GT:AD:DP:GL:GQ	0/1:44,37:81:-131.32,-24.40,-159.14:99
-chr1	5109104	rs12025231	C	T	369.55	PASS	AC=1;AF=0.50;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=60.00;MQ0=0;OQ=1428.81;QD=14.73;SB=-339.81	GT:AD:DP:GL:GQ	0/1:53,44:96:-175.10,-28.94,-171.50:99
-chr1	5109781	rs9439510	C	G	474.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3322.39;QD=44.30;SB=-1477.33	GT:AD:DP:GL:GQ	1/1:0,75:75:-331.24,-22.59,-0.02:99
-chr1	5109984	rs12121369	C	A	599.91	PASS	AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=1366.71;QD=15.89;SB=-516.80	GT:AD:DP:GL:GQ	0/1:40,46:85:-165.55,-25.60,-144.36:99
-chr1	5110261	rs7538704	G	C	501.84	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1089.65;QD=15.35;SB=-449.75	GT:AD:DP:GL:GQ	0/1:33,38:67:-132.47,-20.22,-140.33:99
-chr1	5110586	rs4462197	C	T	256.57	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2327.86;QD=37.55;SB=-1085.00	GT:AD:DP:GL:GQ	1/1:0,62:59:-236.39,-17.78,-0.02:99
-chr1	5110994	rs10753353	T	C	229.27	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.74;MQ0=0;OQ=2543.07;QD=35.32;SB=-1168.48	GT:AD:DP:GL:GQ	1/1:0,72:71:-257.91,-21.39,-0.02:99
-chr1	5111198	rs12027352	C	T	56.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=2;HaplotypeScore=3.00;MQ=59.50;MQ0=0;OQ=1422.29;QD=15.29;SB=-680.29	GT:AD:DP:GL:GQ	0/1:47,46:88:-172.02,-26.51,-161.50:99
-chr1	5111405	rs4314925	G	A	196.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.36;MQ0=0;OQ=2517.06;QD=38.72;SB=-1234.63	GT:AD:DP:GL:GQ	1/1:0,65:64:-255.31,-19.28,-0.02:99
-chr1	5112055	rs12145645	G	A	578.52	PASS	AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=1010.93;QD=13.66;SB=-362.83	GT:AD:DP:GL:GQ	0/1:42,32:72:-126.06,-21.69,-149.75:99
-chr1	5112088	rs61762208	G	A	38.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=2;HaplotypeScore=1.85;MQ=59.44;MQ0=0;OQ=1643.08;QD=19.80;SB=-651.68	GT:AD:DP:GL:GQ	0/1:37,46:82:-192.29,-24.70,-131.13:99
-chr1	5112135	rs12741116	A	G	713.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2397.16;QD=35.25;SB=-898.68	GT:AD:DP:GL:GQ	1/1:0,68:67:-243.32,-20.18,-0.02:99
-chr1	5113244	rs4600091	T	C	489.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2494.81;QD=29.70;SB=-1138.12	GT:AD:DP:GL:GQ	1/1:0,84:79:-253.13,-23.82,-0.07:99
-chr1	5113507	rs10753354	C	G	401.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=2295.20;QD=42.50;SB=-1097.09	GT:AD:DP:GL:GQ	1/1:0,54:54:-233.13,-16.28,-0.02:99
-chr1	5113815	rs6698288	G	A	330.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2134.65;QD=39.53;SB=-887.16	GT:AD:DP:GL:GQ	1/1:0,54:54:-217.07,-16.27,-0.02:99
-chr1	5114383	rs7517431	C	G	606.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=920.14;QD=14.61;SB=-463.75	GT:AD:DP:GL:GQ	0/1:36,27:62:-113.98,-18.68,-155.27:99
-chr1	5114445	rs7517449	C	T	297.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.63;MQ0=0;OQ=2115.05;QD=38.46;SB=-1037.87	GT:AD:DP:GL:GQ	1/1:0,55:54:-215.11,-16.27,-0.02:99
-chr1	5114723	rs10915361	C	T	120.85	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.02;MQ=58.20;MQ0=0;OQ=931.19;QD=19.81;SB=-478.50	GT:AD:DP:GL:GQ	0/1:19,28:46:-110.26,-13.86,-62.96:99
-chr1	5115596	rs9439538	T	C	593.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1568.48;QD=30.16;SB=-606.93	GT:AD:DP:GL:GQ	1/1:0,52:50:-160.48,-15.08,-0.04:99
-chr1	5115679	rs12021698	A	T	372.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.37;MQ0=0;OQ=887.17;QD=15.04;SB=-310.70	GT:AD:DP:GL:GQ	0/1:30,29:59:-109.77,-17.77,-114.78:99
-chr1	5115822	rs56173770	C	G	132.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1600.81;QD=26.68;SB=-808.51	GT:AD:DP:GL:GQ	0/1:19,41:59:-181.14,-17.77,-78.42:99
-chr1	5115851	rs9439539	T	A	636.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=2566.28;QD=37.74;SB=-1304.50	GT:AD:DP:GL:GQ	1/1:0,68:67:-260.22,-20.18,-0.01:99
-chr1	5117179	rs5009987	A	G	1517.20	Indel	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=20.42;MQ=58.93;MQ0=0;QD=27.59;SB=-603.23	GT:AD:DP:GL:GQ	1/1:2,53:53:-162.87,-15.98,-7.57:84.15
-chr1	5117504	rs10799174	G	A	14.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=8.52;MQ=58.73;MQ0=0;OQ=1003.11;QD=18.24;SB=-483.50	GT:AD:DP:GL:GQ	0/1:24,31:52:-119.27,-15.67,-72.69:99
-chr1	5117533	rs6672724	C	T	186.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.63;MQ0=0;OQ=1901.56;QD=37.29;SB=-943.75	GT:AD:DP:GL:GQ	1/1:0,51:50:-193.77,-15.07,-0.02:99
-chr1	5118461	rs9439511	C	T	378.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=58.91;MQ0=0;OQ=1153.56;QD=14.98;SB=-536.73	GT:AD:DP:GL:GQ	0/1:42,35:77:-141.84,-23.20,-148.03:99
-chr1	5119340	rs12401983	G	A	186.94	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=2.35;MQ=52.79;MQ0=0;OQ=1320.64;QD=16.93;SB=-541.57	GT:AD:DP:GL:GQ	0/1:37,40:76:-158.24,-22.89,-135.98:99
-chr1	5119644	rs55835407	G	A	140.46	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=42.95;MQ0=4;OQ=797.21;QD=12.86;SB=-199.88	GT:AD:DP:GL:GQ	0/1:35,27:56:-99.88,-16.88,-103.36:99
-chr1	5119704	rs56293801	T	C	75.11	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=42.91;MQ0=1;OQ=434.63;QD=8.36;SB=-212.22	GT:AD:DP:GL:GQ	0/1:32,20:46:-60.61,-13.87,-109.45:99
-chr1	5119914	rs12097824	T	C	114	PASS	AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.43;MQ=39.01;MQ0=0;OQ=589.79;QD=9.51;SB=-187.41	GT:AD:DP:GL:GQ	0/1:33,29:57:-79.44,-17.18,-127.34:99
-chr1	5120013	rs56126017	C	G	210.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=35.32;MQ0=0;OQ=1020.64;QD=14.38;SB=-272.51	GT:AD:DP:GL:GQ	0/1:43,28:70:-126.44,-21.09,-178.51:99
-chr1	5120085	.	G	A	0.02	FDRtranche1.00to2.00	AC=1;AF=0.50;AN=2;DP=101;Dels=0.01;HRun=0;HaplotypeScore=11.89;MQ=34.93;MQ0=0;OQ=541.17;QD=5.36;SB=13.62	GT:AD:DP:GL:GQ	0/1:77,23:97:-86.32,-28.91,-276.66:99
-chr1	5120089	.	T	A	0.03	FDRtranche0.10to1.00	AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=10.97;MQ=34.87;MQ0=0;OQ=894.55;QD=8.77;SB=-13.59	GT:AD:DP:GL:GQ	0/1:68,34:99:-122.56,-29.82,-255.26:99
-chr1	5120116	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=117;Dels=0.02;HRun=0;HaplotypeScore=143.29;MQ=34.92;MQ0=0;OQ=962.81;QD=8.23;SB=-91.05	GT:AD:DP:GL:GQ	0/1:76,37:114:-138.10,-38.53,-297.11:99
-chr1	5120146	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=141;Dels=0.01;HRun=0;HaplotypeScore=240.33;MQ=33.11;MQ0=0;OQ=492.54;QD=3.49;SB=14.98	GT:AD:DP:GL:GQ	0/1:116,23:120:-88.08,-35.54,-336.13:99
-chr1	5120150	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=150;Dels=0.03;HRun=0;HaplotypeScore=253.70;MQ=32.31;MQ0=0;OQ=526.30;QD=3.51;SB=-209.96	GT:AD:DP:GL:GQ	0/1:122,23:125:-96.24,-40.33,-348.30:99
-chr1	5120166	rs61762214	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DB;DP=169;Dels=0.02;HRun=0;HaplotypeScore=340.16;MQ=31.74;MQ0=0;OQ=707.91;QD=4.19;SB=-238.38	GT:AD:DP:GL:GQ	0/1:128,38:158:-120.76,-46.69,-441.60:99
-chr1	5120182	.	T	C	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=171;Dels=0.00;HRun=0;HaplotypeScore=247.34;MQ=30.32;MQ0=1;OQ=181.12;QD=1.06;SB=99.79	GT:AD:DP:GL:GQ	0/1:146,25:160:-69.62,-48.22,-544.70:99
-chr1	5120218	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=0;HaplotypeScore=296.87;MQ=30.08;MQ0=1;OQ=467.02;QD=2.51;SB=-243.49	GT:AD:DP:GL:GQ	0/1:160,26:175:-102.70,-52.71,-541.07:99
-chr1	5120238	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=187;Dels=0.01;HRun=0;HaplotypeScore=156.33;MQ=31.62;MQ0=1;OQ=98.86;QD=0.53;SB=35.37	GT:AD:DP:GL:GQ	0/1:164,15:172:-86.49,-73.32,-562.87:99
-chr1	5120240	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=184;Dels=0.01;HRun=0;HaplotypeScore=148.66;MQ=31.61;MQ0=1;OQ=319.23;QD=1.73;SB=30.34	GT:AD:DP:GL:GQ	0/1:160,22:170:-85.81,-50.61,-526.60:99
-chr1	5120250	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=0;HaplotypeScore=149.91;MQ=33.54;MQ0=1;OQ=262.42;QD=1.60;SB=170.48	GT:AD:DP:GL:GQ	0/1:144,20:159:-77.42,-47.90,-500.91:99
-chr1	5120252	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=152;Dels=0.00;HRun=0;HaplotypeScore=134.92;MQ=34.14;MQ0=1;OQ=1590.07;QD=10.46;SB=-170.99	GT:AD:DP:GL:GQ	0/1:98,53:143:-208.80,-46.51,-329.18:99
-chr1	5121185	.	T	C	32.44	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=59.52;MQ0=0;OQ=529.93;QD=11.04;SB=-169.50	GT:AD:DP:GL:GQ	0/1:26,22:46:-70.14,-13.86,-100.33:99
-chr1	5122129	rs10915363	G	C	183.28	PASS	AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=59.47;MQ0=0;OQ=1248.82;QD=17.84;SB=-543.72	GT:AD:DP:GL:GQ	0/1:31,39:66:-148.06,-19.89,-135.32:99
-chr1	5122156	rs10915364	G	C	495.83	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=1017.04;QD=16.14;SB=-464.81	GT:AD:DP:GL:GQ	0/1:31,32:62:-123.68,-18.70,-134.13:99
-chr1	5122248	rs11804873	C	T	62.77	PASS	AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=59.39;MQ0=0;OQ=700.13;QD=18.42;SB=-213.90	GT:AD:DP:GL:GQ	0/1:16,22:37:-84.44,-11.15,-55.54:99
-chr1	5122456	rs10915365	C	T	167.44	PASS	AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.45;MQ=59.52;MQ0=0;OQ=504.80;QD=12.94;SB=-201.18	GT:AD:DP:GL:GQ	0/1:22,17:38:-65.21,-11.45,-78.02:99
-chr1	5122978	rs12024162	T	C	1.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=6.85;MQ=58.05;MQ0=0;OQ=2287.65;QD=35.19;SB=-898.04	GT:AD:DP:GL:GQ	1/1:1,64:63:-232.37,-18.97,-0.02:99
-chr1	5123042	rs12026730	G	A	134.42	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=56.89;MQ0=0;OQ=1205.15;QD=19.76;SB=-414.94	GT:AD:DP:GL:GQ	0/1:25,36:58:-141.29,-17.49,-70.06:99
-chr1	5123330	rs9439540	C	A	63.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.37;MQ0=0;OQ=975.37;QD=16.53;SB=-180.54	GT:AD:DP:GL:GQ	0/1:27,32:57:-117.99,-17.17,-89.17:99
-chr1	5124476	rs17366543	A	G	248.41	PASS	AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=919.81;QD=12.26;SB=-428.10	GT:AD:DP:GL:GQ	0/1:42,33:74:-117.56,-22.29,-166.31:99
-chr1	5126548	rs6690311	A	G	73.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=3.31;MQ=60.00;MQ0=0;OQ=1952.07;QD=34.25;SB=-789.11	GT:AD:DP:GL:GQ	1/1:0,56:56:-198.81,-16.87,-0.02:99
-chr1	5126612	rs6675995	G	A	137.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=2.05;MQ=59.06;MQ0=0;OQ=2638.82;QD=38.24;SB=-1319.37	GT:AD:DP:GL:GQ	1/1:0,69:67:-267.49,-20.19,-0.02:99
-chr1	5126665	rs10799176	G	A	160.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=59.11;MQ0=0;OQ=2842.19;QD=38.93;SB=-1393.38	GT:AD:DP:GL:GQ	1/1:0,73:72:-287.83,-21.69,-0.02:99
-chr1	5126844	rs6685929	C	T	627.62	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2295.72;QD=37.63;SB=-1082.35	GT:AD:DP:GL:GQ	1/1:0,61:59:-233.18,-17.78,-0.02:99
-chr1	5126974	.	G	T	128.27	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.02;MQ0=0;OQ=1169.78;QD=18.87;SB=-560.81	GT:AD:DP:GL:GQ	0/1:24,38:60:-138.33,-18.07,-79.90:99
-chr1	5129269	rs11583683	C	T	146.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2126.34;QD=37.30;SB=-795.34	GT:AD:DP:GL:GQ	1/1:0,57:56:-216.24,-16.88,-0.02:99
-chr1	5129679	rs6603817	A	G	112.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.96;MQ0=0;OQ=1509.76;QD=32.82;SB=-474.53	GT:AD:DP:GL:GQ	1/1:0,46:43:-154.58,-12.95,-0.01:99
-chr1	5130606	rs4076635	G	A	636.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2562.75;QD=38.25;SB=-1303.24	GT:AD:DP:GL:GQ	1/1:0,67:65:-259.88,-19.58,-0.02:99
-chr1	5131752	rs4394703	C	A	307.05	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=58.90;MQ0=0;OQ=2017.11;QD=34.19;SB=-1012.79	GT:AD:DP:GL:GQ	1/1:0,58:57:-208.21,-19.84,-2.91:99
-chr1	5132477	rs6692740	A	G	667.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=2294.64;QD=31.43;SB=-1053.29	GT:AD:DP:GL:GQ	1/1:0,73:71:-233.10,-21.41,-0.05:99
-chr1	5133851	rs10492928	G	T	624.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=2734.91;QD=36.47;SB=-1337.92	GT:AD:DP:GL:GQ	1/1:0,75:75:-277.10,-22.59,-0.02:99
-chr1	5134195	rs7545119	C	A	288.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.20;MQ=59.11;MQ0=0;OQ=2691.33;QD=34.50;SB=-1000.80	GT:AD:DP:GL:GQ	1/1:0,78:75:-272.75,-22.59,-0.03:99
-chr1	5135504	rs10915369	C	T	488.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.87;MQ0=0;OQ=1900.03;QD=39.58;SB=-759.52	GT:AD:DP:GL:GQ	1/1:0,48:48:-193.60,-14.46,-0.01:99
-chr1	5135682	rs11583044	G	A	156.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=56.88;MQ0=0;OQ=1535.65;QD=34.90;SB=-689.33	GT:AD:DP:GL:GQ	1/1:0,44:41:-157.17,-12.36,-0.02:99
-chr1	5135692	rs10915370	C	T	137.61	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.35;MQ0=0;OQ=2137.06;QD=38.16;SB=-962.28	GT:AD:DP:GL:GQ	1/1:0,56:55:-217.31,-16.57,-0.02:99
-chr1	5138733	rs10915371	G	A	186.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=94;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=58.20;MQ0=0;OQ=3762.30;QD=40.02;SB=-1754.36	GT:AD:DP:GL:GQ	1/1:0,94:93:-375.23,-28.01,-0.02:99
-chr1	5139307	rs9439541	A	T	634.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3003.64;QD=37.55;SB=-1255.20	GT:AD:DP:GL:GQ	1/1:0,80:79:-303.97,-23.79,-0.02:99
-chr1	5139791	rs6603818	C	T	714.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=2781.44;QD=39.73;SB=-1291.72	GT:AD:DP:GL:GQ	1/1:0,70:70:-281.75,-21.09,-0.02:99
-chr1	5140071	rs7547229	C	T	724.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3128.00;QD=38.62;SB=-1344.39	GT:AD:DP:GL:GQ	1/1:0,81:78:-316.40,-23.49,-0.02:99
-chr1	5140234	.	A	C	162.19	PASS	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=858.81;QD=15.61;SB=-394.78	GT:AD:DP:GL:GQ	0/1:24,31:53:-105.13,-15.96,-88.06:99
-chr1	5141171	rs6688418	G	A	695.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2832.24;QD=40.46;SB=-1208.37	GT:AD:DP:GL:GQ	1/1:0,70:70:-286.82,-21.08,-0.01:99
-chr1	5141665	.	C	T	43.31	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=59.95;MQ0=0;OQ=985.11;QD=18.24;SB=-409.92	GT:AD:DP:GL:GQ	0/1:25,29:53:-117.76,-15.96,-94.79:99
-chr1	5141935	rs6701052	C	T	100.43	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.66;MQ=49.80;MQ0=8;OQ=1859.57;QD=32.06;SB=-869.02	GT:AD:DP:GL:GQ	1/1:8,50:47:-189.55,-14.16,-0.01:99
-chr1	5142041	rs12072516	A	T	329.01	PASS	AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.00;MQ0=0;OQ=266.78;QD=9.53;SB=-152.82	GT:AD:DP:GL:GQ	0/1:16,12:25:-37.49,-7.53,-57.93:99
-chr1	5142287	rs9286978	G	A	22.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=23.68;MQ0=8;OQ=873.11;QD=24.95;SB=-85.33	GT:AD:DP:GL:GQ	1/1:3,32:23:-90.90,-6.93,-0.01:69.22
-chr1	5143205	rs6664086	T	C	86.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=3.60;MQ=58.49;MQ0=0;OQ=2734.43;QD=33.76;SB=-1255.67	GT:AD:DP:GL:GQ	1/1:1,80:78:-277.05,-23.49,-0.03:99
-chr1	5144621	rs6603819	C	A	635.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2574.32;QD=36.78;SB=-1238.13	GT:AD:DP:GL:GQ	1/1:0,70:70:-261.03,-21.08,-0.02:99
-chr1	5146701	rs6669501	C	T	700.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=3011.38;QD=38.61;SB=-1500.64	GT:AD:DP:GL:GQ	1/1:0,78:76:-304.75,-22.90,-0.03:99
-chr1	5146942	rs10492930	A	G	610.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2413.30;QD=30.17;SB=-1138.47	GT:AD:DP:GL:GQ	1/1:0,79:77:-244.99,-23.23,-0.08:99
-chr1	5147215	rs10492931	G	A	723.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=2807.87;QD=39.00;SB=-1216.01	GT:AD:DP:GL:GQ	1/1:0,72:71:-284.39,-21.39,-0.02:99
-chr1	5148161	.	G	A	24.17	PASS	AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=1;HaplotypeScore=1.43;MQ=59.39;MQ0=0;OQ=1450.62;QD=19.09;SB=-417.73	GT:AD:DP:GL:GQ	0/1:33,43:74:-170.64,-22.29,-112.74:99
-chr1	5148401	rs6665697	T	C	269.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.48;MQ0=0;OQ=2231.09;QD=30.99;SB=-952.42	GT:AD:DP:GL:GQ	1/1:0,72:70:-226.75,-21.11,-0.06:99
-chr1	5150357	rs10915375	A	G	529.20	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.37;MQ0=0;OQ=1555.45;QD=31.74;SB=-790.64	GT:AD:DP:GL:GQ	1/1:0,49:49:-159.17,-14.78,-0.04:99
-chr1	5150590	.	G	T	11.56	DPFilter;LowQual	AC=1;AF=0.50;AN=2;DP=69;Dels=0.01;HRun=20;HaplotypeScore=36.67;MQ=54.55;MQ0=0;QD=0.17;SB=69.39	GT:AD:DP:GL:GQ	0/1:49,15:42:-26.08,-21.67,-128.29:44.08
-chr1	5150765	rs9439543	T	C	624.17	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=2519.73;QD=35.49;SB=-971.41	GT:AD:DP:GL:GQ	1/1:0,71:70:-255.58,-21.09,-0.03:99
-chr1	5150768	rs9439544	C	T	629.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.35;MQ0=0;OQ=2827.18;QD=38.21;SB=-1183.08	GT:AD:DP:GL:GQ	1/1:0,74:71:-286.33,-21.39,-0.02:99
-chr1	5150948	rs11583754	A	G	125.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=56.88;MQ0=0;OQ=1724.72;QD=34.49;SB=-813.67	GT:AD:DP:GL:GQ	1/1:0,50:49:-176.07,-14.76,-0.02:99
-chr1	5153524	rs7536712	T	C	117.29	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=1.92;MQ=59.77;MQ0=0;OQ=2818.40;QD=35.23;SB=-1399.67	GT:AD:DP:GL:GQ	1/1:1,78:79:-289.59,-27.33,-4.17:99
-chr1	5155164	rs2722780	G	T	611.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2724.16;QD=35.38;SB=-1305.24	GT:AD:DP:GL:GQ	1/1:0,77:77:-276.03,-23.20,-0.03:99
-chr1	5155635	rs2018394	C	G	496.66	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.82;MQ0=0;OQ=3565.75;QD=43.48;SB=-1230.53	GT:AD:DP:GL:GQ	1/1:0,82:80:-355.57,-24.10,-0.02:99
-chr1	5156126	rs2679215	G	C	570.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2670.60;QD=41.73;SB=-1328.91	GT:AD:DP:GL:GQ	1/1:0,64:63:-270.67,-18.98,-0.02:99
-chr1	5156634	rs1320179	T	A	161.58	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=59.60;MQ0=0;OQ=1611.01;QD=34.28;SB=-497.40	GT:AD:DP:GL:GQ	1/1:0,47:44:-164.71,-13.26,-0.02:99
-chr1	5157054	.	G	A	104.21	PASS	AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.46;MQ=58.03;MQ0=0;OQ=746.35;QD=13.09;SB=-370.87	GT:AD:DP:GL:GQ	0/1:33,24:57:-95.09,-17.17,-121.22:99
-chr1	5157089	rs2722781	C	T	248.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.68;MQ0=0;OQ=2013.78;QD=38.00;SB=-852.01	GT:AD:DP:GL:GQ	1/1:0,53:51:-204.98,-15.36,-0.01:99
-chr1	5158014	rs2679216	A	G	582.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=2870.64;QD=35.01;SB=-1392.56	GT:AD:DP:GL:GQ	1/1:0,82:80:-290.67,-24.10,-0.03:99
-chr1	5158416	rs2722782	T	C	292.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=59.74;MQ0=0;OQ=2481.35;QD=34.95;SB=-1226.71	GT:AD:DP:GL:GQ	1/1:0,71:71:-251.75,-21.39,-0.03:99
-chr1	5158842	rs2679217	A	C	278.49	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=2099.17;QD=33.86;SB=-765.90	GT:AD:DP:GL:GQ	1/1:0,62:61:-213.53,-18.38,-0.03:99
-chr1	5160232	rs2722783	T	C	124.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.20;MQ=59.02;MQ0=0;OQ=2420.10;QD=34.09;SB=-1200.16	GT:AD:DP:GL:GQ	1/1:1,69:68:-249.06,-23.31,-3.46:99
-chr1	5162761	rs2679218	T	C	309.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.65;MQ0=0;OQ=2240.61;QD=34.47;SB=-957.91	GT:AD:DP:GL:GQ	1/1:0,65:65:-227.67,-19.58,-0.02:99
-chr1	5164088	rs2722786	A	G	678.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=2134.58;QD=34.99;SB=-757.97	GT:AD:DP:GL:GQ	1/1:0,61:60:-217.06,-18.07,-0.02:99
-chr1	5164377	rs2722787	T	C	664.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1994.32;QD=31.16;SB=-946.38	GT:AD:DP:GL:GQ	1/1:0,64:63:-203.07,-19.00,-0.06:99
-chr1	5164508	.	G	A	21.64	PASS	AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=2;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=1023.93;QD=15.51;SB=-404.39	GT:AD:DP:GL:GQ	0/1:35,31:64:-124.97,-19.29,-108.14:99
-chr1	5165252	rs2679219	A	G	545.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2430.87;QD=31.16;SB=-1145.16	GT:AD:DP:GL:GQ	1/1:0,78:76:-246.73,-22.91,-0.06:99
-chr1	5165298	rs2722788	C	T	111.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.52;MQ0=0;OQ=3387.05;QD=38.93;SB=-1669.69	GT:AD:DP:GL:GQ	1/1:0,87:85:-337.71,-25.61,-0.03:99
-chr1	5166378	rs2722790	C	T	150.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=59.01;MQ0=0;OQ=2739.21;QD=39.13;SB=-1381.68	GT:AD:DP:GL:GQ	1/1:0,70:69:-277.52,-20.79,-0.02:99
-chr1	5170379	.	C	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=20;HaplotypeScore=3.49;MQ=51.63;MQ0=1;OQ=52.88;QD=0.64;SB=122.38	GT:AD:DP:GL:GQ	0/1:61,22:64:-27.86,-19.28,-197.27:85.72
-chr1	5172063	rs56164612	G	A	177.93	PASS	AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=59.16;MQ0=0;OQ=776.89;QD=15.54;SB=-274.16	GT:AD:DP:GL:GQ	0/1:24,26:48:-95.43,-14.46,-86.73:99
-chr1	5191577	rs471824	A	G	242.55	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.16;MQ0=0;OQ=1721.79;QD=27.77;SB=-749.45	GT:AD:DP:GL:GQ	1/1:1,61:57:-179.88,-17.20,-4.11:99
-chr1	5191739	rs632051	C	A	18.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=2;HaplotypeScore=4.23;MQ=58.83;MQ0=0;OQ=3137.26;QD=37.35;SB=-891.27	GT:AD:DP:GL:GQ	1/1:0,84:83:-317.33,-25.00,-0.02:99
-chr1	5193545	rs566114	T	G	200.45	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=2400.30;QD=34.29;SB=-1100.14	GT:AD:DP:GL:GQ	1/1:0,70:68:-243.64,-20.48,-0.02:99
-chr1	5194097	rs56295354	C	T	367.36	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.98;MQ0=0;OQ=896.66;QD=14.01;SB=-471.46	GT:AD:DP:GL:GQ	0/1:34,30:62:-111.63,-18.68,-121.51:99
-chr1	5195036	rs677735	A	G	310.10	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.68;MQ0=0;OQ=2493.12;QD=34.15;SB=-981.71	GT:AD:DP:GL:GQ	1/1:0,73:71:-252.92,-21.39,-0.03:99
-chr1	5195467	rs2986186	T	A	311.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=2846.52;QD=37.45;SB=-1332.00	GT:AD:DP:GL:GQ	1/1:0,76:75:-288.25,-22.59,-0.02:99
-chr1	5196704	rs2353169	T	C	724.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=2499.39;QD=34.71;SB=-983.95	GT:AD:DP:GL:GQ	1/1:0,72:72:-253.55,-21.69,-0.02:99
-chr1	5197705	rs473104	A	G	598.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2654.56;QD=34.93;SB=-1319.89	GT:AD:DP:GL:GQ	1/1:0,76:74:-269.06,-22.29,-0.02:99
-chr1	5197747	rs586165	T	C	721.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2710.69;QD=35.20;SB=-1278.13	GT:AD:DP:GL:GQ	1/1:0,77:76:-274.68,-22.89,-0.03:99
-chr1	5198145	rs584402	C	T	717.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2714.09;QD=39.33;SB=-1353.02	GT:AD:DP:GL:GQ	1/1:0,69:69:-275.01,-20.79,-0.02:99
-chr1	5198627	rs679712	T	A	207.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.59;MQ=59.36;MQ0=0;OQ=2332.10;QD=35.88;SB=-1044.59	GT:AD:DP:GL:GQ	1/1:0,65:63:-236.81,-18.97,-0.02:99
-chr1	5198919	rs551536	T	C	66.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=59.68;MQ0=0;OQ=2254.50;QD=31.75;SB=-1121.22	GT:AD:DP:GL:GQ	1/1:0,71:70:-229.09,-21.11,-0.06:99
-chr1	5198972	rs551376	G	A	527.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2736.21;QD=38.54;SB=-1372.67	GT:AD:DP:GL:GQ	1/1:0,71:69:-277.22,-20.79,-0.02:99
-chr1	5199041	rs550558	G	A	271.08	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.75;MQ0=0;OQ=2982.88;QD=39.25;SB=-1518.69	GT:AD:DP:GL:GQ	1/1:0,75:75:-301.89,-22.59,-0.02:99
-chr1	5199083	rs549773	C	A	400.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2265.19;QD=35.39;SB=-1149.37	GT:AD:DP:GL:GQ	1/1:0,64:63:-230.13,-18.98,-0.02:99
-chr1	5199801	rs663998	C	G	667.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.24;MQ0=1;OQ=2933.78;QD=41.91;SB=-1382.38	GT:AD:DP:GL:GQ	1/1:0,70:68:-296.98,-20.49,-0.02:99
-chr1	5199984	rs663142	G	T	300.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=57.88;MQ0=0;OQ=2524.52;QD=34.58;SB=-1263.12	GT:AD:DP:GL:GQ	1/1:0,73:71:-256.06,-21.39,-0.02:99
-chr1	5200020	rs663106	T	C	288.64	PASS	AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.94;MQ0=0;OQ=2324.56;QD=29.06;SB=-1068.20	GT:AD:DP:GL:GQ	1/1:0,80:72:-236.10,-21.71,-0.06:99
-chr1	5201096	rs35339923	C	T	25.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.74;MQ=59.27;MQ0=0;OQ=2513.57;QD=39.90;SB=-919.70	GT:AD:DP:GL:GQ	1/1:0,63:63:-254.96,-18.98,-0.02:99
-chr1	5201932	rs611422	T	C	369.89	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=2205.79;QD=33.94;SB=-980.06	GT:AD:DP:GL:GQ	1/1:0,65:62:-224.19,-18.68,-0.02:99
-chr1	5201978	rs534321	A	C	83.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.68;MQ0=0;OQ=2498.46;QD=34.23;SB=-901.19	GT:AD:DP:GL:GQ	1/1:0,73:73:-253.46,-21.99,-0.03:99
-chr1	5202029	rs534188	C	T	644.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=2223.00;QD=39.70;SB=-899.19	GT:AD:DP:GL:GQ	1/1:0,56:56:-225.90,-16.87,-0.02:99
-chr1	5202175	rs12125575	G	A	578.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=51.13;MQ0=0;OQ=1740.25;QD=37.03;SB=-800.07	GT:AD:DP:GL:GQ	1/1:0,47:44:-177.62,-13.25,-0.01:99
-chr1	5202200	rs610133	T	C	141.51	PASS	AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=49.73;MQ0=0;OQ=1399.83;QD=30.43;SB=-711.63	GT:AD:DP:GL:GQ	1/1:0,46:41:-143.59,-12.36,-0.02:99
-chr1	5202222	rs511282	G	T	609.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=50.02;MQ0=0;OQ=2299.71;QD=34.32;SB=-1138.31	GT:AD:DP:GL:GQ	1/1:0,67:64:-233.58,-19.28,-0.02:99
-chr1	5202265	rs599481	G	T	595.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=49.58;MQ0=0;OQ=2113.87;QD=33.55;SB=-993.43	GT:AD:DP:GL:GQ	1/1:0,63:58:-214.99,-17.47,-0.02:99
-chr1	5202388	rs12066405	A	G	127.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=51.98;MQ0=0;OQ=2322.85;QD=33.66;SB=-1080.10	GT:AD:DP:GL:GQ	1/1:0,69:65:-235.89,-19.58,-0.02:99
-chr1	5202422	.	T	G	419.39	Indel	AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=66.39;MQ=43.53;MQ0=0;QD=7.23;SB=-202.77	GT:AD:DP:GL:GQ	0/1:38,20:51:-60.59,-15.36,-121.07:99
-chr1	5202441	rs12071111	G	A	97.09	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=40.65;MQ0=0;OQ=1838.51;QD=34.69;SB=-927.74	GT:AD:DP:GL:GQ	1/1:1,52:48:-187.45,-14.46,-0.02:99
-chr1	5202467	rs12067585	T	G	27.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.10;MQ=52.14;MQ0=0;OQ=1141.50;QD=32.61;SB=-417.26	GT:AD:DP:GL:GQ	1/1:0,35:33:-117.74,-9.94,-0.01:99
-chr1	5202510	rs10915390	T	C	6.38	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=45.77;MQ0=0;OQ=1492.54;QD=28.70;SB=-582.99	GT:AD:DP:GL:GQ	1/1:0,52:46:-152.88,-13.87,-0.04:99
-chr1	5202536	rs10915391	A	G	576.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=40.09;MQ0=0;OQ=1719.08;QD=33.06;SB=-769.98	GT:AD:DP:GL:GQ	1/1:0,52:48:-175.51,-14.46,-0.01:99
-chr1	5202563	.	A	G	1303.98	SnpCluster	AC=2;AF=1.00;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=5.87;MQ=34.10;MQ0=0;QD=25.08;SB=-434.46	GT:AD:DP:GL:GQ	1/1:0,52:39:-134.00,-11.75,-0.02:99
-chr1	5202564	.	T	C	1560.70	SnpCluster	AC=2;AF=1.00;AN=2;DP=52;Dels=0.00;HRun=2;HaplotypeScore=5.87;MQ=34.10;MQ0=0;QD=30.01;SB=-450.83	GT:AD:DP:GL:GQ	1/1:1,51:44:-159.67,-13.26,-0.02:99
-chr1	5202566	.	C	T	1713.62	SnpCluster	AC=2;AF=1.00;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.22;MQ=34.87;MQ0=0;QD=32.95;SB=-454.10	GT:AD:DP:GL:GQ	1/1:0,51:43:-174.96,-12.95,-0.01:99
-chr1	5202576	rs12134110	C	T	0.75	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=6.13;MQ=37.89;MQ0=0;OQ=1873.93;QD=33.46;SB=-544.73	GT:AD:DP:GL:GQ	1/1:1,55:47:-190.99,-14.16,-0.01:99
-chr1	5202767	rs2986185	A	G	288.60	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=54.20;MQ0=0;OQ=2264.33;QD=34.84;SB=-1153.44	GT:AD:DP:GL:GQ	1/1:0,65:64:-230.04,-19.28,-0.02:99
-chr1	5202796	rs2945617	T	C	352.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=54.10;MQ0=0;OQ=1791.40;QD=27.99;SB=-839.97	GT:AD:DP:GL:GQ	1/1:0,64:58:-182.79,-17.50,-0.06:99
-chr1	5202844	rs2986184	C	G	260.78	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=52.86;MQ0=0;OQ=2380.85;QD=40.35;SB=-1080.09	GT:AD:DP:GL:GQ	1/1:0,59:56:-241.69,-16.88,-0.02:99
-chr1	5202908	.	C	T	49.09	PASS	AC=2;AF=1.00;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=56.41;MQ0=0;OQ=1679.71;QD=37.33;SB=-834.36	GT:AD:DP:GL:GQ	1/1:0,45:42:-171.56,-12.65,-0.01:99
-chr1	5203231	rs480807	G	A	112.83	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=1.65;MQ=59.13;MQ0=0;OQ=2991.96;QD=39.89;SB=-1079.44	GT:AD:DP:GL:GQ	1/1:0,75:75:-302.81,-22.60,-0.03:99
-chr1	5203306	rs6687834	C	T	621.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3055.40;QD=39.68;SB=-1315.34	GT:AD:DP:GL:GQ	1/1:0,77:77:-309.15,-23.20,-0.02:99
-chr1	5203354	rs584498	C	T	147.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.38;MQ0=0;OQ=2983.67;QD=38.25;SB=-1435.37	GT:AD:DP:GL:GQ	1/1:0,78:75:-301.97,-22.59,-0.02:99
-chr1	5203671	rs582779	C	A	167.92	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=2146.95;QD=35.78;SB=-804.85	GT:AD:DP:GL:GQ	1/1:0,60:60:-218.30,-18.08,-0.02:99
-chr1	5203886	rs474456	G	C	148.15	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.48;MQ=58.03;MQ0=0;OQ=2254.35;QD=39.55;SB=-1087.49	GT:AD:DP:GL:GQ	1/1:0,57:55:-229.05,-16.59,-0.04:99
-chr1	5203943	rs473685	T	C	568.01	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.84;MQ0=0;OQ=1941.75;QD=35.30;SB=-734.93	GT:AD:DP:GL:GQ	1/1:0,55:55:-197.78,-16.57,-0.02:99
-chr1	5204037	rs472768	C	A	257.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=53.49;MQ0=0;OQ=2116.13;QD=35.87;SB=-808.86	GT:AD:DP:GL:GQ	1/1:0,59:58:-215.21,-17.47,-0.01:99
-chr1	5204179	rs561169	C	T	180.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.63;MQ0=0;OQ=1666.79;QD=32.68;SB=-839.97	GT:AD:DP:GL:GQ	1/1:0,51:44:-170.29,-13.26,-0.02:99
-chr1	5204268	rs677650	G	C	32.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=41.36;MQ0=0;OQ=1911.63;QD=39.01;SB=-915.40	GT:AD:DP:GL:GQ	1/1:0,49:46:-194.77,-13.87,-0.02:99
-chr1	5204556	rs676589	T	A	738.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.27;MQ0=0;OQ=2559.35;QD=36.56;SB=-1189.80	GT:AD:DP:GL:GQ	1/1:0,70:69:-259.54,-20.78,-0.02:99
-chr1	5204733	rs675738	T	C	27.97	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=2.20;MQ=59.17;MQ0=0;OQ=1658.38;QD=29.61;SB=-662.81	GT:AD:DP:GL:GQ	1/1:0,56:52:-169.47,-15.68,-0.05:99
-chr1	5204883	rs9439546	G	A	532.03	PASS	AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2940.91;QD=38.70;SB=-1192.36	GT:AD:DP:GL:GQ	1/1:0,76:75:-297.70,-22.60,-0.03:99
-chr1	5204955	rs674820	A	G	79.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.76;MQ=59.62;MQ0=0;OQ=2113.60;QD=34.65;SB=-990.71	GT:AD:DP:GL:GQ	1/1:0,61:60:-214.97,-18.07,-0.02:99
-chr1	5204998	rs674421	C	T	11.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=4.18;MQ=59.19;MQ0=0;OQ=2200.64;QD=38.61;SB=-746.99	GT:AD:DP:GL:GQ	1/1:0,57:55:-223.66,-16.57,-0.01:99
-chr1	5205224	rs673451	T	G	405.18	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.91;MQ0=0;OQ=1733.87;QD=28.90;SB=-756.83	GT:AD:DP:GL:GQ	1/1:0,60:55:-177.02,-16.58,-0.05:99
-chr1	5206120	rs56397638	C	T	43.03	Indel;LowQual	AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=3.09;MQ=48.93;MQ0=0;QD=2.39;SB=-0.99	GT:AD:DP:GL:GQ	0/1:15,3:17:-12.71,-5.12,-48.36:75.87
-chr1	5206410	.	T	C	0.40	PASS	AC=2;AF=1.00;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=1.63;MQ=56.77;MQ0=0;OQ=1364.10;QD=34.98;SB=-316.12	GT:AD:DP:GL:GQ	1/1:0,39:38:-140.01,-11.45,-0.01:99
-chr1	5206681	rs12121640	A	C	71.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.51;MQ0=0;OQ=1679.67;QD=32.93;SB=-387.04	GT:AD:DP:GL:GQ	1/1:0,51:47:-171.57,-14.16,-0.01:99
-chr1	5206700	rs12125074	G	A	98.48	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.12;MQ0=0;OQ=2000.17;QD=37.74;SB=-489.65	GT:AD:DP:GL:GQ	1/1:0,53:50:-203.61,-15.06,-0.01:99
-chr1	5208394	rs7549686	T	C	327.06	PASS	AC=2;AF=1.00;AN=2;DB;DP=94;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3436.97;QD=36.56;SB=-1599.67	GT:AD:DP:GL:GQ	1/1:0,94:93:-342.70,-28.01,-0.02:99
-chr1	5209527	rs12135834	C	T	124.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=2736.25;QD=39.66;SB=-1253.04	GT:AD:DP:GL:GQ	1/1:0,69:68:-277.22,-20.48,-0.01:99
-chr1	5209757	rs12128282	G	A	708.74	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=2355.65;QD=38.62;SB=-1039.67	GT:AD:DP:GL:GQ	1/1:0,61:59:-239.17,-17.77,-0.02:99
-chr1	5210118	rs4465222	T	C	132.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.97;MQ0=0;OQ=1268.12;QD=28.18;SB=-489.53	GT:AD:DP:GL:GQ	1/1:0,45:42:-130.45,-12.68,-0.06:99
-chr1	5210152	rs4465223	T	C	176.23	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.16;MQ0=0;OQ=1621.75;QD=29.49;SB=-654.28	GT:AD:DP:GL:GQ	1/1:0,55:51:-165.81,-15.38,-0.05:99
-chr1	5210469	rs6686714	G	T	712.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1971.04;QD=35.20;SB=-893.62	GT:AD:DP:GL:GQ	1/1:0,56:56:-200.71,-16.87,-0.02:99
-chr1	5211244	rs6603825	T	C	594.56	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=2173.03;QD=35.62;SB=-828.31	GT:AD:DP:GL:GQ	1/1:0,61:60:-220.91,-18.07,-0.02:99
-chr1	5211435	.	C	T	25.65	PASS	AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.22;MQ=59.65;MQ0=0;OQ=960.07;QD=17.78;SB=-418.78	GT:AD:DP:GL:GQ	0/1:25,29:53:-115.26,-15.97,-85.03:99
-chr1	5212025	rs4475768	T	G	354.90	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=695.32;QD=14.19;SB=-234.36	GT:AD:DP:GL:GQ	0/1:24,25:49:-87.57,-14.76,-89.97:99
-chr1	5212226	rs494046	T	C	148.80	PASS	AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=2779.20;QD=29.88;SB=-1328.52	GT:AD:DP:GL:GQ	1/1:0,93:88:-281.58,-26.54,-0.08:99
-chr1	5213428	.	A	G	11.97	PASS	AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=58.55;MQ0=0;OQ=408.80;QD=8.52;SB=-93.78	GT:AD:DP:GL:GQ	0/1:27,21:44:-57.43,-13.27,-96.36:99
-chr1	5213524	.	T	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=71.93;MQ=50.54;MQ0=0;OQ=502.87;QD=9.14;SB=-189.21	GT:AD:DP:GL:GQ	0/1:37,18:47:-67.73,-14.16,-102.82:99
-chr1	5213770	rs6658152	C	T	45.87	PASS	AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=1572.39;QD=38.35;SB=-554.31	GT:AD:DP:GL:GQ	1/1:0,41:41:-160.84,-12.35,-0.02:99
-chr1	5215271	.	A	G	38.30	PASS	AC=2;AF=1.00;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.20;MQ=59.60;MQ0=0;OQ=1692.08;QD=29.17;SB=-770.59	GT:AD:DP:GL:GQ	1/1:0,57:55:-172.85,-16.59,-0.06:99
-chr1	5217813	.	G	C	1.18	PASS	AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=9.11;MQ=58.35;MQ0=1;OQ=1164.43;QD=14.38;SB=-426.29	GT:AD:DP:GL:GQ	0/1:49,32:77:-142.93,-23.20,-194.98:99
-chr1	5217931	rs4847582	C	G	145.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.66;MQ0=0;OQ=1509.42;QD=22.20;SB=-480.86	GT:AD:DP:GL:GQ	0/1:26,42:66:-174.11,-19.89,-110.01:99
-chr1	5218042	rs4847581	A	T	229.68	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.31;MQ0=0;OQ=560.70;QD=9.19;SB=-151.08	GT:AD:DP:GL:GQ	0/1:39,22:59:-77.12,-17.77,-150.88:99
-chr1	5218412	rs12089315	C	T	695.85	PASS	AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2655.40;QD=40.23;SB=-1167.53	GT:AD:DP:GL:GQ	1/1:0,66:65:-269.14,-19.58,-0.01:99
-chr1	5218922	rs55929300	C	T	250.89	PASS	AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=58.35;MQ0=0;OQ=749.84;QD=14.42;SB=-372.87	GT:AD:DP:GL:GQ	0/1:29,23:51:-93.64,-15.37,-91.04:99
-chr1	5218923	rs2945619	A	G	55.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.25;MQ=58.42;MQ0=0;OQ=1817.82;QD=33.66;SB=-828.90	GT:AD:DP:GL:GQ	1/1:0,54:53:-185.39,-15.97,-0.03:99
-chr1	5219162	.	C	T	26.36	PASS	AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=2;HaplotypeScore=0.93;MQ=59.78;MQ0=0;OQ=1260.89;QD=15.01;SB=-475.42	GT:AD:DP:GL:GQ	0/1:46,38:84:-154.67,-25.30,-167.04:99
-chr1	5220394	rs632798	A	G	319.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1931.82;QD=32.74;SB=-775.98	GT:AD:DP:GL:GQ	1/1:0,59:54:-196.78,-16.27,-0.02:99
-chr1	5221239	rs11584035	A	G	510.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2162.59;QD=34.33;SB=-1003.74	GT:AD:DP:GL:GQ	1/1:0,63:61:-219.86,-18.37,-0.02:99
-chr1	5221301	rs11585734	G	C	28.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.47;MQ0=0;OQ=2416.76;QD=43.16;SB=-843.33	GT:AD:DP:GL:GQ	1/1:0,56:55:-245.27,-16.57,-0.01:99
-chr1	5221482	rs34835703	A	T	2939.50	Indel	AC=2;AF=1.00;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=3.98;MQ=58.65;MQ0=0;QD=31.95;SB=-1078.25	GT:AD:DP:GL:GQ	1/1:2,89:87:-306.96,-29.45,-9.42:99
-chr1	5221725	.	G	A	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=60;Dels=0.03;HRun=18;HaplotypeScore=39.80;MQ=52.31;MQ0=0;OQ=152.15;QD=2.54;SB=47.14	GT:AD:DP:GL:GQ	0/1:40,18:43:-30.85,-12.35,-114.35:99
-chr1	5222078	rs972257	T	A	639.98	PASS	AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.18;MQ0=0;OQ=3168.88;QD=37.28;SB=-1120.55	GT:AD:DP:GL:GQ	1/1:0,85:85:-320.49,-25.60,-0.02:99
-chr1	5222126	rs972256	A	G	626.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=2639.54;QD=35.19;SB=-1126.78	GT:AD:DP:GL:GQ	1/1:0,75:75:-267.56,-22.59,-0.03:99
-chr1	5224091	rs499416	T	C	297.77	PASS	AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.44;MQ0=0;OQ=2957.76;QD=36.07;SB=-1259.50	GT:AD:DP:GL:GQ	1/1:0,82:82:-299.39,-24.70,-0.03:99
-chr1	5224457	rs681122	A	G	116.50	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.67;MQ0=0;OQ=2663.18;QD=31.70;SB=-1024.35	GT:AD:DP:GL:GQ	1/1:0,84:81:-269.96,-24.42,-0.06:99
-chr1	5224547	rs503246	T	C	2.42	PASS	AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=6.13;MQ=59.67;MQ0=0;OQ=2425.86;QD=34.66;SB=-1136.77	GT:AD:DP:GL:GQ	1/1:0,69:69:-249.69,-23.90,-3.52:99
-chr1	5224600	rs504015	G	A	107.71	PASS	AC=2;AF=1.00;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=59.36;MQ0=0;OQ=3623.40;QD=38.14;SB=-1734.33	GT:AD:DP:GL:GQ	1/1:1,94:92:-361.34,-27.72,-0.04:99
-chr1	5225244	rs34916930	A	G	210.97	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=59.23;MQ0=0;OQ=766.73;QD=12.78;SB=-281.64	GT:AD:DP:GL:GQ	0/1:31,29:57:-97.13,-17.17,-122.94:99
-chr1	5225286	rs1614164	A	G	116.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.11;MQ0=0;OQ=1503.00;QD=28.90;SB=-584.52	GT:AD:DP:GL:GQ	1/1:0,52:49:-153.94,-14.79,-0.06:99
-chr1	5225305	rs531507	T	C	127.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=59.05;MQ0=0;OQ=1485.28;QD=30.31;SB=-700.80	GT:AD:DP:GL:GQ	1/1:0,49:47:-152.15,-14.18,-0.04:99
-chr1	5225319	rs531541	G	A	341.76	PASS	AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.53;MQ0=0;OQ=776.62;QD=15.85;SB=-311.30	GT:AD:DP:GL:GQ	0/1:25,24:46:-94.81,-13.86,-73.71:99
-chr1	5225584	rs12139398	G	T	64.15	PASS	AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=3;HaplotypeScore=2.68;MQ=59.09;MQ0=0;OQ=1255.53;QD=16.52;SB=-636.75	GT:AD:DP:GL:GQ	0/1:35,41:76:-151.73,-22.89,-120.82:99
-chr1	5225784	rs648378	G	A	217.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=3051.49;QD=38.63;SB=-1366.03	GT:AD:DP:GL:GQ	1/1:0,79:77:-308.76,-23.20,-0.02:99
-chr1	5225910	rs536995	T	C	659.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2238.13;QD=31.52;SB=-1141.80	GT:AD:DP:GL:GQ	1/1:0,71:69:-227.45,-20.80,-0.05:99
-chr1	5226194	rs646542	C	A	53.96	PASS	AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=2.51;MQ=59.52;MQ0=0;OQ=616.21;QD=12.84;SB=-186.21	GT:AD:DP:GL:GQ	0/1:25,23:46:-78.77,-13.86,-80.93:99
-chr1	5227007	rs17422703	C	T	447.59	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=653.00;QD=13.89;SB=-346.50	GT:AD:DP:GL:GQ	0/1:27,20:47:-82.75,-14.17,-88.07:99
-chr1	5227141	rs479689	T	C	634.35	PASS	AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2577.54;QD=35.80;SB=-1149.80	GT:AD:DP:GL:GQ	1/1:0,72:72:-261.36,-21.69,-0.02:99
-chr1	5227198	rs631837	T	G	470.17	PASS	AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=1038.21;QD=12.98;SB=-481.28	GT:AD:DP:GL:GQ	0/1:42,38:78:-130.60,-23.49,-142.85:99
-chr1	5227509	rs2945620	A	G	463.41	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.71;MQ0=0;OQ=1887.53;QD=34.95;SB=-718.20	GT:AD:DP:GL:GQ	1/1:0,54:53:-192.35,-15.96,-0.02:99
-chr1	5227512	rs2986190	C	G	581.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=2178.35;QD=38.90;SB=-696.39	GT:AD:DP:GL:GQ	1/1:0,56:54:-221.45,-16.29,-0.03:99
-chr1	5227592	rs484203	C	G	505.04	PASS	AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.30;MQ0=0;OQ=1740.53;QD=36.26;SB=-435.04	GT:AD:DP:GL:GQ	1/1:0,48:44:-177.67,-13.27,-0.03:99
-chr1	5227620	rs2945621	C	T	184.65	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=58.52;MQ0=0;OQ=2108.36;QD=38.33;SB=-729.97	GT:AD:DP:GL:GQ	1/1:0,54:54:-216.99,-18.70,-2.57:99
-chr1	5228455	rs605572	G	A	158.70	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.08;MQ0=0;OQ=2364.59;QD=38.76;SB=-1049.40	GT:AD:DP:GL:GQ	1/1:0,61:59:-240.06,-17.77,-0.01:99
-chr1	5228485	rs547366	A	G	151.91	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.43;MQ=59.32;MQ0=0;OQ=1644.48;QD=29.90;SB=-746.94	GT:AD:DP:GL:GQ	1/1:0,55:53:-168.09,-15.99,-0.05:99
-chr1	5228494	rs547375	T	C	432.28	PASS	AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=1148.89;QD=28.72;SB=-518.83	GT:AD:DP:GL:GQ	1/1:0,40:38:-118.51,-11.46,-0.04:99
-chr1	5228675	rs549178	A	C	608.96	PASS	AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1844.59;QD=34.16;SB=-895.07	GT:AD:DP:GL:GQ	1/1:0,54:53:-188.06,-15.96,-0.02:99
-chr1	5229041	rs552154	A	G	144.86	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=1.05;MQ=58.33;MQ0=0;OQ=2394.34;QD=35.74;SB=-1030.76	GT:AD:DP:GL:GQ	1/1:0,67:67:-243.04,-20.18,-0.02:99
-chr1	5229075	rs694316	A	G	16.95	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=2.71;MQ=58.29;MQ0=0;OQ=1696.38;QD=32.62;SB=-808.31	GT:AD:DP:GL:GQ	1/1:0,52:49:-173.25,-14.76,-0.02:99
-chr1	5229079	rs574063	A	C	47.22	PASS	AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=2.27;MQ=58.29;MQ0=0;OQ=1690.52;QD=32.51;SB=-775.03	GT:AD:DP:GL:GQ	1/1:0,52:50:-172.66,-15.06,-0.02:99
-chr1	5229195	rs2986189	T	C	594.24	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1695.13;QD=33.24;SB=-849.99	GT:AD:DP:GL:GQ	1/1:0,50:49:-173.12,-14.76,-0.02:99
-chr1	5229410	rs590229	A	G	533.32	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.69;MQ0=0;OQ=1626.39;QD=32.53;SB=-702.18	GT:AD:DP:GL:GQ	1/1:0,50:47:-166.24,-14.16,-0.02:99
-chr1	5229454	rs576935	T	C	291.30	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=2227.88;QD=34.81;SB=-1091.09	GT:AD:DP:GL:GQ	1/1:0,64:63:-226.40,-18.98,-0.03:99
-chr1	5229643	rs589314	C	T	702.68	PASS	AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3349.31;QD=39.87;SB=-1157.05	GT:AD:DP:GL:GQ	1/1:0,84:83:-333.93,-25.00,-0.02:99
-chr1	5229725	rs579467	T	C	242.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=59.13;MQ0=0;OQ=1575.01;QD=29.72;SB=-809.29	GT:AD:DP:GL:GQ	1/1:0,53:51:-161.14,-15.39,-0.05:99
-chr1	5229840	rs580404	G	A	618.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=2841.67;QD=38.93;SB=-1151.68	GT:AD:DP:GL:GQ	1/1:0,73:73:-287.78,-22.00,-0.03:99
-chr1	5229963	rs587619	A	G	627.90	PASS	AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=1527.65;QD=31.18;SB=-661.80	GT:AD:DP:GL:GQ	1/1:0,49:48:-156.40,-14.48,-0.05:99
-chr1	5230068	rs684796	A	G	654.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1910.04;QD=31.31;SB=-776.75	GT:AD:DP:GL:GQ	1/1:0,61:59:-194.63,-17.79,-0.04:99
-chr1	5230099	rs493993	T	C	52.25	PASS	AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.40;MQ=60.00;MQ0=0;OQ=1531.39;QD=30.03;SB=-555.88	GT:AD:DP:GL:GQ	1/1:0,51:49:-156.77,-14.78,-0.05:99
-chr1	5230146	rs494138	C	T	565.44	PASS	AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1901.52;QD=38.03;SB=-812.08	GT:AD:DP:GL:GQ	1/1:0,50:49:-193.76,-14.77,-0.02:99
-chr1	5230400	rs683361	C	T	576.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=2445.96;QD=38.22;SB=-885.63	GT:AD:DP:GL:GQ	1/1:0,64:64:-248.21,-19.29,-0.03:99
-chr1	5230419	rs683326	A	C	444.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=2097.81;QD=32.78;SB=-733.04	GT:AD:DP:GL:GQ	1/1:0,64:59:-213.39,-17.77,-0.02:99
-chr1	5230522	rs497780	C	T	280.11	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=59.44;MQ0=0;OQ=2456.36;QD=36.66;SB=-1135.53	GT:AD:DP:GL:GQ	1/1:0,66:64:-249.25,-19.29,-0.03:99
-chr1	5230617	rs682425	A	C	128.19	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=60.00;MQ0=0;OQ=2329.64;QD=34.26;SB=-803.08	GT:AD:DP:GL:GQ	1/1:1,67:66:-236.57,-19.88,-0.02:99
-chr1	5230727	rs499639	G	A	152.07	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=59.28;MQ0=0;OQ=1710.74;QD=26.73;SB=-582.87	GT:AD:DP:GL:GQ	1/1:0,37:64:-256.74,-99.73,-82.08:99
-chr1	5230993	rs17423021	C	T	275.08	PASS	AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=60.00;MQ0=0;OQ=870.39;QD=18.52;SB=-403.16	GT:AD:DP:GL:GQ	0/1:21,26:47:-104.48,-14.16,-73.19:99
-chr1	5231281	rs695100	T	C	614.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1962.66;QD=33.84;SB=-961.65	GT:AD:DP:GL:GQ	1/1:0,58:57:-199.88,-17.17,-0.03:99
-chr1	5231434	rs2860250	T	G	608.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1940.74;QD=34.66;SB=-919.09	GT:AD:DP:GL:GQ	1/1:0,56:55:-197.68,-16.57,-0.02:99
-chr1	5231440	rs2353173	G	T	713.73	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2174.12;QD=33.45;SB=-1013.52	GT:AD:DP:GL:GQ	1/1:0,65:62:-221.02,-18.68,-0.02:99
-chr1	5231533	rs4290073	G	A	106.58	PASS	AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=59.20;MQ0=0;OQ=1041.27;QD=12.86;SB=-342.41	GT:AD:DP:GL:GQ	0/1:49,32:81:-131.81,-24.39,-179.39:99
-chr1	5231729	rs2945622	G	A	619.13	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=2286.02;QD=38.75;SB=-1132.51	GT:AD:DP:GL:GQ	1/1:0,59:57:-232.20,-17.17,-0.01:99
-chr1	5231775	rs4633300	T	C	80.14	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=2.27;MQ=58.86;MQ0=0;OQ=2147.74;QD=35.21;SB=-1067.79	GT:AD:DP:GL:GQ	1/1:0,61:61:-218.38,-18.38,-0.02:99
-chr1	5231808	rs10799186	T	C	608.79	PASS	AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.88;MQ0=0;OQ=2059.90;QD=33.22;SB=-1027.00	GT:AD:DP:GL:GQ	1/1:0,62:60:-209.61,-18.08,-0.04:99
-chr1	5231809	rs10799187	G	C	596.93	PASS	AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.91;MQ0=0;OQ=2598.74;QD=40.61;SB=-1318.71	GT:AD:DP:GL:GQ	1/1:0,64:61:-263.48,-18.38,-0.02:99
-chr1	5231833	rs530731	G	C	494.40	PASS	AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2447.16;QD=42.19;SB=-1018.28	GT:AD:DP:GL:GQ	1/1:0,58:58:-248.32,-17.48,-0.02:99
-chr1	5231988	rs614111	C	A	590.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1949.76;QD=35.45;SB=-809.87	GT:AD:DP:GL:GQ	1/1:0,55:54:-198.57,-16.26,-0.01:99
-chr1	5231995	rs614102	A	G	590.99	PASS	AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=2129.07;QD=36.09;SB=-828.32	GT:AD:DP:GL:GQ	1/1:0,59:59:-216.51,-17.77,-0.02:99
-chr1	5232537	rs558175	T	A	537.54	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2470.42;QD=36.33;SB=-1158.53	GT:AD:DP:GL:GQ	1/1:0,68:67:-250.65,-20.18,-0.02:99
-chr1	5232779	rs560794	T	A	637.12	PASS	AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2459.58;QD=36.17;SB=-1165.07	GT:AD:DP:GL:GQ	1/1:0,68:66:-249.56,-19.88,-0.02:99
-chr1	5232782	rs600322	G	A	160.84	PASS	AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.65;MQ0=0;OQ=2495.29;QD=38.39;SB=-1228.15	GT:AD:DP:GL:GQ	1/1:0,65:64:-253.13,-19.28,-0.02:99
-chr1	5232864	rs599884	A	G	212.34	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.42;MQ0=0;OQ=2139.99;QD=35.08;SB=-951.99	GT:AD:DP:GL:GQ	1/1:0,61:60:-217.60,-18.07,-0.02:99
-chr1	5233339	rs598031	G	A	300.26	PASS	AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.38;MQ0=0;OQ=2603.20;QD=38.85;SB=-1265.68	GT:AD:DP:GL:GQ	1/1:0,66:66:-263.92,-19.88,-0.02:99
-chr1	5233376	rs587228	C	T	292.53	PASS	AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=2392.78;QD=39.88;SB=-1196.59	GT:AD:DP:GL:GQ	1/1:0,60:60:-242.88,-18.07,-0.02:99
-chr1	5233377	rs476866	A	G	630.33	PASS	AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.01;MQ0=0;OQ=2129.35;QD=34.91;SB=-1082.46	GT:AD:DP:GL:GQ	1/1:0,61:60:-216.54,-18.07,-0.02:99
-chr1	5233422	rs476993	T	C	95.16	PASS	AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=58.92;MQ0=0;OQ=1891.61;QD=33.78;SB=-702.84	GT:AD:DP:GL:GQ	1/1:1,55:55:-192.78,-16.58,-0.03:99
-chr1	5233779	rs56260836	C	T	250.27	PASS	AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=59.69;MQ0=0;OQ=907.86;QD=15.13;SB=-369.08	GT:AD:DP:GL:GQ	0/1:31,29:57:-111.25,-17.18,-100.79:99
-chr1	5234072	rs504647	G	A	600.46	PASS	AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2853.54;QD=40.19;SB=-1415.37	GT:AD:DP:GL:GQ	1/1:0,71:71:-288.96,-21.39,-0.02:99
-chr1	5234128	rs7551166	T	C	37.81	PASS	AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=4.51;MQ=60.00;MQ0=0;OQ=837.05;QD=13.29;SB=-326.85	GT:AD:DP:GL:GQ	0/1:34,29:63:-105.96,-18.97,-138.54:99
-chr1	5234274	rs583170	C	A	510.70	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=1124.36;QD=17.57;SB=-381.75	GT:AD:DP:GL:GQ	0/1:28,36:64:-134.99,-19.28,-100.59:99
-chr1	5234483	rs12746195	G	T	448	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=60.00;MQ0=0;OQ=907.18;QD=14.87;SB=-443.17	GT:AD:DP:GL:GQ	0/1:30,31:60:-112.07,-18.07,-106.20:99
-chr1	5234497	rs12732868	T	G	365.79	PASS	AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.80;MQ=60.00;MQ0=0;OQ=834.65;QD=13.04;SB=-431.76	GT:AD:DP:GL:GQ	0/1:33,31:62:-105.43,-18.68,-118.96:99
-chr1	5234595	rs12747559	C	T	411.30	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=59.66;MQ0=0;OQ=1103.55;QD=16.23;SB=-461.98	GT:AD:DP:GL:GQ	0/1:32,36:64:-132.93,-19.29,-98.65:99
-chr1	5234628	rs12746515	G	A	395.10	PASS	AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.70;MQ0=0;OQ=1407.50;QD=18.04;SB=-722.08	GT:AD:DP:GL:GQ	0/1:37,41:75:-166.64,-22.60,-112.02:99
-chr1	5234751	rs12747870	C	T	314.20	PASS	AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=2.20;MQ=59.17;MQ0=0;OQ=991.08;QD=14.57;SB=-434.89	GT:AD:DP:GL:GQ	0/1:38,30:67:-122.57,-20.18,-136.08:99
-chr1	5234796	rs12729227	A	T	285.02	PASS	AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=58.68;MQ0=0;OQ=635.81;QD=9.49;SB=-240.21	GT:AD:DP:GL:GQ	0/1:44,23:66:-86.75,-19.88,-161.14:99
-chr1	5234855	rs12746867	G	A	137.48	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=3;HaplotypeScore=0.48;MQ=58.86;MQ0=0;OQ=803.94;QD=13.18;SB=-392.38	GT:AD:DP:GL:GQ	0/1:35,26:59:-101.45,-17.77,-122.51:99
-chr1	5234867	rs12729373	A	G	399.72	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=739.47;QD=12.12;SB=-312.22	GT:AD:DP:GL:GQ	0/1:35,26:61:-95.60,-18.37,-142.14:99
-chr1	5235030	rs55729623	C	G	87.40	PASS	AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=4.84;MQ=59.98;MQ0=0;OQ=961.43;QD=16.30;SB=-383.64	GT:AD:DP:GL:GQ	0/1:26,33:53:-115.42,-16.00,-99.45:99
-chr1	5235034	.	G	A	5.72	PASS	AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=5.25;MQ=59.98;MQ0=0;OQ=618.09;QD=9.97;SB=-190.00	GT:AD:DP:GL:GQ	0/1:34,27:51:-82.91,-17.82,-96.99:99
-chr1	5235136	rs17457156	T	C	138.33	PASS	AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=59.24;MQ0=0;OQ=556.94;QD=9.13;SB=-82.80	GT:AD:DP:GL:GQ	0/1:34,26:58:-79.46,-20.48,-139.05:99
diff --git a/src/test/resources/htsjdk/variant/ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf b/src/test/resources/htsjdk/variant/ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf
deleted file mode 100644
index b96f648..0000000
--- a/src/test/resources/htsjdk/variant/ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf
+++ /dev/null
@@ -1,249 +0,0 @@
-##fileformat=VCFv4.1
-##FILTER=<ID=TruthSensitivityTranche98.50to98.80,Description="Truth sensitivity tranche level at VSQ Lod: -0.1106 <= x < 0.6654">
-##FILTER=<ID=TruthSensitivityTranche98.80to98.90,Description="Truth sensitivity tranche level at VSQ Lod: -0.4426 <= x < -0.1106">
-##FILTER=<ID=TruthSensitivityTranche98.90to99.00,Description="Truth sensitivity tranche level at VSQ Lod: -0.8793 <= x < -0.4426">
-##FILTER=<ID=TruthSensitivityTranche99.00to99.30,Description="Truth sensitivity tranche level at VSQ Lod: -2.6664 <= x < -0.8793">
-##FILTER=<ID=TruthSensitivityTranche99.30to99.50,Description="Truth sensitivity tranche level at VSQ Lod: -5.2612 <= x < -2.6664">
-##FILTER=<ID=TruthSensitivityTranche99.50to99.90,Description="Truth sensitivity tranche level at VSQ Lod: -65.3589 <= x < -5.2612">
-##FILTER=<ID=TruthSensitivityTranche99.90to100.00+,Description="Truth sensitivity tranche level at VQS Lod < -6678.5611">
-##FILTER=<ID=TruthSensitivityTranche99.90to100.00,Description="Truth sensitivity tranche level at VSQ Lod: -6678.5611 <= x < -65.3589">
-##FILTER=<ID=Indel_QD,Description="x">
-##FILTER=<ID=Indel_FS,Description="x">
-##FILTER=<ID=Indel_ReadPosRankSum,Description="x">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth (reads with MQ=255 or with bad mates are filtered)">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=PL,Number=G,Type=Integer,Description="Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification">
-##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=BaseQRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt Vs. Ref base qualities">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth; some reads may have been filtered">
-##INFO=<ID=DS,Number=0,Type=Flag,Description="Were any of the samples downsampled?">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=FS,Number=1,Type=Float,Description="Phred-scaled p-value using Fisher's exact test to detect strand bias">
-##INFO=<ID=HM3,Number=0,Type=Flag,Description="HM3 Membership">
-##INFO=<ID=GS,Number=0,Type=Flag,Description="In gold-standard indel set">
-##INFO=<ID=HRun,Number=1,Type=Integer,Description="Largest Contiguous Homopolymer Run of Variant Allele In Either Direction">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with at most two segregating haplotypes">
-##INFO=<ID=InbreedingCoeff,Number=1,Type=Float,Description="Inbreeding coefficient as estimated from the genotype likelihoods per-sample when compared against the Hardy-Weinberg expectation">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=MQRankSum,Number=1,Type=Float,Description="Z-score From Wilcoxon rank sum test of Alt vs. Ref read mapping qualities">
-##INFO=<ID=NDA,Number=1,Type=Integer,Description="Number of alternate alleles discovered (but not necessarily genotyped) at this site">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=ReadPosRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt vs. Ref read position bias">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##INFO=<ID=set,Number=1,Type=String,Description="Source VCF for the merged record in CombineVariants">
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=10,length=135534747,assembly=b37>
-##contig=<ID=11,length=135006516,assembly=b37>
-##contig=<ID=12,length=133851895,assembly=b37>
-##contig=<ID=13,length=115169878,assembly=b37>
-##contig=<ID=14,length=107349540,assembly=b37>
-##contig=<ID=15,length=102531392,assembly=b37>
-##contig=<ID=16,length=90354753,assembly=b37>
-##contig=<ID=17,length=81195210,assembly=b37>
-##contig=<ID=18,length=78077248,assembly=b37>
-##contig=<ID=19,length=59128983,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=20,length=63025520,assembly=b37>
-##contig=<ID=21,length=48129895,assembly=b37>
-##contig=<ID=22,length=51304566,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-##contig=<ID=4,length=191154276,assembly=b37>
-##contig=<ID=5,length=180915260,assembly=b37>
-##contig=<ID=6,length=171115067,assembly=b37>
-##contig=<ID=7,length=159138663,assembly=b37>
-##contig=<ID=8,length=146364022,assembly=b37>
-##contig=<ID=9,length=141213431,assembly=b37>
-##contig=<ID=GL000191.1,length=106433,assembly=b37>
-##contig=<ID=GL000192.1,length=547496,assembly=b37>
-##contig=<ID=GL000193.1,length=189789,assembly=b37>
-##contig=<ID=GL000194.1,length=191469,assembly=b37>
-##contig=<ID=GL000195.1,length=182896,assembly=b37>
-##contig=<ID=GL000196.1,length=38914,assembly=b37>
-##contig=<ID=GL000197.1,length=37175,assembly=b37>
-##contig=<ID=GL000198.1,length=90085,assembly=b37>
-##contig=<ID=GL000199.1,length=169874,assembly=b37>
-##contig=<ID=GL000200.1,length=187035,assembly=b37>
-##contig=<ID=GL000201.1,length=36148,assembly=b37>
-##contig=<ID=GL000202.1,length=40103,assembly=b37>
-##contig=<ID=GL000203.1,length=37498,assembly=b37>
-##contig=<ID=GL000204.1,length=81310,assembly=b37>
-##contig=<ID=GL000205.1,length=174588,assembly=b37>
-##contig=<ID=GL000206.1,length=41001,assembly=b37>
-##contig=<ID=GL000207.1,length=4262,assembly=b37>
-##contig=<ID=GL000208.1,length=92689,assembly=b37>
-##contig=<ID=GL000209.1,length=159169,assembly=b37>
-##contig=<ID=GL000210.1,length=27682,assembly=b37>
-##contig=<ID=GL000211.1,length=166566,assembly=b37>
-##contig=<ID=GL000212.1,length=186858,assembly=b37>
-##contig=<ID=GL000213.1,length=164239,assembly=b37>
-##contig=<ID=GL000214.1,length=137718,assembly=b37>
-##contig=<ID=GL000215.1,length=172545,assembly=b37>
-##contig=<ID=GL000216.1,length=172294,assembly=b37>
-##contig=<ID=GL000217.1,length=172149,assembly=b37>
-##contig=<ID=GL000218.1,length=161147,assembly=b37>
-##contig=<ID=GL000219.1,length=179198,assembly=b37>
-##contig=<ID=GL000220.1,length=161802,assembly=b37>
-##contig=<ID=GL000221.1,length=155397,assembly=b37>
-##contig=<ID=GL000222.1,length=186861,assembly=b37>
-##contig=<ID=GL000223.1,length=180455,assembly=b37>
-##contig=<ID=GL000224.1,length=179693,assembly=b37>
-##contig=<ID=GL000225.1,length=211173,assembly=b37>
-##contig=<ID=GL000226.1,length=15008,assembly=b37>
-##contig=<ID=GL000227.1,length=128374,assembly=b37>
-##contig=<ID=GL000228.1,length=129120,assembly=b37>
-##contig=<ID=GL000229.1,length=19913,assembly=b37>
-##contig=<ID=GL000230.1,length=43691,assembly=b37>
-##contig=<ID=GL000231.1,length=27386,assembly=b37>
-##contig=<ID=GL000232.1,length=40652,assembly=b37>
-##contig=<ID=GL000233.1,length=45941,assembly=b37>
-##contig=<ID=GL000234.1,length=40531,assembly=b37>
-##contig=<ID=GL000235.1,length=34474,assembly=b37>
-##contig=<ID=GL000236.1,length=41934,assembly=b37>
-##contig=<ID=GL000237.1,length=45867,assembly=b37>
-##contig=<ID=GL000238.1,length=39939,assembly=b37>
-##contig=<ID=GL000239.1,length=33824,assembly=b37>
-##contig=<ID=GL000240.1,length=41933,assembly=b37>
-##contig=<ID=GL000241.1,length=42152,assembly=b37>
-##contig=<ID=GL000242.1,length=43523,assembly=b37>
-##contig=<ID=GL000243.1,length=43341,assembly=b37>
-##contig=<ID=GL000244.1,length=39929,assembly=b37>
-##contig=<ID=GL000245.1,length=36651,assembly=b37>
-##contig=<ID=GL000246.1,length=38154,assembly=b37>
-##contig=<ID=GL000247.1,length=36422,assembly=b37>
-##contig=<ID=GL000248.1,length=39786,assembly=b37>
-##contig=<ID=GL000249.1,length=38502,assembly=b37>
-##contig=<ID=MT,length=16569,assembly=b37>
-##contig=<ID=X,length=155270560,assembly=b37>
-##contig=<ID=Y,length=59373566,assembly=b37>
-##reference=file:///humgen/1kg/reference/human_g1k_v37.fasta
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	HG00096	HG00100	HG00101	HG00102	HG00103	HG00107	HG00108	HG00109	HG00110	HG00111	HG00113	HG00114	HG00116	HG00117	HG00119	HG00120	HG00121	HG00123	HG00124	HG00125	HG00127	HG00131	HG00133	HG00136	HG00137	HG00138	HG00139	HG00140	HG00145	HG00146	HG00154	HG00155	HG00157	HG00158	HG00159	HG00160	HG00171	HG00174	HG00176	HG00178	HG00181	HG00182	HG00183	HG00185	HG00186	HG00187	HG00188	HG00189	HG00190	HG00232	HG00233	HG00236	HG00237	HG00238	HG00239	HG0024 [...]
-1	30548	.	T	G	134.71	TruthSensitivityTranche99.50to99.90	AC=14;AF=0.583;AN=24;BaseQRankSum=-2.141;DP=128;DS;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.1517;InbreedingCoeff=0.3252;MQ=3.02;MQ0=1125;MQRankSum=0.529;NDA=2;QD=2.07;ReadPosRankSum=0.244;SB=33.48;VQSLOD=-7.1701;culprit=MQ;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	. [...]
-1	69270	.	A	G	12343.52	TruthSensitivityTranche99.30to99.50	AC=311;AF=0.7199;AN=432;BaseQRankSum=-14.987;DP=9872;DS;Dels=0.00;FS=9.231;HRun=0;HaplotypeScore=0.0867;InbreedingCoeff=0.2338;MQ=6.11;MQ0=13219;MQRankSum=15.096;NDA=1;QD=1.38;ReadPosRankSum=3.099;SB=-194.48;VQSLOD=-5.1809;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	1/1:0,1:6:17.92:136,18,0	./.	./.	./.	./.	./.	./.	1/1:43,17:60:2.99:24,3,0	./.	./.	./.	./.	./.	./.	1/1:46,14:60:3:29,3,0	./ [...]
-1	69428	rs140739101	T	G	1587.10	TruthSensitivityTranche99.30to99.50	AC=30;AF=0.0333;AN=902;BaseQRankSum=3.267;DB;DP=50533;DS;Dels=0.00;FS=98.109;HRun=0;HaplotypeScore=0.1382;InbreedingCoeff=0.1235;MQ=17.74;MQ0=2178;MQRankSum=0.762;NDA=2;QD=1.07;ReadPosRankSum=1.621;SB=-348.91;VQSLOD=-4.2588;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	./.	0/0:1,0:92:99:0,276,2454	./.	0/0:1,0:100:99:0,300,2568	0/0:1,0:127:99:0,379,2880	./.	./.	./.	./.	0/0:1,0:90:99:0,269,2131	./ [...]
-1	69453	rs142004627	G	A	917.27	TruthSensitivityTranche99.50to99.90	AC=11;AF=0.0127;AN=868;BaseQRankSum=4.298;DB;DP=51456;DS;Dels=0.00;FS=8.058;HRun=2;HaplotypeScore=0.2298;InbreedingCoeff=0.2958;MQ=21.21;MQ0=143;MQRankSum=5.921;NDA=2;QD=3.03;ReadPosRankSum=2.490;SB=-5.66;VQSLOD=-5.8496;culprit=MQ;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	./.	0/0:1,0:117:99:0,351,3121	./.	0/0:1,0:110:99:0,330,2825	0/0:1,0:127:99:0,379,2880	./.	./.	./.	./.	0/0:1,0:111:99:0,332,2629	./.	. [...]
-1	69486	.	C	T	411.09	PASS	AC=1;AF=0.0011;AN=870;BaseQRankSum=3.271;DP=47045;DS;Dels=0.00;FS=18.777;HRun=0;HaplotypeScore=0.1619;InbreedingCoeff=-0.0068;MQ=18.73;MQ0=630;MQRankSum=3.678;NDA=2;QD=6.85;ReadPosRankSum=-0.995;SB=-160.62;VQSLOD=4.1085;culprit=MQ;set=variant	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	./.	0/0:1,0:72:99:0,216,1921	./.	0/0:1,0:79:99:0,237,2029	0/0:1,0:125:99:0,373,2834	./.	./.	./.	./.	0/0:1,0:69:99:0,206,1634	./.	./.	./.	./.	./.	./.	./.	0/0:1,0:51:99:0,153,1208	./ [...]
-1	69496	rs150690004	G	A	770.17	TruthSensitivityTranche99.30to99.50	AC=4;AF=0.0046;AN=866;BaseQRankSum=7.303;DB;DP=45079;DS;Dels=0.00;FS=43.681;HRun=0;HaplotypeScore=0.3031;InbreedingCoeff=0.0441;MQ=18.29;MQ0=527;MQRankSum=6.120;NDA=2;QD=3.63;ReadPosRankSum=-1.444;SB=-136.96;VQSLOD=-3.7330;culprit=MQ;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	./.	0/0:1,0:75:99:0,225,2001	./.	0/0:1,0:68:99:0,204,1746	0/0:1,0:122:99:0,364,2766	./.	./.	./.	./.	0/0:1,0:72:99:0,215,1705	./.	. [...]
-1	69511	rs75062661	A	G	625265.62	TruthSensitivityTranche99.30to99.50	AC=856;AF=0.8753;AN=978;BaseQRankSum=13.271;DB;DP=32369;DS;Dels=0.00;FS=45.494;HRun=0;HaplotypeScore=1.1421;InbreedingCoeff=0.5380;MQ=26.49;MQ0=1627;MQRankSum=-18.719;NDA=1;QD=19.82;ReadPosRankSum=-20.606;SB=-54909.34;VQSLOD=-3.2503;culprit=MQ;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	1/1:0,40:40:65.91:557,66,0	./.	./.	./.	./.	./.	./.	1/1:0,1:43:99:1147,129,0	./.	1/1:0,1:45:99:1156,135,0	1/1:0,1:106:99:2404,317,0	./.	./.	1/1 [...]
-1	69534	rs190717287	T	C	1060.12	PASS	AC=1;AF=0.0012;AN=854;BaseQRankSum=-0.841;DB;DP=43078;DS;Dels=0.00;FS=13.161;HRun=0;HaplotypeScore=0.3320;InbreedingCoeff=0.0940;MQ=27.32;MQ0=107;MQRankSum=3.045;NDA=1;QD=9.14;ReadPosRankSum=-2.118;SB=-601.36;VQSLOD=1.3414;culprit=MQ;set=variant	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	0/0:1,0:1:3:0,3,25	0/0:1,0:87:99:0,261,2321	./.	0/0:1,0:84:99:0,252,2157	0/0:1,0:127:99:0,379,2880	./.	./.	0/0:1,0:92:99:0,275,2086	./.	0/0:1,0:69:99:0,206,1634	./.	. [...]
-1	69541	.	A	G	578.88	PASS	AC=1;AF=0.0012;AN=842;BaseQRankSum=1.875;DP=44707;DS;Dels=0.00;FS=9.702;HRun=1;HaplotypeScore=0.5109;InbreedingCoeff=-0.0048;MQ=28.52;MQ0=97;MQRankSum=4.954;NDA=1;QD=9.65;ReadPosRankSum=-1.290;SB=-236.37;VQSLOD=1.9979;culprit=MQ;set=variant	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	0/0:1,0:1:3:0,3,25	0/0:1,0:104:99:0,312,2774	./.	0/0:1,0:93:99:0,279,2388	0/0:1,0:127:99:0,379,2880	./.	./.	0/0:1,0:100:99:0,299,2267	./.	0/0:1,0:74:99:0,221,1752	./.	./.	./.	./.	0/0 [...]
-1	69552	rs55874132	G	C	263.21	TruthSensitivityTranche99.50to99.90	AC=6;AF=0.0071;AN=850;BaseQRankSum=8.467;DB;DP=46741;DS;Dels=0.00;FS=10.412;HRun=1;HaplotypeScore=0.4375;InbreedingCoeff=0.2845;MQ=29.45;MQ0=385;MQRankSum=-5.514;NDA=3;QD=0.76;ReadPosRankSum=2.727;SB=-97.77;VQSLOD=-6.2296;culprit=MQ;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	./.	0/0:1,0:126:99:0,378,3361	./.	0/0:1,0:108:99:0,324,2774	0/0:1,0:127:99:0,379,2880	./.	./.	0/0:1,0:121:99:0,361,2744	./.	0/0:1,0: [...]
-1	69590	rs141776804	T	A	1446.08	PASS	AC=2;AF=0.0025;AN=812;BaseQRankSum=7.910;DB;DP=46586;DS;Dels=0.00;FS=21.176;HRun=0;HaplotypeScore=0.1456;InbreedingCoeff=-0.0051;MQ=23.73;MQ0=398;MQRankSum=8.485;NDA=2;QD=12.05;ReadPosRankSum=-0.293;SB=-322.53;VQSLOD=4.4644;culprit=MQ;set=variant	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	./.	0/0:1,0:127:99:0,381,3388	./.	0/0:1,0:113:99:0,339,2902	0/0:1,0:127:99:0,379,2880	./.	./.	0/0:1,0:115:99:0,343,2608	./.	0/0:1,0:102:99:0,305,2416	./.	./.	./.	./. [...]
-1	69610	.	C	T	5334.77	TruthSensitivityTranche98.50to98.80	AC=8;AF=0.0100;AN=798;BaseQRankSum=7.126;DP=42498;DS;Dels=0.00;FS=113.646;HRun=2;HaplotypeScore=0.2518;InbreedingCoeff=0.1087;MQ=18.02;MQ0=795;MQRankSum=9.147;NDA=2;QD=10.95;ReadPosRankSum=0.353;SB=-1272.01;VQSLOD=0.5990;culprit=MQ;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	./.	0/0:1,0:126:99:0,378,3361	./.	0/0:1,0:71:99:0,213,1823	0/0:1,0:127:99:0,379,2880	./.	./.	0/0:1,0:60:99:0,179,1360	./.	0/0:1,0:79:99:0,236 [...]
-1	69635	.	G	C	436.15	TruthSensitivityTranche99.00to99.30	AC=2;AF=0.0025;AN=786;BaseQRankSum=4.897;DP=29728;DS;Dels=0.00;FS=33.653;HRun=0;HaplotypeScore=0.1175;InbreedingCoeff=-0.0021;MQ=14.85;MQ0=1329;MQRankSum=4.000;NDA=2;QD=3.63;ReadPosRankSum=-1.651;SB=-67.21;VQSLOD=-1.5278;culprit=MQ;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	./.	0/0:1,0:78:99:0,234,2081	./.	0/0:1,0:46:99:0,138,1181	0/0:1,0:84:99:0,251,1905	./.	./.	0/0:1,0:27:80.65:0,81,612	./.	0/0:1,0:44:99:0,132,1 [...]
-1	69761	.	A	T	1569.63	TruthSensitivityTranche99.50to99.90	AC=27;AF=0.0456;AN=592;BaseQRankSum=7.371;DP=12118;DS;Dels=0.00;FS=3.078;HRun=1;HaplotypeScore=0.1168;InbreedingCoeff=0.2584;MQ=7.44;MQ0=9258;MQRankSum=1.639;NDA=1;QD=1.32;ReadPosRankSum=-0.593;SB=-284.93;VQSLOD=-6.9729;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	0/0:60,0:60:3.01:0,3,33	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	0/0:59,0:59:3.01:0,3,35	./.	./.	./.	./.	./.	./.	./.	./ [...]
-1	69768	.	G	A	35.11	TruthSensitivityTranche99.50to99.90	AC=1;AF=0.0018;AN=542;BaseQRankSum=-0.998;DP=10681;DS;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.1003;InbreedingCoeff=-0.0401;MQ=7.20;MQ0=8425;MQRankSum=1.077;NDA=2;QD=0.59;ReadPosRankSum=0.705;SB=6.12;VQSLOD=-5.9391;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	0/0:56,0:58:3.01:0,3,33	./.	0/0:60,0:60:5.98:0,6,47	./.	./.	./.	./.	./.	./.	./.	0/0:57,0:57:2.99:0,3,24	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./. [...]
-1	69897	.	T	C	7903.18	TruthSensitivityTranche99.50to99.90	AC=286;AF=0.7814;AN=366;BaseQRankSum=-9.712;DP=10240;DS;Dels=0.00;FS=25.753;HRun=1;HaplotypeScore=0.0844;InbreedingCoeff=0.2102;MQ=4.12;MQ0=18120;MQRankSum=0.310;NDA=2;QD=0.92;ReadPosRankSum=-1.611;SB=-1453.42;VQSLOD=-6.8807;culprit=MQ;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	1/1:47,13:60:6.01:61,6,0	./.	./.	./.	./.	1/1:47,11:60:6.02:67,6,0	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	0/1:50,10:60:17.70:18,0 [...]
-1	69968	.	A	G	791.92	TruthSensitivityTranche99.30to99.50	AC=1;AF=0.017;AN=60;BaseQRankSum=-11.568;DP=1640;DS;Dels=0.00;FS=34.482;HRun=1;HaplotypeScore=1.1879;InbreedingCoeff=0.0932;MQ=5.09;MQ0=5066;MQRankSum=6.823;NDA=1;QD=2.10;ReadPosRankSum=-2.491;SB=9.08;VQSLOD=-5.0926;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./.	./. [...]
-1	861275	.	C	T	712.37	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=-6.156;DP=66811;DS;Dels=0.00;FS=1.596;HRun=0;HaplotypeScore=0.0247;InbreedingCoeff=-0.0020;MQ=99.25;MQ0=0;MQRankSum=-0.645;NDA=2;QD=11.87;ReadPosRankSum=0.200;SB=-29.28;VQSLOD=9.3500;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:16:48.16:0,48,617	0/0:1,0:47:99:0,141,1738	0/0:1,0:24:72.24:0,72,976	0/0:1,0:23:69.23:0,69,904	0/0:1,0:26:78.25:0,78,1022	0/0:1,0:15:45.15:0,45,579	0/0:1,0:54:99:0,163,2123	0/0:1,0:39:99:0,117,1504	0 [...]
-1	861292	rs191719684	C	G	2773.34	PASS	AC=3;AF=0.00127;AN=2364;BaseQRankSum=9.193;DB;DP=77017;DS;Dels=0.00;FS=29.431;HRun=0;HaplotypeScore=0.0441;InbreedingCoeff=-0.0075;MQ=99.59;MQ0=0;MQRankSum=-2.334;NDA=1;QD=17.78;ReadPosRankSum=-7.928;SB=-762.60;VQSLOD=7.8330;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:15:45.15:0,45,626	0/0:1,0:52:99:0,156,1965	0/0:1,0:30:90.29:0,90,1179	0/0:1,0:22:66.21:0,66,832	0/0:1,0:23:69.23:0,69,948	0/0:1,0:17:51.17:0,51,668	0/0:1,0:61:99:0,184,2353	0/0:1,0:47 [...]
-1	861315	.	G	A	804.13	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=-3.203;DP=93850;DS;Dels=0.00;FS=2.143;HRun=2;HaplotypeScore=0.0258;InbreedingCoeff=0.0526;MQ=106.02;MQ0=0;MQRankSum=-0.749;NDA=2;QD=11.83;ReadPosRankSum=-5.734;SB=-124.66;VQSLOD=8.0060;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:23:69.23:0,69,948	0/0:1,0:71:99:0,214,2739	0/0:1,0:34:99:0,102,1402	0/0:1,0:27:81.27:0,81,1080	0/0:1,0:32:96.32:0,96,1319	0/0:1,0:22:66.22:0,66,907	0/0:1,0:69:99:0,208,2713	0/0:1,0:79:99:0,238,3160 [...]
-1	865488	.	A	G	73.43	PASS	AC=1;AF=0.00044;AN=2280;BaseQRankSum=-4.715;DP=7112;Dels=0.00;FS=10.595;HRun=0;HaplotypeScore=0.1452;InbreedingCoeff=-0.0539;MQ=56.39;MQ0=9;MQRankSum=2.252;NDA=3;QD=4.08;ReadPosRankSum=2.565;SB=167.99;VQSLOD=1.5041;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:3:9.03:0,9,113	0/0:1,0:5:15.05:0,15,176	0/0:1,0:1:3.01:0,3,32	0/0:1,0:1:3.01:0,3,43	./.	0/0:1,0:6:18.06:0,18,236	0/0:1,0:11:33.09:0,33,368	0/0:1,0:5:15.05:0,15,176	0/0:1,0:10:30.09:0,30,344	0/0:15,0:16:45. [...]
-1	865545	.	G	A	1164.45	PASS	AC=8;AF=0.00345;AN=2320;BaseQRankSum=4.406;DP=10672;Dels=0.01;FS=1.961;HRun=0;HaplotypeScore=0.3451;InbreedingCoeff=0.0083;MQ=60.80;MQ0=0;MQRankSum=3.214;NDA=3;QD=10.21;ReadPosRankSum=1.571;SB=-334.48;VQSLOD=5.0597;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:1:3.01:0,3,44	0/0:1,0:7:21.06:0,21,234	0/0:1,0:2:6.02:0,6,65	./.	0/0:1,0:2:6.02:0,6,74	0/0:1,0:5:15.05:0,15,181	0/0:1,0:9:27.07:0,27,284	0/0:10,0:10:30.07:0,30,316	0/0:20,0:20:54.10:0,54,548	0/0:1,0:22:6 [...]
-1	865555	.	CAA	C	306.78	PASS	AC=1;AF=0.00044;AN=2284;BaseQRankSum=2.577;DP=11180;FS=1.510;HRun=2;HaplotypeScore=2.5729;InbreedingCoeff=-0.0068;MQ=59.09;MQ0=0;MQRankSum=-0.815;NDA=1;QD=12.78;ReadPosRankSum=2.203;SB=-142.21;set=variant2	GT:AD:DP:GQ:PL	0/0:1,0:1:3.01:0,3,35	0/0:1,0:1:30.10:0,30,554	0/0:1,0:1:12.04:0,12,222	./.	0/0:1,0:1:6.02:0,6,111	0/0:1,0:1:9.03:0,9,105	0/0:1,0:1:33.11:0,33,610	0/0:13,0:13:39.13:0,39,714	0/0:16,0:17:48.09:0,48,477	0/0:1,0:1:72.21:0,72,841	0/0:1,0:1:36.12: [...]
-1	865584	rs148711625	G	A	1556.12	PASS	AC=23;AF=0.00981;AN=2344;BaseQRankSum=6.903;DB;DP=13266;Dels=0.00;FS=7.807;HRun=0;HaplotypeScore=0.2911;InbreedingCoeff=0.0420;MQ=85.22;MQ0=0;MQRankSum=-2.022;NDA=2;QD=7.20;ReadPosRankSum=0.021;SB=-697.54;VQSLOD=6.6472;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:4:12.04:0,12,151	0/0:1,0:11:33.10:0,33,378	0/0:1,0:4:12.03:0,12,137	0/0:1,0:1:3.01:0,3,34	0/0:1,0:3:9.01:0,9,86	0/0:1,0:2:6.02:0,6,81	0/0:15,0:15:45.09:0,45,465	0/0:1,0:20:60.11:0,60,592	0/ [...]
-1	865590	.	TGAA	T	420.06	PASS	AC=8;AF=0.00371;AN=2154;BaseQRankSum=4.148;DP=14777;FS=4.898;HRun=0;HaplotypeScore=1.3770;InbreedingCoeff=0.1502;MQ=59.07;MQ0=0;MQRankSum=-1.698;NDA=1;QD=4.88;ReadPosRankSum=1.330;SB=-207.49;set=variant2	GT:AD:DP:GQ:PL	0/0:1,0:1:12.04:0,12,234	0/0:13,0:14:38.96:0,39,714	0/0:1,0:1:18.06:0,18,351	0/0:1,0:1:6.02:0,6,117	0/0:1,0:1:6.02:0,6,117	0/0:1,0:1:12.04:0,12,234	0/0:1,0:1:48.16:0,48,935	0/0:1,0:1:66.23:0,66,1286	0/0:1,0:1:51.17:0,51,994	0/0:1,0:1:93.32:0,9 [...]
-1	865628	rs41285790	G	A	712.88	PASS	AC=5;AF=0.00212;AN=2364;BaseQRankSum=-6.081;DB;DP=19203;Dels=0.00;FS=8.074;HRun=0;HaplotypeScore=0.1985;InbreedingCoeff=-0.0157;MQ=80.97;MQ0=0;MQRankSum=0.054;NDA=3;QD=9.77;ReadPosRankSum=1.468;SB=-453.03;VQSLOD=7.7994;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:5:15.05:0,15,211	0/0:1,0:12:36.12:0,36,472	0/0:1,0:10:30.10:0,30,418	0/0:1,0:4:12.04:0,12,167	0/0:1,0:5:15.05:0,15,211	0/0:1,0:6:18.06:0,18,240	0/0:1,0:19:57.19:0,57,747	0/0:1,0: [...]
-1	865662	rs140751899	G	A	266.89	PASS	AC=1;AF=0.00042;AN=2360;BaseQRankSum=1.888;DB;DP=18955;Dels=0.00;FS=0.901;HRun=0;HaplotypeScore=0.3354;InbreedingCoeff=-0.0112;MQ=87.09;MQ0=0;MQRankSum=-0.394;NDA=2;QD=15.70;ReadPosRankSum=1.293;SB=-178.31;VQSLOD=5.8247;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:2:6.02:0,6,79	0/0:10,0:10:27.08:0,27,329	0/0:1,0:9:27.08:0,27,325	0/0:1,0:4:12.04:0,12,167	0/0:1,0:5:15.05:0,15,185	0/0:1,0:10:30.10:0,30,393	0/0:1,0:17:51.13:0,51,552	0/0:21,0:21:54.13:0,5 [...]
-1	865694	rs9988179	C	T	37822.02	PASS	AC=163;AF=0.06907;AN=2360;BaseQRankSum=-24.328;DB;DP=17686;Dels=0.00;FS=7.432;HRun=0;HaplotypeScore=0.3198;InbreedingCoeff=0.1408;MQ=96.52;MQ0=0;MQRankSum=-19.190;NDA=2;QD=14.08;ReadPosRankSum=12.504;SB=-16300.11;VQSLOD=4.8864;culprit=MQRankSum;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:1:3.01:0,3,43	0/0:10,0:10:30.09:0,30,383	0/0:1,0:9:27.09:0,27,354	0/0:1,0:2:6.02:0,6,82	0/0:1,0:5:15.05:0,15,200	0/0:1,0:10:30.10:0,30,400	0/0:15,0:15:45.14:0,45,581	0/0:21,0: [...]
-1	865700	rs116730894	C	T	481.79	PASS	AC=6;AF=0.00254;AN=2362;BaseQRankSum=4.072;DB;DP=18291;Dels=0.00;FS=9.754;HRun=0;HaplotypeScore=0.3041;InbreedingCoeff=-0.0084;MQ=98.45;MQ0=0;MQRankSum=-1.215;NDA=2;QD=5.35;ReadPosRankSum=4.084;SB=-203.52;VQSLOD=5.3964;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:1:3.01:0,3,42	0/0:1,0:11:33.09:0,33,357	0/0:1,0:9:27.09:0,27,340	0/0:1,0:2:6.01:0,6,63	0/0:1,0:6:18.05:0,18,195	0/0:1,0:9:27.08:0,27,325	0/0:1,0:16:48.10:0,48,489	0/0:19,1:20:20.99:0,21,517	 [...]
-1	865703	.	A	G	163.63	PASS	AC=1;AF=0.00042;AN=2362;BaseQRankSum=1.433;DP=18039;Dels=0.00;FS=7.294;HRun=0;HaplotypeScore=0.2834;InbreedingCoeff=-0.0062;MQ=101.88;MQ0=0;MQRankSum=-2.745;NDA=2;QD=7.44;ReadPosRankSum=1.383;SB=-11.29;VQSLOD=6.5947;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:1:3.01:0,3,44	0/0:1,0:10:30.09:0,30,361	0/0:1,0:7:21.07:0,21,270	0/0:1,0:3:9.03:0,9,118	0/0:1,0:5:15.05:0,15,189	0/0:1,0:8:24.08:0,24,315	0/0:1,0:16:48.14:0,48,550	0/0:20,0:20:57.16:0,57,659	0/0:1,0:21:6 [...]
-1	865705	rs146331776	C	T	702.79	PASS	AC=3;AF=0.00127;AN=2362;BaseQRankSum=-1.590;DB;DP=18114;Dels=0.00;FS=1.450;HRun=1;HaplotypeScore=0.1918;InbreedingCoeff=-0.0069;MQ=114.11;MQ0=0;MQRankSum=-2.223;NDA=1;QD=12.12;ReadPosRankSum=2.604;SB=-274.99;VQSLOD=10.4126;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:1:3.01:0,3,44	0/0:1,0:9:27.09:0,27,354	0/0:1,0:8:24.07:0,24,289	0/0:1,0:3:9.03:0,9,130	0/0:1,0:5:15.05:0,15,193	0/0:1,0:7:21.07:0,21,280	0/0:1,0:16:48.16:0,48,640	0/0:20,0:20:60.20:0,60, [...]
-1	865734	.	G	A	169.67	PASS	AC=3;AF=0.00127;AN=2358;BaseQRankSum=0.374;DP=14856;Dels=0.00;FS=7.082;HRun=0;HaplotypeScore=0.4461;InbreedingCoeff=-0.0084;MQ=111.38;MQ0=0;MQRankSum=-3.095;NDA=2;QD=4.35;ReadPosRankSum=0.739;SB=-81.83;VQSLOD=2.8904;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:3:9.03:0,9,116	0/0:1,0:6:18.06:0,18,222	0/0:1,0:6:18.06:0,18,236	0/0:1,0:2:6.02:0,6,76	0/0:4,0:4:12.04:0,12,161	0/0:1,0:8:24.08:0,24,315	0/0:1,0:12:36.11:0,36,423	0/0:1,0:17:51.15:0,51,599	0/0:1,0:14:42. [...]
-1	865738	rs139570490	A	G	759.55	PASS	AC=7;AF=0.00297;AN=2358;BaseQRankSum=-6.135;DB;DP=14584;Dels=0.00;FS=1.427;HRun=2;HaplotypeScore=0.5151;InbreedingCoeff=-0.0114;MQ=107.81;MQ0=0;MQRankSum=-1.690;NDA=2;QD=5.17;ReadPosRankSum=1.621;SB=-116.80;VQSLOD=4.7433;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:2:6.02:0,6,86	0/0:1,0:5:15.05:0,15,197	0/0:1,0:8:24.08:0,24,309	0/0:1,0:2:6.02:0,6,80	0/0:4,0:4:12.03:0,12,159	0/0:1,0:8:24.08:0,24,330	0/0:1,0:13:39.12:0,39,470	0/0:1,0:16:48.15:0,48,605	 [...]
-1	866371	.	G	A	754.09	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=-4.668;DP=56995;DS;Dels=0.00;FS=1.962;HRun=0;HaplotypeScore=0.0603;InbreedingCoeff=0.0004;MQ=107.06;MQ0=0;MQRankSum=0.276;NDA=1;QD=12.57;ReadPosRankSum=1.709;SB=-179.27;VQSLOD=9.8408;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:16:48.16:0,48,640	0/0:1,0:58:99:0,175,2145	0/0:1,0:34:99:0,102,1337	0/0:1,0:22:66.22:0,66,894	0/0:1,0:22:66.22:0,66,907	0/0:1,0:19:57.18:0,57,733	0/0:1,0:35:99:0,105,1350	0/0:1,0:35:99:0,105,1350	0/0 [...]
-1	866422	rs139210662	C	T	4684.05	PASS	AC=9;AF=0.00381;AN=2364;BaseQRankSum=-2.726;DB;DP=71761;DS;Dels=0.00;FS=14.683;HRun=1;HaplotypeScore=0.0292;InbreedingCoeff=-0.0036;MQ=110.95;MQ0=0;MQRankSum=0.583;NDA=1;QD=11.05;ReadPosRankSum=-12.658;SB=-1793.78;VQSLOD=9.8690;culprit=HaplotypeScore;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:23:69.23:0,69,960	0/0:1,0:72:99:0,217,2662	0/0:1,0:41:99:0,123,1666	0/0:1,0:30:90.29:0,90,1179	0/0:1,0:29:87.29:0,87,1211	0/0:1,0:32:96.32:0,96,1301	0/0:1,0:42:99:0,126 [...]
-1	866511	.	C	T	17440.60	TruthSensitivityTranche99.50to99.90	AC=345;AF=0.14594;AN=2364;BaseQRankSum=-48.478;DP=36139;DS;Dels=0.00;FS=176.546;HRun=1;HaplotypeScore=8.8600;InbreedingCoeff=-0.1516;MQ=61.44;MQ0=0;MQRankSum=45.670;NDA=1;QD=1.68;ReadPosRankSum=-3.663;SB=-4951.45;VQSLOD=-8.9666;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	0/1:8,1:9:2.54:3,0,297	0/0:13,1:14:5.68:0,6,398	0/1:16,3:19:24.70:25,0,488	0/0:14,0:14:42.12:0,42,537	0/1:8,2:10:12.74:13,0,265	0/1:7,1:8:12.90:13,0,258	0/1:31, [...]
-1	866517	rs181051588	C	G	1192.57	TruthSensitivityTranche99.50to99.90	AC=2;AF=0.00085;AN=2364;BaseQRankSum=0.101;DB;DP=34481;DS;Dels=0.00;FS=14.537;HRun=0;HaplotypeScore=7.9209;InbreedingCoeff=-0.0076;MQ=61.58;MQ0=0;MQRankSum=3.405;NDA=3;QD=17.28;ReadPosRankSum=1.770;SB=-56.16;VQSLOD=-7.8406;culprit=HaplotypeScore;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:7,0:7:21.07:0,21,272	0/0:16,0:16:45.11:0,45,510	0/0:16,0:16:45.14:0,45,594	0/0:11,0:11:33.08:0,33,407	0/0:7,0:7:18.04:0,18,232	0/0:8,0:8:18. [...]
-1	871129	.	C	T	2363.53	PASS	AC=3;AF=0.00127;AN=2364;BaseQRankSum=1.324;DP=88230;DS;Dels=0.00;FS=133.740;HRun=4;HaplotypeScore=0.1585;InbreedingCoeff=-0.0070;MQ=121.02;MQ0=0;MQRankSum=-4.492;NDA=2;QD=10.55;ReadPosRankSum=-5.079;SB=-1103.64;VQSLOD=4.1810;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:29:87.29:0,87,1196	0/0:1,0:101:99:0,304,3735	0/0:1,0:65:99:0,196,2404	0/0:1,0:48:99:0,144,1852	0/0:1,0:57:99:0,172,2199	0/0:1,0:42:99:0,126,1620	0/0:1,0:42:99:0,126,1587	0/0:1,0:33:99:0,99,1192 [...]
-1	871171	.	A	G	688.12	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=-4.336;DP=86111;DS;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.0614;InbreedingCoeff=-0.0005;MQ=140.67;MQ0=0;MQRankSum=-4.594;NDA=1;QD=11.86;ReadPosRankSum=-2.707;SB=-280.00;VQSLOD=10.0930;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:34:99:0,102,1312	0/0:1,0:84:99:0,253,2886	0/0:1,0:68:99:0,205,2457	0/0:1,0:34:99:0,102,1285	0/0:1,0:56:99:0,169,2160	0/0:1,0:44:99:0,132,1590	0/0:1,0:53:99:0,159,1722	0/0:1,0:42:99:0,126,1443	0/0 [...]
-1	871173	rs141982349	C	T	380.08	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=1.317;DB;DP=94636;DS;Dels=0.00;FS=14.305;HRun=0;HaplotypeScore=0.0522;InbreedingCoeff=-0.0006;MQ=140.91;MQ0=0;MQRankSum=-3.379;NDA=1;QD=8.09;ReadPosRankSum=-0.692;SB=-152.07;VQSLOD=8.2214;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:37:99:0,111,1545	0/0:1,0:101:99:0,304,3735	0/0:1,0:76:99:0,229,2932	0/0:1,0:34:99:0,102,1382	0/0:1,0:63:99:0,190,2598	0/0:1,0:51:99:0,154,2040	0/0:1,0:60:99:0,181,2168	0/0:1,0:46:99:0, [...]
-1	871176	.	C	T	806.96	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=-2.225;DP=94503;DS;Dels=0.00;FS=48.943;HRun=1;HaplotypeScore=0.0532;InbreedingCoeff=0.0054;MQ=138.21;MQ0=0;MQRankSum=-3.509;NDA=1;QD=13.45;ReadPosRankSum=-1.802;SB=-219.67;VQSLOD=7.9297;culprit=MQ;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:36:99:0,108,1503	0/0:1,0:98:99:0,295,3781	0/0:1,0:76:99:0,229,2988	0/0:1,0:35:99:0,105,1423	0/0:1,0:60:99:0,181,2474	0/0:1,0:52:99:0,157,2114	0/0:1,0:58:99:0,175,2237	0/0:1,0:46:99:0,138,1739	0/0: [...]
-1	871193	.	G	C	517.25	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=6.508;DP=88429;Dels=0.00;FS=19.613;HRun=2;HaplotypeScore=0.0196;InbreedingCoeff=-0.0023;MQ=115.20;MQ0=0;MQRankSum=0.185;NDA=2;QD=12.93;ReadPosRankSum=-4.480;SB=-44.96;VQSLOD=9.6679;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:31:93.30:0,93,1196	0/0:1,0:76:99:0,229,2611	0/0:1,0:59:99:0,178,2230	0/0:1,0:28:84.27:0,84,1080	0/0:1,0:50:99:0,150,1890	0/0:1,0:48:99:0,144,1814	0/0:1,0:76:99:0,229,2470	0/0:1,0:53:99:0,159,1722	0/0:1 [...]
-1	871215	rs28419423	C	T,G	147999.05	PASS	AC=1,167;AF=0.00042,0.07064;AN=2364;BaseQRankSum=31.541;DB;DP=81904;DS;Dels=0.00;FS=22.522;HaplotypeScore=0.2500;InbreedingCoeff=0.1555;MQ=77.03;MQ0=0;MQRankSum=-0.797;NDA=2;QD=17.13;ReadPosRankSum=-12.413;SB=-59334.05;VQSLOD=6.2098;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0,0:29:87.27:0,87,1072,87,1072,1072	0/0:1,0,0:68:99:0,205,2274,205,2274,2274	0/0:1,0,0:54:99:0,162,1904,162,1904,1904	0/0:1,0,0:25:75.23:0,75,903,75,903,903	0/0:1,0,0:43:99:0 [...]
-1	871219	.	C	T	658.03	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=-8.262;DP=79865;DS;Dels=0.00;FS=5.928;HRun=0;HaplotypeScore=0.2739;InbreedingCoeff=0.0029;MQ=79.21;MQ0=0;MQRankSum=0.013;NDA=2;QD=12.19;ReadPosRankSum=3.190;SB=-201.44;VQSLOD=6.5830;culprit=ReadPosRankSum;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:25:75.25:0,75,1044	0/0:1,0:62:99:0,187,2392	0/0:1,0:57:99:0,172,2317	0/0:1,0:31:93.31:0,93,1240	0/0:1,0:45:99:0,135,1829	0/0:1,0:35:99:0,105,1423	0/0:1,0:74:99:0,223,2855	0/0:1,0:50:99:0,1 [...]
-1	871229	rs149944086	G	C	2312.78	PASS	AC=3;AF=0.00127;AN=2364;BaseQRankSum=7.026;DB;DP=74122;DS;Dels=0.00;FS=13.320;HRun=2;HaplotypeScore=0.0998;InbreedingCoeff=0.0017;MQ=121.47;MQ0=0;MQRankSum=-1.538;NDA=1;QD=16.17;ReadPosRankSum=-5.261;SB=-80.66;VQSLOD=9.8454;culprit=ReadPosRankSum;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:19:57.19:0,57,817	0/0:1,0:52:99:0,156,1965	0/0:1,0:54:99:0,163,2083	0/0:1,0:27:81.26:0,81,1020	0/0:1,0:40:99:0,120,1573	0/0:1,0:37:99:0,111,1398	0/0:1,0:69:99:0,208,2493	0/ [...]
-1	871239	rs147616064	C	T	1622.57	PASS	AC=3;AF=0.00127;AN=2364;BaseQRankSum=-1.538;DB;DP=64080;DS;Dels=0.00;FS=8.450;HRun=2;HaplotypeScore=0.0688;InbreedingCoeff=-0.0023;MQ=123.57;MQ0=0;MQRankSum=-3.198;NDA=1;QD=12.20;ReadPosRankSum=-6.659;SB=-61.38;VQSLOD=10.3368;culprit=ReadPosRankSum;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:17:51.17:0,51,741	0/0:1,0:49:99:0,147,1852	0/0:1,0:44:99:0,132,1814	0/0:1,0:28:84.27:0,84,1101	0/0:1,0:41:99:0,123,1690	0/0:1,0:34:99:0,102,1402	0/0:1,0:60:99:0,181,2268	 [...]
-1	871269	.	A	C	891.84	TruthSensitivityTranche98.90to99.00	AC=125;AF=0.05288;AN=2364;BaseQRankSum=-18.250;DP=18591;DS;Dels=0.00;FS=167.133;HRun=3;HaplotypeScore=0.5054;InbreedingCoeff=-0.0534;MQ=78.80;MQ0=1;MQRankSum=-7.666;NDA=2;QD=0.38;ReadPosRankSum=-8.894;SB=259.41;VQSLOD=-0.6803;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:4:12.03:0,12,134	0/1:12,6:19:0.08:0,0,313	0/0:1,0:20:60.15:0,60,631	0/0:1,0:12:36.09:0,36,379	0/0:1,0:14:42.11:0,42,455	0/0:1,0:20:60.16:0,60,650	0/0:1,0:14 [...]
-1	874402	.	C	G	370.61	PASS	AC=2;AF=0.00085;AN=2360;BaseQRankSum=1.038;DP=17471;Dels=0.00;FS=7.836;HRun=0;HaplotypeScore=0.2022;InbreedingCoeff=-0.0141;MQ=90.39;MQ0=0;MQRankSum=-1.296;NDA=2;QD=13.24;ReadPosRankSum=1.474;SB=-203.51;VQSLOD=7.7578;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:3:9.03:0,9,129	0/0:1,0:5:15.05:0,15,189	0/0:1,0:5:15.05:0,15,189	0/0:1,0:3:9.03:0,9,120	0/0:1,0:4:12.04:0,12,165	0/0:1,0:4:12.04:0,12,165	0/0:24,0:24:63.20:0,63,834	0/0:1,0:26:78.25:0,78,96 [...]
-1	874455	.	C	T	174.37	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=-1.679;DP=25006;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.1837;InbreedingCoeff=0.1880;MQ=80.95;MQ0=0;MQRankSum=0.149;NDA=2;QD=7.93;ReadPosRankSum=0.492;SB=-20.23;VQSLOD=2.7845;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:4:12.04:0,12,169	0/0:1,0:12:36.11:0,36,423	0/0:1,0:6:18.06:0,18,236	0/0:1,0:3:9.03:0,9,124	0/0:1,0:4:12.04:0,12,154	0/0:1,0:9:27.07:0,27,292	0/0:1,0:27:81.20:0,81,852	0/0:1,0:27:81.18:0,81,826	0/0:1,0:26:7 [...]
-1	874456	rs149677938	G	A	109.49	PASS	AC=5;AF=0.00212;AN=2364;BaseQRankSum=-2.689;DB;DP=23505;Dels=0.00;FS=7.650;HRun=0;HaplotypeScore=0.1763;InbreedingCoeff=-0.0082;MQ=81.74;MQ0=0;MQRankSum=0.806;NDA=2;QD=2.81;ReadPosRankSum=-0.807;SB=-63.07;VQSLOD=3.1368;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:4:12.04:0,12,148	0/0:1,0:9:27.09:0,27,340	0/0:1,0:6:18.05:0,18,201	0/0:1,0:3:9.03:0,9,108	0/0:1,0:4:12.03:0,12,126	0/0:1,0:8:24.07:0,24,267	0/0:1,0:22:66.21:0,66,814	0/0:1,0:27:81.26:0,81,10 [...]
-1	874497	.	G	A	382.09	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=-0.925;DP=20918;Dels=0.00;FS=1.007;HRun=2;HaplotypeScore=0.1533;InbreedingCoeff=0.0337;MQ=84.31;MQ0=0;MQRankSum=0.187;NDA=1;QD=10.61;ReadPosRankSum=0.632;SB=-103.25;VQSLOD=6.2214;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:7:21.07:0,21,265	0/0:11,0:11:30.09:0,30,374	0/0:1,0:6:18.06:0,18,236	0/0:1,0:6:18.06:0,18,217	0/0:1,0:5:15.04:0,15,167	0/0:10,0:10:30.08:0,30,366	0/0:1,0:12:36.11:0,36,434	0/0:1,0:29:87.27:0,87,1048	0/0: [...]
-1	874528	rs72902595	C	T	306.67	PASS	AC=3;AF=0.00128;AN=2350;BaseQRankSum=3.514;DB;DP=14636;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.1887;InbreedingCoeff=0.0081;MQ=90.63;MQ0=0;MQRankSum=2.214;NDA=3;QD=6.81;ReadPosRankSum=0.056;SB=13.52;VQSLOD=6.5618;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:9:27.09:0,27,340	0/0:1,0:7:21.06:0,21,227	0/0:1,0:4:12.04:0,12,141	0/0:1,0:7:21.07:0,21,259	0/0:1,0:5:15.05:0,15,197	0/0:1,0:8:24.08:0,24,302	0/0:1,0:12:36.10:0,36,401	0/0:1,0:15:45.13:0,45,515	0 [...]
-1	874550	.	G	C	934.68	PASS	AC=2;AF=0.00085;AN=2346;BaseQRankSum=-5.107;DP=12802;Dels=0.00;FS=1.439;HRun=0;HaplotypeScore=0.3224;InbreedingCoeff=0.0260;MQ=92.33;MQ0=0;MQRankSum=-2.528;NDA=2;QD=13.55;ReadPosRankSum=1.865;SB=-312.37;VQSLOD=6.0299;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:8:24.08:0,24,330	0/0:1,0:6:18.06:0,18,222	0/0:1,0:6:18.06:0,18,227	0/0:1,0:9:27.09:0,27,366	0/0:1,0:4:12.04:0,12,157	0/0:1,0:9:27.09:0,27,366	0/0:1,0:9:27.09:0,27,347	0/0:1,0:12:36.11:0,36,444	0/0:1,0:1 [...]
-1	874553	.	G	T	129.66	PASS	AC=2;AF=0.00085;AN=2354;BaseQRankSum=-4.133;DP=12404;Dels=0.00;FS=1.033;HRun=0;HaplotypeScore=0.2865;InbreedingCoeff=-0.0172;MQ=93.26;MQ0=0;MQRankSum=-2.976;NDA=2;QD=4.80;ReadPosRankSum=0.626;SB=-59.70;VQSLOD=5.4149;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:9:27.09:0,27,366	0/0:1,0:4:12.04:0,12,151	0/0:1,0:4:12.04:0,12,151	0/0:1,0:9:27.09:0,27,366	0/0:1,0:5:15.05:0,15,197	0/0:1,0:11:33.11:0,33,432	0/0:1,0:11:33.10:0,33,397	0/0:1,0:11:33.10:0,33,397	0/0:1,0: [...]
-1	874657	.	G	A	70.31	PASS	AC=4;AF=0.00169;AN=2362;BaseQRankSum=-0.218;DP=15640;Dels=0.00;FS=14.687;HRun=0;HaplotypeScore=0.2464;InbreedingCoeff=-0.0179;MQ=67.20;MQ0=0;MQRankSum=1.359;NDA=2;QD=3.06;ReadPosRankSum=0.088;SB=-35.40;VQSLOD=1.7943;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:4:12.04:0,12,169	0/0:1,0:7:21.07:0,21,265	0/0:1,0:5:15.05:0,15,193	0/0:1,0:11:33.11:0,33,416	0/0:1,0:8:24.08:0,24,302	0/0:1,0:15:45.15:0,45,579	0/0:17,0:17:45.14:0,45,580	0/0:11,0:11:33.09:0,33,410	0/0:16 [...]
-1	874665	rs74047413	G	A	5723.97	PASS	AC=34;AF=0.01438;AN=2364;BaseQRankSum=-11.637;DB;DP=16240;Dels=0.00;FS=4.664;HRun=0;HaplotypeScore=0.2594;InbreedingCoeff=0.0425;MQ=63.94;MQ0=0;MQRankSum=5.366;NDA=3;QD=13.34;ReadPosRankSum=4.040;SB=-1184.77;VQSLOD=6.6070;culprit=MQRankSum;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:7:21.07:0,21,275	0/0:1,0:10:30.09:0,30,370	0/0:1,0:5:15.05:0,15,200	0/0:1,0:9:27.09:0,27,354	0/0:1,0:9:27.09:0,27,376	0/0:1,0:10:30.10:0,30,400	0/0:18,0:18:54.17:0,54,684	0/0:1,0:1 [...]
-1	874671	rs148995812	G	T	143.17	TruthSensitivityTranche98.50to98.80	AC=6;AF=0.00254;AN=2364;BaseQRankSum=3.015;DB;DP=17331;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.2863;InbreedingCoeff=0.0404;MQ=62.93;MQ0=0;MQRankSum=2.341;NDA=2;QD=2.98;ReadPosRankSum=1.335;SB=-77.93;VQSLOD=0.5677;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:7:21.06:0,21,253	0/0:1,0:11:33.10:0,33,378	0/0:1,0:4:12.03:0,12,137	0/0:1,0:10:30.09:0,30,344	0/0:1,0:11:33.10:0,33,407	0/0:1,0:9:27.07:0,27,301	0/0:21,0:21 [...]
-1	874697	.	C	G	101.09	PASS	AC=1;AF=0.00042;AN=2362;BaseQRankSum=-3.035;DP=22197;Dels=0.00;FS=1.736;HRun=2;HaplotypeScore=0.2393;InbreedingCoeff=-0.0038;MQ=69.05;MQ0=0;MQRankSum=1.459;NDA=3;QD=7.78;ReadPosRankSum=-0.481;SB=9.66;VQSLOD=6.3479;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:11:33.11:0,33,440	0/0:1,0:15:45.14:0,45,542	0/0:1,0:5:15.05:0,15,203	0/0:1,0:12:36.12:0,36,463	0/0:11,0:12:33.09:0,33,421	0/0:1,0:14:42.14:0,42,560	0/0:1,0:17:51.13:0,51,552	0/0:1,0:13:39.11:0,39,435	0/0:1 [...]
-1	874706	.	A	G	221.68	PASS	AC=1;AF=0.00042;AN=2362;BaseQRankSum=-3.691;DP=23040;Dels=0.00;FS=1.035;HRun=0;HaplotypeScore=0.2004;InbreedingCoeff=-0.0039;MQ=72.95;MQ0=0;MQRankSum=2.395;NDA=3;QD=7.39;ReadPosRankSum=0.700;SB=-109.35;VQSLOD=6.6840;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:9:27.09:0,27,371	0/0:1,0:18:54.16:0,54,618	0/0:1,0:7:21.07:0,21,285	0/0:12,0:12:30.10:0,30,407	0/0:12,0:12:36.11:0,36,474	0/0:1,0:13:39.13:0,39,528	0/0:1,0:19:57.17:0,57,653	0/0:15,0:15:45.12:0,45,501	0/ [...]
-1	874714	.	C	T	172.67	PASS	AC=2;AF=0.00085;AN=2364;BaseQRankSum=0.061;DP=25875;Dels=0.00;FS=16.702;HRun=0;HaplotypeScore=0.1731;InbreedingCoeff=0.0793;MQ=74.76;MQ0=0;MQRankSum=1.555;NDA=2;QD=4.43;ReadPosRankSum=0.171;SB=-21.70;VQSLOD=1.9941;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:9:27.09:0,27,371	0/0:1,0:18:54.17:0,54,650	0/0:1,0:8:24.08:0,24,325	0/0:12,0:12:27.09:0,27,381	0/0:1,0:11:33.11:0,33,447	0/0:1,0:19:57.19:0,57,760	0/0:1,0:25:75.20:0,75,812	0/0:17,0:17:51.13:0,51,574	0/0:1 [...]
-1	874731	.	G	A	145.27	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=0.058;DP=24162;Dels=0.00;FS=0.000;HRun=1;HaplotypeScore=0.1869;InbreedingCoeff=-0.0043;MQ=75.55;MQ0=0;MQRankSum=2.984;NDA=2;QD=10.38;ReadPosRankSum=-0.451;SB=-101.06;VQSLOD=7.0812;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:9:27.09:0,27,380	0/0:1,0:12:36.12:0,36,472	0/0:1,0:8:24.08:0,24,320	0/0:1,0:12:36.12:0,36,472	0/0:1,0:10:30.10:0,30,393	0/0:1,0:21:63.21:0,63,840	0/0:1,0:20:60.19:0,60,772	0/0:1,0:14:42.13:0,42,529	0/0: [...]
-1	874734	rs145967298	C	T	2081.74	PASS	AC=8;AF=0.00338;AN=2364;BaseQRankSum=-1.345;DB;DP=23140;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.2038;InbreedingCoeff=-0.0083;MQ=76.87;MQ0=0;MQRankSum=5.345;NDA=2;QD=9.51;ReadPosRankSum=4.296;SB=-1122.28;VQSLOD=7.9095;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:9:27.09:0,27,354	0/0:1,0:10:30.09:0,30,353	0/0:1,0:7:21.07:0,21,265	0/0:1,0:11:33.11:0,33,432	0/0:1,0:8:24.07:0,24,282	0/0:1,0:18:54.17:0,54,650	0/0:1,0:17:51.13:0,51,552	0/0:1,0:10:30.07: [...]
-1	874762	rs139437968	C	T	651.40	PASS	AC=8;AF=0.00338;AN=2364;BaseQRankSum=-0.183;DB;DP=25970;Dels=0.00;FS=2.823;HRun=0;HaplotypeScore=0.2432;InbreedingCoeff=-0.0132;MQ=87.02;MQ0=0;MQRankSum=1.762;NDA=3;QD=5.62;ReadPosRankSum=0.858;SB=-307.51;VQSLOD=6.1742;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:12:36.12:0,36,501	0/0:1,0:12:36.11:0,36,444	0/0:1,0:15:45.15:0,45,579	0/0:1,0:19:57.19:0,57,772	0/0:1,0:11:33.11:0,33,424	0/0:1,0:25:75.24:0,75,964	0/0:1,0:18:54.16:0,54,635	0/0:1,0:13:39.11 [...]
-1	874779	rs141207077	C	T	277.66	PASS	AC=2;AF=0.00085;AN=2364;BaseQRankSum=-2.449;DB;DP=26201;DS;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.5481;InbreedingCoeff=0.0139;MQ=74.98;MQ0=2;MQRankSum=-2.236;NDA=2;QD=7.93;ReadPosRankSum=0.678;SB=-141.68;VQSLOD=5.2534;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:13:39.13:0,39,528	0/0:1,0:12:36.11:0,36,444	0/0:1,0:21:63.21:0,63,840	0/0:1,0:23:69.23:0,69,920	0/0:1,0:15:45.15:0,45,618	0/0:1,0:28:84.28:0,84,1120	0/0:1,0:17:51.16:0,51,629	0/0:1,0:10:3 [...]
-1	874809	.	G	C	241.96	PASS	AC=2;AF=0.00085;AN=2364;BaseQRankSum=-4.215;DP=29065;DS;Dels=0.00;FS=2.562;HRun=1;HaplotypeScore=0.7328;InbreedingCoeff=-0.0131;MQ=59.07;MQ0=7;MQRankSum=1.382;NDA=3;QD=8.07;ReadPosRankSum=-1.689;SB=-71.04;VQSLOD=4.3569;culprit=HaplotypeScore;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:18:54.18:0,54,732	0/0:1,0:16:48.16:0,48,629	0/0:1,0:29:87.29:0,87,1160	0/0:1,0:27:81.27:0,81,1113	0/0:1,0:21:63.21:0,63,866	0/0:1,0:27:81.27:0,81,1097	0/0:1,0:14:42.13:0,42,518	0/0:1,0:8:2 [...]
-1	874816	.	C	CT	13059.48	PASS	AC=80;AF=0.03393;AN=2358;BaseQRankSum=-0.835;DP=28085;FS=73.108;GS;HRun=1;HaplotypeScore=4.8051;InbreedingCoeff=0.0220;MQ=55.70;MQ0=12;MQRankSum=3.256;NDA=1;QD=8.23;ReadPosRankSum=17.642;SB=-5804.39;set=variant2	GT:AD:DP:GQ:PL	0/0:1,0:1:57.19:0,57,845	0/0:1,0:1:57.19:0,57,845	0/0:1,0:1:87.29:0,87,1289	0/0:1,0:1:78.26:0,78,1156	0/0:1,0:1:66.22:0,66,978	0/0:1,0:1:87.29:0,87,1289	0/0:1,0:1:42.14:0,42,622	0/0:1,0:1:18.06:0,18,267	0/0:1,0:1:30.08:0,30,336	0/0:1,0 [...]
-1	874826	.	A	C	73.70	TruthSensitivityTranche99.00to99.30	AC=42;AF=0.01780;AN=2360;BaseQRankSum=-24.430;DP=21024;DS;Dels=0.00;FS=339.345;HRun=2;HaplotypeScore=0.9175;InbreedingCoeff=-0.0037;MQ=55.96;MQ0=9;MQRankSum=-2.079;NDA=2;QD=0.11;ReadPosRankSum=-6.577;SB=-243.62;VQSLOD=-1.9473;culprit=HaplotypeScore;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:21:63.20:0,63,810	0/0:1,0:16:48.13:0,48,535	0/0:1,0:26:78.25:0,78,983	0/0:1,0:20:60.20:0,60,800	0/0:1,0:21:63.21:0,63,854	0/0:1,0:31:93.30:0,93,1 [...]
-1	874829	.	T	C	182.51	TruthSensitivityTranche99.30to99.50	AC=71;AF=0.03003;AN=2364;BaseQRankSum=-21.015;DP=23962;DS;Dels=0.00;FS=486.019;HRun=4;HaplotypeScore=0.8899;InbreedingCoeff=-0.0423;MQ=55.61;MQ0=12;MQRankSum=4.332;NDA=1;QD=0.24;ReadPosRankSum=-19.215;SB=-390.43;VQSLOD=-3.1119;culprit=HaplotypeScore;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:21:63.21:0,63,826	0/0:1,0:14:42.13:0,42,518	0/0:1,0:27:81.26:0,81,1061	0/0:1,0:22:66.22:0,66,894	0/0:1,0:23:69.23:0,69,904	0/0:1,0:32:96.31:0,9 [...]
-1	874840	.	G	A	76.39	TruthSensitivityTranche99.30to99.50	AC=4;AF=0.00169;AN=2364;BaseQRankSum=0.194;DP=25677;DS;Dels=0.00;FS=36.775;HRun=0;HaplotypeScore=0.4616;InbreedingCoeff=0.0506;MQ=54.52;MQ0=17;MQRankSum=1.004;NDA=3;QD=1.41;ReadPosRankSum=-4.415;SB=-198.08;VQSLOD=-4.2627;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:16:48.15:0,48,605	0/0:20,0:20:54.15:0,54,656	0/0:1,0:27:81.25:0,81,998	0/0:1,0:22:66.20:0,66,795	0/0:1,0:22:66.21:0,66,832	0/0:1,0:29:87.28:0,87,1119	0/0:1,0:12:3 [...]
-1	874864	rs141512630	CT	C	14962.48	PASS	AC=120;AF=0.05376;AN=2232;BaseQRankSum=7.876;DB;DP=19575;DS;FS=29.806;HRun=1;HaplotypeScore=3.1953;InbreedingCoeff=-0.0547;MQ=55.23;MQ0=13;MQRankSum=3.370;NDA=1;QD=5.75;ReadPosRankSum=8.496;SB=-5595.81;set=variant2	GT:AD:DP:GQ:PL	0/0:1,0:1:42.14:0,42,636	0/0:1,0:1:27.09:0,27,409	0/0:1,0:1:54.18:0,54,818	0/0:1,0:1:48.16:0,48,727	0/0:1,0:1:48.16:0,48,727	0/0:1,0:1:75.25:0,75,1136	0/0:1,0:1:27.04:0,27,260	0/0:1,0:1:24.05:0,24,239	0/0:1,0:1:27.06:0,27, [...]
-1	874875	.	A	C	125.15	TruthSensitivityTranche99.00to99.30	AC=62;AF=0.02654;AN=2336;BaseQRankSum=-25.364;DP=13447;DS;Dels=0.00;FS=290.321;HRun=2;HaplotypeScore=0.9392;InbreedingCoeff=-0.0357;MQ=62.88;MQ0=9;MQRankSum=-2.359;NDA=3;QD=0.20;ReadPosRankSum=-3.012;SB=-138.79;VQSLOD=-1.6402;culprit=HaplotypeScore;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:13:39.12:0,39,470	0/0:1,0:3:9.03:0,9,111	0/0:1,0:14:42.13:0,42,494	0/0:1,0:13:39.12:0,39,470	0/0:1,0:12:36.12:0,36,472	0/0:1,0:18:54.17:0,54,694 [...]
-1	874878	.	T	C	2347.07	TruthSensitivityTranche99.50to99.90	AC=177;AF=0.07526;AN=2352;BaseQRankSum=-27.911;DP=15608;DS;Dels=0.00;FS=812.634;HRun=4;HaplotypeScore=0.4553;InbreedingCoeff=-0.0682;MQ=62.83;MQ0=10;MQRankSum=-1.551;NDA=3;QD=1.03;ReadPosRankSum=-24.080;SB=275.16;VQSLOD=-5.8489;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:14:42.13:0,42,506	0/0:1,0:2:6.02:0,6,76	0/0:1,0:15:45.14:0,45,567	0/0:1,0:12:36.11:0,36,454	0/0:1,0:15:45.14:0,45,567	0/0:1,0:19:57.18:0,57,718	0/1:8,1:9 [...]
-1	874880	.	C	T	106.84	PASS	AC=2;AF=0.00085;AN=2364;BaseQRankSum=-1.422;DP=21057;DS;Dels=0.00;FS=3.970;HRun=0;HaplotypeScore=0.4635;InbreedingCoeff=-0.0128;MQ=62.21;MQ0=9;MQRankSum=0.305;NDA=2;QD=3.96;ReadPosRankSum=1.493;SB=-59.85;VQSLOD=2.2323;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:15:45.15:0,45,610	0/0:1,0:9:27.09:0,27,347	0/0:1,0:18:54.18:0,54,720	0/0:1,0:15:45.15:0,45,626	0/0:1,0:19:57.19:0,57,802	0/0:1,0:23:69.23:0,69,960	0/0:11,0:11:33.10:0,33,407	0/0:12,0:12:36.12:0,36,467	 [...]
-1	876484	rs118109273	C	T	4116.34	PASS	AC=42;AF=0.01825;AN=2302;BaseQRankSum=-4.436;DB;DP=8391;Dels=0.00;FS=33.016;HRun=0;HaplotypeScore=0.2452;InbreedingCoeff=0.0391;MQ=62.83;MQ0=0;MQRankSum=7.010;NDA=2;QD=13.50;ReadPosRankSum=2.029;SB=-1128.61;VQSLOD=5.1912;culprit=MQRankSum;set=variant	GT:AD:DP:GQ:PL	./.	0/0:1,0:3:9.02:0,9,92	0/0:1,0:3:9.02:0,9,100	0/0:1,0:5:15.05:0,15,197	0/0:1,0:5:15.05:0,15,200	0/0:1,0:3:9.03:0,9,120	0/0:1,0:4:12.04:0,12,154	0/0:11,0:11:27.08:0,27,323	0/0:4,0:4:12.0 [...]
-1	876499	rs4372192	A	G	305633.12	PASS	AC=2123;AF=0.91667;AN=2316;BaseQRankSum=22.009;DB;DP=9687;Dels=0.01;FS=13.883;HRun=6;HaplotypeScore=0.3271;InbreedingCoeff=0.0020;MQ=62.35;MQ0=0;MQRankSum=-2.556;NDA=3;QD=31.33;ReadPosRankSum=-0.328;SB=-23736.25;VQSLOD=4.8712;culprit=MQ;set=variant	GT:AD:DP:GQ:PL	1/1:0,1:1:3.01:38,3,0	1/1:0,1:6:18.06:227,18,0	1/1:0,1:3:9.03:116,9,0	1/1:0,1:5:15.05:189,15,0	1/1:0,1:4:12.04:171,12,0	1/1:0,1:2:6.02:81,6,0	1/1:0,1:7:21.07:270,21,0	1/1:0,12:12:36.08:436,3 [...]
-1	876659	.	C	T	66.95	PASS	AC=1;AF=0.00043;AN=2322;BaseQRankSum=-0.742;DP=8862;Dels=0.00;FS=9.438;HRun=0;HaplotypeScore=0.1758;InbreedingCoeff=-0.0314;MQ=60.48;MQ0=0;MQRankSum=2.146;NDA=2;QD=9.56;ReadPosRankSum=-0.520;SB=7.07;VQSLOD=5.9783;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:1:3.01:0,3,41	0/0:8,0:8:18.03:0,18,209	0/0:1,0:2:6.02:0,6,84	0/0:6,0:6:18.06:0,18,237	0/0:1,0:3:9.03:0,9,118	0/0:1,0:2:6.02:0,6,84	0/0:8,0:8:24.08:0,24,307	0/0:1,0:4:12.04:0,12,145	0/0:1,0:5:15. [...]
-1	876698	.	G	C	162.37	TruthSensitivityTranche99.00to99.30	AC=54;AF=0.02432;AN=2220;BaseQRankSum=-14.750;DP=5641;Dels=0.00;FS=79.866;HRun=1;HaplotypeScore=0.2141;InbreedingCoeff=-0.0605;MQ=65.04;MQ0=0;MQRankSum=0.487;NDA=3;QD=0.51;ReadPosRankSum=-10.460;SB=485.51;VQSLOD=-1.5866;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:1:3.01:0,3,41	0/0:1,0:2:6.02:0,6,79	./.	0/0:1,0:3:9.03:0,9,124	0/0:1,0:1:3.01:0,3,42	0/0:1,0:1:3.01:0,3,32	0/0:6,0:6:15.03:0,15,163	0/0:1,0:3:9.03:0,9,108	0/0:1,0 [...]
-1	877498	.	T	C	103.49	PASS	AC=2;AF=0.00100;AN=1992;BaseQRankSum=2.365;DP=3395;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.0945;InbreedingCoeff=-0.0948;MQ=67.96;MQ0=0;MQRankSum=0.630;NDA=1;QD=6.09;ReadPosRankSum=-0.641;SB=-3.03;VQSLOD=4.2876;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:1:3.01:0,3,41	0/0:1,0:3:9.03:0,9,106	0/0:1,0:4:12.04:0,12,154	0/0:1,0:1:3.01:0,3,41	./.	0/0:1,0:5:15.05:0,15,203	0/0:3,0:3:9.02:0,9,94	./.	0/0:1,0:1:3.01:0,3,34	0/0:1,0:5:15.04:0,15,158	0/0:2,0:2:6.01:0,6,6 [...]
-1	877583	.	C	T	209.17	PASS	AC=2;AF=0.00090;AN=2230;BaseQRankSum=-2.524;DP=7189;Dels=0.00;FS=2.392;HRun=1;HaplotypeScore=0.1395;InbreedingCoeff=-0.0604;MQ=69.85;MQ0=0;MQRankSum=0.660;NDA=2;QD=6.34;ReadPosRankSum=-0.548;SB=-111.73;VQSLOD=4.9268;culprit=FS;set=variant	GT:AD:DP:GQ:PL	./.	0/0:1,0:5:15.05:0,15,193	0/0:1,0:2:6.02:0,6,84	0/0:1,0:3:9.03:0,9,125	./.	0/0:1,0:6:18.06:0,18,236	0/0:1,0:1:3:0,3,28	0/0:1,0:3:9.03:0,9,113	0/0:2,0:2:6.02:0,6,79	0/0:1,0:9:27.09:0,27,354	0/0:3,0:3:9.03:0,9, [...]
-1	877608	.	C	G	100.84	PASS	AC=3;AF=0.00138;AN=2176;BaseQRankSum=-1.905;DP=5927;Dels=0.00;FS=4.496;HRun=0;HaplotypeScore=0.1522;InbreedingCoeff=-0.0542;MQ=64.62;MQ0=0;MQRankSum=0.399;NDA=2;QD=6.72;ReadPosRankSum=-0.563;SB=-42.63;VQSLOD=4.7731;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:1:3.01:0,3,31	0/0:1,0:3:9.03:0,9,113	0/0:1,0:1:3.01:0,3,44	0/0:1,0:3:9.03:0,9,116	./.	0/0:1,0:5:15.05:0,15,197	./.	0/0:1,0:1:3.01:0,3,37	0/0:2,0:2:6.02:0,6,75	0/0:1,0:6:18.06:0,18,217	0/0:1,0:3:9.02:0,9,1 [...]
-1	877677	.	G	C	349.09	TruthSensitivityTranche99.00to99.30	AC=69;AF=0.03770;AN=1830;BaseQRankSum=-9.318;DP=2433;Dels=0.00;FS=448.822;HRun=1;HaplotypeScore=0.0879;InbreedingCoeff=-0.0760;MQ=59.92;MQ0=0;MQRankSum=0.100;NDA=3;QD=1.71;ReadPosRankSum=-8.632;SB=-143.52;VQSLOD=-1.8166;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	./.	./.	0/0:1,0:2:6.02:0,6,86	0/0:1,0:1:3.01:0,3,35	./.	0/0:1,0:2:6.02:0,6,77	0/0:1,0:1:3.01:0,3,39	0/0:1,0:1:2.99:0,3,23	./.	0/0:1,0:1:3.01:0,3,39	0/0:1,0:2:6.02:0,6,72	 [...]
-1	877782	rs79037098	C	G	4781.10	PASS	AC=124;AF=0.07159;AN=1732;BaseQRankSum=-4.447;DB;DP=2110;Dels=0.00;FS=3.255;HRun=0;HaplotypeScore=0.0938;InbreedingCoeff=0.0287;MQ=60.89;MQ0=0;MQRankSum=2.952;NDA=2;QD=17.45;ReadPosRankSum=-3.028;SB=-1408.28;VQSLOD=6.6300;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:3:9.03:0,9,120	./.	0/0:1,0:2:6.02:0,6,76	./.	0/0:1,0:2:6.02:0,6,88	0/0:1,0:1:3.01:0,3,36	0/0:1,0:1:3.01:0,3,36	0/0:1,0:1:3.01:0,3,37	0/0:1,0:1:3.01:0,3,38	0/0:1,0:1:3.01:0,3,40	0/0:1,0:1: [...]
-1	877822	.	A	T	78.78	PASS	AC=1;AF=0.00055;AN=1804;BaseQRankSum=-0.199;DP=2323;Dels=0.00;FS=2.331;HRun=1;HaplotypeScore=0.0436;InbreedingCoeff=-0.1067;MQ=58.62;MQ0=0;MQRankSum=2.403;NDA=1;QD=8.75;ReadPosRankSum=-2.072;SB=13.26;VQSLOD=3.3162;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:2:6.02:0,6,80	./.	0/0:1,0:1:3.01:0,3,36	./.	0/0:1,0:1:3.01:0,3,41	./.	0/0:1,0:3:9.02:0,9,92	./.	0/0:1,0:3:9.02:0,9,100	0/0:1,0:1:3.01:0,3,32	0/0:1,0:1:3.01:0,3,30	./.	0/0:1,0:3:9.02:0,9,100	0/0:1,0:1:3.01:0 [...]
-1	877831	rs6672356	T	C	82507.77	PASS	AC=1802;AF=1.00000;AN=1802;BaseQRankSum=-0.472;DB;DP=2494;Dels=0.00;FS=0.000;HRun=2;HaplotypeScore=0.0398;InbreedingCoeff=-0.0821;MQ=58.21;MQ0=0;MQRankSum=2.333;NDA=2;QD=33.07;ReadPosRankSum=1.161;SB=-3183.71;VQSLOD=1.4957;culprit=FS;set=variant	GT:AD:DP:GQ:PL	1/1:0,1:2:6.02:69,6,0	./.	1/1:0,1:1:3.01:30,3,0	./.	1/1:0,1:1:3.01:44,3,0	./.	1/1:0,1:3:9.02:100,9,0	./.	1/1:0,1:3:9.02:92,9,0	1/1:0,1:2:6.01:61,6,0	1/1:0,1:2:6.01:55,6,0	./.	1/1:0,1:4:12.04:148 [...]
-1	878008	.	C	T	138.93	PASS	AC=5;AF=0.0063;AN=792;BaseQRankSum=0.007;DP=887;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.0558;InbreedingCoeff=-0.0914;MQ=58.35;MQ0=0;MQRankSum=1.574;NDA=2;QD=11.58;ReadPosRankSum=-1.392;SB=5.36;VQSLOD=3.3594;culprit=FS;set=variant	GT:AD:DP:GQ:PL	./.	./.	./.	./.	0/0:1,0:1:3.01:0,3,42	./.	0/0:1,0:1:3.01:0,3,31	./.	./.	./.	./.	./.	./.	0/0:1,0:1:3.01:0,3,39	0/0:1,0:1:3.01:0,3,33	0/0:1,0:1:3.01:0,3,32	./.	0/0:1,0:3:9.02:0,9,100	0/0:1,0:1:3.01:0,3,32	./.	./.	0/0:1, [...]
-1	878254	.	C	T	85.52	PASS	AC=8;AF=0.00352;AN=2272;BaseQRankSum=-5.177;DP=5745;Dels=0.00;FS=5.964;HRun=1;HaplotypeScore=0.1128;InbreedingCoeff=-0.0572;MQ=80.88;MQ0=0;MQRankSum=1.091;NDA=1;QD=1.50;ReadPosRankSum=-0.781;SB=-70.68;VQSLOD=1.6977;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:3:9.03:0,9,129	0/0:1,0:8:24.08:0,24,309	0/0:1,0:3:9.03:0,9,124	0/0:1,0:1:3.01:0,3,33	0/0:1,0:5:15.05:0,15,206	0/0:1,0:4:12.04:0,12,145	0/0:1,0:5:15.05:0,15,200	0/0:1,0:2:6.02:0,6,81	0/0:1,0:6:18.06:0,18,22 [...]
-1	878296	rs72902601	C	G	223.90	PASS	AC=5;AF=0.00217;AN=2306;BaseQRankSum=0.013;DB;DP=6410;Dels=0.00;FS=2.317;HRun=1;HaplotypeScore=0.1647;InbreedingCoeff=-0.0498;MQ=84.45;MQ0=1;MQRankSum=-1.556;NDA=3;QD=7.72;ReadPosRankSum=-0.819;SB=29.78;VQSLOD=6.1512;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:2:6.02:0,6,85	0/0:1,0:7:21.06:0,21,240	0/0:1,0:3:9.03:0,9,122	0/0:1,0:3:9.03:0,9,130	0/0:1,0:4:12.04:0,12,154	0/0:6,0:6:18.06:0,18,225	0/0:1,0:7:21.06:0,21,240	0/0:1,0:4:12.03:0,12,130	0/0:7,0: [...]
-1	878310	.	T	C	230.22	PASS	AC=6;AF=0.00259;AN=2314;BaseQRankSum=2.438;DP=6355;Dels=0.00;FS=7.487;HRun=0;HaplotypeScore=0.2096;InbreedingCoeff=-0.0279;MQ=75.89;MQ0=1;MQRankSum=-0.662;NDA=3;QD=6.40;ReadPosRankSum=0.464;SB=24.62;VQSLOD=6.3399;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:2:6.02:0,6,77	0/0:1,0:4:12.04:0,12,148	0/0:1,0:4:12.04:0,12,148	0/0:1,0:3:9.03:0,9,122	0/0:1,0:2:6.02:0,6,80	0/0:1,0:5:15.05:0,15,193	0/0:6,0:6:18.04:0,18,193	0/0:1,0:5:15.04:0,15,167	0/0:7,0:8 [...]
-1	878314	rs142558220	G	C	6737.16	PASS	AC=100;AF=0.04314;AN=2318;BaseQRankSum=4.429;DB;DP=6404;Dels=0.00;FS=33.002;HRun=0;HaplotypeScore=0.2219;InbreedingCoeff=0.0422;MQ=74.44;MQ0=0;MQRankSum=1.067;NDA=3;QD=14.58;ReadPosRankSum=-0.369;SB=-1736.03;VQSLOD=6.0058;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:3:9.03:0,9,120	0/0:1,0:3:9.03:0,9,113	0/0:1,0:4:12.04:0,12,151	0/0:1,0:3:9.03:0,9,127	0/0:1,0:2:6.02:0,6,86	0/0:1,0:7:21.07:0,21,280	0/1:5,1:6:21.95:22,0,170	0/0:1,0:5:15.05:0,15,193	0/0 [...]
-1	878325	rs114478480	C	T	1290.92	PASS	AC=22;AF=0.00954;AN=2306;BaseQRankSum=0.807;DB;DP=6480;Dels=0.00;FS=8.079;HRun=0;HaplotypeScore=0.2133;InbreedingCoeff=0.0090;MQ=69.57;MQ0=1;MQRankSum=1.550;NDA=3;QD=12.29;ReadPosRankSum=-0.505;SB=-430.52;VQSLOD=8.1094;culprit=ReadPosRankSum;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:4:12.04:0,12,175	0/0:1,0:5:15.05:0,15,185	0/0:1,0:3:9.02:0,9,100	0/0:1,0:3:9.03:0,9,103	0/0:1,0:2:6.02:0,6,82	0/0:1,0:9:27.09:0,27,347	0/0:6,0:6:18.05:0,18,217	0/0:1,0:5:15.05:0 [...]
-1	878331	rs148327885	C	T	903.80	PASS	AC=21;AF=0.00898;AN=2338;BaseQRankSum=-0.474;DB;DP=6742;Dels=0.00;FS=1.328;HRun=0;HaplotypeScore=0.1838;InbreedingCoeff=0.0444;MQ=66.59;MQ0=1;MQRankSum=2.307;NDA=2;QD=9.22;ReadPosRankSum=-0.761;SB=-342.88;VQSLOD=6.5208;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:4:12.04:0,12,172	0/0:1,0:6:18.05:0,18,201	0/0:1,0:4:12.03:0,12,122	0/0:1,0:4:12.04:0,12,160	0/0:1,0:1:3.01:0,3,42	0/0:1,0:8:24.08:0,24,315	0/0:1,0:7:21.06:0,21,234	0/0:1,0:7:21.06:0,21,247	0 [...]
-1	878408	rs190069697	C	T	254.67	PASS	AC=1;AF=0.00043;AN=2350;BaseQRankSum=0.190;DB;DP=11638;Dels=0.00;FS=1.390;HRun=0;HaplotypeScore=0.1533;InbreedingCoeff=-0.0243;MQ=73.35;MQ0=0;MQRankSum=0.575;NDA=2;QD=18.19;ReadPosRankSum=-0.629;SB=-67.06;VQSLOD=6.0781;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:8:24.08:0,24,341	0/0:1,0:11:33.10:0,33,407	0/0:1,0:7:21.07:0,21,275	0/0:1,0:7:21.07:0,21,285	0/0:1,0:5:15.05:0,15,217	0/0:1,0:4:12.04:0,12,154	0/0:1,0:5:15.04:0,15,167	0/0:1,0:4 [...]
-1	878425	.	C	T	197.84	PASS	AC=2;AF=0.00085;AN=2356;BaseQRankSum=-0.512;DP=14003;Dels=0.00;FS=6.800;HRun=1;HaplotypeScore=0.1841;InbreedingCoeff=-0.0220;MQ=72.36;MQ0=0;MQRankSum=1.181;NDA=1;QD=6.00;ReadPosRankSum=-0.215;SB=-124.40;VQSLOD=6.3903;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:10:30.10:0,30,426	0/0:1,0:16:48.15:0,48,605	0/0:1,0:9:27.09:0,27,354	0/0:1,0:7:21.07:0,21,296	0/0:1,0:7:21.07:0,21,292	0/0:1,0:4:12.04:0,12,157	0/0:1,0:4:12.04:0,12,151	0/0:1,0:5:15.05:0,15 [...]
-1	878474	rs183873661	C	T	444.43	PASS	AC=3;AF=0.00127;AN=2362;BaseQRankSum=-5.768;DB;DP=14280;Dels=0.00;FS=0.762;HRun=0;HaplotypeScore=0.1971;InbreedingCoeff=-0.0172;MQ=70.51;MQ0=0;MQRankSum=0.190;NDA=2;QD=8.55;ReadPosRankSum=-0.720;SB=-178.80;VQSLOD=6.7250;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:14:42.14:0,42,585	0/0:1,0:12:36.12:0,36,472	0/0:1,0:12:36.11:0,36,454	0/0:1,0:8:24.08:0,24,338	0/0:1,0:12:36.12:0,36,501	0/0:1,0:3:9.03:0,9,120	0/0:10,0:10:27.09:0,27,350	0/0:1,0:7:21.07:0, [...]
-1	878644	.	G	A	226.03	PASS	AC=3;AF=0.00127;AN=2364;BaseQRankSum=-0.122;DP=25048;Dels=0.00;FS=35.316;HRun=0;HaplotypeScore=0.2952;InbreedingCoeff=-0.0072;MQ=95.60;MQ0=0;MQRankSum=-1.258;NDA=3;QD=5.95;ReadPosRankSum=-0.227;SB=-12.93;VQSLOD=4.1589;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:10:30.10:0,30,393	0/0:19,0:19:51.15:0,51,625	0/0:1,0:14:42.14:0,42,550	0/0:1,0:10:30.10:0,30,400	0/0:1,0:7:21.07:0,21,289	0/0:1,0:5:15.05:0,15,200	0/0:1,0:21:63.19:0,63,759	0/0:15,0:15:45.13:0,45,541	0 [...]
-1	878653	rs112422281	A	G	1095.87	PASS	AC=3;AF=0.00127;AN=2364;BaseQRankSum=4.441;DB;DP=24856;Dels=0.00;FS=13.604;HRun=0;HaplotypeScore=0.3227;InbreedingCoeff=-0.0071;MQ=93.11;MQ0=0;MQRankSum=-1.791;NDA=3;QD=14.81;ReadPosRankSum=0.465;SB=-472.43;VQSLOD=6.0957;culprit=MQ;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:10:30.10:0,30,386	0/0:16,0:16:45.12:0,45,527	0/0:1,0:13:39.13:0,39,501	0/0:1,0:11:33.11:0,33,432	0/0:1,0:8:24.08:0,24,330	0/0:6,0:6:18.06:0,18,236	0/0:1,0:23:69.18:0,69,747	0/0:15,0:15:45 [...]
-1	878656	.	G	T	144.02	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=-2.854;DP=25563;Dels=0.00;FS=13.254;HRun=0;HaplotypeScore=0.3242;InbreedingCoeff=-0.0067;MQ=92.49;MQ0=0;MQRankSum=-1.134;NDA=2;QD=11.08;ReadPosRankSum=0.196;SB=-122.31;VQSLOD=6.2398;culprit=MQ;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:12:36.12:0,36,488	0/0:14,0:14:42.13:0,42,529	0/0:1,0:13:39.13:0,39,501	0/0:1,0:12:36.12:0,36,472	0/0:1,0:6:18.06:0,18,256	0/0:6,0:6:18.06:0,18,241	0/0:1,0:24:72.23:0,72,887	0/0:1,0:17:51.16:0,51,629	0 [...]
-1	878667	.	G	T	1244.61	PASS	AC=7;AF=0.00296;AN=2364;BaseQRankSum=-5.435;DP=24575;DS;Dels=0.00;FS=6.041;HRun=0;HaplotypeScore=0.4616;InbreedingCoeff=-0.0092;MQ=80.88;MQ0=0;MQRankSum=-0.829;NDA=2;QD=7.83;ReadPosRankSum=1.618;SB=-336.26;VQSLOD=5.6715;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:13:39.13:0,39,520	0/0:1,0:6:18.06:0,18,227	0/0:1,0:13:39.12:0,39,491	0/0:1,0:11:33.10:0,33,407	0/0:1,0:8:24.08:0,24,325	0/0:1,0:7:21.07:0,21,270	0/0:1,0:22:66.20:0,66,795	0/0:1,0:14:42.13:0,42,506	0 [...]
-1	878676	.	C	T	261.55	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=-0.205;DP=28225;DS;Dels=0.00;FS=16.457;HRun=0;HaplotypeScore=0.7222;InbreedingCoeff=0.0256;MQ=64.88;MQ0=0;MQRankSum=0.709;NDA=3;QD=6.38;ReadPosRankSum=1.287;SB=6.14;VQSLOD=4.2567;culprit=HaplotypeScore;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:9:27.09:0,27,376	0/0:1,0:15:45.14:0,45,555	0/0:1,0:13:39.13:0,39,501	0/0:1,0:8:24.08:0,24,325	0/0:1,0:10:30.10:0,30,400	0/0:1,0:7:21.07:0,21,292	0/0:1,0:27:81.25:0,81,975	0/0:1,0:16:48.15:0,4 [...]
-1	878709	rs144453653	C	T	1463.13	PASS	AC=4;AF=0.00169;AN=2364;BaseQRankSum=4.545;DB;DP=30772;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.3157;InbreedingCoeff=0.0230;MQ=67.14;MQ0=0;MQRankSum=-0.925;NDA=2;QD=12.51;ReadPosRankSum=1.283;SB=-583.42;VQSLOD=5.4027;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:12,0:12:36.10:0,36,450	0/0:1,0:21:63.19:0,63,759	0/0:1,0:12:36.11:0,36,434	0/0:1,0:11:33.11:0,33,432	0/0:10,0:10:30.08:0,30,361	0/0:1,0:6:18.06:0,18,222	0/0:1,0:20:60.13:0,60,612	0/0:1,0:12:36. [...]
-1	878733	.	G	C	722.67	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=1.196;DP=32483;DS;Dels=0.00;FS=34.785;HRun=0;HaplotypeScore=0.2590;InbreedingCoeff=-0.0142;MQ=69.62;MQ0=0;MQRankSum=0.581;NDA=3;QD=12.04;ReadPosRankSum=0.190;SB=-171.66;VQSLOD=5.0944;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:15:45.15:0,45,626	0/0:1,0:28:84.27:0,84,1058	0/0:1,0:15:45.15:0,45,626	0/0:1,0:11:33.11:0,33,469	0/0:1,0:12:36.12:0,36,512	0/0:1,0:7:21.07:0,21,292	0/0:12,0:12:36.06:0,36,424	0/0:7,0:7:1 [...]
-1	878744	rs138897766	G	C	2107.39	PASS	AC=12;AF=0.00508;AN=2364;BaseQRankSum=3.699;DB;DP=30261;Dels=0.00;FS=16.835;HRun=0;HaplotypeScore=0.2378;InbreedingCoeff=-0.0201;MQ=72.93;MQ0=0;MQRankSum=0.368;NDA=3;QD=11.33;ReadPosRankSum=2.206;SB=-927.16;VQSLOD=6.3975;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:14:42.14:0,42,569	0/0:1,0:29:87.26:0,87,1022	0/0:1,0:16:48.16:0,48,640	0/0:1,0:10:30.10:0,30,422	0/0:1,0:15:45.15:0,45,618	0/0:1,0:6:18.06:0,18,236	0/0:10,0:10:30.09:0,30,374 [...]
-1	878745	rs72902602	A	C	541.13	PASS	AC=4;AF=0.00169;AN=2364;BaseQRankSum=-1.730;DB;DP=29217;Dels=0.00;FS=10.700;HRun=0;HaplotypeScore=0.2345;InbreedingCoeff=-0.0177;MQ=73.36;MQ0=0;MQRankSum=0.644;NDA=2;QD=6.85;ReadPosRankSum=0.092;SB=-308.42;VQSLOD=6.3536;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:14:42.14:0,42,577	0/0:1,0:25:75.23:0,75,903	0/0:1,0:14:42.14:0,42,560	0/0:1,0:10:30.10:0,30,418	0/0:1,0:15:45.15:0,45,618	0/0:1,0:5:15.05:0,15,189	0/0:10,0:10:30.06:0,30,350	0/0 [...]
-1	878761	rs35755565	A	AG	448.05	Indel_QD	AC=31;AF=0.01414;AN=2192;BaseQRankSum=3.442;DB;DP=27061;FS=7.246;HRun=7;HaplotypeScore=1.4391;InbreedingCoeff=0.3349;MQ=58.25;MQ0=0;MQRankSum=6.157;NDA=1;QD=1.23;ReadPosRankSum=-1.898;SB=-185.86;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:1:30.08:0,30,337	0/0:1,0:1:60.17:0,60,674	0/0:1,0:1:48.14:0,48,539	0/0:1,0:1:27.08:0,27,303	0/0:1,0:1:39.11:0,39,438	0/0:1,0:1:9.03:0,9,101	0/0:1,0:1:36.10:0,36,404	0/0:3,0:4:11.62:0,12,111	0/0:1,0:1:9.03:0,9,101	0/ [...]
-1	878764	rs180779437	G	C	570.53	PASS	AC=3;AF=0.00127;AN=2362;BaseQRankSum=-1.458;DB;DP=27180;DS;Dels=0.00;FS=0.795;HRun=0;HaplotypeScore=0.3066;InbreedingCoeff=-0.0155;MQ=77.01;MQ0=0;MQRankSum=0.624;NDA=2;QD=11.64;ReadPosRankSum=-0.346;SB=-233.86;VQSLOD=6.0170;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:13:39.13:0,39,528	0/0:1,0:23:69.22:0,69,869	0/0:1,0:15:45.15:0,45,610	0/0:1,0:11:33.11:0,33,447	0/0:1,0:12:36.12:0,36,507	0/0:1,0:5:15.05:0,15,193	0/0:1,0:12:36.11:0,36,423	0/0:4,0:4:12 [...]
-1	878769	.	C	G	669.72	PASS	AC=7;AF=0.00297;AN=2360;BaseQRankSum=-0.891;DP=22087;DS;Dels=0.00;FS=10.150;HRun=7;HaplotypeScore=0.3096;InbreedingCoeff=-0.0231;MQ=78.30;MQ0=0;MQRankSum=0.594;NDA=2;QD=4.59;ReadPosRankSum=-2.948;SB=-264.19;VQSLOD=4.1677;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:11:33.11:0,33,432	0/0:1,0:18:54.17:0,54,666	0/0:1,0:14:42.14:0,42,560	0/0:1,0:10:30.09:0,30,370	0/0:1,0:12:36.12:0,36,501	0/0:1,0:5:15.05:0,15,189	0/0:1,0:9:27.09:0,27,340	0/0:4,0:4:12. [...]
-1	878784	rs142929357	C	G	2333.96	PASS	AC=19;AF=0.00806;AN=2358;BaseQRankSum=7.682;DB;DP=21995;Dels=0.00;FS=26.129;HRun=4;HaplotypeScore=0.2483;InbreedingCoeff=0.0072;MQ=77.12;MQ0=0;MQRankSum=-0.127;NDA=3;QD=11.06;ReadPosRankSum=-5.854;SB=-1081.78;VQSLOD=6.0573;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:8:24.07:0,24,275	0/0:1,0:13:39.11:0,39,447	0/0:1,0:13:39.12:0,39,458	0/0:1,0:7:21.06:0,21,240	0/0:1,0:11:33.11:0,33,424	0/0:1,0:5:15.05:0,15,185	0/0:1,0:8:24.04:0,24,237	0/0:2,0:2:6.01: [...]
-1	878785	rs187587205	G	A	154.05	PASS	AC=5;AF=0.00212;AN=2358;BaseQRankSum=1.056;DB;DP=22546;Dels=0.00;FS=1.420;HRun=0;HaplotypeScore=0.2441;InbreedingCoeff=-0.0016;MQ=76.46;MQ0=0;MQRankSum=1.130;NDA=3;QD=2.80;ReadPosRankSum=-0.329;SB=9.86;VQSLOD=2.3244;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:10:30.10:0,30,386	0/0:1,0:15:45.14:0,45,567	0/0:1,0:15:45.15:0,45,600	0/0:1,0:9:27.09:0,27,340	0/0:1,0:12:36.12:0,36,472	0/0:1,0:6:18.06:0,18,253	0/0:1,0:9:27.08:0,27,309	0/0:2,0:2:6.02:0,6,74	 [...]
-1	878809	rs191952374	C	T	2379.47	PASS	AC=12;AF=0.00509;AN=2358;BaseQRankSum=-7.158;DB;DP=18026;Dels=0.00;FS=0.000;HRun=1;HaplotypeScore=0.0596;InbreedingCoeff=-0.0001;MQ=83.71;MQ0=0;MQRankSum=5.459;NDA=1;QD=13.22;ReadPosRankSum=1.015;SB=-226.93;VQSLOD=8.2616;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:7:21.07:0,21,301	0/0:1,0:15:45.14:0,45,567	0/0:1,0:14:42.13:0,42,529	0/0:1,0:9:27.09:0,27,354	0/0:1,0:9:27.09:0,27,354	0/0:1,0:8:24.08:0,24,341	0/0:1,0:6:18.06:0,18,231	0/0:4,0:4:12.03:0, [...]
-1	879045	.	C	T	310.80	PASS	AC=10;AF=0.00423;AN=2362;BaseQRankSum=1.692;DP=12971;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.3476;InbreedingCoeff=-0.0250;MQ=70.55;MQ0=0;MQRankSum=-0.063;NDA=3;QD=2.66;ReadPosRankSum=0.103;SB=-95.32;VQSLOD=1.6109;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:8:24.08:0,24,320	0/0:1,0:5:15.05:0,15,189	0/0:1,0:7:21.07:0,21,259	0/0:1,0:8:24.08:0,24,302	0/0:11,0:11:33.11:0,33,476	0/0:1,0:7:21.07:0,21,275	0/0:1,0:15:45.14:0,45,529	0/0:8,0:8:24.06:0,24,287	0/0:1,0: [...]
-1	879060	rs186768085	C	T	178.33	PASS	AC=2;AF=0.00085;AN=2362;BaseQRankSum=-2.758;DB;DP=14742;Dels=0.00;FS=16.111;HRun=0;HaplotypeScore=0.3498;InbreedingCoeff=-0.0180;MQ=70.61;MQ0=0;MQRankSum=0.836;NDA=2;QD=3.72;ReadPosRankSum=0.265;SB=-103.55;VQSLOD=2.0271;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:7:21.07:0,21,275	0/0:1,0:4:12.04:0,12,148	0/0:1,0:6:18.06:0,18,253	0/0:1,0:7:21.07:0,21,280	0/0:13,0:13:39.13:0,39,549	0/0:1,0:10:30.10:0,30,412	0/0:1,0:12:36.11:0,36,434	0/0:1 [...]
-1	879090	.	C	A	1219.01	TruthSensitivityTranche99.30to99.50	AC=2;AF=0.00085;AN=2364;BaseQRankSum=-27.199;DP=18527;Dels=0.02;FS=56.628;HRun=1;HaplotypeScore=0.8406;InbreedingCoeff=0.1134;MQ=61.65;MQ0=0;MQRankSum=11.240;NDA=3;QD=1.39;ReadPosRankSum=1.781;SB=-327.63;VQSLOD=-4.1026;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:3:9.03:0,9,131	0/0:11,0:11:30.08:0,30,368	0/0:1,0:11:33.11:0,33,416	0/0:1,0:7:21.07:0,21,292	0/0:1,0:14:42.14:0,42,560	0/0:1,0:12:36.12:0,36,472	0/0:1,0:6:18.06:0 [...]
-1	879095	.	G	A	231.79	TruthSensitivityTranche98.50to98.80	AC=3;AF=0.00127;AN=2364;BaseQRankSum=-9.250;DP=19365;Dels=0.00;FS=0.000;HRun=1;HaplotypeScore=0.8663;InbreedingCoeff=-0.0143;MQ=60.09;MQ0=0;MQRankSum=1.310;NDA=3;QD=2.90;ReadPosRankSum=-0.443;SB=-73.14;VQSLOD=0.1700;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:4:12.04:0,12,172	0/0:13,0:13:36.11:0,36,451	0/0:1,0:11:33.11:0,33,454	0/0:1,0:8:24.08:0,24,320	0/0:1,0:14:42.14:0,42,591	0/0:1,0:15:45.15:0,45,600	0/0:1,0:6:18.06:0,1 [...]
-1	879108	.	A	C	2045.21	TruthSensitivityTranche99.50to99.90	AC=174;AF=0.07360;AN=2364;BaseQRankSum=-22.465;DP=20020;Dels=0.00;FS=3200.000;HRun=3;HaplotypeScore=0.6535;InbreedingCoeff=-0.0715;MQ=59.51;MQ0=2;MQRankSum=2.710;NDA=2;QD=0.79;ReadPosRankSum=-21.990;SB=-568.80;VQSLOD=-65.2733;culprit=FS;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:7:21.07:0,21,285	0/0:1,0:9:27.08:0,27,309	0/0:1,0:12:36.11:0,36,454	0/0:1,0:7:21.07:0,21,285	0/0:1,0:15:45.14:0,45,567	0/0:1,0:13:39.12:0,39,481	0/1:5,2:7: [...]
-1	879115	.	C	G	98.78	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=0.335;DP=28840;DS;Dels=0.00;FS=1.686;HRun=0;HaplotypeScore=0.4535;InbreedingCoeff=-0.0059;MQ=59.65;MQ0=2;MQRankSum=-1.112;NDA=2;QD=5.81;ReadPosRankSum=1.173;SB=-52.08;VQSLOD=4.2445;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:11:33.11:0,33,459	0/0:1,0:20:60.19:0,60,740	0/0:15,0:15:45.15:0,45,613	0/0:1,0:7:21.07:0,21,289	0/0:1,0:14:42.14:0,42,577	0/0:1,0:17:51.17:0,51,701	0/0:9,0:9:27.08:0,27,336	0/0:1,0:10:30.10:0,30,386	0/0 [...]
-1	879135	rs149790558	C	T	710.99	PASS	AC=2;AF=0.00085;AN=2364;BaseQRankSum=1.067;DB;DP=33389;Dels=0.00;FS=4.041;HRun=1;HaplotypeScore=0.2819;InbreedingCoeff=-0.0065;MQ=65.56;MQ0=0;MQRankSum=-0.395;NDA=2;QD=9.61;ReadPosRankSum=0.089;SB=-349.93;VQSLOD=6.0187;culprit=MQ;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:17:51.17:0,51,731	0/0:1,0:24:72.23:0,72,907	0/0:1,0:16:48.16:0,48,650	0/0:1,0:10:30.10:0,30,393	0/0:1,0:15:45.15:0,45,618	0/0:1,0:20:60.20:0,60,835	0/0:1,0:15:45.15:0,45,590	0/0:15,0:15:42.1 [...]
-1	879142	rs148506094	C	G	986.92	PASS	AC=2;AF=0.00085;AN=2364;BaseQRankSum=5.008;DB;DP=34146;Dels=0.00;FS=52.989;HRun=0;HaplotypeScore=0.2258;InbreedingCoeff=0.0374;MQ=69.31;MQ0=0;MQRankSum=-1.263;NDA=1;QD=13.71;ReadPosRankSum=1.568;SB=-27.67;VQSLOD=4.0467;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:17:51.17:0,51,718	0/0:1,0:22:66.21:0,66,849	0/0:1,0:18:54.18:0,54,708	0/0:1,0:11:33.11:0,33,459	0/0:1,0:18:54.18:0,54,708	0/0:1,0:19:57.19:0,57,783	0/0:1,0:17:51.16:0,51,656	0/0:16,0:16:48.1 [...]
-1	879145	rs146548754	A	C	921.44	PASS	AC=2;AF=0.00085;AN=2364;BaseQRankSum=4.040;DB;DP=35077;Dels=0.00;FS=79.622;HRun=1;HaplotypeScore=0.2058;InbreedingCoeff=0.0239;MQ=71.45;MQ0=0;MQRankSum=-0.552;NDA=2;QD=12.80;ReadPosRankSum=1.074;SB=4.65;VQSLOD=3.8967;culprit=FS;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:20:60.20:0,60,835	0/0:1,0:27:81.25:0,81,998	0/0:1,0:19:57.19:0,57,793	0/0:1,0:12:36.12:0,36,501	0/0:1,0:17:51.17:0,51,691	0/0:1,0:22:66.22:0,66,907	0/0:1,0:19:57.17:0,57,653	0/0:1,0:16:48.14:0 [...]
-1	879203	.	A	C	100.14	PASS	AC=1;AF=0.00042;AN=2364;BaseQRankSum=-1.334;DP=34081;Dels=0.00;FS=11.356;HRun=0;HaplotypeScore=0.2129;InbreedingCoeff=-0.0083;MQ=77.56;MQ0=0;MQRankSum=-0.721;NDA=1;QD=6.26;ReadPosRankSum=0.498;SB=-58.31;VQSLOD=6.5553;culprit=QD;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:13:39.13:0,39,511	0/0:1,0:34:99:0,102,1199	0/0:1,0:29:87.28:0,87,1119	0/0:1,0:14:42.14:0,42,585	0/0:1,0:24:72.24:0,72,990	0/0:1,0:26:78.25:0,78,983	0/0:1,0:17:51.15:0,51,599	0/0:1,0:9:27.09:0,27,340	0/0 [...]
-1	879257	.	C	T	66.87	TruthSensitivityTranche98.50to98.80	AC=4;AF=0.00169;AN=2364;BaseQRankSum=-0.888;DP=41699;Dels=0.00;FS=1.728;HRun=0;HaplotypeScore=0.2694;InbreedingCoeff=0.0216;MQ=68.26;MQ0=0;MQRankSum=3.451;NDA=3;QD=1.39;ReadPosRankSum=0.465;SB=-95.37;VQSLOD=0.1895;culprit=QD;set=FilteredInAll	GT:AD:DP:GQ:PL	0/0:1,0:34:99:0,102,1312	0/0:1,0:36:99:0,108,1204	0/0:1,0:40:99:0,120,1479	0/0:1,0:23:69.22:0,69,887	0/0:1,0:29:87.28:0,87,1140	0/0:1,0:31:93.30:0,93,1172	0/0:1,0:5:15.05:0,15,1 [...]
-1	879276	rs115454328	A	G	5560.08	PASS	AC=15;AF=0.00635;AN=2364;BaseQRankSum=5.676;DB;DP=43812;DS;Dels=0.00;FS=9.312;HRun=0;HaplotypeScore=0.1675;InbreedingCoeff=-0.0144;MQ=62.93;MQ0=0;MQRankSum=3.476;NDA=1;QD=11.91;ReadPosRankSum=-1.874;SB=-2673.29;VQSLOD=6.6274;culprit=InbreedingCoeff;set=variant	GT:AD:DP:GQ:PL	0/0:1,0:36:99:0,108,1463	0/0:1,0:41:99:0,123,1445	0/0:1,0:37:99:0,111,1480	0/0:1,0:25:75.25:0,75,1044	0/0:1,0:35:99:0,105,1462	0/0:1,0:29:87.28:0,87,1119	0/0:7,0:7:21.06:0,21,241 [...]
-1	879317	rs7523549	C	T	82570.47	PASS	AC=186;AF=0.07868;AN=2364;BaseQRankSum=2.488;DB;DP=36267;DS;Dels=0.00;FS=14.862;HM3;HRun=0;HaplotypeScore=0.3150;InbreedingCoeff=0.1203;MQ=61.86;MQ0=0;MQRankSum=7.931;NDA=2;QD=17.21;ReadPosRankSum=3.682;SB=-25054.87;VQSLOD=6.5687;culprit=MQRankSum;set=variant	GT:AD:DP:GQ:PL	0/1:19,17:36:99:558,0,622	0/0:1,0:30:90.27:0,90,1058	0/0:1,0:35:99:0,105,1350	0/0:1,0:26:78.25:0,78,983	0/0:1,0:23:69.22:0,69,887	0/0:1,0:28:84.27:0,84,1080	0/0:1,0:12:36.11:0,36,4 [...]
diff --git a/src/test/resources/htsjdk/variant/VCF4HeaderTest.vcf b/src/test/resources/htsjdk/variant/VCF4HeaderTest.vcf
deleted file mode 100644
index 9af0cb3..0000000
--- a/src/test/resources/htsjdk/variant/VCF4HeaderTest.vcf
+++ /dev/null
@@ -1,42 +0,0 @@
-##fileformat=VCFv4.0
-##FILTER=<ID=ABFilter,Description="AB  0.75 && DP  40">
-##FILTER=<ID=DPFilter,Description="DP  120 || SB  -0.10">
-##FILTER=<ID=FDRtranche0.00to0.10,Description="FDR tranche level at qual 0.06">
-##FILTER=<ID=FDRtranche0.10to1.00,Description="FDR tranche level at qual 0.03">
-##FILTER=<ID=FDRtranche1.00to2.00,Description="FDR tranche level at qual 0.02">
-##FILTER=<ID=FDRtranche2.00to10.00+,Description="FDR tranche level at qual > 0.06">
-##FILTER=<ID=FDRtranche2.00to10.00,Description="FDR tranche level at qual unknown">
-##FILTER=<ID=HARD_TO_VALIDATE,Description="MQ0 = 4 && ((MQ0 / (1.0 * DP))  0.1)">
-##FILTER=<ID=Indel,Description="Overlaps a user-input mask">
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=LowQual,Description="QUAL  50.0">
-##FILTER=<ID=ANNOTATION,Description="ANNOTATION != \"NA\" || ANNOTATION <= 0.01">
-##FILTER=<ID=ANNOTATION2,Description="ANNOTATION with quote \" that is unmatched but escaped">
-##FILTER=<ID=SnpCluster,Description="SNPs found in clusters">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth (only filtered reads used for calling)">
-##FORMAT=<ID=GL,Number=3,Type=Float,Description="Log-scaled likelihoods for AA,AB,BB genotypes where A=ref and B=alt; not applicable if site is not biallelic">
-##FORMAT=<ID=GQ,Number=1,Type=Float,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##INFO=<ID=AC,Number=.,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=HRun,Number=1,Type=Integer,Description="Largest Contiguous Homopolymer Run of Variant Allele In Either Direction">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with two (and only two) segregating haplotypes">
-##INFO=<ID=EscapingQuote,Number=1,Type=Float,Description="This description has an escaped \" quote in it">
-##INFO=<ID=EscapingBackslash,Number=1,Type=Float,Description="This description has an escaped \\ backslash in it">
-##INFO=<ID=EscapingNonQuoteOrBackslash,Number=1,Type=Float,Description="This other value has a \n newline in it">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=OQ,Number=1,Type=Float,Description="The original variant quality score">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-23/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-24/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-5/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessi [...]
-##VariantFiltration="analysis_type=VariantFiltration input_file=[] read_buffer_size=null read_filter=[] intervals=null excludeIntervals=[chrM, chrY] reference_sequence=/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta rodBind=[variant,VCF,wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.vcf, mask,Bed,wgs.v9/HiSeq.WGS.cleaned.indels.10.mask] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null hapmap=null hapmap_chip=null out=wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.in [...]
-##VariantFiltration="analysis_type=VariantFiltration input_file=[] read_buffer_size=null read_filter=[] intervals=null excludeIntervals=[chrM, chrY] reference_sequence=/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta rodBind=[variant,VCF,wgs.v9/HiSeq.WGS.cleaned.ug.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null hapmap=null hapmap_chip=null out=wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.vcf err=null outerr=null filterZeroMappingQualityReads=false dow [...]
-##source=VariantOptimizer
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA12878	
-chr1	109	.	A	T	0	FDRtranche2.00to10.00+	AC=1;AF=0.50;AN=2;DP=1019;Dels=0.00;HRun=0;HaplotypeScore=686.65;MQ=19.20;MQ0=288;OQ=2175.54;QD=2.13;SB=-1042.18	GT:AD:DP:GL:GQ	0/1:610,327:308:-316.30,-95.47,-803.03:99
diff --git a/src/test/resources/htsjdk/variant/VQSR.mixedTest.recal b/src/test/resources/htsjdk/variant/VQSR.mixedTest.recal
deleted file mode 100644
index 37b8274..0000000
--- a/src/test/resources/htsjdk/variant/VQSR.mixedTest.recal
+++ /dev/null
@@ -1,32 +0,0 @@
-##fileformat=VCFv4.1
-##INFO=<ID=END,Number=1,Type=Integer,Description="x">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=10,length=135534747,assembly=b37>
-##contig=<ID=11,length=135006516,assembly=b37>
-##contig=<ID=12,length=133851895,assembly=b37>
-##contig=<ID=13,length=115169878,assembly=b37>
-##contig=<ID=14,length=107349540,assembly=b37>
-##contig=<ID=15,length=102531392,assembly=b37>
-##contig=<ID=16,length=90354753,assembly=b37>
-##contig=<ID=17,length=81195210,assembly=b37>
-##contig=<ID=18,length=78077248,assembly=b37>
-##contig=<ID=19,length=59128983,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=20,length=63025520,assembly=b37>
-##contig=<ID=21,length=48129895,assembly=b37>
-##contig=<ID=22,length=51304566,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-##contig=<ID=4,length=191154276,assembly=b37>
-##contig=<ID=5,length=180915260,assembly=b37>
-##contig=<ID=6,length=171115067,assembly=b37>
-##contig=<ID=7,length=159138663,assembly=b37>
-##contig=<ID=8,length=146364022,assembly=b37>
-##contig=<ID=9,length=141213431,assembly=b37>
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	
-20	1000177	.	N	<VQSR>	.	.	END=1000177;VQSLOD=-1.2345;culprit=FS
-20	1000177	.	N	<VQSR>	.	.	END=1000178;VQSLOD=-1.2377;culprit=HaplotypeScore
-20	1000382	.	N	<VQSR>	.	.	END=1000386;VQSLOD=-0.5534;culprit=HaplotypeScore
-20	1000382	.	N	<VQSR>	.	.	END=1000382;VQSLOD=-0.5678;culprit=FS
-20	1000442	.	N	<VQSR>	.	.	END=1000446;VQSLOD=3.5923;culprit=QD
diff --git a/src/test/resources/htsjdk/variant/breakpoint.vcf b/src/test/resources/htsjdk/variant/breakpoint.vcf
deleted file mode 100644
index ced1e3e..0000000
--- a/src/test/resources/htsjdk/variant/breakpoint.vcf
+++ /dev/null
@@ -1,6 +0,0 @@
-##fileformat=VCFv4.1
-##INFO=<ID=SVTYPE,Number=1,Type=String,Description="Type of structural variant">
-##contig=<ID=chr12,length=133851895>
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO
-chr12	203475	.	T	t[chr12:203540[	36	.	SVTYPE=BND
-chr12	203475	.	T	T[chr12:203540[	36	.	SVTYPE=BND
diff --git a/src/test/resources/htsjdk/variant/dbsnp_135.b37.1000.vcf b/src/test/resources/htsjdk/variant/dbsnp_135.b37.1000.vcf
deleted file mode 100644
index 948e8a3..0000000
--- a/src/test/resources/htsjdk/variant/dbsnp_135.b37.1000.vcf
+++ /dev/null
@@ -1,249 +0,0 @@
-##fileformat=VCFv4.1
-##FILTER=<ID=NC,Description="Inconsistent Genotype Submission For At Least One Sample">
-##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=ASP,Number=0,Type=Flag,Description="Is Assembly specific. This is set if the variant only maps to one assembly">
-##INFO=<ID=ASS,Number=0,Type=Flag,Description="In acceptor splice site FxnCode = 73">
-##INFO=<ID=CDA,Number=0,Type=Flag,Description="Variation is interrogated in a clinical diagnostic assay">
-##INFO=<ID=CFL,Number=0,Type=Flag,Description="Has Assembly conflict. This is for weight 1 and 2 variant that maps to different chromosomes on different assemblies.">
-##INFO=<ID=CLN,Number=0,Type=Flag,Description="Variant is Clinical(LSDB,OMIM,TPA,Diagnostic)">
-##INFO=<ID=DSS,Number=0,Type=Flag,Description="In donor splice-site FxnCode = 75">
-##INFO=<ID=G5,Number=0,Type=Flag,Description=">5% minor allele frequency in 1+ populations">
-##INFO=<ID=G5A,Number=0,Type=Flag,Description=">5% minor allele frequency in each and all populations">
-##INFO=<ID=GCF,Number=0,Type=Flag,Description="Has Genotype Conflict Same (rs, ind), different genotype.  N/N is not included.">
-##INFO=<ID=GENEINFO,Number=1,Type=String,Description="Pairs each of gene symbol:gene id.  The gene symbol and id are delimited by a colon (:) and each pair is delimited by a vertical bar (|)">
-##INFO=<ID=GMAF,Number=1,Type=Float,Description="Global Minor Allele Frequency [0, 0.5]; global population is 1000GenomesProject phase 1 genotype data from 629 individuals, released in the 08-04-2010 dataset">
-##INFO=<ID=GNO,Number=0,Type=Flag,Description="Genotypes available. The variant has individual genotype (in SubInd table).">
-##INFO=<ID=HD,Number=0,Type=Flag,Description="Marker is on high density genotyping kit (50K density or greater).  The variant may have phenotype associations present in dbGaP.">
-##INFO=<ID=INT,Number=0,Type=Flag,Description="In Intron FxnCode = 6">
-##INFO=<ID=KGPROD,Number=0,Type=Flag,Description="1000 Genome production phase">
-##INFO=<ID=KGPilot1,Number=0,Type=Flag,Description="1000 Genome discovery(pilot1) 2009">
-##INFO=<ID=KGPilot123,Number=0,Type=Flag,Description="1000 Genome discovery all pilots 2010(1,2,3)">
-##INFO=<ID=KGVAL,Number=0,Type=Flag,Description="1000 Genome validated by second method">
-##INFO=<ID=LSD,Number=0,Type=Flag,Description="Submitted from a locus-specific database">
-##INFO=<ID=MTP,Number=0,Type=Flag,Description="Microattribution/third-party annotation(TPA:GWAS,PAGE)">
-##INFO=<ID=MUT,Number=0,Type=Flag,Description="Is mutation (journal citation, explicit fact): a low frequency variation that is cited in journal and other reputable sources">
-##INFO=<ID=NOC,Number=0,Type=Flag,Description="Contig allele not present in variant allele list. The reference sequence allele at the mapped position is not present in the variant allele list, adjusted for orientation.">
-##INFO=<ID=NOV,Number=0,Type=Flag,Description="Rs cluster has non-overlapping allele sets. True when rs set has more than 2 alleles from different submissions and these sets share no alleles in common.">
-##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
-##INFO=<ID=NSF,Number=0,Type=Flag,Description="Has non-synonymous frameshift A coding region variation where one allele in the set changes all downstream amino acids. FxnClass = 44">
-##INFO=<ID=NSM,Number=0,Type=Flag,Description="Has non-synonymous missense A coding region variation where one allele in the set changes protein peptide. FxnClass = 42">
-##INFO=<ID=NSN,Number=0,Type=Flag,Description="Has non-synonymous nonsense A coding region variation where one allele in the set changes to STOP codon (TER). FxnClass = 41">
-##INFO=<ID=OM,Number=0,Type=Flag,Description="Has OMIM/OMIA">
-##INFO=<ID=OTH,Number=0,Type=Flag,Description="Has other variant with exactly the same set of mapped positions on NCBI refernce assembly.">
-##INFO=<ID=PH1,Number=0,Type=Flag,Description="Phase 1 genotyped: filtered, non-redundant">
-##INFO=<ID=PH2,Number=0,Type=Flag,Description="Phase 2 genotyped: filtered, non-redundant">
-##INFO=<ID=PH3,Number=0,Type=Flag,Description="Phase 3 genotyped: filtered, non-redundant">
-##INFO=<ID=PM,Number=0,Type=Flag,Description="Variant is Precious(Clinical,Pubmed Cited)">
-##INFO=<ID=PMC,Number=0,Type=Flag,Description="Links exist to PubMed Central article">
-##INFO=<ID=R3,Number=0,Type=Flag,Description="In 3' gene region FxnCode = 13">
-##INFO=<ID=R5,Number=0,Type=Flag,Description="In 5' gene region FxnCode = 15">
-##INFO=<ID=REF,Number=0,Type=Flag,Description="Has reference A coding region variation where one allele in the set is identical to the reference sequence. FxnCode = 8">
-##INFO=<ID=RSPOS,Number=1,Type=Integer,Description="Chr position reported in dbSNP">
-##INFO=<ID=RV,Number=0,Type=Flag,Description="RS orientation is reversed">
-##INFO=<ID=S3D,Number=0,Type=Flag,Description="Has 3D structure - SNP3D table">
-##INFO=<ID=SAO,Number=1,Type=Integer,Description="Variant Allele Origin: 0 - unspecified, 1 - Germline, 2 - Somatic, 3 - Both">
-##INFO=<ID=SCS,Number=1,Type=Integer,Description="Variant Clinical Significance, 0 - unknown, 1 - untested, 2 - non-pathogenic, 3 - probable-non-pathogenic, 4 - probable-pathogenic, 5 - pathogenic, 6 - drug-response, 7 - histocompatibility, 255 - other">
-##INFO=<ID=SLO,Number=0,Type=Flag,Description="Has SubmitterLinkOut - From SNP->SubSNP->Batch.link_out">
-##INFO=<ID=SSR,Number=1,Type=Integer,Description="Variant Suspect Reason Code, 0 - unspecified, 1 - Paralog, 2 - byEST, 3 - Para_EST, 4 - oldAlign, 5 - other">
-##INFO=<ID=SYN,Number=0,Type=Flag,Description="Has synonymous A coding region variation where one allele in the set does not change the encoded amino acid. FxnCode = 3">
-##INFO=<ID=TPA,Number=0,Type=Flag,Description="Provisional Third Party Annotation(TPA) (currently rs from PHARMGKB who will give phenotype data)">
-##INFO=<ID=U3,Number=0,Type=Flag,Description="In 3' UTR Location is in an untranslated region (UTR). FxnCode = 53">
-##INFO=<ID=U5,Number=0,Type=Flag,Description="In 5' UTR Location is in an untranslated region (UTR). FxnCode = 55">
-##INFO=<ID=VC,Number=1,Type=String,Description="Variation Class">
-##INFO=<ID=VLD,Number=0,Type=Flag,Description="Is Validated.  This bit is set if the variant has 2+ minor allele count based on frequency or genotype data.">
-##INFO=<ID=VP,Number=1,Type=String,Description="Variation Property">
-##INFO=<ID=WGT,Number=1,Type=Integer,Description="Weight, 00 - unmapped, 1 - weight 1, 2 - weight 2, 3 - weight 3 or more">
-##INFO=<ID=WTD,Number=0,Type=Flag,Description="Is Withdrawn by submitter If one member ss is withdrawn by submitter, then this bit is set.  If all member ss' are withdrawn, then the rs is deleted to SNPHistory">
-##INFO=<ID=dbSNPBuildID,Number=1,Type=Integer,Description="First dbSNP Build for RS">
-##LeftAlignVariants="analysis_type=LeftAlignVariants input_file=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta rodBind=[] nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities= [...]
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=10,length=135534747,assembly=b37>
-##contig=<ID=11,length=135006516,assembly=b37>
-##contig=<ID=12,length=133851895,assembly=b37>
-##contig=<ID=13,length=115169878,assembly=b37>
-##contig=<ID=14,length=107349540,assembly=b37>
-##contig=<ID=15,length=102531392,assembly=b37>
-##contig=<ID=16,length=90354753,assembly=b37>
-##contig=<ID=17,length=81195210,assembly=b37>
-##contig=<ID=18,length=78077248,assembly=b37>
-##contig=<ID=19,length=59128983,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=20,length=63025520,assembly=b37>
-##contig=<ID=21,length=48129895,assembly=b37>
-##contig=<ID=22,length=51304566,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-##contig=<ID=4,length=191154276,assembly=b37>
-##contig=<ID=5,length=180915260,assembly=b37>
-##contig=<ID=6,length=171115067,assembly=b37>
-##contig=<ID=7,length=159138663,assembly=b37>
-##contig=<ID=8,length=146364022,assembly=b37>
-##contig=<ID=9,length=141213431,assembly=b37>
-##contig=<ID=GL000191.1,length=106433,assembly=b37>
-##contig=<ID=GL000192.1,length=547496,assembly=b37>
-##contig=<ID=GL000193.1,length=189789,assembly=b37>
-##contig=<ID=GL000194.1,length=191469,assembly=b37>
-##contig=<ID=GL000195.1,length=182896,assembly=b37>
-##contig=<ID=GL000196.1,length=38914,assembly=b37>
-##contig=<ID=GL000197.1,length=37175,assembly=b37>
-##contig=<ID=GL000198.1,length=90085,assembly=b37>
-##contig=<ID=GL000199.1,length=169874,assembly=b37>
-##contig=<ID=GL000200.1,length=187035,assembly=b37>
-##contig=<ID=GL000201.1,length=36148,assembly=b37>
-##contig=<ID=GL000202.1,length=40103,assembly=b37>
-##contig=<ID=GL000203.1,length=37498,assembly=b37>
-##contig=<ID=GL000204.1,length=81310,assembly=b37>
-##contig=<ID=GL000205.1,length=174588,assembly=b37>
-##contig=<ID=GL000206.1,length=41001,assembly=b37>
-##contig=<ID=GL000207.1,length=4262,assembly=b37>
-##contig=<ID=GL000208.1,length=92689,assembly=b37>
-##contig=<ID=GL000209.1,length=159169,assembly=b37>
-##contig=<ID=GL000210.1,length=27682,assembly=b37>
-##contig=<ID=GL000211.1,length=166566,assembly=b37>
-##contig=<ID=GL000212.1,length=186858,assembly=b37>
-##contig=<ID=GL000213.1,length=164239,assembly=b37>
-##contig=<ID=GL000214.1,length=137718,assembly=b37>
-##contig=<ID=GL000215.1,length=172545,assembly=b37>
-##contig=<ID=GL000216.1,length=172294,assembly=b37>
-##contig=<ID=GL000217.1,length=172149,assembly=b37>
-##contig=<ID=GL000218.1,length=161147,assembly=b37>
-##contig=<ID=GL000219.1,length=179198,assembly=b37>
-##contig=<ID=GL000220.1,length=161802,assembly=b37>
-##contig=<ID=GL000221.1,length=155397,assembly=b37>
-##contig=<ID=GL000222.1,length=186861,assembly=b37>
-##contig=<ID=GL000223.1,length=180455,assembly=b37>
-##contig=<ID=GL000224.1,length=179693,assembly=b37>
-##contig=<ID=GL000225.1,length=211173,assembly=b37>
-##contig=<ID=GL000226.1,length=15008,assembly=b37>
-##contig=<ID=GL000227.1,length=128374,assembly=b37>
-##contig=<ID=GL000228.1,length=129120,assembly=b37>
-##contig=<ID=GL000229.1,length=19913,assembly=b37>
-##contig=<ID=GL000230.1,length=43691,assembly=b37>
-##contig=<ID=GL000231.1,length=27386,assembly=b37>
-##contig=<ID=GL000232.1,length=40652,assembly=b37>
-##contig=<ID=GL000233.1,length=45941,assembly=b37>
-##contig=<ID=GL000234.1,length=40531,assembly=b37>
-##contig=<ID=GL000235.1,length=34474,assembly=b37>
-##contig=<ID=GL000236.1,length=41934,assembly=b37>
-##contig=<ID=GL000237.1,length=45867,assembly=b37>
-##contig=<ID=GL000238.1,length=39939,assembly=b37>
-##contig=<ID=GL000239.1,length=33824,assembly=b37>
-##contig=<ID=GL000240.1,length=41933,assembly=b37>
-##contig=<ID=GL000241.1,length=42152,assembly=b37>
-##contig=<ID=GL000242.1,length=43523,assembly=b37>
-##contig=<ID=GL000243.1,length=43341,assembly=b37>
-##contig=<ID=GL000244.1,length=39929,assembly=b37>
-##contig=<ID=GL000245.1,length=36651,assembly=b37>
-##contig=<ID=GL000246.1,length=38154,assembly=b37>
-##contig=<ID=GL000247.1,length=36422,assembly=b37>
-##contig=<ID=GL000248.1,length=39786,assembly=b37>
-##contig=<ID=GL000249.1,length=38502,assembly=b37>
-##contig=<ID=MT,length=16569,assembly=b37>
-##contig=<ID=X,length=155270560,assembly=b37>
-##contig=<ID=Y,length=59373566,assembly=b37>
-##dbSNP_BUILD_ID=135
-##fileDate=20111104
-##phasing=partial
-##reference=GRCh37.3
-##reference=file:///humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta
-##source=dbSNP
-##variationPropertyDocumentationUrl=ftp://ftp.ncbi.nlm.nih.gov/snp/specs/dbSNP_BitField_latest.pdf	
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	
-1	10144	rs144773400	TA	T	.	PASS	ASP;RSPOS=10145;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1	10228	rs143255646	TA	T	.	PASS	ASP;RSPOS=10229;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1	10234	rs145599635	C	T	.	PASS	ASP;RSPOS=10234;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	10248	rs148908337	A	T	.	PASS	ASP;RSPOS=10248;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	10254	rs140194106	TA	T	.	PASS	ASP;RSPOS=10255;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1	10291	rs145427775	C	T	.	PASS	ASP;RSPOS=10291;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	10327	rs112750067	T	C	.	PASS	ASP;GENEINFO=LOC100652771:100652771;RSPOS=10327;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=132
-1	10329	rs150969722	AC	A	.	PASS	ASP;RSPOS=10330;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1	10351	rs145072688	CTA	C,CA	.	PASS	ASP;RSPOS=10352;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1	10382	rs147093981	AAC	A,AC	.	PASS	ASP;RSPOS=10383;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1	10433	rs56289060	A	AC	.	PASS	ASP;GENEINFO=LOC100652771:100652771;RSPOS=10433;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=129
-1	10439	rs112766696	AC	A	.	PASS	ASP;GENEINFO=LOC100652771:100652771;GNO;RSPOS=10440;SAO=0;SLO;SSR=0;VC=DIV;VP=050100000004000100000200;WGT=0;dbSNPBuildID=132
-1	10439	rs138941843	AC	A	.	PASS	ASP;RSPOS=10440;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1	10440	rs112155239	C	A	.	PASS	ASP;GENEINFO=LOC100652771:100652771;RSPOS=10440;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=132
-1	10492	rs55998931	C	T	.	PASS	ASP;GENEINFO=LOC100652771:100652771;GMAF=0.0617001828153565;RSPOS=10492;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040000000100;WGT=0;dbSNPBuildID=129
-1	10519	rs62636508	G	C	.	PASS	ASP;GENEINFO=LOC100652771:100652771;RSPOS=10519;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=129
-1	10583	rs58108140	G	A	.	PASS	ASP;GENEINFO=LOC100652771:100652771;GMAF=0.270566727605119;KGPilot123;RSPOS=10583;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040010000100;WGT=0;dbSNPBuildID=129
-1	10611	rs189107123	C	G	.	PASS	KGPilot123;RSPOS=10611;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	10828	rs10218492	G	A	.	PASS	ASP;GENEINFO=LOC100652771:100652771;RSPOS=10828;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=119
-1	10904	rs10218493	G	A	.	PASS	ASP;GENEINFO=LOC100652771:100652771;GNO;RSPOS=10904;SAO=0;SSR=0;VC=SNV;VP=050000000004000100000100;WGT=0;dbSNPBuildID=119
-1	10927	rs10218527	A	G	.	PASS	ASP;GENEINFO=LOC100652771:100652771;RSPOS=10927;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=119
-1	10938	rs28853987	G	A	.	PASS	ASP;GENEINFO=LOC100652771:100652771;RSPOS=10938;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=125
-1	11014	rs28484712	G	A	.	PASS	ASP;GENEINFO=LOC100652771:100652771;RSPOS=11014;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=125
-1	11022	rs28775022	G	A	.	PASS	ASP;GENEINFO=LOC100652771:100652771;RSPOS=11022;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=125
-1	11081	rs10218495	G	T	.	PASS	CFL;GENEINFO=LOC100652771:100652771;GNO;RSPOS=11081;SAO=0;SSR=0;VC=SNV;VP=050000000008000100000100;WGT=0;dbSNPBuildID=119
-1	11863	rs187669455	C	A	.	PASS	RSPOS=11863;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=135
-1	13302	rs180734498	C	T	.	PASS	KGPilot123;RSPOS=13302;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	13327	rs144762171	G	C	.	PASS	ASP;KGPilot123;RSPOS=13327;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1	13684	rs71260404	C	T	.	PASS	GENEINFO=LOC100652771:100652771;GNO;RSPOS=13684;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000000100000100;WGT=0;dbSNPBuildID=130
-1	13980	rs151276478	T	C	.	PASS	ASP;KGPilot123;RSPOS=13980;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1	14889	rs142444908	G	A	.	PASS	ASP;RSPOS=14889;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	14907	rs79585140	A	G	.	PASS	GNO;RSPOS=14907;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000000040100000100;WGT=0;dbSNPBuildID=131
-1	14930	rs75454623	A	G	.	PASS	GNO;RSPOS=14930;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000000040100000100;WGT=0;dbSNPBuildID=131
-1	14976	rs71252251	G	A	.	PASS	ASP;GNO;RSPOS=14976;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000004000100000100;WGT=0;dbSNPBuildID=130
-1	15061	rs71268703	T	TG	.	PASS	ASP;GNO;RSPOS=15061;RV;SAO=0;SLO;SSR=0;VC=DIV;VP=050100000004000100000200;WGT=0;dbSNPBuildID=130
-1	15118	rs71252250	A	G	.	PASS	ASP;GNO;RSPOS=15118;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000004000100000100;WGT=0;dbSNPBuildID=130
-1	15211	rs144718396	T	G	.	PASS	ASP;RSPOS=15211;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	15211	rs78601809	T	G	.	PASS	ASP;GNO;RSPOS=15211;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040100000100;WGT=0;dbSNPBuildID=131
-1	16257	rs78588380	G	C	.	PASS	ASP;GNO;RSPOS=16257;SAO=0;SSR=0;VC=SNV;VP=050000000004000100000100;WGT=0;dbSNPBuildID=131
-1	16378	rs148220436	T	C	.	PASS	ASP;RSPOS=16378;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	16495	rs141130360	G	C	.	PASS	ASP;RSPOS=16495;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	16497	rs150723783	A	G	.	PASS	ASP;RSPOS=16497;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	17519	rs192890528	G	T	.	PASS	RSPOS=17519;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=135
-1	19226	rs138930629	T	A	.	PASS	ASP;RSPOS=19226;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	20141	rs56336884	G	A	.	PASS	HD;RSPOS=20141;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000000400000100;WGT=0;dbSNPBuildID=129
-1	20144	rs143346096	G	A	.	PASS	ASP;RSPOS=20144;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	20206	rs71262675	C	T	.	PASS	GNO;RSPOS=20206;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000000100000100;WGT=0;dbSNPBuildID=130
-1	20245	rs71262674	G	A	.	PASS	GMAF=0.256398537477148;GNO;RSPOS=20245;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000000100000100;WGT=0;dbSNPBuildID=130
-1	20304	rs71262673	G	C	.	PASS	GMAF=0.338208409506399;GNO;RSPOS=20304;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000000100000100;WGT=0;dbSNPBuildID=130
-1	26999	rs147506580	A	G	.	PASS	ASP;RSPOS=26999;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	29436	rs2462493	G	A	.	PASS	GNO;RSPOS=29436;SAO=0;SSR=0;VC=SNV;VP=050000000000000100000100;WGT=0;dbSNPBuildID=100
-1	30923	rs140337953	G	T	.	PASS	ASP;KGPilot123;RSPOS=30923;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1	33487	rs77459554	C	T	.	PASS	ASP;GNO;RSPOS=33487;SAO=0;SSR=0;VC=SNV;VP=050000000004000100000100;WGT=0;dbSNPBuildID=131
-1	33495	rs75468675	C	T	.	PASS	ASP;GNO;RSPOS=33495;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040100000100;WGT=0;dbSNPBuildID=131
-1	33505	rs75627161	T	C	.	PASS	ASP;GNO;RSPOS=33505;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040100000100;WGT=0;dbSNPBuildID=131
-1	33508	rs75609629	A	T	.	PASS	ASP;GNO;RSPOS=33508;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040100000100;WGT=0;dbSNPBuildID=131
-1	33521	rs76098219	T	A	.	PASS	GNO;RSPOS=33521;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000000040100000100;WGT=0;dbSNPBuildID=131
-1	33593	rs557585	G	A	.	PASS	RSPOS=33593;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=83
-1	33648	rs62028204	G	T	.	PASS	RSPOS=33648;RV;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=129
-1	33656	rs113821789	T	C	.	PASS	RSPOS=33656;RV;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=132
-1	51476	rs187298206	T	C	.	PASS	KGPilot123;RSPOS=51476;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	51479	rs116400033	T	A	.	PASS	ASP;G5;G5A;GMAF=0.113802559414991;KGPilot123;RSPOS=51479;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004070010000100;WGT=0;dbSNPBuildID=132
-1	51803	rs62637812	T	C	.	PASS	GMAF=0.468921389396709;RSPOS=51803;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000000040000000100;WGT=0;dbSNPBuildID=129
-1	51898	rs76402894	C	A	.	PASS	GMAF=0.0731261425959781;GNO;RSPOS=51898;SAO=0;SSR=0;VC=SNV;VP=050000000000000100000100;WGT=0;dbSNPBuildID=131
-1	51914	rs190452223	T	G	.	PASS	KGPilot123;RSPOS=51914;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	51928	rs78732933	G	A	.	PASS	GNO;RSPOS=51928;SAO=0;SSR=0;VC=SNV;VP=050000000000000100000100;WGT=0;dbSNPBuildID=131
-1	51935	rs181754315	C	T	.	PASS	KGPilot123;RSPOS=51935;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	51954	rs185832753	G	C	.	PASS	KGPilot123;RSPOS=51954;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	52058	rs62637813	G	C	.	PASS	GMAF=0.0342778793418647;KGPilot123;RSPOS=52058;SAO=0;SSR=1;VC=SNV;VLD;VP=050000000000040010000140;WGT=0;dbSNPBuildID=129
-1	52144	rs190291950	T	A	.	PASS	KGPilot123;RSPOS=52144;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	52238	rs150021059	T	G	.	PASS	ASP;KGPilot123;RSPOS=52238;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1	54353	rs140052487	C	A	.	PASS	ASP;KGPilot123;RSPOS=54353;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1	54421	rs146477069	A	G	.	PASS	ASP;KGPilot123;RSPOS=54421;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1	54490	rs141149254	G	A	.	PASS	ASP;KGPilot123;RSPOS=54490;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1	54676	rs2462492	C	T	.	PASS	ASP;GMAF=0.191956124314442;GNO;HD;KGPilot123;RSPOS=54676;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040510000100;WGT=0;dbSNPBuildID=100
-1	54753	rs143174675	T	G	.	PASS	ASP;KGPilot123;RSPOS=54753;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1	54788	rs59861892	CC	C,CCT	.	PASS	ASP;RSPOS=54789;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=129
-1	54795	rs58014817	T	A	.	PASS	ASP;RSPOS=54795;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=129
-1	55164	rs3091274	C	A	.	PASS	G5;G5A;GMAF=0.145338208409506;GNO;KGPilot123;RSPOS=55164;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000030110000100;WGT=0;dbSNPBuildID=103
-1	55299	rs10399749	C	T	.	PASS	G5;G5A;GMAF=0.278793418647166;GNO;KGPilot123;PH2;RSPOS=55299;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000030112000100;WGT=0;dbSNPBuildID=119
-1	55302	rs3091273	C	T	.	PASS	RSPOS=55302;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=103
-1	55313	rs182462964	A	T	.	PASS	KGPilot123;RSPOS=55313;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	55322	rs3107974	C	T	.	PASS	RSPOS=55322;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=103
-1	55326	rs3107975	T	C	.	PASS	GNO;HD;KGPilot123;RSPOS=55326;SAO=0;SSR=0;VC=SNV;VP=050000000000000510000100;WGT=0;dbSNPBuildID=103
-1	55330	rs185215913	G	A	.	PASS	KGPilot123;RSPOS=55330;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	55367	rs190850374	G	A	.	PASS	KGPilot123;RSPOS=55367;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	55388	rs182711216	C	T	.	PASS	KGPilot123;RSPOS=55388;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	55394	rs2949420	T	A	.	PASS	GNO;KGPilot123;PH2;RSPOS=55394;SAO=0;SSR=0;VC=SNV;VP=050000000000000112000100;WGT=0;dbSNPBuildID=101
-1	55416	rs193242050	G	A	.	PASS	KGPilot123;RSPOS=55416;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	55427	rs183189405	T	C	.	PASS	KGPilot123;RSPOS=55427;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	55545	rs28396308	C	T	.	PASS	GNO;RSPOS=55545;SAO=0;SSR=0;VC=SNV;VP=050000000000000100000100;WGT=0;dbSNPBuildID=125
-1	55816	rs187434873	G	A	.	PASS	KGPilot123;RSPOS=55816;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	55850	rs191890754	C	G	.	PASS	KGPilot123;RSPOS=55850;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	55852	rs184233019	G	C	.	PASS	KGPilot123;RSPOS=55852;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	56644	rs143342222	A	C	.	PASS	ASP;KGPilot123;RSPOS=56644;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1	57952	rs189727433	A	C	.	PASS	KGPilot123;RSPOS=57952;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1	58771	rs140128481	T	C	.	PASS	ASP;RSPOS=58771;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1	58814	rs114420996	G	A	.	PASS	ASP;G5;GMAF=0.0982632541133455;KGPilot123;RSPOS=58814;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004050010000100;WGT=0;dbSNPBuildID=132
-1	59040	rs149755937	T	C	.	PASS	ASP;KGPilot123;RSPOS=59040;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
diff --git a/src/test/resources/htsjdk/variant/diagnosis_targets_testfile.vcf b/src/test/resources/htsjdk/variant/diagnosis_targets_testfile.vcf
deleted file mode 100644
index fbe8d1e..0000000
--- a/src/test/resources/htsjdk/variant/diagnosis_targets_testfile.vcf
+++ /dev/null
@@ -1,117 +0,0 @@
-##fileformat=VCFv4.1
-##DiagnoseTargets="analysis_type=DiagnoseTargets input_file=[/humgen/gsa-hpprojects/GATK/data/Validation_Data/CEUTrio.HiSeq.b37.chr20.10_11mb.bam] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=[/humgen/gsa-hpprojects/GATK/data/Validation_Data/DT-itest.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/1kg [...]
-##FILTER=<ID=BAD_MATE,Description="the reads are not properly mated, suggesting mapping errors">
-##FILTER=<ID=COVERAGE_GAPS,Description="absolutely no coverage was observed at a locus, regardless of the filtering parameters">
-##FILTER=<ID=EXCESSIVE_COVERAGE,Description="more than -maxDepth read at the locus, indicating some sort of mapping problem">
-##FILTER=<ID=LOW_COVERAGE,Description="there were less than min. depth bases at the locus, after applying filters">
-##FILTER=<ID=LOW_MEDIAN_DEPTH,Description="interval has insufficient median depth across samples">
-##FILTER=<ID=NO_READS,Description="there are no reads contained in the interval">
-##FILTER=<ID=PASS,Description="the base satisfied the min. depth for calling but had less than maxDepth to avoid having EXCESSIVE_COVERAGE">
-##FILTER=<ID=POOR_QUALITY,Description="more than --maxFractionOfReadsWithLowMAPQ at the locus, indicating a poor mapping quality of the reads">
-##FILTER=<ID=REF_N,Description="the reference base was an N, which is not considered callable the GATK">
-##FORMAT=<ID=AVG_INTERVAL_DP,Number=1,Type=Float,Description="Average depth across the interval. Sum of the depth in a loci divided by interval size.">
-##FORMAT=<ID=FT,Number=1,Type=String,Description="Genotype-level filter">
-##FORMAT=<ID=MED,Number=1,Type=Float,Description="Median of depth distribution.">
-##FORMAT=<ID=Q1,Number=1,Type=Float,Description="Lower Quartile of depth distribution.">
-##FORMAT=<ID=Q3,Number=1,Type=Float,Description="Upper Quartile of depth Distribution.">
-##INFO=<ID="Diagnose Targets",Number=0,Type=Flag,Description="DiagnoseTargets mode">
-##INFO=<ID=AVG_INTERVAL_DP,Number=1,Type=Float,Description="Average depth across the interval. Sum of the depth in a loci divided by interval size.">
-##INFO=<ID=END,Number=1,Type=Integer,Description="Stop position of the interval">
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-##contig=<ID=4,length=191154276,assembly=b37>
-##contig=<ID=5,length=180915260,assembly=b37>
-##contig=<ID=6,length=171115067,assembly=b37>
-##contig=<ID=7,length=159138663,assembly=b37>
-##contig=<ID=8,length=146364022,assembly=b37>
-##contig=<ID=9,length=141213431,assembly=b37>
-##contig=<ID=10,length=135534747,assembly=b37>
-##contig=<ID=11,length=135006516,assembly=b37>
-##contig=<ID=12,length=133851895,assembly=b37>
-##contig=<ID=13,length=115169878,assembly=b37>
-##contig=<ID=14,length=107349540,assembly=b37>
-##contig=<ID=15,length=102531392,assembly=b37>
-##contig=<ID=16,length=90354753,assembly=b37>
-##contig=<ID=17,length=81195210,assembly=b37>
-##contig=<ID=18,length=78077248,assembly=b37>
-##contig=<ID=19,length=59128983,assembly=b37>
-##contig=<ID=20,length=63025520,assembly=b37>
-##contig=<ID=21,length=48129895,assembly=b37>
-##contig=<ID=22,length=51304566,assembly=b37>
-##contig=<ID=X,length=155270560,assembly=b37>
-##contig=<ID=Y,length=59373566,assembly=b37>
-##contig=<ID=MT,length=16569,assembly=b37>
-##contig=<ID=GL000207.1,length=4262,assembly=b37>
-##contig=<ID=GL000226.1,length=15008,assembly=b37>
-##contig=<ID=GL000229.1,length=19913,assembly=b37>
-##contig=<ID=GL000231.1,length=27386,assembly=b37>
-##contig=<ID=GL000210.1,length=27682,assembly=b37>
-##contig=<ID=GL000239.1,length=33824,assembly=b37>
-##contig=<ID=GL000235.1,length=34474,assembly=b37>
-##contig=<ID=GL000201.1,length=36148,assembly=b37>
-##contig=<ID=GL000247.1,length=36422,assembly=b37>
-##contig=<ID=GL000245.1,length=36651,assembly=b37>
-##contig=<ID=GL000197.1,length=37175,assembly=b37>
-##contig=<ID=GL000203.1,length=37498,assembly=b37>
-##contig=<ID=GL000246.1,length=38154,assembly=b37>
-##contig=<ID=GL000249.1,length=38502,assembly=b37>
-##contig=<ID=GL000196.1,length=38914,assembly=b37>
-##contig=<ID=GL000248.1,length=39786,assembly=b37>
-##contig=<ID=GL000244.1,length=39929,assembly=b37>
-##contig=<ID=GL000238.1,length=39939,assembly=b37>
-##contig=<ID=GL000202.1,length=40103,assembly=b37>
-##contig=<ID=GL000234.1,length=40531,assembly=b37>
-##contig=<ID=GL000232.1,length=40652,assembly=b37>
-##contig=<ID=GL000206.1,length=41001,assembly=b37>
-##contig=<ID=GL000240.1,length=41933,assembly=b37>
-##contig=<ID=GL000236.1,length=41934,assembly=b37>
-##contig=<ID=GL000241.1,length=42152,assembly=b37>
-##contig=<ID=GL000243.1,length=43341,assembly=b37>
-##contig=<ID=GL000242.1,length=43523,assembly=b37>
-##contig=<ID=GL000230.1,length=43691,assembly=b37>
-##contig=<ID=GL000237.1,length=45867,assembly=b37>
-##contig=<ID=GL000233.1,length=45941,assembly=b37>
-##contig=<ID=GL000204.1,length=81310,assembly=b37>
-##contig=<ID=GL000198.1,length=90085,assembly=b37>
-##contig=<ID=GL000208.1,length=92689,assembly=b37>
-##contig=<ID=GL000191.1,length=106433,assembly=b37>
-##contig=<ID=GL000227.1,length=128374,assembly=b37>
-##contig=<ID=GL000228.1,length=129120,assembly=b37>
-##contig=<ID=GL000214.1,length=137718,assembly=b37>
-##contig=<ID=GL000221.1,length=155397,assembly=b37>
-##contig=<ID=GL000209.1,length=159169,assembly=b37>
-##contig=<ID=GL000218.1,length=161147,assembly=b37>
-##contig=<ID=GL000220.1,length=161802,assembly=b37>
-##contig=<ID=GL000213.1,length=164239,assembly=b37>
-##contig=<ID=GL000211.1,length=166566,assembly=b37>
-##contig=<ID=GL000199.1,length=169874,assembly=b37>
-##contig=<ID=GL000217.1,length=172149,assembly=b37>
-##contig=<ID=GL000216.1,length=172294,assembly=b37>
-##contig=<ID=GL000215.1,length=172545,assembly=b37>
-##contig=<ID=GL000205.1,length=174588,assembly=b37>
-##contig=<ID=GL000219.1,length=179198,assembly=b37>
-##contig=<ID=GL000224.1,length=179693,assembly=b37>
-##contig=<ID=GL000223.1,length=180455,assembly=b37>
-##contig=<ID=GL000195.1,length=182896,assembly=b37>
-##contig=<ID=GL000212.1,length=186858,assembly=b37>
-##contig=<ID=GL000222.1,length=186861,assembly=b37>
-##contig=<ID=GL000200.1,length=187035,assembly=b37>
-##contig=<ID=GL000193.1,length=189789,assembly=b37>
-##contig=<ID=GL000194.1,length=191469,assembly=b37>
-##contig=<ID=GL000225.1,length=211173,assembly=b37>
-##contig=<ID=GL000192.1,length=547496,assembly=b37>
-##reference=file:///humgen/1kg/reference/human_g1k_v37.fasta
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA12878	NA12891	NA12892
-20	10000023	.	T	<DT>	.	PASS	AVG_INTERVAL_DP=206.11;END=10001189	AVG_INTERVAL_DP:MED:Q1:Q3	68.95:69.00:57.50:80.00	67.11:69.00:54.00:80.00	70.05:74.00:58.00:81.00
-20	10002751	.	T	<DT>	.	PASS	AVG_INTERVAL_DP=198.60;END=10021423	AVG_INTERVAL_DP:MED:Q1:Q3	69.75:74.00:61.00:81.00	64.78:69.00:56.00:78.00	64.07:66.00:56.00:77.00
-20	10094508	.	A	<DT>	.	PASS	AVG_INTERVAL_DP=217.07;END=10096841	AVG_INTERVAL_DP:MED:Q1:Q3	76.65:75.00:69.00:83.00	71.52:73.00:65.00:80.00	68.90:69.00:63.00:75.00
-20	10098364	.	G	<DT>	.	LOW_COVERAGE;LOW_MEDIAN_DEPTH	AVG_INTERVAL_DP=5.49;END=10098654	AVG_INTERVAL_DP:FT:MED:Q1:Q3	0.766:LOW_COVERAGE:1.00:1.00:1.00	0.880:COVERAGE_GAPS;LOW_COVERAGE:1.00:0.00:1.00	3.85:LOW_COVERAGE:2.00:2.00:6.00
-20	10153007	.	G	<DT>	.	PASS	AVG_INTERVAL_DP=61.42;END=10153151	AVG_INTERVAL_DP:MED:Q1:Q3	25.07:24.00:19.00:29.00	16.37:15.00:11.00:25.00	19.99:17.00:14.00:27.00
-20	10199324	.	T	<DT>	.	LOW_COVERAGE;LOW_MEDIAN_DEPTH	AVG_INTERVAL_DP=28.87;END=10199468	AVG_INTERVAL_DP:FT:MED:Q1:Q3	5.12:LOW_COVERAGE:3.00:1.00:7.00	9.19:LOW_COVERAGE:9.00:4.00:13.00	14.56:PASS:14.00:10.00:19.00
-20	10267798	.	T	<DT>	.	PASS	AVG_INTERVAL_DP=79.25;END=10268380	AVG_INTERVAL_DP:MED:Q1:Q3	32.66:29.00:20.00:50.00	22.02:19.00:11.00:37.00	24.57:21.00:10.00:39.00
-20	10375592	.	G	<DT>	.	LOW_MEDIAN_DEPTH	AVG_INTERVAL_DP=18.73;END=10376174	AVG_INTERVAL_DP:FT:MED:Q1:Q3	8.29:PASS:8.00:2.00:14.00	5.42:PASS:5.00:3.00:7.00	5.02:POOR_QUALITY:4.00:2.00:7.00
-20	10528943	.	T	<DT>	.	PASS	AVG_INTERVAL_DP=206.86;END=10566288	AVG_INTERVAL_DP:MED:Q1:Q3	72.22:72.00:64.00:81.00	66.76:68.00:59.00:76.00	67.89:69.00:59.00:78.00
-20	10655065	.	T	<DT>	.	LOW_COVERAGE;LOW_MEDIAN_DEPTH	AVG_INTERVAL_DP=9.86;END=10655136	AVG_INTERVAL_DP:FT:MED:Q1:Q3	0.931:COVERAGE_GAPS;LOW_COVERAGE:1.00:0.00:1.00	3.01:LOW_COVERAGE:3.00:2.00:3.50	5.92:PASS:6.00:5.00:7.00
-20	10958482	.	C	<DT>	.	PASS	AVG_INTERVAL_DP=93.29;END=10958626	AVG_INTERVAL_DP:MED:Q1:Q3	22.12:19.00:15.00:28.00	32.63:34.00:28.00:37.00	38.53:37.00:34.00:41.00
-20	10999884	.	A	<DT>	.	COVERAGE_GAPS	AVG_INTERVAL_DP=125.93;END=11000174	AVG_INTERVAL_DP:FT:MED:Q1:Q3	44.32:COVERAGE_GAPS:61.00:0.00:74.00	41.63:COVERAGE_GAPS:47.00:0.00:68.00	39.98:COVERAGE_GAPS:48.00:0.00:70.00
diff --git a/src/test/resources/htsjdk/variant/ex2.bgzf.bcf.csi b/src/test/resources/htsjdk/variant/ex2.bgzf.bcf.csi
deleted file mode 100755
index 722375b..0000000
Binary files a/src/test/resources/htsjdk/variant/ex2.bgzf.bcf.csi and /dev/null differ
diff --git a/src/test/resources/htsjdk/variant/ex2.vcf b/src/test/resources/htsjdk/variant/ex2.vcf
deleted file mode 100644
index 17b1896..0000000
--- a/src/test/resources/htsjdk/variant/ex2.vcf
+++ /dev/null
@@ -1,23 +0,0 @@
-##fileformat=VCFv4.1
-##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta
-##contig=<ID=20,length=62435964,assembly=B36,md5=f126cdf8a6e0c7f379d618ff66beb2da,species="Homo sapiens">
-##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency">
-##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
-##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
-##INFO=<ID=HOMSEQ,Number=.,Type=String>
-##FILTER=<ID=q10,Description="Quality below 10">
-##FILTER=<ID=s50,Description="Less than 50% of samples have data">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
-##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
-##FORMAT=<ID=CNL,Number=.,Type=Integer>
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA00001	NA00002	NA00003
-20	14370	rs6054257	G	A	29.1	.	NS=3;DP=14;AF=0.5;HOMSEQ;DB	GT:GQ:DP:HQ:CNL	0|0:48:1:25,30:10,20	1|0:48:8:49,51:.	./.:43:5:.,.:1
-20	17330	.	T	A	.	q10;s50	NS=3;DP=11;AF=0.017;H2	GT:GQ:DP:HQ	0|0:49:3:58,50	0|1:3:5:65,3	0/0:41:3:4,5
-20	1110696	rs6040355	A	G,T	67	PASS	NS=2;DP=10;AF=0.333,0.667;AA=T;DB	GT:GQ:DP:HQ	1|2:21:6:23,27	2|1:2:0:18,2	2/2:35:4:10,20
-20	1230237	.	T	.	47	PASS	NS=3;DP=13;AA=T	GT:GQ:DP:HQ	0|0:54:7:56,60	0|0:48:4:51,51	./.
-20	1234567	microsat1	GTC	G,GTCT	50	PASS	NS=3;DP=9;AA=G	GT:GQ:DP	0/1:35:4	0/2:17:2	1/1:40:3
diff --git a/src/test/resources/htsjdk/variant/serialization_test.bcf b/src/test/resources/htsjdk/variant/serialization_test.bcf
deleted file mode 100644
index 8c84efb..0000000
Binary files a/src/test/resources/htsjdk/variant/serialization_test.bcf and /dev/null differ
diff --git a/src/test/resources/htsjdk/variant/serialization_test.bcf.idx b/src/test/resources/htsjdk/variant/serialization_test.bcf.idx
deleted file mode 100644
index 4d6699e..0000000
Binary files a/src/test/resources/htsjdk/variant/serialization_test.bcf.idx and /dev/null differ
diff --git a/src/test/resources/htsjdk/variant/structuralvariants.vcf b/src/test/resources/htsjdk/variant/structuralvariants.vcf
deleted file mode 100644
index 5ffad2f..0000000
--- a/src/test/resources/htsjdk/variant/structuralvariants.vcf
+++ /dev/null
@@ -1,22 +0,0 @@
-##fileformat=VCFv4.2
-##INFO=<ID=END,Number=1,Type=Integer,Description="End position of the variant described in this record">
-##INFO=<ID=END_CHR,Number=A,Type=String,Description="End chromosome of the variant described in this record">
-##INFO=<ID=IMPRECISE,Number=0,Type=Flag,Description="Imprecise structural variation">
-##INFO=<ID=SVLEN,Number=A,Type=Integer,Description="Difference in length between REF and ALT alleles">
-##INFO=<ID=SVTYPE,Number=A,Type=String,Description="Type of structural variant">
-##INFO=<ID=STRAND_1,Number=1,Type=String,Description="Strand Orientation of SV Start">
-##INFO=<ID=STRAND_2,Number=1,Type=String,Description="Strand Orientation of SV End">
-##INFO=<ID=METHOD,Number=1,Type=String,Description="SV Caller used to predict">
-##INFO=<ID=DP,Number=1,Type=String,Description="combined depth across samples">
-##ALT=<ID=DEL,Description="Deletion">
-##ALT=<ID=DUP,Description="Duplication">
-##ALT=<ID=INS,Description="Insertion of novel sequence">
-##ALT=<ID=INV,Description="Inversion">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=AO,Number=1,Type=Integer,Description="Alternate Allele Observations">
-##contig=<ID=1,length=14640000>
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	SAMPLE1
-1	20	.	N	<DUP>	1	.	IMPRECISE;SVTYPE=DUP;END=4641652;END_CHR=1;STRAND_1=-;STRAND_2=+;SVLEN=4641632;METHOD=LUMPY;DP=90	GT:AO	1/1:90
-1	33	.	N	<DUP>	1	.	IMPRECISE;SVTYPE=DUP;END=2640388;END_CHR=1;STRAND_1=-;STRAND_2=+;SVLEN=2640355;METHOD=LUMPY;DP=3	GT:AO	1/1:3
-1	70	.	N	<DEL>	1	.	IMPRECISE;SVTYPE=DEL;END=4641583;END_CHR=1;STRAND_1=+;STRAND_2=-;SVLEN=-4641513;METHOD=LUMPY;DP=1	GT:AO	1/1:1
-1	101	.	N	<INV>	1	.	IMPRECISE;SVTYPE=INV;END=1988714;END_CHR=1;STRAND_1=-;STRAND_2=-;SVLEN=1988613;METHOD=LUMPY;DP=2	GT:AO	1/1:2
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.dict b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.dict
deleted file mode 100644
index 8dd3e5b..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD	VN:1.0	SO:unsorted
- at SQ	SN:chrM	LN:16571	UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta	M5:d2ed829b8a1628d16cbeee88e88e39eb
- at SQ	SN:chr20	LN:1000000	UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta	M5:b4eac854d70893986ac578c53c2324f1
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta
deleted file mode 100644
index 9b75d10..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta
+++ /dev/null
@@ -1,16946 +0,0 @@
->chrM
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTT
-CGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTC
-GCAGTATCTGTCTTTGATTCCTGCCTCATTCTATTATTTATCGCACCTACGTTCAATATT
-ACAGGCGAACATACCTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATA
-ACAATTGAATGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCA
-AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGCCAAACCCCAA
-AAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAATTTTATCTTTAGGCGGTATGC
-ACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTA
-ATCTCATCAATACAACCCCCGCCCATCCTACCCAGCACACACACACCGCTGCTAACCCCA
-TACCCCGAACCAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCCTCA
-AAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGG
-TCCTAGCCTTTCTATTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGA
-GTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGC
-TCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAACCTTTAGCAAT
-AAACGAAAGTTTAACTAAGCTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACC
-GCGGTCACACGATTAACCCAAGTCAATAGAAGCCGGCGTAAAGAGTGTTTTAGATCACCC
-CCTCCCCAATAAAGCTAAAACTCACCTGAGTTGTAAAAAACTCCAGTTGACACAAAATAG
-ACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAACTGGGATTA
-GATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAG
-AACACTACGAGCCACAGCTTAAAACTCAAAGGACCTGGCGGTGCTTCATATCCCTCTAGA
-GGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATA
-TACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAA
-AGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCAAGAAATGGGCTACATTTTCTACCCC
-AGAAAACTACGATAGCCCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTG
-AGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCC
-TCAAGTATACTTCAAAGGACATTTAACTAAAACCCCTACGCATTTATATAGAGGAGACAA
-GTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACA
-CAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAAACC
-TAGCCCCAAACCCACTCCACCTTACTACCAGACAACCTTAGCCAAACCATTTACCCAAAT
-AAAGTATAGGCGATAGAAATTGAAACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGA
-TGAAAAATTATAACCAAGCATAATATAGCAAGGACTAACCCCTATACCTTCTGCATAATG
-AATTAACTAGAAATAACTTTGCAAGGAGAGCCAAAGCTAAGACCCCCGAAACCAGACGAG
-CTACCTAAGAACAGCTAAAAGAGCACACCCGTCTATGTAGCAAAATAGTGGGAAGATTTA
-TAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTT
-AGTTCAACTTTAAATTTGCCCACAGAACCCTCTAAATCCCCTTGTAAATTTAACTGTTAG
-TCCAAAGAGGAACAGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAAAATT
-TAACACCCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACC
-CACTACCTAAAAAATCCCAAACATATAACTGAACTCCTCACACCCAATTGGACCAATCTA
-TCACCCTATAGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAA
-GCCTGCGTCAGATCAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCA
-ACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAAGGAAAGGTTAA
-AAAAAGTAAAAGGAACTCGGCAAACCTTACCCCGCCTGTTTACCAAAAACATCACCTCTA
-GCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACC
-CTAACCGTGCAaaggtagcataatcacttgttccttaaatagggacctgtatgaatggct
-ccacgagggttcagctgtctcttacttttaaccagtgaaattgacctgcccgtgaagagg
-cgggcatgacacagcaagacgagaagaccctatggagctttaatttaTTAATGCAAACAG
-TACCTAACAAACCCACAGGTCCTAAACTACCAAACCTGCATTAAAAATTTCGGTTGGGGC
-GACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCG
-AACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAA
-CAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGAT
-CAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAACGATTAAAGTCCT
-ACGTGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTC
-CCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATG
-ATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTgttaagatgg
-cagagcccggtaatcgcataaaacttaaaactttacagtcagaggttcaattcctcttct
-taacaacaTACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGC
-ATTCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAA
-CGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCATAAAACTCTTCACCAA
-AGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGC
-TCTCACCATCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCT
-CAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTG
-ATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCA
-AACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGG
-CTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATC
-ATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTT
-CGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGG
-CCCCTTCGCCCTATTCTTCATAGCCGAATACACAAACATTATTATAATAAACACCCTCAC
-CACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTACACAACATA
-TTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCC
-CCGATTCCGCTACGACCAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCCT
-AGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCCCCCTCAAAC
-CTAAGAAATATGTCTGATAAAAGAGTTACTTTGATAGAGTAAATAATAGGAGCTTAAACC
-CCCTTATTTctaggactatgagaatcgaacccatccctgagaatccaaaattctccgtgc
-cacctatcacaccccatcctaAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCC
-GAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTAC
-TCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACCTGA
-GTAGGCCTAGAAATAAACATGCTAGCTTTTATTCCAGTTCTAACCAAAAAAATAAACCCT
-CGTTCCACAGAAGCTGCCATCAAGTATTTCCTCACGCAAGCAACCGCATCCATAATCCTT
-CTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGAACCATAACCAATACTACC
-AATCAATACTCATCATTAATAATCATAATGGCTATAGCAATAAAACTAGGAATAGCCCCC
-TTTCACTTCTGAGTCCCAGAGGTTACCCAAGGCACCCCTCTGACATCCGGCCTGCTTCTT
-CTCACATGACAAAAACTAGCCCCCATCTCAATCATATACCAAATCTCTCCCTCACTAAAC
-GTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGATTA
-AACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATA
-ATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATC
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTA
-TCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCC
-CTAGGAGGCCTGCCCCCGCTAACCGGCTTTTTGCCCAAATGGGCCATTATCGAAGAATTC
-ACAAAAAACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTC
-TACTTCTACCTACGCCTAATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAAC
-GTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATC
-GCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATACTAATAATCTTATAGAAATTT
-AGGTTAAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTG
-CAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTA
-ATTAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGC
-TAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCGGGA
-GAAGCCCCGGCAGGTTTGAAGCTGCTTCTTCGAATTTGCAATTCAATATGAAAATCACCT
-CGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTC
-AGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCAC
-AAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCT
-CTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCAC
-ATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCC
-ATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATG
-GCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTG
-CTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTA
-GCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTA
-GCAGGTGTCTCCTCTATCTTAGGGGCCATCAATTTCATCACAACAATTATCAATATAAAA
-CCCCCTGCCATAACCCAATACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATCACAGCA
-GTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGAC
-CGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGGAGACCCCATTCTATACCAA
-CACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATCCTACCAGGCTTCGGA
-ATAATCTCCCATATTGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGT
-ATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATA
-TTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATC
-GCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATG
-AAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGC
-CTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTAC
-GTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGC
-TTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATC
-CATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGC
-CTATCCGGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATC
-CTATCATCTGTAGGCTCATTCATTTCTCTAACAGCAGTAATATTAATAATTTTCATGATT
-TGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTG
-GAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGAAGAACCCGTATACATAAAA
-TCTAGACAaaaaaggaaggaatcgaaccccccaaagctggtttcaagccaaccccatggc
-ctccatgactttttcAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAA
-TTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACG
-CTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTT
-TCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTA
-ATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCA
-TCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACG
-ATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCG
-ACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCG
-ACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTA
-TAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAA
-CAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTAT
-ACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAG
-AATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATTTACCCTATAGCACCCCCTCT
-ACCCCCTCTAGAGCCCACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAA
-GAGAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCA
-TAATTACCCCCATACTCCTTACACTATTCCTCATCACCCAACTAAAAATATTAAACACAA
-ACTACCACCTACCTCCCTCACCAAAGCCCATAAAAATAAAAAATTATAACAAACCCTGAG
-AACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACC
-CGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCAT
-CAACAACCGACTAATCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGAT
-AGCCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTT
-TATTGCCACAACTAACCTCCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACT
-ATCTATAAACCTAGCCATGGCCATCCCCTTATGAGCGGGCGCAGTGATTATAGGCTTTCG
-CTCTAAGATTAAAAATGCCCTAGCCCACTTCTTACCACAAGGCACACCTACACCCCTTAT
-CCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGT
-ACGCCTAACCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCAC
-CCTAGCAATATCAACCATTAACCTTCCCTCTACACTTATCATCTTCACAATTCTAATTCT
-ACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGT
-AAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTA
-AAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTA
-GCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACA
-CTAACCATATACCAATGGTGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCAC
-ACACCACCTGTCCAAAAAGGCCTTCGATACGGGATAATCCTATTTATTACCTCAGAAGTT
-TTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAA
-CTAGGAGGGCACTGGCCCCCAACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTC
-CTAAACACATCCGTATTACTCGCATCAGGAGTATCAATCACCTGAGCTCACCATAGTCTA
-ATAGAAAACAACCGAAACCAAATAATTCAAGCACTGCTTATTACAATTTTACTGGGTCTC
-TATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGC
-ATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGC
-TCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACAT
-CACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTTTGACTATTT
-CTGTATGTCTCCATCTATTGATGAGGGTCTTACTCTTTTAGTATAAATAGTACCGTTAAC
-TTCCAATTAACTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCCTTAATTTTA
-ATAATCAACACCCTCCTAGCCTTACTACTAATAATTATTACATTTTGACTACCACAACTC
-AACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCC
-CGCGTCCCTTTCTCCATAAAATTCTTCTTAGTAGCTATTACCTTCTTATTATTTGATCTA
-GAAATTGCCCTCCTTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATA
-GTTATGTCATCCCTCTTATTAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTA
-CAAAAAGGATTAGACTGAGCCGAATTGGTATATAGTTTAAACAAAACGAATGATTTCGAC
-TCATTAAATTATGATAATCATATTTACCAAATGCCCCTCATTTACATAAATATTATACTA
-GCATTTACCATCTCACTTCTAGGAATACTAGTATATCGCTCACACCTCATATCCTCCCTA
-CTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAAC
-ACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAA
-GCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTA
-CATAACCTAAACCTACTCCAATGCTAAAACTAATCGTCCCAACAATTATATTACTACCAC
-TGACATGACTTTCCAAAAAGCACATAATTTGAATCAACACAACCACCCACAGCCTAATTA
-TTAGCATCATCCCCCTACTATTTTTTAACCAAATCAACAACAACCTATTTAGCTGTTCCC
-CAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTACCTGACTCCTAC
-CCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGCGAACCACTATCACGAAAAAAAC
-TCTACCTCTCTATACTAATCTCCCTACAAATCTCCTTAATTATAACATTCACAGCCACAG
-AACTAATCATATTTTATATCTTCTTCGAAACCACACTTATCCCCACCTTGGCTATCATCA
-CCCGATGAGGCAACCAGCCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCC
-TAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCAC
-TAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACT
-TAATATGACTAGCTTACACAATAGCTTTTATAGTAAAGATACCTCTTTACGGACTCCACT
-TATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAG
-TACTCTTAAAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGA
-CAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATAACAAGCT
-CCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACA
-TAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCA
-TTCTCATAATCGCCCACGGACTCACATCCTCATTACTATTCTGCCTAGCAAACTCAAACT
-ACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCAC
-TAATAGCTTTTTGATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTA
-ACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCC
-TACTTACAGGACTCAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAA
-CACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAA
-ACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCA
-TTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAACATCAGATTGTGAATCTGACA
-ACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCC
-CCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATTGGTCTTA
-GGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCACACTACTATAAC
-CACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTTAACCCTAACAA
-AAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCT
-CTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTG
-AGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACTACTTCTCCATAAT
-ATTCATCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATAT
-AAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATTTTCCTAATTACCAT
-ACTAATCTTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGG
-AATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGC
-CATTCAAGCAGTCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCTTAGCATG
-ATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCC
-AAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGG
-TCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCA
-CTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGA
-AAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGC
-AGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAG
-TCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCA
-CATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCA
-CAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCT
-CACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGG
-TTTCTACTCCAAAGACCACATCATCGAAACCGCAAACATATCATACACAAACGCCTGAGC
-CCTATCTATTACTCTCATCGCTACCTCCCTGACAAGCGCCTATAGCACTCGAATAATTCT
-TCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACATTAACGAAAATAACCC
-CACCCTACTAAACCCCATTAAACGCCTGGCAGCCGGAAGCCTATTCGCAGGATTTCTCAT
-TACTAACAACATTTCCCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACT
-CACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTAAC
-CAACAAACTTAAAATAAAATCCCCACTATGCACATTTTATTTCTCCAACATACTCGGATT
-CTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCT
-GCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACA
-GCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTT
-CCTCTCTTTCTTCTTCCCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCC
-GAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACCACTACTA
-ATCAACGCCCATAATCATACAAAGCCCCCGCACCAATAGGATCCTCCCGAATCAACCCTG
-ACCCCTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCA
-CCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAA
-CACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCCATCG
-CTGTAGTATATCCAAAGACAACCATCATTCCCCCTAAATAAATTAAAAAAACTATTAAAC
-CCATATAACCTCCCCCAAAATTCAGAATAATAACACACCCGACCACACCGCTAACAATCA
-GTACTAAACCCCCATAAATAGGAGAAGGCTTAGAAGAAAACCCCACAAACCCCATTACTA
-AACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGA
-CCAATGATATGAAAAACCATCGTTGTATTTCAACTACAAGAACACCAATGACCCCAATAC
-GCAAAATTAACCCCCTAATAAAATTAATTAACCACTCATTCATCGACCTCCCCACCCCAT
-CCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAA
-TCACCACAGGACTATTCCTAGCCATACACTACTCACCAGACGCCTCAACCGCCTTTTCAT
-CAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCA
-ATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACG
-GATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAG
-CAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAG
-TAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCT
-GAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCT
-TACCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACGGGAT
-CAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACA
-CAATCAAAGACGCCCTCGGCTTACTTCTCTTCCTTCTCTCCTTAATGACATTAACACTAT
-TCTCACCAGACCTCCTAGGCGACCCAGACAATTATACCCTAGCCAACCCCTTAAACACCC
-CTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGATCCGTCC
-CTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCC
-CCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTT
-ATTGACTCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCT
-ACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCC
-TAATACCAACTATCTCCCTAATTGAAAACAAAATACTCAAATGGGCCTGTCCTTGTAGTA
-TAAACTAATACACCAGTCTTGTAAACCGGAGACGAAAACCTTTTTCCAAGGACAAATCAG
-AGAAAAAGTCTTTAACTCCACCATTAGCACCCAAAGCTAAGATTCTAATTTAAACTATTC
-TCTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAAC
-AACCGCTATGTATTTCGTACATTACTGCCAGCCACCATGAATATTGTACGGTACCATAAA
-TACTTGACCACCTGTAGTACATAAAAACCCAACCCACATCAAACCCCCCCCCCCCATGCT
-TACAAGCAAGTACAGCAATCAACCTTCAACTATCACACATCAACTGCAACTCCAAAGCCA
-CCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAA
-GTCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCC
-CCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTG
-CTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGAC
-ATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATAAG
-ACATCACGATG
->chr20
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNGATCCAgaggtggaagaggaaggaagcttggaaccctata
-gagttgctgagtgccaggaccagatcctggccctaaacaggtggtaaggaaggagagagt
-gaaggaactgccaggtgacacactcccaccatggacctctgggatcctagctttaagaga
-tcccatcacccacatgaacgtttgaattgacagggggagctgcctggagagtaggcagat
-gcagagctcaagcctgtgcagagcccaggttttgtgagtgggacagttgcagcaaaacac
-aaccataggtgcccatccaccaaggcaggctctccatcttgctcagagtggctctagccc
-ttgctgactgctgggcagggagagagcagagctaacttcctcatgggacctgggtgtgtc
-tgatctgtgcacaccactatccaaccgatcccgaggctccaccctggccactcttgtgtg
-cacacagcacagcctctactgctacacctgagtactttgccagtggcctggaagcacttt
-gtcccccctggcacaaatggtgctggaccacgaggggccagagaacaaagccttgggcgt
-ggtcccaactcccaaatgtttgaacacacaagttggaatattgggctgagatctgtggcc
-agggcctgagtaggggagaagctcccactctcagaacactgagaaaagtgaggcatgggt
-ttctgggctggtacaggagctcgatgtgcttctctctacaagactggtgagggaaaggtg
-taacctgtttgtcagccacaacatcttcctaagggagccttgtgtccgggaaaaactgac
-agaccagtgatctgggtgcagaaggcttgagacaaaactagctggttgggccagctatgg
-ggcaaatgctggaaagaaacctggtcagggagcctgagctgagtggtccccacagtcatc
-tgcttggcaagaaaccctaggtcgcaggtgctagaccagctgcacacccacagcaacact
-gccatgcccaggatcctctgcccttgatcctgaatcaacagaccacttgcagatatactt
-cacagcccacgctgactctgccaagcacagacaaccactgggccccaggggagctgcagg
-tctcctggtcacctaatcttttttttttttatactttaagttttggggtacatgtgcaca
-acgtgcaggttacatatgtatacatgtgccatgttcatgtgctgcacccattaactcgtc
-atttaacattaggtatatctcctaatgctatccctcccccctccccccaccccacaacag
-gccctggtgccatggaatactatgcagccataaaaaatgatgagttcatgccctttgcag
-ggacatggatgaagctggaaaccatcattctcagcaaactatcaaactatcacaaggaca
-aaaaaccaaacactgcatgttttcactcataggtgggaattgaataatgagaacacatgg
-acacaggaaggggaacatcacacatcgggacctaatcttaagctaagtgtggctaagagc
-ctatctgctggcctttactattaagcactgcccactggattgcagcctgaattacaccgc
-caaacaaatactgtttcagcatacattaccagtgaaacccaatgcaggaacatagtcaaa
-aataaacacctggcatagagacttggccctctgaaaacacccagaaaaaagccagctata
-ttcaacatacatcactgtcaaaatatcaaggaaaatgaagaagaataaaacaaaaagtca
-aaaccaaatgataggaacttcaaaaagataaagtaacaccagctgtcttagatgagaaag
-aatcagcacacattcttgcaattcaaaaagtcagaatgtctccttacctccaaacaatca
-tactagctctcatcagattgaaatggctgaaatgacagacatagaattcatgatctggaa
-ggtaaggaagctcaagaacattcaggagaaagttgaaacccagtccaaggaagccagtaa
-agcaatccaagagtacagagataacatagccattttaagaaagaaccaaaagaaacttct
-gcaattgacaaattcattataggaattttgtaatacattcagaagcattaacaacagaat
-agatcaagttgaggaaagaatctcagagctcaaagatcagtcctttgaatcaacacagtc
-agacaaaactaaagaaaaaaatttaaaaataaaacctctaaaaaaatatggaattatgta
-aagataccaaacttacaacttatgggcattcctgaaagaggagaaagaataagtaacttg
-gaaaacatatttgaggatagtccatgaaaatttccccaatctccctagagaggctgacat
-gcaaattcaagaaatgcaaataacccctgtgagataactacaagataactatccccaaga
-cacatagtcataagattctccaaggtcaacgtgaaagaaaaaaatcttaagggcagctag
-agaaaagcctgaggtcacttatgaagggaagctcatcagactaacagcagacttctcagc
-agaaaccttacaaaccaagcaagattaggggcctatttttagcatccttaaagaaaagaa
-atttcagtgaagaattccatatcctgcaaaactaagcttcataaaagaaggagaaatagg
-ctgggcatggtggctcacacctgtaataccagcattttgggaggctcaggcaggaggatt
-gcttgagctcaagagtttgagaccagcctgggcaacatggcaaaaccctgtctcttctaa
-aaatacaaaaattacctgggcAAGACTCCATCACAAACAAACTAACAAACCAAAActatc
-aggtactatgctcactacctgggtgacaaaatcatttttacaccaaacccagtgacaagc
-aatttacccatgtaacaaacctgcatgtgtatcccctgaacctaaaataaaagttaaaaa
-aaaaagaaCTTTCATCAACatttcttgcagtgaaggtatgttagtgatgaacattctctg
-cttttattgcctgaaaatatctttattttgtattcatatttgacatatattctcactggg
-cataaaaattctaaattacaagtttttccccttttttgtattaaaaatttcattccaata
-tcttTCATATTGCCTTATTTGTAATGATGCCTTCTATCCTTCTTATCTTTGTTCCATTTA
-TAAGAAGTGTTCCCCAACCCCAGACTGATTAAAACCATTTTTTTAATTAAAAAAGCAAAA
-GAAAGAAACATTTTTATCTGAAGCTGTCTCAGACTCAGACACCACCCAATCTTCAGATTT
-CAAATAGCTTATACTCAAACATTTGGTAATATCAGCCCCTTAATGGTCTTCCTGGAGGGC
-AGATGCATTCTAGAGATGAGAACACGATCATGATTACGAATGCTACCACCACTACGAACG
-CACAAAAGTCACTGGTGTGATCCTTTCTCAGAACACTGTGGTAACTTCTGGACATTCTCT
-GCTGTTATCATTGCTTCTTCCTTCTGGGTTTTTTTCCCCCTTATATGGGCAGATAATTTT
-CTCCATTGGAATGAAAAAGTCTTGCTTCATGCTCTTtaactgtgtgaccttgggcgtatt
-actttactttggggcaaaccattttccttcttgaggaccaaatgtgctcttttataaaac
-gagcagttagaattagattgtctctctggacacggcttatgttgacaacctggatcacAT
-TAGAGGATCAcactgagacctttatgtcggcctcagttcctccatctgtaaagtagaggt
-tgggcttagattatAGATGATAAAGACACCAACTTTCctggaaaggattctggaaaggat
-tctgAACTTAGGCTCAGCCTCAGTAAGAAGGAGTTCTGTGATTAAACAGGGATGCCCACA
-CATCAGCAACAGAAATGGGCAGGTCAACCATGTATGCTGTGCCTCAGTGAAGATTTTATG
-CTATGCTGTGCATTTGATATCCATTCTCTATATTTGATATCCAATCTAAGATTATCTAGA
-AGGTCCTTTCCAAGACACTGATGAGATACATCTGTATAAATATATAACTCAGGATGAAAG
-CAACTTTTAACATTTAGCGTGTGCCTCTGCCTCTGATCTGATTACAGCCCACAGAGAAAT
-ATAAACAATACACAATACAGGCTAATGAAGAAGGGTGATAAGAtttttttttttttttga
-gacggaatttcactcttgtcacccaggctggagtgcaatggtgcaatcttggctcactgc
-aaccttcgcctcccggttcaagcgattctcctgcctcagcctcctgagtagatgggattg
-gaggtgcccaccaccacgcccggctaatttttgtattttttagtagagacagggtttcac
-catgttgtccacgctggtctcgaactcctgacctcaggtgatccgccagcctcagcctcc
-caaagtgctaggattacaggtgtgagccactgcaaccggccAAGGGTGATAAGattttaa
-aaatttatttaaaataCAGAAATTTCAAAAAGAGAGAAGTGCAGTGATAGCAAAATTGAT
-GCAAACTGTGCAAGCATGAAATCTATTTTATAGCTGAATCTACTTTTCTTGGTCCCAAGA
-TTCTATTTCCATTGGTTTTCAAATAGTTAATTCTATTGTTTTTTCAGGGAGATTACTAAA
-ATCACTAATAATTATTTTCCTACTGACACAAAATCTAAAAAGCACCATATAGACCTTCTC
-TCTCCATCTCCCCTTATCCTTATGTCACCTTACCCTACCCCAATACTCCAATGGCAGAGT
-ATCTACCCATGGCAGAGTAGAGAATATGTACACTAACAAAACCAGATGCACAGAGGTGGG
-GTATCCATCTCTGACTTGGCTGAGCTAGTCTAAGGAAGGAAGGCTCTGTGGCCATTGTCC
-TTGGAAGTCATTCTCACAGGTTGGTGGTATTCTCAAGTAGGTGGTGCTTGAGTGGCCCAA
-GAGCACCCACATGCTGCTATGCATTTTTCTGACAACCTCTTTATGATCTCTGACTTTGGC
-AGATCATCTTGCATCTCTCAATTGGAGAGTCACTTTTCTTATCTCCACAGAAAATTCTTA
-ATCAAGCTCCTGGTTTTCCTTTATAGCTTCTACTTTTTAAACTCACTTCTCCAACTTCAC
-CGCTACATCTCTGACAGATGAGAACATTAGAGATTCCCTGTTTTTCAAAAACAAAACAAA
-ACTCAGCAAAACTATAAATATACTAAGGGTAAGTCTGTATTATCTCCTGCCAAAATACAC
-CACCCTGCATTTTTTTAAATttttatcttttgtaggtacatagtaggtgtctatatttgt
-ggggtacatgagatgttttgatacaagcatgcaatgcataataaccacatcatggaaaat
-ggggtatccatcccctcaagcatttatcctttgtgttacaaattatctaattatacttta
-ttattttaaaatgtacaattaaattatttttgactatagtcacctcgttatgctattaaa
-taccaggtcttattcattctttctaactattttttgtacccagtaaccatcctcaccttc
-ccacacacgcccaccacctttcccagcctctgataaccatccttctactctctatctccc
-ttgaattcagtagttttgatttttagatttcacaaataagtgagaacatgcaatatttgt
-ctttatgttcctggcttatttcacttagcataatggcctccagttccatccatgttattg
-caaatgacagcatctctttcttttttatggctgaataatactccactgtgtataagttcc
-acattttctttatccactcatttgttgattgacacttacgttgcttctaaatcttggcta
-ttgtgaatagtgctgcaacaagcacaggtgtgcagatatctattcaatattcttatttcc
-ttttggaggggagtgtgtacctagcagtgggattgctggattgtatggtaactctatttt
-cagtttttttaggaacctccaaactgttctccatagtggttgtactatcttacgttcaca
-ccagtagcatacaagggtttccctttctccaaatccttgccagcatttgctattgcctgt
-cttttggataaaagccattttaactggagtgagatgatattccattgtagcttgattttc
-atttctctgatgatcagtgattttgagcaccttttcatctgcctgtttgccatttgtatg
-tcttcttttgagaatatctattcagatactttgcccatttttaagttggatcattagatt
-tttttcctatagaattgtttgagctctttgtatttcctgttattaatcccttgtcagaag
-ggtcgtttgcaaatattttctcccattctgtgggttgtcttttcactttgttgattgtgt
-gctttgctgtgcagaagctttttaacttgatgtgatcccatttgtccatttttgcttcga
-ttgcctttgtttgtgggttgctactcaagaaatttttgtccaaacatcctggagagattc
-cccagtttcttatagtagtttcatagtttgagatcttagctttaagtctttaatccattt
-gacttaatgttttgtatatggtgaaagacaggggtctagtttcattattctgcatatgga
-tatccagttttcccagcaccattttttaaagagactgtttttcccccaaagtatgttctt
-ggcaactttgtcaaaaatgagtttactgtagatgtgtggacttgtttctgtgttctctat
-tcttttccattgctctatgtgtctgtttttatactagtaccatgctgttttggttactat
-agctttgtagtataatttgaagtgaggtaatgtgattcctctagttttgttctttttgct
-taggatggctttggccatcctgcatttttAAcccttttcccattttcacccagaatactc
-gctggtggcacttgcagctgcagggtttaccctgagataactttgccacaaaatatctcg
-cctttattattattttcacatcgttctaatatatcgactttgaaaacacaaatcatcatt
-ctatttatagcatcttgttgttagcagtggtatttccatttacaaaatatagaaattctt
-gatcgctgaaaatgtcaaattctagaaagcatagcattcccatgttaacattgttctcaa
-acagttttgggccaaagagtcatttaatgaatccggttttttccaaaatagatgattctg
-attattcagatgattctgatgttagttctgtttaaaaataattccaagaacagtttgtat
-attttattttcacactgaacatcagtcagcctccagagcatgttaatgtaaaattaaatg
-aacatgggcagtgagctgcagttttttttctaaacagTGCAGCTGTTTAGAAAATTTTTT
-TAAAATTTTCCTGATTTCCTTGGTATTAAACATATGTGGGAGAAATACAGCTCAGCAAAC
-TCTTCCAGGAGATAAAATGCTGATCACTCCTACTGGGCAATTTCACAAATGTCTCCTATA
-TTTTTCTCCTTTGGTAGTGGGGATGGGGGGCATAATGTTACATTGGGCctctctcctctc
-tctctttctctctccctctcCTTTTAAAATGTTTCCTCTCTCTCAATATTTCATTTCTTA
-TTTGTATTTCTGAATGAGGGAAAAGAGTTGATGGGACAGCGGAACGGGAAAAAGAAGAGC
-ACCAATAAAACCTGTTTTCCTGTTTTCACTATTTTCATTCCAAATTCCTTCTGTCTCATA
-ATTGATGGAATCTTATGAACTTATTAGTTAAAAAGTGTCTTTCTTGTTTCACAGGAATTC
-ATATCGGGGTGATCACTCAGAAGAAAAGGTGAATACCGGATGTTGTAAGCTATTGAACTG
-CCACAAGTGATATCTTTACACACCATTCTGCTGTCATTGGGTATGTACAAAGTGCTGCAT
-ACAGACAGAGGAGAAGGACAATTGAGCCCATCTAAAGTTAACAAAAACTTCCTCTTGGGG
-CTGTTTCTTTCCATCAGACCTTACAGTTCTACGGGATAATAGCTTATCTCATAAGGCCTC
-AGCTTTCTTTAATAATTTCTAGAAGCAGACGTTATTGTGTCATGCACACTCAGTGTTGCA
-AATTAATGGTCTGGTGATCTGGGTGGCATGGCATTTTCCCCTTCTCTGGTTCATCACCCA
-TGATAGACCAGTAAAGGTGACCACTTAAATTCCTTGCTGTGCAGTGTTCTGTATTCCTCA
-GGACACAGAGCTTCCTCTCTCCCAGGAGCCATGAATATCCTGATGCTGACCTTCATTATC
-TGTGGGTTGCTAACTCGGGTGACCAAAGGTAATGGAACCCTATAAAGCAGAGATGATGAC
-TAGGATGAGTTGTTGCCCTTGGGCTCCCCTGGTATCATGATGGGAAGAGAGGGAATCTGC
-AGGAAAAATCTGGGCCAACAAAGAGCAGCAGAATGCTCTTATTTTGGCAGCTCCATGCCC
-CTAGTCTCTGAGAATCTTTCTGTTAGGGGCATCTAGCAAGCTGGGATGTCCTCTGAGGCA
-TTTCTCCAAAGACAAGAATTTCCTTAATGCTCTGAGCCACCCTATCTGTCTCTCTACATA
-ACTATCCAATGTTAGTTCAGCCTCACTTCACTTCCATTTCGATTATTCTGTTGTATCTAT
-TTCATTGTTGTGTCCTATTAGTTCTCCTACCATCTTGAATTCTTCTTTGCCCGGAGGGTA
-CCTTCAGAGGGAGGCCCTCACTTTCATGTTCTTAGATATGGTGAACAAGTCCATTGACAG
-TTTGTAGATTCTGTAGCACTATCATATGGAAGAGACAATATATATGTTTGGGGTAGAAGT
-GGAAATAAGTGGAGTGAAGACAGGATAGACAGACTAGTGACCAATGGGGAGCTTCTAATT
-TTAGATGAATAGGAACAGTCTGTTTCCACTATTTAATAATGCTACTTTTGAAAATTGTTA
-ACTTTTTATTAAAAAATAATACTTGCAATTGACTTATGTATCAAGCAATCGATGGATTTA
-TAGGGTTTAAGGAAAAGAAAAATGTTTGTCTGTCCAAGAATACCAGTTCTTCAGTCTTCC
-CCTTCAGAATCAATCAATGTTACCAATTTCTTATATATCCTAGCAAATACAAATATATTT
-ATATTTGCATGTGTATACCTTTTAGATTTTTAAAAAATGCAATTGCAAATGCACCATGTG
-AATTGTTCTGCAATGTACTAGCAATATATTAGAGACATCTTATCCATACATAAACCTAGT
-TCATTATTTTTAATCGATAAGTAAAACTTTGAGGAGGAGCAGATGAATTGCCTCACATTA
-ATTACTCCGCTACTGATGAAAAATAGGTCTTTAATTATCAAAAACAATTCAGCAAGAAAA
-ATTTGTAAACAAATGTATGTCTTTTCATTTATGACTGGACACGTGGacacacacacacac
-acacacacacacacagtcaaaccacctaccagaaaagctgaactattcttctctcctatc
-accagttgcaagagtgtcagcttcccacaccctcatcagtcctttttgttttttctacta
-cattcagttttctactacattcagttttacagtctaatatgtgaaaatgatgtcctgatg
-tttgaattcatgacactttagttataaatgagtttgaacatccagtccattagatttcta
-aactttcttAATTATCTTTATATACTAAGAAATTTGGCTTTTGTTAAATTTGGAGGTGTT
-ATATGTTGCCTAGAAAGATGCTATTCATGTCTATTAAATGGTTATAACTGTGCCTATGAT
-CTGTTATGTCTTGATTCACATGTTGATGTAATGTGAGTTACAGAATTAATATCTACATTC
-ATTTCTGATTATAAACTGCTGTATTTGTTGAAAATTTGGAAATTTTGAAATTGTAAAGAA
-GTAAAAAAATTGTAAAGAAGTTAAAAGAGACAAAATATTTTTGATCTATTGTTCTTCCTC
-AGTTTTCTTATTTGAATAAAAATGTATAGCATACTTATAAATTTTCTATTATACTATTAG
-TATTTTCCCATTTACTATTTTCAAAAACTGTATTTCCAATGACTGTATAAATTTTATAGA
-ATGGATACTGTTTAAATTACTTAGCCAAATTGTTTTTGCATAAATAAGTGCATTTACATT
-TTATAGACAAGGATGGCTAGTATAACCTTTCTTATACATAAATCATTCAGCATAAAATTC
-CTGGAGATGTACTTTTTTCTGTCTGCTTCATGTGTTATCAATTTTTGAATACTTGCCAAG
-TCCtaaaaatgaaatattatatataaatatttaatttttatttatGTCTGTGAGTAATGG
-GGAAGTCGAACTTCAAATACATGCTTAATGTATATTTAACTTTTCTACAAATTGTCTATG
-TCTCTCTTTCTCTTTTATTTTGGAGAGGTAGTTTTCATTTCTTTTGATTTAGAGATTTTC
-ATTTTTGTGTTCTCTTATAGGTTTTGTTTTGAAATTTAGCTATTTAGTCTCTCTGGGCTT
-TATATTATGTGTTTTCAAGTGAGATAGCACCTGATGGCTTGTGAAGCAACTTTTTACCAA
-GCCAAGCTATCAGTGGACTGGTATCCATAGATATATtttaagttgatgctagctgattat
-atatctggtatgttttagaaagaactccacacatgggataatgttttggctagatggctc
-cCCTACTTAGAAACATACAATTGCTAGTCATATTTCTAATTTTAGGATTTCGAGATACTG
-GTGATGAAGATCACATGTCCTAACAACATAATAGTTCCAGACTGAAGTTCTTTGAAAAAA
-ATGACTGTTGTCACTTTAGAAAAAAAAAATTATGAATTATTCCcaattgccatcattcta
-ctgctaaaaccaaattcttggaattatctatgatttttctatatcctatgacactcatat
-ctatcaggaagtctattacatctgcctgcaaattatatccagaatgcaattattctcgcc
-acctccattgctgccactctgattctagtcaccatcatctctcacctgtgttattgccat
-agcttcctcatgagatctgtccttctgctcttccctgccaccatcttgtgaagacacata
-gtgcatgatccgcttacactggaagtcagatcatgtacttttgctcaaaactctgctatg
-gccccctctatactcagagcggtaacaagagtccatacagtggctcacctggccctgcag
-gatctggcccttatgacctctctcacctcatctcctactattatagtccttgttcactcc
-actacagccacacaagccccagtgctcttccccaaacatatcagacttactcaacccata
-gagctttgtttgtttcctctgcctagaatgtacttgcctcagatactggtgtgactaatt
-cctttacctccttcaagctgtttaatcatcaccttgttacacaggcttgtgcaactcctg
-tttatgaatcttctattacccttaaatctattctcccttctttctgcaaaccatttgtca
-ccttttcatctacaaaataatgtacttttttattAAGGTAAAATATACATTTAAAAATTA
-CCATCCTTACCATGTTTTTACCATatttttatgtatacctgatggctgtttgtatgtctt
-ctgttgagaaatgtctattcaaatcttttgcctgttttaaaatcagattatttgtttttg
-tttgctatggagttttttgagctccttatattaatatactttttgttgttaattcctcgt
-cagatggatagcttgcaaatattttctcctactctgtgggctacatcttcactttgttga
-ttatttcctttgctgtgcacaagctttttagtttgatgtaatcctaattgcctatttttg
-ctttggttgcccgtgcttttgaggtcttacccaagaaatctttgccaagaccaacgtcct
-gaagtgtttccctaatgtttttttcaggtagttccatagtttcaggtcttagatttaagt
-ctgtaaAACCATACAGTCTAGCAGGGAGTGCatttactttttattatctgtctccctctg
-ctagaaagtcagctccatgtgatttttgtctgtttagttcacagatgtacctcaagggcc
-caggatagtgcctgtgccatagtaggggcccaaaactttgatgactgtgtgaCTATAGCC
-TAATTTAAGAATGGAGGGGATAATTTAAAAGCAGTAGGAAGGAATGTAAGTGAGAAACAA
-TTTTGAAGAATAATTGACAGAACAAGGCGATTCAAAGACAAAGGAGAAGAAGAGAGCCAA
-GATGACATATTTCAAGTATGGATAATGCTGGAGGAAAAAAATTAAGATATAAATCTTTGT
-AGATGTGAGGAACGAAGAAGCAAGGTTAGAGTCTGTCTTGCACAAAAGAAGTGGAAGGTC
-TAGACTTGAAACTTATAGAAAATTCCACGAAGTACAAAGTAAAATCGAGCCAGTAAAATA
-ACAAAGATAGAATAAATGACTCTAGAGGAGTGAAGGTAGAATAAATAATTGGTGAAGCTG
-GACTAGAGCCAACATTTCCCAGAGGATAAAATATAAACCAAATTATTGTGAGCCTAatat
-atacatacatacatacatctatatatgttttatatatatTATCACATTAAGTTCAAATAA
-GGTTGTTTAGAAAATTActtgctcttctgcacatataccaggcttcctcctccatagagc
-cttatctctagctgcttcctctgcctagaatacacttATCTAGGTACTCCTTGGGCAATT
-GTCTTGAGAAAGATGATCATGCCGTTTACTgcttgataaatgaacatacaatgcagcaca
-ctagtttccctttagatttatatcctcacccctcaaatgagtagtcacactgcttggaaa
-tcctactgcatttctcttgtaaatgaaccttccttcttttttttttttttttgagacaga
-gtctttctctgtcaccaggctggactgcagtggcccaatctcggctcattgcaaccgcca
-actccctggttcaagtgattctcctgcctcagcctcccgagtagctgggatcacaggcat
-gtgccaccacatccagctaatttttatatttttagtagagacaggttttcaccaggttgg
-ccaggatggtctcgatctcctgaccctgtgatccaccctcctcggcttcccaaagtgctg
-ggattacaggtttgtaccaccacacccagccatcttccctcttttttagacaactatttt
-gtcctgacctttatttgtcttttattttcctgctcctctcctctacatggctctccccct
-cagtttatcccatgccccatttatttaaacaattcaaataggaagttttcactcatttcc
-tctgtcccctttgccataaatggagaaacgtgtcttctccatctaaagatcagtctgctc
-tgtgtgaatttgtgactatgcccttctgtcatctcatcaccctattctatattaatctct
-ccttttctgcttttttttttttttttttgagatggagtcttgctcttgttgcccaggctg
-gaatgcagtggcacaatcttggcttactgcaaccttcgcctcccaggttcaagtgattct
-cctgcctcagcatcctgagtagctgggactacaggtgctcgccaccatgcccagctaatt
-tttgtattttttagtagagacagggtttcaccatggccaggctggtctcgaactcctgaa
-ctcaggtgatctgcccgcctcgatctcccaaagtgctgggattacatgtgtgagccactg
-cgcccagactgcttgtctcttttctcattgcttgcaagcaccatttggtatttctcgttc
-ttcaaaacaaacctgaaagctttcccttaaccttacattgctctctaacaagttatttat
-ttctctgcttttctttggatctaaacttcttaagagtttcatctacaggtcctgcattca
-cttctctctcattcacattttgaccaactgcaatttggtttcttttttcataccactcgg
-aagctgctctcctcagtatgaagttaccttcatactactaaaagcatggacattttcctg
-ccttcatcatttttttttaacctctcagcagtatttgactacaaaatgaccactctgtcc
-tttaagaaacagtctcctctcctgCTTAATGTAGTCACATCTGATACAACTTTCCCCATA
-ACCTTTTATGCATTTTCTGTTTTCATGCATATCAGCCCAACTTGCAATTGTCAGTATCTC
-CAGTCTTTCAACAACTGCTTGTGAAATACCCCTGTACAGGGCAATCCAGAAATGCCAGAA
-AATTATCAGCTGTCTCTGGATCATCTGTCAACTATGGGGGAAGCTGGATAAATAGTCCAG
-GTCCTTTGAGCCTCATGTAGAATAACTTTGAGGCTTGGTAATATTTTTTTTTTCCTGTGG
-TAATTCCCTTATTTGCAGTTCAAGGCTATTATGGGAAGAAAACATAAATGGATGTTAGTT
-CTTCAAGGTTTTTACTGTAACTGTGCACCCTTTCATTCTTCAAGGTTTTTCTGTAACACT
-GCACCTTCAGGACCTGATGCCCAATTAAACATTTTTTTAAGTTTTTTGGTTTTTTTTTAA
-TAAAAACTAAATGCTATTTTTTCttctacttttagttgatgtgtaataattgttcatatt
-tagaagatgcagagtgatattttgatacatgtatacaatgtgtaatgatcaaatcagggt
-aattagcatatctatcacctcaaacatttgtcatttttttatattgggaacattcagaat
-cgtctcttctagctatttgaaaatatacagtaaatgattgttaactaccgtcaccctaca
-gtgctatagaacagtggaccccttttggcaccagggaccagttttgtggaagacagtttt
-ttcgacgaggtgaaggtggtggtggggatggtttcaggatgaaactgttccacctcaggt
-catcaggcattagagtctcacaaggaacacacatcctagatccctcacatgcacagttca
-caatagggttcatgctcctatgagactctaatgccttggctgatctgacaagagatggag
-ctcaggtggtgatgcttgcacacctgctgttcaccttttgctgtgcagcctggttcctaa
-caggccatggaccagtacccattggctgcccaggggttggggacccctgctataggatgc
-tggaactttttcctcctatctaggtgtaattttctatctgttaaccaacctctctctatc
-ctcctttcccttcccagcctctagtaatcattattctacagtctacttctatgaactcaa
-cttttttagctcctgcttatgaatgaaaacatgtggtatttatctttttgtgtctatttc
-acataacggaatgtaacatgtcccccaggctcatccatgAGTCTGAGGCTTATTTGTAGC
-CTGGCTGCTGGGCTTCCCTGTGGGATTGTCCTCTGAGCAAACAGAACACAGCCATCCTGC
-TGGCCAGCAGTTGATAGATGATCTCATGATAATAACAGGTTATAACTCACCTTTTCTTGG
-ATTTCTTGCTTTCCTGATTTCTACATTTCTCCACTGATTTTTTTTAAGGAGGAATTGTCT
-CTCAACTAAACTATTATATTCAAATCTTTGCTGGAGCTCTGCTCTGCTGGGGGTCTGCTT
-TAAGACTCTAGAGTCTTattctcctgttttgatctgacttatcttattggtccttttaag
-tcgtttcctcttatctgatctcttatctcttaatattgaaactcactagaatttaattct
-agtcctctttttttctcatattattccaacccaccatggtttaccaatttctgtacttta
-aatgctatccataagcaatcacatttattgatttgcatatgtcgaaccaaccttgcattc
-caaggataaaggctacttgatcgtagtggataagctttttgatgtgctgctggattcagt
-ttgctactattttgttcaggatttttgcactgatgttcatcaaggatactggcctgaaat
-tttttttttcttgtgtctctgctaggttttggtctcaggatgatgctggcctcatagaat
-aagttaaagcggagtcctgccttctcaattttgggtgaatagtttcagtaggaatgatac
-cagctcttctttgtatatctggtagaattcagctgtgaatccatctggtcctgggctttt
-CATTTTCATCCTTTCTTTCTAGGTTTCGTATCAGTCTCAGTATGctctctctctctccgt
-ccctctctttttctacatttctccttttctcCATACAACTTCTTTGATGGCACATAGCAC
-AATTTTAATATACACTTTTTGTTCTCCTGTTTGTCTCTTACAATGGCTTTTTGTATTTGA
-CATCATATTAGTCTAGATGTCAGTCAGTGTAAATTTTTGAATGAATGAAAAGTTGTTATG
-TTGATGCCAGAGTTAAAAATTTGACCTATATTTTATTCTCTACAGGTAGCTTTGAACCCC
-AAAAATGTTGGAAGAATAATGTAGGACATTGCAGAAGACGATGTTTAGATACTGAAAGGT
-ACATACTTCTTTGTAGGAACAAGCTATCATGCTGCATTTCTATAATATCACATGAATATA
-CTCGACGACCAGCATTTCCTGTGATTCACCTAGAGGATATAACATTGGATTATAGTGATG
-TGGACTCTTTTACTGGTTCCCCAGTATCTATGTTGAATGATCTGATAACATTTGACACAA
-CTAAATTTGGAGAAACCATGACACCTGAGACCAATACTCCTGAGACTACTATGCCACCAT
-CTGAGGCCACTACTCCCGAGACTACTATGCCACCATCTGAGACTGCTACTTCCGAGACTA
-TGCCACCACCTTCTCAGACAGCTCTTACTCATAATTAATTAACATTTACTTCTGGTATGG
-AACAACTAGAAATACTGCTGGAAATAATATCCAAAGAGCTGATTCTACCAATCCAATTTC
-ACCAGGAAAATTCCATCAGGGATTGGATGACCATGGGGATGGACATAATTGCTACTACCA
-ACACAACAGCCAAGAGAGTTGCCTTACAATTAGAAATGTGTAGACAGAAATGTATAGAAG
-ATACAAGGATTCTCTTAATTGGACTTAAATTCTTTATCTGTCTTCCTCCGATGTACTCAA
-ATATATGAGCTAATTTTTGTCTTAAGTGAACATTTGTATATCTATGTATTTTTCCATGCC
-AAAAACAAAAACGAAGACCATTGTTTGGAGCTGCCTCTTATGACTAAGACAAGAATTTTT
-ACTTTAACAGTGCCTGGCCCACTACTATCGTATATAGGAGAACATATAAAAGCATATAGA
-AAGTTCCAGATGAATGTTCCCTTCTCTACCCTCCACCTTTTATTGTAAGTTCTGACCCTA
-AATACTTTTCTGTGTCATGACGTCAAATTTTGTTTAAGGTTCTAGCTGGTAACTAACAGA
-GTCAGAAGCTAATTCTTTCATTCAACACAAGCACTGATCTAACTGGATAGAGATAAAAGT
-GGGACTTGCCTTGAGAGTACATCATATTAAATTAAAAGCTGCATCTCAAATTCTACTTAT
-CTTTCCAATCTTCTTTCCACTTAGAATTCCAACTTCCAAGTATGGCAGCCTCATAACATG
-CCTCTTCAGGTCTCTGTGTTGTCCATGAATGTTAGTTGTGTGCAGTGTTTCTATGCTTTG
-TATGGCTGTACGCATGTGACTGCTGTTTGTATGGCAACAGGTGGGTCAGTAAGTGTCTTC
-TATGATACTACAGAGAAGCGGTTATTAACTATAAAGTTGATTAGGttttttttttttttt
-gagacagagtctagctctgtcgcccaagctggagtgcagtggcatgatctcggctcactg
-caagctctgcctcctgggttaacgccattctcctgcctcaggctcccgagtaactgggac
-tacaggcacccactaccacacctggctaattttttgtatttttagtagagaggggtttca
-ccatgttagccaggatggtctcgatctcctaacctcatgatccatccgccttggcctccc
-aaaatgctgggattacaggtgtgagctactgtgcccggctGATTAttattttttttaagt
-tccaggatagaagtgtagaacatgtaggtttgttacataggtatacatgtgccatgatgg
-tttgctgcacctatcaacgcatcatctaggttttaagtcccgcatgcattagctatttgt
-cttaatgctctgcctccccttccccacacaccctgactggcccccatgtgtcacgttccc
-ctccctgtgtccatgtgttcttattgttcaattcccacttatgagtgagaacacgtggtg
-tttggttttctgttcctgtgttagtttactgaagatgatggcttcgagcttcatccatgt
-ccctgcaaagagcatgatctcattcctttttatggctgcatagtattccatggtgtatat
-gtaccacattttctttatgcagtctatcattgatgggcatttgggttggttccatgtctt
-tgctattgtaaatagtgctgcagtaaacatacgtgtgcatgtgtctttataatagaatga
-tttatattcctttggatatatacccagtaatgggattgctgggtcaaatggtatttctgg
-ttctacatccttgaggaatcgccacactgtcttccacaatggttgaactaatttacattc
-ccaccaacagtgtaaaagtattcttatttctccacagccttgccagcatctattgtttct
-tgactttttaataattgccattctgactggcatgagatagtatctcattgtggttttgat
-ttgcatttctctaatgatcagtgatgttgagcttcctttcatacgtttgttggctgcata
-aatgtcttcttttgagaagtgtctgttcatatcctttgcccactttttgatgtttttttt
-ttcttgtaaatttaagttcttgtagattctggatattagacctttgttagctgggtagat
-tgcaaagcgttcctcccattctgtaggctgcatgttcaccctgatgatagttttttttgc
-tgtgcagaagctctttcatttaattagatcccatttgacaattttggcttttgttgcaat
-tgcttttggtattttcttcatgaagtctttgcccatgcctatgtcctaaatggtattgcc
-taggttttcttctagggtttttatggttttgggtattacatttaagtctttaatccatct
-tgagttaatttttgtataaggtgtaaagaaggggtcccgattcagttttctccatatggc
-tagccagttttctcagcaccatttattaaatatggatcaaattcacacataacactatta
-accttaaatgtaaatgggctaaatgccccaattaaaagacacagactggcaaattggata
-gagtcaagacccattggtgtgctgtattcaggagacccatcacacatgcaaagacacaca
-taggctcaaaataaagggatggaggaaaatttaccaagcagatagaaagaacaaaatagc
-aggggttgcaatcccagtctctgacaaaacagactttaaaccaacaaagatcaaaaaaga
-caagagcattacataacggtaaagtgatcaattcaacaactagagctaactatcctaata
-tatatgcacccaatacaggagcactcagattcataaaacaagttcttagaggcctacaaa
-gagacttagactcccacacaataatagttggagactttaacactcagtgtcaatattaga
-cagatcaatgagacagaaaattaacaaggatattgaggacttgaactcagctctggatca
-agtggacctaatagacatctacagaactctccaccccaaatcaacagaatgtacattcgt
-ctcagtgccacatgacacttattctaaaatcgaccacataattggaagtaaaacactcct
-caggaaatgcaaaagaactgaTTAGTTATTAATAAATTGGGCTGAGGCTTGGGCGCTACT
-GAAAGCCACAATATCAGATGCCAGAATGTCTCAAAATCAAAAAGGTTTTTTCCTCTAATT
-ATTTTTTATGTGATCCAAGCCAAGCTGCCAGTGACTATGGCTGTAGTTTGGATGTTGACC
-ATCAGACCACTGACCTTTCAGTAGACCTCATATTCTAATAGGTCTTAGACCACCAGTtag
-ggtgtccatcattcagatttgattgggactgaggggcttcccagaacatgggaattagag
-agctaaaatcaagaaaatccagagtaaattgggacaagttgatcaccctCACTTCAGTGT
-ACTTCTGTCTAGCAAGCTATTTTTCCATTTTTCATGGCTATACCTCATCACATAGGTCAT
-ACATTGGCTTTTCACAGAATCAGTCTAGGGTGCTCTTTTTCCATATTTTTGCCTCAACTG
-TCATTTCCTGAAACACACTCCTTGAGCATGCAGAACACCTTCCATTCTACTTTGTATTAT
-TTTCTTCCCATCATTTGAACTCTGAAATCATTTTGAGTATTTACTCTCTCTCTGATTTTT
-TTTACTAACTTATGGCCTAACACCCCTGCTATAATGTACATATAGTCCTCATCTCTTGgt
-cttgttgacctatgtgatccaaactgcaagaacagtgcgtcacacatgagaaatgctcaa
-taaaaatttgAGAACAAATTATTCAGGCAGTTATCTTAATATATATGAGAAGGTTATATA
-ATATAAAAcagtagtcttcaaactgcaatactggttacaaaaagatttttcaagctatac
-atattgatagtttaaaggaataaaatttcagaccctcaagttccaaatttcttatgatgt
-tttggagcattcttaacaggctcttcttttataactccaatttctcaattttccttctcc
-cactctgaaaagaaaacttacctctcacccaccctttatctgacaatcatggattgccct
-gagtgaacaaacctccagtggacaattgaaatactagtgctggTattcagaaagtgaata
-atcatagactttgaataaaaatcctttggaaataaaagtgtttttaatttttttgtttac
-aaaagcaatgatggggtgtcaatcaagttgatggttaatattaaatagatctttgaagat
-aaactttaataatagcctactatgaaattttttagcatatcacttggaagaggttaaaag
-aactgtgtaaacattagagtcttatgttcaaagagatttcacaataagctacaatgtatg
-tctatgttttgtcacagagaaatgtgatagaatgattaataaaagacttgcaaacacaaa
-aatatagtacattaggatcaaattttgcagagaagtttgaataaaaactaaagttttaaa
-aagaaaaaagatacaatgttcccaattgctaaaaaagagcttctttgcatatttattaaa
-tgaattattgtgattagcaaattgtcatgcattcatattccattggatgtatttagtatt
-tagttgttacatgtcaatatttgtaatatgctattagttatctttttatgattaaaattt
-aagatgaaatagtttatttcccaattttaaattgtattgggaaaatacacactttATTTT
-TATACCTAGCATAGACTTTTTGTTCCTTCTAATTGGAAAAAGGCTTTGCAATTTGCAATT
-GGTATATGTGTGACTTCTAGAAATGTGGTGTTCTttttttgttttttgtttttttgtttt
-ttttgagatggagtctcactctgtcgcccaggctggagtgcagtggcgccatctcggctc
-actgcaagctctgcctcccgggttcacgccattctcctgcctcagcctccctagcagctg
-ggactacaggagcacgccgccatgcccggctaatttttgtatttttagtagagacggggt
-ttcaccctgttagccaggatggtctagatctcctgacctcgtgatccgcccaccttggcc
-tcccaaagtgctgggattacaggtgtgagccaccgcgcccggccCAGGAATGCTCTTAAC
-CACTTCATCAAGCATCAAGGTTGGCACTGTCTAGATGTTGGTTTTGATTGCCAACCTACA
-AAAGAAAAGGGAAATTATAAAAGAGAAAATTAACAAGTGAGTACAGTTTCAAAATCTGTC
-CTGCAAATGTGTTTTAAACCAAAGAAATCATCTTTGGCATGGGCTATTTGCTTTATAGTC
-ATTCAGAATTGCTTGGTCTCTGTCTCCTGAAGACTGTGGCTAGGATTATTCCTGATGAAT
-GAGAAAGTTACCATAAATCAAAAATAAAATGAATAGAAAACTTAACAGTTGACTCTCAGA
-AGAAGGTATCTTCCCTCACTTTGCACTGGTtatatatatatatatacacacacatacata
-taATTGTATAATATGTATTAttttataaattgatttagaaggtacaagtgttgttttctt
-atatgcatatattacatagtggtgaagtctgggcttttagtttagccatcacccaaatag
-tgtacattgtacccattaagtaatttctcatttcttagcccccttctacccttccaagtt
-tccagtgtctattacccactccttatgtccatgtgtatacttagtttccacttgtgagaa
-catgtagtatttgactttctgtttctgagttatttcacttcagataatgAAAACATTCAC
-TTCAGATAATGAAAACACACTTTTCAAAATTCAAAGAGGTTTGAAAAGCTCATGGCCTAA
-TACCCCCACTATAAATTTTATTTTTAAACTGTTCATACTCCTAGAATGAACAGAGGCTTC
-AAACACTATCTGGTATAAACTGATGATGATTCTTCTACTACTGTGATCATTCTGTTTTTC
-TATGATTCCTGGATTTTCCTTTTCCATGAATGTGGGCTTTGCAGCATAACTTCTAGTTTG
-TTTATATCATTGCCCTTTAGGATCTCCTGTAGGCTCAGTAATCTATCACTTCCCTATATG
-GGACTGACCTCCAAATTACTGACTTTATATGTTCTCTCTCTCTCTCTCTCtgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTTAGTATTTGCATTTTG
-CCACATTCTTATATAGTTTCCAGCTCAAGTCTGAAATTCTCTACCtctttatctatgctg
-tccatattaggtatatgatttgataagttagacatgtgacatatatttcccccattctct
-gggttgttttttcattatatcaatggtgtcttttgaagtagagcagtttttaattttgat
-gaagttctcttttttaaaaacacttttctttttggtgtcatatctaagaaatcattccct
-aatttaaggtcataaaggcttattcttgtgttttcttctaagggttttagctttcacatt
-tagctgtacgatcctttttaatttaatttttttgtatgatgtaaggtaggggtccaaatt
-cattcttttgcatgtggctctccagtttctccaacactatttgataaaaagactatttac
-ccactgaattgtctggacacccttatagaaaatcaattaataataaatgtGataatttgg
-gcagatctttggagagaaagcaccaagagtggatggagaggcaacactgacaccaaagct
-gaagagagaggaagctggaatctctgcatgaggtgcctgaacattagggctagttcctga
-ccctgagtggctcctggggaaggggtaagtaaggggactaaggaacatcccgcttttgcc
-atggacctctgggatcatagctacagggtaccccatgtccctcatggatttgtaggctag
-cagggagcaggcagagacagggcttcagccagtgtgaagcccaggagcttttgtgcatgg
-ggcagctctggcagcgcatgaccgcaggtgcccatccccaagggctccccatcttcttct
-gagaggctgtagccccagctgactgctggacctggagagagtggcgccagctttgccatg
-ggactggggtgcatctgttctgcaggctctcctgcctgccagcccctcccatggcccctg
-cctagccaccctgcaggagcatgagcacagcacagcctccaccactaagccggagtgctt
-tgctccacctgagtacattcccagtaacctgggagcacttcagatccctcagtgcagctg
-gagcttgaccccaagccacagatcatccccgtgccccagggctgcagcacacagcttggg
-agcatgcagctgagatctgtggctgacaggcaagtagaggagaggcccccaatatcagaa
-cataaagggggcaagatgtgtgggttcatgggccagcttgggagcaaggtgtgcctccct
-ctgcagggttggtctggaaagggtgtggcccatctccctgccatggcctctgcccaagga
-agccccacagcctggaacacctaacgaaacacagaaatgatgccagtgatcagggtgggg
-tccctaaaggcccaagagcagatctggtgaggagttttctctcccactccactcaccata
-gaacatgcctgcaaatggaaggacatgcaaaagagctgagtaacagcctatgtaccagtc
-actacttaagcatcaatgactagatctcagccccaactacagcaccaaaaatgattctgc
-taatatacacccctgtgaaaccaagtgcaagactttgcccatacataaagatcctgtaca
-gagccacggacctctgaaaacatccagaaatgaactcaactgactatattcaacttacac
-cacatttaaaagaaaaccagcccccctcccaccagaagagaaagaatcaatgcaagaacc
-ccagcagttcaaaaagccagggtgtccccttacctcaaaatcagcccactatctccccag
-cagtggtccttaaccagactgaaatgacagacatagaattcagaatccaaatggcaagaa
-gctcattgagatttaggagaaagttaaaatccaatccaaggaatccagtaaaatgattca
-agagctgaaagatgaaatagccattttaagaaggaaccaaactaaacttctagaactgaa
-aaatttgctacaataatttcataatatgacagtataacagtattaacagaatagaccaag
-ctgaggaaagaatctcagagctcaaaggctggtccttcaaatgaacaaagtcagaaagaa
-aaaatctttaaaactgaacaaaaccaccaagaaatatgagattatgtacagaaacaaaac
-ttctgacacactagcattcccgagaggagggaaagagagtgaacagcttggaaaatatat
-ttgaggatatactccatgaaaatttccctaatctcactagagaggttgacatgcaaattc
-aagaaatacagagaaccccagctagataaaatacaacatgaccatcccaagaaacatagt
-catcagatttgccaaggtcagcatgaaggaaaaaaaatcttaaagccagctagaaagaag
-ggtcatgtcatatgtaaagagaaccccatcaggctaacaccagacctctcagcagaaacc
-tgacaaaccagaagagattaggggcctttttcagaatccttaaagaaaagaaattctaac
-caagaatttcaaatcccatcaaactaagcttaataaacaaagaggaaataaaatatttct
-cagacaagcaaatgctgaggaaattcatcacaaccagatatgcctccttacaagagattc
-ttaagggagctctaaacctacaatcaaaagaacaacacctgctacaaaaaaaaaaaaaaa
-aacatacttatgcacataaagacactataaagcaactacactatcaagtctacataataa
-ccagctaacaacacaatgacaggataaaaatctcgcatatcaatactaaccatgaatgta
-aatggactaaacaacccacttaaaggacacagtgtagcaagattgataaaaagacaagac
-ccaactatctgctgtctttaagagacctacctcacatgtaactacacccacaggctcaga
-gtaaagggataaagaaagatctgtcacacaaatggaaaacaaaaaagagcatgagttgtt
-attcttatatcagataaaacagactttaaatcaacaactatgaagagggacaaagaaggg
-cattacataataataaaggatacaattcagtgagaagacttaactgttgggcctggagag
-agtgggaccacctttgccatgggactggggtgcatctgttctgcaggccctcctacctgt
-agcccctccgaaggcccctgcctagccaccctgcagaagcatgtgcacagtgcagcctcc
-actgccaagcctgagtgctttgctccacctgaatatgtttatattctaaacatatatgtt
-cccaacattgaggcacccagattcataaaacaagttcttcttaacctataaaaagatgta
-gatagccatgcaataatagtgggagacttcaacaccctactgagagtgttagacaaatca
-ctgaggcagaaaattaaccaaaaaatcctggacttcaactcaacgtttgaccaactagac
-ctaacagacacctacaaaatattccacccaacaacaacagaatataacttccttcttctc
-tttggcacgtggaacatattccaagattgaccacatgctcagtcataaagcaagtctcaa
-taaatttaaaaaagtcatgctgagcccattctcaggccacagtttaataaaaatagaaat
-gaatatcaagaagatctcttaaaattacacaaatacatagaaatgctcctgatacctggg
-taaacatcaaattacagcagaaaattaaaaaattatctgaattttttattaaaataggga
-cacaatttaccgaaatatctgtgatacagccaaagcagtgttaagggaaatttatagtgc
-taaacgtcatcatcaagaagttagaaagatctcagattaaccatcaaagtttgcacctag
-aactagaaagaaaagaacaaaccaaccccaaagctagcagaagaaaaaaaaattactaaa
-attagaaaagaactgaaaaaaattgagatgcaaaattccatagaaaggaccaataaagcc
-aaaaggtggttttttgaaagaataaaaaaggttgatagactgctagctacataaccatga
-agaaaaaagaagaccaaaataaatacaataaaaaatgaagaagatgacattacaatgaat
-cccacagaaatacaaaagatactcagagatcattttgaacaactctatgcacacaaattg
-gaaaatctagaggaaatggataaattcctggaaatataaaacctcccaatattaaagcca
-aaggaacatgaaaacctgaacaatcaataaacaagttcctaaactgaatcaataataaaa
-acctaccagcccaaaaaaaccctggaagagatggattcacagcctaattctaccagacat
-aaaaagaactggtatcaattctactgaaactattccaaaaaaatctaggaggagaggctc
-ttccctaactcagtctatgaagccagcatcagccagataccaaaatctgtcagagacaca
-aataaagaaaacctcagaccaatatccctgattaacatagatgcaaaaattttcaacaaa
-atactaggaaaccaatcccagcaacagatcaaaaaattaatacatcagaatcaagtaggc
-tttattcctgggatgcaaggctggctcaatatatgcaaatcaataaatgtgattcaccac
-ataatcagaattaaaagcaaaaaaatatgatcatctcaatagatgcagaaaaggatttga
-aaacaatccaacgcaccttaatgataaaaacccacaacagactaggcactgaaggaacat
-accgtaaaataatgagccatctatgacaaacccatagccacgatcattctgaactggtaa
-aagccggaaccattccctttcagaactgcaacaagacaaggatgcccactctcaccatgc
-ctattcaacatagtactggaagtgctactagagcaatcaggcaagaaaaagaaataaaag
-gcatccaaataggaaaagaagaagtcaaactatccctcattgctgatgatatgattctac
-acctggaaaaccccaaatactctggcaagaggcttataatactgatgaacaacttctgta
-aagtctcaggatacaatatcaatgtcaatgtacatttctatacacaataaccttcaacct
-gagagtccaatcaagaacacaatcccatttataatagccataaaaaatgaaaatccctag
-gaatacagctaaccaaggaagtgaaaggtctccacaaggagaactacaaaatacttctgc
-aagaaatcagagatgacacaaataaatataaacaattccatactcatatatcaaaaagat
-caatgtcatttaaatggctatacattccaaagcaatctacagattcaatgctatttctat
-caaactacaaaaactgcttttcacagaattataaaaaaactattctacaattcatatgga
-atccaaaaagtacccaaatcaccaaagcaatcctaagcaaaaggaacaaagccagaggca
-tcacattatctgacttcaaactatattataaacccacagtaaccaaaacagctgatactg
-gtacaaaaataaacatatcactaatggaacagaatagacaacccagaaatgaagccacac
-acctacagacatctgatctttgataaagacaacaaaaataagcacagggaaaagaccccc
-tattcaataaacggtgcttgggtagctggctaaccatatgcagaagaatgaaagtggacc
-cctgcccttcaccatatataaaaattaactccacaaggattaaatatttaaatgtaagat
-cttaaactataagaatcctggaagaaaacctggaaatacccttctcaacatccacgttgg
-taaagaattcttggctaagtctccaaaagcaattgcaacaaaaacaaaaattggcaagtg
-ggacctaattaaactaaagagcttctacacagcaaaagaaactctcaacagagtaaacag
-acaacctacagaatgggagaaaatattcgcaaactatacatccaataaaggtctaatatc
-cagaatctataaggaaattaattcaataagcaaaaaaaaatcccattaaaaatgggcaaa
-agttataaacagacacttctcaaaagacatacaagtggccaaaaaacatgaagaattctc
-atcatcactaatcatcaaagaaaggcaaatcaaagcaattagataccatctcataccagt
-cagaatggccattattcaaaagtcaaataatagcagaagctagtgaagctgtagagaaaa
-ggaaacacatacactcttggtgggaacaaaaactagttctgccagtttggaaagcagttt
-ggagatttcttaaggaacttaaaaatagagctaccatttgacccagaaatctcattagtg
-ggtatctatgcaaaagaaaacaaatcattctaccaaaaagacacatgcagccctatgttc
-atcgcagcactattcccaatagtaaagacatgaaatcaacctatgtgctcatcaatcatc
-aatggtggattggataaagacaatgtgttacatattcaacatgaaatactatgcatccat
-aaaaaagaatgaaatcatgttttctgcagcaacatggatgcagctggagaccataattct
-aagcaaattaatgcaggaacagaaaaccaaatactgtatgttctcacttataagtaggag
-caaaacattgtgtagtcatcaacataaagaaggaaacaatagacaatgtggattactaga
-gggaggagggaggaaggggggcatgggctgataaactaactattgggtactatgctcact
-acccaagtgaaaggaaacataacccaaacgacagcatcacacaatatacccatgtaacaa
-acctgtacttgtatcccatgtatctaaaataaaagttgaagttataaagaaaaataagtg
-ttagagtttatttcttggctcacaattctactccattgttatatatgtttaGCTGTACTG
-Aggggtctccaagatcaccctcaagtttgatgactcactagaaaaactcaccagacctat
-aaaaacgattatactcatggttacagcttaatacagttaggagatacagattaaagtcag
-caaaggtaaaaggtgcacagagtgatgcctaggaaaaaacaggtatgagctttcagttgt
-actcttcctccagaatcacacgaatagaactcaattcttccaaccataaggtatgacaat
-aagtgcaaaatggtgccagccattttcagtgggagtcaatcacataagcatgaagcatcc
-ccaagactgaatttagctactcaatcttcagcccctaaccttaggagtcaagctaatacc
-gcttggcctgaagccccagtcatagaaaaaaatatatgatttattcaccataaatcacat
-tgttagcataaactatttggcatgggccaagtctcaggtatacaaagacactttatcagg
-caggataattaaagggctcagagattatctgccaggacctttgaaatatgcagggttagg
-acaaccccaaatcttctgagttaaccctttattacacaGTCCACCCCATACCCCTTAGCC
-TAGGCTGTCTTTCAGCAAAACAATTCTATATTTCTGAGCATCTACATTTAGTATAGCATT
-TATATAACAGATCTAGAAATAGTATCAGTATGAAGAAAGATCTCTAGTTATAGTAGATAA
-AATATAGCAGTGGAAGGCCCAGCATACCATGGTTGTGCTATGCTCAAAAACATTTGGAGG
-AGCTAGTGTGGGGTAGGGATAAAGATTTTAAAAACAACTAATCTATCTCATAAAGCCATT
-ACATACATTTTCATATTTTTGTACTGATTTGTTACTTGTTTCTCCCCTTGATCTACCACT
-TTAATCTTACAGCTGCAGAATTATTTAGCCTAGAAATTAGTTTATGGTTAACTAAATCCA
-ATTCTTCCTTAGGCTAGTCATTTTCCATTGGTAATACATCCTGAGGAGGCTTAACTCAAT
-CTCTCAATACATTTGATCATCAGTATCAGTACCATCCTATGACTTATTTAATAAGGTGGC
-TGAATCTTACCAACAATAATAGTGTCACACTGTATAGCAATATAGTCATGGAACAATTTA
-GTTTCATTCATAGAACAAATTAGTAAGGCTTACGTAAGTTTTGCTATGCCTTCCCAACAG
-AAACAGTCCTTGCTTATATACAAGATATACTTATGGACAAGCATTGTTATAATTGTTAGA
-ATGATTTGATTATTTCTGGCTTCCATGTCAACGGAGGACAAAGACAGCCACCCCGTTTTA
-GTTTTCAAGCTTGGACAGAGACTGGTTTCCATTGTGTGATTTTCTACAGCAGGACCTCCC
-CACCCTCCTATGGGAGGTCACAGGTGATATTCAGATAGCTTCAGTCCCTACTAACTGTAC
-TGCAGAATATGTCTTATTCTGAAGCTCTAATGGGGCAAGAATAATTTGTAGTGCATCAAT
-GCACATTTACAAATGCCCTGAGAGGTCTTTCATAAGTTTGAAGGCCCATGAGATTCCCAT
-AAGTGTGTCCCTTTTTCCTCAGCAACTAGGATGTAGTGCTATTTCCCCATGGTTACTTTG
-ACCTTCATCTGTAATTAAAACAGTCAAAAGGCACTGTTGGGTCAGGGTACAAGCCCTTTC
-CCAACGTTGGATCTTAGCATTATCTAGCATTATTTTTGAGTCTACTTGTTTCATTTTAAT
-AAAGCCTCATCACTTTCTCAGGATGACCCTCATCTTTTGCCTTCCTCCTAGAAAAGAATT
-CTCTCCAATCTGCTCATTTTAGTTCAGTAATATTTCCTCTAGACTTCACTAAAAGGGAAT
-TCAGCTTGTCCCATGATGCCTGAACTGACACCTAATGCCCCTAAAAAGTCTGTTTTATGC
-ACAAATGTAGTTTAATTCACCATGCATGTTGTTGGCATTGTATACTTATGGCCCAAGTGC
-AGTTAGCATATGTGGTTTTTACCCCAAAATGCGGGTTCTTCATATATAGATTAGATGAAT
-TGTAGTCAAACTAGATCTAATTTAGTTTTTAGTATGTTTTAATGCCTTTCATAATCTTTT
-TTGTCTCAGGGTGGGGCCATTACCCCAGGGGAATTCAAGTCACCGTGTAATGGCTACTGC
-TTTAATCCCATCATGTATTAATTGCCATTCTCTCttttttcaactttcattttagattca
-ggggatacatgtgcaagtttgttacctgggtatattgcatgatgctgaggtttgggatat
-gaatgattttgtcacacaggtctgagcatagtacccagtagttagtttatcaaaccttgt
-ccaccgcctacccagtagtacccagtgtctattgttttcatctttatgtccatcagtact
-caatgttcagcctccacttacaacatatggtgtttggttttctgttcctgtgttaattca
-cttagtattacaacatccagctgcatccatgttgctgcaaagagcataatttcattcttt
-attatggctgcatagtatttgatggtgtatatataacacattgtctttatccaatccacc
-atagatgggcatgtaggttgatttcatgtctttgctattgtgaatagtgctgtgatgagc
-tataactgcatctgtcattttggtggaatgatttgttttcttttgcatagatacccagta
-atgagattgctgggttgaatggtagctctatcattaagttccttaagaaatctccaaact
-gctttcaaactggctgaactaatttacattcccaccaagagtgtaaaaatgttcagtttt
-ctctgcaacctcaccaacatctgtttatttgtttttcatgtttgagtaatagtcattctg
-actgttgtgaaatggtatccagtcatggttttgatttgcattgctctgatgattagtgat
-gatgagcatttttttcatatgtttgttgagcacttatatgtcttcctttgagaagtgtct
-gtttgtgtcctttgcccattttttccatgagtttttttttcttattgaattgtttaattg
-ccttatagattctggatattagatctttgttggatgcatagtctgtaaatattttcttcc
-attctataggttatctgtttactctgttgagagttttgtggtgcagaagtttaattaagt
-cccactttccaatttttggtttttgtttttttcaattgcttttgagaacttagtcataaa
-ttattttccaaggtgatgttgagaatggtgttttctaggttttcttctaggattcttttt
-tctttcttttttttttttttttttttttttgagatggagtctcactctgttgcccaggct
-ggagtgcagtggcgtgatcttagatcactgcaacctccacctcctgggttcaagctgttc
-tcctgcctcaacctcctgagtagctgggattactggtgcatgccaccacacctggctaat
-ttttgtatttttactggagaccagatttcaccatgttggtcaggctggtctcaaactcct
-gacctcatgatccgcccacctcagcctcccaaagtgctgggattacaggtgtgagccgct
-gcgcccagctcttctaggattcttaaagttttggatcttacatttaaatctctaatcgaa
-cttgagtcaatttttatacatggtgaagggcaggggtccatttcattcttctgcatatgg
-ctagccagctatccaagcaccattactgaattattgaatagaattattgaatagggagtc
-ctttctccatgataatttttgttgtctttgttgaagatcaaatggctgcaggtttgtggc
-tttatttccaggttctccattctgttccattggtttatgagtctgtttttgtaccagtat
-catgctgttttggttactgttggcttatagtttgaagttaggtcatgtgatgcctccagc
-tttgttccttttgcttaagtttgctttgactattggggctcttttttggtttcatatgaa
-ttgtagaatagattttctaattctgtgaaaaatgataatggcagtttgatagaaatagtg
-ttgaatctatagactgcattgggcagtttggccatttaaatgatattgattcttccaatc
-catgagcatgggatattttttcatttgcttatattatttattatttcttttagcagtgtt
-ttgtagttctcccggtagaaatctttcacctccttggctaaatatttgcaatgtatttta
-tttttcatgtggctgtcatgaatgggattgtgttttgagactttgctgaagttgtttatt
-aaatctggaagtcttttggtggaatcattagggttttctaggcgcatagaatcacattgt
-cagcttagagagctaatttgactttctcttttcctatttagacaccttttatttccttgt
-cttgcctgattgtttgggctaggatctccaattctaacagctttcagtggagtctaggtt
-tttctaaatataagattatgctgtctgtaaacagggataatttttttcttttactgttaa
-ttttcagagttttatattttatttattatgtgtagtctgcaaatacattctgtaaggtta
-ttgcttgtctttttattttcttaacagggtcttttgcagagcaaattttaagactttgat
-gaagttaaatttgtcaattactttttatggattgggctttttgtgtcatgtctaaaacct
-cataaccaagcattaagctccatagattttctcctatgttttcttttaaaagctttatgg
-ttttacatcttacatgtgattctatgaccaattttgagggcttttttttcatgtatgtgg
-ggtgtttaggtaagttaattttttttaacctgtggatatgcaactgttccatcacctata
-tttaaaaagattattcttccttcatttaattggttttatatctttgtaaaaaaaatcaat
-tggctatactagtatggttctacttccggattctgtattcttttccattcatgtatgtgt
-ccattcctctgctaatacaaatcttggttactgaagctatacaacaactttcataattgg
-gtagaattaatttctccgactttattctattttttcaagattgactaatccattctagct
-attttgcctttccatataaattacagaataatctgtgtatatttagaaatatcttgatgg
-cagtttcaagatggctgactagaagcagctagcgtgtgctactctcacggagaggaaaca
-aagtagcgagtaaatagtggcttttcaagtggatcgtctgggagaccacatcaggattca
-ccaaggaagtgagggaatcctcagagagcagagagtgaagcctggcagcagccgctcacc
-cgggaccagtgtggagcaagagaaattccctaacatggggaaagggtgagtaagtgagag
-tcctcaggggatccacatggatctttgcaatcctgtgcacaggagaaccccttggcccct
-ataggcctctagatcgacacaacatcctggagtttgtgtagacgcactgctaagggccat
-gtggagccccacaggccctggatccctgatcaacctggtgccagctgccatagccctgat
-aggggctgcagtcatggtgctgaggagtggtcagactgccctgctcctcctcaccaggca
-aggctcggctttggcttccagtgcaacagtctgcctccacctgaactctgcatgtgggca
-cactctacactcccctgggaaccactcagatggcggattgtgtgactcccattcccctgc
-tgctccgagccaggcaaggctagctggtttgggcttcaacacagcacctctgcccctacc
-tgaacactgtagtgggttgcagctttccattcccctggggcaaaactcacagaggtaaca
-gatAATGCCTGGCACCTTTGTGTGTTGCTAATAGTGAAGTTCAACATTATTGGATAGGAG
-GGAGGTGCAAGCATGCCAGGCATTCCACAGCTTCCAGTCTCCATTGCCCCAGCTAAGGGA
-TGGCATGCTCTCCAGTTAAAGGCCCACAGCACAACTGTCCTGCCCCTGCCTGAACATTTC
-ACCTGCGACCCAGAGCCTTTCCGAAAACCCACCCACCACAGGCCTGTGATATTCTTCTGG
-GTTCCCACCACCCAAGAATCCCACcttcccctgcctgagagtttggctggtgacccaggg
-accagcctgaaccccacccccaccccattacagtcagcacctgaaatctgggatagataa
-ccccagtccagccccttcagggccatgcacactgtccagcaggccttctggaggcctgtc
-agctgagaaactatcaatacccttccagtgctgttggcacctgaccaatttcctcagggc
-ctgaggttgggcctacccaaccagcaaacaccaccatgaccaacaccgacctgcacggac
-cCAAAGGTGGAGACCTTCCTTCTCAAAAAGCAGCAGTAATGCCCCATCATagaataagtg
-agccttaaagctatctgtatcaggttgagtgatgaggttataccctgaacaactctcatg
-gagaatcataaaacaagtgttccctgtggccctcaaccacattgcagtccagagatagac
-tatagtgtgcatctgaactaggagtcatgagccctgaaacagggtgtgataaggaaacag
-atcacatttctacctacctaggatggggagctggtgcagtcttctcgcccacaagcccct
-acagagacctcagtgcaggagttgctcccagccacgctcatcagagctggtgcctgtgct
-tgccattggtatactaatgggcaagccaggggcaccagctcttctcagctctgtcccacc
-atccccacagaacaagaagctcagtacatcaggcacccccactgtccagcccttcacctg
-aaacaactgagagcccctaatagtaaaaaaagatcagatctatacccatctgtttatggg
-acagctggctgttacttgcaaatgtcatctaccagtctataggtcaaactggacagccca
-tcaaaaaacctgctggtagaagtgtgtaggactatagaaacaaagccaaaagccctaccc
-aacacaatcccctccagataagaaggaactagtataagaattctgctgtcatgaaaaatc
-tgaatgtgtgacaccaacaaggttcactctagctctccaggagtggtcctagccaaaata
-gaagctgagagatgacagatggagaattcaaagcatagattgcaggaaaattctttgaga
-ttcaagataaggttgaaaatcaacacaaagaaacctgtaaagcaatccagagaataaagg
-aagaggtaaactcttaaaaataaatctatcagagctactgaaagtgaaaaactcacttaa
-gacattccgaaattcaatgaaaagttttatcaatagactagatgtagcagaagaaagaat
-ttcagagcttgaagatcagtctttcaaactaacccagtcagacaaaataaagaaaaagtt
-attttgaaaaatgaaccaaatcttcaagaaatatgggattatgtaaagtgaccaaaccta
-tgaattactggcattctcaagagagaaagaggaaaaagtaaacaacctagaaagcatatt
-tgagggaataattcaagaaaatttcctttatcttgctagagaggtagacatccagataca
-ataaattcacagaacacctgcaagatgctatacaaagtgaacatcatcaagacatagggt
-catcagacagtctaaggtcaattctaaagaaaaaatcttgaaggcagcctagagaaaagt
-gtcagatgagttacaaaggtgagcccatctggctaacagcagacttatcagcagaaaccc
-tacaatcccaaagagactgggggcctatttaaagaattctcaaagaaaagaaactccaag
-caagaatttcataccctgccaaactaagctttataagtgaaggagaaataagatcttttt
-cagacaagcaatcactaaggcaatttattgccactagaccagccttacaagagatcctta
-agggagttggagttctaaacataaagatggaagaacaatatctgccaccacaaaaccaca
-cctaagtacatagcacatagaccctttaaagctattacacaataggaactataaagcaac
-cagcttacaatttcatgacaggatcaaaatctcacatatcaatattaaccttgaatgtaa
-atggtcttaacaccccacttaaaggcacagagtggcaagttggatcataaaataagaccc
-atccatctgttgtgttcaagagacccatctcacatgtaatgacTACTACACTAATTTTAT
-CGGGTTTTTTTCCCCATTGCTTATAAGTTTCATTTTATGGTATGTTATTTTGATTGTATG
-CCAAACATTGGGTAAATGGGTTTTGGAGACTCCAAGTGATGTTATCTTCAAACATAAAAG
-GTCCTCCCTTTCTCCAGATAGCAAAGAGATAAGGACATGACTAATTCAATATAACAAGGC
-ATTAAGCTGGTTCAGGGCTGGGTTTCAGTATTAGTAATGATTCCAACCACATCTAGTTTG
-GTCCTGTTTCTCAGGAATAGCCCTCCAGGCTTTTTCTTCAGGGTCTGTTTGGTCTCAGTA
-TCTTCAGCCCAAAAAAACAATGAGGGAATTCTAGCTCTGTTCTTTATGGTTTTCAAACAT
-TGCTCTTCAGCCTCCTGATTCAGGCACTTCTGTAATGTCTCAAGGGGGAGACTATCTGTG
-TGCTTGAGGTAGGCTCCATATCACTATCATATCTGTTTCCTAAGCACTACAAGAGTACAA
-GAAATCTCTTACTGCCTTTCGGAAGTTTCAGCTGAGCTTTCCAACCTCTCACAAAGCTCT
-ACTTTTCCAATGCTCCATTGGGGGGACTAAAATTTGGGGCACCTGAAATTCCAATTTGTA
-ATTCCTAGAATCTCTGCTACTTCTGCTGATTCAATTACCTCCCAGAAAGCCTTTCTTTCT
-GGGCCAAGCCTGATTTCCCGTCTGTCCCAAACTGACAAAGGCACCCATGGGGGAAATGGC
-TGGCAATTATTGACCTACTCCAGAAACAGAAAGCCTGTTCTGTTCTCTCTTTAGAATATC
-AACTCTTCTAGTACCAGTAATTTCTCTGGTTCTCTAATGCCTTGGaaatattattttaat
-aaaaatCAAGCTTTTCTAGGTTTTGTATCAAAGGCATTGCTTTTCTGTGATTTACTGATT
-TCTCCCCAAGAACAGAACTTCTCAGgcccatttaatcttaacttaattgctgttatgttt
-ggctttaaattggccattgtttaacgtgatttacattttcctgagttttctatatttctc
-ttttttctcctttcttttaatctttctgtataaaccagatgttctttaattccattttcc
-tccccactagtttttaatgtattctccttttctattcatcatcactctagaaatgaagac
-atacattcttaacctatcaatatctaatattaaccaaaaatgtgtatttctcctcagaca
-atgcatggaatacaactccatttcacctgcctccagtttatattctattgctttatttta
-ctttcatataatactaagacaatattattgcatgcgtgacaattataggtagttctattt
-tctgggtgactccaacaagttatcattataaagtaacccattttcctctaagataatttt
-tgccttaaatactattttgttcaatactaagaagtaagataacttccttttgttggtatt
-tgcatgttaagtttttttcccatatttccactttcaatcttctccgtatcttgtttttac
-atttatctgttgtaaatagcatctaatttttcatccagtctagcaactagagttaatcca
-taaatttaccaatctctgaataatatatggaacatagaccactttaattctatttaacgc
-tcccaattgattctattttcagaattttgatatttaattatgtttttaatcttataaaac
-atctttatttaattctGCCAGTTTAATCCACTtttatccctttttttgttgcttcttcat
-cacatactttccatgtgtggtcatttttttaaactaaagaacatcctttagaatttcctt
-tcatgagatctgctatctctatctgaaaaggttgtatttatattttcttcttaaaatatt
-tttgtggatatggatttctaggatgacatttactttgaaaaatacgttgaagagctcagt
-ccattggattatggcttctattgtttgtggtgaaaaatcacctgtcagtgtaacaattac
-tctatcaaaagtatggtttctgtttttccctctgactgtttcccacttttctctttgtcA
-TTTTATCTAGATGACAATTCTTATTTATTTTCTAGAATAGTATTTCTTAGATTATTTCTG
-AAAAAAAAGAAGATTTATTATCTTTTCAAATTTATGTAGCtttttgtaattctttttctt
-taattttctttctccttctctttgaaaatcttattaatcagatattggctctcctggatt
-gacactctgtgtcttatatattttgctcatactttccacttgtttttagacttcaaagat
-tttctcactttatcttcaaatgtgcctgctaaacaatcatttttctaatttccaaaagtt
-tactacttctccttacatagcatgatattattgctttatggatggaataCACTCTTGAAA
-CTCCAGCCCCTAAATAATAGTTATTCTAATGTGCCTTTCTTCATTTATTTTCAGTCATGT
-TAAAGATTTTCTCAAATAGATAGCCAGCCTAGATTGTTTATTCATATTTTACATATATAC
-TGAGCCATTTTATGTGTGCAAACTTGTCCACAGCTTTTGTTTTAAAATGCTTGaactgtg
-aagatagaaaagacatgtttgctggaatgcataatactgaagtttacttctcatagtctt
-tctttagaagttatcgcctaggcagaaaaagaaagtaactaaaaaaaaagaaaacacaat
-ttccaggtatatctgtgccaactcaggtgactagtaaaacaaaattctaagatgacatct
-gtatagcctacataggaagcaaccagttcacattatagaaggaagaatgaatgttccagA
-GACAAAATATAGTTACAATACACCCTCATCTATTGTAGTAAAAAAAAAAAAAAGCTGAAG
-TCTAAATTACACAAATGTAGCAGCATAATACTATTAAATAATAAGTAATTTAATATTCTA
-TTTCATGGCATTATTTTACAGGAGCACTATTTGATCATCTTCTCTTTATCACACATACTT
-CTTCCATTTATCTTACAGTATCTTTACATAAACACTAAAATAGTTATACTCAGATTGTAC
-ACTTTTGAAGGGAGTTAGCCTATTTGTGTCAATTATTTACTAAAACAAAGCTAAATAACA
-GCAACAAAAAAGCCTTGTTGGAACAGGGACCAGGGGAATGATCAGAGCAATAAGTAGCTT
-GCATGAAAATATTATTAACTCTGAATACTTTCTCATTAACATTAACAGTGTGTCCTGCCT
-GTATATTTAATCCATTTAGAATTAAACTATTAATATATTGTGTCCTAGGATGGCAGAGTT
-ATTAAGCAGCCCCTGTATGCTCCAGGGGATATAGGTTGATATTCTTCAGCTGTCAAAATT
-CTTCAGCTGTCAAAATTCTTCAGCTGACTTAAATCAGCAGTAGTGGCGTTTATCACCAGT
-CAACAAAGTTCTTCTATCCTTCACTTCTTTAGCCTACTCATCTAATGGATGTTGGCACGA
-ACATGAAGTTTCTCTCCTAAATATCTATGATGTTCCACAAATCATGGGATATGCCTGCAG
-GCTGCCAGCACAATCAGATCTTCATGTTCCAAGAAAGGGATCATTAGTTTGGCCCTGCAA
-GATGTGCCACCTTTCTTGGAGAACTGAGTGTGCCACATGCAATCTGCTGAGGCATGAACG
-TGCTCTTGGCATTTCTGTTTATTTGCTCCTTATTACACTATATTGTGTCAGAATGATGGT
-TTGGGTTCAACAGTATGCTCACGTAAGCCACTATTCCAAACTTCCTAAACGCACAGTTGT
-GGAATGTGACACAATTGTTGGCAATGATATTTAAACAGGATATGTGTTTTTGGTGGGGTC
-TCTGGGAAAAATTACTAAAGGGAGGGGTGGAGTGATCCAAATATTCAAGTGGTAGACACC
-CACTTGACTTTGGccttccacttcctcctgtttggaatatggtcataatgctggaggtaa
-tgctgccatctataacaatgaagcaaaaacactggataacagtatgtgaacagaagagta
-gagggtgactagcatggtgaagctgttatataatttctggactTTATGTTATGTAAGAAA
-AATAAAACCTGAATTTGTAATAAATGAACAAAATGCCTTTTTCATGTTTTTCTGTTTCAT
-ATTACAGCCTATTATACTTTCTAACTGGCACATCATGGATTATAGATAGAATGTGATTTA
-GGATTAAACTCTCTTAAGTTTAAAATGTGTAGTTTTCTTCTCTCTTGTTCATTCTCTTAC
-TGCCTCCAGTTCATTTCAGAGCATATGAAAAGAGACAATAAGGGACTTTTAGCTGGAAGT
-TTACACTACATTACTGAGTAGGAGGAAAGTAGCTTAATAGTTCTATAAAGAGTATCATTA
-CAATTTTAAAAATAAACAAAAACATAAATTATATACCTGTAGTCTATCCTGAAAATATTT
-CCTGAAGTCACAGATTTGGAGTATTGTCAACTTGTGCAtaaacttcatgagaccatggac
-tattgtttttctcactgctttattcctagctccttgatcagaacaggcagagagaagatg
-cacaataaatgaataaatataataaatgaatGTATCCTTTATTACCTACGCAAACACATG
-CACACAAACACATCTATGAAGTTTTACATGATAGTATAAACACTGCTTTGGTGGAGGAAG
-TTACTGATTTTCTTTTAGCTTGTTTTCCACTTTATTTTTCTTTACCAAATAAGTTTCACT
-TTTGCTATTAGAATATAATAAATAACAGAAACCACAAGAACAAAGTAGCAGCTGAAAAAA
-AGAAATGGAAAATTCTTAATTCATATATGATTGCCTCTGTGAAACAAtgaaaagtggtca
-tccaatttcagtttgaacacttTTTTCCTCATAAAGTCATCCTATACCTTTACTCAAATT
-TAGTTTTAGGTGCATTAGGAGTTAAAAATAAAACATAAACCCATTTAAGAACCAAGAGAA
-TTAGTAAGGTAAATTACTTTGGTAAAATGCCCAAGTTCCAGGCTCTGCTGAAGAGAAATT
-ATTGATTCAACCTTAAAATatttgaagtctctggtaaggtgactttagctaaagctgcaa
-ccagctcaactacaaatcagactgactcactactctagcaacttgacagaagaacaatac
-tagacagaatattaattaccttttggaggtaattatttattgaaaactctactgaacttc
-tatatgtctggcataaaataaaggttatgacatatttttaaaaagaaagaagacataact
-cattgtccagagaggaaatgatcaacacccagccaatggaattatcaaccagaaactcaa
-agtaactctgatagaaatatgctagagaatatagtgggaaaataaacagtactggtgttt
-actgataaaatagagaattttatctatgagccaaaacaaagtaatacaaattaaaaattc
-aatatcagaaatggataattcattcaatgggctgaacagcagactgggagaagcaaagaa
-aacaatcacttcacttgaaactcaaatgaacatttgaatagaaatttcccaaatgaacac
-aaacacaaaaaagtaaagaaaaattgaatacaacatcagagagatgtgagatattatcaa
-ataattcaacatggatttaattggctcccaagaagaagggaaggagagaatgaagcagaa
-gaaataagagctaatagcctcctacatagcaaaattgatccaagaacttcagcaaggtct
-aattaggacaaattcaaagaaaatttctagacatagtggatttcaaactgctgaaaatca
-aagacagagaacaaatcttaaaagtagccagagaaaaaggacatgttatctaggaaggaa
-caatgacacaaatGATGCTGAGCTATTTCCAGAAAAATAAAAACAGCgggtgacatcagc
-aagatggcagaataggaagtcccagatctcatttccacatggaaacaccagtttaacaat
-agatgaacaaaaatatctttattagaattccagaaGAGAAggaaagaaattcaaagattt
-ctcataagaaacttcgaagggcaggaggaagtggcacaatatttttaaagtgcttcaata
-gtaagtctcaatccagatatctatgtccaagaaaatatccttcaagaataaggaccaaat
-aaacacattctcaaatgaaggaaaactgaaaaaaaaagggggggtcactagtaggtatac
-ctaaaagaacagctaaaggaagtcctccacagtgaaagaaattatttttttttttttttg
-agaaaggagtcttggaacataaggaaaaaagaagagagaaaacaaaaacatcagaaatgc
-aataaactttttacctactttttagttttctaaattatttttgacagtaacagcaaaaat
-tatccctctatagtgattctcagcataggtagaaaaaatatttaagtcaatgatattaga
-aatggggggttatcatagagatataaagggagataaaatctttatctgatgtggttaaat
-gatgtaccagtagactgtaataagttatggatatataatgtagcacagacaacaatcact
-acaaaagctatacaaagagatacacttgaaaacactatagatgaatgaaaatggaattct
-aaattatggaaaaatatctcacaaaatggcaggaaaaataagacaaagaagcaaaaagga
-aacaaaaacaaaatgaaagatttaagcattaatatatcaataatttaattaaatttaaat
-gatctaaacacacaaatttaaagatgaatattggcaaagtatgtttttagatgacccagt
-aatatgctatatacaagaaactcacatcaaatataatgatataaataggttataagtaaa
-agaatggaaaaagatataccatacaaatattaataaaaagtttgcaggagtgactatatt
-aatgtcagataaagtagacttcagaacatcaaaaaaattaggatgattttttgtcacctt
-tacatagtgacaaaaggtccaatacaccaaaaagatgtggcaaacttaaatttgtgtgct
-ccaaaacacaaagctgcaaaatatgtgaagcaataacagagagttaaaagagagaaataa
-gcaaaaacacagtcgggatatcaccacccacttctttccagaattgatagaacaacaaga
-aagaaaatcagcaacagcaatagaagagctcaacaacattaactacaggatccacgtggc
-atttaaggagcatttccactcaactagagcagagtaaatattcctttcgagctcagagag
-tgtatactaagatagactatatcctaggcaaaaaaaaaaagaagaagaagaaaaaaggat
-attcaactaattaaaaagaatttaaactgcacaaagtttattctctatatgattgacaca
-gtgaaatcaaactaggaatcaataccagaaataaaacacaaaaatctccaaacacctgga
-aattacacaacatgcttccaagtcaaagagaagtctcaataagaataaaatatacataga
-attaaataaaaatgaacatataacatattcataatttgtgctaaagcagtgccaagagag
-aaatttagaacaacaaatgcttatattacaaaagaagaaaaatgtcaaatcaataatctt
-agctctcacctgaattagaaaaataagagcaaattaaatgcaaagtaagcagaagaaaga
-acataataaagataacagcacaaatcaatgaaattggaaacagaaaaacaatagagaaaa
-tcagtgaaatgaaaagctgcttctttgaaaagatcaataacattgacacacttttagcaa
-gactgacaaagaaagacacaaatttccagcatgcggaataaaacaaagaatatcactaaa
-gaccctatggaaataaaaatgataataagggaatacgataacctttttttttttttttga
-gacagagtcttcctctattgcccaggctggagtgcagtggcacaatctcagctcactgca
-acctctgcctcctgggttcaagagattctcctgcctcggcctcccaagtagctgggacta
-caggcatgggccaccatgcccagccagtttttgtatttttagtagagatggggtttcacc
-acactggccaggctggtctcgaactcctgacctcatgatctgctcgcctgggcctcccaa
-agtgctgggattacaggcatgagccaccgcgcccagccaactaactctctatacattgat
-ttacttttttattttaaaatatccttgcattcccagtagaaaccctagttggtAAAAAAa
-aattattgtttgtaaacccttcttctttgatgttacgcatctacagctaaagatttcccc
-ttaagcaaggcaggagctgcatttcacactttataaaatgttgtattttactatcttgcc
-gttcaaaatacatattaattattcctataattttatctttaacacatggcttttacataa
-ttttaaatagtactttttaaattttaaattaaattttaaatacttttaaataataaaagt
-atgctagttaatttcaaaatattatgtttcttaacatcttatttttattggtttccaact
-taatactgatgtttttctagatatcacatttttaattgattgctattttgcaattatttc
-tgcaatattttagtgttttgacatttatagggacttctttaaagaatcaacactgtccat
-ctcagtgagcattccatgtgcatgtgaaaaaaaaacgggtattctgtaattattggaggt
-agtgttctatacatgttaattggattgaggtggttattcagatttgctacattctttttt
-ttttttttcgagacagagtcttgctctgtcaccaaccaggctggagtgcagtggcacgat
-cttgggtcactgcaacctccacctcccgggttcaagtgattcccttgcattagcctcccg
-agtagctgggactacaggtgcgcgccaccatgcccggctaattttttgtattttagtaga
-gacgggatttcaccatgttggccaggctggtcttgaactcctgacctcgtgatctgcctg
-cctcggcctcccaaagtgctgggattacaggcatgagccaccacgcctggccatttgcta
-cattcttactaaatgtttggtctagttatgctatcaataaccaacagtgaatgataaaat
-ttccaactgattgaagatttttctgttttcaagttacttttgtccatctttacttcatgt
-atttttaagttatattattagatacatcatgtctttctaatgaattgaccctttcatcat
-tatgaaatggccttcattatctctagtaaatactgcttgccttggagtcaaatacatcag
-atattaatataatcacTCCACAATTAACAAAGCCATCAAAAGTAGCTTGTATATCCAACT
-TATTCTCTGTATCGATTTCTTTCACTTTTGGCCTGAAAAATCTTTACTCactgaaaagca
-aagaatataaagaaaaaaaaaaggtaaagaatccaaggactgtgggaaaactgcaaaagg
-tgtaacctacatgtaatgggaataccagaaggagaagaaagagaaaggaacagaaaaaaa
-tatttaaaacaacaattgaaaatcttcagtgggagtataattagttcaaccattgtggaa
-gacagtgtggtgattcctcaaggatctagaaccagaaatacctttgacccagcaatctta
-ttactgggtatatacccaaagaattataaattgttctactataaagacacatgcacacat
-atgtttactgcagcactatttacaatagcaaagacttggaaccaacccaaatgcccacca
-atgatagattggataaagaaaatgtggcacatatacaccatggaatactatgcattcata
-aaaaagaatgagttcatgtcctttgcagagacatggatgaagctggaaaccatcattctc
-agcaaactaacacaggaacagaaaaccaaacaccgcatgttctcactcataagtgggagt
-tgaacaatgagaacacatggacacagggaagggaatgtaacacactggggcctgccaggg
-gtgggggggcaatgagaaagcattaggacaaataatgcacgtggggcttaaaacctagat
-ggcaggtttataggtgcagcaaaccaccatggcacatgcatacctatgtaacaaacctgc
-acgttctgcacatgtatcccagaacttaaagtaaaataaaaagaaagaaaaaaaaacttg
-agtaaaatgaaaaagaaaaagaaaattttccccaaattaatatcaaacatcaaaccacag
-atccaagaagctcagagaatactaagtaggataaatgcaaaaaaaaaaaaaaaaaaaacc
-taatcatgtcatattcaagctccatgaaacaaaatataaagaaagaatcctgaaagaaga
-caaaggaaaaaaTCTTATcataataatagtgctcatttctccaacaagacataacaatcc
-ttaatgtgtatgtgtctaaaaacagagtcaaaCAATgttttgatttgcatttccctgttg
-actagtgatactgagcatttttccatgtatatgttgaccatttgcatgtcttttgagaat
-gtctatttttgttctttgctcatttttcaaggatatcatttgtttttgtttctgtttttt
-ttgctttcagttgagtcccttgtttattctagtttgatacagtcccatttgtctgttctt
-ggttttgttgcctgtgcttttaaggtcttaaaatatttgcctagaccaaagtcctggagt
-gtttcccctatgtcttcttctagtagttttatggttttgggtcttaggtttaagtctcta
-atctattttgagttgacttttgtatatgatgatagataggggtctagtttcatttttctg
-catataaatatccagttcccagcaccatttattgaagagtgtgtcctttccccagtggat
-gttcttggtgcctttgttgaaaatcagttggctgtaaatatgtgaatttatttctggatt
-ctttattctgttccattgatctatatgttcatttttataccaacaccatattgttttgct
-ataagtactatagccttgtaatatattatgaaggcaggtagtgtgatgccacaaactttg
-ttcttttgtctcagaattgctttggctattttggctcttttttggtttcatacacatttt
-aggattgatttttctatttatgtggaaaatgtcattggtattttgataagaattgaattg
-aatctgtagattgttttaggaaatatggtcattttaacaaaattgattgttccttttcat
-gagcatgggaggcatttccatttgtttgtgtcgtcttccattcctttcatccgtgtcttg
-gggtattccttgttgacatctttctcctccttggttaaatttattcttaggtattttttg
-tagctattgtaaatggaattgccttcttgatttcttttttggctagttcattattggcat
-ataaaaatgctactgattttttagcattgattttgcattctgcaactttactgaatttgt
-ttatcaattctaagaggtttttggtggagtcgttaggtttctttaaataaaattatgtca
-tctgcaaagagggataagttagtttcctgtttcccatttagatactgtttatttcttttt
-ttgtctaattgctctatctagcacttccagtactatgttgaatgggaatgatgaaagtgg
-acatcttcttgtcttattccagttcttaaaggaaaggcGACTCTTgggggaggagccaag
-atggccgaataggaacagctccggtctacagctcccagcgtgagcagaagacggcgattt
-ctgcatttccatctgaggtaccgggttcatctcactagggagtgccagacagtgggcgca
-ggccagtgggtgcgcgcaccggcaccgtgcgcgagccgaagcagggcgaggcattgcctc
-acctgggaagcgcaaggggtcagggtgttccctttccgagtcaaagaaagaggtgacgga
-cacacctggaaaatcgggtcactcccacccgaatattgcgcttttcagaccggcttaaaa
-aacggcgcaccacgagactatatcccgcacctggctcggagggtcctacgcccacggaat
-ctcgctgattgctagcacagcagtctgagatcaaactgcaaggcggcagcgaggctgggg
-gaggggcgcccgccattgcccaggcttgcttaggtaaacaaagcagccgggaagctcgaa
-ctgggtggagcccaccacagctcaaggaggcctgcctgcctctgtaggctccacctctgg
-gggcagggcacagacaaacaaaaagacagcagtaacctctgcagacttaaatgtccctgt
-ctgacagctttgaagagagcagtggttctcccagcacgcagctggagatctgagaatggg
-cagactgcctcctcaggtgggtccctgacccctgacccccgagcagcctaactgggaggc
-accccccagcaggggcacactgacacctcacacggcagggtattccaacagacctgcagc
-tgagggtgctgtctgttagaaggaaaactaacaaacagaaaggacatccacaccgaaaac
-ccatctgtacatcaccatcatcaaagaccaaaagtagataaaaccacaaagatggggaaa
-aaacagaacagaaaaacgggaaactctaaaacgcagagcgcctctcctcctccaaaggaa
-cgcagttcctcaccagcaacggaacaaagctggatggagaatgactttgacgagctgaga
-gaagaaggcttcagatgatcaaattactctgagctatgggaggacattcaaaccaaaggc
-aaagaagttgaaaactttgaaaaaaatttagaagaatgtataactagaataaccaataca
-gagaagtgcttaaaggagctgatggagctgaaaaccaaggctcgagaactacgtgaagaa
-tgcagaagcctcaggagccaatgcgatcaactggaagaaagggtatcagcaatggaagat
-gaaatgaatgaaatgaagcgagaagggaagtttagagaaaaaagaataaaaagaaatgag
-caaagcctccaagaaatatgggactatgtgaaaagaccaaatctacgtctgattggtgta
-cctgaaagtgatgcggagaatggaaccaagttggaaaacactctacaggatattatccag
-gagaacttccccaatctagcaaggcaggccaacgttcagattcaggaaatacagagaacg
-ccacaaagatactcctcgagaagagcaactcaaagacacataattgtcagattcaccaaa
-gttgaaatgaaggaaaaaatgttaagggcagccagagagaaaggtcgggttaccctcaaa
-gggaagcccatcagactaacagcggatctctcggcagaaaccctacaaaccagaagagag
-tgggggccaatattcaacattcttaaagaaaagaattttcaacccagaatttcatatcca
-gccaaactaagcttcataagtgaaggagaaataaaatactttacagacaagcaaatgctg
-agagattttgtcaccaccaggcctgccctaaaagagctcctgaaggaagcgctaaacatg
-gaaaggaacaactggtaccagccgctgcaaaatcatgccaaaatgtaaagaccatcgaga
-ctaggaagaaactgcatcaactaacgagcaaaatcaccagctaacatcataatgacagga
-tcaaattcacacataacaatattaactttaaatgttaatggactaaattctccaattaaa
-agacacagactggcaagttggataaagagtcaagacccatcagtgtgctgtattcaggaa
-acccatgtcacgtgcagagacacacataggctcaaaataaaaggatggaggaagatctac
-caagcaaatggaaaacaaaaaaaggcaggggttgcaatcctagtctctgataaaacagac
-tttaaaccaacaaagatcaaaagagacaaaggcggccattacataatggtaaagggatca
-attcaacaagaggagctaactatcctaaatatatatgcacccaatacaggagcacccaga
-ttcataaagcaagtcctgagtgacctacaaagagacttagactcccacacattaataatg
-ggagactttaacaccccactgtcaacattagacagatcaacaagacagaaagtcaacaag
-gatacccaggaattgaactcagctctgcaccaagtggacctaatagacatctacagaact
-ctccaccccaaatcaacagaatatacatttttttcagcaccacacaacacctattccaaa
-attgaccacatagttggaagtaaagctctcctcagcaaatgtaaaagaacagaaattata
-acaaactatctctcagaccacagtgcaatcaaactagaactcagaattaagaatctcact
-caaagccactcaactacatggaaactgaacaacctgctcctgaatgactactgggtacat
-aaggaaatgaaggcagaaataaagatgttctttgaaaccaacaagaacaaagacacaaca
-taccagaatctctgggacgcattcaaagcagtgtgtagagggaaatttatagcactaaat
-gcccacaagacaaagcaggaaagatccaaaattgacaccctaacatcacaattaaaagaa
-ctagaaaagcaagagcaaacacattcaaaagctagcagaaggcaagaaataactaaaatc
-agagcagaactgaaggaactagagacacaaaaacccttcaaaaaatcaatgaatccagga
-gctggttttttgaaaggaccaacaaaattgatagaccgctagcaagactaataaagaaaa
-aaagagagaagaatcaaatagacacaataaaaaatgataaaggggatatcaccactgatc
-ccacagaaatacaaactaccatcagagaatactacaaacacctctacgcaaataaactag
-aaaatctagaagaaatggatacattcctcgacacatacactctgccaagactaaaccagg
-aagaagttgaatctctgaatagaccaataacaggagctgaaattgtggcaataatcaata
-gtttaccaaccaaaaagagtccaggaccagatggattcacagccgaattctaccagaggt
-acaaggaggaactggtaccattccttctgaaactattccaatcaatagaaaaagagggaa
-tcctccctaactcattttatgaggccagcatcattctgataccaaagccgggcagagaca
-caaccaaaaaagagaattttagaccaatatccttgatgaacattgatgcaaaaatcctca
-ataaaatactggcaaaccgaatccagcagcacatcaaaaagcttatccaccatgatcaag
-tgggcttcatccctgggatgcaaggctggttcaatatacacaaatcaataaatgtaatcc
-cgcatataaacagagccaaagacaaaaaccacatgattatctcaatagatgcagaaaaag
-cctttgacaaaattcaacaacccttcatgctaaaaactctcaataaattaggtattgatg
-ggacgtatttcaaaataataagagctatctatgacaaacccacagccaatatcatactga
-atgggcaaaaactggaagcattccctttgaaaactggcacaagacagggatgccctctct
-caccactcctattcaacatagtgttggaagttctggccagggcaatcaggcaggagaagg
-aaataaagggtattcaattaggaaaagaggaagtcaaattgtccctgtttgcagacgaca
-tgattgtttatctagaaaaccccatcgtctcagcccaaaatctccttaagctgataagca
-acttcagcaaagtctcaggatacaaaatcaatgtacaaaaatcacaagcattcttataca
-ccaacaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaa
-agagaataaaatacctaggaatccaacttacaagggatgtgaaggacctcttcaaggaga
-actacaaaccactgctcaaggaaataaaagaggatacaaacaaatggaagaacattccat
-gctcatgggtaggaagaatcaatatcgtgaaaatggccatactgcccaaggtaatttaca
-gattcaatgccatccccatcaagctaccaatgactttcttcacagaattggaaaaaacta
-ctttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaa
-agaacaaagctggaggcatcacactacctgacttcaaactatactacaaggctacagtaa
-ccaaaacagcatggtactggtaccaaaacagagatgtagatcaatggaacagaacagagc
-cctcagaaataacgcccatacctacaactatctgatctttgacaaacctgagaaaaacaa
-gcaatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgt
-agaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatt
-aaagatttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacc
-attcaggacataggcgtgggcaaggacttcatgtccaaaacaccaaaagcaatggcaaca
-aaagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaa
-actaccatcagagtgaacaggcaacctacaacatgggagaaaattttcgcaacctactca
-tctgacaaagggctaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaa
-acaaacaaccccatcaaaaagtgggcgaaggacatgaacagacacttctcaaaagaagac
-atttatgcagccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatg
-caaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaag
-tcaggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttgg
-tgggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatcta
-gaactagaaataccatttgacccagccatcctattactgggtatatacccaaatgactat
-aaatcatgctgctataaagacacatgcacatgtatgtttattgcggcattattcacaata
-gcaaagacttggaaccaacccaaatgtccaacaataatagactggattaagaaaatgtgg
-cacatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgta
-gggacatggatgaaactggaaatcatcattctcagtaaactatcgcaagaacaaaaaacc
-aaacaccgcatattctcactcataggtgggaattgaacaatgagatcacatggacacatg
-aaggggaatatcacactctggggactgtggtggggtgtggggaggggggagggatagcac
-tgggagatatacctaaggctagatgacgagttagtgggtgcagcgcaccagcatggcaca
-tgtatacatatgtaactaacctgcacaatgtgcacatgtaccctaaaacttaaagtataa
-taaaaaataaataaataaataaataaataaaaaaggaaaggctttcagcttttcttcatt
-caatatgatgttagctgtgtgtttgtcacatatatgacctttatttattttatttatttt
-atttttttgagacggagttttgctcttgttgcccagggtgtagtgcagtggcacgacctc
-agctcactgcaacctctgccttctagtttcaagtgagtctcctgcctcagcctctcgagt
-agctgggattacaggggcccaccaccacacctggctaattttttttgtatttttagtaga
-gacagggtttcatcatgttggtcaggctggtctcgaactcctgacctcgtgatccgcctg
-cctcagcctcccaaagcgctgggattacaggcgtgagccactgcgcctggccatatgacc
-tttattatgttgaggtatgttccttctgtgcctagtttgttgagtttttaatcatgaagt
-ggtgttgaattttatcaaatgccttttcctgcatctattgagatggtcatattgtttatg
-tccttcattttgttgatgtgtcatgtttatcaactggcatatgttgaatcatttttgctt
-ctctgggataaatgccatttgattatgatatattacctttttgatgtgctgttggatttg
-acttgctagtattttgttcaggatttctgcaggatttcatcagggatattggcctgtagc
-ttctttcgttttgttgtgttcttgtcaggttttggtatctgagtaatgctggcctttaga
-atgctatagggagaattccttcttcaattttttggaacagtttgaggaggattcatgtta
-gttatttatacatttggtagaacttggtaaaccagtgaatccttctgatcctgggctttt
-cttcagagattttttattacgaattcaatcttatcacacattattggtctgttcaggatt
-tctgtttctttttgatttaatgttggtggctggtatgtgtgtgggaatttaccttttccc
-ctagattttcctgtcagtgtatacttgttcataatagtctctgatgatcttttgtattct
-gtgatatcatgtgtgatgtctccttttttcttttctgattttaacacacaaaagtataaa
-tcactggtacagcaaatgcataaatgaggaaaagacccaaatgttaccactacagaaaac
-cactaaaccataattataaataagagagaaaaaaaaggctatacaaaacaaccaaaaact
-aattaccaaaacgacaagaaaaagtcctcatatataaatagtaagtttgactgttaagtg
-gattaaatattccacttaaaacatataggctgtctgaatgaattttttaaaaaagtgacc
-cagtaatgtaatgcctacaagaaactcacttcaactgttaagacacatagactgataata
-aagggatagaaaaagatatctcatgcacacagaaaccaaaagcgagcaAAGAGACGATGG
-CAGTACGTTCAGGTAGgagataagcttccatgacctcagctgccaccattccccacaatg
-ccccagctacccaagagaccctgagcccactcaactagtacattacttgtacaagtagta
-cgttactactatagctggcatttgagagagccactacagtaaagctatttgcaaccaagg
-aaatcataaaaagtctacataactcctcgacacgcccatcagggctaatgattgtggttg
-ccattgggaaacctgagggcaagcctgccccatcgagctgtgcccaactttgcccccact
-ttggggctgagaatggagcccatgccactgtgcattccacagacagaccatttcctgaga
-caatactgtttctcccagtaaacaaagatcaaatataaactccctgctatcaccgcatcc
-agctcttaactgcaagtgccacctactggcctggaggtcaaactgcacaacccgatagaa
-gtgttgacataagcgtacagtgctcgagaaaaagataagcgtctcaggacctctgccact
-caagatctgcaggagactgtgagcctcatcacatgcctagtacatcactactacaactgg
-catttgagaaagtcaccgcatgaaggctatttataaccaaggaattcatacagagTATAT
-GCCATTCTCCCCATCATTACCACAAgtgctggtgtttgtgcctgccaatgagctatttga
-aggaaagtttgacagtttagctccacccagctttatcctccccttaggggctgagcaggg
-agctcaggccagtgtatattccatagactgtcccttgcctgaggcaacagagagcttctc
-cccgtaaacaaagatcaagcatacacccacctgcttctgcccagattttattcataagca
-ccacatagtagcctggaggtctaactacacaacccagtaaaaaactggcttacacaagtg
-cacagcacggggaaacaagttaagcttcctaagacttctgcactctagccctgcaggagg
-cagtgagcctagcccagcacatcactactacaaccagcatttgagaaagccaccacacaa
-aggctatctataatcaagaaactcatacagactctttgccactgaaagcacccagaacca
-aggccaaataaccctacacaatgtatattataatcacatcctcaagggggaaaaagtcct
-gaccaaatgaaagtaaatttaaaaataagaacagatagttgatccaaatgagaaggaacc
-caagaaacaattctggaagtataaaaaaaagagtgttacaacaccccaaaggattgcact
-aactcttccacaatgaaccctaaccaaaatgaaatctttgaaataccaaagaattcaaaa
-tattaattttaaagaatctcagtaaggtccaagagaaagtaaaaaatcaatacaaatcag
-aaatataactcaggatatgaatgaaaaatctactaaagagatggattttttaaaatagtt
-tttttgttgtttgtttgtttgtttgttgttgttgttgttgttgttgttgagatggagtct
-tgttctgttgcccaagccagagtgcagtggtgcgatctcggctcactgcaaactctgcct
-ccagggttcaagtgattctcctgcctcagcctactgagtagctggaattacaggtgtgtg
-ccactacgcccagataatttttttttttatttttagtagagacaaggtttcaccctgttg
-gccaggctggttttgaactcctgacctcaagtgatctgcccaccttggcctcccaaaatg
-ctgggattacaggtgtgagcccactgtgcccagcctaaatagttttttcaaatgaacttc
-tgtaattgaaaaattcatttaagaaattacaaaatatagttgaaagctctaacaatagac
-taaaccaagcagaagaaagaggttcagaacttgaagacaagtctcttatgaattaaccca
-gtcagacaaaaataaagaaaaaaattttaaaaatgaacagagctttcaagaagtatgaga
-ttatgtaaagtaactgaacctatgagtcacaggtattcctgaggaaaaagaaaaagtgag
-aagtttggaaaaactatttgaggaagtaattggggaaaacctctttagtcttgctagaga
-tttagacatctaaatgaaagaggctcaaagaatgccaggaagatacattgcaagacagac
-ttcatcaagatatgtagtcatcagactatctaaagtcaacatgaaggaaaaaaattctaa
-aatcagcaagagaaaagcatacagtcatctataaaggaaatcccatcagaataacaatgg
-gcttctcagcagaaaccttacaagccagaagagattggatctaatttttggacttcttaa
-agaaaaaaaaacctgtcaaacacgaatgttatgccctgctaaactaagcatcataaatga
-aggggaaataaagtcaagtctttcctgacaagcaaatgctaagataattcatcatcacta
-aaccagtcctataagaaatgctcaaaagaattgtaaaagtcaaaattaaagttcaatact
-caccatcataaatacacacaaaagtacaaaactcacaggttttataaaacaattgagact
-acagagcaactaggtaaaaaattaacattacaacaggaacaaaacctcatatatcaatat
-taactttgaataaaaagggattaaattcccccacttaagagatatagattggcagaacag
-atttaaaaacatgaactaactatatgctgtttacaagaaactcattaataaagacatgag
-ttcaggtaaaggggtggaaaaagatgttctacgcaaacagaaaccaaatgagagaaggag
-tagctatacttatatcagataaagcacactttaaatcaacaacagtaaaataaaacaaag
-gaggtcatcatacaatgataaaaagatcaattcagcaagaagatataaccatcctactaa
-atacatatgcacctaacacaagactacccagattcataaaacaaatactactagacctaa
-gagggatgagaaattacctaattggtacaatgtacaatattctgatgatggttacactaa
-aagcccatactttactgctactcaatatatccatgtaacaaatctgcgcttgtacttcta
-aatctataaaaaAATTAAAATTTAACAAAAGTAAATAAAACACatagctaaaactaaaaa
-agcaaaaacaaaaactatgctaagtattggtaaagatgtggggaaaaaagtaaactctca
-aatattgctagtgggagtataaattgttttccactttggaaaacaatttggtaatttcGt
-ttttttttttttcttttctcttttttttttttttttttttGCATGCCAGAAAAAAATATT
-TACAGTAACTATGGAACACAAAGGTTTATTACATCCATAATTAACATGGAACATTTACTT
-ATCAGTTTGACAAGGACAACACTGAGACCTCTTAGGACAGAGAGAAAGGGCAATTTTCAA
-AGGAAAAAAGCATAGTATATGCATATttaataagtaaaacatacacataccctgtgactc
-agccattgtacatctagctgtttatccaagagaaatgacagcatatggctacacaaagag
-ttgcacacaaattttcaatggcagttttatttgtaatagctaacatctgaaaacaatcat
-aatgttcattagggggtaaatggataaatgatcatatatgcataaaaagtaatacaagca
-ataaaaaggaatgaactattggtacacgaaacatatatgattcaaaataattgccttgga
-tggaaaaagacaagcggaaaagtatacatgctatattacttcatttatgtaatattcaag
-agaatgccaagaaagctacaagaacaaatagcaggtcagtcgttgcctgggtatcatgga
-ggtagagggagggaagggaagaggaaagagtggatgccaaagaggaatgagaaacatttt
-gagagtgaaggatatatacattatgttgattaaggtaatggtttcaccagtgcatctttt
-gccaagttcatcaaattatacactctaaataatgcagtttaatgtacatcaattatatct
-caataaTTTGGAATGAAAAAAAAAAACTCCTCACAAAGAACAAAACCTCTAGGACCTGAT
-AGCTTTCAGTCACAATATAGTCAGGCACTCAAAAAAAAACTTTAACACAATAAAATTCTC
-TTTGAATGCCACCTTAAACTCAATCCCATCCAGAGAAAACAACTTTTATTAGAATGACAT
-GTGATTTGCATTTTTAGTTCATGCATTTACTTATATACACATAAATATAGCTTTTTCACA
-TAAATTAGAATCATTGCTATGCATGTTGTTCTAAAATGTTGCTTTTTCACTCAAAAAATG
-TTTAGTAAGATAAAATCTGCTGCACTCTTTTTAACAGAAGCACAGAATTAAATCATATGG
-ATGCACTTCGTTTTATGCTACTCTACAGAGTGACAAGACTTCTTTGTGCATTTATCTTTG
-AGCACTTATTTATTTCTTTGTAAAAGGCTTTCTAAATTTCCAGATCATCAACAAAGCATT
-AATTTGGTCAGTTAAAAAACAATTGCTTATATCCTTCTCTGAAAAGAATGATGTACAGAA
-AAGAATTATATATATATATGAATAATACATCATAAGTGTTCAGAAAGACATTGTATTTTA
-GGTGGAGAGACAGGCAGGTGACCAGACTGCTACATGCAGTAAGATGAACCCTGATAGAAC
-TAACACTGGAGGCTGTGAAAAAACTGCTAGGAGCACCCAGCCTTGGTAGAGCAGCATAAT
-TTCTTCCTGTAATTCTTTCTCTCCAAATTGCCATACACTTCAGCAGAGTTTGCAACTTCT
-CTTCTAAGTCTTTATCCTTCCCCCAAGGCATGCCTAGCACAGGACTCTTGAACAGTGATG
-CCTCAATTAGAGTTGCTAGCCAATAGATTGAAGCTATGTTGGCACAATATCCTACATCCT
-CCCGATCTACTGGCTGAGCCCAACCCCACCTAAGAAGGACAATAAAGATCTGTGTTCAGA
-GTCATACTGAATAGAGACTTCTGGACTCTATAGAACCCACTGCCTCCTGATGAAGTCCCT
-ACTGTTCACCCTTGCAGTTTTTATGCTCCTGGCCCAATTGGTCTCAGGTAAACAGAATCT
-TGGGGAAGAAGAAACACTGGCCTGGAACAGGGTCCTGCACATGGAGTCCCTGTTTCTAAG
-TGGTCTGTGGAAATGGGGTCTGGCTTCTCACTGGGAGCAGGGCTGAGATTTGTCCTACTT
-CTTCAGACCACCTCTGTTCTAAGAAACTTGAAGGCTCTCAGGATAGAGCAGGATCTGTGA
-TCGGAGCTGGGGAGGAGGGTAAGGCAAATCCCATACAGTTGCCTCCAAAGGTAGAAATGA
-TCTTGAAATCCCAAACTTCTATCCTGTCACTTCGGGTCAGTCCAGTCAAGCCCTGCCTCA
-TTTCACTTTTGTTTTTTTTGCTGCCGATATTCCCTCCTGAGGTAACAATTATATAATATT
-ACTTCCCCCAGTTTTCTTGGTCTTACAGAGAGGTCTCTGATTTTTTGTTTGTTTGTTTGT
-TCTTGGATGTGGTTAACAGAACAGGAAAGGCTGTTTCTATATATGTATAGGACTGTAAAA
-TGGAAAATGAAAAAAAAAATTCTGTGTGGGAACTATTGGAAGTCTATATCAGATTTCAGC
-TCTGTTTGTGTAAGCATTTCTTATTTTTAATTTATTCTGTAGCTTATATTTACAAAACCA
-AGACAAGAACACTGAAAGTTATTTAGAAATAAATTGGCCACATTTCATCACTGCTTGCAT
-TTTTTCACTTGTAACCAactgatatatgagcttataacctgctttatttttttacctacg
-attctatcaggaaaattttcacaggtcttgaatattccttgaaaatacaatttgcagtag
-atgcttataattctgtcatatttttgtaccaatattaacttggaaagtccttaattgtgt
-gtcatttggattattttttctaatgtgtgagtactgtaaataacattgtacaaccttatt
-aatatatcattgtgagattctctgtttgtataggtaaattttagaagttccattgcttgg
-tacaagggtattatttcttctaagttaactggcacatattgccaaTGGTTACTATTGGAG
-TATTTGTATTTTTAACATTTGTATTTCATATTTCTTGCAAATATTTTCAAACATATTGGT
-TGCTTCTAAAATGCATTATTTATTTGAGACACATAATTTTCATTTTCATGTCAAATCTAT
-TGGTGTTTTCTTTGCATTCTTCCACTAACTTAGTAAGTCCTTCTCCGTGTTGAGAACAGT
-TATTCACCTATGATTTTGTTTTTTACACCGGACTCAATCCCACCTTTTTACATAAGGCAC
-AATGAAATAAACTAATATTCTTTAGTATAATTTCCTAATGGGTTATATAATAACTCCATA
-GCCCGCCTCTAGAGATAGTAGTTTATATTCCCTAATTTGCAGAAATGTTCAAATTGATAG
-TGGATAAGAGGAAATTATAATGCTCTCATGGTTGTCTCAAAAGATGTTTCAGGCCTATTG
-CATCCTTGAAATTCTATGAGTTTAAATTGCCTGATTTCTCCCTCTGTCTCTGGAACATTA
-GTGACATACATCGACATACATCACATACTTGTATGTTGTCCTTTTTCTACACTTTGTGTG
-TGTGTATATATATTCTAACATATACATATATATAATGTTAAAAACTCAATCATCAGAGGA
-GGATTAAACAGCTGATAAGGGATAATAGTAGTGGTAATAGCATTCAAAAACGTTTGCTCT
-GTTCACTTACTGTCAAttacctcatatttctttcatttattgtacttatcacaatctgta
-gttattttgtttattcatttacttgtttattttctttctccccctctccaatgtaaggtc
-ctcaaatcatgtctttctgttcattgttttattccctgcatcttgcagaattcttgacat
-ggtaggcactcatcatatacttgttgattaagtACAGTAATGAGTTAAGCAAGGTAAGAA
-AGAGCTCCAGCGTCACTCTAGGGCCTCTATGTGTTAAACCATGTGATGAGATATTTTCAT
-ATGTATATAATATGTACACATATATAGGCAAACCCTGCAGAATGTCTCCCTAATGAATAT
-ATTCCTAATGGAATGGCTTTTTTTATTCTCAAAATTTTGTAAAATGTACTTATATCTCAA
-TATCATATAGGTATATAGGTATAGATGAAAATTTTTTATTTATCTTTCCATAACTTGACA
-TGACATTTTTAACCAGATAATATGTAAGATAAGCCTAGAGTTATCTTCTAAATATAATTT
-TTAGGATCTCAGAAACATGTAAGGGACATTTTGAAAATCTCACCAATTGGCAACAAAAGC
-CATATGTGTTTCAGTAATGGTGAGAAAGATGACAGCAATTATTTTAGCATTTCTTATTTT
-TGAAATGATAGTTTTTACTTCTGTTTAGGTGTTTGTGTTTTAGCTACATTTTAGGAAATT
-GCTTGGGGATTTTGTGTTCATGTATAACAACATGCTATATATTTTCCCATTTAAAATCAT
-GGGGAATTGGCCCCTGGTAAGTGTTTGTATACAGAATTCTGATTTCAGAAATGAGAATCT
-CATACATATCTAAAGAATTCTATGTGTGTTTATAAAATTTCACTTAATCCTCAAAGTAGG
-TATTTATGATTAGGAAAAACATGCTAAAGCAACTGGAAAGGCACTTGAATAAACAGTGCT
-CAAAAACTATTGCTATTTTTTATCCTCCTGTGATAAATACTTAGGCTTAATAATCTATAT
-AATTCCTTTATTCAGGTAATTGGTATGTGAAAAAGTGTCTAAACGACGTTGGAATTTGCA
-AGAAGAAGTGCAAACCTGAAGAGATGCATGTAAAGAATGGTTGGGCAATGTGCGGCAAAC
-AAAGGGACTGCTGTGTTCCAGCTGACAGACGTGCTAATTATCCTGTTTTCTGTGTCCAGA
-CAAAGACTACAAGAATTTcaacagtaacagcaacaacagcaacaacaacTTTGATGATGA
-CTACTGCTTCGATGTCTTCGATGGCTCCTACCCCCGTTTCTCCCACTGGTTGAACATTCC
-AGCCTCTGTCTCCTGCTCTAGGATCCCCGACTCATTAAAGCAAAGAGGCTTATTCTGGTG
-TCAGTTTTCTCTCTACAGCCCCCTTCCCACTTTCCCTCCATTCAACAGTGTCTGGAAGGG
-CACCACAATTTCACTGCACTCGCATTTCTATGGTAGAAATGCAAATAAGATAGGGGCCAG
-GAACAAGGGAGGGTTAGTCCAAAACACCCACTCAGGAATGATAGATAGTAGCAATGTCCT
-CCTTGAAGACAGTTCTAGGCCCACAGCTTGCCATAGCAATTATCAtcaaacttcatgtac
-atcagaaacacctggagagatggctaaagcacagatttctagggctcacttttagtttcc
-aattctgcaggggagcttgagaatttgcactgctcacaagttcccaggtgatgctagggc
-tgctggtccaggcaccacactgtgagaacAATTAGCTTATAATATGAAAGGATTGAAAGC
-CGACTGTGAATGTGATTTTCTACAGATTGAAGGCTGCATTTCCTATGTAGTTTTGGAGTA
-GATAGTAATACAAAatcatcctacagaatcctccgacaacaacctgagaatgtaggtatt
-ataacctcactttagagaataggaaactTGATTTCTAAGCATTAGAAGACTGGGACAGAC
-TAAATTGACTACTGAGAACATTCTGTCACTGCACCATGAGGTTGCCCAATTTTCTTCTCA
-CCCTGGAAATCCTCATTCATAGCTTCCAACTTAAATATGATGAAAGGGAGATCAAGAGCT
-CTATAATGTGTCCTGAATGTTAGGACAGGCACTCATCCCAAGCAATAGAATGTTTTCCGT
-ACATTACATTACATTGATGCTCTGCCTGCACCAATAAGAGAATATGACTGGGTGTATCAT
-AGTCATCCATCCATGCCTCAGGCCCACTTCCCTGATAGTTGGACAGGGAGAATAGGGAAT
-GCAGATGCCTTCGCTTTCTGGACACTTACAGTAGCTGTGTTTGTCTTTGTCATCTCAGTT
-TGCTCACTTATGAAATGCTAGCGTTTTACTCAGTATCTTTCTCCCCACCCCTGTCATAGT
-ACATCTTTCTGATTCTGAAGATATAAGATTGGCTTATGTTTTGTGGGGTCAACTTCACCT
-TTGACCCCATAAGATCCTAGAGATTTAATGTAGATATATAAAAGTTGGAGAAAACATTGG
-TGGAAGGGTTTTCTCCACTATAGACACAAATCCATGAGTGTCATCACAGACTCCTTTTCC
-TTCTTCACTTGATTCCAGTGAAGATCCATGTTCAttctaccacctccaatatgtaccatg
-acctctatctccagctgctgctaggatgattgcaatagccttcccattgattgccctgca
-ttcctttcacactcacgcctaactatcctccacaatgagagccagaatcatttttctgaa
-acacagatctaatcattagactcccctctggcatcttttcccatagcatcctaagacaac
-tcttcagagcagccttcatcactcttggcattcagaacctgccttgcgtttccagtttta
-cctccaaagcactgtcacagggcatcttgctatcccaccaacatacctcttcgtgattgg
-tttgaactcactggattgcttctggttttgagtttttgtacatacttttctgtctCCATT
-TATAACTGCCTGGAAAAAAATCTTTATTTTCTTCTGGAGGACTTTGATAACCACACTGTT
-CTACCCACAATAGAACTACTGCCACCATTTGTGCTCCACTGTTATGACTTACCCAGAATT
-TTAAGTCATCATGTCACATGCCTCACTCTGAATATCTGCTTATGTCTTCTCCCCTACTGG
-ACTTTGAAATTTTATTTAGGAACAGGAACCATCTTATCTTCTCTTTCTCCTACCATCCCC
-TAACAAGATTCTATATTAATTCTTGTTGAATAAGTAAGAGGGATTCTCGAAGGCCAGAAA
-GATCTTTGGATGTTACTGAAATCTCATTTTTATTTATTTTAGATCTTCTCCAGGAAACAG
-GCTTCTGTCTCCTTTAGAAGACATATCTATGATCTATGTCATTACATAGTAGAGGAGTTT
-TGAGAGGTGGCTTGTCCCATGTGGTAGGACATCATTGCCTCTTACACCCATGCTTATCTT
-TGCAGGCAGAACTCATGAACTCACACAAGAAGGTGGGCAGATGGAAGCAAGTTACTTCAg
-cagaggagaatagtaggaaaaaaacataactttagagctggatgtatctgaggtcattca
-tgatcccaccatatatccactcttggaccacagacaaatgatttcccatcttcgagcctg
-ttactgaatttgaagaacagagaaaatactcactcccactcaaggtactttgagggttgc
-cagagtaatctattaaaatgttaatcataTCATAGGGATTCAGCTGTAACAGGTTGTTCC
-CTGGATAAGAAACAGTACAGCACATTTCCCCAGGGCCCTGCCCACTGGGCCTTGGCTGTC
-TTGCCTGAGTATGGGTGATTATAGCCTATGTTTCACCTGGGGGAAGACGCATTAGGCTGA
-GAAGAGTGTAACAGAGTTGAGGGTCATGGGATCTCTTTGAACAGCCAGATGAGATTTTAA
-AGGTTCTAGTAGAACTTGCTGTGCTTACTTTTCAATAATCACCTTGATCACTACCTTGGA
-AACATCTTAGAGCTATTATCACATTGATTCTAGACGATGAATATAATCTCAGTGCTGCAG
-CCTGAAACATTGTCCTCCTGTCCTCTTGCCTTATATCTCATCCGTCCTTCACGCAGTGCT
-GGAACTTAGGTGGCAAATATTCTTTTCCCACTTTGGAGTTGACTAATGGCATTAGGAGGC
-CAAGGGAAAAGGAATCTTTATGGTGAGAGAAACTGCAATGTGCCAAGCACATTAATACAC
-AATTTCTTAAACAAAAGCATTGTATGATAATtatgacaacatgattaaagctgaggaacc
-tggagtaaaatgtatctagggttacatctaggtttgttccttactacttttactcatcat
-gtggtctctatatcaatttcttcatttgcaagacaggtataatcatgcatctacctctta
-gaatcactctaaaaattaaaatagataaggcatataggtcaccgtgatctctagcaccaa
-tgaaattctaagaaatgtagatttTAAAAGGCATATGAGATATAGGTTATTCTGGTTTAA
-AATATGAAACGTTTAAAAAATAAAATATGTAAGTCCTGAGTTTCCGGGAGAAAAAGGGTC
-TTGCACAAGAACAACCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCCGCATCTCTA
-CCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCC
-GCATCTCTACCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTT
-CTCAAGGCCGCATCTCTACCCCATCTCATGCGAATCCTGACGACGTCCTCAAAGCTGAAT
-AAATTTTTGCCTTAAATAAATTAAACGAGATTTAGATTTCACCAGTCACTGATACTCAAT
-CCCAATTGGATATTCATTCAAAAGTCTGACTTCTCTCCTGAGGTGAGAGTAAGATTCCTG
-GGCACTTTTTCATAATACTTACCTTAACCTAGCTAAACACAATGGACACTCTTCTTTGAG
-gtgtcagtggaaattaagaggagagtctgaactcttacctcccacatggggcttgcagac
-aggtgaagatggcgctcctcccctttgttggtaatggagacctagaagaaaggctgggca
-tccagctcccacgcagtcatatgaagcagcccagagcaacattccccttcactgcctgtg
-cggtggcagtagagacctagcAGTAGAGACCTAGCTGGGAGTCAGATCTCCCATCCCTCA
-ACCAGTGGTAGTGATTGGCCTGGGgaggaatcccttccctgctggtgccatgtcagtgaa
-aactgaggggagactgaaattgcccttccttccaatagtataaaaggcctgaagcagact
-tcccttcccagccagtacattaccattgaagaccaaggggtggtctcaacttcaatccct
-aGGGAGCCGTGGCTGGCATCAACCCTCCTTCCAGTCAGTGAGGATAGAGGATAGGAGGGT
-GCTGGAAAATAGGTGTCTTTAAAACTGAATAATGTTGTTTTTACCACAATTTTAAAAACT
-GAATAAGAAGACATGGCAGACCCCTGAAACTGGATAACTACACACGGAACTAACCAGAAT
-TAACATGCAGAAGGTTTGAGAATAGAACTGCAGTGGGGAATACCACCTAGATTTTTAaaa
-taacaacttgtatatatttaaggatatatgcaatatgatgttttgatatacatagacata
-gtaaaatgattgctataatcaaattaacatatccttctcttcacatagttatcatttttt
-gaggagacagcacctgaaatccatcttcttagcaaatttctagtatacaacaccatatta
-ttaactagagtccccatactgccctttagctctctagactttatcctacacaacttcaac
-tttgtacccttcgacgagcatccccccatttcctccaccacccgccccacccctgataat
-cactggtctacactcttctatgtatttgaatttttaaattccatgtataagtgagatcat
-gctgtactttttttctgtgtctgtcttatttcacttagcataatgtcctctgggttcatc
-catgttgttctgaatggcaagctctcctttgtcaaggctgaataatatgccattgtatat
-atatacaatttatttagtgtgttcatctatcgatgtcgatagatgataatgtcttcatct
-atcagcttaggttgatttcatatcttggctattgtgaataatgctgagcacagatatctc
-tacatggtgccgatttcatttctttttggtatataccaagacgagggattgatggctcat
-atactagttctgtttttatttttttgagaagcctccatactgttttacatcattgttgta
-ctaatttacatttccaccaacagtgcgcaaaagttccctttacattctcaccaatacttg
-tgatctcttgtctttgtgataatagtcatcctaacaagtgtgaagtgatttctcattgtg
-cttttgatttgcatttccctgatgattagtgatgttgagcacctttccatacacttgtta
-gccacttttatttcttctccagaaatatttctgttcatgtctttgcccaattttcaagtg
-ggctctttgttttttgctactgagttgtgtatgtttcttatatgttttttatattaacct
-tatgtgatatatggtgggcaagtattttcctcccatcccataaactgccttctcactctg
-ttgactgtttcctttgctgtgcaAcaaatgatcttcaatgataatacaaagaatatgcaa
-tacagaaatgatagtcacttcaacagatggtgttgggaaaactggatttccacaggcaga
-acaaatgaaatggatccttatcttacaccacacacacacacacaaactcaaaatggattt
-aaagacttaaatgtgagcctggcaaacttaaaactcctaaaataaaacagaagggaatat
-ctttatgactttggtctaggcaacagttgcttgaatatgacatcaaaaccacaagcaaca
-aaagcaaaaatatattagtgggactatggatacatttgaaacaaactacaaactagtaaa
-atctcagcaaagaaatagaagatataggccaggcacggtggctcacgcctgtaatcccag
-cattttgggaggccgaagagggcggatcacgaggtcaggagatcgagaccatcctggcta
-acatgataaaaccccgtctctactaaaaaaaaaaatacaaaaaattagtggggcatggtg
-acaggcacctgtagtcccagctgcttgggaggttgaggcaggaggatggcgtgaacctgg
-caggcggaggttacagtgagccaagatcatgccactgcactccagcctgggtgacagagc
-gagactccatctcaaaaaaagaaaaacagaaaaaagaaaaagaaatagaagatatgaaaa
-taatcaaatggaaattataaatttatgaaatgtaatcaaagtaaaaaagaaaaagtcact
-gtataggctcaatagtagatggaacatgacagaggaaaaaataagacagatctatagaat
-tacccaatctaaaaacagagaaaaatagactgataaaaatgaacagagccacagatacct
-gtgggacataaaaagatctaatgttcatgtcatcagagtcctcaaggagagggagagtgt
-ggaactgaaaaaaatatttgaaggaataatgcctgaaaaatatcccaagtgtggcagaat
-acatacatctgtaattcaagatcttgaattaacccaaaacaagataaacccaaagaaatc
-catgccaagataaagtataatcaaactaaaactaatagctagagacagaaaaaaatcaag
-cgagcattcagaaacaatacaccacccatggtaaaacaatggtttgattgatgggatttg
-tcatctgaaaccatggaagcaaaaaagaaatgtcatcacatgtttcaaatgccaaaataa
-agaactatcaaatccaaatcctatatctagcaaaaaaaaaaaaaaaaaagttctctagga
-ataaacagggaaagaaaaacattctcaaacaagaaactattaagggaatttgtcactagc
-agccctatcctaaaaatatagtcaaagaaagttctctaaaccaaaatgataaccgggggc
-ttggaacttcagaaaggaagaagtcgaagtcaatagaatgggtaaaatgggaggtgaata
-taatagactatgcttttttttttgctttattttttttttatgctttcttttcttgagata
-gtgtctggctctgtcgcccggacaggagtgcagtggtacaatctcagctcactgcagcct
-cgacctcctgggatcaaaggatcttccctcctgagcccagtgagtagctgggaccacagg
-agccggctaatttttatatttttttgtagagacagggtttcactgtgttgcccaggctgg
-tctcgaactcttagactcaagcaatctgctgcctcggcctcccaaagtgagactatcttt
-ttattaaagagttttgaaatcatgtttggtagattgaagcaaaaattgtaacattgtctg
-atgtggttctaaatagatgtagaggaagtacttaaacattataagctgggtaaggcaaag
-aaatttaaagtgaggtaagtttttatacttcattcaaacttgtaaaactttgacaccgta
-gactgtgataagttaggtacagcaaccactaaaaaaaataaataaatacaataagaaatt
-atagctaaattatagtggaattctaaGgaacaaatagaaaacaaaatataaaatggtaac
-ttaatccctaacatgtatcaaaaagataccccatacaaatattaatcataagaaagtagg
-aatggctatattaacatcagttaaagcagacttcagagcaaaacaaattatcaaggacag
-agagggaaattatataatgccaaaagggtcaatcaaccaagaagacatggcagccctgat
-cgtccacaaactgaaaaccagagtttcaaaatacctgaagcaaaaactgataaaactaag
-aggagaaataaatttacaatatcaggccaggcgtggtgactcatccctgtaattccagca
-ctttgggaggctgaggcaggcaaatcacttgagcttgggagtttgagatcacctgaggca
-acatagtgagacccccctctctataaaagatacaaaaactaaggtgtggtggcccacgcc
-tgttgtcccagctactcaggaggctgacatggaaggcttgagcccaggacatcgaggctg
-ccgtgagctgtgcactccagcctgggtgacagagcgagaccccgtctcaaaaaaaaaaaa
-aaaaaaaaaattacaatatcaacttcaacagttgatagataggacaactagacataaaat
-ccacaagggtgtagaagaatttaaaaataccacaaagcaacaggatctaatagacattta
-taaaacatttcatccaacaacaatggaatacactccttggtgtttatgccaaggaaatga
-aagtgtttttctccacaactcccgggcaggaatatcaatggtagtgttatttataatagc
-ccaaaagagtaaacaaccaaaacgtcattcaacaggtgaatgactaacatagggtggtac
-atccatacaatggaatacttctcagcagtaaaaaaaaaaaaaaaaatgaattattgatac
-atgcaacagcttatatagattataagagcattatgctgagtgatgaaaaaagacaaaggg
-tcacatagtgtgtgactatattcacataacattgtctaaaaattatgaaatgtagaacaa
-attagtgctttccaggggttatgaatagtcaggagagggagggaaatatgccagtaagac
-aataagagagggagatcttttcataatgaataattctgtattttgatttgttgatggtta
-aatgaatctaAGAAGGATCTGATAATCTAGTATTAGACGCATAGTACAGTAGTGAACTTT
-CAGCCTCTAGAGAagtgctctccaatagaagtaactaaaaagatggaaatgttctaaatc
-tgtactatacaatatgttagccactggtcatgtggttgtaaagcacttgatatgtgCTCT
-ATAATattttgagcaagtttcttatgttttctgtgcctttgagtttctcatttgtagaat
-ggagataataatatctacctcaaagtgttgctgtaaaggtaaatgagtttatgtatgtaa
-gacaccgacaggagtgccagcacatagaaagtgttatacaagggttagccattTGTTATT
-GTCATTGTTGTGTTTTGTTCTCTTTCTAATGTCTGGACCTTCAAAtgattcagactcatg
-ggaccatacttcattctgtttttataactttaacctgtaagattctcattttaattggaa
-tttcatatttaggaattcttgggtgccttggatatatgaagaaaagattcacatctgctt
-ccactaaacaactagcgaattaacaactgagatttcttataattaaattatttacttgat
-ttttttaatccatataaatagcttgaacttaggttgaaacccatgagaatttgtggctac
-agttcatagggttaatatttaccttctccatccagagccaaggttaaTGCTGACAAAATA
-CAATCTAATACAGATTAATCTGTGTGTGTGTGTATGTATACACTCGTGTCAGAGAGAGAG
-ATTTCATTCTTCCTTAGGCTGAGATTGTTGCCTTTGAATCTCAGGTTTATATAAGGGTAT
-CAATTATATGTCTTCCCTAGGACTAGATCTTAGCTTTATACATCTCACATAGCCATCAAA
-ATAATGTTCAACTTATCTTTCAGGGTTTGCAATCTTAGTTTTTGGCCTGTGCAGATTCCT
-TTCATTTTTGACGGTTTCTCAATGCAGTAATTTCCTTTTTACATTTACCCAACTTTTTTG
-GTTATTTTCACCAGATACATTGTTCAATATATCTATTCTACTATATTCTATTAATAACAG
-TCTACTATATATGTGTCTTATTGTCTAatattgctgaaatctttttttaatccaataatg
-aatctctgtcatctaatcagtgagtttaagccatgtgaatgtattataactactgatcta
-ttaggacttttttctgccCTCCAGTTGTGACTTATCTATTCCTCATTTTTTTTAGTTTCT
-GTTGGATGGATCATATGTTCTTCTGCTAATATGaatattataattttatttttatttgtt
-ttattaaaaatttGTCCTTGCTCTTAGGACCCATTCCTATCCTTATATTTATTATTACTA
-ATTTAACATCCAGCTTCAGAAATACAACTTTAATAGGAAGGCTTTTTGTATTTCTCCTGA
-CTGCTCAGACTTAGGGTCTTTATTTGATGCTCCACCACCAAGTCACCTATAAGGAAAGTT
-TGCATTCACAGGAAGACTATAAATAATAAAACCAATCCCTTGACTAGGACTTAAACCATG
-TAAAAGCTGGTGGCAAAAGTAAAGGGAGGTGACCCTTGAGACCTCTGAGGTAACTGCTCT
-TAAATTTACATTTGCCTCTAAAAAGGATTTCTTATATGTCAACATCTCTCTGTTTAAACA
-TATTCTTGTGTAAAACCACTACGTGACCTGAATAATGGCCATAGGGCTCATCTCTAAGCC
-AACTGGCTTATTTATTTAATGCATCTCAGTGGTTAACAGGGTTGAAATTTTTTGAAAACT
-GCAATCAATGATCAAAGAATGATCTAGGTAAACATCGATTCCTTGTGGCAACATTTTAAT
-ATTTTCAAAGACAAGGTACAACTGGTAGAAAAAAAATACCCTCATGCATCTTTttcttct
-aattgtggtaaaatatatgacataacattggccattttagccatttttCCttttattttt
-agttgacacataattgtacttatttataggatacaaagtgatatttcaatacatgcatat
-aatgtgtaatgatcaaaccagggtaattagcatatccgtcacctcaaacatttatcattt
-gtattgggaacattcaaaatcctctcttctagccttttaaaagtatacaataaattgtag
-ttaaccatattcaccttacagtgctacaacaccagaagtcattcctcctatctataattt
-tgcatccattagccaatctctctccatcctcccctctccctaatcattaccagcctctaa
-tattaatatctgcaacactactctctacttccatgtgctcaacttttttagctcccatat
-ataaataggaacatgtggtaatctttctgtgcctgacatttcacataacataatgtcctc
-caggctatccatgttgttgcaaaggacagaatttcattatttttatgggtgaatagtatt
-ccattgtgtGTGTGTGTGTATATATATATATATATATTCCATTGTGTGTTATGTATGTAT
-AGTATTCCATTGTGTGCatatatatgtatatatgtgtgtacatatatatatacataatat
-atattcttctgcacatggaaatccagtttctccagcatgatttattgaagagggtatcct
-ttccccagtgtatgttcttggtgcttttataaaaaatcaggtgacCTCAGATCAGACCCA
-ACTACATCATACCTTCTTTCGAAATGTGCAAGAAACCTACTAGAAATTCTTATTGTTAGA
-GTTTCAGATTTATGTCCTGGTTTATACTGCCACATTCATTCTTGGAGGTGAGTACATTTC
-GATCTTGGTCCGGCTGCGCAGAGAGTCAAAGCAGGAAAATCACAGATTCTTCCCAGCAGT
-CTACAGCCTACACAGCGGCATTTGGTGCGATGGGATGGAACATGCTGTATCTCTATTCCA
-TGTGGGGGTAAAGTGGGTGGCCTGAAATTTCCTGTGTCTGCCTGCATGATGCAAAGCTCA
-CAGTTCAGAAGCTTAAGGACACACTTCATATCATCCCATCTGTTCTGGTTCAGTGCATAA
-GAATCTAAGTCTCTGAGGAAGGTAGCATAGTGTGCAGTTCACTGGACCAAAAGCTTTGGC
-TGCACCTCTTCTGGAAAGCCTGGCCATGGGGCTCTTCATGATCATTGCAATTCTGCTGTT
-CCAGAAACCCACAGGTAAACCAAACCAGAAGCTCACTCAAATCAACAGTGGGATGGAGCA
-TTTTCAGGAGCCAAAGGGAACTTCATAATCCACACTAAAGGGAAATAGAGCCCCCAAAGA
-TGGCTAAAGTTTATCCAACATCATCAGAAATTTCCTCTTTCTGGAGCCTTATTCCATGTT
-ACTATCCTTAAAGAGGAGTACTCACTGAGCTAAAAAGAGGTCATAATTTCTTCTGGGAAA
-GATGTGTTGTTATAGAAAGGAATGATGCCAATATCTAGGGATACCTTTATGTCTTTGGAT
-ATGGTTTTTACTCTGATGCTCAGCTATATTTCCTTTTACTCAAATATATATAtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgCATGAatagaggaagaagcaaattttggagttaggt
-ttaagaaacatgccttcaatatctactagtttgtcaactttaagtagtgaagactctagg
-agcctcagtttcctcatctatggagataatgacacctggttaacaggggttttattaaat
-gatataacctatgtgaagcttggcacatactgagaactcaaaaatTAGAGTTTCCTTTCC
-TCTTTCAAAACCAGATTTCTTACATGTGTCCCTTATTATAAGAATAGTAATGGCCTATTC
-CTGACCCTCTACATTCCTAAGACCCAATAGACTACTACCTTACTGGATAACATGAAAGTC
-ATTCTTGACCCTGATAGTGGGTTTGAACTCAGGAGAACAGTTTGATTCAGACATAAACAC
-ATAGTAACAATACATTGTTCTCTGGGCATCAGAGGAGGTGCAGTAGAAGGTAGTGCTCTG
-GGAGCATTCAGGATGCAGGCAGATTTGCTGAGGTTCCTATGTAGAGCATAGTTCCATAGC
-CTAGAATCAAGGGTTCAGCTCCTTTATTTTCTCAGATAAGATCTTATGTTCTTGGCAGAG
-TCTATCAGATGTTAAGGGAGGCCTAAAACCTCACAGGACCTAAATATAAGTGATCCAGTT
-AAATACAAACACTGAGGTTGACCTTGTCGGAAAATCCTCTTCAGAATATATGAGGGTCTG
-CCTTGTGGATACCCCATACCCCTAATTCCTACAAGCCTCCTCTGTCTTCCCCAAAACCAA
-CGTGCCTTCAGTCTCAAACACTGATATTGTTCTATTGCTCCTTTCTGTGTATAGTAACCG
-AACAACTTAAGAAGTGCTGGAATAACTATGTACAAGGACATTGCAGGAAAATCTGCAGAG
-TAAATGAAGTGCCTGAGGCACTATGTGAAAATGGGAGATACTGTTGCCTCAATATCAAGG
-AACTGGAAGCATGTAAAAAAATTACAAAGCCACCTCGTCCAAAGCCAGCAACACTTGCAC
-TGACTCTTCAAGACTATGTTACAATAATAGAAAATTTCCCAAGCCTGAAGACACAGTCTA
-CATAAATCAAATACAATTTCGTTTTCACTTGCTTCTCAACCTAGTCTAATAAACTAAGGT
-GATGAGATATACATCTTCTTCCTTTTGGTTTCTTGATCCTTAAAATGACCTTCGAGCATA
-TTCTAATAAAGTGCATTGCCAGTTTTCTGTCTCATTTTGTTCTTTAACCAGGGGTTGAAC
-ACTCATTATATACTAGGTAATGAATTGATAAGAACTCAGAACCTCTCCTTGAAAAGGGGA
-TATGACAAGTACACTAAAAAAAAAAAGTCCTATAGTGTGGAAGTCTGGAATAAGAAACTC
-AGAAACACTGACATGTAATTTAGGAGAGGGAAAGGTGAAGCAAATATTCAGGGGAAATTC
-ATGAGTAAGTTTAGGAATAAAGCAGTGTCTTGTAGTAAATAAGTAAATAGTAAAGCAGTA
-AATAAGTAGGATTTCCATGGATGAGGTTTGGTAGGGAAGGCAATTTGAGTGAACAGAATG
-GGAGGAAATTGGAAAAGACAGAACATTTCAAGACACTATACATGCACTTTGTTTGGATGA
-AGAACAGAGCACTCAAAGTTGAACTATGGGGGAAGTCTGATTTCCTAAGCTCCTGTGTAC
-CAGCAGTGAACTGGGAAGACGGAGATAAATAAGATTCCACTGTTGTGGAGCTCAACAGTG
-GAGCTCAACGCTTCCTCTATGAAGTGGAGAAGACCTAAGTAAATAACTCCAACACAAAAG
-TTTTTAGGTTTTTGCTttgttgttgttgttgttgttgatgtGTTCATCTTTTTTGTTATT
-GGGGCCCTGTGGAGTTTAGGGGAAATGTAAAAGATCTAGGAATTGGTCCAAATTGTAGTG
-CTTTCATTGTCTTGATATGCAAGAAGAATAATCCATGTACATACTCTGCTGAATTCTTAA
-AGATGTACCTTCTGAATATGATTAACATGGAAAGTTTCTTCTTCAACTACATTTCAAAGT
-CATTTGCTAGTTTTGTTTCTTATATCATTTCACCATAACAATTACAAGCATTTTAAAGAT
-TTAGTTCATCCACTATAACATTTACCACTAATGTGTGGCATGTGTTCTCTTAATCTCTCT
-CTTTCTGGTGttctagggctggtatagggagcacctaaaacaagcctaaaatatcttgtg
-gtgccagaaagtaagcaattgcttaataatcaaaggatagggtctgcaaacacggacaat
-ttgacttcctcttttcctaattgaataccctttatttccttctcctgcctgattgccctg
-gcgagaacttccaacactatgttgaataggagtggtgagagagggcatccctgtcttgtg
-ccagttttcaaagggaatgcttccagtttttgcccattcagtatgatactggctgtgggt
-ttgtcatagatagctcttattattttgaaatacgtcccatcaatacctaatttattgaga
-gtttttagcatgaagggttgttgaattttgtcaaaggctttttctgcatctattgagata
-atcatgtggtttttgtctttggctctgtttatatgctgcattacatttattgatttgcgt
-atattgaaccagccttgcatcccagggatgaagcccacttgatcatggtggataagcttt
-ttgatgtgctgctggattcggtttgccagtattttattgaggatttttgcatcaatgttc
-atcaaggatattggtctaaaattctctttttcggttgtgtctctgcccggctttggtatc
-agaatgatgctggcctcataaaatgagttagggaggattccctctttttctattgattgg
-aatagtttcagaaggaatggtaccagttcctccttgtacctctggtagaattcggctgtg
-aatccatctagtcctggactctttttggttggtaagctattgattattgccacaatttca
-gatcctgttattggtctattcagagatgcaacttcttcctagtttagtcttgggagagtg
-tatgtgtcgaggaatttatccatttcttctagattttctagtttatttgtgtagaggtgt
-ttgtagtattctctgatggtagtttgtatttctgtgggatcggtggtgatatccccttta
-ttgtatatgtagaaaaccccattgtctcagcccaaaatctccttaagctgataagcaact
-ttagcaaagtctcaggatacaaaatcaatttaccaaaatcataagcattcttatacacca
-acaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaaaga
-gaataaaatacctaggaatccaacttgcaagggatgtgaaggacctcttcaaggagaact
-acaaaccactgctcaaggaagtaaaagaggatacaaacaaatggaagaacattccatgct
-catgggtaggaagaatcaatatcgtgaaaatcgccatactgcccaaggtaatttacagat
-tcaatgccatccccatcaagctaccaatgcctttcttcacagaattggaaaaaaactact
-ttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaaag
-aacaaagctggaggcatcacactacctgacttcaaactctactacaaggctacagtaacc
-aaaacagcatggtactagtaccaaaacagagatgtagatcaatggaacagaacagagccc
-tcagaaataacgccgcatatctacaactatctgatctttgacaaacctgagaaaaacaag
-caatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgta
-gaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatta
-aagacttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacca
-ttcaggacataggcatgggcaaggacttcatgtctaaaacaccaaaagcaatggcaacaa
-aagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaaa
-ctaccatcagagtgaacaggcaacctacaaaatgcgagaaaattttcgcaacctactcat
-ctgacaaagggttaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaaa
-caaacaaccccatcaaaaagtgggtgaaggacatgaacagacacttctcaaaagaagaca
-tttatgcaaccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatgc
-aaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaagt
-caggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttggt
-gggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatctag
-aactagaaataccatttgacccagccatcccattactgggtatatacccaaatgactata
-aatcatgctgctataaagacacatgcacacgtatgtttattgcggcattattcacaatag
-caaagacttggaactaacccaaatgtccaacaataatagactggattaagaaaatgtggc
-acatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgtag
-ggacatggatgaaataggaaatcatcattctcagtaaactatcgcaagaacaaaaaacca
-aacaccgcatatcctcactcataggtgggaattgaacgagatcacatggacacaggaagg
-ggaatatcacactctggggactgttgtggggtggggggaggggggagggatagcactggg
-agatatacctaaggctagatgacgagttagtgggtgcagcacaccaacatggcacatgta
-tacatatgtaactcacctgcacaatgtgcacatgtaccctaaaacttaaagtatttaaaa
-aaaaaaaaaaggatagggtcatattaaaagaacacaggagtcggtctaaaagagcttcaa
-atgaccaaagctgcgacaatttgagcaataaaataaataagatagcattggattataata
-caacatataataaatatctatgagtccatgatgatatgaataaataattgaataaattgg
-aaaattggtgagaacagatgtgccatatagaataattcccaataattcatacagatactc
-cctgctgaagaaggtggagcttgacctccctctcccttgagcatgggctgtatttagcta
-cttgtttccaaagagaagtgtgtggaaaggagttaaaaaataatttcacctggataaacc
-tgataaggtcatgtttcagattttatggagaaatcatattgataacatgaacctgtgata
-tgatctgatgagaatggcacttcacttctgttttcttcctcccaaaaccctgcgacccaa
-gacaaacaatgaaaaacatcagaaaaactcaaattcagtggcattctaaacaatatttga
-ccagtatttctaaaaactgtcaaatttatcaaaaaggaagaaattctgagccacagtcaa
-agaccagagaagcctaaagagacaggacaactaaaggtaatgtggtatcctggatggact
-cttggaacaggaaaagaacattaaggaaaaactagtggtgataatagtaataataataag
-tgtagagtcatttagtagcaatgtatttagctgtgatggctgcattgtggtaatataaga
-tgttaacaatagcagaaactgggtgaatatttgggagctctctgtattatctttgcaaca
-tttctataaatctaaaactattctaaaactgaaaatgtatttAAATTTTAGAAAACTGAC
-CACAAAATCAATTTGGCACATTCCTTTTCTTCTTATTTACGAAAGAGCTTCTCatttctt
-cattgaatgcttggtagaatctaatggtaaattcaactggaacggaactctttacaggaa
-gtattgttatagattaagtttattgcaggttaaaaggcaattcagttttctatgccttct
-agtcaactgttgtatttggcatatatacttttcccatgttctaagatttttatacttgct
-atcctaaaactcttgtaatatcttctttttatcttattaatgcctgtaagatatgtaatg
-acaccttctttttcatttttgacatctattatttgttttattttctcttttttcttgata
-agtctcacattcacttattaatttgatttatctttacagaaaacaaattttcttcattaa
-ttttAGTTTAGTTTCCATTTCTTAGACtgtgacttgcattgcccaattgaaagtgattga
-aagtgacaggttcacttccaagtggaaacttaagagccagtgtgtccatgtgcagtggct
-cacacctgtaatctcagcactttgggatgctgaggcgggcagatcacctgaggtcaggag
-tttgagaccagcctggccatggtggtgaagccctgtctctactaaaaacacaaaaattag
-ccaggcatggtggcagggcctgtaatcccagctatttgggaggctaaggaaggagaatca
-cttgagcccagaaggcggaggttgcaatgagctgagatcatgcctctgcactctagccta
-ggtgacagagccagactctttctcaaaagaaaaaaaaaaagagccagtgtgcagtttaac
-cgtctctcatctctctgccaaggtgattgtggaagcactgttgacatagagcctctgtca
-gcctgaagccccgagtgaccatgaaagcagggtcattcttttgacctaaaatagacatct
-agcactgccagaaataaccttttgggaagttactctatgagagctgaggtttgtttttta
-ttTTGttttatatatattttttaaatCAGGAATAACTTAGACCAGGGTGAACAAACTACT
-GCTGTCAGGGCAAATCCAGCCCATAGCCTGCTTTTGGAAATAAATTTGTATTAGAacaca
-cacacacacacacacacacacacacacacacacacatacacacatacacacaAATATATC
-TTCACTAATGTTCTTTTTTTCTTGTTTTTCAAAAACTtttacataccataaaattcacct
-gttttaagtgcacaatttagtgTCATTTCTATTTTTTATTTTCGgtatgcttttcttttt
-gtaactttgttaggtgcatgtttatctttataaaagaaaagccttccttcttttcaaata
-tgagagtttaaagttgtaagtttctctctatacacagcctgagcaccatcccacaaattt
-tcaatatagagtatgttcattgttacattataaaccttctcatttctcttAAACCATGAG
-CATATAAATAACATATAGATTATATAAAGACTATGGATACAAATGTTAATCATGCAATTT
-TGTCAACTAGTTATAATTACATATACAGTAACATTACTTTGGTGATATGTAAACCAAAAT
-GTAAACAAAACTTGAAAGCAAACAGAAAATATCATATGCAAAAACTTGTACACACTTGTT
-CTTCATACAGTTTGTTTTCAAATATGATCTTCTATCTTGTTATAGGTTTTCTATGGCTTT
-AAACTGACATTTATTTTTCATTTATATTGTCCTCTGTTATGATTCTTCCAGTCCTGAACT
-TCCTGCATCAGTAATTTTTAAAGATATTTTTGGTTTACAGAAGTTTACCAATTATTACCA
-TAATTTATCATCAATTTATTAACTCTCACCATCATTTCAAAAGTGAAAGAAATTTCACTA
-CCTAAAAATATGTATGTATGACATTTTAGAAGAAAACAGACTTTTAACTAAATGCATTCA
-TGTCTCTTAAAATTTAGTTCTATCATTTTAATTTTTTTCATTTTATTACAGACCAGTTTA
-AACTTTGTCAGAACCCCATTAGGGCCCATGTATCCATTTAACAACAAAATTCTGTAATTC
-TTAAATTCTCAAATTCATAATTTATATAACCACTGATACCCAATTGGTAGTAGTCTTCTG
-AGGAATGTTTCTATTCCATTATTCCTTGTCTTCTCTAATCACTCTCTGAATCTAAACTTC
-TCTTTAGTTTTTTTTCCCTATAATTAGATGTTGAGGTGTTTGGCTTACTTATCTTCTTTA
-TTAGAATAAATAATATGTATCCCATCCCTAATGATTAGCACTTTGTCAATTTTTATATGT
-TTATGACAGGTGGACTCACTCTTATTCTAAACTCTGATATTAGTGATATCCAATGCCCCA
-TTCAGAGACCATTAAATTAAAAATGCACTTATTACTTCTGGGACTTTCTAGACAATTTCC
-TTCATCTTTAAAAGATCTGGGACAAACACCACAAGCTTTGTCCCACATGAAAGTTCTCTG
-CCCAAGTAATGAAGCATCTAAAAATGCTAGTAaagatattagattttaatataacacatc
-aataattatatttaatataaatgatctaaatcaggggtccccaccccccaggccatggac
-cggtataggtttgtggcctgttaggaactgggccacagagcaggaggtgagcagcagtgg
-gagtgagcattaccacctgagctctgcctcctgtcagatcagctgtggcattagattctc
-ataggagtttgaaccttattgtgaactgcacatgcaaaggatctttgcgtgctccttatg
-agaatctaatgcctgatgatccaaagtggaacagtttcatcctgaaaccatcttcccatc
-cctgccagtttatggaaaaattgactgcattaaaccggtccctggtgccaaaaaggctgg
-ggaccactgatctaaatacaccaataaaaagaaaaagattgtaagattggattttaaaag
-acctgactctatactgaccacaaaaaaAAACCCTCACTTTATTCTTTattgcatatattt
-atggtgtacaacatgatgttttgatacatgttgtgaaatggttaatatagtcaggcaaat
-caacacgttcatcatctcacatagtttccctttgtgtgtgtgtcgcaagagcacactact
-tttttaacaaaaattccaagtaaaatataatattatcatagacctcacgttgtacattag
-acctctagacttttttaatcttacgtatctgcaattttttatcctttgacctacatctct
-ccatttccttcccctccaaccacacccctggtaacgaccacattattctctatctccttg
-tattcagctttccttttttttcttttaagattccatgtataagtgaaatagtgcagtatt
-tttctttctgtgtcagtttatttcatttagcataatgttcttcatgttcattcatgcctt
-ggcaaatggcaggatctcctttttgaagagtaaataatattccattgtgtgtgtgtgtca
-cagtttatccattcatctatcaacagttcacttgtttcaaaattttgactattgtgaata
-atgctgcaataaatatgaaagtacagatacctctatgaagttaagtggtgatttcatttc
-atttttttttttaaagacagggtgtcacagtgttactctgtagcccaggctggaatgcag
-tggtgcaatcatagctcactgtaaatctcaaactcctaggctcaaggaatcctgcctcag
-tctcctgagtagctgggactacagacacacaccatgcttagtcaatgttttttaggtaca
-gggtcttgctgtgtagcccaggctgggctcaaagtcctgacctcaagcaatcctcctgct
-ttgacttcccaaattaccgggattacaagcatgaaccacctcactcagcctggtagttct
-atttctaattcctttagaagccttcatactgactccacaatggctacatctgtctacatt
-cccaccaagaatgtacaaaggttcccttttctccacaccctcattaacaattgttatatc
-ttgtctttttggtaatagttatactaacaggcatgaggtgatgtctcattgtggttttga
-tttacatttccctaatgattagtgattttgagccccttttcacatacttcttggccattg
-ttatgtcttctttggagaaatgtcttttcaagtctttgtccatttttttaattgggtttg
-gtttttttttactgctactgagctgtatgagttctttatatattttatatattaatccct
-tatcagatatatttaatataaaGACAAAGAAAAGCTATAAGACTTTATATCTTAAaaagc
-tggagtggctatattaatattgaacaaaatagatttcaaaacaagaaatactaccaggga
-tcaagacgcacagaaagaagtcaattcaccatgaaaatataacaatactaaatgtgcatg
-caactaacaatagaacttcaaaataaaagcttgtagaactaaaaaagagaaatagagaaa
-tcttcacctacaactggagatttTTAgactgacattagcaagatggcagaataggaggtt
-ccaagcatccctcctctcaacagaaaattcaactggcagatatccatgacaagagcactt
-tggtaaaaatcccaaaacttggaaataagccaaagacacccatgttgaccacagaactga
-ataaaaaccacattagaagggggaagagaaaaggtctcactttgaccaggccacccctcc
-tccactccctcgcccaagttggcacaccactatgcagacaggattgccctaggcctacag
-tttctccagtgggaaaagaaaactaaagatgaacattcagcttccttagccattcctgga
-atattctcagaaagcccatttcagtctcagttcacagggaaagcaggggataacggtgtg
-gttagatcacctgggttcagatagaaaaaaagaaaagggggcattgctcacagtgaccag
-tatgaagatactgttggtagctctgtgtcactgccagcagaggtaccagccaacagcata
-agccacctgcaaagccaagctggtcactcccagaagcacagtggaaatttccatctggct
-tgagtccctagatggccagcctccacagccagcctcaaatccctccccaaggccccacgc
-agaaatggagatacctgcaacaaagcatttcaaacaaaagaaacaactgagacttgtgcc
-ccagggcatttaaacagtggctcagactcaaagctcactcaaggagggagatgcccacca
-cagcacctttcagcaaagcccagaggctggactagccacacccagaagtataaatggtgg
-ctcacctcagcctcaaagcccaccccaagtctctgcctaggcaagggggcaagcctcaac
-catgcatttcaacaaagcatagcagctggtcccaactaccctgaacaaaacctatctaac
-ctcaggacccaaacagtggtagtgcccggccGGGGAAAATACCATGTCTGTTAAGGGTTC
-TTACCATGATTTTAAAAAAGAAAGaaaacctatacacagacattcccaacagctttattc
-ataattgccagaaattgaatacaatctgaatatccttcactgtgtggcttttaaaaaatc
-gcatttatagtacatccatagcatggaatattacttagcaataaaaagaaacaaagtatt
-catacaagttggagggatcttcaaggaacactaagagtaaaaatgccaatttaaaaagat
-tacatatctatgattccatttatatggcattcttgaaatgacaaaattatagagctagag
-aacagattcctgtttacccagggttagggaaggagggagaaggctctcactggaaaaggg
-tagcacaaggagtctatgtgataaactgttttgtgtcttgactgtaatggtggtcacaaa
-aatcaaagcatgtcataaaattgtgtaaaactaaatacatacctacatgcacacacacaa
-acaaatgactacatacatgtaaaactgatgacatctgattaagaccaatggagtatatca
-atgtcaatttcctgattatagttaaacaagatgtaaccattggagggaaaaggtatatgg
-gatttctctgcatgtaggtaagtctaaacatatctcaaaatTATTTTAAATGTCAACTTT
-TAGGAACAGCTGATATTTTCTCTGTATTTATCCTAAATCACTAAGGCTTTCACAAGATCT
-CTGCTCCAAAGACCACCATATTTCTTTTTAAATGACATATCTATTGTGAAATGCATTTAT
-GATAGTCAGTATTCTCATGCTGTGGAAATATACTTTAAAAAGAATATAGTCTTTATCCTA
-TACTGAAGCTCTTGTCCCATCCTGTCCTTTTCAAACACTCAGCAGTTCAATTGAGCTTTA
-CAACTTCCATGCACTTCACAAAAAGAAATAAAATAGTGGAGGCTACGCTGATCTCAGCTG
-GTTTTCATATATTTGGGGGTCAGAtggctatagactgatataagctagcctctgctggga
-caactgggttcttctccaaaatgtctctcttgtccttcctgcagactagactggtcttgt
-tcacctgactgaggcagggttccaatggagaaggcaaaggcacacaggccttttgaggca
-taggcttggaaatagcacaatttcatttgtgccatattctCTCTTTTTATGACTTTATTA
-TTTGAATTTGTATATTGCACAAGACTTCCTATTGTTCAGATTTCATTTGCTTTCTTTCTC
-TTGTATTTTAACATCCTTCACAATTCTCACATCATTATTAAAAGTTGCACTTAACCTAGT
-AATAGATAAGCATTAGCTGAAATTAGTAATTGCTTAACTTCTATCCTACACTACTTTATC
-ACATACTAGTGTGTCATGTTTCATAGTATAGGAACAAAGTAATCTTGCACGATGATATCT
-CTGATGCATACCACTATATTTTTGCTCATGGAATGACAGCAAAATTAATTTTTCTGCTGC
-CAAACTAATATTCAGCCAATCTTTTATTCATCAAATCTAACTACTTAGACCAGGGGCAGT
-TTCCTTTAGAGTTAGACTGTAATTTGTGTACTAATTTTTTTTTGGTTTTTTGTTTGTTTG
-CTTGTTTTGCTAAGGGAAAAATTTATTTTCCTGATGTAtttattattttttagcttttat
-tttagttttagttttaggaatacatgtgcaagtttgttatataggtaaattgcatgtcat
-gggtgtttggtgttcacattcttttgtcagccagataaCCATATTCTCTCTTTTAACGCC
-TATTTaaaattatatatttttaagctatacaatgtgatgttttgatatacatatgcatAT
-TTAAGCTATACAATGTCATGTTTTGTTGTACATATGCATATTTAAGCTATACAATGTCAT
-GTTTTGATGTACATATGCatatttaagctatacaatgtcatgttttgatgtacatatgca
-tcttgaaatgaatactatagtcaggctaattaacatatcagtctcttcacgtagttacca
-ttgtgtgtgtgacaagaatgcttaagatctactctgatagtaaatttcaactatataata
-cagtattatCTCTTTTTTAttttttacttttatttgtttatttttttgagacagagtctc
-tctgtgtctcccaggctggagtgcggtggcgccatctcggctcactgcaagctctggctc
-ccaggttcacgccattctcctgcctcagcctcctgagcagctgggactacaggtgcccac
-caccacgcctggctagtttttttgtatttttagtagagacggggtttcactgtgttagcc
-aggatggtctcgatctcctgacctcgtgatccgcccacctcggcctcccaaagtgctggg
-attacaggcgtgagccaccacgcccagcctttatttatttatttattttgagatagagtc
-tcgctctgtggcccaggctggagtgcagtggcagcatctcagctcactgaaatctctgcc
-tcccaggttcaagcaattctcctgcctcaacctcccaagtagctgggactacaggcaccc
-tccaccacacccagctaatttttttatttttcatagagacggggttttgccatgtcggcc
-aggctggtcttgaactcctgacctgaagtgatccacctgcctcggcctcccaaagtgctg
-ggattacaggcatgtgccaccatgcctggctGatttttgtatttttagtagagacggggt
-ttcaccatgttggacaggctggtctcgaactcctgacctcaagtgatctgcttgcctcag
-cctcccaaagtcctgggattacaggcgtgaaccactgcttccggccacagtattatcaac
-tgaggtccccatgctgtgcattagatctcaaaaacttaatcatcctacaatactggaacg
-tactctttgaccaacatcttttgattctgccaccattgcttctgataatcactattctct
-ctccttctatgaatttgacttttcaagattctacatgtaagtgatatcatgcagtatttt
-tcttcctgtgcctggcttattttacttagtataatgtcctccaggttcatgcacattgca
-caaacgacaggatttctttgttttaagactgaataatatttcatATtggatacaacctaa
-gtgttcaacagatgaatggataaacaaattgtggtatatacCACCTGTTCTCCCTTGTAA
-GTGGAAGCTAAAtgtcaggcctctgagccgaagctaagccatcacatcccttgtgacctg
-cacctatacgcctacatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggcc
-tgttcttgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgc
-cttaactgatgacattaccttgtgaaatcccttttcctggctcatcttggctcaaaaagc
-tcccccactgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttga
-ctgtaattttcctttacctacccaaatcttataaaacggccccacctctatctcccttca
-ctgactctgttttcggactcagcctgcctgcacccaggtgaaataaacagccttgttgct
-cacacaaagcctgtttggtggtctcttcacacggacgcgagtgaAATtttggtgccgtga
-ctcggatcaggggacctcccttgagagatcaatcccctgtcctcctgctctttgctccct
-gagaaagatccacctacgacctcaggtcctcagactgaccagcccaaggaacatgacacc
-aattttaaatcaggtaagcggcctttttgtactctcttcttcaatctcactatccctcaa
-cctctttctcctttcaatcttggcgccacacttcaatctctcccttctcttaatttcagt
-tcctttccttttctcctagggacaggagacgcattttatccgtgaacccaaaactccggc
-gtgggtcacggactcagcaaggcagacttcccttggtgtttaatcattgcgggaatgcct
-ctctgaatattcacccacatttcagaggtgtctgaccacatggggacgcctgccttggtc
-cttcacccttagcagcaagtaccgcttttctagggagcaaacaccccccaccccttctct
-ccatgtctctactctctcttttctctgggcttgcctccttcactatgggcagccttccac
-cctccattcctccttcttctcccttagcctgtgttttcaagaacttaaaacctcttcaac
-tcacacctgacctaaacctaaatgccttattttcttctacaatgccgcttgacctcagta
-caaactcgacagtggttccaaatagccagaaaacagcacttttggtttttccatcctaca
-agatctagataattcttttcataaaataggcaaacggtcggaggtgtttgacatccaggc
-attcttttacacattgttccctccctagtctctgttcccaatgtgtctcgtcccacatcc
-tccttctttccctcccacctgtcctctcagtcccaatcccaagcattgctgagtctttct
-aatcttcgttttctgcagacccctctgacctcttacctcctccccaggctgctcctcgcc
-aggccgagccaggtcccaattcttcctcagcctctgctcctccaccctataatcctttta
-tcacctcccctcctcacacctgctagccctaccccacttgcccagcaatttcctcttaaa
-aaggtggttggagctaaaggcatagtcatggttaatgctcctttttctctatccgaactc
-tcccaaaatcagttagcgtttaggttctttttcatcaaatatgaaaaacccagcccagtt
-catggctcattcggcagcaaccctgagatgctttacagccctagaccctaaaaggtcaaa
-aggccgtcttatcctcaatatacattttattgcccaatctgccccgacattaaataaaac
-tccaaaaagtaaattccagccctcaaaccccacaacaggacttaattaacctcgccttca
-aggtgtacaataatagagtagaggcagccaagtagcaatgtatttctgagttgcaattcc
-ttgcctccactgtgagacaatccccagccacatctccagcacacaagaactccaaacgcc
-tgaaccgcagctgccaggagttcctccagaacctcctcccccaaagtccgtccccttctt
-aatcaatacggaagctacccactccacattaccttcttttcaagggcttgtttcccttgc
-ctccataactgttgtaggtattgacggccaggcttctaaacctcttaaaaactccccaac
-tctggtgccaacttagacaacattcttttatgcactcttttttagttatgcccatctgcc
-gaattctcttattaggccaagatattttaagtaaattatctgcttccctgactgttcctg
-gactacagccacacctcattgctgcccttttccccagttcaaagcctccttcgcatcctc
-ctctcatatccccccaccttacccacaagtataagatacctctactccctccttggtgac
-tgatcatgcaccccttaccatcccattaaaacctaatcacccttaccccattcaatgcca
-atatcccatcccacagcacgctttaaaaagattaaagcctgttatcacttgcctgttaca
-gcatggccttttaaagcctataaactctccttacaattcccccattttacctgtcctaaa
-accggacaaggcttacaggttagttcaggatctgcaccttatccaccaaattattttgcc
-tatccaccccgtggtgccaaacccatatactctcctatcctcaatacctccctccacaac
-ccattattctgttctggatctcaaacatgctttctttactattcctttgcaccctacatc
-ccagcctctcttcgctttcacttggactgaccctgacacccattaggctcagcaaattac
-ctgggctgtactgccgcaagccttcacagacagcccccattacttcagtcaagcccaaat
-ttcatcctcatctgttacccatctcggcataattctcataaaaacacaggtgctctccct
-gctgatcgtgtccgactaatctcccaaaccccaatcccttctacaaaacaacaactccct
-tccttctaggcatggttagtgcagtcagaattcttacacaagagccaggaacatgccctg
-tagcctttctgtccaaacaacttgaccttactcttttagcctggctctcatgtctgcgtg
-cagcggctgccgccgccctaatacttttagaggccctcaaaatcacaaactatgctcaac
-tcactctctacagttctcataacttccaaaatctattttcttcctcatacctgacacata
-tactttctgctccccagctccttcagctgtactcactcttttttgagtctcccacaatta
-cccttgttcctggctcagacttcaatccggcctcccacgttattctggataccacacctg
-accctcatgactgtatctctctgatccacctgacgtacaccgcatttcccccattatttc
-cctcttccctgttcctcaccctgatcacatttagtttattgatggcagttccactaggcc
-taatcgctacacaccagcaaaggcaggctatgctatAGtacaagccaccagcccacctct
-tagaacctctcatttcctttccatcatggaaatctgtcctcaaggaaataacttctcagt
-gttccatctgctattctactactcctcagggattattcaggccccctcccttccctacac
-atcaagctcagggattttcccctgcccaggactggcaactcttaactccctcttagagtg
-gatagatgctctttgctggcaggggaccctccaatcttttcaccctgatgaagttctatt
-ctttacttttatactcactcttattctcattcccattcttatgccaccctctacctctcc
-ccagctatctccaccacactatcaaccttacccattctctcctagccgtttctaatccct
-ccttagtgaacaaccgctggctttgcatttccctttcttccagcacctacacagttgtcc
-ccaccttacatgcagactaggcaacatctcctatctccttacacctccaaacttccttta
-acagccctcacctttaccctcctgaagaactcatttactttctagacaggtccagcaaca
-cctcctgagacatctcacatcagcaagctgccgccctcctccgcacttaattaaaaaacc
-tttctccttatatcaactctactcccccaatatttggacctctcacaacacaaactacta
-ttcctgtggccgctcctttatgtatctctcggcaaagacccactggaattcccctaggta
-acctttcaccttctcgatgttcctttattcttcatctccaaagcccaactacacacatca
-ctgaaacaataggagccttccagctacatattacagacaagccctctatcaatactggca
-aacttaaaaacattagctgtaattattgcttaggaagacacttaccctgtatttcactcc
-atctttggctgccttccccttgctcatcagactctcctcccaggccctcttcttgtttac
-ttatacccagccctgtaaataacagtgaaagtttgcttgtagacacttgacgttttctca
-tacaccatgaaaatcaaacctccccctctatgcagttaccccatcagtccccattacaac
-ctctgatggctgccaccccagctggatccctaagagtctaggtacaagacactcctttca
-gcattccttctcatctttttactttgcatctccggttttgcctcacacaaggtctcttct
-tcctctgtggatcctctacctacatgtgtctacctgctaattggacaggcacatgcacac
-tagttttccttactcccaaaattcaatttgcaaatgggaccgaagagctccctgttcccc
-tcacgacactgacacgacaaaaaagagttattccactaattcccttgcttgtcggtttag
-gactttctgcctccactattgctctcagtactagaatagcaggcatttcaacctctgtca
-cgaccttccatagcctgtctaatgacttctctgctagcaccacagacatatcacaaactt
-tatcagtcctccaggcccaagttgactctttagctgcagttgtcctccaaaaccaccgag
-gccttgacttactcactgctgaaaaaggaggactctgtatattcttaaatgaagagtgtt
-gtttttatgtaaatcaatctggcctggtatatgacaacataaaaaaactcaagaatagag
-cccaaaaacttgccagccaagcaagtaattacactgaacccccttgggcactctctaatt
-agacgtcctgggtcctcccaattcttagtcctttaatacctatttttctccttcttttat
-tcagaccttgtatcttccatttagtttctcagttcatccaaaaccgtatccaggccctca
-ccaatcattctatacgacaaatgtttcttctaacaaccccacaatatcaccccttaccac
-aaaatcttccttcagctcaatctctcccactctaggttccatgacccaatcctgctcaaa
-gcagccctgagaaacatcacccattatctctccatgccagccccccaccaaaaatatttt
-tttcgctgccccaacacttcaatactattttatgttatttttcttattaatataagaagg
-caggaatgtcagacctctgagccgaagctaaaccatcgcatcccctgtgacctgcatgta
-tatgcccagatggcctgaagtaactgaagaatcaccaaagaagtgaaagtggcctgttaa
-tgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgccttaac
-tgatgacattaccttgtgaaatcctttctcctggctcatcctggctcaaaaagctccccc
-actgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttgactgtaa
-ttttcctttacctacccaaatcttataaaatggccccacccctatctcccttcactgact
-ctcttttcggactcagcccgcctgcacccaggtgaaatagccttgttgctcacacaaagc
-ctgtttggtggtctcttcacatggatgtgagtgaAATTaatattaggtacacacagacat
-aaagatgggaaaaatagacagtgaagattttaaaggggataaggaagggagaggagcaaa
-tgttgaaaaactatctattctgtactatgtttgctacttgggtgacagggtcattagaag
-cccaaacctcagcatcacacaataagcccatgtaacaaatctgtacatttatcccctgaa
-tctaGATTTTAAAATAAggctgggtgtggtggctcacacctgtaatccaaacactttggg
-aggctgaggcaggaggattgcttgagcccaggagttcaagaccagcctgggcaacataga
-ccttgtctctacaaaaaataaacaaaatcagcaaaatgtggaggtgcgcctgtagtccca
-gctgctcaggagactgaggcaggaagattacttgagcccaggagctcaaggttgcagtga
-gctgagatcgtgccactgtactccagcctaggctaccaagtgagattttgtctcaaagaa
-aataagataaaaTTTTTTCTTACATTGTGATATATATGCACAATGGaattttcaaatata
-tagtatattatcactaactgtagccaccatgatgtaaatagagctcttgaattttttttt
-tcttcttttgaaaacagagttttgctcttgttgctctggccagagtccaatggtgcgatc
-ttggctcattgcaacctctgcctccccagttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattacaggcacatgccaccacgcctggctaatttttgcatttttagtcaag
-gcggggtttcaccatgttggccagactggtcccaaactcctgacctcaggtgatctgcct
-gcctcagtgtcccaaagtgctaggattataagcatgagccaccgtgcctgaactctcttg
-agcttatttttcctgtctaagtgatttccccacccctagcctctgataactaccatttta
-ctctttgtttctatgaattcaacttttttacactctacatagaagtgagatcatgtcttt
-ctgtgcctggtttatttcatttagcttactgtcctccaggttcatccatgttgttgcaaa
-tgacagaatttacttcttttttaaagctgaaaagtattccattgtgattatgtaccacca
-ttttctttattaattcatctattaatgggcacttaagttgattccatgccttggttattg
-tgaataatgctgaaattaacatgaaagtgcagatatcttttcaacatgctgattttattt
-ccattagctatatacccagtaatgggattgctggatcatatagtagttttcattttaatt
-ttttaaggaacttccatacagttttccataatagctatactaatttttattcccaccaac
-agtgtgcaagggttcccatttctccacatcctttccaacacttattctctttcatagtat
-attttgaagtcaggtagtgtgatgccttcagctttgttctttttgctcaagattgttttg
-gctattcaaaatcttttgtggttcaatccaaattttaagatttttttctgtttcagtaaa
-aaatgtctttggaattttgatagggattgcattaaatctatagaccactttgggtactac
-agatattttaacaatattaattttttactttcatgaacatgggatatctttccatctgtg
-tcttcttcaatttcttccatcaaagttttatacattttagtgtagaggccttttacctct
-ttgttaaatttattcctaagtatttttgtagctattgtaaaaggatcatttacttgattc
-acttctcaggtgttcttgttagtattcagaaaagctgctgatttttgtatgttgaattta
-tatcctgccactttactgaattcatttattagttctaatagttatttggcaaagtcttca
-ggattttctgtatatacgattatgtcatctgcaaaaagaaacaatttcacttcttccttc
-ccattttaatgctctttttattgcattttcttgcctaattaatctggctagaatttccag
-tactacattgatagaagtggcaaaagtgggcattattttgttctttatcttaaagaaaaa
-gcttttgactgttcaccattgagtatgatgttaaatggggcttgtcatatatgatcttta
-ttgtgttgagatcattctttctgtatctaatttgttgagttttatcacaaaaggacgctg
-aatgttgtcaagtgttttttctgcatctgttgagatgatcatatggtttttacccatcac
-tctgttaatgtagataaatctcacttgatcatggtgaataatccatttaaagtattgttg
-aattcaatttgctagtattttcttgaggtttttgtatctctgttctagggacatcgacct
-ataacttttttttcttgtatgcccttgctctggctttattataagggtactgctACccca
-gcatgatttccaaatggctatgaaccagtgactgctgtgtacaaccaacttttcctcctt
-tcaaatgggagtgttgtggttatAACATTATAAAACAAATCTTGCAAagttagatagaag
-gcatcagttctagtgtttgatagcacagcagagtggctattgttaacaacaatttattgt
-atatttcaaaatagctaaaagagaagttttgaaatgttcccaacacaaagaaaggacaaa
-tgtccaaggtgctggatatcctaaataatctgacttgattattacacattatatgcatgt
-atcaaaatatcacatgtgcccagaaatatgtacaaatactatgtatcaataaaaaaGttt
-ttaaaaaataaatattacatataatatatgaattatataataaaactagaatataatata
-aaaaggaaaaaatatatgtaaaataaatCTTCATaataaaataaaataaaataaTTTGAA
-AGAGTCTATGAATAAGATTTTGGAGACTACTCTAAGACAGATGCAAGAGCAGGTACCAAT
-AATTCTGTCTGTACCAAAAGAGTGAATAATAAAAATATACAATTTCAACTTAATTTTGCA
-TAAAAAAAAGTGAACAAATAAACATGCATCTAACAATACTGACCACATCCACGTCTTCTA
-TGAGTATGGAGGGGATAAAAGAATAAAAGAAAAAAGTCAAAGCGAAGATTAGATCCCCCC
-AGTCAGAGCAGAATTCAAGGGTTAATTTATCTGTTCAATTAAGTATATCCCTCACCCCCA
-ACTCAGAAGACACTTCTCTGATTTATCTGACACTAAGCCAAAATGGATTCTCTTATCTAA
-TTTATCAGTAGAATCATATAGAGTAGAGGACACATGTAGATTAAAGACAGTGAGCCAGAC
-CCATCTTCACTGTCACAGTGACAGAATGGACCCTCCTTTAAAATACCCCTGGTGACATTG
-TAATGAAAGACTAAAAAAGAAAGGGGCTTATAAAGTGCTGCAGTGAAAAAAAGGGCTTCT
-TATGTGAGCCTTACTTTTAAAGTTCCCTAAGAATTAGGTTGAAAAAGGTCATACATTGAC
-TTTCATAGTGCTGAAATCATCAACAAAAATTTCTAAAATTCTGCAAAGTCCAGTCACTGT
-TACCTGTGCACTTCTCCAGAATTTTCAAAAGCCAAACTACTAAAAGGAAGGTTCTTGTAT
-GCTCTTGAAACTTTAATATATCCAGCTAAATATTTTTCTCCTTCCTCCCCCTGAAACAAG
-GTGGTGAGCTGCTCATGGAGTAATAAGGTTCATTGATTTCTTTATCTCACATGAGTAAAT
-ATTAGCTCTACAAAAGTTATTTATGACCAGTGCCTTAAATTAAGCAGCATCAACAAATGT
-CACCACAAAATTTCTCTTCTGTTCATCTGGACAGCATTTTCTACCATCATGACCTACTAC
-AATTTCATCTATCTCATGAGGAGCTTCTTAAGTACGTCCCCCTCATTTATAAGACTTTAA
-ATTTCATACTGAAACAAATGATATGCAATGCTTTTAGAGATCTTAAGATAATCTTTGTCT
-AAAAATTCTGTCAACTAGATGTTCAAATTGCTACTGAAAATGGAGATGGAACACATACAT
-TAAATGATTCAAATGATATATCGGAATTACCAGTAGCTGTCATGTTTGCCCATCAGATCT
-GCCCTCAAAAAAGTGTTATGAAAATATTCAAACATTTTTTCTCCCTCTAACTAATTCCTA
-GCTGTTAGCAGAACCCTCTGTacacacacacacacacacacGGCATTCAGATCTAATTAG
-ACAAAAGAAATTTCATTTGTGAAACAGGAGAAATACCTGAAATTCTGTGAAATATTGTCT
-CGCATAGAAAATGGAGTTGttacaagccaggagagattgggtgcctattttcaaccttct
-taaagacaagaaattccaaccaagaatttcatatcctgtcaaattaagattaataaatga
-aagagaaataaaatcttttccagacactccagtactaagagaaatccttattattaaagg
-cagtcttacaagagacccttcagggagttctaaatatggaaacaaaggaacgatatttgc
-atttacaaaaacatacttaagtacgtggcccacagaccctaataagcaaccacacaatag
-aaactacaaagcaaccagctaacaactccatgataggatcaaaacctcacatattaacat
-taaccttgaatatgaacactctaaatgctccacttaagaggcacagagtagcaagttgga
-aaagaaaagaaaagaaaagaaaagaaaactcatctgtctgcagtcttcaagagaccaata
-tcacatatatgacacccataggctcaaagtaaatggttggagaaagatctaccacataaa
-caaaaaacagaaaaagaggaggggtcattattcttagataaaacaaactttaaaccaaca
-actacttagaaagataaaaaagggcattacgtgacaataaagggttaaattcaataagaa
-gacttaactatcctaaatatatatgcacccaatattggagcatctagattcattaaaaaa
-actacttctagacctatgaaaagacttagccacatgattatattgggggacttcaacacc
-ccactgacagcattagatagatgattgaggcagaaaactaacaaagaaatcctggactta
-aacttgacacttgaccaattcaacttaatagacatctacagaatattccatccatcaacc
-acagaatatatattcttcacatctgcacatggaacagactccaagattgaccacatgcta
-ggccatggaataactatcaacaaattcaaaataccaaaataatgccaaccaaactctcag
-accacactggaaaaaaatagaaatcaataccaagaaccttcaaaaccacacaattacatg
-aaaattaaacaacttgctcctaaaccacttttggataaacaacaaaatgaaggcagaaat
-ttaaaaattcattgaaataaatgaaaacagagacatagcataccaaaatatctgggatgc
-agtgaaaacagtgttagaaagaaagtttatagcactaaacactgaccttgaaaagctaga
-aagatctcaaattaatgatattacgtcacacctacaggaactagaaaaacagaaacaaac
-taaccaccaagctagcagaagaaaaaaaataactaaaatcagtgtagaactgaatgaaat
-tgaggctcaaaaatccatacaaagacacagtgacattacaagtttgtttttttaagggat
-aaacgagatcaatagaccactattttttgttagtagattaacaaaagaagtgagaagatc
-caaataagcacaaatagaaacaacaaaagtgacattacaacagatcccacagaaatatga
-aagagactattatgagcacctctatgcacacaaactagaaaatctagaggaagtggataa
-attcctggaaacatacaatctcccaagattaaaccagaaagaaactgaaaccctgaacag
-accaataacaggttccaaaattgagtcatcaattaaaaacctattaactaaaaaaggccc
-tgaaccagatggattcacagcccaattttactagacataccaattctactaaaactattt
-caaaaaagcaagaagaaagatacctccctaactcattctacaaagtaggcatcaccctgg
-taccaaaacctggcaaagacacaacaaaaaaagaaaactacaggccaatatccctgatga
-aaaaaatgcagaaatccttaagaaatactagcaaactgaatcaaagaatactaaaaaaag
-acagttaattcgccatgagcaaacagacctccctcttgggatgcaaggttggttcaacat
-atgcaaatgaacaagtgtgattcaccatataaacagaattaaaaacaaaaaccatatgat
-catctcaataaatgcagcaaaccttttgataaacccaacatcccttcatttaaaaacccc
-tcaacaaactaggcatcgtaggagcatactcaaaaataataagagcccctatgacaaacc
-cacagccagcatcatgctgaatgggcaaaaactgaaagcatttcccttgagaactgggaa
-tgctttctggaacattccagttttctggaacattcccaggaatgcccactctcaccactc
-agattcagcctattactggaagtgcttgccagagcaatcaggcaagaggaagaaataaaa
-ggcatccaaataggaaaagaagaagtcaagctatctttcttcattgacagcagattatat
-gcctagaaaaccttaaagcctccaccaaaagactcctggaactgataaacgacttcagta
-aagtgtcaggatacaaaagtcaaagtataaaaattaacagcatttctatacaccaataat
-gttcaagctgagagtcaaatcaagaatgcaatcccattttcaataaccacacactcaaaa
-aaaaagcctaggatttttttctaactaagaaggtgaaagatctcttcagattcagggaga
-attataaaacattgctttaaaaaattatagatgtcacaagcaaatggaaaaacattccat
-gcccatgggttggaaaaatcaatatcatttcaacagtcattctgcccaaagcaatctaca
-gattcaatgttattcctatcaaactaccaaagccatttttcacagaattagaaacaacta
-tcctgagttcttatggagccaaaaaaagagcctgaataggcaaaacaattctaagcaaaa
-agaacaaagccagaggcatctaattacccatctcaaactacacgataaggttacagtaac
-tgaaacagcataatactgatacaaaaacagacatatagaccactggaacagaataaagaa
-tccaaaaataaagctgcatgcctacagccatctgatctttgacaaagtcaacaaaaatac
-gcaatgggaaaagggctccttattcaataaatggtgctgggatagctggcaagccacata
-tagaagaataaaactggacccctcctctcaccatataaaaaattaactcaagctggatta
-aagatagaaatgtaagaactcaaattacaagaatcctagaagacaacctagaaacaccat
-tctggacataggtcttgggaaataatttatgactaagtcctcaaatcaattgcaacaaaa
-acaaaaattgacaagtgggacctagttaaactaaagagcttctgcacagcaaaagaaact
-atcaacagagtaaaaagacaacatacaatggtagaaaatatcacaaactatgcctctgac
-aaaggtctaatatcaagcatctataaggaacttaattcaacaagcaaaaagaaaatagcc
-ccattaaaaagtgcgcacaagacatgaacagacacctctaaaaagaacacgtacaagtgg
-gcaacaaatatatgaaaaaatgttcagcatcactgaacaccagagcaatgcaaatcaaaa
-tcacaatgagataacctctttacaccacttagagtagctattactaaaaaatcaaaaaac
-aacagatgctggcaaggccgcagagaaaagggaatgcttatacactgttagtggaaatgt
-aaatttgttcagccactatggaaagatgtttggagacttctcaaagaacttaaaacataa
-ttaccattcaactcagcaatcccattactgggtatatatccaaaagaaaataaattgttc
-taccaaaaagatgtatgcacgtgtatgttgatcgcagcactattcataatagcaaagaca
-tggaatcaacctaggttcccatcaacagtggattggataaagaaaacgtggtacatatac
-acaatggaataccatgctgccataaaaaaataaaattacctcttttgcagcaacatggat
-gcagctggaggccattatcctaagcgaattaacacaggaataggaaacctaataccatat
-gttctcactaataagtgggagctaaacattgggtacacattgacataacgatgggaacaa
-tagacactggggactaatagaagagggaaggaggagaggagaaagggttgaaaaactaac
-tgttgggtactatattcaggacctgagtgatgggatcagttgtaccccaaacctcaacaa
-cacacagtacaccaatgtaacaaatctgcacatgtacccctgaggctaaaataaaagttg
-aaaTTATTTTCTTAAAAATGGAAAGGCTAAATTCCACCTCTACCAATATGTTTACTTAAT
-TTTTATATCCCCCATCTTACTGGTATAAAACCAGGAACATGGCAACCATTCATTTATGTT
-TGAAGTGTTCAAAAAATGAGTGACTACATCAATAAATGTACTCAGAGGAAAGCACAGGAC
-TTTATTATGTGGGGAATCAAGTTCACAGAAGGAAGCAGATGAATCTTTTGCTGCAGGCTG
-CTGGATTAGGCAGCACTTTTTATTTAGGAAGAGTGGAGACCAGCGAGACAAGGGCTAGAT
-TTAGGATTAGACTGTGAAAATGGTGATGGTGGGTAAGATGATGTAATCCTGCAGCACACT
-CAGCTTCTCACCAGAATGTTGATGTGGCTTCTTAAATGACACATGTTTTTTCTCTTCTTC
-ATCATTAGCACAACATAATTTCCCACTTAGACATCCTATTTCATATCTTTCTCCTACCTT
-GCATTTCTTCCTGCAATAGCCTGTTACTTTATTGAAGCATTTTTTGAGTCTTGCCCCGTC
-TGTGCATAGGAAACAACATTGAACCAAGGTTAGTGCGTAAGGAAGAGCAGAAGAGGTAGG
-TATGTGGTTCCCCACAAGTCATGGCCTCCTATGGTCCCAAGTGAACATTATGCTGATAAA
-AGGAAACTCAGAGGCCCCTCCTTGAAAAATATCCCAAATTAAGGACATTCAAAAGCCCAG
-GCTCTCAGCCAATGTCCAGTTGCCTCTGAGAACATTAGAACTGATATGACAAAAGAGAAG
-AGAGAACTCAATTCCTGGTTATCAACCAGAGCCAAGTCCCACCCCTAGGACCATGGCAAA
-GCTGACTCTCTCCACCAAGCTCCAAAGTCAGCACTCTCTCAGCTCCATCTCAGTCTCATG
-TCCCCAGAGACGGCTAACATGTCACCATGTGCACAAGACATGTCACCATTGGCACAACTC
-AGCCAAAGCAACTTTTGAAAGAACATCACAAACAAGACTTTTTAACTTAATTCGGTTTCA
-CACTCACTGATATGGGCAACAGAAATCTCCCTTTGACAAGATCTCATGGGTCTCAGCAAC
-AGGTGCTATTGAGAACTCCTTCCCTTAACCTGGCTCCTCCTGTCTGTCACTCATCACACT
-CCCCTTGATCTCAGATAAATGTGTTGCCCAGGGATCAAATTCAATTCCATGAATTTGGCT
-CTAGAGAGCTACATTGTCACCTTCTCAGAGTAATGCACTGAAATTCTAAGTCTCTTGTTT
-CTAATCCTTATTTGCCCCTCTACCCAAAATTTGAACAAGCCCAAAGAATAAGGTTGGAGA
-AGAGAGACATACTCTCCCTATCCTAAACTTCAGAATCAGGGAACATCTTTGAGGGTTAGA
-GGAGTATATTTTGGGGCCATAAAAATACAATATGCCTTCTTCCTAGCAAGAGAGAAGGTA
-ACTCTCACTGACAGGGCTTCTACGATGAACTTTgtgcttcgtgcttgtaagttcatgtaa
-cctgtacatcaaatagaatcatgaaatatagtaattatactccttcacagatgagaaaat
-tgagattaaaaggaaataatgtgcttaattcatacaacccgtcaatgatgaagacatatt
-ttaacctcacattgacatgactccaaaatgtgtgctattttaattactgtTGTAGTACAG
-GCTGAAAATGAATTTGAATGGAAAAGGGAATGGCCAGGCTCTCAGGTGAAAACTGTGTCC
-AGCATTATAAAGATAATTCTAGATGATGAGTTCATGGATACTTTTGAAAAGGACTCCTGA
-GAGTCCACTATAGCCCTGACCTCCTCTTACCTCCTTGGGTGCCTCTCTTCTAAGGCATAG
-ACTCAAGTCAGGCAACCAGGAGAATGGGTACTTTTTTATGATTTTGGCCAAATATAAATA
-ATCTTGAAAGTCCTGTTCCCACTCTTACAAATAGTAATATCTCTTAGGATGTTATAGTAC
-ATTTGGACAAGTTACCTGTGAGTACCTCAAACAGCAGAATAATGAGAACCAGAAACAGCT
-TCATATTTACAGACTTCCCAAGAGAAAGAGGCAGCAGAACTTTGTCCAGTGGTCTGTGTG
-CCACAGGTCTTTAAAGATGATCCAGAGTTTTGAGAGCTATCAGCGCTCGGAGCTCTCATT
-TTAACCCACACAGACAGAGAGGAATTCCAAGTCCACCCCCGTAACACACACACCTACATC
-CCCAAATATGGAGCTCACAGTCCCAGAATGTTCCACCATATCATCCCTCCTCCCCCTTCC
-TCAGGATATGCGCCCCTAGAGAGCAGGAACTATGACTTTCCGTCTGAGCTTCCAACCCAT
-TTGGGTCAAGGTTGGTTGGTCGTGGGCCTTGGGTTGTGTGGGATAATCCTGTCTTATTCC
-TATTGTTCCAATGTTCCATCCGGCTACTGCTGCCTCTAACAAAACTAACCCAGTTTGGAA
-GATAAATTAAGTCATTAGTCGACACAGAAGCATATTCAACAATAATTTTTTTAATGTATA
-AAGCTTCCAGATAGTCATTCTAGGAGTAAGATTGCTTTTAGGTTTGGCTAGATAAATTGA
-TATTATTTGAGAGTTTCCCATAAAGACTTGTCCATCTAGTAGAGCAAAATTCAACAACTG
-AAAGTTTTCAAAAGATCAAATCTCCTTAGCACAGCACTCAACTTATTATAAACTGGTCTC
-TGCTCTCCTCTCTTGGGACATTTTATGGAACCATCTATGTTTCTCCCAAACTAGTGGGTA
-CACCTTCCTGAACTTTTACTTCCTTAATCTGTTTCTTTTCACATTTAAATCCCTCCTTAC
-AGATTATATTACACTCCCCATCCCCTCCATATAATTGGTGCTAGTGAACTCCTGGTTTTC
-CTTCAAAACCAAGTTCAATCATCTCTATATAAGTGAAAGTTTCCCTGACCCAACTAAACA
-GAGCTGCAAACTCTCTTCTTCGCACCATCACTGTATTTGTACATATTTTTGTTGATGGTC
-ACACTATGTCATGTTCCAATTATTTGTTTATCTGCAATAGTCTGCAGACCCATAAAGGGC
-AGGTCTCTGGTCTTATTAGACTTGGAGttctttttctttttttttttttttttgcagttg
-caagatttaatagagtgaaaatggagctcccatacaaagggaggggacccaaagaggtta
-gccgttgccggctcgaatgcctgggtttatatcccaatcattgtccctcctgctgtgctc
-tcaggcaatagatgattggctatttctttacctcctgtttttgcctaattaccattttag
-tgagctctctttcctacctgattggtcacatgtgagctaagttgcaagccccgtgtttaa
-aggtggatgcggtcaccttcccagctaggcttagggattcttagtcggcctaggaaatcc
-agctagccctgtctctcagtaccccctctcaacaggaaaacccaagtgctgttggggagg
-ttggccgacgaccgctctaactgcttcctcctgaattggggcatagtaggggttgtgcag
-ttgagatttcctcaggaggggtgccttcgatgtcattaacattggagcatgggctagcag
-gccggtccaatggtccacggtagctcttagtcatggacggcatctgtggctccatttgaa
-gaatgatttgtagttttacagctttgattctggaaaagacaaacttaacaaggaggttaa
-agatacagggattgaaatgtatggcctgcagtgcaggggattatttctttggcacacttt
-acaggccctgactatctatttgatagttttgaaaaggcctggtccagtaaataataattt
-agccatctgatagttgctatcaatgcctaagtgaaaggtttggtaaagggttttaagtaa
-tttcaattggttagctgcaggcaaaagtattttttcttctttggtggctagccatcctga
-ggggaggaaagtatgtcctcttgaggttctccattctatttcttctgctgagtactgggg
-cttggtttcctggagggggttaccccacactaggggtccttctataagcatttctaatgg
-agggtcctgtcttgtggctcttttggcttcaacatctgcttggcagttcccttctacttc
-cctttccttttttttttttttttttatgaccccggcagtgtaagactgccacctctttag
-gtttctgtacagccaataataatatcctaatggcttcttgatgtttgataggtgttccct
-tggaagttaggaattccctttctctccatattgctgcatgggcatggagaactaggtaag
-catacttagagcctgtatatatatttaccctttttccttctcctaattctagtgccctag
-tgagggctattagttctgccagctgaacactagttcctggagtgaggggattactttcaa
-gtattccattatcactgaccactgcataccccacttttcgaagtcctttttctacaaagg
-aacttccatcagtacataaggtgaggtcaggatcagtcaagggaacctctaaaggatccc
-cttgagcagcgtaggtttgaacaattacttgctgacagttatgttctatcttttctttat
-tgtctggaagaaatgtggctgggttaagagttgcacaagtgcacagtcgcagcactggcc
-cttcaagtaatagagcctgatatttaagtaaatggttgtctgacagccacaagtctcctt
-tagcagtgagtatgccattcacatcatgagatgtccacacagtaagatctcttccctgta
-ttagtttaactgcttcagatactaagactactactgctgccactacccgtaaacaatgag
-gccaaccctttgccattacatcgatttccttacttaggtatgccacgggttacaagctca
-tccctcagacctgtgtaaggactcctagagctattcctgtttttttctgtgacttataaa
-gaaaagtcttgcccctttgacaagcttaacactggggcttgggttagggccttctttagg
-gcctggaaagctgcttctgcttcaggtatccatcttactaatgggtatttgctttctgag
-tttccttaattgtgtatataatggtctggctatttcgccatacctgggaatccatattct
-gcagaaacctgttacgccaaggaagcttttagttgctttagggttttgggatgaggatca
-gccagtataggctggatatgttcctcactgagggccctggtgcctttggataatttgagc
-cctaagtatttaacctgctgtgagcagagctgagcctttggtttggaaaccttatagcca
-caggtggcgaggaaatttaagagtgcttgggtggcttgattgcacaaggtttctgaacgg
-gcagctaaaattaaatcatccatgtaccaaaggacaagagtgtccaggtatgagaactgg
-ctcaagtcttaggctaatgcctggccaaatagatgggggttatccctgaacccttggggt
-aaaacagtccgggtgagttgagatgttgggttcgaaggatcttcaaaggtaaacaagaat
-tgaaggtcaggatgtacagggatgcagaaaaaggcatccttaatgtccaggactataaac
-cactctgcttcctctggtgtttgggaaagcagagtatacgggttaggtataggtgggtat
-ggagcgacaatggcctcattgataatcctgagatcttgcactaacctccactgtccgctg
-agtttctgtactcctaaaattggagtattgcaggggctattgcatggttttactaggcct
-tgggcttttaggtccttaaaaatattttagagtccttgttgggccttgggtgtaaggggg
-tactgcctttggtagggaaaggaggtgaaatcctttagtttaactcaaacagaatgggca
-ttctttgctcgtccatgttgtccttctgttgcccagacttcaggattaattccttcctca
-agcagggggacaataaacgggtgttctttctcctatgttcaggtgtataatggcccctgc
-tttcgctagaatgtctctccctaacaagggagtggggctttcaggcataattagaaaagc
-atgtgaaaagtataaagttccccagtcacaacttagtggctgggagaagtatctagtgac
-tggctgtcctaggaccccttggatagtgacagatctggaggacagttgtccgggacagga
-cagtaagactgagaaggctgcgccagtgtccaggagacagttagcctcctggctctcaat
-ggtcaagcatacccgggactctgtgagggtgatggcatgggctggagcttgccctgggca
-ccctcagtccttctgctggatcatctggttagtggcttctgactcagaggaccttcgtcc
-cctggggcagtgggccttccagtgattcccttgacataaggggcatggatgagagggtgg
-cttatttctacttggacaatcttttttaaagtgtccttgtagaccgcactggaagcaagc
-cctattaggcattcgatttgcccagtttttcccttttccaaagcctccTCGACTAGGAGT
-TCTTAACTCATAGCACAAAATTCATGCTATATGCTCAATACATAATCACTGAATGGCTGA
-AAAGTACTGAACAAATTACTGCTAGATAAAATACTCCAACACAGCAATAAAGTTAATTAT
-GGCATTTCCTTTAAAAATGCTGTTTACCACTTTTTGCAATTTCTAGGCACCTAATTATAG
-TAATGAGGTCCCATCTAATCCAAATATCTTTCTGTGACAGTATCTGGAAGAATGTTGGAA
-TTTCTGAAAGCTGTAGAAGTAGCCGTTGATGATTAAACTCTTATCACAACATAGTCAGGG
-AAAGAGTAAGGTTAGGAATTAGTATTGTATATAGCTTACTATGGATACCAGTAACCAGAG
-CCCTTATCCCCCTCAGTTAGTAGCTGTATACCTTGTAATCCTGGAGTGGCACAGAAAATA
-AAGATTGGTGAGGCTTACAGAATCTCATCAAATCATATTTATCATATGAAGACAGCTAAG
-TTAATGGGTGCAGGAAATTTAGCCGCACGAAGATCAGATGTGTGAATATTTATTAAGGGC
-TAGGTGCagtggctgggattacaggcgtgcaccatcatgcccagctaatttttgtatttt
-tagtagagatggggtttcaccacgttggccagtctggtcttgaactcctgacctcaggag
-atccacccacctcaacctcccaaagtgctgggattacaggcatgagccaccacgcctggc
-tTGTTtttttgtttttgtttttgttttAATTTTCTAAGTCTTTCTTGCTGAGGGTCTGTG
-GATCAAGGAAATACTTATTCAAAAAACAGGTATTAAGTTCCTGTTAATAAATACAAGAAG
-AAAAGTGCTAACTGAATCACCTGTGGGTTTAAAGACCACCATCAAAGCTACAATTTTGGA
-GGACAGCCAACTGCTCCCTTGTTCTGTAATTCAATTTTACTCATTGCTGTAAGGGAGTTG
-GTTCCATTTCTAAATAAATTAAACAGAGATAACCCAAGGATTAGATGAATATAAGTCCAG
-CTATGCAGGAAATCGTTTGCCACCTTAGTGCACAATAAGAACTAAGAAGTTGGACTCCAG
-ATTAGTGTATGGGATTTCTTTTAGCTTTTTCTAACTAGAATCAAGAAAGATGAGATATTT
-GACTGTTCTAAACCTTTACTTCAGCCAAGTATGGTGCTCTGGAAGCTTCTCAACCCCACT
-CCCACTGCCTCCATGTTCAAGACCATCAAATAAGAGGGAATTTCCTCTCCAAGTAGATGT
-CCATCTTCTACAACATTTTTTCCTACGTCTGATAGATACACTCTAGCAGAACTCCAGTAG
-CATATTTCACCCAGGATACAAAGGTGTATTTGTCAGCACCAGTCCTGCTGATGTTTTTCC
-TCAAATTCTGCATTGTTTCTTTCCAAATCTCAAAACCTCCCAGAaaatccttcttgtctt
-ttaaggctcagataaaaataagacctcctctgtgatgtcttcctaactcctctgatagac
-ttgattaattactattttgaacccccacagctctttccATTTGTATTTGTAACACTAATC
-CCATTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtctgtgtatgAAttttt
-ttagcttttattttaggttcaggagaacatgtgcaggttagtcacataggtaaattgtat
-gtcacagggatttggtgtacaggttatttcatcacccaggtaataagcatagtacctgat
-aggtagtttgttgattcccaccctcctcctacctcaagtaggccccggtgtttgtttcct
-tttttgtgtccaggtggactcaatgtttagctcccattataagtgagaacacgtggtatt
-tggttttctgttcctgtgttaactcacttgggatacaggcctccagctccatccatgtcc
-ctgcaaaaaacatgatttcattttttatggctgtgtagtattcgatggtgtatatgtacc
-atattttatttatccagtgtaccattgatgggcatttaggttgattccgtgtctttgcca
-ttgtgaatagtgctgcaatgaacatacacgtgcatgtgtctttatggtggaatgatttat
-attcctttggctatatacccaataatggaattgctgggtcgtatggtaattctgttttaa
-gttctttgagaaattgccaaactgttttccacaatggctgaactaatttacactcccacc
-agcagtctaaaagcattcccttttctccacaacctcgccagcatctgttattttttcact
-ttttaataatagctattctgactggtgtgagatagtatctcattgtggttttgatttgca
-tttctctaatgataagtgatgttgatctttttttttctttcaaatgcttcttagccgagt
-atatatcttgttttgaaaagcgttccccattgcttgtttttgtcaggtttgtcaaagatc
-acatagttgtaggtgtacagtcttatttctgggatctctattctgttccactgatctatg
-tgtctgttcttgtaccagtgtcatgctgttttggttactgtggccctgtagtacagtttg
-aagttgggtagtgtggtgtctccaactttgttctttttgcttagaattgccttggttatt
-caggctcctttttggttccatataaattttaacatagatttttctacttctgcaaagaat
-gtcagtggtagttaaatgggaatagcattgagtctataaattgctttgggcagtatggcc
-attttagtgatattgattcttcctaccaatgagcatggaatgttttttcatttgtttgtg
-tcatctctggtttctttgagcagcactttttagttccccttgtaggtagaaatctttcac
-ttcccttgtaagctgtattcctatgtattttattctttttgtggcaattgtgactgggag
-ttccttcatgatttggctcttgtgttgaaggttataggtgtataagaatgctagtgattt
-ttgcacattgattttgtatcctgcgactttgctgaagttgtttatcagattaagaagttg
-cctagccatgtgcagaaaattgaaactggaccccttcattacaccatataatacaaaaat
-taactcgagatggattaaagacttaaatgtaaaacccaaaagtataaaaaacctggaaga
-caacctagataataccattcaggacacaggcacgggcgaagattttagggtaaagatgcc
-aaaagcaattgcaacaaaagcaaaaatggacaaatgggatctaattaaactaaagagctt
-ttgcacagcaaaagaaactatcaacagagtaaacagacaacctacaggatgggagaaaat
-ttttgcaaattatgcatccaacaaaggtctaactaatatccagcatctataaggaactta
-aacaaatttacaataaaaacaaacaaccccattaaaaagtaggcaaagaaaacatgaacg
-gacacttctcaaaaaaagacatacatgcagccaacagtcatatgaaaaaaagctcaacat
-cactgaccattagagaaatgtgaattaaaaccacaatgagataccatctcccaccagtca
-gaatggctattaccaaaaagtcaaaaataacagatgctggccaggtacagtggctaacac
-ctgtaatcccaccactttgggaggcctaggcaggcagatgacctgaggtcaggagtttga
-taccagcctggccaacatggcgagaccccgtctctactaaaaatacaaaaattaatcagt
-catggtggtgggcacctgtaatcccagctacttaggaggctgaggcaggagaatcactgg
-aacccaggaggcggaggttgcagtgagccaaggctgcaccattgcactccagcctgggca
-acaagagcgaaactcccatctcaaaaaaataaataaataaaaataacagatgctggcaag
-gttgtgaagaaaaaaggaatgcttatacactattggtgtaaattagttcaatcattgtgg
-aagacagtgtggaaactcctaaagacctaaagacagaactaccatttgacccagcaatcc
-cattactgggtctatacccaaaagaatataaatcattccattataaagacacatacatgc
-ccatgttcattgcagcattatttacaataacaaagacttggaatcaattcaagtgcctgt
-caataatagactggataaagaaaatgtggtaaatatatgtcatggaatactatgcagcca
-caaaaaagaatgagatcacgtcctttgcagggacatgaatggagctggaagctattatcc
-ttagcaaactagcacaggaatagaaaaccaaataccacatgttctcatttacaagtggga
-gctaacttatgggaacacacagaaacacagaggggaaaaaccacacactggggcctcttg
-gagggtggagggtggggggagggagagaagcagaaaaaataactaatagacactaggctt
-aatatctgggtgatgaggggcgggcacagtggctcatgcctgtaatcccagaactttgga
-aggctgaagcaggcagatcgcttgaggtcaggagttcgagaccagcctggccaatatggt
-gaaacctcatctctactaaaaatacaaaaattagccaagtgtggtggcatgtgcctgtaa
-tcccagcttctcgggaggctgaggcacaagaatcacttaaaccagggaggtggaatttgc
-catgagccaagatggcgccactgcactccagcctgggtgacagaacaagactctgtctca
-aaaaataataataataataaatctgagtgatgaaataacctgtacaaccaacccccatgt
-cacacatttacctatgtaacaaacctgtaccccctgcacacataacctttgatcttaaaa
-taaaagtgaaaaaaaAAAGTGTCTGTTCATGATCTTTGCCtttttttttttttttttttt
-tttgacagagttttgctcttgttgcccagcctggaatgcaatggcatgatcttggctaac
-tgcaacctccacctcctggattcaagcaattctcctgcctcagcctcccaaatacctggg
-attacaggtgcccaccaccTCAAAGtaaatttctttgagtttcctcaacacagctattgt
-gaattatctgtcagaaaagtcacatatctctgtctctctggaatggcccctcctgcctta
-tttagtccatttggtgaggtcatattttcctggatggtgttgatgctagtagatgttctt
-cagtgtctgggcattgaagagtagggtatttattgcagccttcactgtctgagcttgttt
-gtacctgtccttcttgggaagtctttccgaatattcaaaaggtcttgagtgttgtgatct
-aagctatatctgctttagggggtaccccaaacccagtaatactgtggttcttgcagactc
-ttagagataccaccttgatggtcttagacaagatctgagaaaattctctggattaccagg
-cagaggttcttgttctcttcccttgctttctcccaaacaaacggagtcagtctctctctc
-tctctctcttttctgagctacctaaagctgaggatggagtgacataagcatccctgtggc
-caccaacactatgactgcactgggtcagacctgaagccagcacagccctaggtctcaccc
-aaggcctgctgcaaccactccctggctacttctcaaggccctgaggctctacaatcagca
-agtggcgaagccagccaggactgtgtccttcctttcagatcataaaggtaccccaggccc
-aggatggatacagaggttcccatggggactccgagactagagtaacaaaccttagaaatc
-tacctggtgttctattgtactgcagctgagcttgtactcaaaccacaagactcagtcctc
-cccactcttccctctcctttccaaaagcagaggagccttacttcgtggccaccaaaacca
-caggccacaaggaatactgccaggctactgctgatgttccctttaagccccaagggttct
-tacgtcagcttgtggtgaatgctgcctggcctgggactaatccttcaagaaggtaggctc
-ccctctggcccatgacaggtccagaaatattcaagagtcaagtcctagaatcgaggaccc
-caagagcccacctgatgctctacctccttgtggccaagctggtacctaaggtgtaagaca
-aagttcccttcattttttctctgcttttctcaagcagaaggagttctgccctatagccac
-cacagatggggatgtgttgagtgtcacctgaagccagaaagtctcatgggttcacccaag
-gccatcagtgtggaacctggttatcactgctggttattcagggcacaagggctctttagt
-tagcaggtgattaatgctgccaggactgggtccttcccttcaaggcagtgggttcccttc
-tggcccagggtgtgtctagagatgtttttcaggagctacgtcctggaagagggtctgtca
-actatctggtgcctgatcctgctgtggctgagctggtatccaagatgcaagacaatgttc
-ttcctactcttctctctcttctcctcaagtggaaggaaatggtctcttttggagctatga
-gttgcgcagcctggggttaggggaggatgatgttagaactcccttagctgccctagctac
-tgttttagtaggtcatgtgccccccagtccactgtctctaggcccagttcagcactagga
-cttgcctaagagttgcagtccttggggtttagactgcctttcaagtttgcttagagaccc
-aaagcccacagtggaaagctttgcatgtattcaagttccgaccactgagatcagcaattc
-ccctctggttagggctggtttaaatgcttcctctgtgggtgggcctcagctgcatttggt
-ccagttttcctttctgctctaactgggcagcactgagttcactgcctcacaattgccgag
-ttttccatccctcctccagcacccagagattatctttgcatgctgctaccgacagggcag
-tgggagtggggagtgcagggtggcagctgtgattgaggactgtgttttctatttcttcag
-tgcctcattcagtggtaggaactaaaatcaagtgctatgattcttattcttatgaaggtg
-ttttttgtgtagatagttgttaaattggtgcctttgcataggggagggaggacgatcagc
-ggagccttccattcaggcatcttgctctgcctcctttttccataaataatttttgggagt
-ctagtatgttccaggaactctttcaggtcctgaaaattagacatgcattcatggagcata
-cattcaaaagtgggaagcagataaaaaatcatatgaataaatatatagtatgtcagatgg
-tgacagggctctggagcaaaagaagatatagaaagaagatgacaaggccaggcacggtgg
-ctcacacctgtaatcccagcactttgggaggctgaggcgggcggatcacctgaggtcagt
-agtccaaggccagcctggccaacatggcgaaacaaaatacaaaaattatccaggaatgat
-ggcgggtccctgtaatcctggctacacaggaggctgaggtggaagaatcacttgaaccca
-gaggtggaagttgcagtgagccaagatcatgccattgcactccagcctaggcaaaagagg
-gagactccatctcaaaaaaaaaaaaaaaaaaaagtgctgagcaaaaaagagtacagtttt
-aaatgaggtatctgtgaaaagactccttgaggcagtgacatttcaggaaggatgtaaaag
-ttatctggggcaagagagtgtcaggcaatgagaagagcaagtgcaaaggccctgaggtgg
-gaccatgcccagtgtgttcaagaagtagcaagaagaccacatggataatgtgaagcaatg
-aggaaagagaaaaaggggattatatcagaaaagtaatgggggtgcacatttggggttaca
-ataaagaattagacttttcctctaagatggaggttattggacagtgctgacatgatctga
-tgtattttcaaaagatgcctctggcttctgtggtcaaaacagattgagagggagggaaag
-tataaaagtggaaaacctgttgcatgggcattacaaaatctaagtgacagctaatagggc
-ttagatagagagcatcagagaagagggtgggaaatggtcagactcttacatacctattga
-aaatacagtcactcgtagattgaagagaaaggaagaagtcaagataacatcacagtttta
-gtctgagtaactgaaagaatgaagttgtcactgacagagatggatataacaggagaaagt
-tcagattggtctttttgcttgagggaggataaaaacctttgtttgggatacgtttgcttt
-ggagtgctatagacatctaagtggaattgtcttgtaaacaggagagatttttaagccatg
-agactgaatgggattgtcaaggctatgactgcagaaaagagcctaatgcctgagacctag
-aactccccaatgttgatgaataagaagcagcaaaggacactgagaaggttcattccagtg
-aggtcggaggaaaaccaagagaacatgatgctctgggagcttaattaaattaagttcatc
-aaggaggataaagcaccaaatgctgctgatacatcaagatgaggcatgagaattgatcag
-tggCCTACCAGAATCCCAGCTCCAtgacctcttaccagatgccaagtagatgacaaatgc
-atttcaaatgcattgcttactttaatcatcacaagaacactatgaagcagaaattaatat
-acctcaatttttaaaactggaaaactacaatttagggagctaataatgtgcccaatgtca
-cacagccaataaggaattaactgggatcaacacaggtctgcatgaacctaaaattaaagg
-ccttagccactatgctaagctgcctctcCAGCTGCCTTCCATGGGTCAATTCTAGGGAGA
-CTGAAGACAAAGTATTCAAATAAAAGATGTTGCTTTATTCAAAAAATGTATTGGCCATGT
-GCTTGGCTGGACATTCTTCCATGACCTACTCCTTTATACTCTATTCATCACTTACAGGGC
-AGCCTGTTTTAAGAGAATTCATATTTCTTATTTCTGAAGATGACATTATTACATCCTGGA
-AGAAATATTGATTGCCCATTTCAGTATATTCCTAAGTCTTTTTGTTCCTCTGTGTCAATT
-Ctttttcttttattattatactttaagttctagggtacatgtgcacaaagtgcaggtttg
-ttacataggtatgcatgtgccatgttggtgtgctgcacccgttaactcatcgtttacatt
-aagtatttctcctaatgttatccctcccccctcccaccaccccacaacaggtcccggtgt
-gtgatgttccccacctgtgtccaagtgttttcattgtttaattcccacctatgagtgaga
-acatgcagtgtttggttttctgtccttgcgataatttgctcagaatgatggtttccagcg
-tcatccatgtccctacaaaggacatgaactcatccttttttatggttgcatagtattcca
-tagtgtatatgtgctacattttcttaatccagtctatcattgatggacatttgggttggt
-tcgaggaagtcaaattgtccctgtttgcagatgacatgattgtatatttagaaaacccca
-tcatctcagcccaaaacctccttaagctaaccaacttcagcaaagtctcaggaaacaaaa
-tcaatgtgcaaaaatcacaagcattcctatataccagtaacaaacagagagccaaatcat
-gagtgaactctcattcacaattgcttcaaagagaataaaatacctaggaattcaacttac
-aagggatatgaaggacctcttcaaggagaactacaaaccactgctcaacgaaataaaaga
-ggacacaaacaaatggaagaacgttccatgctcatggataggaagaatcaatatcgtgaa
-aatggccatactgcccaaggtaatttatagattcaatgccatccccatcaagctagcaat
-gactttcttcacagaattggaaaaaactactttaaagttcatatggaaccaaaaaagagc
-ccgcatcgccaagtcaatcctaagccaaaagaaaaaagctggaggcgtcaATTCTTTAAT
-GTCAAGCAGCCTTTATGCAATCTTGGATTGGGCACAAGAAGCACACAATCTCCTCATTTT
-CAAAGCCCTTCATGGCTAAGCAATAGAGTTCCTCTTGAGTAGGCTGGAACAGATAATGAA
-ATGTTGCTTTTTAGATGTGGTCAGTTAAAAATAAAATCACCTATCAACATTTGTTACTGT
-ACCTCCAGCTGTGATCAATAGTACAAATTGCTTTTAATATCTTACTTATAAATAGACTTT
-AAGTATGTTTCATTTCTGAGAAATGTTCTCTGAATTCTACTTAAGATGTTATCTTTCCAA
-ACTGCTGGACGGGCTGAATCCAGGCAAGAAATGGGATTGCAAATTCCCTTGCACGAAGAC
-TTGATGGGTGAGTCAAAGCAAGATTCCCTTGCCATTCTTTGTTTAGAGGTGAGAGGAAGG
-TTAACTAGCATTTTATGCTATAAAAATCAGACACAAAGATAAGCAAAAAGAATACAACAG
-AAGCCACTCATTATTTCAGCTCTCTGTTAACACTTTGATGTTCACTTCTAAATATGCTTC
-CTCAAAGTAATTTCTTTTCACAACTGGGTAGGAGATAAGATAAAGCAAAGTGAGCTTGCT
-TGCTTTTCATCCACTCAGTTAAAAACAGTCTTCCAGTTGACACTCCCTGATACATGCACA
-CTCAGGCACACACAAAAGTCTGCACTCATCCATTAACCTCAAGAAAGAGACCTGTTGACA
-AAATAGACATACACCAGTTCAGAGGAACCTATGTCACCTGTCCCTAGTAATCTACTTTTA
-AGCCTAAATATATCAACAGTCAATTTCAGGAAAATTAACATTAAAAAAATTTAGATGAAC
-AATAGGAATGAATGAACTTAAAGGAAAAGAAGCTAATATCAAGGACAGAAGATAATTATT
-TAAAATGATGAGTGACAAACTTGACTAAAATGCACAACCTCTTCATAACAAAAAGCATGC
-AGGAGAAGGTACAAGTCAGCACAAGgttaaaagacaatcagagtagaacaaaaattctat
-gtgcatgataccacaaaaagattgctatccataatctatatgaagaataactacaaatca
-ataagaaaatgacaaatgacccagaggaaaataggcaaaCAATAGTATAGCAGCAAAACA
-TTGTAAGCACTCGTTTCAGAAGGTTGATATAGATTCAGAAATATGATATTCCCTTTAAGA
-GAATCTGCTTTTAATCCATAAATTGTCTTACAAACTAGTTTTATTAGTTTAATATTAAAG
-GAcccattagtgggtatatatccagaggaatataaatcattgtattataaagacacacac
-ctgaaaatgttcattgcagtactattcacaatagcaaagacaaggaatcaacctaaataa
-ccatcaatgacaggttggataaagaaaatgtggtatgtatacaccatggaatactgtgta
-gccataaaaaagaacaagatcgcatcttttgtgggaatatggatggaactgcagaccatt
-atccttagcaaactaacgcaggaacagaaagccaaataccacatgctgtcacttataaat
-gagagctaaatgatgagaactcgtgaacacaaagacgggaacaagagacactggggtatc
-cttgagggtggagggcgggaggagggagaggagcagaaaagacaacaaacctctgtgaca
-caagttttcctatgtaaccaaccttcttatgtcctcccaaacctaaaacaaaagttaaaa
-aaaaaAAAAAGACCCAATTGGAGTTGCAATTTGCTCTTTCCCATTCTACTGCATTTCTGA
-AACCCAAAGTGTACAAAGAATGTGTCTTATGTTTTATGAAATGTACATTTGGGCCCCCAT
-TTTTTTATTTGTATAACAATTGTAAAACACTATCTAAAGGCATAAAATGGCTAGGATGAG
-AATTACTATTGGTTCATAATTATATTTGCTTAATTACTGAAGATGTAACTGTACTCGCTT
-TAAGTATGCCATTTGACTATTGCCCTTCTTTTTGTCCAGAGCCATCAAAAGATTAAAGTA
-TTTGAAATGAATAATGTAATGGTTTTGTCTTCCTGCTACAGTGTGTTTCAGGTTATTTTC
-TAAAATCATAATGAACCCTGTTTTTTTGTTGTTTTTATTATTTTTTGATAAGTAAATAAT
-GCCACGATTGGTAGATCTAAAACTGAAGAAGGAGACCCTATGGCCTCAATCCAGAATGCC
-ATAGCATGCTAAAATGAGAACTTCCTCCAGGTGTGTATGTGTGTGTTCAGGGCCACCTAT
-GTATGCCCGATACGTCCAGTCTTCGTTGATGAAAATTGTTAGAGGTCAGTATTACAGAAG
-ATAAAACAGAAAGGCCATATGTTAATAATGAGAAATAAGTGGTTAATTCATAATTAGTGA
-ATCTGGTTTCAGCACTTTGGCCTTCGAGGTGGTCAAAACAGGTCTCCAATATGAACTAAG
-GATTGAAAAGattaaaattatttttttaacaaaaattaaGCTCAAAGAGTCTTGGATGCT
-TCAGATTGACTCTGCTTCTGGCATAACTTGAATAGAAAATCATATAAGGGTCTATGATGG
-GCACCATGCCCAGAGCTAGTTGGTTTAAATGTCATTCTATTTTGGACCCTAAAGATAAAC
-ATGGCCTACTGTGATTCCGTCCTGCGTGGCTGTTCTCTGGAGCAGTAGTCATTAATCTTT
-GCCTGCCTTCTCTCCCACCTAGGTGTGTGCCACCACCCCATGGTGACATGAGCTTCatta
-attaaaaaaaaaaaaaaCtttttctctcttttcttaatagaaatgaccttggaaaatttc
-tattggtctgtcttcaagttcatttctctttccatatcatatctacatggctgttaagtc
-caaagtttattatttaaataaataaataaaattgataaaactctagccagttgatcaaga
-aaaaagagacaattaccaaattttcaatatcaggtataaaaagaggacatcattacatta
-aaagttttgtgagagatgattctatatgccaaaatttttgacaacctatatgaaatggat
-aagtttcttaaaagatacaaattaccaaaactgacctaagaggaaacataaagtttaaac
-gatgctgtatcaattggagaaattgaatccatagtttagtcttctcacaaagaaactttc
-atgccttgatggcttcactggtgaagtataccaagaaataataatggcaattctacacta
-actctttcagaaaataaaggaggagacacttctcaaatcattcttcgaggccaatattac
-cttggttccaaaaatatgcaaagatatcacaagaaaagagaactatgagccaatatcctc
-atgaacataatttcagaaatctataataaaatattagcaaattgaatgcggtgaagaata
-gaaaggatcatagaacaggacaatatgatgtttatccccagaatgcaaagttgatgtaac
-atcaaaaaatgaatcaacgtaattcaccatattgatggactaaaggggaaaaacatatga
-ttatttcaataaatgcaagaaaagcatttgacaaaattcaaagccctttaaaaaaaactc
-atcaaactaggagagatggtaacttcaagctgaataatgctagctacaaaaaagtaacta
-cagataacatcacctttaacttagaaggctcatgtctttctactttaattaggaacaaat
-ggtaagttgaccacaaccacttttacttaacgtcatactgaaggtcttagctactccaaa
-aaggctagaaataggaataaaatgcatgcatttagaaaaggaagatacagcagattctat
-ttttagtttttaatttttataggtacatagtagatgtatacatttatggggtacaaagtt
-attttgatacaggcatacaatgtgtaataatcatattagggtaaatggggtatccatcac
-ctcaaacatttatcttttctttgtgttatcaacattctaattatactcttttagttatat
-ttaaatgtagaataaattaattttgactgtagtcaccctgttgtgctattgaatactaca
-ttttattcattctgtcttactatattttcatacccattgaccatcccctcctcccagacc
-cccctactacccttcccagactctgatcatcatcattctactttccgtcttcatgagctc
-aattagtaaaactttccttttttgcagataacatgatcatgtacataggaaaccctaaag
-aatccttggaaaagctattacatctaataaatgaatttagcaaagttttgaatgaaagtc
-tgtatacaaaaatatatatgtgcatattttagcaaaaaattagaaaaagaaattttgaca
-aaaactaccctttccataatagcatcaaaaatgaaatatttaggGGCCGGGCATGATGGC
-TCACCAATCTTGTACCCCAACAACCAGAATGATTATTTTTTATAGTTTTATGTATAGTCT
-ATTTTGGTTTTAAAATGGCAAAATACTATATGATTTTATATAAAAACTAAACTAACTTAG
-AAGTATGCAGTAAGAACGTGAAGGTCAAACACGCTGTCCATAACACTTAGGAAAATGAGA
-TCAACAGTAAATAGAAGACTGGTTACTCATCCTACAAGAAATGGTGATGAATAGGCCTGC
-AAAATATCCTGTAACTCCTCTAGAGGGTGCTCACTAGCAGGACATTCACATGCTACTCCA
-TGTGATGTTAGATTATTGTAAAGCATTATGTTCCTATAAAGGGTGGCGTGACAGTCCATT
-ACCAAGCACGAGACCCTCTGCTGATCTGTCCTAACAAGTGGAATTATGATATGCAGCAAC
-ACAGGAACCAGGCTTACGCTAGCCACATTGCAGAGAGACATTGCCAGAATCTCACTTGTA
-GAGGCCACCATCATATACATCAGTAAGCCTCTCTCCCTGGATCCACATCTCCCTCTATAA
-GGAGCCCTGTTAACCCCATCATTTAAGGGCTTCATACATTTGCCTTATATTTCTCTCATA
-AACAAATCAATGAGTTCCAGACTTTTGGTACAAATGTATGAAGACAGAAGAAATCATATT
-TCAGtcttaaaagcctaatcccagaagtgacacccatcacttcacattccattgccaaga
-gcaaatcacatgaccacacagatgcaaggggaatgagacattggcaaccacttcccagtg
-aCCATTATATATTATAGAAGGGGGGCATGCATGTAAGAGGAAAGTTGGTCTTCTCTGACA
-GAGACGTAGAATTCTACAAACATAGGGGAGGACGTTAAAAGGTGCTGAGCAGATAAAGGT
-CAAATGTCTGTTACAGAAGGACACAGGCACCAAAAGATAAAGagatactcctcaatttat
-gagggagttatgtcccaataaactcaccataaattgaaaatatcatacgtcaaaacttca
-tttaatacaactaacctacctaacatcatagcttagccaagcctgccttaaatgtgctca
-gaatatttatttgagcacatagttgggcaaaatcatctaataaaaagactattttataat
-aaagggttgaatatttcctgtaatttattgaatactgtattgaaagtgaaagatggaatg
-gttgtatgggtacttgaagtatggtttctactgaatgcatatggctttcacaccatcgta
-gagtcaagaaatcatgtcaaccatcataaataggggactatctgTATGACAGTAAAAACC
-ATTTTGTTACACAAATAGCAATCATCAAAAAAGAAAACACAGCAATTTCTGTTGCATATA
-TCCAAGCATTCAACAACAAAAGACCTTTCATTTTAATCAtttttttaagacacacggtct
-gactctgttgcccaggctggagtgcaatggtacaatcatagctaactgcagccccgacct
-cctgagctcaagcgatcctcctgcctcagtctcttgagtagctgggactacaggtgcgca
-tcactatgcctggctagttttttctagaggcagagtcttgctatgttcctcagactggtc
-tcaaactcttggcctcaagtgatcctcccaccttggcttcccaaagtgctagaattacag
-aggtgagccacagcacctggccAAGAATAGACATTTTATATCAAAGTAATTCAAGTATCT
-ATATGAACAAGTAATCGTGCAACTAGGTAATCAGGGCTTTGACCAATTTTGAATTACACA
-ATTAAAGTGCTAATATGTATTGTATTATACTGTATTTGCTGTAGCAATGCAAAAACTTCA
-TTGTTCTTTGTCCCCAAATACAACTGTCACTTATATTTCACTGTTTATGCTGCTAGTACA
-TAGCTTTATAAATTAATCTATCTTGTTTCTGACACTTATACATATTTCATCCTCTGGGGA
-CCTGGAGGAGCATATTCTTTGCCCCACCTCACAATTACCTATGCATATTTCTCAGTAACA
-GGCATAAGGCACGCTGCACAATCTTAGCTGATGAGATAAGAAGTCTCTCCTAAGGCTTTA
-CTCGCTGGACCATGGCAGAAATGTGGACAAGAGTGGTTGCAGAACATGCTGTGCCTGGGG
-CAAGGACCCTCTAATAGAACTAGAAGAGATAAGTCACAGGTACAAGGAGTGTGCAATCGG
-TCTGTTCAGCCACAGTTGCTATTAGAGGCCCCTGAAGAATTTGTTGTACTTTCCACGCTA
-GGCTACCTCGATCACAGAAATCAGCCTAGAGTCATATAACCCAAAGGGGGAGCTGACATT
-GCTGCTAAGCCCTCCTCCTGAGGGCCTTTTATCATCTCGTCCTGTAACCTACCTTTGCCA
-AGACAATTCCTTCAATCTTTGCTTTGTTTCAGGGAACAGTAATCCTACTAAGACTCTAAC
-AGTAGGGACGAGAGAAAGGGATGGAACAAAGGAGTGAGGCAAGGAGGCATCAGATGAAAG
-TGAGCTAATAATCTGTTGGCACCCATCACAtgctgagtacttccacttacattatcacac
-ttaagatgcacaatactttgggcatgatgtcactgccagcaaatctgaaattaggaaact
-caggcccagaagatatgaagtgacttttccggggtatcattaatgcaccagcagtgtaag
-ctaaattgaatccattctgcctgacaccaaaatcgtattcctttcCTTCCCTCCCACAAT
-TGTTTCCATTGGTGTATAAAACCTCTAAAGATCAAGATGTGGCTTCCTTCTTTAAAGAAA
-TAAAGCTGAGGCTAGGTAGTGACAGGTGGGGGCAAGTATGACCATCTATGAATGTTAAAT
-CTCACCCTCAATCCCACCTTGTAGTTTACCATCTATAGACTTGGCCTTCTTTAGATGAAG
-CAGTGTTGTAGGGgcctttctcaactggtgttcctcattcgaaccacagaacacagaaaa
-tgacttaggtgactattttcccaattcttccaaagatgatacatatgaataccattctag
-gtgcttagaagaaaggttaatccaaacacaatggatgtgtttggttgttaggatttaatt
-tgcttgcagaaacccaattgagacatgctgGTAGGGAATCTCTAACATTGGTCCACTGTA
-GAAGACAGAGGAGACGATCAATTTATTTTGTCTATCAACCTGCAGAAATAAAGAGTTTTG
-GTGGAACTGTAGGTAGAGAAAGAAGGAGGTACCTTCCCATGGCCTTGATGAGCCTGAGTC
-TTTCTAAATGCCAGGAAGGAAAACTACTCAAATTAGCTGTAACAGGGAGTTATCACAACA
-ATTTTTATTCTCTTGGGAAGTGCTAAAACAAATATATATGGAAATCTTACAGCCAACAGA
-AACGAatttcccactgctttcctccctcccaaactttcccactgtccctaattgaaaccc
-cattggaaggtaactaaatcctgtacaaccagaatctcctcatctaacttttcatttctc
-cctgtgttaaattaatcctgtttctccctcatggattcaccatcaacttgtactctcaag
-ctgatgctgttcattttcccacttttcatgactcaaggccaaaaggttggtatggcagct
-tcctcccttcccaatgttattttgaaaacattgcttctgtagtgtaaaatccccaactag
-tcaagactcaagtcagctcttttcaatgcctcttcaaccatctttattgttatattttaa
-aaagcagccccccatttattgaggactttggcactttgtttagaatgtatctattctgat
-tattgcctttattattggtgacttcagcatccatatggaaacactatccagttctacaaa
-tgttcagttatttgtcctccttaatgtcaataatttacctgctattctactcctgatttc
-tggccatagagctgtccacgtcatcatcaatgaccactccacacatgaactctgaactcc
-taccaccttctctgatcacacccaggcaccttttcagctccctcattttattatagaaca
-tgcatccgccagacgcttcctccttcacttttctattttttttttttttttttttttttg
-agatggagtcttgctctgtcgcccaggctggagtgcagtggctcgatctcggctcactgc
-aagctccacctcccgggttcacgccattctcctgcctcagtctcccaagtagctgggact
-acaggtgcccaccaccacgtctggctaatttttttgtatttttagtagagatggggattc
-accgtgttagccaggatggtctcgatctcctgactttgtgatccacccgcctcagcctcc
-caaagcctccttcacttttctttattagcctcaaccccatgattcaccactccaagtact
-cccttgccagcatcctcaaatcccaataccatttttaaaattttttaaagaatttctgca
-cccacctgtgtgaaaagttcaacccccagatccttttaactgtttgtcttctccacagac
-aaattcaggctgatgagcagtgctggaaaaagtgcacagctgcgcagattagtggcacct
-gcattcatgatctccagttttcacaaagccctcaGCAGCAGCCACTTGGTTCCCTGTGTG
-CAGCGTTCAGTGGAaaactccatgagggcaagaacaatatctgcttttactcattatttt
-aacccacttgaatgttaagctccatgatgacagggactttctgcggtatagattattacc
-ggcccctaagacagtttctggcacataatagacgctcaataaatactcagtgaaggaata
-aaATAAATAGGAGGTTAAAATTAAGTGATCAACAGTAGTCCAGGGTATTAAAGagactcc
-ccttaaaagctgcaattaagcagagtcatgagaggtgagtaggagctagcctgagaggaa
-atggaaaagacagtattaaaggcaggttgaacagcGCCTCTGTGATCCCTCCCTCATGCT
-TTACACACAATCGTTCTGAGTATTCTGTACTCAAAGCCCTTCCATTCTCTCCAGTTCCAC
-TGCCGCTCCTATGCACCCTCAGATGCAGCCTCTGTATTTCAGCCAGAATGGTAGCTCTAA
-AAGGTAATTCTGCTCATTATTTTCAGCTTCTATTTGGAACTCCTCTCAGAGCTCTCTAAA
-TTTCCTCAAGATATCTATCAGTTAAATGTGTTCACCcagtggtcttccatgtggtttgta
-tatgccaaggtatccccaaaaccctttgaaggagtctgcaaggtcaaaattattttcata
-acaatatttttaaaataactagtttcataataatattttgccttttcacaaaattgacat
-tggctctgaaaatgcaaactgaagcagataaaatagctagtgcctcaccacaaatcaaag
-caggggcacaagtctataattagaagttggattctttatcaccaagcacttgtaattttt
-ttaaatgccactcttaagaatatacttgacaaagtataaaaatttttaattttattgaat
-cccttgagtaGATTTTGTTCTAAGgttaaagtaaattaaagtggaaaccaggcctggaga
-atccatgagcagacaaggcctcttaagtgctcataacttttcttgatttgcaaacgtaag
-caaaacttaattggagctatttcttgtaaatgcctatattaaagaaaaatagaacttaat
-ctcaaccaatcaaaagcagctaactaactcgtaattatataagaaggtacttcccagcag
-gatagaccaaataagacaaaatttgtaactataaccaatcaaatattttatttgtattat
-ttccacacttactgcataaaagcgtgttccttacCACttttttttttttcttgagacagg
-gcctcactctttcacccaggctggagtgcagcggcatggtaatggctcattgcagcctcg
-aactccggggctcaagcaatcctcccacctcagccttctgagtagctgggaccacaggca
-cccaccatcatgcctggctaatAtttttttttttttttttgagatggagtctggctttgt
-cacccaggctggagtgcagtggcgcaatctcggctcattgcaagctccacctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacaggcacccgccactacg
-cccatgcccggctaatttttttttcttttttttcttttttggtagagagaagggtgtcac
-catgttgctcaggctggtttcaaactcctaggctcaagcaatcctcccaccttggcctcc
-caaggtgctgggattactggcaggagccaccatgtccagctTccttaccacttcttaagt
-gaagaccccgaaccacttctggtttggagttgcccaattcatgcattgctgtttgctcaa
-ataaactcttttaaaaatttttattatgcctcagtttaccttttGACACTatgttctgag
-taatacaaggaaaagtacatataaagcacttctgcagtataacaagctatgatggttgtc
-gccagaaaaatcacttaaataactatttggattttaaactgaactaggcacttttttatg
-aaacatcatttttatttgaaagaatgatggaaaaagtatggttattcagacttacatact
-tggcagaaattttctcaaaaattaacaaagtgaacttgtcatttcaaagaaaatagctag
-caatattagttaccaatctattcttataatgtgtggctgacaacaagaagtgaagtcact
-gctccctttccttgaacctgggaagatctttgtaaccaacctgaccagtacaatgcagtg
-gaagaaatatcaggtgatttccaaggcagaacagcttctgactggccctctgtctccagc
-caccatgttagaaggaagttcaggccacatggagacagcaaggcctctagctcacagtca
-gcatcaactgccagacatgtaagtgaatgggcctccagatgattccagtccccagtcttt
-gaggcttcccagctgacgtcactgacattaccatgcagagacaagccatctctgctaagc
-cttaatttttaacccatagagaccatgaaagaataacaaatgatgattgttttgaagcca
-ctacattttggggtaattcattatgcagcaatgggtaaGTAATCCTGGCATCACATGTTT
-TTCAAGAATGGGAATATGTCTTTTTCTTCCTGTCTTTCATGTCTAAGCCCTCTATCAGTG
-GTGCTTGTTGTGTGGAGTTTGGAGCCCAGGAGTAGTCAGAAAAGACTTTGATGACACAGG
-GTTGCTTGTAGAACATCTAATATGAGCAACTCCTACCTTGTGCTCACTGACCAGGCCCAC
-AGAAAAGTCAACAAGGGCAAAAGTTCTTTGCCTCACAGCACAGAACTGCTCCTTCCTCTC
-TGGTGCCTCTCCAACCACAAAATTCCTTGTCCCTGTCTTTGCCAGTCTCATGTTAAGAAA
-CCCCATAGACCCAGGTATTCTCCAATCTTGATGATAGAAGGGGAAACTGAGGAAGAGGTC
-CAGCTCACAACATTCTTACCAGCCCAGGGGGAAGGCCAAGATCTCCACAGAGTCATAAAC
-TCTAGGCCAAGACTATGCCTCTCCCAGGAATATCCAAGTTGGATATACCATATATTTTAT
-GCAgataaaatagctagtgccttaccacaaatcaaagcaggggcacaaatctgtaactag
-aagttggattctttatcaccaagcacttgtaattttttaaaatgccacttttaagaatat
-acttgacaaagtataaaaattattaattttattgaatcccttgagtaGATTTTGTTCTAA
-Ggttaaagtaaattaaagtggaaaccaggcctggagaatccatgaaaagacaaggcctct
-taagtgaTAAAACCTGTATTATTCCTACAGAGTCTCCTCTAATGTCAGCAACTGTCCTGG
-TGTCTCAACCTGTCTTTACCACCTTGATTTAGCCATCATGAAAGATCAGCCAACTCTATG
-TTATTGTATTTTTATTTCCATCTCTACTTTTTATTACAACAAAGGTCCTACTTCGTTGAA
-TTTTCCCTTGCTTTTAAAAAAACGGAAGGTCTTTAACTTGTTCTGAAGAAACCTCCTGTG
-AATTTCAAAAGGGCTCCCTATCTGTTGCATGTGGGGAAGGGCCACGCACATCCACATTCC
-CTTCGTTCCAGGGCACTGGATTTTCAAATATTGAGTTCTTGCTGTCTTCAGTCTTTGAAT
-AAAGCTCACGTGGACAACTATGAAGTTTAAAAGCATAGGTTGAGTTTGGGGTATAGTCAT
-GAGAATAGAGAGGAAAGAGCAGAAGTACAGCTCATTGCAGAGGACAAGCATCATGATATT
-CAGAACATTTGATATGGAGTGATATGGGGTAAGAGTGAGCTGGGTTTTATTCTGGGAAAT
-CACCCAGccctgaaaaagctatttatattcttttgttcactttccttatctgtaacacag
-agaccgttatgccaggtttcctagctactttagttgttgtgaagCAGCATATTATAAATA
-TCATAAAAGATTATCCAGTgctaggtgccatggtgcacagctgtaatcccagctacttgg
-gaggcagagtcaggaggatcacttaagcccaagagttcaaggctgtactgcactgtgttc
-acacctgtgaatagccactgcactccaacctgagcaacacagtgCCTCTTAAATAtgtat
-atgtatatatatatatatgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtATAT
-ATATATATATATACTCTTTTAAATTTACTCTGTTTTAAATATTTTGAGGCAGAAGCAAGA
-CGTTTTGATACAGAAAGCCAGCAGGTTGCTGAATTACAAGACTGAAGCTGAGGAAACTGT
-GTTTATCAATAGAGATGCACCGCTCATTCTTATAGAGGGAAGAtacaaagtaactctatt
-aagtcaagaatttctatatgttttatttactgcaatatcctcagtacatagacagcagtt
-gacatatagtattgatcatagtatctaatgttcaatagatatctgctgaatgaactgaaA
-AATTAATAATGTTGAGCAATAACAGGTAATCACTGTAAGATAACATTCTGAGGAGACTAA
-AATTTGAAGAATGCCTACAAGAGAGGGAGATGCAAAGGGAAAACATATCCTAAAAAATGA
-AATGAAATTATCCTTAAGAGAAAAAAGAAACACCAGTATGATCAAAGATTGCAAGAGGTA
-GAAGACAAAACTGCATAAAGTAAAACAAAATGCTGAACTCTTGAAATGCAAAAATCCAAA
-AATCCTGTTGCCTGTtttttttttgtttgtttgtttgttttttttgagatagagtttcac
-tcttgttgcccaggctgaagtgcaatggcaccatctcggctcactgcaacctccacctcc
-ttggttcaagtgattctcctgcttcagcctcccaagtagctgggattacaggcgcccacc
-accatgcccagctaattttttgtatttttagtagagacgggtttcatcatgttggccagg
-ctggtctcgaactcctgacctcaggtgatccacccatcttggcctcccaaagtgctggga
-ttacaggcatgagccactgcactcggctGTATTTTTTTTTTTCACTTATTTAGAAGGCTG
-ATTTATTATCACCTCCTGCCAGTCACGGGAATGAGACAGAATCACCTTGAGAGTATCTAC
-AGGGAGAATCTGGAGTCCAAATCCCTTCTTAATCAAGAAATGCTCTTTAATCAACTCCCT
-ATATATAGGGAGGTTGATGCTGGGACAAGAGGGGCTGAATAACTTGGGGTTCTAGTCTTG
-GATATGGAATGGGGGCAAGTGTGTACAATCTCTTTGATTTTCCCCAGGGCTTCCATCAAT
-ATTCCAAAAGACTAGAAATTCTGGACAGCAGCTTTTCCCTTCTCTCCCTTTCACACTTCA
-GTGACTTCTGTCTTCATCTTAAGACACTAATCTACACCCAATTTTCTCTCCTTCCTTTTT
-GCAGGAATGCTATTCATTCAAAAATGCTGGGATGAAAGAGCAAACTTGCAAGGATATCTG
-CTACAATAATTAAAGAGAAATAGATGCCTATAATTAAAAACATTGCTGCTTGTCTCTGAA
-ATTATTTGAACACTGTATACATCATAATGTACATAATCAGTTTCCATCTGATATCCCAGA
-CATCTAATCCTGGAAACAACGTCTAATATCTCTACCCCAAAGCAATAGAATTAGAGCTGG
-AAGGGGCAGGTAAGCAACAGTGTGGACCTTTctcagcagcagtgaacttggggtgctcac
-aacctgtgcaaaaccagctgtggtggctaaggattgcctatgtcacctctcccccaactc
-taggcaatgcagcttggggatagactccttccacttgggggaagaagagggaagagtaca
-gagggctttgccttgcaacttgggtaccagctcagccacagtaaagtaaagtatcAAAAG
-TTacccagcatggtgccagctgtggtggccactggacttgcccttcccccaactccaagc
-agcctggcacagagagagagactccttttgtttgggggtaaatgagggaagagaagaaga
-aactctgcctggtaacccagggaatttggccaaatttaaaccccagcccactaaggtggt
-tcctctaggactcagcgagagttgcagtgtttctgagcttagggcaccctctagtgctga
-tatagtttcaataatcacaggctcaaatcacaacactcaatctccttcaaatacctgaaa
-agccttcccaagaaggatgggtgcaaacaagcccagattgtgaaggctacaatatgtatc
-taactcttcaatgcccagacatcaacaaccatcttcaagagttaagaacatccagggaaa
-tatgacctcatcaaatgaactaaataaggcatcagtgaccaatctgagaatgatggagat
-atgtgactttttagacaaataattcaaaatagctgtcttgatgaagctcaacaaacttca
-agacaacacagagaaagaattcagaattacatcagagaagtttcacaaagaaattgaagt
-aatttctaaaaaatcaagcagaaattctggcactgaaaagtttgattgtcaaagtgaaaa
-atgcataagagtctttcaacggcagaattgatcaagcagaaggaactggtgagaactggc
-tatccaaatatacacgaagccaaaaaaagaattaaaaaagaataaagtatgcctacaaaa
-tgtagaaaatagtctcaaaagggtaaatccaagagttattggtcttaaagaggatgtaga
-gggagagaaaagggtaaatagagagatcttttcctcagcacatggaacattttgagagat
-cagggtagaaaggtcagagaaataaaaacaaacaaccttccaaacctcaagaaagatata
-aacatccaggtacaaaaaggtcaaaaaacaccaagcagattcaacccaaataagactacc
-tcaaggcttataataatcaaactttcaaagatcaaagataaagaaaggatcctaaaagca
-ccaagagaaaagaggcaaataacatataaaggaactccaatacatctagcagcagacttt
-tcaacagcaactttacaggccaggagggagtgggaaaacatatgaaaactgctgaaggaa
-aaccaaccttcaacctagaatattatctccagcaaaattatcctctaaacatgaaggaaa
-aatagtctcccagacaaacaaaagctgaggaatttcatcaataccagatctgtcttacaa
-gaaatgcccatgggagttctccaacctgaaataaaaggacattaactaacaacaagaaat
-cgtctgaaggtataaactcactggtgatagtaagtacacagacaaatacaaataccctaa
-cactgtaattctggcatatgaaccgttcatatctttagtagaaagactaaaagacaaacc
-aatcaaaaataataatgacaacaactttttaagagattgtataaaaagatacagagacaa
-taaaaatcaaaaagagtgtagagtgtagagtggttgtctctttgcttgttagtctgtttt
-tcttttctttttaatcaggattaagttgtcatcagtttaaaataagtggttataagatgt
-tatttgcaagcttcatggtaagtacaaaacaaaaacctgtaacaaatatgcaagaaatta
-aaacatactaccacacaaagtcaactttacacaaagaaagatggaaggaagggagggagg
-gagggagggagcagggaagggaaggaagggagggaagggagggaatggagggaaggagga
-aaggagggaaggagtgagggagggagggaaggagtgagggagggagggaaggagagagga
-gaaaaggagggagagaggagaaaaggagggagagaggagggagggaggaaagggagggaa
-ggagggaggaagggagggaaggaaggaaggagggaaggaaggaaggaaggaaggaaggaa
-ggaaggaaggaaggaaggaaggaaaaagaggaccgatgaagcaaccagaagataaatttt
-taaatggcagttgtaagtccttatctattaataagaacattgaatgtaaatggactgaag
-tctccaatcaaaagacatagagtggttgaatggataaaagagcaagacccaactacatgc
-tgcctatgagaaactcacttcacctataaagaaactcatagactgaatataaaggaatga
-aaaaagaaattctatgcaaatagaaaccaaaaaagaagttattatacttatatcagataa
-aaatatctttcaagacaaaactgtaaaaagagacgaaggtcgttgtttaataataaagga
-gtcaatttttgcaagaggatataacaattataaatatatatgcacccaacactagggaac
-acagatatataaagcaaaaattattagttctaaagagagaggtagaccccaaaacaataa
-tagttagggacactaacaccccactttcagcattggacagatcatcaagacataaaatcc
-acaaagaaatatcagacttagtctgcactataaaccaaatggacctaacagacatttata
-gaacatttcatccaacagccatggaatacacattattttcctcaccatatgaacattctc
-aaagataaaccacttgttaggccacaaaacaggtctcaaaagaatctaaataattaaaac
-catatcaagtatcttttatgaccacagtggaataaaagtagaaatcaataacaagaggaa
-ctttgaacactatacaaacacatggaaattaaaaaacataatcctgaatgaccgttgggt
-cattgaagaaattaagacagaaattttaaaatttcttgaaacaaatgaaaatggaaatac
-aacattccaaaacctatgggatacagcaaaagcagtactaagagggaattttatagcaat
-aaatgtgtatatcaaaaaagtagaaaaaatgatcaataaagcagtctCAGTATCAAAAAT
-TATGCCATATGTCATTCCCTTCCCCAATATAGAAATTATTTAGAAATCAATAAcaaaaag
-ttcaagaaaatgtatattatgaaaaaaatcatgtaagaatttcaaaatgttttgcaccaa
-aataaactaatactaactggttataaaatgtttgaacaagatctagtttcagacactaaa
-aaagataagacatcagtctgaaaagagcccctatcagagcaacatgaattctgctaaaat
-tgaagcaagaacaaacatcaaatgtacagtgaagcttgggtagaagaatgatgaaatcat
-tgatgctttacaaaaagtctatgggacgatgccccaaggaagtcagcagtttgcaaatgg
-ataactcattttaataagggatgagataatattgaagatgaagccaccagcagcagacca
-cccacatcagtttgggaggaaaaaattaatcttgttcatgccccagttgaaaaggactga
-taattaacagtaaaaacaattgtcaacatcatagacttctcagttggttcagttaatgga
-aatctgactaaaaaattaaagaagaacaaactttccacttgatgggcgccaaaaccattg
-tgccaaaatcagctacaaacaagagcacagctttcaatgaaactttaaacaagtgggatc
-aagatcctgaagcatttattcaaagcactgtaacaaaagttggaatctggctttaccagt
-atgaccctgaagacaaagcaaaatcaaagcaaagagatggaagtgatccagtccaagcaa
-aagctgaccagttaagaacaaaagtcatgtcaacaatttttgggggtgcacaaggcattt
-tgcttgttgactttctggagggccaaagaacaataacatctgcttattatgagagtgttt
-tgagaaagttagccaaagctttagctgaaaaatacccaggaaaacttcaccagagagtcc
-ttctccaacatgacaatgctcctgctcattcccctagtcaaacaagggcaatttttcaag
-cgttttgatggaaagtcattaggcatccacattgccatcctgacatggctccttttgact
-tctttttatctcctaatcttaaaaaaaaatctttaaaggacaccaatttttcttcagtta
-ataatgtaaaagaacactgatgtggttaaattcccaggaagctcagtccttcagggatag
-actaagtggctggtaccattgcttacaaaagtgtcttgaacttgatggagcttatgttga
-gaaataaagtttatatctttatatttttatattttaatgtcatcttccacaaactgtttg
-aagttccctcataactaaaatgtccccacatgctcagataagaaacacatttctcaacca
-atgtttctcagatattaaagtacatacaaatcacctgaggatcttcctaatacgcagatt
-ttgattgactcattctgagatgaattgaaatcctgcatttctgacaagctctccggaagt
-gttgatgcttctggtctttccaccacactgtgaatagcaaggttcaaactaattcatatg
-tcagaaaagatgacacagtggaaattgaagtgtttatttttaagtgaatgattatgataa
-caaaacactgcaaataaaaacttatgaagtccagctaaagctgcatataaagggaaaatt
-agagtcttacccacttggttatactgaagaaaagctgaaaatgtatgagataacaacaca
-aataataagttagaaaacaataacagaataaaatgaaattttattcaaagaagttcaaag
-aaaggaagataaagctgagaggagaaaataattaaatattttttaattttcataatattt
-aaaataaaatataattaaataaaaatcaaacatagaatcaacaaaaccaaaagctgattt
-tgaaaagaccaattaattaattcactataggaataacaaagaaaaaattgaaaacacatt
-acccatatgaagaataaaacacgtagccatcactacaaactctatagatagtaaagagat
-caaaggacatattgtgagtgaccttatgccaaaaatgaaatttagaagaaataaacatta
-cttgatgtgacccaagaagaaattgaaaatttgacagttctaaattgttagggaaattaa
-atctTAAATCTTTAAACTCAGTTGAGTTTTTCTGCTACATTCCAATGTCTGATCCCTAGC
-TCTATGGGTTTCAACAGACAGTTGTAGAAGCAGCAGAAAAATATCCTTGCTCTTATATTA
-CAGCTACCGTGGTGTGTTCTTGAAGTCCAGCATGTCTAATCATGGGATCCTGTCACCCTA
-CTTTCCTGACTATGAAAGAACTAGCAGATTCTCTGCTGGGCCAGTTTGTTGGAATGTTCT
-GGAAGTCATTCTGGGAGACCAAGCCCACAGTCAGCTTCTGTAGAGAGTTTATAAGCACAT
-AATTCTGAGTATTAAAAATATTTCTGTTGAAAATAGCTAGTGTTTTTCATTTCCCAACTG
-ATACACATAAATGCAACACTTTGCACATGTGAATAATTTGTCTTTTTACAAAATTATGCT
-ACACTGTTGATAGATTCATTCCATATATACATGCAACATACTTAATTTTTCATAACTTTC
-CAATTCTTATTAACTCAACTTTTTGTTCCATAATAACTGTGCTTCTCTTTGTACCAGTAC
-TTTCCATATTCTTATTGCTTTGGGACTAGCAAGACACAATGAGGTGAATAATGTTATTTC
-AATGCATCTTAAAACACCAGAAACCAATTAATATGCGATATTCAGGATTAACTGATTCCA
-AAGGGCTGTTAATTCCATCTCTTGATATTGACAAGTAGTAAGTAAATATGCCTAAGCTTG
-ATTATTTTTGTTCATAGAAGTAAAATATACATTTCATAAAGTGAAAGTTCATAAGATTTG
-CTTTTATTGTTTTAAAAAATAACAGTTAATTTAAACAAAACTGAGGAGTCATTGGATACT
-ATAGTAGCTAATGAAATCCTAAGAAGACATGAATTTCAGGAAGGCGAGGAACCAGGGAAA
-CTCTTGAAACTTGAACAATTAATAATATTCAGAGCCAATGAGCTTCAATATCTGAGTTTC
-TTAGGAAATGTCCCAAATTAGCAGGGGAAAGCATCTGATTGGTAGGCTTGGTTCTATTGT
-TACACCTGGATCAATCAGCTACGACCAAGGAATCTGAGCAGTACACTATAAAAATTGCTG
-CTTTTaattatttcaaccattgtggaagatagtgtggcaatccctcaaaaacctaaagtc
-agaaataccatttgacctagcaatcctattactgggtatatgcccaaaggaatataaatg
-gttctattataaagacacatgcatgcatatgttcactgcagcgctattcacaataacaaa
-gacatagaatcaacccaaatgcccatcatttggccatttggataaagaatggataaagaa
-aatgtggtacatatataccacggaatactatgcagccataaaaaagaatgagatcgtgtc
-ctttgcagggacatggatggagctggaggccattatccttagcaaatgaaggcagaaaca
-gaaaaccaaatactgcatgttctcacttataggtgggagcaaaatgatgagaacacatgg
-acacacagaggggaacaacacacactggagcttactggagagtggaaggtgggaggaggg
-agaggatgaggaaaaataactaatggacactaggcttaatagctgggtgatgaaataatc
-tatacaaccaacccccatgacacacattacctatgtaacaaaccagcacatcctgcacat
-atacccgcgaagttaaaaaagttTTTTTTTAGTTGCTACTTTAAAAGGATGTGGGAATCA
-TTGTAAACTCAAAAGTTAAAGATGTGCCAAGAGCTGTCTCCCACGAACTTGTTTAACAAA
-CGTACTGACTTTGTATGTTGATCCAATACCCATGCTGGCCACTGGACATACCAGTACAAA
-CAAGGCAGAATCTTCACTCTCCTCTAGCTCTTCTAATTCTCATGCACTAAGTGCCAACCT
-TAGCATAACTGGGCTGACAATCAGTGAATCAAATATCTAACTCTTATCCTACTCCAACGT
-TAAGAAAGAGACATGCgactgggtgcggtggctcatgcctggaaccccagcactttggga
-ggccaaggtgggcggatcacttgaggtcaggagtttgagaccagcctggccaacatggtg
-aaaccccgtctctactgaaaatacaaaagttagctgggcatggtggtgcatgcctgtagt
-cccagatactctacttgggaggctgaggcaggaggattgcctgaacctgggaggcggagg
-ttgcagtgagtcgagatcacgccactgcactccagcctgggcaacagagtgagactccat
-ctcaaaaaagcaaaaGAGAGACACATGCAAAGGGCTTGCTCTTTCTTTCTCATCTTACCT
-ATCTTATGTTTTCCTCCAGGATCAAGAGCAAGGAATTTGTTGCATAGAGGTGTTCAAGAA
-AGGGTGTTTTCAAACAGAGTCAGAAAAAACACAACTATACTGCGAGCAGCATACAAACCT
-GCTTTGGCTGCACTTCACTGCTCATGGCATAAGGCCACGAAGAGGCCAATAAAGGCTGGA
-GCTCAGGAGCATCAACCCAGATTCAAGGCTTCCTCTCTGGCACCCAACCATGAAGCTCCT
-TTTTCCTATCTTTGCCAGCCTCATGCTACAGTACCAGGTGAACACAGGTAATGTGGATTC
-CCAAGTTTAAGATGGGTAGATGAGAGGAACCAAGGATTTGGCTGCCCATGACAATGGAAA
-CCCAAAGAGAGGAGACTGAAAGATTAGCTGTTCAAAAAGATGGCTAAAGAGCTTACCTAT
-TGTATCAGTCATGCACTGATACATTCTCATAGGCCCCAACTGCCAGATTGTGTCCAGTGG
-AAACACCCAGGAAGCTACAGAGAAAGCAGGGTATTTTTTGTCTATTCAGAAACTATCCAA
-AATATAATGCTGCCTTCCTGCCCTGTATATGTCTATCATGCTAAGACTAAGCCCAGGTCT
-ACCTCCTTTTAGCTCTATTTCTATCTTAAAAGCCCTTTTTTTTTAAAAAaagtcctgggg
-tacttgtgcaggatgtgcggtttgttacataggtaaatgtgtgtcatggttatttgctgc
-acctaccaacccatcgcccaggtattaagcccaggatgcattagctatttttcctgatgc
-tctccctccacccaacaggccccagtgtgtgttgttccccttcctgtgAAACCACCTCTT
-GAAGCAAAGTTTCCTATCAGTTTGTGCTTGGTGTAGAAAGGAGGAAGTTCTTCCCTCATG
-CTCAAAAAAAAACCCTTTCAAGATCAAGTAAACAGGCCTGTGTTCTCCATCTTGAATTCT
-TTCAGGTTTTCCAGAGCCTTTATCGCTTCTCTCAGACTTTGTCTTCCTGAAAACCCCCAA
-ACTACCATAAGGGCATCTAGGAATGCATTATAGCAAAAGGCTAAGCCAGGGGATTAACCA
-TTGTTTTTGGAAAAGAAAGGAGAAGCACTGAGATTTGTTTCAGAATACAAGAATCATCCA
-GCTATTTGAAAAAATTAGCAAAGGGTTTCGGGGCAGGGAAAGTGGAAGTGTCAAAGATGC
-TTCTAATGTTTTTATCTTCTAATGTTTTTATCTTGGGACCCTAGGAAAAGGGTAGTACCA
-TAAGCAAGTAtggctgtgtcatcttgggtaaagtcacttaaccactttgaacttcaattt
-cacatgagtataatggggttaatcaatgcAGCTGATTCCAATATAAGAATTTTTCTGTTT
-CCCGTTTGATGAGAAAACAATGTGGAAATGTATGCAAATATGCTTTGAAAATTAGCAGAT
-GCTACATAAATCTCTTGTAATTTAGGGAAAATCATTGGGTTATTAAGATGAACAAGGGAG
-AAAAGCTTTCTTGATTCAGAAAAAAGAAACACGAGACATTAGGATGGAAAAGTCATTCAG
-CAGATAAAGATAAGGTACTAAGCCGAGCAGGAAATTTAGAATTATAGATAACAATACAGA
-AGTTACCTTGGTGGATATGAGGTTAAGGCTAGGATAATGAATGAGACTTCTGAGAGATAG
-AGTGTCCAAAGAGGCTAGAAGAGATAGAACACCATGCTTCAGGAATCACAGATCTAGTGA
-TTGTTGAGAAGAGAGAAGTCATGGGCTACTGAGTTTGGTGAAAAGATAAGACTCCTGAAA
-ATTCTATTGATTCTCTTTTGAACTTCTTTCTTAAATTAGTTTTATGATGGACTTGGCTCT
-CATTGGTATTTCCCAAGATTATGGAGATGGGATAGTGATGTCTGACAAGTACCTAAGATG
-CTAAGTTGAAGGTCTAAAATTCCATCCTAAAAGCAAATAATTACTCTATCATCTACGTGC
-CCTTTGCTTCTTAAAGTTACTCAAGGAAGGCAGACTAAACAGGAAATTTACTTTGGATTC
-AAGAGGGGCATAGAGACGCTCTCAGCCTGCCCATTTGCCTTCATCAACATTCCTAAACAC
-TGGGCTTAAAATGTAGTATGAGTAAACTCTCTCTTAGTCTATCCATCTCCCACTAGCAGT
-TTTAACATCATCTCTAGTTATTAACCTTGGCTCAATGGCTTTCTCTTTTTTTATACAGAA
-TTTATTGGCTTGAGACGCTGTTTAATGGGTTTGGGGAGATGCAGGGATCACTGCAATGTG
-GATGAAAAAGAGATACAGAAATGCAAGATGAAAAAATGTTGTGTTGGACCAAAAGTGGTT
-AAATTGATTAAAAACTACCTGCAATATGGAACACCAAATGTACTTAATGAAGACGTCCAA
-GAAATGCTAAAACCTGCCAAGAATTCTAGTGCTGTGATACAAAGAAAACATATTTTATCT
-GTTCTCCCCCAAATCAAAAGCACTAGCTTTTTTGCTAATACCAACTTTGTCATCATTCCA
-AATGCCACCCCTATGAACTCTGCCACCATCAGCACTATGACCCCAGGACAGATCACATAC
-ACTGCTACTTCTACCAAGAGTAACACCAAAGAAAGCAGAGATTCTGCCACTGCCTCGCCA
-CCACCAGCACCACCTCCACCAAACATACTGCCAACACCATCACTGGAGCTAGAGGAAGCA
-GAAGAGCAGTAATGTGGATCTTTCCCTTAAAACTCCAAGTTCCTCTCTATTTTTGCTATC
-TATAAAATGACATAGAACTGTTTCCTCTGTCATCAGTCATTCAATAAACACTGTTTGAGC
-ACCTACAGTTTATGTAATATTATCATTCTCACAAGAGCCTCACAGAGGGGGTAGAGCTAG
-GGAGGGATGGAATTGTTTAAGTTTAGATGCCCAGGAGAAAGTAAGCCTCAGGAGGGTGAC
-TACAGCATCGAGTTTGTCCCAAGCATGGCCTAGATTAGGCCTCTGTAGCAAGCATTTATG
-TCTCTCATATGGTGTGTTTTTCCTGGAGCAACAGTAAGGAAAGCATCAGGAGATGTATTT
-TCTTTTCTCATGTATTTGGGAGGAAAGGCCCAAATGCAAAATAGAATATGTAGGAATCag
-aaaaaggttaaattaattgtaataatatatttttgtttcgttttgttttgagacggagtc
-tcactcagttgcccaggctggagtgcagtggtgtgatctcagctcactgcaactccacct
-cccgggttcaagcaattctcctgcctcagcctcctgagtaaccgagattacaggcgcaca
-ccaccacacccagctaatttttgtatttttagtagagacggggtttcaccatgttggtca
-ggctggtctcgaactcctgacctcgtgatccgcctgcctcggtctcccaaaatgctggga
-ttacaggcatgagccaccacacccaaccaataatgtgttttattgaatgcaatatatcca
-aaacatgatcatgttgacatgtaatcaatgtaaaaattatttatgagagagtttaccttt
-tttggactacatctttgaaatctcatatgtgtaattacacatagagcacatttctattca
-tactagccacatctcaagtgctcatagtcatatatgaatagaggatttcatagcatattg
-aacagcAACAAGGCTAGAGAGTTTTAGGGCACAAGTAATTATAGTGACTCTTAGGCATAG
-GGGATGCCCCTAATCCAGAGGAGACAGGCATATTTCTGAGGGCtgtggcatataatttaa
-gagtatagaaattcaggtctgatatgcccggactagcatcctagattctggcacttttta
-gctgtgtggtcttgaacaaatcatttatccacacataagcatcagtttatttattcataa
-aatggagatGTGAACATTATATTATATCCCAGAAATCAGCAATCTCAGATCACTCTTCCT
-CTTATTGCCCAAATTACAATGGCACAGCCACCTATTCTAGttttttaatagctttattga
-agcataattgatatacagagaattgaacatatttaatgtgaataatggcatgagtttggg
-catatgcaaaatcctgtgatactatcaccacaatcaaggtgatagacgtatacatcacct
-cccaaagtAacatgaccatatttgtagaaaaccctgaaaacttcacgaacacacacacaa
-aaatgtagaactaagaaatagattcaaaaaagtcaacatacaaatatcagtggcatttct
-atacacttaacaatgaaccattccaaaagaaaatcaaggaaacaatctatttacaaaagc
-aacaaaaagaataacataggaataaacttaaccaaagaagtgaaagaggtacattaaaaa
-cttaaaaatattgatgaaaaaatcaaaggaaacacaaataaatggaaagatattccatgt
-ttaggtattgaaagacttaacattgttaaactgttcattctgtctaaagcaatctacaga
-tataatacatctccccccttccaaatcccaatggcattttttaaagaaatggaaaaaaca
-atcctaaaattcacagggtaccataaaagacccagaatagcaaaatcaatcttgagtaaa
-aagaacaaagctgaaggcatcacactttcttatttcaaaatatattacaaaggtatagta
-attaggccaggcgcagggactcacgcctgtaatccagcactttgggaggccgaggcgggc
-ggatcatgaggtcaggatatcgagaccatcctggctaacacggtgaaacctcgtctctac
-taaaaacacaaaaaacaaaaaatagccgggcgtggtggcgggcgcctgtagtcccagcta
-cttgggaggctgaggcaggagaatggcgcgaacccgggaggcggagcttgcagtgagccg
-agattgggccactgcactccagcctgggcgacagagccagactctgtttcagaaaaataa
-ataaataaataaataaataaataaataaataaataatggtgttgggaaaactggctaccc
-acatgcagaagaatgaaattggatccttatctcaccccatataaaagaaatcaactcaaa
-acggattaacgacttaaacataagacctaaaactgtaaaactactagaagaaaacacagt
-actgttctgtatttaagctccatgacatcgttctgggcaatgatttcttgcatatgaccc
-caaagcacaggcaacaaaagtgaaaataggtaactgCATCCAGATTTTTTAACATATTCT
-TCTCTGCTACATATCACCTACCTCCATTCAAAGGTCACCTTTCCCCATCCTACTCATTTT
-TTAATACAGTGTCACTCTAAGAAAGACAAAGATTTTTCATGATGCCCCACAGTGATTCTA
-GAATATAACTAAAAAATATTTTCCTGGAAGTTTTTGCACAACAGAAAGGAGTTGCAATAC
-AAAGCATAAGTTTAACACCTGCTAGATATGTGTTCTCTGAGGAACCCCAAGCCTACCTGA
-TGGGTGTCAGATTCTCTCCCTGCTACAGCTATTTGTCAAACTCTTGAAAGTCCAGCTTTC
-CTTCCCATGGAAGGAAAATTCCCACGGAATGCTCTCTTCCGTGTTTACCCACAGAAAGGA
-GAGAAAGGTTCTTTCTCACACAAGTCTAAGGCCTTCCTCTAAGTCACCTTTTCCTATCAT
-AGAACTCACCCAGCACTTCTCAGGATAAATGATACTGCAGAATATGAGTTTGCTTCAGGG
-AAATCCCATACCCACTGTGAAAAATATGGTAACTctccaatatcagttctccccctttgc
-taagtaatagaaccctccaaatattaggttgacacaaagccgaccagagaaaaggctgaa
-tttcccaTCTAGAACTGGTCATTCTTCAATTCAGACCAGCCATAACTGGACACTTTTGCA
-AATATTCATTAATAGTCTTGGTGAAAACCTCAGATTTCCATTTTGCCAAAGTTTCCAAAG
-GAAAAGAGGGCCTTTTTCTAAGCCCTGAGAGCCCCACAGTGACAGTAAGTTCTCCCTTGG
-AATTCACCCTGGCATACCTCGGTGCTACCCCAGATCCTTTCCCTCAGGGGCTATGAGATT
-AGGTTTCATggccgaatgtgacggttcatgcctttaatcccaacactttgggaggccgag
-gcaggaggatggcttgagcccaggagtttgagaccagtctgggcaacatcatgagactct
-gtctatgtaaaaaataaaaattaaccaggtgtcatggtacataactccagtccctgctac
-tgtggggcaggggctgtgggggctgaggagggaggattgcttgagcccagaaggttgagg
-ctgcagtgagctgtggtcgtaccactgcactccagcctgggcaacagagcaagaccctgc
-cttttaaagaaaaagagaaaGGAggttgggcatggtggctcatgcctataatcccaccac
-tttgggaggccgaggcaggtggatcacctgaggtcaggagttcgagaccagactggacaa
-catggtgaaaccccatttctactaaaaatacataaattagctgggtgtggtggcgggcac
-atgtaatcccagctactcaggaggctgaggcaggagaattgcttgaacctgggaggcgaa
-ggttgcagtgagtcgagattgtgccactgcactccagcctgggtgacaaaagcaaaactc
-catctctaaataaataaataaaaataaaaaaGAGAGAGAGTGAGATTAGGACTCACCCTG
-GCCATCCCAGGTCCTGCCACTCCAGGTCCTGCCACTCAGGGACTGTGTGACTCTATATTT
-TTTTTAACTTCTCAGGCCAATATTAGAACCCAATCTGATCAAATTAGAAACCTATGAACA
-TTCCACTTACTAGCAGTGCATTCATGGAGCACTTCACAGGGAGTCACCAAAGTATCAATC
-AATCAATAAACTACTACCCTACCCTGAACTAttaggttggtgcaaagtaattgcagtttt
-tgcattgttggaatttgctgtttgatattagaatgcgttcttaaataaatgtggttatgt
-tacactttttttttttttttttttgagatggagtttcgctcttgttgcccaggctggagt
-gcaatggtgtgatcttggctcaccgtaacctcctcctcccgggttcaagctattctcctg
-cctcagcctccctagaagctgggattacaggcctgtgccaccatgactgactaattttgt
-atttttagtagagacggggtttctccatgttgatcaggctggtctctaactcctgacctc
-aggtgatgcacccgcctcagcctcccaaagtgctgggattacaggcatgagtcactgctc
-ccggcctatacatcattttaataggcatttctcactttatgttttttgataatgacttat
-tacttgctgttgattttatgtttattttagactatggaaatgatgtcagacaaaaagaaa
-attcaagcgattttcttattcaagttcaaaatgggtcgtaaagcagcagagacaacttgc
-aacatcgactgcgcatctggtccaggaactgctaacgaacgtacagtgcagtcgtggttc
-aaaaagttttgcaaaggagaggagaacctcgaagatgaggaatgtagtggccggccgttg
-gaagttgacaaccaccaattgagagcaatcattgaagctgatcctcttacaactatacaa
-gaagttgctgaagaactcaaccttgaccattctatggtcgtttggcatttgaagcaaatt
-ggaaagatgaaaaagctcgataagtgggtgcctcatgagctgagcaaaaatcaaatcatc
-attttgaagtgtcgtcatctcttattctacgcaacaatgaaccatttctcaattggattg
-ggacatggcaatgaaaagtgtattgtatgtgacaacctgctacaagcagctcagtggttg
-gaccaggaagctgcaaagcacttctcaaagccaaatttgcaccaaaaaaaaaggtcatgg
-tcactgtttggcactgtgatccactacagctttctgaatcccagcgaaaccattacctct
-gataagcatgctcagaaaatgagatggaaatgagatgcaccgaaaactgcaatgcctgca
-gccggcactggtcaacagaaagggcccagttctttacgacaaggcctgacctcatgttgc
-acaaccgacacttcaaaagttgaatgaattgggctacgaagttttgcctcatctgccata
-ttcacctgacctctcgccgatcgactaccacttcttccaactttttgcagggaaaatgtt
-tccacaatcagcaggatgccgaaaatgcttccaagggtttgttgaatcccaaagcacaga
-tttttacactacaggaataaacaaatttattcctcattggcaaaaatgtgttgattgtaa
-tggttcctaatttgagtaatcaagatgtgtttgagcctagttatagtgatttaaaattca
-cggtctgaaatcgcaattacttttgcaccaacctaaTATGTATGCAGGTGAATTCTGTCT
-GTCTTTGCTAAGCAGTGAGGTGATCCCGTGCTTAATGATGTTACTGCAAGCATGACAGCG
-GATAGAAGCGGGGAGGGCCAGTGATGAAGATAACTATTAGAGAGGGCATCCCAGTTGATT
-AGAAGCCCATCCCTAACTAACTACATCACTTCTAAAGGCCTGATTTCCAGTCCAGAACTA
-CTTTGAAAATGTTGTTTATGAACTCAAATTGTTAGTTGTAAAAATTATGAAATGAAAGAC
-TATTATGAGCATATATAAAATAAATTAGCCAGTAAATAACCTAAGATGATGAAGAAAAGA
-GCACTAAATAAAACCATAAATAAAAAGTTGGGAGCTTGGTAATGTCCAGAAAAAAATATA
-TATTTACTGTAACAAAGCAAAGGCCTTTTGTTAGTACATGAGACTCAGAATGCCTTAAGG
-AATGTGCTGGGCTCTAGAGGGCAGGGCAGGCACACAGCAGCTGGCACTGTTTGTCCAGAC
-TCCTGCCTGGACAAGTTGAATTAGAAAAATCCAAGCAAGAAACAGTGTCACTACTGGCTT
-CCCTGCTCTCTACTCATCTGCTCAGAGAGCTGCATGCTAGTTTGGCCTGTCCTGCACCCG
-TAGAGGACAATAGGTTATCTACATCCTTCACCACTAAGTGAGCCAatgggctgaactgtg
-ttcccctcaaaattcatatgctaaagccataacccacaatgtcactgtatttggaggtaa
-agcctttaaagaggtaattaaggttaaaagaggtcatatgagcaggatcctatccaacat
-aattggtatctttgcgagaagaggaaaagataccaaggatatgcatacacaaagaaaagg
-tcatgttagggcacagcaagaggtcagccatctgcaagccaaggaaggaggtctcaggag
-aaaccaaacctgccagcaccttgatcttggacttctcgtcttcaggactgagagaaaatg
-agtatctgctgtttaagccacacaggctgtggtattctgcgatagcagccctagactaat
-acaGGCCATAAAAAAGATAATATCCTTTCTTCCTTCTTTCTGAGCTCTGGGTAAATGGAG
-GTCAGATAAAgccaggtgtgatggcacatgcctgtattacccgctactcaggaggctgag
-acaggaggattgcttgagcccagtagttctaggctgtagtacactgtgattatacctgtg
-aatagccattgcactccagcctgggcaacatagtgagaccctgtcccctccccaaccaaa
-aaaaaaaaaagaaaGGAGGAGGGGGAGGAATGAGGTAGGAACAATAGGAACAACAGATGC
-tttttttttttttttttttttgagacagagttttgctcttttcacccaggctggagtgca
-atggcgtaatctcggctcactgcagcctccgcctcccaggttcaaacgattctcctgctt
-cagcctcccgagtagccaggattacaggcacccaccaccatgcctgactgatttttgtat
-ttttagtagagatggggtttcaccatgttggccaggctggtctcaaacacctgacatcag
-gtgatccacctgcctcagccttccaaagtgctgggattacaggcgcgagccaccgtgccc
-ggccAACAGATGCCTCTTAAAACACCCTGAGCCTCTGCCTTTATTCTAAATTTGTCAGTC
-ACAGGCCCGGGAGAAAGCTGAGCAACTTCAATAGGATTTTTAACTCAAATCTAAGACAGA
-AGTTTATATAAAGTTGTAGTCAGACTCGGCTGTGTTCAGAAAGTATATTTCTTCCATTGC
-TCAGCAATTATTTATTAGCATCTATTCTGGTCTCTGGGCAAACATTAAGGACTAAGAAAT
-GAATGAACTCTAATCATTTTCATTCTTTAAAAATTGTGCAGCCAAGAAAGAGAAATAAAT
-AGGCAAATGACCACATAACAGCAAGACATGTATAGTGAAAGTCATGCTCACTGCAATAAA
-AAGAACCTCTAGCTCTGAGTGAGGAAGGGGGAGTGGGTGCTGAGGTTGTGGGAAAGAGGA
-AGCGTGGGTAGAGTGAGGCAGACTGCTGTGGAGTGGAGCTGTGGGAGTGGCTTAGAGCTT
-GCAGGAGTAAGGGAATGAGGTGAGAGTGGAGGAACGGCAGAGTGCATATTCTCAGTTGCC
-AGAGATTCTGGGCAGCTTCTTTCGATCTTTGAGGATTTGGGCAGGAAAGGGTGAGAAAGG
-CCCATCTAACAATCCTGCGCTTCATAATCCCCTGAATCCTTGAAATTATTACTAAAGCTT
-AATGCTGGGAAAGATCTCTGATTCCCCTGAATCTGATTTGGCAAGCCAATCAATCATTTG
-TGTTAATTGGGAAAGAAATCAAATATTTCTGTGTGAATATACTCATCTCAAAACATTTTC
-AAGATAAAGTGTTTTACAAACTATGCTTCTGAGTCAATAGGATTCAGCTGTTTCGTTTTC
-ATTTCAGCAACTTAGAGGAAGTTTATCTTCAGAAAAAATTGCTATAAGAcacttcctata
-agccagccctgtgccaaattatttacatgaatcaccttctctagtctttaaacagcccta
-ttatgaatggacaattatctcaatttgacagatgatgaaactgaggcttgaagagattaa
-gttacctaagatcacacaATATGCCTCCAAAATTCGAAGAGGGCCGAAGGTTGTAATTGT
-GCAAGAAGAAGCAAATTTTCTATCTCTTTGAACCATAGACTGTGGATCCACTGCAACCTT
-GCTGAAATGGAAGTCTTTGTTGTTTCATGGGGGTTTTGCTGAATCTTCTGGCTTGTAGCA
-AGAAACTACTTTATCTTCACCAGATCTTATCAGCACATTGTATACCTGTGTGATACTCTG
-TGTGCTAATAAAATTATCAAGCTTCCTGTGGGTCCAAATTATGGCAAAAACGTAAGACAA
-AATGAtaatcccagcactttgggaggccgaggtgggtggaacacaaggtcaggagttcaa
-gaccagcctggccaacatggtgagacccccgtctctactaaaaatacaaaaattagctag
-gtgtggtggtgcgcacctgtagtcccagctactcaggaggttgaggcaggagaatcgctt
-gaacatgggaggcggaggttgcagtgagctgagatcacaccactgcactctagcctgggt
-gacagagctagactccatctcaaaagaaaaaaaaaaagaaaaaGCACACGACTAGTTATC
-ATAGATACTGTTGGCTACTGTTTCCTCTCTGTTGTGTGGGTCTGAGCAAAGAGAGGGAAT
-GGGATGCACCGTGCTTTCAGCTCTCTATAGTCTCTTCTGGATTTCAGTGTTTCAGCACAG
-CCCTAAAAACTACCACATGATTATGCCCCACGTAACAGTCAGATCACCTTGTCTCTAGAG
-AGACCACGCATCCATAACGAAGAACCTCTTATAACCATGGGTTCCACATCTTTACGGCTT
-AATCACTGATGCTCTCAGTGAACCTGAAAATTGATCCTGCTGAACAAGATCAATAAACAG
-AGTTTTGATTCAAAGGCAGCCCAATGAGTTAATAAGTGCTCCATGACAATGCCAAAGAGG
-ATTAAGGAAAGAATAGCAACCTGGAGGAAGATGTATAGAAAAGCAGAccaggtgcggtgg
-catgcgcctgtagtcccagctacccaggaggctgaggcaggtgaatcatttgaacctggg
-aggtggaagttacagtgagccgagatcacgccactgcactccagcctgggagacaaaacg
-agactctgtcaaaaacaacaacaaaaaaaaaCCAATATTAATAATGCAAATATTTGAGtt
-acagggcatttttaagagccagatacagtactgggaaccttgagtatattatctcattta
-gtccttaaaacaaccccatagactttatataaataatacaactgaaagtttaacttaagt
-tgctgaagttcacagataagcagtagaatcaggattggaacccatgtctcatcatatcag
-agaccctacgcttaagtgctatgctTCCTTGACTCTCACTGGCAACAGCTTTGGTGCATG
-TACCTAATGCCAGTTATATCATAAAGGATCTACATGGATAAGCTTATTTCATACTCTTAG
-AAATGGTTTGGAAGAggccaggcgtggcggctcacacctgtaatcccagcactttgggag
-gcctaggcaggcagatcacgaggtcaggagatcgagaccatcctggctaacatggtgaaa
-ccccatctctactaaaaatacaaaaaattagccaggcatggtggcatgcacctgtaatcc
-cagctactcaggaggctgaggcaggagaattgcttgaacctgagaagcagaggttgcagt
-gagccaagatcacgccactgcactccagcctgggtgacagagtgagacttcgtctcaaaa
-aaaaaaaaaaaaGTTTGGAAGAAGCTATAGAAGTCTCGATATTACTGGTGACCCAGTATA
-AGGAGGAGTGGTGAATATCCCTATTCTAAAGGATTTCCTAATCCTGAAGGATTTGGACAG
-CTCCTGCAATTGCCAAATGTAAGCGGCCTGAAAAGTTCACACTTAGATTATTGCCTTTAT
-TTTTGGCTCCCACACTGTAAAAGAAATTAGAATTAGAGCACAGATACAAAAGCTATGATA
-ATGAAAGTCCTAAAAAAAATTCCATTAAGAAACACACACATATAAGTCAGAAATTCATTG
-GGAATACCTTTGCATTTTAAGAGATGAGAAGGAAAGAGTTAACAGTAGTCCTGAAATCAA
-TTCTCTCCCTTTAACAGGAGATACTTCTGGCAGGAAAGAAAAAAAAAAAAAAAAAACTTG
-ACTCTGACTCTGTCAGATCTCCTTATAACATGCTAATAAGAGACCTTCTGGTAAATATGC
-TAATGATATTCACTAGCAGAGGGGTCTTTATGTAGCAGAATGCATCTGCTCAGTCCTCAA
-TTGCTTCTGGTAAACAAACTTAGAGTCTATGAATTTACAGGGCATGGCTCCTTGAAAAAT
-GTCATGTGTTTGTAATGCTAAGTAATTGCCAGAGAATAAAATGGAGATGTTTCTAGCTAA
-AATAGCCCCTTTGGGTAGCTGATGGGCACCCATGCATCACAGACATCACTTAGAGATCTT
-TCATGTTAAACCTATCCCATGGCTTATTTTCATGAGGCAAGAAAGGACCTGGGAAGTGGT
-GTGGACATCCCAGACTTTTGCATTTTTACCTGCTTCGTAATTACCCGTATCCTTGAAATT
-ATTACTAAAGCTTAATGCTGGGAAAGATCTCTGATTCCCCTGATTCTGATTTGGCAAGCC
-AATCAATCTTTTGTATTAATCAGGAAAGAAAGCCAATATTTCTATATGAATATACTCATC
-TCAAAACTTTTCAGAAAAGATATTTTCCATACATGGAAATAGCTTAATTAACtttttctg
-attatgaggttacttatagtcattttgaacactcagacaaaacagaaaactttatggaag
-ataaaataagaataacaaaatctttcccaaagagaaagaccattaaatttttgtatatat
-ccttccagagaatacacaaattatatgtatatatattttacatgtatacatatataacaa
-agactagcttatactacccacgctttcctgtcatttttcttttctacctaagatatcact
-gacagtcttttatataataaggatagtcctcaattatcatcattgtttaaatggaattct
-aatgtgttaagtgccataaattagcagattctctattgatagacatttagcttacttttc
-acattctcactatgagtaatgctAAGAAGGCAATATAGTTCTTGCACCTTCATGAACATA
-TTCTTTTATGCTATGTGCATTATTTTGGGTCAAAGGGCAAGCAGAGTTTCATTTAATTTT
-GTTTTAGACATGGGCTATATATTGACAAATTGCCCTCCCAGGAACAGTACACAGTTTTTC
-TTATGTTGCCTCACCCATGCCAGCAGTAGCTAGAAAATGCATTTCCAAAGACTGGTGCTA
-ATTTTCTGTGCATTCTGTGAGTGCTCAGTCAATTTAAGCAATAACCACTTAGAGTAACAA
-AATCTATTCACCCTAATAGCAGAGATTTCTACTTCATCCCTGGCTCACTGCCCAACTTTT
-GATCTCATCTAAGGCCAATAAATGTAGCTCCAGACAAGTGACACAGGTAGCTCTGTCCCC
-ATCCAATCTACCCAGCTACTTCTCTTAAGGCACGTTCTGATCCTTCAAGCATGAAGTTCT
-TGCCTCTGGCTTTTGTTTCTCTCTTGTTTCTGGCTTCAGTGACCTTGAGTACCCTGGAAT
-CTTCCATATTGAGAAAGAAATGATAGAGGGGAGGGGACATGGAAAAAAGAATTAAATATA
-TCTATTTTTAAAAAGAAAGAAAATTTTAGAATGGACATGTCTagaaggaggaggaaacag
-aggagggggacaggtataaaaactggacttctctgaatatactctgctttgaaggtttga
-ctttggaatcatctacatattttatctaatacaagaatatcgaaacttaaatggcaatcc
-caaaaatctaaaaggaatagaaatcaaattagcctctgtaataaatgggttgtataacca
-cacaaaggACTATTTGAAATGACTTTCAAAGAGTAATTTGAGAATACTTCCTTATTGGAA
-TATAACCTAAAAACAGAAGAATTGCAAACTGTTTTCAATGTTTTCAGTAATCATATTGAG
-ACTTTAATACATATATTGTGGGATAAAGGAAATGAATGTTGGTGTCACTGATAGAGATAA
-GAAATAAAAGTTCAGGTAAAAATTCTGTAAATCCTAAATTTGAATTGGAATTTTATATTT
-TATTTTTaaaatacctttttctacccccatccactgaaaagccctagaaatattggccaa
-cctagtagaaatgatttccctctcacccgggatattatctctaaatataatttaccaaag
-tcttattgaagaaattgctgtttctgagcttgaagcaactatacaaatgtacctggaaga
-ttttaccatactggaaaaaagcagcttgacaaagactactgaagtcatgtcaaaaaaaac
-aaagaagtcaacttgaaggggctttctcttggcaaagatgggaaaatgtgaaccttgata
-aaaaataattgcatgcattattcacagtaaccaagatatgtaatccacctaggtgtctat
-ggatggataaatatataaagaaaatgtgatatacacaatgaaatattattcagcctttaa
-aaagaaagaaatcctgccatttgtgacaacacagatgaacctggaggacattatgctaag
-tgaaataagccagacacaggcagacaaatactgaatgatctcacctatgtgtggaatctt
-aaaatgtcaaactcatggacacagagagtaggatggtggttaccaagggagttgagggaa
-atgaagaagtactagtcaaagggtacaaagtttccgttatgcagggtgaataagttcggg
-agcttactgcatagcacagtgactacagttaataatactgtgttgtatacttgaaatttg
-ctaagagtagatcttaaatattgttaccacagaaaaaaatggtgactatgagaggtgatg
-aatatgttaattagcttgatagtggtaatcatgtcacaatgtatatgtctatcaaaacat
-cacattgtacgtcttaaatatgtacaattattatttgtcaattatacctcaataaagctg
-gaaacataaaaataaaataactacaattaattgaaacatatcaaacatgtccaaaactga
-taaagaaaggtaaagaatttggcctggcacagcggctcacacctgcaatctcagcagttt
-gggatgccaaggcaggcggatcacctgaggtcaggagtttgagaccagcctggccaatat
-agcaaaaccccatctctactaaaaatacaaaaattagctaggcgtggtagcgggcatctg
-tagttccagctactactcaggaggctgagatagagaatcacttgaacccagaggtggagg
-ttgcagtgagccgagatcacgccactatactccagcctgggtgacaaagtgagactctgt
-ctcaaaaaaaaaaaaaaaagaaagaaagaaaagtgaagaatttatcctggcttttctgta
-aaaactgcacctcagaagaaccaaattattgataaggaattttgctctttagaaatattt
-ccagctaataaatgaaggaataatagcattgagacaaatcgccattttgtaatctcaggt
-gaatttacggatctaggcaatgatcattaatggctgagaaaatcacaacaaaaagaacaa
-ttagacatttgtgcctcctgatagaagtatacaatatcaccttcaaagctattttgccaa
-aaaagaaaaaaaaaatcaacccaaatctaatcaaggctcccactctaactcccaagctct
-aggatataccaaggacaaaggaagatcatgaaataccaccatggggattcaatcagcaaa
-ttcTGAAATGCAACATTATCCTTCACCCTGCTTGGCCTAAAAGTACAAAATAACACGAGG
-AAAAATTAGTTTCCAGAGCCTGTTATATTTTGAAAAATCATCAGAAAACTGAGAATCAAG
-GATAGAATTTCTAGAAAGTTCCTTCCCCTAAAGCTTTCACACTTGCCTCAGTGTATATAT
-GTGGCTATACCACTGACAGGCCGCCAGTCATTAAATTCAAGCTCCAAGAGACAAACTCTT
-GAAAAAAAGGCAGCCTAGGAGAAAGCAACATGATTTTTCACATATTTTAACTTGGTTTTT
-CTCATAAAATGGTTTCTGAATGTTTCTTAGCTTTCAATGGGCAATAAATAACTTTTAGGG
-AAATAGATGTGAGCCAATCTGAGGAAGTATTTGAGATGAAGAGAAGGCTTTGCTGTCTAT
-GAGGAGTGCATTAGAATAGAATCGCTCCAGGAAAAGGTCACCTGTGTTGATTGCCTTTAT
-GAGGTGACATTTAAATAAAAGTACTCGTTCAGTTTTCATTGAAAAACATTAAAAGACATC
-TCCAAAAATTTTTTTGGGAATGTGAGAAACTCTGCTGCACAAATGATCATGTTTTGTCAA
-ATAAGATGAAAAGAAAAAAAACACACACAAAAATgaaaaaacagatggaggggtaacata
-aattaagaaactcagaagacacatctacaaattacaatttatggatcatatttgaatgct
-gattctaaaaatttgaaaaaatatgcatttgagaaaatgaatgctgacttcatagtttat
-aatatgaagTCatattataaaatataataagaatgaaatattaataatttatCAGGTATG
-ATAATGGTTTTAAGGATGTGttttttgtttgtttgttttttgagacagagtctcattctg
-ttgcccaggctagactgcagtggcgcgatctcggctcactgcaacctctgcctcttgggt
-tcaagcgattctcatgcctcagcctctcgagtagctgggattacaggcatgcaccaccat
-acctggctgatttttgtatttttttattagtagagatgggcttttgccatgttggccagg
-ctggtctggaacttctggcctcagttgatccacctgcctcggcctcccaaagtgctagga
-ttataggcatgagccaccacgcccagccTAAGAATGTGTTTTTTaactgtatatatttaa
-ggtgtgcaacatgatgtgtgtatgtatatatatatatatatatatatatatatagagaga
-gagagagagagagagagagagaaataatttctgtggtcatgcaaattaacatatccatca
-tctcacagctacaatttttgtgtatgtgtggcaagagcacctaaaatctactcttagcaa
-aaatcctgaatacaatacgatattattaactattgtacattagacctctagacttgtttc
-tcttacatatctgcaactttgtgtcctttgacctacatttccccatttcctacccctcca
-ccacaccccagtaataaccactttattctctatctctgcattcaactttgttttttctag
-tttttaaactctgcatataagtgagatcatgcagaatttctctttctgtgtctggtttat
-ttcacttagtacaatgtcctccagattcactcacgttgccccatatggcagaatctcctt
-cttttttaaggctgaaaaatattccattgtatatataccatagtttctttgcccatttat
-ccttcaatgaatacttcagttgtttccacacctcggctattgtgaataatgctacaatga
-acgtaggagtacagatattttatgaggtgatgatttcacttcctctaggtatatacccag
-aggaggaattgctgggtcctatggtagtgctatttttaatttatttaggaaccttcatac
-tgttttccttaatggctccactaatctacattcccaccaaaagagtatacaggttccttA
-AGGGTGTATTTTTCAAAAGGGTCGCCGagagatacctattaaaatatatacaagagaaat
-cttataatatcagggatttgcttcaaaggaggggaaatccaagaaggggaaagtaaattg
-ggttatataagaaacaagattggccatgagttaatgttgaatttggatgatgaatacatg
-ggggctcattatattattgcttgacttttacacacatttaaattgttcAATAGTAtgtat
-tagtccattctcacactatataaagacatacctgaaattgggtactttataaaggaaaga
-ggtttaattgtctcacagttctgcagggctgtagaggcctcaggaaacttacaatcatgg
-tggaaggggaagcaaacacatccttcttcacatggtggcagcaagaaaaaatgcagcaca
-aaagggggaaaagccccttataaaaccatcagatcttgtgagaactcacacactatcacg
-agaacaggatggggaaaccactccgtgattcaattatctccacctggtccctcccacaaa
-acgtggggattatgggaactacaattcaagatgagatttcggtggtgacgcagcaaaatc
-atatcaAGTAATAAGCTGAAAATACCCTTTATATAAATAATGATAACACTGCATGGAAAT
-AAAGAAAAATCTTTAGGATGCAGCCTAACTGGTATTTACGATTTTTTAAACCCTGGATTA
-AACGCATCTTTTTATAAATGGAAATAATTAATGAAGAACTGAGATGGAATCAAAATAGCA
-AATCATGcacacacacacacacacacaAATTCTGTTTAGAGAACTAAAACAATATGTCAG
-AAACGTTGAAGAGTTCATGtgcatcagttagttcctgccatgtaacaaaccacaccaaaa
-tttagtagcttaaagcaaaatcatttatgtatgtcataattctatgagttacaaattgag
-gctgggctcagctgagaggttcttctcttcacttttgggctcatgcatgtgaggattaat
-gggagctggcaggtctagggtggactccactggaatagtctgtctctgttccaaaaggtt
-agctgaagcttgttttcctggcaacagagcagagttctgagagagcgtgagtatgcaagg
-cctcttgaggcccaagcctaggttcagaacaggaatcacttctgatatactctattggcc
-aaagttagtcccaagtccagatccagGCTTGCTCAAAACAGTGGCCCATCTCTCTGGCCC
-CAATCTCCATAGTTCTGGTAAACaaaaaaaaaagaaaaagaaaaagaaaaagaaagaaag
-gaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggCTGAGATAACA
-TTGGGTTTTTCCAATGATAAAACCTAGAATTAATGAAGAGCTAAAATTAGTAAATTTTCA
-AAAATAcaaaacacataaaatgtaaaactgctgaaaagataagaagaaatgaataaatct
-ataattaagacggaaatctttaataggccataggcctcaggagtcctcaaagtaaacaaa
-aaatgcacaagcatgcttatcttaaaggattaaataggtatttttaaaatattgatttaa
-tacacatgtagaactattaagtaacaaaatagatacatacaattttaaagcatagctaaa
-aaatggctaaaaattgattattataatacatgtgtatttcaaatattccaaaagaagtca
-gtccactcatataaactaaccacaatataacaacattagaacttccaaaaaaggtatgtg
-tatatgaggtggggttttttcaaccttctaaataattgtgggttaaaaaaacataaaaac
-tacaagattttggaaatgaatcaaaatgagagttctacatataaaatcttcatgaaaatg
-gttaaagtggaaattagatgaaagatttaaaggcatttactagaaaacaagaaaTTTTAC
-ATTTTTAAATTAAAAGCTAATTAAACTCAAAGTTAAATTTAGTTAATTAAACTCAAAAAG
-CTAACAGACCTGAACTTGCTCAGCAGCCTTACCTAAGAATCATCTATTTTACCGATCTTT
-TCAAAGAAATGTTTTGTTTTTATTGATCAATGCCTCCatatttttgaaatttttatagtt
-ttcatttattatattgacaaatttttttaaattattaatGTGGCGCTGGCAATACACTTG
-TGAAGCATTTAGTTATTTATCCTTAAAATATATTAGTACTTggcggagtgcagtggctca
-cgcctgtaatcccagcactttgggaggctgaggtgggcaggtcacaaggtcaagagatgg
-agaccatcctggccaacatggcgaaaccccgcctctactaaaaatacaaaaaatagctgg
-gcgtggtagtacacacctataatcccagctactcaggaggctgaagcaggagaatcactt
-gaacctgggaggcggaggttgtagtgagccaagattgggccactgcactccagcctggat
-gacagagcaagaccctgtctcaaaaaaaaaaaaaaaTTAATCCATGTGCACAAAGAGGCA
-TAATCAGAAATAATCATTTCCAATTTTggctgggcgcagtggctcatgcctgtaatccca
-gcaatttgggaggctgaggcgggtgaatcacctgaggtcaggagttcgagaccagcctgg
-ccaacatggtgaaaccccgtctctacttaaaataccaaaactagcctggagtggtggtag
-gcacctgtaatcccagctactcggggggctaaggcaggagaattgcttgaacctgggagg
-tggaggttgcagtgagccgagatggtgctatcacactccagcctggggaacaagagtgag
-atgtcatctcaaaaaaaaaaaaaTCATTTTTATTTTGTTTTTAAAAAGAAAAAATGggcc
-gggcgcggtggctcatgcctgtaatcccagcactttgggaggccaaggcgggtggattac
-ctgaggtcaggagttcaagaccagcctggccaacatggtgaaaccacgcctctactaaaa
-atacaaaaattagccagaagtagtggcacgtgtctgtaatcccagctactcaggaggctg
-aagcaggagaatcgcttgaacctgggaagcagagtttccagtgagccgagattatgccat
-tgcactccagcctgggtgacagagcaagactccatctcataaaaaaaaaaaaaggaaaaa
-TTGGAAAAATAAAGTACATGCAGTTTATTTGACAGAGGGATGTTTAACTGAACCACACTA
-CATCCATATATATGAAGTTATGCAGCAATAGAAAAGAATAATGGACATTTATATTTTTAG
-ATATAAAAAGAGCTGTTGAACCTATCATTGAAATTTTAAAAGGAAGCTGAAGAACAAGTA
-CAGTGTAATAAATTATTTGTTTTTtacaatttaattatagagtaaatgtgatctttcttg
-gtatatagttctatagattttaataaatatttggattcatgtaaccaccaccacaaatag
-gacacacaacagtttcatcaccctaagaaaagttcccggatgctcacccctctgtagcca
-aaccgtcaccccacccataatccctggcaaccactgatctattttccatcactataattt
-tgccttttccaagaatgtgacataaatggaatcatgtagtatttaacgttttgagaccag
-cttctctcagcatgtgatatggtatgtacctgtgtctccacctaaatctcacgttgaatt
-gtaatccccgatgttggaggtagagcctagtgagaggcgattggatcatggggacagatt
-tctcatgaatggttcggtatcatccccttggtactgtcctaaggatagtgagtgagttct
-gcagagacctggtttaagcgtggagcacctccccactctcttgctcctgctctggctatg
-ccatgtgcctgctcacccttaaccttccaccatgattgtaagtttcccgaagcctccccg
-gaagccaagcagatgccagcatcatgcttcctatatagcctgctgaacagtgagacaact
-aaacctcttttttttttagcaaatgacccagtcccaggtatatctctataacaatgtgag
-aacgacctagtaacagcatgtctttgagattcatccaagtttctaccagtatcaataact
-cattcctttttactgctgagtatgattgtattctatggatgtggtacatctgtttatcca
-ttcattcattgaagggcatttgggttgttttcagcttttggctatcacaaataaagtttc
-taagatggccaggcatgatggctcacgtctctaaccccaacactttgggaggctgagatg
-ggcgttgaggtcaagagtttgggaccagcctggccaacatggtgaaaccctgtctctact
-aaaaatacaaaaattagctaggtgtggtggcacacacctgtaatcccagctactcaggag
-gctgaggcaggagaatcacttgaacctgggaggtggaggttgcagtgagccaagattaca
-ccactgcactccagcctaggcaatagagagagactctgtctcaaaaacaaataaataaat
-aaataaagttgatatgagcagtttttacagatgtttgtgtgaccgtaagttttcgtttca
-ctagggtaaataccaggttcaggattgctaggtcctgaggtacgtgtatgtttacctttc
-aaataaactgacaaaccattttctagagtgactgcaatttccagttgttctgcaacctca
-ccagcaattggtgttgtcagaaactttttattttcataattcttatcaatgtgCACAATT
-GTTTTTAAAATTCACAGAATTAAAGGAAAATATATTGTGCACTATTTGTGTAATTaaagc
-aaaacacaaacacataaacggaagacaaaaataagaaactaattcaagaaactaaagaaa
-gaaaaacaaaaTTAACTTTTTAAAATTAGAATAAAGGCATATATATGTAATAGGGATAGT
-TTGAAACACTCCCAAACATCTGCTCTGAGCCAACAACAATCGGATAGCgtgagggcagat
-acaaattaaatatgagacttaactctccccgttaaaaataaggaaagagacttacccaac
-acccctcccccccgcccttctctttctctgtctctttgaaatgtatgtaaatctttttaa
-aatgtaaataggcctctagccagttttacaacccaggaatatctttgtcaaatacctagg
-agccatctctttgaaatgtaagcatccagaaaggtagtgctcctatctctgaatttatat
-gagtgggtaggtctctaactttggcaagttccttgcttcaagttgcaaagccacttcctg
-tcacaaggatgtgagaattttgtttttcctttggttaaagccaaccagcgaacacagatg
-gccactccaattatcaggtgaatctaggatgaactatgtgtatgtcaaatggtacttcta
-agttctcctatttgagaaccagttattgtttgtcttgagagcatatctgtaatgggtttt
-atcttcttcaggatataaacaagtaggatttctttctgtctttgcaaactctttgtgaat
-tgcctgtgatgtgtctcacattctggttcaatgcttattcaatggcaattgttttctttc
-tcttctacctttgtggagaggttttctaggttgagagaagattttgtttttaattatatt
-tcccccacaATAGCAAACACATCCCCAACcacatacacacacacacacacacacacacac
-acacacacacacaacaggtaattagacaggcctgagcagggcaggagagggctcttcccc
-cacccactacgaatgtcagtgatggttccaaaattatcacattgcctctctaaaagtgat
-aaattggGCAgcgcagtggctcatgcctgtaatcccagcactttgggaggctgaggtgga
-cagatcacttgaggtctggagttcaaaaccagcctggccaacatggtgaaaccccatctc
-tactaaaaatacaaaaaatagctgagcatggtagtggacacctgtaatcccagctactca
-ggaggctgaggcaggagaatcgcttgaacccagaaggttcaggtttcagcgagccaacat
-tgccccactgcactccagcctgggcaacagagtgagactccatctcaaaataaataaata
-aataaaataagtgagaacatatggtacttatctttctgtgtctgacttgcttcacttaag
-ataatggcctccagttatatccatgttgctgcaaaagacatgatttttgtggagggattg
-tattccattgtatatatagaccataatttctttatccaatcatctgttgatggacactca
-gttgattccatacctttgccatcatgaatcatgttgtaataaacatacaagtgcaggtat
-cttttgatgtgattatttcttttcctttgggtagatacctagtagtgggattgctggatc
-aaaAtggcaggtgcctgtaatcccagctactccagagactgaggcaggggaatcgcttga
-aactgggaggtggaggtttcagtgagccaagatcatcccactgcactccagcctgggtga
-cagagcaagactctgtctcaagaaaaaaaaaaaaaTgctgtgtgattacccttatatggg
-tttcctggatgagccatttgttaaattaatttttgttggaaatttccccgcagagctgtt
-gcacattgtggggggttaatccccagacactcccatgaggccccagtcacccaggggtgc
-ctttggctgggaggagcaagtgccctttctcctaggagctgaaaaactcagtctcttatt
-tatctatgaaaacaacagttcagtttctcacataaatgtgtacagataaaccgaatttag
-acagattttaggagaaaaagcaattgagaattccttttagaatgcatctcccaactagaa
-ttaggatccttaaacaaccacttcttaggagaaaaccagctcagaataaatcaaggacca
-tcaaccaaagggaggtctggggctcaggaggacttaccagttccaccagaggagaagctc
-gaagcttcaatgggcccctgctggcaccttagctctggttttgggcaactcctttagggt
-cctgagtcttccctgaggcctcacgtgtttgggcaccaaattattgttgacgaaaagagc
-caaactctgtaaaatattttaagagatttattctgagccaaatatgagtgaccatggccc
-gtgacacagccctcaggaagtcctgagaacatgtgcccaaggtggtcggggtgcagcttg
-gttttgtgtattttaggaaggcatgaaacatcaatcaaatacatttaagaaacacactgg
-ttacttggaagtccccgcggggctgggggcgggtatcaatggaaaggaatgttcaggtta
-acataaaggattgtggagaccaagttttattgtgaaaagaaatctctcagatagcagact
-tcagagagagagcagattgtaaaatgtttcttatcagacctaaaagggtgcctggctctt
-agttgattatctcctggatctggaaaggaaggggaaaaagggggtgggtgggtgtggggg
-tatagaatgtggatctttttccaccaaagattttgtaaggcaatttcaaagtatggcaag
-gcaatatattttgtgataaaacattgtgattttttttttttttttgtgagacagagtctc
-actaggtcccccaggctggagtgcagtggcgccatctcagctcactgcaaccttcgcctc
-ccgggttcacgccattcttctgcctcagcctcccgagtagctgggactacaggcgcccgc
-caccacgcccggctaactttttgtatttttactagagacagggttttactgtgttagcca
-ggatggtctcgatctcctgacctcatggtccgcccgcctcagcctcccaaagtgctggga
-ttacaggcgtgagccactgcacctggccaaaacattgtgattttcttccttgttatgcca
-gagtcagattgaaaagtaagtcacaatatacagggtcaaataaaacccatcttgtaagaa
-tttatggtttgtagggcataactccctagaccccttaggtaggaatttgggcaagataaa
-aaatcagagtttagtcctcaattccttaagataaatctctttctctatatatatctctct
-ctatctcatatctccatcctattctctggaaaactctgactaatgcaAGAAATTAAAGAG
-ACAAAACACATAATACAATATCTtaaacaacaaaatactattcagccataaaaaagaatg
-aaatcctgtcattcatggcaacatggatgagctagagcagtggtccccaacctttttggc
-accaggcactggtatagtggaagacaatttttccatggtcggaagggggtgggaggatgg
-ttttgggaagaaactgttccatctcagaccatcaggcagtagttagattctcataaggag
-tgtgcaacctggatcccttgcatgcgcagttcataatagggtttgtgcttccatgagaat
-ctaatgcttctgcacatctgacaggagatggagctccggggtaatgctcacctgccactc
-acctcttgctgtgctcccagttcctaacaggccatggtccccataccaatctatagccca
-ggggttggggacccctggcctagaggacattatgttaagtgaaataagtcaggcacagaa
-acataaatgctgcacattctcacttatatgtgggaactaaaaaagttgagcttacaggcc
-cggctcggtggctcacacctgtaatcccaacattttgagaggccaaggcgggtggatcac
-ctgaggccaggagtttgagaccagcctggccaacatggtgaaatcccatctctactaaaa
-atacaaaaattagccgggtgtggtggcgggtgcctgtaatcccagctgctcaggaggctg
-aggcaggagaatcgcttgaacctgggagacagagttgcagtgcaccaagattgcaccact
-gcactccagcctgggagacagggtgagactccatctcaaaaaaaaaaaaaaaagttgagc
-tttcagaagtagagagtaaaataatgtagcaggtagaagaggatacggagaggttggttt
-taacaaatacaaaatcacagctagataggaggaataagttctagggttccatagctctgt
-agggtgactgtagccaacaatcacttattgcatattttcaaatagctagaagagaggatt
-ttgaatgttctcgcacaaagaaatgagaaatgtttgaggtaccctgatttgatcattaca
-cattgtgtacacgtattgaaatatcactctgtatcccataaatatgtataattattatgt
-caattaaaaataaaattttaatttaaaaatacattttaaaaatCAATACAATATCTGACC
-TGACACTGCAATCTCAACTCAAGGAGGAAATGAAtgctgtaaaaggcattattaggtcaa
-ttggcaaattggaatacagatatatatatatatatatatatatatatggatagatgatag
-actagataaaagtggtgtccatttaaatttatggagttagtaactatactgtcatacagg
-agaatatccctattcttaggaaatacacactgaattatttgggagtaaaaggccacgata
-atataaggccatgaacatataacttatgctcaatagattcaaagaagaaaatatacaaat
-atagagagactaatatagATATATATATATCCATAGATAGAGAGAGGTGGGGCAAATGCT
-AAAGCAAGAAAGATAAAATGTCAACAATAGGCAAATCTCAGGGGAGCTGGGGAAAAGGTA
-TCGTACAATTTGTATTTTGCAGCCGGTATGttttaaattatttttaaatgaaaagatttt
-ttaatGGGTTGAGGAAATTGGAGTGACTTATATTTATGACATCCAATGGACTGTGCATGC
-TGTATGGAAACAAGGAGAAAATAAATGTCATCATTGCTTAACAAGTGAAGGGTAAAAAGA
-CAATTAACTCACTGAAGACTACGCACAGAAACACAAAAGCCTTTGCTTCTGTGGTTATAG
-GTTTACCAAAGGCACAAAGGGATTTGTATTTATTTTAGGATTATAATTTACATCACTTAG
-TTGGAAAAATTACAGATTTTAAGATATTTTTACAAATCTGAGTGACTGTAAAGACTGCTA
-AAGTCTTGGGACATATTCTTACCAAGTCCCAGATCttttgttttgttttgttttgtGCCT
-GAAATCAAACCAGGTTTTTTAGACCAGGAAAACGTGAGAAGCTAGAGCTGCTCTACTCAG
-TTGGCCCAAACCAGGACTCCGGAGATTATTCCCTTATACAGCAGGCACCACATTAGAGAA
-AGGATTCTGGAAAAGTGAGCTGGAACAGAAAAGAACTGTCTCAATGGGAAACAGACTCCA
-AAGGACGCTATTGGGGGGAGGAAAACACAAAATATTTCTTGAGAAGAATGTGGAAATGGC
-AAAGTCTCTAGCCTCCAGAAACCTTAAACTCTAGGGAAAGAAAGCAAAAATTTAGAGGTA
-AGAGTGTTCATATTAAAATTCAAACAATAAGTAGTTTTTCTATAAACTCTCTTTTTTTCT
-AATCATGAAAGTACACATAATCATTCTCTCCAAACTCAGACATTTtagacagatagatag
-atagatgacagatagatagatagatagatagatagatagatagatagatagataCacatg
-catacatactacatacatatatacctacataTGTTGGCACATAGATGTTCCTTTACCACA
-GATTAAGTTATTCTAGATGCATATCTTGTAGCCTACATTTTTATACATTTTcatcatttt
-aataactgcatactgctctattatattctgtattttctatattagattagatccatgttt
-tatcaccatttaggtagcttttggttttctgttactgtaatgttgagataaacgtcttta
-tgtacttgttcaattattcccattaaacaaaagcccaaggtacaaagtttctgagtaaaa
-aaataggcacattttaaggcttctgatatatattgccaaattgtgctacaaaagaaaaac
-tgtaccaattaacactcccagcaacaacgccaagagaatgctagtttccccacatctcac
-caacactgtctaGAACGCATAGTTTTAGAGATGAACGCTGGGAACCGACGCACTGTTTGC
-TCTACCTCTCCCCCTCCTAACAGTCTAGAACACAGGCGCTCAATAAATCAATCCAGGCTC
-CAGTCCAGTAGACATTCTGATCTAATCTGACTGCTCTGGGTAACAGAAAAGTCTCCCTTG
-GTTCACTGCCCAGTATCCTGGCATCATGTGGATCCTATAAAGGCAGTAGCTCCAAGCACA
-TTACAGAGGGACCCAACTCCATTAAACCACCACCAGCTCCCCAAGCCACCCCTTCAGCCA
-TGAAGTTCCTGCTCCTGGTCTTGGCAGCCCTCGGATTCCTGACCCAGGTGATCCCAGGTA
-AACTGGATAAATAGGAGGAAAGGAAAACTGGGAACGAGGAACACTAGCATATCTGGTTGC
-TCTGGTGATAGATGAGCCAGGTTGGGTGGAGGCAGGGCTCACCCCACTGAGTTCCAGTCT
-AAGGTAGAGATCTCCTAACAACCACCACTAGCCTTGATATCCCACACCCAAACACCACCC
-TATATAACCTTTACAAAAATTTGTTTTCTATTCTAAAATGATAGTCACCCTCAACCTAAA
-CCAAAATATCTTCTTTCACTTTATGTGAGCTCCTTATATCTAACCTCCTAAGACACACTG
-AAGGCTTCTGTCATCACCATGTGCATCCATTGAGATCAGCCCGGGTTGGAGCTCAAAGGA
-GATTTTGAGCCTAGAAGGAAGAGATTGAGGTTCCCATCCCTATGCTCAACAGACAGCTGG
-CAGGTGGGGGATGGAAGCAGACCTCTTAGAGGGCTAGTTCCCACAGGATGGTAAGCAATG
-GGTTCAGCTCAAACCCTGGGGCTAGGAGATAATGCAGGGTCagaaagagagagagacaga
-cacacagagagcagggagagagagagaTCAGAGGAGGGCCAGGCAACGGATGTGAAGAAA
-GCCAAAGAGGCTTGAGGGTGCTCCGAAGAGGCCCCTGCTGTGAGCCAATGGCAGACACAG
-AGCACTGAGGCAAACAGATTTCAGCAGATGGTGAAATGGTGCACAGCACTGGGTGAATGC
-AAAAATGCCCTGTCACTGGCAACCGTTATTTTCTTTTTAATGATTTTGGAGAAAGATTTG
-ACTCCTCCCACTTTGCCCCAGGTTGACTCATATTTACAGTTTTAGAGTCTATGAAAACAA
-GTAAGGTAGAAACACCTTAAAAGGGAGCCTGTGGGGTGAGTGAGACTAGCCCCATTTCTC
-CCTTTTGAGTATCCAAGCTCCTCCCTGACCGTGAAGACCAGGCTCCCCACCCCTGTTTTT
-ACCCATACATCCTATTCTGTAGTATCAAATTTAGCAAAAAGCTTCAAAGATGCAGATACT
-GGCAAAGAAGAAGAGCTCGTCAGACAGAGTTCCCCAAGGCCATCAATCCAGGAAGATTTT
-TGTCTCCTCATCACTGGCTTTCCCAAGTCTCATTTGCACAACATCCTAAGGATACACCTC
-AGAACAAAAAGCCAAACACTCCCATCTGGCGCTGACGCTTTAGTAGCCCTGTGCTGCTTC
-TAACCATGACTTCTCTGTCTTGTCCTCTCCCATACAGCCAGTGCAGGTGGGTCAAAATGT
-GTGAGTAACACCCCAGGATACTGCAGGACATGTTGCCACTGGGGGGAGACAGCATTGTTC
-ATGTGCAACGCTTCCAGAAAATGCTGCATCAGCTACTCCTTCCTGCCGAAGCCTGACCTA
-CCACAGCTCATCGGTAACCACTGGCAATCAAGGAGAAGAAACACACAAAGGAAAGACAAG
-AAGCAACAAACGACCGTAACATCATAATAACCACTGCTATCGCCTCCACCAACTCAGAGA
-AATATCATTTCCACAGTTCCAATTCCTCCTACATTGCTGAGTACTAGCCAAGGCTCCTCT
-TTATGGGGCAGATATCTATAGCCAACCCCAAAACTTCTGTCTTCTATCATTCTGTCATTC
-ATCTAGTAACTAATTTGGAGTTTGTATCTATCTTACGAGAACAATCATCATGCAGATTCG
-TCCACAGGGGATCtgtcagtttgggtcctccaaatgaaaaatgtcaagacagaattggac
-atgcaaaagattgactgggagaacacacctctgatggacaaaggtgagacagagcagcca
-caggcagggagagccttcagactgcaacgctggcctgatacgtgtcaaaggagagaggga
-tagaggaggattgaatagaaggagactaagactgcagctctaagaaagtctcagccaaac
-agatggggaggcccaaagcaaggcttgcccctcagaggagctcacgcagggcaggaatag
-ccaggttctcatatcccaggggttcagactttggctgagaacagcccctggagaacatgg
-ggtgactgctaccataggtctggaagtatgaggctgtccaccaactatccccttgaagca
-agttctcttgaaaggaaatctaaacagtgcacccccatggctgccacGGAGTATAAGGAG
-GGAGAGAAAGGAGCTGAAAGTCTAGGTTTGGCCAGCTAGGTAGACTGACTTGTGAGGTAT
-TTATTTATTCATTTGAGTAACAAAGCAGACAGAATACATAGCCACCATTGGTAGTACACC
-CCAAAAGCAAGGATGGCATGATGCTGGTGACTCAAACGTGCCTACTCATGGTGTCAAATT
-GGCATAATCCTCTTGGGAAGCTGTGTGGAAATAAGCACAGAGAAGCAGAACTCTAATTGC
-TTAATCCACTAAACATTACTTCTGGGAATTGGCTCATCATAAATTATCCAAGAGAAGCAC
-AAAGTTATGGGCACAAAGGTTTTCCATATAATATTATTTAAAATGCTGAGAAAATGAAAA
-AATCTAAATGGTGAAATATATACTAATGCCATCTATAAATACAAACAAATAGAATGTTTA
-TAGAATAATGGAACATAATAACATTATTCAAAATTGCATTTATGCTATAGTTGTCAAAAT
-TGTCTCCTTATATGATACAAAACTCATGAAAATTATGACTTTTTTGTTTGGTTGGAAAGC
-AGAATTATGCATAAATTTCCTCTTACAGTTCGATGCCCATTAGTTTTATATAACATTTAT
-TTGACACGTACTGACTTCTATCTGAGAAGAACAAACCAAAACACTCAGGCCTAAATAATT
-AAAAACGGTCCTAAAAACTAGCAAAccagataagaaaagatgttaatgcccattccctaa
-cttatgtcttagaccaaaattaattctagatggttttaaaatgacagtgtaaaagtaaag
-tattaaaagattgtgtggtcaaatattcaatttaagagcaaggaaattcttataaatata
-acaatagaggcagaactcatgtaagaataaattgattaggtggtattaaatattaagttc
-ttatgtatgtcaaaagatatcattttgaaattcatccatcttattgggtattgcaggagt
-tcattcctttttgtttataaatactcttccgtcatatgaatagtattcatttgtatactg
-gtttgttgatggacatttgggttgttcccagtttatggctattacaaataaagcttctat
-gaacatttatgtacaaatctttgtatggatgtatgctttcatttccctaaggtaaatacc
-taggagtagaacgtctgaatcatatggtaggtgaatgtttagcttttttgtttgtttgtt
-tgtttgtttgtttgtttgtttgttttttgagatagagtttcgctcttgttgcccgggctg
-gagtgcaatggtgcgatctcagctcactgcaacctccgcctcctgggttcaagcaattgt
-ccttcctcggcctcctgagtagctgggattacaggcacgcaccaccccccgaccccggct
-aatttttgtatttttagtagagacggggtttctccatgttggtcaggctggcctcgaact
-cctgacctcaggtgatccgcccgccttggcctcccaaaatgctgagattacaggcatgag
-aatgtttagcttttaaaggaaatacaaaattgttttccaaaatggttgtgccagtggatg
-tgcccatcagcaggatgtgaaagttccagccgttcctcatcctcaccagcatgtgatatg
-gtcagtcttttgcattttcatcattctaatagatgtgtagtggtatttcattatgctttc
-aatttgcatttttttaataactagttatcaaaaaagtatattctgtatgattctatttac
-ataaagttcttTAAATTCTTTTAAAATTGCATAcaattatttaaaatagaaagtaagaat
-ctaacgacagaaagcagatcactggttgtcaggggatgtgaaaggtgcatggagagggct
-gaaagaatgtaaagggacctgaggacactttgaggggtgatcagtcaagacacattcata
-ggccgggcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggtgga
-tcacgaggtcaggagatcaagaccatcctggctaacacggtgaaaccccgtctctactaa
-atatgcaaaaaattagccgggtgtggtggtgggcgcctgtattcctagctactcgggagg
-ctgaggcaggagaatggcgtgaacccaggaggtggagcttgcagtgagccaagatcgcgc
-cactgcactccagcctgggcgacagggcgagactgtctcaaaaaaaaaaaaaaaaaaaga
-tacattcataatcttgattgaggtaatggcttaatgggggtgtacataagtcaaaaaatt
-acaaaatggtaaactttaaatgtgttcagtttattgtatgtcaatttaaacttccaaaaa
-aGCtattattttaataaaataaataaatCTCACAGTGAAACAGAAATATTAAAGTATCAT
-AAATAGTTTAAAGACGTATGACAAACTGAGACATGTGATGAAGTATCGATACCAATAAAA
-TATAACAAGTTAACATGAAGcaacagggaaaacatgaaacccctagcagaaaatgaaaaa
-gtaacatgaactagctttttaactctataaacggcctgaaaaatgggaaaaaatctgtgt
-gactgtgatcaaataaatgcagattaaaactacaatgagatcttgttttttacctatcgg
-attgtcagagaattaacaaacccaagtctgacaaggcataaatagaaataagtctcatca
-tcagatgctccggtttataactaaatatgtccattctggaagacatttatctatacagct
-ttcaaaacccttaaaaatgttcatgttctgtggctcagagactctacttttagggatata
-ttctggggaaataattagagttcatatcaaaaagattaatgtatatacagcacaatcata
-gcagcatagtttaaagtagtgaagaggcagtggggtaagatggctgaacagaagcctcca
-ctgatcatcctccccactagaacaccaaatttgacaactatctacacaaaaaagcacctt
-cataagaataaaaaatgaggtgagtgatcacagtacctagctttaacttcatatcaccta
-aagaggcactgagaaggtaggaaagacagtcctgaattgctgacaccgcctctccccagt
-cctcaggcagcagctgtgtggtgtgcagagacaatatgtgtacttgcaggagggagagca
-cagtgattgtgggatttcacattggaactcagtgctgctagcaccaggcagaacccagca
-ggtgcctaaaagggatcatttagaccatccctagccagggggacatcacccatcccagag
-gtcggaactccagtttccgcaagcctcaccaccgtgggctaaagagctctggggtcctaa
-ataaacttgaaaggccgtataggccacaagaactgcaattcctaggcaactgctagtgct
-gtgctgggctcagaggcagtagatttagggaccactcaacctagtgagacaccagctggg
-gtgtgtgtgtgtgtgtgtgtgtgtgcgtgtgtgtgtgtgtgtgtgattctcgtgcctcag
-cctcccaagtagctggtgatggcagtggcagcccatctggagtggacgctgccatcaagc
-cagctgcagcagggagggacagctggggctgcacattccacagagctgcagagctgggga
-caatgagagccccacaccttccaagctggtgcagcaggagctccccaggtgcaactgcag
-ccactcaagtcacggctgtgaaccccggcctccctgtgttcttgtgggtgctgggagcag
-gcaggggtcctgcacttttgggtgcagctgcaggcgcccaaaccatggctgcggaaccag
-acatctctacactcttgagggtcagggaagtccccactgccctcacaagcttagaagtgc
-ctgctcccacagcctggcgcctccctgctgtcggtgcccgctctaatcttggagcaaagt
-tgaggccaagcccaggtgctgtcatagcctgttgggtgtgcacacgcttggggcagtgct
-gacataccagccccctgccgcctcggacccctacagacctcgggtgctgacgagcatagg
-aggaaagccgaggtggggctgagggcagctcggcacctacagcctgggtgccatgaatgg
-cagtaggagTCTTCTCAGTTCTGTCTCCCTCCCTTCAGTGTGGATGAAGGGGTAGAAATG
-AGGTACAGCATCCTGTCTTTCCCAGGGGTCGTGTTGCATCCTTTAATAGTTTACCACTGA
-CAGCACTACCAACGATTTGGGGATTGTGTCTCGAGGAAGCAATTGACCTAAATTTCATGT
-ATCAATGAAACTGTTTTTCCTTATGGttttaattatttatttattttataaaataaaata
-aataGGCTTTTAATATATAATGAAAGCCTTTTAATGTTAACATGCAAGGACTGAAAGAAT
-ACCTGTTGGACTGCAAGATGGCTGCTCCCTCTACCCTCAGCTTCAACTGGCCTGTCAGCC
-AAGCTTTGATTTCCTAGGCAGAATATAAAAGAATTCCTCTCTGTGGTGGTCCAGGAGACC
-AAGGGAATTTGGGGAGGTGATAGAACTGCACCCTGATCATGCTGGTGGTGAAAACTCGTG
-CAACCGTACACCCAAATGTCATCTTTTTTACTGTATGTTAATTTTAGAAATCAGAAAGTA
-AAAGATGCAATCACAAAAATATCATTTGGTAGGACAAACTTATTCAGTATATGAAGATAA
-TAGAGAACTTTTATACAAAAGTGGCTCTTACaaaatattaatataaaatattaaaatata
-aattCTCAAGAGCTATAACTTAAACTTCTATGTTAATTTAGGTAAGCAATTCTCCTATGA
-AAAGACTTAACGAATTCTTTCCTTTTCTTTTCCTCTTGTCTTTTCATTTTGCTGCAAGGA
-GCAGCCTTAAAGCTGACTGAAACAGTTATTGTGACCAGCATGTAATGCTTGAAAAGATGA
-AAATCCAGCTTTAAATATGCTCAATCTCAATAACttttttggtttttttttttttttttt
-tttttgagacggagtcttgccttgtcacccaggctggagtgcaatggcacgatctcggtt
-cactgcaactttcgactcccagattcaaatgattctcctgcctcagcctcttgagtagct
-gggattacaggcaccggccaccatgcccagctattgtttgtatttttagtagagatgggg
-tttcaccatgttggcaaggctggtctcgaactcctgacctcattatctgccgccttggcc
-tcccaaagtactgggattacaggtgtgagccaccgcgcctggccTCAATAACTTTTTAAT
-AGGTATATGCTTAGTTTATTCATGTTTCTTTGCTAGTTTTTTTTCCCTGCAAAGAAGAAG
-AAGAAAAATAATTTTAAATCTTATTTGAAGGATGATTGTACACTGTGTTATTGGCCTTGG
-AAAGGAGAGAAGGAGGAAAAGGAGTAGGAAAAGGGAAAATATCTTAAGAGGTTGTACTGT
-TAATCTACTTCCAGGCAGATTTTAACCACTAAAGCTAAAATGCTATTATGAAATTGAATA
-TTTCAATTGAATATTGAAAATGGTATAATGATgccgggtacggtggctcatgcctgtaat
-ggtagcactttgggaggccaaggtgggtgcatcacttgaggtcaggagttcgagactagc
-ctggccaacatggtgaaactctacctctactaaaaataccaaaaaaatagccggaaattg
-cttgaacctgagaggcagaggttgcaatgagctgagatcatgccactgcacttcagcctg
-ggcaagagagcaagactccatcttaaataaataaataaataaatgaaAATGGTATAGtgg
-cttgaagatgcaggggcccatgaggaagaacatggatggcccctagaagctgaaagcagc
-ccccaggtggcagccagcaaggaagtggggtcttcaattctacacgtgcaaggaactgaa
-ttctatcaacaacctgaatgagcttggaagctgattcttccccagaagccgcagataaga
-gctcagccTGCTAGGGGCTTGAGAAAGGGGAAAGTGACTTTAAAAATGTAACTCGAGGGA
-GTTCCAAAAGGCTAAGCGATTCGGTGAATCTAATAAACATGTTAAAATGCATAAAGTTCG
-GGTGTGGGGGAAAGGGAAGGGAGAGCATTAGGACAAATAGgttcttttctgagttctggc
-caggaggcttcttgatcagttcaaattgttacaaagttcagctggaggtttccttctccc
-tgtggccgctctgggcctctggcagccctcctcaaggagcaatccgtttccttcagaggg
-tctgtgggttctcctggcttccctaatgcgttcctgcagtccttctgaagcaaaacttaa
-tgatgcgagcctccacacgctgctctgaccgtccgagtgggagctgcaatctagtcctgc
-ctcccgtctgtcatgatcccTGGTGGTTTTTGACTACagctcaattgttttagattccat
-gtgtaagtgagaacatgaagtatttgtctttctgtgtttgactcatttcacctagcagaa
-tgtGTaataaacattaacaaaatgaatgtgtaaaatcaggtagtgatcacagctacaaag
-aaaataaaacagagtgatagatggaaagtgatggggaggaagaacctggttagaaatggt
-ggtcaggcaggacctctctaagaagggaaaagagctgtgactgcacgataagccggccac
-gtgaagaccttgaggacaacatgcaaagctgatgacccaccggccctgcaaagaccgggc
-gggagataagcttggctggcgcgaagaaagaaggctggagggagtagaaatggggacagg
-agctgaacgctgggagagggggctcaaagCCAGCTCGCGTAGGCAGGGACTGGGCACTCG
-CAATGCGCGCAGAACAAAGGCCTCTCTCTCTCTTTCGCCACACTAAGGGCCAACATGGTC
-ATCTCCAGGTGCGGATTCTGCCGTAAAATGCGCCCCTGGCGACTCACGACCAGGACGCAT
-TCCGCACCGCTCCCCCACGCCCCGCAGCCCGCCCTCGAGGCTGATTGATTTGTGCCAGTC
-TCTACCGCCATCTGCCGGCAGCACTCGGTACACCCGCGCCCTGGAGGTCGCACGCGCTGG
-CCAAACGGGCGCACCAGACACTTTTcagggccctgccaaagacctcccaatgtctactgg
-cgtcccagacacaagagatccaggccaagactcacacttcacaagatacacagacacggg
-ccttagggaacaggaaattccatgaaacttccatttacccaattagccggactcactgag
-ccccagaatagggttttcaaccaactcctactaaaattAAAAAGTAATGTGTGGtataga
-ttggaataatagacattggaggctacaaacgatgggaggcggagaggggtgagggttgaa
-aaattacctattgggtgcaacattcactatccgggtaatggggcactagaagcccactcc
-accactatgcaatatatgtatttgtaccccgtaaatctataaaaataaaaaCTACATTAA
-AAATAATAATAATGTCTGGTCATCTAAATAGTACCTCTACAGCTTATTAAGTGCTCTGGA
-GACGTCCCAGTTGCCTGTCCTTCCCATTAAAGGTGATATCCAGTGCTGATTTCCCCTTCA
-ACCTCGGGTTCCCATAAACCTCTTCTTTCTCACTCCTGCTGCCCTCCGGTACTCCAATAA
-AGAATGATAGATGggccgggagcagtggctcacgcctgtaatcccagcactttgggaggc
-caaggcggatggatcacctgaggtcaggagttggagaccagcctggtcaacatggtgaaa
-ccccgtttctactaaaatacaaaaattagctgggcatggtggcgggcctcagtaatccca
-gctactcaggaggctgaggcaggagaatcgcttgaacccgggggcagaagttgcagtgag
-cagagattgtgccactgcactccaacctgggcgacagagcaagactccgtctcaaaaaag
-aaaaaaagaaaagaaaCAGTCCCAGTATGCATCCATGTGCATGTGCATGCAGGTGTATCT
-GCCTGTGAGAGCTGCGCACGCGGCTCTGAGTACCTGGGAAGACACCCATGTACAGATGCT
-GTACATGTGCGGGGTCACTCTCTGGCGCATTCGGAGGCATGAGGGCTACGTGCAATGCGA
-GGGAACCTATGTCCAGGCTTCCTTTCTTGGTTTTCCTCCTCTGAACTCATGCATCCCTTC
-ACAAACagtccagctcctggctaaaaacctatgtgtgatttttcagcccaaacacaggca
-atgacaggttttacctggcaggcctcacagctgagtcgtgcacagctgatgcgttgcagt
-ctttaaagacagttgcagacacagactcaggcctcctggacagtcgacctctcacacaca
-tctccgctcccaacccaagtcttcattcagacacgtcttcattgcagtggggtaggcctt
-cggccaggacctccttatcttggggagtggagaatccttgaagacactttcctccatgct
-gactcagaagttttcccactctcccttccccaccccatccctggcccccaggtccgtaca
-acttcaggagcctttttgttggaagcttttctgcagtgagaccaaccccacacctgtgct
-catccacccgaccccagttggcatcattctatgaggaaattagaacaggtggatctgtgt
-tctacaaaataaaacaaaccaggttctctggtttagcctctttcttgtactgtaataata
-agagatttggggcttggctattacttgctttgactttttttgttttgagacagggtttcg
-ctctgtcacccaggctggagtgcagtggtgcgatctcggctcactgcaacctccgcctcc
-tgggctcaagcaatcctcccacctcagtctccctagtagctaggactacaggtgcacacc
-atcatgcccagctaatttttatattttttatagagatggggtttcaccatgttgtccagt
-ctggtctcaaattcctgagatcaagcaacccactggcctcagcctcccaaagtgtgagga
-ttacaggcctgagccaccatgccgggccatcattaatcagctactccagcacttagcagt
-tcagctctctcctgctcagctgagctcctgaTTGTACAGTGGTTAAGAGCAAActgcctc
-tgccacttagtaacctggtgacttgaaaaatcactttgccttttcatcctttggtttctt
-catctgtaaaatgaaaataacaataaacaatacctacttcacagggtggttgttgtgagg
-gtgtagtgagttgatgtatgtaaagcATAACGTAGGTTCCATTGAAGTGTTTGCTATTGT
-GTTCAACAGGGTCCATTTCTGCTTGGAGATCCACATGGCTCTGGGGAGTACCTGTTGGCT
-CAGCCTAGGTCACGTGTTCCACCTTAACCatcccttccctgctccaaggtagagcccgtg
-acctgaactaaaccagcaggcacgctccacctccaacaccggctcaaggtgggcgtgtaa
-tataagctggttcaattagaatgaatcttttttttttttttttaaagacggagtctcatc
-ccccatcacccagactggagagcagtggcacaatctcagctcactgcaacctctgcctcc
-caggttcaagcaattatcctgcttcagcctcctgagtagctgggattacaggtgcctgct
-gccacgcccagctcatttttgtatttttagtagacacagggtgttgccatgttggccagg
-atggtctcgaactcctgacctcaagtgatccacccacctcggcctcccaaagtgctagga
-ttacaggcgtgaaccactgtgcccagcccaattacagtgaatcttaatacactggctgaa
-aattctgggacacagccagtctctctctttccaacaggacatgtacaaggacctgtacaa
-ccctgggagatgctggcatattggggccacaagcagtgctgacctgaagaaaagggcaac
-acctcagaaaacaaagtagataaatagaaaccaagtccttggtgccatcacttgatttct
-ggacaaagcctcacctaagctatttattgacctgagcccttcatagtttaggccaatGTG
-ATTTGGTTGTTTTGTTACCTGTAACCAAGTATCTTAACACAAAGTGGATCTGTGAGTGAC
-CAGAGCCTCTTGGGGGTTGTAGCAATCTAGTAgttggcccagaaaggccaactctgagat
-ggagtgtagggtgcagaatgttgagtaatgagtgctcttggaatcaacaactgaggaaga
-cagaaatatgcaggattgggcacagggagaagttcagctgcagtgcaggcccaagggtag
-ttgcagctgagccttcaggaagttctggagccagagtagcccttctgagttgttccaagC
-ACTGAAGGCCTAGCAAGTTCCAGGGGTATTAAAATCAATAAGCCTGTCAGCCCCGACAAT
-GCCCTCAATAGGTCTGGGCACAGATTGGAGAGAAGCTGGGCTCCCACTGCACCAGGAGGG
-AGTGGCCCAGAGCCACTGAGCCATGGAGACTCAGGCAGGGGGTTGCTCCAGCACTTCTTC
-TGGAGAAGTTTTGAGCCCCAGATGCAGTTAGCACAGTTGCCCGCCCCTTATCATAAGACG
-AAGTCCGTTCCCACCACATCTTCTGCAAGACCTAGCTGGGGACCCCGAGACACTGGCAAA
-AAAGCAAATGTAAATCCAGCTTTATTGGTAAAAAAGGAATAGCAGATTTAATCAGAAATT
-CCCACCTGGCCCAGCAGCACCAACCAGAAAGAAGGGAAGAAGAGAGGAAAAAACCACAgg
-aagaaagaaaggagggagggagggagaggaggaaggaaggaggagggaagggaagggggg
-aagaagggagggagggagggagggaaagaaagagggaggaagggCAGAGGGAGCAGGGAG
-ACTGTAGATCAGGGTCTGAATGGAGATCCGGTCCTGGAAGTAAATGATCCAAGGCTCCAG
-GTGCTGGGAAGAGAGCAGGAGGGGAGGGCGGCCCATGGCACTGCCATCTAGAAGGGTAGT
-GGCTCTTCCACAGGAATGTTGAGGATGACATCCATGTCTGGGGTGCACCTGGTGGGAGGC
-AGCACAGAAGGCCATGAGAGACCAGAGGTGGCGGTGTGGGAGCACCCACTCAGAGGAGCC
-CTGCTCTTTAGAACTCTGGTACGTACTTGGGTTGGGGGGCAATCCCAAAATACAATCTGT
-GATCTATCTGTGACCTCAAAGCCCAACTGTGcatacacaagcatacacacacacacacac
-acacacacacacacacacacatacacacacaTCAAAAATGGAAAAGAAATGAGTTTGGCA
-GGACAAATGTTCCCCTGACAAGTCTGAGGTCAAGAGGGAGCAGGAACTCAGCTCTGAAAT
-GCTGAGGGCCCTCAAGATgatcactggctttggagtgaggatgacaggtttgataacttt
-gacctgtgtcaccttgagcaagctatttctactctcccagcctcactccttcagttgGCA
-CTTAAGTGAAAAGCACTCATTAAGTCCCAGACCCCAAGtgagcctcagtttcctcatctg
-tcaaatgggtttaatattctaacctcagtcattggtggaaagattaaatgagaccatgcc
-agcaggtaataagtgctcagtaaatgacaggcaTTATTATTTCCATGAAAGTAGCAAGAG
-AGATGGATTCCCATCAGCAATATATTCCCCATTGCAGGGACCAGCACAAATATTTAAGAG
-GCTGAAGGATTACATTCTGTTTCACTCTCTTTTCTCTCTTCCAAGGAGACCATCCTCTCT
-CATGGTTTCAATAATCTGCTGATACACATGAAGTATTTAGGCAGGAAATGTCAGGATACT
-TGCAATTTACAAATACTATTAAAAAAATGAACatgaaaccaacatagaaaaaaaaaaaat
-ttctaaatctagatgggcaaaactggctattcattatatcattctctcttctttatattt
-gaaatttttcataataatagtaaaaaaaaaaaGTTcatctctatgctggcaacacctaaa
-tttctacttccagccaatatctgtcctctgaggtctacactcatcttgtcaattgcccac
-ccaatgactccaccttggcacctcatataaatcaaacttactgtccaagtcaactgtatg
-gtttttgttttgttttgttttgtttgagacatggtctcactcggtcacccaggctggaat
-gcagtggtgcaatcacagctcactgcagcctggaactcctcaatcgatcctcctgcctcc
-caaatagctgggaccacaggcacgtgccaccacatctggctaattttttaattttttgta
-gagatggaggtctcactatgttgtccccctggtctcgaactcccagcctcaagcgatcct
-tcttcctcatcctcctaaagcactgggattacaggtgtgagccaccatgcctgcctccaa
-ataaactttttgactgtgcctacatacacatccctcaccccgccccagccttcccaatct
-ctgcatttgacatcaccaccaccccattataaaagtcaggaacccaggggttattcttga
-tacctccctttcctgtacttcccaagtcatgcaagtccttcttactttcctaaatatttc
-tccaatctatctatttctcccatttcttctgccacactcttggccaggccacttcccatg
-ttcccctggacaactgccctcacacccactagaattccagctgccattctggctccttgc
-caatctcatccccatgctcttttcttttcttttaagaaagagtcttgctctattaagcag
-gctggaaggcagtagcaccatcttggctcactacaacctctgtctctagggctcaagcaa
-tcctcctgccttagccttcactgcagctgggactacaggcgcacgccaccacgcctggct
-aacttttgtattttttgtagagatggggtttcaccatgttgcccaagctggtcttgaact
-cctgggctcaagcaatcctcccaccttggcctcccaaaacgctgagattacaggcatgag
-ccaccacacccagcccaccatgctcttttcaaactgacttttttggaatacaaatctgat
-catgtggcttaagatcctttgcttctgggatcaggcagaacatctgggcctacagggcac
-tgcatggaggtccctaggggctgagttgccctgctcccttcccgccactctccctgtcac
-tctgcattccaaccactctggcctcactcagctccgtgtcaatgccaagttccttccaac
-catagctccttcacaGCTCAAGGCTCAACATGTGGTtggttcatagagcagtaacataag
-catcaccgggtagcttcttagaaatgcagaatcAggctgggcatggtggttcacacctgt
-aatcccagcactttgggaggccaaggcaggcagatcacttgaggtcaggagtttgagacc
-agcctggccaacatggcaaaaccccgtttctactaaaaaacataaaaattagccaggcat
-ggtggtgcacacctgtaatcccagctactcgggaggctgagacaagagaatcacttgaac
-ccaggaggcggaggttgcagtgagctgagatggtgccagtgcactccagcctgggagaca
-gagctagactctgtctcaagaagaaggaaggaagaaaggaaggaagggagggagggaggg
-agggagggagggagggaggggaaagaaagaaagaaggaagaaagaaaaagaaagaaaaga
-gaaagacagagagagaaagaaagaaagaaaaagaaaagagagaaaggaaggaatgaagga
-aggaaagaaagaaaagaaaagaaaaaagaaatgtagattcatgagccccactgagaccta
-ctgacttggaatctgctttttaacgcgatctccaggtgtttcctgggcatgttccagttg
-gagaggcTCTGCTTAACAGTGTGCCATTTCTACTTTTTAGGAGGGAAAATGTGCTTCCTT
-GCTCCTGGTGTTCCCTTCCACGTGGAAGGGCATCCATGAGTGTATTGCTCCTGGCCTCTC
-TCTGCCCCCTTAAATTCTGCTTTTGGAAAGGGGGTATGACCACCAGAATGGTGAGTGTGA
-GGAGAGGAAGGGGACACAGGGAGCCCAGTCCCTTTCTCTCTCAGCAGCAAGAAACCCGAA
-AGGACTCCACTCTTCTCTGCCCCAAGGCCTGGCTCCACGTGGGTCCAGCTCCACCATGAT
-CGGGTGGTTCAATTTGCCTAATTCTGGGTTCACTATTCAGAGGCCAACACAGTCTCTAAA
-ATCAGCTTTACCAGAATAAAGGTGATAACCTGGCCCACATGCACCTTACCCCTTTCAGTC
-TCATTCACTGTGTTCAGAGTTCAGGTAAAGACAAGTGACTATTTATTACGTCCCCCGGAG
-ACCCTGGCAccaccgcctagaattgctcttccttcagctcccccatcagtctctttcacc
-tagtgaatttctatgcatccttcaagcctcagttcaaatgtcacatcctcaggaaaacct
-tccttgactgcccagacTTGCTGTCCTAACAGTTGCtttcttttttcttttttttttaat
-taaaaaaaaatttttttttagatggagtctcgctctgtcacccagactggaatgcagtgg
-cacaatctcggctgaccgcaacctccgccttccaggttcaagcaattctctgcctcagcc
-tcccgagtagctgggattacaggcacccgccaccatgcccagctagtttttgtattttta
-gtagagacagggtttcatcatcttggccaggctggtcttgaactcctgacctcgtgatcc
-accggccttggcctcccaaattgctgggattacaggcgtgagccactgcacccagctCCT
-AAGAGTCACTTTTGCAGTGGCATGTACTCTACTCAGCAGCTCTGGGCTCTGCTGCAACTC
-CACATTTATTTGTGGCTCATTATCGACTCATGTCCAGTTCCCTCTTTAGTTCCATGAGGG
-CGGGACCAAGGACTGTTCTCATTCACATGGTGCCTGGCATTCAGAGGCACTTCATAAATC
-CAATAGTATTTTGTTTTGGGGGCGGGGGGCGGTTTagaaatagaagaaaaggaagaaatg
-gcgataggagaggagaaggaaggaaaacgacaggagggagagacagatgaagaagaaaaa
-TTAAAGAATTTGCAAATGCTAGGCTCTGCCACACATGGTCCTGTGGTGTCATCAAGGAGA
-GGTAAGCCTGGGGGACCCCCAACCCAACCGCAGAGGGCTTGCCCCAAGGAAGGGCAGGCA
-AAGAATTGGTTTCTGGGGCCCAGAAACCTGCCAAGTGAACAGGACAGACTTCTCTCCTTG
-TAGAGTGTCTTCCAGGCTATTCTTCCCTGAAGCCAACCACCCCACTCAACTCTGCCTTCC
-TCAAAAACCCAGAAGTGGAAGGCTGTACCCACTTGGTTGACAcatgggatctgggaacta
-gaagggcccttagagattacaccacccagcctgctgtgtacagatgggaattggaggcct
-ttgcagagatgggaaaggtcacatctgcccctggtcagtggcagatccaaggtggaaacc
-caggaccgcccctccctccctgtacagggttctgccatccacACCAGGCTGCCTTCCCCA
-AGAACAGAGAGCCTCCGTGAGCTCAGAGTGTGACTGGTTTAAGAGGCAGTGGCAAAAAGA
-TCACATACTTGGGTCTCCGAAGCAGAACATCCTCAAATATGACCTCTCGGGGTTCCCGGG
-TCTGGGCTTGGAGCTCTTCCACCTCGGCCCTTAATACAGGCATGTTCTCCTCAAACTGGT
-CAATAATCTGAGAGGAAAGGCACAGCAGGGGAGAAGGGAGAGGCAAATGGCCCCCAACCA
-AAGGGAGAAAGGCCAAAATGAACGAGGAGCAAAGCTATCTGGGGAAATGGTATGGGTTCT
-GTCACTGGGACTTGCTGGACTCCAGGGAGGGGACTTCCCCATGCAAGGTGCGGCTGGCTT
-CCAAGTTAGTGACAATATTCAGTGGTGCTGAAACAGGTGAGGGATCATGGAGAATGGAGA
-CAGGTTACAAAGTGGCGGGGAATGCTCAATCATGGGAATGAATGGAGGCTGGCAGAGATA
-GTGAAGGGCATACACATTAAAAACCAGTGAAGAGGCAAGATAATGAAAATTAATTCAAGA
-AGGCAGTGATGGTGAAGTTCATTAACACTGATAATGGGTGGTGGGCAGTAACAAGAATCA
-AGGGGTAAAGATGCACGGTGGTTAATGGCTGAATAGGTGATGTTTGGTGATGGTTGTAAA
-TGGGTCATTAGCCAGCATTGCTGGCTAATGAGGCAAGGCCTAGGTCAGTGCCAATCGCCT
-TCCCAGATGAAAGACAAGTGACAGTAATGGCACCGGCAAGGAGGGAGGCCAACACCAGAG
-TCAGAGACCTCCTGAGCGCCAGATCAGGAGAAGCCTGACTCATTCCCACAGGCCGTGGGG
-ACTGCCCATCCACTGCTTCCCTACAGGGACCACCACCTTCCTTGCCCACGCACTTCTCTG
-AACCTTTGCATGCATTTCAGGAAGTCCTGGCTTTCCCACATCTTCTGTAGGAGAGCCTCT
-TCATAGGGACGCTGGGTTTCCTGTGGAGGAAGAAGAGGTCTGGCCCCCAGGTGCCTCTTC
-CTGGGCAGCAGAACATGGTAGAGACCGATGGGGCTGCAGTGGGCCTGGAGGCAGAGGATG
-GGGAAGAGGGCGGGGTGGGGGTGAGACCTGGATCCCCGCTCCCACACAGCAACTGGCTAC
-TCACCGCCACCACAGAACTCAGAATTTTTTTCTTCTTCTTCTGAATCTTGTCAGACAAGG
-ATTCCAGGACCTTTCTGCGCATCTCACCGAGGTCATCCAGCTCATCCTGGGAGCCAGCAG
-AAGGGTGTTGGTCACCAGTCCTGCCTCCCACACAGTCTGGTGGGAGAGGGGCAGGGGCTC
-CCCTACCTGCTGGCTGTCCTTAACCTGCTGCAGCTGGCGCATAAGAGTGGAGATCTGGAC
-AGACTTGATGGAATACTCATGGTCCATGTAAGTGCTCAGGAAGTTCACTTCCTCCTGGGT
-CTTCTCAATCTTGGCATTCAGCTGCTCTGCCTGCTGCTCAAGATCTGGGGAGGGGTTAGG
-GAGGTCAGCAGGGACAGGAGGCAAGACCTTCCCTCAAGCACCTGGGCCCCAGGAGGCCCA
-GGAGGCAAGGTCTCCTTGGCCAGTAACTGGGGTCTGGGCTGAGGTGAGCTCACACAGGGC
-TGGGAGGTGGTTAAAAGTTAAGGCTCTAGACGGTTTTCCACCCCTGCAGGAGAAGAGGCA
-ATgctgggtaggaaaaaggaagggaattggtgcatgatccctagactagtccccactctg
-ccactgacttgccgggtggctctcgccaagactgtccctctccagacttcagtctcctca
-GAGACACACTCAAGGAAGTGAGACCAGGCAGATGGGGTGACAGTGGCTCCCAAGACACAA
-CCCATGGCAGGATTAAGACAAAGTCTATCCTGTCTTCCTCCAGAGAGACCCCCAATGTCT
-GGGGTTGACTGATCCACCACCCCTCTGCTCAGCAGGTGTGTAGTCTGCTCAGGGAAAAGG
-AACCACAGGCCAGGCAGGAtggaagccaggagacccaggttctagcccagccactgactc
-ccagaaggaccttggCAGGAAACAgagccaggctaggattggattctggctcctagctat
-ataaccttccacaagctactgcacctctcttagcctcggtttcctcatctgtaaaatggg
-aggacagcttccctgcctccaagtagttgcaatgactgagtgtgtgcctgtaaCAATGCA
-GACATTGGTAGAGACCCAGATACGGGGCCTGGAAAGAGCTAAGTGTTGGGTAACTATGCT
-ATTCGCTCTGTATCTTAGCATTCCCATCTGCCAAGAAGAGAGCCAATGGGGCTGAGGGTT
-TCTGAATGGCAAGTACAAGGTGAATGCTCTGCTGCTGACCTCCCCAAGGTGCCAGGGGGG
-AGGGTCAAGGAATTTGCCAGGGATTCTTACAGCTCATCTTGCATTTCTTCTTTTCTTCCC
-ACTCCTGAAGCTCAGATTTCAATTGCTGCAGCCTCTTCTTGTTTGAGTACTCCAAGATGT
-CGATGATGGTCTGCGGGAGGGGTGGAGTCAACTCACCCACAGGCTCTGCTGGCTCTCAGA
-GGCGGCCACCCAGCACTTCCTCAGAGGAGTCCCCAGTCCCAACCTCACTCCCAGAAACCT
-GACCAGAGGCTaatcgggacagtaacagtgtccacccatagggttgttgtaaggactata
-taaagacatacagatcgcttGCTATTACACGTAGAGGTGTTTGCAAATGCTGTTGGTGGT
-AGCAGCGACCTCTGTCGCACCGGTACAGTATGTGCCCGGTGAACCCCCTCTGGGACGGGT
-GCTATGGTGCCGCATTTCACAGAGCTCGGGGAGGCAAAGTTAACTAAAAGTCTCCCGGCC
-AGTGAGTGCTGGCGCGCTGGGATGAAACCCATCTCGGTCCTCTTGCAAAGCCCAGGTGAG
-GGGAGTGAAGGGTGAAGAAATGCGTCTTCCAGGTGGAGGAAGCACCACGTGCAGTGGGCG
-GGGAAAGGCAGGAGAGGGCGCGCGAGTGCGcggagggagggcgggacggagggagggagg
-gcgggacggagggagggagggagggacggagggcgggacggcgggagggcgggacggagg
-gacggagggagggcgggacggagggcgggagggcgggacggagggagggagggagggagg
-gacggagggcgggacggagggacggagggagggagggagggacggaggttgggacggagg
-gacggagggCGGGCGGATGCCGCGGGTCTCACCGCCAGGGTGTCCTGCTGCTGCAGCAGG
-GCCCGCACGTGCAGGGTCGTGCTGTTCTCCATCTCCTGGATGGTCTCGATCAGCTCCCGG
-TTGAGCTTGCTGAGGAAGTTCTCACGGCTTCGGAGCTCTCGCAGAGCGGCCCTCCCGCTC
-CTGAGCGAGGTCTGCGGGCGGAGGGAAGAGCAGAGAGGCGGCGCTGCGCCCTGCCCGGCC
-TGAGCCCCCGAAAGCCCGTGGAcccgccgccccggccccgccagacgcccgcccccgTGC
-GGCCTCCTGCTGGTAAACGCGGCCCAAGCTGGGCGGTTCCCCATTGTCTGCGCCGCCCGG
-GAGCTCCGGGACtctcatccgttcggaaacgcacgtgtacccatcatctcacatccctga
-ggtgcgggtgcatctacagttggtggcgtgtcaccaactaatcaacaaatatattattag
-tgggtaaataaagatgtgccttcatatcaatggcttctcagaatcaatgaaatatagAAA
-TAATAGTAAGggccgggcggggtggctcacgtctataatcccagcactttgggaggccaa
-ggtgggccgatcacgaggtcaagagttcgagaccagcctgaccaacatggtgaaaccccg
-tctccactaaaaatacaaaaattagccgagcgtggtggcgcgtgcctgtaatgccagcta
-ctggggaggctgaggcaggagaatcgcttgaacctgggaggcggaggttgcagtgagcga
-gatggcgccactgctctccagcctgggcgacagaggaagattccTGTCCCaataataata
-ataataataaACGCCCCAGGTAGGTTAAGAAGGTGGCAGAGCGACCGCCATGTCTGGAGG
-AGAAGCAGGGGAGGCAAAATGGATGATAAACGTCAGCATTTCCGGGCAGGCCGCGGAGTC
-AATGAGTACTCTCATTTCACACAACAGCCCCCAGTGGAACAAGgagggtctgagggttaa
-gtgactcgcctaaggttacacccagcaggtgcataaaaccTACAGTAACAACAACAACAA
-CAATTGTACTTCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAATAACA
-ACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAAT
-AACAACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTaa
-caataacaacaacaattgctgagggccctctacatgccaggccaggtgctgtgccttgct
-ctgcaggtggcacatggtatctgttcaccctccaacagctttatgtttactaactctatt
-ttgctgataaatggaggctcagagagtttaatgacttgcccagtgtcacacagtcaagaa
-gtggcagggctggaactggaaagccagacttctgaatcccaatgtctgtctttccgttat
-gctaAAACAAGAACTGAGTAGCCTTAAAACTGCAAGGCATGGCTGAACCAcgtagtgact
-aagacttggatgttgaacctagacacaccttggttcaaatcccagctcagccacttacca
-tctaagagaatctgggcaagttagttaatgtctcagagcctccttatactcattctaaag
-gtaaggaaactagtatctgttttagagaactgccgtaaaatataaatgagATTggacagg
-tgcggtgactcacgcctgtaatcccaacactttgcgaggcccagatgggaggatcactca
-aggccaggagttcaagaccagcctgggcaacatagtgagacctcatttctacaaaaagta
-aacaaaattcgctgggtgtggtggtgtacacctacagtcctagctactcaggagtctgag
-gtgggaggaatgtttgagcccagaagatcgaggctgcagtaagtcaagattatgccacca
-cactccagcccgggtaacacagcaagaacttgtctctaaaagtaaataaataaataaata
-aataCAATTTTaaaaaattaaaatgttcgctgggcatggtggtgtgcacctatagtccta
-gctacttgggaggctgaggcaggaggatctcttgagcccaggagtttacggctgcagtga
-gctatgattatgccatttcactttagcctgggtgacagagcaagaccctgtctttaaaTT
-CACAATCAAGCCACTTAGTGAGAGTGCACTCATGTGCACTCAGTGAACAATAGCTGATAC
-TACTGTCTCTGGCTCTAACCCTCTACCCCTGCCATAAATATTTGCTCTTTCATTTGTTCC
-TGTACTTCCTCATTTCTCCGTCCTTTACTAAAAACGACCCCTTCCTAGCCCTCAGCTCCT
-TTATTTCTCATATaacagtaatcatgctgatgtgctgagtgcttgccatgtggctgatac
-tgtactaagcacttcatgcgcactgcagcacatcaccctcacagcaagactaagagatgg
-gcactattattaggccaactttataaaagtggacagcagtcgggcacagtggttcacacc
-tgtaatcccagcactttggaagagcaaggtggaaggactacttgagcccaggagttagag
-ccctgggcaacaaagggagatcccatctctacgaaaattagctgggcatgatagtgcatg
-tctatagtcccaactactccgagaggctgaggtgggaggatcacctgggctcggaaggtc
-caggctgcagtgagccatgatcatgccactgcgctccagcctggatgacacagcgagacc
-ctgtctcaatcagtcaatgtggacagcaaggattaaattcagtaacttattcaaggtcac
-acatagcagagctgTCATCCTTGAAGTCTTGCCTCCTAGCCACTCCACTACCTTGTCTCC
-ACATCTCCAGACCAAAATACCCAGAAGTATCTTGTGAAAAATGTTATTCTCCAAGTCCTG
-GGCCCACTGAAACAGCAGCACTAGggtttcagttcaaatgtcacccaccttagcagcctc
-tcgttagcacctaaacaattactgccacactctcctccgtgcctccagccccctaacctt
-attcttaggcttctctttagctcttatcatcatttcaaatatctttctcttgttgattgt
-cagtctcccccatccaatagaatggaagtcccctaagatcagaggtcacattactggtga
-accctcatactcagaatagaacctggcacatggtaggtgctcaatcaatatttgttgatt
-cattaaatgaatGAAAGATTGCAAGAGACAGTATTAAGAACTGGACtggttaggagcaca
-agttttagagccaaattgtccacgttcAGCTTCTACATCAATCAAAAACACCTAAACCCC
-TCTAAAGTTAGGATAAAAATAACAGAAATggctggaagcggtggctcacacctataatcc
-cagcactttgggaggccaaggcgggcagatcacctaaggtcaggagttggagaccagcct
-ggccaatatggtgaaaccccatctctactaacaatacaaaaaattagctgggcgtggtgg
-tgggcgcctgtaatcccaggtactcaggaggctgaggcaggagactcactcaaacctggg
-aggtggaggttgcagtgacctgagatcttgccactgcactccagcctgggtgacggagtg
-aaactctgtctcaaaaaaaaaTTTTTTTAAAAACTAAGAGAAATATGAGTTCCTCCTTTA
-AGAATACTGGGCTACCTCTAAACCATTTTGCAAGATAAAAGGTTAAAGGGGAAAAAAAGG
-TTTCAAAGCAAATTATATTTTCCCTTGTTCTTTATATAGTAGTCATTGTTCATTGAGCTA
-TTAAAAATTTTCTTGAAGAATTATTCTATAGTATTTTGTAGTCTTTATAATACTTAGTAT
-TTTACTTTCTGCTATGTATGCTAAGGACTTGTCTTCCTTTAGGCATTTCAAATACTTTGA
-GACATTGTTCAGATAATTACAGAAGCCATAAAACAATGTATAGCGAGGAAATTAATTACC
-TACAATTGTAGCGATTGATGTGAAAATTTTCATTGTCAGTTTCTAAGGCTTGCTTCAAAG
-TACACTGTAAGAAAATTTAATTTACTGGAAttttttttttttgagatgaagtctcactct
-gtctcccaggctggagtgcagtggcaccatctcagctcactgcaacctctgcctcccagg
-ttcaagccggtctcctgcctcagcctcccgagtagctgggactacaggtgcgtgctacca
-cacccagctaatttttgtagtttgagtagaaacggggtttcaccacgttggccaggctgg
-tctcgaactcctgacgtcaaatgatccacccacctagacctcccaaagtgctgggattat
-aggcatgagccaccacacccggccAAGTTGCTGCAAATTTTAAGATAAATAAGCCACTAG
-ATCGTGTTCCTAATGCAACAAAATAACAAGCAATTCTGATTATTTCTTGAGTCTTAAACA
-GAACAGCAAACGCTTTGTTTAActggctttgacccctgatcctgccatttcctggctgtg
-tgacctggtgcatgtcatttatctccctgcgcctcagtttcccggtttgtaaaataggaa
-caaggataagcgtgctcacacagttcctgtgaggaagaaatgagtcaagtctggcaccca
-caaagttctcagcacatgtttgctacaGCCATCATCCCCGTCCCTGTCCTGGGCCCAGTG
-TCCAGGGAAGATGTGCCTCATACCTTCATTAACCAGATTTTGGCATGCATCTTCCCAGGG
-TCCAACTTCCGCCTTCTATGTAGTTCTCTTGGATTCTTCGGCTGGCAGCTTGTCACCACC
-GTAGTGGGCTTGAAGTGAAACACTAGGGGTAGACAGGAAAGGACAGGGAGAGAGTGAGGG
-TCCCGGAAGGCCTGAGGCCAGGTTCCCGGGAGTGCACCATTAATGAGAGGAGGGCCAGAC
-CCCAGCTCCACCCTCTGACTGCCTTATAATGTGACACTAGACCGAGGGTGAAATTCACAC
-CCTTCACTAAGCTCCCAGGACAGACTCTGGGCCTCAATATGAGGGAGGGACAAGCCCAGG
-TGAAAGCAGTAACTATGGACATGGACAGAGGGGAGGGCAGGGCAGCCAGGAACCCCGCTC
-TCAAATGTCCAGTCAGAAAGAGAGTCGGGAACTCCCACTCCTTGTGTCTTTCCAGTAGCT
-ACTgcagcacaggacagcagaaagaccagagtctggcaggcctgaatccaaatccctgct
-gtcccaccaacctggctgGCAGAAGGCCTGatggggtaggggttaagagcaagaactaat
-gagccagacagtccaagtttaaatccaggctctTggccaggcatggcggctcacgcctgt
-aatctcaacactttgggaggccaaggcgggcggatcacctgtggtcaacagttcaagatc
-agcctggccaacatggtgaaaccctgtctctattaaaaatacaaaaaatgagatggacat
-gatgatgggcgcctgtaatcccagctacttgggaggctgaggcaagagaatcgtttgaac
-tcgggaggcggaggttgcagtggtgcgagatcccgccactgcactccagcctgggtgaca
-gagactctatctcaaaaaatatatataatcataaaaataaatttttaaaaattccaggtt
-ctgccttctactagctgcgtgaccttgagcaagtcaaatgacctctgtgtccctccattc
-gtccacctataaaatgggaataatcatcacgcccacctcatagagtcttcctgaagatga
-aagaagttactataccttaaaggtgtttggaatagtgcctgatgcatattcagtgctgga
-tacacattaccagttgttactCTTACTTCTAGTGACCTGAGAAGTGGGACCACAACACCA
-GACGAAGGCACAGCAGCCACGCAAAACTCCAACTGGCTGTCTCTGAAACACTCTAAGGGC
-TGTGGTTCTGCCAGATAAGAGTACAGGCATTTGGGGGGCATATTCTCAGAATCCCTGTTT
-CCTCTCTGCCTGTCGTGCAATGACATGGGACAAATCGCCCAGGTGGATCCAGCTGTACTC
-TCAGTCCTCACCAAAATCCCTGCTTCAGGTACAACCCAGCTCATCTGGGAGAGATACTAA
-TCTCTTTAATAGATCAATGTCCTTCATCCTGAGAAATGCTGGCATTAACTATGGAGATGA
-TTAAGTAAATTAATTTTGTGTTTAATTTATAAATTACCTGTATATATCCGGTTTTTAGTT
-GTATTGTATAAGAGATAGAATGATTAATAGGTTAATCTTGTGATTCTAATTTTAAAAGTG
-TAAGTGGGATTTTGATTTAGATTTAAGTTGAAAGGTTTAATACACTCTTATTAGCTCCgt
-tgcccaggctggtgttcaatggcgagatctcggctcactgctacttctgcctcccagatt
-caagcaattctcctgcctcagcctcctgaatagctgggataacaggtgcccgccaccaca
-cccagctaattttttaatttttagtagagatgcggttttgccatgttggccaggctggtc
-ctgacctcaggggatccacctgcctcagcctcccaaagtgctgggattacaggtgtgagc
-caccgcgcccggccAGATTACCCATATTTAGAAGTTTAAGTATTAGATATACAAGAATTA
-TGTAAATACCCAATGGTTTTTGTTAATCAGACAAGTGAACCATTTGAAAATGAAAATGAA
-TACGTTAAAATTTAAGATGTGGCTTAAAAGGTTTAGGAGAATTTAATTAACCAAGTTCCA
-AAACCCCCTTACAAGTGTTTATAAAAATTGTAAGATTCTTAAGTTGAATTTAAATGCTTA
-AGGAAGATTTGCAGTTTTAATAATGAGGATTTATTTTCATTATTGGTAGTAGCCCTAATT
-TATCtttttttaaattaaatcttttattacaagatagttcagattcacaagcagttttaa
-gaaataatacggagGggctggccgtggtggctcacgcctgtaatcccagcactttgggag
-gctgaggcatgtggatcacctgaggttaggagttcaagatcagcctggcgaacatggtga
-aaccccatctctactaaaaatacaaaatttagccaggtgtggtggtgcacgcctgtaatc
-ccagctacttgggaggctgaggcaggggaatcgcttgaacccgggagttggaggttacag
-tgagctgagatcacaccactgtactccagcctgggtaagagagacagagagagagagaga
-ctctgtctgaaaaaaaggaaaggaaaggagaggagaggagaggggaggggaagggagggg
-agaggaAAAGGAAAAGAAAAAGAAAAAGAaaaagaaaggaaagaaaaggaaacagaggta
-gtctatgtaccctttacccagtttctcccagtggcaacatcctgcaaaagtacggtacaa
-tatcacaaccaggatattgacattaagatgagcaagatataggactttcccataaccaca
-aggatcctgcctgtcgccttctacaaccacacccacttccctccccttaccaccctcctc
-acaactctgtccctaacccctgcaatcactaatctgctctccatttctataattttgtga
-tccccagaaggttatataaatggaatcatccagtatgtaactgtggggattggctttttt
-ttacttggcataattctctggagattcatccaagttgttgaatatatcaatagttctttc
-ctgtttatcgctgtatagttttccacggtggggatacaccataggttgtttaaacattca
-cccactgagggacttcaaggttgtttccagttttgaggaattatgaacgaggctgctatg
-aacattcacatactggcttttgtgtgaatataagttttcatttctctggaataaatgccc
-aagagtaaaactgctgggtcggattactaggaagtgcatgtttcatgttgttagaaatgg
-ccacacttgtttccagagaggctgcatcattttaccttcccaccagcaattgcgcacaat
-ctgacgtctcctctttgctagcatttggtgttatcactatttttttattttagccatttc
-gataggtgtgcagtgatatctcactgtggcttaatttgcattgccccaatggctaatgat
-gttgaacatctttttaatgtgcttatctgacatctgtatatctgctttggtgaaatgtct
-cttcatgtctttttcccattgcctaactgaattgtctgtttcactgttgagtttttactg
-ttactgatatattctacatagtagtcctttgtcagatacatggtttgcaaatattttctc
-caagtctatagcttgtcttttcatcctcctaaaaaggtctttcataaggccaggtgcagt
-ggctctcacctataatcccagcactttgggaggctgaggcgggcagattacttgaggtca
-caagttcgagaccagcctgtctctactaaaaatacaaaaattagccaggcatggtggcac
-acgccttcagtcccagctactcgggaggctaaggcaggagaatcgcttgaacccgggaga
-cagagtttgcagtgagctgagatcgcaccactgcaccctggcctgagcaacaaagcgaga
-ctccttctcaaaaaaaaaaaaaaaaaaaaaagtctttcacagaacaaaatttttaatttt
-gatgcagtccaattcatctatttttcttttatgggtcaagcttttggtgtgatacctaag
-aactcttcacttggccctaggccccaaagatttttctctcctgttttcttctaaaagttt
-ttcagtttcacattttacatttaatttctattttattttatctttgagctaatttttata
-ttcgttgttaaatcatttctttctttttctttttctttttttttttttttttttttttgc
-ctatgggtgtccaattgctccagcgccacccatggaaaaggctttcttcctccactgaat
-tgtttttccactttctgaaaaacccattgggaatattggtatggatttattccCTTTTCC
-TCACTGGGAAGTGTTGGCAGTGTCCAGCAGGTAGCTGATCCTTCATTCCCTGCTTGGTGG
-TGCTGATTccccaactgggatagtgctggcagggatgagtggggaggtcatcttctaacc
-cccacctggcagaagacagtgctctgactctctctctagggtagtgtcaacagagtctag
-cagtgacaagatttcatgaagtgtcatgaggtgggactcatcacctctgggcttcactcc
-cctcccccagcctacctatgtcagtagagcctggtgggagcctgagcctctatccccacc
-cagcatcagtgaggtAAAATAAGGTAGTGAGATGCAGGGCAACTTGGCATTCTACTCTCC
-CATCTCCTTTCTGTGTTTCAGTGTTGCCCACAGGGGAGCTGATCTAACATTACTTACTCA
-GAGGCAATGAGGTGGTATGAGTGATTTTATACATAGAtgtatacataagtatgctagatt
-gtctatgaagttcatttcaggataccaaagaaatattacaaaatatttgttattaattct
-cacaacaatcctaggtggtattagtgtccccatttcacaaatgagaaaaccaaggctcag
-agagatgaatgatttttccaagtgagtaaatggcagagccaaaatctgaccccatgtctg
-cctgagcctgacccaaggccTCGGAACTCCCCTGTAAAGCATGATAATGAtgtggcagag
-tttattctacgatttcaccaaaccttgttttcttttcctcctggaaaaacagatggacta
-catttcccaccttcccttgtggttagcagaggtcatgtggctaaattatggcccctgaaa
-catgagtaggagtaacatttgtcacttcaaatctggaccccccccaaaaaaaatgcccac
-ataattgtccatgttcttgttctctctcttccctctatgccagctggatgcaaaagtatc
-cagcagaagacttcaagaccttacaaaatatcagacccacaaggtcaaaggaacctggat
-ccctgaatgaccatgtggaacagaatccctccttcctcagatccacaaatgtactgtggc
-ataaatgagatataaacttctatatcaatacttgcaatttgggcattgtttattacatca
-gttagcctaccctaaTATAAGTGGTGTCACCAAGAGCCAAAAGCAGCCACTCTATCCTGT
-CTCCAACCCCCACACCAGCTCCCAGGTGCCTCCGCCCACCTGGTTGGACCCTAGTCAAAG
-TCTTCATTTTGCTTGTATGAAGGCTGTTGGCTTGTTGGACTGGAGGCAGAGTAGATGGCT
-TGGTTTCCTGCTTGGACTGCTGCCATGGAACATAATCCTACAAAATATACAATCagtcac
-atagcaccatgagtttatatcccagctctacccttttcagatatctgtgaccccaagcaa
-gtgacttgacctctcctgagcctcaatcttctcatctgtaaagtggatctaataataaaa
-cctacttctgtggattggcgcaagaattctgagagatatttatgaagcatgtggtaagtg
-ctccataaatgttagctatcactTTTTTAAATCAGCCAGCCAGAATTTACTAAGCACATC
-CAGGCTGTGAGGTGCTAAGAACTGTGAGAAACAGAAGGCATGGAAAAGACGCAGACATCC
-ACCCTCAGGAAACCAGAGCAGCAATCAGATGAATAAGAGAGCAGCATAATATACCCTTAC
-ATTCTGATAAGACAGTGagaggagaaaaatgaggttctgaggcttgctctgggtcccaca
-gcaaagtgtgacccggctgggactggaattcgggtctccagcctATATCCGCGGAGCAGT
-CACGACCGTGAGAGTGGAGAGCAGGTGGACTGCAGGGCCAGCGAGCCTCCCACCCCAGCC
-CTAGTCCCCCAAGACTCACCGGAACCTGGAACTCCTGGACTATGGAGTGAGTCCCAGAGT
-GCTTGGGTCTGGAAAGAGTTGGGAAGGGAAAGAACTTCCATTATCCCCAGCCCAAGGGGC
-AGCAAGCAGCAATTCGAAACAGGATTGGAGTCTCGAACCAGAAACTGCAGTTTACCGGGG
-ACAATAGCCCCGCGGGAGTGGGGCGGGGCCAAGGAGATGTGGGCGGGGAGAGGACGGGGG
-TCAGAAGACCGAGGGCGACCTCGAGGCGAGGGCGGGACAGCGGCGGGGTGTGAAGTACGC
-ATGCGTATTCCGCCTTTCTTCCAAtttttttttttttttttttttACCTACTTTTGTAAG
-ACATGCGCCATTGGGGAAAATGGAAGAGAAGTTGCGAGTCTGTGAGACCCTGATCTTCTG
-GTATAACTACTCGGCTTTTCCAACTTCCTTGTCTCAGTGTAGATCGCGCGGTAACCCAGG
-CCACTCAGAAGTCCCGAGACCCGATGCTTTCGCCAGCGTCTCGGTCTCCAAGGAAACGCG
-ACGCCGCCTACCGAGCGCCTAAAGGGACTAACCTCTCAAGGCAAAATCTAGTTCGGCCCG
-CTTTTCAATTTTCAAAttcccttcagtttgctctgcccataatcctaaaatatgatatca
-tatttctccactctcatcaaacttccaccatttccttcgccatcttcactcttggctaat
-gagtttgcttccaattttactaagaaaattgtgggaatcagtaaacccacaagttcatgg
-catcatttactcgcctacttgcctccctcccgtaactacgtataaactgcctactaagac
-caattcctacatttatgcaccgaatcctatcctctcacgttttctcaaagatattggccg
-agcagttctccccgttttttcctcctcttttctctctcctttgtatcatcagtataccaa
-cgtatttttaaatttcttctatttaaaaagattgtccacagccggacacggtggctcatg
-catataagcatgagagcactttgggaggccagaggtgggaagatcgcttgagccagaaag
-gtccagtctgcagtgagccacgatccagccactgcattccagcctggttgacagagcaag
-accctatctctaaataaataaacaaaccacttcccctccagccagctcccatttctgctt
-cattttaaagcaaaactcctagagaggtttgcctactctgtttcccatttttttccctcc
-tctcaatcaggctttcactccccactgaaactgccctcgtcaacatcattggtgacctcc
-actttgctaaaccccatggtcacttctaggtcctccctttatttggcctgtctgcagcat
-ttgacacaacagatcactccctcccctgaaacactttcttaacttagtatccaggaaacc
-actcttgagttgcttcctgcctccttttcagtctcctttgctggttcctcctcttctccc
-tttatcattgtagtatcccaggactcagtcccagccccctcccttccagtctcatggttt
-tgaataccatccgtacccagatgcctctcagactcacgtctccatcctccccctgaattc
-cagccatgtacatccaactgcctgcttgggccccttataagcaactctaatgtgcaatat
-ttttccagaaacatttttcccgaacttaaaatagggcatctctcttcttggaatcatcct
-taactcatctcttatcccacatccatcagcagatcctgttgcaataacttcaacgtatat
-ctggaataggaccacACATACACACACACACACCCCTCTTTCCTTTTGTACCCCAACTAA
-AGTACTAGTTCCCACCCTTGCCCTACACCAATTCTCTCTCTACACACCAGATTTGCTAGA
-TAGAGCACGGATTTAAAAGAGAATTCCAGTTTAAAAGATAATTGGGCGGGAGCAATAATT
-TTAAATCACTTAAACTTCAATAGGGGAACATTGCTATAGAATACCATGTCAGAGCTCCCA
-ACCTTTTCTGCCTCTTAAAAATCACAGGAGAATGTGTTTAAATGCACTGTGGTAAATAGA
-AGCAGCTGCTAGGATAAAAAGCAATTAGCCCAGGTACTCTGGCTATTCAGGCCCCTCCTG
-GCTGACCCTAGAGCTGAGGGAATCACTGTGTTGGGTACCCTCATTTGCAGAGCACACCAT
-ATGACAGCACTCTTGCTGGGCAACTCTGTACCAGGAAACCATTAAAAAGTAAAAGATAAA
-ggccgggcacggtggctcacgcctgtaatctcagcactttgggaggccgaggcagatgga
-tcacctgaggtcagaagttcgagaccagcctggccaacatgatgaaaccccatctctact
-aaaaatacaaaataggattagccaggcgtggtggcgggtgcctgtaatcccagctacttg
-ggaggctgaggcaggagaattacttgaagcagggaggctgatgttgcagtgagccaagat
-cacgccactgcactccaacctggacaacaataatgaaactccatctcaaaaaaaaaaaaa
-agtaaaaGATAGGAATACAtgacagatccaggtagtgacttactcaacagccattcctcc
-ccatcatcgcaactattggatcctgatcttgtccatgtatgcacttgccttaatggaggc
-aggccccaggtccagccctagtcctagtcccagctccaatagtcatgactgtctgaggct
-ggacttggtgagccaatttccctttccagttagaggtctagtcatagatacatgatgaaa
-gtctggctaagaagacaggatgagaaatctactcaaaggcttttgggaaaggttttcatc
-acacttttaaaaaaaggcattgcagaaaaacattccttcatctgctggtagacattgtca
-tatctgtgtgggattcctggaatcgcggaactgtgaggggagttggccaaagaggatata
-cagtgaatggtagagaggaaaatgtaaaaaccttcttccttgatagcactgttgagccat
-taaattaaccaaccctagcctggcacaatagtatgtgcctgtaataccagctacttggga
-agctgacgcaggagcatcgcttgaggccaggcatttgagatcagtctgggcaacatagtg
-agaccacatctcagaaaaaaaaaattttgttttaattagccagatgtgatgatgtgcacc
-tgtagtctcagctacttgggaggctgtggtgggaggattgcttgagcccatgagtttgag
-actgcagtgagctatgattgtgccactgcacgccagtctgggcaacagagtaagattctg
-tctctaaaagaaattaattaattaaattaacctttcacctatctagaaaatacttgagat
-taaataagaaatcacattactgggtgagcaaatttgagttgagttttctggtacttgcag
-accaaaagcattttactgaACCCTACGTCtggaggaacaacaagatagaaggaacctggg
-tgggtccctgacaaccttgcaggagaaagtcacctacctgtccttactgcctgccaaatt
-ccgagctgcttcatcaaagagaaataaacctccaccttgtctgagaccctgtatttgaga
-gtccctttgttacagtagcttaacctgtaccttgattaatacaAAGAAGAGCTTGGCCAC
-TGTCAGACAGCCTTCCTCATCAGACATGCTGACCCAGCATGGACACCCACTGAGAGCTGC
-CTGTGCCCCACATCTCAGGTACTTAACCAGTAATATTACTGCCTCCCACTTCAAtttttt
-tttgtttttgagacagagtttcgctcttgttgcccagactggagtgcaatggcatgatct
-tggctcaccacaacctctgcctcccgggttcaagtgattctcctgcctcagcctctcgag
-tagctgggactacaggcatgcgccaccacaaccggctaattttgtatttttagttgagac
-ggggtttctctatgttgctcaagctggtctcgaactcctaacttcaggtgacccgcccgc
-cttggcctcccaaagtgctgggattacaggtgtgagccaccgcacctggccCCACTTCAA
-ATTTTTAAAAAAAATACATAAAAACATTTGCAAAAATGCTGCCATCTTAATCAAAGCCAA
-AACACACTTGAGGGGCCACTGACAATCACCTGTAACAAAGCTGTTGGAACTGGGATTGAA
-TCAGATGGGGTCCATTTGCACTTACACCTGTTCAGGTGGCATTTCTGTGTTCACGAACAC
-CTGATGGAACTTCCTGCCCCCAGGATAGGTGGGCAAGATGAGCTGGCCTTTCCTCCCTGC
-ACATGTGAGGTGATAAATGTGATAGAGGGCCTCTCAGGCCTGCTTGGCTCCAGGCTCAGC
-AATGGCAACCTGGGCTCTGATTCCATCAACATCTTGCTGAGAGGTGGACTAGGCTGAGCA
-GGCAGTCTCGGGCTTCCATCCATGTCATTTGATGTGCTGGCTTTGTGGCAAATGTGCACA
-GCATCCTAAACCCACAATCCCTACTGTTGTCACTGGGTAAGATGCCGTGGTTCTTGTGGA
-GACACCTGCTATACTCGACATAACAAGATCCTAGACATTCCTTCTTATCATCTGCACAGC
-CCTCCAGAGCTGCTCTCTCCATACGGCCTCAGTGCCCATCCGGACTGCTCTCCTTGCAGG
-GTACCTGCCTGGCCCCTGTAGCTCCTGATGTAATAATCTCTGCAAAATTTGACCTGGAAA
-AAATGAAACTGACCAAAAGGATGGCCCTACACATACCAATGAAATTGTACAACAGAAGAA
-GATATGATTAGCAAAATTGGACATGGAGCCAGAACCTAATCCACAAGTCAAATATTTTCA
-AAATACAGACAGATGCCTTTAAAGTCCAACACAAAACAAAAATGCTCAAAATACGTTGat
-tatatgagagttcctgactagtgcagtaagacaagaaaaagtataagatttgaaaaaaga
-gacaaaaccttcattattcacagacgatatgattggcaatacagaaaagtaaagagattc
-caaaaaccactggaaattttttaaggtttcaactttgttgccagatatggggtcagtaca
-caaaattcaatcgtgtttcctctaacggacaccaacaaaccatatgtaacttctgattta
-caataatttcacttacaatagcagtcaaaccacgtggtactttggaataaatccccaaaa
-gtatgtaagacctttatgaagaaaactataatattttattgaaattcataaaataaggcc
-taaataagtgagaaatcaagtggggtcattgatggaaagactccgtgttataaagtggta
-attctgtacaaatgcagtgcaacgccaattaagatctcatagtttcctggaacttagtag
-gcaggttgtgaaatttatatggaggttccaaatatagctgagaccatcttaaagaagacg
-aaAGAGAGAGAAGAATGtttcccataaaagaagaaactggagttcagatttctctttgga
-aactgaaagatccccccacagtggaccctcacttctggagaggaatattcagctacagtt
-gactagcagttgccccttcagatagaatattcgatctccagttcacccagtatatcttct
-acttaaggcacctgcctgacccttgcagatatttgattatgtgaTAGTTACCTGGAGTGA
-GGGCTTAAGATAAGAGGAATGGAAGAGATTGTTTAAAATACATCTATTGTTTGGTTGTGT
-AAGTATTCTCCTCATGGTGAAACTTGACCAGGCAAGTAGAAAGAATAACAGAGAAGTATG
-TGAATCTAagacattgatgtttctggtaatggtgaagttccgagtatgatcacgggaatg
-cgtggctgagaagggataaaggaaatggtgcctgaggatataaagtgagaggactggaaa
-gTGCAAACGGCCCAAGTCAGTGGCTCCCCTGAGACCAATACCAGCAGTTGGGATGAAGGG
-AATCTGCCTGTTAACAAGGTTTCCTAGGATCTGATGCACAGTTCTTGATCCACGGCGTCA
-GAAATAAAGTGGTTAAATAAATATAAGCTACCggccgggcgcggtggctcacgcctgtaa
-ccccagcactttgggaggccgaggcgggcgatcacgaggtcaggagatcgagaccatcct
-ggctaacacggtgaaatcccgtctctactaaaaatacaaaaaattagccaggcgtggtgg
-cgggcgcctgtagtcccagctactcaggaggccgaggcaggagaatggcgtgaacccggg
-aggcggagcctgcagtgagccgagattgagccactgcactccagcctgggcgacagacca
-agagtccgtctcaaaaaagaaagaaagaaagaaaTATAAGCTACCTATACGTGGGGCTGC
-CTATTAACTCCGCcaagtgacttaactcctgcctctttatctgtaaaatgggcataatta
-cagcattgtttttggaagattccatgtaataaagtctgaagtgtgcttaacacagtactg
-ggaacttaagcagcactcaCACTTCATCCTAAATACGACGAAAGTCTTTTCAAAAAAATA
-AAAATTAATGCAATATGACTTACTTGGAAATGTATCAAAAAATAAAGACCGATGAATGGA
-TCGAGGCGTAGTGTGACAGAGTAAAATTTTAATGATAAAAAGTTAATGGTAAAATGTTCA
-CTGTAAAACTTTCAACTTTTCTTCTTGAAAACGTGCATAATCCGACGTGGGAAAAAAAAT
-AACGCATTGCAGTCAGTTCTGGGGAAACGGAAAGCTAAGTTTTAATTTTGCTATTGCTTT
-TGCTTTTTTAACAGAAAAGGTACAAAAAAGAAAAAATGGGAGAGATGTTGCCGAACTCCG
-TCCCGCCTGTGGGCTGTGGGCCGTTAGCAAAGCTGCTAGCATGAAATCGTCGAGCACCGC
-TTGCGAAACGCCAAATCCTCGAGAGCGAGGCCGGAGGCTGCCAAACCCGCGCTGGGGAAA
-GGGCCGCCTCCGGGCGCCCCATCCCGCTGCGGACGGAGGTGAGGTTGGAGCGAGCGCTGG
-CGGAAGAGAGGCTCAGCGCAGGGGGCGCAGAGCCGGCGCTGGCCAATATGCGCCGCATGT
-GATACCTTTGAGGGCGCGGCGGGGGAGGGTAGCGTCAAATTTCAAAAAAAAAAAAAAACC
-AAACCCACACAgccccggcgggcgggcgcgcgcgATGGGCGCCCTTTGGCTGCGGGAGCG
-AGTGGAGGATGCTGGGAAGGAGGTAAAATGGCCACCGGCGGCGGCGCGGAGGAAGAGAGG
-AAACGGGGGCGGCCGCAGCTTCTgccccccgcgcggcccgcggcccggggcgAGGAGGCC
-GACGGCGGCCGCGAGAAGATGGGCTGGGCCCAGGTGGTGAAGAATCTAGCCGAGAAGAAG
-GGCGAATTCCGCGAGCCGCGGCCGCCGCGGCGGGAGGAGGAAAGCGGCGGCGGTGGAGGG
-AgcgccgggctcggcggccccgcgggcctggcggcgccggACCTCGGCGACTTCCCACCG
-GCTGGCCGCGGGGATCCGAAGGGCCGTCGGAGAGATCCGGCCGGCGAGGCGGTGGACCCC
-CGCAAAAAGAAGGGCGCTGCGGAGGCGGGCAGGAGGAAGAAGGCCGAGGCGGCGGCGGCC
-GCCATGGCGACCCCGGCCAGGCCCGGCGAGGCCGAGGACGCGGCCGAGCGGCCCCTCCAG
-GATGAgccggcggcggcggcggcaggcccgggcAAGGGTCGCTTCCTCGTCCGCATCTGT
-TTCCAGGGAGACGAGGGCGCCTGCCCGACCCGGGACTTCGTGGTAGGAGCGCTTATCCTG
-CGCTCCATCGGCATGGACCCGAGCGACATCTACGCGGTCATCCAGATCCCGGGCAGCCGC
-GAATTCGACGTGAGCTTCCGCTCAGCGGAGAAGCTGGCCCTGTTCCTACGCGTCTACGAG
-GAGAAGCGGGAGCAGGAGGACTGCTGGGAGAACTTTGTGGTGCTGGGGCGGAGCAAGTCC
-AGCTTGAAGACGCTCTTCATCCTCTTCCGGAACGAGACGGTGGACGTGGAGGACATTGTG
-ACTTGGCTCAAGCGCCACTGCGACGTGCTGGCCGTGCCGGTGAAAGTGACCGACAGGTTT
-GGGATCTGGACCGGGGAGTACAAATGCGAGATCGAGCTGCGCCAGGGGGAGGGCGGGGTC
-AGGCACTTGCCAGGGGCCTTCTTCCTGGGGGCCGAGAGGGGCTACAGCTGGTACAAGGGG
-CAGCCCAAGACATGCTTTAAATGTGGTTCCCGGACCCACATGAGCGGCAGCTGCACGCAG
-GACAGGTGCTTCAGGTGCGGGGAGGAGGGGCACCTGAGCCCTTACTGCCGGAAGGGCATC
-GTGTGCAACCTCTGTGGCAAGCGAGGACACGCCTTTGCCCAGTGTCCCAAAGCAGTGCAC
-AATTCCGTGGCAGCTCAGCTAACCGGCGTGGCCGGGCACTAAACACCCGCCTGCCTGCCA
-GGGTGAACACACAGCCAGCTTATCCCTCTTAAGTGCCAAAACTTTTTTTTAAACCATTTT
-TTATCGTTTTTGAAGGAGATCTTTTTAAAACCTACAAGAGACATCTCTCTATGCCTTCTT
-AAACCGAGTTTACTCCATTTCAGCCTGTTCTGAATTGGTGACTCTGTCACCAATAACGAC
-TGCGGAGAACTGTAGCGTGCAGATGTGTTGCCCCTCCCTTTTAAAATTTTATTTTCGTTT
-TTCTATTGGGTATTTGTTTTGTTTCTTGTACTTTTTCTCTCTCTCCTTGCCCCCCTCCCG
-CCCTCCCCGCCCCATACCTTTTCTTCCCCTGGATTTTCACCCTTTGGGctgccttgctca
-tctttatgccccagcactaggtacggggcccaacacgtggtaggcactccatcagtgttt
-gctgaatTGAAAACATTGTTGACTGTGGCTTCTATCAGAGTGTCTACCTTTTGCAGCTCT
-TCCCCTCCCTCATTTAATTTGCTGCTTTTAATCTACGTGGTCTGAGAATTTGTGAAACCA
-GTGTTGTTAGAAGTGTATATAATCTGAATCAATAAGCTCTGAATGGTGGCCAAGGGCCTC
-TCTTATGGCACAAAGATGCATGGACTTCATGACAGCTCTTTTGGTGGCTCAGAAGCCATT
-TTTTATAgaatcatggaatctagaatattcctgctggaaagaacctgagagttggtttgg
-accaattccctggttttccagcagatgaaacaggcccaaagaggttaaatgactgggtga
-aaatcacatagctgtctggtgccagagccagcctatagtagagtcccctgaccccaagcc
-cggtgctcattccactACCTCTCACACTTCACAACAATTTCCTCAACACTTGAGGGCCCA
-GAAAGTCTGATCTCTCCAGAATGATCAGCCCAGAGGAATGCTGAGAAATCACCTGGAGGA
-GGGAGCAGAAAGAGAAGGTTTTTAAGGAGGGGCTTCTGAATACTTGGGAGATACGGAACG
-GACCAAGGACCACACTCCAGGGTGCATTCGTTGCTCCCTGGGGCACCACTTCTGGATTAC
-AGTGTGCCAGGTCCTTTGGAGGCCCTACCCCTTCCCCATTCATTGCCACCAGTGAGAAAT
-GGGGGTGCCCCTGTGTAAAGAAACCTACCAAAGGTTTACATTTGCACCTTAGCCTCAATA
-GCTACGAACCCTAGAGAAGCAGCTAGCTGGAGCTCATGTGCAACTCCTGATTCTCAGGAG
-AAAGATGGATTTTAACCCAAAATTATGAGTGAGCTGTTAACTCTAAAATGTACTTGGGAG
-ATAGGCCAAGCGAGAGGTCATGGGCCAACTAAGTGTTATCCAGTAGAAAAGACAGTACAC
-TGCTTTTCTTTTAGTGTTTGCTTTTCCTTTGCTATATGTTTTGCTATTTCCTTGTGGCTT
-AGAATGTAAAATTGATTGTTAAAAGTTTTGTTCTGAATAAATATTTATCTTTTGTATTGC
-TAAAACTGGTGCACTATTTCCTTTCAAAGTGTTAGATGCACAGTTACCCAGCTCCAGACC
-GTATTTCAATCCCACTTCCCCTACACTCCATTTGTTTACCTTGCTAAATACATTTCCCAC
-CCCTGCAGGCAACACTTAGCACCTACTACGTTGTGCCGGTCCCTTTGCATCACAATCAGC
-ACACTGTTAAAACGGGTTTTaagtcctaacacagttccaataaatcagaatcactgttag
-aggaagtgaaacattttagttaatcatcctcaagcaattctgatgggcagccaggtttga
-gaCCAGAGTATAAGATGTGTGAGCTGAAccctgccctcagggagattacagacctgtggg
-aaagagagGTGGTTTGCCAGCTTCCTCGTCTTTCTGTTACTGTAAGCGCGCGCTGTGGAT
-GGGATGCAAAATATTCTTGGGTTCTGGGAAAATGCCATTTCTTCCAGCTGTTGAAAAAGC
-GGGATCCAGGGAGCTGACTTCTCCAAGTTAGCCCCCACTGGAGACTGGGCCTGCAGGCAG
-AATAGGGTCAAGGTCCCTGGACTTCAGGTCCAATACCCTGCAGACCCCAGATACAACTCT
-CTGAAGGATTTTCCAGCTGGTGATGCTAGGATGATCTGATCCTGAGAGTTAAACGTTCCC
-AGTATATTGACTCTGACTCAGTGATTTGAGGATATTTCCAGAGCTGATCTGGAGTTGGGA
-CCTGGTAGGCTCTTGGGAATCCTGTCTTTCAGAGCCAGTTCAACCCCTCTCCTTGTCTCC
-CAAAGCAAGCAGACTCTCCCCTCCCTCCCATCCCTCTTTCCCGTCTTTGCCAGCGGTTTC
-CCTCCCTCTCACAGAGCTGGAGGCCAGGGGCCAGGAGAAAGCCTGCATTCACCATACTCT
-CCACTCCGTTCCTCAAAGCAGGCACTGTGCCAGGGAGCCTCCTTGAAGGAACCTTCCCTC
-TCCTGGCCCCATCCCCCCACTCTCCAGGAGGGAGGAGAGGAAGAAACTGTTTCCCTGCCC
-ATCCCCCACAGGATCTGCTTCAAGGCCTCCTGCCTGGTGGCCCAGGGACAGCCAGGGGCT
-GGAGCTGAACAAACCTCCCCCAGCTTCCTTTCCTGATCAAGCAGCCCTCAAATTACAATT
-CTTCACTGTTTTTGGGCTCCTGGAAAGTGTGCAGAGATGCCCGGACTGAGGCTGGTTGAC
-TAGGGGACATTGattcattccacttcaacaaatacggagggcattagagctgggccccat
-gcaaggccctctgcataggctgccttgaacaagacagTGCACTTGCAATGGAAGGTACAG
-ATAAGTAACAGTAGGCAATGTTTACAATCATATATTTAACAAtttttttttgagacagag
-tctcactctgttgcccaggctggagtgcagtggcatgatcttggctcactgcaacctcca
-cctcccggattcaagcgattcatgtgcctgagccttccaagtagctgggattacaggcac
-gtgccaccacgcccggctaatttttgtatttttagtggagatggggtttcagcatgttgg
-ccaggctggtctcgaactcctgacctcaggtgatccacctgcctcagcctctgaaagtgc
-tgggattacaggcgtgagacaccgcacccagccAACATTTGTCCTGTatagaattgtctg
-aagtaaaggtttccctagaagagaaaacgtcctgactgaaacctgcaagatgagtaagaa
-ccaggctaagagtgaagagacagccaagcagcagaaatagcagatgtagaggcctggagg
-ccagagagcacacagcgtgttcggactggccaagagtcaggggaagatgtggctgggaga
-aaacgccgagaagagGTGTCACAGGGCTTACCAGCCATATTTAAAAACGTGGATTTTGTC
-CTCAGAGCCTCCAATCAGGCCTCCTCCATTCCattcattctttcaacacatgcctgttaa
-gcgccaactctataggggccttttctaagcgatggaacacagcatggagcaggataatca
-agtccctgaagctcagattctagagtcacacaagtacataattacagacgatgatgcact
-aaaagaaacatacagggtgagatccctgtttaacaagcaaagctgatccagtcttaagga
-tcagagaaaatgtttgaactgagatggaaaagacataaaaggagttaatcgagagatggg
-gctggggattaagggatggcaagggtattaacctaggcaagagggatagcaagtaaaaca
-accctatagtgggaggaggcatgaccacttctagagacTAAATGAATCAGTCTAAGTTTA
-GAAACAGAAACCACTCTTGCTGTTGAAGAAAATGCTGGTCCCTGGGCTGGGTATTAGGAA
-TGACTCCTAGAACACCATAGAACTGCCAGGGGAGTTACTACCTCTCACAGTCAGAAAGAC
-AGAAGCCAGGAGGCCACCACTGGAAAGGCTGAGCATGAGGACACAATGGTGAAGCTGCCA
-CCCAAAGACAGGATCCTGGGATCAGAAAGTCACTGCCAATGCCACTGGCAGGACAGTGAA
-ATGCCAAGTCCTTTCCCTGCCTCTACAAAGCCAGGGACTGTGCACTACTGTCTCCGCAAC
-CATTTACAGGTAAAAACAGCCCAAACTGTCTGGCTTACTTATGCCTCCCTTCCATCTTTT
-ATGCAAATACATCTAAGTGCTAGAGCCCTAGCTGCAAGGGAGTTGGGAGATGTTTTAGCT
-TTCCAGCATCCGCAACATAGGAAGGCACATAGAATGGGGATGGGTGCTGTCTGTCAAAAG
-ACAATATCCAGCACAAAAAATGTGACTGCAGTGCAGAGAAGAGGAGCTCGTGGGagcatc
-tggtaggccatgttaagaatgtgggtctaagaacgatgtgccattgaaggacttgcaagc
-aagagagtaacatgattagattggttatgttttacaagcatcattcaggatagttggtgg
-agactgggtcagaggagagcccaaggggaaatacagtatagttcacccaggtctctcgag
-agatgaggacatcttaggcatggaaggcggagatgtacagagagaaacagccgagtaaag
-aaatctttcagagtttaagtcaacaagatttggagctatatttgacatgggctgggagaa
-agttaagtaccaaggatgttgcccaggtttctagcttctgcagttggatggatggtgggg
-cttttccctgagatgcgaaacagaagagaaaatccaagtttagggtgaagggcttgaatt
-tgattttggatatattgagtttaaggtctccgtagaggatatctaagaggagatgtggag
-taggcggttggatacacacagatcttacattcctaggagaattctggccctgagaaataa
-acacaggagttgtacagcTgtggctttcaaactgttttaccacatcccacagtaagatat
-atattttacattgcagccatcatacatatgcatgtgtgtatttatatctaaatctgaaat
-aagcttcctcaaacaatatttgccctgtgcatgatgcaccttgacactttctattccatt
-gcttcatccttttgtcaatgcttatatgacgtgttaaactgatttcacactctcctaatg
-gTCAAGAGAGAAAGCAGAAGGAAAGATTATACCAACTAAGATTGTGCCTCAAGCAACTTT
-GACACAGTTTTCCCTGATGgaaaaggagatggtgaaaaactaataagggacagccagaaa
-gggagaaggaaaaccagaacgtgcagaaacacataaaccaagggaggacatttcaggtgg
-taggggttaacaattgtgtcaagggctgcaagaaatcaagtaaaatcagctctaagaaat
-gtcaattgAggccgggcgcggtggctcatgcctgaaatcccagcactttgggaggccgag
-gcgggcggatcatgaggtcaggagattgagaccatcctggctaacacagtgaaaccccgt
-ctctactaaaaatacaaaaaattagttgggcgtggtggcgggcgcctgtaatcccagcta
-ctcgggaggctgaggcaggagaatggcgtgaacccaggaggcggagcttgcagtgagctg
-agattgagccactgcactccagcctgggcgacagagcgagacgccgtcaaaaaaaaaaaa
-aaaaTgtcaattgagatcagaactgaagagtgccctaggattgagtagtgtggaggttat
-caataagggccttttagaggaaagtgatgggggcagaTTAAGGAGCAAATGATCTTTCTA
-AGATGTCAATCTGGCACGCTGACCATTTTATTCCCATGTCACGTCCTCTGGGACTCCCTT
-GTGCACTTGGAACCCAGCCTGGTACCCGATCCCTTTCACAAGAGGCTCCTGGACTCCTTT
-CCAACCTTACTCTCAGCCAGATTGCCCATTACATCCCTTTATGTCAACTCCAGTTACGGC
-TGACAAACAGCAACCAGAAAGAATTTTGGAGTATGGAGTGGTACAAGACCAAGCTAAGGg
-gccaggtgcaatggttcatgcctgtaatcctagcactttgggaggcctaggcaagtggat
-cgcttgaggtcaggagttcgagaccagcctggccaacatggtgaaatcctgtctctacta
-aaaatacaaaaaaaaatagccatgtatggtggcatgcacctgtagtcccagctactcagg
-aggctgaggcaggagaactgcttgaacctggTGATACAGGAAGGGAAGTGCTGGGAAGGG
-AAGGGCACAGTCCCTTTAAATGACATGGAAGGGAGAAagggcgtggtccctggctagggc
-tccaccccagcctgtgcccatggacctaggtgaggacaggcatttttgttttcctgccca
-aatgttgcatttcccaagaccaccctggccggccacgcccccatcctgtgcctataaaaa
-ccctagcaggcagacacacaggtaactggacggctagaggagcacatcagtggaggaaca
-cacaagcggctggacgtcgagaggaacgcaccgacaggcactgacaaaccagcacaccac
-aggccatcgaccaacagaactatgcagagtttggctggggcagtcggaggggagcctggg
-ccactgaacagtccaactccaggggaaaaccttctcactccatccccttctggcttcctc
-catctgctgagagatacctccactcaataaaaccttgcactaattcttcaagcccaggtg
-tgatccaattcttctggtacaccaaggcaagaacccaggatacagaaagccctctgtcct
-tgcaacaaggtagagtgtctaattgagctggttaacacaagccacctatagatggcaaaa
-ctaagagcatacggtagcataagcccattggggcttcaggagctgtaaacatccaccact
-agacactcgtggggtcggagccccacaacctgcccatctgtatgctcccctagaggtttg
-agcagcgggacactgaagaagtgagccactccccttgtcacacgccctgggacggggaca
-agggaacttttcccgtttcaGTgggaggcagaggttgcagtgagccgagattgtgccaca
-ctgcactctagcctgggcaacagagcgagactccatctctaaataaataaataaaaGGAC
-CAAGCTAAGGGTGAGGAGACGTCAGATCATGCTGAGTTGAGGGTGGGGGCGCCACAGGAG
-TGCACCAAACGTGTACAAAGGCACTGATACATACAGCCCCATTTGCTGGCTTGTCAATGT
-GACTAAGATTTGGGGTAGGACATAGTAAAAGAAAATAAACACAGATATATTATGGAAAAG
-AATGTAAACTTTGCAGAGTTTTAAATAAAATATGACtttttttttttttgaggcagggtc
-tcactttgttaaccaggctggagtgcagtggctcactgcgtggctcgctacagcctacaa
-ctcctgggctcaagcaatacttctgccccagcctcctgtgtaactgagactacaggcaca
-caccaccacacccagctaatttttTCTttctttctttttttttttttttttttttttgag
-acggagtctcactctgttgcccaggctggagtgcagtggcacaatctcggctcactgcaa
-cctctgcctcccgggttcactgtggatatatcccctcccgggatatatccatcactgtgc
-ctggcacagctgcagcctcccaagtagctgggactacaggcacccgccaccacgcccggc
-taattttttgtatttttagtagagatggggtttcaccgcattagccaggatggtctcaat
-ctcctgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgag
-ccaccactcccagcctctctctttctttctcctctttcttctctttctttcttttctttt
-tcttttcttttctttcttccttccttcctcctttccttcctttccttccctttctctctc
-tccttccttctttccttccttccttccttcttctttctttctctttcttttctttcttca
-gggtctcaatatgttggccaggctggtcttgaactcctgccctcaagtgatccttccacc
-ttggcttctcagagtggtaggattacaggtgtaagccaccacacccagcccaagaaagat
-tttattttatttttttatacagacagggtcttgctatgttgcccaggctagactcaaact
-cctggacaacatagcaatcttcctgcctcagcctcccTAGTAGCCAGGTGTGCACGGAAC
-AAATTAtatgtattaatatggaacaatctctaagacacattattaaatgaaaaaaagcaa
-gatatggtatcctacagtttacattttttaatgttggaataaatacatacataccctcag
-caccataggaaagattttaaaaaagaaaaaatatatatacatatgcttatttttgtacaa
-atatgtaacactggaaggatattaatgaaattcgtaatttgtaACTTTGGAGAACTGGAT
-ATTTGGGGTTTGGGATAAAAGGAAAGTTTATTTTCCACTGTGTATCCCTGCTTTTAAAAA
-AATATTTCATCTATTATCTCTAACAACAACAAAAACAACTTTTAACAACAAAAATAAATG
-CAAAACACAAGACTTCAACGAAATTCCTATAGACTTTAGAGAGACAGGAGTCCATCTCCT
-CTATCTTTAAAAGTAAAggccgggcttagtggctcatgcctgtaattccaacactttggg
-aagccaaggcaggaggactgcttgagcccaggagtttgaggccagctgaggcaacacagg
-gatatcctgtctctacaaaaaaaaaacaaatcgttgggtgtggtggtacatgcctgtggt
-cccagctacttgggaggctgaaacaggaggatcacttgaggttgaggctgcagtgagccg
-tgatggcaccactgcactccagcctgggccgcagagtgagaccctgtctctaaaaataaa
-ataaaataaaataaaaataaaaAATAAGAACTTTGATGGAAGAGTTTAAGAAATTCTATA
-GCAGACAACACATTGGTCTCCCTGCTTCCAGGCTCCCTCTCCTTCCAACCATGGAATCCA
-CCCCAAAACAAAACTTGATCACATTTCTCCCCCGCTTAAAGAACTTCAAAGATTTTGCGT
-CCTCCCTGGTGTTCACCAGGGCCTGCCTGACCAGCCCTGCCTCCTCTGGGCCTCCTCTCT
-TGTCGGGCCTCCCCCTCTTACCCTGGCTTGGCTTCCCcttctgctccagctggtcattcc
-tggaagcagatctcttcctcccctacccatggttaatccttacctgcctggggcactcag
-ctctaatgctgcttcctaactagagcctaccctaacatcctgtatcagaccctcttacac
-cgtccgttacctccctggcctctccttcagcagttactcgggtgcaatgatatacttatt
-tgtgccatggtttgattgatatctgcctctgcctctccactttgagctccctgagggcag
-gaaccagtctcttttggctcacggttatagcttgagcaattagcactatgcctggcacag
-agtaaagcctaataaatatttattgcatgcatgaTCTAGAATCACTTGGCTGAGGTTACA
-GATTAAGACACGTGTCTACTTGTCCTTCTTTAATATACTTAACATACCTTAGCACTCTGT
-CATTGACACATACTGAACAAGGGCTTATTCATTCATCTTTTAAAAGCTAACTCACTCTTT
-TAGTTTTCCCACCTTTGATAAGGGAGGATAGGACCTGGGAGGTCAGGCCCTCGGTTTACT
-AGCTCATCCTCCTCTATTTCTCTGAGAGCATAAAATCACTGGAAGTCAGCCAGCATGCCC
-CATGGCACTGTGAGGCACAGGGGAGAAGCACCAGGCTCCTGGATTCTGAATGCGTGGCTT
-TGAAGCCTGGCAAGAGTGGCCCCTTCCCTGAGTCCCCCACCAcccctccccttggggcga
-ggattctgcaggcatgagaagtgcccacccagagtctgtgcctatgccttctagaacacg
-ctctgatacccgataattcccttccaaaatgtcactaagttaattcacagggctctttgt
-gggcctcatccctggcttcatctcacctgagggcaaactatactgcctgatgcacatctt
-atagacctgagccttgggcctcaagatagctgtttgcaggtgacagctaggtgttgaccc
-atgcatgctagctccatcactgatgggatgagaggtagctggataagggatggatacagg
-ttccaggggacaggtctccttgggcctacacattctggcacataactccaagggtcttag
-aattctaatttgaacatggccttccaggttgttagaggatatatccatcaaggaagaaaa
-cagaacatatttcatttaacacttgctggactgttgtataatttctaactatagagacat
-atggtatatgggcctccaactctactcttgttctgagccccacaaatgCCCATTtggttc
-tgtcatttctttgcatagacaagctacataacctctctgaacttcagtttcctgagcagg
-aaaatgggtctatggtaataactacattatcagggctggtgagaaaatgaaataaaataa
-tccatgtcaagggcttgagaagaatgccCTCTGGCTGTCGTCTCCTATGACTTCCTGTAT
-GATCTCCAAACTGCTCTCTTTGCAGGGTTTCAACACGGCTGCTCCCTCCTGCCTCCTTAC
-CCACAGCCAATAACCTCCCCATTCTCTCCACCTAGTCAAATCCCACCGTCTTCAATTGTG
-ataatagctggttgattgcacgtttactacgtttcaggcattgtattaagaactttccat
-gcattaactcagttctgacaccaactcgatgaagcaggcactgtttattattccccaaac
-acaaagacacagggatctggagactggaagcactggcggctgcaagtggcagggctggcg
-gggtgtgaagccggagaggagtctttctgcagTCAGGCCTCCCAAATCCCGGGATGGAAT
-CAAGGAGCCTTTGGCTGTCCCACCCCTCCTCCTCCAAGCCCCCAAATCCAAGTCTGTTAT
-ATCCCGTCAGCTCTGCGGGCCTGCCTGTGACTTTCAGCCCAAGGGGGCGGGCACTTCGTG
-TCACGCCACGTTGTCCACATCATCGAccctccctccccttctccccttccttccttccct
-ccctctcttcctcccATTGAGTGCCAGTTCTGTGCCAAGCTTTGCTGTTCAAAATGTTAC
-GAGTGGAGAAGTCAGGGAAGGATGGAATTATAGGTGTTTCTTCTTCATACCTTTCTGTTT
-GGCTGATTTTTTTTCAAATGAGCACGCAGGCCCGGTTCCTCAAACCCACTTCCAATGTGG
-CATTGCTGGGTTGGTTTGGTCCAAGGAAAGCCCTGTCTCCTTAACTCCCAGCCCCCACGC
-CTCCTCCGCCGGCCCCCAAATCCAGGCCGCCCTGCCCCCTCCGGAAAGGGGAGTTGGGGG
-CGAGCGCCGAAATCTGAGTGGCTCTTTCAAGCCTCCGTTGCCATAGAAACCGGCCGCACA
-GGCCGATGCTGTCCATTACACCATCCTCTAGCCTCGCAGCCAATGGACTCCGAGCTCCAT
-CGCCAGAGGCCCCGCCCCCCAGCTCTGGGGAGTCCACCAATCAGCAGGTCCCGTGACTTA
-GAGCCCTGCCCTCGGCCCAGGGACACCACCAATGCGCTTCGACCCTGCCCTCCTTCTCTT
-CGGTGTAACAAGAAGACTCGatatttttttttttttttttaGGAATTCTCCAGATCAGAA
-GGAATTGGCAGTAAGGCCTCTGTCAGCTGCACCCTGAATAATCTTTGGCTGCTATTTTAT
-TTAAGGAGAGCAAAACTGTTTCAATTACGCAACAATATATACCATTCTCTACTAAAACAA
-TTTTAGGAAATGAAAATGTAGGCAATGGGATGATATAGTCTGCTCTATATGAATGTCTTT
-CATTATAGGTATTTTAATTTAACTTAAAATGATCAAGGAACTAGTCATCTTTCCTTTGTA
-TTTCAAATGCATACAAAATTAAAGATACCGAGTTTTTTGATGCAGAGTTCATGAGACATT
-GACTTAATTAGTTGGTAGGCAACTTTTACTGAACCATCTAATTCCTGGTTCAGAACATTA
-CAACTGGAGGATAAATGAATATTTCTCTTAATCCATGGAAGAAATTCTGTTTTTGAGGCG
-GGCTGCGTAAATGGCTCTGACACTCTGGAGTCTAAATAAACCAAATGTGTTTTTAAAACC
-CGTTTGCCATTACAAaaaaaaaacttcaattttttagaacacttttagatttacagaaaa
-attgtgaatataaagttcccgtctaccccagccacccaCCCTGtttctttcattattatt
-attattattgagacagggtcccgctctttcacccaggctggagtgcagtggcgcgatctc
-ggctcactgcaacctccgcctcccaggctcaggcgatcctcccacctcagcctcccaagt
-agcagagactacaggggcatgccaccaagcccagctgatttttgcatttttcatagagat
-gaagtctcgccatgttgctcaggctggtgtttctgctattaacatcacatatggtattgc
-agacgcatggtatatttgttccaattaataaaccaataatgatacattatttattaatta
-gagttcacagtttattcagatttccttcgtttttacccaacgttctttttctactccatc
-tttttctactccaggatccatccagcatgcctcatcgcactagctgtcgtgtctctctgg
-gctcctcttggctggggcggtttctcaCATAGCAACATGACatcactgttggtgctgcgt
-caggtttctctactggaaagtcagtcttcttttgccccttttcatactgtactctttgga
-aggaagtcactatgctcgggccacacttaagtgaggagttatgctctatctccttaaggt
-tggaatagctacatagattatttgggatttttctacactgaagatttgtctcatttattc
-agtaatttatttatatcagtatggattcacagataattatttaatactttaggttataat
-ccaatactatttgattttgttgctcaagttgttccagctttggcttttgggagctctttc
-ggttggctcccgtctccctttgacacacccctatttttgtggggttttctcgttgccgtc
-aagcacttccttactttctggcactacaagatgcctcaggctcatctttcgtatttcctg
-ccccagtcctcaaatcagccatttcgcaagagctttgattgtttcggagaagggtattta
-ttagaaaccaagaactgggcgctaggtgcactcattgctactagggtgtcatttattTcc
-ttcctccctccctccctccctcccttcctttttgagacagagtctcactccatcacccac
-actggagtgcaCACTCATGGCTACAGCCACGTAGCCATGGTAATGAAGCCATAACCTCAC
-GAAGCTTCCAGTTTACACAATTAGAGGGTTAATTACCAAGTTGCCCAGCACTCTGCAGTG
-TGCTgtgtaggcaatgcgggggtaaattatctgaagagaatttaaagacaataaAAactg
-cagcctagacctcctgggctcaagtgatcctccctccttagcctcctgagtagctaggac
-cacaggtgtgtgccaccacactcagctaattttaattttcaatttttttttttgtagaga
-taaggtcttgccatgttgcccagactgatacaactcccggcctcaagccatcctcctgcc
-ttggcctcccaaagtgttgggattacaggcgtgagccaccacacctggccTtggggtatc
-atttcttttaagccttctcaactgacagaacaaagaaatatatctgtatataccaatgtg
-tatatatatacacacatatctatatttccatttgtaaccatctgtatatatattaagcta
-aacatgagttcctgtttatatttaccacttgaatccagggatcatttggcttgcttcctg
-cttgcttatctctaaattcccactccaataacgggaaacctggttcccatcatccacatc
-caccatccatttacttaattgttcaagtccagtatacatgtgtaggattatcaaaattgt
-taacccatacccctgtgggaaactttatcaagtagagtacattcttctgaacactttctt
-ttgcctttagtgttccagcagactccacttgtttcttttttctttttctttttttttttt
-ttttgagacagagcctcactctgttgcccaggttggagtgctggagtgcagcggggccat
-cacagctcacagcagccttgacttcccagtcttaagtgatcctcctgcctcagcctccca
-agtagctgggactacaggcatgcgccactacacccatctaattttttaaaatttttgtag
-agatgggatctcactatgttgcctaggcttgtctccaactcctgggctccagtgatcctc
-ccgcctcagcctcccaaagtcctgggattaaaggcatgagccaccacgcctggcccactc
-atttctaaagttacttaggtcagcacgttttcctctatcctcttcatgaggtcatttcac
-acatttgtaatacggtgaagatgtttgtcatattctgcatgacattttggaattatctaa
-atgtcctaagtgatttttttaactttgcatgcattaaggttcactttttgtgctattaag
-tttaatggatatcaaccaatgcacagtcatatacccacatttcttcaccctaaaaaaccc
-cctgtgctcacttattgaaccctctccccgccaaacactggcaaccacacatccgtttac
-tgtatctatggttttgcctttttgtgccattattaaaaaaaagaaagacgcacaatattt
-ttgttgttgctcttgtcacAGCTGCCacccattgaatccttactatgtcccaggtccaga
-attacactgtcccattttgaagatgaggaaacagatgcaaatgagttgaagtactcccta
-gagactcataacaataagcaaagtttgacttcTATGATTAACTTCTGAGTCACCTCTGGG
-AATATTTGTAATATGTCTAATAGCCACACttcttttgtttgttttgatacaggggtcttg
-ctgttgcctaggctggagtacagtggctactcacaggtgcaatcatagggcactacagcc
-ttgaactcctgggctcaagcaatcctcctgcctcaacctcaaaagtggctgggactacaa
-tgtgtgccactgtgcccagcTATattagccacatttcaagtactcaatagccgctgtgca
-gtttatactattatattggTTTCTGAGttttgtttttgagactgcgtcttgctctgtcac
-caggctggagtgcaatggcacaatctcggctcactgcaacctccaccacctgggttcaag
-cgattctcctgcctcagcctcccaaatagctgagactacaggtacgtatcaccaagacca
-gctaacttttgtatttttagtagagacatggtttcaccatgttggccaggatggtctcga
-tctcttgacctcgtgatctgcccgcctcggcctcccaaagtgttgggattacaggtgtga
-gccaccgtgcctagctATATTGTTTTTTAAAAGATCTCTTATTATTTAGTGAAAAGAAAG
-GAcctgtagtctcagttactcaggaggctgaggtgggaagatcatttgagccccagagtt
-tgaggtagcagtgagctatgatgatgccactgcactccagcctgggcaacagagggagat
-gccatctcacacacatacaaaagaaaagagaCCTTGTAATGCACACACTATCATAATCTC
-TGAtttttctttttttttttttttttttgagacactgtcttgctctgttgcccaggctgg
-agtgcagtggggtgatcactgctcactgcagcctcaacctcctgggctcaagtgatcctc
-ccacctcagcctccccagtggttgggaccacaaatgtgcaccaccacaactggtaaattt
-tttatttattgtagagatgtgggtctcaatattttgcccaggctggtctcaaactcctag
-gctcaagctagcctcccaaagtgctgggattataggtatgagccactgGCTttttttgtt
-tgtttgtttgtttttgtttttgatatggagttttgctcttgttgcccaggctggagtgca
-atggcgctatcttggctcactgcaacctctgcctcccaggttcaagtaattctcctccct
-cagccttctgagtagctgggattacaggcatgcgccaacacctccagttaattttgtatt
-tttagtagagacggggtttctccatgttggtcagactggtctcaaactcctgaccgcagg
-tgatctgcctgcctcagcctccaaaagtgctgggattacaggtgcgagccactgcccctg
-gccTGACTTTTTTAAAATCAGGAAATTTAGATGAATCAAAAAAGAAATTACCTTGTCCCT
-ATTGTTCTCTTCTCATTATGAATGTCTTTGAGGACCATGCCAGTTGGCAAATAGGTATTT
-TGGAGCTAGACACAGTTAGGGTGAGTGGAGTAACACGACAGTACCTACAACAGCCACACC
-CACACCTGAGTTGGCTTCATCCTGCCTTCAGGTATCATTAAGAATAGGtattattattat
-tattattattattattattttgagaccgagtctcactctgtcgcccaggctggagtgcag
-tggcacaatctccgctcattgcaacctctgcctcccaggttcaagcgattctcctgcctc
-agccttctgggactacaggcccgtgccaccacgcccggctaattttttgtatttttagta
-gagatgggtttcatcgtgttagccaggatggtttccatctcctgacctcatgatcctcct
-gcctcagccttccaaagtgctgggattacagatgtgagccaccacacctggccATATATA
-TAtttttttctttgagacagttccactctgtcacccaggctggagtgcagtggtgtgatc
-atggctcactgcagcctggaactcccaggctcaagagatcctcctgactcagtctcccaa
-gtaactaggactataggcacacaccaccaggcccagttaatttttctatttttagagacg
-gggtctcactatgttgcccagactcgtctcgaactcctgggctcaagcaatccttccaac
-ctctacttcccaaagtgttgggattgtaggcatgagacaccacatctggcctataatgga
-atattatttggcaataaaaaggaagttctgatacatgctacaacatagatgaacctagaa
-atcatgatgctaagtgaaagaagccaggcacaaaaggccacatgttgtatgattctcttt
-acatgaactgtccagaagagacaaatccatggatacagaagcagattaatggtggcctag
-ggctggggattagagggaaggcagagcagatgggagagtgactgctaatgagtactgatg
-ctaatggtttcttttggggatgatgaaaatagtctaaaatccattgtggcaacagttaca
-caactctgtgaatgcactgaaagccactgaattgtaaactataaatgactgaatagtgtg
-gtatgtgaattacatctcaacaaagctgttTTTTTTTTTTTTTAATGTTCTGGAAGAATC
-AGGATAGACATTACCTCAGGTGAAGGAAGGCAGGAGATGGGATGGTAAAGGAATTCATTG
-GGGAAAACAGGTTATCAATGTTCCAGTTCTTGTGTCAGATTGCTGACTCCACAGATTTTT
-ATTATGTTATGTAAAAATAAATACACACAGggccaggcatggtggctcacacctgtatcc
-cagcactttgggaggctgtggtgggaaaatcgcttgagcccaggagttcaagaccagcct
-aggaaacatagtgagaacctgcctctacaaaaaaaatttttcgaaattagccagccatgg
-tggcatgcatctgtagtcctaactacttgggaggctgaggcaggaggatcacttgggccc
-agaagttccaggatgcagtgagctatgatcgcaccactgtactccagcccaggcaacaga
-gcaagaccaggtctctaaaaaaaaCCCACACAAGCATAAAGTGAGGGAATCACAGGCAAC
-AATGAGAATGTGTCGCAGATGAAGCGATTCTGTATACCTGAGACAGAGGGAGATGAACGG
-GAAACGGCAGagagtggtcaggacagtcctctctggggagcccgtttgagccgaagctag
-gatgagtagatgctccagcccatgtggggatgggggtgaaaagagttccagacaaaggag
-acagcatgaatgagggccctgaggtaggcccaagcctgttgtgtttgggggacagccagT
-TTAAATGTCTGTTCTGTTATATTGTGGAGTCTCTGTGtatgaatttttcctaaagaaata
-acagacaggccgggtgcagtggctcacgcctgtcatcccagcacttcgggaggctgaggc
-aggcagatcatgaggtcaggagatcgagaccatcctggccaacatggtgaaaccccatct
-ctattaaaaatacaggtcgggcacggtggctcacgcctgtaatcccagcactttgggagg
-ccaaggcaggcagatcacaaggtgaggagatcgagaccatcctggctaacacggtgaaaa
-cccagctctactaaaaatacaaaaaaaaaaaaattagccgggcatggtggcgggcgcctg
-tagtcccagctactcgggaggctgagacaggagaatggtgtgaacccgggaggcagagct
-tgcagtgagccgacatcaagccactgcactccagcctgggtgacaaagcgagaatccgtc
-tcaaaaaaaaataaaaattagctgggtgtggtagcgcacacttgtaatcccagctactca
-ggaggctgaggaaagagaatcgcttgaacccaggaggtggagattacagtgagccaagat
-tgcgccactgcactccagcctggcgacagagcgagactccatctctaaataaataagtgg
-ccaaaaacatacatacaaaggtgttcactgccatattgtttataatagcaaaaaggggta
-aaacaatcaaaatgtctttcaagaaggaactgattcactttgggaggccgaggtgggcag
-atcacctgaggtcaggagttcgagaccagcctgaccaacatggtgaaaccccatctctaa
-taagaacacaaaattagccaggcgtggtgatgcacgcctgtaattccagctacttggaag
-gctgaggcagcagagtcatttgaacccaggaggcagagtttgcagtaatccgagatcacg
-ccattgcactccagcccaggcaaaaagagtgaaactccgtctctaaaaaaaaaagaactg
-attaaatgaattacaatataCTCGGCAGACCTGGACGAGAACCTACGCACTACATGGAAA
-GAGAAAAGAGATGTGAAAAAAGCAGGTTACTAGAAATTACATATAGTAACATTCCACTTG
-TGTAAAAAAAACTATGTGTGCATGTGATTATAAGCATTTAAGTTTCTGGATggccaggtg
-aagtggctcatgcctgtaatcccagcactttgggaggccaaggtgggcagaccgcttaag
-cccaggaatttgagaccagctcgggcaacgtggcaaaactcagtctctataaaaaataca
-aaaaattagccctgtgtggtggtacgcgtctgtagtcccagctacctgggacactgacgt
-gggaagatcacttgagcccaagaggttgaggctgcagtgagctgtgattgcgccactgca
-ccccatcctgggtgacagggagagaccttgtcgaaaaaaaaaaaaggccgggcacggtgg
-ctcacgcttataatcccagcactttaggaggccaaggcgggcagatcacaaggtcaggag
-ttccagaccagcctggccgatatggcgaaaccccgtctctattaaaaatacaaaaattag
-tcgggcgcagtggtgggcggctgtagtcccagctacttgggaggctgaggcaggagaatc
-gcttgaacgtgggaggcagaggttgcggtgagccaggatcgcgtcactgcactccagcct
-gggcaacagagtgagactccgtcccgtctcaaaaaaaaaaaaTTCTGGAAAATTACATTA
-AAATTTAAAATTTACTCATTATAATGCCATTTTTCTAGATTACAGGAGACGTTCACTTTT
-CGCCTTATATAATTCAGTATAAggccgggcgcagtggctcatgcctgtaatcccaaaact
-ttgggaggccgaggcgggcggatcacttgaggtcaggaattcgaggccagcctgaccaac
-atggcgaaactccgtctctactaaaaatacaaaaattagccaggcgtggtggcacgcacc
-tgtagttccagctactcaggaggctgaggcaggagaatcgcttgaacctgggaggaggaa
-gttgcagtgagctgagatcacgccactgcactccagcctggtgacagagcgagactccac
-acacacacacacacacacacacacacacacacaaacacaaacacCATATATATACATATA
-TAACTTTTGTAATAATAAAAAACATACTTCTACTTAAAGAGAATATCAATAAGCCCTAAA
-GTTTTTCATAGTGAAAGCCCTTCAAAATTGCTTGACAAATAAATTCTAAGTATACTAACT
-ATGGGAAAAATGTATGCTTGCGAAGACTTTGTTAGACACATTTTCTTAAATGCTGAAGCT
-ATAATTTAAAAATGAAGATTTCAGGAGACAAAATAAAGTCAGCTGGATAAAAAATGTGCA
-GAGAGAAAAAATATACCAAAATGTTAAGAGTGAGTGTCTCggccgggcgcagtggctcat
-gcctgtaatcccggcactttgggaggctgatgcgggcggatcacggggtcaagagtttga
-gatcagccggccaacatagtgaaaccccgtctctactaaaaatacaaaaattagccgggc
-atggtgatgcatgcctgtagtcccagccacttgggaggcttagggaggagaatcacttga
-acccgggaggcagaggttgtggtgagctgagatcgtgccactgcccttcagcctgggcaa
-cagagcaggactctgtctcaaaaaaaaaaaaagaGTGGGTGTCTCTTGGCACTGAGACAA
-TGAATCCCAACAAATTCCCAACAAATGATATTTTTTCCTTAAATTTCAGAATTTTTGAAG
-TTTTACACAATGAATATTTTGTGATCTGAAAATTTTTTCTTCCCCTCCTCTTCCAATTCA
-ACAGCTGAATAATAATCTtgtgttcattgtctgctactgcttaagacattctttccagac
-ttagaggcttaacaaagcaaacagctaccatctcacagtttctgtgggtcatgaatccac
-gcagagtttagttgcatggttctggctcagggtcattcacgaggttgcagttgagatgct
-ggtcagggctgcagtcatctgaagacttgactggggctggaggatctgattccaggatgg
-atcgatcactcagatggctgttggaagtaggtctcagttccttgttggtgttggcaggag
-gcttcagtttctcaccacgtagagctttccacagggctgcttgagtgccctcgcatgaca
-gctgacttctcccagaataaatgatacaaaataagacagccaggaggaaaacatagagct
-ttctatgtccaatcttagatatcacaaaccatcacttctgccatattctattagttagag
-gcaagttcacacttaactgggaaggggaggaggaattaggctcttccttttgaaggaagg
-aacattaaagaatttgtgaaGggccgggcgcagtggctcatgcctgtaatcccagcactt
-tgggaggctgaggggggcggatcatgaggtcaggagattgagaccatcctggctaaaacg
-gtgaaaccctgtctctactaaaaaaatacaacaaaaattagcagggcgtggtggcaggcg
-cctgtagtcccagctactggggaggctgaggcaggagaatggcgtgaacccgggaggcgg
-agcttgcagtgagccgagatggcgccaccgcactccagcctgggtgacagagcaagactc
-catctcaaaaagaaaaaaaaaaaaagaaTTTGTGAACATGTTTTTGAAACACAAGAAAAT
-ttccagctgatctttccccccaaatttccctcctccaatccaactacaacacatgaaact
-ccttaatcttgctgaagcgtacctctgatcatgtcatcctgcaataaaaaaactgtccct
-ggctccccacaacccagggaactccataacttggcttctgaggaccaactaccgtattgc
-ccttcagctccagctcaacataaacgcatcgtattcctcatgtacactcccccatctctg
-gtcttggcacctatccatgccctctcaatacctcgtcccagtctccttcccatctccagt
-cccttgcacttgctgtttcctctgcctggaatgttttacatggatggttcttcgtcatct
-tgagatctaaactctcccccatctctatcatcccccgtcccagtcactcactctctcatt
-accttgttttcttttcattgtcgtttgagacagggtctcactctgtcccacaggctgggg
-tgcagtggtacgatcacagctcactgcagcctcaacttcccgggctcaaacgatcttcct
-gcctcagcctcccaagtagctaggactaaaggcacaggccatcacacctggctgttttgt
-attttttgtagagacaggcttttgccatgttgcctaggctggtcttgaacttctaggctc
-aagcatctgcccacctcagcctctcaaagcgctgggatttcagatgtgagccaccttgcc
-cagcccctccctcccttctttccatcacccagtctggggtgcagtggcaccatcatagct
-cactacagcctcaaaatctctggcttaagcgttttcccacctcagcctccccagaagctg
-agatgacaggtgcttgctaccatgcccggctaatttttgaatttttgtggaggtgggatt
-tctctatgttacccaggctggtctgaaactcctgggctcaagcgattctcccgccttggc
-atcccaaagtgcagggattacaggcgtgaaccaccacacccagcccagctttattttctt
-tatagcagtcacaactatctgaaattatcttatttgtttacctgctcttttctgttgccc
-tcacttgctccttaagaacagggacctctgtcttggtcactgctgtaacccagtagcccc
-agttccaagttcactgcctggtgcacagtaggtggccaataaattgttgaattaaATGTC
-CTCTCTTCCAGGGAGTTGTTTTAGAAAGAATCACACACTGCATAAATGTCTGTTGAGGAA
-GAAAATGAAAAAAACAAAAGTGAAGACATTATCTTCTCGGCTGAACTTCCCACACCATCT
-TCTCTGTCATTAATAAGTCCTGGTGTCTACACTGGGGAAGGCAGTCCAAGGTTCTTCCAG
-GGCCTAGGTTCAGCCAGACTTTAACCATCTCTAGCTCCTCAGAGTCCGTCAAAGGGCCTA
-AGGAATGGTAAGTATTAATAATGtttgtttatgtatttatttatttatttattttgagat
-aaagtctctgtctcccaggccggagtgcagaggtacaatcattacaacttccacctttcc
-ggctcaagcaatcctcctgcctcagcctgccaagtagctaggactacaggcaggcaccac
-cctgcccagctaatttttgtacttttttttgtagagtaagggtttcaccatgttgcccag
-gctggtcttgaactcctggccttaagtgatctgcctgcctcagcctcccaaagtgctaag
-actacagctgtgaaccactgtgcAGGGTCAAATGTTTATTAATGGATGCATGCATGGATG
-GAAGAAGGAAAGGAGGCAGGTGTGAATAATGAATGCAGCATTTTCACTGCTGAGAATAAA
-GAGTGAAATCCTGGTCCAAATCAGTTTGGCAGTGAGTAAGGTTAGGAACTATTCACATAC
-ATTGGAATAATAATAGCAGCAGCAGCTACAGGGTCAGAGACAGATCTTTGAGAGGCCATA
-AGCATTGAAAAGATTGTGGTACCTATCACACACCGTCTAAAATAAAACAAATATTTTATT
-TATGGGAAAAGTGTTAAGGTGTTGATAATTCCAAGAAAGCTTTTATTTGTCCTACAATCA
-TTACTTTGATACCTTTTCTGAAATCCTAGAGCTGTCCCCACTCTGCCCATTTTTTTTTCT
-CATTATGGTGATGTCTCTGGGTTGCTGGTGACCTGCGTAACTATTGGGAAATCTAGTTTC
-TCAAAACttttagtttttttttagacagggtctcactctgtcactcaggctggagtgcag
-cggctcactgcaacatccgcctcctaggttcaagcgattctcatacctcagtctcctgag
-tagctgggattacaggtacgcgtcaccaagcctgactcattattttgtacttttagtaga
-gacaaggtttcaccatatcggccaggcggatctcgaacttctgacctcaaatgatccgcc
-cgccttggcttcccaaagtgctgggattacaggtgtgagccaccgcgtccCGTCTATCAT
-AAGTtttattgaacattgcctaggtatcaggatgtgtttacatgcattatctcatttaat
-ctgtaaaaccaccatgtgagggagaaactgaattatccccattttcaggataaggaaaag
-gaggGACTGGGAATGTGAACTCAGGAAGTGTGACTCCATCGGGTAGACTGCTCAGGCTGC
-AGATGTAAAGGTTTTACACGTAGGCTTTTCCAGATCTCAGCTTCTGAAAGGCGGAGGGAC
-CGTTTGGACGGGAGCAGGGCCTCCTCTTCCAAGCACCCTGTGCCTTTAAGAGTCGCCCCC
-TCCCTCCAGGGATGCTCCAATTTCTTTCTCCCCACCACCCCCACCCCGCCCCCCGCGCCG
-CGGAGCCGCACCTCGGTCCTTCCTCCCCGCCCCACACCCTCAAGCTCGGCTCTTGGCCTT
-CGCTCGTCCAGAAGTGGGTGAGCTGTACCGCCAGAGGCGCATTCTCCTAGCCCCAAACCA
-TGCCCGCTACGCCCCAGCGGAATGCCACCTTAAAGACCCTAATCCGGGCACCTCCCAGCT
-CCTGCTTCCCAAGGGCGAGGCCTCAGCGCCCCCTCCCATCGCCCATGCTCACGACGCCGT
-GAAGGTGACCTCCCCCAGGGGCGGCACACGCCCAGTGGTGCCCGAACTGGCTCACACGTG
-GTGAGCCGGGAGCGCGCGGCCCCTCCCCGCCACGCGCCTCGTGCCGGCCACCCGGCCACG
-CCCCCAGGACTGGCTCCGCCCCGTGCCCCTGCACGCTTCTCCAGGCTTGGGTGGGGCGAC
-GCGCCCAAGTCGGGCACCGGGCAGGCTACGGGGTGGGGTAGGACCTGGGAATGGCGCACC
-CACGCATCCTCGAATGTCGCCTGCGGTTTGTGAAAAGCGGGAAGTCCGCCCAGCTCAGGA
-CCTTTGGCTGGCAGGCGAGGTGCCCCGCGGCCCTTGGTGCTGAGCAGGGGAGAGACAGCT
-GGGACCGCGAGCCTGGGAATCGAATCCTAGTCTGCGTGTCCTCGGTGCTTCCTATTTGGA
-AACTGGGCATCATATTATCATATTCCCTTCTCCCTCCGGATTCTTATGGAGCTTCGAACG
-AGATTAAATATACATATATATGAGAAAGGGATTTGTTCACTAGGTCCAAAAGCATTTGCT
-GGTCCCATATGTGGTCGGACCCTGTGTGTAGTAGGCGGGGGGCAACATCTACGACAACCT
-GAGTTCGTCCCCTTAAGAAGCTTTCCTGAGTCTTGGGCCCCCCAAATTCTCTTCTGGGAT
-GGTCCGAAAAGACGTCCCTGAAAGAGGAAAGGGCGGAAATCCTACCTGACGGCAGGTGTC
-TCGGAATGAGCTAAAATTTAAAAGGCAACGCGGGGCAGGGACAAGCGTCCAGCGTCAGAT
-GGAAGCAGGCTCGCGTCCCCTACCCTTCCTCCAACCCCTAACCTAAGAAAAGAAACCGAT
-CTCGCCGGTCTCCCCCAATCCTAGCCGCGAGACCGCCCAGCCCCGCAGCCCGAGCCCCGC
-CCCGCTCCGGCGGCCAGCGATTGGGAGATGCAAATACCGGCTTCTCTGCCCAGCAACGGG
-TGACGCGGCGCCCGAGCGCGAGGCGGGGCCCGGCCGCAGCCCAAGCGGGCACCTCGGTGT
-TTACAcggggcggccccgcgcgcgccgcagcggcccgcagacggcgagggggaggggtgg
-tgcgcgcgccggcggggccgcgcggggAGAAAGACACTGAAAGGCGTcggcggccgggcg
-gggagcggcgcgcgcgggccgcggcggAGCCAGAGGCTGCAGGAAGAGCCCGCGGGGGCC
-CGGAGGGTGCGATTCCTCGGCCCCCGCAAAACAATGTGTGTTGTGAGCCAGGACGCAACT
-TGCCGGAGGCGGCGGGGGCGCGCCGAGCCCGCCTGAGACCGCGCTGACCTTCTCCCCCCG
-CCGTCCGTTGGGCCCGAGCGCCCAGCTCCTCGCTCCCCAGTTcgcgggggccgggccgag
-ccgcggggcggggccgccccTCCGTCGCCGCTGCCTCCTCCCCCACCCCCAGCCGCGGAG
-GATGCGGACGGCCCCCGGCGGCGTCTAGCGGCCCCGGGCCCAGGCGCGATGGTGCAGCAG
-CGGGGCGCGAGGGCCAAGCGGGAcggcgggccgccgcccccgggacccgggccggccgag
-gagggggcgcgcgagcccggcTGGTGCAAGACCCCGAGCGGCCACATCAAGAGGCCGATG
-AACGCATTCATGGTGTGGTCGCAGCACGAACGGCGGAAGATCATGGACCAGTGGCCCGAC
-ATGCACAACGCCGAGATCTCCAAGCGCCTGGGCCGCCGCTGGCAGCTGCTGCAGGACTCG
-GAGAAGATCCCGTTCGTGCGGGAGGCGGAGCGGCTGCGGCTCAAGCACATGGCGGATTAC
-CCGGACTACAAGTACCGGCCGCGCAAAAAGAGCAAgggggcgcccgccaaggcgcggccc
-cgcccccccggTGGTAGCGGTGGCGGCAGCCGGCTCAAGCCCGGGCCGCAGCTGCCTGGC
-CGCGGGGGCCGCCGAGCAGCGGGAGGGCCTTTggggggcggggcggcggcgcccgAGGAC
-GACGATGAAGACGACGACGAGGAGCTGCTGGAAGTGCGCCTGGTCGAGACCCCGGGGCGG
-GAGCTGTGGAGGATGGTCCCGGCGGGACGGGCCGCTCGGGGACAAGCGGAGCGCGCCCAA
-GGGCCGTCGGGCGAgggggcggccgccgccgccgccgccTCCCCGACACCGTCggaggac
-gaggagccggaggaagaggaggaggaggCGGCAGCGGCTGAGGAAGGTGAAGAGGAGACG
-GTGGCGTCGGGGGAGGAGTCGCTGGGCTTTCTGTCCAGGCTGCCCCCTGGCCCGGCCGGC
-CTGGACTGCAGCGCCCTGGATCGCGACCCGGACCTGCAGCCTCCCTCGGGCACGTCGCAC
-TTCGAGTTCCCGGACTACTGCACCCCCGAGGTTACCGAGATGATCGCGGGGGACTGGCGC
-CCGTCTAGCATCGCAGACCTGGTTTTCACCTACTGAGCCCACCGTCAGCGGGGCGCGCAC
-GCCCCCAAACCAGCTGTTTACATACAGGAATCAGGTATTGGGGCCCCTCGGAGGCCGAGG
-CTGGCACCCCATCTCCCGCGCAGCCTGCCCCCTCCTGGACGTGCCCATCCCCCCTCAGAT
-CCAGACATGCCCCTCCCCCGCAGACACACCCCAAGGCAGCCCAACCCCCACCCCTTCCCC
-GACACCCAAGCCCCTCCCCACGTCGCCCCCTCCTGCACAGCCACCAGCAGCCAGCCCCCT
-CCGATACACCTCCCGTCCTCTCCTACAGACCTGCACCCCTCCCCCCTTTTGCACACGCCC
-CTCCTCGTGGCCGGAGGACCCGCCCCCTCCTTTGCTCCGGAATCTCTCCTCCCTCGCCCG
-GCCCGCCTTCTCTGGGTTAGGGGGGCGATGCGGCCGGGTGGCAACGCACGCGCCTCCTGC
-GCCCCTCCCTTCCCTGGGGGGAGGGGCGCACCCCTTTTATCCCCGGAGCGCTAGGGCCCG
-CCCCTCCGCTGGGGCCCACCCCCTTCGTGCGCATGCTTAATGCTTCTGGGGAGGAGGGGG
-CTGGTCCCAGCGGAGCCGCACTCTTCGCCCGCTCCGGGCAAAAGCGGGGGCGAGTGTAGA
-GCGATCCTGGGAAATCCTTTGATCCGGGAGCCCTAGGTTTCCTCTCCAGCCAACGGGGCG
-TCGCTGCCTTAATGGGAGGAGCACTCGGAAGGGTTGGTTTGGGCCTGAAACTCTCCCAAG
-TGGCATAGCCCCTTTTCCGGTATGGGGTCTCCTACACCCACGCGCACCACCTCTCCGGTC
-GCGTGGCTGCCTCTACAGCCTACCTATACGTCCCTTTTTCCCCCCAACTGGGAATTGAGA
-GGTAAGGTCTTTCTCTGGAAATCCAGCAGTAGAGGAAGGGACCACCCAAGAAAACTAAAA
-ACCAAGGCACCTTACCAGTCTGTCTGGGGACAGGATCCCTGCTGCACCTTCCCCACCCCC
-TCCTGGGAAGTGCCCCCTCACCTCAGGGCACCCGCAACCTGGGCTCCTCCCTGAGCGCAC
-CGGCCCTTCCTGTCACCCAGGTCCACCCTCAGTACTCAAGCTGCAGTATACAGCGGGAAA
-AACTGAGGCACTTTGGTGCTAGGGGTTTGGGACTGAGGCGTGGAGAGCAGATGTGATGGC
-AGGAAGACTCTCGCTTTTAAACATCTGGTTTGGGAGAGACCATCGACTTGGCCAGTGAGA
-CTGAGAATGGATTCCGAGTAGTGATGGGCCGTTTGCACCTCGGTTTTTCCACGTGAGAAA
-TGGGGAGAACGCTGCTGTTAGGAGGAAGTTGTGTCCAGTTCAGGGTGCCCTCGGGAGCCC
-TGTCCCTGTTGCTGTGGCCCCTCTCACGCCGCCATCTCTCTGCCCCGCCCCGCCCCTCCG
-GCCTCCCCACACCCCCCTTGCCCTCACTACCTGTATCTCACCGGCGTGTGTTCACCCTCC
-CGGGTGGCTCACACACTCTCATTCACACACACAAATCTCAGGAACAAACGGTCCCAGAGT
-CCTCCGGACCCCTGCCCAGGGTCTCTGCAGGTCTCTGCCCCACGCGTTCCCGTCGCTGAC
-AAAGCCACCAGCTGCCTCCTTTAAGCTTGGTGCTCCGGCTCTGGGCCTTTCTTGCGCTCT
-AttttttttttttttttttttAAGAAAAACAACAACAACAAAAAAAGACAATGAAAAAAA
-AAACGTCATGTGAGTGAAGAGATGTCACTGTCTGTGGTCTTGGAGAACTAGTCTCGTAGC
-TGAGGGGTGGGGTCCCTCTGTCTGGGGCACTGGCACCCACAGCAGGACTCCGCCAGTCTG
-ATGCCAGGACTGAATAAAGTGTATTTGCCCCGACCTTGCCCTGTGGTTCTGCATGTCTGT
-GCTCTTCCTCAACCCTCCCTAAACAGTTTGCCAGATTCAAGTCCGTGTGATTTGGGCCCG
-AGCTGGGTGTCCCAGGGCAAGCCACCTTGCCTGTCTAGGCCTCTATGTCAGGACTCCCTG
-GCCTTCATGaagaatagcaaactcatccctgtagggaccaggcaggtaacatagacgagt
-gactctgggtggacagtggtgtcatgacccacttcaaggggcctacctcctgccagttgt
-gaccctgtgggaatgcagtccacagtggccaggtggccagatttttcaagaaaagctgga
-tggatgtttctgagtcatcttaatttcaaaatgagactcatattttaaaatttctgtggg
-ccaaatgaaacaagtatgcaggcaggtctggtccgagggGGCTGGCTTGGCCATGCCTTT
-CTGTGCCTTTAATGAGgactaagaagcaagattgggccacactgtctggactcaaagccc
-agctccaccactgagcacccgtgtgactctttccatatgtataacgtggggataataata
-atagctgcttcacaggatGAAATGAAGTTTGAGGTGAGAAGCATTCACCATGGTGCCCAT
-CGTGTTACTCCATTGTCAGAGGAGGAAACGGGGTCAGGCAGGAAAGCAACTTAAAGGAGG
-GCCTGCAAGCAGCCAGGGTCAGAGACAGGGCTTGGTTCTGCTTCCTGGTGAAGCATGGCT
-TCGGGGTGCTGCCTCTCCCTCCCTGTTTGAATCTGCAGATTGTGTTAGGCCCCCAGCTGA
-GGGCCTGGAGTGGTGGGATTGGTCCCAGTGCCTGGCGCACATTGGCCTGCAGAGTAGATT
-AACTGAATGACCAAAGAGCAACAGAAGTCTAGTGATTCTTGTCTTTGAGGTTCTGACTGG
-TGTTTTACAACTGAGTCCAAGGCTTTTCCCTCCTTTGTCCCTCTGACACCCCTCCCCCTA
-ATTCTCATCTGTCAGATCCAGTGTATTCCTAAGCTGGGACAAAGCCTCTGTTTTCCCAGT
-AGGAGCCAGGGCTGAGTGTGGAAATTACAGTGACTGCTTCTTCTCAGCTTCTCTGGTTGA
-AAGCAAGCTGGCGAAGTAAGAGGAGGTAGAGTTGAGAAGGTGTGGAAGATAGGGACAGCT
-GCCCCCAGAACTCCCTTCAAGGGAGGACTTccccagctatgggaagtgccatcagggtgg
-ccgcagctgcagagagccacttcacctgagaccacgcccttcctggggcagcctgtatct
-ggtgtctgagtgaggcatggtataaacacctggtcatttcaatccaacatgggacggaca
-ctgacagacagtactcccagcaggcccaggccagccagggcttcgtcaggcctgcagcac
-aatttgacttcctatgcccaggcctgcttcctcttcttcctcttcttttcacaggtgctt
-attcctaataaacatcttgcaacccaaactcagtctcattgtctgtttctagagaaaccc
-agtctacaacaGAGGGTTCAAGAGACTGGACAAAGGGAATTGGGTCAGTGGCCCAGCAAC
-TGCAGCTAGGCCGGTCGGATGTATCCTAATGTCAAGAGTCTGTTCACCGATGCCATCAGC
-ACCAAACTAGGGGCTGCACACTTTCCTAGTCTGCACACCAGTCACGTCAATTAGAGACTC
-CAGCCTCAGCCCGAAGGCCTTCCAGGGCCCCCTGCTGATGCCATTCTCACTGCCAGTCCG
-TCCCCTGGTAAAAGCAGGTGGGAGGGAGGTCGTCATCTGAGTTTGTCTTACAGAATAGCC
-TGGAATGGGGTGCACGGTAAAATGCCTGACCGGAGATAATGCTAGAgctgtggaaccttg
-ggcaagcctcttcccctttgtgggcTGTACTGGGAGTCGGTAATAGGACTAGAAGAGGGA
-CCATCTCATTTTGGTTCCTTCCATTTCAGATGCTGACCTGAAAGGTCGGGGAGACAGCTC
-CTTATGGGGTCTCTGGGGCCACCTAGTGGCTAAGAGGAGTAGAACCAAGGTTCTGTGCAG
-TTGGGAGGTGGGAGTCGGGGTGTGTCCCAGGCCAAGGAACTGAGTCCCACTCGAGTCTCA
-CTCCATTCATGCATTGACTCATTGCTGGGTCATGCCCCTTGCCTGGGTGGTGTGAGCCAC
-CCTGCTTCCAAGGCTTTCAAAACACCATACGCTGAtgtattgtttctcatctattgctgc
-gtaacaaattgccacaagcttagcagtgtaaaacaacatgcatttgttatttcagtctcc
-atgcatcaggagtccagcatgccttagctgggtctctgctcaggatctcacaaggcagca
-gctggggtgctggtggcccgcattccttcttggagctcagcagccttttccaagctctca
-cggtagtgggcagaattcagttctttgtgcttataggacagagatccctgttctattgct
-ggctgtcagttagtaccactcttgattactacaagctgctcagtttcttgccacatggcc
-cccacagggcctccccagccttctcacaatattgcaacttattttgtcaaggccagagga
-gaatttttctgctgcttggagtcacttggctcagggaaggtttaagctctcttttaaaag
-cctctcctggctgggcatggtgtgttcatgcctgtaatcccagcactttgggaggccaag
-gtgggtggatcacctgaggtcagcagttcgagaccagcctggccaaatggtgaaacccct
-tctctactaaaaatacaaaaattagcctggcgtggtggcagtcgcctgtaatcccagcta
-cttgggaggctgaggcaggagaatcactcgaacctgggaggcggaggttgcagtgagcca
-agaccaagccactgcacttcagcctgggcgacagagcaagactctgtctcaaaaaaaaaa
-aaagaaaaaaaaggaaaaagagagagagaaaaaaaaagccttccctaattaggtcagact
-cacccaggaaaatctcctttttgattaggcatcaactaatgtgggattttatatctgcaa
-aaaatcccttcacctttgcagtatattgtagccttataagagtgacagctgtcatactag
-atttgcccacactcaaaagggaggaggctgtctagggcagctacaccagagactgggaat
-cttgggggccatcttagaattctgcttatcacacacctgtaatcccagcacttcgggagg
-ccaaggtgggaggatttcttgagtccaggagttcaagaccaacctggccaacatagcaag
-acctaatctctagtaaagttttttttaaaaaaattagccaggcacggtggtacacacctg
-tagtctcagctacttgggaagctgaagtaTCATAgctgagaattctcaggtctacatctc
-catcccagacatgactagactagctgccttcttgtcatctccactgatatatctaattgg
-cacctcaaactggacatgccaaaaaatgaactgtttccacagtgctcccaagcctgcttc
-cacagaccacatctgcacagctgatgtgaaatgaaaggctaaagcctctcagttatcctt
-gatgcctcttttcctcccagcgccatctcccttataccctgttggctctaccttcaaaat
-atgccctgtgtcttgtcacttctcacatcttccatggcctctgggtccaggatataaggg
-catacgaagggctccttgcgttttcctttgccccactcatagtcttattgtccacacagc
-agccggagtgatctggttaaactgtaaatcccagcacaccctgccactgttcaaaattct
-ccaaagactctcattcagtagaagccagagtcctcagcatggcctgcaaagccccataag
-aagtagcctgtggctcagcctcggcttcatcttctactttttctgtttctcacatgccca
-gtcacactggtcttgctgttcctcaaaagtgccaatcacacttccgcctgaaggcttttg
-cacatgcttttccctctgcttaagatacccttcctccggctgggcgaggtggctcacgct
-tctaatcctagcactttgggaggtccaggtgggtggatcacctgaagtcaggagttcgag
-accagcctggccaacatggcgaaaccccttctctactaaaaatacaaaattagctgggcg
-tggtgacacatgcctgcagtcccagttactcaggaggctgagacaggagaatcacttgaa
-tccaggaagcagaggctgcagtgagctgagatcgcatcactgcactccagcctgggcaag
-acaaagcgagacttcacctcaaaaaacaaacaaaaaaatacccttcctccagatagccac
-atgtcttacttccttcaggtctcagctcccagggcgccctagagtaggcacagggagtac
-ctcacagtgtcctccctgaccatccatataaagtaacatcctccataaactatcctgtta
-ctttgctttatttttctgaatagcatttatcactatctggcatttatcacctgtagtttt
-tactttttgtctctctctctctaatttgtatgtaagcttcataaggaaggaatgactctg
-GACTGGACTCCATGCCTCAGCACATTCACCCACCCATTCAACAAACATTCTTAAGGGTCT
-Aggctgggcatggtggctcatgcctgtaatcccagcactatgggaggccgaggtgggagg
-atcacttgaagccaggagtttgagaccagcctgggcaaggaaacaagaccctgcctctaa
-aaaatacaatttaaaaaagtatccaggcacagtggcgtgagcctatagtcccagctactc
-gggaggctgagctgggaagatctcttgtgcccaggagttcaaggctgcagtgagccatgg
-tcatgccactacactccagcctgggtgacagagttagaccctgcctgtaaaaaaaaaaaG
-GTGGGGGGCAGGGTGGGgaaggtttgccttgaccaggccgcgtgctaggtgccgggcata
-caaaagtgaaaaacgtgatttgtcctcagtgagctcacaggtctgaggagacacataaac
-ccaggaatggaaatgctttgctggcgatggacagtgagtctgggagaacattgaggagat
-gtttaacccagacaatggagtggggtgtggtcaggtcattccctggaggaggtgatgttt
-aagctgtggcatgaaacctcagtaggatgtgatgaccttagaacatggctacacgttctt
-tgacattcctcctttaaattaccttccctttgaatctgggctgggccttcatgatccatt
-tgtaaccaacaggacacagcagacatggtgctgcaggatttccaaggctaagtcacgctg
-aaccgccatgttgaaaggccaacagccaagactgccatgtggagaagcagcccgggccac
-gtgggaagaccatgtgtaggtagctgctccagttgacagctgagcccaggcaccagactt
-atgagttgagaagcttccaggggattccagcccctcataattcaactcactcccagctgt
-tggagggccttcccagcagaggcccagccatcacagagcagagacaagccatcccttcta
-tatcctgtctgaattcctgacccagagtccacgaacataatgagatggcagttgtccaca
-ctattaggttttggggcagtttgttatgaaggaataactggaacaataggataaggaaga
-gtgaggtgaaggaaaggactttacagatgccagcaacagtacatgggaagacctggtaag
-agtggctgacacagaagctaaccagcttgcggggaaggtgtggagagaggagggtgacag
-gcaagagtgagaaggaCCTTGAAGGTATTTGGACTTTATCCCGAGTCTTCACACTGCAGC
-CCAAGGGGTCAAGGAGTCtttttttttgtatggtaaacatggggtcttgctatgttgccc
-aggctggtcacaaactcctggcctccagagatcctcctgccttggcctcctaaagtgctg
-aaattacaggtgtgagacactgtgcccagccTCCAAGGGGtcttctcttttttttgagac
-cgcgtctcgctctattgcccaggctggagtgcaatggcgcaatctcagctcactgcaatc
-tccgcctcctaggttcaagcgattctcctgcctcagcctcctgagtagctgggactacag
-gcatatgccaccacacctggataatttttgtatttttagtagagacagggttttaccatg
-ttggtcaggctggtcttgaactccttacctcatatgatctgcccacctcatcctcccaaa
-gtgctgggattacaggcgtgagccaccatgcccagccGGggtcctttgaaaacacaaacc
-tgaccactgctgtaaacctttcgatggccccttactaccctcaggataaaCTCTTGAAAT
-TCAAGGCATTTTGCAGTTGACTCCCTCACTCTTTTATAGATTTATCTTCGGTCACTTTAT
-CCTCAGCTACGCCAGGCCACTCTCCAGTGACAATGCTTCCCGCCTCACCCATGCTATTTA
-TCTTTGCTCATGTGGAGGAATTAgtgggactttgggctaatcaccttgcctttcgaggcc
-tcagtttccccatctgtatgattaggtggttggactagaagtttttgttttgttttgttt
-ttgtttttgtttttttgagaccgagtttcactctgtcgcccaggctggagtgcagtgctg
-tgatctcggctcactgcaacctctgcctcccgggttcaagtgatttttctgcctcagcct
-cccaagtgactgggattacaggcatgcaccaccaggcccaggtaatttttttgcattttt
-agtagaaacagggtttcaccatgttggccaggctggtcttgaactcctgacctcaagtga
-tccacctgcctcggcctctcaaagtgctgggattacaggtgtgagccacgacacccagcc
-ttagatgtctcttaagagcatatctagcctggcattctaggagtctatgaAAAGGAGGGA
-GAAAGGTGTCTGTAGCCAAACCTGCCTGTCTGGCTTCTTCTAGGTTGCCTAGCAATGGAT
-GCCAACCCTCTCCCCCATCCTTGGGGGTTTCTTAGCAACCCAGTTTCTCACCCTCTGCTG
-TTTTCAGGGTTTCCTTTTAACTAAATGTCAAGTTTTGCTCTTTCTCCTCCAGAAAACCTG
-AGGCCAAGGGTCTCTGTGTAGAGCTGGATACAACCCAGAATACACAGAGACCTGGGTTTG
-AGGTCAGTGGAGGATTTGCTGTGTGACTTGGAGGTCTTTGACCTCTCTGGCTTTCATTTC
-AGACTGTGATTCCCTGTCATATGCTCCTCAGAGttcttcttcttttcttcttcttcttct
-ttcctcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttc
-ttcttcttctcttcttctttcttcttcttcttctttcttttcttcttcttcctcttcctc
-ttcttcttcttcttcttctcctcctcctcctcctcctcctcctcctccttctccttcctt
-ctttcttcttcttcttcttcttttgttttttgagacctagtctcactctgtcgcccaggc
-tggagtgcagtggggcgatcccggctcactgcaacctccgcctccctggtacaagcagtt
-ctcctgcctcagcctcccaagtagctgggattacaggtgcacgccaccatgcccagctaa
-ttttgtatttttagtagacacagggtttcactatgttagccaggctgatctcgaactccc
-aaactttgggattacaagcatgagccactgtgcccagccTGttcttttctattttttgag
-atggagtctcactctgtcacttaggctggagtacagtggcacaatctcagctcactgcaa
-catccacctcccaagttcaaacgatttttctgcctcagccaccaaagtaagctgggatta
-taggtgaacaccaccacaccgggctaattttttgtattatttggtagagacgggttttca
-ccgtgttacccaggctggtctcagactcctgacctcaagtgatccgccagcatcagcctc
-ccaaagtgctgggattacaggcatgagccactgtgcccagccctctgtattgttctgatt
-ttagtatatgtgtgctgaaatgagcacTTCCCTCTTCTCTTGTATGCGTTTGGTTTGACT
-ACCAAATTTattcacttttgcaataaaccgtcactgagcacctactatgttccaggcact
-gtcttaaggactggggattcgtcagtgaataaagcagacatagtcccttccctcacagag
-cttatactctagtagatggaaacgtataatgaataaacagataagtgcacataatgatat
-catgcagtgaAGGGGACAAAGTGTAAGGAAGGGCTACTATTTTAGATGAGGAGGTTGTAT
-CAGTCAAGATGGGCTAGGGaagtcagagatggttgggaagaaaaagcctggcttccccct
-ttctccctccaacttcctgtgggtgcctcaccttgggtgacctcagctagaggccagctg
-acaaaggaggctgagtagcttccaggggtcagctctgcaaagcaggaaagagcaaggaat
-ccactggaagcaagaaggcCCAAAAGTACCTTGGGAGGTACGCCGCTTTTTCAGCTCACT
-CACTGCCTGTAAACTGTCAGGGACCCTAGGATCATTAAAAAATATTTTGAGggccgggcg
-tggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggatcacttgag
-gtcgggagatcgagaccagcctgaccaacatggagaaaccccatctctactaaaaataca
-aaattagccaggcgtggtggtgtgtgcctgtaatcccagctactcgggaggctgaggcag
-gagaatcacttgaacccaggagacagaggttgcagtgagctgagatcacaccattgcact
-ccaccctgggcaacaggagcgaaactctgtctcTCTCTCTCTCTCTCTCTCTATCTATAT
-ATATATAGATAGAGAGAGAGAGAGAGAgtagtaaaatacagatagcataacatttaccat
-cttaaccatctttaggtgtacaactcactggatattaagtatagtcacattgttgtgcaa
-ccatcaccatcatccatcttgagaactcttcatcgtgcaaaactgaagttctggatccac
-tatgcactaactctccatttccccctccccctagctcttagcaaccaccattctgctttc
-tatatgtatgaatttgactatggtatatgtctcatataagcagaatcatacagtgtttac
-ttttcgtgactggtctatttcacttcacatcatgtcctcaaggtttatccattgcagcat
-gtatcagaatttccttctttttaaagctgagtaatattctattgcatgtgtatatcacat
-cttgcttatccattcatctgttgatagacacttgggttgcttccaccttttagctattga
-gaataatgttgctatgaaaatgggtttggaaatttctcttcaagatacactgctttcagt
-tcttttttttttctctctgagacagtctcactctattgcccaggctggagtgcagtggca
-caatctccgctcactgcaacctccacttcctgggtccaagcaattctcctgcctcagcct
-cccgagtagctgggattacaggctcacaccaccgcacctgatgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtctgtgtgtgtttagtagggatgaggctttgccatgtttgtca
-ggctgctctcaaattcctgatctcaggtgatccgcctgcctttgcctcccaaagtgctgg
-gattacaggagtgagccaccacccctggcttcagttctttggggtatataactagaagta
-aaattgccagatcatgtggtaattctatttttactttttcaaggaatcactatgtgtttt
-ccatagcatctgcaccatttttcattgttatcaacaattcacagggttccagtttccccc
-tatccttgccaaaacttgttattctgttttgttttatggtagtcatcctaatgggtatga
-agtgACTAGGATCATTTTGAGACCCAAACAGTCACAGGCTTTTTTGTTGTtgttgcccag
-gctggagtgcagtggtgcaatcatagttgaccgcagcctcaacctccttgggctcaggtg
-aacctcccacctcaggctcccaaggagctgggactacaggcacacaccaccacatccagc
-taatttttgtgtattttgtagagacagggttttgccatgttgaccaggctagtcttgaat
-tcctgggctcaagcaatccacctgcctccagcctcccaaagtgctaggattataggcACC
-CAGCTTCATAGGctttttagcccaggcttgtgatttctttgtcagtataattctctgaaa
-aacttaggtttctggcagggggcagtggctcacgcctgtaatcccagcactttgggaggc
-cgaggcggacggatcacctaaggttagaagttcgacaccagcctgaccaacagggtgaaa
-ccccatctctaccaaatacaaaaaattagccaggcatggtagcatatgcctgtaatccca
-gctacttgggaggcggaagcaggagaatcacttgaacccaggaggtggaggttgcagtga
-gccaagattgtgccattgcactctagcctgggcaacaagagtgaaactccatctcaaaaa
-aaatcttaggtttcttatcgatttgactgtagttaatggtactaaaaccatacccacaat
-acttttcaatataTTGTCCTCAAGTCTGCTTTTTCCCTTTGCTTTCTATCCTAAAGCTGT
-CACTCTCAATGTAATGGCAATTAGCAAGAATAACAGGTGGCAGAGTTGCACCTCTAAAGT
-GATCTTGGCTCTGAGAGTTTTTACAGGACATTTTTCACTCAAAGCCTTTTAAAAATCCAA
-TCTCATACTTTAGTTGATTCTAGCCTTGAAGTACTTTAATTGATAAAAAAGAAAGTTCAT
-AAGGTCATTGGGAAGATTAATTATCCCAGCATATAGTAAATGCTCTATAAATGATACCCA
-TCTTTGTCACttttttttttttttttgagacggagtctcactctgtcgccaggctggagt
-ggcacaatcttgtattactgcaacctccgcctcctgggttcaagcaattctcctgcctca
-gcctcccaagcgagtagctgggactacaggcagcatgctgccactcccggctaatttttt
-ttttttttttttttcagtagagctggggtttcaccatattttctttctttctttctttct
-tttctttctttctttctttctctttcttttcttttcttttctttttctttctttcttttc
-ttctcagagtctctctctgtcacccaggctggagtgcagtggcatgatcttggctcactg
-caacctctacttcaagtgattctcctgcctcagcctcaagagtagctgggactacaggca
-tgtaccaccatgtccagataatttttgtatttttagtagagacagagtttcaccacgttg
-gccaggctggtctcaaactcctgacctcaagtgatccacccacctcagcctcccaaagtg
-ctgggatcacaggtgtgagccaccatgcctggACAAATTTTCCTATTTCTTAATAGATAA
-TCCATCTTGTTTTTCTCAAAAGTAGACAGTTTATCAGGTGTCGTGTCTCTCACCTTCCCA
-CCCTACTCACCTATAAACTAATATAACAATAACAGTaacaataaccataatttgctgagt
-tctaattttgttccaggtactttggataagtgtcttatatgcacatctcatttcactctt
-tcaacccctctgagaggcaagtacttaaattatcttcattttacagtcagggaaactgag
-gcacagagtgtttaaatcatgtaagcagtaagtagtggagctaagattcaaacgcagatc
-tgctggactccagagttcAACTTACAGACACTACATTGTGGCTCTTCTTGGTGGCCCCCT
-CCCCTCCTCCCCAGGCTCTCAGAGGATACAGGATCCCTCCTTTGCTAGTCAAGGCCAGCC
-CATCCCCCTGTATATTTGACTTCATCTCTTCCCACTGCCCCAGGATTTCATCCACCCCTG
-CTCTGATATCAGGGGCCCCCTCCCCTTCTGTCCATGGTGTGGGGCTTTTTGCACTTcaca
-cacacacacacacaggtgcacatacatacacacCCCTTCTCCAAACCACTCCACAAAGGG
-CCCCTGCCTCCTCActttcttgccttccacatcacaccctaaattctcctggccaaggtt
-cccactgacctccttgttgccaaacctaagtcctgttgtcccgctgtgtgtctcttatgc
-acttggcaaggctgagcaggtccttcttggaaatgtgtttctttggtttctatgacacAA
-TGCACCCCCACTCCAAAACACACATACACACATCCCAGATTCTTGCCCCCACCCACCACC
-ACCCGCTATCTCTCTAGATGCTTCTGTGGTTCTTTCTCCTCCTCTGACCTCTTCAAATGT
-AGtatggtggttttaaaacatgtccataatttttttttttttttttgagatagagtctca
-ctttgttgcccgagctggatacagtggtgcgatcaggtgcgtgccaccatgctcagctaa
-ttttttttaacttttaagttttttggagagataggggctccctgtgttgaccaagctggt
-ctcgagctcctgggctcaagcgatcctcccatcttggcctcccaaagtgctaggattaca
-gacttcagccatcgtgcccaaccatgtctataaattctttaagactcctcccactgagta
-acagagtctgtttcttccccttgaatctgagccaaacttagtgactcagactacagtaga
-aatgattctatggtgacttgtgaggctgggtcataaaggcaatgtggcctgactcatggg
-agtcctgagctacagtgtaagaggtgtcaacactctcagctgccatgctgtgaggaagcc
-caactggctcatgcagagagacaacatggagaggccttgaggctatatgaagagagatgc
-ttggccagctcccagctgctccagctccccagtgctccggcttccactgtaaccacaaaa
-gagacaccaaggcagaaccacccagatgagcccttcccaaattcctgacccacagaaatt
-gtgaaagatgataaaaatcattggatttggagtggtctgttatgcagccatagacagcca
-aACAGAGGCAtcttaatctgcttgggctactataacaatttagcatggagcaggtggctt
-gacaacacacatttattcctcaggtctgcagggtgaagagtctaagatcaaggtgctggc
-aaattccattctgctggcaaccaagggcctgacttctggtgtacagacgaccatcctatt
-gtagccccaaatggcacagagaagaagcaagctctcaagtctcctcttatcaggctgtaa
-tccctcccaaaggcccacttccaaataacatcaccttaggacttcaacatatgaatatga
-gggagatacaaacattcagtctgcagcaGAGGGCTTCGTTAGAGCTCTGACCTGAGCACG
-CTTCATCTCAATGTCAttgtttttgccagctctacatccactgccctttttttttttttt
-tttttttttttttttttttgagacagagtctcactcttatcacccaggctacggtgcagt
-ggcacgatcttggctcactgcaacctccgcctcccagcttcaagtgattctcctgcctca
-gcctccggagtagctgggactacaggtgcatgccaccacacccggctgatttttgtattt
-ttagtagagacagggtttcaccatgttggtcaggctggtctcaaactcctgaccttgtga
-tccacctgcctcagcctcccaaagtgctgggattacaggcatgagccactgggcctggcc
-ccactgccctttcttacagtaacagtatttcaatttccctttagggaagctcttcaagca
-ggttctcagtccaagaggtttctctgggttaagcactgccagccacccaaagggtgagca
-agtaaccagccaatcagagacactccagtgggttcagtaaatgacatattatctaactgg
-ggtgaggggaatcaacatcagggcttttcctgagactataaggagaaacagattcttttc
-ccagcagttaaatttgaagtctgtggccattttgctaccatatagggaaaatctgcctga
-cattgaagccaacacagatgagggaagagccaagagataaagagaaagatcctgagcatc
-tggatacagccatgcctgaagccagtatcccttgacttctcaattatgtgagcctttata
-ttccctttgtttaaagccagttcaagttTAAAACTGCCATTTCCAGTGAGAACAATTCCC
-TATGTTGTATCTAAGGCCAAGACCTTGCCCCTGACTCTAGGCCAGAATGTCCTGTACAGT
-GCCATTCAACTCTGCCAAAAGCAAAGGGCATCAACTTCTCCACAACCTGGCTTTCCCTCA
-TCTATTTTACATCTCTGTTAATGGGAGCATCACCCACCTGACCTATAAACATAAAAGTCA
-GCCTCTATCctctctgtctctctccctctctctgtctctctctctctctctcAATCCCTG
-TCACTTCCCTTACTTCTTAGTAACCAAGTTCTGCCAACTTAACTTTATGGACATTTTTCA
-CACCTGCACCCTCCTTTCCATTTTTCCTGCCCACTCCAATTCTTCATCATTTCTCACCTA
-AATTTTTACAAAATCAATAGATAACTAACATAGAGGTGTATAGTAAAAAGTGAATTTCgg
-ccgggcacagtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcagatc
-atgaggtcaggagatagagaccatcctggccaacatggtgaaacctcatctgtactaaaa
-atacaaaaaaaaattagctgggcatggtggcatgtgcttgtagtcccagctactggggag
-gctgaggcaggagaatcgcttgaacccgggaggcggaggttgcagtgagctgagatcgca
-ccactgccctccagcctggtgacagagcgagactccatctcaaaaaaaaaaaaaaaaaGT
-GAATTTCATTCCCACCCTTGCCATCAGTTACCCTCCCCCAAGGCATCTACTGTTACCTCT
-TTCTTGTCTATTTTCCCAGAAGTTCTCTATATGTGCCATCTTTTTGAGAATTTcaaatgg
-aggcatactatcaagacttttcagaacactgcatccttcttcacttgaagtgtgattaat
-ataaataattatagactaatttcttctttctaatggatgcatagtattccacaaagacat
-ataatgtacataactcgtcttccattgatggatatttaagtggtgtcccagttatctgtt
-agcacagaacaaaaccccccaaacctagtggtataacacaataaccacttgaatatgctt
-gtgggttctgtgtgtcaggaattcaggcaggacacagtgaggccagcttgtttctactct
-gcaatgtttgagtcttcagctaggaagatttgaagatttgaaggctgaagctgattcaaa
-tggctggccactggaatcatcttgttcttccccttccccttcgccttctacagtgcaatg
-gcatgatgtcggctcactgcaacctctgcctcccgggttcaagcaattctcctgcctcat
-cctccctagtagctgggattacaggtgcacgccaccatgcccggctatttttgtattttt
-agtagagacggggttttgccatgtggccaggctggtctcgaactcctgaactcagggtat
-ccacccgccttggcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggcct
-catctggttcttcttcactcacttcttttatgcttgaactgggatgactcaaagctaagc
-ttagctgggactgtggtgccttcatgtgtcctctcctgatggtcttggcatcctgacagc
-atggcagcctctaagcagacatggagccctaggtaggcatggtgcctcaggctccaagag
-ctagagttctagcagaagttgcctgtacttttatgtctggaccttagaagtcagagtgtt
-acttccaccgtactccattggttgaagcagtcatcagctcacccaagattcagagagggt
-acaaggatcccacctctctacagaggagtgctaaagaatttgtagctatattttaaaacc
-accacaggttgtttccaatctgtagctattcctgtagttcattttacaggctaacatctc
-ttgaatgtcttcatttctctgcaccaggccaagacactgtcatctctgatctctttgctg
-atctcttgctgtcactcttgtgctcaacatgctgttctcttgacagcagccagaggtctt
-ttcagaatgaaaatcagatcacatcccacccctcttcataacccttccatggctccccac
-tacccttgggctgaagctcaaactccttaccttggcttatgaggccccacaaggtctcac
-ttctgcctgcctctccaatgccatctcctgtcacCATTTGGGGCCTTTAGTTTTGAGCTG
-CAAGAGTTCCTCCCATcacacacacacacatacacacacacacacacacttaaatgagta
-agtaaatagaacatacaaaacgcttaaacactttgcacatagtgagcataataagtttgc
-tactattATTAGACTGTCttcagtaaatatttactgggctgcctactcagtgccaagcac
-tatgggaggctcacagatacaacacgaacaagaAATATGTGGCCTTggccagacgcggtg
-gctcacgcttacaatcccagcactttgggaggccgaggcaggtggatcacttgagctcag
-gagttcaagaccagcctgggcatcatggcaaaaccctgtctctattaaaaatacaaaaaa
-ttagctaggcatggtagtgcgtgcctgtagtcccagctcctcaggcgactgaggtgggag
-gatcacctgagccttgggagatcgaggctgcagtgagccgtgatcatgccaccgcactcc
-agcctggacaacagagtgagacgctgtctcaaaaaaataaaaattaaaaaaaaagaaaaa
-GAAAAACTAAAAAGGAAGATGTGGCCCTATCTTGccgagctcattcttctgtgtgtcccc
-agcccctagcacaaggagaaacagaatagatgctcaaGACACAAAGGCATGTCTGTGCAA
-GGGTGCTTGAtgacggttggaggggcacaatgactttcccaagatcacacagcaaatgtg
-ggacaaaatcaagGCTGACAGCTCATGACAGGGTGGGAGGCAGATGCAGCTGCCTGGCAC
-AGGCTGGCTCTCCAGGGAGATGGGCAGTGGGCACGCATTGCCCAGGGCAGAACTGGGGCT
-AGGGGAGGAAACAACAAGGGAGGCTGTCATTAGCTCCTTCCAAAGTGGAGGTCACTTCTC
-TCCCAACCCCGAGTCCTCCACCCAAACTCCCTTCTCAAGGTACAAGGGCTGATCCCGTAC
-CAGGGATGGGTAGGGACTCAAAGAGGAAAAGAGGATGAAAAGAGGATGGGGACTGAGTGA
-GATGTGAGGACTCCAGAGGGATTAGCGGCTCTCAAGGCAAGTGGGAGGGGACTTCCCGGT
-AGGAGCCCGGAGACAGATGGGAGCCTGTGAAGAGGGCGGGGGCCCGGCGAGGAGAAGCGG
-TTTCTACGCTGGGGTGGGGCTCCATGAGGGGGATGGAGACCTGGAAAAGGGACTGACGGT
-GCAGCGAGGAGAGGAAGGCTCGGTTAAGGGATGGGTCTTCCACGGGAGGGGTGGGGAACT
-GCGGGAGTGACGGCAGCTTCGGTGAGGAGTCTGAGGGGCTGCGTGAGGGGCTGGGGCCCA
-GGGAGTCCGAGGGGTCTCTGTGAGGGCGCTGGGGTGTCCGAGCGAGCAGGGAACTCTGGA
-AGGGGACAGGAGCCGGGGGAGCTGCAGGCGGCCGCCGTCTGCAGAGCCAGGCCCTGAggc
-gggccggcgccccctcccccgccccgAACTGCGGCGCAGGCGCGAACCGGACCCGCCTTT
-GCTCGGCGGAGACAGCAGGCAGAGAGGTGAGCTTAGCCCTGCCCCACGCGCGGCCAGGCC
-CCAGCCCCAGCCCCTGGAGAACCCCCGCGCTCTGCCCGCATCCTCAGCCCGGGCCGTGTC
-CCGCCAGGGCCGGGACCTTTGCGCCTGAGCCTCGGCTTTGGGAGGTGGGGGTCCCAGGGA
-AGCAGCAGGGGCGGGAGACAGAAACAGCCCCATCGCCCCTCGACGCCTCAGGGTTGATAG
-GCTGGGTAGAGGCTTCAAAGGACACCCCCACCCCCGCCAACACTTCAAAAACCCATTCCT
-ACCCCTCTCTGCCTCAGTTTCTCTCTAGGGAAAAGGACGCAGTTGGTGTGGAGCAGGGCA
-TCGGTGGTCCTGTCAGGAAGAGTGGCGCGGGTGCCGGTGGGGAAGGGAGGCGGGAAATGG
-CCTGATTTCCCCGGCCGACACCCCCTACCCATCCCCCCCGGGAGGGCGCCCCTTCTCCCC
-CGCCCGGGCAGCGCTGGACGCTGTAGTGGGCGAGTCTGAGGGTCTGGGAAGGACACAACT
-GAATGAGGCTGTGCAGAGGCGACAGATTCCGTCCATCTTCGGGCCCTGGCTTCCGTCACT
-TCCGCCCGTGCCTGCCGCCCCTCGCCTCCTCCCTCCGCCGCAGTCTCCCCACGTCGGACA
-GCGCAGCCCCCTCCGCCTCCCGCTCCCCTCCCACCGAGCTCCTCCCGGCTCCCGGGCTGG
-GGACGCCTCCCTAGCGGTTCCCATGGCAACCCTCGTCCCGGGTGCCTgcgccccgccccc
-cgcccgccAGACCTACTCCGTGCAGCCCTGAAACGCCAGGCGGAGGGGCCAGGCCGAGCG
-GGAGGCAGCGTCAAGGTCACCTTCCCTCTCCAGTAGCAGCAGGACTGAGTGATTCCATCT
-ATTTGGAGTCGCGGAAGCGGTGAATTGGAGGGGAGGAGCTGACCCAGGTCAACAGCCCCG
-AAGCCCCCTCCACACCTCCTCACCTGTGGCCTTGAACAGTGGTCTCCGCACGGAGGCTCC
-TACCGTCCCCCAGGCCCCATTTCTTCTCCCCACCCGGGCCTCCCCAGCGCCTCGCCGGGG
-CGGGTACCGCGCTGGCCGCACCCTCCGCACAGCCCGCCCCGCCCGCCTCCTCCGGCGAGC
-CCTCCTCTCCAGACCTCTCGCCCTCCTCCTCCGACGGTCCTTCGCTTTCAGTCTCTGCCT
-TTTCCCGTTCTCTGTCGTGGCTTTTGTTGTTGTTGTTTTTCCTCCTTTCCTTCCCCGCTC
-TTCTTTTCCCTGAATTGTAAGTGAGGAGGGTGTACAGCCACTATTTATGGACAGGCTTTC
-TTGACAGCAATCTTGTGTGCCGTGTGACTCCAAGCAGAACCTCCAACCgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtCGTACCTATCTGGGTATGTCTCTGTATG
-CTTTGTGAGTATGTCTGTGTGTTTCTCTGTGCTGTTTCGGTGAGTTTCTCTATGCAGGGA
-TTTGAGGACCACATCTGATTGGAAGTGAGGGGCAGCTGTCAGGACCTTTATCTTACCCTT
-TGGAACAAGCACATTGTTTCATTTTGCAGGAGGCTGCTAATTAAGGCTGAGGGCCATCAT
-GGAGACTGGGGTAGAAGCCCAGTCCTCCCCCAACACCTCCTGGCTTTGGTTCGGGCCAAA
-CCTGTATATGGATATACAAGTACCTTCCATTCCCAAGATCCGTGTCCACTTTTGTGGAAA
-AAAAAAAAAAGGTTATTTGATAGGTTTCTCTGGAAATCTAACAGCCCTTAAGCCTAAGAG
-TCTTTAATCCTGAGGGACCCTGACTTTCACTTCCAATGGAGTCAAAATTCATTGGAATCT
-GGAGGCTTTCAGGGGCAGTCCTGGGGAGGACCTTTTTATAGCCTTGCAGCTTGGGAACTC
-CAGCCCAAGTGTCAGCCATGACAATTACCCCCAGGAGGGGGTCTGAAGGGGAGCGGAGGG
-TGAGGCTCTCTCATTCCAGATATGGAGACTAAAAAGTTCAAGATGGAAGTAATAGCAAAA
-AAATTACAGTACTAATCACAACAGCTACCATTTCTCAGCATTAGAcacagtaactgtatg
-aaagaagtatgattattaggtctgttttacagatgaggaaactgagacccagaaaggtgg
-aagcacttgtctaaggtcacgcctccaggaagcagtgtgtccacgactccagtccaagtg
-gtcaggctccagagcccacagtcccaggtactGGGTGGCCTCCAGAGTAAACATGCAcat
-ttattgacacctccaattgccaggcactgggctaaggccttcagtgcattggctcattCG
-CAGTGTGCTTTGGGAAGGACAGGCTGGGATTCCAAAAGGCCAGACTGTGCTATGCGTGTA
-GGGTGTCTCGAGTGGGAGGAGAAGCGGGTGGGGCACAAAGATTTAGGGGGCTTATGAAGG
-TCACCATGAGCAGCTCCCACTAATCCCTCCCTCCGTCAGCTGCACCTTACCTGCTCCCCA
-GGGGTCCATGATGCCGAGCTGCAATCGTTCCTGCAGCTGCAGCCGCGGCCCCAGCGTGGA
-GGATGGCAAGTGGTATGGGGTCCGCTCCTACCTGCACCTCTTCTATGAGGACTGTGCAGG
-CACTGCTCTCAGCGACGACCCTGAGGGACCTCCGGTCCTGTGCCCCCGCCGGCCCTGGCC
-CTCACTGTGTTGGAAGGTAAGGCCAGATGAGCACCTCCCATGATTCCTCTGCCTTGATGG
-AGGAAATGAGTCTGAATTTGAGGCTCAGAGGAAAAAAGAAGAGATAGCgtagtagttagg
-agtcttgcacagtcaagcaacagaaaacccaattcaaatgggtttaaataatgaagggag
-ccttcattgTATTTGTATTTACAtacaaattatttacataattatttacatatttattGT
-ATGTAAATAATggtggctcatgcctgtaatcccagcactttgggaggctgaggtgggcag
-atcacctgaggtctggagttcaacacctgctctgtcagcatggcgaaaccctttctctac
-taaaaatacaaaaatggaccgggtgcggtagttcacgcctgtaatcccagcactttggta
-ggcggaggctgaggctggtggatctcgaggtcaggagttggagaccagcctggccaacat
-agtgaaaccctgtctgtactaaaaatacaaaaattagctgggtgtggtggcgggcgcctg
-taatcccggctactcgggaggctgaggcaggagaatcacttgaaaccaaaaggtggaggt
-tgcagtgagctgagatcaatccattgcactccagcctgggtgaaagagcgaaactccctc
-taaaaaaaaaaaaaaaaaaaaatgagccgggcgtggtggcaggcgcctgtaatcccagtt
-acttaggaggctgaggcaggagaattgcttgaacccaggaggcagaggttgcagtgagcc
-aagtttgcaccattgcactccagctgggcgacagaacaagactctgtctcaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaagaaaaaaGAAGGGAAAATGTTGCTCATTTTTTAGAAGAGA
-CCCAAGGTCCAAGGTTGCATACTTTCAGGCAAAGTTTGATCCAGCAGTTCAACCCTTTAT
-ACCAAGGACTTTGCAAGTTTTCTTAGTCTTCAGCCTCCTCATGGTGCCCCTACCCTGGTA
-GCCTGTTAGCTTCAGACTCTCCCCACATGTTCCCCAAATGGCCACTACTGTGTGGACTCT
-CAGGTCTTCACTCCACACCATCTAAGGGAAGTCAGCATTTCCTGTGGTATTTCCTTCAGA
-AAAGAAAATAgcctgtaatcccatcattttgggaggccaaggtgggtggatcacctgagg
-tcaggagttcgagaccagcttagccaacgtggtgaaacctcatctctactagaaatacaa
-aaattagctgggtgtggtgatgggcgcctataatcccagctactctggaggctgaggcag
-gataatcactagaacccgggagacagcagttgcagtgagcagagatcgtgccgttgcact
-ccagcctgcacaacaagagtgaaactctgtcttaaaaaaacaaacaaacaaaaaaTGGCC
-ACAGGTACtggcttacacctgtaatcccagcactttgagaggctgaagcaggaggattgc
-ttgagcccaggaattcaagatcagcctgggcaacatagtgagacttcatctctactaaaa
-ataaaaaattagctggatgtagtggcgcgggcctgtgatgcctactactcaagaggctga
-gccaggaggatcgtttgagcccaggaggttgaagctgcagtgagccatgattgtgccact
-gcactccagcctgggcaacagagtgagactctgtcaagaaaagaaaagagagaagaaagg
-aagaGAGAAAGCAAAATAGTAAgatattaaaaacatgttaccatttaccttagcaccaaa
-gaagagagaaatacttaggtgtaaatctaacaaaatatctgtaatatgagaagaactaca
-aaactcaaaagatatcaaataactaaataaatggagaaatagttcatattcgtggattgg
-aatagtcaagatgttagttcttcccaacctgatctttgattcaatgcaatgccaatcaaa
-accccagcacgttattttgtggacgtcaaAATGTCACCTCCTCAGGGAGGAGATCCCTGG
-ACTGAGTCGGGTCCCTTGCTTTACTCTGGGCAAACTCTGTGCCCATTCATTCTTCAATAC
-ACTTACCACTTTGCACACTTGTAGTTTATATGGAGAGGTAAAAGATTCAGAAATTTAAAA
-ATCATTTATAagaaacaatgcttttaattcccagaagtcctgacaagcattgtgttggct
-ctcattgggtcacttgccagccttgaactaattactatggttaagagatggactatgctg
-actggcAGGAAGTGAGGTTCATCTCACTTAAATCTTACTGTGGTTTCTCAATGGTAGACT
-GGAGTACCTTGCCAGGGCAGAGAAAAAATGTGAAGAATTGATGTCTTTAACAGCCAAGGA
-GACTAGTCGGCCAGGGTGCACCAATGGGTCAAGGTGTAGAGGTGGCAATGAGCTGAGTGC
-CTGCTATGGGCATAGCTCTTTGCTAAATATTCTCGGGAGACTGAGGCAGAGGGTCCCTTC
-TTTTGCTTTCAAAGGACTTCACTCTAGTGAGGAGGTAAGGTGCCAACCTCTGCAGAGAGG
-CCAACTTACATAACTTCAGGTCAGGTCTGTAGGGAACACCAGGAGAGGAAATGATCAAGG
-AAGACTTCCAAGGAAAGGTTAGTGTGTATTTaaaatttttaagcatcttcttattgcgag
-gcactgtgctaggctcttgggaacacagaatttaagacatgaggtccctgtcttcgagga
-actcTTTTAGCTGTGGTTTatttaatcattcagcaaacatttattcagcctttgctctgt
-gccggcacgtgctaggcacagaagactcctagtgagccaaaacaggcacagtctgctctc
-atggagctctcagtactgcgggagaggcagacgtcacttacatagcaaccaaaatacatg
-tccaagtgtgcacaatggtaagtgtattgaagaatgaatgggcacagtttgcccagagta
-aagcaagagacctgactcagtccaggggtcttctccctgaggaggtgaggtttgagatga
-gatctgatggtgcataggagttaacccaacagagacaggaaggtagaaaggATAAAGAGA
-TGAGTTGGGATGGAGGGAAACACAGGGTTGGCCGGAGAAACCCACTGCTAGGTGGGAGCT
-GGGAAGGAAATTAAGAGGCCTCAGGATTCCAAATAAAACATGACAGTTTATGCCTCCTGT
-CAGTTAGACCCCAGCAAGTGTGTTCTGTGATTCCCATCTCCTGAGGATGGATCAAGGGGT
-TACCCTTAAGTCTGGTGAGGATCCAAGGTGATCCCTTGGCCAGGGGCCCCTGGCTGACCC
-TGACTGCTTCCTGGTCTGTCTGCTTCTCCCTAGATCAGCCTGTCCTCGGGGACCCTGCTT
-CTGCTGCTGGGTGTGGCGGCTCTGACCACTGGCTATGCAGTGCCCCCCAAGCTGGAGGGC
-ATCGGTGAGGGTGAGTTCCTGGTGTTGGATCAGCGGGCAGCCGACTACAACCAGGCCCTG
-GGCACCTGTCGCCTGGCAGGCACAGCGCTCTGTGTGGCAGCTGGAGTTCTGCTCGCCATC
-TGCCTCTTCTGGGCCATGATAGGCTGGCTGAGCCAGGACACCAAGGCAGAGCCCTTGGAC
-CCCGAAGCCGACAGCCACGTGGAGGTCTTCGGGGATGAGCCAGAGCAGCAGTTGTCACCC
-ATTTTCCGCAATGCCAGTGGCCAGTCATGGTTCTCGCCACCCGCCAGCCCCTTTGGGCAA
-TCTTCTGTGCAGACTATCCAGCCCAAGAGGGACTCCTGAGCTGCCCACATGGCCTAAGAT
-GTGGGTCCTGGATCCTTCCCCCCTTCTCACCATAACCCCCTCTCAGTGTTTCCCCAACTT
-CTCCCTTTTAGCAGGGTCCCTTTAGAGCCCAACTCCAGGTCAAATCTGGAGCTCAAATCC
-CAGTGCTCCCTCCCCAGGAGTGGGGCCCCAACTCTTCCAAGATACCAGCATTCCTCAAGT
-CCTCCCAAAACTTCCTACCCACACCCTCTTCCCAAGGCCCTCAGGGGCAGAAAACATCTC
-CTTCAACCCGTCCCCACTCCTTCCTctgcatgaccttgggcaaacccttgccctttcaag
-ccatcagctcctgcctctctgccatgagggctttggatcagatTCCTCTTCTCGCCAGGA
-TGAGGACACGCACTGCCCTCCATAGACACAGATGAAGGGGTGGGGGTCATTCAGCTCGAA
-TGGGTCCCAGATGCTCACTTGGCCTTTCCCTGCAGGATGAGTGAAGACGTTTGCCTCTCA
-CAGTGTGTCTtctacctgcattttggcatcagagccccccagcccacccaccacaggcaa
-ttactagccctagttgataggtgaggtgggtgaagaaggctggaggtgacatgtccgagg
-tcacacaacaaagcagcatgcaggaactagaaacacatcttcagcctccTCCTGGGCCAG
-CTCTTGTGCTACAGGTGGGGCGGAGCCAGCCCCTCACCTTCCTGGTTCCCTGAGGGTCCT
-CAGGGTGGAGGACAGGTTTGGCCCAGAAAGACTAGCCAGAGGCCTGATGGTCCCAGGTGG
-CTCTGGATATACTTTGGATATGGATTTAAATGGTCTCTAAGAGCCGGGGGTAGGGGGCAG
-GAAAAGTGGGTTGTCTTTGCCCCTCAAAGTCCACCTACCTAGAAACCAAGCCCACGGTCT
-TGGCCGTGACCCTGATAATAAATGGGCTCTCTCAGAGGCGCCAGCCCCTCCCTCCCCAGC
-CGGAGGCGTCATCTCTCTTCTGTACCACTAGAGGGAGCTCTGATGCAGCTGGAGAGCAGC
-GCTCAAGGCTCTCGCCCCTCCCCTCCCTAACCCTTACCTTCAGTCTCCACCAGCCTGAAG
-GGCCTCCTAGGGGATCCTCAGGCGGCCCCCACCAGGGCACACCCTACTGTCCTTGTGCCT
-CACGCCCCCTCCTCATCCTGCACCCCTTCCATCCCACCTTCCCTTTCAATAAACAGCTGG
-GATGGATACTGACTTTGTTTCCTTTCTCCCTGGCCACTGGGGCGTGGGGAGGAGAAAGAC
-ACAGACTCAGgagcacctactgtgtgctgggcacgacccattatttctcattcgctcctc
-aggataacctgttgagaaaggaattattgtcttcttttttttttttttaagatgttgtct
-cgctctgtcgcccaggctggaatgcagtggggcgatcttggctcactgcaacctctgcct
-cctgggttcaaccaattctcctgcctcagcctcccaagtagctgatattacaggtgcacg
-ccaccacgcctggctaatttttgtatttatagtggagacggggttttaccatgttggcca
-ggctggtcttgaactcctgacctcaaatgatccgcctgcctcggcctcccaaagtgctgg
-gattaccgggtgagccaccttacccagacttattgtcttcattttacagatgcggtaact
-gatgatcagagaggtgagtgatttATTTTTTAtttttatttttaattcttttttattttt
-ttcgagacggagtctggctctgtcacccaggctggagtgcagtggcacgagctcagctca
-ctgcaagctccgcctcccgggttcatgccagtctcctgcctcagcctcccaagtagctgg
-gactatgagtagctgggactacaggtgcctgccaacacacccagctaattttttgtattt
-ttagtagagacagagtttcaccatgttagccagcatggtctcaaatctcctgacctcgtg
-atccgcccgcctcggcctcccaaagtgctgggattacaggcgtgagccaccgcgcccggc
-cTATTTTTAATtctttttatttcagtagcctttggggtcaaagtgggttttggttacatg
-aattagttctatagtgattctgagattttagtacacctatcacctgagcagtgtatactg
-tacccaatacgcagttttttatccctcatcccctcccaacctccctggactcagtcccca
-aagttcgttatatcactctgtatgcctatgcatcctcatagcttagcttccgcttatata
-agtgagaacctaccgtatctggatttccgttcctgagttacttcacttaggataatggcc
-tccagctccacccaagtcctgcaGTGGATTTAAATGCTCAGCCTAGGGCCTGGAGGGGTG
-GCTGggccaggcgaggtggctcacgcctgtaatcccaggactttgggaggccgaggtggg
-tggatcacctgaggtcaggagttcaagaccagcctggccaacatggtaaaaccccataac
-tactaaaaatacaaaaattagctgagcatggtggtgcatgcctgtaatcccagctactcg
-ggagactgaggcaggagaattgcttgaacccgggtggtggaggttgcagtgaaccaagtt
-cacaccattgcactccagcctgggcaacagagcaagcctctgtctcaaaaaaaaaaaaaa
-aaaGTGCTTAGCCTGATTGGCCTATTGCCTGAGTGTGGAGCTCCTGTCTTTGGGTGGGAA
-GGAGATTTCTCAGCCACCTTGAGAACACACTTCCTCTAGTTCTGAAAGGAATGTGAGGGC
-CAGGGTGTGGGAGAGGGGGCTGAAGCCAAAGGTAAGATCTTTTCCAGGCCTGGaagagta
-attaaccccttttggcactcaccaggggctgggccttgttcttagtgccttacagaattc
-gggaattcatttaaccaggacgacaacctctgaggtggcggctattattctcaaacctag
-tttttcctaaactccaggcttgcgttcccatctgcattcacctggatgttgaatttaaac
-tcaactatctcaaactgttctccttgttaccacccctccctgaccaaacctgcctctact
-atgctgcccacgtcttagagagtagcgtccccattcttctggctgctccagccaaaacct
-cctctctttcctcacaccctgtatccaatccatcagcaagtcctgtcaactcaaccttgg
-aaatatatcctgtacccaactacacctcgacatccccgtggctgattccatggtctgaac
-caccagcgaccagcgcctcgatctggatcattgcaccagcttcccccggtctcctggctt
-ctgagttttgaaccccaccctactccacgccttgactccccaagtctaattactacacag
-tagccagacagatcttgttagaacataaactaggtcatgttcctcctccgctccaaacct
-tcccatggctcccacctaactcagagtagccaaaaccctccctgtggcctccaaggccct
-acacaatttgctgatttccactccccccgcactttcctctgtaaccccaactcccaccac
-tctccaggttcctgtgtcctctccagccaggatcctgactcagggcctttgcctcactgt
-tccctctgctggggtactcctccccagttgacgacatgggcagttccttcaagtcgttgc
-tcaaacatcaccttctcagcaaggccttccctgagcagcctattagaattgcaACCAggc
-caggcgcagtggctcaagccagtaatcccagcactttgggaggccgaagcaggtggatct
-cctaaggttgggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaa
-aatacaaaatcacccaggcatggtggcacatgcctgtaatcccagctactcgggaggctg
-aggcaggagaatcacttgaacctgggaggcggagattgtggtgagctgagatcgcaccat
-tgcactccagcctgggcaacaagagcgaaaccccatctcaaaaacaggaaaaacaaaaaa
-caaaaaaaTGCAACCATGCCggccaggtggagtggctcacacctgtaatcccagcacttt
-gggaggccaacgtgggcagatcacctgaggtcaggagttggagaccagcctgggcaacat
-ggtgaaaccctatctctactgaaaatacaaaaattacccaggcatggtggcacgtgtctg
-taatcccagctacttgagaggctgaggcatgacaatcacttgaactcgggaggtggaggt
-tgcagtgagccaagatcgcgccattgcattccagcttgggcgacagagcgaaactccatc
-tcaaaaaaataaaaggaaGCTAACACAGAGTATAAATGGTGCAggcagtttgacaatatc
-aaaatagaaaatacacatgccctttgatttctccctcttatgcaggtggatctatagatt
-caactctacatgttggaacactatagtattatttgtaattaaagcatttggaaacaacct
-aaatgctcatggtaggggactattaataaaatacggtaAggctgagtgcagtggctcacg
-cctgtcatcccagtactttgggaggccaacgcaggaggatcacttgaggccaggagttca
-agaccaacctgggcaacatagggcaacatagcaaggccccatctctacaaaaaattaaaa
-attagctgggcatggtggcacacgcctgtagtctcagctattaatatttgggaggctgag
-gcaggaggatcacaccactgcactttagcctgaatactgagtaacaaagcaaaaccctgt
-ctctcttaaaaaaaaaaTTGGGGGGAAGGACAAGTCTTttttcttttcttttcttttctt
-ttctttttttttttttttttgagatggaatttcactcttgttgcccaggctggagtgcaa
-tggtgtgatctcggctcacggcaacctccgcctcctgggttcaagcaattctgcttcagc
-ctcccgagtggctgggattatagtcatgcgccaccacacctggctaattttgtattttag
-gtagagacggggtttctccatgttggtcaggctggtcttgaactcccaactcctggcctc
-ggcctcccaaagtgctgggattagaggtgtgagccaccgtgcccagccAGGacaagtctt
-cttacagaagaattccaattagtaaatgtagaaggattgagagaaattgaaaaatcatca
-ttagaacaccggaataataattgctgcaggcaacatctaccaatgaacaataaaatgagt
-gggtgaaactttaaggagaaacaaggttttttttttagaaacgggatcttactacattgt
-ccaggctggtctggaactcctaggctcaatgggatcctcccacctcatgctccccagtag
-ctgctactacaggcacataccaccccaccaggcttgaaacaaaatatttgcatagcctca
-aagtatctatccccaaatatgtattaattagtatggtggttttaacatatgcatacatgt
-tctttgatgctctgccatctaggaaatggagcttaatttttctcctcttgagtgtgggct
-ggactcagcaacttgcttctaacaagtagaatgtggaaaggcaaaaacagtgacttcaca
-gtggaaaaatctggcagacaccaccttaaccaaatgaaggctggcaccaccagtcaaaag
-tcttgttgatatcacagcctctgaaatgatgtggtgagaagggcacttggcctgagtggc
-attcttcccccaaatccgtaacgtcagcctaatcatgagaagacccattctacaaaagat
-ctgaccagcactcttcaaatgtgtccaggtcacgaaagacaaggaaaggacaagaaacgg
-tctcaggttggaggagactaaggagacgtggctgaaggatacacaggatctccctgtact
-gtccatgtaactcttcaataaatctacaattatttcaaaatagcaaaaaatacgattGCT
-ggccgggcacagtggctcacgcttgtaatcccagcactttgggaggccaagaagggcaga
-ttacttgaggtcaggagtttgagatcagcctggccaacatggtgaaaccctgtctctact
-aaaaatgcaaaaattagctgggcgtggtggcatgtgtctgtaattccagctgctcgagta
-gctgaggcaggagaatggcgtgaacccgggaggcggagcttgcagtgagccgagattgcg
-ccactgcactcccgcctgggccacagagcgagactccgtctcaaaaaaaaaaaaaaaaaa
-aTTACTGTGGTCAAGATGGAATAACAGGGATCTGGTTTAACACACCCCAAAAAGGACCTA
-AGAAAGGACCATTCCCTCTCCTCTCTGAGGTGGGAAGATCTGGGAAGGAGAGGAGGCTGA
-CCAGTGGGGTCTACCTTCTGCTCCACCCCTCTTCTATCCAAGAGTCTGAGCACCCAACCC
-CCACACCACCCTGGAGGCTCCCGCCCTCGTGCTGAGTCTGGCATGCCCTCCCCATCCCTA
-CTGGCCCAGGGGACTAGGTTAGCTCAGAGAAGCCCTTCTAACTCACCCACAACTGGACCA
-AAGAAGGATTGATCTGGGGCCACTGCCTGGTCCCTGGGAGCACTGTGCTAGGGCAGGGGG
-CTGAGATGCCCCAGGGTAAGAGACAGAACAGTGAtttttttttttctaagacagagtttc
-gctcttattgcccaggctggagtgcaatgcgcgatcttggctcaccgcaatctccgcctc
-ccaggttcgagcgattctcctgcctcagcctcccgagtagctgggattacaggcatgtgt
-caccacgccccccggctaattttgtacttttagtagacacagggcttctccatgttggtc
-aggctagtctcaaactcctgacctcaggtgatcctcccaccttggcctcccaaagtgctg
-ggattacaggcatgtgccaccgcacccggccAAAAACAGTGATATTCATATAGATGGGGG
-AGGGATTAATGGGGGTGGAGTGAGAGAGAGCCTGCTGGAGCAGTCCGAAAGGCAGGCATT
-CCTTCTGTTCAGCAACATTCCTGCCCCCACAATCTCCTCCCACAACTTATATCTAGTgca
-ggctgagagtgaatctgtctgccagtgttcaagccactgtgtgaacctgagtttcttaac
-cgttctgagtgtcaggagtttttttcatctccaaaataggagcaacaaggataccaatcc
-cttgagattgtatgaagcttaatgcacttaacacagcacctggcacgtagacatgctccc
-taaatgccagctgttattatGAAAGAGAGAAGTCTGAGGTTCAGAACTAGCAGGCAACAC
-ATAATCtataatgatggatggctcagacagggtcctgtcctatagggactcacagtctag
-tggaaaggacagtcctgtggacagcaaatggcaaTATACCTGGGTAAGTACTGTAATAGA
-ATAACAAAGTAATATCCTATCACGGGGCAGTCACGGGGGCAGTGAGAGACAagcgcttgt
-ccatgccaggctctgtactcagtccatcacatacattaggtcttgcagtcctcataccac
-cataaggtggttaccattatctccaattcacagaaaagcaaacagtatggagtgtttaag
-cgtcctgtccgagatggcatagctagtggagctgaaatttgaacccaagtaatccaggtc
-cagaatGCCCCGGATGCAGAAATGACCACACAGATTCTACCAATGAACTAACCTGATAAG
-GTTGGAGGTCATACTCATAACCCCTCACACAGGTCCACACAGACACAGGCAAGCACACCC
-ATGTCTATTCAGATACACACCAATTCCTGTCTATGACGAGCGCTCAGAAAATCCTCCACA
-ACACCACACCAGGAATGATGTGCATTTTGAGAAAAAAAAAAATCAGCTCTGAAGACCTCA
-CAGACACATGCAGTGAAATGTAAATGGAGGGACCCACCCAAGTTCTTGAATAGCACATTA
-CATGCCTGGATGCACATCAGCGGGCATGTAAATGATGACGAGGAGGTCTGCAGACACTGA
-CACGCTGCATTTGCACTCACTCTGCTACTGAATTTTTTAGCagctacatttactgagcac
-ctactgtatgtaaggAAAGATAAAGCagccgggagctgtggctcacgcctgtaatctcag
-cgctttgggaggccaaggcaggtggatcacctgagctcaggagaccagcctggccaacat
-ggtaaaaccttgtctctactaaaaataatacaaaaattagctgagtgtggtggcatgcac
-ctgtaatcccagctactcaggaggctgaggcaggagaatcgcttgaacccaggaggtgga
-ggttgcagtgagccaagatcacgccattgcactccagcctgggtgacagaatgaaactct
-gtctcaaagaaaaaaaaaaaaaaaagtaaaaaagataaagctcagagaagtgaagtggct
-tgcccaaagtcaaatggctgagattcaaaccctggccctataatattaggcaacggtgtc
-tccctccaccactgtgcAGATGCATCCATGAGTGAAGAGATGTGCTATGGCTGGATTCCC
-TCATTGACATTCCCTGTGACCTTGGACATGGCATGGCCTTGTCTGGCCCACATTCTCATG
-TTGAGTCCATTCACAGGTGTGCTCCATGGATGTGCATGGATGGGACCGGCAACCCTGGCC
-TTGCTCTGAGTCTCAGCTTGGCTTGGTGTCACCAGGGCTGTGAGCTTCCAATCCCAGCCT
-TGCCATGTCCCAGAGCACATGGCTCAAAACCAAGCTCTGGGCATCAGGCCAGCAGGGCCC
-CTGTGATGGAAGAACTGACAGGATTTCATAAGCATCCGGCCCGGGACACGTGGTCAGGGC
-AGGGAGAAGGGAGATAAACAGGATGTCCACCAGGGTGTGCACCTGGGCAGGGTCCATGGA
-CCAGGTGTGGCAGGGGAAGAGCTGTCAGGACTTGGCATCTGATGGGCACTCAGCAGATAT
-AGGCTGTGTGAGGGGAGGAGTTTGTGGGGAGGCAGGGCTGCAGCTTTGCTTCCATCCTGG
-AGGCCAGGAATGAGGGAGTAAGTGAGCCATTGACTCaatgaatgaatgaatgagcgagtg
-agtgaaggaaggaaggggtaagtaaataagtgaagaatgGAATGGGGGAGGGAGTGAatt
-tatttatttatttatttatttattttgagacagggtcttgctctgttgcccaggctggag
-tgcagtctcagctcactgcaacctctacctctcaggctcaagggattctcccacctcagc
-ccccagcatagctgggactacaggcgcatgccgccacatcccgctaatttttgtattttc
-tgtagagatggggtttcgctatgtcggccaggctggtctcaaactcctgggctcaagcga
-tctgcctgcctcagcctctgcagtgctgagattacaggtgtgagccaccgtgcTGAGCTG
-TGAatttattttttacacaaatctgagtgctcactctgtgctggccctggacgggtctct
-gtggatgtctggtgagcaggatggacacagcccggtcattgcaacgctaaaagCTTGAAT
-GACACCAGTCAGGCTGGGGAACTGGGAGGGCCCTTGACATGCAGAGTGACTCAGCCAGTG
-TGAGCAGGGGTTGTCAGCATGCCTAGGGGAGCAAGAGACTGTGAGAGAtgtgtgtgtata
-cttgtgtgcctgtgtgtgtccgtgtgtacacatgtgtgcgCCGACACAGCCAGGTGTTGG
-CCAATGCAGGTGTGGTGTCCTCAAGAGCACAGTGCATCCTGATTCTTCACCCTCCCAGGC
-CTCCCCTGCCCCTGTTGTGTGCCAGCTGGGCCTGCCCCATGTTATGCCTGACGCCCACGC
-AAAAGCTGCTTCTTCCAGTCACAGGACAAAGGCATCCTCAGCCCAGACCCTGTACCCCAG
-GGGTAAAGACCTCTCAGACCCCTAGTGCTCCTCAGCATGGACCTCTCCACCAGGAGCCTC
-AGAGTTGTGAGAAGCACAGGCACCCAAAGCCCACCGCCCTGTGTCCATGTGCATGGAGTG
-TGCCCAGGTACACGCAAGGGCTGGAGATGCCCCAGGGCGGTCCAGACAGACGTGCAGATG
-ACACATTGGCCACTGAGTTTCCACAGACACTGAGCTAAGTGCTTTCGAGACACActgggt
-gaccttaggcgtatcaccctctctgagcctcagtttctaatctaaaagtagggtaattat
-actcacttccagtcttgttagaataactcaatgCATGATCAGCTCAACACATCATGATTA
-TTTTTCCTGAGTTCCTGCCTTCCCAGCTATATTGTCTATTCCTCAACAGTACCCACTGAG
-TCTTATATCCCCGTTTCTCCTATGATACTCCATTACACAGGACTCAAATAACTACCTGCT
-CTAAGAATTGCTGAGTGACATGTAGTCCTCATAAATAGCAATAATAGTCACTAACATTTA
-TATAACaacaagagccagcaattttgattttttattgtgtcaggcattgtgctgaacact
-ttacattccttcattcatttgacaaacattcactgaacacctggtaggtgctgggctctg
-tgctagacctgcagatgcagcatctctgccctcaaggttcttacattctgatggggaaga
-agagacagacaaaagacagtttggcggggcacagtggctcacgcctgtaatcccagcact
-ttggtaagccgaggcaggcagatcacttgaggtcaggagtttgagaccagcctggtcaac
-atggtgaaacccctgtctctactgaaaaaatacaaaaattagccaagtgtggaggtaggc
-atctgtaatcccagctactcgggaggctgaggcacaagaatgacttgaacctagaaggtg
-gaggttgtagtgagcagagatcgagccactgcactccagcctgggcgacagagcgagatt
-cagcctcaaaaaaaaaaaaaagataatttaatacataaatgggataatttcaaaccttga
-caagtgctacaaataaaataaggaagagttatggattagagacaaactgcagggattagg
-tggggcatgatgcttgatgagtgatcagggagggcctctctgaggagcaaatatttgatc
-tgagacctgaagaagaaggaagagcctggaaagatacaggaaaagttccaggcagatggc
-atagcaagggcaaaggccctggggcaggaagaacttggtaggttcgaggactaggagaaa
-gggaccatagctggagGATGATTCAGCAAACCTGGCAGGTCTGTCCTGGATGACTCAGCA
-AGCCTTGCAGGTCTGTTCTGGTTTCAGAACCCAGGCATTTTGTCCTTCACTCCAGGCTGC
-CTCAGAGACATGCATCCCTGCCATACACAACAATGTGTGCACGCTGGCACACATGCACAT
-GCATGCACACACACACTCTGCATGCTGACACACAACTAAGGGCCGGACCAGCCATGATAG
-TCTAAGACACTAACATTTTTCTCTAGTGTCTTGTGGGGCCAAGTAGAAGGGCCAGATGTC
-ACCTTTGCCCAGCCTTCCAGAAGTTCTGGGCCAAAGAAAGATTAAATGGCAGGAAGAGAA
-AAATGGCTTAATAAGGAGGTGACGGGGAACTCGGGTGGCCTGTGGGGGTGCGGAGATGGG
-GGGAGATGATAGAGATGTGAGAGCCCATGGGCACATCCCCTCTGGGGAAGTGAGGGAGCA
-CCGAGAACAGAGAAGCAGAGGGAGTGGAGACGGTTCTCAGAAGCACAGGGCCTCCACACT
-CACCACAGCCCCTACTCAGCCGACATGCCTTGCTTCCTCTCACCTCCCCTGGTTCACCTC
-AGAGATGGGACACTCATTGCCCACCAGGGCAGCCTGGGTGGTGCCAACTGTGAGAGAGCT
-CCCCTTCCACATCTGCCTTTGTGGCTGTAAAATGTGGAAAGaataagagaaatacctatg
-aaatctgcaggaagatactttcttttttttttttttttttttttgagatggagtttagtt
-cttgtcgcccaggctggagtgcagtggagcgatctcagctcactgcaacctccgcctccc
-aggttcaagcaattctcctgcctcagtctcccgagtagctgggattacaggtgctcgcca
-tcacacccagctaatttttttgtatttttagtagagatggggtttcgccatgttgggcaa
-gctggtctcgaactcctaacctcaggtgatccacccacctcagcctcccaaaggaggctg
-ggattacatttttctaaatcagttcggtaaaaatcaaaaattttgagaacacctggtgtt
-gtagttctgggaagcaggtactcacatgctttgctggcaggaggtagattgataacaatc
-tctatagaggaggagccagagatctctcttaaaagtgcaaatgcacaaacttttgactta
-gaaattctgcttctgggCAGGGCGCGGTGGCTCACGCCTGTGATCCCTGCCTCCCaggcc
-aaggttgcagtgagctgagatcgcaccattgcactccagcctgggcaacaagagcgaaac
-tctgtctcaaaaaagaaagaaagaaagaaagaaaaattctacttctaggaaattagctca
-gaacttctctccacacccccatgtatgaacactgcagcattttttgttatagcaaaagac
-tggaaataattaactgttcattgacaagggatggtttaaataaaccagtacattcctaac
-catggaataggaccaagctgtaaaaactgaccaggcaggtctttctggactgacacggaa
-gagtccccaagataaattgttaaataggaaggaaaaaggcaatctgaaggacatggagtg
-tgctcccatctgtgtaaaaaagtgacaaTAAATCCTCATATTTTATGTCTTGAAGGAAAC
-ACGAGAAAATGGCTTGACCCCAGGAAGATGAACTAGGAGCTGGGGATAGGAGTGGGAGGG
-AGACTTCTCAAGTATTACTCTTCTGTGCCTTTGAATTTTGAGCTAAAATATTTAaataaa
-atattaatataattaatataatacaattaataattaatattgaataaaataaaatatCTA
-AAAATCTGCTCCccgggtgcggtggcccacgcctataatcccagcactttgggaggccaa
-ggctggtggatcacctgaggtcgagagttagagaccagcctgaccaacatggagaaaccc
-cggctctactaaaaatacaaaataattagccgggagaggtggcgcatgcttgtaatccca
-gctactcagcaggctgaggcagaagaatcgcttgaacccggaagacggaggttgcagtga
-gccaagatcgcaccattgcactccagcctgggcaacagaagcaaaactccgtctccaaaa
-acaaacaaaaaaacaaaacaaacaaacaaacaaaacCACAACTGTCTGCTCAAAAGTGCC
-ATCCTCCTACACACTCCTTGCCCTCAGCTAAGTTCTGTCCCCATGGAACTCTCCCTGGAA
-GAGACAATCTGTCTCCCAAGAGAgcaggcctatgtgtgagtcctggttccatcactgacc
-ctaagtgtgacctcaggcaagacactCCCACCCCTGACTTGTACTAGACAGTTCTCCCCA
-GCACTGACATTCTGTCTCTCCTGCTGGAGGGGCAGGAGGGCAGGCACAGTGTCTTCTTGC
-TCTGTGATTCATTCAGTTCACTTAAACTGAGTTACCTACTCCAGGCCAGAGTTTGGGTTC
-ATCCATTTCTTGCCCTCCATGCCCACCCCAGGGTCTGGCATGGGAGTTGGTACCCTATAG
-GAGTTCTGAACAGACTCAGCTTACGGATGAGGAACAGACGGTGGGTCAGATGCGCGGTAA
-GGAGGGTCAGGTACACGGCCCATGGGATCGAATAGATTCATGGGTGGGtctttaagacaa
-ccgccttcactcaatcctaagccctccccacagctaccaccctattttttctcccctttg
-cagaaaagggctttgagaaaattgtctatcctcgctgtttttaattagtcttctctctct
-ctctccctctgagacaggatctgctctctcacccaagctggagtgcagtggcgtgatcat
-ggctcactgcagcctcaacctcctgggctcaaacgatcttcccacctcagcctcctgagt
-agctgggactacaggtgtgcactaccatgcctggctaatttttgtattttttgtagagac
-tgggttttgccatgttgcccaggctggttttgaactcccaggctcaagtgatccatccac
-ctcagcctcccaaagtgctgggactgcaggtgtgagccaccacacctggccctcttgtct
-cttaagtccatttaatcatgcttctacctgtcacttccctagttgaaactgctcttgtca
-atttcaacacattgctaaatccaatgtgttcagttctcattcttcatctttttttttttt
-tttttttgagacagagtcttgctctgtcacccaggctggaatacagtggcacgatcttgg
-cccactgcaacctctgcctcctgggttcaagcgattctcctgcctcagcctcccgagtag
-ttgggactacaggcacaagccaccaaacccagctaatttttgtatttttagttgagacgg
-catttcaccatgttggccaggatggtctcaatctcttgacctcgtgatccgcccaccttg
-gcctccaaaagtgctgggattacaggtgtgagccaccgcacccggcccattcttcatctt
-cttaactgatcaacagtttgacacagctgaccactccctgctctttgatgtacttctttt
-cacttggtggccaggcctccactctctgctggttttcctccttctcaggctccctgcttc
-tcccattcctgttggagcagtgaggacttggtccctggagctctcatccagtctcacgtc
-tatgactcccaacactgtatcctcagcccagacctctcccctgaactccagcccatacat
-tcaaatacctacctgatgtctctttgaggatgtcaaaagacatgacagactccacagaac
-caaagctgaacctgggcttcccccaaacacctcgctccatgtcatttgatggcagttcca
-tacctgtcaccgttcaggccaagaaaccttggaagcaccttgacacctccttttccctca
-aactccacatctagaccatcagcaatcctgttggctccacctttaaaatatacccagaat
-ccagtcacagctcacctctagcatggccactgccctgctctgagccactggagtttaaga
-gaattattgcaacacctgctcccttgtcttcctgtccttgcctcattcagtctattccaa
-gtacagatccctaaatgattttattttaaaagtaagtcaaggctgggcatggtagctcat
-gcctgtaatcctagcgcttgaggaggccgaggaaggaggatcacttgggtgtaggagttt
-gagacccacctgggcaatgtggcaaaaccctgtctgtacttaaaaaaaagaaaaaaaATg
-gctgggcatggtggctcaccctgtaatcttagcactttgggaggctgaggcgggtgaatc
-acctgaggtcaggagttcgagaccagcctggccaacatgatgaaaccccatctctactaa
-aaatacaaaaattagccgggcaaggtgatgcacgcctgtagtcccagctactcaggaggc
-taaggaagaagaatcactggaacccaggaggtggaggttgcagtgagccaagatcgcgcc
-actgcactccagcctgcatgacaggagcgagactccatctcaaaaaaaaaaaaaaaaaaa
-aaaaggtaagtgagatcacttccctcctctccttaaaccctcccctgcctccccatgact
-cctcagcgtcctttcaaaggcctccaaagctccagattatctgaaccccctttacctctc
-tgacctcatctcccaccgcctccctgtcactggctgcactccagccacattgaccttctc
-cgatggcacaccagtcagctagtcagcttccttttggagcttttgcatgagctgttcctc
-ttcctgaagaatttgcccttcggatagtctcagggcatccactgaacactccactcaata
-cagccactgcctgcccacccaacactcctcatctctgtacttactctttttttcccttgc
-attcgtcaccccctaacatgtgctacaatgtacttattatggtaattatttcttgcatgt
-ttctttctttttttttttgagacagggtctcactctgttgcccagtctggagtgcagcag
-catgatctcagctcactgaaatcttggcctacctggctcaggccatcctccctcctctgc
-ctcctgagtagctgggactacaggcactcaccaccatgcctggctagttgttgtactttt
-ttgtagagatgaggtttcaccatgttgcctaagctagtctaaaactcctaggctcaagtg
-atcctcccgcctcagcctcccgaagtactgggattgcgggtgtgagccgctgtgcctggc
-tgcacttttccttctaatggaatgtaagcgccacttttgtctgttattttcactgtagta
-tccctagcctttggaatgttgcctggcaagtagtaggtactcagtaaatatttgttgaag
-aaacggatGATTCTATAAATAGCATGGATTGATATGGGAAAGCTATGTAGGTGGATGGAT
-GGATGCTTGTCGGATGGAGGGTAGATGAAAGAACAGCGAGAAATTCGAATGGCTAGATGG
-TGGGGATGCATTATAAAATAATAATTCATAGATGGAAAAGGAATGAATAGATGGGTGGAG
-GGATttaatctcttcaactactatttactgaccacttgccgtgtgccaggcactgtatga
-ggtgctagagacactggtgagccacacaggcaaggtgcctgtcctaagggagcctgtagt
-tcagtgggtgaggcagacactaaacaaataacaaatacatacataattccaattatagtt
-aagtgttctggtggaaaagaaCAGGATGCTCTGGGAGAGAATAATATGGATAAGTGATGG
-AAAAATGGACAATAAATGGGTAGATGGAGATGGATAGGATCGGGGTTATTTGCCTTAAAG
-GGCCTGGCTTCAGGACTGGAGCTGCTTTACCTTAAAGGGCCTGTCGGACCACATGTACCA
-TCCCACATCCCAGACCAGCTCTGCACTCAGAGACTGTCCCTCTCTCCCTGCCCTGACTCA
-GCACCTGCCTGGCCTATCCCCAGTGGTCCTGCCTGACTCTACCTCCAGCTCCCACCCTGC
-TGAGTCACAGTCAGGCTGGTCAGGGGGCTGTCCCATGTTCAGTCCAGCCCCTCAGCCTTC
-CTCGACCTGGGGGGGTATGGGGAGCAGCCCAGAGGGGAGGGGAGCAGGTGCCAAGCTCTT
-GATTCCTGTGCCTGAGCACTGCCCTGTTGAGACCAGAGAGAGAATCTATGGCTAGGGTAT
-CTGGGGCTACAGTTGGGGTTTATCTGGGGCCTGGGGTCACACATGATGGATTAGAGCTAA
-ATCTATCTCCAGGGTTATAACTCAATCAGGAGCTAGAATTCAAATTCAGTTTATGGATCA
-TGTGGGGAAAAAGTGACCAAGACACCGTTCAGTTTGGGACCTGTGTCGGCGTTAGCTGTG
-GCTACGGCCCAGGGCTTAGTGATCACAGGTCAGACCATGTTCAAGGTTTCAGGCCAGAGT
-GCAGTTGAAGTGCAAAGTCAGGCAATAGGGTTCACCCTAGGACCACAGTCAAGGATCTGG
-GTCAGTTAGTGTCCAGGGCACTGGCCTTGTCTCCTCTTCTTTGGGAGAGAAGCCAGGTGG
-ATGAGTTGGATCTAAATGTCCTGAGGAGCAACTTCCAGCTCAAGTTCCTTCACCCAGGCG
-GCCTAAGCCCTCTCAGCACTGGCCCCAAAGCCTTCCTTCATCCCTCAACTTCCTCCATCA
-CTCCCTGACAGCCTGGCCTTGCTCAGTGTCCCTCGCAAGGCTGAACAGTCCTCATTCTGG
-CACCTCAGGGGACAGGGTAGGGGTGGGGACTATGGGACAGGGCTCAGTGCTGGACCCAGG
-AGGGCGCCTTGCGCAAGGTTTTCTGATGCAACTGGCTGAGTGCTTCAGCATTCCACCCCC
-ACCCCCCAAGCTTTTCTCAGAAAGGCAAGGCCTGGGCAGTTATCCAGACTGAACATATAA
-TCCCCTTCCTTCTCTGGCCTTTGATGGCTTCAGGACCTGCAGGCAAaaggaaggcaggaa
-ggcaggcaggaaggaaggaaggTCAGGTGACTCAGCAATGCGTCCAGCACTGGGAGCTGG
-CAGATCTGGGGCTCCCTCATCCTCCAGCTGAGAGGCGAGAAAGAGAATCAGGATCCCTGG
-AAGTTTGGAGATCCTAACCCCTTATACATACAAAGCAGCAATTATGTGCCTAAGCCCAGG
-GAGAGACCTGTAGCTGCCCAAGGTCAGAGGCAAGGTCAGAACCAGACCAGCTGTCTTCAG
-CCCATGGCTATGATCTAGCTATTTCCACTACACAGAAAGAGAGAACCCTTCACCCTTGAG
-GAGGACACGGGACTTCCCCAGGAACCTCCCGTCAATCCTGTTGAGGCTCCTGAAATGgtg
-gaatgacgtggactttggaaccacgcagacctgggtttaaatcccaggccaggcacggtg
-gctcatgactgtaatcccaacactttgggaggctgaggcaggcagatcacttgtggtcag
-gagtttgagaccagcctggccaacatggtaaaaccccatctctactaaaaatacaaaaac
-tagccaggcgtggtggcacacgcctgtaatcccagctactcaggaggcagaagcgtgaga
-atcgcttgaacccgggaggcggaggttgcagtgggctgagatcatgccaccgcactccta
-ggtgagagtgagactccgtctcaaaaagccacactggctagctgtgtaacgctgggcagg
-ttactttcactctttgacactggatttgctcacttgcaaagtgggcgtaaatgcatcctt
-agctcacagggctgtggtgaggctgacatgaggaagcactggaaggcacagcttagGCTC
-CACATGGGCCACTCTCAGGAAGTGTGTCCCCACCTCCCCCTTTATCCTCAGCTCTCACTG
-GGTGTGTTTGCTGGGGAAGGAGGTGCAGCAGCCCTGGGGCCTTGGAaataataatagcca
-ctcaccctccagtgcttaccatgtgctgggaactctcctaagcgtgaacttaacctgtat
-tagcccatttaaccctcCATTTAATCCAATAACAGTTCCCAGgccaggcatggtggtgca
-tgcccatagtcccagctactcaggaagctgaggcgggagtatcgcttgagcctgggaggt
-tgaggctacagtgagtcatgatcaccctactgcactgcagcctgggcaacagagtgagat
-cttctctcaaaagaaaagaaaagaaaagaGggaaggaaggaaggaagggagggaggGAAA
-TCCCAATGACAATAAGCAGTTcaataaccctacaggaaaacactgtcatcaatcccactt
-tatagatagggctgtgggtctgagtagctaagtgactttgtccaagacagtggacaagag
-accacacggattttgagccaggccagctggctctgaatcccactgtctcctccctcctta
-aactagtgatgtcactgctctgagccctggtttcctcatctgtctccagggataaaaata
-gcagcttcatggggaagtttgaggatgacacaagatgacgtaagggaggtccccacacag
-ggctccacccacagGCATGAGAAGAGCCTTTCTCAGGAAGAATCCCAGGCCGCCCCTGGG
-GCAACCGCCGGGCTGGCCTTCCTGCCTCTCCTTAGGCCCAGCCTAGCGTGATCTGGATGG
-TGAGAGATTTCTGCAAAGCCCCCAGGGGCCTCCAGAGAAGGGAGGTGCCCGGTCTCCTAG
-ATAAGGGCTCCCAGAGAGGATCACAGCCCTGGAGTTGCCATTCTTGAATCACCCACTGTC
-TTCCCCAAGTTGATTGGTCTGAATCCATGTACTTATTTTTTAtattagttccataatgtc
-ttccttccaaccagctcatcttttacttatttatttatttatttattttatttatttttt
-tatacagagtcttgctctgtcacccaggctgaagtgcagtggtatgatctcggctcacgg
-caatctctgcctcctgggttcaagcgactctcatgcctcagcctcccaagtagctgggac
-tacaggtgcatgccaccacgtccagctaatttttgtatttttagcggagataggtttttg
-ccatgttggccaggctggtctcaaactcctgacctcaggtgatccactcacctctgcctc
-ccaaagtgctgggattacaagcatggaccactgtgcttgaccacaaccacctcattttaa
-aaaacttatctaaatttatttaacatggaaattttaaatcactgacctcaaatagaaaac
-tactatgatttgccataaagaagaggtaagcatacaattacatacaaaaaaagcagaacc
-aggttattccattccagctaaatcctgtttcttgctgaaggctccaagctgaactctgct
-gtctcattcttaacaagagaggtgttaaaaacatagaagctgtgaggccgggcacggtgg
-ctcatgcctgtaatcccagcactttgggaggccgagcgagtggatcacgaggtcaggaga
-tcgagaccatcctggctagcacggtgaaaccccgtctctactaaaaacaataacaacaac
-aacaacaatcagccgggcgtggtggcgggcgcctgtagtcccagctgcttgggaggctga
-ggcaggagaatcgcttgaacccgggaggcagagattgcagtgagctgagatcataccact
-gcatttcagcctgggtgacagagcaagagcaagactccgtctcaaaaacaaacaaaacaa
-caacaacaaaaaaaaaaaccatacaagctgttggccgggcgcggtggctcacacctgtaa
-tcccagcactctgggaggccaaggtgggtggatcacgtggtcaggagatcaagaccatcc
-tggccaacatggtgaaaccctgtctctagcaaaaatacaaaaattagctgggtgtggtgg
-cacacgcccatattcccagctactggggaggctgaggcaggaggatggcgtgaacccggg
-aggcggagcttgcagtgagctgagatcacgccagtgcactctagcctgggtgacagagcg
-agactccgtctcaaagaaaaagaaaaaaaaaaaaagaagctgttaaatgagactttctcc
-ctgagtctttggagaaacagcaagaaaactgaaagggtttaagtgtatcacaattatgat
-tcaaagttatgtcatacggtatctggagaccctaaaaccctctggcactcagccattgtt
-gtacatggtatatttcagaaaacactgACCTCACTGacctactccaactttctcttctta
-ttttacagataagaaatttgaagcccccgcaaagggaggtgacttgtccacaatctcaca
-ggctcagtggcttcagccagacttggaacgcaACCAGAAGTTCTAAGGCATCATGTCACT
-TTTGTGGGGGAAATGTATGAAGATGAAAAGTTTCAAGGACACCTATGGTGGAATTTTAGG
-CATATGGCAATCACTAGGGACACCCATGTGGAAGGAAAGGAGGCAGGCATGGCTCATGTC
-ATTGCTGTGGGCCCCACATCAGTGCTGGGGGTCAGAGACGGAACTCATCAGAACTATAGC
-AAAGAggccgggcacagtggctcacgcctataatcccagcagtttaggaggccaaggtgg
-gcggatcatttaaggtcaggagttcgagaccagcgtggccaacttggtgaaaccccgtct
-ctactaaaaatacaaaaacattagccaggtgtggtagtccacacctgtaatgccagctac
-tcagggagctgaggcaggagaattgcttgaacccgggaggcagaggttgcagtgagccaa
-gatcacatgccacttccctccagcctgggcagcagagcgagacactgcctcaaaaaaaca
-aacaaacaaacaaaaaaCCAAACCTATAGGAAAGAGAAAAGCAGCCTTCTGGGCTCAGAA
-ATCTGAGTAGAAAGATGTTCTGAGCCTGGAGAAAGAAATTCATAAAAGCCTGACTCTCTC
-TCCAGAAAAGAGTACATTTCTGCATTTAATTTTGGGAGGTTGGTCACCATTCTTTTCCTC
-GCTTCTAAATAAATGCTTATATAGCATTTAtattccagtcactttacaaatattgtcatt
-taattctcatgcaaaccaacgaggtaggaactattgttatccccattttacagatgggga
-aactgaagtacaaagagctgaagtaacttttccaaaatAGATGTGGTTTTGAACCCAAGA
-AATGTGATACAACTATGACATGAGGCAGTCCCAATGcattgaatccttatgactgcaatg
-caagggaggtataattaactgcattttatagatgcagaaactgaggcttgaggctatttg
-gtgtttctggtgtagatctaggagccaaactccagcctacctagactctttgcctctgct
-gtacccctggaccatgTGTTAGGAATTCTTGGTACAGGGTGGTAGTGCTCAATATGGTAG
-TGgttttagtctgttttctgttgcttataacagaatgtctgaaactgaacaattttgaaa
-gaaaaggaatttattccttacagctatggaggataggaagtccaagattgagggggcact
-tctggtgagggccttattcctggtctctgaagtgtctggaggtggcacagggtatagcgt
-ggagaggggactgggcatgctgacatgctatgctttggtctctcttcctcttcttataaa
-gccaccagttctcctcctgtgaaaacccacaaatccattaatccatgagtgggttagtcc
-attcataagggcagaggcttcatgatccaatcacttcttaaaagtcccaaccgctcagta
-ctgccacattgggggattaagtttccagcacatgacatttgggggacacatttaaaccat
-agcagtagccatttgccacatgtggttattgagcacttcaagtatggctaatgtggctag
-tgtgactgagaattttttattttattgaatattttaatttttttttttttttttgagatg
-gagtctcactctgtcgcccaggtcagagtgcagtgtcatgatctcggctcactgcaacct
-ccgcctcccggggtcaagtgattctcctgcctcaacatcccgagtagctgggattacagg
-tgtgtgccaccatgcccggcaaatttttgtatttttagtagagacagggtttcactgtgt
-tagccaggacgatcttgatcttctgacctcatgatccacccacctccgcctcccaaagtg
-ctgggattacaggcatgagccactgcgcccagcctcacattatatttctattggaacaca
-gaaTGGTCTAGAGAATTGGGATTTGACAAACCCAGCTGTGACAAGTCACCAAAATTTGGG
-GGCCATACCCAGGGTGCCGTTCCTGTCACGATACCCATAGGTCCATGTGGAGGCTGCAGG
-GATACAAAGCTCGTGAAATATCCCAGGATGgcatgggcactggagtcagctgccccaagt
-tcaaatctgaaatcagtctttttgttttttttttttttttgagatgcagtttcactcttg
-ttgcccaagctggaatgcagtggcgcaattggctcactgcaacctccgcctcctgggttc
-aagcgattctcctgtctcagcctcccgagtagctgggattacaggtacatgccatcacgc
-ccggctaaatttttgtattcttagcagaaaccgggtttcaccaccttagccaggctggtc
-tccatctcctgacttcaggtgatccgcctgcctcagcctcccaaagtgttgggattacag
-gcgtgagccaccgcgcccagcctgaaatcagtcttatacgaccagctgggtggtcttggg
-taggtcccttaccttaactcttcttgtctgcagaatggaggtgacttactgtttttctct
-gtctccctttcacatctttgcactcttcaccccttctcttccctcagcttttagtttaaa
-catcacctttctgataagccctgctgaaaatggccaccctcagtcatgacggagaacaag
-tctttcctattttattcaagaaaatgcatgatgcaatctattttaaatgatcatggtttt
-aattttattttcctgataatggtctatctctccactgatttataagatttgtaagagcag
-gggtggatcattctggtcactgctgagtccccagcatttagaacaggggctgacacaGCA
-CAAAACAACGTTAGTTGGGAATGTACAAGCAAACCCAGCACACCTTCAGAGGGGTGCTCA
-GGAAACAGCCCTCCCAcctttcttcacccctcacagctgtgggatcttcctaaccatttc
-ggtgtcccaggatagaggatgagtttattcacccctccccagcaggggagttgccaggat
-taaatgagatCCCAGAATGCCCTGGTATACCCTGAAGGCTCTGGGACACAGGTGAGCTGG
-TCCCCAGGGATTTGGAAACAGGAAAACAAATATGACTCCACCCTGCCTCCCATCCAGCCT
-CTGCCTAGAGGAGTTATtttattttattttactttttttttttttttgagacggagtctt
-gctctgtcgcccaggctggagtgcaatggcgcaatctcagctcattgcaactcctgcctc
-ctgggttcaagcgattctcctgcctcagcctcccgagtagctgggactacaggtgtgttt
-tttgtatttttagtaattttttgtacttttagtagaaacgggtttcaccgtgttagccag
-gatggtcttgatctcccgacctcgtgatccacctgcctcagcctcccaaagtgctgggat
-tacaggcataagccaccacgcccagccTCTAGAGGAGttattttacttacttacttattt
-atttattacacaggatctcactctgtcacccaacctggagtgcagtggcacaatcacgtt
-tcactgtaacctgaactcctgggctcaagtgatcctcctacctcagcttcctaagtagct
-gggaccacaagctcgtaccaccatgcccgctatctttttctctttgtaaagacagggtct
-tactatgtcatccaggctgttctcaaactcctggcctcaagcaatcctcccgtcttggcc
-tcccaaagtgctaggattacagacatgagccagctcacccagctGAGGAGTTATTTTTTG
-ACACTGGTGAATTCAGATCAAAAGGGATTTCTAAGAAAGGTGCTGGACCCAggccgggcg
-cggtggctcatgcctgtaatctcagcactttgggaggccgaggcaggtggattatctgag
-gtcaggagttcgagaccagcctgaccaacatggagaaaccctgtctctactaaaaataca
-aaattagccaggcatagtagcgcatgcctgtaatcccagctacttgggaggctgaggcag
-gagaatcgcttgaacccgggaggtggaggttgcagtgagccgagatcgtgccatcgcact
-caatcctgggcaacgagtgaaactctgcctcaaaaaaagaaaaaaaaagaaaGGTGCTGG
-ACGCCTAGGACGCAGAGGGGTGTTTCACCCCAAATCAAGTAGCACCAAGCCCTCCCAGGC
-CTTGGGTGCAAGCATATTAAAGGCCTCTTTCCCTCTCTGTCTCCATTGTTTACACTCCac
-tgagcatccgcaatgtgccacacactgttctaagcgtcttacacatattaaattatttaa
-tcctcacaacaactttatgaagtgagcgcaattatgagcccattttatggagcaggaagt
-tgaggcagggttttaggtagcttttctggggtagcactgtgggttggagcggaggtggag
-tgcactcttaggccagctggctctaggggctcttcaccactaggccgcactgCCTCTAGC
-AAAGGGACGCGGGGAAGCTCAGCAGACCTTAGGCCTCCCAAGGGCGCCACGGTGGTTCCT
-TTGAGCCCAGAGTCAGCTCTTAAGTCCATAGGCCTTCCTGAAGCTTCTGAACCACTTGCC
-CATAGCTGGGCCTCAGGCTGGCTCTCAGTAGAATGTGGAGAATGGAGATTCCCGCATGTC
-CACTTCTCCTAAAGGTTTTATAAGGCAGTGCTGGGAATGTGCTTTATAAAAAAGGGGAAG
-CACCCCGACAACAGTCACTGTTTGctcttttaagcaccatcctgagaaggaggaatgttc
-ttcccatttcataggtggggaaaccgaggctcagaagagcaaatttttggccgggcgcgg
-tggctcacgcctgtaatcccagcactttgggaggccgaggcgggtggatcacgaggtcag
-gagatcgagaccatcctggctaacaaggtgaaaccccgtctctactaaaaatacaaaaaa
-ttagccgggcgtggtgcgggcgcctgtagtcccagctactcgggaggctgaggcaggaga
-atggcgtgaacccgggaggcggagcttgcagtgagccgagatcgcgccaccgccctccag
-cctgggcgacagagcaagactctgtctcaaaaaaaaaaaaaaaaagagcaaatttttttt
-ccaaggtgatagggagagtccgtggctgaTGTCTGCACTGACCAGACGCCCCTAGGGGGC
-CAGCGAGGGCGGGTCCCAGGTGCAGCGGATGCAGAGGAGAGAggcccgggcgcggcgcgg
-gggATGGTGCGATCCCGGGCCCGAGGGCATCAGACGGCGGCTGATTAGCTCCGGTTTGCA
-TCACCCGGACCGGGGGATTAGCTCCGGTTTGCATCACCCGGACCGGGGGATTAGCTCCGG
-TTTGCATCACCCGGACCGGGGGCCGGGCGCGCACGAGACTCGCAGCGGAAGTGGAGGCGG
-CTCCGCGCGCGTCCGCTGCTAGGACCCGGGCAGGGCTGGAGCTGGGCTGGGATCCCGAGC
-TCGGCAGCAGCGCAGCGGGCCGGCCCACCTGCTGGTGCCCTGGAGGCTCTGAgccccggc
-ggcgcccgggcccACGCGGAACGACGGGGCGAGGTACTCGGCGGGGTGCGGCCTGCGGAC
-TcgcccggaggccggggggcgggagggggcggccggggAAGGGGGCGCCGGAAGCCTCTG
-GGCGTCTGCGTGTTGCCGCGTGTTACACGCACGCACGCCCCTTACACACCTTTTCACAGA
-CCCCGCCGTCGGGGCGCGGCCAGGTCAGATCCCTTTTGATCCGGGCCTGGGCTGAGTGCT
-CCCCCCGGGCTTCAGGTGACGCGGCCCCGCGGAGCGTGGGGTCGCCCGAGTTGGGCTGGG
-GAAGCCAGGGACGGAGGTGTCCGGCCGTCACCCCTAGAGGAGGGCGTGCGGGGGTCTGTT
-TTGCGTGAGTGCGGGATAGGGGAGTCGTGTGGTGCGGTGAGGGGCTTGTGGGGGGCACTG
-GAGGACTCTGGGGGTGGCGGGGGATCCGAGGGGGTCCTCGTGAACCCGCAGGGGAGAGTC
-CTGGGTGAGGGTGGGTCCCGAGCACCTGTGTCTCAGGAGATGGTGAGAGCTGTCTGGAGG
-GCTGGGCACTTGGTGGCAGGGGTTGGCGGTGCAGGGGACACCGCCGGGACAGGGCTGGGG
-TGCCCTGGAGCGGGGGAGCCGAGGGAGTGGGAGCGGGGGCGCAGCGCGCGATCTCTGGCC
-CGGCAGGGCCGCTGGTTCTCCCCAGTGCGCGGCTCCGGGTTTGCAGGTGGACGGTGCGCG
-CGTGTCTGCGGTGTGTGCTGTGCCTGCAGACCGGGGAGGGCGGGGGACGACAGCCACCTC
-CTTCCCTCTGCCTCACCCCCCTCCTGTCCCAGGGCCGCGCTTCAATTTCCGCTGAAACTT
-CTGACTCGGACACCCGCCGCCTTTCGCTTGGGCTCCCACGGGAGGGGCCTGGCTGCGGGG
-GGCGGGGCGGGGTGGGGGTGCGGCCTTGCTCGGGTAGACCATGGGTGTGACAGCTGGGAG
-GGCtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgtgCGCGCGCGCGCTTGCGCTTGATGTA
-ACCCGCCCTCATTTCCCTGGGTCCCGAGTGTGGCAGGGAACAGCAAGAGGTAGATATTAG
-GGGCTGCTTTCATTCCACATCACAGATTCTATTCTGCAGTGTGGTCTGCAAAATGCCTTG
-CCCAAGATGTATAGACTCAGTTACCGCATCTGTCCCCATCTGGGTGGAGCTTATCCCAGG
-CCCCAACAGGCTCTGAGGGATGGCCGGGGCCAAGGCAGCCTGGACTACTGATGTGGCACA
-GGCCAGAGGGACTCCAGGCAGTCTCCTGCTGCACAGGGCACAAAGCATGTGCACAGCCAG
-GTATCATCCTGCGTGACTCAGAACAGCCTTGAGATGTAAGGAGTGTCATCCCAGCCTCGA
-ACCTGGGGAGCTTTCTAAGACTCCCAAGGATGGTACTTATGCATCTTGCTGTGAAGAATA
-ACAGGATGAGTGCtaataatgaccatttcctgacacctacctggcaacaggtccataagc
-tctacatgcttcatttgtgttttcatttcatcatcacgaaaaacctgtaagctttgcatc
-ctgttcccactttacaggaactgaggctcagaaagcttgaggaacttgaccaggggtacc
-ccccagctagaaagggtttgagacaggattagaacccaggaatatctgactacagccact
-ccttactgcaTTCTTACCAAGCCAAAGTCATGACCTTTCACTCATGTGGGGAGGCCTTCC
-CTTCCAAGGCAGCTCTTCCATTTGGGAGCAGCGTACTTGGAGAGGTGGGCCTCTGTCTGG
-TAACTGACTCATGTTGCCTTGTTAATCCTGCCTTGAACTGTTGGGAAGGTCTTTAACCAG
-GCTGAGGTCTCTCGCACCAATGCCCATACCTGGGCATGCACCTCCTTGGAATGGAGTTTA
-AGTGGGTGGGCAGATGGGTTCTAGAGAGAACCCGTCTGCCCTGACCATGCCCTACTGCCC
-TCTCCTTCAGCCACCACACACACAGTCACACAGCTGCGTGAATGGTGgctttcctttcac
-ttaacagttcactctggagatccttccaattaccctataaagagcatcctcaacctttta
-aatggctgcacattgttccgttgtgtggatgaagtataatttatgtaaccagccctgtaa
-ttatagacagccaattatttctgtcaaaagggctgcaggaataactgtgtatttgcatgc
-ttacacacacacacctctacagaataaattcttagcaatgggattaattgctgaatcaaa
-gctcacacgcttttcatcgttgtttttgttttgttttgttttgctttgttttgagacagt
-ctcactttgttgcacaggctagagttcctgaccatggctcactgaagcctttaccttctg
-ggctcaagtgattcccctacttcaacctcctgcatggctgggactacagctgtgtgccat
-catgaccagataattttttttttcttagggacagggtctcgctacgttgcctaggctggt
-cttgaactcctgggctcaagtgatcttcctgcttcagcctcccaaagtactgggattaca
-ggcatgaagcactgcacccagcctgtttttcattttgatattgtcaaaatgcactcctca
-gaggtggtaccttttatcctcccactagcactgtCTTCATTGTTAGTGGCTGCACTGCCA
-CTATTCCACAGTATAAACCCACTTTTCATGACACTGCCAAGACATAAGGGTCTGAAATAC
-TTAACAGTTTTCTTCCACAGTCCCCAAAATACAGGCTtctcccccagctcaggacatgaa
-gccatcatccctcctcattgcaggagccaaaggctggacctcacctcgattccaccctct
-ccttcacccctcacatccaatccatccagtccatccagtctgccactgagtcctcttgat
-cttcctcctatgagcccttaacttcgcgtctccatctagcaccccctagtccaggtcacc
-ttctcctgcctggactcgtgcttgtgtgggcctcctagctagtctcactgccccgtcttg
-tactttcaaatccaccctaaaagcatgatgttcccctgctgaaatccttcagtggctccc
-cactgcctttggataattccaaatcctattgtgtgttaattaggattaggctcagctgta
-atatagaaacagccacttaatagctaaaatgaaatagacgtttttttcttctttttctct
-ttttttgagacagagtcttgctctgtccccaggctggagtgcagtggcgagatctcagct
-cactacaacctctgcctcccaggctcaagtgattctcctgcctcagcctcccgagtagct
-gggactacaggcatgcaccaccatgcccacctaatttttgtatgtttagtagagatgggg
-tttcaccatgttggccaagatggtctcgatctcctgaccttgtgatctgcctgcctcggc
-ctcccaaagtgctgggattacaggcatgagccactgcgcccagccttcaatagatgttta
-tttctctcctgtgtaaaaaacctggaggtctggcctgacaactccatgtgtcagggacct
-aggctcctctcttgctctactgtatgtggtacttctgaagccaaggtagatgctggagct
-ccagcagttaggtccacattccagcatacaggaaaggaggaaatgaggaagttgggccct
-ccctttaagaacactgtcctgggcattgtacacaacacttccacttgtgtcctactagcc
-atatgctgatacaaggatacaagggagacaggaaatgcagtttattctaggtgtccttgt
-gctcagctgaaaatctcaggttctaatcctatgtaaggaggggagacctgaaactgggga
-ccactaaccacctctgccatatgatgctcgtagagcccttcacaatagggcctctactaa
-cctcaccttatttttatttatttatttatttttgagacggagtttcactcttgtcgccca
-ggccggagtgcaatgacactatctcagctcaccgcaacctttgcctcctgggttcaagca
-actctcctgcctcagactcctgagtagctgggattacaggcgtgtgccaccacgcccggc
-taatttttgtagttttagtagagacggggtttcaccatgttggtcaggctggtctcaaac
-tcctgacctcaggtgacctgcctgcctcggcctcccaaagtgctgggattacaggtgtga
-gccaccacgcccggcctattttttttttttttttaacttttcacttttttttgcagtcac
-gctcattctccaccgtgttcttggggaacatgcagcatgttcttttgcctcTTCCCTCAC
-CCCAGAACAGGggttactggacagcggcatcaacttcacctgggaactggatagaaatgc
-agattcagaccttctgaatgagctactttgggagtagggcccagcaatgtatgttgaaac
-aggcctccagatgatctcaatgcttgctcaagtttgagaaccactgAACCGCAGTATGAC
-TCTCCGTGTCAcctggctaactctgcctcactttcaggtctcagtgtagacaccacctct
-tctaggaagacctctcttgacccaccagcccaggagagaggcctctctgggttcctagag
-gcccatgcttctctgTATAGTAGGGCTGATCACACTGTATGTGAtttttttttttttttt
-tgagagagtctttactctgtcaccaggctggagtgcagtggcacaaacatggctcactga
-agcctcaacctcccaggctcaagcaatcttcccacctcagcctcccaagtagctgggact
-acaggcatccaccaccacacccagctaattaaaaaaaaatttttttttgtagagacaggg
-tctcactatgttgcccaagctggtcttgaacttttgggttcaagcagtcttcccaccatg
-gccttccaaagtgctaggattacaggtgtgggccactgcacctagccTTGGACGTGATTT
-TATTACTCATCTGCCCTCCAAATTGACTGGAAGATCCTGACGGCAAGACTGCTGTCTAAC
-CTACTTCTCTTCCTAGCACCCAGTGTTAAGTGAATGAACAAGATCATATCTCTCATCTGT
-GAATGTACGAGAGCCATGGATTATGAGATTAGTTGATTTTCTTAACTATAATTTTTAGAA
-ACAAGCTGTGTTTTTAAGCAGGTATTTATTTCCTTAAATGTACATTTCTGATTACAAAAT
-ACttttttttgagacagagtcttgctctgtcacccaggctggagtgtagtggcacaatct
-cggctcattacaacctctgcctcctgggttcaagcgattctcctgcctcagccttcccag
-tagctgggattacaggtatgcaccaccacgcccggctaattttttttttctcccgtgacg
-gagtcttgttctgttggccaggctgaagtgcagtggtgtgatctcagctcactgcaacct
-ccacctcccgggttcaagtgattctcctgtctcagcctcccaagtagctgggattacagg
-cccacgccaccacgcctggctaatttttctatttttagtagagatggggtttcaccatgt
-tggccaggctggtctcaaactcctgacctcatgatccaccaccttggcctcccaaagtgc
-tgccgtgggctgcactttggcattgccttggtcacgtgctgctacctgggattacaggca
-taagccactgcgcctggcctaatttttgtattttttagtagagacagggtttcaccatgt
-tggccaggctggtcttgaactcccagcctcatgattcgcccaccttggcctcccaaagtg
-ctgggattacaggcgtgagccaccacgcctggccAGGAAATACATTTACATGGCTCAAAT
-TCAAAACTATAAAAGTCggccaaacatggtgactcacatctgtaatcctaacactttggg
-aggctgaggcaggaggattgcttgagctcaggtgagaccagcctaggcaatgtagggaga
-cccccatctctacaaagaataaaaaaaaattagtcaggcatcatagtgcacacctgtagt
-cccagctacttgggaggctgaggtggaagaatcacctgaaccctgaggtcgaggctgcaa
-gtgaactgtaatAGTAAGAGTCTCCTCCTAATCTTGTGCATCCTTTCAGAGAGAGAGATG
-atagatattcaaacaaatacatacatatatataacatatttatatatattctttttaaca
-taaaagtatagccaggtgtggtggttcactactagagtcccagctacttaggaagctgag
-gtgggaggttcacttgaggccacgagtttgagaccagcgtgggcaacatctcttggggaa
-aaaaaaaaaaaaacccaccataaaagcattctataacacgtaattctgtgtttgtctttc
-ttctcttaatacatcttggagatcagtacgcatcagtatatagagagcttccttgtcctt
-tttcagggctgtgtagtattctgctgtatggctataccatgatgttttcactagctttct
-actgcctgacatttgggatatttcctgcttttgctattggacacaaggctctgatgaaca
-gcctttactatatttaatttttttgtgagaagtttaactggaagataaattcccagaagt
-ggggcacccagttaaggatatgtgactttgtcattttaacacacactgccagatcacccc
-ctataaatgttgtgccacgtatcctcccaccagcaGGGGAAAGGAGGGGCCACCAAGCAG
-TCTCACTTTAGTGCTTTTCTCTCCTTTTTACCAGATGCGAGCCACCCCTCTGGCTGCTCC
-TGCGGGTTCCCTGTCCAGGAAGAAGCGGTTGGAGTTGGATGACAACTTAGATACCGAGCG
-TCCCGTCCAGAAACGAGCTCGAAGTGGGCCCCAGCCCAGACTGCCCCCCTGCCTGTTGCC
-CCTGAGCCCACCTACTGCTCCAGATCGTGCAACTGCTGTGGCCACTGCCTCCCGTCTTGG
-GCCCTATGTCCTCCTGGAGCCCGAGGAGGGCGGGCGGGCCTACCAGGCCCTGCACTGCCC
-TACAGGCACTGAGTATACCTGCAAGGTACGTGCCCATGGGCGGCTGTCCCCCAGCACCAC
-AGGAGGCCTGGGAAGGAGGCCTCCAAAGGATTGCCAGGGTGCAGAGGGGTCCTTATGTTC
-ATTCATTCTTGTGTTTGTTTAGTGGGGAAGCATCCAGGGAGCCCCTGCTGGACTGATACT
-AGAGAGGTAAACCAGAGGTCGTCCCAGTCCTGGGGGAGTTCACAGCTTAGGCCCTACAGT
-GTGATAAATGCTGCAGGGGTAGAACTTAGGGATCATGGGCGCAGAAaaggccgagcagaa
-gttagccaggtagaagtgggagatgggagttgcaggcagggggaacagctgttcaaaggc
-ctagaaaagtgaggggatagcactttagagaatgaaaaggacttctctgtggccagagtg
-gagaggatgtgcagaaaggggcaggagatgaagGTTGGCAGCAGCTGGTCATGAAGGTGT
-TAACAAGGGGCCTCCACTGGGCTGTGCGGAGCTACTGAAGATGTTTGCACAAGAGAAGGG
-TAGGGCATGGTAGACATCAAAACTCCTgggacctcggaggtgatcgagcctaacctgggg
-ccattttacagataggaagactgagatgaagacaggagaagggccatgcgtgaagtcaca
-tagcACTGGGCCTGGCTCCTGGGGTAAACTAAGGGGTAGAAAAGTCTGAGGATTCCTGGC
-AGAAACCAGGAAATGGACAGGGTCAAGGCCCCTGAGGGTCAGCCCATGCAGGACACTGAC
-AAGTGACAGTCCAAGAAGACAGAGATGAGAATAAAAAGTGTAACAAtaggtattcactgt
-gcaccaggtactatgatgattgcttagtgtgcacaatctcttttaatcttgacacaacca
-atgaggtggtttctatcattgtgccccttttatagatagaggacactgagactcagaaag
-ccatggttacttgccacatgacagagccaggtggtatcagagctgggattgggcccagga
-ggctgagcccagagagtcctgtgcccGTGCTAGGATAAGCGTTTCACACAATCAGGGCAG
-GCTGCCCTGGCAGGCAAGCATAAGGAAGATAAGGGGGACCTGGAAACCCAAGGGAGAGTA
-GCGGGGGCCTGGGTCCCTTGGGAATGCACAGAGAAGCAGAAGGACTTAAGCCTCCTCCTG
-GGGCAGCAGCAGAGCTTTGCTCTGTTGACGGAGATGCAGTGAACAGCGGGGCAGATCCAG
-ACAGGGTCCAGCCCCTAGCTTCACCTGGCCTCTTGTGCACAGATCTCCAGCGCCCTTACC
-AGGTGCCCTAAGGAGCCCAGAACTCTGGGTCCCCTTCCTGCAGCATCACAGGCTCTTTTC
-CACTCCCGCTGGGGAGGTGAGTCCATGATAAGAGGAATAACCCAAGCAGGCTCAGGAGAG
-AAGCGCCATGCGTTCACAGGGCCCTGATTCTCAAGAAACATTTGGGAAAATCCACTGGAA
-CATACTCACCCCTATGCCAATGTGCACCATGGGTGCTGAATGGTCATTTCCACACTTCCT
-CAGCTTTTCTGGTCAGTGTGTAGAAAGATCAAAATCTTGTCTTTGTAAATGATCAACTTa
-ttcattaattcaacacaacttcattgagcacccgtatttgccatgtaccatgctgtggtt
-aaaaaacaaagttctgttctcatcaagctgacgttctagtgggagatacagacactaaac
-aagcgaataagtaaaatacgtgtcaggtggccgggcgcggtggctcacacctgtaatccc
-agcactttgggaggccgaggtaggcagatcacctgaagtcaggagttcgagactatcctg
-gccaacatggtgaaaccttgtttctattaaaaatacaaaaaattagccgggcatggtggc
-aggggcctgtaatcccagctactcgagaggctgaggcaggagaatctcttgaacctggga
-ggtggaggttgcagtgagccgagatcacaccactgcactccagcctgggcaacaagagca
-aaactccgtctcaaaaaaacaaaaaacaaacaggaaaaCCCTTATTCCAGCATCTTTCTT
-GGTTCCTTTGCAATGCTTATCAGCATTTGTCAATATTTGGTTTCTGGGCATGTTTGCATG
-GCCTCCCAGTGGGCACCGGAGAGCAGAGCCCATGGCTGTCAGTCTAGCTGGACATGTGGC
-TGGCCCGTGCAGGCCCAGGGCCAGCATACTGAATGAATGAAAGCGTGGGTGGGCAAAGAG
-GACGGGAGCTGTGACGGTGATGAGCATCAGGTGCCTTCTGCATCATCCGCCCTTCCGGAT
-TCCTCCTGCTTTGTGGGTTATTTTTCTGTTTGGGTGACCTGTTACTTTTCAGTTATCCGA
-TGTTTGAGGCCAtatagcgtagcagttaagagcacagacaaaaggccgggtgcagtggct
-cacacctgtaatcccagccctttggaaggctgaggcgggaggatcacctgaggtcaggag
-ttcgagaccagcttagccaacatgatgaaaccccatctctactaaaaatacaaaaattag
-ctaggtgcggtggcacatgcctgtaatcccagctacactgggggctgaagcgggagaatc
-acttgaatccaggaggcggagtttgcagtgagctgagattgcgccagtgtgctccagcct
-gggtgacagagcgagactccgtctcaaaaaaaaaaaaaaaaaaaaaaagcacagacagtg
-gagtgcatacgtgcaaatctcagccgtgctgtttgctggctgtgtggcctctcagcttcg
-ttaaccgtaaaatggagcaagtcatcctaccttataggaccatggtcagggctgagtgac
-tcggtcagtgaagcgcttggtgcgatgcctagcacatggtagtgtctaataGGTCAGCTG
-TGACTGTTTGCAATGCCAGCCTCAGCTCCCGGGAGTCCCCAGCTGTGCTAACACCATGCT
-CTGCCCACAGGTGTACCCCGTCCAGGAAGCCCTGGCCGTGCTGGAGCCCTATGCGCGGCT
-GCCCCCGCACAAGCATGTGGCTCGGCCCACTGAGGTCCTGGCTGGTACCCAGCTCCTCTA
-CGCCTTTTTCACTCGGACCCATGGGGACATGCACAGCCTGGTGCGAAGCCGCCACCGTAT
-CCCTGAGCCTGAGGCTGCCGTGCTCTTCCGCCAGATGGCCACCGCCCTGGCGCACTGTCA
-CCAGCACGGTCTGGTCCTGCGTGATCTCAAGCTGTGTCGCTTTGTCTTCGCTGACCGTGA
-GAGGTGAGTGTGGTCTCAGAGACCCCAGCCACAGACACACCCAGGGGGTGGGCCATGATG
-GAGAGAAACCGAGGCCCAGGAAGGCAAGGTAACTTAGGCAAGAAGTGGGAGAAACTGAAG
-TAACCAGCAGCCCCTGTTTAGTTCCCTGAGAAGAGTTGACTCAggccaggtgcagtggct
-cacgcctttaatcccagcactttgggaggccgaggtgggtgaatcacttgaagtcaggag
-ttcgagaccagcctggccaacatggtgaaactccgtctctactaaaaatacaaaaattag
-cctagtgtggtggcgcacacctgtaatcccagctactctgaaggctgaggcaggagaact
-gcttgaacctgggaggcggaagttgcagtgagccaagatcacgccactgcactccagcct
-cggcaacagagtgagattccatctcaaaaaaaaaaaaaagaGTTGACTCAGTCCTCTTGG
-GAGCCCCTTGGGATTCTGGGATGGAGCACTGAGATGTGAAAGTCATAGTAGCCGACAGTG
-ACGAAAGCATCGCCACATTATCTAACGTGGTCttccatccttacaaacacgaggcaggta
-ctgttattatccccatatgatcaaggaaactgaggcccagagagctcaagtaacttgccc
-aagatcccatagcagaataaatggtagagctgggatttgaacctagatctgactccagag
-cctgggtcttaaTTCAATCTGAGCTTGAGAGGCAGGGGcctggctgggcttaccaactga
-ctttgggtgacctagtgtctctgagcctcagtttctccgttggtaaggaaaagggctgga
-ttGTTAGGGTGTTTTCAGGATTCCAAGACCACAGCCAAAATAGGGTCTGAGGTTCCCCAC
-ACGGGAACGTTTTCTGTGAAACTGAGAATTAGCACTTTTTGGTTAAAAGAATCTTCCTTC
-TCTAGGTTGGGATGCTAAGAAtttttttttttttaattgagacagagtctcactctgtca
-cccaggctggaatgcaatggcgcgatcttggctcactgcaacctctgctgcctgggttca
-agtgatacgcctgcctcagcctcccgaatagctgggactacaggcatgcgccaccatgcc
-tggctcattttttctatgtttagtagaaacggggttttgccatgttggccaggctggtct
-tgaactcttgaccttaggtgatccgcctgcctcggcctcccaaagtgctgggattacagg
-tgtgaggtactgcacccagccTAGACGCTAAGAAAAATTTTTAAAAGATAATTCTGGGGA
-GAAGGGCAGAGAGACTCGCCTCCTGTTCCCTCTCCAGATTCCTGGGGGCAGTCAAGATGT
-GTCAGGGAGTGCACTAAGCTGCCAGTTACACAGGAGTTTTCTGTGGAGAAAGGAGTGTGA
-CCCCATGGCATTTTAAAAAACtttttatcttgaaataattttagacttttagaaaaccta
-caaaaatagttcaaagagtttctgcatatcctttaaccagtgctctccaatgttaacacc
-tgacgtagctatggtacaattacccaaactattaactaagccacagattgattcccactt
-cccgagtttcccactaacaccccttgctgtgcaggatccagtgaggatcccaatttagtc
-atcagtggtttccttggtctcttccaatctgagacagttcctcagtctttccctgtcttt
-gaagacccatgaccttgacacttttttttttttgagacagggtctcactctgtcacccag
-gctggagtgcagtggtgtgatcacagctcactgcagcctcaacctcccgggctcaagtga
-tcctcccacctcagcctcctgagtagttggttctacaggtgtgtgccaccccacctggct
-aattgagatggggtcttgctatgttgcccaggctggtctcagactcctgagctcaagcaa
-tctgcctgcctcagcctcccaaaatcctgggattataggcgtgagccactgctcctggcc
-ataaccttgagacttttgaagagtactgatcagttactttgtatgtccctcaatttggat
-ttgattgatgttttctcacagttagattgcagttatgtatttttggcaagaacaacacag
-aatcgataggcccctctccacatcatatcaagagatacttgagctgatagtcattcctat
-gtcgtgaccttgatcacttggttagggcaggacctaccaggtttctctactgtaaggtcc
-taatttaccctttgtaattgacaaataccttgggggaggtaagctaggcatataaatatc
-ctgtttttcctcaactttcacccactaattttagcagccatccatcttgcctatagcagt
-tattattgtggtgcttgcctaagtctaattttctttttcttttttttctttctttctttt
-ttttttttttttgagacagagtctcgctctgttgcccaggttggagtgcagtggcacgat
-ctcggctcactgcaacctccacctcccgggttcaagtgattctcgtgcctcagcctcttg
-agcagctgggattacaggcacacaccaccacacttggctaatttttgtatttttagtaga
-gatggggttttgccatgttggccaggctggtctcgaaatccgcctgccttggcctcccaa
-agtgctgggattataggcatgggccgctgcgcccagccCCCAAGGCTGATTTTCTGTTAA
-TATTTCCTTCTACATTTTATATTAGAACAAGCATGCCTTTTTTAAAGAAGTAACATTTAT
-AATGATGTTTAAGCTAGTACATAACTTCAAACACATTTTAGGCTTAGGGTAGATACAACT
-ACCCCGGACCTCCTGGAGGAGACAGCGTGCTTCCTGCTCTTTTCAAGAAGTCACTTgatg
-gcccacacctgttatcccagtgcttcgggaagccaaagtaggaggactgcttgagcccag
-gagttcgaggccagcctaggcaacacagaaaaccccatctgtacaaaaaatttataaaaa
-ttagccaggtgtggtgatgcacacctgtgatcccagctacttgggaggctgaggcaggag
-gattgcttgagcccagaagtttgaggctgcagtgaactaggattgcaccactgcactcca
-gcctgggtggcagagtgagaccctatctctaaagaaaaaaaagaaaaaaaaaaagaaaaA
-TCACATGagagtcattggtagaagagggaccgtgagttagatagacctgtgtttaaatcc
-tgggttctgcttcttacctgctttttggccctgagcaaatgacttcacctgcctgagcct
-ttgtttcttcatctgtaaaatgggctaataatgctgacACCCCTTGTCCCCCAATACTGT
-GATTCATAGGATTGGTCAGTATTTGTGAAATGCCACTGGACACCCAGGAAGTAATGCCAT
-AAAGAAGAAACTAATAGCAGTGGTAATAGAATGATTACTATTAAAGTCATCTTTGAGTGC
-TCAGTGGAAGTTGTTTAAAGTAGAAATTGCAAATGGCAGGACACACtttttttttttttt
-tgagacagggtctcactctgtcacccaggccggagtgcagtggcgcgatctcagctcact
-gcaaccgccacctcctgggctcaagtcatatccttctgcctcagcctcccaagtagctgg
-gactacaggtgcgaatcaccatgcctgctaattttcgtattttttgtagagataggtttt
-taccgtgttgcccaggctggtcttgaactcctgaactcaagtgatccccctacctcggcc
-tcccaaagtgctaggattaccggcatgagccaccgcgcccagccTTACACACTTTTTTTT
-TTGCCCTGCTTACCTGTTTGTGTTTTTTATATAAACTGGTTGCCAATATTTTTTAAATGG
-GGACCTTTTCATTAAAATACAATTCCTGGCTTCTCTTGGGGAAAACAATGGGAATGTGGG
-GCCATCTTGGGAACTGCGAGGGTGGGTCACAGCACTGGCTCTGAGTATCTGCCAGCCAGC
-GTTCCCATCCCAGGCCCATGCtctacagctgtaaaatggtgtcttccttgcaggctgtag
-cctagatagaatgaggtgagccaggtaatgagctgggtcaagggccaggaacacagcagg
-cacttggtaaaCCCTAGAATGCGTTGTGTACCCTTTTTAGGTAGCGCTTGTGCTGAGATG
-TCAGGCACACTTCCTGTTTCTCTCATCTTATTACCTGCCTGGACCCTAAGTTTGTAGCTG
-GTTTAAGAGAGGCTTAACCCTCTCAGCCCCATCAGCCCCCTCCCCAAGGGACTCTGTTGA
-AAAATGTATTCCTTTCAgaattttagtttaaatttaattgctctgtggccttaaatgact
-taacctctctgagcctgggcttgggtatctgtaaaacaggATCAGACATCACAGGACTGG
-CTTGTGTCTGTCAAAGGCCAGCAGGCACTTGGAAAGTGGGTGCCACAAGGGTGATAGCAT
-GGGGTGGTGGCATGGGGGTTCTGGGTAGGACCTGACCCTTCTGTTTCTCCCCATGTCCCA
-GGAAGAAGCTGGTGCTGGAGAACCTGGAGGACTCCTGCGTGCTGACTGGGCCAGATGATT
-CCCTGTGGGACAAGCACGCGTGCCCAGCCTACGTGGGACCTGAGATACTCAGCTCACGGG
-CCTCATACTCGGGCAAGGCAGCCGATGTCTGGAGCCTGGGCGTGGCGCTCTTCACCATGC
-TGGCCGGCCACTACCCCTTCCAGGACTCGGAGCCTGTCCTGCTCTTCGGCAAGATCCGCC
-GCGGGGCCTACGCCTTGCCTGCAGGCCTCTCGGCCCCTGCCCGCTGTCTGGTTCGCTGCC
-TCCTTCGTCGGGAGCCAGCTGAACGGCTCACAGCCACAGGCATCCTCCTGCACCCCTGGC
-TGCGACAGGACCCGATGCCCTTAGCCCCAACCCGATCCCATCTCTGGGAGGCTGCCCAGG
-TGGTCCCTGATGGACTGGGGCTGGACGAAGCCAGGGAAGAGGAGGGAGACAGAGAAGTGG
-TTCTGTATGGCTAGGACCACCCTACTACACGCTCAGCTGCCAACAGTGGATTGAGTTTGG
-GGGTAGCTCCAAGCCTTCTCCTGCCTCTGAACTGAGCCAAACCTTCAGTGCCTTCCAGAA
-GGGAGAAAGGCAGAAGCCTGTGTGGAGTGTGCTGTGTACACATCTGCtttgttccacaca
-catgcagttcctgcttgggtgcttatcaggtgccaagccctgttctcggtgctgggagta
-cagcagtgagcaaaggagacaatattccctgctcacagagatgacaAACTGGCATCCTTG
-AGCTGACAACACTTTTCCATGACCATAGGTCACTGTCTACACTGGGTACACTTTGTACCA
-GTGTCGGCCTCCACTGATGCTGGTGCTCAGGCACCTCTGTCCAAGGACAATCCCTTTCAC
-AAACAAACCAGCTGCCTTTGTATCTTGTACCTTTTCAGAGAAAGGGAGGTATCCCTGTGC
-CAAAGGCTCCAGGCCTCTCCCCTGCAACTCAGGACCCAAGCCCAGCTCACTCTGGGAACT
-GTGTTCCCAGCATCTCTGTCCTCTTGATTAAGAGATTCTCCTTCCAGGCCTAAGCCTGGG
-ATTTGGGCCAGAGATAAGAATCCAAACTATGAGGCTAGTTCTTGTCTAACTCAAGACTGT
-TCTGGAATGAGGGTCCAGGCCTGTCAACCATGGGGCTTCTGACCTGAGCACCAAGGTTGA
-GGGACAGGATTAGGCAGGGTCTGTCCTGTGGCCACCTGGAAAGTCCCAGGTGGGACTCTT
-CTGGGGACACTTGGGGTCCACAATCCCAGGTCCATACTCTAGGTTTTGGATACCATGAGT
-ATGTATGTTTACCTGTGCCTAATAAAGGAGAATTATGAAATAATTTTATTTTTCTCTGCA
-ATTTCTTCCATCCTTTCCAACGATCTCTTACCAGTTTTTCCTGCCTTCAAAACTGGCCCC
-CATGGTGAAAGGCCGTAGAGTTGTGTCTTAACCTGGGCTGAGTGGTTTGTGAGAACAGAT
-TACCTGGAGCCCAGTGGGTCTTCCTGCACTCCTTCTGTTTCTTCTGGCAGCAGCAGTGTC
-TCTATTAGGGTACTTTCTGAGTCaaaatggcttcaacaagatggaaatatgtttcacaca
-aaacaagaagtcagcagatagggtgggcttcagtgctggtccattcaactcccaaagctg
-cgcacagggaccccggctctccaggctccttctgtctctTGGCTGTATTGTCTCGAGACT
-GCTGGCCCAATGGCTACAGCAGGTGTCACATTAAAGAGGTCCATGACCAGAGGAAGAAGC
-CAGGGGTCATTGtagtacctgagaactcagaactctggagtcaggctgcctggaattaaa
-tcctggctccagcactcaatagctgtttgacccttggcaagtttcttaaccactctatgc
-ctcagattcttcatctgtgaaatgggggacaatgatagtacctaacttatgagaactaaa
-tgacttattttgtataaagcaattagaacaagcagcgcctggcataataagcccacaata
-aaagttACTCCCggctgggcacggtggctcacgcctgtaatcccagcactttgggaggcc
-gaggtgggcagatcacaaggtcaggagttcaagaccaacctgaccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaatttttagtagagacggggcgtggtggtgcgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaattgcttgaacccgggaggtggacgtt
-gcagtgagccaagatcccgccactgcactcagcctgggcaagagagcgagactccgtctc
-gaaaaaaaaaaaaaTGGTGCTCCCACATTTCTTTCTTGGGATGGAGGaagctttcccaga
-agcgctcctgaccgactttcccacacatctcactggtcagaactgcatcacttgccgttt
-ctgaccaatcaccagcTTACATTCATGGGGCACGTGCTTACACTAACCATGGCACTCCTC
-GAGCTAAGTGGAGCTCATGCGTCATATGGAGGGGTAGTGACTCCTGAGCAAAACCAGGTT
-CAAAGAGGGAGGGGATCGTAGGGAAAAGAATGTGCGGAAGTgcggaggcccagccaacag
-cctgctaactgcagatactcgagagcggccaccctagatcatctgacccaggctggccca
-cgctagaattgcccagtgacccgcaaggtcatgagctaattgagctaaataaaatcattg
-tgtttttttgtttgtttgttttgtttttgttgttttgttttttgagacagagtctcactc
-tgtcacccaggctggagtgcagtggtgcgatcttggctcactgcaacctctgcctcccgg
-gttttcaaacgattcttctgcttctgcctcagcctcccgagtagctgggattacaggcac
-gcgccactacacccggctaatttttatatttttagtagagacgggggtttcgccatgttg
-gccaggctggtctccaactcctgacctcaggtgataggcccacctcggccacccaaagtg
-ctggtattacaggcgtgagccgccgcacccggccaatcattgtggttttaagtcactaag
-tttgaggctattttgttttacagcaaaagctaactgatgcaGACAGGGACAAGTCAGTCT
-CATCTCTGTGCACCCAGCATTGCCCAGAACAGGGCCTAGTTGTGTCTAGGGTCTCATGGG
-GCAGCCCCTGACCTCTATCTTGCCCCTCCCAGCTTCCAACAGACCCTGTCCCAGCTCCCT
-CCAAGCTGAGTGTTGGCCTGATACCTACCAGTGGAGCGAGGGGAACACGAGGACTGCCAA
-GGGcaggtaccgtgccaacccttcactccattccacaaagagactcatttactcctcatg
-acaatccagtgaggcagatgttcctgtcactttacagataagacaaatgagctttagaga
-gagcagaagactcatccaagacctcacaacAGAGAAAAAGACTCCTCTGGTTTTTGCCTT
-GGAGCAGGAACTTTTGACAAGGCTGCGCAGATGCAGCCACATGAAAACCGCCCATTAAAA
-ATGTAATATCggcccggagcgggggctcacgcctgtaatcccagcactttgggaggccga
-ggcaggcagatcacttgaggtcaggagttgaagaccagcctggccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaaatagccaggcgtggtggcatgggcctgtaatcccagc
-tactcgggaggctgaggcaggagaatcacttgaacccaggaggcagagattgcagtgagt
-caagattgcaccactgcactccagcctgagcgacagagcaagactctgtctcaaaataat
-aataaaaTGTAATATTCACTCTTATCAAATAATGGATGTCACCACACCCCGACCCTAATT
-AGTGAGGACTTTCATGTTCTACTTGTCTTCATTTAATCATCATTGTATAAGAGTTTTACA
-ATATCAAATTAGTAGATGTATATTACTGAAAGGGAAGGACTGTTAGAAATTTACTTGAGG
-AATGTCTGCCACTGGGGGCTGAACACAAAAGATCCTATTGTGACCTGCCAGATTATTCat
-tcacttagcaattcaacaaccatcgctgaatgcctactataggccaggtgccatgcaaga
-cagatgtgctcccaccctcaagggttcacagtctaatagaggagagagatgttaaacaga
-taactgtacagatggcaTAGCTAATTATATTCGTGGAAGTTCGTTGTGGCAAAGACAGGC
-ATCTCAATATTTCAGGAGCTCCCctatattttctagcctcccttacagtcacatgactag
-ttctgaccagtggggtgtgtgtaggagtgGCAGGCTGAAGCAATGGAGAGCTGGTGAGCC
-TCATCCCTCTCTTCCCCTGCCACAGCCACCTTGCGCCCACAAGTtcccttagctacaagc
-tggaggagagccaccagatccaccttagatttcactgagcaagaaataaagcttcttgtg
-ttaagtctttcagatttggagtttgtctggtagatagtgttaattaccatgactaaGGAA
-AATTTGCCATTAGTGAAGGGAGGAAAAATATTCTCCACCAGTAACAAGGCCATGTCAGTC
-TGCTGCATTATAAACCCCAAACAGtagtttatgatcctctgggctggcaatttgggctga
-attcagctgggtcactcctgcagctgcaggcagcaagcagctcgaatgtctaccttgcca
-ggaaggctcttctctgctccacatggcctcgtcctccaataggcatagcctactccttcc
-tatggtggtctcagggtttcagaaagcaacaagagaggacaaattccagtgttcaagctg
-cactagtgtcaaagcatatcaaatagcatgtcaaattccacatcaaattcaggatgcagg
-caaattgattctttctcttgatgggaagagctgaaaaTAATGTGTGGTCTTGTTTTTCAA
-TGTAcagtggtcccatttatccaggggggatacattccaagacccccagtggatgcctga
-aaccacagatagtacagaattctgtatataccatgttttttactatacatacatacctac
-gataaggtttaatttgtaaattaaactcttacaaattaagagttaacaacagctgggcac
-agtggctcacgcctgtaatcccagcactttgggaggccgaggtgggcggatcacgaggtc
-aagagatcgagaccatcatgaccaacatggtgaaactccgtctctactaaaaatacaaaa
-attatctgggtgtagtggcgcatgcctgtaatcccagctacttgggaggctgaggcagga
-gaatcatttgaacccgggaggcggaggttgcagtgagctgagatcgcgccactgcactcc
-agcctggtgacagagcgagactccacctcaaaaaaaaaaaaaaaacaaaaaaaacaaaca
-gttaacaataaatagaacagttataacagtatgttgtaataaaagttatgcgaatgtggt
-ctctccctcaaaatgtcctattgtactgtactcacccttcttgtgatgatgggagataat
-aaaatgcctacatgatgagatgaaggtaaatgaatgacatgggcattgtgatctagcgtt
-agactactactcacctgatgatacgtcagaaggagaatcatctcctttgggtgatccagg
-atcatgaagccgtgacaatgtccatgattggatgtcaggagcagatgatgttaatgatta
-accgtgggtaatgtctacaatatggatacagtgcaaaagggatgattcacatcctacgtg
-gaatagtgcaggattgcatgagatttcatcatgtggttggctgcaggtaactgacattgc
-agaaagcaaaaccacagatcatgggggTGGGGGTGGGGAACTACTGTACAACATGAGATA
-TATTTGATCAAATAAGATGAGGTGCACCTAAAACTTTCCCTACAGGTTGTATGCCCCTGA
-GTAAATTGCTTGGTGTCTCTGGATCTCCAGCTGTTCCCCTTCTCTCTGCATGGCTAAGCC
-CTGTCCGTCACTTGGGGCTGGACCTAGAGCCCTGCCTGGCCACTAAGCCCTCAGAACAGG
-GTTTCTTTTTTAAAAAAGACAGGGTcgggaggtggaggttgcaatgagccaaggtcgcac
-cattgcactccagcctgggtgacaagagtgaaactccatctcaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaagacagggtctcactctgtcacccaggctggagtacagtggt
-gtgatcatggctcgctgcagccttgaacacctgggctcaagctgtcccccaacctcagct
-tcctgagtagctgggagtgccaccacgcctagctagttttttaaaaaattgttttgtaga
-gacaggggcctcactattttgcccaggctggtcttgaatgcctggcctcaaatgatcctc
-ctgccttggcctcccaaagcactggggttacaggtatgaccacTACCCACAACCAGAACA
-Tttctcaaatgtgattggttgatctcctgcatccatccctggggtgcttgtttaaaatgc
-agagccctggatcctcccccaacctagagagtcagaacatctgggcttctgcatcttaac
-aagctccctgggtgatgctgctgggcctccaagttggagaacctctgTATTTGAAGAAAT
-CCGGACTCCTTGGGGACTCAAATCTTATTTCAGCTCTTCTCTGGACTAGTTTGACTTTAG
-CCTTGGTGTAAAATGGGTATACATTTTACACGCCTGTGACGCCAGGATGCGCTCACAGGG
-GAGGGAGGGCTTTATCAGAGGTCAGAATCTAAGCCACCACTACAGTTGTACTAGATCCAA
-GGAGAAAGACTCCCAGGCCTCATttcctcatcgttctctcttctcttacctggctttatg
-gttcttcatagcactgagcaccaccaggcagtgtattttatgttttttttgagctttata
-atgccagggactatgttttgtttataactgttcacccagttcctagaacagtgcctggta
-cacaggagtgctcaataaatgtttgtggaatgactgaatAAAAGTTGTTCCTGTACAGAT
-TCCACCTGCCTAGAGCAAAGCCAGGACACTGATTGGGAtgaacacatagcacatgccaga
-catggctttgagtgctttacctggatcatctcactttatatgtgacagccaaatggtccc
-cagtgaccttcaccagctgctattcacgcctttgtacagtttcctcccatcctaagctgg
-gctgaccagtgtaatgaatacaatattgtgaaatgagaaagtatgacttttaagattagg
-tcataaaatatgttatggcttctgccttgctcttctggatcatctgctctggggacagcc
-agctgccatgttgcgaggacactcaattacccctgtggaaacttacatgtggtgaggatc
-gtaggcattctgcaaataaccagcaccacccaggcacataaaagagctttcttgagtcaa
-tcctccagccccagtcaagccttcagatgactgcagccccagccgacatcttaactacaa
-cctcatgagtgaccctgagccagaaccatctatgtagctgctccccagttcctaacccac
-agaaactatgtgatagcatacatgttgattgcttttttaagcaattaattttgggaaatt
-tgccacatatcaataattaataacttgtacagattctcacaacagcctatgtgggaggag
-ccatcataattaccattgaacagagaaagaaactgaggcccagatagggggaatctttgt
-ccagggtcacacagatagtgaactgtagcactgagattggaacccaagtttgaatgacta
-gagtcTACCCACTGAGGTGAAGGTGTTCAAGTTGAATGCCAGCTCTTCCCCTGAAGGGCC
-AAGGCTGAGACCAGAAAACCTGAAACAATATAGCTGCACCCaatataaatatatgcaggt
-aactcagggctgatggtacatgaccataataaatcagcagggtcatcaggagaaaacaag
-acaacaggagcgaaaacagatagaaacaaatatgcccagagtttgtatatcagtattatc
-agacgcagattataaaacaaaatgttggccgggcacgggggctcatgcctgtaatcccag
-cactttgggaggccaaggcgcatggatcacctgaggtcaagagttcaagaccagcctgac
-caacatggggaaaccccgtctcaaataaaaatacaaaaaaattagctgggcctggtggca
-ggctcctgtaatcccaggtacttcaggaggctgaggtaggagaatcgcttgtacccggga
-gggagaggttgcagtgagctgagatcgcaccatctcactccagcctgggcaacaagagcg
-aaactctgtctaaaaaaaaaaaaagtttactgcgtttaaataaataaataacctagaaac
-attgccaaagtatagaaaattatatcacatgacaacaaattttaaaataacctaacagaa
-cttctaaaataaaataatacaataatcaaaatttttaggccaggcacagtggctcacacc
-tgtaatcccagcactttgggaagccgaagtgggtggatcacttgaggtcaggagttcgag
-accagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaaattagccagg
-agtggtggcagacacctgtaatcccagctactcaggaggctgaggcaggagaatcacctg
-aacccgggaggcagaggttgcagtgagctaagatcgtgccatttgcactccagcctgggc
-aacaagagtgaaactctgtcacacacacacacacacacacacacacacacaaattaaatt
-taaaagatgggctaaacagcaaactagatatggctaaagagggaattagtgagacagaaa
-tcagaCaccaatcacagattcaagaaactccataaattttacacatagacacatcatagt
-aaaagtgcaaaaagccaaagattttttttaaaaaactcttaaaagcactcagaggaaaag
-aatcagagattctaaaaacaaaaaacaaaACAAAACAAAAAAACCCCAAAACAACAACAA
-CAaaaaacaaacaaaaaaccagtactacaacatggataaacctcaaaaacgttatgtcaa
-gaaaaaccccaaagttatgccaagtgaaagaagccagtcacaaaggttcacatattgtca
-aaatctaattttctttttgagacagggtctcactctgtcacccaggctggagtgcagtgg
-gacgatcactgctctacaggtgcacgccatcacactcggctaatttttgtattttttgta
-gagatggggtttcaccatgttgcccaggctggtcttgaattcctgggctcaagcgatcca
-cctggcttggcctccccaagtgctgggattactggcatgagccactgtggcccatcagta
-agatctaatttctataaaatatcaagaagaggaaagtctatagagacataaagtatatta
-gtgctgtcagttggaggatgggaaacagggaatgtctgctaatgagtacaggtctatttt
-ggggtgataagaatgttctttctttctttttttttttttggtctgagacagagtctcgct
-ctatcacgcaggctggagtacaacggtgcgatctcagctcactgcaacctctgcctccca
-ggttcaagccattctcatgcctcaggctctgcagtagctaggattacagatgtccgccac
-cacacctggctaatttttgtatttttagtagagacagggtttcaccatgttggccaggct
-ggtctcgaactcctgacctcaagtgatccgcccacctcggcctctcaaagtgctgggatt
-gtaggtgtgagccaccatgctcagccaaaaatgtcctaaaatttgattgtgatgatgggt
-gtacaattctgtaaatgttactaaaaactattgaattgtatattttaggtgggtggattt
-tatggcatataaattatatctcaataaagctgtttataaaaaGAACAGCAGTTAGATTGA
-CAGGTGATGATATCTCAATAAAGCTGTTTATAAAAAGAACAGCAGTTAGATTGACAGGTG
-ATGATATCTCAACAGCAACCATTtcccagcattttgggaggccgaggtgggcagatcatt
-tgagcccaggagttcaagaccagcctgggcaacatgaccaaaccctgtctctacaaaaat
-tagccagctgtggtggcacgtgcccgtggtttgcagctactcgggaagctgagcccagga
-gttggaggctgtagtgagccatgatcacgccactgcactccagcctgggcaacaagagtg
-aaactccatctcaaaaaaaaaaaaaaaaaaaaaaaaGGCTtccccaggccattcaaatgt
-acagccaaagttaagaaacattgtctaaagggatgtgtttccggcaaaagaaaaattatc
-ccagatgaaggtctgaggttcattccttcattcaacatatggagcctccattatgtgttt
-ggaactgttctagacaccaggaacacagcagtgagcaaaacaaaccaaagtccctgccct
-ctaggagaggaaaacagacccagaataacataaataagtaaaacatgctccgttagacag
-taatagatgctgagaagaaaaaatgaagccaggaaagcggatgtgaaatgctggatacgt
-gtgtctgtgaaatttcagatggagtaactagggaagatttttgggtaaagaccaaaataa
-agggaaggagggagccatgcagacgtttgggttatggcaggtgcaaaggccttagggcgg
-gagtgtgtctgacttactccaggacccagcaggtcaatgggacttgagtggaatgaggca
-ggggcagggcagtcagctacgaagacagagatcgggaggcaatttgcgagccctgggaca
-gatctcggattttgctttaagtgagatgggagtacttgggtcggggagtggcatgggttt
-gatttacattttaacaggactctccggcagctaggtggaaatggacggtagggggcaaaa
-agagaagcaaggaggcccaggaggaggctggttcaagacccctgagatgatggagcactg
-atggagctggagcgggatggggccggaggaggtgagggatgagattctgcaagtggagcc
-cgcaggatctgctgatcgatgggacgaggaacgggagaaaaaTTAAAGCGGCGCATGAGG
-CAGACGAATGCAAACTTCACCAATAGCTCAACGAAAAGACAGACGGTGACCGCTgagagg
-cagcgtcggatctgggtaagggcgggttcctgagcctgccaggcctggattcaaacctcg
-gctgagtggccttggacaggtcatcaacaaacagagccttcgtttattcatgtgcaaacg
-gggccaaggaccgggcctgccccgaggtatgcctgaggcttgggtgagCAGGCGCCGGGC
-TCGCAGGGCGCGCTCCTAACCCGTCCCCAGCGGCTCGACGCTGTGGATCCCGCCGCCCTC
-CAGCCCCGGCTCCGGCGCCGACTCCTGCTCAGgctcctgctcctgcccccggccccgccc
-ccggccccggccccggcccccggcccaccccggccccgcccccagcccccggcccccccg
-gccccgcccccggccccgccccggccccgCCCACCCCGCCTGCGGCCCAGCTCCTTCCCG
-CGGCTCTGCGATGCGGCCCGCAGGGTGACCCGGGCGGGAGTCCGGGGACCCGCGATCAGC
-CCCGGAGGACGGGGTGGGGTCGCCCCAAACAGGAGCGCCGGGACCGCTGGGACCCCGCAC
-TCGGCGTCCGCCGCCGCCGGGTAGCCGGGCAGTGGAGGTCCCGGATGAGGCGACAATTTT
-TCCGGCCCCCCCTCCCAGTCCCGCCCCACTTCCGGGGCCGCCACTTTCACTTTCTCTTCC
-GCCGAAGCCGCTCCCCTTGCGAAGAACTGGGGCCTCCCGGGAGGAGAGAGGGCTTTGCCT
-TGAAACCCGGGACGCCAGGGGCGCTCCCGCAAGTGGGGGTCCTCCGGGACTTGGAACGCC
-CCGGCTGGGTGGTGTCCGGGCGTCCTTTCCCCGCTTCTTCCCACCTCGGCTGGTCCCGTT
-TCCTCCTGCGCCCAGTGCGGACCTGTCTCGGCGCCCGCTGCCCTCTCACCGCCCCACGCA
-GGATCCCGGCCTGGTCACCGGGCAGTGTGATGCTTCCCGACTGCCGCGGGGACAGCGAGG
-CACACACAGGGCTTGGGCCGCGCCGGAGGCCACACGGCCTGGCTGAGTTGCTCCTGGTCT
-CCCGCCTCTCCCAGGCGACCCGGAGGTAGCATTTCCCAGGAGGCACGGTCCCCCCCAGGG
-GGATGGGCACAGCCACGCCAGATGGACGAGAAGACCAAGAAAGGTGGGCACAGGCTGGAG
-GTGGCTGGGGAACTTCCGGTGGGAAGTGGGCCCCGCAGGACCTGGCCTTGCCCCTGGCCA
-GAAGGGCCTTGGAGAGGGGGCTTTAGCCTGCCCTCCCTCTACCCTCCTCCCCATCAGTTT
-CCTCCTTTGGTACCTGCTGGCTTCCAGAGCCATCTTGGGGCCCTGAGAACTCCTTGGGCT
-GGCTCTGTGCTGAGATGGGGCTAGGGGACTCGCAGAGGACACAGGGCATTGAACTTGGAG
-ACCTCCTGGGCTGGTGGGAGACAGACGTCAGTTGACCTGAGAAGCAGGGGTACTTGCCTC
-TTCTCTTGTCCCCTGCACCTAGGGttgtagaacggaagtcagtcactgccttgctggaaa
-ccctcccatgcccctctgtgttctccaaacaaaacccagaggccctgggtggcccacagg
-atatctgtcctcagtcaccccgccatgctcactctactggagccccactggcttccttcg
-gttctcatccaaccattttttggccaaggcccttactcttccttccacctggaccactct
-tccccactggagcttgacacgtgcagcttctcctccttcaggtcttagcttcagtgttac
-cccctcccagaggcctcccctggtctccttaacctgtttatttccctgccagcaaggatc
-gcaatctgactttttttttttttcttgttaaacttgttcattgtctccccactgggcagg
-gagatccataaggagaggggccctgtttataaatctctgtgggattccagttcctgggac
-agtgggtggcacacagtagaagctcaataactgcttgttggataaatgaatAGAAATATG
-AGGGACCCTGGGAATGGGAAGGACAAACAACCAAATGAGCCTAGTGTGAGGAGGAGTGgg
-gaatattagagaacccctcccggagaaagggacttttagtctgggtgctgaaggatacgt
-aggagttcaccaggaagacagagaaagCAGCACACACAAAGGATCGCCTCCTTTCCTACC
-CCATTACTCTCAGCTCCTGAAAATAAACCCTGTGCTAACTGGCTCCTGCTGTACTGGCTT
-TCAGCAGAGGAAATGGCCCTGAGCCTCACCCGAGCAGTGGCGGGCGGGGATGAACAGGTG
-GCAATGAAGTGTGCCATCTGGCTGGCAGAGCAACGGGTGCCCCTGAGTGTGCAACTGAAG
-CCTGAGGTCTCCCCAACGCAGGACATCAGGTGAGGAGTGCATGGCTGGCCTGAACCCAAG
-GGACAGCAGGACAGGATATTCTTGCCTGTAGAACAGTTCTTCCtaatggcacgttctggc
-ttcaggaggcctggcttctaaccctagttatgtcattaatcaactgtgaaatacagagca
-ggtcacttcacctctcagtgtgtcctcattttaaaaatcagaccgtaacagtagctatct
-catagggttgttaggaggTGTACTGTATTAGGATGTTAGGCCTTATACAACAGAAGAAAA
-CGGAACAGTGacgtaaacaaatttgatggcagggagtccagatagggaggttctgctccc
-gacagtcctcagaggctcatattgtttctctcaccattctgccattcattcccagattcc
-tcatggtgcaaaatggccattccagctccatccagccatcacatcacaggaggaagggaa
-gaaagacacccctccacactcttctaaagagcatagctcaaaaattgtacacacttcttc
-cgttaattcctgtggaccagaactgattcccacagctacagttcagcttgaggggagact
-gtatagccaagatattcagctagaattcaggggttcgcttggtaagggaagggaagagaa
-tggatactgTCGGTCTGTGCTCCAGgagacttaaactcaatgctgaaacactttgcacaa
-tgcctggcgtgttatgcactcaataaTAAACATTAGTGTCTATCGTTATTTTTTGACTGC
-TTTTTCATTACTGGATAGTAAGGCAATAGTTTTATGGTTTCTGATTTTTGGTTCTCTTGG
-TGGGTCCCATTTGGTTTttcttaaaacagttttatttatttatttatccttacagttcga
-ccatttaaagtatacagttcaatggcttttagtatattcaaggttgtgcaaccattgcca
-caatcaattttagaacattttcatcatcctgtaaagaaacctggtactcattagcagcca
-gtcctcatctctctaccttttccctaactccccaaccttaggcaaccactaatctacttt
-ttatctctagggatctaccttctggaaattccatataagttgaatcatgcaatatgtggc
-cttttgtatctggcttctttcacttaggatcgttttcgagattcatccatgttgtagcat
-gtctaacaacttcattcccctttttttttttgacatggggtctcttgtctaggttgaagt
-gcagtggtgccatcatcgctcactacagcctcaacttcctggattcaagcagtcctcctg
-ccttggcctcccaggtagctgggactactggcatgtaccaccacacccggctaatttttt
-ttttctttgagatgggagtctcactctgtcccccaggctggagtgcagtggcgcgatctc
-agctcactgcaagctccacctcccaggttcacgccattctcctgcctcagcttcccgagt
-agctgggactacaggcgcccgccaccacgcccagctaattttttgtatttttagtagaga
-cggggtttcgccgtgttaaccaggatggtctccatctcctgacctcgtgatccgcccgcc
-tatgcctcccaatgtgctgggactacaggcgtgagccaccacacccagccacacctggct
-aatttttagaaagtctgtagagataaggtcttgctttgttgtctgggctggtcttgaact
-tctggcttaagcagtcttcccacctcagcctctcaaagtgctgggattacaggtgtgagc
-caccatgcccaaccagaactttattcctttttattgccaaataataatctattgtataga
-catatctcattatctttactcattaaatcagttgatggacatttgggtgtttctattttt
-tggctattataaacaatgctgccgtgaacatttgtgtccaactttttgtgtggacacgtt
-ttcatttctcttggatacacactagcagtggaattgctgggtcatacagtaactctatgt
-tactttttgaagaaatgccagacagttttccaaagtggctgcaccattttacattcccac
-cagcatatatgagggttctagtttctccacatcatctctaatacttgttgttgtttatct
-ttttgattatagccatcctagtaagtttgaagaggtatctcactgtggttttgatttgca
-atttcctaaccatttgatgacaaatgatgttaagcatcttttcatgcacatattttcttt
-ggaggtttgcctattcaggtcttttgcccattttaaaattgggtttatcttttttttttt
-ttgagatggagtctcgctctgtcacccaagcaggagtgcaatggtgcaatctcggctcac
-tgcaacctccgcctcccaggttcaagtgattctcctgccccagcctcctgagtagctgga
-ttacaggtgcccaccactacactggctaatttttgtatttttagtagagacgggtcttac
-catgttggccaggctggtcttgaactcctgacctcaggtgatccacccaccttggccttt
-ccaaagtgttgggattacaggcatgagccactgcacccggctgggtttatgtttttatat
-tgagttgtaggagtactttattcattttagctagaagtactttattcattttagcttatc
-agctacatgatttgcaaaaattttctctcattctgtggattgtcttctcactttgttgat
-ggtatcctttgaaccacaaaagttttaaattttgatgatgtccagttagtctatgtttta
-ttttgttgtttgtgcttttggtgtcatatctaagaaatcgttgcctcatccaaggtcatg
-aagatttacctctatattttcttctaaagattttatggttttagctcttacatttaggtc
-tttggtccattttgatttaatttttatataaggtgtgaggtaagggtccagcttcattct
-tttgcacgtggatattgagttgtgccggcactatttgttaaggctgttttcctctgttta
-atcatcttaaccctttttggaaattaattgaccataaatgtgagtgcttatttctggact
-ctcatttctataccattgaactataatatatatctgcccttacgccagtaccacactaat
-tactatagcttcatagtatttgaaatcaggaaatacaagttctccaacttttgttctttt
-tcaatattgttttggttattgcaagtctcttgaatttccatataaattttacgatcagct
-tgtctgtttctgcaaaaaaaaaacaacaacaactgggaattttggtagggatttcattga
-atctgtagatcattggccacttgattttaaacaaaatattgagatatctacttcttgaaA
-TGATTGCttgagacagtacctgtgtactccttgctatgaaaaatgaggaagttaacatac
-tcatcttccacctttccttttccttactttttttgttGAAGTATCATTGTGGACACTTTC
-CCAGTTGACTTCCACTTGATCCCCTGAATTAACTAACTGGCACTGGCGTTTCCTTTGTAA
-AATGTACAATGTCAGCCACCATCTtgctactaaagtgtggcctgtggaccacaacatggg
-gggaatctcaggtctcacctcagacttgctgggtcagaacctgagttttgagaggctcTG
-GGCAACCGGCACCTCTCAGACCTGCTGTTGGGTTCTCATCGATGGACCCGATGCTTCCTA
-GCAAATGATACCTGTTGTATGTGTTATTGGTAATAACATAGTTTACTTAGCTATTACATT
-AATTAATAAAACATGAGCGCTGAAAGAGTTGTTTCTGTGAAAATAAGCTGATTGCTTTAA
-AAAGATAAGAGACAAATCACCAAAAAAAAAAAAAAAAAAGATTAACACTTTTGGGTGAGA
-CAGTAGTAAGGAAATACAGTAAAAATCCAGAAGGGCTCTGTGCTCTGATGCTTCAGGAGT
-GTGTCTAAGTTCTTGCTCGCTTTAAAGAAGCTGCTACTAGAAATTATAGATCATGATTAT
-CGATGTGGTTCATACAAAAAAAAAAAAGAAAAATCCCTGGGAAACTCCAATGAGCAGGTA
-TAAACTCACgctgggcatggcggctcagcactttggaaggctcaggcaggagaatggctt
-gaactcgagtttaagaccagcctgggcaacatagtgagaccttgtctctgcaaaaaataa
-aaaaaattagccaggctgggtggcacacacctgtagtcccagctatttgagaggctgaga
-tgagaggattattagaccctgggtggttgaggttgcagtgagccatgatcatgcctgagt
-gacaaggtgaaaccctgtctcaaagaaagaaagagagaaaaGCCATTGGCTGTACACCTA
-GAGACTGGCCAGTGAATATGCATTTATAGTATGTAAGTTAAAATTAAGTGTTTAAGCTTT
-GTCTGCAGCTGTTTTTGTGATTCTCTGCTGTTCACCAGCGATCCTGATGTCACATTGGAT
-GAGAGAGCTCCAGCTGTATTTTTTTGTTGATAGTGTTAAGATTATAGCTTTAAAAAATTT
-TGTTTTCTAACATAATTAAGGCCTTTATGCTTTGCCTCTAGGTTGATTCTAAAAGTGTAA
-CACTACTAGAAAGGATTTATAGTATTTTGATTATGGAAATATTATTCACTATAGAATAAC
-TAGTGCAGTTGAAACCATATGCACTTTTATGTTTCAAAACCCTTATTGCTGGAAGAACAT
-TTTGGGGTTAAGATCCAGTCCTTTTCATTTTTTACTTTTCTTCTATTCTCCTGTATCAGA
-CTCATCTATTTTTGTTTTTCAAGAACTTTTCACGTGGAAAATGTggtaaacttttagagt
-ctttgcatgtttaaaaatttctatattttgctctgtcaattcattgatagttgactgggt
-attcaaattgtttacctgaagaattttgagagcattttctggactgcttttaaataaatt
-tcagatattattttatccttaaatactttagtatgtgtcttcaaaaaattaggacttggc
-ggggcacgatggatgatgcttgtaatcctagcactttgggaggctgaggcaggtggactg
-cttgaacccatgagttcaaaaccagcctgggcaacatagtgaaaccttgtctctacaaaa
-cattagctaggcatggtggtgcgcccatctagtcccagctacccaggaggctgaggtggg
-agggtcacctcagtccaggagattgaagctgcagtgagccaagatcatgccactacactc
-catcctgggtgacagaagtgagaccctgtctcaaaaaaaacaaaaacaaacaaaacccct
-caatactattatcacaccttagaaaaggaataagaattccttaaaatccgctaatgccct
-gtttatattcacattttcctatttcattagtgctttttacaattggtttcttcaaatcag
-gagccaaacaagatctacatgtagcatttcttactatgtcttaagtcccttttactctcc
-tctatttttatgccactagttttttttttaagaaacctggtcttttgacctctagaattt
-tccccatattctggatctatccattacctcttcatggtatgtattagaccactctagcat
-tgctacaaagaaatatctgagactgggtaatttgtaaagaaaagaggtttaattgactca
-gttctgcaggtggtgtaggaagcatggtcctgacatttgcttggcttctggggaggcctc
-agtgaacttttactgaagcgggagcaggcacttcacatggtgagagagggagcaagagag
-agagttggtggggaggtgccacactttacaacagccagatctcacgaggactcactatgg
-cgagaagtcactacagtgagcgcagcaccaggctgtgagggagctgcccctatgacccaa
-acacctcccaccaggcctcaccttcaacactgaggattacagttcaaggtaagatttggg
-cagggacaaatacccagactatcatggtgtcatttactatctcccgtttttcctgtaact
-ggtagttagagataaagtttcaattagtcagCAGTCACtttttttttttttttttttgag
-acagagtttcactctgttgcccaggctggagtgcggtggcgcaatcttggctcactgcac
-ggtccgcctcccgggttcacaccattctcctgcctcaatctcctgagtagctgggactac
-aggcgcccgccaccgtgcctggctaatttttttttttgtatttttagtagagacgggttt
-tcaccgtgttagccaggatggtctcgatctcctgacctcgtgatccacccacctcggcct
-cccaaagtgctgggattCAGCAGTCacttttaatgtgcaggaactcttcctcattttttg
-gttgcttcatgcctttccttgctttctgaatgcagtgttttcccaaatctctctgaaggt
-actagttagacttcactgttgcttattgttccataccctaaatgatctctgtttcctttg
-gggtcggttctgttttttcatcttttcatgcttttgattttccaaacatgttggaggatc
-ctcaAGAAAGTTAAAACCACTTTCTCTGGAATAATACCATGTAGATTTAAATCCTGCCTC
-Tggctgaacacagtggcttactcctgtaatcccacttcgggaggccaaggcaggaggatc
-acttgaggccaagagttcaagaccagctttggcaacatagtgagaccctgtctctacaaa
-aacttaaaaaattagccaggcatggtggcatgagcctgtggtcccagctacttgggaggc
-tgagatgggaagagcccaggaggttgatactgcagtgagccaaggtagcactactgcact
-ccagcctgggccacagaaagagagcctgtgtcttaaaaTTAAATCAAGACATACAAATga
-atcctgcctctaacagttattagttgcttagtttggcagagtcactggaacctatctgtg
-cctcacatttttatctgtaaaacagggatacagcagtacctgtctgatgggttggttgag
-aggattaaatgagttaatacacatgaagtgcattaaatagtcttagcacgtagttaacaa
-caacttctggtggttTCACTAAGgagcaggggagagaagacagaagaggttggagaggtc
-agggaggtgccagatcatggaggccctcgtgtgctgccacgagttgattctaagagtagc
-gtggagccattggagggGCCTAACTGGTGGGTTCTAATAAAGGAAGAAGCATGGGTGGGG
-CCTACCCCAGACTGGGGTTtgtgtgtgtgtgtgtgtgtgtgtgtgtgCATGGCCATGTGC
-CTGTGTGCAAATATGTACATGTCTGTAGCCGGTGGCTGAGGCTGGACCCCTGGCCAGAGC
-CCATGCTGAGCCCCTGCTGTTCTCTGCAGGCTGTGGGTGAGCGTGGAGGATGCTCAGATG
-CACACCGTCACCATCTGGCTCACAGTGCGCCCTGATATGACAGTGGCGTCTCTCAAGGAC
-ATGGTGAGTGAGGAGGCGGAGGGCGACACTGGGGTGAAGGctctccctttcactcctgct
-tcctctctctcctctggccctcccttcccactctccctctctttgccccCACCAGGTTTT
-TCTGGACTATGGCTTCCCACCAGTCTTGCAGCAGTGGGTGATTGGGCAGCGGCTGGCACG
-AGACCAGGAGACCCTGCACTCCCATGGGGTGCGGCAGAATGGGGACAGTGCCTACCTCTA
-TCTGCTGTCAGCCCGCAACACCTCCCTCAACCCTCAGGAGCTGCAGCGGGAGCGGCAGCT
-GCGGATGCTGGAAGGTGAGGCTCTGCCCTGAGCACCGCCGGACCCAGCGGGGGCCCTGGA
-CTCACTTGAGGGCATAGGGCAAGCAGGGGCAGAGCCCCTGGGTTTTTAGTCAGGGACTCA
-CCCAGAGGACCCTATCCAAGTGGGGAAGAGAGGACCTAAGACACATGGGAGGGAGCATTT
-CAGGGACCCATCATGAGAACAGCTGGCACGGGGAGGGGTGGACTCCGtccaggctccggc
-attcccagctgtgtgaccttgggcaaggttgctcctatctgctgcccagtttgctaaaat
-cataaattgggtatgacagtgatCGTGATAACTAGTGTTTATTCTTAAtttttaacttct
-gaaatgtttcagacctacagaaaagttgctaaattttacaaagtagtacataaagaattc
-ccatgtacctttcatgtgggttttaccacatgtgctttctttttttttttgagacggagt
-ctcgctctgtcgcccaggctggagtgcagtggcacaatctcggctcactgcaagctccga
-ctcccgggttcacgccattctcctgcctcagcctccggagtagctgggactacaggcgcc
-cgccaccacgcccggctaattttttatatttttagtagagacggggtttcaccgtgttag
-ccaggatggtctcgatctcctgactttgtgatccgcccgcctcggcctcccaaagtgctg
-ggattacaggcgtgagccaccacgcccaacccacatttgctttcttttatcattctcttt
-ctatataaaattattttttttctgaaccattttgagagtaagttgcagacatgatgtctc
-tttcccctaaataattcagtgtgcatttccttgaaaagaaaggtcattttcttacattac
-tgggtataacaatccaactcaggaaactaacgctgatacagtactggtatccagtctaca
-gatcttactcagattttaccagttgtcccactattgtcatttatagcaaaagacttggca
-ttctgctgtcatgtctcagtccctttcaaagagtccaggccagtttcttttttttggcgg
-gggttgggggctgatgtttcctccggagtggatcaagtcactgttttggcaggaccgcct
-cagcggtgctcttgggtccctcttggtgcatccttcaggaggcacGGAAGGGCTGGTGTT
-GTGCTGGGTTTTGAAGCTCAAAGGACATAGAAGCATTTATCGGTGGAATAGGGACCCTGA
-CCCTGGGGGAGCCAGGATGCCCACTTGGCCAGATGGAAGCTGGAGGTACCCCCAGGGAGG
-AGGGAGAGGATAGGGGGAGGGTCTGCCTGGCTGGCTCAGGGAGACCCACCCCCATGGGTG
-TGGACCAAGTGGGCCGCGTGGAACCACCACCCTTTAACCCTCCTCCACAGATCTGGGCTT
-CAAGGACCTCACGCTGCAGCCGCGGGGCCCTCTGGAGCCAGGCCCCCCAAAGCCCGGGGT
-CCCCCAGGAACCCGGACGGGGGCAGCCAGATGCAGTGCCTGAGCCCCCACCGGTAAGCTG
-TCCTTGGCCTCAGTATCCTCTTCTGTGCCCCTCCCTTGCCTCACCCTGCCCAGTCGGGCT
-CACAGCACCCTCTGCTCCCAGGTGGGCTGGCAGTGCCCCGGGTGCACCTTCATCAACAAG
-CCCACGCGGCCTGGCTGTGAGATGTGCTGCCGGGCGCGCCCCGAGGCCTACCAGGTCCCC
-GCCTCATACCAGCCCGACGAGGAGGAGCGAGCGCGCCTGGCGGGCGAGGAGGAGGCGCTG
-CGTCAGTACCAGCAGGTGGGCGGGAAAGTCCCTGGACAGACACCTGCAGACCGCACGGGG
-GAGGTGTAGGCCAGGAAGGGAGACACCTGCGCACTGCCGCGCCTCTCCGTTACTGCCTTG
-CCCCTCCCAACCATGCTGCTGGCAGTGACCCTGCACCTGGCTGTGACCCTGCACCTGGCT
-GTGACCTGCCCTCTCTCAAAGGTCACCCTGTGGCTGAGACCCGCTCCCTGGCTGTGGCGC
-ACATCCAGGTTCACATGCCCCACTCCCACGTGGGCTGTGGCTCCATCCCCAGCTTTGACA
-CACCACACGAGTATGGCTGGCCATGACCCCAGCACCCTAGCCATGACCCCAGCACCCTAG
-CCATGACCACACCTCAGCTCGGACCTCACCCCCACCCGTCTGTGACCTAAGCCTGCTCCA
-CCTCGCCGTGACCTCACCCTGGACTCTCCTACTCCTGACCTCTTCCCTCTCGGGCTGGGC
-CCACCCCTGACTTCCTGAGAGCCTGGCCTGGACCCTCGCTGCGCCCTAGGGGGATGACCC
-CCGACCCCGGTCCTACGCCTTAGCCCTACCCCGCCCCCATCGTGACACACGCACTAATGA
-CACAGACATTGATCCCCGAGTGCTCCCCATTCTGATCTCACCCCTGGCCCCACCTGCATT
-CCCCTTGGACCCGGTGCTGCCCCTGGCCACCCCACTCCTGTTCCCGTCTCAGCTCCTCGG
-CTTCGTCACTTCCCCACCCCTGACGTTGAGTGGCTCCACCAGCCCTGGCCCGGGCCCTGC
-CCTGCTACCTGACTCACCACTCAGACCCCGGCCCCCTTCCTTACCTTGCTGCCATTGCTG
-TCTCACCTGGCGCCTTCCGTGGCTACCTGGCCGGCCTCCCCTCCCTTGGCTTCCCCACCT
-CCACCTGGCCTCACTCCCAGCCCCGCCCCTCCCAACCTGCCTGCTCCTGcccatccccca
-ccccccaccccccatcccccagccccacccccatcccccacccccgtcccccatccccca
-tccctacTGGCTCCCAGCTTTGCCTGTGGCTGGTCTGACCCAGCCCTGACCACGCCCCCT
-GGCCCTTCCCCCTTCGGGGTCTGACCCGCCCCCGAGGCCCTGACCCGCCCCGTGGCCCCG
-CCCCGTGTGCCCAGCGGAAGCAGCAGCAGCAGGAGGGGAACTACCTGCAGCACGTCCAGC
-TGGACCAGAGGAGCCTGGTGCTGAACACGGAGCCCGCCGAGTGCCCCGTGTGCTACTCGG
-TGCTGGCGCCCGGCGAGGCCGTGGTGCTGCGTGAGTGTCTGCACACCTTCTGCAGGTGCG
-GCCCCCAGTCCCACCCCCGGCAATGCAGCTtaatcaaagccgccaattacgcagggctgg
-acgtgggtggggccctgtgctctgatacctcattggacgcccgcgaaaacctacgaggta
-ggctccgtctccccatgttgcggacgaggaacctgagggaaagagaggcccagcgcctta
-ccccaggcccacggctcatgagagaagcagcctagacgtgagcgcaggCGTGGGGGGAGA
-CTCCCTTCCCCTCTACCTTTCGCCGCCCGGGCTCCTGCAGCCACGCTGCTCTCAGCCTCG
-CTGTGGGCATCTGCCAGTTTCTGAGTCTCCTGTCATGGCCCCCCCACCCCTGAATGTGGG
-GAACACAGACCCGCTCACCACAGCGGACCCTTGTGGAGCCGCCCCTGGGTGacaggctcc
-gtgcctgcctcctgcagcttacattccagcagagaggctgatgagaatcggataatcgct
-ggttgatgtctttgtgaattgtgtcaaatgctacatacagtacattaagagacaacagga
-gtccttcccagagagggtggtctggaagcttccaaggaggtagccccagagcagggaccg
-gaaggcctgctgtaggtgtggggtgtgggcctggcctgttggaggagactgaggaggtct
-cttggtggctggagcagagggatgaagggggtaatcagagcaggatagagaggtgttggg
-tacgtgagcagcagtgaggagttgggatttgttctgggtaggatgggagtcactggggag
-acatggctgctgttctgagatagactctaggggccagatggatgcagggagcccagcgag
-gaggctcctggagtcacccaggtgggggatgtggggcctggaccagagaatcagagcggc
-agtatggaggcagggtggagGCCTTGGTGATGGGTTGGTGAGAGGGATGGGAAGGAAGGA
-GATATTGAGGAGAAGTCCACCTGGGGTGACTGAGTGAGGCCCCTGGGGTCAGGCCTTGCC
-ATGTGAGGGATGGAGTCCCCAGTGAAGGGGGTTCCTATGATCCTAACTCTTTTCCCCTCC
-CCTCCCCTAGGGAGTGCCTGCAGGGCACCATCCGCAACAGCCAGGAGGCGGAGGTCTCCT
-GCCCCTTCATTGACAACACCTACTCGTGCTCGGGCAAGCTGCTGGAGAGGGAGATCAAGG
-CGGTAAGGCCTCAGGGTGGGAGACATACCCCAAGTCCCAACTCCTAAGGAACTGGGCCCT
-GAGCAGGCAGCAGACATCtttcttttctttcttttttttttttggagatggggtctcact
-atgttgtccaagctggtctcaaactcctgggcttaagcgatcattcatcctcagcccccc
-agaCATTTTTCAAGAGCTTTGTCCATGTGGGGTGTTGAGACCCCAAGCAGAAAAAGAATT
-GAGGGGAGTAGCTAGTCAAGAAACCACATCTATGAAGGAaggacagcagagttgttaaga
-atcagggactcggctgggcgtggcagctcacacctgtaatcccagcactttgggaggatg
-aagtgggcagattgcttgaacccatgagttccagaccaacctgggcaacatggcaaaaaa
-tattcaaaaaatagccaggcgcgggggcatgcgcctgtagtcctagctacttgggtgggg
-tctgggatgagtgggctgaggtgggaggattgcttgagcctaggaagtaaggttgcagtg
-agctgtgattgtgccactgcactccagcctgggcaacagagtgagaccttgcctcaaaaa
-aagaaaaaaaaaattagtcagggaactctggagcctggtggcctgggtgtgtgaccacaa
-gtcagatatttaacctctctatgcctctatctcatctctgttagagtcagagttacagct
-tctatttccaggattgcaaagattacagtagaggatatgtgtatagaattcatagtagta
-cATccaggcgcagtggctcattcctgtaatcccagcgctttgggaggccaaggcgggtgg
-atcacctgaggtcgggaattcgagatcagcctgactaacatggagaaaccccatctctac
-taaaaatagaaaattagccgggtgtggtggcgcatgcctgtaatcccagctactcaggag
-gctgaggcaggggaatcgcttgaaccccggaggcggaggttgtggtgaactgagatcgcg
-ccattgcactccagcctgggcaaccagagcgaaactccgtctgaaaaTATATATATATAT
-ATTTAGAGTAGTGCTTGTCACATAGTAAGCCTTtgttgttgttagcgcttactgtgtaac
-aaatcactgcaggctcaaaacaacagtcatttattcagctcataaatctgcaagttagga
-cagttggccctctgtatctgtgggtaccacactggagaattcagcaacggtggatagaac
-atattcttacaaaaaaaattacaataaaaaacaaatttaaaaaacaatacagcataaact
-atttgtataacatttatgttatattaggtattataaataatctacagatgatttaaagtg
-tatgggaggatgttggtaggttgtatgcaaatactgcactattttatataaggggtttga
-gcatccatggatttgggtatctgcaggggtcttggaaccaattctctggataccgaggga
-tgactataatttgggctggacttacctggatggttcttctggtctgggcagggcctcgct
-gatttcacctgggcctggctggtgggtcagccgcggtggcctggtttataatggtctcat
-ctgtgatgactgggatgactggggcctccttccacttcaatgtctcacccaccagcaggc
-tgcccgggccttctcatgtcatggtggtctcaaggttccaagagcagccatggggagccc
-cagtgcatgtgtactttctaagtctgctcatttctcacttgacactgtcccattggccaa
-agcaagtcccatgctcaagcacagagtccattgggaagggaccacccaaaagtgtggaat
-cggggagacagaaacaaattggagtcaccaCTCCGCCAGTCTGTCACAGCGTTATGTGTG
-TCTGCATACGTGTGTGCTTGCCGCTGGCGCTCTTCATGAATTCGTTAGCAGGTTctctgc
-ctggctgctggtgatctcgagcaagttgtttcccttctgtgggactccatttccttatct
-gaaaagtggacagttgggcttgatTCATGGTTTTCAAACTGCTGGGAAATGACCTTCCCA
-GACTTGGGCACTGTGGGTTCCCAGGCCAAAACATGGCAGCCGAGGCCCAAATGGGAGATC
-CCCACAAAACACATACACAGACCTCCTCTTTATTTCTGTCCCCCCTGCCTCTCTCCTATG
-CCCCTATTTCTCCTGAGAATGCTCCCAACTTCACCAAGTGTTTATGGAGCCCAAGAGGTT
-CTGCCCCTGGGGAAAAGGGGGAGGCAGAAGAGGTAGAACTTTGGGAGTTCACAGCTCTGA
-TATCAGGAGCAGCCCCATTTTTCTCTGTTGTCTCTGGGTGGTTGCTGAGGCTCCTTCGCT
-CTGGCCTGGAGAGACCTCATGACCAGTCATTCCATATGTCCCCAGCACCCATAGCCATTT
-GCTTAGAGGTTTCCCTGTGGAGTCCACCCCAGCCAAGGGGCATTATGCTGGGGCCAGGTT
-CATGCCAAAGGGCTGCATGAACTTCCCTGGAGCCCACTGGAGTTGATGTGAGTCTCAGAA
-AATGGTCAAGTGTGACAGAGAGAAGGAGGCAGGGATCAGCCAAGTAATGTAGTGGAGGTT
-GTTTTTACAAAAACAGAAAAATATGCCTCACCACATAGAACCAGAGCAGAAATCAGAGAG
-AAAATCACCCACAAACCCAGGAAATCCTCCAATTGCATTTTATCTTATTTCCTTCAGTAT
-CTCTGGGCAAAttttttttttttttcctttttgagatgaagtctcactctgtcatccagg
-ctggagtgcaatggcgcgatctcagcccactgcaagctccgcctcccgggttcacgccat
-tctcctgcctcagcctcccaagtagctgggactagaggcgcacaccgccatgcccagcta
-atttttgtattttcagtacagacgagttttcaccatgttggccaggctggtcttgaactc
-ctgacctcaggtgatccacccacctcggcctcccaaagtgctaggattacaggcgtgagc
-caccgtgcccagccAGATATGATTTTTTAAGTCAACtttacttaagtatactttgcacac
-aataaaatgtactcattgtaagtatgcagtcaggtaaattttaacaaatgtaactctcgt
-aaccaccaaccactgttacatataacatAGGCATGATTTCTGCCTCATTGTAACCAGCAT
-GGATACAATCGCTTTAGCTTTTGTTATTTTGCTATAGAATTTTTCTAAAGATTATTACAA
-ATCTCAATAGCACATATACTGTTTATACCTCTTAGTTCTAGTTTCTCAGTTTGTAATACT
-CCTTCAAGGAATGTTTTGCATGGTGTAttcttttttttttttttttttgagacgaagtct
-cactctgttgcctaagctggagtacattggtgtgatcttggctcactgcaacctccacct
-cccgggttcaaacgattctcctgcctcagcctcccgagtagctgggactacaggcagatg
-ccaccacacccagctaatttttgtatttttagtagagatggggtttcactatgttggcca
-agctagtcttaaactcctgacctcgtgatgcgcccgcctcggcctcccagagtgttcaga
-ttacaggcgtgatccatcattcctggctGGTGCATCTTATATattattttcttgggataa
-agttaaagaagtgggatgggtaccaaagggtcagaaaagtttgggatggttgaaacgtta
-ttgccacattgctttctcagtgctacgtactagcttactagtttgtttaatttttatttt
-ttatttttgcgggtacatagttggtgtatatatttctggggtacatgaaatactttgata
-caggcatgcaatgcgtaataatcacatcatggagaatggggaatccatcccctcaagcat
-ttatcctttgtgttacagacaatccagttaacctctcttagttattataaaatgtacaat
-taaattattggctacagtctgttgtgctatcaaatactaggtcttactctatttttttgt
-accaatttgccatccccactcccctgccacgcctcactaccctttgcagcctctggtaag
-catccttttactgtctgtcctcattagttcagttgtttcgatttttagcacctgcaaata
-agtgagaacatgtaatgtttgtttgtctgtgcctggcttatttcatttaacataatgacc
-tccagttcttccatgttgctgtaaatggcaggattgcattcttttttgtggccgaatagt
-actccattgtatatatgtgccacgttttctttataggatactagtttaatcatgtctttc
-ccaacattgcttattatttATGTTCttttctttattgtgagaaaatagacataacattta
-ccattttaaccagtttttagtatacagttcagtggcattaagtacattcacactgttgtg
-caaccatcaccaccatccacctccagaacttttAGAAATTCCCCCCACTTTCTTTCACTT
-TCTTTTTACTTTTCTTTTCCttttttttttttttttttttttttttttagctaggatttc
-attctgtcacccaggttggagtgcagtgcatcagtcatggctcactgcatccttgacctt
-ctgggctcaagcgatcctcacaacccagcctcccaagcagctgggactacaggtgtgagc
-accacacctggttattttattttttaaaaaaattttttggtagagatgaggtctcactgt
-atttctcaggctggtctgaaactcttggcctcaaggaatcctcctgccttgactgacctc
-ccaaagtgctgggattacaagtgtaagccaccacacctggccTAAAATCCACTCTTTGAA
-TGGAGTTTTTCAACACTATGAGGATTACATGAAGAAAAGAGCCTGGGGCTGGGTTGGAGT
-TTCTGGGCTGGGGGCTTTCTGGAGGGTATTTAGTGGTCAAGGGTCATATGTCAGGTGTTC
-TGAATCCTGAGCAGCAAGGACATGGTGTGTTGGCAGCTCCTGACCCCTGAGGATTACCAG
-CGATTTCTAGACCTGGGCATCTCCATTGCTGAAAACCGCAGTGCCTTCAGCTACCATTGC
-AAGACCCCAGATTGCAAGGGATGGTGCTTCTTTGAGGATGATGTCAATGAGTTCACCTGC
-CCTGTGTGTTTCCACGTCAACTGCCTGCTCTGCAAGGTGGGGCCTGCAGGGACTCCCCCC
-ACCTAGTCACTGTCATCTTGCCTGGAGCTCACCACACTGCAGTGCGTGTTCTCCTGGGAA
-GGGAGCTGTGACACTGGCCTGCTGGTCATGACTTAGAGCTACATGTCAGTGGGAGAGTGT
-GGCTTGAGCCTGAACTGagccctggccccacagacggagtcccagccccagccccagatg
-gagcctcaaacctaggcagccctggttcacaatggagccccgaccctgggccagtctgac
-cccagtcacagactgaatcccagtcccacattgagccctgatcccatccAAGTCCATAGA
-CTTGGCCTCTGACCAAACCTGACCCTGCACTTGTCACTTAAGGTGGTCCCATATTCAGCT
-CAGACCCTGAACCGAGCTCTGACCCTGGCTTCTGACTGAATCTGTGACAGACTAAGGCCT
-GACCCTGGCCCTATACCACGTCTCCACCCGTGTCCTCAACTGAGTGCTGACCCCAAACCT
-AGACAGCCCTACCTGATCCTTCCCCCAGGCCTGTCCCCGCCGCTTCATCTCAAAAGTTGA
-AGGTGAGGAGCCGGTAAACAGGTCTGGAGCCTGGTCTCAGACTCAGCCTGAGCAAGCTCA
-GTCTGGGGTCATTGGGCCTGTAACCCCGGGCAGGCCCTTGTTAGGGATGCAGGGTCTCAC
-CCTAGGGGTATAAGGGATTTCTGTGCCCATCAGAACTTaaataagctgggtgtggcagca
-catgtcagtggtcccagctactcaggaggctgaggtaTATTTTGCTGTTAGCATAtgtga
-tgaccttgacttcacctccctggcgccaatatcctcttctgtaaaatgGCTTATGCATTA
-CAAAGTGAGGTCCTGCCAGTGACTACACCTAGAGGCATTAAGTGCCTTTGTGGACTCCTG
-CCCTGCACCTCACCTCTCCCAGCTTCTTAACCCCCTGAGGAACCTTCTTACCTTGAGTCC
-CTCACCCGCTACAGGCCATCCATGAGCAGATGAACTGCAAGGAGTATCAGGAGGACCTGG
-CCCTGCGGGCTCAGAACGATGTGGCTGCCCGGCAGACGACAGAGATGCTGAAGGTGAGGC
-TGGGACAGGGCCGAGGCCTAGGGATTTTAAGTTCTGGGATCCAGGTGGGGGCTGGGGGCT
-TCCCAGTAAGGGCTGTGCTCACACATCCCTGGAGGCTCTGACCTCCCTTCTGGCTGTCAC
-TCCCATCCGGAGGTGGGACTTAGGCCGAATGGTCATGTCAGGAAGAGCGTCTGGGTGGAG
-GGTGGAGACCACAGGAATGAAGAGGGGGTTGCTGGATGGAGCCTGGCCTGGCAGAGCCAC
-ACAGGAGAGACTCCACAGCTCTAGAGGGTCACCACCTTCTCCCTGCCATGGGGAGGGGCC
-AGGCTGGGTGACTGCCCCAGCCCCGCCCCAGGGCCAGCACCTGCCCCACTCCAGGTGATG
-CTGCAGCAGGGCGAGGCCATGCGCTGCCCCCAGTGCCAGATCGTGGTACAGAAGAAGGAC
-GGCTGCGACTGGATCCGCTGCACCGTCTGCCACACCGAGATCTGCTGGGTCACCAAGGGC
-CCACGCTGGGGCCCTGGGGTGAGTCTTTGCTCGTGGTGGTGTGGAGAGGGTGCCCTTGTG
-GGCTTTGCCTTAGAGGagggctgggaaaactacagcccatgggccatatccaacccagca
-cctgaatttgtacagctcccgaggtaagaatttttttttttttttttgaaacggagtttc
-actcttgttgcccaggctggagtgcaatagcacaatctcagctcactgcaacctctgcct
-tccgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcatgcg
-ccaccacgcccggctagttttgtatttttaggagagacggggtttctccatgttggtcag
-actggtctcaaattcccgaccgcaggtgatccacctgcctcggcctcccaaagtgctagg
-attacaggcgtgagccaccgggccgcaagaatgttctttacatctttaaatggttgaaaa
-aataccagaagatgactattttgtgacgtgaaaattacatgaaatccacgtttcagtgtc
-cgtaggtaaagtgctttggagcacagccgtgttcattcattcacatgttggctgtggttg
-cttttacactacagaggcagaggccgtatggctgcccggcccaaaatgactggccctttg
-cagaaaaggtttgcccactcctgCCCtagaggacagcaagtaaaggttcgatctggagtc
-agaggtggattggcccctggctctggcacatactgactgtgtgattaggctgcctgccac
-tcacctctgtcagccccatttcctctgtgaaatggagatgatagctgggcttatctcagg
-cttgttgtcagaatcaagtggaaaaattgcaagagaagtgcttagagagcctgtcacttg
-gtgagcacccttgcagatggtagctgtcgttattAGGGGTGTGCTCTGGAATTGGGGGCC
-TGTTGCTACGTTCAGGTAGACTTTCAGACAGGTGGAGGCAGAGGAAACTGCCCTCTCGCA
-TGCTGACATGTCTAGAATATGCAGAGTGGTCAGATCCTCTCCCTGGCCTGTTCCCGGATC
-TAGGCGTGGGTAGACTGAGTGCTGTGGGAGCCCAGAAAAGGCCTCAGTGACTCTCCATCA
-GGTAGCTGAGGCTGACCAGGCCATTCTTGCAGGAGGACCTGCAGAGGCAAAGGCCCGGGG
-TGGGAGAGCGCTCGGCTGTGGGGGCAGTCTCTGCACTGCGCTGACATTCTCTTCTCTTCC
-TCCCATCCTCTAGGGCCCAGGAGACACCAGCGGGGGCTGCCGCTGCAGGGTAAATGGGAT
-TCCTTGCCACCCAAGCTGTCAGAACTGCCACTGAGCTAAAGATGGTGGGGCCACATGCTG
-ACCCAGCCCCACATCCACATTCTGTTAGAATGTAGCTCAGGGAGCTTCGTGGACGGCCTT
-GCTTGCTGTAGCGTTGTAGGGGCCCTGCCTGCACTGCGGTTGTCCACGGTCACATCTGCC
-CCAGTGCCTTTGTCCTTCCCTTGGGGCTTGCCGGCCAGACTTCTCTCCCCTGCGGCTCCC
-ACCTCTGCCTGACCCCAGCCTTAAACATAGCCCCTGGCCAGAGGCCTTGCTGGGTGGAGC
-CTCTGTGTGACTCCATACTCCTCCCACCACAACACTCATCTGTCAAACACCAAGCACTCT
-CAGCCTCCCCGCCTTCAGCTGTCAGCTTTCTGGGGCTAACTTCTCTGCCTTTGTGGTTGG
-AGGCCTGAGGCCTCTTGGAACTCTTGCTAACCTGTTCAGAGCCAGGAAGGAGACTGCACA
-GTTTTGAAAGCACAGCCCGTCAGGTCCGGCTCTGCGTCTCCCTCTCTGCAGCCTGTGTAA
-GCTATTATAATTAAAATGGTTTTCCGGGAAGGGATGAGTGTGATGTCCTTGAGAGGAAAT
-GAATGTCCTGGCCTGGGACTCTACACACAGGCAGGATCCTGAGGTCTCTGGGAACTGCAT
-CAGAAAGTTGACTTGTCAGTCCATCTGTGGTAGAATGAGGCTGTGACTGAGCACTGGGAC
-CTTTCTACCAGATGTGGACCCCATGCCCAGCCTCAGGGGCAAGGATGCTCTTGGGTCACC
-GTCAGCCAGGACAGGTGGAGTGTGCAGTGTGTCAAGTCTGCAGAGAAGGATGGGCTTAGG
-GGCGGGAGGGGAAGTCTTGCCACTCCTGCTCCCTTTTGACCTCTCAGCAGGCATCTAGGG
-TTGGCAGGTAGATAGTTCAAGAAGGAACGAAGCTGCTGCAGTTGAGGGGTGGGGTTGTCC
-ATCCTATTTTCTCGTCTCAAGCAAGATGGCACAGTATCGATTCAGCAGTATTTACTAGAA
-CCCACTCTGTGCTGGTCGGAGGTTACTAAGACAGGGTCCTGGGATGTTCATTCTCTAAGT
-CTTTCCTCCGCTCTGTGACCCACCCTCCTTCCCCTTTTGAGATCTGGTATTTGATGCCCA
-ACACATTGTCCACGCTGTGACGTGACCATCATCATAGCAGGCAGAGGGCGCCTCTGCTGC
-TGAAGGCCTGTGATTTTGTGGGGAAGGGCCTGTTCTAGCAACTGGAAAGGCACTGCCACC
-TGCCGTTGGATGCCAGGACTCAAGAGCTGGCCCCAGTCACTGTGCGCAGAGCTGTCTGAG
-AATGTGTGAGTGGACTGGGTCCTTCGGCACTGCCTGCATTGGCTCAGGGCAGTCAACCGT
-CGCAGAGGATGAGGGGCACACTCAGGCAGCCTCCCCGGCCCTGGAGGCAGAAAGGCCCAG
-GCAGAACCACTGACTGGGAGGAAACAGAAAAAGCAGAGGAGAGCCAGGCTGCAGGCGTGT
-GGATGGGACCAGCTCAGGCAGACGCTGTCTCATACCCACTCTCCCCTCTCTTGCCAGGGC
-CTGGCCTGGTGTCTCTCAGGAGCCTGGGCATGAGACAAAAGCAGAGATTGTTCTCTTGTG
-GTACCACAGGCTGTAACCAgtccacccagtgttgttttagaaatttaaatcggttgccca
-tctttttaaattggcaacatcgtttaccacattaaaatctagatgccctgcttctcttga
-aaatgtcaaagcttggtaatgccaggtcctcacttctacctggggggaatggagtcacag
-agatgtcaaatctcttcatggggtgtacaccctccagtttgccacagtcctcaccACCCC
-AGGACTCACGCCGAGGCCTTTCCAGTGCCCTTGCACCATCCTTTTTCTCGTAAGAGGAAG
-ATGAAGTGGGGCTCTACGCGCGGCGTATCACAGGTGAGGGCGAGACCAGCAGAGAGGGCT
-GTGCTGGCTGTGGCTTTGCTCGGCCTGCCCCATCCATGCTGCAGTGGTGCGGAGGAGCAG
-GGAGCTGTGTAGGGCCAACCCCGGTTCCTGCCTCAGCTCCACCCGCCTTGCACCTGCAAG
-TGAAAGGTCTTAAGACGAGCAGGCCCAGGGCACCCTCTACTGCAGGGTCAGGTGGAGGTG
-CCTCCACCTCCCAAGGCTCACCCATGCCAGGGGCCCAGAACTTGAGAGGCCAGCACCAAC
-TCTCCAGGGCCGAACGAAAACCAAACCCCAGGGCTTTGGACTCAAACCATCGAGAGGAAG
-CAGCAAGAGGTCCCAAAGGTACTTGAGTGACACAATGATCATCATTCTCTCCTCAGGGGC
-AGGACAGGGGCAGGGGAAGGTGAGTGGAAGCCCATTGCTCAGATAAAGAGCAGCTGCCAC
-GGAGGGTAGCCCGTCGGCCTATGCCGGCGCTCACTGGTGTCTTCCTCTAGTGCTTGGGGC
-TGGCATGGAATCTGCTCAAATGCAGGCAGCTGAAGGTGAGCCCGCAGCCTGGTGATCCCA
-AGTGCCAACCATGAGGAAGTCTGGAGAAAAGACCAGGGAGCAGGGGCCCTCGTGAGGAGC
-AGGAATTGGCAGCAGGGGCCACCAGCAGAACACCAGAGGGGACAGTGGCAGGGGGAGGAA
-GATACAGCCAGGCTGGGTCTCAGCCCCAGCTGAGGGTCTCACCTCTTAGCTGGTGAAGGC
-TCCGGCCTGTTCCTGCTTTCGGTCACCACTTCATCCCTGGGTGATCGTGGGCCCGGTGCA
-GGGCTGGCTACAAGTGTTTGTTGATTGGTAACTGCTCATGAAAATGGCAACAGCACTAGC
-ACAGCTTCACAAATAGAAACACATTTCACCAACACCCTTGCAGGAAGCCCTCCAGGAGGG
-CCAAGACCATCCCTGCTTTACTGTTATGGACGTGAGCCTCCGAGAGGCAGTGACTTAGAT
-GCTCACCCAGCCAGGAAGGAAGGAACACACTCGACCCTCAGTCTAAGACCCCATCAGGCC
-ACTAATAATTCTCCCTCCAAACCCAGCTCAGGTCAAGGCCTATCTTCACCCCCAAATCAT
-CCCTAAGGCAGCCTCAACTCTCCACAGCACTACAGCCATCCTGCCCGGCCCCAGTGCTCC
-ACAGACCCTAAACCCGAGCCCTCCCGGGCTTTGTTGGCCCCAAACCACCTACACTTGTTA
-CGTGTTATTTTTACACTGGCGTTTCCCCTCAGCCTTGCATACTGTGTGGTGTTGTCTGAC
-ACCACTTTTCCAGCTCtctgacaccaactggggctagtgtcaggttccacagattaaagg
-gctcagtcccacacttccgatggagtcacagatggggtgcccaggctacccacacttcct
-gggctacccacacttcctgggctacccacacttcctggccaactacacattcaggggttc
-ccatgactccaccccctcaggttcaataatttgcctgagtgactcagaactgaagatcac
-cctgccctgacgcttcctggtgtggtgtcctcaaggatgcagtgtgggcaggaacagcca
-cgcttgagatgaacagggttagggatgggagCGACTGGCAGCCACTGCAATCTCAAGTTT
-TGGGGttttttttgttttttttttgagacggagttttgctctgttgcccaggctggagtg
-caggggtgcagtcttggctcactgcaacctccgcctcccaagttcaagtaattctcctgc
-ctcagcctcccgagtagctgggattacaggcacccgccatcatgcccggctaatttttgt
-attttagtagagacggggtttcaccatgttggccaggctggtctcgaactcctgacctca
-ggtgatccacctgcctcggcctcccaaagtgctggaattataggcgtgagccaccgcgcc
-cagccCTGAATCTCAAGTTTGTAAAGTGCTCCACCTCTGTCACTCCAACTCCCAGGAGTC
-ACTGCTtgggattgaaagtttccgccctcgaatcacctggtctttctggtgcaggagcaa
-ccccgaggcaatctaggggccctgctctaacgaattcattagcatgaactcaaatgggct
-ggaaaggggttatgaataacaaaagacactcaccactcacgaaattccaagggttgtagg
-agacccgtgttaggaacccaggagaaagaccaaatatttcttagtatcccacaCATACCC
-TTCCTTTAGTTCTCCAATTATCATAATTCTATTCATCCTTCACATTCCACCCTCACCTTC
-TATGAAAGTGCCCTGAATTTGCTGCAGGATAGATTGCTCCTGGAGTGCAGCTCTGGTGTG
-AGCTTTCAGAGGCAGCGCAGTGCCCTGGGCAGCCTGCGTAATCCACGACTGTCAGATCAA
-AGGGCAGTGTGACCCTGGCCCACAGTGGCAGGAGCTGAGTGCCACTGGCTTGGCCCCGGG
-AACCTGCGCATCTCCCCTCTGAGCCAAGGAAACAAACAACACAGACAACAGTGTCTCCCC
-GATGGCCCCATCCCCAGGGTGGAGGCCCTGCACCGGGCACTGCTCTGCGCGCGCGCTCCC
-CAGCAGCCAGCAGTGTCTGGAGGATACTGGAAAGCTTGGCAAGAGTAGGCTGAGCAGCTC
-CTCTGTGGACAGAAAGGGCATGTGGAGAAGCGGCACATCAAGCTCTGGTTAGGATCCAAA
-ACCAAATGCCAGCTCCTAGGATCCCCAGACCAGGGTGTGAAACACACCAAGAGCACCCCA
-GACCCGCACCAGTTGTGTCGACTGTGACAGTACCCAGAGTGGAAAAAACATGAActcaaa
-ctgtgttttcctccactgctctctcaataccaacagacatctgtggccaaatgtgttggg
-gatttctcccctgacaccaagcaagcaagcaattctgcagcctacatcagctgggtatcc
-tccaattcaattcagtgctcaccctacctatagtatctggaaatggaatccacaggttca
-aggctctgtcccacaagaccgccgcctctgccacaacattggactgaccaccctctttgg
-gtggcatgatttgccaagagtggctcacagaactcagggaaacttatgtttaccagttta
-ttacaaacattattagaaaaggatacaaataagtaaacagccagatgaagatacacacag
-ggtgaggtctggacgggtcctgggcaaatgctggagcttctgtccccatggagtgggggt
-gcgccaccctcttggcacatggacaagttctcgttcccctccctccacatgttcagctct
-tcagaagctcccgtgttcctgggccttttatggagacgtcattggataggcatggctgaa
-gcatggcagctgtgttgagatgaaactggacaaaaagcataaggtctaaacccagcaagg
-cctgtctgtccagatgcttcttggcctctctgtgcagcgttcctccttccgggtatgggg
-cagcaccctctctggaatgagggtcttatgagctacagtcagattaaagtctggtgttga
-gcaagtgaaatggggcaggagaaggtcacagacagagattccgttttctgaggcctgcag
-tgtcccaacattataacaaagggttatgggagtgatgaaccaggaactgtggacaaaaac
-atctacacacgtataaaatatcacaGTGCCCTGGGCTGCAGCTGGAGTGTGTGGGTCATA
-ATtcttgcagatgaaacagaaacagcaagactgtaggtactgcccaaggtctcctagcca
-gtcaaggctgaccaggagtcCACAGACCATGGCACAGTTCTGGGCCTGACATGGAAGGTG
-GGAGCATCCAGATCAGAGACCATTCCCACTGAGCGGTGGCCAAGGACGGAATGACAGAAG
-AGGTGATTAGTAACCACATATGGCTGTTTATTTGATACAGGGCTCTGTACAAAATATTTA
-CACATATTCTTTACAGAATAAGTAAACCACCTGAAGGTAATTAGATAATGCTTTCTTCTC
-AATGACAGGGAGAATCCTGGTGTCAGCAAAGTTAGAAAACAGATAAACATTCTCCTTCCG
-AGGCCACAACTCAAGCAAATGCCACTTGCTTCCTAGGATCTGAAAAGCTGTGGCCTTGGG
-ACCCTGGTCACATGCACCTCCTTTCCTCAACCCCATCAATTCCTTCAGTATTTACAAACA
-GGCTTGAGTACTTGTGGAAGGAGGGGCAGCTGGTGCCGCCCACTGAGAGGATGACAAGAG
-GGCCAGCTTGCTTTGGGAGAGCACTGGGAATATCTGCCGCATCATCACCTCTGGAAGAAT
-TTCCTTTGCCCTGATGAATACACCACTGTCTAAATTAATCCATCGACATCACACTTACCC
-CACAGTGGGGCTCCTGAGCCATGGACAATGATCCATCCCTTTGAGCTTTTTTTGGTTTTA
-AAGTGCGTAGTGGTggctgggcgtggtggctcacacctgtaatcccagcactttgggagg
-acgagacgggcagatcacctgaggtcaggagttcgagaccagcctggccaacgtggcgaa
-accccatctctactaaaaatacaaaaattagtcaggcgtggtagcaggtgcctgtagtcc
-cagctactcgggaggctgaggcagcgagaattgcctgaacttgggaggcggaggttgcag
-tgagctgagactgcaccactgcactccagcctgggcaacagagtgagactccatctcaga
-aaaaagaaaataataataaaataaaTAAAAATAAAGTGCTTAGTGTAACTCAGCGGACAG
-GGCTCCCAGCTGCTCTGGCACGTGGGACACCCTCCACCCTGCACACAACAGGCATGCAAA
-GAGGACTGGATATGGTGGGGTAGAGTGCTTCTGGTGTGTTCACTTTAAGAAAACATCTGC
-CAAGAGAGAAGAGTGCCCAGGAAAGACCAGGAAAATACAAGTACATGGCTGCTTCATACC
-ATATACCCCAATTCTTTAAAGCAGCAAAAGGCACTTTTTTTTTCAGGCCAGAGTGAATCT
-AAAACAAACCTGGCTTTGCTTACAGGGAAGCTGTCCCAGAAGGACTGAGTGATGCCTCTT
-GTTCCCTAAGGTCTGGAGAGTCTTTGCAAGTTTCCAACGACATTTCCAACCAGGTGGGAG
-AGACCAGCAGTTGACGAGTCAAGTCAGACCCAAAAAACGACGCCAAGGTAGTGAGTGGGT
-GCCTATTTGGGAGTAGGATGATTTGAGGAAAACAGGAAGAAAAACCGGTCAGAAAGTGGC
-ACTTTGGAAGTGGAAAGCTGTTTGCAAATAGCAACTCTGGCTAAAGCGAAAATGTTAATC
-AAGTAGAAAGTAAAATTCAGGATCTTAGAAGCTCATCCTTCTGATGAGAACTATTTTTTT
-TTCCGTGAAGGAACTATTATTACTTTAAAAGTGAGGGTAATTTACATATGGGGTGTATAT
-ATTCTAAAAATAGTAATAAAAGTACCTTTTATAAGCAATGTTGTGTGGCTTGTAGAAGAA
-AGCAGGGAGGAAAAAAAGGCAGGCAAAACTAGTCTAGGTCTAGGCCCTAAAAATGAGCTT
-CCTTCCCACTTGACTGGAAACGCCCATGTGATTTCTAGGCTGAAAATAGGTAGGATTTAA
-CGAGTAACCTAGTTCCCTTCTGTCTCTGATTTCTGATCAGCTGATGGAGCTGCTAGTAAG
-AGGGGCCGATCATGCTCCCAGACGAGTCCTTTGGCCTCTTGCTCTCCATCCCAAGCCTGA
-CTCCTTCAGCAGCAGCCCCCTCCTTCTGTGTCCATCTGATGCAGGCAAGCAGGAGCAGTA
-AGAGGGCATCCCATGTTCCAGTTCACCTTCTATGGGGTGACTAGGAGGTTCCCGGTAACT
-AGGGCAGCCCAGGCCCAGCAGGTTGCAAAAGCAGCTGCAAGCTTCAGAAACCCACTTCCT
-CCAACACCAGGGAGGTGGCAGAGAGCCCATCCAAAAGCCCACTGGGAGAGGCATAAGATT
-CTGTGCCAGGCCCCCAGGTCCCCTCTGTGTCAGGTAGGCTCTGCTACTGGCCTCTGAAGT
-AAAGGCAAACACAAACGGGCAGGGCAGGGTGGCAGGAATAAAAAACTCTGGACAGAAACC
-CTTTTAATAAAGGAAATTCCACCCCTCCCAATCCTTCCATGGAAGGGTGAGACCTTAATG
-TGATGTAAGAGGAAGGTCTTCTCTGGCTTTCAGGGAAACAGCTGCAGCTGAAACTTAGGG
-GCCCATTCCAGGGCACTTTTCACCACAGCCAGTGCAGCCGCTCCAAGTGCCACTGTCAGC
-CCCATCACTGCCAATTTCACAAAGCGGTTGGTCCTTGGCTTGGTCAGGACATCTTTTGTT
-CGATCTTCAGGCCGCAGAAGTCCCCGAAACCGCTGCCGCAGCACCATATCAGGCCTCTGC
-TGGGCTGATGCCAGCTCAAAGTCTTTGAAAGTAGAGGCTGCCGTCCTGCAGGGGAAAGAG
-ACGGAAGGAAGGAAGTGGTATGAAAGAGGAGGAGGAAAGCAAAACTACACCACATAGGCT
-GCGGGCAGAGCCTTTCATTGCTGGGAAAGCTCTTTATGATAAAGACCCATATGTCTACAG
-TGGGGATTCCACTGGCCTAAGCTCAGATCTCTGGAAACATGCCCCAACCCTATCCCACCA
-GACACAAACCTTCCCTCGCTTCTGCTCATTTACAGCCACCCCCATTCAACCAGTGTCCCA
-GCCTTGCTCACCTCTCAGCTTGCTGTTGGGCAGCGGCCTCCCGAGCAAGTTCGGATGGGG
-GAAACTGAACAAAAAGGTCTCCTGCTCTGCTGATCAGTGTCTCATAGGGCAAGTCCTGAG
-GGATCTGGGACAACAGGTGGTGGACCGAGGCCATGTCACAGTCACAGTCCAGGACTTCCT
-GCTCGCGATACAACACAATCTGTGGGGAGGTAGTAAAGCCTTGCAGTCAGAGGCCAGACA
-CACAGGGCCTGGGCCACCTGCACTCCATTATCCTTGCAGATGAATTTAAACTGGTAACAG
-ACAGGACTCAGCCCAAATGTTGAGCAAACTCTTGTATCCATCAAGGAAGTAATAACATAT
-ATACGCTCAGTGCTACTCCTACTCTCTGGCCCTTCCTGCAAACTTCCACCACATGACATG
-AAAGGCTGACCAGTTACAATCTAAGTCCTTCGGGCATGCTGGGCTGCTCAGGTGTCCCTT
-TAAGTCTTGAAAGAAATGAAGGAGATTCTTTTAGGAGAAAGTAGGAGAATTATTGGGAGA
-TTCCTGGAGCTCCAGCATAGAAGAAATGGTTCAAAACAGTAGAAAGAACAGTCTTGCTCC
-CTTTAAGCATCTTCCTTCTGACTGTTGGTCCACAAATCCACAGATGCTCAAGGGACCAGT
-GGTCATTGAAGGACTTCCCTGAATTCCCATCTCCACCCCATCCCTCAAGACCCTTCTACT
-AACTGAAGCCCCTACCCTCCACCGCAAGCCGCCTCCCTTGTCTGTCATGACACCAGATCT
-CTTCTTTTCTTAAATCTGGAGTTGACAGCTTACGCTACTATTTCCCTAATTGTGTTCATC
-AGCTGAACATATATTCCAGACAATGTCAACAGGAACCCTGACAattcacaatgcagatta
-gcattttaaaggttcagaagtgtcatgcagcaaaaaaaatctgattttgtttatacccag
-catttcccaacttactATTTTTTGTGTGTGACACCCCCATTAATACTGCACAGAATGGTG
-TCCAGGGACACCAGCCTGGGAAGTGCTGTCTTTTGCATCTTTCCATAATCCCCAGGTTTC
-CCTTCAGGGAAAATGACCACAGTGGGATGGGTGATGGTGAACCCAGCTGCTGGCTCGTGG
-CCTGTACCTACCACGGCTGCAAAGTAAATCGGCATCAGTGGGTGGCAGGCCAGGAAGAAG
-TCATATAACCGCACGACGTGCCTGAAGTCAGACAGGACATGCCCAAACCAGGTGATGAGC
-CAGCTGAGGGCAAAGATGGTCCCTACCTCAGCACTAGAAACAAAGGAAAGGCAGGTGTCA
-GGTCCTGTGGGCCATCCCTTCCCTCTCTCTGGGCCTTATAGCGCTGGTGAGAAGGAAGCA
-TTTAGGAATAAGATTTCTGGAAAATTCAGTTACCTAGGAATTCAGCATCTTCTCCTTACA
-AAATATTTAATACAAAGTCTTTAAGGTGTACCACAACACTAACACCACAACAGGGTCCTG
-GCTGCTTTATCTCACTGGGTGCTCGCCTACTGGCCAACAAATGTCAACTACAGGAACGAG
-AAGCAGTTGTTTTCAGAGAACTACGCCATGATTCTCCTTCTGACTAAGTCTTACCCTTCT
-GGGGGGCACAGGTACATATTCCCAAGCCTGAAAACATGACTGCATTAATTTTTCTGTTAA
-CATGAGACAACTGAAATATCTTAAGATGTAGCTgccagacacggtgagtcacgcctataa
-tctcagcactttgggaggccaaagcgggcggatcacctgacatcgggagctcgagaccag
-cctgaccaacatggagaaaccctgtctctactaaaaatacaaaattagccgagcgtggtg
-gcgcatgcctgtaatcccagctacttgaggctgaggcagaagaatcgcttgaacccggaa
-gatagaggttgcagtgagccaagatcatgccattgcactccagcctgggcaacaagagaa
-aatactccatctcaaaaaaaaagaaGGCATAGCCATTACCttttaaaaaattttaaaaaa
-aGAGGCATTGGCCAAGAACACATTTCCAACTAAACAGAGAAGAAACAAAACATCACATGG
-GATTTGCAAAAAAATATTTCTTCTCTTTGGTACTTGGGAAATAAAACAACCCATTGTTGG
-CCTTCCCCTTCTCGCCACTGGATCCCACAGGACTTTGTGTTTCTCTTGTGGCAATAACCT
-CAACATCTTACCTTGGCATACATACCTTATCCACCTCTCCCCACTAGATGTAAACTCAAG
-GGATGGGCTATGTCCCCCAAAGAGCACAGTCCCCAAAAATGCTCCAAGAACTGAATTACC
-CAGATTGCTGGTGACTGGAACAACTGGGGAGAACTTAACAAATCCACCCAAGACAATGAG
-GAAACTGCGCTCGGCTTGTGAGGAGTGTTTCAGGTGTGGGGGGGTGTGGGCGTGTGTATG
-CATGCACACAGAAATGCAGACACATATGTACCTCTGCATGAAGTCATGGAGCTCTGGATT
-CACCTGGTCAATGATGGGCATCAGATAGTTTAATATATGCTTGGTGTTGTCCATTGTTGG
-ATCCATAAAATCCCTGGAGGGAGACAATTCAATAAGCCTGGTTACCAAACACTTAGATCA
-GGGCTCAGGGTGGCGAGGGCTCAAACTCCTAAAAAAGCTGACCAGAAAACAGGCCAGTGA
-GTTATCCCCAGGACGGCTGAGGAGTGATGCCCGTCGTCTTGTGTTCCTCTCTACTGGTAC
-CTGAGGTGGTGGGTAGATAATTTTTCTACCAGGGATGTTGCCAGCCTCTCGCCTACCACC
-AGCAGAAATGTGACCACAATGTCATGGTAGCCCTGGTAGTAGTGCAGCTGAGGGTTGCGC
-TCCAAGATGAGGAGGATGATGTCAATCAGTTCTTCCTGGAGCCCTTCTCTCTGTTCCTCT
-GGCATGCCTGGGGACAGGAACAGAGATGCCTTTGAACATACCAAGCAGCCTAGTTAACAA
-GGAGGTCGAAGAAGGCCAGCAATGAATTTTCAGAGAAAAAAGGAAAATGAATTACAAATA
-ATTTGGCAACGCATATCAAGATCCACTGTTGATACCACCTGGCATACAGGAAAAGGCAGC
-TGCtagctttccagtaggggaagctgcagatgccaccctaaccaagttgctgcagttaat
-actgctgggacacagtatttaactgcagaatttcaactatgggagccacagacggcctct
-gcctcccgaggtgatgcactgacagagctcagcatcatgtctgcaggatttctatcaaca
-gcgcacagacctcaatctcacaatgaagaaatacccaatatccccaaaggaagagaaatt
-taactctcatacaatacaaaggaactgttccagattaaaaatggctaaagatataggaca
-acagcatgagaaacgcataaatctatatttccttttccagtgaagcacattactcgaaga
-aatggtgaaatgtgaataaaatctgtggattaattagttaactatttttcagtgttgtta
-ctgatgttgctcagtgtactgtgattacatgagagccttatatttaggaaatatgtcctg
-aaacacttggggtaaaaagatgtcatgtttgcaacttactcttaaatagttcagagaaaa
-agtgtatgtctatgtgtaaagcgaaggaaagacagaaagcagctaaaaaagcaaatgtag
-gccaggcgcggtggctcacgcctgtaatcccagcactttgggaggcagaggcaggtggat
-cacgaggtcaggagatcgagaccatcctggctaatatggtgaaaaaccccgtctctaata
-aaaaatacaaaaaattagctgggcgtggtggcaggcgcctgtagtcccagctacttggga
-ggctgaggcaggagaatggcatgaacccaggaaccagagcttgcagtgagctgagatcgt
-gccactgcactgcagcccgggcgagagagcaagactccgtctccaagaaaaaaaaagcaa
-atgtagtaaaatgtgaaaacaaaaggaaatctgggtaaaaggtatctggggaattctttg
-tcctatttttacaacctttcagtaagtatgaaattatataaaaataaaaaAATTTTAAAG
-TTACACGGTCCCCTTTAAACCAAAGCAAACGTTACAGGAAAAACTGATCCTCTTGATCCA
-AAGATGTATTATAGCTGGAAATAGGGAAGCCTGTCTCAGGAGTTCTTTCAGGGAGTTCTT
-TTACTGCTGGAGCTAGTGCTGCCAGCAGTAAAAATGCCTTGGCCTTATGAGCCAGGTTAG
-AAGAATGGCACATGCACAGCTTCTCCACACCATTAGCTTTCAGTTACAAACACATACTCA
-GAGAGAGAAAGCAGCTAATGTAAGGGCCCAAACTAAACCGGACAAAGGATTGCAGGTAAG
-AGCAAAACTCACCTCTTGCCCATATTTACCCCACCCCTTCTCAAATAAAAAGCATACCCT
-AAAAGATAAATAAGGAAACGAAGCAAACCCAGGGCTGCTGATAGGTGAAGCAGTGAAAGG
-AGTGAGAGTAAAAATTAAACCCTGTGTGAATTTTCAGCAGAAAAGCAGTGAGCCAAGCCC
-AGAAGACCATGAATGGAAAAAGAATATGAAGCCACACTGTAAGTTCAGCCTACAGAAAGC
-GTATCACAGATATTACATCAATGGAAGAGGAATAAAGGGTTCAGAGGGAAAACAGGTTAC
-CTAGGAAAAAATGGGggtggctcttgcctgtaatcccagcactttgggaggctgaggtac
-gtgcatcacctgaggtcaggagttcgagagcagcctggccaacatggtgaaaccccatct
-ctattaaaaacacacacacacaaaattagctgggcgtggtggcgggcacctgtaatccca
-gctacttgggaggctgaggcaggagaactgcctgaacctgggaggcggaggttgtagtga
-gctgagacagtgccattgcactccagcctgcaacaagagtgaaactctgtctttaaaaaa
-aaaaaaaaaaGGGAGGCATCTGTCCTATATGATCTCATCCAAACCAGCAGGCTAGGAAAA
-GGGAATGGACCGTGGGCATGTGCTTTTATCAAAACCACGCTGGCAGGCTACTGCTACCTG
-GGTATTGCAAGAATCTGTCCAGGGAGCAAGAATGCCAGCAGGAAAGCAGCCCCTTCAACA
-ACAAAAGCCAGGCCAGAGCACAGTGCAGAAGAGGGAGGCAGCCAGCTTAGAGGCTCCTGT
-TCCCTTTAGCAATTCTCCTCTCTTCATGACCTAAAGGTGGAGTTGCCAGAGGAAGAAAAA
-TAGGTCATCCATGTGAGGTTTGTTGCCCAGTTCCCTTCACTGTGAAAATTGAGACAACGG
-TCCTTCTTTTCTTTCTTCCTGAAATAAAGAGGTAATTTTAGGAATACATTCTTTtttgtt
-tgtttgttttgtttttatttatttatttttttatctattGCTGCTTAATTTGTTAATTAA
-GGAATATACTCTTACACAAACAGGGAATGGCCTCTCTTCCCTCTAAGGAATCTTACATAT
-GTATGCGCAAGGTACCATCGTTTTTAAACCTAATTAAGATATTACTCATTCTTGTTGGTG
-CCCAATTCCACACCAATCTGCTCTTTAATGCCAGACTGATGGCTCTAACAATCCTTATTA
-ACTCCTTTTTGTGGCTTCAAGGAAAAACAAAAACCTCTTCTCTCATTCACCACCTCTAGG
-CCAGGAGAAATTATTTTTGGTTCAGGCTTTCACAGTGGGGGTCTGAAAGTGACCAGTCAA
-GAAAAGGATGACTCAGCAAAAGGAGAGCTCTGAAGGTCCCTGAGGCGGCAGGGTCCAGCA
-TATTAGGTCACATGGTATGACCTGGAACAGATACAGTCTTTCCAAATGTGGCAGGACCGG
-GAGAGCTTCTCACCAGGAGGGAACCGCCGCAATGACCGCCGGACGTCCAGCAACACTTGT
-TGGTAGTCCTTGCTCATCTGCCGTAGGTTCTTCCCTATTGAAGGAAAAGGCACGTTATTG
-CAGGAATGCCTGAGAAGCCAGACCAGAAGCAAAACATTCTGGGATGACACAAAAGGCCTA
-GAGGGCACATGTCAGCTTCTCCTGAAGAGGATGATATGACTCAAGATACAACATTTGGCA
-GGGAATCCCTAGTTTGGTTCCAAACATTATGTTTCCTGCAAGTCACAATGACCCTAAGAG
-AAGGGAGCACAGACTGCCCAGGAGACAATACAGCAGGGTGGGAAGGAGAGCAAAGACGTA
-AGGAGGCCAGGCGCCTCGTGCAGAAGGCCACTGTGCATCACTGGGAACTGCTCTGAATTT
-CAAAGTCCACAGCTACAAAATGAGGATATTCCAAGGATCAAATAAAATCATGAATGTGGG
-AACAACAGACCACTGAAAAAAACCCTAACGCCTATAAAGTTGTGGGAGCACTAAGCTGTT
-TAGAAAGGTATATTGAGACTCACATAAAGAACCACCTAACAACTCTTGACCCAGCAATTC
-TAAAACTAAAGAGCTGCAAAGAGGAGACAGTCCTTGTGTTCAGCTGCTAAGTCCAATACA
-GCATGAAAGGAGGCAGTCTCTAGCCATTATACATATAACAAGTGTACATTTCCTCCAACC
-AAACCAAGTGCTGTATAATAAGCGTACATTTCTCTCACAACCCAAATCCAAAGCTAGTAA
-GGCTGGGCAACACTTCCTCACACGTAGGCTTCACGGTATAAAAAGATGAGGGAAGTTTGG
-AACCTGATAGAAGAACATCATCTCAGGATTCAGGGTGTGAACATGGCACTGCCTTAGCCT
-TCCAACAAAAAGCTGACTGCTCTGAAGCAGCCAATTCCAAGGATAATAACAAGTGGCAAC
-TCAACACCTACTGGGTGACATCATGACGCTGTGAACTTTTTGGTGGCAGAAGTCCTGTTT
-CAATCATCTCCAGTACCTGGCAATCATAGCACAACTAATATTTGCCAACTGAAAGAATCC
-TCAGCACTTGGCATTTTGCCATGATGGCAGGAAAGCTACAAGGTGAGTGCACTGAGTGAA
-TGAGCAGCAGAGTGGATTCACTGTTCTACAGGACTTTTACTATTTTGAACTTCATTCCAA
-GGAACTCTTTTCACCACATGGGCCTTGCACATTAGTTAGGTAACTCTTTTCACAGAATTA
-CAGGATTTTAGAACTCCAAAGGATTTCAGTATTTCCCAATAAAAAGAGGGTGttttcttt
-ttttttgagtatctcactctgtcgcccaggctggagtatactggcgcaatctcggctcat
-tgcaacttccgcctcctcggttcaagcgattctcctgcctcagcttccctagtagctgga
-attacaggtgtgtgccaccatactcagctaatttttgtatttttagtagagatggggttt
-caccatgttggccgggctggtctcgaactcctgacctcaagtgattcacctgcctcagcc
-tcccaaaatgctaggattacaggcgtgagccactgtgcccggACAAAAGAGGGTGTTTTT
-GTGTGTGTTTAAttttactttacttttagagattggatcttgccatgttgcccaggctgg
-cctcaaactcctgggctcaagtaatcctgcctcatcctcccaagcagctaagactacagc
-cgtgcaccaccatgtctggctagtttttaaatttttgtagagacagggtttcgcaatgtt
-gcccatgctggcctcaaacttccagtctcaagtgaccctcctgcctcagcctccgaaagt
-gctggaattacaggtgtgagtcacctcgcccagccACAAAATACGCAttttttttttttt
-tttttttttttgagacggagtctcactctgtcacccaggctggaggacagtggtgcaatc
-tctgctcactgcaacctccaccttccaggttcaagcaattctctgctgcagcctcctgcg
-tagctgggattacaggcacctgccaccatacctggctaatgttcgtattttttttttttt
-tttttagtagagatggggtttcaccatcttggccaggctggtcttgaacttctgacctca
-agatccacctgcctcagcctcccaaagtgctgggattacaggcgtgagccaccacacccg
-gccCAAAATATGCATTTTTAAAAAACACTTGCCAAGCAAGTATGCAGAACAAAGCATATG
-CATTTTTAATAAATTCACTTGCCTAGCCAATATTTTAATCCCTAATAAAAAAAGAACTTG
-Cctgggcgtggtagctcatgcctgtaatcccagcactttgggaggccgaagcaggctgat
-cacttgaggtcaggaattcgagaccagcctggtcaacatggcaaaaccccatctctacta
-aaaatacaaaaattagccaggcatggtagcgcatgtctgtaatcccagctactaggaagg
-ctgaggcaggaaaattgcttgaacccagggggcagaggttgcagtgagctgagattgtgc
-caccgcactccagcctgggtgacagagcaagactccgtctcaaaaataaataaaataaaa
-acaagtaaaaaaaGAACTCATTCCACTTTTGAATAAAATTCTACTTATCGGTTTGGCCTT
-ATTTTCAGAGTGGGCCCAAGCATTTCCCAAAACACCCTAGATTTATTCATATACCCTTGG
-TTTGAAAGGACCATAAAAATTAAAGATCCTGGAATTCTTTTCCCCCTGTCTCCTAGATAA
-GCTCCCCTCACAGCCTCCCCCACTCCCCTTACCTGATATAGGAGGTGGGTCATTGGCATT
-GACATTGAGGAGCTTGGGCCACACTTTTCGTCTGATCTCATCAGTCAGGAGCCCTCCTTC
-ACTGATAGCCATGCGTCTAAGGGCAGCCACATCAGTGGGATCACTGTTCAGAGCCTGGTG
-TATCTCTGCCACTTTCTTTTTCCTTTTGGCGTTAAAGTCTGAAGATAAGGATAGGGAAGA
-ATTAGGCGCACATTCAGCACGTGCATATTTTCTGCCTAGGACTCAAGCTCCTTTTTGATA
-TGAGGTACAGGTAAGTATCTCCTCTTAGCTCTAAGACTGCCTGCTGGCATAAAGTCTCAC
-AGCCAGATGCACTATTCATTTCGGGCCCAGTCTACTGGACCTCATGGTGGGAGGCTTGGA
-GAGCCCACTATAAAACAGATTTTAAATCACCGATTTTTAAAAAGATAGTCTCTTTTTATA
-GGTCTGAACCAAAAATCATAGGCACAGACTGGAAATAATTATTAGTTGTTGTTGTTTTTA
-AGAGACAGTGTCggctgggtgtggtggctcatgcctgtaatcccagcactttgggaggcc
-gaggtgggcggatcacaagttcaggaattcgagaccagcctggccaatatggtgaacccc
-cgtctctcctaaaaatacaaaaattagctgggcatcgtggtgctcgcctgtagtcccagc
-tactcaggaggctgaggcagaagaatcacttaaacctgggaggcggaggttgcagtgagc
-cgagatcgtgccactgcactccagccaggatgacagagcgagactccgtcttgaaaaaaa
-aaaaaaaaaagagacattgtctctctaagttgcccaggctggcctcaaactcctaggcaa
-aaccgatcctcccacctcagccttccaaacagctgggactacaggtgcatgccaccatgc
-ctggTCCAGAAATAATTACACGTACttttttttttttttttttttgagacggagtctcgg
-tctgtagcccaggctggagtgcagtggcgcaatctcagctcactgcaacctccgcctccc
-gggtcccggttcaagcaattctgcctcagcctcccaagtagctgggatttcaggcacgca
-ccaccatgcccagctatatttttgtatttttagcagagatagcgttcacaacgttggcca
-gggtggtcatgaactcctgacgtcgtgatcctcctgcctcggtctcccaaagtgctagga
-ttacaggtgtgagccaccacgcccagccTATATGTACttttttttttttttttttgagaa
-ggactcttgctctgtcgccaggctggagtgcagtggcacgatctcggctcactgcaacct
-ctgcctcccgggttcaagtgattctcctgtctcagcctcccaaTACATTaaaaaaaaaaa
-aaaaaaaaaGGTAAGTGAggctgggcacggtggctcatgcctgtaatcccagcactttgg
-gaggccgaagtgggcagataatgaggtcaggagttcgagaccagcctggccaacatggca
-aaacctcatctctactaaaaatacaaaaattagccaggcgtggtggcatgcacctgtaat
-cccagctactcgggaggctgaggcaggagagtcgcttgaaacccaggaggctgaagttgc
-agtgagccaagatcgtgccactgcactccagcctgggcgacaaagtgagactccgtctca
-aaaaaaatgataagtgaaaaaagaaaTGTGttaaaatcagacagatcttggttcaaatcc
-tggctctgccacttatctgatccataatcttggacagatgacttccctgctctgggcctc
-TGGACTGACACCCTCTTGTCAGGATAGTTACCATGGTACACAGTAGATACTTACTAAATA
-TTAGCTCCCCTCCTCACTCTGAAACAACATGTATTTTACAAATCAACCTACAGATATTTA
-ATTAGTACGTAATATGCAAAGCACTAAGGAGATATACTGTGTAAGTAACAAGCAAGGAAT
-TACAACTATAATAAACGCTCAGTAAATTCAGGCATATCTAGCAGTTAGTGTCAATGTTTT
-CATACAAGAATGTCCATTCTTAATTCCCAAACTTCACAGAGCATATACATCTCTTACTGT
-AACAATTTTTTCCTGTTGTTTAAATAGGAAAAATGCATGTCACCAAAACTCGATACTACA
-TTGAAAACATAACCACATGAAAAGGTCTCCTGTTACACGCTACTACAACTGGTAAAAACA
-TTAGAATCACATAGAGAtttttttttttttttgagatggagtctcactgtcgcccaggct
-ggagtgtaatggcgcgatctcagctcactgcaacctccctgtcccaggttcaagtgattt
-tcctgcctcagcctcctgagtagctgggattacaggcatgcaccaccacgctttgctaat
-ttttttttttttttagacagggtttcaccatgttggccaggctggtctcgaactcctgac
-ctcaagtgatccacctgcctcagcctcccaaagtgctgagattacaagcgtgagccacca
-cgcctggccAACACAGAGATGTTTTCAAAACCAGTGTCAAAGGGTACTTGGGTTTCCAGT
-GTGGCTGGTGACACTGCCACCAGACACTGCCACAGAGAGGCTGTGACACTGCATACAAAG
-GAACTGTTTCTTAAAAACCATAGTAAGTAATGTTTTAAGCATCTTACATCCTTATGTGAT
-AGTCTGTTATTCATAGACATTTTGCCATGTTTAAATTACTTTTTAGgactggtccctgag
-tggtgctatttacaactcattgattacaatcagttagatttctttgttccttttccacgc
-ccactgcttcacttgactagccttCAAATAAATAAATAAATAACTTTTTTGGGAAATTGG
-TTGGGAATTTGTGGTTAGTAGCTATCATATCATTTTTCTATGTGAAATAACAGAGTATTG
-CTTTTTGGCCTTTGGCTGAGATCAGGGGAGATAAAGGAGTAAAAGGCTCTGAAAGTTTGC
-ATGCAGAATGTCTGCTTTTAGGGATGGCTTGTGGAAGTTAAATGGATGATGCCTGTATTT
-CAGTTCTTTCTAGTTGCCAGTACCATTGAGAAAATATGTCAAAAACACAAGAAATGTTAC
-ACAAGACAACACCAAACGTCACAAGGCAGTAGACTATAATTGTCAAAAAAGGTGCATGCA
-GACAATAATGGCCAAGAGCTCAAAGAGACTGCAGTGGGTCAGGGCCAAGCTAACCTGAGA
-AGTGTACCTTAAAAAGGAAGAGGAGCAAAACTCTCTTGACATGCTTAATTGTGATGTTTA
-ATGAACATCCTTGCAGTGTAAGACGACCTTTTTAAAATACATTCTTggccggggacggtg
-gctcacgtctgtaatcccagcactttgggaggccaaggcaggcagatcacctgaggtcag
-gagttcgagaccagcctggccaacatggtgaaaccctgtctctactttaaaaatacaaaa
-aactagccgggcatggtggcaggcgcttgtggtcccagctactcaggaggctgaggcagg
-agaatcgcttgaacctgcaaggtggaggttatagtgagccgagatagcgtcactgcactc
-tagcctggacgtcagagcaagactctgtctcaaaagaaaaataaataaataaataaatTC
-TCTCGGCTTCAGACCTACCTATCTTTGGTGTCTCAAGTTAAACCCAAAGCAGCACCCATC
-ACATCTGCCTTTTCTTTACTTTTGTCTCCTATTGCTTCCAGATACCTTCTTCCTTTTCCT
-GCAAAGCCCATTCTGCTGGAGTGGAAAAGTCCAATGCCttgatgccagggtcttgttcag
-tcactcaagatggagtgtagtggcacagtcatggctcactgcagcctcaaccATATATAT
-ATAGTTTAAATAAATCAATAAACCAATAAATTCTCTCTTAATGATGGTTTGAGCCTCACC
-ACTTGATTAGGACAATCAGCATAACCTGTAGAATCTTATTTGGAATTGAATTCTGTATTG
-TAATTTTGTTCCTGTTCATTTTTAAATTTTATTTTTCTTTCACTGTAAAGATGATACTCT
-GCTTTAAATGTTAAAAGTGTACAAGCAAAAggccgggcacagtggttcacacctgtaatc
-ccagcactttgggaggctgaggcaggcagatcacgaggtcaggtgttcgagaccagcctg
-accaacatgaggaaaccccgtctctactaaaaatacaaaagttagcctggcctggtggcg
-cacgcctgtaatcccagctactcatgaggctgaaagaggagaattgcttgaaccccggtg
-gcagaggctggagtgagccaagatcgcacaactgcactccagcctgggcgcgacatagcg
-agactccatctcaaaaacaaacaaacaaaaaaaaGTGTACAAGTTAAGGAagccaggtac
-aatggctcacacctgtaatcccagtgctgtggagggccaaggtgtgagaatcacttgagt
-ccacaaaatcgagaacagcctgggcaacaaagtgagaccctgtctctacaaaaagtacga
-aaagttagccaggcatggtggtcccagctactcaggaggctggggcgagaggatcacttg
-agcccaggagtataaggctgtggtgagctatgatagcaccactgcacttcagcctaggtg
-acagagcaataccctatTATCAAGGCACTGGACTTTTCCACTCCAGCAGAATTCTAAATT
-TTATTTAAACTATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATGTGAAGTGGAAG
-ATATCACCAGAAGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTA
-GAAGGGACACCAAGCATCTTCCCCAGCAATGTTCTAGTCTGAGGAAAAGGAGGAAGGTGT
-CCTGGTGACCTGTCTCTAAAAACAAAAACAAggctgggcacggtggttcatgcctgtgat
-cccagcattttgggaggccgaggcgggcagaccacctgagattgcgagtttgagaccagc
-ctgaccaacacggagaaaccccatctctactaaaaatacaaaattagccgggcgtggtgg
-cacaggccggtaatgccagctactcaggaggctgaagcagaatcgcttgaacccaggggg
-cggagattgaggtaagctgagattgcagatcgcgccattgcactccagcctgggcaacaa
-gagcgaaactccgtttcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCAggctgg
-gcgcagtggctcacgcctgtaatcctcgcactttgggaggccgaagtgggcagatcatct
-gaggtcaggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaaaat
-acaaaaaattagccgggcgtggcggcgcatgcctgtaatcccagctactcgggaggctga
-ggcaggagaattgcttgaacctgggaggcagaggttgcagtgagccgagatcatgctata
-tgccactgcactctagcctgggcgacaagagcgaaactccgtctcaaaaacaacaacaac
-aaCGACAGCAACCACGGAcggtggctcgtgcctgtaatccagcatttttttttttttttt
-tttttttgagacggagtctcgccctattgcccagactggagtgcagaggcgcaatctcgg
-cttactgcaacctccacctcccaggttcaagtgattctcctgcctcagtctcctgagtag
-ctgggattacgggcacgtgccaccatgcctggctaatttttttttttgtatttttagtag
-agacagggtttcaccatgttggtcaggctagtctcaaactcctgacctcgtgacccgcca
-gtctcagcctcccaaagtactgagattacaggcgtgagccaccacacctggcctatccca
-gcactttgggaggccgaggtggatggatcactgaggtcaggagattgagacgagcctggc
-caacatggtgaaactccatctctattaaaaatacaataattaggccaggtgcggtggctc
-acgcctgcaattccagcagtttgggaggccgaggtgggcagatcatgaggtcaggagatc
-gagaccatcttggctaacacggtgaaaccctgtctttactaaaaaaatacaaaaaaatta
-gccaggcgtggtggcgggcgcctgtagtcccagctactcgagaggctgaggcaggagaat
-gaggtgaacctgggaggcggagcttgcagtgagctgagatcacaccactgcactctagcc
-tgggtgacaagttctgtctcaaaaaaaaaaaaaaaaggcagaaagaaCATGGATTCACCT
-GCTTATACAAGAAAAAAGGAAAAAAAAAAGTGTACGAGTTGCCTTGTTACAATAAAACTA
-AATGTGTATACACACAAAGGAAATGGAGGACATTCAGGGGCTGGGATGAAGGGTACAGAA
-GAAAGGCCAGGAGATACGGCCCTTCCATTTGACAGTAAATAGACTAATTAAAAAATATTT
-ATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATTTGAAGTGGAAGATATCACCAGA
-AGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTAGAAGGGACACC
-AAGCATCTTCCCCAGCAATGTTCTAGTCTGAGACCATTGTGAGTCTACAAACTGTTTCTA
-TGACAAAGCTGTACattattattattattattattattttatttttattttttgagacag
-agtcttgctttgtctcccaggctggagtgcagtgaagcaatcttggctcactggaacctc
-tgtctcttgggttcaaaccattctcgggcctcagcctcccaggtagccaggattacaggc
-gcatgctgccaccacacctagctaattttttgtatttttagtagagacagggtttcacca
-tgccaggctggtctcgaactcctgacctgaagtgatctgcctgcctcaggctcccaaagt
-gctgggattataggcatgagccatcaggtctggccCATTATTAACATAAATTAAAGTTGG
-TACTAATAAGTCACAGGTGAGCTACCTATGAGACCTGAAACGTAAAACCCACATAAACAG
-AGGCACTAGCTGGTTTGGAGCCATGTGCAATTGGAAGTGCGACAGAAAGATAATAGGAGT
-AACTTTTCACCTCGGTAAACCTGTCCTCCTGGCTTGACTGCTGTTTCCTGGTAACCTAGt
-agggtgaccatttgtcctcatctgtctgagatcttcctggtttatacctagagtcctggc
-acaattgttcacagcaaaccctttctgctccctgtattctcaaatatgtcccagtttgga
-agccaaattaaatggttaccTACCTAGAAATCATTAAAAATAAAACCCCTTCTGGGcaca
-cctataatcccagtactttgggaggccaaggtgggcagattacctgaagtcaggagatcg
-agaccagcctgaccaacatggtgaaaccctgtctctactaaaaatataaaaattagccgg
-gtgtggtggtgcacgcttgtagtcccatctactcaggaggatgaggcaggagaatcgctt
-gaacccgggaggcggaggttacagtgtgccgagatcatgccactgtactccagactgggc
-aacagagtgacactctgtctcataaaataaataaataaaaaataaaataaaATAggccag
-gcgtggtggctcatgcctgtaatcccagcactttgggaagtcgaggcgagcggatcacct
-gaggtcaggcgttcgagaccagcctgaccaacatggcgaaaccccgtctccactaaaaat
-acaaaattagccaggcgtggtggcaggtgcctgtaatcctagttacttgggaggctgagg
-caggagaatcacttgaacccaagaggcggaggttacagtgagctgagatcacgccactgc
-actccagcctgggcaacgagagcaaaactccgtctcaaaaaaataaacaaaataaaaata
-aaaaTATAATAAAATAAAAACCACTGCCGGGCATGGTTTTTAGTCCAGACgtggctcatg
-cttataatcccagcactttaggaagccgacgtgggcagattgcttgaccccaggatttgg
-agagcaaccagcctgcacaacatggcaaaaccttgtctctacaaaaaataggtgggcgtg
-acggcgtgcacctgtaattccagctgcttaggaggcagaggcgggttgtagtgaggcatg
-attgtgccactgcactccagcctgggtgatagagtaagactctgtctcaaaaacaaaaaa
-aaaTCTCCAATTTCTTCTGTCAGCATAACACCTAGTCAATTGTTCATGAGATGTGTCAAG
-CTCTTGACTCAGGTGTGTCCTttcatccattcatccattcatccattcatccGCCTGCCC
-ATTTGtccagtcattcatcagtctgtcacttaatgggtgtctacttgtactaagcactgt
-actggggataaaaagatgaattactccctcccagcccttgaagggctcacagtagggaca
-caaacaattattatatataatagaatctgagggattatgaaaatccagaggaaagaatga
-ctttttttcttcttctttttttttgagacggagttacgctctttgttgcccaggctggag
-cgcagtgttgcgatctcagctcactgcaacctccacctcctgggtttgagcagttctcct
-gcctcagcctcccgagtagctgggattacaggcattcaccaccacgcctggctaattttt
-tgtatttttagtggagacggggttttgccatgttggccaggctggtcttgaaatcctgat
-ctcaggtgatctgcctgcctcggcctcccaaagtgctgggattacaggagtgagccacca
-cacctggccaagaatgactacttctaaagcagtcaggaaaggcttcaccaagaatatatt
-ctggatccttcttttaattttttttttttttttttttgagacagagtttcactcttgttg
-cccaggatggagtgcaacggcacgatctcagctcaccgcaacctccacctcccaggttca
-agcaattctcctgcctcagcctcccgagtagctgggattacaggcatgcaccaccatgcc
-tggctaattttgtatttttagtagagacagggtttttccatgttggtcaggctggtctcg
-aactccccacctcaggtgatccgcccaccttggcctcccaaagtgctaggattacaggca
-tgagccaccgcatctggccCttctttttaatttttatttatttatttagacagggtctca
-ctctgttgccttggctggagtgcagtggcacaatcatagctcactgcagcctcaacctct
-agggctcaagcgatccttccacctcagccttctatgccaccatgcctaattttaaaaaaa
-ttttttgtagaggtggggtctcattatgttgcccagactgatcttgaactcctgggctca
-agcaatcctcttgcctcaacctcccaaagtgctaggatcgcagatgtgagccaccacact
-gggctctggtacgttcttaaagaaaattttgccacagggaagagtgtgttaaggggaaag
-tactccaggcagaagagttatgtgcaaagaccttgtcacatgaaagaaacaccatgtcca
-ggaaacaaagagttctatgaagctgaagtgccaggtaaagggagagAACAGAAGCAGGTA
-GCACCGCAGTAAAAGAGGCTGGGCTGGATTCATCCCGCAAAGGAGTCTGGGTTTATCCTG
-TACTCAGGAGGAAGACAGGGAGGGATTTTACTTTGGGCCTGAGGGCCATCCTTTGGAAGA
-CCAGGCTGTACGTTTTCAAGAGGGGTCAAAAACATGCAGGAAACAGAGAAGCCTTTTTAT
-ATAACATCGGTGGAGGCAAACCATGAGAAGAATTTAATTTCCAACAAAGAGAAAAAACCT
-AACATATTTAATTTTTTTTTAACTTGGGAGTACCCCTGCACTTTCCACACATCACAAATT
-GACAGCACTTGAGTGGCAATACTGAATACTGCTTGAGGGAAGCTGATATTCAGAAGTCTT
-GTTAACCTATTTGCTAAGAGTATGATAATTTTTCTTCAGTTTGTTTAGACATACATCCAC
-CCCATCTCTCTTTCTAAATAAGCTATTCGGCAATCTGGGAGAAAGGAAATCTTGTATCTT
-GGGGAAAAAAACCACTATGCAGTCAACTGAATTTCCATGAGGTTTTGGCAAACCATTTGC
-CAGAATGTTACTTAATTCTGAACTCAAATCCTCAAATCATACCTCCCATAACTCATTTCT
-CTTAAGACTCTGTTCCAAttttttttttttttttagagacagggtcttactctgtcaccc
-aggctggagaatagtggcacgatcatggctcactgcagcctcaaccttctgggctcaagt
-gatcctcctgccttagcctcccaggtagctgggaccacagacaagctccactggcccagc
-taatttttgcgtatatatattttgtagagaaaaaaagtgttgcccaggctgatctcaaac
-tcctgggctctagtgatccacccacctcgacctcccaaagtgctgggattacaggcgttg
-agccaccatacctggccTCCAATTCTACTTTTAATCCTGCATTTCAAAATTTACTTACTA
-TTTCAAAATTTTTGGCACTCTGTGGGAACGCAACAAATACGTGCAGAATATAGTAAGTGA
-TTTAGTTTAGTTATTGTTCCTCTGGAAAAAACTGGCTTGCAGTAAATGACATTATTTTTC
-CCATACTGTTAAGGTGATGCTCACTGCAGAACTCTCTAAACAGATCTGCAGACTCTTTGG
-CCTGTTTCTAACACTACCGGTGTTTCCCAGAGGAGGATGCTGTCCCAACGTGGATTTCGG
-CTGCTGTTTTTTTCAGGCCCCAACACCACCCTCCTCAACCCCACAGCCTAGTGATTAAAT
-GTCAGTGGCAGATGGAGAAAGCACTCCCACGTGTGCCACTCTGACAAATACTTTATTCCA
-ACTAAATGTATAGGCTCTCACTGTGACATAAAAAGGGAAGAGGAAACAGAAAATTCAAGT
-GAGCTAAAGATGTATGAATTACAGAGTGAGATCAACTGCTAGACGACACAGGGAGGGAGT
-TAGCAGCGTCTCCACTGAAAGACAAATTCACAGACATCCTGTTTATTTCCGAAAGAGAAA
-CATCATAGAGCTATTCTTGGGATGTTCAGGAAAAGATTAAAATAAATGCCTATTATCTAT
-TGTATTTCGAGATAAACTTTATAGATTTAGAGCAGGACACACATTTCTGGACTTGAGAAC
-GCTGTATCTGGCTTGGAATAAAAGCCCACATTTCATCTAGAGGTAGAATGTATGTCATTC
-TAATCTCCCTCAATCCTTTCTTCTCCAATTTCTTTATTGCCCCACTTACAAGATAGTGCA
-CTATTATTCCAAAGCTGATACCTTCCAAATTCCTTTATAGTAGAGGTCTTGGCTATCATA
-ACCATGATGGAACGAATGACCGTCCTACAGCTGGCTGCAAAATATAAGACTGCTATAAAT
-AAATCCCTGATGCCTGAAAAGTAATTCATTCAACAAAGGAAGATAGGTATGACTTTGGCC
-TACTCTTCATTAGAACGCTTATTtttatttatttatttatttatttataaagagggcaaa
-gcagactttatttgaggggcaccacagcaataggtatagcaacaactgcaacagggtttt
-gtagtcagggagggagatcagactcaactccCTAAAATGCTAATTTTAACAATGGGACAC
-TTCATCTGAACTGTGGTTCTTAATGGTTCAGATAAAGATGACACAACCCACTATTGGCTT
-AAACTTCTCCCAACTCTGGCTACAGAATCCAGGTAAAGATTTCTGCCCCCTCAGAGTAAT
-AGGCATGTCCAAAATCACCTGGATTAGGGCACTTAATACACTGGGAAGGGACGATAACAA
-CTAAAGATGACCACTATCCATGCCTCCTCTAAAAGTTTTTTCATATATTTTTTCATATCA
-CCAAAACAAATACTAACTTGGATCAACTAATTTATATAATGGAATCTCGTGTGAGCGTAC
-AAAATTCCATACTGATTATTTGGTTTAAGCCTGCATTATCATAAAGGCTTTACAGTCTTT
-AAACTGAAATTAAGCTCAAATTAAGAAATGCTAGTCTTAAAACAATGGAAGGGGGGGGCC
-GTTTTGTGTGGAGGGAGGGAGACAGACATACCCCTACACCCACCCACAACTACTGATATT
-GACATTGGAAATTAACTTGAAAATTTATgcctgtagtcccagctactcaggaggctgagg
-tgggaggagcacttaagtccaggagttgggagatgacagtgagctttgactgtgacactg
-cactccaacccgggtgacagggcaagatcccatctctcaaaaaaaaaaaaaaaaaaTGCT
-TTAACTCCACGTCTGTACCAGAAGACCACAGCAGGAGAGGAAAACCTTATTTCAGTCTGG
-GTAAGAGTTCTATTAAACACAAAATAAAACAAACTAGCCTCTGTTTCTGGAGGTCTTCAT
-TAGTAGTTTCTACAAAACAGTATCCAAATTAGCAAAGATTCTGTTAACTACCTGGAAAAA
-GCAGGTACCAAGAAAGAATGTTTCACTACAATGGAAAAAAACAGTCTAGTAAGTAAACCA
-ATCTGACTATAAACGCTACAAAAGAGGGATTCTAGCATTAGTAACTTTGCCAACAATACT
-CTGATATGATTAAAAAACAAAACAATAACAAAAACAAAAAACCTCATCTTTAAATTTGTC
-CCATTCATCCAGAGAAGCAAAATCAAGGAAACTAGAGGGGGTAAAGTCTTGCAACAGATA
-CACAGCTGCACTGCCAACAGGTCACAAGACCCATGCTGCCTAGGGCATTGACTGTTATGC
-CATGAGGACAGACATCACACAAACACCAGTAATTAAAGGGTTACGGTGCCAAAGGGTTCA
-GAGCTCCACTTCCATTCAGTATCAGAACATAAGAAAAAGGGAAAAACAGAAAATGAGCCC
-aaataaaatataaaataaaatataGATACCAGGAGCTTCCTCAAAATATGTGGGTTGTAT
-TAATAACGTGTTTGGCTCTGTTACGGGCACCATCCATCAGAGGACTGGAAATAGGGAAAG
-TCACCTTAGTCTTCCTCAAGGAAAAAAGATTATTTAACTTGGTTCACGGTGTACATTCAT
-AATTTTAACTGTCATGTATTTATTGAATGAAAAACATTTGAGAACATCATGTGCAACAAA
-AACATGATTTCACAGAAATTGTCCAAACTAAAAGAGTATAAAAATAGAAGCGCTTTTTAT
-ACAAttatttacttattattattattgagatagggtctccatctgtcacccaggccggag
-tgcagtggcgcaatcatagagtagcctctaagtcctgggctcaagcgatcctcctgcctc
-agcctccagagtcgttgggatcacaggctcgagcctccacacccgactaacttttaaaaa
-ctttttgtagagatgaggcctcgctgtgtttcccagcctgatctcgaaatcctggcctca
-atcgatcctccaaccatggcctcccaaagcgctgggattacaggcgcgagccatggtgcc
-cggccGCTTTTACACAATTGAATAACATTAAAATAGGTGGCAGAAGACagacagaaagtc
-gattcgtggttgccaggcgtcgtgaataccggggaacgcggagtgcctattaatgggtaa
-gggtttcgttttggaatcagacagcggcgatggctgcacaactttgtgaattttctaaga
-atcactgaactgtgcaccttaaaggaagaactgtgtggtaattacatcGGCGGTACGCGG
-GCAGCGCGTCAATCAAGCCGGCGACGGTGAATGCAGTTCGGGAGAGCTGATACCCCTCGG
-GGAGGCGGCTCCGGGAGCCTGCGGACGTGGCGGACGCCTGGGACGGGGTGGGCCTGGCCT
-CCGCGCTCGAGGAGTCCCAGTCCTCTCCAGATGGAAGAAAGCCGGGGCGCGAAGCCGCCG
-CCCGCTCTTCTGCCTGGGGACGCGACTCTGCCGCCAGGCTCCCTCGGGTCAGCTCGGCAC
-CCGCCCGAGCCCCCCCAGTTCCAGGCCCTCTCCTCATCAGACGTGCCCTGGGCCCTCAGC
-CTGTTCCTCTCGccgcccggaaccccgcagcagccccgggtccccagcccgcgcccctcc
-ggcgccgcctccgccagctgcccctgccccccgggccgccctcgcaggccgctcccggcg
-ccccggtcggcttccgtacctgccttctccgcgccgccgtcccAGTGGCCGGAGGTGGGG
-CCGTCGCCCTGCGCACTCCGGAGGGCCATgccccggggccccgggcccccACCCGAGCCC
-CGGCTGGTGGCGGAGCCGGGAGAAGACGCGGCTCCGACCGCGGGACGTAGCACCCGCTCG
-GCATCGGCAGGCTCCCCTCCGTCGGCCAgcggcgcgcaggcgcgcaggcgccccgctggc
-cccgccccgcgccggcACGTGACCCTGCGCTACGCCCGGCCGGCGGCGGGGGAGGCTGCG
-GAAAGAGCGCGGTGAGCGCTCTGAGGAGTTGGCTTCGTCTGCGCTGTAGACTCTACGGTG
-TAGAgtgtggcgctcttgagcgagtgtgctcgagaccagctgtcgtttcctttgcttctt
-tcatctgtaaaatagtattgatgataataaaaatattgaactcacaaggttattgagagt
-gtttagaacatcaccaagcatatagtaaatactccacaattatGACCAATTTTTGCTTAC
-CAAGGATTATTTTTTTACCTCCTGTCTCGTCTCCCCACACGAACTCCTGTCATCAGTTCT
-TGGGTACTTGGGGATCTAGCAGGTTCATGTCAtacgggtccgcaggttatgcactgcaca
-aggcctgggagcgccatttacgtagacgttcacgtgaaccgtgcccccttaagttgtgcG
-AAATAGTGGCCACTCATCTAAAGCAGCGctctggcttatcaggtctgatttccttctcgt
-cttcagtgatattcctttctttccaattagacatccattcccttggttatatccctgata
-ttgtgattgtggcctcccgaatttctagtgctaggtcttcatgctgaagttcccataatt
-ccagttgcttgatgactctcttccacctcccacccccaaccacaacagttctttattatc
-ctgagacctccagcccatGAaactcctgacctcgtgatccgcccgcctcagcctctcaaa
-gtgctgggattacaggcgtgagccaccgcgcacagcCAAGTTTTACAGTTCTATTCATAA
-ATCTAGTAAATTATATCAGTTATTTGGTCCCATTAATAAACTAAGCTAATTAAAATCCTT
-TGAACATTTGAAACTGCATTTATAAATTCAATTCGTTTTTCTAAGTATCACAGGTTTCTA
-ACAAAGCCTTTCAAGTCCTTGTGTAATTCTTGTAAATGTAATACATTTATAAGAATACTG
-AGTCATGAGTGCTTTCAAATGTGTCAATACAAACGAGATTTCATCTTAAAATCAAAAGTC
-TAAATCTATTCAAATACATATTTGTAATTAGTACAAGAATAATCTGTTAGAATTCTCAAA
-Attatcttttttttttttttgagacagagtctcactctatcacccagactggagtgcaat
-agcgatcatagctcactgcagcctcaagctcctgggctcaagctagcctcctgttgcagc
-ctcccgagtagctgagactgtaggtacacactaccatgcctggctagtttttttagtttt
-tatagagggggtggggaatctccctatgttgcccaggccggtctcaaactgccttcgcct
-cccaaagctctgggattacaggcgtgaatcacagtgccAAGCTCTTGAAATTATCTTGAA
-CATTATAGGAATTTAAAGTATCACATTTACACAGATGCCTTAATGCAAAATTATTAATAC
-TAGAAGTTTGAAAACATTTCTAGTCTTTGTTCTAAATCATCTGTGAggctcatgcctgta
-atcccagcactttgggaggtgaagggctgcagatcacttgaggtcaggagttcaagacca
-gcctcaccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcatgg
-tggtgcctgcctgtaatcccagctacttgggaggctgaggcaggagaattgcttgaacct
-gggaggcagaggttgcagtgagccaagattgcgccactgcactccagcctaagagacgga
-gtgagactccatctcaaaaaataaataaataaaatgaaataaaTCATCATTGAGGTTAAA
-AGATGCTTAGTGCCCACTGAAGGAAGATTTAAGTCATCCCAGTTTAAGAGTAACGTGCTC
-AAGCAATTTGAGATATTTATTCCCTTCTCAGTTTACTGCGCTGGTCATCCAGCCAGCTGG
-ATTCTTGCTTTTGGTAGTGATGGAACAGTGACCCCCACCCCATTCCCACCACCACAACTC
-TAGGACTAAACAGTTGTGTGGTCGTTGTGAAGCTTGGGCcagaatttactttcaaaaaat
-gtcccgcttcatgtataatataaagaccttacaataaattcccatttcttccctcctgtt
-cttcttgctgttgtcctacattttactttttaaaatcccttccttctcttgctttctccc
-ctctacccaccaaccacttgcaaacaaccactgatctacatcctgtcactatagattggt
-tttcattttctggaattttttatggacggaatcatatagtatgtagtcttttttgtctgg
-cttcttttactcagcgtaattattttataagcaatcatgttgcattaatcaatagttcat
-ttgtttttgttgttaagtagaatttcatcttagaaatataccacgattcattttatcaGT
-ATTTTAAATTTTTGCATGTGCTGCAAGTACACAATTCATTGCTAATATGCTTGCCTTAGA
-CCAGGCGGTTAGCAAAAAAGATGGTCTGCCCAcctgcaagccaaaaccactctactgcct
-gattttgcacggctcatgaactaagaatggcttttaccttgataaatgttgaaaaatcac
-aacttaattgtagcacattaaaactatatggaatttaaatctcagtgtccataaaccttt
-actgaaacagagtcacgctcattcatttacctactgtctatggctgttttcatgctgcaa
-cggtagagttcagtggttgcaacagagatatggcctacaaaacctaaaatatttattatc
-tgctcctttatgtatttatttattttatgtgtgtatgtatgtatgtatttttttgagatg
-gagtttcactcttgttgcccaggctggagtgcaatggcgcaatcgcagctcactgcaacc
-tccgcctcccaggtccacgtgattctcctgcctcagcctcccgagtagctgggattagcc
-cgccaccatgcctggctaatttttttgtatttttagtagagacggggttttgccatgttg
-gtcaggctggtctcaaactcccgacctcaggtgatccgcccgcctcagcctcccaaagtg
-cctgggattacaggcatgagccaccgcacccggccTATCTGCTCCTTTATAGAAAAAGAT
-Tggcaggacgtggtggctcacacctgtaatcccagcactttgggaggccgaggcaggcag
-attacatgaggccaggagttcgagaccagcttggccaaagtggtgaaaccccgtctttac
-taaacatacaaaaattagccaggcatagtggcacaggtctgtaatcccagctactcagga
-ggctgaggcaggagaatcacttgaacccaggaggcggagactgcagtgagccgagatcac
-accattgcactccagcctgggtgacagagtgagactccacataaaaaaaaaaaaaaaaaa
-aaaaaaGTTTTGTGACCCTCTAttgtagagatggaggtattggggctgttgcccaggctg
-gccttcaactcctggcctcaagggatcctcctgcttcagcctcccaaaaatgatgggatt
-tcaagtttgagccccatgcccagctCACTTCAGTTATTTCTAAGGTAATTTAAaaaagat
-tttaattgtacttaccttcattcaatttccagtgctcttaatttcattgtgtagacccag
-gtttttttctggtatcatattccttttgcctgaaaaacttcctttagtatcttgtagaag
-gagcaatgaattccgtttttctttatctgaaacagggtttatttctcctttattttgaaa
-gacactttcatttgggtataggattccggaattttgggtgagcagtttttgtgtgtgtat
-gtgtttttcccctatcagcatcagcaataaggtcactccattggcttctagcttgcatag
-tttctgacgtctccataattcttagcttcctctgtatgcaatgtcttctttttccttgct
-gcctttaagattttcttttgttttagcatttcgagtatatctaattttatatgtgtgtgt
-gtatatatatatatatatatatatatatatatatatatatgagtttattctgcatgttct
-ctgagcttcttggattttgtggtttgctctgtccttaatgttgaaaagttctcagccttt
-aattcttcaaatgtttcttttcctgttctctctcctttcttctgggaatctaactataat
-atgtttgagtgtttgatattgtcccacaactcttggatgttctcttttgacggttttttt
-tcccttcaccctttttccccagtgtttcagtttgaataatttctcttgacctatctttga
-gttcattcattctctccttggctgtgtcaaatccactgacgagctccatgaggcactctt
-catctctgcatctctgttagtgtgtttcttttttttttttttttttgagacagagtctcg
-ctctgtcctccaggcgtgcagtggcgcaatctcggctcactgcaagctctgcctcccggg
-ttcacaccattctcctgcctcagcctcctgagtaggtgggactacaggctcccgccacca
-tgcccggctgattttttgtatttttagtagagacggggtttcaccgcgttagccaggatg
-gtctcaatctcctgacctcgtgatctgcccgcctcggcctcccaaagtgctggaattaca
-ggcgtgagccaccgcacctggccattagtgtgtttcttattttgaccagttccatttggt
-tctcatagcttccatctctctactgagattgcacttttgatcttgcatattgtctacttt
-tactgttagaccttttaccatattagttatttgaaattctgtatcacatagctctgacat
-ctgtgtttggttctgaagattgctttgtctcttgggagtatgtcatttatctcttgcttc
-ataagtgttggtgaaagttggacatcttgtgtaggatagtagaggcccagggaaatgggt
-tttgtgtagaaatgggcacacttttccttctgttaggtctttagcgtgggggtttgaatt
-aacctagttaggagttgTGATAggctgggtgggtggctcatgcctgtattcccagcactt
-tgggaggccaaggcaggaagattgcttgaacacaggagtttgagatcagcctggacaaca
-tagtgaaaccccatctctacaaaaaaaataaaaattatctaggcatttttggtgcatgcc
-tgttgtcctagctactgggaaggcttgccgagtctgtcctgcagactctgcccaagcgac
-ggatgaaaggagtactcagatacagatatccagtgaaagagcaggataggggactgccag
-cactaggggccgaagagaattagcagttcccctaagccggcagccctcgcatttgtttgg
-tacagatttaatgacaaaggcttggagcaaacacaatttgtgggtaataaacattgttga
-ccccccgagtagagagcagtcctgcatgcaaatgattaaaggttggtttctggagacagg
-agtagacaaatttatctagataagtttctttacattcccttgttatctgccctttgctct
-caggctccagatgagacaatttggctgccttcagccataatttccttccaaagcttttgt
-aaaacctcctggcctttcaagaaggtttgtgtctttactataatttctcccaccaccctg
-accaatctcctacatctcccccttttctgttttttgcatcagcttttgttaattgaagag
-tacagatgtgcagcaacaggtttttcaggtgtagtggtcactgcttgtatttcggctttg
-catcctagaattagtaaataacataagataaacgtgaatataatcagtaacattcttttc
-caatcaaggagtgacatgtagtgttacttgccacctcagttcagtgtgtgcccttactaa
-ggaaccccactgggggtatgttaaccccttccagccaagcagttacgttattagaggctg
-ggaagggggtgtccacccaggtaatagggtggaagaaaagcagatttagaagatgggccc
-aatagagtgtagcaggtactggttgcaggcagagtgagggaattaaacaaggttaataaa
-gcatagtaaggaataaattatctggagtgaatggtgtttgtgtccagagcaggattcgtt
-cagcctcctgagttgtcttcttcagcatcccccaggtaatgtctggggcttgtgtcgtct
-gaggaagctgcatcatccagggctgtgggtcctgcagggacatttccttcatttctggta
-ccaggttgggtcctagccacaccatgttaaggtttgatgcgttgtgctggaatccaaaga
-ggacctgaggtgatgtgaacacaaccatatcctcttccccatgttggcaactcatttgga
-ccacaccatacattactgtttacatctttccataaaactgtgggttttatgtcttgagag
-gttttagcaaagtgcttttctatagctgattgaaatttatcatttaaatttaagaaatta
-agggtaaataaggcttttgctagtagtgttgcagggtccttactcatactcccccttttt
-tgttttttgagcatatttttaagagtggacacgttctactatggcctgtccttgggggtt
-atacgggatgcctgtggaatgctggatgttccacgtgtgacaaaattgttgaaattgtga
-gctggcatgagccagaccattatcagttttaatttttgtgggccgccccataaatgcaaa
-agttaagagaagagtttaataacatatcaggtggactttccaggaagagcattgtgctaa
-ttaggtgagaataggtatcaatggatacttgtacatatcttagttttccaaattcaggga
-cgtgagtaacatctgtttgccataactgattaggttctagtcctctagggttaacgcctg
-ttgaaggaggggacatgcctgtgagctggcaatccgggcattgcaggataatttgtttag
-ctagtctttgggtaagttgaaattgttcagttaagttccttcaattttggtggaaaaatt
-gacgcaactgcatggcttggtgaagcagtgacatcataacttgcaggtctgcttgttcat
-tgccataagccagtgggccaggcagtgagctgtgggctcgaatatgtgtgataaaaatag
-gatgtgtacgttgatccagcaattgctgaagttgaagaaaaagtgcacacagggtgagct
-tgagagtggacttaatgagggctgttttaaggttttgcaataaataaacagagtaagcag
-agtcactaatattgataggcagagtggaaaagttctccaggggcaatattaaggctccaa
-cctcagctctctgagtgctagtaaatccagaatgagtgaggaaattatgcagtctccacc
-aaacaggcgcttttctgtttttaccagagccatcagtaaaaagtgttaaagtgttggggt
-atgggggagtgaactacttttgtaggcacaactacaggagtacgagataagaactgaatt
-acgttgtcagcaggaagggcatgctctatatggcctgtgtaatcagagattgctatctga
-agatctagagataggggcaatactgatccaaattgccttttactcaaaggaattcttatg
-acatcataacctagcaactgattgcactatctgcggcctgtatagatgactttactaact
-agctggatataggaagatagtgttttagtctcggtatgtgagcaaaaaacccattctagg
-aagcgtagtcctggggtcatctctcctattaatactgttggggaatgtttagtaggaaaa
-acaaacaattgaactgactatcggggtgtctatgtgatatagttgcctctgagaaatagc
-ttgctctatttcctcaatttccctttttgctgcaggagtcaaatacctgggagagtctag
-ggctgtattgccctttaggatagaaaacagttttgtaacttatcagtagttatgcccaac
-gtggggtgaagtcaattaatattgcccagtaacttttgataatcatttaaggtgtgtaaa
-tcgctagtatttaaccttttgaggtcttactgaccagaagttagtatgtatccaagatat
-ttccaattgtactttttcaggtgctatgattaaacctcttaactgtgtattctttatgac
-agaggcatataaacttaaaagcactggctctgttggggctgctaggaaaatatcatccat
-aaaatgaataatcttgcaactaggaaattcttttctactggggagcaaagcctgatttac
-atgatactgacacatggtaggactgaacagcatcccttgaggaagtactttccaatgaaa
-tcagcgagctggcctctcattactgataactggtattgtaaatgccaatttttctctgtc
-ctgttctacaaggggaatagtataaaagcagtcctttaagtcaataatgactataggcca
-atcttgaggaatcgcctcaaaggggaagggaggtcccgttgaaggggccccataggttgc
-aaattagcattgatagcctgtaagtcatgcaaaagtctccatttgccagaccttttggga
-atgatgaaaatgggcgaattccaagggctgtttgacagttctatatggccagcttttaat
-tgttcttccactaattcatgggctttttgtaatttctctctctttaaaggctactgtttt
-acccaaataggattttgagagagccatgtcaggggtaggggaggaataacagtggccatt
-attagaaaggtttgctgttcacacaatttatcaaattctgccctccagaggaggtactga
-ctggcctttaaagttgttttagctagcactgaccagtcccatggggtgatatggaagttg
-tctgctatggtttcaattattccttttgtaaatgggctagtggctccgtttaatgctttt
-tcttaccactttataagcgtcaaaagaagttgtctgctatggcttcaattattcctttca
-taaatgggctagcagctccattttctttaacgtttttttcttatctctttataagcgtca
-aaagaaatgggttcatatacctgatcgccttgtcgatcttgcattactgggcaggctaag
-agctccccttctgatgccgcttggctaagacagggtcccaaagctgtagtgtatcccttg
-tctttttccaatttattggaggagggggctcaggcaaaacctctgtttcctctttgttat
-ttttgcctgttaatggctgggctgagggagaaggaggagacggtagggtaggtgacggtt
-ccatctcccttacttttttaggcttttctgtgtagagtgggaccaaagcagtcctaacta
-aagcccataacgttaaagatgttactgagacccattgcccttgctcatgatgttaaaatt
-tcttcccagagctctacgtctagtgtaccttcttccgagagccatgggttatgggaaaca
-acagtttgcattaggtcccataattgagcctgtctgaggctctgctaactttcagcattt
-gttttactacttttatatactgttgctgttgagctgacaactgttgtcccatgatgacaa
-ctgtcatcccatgatgatcgtccctagcttgagcaattcctttgaacttggaaatgctga
-acaggcaccaatgacttactgactgcgcagtctcttcaccttcattttcgagggttccgt
-cgtgatctgttgcagcattcctcacacagggaatcacctgccgagtctgtcccacagact
-ttggccgagtgacagatgaaaggagtactcagacacagatattcagtgagagagcaggct
-aggggactgccagcactaggggccgaagagagttagcagtccccttaagctggtggccct
-cacatttatttagcacaaatttaatgacaaaggcttggagcaaacacaatttgtgggcaa
-taaacattgtcaacatcccaagtagacagcagtcctgtgtgtgaatgatcaaaggttggt
-ttctggacacaggaataaacaaatttatctaggtaagttcctatacaactcccctgttat
-ctgccctttgctctcaggcttcagataagaatttggctgccttcagccataatttctttc
-tgaagcttttgcaaaacctctcggccttccaagaaggtttgtgtctttcctataatttct
-cccaccaccctgaccaatctcctacaAaggctgaagcaggaggattgcttgagcccagga
-gtttgaggctgcagtgagctgcgatcacaccactgcacttcagcctgggcaacagagcaa
-gaccttgtctctaaaaagtaaataaaaaaaagagttgggctaggtttgaggtttattgtt
-gctatggttacccccaatgcagcagcttccagttcctccaatgacaccttggactgaggg
-tgcaggctggcctgccagagggattttctccttccatgtgtgctccctgctcagctttag
-gtcctccctttgtgaccctcagaaagggtcttcttcccatactcttgtctctctcctgta
-acatttttacttctaactcaaggcttgtcagcttaccattggcaggtgggggaggaggga
-attctctgttctgatcaagtctcagtctctgtcaggccctttgtgtctctgattttgggg
-ttatgtcctccttagtgctcctgttcctcccccAGTTCTGGGCCCAGTGTGTATTCCTGC
-CCCTGCCCAGGGAAAGTTTTGTTTTGTTCCTGTTTCATTCCCCCAGATGCAAGGGAGCTT
-CATCCAAGGGGGTGACAGGATTTGGTGTCCTTCCCTCCACAGACTAAGGCTTTTGTCCGG
-TAGGGGATACAGGGAAGGGTCTGGGTGGAGCACTGTGATCCTTTCACAGTAGCTGCCATT
-GTCTTCTTCCAGATCTTGAGACATTTTATTAAAACTTTCTCCAATCTTCTGTGTGCTCCC
-AGTGGGGTTCATGGTGAAAAACGCTGAAAAGGGTAAAGACTACTGCAGTCTCCATGACCC
-AGTCCCTCACCAGTGTCCACTTGTGTTTACCAGGTAACCAGTGCCCATGTCATCTCTTCC
-ATTTTGTGCCTGTCTCTCCTTAGATTTGAAGCCAGTTGATTGTCTTCTGATCTCAGCTCT
-CCAGAAGACCTTTTCCAGAAGACCTCTCCCTGTGTATCCACTTCTAAACCAGTCACAACT
-GCCCGAGTCTCACAGCAGCATGGTGGATATCCCGCTGTCCCTCAAACTGGGGCTCTGTCA
-ACAAAGAGGAAGGGAGGAATGACTCCCTTGGGAGGAGACAACAACATTGCAAGTGATCTa
-gtctttgaaaggcttttaagcaagggactgagataaaatttatttattatttttaagaga
-gaggttctcactctgtcagccaggtctcactgagagcaatgtgatcatagctcactgcag
-cctccaactcctgggctcaacgtatcctcccacccagcctccccagtagctagcactata
-gtcacacaccaccacactagttaatgttttcattttttgtagaacagaggactcgctgtg
-ttacccaggcctcaagtgatcatcgggccttggcctcccaaaatgctggggttatagata
-tgagtcactgtgcctggactagaatatttatttttgaaagatctttggttgcaggtgtca
-gatgaatcaggaattgagacgagatgggaaggcatcaagaccagttatctgctatgatac
-tccaagcaagagaggatggtggctgggatgaggaatttggcaacgggaatgggaggaagt
-ggatgcattcaagataaatATCCATTTATTAAAAGTAGTTGCTTTTTCACCAGAGTAATA
-CATAAATATAGTTTTAAAAGTAAATACTGCTACTATCTTAACAATAATTTAAAAAatctc
-aaaataacatgcaactgtttgatttttcagttttaggcattagttccccttataaatgat
-gagagtttagagcttagaccgcttgtcctgttaccaacaccaccacacatgccagcattt
-cccatcactcctctttccattgtcatcatactgtaatcctggttagaccagtattcagtg
-tttccattatgactacgtaaattctaatcacagctgaaccagcagtatgatatttagttt
-tccctcctttcataacttttcccattcctgctgagttaatacttttttggcttgtcttac
-tctgctcagttttcATTTTGTAAActtttaaacatttgaactctagcaaatatactgaga
-agtgccccaaacgtaaatggagagtttaacaaataattatagagcaaatacaacatttag
-gtaccaccccaataaacacaacaccgaggacccccagaagcaccctgtgtATAGTGGAAT
-GTTGTGTTGTTTCTGGCCATGGAGTCTCAAAGACTGATTCTCAATTTTTGTTGCTTGAAA
-ACAAGTAAACAAGTATTCTCagccgggcacggtggctcacgcctataatctcagcacttt
-tggaggccgaggcaggcagattacttgatgtcaggagttccagaccagcctggccaacat
-ggtgaaaccctgttgttttgtaaaaatacaaaaactatctgggtgtggtggcatgtgcct
-ataatcccaactacttgggaggctgaggcaggagaatcgcttgaacctgggaggtggagg
-ttgcagtgggctgagatcatgccaccgcactccagcctgggtgacagagttaagactctg
-actcaaaaaaaaaaaaaaaaaGTTGGTGTAATCCTTTCCACACACACATATATATATACA
-TAGATGTTATATGTGGTTGCCTTCTGTTCCTACTGATATATATGAATAGTATGGCTGATT
-GCATTATTGGTTTGTTTCTTCATTCCCCTGTAATAAGACTAAACatacacaccctttgcc
-atataacctcataaagttttcccaacacaggctctatgcttccctactgcactgatgttg
-ggcttggctatgtgatttgctttcgccaatgggatgatggtgcttgtgacacagcagagg
-cttgaaatgtgcttgtgtgattccatttggtctcttCTAAGTTTCTGTGATTCATGAGAA
-GAGCACGCCCTGAGTAGCTGCTGCAACTTCTGCCACATTGGGCAAACCTGAATCCAATTC
-ACATGGAGGTGTCCAGCCCAGCCGACCCACAACCTGAAAAACAGCTGCTTGGGCTGAACT
-TGATCTAGATCAGCTGAACTACATACAGTTGCCTTAGAAATTTGTGAGACTAAGACTAGA
-CAGAGAACAAAAGCAAAAGAAAGAAAAAATTTGTCTGCAATGACTGGCTAGGAACCTGGA
-CAGATTCCTGGCAACATAGCTGTGCAAAAGCAGCCCCACAAGCAAAATTGAGCCAGGAGA
-CAGGGTTCTGATCCCAGGCATGGGCCTTGGCAGCTGAAACTTGTTAGGCTGGGCCTCTCC
-CTCGCCAGTTCAGGCAGCCCCTCCTCTGAGGCCTCATGGACCATTCTCTCTTCTCCAAGA
-CTTCAAGATTCCTTCCTAGTGAGtttttcttttttacttttagatggagtctggctctgt
-cacccaggctggagtacactgacgtgatctcagctcactgtaaccgccacctcccaggct
-caagcaattctcctgcctcagcctcccaagtagctgggactgcaggcacacgtcaccaag
-cccagctaatttttgtattttttagtagaaacagggtgtcaccatgttgttcagtctggt
-ttcaaactcctgacctcaggtgatccactcgccttggtctcccaaagtgttggattacag
-gcgtgagccaccatgcccggcACCTAGTGAGtttttctgttacttttttttttggaggcg
-gggtctccctatgttgcacaggctggagtgcagtggtgaaatcatggctcactgcagcct
-caacctcctgggctcaattgattcctccatctcagcctcccaagtagctgggactacagg
-catgcaccaccatgcccagctaatctgtgtattttttgtagagagggtttcatcatgttt
-cccagaccggccttgaattcctgagctcaagtgagtcgcccgcctccacctctcaaagtg
-ctgagattacaggtgtgagccactgcacccagccTGTTAAATCTTTTTTTCAATTAATAA
-CAACttcttttacagacagggtctcactctgttgctcagtctggggtgcagtggcactat
-catagctcactgcagccttgaacccctgggctcaagtgatcctcctgcctcagcctccag
-agtagctagcactacaggcatgtgccaccacatccagctaatttttaattttggtagaga
-cagggtctccctatgttgcccaggctggtctccaactcgtggcctcaagcaatcctcctg
-cctcagcctcccaaagagctgagattacaggcatgagccaccacgcccagctTCTGTGAC
-TTTAAAAAAATCtttttagacagggtcttgctctgtcacttgggcttgagtactgtggca
-caatcacacctcactgcagccttgacttcttgggctcaggcaattaattctcgtcctttg
-gcctccccagtagctaggacacaggcgcacaccaccacactcagctaatctattttttgt
-agaggtgggttttcgccatgttgtccaggctggtctgggactcccggctcccaaagtgtt
-ccAACCACAGGTGTGTGGGCCTTCCGTGGTATCTTAACCTCATCACCCAGAGGCAACAAC
-AGCTAGTATTCTTCTAGTTTTTACCACCCCCACCACCTCAATCCTGCCCCTGTAGCCTTT
-CCAAGTGCCACAGCATTGTTTCAGTTTCTATCTTAGAAAGCCCGGGAGTCTGTGTCCTAT
-CTCCCTGGGGGCATTCAAACCCTAGTCCATAGCCTGAGGCCCACCTATACCCAGACCCAG
-TGTCTTGGAAGCACTGACTTTAATACCCACTTAggctgggcgcagtggctcacgcctgta
-atcccaccactttgggaggcttgggcgggcggatcacctgaggtcgggagttcgagacca
-gcctgaccaacatggagaaaccccgtctctactaaaaatacaaaattagctgggcgtggt
-ggtgcatgtaatcccaTGCCTGTCTCAaaaacaaaacaaacaaacaaaacaaaacaaaac
-aaaaAAACCCCAGTTACATTCAGGATGAATTCTGCCTTCCTTTTTGCCACCTTGGGATTT
-CCATTTCTTTCTCTGAAATAGGCATTTGCATTTTTCCTAGGATTTTTTTTTTAAAACAGT
-TGGAATTATCCCATATACACAATTTTTTCACTTTTCTAATTAACATACATTTCCCCATGG
-Gcttgtgtctcacctctcaatccccagtgtatagcaaagaccaggctcaggggcacttac
-aaatgtttgttgaaACCAAAGACATCCTATATTACAGAAATGAACTTTGGAAAGACCAGT
-CAGCGTGGGTGGGTGAGGAATGCCAGAGACGGGAGAACAAAATGAGGTATACCGTCAGGT
-TTGAAGGGTTGAGGGTTATGGAGGGTTCTTCATAGGAAGTTCACCATGGAGTTCTTGGAA
-CTGTTCAACACACAGAAGCAAGGTCCTCTCCTTCTAGGTATGGCTAGAAATGTTTATCAA
-TAGCTGAGACTCTGATTCCCAGGGTGGGATCAGGAAGCCAGCCCCAGCTGCTGCAGCATT
-TTTTTCCCTTTTTCTCATTACAGGAGCCAAGAAAACTGTCAAAGCAGATGATGCAAGAGT
-GAAGCTGACTCAGAAATACTCAATCCCCCCAGGAACTTCTCTAAGAAATGGACTGACCAT
-CCTGTAAGCTTCCATCTGGAGGTACCTGGGGAAGGGCTTCTCACATTGAGGCCAATAAGA
-ATCCCTAGTGggccaggtgtggtggctcatgcctctaatctcagcactttgggaggccaa
-ggcgggtagactgttgagctcaggagttcaagaccagcctgggcaacacggcaaaacttc
-atctctaccaaaaaaaaaaaaaaaaaaattagccaagcatgatggctcgtgcctgtagtc
-cctggaaggctgagttgggaggatcacctgagcctgggaggttgaggctgcagtgagctg
-tgatggcgctactgcactctagcctgggtaacagagcaagacccgtatcaaaaaacaaaa
-caaacaaaaaaCTTCTAGTGAGTAGAGCGACAGGGAGACAAATCCAGTTTGTAATTTGCT
-ACAGTGCAAAATATCTGGCTTTCCATAGAGGGAGTGGGAACAAGGCAATGCTGGCCTTCA
-TTCAATCAGAAACTTGACTTGTACCCGTTGAAAACCTGTCATGTTTAATGCTTGGATATT
-TTTTCTTCTAGTAaagacactttactgccacctgctggaaaagagtcagaaattttccaa
-atgcaaacatctatggcctccctataatgtagcatccttttactgtacatagtctgcaca
-actgtacaATTTAGAAGAGAAACCAACATTTGGTGTAACTCTACCATATACCAGGCATCT
-GTCATAGAATCTGAACAACCGCTCTATGAAATCAGTACTTATACCCCAATTTAACAGATA
-GGAAATATTGGGacctctggggaagggaggaagaagagggtatcaccaaaaaagggcaaa
-aagggggcttggtctgtattggcaatggaaattcaacttgggtggtaggattatggatgt
-gttacagctttctttataattTGGTACATGCCTAAAATGTTTTACAATAACAATTTAAAT
-CACCTGTGAAGAAAAGATTCAGAGAGGTTAACTGATCAAAAAAATCACACTGCCAGACAG
-AACTCTGTTAGAGGTAGACCACTTGCAGTAACATTACATTGCTTCTCTAATGGTTAAATT
-TAGCACAGAATCAAAGGAGAGCTATAAAGTCTAGGAAGTACTTATTTACATAGGATTGAG
-TCCAGAACATCTTGTGACACCATCTACATATGTTTTACTTGGAGAATAGTCTGAATTTCG
-TATTAcacgttgagcatttctaatttgaaaatacaaaatcctcaaaaatctgaaattttt
-taagcatcaacatgatgcctaaagtaaatgctatttggaatatttcaaatttcagattag
-gaatattgaactggtatgtattccgcaaatattccaaaaatccaaaaaaattcaaaacac
-ttctggtcccaaccattttggataggggatattcaacctATATTACACACAGGTAATACA
-GCAGGGGAAAAGCAGGGAGACTGCAGCATCTAAGTCTACTAAATTGGCCAGGATCATTCC
-TTAGTCTTCAGATACCTATTTATCAGGGTCTCATTAAATAAAGTTACTTGTCATGTTAGT
-TCAGTCTGGCCTGTGGCTTGTAATTATAGCTGCAAACTCAAGGGCAAAGTTCTTAGGATT
-TTGAGATGCTCTTTATGCAACAATACTTCCATTTACTTtgtgtgtgtgtgtgtgtgtgtg
-tgggtgggtgggtgtgtgtgtgtAGGGAGAGAAAGGGGGCAATGGAGTGGAGagtggaac
-tacaatttattaagcacctattattacaagccaagtagggtgttaaatattttcctcgtg
-ccattccattcaatactcTTCGATCCTGAGGGAAAACGAACCCACTTAAAAAAAAAAACA
-AAAGGTTTTAATGAGGATTGCATAAGACATGCAAGGTCACCAGGGAGTTTACATGCAAGT
-GGGGAGATACAAAATAATACAACAAAAGTTCAGGTGTTCTGAGGAAAAAGAAGGGCAAGG
-GTAAGTGATGACAGTGGGGGAAGTCGGATTCAGGATAAACCAATTTTAGACTCATTTTTT
-GAGGAAGGAACTGAGCATGACCTTACCACACAGCCTTTTTAGTTAAGTGTTTCTTTAACT
-AGGAAAAGGCCCTGGGAAGACAGGCTCTCTACTATGCAAACCCAATTCCAGTCTTGGGAG
-AGAATTTGCTGGTGGGACAAAATCAGGTTTTTCAAGAGATGCTTAAATGGTCAATTCTAA
-TTATAACCATACTTGTCAAAAGGTGAAGCAAAGATGAAAGTTAAAAACTAAGAAGAAATT
-AAAATTCCCAAATCTGTCAACCAATCTCTAATTTTCTCTGCTACTTTAGGACTATAGTAA
-TTAGCCATACCCTGAGGATCTACTTTACAAGATATATTCCTCTGACAGTCCCACTCTAAC
-AATTTAATCTATCTTATGTAAGCTGGACAGGCATTTCAAGTACAAGAAACAGAATTCAAA
-ACGTGAAAACGGAGCCATCTATCACACACGGTGTCGGTTGGAGAAGCATATTGCTCAGGC
-TGCAGGGACATTTCatttatttaaatgtttttattaaaaaaaattaaaGACCTTCATGGC
-ACAACTTCTTCCCAGCACAGTTATGGTTTAGTCATACCAATTACAATACAATTACAACCA
-ATAAAGCAAGGTGGGGAGGGCCTTCTGGCTTCAAACTTAAAAAAAAGCAGAGGAAGAGGG
-GAGGGACCACTTCAAACAAAGTTTAAAAATACTTTAAAAAATCTTTCAGAGTAATTGCCA
-ACATAACCTTTCATGTTGGCCATTCCATTTCCTGCCATCTAAGCAATGCAGACACAGGTA
-GTGCTGAGAAATAGTGTCCCAATACAAGGTATACAGATGAGGTAATTTACAACAACACGT
-AAGTTGTTACTCTGTAAACCCTTGCCTCCCCCCCACCCCCCACCCAATTGGGTCTTTTTT
-TTTTTTCTCTCTCTCCATGCTTCTGCAGTGACTCTTAAGTAGCATTTTTAAAAACTTCTA
-TTTATTTTAAAAGGCTCTTGGGTGGCACCTCAGAGTCCTCTGCATTCACCTTCGGTTTAT
-TCCAAGGTCTGATGGGTGTAAGGAGGTCCAGCTGTCTGCAGCTCTCCGCATCAGCCTAAG
-CTACACCTCAATTTCCGAGCTACAAGGATAGGGTATGAAGTCTTGATTTACAACCCTCTC
-CCCACCTCAAAAGAAAGAACTCATTAGTTATAAGTGTCCTGTTCAAATCACAATCCAGTG
-CAAACATAATCACAAATTGCATCTCTGGCACATCTGGTGCTTTTAGCTTCTGCACAAATT
-CAACATGGTAACCCTCACAGCATTCTAGGGCATAAAAGGGTCAAGTACAATAAATATCCA
-CTGTAAGTGGTCATAAGGAAGAAAATCACCCTGCCACACAGTCAGAATGTTTTCCCTTCA
-GCTCTCCCTACCGTTGAGAAGCGCTATAAAAGGAGGCTTTAGCGTCCTCTAAAGTTTACC
-ATTATATTCACTAAAGCCACCACCTTGATAAAGTTACTAAAGCCAAGATGGGTTACAAAG
-TTAGATAAGTTCATTAAATTCAACTCCCCAAACAATTACGTTTATCTATGATGCCTAGGC
-GAGAAAGGCCTGTGAATCTATAAGGTAGGAGAATGGGGAACTAAGATTTTAGGCCTTAAA
-ATATGTTGGAAGAATTTTTCCTAGTTCCCACAAGCAGCTACTGTAATGAAATAACAGGAG
-AAAATACAGAGCTGATGGTTTTGCTATTGTGCTTAAAAAACTAGGCTTCCTCAGTGAAGC
-ACCTGATAAACTTAGGTGGTTGGATTACAGTGGAAAGTCCACTTTACACACACACACAAA
-CACACAAAAACTGGCGACTTTTTCCATCCCCAATCCCTGCACTGCTGAGACACAAAATGA
-GTTTTATGGCAAAGGATCCTTAATCCCCAGAGACGCTTTGGCTTGTGGTGCTTTTTTTTT
-AAGGCCTCTCTGCTCTGCCCGGTACCATGGGTCGAACGAGGGGTGTATAAAATGGGGGCC
-TTGGGAAGCCTCCACGGTACAGGGCTGCAGGCCCCTCAGATGTGAACATGAGACACCCAC
-CCAGCAAGACCTTTACACAGGGAACTTAAATCTAACCTTGATAAATAAAACCAAACGTTT
-ATTTACACCAAAGAATTCCAACACTGGATCTTTCACATATGAAGGACAAAGTATTATATA
-TATACACACAGCAAGGGGTGGCGGGGCTGTAACAAGAGAGTTTATAGTTTTCCCACAATT
-ACAGGTCTACCATTTCAGCTTCAATGGAGATAGTGGCTCTGCTCCTACCTCTCAAGATAC
-ATTTACAAGACTGAGGAGCAGGTCTTCTCACTGGATGGCATGTGAGGGAAGGGGACGGTC
-GGAGGAAAAGAAGGTAGAAAGCTTAAAATGGAAGTCAGTGTGGCCACATCTCCCATTAGC
-TCTAGCATGAAACCTGTACAGACAATGTTTGTTTCTTTTGTAAAAAGCAGTAAGTTATGC
-CCAGTAACTAAATGAATTCAAAATGGCCAAGACAAAGAAAACTAAGAAAGATTTTGCCTT
-CCCTCTCCTACCAGCTATGGAGCACAGCATGTTGGGAGATGAACAGGGAAAAGACCAAGG
-TAAGGAGCCTGGGAGGGAAGGTATCAACATTTTAAACTGAACTAAAAATAAAAGTATAAA
-TGAGTTGGATTTAGGGTTAGATCAGTAAGACATGATTCTTACTGAACAGAAGTTTTTAGT
-ATCTGTCTGCATTTTGGGTAGATTTTCAACATCTTGATGTAACTAAGACACACTTCCACA
-AGAGCCACTAGGATAACCCCACTGAAGCGCTTATGGAGTAAAGTGATGTAAGCGACCAGC
-AAGCAGTCCACTGCTCCTATAGATTGGGtcctcccttccttctttccttccttcctttct
-tcctgcctcccCTGAGAAGCTACATTTTTGTAATCTCTGGAGAAGAGCACGAGATACCAA
-CCCCCTAAAGTGTGGGACGGTGGAGGAACAATGGTGGGAATGGGAAGAAGTCTCCACCTA
-AATGCAGCAGCCGGGATTGAGGCTGGTTTATCTTTGTTCTTTTGTGATGAGGAACTAAAT
-TTGGGAGGGGAGAAAAAAAAATTTGTCCATGAAATATTCCACCTGCAGGTAATTTTTCAG
-GGAATCCCCTGAGTTATGAAAAGTTCGAGTTAAAAAAAAAAAGAAAAAAGAAAATCAGCC
-TATTATAATTTTTTTTTTATGACTGAACTACTATAAATCCACAAGCAACGGTTCAGACAC
-GGTGCTTCTGAAGTGTTTCACCCCTCCCCGCCAGGCGCAAGCTGCATCAAGGAGAGGGTG
-GACTCCCCCACCTCTGCTCAGGCATCAGGAGACAGATAGGGCCGTTACTGCTGAGCGCCA
-GCGGCAGCTGGAACAGGCATCCCAAGGGGGTTGGCAGCAGCAATCACTGGTGAGCCTGCC
-AGAGGTCCAAGGGGTGAAGGGGTTGGCACTGAAGAAATCCCTGAAAGAAAAGAGCTGTCA
-GTGAGCCAAAGACACCAACCATGGCAATCTTACCAGTTTCTCATAGCACTCACTGCAAAA
-GGAACACAATAATTCTTTACTGAAGACTTCCTCTTAGCTGGATTtttacatatacttcaa
-gtctgaccctcacaaattcaagttaaagtggcaagtcctaatcaatttaagagacaggta
-aagaaatctaggcttggacaatttaaggagtttgtccaaagtacacgattaagcaagtgg
-caaccatggttggattctaacccaggcctgtctagGGCAGAGATGTCCACCCTGGTGACc
-agtagccaaccacatgtggctgctgagcacttgaaatatggctagtgcaactgaggaact
-acattttaaattttattcaattgtaattaaatagcctcacgtggctagtcactaccatac
-tgaacagcacaTGACTGCAGTCAAAGCTCATGTGCTCTTACACCATGCTGTCTTGATAGC
-TGGCAGCTTTCAAAATTACTGAAAGTCAATTTGAATGGGGAAAGAGCATTTTCTAAGATA
-AAATTGTGTTTTGGAATTTATTTCCATTTGATTTCTTCCACCTCTCTAATCATGTTTTtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtACACACAGGTAATACATTCACATGGTTCAAA
-ATACAAAAGGTTCAAAAAAGTATACAAAggccaggtgcagtgtctcacgcctgtaatgcc
-agcactttgggaggccaagttgggcggatcacctgaggtcaggagttcaagaccagcctg
-gccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcgtcatggcg
-ggcgcctgtagtcccagctacctgggaggttgaggtgggagaatcgcttgaacccgggag
-gcggaggctgcagcagctgagattgtgccactgcactccagccttggccacagagcaaga
-ccttgtctccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatatata
-tatatatatatatatatatatGAGAACATTATTATACATTCTTCTCCACTCCTCTTAGAC
-ATGGCTCTGCATCTCACtttttcttttgagacagagtctcactctcacccaggctggagg
-gcaacggtgcgatctcggctcactgcaacctctgcctcccaagttcaagcgattatcttg
-ccttagcctccaagtagctgggattaaaggcgccgccgccacgcccagctaattttttgt
-atttccagtagagacagggtttcgccatgctggccaggctggtctcgaactcctgacctc
-aagtgacccacccgcctcagcctcccaaagtgctgggattacaggcatgagccactgcac
-ctggccctgcatcttgcgttttaaatttcacattattatattggagttggagatctaaca
-gaacatgaaactcttattctactggctgcaccacattccattaaatggatataccataac
-tgatttaaccagtttcctactgatagctattctcaatgttttgttattacaaataaggct
-acaagtaagtttggatatacattactctgtacagaggtaggatactcaaggggtaaattc
-tagaagGCAGTTAGTTCTTTTCTTAAAAAAGAGGAGGGCAACAGCAATTATTTGAGGATA
-TGTAAGTAAATGCCTTCACTACCAGATATGCACCCACTTGGATGTTGCCTATATGTATAA
-TTCTTATGCTATGTGCCTGTAGTTCCTTTGGAATAACTGGGTACTCTATAAAAATTCACT
-GTGCGTCACAATGATCCAATAATGGAAAACCATTTTACTTATGTTTTTACAACTGATAGG
-CACTCTATAGTTGCTCTGGCACATGTCACGGAACTGTCCTTGTACACATACACACCTATG
-TATAAACCCCACCTCTATACCCCATTTCTTAACATTGTTTCTAAGGGCCATGTAACTACT
-GTCATTTCAAACTATAAGATGAAATGGTGTATTTTTCCTTTTCATGGCTTGGCACTTTCA
-AGCCCCTATGCCAAAAATTTTCAGCCAGGAATGCTGAGATTCTAGCCTAGAAGGGGATAC
-CCTACTCAAGACAGTATCACTAAAGTATACCAAATGTCAAGCATGCTGAAACCTGGTTAA
-AAAAAAGTCACAAGGCCACCAGTACGGAGAAGAGAAGGTATACAAGAAATCAGACCACAA
-AGCTAAGAACAGTAATTGACTTCCACATTTTTTTAAAGAAAATTTACCAATGAACTGACC
-TGACATCATATTGGCGCTGCTGACGGGCGTACTGCCCCCTGGCATGCTAGATGAACCCAT
-TCGAGCCTGGTCCTTCACAACAGTGTCTAGAAAAGAGACAAAAAGGCTAGGTTCTGTTTT
-GCTTGAAAGATTAAACTAATGGTCTGGAAGCCTGAAAGCAGCCAGCTTCATTCTTTGCAA
-TTTATATATACTCTACATTATTCCCCAAAGAACTTAAGGTGGCAATTGCCTTCACCATGA
-ATTAGACAAGTGGTAAAAAGCAGAAATAGCTTTCCTATCAAACTGTGGTAAAAGCTAACC
-TTTCAATCAAATGGTAGAAAGATGAGGTAATTATTTATAGCAGAGCGAATTTAATGAAGC
-CCTGGTCCTGTTGAGGTTTAATGGAGACAAGACACTGTAACTCGGCAAAGACGGTAATAT
-ATTACCAGTGTGTCCACAGCCCAGTACCAAGTAGGCCAAAGCTATAGGTCCATGTAGCTT
-AGGGCTATGACCACATTCTCTATCCCAATCAGCCTATCTATCTGCTTCAGGTATTGGGCA
-AAAGTATAAATGATTCAGTACAAAACCATCACACCGAAGGAAAAATGTCATGTTGCAGCT
-AACATCACAGTGCAGATGGGGTGGGTCTCAGTGGTATTTTCACTTAGGATGGCACAGGTG
-GCTATACTCACAAATCTAAGTCAAGGTGTTCATACAATTTTAAGATTTGTAAGCCTCATT
-AGCTCTTTCCAACGAATGATTACTAGGGACAGGAAAGATACAGGGCTGTGTATTCTAATT
-CAACCATTCCAGACTGAGGCACTGAGAAGTGTCATCCTCACAGTATGAAAAGAGTTTATT
-TAGGAATGCTCTTGTGTCATGTATTCTGTTACAGAAGaattcttccagtaattctgcaat
-gtagttgccatcactatccccactggaagaatctgaggctcagtgtgggtgaattaactt
-TGCAGCAAGCTGACAGGAGCTGGGATTACGACTCTGTTCTATAGGACTCTGCGCCTGCAC
-AAACTCTGTGGGCTAGATATCTGGACTCACAGAAATAGGGGTGCTCCATTGCCTCTCTTG
-CAGTAAGCCGTGACTGGTGGTCATATCGCAGCAGTTTGTCCAGGAAATCCAAGGCCTCAG
-GGCTGACAAGGTGCTGATTTTCACTGTGGACAAAGCGTTCCCATCGCTTTCGAGAGTGTC
-TGCAGGACCAAAAGAGGGCATGAGAAATGGGCCACGTGGGCACAGAAGCCCAACATTTCA
-TTCCTACATTTTTCTTAGTGGCTAACAGCCCAGACAAAAGCAAAGAGGGATCCAAACTCA
-AGAGGGTAGTCTTGCACCGCTCTGCCACTGAGTGGGACAACAAAGCTAACTGGAGACTGG
-AAACAACATAGCTAGAGTGAAAAAAGACATCTGAGTCCTCTCAATTTTAAGAAACATAAT
-TCAGGTTACTTGACAGGACGTGACCGCTTCTGTGTAGCAAGGAGGGTCAGGTGGCTGAGC
-TCACCAGGCCTATTTCCCATCCCCACACATATTCCTGGCATCTCTGCCAATTGGCCAGCA
-AAAGCCTTTGCATCAGGAAAGTCCATCTCCTCCTGTTGAGTGGTTAAGTGTATAAGTACT
-ATATCTAGTCACTACTGTTAAGAGTCGGTTGTCTGCATATAGCCtttttttttttttttt
-tggagacagggtctcactctgttgcccagactggagcgcagccacatgttcattgctctc
-tgtagcattccctcctgggctcaagggaagctcctgcctcagcttcctagtagtctggac
-tactgccacacatcaccatgcatggagtcgagggtctcattatgttgtccaggctggtct
-ccaactcctgggctcaagtgatcctcctaaagttctgggattacagatatgagccaccgt
-gcccagccTGCACATCAGTCTTAAAGCATGCATTTTCTACTTCAATTTCTTTCTCTTGGA
-GAGAGGTTTTTCACTTAAAGAAGCAAGGTAAATTTTGATTTTTGCCTCAACTGTAACCCT
-TCTACTAGAATCTACATTCATTTTGTAGGAATCCTCTAGCTATAACCCCTCCATCAGACT
-CCTGTAAGTTAATTTGAATAAAGGGCCATTCAATCCAATGCCTTTATCAGAGGCCTGCTC
-AATGCAGCATCCTGTGGCACTGGACCACTGACATCCTGACAGTGCTGGCAAAGAAAACAT
-AACTATTTTGAAGATCCTAAGTGCCAGTTCACTCTCAAAGTGCTTAAGCCACAGATGCAC
-ATATTTTGTTTCATGACTTACCTGCCCAAGATATCATTGAAACGTGGATCTAATTCAATG
-TTGTATTTGTCAATATAGTCATATAAATCTTCTGTCCCCAGAACCTTGGCTATCCTCACC
-AACTAGTATTAAAGAAAGACAAAAACCCATATCACAAGCATATTATATTAACAAATCAAC
-AATTAACAATGATTGAATTTACATAAACGGGTCATCATGTCTACAGGTATGAATGCTACC
-TCCTAACAGTTTAGACTTCAACTCAATGTGATAGTGTTAGAAAAAGCAAACTACTTTATA
-AACTGGTTTCTTCCTCTTGAAATGtcaccctggtgaacccttatttttctcccctcaaaa
-cccaattgaagatgtcacttcttttgggaagctcccattgcacactcaaactactcacca
-ctactgccttttgtgccttgtccacatttctactctgaagttatgactgtaacctatttt
-gttgtatgtttgactcccttacaagatcagctatgaactatctgaggggaagaaaactat
-tctttcttttttctgtattcctcagtactgcatgcacttgatacagagTTATTGACTTTA
-ATGGAATTCAGGTTGTATTCTTTGACTCATTAAAATTGGACATGGTGCTCAAAGGGAACA
-AGACAATGGTACCTTCCACAAGGTCCTAGAATCATTCCAGGTTCTTGTGAATGAAAGAGC
-CCTTTGATCTTCAAGGGGGAAGTGGAGTTAGTTTAAGAAACATCTGTAACTCAACCCATA
-TAAAGAGCCAAAAGGATCACAGAAATACCACATATGGGCTCACATATTGGAGAAAACACC
-ATATTGGAGATAAGGGTTTATTAGGAGAATTCTAAGGTAATGTCCTATTTTAAAAATCTG
-GATGACAATTTATATGTATTCTTCACAATAAAATAAGCAATGCAAATGACAAAGACTAGG
-GGGGAATGTCTGATTTCAAAAGGCTAAGCTGGTAGCTCCCGAAACATCAATCTAAGGATC
-AATATCGGGGTGGCTGAATAAACAGTGAACTGAAAGTTACAGGCAGTGCTGGCTATCATT
-GCATTAGGCCAGTACATTTTTCAATGGGTATAACATATATTACCTGATCATAATTGTCAT
-GTCCATGGAAAAATGGCTCCTTCCGAAAGATCATACTTGCCAGCATACAACCCAAACTCC
-ACATATCCAAACTATAATCGTACATCTGCATAAAAGTAAACTCACTGTTATTATCTGTGA
-ATCCTCAGGCTTGTCACTTCaaaataaaaaattaatttttaaaattaaaaaaaaatCACT
-CCACTGACTCAAAATCAAAACACTAATAACATCTTCATATAtttctttttagtctttctt
-ttttttttttttggagacagagtctcactctgctgcccatgctggagtgcagtggcgcaa
-tcttggctcaccacaacctccgcctcccgggttcaagcaattctcctgcctcagcctcct
-gactagctgggactacaggcgcgtgccaccatgcctggctaattttgtatttttagtaga
-gacggggtttcactacgttggccagtggtctcaaactcctgacctcatgatctgctcgcc
-tcaggttcccaaagtgctaggattacaggcatgacccaccgtgcctggctAGttttttct
-tttttttttttttttagttttttttttagttttttcttttATGCATCTTTCACTCGGTTT
-TAAAACAAtttttactttttttttttttttttgagacagagtcttgctctgtcgcccagg
-ctgcaggggtgtgatcttggctcattgcaactcagcttcccaggttcaagcaattctctg
-cctcagcctcctgagtagctgggattacaagcgcccaccaccgcgcctggctaatttttt
-tgtatttttagtagagacagggtttcaccatcttggccaggctggtcttgagctcctgac
-cttgtgatccacttgccttggcctttccaagtgctgggattataggcgtgagccactgtg
-cctggctCttttttttttttttttaaagacacagggtcttgctctgttgcccaggctgga
-gtgtagtggcgtgatcatagctcactgcagcctccaactcctgggcttaggcctcctgag
-taggtaggattacaggcatacaccactatgctcagctaatATACATACTATTTTGAATTG
-TTTTCTTCACTTACATGAAAAAAAAAAAAAAAAAACCTCCAAATTGTTAGCCCATGGAGA
-CCATCTAATGTGTATCATTAGTATTTTATTACATAAATGTTTCAGAATTCAATCTTTAAT
-TTTCCTATAATAGGACAGTGTTCTGTTTTTCACAATTATTAGTAATACTGTAAAAACTAT
-TTTTATGCATAAAATGCTTTTTGAACTCAGGGCTATAGCCTTAAGACCCCAAGAAAGAAA
-TTCCTACAAGAACAAAAAGTCTGAAACTTTTAAAATCAACTGATAATAACCTGGAAAGAC
-TGGGCATAAAAGATACTCCCAAGAAAACTTCAGATTTTTAAACACTTGGCAAATCTATTA
-TTAATTTGGTTCCTTTCTCCTTTTTCTGTGAGGAGAAAGAAGGCTTTTTGGGGGAGCTGG
-GGAGAAGACCTTTTTATTTAGTATACAATTCAGAAGAACAAGAAAACATTCTTGAATTTA
-CTCTGAAGATTGGTTAAACTTAGTTACAGGATgggcatggtggctcatgcctgtaatctc
-agcactttggggagccaaggtgtgaggatgggttgtgcccaggagtttgagatcagcctg
-ggcaacatagtgagactttctctctacacacaaaaaaattaaaaattagctgggtgtggt
-agtgcacgcctgtagtcccagctactcaggaggctaagctggaaggatcacttgagccca
-gaagttcggggctgcagtcagctatgatcatggcattgcactccagcctgggcaacagag
-caaaaccctgcctcagaaaacaaacaaaaggccgggcgtggtggctcacgagggcaggag
-atcgagaccatcctggctaacacagtgaaacccagtctctactaaaaatacaagaaaaat
-tagctggggtggtggtgggtgcctgtagtcccagctacttgggaggctgaggcaggagaa
-aggtgtgaacctgggaggcggagcttgcagtgagccgagatcatgccactgcactgcagc
-ctgggcgacagagtgagactccgtctcaaaacaaaaacaaaaacaaaaacaaaaCAGCTT
-ACAATTCAAAACAGTTCTGGAACTGCTGATTATAGAACATATCTTTGGCTACTTTCCCTC
-AAGTCAGGATCAAATGCAAACCTATTCATATTCTACCGACATTATGACAATAAAAGTAAT
-GTAAGTCATGGTACATGAATTAAGGTGATTTATATTTTACATTTCATATAAAAAGGACAG
-CTGTGAATGTGCATTAAGTGGCCTACCTAAATGCACAAAATGATACTTTTTTTTTTTTGG
-TAAATTATGTGCGAAATAAACACAGGATCAAAACTGTGCCTGCCCTTCTGTTCTTACCTG
-ATAGTCTACAAGTAGCTCAGGACCTTTGAAGTATCGGGAAGCAACTCGGACATTATATTC
-TTGGCCAGGATGATAAAACTCAGCCAAACCCCAGTCTATTAGTCGTAGCTGAAAAAGAAT
-AAACCATGAGCAATCTTATCTTTCTCTAAGCTACCCACACTGTGCCATTAGCATACTCTT
-GAtaaaatataccagacacgtcactctttactgaaacccctccactgactacttatagcc
-tttagaatgaaaataaaacttcttagcttgacaaacctctttctccatgattttgttccT
-GGAAGACACAATCTCACCTGTGCTTTTACAAATTTCTTAAACTGCTCAATGACTAAAATG
-TCCCTACTACCCAGCCTATAATCCTATTGGTAAGCATTTCCTTAACTTTTGGAATATTTA
-AGTCAGCTTCTCAATGAAGTCTGATCATTGCCTTCAGCCCCCTGAATTTTAGATATATTT
-CTTTAACAGAACCTAAACTCTTTATGTTTTCTACCTTtctttttcaatatggacgacaag
-ctccttaggggtagggactgttttattcacctttgtaattttcagaattcaacataatgc
-ctggtatacaggagaaaaatgaataaatatttgctggatagatgaaATAACAGAAAAGTC
-ATACAATACAGCTTTTACCAAAATGCATCCTAAACATGGAAAAAGGGGTAAGAGGCAAGC
-TTATCTGCCCACTGTGCATAGCATGACCATGATCTGAAGTGCCAGCAGTAGGCCCTGAGG
-AAAAACATCGGACTGCTCTGGCACTAAGTTTACTGCCTGTATCTcaaaactaaacctttg
-attactccctgcaaaagcacctccactcagtctccccctgttcggttaaaggtgatactc
-atcctgtcatacaagccaaaacttaagattcaccctggattcttgattccctcagacctc
-acatttaatctgtcaaaaaattctgaaggttctatcatattgtgaccattatcatcacct
-ccactgccactgccccgatccaagccaccaccacctcttgtttgatatattgccatagcc
-ccttctcctaactggtctcactgctttcactcttgccctctagtctaAACAGtttaataa
-atactaaatagtttaatagttattttaaaaataattaaatatttaaaaataaatataaaC
-AGCTTTTTAAAAGGATTGTTCAGGTTGCTATGGAGAGattatagattcacaggaaattgc
-caaagtagtagagattctctgcaccctttacccagtttcccctaatagtaacatcttaca
-taactacagtacaatatcaaaatcaagaaactgacactggcacaattcagaaagatctta
-ttcaggtttcaccagttttacatgcacgcatgtgtttgtgtgtgtgtttctatgcaattt
-catcacatatgtaagttgatataatctcctcaacaagatatagaactgttccatcaccac
-acacatgtcctgtgtgttagcccaacccctggcaacccctctgctctttatctctatcat
-tttgagaatgctacaaaaatggagtcattggcatataactttttttgagactgccttttt
-tcactaagcatgagatccatccaagttgttgcatgtgtcatacttctttcctttttattg
-ctgagaaatactacttcataataatattatatggtatggatatgccagtttgtttaacca
-ttccctcattgaagggcacttttccccatttttttttttttttttttttgagacgcagtc
-tcgctctgtcacccaggctggagcacagtggcacgatctcggctcactgcaacctccgcc
-tccggggttcaagcaattctcctgcctcagcctcctgagtagctgggattacaggtgcat
-gccaccaggcccggctaatttttgtatttttttagtagagacagggtttcaccatgttgg
-ccaggctggtcttgaactcctgaactcgtcatctgcctgccttggcctcccaaaatgatt
-acaggtgtgagccactgcacccagcttttccccccaattttaagctattacaaatatagt
-tgcattcatatataggcttttgtgtggacctaagattttgttgctctgagataaatgcca
-ctgcaggattgtatggtaagcatatgtttagcttttcaagaaaccaaccaactataaaac
-aatagttaagcattttccaaaatgccaaactttgcattcctaccagcaatgtatgagaga
-tcaagtttcttcacatttttgccagcacttggtaccatcactattttttattttagctgt
-tctaataaatgtgtagtTAActtttaaatttcaagtgagaacatgctaaagcttagaata
-tgcaaaagctctctatcttcagagaaaaggcctaacaatgaccaataaggttttacatga
-tttggttttacctctttgatttcatttcctccttctttccccgcattcattctgtcccag
-ctttatccttgctgctgctcttccaacatgccaaacatatccttacctgaagggcttttg
-tacttgctatttactctgccttgggacatgtttcttcataagactgcatggctgggtccc
-tcccagtgctctctaaaatgtcacctttccaatgaaaccttcccttataactggtttaaa
-actgcaaataccctcttgccattccctattcgttttttcttctacatcaaaataactttc
-tatcccaccagcctccctaaatgtagctcctaaaagacaagcatttattgtatgttgagt
-tcacttacatatccccagccctagggtggtgcctctgacatggtgtgtgtctaaaagtaa
-ttcagttgcataaataaatCACCTGCCTCCCCAGAGACCACAACAGGCAAGTCATCACAG
-CTTGTCACCTTAAAAAACTGAAATGCTAAAGCATGTGGCCATTACAGCTCTCATGTAAAA
-GCATTTGCAGACAACAGGGCCCTTATGACATCCAATAAACAGAAACAGCATTTTCTGTAT
-ATCTCGTCCACTTAACTGTGCAcatttaattctcacgaatacctagtcgcctgcagggct
-attattacccacactgtacacgtaagaaaaagaaggcaaatggagagaaagtagtttCTC
-AGGAAACCAGTTACTCAATAAATAAGGCGAGAAGCCACGTTTCCGGGCTTAGAAGATGAA
-CATTTTGCCCACTTTACTCATGTTTCCTTCTTGGGAATATTCTTAGGAATATAAATAATG
-GTTCAAACATGTTGACTTGTAAATTCGTAcattcattcaccaaatatttctcaactgccg
-aataggtactagggcctgtgacaacacaagggataaagtgttgaaGATGGGCAATTAGCT
-ACATCATGTAGATAAATAACACTTGTCAGCCTATCACTTTACCTTTCTGTGCTCATGATC
-AATCATGACATTATGGGGCTTGACATCTCTGTGCATAATTCCCATGCTGTGACAATAATC
-CAGGGCCTGTGGGATGAACGGGTCAGAAAGGAGTTAGCCTGAATAATACGTAAGAGTCCT
-TTACTTTTCCCTCCATGTAAATTTTCCTTTTAGCCTCACAATACCCCTGGGATTCAAGCT
-GAGGACACAGTCACTTCCACAGCAATGCTTCAGAGACTTGTTCATGATCTCACAGTCAAG
-CAAACTCAGCTCTCTGAGCTTAGAGATCTTTTTCTGACACAGTTGTTTCAACATGTTTTC
-TGTCCTAAAAGACCCAAAGTATACCCAAATTGCACCACTTCAAATTTTTCTGTCTTGTCC
-AGATCCTAGATTATTTCCACAGACCCCTCAAAGAAAGAAAACAGATCTTTACTACAAACC
-TCTTATTCTAAGAACAGTAATTCTTTAGCCATTAAGAGTCTGTAAcagaggttggcagac
-cacaggccaaatttggcctgatgtctgcttttgtaaataatgttttattgcaacatagcc
-atgcctatttgtttgcatattgtttatggttgctcttgtgcaacaacagcagacttgaat
-agtgtgacaaacactacatggcccacaaagcctaaaatatttactatttggccctttaaa
-gaagtttgccaatgcctgATTTAGGTCATCAAATCCAATCTGAAATGTTTCCAACCTCAA
-ACTAAAGGGAACTGAGTAGTATAATCTTTGGGGTTTGTTAATCCCAGCCTTTCAGTCAGC
-CGACGTTGTTGGCCAAATTCTTGTCCTTCCTGAAGGGCAACTTGGGTTCCTACAGTTCCC
-AGGGCTGGGCAATCATATCTGTAACTTTCTAAAGCCTTGCTTGCCACAAACTGCATGAGC
-CAATGGAAAGATCAAGTATCTCTGCTGGCACAATCTCCTCAGGGGATTTCTAAGGCTCCA
-ACAGCAGGCTTTATGTCAACTCTTGTTTAGTAAGAAAGCTTAGCCAACTTTTAGCAATTC
-TCTCTTCTAGGAAGCTGATCTTGTGGCTACTGGGAACAAGATATTTGGTGACCCCACTTT
-AGAAATGTAAGTAAATTTTCAATTAGCATCTATAAGCAGAAATTTACACAATCCTTAGGA
-CAATTACCCTTTGAGAACTGAGTTAAAGTTTACTGTTTTATTTGCTGACTCTTAAGTGAG
-ATAAAGTATACCAGAAGCTAGCACGTCAGGTGTTTTCACGAGTTTTGAAAATTTAATATT
-AACTTACATAGGGGCCACAGAAATTACAAATATTTGTTAAGGGGTCAGTCCCAGCTATCT
-TACAAATACCCTTTTTCAAATTGTTCTAAATTATACTCCCACTAGACCCCATTCCATAAC
-CCTTAGCACAAGGGTTCTGATACTATTATTATTAAtttttatttatttatgtatttagag
-acagggtcttactctgtgctactgcactccagcctgtgcaacaatcatagctcactgctg
-cctcaaattcctgagatcctcctgtcacagcctcccaagtagctggaattacaagcataa
-gccaccatacccagctaatttttaaattttttgtagagacagggtctcactatgttgctc
-aggctggtcttgatctcctggcctcaagcaatcctcctgccttggcctcccaagtagctg
-ggacttacaggtgcacaccaccatgcccagGTAATTAAACAAtttttttttgtagagatg
-gggatctcactatgtcacccaggctggtcttttgatctcctggcctcaagcaatcctcct
-gcctcagccttccaaagtgctgggattacaggtatgaTACTATTAACTTATTAAAAACTT
-ATATAGAGGTCCCTTCTTTCAACATACTTTACAAAGTTAATCTGCTGGCTTTTCTACCAT
-CAATTGACTATTTAACAAAAAGAAGACCAATTTAAAAAATATTTAGTATTCAAGGTTCAC
-TTACCTTCAGAATCTCATACATGTAAAATCGAATATCATAGTCTGTTAACGTCTGGTACA
-ATTGCTGTTAAAGACAAATGTTTGAGCCATGAAATAATGCTGACAGAAAGGCATTTTTCA
-CCCTCACTCACAGTAATTCAAACCAAGACTTGGCTCATTTACCGTTGTTCCAAGATCTGT
-CCATTCACTGCCCTCTATTTCTCCAACATTACATTAACTTTAAAGAGATACTTTGGGTCT
-TCAACTCTTAAAAATGAAGAATTACTTAAACATATATTGCGGAAGCTATAATCCACTGTC
-AGAAACATACTGATCTAGATACGTTAATATGCACTGACACCCACCTATAATTTAGTTTGC
-TTTTCATGTATCTTCAGACCTTCTCAAAAGAGGCATTTTGGCAAATATACTGCCTCCTTA
-GTAGGGAACTAACTCATCTTTGCCTTACATAGTTGGCCCTGCAGATCACCAGTGGGTATG
-CAGATGGCATGATACCAAACCTGTTGAGTCAATTTAACAAAACTATTCTTGTTCCAATTG
-GAAAGTAAACTCTGAACAACTGTTATGTATCCTTTCCAGTTTCCAAAGAGTTGCAGAATG
-TTTTTTACATGGACATATCttttttttttttttttttttttgagacagggtcctcactct
-gctgcccaggctggagtgccgtgctgcaatcataactcactgcaacctcaaactcctggg
-ctcaagcgatcctcctacctcagcttccccagtagctaggactacaggcgaaagccacca
-tgcccagcCACAGGTACGTCTCTTTAATGGTTAGCAACGTCTTCTGACAAAGTTTTTCTT
-GAAATTATCATTCTGACTCTAAAGCAGTTCCTCTTCCTTTCTCCCTATCTCTGCAACAGA
-ATTCACTAATTTATTAATATATAACATTCTGGATACTGGACTGGTGGAAAGGCAAATCGA
-AGATTTTTACTTTTACTCCAAAAGAGTAGCTATATTCTTCTGTAAAATTGGAACTGTGTG
-AAATAAGTAGGCCACTGGATAGACTGGAATTCTGAGATATCTCTTATAGAGGTTTGTGTT
-ATGGCAGAATTTGACATTATCCTTCCTCGATCCCTGCCTTTTAAGATCTATAGCCCACAG
-TTTATGAGGAATCCTAAGAAATAAGCAGTCCCTACTTTTATACATACAATATATTTCTTC
-CTGAACACTATTGTTTAAAGCGAATTGCCATATGGCCAGATCCTAAGTGAACGTGTGTTA
-CTGCCTTCATTAGGTTGGACATCAGCAGAAACTGTCAACTAAGTAGTGAGAAGTCAATGT
-GTTGGTCATTAAAAAGAACATTAAACAAATGGGCAAAATATCAAGATGCAGAAAGTGGGC
-ACTGCTTATATAGGAGTTCTTCTATCTTAAAATTTGCACTGTAAGGATGAAAAGCTTTTT
-AAAAACAAATGCGAAGCAAGCTCTTCTAACAGCATCATCCCCAAAGGCTATGTGGTCTAA
-AAACCCACTAGCCCGAAACAGTTGGTTATATATTATACCTTGAAGTCTGTGTTGTTTACG
-TGTTCAAAAACCAAGGCGGGGGTTCGTGACTAGGGGAAAAGAACAAAAACAAAAACACAC
-ATTAGCAATAGCCCTGACAGCTTTAATGGGGACAATGTTTGCGGATGCTGCGTGGTGAAA
-TTTGGCAGTCCTCGCCTCAGTAGTAAGAAACCCTCTATTGCTACAAGCCCTCCCCGCTCT
-GATCATCACCGCACTTAGGTCATTTTTGGGATGGATTTCAAACAGAAGACATGGAGCTGA
-AGTCTCACCAGGCTCTAGGCAGCCCGACAATGCGCCCATCGCCCATCGGCATCGGACCTG
-AGTTTGCAAAATGGATTAACACATTTCAGTTTCCAGTGCTATCAGTCTCTTAGCCTAGAA
-GAATAAGAAATAGTCTGTGGGTGGAGGTCTCTTTGAAAGAAAGACCCAAGCTAGTTAAAT
-GGTATATCTGATTAAGCACTTTCAAAGCAGGACTTAATGATGAGGGTTGGGGGAGGGAAC
-AAAAAGAGGCCAGTTGTGCTCCAGGTCAAACACCATCTCAGCTCTGGCGGGCCTTGCTAA
-CACCTACTATACTCACCACAGGGTCTTTTACAATGTCTGCCAGTGTGATGATGTTGGGAC
-CTCCTCTCAAATTCTCCAAAATCTTTATTTCACGCTTAATTTTCTTCTTTTTTACTGGCT
-GAAAGGGGAAAAGTACATCAGCaaaaaaaaaaaaaaaaaattttttCAGAGTATTTCAAC
-ACGTAGTGTAATACATAAATGATAAATGGCTTACTtatgagcacaccttgaaggaagaaa
-atgtgtcacattcgtctctgaatccttctcctagcactgtgccaggtattctgcaggtac
-ttacaaatgttgaattgaaagaaAAAAAGATTTCTATTCCAAAGACCAGACACTTCTGCA
-GAATTAGCATTTCAATCATCAGTCTTGATGTTAATGTTTTAAAACATGTTAAACATGTTA
-ATGTCTTAAAACCTTACAAAGTAGCAATTTAAATCGTTAGTAATACTAAAGTATATCAAA
-CTTTTTATCAATTAGGATGAAACATGGGCCCTTTCCATTTCTTCCTCTAATTAGGGCCAA
-CAACAAGGATGGCCAAAACATCTTTGTgtagcacaaccctgagggtaaagggtgagtctt
-ggagtcacaatgcccaatgtgaaacctacctttactacctgctggctgttaatggcaaac
-tacataacctctctaagcctttcattaagtgtaaaatgagtaacaagagtacccatctca
-taagattgttgcaagaatcaaatgaggtaTTCGAAAGATTTCGGAATATGGCTGAAACAT
-AACATAATAATAACTGTCTAGCCTGATCACCAATGCTCtttttttttttttttttttttt
-gagacagagtcttgctctgtcacccaggctggagtgcagtggtgcaatcttggctcactg
-caacctccgcctcctgggttcacgccattctcttgcctcagcctcccgagtagctgggac
-tacaggcacccgccaccaggccaggctaatttttgtatttttagtagagacggggtttca
-ccgtgttagccaggatggtctcgatctcctgacctcgtgatctgcctgcctcggcctccc
-aaagtgcCAATACTCTTATAAATGAACCCCTCCATTCTAAAGAGTATTCTGCAGAGCATA
-TCTTAAACATTCCTTTGTCCTTACCCATTCTTTCCACATCTGTTCTAGTATGGAATCCTT
-TTCATTTTTTTCTGAGGAGGGCCTTGGTCCCACTGCACCTCCTTTATAAAGCCttttttt
-ttttttgagacagagtcttgctctgtcgcccaggctggagtgtagtagcatgatctcagc
-tcactgcaacttccgcctcccgggttcaagcaattctcctgcctcagcctcccgagtagc
-tgggattacaggcgccagccaccatgcccagctaatttttgtatttttagtagagacagg
-gtttcatcatgttggtcaggatcgtctcgaactcctgacctcatgatccgcctgccttgg
-ccttccaaagtgctgggattataggcatgagccactgtgcctggGCTTATATTATAAAGC
-CTTCTCCTGAATAGTCTAAAAcagtgctggcccaaaggaaatataatacaaaccacatgt
-gtaattttaaatgtgttagtagccacatcaagaaaattttaaaaaggacaaaattaatgt
-actttattaatctaaaatcttaacatataaatcaatataaaaattattaatctattttac
-ctttttttgtattaaacccttgaaatctaatgtattttactcttacagcatatctcaatt
-cagcccagccatatttcaagtgcttaacagcctcatgtggcctgcgtgcctgctgtactg
-gactgtgcagGTCTTTTCCTAGGGTGTTGGTCACCTCAGACTAGATGCACTGCATATAAC
-TCTTAGAAGTTAAGTACATCTCATCTCTTCATTAACAAGATTGgtggttactaaagtttg
-atgaccaacaatcacctggatttttttaatatacagactcacagaacccaccaagattca
-ctaaatcaaaatcttgagagggaaacgggggatttatttttagatactttccaggctgat
-GATCCAGGTCCAGAAACTACCAAATAATACTATAAATTCTTTTAACTTTGTCTTAAGCCT
-CAAGCACATGATAGCAGAAAGCAAGCAGATTTTGGAAACATTGACAGTTCTCAAAACCTG
-GCTTTGTGGTTGTGCAGTGTTCAGAAAAGCATTTAAATGTTTCTCACTGCTGAAAGGGAC
-TATACTCGCCTGTTAGTGATTTACATACCACAGTTAGAACAGGTCCAATGCAAAGTGGTA
-CCCAATAAACAGAAGCTATTTTACTAATGACTTCCATGTAGTCCATTGAATTCAACCCAC
-GACCTCTTACCCAATACAATATCTACCTAAGAAACAAGATAATATAAGTCTTCTCTTCCT
-GCTTCAACTATTCAGATCTTTATAAACTGTTATATTATCTGGGAGATCTTTCCACCCTGC
-AGAGACTAACCCAACAACTTACCTCCTGTTTTCCATTAACCCAACTGCTGGTTTTTTAGT
-GGAAAAAAAAAGCTTCTGGTTGACAAAACTACTCTACAGAATGCTTCAAATCTATAAACT
-TAAAAAGCTGGTTTGTGACAGACCAGGCAGCTGACTCAGGCCCGAATTTAATGCGATCAA
-TGCAACTTTTGTCTTATTAAATAGGGGAGATTAAAAATTTTAAATATGGTTTACAAAGGA
-AATTCATCTATACTTACACCACCTACCCACAGTTACAGTAAAATATACAATACAGTTAGA
-AAGACTGAGCTGAAAAAAATCTTTCTAAATCACCCTTCATTCAAAATCATCAAGGGCTCA
-CAATTACCTAGAAGAGATAGTCATATAATTTTAAGACTGCAAGGAAATGCAGAGATTATT
-TTTTCCAGGCCTTCGCCAACTTAATCTCTCTTTCCAAGTTCAACTCCTATGTATGGTCAC
-ATAACATCTTTCACATGAAATATTTCTCTCACTTTTCCCTCCTCCTCTTTTCTTATCTTG
-GTGCACTCTACAGCCTGCTTCCCTTCACCACTTCCACCCAACACCTATCCAAATCCTCCT
-CCCATTCAGCCTGAAGACAGCTCCTGGGAGCTTTTCCTAACTACTACCCTCTTCTGAACT
-GTAGACCCACTATGCATGCTTTTCATGTGGCTCTAAATAATAATATATCACCTCATTCTA
-TCATATACCTTTCCATATGAATATCACCATACAATCACAAAGAACTCCAGTCTCCAACGT
-ATGTATATATACACACAATTTTGTGTTTGATCCtttttgttttttgagacagggtctcat
-tctcatcgcccaggctggagtgcagtggtttgatcatagatccgtgcaaccttcaacttc
-caggctcaagcgatcctcccactttagcccctcgaggacctgcgactaaaggcacatgcc
-accatgctcagccaaCATTCTTTTTAATAGATGGATAAACATGTCCTAGGTTAAAAGGAC
-TACTATGGCTAGTCACCCACATGTTTTGATTTCCAACCTAGTTCTCTTTCTACATATTTC
-AAGACAGATATAAATACTTAAACTCTCTGGTTCTCAAAGGGCATGTgaagcaccccagca
-atgcacaggaatactgtggaacactttacatttttgaggaagacacatcaacccatcgtt
-gaatctgccagacactgggtgcactgccagcttgaggtggttcgtagtttcaacattaga
-ttgtgttacactcctcgtgatggattgtgttatactcctcgcgatggcatatttttgtga
-agctgggtttgcagtagttgctgtggtaaaaagcaagtactgcacaaaaatcaatgacag
-gaaatgagggtggtggtgtccaaccaatgacaacatttgaaaagctatgcagcaacaggt
-ctacataacccaacagtaacaaattatagttatataagaacaaatttaacttttttcttt
-taatttatgtgaataactttttaaatggctaccaagttgctaagatataaatacttagcg
-ggcaggcgcagtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcggat
-cacctgaggtcaggagtttgagaccagcctgaccaatatggtgaaaccccgtctctatta
-aaattacaaaaattagccgggcattgctggcgtgcatctgtagtcccagctacttgggag
-gctaaggcaggagaatcgcttgaacccaggaggcggaggttgcagtgagccgagatcgcg
-ccactgcactccagcctgggcgacagagcgagactccttctcaaaacaaaaacaaaaaca
-ataaaaaaaacaaaacttacttagctatttggaccttgctacttaatacagagaactatg
-aggtatttcttgacttaggagtaccgtgaaaaattaaagacagtataagtgttataaatt
-gagaaagtttggaaacttctACTTTTCAGTGTCAAATATGAAAAAGTTCCTGTGGTAAGG
-AACTATATGCTAAGTTCCCAATATATGACAGTGCACAGCATAGTTATAACTAAATTAAAA
-GTTGTATATTGGTCTCCCAGAGGCCAAATCtggcctgtgcattgtttttttaaaatcttg
-agccaacacttaaaagtcaggaaaattcatatacaaatataaatttctggcttttatttg
-caaaacagagtatcaagcaacaatggacttgcattactgcagggcaatcatcagcttcag
-ctgagaagcagctaactccttttgaagaggcatgtgtttcccagtttgtttcagtcccta
-ccactcacatcacCTAAGCAAGGGCAATTACACCCGACTAGCTGCACTAATATCATCTGT
-CTGTCCCCCTCGAGTCCTGTGACTCCTCATCTTTACAAAGTAGAGGCAATGATTTATTTA
-TTGAAAACAAAAGCCTCATTATATAATGAAAAGTAAAGGAAATAAGTATTAGgcaataac
-tgggagagaagagactgtacctttgctcccttactctgccacaacctagctatatgagtc
-aactcaaatcacttctcttgcttcagtttcccgatctgtcaaataagcagaacttgttct
-attgagttcataggatACAATAAAATTTTATTTATTTGCTTTGGCACCAAAAACCTTTTA
-AATGCTGTTTTAAAAAAGTCTTCAAAACTACTTTTAAAAATCTATATTCCAAATACCTCT
-GAAATTATCTCTTGTACTCACCTTGAGAATTTTAACAACAACTTTTTCATTATTTGTGAT
-GTTGATGGCTTCAAATACTTCACTGTATTTACCTCGGCCTAATTTTCGAACCAGCTGGTA
-GTCATCTTGATTTCTGTGGACACAAACAAAATGACTTATAAACGGTCAAATTATCAGCAT
-CAATTCAAATTACAGGAATCTATTACCAGCAGCTGTAATAGAAATAAGAAGTATTTCAAA
-CAATTCCCAAATAGGtttttttttttttttttttttttttggagatggagtctcactctg
-tcgcccaggctagagtgcagtggcgcgatctctgctgactgccagctccacctcccgggt
-tcacaccattctcctgcctcagcctcccgagcagctgggaccacaggcgcctgccaccat
-gcccggctaattttttgaatttttagtagagacggcgggtcctcaccgtgttaaccagga
-tggtctcgatctcctgacctcgtgattcgtccgcctcggcctcccaaagtgctgggatta
-caggcgtgagccaccgcgcctggccCATTGtattttttttttttttaaattaGGCCAATT
-AAAATACGTGTGTTTCAAATCCTAGAATTAGAAAAACTTATACCTTTCAATTATTCTTTC
-TAATCCCAAACTGTTTACATCTTTATTGGCACATGACATGGAGCTGGCTTGTATTAAGGT
-TTGTTCTAAATACGTTTGTCTCCAACAAGAGACAGCTTTCCCCAAGAGAATAAttttttt
-ttttttttttttttttgagacggagtcttgctctgtcgcccaggctggagtgcagtggcg
-tgatctcggctcgctgcaagccccgcctcccaggttcacgccattctcctgcctcagcct
-cccctagtagctgggactacaggcgcccaccaccacgcccggctaatttttttgtatttt
-tagtaaagacggggtttcaccgtgttagccaggatggtctcgatctcctgaccttgtgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgcacccggccG
-GAGAATAATTTTTATATATTCTTGTCCCTTAGTGCTTGGTCCAGTGTTGGCACTTAGCAG
-GAACTAAAAACATTTTGCAAGACTGTTTCAATCTAGCCACACTTTGGCAGCAGCTGATTT
-TTAACAGGCCTCTTTGAAGGTAAATGGCTTTCAAATGTATAGGCTTAATCTATTTGCCCT
-CCAGGGCAAGCTCTGGGGATAGTCCATGCGTAGTACGAAGCACATTATAGATTGTAAACT
-ATAATCAGCGATCCCCTCCTCTACATATACCCATATTCTGTGACCAATAAGCAACATCAG
-AGGTAATAAACAGAGGTAGAATAAGGGAAATGCCAACATTTTCCTCCTGCCCCTGCCTGC
-TTCCAATGTAGAGCGCTTTGCTCTGAAGAATGACAAACACAGTTCCAATAAGGCCTAAAT
-TCTATCCTACTGGATAGAATCCTCTGGACCTACTAAGTATCCAATATGAACCAAATCAAC
-CACCTCAACCATTCATTTTCCTCAAGTAGCTAAAAAGAAAGTGAATGAAAAGACAAAAGG
-TACTAAAAACAATGGACAACATAATAATCATGGCAGGTGTAGGGGAAGAATGCTCCTACT
-TCTGGTTGAGTTCTCTTCCTATGGGAGGGCATACAAAACAAATGCCAGCAAGCAAACAGA
-ACCATGCCAAAAGCCCAAAAGGGCTCTTTAGTGCCATTTAAGCAGAACCAAGTGCAAAGC
-ACTCAATTTGAAGATAGCGGCTGAAATTCCTATAGTAAACACAGTGTCACCTAGAGTCCA
-AAGCCTGTGACATAAGAGGAGAATTGTTAGATTATCAGTAATAACAACATTTATTGGTAC
-TAAACCACACTGGCATTTAATGGTGTCTTTACAGCATACAGTGCCTCTGTATTCAGAGGC
-AATGTATTTACTGTTAAGAATCATGGCATACTCaaattagctgggtagggtggaaggtgc
-ctgtaatcccagctactcgagaggctgaggtgggagaatcacgtgaacccaggaggcgga
-ggctgcagtgagccgagatcacaccactgcactgcagccagggcaacagagcaagactcA
-TTTCCACACACACACATACACAAATTCATGGCATACTCAAGATTAAAAATACGCCCTATG
-ACAATTTAGGGAAGCCATCCACTAACCACTTACAGGTTACAGAAATCACATGCAGTCAGA
-TATAAAATACAGCATACAGGAGCTGTAGCTTTAGTTTTCAAATTGCTTTCTTTTGCACTT
-GAATGTCAAAATGCTTTTATCACAAAAGTATGATCTGAACAATTAAATGTCTACCACATT
-GGGACAGGAAATGCAAACATCCAAATGAGTCTGCACAGAGAATTAGGAGGGCAAACACAG
-CTGTTCAGGCAGACTACAACTGTTCAAGATAGAATTTGGGCTGAATTCCATGCTAAGACA
-TGCCTAGTCTCAGGATAAGGGCAAATGTTTAAGAATTTAATTGTTTCTCATCAGAAAGAA
-GTTACCTCTTTGGAGAACTGTTTCGTCCTCCTGTATTAACACGAAACAACATTCTCTACC
-TCAAAAATACTTTATATAAGACTTTGGTGTTTTCAAAGTCTCTCAAGTATCACTTCTCAC
-TGATCTGCAATGCCCTTGGCTTGATAAGCAAGCTGATAGGTAACTTTTTGTTGCCAGGTG
-CCCATACAGAATACCgtcatgcgttatttaatgacattctgagaaatgtgttaaacatca
-gagtgtttacacaaacctacatggtatggcatattacatacctagggtatggcctacggc
-tcctaggatacaaatgtgtaccgtaataaatactttaggcaattgtaacacaatggtatt
-tgtgtatctaaacgtagaaaaggtaatgaatgcactgttgatgttacgatgacatcacta
-ggccacagacatttttcagctctcttataatcttatggaaccactgtcctacatgtggtc
-tgtcattaattcaaactttgttatgtggtgcacgactgCATATACATCATAGAAAAGGAT
-AAGAAACTAAAATGATTTTTAAATGGTAAGCCCATTAAAATTGTTCACTTGCCAAAGCAA
-CTCTGCTTCCTCACTGCAAAACCAAATTTTCAGCTCAAAAGAAAACACAAATTGGGCTTT
-GATCCTGAGGTATACACATACAGAGTCACGGAGGTTTTCTGACAAAAACTACTCAACAGA
-TCCACAAGATTCAGCCCTTTGAGTGAGTATAATGAAGTCAACAAAAACAATTACCCCCAT
-TCCACCACATGTGACTCGTAATCCCAGTATTCTCGAGGTCTGTGTGTATTAACATCTGTG
-TAAACTCTGGCCCTGCTTGGCACGGGTCCCGACATGTCAGACAGGTTGGCGGACAAAGCT
-GGACTTGATGTTTGGAGATCTGGCAGTCACTGTGTTCAGAAGCAGCTGGGGGTAAGACCT
-TGTTTCAGACCTGTTTTCTTCAAACTGCAGAAACAAAATGCACAAAGTCCAAGGAATCAT
-TTACAGAAGGTATATGGGAAGGAAATAATCTTACAAATAATAATGGCCTGAAATATACCT
-CTGGCTCTCCTACCTACAGCCAATAAATATAGCTCAACTGTGTTAACCAGTGCTTCCTAT
-AACATGAGAAGAAAAATCCCAAGAAATACAGTAAACTGATATTTGCTTTAATCATATTTT
-GCCAAATATCCTGTTACCTCTGCAGGCAAAATTTGAATGATTTTTGTAAGACAGCCTGGA
-AGAGAAAAATGGCATTGAGGATAGATACATCAGCATTACCACTAGTTATATATTCTACAA
-AAGGTATTGGCAAGAAAAATACTTTCTTTTCAGCAGCTTTCTGTAACTTAAGTAGGGGTG
-CTAAAAGGTTCTAGAATGGCGGCAAAGCTAAGAGTACAACTTGCCATTCTGACTCATATT
-TGATGAAACCAGGAAGAGAATAAAGGCTTGTTCTCATACATCAAAGCTCCATGTCATCTT
-ATACCAATCCAAATCTTTTGGGGGAACCTTAAGGTAATAATCAGTAGAACCTTGATCACC
-ATTTGAAAGACACACTTGGTTTCATTAAATTTAAAAACAGAAATCAGTAATATTCTCTTT
-ATATTTAATACAGGAGCTTAAAAACTGGTATAAAACAGTAATACAGATTAGCTGAGCTAA
-TGCAAAATTTGACACCGGGGGAAAATAAGTAAGATGTTAGAAATATGCTATCAAATCAGG
-TTCCTTTCCAATGATGTCTTCCCTATCTCCTACAGCATGTGCTGATTCCCCTCATTATGC
-ATTTAGATGAAATTGTATTGAGTCTCCAGATTGTGATAACGTGAGAAGGATATAACACGT
-ATGCAAGTCTCCTGGCTGAGACAGCATAACTTCAATTTGTATGTGTGTATGTGttttaag
-acagggtcttattccactgcccagactggaatgcagtggtgtgatcatggctcactgaag
-cctcaacttcctggactccggtgattctttcacctcagcctcccaggtagctgagactac
-aggcacgcaccaccaccctcagctaattttctgtattttcagtagagacggtgtttcacc
-atgttgcccaggctggtcttgaactcccaggctcaagcaatcctcccacctcagcctccc
-aaagtgctgagatcacagatgtgagccaccgcacccagccATAACTTCAATTCAATTACC
-AGGAAACATTCAGAAAAAGAGGAAGTGTCTATTTAAAAAGGGGGAAGGGGTACTATACTT
-CTAAAACATGTCCACAGCATAAAAGACAAATGGAGGCTAAAGAGACATTGCATAAATGCA
-ATACTCTAGACTGTATCCCATACTGCAGGAGGTGGAGGGGGAtgctataaaaaacaatat
-cgacagaactggaattcagagggtattaaattattgtatcaatgtaaatttgtgaagttg
-gtacataatcacaatagttaagagaatatacctattcttttttttttttttttgagatgg
-agtttcgctcttgttgctcaggctggagtgcaatggcgtgatcttggctcaccacaacct
-ctgccgcctcccaggttcatgtgattctcctgcctcagcctcccgagtagctgggattac
-aggcatgcgccaccatgcctggctaattttgtatttttagtagagatagggtttctctat
-gttggtcaggctggtctcaaactcccgacctcaggtgatccgccctcctcggcctcccaa
-agtgctaggattacaggcgtgagccacctcgcccagcccaagaatatgtctattgttaag
-aaattttcctgaagtaattagaagtaaacagccatgatgcatataatctaccctaaaatg
-attcaggaaaaaaatgtgcccacacgtttacatgtgtatatatatagcacacatgactgc
-acactcacaaatgataaaacaagctgggtaaaatattacaataggtaaacgtgcgtaaag
-ggaatagagatgccctttgtactatttttatttactttttgttgaaatcttcttatttga
-aacaaggtctccctctgtaggccaggctagagtacagtggtctgatcacagctcactgca
-gccttgacctcccaggctcaatcaatcctcccacctctgcctcccaagtagttgggacca
-caggcgtgggctaccacagctggctaattaaataaattttttttttgtaaagatggggtt
-tccctatgttgcccaggctggtctcaaactcctgggttcaagtgatgctcccaccacagc
-ctcccaaagtactgtgattataggagtgatccaccatacccagctTGTTGAAACACtttt
-ttaaattgtggtaaaatatacataacataaactttatggccaggcacagtggctcacttt
-gggaggcttaagagggtggatcgcttgaacccaggagttcgcaaccagtctgggcaacat
-ggtaaaaccccatctctactgaaaatacaaaaaattagccaggtgtgatggtgtctgcct
-gcagtcccagctacttgggaggctgaggcaggagaatcaccagagaccaggaagtcgagg
-ctacagtgagctgtgattgcaccactgcactccagcctgggtgacaggagagagacctca
-tctaaaaaaaataaaaactgccattttatccacatttaaacctaaagctcagttgcatta
-agtatattcacattcttgtgcagtaatcaccagatcatccatttctacaaatttttacca
-tcccaaatgaaaactatgtatccactaaacactaattttccctcccccaactctttgcaa
-ccactattctattttctgcctgagctggctattctaggaacctcatataagtggaatcag
-acaatatttgtcctttgttttgtttatttaatttagcataatgtcttcaaggctgatcca
-tgttgtagcatgtgttagaattccaatccttttaaaggctgaatgatattgcactgtgta
-tatatatacacacacacacacacacacacacacaccacattttgcttatccatttatctg
-ctgatggacacttgagttgcttccacagcttggctattgtaaataatgctgctatgaaca
-taggtgtacaaacatctgtttgagacctcgctttcaaatcttttatgtatatatccagaa
-gtggaactgctgaaccatgtagtaattctatgttaattttttgaagaaccagcatattgt
-ttcaacaagctgggcacggtggctcactcctatacagcaactgtatcattttacactccc
-aggaacagtgcaaaggctacaacttctctacatccttactaacacttgttattttctgtt
-ttttGCTTGtttttatagagacaggggtcttgcttatgcccaggctggtcttgagctcct
-ggcctcaagggatcctcccacctcggcctcccaaagtgctCTCAAAATAGACTGTGCCTG
-GCCTATTTTTTGGTTTTCTTTTCTTCTTCTTCTTttttttttttcagtaacagccctcct
-aatgagtatgaagttgtatctcattgactgtgattttaatttgcatttccctaatgatta
-atgatgttgagcatctttttacatgcttattggccatttgtatatttgttttggagaatg
-tctattcaaagctgttgtccattttttgattgggttgttttgtttgttGACGATGCATTT
-GTTAACTATACTGTTTTTTTGTTGCTTACAAGCTGCTCATCTTTCCAAGGTAAGCTGTAA
-CTTAGCTACCACACCCAAAGAGAAGCCAGAAGAGATACCTCCTTATGCCCATGGTGTCGG
-CAGCTAAAGGCTTTCAGAAGAATAGCAAGACTGGGATGGAGATTAATTCTCTATTCCTTA
-ACCGTGACAAACACAATTAATGACATTCCACTCCAAATATATGAGATCAAAAGATTCACA
-TGCTGACTTATGAATTCTCCCACCCAAAAAACTGCTGTAACTTGCCTCTGTTCAACTCAA
-ACCTTCTGAGGTTCCATAAATGTACTAAATGACCAGAAAACAACAAAGTAATTCAAGTAC
-CAAAAGTCTTTAAAATTATTTCTATTTCTTTGATTTTGTAAAACCTGGGTGACATTAATC
-TATCTTCACTTAATATCAGTTAAAACTGTAAACGCACACACACACAAACACATCAAACAT
-GCAAAAACCAGATGTTTTCTTGTAATTTTTCTTCTTCCCAAAGAAATAAGGTCATCTATG
-TTGTAGGATTGGTGACTCTGTGACTACTATGCCTGCCTTGACAGCAATGAAAGACACTAG
-GAAAACCGTAGAGAAAGGTGTAGGTGTGAATATGGCCAAAATAGTAGAAACAGCAGCATG
-AACCCAACAGAAATGCTGTCCCCAGAAATTTATTACTTTTAATATACTAAACTTTTAAAT
-TCTCAGCCTCTCCTCTGACAGGAAACAGTATCTTTCTCTACATAACCTTTACAGCCACTT
-TACTCTTCTGGTTAACATTTTATACGTGTAAGACAGCCTTCGTCTGTGGATCTCAAAGCC
-CTTTTCCTATGCTTAAAAGTGATCTCTCTGTTGGGCTTTTCCCAGCTTTGGTTCATCACT
-TATAAAACCTGTCTAACTGTGCTTGCAGACTGAAGGGAAGATGAAGTGAGATGATCTTCC
-AGAAAGGGCTTAGAAACATGAAATGCATGTAAATTTGTATTAAGTAATTACTATCCCCTA
-GCTCCTTAGTGAAAGCTAATAAGCAGAAACCTATCTTTACAGGCTGGAACCTTCATTCTT
-TAAAATACAAAAATTATAGTAGCCGTGGTTAATTCCCGGCCACTGAGGGCTAACTCCCAA
-GTATACATGACATTACAAAATGAGTCCTCATTTCTCCCTGGAAACCATCTGACATATGGA
-GAATAGCCAACTCCTATTACTAGTCATGTACATTCTCATCACCCAGTCTTCTTCTGCTGT
-TTCAAGGCCCTGGCATCCTCTGTGAGGAGTGGGAAAAGACTAATAACTAATGAAACTCTT
-GAGATTCTCCAGTACTTGTCTGAATGACCCTTGAAGCTTTGGGGCTCATCAACTGGGACC
-TAATTTATGAACTAGCAGATCTGATTCTCCACTGGGAAGACAACAAGCTAACTATTTTTG
-CAGTACCCCCAAAGAGGTGCTTCACCTTACTGTCACGCATACCAAATAATCTGCTTATAG
-TAAGAAAGGTATTCACATGAATTTCAAATGGCTGGCCTTCATTAATTATACGGGAAAATA
-AAACAGAGGATTCTTCAACTGTGACTCTGTAATCTCAGATAGATAAAAGGGTACTAAGAG
-ATTGGGGGTTAAGGGATGGTGATAAAAAGGGGATGTGAagcccagtgtggtggctcatac
-ctataatcccagcactctggcaggatcacttgagcccaggagtttgagaccaccctgggc
-aacacagcgagacctcctctctacaaataacataaaaatgagctgggtgtagtggagtac
-aactgtggtcccaggtacttggtaggctgagatggaaggatcacttgagcctgggaggtc
-aaggttgcagtgagccatgatctcaccactgcactccaacctgggtgacagagcaagacc
-ctgtctcaaaaacaaacaaacaaacaaacaaaaaacaaaAACAAGAGGGGATGTGAAAAG
-ACAGAAAAGGGAGGTCAAAGACCAAATATTATCATTATTATTTTTTTGAGACAGgagaca
-gggtcttgcgctgtcacccaggctggagtgcagtggtgcaatctcgctcggctcactgaa
-acctccacctcatctcctgggcttgagcaatcctcccacctcagcctcctgagtagttgg
-gactatagctatgcgccatcaggcccagctaatatttgtattttttgtagagacaaggtt
-ttgtcatgatgcccaggctggtctcaaactcctggactcaagtgatccaccagcctcagc
-ctcccgaagtgctgagattacaggtgtgagccaccatgcccaaccAAGATAAACATTATC
-TTATTTAGAAATAGTATTTCACTTATACCTCTGCAAATGCATATGTATATCACATGTAAG
-CTAACAGGAAGAAAACACACAGCCTACATTTCTCAATTTTTGGTTTGATTCTTCCCTACA
-TTCCTGATTTTGTCCATCCCTTAAATAGAtaaccatctactatgaaaaagtactatccta
-ggccttaggaatataagtgagcaaggcagaACAGGGGTGAGACAAgtatgccattgaaga
-ttttacctatggactaagggtaacagaaattcattgaaaagttttaagcagaaaagtgac
-ccatacatattgtttttaaaatttttactctggctgagtgtgggacaggacttagggaga
-aggctgttaacagtagcacacgtgagagaaatgatgacctaaggtggtggcatgtggaga
-tcagtggactaatatgaggaacaaaatttatggtgtaaaatcaatagctctgagtgaact
-ggaaaatgctgtatgaagtgggaggtgactcttggatttcttgcttgacagactgttggt
-gccattcatggagataagagtgcacaagataggttttggacttaaggttaaaatggcttt
-gaatcattcaaacgaagattctgaataggcagttagatattacaagtctggaactaagag
-tttctcagctttaagtatctaactcttccaacaactctacgaggcaagcattagtttctc
-taatctacaaataagaacagcctaagttcagtagcttgaccaagaatatccaatacagtt
-acagctgggattcaaagacagtgagttggcctccaaggttcaagtcttctcactCCTACA
-GAACACAATCACTTTCTACTGCACATTCACACACACACACACCAGTCTTCAAATCTTAAT
-ttctcaattggaccctaagttctacaaagttaagaaccatgtttaatttacctttttaat
-ttatagtacctagcctaaggcttgcattttgtagcacgttcagtaaacactatttggtga
-tcaaattaatCTTGGTTTATTTTTTAAAAATGAAATGAAAATGAAGTTGCATCCAAAGTA
-TAGGGTGTTCCTAAATACTTCAGGTCATCTGGTACGCAACTAGGAGAACTGGAAAACCAA
-GTCAAAGGTTCTTGAGTAATTGTTCCCTTCCCTCTCTCTCTTTCCCAATACTACAGCTTC
-TATTAAATCACAGGACTACAACTAGGATTTGTCTTTTTCCCCTCGATAATTCAAATTAAG
-AGAATACTGAAGAAACTTGATTTTACCAATTTTTATAGCAGCTTATTTGGAAGATGGAAA
-AAGTGCCTGAGTCCTAGATATTTGGAAGATCAATTCTCCTCTCCACTGTTCATAATACTA
-GTATATCTTAAGGCAATCTAACAAAATGCACTGCCTTTCTTATTAAGTTCCATTTTAAAT
-TGTCTTACTTAGTGCTTACTGTTCTCATGTAATTGCATAAAAGGAGGTGTAACTTTAGTG
-GCTAACCATTTCAGACCACTACATCTACCTTAACACCGTCAGAATGACTTTGAAGACATG
-GCTAGGTCTTGTATGCTCAACGTTTAGCCTAACAGAAGCCAATTAATCAGCTACGAAAAA
-AGTATCATGTCAATGAATTTTTCCCGACTGAAGTAAGATCACATCGAAGCCAACTGCATG
-GGTCTGCATGACCTATTCTTTAATAAAGTATAAGTAAATAAAAAGAAAATGCCATTAAAC
-CATAAGGAAAAATTGTCCATTGCCAAAATCATAAGTTTACTGATATACACTGAATACAGC
-AGAATTAATTTCAATAAAAACTCCTCTTGCCCTTAGCTAGTCCCTCCTTCTAATCTCTTA
-TGTTCAGTTGTTATTTTTCAATTTGGCAACTAAAAAGAAAACTAGAGGCTTAGTAACAGT
-CCAATACCAGAAAACTATACAAACAAGTTTGCTTAGTCATTTCTGCTAATGTATTTTTAT
-TGATGAATTTCCTAGTATCAGAAATGGAAAAGATCATTCTAGAACTTTAAGTCAATTTTT
-GAACTGTAATATAATTAGTTCTTTTTAACCCTAATGTTTATTAGTCTCCATCTTAAAAGG
-AAAAAAAAAATCTCCTTCTCATCCCTAAATGAACCATAGCAAATGAACAAGATCTCATCA
-TCATCCCGACAGGACAAAGATTTCTATAGCAAAGAATGAGGAATGTGCTTAGATTGCACT
-GACTGCATGGTTTAGGACTGCTTGTTTAGAGGAAAAGCAGCTATACAGGAAGACACCTTT
-TATGCACTGCTGCAGAGAATGAACTCTTTTTCCAAGCAATCAGGCAACATAAACTGGTAA
-GAGACAAACAAGACTTGTGGAACTCAGCGAGACCTTAAATATGTATACTTTTCTACCTTG
-CTACAGAAGCAAAGAGAAAAATTCAGTCAAACTTGCCCATTTCCCTTTACAAAAGGGGCA
-CTGATTAGAAGGCCAACTTAATACAAAAAAGCACAAGTAGCTAATGTTACCTGAATTACT
-TATTTCAAATGTCCATACTTAACCTTAATTTCTTTCTTCCTTTCCAATCAAGAGCAGAAT
-GCTCATACATCAAGcatttactgaacgtttactatgtaccaggaaatgtgtgcctgactg
-ccagaaaggcattctttctcttggtcctGGAGAAAGTATCTCTGCCCTCAGACAAAGAAA
-ACAGACCATTACAATCTCAAGTGATCAGTGCTTGAAACAATTAAGTCATGGTGGTGTACA
-GACGTTGAAGGGTATTTAAACTATCACCAACCCAtcattcattcaacaaatatttatgga
-gtacctaAAATGGGGAAAAACTGTAAGAGAAAAAAAAAACTGCACTTAAAGTACGCACAG
-GAATTATTCAGATGGAAAACATTAAAACAAGAAATTGCAAAGCGTAACACTTTAAAGCAA
-GTTAAGAATTTTAAAGACCTATAATTTTGCACCCTAAAATGACCAAAGGCTGGCACATTT
-TGTTATCTTCTATAAGAAACACATCATTGGATGCCACATGCAACGTGGCATCAGGTGTAA
-AAAAGCACCTGATGTGCTTTTTTTGCACATCAGGTCAGCAACCTTTTTATATCTGATTTG
-GAGACTATTAGTTTACTCGACTGTTACCATTTTGTGCTTAAAACAAACAGTATCATTAAT
-TCACAAGCTTTGGAATTCTTTCTCTTTATTTTCTTTTCTCTACTTCCAACACTAATCAGT
-TCCTtgttgcccaagctggagtgcagtggcacaatcgtagctcactgccacttcaaattc
-ctgggctcaagtaatcctcccacctcagcctcccaagtaactgaggctacaggcatgtgt
-caccacacctggcCCACTCATCTTTAAATAAGACAGAGAAGTAATTATAGCCAAAAGGGA
-ATAGAAAATGCAAACCCAGAGATATAAGCAAGCAAGGAAGCCTGGAAAGCCTTTGTTGAT
-CCTGAAAATTAGAATTTTGTTCTCACATAAACCAAAGCCCAGGGCTCTCACAAGACAAAA
-AGTCTAATAGGAGGCCCTCTTCATAAGGTGGGACTTCAGAGGCATACTTCCTAATGGTGA
-GAGTGACTAGGGAGTGGAAGATCCAGGGAGGAATTAAAGCCCTACTGAAGGGAATATCAT
-ATCTTAAGCTTGTTTTAAGGTGGTCTCTGGATTAGTGCCCATGCATACCTGATATAAGCA
-AGCTCTCCATGGAGGAAAGTACCTTACTGTGGGCCTCAAATGATCACTACAAATATCTAt
-ttttatttttattattttttatttttttgagacagagtctcgctctgtcacccaggctgg
-agtacagtggcctgatctcagctcactgcaagctctgcttcctgggttcacgccattctc
-ctgcctcagcctcccgagtagctgggactacaggagtccgccaccacgcccggctaattt
-tttttttttttttttttttaagtaaagacggggtttcaccgtgttagccaggacggtctc
-gatctcctgacctcgtgatccacccgccttggcctcccaaagtgctgggattacaggtgt
-gagccaccgcacccagccAATTATTTATTTTTAAATACAATGTCCTAGCAGATCTCAAAA
-AACAAGAGGAAAAATATAGTGAAATCGTTGGATATACttttttttttttttttttttgcc
-acaaagtcttgttctgccacccaggttagagtgcagtggcacgatctcagttcattgcaa
-cctctgcctcccaggttcaagtgattctcctgcctcagcctccagagtagctgggactac
-aggtgcatgccaccatgcccggctaatttttgtatttttagtagtgagggggttttgcca
-tgttttggccaggctggtcttgaacttctgacctcaagtgacccgcccatcttggcctcc
-caaagtgctgtgattataggcgtaagccaccgtgcccagccAGTTTGATATACTTTTAAT
-TGGTACTAGCAGAAAAGAGAATGGGATAAAGGCAGTAACTGAAGACAGTTGAAAATATCC
-CAGAAGCAATCAGACACAATCAAATTCCAGAAGCAAACAATTTccaaacaagatcaataa
-aaagaaatccaaaaccaaacatataattacaaaatagcaggaaaaaacaaagatgagttg
-ggtgtaatggcacaggcctatagtcccagctatttgggaggctgatacaggaagattgct
-tgtgcccaggagttggaggccagcctgggcaaaacagcaagaccttgtctcaaacaaaaa
-caaaaaactaaagacaagcaagtacagaaaaaggcagattatattcaaagagcaacatta
-gaacagctgatttttcaaaaccaacaatgaagccaagtagtttaatacctgcagtgtgct
-gaaaaaaataaatagccgccaaattaaaattctgttatcaagcaaatgtctctaaagaaa
-aaagaaaaataatcccattttggaaggtctgagttgaaagaaaaaataaagagcaaaaaa
-gaggaaaatttacagacagctccaaacaaacactgattatacaaaagaataacaatacct
-tgaggagctttaaaacatagaatacataacaataaaaacacagtgtattgaggagatttc
-aaagtattctttctaaaggtcttttattatatgaaaagaagataaaattataatatcagg
-ttttgctaagttatagctgcaagtcacaagatgtatgacaactaattacagaataaaaat
-agcatatatttccaaaccagaaagagggaaaagtaaaatcataaaaagaatccaaaagaa
-tgttaagaagggagaagaaaaaaatctagaacataagaagcataggggaagaaagttgaa
-ttggaatatgattaattatattaaatataagtggaataaattatccaggtaaaagacaaa
-gactatcatatcagactggattaaaaaagaaatccaaatgaaccagaataatccaaacaa
-ttctgaaaaataataaagctggaagaattatactaactgatcttaaacttattacaaagc
-tatagttgtcaaaacagtgtattggcaaaaggataatacatagatcaagggaacagaata
-aagagtacagaaatacactcacacaaacaaggccaattaatttttgacaaaggtacaaag
-gcagttcaatggagaaaggacatatatacatatatatataaatatattatgtattttttt
-cgagatagggtctgcctctggtgcccacgctggagtgcaggggcatgatctcaactcact
-gcaacctccgcctcctgggttcaagtgattctcctgcctcagcctccaaagtagctagga
-ccacaggagtgtgtcactatgccctgctaatttttgtatttttagtagagacagggtttc
-accatattgcctaggctggtctcaaatttctgagctcaactgatccacctgccttggcct
-cccaaagtgctgggattacaggcataataatcttttctataaattgttttggaagacttg
-gagatcaatatgcaaaatcataaactttaatctaaatctcacactttatataaagataat
-tcataatgaatcacagatatcaatgtaaaacttgggtcagatgcggtggctcatgactgt
-ataatcccaggctgggtgacaaggcaagactctacctctgggggggaaaaaaaaagatat
-aaatgtaaaattatcaaaccttcttgcaaccaggggttaggcagagtttgaagacatgac
-actaaaagcatgggctgtaaaactgataaactgaacttcatcaacgttaaaatatttctg
-ctctgtgaaagacactattaagaaaataagccagacacaagaagaatgtatttgcaaatc
-acaaatcgaataaagaacttgtatctgtaacattaaaaaactcaataagaaaacagctca
-atttaaaaatgggcaaaagacgtgaacatacacaccacaaaagaagatatacacataagt
-atatgaaaagatacacaacactgccagacagcagggaaaatgaaattaaatcatacaact
-accactacagatttattaaaatggctaaaatttaaaaaaacagaaaacaaaactatacca
-aaagctggtgtggatgcagagtaacagtaactaatacattcctggtaggaatgcaaaatg
-gttttggaaaacagtttggcagtttcttatagagttaaacatgtacttaagcatacaacc
-agcattcccactcctaggtatttactcaagagaaacggaaacccgtatctacacaaaaac
-ttatacacaaacatttaaggcagctttattcataattgtgaaaaaacagaaacaaccaag
-gtgtccaacagttacatgaacaaacaaatggtttgccatgtgatgcttagcaataaaaag
-gaacaaattactgatttgtgcaacaaaatggatgaatcGtttttctttttttggtagaga
-cagggtctcgctttgttgcccaggctggtctcaaacgtctagcctcaagtaatcctttgg
-cttcagtctcccaaagtgctaggattacaggtgtgagctgctacacctgaccaacatggt
-gaatcttaaaagtgaagaagccagaaacaaaagcctacatattgtatacttccatttata
-tcaggggtccccaatccccgggccatgggcctgtaccagttcatggcctgttaggaacca
-ggctacacagcaggaggtgagcagcgggagtcactcgcattactgcccgagctctgcctc
-ctgtcccatcagcaacagcattagattctcataggagaaccctattgtgaactgcacatg
-tgaggaatctaggAGGTGGAGCTCAATTTTTCTCCTTTAAGGAAAGGAAATAAGTAAGCA
-TGGAAAGAGAGCCTAAATTTCTCCCTTTCCATGCTTATTCATTACAAGGGTATTCCTAAG
-TCCAATGGGCTtggaaagggagaaatagcaactctacagtagaaaaacctggcagacttt
-actgaaatatcactagtgttaagtcactttgacatcatatgcccctgatataatgtgatg
-agaagggcacttcacctctgtggtagtcttctcaaaaatccataaccacaatttaatctt
-gagaaaacatcaaacctgtattgaaggacattctataacatacatcaccagtcttcttca
-aaagtttccaagtaatgaaaattaaagacagactaagaagcttcacagactggaggatac
-taaggagacatgatgactaaattaatgtggtatcctggactggctccttgaacagaaaaa
-ggatacaactggtaaaatccaaacaaagcctgtagtttagttaatagtattataccgatg
-ttaatttcttaattattttatttatttatttatttttagagatggggtctcactttgtca
-cccaggctggagtgcaatggtgtgatcctagctctcccagttcacagcagcctcaaactc
-ctgggctcaagcgatcctcctgccccagcctcctaagtagctaggactacaggcacatgc
-caccatgcccacctaacttctgagaaccaggttggtctcaaacgcctggcctcaagcaat
-cctccccaccacggcctccagagttactgggataacaggtgtgagccaccatgactggcc
-cagtttcttagtgttgatgacatatcacggttatggcaagatgtgaacattaggatatac
-tgagggaagcatatatggagattctatctgtaacttctgtaaacctaaaattttcaacat
-tacaagttAAATACTGCCAATATTTAACTTGAAATGCTAAAGAGGATGAGAtgctagaga
-agatgaggaaaaactgaaactcatacattgctagtgtgaacgcaaaatagtactgtatag
-ccattctagaaaacagtttggcaacttctttataaataagttaaatgtacatttttcata
-tgacccagcaatccaactcacagttatttaccctagaaaaatgaaaacttaggtccacaa
-aagcctataatgttatgttcacagcaactgtattcataatcaccaaagaatgaaaaccaa
-aatgtccttcaaggagtgaatggataaaaataactatagtctatccataaatggaatact
-actcagtaataaaaaggaactaaccatttacacacacaataactttgatgaatctcagag
-gcagtatgctgaatgaaataagccagtctcaaaatattacataatgtttgatttcattta
-tatgacattcacgaaaagataaaactgtagtgaggttgggcacggtggctcacgcctgta
-atcccagcactttgggaggccgaagcggatggatcacaaggtcaggagatcgagaccatc
-ctggctaacacggtgaaaccccgtctctactaaaaatataaaaaattagccgggagcggt
-ggtgggcgcctgtagtcccaactactcgggaggctgagcttgcagtgagctgagatcacg
-ccaatgcactccagcctgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaaa
-aaaaactgtagtaactcagaacagaacagtggttgctagagattaggggtgggaggctag
-gtatgttaccaagggtaacatgcagaaggtgatataactattctatgtcccagttgtgat
-ggtagttacttgaatctatgtatgtattaaaattcatagaacagtatacacaaaaaggag
-tcaattttactgtgtattaatttaaaaaaaaATTTAAAAAAAGGAAAAAAATTCTATCAC
-ATGCTGTCTAAAAGAGATACATCTAggccgggtgcagctgctcacgcctgtaatcccagc
-actttgggaggctgaggtgggcagatcacctgaggtcaggagctcaaaaccaccctggcc
-agtacagtgaaacccatctctactaaaaatacaaaaatgagctgggtgtggtggtgcgtg
-cctgtagtcccagctgctcttagaggctgaggcaggggaatcgcttgaaactctcgagag
-gcgaaggttgtagcaagataacgccattgcattccagcctgggagacagagggaggctcc
-ttctcaaaaaaaaaaaaaaaaaaaTTAATAAACAAATAAATAAAAGAGATACATCTaggc
-caggtgtggtggctcacttgaggtcaggagtttgagaccagcctggccaacacagcgaaa
-cctcatctctacttaaaaacaacaacaacaacaaaacacaaaaattagctgggtgtggtg
-gcgggtgcctataatcccagctactcaggaggctgaggctggagaatcgcttgaacctag
-gaggtggaggttgcagtgggcactccagcatgggtgacggagactccatctcaaaaaaaa
-aaaaaaaaaaaaaaGAGATACATCTAAAACATGGGGTATATATTATAtacacgatgtata
-catgcactgaaacatcacaatatatcccataaatatgtacaattatgtatcaattagaaa
-tTAAGAGCTGGGCACAGCTCAGGGGtccctgcactttgggagactgaagaggaaagatgg
-cttgaggctgagttcgtgaccagcctgggcaacacagcaagactaccatctctacagaaa
-aatttaaaagttagctaagtatggtgcatgcacctgtgtcctagctactcagaaggctga
-agtgatcatgtgaacctaggagtttgaggcttcagtgagctatgatcacagtgttgcact
-ccaacctggctgacagacactctgcctcaaaaTCAATCAATCaataaattttaaataaaa
-aaaaaCATAGGCTATAGAGAGTTTGTTCataaaaatacgatatttcaaaacgtgggatac
-aattaaagcaggacttagaaatttataaacttaggccaggtgtggttgctcatgcctgta
-atcccagcactttgggaggctgaggtgagtggattacttgaatctaggagttcgagacca
-gcctgggcaacatggcgagacctcgcctctataaaaataaaaattTTAAAAATCggctgg
-gcgcagtggctcacgcctgtaatcccagcactgtgggaggctgaggcgggcggatcacga
-ggtcagaagatcgagaccaccctggctaacatggtgaaaccccgtctctactaaaaatac
-aaaaattagctgggcatggtggcgggcgcctgtaatcccagctactcaggaggctgaggc
-aagagaatggcgtgaacccgggaggcagagcttgcagtgagccgagatcgtgccactgca
-ctccagcctgggcgacagagcgagactccatctcaaaaaaaaaaaaaaaaagaaaaaaaa
-aaTAATAATAATTAggctgtgcacagtggctaatgcctgtaatcccaacactttgggagg
-ctgaggccaaggtgtgaggattgcttgagctcaggagtttggagaccagcctaggcaaca
-tagtgagaccctgtctctatttttttaacttaaaactattaaaaaaaaaaaaaaaaaaaa
-aaagccaggtgtggtggcatgcacctgtggtccaactattcaggagtctgagatgggagg
-aacacttgagcctaggaggtggaggctgcagtgagctgtgattatgccactgcactctag
-cctgggcgacatagcaaggccctgattcgaaaataaaaaTTCATAAACTTGAACttagaa
-aagcaaactaaaaattaagaacttacacatatctcaataaatttgaaaacagaagcccag
-agaaactagaaggaaaaaaacgggaaaagcagcaatcaaagaaatatgaaacaaagaGGA
-TCCACAATACCAATTGAGTCTTTAAAAATGCTCGTgctgagcccgtggctcatgcctgta
-atcccaacactttgaaaggccaaggcaaaggattgtctgagtccaggagtttgagatcag
-cctgggcaacagagtgcaacccccaatctctacaaaaataatttaaaaattaggccaggc
-atggtggctcatgactgtaatcccaatacttaggaaggctgaagcgggaagactgcttga
-gcccaggagtttgagaccagcctgggcaatacagtgagactccatctcaaaaaaattgtt
-tttaataataaaaacaatggaaaaaattagctgagtcccagctactcaggaggctaaggc
-aggaagatcacttgagcccaggagtttgaggctgcagtgagctatgatcatgtcactgca
-ctctagccagggcgacagagaaagaccctgcctcTGCAGGTGGGGGGGAAGAAATTAAAA
-ATGTAAGTGTGCTTGATTTAAGAAAAAAAAAAAGAAGggccaggtgtgatggctcatacc
-tgtaatcccagcactttgggaggctgaagcaggcggatcacaaggtcaggagctcgagac
-cagtctggccaatatggtgaaaccccatctctactaaaaatataaaaaattagctgggtg
-tggtgccacacgcctgtagtcccagcaggaggataaggcaggagaatcgcttgaacccgg
-gaggcggcagaggttgcagtgagctgagatcatgccactgcactccagcctggcgacagt
-gagactctgtctcaaaaaaagaaagaaagaatgagagagagagagagaaagagagagaga
-cagacagagagagagagagagagagagagagagagagagagagagagaATGAATATTAGG
-GTAAATGTCCAATATCAAGAATGGAAATGAGGGAGTGAGGGATGAATTAGGGTAAATGTc
-cagtatcaagaatggaaatgatacatcactacagatcctacagatggtaaaaagataaga
-caatatcacgaacaactttgtgcccacaaacttgaaattcccagaagaaaaataatttat
-caaaactgatacaagaTCCCAGTCTGATTCTCAGGGAGAAAAAACAAAAACTGACACAAA
-AAATGAAAACCATAAATAGTCCCATAACCAATAAATTCAATCAGTATTGTTTCAACCTGT
-TCTATTCTAATGTCTTTGAACTGCACAGATTAACATTTTCAAAACATTTGTTTAAACTGA
-CTGAACTTGCTTCCCACTCCTCTCCAGGTCTCTGTGCTTTTATACATTGATTATGCCTTC
-CAATAGTGCTTGCTAGGGGAAATCCTACTCACCCTTCAAGAATCAGCAAACTTTACATCC
-ACTATGAAGCACACTATGAAGCATTCCCATCTTTCTCCAAAACAGGCCAAGTACCTCTTC
-TACAGGGCCAAAGCAACCCCATATACTCTCTGACATTGTCACACTGAATGTGTTTTGTTT
-ACATACACCTCTCTCCTCAGATTATGAATTCAAGTACTTGGACTTTGATTTATTTCTCTT
-GGTGGATGCCCCGTgtttcaccacactgcccaggctggtctcaaactcctgacctcaggt
-gatccaactgtttcagcctcccaaagtgctagggttacaggcatgagccactgtgcccgg
-ccTGTGGTTTTTAAAATGCTCCTCAGTCTTACCTATAAATGTTATTGCATCCATCCTTTT
-TAAACCAGGGGAAAAAGGTTTCCTACTATCACTTACCAAAGAGATGTGAAACTAGTCAGT
-ATGGGTGAATGATGTTTCTTGGAGATTTTATGAGGTTCCACGCTGCATGATTTACCATGT
-GATGAGCACACTGCTTGACAAGCCTTGATAGAGCTACAAAAACAGTTCAGTACTCCGTTA
-CTGAAAGGATCTTGGATTTAAAAGACATCATAAGGTTGCAGAAAGAATAAGTACACTAGA
-ACCACTACAACCTACATCTGATGTTGGATATGTTATTTAACCTACCTGATTAAAGTGAGA
-AAACTGCAGAATATAAGGATTATCACCCTTCCCCCACTCCCTTCTTTACTGCCATGGTGG
-CAGGTTACATAGCAGACAACCATCATCTCCGCAGGTGATCAATAACCAACAGCTAATAAG
-GTAGGTTGTCCTAAAACTGACAAAAATAGAATAGGCTGGAAGTAAGGGCAGTAAAAACTG
-GTTGCCTTTCAATTCTGAAGATATTATGTGAATGCCTATGTCAGTCACTGATTCTTGGGA
-TTTATCAtttttgtgtgtgtaacagggtcttgctctgtcacccagggtgggtgactgcag
-ccttgacctcccaggctcaagcaatcctcctccttcagcttccttagtagctgggaccat
-aggcatacactactgtcccctgctaattaaattttttcttttttttctttctttcttttg
-tttttttttctgagatgtcttttgtttttgttctgaggtcttgttatgttacccaggctg
-gtctggaagtcctaagctcaagcaatcctcctaccttggcctcccaacgtgctgggatta
-taggcatgagccaccatgcccagccAGATTTATCACTGTTAAACCAGCAAGTCCATGACC
-TAAGTAATGTCTTTCTCATTTTACAGAAGGCAAAACTGCATAACCTTCCCAATGTCAGAG
-GTAGTGATTGGAAAACATTCGTCTAGATTCACAGCCTATTCTTCTGTTCTACAGCAAGGG
-ACTGTAAACTGGTGACCACAAACACAGCCAACCCCCATACccatggtttcagttacccgc
-agtcaactgcagtctgaaaatattaaatggaaaattccagaaataaataagtcataagtt
-ttattttccatgtttgtttttagagacgaggattcactcagtcacccaggctggagtgca
-gtggtgcaaccgtagctcactgtagcagcctctacctcccatctcagcctcccttgtagc
-tgggaccacgggcatgcaccaccactcctggctattttttttttttttttgtaaagaagg
-tttctcactatgttgcccgggctagtcttgaactcctgggctcaagcaatcctcccgcct
-taccctcccaaagtgctgggattacaggcatgagccattgcacccagccatgttttaaat
-tgtacatggttctgagtaatgtgatgaaatcttgcaccatctagtaccatccagccctgg
-atgtgaatcatccctttgtccagctgtatatgccacctgctcattagtcacttggtagcc
-ttcttggttacttgaatgttgcagtattgcagtgcttgtcttcaagttacccttatttta
-cttaagaaatgccccaaagtgcaagagtagcgatgctgagaatctggaaatgccaatgtg
-aagctgtaaagtgcttcctttaagtaaaaaggtaaaagttcttgacttaatatggaaaaa
-aaaatcatatgtggaaattgctaagatctatggtaagaacaaatcttctatcagtgataa
-tgtgaagagggaaaaataaattcacatttgttttgctgttgtacctcaaactgcaaaagt
-tatgaccgcagtatgtgataaatgcttagttaaaatggaaaaggcattaaatttgtgggt
-agaagacatcaacagaaaactgtgttccaactgatgataatcaggtttggtattatctgt
-ggtttcaggcatccactggggatcttggaatatatttcccacagatggctgggaacagga
-ctactCTGTGTGTATATCTCCTATTTGGCTCACATATTACTTTTAAAAattgagataaaa
-tccatgtaacataaaactcatcattttagggtacaatcagtaccctaaaatggtgtgttt
-tcgtatattcacaatgctgtggaaccatcaccactatctgattccagaacacttcatcgc
-cccaaaaagaaacccagtacctcagaggattaactcccaatagcctcttcctacaatcct
-ctggcaaccaataatctgctttctgtcttcatgtatttgcctattatggacatttcacat
-aaatggaatcatgcaatatgtggcctcttccacttagcaaaatgtctacaagtttatcca
-cgttgttgcaagtatcagtaattcatttccttttacagctgaattcactgtataaataca
-tcacattctggttgtccattcactgacagatatttggactgtctccactttttggctact
-atgaaataatgtcgctaggtgcatatgtgtacaagtttttCACtttttttcctttttttt
-tttttttttagagtcaggaccttgctctgtcacccaggctggagtgcaatggcatgatca
-tagttcacttcactgcagcctcacactcctgagctcaagtgatcctcctacctcagtctt
-ccaagtagctgggactatgggtgtgcgccaccacgcccagttaattttctgcatttttag
-tagagacagggtttcgccatgttgcccaggctggtctcgaactcctggattcaagcgatc
-atcccatcttagccttccaaagtgttgggactacagtatgagccacagtgcccagccTTC
-ACACTGTTTTTAAAAAGTAAATCAGGggccaggcatagtggctcacacctgtaaccccac
-cagtttgggaggctgaggcaggcggattacctgaggtcaggagttcatgacagccttggc
-caacatgatgaaaccccatttgtactaaaaatacaaaattagccaggtgtggtggtgggc
-acctgtaatctcagctacttgggagcctgagacaggagaatcacttgaacctgggaggca
-gaggttacagtgagctgagatcgcgccattgcactccagcctgggtgaaaagagtgaaat
-tccgtctcaaaaaacaaaagaaaaGGTATTAAGGTGAATTATGTATTAAAATTTTTCACA
-ATTAATATTTTTCAAAGTGACAGTTACCAAAATTAAAAAAAAATTTAACTTTCTATTTCT
-TAAAAGAAATAAAGCAGGAGGGAGGGCAGGTAGGTCTGTCTGTCTGGTAACAATGACTCT
-TCATTCCTGCACTGACAAAAACCTGCTGGATATGCTAAGCTGTGACTGTCCAACAACTGG
-CTCTTTTAACAGACACCCAATGGAGATACCACACGTAAACCTGGACAACTCTTCATTTAC
-CTTATTGACTCGACTCCTGAAGGCATTTGAGCAATCAATCCCTGGTTTATACTAAATATA
-TAAATTTACAAATAATAAGATGGGGGAACTCTTATTTAGACTACACAAATTTTGGAACTG
-AAAATGCAGCTCAACAATGAGATCAGTGGCCATGAACTCTCTGGTAAATGTATATAAAGC
-AGCATGTACATGTACATTTTTTTTTGAAGAAAAAAATTATTACAGGCTCAGGAAATCTGT
-AAACTCCAGCAAAATTAATAATTCCTGAGTTAGACAAACAGAAACTCATCTAAGAAGGCT
-AACTTGGTGATTTACATAAATATTAAAAAATTAAACTGCTCAAACTAAGTATATGCCATT
-CTTTCCTGAAGGAAGACAAGAAGACAATGTATCCTAGGCTTCAGAGTATGAGACCCAAGC
-TTGATGAATGATTAACAAAATGTCAGCCTCAGAAAAGATACAGTAGCATTCAGAGTTAGT
-CAGGTAGAGATAACAGTTTTACAAAAGGGAACTTTACTTCTGCCTCACATTACTGCTTAG
-AAAATAAGAACTTGAATTTCTTCACTACTGTCCAACCTTAAATTGTTCACAGTCTTGTAT
-TTTAAAGCATATCCTTTGAATCATGTGTCCAAAGAGAATTACTTGTGGGTCAGAGAGGTA
-CCTTAAAATGGCTTTAAAAACTTAAAACCAAGATTATTTTCAGATTGTTTACCCCCTTGA
-ATCTTAAAACTGTTCAGATATCCAATTACTGAGCTTTCTAAATTAGTGCTCCCAGTTTTT
-CTAAACTTTTAACtttttttttttttgagatggagtctcgctctgtcgccaggcctggag
-tgcagtggcacgctctcggcttactgcaacctccgcctcctgggttcaagcgattccccc
-gcctcagcctcctgagtatctggactacaggcaagcgccaccatgcccggctaatttttt
-tttttttttttttttgtattttagtagagacagggtttcaccatgttggccaggatggtc
-ttgaactcctgatcttgtgatctgcccgcctcggcctcccaaagtgctgggattacaggt
-gtgagccactgctcccagtcTTTTTTACAGTCAAGACAGAAAATAATATTTGTATGGCAC
-AATGGGGTAAATGATCAAGACTGCTCTGGATCTGAGGTCATTAGTTTGGATGCTGTATCC
-AAACTATATTCTGCATGAATGGCCAGAGGTGTGAGGGGACCAGTATCTCAACACATCTGT
-AACGCACCCTAACACAATACACTGGTTGAGAAATTCTAGTTTAAATAACTTGTGGAGATC
-ACGACCTGAATAGTCAAAATCCATGCAGCAGGTTGAGAAAACTATTTCACAATTCCTCTT
-ATTTCAAGAGATACGCAATCACCTTTTGCAGCTTTCAAGTATAGACCAGATGTACTAACA
-GGCAACCATTTCGTCTGGAAGATCATCTATTTGGAGGTCACTGACACAAAAAAACAAAAA
-CAACAAAGACAAAACAAGCCTCCTTACCCTAGCTCAGAAGGATAAGCCAAAAGAAAACAG
-GTTAACGGTAAAAATGTATGATTAAATGAAGTTATTGTTTTTTTTCCTCCACTTCATATT
-GATTCTCTTTTCCCATGTCAATTTAAGGTGGTAACCATGGCCAACAACATTCTCTCTCAC
-CTATCATACTAATGCCATATAAGTAGTAGTGTTTTTGTTTTTTCAAGTGGGGAAATATAT
-ACAGCTCAAAAAAACAAAAAAATATCTAGCAACTAACTCCTTGGCAGTTCCCTTGACTCT
-CTGACCTTTAAGTCCCAAGGTTCTAAGTATACAATGAATAAGAAAACTACCTGTTCAAAC
-CCAACAGAATATGTTTTTTTCTGGTTTGATTAAGGCTTCGAATTTGGAACATAAATACTC
-TCAGTAATACTTAGTAATTCATGAAGTTACTGCTTGTGTAAACTTGCAGAATATTTAACT
-TTAGGAGATTATAAATCCTAACATGCCCCTAGGGGCCTTCTGCTTTTATTCCTACATACA
-AAACATACAACATGTTTGTTTTTAAAAACAATGCACATAGgccaggtgtggtggcacaca
-cctgtagtcccagctacttgggaggctgaggcagaagcatcacttgaacccaggaggcag
-aggttgcaatgagccgagatcatgtcactgcactccagcctgggtgacagagcgagacgc
-tgtctcaaaataaaTACATACATACATACAAAAAAATTAAACCAATACACGGAAGTATTA
-CTTCCATAAAACAAACCAGGAAGTACAGTAAAACAGAAAACATTAGCATTTGGGCCTTTT
-GTGTGAATTACATTTCTCCACCTTCAACCCAGAAAAGGGATCTGAGTGTCAATGTGACAT
-AAATGACATAGCAACAGTGTGAGGTCTCCCAATGAAGGGAGGTATTAGAAGAAAATCCAA
-GCAGTTTGATTTGGATTAATAGTTCTACCCCAAACACCTAAGAGAAATCGGAATTCCAGT
-ACTGTCTCTTACAATATAGTCATCATCTATACACCTTTTTACCACGCCATATAAGCAAAA
-TAAAGTCACAATGTGAAACTTTACTCCACTGGCTATTACCCTCTGGAACCAAAAGATGGA
-AAACTTCATTTGGGATATACAGTAATCTAAAGAAAAATTCAGCACTTATGAATGTAATAA
-CTACTGTTACCATTTGAATGCCTCTTACAAACCAGGCACAGTATCAGATGCAtattctga
-ttttagaaataaacagattcagaggttaaataatctgccaaaaacaacaggattactaag
-tggtggaagccagatctgtttaggatccaaagcctaaataggttcttttcactAAATTTA
-ATACTATTTCCTTAGTTCTCCAAACTGATTTATTAACAGCCTATCCAAAACACTATAATA
-AAATGAACTGCTTTAAATTTGGAGGCAAGGTAGGGGTGGGATACTGAGTTTCAATAATCA
-GGTTTCTTCATTATTCTTTTACCTGAATGGGCTGGCCACCAGGCCACAATTGTATAAAAA
-TCAGATTTTAAATGATGGAAAAGCTTTTCTGTGTGGCTACTGAAGGGAGAAAGGAAGACA
-ACTGAGACATGCCCCACCTTGCTGGCTGGGGGCTGGTGACATCTGTGGGCCTCAGTGTTG
-GACTCCAGATGCAACAAAGCCTAAAGTTTTGAATATGTATGAAGGTCAATGTGATGTTTT
-CCAAAAACAGTCATAAAAGATGGCTGTGAAAAACCCCCTAGTATAACAACTGTATGTAAC
-AAGAGCATATAGGTAGCTGCAGATGAATGCTCAGGTCCTTAGCTGTGGTGTTTAAAAATT
-CTTCAGACCAggctgggtgcagtggctcacacctgcaatcccagcactttgggaggccga
-gatgggtggattgcctgagctcaggtgttagagaccagcctgggaaacacagtgaaaccc
-catctctactaaaatacaaaaaaaaaaaaaagccaggcgtggcagcgtgcgcctgtagtc
-ccagctacttgggaggctgaggcaggagaattgcttgaacccgggaggtggaggttgcag
-tgagccaaggtcgtgccactgcactccagcctggcaacagagtgagatgctatctcccaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTTTCTTCGGACCAgtgtggtggctcatgag
-tgtaatctcagcactttgggaggctgagttaagaggactgcttgagcccaggagtttgag
-accagcctgggcaacatggtgagaccttgtctctacaaaaaaAATTaacaactacccaca
-aagaaaaccctagctcaagatggcttcactggAAGGAAAAATGAACTGGTCAGGAAGACA
-GACAAATAGAAGCAAATAATGAAAGCATTTTATTTGACATTGATAACCTTCTCACAATAA
-ATTATGTGGCAAAATACATGCTTGAATACTTAATTGCTAGGCAATAGTCTATTTTCATTT
-TTTCACAAAAGGTAGACAACTCCAAAGCAGATGGCCATTTGTAGCCATTCTATATAATCA
-TAAATACACAAAACACTggccgggcgcggtggctcacgcctgtaaccccagcactttggg
-aggctgaggcgggtggatcacctgaggtcaggagtttgaggccagcgtggccaacatggc
-gacaccccgcctctactaaaaatacaaaaattagcccggtggggtggcatgcacctgtaa
-tcccagttacttaggaggctgagagaggagaatcacttgaacccaggaggcagagattgc
-gccactgcactccagcttgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaa
-aaGTTTTAAAGTGCCGATAAATACAAGTTCCTGGTCTGCCTACAGTTTATCACTTAATAA
-TACAAAGCAAACAAGAAAGCAAGTTAGTGGATTACCTGAGAGAGCAAGACATAGAGAAGA
-TGTTAATGCAGGGAGCTGGCCTTCTCCAAACATATCCCTAACACACAATATTCAAGCAAT
-TCCCAAACTGTGATCAGAGAACCACTGGGAGTAAGACCTCTGATCTATATTTACAAGTCT
-ATAGGTGAGCAAAGGTAGACCTTTTCCTGAGTCTGAGATGGGAATATTACCTTCTCTATC
-TAGAAGCAAAAGAATCCTAGACTCACCAGGACTAGGTAATAGACACTGTACACGAGTAAT
-TGAGGTAATCTACACTGGGCGTGACTTACATACTGATCCACCCCTAGGCAGCAATTCATA
-CCTCACCCACCCAACAGGCTACATTAGAAACAAGGAAGTACAGGTCAAAAGTCTCATTAA
-AAAAATAAGAACTCTTGGCAGCAGAAAATGAAAATAAAGAATGAAGAATGACAGCACTGG
-CAATAAACACATTCTTTTCTCCGAAAGGGAAGGGAAAGAACTAATGTTGGGCACCCACAT
-GCCAGACATTTTATCAATTTTCTCCTTTAATCCTCAATAATCCTGAGATAATACTAGCTA
-GTACTCTAGTTAttaatcctcacaaaaatcctgaggtaggtactactaattcccatgtta
-caggtgaagaaaccaaaagttagtaagttgcccaaggtAGttgttatccgaactgtagag
-acaagaactcccagacttgaagaggttaagtaaacttccccaaactcaAAGTGGGAGTTC
-TTTCCCACTAACCTATTGCCTTCCCCTCCCTACCCGCAATCTCAATTAATTCTCTATTCT
-ACCCCCTTCTCATTTCTGCAGCTGTTTCAAAAACTACACCTAAGATACAAAGCAAATAGG
-AGTTATTATAAGAAAACACCTCCAAAATCTACTAAGTTGTGGTATGATATGCCTGTTATC
-AGAAAACGTCACTCAATTTTGAGCTTGGAGGGCAGTGACAGTTTGGAGATCTTtagcaca
-acgcctgccagaaacgtggcaggcgctcaggatctgctgaatgaaCAACATCTTCTGAGT
-GGTTATGAATTCAATAACCCAAAATGACCATCTCGTATTTCTGGATATGACATGATACCA
-TTTTTTGGAAAATAATTTACCCATTCATTTTAAACAGGGTAGCTTTCTTAAAATTTATAG
-AACATTGATGAGATAGCTAAACTGAGAAATGCCCATTAAAGCATTAGTCATAACTTCAGG
-AAAATTTCAAATGTTCACTTTTCCAAGCAAATTAAAATGTTTCAGCTAATAAAAACCTGT
-CAGAAAAACCCACAAGACAAGAAAGTATAAAAAGAAAAGAGCAGCCAATATAAGGGCATT
-TAAGATGTCACACATAAAAAATTATAAAACATTAATCTAACTTGTACCTTGGTATTTAAC
-CCTAAAACTGTCACCTCAGATAACACAATATTTTCTATGCAAGAAAACATTATCACCACG
-AATGTAAAGAAGCTTGCCGACCATAGCAACTGTTGCTACGTAGGGTTTTTTAATGTCTAA
-GACTGAAAGACAGAATTTGTAGAAACCAGTTAAAATGCCACTCTTAGCAGTATCTTGTGA
-TACTGTGAATGCTTTCACCTTAAACTTTTTAAAAGACTCAATCTTTGACTTCTACATGTG
-AAAAAAAAAAAGTACATCTGGGAGCACTCAACGTAAGAAAACTACCAATTGTCTATAACC
-CAATGAAAATACATCCTTTGTTACAATGACAGCAGCTACTTTTCCTTAATAATCCTAGAG
-GAATTTCTTCATTTGAAAAGCTGGCTGGCCTAGATTTCTCTATAAACTAAATGACATGCT
-ACTTTCGAAATTATCCATTTCAGAAGTTCAAAGAAATTCAGGTATAAGAACACATTAATA
-CTCTCATGAAACAAACCTTATCCAGGTTACCCACGAATTGTGACAGATCAAAACCCAGTT
-TCTCATTTCAAATCAAGTATCACATTATTTATTACCTTAAAATACTAAGCCCTTACCTAA
-TTCAATGGCAAATCATATTGGTTTTCAGTTTCTGAACTTGTACAAATCATACTGTAATAT
-TTATGCAAAAGTTGTCATATAGTTGAATATTATAGACAGTTAACATCttttttttttttt
-tttgagacggagtcttgctctgtcccccaggctggagtgcagtggcgtgatcttgactca
-ctgcaaccaacctccgtctcccaggttcaagtgattctcagcctcctgagtagctgggac
-cacaggcacgcacctccacactcagctaattttagtagagatggggttttaccatgttgg
-ccaggctggtcttgtcctgacctcaagtcatctgcccacctcggcctctcaaagaactgg
-gattacaggtgtgagccaccatgcccggccAACAGTAGAAAAGGGTACTCAGGGAACATA
-GTTCAAAAGTCATGATTCTCTATTGGCTGGACCAGGATTCTAGACTAGCTCTAGGGCTGA
-GATATCTTAGTAGACCAGTTAACATTCATGTGGCCCAATTTCCCTTACTCTAAACCCAAA
-GTCAAACATAACCTCTAAAGTCTTTCATACCCTGAAATGCTAATCTTGTAATCATCTTTC
-TATTCAGGTAATAACTCAAAAGAAATGGTCTCACTTCCTTCATCCTCTGACTAAAGTTTA
-GTTAGTCCATATTTTATGAATCCAATTAATAGGATACTTTAAAGAACAAAAAGAAAAGAC
-TTTTCTTAAAAGCTAGAAACTCCATTCTGTAGTGATGATTCCCAGATCTGACTCTTAAAC
-TCAACAACCTCAACAGACAATGACAGGGAGAAAAGATCTTACAAGTTTGAGCTGAGCTGG
-GGTGGGGTGGGAGGTGTGAGAGAACAGAGAGACAGTTACAAATTCACAAAAATGTATCAC
-CCATTTCCATCTCCTCTAAAAAAATATGAAATAAGCCTTAAAAGGCTGTCATAGAAACCC
-ATTATTAAGCCAATAAAAACTAATGAAGAAATTATGTCATTTATCCAAGATATGGAAGAA
-CCACCTATTTACAGAAATCCTACCAATGTCCTAGACCTTCAGAAACTACATCTCACTAAG
-CTGACCATCAAGCCCCTTCAAACTGCATCTAAGGACAATAATAATATTCAAACATCAAGA
-AACAGGCACAGGTTCCACTCAACACCATTATTCCGTGGAGTCTTCCAGGACTAAATTGTT
-TTATAGAATCTTTGCTATCTTTGTTCTCTAGAAAATGATATCCCAAAGACTCTAAAATAA
-AACCAGCAAAACCCCtgtatttgttttccattgtgtcataacaaattatcacaaacaaaa
-caacacaaatggattatcttacagaagtcagtgggcttgactgggtctcacaagggctaa
-atgagggtatccagtgggtgggttccctgctggaaactctggggaaaatttgcttccaca
-ttcattcaagctattggctgaatttagttccttgcagctgtaggactgagttcccacttc
-cttgctggttgtcagctgggactggcctttcctactagaggctgcctgcattccccgtct
-cacactttcaatctggtcccctccagtaacggcaggctgagtccttctcatgcttcaaat
-ttgacttccccttctgcctcatctctgacaccagccagaaaaagttctctgcttttaagt
-gcttatgtgagtagaataaacccacccagaaaatccaagataatctacctaagatcctta
-actttaattaaatctacttaacatattcatgttccagggtttatagtatggaaatcgtag
-gggagccattctgcttaccgcagtctgccttctggtttccaaggattcatctctctctca
-aatgcaaaatacatccatcccatcccaaggtcccaaaggtttcccatctaaagcttatca
-tttcagaagtcccaaatctcattcatctattcaggtgtggatgaggttctggggacaaaa
-cagtaagtccaattcctggggcacaattcctaaagaaacaagttctctactcccaacata
-ccactgtgagacatgtagagaataacagttagacattccagttcaaatgggcaaaatgta
-aaagaaaacagagcctccggtccaaagcagtttcaaaatctagggaatctccattccatt
-tcaaagcctgggaaaaatcctctccagcttttagctccacccctctgggctctcctatct
-ccgtctgagtcaccctgattcttttatgaaaagcaacacattcacatgtgagtagtttta
-tcagcctgcttcctatcagtagaatttggggggtccaacagccctattactttctgtctc
-tttcaatccaaactagaactgtttatgttggcataaaattctcaagaacctaatgggctg
-tggaagtattccacatgggtccactccattaaagttcacattcacaaataaaccaggctg
-cacatttaatactttgcttggaaatctcagctaaatatacaagttcatcacttgcaaatt
-tggctttccatataaccataggatacaattctgctaaacttagttgctactatgtaacaa
-ggatcccctttctgccagtttccaataagaaagacctcacttctgtctgggccctcacta
-gcagagtcattaacatccatattgctactaaaagtatgtccTAGGCCttttcttttttga
-cagggtctcactctgccacccaggctggagtgcagtggtgccattaccgctcactgcagc
-cttgacttcctgggctcaagcgatcctcctgTGTtccaggccttttctatcatgcccctc
-aaaacaattctaacctttatctactgccactttcatttttaggtaatagtaccccactcc
-tggtaccaaaatctatactagtgttctactgctgccataacaaattaccacaaatgtagt
-agctaaaaataacacaaatttgttatctcacagttattgtaggtcagaagttgggtgggc
-ttggctagctaggtcttttgcttagggtctcacgaggccaaaaatcaaggtgtctcaagg
-ttgcattccttggtggaaactgggaaattcacttccaagctcaatcaggttgttgaccaa
-attcaggttccttctggttgcacaactgaggtccccatttctttctggttgtcagccagg
-gactggtctttgccactagaggctgcccacattccttctgataaactttccatgtggtcc
-tctctagcaaaggcaaatggagtccttctcatgcttcaaatctctgatttccttttctgc
-ccatttctctgatcccagttggagaaagttctctgcttttaaggacttaagtgactagat
-tcggcccacccagaaaatccaggataatttttctattttaagattcttaaccttaattac
-acctgccaagttccttttgccatgtaacacaggatagctacagattctggggatcaaggt
-atggcaccttgggaagagggagatgtaattctgcctactacaAATCCAAGTCCTATGGAA
-GGGTTTAAACTCACTTCCTAAAGAAAATCATCCCTTTCTTTAACAGAGTGTGAAGTAAAG
-ATGTATATATTTTACTTATGTGAAGTAAAGTATATATACATACATACATATGTCTTTACT
-TATGTGACACAAAGATGTATGTTCAGAGATAGAGACAATAGTAAAAACAAGGACTCACTC
-TGGATGAGTGAGTAGGAAAAGGACGCGCAGTATGGAAAAGGAGTTGCCACCTGTTTCATC
-CTCAAATTGCAAGGCACTTCACCCATAACTACTTAGAAACTAACCCATGCTCCTCCTTAA
-ATGTGTATTTCTCTTCTCTGTATTCCACAAAGGAGTACATAACTAGGCTTTTTTTTATTT
-TTAAAGAAAAGTCACCTCACGGGGACCTAACTGTATAATCAGTTGATTAATCAATCTAAG
-CAAATTTCCAATCTTGCATTCTTTCTTCAAGTCATACACCCTCCCGCAATAGCAAACCAA
-AGCCAAGTATTTCAAAGTCACAGAAGGACAAAAACATGCCCTGCTAAGACTGCAGGTGAA
-CTTTTGAGAATACCACGGAGGAGAACTAGTATTGGTACTGGACTTTCAGCCCCAGGTCCA
-CCAAGCCAGTAAAGCCAAATGACTTACAACAAAACCCTACAACAACTACAAAGATACTAC
-TCTAAAGCCCTGTCTACAGTCAAATTCTTGACTATAAATTTTACTTAGAACAGAAGAGCC
-CCAAATATACCAGCTAGTCCCTTTACAGTGACAGGTAAAAGCTACTTACTAcacttacta
-cctgccagacactgtagtaagcacttgacacaaattgtcttatttactcttctccgtaaa
-ctcacaagctagaaaataccatcatcccccttttacagacgggaaaactgaggcttagag
-agtttaggtcacacagctaagtagcaatggccctgatatttgagaacctaggcagtctgg
-tttttaaccactgggcctacactgCACTCCTCAGATGGAATGAAGTCTCCAATTCTTGGA
-AAAATCTTCCCTTCTTAGttttcttttttctttttgaggcggagtctcgctctgtcgccc
-aggctggagtgcagtggcggatctcagctcactgccacctccgcctcccaggttcaagcg
-attctcctgccttagcctcccgagtagctgggattacaggcgcgcgccaccaagcccggc
-tgatatttgcatttttagtacagacggggtttcaccgtgttggtcaggctggtctcgaac
-tcctgacctcgtgatccacccgcctcggcctcccagagtgctgggattacaggcgtgagc
-cacacgcccggccTCTCTTCTTAGTTTTCATTTCCTCTCCCCATGTCCCATTCTCGTAGA
-ATTAAACAGCTGAAAAGTAATCAAGTCTTCCCAAATAATTTGCCACCTTCTTTTCAAAAC
-TCTTTCCTCCACACAAAGCAATAGCCAAGATGCAACTTCTCCTGACCCTGACTCTGCTTC
-CCCAAAACAAACTACAGAAGCTCCACCCATCACCTGCTTAATCTAGCAATGTTCCAACAC
-TGCAAAAAACACACAACGAAAAACAAAATTGAAAAGTCCTACTCTTTCAAAAGGTCACCA
-ACATATGTATACCCTTAGCCAAGCTTTCTCTCCATACCTCTTTTTCTATCCAGGCTCCTA
-ACTAGTCCTTAACTCCAACTCCAGACGTTCTGCCCCACGTCTTGGTCCCTTCCCCCTTTC
-GCCCCAGCAACCCCGCCTGGGGTTCTCTCCACCTCGCACCCACTCTGCAGGTGGGAAGCT
-CAGCCCCGCCCAGAGGGACCCTAAGAAGGCCCCTACTCCAGCTGCCCAGTTTCGCGGGAG
-GGTTCACTGCACACTACCCAGCAGGCACCACTCCCTCCGCACCCTCCCCCAGCACCCCCC
-TGCGGCCCCACCCCTCAAGTTCCCTTCCCCCTCTGACGACCCCCTCCTCCAAGTTGTCCC
-CTAGTCCCCACCCAGTTCAGTCCTCTCCTCTGCAATAAGCTGGACTCCGGCAGCCGGTTC
-CCACCCTCACATCGGCCTCTGCCCCCAAACCTCGCCCTCCGCCCTGAGGGGTGGCCCCTG
-GGCCTCCCCGATGGGCTGCAGGGGCCTCGCTTGGTTTATGTGTGAAGGTGGGGGCAGGGG
-AAGGCGACGGGCCGCTCAGGAGTCTGCTGGAAGCGTGAGGGTCGGCCGCGCTCCGCTGCC
-CTATCCTGGGCCCACCCCACCCGCCAACGACCTCGCCTGGCTGCTCCCTAGGTACCTGTG
-GTGGAAGCGGCAGCGGCGGCGGCCGCTCTCCCCTCTGCTCACACAGACAATATGGCGGCG
-ATGGAGGAGGAGACACACGGCTCGGCCGCCAGCCGCAGGGACCAGAGCGAGGCTGCAGCC
-GCTGCTGCCGGAAGCGGAAACCCCCTCCTACCAGGAGGCGGGGCGAGACAGCTTCCGACT
-CCGCCCCCAGAGGAATCTCTCTGAATGCGGCCATGCTGGGATGTCCTATTGTAACCTTAG
-GGATTCAGTTCTGGCCTAGGGTGCAAAATGGAAGGAATCCCCAACGCAAAGCAGAATAAG
-GAGACTTGCAATAGTTAAGCGCATTTTATTTCAATAGTGTTAACAAGTGACAACAGAGAG
-AACACGAACCTCCCATTAGGTGAACAGTTGGTTTGACCCAAGTTAAGATGGCGGTACCCA
-GGTTTCCCACACTTCACCCAGCTGGCCCCCCTTTCTTGAAAAGAACCATGCGCGACCTGC
-AGAGCTGTAGAGCCAAGCATTCTGGGAGCTGAAGTCTCTTTTGCTCTGACCCCTCGTTTT
-AAATTAGGGTTTCAGCAACACTTTCTATTCAAACTTGGAGTTCGGAAGAAGTGAATGAAA
-GTTGGACCCTAGGAAGGGCATGGCGCAGGAGTCTGAGAAGTGAGGATACTAGCTCTCAAG
-AGACCAAGGCCCAATTCCTTCCTCCTACAGGAGTCCTGCCAAGAGCTGTGCGTCCAAAAT
-ACAGTGTTTTTTTTTCCTtctatctgcctcccacccctgctctccttgcccgagctacct
-ccccaaaacagccacaaagcactttctaccatgcagagctcatcatggtctccctatggt
-caaaaatctcccatggacctctttatgcaccaaagatagcccaaactcttcacttgacat
-tcagagtcctccataatttggccaaaccctcctttccagcctcctattctgccactctct
-tctcaaattccggaagattccacccacaagactgcaaacaattcctggaacttagctgtg
-ttgcctccctccctttacactggcagttacttctCTTACTGTCACCTCATGGACTGGATA
-ATTTCTGTATGCCGATTGAACTAAttcagggatcctttcctctaggggtctcctctctgt
-ttaactccctccaacccagacactatcagtcagtaacctgaggacctcagtctgtctcct
-ccatcagactgggagcccccagtggacagggctccatctgATGATCAACCTCTCCTTTGC
-AGGCCCTGATAAAAGCTGAAGCGTCTAAGAGTTGCTGAAAGGAGTTCAAGTATTAGTCTC
-ACCTCTGGTGGGACAGAGGTGTGAGCACTGGAACGAGGGTGAGGAGGCCAGGTTCTTTCA
-GTACCAACCATTATCCCTAACTGTCTCAGAATAGCTGGTTGTCTCAGGAATGGGCCTCTC
-CACCCTCCACAGCCCTGCCTTCACAGTTTGTCAGCTGACTAGCACCTCTGCTCCCAAAGA
-GGCACCTCTTCCCCATGTGGGGTTAGGGCTGGTGGTGGCTGCAGACTTATAGTGATGGCC
-TCAGGGAGGTGGCTGTGGCCTTCTCTGGACCTCATCTGCTAGACAGCTTGTGACATCTGA
-TCCCAATTGCCTGGGAACCCACAACAGTTTTTCTCTCAGTGTCCTGTAActgggcctcaa
-tttccccacttgtggactgaggaggttatacaagataatcccaaagtttctGGGAAGCCA
-TCTTCCAGGAAATGATACCCTTCTACCTACCTCTCGAACGTATCTTTTTGGCTCTTGTGG
-CTTTGTTTTTCCCAACTGTATTCAcatttgtttaactcacaacaattcatcatttgctat
-gagccagacactgtgctaggtactggggatgtgttatgaggaagacatacaccagttgct
-cactggtggagcttaccttctaaagtgagaagcaagtaatgcacaggtaaacaaatgcat
-aaacaaagtaatttcaggtagcaataagtgctacgaaaggaaaagataagtagctgtgaa
-gtatagagctttagcttgagtggttcagaaggtccctttgagaaggaaacagtaagtgca
-aacgtcccaaggcaggaaagagcatcacaagtttgaagaaggaggccatggtggctgaag
-cactgcaaataaagggaagaagaggaagaaatatggtgggagaggtgggcagggcattca
-ggtcatgataaggaagctgggttttcatctgagtgtagtgaggaTATTTCCCATTGCTTA
-GCCTTCATGCCTTTCCAATCTCAGCCTCTCTCACAGCATTAGTTCTTCATTCTTCTTCCT
-AGTTCTGGCCTCTATCCATGACTTCATTCAGAGGGCTCACCTGGGCACACATATACAACC
-CTCATACTCATGCAGGACATAATTGAAACCCAACTCCTGCCGTCTACTACGCCAGCCTCA
-TGTAGGTCTCCGGTCTCAAGAGGCTTCCCATCCCAAGTGTTCACCTAGTTGTAGACTTAA
-CATTTATCCTTAACTCTTACTGTCTCTGATCCCCCACATCACACCTCTCAGGCTAGTCTT
-TCTGCAAACAACAGCAGCAGAAGCAAGAGTTAAGATGTTGAGAGTACTTgcactgtgcca
-cacactgaatgttcatcatctcacttaatcctcatgtcaacctgatgaggtagaaaccaa
-aagtatctcaccgtacagatgaggagactcaggttcacagagatcacaggccatgcccaa
-ggtcacatgccggagatggagcttgcatttcaacctgggccATTAGAGTGActctctctc
-tctctctctcttttgagacaggatcttgctctgttgtccaggctggagtgcagtggcatg
-atcacagctcattataaccttgaactcctgtgcttaagcgatcctcccaccttagcctcc
-tgagtagctaggactacagacatgcaccaccatgcctggctcatttttaatttagtagta
-ttattattactattattattattgtacagatggggtcttgctatgttgccagggctggtc
-ttgaactcctaggctcaagcagttcccctgccttggcctcccaaagtgctagaattacag
-gcAAAAGTTTTAATCATGCACTAAGAACCTAAGtgtatttgctttctattgctgcttaac
-aaaatcaccccacaatatagtggcttaaaacaacaatattttatgtttgtgtggattggc
-agtttggacatgtctcagccaggacagctcttttctgctccaagtggtctttcctggctt
-actcttacgtttgctgtcagtgaacaggccagcaaactggttagaactccatggcctcat
-tcacatgtctggcagttggttggggttgttggcttgagtgccttggttctcctccatgtt
-gcttcttcagtaagctaactcaggcttacttacatgacggcccccagaagaaagaaaaca
-aaagcagcaagatctcttcagatctaggcttagaaatgatatagcatcattttcactgta
-ttatatcgatcaaaggcagtcatatggccagctcagattcaaggagagtagaaatagatt
-ccatctcttcatgagaaaaacatcaaatcatactgcaaggagtcatgtgtataaggaggg
-tggaattgttgtggccacctttgcaaacattatatcacaTAAGTAATCGTAGGCATggaa
-ctggttaaagaaattatggtacagccagacatggggctattcacagcaatgagaactaac
-atttttgagcacttaatatgtgtcagacactgtacaagatgctttacatctattaactca
-tttaatcctcacaacagctctctgtggccagtacatttttaatccccattttagagatta
-agaacaccaagtctcagagaggttaaacaactagtccaatgtcacacagcaagtgacaaa
-gccATTGAAAAGAATGAAGACAGTATTATGTCCTGACATAGAAATCTGGCCCTGACATTC
-TGTTATACGATACAAAGCAAGAGACAAACAGTAGTTTGATCAGAAAACATTTAAAAAGCA
-CATTTAAATAATTAGGAGATGTGTGTCttttttttttctgagatggagtttcactcttgt
-tgcccagggtggagtccaatgatgccatcttggctcactgcaacctccgccttctgggtt
-caagcgattctcctgcctcaacctcccgagtagctgggattacaggtgcccaccatgccc
-agctaatttttgtatttttagtagagatgggatttcaccatgttggccaggctggtcttg
-aactcctgacctcaggtgattgcctgtcttggcctcccaaagtcctgggattacaggcat
-gagccactgcgttcagctGGAGATGTATGTCTTATAAAAATTAGTAGAATAAAAATTTTT
-ATGTCTTATAAAAATTAGTAggccgggcgcggtggctgatgcctgtaatcccagcacttt
-gggaggccaaggcgggtggatcacaaggtcaggagatcgagaccaccctggctaacacgg
-tgaaaacttgtctctactaaaaatacaaaaattagccgggcatggtggtgggtgcctgta
-gtcccagctactcaggaggctgaggcaggagaatggcgtgaacccgggaggcagagcttg
-cagtgagctgagattgcaccactgcactccagcctgggcaacagagcgcgactctgtctc
-aaaaaaaataaataaatacaataaaTTAGTAGATCTATATGTCTTATAGTTTTAGATAAA
-TTCAGGAAGAATTTACTACAAACTATTAATGGAGCTTATCTTTGAAGAGGAGAAAAGGAG
-AAAACTTTTATTTAAACACCTCTGTTTGTGTTGCTTGAATAttttttttttttttttttt
-ttttttgagacagattcttgctctgttgcccaggctgaagtgcagtggcaatggtcacag
-cttgctgcagcctcaacctccagggctcaagtagtccttgcacctcagtctcccaagtag
-ttgagaccacaagtgtgtgccatcatgcctggctaatttatttttatgttttgtagagat
-agggtctccccatgctggccatgctggtcacaaactcctgggttcaagtgatcctcccgc
-cttggcctcgcaaagtgctggaattacaggcACAAAGCCTGGCCTTCTTTGAATTTTTTT
-ATAGCAATCATAAATTTTTATTTCAATACCTTATAAAGAAGAAAATGCTTTTAAAATGTC
-CTTCAACTTGGCTCCCACCTATGTCtttttctatttggttttatttttattgttttttgt
-tttcttttttgATACCACCCCAGCCCAACCCCTTATCAATTCTGACCCGAAGTTTTGTGG
-CTACCTTGAGGGCCCCTCCTCTCTCCCTCTGTAGTTCATCCTGCCTGCTGCTGGGGGAAA
-GCTCATTAACCATCATGTTCCATTTTTGTCTAAGAGTTTTCAATGGTATTGCATTGTCTA
-CACAGAAAGTCCAAACCCTTTGGCCTTGTACATTGGGTGTTTGTAAGTTTGACTCCAact
-tggttggattccagctctgtcacttactagcagcatatagttggataagttattagatct
-ctctgagcctcaatttccacatctttttttaaaaaaatgaaagAAAAgaccaggtgtggt
-ggctcatgcctgtaattccagcactttgggaggctgaggtgggtggatcacctgaggtca
-ggagtttgagaccagcctggccaacacagagaaaccctgtctctagtaaaaatacaaaaa
-ttagccgggcatggtggcacatggctgtaatcccagctactcgggaggctgaggcaggga
-gaattgcttgaacctggaaagtggaggttgcagtgagccgagattgtgccactgcactcc
-agctgagtgacagagcaaaactctgtctcaaaggaaagaaagaaagaaataaagaaagaa
-agaaagaaagaaagaaagaaaaaggaagagagagagagaaagaaaaagagaaaagaaaga
-aaAGGATATAGCATTACATATTTTGTGGCAAATTAGATTACTGTTCAGTGACTGTTCACT
-TTCTCACCCAGCCAGGGGCAATTAAtattttcctgccccattaatattaggcttggccat
-atggtttgctttggctagtggaatatacatatcagttacaatgtgcaaattccagcctag
-gccttaagaggtctCTCTTGTTTTCAATTGGCTGTCTTAGAATTTTCACCTCTTCCTTGA
-AGGGCGAGCTGTCATTGGTGCCTTACATCTTTTGAAACAGACTTCCAATCAAGGCTGTAG
-TAGGCAAGTCTGAGATAAGAATAGTTCTTTACTCTTTAGTTTTAGTTTGCattaattaaa
-ttataatttataGTTTTTCGTGAACTCCATATTTTTGAATGAGCGGAAGCTAAAGAGGTG
-GGAAGAGAATGCTCTGTCTCAATTTGGGAAAGCAGTAGCTTCTGTCCAATCCTCCAGCAT
-CAAACAGGCTAGTCCTAGAAGAATAAAGGACACACATAGTAGATCTGAAATTGAGTCAAC
-CCCAGCAGAACCCAGCCAAGATCAGCCAAACCCAAATGACTACATATGAGAGAGGGAGAA
-ATCAATGTTTGCTTCTGTCAGCACAGAGTCTTGGGGCAGTTTGATATGCAACATTATTat
-aggaatagccaactaacagattcacatcatagggcttttttcagggttaaataaatgaat
-acaggaaacgccttaaaaatacactggcatatagcaagggtgtaatgcatgagaactact
-attATtgggggtgcaactgtgaacaaaacaagcccctgttctcaaggatcttatgttctg
-cggagagatgtatggaatggcagctggtgatgagtgttatggaagaaaataaagcaggga
-aggagagggagtgctgaggtaaaatttcaaatgtgatcatcaacaaaacttcaacggaag
-gtgaaacttgaccaaatccaagaggaagtgaggcggggagccagaaagtatgtgggagaa
-gattgtcccaagcagagagaattcggatgggcaaagaccgtgaagtaggctcatgcctgg
-tgaatttcaggaatggtcagtagatagggcagctgagccgagggagtgGCTGATCTCGTC
-TCGGCTCTGCTGGGGTTGACTCAAATTCAGGTCTACTGCATGTGTCTTTTGTTCTTCTGG
-GACCAGCCTGTTTGATGCAGGAGGTTTGGACAGAAGggggacaatgtctcagaggttcac
-aaggtactggattgtgcacagccatgtagggctatcgtgaggacttgcttctgctctgaa
-tgaggtggggagctatgggagggttttgaccaggtggagagcaggctctgctatgcattt
-ttataggatttgtccagctgctaagtgtggactagatggaccgggaatgagggctgaagc
-agggagaaaagataagaagctactaccacaagccagacaagagatggtgttgctttgaac
-caaagttggactccgaggttcttttcaaagtaaaatcaaaagaatttactgataggtgtg
-gtatggggtgtttgaggaaaaaaagaattgaggatgactccaaggcttctggcctgagga
-actgaaagaaggaatttgccagtaactgagatgaagaaggctatagaagagaacttcttg
-gggcagggggagaaagagaggaggaattagcagttccatttgcgacttgttaaatttaag
-tgagctatgagacttccaagtgcagatgactaatcagaagttagatgtatgaatctgagc
-ccaggagagaggtccaagctggagacgtaatttttgggagttactatgtactaaattttg
-tcctccccaaatttatatattgaaaccctaacacccaatgtgacactatttggagacagg
-gtctttaaaggaggttaaaagagatcatagagtgggccctaattcaacaggactattgtc
-cttacaggaagatgagatatcagagctcattctctccccatgcaggtgctcagaggaaat
-gctgtgtgaggacacagcaagaaggcagccatttacaagccaggcagagagccttcacca
-gaaaccctccctgacagcaccttgatctcagatttccagcctctcagtgagaggctgaac
-tgtgagaaaataaatttctgttgtttaatcctctcagtctgtggcattttgttatggtag
-tttgagcagactactactgagtcatcaacagagaaatggtttttaaagccatgaggggcc
-aggcatggtggctcacacctgtaatcccagcactttgggaggctgaggtaggcagatcac
-ttgaagtcaggagtctgagaccagcctggccaacatggtaaaaccccgtctctattaaaa
-atacaaaaattagctgggtgtggcggtgtgtgcctgtaatcccagctacccaggaggctg
-aggcaggagaattgcttgaacccgggaggcggaggttgcagtgagctgagatcgagccac
-tgcactccagcctgggcgacaaggaagaaactgtctcaaaaataaataaataagtaaata
-gccataaggctgggtgaaattgcccagggaatgagtgtagacagagaaggaggaccaagg
-actgcgccctggggcatccaacagtaagagacaagcaaccagcaaaggagcctgagaagg
-agcagccagtggggtaagtgtcctggggaccaagtgaaaaacgtgtttcatggaaggagt
-gttgatcccctgatcccctgtgtcagatgctgctgaggggtcagaaaagaaaagaacaaa
-gagctgatttacaaagtggaggacattgttttgacaggagagagtgtaggtaggttggtg
-ggaacaaaagtctgattggagtgggattaagagagaataggagaaaatataaatatagac
-aTagaaaggaaggaaaaaaggaaggaaggaaggaaggagggCTCtttttttttttttctt
-tttgagatgggttctcactctgtcgcccaggttggagtgcagtggtgtgatctcagctca
-ctgcaacctccgcctcccaggttcaagcgattctcctgcctcagcctcccgagtagctgg
-gattacaggtgcgtgccaccacgtctggctaatttttgtatttttagtagagatggggtt
-ttgccatgttggccaggctagtctcaaactcctgacatcaggtgatctgcctgcctcagc
-ctcccaaagtgctgggattagaggtgtgagccaccacacctggccTggagagctcttttt
-aagagtagaaagctgggccaggcgcagtggctcatgcctgtaatcccagcactttgggag
-gccgaggcaggcggatcacctgagatcaggagtttgagaccagccgggccaacatggtga
-aacccagtctctactaaaaatacaaaaagttagccaggtgtggtggtgcatgcctgtaat
-cccagctcctcaggagactgagctaggacaattgcttgaacctgggaggtggaggttgca
-gtgagctgagatagtgccattgcactccagcccgggcaatgagagtgaaactctgtctca
-aaaaaaaaaaaaaaaaaaagtaggaagcaaatgactaaatgtagaagaataggagttggc
-aaccaccataggagacaatcattaatggacactgcagtagtggattaaagtttgatgaga
-aatagggcatttgcacagtctgagaatatctccccccaagatacttattaattacaaagg
-gtaaaatagtaactttacatggagaaacacagccaacaccacttgaccaagtgataaagt
-gaacatcaccagtagcagggcaaattgacatcatgtggcttccgggatgatgcactgagt
-gggacgtcgcgtcacgtcagtgatatttctgccaaagaggcataattgactcatgaggaa
-gcattagaaaagcccaaagtggccaggcacagtgactcacacctgtaatcccagcacttt
-gggaggctgaggtgggcagatcacgaggtcaggagttcgagacaagcctgaccaacatgg
-tgaaaccctgtttctactaaaaatacaaaaattagctgggcatggtggcgtgcgcctgta
-gtcccaactactcaggaggctgaggcaagaaaatcgcttgaacccaggaggcagaggttg
-cagtgagccgagattgcaccactgcactctagcctgggcaacagagcaagactccgtcta
-aaaaaaaaaaaatgtccaaagtgaggatatctttgcaagagaaccttactctttaaaaat
-gttgaagtggtaaaagacaaaggaagactgaggaatagttttagatgaaggagaataaag
-taattacaactactgaatgcaatgtgagatcctagattaagaaaaaatcattttcactta
-ctacaaaatatattaactagatgagtggtgaaatttgaataagatctgtagattagataa
-tggttttgcatcagtgtaaaacgtcccgattttggttattataagagaatgtccttcctt
-ttaggaaatgtgtactggtttttaggcctgtaacttaccataaaagagttcagggttgga
-ggaaagaaaaataaatgataaagcaaagatggtaaaatctgggtaatgggtatttggcta
-ttctgtttttgtttttgagacagggtctcactctgttacccaggctggagtgcagtggtg
-tgatcatagctcactgcagcctcaacctcccaggctcaagcaatgctcccacctcaacct
-cctgagtagctgggaccacagttgcgcaccaccacacctgactcatttttaaatattttt
-tagagatggggtctccctgtgttgcccaggctggtctcaaattctaggctcaagcaatcc
-tcccatctcagccttccaaaatgctgagattttaggtgttagccattgtggctggtgaga
-tttgagtgttctttgtactactttgtaacttttctgtaagtgacattatgtcaaaataaa
-TTCTAACaagagagaatagaaggaaaggaagtagagacatggaggcagtgagtccaggta
-actttttgaggagttttgctatagaactgaggacaggtggcaggtggagagcaaaatggg
-gtcaagataagttgttcaaaggcagaaattgtagcatgtttttatgctgatgagagagat
-tcagtagattggaaaaaaaagtaataatgcagacagagagagagaagagagtggctagaa
-tggtgtctctggagagaaggatgggatctagtatacaaatgggggctttgaccttggagc
-acagatggctcatccatggtcacagaagggagggcagagtatttgggtaccagattggta
-ggtaggtagctgtgcagtggaaatgtgtggaaatgctttctgattgctaccattttccct
-gtgaaataggaagcaaggtccttggctaagagtgagaatgggggagaaggtgatggaggt
-ttgaaaagataggaaggaagtgtgtagggaaaatgaatggatctactgtgattgtcaggc
-agaacaaaagacaccactgaagctatcatcattcaagtaaagtgaggccagtctacatgg
-tggtgtgtttttctccagccacattccactgcagggggacaaacacagagggatgtggag
-ttggcaccaactaacaggtgtttagtcagagagggtcagggggatcttgggagtatgcag
-cacagtggggataaagttatatcatggctgtaatccacaaagaaggaagtgaggacaagg
-aaacaccaaggttcagagaggtttagtgacttacccaagcttgcacagctagtgaataat
-gagttggtctctgcatccaggcagtgtggctcaaagcttattctctcaccaacccagtat
-acacaggctgtccccagggtgtagcatagcatttggcacatgtagCCTCTGCTAACAAGT
-GAATTAAATTGTACCTGGGGTTCTCTCTGCCTTTCATTCTATGCCTCCGAAGAATACTaa
-ataaaataaaataaaacaacaacaacataaaaACCTAGCTTCTTCCTTGCCTTCAAGCTG
-TCTTTGATGTCTTAGTGTGCACGATGAAGGAGATGTACCATCAGTCTCCTTTGGGTGGCC
-ATTGGTTCATGCCTGCAGTCTGGCTttcagcaggtcattctcagcacatactctggggca
-gacactttctcaggttctcagtacacagcgggaaacaagtcagtattcctggcctggtgg
-agctcagtcaagtggggagaagataagcagacaaatctagcattgcaaactgggattatc
-gccaggagagacaagtgggcggggtatgagagtgcatgagagtaaagccgacctagtgga
-gggcgggaagaagagtttacccaaggaaggtcaggaggggtggcccatggggctgactga
-agaggagaaacagcatgggcaaaggtcctaagataggaacatgcctgttaatggcatatc
-aaggaggccaatgtggtccagacgtatatggagagggtggagggtgggagggaacatagt
-gggaaatgagatgggagaggttggcaggatccactacaccctgtagaggaatctgattta
-agaacaatagggtttaagcaggggaatgatttcgtaaggttttacatttatcagccaggt
-gcggtggctcacgcctgtagtcccagcactttggaaggctgagatgggcggattgcttga
-gctcaggagttcaacatggggaaaccccatctgtaaaaaaatatacaaaaattaggctgg
-gcgtggtggctcatgcctgtaatcccagcactttgggaggctgaggagggcagattatga
-ggtcaggagatggagaccatcctggctagtagtgaaacccctggctagatggtgaaaccc
-catctctactaaaaatacagaaaaattagccgggcgtggtggcaggcgcctgtagtccca
-gctactcgggaggctgaggcaggagaatggtgtgaactgggagatggaacttgaagtgag
-ctgagatcatgccactgcactccagcctgggtgacagagcgagactccgtctcaaaaaaa
-aaaaaatatatatatatatatataaaatacaaaaattagcagggcgtggcatcatgcacc
-tgtattcccagctacttgggggctgaggcaggaggattgcatgaacccaaggagttgagg
-ctgcagtgagccgagatcaccccactgtgctctagcctcaatgacaaagtgagatcctgt
-ctcaacaacaacaaaaaaaattttttttatttataaaagacctctttggctgctgggcca
-ggagcagggaggacaggaggcaggggtaggagtggaggtgtgggaggagaggaagcagga
-gaggagtggaggtgtgggggcaggggaggcagtgggtgggccaggagagaggtgatgtgg
-catgggctaagatggaagcagtgcagataaagagaggtggattgacttgggacatatttt
-ggagctggagttcacCACAGGGAAACTGAGGCCCAGTGCTTCCAAGGATAGCGCTCCAGC
-TCTCCCAGCCCAATGGAAGCTTTTAGATACTTCTGCACTGTGGGGGTCACTTGTGGGTGG
-TTGCATTGGGGGACGAGTGGCCAGGACAGGTGACCTCTGACTTTTGTCTGGTGATGCGTG
-AGTCTCAGATTGGGCTTTGAAGGAGCCATGGGTACCTTGCTGGGCAGGTGGAGCATGTCC
-TTAGAGGATCATCCCACCATCCTCACgtaaccctgcaggtctcttctctctgagtcatag
-ttctcacacttgtaacatgaagagggacagtacccacttAGGCGACATCACCCCCTTCTT
-ACAGATGAGACAACTAggccaggtacagtagctcatgcctgtaatcccagcactgtggga
-ggctgaggcaggcagatcgcttgagcccacacatttgagaccagcctgggcaacatggca
-aaactctgaatctacagaaaatacaaagattagctgtgtgtggtggcatgcgcctgtagt
-cccagctacttgggagactgaggtaggaggatcacttgagcccaggaggtggaggttaca
-gtgagctgagatccaccactatactccagcctgggagacagattgagactttgtctcaaa
-aaacaaaaacaaaaacaaaaCCACCACCACCACCACAACAAAAAAACCCAAAAGAAAaca
-gatgagacaactgagcctcagtgaagggaagtggctctttagggtcatacaggagtaaag
-acacagccaagactagcacccaggctagagcctgggctgttgacctttctgcttcatcat
-ttgccTCCCATACCTTTCCTGGGCTCGTCAGTCCTGGGGATGCTCAACTCACCCAACACT
-GTGTTTCAAGCCCAGGGAATCCAGGATCGGTtagttcagtggttaggggtatgggctgct
-tggattctatttccagcgccaccaaggggccttattctgtctgaaccttggttttctcct
-ctgcaaaatggggctaacagtgcatacccttgtagcactgttacaaggtaggggaactgt
-acagatgtaaTGATTTGTGTATGTGAGTCATTTACAAGCCTTTGGAGTGGCTGGCACCCA
-TCATTGTTTGCTGTTGCTGTGATTATCATGCCATTGGACTgtggcttgaaaccctacagg
-cccaaggctccctttaatagtagttataatgcttcttttctaaaataaaatacatgaata
-acataacctgctgacgcacataattttttttttttgagaccgagtctcactctgtcatcc
-aggctggagtgcagcggcacaatctcggctcactgcaacctccgcctcctgggttcaagt
-gattatcctgcctcagcctcccgaataggtaagattacaggcgcatgccaccatgcccag
-ctaatttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcgat
-ctcttgacctcgtgatccttccgccttggcctcccaaagtgctgggattacaggagtgag
-ccaccgcgcccggccatgcatagttttaaacataaataatgtcctagttgtaatttaaaa
-gaaaataaagtgaaaataatttagaataaattaatatgtaaatgttccaggacaatgtgt
-agaaaccatcacaaagtagttgggtgggctctgctctgggtggaatcattgagaatctgc
-aggctgaattggtaacgccgcactggcggcacatgcactgtgactgcatggctgtgatag
-tctgaaatgtgagcagtctaggtaaagttctgaaccaaacacaatccattctgttcccaa
-tcgctacagactaaatgtttgtctcccccaaaatcttacgtcaaagcctaatccccagcg
-tgatggtattaggagatggggccttttggaggtgattaggttatgagtgcagagccctca
-tgagtgggattagtgcccttataaaagaggccccagagagctctgctgccccttctacca
-tgtgaggacacggtgagaagccatctatgaaccaggaagcggtcttcaccagacatggaa
-tctgccagctcctggatgttggacttgccaggcttcggatctgtaagaaataaatttctg
-ttgcttataagccaccagtctgtgtaatttgttacagtggcctgaactgactaagacacc
-aatttatgtgaaggttgctttcctggcagagtcgctgttattaaaaccaagcaaaCACac
-attgtactggaaaaggcaaaactatagagacaatgaaaagatcagtggttgccagggctc
-aggggaggggagagagggatgcacaggtggagcacagggcatttttagggcaggggacct
-cttctgtatgatgctgtaatggtagataaaggatgtatgtacttgtcaaaacccagcatg
-ggccgggcgcggtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcgga
-ttgcctgagctcaggagtttgcaaccagcctggcgctacagaaatcctgcttcaaatcca
-gaaaccccgtctctactaaaaaacacagaaaattagctgcgcgtggcggcatgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaatttcttgaacccgggaggtggagggt
-gcagtgagccgagatcgtgccactgcactccagcctgggtgacagagcgagactctgtct
-caaaaacaaaaaacaagcaaacaaaaaaacaaaaaaaaacaaaaaatccccagcatggta
-gaactgtgcaacacaaagagtgaactgtaaggtaactgtggatttcagttaataattgtg
-tgtcaaaattggtttatcaattgtaacagatgcaccatgcatttgcactaatgcaaaatg
-ttaataacaggagaaactgcatgtttggagaaggagtacaagggaactgtctatgatttc
-tgtgtcatttttctttttcttttctgagagagggtcttgctctgtcccccaggctaaagt
-acagtggcacgattagagtccactgcagcctcaaactcctaggttcaagcaatcctttag
-cctcagcctcccaagtagctaggaccacacacatgtgccaccatgctagggaaattaaaa
-aaaaaaattgtggagacaggttcttgctatcttgctcaggctggtctcaaactcttggcc
-tcaagcaatctccccatctcggcctcccaaagcactgggattacaggcgtgagccagtgt
-gcccagtctctgcacagttttgctctaagtctaaaacttctctaaaaaagtagtctatta
-aACATAAAAAACAAAATGAAAACCCCCacacattgtgtttatatgtaaaatagaattcgg
-tccttggctcagataattaaaaacaaggtttttacctacactaattaccaaagggagatt
-tgaaaatcatgACTTGAGATGCACTGCAGGATGTCTGCACCCTTGCTCCCCTCCTGCATG
-GCCGGGGCACCCCCTGGTCACTGGGAACTCTCCAACACTCTTGGTGACATTGCCCCCTTG
-AGGATCTCTGCACTGGATCTTTGCTCCCTCTCCTGCAGAACCCACAACTGCTGACTTACT
-GATCTTGGGTGATGTCTGATTAAAAAGTCTCCCCAGGCTTAGGAAACTCAAGGTGCCACT
-GTGGACACAGCTCCCACATTTCAGCTTccagaaatcctgcttcaaatccagatcccagca
-ctccctcattatgtggacttgaatgagtcacatcaatttattgagcttcagtttccccat
-tgatgggaaaaagggtgattgataatacctgccatactttatattcataatgaatataat
-gagtatattcattaactcagtaaatatatattgaacacctactgtctgtgctgagaattc
-aacagcgagcagaacaaacatctctgccttattggagcttatggtctcgtgatggggaca
-gacaaaaatcaaacaaatatatgagataatgtcagtgataaataaaaataaggcagagtc
-acagatggaaagagggtagggcaagggatccttggtaagtgtcgtcctggatggcttccc
-agaggagatggcatttgaacagggctgggaatgaagtgaaggaacgtgccacgaaagtct
-cagggcgaagaggcaacagcaaacaccaaaaccctgaggtgggaatgtgcttggtgaatt
-cgagaaacagcaaggaggccagtgaggccggtggggagtaagagggaagagaaagtgagg
-acagagagatctggagaagccagactctgtaAGGAATTGGGGGTTTATCCCAAGTGCAGC
-AGGGAGAAAACTTGAAGAGTTATTTACTGGGGAAGGCTTCCTGTGTTGTGTGCCCTTGCA
-GGTGAGAAAAGGTGATGAGCCCACTCTAAAGCCAACTCTATGGCCCATGACCGTGGTCTG
-GGACACTTTGAGCAGAAAGCGTCCTGTTCTCCTTGGAGTCAAAGGATTGGTGACAGTGTC
-TGCCATGCTGTAGTTTCCACAAAATACCACCAGGTGACGACTCTGGGTCACGCTTCTAAC
-TTGTGGGTTCTTGATTcctggagggcttttgctaaaacacagactgctcctggccccagc
-cttccaaagcgctggattacaggtgtgagccaccacacctggccTGACAGCCATGTTTTT
-AGCTTTTAAAAGCAAAACTTTGGCATTAGCACTATctctgtgagaggggccgatcattcc
-tgttttccagatgggtctatgaggctcagagaggagaaatcattgtctccatgagcaaaa
-gtgataaaactggcactcggcccccatgtctgcctgacttcaaggcccccaatccttcAG
-GGATGCCACACccatgtgcccagtgaggctctgggaattttaaaaactcatccaatttaa
-tccttacaactgaacaaatcccatgcaacgttaatgtctccattttagagatgagaaaac
-tgaggactagaactgagaaataagtcacctgatgtcgctgagctGTTCTAAGGCTGACAT
-catgcattttggagtcagagagacctgaatctcaactctagctcacactctccctagcta
-tgttcacctgatttctctgagccacagtttaagatgggaataagagcccctcctgcttgg
-tagctgtTGGTAATATTTATGAACAAATCTAGGCCTGGGGCCTCTTAGGCTTACAGTGGC
-ACCAGCCTCTTCTGTTCTGGAATCAGGAGGGAAAGTGATTGACCCGGCATTGGCCATCCC
-TGGCCTGGCTGGGATCAGAAGGGTCCTGGAAGGATAGGCAGTACCCGGCAAAGACTGGGG
-AGGGAGCTTGCTTAGCAGAGGTGTGAGGGACCTCACAGGAGTCCCCACAGGGTGTCCAGG
-TAGGCATAGGTATGGACGGCTGGACAGGGACTCCAGTTGGCCAACCAAGAACAGGGATAG
-AGCTTGGGCTTTGGGGTCAGGCAGCTTGAAGctctgggttccagctcccagatctgtaaa
-gtggaacagtaatgactcttccctgttttggattattgagaggaCCCCGGGGAACAGTGG
-GCTCAGCTGGAGGGATGACATTCTAAAGTGTTCTCTGGGACCTTAACCCCAGTCTCACAG
-GAGATGGGCCTTTGACTGTGGCCTTTCTGAAACCTGAGAATGTTAATGGTCACATAACGT
-TAGTAACAGTGATGGCAGATAACATCTGTCATGGATTAGAGGCCACTGGGAGGTTCTCCC
-TCACAGTTCTGGGTTCTTTGGATCAGAAACATGGCACAAACACACAGCCAAGGGTGGTTT
-AGGGCCTTGCAACTTACAAAGTCCTTCCATAGCATTGCACTGCACCCTGTGTTAAGATAA
-ATTCTCCAAGCTTTaagcactctgctaagtgcttgacaggccttattttattcttccaaa
-acactttgaagtgggtgttgccttgacccccattcttcagctgaggaaatgggaggcata
-gtgaggtcaagtgacttgcctaaggctactcagctggaacgtagagcgcctcatcccatg
-cttgactctgaGTAGAGCAAGGGTTGCACAGCAAGTCAGAGGCTGAGAGGGCCTTGGAAG
-GACCCGAGGCTCCCCTAGCCACTCCTGCCTGGCACCGATTCCTCCAATCCCACCTGGAAG
-TGGCTGGAAGTGAGAGGGAGAGGCGGTAGGGGTGCTGAGCCTGAAGGGAGGTTTCAGGAC
-TCAGGCTAGGAAGGCAGAGAAGGAGAGGAGGGACGGAAGTGCCCCTTCCCCCTAGAGCCA
-CTGAGGGGAGAGATAAAGGCATGAGGAGATGTAGCTGGGGCCAAGACAAGGAGGAAGAGA
-AGAGCTCAGGAGCTAGAAGGAACAACTATCTGGGGAGGAAGCCCCGTTCCAAGAGAGAAG
-GCCAGGGATGGGAAGGGGTGGGCCAGGCCCTTGGGCTGGGGTCCTGGGTCCCAGTTTTAG
-CAGGTAGCAAGACCCCGAACTGGATAGAGGGTTGCCTTCAGTAGATACCCTATCATTCCT
-GTGTTATGAGAGGTTGGGGCCACTTGAGGTGAGCCCAGGATTCAGCCTTCGAGGCTCAAC
-ACACTTGAGTCCAGCTGAATGACAGAATGAGCCATAGGACACTGTCCCAGGCCTGACttc
-cttccttcaacaaatatctatggaggattcaccaagggccaggctgggctcccagcagga
-aacaaagtccctctgaagagagactaacaccttcgttaaggagcccccaatctcatagga
-gagatggacaaaaagcagaaaatgaattggtatccagtatcacttttggctgtaaaggtg
-atcaggggaaaatgaatggattggagtctacctattttgtgatggcggtcagggagggcc
-cctctgagaaggtgtcatctgcacagaggcctgaaggagatgaggcagtagctatgaatc
-tgggggaagagcatttcaggcaagcgcaaaggccagggcaaaggccttgaggcaagaaga
-tgctgctgtggaggaaggagggcaccaagcaaggaggccagtgtggctgctggtgagaga
-taagagagtgaaggaagatgagggtagagtccggggggcagatcacatagggcctcaaag
-gccactctatggattttagctgcatctcatgtgacatggacattgaaggaTTTTTATGTG
-TGTGTGTTTGTTTGTTTGTTTGTTTttgagagggattctcgctctgtcacccaggctgga
-gtgcagtggcacatctcggctcactgcaacctccacctcccacattcaagcgattctctt
-gcctcagcctcccaagtagctgggattacaggtgtgtaccaccacgcttggctaattttt
-gtatttttagtagagacagggtttcaccatgttggccaagctggtcttgaactcctgacc
-tcaactgatccacctgcctcggcctcccaaagtgctgggactacaggtgtaggccactgt
-ggcctgtgacattggaaggttttgagcagaggtatgtgttgtgacctgactcaggtttta
-ccagaatccccctgagagatgttctggccaccactgaagaagactggagggtagagcagg
-caagggctgatgcagggagcccagtgaggaggctGGTCAATGAGCACAGCAGTTTGGCCA
-ACGATCTGGGGTGCTAAATATCAACAGAAACAAAaatatttattgcatgctttctgtggg
-tcacaaactattctaagtggttgcttgacatggaatgcttttaatcttcagtacagattt
-taggtagatcatatttttgtACATTTATGTCTATTTGTCTCTGGACTGATTtttttttaa
-ttgagatgaaattcacataatataaatcaaccatttgaaagtatacatctcagcggcatt
-tagtatattcacgacattgtacagccacacttctgtctagttccaaaatattttcaacac
-cccccccaaagaaactttgtacccatcaaagatagatgatatttttatcctaattttaca
-gatgaacaagcagaggcgtggacaagcagagtcacgtgccccaggtcacacagccaggaa
-atggaacaagctggCCACAGGTGTTGGGAGGAACATGTTGACAAGCTGCCCAGGATGGCC
-TGGAGGCCCCTTCGGGGTCCCCCAGGTAATAGCACCAAACTGCCttttatttttatttat
-ttattttgagacagaattttgttcttgtcacccaggttggagtgcaatagtgcaatcttg
-gctcactgcaacctccgcctcccgggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgtgccaccatgcctggctaattttttgtatttagtaaagacag
-ggtttcatcacgttggtcaggctggtctcgaactcctgacctcaggtaatccaccgcctc
-tgcctgccaaagtgctgggattacaggcgtgaaccatcatgtccagccCAAATTGCCTTT
-TAAGAAGGGCATGTCagccgggcgcggtggcttacacctgtaatcccagcattttgggag
-gctgaggcgggcggatcacctgacgtggtgagtttgagaccagcctgaacaacatggaga
-aacccgtctctactgaaaatacaagattagccgggcatggtggtttatgcctgtaatccc
-agctacttgggaggctgaggcaagagaatcacttgaacctgggaggtggaggaggttgcg
-gtgagccgagatcacgccattgcactccagtctgggcaacaagagtgaaacaatgtctca
-aaaaaaataaaaataaaaataaaaataaaaataaaaaAAAGAAGGACATGTCCTCACTTC
-TGGGCTTTTGTTTTGTGGAAGGGGTGGGATACATTTGAGGCCAGAAAACAGAAAGCACTG
-GGAAGGCTGAACAGTGGCCCCTGCACCCTCTCTcaggatggtgcacagaggagaatgggg
-actctggagccaggctgttgagttcaattcccttctcccacctttcttccatgttgtgaa
-gttgggataataagagcaccaatctcatcagtgttgggggaaagtgaatttcccatcagt
-agagctcagcactgcccgtagtatttgctcaatcaaCAGCAGCCTGCATTCTCTTTGCTG
-CCCTCTCCACTCCAGGAAATAAGTTAAGCAGGTACCTAAATGCAATCTCAGTGTTGGGCC
-TCGTAAAACATCTGGGACAAGACATCCTCCATTACCAGAAAAAATGCAGTCATAAAAATC
-TCAAGGTTGACAGGATAGTGCCCAtttttatttatttattattattattattattttgag
-agaaagcctcactctgtggcccaggctggaatgcagtggcacgatcttggctcactgcaa
-cctccacctcccaggttcaagcgattctcctggctcagcctcccgagtagctgggattac
-aggcacctgccaccacgcctggctaatttttgtatttttaggagagacagggtttcacta
-tgttggccaggctggtctcgagctcctgacctctagtgatctgcccgcctcggccaccca
-aagtgctgggattatagatgtgagccaccgcacccggccCTGATACCCATTTTTAAAAAT
-CACATACAATCAAAATTCAGGATATAATTTACATAAAAACAAAAGCACTCATTTTGTCCA
-TCCCTTGCTTTGGGTTTATCTACCGGTCTTGTTGACTCCATTGCTAATATACATCCAGGT
-CCCATCCCATCTTCCCAACCTTTCCCAGTCTTTCATCCTTCAGCTGCACCTCTATGGCAA
-GGAGCCACCTCATGAACATCAGTTTCAGACTTGACAGCTGATGGCCGGGGGTGCAcatgg
-gcttgtggagacacggtcagggagccctgggtctacacctgagtctgcctgggccgctgt
-ccgttgtgtaatcttcatcaggccacatcctctctctgagtctcagttttcttttcctta
-aattggagatgaaaaagtctgtctcacttggcagtcaagaaggtccaacaggataaCTTC
-ATCCATGGTGAGAGAGTGGAGGAGAGGCCCCCAGGAGGAGGCAGGGATCTCATTCTGCGG
-GTACTGTACTTGGTTCTGGGAGTGGGATGGCAGACAAGCGTGTCACTGTCTTTGTTCTCA
-GAGCTTTGGTTGTGGAACGGGAATGGGAAGGTAAGGGAGGGTACCCCTGGCAGGGGCACA
-GCATAAACCAGGGTGTGGAGATGGGATGGCGAGGCAGGACTGCCCCAGAACTCTGTCCCC
-AGGGGCTGGCAGTGCTGAGAGGGACAGAGGGAGAAGCGATTGTTTATTCTCAGCCTCAGG
-AGGACGCAGGAGAATCTCAGGCATCAAATTTAGTGCAGCACACCTGCCTAGGCAAAACTG
-GACAGCTCCACCTCAACTTTGTAGAGGGGCAGAGAAAGCTGTGGGGAACCACCTTCCTGC
-TCTTGTCATGAAGTCCTCCTCAACTGGAAGCCCAAGCTTCAGGCCAGGAACTTCCCCAGC
-AGAGGCAGCCTTCCCCAGGGGGCCAAGACCTTGGCAGAATGTCTGGGGTGCTCATGGCAG
-CGCCTCTCACCTGGCCCCTGCCAAATCAGTTTCTGCTTGGCCTCTGCAGGATCTGACCTC
-GTTGAGTCCCCAGGGCCCAGTTCTCTGCCTCTGAGGCTAAAAGTGAGATCGTTTCCTGGT
-TGAGGAGTGACTAAAAGACTTCTGTGTgtagagactgggttttgctgtgttggccaggct
-ggtctcgaactcctgaccccaagtgattcaccTTAAGGTGAATGTGTGGCTGTGTACGCG
-CACGTGCAGAGCAGAACCATCACTCTGCTTGGGCTAGGCAGCTGGACTAATCGTCCATTT
-CCCCCCGCCCGGAGGCCTCTTCCAGGCCCCCAGCTGCCCTGATGGGCCAGGTCAGCCCCC
-CCCACAGGAGCCCCCAGCCGCTCCCCATTCGGCTTTCCTTGTATTGTGCGCTGCCTGGTT
-TCTCGAGGAAATGGGGCGGCTGCTGGGTGCGGGGGCGGCCGCCAGCAGCCCCACCCCCTT
-CCCCCCATTGTCACTCCTGGCTTCTGCCCCTAGCCCCTGCTGCTGACACTAAAAATAGAC
-CTGTTCACAGGGAGACGGCCCCACCCCTGAGCGGGGCCCCAGGCTCAGTGTCAGGTTGGG
-TTTGCCAAGACAGAGCTGCCCTGGGGACTGAGGTGGCTCAGCTGAAAGACCGGGGTCGAA
-ACACGTTAGGgctgtgtgaccttaggtccccttttctcctctctgagcctcaatttcctc
-acctttaaaatggggtaaggctacctacctgctaaggttgctCTTGACAATGAACAGAAG
-CTGGGTGAGTCACAAGCGCACTTCGTTCTCGTCCTGCCCGTGGTTTGGTGCTGCCTGAGC
-GGCTTGAGAACCTGGAGGACAGATGGCATAACACACGCCTTCATCTTCAATCTGCCTTGA
-ATGATTGCCAAGGACTTCCAAATCCCCCTAAACAGAGGAGCTGGAAGAGCCCACTTGGGA
-ATCCAAAAGTGTCCGCAGCTCTGCTGTGTGAGCCCGGGTAGGTGCCTCCTCTCTGGCATC
-CATGagctcacacgtgaagtatgcagccaggctgggactcgaacctgtgtctgcagcctc
-tgaagactgttttttccgctttaaggggctgcctcCATGCTGATGACTCCAAGGACTTCC
-TGGCTGGGATAACCCTGCCTTTTCGTCTACAAACACATGATTCATGGTGAAGGAAGATGC
-TGGGCGGTGGGCATGGAAGCCTGAGCTGGGGGCTGGGTAGTTCCCCTTGAGCCCATGCAG
-ATGGGCAGCTGTCCTCAGATGCCACCCGCAGCCATTGGGTTGGGCCCTGCAAAGGAGATA
-CTGGCATGTGTCTGTCTACCAGGCTCTTTTTTGTTGTTGTTCCTTTGTCCTTTTTTTTAA
-ACCATGGAATATTTCAAATATGGGTCTTTCATATACATTCAAAACCTTGAACTCTTAGAA
-TTACTTTTGTCACAGTTGCAATTTTTTTTTAAAtttttatttcatttgtctatttatttt
-ttgagacggagtctcgctctgttacccaggttagagtgcagtgacctgatcttggctcac
-tgcaaccttcgcctcccaggttcaagcaattctcctgcctcagccttccaagtagctggg
-attacaggcacgcaccaccatgcccagctaatttttgtatttttagtagagacagggttt
-taccatgttggccaggctggtcttgaactcctaacctcaggtgatcggtccaccttggcc
-tcccaaagcgctgggattacaggtgtgagccagcgtgcctggccTGCAATTTGATATATG
-TCTATGTAATTACCTATCTCCCATTAATCCTGGGCCCTAGAACAGGGACTGAGACTTTAT
-TATTAATCCATGTATTCCCCCCCAAAACAAATACAGTACTGTTATTCTCCCACACAGACC
-CTGAGAGCAAGCAGACTTGTCTCTATTGTTTGTGTTTTGGGATTTGTGGGGACACCTTGT
-GACCCAGTTTTGTTGTAAATCTTGTCCATGGGGTTTTGGTTTTGCTACCTAATTGCTTTG
-CCAATTTTTATGTGGGGATTTAGAAAGATTTAAAAGCTGAGTTTTCCACTGCAGACATAC
-CCATATTCCCGAATCTTGACTCTTTCTAAATACATATGTACATGAGAAAAAAAAAATCAG
-CACTCAAGGTATTCAGTGACAGGTTTCTCTCAGAACCTGGAAATGCTGGAAATGACCACT
-GTTGCTTAGTCGGGGCTCCtttctttcttttttttttttttttgaggcagagtcttgctc
-tgtcgcctaggctggagcgcagtggcgcaatcttggctcactgcaacctctgcctcccgg
-gttcaaggaattctgcccaagcctcctgagtagctgggattacaggtgcatgccatgact
-cccggctaattttcgtatttttagtagagatggtgtttcaccatgttggccaggctggtc
-tcgaactcctgacctagtgatctgcccacctcggcctcccaaagtgctgggattacaggc
-gtgagccaccgcacccagccTGAGGCTCCTTTCTTATATTTTATGTGTATCAAGCAAACT
-TAGGTACCTGGTCTAGTTCTTACACAAAGAGTGTACTTCCCCACTTAAAAACGGCTACAT
-TGggctgggtgtggtggctcatgcctgtaatcccagcattttgggaggctgaggcgggtg
-gatcatttgaggtcagaagttcgagaccagcctggccaacatggtgaaaccctatctcta
-ctaaaaatacaaaaacattagcccggtgtggtggcagatgcctgtaatcccagctactct
-ggaggctgaggtgagagagtctctcgaacccaggaagcggaggttgcagtaagctgagat
-cacagcactgcactccagcctgggtgacagagcaagactctatctcaaataaataaataa
-ataaataaataaataaataaaataaaATGGCTACATTAAAAGTAggatttttagcttttg
-ttccatagacctcttcggcatatggtgaagtggggatggaccccttctcaaaatgtggtt
-tttttttaattagtctttttttttttttttttcaatagaggtggcgtctgactatgatgc
-ctagcctggtctccaactcctgggctcaagtgatcctcctgccttagccttccagacagc
-agggattacaggcatgagctactgcacctggatttttttttaatgttttataaatgcata
-aaataaaatgcacgatattacaaaggaaaccaattatactgaaatgctattactgcaata
-taaacaagggtttgtgatgcagtgatgaggtgaacttctttattagtacattaaataaca
-agatggggaagcaggttgcaggtcaccatgaacgtaaacaatatgtaatgttatctgcaa
-ccactgtgatatgaaatgaaagtatctttgacttctgttgtaacagtcactgctaaccct
-accatgcttcttgatccacattcatacttgaaggaaatgctgcatttcaattagaggtta
-gtgaatataaagttattttttcccacctaagttcatgaagtttctgagttctagatcagg
-taaagaacccctgCTAAAAATTGTGGCTGTCCCTCACTTGATTCAACCAGTCTCTTATTG
-AAAAGTCACCCCacctcagcatttcttcaaatctcatccttatgcagttggggaaactga
-ggcccaggctggagaacaaacttgggtcattctgccctggggggattgcagaatccagtg
-tcctgattcccggctcaggttattttccagctcctcccctaccagGCGGGTGGCAGGGAC
-CCCCCCTCGGCCCCACCTCCCTGCTCGCCAGGAGCAGCTGGCGTCCTGTCCCGAGAGTGA
-CCCAGCCCCGCCCCGCCCTCGCCCCACCCTGGCCGGCCAGCTGTGGATGTGACAGGAGGC
-TTGGCTCTGGCTCACTCCGGCACATTCCTGGCCCAGCCACTGTTTTCCTCTTCTTCTTTT
-TTTTTTTGGTGGTGACTTTTTCTCCCATACCCCTCCCACTCCTTTTCCTCAAAAATGCTG
-TGTCTTTCCCCAGAGGGTCCCTCTGGGCGGCTCCGGGAGGGAAATGTGGCCTGGATTTCC
-TGGAACGCGTGGAGCTGGAGTCTCAGCGCTGGGAGGAGGGAAGCTGTTGGCAGCAGGGCA
-CCCCCCCAACATAACTGGGCCTCCCTGGAGAAAGAGGGTGAGCGGAGCCTCAATATTCCC
-TTTGCACTGGGCCCTCTGAGCAGTGGCACCCGCAGCTGCAGCGAGTGGGCTGCTGCCTCG
-GGGATAGTGAGACGCCTCTAGGAAACCGCGgctctgtgatcttggggaagctgggcattc
-tctctgagcttgggtttccttgctccttagaactgaggatgtgatctggatctgccacag
-ctggtgggacagtccagtgaggcgatggctgtaCATGGTCCCTTTCCAAACAGGGAACAA
-GAAGCGAGGTGTTGGGGGCATCTGGGGATGCAGGTTTGGGGGCTGCATTTGGGGCAGCAG
-GGGTGGAACAGAGAATTTCCATCCTTCCTTCTTACCTTCATTCATTCATGAGACAAACGT
-GTATCAGACAATTACCATTGTGCCTCTCGGGGCTCacaataagagacaagtaaatgtctc
-ctgtaggggcaggtgcagatgagtgctctaagaaaaagtgaagcagggtGCAGGGATAGA
-GTTTCTGAGGGTGCTGGGGGGAGCTGCTCTGCTGGGGCACCACATGAGCccaggcagagg
-gagcagtgggtgctgaaggctctgaggtgggagcaagcaaggaagggaagagaaggcaag
-gtttgtgtggagtgggggagacagcagagagggctgtggggacttctgggtgaggcgagg
-actttggctcgattcatgggaagctacgaagggctttgagcctgcagtgacacagtctgT
-AAAGGACCCACGGGGCTCTACAGGAGGTgcgcacgtggaggagtgacttggaggccaagc
-agctggggtcctggcttcagctcctccctggctctgtgagcgtggacaggatgcttctcc
-ttgagcctcattttcctcctcagtagagtgggctcatggagctctgaagactaagaggaa
-gggTCATCAAAGTGATGACCCTTTGCCATCACTTTGCCTGTGAGCTACAGGTCTCTATAA
-GTGGGAGCTGTTTTTTTCTATGAGCCTCTGAGGATTGGAGCCACTTGCTTAGGGGGAGGC
-TTTGGGGACAGAGCCAAAGGCTGGTTCCGAGCCCAGGTAGAGCAGTGGCTGCTCAGATTT
-TGGGGACATGTGGTGTCATGATCTGGGAGGGGGATATTCTTGAGTTGTCTGCAGCCCTTT
-TCCCCTTATGGGTACGTGGCTGGATTTAGGGAACCCTAGGGCAAGGGAAGAAGGGCTAGG
-AGCTGCCCCTGAGATCTGTGAGATGGGAGGTGGCCGGGTGTTCAGAGGTTCTCTGAGGTT
-GCAGAATGCCCTGTCAACCACTCTCCCATACCCAGAGGGGGCTGGACGCATCCCTCTCtc
-ccttgtcctcagtctcgattttctcatctgtgaggtgggcacaacaagtcctaatcctgg
-cagTGATAGGAACGTTTGGGGAAGCAGTGATTTGTCATGCATGATGCGGTCGGACAGGAC
-CCTGCCCTTAAGAAGGAGGGAGCCCACCTGCCCAGGCACTGTGCTGAGCTTCTGTGCATT
-AGCTGAAAGTGGACAGGATGACGTCACTTCACTGGAACTTTCTGTGGCTTCTCTTTGCTC
-TCCTATGGAGGTTCCATGGGAGGTAGGAGCTGGGGGCTAAccctgcataccttataaacc
-tcaactctcacatcctcctggctttctgtgtccaggttcacaggcctcctgaatctccct
-ccttaatgcccacgttgttctggcctctgagacattgtgttactccctgaattccttcct
-cttgccctagtaaactctccctccctgctcagctcagtttaactatctcttcctagagga
-agcccaccctgtcctgtagactaggctgagtctcacattgcggcatcttaaggtgctgcc
-tcctctcctggtaacacctgtcgctgttgtaatttcacaggtgttgctgcaattacctgg
-ttgctgactctccccacattaggactgtgtgttccatgagggcagggacgttttctcgat
-cacagccatatccccaacagtaatagcaaattgcagatgctcaataaatgctttctggat
-aaatggaGGGGTGAaatcattttgacaatcagaagaagaaggtgccccccttttacagat
-aaggaaccaaaggtacagagagattaagtaacatgccccgaggtcacacagccagaatca
-gatggTGTCTGTCTGGGAATGTGTCCCTGCAAGCCAGGCCTAGAAGGTGGGCAGATGGGG
-TTACGCAGAGAGGAGCTAGGACCATCTGGATAAGGGAGGGTTGTGGGGGCAAGCCCCACC
-CATCCTTGTTTTCTCCATTCGAATAGTGGTTTGTGGCTGTTTTCCTCAAGGGCGACTCAG
-GTGACCTTCAGGTTGGGGCCTCCTGGGTCCCAGGGGCCTGCTGGGTGGAGGGCCCGGTCT
-GGCTGGGCTGCTTTTCTCGCCCCTTTGCCGGCCCGCTGGCTTCACGCACAGATTACAACT
-TCCCCTCTTCGGCCGTCTTACGCAGGCCACCTCCGGCTCGCCATTGTCTCATTGTTTGCT
-GAGGGAAGCTCCAGGAGGAAATCAACCTGCTGCTCACCCCAAGCAGGGAGTTTCACCCCC
-AGCCCCCACCCAGGGAATGCCTGGGGGGAGGGCAGGAGGGGTGGGGGCAGGTAGCAGGCa
-atgcaacaggcagccttgaagggagtgagctccctggccgggaagtatgcaagcagaagc
-tacatTCACAGCACCTATTTACTAGGTCCTCTCCCAGGCTGCACGTCAGGCAGCTGGAGA
-CACAGATGCTAGAAAAGGGTCTTGTCCTTAAAGACCCTGTAGCCTAGAAGAGATGCTGGG
-CAGGGCCTCAAAGCCAAATGCCTTAGGGGCCAGACAGGTGACAGAAATCTGTAGGCCTGC
-GAGCAATGCTGAGTGGTCGGGACGTTAAATGAAAACTATGGTGCGAAGGAAGGCTTTTAG
-ATTCCAATTTTATTTTAACATGTTGCTAATCAAACAAATGAGTCCTCCAGCCTGATGTAG
-ACTGCGGAACCCCAGCCTAGCCCTTTAGAAAGGAATTCTTGTTCTGGGGTGAAATTGGAT
-CAATAGTTATTGGTGTCTGCCCCTATGCCTTTAGCTATAGCTGTGATGGGCAGTTCCCAG
-CACACTGACAGCATCCCTTTTCAAACACCCAGCAGTCATTTGGCTTCTCTGAAGACTTGG
-GAACTCTCTCAGGGACCTGGgaggagttgatgccactaggggcacccctcagtcaatggg
-gaatgggagttagtgggtaaatgccccatcctcttatccattggaagttcctggtcactc
-aaaggtctgcagtgagttgggggcactggttgcccatactggaaactggctcaataactc
-actttttatccgtttcccctcttcgctgtcactctcccagatccctctggcttcctgggc
-taccggctcccaaattcttgtctcaggctctgcttttaggggaacccaaactaaaacaGT
-CTCTAATATTCTTTCCAAATAGCTTATGATTGTACACTTAGGTGATTCTAATATCCAATG
-ACTTTAACTCTGTGATTATAAGTTTTCATAAGTAAACCCAACTGTGATTCCAGAATGATG
-TCATTCTAATATGGCCGAGATACACCTATCAGAACTGGAATGCTCCATTTTGTACAACTG
-AATTTTGCTTCTCTTGAGCTCCTATTTTTTTTTTCCGATGCCAGAAAATGCAAACTTCAA
-AAAAATCTAGACAAAAACCAATTATTTCAGATTTGAACTCAGTTGGGTGAATCAAGCTTT
-CCCTGGCATCCCTTTTTTCCCGGATTCATTTAAGTCCTGGAAGGGTAGAGGCATCTTGGC
-ATTGGTTGAGGGAAGAAGGGGTCTGTGACTGGTGTTTCTCAAGCTATACCAACCCATCTG
-GCTCTCCAGCATGCTTCTGCCCCCTTGGCATTCACTGGAGATGACCCACTCATGTTGATG
-CTTTGATCTCTAGGGTCAAAGAAGCATAGCTTTCTCCTCCTGGACCATACACTGTAAGAG
-TCACGTCCACTCCATTCAGTCATCTGAAAAGATGTGTTCACTTTTTACACCTCACAAGGC
-CCTGTATACAAACTCGtcattcaatcaaatgtacttgctgagtatccggcatgtgttggc
-attgagccaggcactgaggatacaaagatgaaaagacaggtccctttcctcaagtcattt
-gcaagccaaataatgtataaatattttcaacttacatattgtgatgtccattatgaagga
-accaaatagggtaggcagagaaagcctctttgaagagctgtcattggagccaaagtctaa
-agtcaggggaagccacaaaaaggtttagcaagaaagaCATGTCTGATTATATCTGTAACT
-GTAAAACATTTTCtttttctctttctttcttttattattattttttggagacagggtctc
-actttgtcacacaggccagagggcactggtgcgattttggttcactgcagcctcaaccta
-cggggctcaagcgatctccttcctcagccccccaagtagctgggattctaggcacatgcc
-accatgcccagttaatttttttgtattttttgtagagatagggtttcaccatgttgccca
-ggctggtctcgaactcctgagctcaagtgatatgcccaccttggcctgccaaagcattag
-gattagaggtgtgagccatcacgtttggccGGTAACTGTAAAACTTTTTGTAATACTGAA
-GGCATCTCCTGCATTTTTTCATACATTTTACTTTTCCCCTATTTATTGGTGGCCTCCATC
-ACCTTAGAGATTCACGTCTCAAAGGACAAGAGTCATGGAAATTTAGTCAAAGCCCTGAGT
-AATTTGAGAGTGTACAATTTATGCCATAAATAATAGATTGAGAAGAATAGATGAGTCAAA
-TTGGTTTTCCTCTTTAGGAAACGAGATAAAGATTATCGGGAGGTGGGGAGAAGGGAAGtg
-tagcagagatgtccagctgtcatgcaattacccgacttccccttcttctatagctgcaga
-tggccatgtatctacactgcatttcgctgtctcccttgcagtttaggcgtggccacgtga
-ccaggctctggcaaaggatatgtgaaccgaatggtgtgtgcaacttctgggtcatgcatt
-gaaagaaaaaaaggggcatcctcttcccacacctcttcttcccttcctgccagctagaat
-ttggcatggtggcaggagcagtagcagccgtcttagaccacaagactgaagccacacgtt
-gaggatgtcagaacaacaaaatggaaggatcccaggtatctgacgtcatgggactcatag
-cggcctagactgcttgccccctactggttagtgagagagaaatcaaTAGCTGAGTTAGCA
-TCCCAAGTAATACAGAGGGTCAGAAATATAGGAAATTagcctgttgctgtggctcacgcc
-tctaatccctgcactttgggaggctgagttgggcagatcacttgaggtcaggttttgaga
-ccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaactagctgcggc
-atggtaggacatgtgcctgtaatcccagctactcaggaggctgaggctggagaattgctt
-gaacccgggaggcagaggttgcagtgagctgagattgtgccactgcactccagcatgggt
-gacagagcaaggctctgtctcaaaaaaaaaaaaaaaaagaaaggaaagaaaTATAGGAAA
-TTAGTGTGCATAGACACTGGTGTAACCCTGAAAAAAGAATAGAAACTTCGTGTGGTCTTG
-AGGGGTCTAAGGTCTGGGCCCAGAGCCTTAATTCTGGGTAGAACCCAAGGAAGCCATGAA
-CCTAACTGCCTGAGTGTGTGTGCAGGCACCTGGAGCAGGACACTTCAGGGGAAGGGAGGT
-GAACTGAGGGGAAAAAGCAAAAGAAGACACCCAGAATTGACCAAGATTAAGTTTCTCCTA
-CCTAGTGGAATGGAGGCTATTTATTTTGGGTGTGAGCTGAGAGTTGTACCTGCTTCCCAT
-TTTATTATTATTGTATTATTATTCCTGGATCCCAGCCCAGCAGTTAACAGGAACCTGAGT
-GGAGGCTGAGTTTTATCAATAAATTTTTGCTGAGCACCAaggcccaggctcaggtcccag
-cctagctccctacttgctgggtggccttgagcatgttacttctcttttctgagccttggt
-gatctcattgggaacataaaggggttgaactccaggatgctcaaggtggctctttttgca
-ttgatgtcctgtggttttTCTCTGGGTCTGGCAATGAGGGCAGTTCAGGAAAAGTGTGAT
-AAAATAGCTCTACTTTAGTTCATAGAGGGACAAGACACAGTCACATGGGcacacatgtac
-acacacacacacacacacacacacacacacaAATGTGATTAACCAAACATCATGGTAGCC
-AAGAAGATATGTAGCATTAAGGTTTagaatacaggctttgaagtcaaacagaccagagtt
-aacaacctcattttgtttttattTTCTTTTTTAAAAtttttttaaaattatactttaagt
-tctagggtacatgtgcacaacgtgcaggtttgttacatatgtatacatgtgccatgttgg
-tgtgctgcacccattaactggacatttacattaggtatatctgctaatgctatccctccc
-tcctccccttaccccacaacaggccccggtgtgtgatgttccccttcctgtgtccaagtg
-ttctcattgttcagttcccacctatgagtgagaacatgcggtgtttggttttttgtcctt
-gcgatagtttgctgagaatgatggcttccagcttcatccatgtctctacaaaggacatga
-acacatccttttttatggctgcatagtattccatggtgtatatgtgccacattttcttaa
-tccagtctatcaatgatggacatttgggttgcttccaagtctttgctattgtgaatagcg
-ccgcaataaacatacatgtgcatgtgtctttatagcagcatgatttataatcctttgggt
-atatacccagtaatgggatggctgggtcaaatggtatttctagttctagatccctgagga
-attgccacactgtcttccacaatggttgaactagtttacagtcccaccaacagtgtaaaa
-gcattcctttctccacatcctctctagcacctgttgtttcctgactttttaacgatcgcc
-attcttactggtgtgagatggtatctcattgtggttttgatttgcatttctctgatggcc
-agtgatgatgagcattttttcatatgtctgttggctgcataaatgtcttcttttgagaag
-tgtctgttcatatccttcgcccacttgttgatggggttgtttgtttttttcttgtaaatt
-tgtttgagttctttgtagattctggatattagccctttgtcagatgagtagattgcaaaa
-attttctcccattctgtaggttgcctgtttactctgatggtagtttcttttgctgtgcag
-aagctctttagtttaattagatcccatttgtcaattttggcttttgttgccattgctttt
-agtgttttagtcatgaagtccttgcccatgcctatgtcctgaatggcattgcctaggttt
-tcttctagggtttttatggttttaggtctaacatttaagtctttaatccatcttgagtta
-atttttgtattaggtgtaaggaagggatccagtttcagctttctacatatggctagccag
-ttttcccagcaccatttgctaaatagggaatcctttccccatttcttgtttttgtcaggt
-ttgtcaaagatcaggtggAGCaaccccattttcatcactaactagctggtgaccttggat
-aagtcactttatttctctgagtcttgggtttctcccatttaaaaggaggatgataatacc
-tatatttagggctttcatgtaataaaataaggtaatttatgtgcagctccaagatcacgc
-tgggcacgttacagatactcagtaaatggtggttattCTGATGAGGATTGTGAGCCATGG
-TGAGAATCAAGTGAAAGGTGGAGAAGGGCAGAGCTGGTGGGTCTTGAGTATGGACTAGGA
-AGATCCATGAAGTCCAGGGTGTAGGGAGGCTCTTGGAGAAGGCAGGACATGAGCAGTGCA
-GGGATGTGTAAAAGCGTGACCAGATGGGATGAAATACCCTTTTAGGAGAAGGAGAAAATA
-GACCCAGAAGCGAGGTAGAGCCAGGcttgagaaaattacttcctctttctgagccttatt
-tttcctcttggtaaagcgagtgtaacaatatctgccttgcaatgttgttatagcgattat
-tgagatgttagaagtcaagctcccattaagatgcctggctcatgtaaggcatcaaatatt
-agtttcattCCTTTCCCAAGAGAGGGTACTCACAAAATATCATCAGGGCTAgtaacacag
-aggataaatatttgaggggatggatacctcattctccatgatgtgattatgtcacattgc
-atacctatatcaaaacatctcatgtaccccataaatatatacaccgaatatgtaccccaa
-aaattaaaaATAAACAATTTTTAAAAAAATCCCCCAAAACAAAAACAAATGAACAAACAA
-AGACAAAATGTCAGGGCTAGAGTGACCCTCAACGCCTTTCTATGGTAACATACACATCTA
-TTCATGAACTGTTCACACAtcattcatcaatctatacagctatcacttatgcatttttca
-tatatccattcaaacaccaacaattcattcatcacccattgttcattcatctagccaaaa
-gtccattcatccttcactcaccatctatccttatccatcatcatgcattcatcagcaacc
-ttccatctgtctacctatcatctattctatattcatccttcatcaatctatttcatatcc
-atacacccattcagccagctactcaagcagccatcattctttcatctgtctatccattta
-tcatttatccatcatccacctatccacctgccattagttagccatcaccatctctcatga
-atttatttgttcctcaactatccattcttcatgcatctatccatctatttatcactcaat
-gatccatccatccattatttcattcatCATTTATGCACCCACCATTTTTCACGCATGAAA
-TATTCATCCAAAATCTATTCTTCATTTCTTCATAGCTATCATTTACAAGCCAAACATCAA
-CCCACCAATTTACTCTTCCTCCCTTCCTCTTCCATGCATCATCCATCCTTCATTCACTCT
-TTCACTAAACATCTGTCATCTATTAGCCATGCCTATCATCATCTATGTATCTTCCATCGA
-CATAACCACCTACGATCTATGTAATTTCATCATCCATCTGTATATGTTTatccagtcatt
-cattcatttatgtttcatcttccatattgcctgtcaggtaacatacaccagagatacaga
-ctaaataagctacaacctgtcctccagttgttcagagtctagtggagaaagataaataag
-cctatgatagctgctgtaccagaggaatgactgtaccaagcaccccaggggagaccacac
-aggagagagccacagactctgagggaactggggaaggactcacaaaggaggtggcagttc
-attaaactgggtctcgaagaatgattagaagGTCCACTGttttttttttttttttttttt
-ttttgagacagagtctcactctgtcccccaggctggagtgcagtggcatgatcgtggctc
-actgcaacctctgccttccaggttcaagcaattctcgtgcctcagcctcccgagtagcta
-ggactacaggtgcccgccaccaggcctggctaattttttgtatttttagtagagatgggg
-ttttaccgtgttggccaggctggtctcgaactcctgacctcaagtgatctgctcctgacc
-tcaagtgatctgcgcgacttggcctcccaaagtgctgggattacaggcgtgagtgagcca
-ctgtgcccagccCAAAGGTCCCCTGGTATttttatggggggaaatgagtcctaagagggg
-aagtgactgtgcataatcatactaagagttaattaacaggacagagacttgtaaccaagt
-ctctagcctactatactagttctgtttccactTCTTATGGGAAACAGTAAGTTACTCAAG
-GGAAGACAAGTAAGCAAAGAAAACCTGCCTCGAAGCACCAGAAGGCTGCTGTTTTAGGAT
-CTGGTTGTAGATGGGGTGGAGAAGGGGATTTTCCTAGACCTCAGCTTCTCATTCAGGGAG
-AGGTAACAGCAGAAGCCCCAGGAATATTTGACAAAGGGCAGGAAAGAAGGAGGAGGAGAG
-ACAGAGCACAGTGAGGTGAGGAGAAAAACAggtcaggcacagtggggctcatacctgtaa
-tcccagtgttttgagagatcgaggtgggaggatcacttgaggccaggacttggagaccag
-cctgggaaactccatctctaccaaaaaaaattaaccgggtgtggtagcatgtgcctgtag
-tcctggctgaggcaggaggatccccttgagcccaggagtttgaggctggctgcagtgagc
-taagatcgtgcctctgcactccagcctgggtgacagagcgagcccctgcttcaaaaggaa
-ataatataataataaaaaaaCCCCACCTACTATTTTCTTGTTACCTTTACTTGGGTAATT
-AATAATAATATTGTTACTGCTTggcacggtggcttatgccagcaatcccagcactttggg
-aggccgaggtgggtgggtcatttgaggtcgggagtttgagaccagcctggccaacatggt
-gaaaccgtctctactaaaaatatgcaaattaaccaggtatggttacacatgcctgtagtc
-ctagctacttgggaggctgaggcaggagaatcacttgaatccaggaggtggaggttgcag
-cgagccgagatcatgccattgcactccagcctgggcaacagagcgagagtccatgtcaaa
-aataaaaataataataaTGTTGTTAATATTCTAGCagccatgttttattgagcacagact
-acgtgctgaacagtgtgctatagatttttcatgcatcataccattttatacctcaccctc
-agcagccccaagaagcagttattactcttgtccccattttgtgaatgaggaaactaagtt
-cctgagaaggtaagctaggatttaaatatggtctgtgtgactacaaattccatgtccttt
-ccactcctctttgctgcctctctCATCGTTCTTTGGGTATGGTATATAATAAGTGACTCA
-GACATACATGTGCATTCACTAAGATATATGCTTCATTTTACTGGAGATTTTCTCTGTATC
-CTCAGACTCTGAAATAGTGGACATAGTAGGAAAGAAAAAATTTGTTGAATTTTCATAGCT
-ATCATTTACAAGCCAAACATCAACCCACCAAGAAATATCTTCTATTTCTTGTTGAATTAT
-CTTGCAAAGAAAATGGATAATCAATTAGAATATAGGGTATACAGGTTTGTCTATTCTGAC
-ACAAGTCCAAAGttttttgttttttttttttgagataagagtcttgctctgttgcccagg
-ctggagtgagtgcaatggcacgatcttggctcactgcaacctccgcctcccaggttcaag
-cgattctcctgcctcagcctctcaagtagctgggattacagctgcctgccaccatgccag
-ctattgtttttttgtatttttagtagagatggggtttcaccatattggccaggctggtct
-cgcacttctgacctcaagtgatctgcttgccttggcctcccaaagtgctgggattacaga
-cgtgagccaccgtgcctggGCAAATCTGAAGTATTAATAGCATAAAGATATAATTATTTT
-TCTCCCAGGTCCAGGAGTAGgctgggcatggtagctcatgcctgtggtcccggctacaca
-ggaggctgaggtgggcggattgcttgagctcaggagttcgaggttgcagtgagctatgat
-tgtgctgctgcactccagcctgggtgacagagggagatgctatctcaaaataataataat
-aataaTCCAGGacaagcttgtttgggtcccaggcttcttctgtcatgcagctctgccacc
-cccagggtgttgccctagtccccgtggtctcagatgccacccacatatctacaccacagg
-cagtaggcagtggaaaaggcatgaggcaactatgacttgcaggttgctctccccacttct
-gttcacctaccactggtcagaatttagtcatgtgatagtaaccagctgcaagggaggctg
-ggcaatgtagtctttattctgagaggctatgtgttcaggtaaaagtgagaggttttattt
-ccacaggagaaggggaaaatgggtatgaggggcaagtaggggtctctgGCGTAGATGAGA
-AGAAGATGTATGGACACCAATATTCTCTATCATGTGAAGACTCCTAGGGTCAcatatcat
-ctctcccattagacagcaagctccctgagggcagggggctagattaatcaccctggtgtc
-cctgaaagcttctagctcagACTTAAGGAAGAAGACTTTTTCAGTCCCGGATAGAGGTCT
-AATGATCTGATGGAACCAGAGCAAGTAGGTTAGAGGCCTTTTGCCTGGTGACGACCAAAG
-TGGAGAGGCCAGGCGTCTGGGAGGCGGCCAGCAACAGTAGAGAGAGACGCAGGAAAGCGA
-CTTGCAAGGGGGCTGGAGTGGGTGAAAGGTCAGAGGAGAGTCTGGAAAGGAGGATGCAGT
-GTTGCAGGGCGGGCAGAGCTGGGGGAAGGAGGGGATAATTTAGTAATCACAGCTCTTCCC
-TCAATAGAATGCTCAAGGGCTCACAAAGCATCTTGGCCTCCATGTTCTCACTGGTGAGGA
-TAGATGGTACATGAAGTTAGGTGGCAGATGGGGGGGTGCTTCGGATTGCCACCAGCCCAT
-TCCTATCTAGAGAACTGTCACTGGTttccttcttcgtttcccatgtgcttcctttctcct
-tccctgtctcccttccttcttccttccttgatttctctcttcttcctCTGTATGTGTGGa
-tatacacatgtataacacacacacacacatagacatacatatatatgtatatctgaatgt
-atgtctctgtatgtacagatatacacatatacatatatgtatatgtgcatacacatatGT
-GATGACCAAAGTGGAGAGGGCTAAAAGATGAGGCCAGGTGTCTGGGAGGCAGCCAGCAAC
-AGTAGAGAGAGACGCAGGAAAGCGACTTGCAAGGGGACTGGAATGGGTGAAAGGTCAGAA
-AAGAAgtgtgtatatgtgtgtatgtatatgtgtgtatatgtatatgtacatatatgtgtg
-tacatatgtatgtgtgtgtgtgtgtgtgtgtatgtataatcacctactatgtgccaggag
-gtattgtgaaagttattgagaaacacactggtgagcaaaccagacaagatccttgccctc
-atggagcttatgcttaagagagagagatattacacaaataaatgcacaaatagctccata
-accgttaaatgtgaccaacgactagcgctatgcagaagtgcagaatgctgtgagaGCATA
-TTCGTTGTGTATTCCAGCATTTATTAAACAAATATTTAATAAAGCAAATTATATGTATTA
-GAGAtttgcttttttttttttttttttttgagatggagtcttgctctgttgcccaggctg
-gagtgcagtggcacgatcttggctcactgcaacctctgctgcccaggttcaagcgattct
-cctgcctcagcctcccgagtacctgggattacaggtatgtgccaccacgtctggctaatt
-cttgttttttagtagagacggggtttcagcatcttggccaggctggtcttgaactcctga
-cttcgtgatccacctgtcttggcctcccaaagtgctgggattataggcatgagccactgc
-gcctggccTAGAgataatttttagaaaggaataaaatcacgctcttgttcaaatataaaa
-tgaacatgtgtcaaagattttatttaactcattaatttatgaggtaaccaataaggtgtt
-aaaaaatagttcaaaggagaatccaaagagaagaggcatacataggtaatgaggattgct
-tacattaatttgctaaagatgcaaaactgttttcttccaagagtactggggggaatgaat
-tgcatctttattattattattttgagacagggtctctctctgttgccaaagggctagaat
-gcagtggtatgatcatggctcactgcagcctcaacctcctgggctcaagcgatcctccca
-cctcagcctcctgagtagttgggactatagacaagtgatatgtgacaccttgctagctaa
-tttttaaataattttttgtagagatggggtttctctctgttgcccaggctggtctcaaac
-tcctgggctcaagtgttcctgccacaggctcccaaagtgctgggattacaggcgcgagcc
-accgcatctggcctcaactgcatcttgagcagaagaaatttgtttgcatctctgtgacga
-gaattgtttttattatcatcaatcttgttacaacatattgaagtgtacgctagctcaaaa
-atgtgaaatgcgtcggcaaccatagaatcagctaacctgaaatgatgtaaagacaattca
-taCCATTCTGGAGGACTTCCAGTAATCTTTGTGGACTTTTTTTTTTCAGCTTCAAAGTAT
-TTTACAGTTTTTcctgatgtgagtcagatcggtactagatactaataatacagaggtaaa
-ccatacagacacaatttctccctcaaggaCAATATTCCCTTATGTTCTAACTGGGGTGGA
-GAGCCGGGGAACAGTTTTTGGAAGCCAAACTGAGTCTTTGCCATTTATAcagtcatatgt
-taattaacaacaggaatatgttctgagaaatgtgtcgtcaggtgatttcattcttgtgca
-aacgtagaatgtactgtcacaattctagatggtacaacctactaggcacctagtctctat
-tctataacctatttcttctaggttacaaatttgtacctcatgttactgtactgaatattg
-taggcaattgtaacacaatggtaagtatttttgtatctaagcatagataaatatagaaaa
-gatacagaaaaaatatgtagaaaagattttttttaaaaaagacacacttgtatctttact
-gtgaatggagcttgcaggactggaagttactcttggtgagttaggaagtggtgactggat
-gtgaaagtctaggacattactgcacactactgtagactttataaacactgtacacttagg
-ctatactaaatttatttttaaaatttgtttctttcttcaatagttaactttagcttactg
-taactgttttgttctataaacaaaaaaattttaaaaacactttttgtattattttgtaat
-aacacttagcttaaaataggaacacattgtacagctgtataaaaacattttctttcttta
-tatccttattctataagcctttttctacttttaaatgttttttccttaaattttgttgtt
-gttgttgttaaaaactaagacacaaacacacacattagcttcagcctacacaaggtcagg
-atcatcaatatcactgtcttccacctccacgtttcgttccactggaaggttttcagggca
-gtaacacctgtggggctatcatatcctgtgacaacaataccttcttttgaatacctcctg
-aaaaacctacctgaggctgttttacagttaacttatttttttttaataagtagaaggagc
-acactgtaaaataacaattaaaaagtatagtaaacatgtaaatcaataagttgtttattg
-tcattatcaagtattatgtactgaacattttttttttttttttttgagatggagtttcgc
-tctggttgcccaggctggagtgcaatggcacaatcttggctcactgcaacttctgtctcc
-caggttcaagcgattcttccgcctcagcctccggagtagctgggattacaggcatgcacc
-accacgccgggctaattttgtatttttagtagagatgggCACACCAactaaagaacatca
-aagcccagagcgagaaccttcctccctttcccattttccttcaacttgttattaaggaga
-aagtctctgttcaatgctggtgtgtttttaacacctctcttaacacttacttcccttttt
-aacagagaataggcctccagagcctttggcaggccaccggatctggctagaatgtgatga
-cattgttttgttttcattgtacttatttttatggctaccttctatttatggcacgagata
-ctggttttccatttagggagggccctaaactttccttttgacataatatatttatgtttt
-tagaagaaggaccatttaaagaaaaaatattatgtaatattaattacataatatttgcag
-cacaggtggtactgagacagggaaaaaattataaagaggtatgtaaTGTGCTGAAAAGGA
-GGACATGCTTCTCAGGCTAATGCCTCtcccagcccctacttaacagaagggaccactgag
-gcacagagaggagaagggactttgtcaaggtcacacTGATGATGTGGACTAAGAACTGAC
-AGCCTCTTGATAGCCCTGTGGTGGGGGATATCTTGTGTCAGATGGGGAGGGCAGAGGTCA
-GGGACTGTGTGCAGCCCCATTGGTCAGTCCAGTGCACTGATCCGCTAGTCAGACAGAGTC
-CTCCAAGGTTGACCAAGTCATGGACTGAAGGCAAAAAGGACCGGGGGACCTGGAGGGGAG
-GAGAGAAGAATGCTGGTGTTTATCACGCACTAACTATGCTAGATGCTCGGGTGCCGGACG
-TCACCCCTAGGGAATTCACAAATTTGGGGGCAGACACGTCCTACAAAAATAACTCAAGTT
-TCTGGCGAAAGTGTGGTAAGTGTTCCAGCAGAGGCCTCTCtagtgacatctaggtttttg
-tctgctcactggtcatttccccatattcttttgggaaaccacctcttcaccactcttgat
-tcttgtagctcagaccaggcaaaccccacacccacttcagaggtgggcacatgaccagac
-ctggccaattagaacactttatccctcttgccacagagactggcacatggttgggcgcgt
-gacccaaggcaggccagagggggccttccccaggaatttgctggaactactggagaaaaa
-tcccacttcatagggtttttaaaatggatacactgtaagccagagttgctggcagctatc
-tttgccaccaaaagagagaggttctctgaaaatgaagctgacaggaaagcagggatgaca
-gatggagagacagctagagtcctaatgctactgtatggtcacctcctggacccagccgtg
-aaatcagtgaccctgaacACAGTTCTATTTTGCTTTGTTACCCAGGCTGGAGCtttttat
-ttttgtaattaaattaaattaaattaaattttaatttttagagacaaggtctcgctttat
-cacctagactggagtgcgtggtgcaatcacagctcactgcagaatcagcctcctaggctc
-aagtgatcctcctgcctcagcctcccatgtagttgggactacagttgtgtgccaccacgt
-ctggctaatttttaatttttattattatttaatttaatttttaatttttattttttgtag
-acatgtggtctcactatgttacccaggctggtcttgaactcctggcctcaagtgatcctc
-ctacctttatctcccaaagttctgggattccaggtgtgagccattgtgcctggctCGttt
-ttatttttatagagatggggtctctctatgttgcccaggcttgaactcGGTTCTAGAAGG
-CAATAacacacacacacacacacacacacacatacaTAtttgcattagccactttgagat
-gggtttctgtctcttaaaaccaaaaagagacctgtctaatTCCAGGCAGAAACAATATCA
-TGGGAATGTTGGCAAGGGAGAGGGATTGGAGTGTGTGTAAAGATTTATCTGGGAGTCCTT
-CCTCGTGGAGGTAGGTTTTGAGCAGGGTTTTGAGAAATGGAGAGGATTTTGATATATAAA
-GAAGGTGAAGAAACAGTATTTCCAGGGAGGGGAACATCCTGGGCAAAGGCTTGGTGGTGG
-AAGAGGGCAGGGAAGTGGCGCCGTCCAGTGTGATTGGAGAGAGGATGGGGATAGAGAGGA
-GGTGGGAGAAGAGCTGGCAAGAAGGGATGTGCCCTAATCGTGCAGAGATCCAGTCTGCTC
-CTTCACCTGCATCCTCCTCCTCTGGAGGCGTGCCCTTCATCAGttaattcatccacagcc
-atttactgaacaccagcatgcgtcaggcactgtcaaagggctggcgagagagctgtgggc
-cacaccaccaagtccctgccctcttgtagcttcttttgtaggtgaaggacacaggtggta
-aacatgagcaagaaataaacaagtatcatagtgtcagggagcagtaactgttatctagaa
-aaattaagacgagtaaagggaatacagactagtggagaggTGTTTGGGAtgaaaacggat
-aatactgatggttgaccgacatcgtgagtgcactcaatgccactgaactggtaaaatggt
-taaaatgataaattttacattaggtatttttctgttctttatattatgtacattttacca
-caataaaaaaCAGGATTggcagaggggtgctattttagctagggtggtcagggcatgtct
-ctctaaggaggtgtcgtttgaacagaatggaggggaattagcaagccttgaagagattgg
-ggggaaggtattctgggtggagggaattgccaggacagatcctgtggggccagagtcggc
-ctggtgtgttctaaggacagcaagtgggcccctgtggctggagcccagagagcaaaggga
-gagggggaggaagatgagtacagggatcagcaggggcttgtatgccaggagagaactttg
-gatttggttgtatgagtgatgggaagccatcggagggctgagcagggaagggatatgaat
-cagagtttctgttCAATTCTCCCTCTGCCCACACTCAGTCCTGCTCTTAATCAGGTTGGT
-AATCTTGCCTCTGCTTCTGACTATCTCTCTCTCCTGGCTGCTACCCTCTTCTGCACATCT
-TCATGACCACTATCTTGCTGAGGTCATCttttttttttttttttgagacagagtctcact
-ctgtctcccagctgaagtgcagtggcacaatctcggctcgctacagcctctgcctcctgg
-gttcaagtcattctcatgcctcagcctcccgagtagctgggattcaggcgagcaccacca
-tacccagttaatttttgtatttgtagtaacgatggggttttgccatgttggccaggctgg
-tcttgaacacctggcctcaagtgatccacccaccttggcctcccaaagtgctgggattac
-aggtgtgaaccaccacacccagAGAGGTCATTGTTTTTATATGGCTGACCCAAATGGCCT
-CCAACTGGCCTCCCTGCCTCCTGCCGACCCAGCCTCCACCAGTCATCAGGGTCTCTTTCT
-ACCCGCAGCTCTGACCAGCCCTTGCCTTGGTGAGAGCCACAGCCTCCCAACTTCCAGTCC
-AGCCCCATCTATCTTCTTTTCTCCTCACCCCAAAGCCCACACTTAGTCACTCAGAGCCTC
-CATGGGGTTCCCCTGCTGCCTGCCGTAGGCTTGCCCTCCTCAAGGCTGGTGTATGGCTCT
-CTGCTCTACTCGGGTTCCTTTTCACCTAGACAGCCCCCTCCCATCCTTCAACAGCCTCCC
-AGCATCACTCCTCTGTGAAGCCTTCCTTGGCTGTCCCACCCGCAGGCTGGCTTAGCTAGC
-TCCTCTTCAGTGCTCCCTAAACCACTCACATCTTCCACTTTCAGAGCCCCGAGCATGTGG
-CATGCAAAGCACATTggtttggtttggttttgtacaaacctttccctttcctcagctccc
-tgaaccccccagttccctgttcatagtatgttcgcaacaaatgtttattgaataaatgaa
-tGAGTTTGGAATTTATCTTGCAGAAACAATACTCCCACCACCACTACCAGCACCTCCACC
-AACGAAaataatatccaacccaagttgatgacttgctatgcatcgggcactgtgctacac
-acttccaaatctggatctgatttctatttcataatattaggaggaaatcactgtgttagc
-cccactttagagatgagaaaactgaggcatggtgaaattaatcaattttcctaaggctac
-ataactcagaagcaggagagccgacagtccaaAGTGTGCAGCCCAAAGCCGTGGGCACCG
-CATGCAGCTGGAGGAGGTGTCTTGGCATTACTGCATCCACGGACGGGGTTTCCAGGAGTC
-CTGGAGTTCCATATGAAGATTGATTGTCCATGAACTTTTTGGGCATGGGGGCAGGTCCAT
-TACTTGTAttttttttttttttgacagggtcttgctttgttacccaggctggagtgcagt
-ggtatggtcatagctcactgcagcctccatctcctgggttcgagagatcctctcacctca
-gcttcccaagtagctgggaccacaggcatgcatcaccatgtctgcattatatatatatat
-atatatttttttttttttttaagagatggtgtctccctgtgttgtgcaggctggtctcga
-actcctgtgctcaagtgatcctcctgccttggcctcccaaagtgttgggagtacaggtgt
-gggccatcgtgcccagccGTGATCCATTACtttttttttttttttttttgagacggagtc
-atgctctatcacccaggctggagtgtagtagtgagatctcggctcactgcaacttctgcc
-tcctgggttcaagcgattcttctgcctcagcctcctgagtagctgggattacaggtgtgt
-gctacctcgcttgactaatttttgtttttttagtagagacagggtttcaccatgttgacc
-aggctggtctcgaactcctgacctcaagtgatccgcccacctcggcctcccaaagtgctg
-agattataggtgtgggccaccgcacccggctGGTCCATTACTTTTACCAGGGTCTTAGAG
-GGGCTCTTGATAATTCCTATATTTAAGATGCTCCTCTGCACATAAGGGGGAAAGATGGAG
-AGTTTTCGAGTATTGGACTGTTGCGGTTCAACCTATGCTTTAGAGAGATCACGTTggcta
-tccattgcagtgtaatgcagggagaagagattggaaatatccctaagattcaccaagagt
-ggatgtgttaatcatatcatggtacctccttccacagaagggaataatacgcagccataa
-agatgaatgaggagtctctttatgtaccaatgtgaaatgattcctaagatatttatgtca
-gagagagagagacagggtCTgggtctcactctgtctcccagactggagtgcagtagtgtg
-atctcggttcactacagcctccatctctgggggctcaagagatcctctcgcctcagcctc
-ctcagtagctaggactacaggcttgcaccaccacgcttggctaattaaaataaaattttt
-ttttggagagactaggtctcactatattgcccaggctggtctcaaacttctgggccaaag
-agattctcgcacctcagccttccaaagtgctgggattacaggcgtgagctaccctgcctg
-gccTtccaagacatagtttaagtaaatacagcaaggtgcaggccagcatgtataattagc
-ttctatgtatgttttttaggaagggaggggttaagattatagatctagatgtgcttctat
-atgcataaaaaaTCTTTGGCAATATTCACTGTTAAATAGTCAGTGGAAACcctacctcat
-agggtttttatgagggttacatgagttaatattagataattgcttagaagagtacctggc
-acacattaagcactacagaagattttatttaataAAATAAAAAAGAgtggcgggcgcctg
-tagtcccggttacttgggaggctgaggcaggggaatggcgtgaacccgggaggcggagct
-tgcagtgagatgagatcgcgccactgcactccagcctgggcgacagtgtgagactctgtc
-tcaaaaaaaaaaaaaaaaaaaaaaGAGGGTCCCTTAGGGGATGGAGACCAGGTGACTAAG
-GGGCAGGGAGAGAGACTTATTTTTCATCTGAGGCCTTAGACGCCTTTTGAATTTGGTACC
-ATGGGTAAAttttttttatttttatttattaatttatttttgagacagagtctcactctg
-tcacccaggctggagtgcagtggcacgatctcggctcactgcaacctccacctcccgggt
-tcaagtgattctcctgcctcagcctccctcgtagctgggattacagttgtgcgccaccac
-acctggctaatttttgtatttttagtagagttggattttcgccatgttggccagcctggt
-ctcgaactcttgacatcagatgatctgcctgcctcagccttccaaagtgctacgatgaca
-ggcgtgagccaccacgcccggccTATTTTTTTGAAGTTGAAATTCAGTGTATCTTggcca
-ggcgtggtggctcatgctgtaaccctagcactttgggaagctgaggcaggtggattgctt
-gagctcaggagtttgagagcagcctgggcaacatagtgagaccctatctctcaaaaaaat
-gcaaaaattagctgggtgtagtggcgtgcacctgtagtcccagctacttggggggctgag
-gtgggaggattgcttgagcccaggaggcataggttgcagtgagccgagctcacaccactg
-cactccagcctggacgacggtgagaccctgtctcaaaaaagaaaacaaaaaacaaaaaac
-aaaaaaaaaaaaAGAGAAAGAAAGAAATTCAGCATATCTAGATAGCTAAGAGATCATCTG
-AGGGGGTCAGGGCCTGGAAGGAGATCCCACCCAGAATCCCCGGGAATTCGCTGTAATTGG
-TCAAAGGCCACATTGTGTAGTGTGAGAAATCAGGACGTGAGGAAAAGGCGGACAGGAGAC
-ACCAAAACACCCACGCCCCAGGGCCCACTATAAAAAGCACATTTAAAAACACCAGACTGG
-AAAAGTTttattattattattattattTTTTAAATAGCAAAAGCGAGTCCCCCCAGGAGG
-CGCACTGCAGCTGCGGCTGTGGCGGTTCCCAGGTGATGTCAGTCCTGGCCAGGCGCCAGT
-CCCGGCCCCTTGGAGACGGTCTTGGTGGGTTCAGCTTGACTGTTTTTCCTTCCTGAGACT
-TGAGGACACCTTCCTGTCTCAAAGAAGGAAGCCTTTCCAGGGCTTTCTGAAAGCCAGGGG
-CAGGGGAGGCGGTGGGCCTGGGCTGCAAGGGCAGAGAGAGGCAGGGAAGGTGGGTGGGGG
-TGGGGAGGAGCGGGGGCTGCCTCTGGGAGGAGAGTGAGGGTGGAGAGAGCAGAAGACAAG
-CCTGGCTCCTGGGTGGCTCTTTAGCCCTCCCACCCGGGGGCGCGAGGGGGTCTGCTTCTT
-GGGAATCCAAGGCCCGCCTCCCTGGCCCCATTGCTTCTCAGCCCTGGCTGCTTCCTGGGG
-AGGCCCCTGGGTGGGGTGAGGTTGTGGGGTGAGAGAGGTTCCCACAGAGTTCCCAGTTGG
-TCAGTGTCTTTTCTCCCTCCCTGAGCCCTGGGCCCACCCTTTCTTCTCTATGGTTAAAGG
-CTCTTTGCCAATATCTTCCAggccaagcgcggtggctcacgcctgtaatcccagcacttc
-gggaggctgcagcaggcagatctcctgaggtcagaagtttgaggccagcctggtcaatat
-ggtgaaaccctgtctctactaaaaatacaaaaattagccaggtgtggtggcacgctcctg
-aatcccagctactctggaggccgaggcaggagaatcgcttgaacctgggagacggaggtt
-gcagtgagtcgaatcatgccactgcactccagcctgggtgatggagcgagactctgtctg
-aaaacaaaaacaaaaacaaaaacaaaacaaaacaaaacaaaacaCCCAAGATTCTGCCAA
-TATCTTCCAAACTGGGTTTTCTGCAGATGGGACGATCCAcagagctgggtttgaggtcca
-actctgcactcctagccgtgcgacctcaggctggtcactgcttttctttgagtgccacct
-ctgaaatggattaggttggccttacagggtggttatgcagagtgagtgagacaGAACAAT
-GCCTCTTGGTCCTTCCCGAGTATCTGCTAGGCACCCACAACGCGCCGGTGCCACCAGGCG
-CTCGGGATGCTCAGCATTTGGCACAGAGGcagcagagcagggaggtgaagagagtgggct
-ctggacccagcctcagtccacatcccggttctgtcctttgatggccgtgtgaggatagtg
-acagcctgtctcactgggtcgtagaggagtaaatgagttacaggccgtggaacagtgcct
-ggcactgaggcggtgctaggtaagtgtttgcttttattTTCGACTTCTGTCCAACCAGCC
-TTCTGTTGCTTTGACAGCTTCATGGGGCTGCTCTGGGCACTCAAAGGAGATATGTTGGGG
-ATTCAGGGGTTGTGTTTAGGGGAGACCCAGGTCCTGCAGGTGCCCCATCATTCATACTGA
-TGCAGGGGTGGCCTGGAAGCTGCAGAACCATTCACACTCGGCAAAGCCTTCTCTCACCTT
-GGAAGCATCATTCCTAATGACGACACAGGTCTCCCAGCCATGCGTTCCCACATAACTTAG
-AAGCACCCATCCCatttttattatttgctcagagcctgctttttcagtaggccgtaaact
-ccatgaggtcaggtactacatctggcttattctctgatcatccctagagccttgtgtggt
-tcatggagaagttcaaaacatgtttgttgaCGGACTTACTGACTGACAAAGTCTGCCAGC
-CTTATGTTGGTCTACAATGTTACACTCTATCCCATGCCTCCTGCTGAGTTTTACCCTCCT
-GCTGTGATGCAGGCTGTGGGAtctggagctagaccccctcagttggaatcctggctgtgc
-cattgcctagctgggtgcccttgggcttggttttctagtctgtgaaatggggatagcaac
-agtacctacctatgtggcttgttgcaagtgaggccatctctgtatgtcactcagagaagt
-gccttggattagtcagTTCCATCAACATCAGGACTAGGCACGCACCTGGTGAGGTCATGT
-GGGGGtggtggttgagagcccagtggggctctgcagctagaacatctgattcaaatccac
-cagccactgtgtcaccttggccaagttctttaacctccttgtgcctccgtttcctcatct
-ataaaatggagcaataataatacatatctaaccagcttttgagcaagctgtatgtatgta
-tgtatttatttatttagagacggggtcttactctattgcccaggctggagtgcagtggtg
-caatctcggctcactgcaacctccaactcctgggttgaagggattttcctgcctcggcct
-cctgagtagctgggattacaggcacgcaccaccatgcccagctaatttttgtatttttag
-cagagatggggtttggccatgttggccaggctggtcttgaactcctggcctcaagtgatc
-tgccctcctccgccttccaaagcactgtgattacaggcatgagccactgccccccgcgaa
-gctgtatttattttatgtaaagtgcatagcctaggcctgacacgtagtaggtcctcaaaa
-gagtcaggcatttttCCAAGCCATTCAGAAAAAAACAACTCCTAGATTTTATCAGCCTTC
-CCTCCCACAAGGCCAGTGTGTCCCAGCTGACAAAGTTGCTGGCCGTGCTGACGtgaggaa
-aagcaagggccagagagggccagacgcctaccctgggtcacacaggagcagtggccaacc
-tagaataggctaggtcttctgtctcgcagcctgtTCATCCTGAGTGCCTCCCTGGTTTCC
-AGGCCCTGCTGGCCTGCCCTCTGACCCTAGCCCCCTGGGAGCTCTATCCCAGGCCCATGG
-GGTCTGCAAATCTGGTCTGGATTAGACACGCTGAGAAGCAAACGCCAGCCCCCCCAGCCG
-GCTGCCCAGTGGGACCTGTGCTCACAGCTGCTGAGGCTCATAGGGACATAAATCATGGTG
-GCAGGAGACTCGGGGGATGGGACCACCTTAGCCTCCTAAGGGGCACAGGGGCCTGAGAGT
-CACGAGCAGAGGCACCTGGGTCTGCTGGGGATATTTTCCATCGTCTGTTGGACAAGCTAA
-AGCCAGGGTGCATCAGAGGGGGCCAGGACACCATTTGGCAGCCCTCGCATCACAGTAGGC
-CAAGATCCCAACTTCTTTTTAACttttcattttgcaatcatttacaacatgcagaaaagt
-gacaaaagtggtgcagagaactcccatataccctgtactcagattcaccacattttaagt
-ttgtcatatttactctatccttttctctcacacatatattatttctcttctgaaccattt
-gagagagcacgttacctacatcatacttctccttaatagtacttcaggatgtattttttt
-ttttttttttgagacggagtctcactctgtcacccaggctggagtgcaatggtgcgatct
-tggctcactgcaacctctgcctcccgggttcgagcagttctcctgcctcagcctcccgag
-tagctgggattacaggcgcctgccaccacagggtttcaccatgttggccaggctggtctc
-gaactcctgacctcaggtgatgcgcccacctcggcctcccaaagtgctgggattacaagc
-tgagccaccacgcccggcctaggatgtaattcttaagcacaaggatatcctctgacacaa
-tcagggtgctgttagcaaatacagaaaatttaactttgatgcaataccttaatctattgt
-tcatatcccaattttgtgtgaccatgtctcaaaaaaaaaaattgtcaactctaccaagaa
-ggtcccctgtcacattttcccctctgcagtacaggatccagttcaaagtcatgtatcgca
-tttacctgttcaggtctATACTTGATATCACAACTACACGAGGTAAAATATACAGTCGTA
-AGAGACACAGATGGGGTTGAACAAAGACATCCAACTTCATATGTACGTCCCATGAACCAA
-TGTTTCTATAAATCCTCTAATTATATGGTGTTCCACAATAATGCATCACGCTCCTGACTG
-TGTGGAGGTAGTTAAGAGTTAACTTGCCAggccaggcacagtggctcacacctgtaatcc
-cagcactttgggaggctgaggctggaggattgcttgagcccaggaatttgagactagcct
-gggcaacatggcgaaaccccctcaaaataaaaaattagctgggcatcatggtgcacacct
-gtagtcccagctactcaggaggctgaggcgctaggactacctgactccaggaggtggagg
-ctgcagtgagccatgatcgtgccacctgcactccagcctgggtgacagggtgtaaccgtg
-tctcaaagaaaaaaaaaaGTTAACTTACCAAATATGCCATAGTCTTCAGCACTCTCTTTT
-TGTAGTGCTTCATTTTTTAACCTAATAAAAGCCTCATAAAATGGGAGTGGCCTGGGACAA
-TGAGGGGAACCTGAAGTGCTGtgggtgcaagaggtcctgtgttctcagccctgctcagct
-ccagatgctgtgcaaccgtggcccatcaccgctcctctctgagcttcaggttGCCATGGG
-TGACCTCTGAGGCCTTCCTGCTCATAACTGTGGAGTCAGAGAAAACAGCCCTgcatggca
-aggagggagatttgtgttcttggtgtcccaacagggccaaggacctgctggggaacccca
-ggcaggttgccctctgtcttgtctcactttcttcattgtgaaatgaTGAACTCTGAGATT
-ATTCTTGTGCTGCTGCTTCATGTGTCAAGACTTGCAGGGAGAGTGTAACCCTTTGGGGTC
-CAAGGTGGCCTGGCTGAGTCGGTCATTCCAACCCCTTCAGTCCTGGATTTCTTCTCCCTG
-AGCAGCTTTACTCCTGTGGCCTCAAGTTGGCCTGGAGAAGCTTGGCTGGGCTGGACCATC
-CCGGAGGCGACAGGCATGCTGGGGGAGCGGACAATGTTACAAAATGTTCCCCAGAGGAGC
-TGCCTATATATGCAGACCACACCTGTGCTTCTCCCCGGTCACGTGTGTGGGCTGACCTTG
-CAGCTCACAAAGGCTCATGGGCATtaactgtccattaccaggaagatagcaagctgcaaa
-atatgcataatggagcactatgcagctatgaaaaggtgtgaaacagctctgtaagcaacc
-aagggtctccaagaagtacagttaagaaaaaaaaatccagtgcagagaggagtgtgtgaa
-atgctaccacttgtgtggaaaaacaatatctatgtaatttgcctatatatgcagaCCATC
-TCTGCCGGAATCCATAGGATCCTGGTTACCTTAACATAGCAATTGCCTCTGGGGACTGGA
-GCTGGTGGCTGGGAGAGAAGGAGACTTATTGTCAGTTTATTCTTTTTTGTGTCTCATTCA
-AAGGAAAGAACCGGTATGTGTAGATGTGcaagaggggctggctcctgggaagctgctaat
-tgcatttcttgatctccatgctgggtgtacaggtgtgctcagcttgtgaaaatccattga
-gctgtacccttacaccctgtgcactttcctgaatgtgtcttatacttccataaaaagtgt
-aaaCTTggccgggcgcagtaactcatgcctgtaatcccagcactttgggaggccaacatg
-ggtgggtcacctgaggtcaggagttcgagaccagccttgccaacatggtgaaaccccgtc
-tttactaaaaatacaaaaattagccaggcgtggtggtgcacgtctgtactcccagctact
-caggaggctgaggcaggagaatcgcttgaacccgggaggtggaggttgcagtgagccaag
-atcacgccactgcactccaacctgggtgacagagtgagatccatcttaaaaaaaaaaaaa
-aaGCGTAAACTTAGCATGGTTTAAATGATTTGTTAAGCGTATGTGTGCTAGTTTAACAAA
-AACGCTGCAGagctgggcgcagtggctcatgcctataatcccagcactttgggaggctga
-ggtggatcgcttgagcccaggagctggagaccagcctgcataacatagtaagaacctgtc
-tctacaaaataaacaaataaataaaattagccaggcctggtggtgtatgcccgtatttcc
-agctactccgcaggctgaggtgggaggatcacttgaggacaggaggttaagcctgcagcg
-agctatgactgtgccactgcactccagcctgggtgacagagtgagaccctatctcaaaca
-aaacaacaaaaaaTACTCGGTGGGATTATCGTCTTCACTGTGGCTGTCTCTGGGATAAGT
-GATATTTCTAGAGTCTTATAGCATTTTGAATTTGTTTTACAATGAAAGCACAGGCAGAGA
-AACCTATAAATATTTTTTCAGAAACAGTTATCAGTATAGAAGCTTTTTTGGAAGGACACT
-CAGGAAGCTGCCTCTGGGGAGGGGCCTGAGGAGGTCTGTACTTTTCACTGCATACCATTT
-GATACAACTTGGATTACTTACCAGTGCATACAGGGTCTATTAAAAACTATCTCACAAAGC
-AAAACAAATACTTATCTTTCTGTTCTAGCTGCTCTTACTAGTTAGAGACTGAGCCAGGga
-ggcccagaggggtcaagcaacatctctggggtcacccagcaaatctggtggcggagtggg
-cctccagccagagcacccaagtgtctgctctgcccccactcccaggcttcctgccattga
-caaggccacagtccttttcCTGTGGCTTTGCCAGAGGCTGGCTGTACCTGGGAGGGTAGG
-CGCAGGGGGAGCAATGTGCTTTCCTAATCAGCTCCCAAAGGGGGAAGCACAGCCACGCTG
-GGACACAGGATAAGCACGACCAGTGTTCCTGAAACAGCGGGGAAGTGAGGTAGAGGGTGC
-TTGGAAAGCTCTCCTGGGTGGGGGACCCCGGCCCCCTGGGGCCCTCCTTCCTCTACTTCT
-TACACCAAAGGAATTAAGCATGGTAATTTCATGGCCTGCTCCAGCCTAGGGACTGGCAAT
-TCCAcaactcccttgatctccctgggcctcggttttcatctgtgaggaagaccaggttgg
-tcgggctcattcctgtggcatctggcacagtgcctgccacacagagggtattgacaatct
-gtttgtcaaTTTGCAAAATCGGAGCCACAATTCAGGCTCAGATGGTCAAACGCAGGGGAG
-TGGGGTAGAGGCAGAACAGAGGGGATACGAACGTGGACTCTGGGGCCAGAGTGCAGTCAG
-TAAACATGAAATAgatcacttgagctcaggagtttgagaccagcctgggcaacatagtga
-gaccctgtctctaaaaaaataaaaataaaaGTGTTTGTTAAATAAATAAACTGTTGAAAT
-AGGCATATGAATGTACCTTGCTGAGGAGAGGGTGGCTGCCTGGCTGCCCTGGCCTTTCCC
-TGGCTCTCCCACCCTCGGGCCTCTCGAGCTTCTCTGATCCTGACCTCACAGGGACACAGC
-CCCAGCCCGAGAGCCAAGAACTCCTAGCTGCACTGATCAGCTGACGCATCGCTGTCTCTG
-CTGGGTCTGCAGTGGGGAAGACACCAGCTCTCACCTCCCAGGGCTCCTGGGAGTGTAATT
-GGGGTAACAGGTGCTGGCTTTCCACTTGGGGCATCTCCAGGGCAAGGAAGGAGCTGCTCT
-GGGCTTCAAAGGTGGACGGACCTCAGGGTGTCACCCTGCCACGTGCCTCTGGGTGTCATC
-GGTCTTCTAAAGCATTTCAGCTAACACAGGGGTAAGAATATTCCCCTTTAGCATGCACTC
-ATTTGCACTTGTGGAAAACCACATGGCTTGTTGGTGATCGcatcaaagagggatgggtta
-aaggatggcatgttcacaaaatggaataataagcagctcaggaagaaatgaaataccctt
-taggtactgacttgggatgataccaagctagattaaggaaaaaaagaaggagccaaaagt
-gtgtacgatgtgctgtcatttgtgtaTTTGCCTGATCATTCATAGTGAATGGGACATCAC
-AGGAAACTGGTGCCCTAGGCTGCTTGCAGAGAGGAGAGCTGGTGGCTGGAGGACAGGGGC
-ACGGAGACTTTTCAACACATACCCTCTGGTACCTTCTGAGTTTTGAACCATGTGAATGAA
-ATGAACACAGGCCTTATTCAAAAATAAGTAAAATTAAGATTTCTTTACCAACCATATCAG
-ACACCTAACAGTTGTTAAGAACATCTGATAAACAGCAGACTGAGGAAAGTTTGGTTATGG
-CGCCCGGAGAGGGGGCTCTGCCTGCCTTCCCCCGCCCCACCCCCACCCTTCCAGGGCTCA
-GGGCAGCCCCCAGAACATCTGTGCCTCTCTCTAGGTCCAGGGGAGGGCCCACCTCTGACC
-TCCGATGTCCACGGGACTCTCCTCAGCTCAGAACGACGTCTTTTATTTAAAAATAGCTTT
-TATTTTAAACTCACCAATTCTCTCTcacacacactcacactcacgcacagatacacacac
-acCCTGTCACCAACAGTCTTTGTTTTTCCAAAAGTTCTGCCTTGTCTCTGACCAGCCAGA
-GCTGGGCAGGCTGAATGGATCCTCACAGCTCTCCAGGATCGGGTGGAGATGTCCCGAGGG
-CCCTGCCCAGAGTGTCCCGGAACAGGCCATGGTCCCCCGGTCCCTACACAAAGAAGGGGT
-GGGCTTGGCTCCTGGGGTCTTCTTCCCTGTCCAGCCAGTGGCTGGCTCCTGGCCTCCTTC
-TCCAGGGTCCAGGCTCATCTCCGTGGCCCTCGAAGGGGGGCCACCCCCCTCACCTTCAAG
-CAGCTGCCCCCCAGGTCACGACGGCCACCCTGCAGAGGGGGAGAAAGAGTATAAAGAGGT
-TCGATTAGGCCAGTGTGaacactggaactaacctctgtatccctcaagagggatcctgat
-caataaatcacagttcagccacacgatcaagttctctgcaacagaaagcagaagaaaccc
-tttctggactgatacagactgctgccaaatgacaatgtttagggacaaaagcaaggggca
-gGCTGAATGCGCCTGTGTGCTGTGATTGCTGGGGAGAAGCACACACGGGAAATTGTGAGT
-GGGTTTCTTCAGAGAGGAATTTGATGATGGAGAGAGGATGGGAGGGAGGCTCTCTCATGC
-TATACTGttttttgagatggagtcttgctctgttgccaggctggaatgcagtggcacaat
-ctcagctcactgcaacctctgcctcccgggttcaagtgattctcctgcctcatcctcccg
-agtagcggggactacaggggcccaccgccacacccggctaatttttgtattCACGCTATA
-CTTTTTTACCTTTTCTACTTCTTTCCCATATGATCTGTTGCTTAAAAAAAATCCAATATA
-TTTTAAAGCATAATATTTTACACGGGCAAAACAAGCACACCCCACAGTGGTCCTCCCCCT
-GCCTGACTGCATGCCTAGCGGCTCACTCGTCCACCTTTAAAAGGGGACTCGGTTTCTGGC
-CTCCTTGACTTCCCTCAGGGCGTCCCCTTTCCCAGGAATGTGCTCTCAGGTCTTGTCTCC
-CTGGAAAGGTTTCTCTGTTCCTGAAATTGCCTAGCACTTCCTGCCTTTCTGGGGACATTC
-CATGGGGATGAATCTCAGAAGGACAAGGCAGGGTCTCTCCTTTGTCTCCCCATCTGGACT
-GGGATCTCAGGGAGTGGTAGGGAAAAGGAGTTCTTCACTCTGTGGTCCCATTTCCAGCCT
-GGGCTCTCTTGGCCCAGGACCTGACTTGGAGCAGGCACCAATCAAGGCCGCCTGAATTAA
-GTGGCAGCCATTGGAAGATGGGCTAATGGCGGCAGTCCCTGAAACCATCAGTCCTTACAG
-GGGCTGTCTCTACCAGCTCTTCTCATTGATATTTTCAGACTGGACACATGGGtttcatcc
-tcaccgtaagccagagaggtcacagatgttaaagcaccccctcttttgaggcctccagcc
-actgaatgactggcccagaggcacccagccagttgtaaaagagctgggctagaaatctat
-gttgtccaacaatctgtcctgtttccaGGACATGATAGTGTCTGAAATCCCACTGTAAAT
-GCTCATCACCCTGAGCCTGGCTAGATGATGGAGGAACAGGCAGCTTTCTCAGCCCACTTA
-GAGAAACAGCTGACCATCTGGGAGCTCTGTCCCCTGCCCCCTCCACCCCCAGGTCCAGGT
-TGGGGCAGATCCATCCAGATGCGAGCCCAGCCTCCCTCGAGGCTCTTGCAGCCCAGGGAC
-AGCATGTTCACTCACAGGCAGGGCTATTTTGAGGGCTGAGGCCACAGTCCCAGCAGAGCC
-TGGGGCTTGGGCTTCTCAGACAAACTCTGGCAGGAGTGGCTGAGAAGGGCAGATAGGGGA
-GGGGGTGCAATATTAAGGTTGAATTAGAAAACTGGCCTTCCTCTCTTTTACTCTGTAAGT
-GCTCAGGGACAGGGAGAGCCGCCCCCTCCCACCCCAAGTCTGGAGGTCAGCTGGAGACCT
-AGGGTCCCAGAAGAATGCTGGGACTGttcacctccctgaacctcagtttcttcatctatg
-aaatggggacaaaatgattttacttgccatctcaaggtGCAGTCGAATGTGAATGCAGCT
-GTGTAAGCTGCTAAGTGTACTTAGAAGAGGTCTTGACggccgggtatggtggcttatgcc
-tgtaatcccagcacttttgggaggccgaggcaggcggatcacctgaggccaggagttcga
-gaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaaattagccag
-gtgtggtggctggcacctgtaatcccagctacttgggaggctggggcaggagaactgctt
-gaacccgggaggcggaggctgcagtgagttgagatcgtgccactgtactccagcctgggc
-gacagagcgagactccatcgcaaaaaaaaaaaaaaaaaaGTCCTGACAAGACCCCAGTTT
-GTTTGTCCCTTAGGAACTCAGCACCAAGGGTCTTCGGGAagcaccatggttaggagttag
-gctcaagtgagacagacctaggcttcgatccctactttgccaagggccaactactggacc
-tcaggcaagtgatttcatctcactgagcctcagtttcccccccgtaaaggggaattactt
-tacaggatcacacaagctaatctaggtaaagccttggcacagtgttgggaacaaagtaaa
-tgttcaataaatgttcataagtattattatCAGCATCATCTATGGACAGTGCCTCCTGGT
-CCCAGCTACCCTCTGGGTATACCAACAGGGGAGAGCCTTACAAGATGATCCTGTCCAATC
-CTCACCCCCAGGTGACAAAGGGAAAACAGGGCAGAGACAAGAACCCCCTTTCCACCTCCC
-ACGTGCTAATTCTACCACAGAGGGCCACACCTAACCCCTCCTTCAACAGAAAGATGCTAC
-AGGAAACTGTTTCCACGGCAACCCCAACTCCAGACTGGCCAGGATGGGAGGGAGGTGGTG
-GCTCAGGGTAAAGGAACGGGGTCTTGGGTCTTAAAGCTCTTCTGGCCCACAAAGCTCAGA
-AGGGAGCAAGAGCTCCCCAAGCCAGCCAGTTTTCTTCCAGCAGAGTCTTCAAGGGGCCAT
-AGCTGGCCAGGATTGCCCCTCTCGCCTATTCCCAGAGGAGACCGTGGGGTTGAGAGCATG
-GTTTCTACAGCCAAATTTGGCTGAGTTCTTGGTCCCATAGACAGATCCCAGGGAAGCGGC
-CAGGCCCAGGGGAGGCCCCTGTGAGCTGTGGGACAGGCCTGAGACCTGCAGAGAAGTCCC
-CCAGCCTGCTTGCTATGGGGGTGGACACATGACAGTTACAGGGACTTCCCTCTGTAACCT
-ATCCCACGTCCCaaccaggcaggcctgagtttgaatcctggttccatcactgactgtgtg
-tctctgcgccactggcagcacctctaagcaagtggggataaccacagcgcctcattcctg
-gctgttgcaggattttaatgataaatcataaagagcgcttagcacagATCAGTGCTCATG
-AAGGCTGCTGTCACTGCTGTTATTGGCCATTGTGCTCCCCCTCTGCACTCCTGCCACTTT
-TAACCTCTTCCCTCTTCCTTCTCTAGGCCTGAGCTCTTGCTGTATGCCCCAATCCTAGAA
-CACCCTTTCCTACCCCTTCATCGGCCTGCCCCTGTTCTAAAGCATCCTTCAGAAATGAGA
-CACAGAAACCCTGTCAGCACTCACCCTGGGTTGGAGGCTTTCTCTGGGCTCTGAGAATCC
-CTTTGTGCTTCCCCTCCCCCACCATCAGACCACAGCATCCTCATCTTCATCTCCCTGCCC
-TGACCCTGGGGCTGTACTGTCAGGTCCTGACTGGTGGAAGGGTGGGGACCTACAACCTGC
-TTCTCTGGGGTTCTCAGAGCCAACAGAAGGCAGCTGTTGGGTAGCTAAGGGTTGCTAACT
-GGAATGAATGGGTGAAAGGCAGTCAGGGAGTATCCCTGAGAGCCCCTTCAGGCCCTCCCA
-TCCCAGGAAGCCTTAAAGGCCCACTCCTGGCTTCTCAGCCCAGCCTGGGGCACTGACAGG
-GGCCCACAGCTGGGAGCAGCAGGGACCCTGGAGAGGGCACAAGCCTGAGGCTAAGAAGAC
-CGACGATTCAGGGCAACTGAGGCAGCCAAGTGTTGAGCAACCAGGCTGGATATCTGATGA
-GCCAGACAGAGGGTGGTCTCAGGCCAAGATGCAGAGGCCTCCGCAGAACAGGGTGGAGCA
-AGGGACCAACGGCAGCTGTGAGAACCAAACAGCAGGGAGTCAGGGGCCTAACTCCAATTC
-CCCATGCCCTTCCACTTGGCCACCAAAAGTCAGTACTCTCTCAGCCTCAGTTTCCCCGGA
-TGTAAATGGTAGCTGCTGGAATACAAGTTGTTAGACAGGCTTCTTTACTGTAGGAAAAGC
-CCAGGCCAGAAAGGCACACGGTCGGGGGATGAAGCAGGTTCCTTGGAGCCTGGGCAAGGT
-TTCAGCCAAGAGGCCACCTCTGCTGCCACACAGCCCCCGCCCACCCCTACCAGCCTGATC
-CACTTTCTTGCCCAGGACACATTGCAGGAGCTGCACACCAGCTCCCTCCAGCTGACCCAA
-GAGTGCCCTCTCCCAACACCACGTCCTTTTGGGGGCTGGGGACTCTCAGAGGGCCCCTTC
-TTCACTCCTACTGCTCATCCGCTGGGTACCTCAGGCTCTCGGTTGGCGGTTTGTGGCCTC
-CTTTCTTCTCAGTCTCCTGCTCTTGGGTTAGATCTTAGGACAGGGGACAATTATTTCAAG
-GTGGGGGCAACACACACCGGGCAAGCCCAGGGCCAGCGCCCCGGcttcccagctgagtaa
-atgtgggcaggtgatcccatctctgatgctcagatcctcatcaggataaaatgggcagaa
-aaactacctgcctgaagggattcttgtgaaggcaaaaaagtggatgtggagcgcatcggc
-acagaggaagactccataaaagatgggtctttgttACTCAGTCCTCATGCCGTCTTCCCA
-GCAGGAAGGAAGTTCCAGCACACCTTTCGTTGGAGGGGATATCCCACACTGAGCAGTTAA
-ATCAGACCCGAACTCTGGGTTTTCCCGCATCCTTCTGTTTGGGGGCCTGGGCATTAAGTC
-AGTGGTTCTGGGCTTGGGGTGCCGCACCCAGCACGAATTCCACGTCGCTTCCCCCTGGCC
-TCGTTGGGGACCCCTGCACCTCTCCGGTTCCCGCAGAGGCGCTGCCCCCCGCCTACCCCG
-ACCTGGCGGCCGCAGCGAGGGACGCAGCACACTCACCCCCTTGCGCTGGTTGCTGAGGCA
-GAAGGTGCAGATGGAgcgcggctggcggccgccgtcggcggcggcggggacggcgcccTT
-GGCACTGCCCGCGGCACGGAAGCACGGCTGCCCGTCGTCGGCCGAGTCGCCCAGCAGCAG
-CACGTTGGCCAGGTGCGCGATGTAGCTGGACGCCAGGCGCACGGTCTCGATCTTGGACAG
-CTTGCGGTCCACCGGCTCGGTGGGGATGAGCGTGCGCAGCGCCGTGAAGGCCGTGTTCAC
-GCTCTGAGTGCGGTCCCGCTCCCGCGCGTTGgccgcctgccgctgtcgcaccaccaccac
-ggggcccgcgccgccgccgccgcccgcccgccgcccgcccccggggcccgggccgcgccg
-cgccgcctccgggccctcgcagcagccgAACGACTGGTCCGACGCGTCGCTCTCGCTGCG
-GTTCTCCTCGTCCTCGCTCAGCAGCCGCACGTCCGGGTACAGCACGTGCGCGCCGACGGG
-CCGCAGCAGCGCGAACGCCATGGGCGCCGGCCGCGTCCCTCCGTGCGCCGCGTCCCAGCG
-TcggccgcgccccgccgtgcgctcccgcgcgctcccacggccccgccggcccccgccTTA
-TAGGCGAGGGAGGGGCCAATGGCAAggccgccccggccgggggcggagggctccgcccgg
-ccAATGGGGAGGCGTCCGCCCGGCCAATGGGGAGGCGTCCGCCGCGCCCTGGCCAATGGC
-GACGCTCCCACCGCCTCCGTCCCCCAGGTTGAAAGCGGCCCGGGAGCCGGCGGCCCACCC
-CGAAGGCCCCCGTTCCCGGCTGGCTAGCCCGGCAGATGCTGGAGGTCTGGGAGGGTCGGC
-CGGggtgggcccagatccgaactttttgtctccagcctggaccacctgggagacgcgggc
-agatccctttctcctctctgggcctcagtttcctcgttcggaaCGTTCAGATTGCAGAGA
-AACAGCTAGTGTCTGCCTGCCCTCCAATTCTAATCCTgtagttctgcagctttcacgtgc
-gtaagaactggggaaggggcttttgctattacagagtcccaaattgctcccattctgatt
-gagcagttctggaacgggcccaggaacctacattttgtaacaagccattggtgatagtgg
-tggtgtccgtggagaacacttggagaaAAGCTATAATCTTTCCAAATGAGGATTCGACAG
-TGTCTTGTCCCTGAAGACAAACTTAAAAAGAAGAAGAAAAAAAAAAGCAAAACAAAACCA
-CAATACACAAACACCAGTAGTTCGttcgttttttcaacaaatattcgttgggtccctact
-atgtgtcagacatggttttaggtctgaggatacagccattaacaaaataaattcttcacc
-ctcacggaactgacgttttggttaaggaACTACTGTGTACCAGACTCGGTGCTATATACT
-CTATTGCGCCCAGCTGAGGCTGCAGGATGGCAGCCCTGAGTTACAGGTCAGAGAGCTCCG
-GCCTTCAGTCGTACAGGTGGGAGTGGCGGCGCTAGCTCCAGCCTGTCCGGTTTCACTACC
-TCTTGGAATCCTACCACCACCATCCCATCACACACACACGGGCTATCTTTCCTCAATGCC
-TGCTTGCCTTCTAGAAACCTTAGATTGTTCAGCCTGACGTGTCCTCTTCAGAGAATTGCT
-GAGCCAAAGGTGGTTGCCGGGGTCTCGATCTCACTCGTGCCTGCTGCTCAGCTCTCTCCA
-GGCACTAGCTAAACCAGCATCCACTTGGCCTTGAAAATAAGCCCGAGTGGCAGCCGGTGT
-AGCAGACAGAGCGCAGGGAGTGGAGTTGAAAGGCTTCTAGGTGCATTTTGGCTCCTCTGG
-GCGTCTGTTTTCCTGACGATGCCTGCAGCTCTGCCATGCTGTGCTTTCCTGGCTTCCCTG
-ATCCAGGCCAGAATTAGGGGAAGAAGAGGGAGCGAGGGATTTCCCATGACTGCCGGGGGA
-GGAGCCCCTTAGGACCCAGGGTCTGCGGGAGAGTCTGTTCCCACACCTGGATCCCCCCAC
-CGCCAGCATTTGACCGTGACCCCAGCCAGGCTGGGCTTTGGGGAGGAGGGAAACAGCCAG
-CATGGGCCCCCTCCCCGCAGGGCTGGTCCCACACACAGCCCCAGACCAGGCTGCTGCTTC
-CTGAGCCGATGAATTATTACCGGGAGATTTCCTTCCCTGTCTGCGCCTCCTCACAGGGGC
-TCCCAGCTCACTTCACTTTCGCTTTCTCCCCCTTCTCCCCCTCCTCTCTGCTTCTGACCC
-TCAGGCAGCTTGAAATTCCTCTGTCCAGCCCCCTCCCAATTCCACCTCCAACTGGAGATG
-CCAACCAAGGCGTGAACTGGGCCCGGAAGGCGAAGAGGGGCTTGCCTTGTAGGCTCATTC
-ATTTATTTGCTCCTTAGGCATATTTTGACACTTGGGACCCTGGGAGTAGAAGAAAACCAT
-GAATGAGACTGAGACAGGCCTTCTGCAGCCGAGAGGGGAAGGCGAGCTGTAAACAAAGGA
-TTTCAAGACAATGTGGTAGGAGCAAGCCAGGGTCTGGTATCAGAGAGACCCAGTTCCGGT
-TCCAAGGTTAGCTGcttcccagagtctcagttgcctgctctgaaaatgagataataatag
-tacccattcccagggctggtgatggttccatgagtttgtgccagtagagctgggcttggc
-acacaggagtgctcagtaCCTGAGAGGAGTTTGTGCTACTGTTTTTAGGGGCTGGCCCCA
-GCCAACTGCCTGGGAAAGGGCTGAGCAGCATTGACTTTTCTAGGTCTTGTCCCTGGGAGT
-GCGGAGGGGACTCCTACCACATTCTCAGCTCACCTACACAGGGgacctcagcttccccca
-ttctctgtccctcactctgctccagccacactggcctccccactaaatctggagcccact
-tcttcctggcccccctggcccctgatagtctcatagtttgttcactcatttccttcaaat
-cttcactcaaatcttatctcagggaggcccttcctgaccaccagcactaacagtaatggc
-ttctccaacctgccagcacccccagctctccctttccccttatcctgctttatttctttt
-tatagcatttgtcactgactttcattcattcacttattcattctacaaatattaactgag
-cacctgctatgtgctaggcacagttctgggtactgcggatacagcagtagaGacattaca
-tatttatttgtctaccacctgtctccctccactagagtataagctccatggggcaggtac
-tttgtgtattttgctcatctcacttccttcccaacacaaccttctgaggtaggtattgtc
-attattcccattttacagatgaagatacggaggttcaaagaggggaaagtgacttgcccg
-aggtcacacggtgggccaatgtgggagctgagattggtctgactccaaagccattgctcc
-ttccctaaccacatggcttctGAGGCAGCCTAGAGGCCTGTGAGGGCTGAGTAGGAGTCT
-GCCAGGTAAGAGGAGACAGGTGTCACAGGCTGAGAGGGTAGAGGCTGGTCCCTGCCTCCC
-TGACCATGGGCACCCTTCACTTCTACAAAAAGCATTTGTTTCTCAGAGGCACCTGCTGTG
-CACAACTCTGAGCCTGTGCTCCAGCTGTCCTTCCTGCTTGGAATGCTGCCCCTTTGGGTC
-TGACCAGACATCCCTAGTCCTCTGCCAGTGTTCAGAGTAGCAGATGGTGAAGGCCTCTTT
-GCCACTTTTTGCCAACCTTGCTGCAAAGTCTTGTTGTGTTCATCACACCATATTTTGACT
-TTTCTCCCTTCATCCCTGATTCTCACTTCCATTTCCCTCCCCTAACAGGGCACCCACTCC
-CATATCTTTGACGCATGCCTTTGGATATATGTGTGTCTTTATAAAATGTGCATGGCGTTG
-ATTTGTGTGTGGAGGTTTTTAATGTATATAAATAGTGGTTTCAATAGATCTGTGTCATAG
-GCTATTTTGTTTCCTCGACACTGCTCTGTGtgctgagtccagctcaagtcccttggttcc
-cactgctgctaagcatgcacggtgtgcgtgtgccaccatgcctccttttcccaccgcttt
-agtgatggatgctggctacctccagttcccacctccccaagcaaagctgtgatggacttg
-cagtgtgtgactctcatggactcccgtgtgtatttctctgggatgtacactcgggggcag
-gatccctggggtggagagaatacatacagttactgcactctatgacggctgcctcagtct
-acatgcccagcagcagggcatgagggaccactttctccacatgcaccctagcacttggaa
-ttatctgACTTCCCAATGATGGAGATATGGGTTGTTTTCCATCTCCTTGTGCTTGCCTCC
-ATCACGGTGTGGGCAATAATGAATACTTGTTgcactttgggtggccgaggcgggtggatc
-attgaggtcaggagtctgagaccatcctggccaacatggagaaaccccgtctctagtgaa
-aatacaaaaattagccaggcgtggtggtgtacctgtaatcccagctactcaggaggctga
-gtcaggagaatcgcttgaacctgggaggcagaggttgcagtgagccgagatcgcgccact
-gcactccagcctgggtgacagagcaagactccAtctctctctctctctctctctctctat
-atatatatatatatatatacatatatatatgtatatatatgtatatatatgtgtatatat
-gtgtatatatatgtatatatgtgtatatatatatgtatatatatatataATGAATACTTG
-TTGAACAAATGAATGAAAAGGCTAATACACAGCCTCCCACACCTACCTTGTACCAAACCT
-CAGTCTAGAAGGTGGCGGTATATGTGTGTATGTTTGTGTGTAGAGAGGGGAATATAAGAC
-AAAGTCTTATGCCTCAACCTGCTTAGAGAAAAAGACTaatgacagttagcatttattgag
-ggcttactttgtgtcaagaattCATAGGTGTATATTCACAACCTTAACTTCAGTGAGACA
-AGTAAAATGCATTTCTCTCTCATTCAAGGCCTTTGGAGGTAGGGCTGCTCTGGCATTCCA
-CAGtgtggtcgccagcttccaagattgccagcaatgatccttgcctcctagtattcatct
-gcgtgtgtagaaccctcccccattgaatcagatttgactcatgtgaccaaaagaatatga
-cagaagtgacggtatgtgacttctgaatgtagctcataaaggcattgagctcctgccttg
-ttctcttgagtcatttactctggggacagcagccaccatgccatgaggacactcaagccg
-tctgtggagagagaccaaggtccctagcctacagccatcaccaatttgccagccaagtga
-gtgagcctccttggatgtggatcctgaattcctgacctgcaggacctgtgaaaaagaaga
-aagataatacagaaagacaaagaaaaaagataataaataattattggctgggcgcagtgg
-ctcacacctgtaatcccaggacttcacaaggctgaggccaaaggatcgtttgaggccagg
-agtttgagaccagcctgggtaacatagtgagaccctgtctctaaaagaaaaaaaaggaaa
-agaaatttgctggatgctctggtgcatgcctgtgttcccagctactctggaggctgaggc
-aggagggtcgcttgagcccaggagtttgaggctgcagtgagccatgatcacaccactgca
-ctccagcctgggcaacagagcaagaccttgtctctaaaaacacaaaaattatcaatgttg
-taatcccgtaagtttagggtgttttgttatgcaacattagataactaaaacaGATGGTgc
-cggggacccaggctctgtctatctttttactgcaccatacatagctttcacttcctagtt
-ctcttacagagccacatggccacaggagccattctatctgcattccaactggcaaaaagg
-agaaagaggcagaaggaagagcatgctttaatctgtagaacaccaacctcactccgttca
-catcccgttggcaagatcttgtcatttgaccatacttaactgaaaaggaggctgagtata
-tagtcttttgcaggtaggtgtccgtgtgtgcagctgaacactgggtttctgttagtgagg
-aagaagggaagaatggctattgaaaacaactaacCATAGGTGTTATATACCATAGGTGTT
-AACTCTGGAGATAATAATGTCACAtggttaagtttgcacatttgggagcctgactgcctg
-gtttcagttctcagttaggccacttaccagatgtgtgatcttgggaaatttaccaaactt
-ttctgggcctcagtttcctcatctgtaaacagggctcacagtaaagcctgcctcataggg
-ttgttatgaggattaaatgagtcaatgtatgtagcgtttataacagtcctggcacatggt
-atgtgctGTGTGTTAGCTGTTTTCATTATATAATCCTTACAAGGGttttttttttttttt
-gacagagtttcacaattattgcccaggctggagtgcaatggtgcgatcgcagctcactgc
-aacctctgcctcccaggaggattctcctgcctcagcttcccatgtagctgggattacagg
-catgcaccagcatgcctggctgattttgtatttttagtagagactgggtttcaccacatt
-ggtcaggctggtcttgaactcctgacctcaagtgatccaccctctttggcctcgtaaagt
-gctgggattacaggcatgagccaccgcgcctggccACAAGGGGTTTTCTTAAGTTCTCAC
-AACCAGCAAGTGATGGAAGCAGAATTTGGCCCAAAAGCATTTTTTTCCACTTGCGTCATC
-CCATAGAAATTCGTAGAGTGCAAGATCAAGAcccagatcagtacaccgcacataatacgc
-atccagaaatatctgtcgaatgagtgagtTAAATAAACACGTAAACTGTCCTTACATAGA
-GATGCTAGGTTTTGTTTGGTTTTGTTTTATGTTCAGTTAATGAGAATGCTCCATTGACCC
-CATCTGGTTCCTCTAGTATGGGGCTGATGCCCTTGATACCATGCTAGAACTCAGTCCCTC
-CAGGGTCCCTCCAAGCCATCATTTTTAAGGGTGAATTCCTGGGAACACTTGTTCTTGCGG
-ATGCTCAGGATTCCATGATTTTTTttaaaaaaagtcagagaagctgcattttatatcccc
-ctcctagcgacctgcaacaacattagcatgttaaagagtcggagaaatcctgcaacaaaa
-aagcttgttgggcttcatttcaatctgcattttgttttcttatttttttgagacgaggtc
-ttactctgttgcccaggctggagtatagtgatgcaatcatggttcactgcagcctcgacc
-tcccaggctcaagcaatcctcccacctcagcctcccaaataactaggactacaggcatgt
-gacaaacccagttaatttttaatttttttgtagagatttaatttttttttttgtaggcaa
-ctatgttgcctaagctagtctctaattcctggactcaagcaatccttctgccttggcctc
-ccaaagtgctgagattacaaacatgagctaccgtgcctggtctcaatctgcattttctga
-gcttatttTAGGCTTACTTGATTAAAGACTCACTTCCTGCCCCCAACACCAGACACCTAA
-TAGAGAATACAGTTTAGCAGACATTTCTCCGGGCTGTTGCCACTGACATCTACCTCAGTG
-TGAGTGGGTATCCATTCTTTCTAGACAGCATGTTTGATAGGAGTGAAGTGGAAGTGAGCA
-GGTGGGTGCTGGTTACCAGGAAGAGACAGGGTAAGAGAGGGAACATACAGGCATATGTCC
-GAGCCCCACTTTCTAAGGGACATAAAAATATCATTGAAAATATAATAGGTGGAGAAAAGT
-GTATTTCGTGGTACTTCTTTCAGGGAAAATGCAATGTAAATTGAaataataatattattg
-aggggtaacaatatgccaggcactctgctaggaacttatttaatcctcacagcagtctca
-tgagctaagtactattaatattcccgttctataggtgagtagactaaagagcagaaaggt
-taagtaatttgcttaaggtcacatagctagggagtggacaggaattcTTTGATAAGTTGC
-TTGTGGTGAGGATAACAAGGGAAGACCCTCCCCCGGGGTAGTTTAAGCTCAGATGCTCAC
-AAAACTCTGCTCCAGGGAGAGTGAGCCTACTTGGTTGAAGAGCACTGATTTTGTTGAGTA
-GAGGATGCAAGTTTGGGCCAGAGTGGAATTGTTCAAGAATAGAGAGGAGGTTGGTGCTGC
-CATGGGTGCCCTCCTTCAGCTCCATCGCTTTAAGGAAAGGATGAGCTCATGTTTAAAGAC
-TTTTAAGTTGAAGGCAGTGCTAAATAATTTAGTGTGGTCAGGTACCCACCTGACTCAGGT
-TGACCCTGACACCAGTGCCAGGTGTGGCAGAATCACCAAAATGGTGTGGAAGATCAAGAT
-AATGCTAAAtgaaactaccatttaagtctgctttgaaaactcaaggagtttggagctcag
-agttgccaagaacaagttggaatggcctgaggctgccatgctatgaggaagcccaggcca
-catggagaggccacatgcttttgactggtcgttctggtctttcaattctcccagctccag
-gaacagacacatgagtgaagaggctttcatacaattccagccccagttatcgagtctttg
-ccattgaagcctcagacatcatggacagtgacaagtcttcactgctctacccattctgaa
-tcctgaactacagaatccgtgagcataaggaaatgcttaagacaccaaattgtggggtaa
-tttgTCACACAGCAACACTAATTGTGACTGTAGCTCACTAAAATGCCTCCCAAATATTAT
-CTTCACAACTAAAAGCACCAAAAAACCTGAAAGTAcagttgaatttcatgatttgctata
-attatattctagaaagtcactgcaaacactgaattagcaaatactgaaccactgctccta
-ggagaaatacaggcttaggttcctgtgaaccattctgttcccaacatgttcatcaactca
-tcaatacttaagcttgttttatgcatgtttctgttgaaagacaccatgtttaatacatat
-tgttgattcactcacattgcactcatggccaacagcactgtaactcacgcctgaatgaag
-cttatctaactcacatgatcttctctgtaaggcacatcaaagccttctggtgcttaggaa
-cattagacagcacctcagcaccatgcccggggccattgtcaacagtacaatcaccagcgg
-aagacacaaaaatttgtaaaatgtggcactgaatagactgaaaaggacagttgtttacag
-tgtgagagctgaaagaagaaggcagcgtgtcactttgtatgatctcacctggaaacatgc
-atcaagtgactcaaaaaaaattttttttttcgagacagggtctcactctgttgccaggct
-ggagtgcagtggtgggatctctgctcactgcaacctccgcctcccgggttcaagcagttc
-tcctgcctcagcctcccaagtagctgggactacaggcacacgccaccacacctggctgat
-ttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcaatcgctt
-gaccttgttatctgcccacctcggcctcccaaagtgctaggattacaggcgtgagccact
-gcgcccaactggcaactcaaatttttcatgactcctcaagtatccatcaatgaccatgag
-agctccagcgagtgttgattttgaggttacaaatttagtgagtagatgaatccacgactc
-cacaatcagtgactaataagaattgactgCATTATTTAATAAGTTCAGGGCTTGCCGTCG
-TGATTCACAATTGGAGAAAGCGAGGCATGGAGCAAGTCCAGGGGTGTTCCAAAAGGCCTC
-ACTTTTCTCCTTTGCAAACTGTGGCTGATGAGGGCCATCCTGCGGGGTTTGTGGAGAGAA
-GGGATAGTAACAACAGCTGCATTGTATGGTGCTAtgtgctgcacactttgcacacctgat
-catttaatactcacaatgatccctagcagatggatcctattaccaagttcattttacaga
-tgaggaagcttagacccagcaaggttaaggggctgtgctcaaggtcttaccttctaggag
-aggcagagctggatctgaagccatttctgttctcagcccctgctGTGTGCTTTCCTACCA
-TCCTCTCCAGACTCGCCCTGAGCCCAAGTTGCtgaggcatgtggcacggtgcctggcaca
-cagtaggctcacagtagtggctgctttGATGATGACCATAAACTGGGATCTGGGGTCCTT
-GAGATGATTCTACCAAGGGGACCCGGGGGAAGCTGAGCCCTGGGGCAAAGTGGGGGCCAG
-CACAGGAGCTGCTGGGGAAGGAACAGAGCCTGTGCGGTGGGAAGATAGGACATGGAGCAA
-AGAGGATCTTGAATCAGACCCCGTGGTCCCCTCCTACAGAGGGTTAAAGCAAGCCAGCCT
-CCTTCCGGCTGAGCGGAAATCAGATTTTGAGAGCTGAGCAGGGCTCTGGAGGGATGTTTT
-TCTTCTCCATTTGTCTGCTTGTGGCTGGCCCATAAAATCCACCGGAACTCCATGCTGGAC
-TGAGGAATTCCTGCTGAACAGGGACATGGAGAACGCAGGCTGGGAGGGGGCATAGTGTGG
-ATCCTTATCAGAGCAGAGACCACCCCATCTTCAAGGCCCCACCTCCAGGTTGGGTGATCC
-CCTCTGGAGGCCTCATAGGATTCCTGGGTAAGGGGAGGGACCAGGATCGACAGGGTGGGG
-GAAAGTCCAAGGAACAAGTGATACCCCCTCCCACCTTTTCAAAGTGAACTTGTGGGGTGA
-GGAATGAGAGGAGACAGGGAGGGTCAGGCTGTGGCAGGTCAGTGAAGTGtgatgcaggtt
-ccaccttctacgctgtgtgacattgggcaagtctctgcccgtttcctcatcattgcaacc
-agggggctggagctagatgaccaccatgtgtaattttctaatcagagctgacagtctgag
-gctctTTCTGTCTAGTTTGCACCTTGCATGCATGTCCTCCCCTGAAGGCAGTGCAattat
-tataacccctattttaaaggtaaataaaccaaggctcactgaggcaaggtgacctgagca
-attttgcccttgaagggctgggacaggatgcaaacctagacaattggtgccagaattcat
-ctctcaagcattcgctctcctgCCTCCCAACACGAGTTTCTACttctctttgccctggga
-tgacctctcctttgtctcttggcttgatgacctcatttttaaagattcggctcatgcatc
-acctcccccaagaagcctgtcctgactaactaagctcggttggggctcctctctgtctgc
-tcatgcctctgggaagtagctgtctcttttggtcactgggctgtgagccctggatgagca
-gagccacttctcattccttcctgtgcctcctgcatcAGCCAACATAAAAAGCTTTCAATT
-TTCCTTGAAGATTCTAAGTGCTTGTGGTGGTTTTAGAACATGGCTGCCTTAAGAAGTGGG
-GTCCATTggtagctcatgcctgtaatcccagcactttgggaggctgaggcaggaggattg
-cttgagcccaggaagctgaggccagcctgggcaacacagcaaaatcccgtctctacaaaa
-aatacaaaaattagccagatgtggcagcatgtgcctgtgggctcagccccttgggaggct
-gtggcaggaggatcacctgaacctggggaggtcaaggctgctgtgagctgtgattgcacc
-accgcactccagcctgggtgatagagggagaccctgtctcaaaaaaaaaatggggtttat
-gtctcctcctcttgagtctgggtgggctcgtaacagctttaaccaatagaatatgtcaga
-agtgactctgcgactactgagactgttcactggcactctgtttttggagccctgagctgc
-cgtagaagatgttcaaatactctgggactaccatgctgtggggtcacatgtaggccctcc
-tagtcttcaagtcatcctggtctggggactccagatgattccagttcttagttgtttcat
-atccagcctttgagtcctcccggctgaggaccaagacaccacggagcaaaaacaagccat
-ccccaccactcctggcccgaattcctaagcataataaaatggtggctgcttaaagccacg
-gagttttggggtagtttgttacacagaggtggtaacgggaacaGtgcgaccaccctgggc
-atgtcaccttcctctctggccagccagaaggtgcagcagccacaaagctctctgcctcct
-cccttccctcagcggtgtgctgctgacacagcagtcagagatgccccataaatgcttcaa
-acagaccatgtccctcctttgctcaaaaccgtctgttggctcccagctcactcagaggaa
-atgccagattcttaccatggcccacgggccctacatgatgggacccctctccagcccatg
-gcctctctgtcctgtctcccaccctctcccttctccagccacaccacctccttgctactc
-cttgaacaccacatacgccctgtctcagggcctttgcgcttgccaaggacagtgctccat
-tgcctggaacattctttctccaggtgttgcttggttcagtccctcatcttgttcatgtcc
-ctgctcagatgtcatcttctcagtgaggccctctcttcctactcccaaaccccttgactt
-gctctattttcctctcgccatggcccttagaactacctaacacactatgcactttactta
-ttgtgtttccccgcccaccccgtccaccctagaatgtcaataccacagggcaggaatctt
-ggttattctttaatgtctccccagtgcctgtaagagtacccaacactcacagtggtttgc
-tgaatgaatgaatGAATGAGCTGTAGGAGCCCAGAAGGGGTTCGTTGCCTTCCCTAGGAC
-TATGTATGTGGGGAAGCAGAGTGGGTGAGGAAAGGGCAGGATTGGAGTGACTGGGTTGAG
-CCAGTGTGGCCAGGGCTGGAGGACATTTCTTGGAAGTGACAACTCACTGCCCAGCTGGGG
-AATCCTGAGGATGGGAGAGTGCAGGGCAAGCCTTTGAAGATGCAAACATGGGTCGTCTCC
-GGGGCCTCCCTCCTTCCTGGTCTTGTGTGTCTCCGGCCCTGCCAGTAAACAGGATCTCTG
-GGCAACTGCCTGAGAACCCTGCCCAGTGCCCCAGAGGCCCTGACGTGCTCCTTCCTGAGC
-TATAAATCAGGTACCTTCCAGCTGTGTGACATCCTGGATTTGATGGGGAAGGCAGAGCAG
-ACAGATTTGTTGCAAAGAGCTGTGCActgcaccttgatttccttgttagcaaaataggaa
-ggataggagcgttgacttcaagctgtggctgtgaaatcgagtgagataatgcatgaaaTT
-CCTCTGTAAACAGAGATGCTTCAAGGACGCATTAGTGGGTGGAGGCACAGGgagcaaatc
-ccaactctgccgctgagctctgtgtcttcacctgtaaaatggggttaatgtgaatcacta
-acttcctagggctattgagggattcaaaaatggagagaaaagtcttagtacccaatgaac
-gtgcaatagatattagctgttattaATGGTAACTATTACCATAATGATAAAGAATCAGAT
-GTTATTGATAAGCCATTTGGGAGACCGAGAGTCTCAGTTCATACCCCAGAGGGGACCATG
-GACTTGGCACAGCACGATTTCAACCCTGTGCCTTTTGTGTATATTTCAATCTGGTCAGAG
-ACTATCTCCCACTCACAGGCCACCTCCTCCCCCTACCCCCAGAAAGGCTATACTTGTGAG
-CACACCACTTCCCTAAAATATGCCACAAGAGTCGACATCTagccaggcacagtggctcat
-gtctataatcccagcaatttgggaggccaaggtaggaggatagcttgaatccaggagttc
-gagaccagcctgggcaagatggtgaaaccatctctactaaataattttttaaaaattagc
-tgggtgtggtagtgtgcacctgtagtcccagctacttgggaggctaaagtgggaggattg
-cttgagcccagaaattcaaggctgcagtgagctgtggttgtaccattccacttcagcctg
-ggcaacagggcaagaccttgtctctaaaaaaatttaaaacaaacaaacaaacaaagaATA
-AATATCTAGCCTTGAAGCCAGCCTTGGGGGTGGGGTGGGAGGAGGACTATTTGTGtgcag
-gagttcaaacccaggccccatcactccccagatgtggaaacttagacatgttatttaatt
-gtcctatgcctcagttccctcaactgaaaaagagaataataatagtacccatctcttcta
-gttgcattgaggactgaatgagttaaAAAGTACCcaacacaccatatgagataatgctat
-tttcattctaccaatgggtaaactgaggctcagctaggagaaagaacttggttcaagCTA
-TCAGTCGTGTTGTTTATTGGCCCTAAGTTGTGACGAGTTTCATTATACCATTAGAAGCCC
-CCGAACAGTGAACTCATTGTTTGTGAGGTATCTCTATCTCTTAGTGATTTTTTAGTTAAA
-TGAGAGTCCATGCTAATCATTTATAAAAAATGGATAAGATAAAAACTTAACATTGAAACA
-TCCATGGGCTTCTTTCCATAAGAAATGGAGAAACTCTTGCTCCTAGTATTAAAAGGTCGT
-GGGTTCCAGTTTGAGATGCACCAAGCAAGGTAATAGGAAGTCCTTGAAGGTTCTTGAGCA
-GGGGGAAGCATGAACTTAAAGCATATGAACCATGTGTTTGGGTCAATTCAagttactgag
-acttagacattgctggtgggatgcaaattgctacaatctctgtggagggtgattgagttc
-cacaaatatttaagataaatgtaagagctcctaccAAAtgccaggtgctgttcaggtgct
-aaggatttgcagcaaataaatccaaccaagtccctctgcctggtgcttattttctggaga
-ggagacacacaatgaatgaatatacaacttagtatagcgtgCACTGGGGAAAGAAATAAG
-AGCATTTCTACAATAATGTTTACTGCAGTGTGAAGGGGGATCTGAAGAGGCTGGACAGAG
-CCAAGTATGGGTGAAGATGTGGAGATAGCGCTGGGGGTGTGTGGACTGGAGCTGCCATCT
-GGAGAGCAATCTGTCCAGTTAAATCTGTACATTGggtgcataaattatggccaccaatta
-tttgacattcctcccatctagatgtaggtctatgtatctgctctctgaatctgggctggc
-ctctgactgctttgacaaacaactatggtggaagtgatgatgtgtcagtttccaggccta
-ggctttaaaagattggcagcttctacttcctctttcttggaacaattacttgaggggaag
-ccagctgccatgaagaactccagccaccccaagactgccattctgtgaggaagtcccgcg
-aacaatggaaagaagtcctctaggatgagacaccatgtgatggagagagaggccaggaac
-atcaaggctgtagacatgagtgaagatgccatcttgaaagggaacctccagccgtagctg
-tttcagttgataccacaaggttcagaaaggagccacccagctgagtccttcctaaattcc
-tgactcacaaagtaatgaacaaagtggttgctttaagcctctaagttgagggtagtttat
-tgtagtgcaaaagataaccagaataGATatatccgatgacccagcaattatactcctggc
-tatatgtccagacaaaatTCTCTTATCAGCCCATAGAGGATATGGCCATATTGTTGTGGC
-AACAGAGAGTTAGAGGCCACTCAGGTATCCATTACTGGGGTGGTAGAAAGGAATACATGG
-TAGGTGCAAAGAGCTCTAGGCAGCAATCAGAAGTCACAGGTGAAGCCACACATACAAGTC
-TGTTATGTTCTACGTGAAGACTTATACACCACAGAATGCACAAAGAACCCATCAGAATCT
-ATGGAGGTGCAGAAAATATGAAGGGGAAATGGGATAAAAAGGAATAACTAGAGAGAGAGA
-AACAAAACCAAACAAAGGAGGGTGCACAGGGGTAAGTTATGATAATCTGCCATGAATTGA
-GGTCTTATTAAACTCAACGCTCTACATTTAAAATCTAAAAAgtaataacaaaggccaaca
-aaattaatgtgtgtgaatagggggttggttaaataaattgtagcacatccacatgaggga
-gtactgtaaagccataaaaaagagtggcagagcttgctatgtactaacatgtaagagtcc
-caaagtatgtcgaaaaggctataagaagggtattgaaaaggatgcataataggcttccat
-ttgGGGGGAGATACCAGTGTGTGTGGTTGTGGATATGTTTATAGACAAATGGTATATCTG
-TGGAAGGATGCTCCTGGGGAAAAGAGCCAGATGTCAGGGGAGAGGGGTGGATGGCACTTC
-AGAAGAGCAGGCACCCAGGAGCTGTGTTCAGAGAAGGAATTGCCACTAACACTGGGACCA
-CCTCCTCCAGGCCAGGATCACGCCAGGTGTGGGGGCTCAGAGTGGGCAGAGAGCCTCTGC
-TGCTTCCAAGATGCCCAGGGTCCTGACTGTGTCCATGATGCAACCTCAGCCAACAAGTTG
-GTTGGGCACTGCCCACTGCTGTGCCCTCATCAGCCACTGTCCTCACTTCATTGCCACTCA
-CCATCACCACTCTCCTTCATTCTGCCTGAAACACTCCTCCCCACTGCCCGTCTCCCTCTG
-TTACTTAATACTCAAACTAGTACAGAGAATAACAGAATAAAATCCCATGTACTCACTGCT
-CAGTTTAAGGAATAATACttttcttttcttttttgagatgaagtctcgctctgttgccca
-ggctggggtgcagcagcgtgatctcagctcactgcaacctccgcctcccagattcaagtg
-attcttctgcctcagcctcctgagtagctgggattacagggatacgccaccacacctggc
-taatttttgtatttttagtagagatgggatttcaccaagttggtcaggctggtctcaaac
-tcctgacctcgtgatctgcctgccccggcctcccaaaatgctgggattacaggcatgagc
-cactgcgcctggccTAAAACTTTTCAAAAAGAATTGAGAGTGAAtggttttaaatatgtc
-cacaaattcttggacactcctctcttcaaaaagtagagttacattctccttacctttgag
-tatgggctgagctcagcaactcatgtctaatgaagaggatgtggtgaatgaggatgggtc
-acaaaagggatacaacttctgcttaattgtccatctgtccgtctatctctccatgctcac
-ttttggaatccagccaccatgttgtgatagaacccaagatgcatgggcgggcccacatgg
-agaggaactgaggccctctcccctcttcccagtccctgatcaacaaccatcacaaatttg
-ctagccacccagatgaaccccctttggcttggcagcaaattctccagcttaccctccaac
-tccccaacccgataggccttcagatgactgcaggcccagctgacagctgaatttagcttc
-ctgaggaccagaaccacccagctaaaccatgcccatattcctgccttcagaaactgtgag
-atataaaaaatgactgttagtactttgaaaacattatgttttgggatgatttctaatgca
-ggatcgattgctaatacaGAGGGTCCCTGGTATCCCTCCCCACCATCCCCATCCACCCTC
-TTAGAAGCCACAATCCTGATGTTTATTATTTCCATGAATGTTTTACCTTTTACTACATAT
-AATAAATCCTTACCCAATACATAGGACTATAtttccttcttttttaaagaattttttctt
-tttgagatggagttttgctcttgttgctcaggctggggtgcaatggcgcgatctcggctc
-actgcaacctccgcttctcgagttcaagcgtcattctTAAAAATGtatagaagtgcatat
-atattgtatggattctgtgcatcctacctcgcatgctcttttccttgcacagtgtgcatt
-ggcgacccatctgcattgaggcaggcagctgccattcgttggcactgctgggcattcttc
-ccttatatgaatatgttaataccacgatatagtatctgaagtccatgttgatgaacattt
-ggatggtttttattttttgctattacaaacaacagcgctggtaacatccACTTGCCCTCT
-TCCCTCTTTCACATGGCACCTTCTTGTTCTTGGAGGTCTCAGCTCTAACAATGTAACCCC
-ACCAACCCCCCGCTCCAGCTAATGGGTTCTCTGTCCCCACATGTGCCTCCCAAGCTGGCT
-TTTGATGGTGctccctctgtttttccttctggcatctactccgtgtggtcaacattcagt
-tatcttttcctgtctggagctagagggtaagccccatgaaggcaggcagagtagtgggtt
-tttttccccagtcccctccatccctgatgctttgcacagggcctggcacacagtaggttc
-gcaagaaaaattgttggatcaggaatgGCTGAGAATTAGcttcctctctttgggcttcag
-ttttcccatctgcacagtgaaaactttagataatttcGGGGTGATTTTAGGTTTAGCCTT
-TGAGAGGTGCCTCAGTGGCCGCCACAAAATATCGGAAGACCCCAACTTTCAGCAGAGCTG
-GCCTTGTTTCCCTTGTGTCTTAGATTGGTCTCTATGGCAGATTATGTTTAAAaagaatag
-ccaccatttattgagcgctcactacgtgataggcatgctgtcagctggcagatgcatttc
-ctcattttggccactcattaaccctcagaagtagcactgttactatgctctttataaaga
-ggggtaaactgaggcaaagagaggtgaagtcacttgtcagaggactagcaaaggagggag
-ctgggatttgtagcacaagagactatcagagcccattcgccaaccctggtgcagccctgc
-cccactgGTACCACAGCTTTAAAGAAGTGGGGTGGGAGGCAGAGGAGGAGGACGGTGAAG
-GACAAGGGTGAAGAGAAATGTTTGGATAAGTTTGACAGCCACTCTTCTGAAGGGCTTTGC
-CAGCCGCAGCATTCGGGTGTCCCTAGTCACGGGGGCTCCGTCACTTCCCTATCCCCCTGT
-TTCCCGGCCCTGATgggtcttgctctgtcacccaggaggctggagtgcagtggcgtgatc
-acagctcactgcagcctggaactcccgggctcaagtgatgttccccatcagccttcctag
-tagctgcgactacaggcgtgcaccaccatgcccagctaagttttaaatgtttatatagac
-acagggtctcactatgttgcccaggctggtctcgaactcctggcctaaagcaatcctcct
-gtcttggcctctcagagcactgggattaaagtgtgagccactgtgcctggctGAGattta
-ttgatcacatagatacctatattattctaagtgtttttcaagtgacaactcatttaatct
-tcataactgtcctgtgacgtagatagtatcagttttatcagtattttatggagattaagt
-aacagaagcacagaaaggtcaagtaacttgcacagagtcacacagctggtaagatgtgga
-cccagctttgaatccaggcagtccagctccagaatccttgtgcttcacATCACCACACGC
-TGCCTTCACCATCACGTGTCAGTTCCACACAAGTGGATGCCCACAATGGTTGGGAGTAAG
-GGGAAAAGGAGTAGGGCTTGAGGAAAAAATAAAAGTGAAGCGTGTGATGATAATGAGCTA
-TGCTTGAGAAATGGGATTAACTCAGCTCTCTGTACTTGATAGAaaaaagaaggagaagga
-ggagaggaaagaagaagaaggaaaTATTTAACTGGACTCTCCGGGGCTTAATTATAACAA
-CTGTCTGGCACCTAAGGTCCTTCCCTAGCTGGGcttgctgcttctctaatctcatttccc
-tacgtttctcacggtgctccagtcactccaggccacacctgatcccagaaacctacttgt
-tcctactttgagcctttgcttgtgctgtttcttccattaagggtgccctttttgccaggt
-gcagtggctcatgcctataatcccagcactttgggaggccgaggtgggacaatcacctga
-ggtcaggagttcgagaccagcctggccaacatggtgaaaccccgtctctactaaaaacac
-aaaagttagccaggcgtggtggcaggtgcttgtaatcccaactacttgggcggctgaggt
-gggaggatcgcttgaacctgggaggcagaggttgcaatgagctgagatcatgtcgctaca
-ctccagcctgggcaacagagctagagactccgtcacaaaaaaaaaaaaaaaaaaaaaaaa
-agagtgctcctttccccattttaggaactcctacacatccatcaaaacctggcctaaagg
-ccctctcctcaatggaaccttttccagcctttcacttcttggggttcccacagcccttta
-catgtctctattctggttggctcacctgctagccagtgagctcctggaggacagggatgg
-gtctggctcatctctttaaccgccatgctgagcccagagcctggtaaatggtgggtgctc
-tataaGCTCGTGCCCAGTCACTCACCTTTACAGCTCcagtgtctggctgacagtgggtgc
-tcagtacatgtggttggacagatcaatGAGTGAATATTTGACGGAAGGGTGAATAATGAC
-ATCAAGGCTGCATTCCAATAACAGCACAATCCCAGTGCTGAGAAAACAATTCACAGCCCT
-GGATTCATATCATGGAATTCTGATTCCTAGGCCCCTTTGTTCCCAGAGCTATCCGATGAT
-GCTGAAGAAGAGTCCCTGGGCATCATCTGTTccagctgtgtgaccttgagcaagttgttt
-aaccaccttgtgccccaagattctcatctgcataaagaagagaaatagctacaccttcct
-catgggctagttacaaggatgaaatttgatcatatgtgccaagcacttaacacaacacat
-gaacatCACGGCATTGGCATGTCAGCTATGCCAATGACTCTATTTATACCTGAAttttta
-tttgaaataatttcagacttacagaaagtttgcaataataatacaaagaattcctacata
-ccatcacccagattccttaaatgttaacattttgcattctttgctttttcattctctctc
-agcatatatttttgtccagtgcctgaattgttggaaataagttgcagacatgttgactct
-ttacctctaagttaattatcccatgtatatttctaaaaacaagaatattctcttacaaaa
-tcgcaggacagatagaaaaatcaggacactgatacaatgctattgtctatcttatagacc
-tattgaaattttttcagttctactaatgtcctttgtagcaaataaacaaaaagatttcta
-cccccccaccccacccactcagtaaccagtccaggacacatgttgtatttaatgtttatg
-tctctttagtcttctttttagtcttatctggagcagtttcttttttttgagacagagtct
-tgctctgttgcccaggctggagtgcagtggtgccacctcggctcactgcaacctctgtct
-cccaggttgaagtgattctcctgcctcagtctcccgagtagcaggaattacaggcgcctg
-ccaccacgttcagctaatttttgtatttttttagttttaccacgttgaccaggttggtct
-cgaattcctggcctcaagtgatccacctgcctcggcctcccgaagtgctgggattacagg
-cgtgagccactgtacccagcgtggaacagtttctttggcttttatggctgacattatttg
-aagagtttaggccagttttttgttttgttttgttttggtttTTGAagatggagtttcact
-cttattgcccaggctggagtgcaatggcaccatcttggctcactgcaacctccgcctctg
-ggttcaagcgattctcctgcctcagcctcctgagtagctaggattacaggcgctcgccac
-tatgcctggctaattttttgtatttttagtagagacagggtttcaccatgttggccaggc
-tggtctcgaactcctgatctcaggtgatccatctgcctcggcctctcaaagtgctgggat
-tacaggtgtaagccactgtgcccagcctggaacagtttctttgacttttatgatcaacat
-tatttgaaaagtttagaccagttgttttgcagattgtccctctgtttggatttttgtgtt
-atttctttatgcttggattcagatcaggcacttgtggcaagaacaccgcatcagtgacgc
-tttgtccttcacagtgcgtcccatcagggggcccatgatgcctgccgacttgccccacta
-ttagcaatgttcactgtgatcatttggtgaaggtggtgtctgccagttttccctactgta
-aagttaccatttttctctttgtaattaacgaataccttataggaagatacactgatacta
-tgtaaatattctgtttctctttatatttcctgcccatatatttcctagcaggatgatcta
-ttttgcaatagatgcaattattatttgatAAAGGAATACATAAACATGGACCAATATTCC
-AACAGTATAAAAGAGTGTAAGGCAAATctcccacccactccgtccccagccaccccgatc
-ctctccccaagccatccctagtctcactgtttcttgtgtccttccagaaatgttctatgc
-atagacaagcgaatccactcatccatcttcttctcgagttatgtgcatgcagaaggtagc
-taaatagacacatgatctgcatcttgttttatttcatttaatattttggagaccatttca
-tatttgaacacaaagaGAGATCTCTTGCTGATTTTAGAAACTTATGTCCATCTGAGGTGC
-AATCCCAGGGtagtcaatctctttcaggttcacaaataaggaagctgagactcagagtgg
-ggaagggacaggtcccaatgtcagaggcaaaacagacTTGGAAACCAGCCTGGAACCCCT
-GAATAAGAGAGTTGACAGGTCTTACTATTGGGGAACCAGTCCTTCCAAGGGCCTTTTCAA
-CAAAATGCCAGACCCAGGCTCATGCCCCCGTTCTCAGCCTGGCTTCTCCCTCCTTCCCCC
-CTCCTCCCCTGGGTCCCTTCTTAACTCTCGTTAGGGACTCCCCTCCAGCTCCCTGCTGGG
-CCAGGCCTTGGGAGCCCCATTGATCCTCTGACAGCCCAAGACAGATTGGTGGGGAGTGTG
-TATTCAGGTGCAGGCGCCAGCACATGGAGGCCAGATGAGAATGGGGTGGAGGGGGTCAGG
-GGCCTGCTGGGGTGGGGGGATTGAGGATTGAGGAAGGCCAGGATAGTGCATCCCACAGAC
-ACCTGCCTCCCCTCTTTCTCCCCCACCAATTCCTGCCCTTCTTGGGGCTTCTGTTCCTCC
-CGCCTCCTCTTGCCAGGCGTGGGCAGGCCAGAGGGGCTGGGGCAGGGCCTGGGAGGCCTG
-GGggtgtagcagagagaagtcgggatggggagtgagccttgcttggtttgatctcagctc
-aggccctcttgtgagactcaggcagatgacatctcttgagcctccgtctcctcggggcaa
-taagaaggaaataaACTTCATACAGCGTCCAGCAGCCAGTGAGGCATGGCCAGTAAAGGT
-CTCCATGTCCTTCATTGGCCTCTTAAGGCTCCCACTGCATTGTTCCTGTCTGATTATGGA
-AGCCCCCAAGCCAAGGCGGCCCCTCGGCTCTGCCTGCGGAAAGTTTTCCCTTCACCTGCG
-CAGACCAGGCCGATGTGGCCTCCAGAATGGAGGGGTCAGCCTAGGTTGCCTGTGACAACT
-CTGAAAGGCCTTAGGAGGCACAGCATCTCAAGTGCACACCCGAGTATGGCGTGATCTGCA
-AGGGGAATAGGGGCTGGGGGGAGACATAGGCTTTGAAGATGAATCAGGCTGGAGCAGGGT
-GGAAGTGGGCTCAGGGAGATGGAGCAGGAGGGGTTGGTCAGGGAAGAGGGAGCTCAAGGG
-AGGAGACATAAGCGCAGAGAGTGAGATAGATAGGGACCCAGCAGCAAGTGGGCTCAGAGA
-GGGGCTGTGGTGCAGAGAGAATGAGACTCAGATGGGGGCTGTAGACTCAGAGAGAGAGAT
-GGGGACAAAAGGGGAGTGGGGGCTCAGGCAAAGGGATGAAGGCAGAGATGGGAAAATTGG
-GAGGGAGGGGAGCATCCGTTTTGGGAGGGAAGTGTCAGTTTTGAGCACACACAGTCCTCT
-GCAGCTTGAGGAGGAGGAAGGCTGGGTCTGTGGAGGGTGGGGAGCGGGTGGCACCAGAAC
-AAAGCCCCGGGGGTAGCAGCCTGGGCCCTGCAGCTCCTTCGCAGCTGACAGTCCCTGAGC
-TAATTACCATTAATGAGCAGCTGGGCCCAGTTTCCCGGGATTTGCATTCACTGTGCTAGT
-CAGCGCCACTGTGGATGGAAGCCAGCGCCAGCCTTCTGGGGTGGGGGTGACTCAGGGAGC
-CGAGGTAAGATCGCTGGCTTCATGTGGGGCTGAAGAAGGTGTGGCTTTGCCTTTCCTGCA
-GGTTAGGAGATGGCCGAGGTACAATCGTGCCTGGAGGCAGGGCACTGGCATCATCCACCT
-GTCCTCAGCCAGGGCCGGGGTAAGGGTCTTGGGGAAGGAACAGGTCTTGTGGCCCTCAGA
-AGCCCTCAGACATTTGGTTGCAGGGGCCCTCAGATTGTGCAGCCAGCTGTCCACTGCGGA
-GTTGAGGGAATAGACCACAGAGGAGCAACGTGCTGCTCAAACTCATACCAAGACAGCATT
-GCTCGTTAAGCGTGCCtgtgtcagacgctgtccaaagcactttactgaatcttcactacc
-aaccccatgtggtggctgttattagcaatcccattttacagatgaggaaactgaggcaca
-gagcggtcacacagccagggaccagcagggctggcatttgagcccagtcctcctgactGA
-TCCCTGCTGGGCAATAGGGCTGAGGAGCTCTCAGACCTGGGTTTTCCCTTGTGATGGGGG
-CTAACAGTGCCTCTCTCCCCCTAATTCCACTCTCTGCAGGGATGCCGGTATGTTTGGTGC
-CCCTGGCAGGGTTGGGAGGTGAGACTTAAGTACAAATAAATAAACAGGGAGCAGATGGTT
-GTGGGGGGAGTGGTGGTGCTGGGAGGGATAGGGCCAGGGCCTCCCACTTCTCCTTGGGAA
-AACATTTCTGGGCTGGAGCAAATGGATTCCAGACTCAGGACCTGGGAGCCCCTTCCCCAG
-GCCTGCCCTCCTGCCTGCTGGCCTCAGACCTGGCCCAGCCCTTGGgagaaatggtgggct
-ggggtcccgagtcttgggttctgcccatccctcatttctctctcttcttcctgtgtggcc
-ttgagcaagtccctttacctttctgtgcctctatttcctcatctgtcaaatgagtggaag
-gagaatgaactttatcaagtttctgttcaagggccacctcccctgggaagcctttcttga
-ttgctccaggcAGCTTCTGTTAGAGCAACAGCCTCGAGTATCAAGGAGAACATAGGTATT
-TGTGTTTTTCATTTCACAACAatccattcaacagatactttctcagggtcacctatgtgc
-ctggcacgatgccaCACTCCAGGCTGACTCGTAGTTTTTCTCTGTAGCTCcagtgctggc
-ccagagtagccactaataaacatgtgtcatgtgcatgaatGATGAGTGGGTGACTGAAAG
-GGAGCATGAGGAGCTGcagtgtttcccaaacgtggtacttgtatcttgggggtgggagtg
-gggagtggataaaagatgatacgggtgaacagcaacaagttattaaataacaataaatca
-acagtgaaaaagttattcctttttcattacctcccagtccttcttacaggccaaggagaa
-ggtctccgatgatgccaggaacgtgtttctagcacctgtggatctctctttctctctctc
-tctcccccaactcccgcaaaacccaccccaagaaggctggtcttgggctcagagcttcta
-cagacaacactatctagaatttgagaatgttgtttggtttccattttattcattttggtc
-agttaccttttatttgtgacaagggattttgatttttcctttgtTTGGACATGGCCAGTG
-GGAGTTGGAAGTGTTTGGCACTTTCTGATGAAGTGATCAGGACCAgggtggggaagaggg
-ctcgactgaaaaggggcacgagagcacttgtggggtgatggaaatgttctgtgttttgct
-tgtggtcgtagttacatggctgtgtacatttttcaaaatgcattgcacgataacacttaa
-aataggtgcattttattgtatgtaaattatacctcaaAGTTGATTTAGAAACACATATTG
-AGggctgggaatggtggcttacgcctgcaatcctagcactttgggaggccaaggtgggtg
-gatcacctgatgtcgggagttcgagaacagcctggccaacttagcaaaaccctatcttta
-ctaaaaatacaaaaaaattagccgggcgtggtggtgcatgcctgtaaccctggctactca
-ggaggccgaggcatgagaattcttgaatctgggagacagaggttgcagtgagctgagatt
-gcactactgcaccccagagcgagactctgtctcaaaaccaccaccaccaccagcaccacc
-accagcaccaccaccaccaccaccaccagcacATGTTGAGGatattaagtagataataat
-acagatggcatgtaggtgtggccaaagtcatgaaggtTGCCCACCACACGGTAAACTTTG
-TAGTCagtgaataaatggatagataggagatagaatggaggaatgcatgaatgggtaaat
-gagcaagcgaatgaatACCTATCTCatccattctacacagccccagcacattgggaggtt
-gtcctatctcaacttgcatagctcctagaatgggggaactcactaccttatgacatagcc
-ctttccacatctgaaccactaggagtgtgtaaaagacattttctcatattaagtttatct
-ttctggagatcctgtgctctctggggccccacagacacatctgcttccctgtctggggac
-agcccaaacacttgCCCTCCCCAGGCTGCCCTTCTCTGGGCCCTTCTGCCCAGATGCTTG
-GCTGCTGTGCCCACCaggtcctgcttgcacagagcttatatcctagtgggcggcaggaca
-aagaacaagcacacaggcacacaaacacaatgattccatgctatgaaggaaatgcagagt
-gagactgttgggaagagcatggcggggtgtggagaggcaaggggagtctctctaggaagg
-taatatttgagctgggacctgaagaatgcaacaaagccagaagaacaagagaaagggcat
-tccagatagaggcaagagcaagtgcaagagccctgagatcacagagcaattggaaactag
-gaagcagccagcctggctggaCATGGACATTTTGGGTATTGATGGTGAAGAGCCTGGAAT
-TGTTTTCTAAATTTGATCTCCAAACACTTTTAAGCAAGAGGTGATATGATATGACATATT
-TTAGCAGACAATGAATATTTCCTGAATTAAAATTGAAGACCCTTCTAGTTCCAATAGTTC
-CATGCTTCCCAAAGTGATACTGAAATGACTTCAGGAGAGAACAggctgggcgtggtagct
-cacatctgtaatcccaacgctttgggagggtaaggcaggaggattgctcgaggccaggag
-ttcaagaccagcattggcaacatagtgagatccccatctctacagaaataaaaataaaaa
-taaaaaaattaaggccgggcacagtggctcaagcctgtaatcccagcactttggaaggcc
-aaggtgggtggatcatgaggtcaggagttcgagaccagtctggccaacatggtgaaaccc
-catctctactaaaaatacaaaaaatttagctgggcatgttggcgtgtgcctgtaatccca
-actacttaggaggctgaggcaggagaatcacttgaacctgaaaggtggaggttgcagtga
-accgagatcacaccactgcactccagcctgggcgacagaatgagactctgttaaaaaaaa
-aaaaaaaaaaaagctggacatgatggaacatacctgtggtcctagctactcagggggctg
-aggcaggaggatcacatgagcccaggaggtcaaggctgcatgagctgtgatcttactact
-ccacctcagcctaggtgacacagccagaccttgcctcaaaaaaaaTTTTTTTTTAAAAGA
-AAAGAGACAATCATGtgatggttgccagaatggcctccagagagggcctccctaggctga
-atcctggctctgcctcatccttgccgtatgactctgggccaaggaccttgcctctttgag
-cctcagtttttacatctgcaaagtgggggtcataattgtccctgtcttattggcttgttg
-tgaggattaaatgactttatattggagaacagggcccagcatgtcaaaagtactTTCTGT
-TTGTTAAATACAATGAAAAAGGGTGAGGACATGCAGAAGCAAGATTAATCCTTTTTCAAT
-CTCTTCCAGTCCTGATTCCTGCAAGGAGAGTCAGGGTTGGTGGGGATGTGTATCTCTAAC
-ACCAGCCCAATCTGGAGGAAGTTAGTAACAAGGTTATATTTATGTTGTTTATATTTACAG
-CTACCTTTATTTGTGCCACATGATACAAtttttttttttttttgagatggagtctcactg
-tctccaggctggagggcaatggcacaatcttggctcactgaaacctccacctcctgggtt
-caagcagttctcctgcctcagccacccgagcagctgggattatgggtgctcatcaccatg
-cccggcttattctgtagttttagaagagacggggtttcaccgtgttggccaggctggtct
-tgaactcctgacctcaggtgatccacccatctcagcctcccaaagtgctgggattacagg
-cgtgagccaccgcgtctggccCAAATTTTCCATCTACCCTGGCTATTTCAAGTTTCCTTA
-TTTTTTTTTTTTAAAGTAAAACAAAAGCAAATAGATTTAGAAATTCAAGGGCCATGGTCC
-CTGAGGTAATGGCAAGCCCTCCTGTCCCAAATGGCCCAAATTGTGCAGGTGGTCATTGAG
-CCATTGATGGGACTTTAGGAAGCATGGttttatttttatttttattttttagatggagtc
-tcgctctgttgcccaagctggagtgcaatggtgcaatcttggctcactgcaaccttcacc
-tcctgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcgccc
-gccaccactcccggctgatttttgtatttttagtagagatgggatttcaccatcttggcc
-aagctggtcttgaactcctgaccttgtgatccacctgtcttggcctcccaaagtggtggg
-attacaggcatgagccaccgcgccccgccCAGAAACCTGTTTCTAAGCTCAGCACAGGGA
-ATAGCTCCTTTTTCAAGTTATGTCCTGATCCGGATCACTTCTTTCTACCCGTGTGCAATC
-CACCAAGCATCACCTGGGGCTCTGGTGACAGCAGCATCCCCTTCACCTTCTTTCTCTTCC
-TGCTCCACTCGGCAGCCAGagccagaccatgtccttcctctgctcaaagcctcacaaggc
-tcccagctcacttggagaaaaagccgaagtcctcacccagctatgaggcccctcccaagc
-tgatgaccctcacccctcctcacccctccagcctcgtcacctgcccagccacagcccttc
-tcccacctccactgaccccaccacactggcctccttgctgcttcttgaacactcactctg
-tgcaggctccagctcaggacttttgcatatgctgttccctctgcctggaacacatccctc
-tgacacccacagggcatttttcctctcattgcccaggtcaatgccccctctcagagaggc
-ccatccaccttacctaaatatttcctagctcattcttcctccctcccctgcttttccctc
-agagcatatatcactaccagacatcacattttacctttgatacatatgttgtgtgtgtca
-tcgcctgtctcccagagtggacttcaagaggacagaagtttgcgtctgttttgtactctg
-atggctccagtgcctggaatggtacTGATTTGCAGAATGAATGTCCAGGGGTGTGTGTGA
-AGGGTGGAGGGCAGTCACTCCCAGCCCTGCCCAGCCTCACTGTGGCCCCTCAGTCCCCTC
-TCCGGATATAGCTTTTCTCTCTGCCTGCCCCACCCTCTGACCCTCAAGGGCAGGCCAGGG
-CAGCAAGCTTGTCCCTTAGGAGGGAGGTTTCCAGCTGCAGGGCAGACCTTCCTCCTATAC
-CTCCATCCCAGGTAAGCCCAACTGGAGCTGCCCTCTCGTGGAGGGTACTCCAAGGATGAA
-GGGCCTTAGGGGAAGAGCCACCCTGAATGTCTCTGGGCAGCCAGGAACCTGCTCACAGCC
-TCCGCGACCTCATCGGGAAAGAGGCAAGACTCATGAGAGTGAATGGcccacggggagtta
-ctatgcttgtccccttttacagatgagaaaactgaggctcagagaggtgaaTCTGTCTCT
-AGGGCAGCTGGAgcctctgtcccctcctctgtaaaatgaggagaataactcctccctcct
-aaggttaccttgaggattaaatgagctaaataaagcctttaaacacagagctgtgtctgg
-cacataggaggtgctcaataaatgttgggtactcttGTTgttctgacaggtgaactaact
-ttccaaggtctcacagttagtaagtaacacaaacaaattcaaacccagatctgtctgaat
-ctaaagTGATTCCCAGAGGgggggcagtggctcacaccagcactttgggaggtcgaggca
-ggaggatcacttgtgcccaggggttcgggactagcctgggcaacgtgacaagacattgtt
-tgtctccgcaaaaaacttacaaaattagccaggcatggtggtacgtgcctgtggtcccag
-ttacttgggaggctgaggctggaggatggtttgagcctgggagttggagactgcaatgag
-ctgtgatcacaccactgcactccatcctgggtcagagagctagacctggtttcgaaaaaa
-agtcaaataaataaagaaaGTGACTCCTGTGCacaaccacaaaataataacaataacagc
-gacgacaacagcaacaacaCCTCCGAGCAGTAACAGCATTTTCCACTGCAGACGGCGGCG
-CTGAGGGTACAGGGATAAGATCATCCGGTGACAGGGATCATCATCCCTGCCTGGCATAGA
-AACCCGGACATCGGACCCTGCCCTCCCGCTGCTTCCGCAGGGACAGGGGGCAGCCAGCAG
-AGCCTCCCTCTGGGGGTGCCCCCCAATCTGGTTGCCTGGGACGGGGGCCCAGCGGGGGTG
-GAGTTGCCTGGGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGAGGCCCAGCGG
-GGGTGGAGTTGCCTGGGGGGGGGAGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGGTGC
-CCAGCGGGGGTGGAGTTGCCTGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGTGGGGGGA
-GGCCCAGCGggggtggagttgcctggggggggcccagcgggggtggggttgcctgggggg
-ggaggcccagcgggggtggagttgcctgggggggggaggcccagcgggggtggagttgcc
-tgggggggggtgcccagcgggggtggagttgcctggggggggcccagcgggggtggagtt
-gcctgtggtggggggccagcgggggtgaagttgcctggggggggccagcgggggtggagt
-tgcctgggggggggccagcgggggtggagttgcctgtgggggggggccagcgggggtgga
-gttgcctggggggggccagcgggggtggagttgcctggggggggCCAGCGGGGGTGGAGC
-ACCCTGGACGGCCCCGCGGAGCCCCCTGCGGGAGGCGAGGGCGGCCCTCGGGCTCTGGAA
-GGGGCCGCGCGGCCTGGAAGACATTACACGGCTGTCGGGCGGGGGGCGGCGCTCGCAGTT
-CCGGAGGGGGGTCCCGGCGGCGGACGCGCGGGGTGAGGGGACCGCCCGGCCACAGAGCGC
-GCTTTGTTCTGCGCCGCCCCCGGGAGCTGGAACCAATGGATTGGCGGCAGCTGAGGTCAT
-CTGTCAGGCGGAGCCGGGGGGTCAGGCCCGGGGAAGGGGCCGCGAGGGAGGGCGGCGCGC
-GTGGGCCGGCGGGGTGCGGGTGGacgagccgggggccctgcggcaggtggctacgctgct
-tcggtcctcagtttacccgtctgtccaacaggaaagatcatttctgccctgtccacctct
-gggggctaatgtgagagttaaaGTAGGGGAGCTACAGTGATGATGATGATGACGACGGAG
-GATGACAGCCTTCCCCTAATCGCAGTCTCTACTTCGGGTACCATAGAAGTGCTAAGTCAG
-GGGCTGGACGCAAATGTGCTTTGTAGCCTATAGTGCGTGCCTGTGTGGGAAGCGGGATGG
-ATGTTTCACCCCACCCTCTTTCAGCCCAGGGAAGTCAGTGGCTCCCCCTGATTGCCTGCC
-TTGACCCTGGGTGCCAGGCTTGGTCTGCCTTCTCCAGGGGTGATAGGTGCAGCTGCCCAA
-GCCTGAGCCCAGGAACCCATTGCAGCCTGTCCTTGGAGCCTTCTGGTCCAGGGTAGGGCG
-GGACTGGAGTGACCCAGATAGGTGGGGTTTTTTTTTCTGACTGGGGGTAGGTCAGGGTCT
-CAAGGCTCTCCTTTGCCTCCTACAAAAGGACAGCCCTttctttcatcaattcactcattc
-attcattcaCACTGCCACCTGCCTGTGCCTCACAGTTCCCATCCATGAGATAATGAGGCT
-TCTAAACATTTGATACAGGGTCCCCCAGGGAAGGAGATCATCAAATACAGGGAGGCCCAG
-AAACGGCCCAAAATGCGTGTGTGTGTATTTTTGGGGAAAGGACTCATGGCTTTCTTGTGT
-TCTCAACCACGTTCATGATCCcaaacaaggctaagaagtactggttggagtgcagggaag
-gcaaataggctcccaaactccaccggagagggtggcacttggaacaaccactttggagag
-caatttgccagggtcttagaagatggaaatgggcgtatgcatcagccaggcagctccact
-cctgggtatacagttgaaagaGCAGGGTGATGGCGGGGGCCGTTCGCAGCCGCAAATAAC
-TGTAAGCCCCCATGCTTCCATGAACATGATCACGACTAACAAACGGCTACATTCACAGCC
-TGGAACACCACGCAGCGGTGAAAAAGAATGAGATAGACTCAGCTGGAatttattcatttg
-acagatattgattaacactactatcttttaggcactgttcttagcactgaacctacagtg
-ataaacaagacagattgagtcctgccttaagaacgtacatttggccaggcacggtggctc
-acacctgtaatcccagcactttgggaggccaatatgggaggactgcttgaggccgggagt
-tgaaaatcagcctgataaacattgtgagacctcatctctacaaaagaaaaataaaaaatt
-agctgggtgtggtgacacacacctgtaatcccagctactcaggaggctaagtgggaggat
-tgcttgaacccagaagttggaggctgcagtgagccacgatggtgccactgcatactccag
-cctgggtggtagagcaagatcctgtcttaaaaaaaaaaacaaaaaaagcagacacagaag
-aaaatttgggagagtgtgacaaatgccatgaagaaaataaaactggataaagggacggaa
-tgatgggggagggggctgttttagacgctatggttgggaaggcccctgaagaagtgacat
-ttgggcacagaccagaatgagggagactgggagacaggcacgCACGAATGGGATGGACGG
-CTGGGGCACAGTGCCAAGGGAGAAAAGCAATCCACAAAACAGCGCAAAAAAAGAAAACAT
-TTTTTACTTAAACGCACATTCATTACTATTAAATTAGATAAGAGTCTGGGAGGCTCTATG
-CCAAATTCATAAAGGTAACTGTCCCAAGAGGGCAAAGGAATAATCAGGACTAGGTTTTGT
-GGTGGGCTTCCGCTTGCCTCTAATACtttaaatttctaatatttaattatttaacatttt
-aatattttaatGTTTAAACGGTAAATATggctgaatgcagtggctcatgcctgtaatatc
-atactttgggaggccaaggcgggaggatcacttgaggccaggagttggagaccaaccacc
-ccaggcaacagagcaagacctggtctctataaaacgttaaaaacaaaattagctgggtgt
-ggtggtgcctgtagtcctagctactcgggaggctgaggcaggaggatggcttgagcccag
-gagtttgaggttgcagtgagctataatcagaacattgcgtgccagctttggtaacagagc
-aaaaccccatcacaaacaaacgaacaaaCACATTTTAAAAAGTAAATATACTTATATAAA
-ACTTGTGAAATggctgggcatggtggctcacacctgtaatcccagtgcctcgggaggccg
-aggcggacagatcacctgaggccaagagttcaaggtcagcctggccaacatggtgaaacc
-ccatttctactaaaacaacaacaaCAAAAAGCCTTGTGAAATGAAAACAAAAAAAAAAAA
-AAAAAGGAAATTTAAATCTACCACGGTCAAGTGGGTGGGTTCCAGGGCGGTGAAGGCACA
-TACTGCCTTTCACTGGAGCCAAGTTCCTGGGGGCAGAGGTTTTTTTGGGGAGGGACACTG
-TAGGTCATGGtagcccagccagtaggagcccagaagcttcttggaggaggtaccaccttt
-gctgagcctgaGATTCTCTGGCCCAGCACCCCCAGTATAGACAGGAATGGGTAGACATGT
-GCGCAAGGTTACAGAACAAGAGCTGATAAATAGAACCTGAACTCCAGACTCATCCCGGCT
-GAACCCGGGTTAACTATCCCGCCTCTTTCAGCCCTGCGCGTGCATCCAGCCCCTTCCCAC
-AGCTGTAGCTCTTGCAGGCCAGAGGGACGGCCCTGCCGCGGGGGCCGGAGAGCAGCGCCA
-CCTGCTGCTGTAAGAGGGAAACGCAACTTCCGGCTACCAGCAGGTTACACCCTTTAAAAC
-CCAGCTCCTCTTCCTTAAATGATCAAGCAGTACCCCTCTACTCCGAATCTGTTCTGCACC
-TCCTTCGCAGTGCCTGGCAGGGCCCTTAGCGCTGTCTGGTTGGGTCTTCTCTGCAAGAAG
-GAAAAGTTGTTTCAGGAGGGGGCGACCATCTTCACTCTCATTCCAGCCCAGCGGGCACAG
-GAGGAGTTTACTCACAGAAGACAGGGGcacctcaccttcgctacaaaccttaggggtaca
-caatccatttgacagcctggaagaagtccccagggaagggacagaaccgcccaaggtcac
-acagttaatgagtagacaagctgggGGGAATGAGTAGACTCATTCCACTGGGGATGGAAG
-TGGGGAAGTCACCGTATTTGAAAATAACTGACGCAGTTATTagcagctcttagcatgtgg
-tccctgaacagcagcatcagcaacatctgggaacttgttagaaaagcaaattatcaggcc
-ctgccccaactcgcctcaatcagaaactctggggggccgggggcagtggccatgtctgta
-atcccagcactttgggaagctgaggcgggagaatcgcttgtgcccaggagtttaggacca
-gcccagagaacacagcaaaaccctgtctctacaaaaaaatgagaagggcgcacctgtagt
-cccagctactcaggaggttgacgtgggaggatcacttaagccccgggaggtcaaggctgc
-agtgagtcatgatcgtgccactgcactccagcctgggtgacagggcatgaccctgtctca
-aaaaaaaaagaaagtgggggtggggcccagcaatctggtatttagcaaacAAGCTTGAGA
-CCCTGAACCATTGGTCTAAAGGAATTGCACACCCCCCCTTTTTTTTTTTAAAttaaataa
-acttttattttggaatgatactagatttacagagaagttgcagagatagtacaaagagtt
-cctgtatacccttcacccagcctaccccaaggtcaacatcttacatcaccatggtacatc
-tgtcaaaaccaagagactgaaattggtatattaactaaaattcagacttttttcagattt
-ccaattttcccactaatgtcctgtttttgttccaagacccaatccaggatgccacattgc
-actGAAGACACTCTCCCTTTTCAATTCTATTACTGGTCACCTCAGTCAACTTTCCCGGGG
-AAAGAGAATGCATGGGAAAAGCTCTTGTCCTTATTATTGAACTGGAGAAACTGAGGCTTA
-AAAGTGCCGAGTGACCAAGTTCCCTTAGAGGGCAGTGAGAACAAGGCCTGCCTTACTCTG
-TTCCCTTTCCCCAGGGACTCTTGGTTTTCAGAAGCCCCTCTGGAATGTCCTACCTGGCCT
-AACCCCATACCAGCAGTGCAGACAAGGAGGCACTCCTACTACAGTGGGTCCAGCCCATGG
-AGAGACTCACTTCCTGCCCCAACACCTCTTCCCCTAGACCCTGAGGGCCAGGACAATGTC
-TTAGTGCCTTCCAACTTGGCAGAGTGAGGCCCCATGAGACAGAGAGAAAGGGGGAAGAGG
-GAAATACCTTTATCCAAATAAATACCCATCCAAAATTATTTGTGATAGGTGAAAAATGGC
-CACAAGCTctttgtggttcccctcatcaagacatgtagtctgtttctcatcccttgaatc
-tgggtaaagccttgtgatttgctctgaccaaaagaacttagcagaagtgacactgtccta
-gtcccagttccaggccaagaactcaagaagtctttcagcttctactctcactctctttgg
-aatcctgaagccatcatgtgaataagcctgagctagcctgctggagaggccacatggagg
-agaaccaagcaattccagccaacagcctgtcacctgccaggcaagtgagtaaggctatcc
-tagaccatccaggcccagctgaggtaacagctgaccttagctccatgagggatcccaggt
-gtgagcagcagaactgccctgttgagcccagcccaaattgccaacccataggattgtggg
-aaaatacagggtttgtttctagctgccaagtttggggatggtttgttacacagcaaaagc
-taactggtacaCAattctgcatttctctcttggtaatgggatcccagttttattgcagga
-ggcagtgtgccagtctcagtagatggaacacgattggtctattcagccatgacaattctg
-ttccctgctgtcttagctttgtttgcagctagaggtgcaatggtagctggctcgggccaa
-gggcatctaagtgaagatatgcagagggagagagcaggaaacagacttctgacgaggttt
-tactttctgatagaaggtgacgggtccagctagtttggcccttcctcttcctccacccct
-ccttccttgaacgcagacatgattcttggggatacagcagccatcttgggaccatgaagt
-aacgagcactgagattaaggcaaaaggatccaagacgtgacccctaccttcgtggagttg
-ttgaaccaataccattagccacccatctccagaatccatgctatgtggaaaaacaatctt
-ctgtttgtttaaaccactgcaatcaaggttttcctttccttgcagctgaatgtagtccAT
-ATAAGAGGTTACATAGACAAAAATGCAGAGGGATCCTTGTCCTTGGGAATTTGGAGCCGG
-CAGCACGTGgctcttcaagcccatctctgttctccttctcggtaatgcttcaagggtaag
-gccatgatcctattgtcacagaggtgggaactggggctcccacactgtacagtgagtcca
-aggccttgtagctggtgagaggggtgcccagagtcagacccTCTCGCCAGGTGCAAAGAG
-AATGCACCCCTGCTATCCCTTCTGCATGGCCCAGCCTGCTGGAGGCCAGGTGTGTCTTCT
-GGGCTCTTGAAGGTGGCAGCAGGTGCCAAGGAGGCTGCTACTGCAAGTCTGGTGTGGATG
-CTCCCAGGTACACCCTTAGGTCTGAGAGAGTGGACTGGACAAGCTTGGCGGGGATGGTCT
-CTCGCTGCAGTTGCTGGTAGGCCGCGTAGCGGTGGCAGCCCCCAAAGGAGTAGAAGTAGT
-CACCTCCCTGGGCCCCTTTGATCCAGAGGACATCGATGGGGGGCACGCTGTCTGGGTCCT
-CCTGGGGAGAAGAGGCACAGAGTCAATGGACATGGTACAAGGCTTGAGAGTTTGTAAAGC
-AGACTTTGTCCACTTGTGCTGAGCTCCTTATAAGGTGATCACACTGGACTACTGTGAGAG
-ACAACTGTTAATTATCAGGAATTTTGTGAGCTGTTCgacatcaccttgtagcttgaaaat
-cagccatgggagagtatttacaccagagaaatggacagatgctacaaatcagggatttct
-cccacacatgtatcagcacaccacATGCACactatccagctggccctgttgtagaccctg
-ggaatacggtacagctggaatgtgactgaatcaggccctggcttcaaggggctccagtct
-agtggggcagatggaacaagaagtaaatattagagtgacaaatgctataatgacaataac
-acaggtgacaggacagagatgggGTCCACGAGGCCTCTCTGAGGTAAGAATGAAGCAGAG
-TACTTGGAAAGATAGAGAAGTGGggccgggcacggtggctcatgcctgtaatcccagaac
-tttgggaggccgaggcgggtggatcacctgaggtcaggagtttgagaccagcctggccaa
-aatggcacaaccctgtctctactaaaaatacaaaaattagctgggcatggtggtgtatgc
-ctgtaatcacagttactcaggaggctgaggcaggagaatcacttgaacccaggaggcgga
-ggttgcagtgagctgagatcgcaccattgcactccagcctcggcgatggaacgagaatcc
-atctcaaaaaaaaaaaaaaaagagagaaGTGGAATAGTTTCGATTAAgagctcaactgcc
-tgggttcaaatctagctctgctgcttaacagctatgtgatcttgggcaattcatcttttt
-gtgcctcagttgccccatctatcaaattggatggagataacagatccatctcatagaatt
-tttgggttaaatgggttaatatatataaagcacttcaaaccatgcttggcacacggaaag
-tgctcagtaatgtatgctgtgtatGACCTgagggaagaacgttccatgcaaagggaacag
-caaacgcaaaggacttgaaaccagagcacgttcactgtgtaggaggcacagcaaggagtt
-cactagagtggactccagggctccaggaatggtcagaaaggccagcaggagccagatggt
-gcaggtctgcttctgagagcagtgggtgggccctggagtgttggcaacaggggagggtga
-catgatctgatgcatgttctagaaagttgtcacaggagaacagacttggcagggtggaca
-gggcacagggctggaaggcagaggggaggcctctgcaggtattcagcagaagatgctggt
-ctggatgatggtgtggtggggacagggagaggtagacaggtttgggacacatttacgggg
-caggcccaaggggtctggcagaaggggtgaatccaagggcaagagaaaagggagaatcta
-agttgacttcctgttaggggcccacacagccaggtggagagtaggtcatcctctaaacag
-ggaaagtctggggcaggacgggtgcagggtagagCACTCTGGGGAGACCCCATTAAGTGT
-GAGCGGCGTGGAAGGCCTCCTGCTGCTGGTCCACGGGTTCTCTCTCATGATTCCACAAAT
-GATTATTCAgcagtaaggtgcagcagtcacaagcctgagctctggaacctggcacacctg
-actttggatctcagctcctctccacagcagctggggcacacagccctctgaacaccattc
-ctcacctgtaaactgggaataaaacatcctagagggctgctgatgaagagtcagtgagct
-gatgcCTACCGGGCATTAGTGGAGCACTAAGGAGGGCAGCCGTGCCAGGCAGGCCTTGTG
-CCGGGTACTGGAGGCACGATGGTGgatggccagaatgatggctcccaaagatgtccacgc
-ccgaatgcttctgaatgtgttaccttacatgggagaagggacttggcagacagaattaag
-gtaaggatcctgagatgcggaaattatccaaggttatctagatgggtcgaatgccattat
-cagggtccttaaaactggaagaggaagtagaggaagaggtcagagtgatgcgatgtgaga
-aggccttggcctgatgttgctggctttgaagacagaggaagaggccataagccaagcagt
-gtgggtggcgtctggaagctgggaaaggcgaggaaatggattctcccctagagcctacag
-aaagtagtgcagccctgcttggtgttagcccagtaagacccattttggacttctgaccat
-aaataaacctgtgttgttttaagccatcaactttgtggtaacttacagtggccccagaaa
-actaatacaGGTGTATGTAAGCAAAGGCAGAGCTGGTTCTGGCCCTCAGAGCCTACGGTT
-CTAGCACGGAAGGCAGGTGTCTAGACAGGACGTTAAAAGCCAGTGGGctgtaatcccagc
-actttgggaggccgaggtgggcagatcgcttgaggtctggagtttcagaccagcctggcc
-aacagggtgaaaccccatctctactaaaaatacaaaaattagccaggcgtggtggtgggc
-gcctgtaatcccagctacttgggaggctgaggcaggagaatggcttgaacccgggaggcg
-gaggttgcagtgagccaagatcgtgccactgcactccagccagggtgacagacccagaca
-acgtcttaaaaaaaaaaaaaaaaaGCCAGTGAGATCAGAGCTATGCAGGTGGGCACACAG
-GTGGCTGCAGGCCCACAGAAGCTCCTAACCCGGTAGGGATGGTCAGGGAAGATCCTGACA
-CTGAGACAGGAAGACCGAGAAAGAGTGAGAAACGACAAGGCAGAGATAGAAGAGGTTCTC
-AACGGGAGAAAAAGCCCAGTGGTGGGACAGGGCATGCATGGCAGATCCCTTCCCATCTCA
-gccaggcgccgtgctactattgtggcaacagataagatgggacgaggtcctcgcccttgt
-ggagtgcacgtgaggtcaggaagacagaaaataaaatgcaacacaaatagatgtataata
-taatttctggtggacataagtggtatcctgaaaaacatctcgggctaaggggagagctag
-agaggccagtgactctgaccaagggtgatcaaggaggcagagagctgaaccaggcagggg
-agcaggccctgtggttgtctggggaagtggctccaggcagtgaggacactagtgtaaaTA
-CTAGGACTGAAAGTTATCGGGGGTGGCTGTAGAGGTGCTGGGTGGGGCTTAGGGATCTCA
-TGTGCTCACCTTCCAAGGGTCGGGGGAAGGGGACACAACGTTATGTAGGCCTAACCTGAC
-ACCTGTTCTTGCGGGGCCCCCAAGTTCCTGCCAGAATCACTCCGGTATTCTTAACACCCT
-TCCTCAGTGGTGGAGCTGACCCTTGACCTCTCCCACTTCCCATTCAGACAAGGGCCTCCC
-AGCAGATATGACACACCTAGTCCCACTGTCACTGACTGTCACAGCCATGAGAGCCCACGG
-CTTATCTCCGGgtagtgcggtggccatgtgctgggcagtggggcccaggctgcctgggtg
-tgaattccagccgtgtcactttttaagcgcctgatcttagtcaagccgctgaaatcttcc
-ctgcctcagttctcgtctgcaaaagagccactatctacctcctagggttggcataggaaa
-ctgagggacttcctgcagttcctggaccactgcaagcactAGCGTTATAAGCGTTATCAT
-CACTactttaattatctcgcccaattccctccttgctcaagtgaggaaacagaggcccag
-agaggcccagctacttgctcaaggtcacacagcagaggctgagctccggctgggcccgga
-accagtccgtctcgcgtccaTCGCAGCGACCTCCCTCCTCCGGCAACCTCCCTCCTCCGA
-AGCCCTCCCTCCGGTTGGCTGGACTCCCCGAGGCCTCACCCGGATCGTGTCCACGAGGCT
-CTGCACCTTGGCGGGGTCCAACACGGACGGCAGCGGCCGGATGAGCACGCTCAGCGGCAC
-GTTGTGCACCGCGGCGATGCGGCCCGAGTGGATGCTgccgccctgcgcgccgccgctcgg
-cccgggcccctcgggcgccccccgacccgcgccggcccTGCCCAGCGTTCCTCCTGCACG
-CAGCCCCATCGTCGCCGCCGCCGCGGGACTCGCCGCCTCCCCCCGGCCTTAACTCCGGCC
-GGGCCATACCATTccgcgcggccgggggggggggcccgTGCCAGGGCAGCGCGCGTTTCT
-CCCCCGACCCCGCCGCGGTCCGGCCTCGACCCCGCGGTCCCCAGCCCGACTCCGGCTCCG
-CTCGCCAGGTGCCGCCAGACTCGCGCGGGGCTCAGGCTCTCCACCGGGGGGCGCCTCTCG
-CCTCCCCTGCGCCGCGCGGCGTCCGGGGAGTGGAAACGCCCGGGCGGGCTGACTCAGGGT
-GAGTTTGCAGGTCGCGGGGCGGGAGGGGCGCGGGTGACGCACCGGCCGGGCCGACTTAgg
-ccgcgggggcgggggcgggggAGAGCGCGGCGGACCTGCCCAGCCAGGGTGAGTCGGCAA
-AGCCCGCGGTGCGCTGCTGCCCCGCTGCTGGGGTTCCTAGCCAGCGAGGTTATGATCCCC
-ACCAGCGGTTCCACTTCCAGTCTGGCGCCGGCtgtgtctggagtcgttccgaacattttg
-cacgtgtattaacgtatctgaacctcaaaacaaccctgcaaggaaggtatgactgttatt
-cccattttacagaagaggagactgagacacaggtttaagtgatgtacccaagatcacgga
-actagtaagtggccgaatccgcgttcaaatccagacggtctggctccagagtccgccttc
-tACCCCACCGTTGGCTGCCTTGGTTCAGCAACAGTGACTGTCACACGGAGCCCTCAGGAG
-TCGCGCTGACAATGGGTGGGCCCTGCCTTCAAGTTCCACACTGTCTGTTTGTGTCATTAC
-AACACTACTGGAAGTAGGTGCAGTTATAGACCCGCTGTTCAAGGTCAGCTGAAATGAAAG
-TCAGGTCACACGAGTCCAAACTGTGGGGCCACTTAACCACCAACTCCAAGCAGGAAGGTG
-GACGATCCCAGACTCGGTCGAAGACAAGCATGTCTGGTTTGCTTGTCTTCCTTCTCAACC
-TGAATGGCACGAACATGGAGAAATGCATACTTACCCTGCCAGCTGGAGAAAACTGGAGAC
-GAAGGAGGGAGCCAGGAGTTTCTACTTTGccttccaccagttgctgacactttctgaacc
-ccgtctgtaaaatgaagtcatgctgcccatcactcaaagttgtgtgaattgagagagtgc
-tcatagtgctctgtgaattgcataacaTCCATTTTGCTGTTGAAGATCATTTATTTTGGG
-TTCTTAGTCTCTCACAAAACCTTAGAACACTGACACCAAGACTCCAGCCTTTCCCTTTCG
-AAACATAATTCCCGTGCGCACCTAAATGATACTTTATTTCAAGAAGTAGAACTGACACCC
-ACACCTCAGCCCCAGAATTATTCAGAATTAGAGAATTTCATCAAGAGGGAAGTTATCCCT
-TCTAAAACATCTTCCTCATTACAGGAAGTAAGAATGGCAGGATAACAGTTTCTAGAGTGG
-AAAAGTGGAGCTCTGGCCTGATTCTATCATCATGGTGTACCCAGGGAGGCCTCATTTCCT
-GGTATCAAATTCTCTGTGTTAAGATATCTATGGcccaattcaaaatggcttaagcaataa
-gaaggtttgttttctcacataataaaatgtttggaggtaggtatgtccaaggttggtaaa
-gaggcagttgaacaatgtgaccaaagactccagttctggctgggcccggtggctcacacc
-tgtaatcccagcactttggaaggctgaggcaggcgaatcacttgaggccaggagttcgag
-accagcctagccaacatagtgaaaccctgtctctaccaaaagtacaaaaattaggcaggc
-atggtggcgcgcgcctgtagtcccagttactccagaggctgagacaggagaattgcttga
-aaccgagaggcagaggttgcagtgagctgagatcatgccgttgcactacagcctgggtga
-gagagtgagactctctcagaaaaaaaagaccctggttctgtctatccttttgtgccatca
-tccttggtgttctgttatcctgcggtgtgcccctcatggtcccaagatggctactgtagc
-tcaaaacatcacatcattacatgcgaatgtccacaagtggaagttaggacatcccttcga
-gcctctttttaagagtgaagaaaccttcccTGGCTGGATGCAGTGGctcacaccttctga
-ccttccactcctcaagccccggagtcaactctagtcacactggcctccttgctgtgcctc
-ttccacagcgaatgtgtcctggcctcagaccctttacatttgctgttccctgtgcatgga
-acgctcttccctcaggtCATACatagcatacattactgagtgctctccatgtgcccagca
-tggtttgatgcgctttacatatattaactcatggaacctaacagctttatgagacgagtc
-tgttatctccatccccatttgatagatggggCATCCCTGTGGGAGCTCTGCCCATTCCAG
-AGGTGCCAGGCCATTCACTAATGGGGGCAGGAGCCGGTGAGTAAATGCCAGTCTTGTGCT
-GTCACAGGTGGACGATTCAGAGAGGTGTTCTAGACCATTCAGATCTTTCTGGAACCTTCT
-CAGAGACCAGAAGTACTCAGCCCTATTGCTACAACTGACTTCACTAACACACCctctgtc
-ccattcctcccaccccttacttctgcttccagggatcacctcccacataaacgacttaca
-ctcaagtctcagacttgctatcagggaaccaaaactaaaacaAAAGGGAAACTTGATACT
-GGGTCATCCCCTATAGTTCTGTACCTtgcctgggttaaaattgcactattttattagatg
-tgtgaccttgggccagtcacctgtctgtgcctgtttcctaatctgtaaaacggacataat
-gtcacctaattcacaggggtgttggaagagtgaagagagatggtgttaggtgaggtcctt
-aaaacagtgcacaacgcattataagtgctcaataaatgtttgctgttTGATTGCATTTTA
-AATTGTAACAGAGCTTGAACGTCTCTCCGTGTCTTCACTTTCAGACTAGGCTTGAtgtat
-tagtcaagacttttgtttgcaagtgacagaaagccaaagtgaattagcttaatgaaaatg
-gggatgcttggctattcccgtgactgaGGTGAAGCGGAGCCTCAGGGGAAAGTAAGTTGA
-GAGATTTCTTTTCTCTGCCCTCACTCAGCAGAGGGATTATCTCTACATGTCAGGAACATG
-ACTGTCAACAGCgatgatatttggctttaaataagggaaacctgacaacagagacttcat
-acaacttaaagtgtttcctctttaaaaaaaaaaacagtcgaggtaggaagtccatggctg
-ggatggctgctccatggtcactagtggcataggccctttctatcttgccgctccatcatt
-ttccagcagagttttcattctcagggtcacctcctattcaggattgctgctgaagtgcca
-gccgtctcatccaaattccaccctggaaagaggtggagaaatggaaaggcaaaggatatg
-acccctccccttttgaggatgctatctcagaagttttgtataacacttccccttgcatgt
-cattgactagaaattggtcacacggccacccctggctgcaagggcagctggatatgttgt
-cttcatccgtagcggtaatgtgctgagctaaaactggagttctcttactaaggaagaata
-gagattgataagtagctagcaatcggggccacaGCTCTCAAGTTACAGGCCTTATGGCAC
-AGAGACAGGGAGAGAGAGAAAATTTCCAAGTTCTAGTCAGATGCCTACATATGGACAAGC
-CAGCTATGGCATTGGGGGACACAGACTTTCTTAAAAGCATAAGCCACCATTATTTATTAT
-AATGACTTAAAGGTAAGGAGttcatttaaagataattactggtcacctgctattggctag
-gctagacccaggggatttagtgatcagcaaaaagacactaccaatctctgcattatgagg
-cttacagtgtagtggaggattcagataatgaccaaataatcacactggttaatggaaagt
-atacattggtagtgggtgctgcaaaagaaTGGCATGTGGTTCTGAGGAAGtgttttagtc
-ctttttggctgccatagcaataccatagactgggtggtttataaacaacagaactttgtc
-tcttacagttttaggggctgagaaatccaagatcaaggtgACtttgtatctccccaacat
-tcatatgttgaaatcccaacctccaggtgatggtgttgggaggtgggcctttgggaagtg
-attatgtcacggggttcatgggggtagagccctcatgaatgagattagtgtcctttttct
-ttcttttgagacagggtctcactttgtcacccaggctggagtgcagtagaactgtaaaga
-aaacttctaatttttaaaatcaggaacctgataataactaaggaatcctgaacagagtgt
-tggtagaaatacagatgaaaaaggccatttggatgaggaaatgaggaagatattattgga
-caatggaaaaaaggccatgttgttataaaatggcaaagaacttggctgaattatgtccac
-gttctagtgttttataggaggtagaacttgtgagcaatgaaacggaatatttagctaaag
-ctatttctaagcaaagtgttgaagctgtggcttggctcctcctgactgcttatagtaaaa
-tagaagcagaaagaaatgagttaaagatgtgacttttaagcgaataggaagcaaaacgta
-aagatttgaaaaattttcagcctatccatattgcaaagaatgagaaagaatgtttgggag
-aaaacaccaTAGTCTCCATAAGGAGACTGTAATGGTGATGAACGTAATCAGCCatcccag
-caggaaaactgccgtcttgaattgaaggggaaggagatgggaagggatgaggaaggaAAG
-CTGTCTGACTTCTTGGATTTTTCAGGACAAGACCAGAGTGCAAactcttcaagacaaggg
-aagaatgaccctgaaggcaattcagagatcatcaaggctatctcCTTGCTTTCAAAAGTC
-GGGAGCATTGCCTTGCATTCAGCAGGTTAGAGGGCCTCTGTCCAAAGCCATGGAGGAAGA
-GCTGCCCAGAGCTGTTGGTGTGGGGCTACCCAGAGCCCTGGGAACATGACTTCTGCGGGA
-TAGAGCTGGAGGGACAGGACCACCACCCCAGAGGGTACAGAGGGTGGGACCACCACCATT
-GTGGATCTGGAAGGCTGcctcagtgggcctggaagcagagcatttaatgaactaaaaatg
-atttttcttgagccttaagatctcatggagtttgccttgtagtttggatgtaatttggat
-ctgctattcctttcttctttcctatttctcccttttggaatggtctatcctatgcctgtc
-tcaccattgtattttggaagcagataacttgcttgatttcacaggctcaccgctggagaa
-caatttgccccaggatgcatcacaccttgagtctcagccatatctgacttagatgacact
-tagataataaaactttggattttagacttcagagttaatgctggaatgagttaaggcttt
-tggggctgttggaatgtaaggaatgaatgtattttgcatgtgagaaggatgtgaatttgg
-cggggGATGGGGACGGAGGCAGAAtgctatagactgaatgtttgtgttcctccaaaattc
-atgttaaaatcctaacccccagtatgatggtattaggaggtgggcttttgggaggCACGT
-TAAGGCCAGTTCATTTCATGGTCACAAGATGACATGCTTTTCTGTTCACACTGGAGGGGA
-AGAGGAACTGGACTTCCTTTCCTCTTAAGAAAAAGGAagcagcaaagttttccataccct
-tccagcaaccctctccttaagtctcattggccagaattgggtcatgtgcccatttctgaa
-cGATGGGAGATGTTAGTATTAGACCAGTAAAGACTACCTCTTAAGCTGATGTTCAGTCCC
-CAGATTGCGTGGTTGCTAATCCAGGAGAGAGGGGTGGGGTGGAATGGTTATTGGACCCAC
-ATAACTGGGCTGGATATGGCTGATGGAGACCCAGCATTCTTTCCCACCTCCCTCTAGGGT
-GCCTTCTAGATTGCCTAGTTGGAGAGTTAAAAACTCTATTTCTCAGATCTCTTTGCAGCA
-AAGATACTAACAGGGAATTAAGTTCTACCAGTTAGATGTACTTTCATGAGACATGGATGG
-CAGAGGTGGGCCGGGGCCATCTTCCATCTTTTGACTCTTGCTACTGTCAAGATTGTCTTG
-GAGGTGTTAAGATTTTCTGTAGCAGTGTTCCAGCATTGTGCCACCAGCACAGTGGGAGAC
-AGGAGATAGTTATAGAGGCAGTGGCAAGGGCCTGCTGATCCCTGGCTTGCACCTATGATG
-CGGTGTTCTGTATCTCAATAGTTCCAGGGCACCTTATTGACCACCACCAACCCCCACTCC
-GCACCCTCTCCCACCACTGACTGTGGAAGAGGCAGGTGCTGTCTCAGTGGCAGCAGTTCT
-GCAGTGGGGTTCTGGGGTCCAGCAGATGGCTCACTTCAGCCCTTACACAAATTTTGTCAG
-CAGCCAATTATTGAAGTATTAAATCCTTTCTCCTTCAAAGGAATTTAATACTTGTTTATA
-AAATCCTGTCTAGAGTGGTTTCTGTTCCTGGCACCTAAAACAAACATAATGGATCCAACA
-GCCAGTCACGGGCAGTGTATGTGGGTGGTTAAGGGATGCAGCAGATGCCTGGGTTTCTCA
-AAACCCCACTGGcgaggcgggcagatcacttgaggcaaggagttcgagaccagcctggcc
-aacatggcaaaaacctgtctctactaaaaatacaaaaattggctggacgcgggggctcac
-gcctgtaatcccagaacttggagaggccgaggcgcgcggatcacaaggtcaagagatcga
-gacaatcctggccaacatggtgaaaccctgtctctaccaaaaatagaaaaattagctggg
-catggtggcacatgcctgtagtcccagctacttgggaggctgaggcaggagaattgcctg
-aacccaggaggcggaggttgcagtgagccaagctcacaccactgcagcctggcaaggcag
-cgagactccatctcaaaaaaaaaaaaaaaaaaccaaaaacaaattagccgggcgtggtgg
-cacatgcctgtaattccagctacttgggaggctgaggcaggagaactgcttgaacccaga
-aggcagaagttgcagtgagctgagattgcgtcactgcactccagcctgggtgacacagca
-agactctgtctcaaaaaaaaaaacaacaagaaaCCACTGGAGATTTTGCAGAGTTGTGGG
-GAGGTTCCCACAACTGCTGCTGTCAAAAACAGCTAGCACATTGCTCAGGATGCAGCTGCT
-TGTCCAGAGGGGTGTGAAGGGAAGGCGGACAGGCACCAGGGAGGCAGTCTACAAACTGAG
-TGCACTGCTTACACAGGAGGAAACTGACAAAGAGGCCCCAGAGGAGGCAGATTCTAGCCT
-GCAGCTTCCCCATCCCTCAAAGCATGCAGGTTATGCTTCTTGGTAAGTCTGAGTTGAGGG
-TAGGTGGCAGGGGTTGGTGGTCCCCAGTGAAGTTTTTAGTAAGGTGAGACAGATTTGTAT
-CTTGAAGGATCACTAAGGCAGCTATCGAGGATGATGGATTGGTTGCcttgaacacttttg
-gtgacaggcagctcagaagctctaggggcaagtcactgtttttggacaactttccagctg
-agccaaagtcaacctttttgcctgcttccactcactgaATATGTGACCATATATGACTAG
-GCAGAGCAGTAGGGGGTGAACTGGGGAAGATTATAGGGGTTGTAAACTGGCTGTCAACAG
-ACACATGTGGACCACAGTTTTAACTGTTTGGTGGGTGTAGTTAATTTGAATCCTATTTCT
-CTAAGGTGAGACACTCTTTCCAATTAGTCACAGGCTTCACCTTCCCTAATGTCTTAAGGC
-AACTGGCTTCACTCACATGTTATTAATCTGGTTTTTAAACCCTTATTTGAGGAGTATTAA
-GGATTGAGGATGCCTGAGAACTTGTAAATGCCAAGGGACCCTTGGGGCTGTGTGACCCTT
-GGTGGCAGCTACAGGCTGGTCAGGCTACAGAGAGGAAAATGGAGTGGAAAAGTAGTATCT
-CTCAGATGCCCTCCCCTTCGTCTCATTCCCCCCCTTCATCCCCACCCCTTGCTCCAATCA
-GAAGGTCTAGAGGCGATGGTGAGTGGCCAAAGTCCCTTTAATATCCCTGAATTGCGTTAC
-AAGTAATACTGCTGGAGGTGGGGAAGGGATGGGGGTTTGGGGGTGAGTTGGGATAGGACG
-GAGGAGGAGCGCCAAGCGCTCATACAAAATATGGCCAAAAGGCTTAGCATGCATGGAAAA
-TTATTGCTGTCAGAAGTTGCTATTTACAGGGTCAACGCCTCCATAATTGCTTCTGCTACC
-CCTCTCCCTCCCACCATCCCTGCAGCCTCCCTTCCCGCTGGGCCTGGAGCTGAGCAAAGG
-CCCATTCACCCCTCTGGAGCCCTAGGGAAGTGCCCCTGCTGCAGGGGTGCCTCCAGTCTC
-CCCCCTCTTTTGTGGCTAAGAGGAGGGGAGAGGAGGATCTGAGAGTCCAGGACTCCTGCC
-CCCAAGCTGGCTGCAGAGCAATGGGGCAGAGGCGTGTGCTTAAAGCGGAGGGGGCCAGGG
-CCCGTGCGCGTGGAGGTGTGTGCTTCGGTCCTCGCCCGGGCATGCAAAAGCGCAGCGGAG
-GAGGTAGTGGCGGCCAACGGGCGGGTGGCTGGCAGCCCGGCCCCTCTGTCCGGGAGAGTT
-GCATAGACATGGCCGGGAGAGAGCGCCCCTCCCGGGGAGCAGGCCAGAGGCCCCAGCGGG
-TCCGGGGCTCAGTCGGTCCCTGGAACCTGGGGTCCCTCGGGAAGAAGAATAAACAGGAAA
-CAAATCGAAGAGGCTCCTCTCTCCGGGCCGCCTGGAGTGGCAGGGGAAGGTTCAGGAAGG
-TGGGGACCTGCCCCACGCCTGGACCTCCTGATGCTCCCTCACCCCCCCAGTTGAGGGTCA
-GCAAGCTGCCCCCCCATTCTCGAGTCCCCTTCCTTAGCGAGTGCAGGCTCTGAAGAGGGT
-GGGTTTCTCCCGAGACGCGGGGGTGTGTGTGGTGGGGGCAGCCCTCTGTGGCCTGTGCTG
-TCCCTCTCCTTGCCTGGCTTCCTGACCTCCCAGTCCAGCTGGGGAAGCCAGACGGTCCCT
-GGGTGAGGCCAAGAGATtaaatagaataataaatagataaataaataaatacacaaataa
-ataaCTGGAAGGACCCAGCCGGATGGGGGAAGGGCATTGGCGAGGTGCTCCAGACCTCCC
-CCCAACAAGTAAGGAAGGGGATCTGTGGCCCTGGGGATGGGGGAAAGTGCTCAGAGAATC
-TGGGGGTAGGGCAGCTCCAGACTGTGGAAGCCCAGGTTGTGCCGGGGTGAGAGAGGGGTT
-ACATTAGGGGGCAGGGCCCTGAAGTGCCCCTCAAGCCCCCTCCAGGTTAGGTAGACTCAG
-AGGGGTGAGAGCTGCTAGAGAGGTGAGGGCAGCTGGAGCTGGGGCTGGGAGTGGGTGATG
-AGATCCCCATGGACTGAAGACAGTAGGAACTGTGTGTGGGAGTGGGGTGTGGGGGTGTGT
-GTGTGTGTGAATGGCCAGACCTAAGGCCTGAGCATGGATGGGATCAGGGACAGATCGGAG
-ACTTCAAGAAGGGTGAAGATTAGATCCCCAGATGGACACACTCTGGGAGATTCAGCAGAG
-GCCAGAGGGATGGTCTGGGGTTGGACTGTGGTCTCAGGGCGGCAGGGCCTGCGTCCAGGT
-GTGGATGGGGAAACTGAGGCAGGTATGGGCGTCAAGGGTATAGGTTTGCGGCTTTCATTG
-GGGGCTCCAGTAGAGGAATGGTCAGAGAGATTCAGCTGAGAAGCGAGAGAAAAGATCTAG
-AAGTTAGAAGAGCAGCGCGGGGTCTGGGAGGGAGAAATTTCCGGCTCTGGGGCGCGGGAG
-AGGTGCGGACCTGGTGCCTGAGTTGGGAGCCTTGAAGGCGCGGACAGGGGGGTCAAGGTC
-CGAGGGATGGCCGGAAAGGATGAAGTGGGTCGGGGGACGCTGGGGAAGACGGTGTGGAAG
-TGAGTCGTGGGTTTGGGGGTTGGGGAGAAAAGTTCCGGGCCGGGCCGGGGGTCCCCACGA
-GAGGGTCATGGGCAGGGAAACGCAGCCGGGGCTGGGCGAGGGCGCTGCGGGCGCAGGTAG
-GGGGCCCGGGGCGCGTGGAGAGCGAGTTCCGGGCGCGAGGGCGAGGCGGAAGGCTCAGCT
-GGCCGGGCCGGCGGGGGTCGGCGGGGGTGGCTCGGCCGCCTTGGCGCAGGCCGCCTCGCA
-GTGCTTGTGGAGGTAGGACTTGAGCGCGAAGCTCTTGTCGCACTGGCGGCAGCGGTAGTG
-CTTGAAGGCCGAGTGCGTCTGCATGTGCGCGCGCAGGTTGGAGCGGTCGGCGAAGGCCTT
-GCCGCAGTGCGCGCAGCCGAACGGCTTTTCGCCGGTGTGCGAGCGCATGTGACCCTGCAG
-CAGCCAGGGCCGCGAGAAGGCCTTGCCGCAGACGCCGCACTTGTGGCGCAGGTTGTGCGT
-GAGCAGGTGCATGGCGAGCGCGGGCATGGACACGTAGGCCTTGCCGCACGTCGGGCATTT
-GCGCGCCAGCTGGCTGTCCAGGCTGCGGTGCGTCTGCTTGTGGCGGCTCAGGTTCGACGA
-CGTGGCGTAGGTCTTGCCGCACTCGGCGCACGCGTGCCGGTGcccgccgcccgcctgcgc
-ccccgcgcgccccgcgcgccccccggcgccccccgcgtctcccgagccccccgcgtcccc
-gccgcccccgccccgccgccgccGCGAGCGCCCGTCCGAGATGAAGAAGGCGTCCATGGA
-GTAGCTGTCGGTCACTGCCGCCTCCCCTCGGAAGTAGCGCGCCGACAGGCTCGACTGCGG
-GCTTTCGGGGTCGCTGTACTCCTCCGGCGCCGCCGGCGGGTACGCGGGCTCGGCCGGGGC
-CAGCTCCAGGCCCGGCTTCTGGTCCGCATCGTAGCTGCTCGGGGGCAGGCGGTGCGGGGC
-GTACCCTGGAGGGGGCGAGAAGTGGAGGGGCGGTGAGAGGAGGCGCCGAAGAGGGTTTCC
-CGCTTTGAGCGCGTCACCCTTTGCGCCTTCCAGCTTGGCGCCCCTGTGGCAGCTCCGACA
-GTGGTGGTCTCCGACCTGCACCTCAGCTCTTCCTGTCAGGCAGCCTGGGTTCAATTCCTT
-CCTCCATCGACGGCAGTGCAAATAGCCGCCACCCCAACCCACGGAGCATGGGGCCAGCAC
-GGTtgtacagagcgtaccttcactatccagtgctcacaaccgcggagtgatggtcttata
-atacccacgctacaggtagagaaactgaggcgcagagagatgcagcagtctaaccttaca
-gtcaggaagtgatggagcccttgccagtgtgaccctgaagcccatgctgtctctattcca
-acaacatgctgccGTTGCAGCCCTGtaacttctctggatctcagttttctcatctgcaaa
-atggagcttgtgattggacacctccttccagggtcgttggaaggactgagtaaagtgacg
-ataataagcgtgtgttaagctcttactgtttgccagactctgcctcggtgctttacgcat
-gttaactctaatcgtcacagacccaaggaagtcggcactattgtaatccccatttgatgt
-gtaaggaaatgaacaaagGTGGGGGAGCATACAGTAATTGCTATATAAATGTTAGCTATT
-ATAATTATGCTTTTTACTTGCTTGGAGATAGTTTCctcccccaccacactgtgagctccc
-catggttggatctgtgtgcccagcacatgcctggctcaaagtaggtgtgcgatgaataga
-tgttgcatgaaggaatCACAATCCAGTTAGACCCACCTGCCAGGGTTGCTGAAGCATTTA
-ACAGGGGTCAAGTGTGTGGCATGTAATAGGTGCTACAGAAAGGGGACTTCCTCGCACCTG
-CTCCCAAGCCTGCTCTAGAAGTCGTCGGAAGTCCGCAGTGAGAATTCCCCTCCCCCTCCT
-CCTCCCACTTAGCTGGAGTTGGACCAGGAATCCTGTCTGCCAAGGGTTTGAGTGATTGGT
-GGGTGGGCAGGCTGGGGTCTCCCTGGGGATTCCGTAGGGGATTCTCATGGGCAGGGGCCA
-TTCTGATTTGCCTCTGCCTCCCATGGCCTAGGCTGGTCCTAGCACCTTCCCTGAGACCCT
-GGGGGCTGGGCTCCCTGGAGAGTTTCTGGCAGACAAACTTTTCATCCTGGCACTTGATGG
-GCAAGTGATTCCATTGTTCTGTGATTCCACAGAACAATGAAGGTTAGGTCCGTTTGGGAG
-GTTTCCCACCTGGGGAGTGGGATTTGACCTTCTCCTGGTGACCCCTGAGACCTGTAACCA
-CTCCTCCTTCCCTCCTCCCCTAGCCTCCTTCACTGAAGTGAGCAGGTGGAGGAGGGTTTT
-GTAAGGGGAAACAGGGTTCAAGATGTTCAGACTTTTAGCTGGGTACTCTGGTCAGCTTTC
-GTTTCCCACACAGCCTGGCTGATTCAGCctccaggcctttgcctctcatctggagtttgg
-gatggacacagggtgaagtctgtgtgcccctgaaggcaagggtgtgcccttatttttacc
-tctgtcccttcagcagccagcacagggccctctgcacacagaagtcattgtggattatgg
-aagtggatgaCTCGGAAGCGGGGGGCTCTGTGGTTGGATGTAAAGGGGGATAGTGATAGT
-GGCAATTTTTTAATCTGGGGAGAGGAGATGCCCAGCCTCTCCGCACCCTATGTCTCCCGT
-CCCATCTGCCTGTGGTCTGGAGGTCCCCCTGCTTCCCACTCCGGGAACCAGGCCTGGTAC
-TCAGGTCCCAGAACATTCAGGAGTGTTGTTTCAGACTGAGTTAAATACCCGTCAGGCACT
-CCCAGACCCCCCTCCTTCTCCTTCTGTATTTCCTCACGTTGTAATTCCTGGTGATGataa
-taatagctaatattcactgagcacttactgtgtgcaccaggctctgtgctaagtgcttcg
-ctcccatcatctcactgaatcatcacaaaactactctcatcacagataaggaaactgagg
-gacagtgtggtgatggcacttgctccaggggtggagcaaggattggaatccactgccCCC
-TTGgtttcccacatactgggaggtcctccaggagggggctgtggctgagctgttcacctc
-ccattcccagggccctagctagtgggcacttaataagtatttgtggaatgagtgaTGATG
-ATTTGCGAGGCCAGCCTCACTCCCCAGCCTAGCAGGACCTGGTATAGACAGTCCTGTTCA
-CCTGGTCTCAGGGCAGGTCTGCATCTCATGTGTCTGGGGCCATGGAAGGGGAAGGGTGGT
-TTGGTTCTCCAACACAGATTCCAGCTGAGTGCCTTTGGGTGGGTTGTGCTTCAGGTCCTT
-TTTTTTTAAAATGGGATTTATCTGGAGGGGTGACTGATCACGTAACCAGTGCTTTGAGTT
-CTATTATTAAaggatgacatattggataagagtaaaactttggtgccagacggcctggat
-tgttttggctctaccattcccagcagtgtgaccttggccaaacgatttggcctctgtgtg
-actcTACCGTTTCAGTAAGGGGTCTGCCAGTAAACAGTATATAAACAaatgataaccagc
-actctcagagcactcctgtgtcaggcactcttacaagggctttccacacatgaaagcatt
-ctacccccatgacacacaaggtggtaggtacccttttatagaagaggaaaccaaggcaca
-aggaagctaagtaacaagcctaagattgtgcagctgataagttagagccaggattccagc
-tcagTGGCTGGCACATTTTAAATCCACCACGCATGTTGGCTGTTATTATGAACAATAATA
-ACAATCTCCCCAGATGGGTTTCTGTGCTGCAGCTTTCTTGGCATCTGCCCCAACACATCG
-TGCTGCTCCTCTCTGGGCCTCTGTTTCCTCACCCGGGATGTGTAATTTCTATTTCACGTT
-CTGATGGGAAAATATCTGGTGCATAGTAGGAGCTCCATCAGTGAACCAGAGCGTTCTCCA
-TGAGGTGCTCTGCCCATGGCGCCCTCTGCTGGTGGCCCTCAGCGCTGTTGACTTTCCTCC
-TGTTGCAAGGGGCTCTTTATGAAGAAATAGGGGTGCCTTCAACAAAGGCTGCTCATTTGC
-CTAGGGAGGGCTGCAGAAGTGTCTTCAGGATAGGAATTGTGAGCCCAGACCAGACACCCA
-GTCAGTGGATTTTGGCATGGGTTGAGAGCATCCTGTGAGAGTTTGTGTGGTCATGTTAGG
-AGGAGGTGGTTctaacttgctttgtgactgtggccaggttgcttaacctttctgggcgga
-atctatacatgacaaagatggactggaatggtctaaagaccctttctgcATCATGGCTGA
-ATCAGTCCCTCCATGATGCTCTTTGTCCCCTCCACTCCCAGCTCCTCCAATTCCACCCCG
-TTTTCCTCAGATTCACAGACATCTCCctaggcaaccttgggcaagttacttaacatcttt
-ctgccacacctgtataagggagttcataataaggctgaataaatgaatgcatgtaaagtg
-cttaggacaatgcctgacacataatagctgccctcttgagctgttattattGTTACTGGT
-AGTATTCCTGTGTTTCCTGGTGATATATCCTTCTAATCTGCCAGAGAGTAGGAGATACAC
-ATGGGTGTCTTAGGCTgctgtgtgaccttgagcaaaccacctcacctctctgagcctcaA
-CCCTGGAGACTCCTTTAGGACACTAAAAGCCATACTTTAACCTAATGCATGGAACCCAGA
-CAGGTACCTTCCTCTGCCCTAAGAGTGACTATAGAAGGCTGAGATACCTATCCTGCAACT
-GACAGGGTGAGACAGGACTCTTGTTTGGGTTCCCAcagagatagggatgagctgggattc
-agagaaaagagaatctcaggtgagatctctcatcctagcccttgaattcaggccgtagcc
-atgtgaccttgggtaagtcgcataacttatctgggctcaaatcctccatttgaggaatgt
-ggaccagaggcacccctgtcatgtagggatatggggaggGCCCAGAAATACTTTGGAGAT
-GTGCACATGTCACCTGGAAATGACTTTGGTTTTCCCTGCCCAAGAGTCTTGATATTTTAG
-ACTGAAGGTCCAGAATCTGTCTTTTTAAAAATCGGTACTCAAAGGAGTGGTGAAAGGGAA
-ATTTATGAGAACTAAGGTGCTGGGCCCTCTGCAGACACTGTCTCATTTAGCTGCCTGACC
-CCCTGCGGGGATGGAGGGGGATGTGTAACAAATACTGCTACTGCTACTGCTGGTGCTTCC
-AACTAGCACCAGCCTCCCTGTGAGCCAGACATTGCCCTGTGCCCAgaggcccagagaggg
-gagaggatttgcccaaggtcactgagagggaggcggcaggtttgaaaccctccaaggcct
-gtgttttttccaaaacaccaGAGAGGGCATGGAGACTTGCTGGGGAAGAGATCTTCAATT
-GGTAGGGGAAGGGGTGGTGCGTTTCCTCAAACACTCCCTAGTTAGCCTGTGGTGGGGTGG
-GTGGGGGCACGGGGTGGTGGGGGCATGGAGAAGCTGTTGTGGAAAATGCTTCAGCCTCTT
-GTAAGTATTTGTAAATCATACTTAATaacagtaatgcctatcacttactgagcacttact
-tggtgcaaggcatcctgctaaatgctttgtgcacattagctcatgtctaaggtcacttcc
-ctccatgcccttgttctgcagaagctgaagcccagacaaaggccttgacccacctcaggt
-cacaaaacaagttctcatcagagctgggttggcctccttttctttcctttttttcagtcc
-aggactcctttccccagtctctcccagACTCCCAAGGTGCCAAACTTTCTCCAGGGAATT
-CCTAGCCTCAGCCTCACCTCTCTGTCCTAAAATGGGCAGAAAAAGACAGGGGCCTGGTGG
-GGGGCCAGCTTCCCCGGCGGCCCACTTTCCTGAGGAGGGCTGGGCCCTGCTGGGTGGTAG
-GGGCTGGAGGAGCTGCTGTATGGGTATATTTAGAGCTGCTTCTTGCTGTGCCAGGGCCTC
-GGGCCTCGAGAATCAGCTCCAGCCAGCTGAGCAGAAAGCCAGGTCTGTCAGCAGCAAAGC
-GGGATAAAAATAGTTTCTCCTGTCTGCTCACAGAGCTGGGCAAAGGGGCTGGGTACCTCC
-CCCTCCCCTTATTATAGCATCTTTGTTAGCGGTTCCCTGGGCACTGGACCAGAAATGACA
-CCCACCTCCTCCAAAGGCCTGGCAGCTGGTACATCTGCCCACGGGGAGGAGGTCCCTGTG
-CCCAAATGAGCAGGGGACAGAGTGAGGTCTGGCCCAACATGACCAACGCTGCATGGCTTG
-GGGCTGATGCCCACTGACCCAGGCCCAAGGAACTTTGAGAGAATTTCAAGGCTTTTCCCC
-ACCACCCCCATCTCTTGGAATTCCCCACATTCTGGTCTTTCCTGACTGTGACCCAATTCC
-TGTGGCCTACAGGGAGGTCCAGAGCTCTGCAGGAATCAATAGGAAAGATTTTTCAGGGGG
-GTATGGAGATGAGAGTGAGTGGCTCAGGGTCTTCATTTGCCCAGCCTGGGTTCGTAGAGT
-TGCCTCCTGCTCCCTCGGGGGGGATCTCCAGTGGGCCCTTTCTGGGCCTCGTTCCGGAGA
-CTGGGTGTGTTGTGCAGTGCTCCACCTCTTCCCCCGGCCTCCTACTTTCTGCTCTGCCGC
-CTCTCTCTCTAGAAGGGTGCACTCAGAGGGCCCATTCCAAACCCCTCCCTATCCAAAGGC
-TGGCCTGGCAGTAGACGCTTCACTTCAGGGGAGTCCACAGCTGGGAAAGAGACCAAGAGG
-CCCGAGGGACCCCATCTCTCCCGGCAGAGGGCCTCCAGGCTGTGGGGGCCCCTAAAACCT
-GTGGATGTAGCACCCACTAGGGAGGTGTGACAGGGTGCACCGTTTATGCTCTtgtgactt
-tgggcaagtcacggcctctctgtgacctcagttttgcctctgtaggttggagtgaatCCT
-CCCCTGCCCCCCGCTGCCCTTTGCCCACTGTGGATTTGTGTGGCCAGAGAGTGCCTTTGG
-GATGTGTAGATTGCTGTACTGACATAAGGGACTTGGTGTACTCTCTGGCCCTCCTTCAGC
-AATCAAAGACTGAGACTATCTAAAGTGTGGAAGCTCAGCTCAGGACCCTCACGTCCCTCT
-CGTAACCCCAGGCTTTAGAGGAAATCAGGGGTTCCCAGATTCCATATCTCACATGGGCCT
-CATCATTCCACACTTCCACTGAGCCCTGTTAATTCACAGGAATATTAGATTTCTGGGTCC
-Ctagaaggtcaaagctgaaagagatcatattcaaccgtttgatattatgaaaggaaaaca
-gaggctgggaggagaggggagactaggccaaggccacacagaaggctaatggtgagtcta
-agacttgaactcagCCCAGCCTTGAGAGCGGATCTGGACAATGACCTTGGACTGGAAACT
-GGGCCTGAATCTTGATTCTGGACCCAGCACTTTGCCCTGGACCTGTTCATAGGTATTGAA
-ATTTGAAATTGGACATGGATTTGTCCTGGATAGCAGACCTGGACCTATAACCTCAGACAC
-TGACCTTGGACCTAGTCCTTGGACCTGGTCCTATACCTGAAGTTTGACGTAGGCATTGGA
-CTTGGACCTCAGATCTGTACTTGGATGTTGGACTGAATGTTGGACCTTGACCTAGACTTT
-GAACCTGGGCCTCTGACATGTCTTTAACCTGGACCTTGGACCTGGACCAAGGCCAAGTTA
-CCAGGGAAAGGGGTGGTTAGAGAAGACTCAGATGGGTCTGCTGTGTGTCCATGGGCACCT
-CCCCAGCCTTCTCTGTGCTTGCTCTTCCAAAAGACTGGGGAAGCCCTTTTGCATTGCTGC
-TCCCCAGAGGAGCTTTCTGAGGTGTGGAATGGATGTGTGGCAGCTGGGGACATTGGGCCG
-GGCTCCCGGGCTTGGCCTGGAGCGACTACCCGGCACCATCAGAGGGAGTGAGAGGAAGTG
-GGCGCTGGTTTAATGTGGTCAGCTAGATAAGCCCATGGGTAGAAGTAGGAGAGTTTCCTC
-AGCTTGCTGGGGGAGGCTTAATGTAGCTGCAGAGGGCAGACAACTGTGTTATTGGATTGG
-CATTGATCCCTCATCTGCCTGGGTTGGATGCACTCTGAGAGGGCAGGAGGGCAGGACAGG
-GCGGGGATGCAGAGGAAGGGGGGCCTGGCTCCAAGCTGGGGTTCGGAGTTAAGGTGGAGG
-GGAGGCAGACACTCCAGAAGATATTCTTGGCAGGGGCCCACAGAGACCACTGACATGCAT
-GTGGGTGGGCCACCTTCTTTGGGGTGGCTGAGAGTCCCAGTATCCTTCAGATGGGGGCCC
-CGGTCTGTGGGGAGGGCCTGGTGGAGTTGGAGGGTGAGGTTAGCAGAGGGTTAGGATGAT
-GTAAGTTGGCATCTCCCAGAAAGACTGAGTCTGTGCTCAGAATCACCCAGGGGAGAAGAG
-GGGAAGGGAAAGCAGTGGAGGAGCAAGAGAGGCATCTTACTTGAGGGGACAATGAAATTA
-GATCTATTCCCACTTATCAGGGAGCTCTGCAGAGAGACCTGGTGCTTTCTTCATTTGAGG
-GGCTCCCCTTCCCTGTTTAGGAGTTCTGTGGGCTTGGGGGGACCCTGGAGCACAGACAGA
-CTTGCTGCACCCTCTGTTCTGCCTGGCGGTAGAGGCTGAAAGGGAGTAGGAAGGCAAAGA
-AGAGCATTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgcgcgtgcgtgt
-gtgtgtatgGAGGAGGAGCAGGAGTCCTCCAGGAATTCTCCAGCATTCTCAGGCATTCCC
-AGAGCTGGGGTACACCTCTTTAATTTGGGGTTCTGCATCTTTATCAGCTAGGAGCTTGTG
-GTTTCTCTGACCTCCACATTCACAGGCTCCCCCAACCCCTGCTCCCCCGACCCAGGTTTC
-CCTCCCGCCAGCCTCATCCTGACCCTGCAGCCCGAGCTGCAGGAATGGCTTGTAAGAAGA
-TCTTTCTAATAACTGGAACTATCTCCAGCCCCAGGCCTCCcccgccctccctccctccct
-ctctccttccctccctcccttgcttctcctccctccctctcctcatcttccccccctccT
-CTCTTTCTCCTTGTTTACCCAGCACACTTACACACGCTGAGAGAGAAAAACGTCGGCTCA
-GCAATTTTTCACACTTCCCTCAAATGCTCAGCAAGGTTATTTCCGGCAGAGCGGAGACAA
-CGGGCCACCAGGAGCCGGCGGGCTCTCAGCAGACCCCCAGCACCCTCCACCCGCCCAGGG
-AATAAGGGATCCCTCACTGCCCAGTCTGGCCGCACCCCAGGGAGGGAAGAGGCCCCTGAA
-AACAAGACAAGGCAGACTTTGTATTTCCCAGTCATACCTAGGCTTGGTCTCTGGCACTGA
-CCGTCCACTGCAGACACTGCCAAGGTGGCCAGGCCAGGGTGCCTGTCCTCACTATGGGGT
-AGCCTACAGAGACCAAAGCCAAGAAAAGTGCCCGATCCCAGAAATGCCGCTACCCTCAGC
-CAGGTGGCGTATGTTCAGTGGAGCCCTAAGGAAACCCTGACAGTGGCCTCCCAGCATCCT
-GTTAGACCCCTGTGCAGGCATCTCCAGTGCCTGACATTCCATAGTTGACCTtcacagaag
-ctgagcttgtcaaagttggaaggatgcttagtttatgccatcaaaactctttcactgctg
-gggaggctgaggaccagagaagggaaggcacttgcccaaggtcacacagcatgtgagaga
-tctagagcccaggcctccaaatttcaggccaggtttctggctatcagcacagccTCAGGA
-TTCCTGAGAGGTGAGGGAGTTGGTCTGGAGACCCATGGGGAAGGGGACAAAGACAGAGGT
-GGTTCTAGGGTGTTAAACCCGGTGGAACCTCTGCAGAAACACCCTGCTGGTGGCTCTGCA
-CCCGCCCTGCTTCCCACTATTCACTCAGGGGCTCCTTTCAAAGCTTTTTTTTGGACTGAA
-TTCAAGGCAAGGCATTCTCTTGCCTCCCTCCTGAGGAACAGCCTGCAGTTTTGGCTGTGC
-ATGGGAAATTCTCTGGGCTTCTCTGGGTTTCCTCAGCTGGCCTGGGGACAGGACCAACGG
-GGCTTCAGGGGGTGGAATCCCAGAGCTTTGTGTCAGTGTCAGTCCCTTAAGAGATCCATA
-TCCCAAGCTTGCAGATATTTCAGTTTCTACCAGCTTTGAGCGCACACTCTCCAGCTTTGG
-CATGGCCCCAGGTCCACCCTCTGTCCTGCCAGCCCTCAGCCCTGCTCAGCCATGTCCCTG
-GGCTTCTGACCTCCACCTCAAGAGGCCCTGTGATCAAGAAAAGAGGACAGTAGAATAAGG
-GACATGTGGGCAGAGGAGAAGGGGTTTCTGTTAAGGGTCTGGGGGATGCCAGTGGATGAG
-GGGCTGTAGCTGTATCCCTGATCACTCTGTAACTTCTTTGACCTTGATGAGGTCACAAAG
-CCCTTTGCCCAGCACTCTCTCTCTCTCTACCTGGTGTGGCAGAGTGATGGAATGTGGGTG
-AAGTGCTTGGAAATCCCAGAGGTGGAAGCCCCCATCCTCCCAGGCTCCTGTCTTTGCCAT
-CTCAGTTCCCCCCTCATCCTCAGTCCTTTCTTTTCTCctctctcaatctccctctttctc
-tctctctctttccccacccccatctctctctctctctctctctcacacacacacacacac
-acacacacacacacacacacacacaACCCAAAGCTGCCACATGTGATGTCAGATCTCTCA
-CTACCAAAGGGACACCTCCTCTTCAGACACCTGCCCTGGTGGGGGCCATCAGGGGAGAAC
-CCCTTTGTGATCCCCTTGGTGGAGGATGGGATCCACAGAAGCAGTCTCCACTTTCCCCTG
-CCTTCCAGAGATCACCCCCTTCTGCACCTGAATGACTTCTCTTGTTCCTCAAACCCTTGT
-CCCTGCAGGAACTTGTTCTGAGAAGAGATGGAgtgtgtgtgtgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtatgtgtAGTGAGGAGGGGGCTTACGAGGAGCAGCAGGGTTGGTT
-CTGGAGGGGGTTGAGAAGCTGGGGATGGGGAAGGAGTGCAATCCAGGGGACCAGGAGCCA
-CTTTGGGGGAACCCCTCCCAGAAATCCTCTCTTTCTTGCAGTCCCCAGGACAGGCCCAGC
-CTTTGGCAGGCATGTGGCTGAGGGTAACAAAAGAGTTATTGAGAGAGGGGGTCTGAGAGC
-ACTTGTGTGACATCGGCAGGGGAGCAGGTTTGAAGGGAGGGAGGGCGCCCCCAGCCACCC
-CCAGGGAACCAACCCTGTCTCTCCAGGGACTGAACATCCAGGGCTCTTTACCTTCCCCCT
-TCCCGGGCAGCCAGCTTCTCTTCCTCAACGGGGGAGAGGGAACCCTCAAAGTGCCTTGTG
-CCTCAGTGCCCAGCGCTGGCCTTTCACGAGCAGCCCCGTCTGTGTTCTCTTGCCACCCCC
-TCACTCTAGCCCTATTTGAGGGCCACAACTTTCAAAGTCCCGGCTGGCGCGTGGCTGCGG
-GATGGGCCGACCCCGCGACTTTCCCTTTGTACGACCTAGCCCCTGCCCCGCCCGCACGGC
-CCTTGGAAAGCCCGGGAGGAGCCCACGGCCAGAGAGATCTCCTCCCGGGGGTTTCCTGTC
-GCACGCGCCCCTCCTCGTGGCCCAAGCTGGGGAGGGCCCCAGCTCCCCTCGCCTCTTCTC
-CCAACCCCCCGCCCCCGCCGGGTCCCACTCACCGTTGTCCCCGGGAGGCCCCCGGGCGCC
-AGGCAGCACGTAGGCTGTCTCCAAGGGGTGGTAGGTGGGGGCCGGCACCCCGCTGCACTG
-GAAGCCGTCCCCTTTGATCTTCTTTACCAGGAAGGAgcgcggcatggcgcggccggcgcg
-gggctcggtgcggggaggcggccggccgggcgcgATCGGCTGTGTCCGCGCGGGTTTTCA
-GCACTGGACAGCTCCCAGCGGGCTGGAGCGCGGGAGGCCGCTCGGAGCCGGCACCGGTGG
-CGGCGGCCCCGGCTCGGGCTCGGGCTTGGCGGCGGCGGCGCGCAGACAGGGGATCGCGGG
-AGCTGCGCTCAGCACTCCGGCTGCCGGCTTTATATGGGACGCAGGCTGGAGATCAGGTGG
-TCCCCTAGCAATGGAACCGCTCGGCGCTCTAATCCATCAAATGTCCCCCAGGACAATCGC
-TCCGCACACGTTCCCCTGAACCGGCGGCGGTGGGGGCAGGCCCGGAGCaggcaggagggg
-agaaagtgagggcgagaaaggcgcagagacagagagggacggagaaaggggagtgagggg
-ggcggggagaagaagagagactcggagaaagacagagacatacagggaaagagagacgca
-cacgctgagagaggtagaaatagaagcagagagaccaagataaggacaaaaagacacaag
-agagaaacagagagagaagaaagacagagaTGGAGAGAAGTAGCAACACACACACACCCA
-CGGGAGGAAAAGAGAAATCCAGGCACACAAAAAGGAAACCCCCCCAGGGATGCAAAGAAA
-GGGAAAGAAAAGTGCAAAAGAGAGGGGGAAGCCGAGGGGAACGGAGGGAAAGCGGTCCCG
-AGCAGGCGGGGTTCAGGCACATGGGGCCGCAGGGAAGGGGATGCAGAGGAAAGAGTGCGC
-ACTGGCCAGCGGCCACCCTCCCGCCTCCAGTCCTCTCCCTCTCCCCCAGTTCTGAAGTGG
-CCAGGGTGGACGCTCAGCTTTCACTAGAGTAAGTCTCCCCTCCCCCCTGCTCGGGCTCCC
-ACTGGAGCCCCCTGTTGGGTTTGGGGTTCAACTTTCTTCTTCCAGAACTGGTGGGGGGAG
-CAAGTCCCCCACGCCGATGCCTGGCCTTGCTCGGTTGGTCCTGTTCCGGTGCCTAGCTCA
-GGCGGGCGCTGCAAGAGGAAGTGAAAATCGTCCAGTAATTAATTTTCCTGCTGCCGGGGG
-GTGGTGGTTTTGACACATCCGAGGCAGTGTCTTTCCCTGAAGCGGGGAGCAGACAATAGA
-GACACGTGGACTgggaagggagaggggggaagggagggggagcgggGCTCCTGCTGGAAC
-TCTTTGCAGGTCAGCTCCTTTGTCTCTAAAAGGATCTGAGCAGACCCGCCACCCCCAGTC
-CGACCCAAACCTGGGGGAGCCCCCATATCTTGGCAGGACCAAGGAGCAGGAGAGCTCAGC
-CCCCTGCCCAGAGGGTGCTGGGCAAAGCCCCATGGTGGCGGACCTGCTTTAGCAAGTGTG
-GGATGGCCAGTGCACAAGAGTCCCAGAATCAGACTCTAGGAATTCCAGGCTCTCGCTGTC
-AATGGAATTCTGGTTATGAGATGCAAGGCTGGTGGAGTGGGGATGTCCTTTTGGGACTGG
-GTCATCCAATACCAGTTTGCAGGCTAAGACCTAGAGAGGGCTTGGAGGTGCTTGAGGTCA
-TGCAGTGAGTCAGCAGCAATTGCCAGAGACCTCAGTGGCCTCTGGGCACCACTGAATCAG
-GGCCTATCATGGTCCTTGAGGTGTAGCCCAGAAGTCTCAGAATAAAACTGGGGCCCCTcg
-tggtggttcaagcctgtaatcccagcattttgggaggctgaggcaggaggatcacttgag
-gtcaggagtttgagaccagcctgggcaacatagtgagaccttgtctctacaaatagttaa
-aaaaaaaaaaaaaattagccaggtgtggtggtgcacacatgtggccttagctacttggga
-ggatgtggtgggaggatcgcttgggcctgggagttcgaggctgcagtgagctgtaatggc
-accactgcgctccagcctggatgaaagagcgagaccctatctccaaaataataataataa
-taataataaGTTAGAGTTTCCAATGCAGGATCTGTTGGCCTTGAATATTTTCAAAAGACA
-TAAAGATGCAAGGATGTGGAAGCAGAAGGTTTGCCATTGAATTTGCCCTGTATGGTTTTA
-GATTGTTTTCCCTGACCGAAATAAGGAATTAAGGCAGTTTACTCCCTATATATAAACATT
-GAAAAACATTGCAGGTCCAAAACAATGGGGGCCCCTGATCTTGCCAAGGCCCTGCATGGT
-CTAGAGGTCCCCCACCATCTTTCCTGTTGCATTGCCTCATATCTTGCCCATGGGAAtttt
-ttttttttttgagatggagtttcgctctcgttgtccaggctggagtgcaatggcgcgatc
-acagcccactgcaacctccgcctcccaggttcaagtgattctcctgtctcagcctcctga
-atagctgggattacagggtgcgccaccatgcctggctaattttttgtctttttatcagag
-acggggtttcaccatgttgcccaTGGGACTTTTTTAAACCTCTGTCACTGAGAGTTGAAG
-TGACCACACCCTTGACTCATGGCACGcccatgcattctctgctccagccataggtgccta
-ctggtgctttgggcttgcagctctcttgacctgtataccatttccactgcccagagtcct
-tccctgcacttcaccctaggaaacccctacttgttctcaagactcagccgaggggtcact
-tcctccaggaggtgtccctgacttccatcattgcagactgggccaactcacccactggtc
-cctgagcttcatgaggacaaagactctgtcccatgtatggcttaacacACTCTTAACAGT
-GTGCATGAGGGTCttctagctcccctacttattagccataggtccttggacaagttactc
-aaccgctctgtgcctcaatttccccacttataaaatgggaataataattgtcactaccta
-agtgttgttgggagtgttagaagagttactacatataaagggcttggaatggtgactggc
-atatggtaggagttcaatGCTTGAGGGTTCTATATATGCAGTTTTGCCTGTAGCATGCAG
-CGCTCATTTGTTACATGTTAGTGGGATTctgtggaatgagtggtgaactaggcatctctg
-gtccctgctttcttgcagctgatcttgcagctgtccattcattgagtggatggacaccaa
-gcaagaaaatccttaaatcaacaatatattttcagatagttgaccagtgctgtgaggaac
-ataaaacagggtgagatgatggagagtgatggtgcctttaggcagggtgaccagcaaggg
-tctcctgggagaggtggcatgtgcacctagacttgagccagccatggaaggagcccagga
-aagagtgctccagccagaggcttcacaagttcaaaggctctgaggcaggaatgagcttga
-gcagctgaggacagcaagaaggGAAGGAAGATGAGTTCAACATGTTAGCAGGGCCAGACC
-CAGAGATTACTCCATAAATCCCAaatgaatgagtgaatgaaagaatgaatgaTTGTAGGG
-GTGAGATTCAGCCTATAACTATAGCTTACAACTGTGACTAAGTAGACCTATTGGTTGGAG
-AATAACTTTTCACTGTTTACATAGAGGAAGTTGCTTATTTGTTCAGTCATTGACAATTGT
-GGTATAGCCATATTTTTTAGTTTGTGCTGGGTACTTGGATCTCTGTCCTCTAGGGGTGCC
-TAGTTCACTGTGGGTAAATAAGGCAAGTGGGTGTCATCTAGCTCACCTCCACCTGCCTGA
-TGGTTCTACCTCTCCAACCTCACATCTAAGAGATGGCAAAACGGATCCCAGAGTCCTTAA
-AAAGGAATATAGGTCACAGCAACTTTTGACAGAGCTGGGACTGGACTGTTCTCACTGGGC
-AAGATAGTGATCCACCCCTTAACTGATCAAAGGAAGCCCCACAGAAATGGTGTATTAATA
-GGTCCTGCAGCCCACTAGTGTCGGGTTGAGGATAGAACCCCAGGTCTCTGACCACAGGTT
-GGAAGGTGGTGTGGGTGCATTTAGCATATGAGAAGAAGCCTTGAGCCCTGAAGATGAGGT
-TCCAAAATACCTTCAGAGGGGAGGAGGCCTTAAGTATGGATGAAATACACAATGGCCAGC
-AGAATTTCATCACTAGGACACCAGGAAGGGCCTTCTGTCCCCCAAACCTCCCCCCACCCC
-AGCTTACTGGTTTcaggaagttcactgtggggaattaatttctctaagtcacatgaaata
-aggaaataacttttattcccaaggatgttcgctgcagcatcagagatggtaataaaaacc
-ctgggttggagaaagcaaggagagggttgtgaagaagacgttcactccatgtagtattct
-gcagccattaaaaattctcatttggggagaaaagctcataaaatgtgttaagtgaggggt
-gcagaatacagaaacctctcacagcacgttcacaaccatgaaccaaaacaaaaataaaca
-cacacAAAAGAGTGAAATAAGGGTCTGGAACTATGGGGTTTCCCTCTCCCTTCTTTTTGT
-GTTTTCCAAAAAGATCATAAAATATTTCAGTTCagccaggtgcagtggctcacgcctgta
-atcccagtactttgggaggctgaggcgggtggatcacgaggtcaagagattgagaccatc
-ctggccaacattgtgaaaccccatctctactaaaaatacaaaaattagttgggcatggtg
-gcgcgcgactgtagtgtcagctactagggaggctgaggcaggagaatctcttgaacccag
-gaggtggaagttgcagtgagctgagatcgcgccactgcactccagccttgtgacagagca
-agactccatctcaggaaaaaaaaaaTAGTTCAACAAATATTTATCTTGAGCACTTGCTAA
-CTGTCACTTACTTCCAAATAGAAGAAATGCTGAAGTTTAGTAAACCATGTCAGGATATTC
-ACTATTCATTCTTCTGACTTTTGGGAAGTTGGCATTGTGAATTTCCCCAGTGGCAATAAT
-AATTATTAGTACATCGCCAGCAACATTACAGAGCCACCCCACAGGCCTGGCAGTGTGCTA
-AGCACTTTCCCTTTGAAGAAGGTGACCTTgcctggggctttagattgagggatttggagt
-cagcctattttcagtttaaattcctgctctgccatttcccgactgtgtaattctctgtgc
-ctccattttctcatctgtaaaatgggtgtataaattgggcctgtctcacaaggttgcagt
-gaggattaaatgataatataggcatcaagtgcttagagcagtgcctggcacacaataact
-tgataaatgttgacagttgctatttacatatcctcacttatctaagccttaccatggcct
-catgggagaaggtgctgttattGAAATGACTGGTTCATGGCTACATAGTCACTGTACAGA
-GGAGCTAAAGAGTGTCCCATGTCTTCATGGCCTACTGCCTTCCTGCCCAGGAGCCCCAGG
-TCTTGGCATAATAGGTCTAGCTGGCTGCAGGCTTAGCCCTCTCTGGCCTACCTCGTCTGC
-TCTGGCATCTTCCATATTTCAACTGTGCCCTGCCCATCAGGAAGAAGGGCAGTTCCCAGG
-GTCTAGGTGTGAGTCTCAGGGCTGTGTGACCCTAGGTGGCTGGCAGAGCCACCCTGGGCC
-TCACCCTGCACATCCATAAAGAGGGGTTGGGGCATCCTATGATTCACTGGCTTCACTCTA
-TGGGGTCAGgaaggagcactgacctgggagtcaggagcccagttccagccctgcttctgc
-tccctttgccctcccctttgggccccagctttcttgtctgtcaaatgggaatgggacaag
-atggtccctgagctgctgtccagACCCGGTAATGGAATTCTGTATGAATTCCAAGGAGGA
-GAGTAGCCACAAATGCATCCGCTCCACGCTGATGGGGCTCTCTCTCCGGTAAGCTTCACT
-TACTCTGCCATTTCTCCAGTGTATTTTATCAGACCCACCTCCTCTGAGCCAAAGAAAAGA
-GGGTAGGAGCAGGATGAAACAAACTCACAGCTCTGTTCATTCAGGCTCATCACAGAGATG
-ACTTGCCCAAGGGCATGTGGCAGGTCCTCTGAAATTTGAGGAAGGCTGTGTTTTCTTTtg
-tgtcactttggtcctccgggaagcagatgtgaaaatggaggtgtaagtgtaagagattta
-ttgagaaaacaccgtgagaaatggaggagagccttcagagagggatgcaggtctgatact
-gtgaaaggagaggtggaataaagaaagattggggaagaggagcctcaggccatggtgcag
-gtctaaggaagtcctagccaacccaacagggagctcctgtgcaaagatttcctgtagagg
-agtcccgtgctcgacagaagggcagaccctagtttcccaccatgctcagtcatcagccgg
-cctgtcctggaagagtggctgtgctgacaactatggcagattgcaaaggtgttgcagctg
-gaggctctcagtgactgtagtccagagaagatctgagtggcacctccctaaggctgccac
-aTGTTTTTCTTTATTCATTtaatagacacttacagaactctgggccatgtgccagttact
-gatctatgcactttacaaatattaccttagttaatccttaccctcgccttttgagacaga
-tggtatttttagccccattttatagagggagaaactgagcacaaagaggttaagtaagtt
-gcccaaggtttcacagccagtaggtgataagccacaaatccaacccaggcaagctgcttg
-gaggctctgctctgaccactccaccacactgCCTCCTCTCCAGCTGCAAATGCCTTGGTG
-GCAATTTCTGGGACCATTTCCATTTTCATTTTTCATTGGCTCAGGACCTCACAGCCTTAA
-CAGGAAGGGGCCTACTGTGGTGGCTGGGGGCATAGCAGGGTCCCAGCTCCCCCTGAAGCT
-TCTAccttgctccctcaaagacttccacctcaaagcctttgcatatattgttcccactgc
-ccagagcactcttccacccccttccttgcctaggtaacccctcctcCCATCGCTCCCTTG
-CCTGACCCCAGGATCTAGCCCAGGATAGGGGTGATATGTAGTGGAAAGGAGCTagttgac
-atttattgagcacttattatgtgctaggagccaagtccagccctttacatagattgcctc
-acttaaccatcataacaacctgtgagtgtggcccatggctatccccattttacagatgag
-gaaaccaaggctcacagatgcaaggtgacttgcccaaggagacccagctaggaatcagtg
-gtgtcagtatttaaaccaggctgcctggctacaaagtcctgatcttAAACCATGAGTCCT
-TCCCTCTAAGAGGGCAAAAGATACCAATGCTAGGGTGGGTAGGTGAGGGCCCTCCAAAGA
-ATGTCCCTCCCCTtccccctgccagggctgacagctccttgagtgggattccggatctgc
-tccattcattgccgcacctccatcgtctacccagagccgggtaaatagtaagtgctcagt
-aaatacatcaattgaatgaataaaCTAATGAGTGAAAAACCTTCTTGCGACCCGCAGTCA
-CCTTGGTCCCCTTTGACCAGAGCCAGGTTGACGTGTCAACCGTCAAGATATCCCTCTGTT
-TTGGGTGATAATTAGATTTCTATCTTGACTGTTACAGACATTGGTATTCCTCCATTAAAA
-TGTCTTTCTTTCAggccaggtccggtggctcacgcctgtaatcccaacactctggggggc
-cgaggcgggtggatcacctgagttcaggagttcgagaccagactggccaacatggtgaaa
-ccctgtctctactaaaaatacaaaaatcagctgggcatgatggggcgtgcctgtgatccc
-agctactcaggaggctgaggcatgagaatcgcttgaacctgggaggaggaggttgcagtg
-agccaagactgcgccactgcactccagcctaggtgatggagtgagactctgtcttaaaaa
-aaaaaaaaaaagaaagaaagaaaaGAAAAAAAGTCTTTCTTTCAAAGTTGGAGACATCCC
-TAAACATTCTAACTCCTGTCCCTGACAAGGTCCCATCTTAAGCAGGTCTCTGAAACCTCT
-GGAAGAAGGAATTGGCTATCAGGAGTCTGATCACCAGGCTGCCTGCGGGGTCAGGGTATT
-TGGGGTGGGCCTCTGGCATGGTTTAGCGGTGGGCTGGCCAAAAGCCCCTAGACAAGAGCC
-CACCATTCAAGCAAGTGGGATAACTCAGCGTTTGGGCCTGGGTCACCCTGAGCCAAGttt
-tattttttatttttattttgtagaggtagggtcttgctctcatccaggctgtagtgcagt
-gttgtgatcatggcttatggcagccttgaactcctggggtcaagtgatcctcctccctca
-gcctcctgagcagctgggactacaggtgcatgccaccatgccctggctaatttttaaact
-ctttgtagagatgggattttgctatacttcccagactggtctcaaactcttggcctcaag
-tgatcctcacgcctcggcctcctaaagtgctgggattatagatgtgagccactgtacctg
-gctgagccaaattttaatcctggctctgcctcttcaagctggttggccctgggcaagtta
-ctttgcctctttgcagctctatttcatctctgtaaacagaggccagtgggagcacctgct
-aagtagggctgtAGGGGGCTTCATGTATAGTCAGCCCTTGGTAAGTGGGAGCTCTActtg
-aagggcctttgagataacagcattgtctcctccccacccccatttgacagttgtggaacc
-tgaggcatgggacagggaaatgctttccctggaacattcaggctccctgccaagtcagga
-tgggcttcctcactccaaggtggcctctctTGCCTCCCTCTCTTCCCCACCAGCCGAGCT
-CAGAACCATGCCTGGGAGATGCTGAGGTGGCAATGGAGCTGCAGAGTTGGCATTTCCAGG
-CTCCCAGGACTCCTGGCACAGAGGAATCAACCCCTCTCAGCAGCCCCGGCTCTGCCTCCT
-GCTCCCTGCCTCTGCTCATATACCAGCTGGGACTCATCAGCTTCTAGAGAAAGCCAGGAG
-GTGGCCCAGGTGCATGGAGGCAGGGGGCTGTCAATATTGACCTGTGCTTGACCGCAGACT
-TTGCCAGTGGACAGGTTGCTAAGGAGTCAGAATGTCCACATGCCCCTAGTGCTCATCTTC
-CTAGCCTCCCATCTCACCTAGCTGCAGAGGGGGAGGGGgagcacaagagttgaaagcgtg
-gatgatctgggttcacttcggctgcttaccaacaagttacccagcctggggaagtttccc
-atcctctttttatctcagtttcttcaactgttacatgaggatgttgatactaatggctta
-tcttgaagggcagatggaagatgagtgaggtgtttgcacacagccagtgctcaataatat
-tggccattgttAATTCTGAGGCTATCCTCTTACAGTGACCTCTTGGGCCTTTCAGCCCCA
-AGGAGCCTCTCCTCTCTCTGACTCCTGTGGCTCTGTCAAGATCCTGCAATGAAATTCTTC
-TGGAACCCTATCCAGATGGTGAACTCTTCAAGGGCGGGGACCCCATACAGGTGCCCCATT
-ATAGGCCTGGTACACAACAGGTGCTCATGAAAAGGCCTGCTTGGCTGTGATACtacatga
-acttacagaaccctcacaactacttttggaggcatatgacatgattatccccttttataa
-aaagggggacagtgggtaacatcgaggtgaagaaattgcccaagcagctgggcgcgatgg
-ctcacgcctatagtcccaacactttgggaggctgaggtgggtggatcatttgaggccagg
-agttcaaggccagcctggccaacatggcgaaaccccatctctgctacaaatacaaataca
-aataataataataataataataataataataataataataataataatagccaggcatgc
-tggcatgcacctgtaatcccagctactgaggctgaggcatgagaatcatttgaaccggga
-ggcagaggtaagagggagccaagatcgggccactgcattccatcctgggtgacagagtaa
-gactctgtctcaagaaacaaacaaacaacaaacaaacaacaacaacaaagaaaaagaaag
-aaaaaaattgcccaggggctcacagctataaatctgcagatacttattgtgacctgccat
-gtgccagacactgtgctaagagctggggacacagcaatgaacaagacagagacctgctct
-catgtggcttacatcctgctgagccaagagtaggtagatatgccaatgtcctgtcataga
-aagcaccaggcagggaaatgggcaaagacagagagaggtggaggccgggcgcggtggctc
-acgcctgtaatcccagcactttgggaggccgaggcgggcggatcacgaggtcaggagatt
-gagaccatcctggctaacacggtgaaaccccgtctctactaaaaatacaaaaaatcagcc
-gggcgtggtagcaggcgcctgtaatctcagctactcgggaggctgaggcaggagaatggc
-gtgaacccgggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgg
-gcgacagagatagactccatctcaaaaaaaaaaaaaaaaagagaggtggagcgagagcca
-ttttagatagggtagtcaaggaagacctctctgaggaggtgacttttgtgtagagtccag
-aatgCAGCAAGTGCTGGGTGAAGCCTCAGGAAATCTGCTTTAGCATTGCTGTGGCAGATT
-CAGGGTGGAATCCAGGAGATCCCAGGACTGGTGGTGCCTAGAGCCCAGTTGGCTAGATCA
-ACTTCAGTGTGGATAAATGACTCCCCTGCCCCCGCGAACTTACCTTCCTGGAGCAGTTAA
-AAGAACGgggcacatgacctagattctctgagcttcacttttctcatctgtaaaatgggg
-attgaaaagcatagcttacaattctgagagctgagttgattaacagagatggtccatgta
-aaatgctgggctcagagctgggcTGACCAGATTCACCTAGTCCTTGGTGGCTGGAGTGGG
-CAGGTGACCTTCCTTTTGGCCGTCCAGCACCCTCCAACTCCTTGCTTCTGAGACCTCACC
-TCCCACTCATGGTATCATTGCTGGCCTTCCCAGCCCCGTCTTGGCCAGGGGGCAGTCAAG
-TGACCCAGATTAGCCTCGTGccattctgttgagggtgtggtggttgctacattgagtgtc
-cagaggtagcaaggactaaagtcctggtgtcagcatccagcgttggtgtcagcagcacga
-gctctgtcttggggacccgtggtgtcagcagtgaagtctccctcaggccagggctttggt
-ctgatttgagggcttttttcttttctggatatgaagcctgtaagccttctgaccctcctg
-gagatcctTCAGGCACGTCTGCAGCCATGGGTCCTGGATGATTTAGCAGCTCACGCCATT
-GTCTGGAAACTCCACTGGTACTATTTTTCTCATGTTCAGCTCTCTGTGCACAGACTCCAT
-CCTTCTGGCCCAGATGGCCCCTTGGGGATATGCACATACCAAGTTCTTTCCACTGTCCTC
-ACTTtgagggcaggggcctgggttgttcatttttgtgtccccagatcctagcacagagcg
-gctcagaggaaaggctcaatgcatgtccatggtgtcaacaaatCAGTGGcacaggataca
-gtttccacacatctccccatcctggttgcttccccgaaccattttccagtctgtcagtgt
-tcttctgaatatacaggatccagaactgagcacaaaactccagaaataggtgaatggagc
-tgagcagaatgaaactgtcacctcccttaccgtagataccggacttctaattacatgacc
-agacatttaataagcttgttttgTTTCCCTGGGTGGCATATATCAAGCTACTAGCAAGCG
-TTTTGTTTTCATGGTCCTCTACCCACATATTGTTGCAAAACCTCACTTTACTGCCCTTCT
-CCCTTAATTTCACGCTTATAATAGTATTGCCCCTCTCTCACTTCCcaggaatgccaagtc
-gattacagctcaagagcccaatcttgactggtccgtagcctggaacatggtgctgagata
-gatgctgtaactgagtttgggctcactgagaaagactgctgcaattgattaacgatgtct
-gccaAGCTGTGTAAAGTGAAGTAATGTCATTCCCTATCACAAGtcctaacctggggtcca
-tggaaagaatttagttggtctgtcattaacttggatagggaaagtattacatctttaatt
-tcattaacctctatctgaaacttatcattccttcaattatgaatgcaggcaacagaccac
-agtggtattagcaggacctgtgactttgtcaccaatagaaatcacagattttttaaaatg
-acattacagacgttccgcatatcttgaaatataatttacatgcactgtgacttggaaatg
-ataagttattTGCTAAGTactcatttacttactcacatttgtttagcgcctagtcaatag
-cctggtgacgtgccaggacctgggctgggtgctataggcaaaaggcagatgcgtaaggct
-cagtccttccctcaaaagagaaaagcagacagtgacaatggaaaggcttgatgctttgat
-gggggaagtacctgaggcccccaacccagcccagagggatcagggaaggcttcccagagg
-aagtggcctctcagatgagtaggaagtaaccagacccctgagtgctgagaaaaagtgttc
-agggagcagaaacagcatgagtaacgaagctaggaaagaaagagGACACAGGGCTTACAA
-AGTATTCCATGGCGGGGATGGGGAGGGGAGGAGAGAAGCGGGGAGATGGCTGGGGGGGTC
-AGGCAGGCCCCTGGAAGTCATGCTTGGCGGTACCCTGGTCGTGGGGGGGAAGGGGTGCTG
-GCGCTTGCTGCCCCATCTGTCTCAGTGGCATTGAGCTGTGACTTCAGTGGCCTGGGGAAG
-TTCAAGGTCACCTCTGGGGTGGAGGAGGTGGAGACATCTCACCAGGGCTGGCAAAGGCCA
-ACTGGGAAGCTGGGGCCGATACCTGCCCCTCACGGCAGCCACCACAAGGGGCCTTCTGCT
-CCGAAGGCCCAAGCACGCCCTGTTCCTTTATTTATGGGCCGTGTGAGCAATTTGCTGCTT
-GCTGGCCGGCTGGCTGGGTGTGCGATGCGGGGATTACTCACGCCCCAGTTGTGGTCCGGC
-CTCTGCAGGCTGCGGGGTAGTGAGTGAGGTAATTAAGTGTAAAAGATGGAGCAGGCAGGG
-GAGGGCTGAGGGCGGTGAGCAGTCACTGGTTCTTTTCAGGAGCAGGGGAGTGAGATAATG
-TAGGATAATAGCCTAGCCAAACCCTGCCCAGGCAGCCCGGCCTGTGCTGAGAGGTGCCCC
-CCAAACGGCCAAGACAATTCAGCCTTTTCAGGGAAAATGGGGGGGCTTGGGCAGGGCCTG
-GCTCCCAGGGACAGCTGTATGGAAATGACAGCTCCTCTCCTTCGTCCTGTCCTGTGTTGG
-CTCAGGGTAGGGGCAAGTGTAAGTGTCTTCAGCTGGGGATGAGGCCAGGGCAGGGGGCAG
-TAGATGGGACCAGGAAAGCTGGTGGGTGAGAGGAGGGATCCATGCGGGGCTGGGAGACTG
-ACCTGTGTATGTGGCACAGgcacagtggttcgtggcagcagactccagggcctgactcac
-ctggtggaaactgtggtgtggctttggctagctgtgtgacatcagcctagttgtggtcct
-tctctgagcctcaggactctcatctgtcaaatggggctgtcaaacaattcctacttcccg
-ggggtgtttggagaatGGTTCGTAGCGCCTGATGCACAGGGGCTACGAAATGCTTGACAT
-GGTGAAGTCCAGAATCAGAGTGCATTAGTCattcactcattcagtggataaatgtttatt
-gagtgcctaccatgttctaatggttcctgggaaagcagcagtgactagaacagagtccct
-ttcctcttggagatgacattctaagaggggagacagaccattaatcgtgaaacacataaG
-CATAAAAGGTCATAccagcaatcccacttctgaaaacttattctatagacatgtttgcat
-acatgtggaatgaatgcattcatggttatttattgcaattttgtttggcatagcaaaatc
-ttagtaatgatctaaatgcctgttacacatgggctgactgaagtatggaatattatatag
-ccattaaaaagggtgagaccatttctatTTCTgtttatttttatttactttttttagaga
-tgggatctcactatgttgaccaggctggtcttaaactcgtcactggtgaGACCATTTCTT
-ATGTACTGATATAGAAAGCTCCCTAAGATGTTTTGACAAATAAGAAAAGGAATGTGAAGG
-ATAGTTTCTGTAAAAGAGGAGACAATTTGAAAAATGTATTTCTATTAGCTTGTGTATATA
-TGAAACTAATAATAGTTGTTACCCAAGGAGAGGAGTAGGGTTGGAATGAGAGACAGGAAG
-GGGAGAGTTTCACTGTATACTTTTCTATAACTTTTATTTTTGTATGAAGTGAATGTATTA
-CTAGTTCAAAAAAGAGAAAATAAATATTCAGCTTCCTCTTTCCTCCTTTCCTTCCTCAGC
-ATTTGTTGGAGGTAGCTGTTGAGATTTGGGACTAAGCAACAAAGGCAGCTGAGTGAGGTG
-GTGGCTCAGTGTGCCTGGggattgaacaaacaggttcatatatcaaggataatgagagcc
-aggttgctcagcatcagagaagggaattacaagtatgaaaacaggaaaggctagaaagaa
-ccctgtggtgttagattggagttagaggaatcagtgtaaactcatagcttttgatatata
-tagttacataagcatgcatgcaagtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtg
-tgtgtgtgtgatgcatatgtgcatttcccagttctgtccaaaaagacagcaataatcaat
-acaccatgtagccacgaatacacctaacacctagatcttgggttttaaatactattctcc
-actgaaaggaactggggcttgggaaaatagtagatttgagggctggagcaggaaaagtgc
-cctgtgcctggtaccatggtacatgaaacatctagctgtgccatatgataggcaagtgct
-caagtaatgctgaggacatgtcaaaagaccaaggtgccaacttaaagggactcccaatgg
-ccaaatctgggacaacttgagtatcaaaataatgacagtaacagattataagccatgaaa
-tataaatagtcctgatatacagacacatacacgtattacatacacacatacatacataca
-cacatgtgcagaaagagaaagctctttcttacactagaatgcccaataataggtgtggaa
-ggaaggatgcaactagtatggtaataattgattcaaacaagaagcattactagatgctaa
-aactaaagccattgtgtgaaaatttgttgaggagtaggatatttacatagtcttaaagag
-tctttccacaagatacaatacctgcaaaaggaaggagagtgactttatagcgaagaaaca
-tggcagagactatcttagtcgagtgatcaaaggctgcatcactgttactggacaaactga
-catgaggctcctgatgggatgcacagggaagagtgaaaaatcacttctgtgatgttcctg
-ccagagatgcaaaactgaaatctaatcacgaggagccgtcacataaacccaatttgagga
-accttctacaaaacaactggcctgtaacctgggtaagtatcaaggtaatgaaaggcaaag
-aaaaactgagggaccgtcacagattagaggagactaaagagataagacaatgaaatacaa
-tgagtaattctggatggatctttttgtttattataaaggacattattattgagacaatgg
-acaatatttgactgggctctgaagattggatggtagtaatatatcaatgtcaatttcctg
-attttgatgattttattgtggttatgtaggagaatatacttgcttttaggaaatgtacac
-taaagtattccaggataacagggaatcaaattgacaatttactctcaaacaattcaaaga
-aaatctctctatatataaatctctaagagagaatgataaagcaaatatgtttaaatgtca
-atatttggggattctgggtaaacaatatatgagaattctttgtacaatgtttgcaactct
-tctgtaggtttaacattattttacaataaaGTTATTTACATGAAACTGaaaccatatgat
-gtcaagtaatgataagtgatatatagaaaaatcaagtgggcagaggaacagaaaatgagg
-gggtggtgctattctagatggtatggtccaggcaggcctctctaggggaggacctttgag
-cagagacctagtgggagggagggagtagctccatggatacttggggagagtctcaaaggc
-cgagggacccatctgagaaaaggcccagagtgggaccagcttggcctgtgtattagtgtc
-tattgctatgtaacaaatcatcaccaacttagtggcttcaaacaacagccatttagctca
-cagttctgtaagtcatcgtctggcacagagcaactgagttctttgctcaggatattacaa
-ggtagaaaccaaggtgtaggttgggcttagttcttatgtgaaggctctggggaaaaaatc
-cacttccaatttcattcttttcttttcttttttttctttttctttttttttttGTGCAGT
-TGCagagaggaaaggaggaaatttttcgatagaaaaatcttggagatcctgttgctgtca
-cccatcgggctgttggaagctggggttagtccagaagtcttcaggtaatgccagggtgtt
-gccctggccaggaactctcagttgcctctgaacttcttccagccccacatgatggctaag
-ctctccatgaaaggagaccagttggaaacaaagccaacattcccagcaccctgagggcac
-tgaaggattggctaagttctccccggcaagcctgttccctgagaaaatggaggacagagt
-ccttaaaatgaaagagctggggtctgtgcctatactcactctttcaatgaatctacgtcg
-gatcccaggcaggcccccacaatgaagtggtgttgttcaactgaggtaatacccaaggtt
-cgttgtctcatggccacagaaaactaggactcggacacaccagagtgaggttaagagcag
-aagtttaataggcaaaagaaagagaaaagctctctctgttgcagagagaggggtcctggc
-gaaaatgggttgcccccaagttcattcttgttgttcgcaatgttcagcgtcttgcggttg
-tgggactgaccgtaacagacgatttttttgttggctagaagccacctgcattccttgatg
-tgtggcccctccatcttcaagtgagcaatggtgttttgaatcctccttatgcttcatgtc
-tttgacttcctcttctgtgaccaaccgggaaaaactcactgctttaaaagggctcttagg
-attagatcaggtactgtgttagttcacttttgcattgctataaagaaatacctgaggctg
-ggtgatttataaagaaaagtggtttaattggctcatggctctgcaggctgtaccagcata
-gctctagcatctgcttctggtgaggcctcgggaagcttctaatcatggtagaaggtgaag
-ggagagcaagtggtgtcacatggtgagagccagagcaagagagagaaggggagggtgcca
-gattcttttattttttatttttgttttttgagacagagtcttgctctgttgcccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctccacctctcgggttcaagtgactcc
-catgcctcagcctcctgagcagctgggactacaggtgcacgccaccatgcccagctaatt
-tttttgcatttttgttagagatggagttttgccatgttgctcaggctggtctcgaactcc
-tgaactcaggcaatctgcccaccttggcctcccaaagtgctgggaattcaggcatgagac
-atggcgcctggccccagactcttttgaacaagcagatctgtgaactaaccgggtgagaac
-tcacttattaccaaggggatggtggtaaaccattcatgaggaatccgccccggtgatcca
-atacctcccgccaggcccacctccgacactgggaatcacatttcaacgtgagatttcaga
-agacacacatccaaaccgtatcaagcatacccagagattttccgtatcttaaggccattt
-atgccaaataacataagctgatcacaagagtaaacgccaccatattcacagcgcagggta
-ttttacaggacatgtacacaggatggggaggactgggctgaaatcctggaggccatctta
-gaatctgcctatcataGTtgccggggttgagaaacaagaaagccagtgtggctggagcac
-agtgaacaagggggtgcagggaggagagacagcagagTATCACAGGTGGAGAGACACATA
-TATACCACCTAGCCTGATGGGAGGCTGAAGGCCTGAAAGTCACCTTGTGCAATTTTGGTT
-CCTGAGGAAGGGGAGGGTCATGCGAGTTCCTCCATGGATTCACTTGCACTAAAAAGCACC
-CCTGGGGTGGGACCCAGTCGATGATGGAAGTCAATGGAATGCGTGTTGAAGAGTAGCCCT
-TGGAGAACCAGTGGGCTGCTGGGCATAGGTGATAAGTTCTGCTCTGTGCATTTGGCCCAG
-TAGGCACAATGCCAAGAAGCCATGGGCTCGTCAAGGATCCATGGAGAAGTCTGAAATCTA
-AAAAAGCTGGCTGGAAAAATATTTTAAAACTTTCCAAACTTGAAAGACTTAGTGAAGTGC
-CTACCAAGTAGCATTGTGTCAATGGGTCATGAGCAACGCCCAAGTCTCCTAATAGTTACA
-TATGCGTTCTATGTGATGTGACTGCATTTTGTTTCCATTTTAACATTATTGTATTTATTT
-TTTCGTAGTATCATGTGCAATGTACAAATAAAAAGGAACAAAAGGAGATGCCCTGAAAAG
-CAAGTCTCTCTCCCACCTCTGACCCCCAGCCACGCACCCTCTCCCCACTGAGGCGTttcc
-tgtactcaaaggtattttgtgcacatgctaatgaacatgtatatatacacctgactcctc
-cccttttcacaatggtggctgttctgcctgctttttttcttttttcttggcagtacatct
-tggagatgtttcctattggctcatgtggagctgcccattcttttgtacagcagcagagca
-gtctgttatttggatgaactgtcatttattaactagACATGCCCACAACCCTGCCACCTC
-TTTTCCTAACACACTGGGCAGTCTTGGCCTCTCCCAGGCTCCCTGGGAGGGTCACTACTT
-TCACAAAGATGATGCCCACTTCTGCCcatggaatctggcttgcccagtgactacctgaca
-gggttgagtgacaccacccagaagtgcaaagAAGGCAGTAAAGAAGAAAGAAGAATTTAT
-TAGGTGCCCGAGGAAGGGCTcaatcctgccagtctaaacattgttgtacatacctcctga
-tatgtttttctagaatgtctccaggaagggattgctgggaataagtgcaaaataatgccc
-aattgttctccagagtggttgtacaactgactcccttatcaccagtgtcaaggagtcctt
-gttccacataattgatcacatttggacttgtctagctttttaagttttgccaattgagta
-gacaggaaatgagcttttaatttggatttctctaattactcagaggttgagcatcttttc
-aaatgtttgttggctattcatgttttcgcttctctatgtctgtccaaatctttagtccat
-ttttctttttgattgtttgtccttgtcttattgaattgtaggggttctttatatatttgg
-gtgctaatctttgtcagttaaattgttacggacatcttctagcttgtgacttgtctttcc
-acttttaaaaaatggtgaactttgatgaacggtatcggttgtaatgtaactaatttatta
-atatatgcctttatggtttgtcctttctgtttcttgcttcaggaatcctttccaacccaa
-agccatCCCCATGtttctatgatgcacatgtatatatattatttatttatttattttttg
-agatggagtctcgttttgtcccccaggctggagtgcagtggcgcaatctcggctcactgc
-aagctccgcctcctgggttcacgccattctcctgcctcagcctccggagtagctgggact
-acaggcgcccgctaccatgcccggctattttttttgtattttttagtagagacagggttt
-caccatgttagccaggatggtctcgatctcctgacctcatgatctgcccacctcggcctc
-ccaaagttctgggattacaggcgtgagccaccacgcctggcacatgtatatatatatttt
-aaaaagatcatatgtgcatcctgttttgtagctacttttccacttacctaacatgaagga
-acattttttccatgtttaaatagtctacaacatctttggtaaatggttgcatagttttcc
-attgtatggaatatacagtctttatttactgaatcccctgtgatgaacatttaagttgct
-ttcagctttcatatgatcaataatgctgccaagaatatcctgaagctgttggggtccaca
-ttcatgatcatttctcttagataaagtcatagaaatgaaattgcccatagaatttaaggc
-ttcggatacatttgaccaaatttgccagaGGATCCACTTTTGATTCCTTTCCAAGAAGCA
-ATATGCCATTGTGTTCAATTGCCCTTCCCAAGAGTCTGGAATCAGCAAAGTAGGGGTCCT
-GGAGATGATGTTTTGAACTGGAGCTGTTAGCAGGCATGTTCTGTTGTGTGCAGAAATAGT
-TACTGTAGCAGTTAAAGATTTTCCCTGTCCTCTTCCTTCCTACCCTCTCCTGACTCCTGA
-CAGGTAAGATGCCATTATTAGTACTATTAAGAGAAAAGAGCCAAGAAATTAGGCCTGCTT
-TGGTAATGATTCTTGGCTAATTAATTGCATTTCCAATGGCCATAAGCTCCTGCTTCAACC
-AGCACCTCTATGTGTTGAAGGCAAGAAAAGGGGTCCACTACAGCTGCTACCTCCTGGGCT
-GGGCACATAACATTCTCATAAAAATGTTTGTCCAGTCAATGAAGGATTTCGGtttttttt
-aagagacagggtctcattctgttgcccaggctggagtgcagtgtcacgatcacggctcac
-gcagtcttgacctcctgggctcaaatgatcctcccacctcagcctcaaatgatcctccca
-cctcagcctcccgagtagctcggaccacgggcacatgccaccatgcctggctgatttttg
-tattttttgtagagatggggtttcgccatgttgatgaggctggtctcgaactcctggctc
-aagcaatccacgtgcctcggctttccaaaaagattacaggcatgagctaccgtgctcCCG
-GTCAGGAATCTTTTAAAAGTCTCCTGGGTTGTCTTGGATGAGAAAAATAAAAAGAAGTCT
-CCCAGAGAACTTGAAAGCCTTAGATCAGGATTCCCTTCCTTCAGAGGGGTAAGAGGTGGG
-TGCCAAGCATTTAATTCTTAAGCATTTATTTTAGCAAATATCAACATGTATAGTAATTGA
-TACTtttatagtaattgatattaattttcatgtatggcagcacaaagtttcccattagcg
-tgaactggctttttgtttttttaaatgaggctatttaaagaaaaatattaagtaaattgg
-tggaagatagcctgcagatgggggtggggaggaggtggtgtgattccgcccaaacttcga
-gaaacactgCTTCGGTGGAAACCGCTCCGTGAGGAAGGCCTTAAGCCAGGGCTGGGTTGG
-GTCAGGAGAAAGCAGGGCCTTGGGATTCCAGGCGGAGGGCACTGGGAGGCTCTGGAGGGT
-GCAGTGAGGCTGCCACAGTCAAAGGCCGGGCGGCTGGGAGGGGCTTTCGGAGCTCTTCCT
-GGTATTTAAATCATATTTAGGGATTATAAAGTGTGATCCTTCTCATTGTGtcatttgaca
-ctcacagcaactttgtggagtttcaggcaataaggagattgccttgtcagtttacagaag
-gaaacggaggcagagagagacgcagcaatttgcccagggtctcaggtgagtaaaaggcCT
-CAGTGGTGGGTGTGGGCAGCATGGCTGGAAGAAGCGGAATTTGGTGTGGAATTTGTGGAG
-ATGTGTCAGGAGTTGCACCTCTGGGACTAGGGCACTCACAGCCCTCTCCTAATAACaata
-acaaccaccattagcatttatggagtgctcgctgcgggctggctctgtgctgagcaactc
-tggctgtctcactgcacactttacactaacgcaatgggaggggaggtgtcattatccccC
-AGAAAGTGTCAAGGGCAGGAGTTATTGATTCATGgtgtctgctcttgtagaaatttgaat
-tccagtaagggagaggggagccagaaaataaccacgggaagacatcaatgaatgagataa
-tttcacataacgataaatgccagggagaaaaaacccacagggcaatgtgatatggcctct
-ggaggtggagaaggaactgctccagatgaggccatccgtgaaggcttctctgaggaggtg
-acattagagcCAGAGCCAGTAACGTCTGGACTTGAACCTGGGCTTGCGGCATGGGAGAGT
-CCTGCATCTGACTCCAAACTTCCCCTCCTCTGTCTCCTGTGGATCACAGAATGCTTTTGC
-CAGAGACTCAATCCCTTGTTAAGAATCATGGAGTTggccgggcacggtggttcatgcctg
-taatcctagcactttgggaggctgcggcgggtggatcacttgaggtcaggagttcaaaac
-cagcctggccaacatggtgaaaccccgtctctactaaaaatacaaaaaattagcagggca
-tgatggtgcgagcctgtaatcccagctgctcaggaggctgaggcaggagaattgcttgaa
-cctgggaggtggaggttgcagtgagccgagatcccaccactgcactccagcctgggtgac
-agagctagactctgtctcaaaaaaaaaaaaaaaaaaaaaaaaTCATGGAGTCCTGGCTTA
-GGGAACGGAGTGTCCAGGAACTAGGGATGAAAGGATGGTAAGATATCCAAGCTGGAGAGA
-CCTCACCTGTGGTGCTGCCTTGTCCAACTCCAGGAGCTTCATGCACTTGCCGACAGTGGA
-GTTATGCCACGTTAGGGGTCACTCTAGATGATTCCCCTGGCCAAAGGGAAACCAAGTCCC
-AGAGACGAGATGGGTCCTGCCAAAGGCTGTAGCTTACAGCTGTGCAAGTTGTGCTGGGCT
-CCAGGGAGCCCAACTGGAGGCTAAGGGGATgccttgcatcccaccagggggctgcaccag
-gaagaaagggtacctgtttctaattcacacaaaggaatgctatgggctaggggtggccct
-gAGCCTCGTGGAGGATGGGGGCAGAGGTGAGATCCCCACATCGTTGTGCCATCCTTTTTC
-CCACCTCTCCTGCTTCCTGCTTTGTTCCTGCCAGTCCCTGGAGGGCAGGCGGGTGAGCAT
-CTTCACCATTGAGGGATGCCCCCTCCTTAATTGTGGCAAGGGGGGCCCTTTGCAGCCCAG
-TGCAGGCCTTATGGGACAGTGAAGAGGAAAAGAAGCAAGCTGGCCAGGATTCCCTGGGGT
-TTTTGTGGAGCTGACAGGCTGAGGAGTGGTTGGTTCCGGGGGCGGGGGTGGCCCAGAAGT
-GCCTTATCTCCTCTGGGCCAGTGTCAGCTCCTGTCCCCAGCCTGCAGCACAGGCTGGAGC
-TGCCAGCCTGGGGACTGCAGCAAATTTGCATTTATATTGGAGACTTCTGTTTCCAGGGCT
-TGGGGGGAGGAGGGGTGGCCACCACCATCAGCTGAGCAGAGATGCAGGAGAGGAGGGGCC
-TGCAGCCCTGTCCTGCCAGGGGCACAGGAAGTGGCCGATGGGCCCAGTCTGCCTGGCTGA
-GGGAACAGTGGCACAGAAGGTTCTCTGGGCACGCGGCCGGCCCCGACAGCCTGCCTGTCC
-ACCCTCCCAGACGCTCGCCAACATCAGCTGGGAGTTGGCTCTGCCCCCAGGCCTGGGAGA
-AAGGTCAGAGGCCGGTGCCAGCAAGGGACTAAGCAAGGCCAAAGCACTCCTGTGACAGGG
-TGCAACTGCGTGTCACCCGGTCTCAGCCCCACAAAATTGTAAATTGttttagccaagaaa
-acggaggctcagaggggcttagccattagctcaaggtgatccagctTATCATCCATGCCC
-CATGAGCCTCCCAGGAACACCCGGGATACTCACACACCCTGGATGCCATCTATACTTAGG
-GGACAAAGAGGAGTTGACACCCCTTTTCCAGCTAAGTTCTGGAGGGTCAAGGGAAGTTAT
-TGCAGGCTCGTGACACTGTTAGGGCTGGTTTTGTGACAGCTTAGGAATCATGTTTCTTTC
-TCtcttttctttcttttttttttttttttttagagacagtctcactcagctgcccaggct
-gaagtgtagtgcagtcatggctcactgcagcctcagcctcccgggcttaagagatcctcc
-cacctcagcctcctgagtagctgggaccacaggagcatgccaccatgcctggctaatttt
-ttaattttttattattagtagagactgggtctcgctctattgcccaggctggactggaac
-tcctggcctcaagggatcctctcgtcttggcctcccaaagtgctggTGTAAGTCATGGCT
-CCTGGCCTCATGTTTCGTTTTATGGTGAAATCCATAAAATGGGTTTTTTTAGGGCCAGGT
-TCAGGCCAGGTTTCCCCTTGTCTTTGGAGAATGTAGCTTCTCCCATCTGTGAGGTTCCAT
-GTGaagaaggaatggaaggaaggagagaagacaagaagggaaggaggggggacaggagga
-gggagaaatagggagtgaagTATAGAATAAATAAATAGAAGAGGGGggccgggcatggtg
-gctcatgcctgtaatcccagcacttcgggaggccaaggtgggcggttcacctgaggtcgg
-gaccagcccgaccaacatggagaaaccctgtctctactaaaagtacaaaattagccaggt
-gtggtggtgcatgcctgtaatcccagttactctggaggctgaggcaggagaatcgcttga
-actcgggaggcggaggttgctctccagcctgggcaacaagaatgaaactctgtctcaatc
-aatcaatcaatcaatcaGTAGAAGAGGGGATAgaaggaaggagtggaaggagggaaggaa
-gggagAGGGAGTAGATGAGAAGAGAAGATAGAGTCATCCTGCACCCCGCCCCCCAGGTGT
-GCTTGTTGCTGCTGGAAGTGCCCCCTCTGTGCCCTTTCCCTGGCTGTTGTATGGAATGGT
-GGTCCTCTCCCCATCCTCCTCACCCTACAGCTGAGACCTCCTGACCTCCAGTAGCAGGTG
-AGCCCTGCTCCAGGTGGGGGACCAGTGACAAGCTGGTTGGGGCTCCAGGAAGCAGAAGTT
-GGGGCCCTGTTGTGATCCCTGGGCTTTATTTCCATCCTCAGGGCTCAGCTGCCTCTGGAG
-GGGGCTCTGCCTTGCTCTTTGGGTTCTCTCCACACACTCCCTCCCCCACTCTTCCAGACG
-GAGGTCTTGGCCCCATTCCCCCAGCCTGTGGCTGTAGGCTTGCAGCTGACAAACCTCCTG
-GTCCTGGCTCTCCGTCCAGCAGAACAAGCCCTCCCTGTCTGTCACCAAACAGTCAGGACG
-GCCTGTTCCACCTGGCAGGCTGGACTATTGCCcagcttagtcttgggaagtgaggaccag
-ggctgacaacccactgcctgagttcaaatctttgctgtgcctctttctggctgtgtggcc
-ttgggcaagacccgttacctctctgagcttctggcttctcatccgtcaatgggcataatg
-ttaggatctgcctcttggattactgtatgaatgatacgagatcgttcatggaaagtgctt
-ggcttggtgcctggcacCAAGACATTTCAGCTTATATTATCCTAGCTGTATCCTTCAGTG
-TCTGTCTGGCCTAGGTGGGATGTCAGGTTCCAGGGACCTGTCCCCATGCTTCCTCCATTA
-ACCCCTTTATGACTAGTGTCACCTGATATGACTATTTCAACACACATAGGATTGAACCCT
-GGTACTATTATACCATTACTACTTCTCCTAGTTGTTGTATAAGTGCTTATGGGATCAGGC
-ACTGTTCAAGCCAttttaaaatatgactccacattcctttaaattcctctaatcaagaag
-tggggcctatgtcccctctcttgattgctcccaggaataaaatatggttagaaatgacca
-tgctggctgcgtgcggtggctcacgcctgtaatcccagcactttgggaggctgaggtggg
-cggaccacccgagggcaggagtttgagaccagcctggccaaccaacatggtgaaacccca
-tctctactaaaaatacaaaaaaattagccgggcgtggtagctgtaatcccagctactcgg
-gaggctgaggcgggagaatcacttgaacccgggaggcagaggttgcagtcagcctagatc
-gtgccactgcactctagcctgggcaacagagtaagactccttctcaaaataaataaataa
-ataaataaTAAAAAAAAtgaccatgccacttctgcttgagtctctggggacactcactct
-tggaactgttggaacccagcctgcatgctaggaggaagcccaggacccacggagaggcca
-ggtgtggatgttctggcctgcagtctccactgtgccactcctaactgccacacatgtgag
-gggaagacaattctagatgattctagtcccctgccttcaactcttttcagctgaggcccc
-agatactgtagaacagaaggaagccacccccatgtgctctgtctgaatctgtgagcataa
-gaaaatggttaacagtactacacgttggggttgttatgccacagtaaatcaccagaaTCC
-Ctgtgctgactcatttaagcttcacaacttaggaagtagctgttcttatcatctccattt
-catagatgaggaaattaagacccaaaatgctttagcaagctacctgagtccacagatctt
-ctaagaggaagagctgggattcgtgcccaTGGGTTTGAGCATTGAAGAATCAAGCAGGGC
-CCATGTCCTACAGGGCCTAGTGGGCCACATAGGTGACTGGATGTCATCTTGAGGGCCTTG
-GAGGGCTGTGGGAAGACACTGATGTGTGGAATTCACGAGGTCGGGAGAGGGCACTAAGAA
-GCTTGCTTAGGTGCAACGTGGAGGGTGGGTGAGAAGGGGCTGGAAGTGGCCCACGAGGAT
-GGACAGTGCCACCCTGCCATGGTCCACCATCCTCTCCATGTCCTGCTCCTCAAAGTTACG
-AGGGCAGCAGCAGGAGGCCTGGTCTCAGGCCCTAATGAGCTCTGCACCTATCAGAGCTTG
-GCCTAGCCGGAGATCCCAGCCAATTCCTTTGGGCTGACTTAGGCTGTGCCCTTGGACGGA
-CAGAGCTGGGCAGTCAGGGCTGGGAGCCTGACAGTGTGAACAGGAAGTTGACGGCCCAGG
-AGCATCCTCTGTTCCCTGCACATCAAGGTGGGCCACATAGCTCCAAGATCATCTGTGCCA
-ACtggatctactgggtttggagttggctgagagtggaagggagcccacaagaagagtgac
-ctaaagaggacagacactgatttctttttcttattaccaatctggaagcaggcagtcccg
-ggctggtataatggctctttgatcctcagggacccagactccttctatcttgttgttcca
-ccctcaacacttcatagtccaaggtggccgctcattctctggccatcatgtccacattcc
-agccagagggaaagaggaagaggcaaagaatgctctggtctctttaaggacccctcaccc
-ccaccgctcagaagttgtactcggtactccgtttacctcttcatggcaggaatgcagaca
-catggccacccctaactgcaagagaggctgggaagcgtggtctctgttctgccatccatt
-cacccagctaTATCGGTGGGGAGGGGGTTCTCATACTGCGGGACATGGCAAATCGCTTGG
-AATGCCAGCCACACCTGGCACCTGGAagccagagtgagtgttttgaaacttgaatcattt
-aacttcgttgcttaaaatgatcctgtagcactcactgctcccatgataaaggccaaatcc
-tcatctgacccccagggctgcctgatctcaccgtggctcacctctccagcctcatgccct
-ggttcccccagccccatcctccccaactcaccctaacATTGAAATTAAACCATGCCCACT
-CCATCCTCACCTTGGGTCTCCCTTTGTGCTCTGATATTTGGGTTCTCTTCATGCCACAGC
-TCCACCCAATGTGTGCTCTGCTTCCTTAGCTGTAAAAGGAGCTCCCCATAGTACCCACTG
-GGCACATAATAGGGTCACTTGCTTGGGTACAACGTGGCGGGTGGGTGAGAAGGGGATGGA
-AGTGGTCCACAAATAATGATTTGGGAGAACACAAATAATCAGACATAAAGAGCCACAGAG
-GCACTTACTGACTCTAAGGACTGTGGTTATAAAGCCCCTGCAATGTGCCAGGTTGGTACT
-ATGGGGAGCTCCTTTTATAGATAAGGAAACAGTGCATGCTGGGCGGAGCTGTGGTGTGAG
-GTCCTGCTGCACTGCCTTGCTGATGAGAAAAAACACTTATGGGCAGAGCGCTTTACACTG
-AGCAACTCTGTGCCTGCCTTTGTCTCAGGCAGTCCTCTAGCCATTGTGCCCCCCCCtttt
-tttttctgagatggagttttgctcttattgcccaggctggagtgcaatcgtgcaatcttg
-gctcaccgcactctccacctcccaggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgcaccatgacacctggctaattttgggtttttattagagacgg
-agtttctccatgttggtcaggctggtctcgaactcctgacctcaggtgatccacccactt
-cggcttcccaaagtgctgggattacaggtatgagccaccacacctggccCactgtgcccc
-ttttgcacatgaggaaatgggagagggactgtgattctgtaaggtcatatagccaggtag
-tagccatgccttgactggaacccagctctgcctgccccttccctgctggcagttgcatca
-cctgccttctctgGGGAGTGAATGAGGACAAGCCAcacttgaccttccatggtcctgtag
-cagagattttaaagtccagcttttagagaggaacgtgaaagcccagagaggaaggaactt
-gcccttggtcctatactccatcaagcacaatgctgggaagggactcaggtctcctgactc
-ccagtccagagctcttgcacactttgctccttcatgcaacaaatatttattgagcatcta
-ctgtgtaccagcacagtgctagcccttgagaacacagcagcaaacacaacagacacaaaa
-ccctggccctgtggagtggacattccagggctgggtggaggagTGGGAGACCAATACGGA
-CCAAGTAAGTCAGCTGCAGCACTGTCTTTCCTCTTATTTATTTCCGGAAACAAATAATTA
-TGGAGAACTTTATTGCTataagacagacatggtcctgactctcctacagtgagaatatag
-tgttggagacaggcactcaatgagagacacataaataagcaaagttcagattgtgatcat
-agctgagaagaaaacaaggttgaagtgctagagagtaatggggatgcggtactggtagtt
-aacttcagatggggtggccaggaaaagcctctccaggaagtgactcttgagctgagaccc
-aaagcatgcaatggggcccaacagtgttccaggtggagggaacagcaagtgccagggtgc
-agaagtaggacagagcttggtgggagaaaggaacagagagaaggccaaggtggctggagc
-agggcgagagggggaggttggcaagagggagggggctggagaAAGTCCAGAGTGTCGTGG
-ATAGACACTGAATAAAGAGAAGGGATGACTAGCCCCCTACAGTTCACCCCTGGGTGGGGG
-TTGGGTAGTCGTCTTTGCATCTGATAATTTCCCAGCTAGACCCCCAAGGGGTGGGGGCCA
-AACACCTGCTGGCCTGGCACTGCCTGTCTCTGCAGAGATAAAGTTCCCTGCCCCCCGTTC
-ACCAGGACCCCGCTCTGTGGTGCCTCCACCTGCACAGTCAGGCAGGGCATTGTGTGTTCC
-GGCCGGCACACCTGGCATTCACCAGCCTGCTGGTTGCCTGATTTAGGGGCTCATCCTGCC
-TGGCTCAGGGGTCTGTTCCCTGGAGTCTACCAGCTGGGACTAGGCTGGCTGAGGAGGAAG
-ACACAGGCGCTGGTGGTGGCCACAAAGAAGGCACCCTTTACCGTTGCACGCCCATTGGAC
-CATGTTTGAAACCCCAGGCCTCCCTTTTCCAGCCATCCTTCCCTGGGTGGCAGAGTCTGG
-GCTTGGGCAGAAAGGTTCAAGGGGCAGTTTCACTgctgtgcttagaaattttctctccct
-ctctgggcctgtttcctcatctgtgcaacggaagggttgacctggataaactcATGGTGT
-Agactctagagccagactgcctgggtttgaacctttaccacgtagtgaccatatgaattt
-agctaagttactcaacctttcgttctcagtttacctacatgtaaaatggaggtacaataa
-taacacctatttcaagggctgcgggaggattaagtgaattatatatgtctggtgcttcaa
-acagtgcctgctctatggtaagtgctatatattttaactctgatcattattATTAACGTC
-TTTGGAAAACATTGCACTGGAAAGACTCAGTGGAGAAATCTGAGTTCATTTGTTTGCAAA
-CTTTTTGGTCTTTGTTTTTAACAGAGAAGCTCTGCATTGGTCAGGAGAAATTTTACTCAG
-AGCCCCAGCTGTTAGCAGGGGATTGAAGGGGGGCGCCTGCCCCACCTGCTTCCCCGTCTC
-TGTGTCTGCAGCCCCCAAGAGGCCTActggagcataacttgaaaatccctgctcagttta
-tctccttcagctcacagtcagggaaactgagactcagagaggagcagggatctgcccagt
-gagtggcccagcctagactagaacccagatctcctATTTTTCTCAATACAAGACAAGGGG
-CAGGGGCTAAGAGAGAAGCTAAGACCAGAAGCCTCTTAGGGGACTGGGTGCATTGTGTCG
-TCAAGTCATTAGCATGCAAATGATATGCAAATGAATGCAAAACAGCATGTTTTATGCTAA
-TTTGCAGAGTCGAGAGCGACGACATTTTTGGTAATAGGGCGGCAGTCCTGGTCCCTGGGC
-ATTGCCGAACACGCGTCCTTTTTTTCTTTTCTTCTTTCATTATTATGATCGGGCCCATAA
-ATCTTGGTTTGGCTGTGACTCCGCCCCTTCTTGCTTGAAAGCCTGGCTCCTATCATTCTC
-AAGGGCTCCCTTGCCAGTCCTCTGGTCCGGCCTGGGCCCAGGGACAGGCCTGAGCAGTGG
-GTCAGAGAACCAGGACTCAGGAGCCACCAGTCAGAGCTAGAGGGTGACCCCAGCTCTGGC
-CTGGAAGCCACTTCTGAAGGAGGGGACCGTGGCACTTCCTCTGAGCTCCCACAGCCACTG
-TGGCTTCTGTGCCATTGTCTGTTTGGGGCTGGCTTGCTCCTTTTCTTGTCAGGGCGCCCA
-GTACCTGGAACACAGGTTCAGGATGTGTTTGGTGTTTGAAGACTGAATCCATATATGGAG
-AGCTGGTGgtgtaccctagtgatgagcctgcagtctctgaaaacatgcagcttgagttaa
-aaccctggcaccactactttctGAGAAAATAGTAGTATGTACTCACAGCTAACCttttgt
-ttttgttttgttttgagacagggtctcattctgtggctcaggcatgagtgtagtggcatg
-attgcagctcactgcagcctcagccttctgggctcaatccatcctcccacctcagcctcc
-tgagtagctggcactacaggtgcacactgctaccatgcccagctaatttttttttttttt
-tttttttgtagagatggggtcttgccatgttgtccaggcaggtctcgaactcctgggctc
-aagccatccttctgcctcggcctaccaaagtgcagggattacaggtaagagccatcacac
-caggccCATAGCTAattgagcacctaccatgttccagggctctgctttgtaattgttgtg
-aacgctgtcactgataagagtatcctagaaggtgagtatcgttatcattgctctcatttt
-acagagagggttaaatgatttgcctgaggtcacacTCCCCAGGGTAATGGTAAAGGGGTA
-TTTATATTTACTAAGGATGAGTGCTTCATCAGGCAGGGGCCTTTAAGGCACTCAGCAAAG
-CTTCTGTCACAGGGTACCAGGGTCTCCACCTGTGCTATCAAGCCACTCTTTtgacaatgt
-taaactttacctgagccctgtgctcctgaaaaacagcgatggtccagaaatccccccaac
-tttttgttttctgaagtctccctaccttttctgttcagggaaatggcttagcaaaacgag
-ccacccttccccatatgactcagataagacgtagtcccctctttctagtgtatcctgtaa
-gactggaggatgactcccttgctggcctgtgatctttccccttttgctggaacctgctga
-caaggccaaggccaaggaccctcccacttcccattctttgtctcatggttgattagctga
-gatgagaactgtgtgtcctctctgaaactagctagacacagagatgaacatttcctcttc
-aatggactgatggagatatcccctatttgtaagacaatccccactttaaatccctcctgc
-tgtaacctgtctcctcacccctacaaaagtcaaaggcaaatccatcctgtccagacactc
-tgattttgggatctgggatgctctccctgttgcaatagcatgaataataccatcaacccc
-aattcttccgtgtattttgtctttGACCCTTTCCACCGTGCTGTTTTCCACCTAAggctc
-tgagctaggtaagagccctgtgaccttggagtacttctcgggcttctctgtaccttaggt
-ttaaaacggatgcgcacaggcgttatgtcctcaggttgtgagataaaaggagacgacgcc
-agggaaacgctcggtcgcttggcactgtgcccagcagcgtgagtgctccagaaatgtcaa
-ccattgtGAGTCCAGGAGAGGAGAGTGGCGCTCAGAGAGGGAACGGGACCTGCCGGGAGA
-CTCACAGCGGGAGGAAGGGGGAGTAGGGCGCACGTCTGGTGACCTCCGCCCCCAGCTGTG
-GGAGTGTGCCCTGTGACCCCCTCATCCTGCCTTTGGATCACGAGCTGGGGTCGGGGGAGG
-GGATGGTGGGGGGGACACTGCTCGGTCCTCCACTCCGTGTGCCCTGTGACCCCCTCATCC
-TGCCTTTGGATCACGAGCTGGGGTCGGGGGAGGGGATGGTGGGGGGGACACTGCTCGGTC
-CTCCGCTCCCCTCCGCCCGCCTTTGATTGTGGTGAGCAGCGAGTCGCGGAGCAAATTAAC
-TTTTCGCACACTTCATTATGCGCCGTCCCGCGTcccccggggccgaggcccgcgcccccg
-ccccgcgccgACAACTTGATTGGGCAATTAATCTTCGCGCCCCCCACACCCCCTCCCGGC
-CCCGGGCCTTTGTGCGCCCGAGCGTGGGCCGTgggcgccccccgggccgcccggTCTGCT
-GGCGCAGATAAGGCGCCCCTCGCCGCGCGGCCCCGCCTTTGTCAGGGCGCCCGCAGGCCC
-GGCCGCCGCGCTGCCGTCTCGCACCCCATCCGCGCGCCCCCGCCCCTTGGCTCGGTCCAT
-CTGTTTGAGCTTCACAATCCTCCAGCGGCCGGGGGCTGGGGGCGGGGTCTCGCTCTTGGG
-CAGGCAGCCAGCACCCCCTCCCCCCGGCCCCCCCACCCAGCCCCCAGACACGCGCGCGCA
-CGCCCACTCGCACGCGGGGCCGCCCTGTCAAGCAGTGCGGTATTAATTAAGAAGGTGGGG
-GGGAAGCACAGCAGCAGTTTGAAGAATTGTGGGGCGGAGGGTTCCCAGCGGTGTCCAGAA
-AAGAGGGGGACCCTGCCACCCATCTCGTACCGCAGGTGCTTAACGCCTGGTTATTGGCTT
-GGGGATCTACAGGCTCCCATGGCTGGGGGTGGGGGTTAGGGGAGGTGGGAGGTGGGAGGG
-AGAGGCCTGGGAATTTGCCTGACAGTGTCTCTTTGTGCATTTTTCTGGGGTTTTGCCAGC
-AGTTGACCCAGCCTCAGAAAGGTAGCCTGTGATTCAGGTAGTGTTGAAAACCAGAGGCCC
-AAAGGCAGGATAAATCTGGGCCTATTTTAGAGGCCAATAGCGTGGTGGTTCAGAAAGGGG
-TTCCAACAGTTCTCCCTACTCGCCGTTGAGGATTTGCGTCAGGTAACCACCCTGCGCCCG
-GGGCGGTGGAGGTGATGGGCTGAGACCGTGTTGGCGCAGTGCTGGGTACACGGTGAGTGC
-TCACAAGTGCTGGTTCTTGCTGTTTTCTGTGATTTTCCTTGGAGGGGCACAGGGAAAACC
-AAAAATGGCTGGTGCTGGAAAGAGGCCCTTGAGTTTCATCTCACAGCTGGCGGTAGGGTG
-AAGCTTGGCAAAAAACCTGTGGTCTGTGCTGAGCTTGGGGCTGGgtgtgtgtgtgtgtgt
-gtgtgtgtCTATGGTCTTTGAGAAGTGTCTTCATCAGCATATGACTTGTGTGAGTTTTTG
-GGTAGAGAAGGCACAGCCTTCACTAGTTTCTACAAGAAGGGTGTGATCCAGTGTGCGAAG
-AATCCCTGTGTGCAGGGCTGGGAAATCAGCTTCATCTCTTCCATCCAAGAACAGCATGGC
-TGGCACGCTTATTGTGTGCGGAGTCCACGGTAGCGTCCCTAGGTGCTAGGGACAACCGTG
-AGCAGAGCAGAGTTCTTGGCTGCCTTCACAGACTCGCAGTCTCCTTCGGAAGATGAATGA
-GAAATAAAATAAACATGTAAGACATGAGGTAGGTCACTAGGTGACATGAGCTTTAGATAA
-AAACAAAGCAGGGCACCTGATTAGGAGGGTGGGCCCTACTTGCCAGACCCCTACCCTCAT
-CCCCAATACAGTGTGTATCATTGCCTGGGCAGGAAAGGGCCACACTCCTGGGTCTAGGGA
-ACTAGGTCCCTAAGTAGCCTCATGTCCCCACCCACTAGGACCCAGCCTCCAGCCAGTTCT
-GTTGCATGGGGCAGGGTCCCTGGGAAGATGGGCAGGCCTCAGACTGCTGCAACCTCTGCC
-CCTAGCCCTGAGGTGGTGGCAGTAGTGTTTCCCTCTGATAATGACATACTCCAGTCTTGC
-ATGACCACGATGCCTCATGAGCCCACAGTCCAGAAGGGGCCTGGTGAGCAGGAGCTGAAT
-TAAAATGGAAAATACGGCCTCCCTTCCCCCCTTCCTGTTCCTCCCCACTTACTCCCTTCA
-TTCCTGCTGCTCCTGAAGCCATGGGTGAATAGTTTCTCAGTCTCTTTGCCTTGCTGAGCT
-GGGTTAGTTGGGTTAGCAGGATGGACATCTCCTTATGGATACTAGAGTTAGGAGACACCC
-AGAACCAGCAGGTGGGATTTTAGAAAGTGCTGTTTGGCTCTGACCAACCCCTACTCCCAC
-CCCATGCATAGCAGGGTTAGTTTCCTCATCAACTCTGGTCTCTGATTCTGATGTTCTGCC
-CCTAAGCATCCTACATTCTAACATTGTATTCTTCTGACTTTTTAGAATTTTCCCATCCTA
-TGCATCTTACACGAATATGGTGAAGTTCTGATTTCCGCCCTTATGTTCTAGATTGAGTCT
-TCAGTATTAATTTTGTTGGGGTCTACCCATTCAAATAACAATAGAGAAAGACTATGTGCA
-GAGTCACATAATACTAGTCATGATAGTAGCAATTAACATCCTTTTGACCTTGGTTTTATT
-TAACAGTTTTTTTTTTTGAGAATTTTCTAAGCGCCAGACACCATTCTAGACATTATACaa
-ataaatagataaaaatgaataaataaataaatGTTATTTTAGAAGGTGCAATTGAAATTG
-AGAGTCAAGGCAGGACTCACTAAGAAAGTGACAATattttctttctgctttcagttatgg
-agatttgaaatctcagttgataaggtggatttatttctccttgcaggtcattcacttttt
-ccttcatgtattttgaatctctgctattgggggcataaatatttagaattgttatatgct
-catgattaactgaccttttttttttttttttagatggagagtcttgctctgtcgcccagg
-ctggagtgcagtggcgcaatctcgactcactgcaacctccgcctcctgggctcaagagat
-tctctggcctcagcctcctgagtagctgggattacgggtgtgcaccaccacgcccagtta
-atatttgtatttttagtagagatggggtttcaccatgttggtcaggctggtctcaaactc
-ctgaccttgtgatccacctgccttggcttcccaaagtgctgggattacaggcgtgagcca
-ccgcacccagccttgacctttttaatcattataaaatgaccttatctttcctggtaatat
-tctttgctctgaaacaaacattgtctgatatgaaactagctactcctccagtgttatttt
-gattactgttactttccatctttgtacttttaacttgtgtgtttacacttaaggtgtgcc
-gttttgaaggttgggtcttattttttttttttaaaaaaaacaatatttgggtcttatttt
-tttaaaaaaatccaatctaacaatctctgctttttaattgagggtatttagaccatttac
-atttgatgtgatcattgacgtggttagatttaagtctatcatcttgctatttgttttatt
-tttgtcccatctgttctttgcttcctttttcttctttttctgtcttcttttgtataagct
-cagttttttttactatttcattttaactcctccttttttattatatcgttttaccttctc
-tgttggtttattaactgtaatgttttgtttgttatcttagtagttacattaggccttata
-agcctgggtacggtggctcacacctgtaatcccagcactttgggaggctgaggtgggcgg
-atcacctgaggtcaggagtttgagaccagcttgccaatatagtgaacccctgtctctact
-aaaaatacaaaaattagccaggcatggtggtgcatgcttacagtcccagctactcgggag
-gctgaggcaggagaattgcttgaacctgggaggcagaggttgcagtgagctgagatagca
-ctactacactccagcctgggtgacagagcaagactcaaaaagaaaatcatgtaatagtat
-actttcatttccttcctggccttcttgctgttgttgtcatacatacatatgtgtgacaga
-ctccacaaaatgttattatttttgtttaaatgctaagttatctttttttaaattaaataa
-tcagaaaagattttatatatttaactcatgtagttaacacttctggtgacctccattccc
-ttatgtagatccagatttccatctggtatcattttccttctgcctgaaggatttccttta
-tcacttcttgcagtgcagatctgttggtgacaaatgcattcagcttttgtatgtctgaaa
-tcatctttatttcatcttcatttttaaaagatattttaactgggtatagaattctagatc
-ggcaggttttttctttcattagcttaaaagatgttgttgcttcactattttcttccttaa
-attgtgtccaacaagaaatctgccattatccttatctttgtttctctatactttacaagg
-cttttctttctctgactgtttttaatatttatctgtttgtcactggttttgagcaattcg
-ttcatggtgggtaatttccttcctgtttcttgtgcttgaggttcgttaagcttcttggat
-ctgtgagtttatagtttatatcagatatgaaatattctcagccattaattttctatttcc
-tctcctttggggacttcaaagacacatatattaggcttcttgaagttgttccatagctcc
-taatactcttggttttttggattctttctttttctctgagtcgtcgattttgggtagttt
-ctattgctacatcttaaaattctctaatcttttcttctgtcacatcagcatatttttcat
-ttcagacatgtagttatcatttctagaagttcagtttgggtcattttatatcttccaagt
-ctctccttaacctttgaacatgcagaccatgaaatacaatttgaatacttattttaatgc
-tcttatctcctacttctgtatcagttctgggtcagtttcaattgattgattattattctt
-gtatgggccatgttttcttgcttatttacgtgcatggtaaactttggatgccaggcattg
-tgaacattacccttgttgggtgctgtacacttttatatttctataaatctccttcagttt
-tgctctaagatgcaattaagttacttggaaacagttttatccttcctagtcttgctttta
-taatttgttgagtgggtccagagcagtgctatctgttgagggctaattatataccactgt
-tgagaaaagaccttcctgagcactctacccagtaccccagaaattatgagggttttttct
-gtttattaatatttctggttttgtgtgagtgctgagcactgttctctaatcttatcagat
-gattttcacccctacttcagtgtagttttatcatacaaaagcaccaaccagtactcagtc
-taatactcaagggggactttcttcatatctctggaatagtctctctgtgcaactctttcc
-tcccaatactgtgtcctgcaaactctgccctctttgtccttcctggactctcaactctat
-ttccttaactcaggaagcctcctgggtgctgcctgggttcctcctccctgcactaggttc
-tgaaaactctctccaagcggcaaactgaggccatgatagggttcatcttatttcccactt
-ctcagggatcatgatcctttattgcctgttgcctagagtcttaaaaattacagtttcatg
-tattttgcctggtttggtttgtttgtttgattgtttcaagcaggagagtaaattcagttt
-ctgatactccatcttgggtggaagcagaTAtgagaaggtgacatttgaacacaaacttga
-aggagttgatggagtgaaccaagaggatatgggagtggggagaggaaggagattctaggc
-agtgtgaacagcaagtacaatggtctcctgcgtgtatagctgagagtgcgggtagtgtgt
-ttgaggaaggaagggagcacgtatggctggagcagagagttatgtggggaaagtggggag
-agggagggatgaggtgtcagcttgtgtaggaccttgcaggccatggagaggattttggct
-tttacaccaaatgaaatgggagccatgggaggattttgagcagagggaggacatctttta
-caggatctctgaatcgattggattaactgaaagggataagagggcaagagagaaagccag
-agacttgctgggaaccagtgcactaagccaggtgaatgctagtgactcagacACATGAAA
-GGACACACTACCAagggggtgaataactaggagcggggatgaaggaggcttctggggtgc
-tgtcggtgtcttgtatcttgatctgagggaggttacatcatctgctcactgtgtgaagat
-tcattgagctggatgtacacgtctaaattgtgTTCACAATTGAATTGAATACATGAATAT
-ATTACTATATAAATATACTATATACATATAAAACTTAGAAAACAAAGTAgggagatgaag
-gtggcttggactagactgttatcagtggaggtgggaagaactgtatgcattctagatctc
-ttttatatgtagatccaataagatttgcaaacagatctaatgttagatgtgaagacagag
-aatagtccaggataatgtcaagttctctggctgagctacagcaaagactgaggacctgct
-gtgtaccagagcttgggctaagctctattaacttctttaatcttcatgacaattctagga
-agtaagtCTGGCAAGAGCTGCTTctgaggtttttgtggggctactgggagcctttccacc
-agaagtgtagtttgtgtgatggattccagaggtagtggtggccacctttgcctccatgag
-gttacaggctgcctgagagtgaggcctacaagaaagaaatcaaagccatgatagagagag
-agacaggatcctcacagtaacatgtcagcacctggattcagccataacagaagccagtgc
-cctgggcttctcagttatataaattaataattacttttttttttatttctttcacttcta
-actgaagagtccagactgatacaACTTCTTCATATGTGTCCCCTGTCTGCACCATCCAAT
-GGACCATCAACAGCAGCTACATCCTCTCCTTACCGTTGCTTGCTTGCtttttttgagaca
-aggtctctttctgttgatcagactggagtgcagtggcataatcacagctcactgcagcct
-tgacctcttgggctcaagcagtccttctgcctcagcctcctaagtagctgggtctatagg
-tgcttgccatcatgcccagctatttttttttttttcatagagacagggtctcactatgct
-gtctaggctggtcttgaactcctggactcaagaaatcttcctgccttggcctcccaaagt
-agtgggattacaggcgtgagccaccgtgtttggccGTCCTTACCATTTCTAATGCCTGCT
-CTGCACTTTCTCTCTCTGGACCTTTGCTCCTACAGGTCCTCCTTTCCAGAATGCCTTTCC
-TCCCTTACCTTCTGCCCTCACATCAAAACCAGCCCCCTACTCAAAGCCATCCTAACTCCA
-CCAGCTGAAGGATGGAGCTGGCAGAGTGCTTAGATATCAATCCATTTTACAGATGGGAAT
-ACCAAGGTCACTGTGAGACAGGGCAGATTTGTGGTCAGGACTCCCGCGTTCTGACTCTCT
-GAGACTCTTTCCATGATCCTCCAGGACAGCCTTTTCTGTGCCCTCCCTTGCGTGGGGTTG
-AACAGTACTTTTCACAACAATTTACActctcccataccccaacccttgcacgtgctgttt
-cctcagtctgggatgccctattccattctgtccttccggaaagggtgccacttgaacttg
-gagattcaactcaaggatcagacttccagaagccttctctttttcccagggtggctctgt
-gtcctgcctggtactcccACAGCTGCCTCTGGTACCTCCATGAACCCATTTATCCATTTG
-TTTTTTAGGTGTCTGTTTCTTGTTTGCCTCACCTGTTAGGTAGGGGAACTGAGGCAGACC
-TCCTGGCCAAAGAAGGCTCCCAACTGATGTTTGTGAATCAACATAGAGTGAGAAAGAGCC
-CCGTGGAGTGGGGCGGGGGgtggagagccagcgctgggcgtggaggcaggacgcctgggc
-tccagtccagccaccaccactctagtgtgtggcctcatgcaagtcatgtcctctccttga
-gcctcaggcttttttggcagtaaaaagggcagaacatcatagtagttaatacctcaggca
-gcctggatttgaatcttggctgtgtgactttaggcagtttactccagctctctgtgcctg
-tttcctcatttgcaaaatgggggcaataaacatatctgcatcatagggtatttgtgagca
-ttaaatgagttaatgtttacaaagctttcaaaccatgcttgcttggcacatcataTAAGC
-ATCCCAGAGTGAGAACCATTAAACAAAAGAAACCCTTCCCTTCCTGAGAGGAGAGGAGAG
-CTTGACAAACTCTAAAGTGGCGTGTGAGTGAACTATGGTCACTctcagggggtaagctgc
-ctggaaaaggctgactctgacactgactagtgtgtgtctttggagaaatcatgtcacctc
-tctgggactcagcttccccatctatcaaatggaggagttggtctagcgcagttggagtta
-aagtgctttgtctctttgagttttatgtccatgtcagtagagtgggctgagagctgcatg
-tctgtcatgcgctcctggtgagaatgaaatacgatgatgggccggacgcggtggctcatg
-cctgtaatcccagcactttgggaggctgaggcgggtggatcacttgaggtcaggagttcg
-tgaccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaattagccgg
-gtgtggtggcgggcgcctgtaatcccagctacttgggaggctgaggcaggagaatcgctt
-gaacccgggaggtggaggttgcagtggaaccaggattgagccactgcactccagcctggg
-caaaaaagtgagactctgtctcaaaacaaataaataaaataaaaaatataataataaata
-aataaatacaatgatgtctggagcacttgccagtcatgcctgccacatagcaagtaatcT
-GTCATAACTGTCACTGTTATTCTGGCCCTGACATTCCAGGGTTCCTTGAGGTGGGGCAGG
-ATGAGGGATGGGCTGGGCATCATGAAGGAAGGTGCTGATGTATCACCTACTGACAGTTTA
-GAAAAGGGAAGGCAGCCATGTGACCCACAGGCAGTGTCCCCCTGCCTGAGCCTTATTTGC
-AGGGCTGTGGCATCGGTGAGCAGGACAGGGACCACCACGCCCACTAGAGAAAGAAGCACG
-TGCTGCTTTTGTGAGTTCACAAAGGTCTTGGTTTTCCAGGGCCAACAGTGTCCCCGCCAC
-ACGTGACCACCTCAGAACCATCACCTGCCACCTGCCAGGGCCTGGGAGTTGGAATCTGAG
-Gtggaaggagagagcaggggccaactcctggctgctcccctctcttggtatgtgaccctg
-ggcaagcctctgcacctctgtcccctttgtcctctcttgtcacataatgaggttttgagt
-gtcttagatagggaggatgtcTCCCTATCTAAGGATAGGATAGGATagaaatggccaggc
-cctggtgcctctgctagctcagtctggctgggacgacctgggaagaacatggcctcagtt
-ccaaagccaaggcggctcctgggggagctgcagctggaggctgtcagcttgctgccctcc
-ttgctgctgaaggacaagctttttcttgaagataggatggataggatgtctcctatccat
-caGGAGATGCGATTATTGGCCTAGACTGGGCAGGGTCTCCACCTGGGCGACGGGTTGGGA
-GGCGGAAGTGAAGCTGGTGGCATGAACCATTCTCAGTGACCTTTCACCAGGGTGAGTGGG
-AAGTAGTTGGGAGCATCGAGGCCTCACTCTCCATCCTGAAGATGGAGCACAGACTGGCTG
-GCTGAGGCCGGGAGCTCATCACGGGATGGAGACAGATTGGCAGACAAAGAGGAGGCGGGC
-GGTTGGGGCTGGGTGCCCCTGGGGAGGAAGGCGGGGAGAGAGCGTAGGAGCAGGAGGAAA
-GAAGGCTGGGCTTATGTGCAGCCTCACAGACTGGGCCTGCAGAGTCTCCAGCTGGAGGTT
-GGGACTGGACCTTCCTCCTGAATGGGCAGGGAGGGAGGCTTGTTGGCCTAGCCCTCGGGG
-TTCTTGAAATAAATGAGGGAGGGCCTTGGGGGGTGGTAAATTGCTGAGGCTGTGATAAAC
-ATTCTCCCCTTCCCACAAAacacacacaggcacgtgtgcgtgcatacacatacacacaca
-cacCCTGGCCACACTGCTGTGCATATCTTACTGATTGTTGTCCTCTGTGAcagcagttct
-ccaagttgagtgcattggaaggatcagttaaaatgcagatttccaggcatttccatctct
-aaatgtagggtgtggcctgagaatgtgtatgtcttacaggatcctggttgatgctgatgc
-tgggggttctgggacacactttgagaaccactgCTCCATTGAGCAGCCtttcagtttggg
-tgcccctcggtgctggtgctgggagagagttaggagggcaagggggttagtgagggctgc
-tacctgtgaaacacaaagcaggagggaatggaattggccaggagagcctcagaccacagc
-ccgggcctgcagagtcaccctctaggggtctctggagtaaagattatccacagagaagcc
-ccacatggggcagaaatggccaggccctggtgcctctgctagctcagtctggctgggacg
-acctgggaagaacatggcctcagttccaaagccaaggcggctcctggaggagctgcagct
-ggaggctgtcaccttgctgccctccttgctgctgaaggacaagctttttcttgaagagag
-aCTGTGTCCCATCCACAACTGCCCCAGgcatctaccacatgccaggctctgtgcagagtg
-tttacctggatgaatgcagtttcagatcagagcaacctggccaagcaaatataatcgtcc
-ccatctaatagatggggaaaatgagggattaagtcatctgcccaGTGGTGGAGTCAAGAT
-TTATCCCCTCTTGTGCCTTAGcactcatccctgtcagcttccctgggtggtgaagaacat
-tagctccttttacacctgaggaatctgaggtgtggagaggtcagtgacttgcggtagagg
-tgggtagaggatccgggattccaaccctgctcatgccCCTCTTTTTAAATTTCAAGATGC
-TGTCCCTTGAGTACTTCTAGGGGGATGTAATGGCAGAAACTTGGGGCTGGAAGAAGCctc
-cctggcatttgacaggtgggtacactgaggcccagggaggcaaTCAGCCGTGCCTCAGTG
-CCTCTCTCTGCCCTGAAGGGGCTCCCTGTTGTGTGTGGGGTATAACCCCCCCGTAATTCA
-TGCATTCAGCACACACTGGTGGGCACCCATTGTGGGTCAGTCCCCCAAGCCAGAGTACTG
-TTGGTGAGTGGGAAGGCAGACGTGGGTGCAGAGGGTCTGTGCAGTGATTGGGGATGCACT
-GGGGATTGGAGGGGGCAGTTGACATGTGTGGGGTGCATGCAGGGAGGCTTCCTGGAGGAG
-ATAGTCTGAGAGAGGAGGAGGTGAGAAGGGTACTCAAGGATGAGAAAAGAACAGAAACAA
-AGGCTTGGAGGTGGGGGAAGTGATATTGCCTTTAGGAAATTGATAGAAAATCTGTAGCTG
-AGATAGTGTGGGGAAGGTATGGCCAGAAATGAGGTGGAAAGTGGAAGCTTGGCCTGGGGA
-AGTGGTGGAAAGCTCTGGACTTGAACCATGACCCTGGTTCTGTTCAAGGCAGGGCTACTC
-TCTGCAGGGCTCTGAATTCTCCAGATTTCCCTCTTACCTTTCCGAACTTCCTGCGGTGGC
-CAACCCCTAAAATAGCCCCCAGTAATCTTTGAGTCCTAAtaaccagtaggattttgtgga
-aatgacagagtgtgacttccaaggctggatcatagagtgtgttgcagcttctgccttggt
-ctctgggtttgatccccccggagaagccagctgccgggctgtgaagtcactcaagcagcc
-tgcagaaaggccacatggagagaaactgaggtcctgcctgcagccagcatggacttgcta
-gtcatatgactgagccaccttggaagtggatcctccagccccaggcaagccttcagatga
-cagcagcccagaatcacctagccaggcctgttctatattcctgacccagagaaactgaga
-cacactaaatgatcattgtgttgtacgtcactaagttttggggtcatttgccgtgcagca
-tcagataaTGAGGGCTTCTCTGTGCCCTTTCTTGGCTTCTTCTGTTGCTTCAGCTGCCAT
-CTGATGAAAGTCTGATGAAAACCAAAGGCCCTCCTCCAGAAAAGTTCAGGTACACCCAGA
-AAGAAATGGGGGTGCAATTTCAAAGGGATCACAGGCCATCTAAAACTAAACCTCAGACCT
-TCAGATCCCGGCCCCCAGTGGACATGGAACCTGAGTGAGGAATGAACAGTGTCTCAGTTG
-CTGAGCTGTGGGACATGGTGGCTGCTGCGGGGTCTTCAGCTTGGTCATGGCAGGGTGCCC
-ATGGCCTACATTCCTTTCTCCTCCTCTTCTCTGTGTCCTTGGCAGGCTGCCCCTGCAGAG
-GAGGACCGTGGGTGCCCAGACTGAGTAGGTAAGTTTAGCTCTAAGAGAACAGGTTGAGAG
-AGCCCATCGGTTGTGTACAGGCAACTTCTCAGCCAAGCTCTGCCAGTTGCTGGTGTTCAT
-ACTTGGCTGATGTCTCCACTTCAATACAGAGCCTGCAGGGGATGCAGGCTGTGAATGCAG
-TCCCTGGAACCAGACTGTGGGCTCagccatgagacctgggggatgtacttcaccttcctg
-acttgggcttttcaacttggaattggaggccagaagtccaccctgaagcgtggctgtggg
-gTGGAAACAGGCCCTCCAGCAGGGCAACAGCAGGGGCTCCTTGCCTGGCAGCCCCTCCGG
-TTCTTCAGCCCTTAGCCTCCCCTCTCTGGCTGTGGTCAGTGGCTGGCTCACCAGCCCCTC
-TTATGGCAGTCACTGCTCCAGAGTGCCAGGATTTCCCAGTATGGTGGCCAGGGCTGTCCG
-GAGCCCAGCACGCAGCTCAGGAAGCAGCTCAATGCAGGTGGGACGTCAGTGGGAGCAGAG
-GGCAGCCTCCCTCCCCAGACCCCTGAGGATGAGTCTGTCTCCCTCCTTGGTGCTAActtc
-tctctccttcttacatctccacttctttcttcttcctttatcttctctacctccttctct
-cttctaccttttcccttcttttccgctttttccttttttcatcttcattcttctcttttc
-tttcgtctttctcttcccctttcctcctctctttgtctagtccttcttccccctcacctc
-tccttttcctcctcttcCGTTTcataatgattaagagtatggcttctgatgtcagcctcc
-ctgggttcgaatccctgctgtgccacacactggctgcgtggcgttgggcaagccacttaa
-tttctctgtgctttggcttcctgagctgtacagtgggatgctaacagtgtctctcttgaa
-gggtGCCATGGGTGCCAGGTGAGCGTTAGCTGCTTATCATTCGTGTTCCTTCCTCCCCTC
-CTCTTCTTCTCCTCCTGGTCTTAGAAGTCTGTCTCCCTCCCTCTCTCCAAGCCCTGTGAC
-TCGCCTCTTACGTCTCTCTGCCCAGCATCTTGGGCCTGTCTCTGGCCCCTGCCCTGCTGC
-TTCATCCTCTCACTGCACGCACAGGAAGGAGAGCCCAGGCCTGGGGCCAGGTTGCCCCAT
-GAACAGTTGCTGAGCCAGGTGGCTGGAGCTCTTCCCTGGGGCCCCGCCCACGATGAGTTC
-AGGAGCTGCCTTTGTGCACCCGTGACAGCCTCTCCTGGCGCCTCATTTGGCAGAGCTGTG
-CATCTGGCCCAGTTACTGTGGTAGCCTTGGAAGGCAGAGTGCTCTGGGGCTTCCTTGTCA
-TCTACCTGCGTGACCCTGCATGAAGGGTATGCCCAGCCCTCAGCTGGACTGCCAGCCCCA
-CAGGCACCCTTGGTGCCCACCACACAGCAGGAGCTCATCCACAGATGGGCACAAATAGTG
-ATACCAGACAGTGCCTCtgagtccttgctgtgctaggcactgttctaagtgcaaattccg
-ttcatcttcacagcaacccttgcagtgggggctgttaaccccattttagagatgagcaaa
-ctgaaacacagaaaagcataggaaattgcccaaagttgaatgaatgaatgaatgaatACA
-ATGACAACTTAGGAAGGAAGGCATTTTACTGAAGagtgacaggcccacggtcacacagat
-agtaagtggaaaaaaatcagggctggaactcatgactccaaCATCACCTCCCACCTGTCC
-ATAAGCCCAGTGACAGCAAGGCTGGCACTCCCTCACACTTGGGGTTGAGGCCAGTAagag
-ctgcatttgtggaacactggccaaagcaaaccctctgtgctgagggcacttcagccagtg
-tctcaagcctgtctgcacttcttcttttttttttttttgagacagactctcactctgttg
-cccaggctggagtgcagtggcgcaatctcggctcactgaaacctctgcctccccggttca
-agccattctcctgcctcagcctcctgagtagctgggattacaggcacgtgccaccatgcc
-cggctaatttttgtatttttagtagagatggcattttgccatgttggccaggctggtctc
-aaactcctgacctcaggtgatctgcctgccttggcctcccaaagtgctgggattacaggc
-gtgagacaccatgcccagtcaactgaagttctttgagagtactgttcccattttccagat
-gaggagcctgaggcccagcgaaggcgagcaacatggccaaggtcacacagccagtaggtg
-TGATTCCAAAGTCCCACTTTCTGTCTTCCATCAGGTAGTACTATCTGCCTTCCACTATGG
-AGGGAATGTCCCATTGGGAGACGCCTAGGATGGGGGCTAAAGAAAGACAGGCAGGCCCGA
-CACCAGCCTCTCTCTCTTCTGTCTGCTGTCAACACTATATCTTGGTGCCATTCTGCCCAC
-TATTTGTAGAGAGGCCTGGGTACCAGCCTCTTCACTTTGTCCTGGAGGCCAGGCCAGGCA
-AGGATCACTGTACCCACTTttctttccttccttccttccctccctccctctctttctgcc
-ttTTTATTAAGGTATAAACCACACAAAATAAAGTACATAGagccaggtgtggtggctcac
-gcctgtaatcccagcactttgggaggccgaggGACCCCCCAGCCAAAGCCTGGAGCTCAG
-AACACAAATGCTCCCCTTGTTGAGAGTGGGGAAAAAAATCTCTTTTCAGGTGCCAGCCTT
-AAAAAGAAAGAACAAAAAAGGTAACTCACAGATGACCGTGATATGTGACGTGCATCTGAG
-CCCTTCACACAACCACAGAACTAACTGTCTGCAGCTGCCACAACAGCTGACCCCTCTGCC
-AGGCAGAGTTTGCTATCAACCAGTAACAGCTCCCAGAGGTTTTGTTATCCCTCTGTAGAA
-ATGGAGGCTTGAggccaggtgcagtggctcatgcctgtaatcccagtactttgggaggct
-gaggcaggcggataacctgaggtcgggagttcgagatcagcctgaccactatggagaaac
-cctgtttctactaaaaacaaaaaattagccaggcgtggtggcgcatgcctgtaatcccag
-ctaccagggaggctgaggcaggagaatcacttgaacctgggaggcggaggttgtggtgag
-ccgagatcgtgccattgcactccagcctgggcaacaagagcgaaagtccatctcaaaaaa
-aaaaaaaaaaaaaaaaaaagaaaTGAAGTCTTGATTGACTGAAGTAGGAGGAGCCAGCGC
-ACAGGCTTTGGAGGCAGAAGAGCTGGGACCAGCTCTGGAGGTTTGGGAACATGACTCCAC
-CTCCCCGAGCCTCGTACTGCTGACCAGATTGCTtttgcaagcattgtactacatcttcac
-acaatgctgggaggcagctgttaccaaccccatcttacagccggagaccctgaggctcag
-ggaggtaagggatgtgtgcagagacatgcaCAAAGTGGAAAAATGTGAAAACAGACCTCA
-TCGTGCAGTGTTATTGTGCAATTTGAATTGAATGAGGGATAAGAATGTGAATGGAtgcag
-tccacagtaggtgcttaagtcttgcatggggtctaatagccggtgagtggcaaaaggaga
-acttgtacccagatctgcctcaccccagagcccacctctgagcctctTCATCCATGGGAA
-GCCATCAtcagcatggtgcctggcaccgagtgagcctttgagaaagggtaactGGgtcaa
-aaattattttcagaaagttgaaaacatggatcttatacaaatgtatagtgagcacatgtc
-aaagtgttatttaactcattaaggatggaaccggtaggatggcaaagctgactcaaagga
-ggataaaatggcaaagttagctacgacataggttaatgtcttacagggcaccaaaaccat
-aagctttagcgttatttcttctacaggtcagaaatcatttgcaactcgtgcactttttac
-aagttaccaggtaactttgcttaggatcaggtgacccaggctcatcggacactgccttcg
-cttgatattgaaagggcacacagacaccctttttgtcttatttccaagttttggatattt
-tttctttaCAGTTATTATCATTCCACTTCTCTCTGACGAAAGGCTGTTCACAGGCCTCAC
-AGGTTCCCAGGAGCCCAGGGACACGCAGACCCCACCCCACCCATTCACACAAGGACTCAA
-GGACAGAGCCTCTACCCACAGATGAACTTGGGTGGTGCACAGGCACACGAGCTTGATGGC
-AGGGCACGCCCAGGCTGAAGGGGCCGGGTGGGAGCTAAAACGTGTGGTCTATGGTAGCCC
-AGCCTCTTTCCTCAGCAACCACGCCATGAAAAGATCCCTACATTATTTGTCAGGTAAAAT
-AAAGCGACCCGTAGCTAGTGGCGCGAGATTCTATCCAGCTTAATACGTGTGTATGTGCAG
-ACACATTTATGAGTGTGCATGCAGAGAAAACTCTCTGGGGAAATACCCCCTGAACTGACA
-GCCATGGGGAGTGAGGGTGAAGCGGAAACAATCTTGTAAAAGAAATTCAAAAACCGAAGC
-CCACTGCATTGTTTAAATTGGTTACGTCCAACTTGTTTTCCTGTGTTATCTGTCGCCTGT
-TAATACACACACACAAACACACACATAATAGAATGGGATAGAatatctatatatatctaa
-tatatataatatctaatatatataatatctaatatatataatatctaatatatataatat
-ctaatatatataatatatatatagagagagagagagagcgagagagagagagagagggag
-agacggagtttcgctcttgttgcccagactggagtgcaatggcgcgatctcggctcaccg
-caacctccgcctcccggcttcaagcgattctcctgcctcagcctcccgagtagctgggat
-tacaggcgtgcgccaccacgcctggctaaattttttttttttttttttaatttttagtag
-agacggggtttctccgtgttggccaggctggtctcgatctcccgacctcaggtgatccgc
-ccgcctcgacctcccaaagtgctgggattacaggcgggagccaccgcgcccggcGGGATA
-TTATATTTCCATAAGGCCCTCCGGGGGCCTGGGAACGGACTGGTGCTTGCGTGCGGGGCT
-TTTCCACTGGTTCCCTTCCGTACTCGGGCTTCCCCCGCTGTTGTTACTCCCTCAACGGGA
-ACACAACTCCACCGCCGCCTCCGGGACACACCCCCGCCGCGTGGGCCGGGGTCCGGGACG
-CGCGCTCAGCTCGGCCCCGCGGGGGCGGCGCAGGAGGGAAGGGGGTGCGGACCCCGGAGG
-CGCCGCAGGAAGCCCTCGCCCACCCTTCCCGGCCGGGCCGGGTCCGCAGCTGACGGTGGG
-GGTGGGGAGCAGACGGGCGGGGCGCCGGCCGGCTTGGGGGTCCCCTGGTCCCGTCCAGGG
-GGCTCGGGCCGACTCCGGGCCAGCTGCGGAGGCGGGGGAGGGGACCCCGCTTTCCATGGC
-AGTGCCGAGGCGGCGCGCACAAAGGCGCCGCGATCAGCGCTTCATCGGTTCGAGTCAATT
-ATCTGAGGCGCGGAGGCGGCGGGCGGGGCGAGGCGATTCCCCGGTGGGGCTGCGGAGCGC
-GGCGCCGAGACTCAGAGGAGGGGGCGCTGGGGAAGCGGCTTCTCCGTCTCCTGCTCCGCC
-CCGGGCTTCGTGGCGAGGCGCCGTCGCCCCCTGGTGGGGCCTCATCCATTCCTCGCTCAC
-TCGCTCGTTCACCTTTTTCTCAACCTTACAGCGGGTGGCTCTACGGTACGAGCTGAGGGT
-GAAGTGCTGAGAACAGGGCAAGCGGGCCGTACCTTTAAATGCCCTGTCGGGAGCTGGGCC
-CCTCTGAGTGGCCAACCTCACCAGGAAAGGGCGCTCAGCCTCGCGCTGCAGATGGACTTG
-GAAGCAGACCGTCAGAATGCAGCCCTCCCTGCACGTGATAGAGTAAGGGCCGCACAGGGG
-ATGAGGGCCCGGGGAGGCCCTTCGGGAGAGGAAGAGTCCCAGATGGCTCTCTGGAGGAAG
-TCTGGCCTAAGATGACCAGGTGAAGGGGTGGGGGTCCAGGGAGATGAGGGCGTTGCAGGT
-AGAGGTTTCAGCTATTGCAAAGGGGTTGCAGTACGGGCAAGTAAGGTGCACTCTGGGGAG
-AGTAACCTGTACTTACTGTGCGAGGGGAAGGGAGGTGATCAGTGAGGTAGGTAAGTGGGC
-CAGGGCCAGATGGCACAGGGCCACCTGCAAGCGTGGGCTGAGGGTGGGTTGTCAGGTCGT
-TTCATCATTTCCAGTTTATCCTTCTCCCCTTTAGATTTGGAGAGGATTTGGctgccctca
-cccttgtaagggtttaggcatcattcgcccttgactcctgtccagttgtctcactggtct
-ccctgtatcccttattttgcccttcaatctgcctgcacccatcctccaaaatgacctttt
-taaaagcaaagctcggtggcactacttttcaaaatcACAAATGCACAGGATCTGTAACCT
-GCTGGTTGCACATGACAGAAACCGCATAATAATCATGGGTTAggccgggtgtggtggctc
-aagcctgtaatcccagcactttgggagcctgaggcaagcggatcacttgagatcaggagt
-tcgagaccaggctggccaatatggtgaaaccctgtctctactaaaatacaaaactttgct
-gggcgtggtggtgtacaccagctactcaggaggctgaagcacgaggagaatcgcttgaac
-ccaggaggcagaggctgcagcgggctgagatcacaccactgcactccagcctaggtgaca
-gagcgaggctccttctaaaaaaaaaaagaaaataaaaaaaaaGTCCTGGTGTTAGAGGCA
-TTTTTCTTTtcctcctcctcctcctcctgctcctcctcctcctcctcttcttcttcttct
-tttctgagacagagtctccctttgtcacccaggctggagtgcaatggtgtgatcttggct
-cactgcaacctccacctcttgggttcaagcgattcttctgcctcagcctccagctaattt
-ttgtatttttagtagacatggggtttcaccatgttagccaggctggtcttgaactcctga
-cctcaggtgatccacccgccttggcctcccaaagtgctaggattacaggtgtgagccacc
-acactcagccAatagaggcatttttctgtcatgtaaataaagtctaaagcaggcagtcta
-aaactggcatggtgctctacggttcaggaacctaaactccttttgtcttattatgctacc
-ccctcagtacatggtttccacttcatggcccaacatggctgctcaaacagcagccctcac
-atctgcatccccagatggagagtctttttttttttttgagatggagtctccctctgtcac
-ccagcctggagtgcagtggcctgatcttcgctcactggaatctctgcctcccaggttcaa
-gtgattcccctgctcagcctcctgagtagctgggaccacaggcacgtgccaccacacctg
-gctaattttttgtatttttagtagagatggggtttcactgtgttagccaggatggtctcg
-atctcctgaccttgtgatccacccacctcggcctcccaaagtgctggggttacaggtgtg
-agccaccgcgcccagcccccagatggagagtcttttagtcattagaaaggagaaaggagc
-caaggagggagggaggttcccttaaagactctttcggaagtcacatacaatcttcttgtt
-gatgttccattggctaaacttgatcacatcactacactaagctacaaaggaggctgagaa
-atatgatctgtgttctaggcaccatgtgtccagatgaaaattgaggctcttatttcaaag
-aaaaagTTCAGTCCATggccaggcgtggtggctcatacctgtaatcccagcactttggga
-ggccgaggctagtggatcacctgaggtcaggagttcgagaccagcctgggtaacatggaa
-aaaccccgtctctactaaaaatacaaaaattagccgggtgtggtggcatgtgcctgtagt
-cccagctgctcaggaggctgaggcaggaaaattgcttgaatttgggaggcacaggttgca
-gtgagctgagatcacgccactgcactccagcctgggtgacagagcagaactctgtctcaa
-aaaaaaaaGTATCAGAAAAAGCGCAGTCTGGATATTGGGAAATGACCATCAGTCTATGCA
-TGctcaggagttccatgtctagcagtgtgtcctataggtttgcttaacccatgtgacatt
-tgacacgtttacaaggttattcactgcagcattgtgacagcaaaagactggaaacaacct
-aagtgtcctgtaataggggactggttaaacaaattatgggacatttatacaatggagaat
-gatggccacaaacacacatgaggaaactctcaatgcagtgatatgaaatggtatttaaga
-tgtTTcactttggaaaacagtttggcagtttcttatagagttaaacatacatctctccta
-tgacccagcaagttcacctctaggtttttgctcaaaataaaaatatatatgtatatatag
-ctccacaaggacttctatgcaaatgttcaacagagtttaacatgtgatagacaacaattg
-gaagtgacccaagatcgaacagccaatgaatggataaactggtgagtcaaatattacact
-ggagtttaaatgagtgatccaatgtctgcaaccacatggatgaatctcaaaacatgctga
-atgaaaacaagctggatacaaaaaatagcatgttgtaatgatgccgtttatatgaaattc
-tagaagaggcaaaacagaccaatctatgatgacagaaagcagagcagtggctgcctctgg
-ggtggagggatggactgggaaggagcataaaagaatttcttgggatgctggaaatgttct
-gtatcatgattggggtgttgattacacaggtgcatTTCACTGCATGTAAATTATACCTTG
-ATATTTTTAAAAAGCAGGGTGCAGAACAATGTTTAAATTATGGAATCCGGTATGTTTAAA
-AAGCAAGGAAATTTGCTTGTATCTGCATTGACTGTCTAGAAGAGACTTGTAATAGTGATT
-GTCGGTGGGAGAGGAACTGGGTAGCTGGGGGCTGGGGAAAAGGGACACTTTGGGCCATAC
-CCTGTTATACCTGTTGAATCTTAAACCAGTTGAATGTACTACCTAATTAAAAACTAAAAC
-TGAAAAGATCAGTTAGATGCACACGTGACATCACCACATTCATGTTTTAAATCTCCTAAT
-GGCTCTTCCCGGCAATCTGGACGAAGTTCAGACTCTGAGCTGTCCTGGCCTTATGTGGCC
-CCACTCAGGCAGCATCCTCTCCAACCACTTTTCTGTTCCCTGCAGAGACAGCTCAGTGCC
-TGGCTCCCTCTGGTTGGCCTAAGTGCATATGTGCCATTCCCTGAGTGCTCAGCTCCTCGG
-TGAATTCTCCCCAGCCCCCTGCCTGAGTTGGTCCCTCGGGTCTCACTGGACCTGCTGCAC
-TTTGCCTTCCCCCTTCCTCATCTATCAGATCAACACGTGTTTCCCAGAGCTCTCTGTGAG
-CTGGACCCCAGAGTCCTGGAGATGTGTGGGAGCCACTTTTATGGGGGAACCTGCTTCCTT
-GTTTCTGCTTCAGACAGCAGGCTTCTCCTGCCCTGAGACTCCCAGCAGCGTCTCCTCTTC
-CCAGGCCCAGATCTGGCCTGGGGTAGAAACTTTGATAAAATGTGCTGTCTTTAAGTTAAA
-TATGGCTCCATAAAGAATGCATTCCATGacaagaaccaacagagccctggtttcttagaa
-gatacagagaaaacacactgttgtgggagaattgtgtctgccaaaaagatacatcccagc
-tctaaccctgggacctgtgattgtgaccttatttggaaacagggtttaggcagatgtagt
-caggtcagggtgaggtaatactggattagagtgggctactccaatgactggtgcccttaa
-agagggaaacagacagaggagaacaccacgtgaccacagaggcgaagatgggagtgatgc
-atccacaagccaaagaaggccaaggaggcttgcagtcataaaagctggggagaagcgagg
-aagtgtcctcccttagggctttcagagagagcatggccttgccagcaccttgatttcaga
-cttttagcctccagcactgtgagaatacatttcagttgtcttaacctacctggtttgtgg
-ttatttgttctttttttaaattttttatttatttatttatttttgagacagagtctcact
-ctgtcacccaggctggagtgcaatggtgtgatcttggctcagtgtgacttccaccttctg
-agttcaagtgattctcctgcctcaggctctggagtagctgggattacaggcacctgccac
-cacacctggctaatttttgtattttcaatagagacgtggttccactgggttggccaggct
-ggttttgaactcctggtctcaactgatccgcctgtcttggcctcccaaagtgctgagatc
-acaggcatgagctaccgcacctggcctgtggttgttaactgtagtcccaggaaatgaata
-cacacacaaaaccagttaatacctaagacaattccagctagtggcaagtgctttggaaaa
-acaaaacaaaacaaaacaaaacaaaacaggtgagaagggcgtgggatagagagggactgg
-gaacggtgccacattagccagggtggtcagggaagccctcttggaggaggaggcatttca
-gtggagaGGAGAAGCCCAGCATGTGAGGACCAGGCAGAGGTGCTGGTGAGGGGGCACTTG
-GTGGGCGTGAAAGCTACTGGATGCAGCTCTGACGATGGAGGATACCTGACTGGGATTTTG
-GAGGAAGTCTCCAGGAATGAACCGGGAAGGGGCTATCCTCTCTTTGCCTCTGCAGGTCTC
-AGAACCTGCTGCATGGCTGCTGCAGGCTGTCCCTCGGCCTAGGCCGGCTGGCAGCCGATG
-AAGGAGGCCAGCCTCGCAGCTGACATGCTGCTCTCTAATTGTGATTAACTACCAAGTCCT
-CTCCTGCTCCGGCCTGAGGCCGCTGGTGTGACAGCTGCAGAGTGAATCAATGAGGCCAGG
-AAGGGGTTAATGGGCAGCCCCTCCATCTGAGCCCTTCAGACAATAAGGGGAGGTGGGGAG
-GCCTCTGGTGGGGGTGTGTGGCATCAGCTGGGGTGAGTGAATGGAGGGGACAGAGGCCTT
-GTCCCTGGGGACAGGGTGTGAGTGCTCTGTGGGGAGAGGGGTCAGACCCCCCTCCCATTA
-TTTTCATCCACCTCCATCGTCCTCTCCCCTCCCCCACCCAGCCAGAGCATCCCAGACAAC
-TGCCCTCTTGGCTCCAAAGTGTGCAGCATCTTCAGCCTTACGGAATTCTGAAGCAGAAAT
-TCTAAAAGCCAAAGAACTGCAGAATCGTGACATGTCACCGCTGTGGGAGAGTCCGTCTAG
-TCCTGTCATTCTGAAACTTTCTTTTGCAGTGGAACCCACAACTCCCACCCCAGCTCATTT
-CCCCCCAAAATAATAGTGCATTGATAACATTGAGAACAGACCCTGGTACCAGCCGGCCTC
-ATTCATCCTTCATTCAGCCCCGGTTCTACCACGTACAACTAGGGTAACTTGGGGGTATAA
-TGCATAGTTTATAGgtgtgtgtgtgtgtgtgtgtgtgtgtgtCTTCCCtagagacagagt
-cttgctatattgcccaggctggtcttgaactcctgggcacatgcagttctccagccttgg
-ccttctgagtggctggCTCACACCACCGTATTCAGTagttccgtaggttttgacaagttt
-gtaagttatgtaaccaccaccacaattaatatatagaacatttccatcgctgaaaaatgt
-tgcctcatgccccttgtagtcaatacccttcccTGTGTTACCTGATATGGTAGCATGAAT
-AAAGGTCATCTAGAGTTAGTGACTCTAggccgggcagggtggctcatacctataatccca
-gcattttgggacgccaaggtgggtggatcacttgaggccaggagtttgagaccagcctag
-ccaacatgacaaaaacccatctctactaaaaatacaaaaatgagccaggtgtggtgatgc
-acgcctataatcccagctactccggaggctgaggcaggagaattgcttgaacccaggagc
-tggaagttgcagtgatccgagatcacatgactgcactccagcctgggcaacagcaaggct
-ccgtctcaaaaaaataaaaaaaataaaaaaaTTAGTGAttctaatccttgaactgtgtaa
-atgttaccttatttggataaaggatctttgcagatgtaattaagaggcagaggttggagt
-gatgtggcccaaagcaaagaacaccaggaggctcccagaaccagaaggggcaaggaatgg
-attctgctctagagcctccagaggtagagtggctctgccaacaccttgatttcaaatgcc
-tggcttcagaactgaaagagaatacacttctgttgttttaagcctctcagtgtgtggtac
-ttttttacagtagtctttacaaacaaatatacctagcaaccaccatgccttgttttctat
-ctgtataagttttgcctttgcaaggatgttacatagacagaatcctgcagtatgaagctt
-ttgtgagtttggcttctttcactcagcataacacagttgagatgcatccatgctgttgca
-tgcatcagaagtctgttccttttggatgctgagtagtatttcactgctggatacaccaca
-gcttatccattcaccagttgaaaggcatttgggtcactcctaattgggagcattataaat
-aatgctgctatgaacatgtgtgtatagatctctgtgtggacatacactgtcatttctcca
-gagtagataccctggagtagaattactgggtcatattgtaagtgtatttataattttatc
-agaaattattacccgggcatggtggcatgcacctatagtgccagctacttgggaggctga
-ggcaggagaatcccttgaacccagtaggtggaggttgtagtgagccgagatcatgccact
-gcactccagcctgggcaacagagtaagactctgtctaaaaaaacccaaaaaaccaaagaa
-caaaaCTACAAAGAATCTGATgtggctcatgcctgtaatcccagcactttgggaggccga
-ggttggaggattgctggagctcaggagtctgagaccagcctgggcaacatggcaaaaccc
-gatctccactaaaagtacaaaaattagttgggcgtgatggtgagtgcctgtagtcccagg
-tacttgggaggctggggtaggaggatcacttgagggtgggaggcggaggttgcagtgagg
-tgagattgtgccaatgcactctagcctgggtgacaaagtgagaccctgcctaaaaaaaac
-cccaaaaaacagaaagaaactgacaaactgttttccagtgtagctataccattttgcatt
-ctctccagcaCTTAGTATTGTCAGGTTTTTAAAAATTTAGATATTTTAggccaggcgctg
-tggcttatgcctgtaatcccagcactttgggaggcagaggtgggcggatcacttgaggtc
-aggagttcgagacgagcttgaccaacagggagaaccagatacttgggaggttgaggcagg
-agaattgcttgaacctgggaggcagaggttgcagtgagctgagatcacaccattgcactc
-cagccctccagcctgggcatcaagagtgaaactctgtctcaaaaaaaaaaaaaaaTTAGA
-TATTTtaataggtatgtaacaatcatagggttattgtgagaatgaaatgaacatatctga
-gaatactgcctagcacatggCTCCTGGCTTGGAAGGGTAAGCTCCTCTTATTGCAATCAC
-TATGGGGTTATGTCCTGTCCAGGACAAAACCAGAGGTGAAAACTCAAAAAAAAACTCAGG
-TGGGCCAGGAGGAGGCTGTGGGGACCAGTGAGCTCATGTCCCATCttgaaggtcaaggtc
-ccgggaagcagctcctgagatggaaatctgcatgtgggtggttttccaggtagtgctctt
-aggatcttggaggagccagggaagcaggctcgggcagttgcaatagaggccttgaccagt
-cccatcaggagctgggccagcccttaggacatgtcacagcctgagacagggaggtcatgc
-ctctgtactctgcaagatcagactttggagtggttgcccacaggagagatgttattaata
-tcttgggtgaagcagcccttttaagctgGTGCCTTGATCCGGGTGATGGCTTTGAGGTgg
-aaaacaagcctgagtggtttcagctttcaacttttcaagagaagctatgtatctagattt
-tgatgttaactctccaaacttttttaaaatgctggaaattctagacttttcaaacctgct
-gtgaggggctcacatgccaggcacaagggctggagggggcctgaggctgcctgtCGATGC
-CCCTTGATATAAAACCAggctgggtgcagtgccttatgcctgtaatcccagcacttcggg
-aggccgaggtgggtggatcacttgaggtcaggagttcgagaccagcatggccaaagtggt
-aaaaccccgtctctactaaaaaatacaaaataataataataataataataataataataa
-taattagctgggtgtggtggctcacccctgtaatcccagctactcgggaggctgaagcag
-gagaattgcttgaacccgggaggcggaggttgcagtgagccgagatcgcgccattgcact
-ccagcctgggcaacaagagcaaaactctgtctcaaaaacaaaacaaaacaaaaacaaaaa
-caaaaaAGGAAAACCAAACAAAAAAACCCCCAAAACCTGCTGTGTCATCTGACATCACGC
-TAGTgtctggttgccgcactggagaggacaccccatggggcaggaatctttgggttttga
-tctccaccacatccccagcatgtagggcagggtccagGCCTGGATGCAGCACGAGAGAAG
-GAACGCAGGGCCCGAATGAGTAATTTGCCTCAGTGTGCAGGTCATTTAATTGCAAAGAGA
-GGAAAAACGACAACCAAaaacaaccaaatgaaaaaatgagcaaaggatttgaatagacat
-ttctccaaagatgtacaagtggccaataaacagaggaaaagatgctcagcgtcagtaatc
-attagggagatgcaaatcagaattgcaagcacgagataccgcttcacacctattaggatg
-cctattaaaaaacaaaaacaaaaaACAAAACAAAACAAAAAAATCAggcagagtgctgtg
-actcacacctgtaatcccagcactttgagaggctgaggtgggcggatcacctgaggcagg
-gagttcgagactagcctgaccaacatggagaaatcccgtctctactaaaagtacaaaatt
-agccgggcgtggtggcgcctgcctgtaatcccagctactcgggaggctgaggcaggagaa
-tcgcttgaacccaggaggtggaggttgcagtgagccgagaccacgccattgcactccagc
-ctgagcaacaagagcgaaactccgtctcaaaaaaaaaaaaaaaaaaaaaaaaaTCGCAGA
-Tctgactgtgtgaccttgggcaagttgcttgacctctcagtgcctccatttcctcctctg
-taacgtgagagtaaaaatactactcatacctacctcgtagggctgtcatgaggactgaat
-aagtgcataggtacagacatgcttaggacagtatcagcacatgcaggaattacatgggag
-ttggctgttaATATTATTACAGGAGTggatcaaatccatctctgccatggacttgctgtg
-tgacctagtgcaggtcactttgcctctcttggtccagttttctcacttgtaaaatgggac
-catactgccactctccatagggcaagtgtgcggattcgaggagctcatatgtgaaaggcC
-TCCTTCAGGCGCAAGGTTGGTCCTTGGTTATGCACGTATGTGAGCCTCTTGGCGTGCCTT
-CATATGTGGGGCATAGGCAAGCACTCAAGTGGCCTGGACTCCTATCTCGGCTCTCAATGT
-CCCCGCTTCCTGGCCTGGGATCAGCAGGACCTCAGTGGATCCACCATCCAGGCACATCCC
-TTTCTTTCCCTGCTTTTTTCCTGCTTCTTGGGCGGCACCACCACCTACTGGCCTAAAGCT
-ACATTGCAGCCAATGTGCACAGCGGGGCGGAGGGAAGGGAATATGGCCTTGGGCAGCTGC
-TGTGCGCAGAATATTTACCTCTGTACACGCTTAGGGTGCTGAGGCTTAGGGAGCTCACAC
-GGAGAGAGCCAGCTGTGAAGCTGGGGTTAGAATCCCTGTCTCCCTTTCACCTCACTCCAA
-ACACCCTCTTAGAATGGGAACTCAGTTCAGGTTCTGCCTTGGGCCCTAGACGATCCACCC
-CTCCCTTCTGAGCAGGGAGCCAGGAGCTGAAGTCCAGGGTCCTTGGAAGTATGTCAGGGT
-TGTCCCCCCAGGGTCCTGATTACAGAAGAAAGAACACTGGACTCAGAGTCCAGAGGTTGG
-GGGTCTAGCTTTGCCTTCCCTATCCCCAACTATCAGCAAAACAGCCTTTGGAAAATCCTC
-ACCCATTTATTCTAGCACTTGTCATTTCGAAATATATTTACTGTGGGAGAGCATTTAATG
-TGAGTGTTAGGTTCTAACGCAAGGAGAAAATTATAAAAATAAACAAAAACTTTTAAAGAA
-CTCCTAAAAATCCTTTAAGTCACTCATAAAGTATAATATGGGCAGTTTTCTAAATATAGT
-CCTTTGCAGCAATAAATGCACGGACCATAAAGAACAGCAGTATATGGTGGTGATTGCATG
-CATTTGCGAACTGTAATTTTAGGTTCTGTTCTCTCTCAGGGGTGTGTGGGATTCCGAGCT
-GTGGATCCACACCCCCACATCTCTCTCACAGCTGGGATCATGTCCAGGCAGAATCGCCCA
-CATTGTGTACATCATTCTCCCTTCTCTCTCTCTTTCTGAGCGCACATAGCTGCATTTCCG
-AAGTTACATAATaaaaacagctaacatttattgagctttcattatgtattaggcctgctc
-gcagccctttgctcacgcattaattcattaattcagataatcctcctaagaatgttatga
-ggtaggtatattattatctcttctctttacagatgaggaaactgaggcactgaatggtta
-agtaactagcccaaggtcaaatagTGTACCACCCAGCCCGAAGGCGTTCACCTTgttccc
-gggtaggatcgcagaactggttaagctaggttaccgatccgggtggtgtcagctgatccc
-tcagctgctgtagtgcaagatctgcaaaatatctcaagcactgatcttaggttttgcaat
-agtgacactgtccccaggaacaacttggggaggttcagacccttgctgtcagaggctgca
-cagcccctaaaccttgatttctaatcttgtagctaatttgttagtcttacaaaggcagac
-tggtccccgggcaagaagtggatcttttcaggaaagggctattgtcataatttcctcagt
-tacaatttttgcaaaggtggtttcaatagccagtgagtggtacagcctgaatttgaaggc
-aggaagtccgggacgagaacccacactcttgactggcatactTGCCACCTGAATGGAGGC
-TCCATAGAGCCACGCGTGCATGCTTGTGTACCTGTTGTCAGCCCGCAAGCTCCGTTAGGC
-AGGCTAGAACCTGATCCAGGTTAACTTTGCATCCTTAGTGCTGGTTCTTTCCATCCAGGG
-CCCCACTCAGGGTATATGCTCAGTGACTGTTGTACAAATGCATAAAGCTCAGTTTGCATA
-AAGCTCACTTCAGCTTCTGTATCTGTAAGACAAGAATCAGagccaggcacagtggttcat
-gcctataatcacagaactttgggaggctgaggcgggcggatcacgaggtcaggagttcca
-ggccagcctgtccaatatggtgaaaccccgtctgtagtaaaaatacaaaaattagccagg
-tgtggtggcacgcatctgtaatcccagatactcgggaggctgaggcagaagaatcacttg
-aacctgggaggcagagtttgcagtgagccgagatcatgccactgcactccagcctgggcg
-acagagcgagactccatctcaaaaaaaaaaaaaaaaaaagaaTCGAAATCAGCTCTTCAG
-ATTGCTGGAGGCTCCGACAAGCCCATTGGTGGGAAAATTCTCTTTAAAGACACTGATGTG
-ggctgggcacaatgactcatcctgtaatcccaacactttgggaggccaaggtggatggat
-cactagaggtcaggagtttgagaccagcctagccaacatggtgcaaccttgtctctacta
-aaaatacaaaaaattagccaggtgtggtgacatgaacccataatcccagctactcgggag
-gctgagatgggagaatcgcttgaacccaggaggcggaggttgcagtgagccaagattgca
-catctgcactccagcctgggcgacagagcaagactccatctgaaaacaaacaaacaaaca
-aaaCACtgatatagtttggatttgtttcccctcccaaatctcaggtggggttgtaatccc
-cagtgttggaaaaggggcctggtgggaggtgattggatcttgggggcaaacatccccctt
-gctgttcttgtgatagtgaatggattcttacgagatctgcttgtttaaaagtgtgtggca
-cctcctcctaccccgctccagccatgtagaacgtgcctgcctccccttcgccttctgcca
-tgattgtaagtttcctgaggcctccccagtcatgcttcctgtacagcctgcagaaccgtg
-agccaattaaacttctttttttaaatgaattacccagtctcagttcattataccaatgtg
-agaacaaacgaatacaGACACTAAATTCTCCTTTGCCCACCTCCTGCTTGGTCCCTTCTT
-GAATTTTCAAGCTGCTCAACCAAGTggcctgcaccagcttgggagagctaatcgtgtgta
-tctgtacccaactctacattcagtaacatcatgtttgtagctcgaaatcagcaatggtga
-gtatttacactatggcaattggcaaatgcttcaaacaggagttttcccctctagagatgt
-taaacgtttgccagGAGGAAATCAATCCTCTAATGGCCACCTTcaaggaggcaacacagt
-ggagtgatcatgcttgttggctctggagccagaacacctgggttcaaagtccagctctat
-cacttaccagctgtgtgaccttgttcagttacttaacctctctgagcctcattagtctca
-ttcatgaTTACGTATTTCATTGGGGACTCAATGCCATCTTCCATATAAGTGCTCTCTCAA
-TTAATGTTATATATTAATATTATCAATCAGCTTAAGAGGTGGGGAAACTTTCTTGTTTTC
-CATCCTAGGAAAGGGAGTGCTGAGGACAGGACTTGCAGTGTCAAAAAGGAACCTCAAAAA
-CGGCAATGTGTAACTGCAGGTCTGGGCCATTTTTGAGGGTCTCTTGAGCATTGGCAGACC
-AGATCTTTATGCCAACACAGGTTGTGCGTGTGGGGGTTAGAGGAGGAGAGGCCTTCTCAG
-TTCTTTGCAGGAAAGGCTACTGTTAGCTCTAGAGCCCAGAACAGATTTAGGGGGAGAGAT
-GATCTAACCAAACTTTCCCTCTGCCCTCGGCTTGCCAGTCTTCTCGCTAGTGAACACTCC
-CAGTGTGAGGTAGAGGGTTCCCTGTTCCACCTCCTTCCTCCCTCTGTAGAGGAGGTATGC
-ATTGGGGCAGGTGTGTGTAAGGCCCTCCTGGGGTACCCCTCCAGGGAATCTTCCCATCTT
-CTCCAGTACTGCCCCATCTGACATCCTGCCTGAAGCCACAGGTTTCCCTTGCAATCACTA
-AAGAAGCAGGAGGGAACCAGCAGAACTCCCTGCCCATGTGCACAGGAGGTGATCCAGAAA
-CTTCAAGGGGAAAAATCCTGCTCTCCACCCCAGCAGGCATTGATTTTTGGCTGCGAAGAT
-TACAGtctctctctctctctctctctctctctctctctctctctctctcacacacacaca
-cacacacacacacacacacTCCTGTGTGCCAGGAGGTTCCTAGAAGGTCCTCACTCCTCG
-CACTCAGGTGCTCCAGGGCTAGCCCACTCCTGGGAGGTGCCCACAACTGACCACGATGCC
-CACAAGACTGTGGGAAGGGTTGCCCCATGTGCCTTCGTGCCCCTCCCACTGGATCCCAAC
-gaaggctcttttcacaacaggaatcagagcatgtcactcccaacctgcctaaaccctcca
-atggctcccaccacttttgatcaagacctaaatcctttctgagtccaccccatccttaca
-gggtctaaccttgcttccatccctgtcttcaccccttattcctccctctgggctcctctt
-caggcccttgaggtgccaagctcactcctgccctgggcctttgctgctgctgtccccttg
-gcctggagcactcttcccTGTCCTTTTTGCCCATGTGAGGCTGAGAGGCAGACGGAATCA
-TGGTTGCTAGTGTAGAgaggccacactactggagtttgtatttcagttctgtcaccttga
-actgggtgacctcacccatctctgcctccctttcctccctctatacagtgggaaagataa
-tagcacctacatcttagggtgttgtgagactgattgagataatCTGTATGGTTTTtggca
-gtttctgaaatgcactgtaaactgtctggttctcctcccatcggaaggtgagaatctgac
-tgctccccttgactctgggtgagagggtagggcaacagcaatgctccatgatttcagagg
-ctgggtcataaaaacggtctgcaggggattcacttccagaacagtggagtgaggaacact
-gcagactgctttctggtgaaaacaactgatgatgatttctaaaaaacaatcatttgaagt
-ctctggaaattgtcctaagagcatacagcaagtgaagaaacacttattcaagaaaatcta
-ctaaatctaggtaagaacagtgagtttgtagaacttgagacacaatccactctctttctc
-ccctccattccattttactgttatggaaactcaactgtgagcagccagggccaagaagat
-gggagtcatttccccccaagctcctagtcgatggggtacagcatctccccaggaagggaa
-ggctgccagcatttgtcatcctcccaacagctatatcttacagaggctaaactccaggta
-ggtgtggctgggagactgggatcttccttcctctacccagtccccactcatagggtggtg
-gccacgccaagtgcagcaggctaaaaatattgaagccccagttgcttttgtcttagctta
-cttgttaaagcagaggttccatgcctggagatgcaagctgagaagaccagagactaagaa
-tactgccccaactcagccctgctcataaagcaagaaggttactctgggagaagtgaactg
-ttgtccctgcctccagctccagagcagtgtcacagatgctttgcccaagagagaggcagg
-tcataacaacacagatctttaaagttgtccataaaggaactgactttctttagaacagag
-tatgcagaaatttaagcctaagagtgccctcagaagcagtggcgattttggtagtgatca
-gggacccaaagttgctatactatatcatcttaaatgttcattttccagcaaagaatttca
-agacttgcaaagaaataaacacatgtgacccatacacagggaaagaccagtcaacagaaa
-ctacctgtgagagtgctcagaggtcagacttgcacggacttcaaagcaaccactgtaaat
-atgttcaaagaaataatggaagccatgcttaaagaataagggaaggtaggctgggtgcag
-tggctcatgcctgtaatccccgcactttgggaggccaagaggggtggatcacctgaggtc
-aggaatttgagaccagcctggccaacatggtgaaaccccatctctactaaaaatacaaaa
-attagctgggcatggtggcaggtgcctgtagtcccagctactcgggaggctgaggcatga
-gaatcacttgaacccaggaggcggaggttgcagtgagctgagattgtgccactgcccttc
-agcctgggtgacagagagagactccatctcaaaaagaaaaacaaaaacgaaaatcaagaa
-taagggaagcggtgatgactgtgtctcatgaacagagaatgtaaacaagaagatactatt
-ttaaaaaacttaatggaaattctggagttgaaaagtgcaaaagaaaaattcactagaggg
-gctcaacagtagacttgagccagcagaaggaagattcagtgaatctgaagacagatcaat
-agagatttcgcagtctgaagaacagagagaaaaatatgaagaaaaatgaacaaagccttg
-gagaaatgtgggacacagctaggtgcaccaacatatgcacaataacatatataacagaag
-gagagcaaagagagaaaggaacagaaaaaaatgtgcaaaaataatcactgaagcctttgc
-aaatttgatgagaaacatgaattatgcattgaagaagcttaatgaactccgagtagaaca
-aatgcaaagtggtcaacaaccagatacataaaaggaaaatgttgaaacccaaagataaaa
-agaaaatcttgaaagcaacaagagaaacacagctcatcacatataagggaacaccaaata
-agaccgacagcagatttctcatgtgaaacgatggaggccctaaggcagtgggacaacata
-ttcaaaatgcataaacaaaaactaccaagcaagaatcttacatccagcaaaattatcttt
-caaaagtgatgatgaaagagatatttccagataaacataaactgagaatttgttgccagg
-aaacttaccttacaataaatactaaaggaagttcttcagacagtaatttgaatccacaca
-cacaaaagccaaagtgctctgggaaaggcaagtagatcgttatgaaaggcagtaagaatg
-catatttattcaccttctcttaacagatttttaaaaataatttgtatataattgtattgt
-ggggccaagacatatagaaatgtaatatattttgataataatagcacacaggaggtgagt
-gggagcagagctgtattggattaagaaagtgagaccagatgggaactggaatccacagga
-acaaatgaagagaaccagaaattataagtaagaaagttaataaaacaaagtcttttaata
-tatacttgctctcctttcttctctcagcttcttcaaaagacataaaactatataaagtaa
-taattataacaaagtactgttggttttgtaacatatgtagatgtaatacatataaaaaga
-atagtgcaaagaggaagaagagagaatagtgctatataggagtcaccgggcacggtggct
-cacaactttaatcccagcactttgggaggccgaggcaggccagtcacttggggccaggag
-ttcaagaccagcctggccatgtatctctacatataatagattgaaaccatgtatctctac
-gtataatacaaaaattagccaggtgtggtgtcatgtgctggtaatcctagctactgggga
-ggctgaggagaattgcttaaacccaggaggtggaggttgcagtgaaccaagatcacgcca
-ccacactccagcctgggcaatagcacaaaaatctgccaaaaaaaaaaagatagaaatata
-taggagtaatatttctatatatcactggaattaagttactgtaaatctgaagtcaattct
-gataagttaaaacctatatagtaagcctaaactggtcattaagacaaacaaacagaacag
-tgaaaaagctattaaagaaatttaaggctgggcacggtggctcacacctgtaatctcaac
-actttgggaggctgaggtaggtggatcacctgaggtcaggagttcgagaccagcctggcc
-aacatggtgaaaccccctccctactgaaaatacaaaaaattaggtgggtgtggtggcagg
-cacctataatcccagctacttgggaggctgaggcaggagaattgtttgaacctgggaggt
-ggaggttgtagtgagccgagatcatgccattgcactccagcctgggtgacagaatgagat
-tctgtctcaaaaacaaaaacaaaaacaaaacaaacaaaaaatccaaaaaacagaaattta
-aataatacactagaaaatattcgtttagtgtaaaagatgtcaaggaagaaaagaggaaca
-aaaaagacatgagacatatagaaaataaaaagtcaaatgacagacataaatccaacttct
-ctcaatgatagcattaaatgtgattggatcaagtcaaaagggagagatttcctgactaaa
-taaaaagccaagatcaactatatactgtgtgcagaagatacactcaagattcaaaggtta
-aaagtaggttgggcgttaaaggctgaacaaaatatatcacgcaaacagcaaccataagaa
-aacttgatttgctatattaatatcaggaaaaagactttaaaatgaaatatgttacaaaag
-ataaagaggaacattttataatggtaaaaggatcaatcgatccattgggaagacataaaa
-attatagacagatatgcccctaacaacaaagccccaacatgtgtgaagcaaaaacagaaa
-gaattgaaggggcaaatagacaattcaaaaataatatttggagacttcaaaaccccactt
-ttaataatgaatagaacaactaaacagaagactaaagaaggcaatagaggctgggcgtgg
-tggctcatgcctgtaatcccagcactttgggaggcccaggcgggcagatcacctgaggtc
-aggagttcgagaccagcctgaccaacatggagaaaccccgtctctactgaaaatacaaaa
-ttagccaggtgtggtggcgcatgcctgtaatcccagctactcaggaggctgaggcaggag
-aatcacttgaacctgggaggcagaggtttccgtgagcccagatcacaccactgcagtcca
-gcctgggcaacaagtgcaaaactccgtctcaaaaaaaaaaaaaaaaaaaagaaaaaaaaa
-agaaggcaatagaagacttgaacaacactaaaccaacaagacctaaaagacatctataga
-acatttcacacaacaacaagataatacacattcttctcaagagtacgtgaaaaattattt
-aggacagactatatgttagaccacaaaacaaacatcaatgatttttttatcttttatttt
-tttttttaatatggagtcttgctctgttgcccaggctgaagtgcagtggcatgatctcag
-ctcactgcaacttcagcctcccgggttcaagcaattctcgtgcctcagcttccagagtag
-ctgggattacaggcacccaccactatacccagctaatttttatatttttgtagagacagg
-gtttcaccatgttcgctaggctggtcttgaactcctgacctcaagttatctgcctaagtc
-ggcctcccagagtgctgggattacaggtgtgagcaaccgtacctggacaataaattttaa
-aagattgaaatcatacaaagtaccttctctgactaaaatggaatgaagctagaaatcaat
-agaagaaaaccaagataattcacgaatatgtgaaaattaaaaacacactcaaacaactaa
-tgtgtcaaaatagaaatcacaagggaaattggaaaacaccatgagggaatgagaataaaa
-atataacataccaaaacttacgtgattcagtgaaagcagaaaaatttatagctgtaaaga
-cctgcactaaaaagggagaaaggggccaggcgtggtagctcactcctgtaatcccagcat
-tttgcgaggctgaggcaggcggatcacttgaggtcaggagtttgagaccagcctggccaa
-catggtgaaaccccatctctactaaaatataaaaattagctgggtatggtggcacatgcc
-tgtaatcccagctacttaggaggctgaggcgggagaatcgcttgaacgcaggaggcagag
-gttgcagtgagccgagagcgtgccactgcactctaacctgggtgacagagtaacactccg
-tctcaaaaaaataaaaaataaataaaaaaatttttttaaaaaggagaaaagtctcaaaac
-aaccacctaactctacaccttaaagaactaCAGAaagaatacaaaaattagccgggcatg
-gtgatgggcacctgtaatcccagctactctggaggctgaggcagagaatggcatgaacct
-gggaggcagagcttgcagtgagctgagatcgtgccactgcattccagcctgggcaacaga
-gcgagactccgtctcaaaaaaataaataaataaataaaaaataaaaagaactagagaaag
-aagcacagactaaacccaaagctagcagaagaaagaaaataattaagattggagtggaag
-taaacaaaatagagtatagaaaaacagtggtaaaaaaatcactgaagctgggcatggtgc
-cacatgcctataatcccagcactttggaaggcagaggcaggtggatcacttgaggccagc
-agttcaagaccagcttggctaacatggtgaaaccccatctctactaaaaacacaaaaatt
-agctgagcctggtggtggacacctgtaatcccagctatgcgggaggctgaggcaggagaa
-tcacttgaacctgggaggcagaagttgcagtgaactgagatcatgccactgcactgcagc
-ctgggcaacagagcaagaccctgtctcaaaaaaataaaaaataaaaaaataataaatcaa
-agaaacaaaaaattgatcaatcaaattgacaaacctttagctaaactggctaagaaaaga
-agattcaaattactaaaatcagaaatggaagttcggacagtactactgaacttacagaaa
-taaaaataattataagaaaatactatgaacaattgtgtaccagcaaattggagaacctag
-atgaaacggacaaattctggccaggcgtggtggctcacgcctgtattcccagcactttgg
-gaggcaaaggcaggcagatcacaaggtcaggagattgagaccatcctggctaacatggtg
-aaaccccgtctgtactaaaaatacaaaaaattagcctggcatggatggcacgtgcctgta
-gtcccagctactcaggaggctgagacaggagaattgcttgaacctgagagatggaggttg
-cagtgagccgagattgtgccactggactccagcctgggtgacagagcaagattctgtcaa
-aaaaaaaaaaaaagaaagaaaggaaagaaagaaagggacaagggacagattcctagatac
-acatgatataccaaaactgagtcatgaagaatggaaatctttatagacctgtaatgaagc
-agtgatcaaaagccatccaaaaaagaaaaacctttgacaagtccctggtgaattctacca
-gacatttaaagaagaactaacatcaatctttctcaaactcttccaaaaaatttaagagga
-gggTCGGGGGGCTGGGAGATCCAACATGACctcatccacatgactggcaattggtgctga
-ttgtcagcaggaatgtctgtgttctcctccttgcggtcactcttgctctgttaggtcaga
-catcatcccttacatagaggcccaagggtccaacggtccaagtccaagactgaagctgca
-aggtctcttgaggcagaggctctgaaaaccacatgatgtcacttctgtcacacgctattg
-gtcaaagcaagtcacatgcctcactcagcttcaagtcagtggagaaacagactccacctt
-ggatgggaagaatagcagagtcacattgcaaaggggtgtggataagggttgggaggaatg
-tgtagccattaatttacaCCAGATAATGTGAGTGTTTGCACTTTACAAGGTCCACAGGTC
-CACtgatacagtttggctctgtgtccctacccacatctcaccttgaattgtaataatacc
-cacgtgtcatgggagggaccccatgggaggtaattgaattatggggcgggtttttcttgt
-gctgttctcgtgataatgaagacatctcaagagatctgatgtttttatcggggggagttc
-ccttgcctgccaccatggaagatgtcccttgactcttccttcatcttcagccatgattgt
-gaggcctctccagccatgtggaacagtgagtccactaaacttgtttcctttataaattac
-ccagtctcaggtatgtctttattttattttattttattttattttattttattttatttt
-attttatttttgagacagagtcttgctctgtcacccaggctgaagtgcaagggcaccatc
-tcggctcactgcaacctccgcctcccacgttcaagagattcccctgcctcagcctcctga
-gtagctgggactacagtgcacgcctccacacccggctaatttttgtattttagtagagac
-agggtttcactatgttggccaggctagtgtcgaacttctgatctcatgatccacctgcct
-cggcctcccaaagtgctgggattacaggcatgagccaccatgcccggcctcaggtatgtc
-tttattagagcgagagaatagactaatacaTCCACCAACCCTAGGAAGTCAGTGGAAGGG
-TATTTCCGTATTTCATATGGAAGTCATTTCCATATGAAAATTTAGCCAGAGGATTTCATG
-CTGGTTGTCTGAAAGCCAGGAGCTTCTAAAAAACTTTCAGGGTAGCTGTCTAAGCATGac
-ctcatgtcatcctgttgtgagtactaaattagttaattcaggggaggcactcagaaaagt
-gAAGAAAGGGAAATCTTTCTTATATAAATCTTAGAAATCTCATAGAAATCTTAGGAAAgt
-gcctggcgtgcagtaaacacgtgatacatttcagttgttattatcttcacaataattttt
-ttgggtcaggcttgttattttccctgttttacagattaaggggcagagactcagagatgc
-gcagtaagtcgcctgagggttacgcagcaaataagcagggaagccagatgagaacctaCA
-TGACAGAGTCACCCATGTGTGAGACTCCAAAGCCTCATTCAGGTGCACAGAGAGGCGGTT
-GTGAGGACGttcactgctgcgttgccttcagtagcttaacatcagaaacagcgcagatgt
-ccaccaacaggggccacccagtaaaccccagcatgcccagccaaggagtgctttgtgctg
-gttacaagaaatgaggtcacgctatacataggacatgggatcatctccaagacattctgt
-tcagtaaaaagaacaTCTGAAAAAAAAGTTCCATAACCCACAGAAAATACTGCCAAATAT
-TCCAAAAAATCTAAGTCCAAGTGTGTGTGTATGTGACCTCTGGAGGCTGATCTGAAGCAA
-ATGTAGGTGAATTAAACAATAGGATCTATTTATAGGACTCTTCTTTTCCTACTTTTCTTT
-ATTTTTGTTGGATTTTGAAACATGTTCAAAGAAAAATTCAGAGTACAATAAAGTACCagt
-cgggcatggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggacca
-cctgaggtcaggagttcgagatcagcctggccaatatggtgaaaccctgtctctgctaaa
-aatacaaaaattaggtgggtgtggtggcaggcacctgtaatcccagctactcgggaggct
-gaggcaggagaattgcttgaacccaggaggcaaaggttgcagtgagctgattgtgccact
-gcactccagcctgggcgacaagagtgagactgtgtctcaataaataaatgaaagaaagaa
-agaagaaagaaagaaagaaagaagaaagaaagaaaagaaagaaagaaagaaagaaagaaa
-gaaagaaagaaagaaagaaagaaaaagaaaaagaaccaagaagaaaaaataaTCACCGGA
-GATTCCtcccctcccctagagctaactaggctaacattttggtatatatctttccagtcc
-ggatcctgtgtgactgagtgtgtatatgcatatgtattattttCAACTGTtggctttctc
-cttgtggtccaagacagctgctccagatttagccattacatctgtttcctgccagcaaga
-aagggaaaatgggaagtagagggccttttaagtatacaacctagaatttacacacattat
-tctttatcacatctcatttctctaaatgtagtcgcatggccatcctggccagaaggaagc
-ctgggaaatgtggtctttcctctgggctgccttgtgcccagtgaaaagtcaggggttcta
-tgactatgaaagaaacaggagaatggatattgtggcaactagcagtGCTATTCACCTTTA
-TTCTCTCAATGGTAATATTTTTCCCCATCAAGAGGGGAAAATTTGTGTCTTACATTCTAA
-CCACTGAACTCCGAGAGAAGACACTGGCCTGTGCCAttctcttgcgatggagtttcgctc
-tgtcgcccaggctggagtgcagtggggtgatctcagctcactgcaacctccacctcctgg
-attcaagcaattctcaggcctcagcctcccgagtagctggaattacaggcacctgccagc
-acacccctttttagaccacatagggtagcttccgactgttgccatggcatttgtgaattg
-tcatgtgctggtgggagtgtctcttagcatgctaatatattataattagcatatatatta
-taatgagcagtgaggaggaccagaggttgctttcatcaccatcttggttttggcgggatc
-tggccagcttctttactgcatcctgtttgttttatcaataaggtctttgtgacatgtacc
-ttgtgAAACCAGTCCTGCCTAAGGGAGCGGGGCTGGCGGTTGTTCAGAGTGAACAATTCA
-AAGTCAGGTCCTCCCTCTTGGAGCTCAGAGACTTGAAGAGCAAGGACCACTGTCAGGACA
-CAACCCCATTTGCAAGGCCGGGGACACACATACAGACCCACAGGCCATTGTAGAGAAAGT
-GTTAAAAGATGGAAGTCAAGCCACGGCCACTGGAAGTGGTGTGCCCTGAGAGGCAGAGGG
-TTCTCCCTAAGCCAGGGAAGGACAAGGCAGGGCAAGACAGAAACTGGGCCTGGGGCCAGG
-ATTCCTGAGCTGGGGCTAGATTTGCCCAAATCTAGGGCAGGGCTGACTGGGTCAAGCACA
-GCAGGGAGCCAGGGTGGGTCGATCCCCCTGCCACAGGCTTCACTCTTCTGGCTCTGGTTT
-CCAGGCAGTTCTAAAAGCCTCCCAGTggcccagtgcagtggctaacgcctgtattcccaa
-cgctttgagaggccttaggcgagcagatcacttaaggccaggagttcgagaccagcctga
-ccaacatgtcaaaaccccgtctctactaaaaatacaaaaattagccaagcgtggtggcag
-tgcctgtaatcccagctacttgggaggctgaggcaggagaacccaggaggtggaggttgc
-agtgagctgagattgtgccactgcactccagcctgggtgatagagcaagactgcatctca
-aataaaataaaataaaaaaaTCAAATCAAATAAAATGTCTCCCAGAATACACCACCCCAG
-CAAAATGGCAGGAGGGAGTGTCACCTGGGGACCTCCACTTTGGAGGTTTGAGTGGGCAGC
-TTTAAGCTGGAACAGTCACTCTTGCTGTGGGTTCTCAGGGCGGAGACTGAGCCCCCACCC
-TGCCTCCTCAAATGCATTTCCTCTCAGCTCCCACCTGCCAGCCCAGGAGAGAGGGAGGGC
-CATTCTGTCCTTTTCCTGCAGAGTCCCTTTGTTCAGTTGGTGACCAACATCCTGAAAAAC
-ATTCTCAGGAGATCAAAAAGAAGAACATTTTGGTCTATGTGGTAGGTTGGCCCAGTGCAC
-CACGCCCAGTGCAGGTCCCTCTTGAAACCACCTTTGGGAAATTATGACTGAgacaccacc
-tttgcaaaattatgactgagacaatgagagatctttttttttttcctttgagacagagtt
-tcgctcttgttgcccaggctggagtgcaatggtgtgttctcggctcactgcaacctccac
-ctcctgggtttaagcgattctcctgcctcagcctcccgagtagctgggattacaggcacg
-cgccaccatgcctggctaatttttgtatttttagtagagacaggtttctccgtgttggtc
-aggctggcctcgaactcccaacctcacacctgaggttgcctcagcctcccaaagtgctgg
-gattacaggcgtgagccaccacgcctggcccacagtaagaggtcgaacttaacctactct
-atcttgcttctaacctccaagctgtccttgttcattcctgggcataagctgaactaacct
-tgggagaaacttagtttatactttaaacagccctttcccaaagcagacctccttcttgcc
-tggggactaagctgcctttgtaggactaacattagccacaaaattagaaattttggttta
-ggagtcatgcagctggaggctacaagatcctgaccctccctaaactactcctgacatcag
-ggcttgagatatttttcagaccctgcacttgatggatcagctggcatcacccacgtcaat
-aaactggctcatctgatcttgtggcccccacccaggaattgattcagctcaggaagacag
-cttggactccctgtgatttcaaccctgaccaatcagcactcctggtgcactggcttctcc
-ccacccaccaagttatccttaaaaactcttctccccaaatgctcggagagacagatttga
-gtcataaaactccagtctcccacgcagctggctctgtgtgaattactctttctctattgc
-atttctcctgtcttgatgaatcggctcttgatgaataggcagcctgcaaggtgaacccct
-tgggcggttccaCTCTTTGCCCAGGGTGATGTTATTTCTCTCCAGGATGGCTGCAGCGGC
-TTCTGAGCCTGCTTGCATCTGGTGTGGTCCCTTTCAATGTCACGCAGGCCAAAGCAGCCC
-TCCATCTCTCCATGATCTTGGCTTCCAAGGTACTCTGTCTCTCTCTCTGGGTCGCCATAC
-TGGCTTCCATCAGGCCCTGGAATGCATCCTGCTGGTTCTATCCCTTGGCCTTCAAAAGTG
-CGGTTTCCTCCTGGAAGGCACCTTCTGCCTTACCTCACACTTCCTTCCCTCCTACCTGCC
-TTGAGATACCAGCTTGCAGGGGCATTCTTGGGAAAGCCGACCCCTTGGACTGAGTCTGGA
-GTTTTGATCTCTCTCTCTCttttttttttttttggagatggagtttcactcttgataccc
-aagctggaattcaatggcgtggtctcggcttaccacaacctctgcctcccaggttcaagt
-gattctcctgcctcagcctcccaagtagctgggattacaggcatgtaccaccatgcctgg
-ctaattttgtatttttagtaaagatggagtttctccatgttgatcaggctggtctcgaac
-tcccaacctcaggtgatctacctgccttggcctcccaaagtgctgggattacaggcatga
-gccaccgtgcctggccttttttttttttttttttttgagatggcatctcactttgtcacc
-caggctggagtgcagtggcaccatcatggctcactgcagcattgaactcctgggctccag
-caatcctcccacctcagcctcttgagtagctgggatcacaggcatgtgccaccatgccta
-gctaatttttgtatttttttttgtagagacagggtctcattatgttgcccaggctggtct
-caaactcctgggctcaagcaatcctcctgcctcaacctcccaaaatactgggattacacg
-tgtaaaccaccacatccagccCTGATCTCATTCTTCAGAGAATTTACCTAGCTGGTCACT
-TGGTGTCTGTAGGAGCATCGCCTCTCAGGCCTGCCTCAAAACTGCATTTCAGTTGGGAGT
-GGGGCGGGGGGAGGGAGAGTGTAGTTTGGGGACATCAAGCGTCTGTGGTGGATCTCCTCC
-CAAAGTGAGACTGCTTTTTAATGatatttattgagcacttactgtttgccactgcggtgc
-taagcactttgcacatactagctcagtgcatccttacagcaatcctgggagggaggtgct
-tttctcatccgcatgtgctgacaaggctgagAAGAGCTGGGTCTTGCACGGTACCTTAAG
-GGCTAAAGACCTGCAAGGATGGTGCATGAAAGCAAAACCAGAGAGGCGCCTTTTCCAAAT
-GCCAATGCGCCCTCCACCCAGTCCTTCACAAACCACATCAGCATGGATAGCACCACACTC
-CACAGGCTTTTCTGCATCTCCTTTGTGTGTGTGCACATGTGTAATTAATTCTGGGGCAAC
-TTCCTACATCAGTACAGAGAAACTCCTTGATCATTATCCACTCCAACATCCTTCCTGGGA
-GGGACTGACTGGAAACCCAAATGCCCTtgtaagggcaaatacaaaaactaaaataattct
-ccctggtgcagaaaaaggaaagaaacctcccgtttcctgttcttaaacactctagagcaa
-acactttagaaaacttctcaattatttctctgttcctttaagatgtgtctttttaaaagc
-caggtgagcctcctgccagttttacaagccagggatgttttcccaaggacctaggagcca
-tctctttggaaggtaaacatcaagattgcacccttctcatccagtctccatgggcagata
-ggagcctaacttcagtgcttggctccaagttgcaaaacaatccatcgtctatcataaaga
-tgtgagtttatattttctctggataaagacaattagctaacacagatggccactccaatt
-accaggtgaattcgggatgaaataagttgcaaattgtgttgtgcagtcatctgactcgag
-aactatttttttttttttgagacagagtctcgctctgttgtccagtctggagtacagtgg
-tacgatctcagctcgctgcaacctctgcctctcaggttcaaacaattctcctgcctcagc
-ttcccgagctgggattacaggcgtgcactaccacacctggctaatttttgtatttttagt
-agagatggggttttgccatgttggccaagctggtctcgaacttctgactttaagtgatct
-gcccaccttggcctcccaaagagttgggattacaagcatgagccaccaccccggccctag
-ttattatttgaggacatgtatgcaataggttatacctgcttggttatataggaggacgaa
-atgtatttctctttgtaatctcttttgtggattgcctgtgatgcccactgcagtctggtt
-taacgcttatttaataataaaactgttttctcttctacttttgtggaaaggttttctgga
-ttagATCTTTAATTTTGTCTCCAGCATCTTCaaatgtctttctacagagggttggttaaa
-taaatgtggcatctccacaaaagagaatactgcacagtcatggcaaaaaaacaaggagcc
-tgttttcgttgttgaatgaaaagtgcaaggtgcacaacagtttactactttttctgtaaa
-aaaagaggTCTGAGAAGGCTGTATTTGCCATTTGTATAATCTCTGGAAGGGTAAACAGCG
-ACTGATAAAAGTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTAAGAGAAAC
-TGGGCAGATGAGGGAGAGGAAAGGGATGAAAACCTTTCTCTGTACACCTTATATTTTCTG
-ATTTTTTGAAACACGTGACTGTATTACCTATTCACAGTAAGTTAACAGGGATGGGAAGCA
-TGGTGGTGGCAAGCAAACGAAACCTCTAAAAAGAAGTCCCAGGggccgggcgcagtggct
-aactcttatgatcttagcgctttgagaggccaaggtgggcagattgcctgaactcaggag
-ttcgagaccagcctgggcaacatggtgagacctcgtctctactgaaaatacaaaaaatat
-gccaggtgtggtagtgcgcacctgtagtcccagctactccggagactgagaggcaggaga
-gtcacttaaacctgggaggcagaggttgcagtgagccgggatcacaccactgcactccag
-cctgagcaacaggcaggactctgcttccaaaaaaaaaaaattagccaggtgtggtggtgg
-gcacctgtaatcctagctactcaggaggctgaggcaggagaatcacttgaacctgggagg
-cagaggttgcagtgacctgagattgcgccacggcactccagcctgggtgacagagcaaga
-ctccatctcaaaacaaaaaaaGCCCCAGAACCAGACATCCTTAAGCACTTGATTCTGTTC
-ATTTCTGAGCTCAGCCTTGAGCTTAGAACCAAGTGAAAACTAATTACACATTTTCGGAGT
-TCACATTAAACttcttctttttaaaattattatttttgagacagaatcttgctctgtcac
-ccaggctggagggcagtggcacgatctcagctcactgcagcctccacctctggggttcaa
-gcaattctcagtctcctgagtagctgggactacaagcatgtgccaccatgaccagcaatt
-ttttgtatttttagtagagatgggtttttgccatgttggccaggctgatctcaaactcct
-ggcctcaagtgatctgcccgccttggcctcccaaagtgctgggattacaggtgtgagcca
-ctgtgccATGCCTGAACTTCTCCTTTGAAGGAAGATCTGAGTGTAAAAGCAGGGAATGCC
-TTTATTTAAAAAAATGAAAAACAGAAACTAAAACAAAATAACAATCACCTCTGTTGCCTC
-CATTTGAGAGAATACTTCCAGGGGCTCTGCATGTCTGGTCCCCAACCTGGTCGGGGAGTT
-CACTTTCAGAGGCTCAGGGATGGGCCTTCCCCAGCCCCACCAGCAAATCATCTCTCCCGG
-CTTCCAGGAGGGTACTTACTCTCCAACTAGTGGGCTTTATGGGCCAGGAAGGATGACAGG
-AAGGGGTGTGTGGGGTACTACGTCCCTCCACACTGAGAATCCGAAAGCCAAGATGCCCAA
-GATTCTATCGTTATCTGCTTGTCTTGTAGAAGCCCCTCTGTGAGACTGAGGGGCAAAGGA
-GAGAGGGCAGGGGCGTGTCTCAACCCTTCTGGCCACTTCTAGGTTGTGCAGACTGCCACT
-CTTGTTACTACGATGGACTGTCAGATCAGCAGGTGGCCCAGGAGGGCTTGCTTGATGCGG
-GCTGCTTTTTCCTTTTGCCTCCGTGCCATGcctgtgaggtagttggtacttactggaatc
-cccactgcatgcatgaagaaacaggcacagagaagccaaatgactttcccaaggtcacac
-agcctgaagggacagccggctgtcccagctgtttcccttctaacacccttgggcctgcct
-ccagctagatgctgcAAATCAGTCCTCTCTTGAGAGTCAAAGCAAAGGAGATCTGAGCTG
-GTCGTCACAGGTAGTGTGACACAGAGTTGGGGATAGAGCCGCACCTTGCATTTCCAGGTG
-CCATCTTCCCCACAGTCCCCAGTGGGCACTTGCGTTCATGATTCAATTACTCAGGCTCTG
-TCTCTCTGTTCCTGCCCCTTGCTCTGTGACCTGGCCTCTCTGGACCCCAGTTCCGTCCGT
-GAGCGATGGGGGCGGGGTCGGCGGCCTGCCTAGGCTGGACAGTGCAGATTGCAGAAGTCC
-GCGGACGAGAAGAGCCGCAGCACGTTGACCAGAGGGAACATGAGCAGCGCTCCGAGCAGC
-GAGCCCAGCTGCACCGCCGCCCCGCACCACAAGAGGGCGCTGCGGCTGAGGTCGCGCAGG
-ACCACGCCCAGCATCACCTTGACGTAACTGAGGCAGCCGCTGAAAAGCACCCACGAGGCC
-ACCTGCGGGGCCGGGAGGGAAGAGGTGCAGAGTCACGGGGCTTGCGGGGCGAGCGCCGGA
-GCAAAGAACTCTCACAGGGCTCAGGGGAACCCACGGAATACTCTCTAGGTGCGAGGAGCG
-CCTTCTGGGAGTGAGCCTGCGGGGCCGACGGGTCCCATGAGTTGGCCGCCCGGGGGCGAA
-GGAGAATCCAGTGGCTTTTCTGGGTTCACGTGCCCATGATCAGGGCAAGGGCCCTTGAGA
-GAAGGCCCCTGCTGAGGTACACATGGTGGGAAGAGGCCTACCAGTCACCTCGATTCCCTA
-AGCCTCCACTCCCAAATGAGGAAGGGGCGCTTCCCCCACCTGGGGCTTCCCGGGAGGGTC
-CCACAGACCCCGCTCGCTGGAAAGGGCCGCGCCCAAGCTCTCCCAGGCCTTGGCTAGGGG
-TGAGGGGTACGCAGCGGGAGCAGCCCCACCGGCCGGATACTCACAATGAGGACTTCCCCA
-CCCCAGTGGCCCTGCAAGAGGGGGCAGGGGCTCATCACCGCCATGGCCATGTTGTAGCCC
-CCAAAGCAGGTCCCAAGCACGGAGAGGACCCCCAGGAACAGCAGAGACCTAGAGGAAAGT
-AGGGGAGGTGAGTGGAGGTGAGAAGCCTGACCTCTGACCCCCCCGCCCCACTGGGCGGCA
-TGTGGATGGCCAGTGTCTCCATAGTTAGTTTAGACCCATGTGGAAAATTCCAGGTTGCCT
-GGCTCAAGTGGGTCAGGGAGGCTCCTGAGCAGGCAGGGCTGGCCTGAGTCATCCCCAGCA
-TTAACGGCAGGGCCTGGCACCCCGgcaagaaaaacataatggactctggcaccggatggt
-cctggttcaaatcccagttctactgtttaagctgAGACTCGCCTCTGAGCCTCCAAATCG
-GAGTTTTGCAAGGCTGCATGACCTCCAGGAGCAGAGCATGCAGGCCTGGCGCCGCTGTGG
-GCCCACCTGGTGTTTACCTGCTGGCATTTCCTCCTGCAACACACCCTCAGCCTCAGCCAG
-GAAGCTGAGTTGAAGTGAAGATGGCTGGATCGGGCATTGGCACAGTAGGGTTTGCTGTGC
-CTCCTCAGGAGACCCCTCCCCTTCTGGCCTCAGCTACCTGCCTCTGCAATGTGGAGTGTG
-CTGATCTCCAGGGGTCCTGGCAGCTGGCTTGTTGCTGCTAGGAGCATCTCTCTACAGGTG
-GCCTTCCATGCAAACCTACATCTGGGACCACTGTCCTTCCTCACAGGTCCTTGTCCCTGG
-GGTCCCAATCTCTAGAACCCCAAGACTGGTCCACGCCCTGGGTAAGAACAGACAGAGGTC
-TGCCTATACCCTTAAAGACTCTTTCTGCTCCAAGATTCTTGGATTCCATGACTCAGATTC
-TGTAATTCTAACATTTGGGGTTTCTTGGATTTGCAGGTCTGAGCCTTTGGTCCTGCTTCC
-CTCAAATCCTCCATCCTCTTTCCAGTTTCTAGGTCCCAAGGTAGAAAATCCAGCTTCCTG
-GCAAGCTTTCTGTCAAGCTCTTCTGTCCTCACTGTCCTTCTTCTGGGCTGGGAGAGTGGG
-TGTAAGCAGGCCAGTGAGGACAGGCAGGCCAGCGTGGATACGAGGCTGTAGGACCCACCT
-CAAATGTCAAGATCCCAAGGTGGTAGTTCTCCTACAGGGGTCTGAAGCCCCTGCCTCAGA
-ACCGTCTGGTTTCCTTACTAAAAATTGAAATCCCAGGTCCCAGTCTAGGCTGGTTCAATC
-TGCATTTTATCAACTTGCCCAGCCATTCTTCTAGAACTGTGGCTCTAAGGGAACCAGCAG
-GAGGTTAGAGGCAGGAAGGCAGGGCCGAAATCCTGGGAATTAGACCAGGTCAAGCTCTTT
-CTCCAAGCCTCAGGGTTTCCCCTTATAAACGGGAACCTCAGTGGCTATCTGCTCCTCCTC
-ATGGACTGATGACaatgatggtcaacgcttaggctggacctgccacgtgccaggcaccgc
-tccaagagctttatagaatcagctcatatcatgcttccagcagtcctaggaggtggaatg
-ttacactcccattttccgataaatatccctgaggcacagagaactgaagtgacttgtctt
-acacacagctgacaggtggcagagctgggatttggaccagggtgctccccaaacatgttc
-ttaaccactaCATGTACAGCCCAGTAGGTGCGTTTGGAATTCTGGGTTCTGAAATGAAGT
-GTTCCCCCACTAGGATTCCCTAGGACCAGATGAGGGCACACCTGTTAGGCAGGAACATGG
-AGACCAACGAGGCAAGAGGGTTGGCCACAATGCTGAGGGTGGCAGCCAGGTGGTAGGCAA
-CTGGCCCATAGGACAGGCAGGAGTAGGTCTGCACAGAGGGCAGCATGCCGTTGGTGAGCG
-CGTTGACGAAGGCCACCAGGGTATAGATGAAGGCCAGGTGCGCCGGGCAGCAGGGGGCTG
-CTTTCTCCTCTAGATACCCCTGGCCCTGGCTGCTGTCCACCGTGCCTGCAGGGCCCAAGT
-CATTCTCTTCCCGCGGCCGGATGGAGTGGAGGGTGACCTGGTCATTGAGGAGGTCTTCCA
-CGGAAGCCTCCCAGCACCTGGGTTGACGCTGGAGGACAAAGAACGCCACGAGGCAGCAGG
-CCATCATGATGGATAGGAGGAGGAAGAAGACCAGGGGTGAGAAGTGGGCGGGAAGGTAGC
-GGCTCTCCAGGTGGGACAAGGGTGCTTCCATTCCGGGGAGGGCGGACACCAAAGCTCTGG
-GAACTCCCTGCAAAGGACAAGACAGATCCCTGGTCAGGGGAGGGGATCAGGCTGCAGAAC
-AACAATCATGACAGTGATAACAGAATACAGATCACCTGTTATTATTAATGGATAATGAAT
-AAATAAACATAACTAACAAGGTGGCAAtaatgactgctcatactgactgcccactgagca
-cgggcactgtgcatggataagcccctatgcctcctaacagggctgcacagtgggcaccat
-catcccccattttagagggaactgaggtatcagaatgcttcgtcccttacctgagggtca
-cagggagaatgtggcaaagccagactccacctggtgctttctgacttggaagctacacct
-tttatcaccccacAGCAGTGGCAACCACAAACATGTTCAGAGGAGGAGCTAGCTGGAGAC
-TGAGCAGTGGAGCCGCCCACCTAAGAGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACC
-TAAGGGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACCTAAGGGGAGAGCCCCCACCTA
-AGGAAGAACACTGCTCCACCCATCGTCTAGGAAATAAGGGCCTTcaggacatgccatccc
-aaaatatgactgtaggaggccagaatatgccaccccaaaattgacctattggcatatttt
-ttatttctagctggttattttgaaaaattgcaggctaaggagtagctctgaaaagttgcc
-attttgtaagataaatttacatctaaaggaaatttttattagtaaagctatcttatctgt
-accaagaaaaggtatctgtaccacgaaggggtatctgaaccaggaagagaaaggtgatgg
-cctttatcacccgaggaacttttatctgcataacagtgcaatgtttattcaccataagtt
-tcctcccttcactctcccataatttgtctccaccatcctgcagtagcctcaagcccctat
-tcccttttgtagctcaggatgctatagaagctgaaatcatctggcccttttttgagtctc
-atattttttggggactcccatgcgtatgtatgtaagtaattaaaatgagtttcctgctgt
-tgatctgccttatgtcagtttaactcataggccgaccaaagaacctagaaggatggaggt
-gagcagtttttccctcccctacaTTTGTGATAAAGCCAAGTGCTGAGATGGCTCCGGGTG
-ATGCTGGGTACCTGTGCGATGTCAGTCTCCCTCGTGGGTACAGGGCTTGGTACGCTGTCT
-GATATCTCAGTGACATTGACGCAGGTAGTGAGACCGGAGCCCTGGGCAAGAGCCACCAGG
-GCGGGCAAGAGGCCGCTGAGTCCTTCACCCACAAAGAAGGTGGTGAGGTAGTAGGTGGGC
-AGCCGGCTCATGAACGGCAGGAAGGTCACTGAAGAGGTGCAGTCCACCAGGGCCAGGAAG
-AAGGTGAGGACCAAGAAGGCGATGCTGTGGTGGCCGTCCAGCACCCAGGAGGTCATATTC
-CAGAGGAAGGCAAAGATGATGCAGGTGACGGTTCCCACGCCCAGCAGGGTGAAGATGATG
-GGCACTTCGGAAAGGCAGCTGGGCCGGAAGTGATGGAGCAGGGTGACCAGGAGGGGCCCG
-ATGTTGGCCAGCTGGATGACCACCGTGAGGTAGGAGGGCAGGTACCAGCCCTCGGGCAGC
-TCCATCACCAGCAGGGGCAGCTCTACCCAGAGCCCATTGATGGTCACCCAGGAGCCCATT
-CCGAAGACGCAGACCAGCAGGTGCATCAGGAAGGCCATGGCGGTATCTGCCCTGGGCCAG
-AGGCTTTCTCAGATCAGCCTGCAGCGGGGCTGGCAGAGAAGGACACCAGGTGAGTAATTC
-CAGCTTCACCACCTAGCAAGATGCTGGGACCTGGGGCCCAGAGTTTTCTCTTATTACTCC
-CCTTCCTGTGAACAAGCTGGCttttttttttttcctttgagacatagtttcactctttta
-gtccaggctggagtgcaatgggatgatctcggctcagtgaccctctgcctcctgggctca
-agtgattctcctgcctcagtttcccaaatagctgggattacaggtgcatgccaccatgcc
-agctaattttgtatttttagtggaaacagggtttccccacgttggtcaggctggtctcga
-actcctggcctcaggtgatccgcctgcctcggcctcccaaagtgctgggattacagtgtg
-agccaccacgcctggccCAAGCTGTCTTTTTATTAGCAGAAAACAAGAGAAGCCTTTCCT
-AACCGTGATTCATGAAAGAAAAGTTCAATCCGACACACAAAAGCaaacaaagcagcttct
-gcaaaagataccaacagcaaggtcaaaagttaaatgaaaacacggggaaaacatttgcca
-cataaatcacagacaaagggctcatcttccttgtcaggcctctgagcccaagcctgcgcg
-tgtacatccagatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggccggtt
-cctgccttaactgatgatattaccttgtgaaattccttctcctggctcagaagctcccct
-actgagcaccttgtgacccccacccctgcccgccagggaacaaccccctttgactgtaat
-tttccactacctacccaaatcctataaaactgccccacccctatctcccttcgctgactc
-tcttttcggactcagcccgcctgcacccaggtgaaataaacagccttgttgctcacacaa
-agcctgtttgatggtctcttcacatggacgcgcgtgacattcctaatatataaagagttt
-ttaaaaatcaagaacaaagagaccccatatagaagagggccaaggatatgaacaattcag
-agaaaaaggtacaaataagctttaaacacatgaaaatattatcaccttcattcacaatag
-gaaaactactccaggtgccatttctcaccatgagattgtcccaaagcctgacaaaatgac
-tcatgttcaaggttattatagattgcgatcttgttggtaatagcaagttatgggaaattt
-tctcctgggtggctaccaacagagagggggctaattaaagggacctgctggaataccaca
-tacctgtttaaaggaataagaaataaggaaagcagatcttggtgactgataaggaaaggt
-ctccaggctataataataatcttgaaacaaaatcaaggcaggtaaatggaaccaggaaaa
-agtgtactgccttttggtcatagaagaggaggaaaaacaTGTTTTCTTTGCTTGTACTTG
-CACAAAGCAACCCTTGAAGGACACACAGGGACTGCAGGGATGTTGGTGATGCCTCTGTAT
-ATCttttttttttttcttgtgacagagtcttactctgtcaccaggctggagtgaagtggc
-acaatctcagctcactgcaacctctacctcccgggttcaagtgattctcctgcctcagcc
-tcccaagtagctgggactacaggcgcccaccactacgcccagctaattttttgtattttt
-attagagatggggtttctccgtgttagccaggatggtctcaatctcctgatcttgtgatc
-caccctcctcagcctcccaaagtgctgggattacaggcatgagccaccgctcctggccCT
-GCCTCTGTATATCTTTTAATAAGAGTTTTGATTTGTGAACCATGTAAACATATTACCTGA
-TGCAAATATATGGTTACCTGAAATAAGATTTCAATCTGGCTTTTTTTCCTCCTGAAATTA
-TATCACTCTCTACGTGGCCTTTGGAGACCACTTCCTCTAGCCCTCCAGAGCCATTCTGCC
-ATCTGTTTACCCCTTTGTCAGCTACCAGTGGCAGCCCACCTGTGCTGTTACTAACAACTT
-TCTTCTATCTATCCTTAGTCTGAGCAGTAATATGGGAGATGCCAGGAGTGAggctctgga
-gccagctgtttgagtttgaccctggctctgctgcttacaatctgggtgaccctgggcaag
-tggctttgcctctctctgcctcatctcctcatctgtaagtaggggatagtgatagtatga
-actccgtggtttgttgtgagatataaggatgctggtgagtttatgctgtttccaacagtc
-ccagcatagggtaagcacctctaagggttactgatcattATCGTGAAATGGCAGGTTTGG
-TGACATCGTTATTTTTGTCTAATTCACATGAGAATTAATACATGACTATGAAAATTTAAA
-AAAGGAAAAGATTCCCCTACTAGGTATCAAGTGAACTCACCAGTGGTATATGCACCTTTT
-TGTAGAGACACGCTAACTGGGCCAATCTTCACGTTTTGTAGATGGGAGACGAGGTCCGAA
-GGGGCAGAGGGGCTCTCCTGGGATCTGGACTGGATCCTCTGCAGCAAGCGGCCTGTCCGG
-GACTCCTCAGTTCACGCTGCAGTCTTTAACTCCATACTTCTTCCTTCTAGTACAAAGCAG
-GAGTGTCCGTTGTGGCCACGCCTCACCCAGGAAACTCCTGAATCCTGGCAGCTCCTCCCC
-ACGGTTCCCACACACGGAATTCCCTCACAGGGCTGGGACTTCCTTCCTCATACCTTCACT
-GAGCGAACCCAATGCTCAGTGGCCTTTCTGGTCACCTCCTTTTCCTCTCTGGGAGGAGCC
-ACTCCTGGGGTGTAACGCAGTCAGATCCCCTAGCAGTCCCGCTCTGCCCCCTCCCTTCTG
-GGGGCCTCAGACTCCATTCCCTCCCTTAGGAAGCTGACTTGACTAATAGCACAGGTGAGG
-CCCACTCCAGGCGTGCCAAGAGGACCCAAGGAGGGAGGGGAAGCTCCCAGACAGCAGTGG
-CACAcctttgcctgtgctgtcctcccagcctggagcaccagccccctctgctgtccacat
-ccaagctttctacaagactccgtcctccaggagacctctggctgcctcaccttctcaggc
-gtcctcaccagggcccatgaccccttcatttcaggttgttcttgtgtgggtgcatgcagg
-cacataccttgagactgaagctttttgagggcaggggctgCTTGGGAATCTGACATTTTG
-AAGGTGGAAGGGCCTTTCTCAATGACTTAGCTTAGGATTTGTAAATTGTTAACTCACTGG
-CCACTGCCAGACAGCAGATATATTACTTTGGTTTGCCCAGTGTGTTTAACAATTTGTTAC
-TGTAATCAGCAGTGGAGGGGATGGCAAGCAACCTTCAGCATTTCTGGCTTCTCAGGAATA
-TTTTGGAAGAAGTGGCCCCCCACTTTGGCCTCTTTCTCTGTTCTAGACTCGGGCCATCTT
-GGAGCTCTCCCCTGCGGTAACAtctggaaccagttgcctgggttcaaatcccagcttcaa
-cccttacaagctgagcaagtgacctaacctcctgtgcttcagagtcttctcttgcaaaac
-agctataggctgtcagtaccaacatcagaactgttgctaggaacatgcactaaagtgcta
-aaactgtgcctgccacatagtgagggctcaatgaaCCATCATTATAAGATTACTATTTCA
-GCAAACGTATCAGTTGCATTCAAAAACATGTAGTTATTggccaggcgcggtggctcacgt
-ctgtaatcctagcactttgggaggatgaggcgggcggatcccttgaggtcatgagtccga
-gactggcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaattagcccag
-catggtggcgcacacctgtaatcccagctactcaggaggctgaggccggagaacggctcc
-aacctgggaggtggaggttgcagtgagccgagatcatgccactgcactccagcctgggca
-acagagcgagactccatcttaaaaaagaaaaaataaaaaaaaGGCGCAGtttttgttaga
-caaatggccactcaactaaaggactacatttcccagccttctttgtagctgcacatggcc
-atgtcatcaagcacaggccaatgaattcaaatgcgactttgagtagtctccttagcccgt
-ttcctgtttagaaaaaaaagtgcagctcgttgccagcactcatttaattttatgtaaacg
-tgctatttgaggctgaagcaaatctgattctgactgctgttttttttttttttcttttga
-gacagagtcttactgtgtagcccaggctggactacagtggcttgatctcggctcacagca
-acctccgcctcccgagttcaagcagttctcgtgcctcagtctccttagtagctgggatta
-caggcgtgcaccacaatgtccggctaattttttatatttcttagtagagacggggtttct
-ccatgttgccaggctggtctcgaactcctgggttcaagtgatccccacgcctcagcctcc
-cagagtgctgggattgcaggcgtgagccaccaagcccagccctaaatctgactgattttc
-aatgtgaaaataacatgtaaaaactgtttttgaagttatttctaaccagaactaacatca
-gactcatctatttcagaaaaactggattcatcaaacgaatctttggtcaacaactgttca
-agaacaatgttaacatcacacataggaatgctaggatttgctattttcagcgatcgagaa
-ttactttgttttgtaaatggaaataccacgactaaaaccagaatgctacaaatagagtga
-tgtcttttgtttccaaagtcaatatactagagcaaggcaaaaataataataaaagcgagg
-tattttgtggcaaagttatcttggggtaaacactgcagtcacaagtgggtattccttctg
-gcaaacagggaaagagttaacaataagggagtgtgcccttctgctcttcctccatttggc
-tgtctggaatcagatgtgatggccagaactccagcaacgattttgtgctatgaggcatgt
-ggtgggggttagatgcatactaggctcctttgggattttgtggcagagagcacccatacc
-agccctgttttgcctgtgttgaactgttttgtttgtttgtttaatgttgttgttaaattg
-taaaagaaacttctatgttgtttaagtcactcttattttATGTACAACAAAAGTACTCAG
-Aggctgggtgcagtggctcactcgtataattccagcactttgggaggctgatgttggcag
-atcacttgaggtcaggagttcaagaccagcctccaactggtcaacatggtaaaaccctgt
-ctttaccaaaaacacaaaaaattagccaggtatggtggtgggcacctgtaattctagcta
-ctcgggaggctgaagcaggagaattgcttgaactcgggatgtggaggttgtagtgagcca
-agagcacgccagtgcactctagcctcggcgacaaagcaagactcttgtctcaaaaaacta
-aaagaaacaaacagacaaaaaCTACTCCATACTAAGTGCACAGAGATACACATTCCAGGA
-TATATATTGAAAGATTATAGTAACCAAAAACTAATGAATACATTTATCTCCTTTACCACC
-TACTTTCTGACTCTGAAACTTAGGTCCTGTCCCAACCAGGATTTGATCAAAAATCAAAAT
-TTAACAAAAGTAGTTGTTTAGACCCTTGGGGGCAAATGTCTTGCAGAGATATGAAAAAAA
-AAAAAAAAAGGAGAAGAGAGAAAGAGGGAGGAACAGAGGAACACAGAACCCTCCATATAG
-CATTTGGTACCAAAAGTATAAATTGAGACCAAGAGTCATTTCATATATCAAAACTCTAAT
-TCATAAAGGAGTCAAAATTGTAGTGACTATCTGTATTCTGAATATTTCCTGAAATAGCCT
-CAGACATTCCAGGAGAAATGGACAGAAGCACAGTCCAGCAGTACAGGCCTGACTCACCCT
-TCCAGGTCAAGACAGCAGACGAAGGTGCAAAATAAACAAGGATATAGCAAAAGCAATAAA
-TGATATACCTAGTAAAGAGGGCTAAGTCAGTAGTTAAGGGGAGTAGGCGAATTTGCAGAT
-GATGGTGACCTTTGCCATATGAAAAGCTATTAAACTAATGAGAGTGTCCAGTTAAACATT
-TACAAACATCAGTAGCTTTCCCACAGAGGGCTGGATGGGGAGATGAGGGCAGACAGGGCA
-GAAGTAGCCTCACTTTCTTGTATGTTCGACAACTCCTAAGCTCTGAACGCCTAAATCCCT
-GCTCCCCACAAAGACGAATTCTCTGGTTTTGACCCAGGTGCTACCACGGCTGTGTCACTT
-GAGGGATGGGATTTGGCTCCGGGGGTCTGTTTCCTTGTCTGGAAACCAGGCACAGTGGGG
-GTGTGTCCCCACGTGACCCATCTGCCCTATGGCCCTGGCCCACTCCCAAATTATCTCCTT
-CCTCAAAAGTGAGGTGTGCTTTTGGACCTCGGGGACACAGTGAGGAACAGTCATTAATGT
-CAATGAAGGGGATGTCTTAGGCAGAGGGAACTACATGTGCAAAAAGGCCCCAGAGAAAAG
-GAGAGACTCAGAATGGCTGGTGTTCGGAATGTGTTGGGATACTTTTAAAAGATGCATATC
-TGTATtttctgttttttttttttttgttgttgttgtttgtttgtttattttACAGTGACC
-TTGCAGTTCTTatttattcattttaaccagtatttcttgggcaccaactgtgtgctcaac
-cacAATCCCTGCTCTCAGGAAGTTGGAGGAAGCATTCACGAAGCAGAATAAAAAACAGAA
-ACATAGAGCAGGTCAGATGGTGGCAAGGACTCCGGAGGAAAGCAAAGCTCCTGAATGGGG
-AATGTGCCGCTGTCAAGGAGAGgacatgaagggagtgtgggagtgagctgtctgcagaaa
-gcacggtccaggggagaaaacagcaagtgaaaaggccctggggtgcggccacacctgctc
-tgtcccagaagtggattttgctgttcaaaggacagctaggaggccagtgtggccgcagca
-gcgggagccaggttggaggggaggagacagggcaggtcccctgtggccctgtggtgacag
-cttgggtgttttctctagagcaaaaagctccgtgagtgggcagaagagaccagctctaat
-ctagtttttaacaggatcgtgctggctgttgtgaggagaaacatgaggcgccagggagga
-agcaggagtaaaccttcggagggttaggaagctgtagcaAAAGAGCTAACAATCACCATG
-ACAACAGTGACAACCATagctgccactcctcagctatttattgtgccagaccctgtgcta
-agctctttgaacacattacctgtcaaatcttgttccacaatcctgaggctggcattatga
-ttatctccattttacagatgaggaaactgaggtttaaaagggaaataaatttgcctaggg
-tcatacagctgggagctgagctttacatccaggcatgcttgactGTGGACCCAGCCCTGA
-GAAAGGCCTCAGGGTGAAGGGGTTCTGAAGGGGCCATGGGGGTCAAGCTGAGCAGGATCT
-CTTTCTGCTCACAGATGGCCTCCCAAGACTTGGGCCAGAGAAAGAGAGAAATGGGGTACA
-GGCTCAGGAGAAGCTGAGAGAGGCTCTGAGACATATCTGCTTCCCAAGGATCCAGGACCC
-CTTATGTGATCACCAGAGACCAGAAACCTAAGGCTTCGCATGAGACAGTTAAGATGCCCC
-ATAATGCGTGGGCGACAGATAGAGAAGCTAGAAGGATCAGTTCCAGGCAAAGGTTTCTCT
-TTTGCATTCTTGCATCAAAAGCTGTGAGCCCCCAGCCCAAGAAAGTGAAGAGAATTGGGA
-GTGGGGTTCTGACCAGGGCCAGTGCACCGTCATTGTGTGGGCTGGGCCATCTCCTCCAGG
-GAGCTCAGGCAGCTTCCATCCCACCCAATGTCCCCCGCCCCCCTCCACATTCTCCTGCCC
-TCTGTTTTCCTCCATCAAAGTATTACTGACACCAGCTCAGTTACGGGAGTTTATCTGTGT
-CTATCTGTTGAGCGCTGGTCTCTCCCATTGGAGTGTAATCTCCATGTGAGCGGGGGCTTG
-TCCTCTCCCCCAGTGCCCAGGTGACCATCTGGCTTGCCACGGGCTGGGCCACCTGAGCTC
-CTGGCACCATGGCTGGGTTCTCGCTCTGCAGGGATAATCTGCCAGCTGGTAGGCACCTAG
-CCCTGTGGGCCAGACTGGAGGAAACCCGCCTCAGCTATGAGGGTTGTGTTGGCCAGGGTG
-ACCCCTGGGGCAGTGCCAGGTGGCAGCCTGACACTGGATACATCTCACTCCTGGGCAAGG
-GTCTGAGCCAATTCTTTCCTGGGTTCCAGGCTCCTGGAGAACTTAGTGAGGCCTGTAGGC
-GTCTACTTAGGGCCTGGCCTCACCCTCATGAGAGTGGGTAGGAATGGACTGACTTTGAGC
-CCATGAAGAAGGGAGGCTGAGAGGTCAAACCACAAAACCCACagggagagatgggggaga
-tgaaggggagtgagagagaagagactgagacaaagagacagaaagaaccgaaagctagaa
-gcagaaatggggagaaaggacaacagaggcacagagacagggaaaaatgagaAGCTGCGG
-CTGAGAGGGAGGCAGGGAGGTGCCAGGAGGCAGGAGGCAGCTGGGGCGCTGGGAGCCTGG
-CCTCAGCCACCCTCACTGTTCACAGCCACATGTAGCAGAAGGCCATCTCTACCTCTTGTT
-GCTGGGACCTCAGAGTTCccctgaaactcatcccaactcaatgtccctattgcacaggtg
-gggaaaccaaggcccagagaggagatagtgcttccccgaACCCTGCCCCACCCCTGATCT
-CAGGCTGTGGCAGACattcaggcctgtgctcaccggctgtgcaacctcaggtcagctgct
-caccctctctaggccttggtttctccatctgtgaaagggTCTGGGAATGCCCAGCCTTTC
-TGGGCTCAGCAGACCAGGAAAAAGGGAATGAGATAACAGGCGCTCAGCCTGGCCAGTAGA
-AGCGGACAGTGAGTTCTCTTCCCCCTTCTCCTCCCTCCCAAGGCCAGGAAGGGCTTCAGG
-CCTCCCATGGGGCTGACCTTGGTGGAGCAGCCTCCCCCAGGCCAGTTCCCCTCCCCTCCA
-CGTCCATCCCAACTCCCAGCCTCCTTCCCAGGCTCCTGCGGCTTCAGCCTGGTCAAGTTG
-TTCCGAGATAGCATGGAGATGGCCCTGGGTAAAGTCAGTGGGGGCCCAGTCttttttttt
-tttttttttttttttaagacaggatgtcgctctgtcacccaggctgaagtgctgtggcat
-gatctgagctcactgcagcctcaaccttcctggctcatgcgattctcccacctcagcctc
-tgagtagctgggactattaacccatgccaccacgtccgacctgggtaatttttgtatttt
-ttgtatagatggagtttcgccacgttgcccaggctggtcttgaactccctgagctcaagc
-gattcacctgcctcagtctccagaagtgctgggattacaggcgtgagccatgacacccag
-cATGGGCCCAGCCTTTTGGTCTGGAGGCACCAGGGGTCTGGAATTCACCTGGATGGCTCA
-GCCTGTCCCGACTCCAACATGCCAGCTGAGGAGGAAACCTTTCTTCCCTCCTGTCCCTTT
-GATCTTTCACCTGGATGGCTCAGCCTGTCCTGACTCCACATGCCAGCTGAGGAGGAAACC
-TTTCTTCCCTCCTATCTCTTTGGACTCTCCCGACATGGCAGCCTGAAACTAGGGGAAAGG
-CCACGGGACACCTGCTGGCTCCAGATAAGTGCCCCTGCCATATCCTGGTCAGTGTCCCAT
-GCTCCTAGCTAGCAGGCAGCCTTGGTAGCTGCAGCTGCACCCTCACAGGCCTGAGCCGCC
-CCGCTTTGCCCACTTACCTGCTGGTCCAGTTCCCCAGCCGCTCTGCATGGGAGGGGCCAG
-AGGCAGCTCGTTTTGTATAAAGCTGTCCCCGCCCAGAGCTCGGGGAAAGGCAGGCGGAGG
-GTGGGTGTGGCTCCCGGCAAGACCAGGCGCCTACTATGTGTCTCTGATCTGCCCTACAGC
-CCAGCTAGGAGGAGGATCCAGATGGTAGAACTGTATAATAAAGGGCTTGCTTTATTGAGG
-CTCTCTGCCACCCAGATTTCATGAGGGTTGATCCCCAGTTGACAAAAGCTATGTGCAAAC
-AGTTGGTTCTGGCATCACCCTGAGATCTCCATAATTCCTTTCACACAGGAAGAGAGTTCC
-CTGGAGCAAAAACAGTTCAAATACTGgtgcttcagtaagtcatgtggaaagcggggataa
-taatagtgccctcttcataggACAGAAATCCTAACTGCCAGTGTGCACTGAgctgactca
-gtgtcaggcatgttcttggggcttgagagaaattaatgcatttaatcttcatggcctttt
-ggagagatgctattactatccctattttccagatgaagaaacaggcccagagaagtcgag
-agccttgtgtaggtcacacaccttgtatatggcagaactggTCTCTGATGCACACTGAGC
-TACCCTGACAAATACtgtaaccacctgaggggttctttctgcccactgcataaagaaaga
-ccatgaggctggccatgccacaggggaaatgagtttgttcccaaatcatcttcaaagctt
-gtaggtgaggggtttttcaaaggcagtataggggaagagttgggggtggccaggtaacag
-gtgcttgctgctgattggttggggtggagatgaaatcatagggggttgaagctgtgctcc
-tacaggctgaatcgcttttggggggggggccacaggagcagggttggcggtcctggtgga
-gacatcaggtttaggtggagccatgggtgtcaaatctgcaaaaaacctggaaagatggcg
-gggcgtggtgggtcatgcctgtaatcccagcactttgggaggccgaggcgggtggattac
-ctgaggtcaggaattcaggaccagcctgaccaaaatggcgaaaccctgtctccactaaaa
-atacaaaaattagccgggcatgatggcggacacctgtaatcccagctactggagagactg
-aggcaggagaattgcttgagcccgggaggcggaggttgcagtgagccgagatcgcgccgt
-tgcactccagcctggacaatagagcaagactctgtctcaataaaaCAAaaacaaacaaac
-aaacaaacaaaaaacaaaaaaaaaacaccaactggaaagatatctcaaaaggccaacctg
-caacagtggtgttatttgcaggagtaattggggaagttgcatatcttataacctccagaa
-taatggctggcaatcatttatgtctacaccttaggaggacccaggctcctcttctttccc
-cagcctgatggcctctcattaactttacaaaagtggttGCTCACAGTGCTACGGCCTGTA
-AGTGCAGGGCCAGGATGTGAATGCAGACTCAAATTGGTGCCTCCatggatgtaaaacata
-ttgcacagattctgacacctagtaaatgctcagtGCATATTGACTTCTACAAATAATTCT
-GGCCTGCCTGTTGTGTTATTTTCCAAGACATTCATTTACTTAACAAGCAATCAATCACTC
-TCCAGGCTAATGCTTGGGGCGAGAGGTGAGCAGGCACTAGGGAAGGGGCCAGACCCCTCG
-CTTAGCAGGCAGGTGTTCAGGAAGTGTTGCCACtgttggggctcaggacatacacacccc
-caaaatatgactctgggaaaccagaatgtgccacccccaaatacacctctttgacatact
-ttgagctggttattcagagaaactgcagacacaggagtagctctggaaagctattctttg
-gtaaaagaaatttacatctatcaaggaaatctacattagtaaaggtgcctgtatcaggaa
-aaaggctgctccagaagaattaccctagagactttcttttttttttttttttttaagata
-caatttcacttttttttgcccaggctggagtgcaatgctgcaatctcggctcactgcagc
-ctccgcctcccgggttcaagtgattctcctgccacagcctcccaagtaactgggattata
-ggcgcacgccaccatgcccagctaattttgtatttgtagtagagacaaggtttcaccatg
-ttggccaggctggtcccgaactcctgacctcaggtgatcttcttgcctctgcctcccaaa
-gtgctgggattacaggcttgagccactacactggccaccagacagacttttatctgcaca
-ggaagacaaccattatttaccatacaataattcttcccctcaccctcccataactgtgtc
-tccgccaatcccccaaagccctaagaccctattccttaaacttcaatcatctgacccttc
-tttgagtctcatattttgtgggatttccacgcacagatatgtaattaaatatggtttctc
-tcctgttactcagtttcatgtcaatttaattcatagcccagccaaagaaccatgaaaggt
-ggagggaagccatgtttcccttctctataGTACCAAATACTTTGGATCTGTtaaaaaaaa
-attgcaggactctaaatttatgatgccaagggagaagttaagccttgcagagtgTGAGTT
-ATGTGGCTTGCAGGATGGCCACTTTCTtcttctttttttttttttttgagacggagtctc
-actctgtcgcccaggctggagtgcagcggccaggctggtctcgaactcctgacctcaggt
-gatctgcctgccttggtctcccaaagtgctgggattacaggcatgagccactgtgcctgg
-cCAcaatttcatacttatctctgccaaatactataaggtgtcaaaatttggcatagaggg
-tacaaaactataactcaatccaaacagaataatctttgcttgtataattttttaataatg
-aaacatcaatattggtttaataaaggcagctatatcttgaactatttagttaaataccct
-aacttctaatcctgtggccttaggaagtctagtctacagacgtgaaggaagtttctttag
-ggaaaggacttatcatctttgatattaaagaaaagagaatttatataaaaataatcttat
-atggtaaattcttgttctaaagtaaatgaattggttgtttaaaaagaaggatgtttacaa
-cgagtcagaaagttgaggcatgtcagagattgtgtaaattgtaaaaattttataaaaggg
-aatttatgcaagaaatgttgtacagtttaaaagtgatgagggggccgggcacggtggctc
-acgcctgtaatcccagcactttgggaggccaacgcgggtggatcacctcaggtcaggagt
-tggagaccagcctggccaacaagatgaaaccctgtctctactaaaaatacaaaaaattgg
-ctgggcatggtggtgggtgcctgtaatcccagctactcgggaggctgaggcagaatagct
-tgaacccagaggcagaggttgcagtaagctgagattgcaccactgcactccaggctgggc
-gacaagagtgacattccatctaaagaaaacaaaaacaagagcgactaggcctcctgaatg
-ctttataaaatgccaccataactcttaactgtacaacttgcctgctttgtagctgggtaa
-gacctagcacacatggagttaaatgctggaataagtcagaccttatctgcacttctgtct
-aggtcctaggctctacatctagtacataattacaatctcaaactgactaacaaaagtaaa
-agttgctaaaagttaacagtgtaacatgtattgttccatagaaagaatctaagataagac
-tgtaaagctgaggctagccgtggaattgtaccattaaatacctatgagtttcctcttgag
-gttgcaagataacctagggttcccggcctctcagaaagggcattctttgcttaccacaga
-tcagaagccctatacagggactgtgtacacaaaatataaggccagtttccaagggctttc
-ttggcttcgtaaatcaagtttgattccttaaaggaaagcataccattccagtcaaggcct
-tggtaaaaaaaccagtttttccaattgtgtcctgttacaaaagaaaacagattcttatta
-cacttgtgcaaataactatatcgccataacttaagaatactcacagatagtttccaaatt
-ctggagaaaatcagggagagagaaacaagtatgctacaaattttgttcatgggagtatac
-taaattgttaaaagctgttaatagctcaaaagaaaaatttcgaggccggatgcagtggct
-catgcctgtaatcccagcactttgggaggccgaggcgggcggatcgcctgaggtcgggag
-ttagagaccagcctgaccaacatggagaaaccccatctctactaaaaatgcaaaattggc
-tgggtgtggtggtggcacatgcctgtaatcccagctactcaggaggctgaggcaggagaa
-tcgcttgaacccaggaggaggaggttgtggtgagccgagactgcaccattgcactctggc
-ctgggcaacaagagcgaaactccgtctaaaaataaaataaaataaagaaaagtttctttg
-actttgaaaagcaaaacaaagtattagcaatattttaagcaaaatatcaaaaagatcact
-ccagtctcctattagttcagttcgtgcagttaattcctgtcctgcttgatattaatgaac
-attttagctaagagtcctaaccatttttcctgtattctgatgtcacaatctccaaattta
-tcagaaacctgcattcaagaacacctgttagagctttatagctgagtataaaacccttct
-aaagaggatcaaaacaagacaacaattgtttatggatgaccaaaagttttagggtagcca
-tagttaaagacacaattgacaaggaaatctgttacttctgtggcacacaataattttaac
-ataacaattataattactactgataacacacactaagacatatcagaattataggagtct
-cccataactttggaacacataccaataacatatttatacaaatatggcccaaagaaagcc
-aaacattattttatatttgacaatgcttcctgtatgacttcataccaaataagccaaatt
-ttacctttatattagtgtgttattaatgttaaactcaattttaatgttttgatcataagg
-tcagattttcatggacccttttttttttttgagacagagtctcgctctgtcgtgggcgac
-agagtgcagtggagcaatcttggctcactgcaacctccacctcctgggttcaagctattc
-ttctgcctcagcctcctgagtagctgggactacaggtgcccaccaccatgcctggctaat
-tttttgtgtttttagtagagatggggtttcaccgtgttagccaggatggtcttcatctcc
-tgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgagccat
-tgcggctggcctatagaccatttttaaccctttataatttttgtcaaagagcaggttagt
-gctttaagaaaaacccattgtgcttttattttaatactcaatttacagaaaaactggatg
-atacacctttaactttagccaagatgtttacacacagtatttcctttacaattaaccttc
-caaaagttgcttaaaccttcatttttattttattcaacttaaaacaattctttaaccttt
-taatctaggtaaaaatccacattctcatgcctccttataatctttttaccaaaagtatat
-gtaaactgttttttcaatagtcttaaatacatgttacactgttaacttttTTTTTTAAGG
-CCTACGTAACAAATAATTATTCTTggctgggtgtggtggctcacgcctgtagtcccagca
-ctttgggaggccgaggcaggtagatcacctgaggtcaggagtttgagacaagccttgcca
-acatggcaaaaccctgtctctacaaaaatacaaaaattagctgggcgtggtggtgggtgc
-ttgcaatcccacctactcgggaggctgaggcaggagaatcacttgaacccgggaggcaga
-ggttgcggtgagcttagattgcaccactgcactccagcctgggtgacaagagcgagactc
-catctTGGGGGGGAaaaaatgggaaactggagagagaaaattacatttcagaaactataa
-cacacctgttattaaattccagtgttgcctaatgttgttcaatttttattactttaaatt
-aaattctaatttttctgactacgagtttccaaaataagctttgttttcttaaagccctat
-gaactgaaaactagacgtttcagcaggcactgcctctaaacgccccccagccatcacagg
-aggaaacctcttcactgctggagctgacaactaataactgagcgtgcctggaatcctttg
-cccccacatctaataagtccatggaacccagggtaattgagatggcatctcttacaagaa
-tcaacttctgggtcaggtgcggtggctcacgcctgtaatcccaacactttgggaggccaa
-ggtgagtggatcacttgaggtcaggagtctgagaccagcctggccaacatggtgaaaccc
-catctctaccaaaaatataaaaaagttagctgggcatggtggtgcatgcctgtaatccca
-gttattcgggaggctgaggcatgataatcacttgaacccaggaggtggaagttgtggtga
-gccgagatcgcgccattgcactccagactggcgacagagcgagactccatcttaaaaaac
-gaaacaaaacaaaaaaacaggaatcaacatctggatacattacactcgagtcaaagcctg
-gaaagctgaggaagcaacccctgatagccaaaggaacatcctaaatatcagtgtaaagaa
-ataggaaattttaagctcataaaaggtaagtaactgagtgagaactacttatcttactca
-gtctcacccctacctcaccaaatacttttagatgttcctacctctccttttaagacaaat
-attaaaactttttaatggaaattattcactacaccaccattgtgggaactgctttacaca
-ctctattatttgcagtgggactatgtactacagcaccctcaggatggaatatcagacaga
-gaatctcaattatggtaccattttgcttaattattatcctcatagcaggaataacagtta
-ctaacagcaaataacacatgggcctttccagacatgtgcctctgcctgtcattgggtgag
-gaatgttgtttctatatcaaccaattaggcctagtaagaggtgctgttgaaaaacttaag
-gaaagggctataccaaaacaaccaaatagattcttggtttaggaacaaaatcatagcatg
-ggtcatcccattcctgggacctttcctaataatatgcctaggactaatgttcttaccctg
-cctaattaacctttttcaaagatttttaactgacaggatcatggccatttcacagacaac
-tacccaaaaacatccacagacagcgttactgctacagttaatccaagaccagaaaactct
-gtcccctcatcagcaggaagtagccagaaagaacaccctgcctttcatcctttttataac
-tataaggtctggattgacagagcaggagcattgccatcttggacaagcactgccattcta
-aagttccccttgatcaaaaaccacctaaatccaaagggcatcagcctaatggctaaggtc
-agcatgaccataaaccacaaatgacatctctgaccagaaacattccaaccataagttaaa
-gccctccccgaccagagacgtgccagccccaagataacctcccctccaggtggagagatg
-tcagccccaagataccgtcccttccaaccagagacattccaaccctcaatagacttctcc
-cctacacaggaacattccaagcctgtgataagctctcttacccagaaaccagtaaatacc
-cttagtatgtaagagagagcattcctgactgaaattggacagaggcccctctcaggttta
-ttcttcaaaataaacctgtctttgactgttgagcctcttttcatgtttctttcctctttc
-ttgaactcttacaACACCTTTGTTAGGCGCAAATtttcagtgctgcaaaagaaatagcac
-tcgaacataaatttaattttctcagcaaggcaattttacttctatagaagggtgtgactt
-gtggatggaacaatggtgagagcacacctgaacaagggaggggaaggggtttttattcct
-gatgcaggtagcccctactgctgtgtggttcccctgttgactaggattggaccacacagt
-ctaagctaattccgattggctgttttaaagagagcaggggtacgagtcggagtagcggag
-tgagtagtttggcgggaaggacagttaggaacaggtgactaaaggtgactcaggtcagtg
-caggtgaccaggggtgactcaagaaggagcaggtgatcaggggaatagatgtgaactact
-gattagaactggtggaaaaggttgtttactgaaactaggggcaaggaggcaaagagaatg
-agaaagttaaactttaaaatggagaacaaagaacaggggacctgaatatactcatacatt
-ggttccttggagaggatctcagaactcattgtacttaacaATTTACAGGCTGAAACATTT
-GAAAAGGAATTTGTTATATCCTACAatttccccctttcaattttcatagtacttcctctt
-caaactttttaaacatgtcttggcttagctgctcgacttaatcctctaaaagaaaaagct
-tatctgaataaggtggaggtgagttaaggaagattttagtaagtgctgcttttataagtc
-tttgcactagcccacagatgcatggtatgacataacacctaacaagaatgagtacagcta
-ttacggctgcaagagaagtaagaattgaggctgtgatttctttccatttactgaaccccc
-tttctagccaccctgagaaagggttatcgactccagaattttagctagttcattggatag
-agtggtaagtctttataaggcccttgttatgttcccagtgtgggcagtgttatttgggat
-aaaggtacaacactgagttttaatcataatacaaacaccactttttctgctaatatcata
-tctggtgccattctgttttcccaggccatctggctagtgggccccaattgttctgctatc
-cctttgacagcatccctggtgtaattaataaactgctgctgattataatagatgtaattt
-atccagtctacatttttattaatcgtcacccatgaaaatattgacttaaatcctgcagct
-atttgatctcgggctttaaattcatctggtactcctagtggaactccagtaatgtttata
-taaacatgggggtcaaacgactcatgtaaggcacttcttttacaattttcttttttatca
-tgttgacggaatgctagagtgaaagggatggccaattggactagagcacgagtgctgctc
-taattgcttggcagagtatccagcaatagtgcccctcaatgccaccacacacctgctcag
-ggatgaacaagggcagactgatgggtaagctcttgaaaaggcttggtttcaccgcaccct
-gttaagtctccaaggaatgctaacttttccccctgccgtgaaagggacaggtgaacttaa
-catcaggggctggaggctggatggccctccgggctgacccacagggctcttgacctcggg
-gaagagcagtgaaagcgaacagcagtgaaagagttttgcctgactcattgccccggctgt
-ggggttctggaagagagctaccatacagctcatgccctgtccatgagaggaccactcgag
-gggaaaggggacaatttgggtctctggcctgcctgtcgcacaagcagtcacttttgttta
-gcatgcgaacagaatatttaatccatttcagccaagcatttacatcctggtactctgttt
-caattgctatagtttgttttaaatctataacttctacaacagctactttggttttatcat
-tgggtatataacgaaagaagatctggttagtggagaacttaggagtgggagaagggggtg
-caggagttgaggaggcaatgaagcacatttcaaaggatcctctggggtccttccctgaga
-cttctgctcctataccatagaaacggtactctggggagcagaggtggtaatctgtactgg
-attacattggttcatctgacaatggggtggtccatccttgctccttggtagtccataagc
-cattagaccagctaaaagttctgttctaggagggcaagattcctagttcatactgggacc
-atcatcaatatcttcccagactaactgatcccagttaacagattttcagtctgaggagag
-ccaggaaggacaaagatacttttctgaaggggagagttgcctctggtttggcagatctcc
-acaggtcatcccaaggcaagcatcaaaagtaatagtttggggcgaacttgttacataaag
-aacgagaagactagcaatagaaggggaaaagaaagagatggaatgtaagaggatcaaacc
-cgttttagctttagcttggttggagttggccctggaatagctgtccatgattctggaggg
-ggtggtgctcttttgacctaggtgtgatgagtccatcctctttctgctgtttgaactgtg
-gtctcggtggttagaagcaacaggtagggtccttcccaagccagttcgagtttcccttcc
-ctccaacttttgacaaggacacagtccttaagctgatgttggtgtactggaaactgtagg
-ggtggtacctgttctaaaagacctttagttctgagggaagagaaagtggaaaataaacca
-agtatataatttctgagaaactcatcttttgttttgaacataggaatgtcagcagtggag
-tgtaaacagggcaacctacacaacatttcataaggggataagccaacatctctctgagga
-gcagttcagactctcaagagggcaatgggagagcatctatccatggcaaccgagtctcta
-agactaatttggttaggtggccttttttttttttttttttttttttttgagagggagtct
-cgctctgtcgcccaggctggagtgcaatggtgccatctgagctcactgcaacctccacct
-cccgggttcaagtgattcttctgcctcagcctccctagtagctgggactacaggcacgcg
-ccaccatgcctggctaatttttgtatttttagtagagatggggtttcaccatattggcca
-ggctggtctcgaactcctgacctcgtgatccacccgccttggcctcccaaagggcttttt
-ttttttttttttgacagggtctctctccgtagcccaggctggagcgcagtggcgcgatct
-cggctcactgcaagcaccgcctcccgggttcacgccattctcctgccaaagggctttttt
-aaaaaatagtttggttcattctttccactcttcttgatgaaggtaggtgccagggagtat
-gatattcccatgttatatccagtatctgggctaatttcttaatgacatgtacagtgaaat
-gagtcttattatctgaatcaatgttttctattaatctaaacttgagtataagattttcaa
-ctaatgccctgtctatgttattatcagttgtacttgaaaaggaaatagcttctatccaat
-gagtaaggtgatctactatactaataaatacttcagatgatcagttggaggcatctctgt
-gtagtcagtctggatactttggaatggccttaagcctggactccttcccccaaggggtaa
-tgttttactaaacaactgtctgtaacctgtttggccagggtataaatcctatgcacccat
-aaactctgatgaatgtgtcacacgaggcttggggcctccaatgggtcctttaatgcagtt
-ggaataagacttccctcataaggggtttggataacatttctctctggtctagcaatatcc
-attttccttctgaattctctttagcacctatttttattagtttttaaaccaaagaaagcc
-aaacaccattttatatttgataatgcttcctgtgtgattttataccagataagctaaatt
-tcacctttatattagtgtgctattaatgttaaactcaattttaataaaatcttgtagaca
-tatttattcaattttaatgtctgaccataaggtaaaattgttatagactctttctaacgc
-ttcataatttttgttaaagagcaggttagtactttaagaaaaacctgttgtgcttttatt
-ttaatgtccagttcacagaaaaactggatgacacccctttaactttagccaatatgttta
-cacacagaaattcctttacaattaacatttcaaaacttgcttaaaccttcaaaacaattt
-tttaaccttttaatgtaggtaaaaatccacattcttatgccttcttataatccttttacc
-aaaagtatattttactttccttacacgccttgaacataaactgtttcttcaatagtttta
-cattcaggaggcctaattacttttaaattatacaacatttcttgcataaattccctttta
-taacattttccacgactttcacagaccatctttgacatgacttaaatttctgacttgtga
-acattcctttctttaaacaaccagttaatttattttaggatgagaatttaccgtataaga
-ttctttttacataaattctccTTTTTTCTTAATGTcaaagatgataattgttttttccca
-aagcaaacttccctcatgtctgtggactagactgcctaaggccacaagattagaagttag
-gataatacatgttacactgttaacttttagcaaattttacttctgttgaaaaccttgtaa
-gtttggaattttaattaaaggaaggcttttttggtgtccggggacatggacaatagttat
-ttttttggcaactgaaggttatttaatacttgggtgattaattcctcgtggaccgggtct
-tgacctttgctattaataagacctggttcagtccaaatttttccacatgcatgagccact
-ccaaaggcacactgaaaattggtatagatggttccttcctggttctgtaagtactttaag
-gcttggctgagtgcaaacagctcacacgtttgagcagaccaattattaggcaattttcct
-aactctatctctacACCTTTAACCATTGTTCCCTATTTCTCATTCAAACTTGGACATAAC
-GGTATgtgaaaaagagcctcttgtgactgttacctctttacaatggaatgttaagcaacc
-cctcagaaagtagggagtagcaaatcaaatctttgtaactacatttcagcctttgccggt
-tgaaatgtcagagccccggcatcagaaagtggtcaactcaagggctgataagaagaattt
-accaacaacagtataggtttgaaaagtaaagttttattagaaagaaagaacattgcagaa
-gagtgcagcgaggtgcctcagcaagaggggactgagagggctgtggtggatattccttag
-gcgcatatatgaaccttaaggcaaaagcttgagggtaatttggagcatactagccacgta
-ggttatgataaatggttacatttgtagttattttggtgccttaatgtcagcaaggattgc
-acagtgagtttcgcatagaaattctggttactacaaaatttttgaaagacccctggaacc
-agatgccaactttagatatgtcgatgaagagtcaaactctgtaaaatatttgaagagatt
-tattttgggcgaaatacgagtgaccatggcccatgacacagcacttaggagatcctgaga
-acatgtgcccaaggtggttcgggcgcagcttggttttatacattttagagaggcacgagg
-catcaatcaaatacatttaagaaacacattggtttggtccagaaaggtgggacaactcaa
-agtgggaacttccagactataggtaaatttaaacattttctggttgacaattggttgaat
-ttgtctaaagacctgggatcaataggagggaaatgtttaggttaagataaaacattgtgg
-agaccaaggttcttttgaagtcttatagtggctgtccttagagacaatagatgacaaatg
-tttcctattcagacttttaaaagctgctagactcaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaggctgccagactcttagttaatctcagagggcctggaagaaaaagatctagctatat
-taatagagattatttacagatgcagatttccccccacaaaggacagctttgcagggccat
-ttcaagatatggcaaagaaacatgtttttgggtaaaatatttttgctttcttctttgtca
-cataatgttatgccagagtcagattggaaagcaagtcagatatataggtttaaataaaac
-ccatctgatgagaatttatggtttgtagggcatgactccccagaccccttagataggaat
-ttcagcaaaataaaaagatcagagcttagtcctcataatcaagaaataaccataaaaatg
-ggcaaccctatggagtagccattcttttattcctttactttactaataaattttcttttg
-ctttgcactgtgaacttgccctggattctttcttgtgtgagatccaagaaccctcttgtg
-gggtctggattgggacccctttccggtaacGATTAtacttctaaattcctcagataagga
-gtttttgtctcgggctgcttcagggtcaccaggtgatttttgctctcctcaCCCCTTTGT
-TCAGCTTCTCTGTTTTTGCCTATGTACACAACTCTCAGATTTGGCCACtggggagagcaa
-agttatacctggtgaccatcaagcagaccattcagagacaaaactccttatcagaactcc
-ttattcagaagcaattagacttccctattatctaaagcaggcatctcattccaggcttct
-ttcccccaaatttataagtaactagaatttctatgcatctctggaatgcatgcatatcaa
-aactcacggtgcTgaaaatttgcatctgtaaagaatctctattaacatagctggatcttt
-ttcttccaggccctcccaatcctgaagagattaactaagagtctaacaccttttgatggt
-ctgaataggaaacatttgccatctgttgtctctaagggcagcgaacataagacttcaaaa
-gaaccttggtctccacaatcttttatcataacctgaacatGAGTCTCTTGCTGATATTAA
-GGCATTGAAACCACCTTTGCAAAATTATTACAGACAGcatcattgcaggaatccaggaca
-ctggagtagaggatgttccatacctttgggttacaagccacccccaggaccttgtcctca
-ttgcaaacaagagggtcattgtgatatggaaggggggcaggggagtgctgggtacagaaa
-tgcagggttcctggtgagggctccacccttgggcctgtgcccacagacctaagtaagaac
-aggcactcctgttttcatgcctgaatgttgtattttccaagaccactctggcccaccaca
-tccccttcctgtgtccataTtgttaaatatgaattctaaatttctcttcaaagaattaat
-atgtcagtatgttcaattctttgacttctgcttttaaatttaacttcctcgtaaagcaac
-ctttttcgattacctgctccaccctgactcattccgattacctgctccaccctgactctt
-gcaggttacttgctacctgctccaccctgactaattattctccaccctgcataaccattt
-ttttttcccgccaaagcactcatcctgtcacactctttaaatctgccaattggaattagt
-ttagcctgtgcagtctaaccctagccaataggggaacgacacagcagcaggagccttgtg
-cattagggataagaacccctttccctcccttgtccaggtgtacactcaccattgctctac
-ctgtgagggtgcacccttctatagaagtaccttgccttgctgagaattaaaaagaaaatt
-ttatattcgagtgctatttcttttgcggcactgaaactttatatgtaacaatttgggggc
-tcgccctgattacatttccctctggggcagtctctggttctctcttgtgaggagcgctcc
-gccccctgtggcggcctcagccgggagaaatcagaacccacccagtgcgaggaacaaccc
-gagctgtcagcaacaggggggaagaaaactggccggcaacctagcttaaagaatcctcac
-atactgcagcgacgactctgcgcacagagcaaggaaggagaagccgcgggagctggtaaa
-gtatttccttggtggtcgggaccaaggtaagaaagccacgggggtggtgggcggtgaagt
-actccttggtcagggtggcttagaggttaaaaagaggtgagacatccccattggcggaga
-ttgaacctcacacaaacctccagtagtagaaaaggcaagaaatttccagtggggaaattg
-agcctcaccccaaaaggtaagaaatttccagtaagggaaagtgaaccttgaaccttatcc
-caaaaccatcaagatgggaaatatcccaagcaagacagggagcaagggggataaacatgg
-taacaaagatatccctccagatggccccctaggtctcatgctaaaacactggaaggataa
-tgaaaggatacacataggaaaaagcaacaaatggtaaaatattgctgttttatttggagt
-cagggacccatcctcagtccctcaatcttctggtcaaagtttgggtcaaatgagaatgta
-atgtgtcagcttctaatccgatacgttaatgataaaagtccagtgtctcaagaagaacta
-ggctatgccctttgttggaggcaaggacctgccctcctatttctcttaaaaataaatagg
-gaagaacccaatctggcacctcaaaatgaaaagtcagaggagccagctctcatgcctaaa
-gactccagtgctgcatggtatcccctagaccatcttcccccactcagtgtccccaaactt
-tcccctcagacagccactgccacctcagatcaccactgccacctcagatcctgttccaaa
-ttccccctctactcacgctatccctcctccttataaccctgactgttgggaattaccatc
-ccaccagcctgttctctcccaacctaaagacccctctctaaaaagactccagcgtgaggt
-agaacaatgtaaaaaagatattcagaatttcctatttccctccgtacctaagaggtcagc
-ccctaccctcttccctttgaaagaggtaccacaagttgggggcgggggggggggcattga
-ctttgtaaatgctcccttaatcagttcagaagtccagaattttacaaaggagcttaaact
-gctgctggacgacccttacagagtggcagaccaaattgaccaattcttagaacctcagtt
-atacacttgggtcaagttaatgtccatcttgggcatcctcttttcagggtaagaaaggag
-tatgattcttaggtctgctatggtagtttgggaatgtgagcaccctcccaatgaaaacgt
-tcctaccacggaccagaaattccccgcccaggaccccccatgggaaaataacaatgcaga
-tcaccgggaaaatatgcaggacctaagggagataataaaaggaattcaggaatcagtacc
-ctgaacccaaaatctttctaaagcatttgatatacaacaggaaaaagatgaagggcctat
-gagattcctagacagactgagggagcaaatgaggcaatatgcaggcctcaatttggatga
-tccccttgggcaaggaatgttgaaactccaatttttcactaaaagttggccagacatttg
-aaaaaaaaagttacaaaagatagacaattgggaagaccatcccttaagtgagcttctcag
-ggaagctcagaaagtgtatgtgaaaagggacaaagtaaaacgaaacaaaagacaaaactt
-atgtttttcaccttccaacagatggctccaaacccaggtacttctagatagagtttccag
-ggagccagaaactataaagggtccgaatcctcttttaaagaaccccagcctccatctgga
-ggaccagggtccttgtctaccaagccccctaaagagtatgggggagaagggttaaagaat
-cccagaactaaggggaggaaggacaaaataggtgctatagatgtggaagagcagaccact
-tcaggagaggatgttctgaactaagaaaggagaaagaagccctttcactcatgactttca
-aggaagaatagcggggtcaggggctctgtctcttttatcttgagtcccaccaggagccct
-tgataaatttgggggtgggacctaaacatgagcttatcacctttttagttgattcggggg
-ctgctcgctcctctgtttccccccatctaatgttgtctccttcttagaggaacttttagt
-ctccagggtaaaaggtgtaggattaagagcaaaaattttagaaagcactgaagttagata
-ccaggatcgctcagcttatattcagttcttgtttatccctgaagcaggaactaatttact
-ggggaggaatttaatgttaaagttgggcataggtctacaagtcagcccaagaggattcct
-cacctcattaaacctactcaccaccgcagatgaaaaatatattaatcctcatgtcttgac
-caaagaaggaaaccaagggaaactctaagtccctccgatccacatcaagctaaaaaaccc
-aggggaagtagtaagaaggaagcaataccctattcccctagaaggtaggatagtgttgaa
-acctataattgaaggccttatttaggatgggcttcttgagccctgtatgtctccttataa
-catcccaatcaagaatcaagaaatcaagactgctaccagccagtcaagaaattagatggg
-tcataccagctagtacaggaccttagagctatcaaccaaatagtccagagtacccaccct
-gttgtcaccaatccttacaccattcttagcaagattccatataatcatcaatggtttact
-ataataaatttgaaggatgctttttgggcatgtcccctggctgaagatagctgagatata
-tttgcttttgagtgggaggatccatactcagggtggaaacaacaatatcgatggaccgtc
-ttgccccaagggttcacagactcccctaaactttttggccaaattttagaagaagtacta
-gaaaaagttgtcatcccagaacaaatatgccttcttcagtacctggatgacattcttata
-tctggtgaagatctagagaaggtaactgacttctctacacatattcttaaccatctgcag
-tttgaggggctatgagtctcaaaaagaaagcttcagtatgtagagcctgaagttaaatat
-ttaggccacttaataagtgtaggcaagcgaataatagggcctgaatgaattgagggaatc
-gtgtccctacccttgcctcaaactaaacaagaactcaggaaatttttagggtcagtcaga
-cactgtcgctaatggattgactcatatacactgccccgtaaactgttctatcaaaaactt
-gcccaggagaagcctaaccgtctcctgtggacttctgaggaagttgatcaaatcgagagg
-ttggaggaaaggctcataactgcccctgttttaggcttaccctccctagaaaagccattc
-cacctttttgctaatgtggacagtagggtaccttcgggagtgctgactcaagaacacaga
-ggccgccagcagcccgtagccttcccatcaaaggtcttagacccagtcacttgtggatgg
-cctcaacgcatccagtccatcgctgctatggcaatactaggtgaggaaagcagaaaatta
-accttcggaggaaaattgacattaaacacgcctcaccaagttagaactatcttaaaccag
-agagcagtgagatggcttactgacttgagaatcttaaagtgtgaggccattctgttagaa
-aaggatgatttaacattgaccactgataattcactcaacccagcaggtttcctaacaggg
-aatccacatctaaggagggaacacacatgtttagatttaattgattaccatacaaaggtt
-tgaccagacctgggagaaacccccttctggactggacggcacttactcatagatggttcc
-tcccaggtgattgagggaaaaagacacaatgggtattcagtgattgttggagaaactctt
-gtagaaataaagtcaggaaaattgcccaacagttgatctgctcaaacgtgtgagctgttt
-gcactcagccaagccttaaagtacttacagaaccacatctatacagattccaggtatgcc
-tttggagtggcccatacatttgggaaaatttggactgaacgaggtctcattaatagtaaa
-ggtcaagaccttgttcacaaggagctgttcacccaagcattgaataatcttcagttgccg
-gaagaaatagctattgtccatgttcccggacaccagaaaagcctttcttttgaaagttga
-ggaaataacctagcagatcaggtagccaagcaggctgctgtgtcttctgaaatgcgtgtt
-tttcacttaactccctacctccctcctcctaccataatccccattttctcttccaccgaa
-aaagagaaactaataaaaataggtgctaaagagaattcagaaggaaagtagatactgcca
-gaccagagagaaatgttgtctaaaccctttatgagggaagtcgtatcccaactacatcag
-gggacccattttgggccccaggccatgtgtgacgcagttctcagagtttatggttgtata
-ggaatttataccctggcaaaacaggttacagatagttgcttagtatgtaagaaaactaat
-agacatactataaaatgattacctctcaggggaaggaatccaggctaaaggccattccaa
-agtatctaagttgattacacagaaatgcctctgatagatcatctaaaatatttactagtg
-atagtaggccacctcactccctgggtcgaagctatccccttttcaaatgcaacagccagt
-aatgtagttgaggccctaattgaaaatatagtacccaggtttcgactaacggaaaatact
-gactcagacaatggaactcatttcaccacacacattattaaaaagctattccaaaatatt
-agacattagatgggaacaccatactccctggcacccaccctcatcagggagagtagaaag
-aatgaattagactctaaagaaccacttaaccaaattagtcttacagacttggttgccatg
-gaccaagtatcttcctatcaccctgctgagaatttgaactgcaccatggaaagacattgg
-tctttctccttatgagatgctctatggattaccttatttgcactccactgttgatattcc
-tacctttgaaacaaatgatcaattccttaaaaattatatacttggtctatgttctacttt
-ctcctctcttaaaactaaaggtctattagcacaggcaccacccttggagttcctggtgca
-tcaacattagcctggggatcacgtcctcatcaagagctggaaagaggagaagcttgagcc
-agcctgggaaggtccttacttggtgctcctaactactgaaaccgcagtccgcacagcaga
-gagaggatggactcaccacacccaagtcaagaaagcaccgccccctccagagtcgtgggc
-catagtcccaggggaaaaccctactaaactaaagctaagaagaatttaactccctttcat
-ctattctattactcttttttctttcctcactctattgctgaccatatagttattaacata
-accaagtcaatttcacctcaactattgcatttgatgcttgccttgttatatcctgtgggg
-atttgtcaagccaaagaaagctctctacttcagatacctctgtccctcctggctctcctc
-agactaggcattagtgaatcgggaccatttaatctggggagatttctataaagatcccag
-tggcaaccaggagtcttcccccagtgatgtagagcttttaagccatagttggtccaaagt
-tctgtggaccattaaagagcaaggatggattgccccaaccagtttttgtaatttcctaaa
-ttcatacattcgttttactaaagggacagtgcccactaactctcagctaaaccagtgcaa
-ccctatacaggttattattttgagcccacaaaattcttcctcttttctaagctggttccc
-ttctttaagccagttttatggtatgggggctgaagtttcagggacagaccctattggatt
-ctttgaaatgcacttctttgatcccctgctgtctgcacctgcctctgagcctttttccaa
-aacctctcacaacggaaccattgttcctcctctatctaacgacaaggccaagatagcgat
-ggtagaagttaaagacttaaaacaaactggcaattgagacaggataccaagatgtaaatg
-tttggttggaatggatcaaatatttcatccacacgttaaacaaaagcaattgttatgctt
-gtgcgcacagcaggccagaggcccagattgtcccctttccactagggtggtcctccagtt
-gaccgggcatgggctgcatggtagctcttttccaggattctatagcctggggtaagaagt
-tgtgccaagctctctctctgctatatcccgaagtttgacaccttgtgggtcagcccccaa
-gggccatccagcttccatctcccaacactaagtttacttcgtgtctctcatgacagggag
-gaaacttagtgttccttggagacctgaagggatgcagtgagcttaagaacttttggccag
-gcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcggatcacaa
-ggtcaggaaatcgagaccatcctggctaacacgatgaaaccccatctctactaaaaatac
-aaaaaaaaaaaaaaaaattagccaggcgtggcgtcatgcgcctgtagtctcagctacttg
-ggaggctgaggcaggaggatggcgtgaacccaggaggtggagcttgcagtgagccgagat
-cgtgccactgcactccagcctgggcgacagagcgagactctctctcgaaaaaaaagaaaa
-agaactttcaaaagcttaccaatcagccagcccttgttcatcccctagcagaagtgtggt
-ggtattgtggtggacctttactggacactctgccgaataactggattggcacttgtgctt
-tagtccaactagctatccctttcaccctggcatttcatcaaccagaggaaggaaaaataa
-gacatcgtaaagtgagagaagccccttatgggtctttagactctcacttctgtttagacg
-caattggggtcccatggagaatacaagatcaatttaaagtctggaatcaaatagctgcag
-gatttgagtcaatatcttggtgggtgacaattaataaacatgtagattggataaactaca
-tctattacaaccaacagtgatttagtaactacactagagatactgttagaggaatagctg
-agcaagtaggggctacaggccagatggcttgggaaaataggacagccttagacatgatat
-tagcagaaagaggaggggtttgcatcgtgactaaaactcaatgttacaccttcatcccaa
-acaacattgcccctaatggaagtataacaaaggcattgcaaggtctcactgctctatcca
-gtgagttagccagcagctcaggggtaaatgatccctttacaggatggctagaaaaatggt
-tcggtaaatggaaaggaataatagcctcaattcttacctccctcgtagctgtaataggtg
-tacttattcttgtcgggtgctgtgtcataccatgcatccgtgggttggtgcagaggctcg
-tagaaacggcacttgctaaaacctcccttaactatcctccaccttatccagagaagcttc
-ttcttttggaaaatcaagcagaacaactaagtcaagacatgttaaataagtttgaagaga
-aagccgtaagaaaaatgcaagaggaggaagttgttaaatatgaattctaaatttctcttc
-aaagaattagtatgtctgtatgttcaattctttgccttctacttttaaacttaatttcct
-cataaagcaacctttttcgattacctgctccaccctgactcactccgattacctgctcca
-ccctgactcactccgattacctgctccaccctgactcactccgattacctgctccaccct
-gactcattccgattacctgctccaccctgactcattattctctgccctgcataaccatta
-ttttcccgccaaagcactcaccccatcactctctttaaattagccaatcggaattagttt
-agcctgtgtggtctaaccctagccaataggggaatgacatagcagcaggggccacatcct
-tcagggataagaacccctttccttcccttgtccagatgtgtgctcaccattgctccatct
-gtgaggttgcacccttttatagaagtaccttgccttgctgagaattgaacagaaaatttt
-atattcgagtgctatttattttgaggcacagaaactttatatataacaatataaacccga
-gaccttggcgggcacacacacaagcagctgaatgtcaagaggaGTGGAGGAACGGAGTGG
-CAGAGAATGGCAGAGAGCGCTGGAGAGTGGCAGAGCAGCATGGCAGAGAGGGAGGGAAGA
-GGCGTCTGAACTTtggaagacacctccactcctcaataaagtctccgcatgtatcacttt
-tcaaacagttcatgtgacctgattaatccaggatgccagacaagaatctgggGAAgttaa
-cattcaggcatccctggatggcaaggctaaaggagcacactgtaacatatgcccacttgg
-gctccagcacctgtccatctgtgtgttcccccttccctcaggggtttgagcagtggggtg
-accaaacagacgagccacaccccctgttgcatgtcctgcaaggagaatcagggaactctc
-ctgtttcaGttggaagagcaagtgtccctctctctctcgtggtggggagacatctcttcc
-ttctgggctgtcacagccccaacctcaccaacctacctgacaagggagtctggcagaaca
-agggcaagggcagggagaagcacctctaactctattcctggataataatcaagtctctaa
-aagtcatcctggagccgggcacagtggctcatgcctgtaatcccagcactttgggaggct
-gaggcgggtggatcacctgatgtcaggagttcgagaccagcctggccaacatggtgaaaa
-cctaactctactaaaatacaaaaaaaattagctaggcatggtggcaggtgcctgtaatcc
-cacctacttgggtggctgaggcaggagaatcacttgaacctgggaggcggaggtcgcaat
-gagctgagactgtgccactatgctccagcctgggtgacagagagagactctgcctcaaat
-aaataaataaataaataaataaataaataaataaataaataaataaagtcatcctctagg
-gctttgaggccgttcaagcccctattttttccatctctgtggatgagcctctgttaaatc
-tgattgtggctgaacaagagataatgttcctaatagatacagggaccagttattcagctt
-taagtgtttattacagcccaatgtgctagtcctccatttcattacgggtattgataaact
-tcagtgaggctgtttcacactgccactcccttataaaatgaaaggctattcctttaccca
-ctcttcagtcctgccaagctgccctgtttctttattaggtcacaatttgctcacaaaatt
-acaagcgaatttacagttaagacctcacattctagctgtaattaactcacacttcaccaa
-aaaagttgctgcagtctatagaacatcacattttaaaacaagtgccggccaggcgcagtg
-gctcacgcctgtaatcccagcactttgggaggccaaggcgggtggatcacttgaggtcag
-gagtttgagaccagcctggtcaatatggcgaaaccccatccctactaaaaatacaaaaat
-tagctgggcatggtggcacacacctgtaatcccagctactcaggaggctgaggcagggga
-atcacttgaacctcggaggtggagattgcagtgagccaagatagtgccattgcactccag
-ccctggcaacaagagtgaaacgctgtctcaaaaaaaaaaaaaTTGTTCTTTTGTTTGCTT
-TTCTTTCACCCTGATTCCTCCTTCCCCCTTTGCCGTCTTCAGTACCAAGCTACAAAGCTA
-GGGGTGGCTGAGGACAGTAAACAGAGTGTGGtcttagctggctttttccctcctgggaag
-ttgttgtttaggatcctaattctagttcagaggtgcattctaaatagtcttctccattgc
-ctttccccccaaaattaatctcacacgttggcttgtgtgtgcattcacgtgaggaactga
-actgtcattttcatagataaataagagactgagtttccttagctccaaagagaaagggca
-ttttgctcctcccagcagaaaggtacccgagtgactggggggccttgcgggagtgttggg
-gggttgagcccccagcgacatgaagtgattctgcagggaactcacaacaaaattagtttt
-aaaaaggctcgtccaggaagcacatataggaactggtcactctgagttttgagccctctt
-ggaggtgctagacctccggagaaaacactgagacacctaagagggtggtggcaaggattc
-agtggtgacacactgtggagtctcatctgcaaccattacacttcgacctactccacaaaa
-accctaggccacagctcagttactccttaaaagaaagtgggaaacaaataatctaagaat
-aaggaaaaacaaggtgttgacgaaaagagttaaactgtgtaaaatagttgaagatattta
-ttcagagcccaatatgagtgactatggcccgtgacatagcccttaggaggtcctgagaac
-acgtgcctaaggtggtcggggctcagcttggttttgtatattttaggaaggcatgagaca
-tcaatcaaatacatttaagaaacacattggtttgattcagaaaggcgggacaattcaaag
-caggggtcagggtgagggtggcttccaggctataggctataggtaaatcggtaaatttaa
-actttttgttttgttttgtttttttgttttgagacagagactcactcttccacccaggct
-ggagtgaagtggcacaatctcaactcactgcaacctccgcccccatgggtttcaagtaat
-tctcctgcctcagcctcctgagtagctgggattacaggcacccaccaccacgcctggcta
-atttttgtatttttagtagaggcagggtttccccatgttggccagagtgatcttgaactc
-ctgacttcaggtgatccaccggcctcggcctcccaaagtgctaggattatgggtgtgagc
-caccttgcctggtctaaatttaaacattttctgattgacaattggttgagtttgtctaaa
-gacccgggatcaatagaaagtaaatgtttaggttaagataaaagactgtggagtccaagg
-ttcttttgaggtcttatattggctgcccttagagacaataggtgacaaatgtttcttatt
-cagacctttgaaaatgtgctagactattagttaatctcttcaggattgggagggcctaaa
-ataaaaagatctagctatgctaatagagattctttacagttgcaaattttcccccacaaa
-gtacagtttggcaggaccatttcaaaatatggcaaagaaacatgttttggggtaaaacaa
-ttgactttcttcttggtcatgtaatgttatgccagagtcagattggaaagtagtcatcat
-atataatgttaaataaaatccatctgatgagaatttatgatttgtagggcatgactcccc
-agaccccttagataggaatttaggcaagatagaaaaaatcagagcttagtcttctcacaa
-gagaatgaccctcttttaggtaccccattgattttacggcatctctactttgcaagtgtt
-tgtgtaaatggacatattatggtctctttgtgcacaattatgtcaaagacaatttagagc
-ttgaaggttgacctccagctgtaaagttcctaagttctctatctctctgctttcttttct
-gcctgttttaagtctgctattatttttctttctttttttgagacagagtcttgctctgtg
-cccaggttggagtgcagtggtgcaatctcagctcactacaacctctgcctcccaggttca
-agcagtcctcccacctcagcctcctgaatagctgggactacaggcatgtgccaccactct
-tggctaatttttttttttttttgagacagagtcttgctctgttgcccaggctggagtgca
-atggcatgatctcagcaaaccaacgagtttctattaatatctcatggctagagttctgag
-ataatagctataggatctttggttgtatgagtatgtatgtgtgtgtttatgcatacatac
-acttatttcattgtgttttctagccacaggtactgaattggcttaaagttaaagaatatt
-cataaattaataagcctaaatgcttttcaagttcatgtgacttaagtaaaatctttaata
-agctagctttaaaattattggtaaagtaatattagaaatgtcttaaaaattgttagcata
-aatttttgtttgcatttattgatcaagggacttcatatactgccaaatactgtaaggtgt
-caaaatttggcatagggtttgtaaaactacaaaaccgttcaaaacagaatgatttttgct
-tttgtaatttttgataaataagacattgatattggtttaatgaaaacagctaaatcatga
-attatttagtgaaataacaatatatttaatcttaaggtttttacttagcaaacacctgaa
-attcacaggctatcaaatgtttgacagggaaataactttaaatgatgactatcacagttt
-tcataactaacctgggtaaactattaaaataaaatatttaggtaaatgtaatgggataaa
-tacttgtagacaaagttgtcataatttaggatctaaagttatgttaaattaaacaataga
-tatttcattaactgggtttttttaattaaaaaagatattgcaggaaatcattttttttct
-aaaaaatgtgttcttgttaaaaggaggataatttttgtctaattcaaagcttatttaaag
-gttatatataaaataaggtaaaaagaaacaagaaaatatataaagaagttatagaaataa
-aaaagaatttttggtaagaaagcttaaagaaaaataattttacatgagaaagaaccttgt
-atggtacatttttgtcctagaataaaatgactggttgtttaagaaagaggaatgttcata
-caaaccagaaagtccaagcatgtcgtgaatggtctgtttaagttataataagagcattta
-tggaaaaagacccacaaactttcatataatcaagttgtctataattaaagggaaattatt
-tataatgatcttttgagagattgggttttgatattaaaaaacatttatacactaaagaat
-tcattagaacaacattttcttaaggtattgatttacttttaataaattacaagactatat
-atataatatattttttcctgcaaagttcaacttttattgcatctcactgttttcagcttt
-ctctccccttttaaagtacctgaaataataactctatctttcaactcatttttagctcct
-gtaagtttttttattttctcctttgtgttctaactgttgtggcctgacgctaataaatgt
-tttatctttgtggtctaaaggaaacattccttccaacataatatttcctgtagggaacag
-cggttgaaatgcagaaggtgttttgttttccctttgggaaattggcctaataaacagagt
-ttatgctttattgaaataattcctatgtcattattactaagttttggtttgtttagaaaa
-aaacccgagattaaattttttttaattaagattattacatacatgtaaccctctgtatgt
-gcttttaaagtccttgtgccattaagttacagagctttgagtccttggtctaaaaagaac
-accaagtcctgctaaatattaaacactgacagcagttaaaacctcattttctgacctggt
-agaagatgccaatcaaaataaactgtgttcatgagacagaaggccggaaattaaaacgat
-tcaactcctcaaggtctggagactatcaaagaagaggtgggtgcatgagattgtaagggc
-cgattttgagagatcaaatgattataaggccaattttgagagataaaataattgagtttc
-tctataaattaaccattaatctcaaaggcacactgatgcaagactagcatatgggctgct
-gtgtcacgttaacaaggttttcttggagaattaacccactccttaataaaaggttataaa
-agaggttataaaggttataaaaaaggcttgtggaatttttatcttgtggtcaggatgatt
-aaaattttatagattgtttatacattttgaaaaacaaatttaattggcctcgtttttatt
-agggcttattgtttaggcaattaagtcttctctctcaaagaatcaaggtttttgcctttt
-ttttgaaatctttgagttatcaagttgagtaaatgaaagacttattttacaatgacttga
-tctgtgatcctattttgtgatatcaagcattttatttatttatttatttatttttgagat
-ggagtcttactctgttgcccaggctggagtgcagtgctatgatcttggctcactgcaacc
-tccacctcctgggttcaagcgattctcctgcctcagcctcccgagtagctgagattacag
-gtgcctgccaccacacccggctaatttttgtatttttcatagagacagcatttaccatgt
-tggccaggctggtctagaactcctgacctcaggcgatccacccaccttggcctcccaaag
-ttttgggattacaggtatgaaccactgtgcccagccaaatcaagcattttaaacttttta
-tttttatttttaaaattttaatattttgagatggagtctctctctgtcactcaggctgga
-gtgcagtggtgcaatcttggctcactgcaacctctgcctcccaggttcaagcaattctca
-tgcctcagcctcatgaatagctgggattacaggcacttgccaccacacccagctaatttt
-tctatttttagtagtgacagggtttcaccatgttggccaggctggtcttgaactcctaac
-ctcaggtgatccacttgccttggcctcccaaagtgctgagattacaggtgtgaaaggtgt
-ttaaaggccactgtgcctggcctttaaactttttatatttgacaaactttccaaagtcaa
-attctaacttggttcctcaatgattttttgatattagtcccctgaagtccaaaagagaca
-cagtcagcttatttggcataaaaatcatacaggaagcattgtcaaatatgtaatagtgtt
-tggctttctttgggctgtatttgtataaatatgttattggcatatgttccaaaattatgg
-gaaaatcctataattatgaatgacttagtatatgttattaatcattatcattattatgta
-aaattattgtatgctacagaagtaaccaagtttctttgtcaattgtgtctttaagtatga
-cttttctaaaacttttgtcatccacagttgttttacttttatccttttcaaaaggatgat
-tttacaatcagcataggactctgacagttgctgttgaatacaggttttggagatagtgac
-actaaaatagagaaaaaaaatccaacactcccatagagagctgaaatatacatgaatagc
-aagcagaagaggagttaactgcatggactgaactaatagaagactgaaataatccttcta
-tgactttttgcttaaaacattgctaatcctttctttgtttttcagagccaagaaaacatt
-tattttgagcttttaaaaaatttattattattattattattaacaaataaataatcttct
-ttctttttttcttttatctttctctgcagggcaagttctgtatttatagcttttaacaat
-tgaggaaattatactcctataaacaaaatttggagcatatttctctctatctggtttctc
-taaaatttggaaactagttgggagtattcttaacttatagcaatatagttatctgcacaa
-gtacaataagaatctgttttcttttgtaagaggacataattggggacagtggtgatttta
-ccaaggttttgactggaacaacatgctatcagatgcagactcctttaaggaatcaaagtt
-gacttacagagctaataaaagcatcttgggaaagctggcctcctatcttgtctacacagt
-ccctgtacaggttcctgacctgtggtaagtaaagagtgtcactttctaacaggcccagga
-gcccaaagtcttcctgaggtgaggaattcatccaattaatacaggtatttgcaggcacag
-gccgggcttaagacattaaagtcgaatgtgagattacttatggaataaagttccagcaaa
-gccaattaaaaaaaaaacaaggagcctatatggcaaataattattcttgatgattttatg
-caaatactccagccaaatataataagacagaaacttattttgcaaatgaattttgttcta
-taatttgtcctcagtgaaaggggactggagagagaaaaaattatgtttcaaaatcaccta
-tagtacacctgttgttagattttagtctcacttagtgtttttaaatttttattattttct
-atagtttggactaaactctaaaatttttcctggtcacaagtccccaaaataatttttttc
-attttttttcttttttcctttccttttccccccacattttttcctgattagaaatcacca
-aacattaaactgtgctttcctaaagccctgtgaactaaagctagacaatctatttacata
-cataagctactttcatacctgcctactggtgtatgaacttcagagtaatatggcctatat
-tgatttcccaggattattgttgttgttgttgtttttctcctttcctcccccattttctct
-taggacgtgagacttcacaacctgctaaagcgagctttcctaataatgtggaacctacct
-gtctatgaataaactgtcctagtcatgagagatcagacaaaacctgagaccagaggctaa
-ttttcttctaaaatgcttttaaaaagaaaaggggggaaAtgtgaaaggaaaataaacttg
-ggaccctcaaatcactaagccaaaacgaaaagtcaagctgggaacggcatcgggcaaacc
-tgcctcccattctaatgggatagctaaataagatagctacaaagattttaaaaagctaca
-tacctccctcacaattttcccacaaggaaattccttgtgtacctagaacagacagaactc
-aaagtcatccctctgctcatgggagacaaatgcacatctgatggcttcctttgccctatt
-gcttcgctaagccagactaaggcataagtgactattcctgcaagttgcatattcagtgga
-gggctaatcagaaactcaaaagaatgtaacaatttgtcctttatctacctatgacctgga
-aaacccctccccacttcaggttgtctcacctttctggatggaattgatgtacatcttacg
-tatttgctgactgatgtctcatgtctccctaaaatgtataaaacctagctgtgccccaac
-taccttgggcacatgttatcaggacctcctatggctgtgtcactggtgtgtccttgacct
-tggtagaataaattttctaaattgattgagacttgtctcagataactcttgatttgcagt
-aagtagcatttctaaacatctctggaatgcatgcatattgaaactcattatgcaaccctt
-gctgacatcaaggcaggaaaatgtctacaaatgtaatcatttagcgtgacctatgtggct
-aatgtggaccaaattatccttaagctcctgctttaaggtgcataaatgcccctgaggaaa
-aatccaccttggcactctccatcctatcttgctgagattcttgcctgcactcttctacag
-agttctttctttctaataaaactttccttttttcaaaccaatactattatccataaattc
-ttcttctttttttgtttttttgaaacggaatctcactttgttgcccaggctggagtgcag
-tagcatgatcttggctcactgcaacctccacctcctgggctcaagtgagtctcctgcctc
-agcctccagagtagctgggattacagacgtccaccaccacgtccagctaatttttgtatt
-tttagtagagatgaggtttcaccatgttggccaggctggttttgaactcctgacctcaaa
-tgatccacctgccttggcctcccaaagtgctgggattataggtatgagccaccatgccca
-gcagtaaattctccttactaatccacgagtggaccactttccaatgctgaggctctgaca
-cctcgctgggcaGCCACTTTTGATTATTTTGGGTTGTCAGGGCTCAGGGACACAAGAACT
-TGCTCCTTAGGGGAGCTGGAGGTCTAGTAGGGATTGCTTGTTCTCCATCAGGCCCCTAGT
-AGGGAGGCCTCTCCTGTCCCCAATCCCTGACTCCCAGGGATGCTCCCCTCCAAACCACAG
-caggaagttcctccttaggtcagacccacagccctgatgctgtggtctCACTGCAGGTCA
-TAGTCTCACAGGGGCCTCTTATAttattttaattttaattttaattaaattaaattaatt
-ttttttttttagatggagtctcgctcttatcgcccaggctggagtgcggtggtgtgatct
-tggctcactgcaacttctgcctcccaggttcaagtgattctcctgcctcagccacctgag
-tagctgggattacaggcatccgccaccatgcctggctaatttttgtatttttagtagaga
-cagggttttgccatgttgaccaggctggtctcgaaatcctggcctcaagtgttctgcctg
-cctcagcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggtcttatatta
-ttttaattttaaatttaaGAATACATTCTTAATATCAACCTTCAAAGACTCCCTGTTGCT
-TACCAAGTTAAGAAAACTACTTAAACCTCACATATAATTCCTTTCTCAACTGGGACCAAT
-AAACCGTGACAGCTTTATtgaagggggccagccccttcacacctgtgggtatttctcgtc
-aggtgggatgagagactgagaaaagaaatagacacagggacaaagtacagagaaagaaca
-gtgggcccagggcactggcgctcagcatacgaaggacccgcaccggcgccagcctctgag
-ttccctcagtatttattgatcatgatctttactatcttagcaaggggagtgtagcagggc
-aacaggtggggagaaggtcagcagggaaacatgtgagcaaaggaatctgtatcatgagta
-agttcaaggaaagatactgtgcccggatgtgcacgaaggctagatttatgtttctcttta
-cccaagtatctcagtgtagcaaagagcaacagagcagtattgctgccagcatatctcgcc
-tccagccacagggcggttttctcctatctcagaatagaatgaatgggaatggtcggcttt
-acacagagacattccattcccagggatgagcagagaagccttcctcttatctcaactgca
-aagaggcctccctctttcactcctcctcctcagcacagaccctttatgggtgtcgggctg
-ggggatggtaaggtctttcctttcccatgaggccatatctcaggctgtctcagttggggg
-aaacgttggacaatacccaggctttcttgggcagaggtccctgtggctttccacagtgca
-ttgtgtccttggttaacagagaatggagaatggcgatgacttttaccaagcatactgcct
-gcaaacatattaacaaggcacatcctgcacagtcctaaatccattaaactttgatccaat
-acagcacatgtttctgtgagcacagggttggggataaagttacaagttaacagcatctca
-aagcagaaacaatttttcttaatacagatcaaaatggagtttcttatgtttccttttcta
-catagacacagtaacaatctgatttctctttcttttccccacaCTTTCTCACGTGttctt
-tctttctttctttcttttcttttttgagatggagtctcgctttgttgcccaggctggagt
-gcagtggcgtaatctcagctcactgcaaactctgcctcccaggttcaagtgattctcgtg
-cctcagcctcccgagcagctgggattacaggcatgcaccatgacgcccagctaatttttg
-tattttcagtagagacgggtttcaccatcttggccaggctggtctcgaactcctgacctc
-aagtgatccacctacctcagcctcccaaattactgggatcatatgaatgagccaccatgc
-ctggccCATGTTTTTCTTGTACTTTAGGCTTTGCTACTTACAACCAGAACTGCTTACCAT
-TCtgtcagaagccttccaaccagggcaactccatcttgaataggggctgggtaaaataag
-gctgagacccactgaactgctttcccagaaggtcagacattcttagtcacaggatgggat
-aggagtttggcaggactggtatcacaagtacaggtcacaaagaccctgctgataaaacag
-gatgcagtaaaagaagccggccaaaatccaccaaaactacgatggggatgaaagtgacct
-cgattcgtcctcactgctcattatataggaattataatgcattcgcatgctaaaagacac
-tcccaccagcaccatgagaatttaccaatgccatggcaacgtcaggaagttaccctacat
-ggtctaaaaaggggacgaaccctcagttctgggaattgcccatccctttcctggtaaaac
-aatgaataatccaccccttgtttagcatacgatcaaggagtaactataagtatgttcagc
-tgagcagcccatgccactgccctgcctatggagtagccattattttattcctttactttc
-ttaaataaacttgctttcactttactctatggattcaccccaaattccttcttgtgtgag
-gtccagaaaccctgtcttggggtctggtttggtacccctttctggtaataATTCTGTAAG
-TATTTGTAGTACGTCTGAGCCACCAAAATTTCcatactgatccttccattagaatatcct
-ttctgcctgtctctttctggcaggatctgatccatatttcaaagccagtctcaaatgcca
-ccttttccaaagaaacctatcctTATATCTTTATCTAATACAAACAGTATATATTGGGAG
-CCTAAGAAATGCTTGTTGCATACATCAATGAATGAACCCCAAACCAATGTATTTCTCCCT
-TCCTTGTAATCTCCAGAAATGTTTATAAACTTTGTTGTTGTTTAtttgtttgttttattt
-ttatttttattttgagatggagttttgttcttgtcacccaggcgggagtgtaatggcgcg
-atctcggctcaccacaacctctgcctcctgggttcaagtgattctcctgtctcagcctcc
-cgagtagctgggattacaggtgtgcactaccatgcccagctaatttttgtggttttagta
-gaaatggggtttcaccatgttggtcaggctggtctcaaactcctgacctcaggtgatcca
-cccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgtgcccggccTGTT
-GCTATTTATTTAATATACTTTATTTTTTTGAGCGATTATAAGTTTATTtttatttattta
-tttatttatttatttatttttgagacagggtctcattgtcacctcttgcccaggctggag
-tgcagtggcacgatgttagctcactgcaacctctgcctcccagagtcaagtgatcctgcc
-acctcagcctcctgagtagttgggaccacagatgtgcaccaccacgctgggctactattt
-ttatatttttagtgcagatggggttttgccatgttgctcaggctgatcctgaactcctga
-gctcaagcaatctgcctgccttggcctcccaaagttctggaattacatgcgtgagctact
-gagcccggccTTAGGTTTACAGAACAGCATTCCACCCATGTTATTTATGCAGGGGAGCAC
-ACCACACACATCACTTTGCAGCTTCCTTTCTCCTCTTATATGTCTTACAGATCTTTCTGT
-GTTCTGTACATTGAGACACTCATTCATTGGCTTCACTCATTCATTTGAATTCattccttt
-gttcaacagatatttatcgtcagctctatgtcaggcactatgagaagtgcttgggatata
-aaactgaacaaaataaacaaagtcctttccattggagagatgacattctagtgtaaggag
-atagacaatagataataaatacaacaaataaataaatacatggtttagtatgttataaga
-tgctttctgtaggaaaaaagtgagagggacctggagtggagggaggaccgagtggggaca
-ggtgcagggtgggggcagccagtagagcccctctgaggaggAGTGGATCACAGGAGGATG
-ACTGGCAAGACCTAAAGGTGGCAAGCTGTCTCTGGTGCTGGCTCTGAGAGCAGGATAGCT
-GGAGTAGAGTGAGGGAAAGGCGAGGTCAGAGGTGAACCTGCAGGGCAGGTGGGGCTCCTT
-CCGCTAGCgcatggtgttccattatccagatgcaccaggacaaatgtcgcccactgccat
-tactaggtgcttaccatgtgccatcaagaacaataccgcaggccgggtgcggtggctcac
-gcctgtaatcccagcattttgggaggccaagatgggtggatcacttgaggtcaggagttc
-gagaccagcctggctaacatggtgaaacctggtctcgactagaaatctaaaattagccta
-gcgtggaggcgcactcctgtaaacccagctacttgggaggctgaggcaggagaatctatt
-gaacccaggaggcagaggttgcagtgagcctagatttcgccattgcactccaactgggca
-agagcaaaaatctgtctcaaaaaacaaacaaaaacaatactgcaataaacattctgtcag
-tctgtcattttgcccatggacagaatatctgcagaattaattcccggcagtgaacttgAG
-AGAGATCACCCAATTGCCTTCCAAAGGAGCTGTGCCTGGACCATGGGTTTCAGCACAAAG
-TGCTGCTCCCTCCAACTTGTAGACTCTTCTGGCAGGTCACGGTGGAGCTCACATTCTAGC
-GGGAGAGTGTCCAGGGCAGAGATATTCCATTCCGTGTCTTTTCTCCCAGGGCTCGCACAG
-AGAGGGTTCACGCGGTAGTCAGTAGGTGGGCAGTGCTTGGTGAAGGCATTGATGGGTGGA
-GGGATTGAAGGATGAATGAATGGATTAGGGGCTGACAGTGCCGCTGCAGTTACTCAAAGG
-AGCCACCAGGAGGCGCAGGGAGCCCACATTCTGGAGACAAACCTTTTAAAAAAAGCATCT
-GGTGACTTAACGACCTTTTCACCAATGGCTTGTGTGGGGCCTTAATGCTAGGGTGAGAAA
-AAGGTGGGAGATGGAAGAAAGGGGAGTGGGTAAAAGGACATGTGGGAGAAGAAGGCAGAG
-AGAGGGCCTTCTGAGGGGGCCTCCACGCCAGGTAAGGACCGTTTAGCTCCCCTAAGAGCC
-TGCAGCATTGATGCAGATCCCAGCAAAGCCAAAACCCCCTTATGCCCACAGTTGAGCCCA
-AAAGCCCAGAACAGAGGGGAAAAATAAATTTCAGGATAggccaggtgaagtggcttacgc
-ctgtaatcccaaaacttggcgaggtcaagtaatcccaagtactttgggaggctgacaggg
-gaaactctatctaaaaaaaaaaaataaGAAAAGGAATTTCCAGGATAAATATGTACAGTA
-TAATCCCATTTATGTGAAAAAAAAAATCTCCACAAATAAATTCCTTtgtgcgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtttgtgtgtgacggagtctcagtctgtcgcccaggctgaagt
-gcagtggcacgttctcggctcactgcaacctccggctcccaggttcaagcaattctcctg
-cctcagcctcctgagtatctgggattacaggcgtgtgacaccacacccagctaatttttg
-tatttgtggtagagacggggtttcaccatgttggtcaggctggtctcgaactcctgacct
-cgtgatctgcccgcctcagcctcccaTAAATTCTACATATTAGTTTGGGGAGTGTGTATT
-TACCACATACACATCTACAGGGAAAATCTGGAAAGGTAAATGTCGAATTGACAACAGTGG
-TTACTTTTGTTATTGTGTGTGTAGAGAGGGGCAGGGGACAAAAAGGAAAATGAGGAGTGA
-TCAAAGGGGACTTTAATTTTCTTTTTTTTTTTTGAGACAGAGtctcagctcactgcaacc
-tctgtctcccaggttcaagtgattctcctgcctcagcctcccaggtagctgggattacag
-gcacccgccaccacgcctagctaatttttgtattttattttagtagagacagggtttcgg
-tttcaccatgttggccaggctggtctcaaactcctgacctcaggtgatctgcctgctgcg
-gcctcccaaagtgctgggattacaggcgtgagtcactgcaccgggccCCCAAAGGGGACT
-TTAGACTAAACTGAAACATTTTAACTTTCCAGGAATCTGTAACCCTGCTATTATATAACC
-ACAAATTAAAAATTACTTTaaaaaatgaaaaaaaaaaaaaaaaaaaaaaggctgggagcg
-gtggctcacacctgtaatcccagcactttgggaggctgaggcaggaggatcacgaggtca
-ggggtttgagaccagcctggccaaaacggtgaaaccctgcctctactaaaaagacaaaaa
-ttagcagagtgtggtggcacgtgcctgcagttccaactactcaggaggctgaggcaggag
-aatcgcttgaacttgggaggcagaggttgcagtgagcctagactgcgccattgcactcca
-gcctgggcaacagagcaagactccggctcaaagaaaaaaaaaaaaggaaaagagaaaaaA
-AAAGGAACAATAACAACAACaaaaattaaatgctatcttgtgttgcatcaatagaagtct
-tacgtgcagctcaagggaggtgacagccccctctgctctgctcagaccacacctgggacc
-tcctttcctcttcttggccctgtcccgtgagaagaataatgacagcctaaggcatgCTGG
-GGGTTGGAGATGGGGGGAGGCTGGGGCCATCTGCACATGATACAGATCCAGGAATAGTCC
-CTTTACCCAAGCGGGAGAAACTGGGCAGGTGAGCAGCTTCCAGGTGTGTGGATGGCAAAT
-GGATGCCAGACTTTAGGATAGGAATCCAGGGGTGCAGCGGATGGAAAGTCCAGCCCAGGA
-TGGGGCATAGTTTTCCCACCCAGCTAGGGAGGGAGGGTAGGGGCTACTCTGGGGTGTCAG
-GAGTGCCGAAGCCTGAGGTAGGCGCAAGCCAGGCAGCATGGCAGCATCCTTCCAGAGGGT
-GTTGTGCAGCTGTGGAAAACAATTGCTGGGAGGCCGGCAGGGGCAGTGGTGGAGGAGACC
-AGAGCTTAATTCTAGGTGAGTCACAATAGCCTCATCTGTAGAATGAGTGAGGGGTGGGGC
-GTAGTTTCAGAttttttttttttttttgacacgtagtttcgctcctgttgcccaggctgg
-agcgcaatggcgcaatctcggctcaccgcaacctccgcctcccgggttcaagcgactctc
-ctgcctcagcctcctgagtagctgggattacagccatgtgccaccatgcccggctaattt
-tgtatttttagtagagacggggtttctccatgttggtcaggctggtcttgaactcttgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtcagccaccgtgcccCACCA
-GTTTCTGACTGAttttcttttttttttttttttgagacggagtcccgctctgtcgcccgg
-gcgaagtgcagtggcgcgatctcggctccctgcaagctccgcctcccgggttcacgccat
-tcccgggcctgggaccacaggcgccgccaccacgcccggctagtatctttttttattttt
-attttcaatagagacggggtttcaccgtgttagccaggacggtctcgatctcccgacctc
-gtgatccgcccgcctcggcctcccaaagtgccgggatcacaggcgtgagccaccgcgccg
-ggccCAGCTTCTGATTTTATGCAGCTGGCGGGATCTTGTTCTTGGTCCTTTAAGGCGACC
-GGAGGGATTGCAGTTTTAAAAACTCGCCAGCAGAGGTCGCCTTCTGACGGATTTGACCAA
-AAAATCCATTCCGGTGGGAAAGGGGAACCTGCGCCTGCGATtctctctctctccccctct
-ctccctctctctttctctccccccctctctctctctccctccctccctctctcctcctac
-tcctccctccctccctctctctgtctctccctccctccctcccgctctctcccccctccc
-cctctccccctccctccctcccttcctccctctctGtctctttctttgagacaaagtttc
-actctgtcacccaggctggagtgcagtggcacgatctccactcactgcaacctctgcctc
-ccggggttcgtgattctcatgcctcagcctcccgagtagctgggattacaggcgcccgcc
-accacgcccggctaatttttgtatttttagtagagacggggttttgccatgttggccagg
-ctggtctcaaactcctgacctcaagtgatctgcctgcctcggcctcccaaaCTAAGATTC
-ATTTGTTGACTAAGTGAATAAAAGGGGAGACATTGAAGAGGGGGACCCgactggatttgg
-gggtgaaggtggagttgagagtgactttgaggcttctgcttgagcaatgagtggagggtg
-cctctcctgagctggggaaactggggcagCACTGACGGAGGGGACACAGCTACAGAGGGG
-AGAACCCTCTCCTGCCGGGGCTGCGGGTTACAGCCTGCACTGCGATTCTCTGATCTCAGG
-GACCTCAGACTTCTGGGGCCCTGTCCCCTACCTCTGTGTATGACCCTAGCTGGCTGAGGG
-CTGAAGGCTTGCTGTTGGCTCTTTCTGCACCCTCAGCCTTCTCCTTCCTCTTCCCTCTGC
-AGGACTCTGTCCTGGGTCCTTAGGAAGAGTCCAGGCCCCAGGACAGGGAAGTTGGGTCAG
-GCCTGGACCTCACATTCCCTGCCTGTCCCATGAGGTGGACAGTGAGAGGACAAATGCCTG
-GACCCCTGGCCCCAAACCCAAGAGCAGATGTACCGGAGAAGAGCTTCTTAGAGCACCAGG
-TGCCAGGGCTGCGGTGGAGAATCAGGGGGGCCCAGGGGAAGGGGCTGCAGATGAGGGAGG
-AGATAGATACGGAGGGCCTGTGTGCCTCCCAGATACAGGGCTGGCTTTCCCAGCCCAGAA
-GGTTCTTTCTGCCTTTCCCAGTCTTCTTCCATTCTCATTTCATGTTCACACTTTTGGCCA
-TACCCAGGGTCAGCCATGAAGATTGTTCTCAGAATGTtttctttcttccttcctttctct
-ttcttttctttctttcttcctttctttctttcctttctttttctttcttctctttctttt
-tttcttttcttctttctctctctttctttctctctctctctctccttccttccttccttc
-ttttctttctttcttctttctttttttgaaacagagtctcactatgtcacccaggctgta
-gtgcattggcacgatcactgctcactgcagccttgacctcctgggctcaagtgatcctcc
-cgcctcagcctcctgagtagctgggaccacaggtatgcaccaccatgcccagctgatttt
-ttaattttttgtagagatgggggtctcactgtgttgctctggttggtcttaaactgctgg
-gctcaagtgatcctcccgccttggccttccagagtgttgggattacaagcaggagcagca
-cacctggccAATGTTTTATTTAAATCAACTCACTTAGGTTGAAttagaataattttagac
-acacagaagagtgtgtctatataattttgaattatatacccaacactcagatataacatt
-agcattttgccatatttgcttcatctatttctttctgaaatattttaatgtaaattacag
-atatcatgaattttcatccccaaatactttagtctgcatCAGTCAAAGATATCTAATATT
-TAATCCACAATGGATTTCCCCAGTGGCAATTCCCCTAAATTGTGTTTTACAGTTGACAGT
-GGatttattgtaaaaggaaactcgatataccaagtgacaagcaagttatcttctgttata
-aatagaaaggatccctggaaatggacacagtgtcaggcccagagctgtgggtggagacct
-gctctctgtttgacataaataggagatcagtggctactaaatctgaagacagggcagcag
-caaagaacattttctcacggatgtgatgagacttgaaagggactcagaaagggggtcact
-ttctccaggttggggtaactgttatttaagccagggttcatCTGCAGCGTGGGGAGCCAG
-AGGGTGACCCCTTCCCTAGGTGATGGAGGTGGCTGAGGCTCCAGAAGTTTCCAGAGAAAG
-ATCTGGTGTTCCTACAAGGCCAGTGGCAGGGGGAAGGGCACTAGACAGTGGGGCTGGAGG
-GTGTGGGCCTGTCCCTGCTCTGATTTTGGGCACTGCACTTTTGCCTGTAAGAAGGGGATA
-TGTGAGGCCAGGACAGGGTCTCCTACTCTGTCCCCACTCCCACGCCAAACAGGGCCTTGA
-GGACTCTCGCGACCTCCATGACCCAGCTTCCCTCCTACCCCAGCCCCAAGCCTGTTTTTG
-TTCCCCTCCCTCCctcctgcttgatctttgagcctcagccaggatgttacctcctcctag
-aagcctgccttggtccctggaatggattaagggactctctcctgggccccacagctgccc
-aggatcactcagcactgtagtgccctgttggcctttgcctccctccagctgtggacgtac
-aaagcagacagcgaatctgtcttgctcaccactgtacccccatcccctactgcagcacct
-ggcacatagcagtagtgcggcacacttgttgaatgaataaGGGATCATTACTACTACGCT
-TCCCACTCATAAATGTCTGCCTCTTCGGGGGGCTCAGAATGCACATTTGGTCCTTCATTA
-ACTCATTTACTCACAAttttttttttttttttttttttgagacggagtttcactcttgtc
-gcccaggctggagtgcaatggtgtgatctcggctcactgcaacctctgcctctcaggttc
-aagcgattctcctgcctcagcctcccgagtagctgggattacaggcgctagccaccatgc
-ctggctaatttttgtatttttagtagagatggggtttcaccatgttggccaggctggtct
-cgaactcctgacctctcaggtgattcacccacctcagcctcccaaagtgctgggattaca
-ggcatgagccaccgtgcctggctcatttactcacaaatatttactgagcacctactatgt
-cccaagcagtattctaggcactggaaatggggcaaggctgctgcctctgtggaacttata
-ctggggtgtgggaggcaaagaaaaacaagcaaacatacatatgaaataatttaagatgcc
-actcgtggtgggagggactgacaggagctgctgtggaagagagcattaggagggccttgc
-tgaggggtgactttatttcagctgagaggtggatgagaaggcacctgcaggggaagaaga
-accaggggaagggtgttcctgatggagcaacagcctgtgctaaggccccaaagtgagcac
-cagctgggcgctgagggacagaaccaggcacaggctcggttagaggaggtctgaggtccc
-agaggagacaagagaggggaaggatgggagggcaggcctgagccgcagaaggccagtgga
-aggttctgagtgggaagaggatgggataggagttatattctgaaaggtccgcctgtgctg
-ggtggaggatgggtggggacaggcaggagcagcccaggctctgatgcagcctccaggcag
-agatgGACCAGGGGAGCCCATTTCATATCCGGCCCCTGTGGAGGGTCTGAGGGTGTTGAG
-CAGACAGGCCCTGGCTTTGGAAGTCCTGGGTGTCTGGACCCGCCTGCCTGTGGGGCCCCA
-GCAGAGAGGAAGGGAGGCGGGGCTCCCAGTGCCTGTTGACTCATTTGCATCTGATTTGCA
-TGTGAAGCAGAGAGTCAGGTTGAAAGCTGGGAAGGCCTGTGCCAGCCCTGGGTAGAGGGT
-CTTGGGTGTTAGTTCCCACAAAGACTCTGTCCCAGGCCATGACCTTCCTGTTCAGGAGGG
-GCTCTGCCTTCCCTTGCCTCCAACGCCCCTCTGGCCTGGCCCTGCCATCTGGGGCTGGGC
-AGTGCCCACGGGGACAAGGTCGTTTCCTTTTAGGAGAGGTCTGCATGCTATGAGGACAAA
-GGCCAAATCCCCACCCTCGGGAACCTCCTTCCCCAGCAAAATCCCATCTGTCAGGCTCAG
-CCTCTGACCTTCGACCTCTCTGTCAGCACAGGCTGCAGTGTTGGGGAGGGGAGGGTCCCC
-ACCCCCAACCCTAGGGGAGACCCAAACCTCTCCCCCCAGCCTTCTCCATCTGTCCCCTTC
-GGCTtctgccacctgctccgtgtgatccaggccaggtcacctccgctttctgggccttgg
-ttcccccacgtgtccaatgtgggTTTCCCAAATACCAGTGACTTGTGTCAGTCCACTTTT
-GTAATTGTAGCCAACTCCacttactatttcttaagtgaacttactctccttcacttaaat
-agatttaatttaaaaagaaatgttataccagctctgtaaatggaaaaccagtttcatctg
-ccacaagtagaaacataataggaaaaaataatgaaatggaaataaaacaatgttactcta
-gtctagcCTCaagtgaaaaaagtcagacacaaaaggttacatttatatgattgtctagaa
-aatgcaaaactagagagaaagaaaacagaccactggttgccagggttggggagagggagc
-tgacaatatcaaggggtgcagaaactttttagggtgatccaaactgttttttgatgatga
-tggtggttacagattgtatacatttgccaaaaatcaccaaagtgtacattcaaagttggt
-gagttttattttatgtataaaccacctcaaaaagacaaaTTTTAGAGAAGAAAACAAAGA
-AAAATGCCGGTTTAGCCCCAAGTCTGAGGCTTCCTCTCTGTTAAACAAATTAGCAAATAG
-AAggccaggcatggtggctcatgcctgtaatcccagcactttgggaggctgaggcaggag
-gatcacttgaggtcaggagttcaagaccagccatggccaacatggtgaaatcctgtctct
-acaaaaaatacaaaaattagctgggcgtggtggcgcatgcttgtaattccagctactcag
-gaggctgaggcaggagaattgcttgaacctgggaggcggttgcagtgagccgagattgca
-ccaccgcactccaccctgagtaacagagcaagagactccatctcaaaaaacaaacaaaca
-aacaaggaagagaaAGAGGGATTTCTCTCTCTGTCTCTCACCAACTCTCTAACCCTCCCT
-AGTTCcatgcaccaaggaaaagctatgtgaggacataggagaaggtggccagccacaggc
-caagaagagagccttcaccagggactgaatcagctggcacctccatctggtacctctagg
-ctccagagctgtgagaaatagatgtgtgctgtttgagccacatagtctctgatattttgt
-tttggcagccggagcagactcatgcCCTCTGATCTCATCATTAGCATAATGCctgtttat
-agaaccatgctgtgggcaggctctgtgctaaaagctttgccagcatcatttcagagactt
-gatgtgacatcttacatcgtaggggaaattattgttcccattaaagatgggCCCACAGTG
-TGGCTAAGCCAGTGGGGCATGTCCTCAGACCTGGAGTGCTCCCATAGGAAGCTGGGCCCG
-ATTCTTTCTGAAGGTGTGAGCTGGAGGCAGTGATGGTGGTTTGAGAGGCACGGGCTGTGG
-GGAACTGGATACTGAGGGCAGTCCCTGTGTCCCAGGGGAAGCACTCTGTGCTTTCAAGGG
-GGGCACTGGCAGAGAAGGAAGTGTCCCTCATCACATCCTGGAGACCCACCCTCTGGAGAC
-AGTGTTTTCACGAtttcttttctttcttttttttttcagacagggtctcactctgtcacc
-caggctagagtgcagtggcacgatctcagctcactgcaacctctgccttctaggttcaag
-taattctcctacctcagcctcctgagtagctgggattacaggcacccgccaccacgccca
-gctcatttttatttttttatttttcgtagagacagggtttcaccacgttggccaggctgg
-tgtcaaactcctgacctcaaatgatctgcttgctttggcctcccaaagtgctgggattac
-aggcatgagccatcatgcctggccATGTTTTCACTATTTCTATGGACCGTTTCATAAGTG
-TTGTGTGGACATAGGgctccagggttaaatgtgtttgggaaatgtggtgtaagcaaagag
-aaagaagtttccactctaatacttctcagagactttaatgtggagataggcatggcgaat
-ctcTCACTGCGGGACAAgtgggcaagagaagtgtggatgctgccttctgggcactcacag
-ttggtggaggagacagccaacatgcaagcaggggccacaccacatgtctggaggttggaa
-cgctatgcagagagaccacaggaaccatgggggaagtggggagggatttcccagaggaga
-tgacatttgaacaaagatgcaaaggaagtgtggaaggaggtaagggagagctgtatgact
-gtctgggggaagagaaacccaagcagagggaacagcaagcacaaaggttctgaggctcaa
-ggttgcttggtgcatttgacaagcagaccagcgccattggctggagctagctgggccgag
-tgggagggtgataatggatgaggtTGACCACGGTCCGCTCCCAAAGGCCATGGAATTCAG
-AGCATACTGGAGAGCCCTTAGTGGGTTTGGACAGACAGTGATACCTTGGGACACACAGCC
-TCATGAGCTCATACTGACCAAACAAACCACCCAAAATAGCAGCAGAAACAACAGCCACAG
-GGTGCAGAGGGTCATTCAGGGTGcctctcacaagcctgggaagtaggcatgtgatatggt
-ttggctgtgtccccacccaaatctcatcttgttttgtaactgcttcaattcccatgtgtc
-gtgggaggaacccggtagggggtgattgaactgtgggggcaggtctttcctgcgctgttc
-ttgtgatagtgaaaatgggtctcacgagatctgatggttataaaaatcggagtttccctg
-cacaggctctcttttttgcctgccgccatccacgtaagatgtgacttactcctccttgcc
-ttcggtcatgattgtgaggcctccacagccttgtggaagtccattaaacttctttcattt
-gtaaattgcccagtctcgggtatgtttttatcaacagcgtgaaaacgaactaatacagca
-cggttaactcccattttacaggcgaggaagctgaagcttagaaagatgaaagaatttgcT
-TGTGACCCCGAACGTTCCCTCTGGCTGATGCATTGTTCCTACCTGCTCTGTTTCCTTGTT
-TATGAAGCTTGCAGGCTCCAtggtcctcaaccctggctgctacacactggaataacctgg
-ggtggcagactgtgtctccccaggatggccacaccaatacatctcacatcccacatgctt
-ggccaatagcatatgacagatgtgactgtgggttacttctaaagctaggccataatagcc
-atcgcaaccccaccgtgatctctgggattgctagttctgagggaagccagctgccatgtc
-ctgaggttactcaagaagccctgtggagtaggccatttggggagggactgaggcccccag
-gcaacatctgtcccaacttgccagtcatgttagtgaactacccttgtccagccttcagat
-gacACCTCATGAGAGGCCCTGAGAGAGTCTTATTGTCCCGTTCACCATTCCTGTTGCCCT
-GTGGCCAGCTAATCAGCTTGTGGTGGTTTTCATTTCTTTTTTCTTTTTGCCATTAATAGC
-AATGCCAggctgggctcagtggctcatgcctgtaatcccagcactttgggaggccgaggt
-gggtggatcacctgaggtcagaagtttgagacaagcctggctaacatggtgaaaccctgt
-ctctattaaaaatacaaaaattagccaggtgtgatggtgtgcgcctgtaatcctagctac
-ttctcccaagtagaagggcgtgattcttctcatgcctcatgctgaggcatgagaatcact
-tgaacccgggaggctgaggctgcagtgagcggtgtttgtgccactgcacttcagcctggg
-cgacagagtgagactatctcaaaaaaaaaaaaaaaaGTAGCAATGCCATAGTAAGTATTC
-TTCTAATTAAGCCCTTCTGAATCAGCTTAATTATTTGCTTAGGGTCAATTTCTAAATGCA
-CAGTTGCTGGATCAGAGTACAAGTCCACTGATACAGCATTTAATTTTTTCAAAGAATTGT
-GACTGggccgggcacggtggctcatgcctataatcccagcactttgggaggccaaggcgg
-gcggatcacctgaggttgggagttggagaccagtctgaccaacatggagaaaccccgtct
-ctactaaaaatacaaaattagctgggcatggtggtgcatgcgtgtaatcccagctacacg
-ggaggctgaggcaggagaattgcttgaacccgggaggcagaggttgcggtgagctgagag
-ggtgccagcttgggcaacaagagtgaaactccgtctcaaaaagaaaaaaaaaaaaaaaag
-aaTGTGACTATagctggccgtggtggctcatgcctgtaatcccagcactgtgggaggcaa
-gatggtcagattgcttgagtcaaggagtttcagaccagcctgggaaacatggcaaaaccc
-tgtctctacagaaaaattagctgcgcatgggggcagacacctgtagtcccagctacgtgg
-gaggctgaggtgggagcatcacctgagcctgggaagtcgaggctgtagtgagctgtgttt
-gcaccaccgcactccagcctgggcaacagagtgaggccttgtctcaaaaaaatttaaaaa
-ataaataaaTGTAACTATATTCTCCTTCAGTAGCAACATCTCAATTTACCTTCTCATGCA
-CAGTGTTTGGAAGGACATATTTTGGGATGAGTTTTCTTTTACTTCACTACCTTATTTTGT
-TCTTTCATAGAATGCCTTTAAAATGTTACTTTAAAAAAATAGATAATACCTTTACAAGGT
-ACAAAATCCAAAAGGTATAAAAATGttttctttttttttttggagacagagtttcgctct
-tgtcgcccaggctggagtgcaatggtgcgatcttggctcgctgaaacctccgcctcccgg
-gtttaggtgattctcctgcctcagcctcctgagtagctggaattacaggtgcccaccacc
-atgccctgctaatttttgtattattagtagagatggggtttcaccatgttggccaggctg
-gttttgacctcctgacttcaggtgatccacccaccttggcctcccaaagtactgggatca
-caggcataagccaccacgcccggccAAAAATATTTTATAAAAGTCTTTCCCCCACCCCTT
-TCCCCTCAGTCAGCACAAGTAGCCACCACTGGGACCAGTTTCTGGTGGATAAATCCAGAA
-AAGTTCAGGTGCAAGTAAACACACATAGAGAGAACACCCTTTAAATTAAATGAAACTAAA
-GAAAACAGAGCCATAGGTGCACAGGAGACAGAGAGCTGACATCTGGGGCTGATTGCATCT
-TGGTTTCGAGCTGAGTGGCAAAAATACTGCTAAGGTCAACGTTCTGAAGGAGGCAAAACC
-CACACGCAGAACCAGCCATAGGCCTGTCAACAAGGCGAGATGTTATCATTGCTCATGTGC
-TGGGTCAGGATAAGGCCATACAGACCGCCCAGTTCTCTCTGATCTGGGTGTAGTTAATGA
-CAGTTTATCCGCCTTTTTCTTCTCTCTCACCACTCCCCATGGTGGGGGAGGAGAAGGACT
-GGGAGGACTTGAATACTCTGAATTGGCACCAGGTGCTTAATATAGTCCTGAAAATAGAAG
-ACCAATATGCTGTTGGCACATAAAGATGCCCACAATTCTAGAATCTGAGTGCGCCCAGAT
-GATCTCTCTTTACATGGCCTAATTTGGGATCCTGACAAGTTCCTTCTGCCCTCTGCCTCA
-CTTTCTCAATCTAGGAATGGGCCTCTCGGTTTTTGTTTTGTCTAATTTTAAGCTCTCGGC
-TGTGCATGGCAGAGGCAAACTTGAAGACGCAAGGGTCAGTGAGCAGGGCCTTTATCCAGG
-TATCTCAAATATCTCCCAACCCTGATTAAAGTTACATATCTCAGAGAAGAATTTGGTCAA
-CACCATTGTTGTCATTCCTGGTTAATAACAGGGAAGTTGAGGTctgggaagcaccctagt
-gatgtgttcacatggccatgtgcttctgtaaaatttaccaatgtaaggcatcttaacctc
-attctgttaaaaccactatctcctttcattccaacttccctttgcatcagatgatgttgg
-ggttggtgtgagcagtttgggcatcttgctaaaaggaccttaacatttactttgggttta
-gtgggatatatttatattgtttccagtcacttttgtgaaaaattattactaactgacctg
-gtattgaaatggcttccaggaatatatccataccgagcatactgagctgactcaacttgt
-cgtggcatcaagattcaggatcagaggttatatctcaagatatatgaatggtcctacagc
-actcagttccacaagactgtgaaggagaggtttgaatgtatacacggagccagcagctag
-tttatggaaagtattacagatgtgtttgagacaggcagctaataaaaagaatgttatttt
-tctgcgttttgtaacgtttgtgcaatttctcttttttttttttttttttttggagacaag
-gtcttgctctgtcatctaggctggaatgcagtggtgaaatcatggcttactgcagcctca
-acctcctggtctcaagcaatcctccctctcagcctcctgagtagctgggactataggcac
-gtgccaccatgcctgactaatttcttttttccttttttttttttttttttgagacggagt
-ctcactgtcgtccagcttggagtgcagtggcacaatcttgactcactgcaacctctgcct
-cccagattcaagtgattctcctggctgagcctcccaagtagctgggattacaggtgccca
-ctaccacgtccagctaattttttgtatttttagtagagatgaggttctgccatgttgtct
-agattggtctcaaactcctgagctcaggtgatccaccagcctcggcctcccaaagtgcta
-ggattacaggtatgagccaccatgcctggccagctaatttctttttaaaatttttttgta
-gagctggggatctcgctttgttgcccaggctggtctgaagcccctgggctcaggcactcc
-ttccacctcgacctcccaaagtggtgggattacaggcatgagccaccttattgtggtttc
-ttgtctctttctaaccaaatcttcactttattacttaatttcatatctgtaattttttct
-taaagaggtctccctaGggctggacgtggtggctcacgcctgtaatcccagcactttggg
-aggccgaggtgggtggatcgcctgaggtcaggagttcaagaccagcctgaccaacatact
-gaaaccctgtctctactaaaaatacaaaaaattagcgggtatggtggcgggcacctgtaa
-tcccagctactcaggaggctaagacaggaaaatcacttgaacttgggaggcagaggttgc
-agggagctgagatcgtgccattgcattccagcctgggcgataagagtgaaactctgtctc
-aaaaaaaaaaaaaaaaaaaaaaaaagaaGTCTCCCTAGGCTGAAGCTACCTGCTCAATCT
-TCTCTTGTGTCTTATAGGATCACAGGATCCCCCTTGCCTTACCTCACTGTTACTCCCAAA
-CAGTTCTCACATGTTTACAAGGGAATGTAACAGAGTGGATCAGAGAATTCATTCTGGATC
-CAGACCGAccttagttttctcatctatataatgggaataatagcaggatctctcgcctta
-gatagtcatgaagtccaatgagatgatgtgtataaagccctaacacaatgTAGCAGAGGG
-CACAGGGCCAGGATTGATATTTAGCTGGTCCTCACGGATACAGCAGACTCCCTGTTTATG
-ACAGTGGTTGGCTCTGATTTGGTTGGTGTCCATGCCAGAGTGTACAATCATTATTAGCTA
-TTGATATATTATTAGCTCCCTCCCCTGCCCACCCAGGGGTTTACGCAGTAAGTTCTCAAT
-TATTGGCAATCCAAACAAAGAATAAAAGACACCAGCTGGAATGAAACAGAGAAGCTGGTT
-CCAAATTGAGCAATTCAGACTGACTGCTATAAAATTTCCTCACCTTAAAGGCCCTTAGAG
-TTAATTCATTCTAATCCCCCTAAAAATATACTTTTTTGACATGTTCAAGTATTGGAAATT
-TGGAAAATTCACAAAAACACAAAGAAGAAATTAACTGCTGTGATTATAGATGATTATACA
-CATATACATATGTATTTAATACATATTTATGCTGTACATAGTGTTTTGAAGCATACTGTA
-CTTCAAAAAAATTTGGGAGgggtgcattggcttatgcctgtaatcctagaaattcaggag
-gccaaagcaggaggatcacttgaggccaggagttctagactggcctggggcaacatagcg
-agacccgtagcttgacatggtgatgcgggcctgtagtcttagttactctggaggctgagg
-tgtgaggattgcttcaacctaggttacagtgagctatgattgcaccactgcactccaccc
-tgggcaacagagctagaccctgtctctaaaaaacataaataaaCCAATGTTTAATACTTA
-GCATTTCCCCCTATCTTTAAATATCTTCTAGCTACTTCACttttatttttatctttttga
-gatgatctcttgcccaggttggggtgcagtggcatgatctcagcttactgcatcccccac
-atcccaggttcaatctattctcctgcctcagcctcctgagtagctgggattacaggcatg
-tggcaccacgcctggctaatttttgtatttttagtagagacgaggtttcaccacgttggc
-caggctggtcttgaactcctgacttcaggtgatctggtcgcctcagcctcccaaagtgct
-gggattacaggtgtgagccactgctcctggTAGCTACTTCACTTTTAATGGCTGCATAAT
-ATTCCTCATCAGAAAGTGGGAAAAATTAggctaggtggcgtggctcatgcctgtaatcct
-agtactttgggaggctgagttggtagaattgctagagctcaggagtttaagatcagtctg
-ggcaacatggcaaaaccccatccctacaaaaaatacagaaaataccgggtgtggtggtgc
-acacctgtagtcccagctacttgggaggctgaggtgggaagattgcttgaccccaggaga
-ttgaggctgctgtgagctgagatcctgccactgcactccagcctgggcgacagagtgaga
-ctccatctcaaaaaaaaaaaaaaaaaaagaaaagaaaaaGATAAAGAAATAAATAAAGTG
-TTAATAATTAAAAGTACTTTTAGAGGGTTATGTCATAAGCCTTGACAAGACTTGTTCTGT
-AAAGCTACCCGGCATGCAAAAAGCTCAATTAAGTTAGCTCCTCCACAGGATGGAAttata
-taaccaatccctttcaagaggcattgaagttgtttccattattttgctatgatgaataag
-gctgagcaatattaatctttgctcatatctttggtcatttcctttgtaaatttcgggact
-gctgggtATGCACATTTTAAAATTAActcactcatcatcatgcagttaggagaacagaga
-aaggaaggggcttgcaccgggtcacatagggagttagcgtcaaagtcaggactaggaacc
-agccagggccctctaactGGAGCTCTTCCAGCTGGGGTCCTAGAGGAAGTCCCAGCTGGC
-CGCGGGAGGGAGGAGGAGGAAGGGAAAGAACCAGGCGCCGGGGCTGAAGCGGCGGCAGGA
-AGAAGGTGGGGCCGGCTGGGAGGAGCGGGCGGAGCTGCTGAGCAGCGCCTCTCCTTCGGG
-CGGGGGAAGCTAAGCGGTCGCCTGGCAACCCTGGCGGCGCGCCGTTCGAACGGAAGCGAG
-GAACCAATCAGGAAGTCCGGGGCGAACCATTCTGGTGTGAAGGGGGGCGGCGTGCTCACT
-TCCCCTTCCACGGCGCCCCAGGGACTTTCCCTGCGGTGGGGGCCTTCGACAGTGAGGGCC
-ACCCGCTCAGCTCGACCGCGGAGGGCAGCTCCAAAGGGGACCCCAAAGGTGCCCACGCGG
-GGCTGGGGCCTCCTGGGCGTCGTTGGGAGCGGCCACTACCGGCCCGGGTCCGAGCTGTCA
-GCCTCTCCAAAGCCTGCGCGAGAGGAGCCGGGACACGCCTAGCGCGGGCTCCAGGTGAGG
-GCGCGGGTGGGTCCGGGTGCGACCCCGGGTCTGGGGGCCCCGTTCCCCGAGCGTCTGCTG
-TCTGCTTTCTCCCCGCGTCGTACCTGCGTGTcatttcacagatgaggactctgaggctca
-gagaggcaagtgTCCCGGCCCGGCGAGCTCTGGCGGAGAATCCAGTTCAAGTCTTTCTGC
-CCCACCTCGCAGCCCCCTAGTCTAGTCACATCTGGACTTGCCTTGAGAGGCCCAGACGGG
-CAACTGGTAGTCATTTTCCCAGCGTTTTATCGGCAGGGACCTGTAGACCCCTGGCTGGAT
-CACATATCCCCGCGCCCCACACTGTCCTCGGGATACCCCCTTTGGGCGTCTGTCTTTCCT
-TCTCCGCAGTCCGGGGTTGGACTCGGCTCATTTGGCGCCTTTCTGTCTACGGGGACAGAG
-GACCACTCTTTGGGGATCGGACGGGACTGACATTTCTGGGCTGGATGCAGGGGCAGCAGA
-TTCTCCAGCCCCCAGAGCCGCTGCTGGCCTCTTGGGAATCATCCCCAGTTTGGGGAAGGG
-AATAGAGCCAGTCCCTAAACCAAAGCCACTAGTCACCAGAGACTTTGGAATTGGGAGTGG
-GGCCGGAATCCCCCCAGGTGGAGCAGCTGACCTAGGCCAGACCCTGCTGTGTCTCCtggg
-gacaccccctgccccctaggttgctattgtcagtctccttttgtaggtggggaaacggag
-gttctaagaagttaagccccttttcgaagtcacagtcagacaatgcagtggttagctcct
-agtccctctggcttcAATCTTAGAATCCTTGACACACAGAATCATGCATTTTGAGAGTCT
-TCAATCTCTTCATAAGGGAGTTACATATCCTCTCTCCTCTGGAGCCTGCCCCTGGCTTTG
-GGGGACAGGATCTCCGAGGACTCAGAAAGAAAACAAGGCTTTCTTTTATTCTTTCAACAA
-ATATTATTTATTGACTTCATAAGCCCTGCTCTGGTTCTTGCATGTTTTGGTTTTTTTACT
-TATTAGCAAATGTATCATCTTCTCCCACTGTGATGcaaggcaggggctgaggcaattgag
-ccagtgcaaaatttagggatgcccaaaacctcagtaatcaagaCTGAAACTAACGTTCAT
-GGACCATTTGTGTGTTCTGCAGGCAGGAGGTTAACTCACACAGCCTTCATGAAGTGCAGT
-CCTCCCAtctctctctctctctctctctctctctctctctctctatatatatatatacac
-acacacatatatacacacacacatatatgtatatatatgtatgtgtgtatatatgtatat
-atgtgtatatatatgcatatttataAATCATGAAACCACTgccctgtccctgagttgctc
-tgtgacattgagtaagtttcttcagtctctgggcTGAGCTAAGAAGTCATGATGGTGCAC
-TCAGGCCTGGGCAGAGGGCAGTCTAGGATAGGAAGTGGGCTTGGCTGTGGATCTGCCTCC
-CCCTCCCCTTTCTAATCctgcgtgccaggcccttccccaagaccttgcatgtgttatctt
-ccattctgtcctcactgcaaaatccttcatccccattttgcaacctcaagtgcagaccta
-ggcctagaagatcaaCTTGGTATCAGTGGGCCTAGATGTCCACATCCACACCCATTCCAC
-AGCCTACTCCCTTCTCCCTTCCTAATGTTAGTGCAAGGCCACCCTGAGCAAGGCTGACTC
-CTGGGCAGGCCAGGGCACCAGCGTCTGGGAGGCCTCCAGAAATAGCTCAGGGCCTGGTGT
-GGCTCTGGAGGTGGCCCAGCTGGGTGTCCCTGACCTGGACAGCTGGGCTGAAATTGAGCT
-GGGGCTGCCCTGCTGGCTGGCCCCTTGCCACTGCCTGGAGCCTTCCCAATCTCCTCTGGG
-GCAGGCAAGGGCCTCCCCAAATCTAGGCCAGGCTTCTGCTGAAGGGAAAGAAAGAAGCAG
-GTGGGAGGAAGGGGGCGGGTTGGGTGTAGAATGTCATGAAAATTATAACCTTTGGAAACC
-ACACCTCCCACCCCCTCACCAAAGAATaaaaatcactaacacctcttgagcatttactat
-gttctaagtactttacaagtatgaactcatttaattccctcaactctgtgatataaggta
-attactgctgttcttatttccatcttgcagaggggaaactgagcacaagagaggtttaat
-aatttgcataagataacctagaggtggagtttgaacccagagagtctggctctaaatttt
-acatttttTGGGGGGGGGGGTGGGGTGGGGCAGTGAATGAATtaaaatgtatataaaata
-aaatttaccattgtaaccacttttaagtatacagttcagtggcattaagtacattcccca
-ttgcctctccccccagtgcctggcaatcaccattctactttctgtttgagtgaatttgac
-tactttgggtacctctaggtattataaatggaatcataacagtatttgtcttgttgtgtc
-tggcttatttcacttagcataatgcctttaagtttcacccatgttgttgtatgtgttaga
-attttcttttttatggcggaataatctattctaatattctatgtatatgccacattctgt
-ttatccattcattccttgatggacacttggattgcttttggctgttgtgactaatgctgc
-tttgagcatgaatgtacaaatatctgtttgagttcctgtttttaattgttttgggtatac
-actcagaagtggaattgctgggtgatcctatggcaattctgtttaattttttgaggaact
-actttactgtgtttcacagtgactgcaccattttatgtgtccatcagcagtgcacaaagt
-gctaatttctcaacatcttcaccaacacttgttattttctgtttgtattttttttttggt
-aatggccatcttcaggggtgtgatgtggtgtctcattgtggttttaatttacatttccct
-aatgactaatggtgttgagcatcttttcctgtgcctgttggccatttgttatctttggag
-aaatgtctgttcaagtGACTCTGCAttgttttttttttttttttttttttttgagacaag
-agtttcgctctgtcgcccaggctggagtgcagtggcgccatctcggctcactgcaacctc
-tgtgtcccgggttcaaatgattctcctgcttcagcctcctgagtagctgggattataggc
-ccccgccaccatgctgggctaatttttatatttttagtagagacggggtttcatcatctt
-ggccagtctggtcttgaactcctgaccttgtgaaccacctgcctcagcctccaaagtgct
-gggattacaggcttgagccactgcacccagtcATGACTCTGCATTCTTAACCATTACCTG
-TGCTTCTCTTAGATTTGTAACCTCTGAGAATAGTGGATCAGCTTTCTGGGCTGATGAAGC
-CCTCCCTCAGGAGCTGGGCACTGGATGATCTATTTGGTTGAATAGTTATCATAGCCTGCA
-CTTTGGTGACATTTGTCATGCATGGACCTCATGCAGAgagggaggcactgttgtgagtcc
-tgttttgcagttagggaaactgagatatggagaagttgagtattttatccaaggtctcat
-agctaatcattggtggagctaggatttgaatgggttctggagtccatgctATACCTTACA
-GATAtggccagggggatggagtagtgaagaccactgcaggcagcagaaccagtgtgtgca
-gaggTTTGTATATGGTGGCTTTGGAGAAAGAACAGGACTTGGGTAGAAGTGGTCAGAGCC
-CAGCTTGAATGGGGGTGACTTGAAGTTGGAGGAAGAGTAGGACAGGTCTGGAAAGGCCAG
-GAGCACGGTGAGGGTTTGGGGAGGAGGCTTGGTGCTTAGGGACCCTGTCCTTTTTTTTTT
-TTCtcttctcacaagatatttattaattacaaagggaaaataataactgtacagtggaga
-aatttggcagatactgccttaaccaaggaattggctgatcactaagattaagacaaactg
-ttgttatgagtgggtgtggtaatgtacctatagtcccagccactcaggaggctgaggtgg
-caggattgcttcagcccatctatttgaggctgcagtgagctatggagtgcactccaacct
-gggcaacacagtgagacctcatttctaaaaaaagaaaaaagaagccttctgataccatgt
-actaagaaggacacaacatcacttttgtgttattcttgacagatatgtttaacttTCTCT
-CctttctttcttcctctctttctttcttctctctttcttACTGATATAAGAAAAAGCTTT
-ATACATTTAATATATACCTCTTGATGAGTGGCCTTGGCCTTTGAGGTGGGCTGGGTCCAG
-AACAGCCGGTTGTTCAACGGTATTTCCTCGTGTTTGGTCCCTGAAGGAAGAAAATTGGAA
-GGGTGTGATggagctcatggtccagtgggagagacaggaaacgagttatatttcctatcc
-tagataagagtatctaaaatgacaggatgtaatgagtgctcggaagggaataaaatgggt
-gaaattgctgagggggtctcttggaggagatgacatttgaaatgagatctgaagggggtg
-agggaagaggttccagacagagaacagctggtgcaaaagccctgaggcaggaaagacctt
-atgttcaggaacagcagggagggctttgtggccagagcaggaaagaggttggagataaga
-tgggagatttggacaaggactgagtcctggaaggcctgagggccaagtggggagcttggA
-ttttttttttttttttttttgagacagagtcttgctctgttgtccaggctggagtgcagt
-ggctcaatctcagctcactgcaggGAGCTTGGATTTTATTGTAAGGGAGCCACAGGAGGG
-TTTAAACACAGCAGTAATGAGACTTTATTTCTGCTGGGAAAACATtgccgttattgcccc
-cattttacagcagaggaaaccgagactcagaaccatgaccagggagtgcttcctaaggtG
-GTTTCTCCCTCTGGGGTCCAGCCGACGAGGCAGTAGATTCCTTGGGACTTCCTTGGGGGG
-CACATCTGGTGAGTGGCCAAAGCCCAACACTGAAAACACCGTCTCTTCCACCTCCCCTCC
-CCAGATGTGAgcctgggttccaatcctggctctaccattaatcagctgtgtaattttggg
-cacgtggccttacctcttggagcctcagttttctcatctgaaaatgggcataataatagt
-agccctcacagggtaggtgtgaggattaaattagttaacattttgtagagcttagaacag
-tgtctggtacaaagaaagtgctcagatgagatttgttcttTTCTTTTTTGGCTGTAAGTT
-TATTCAATGTGAAATAATCCTCTCCAATTTTATTGAGGTGGCTGACCACGTCCACGACCA
-CATCTGCCTCTAAACTGGAATTCGGTTGCTGACCCAGCCCCAGCCTCGGCTTTCTTGTCA
-GCACCAGGGGGCACAGAACACCGTCTGTAGGTATCTCTGTCAGCTTCCCGTCTTGTGAGT
-CTTGCAGGTCGCTTACCCTCCAGACCTTTAGGCCGAGGCCTGCCAGTCTCTGGACGGCTG
-CGGTGTAGGGTGGCAGGAACAATCTCCGGGGGCAGATGTAGGGTGGCAGGAACAATCTCT
-GGGGGCAGATGAAGGTAATCACGGAGATACTGGCTACCCTCATTGGTAAGGTACCAGTAG
-AAATGTCTCCAGGCAAACTGTTCCTTCACGCAGCCCCGGGACTTGAGAGACTGCATGGCC
-TTCATGACGTGAAGGTTGGGCACATTCTTGTCTGCCAGCTCCGGGTGCTTAGGCATGTGG
-ACATCCTTCTTGGCCACCATGACTCCCTCCTTAAAAAGGAGTTCATGAATGGCAATCCGG
-TTCTTCTTAGGCATCAGCATCTTGGCAGCTGTAGGGTCCGGGGCTGGGGCTGGAAAGGAA
-GGACTGTTCTTTTCTTTGCTATTACGAAAATCATTATTGTTGCTTTGCTGTTACTACTAT
-TAGCGCCTGAAGGAGCCTTCCCTCCCCATCCCCCATTTCTGCCTCCGTGGAGGGCTAGGC
-AGGGCTCAGCAGGCCATTTGGAGGATGAAGGACTTGTTGCCCCGTCCCCTGTAAAGTCAG
-GGACTGGAGGAGGCTGCAGTGCTGAGGGGGAAGGAAAGCTGATGTGCATCACTGCCGGTC
-TCCTCATGCCCTGTACCCTAGTCCTGGCCCAGCTCCCACAGGCACAGACATGGAACAGGA
-GCCTCTTCAGCCTGAGTGTGGCAGAGGGCTGGGGCTGAGGCCTGGGGGACAGCTCCTTCT
-CTGGGCCTCAGGATTCCCATGAAAAAATGGCCTATCAAATGTTCCTACCTGCAGTGAGTT
-ATAGGACTTGGGGTGGAAGAGGTGACAGTCACCTCCCTCTGGGAATTCCTTCCTGCAGGG
-CTGCAGTCTCATGGGATTAAATGAGGGGGCTCTGGGGATTTAAATGAGTATGGTGCCTGG
-CACCCCAAAATTCTAGTTATTGTTGTTACTATGACGGCTGTTGTTGCCGATGTTAACCGT
-TTTCACAAGGCAGCTGAGGCATGCTCAGGCTCAGCCTGTTCCAGAGGGATGGACTCTACA
-CGTGACAGCATGGAGCACCAGGAGGGTCCCGCAGCCTGGTCAGGGACACACAGCTAGAAA
-GTGGTGGCGTTAAGCCTTGGTCTGGAGGGAAAGTGCGCAGGCTGGACTCCCCAGAgtgat
-tttgggctagtgactcagcctctctcagcctcagtttaccattagtcaaatggggtaaca
-atagaactcaccagatagtgattgttgggaagattaaaatgggttacccgataccaagaa
-aaacactttcccgtgcctggcacaGTGAACATCACCTGGCGGTCGTTCTGAGTGTCAGGG
-AGCGGGGCTCAGTTTGTCCATCTCTAAGGTGGGTGCGCTTGCCTGCCAGAGCCACGGGGA
-CCCCGCGCGCCAGGTGTGCGGTGGGCGGGTCTCGGCTCCCGGAAGAACTTCCCTGGGTGG
-TCCTGGAGCGGGTCGGACCCAGTTCCTGAGCCAGGCCAGCTGCCGGCGGCCGGGGCTCGG
-GTTCTGGCCCCTGCCTGGCTTTCCTTACCCTTTTCGGGTAGTACCTGGACCAGCGGGTTC
-ACTTGCCCGCGGCCGCCGGAAGTTGCGCAAACTCAGCTTGCCGGAGCCCCAGGTGGGCCG
-GGCCGGAGGAGCGCAGGCCAGCGGCGCGGGCGCAGCCGGGTACGTGCGGACCGCGGCGGG
-GGGCGCCCAGCCGGGGTAGGGGGCGGCCCGAGCACCCCTCCACCCCAGGACGGCGGGAAC
-GGGGCAGGGATCTACCTTTCGGCTTCAAGAGGACCGCGGGGATGGTGCCGCTCTCTCCCT
-CATTTGAGAGCCAGGAGGGGCGGCGAGGGGCAAGGGTCACACAGCGCCCTGCTAGCCGAC
-CCCCCATCCCCCGCCACCGGGAGTCCTCAAGCTTTTCCGGAATTGAGGGAGAGCAAAAGC
-CAGCCTGGGGATCTGAGTTCCCCCCAGCCCTGCCCCGCGGCCTCTGGAGGCTGACGCTGG
-GGAGCTAGTGGGGAGGGGGCCAGGTGGGGATGCGCGCCCCCGGGATGCAAGCCAGAAGGG
-CCGGCGGTTGGGGGCATCCGTGGGAGGCATTTGAATCCGTGGGTGGGGCATTGGGCGGTG
-AGAGGAGGCCTCAGAGGGGACATTGAGTCGCGCTTGGGGACTTGGGACCCTGGCTTCACC
-TGGCGGGAGCCGCTGCACCTCCGTTTGCCCACCCGTGACGTGGGGCTGTTGAGGTCAGCT
-CACCGATCAGCCTCTGTCTTGGGCCTGCTTTGTCCGCGGTGTGGGCTGGGACAGACCCTC
-GTGGGGCTTGCTTAGAGACCCCTGCGTGGGGGTGGTCTGTGGACTTGGTTAGTCGAAATC
-TTCTTGAAGACCAGGAGCCTGGTTCGTGGCTCCGCctttttgccagatgccgaggaaagc
-cctcgacctgtttgatctctccatccttatcgtgacctggaggctcaggaaggtctattt
-ttaacctcgtttcacggataaggtaaccgagtctgtaaagaggcgaagctgcttgcgcaa
-ggcgcacagcgggcgggtgggcgagccGAAggccggcgggcccgcggcgccAAACCCGGG
-GTTGGCTCTCGCATCTGTCCCGGCCCCGCCAGAGGGGACCTCAGGGCCAGCAGATGGGGC
-CAGAGGGGCTGGGGGCCCGATCGGGGTCGTGCACGGGGTTTCTGCCCCGGCCCCGCCCGT
-CTGACCTCCTTCTCCCTCTTTATCCGGATGGTGCCCGCAAGGGAACTGCCACTGCGGACG
-GGTTGGACTGGTTTGGGAGGTGGCGGCCTGGGGGTGGGGCAGAGTTTGGCTGGCTCTGCT
-GTGCTCCTTTCCTGTCAGGTCCTTCCCACCTGAGGTCTCCTGGGGGTCGGCCCTGGTGGA
-GCGAGGCTTCCTTTCCCATCCACTCCATCTCTCCTGCCTTGGGAGCAGCACCCAAGGATC
-TATTCCCAACTCATGGCTGCTGCAGAGGTCTCCAGCTGGTGGTTGGGGGCCAGATGGAGG
-AGGAGGGGACAGATATGTTCGCAGACATATTTTGTTTGCTGTATATGCAATGTTTTAATC
-ATTATTATCGAATATGCTGACAGTTAAGAATCTAGAGTTTTTATGTACTCCTGGATTTCC
-AGCTTCCTGGAACAATACACCTACCACCTTGGACCCATATGCCTGCAGCAGGCAGGGTAC
-CTAGATGTCTAGTTCATCCCTGATCACCCAGTTCACATCTGGCTCCCATAAATATttcag
-ttcaataaatttttattgaatattctgccctagtatgtgtctagggcagtatcttgaaac
-tggggtatagtgaacaaaatagccaacccccgcccctacacacacacgcctgccctcatg
-gagctgatattttagggggatagagacaacaaagagtaaaacaaccatacacaaatagag
-tacttgtgcaggggataaggagaaaaggaatagtgccgggagggggtcaggagtgccggg
-gagaaacaggacgtggtattGAGATCAGTGCCTTatttatctattctgggacctgggaaa
-gccacttctctgagtctcagtttctccatctgcacaacgACCCACAGGCTTGTGGGAGGT
-TATAGGGAGGATGGCACCCAGCAGAGATCCCTGCCTCCCCACCCCAATCCAGACTCACTC
-CCTTCTGGATTTTTGGATGTCTAGGTGGGgctgtccaatgtagcttcctaccatggatgg
-aaatgctgtactctgtgctgccaaacacagtggcaactggccacatgtggctattgagaa
-cttgaaatgccactagtgtagctcaggaactgaattttatgtttttatttcatttaaatt
-taaagttaaggttgaatagccacatgtggctgctggctattgagctggacagcacggGTC
-TAGATGGCTTGAACTGTAAGCCTTCTTGGGGAACACCCAGATTAAGTACCCGCCCCCTCC
-ATTTTACAGATGAGAATGTTTGGGACTTGGTATGTGGGTTTTCTTCTGTCCCATCTCCAA
-GGGGCCTTGTGGGGTGACTCTGTGGGCTTGGCCCTTCCTTGGAAACAGGGTCAGGGTTGG
-CTTGATGTCTGGGGCATCAGGTCCTGACACTTGGGTGACCACGTAGACACTTGTGCATCC
-AGGTGTATGCCCTCCTCCCAGGTGAGTACCCATTCCATGGCTGCAGGCAGATCGAGGGTC
-TGCCGGATGCCTCCATGCAGGGCTGTGTGATTTTGGACATTTCCAGCTTCTCTCAGCACA
-GCATAGCTCAGGGCTGATGTTTCCACGTGACAGGCATTTGTGGATCACCGTGGGCCATCC
-AGTTCCATGCAGGAAGCTGACGGATGTCTGGACTCCACTGGGGCGCGGGTGGAGATTTTC
-TTTGCTCCTTCCCTATAAGCTCTGCCCTTTGCCTGGGGCCTGGCATGTCTAGGCGGGTGG
-ATGGCACAGGGCAGCTTCCTGCCTGGATGGGTGAGGGGTAGAGGTGGTACCAGGCTCCCT
-GTGGGGAGTCCAGGTGGGGTGTGGGGCTGGAGCCCTTTTTCTTGGTCATTTAACCCTACG
-CCCCGGTGCCAGCACCTTCCTTTTTGGTGGTCAGGGGCAGAgccacctactcgctgggtt
-aacttaagcaagttgtttgcctctctgggcttcagtttctccatccaaaaaacggggctg
-ttgagaggacctGAGGTTGAGTTGACTGGTGCGTAGCACAGAGCCTGGAGCCTCCCTTGC
-TCCCTTTAGCGCGTGCCTTGCCCTGTCTTTTCTGCTCAGGTTGCCCAGGTCGCCCAGGTC
-TTTTTTCTCTAGCACCTTTTTTCCTCTCTTGGTCTCAGCTGGGCCTGGTTCTCCCGGGGC
-AGGAGGGAGGGGGTGTGGGTGGGGCCTGAGGCCCCGCAGCTGCTGCCTTGTGCCTGCTGA
-TTGGCTCCTTGTGGAGGGGCGTGGTCTCTACCTTATAATAGGGAGGGCGTCTTATCCTCT
-CAGCCGCGGCTGAGCCTCTTTGTCTGAGCGCGCTCGGCTTTTTTTTTTTTTTCTCTCTCC
-TTCCCTGCAGCAGTGGCCGGTGTCCAGCTGCCTACTTTCTGCCCGGATCTCTGGCTCCTC
-ATCTCTCCGGTCTCCGCAGACTAAAGCCCTCGGGATATGCAGCAGCCATGCCTGTGCACA
-CGCTGAGCCCCGGAGCCCCGTCCGCCCCCGCCCTACCTTGCCGCCTGCGGACCAGGGTCC
-CTGGCTACCTGCTACGGGGGCCGGCAGATGGTGGAGCCCGGAAACCGAGCGCTGTGGAGC
-GCCTGGAGGCCGACAAGGCCAAGTACGTCAAGAGCCTGCACGTGGCCAACACCCGCCAGG
-AGCCTGTGCAGCCCCTGCTGTCCAAACAGCCGCTCTTTAGCCCTGAGACTCGCCGCACAG
-TGCTCACGCCCAGCCGCCGAGCCCTGCCTGGCCCCTGCCGACGGCCCCAGCTGGACCTGG
-ACATCCTCAGCAGCCTCATCGACTTGTGTGACAGCCCCGTGTCCCCTGCCGAGGCCAGCC
-GCACTCCTGGACGGGCCGAGGGAGCCGGCCGTCCTCCCCCAGCCACCCCTCCGCGACCGC
-CGCCCAGTACCTCTGCGGTCCGCCGGGTGGACGTccgccccctgcccgcctcgcctgccc
-ggccctgcccatcacccggccctgccgccgcctccagcccagcccggccGCCGGGTTTGC
-AACGCTCCAAGTCGGACTTGAGCGAGCGCTTTTCTAGGGCAGCCGCTGATCTCGAGCGCT
-TTTTTAACTTCTGCGGCCTGGACCCGGAGGAGGCGAGAGGGTTGGGTGTGGCCCACCTGG
-CACGGGCCAGCTCGGATATCGTGTCCCTGGCAGGGCCCAGTGCTGGGCCGGGCAGCTCTG
-AAGGGGGCTGCTCCCGCCGCAGCTCGGTGACTGTTGAGGAGCGGGCCCGGGAGCGCGTTC
-CCTATGGCGTGTCGGTGGTGGAGCGCAATGCCCGCGTGATCAAGTGGTTGTATGGGCTAA
-GGCAGGCTCGGGAGAGCCCAGCAGCTGAAGGCTAGGCGCCACTGGGCCTGGAATTCGCCA
-CAGGACGGATCTTACAGAGGCAAGTGGTCCCTGGACCTCTCTTGCATCCATTCTCTAGAC
-GGCCGTGTCAGAGGCTCCACCCTGTTGTGAACTTGGTATGGAGGCAAAGGCTTAGAGGCT
-GGACCAGCATTGTTGGGCAAGGACTGACTCTCCAAGGGTTTTGTTCTTGGCTTTGGACAC
-CTGAGAACCCCCTCCTCCCCTCCCCCAATACAAGGTTTTTGACATGAGTGTACTCCTGCT
-TAGTTCCTCTTGTGGGGCTGCATTTGCGGTGCTTTGCCCTCCCCACTGTGAGTGAGGGGC
-CAAGGGATCTCCTCAATCCTGTCTCCCCAGCGGCTCTGTTTCCTCCTTCCTTCCTTGGCC
-TCTGTCCTTTGCTGACTTCCTCTTCCTTACCCAGCAGAACTCACCCTGGGGTCGGGGCAG
-TGGGGAGGGGCCTATCCACTGCTCTTCCTAGTCCTTGGCAGCTGGCCTAGGTGGGCAGAC
-TATAGGAGGGACTGGTTAGGAGTCTGCATTGCTTTGACTTCCCTCTCCTTGGTTAATAAA
-CACAAATGCTTGTTTCTCAAGGGCTGGGCCTTCAGACTCTTCTGTGTTCACAAGAGAAAG
-GGTGAGAGAAGTCTTGGGGTGGGGCCATCAAAACAGTAATTGTTCACCCCGAGGTCTAGT
-GGTGGGGCATGATGATAGCGGCTGGCCTGGCTGGAGACATGTCCCCGTGGTGGGTTCTCA
-TAACTCTCCTGGAAGGCTAGCAGGCCTGCCTCATCGAGGAGGAAACTGAGATCCAGCCAT
-GAGTGAGCTGGAATAGAGCTGGGAGTAGGAATGGGGTCTTTCCCCTGCACCAGAAAGGGA
-GCCTGCAGGGGAAAGGCCGATGGGGTGCATAGACTCTCCCCAACCAGGAGTGTTCCATCC
-AAGCCCTGCCCAGTTCCCAAGGGGGCAGGAAGCTCGGAGAGGGCAAATCCTGAACTTGAG
-GTCACACAGACCATAGAGTGAGGATGAGAAGTGGGAGTTTTGGAGGAAGAGAGACTTGGG
-GTGGACGGCACAAAATGAGTGGCctccctggcgatcttggacaagccagtttccctctgg
-gcctcagtGGGAGAGTTAGGCAGCACAGTCCTCCTTGGGTTGGGGCACTGGTGCATTCTG
-GGCCCTTCATGCTATATTCCAATACCTGGGGAGAGGGGAAGGAAGGGGCTGGCACTGGGC
-TTCGAGGCCTCAGCTTCTTCCAGTCTCCCTCCAGGTCAGTTACCTACTAGGACACCCCAC
-CTTGGCTAGTGGAGCAGCTAGGGCTAGAGCTGGGCCTACAAAGGGCGAAAGCGGGGGTGG
-CCTCTCTGGTGCCCCACGGTGGGCGTGGAGAGGGGGTGGGTGGCGCTTCCTTTCACAGGC
-TGCCTTGGCTGCAGCACTCAGAAACAGGAAGCTCTAATGGGGGCCCTGGTGACAGGTTTG
-ATGTAGGTTTTATTTTAAGCATAAAGAGGAGATTTCCGTTGGACTGTTGACAAACATCCA
-CATCAGCCCAGCTGTCCATCTCTCTGTCTGTCTGCCTGTCTACAACTAGCCCCCAGGGGC
-CTGGGATGGGCCTGGGCAGTTTGGGGAAGGAAGGGAAAATTGGGTTCTAGAAGAAGATGG
-TGTTCCAGCTCATGAGACTGGAGCTCATGATACTGGTGGGGAGACAAGCATGAGGAGGGT
-GGTGACCTACCCACAACCCCCCATGGTGCCCAGCAGTTTTGACAATGCAGGAGCTGGGCC
-TCCAGGGTCCCCATGCTGAAGGAGTGATGGTGTCAGGAGAGAGAATCCAGGCAGGATCTG
-CAGACGTGGTGCCCTTTGAGGTGTCAAAGACTAGATTTCCTAGGCAACCCTGCTAGAATT
-CAGGGCTAGTCATTGCCCCTTGCTGTGACCTGGCAGcctccgagtaacccaagaaggtgg
-atgggctggctgcattttacatgtgaagaaattgaggttcagGTCACAGGACTGGTGGGT
-GACACCTTGTTTCTGAAGGAGGGTACAGTGCttgaatcctcaaggtagccttttgaggac
-cagatatattgtcagagcaggaggttgagctcagggaaggatagcgacttgtatactgtc
-acatagcaggtctgcaggacagcctggggtcacactcttgcctgccagacACATCGCAGT
-CTGGATTCCTGGTTCTCCCAGCATGTACCCCACCACTCTTCCTCATCTTGGCAGCCTTTT
-CTTCTGGTCACTTTATTACTGAGCATCTActgggtgcccagcagtggataagacagacat
-ggcccctgtcctagtctggagaagagaatgggcaactaaacattcagcacataaataatc
-atagaatgtAAAGCAGGTATACTTAGGGACTTCTGCCCTAAAACCAGAGCTGTTCCCAGG
-AGCTGGACCAGGGGATAGCTGAAAAGAGAACGCCTTTCCATAAATCCACTGGGAGGGTCT
-GTTGGGGAGAGAGCAGGGAGGGATTCTTGGAAGTGGGGAAGGTGCCAGATTGAGTCTTCT
-CCAATGGTTATGGCTTGGTCTTGGGAGGGCTCCCCCTGTTCCAGGATTCTGGAGCCTCCC
-GCCTTCCCTGCAGGCCTCTGTGGAGGGAGCAGGGCGGGGGGCTTTTGCACTCCTCCCTCC
-CCCAACCCTGCAGCCTTGGGGATCTGTGGAAACAGCCCCTCTATTGTTCTGCCTCCAGTT
-GGAGTGTGAGCCCTCGGAGGGCCTGCAGCTGCTGCCCTGTCTCCTGGGGCTGCCCAGCCC
-TCCGAAGCAGCTCCCCCAGGCCAGCCTGGCCCCAGCTGCCTAGCCCCTAATTAGGCAGAG
-ATGGGATCTGCTCTCTGATCCATTTCCCACCAGCTAATTATATACACGTGGATTtgggaa
-ccaggcaacctggctgctcacttctatcatgaaggtggatgggccctgggaaaggcagcc
-ccccccccacagacctcagtttacccttttggcagaggatggagtGTAGCTGCAGAGGCC
-TGTTCCCTGTCCTTGGTTAAATAGTTCTGTTCCTGCTACTGAAACATTTAAGGAGACCCC
-CCACCCCCATCTTACCTGATATCCTGTGTACAGGGGACCAGGAAAGGGTTGAGGAATTTG
-GCTATAGGTCCTTGACTCTAGGACCCCAGGGTAGGGTCATAGGATATAGATGAGAGCATG
-GCTGCAGCTGGCTGCCAATTAGATGTGCATATAGGAGGGCTTACAGTTGTGCTGGTCCAT
-CTGGGTGGCCTGAACACCCggccgggtgcggtggctcacgtctgtaatcccagcactttg
-ggaggccaaggcaggcggatcacttgaaaccaggagtttgagaccagcctggacaacgtg
-gtgaaatcccgtctctactaaaaatacaaaaattagctaggcatagtggcggacacctat
-aatcccagctacttgggaggctgaggcatgagattcgcttgaaccctggaggtggaggtt
-gcagtgagccaatatcatagcactgccctccagcctgggtgacaaagaaagactccctct
-caaaaaaaaaaaaaaaGGAGTGAACACCCCATCCAGGTTTTTAAAAaggtaatattggtt
-gatgggtacagcaaaccaccgtggcacatacatatctatgtaacaaacctgcacattctg
-cacatgtatctcagaacttaaagtagaataaaaataaaataaaaGGTAATATTATTTTTC
-AGATAATTCACTCATATATTTCTTCCAACAttttattaagaaaaatttcaaacatagagt
-tgaaagaattagacagtgaacattcatatacccacctactaatgcacacttgttaatatt
-tcactatatttgctctatcaggaatctacccatctctccatccATTAATACAACTTATTT
-TTTTAATACAACTTATTTTTTAATAAAGCTTTTCAAATTAAGTTGCATATATCAGTACAC
-TTCCCTTAAAGTCACTTTAGTGTGCATGCCATTAGCTAGAATTCAATATTTGTTTGTCTT
-GTTCCTCTCTaggtaacatttacatggaatgaaatgcacagatcttaaaggtgccatttg
-ctgaatttagacaaatgcatactgtaccccaaacccctatcagggtatcaagcattatca
-cctcagaaagtttccttgcatcgctctcctgccgattgctgcctgcccaCCATGGACATA
-TTTTTATATCCATATATATCAGTACTAACaagcagcatcccttgtcctttcctctacatc
-agcctcgctccccaaaagcaaccacttacaacttcttaaactatttcttctggtactttc
-ctccatatttttaaataacttgcttttcctgctgttttcttgatcaattttaggcataca
-cacacacacacacacacacacacacacacacacacacaTATATAtttattttttttttga
-gacagaatcttgctctgttgccccggctggagtgcagtggtgtgatcttggctcactgta
-acccctgcctcccaggttcaagcgattctcctgcctcagccacctaagtagctgggacta
-caggtgtgtgccaccacgcctggctaatttttgtattttttgtagagatggggtttcacc
-atgttgaccaggctggtcttgaattcctgacctcaagtgatccacccaccttggcttccc
-acagtgctgggattacaggcgtgagccagtgtgtctgaccAATTTTAGGCACATATTGAC
-TGACTTTCTGGTCTGATGTTttcatagtgtggcctccactgcctggctgcctggctttgg
-atcccagcccttcctctttctggctgtatgaccttgggcagtaacttaacctccttgggc
-ctcagttttctcatttgtaaaatgagggtgataataatagtgctgaggttattggattgt
-tatacggattcaagatgtaaaaggctgagaataatgaacatcacccagtgagtagtcaaA
-CTTTTTCTTCTCATAATCATTATTATCAAGAAAGATTTAGCTTTTGGTTCCCCCCTTTCA
-ATTGGCATTtatcacaattttttgtgaagtggattttagtgttatttatattatgactat
-gtaaatactgtttcctttcaagccaagtcatatattttggttacatttcctttcttgtac
-aactctttgttcttcctggagttactactcgctttgctttttttcatttgctgtttcctc
-ttaacccatccttaattcTCTTAATTCTTTGACACCCTCAGTCTCCCCATAGTTAACATT
-ACACATCCTGAAACTCTTCAAGTGCTTTTAAAGAAGCATCCCCATCCATTTAAAAAAAAC
-TGGAGCCAATTTTTAAAATAGAATCTCAAATACAATCTGTAAaataaagatttgtgagca
-tccactatgtgccaggagctgtgctaggcagagtgggaaggtagccaaataggggatatc
-cctgcccatgtggGTTTCCAAGAGGGATGAAAACTGAAGCTCCACACCCCCAGCCTCTGC
-ATTTACCGGGGAACACCTCAGCACCTCTAGGAATCTCAGGACCTCAGGGAGCCCAGATTT
-ACTTATTTGTAAAATGAGGATCATTTTGTCATTCTGCAATCACTCCTTAACCATGTTGTC
-TGGGGCTGTGTTGTGGCTGCTGGGTATAGAGCAATGATCTCCCCATCCCTTGAGGGGCTC
-ACAAGAGCTGTGGGATAGAGCGGAGGCTGTGGATTGCAGCGGAGCAATGGGAGCTGGGGA
-GCGGGTTTCCCAGAGGAAGTACCATAGGACGAAGAGGGTCTTGGTGGGTAAGGGCAGtaa
-acggctgttatgttccaagggctgtgcgaagaacttccatgtattgtcccatcaaatcct
-cccaaagacccattgaaaggggtcatatttttatcacaatttcatagatggggaaactaa
-ggccaggagagtccaaggccagggtcacacagctaataagcggcagaggcagtatttgaa
-cctatgcagttgggttcttaaccacacactgcactgtCTCTCACATCCAGATGCCCAGCT
-CCTGTCCCCACCTCATCCTGTATCTGCCTCGTCCTCTCCTGTCTACCCACTGGTGCTAAC
-CTCTGGCTCATTCCATGCCCTTCGCTTTATTCatccattcattcaacacaaatctactgg
-gcgccttttccacgcccaaccctgggctgggcagtgccagggacatagAGCTTGGGCAGT
-ATTGACTCACCCATTCCCAGATAGGCATTGACATTGACATGCAAGCGGCCAGGAAAGTTG
-TCTAAATAAAGGGGTGTTTGGGGTTGAGTGATGGCtgtgtgtatgtgtgtgtgtgtgtgG
-CCTGCAAGGGGTGTGTGTCAGTGTGGCAGCAACAGACTTTCTGTGGAGGCCATTTATGAA
-GGCATATCTGTGTACCCTTGAGAGTGTGTTGTCTGCAGAGGGTGTGTCCACCAGGTATGt
-ggatcagtgaggctctgctgcataacaaaccactctaagcccagaagcctaaaaccactt
-attagcctgtgtgaagtggcagtctggcctgggcttagctgggcagttctggttttacct
-gggttcacttgccttgctgcagtcagctgagggtgggggctctgggagggcttcactcac
-atgcttagcagttggcaggctgtttgctggggtgcctccatttgctttgatgaggctggc
-ttgggctcatgcttatggtgacctcagggttccacattcagcaagagaagataagctcca
-acgcacagtgcattttgagcctctacttgtgtcaagattataaatgtcctaatagcccaa
-gtgacatgtcaagtcagattcaaaggatggagaaatagactctctctctCTCTCTCTCGG
-TTGTGTTTTTGTTCTTTGAAAACAAGCCCGGCTTGCctggctccatcgcccaggctggag
-tgcagtggcgcgatcttggctcggtgcaacctccgcttcctggttcaagcaattctcctg
-cctcagcctcctgagtagttgggactacaggtgcgtgtcaccacgcccagctaatttttg
-tatttttagtagagatggggtttcaccatattggccagactggtctcgatctcttgacct
-catgatctgcccgccttggcctcccagagtgctgggattataggcatgaggcaccgcgcc
-tggctTAGAATCCATCTCTTagtcacattacacagggcatgagtacagatatggaggaat
-tattgtagctgattttcaaacaacttaccTGTGTGTGCAGGTAAAGAActagggacagtt
-ctcagttttggaaataaaaaaaactctgggctgcagtcctggctcttccgtccttgctgt
-ctgaccttagtcaagttgtctcattctctgagcttccgtaaattggataaaattgaatga
-aacgagatgatctttaTAAAGTGCTTGTGCTACTCATTTGTTTACAAACGcagcacatat
-ttattgaggcctcctatataccaactactggtcccaccccgaggatattgcagtgaacaa
-aatggaccaaaacacctgctcttgtgaagctcacagcctaggttgtagacagatgttaat
-tgatcatcctaataattgtatgaccattgagagtagattccggaaggagagattgctgac
-ctggccaggttgatctgagaagccaaagatatttaagctgagatgtgaagggtaggtagg
-agacaacgaggagaagaaagataggagtggaaaatgattctagatggagggcatgtgcaa
-aggccctgtggtgggaggagtagattccaggaacacagagaaggtgggtggggctggGCC
-TGAAGCACCAGGGCCAGATGGTGTGGGGCTGCTGGAGCCTTTGAACAATGTGAGGGTCTG
-TCTTGCCAGGCAGcctaaaataaaaccgaaaggcctaactgctccacaaggccctcatga
-tcggggaccttgttactcctccagtctcccctttacctactctgctgcagccatgctgcc
-tccttcctgttccaggaacaccctggacacattcccacctcagggcctttgcacttgcca
-ttgcctttactagtatcgaccctacccagatattctgatgactcattctgtcacttcatt
-tccatctctgcctcttcaaaggggccttccctaccaacccaccacaacccccctgcccct
-ccagctaagcagtcagcatccagcagtctctacttccctggcctggtttatttctcttcc
-tagcacatatcacctcctggcttatattaaccagaggccacattgtctgtttctcttctg
-gatctctcaccagagtgcagctcagcaggcagggacttggccttgctctaggctgtgtcc
-tcagcctcaggggaagagtaggcattccataaacatttgtgaataaagaaatGAGTGAAA
-ATGAGTGAGTGAATGCTGGAAAGAACTAGCTCctggaaattaggaggtctgggttcaagt
-tctagctGGGCGATCCTTTCTGTTCCTTGGTTTCTCCAGTTGAGCTGTGAGGCATTTGTG
-GTCTCTAGGGAGGTTCTAGGACAGGAAAGGAGTACTCCAGGCTGTGGAGGGGGCCTATGT
-AGGAAGAAGGGAGCTGGGGCCTTCCCTTTGGCCTTCTGGCGTTTGAAAATAGCCTAGCTC
-AGCCCCTAGCTTGGGCCCCTACCCTCCCTGGGGTGCCAAGCTGGAGCCAGGGGGCTCTGT
-CTGGAGCCTGCCAGCCTGGTGCCGGGCTGGGATCAAGGCCACCTGACAGCTGGGCCAGGC
-AGTCCTGGAAGGTTCTTAAGGGCAAACAGGGCATGCTGGATGTCCCAGACCTCCCTCCCC
-ACCTATTGTCCCTCCTCCCTCAGTGTCCACCGGCAGGATAAATCCCTTCATCCTCTACAG
-GCCTGCAGCCCTTGCAGCTTGCAAATCTTTTTCTTGGTTTGTTTCTAATTTCACCCCTGC
-TCAGTAGctactttactggtgaggacactgaggctcagagatgacaactgcctcactgag
-gttacgttgcagttatgattcaggcccaagtctTGCCCAGCCCTGTCCTGTCACCGCGTG
-CACgtgtgtgtgtttgtgtttgtgtgtgtgtgtgtgtgtgtgtgtgGTCTCACTATCAAA
-CAGTGCCCTCCCTTAACCACCAGTGCCCCGGGTCTCTGATAAGATGtgatgactatgagc
-acctggagccaggtggcctgggttcaaatcccacctttgctacttctatactgtgtgGAT
-TGCTGGGCCACCCCCACCTCAGTGTCTGCTAATAGGACAAATCCCTTAATCCTGGGCACT
-GGGGCACTATCAGGACTAGCATTGTATACATTGCACAGGTTTTAAAAAATGTAATCTGTA
-ggctgggcacagtggcttacacctgtaatcccagcattttgggaggcccaggtgggtgga
-tcatgaggtcaggagctcaagaccagcctggccaacatggtgaaaccccgtcactactaa
-aaatccaaaaattcaccaggcatggtggcgggcacctgtagtcccagctactcgggaggc
-tgaggcaggagaatcgcttgagcccagaagctgaggttgcactgagccgagattgtgcca
-ctgctctccagcctgggcaatagagcaagactccgtctcaaaaaaaaGGTAATTTGTTGT
-CAATATTTACACATCTAAACCATTGGAAGAATAATGTATATATAAACTAGCTAATGAACA
-CCTACCAAGCCCCAAGCACCAACTGTATGTCCAGTACAGAGCCAGCTGCTCCAGGGGAGT
-TCGTTCCTGGGAGGGGGCATCATGATGAAGTGGGCGTGGTTCCCATTTCCTCCAGCGTAG
-TCTCAGAAGCGGGAAGCCATGTGACTGAGGTTACAGCCAGGGAGGGCAGAGGCCCCCGGC
-ACTCACCCCTCTGGGGTCCAAGCCCCGCTGGCATGTGTTGTGTCCCTGGGTAGGTGTGTC
-ACTCCCTGTCTGTGTCTCCAGTGTTCCTGTTGGCAAATCAGGGGTGGGACGGAGGTAAAT
-GGAGAGGCCCTGCCCAGTCTGCTGTAATCCAGGATCTCGGACTTAGTGGGGCCAAAGCTT
-CCAAGTTCTCCTGATTAGTGAGGCTGCAAAAAATGTTTGGCATGTTATTCTCTCACCGTT
-TAAATGTGGGCAAGTAACAACTTACATGTAAAATTACCCCCATATACCAAGCATTTaagt
-tatttattatatcattgcttacaatagcaaataattggaaattatttgagaaatggctaa
-agaaactcaggcccaggtacgcaagggaatcctaggcagccctcaaaagatgtcctgcaa
-acacctgatgtggaatcacaagatacacaacacaggtcagtgaacaaaacaagttgtggc
-atgatacccacagtgtgctgctgcttgtggaagcaggaaCACATGTCCATGTACTCTTGT
-ACTGGCACAGAACCCTGGAGAATTATCCTGGGAACCCTGCATGCTGGCTGCCCCTGGGGA
-GGGGAACCCGAGGGTTGGGCTCAAGGGTGGGAGGCAAGACTCACTACTTTGCACACCTTT
-TGAATTTTGAATCATGTGAATGTGTTATCTGTGCAGAAAAAATAAAAATACATTTAAAGT
-AAAGTGAAAGTAGACAAGAAACCTGAAACAGAGACGGACAAGCAAGCCTGCAGGCCCAGC
-CAGCTACCGCCCCCGGGCAACCTCATGCCACACTGTGGGCTCTGCCCAGCTTGGTTTTGT
-GGCTCCACCCTCTACGGTCATATTTGGGTTTCCACACACACAGCACCCAAAGGAAATCCC
-AGCTAACGCACATCAGGTTCTGGGCTGGGCCACCCGCCAAGGTGGTTGGTGGGCATGACA
-CCGCCCCGGGAATGGCGTCGTCCAAATGCCTGAGCAATGACACGGCCTCAGATGGAATGA
-TGCCACTGCCCACAGTCTCACAGGCCCTCCCATCTCGCCTTTGTTCTGCAGCCTCCAGGT
-GGGTGTATGGACACTCCAAAACAGCCATCCCTGTCAATGAATCAGCCTGCAGGGACTGAA
-TTCattccttcattcatcaatatccattgagcacctactgtgtgccaaacactcttctag
-gaactgaagatgcaacagaaaacaaaacagataaaaatccctgccctcgaggagctgaca
-ttccagaggggacacagacaatacttgccagagtgaaaatgctaaggagaaaaatgaagc
-agggaaggatgggGAACTAGAGATTTTTTTTCCtttttttattgaggttgaattgataaa
-caataaaattggcccattttaggtgtacagttggatgcattttgacagttgtatggcact
-acagacaagtgctagaattcctgtatcatcccaccatgttccttcacgccccccacagtc
-agcccctgactcccacccgctcccacccgaagaaactacagatcagttttctttcactgt
-agatcagctttgtctttcccagagttcatgcaaatggaatctggcttctctcagtcagca
-tcatggacttggttgagattcgcccgtgttgctgagtgtatctgtagcttgttccttttt
-actgacgagtagtattccacagtgtggatgcactgtattttgtttattcatccaacttgt
-tgacggacatacaggttgttcccatttcttggctattacaaataaagctactataaacat
-ttgtgaacaactctttgtgtggatgcatattttcatttctcttgggtaactaccacggag
-tggaattgctggacctcgtggtaagggtagctttaTTAGAAGCAGATCTCATGCttttaa
-acaggatggtcagataaggtgtcaccggctcggtgatatttcaggagaggccagaaggag
-gtaaggggtgtctgcagggaagagtgttctgggctgaggaaacagagtcagtatgtgcct
-ggagtgtttgaggaacagcatggaggccatcaaggagggagtgaaggacgtgaggggaga
-gggctaggaggtgtgctccatgtggaatgaggctagatggtatagggtcacatacatcat
-ggtgaggacattggtatttttttcttttgacatggagtctcgctctgtcacccaggctgg
-agtgcagtgacacaatctcggctcactgcaacctccgcctcctgcattaaagtaattccc
-cggcttagcctcccaagtagctgggactacaggcacgtgcccccacgcccattttatatt
-tttgtagagatggggttttgccatgttgtccaggctggtctcaaatgcctgacgtcaggt
-gatccgcccacctcagcctcctgaagtgttgggattacaggtgagagccactgcacctgg
-ctgaggacattggtttttcctctgagaacccgtgggaggaatctgagcagaggtgggaca
-ggatcagacttgcattttaacaccttcccccatctccagctaccaagtggagaatgggct
-gcagggctgcagggaggaggctactgtaatagtcctggcaggagatgaaggagttggact
-ggggtggaggcggtgggggctgaggggtgtgggattctggatctttctggatctaccccg
-aatgtggagccaacaggggatgtattggacgtgggatgtggggaaagtagggacatgaaa
-gaaggctAGGACCCAAggtgacctctaggaactgagagtggccctccagctcccagctgg
-caaggaaacatgcatctcagaccggcaaccacaagaagttgaactgtgctgacaaccaaa
-ggaacttagagtggaccctgagccgcacaaaggatcacagcctagctgacacggtgattt
-cagcctggtgagacctaagcagagaagccaatcatttcatgccaggacttctgacctgca
-gaaactgtaagaaaataaatgggtgctaagtcactaagtttgtgataatttgttatgtag
-caatagatgactgatacGGGCATACtagaatcctacagtgtgagagctaaaagagtgctt
-agcaaccactaagcccaccccccccatgtacatatggggaaactgaggctcagagagcac
-agaggacttgAGGCGTGGTTCCTGAAGGGAGGCGACATCAGGCAGAAACTGTCCCAGCTC
-TGGAGGTGTCGCGAGTCCCAGCCTCTCCTCTCTTAGGAGGCTGTAGTACCTGCCCCTCTG
-CCAACCCCTGCTCATCAGGACTCCCAGAGAGCCAGCTCCTGGCTACCCACTATCTACCCT
-CGGCTCCCCAAGCAGCGAGTTCAGGCAGGCTCCCCACTGGTGCAGGCCCTCACCCCCACA
-GCAGAGCATGGGCCAAGGGTGCACGAGCCAGGCCTGAATCTGAGACCCCAGGGAAGagag
-gaaaaatcacaaccttgggcctggctagaatcccaactctgccactcaccagctatgtga
-ccctggttgagggactcccctttgctgagctgcagtgtccacatgtataagatgggagta
-gggatgctttcctccaatggtcaatgagctaatgaaggtgaaactcttggcGGGAGCACT
-GTAAATGCATGTATCCAACCTcttcctctgcatgggcctcagcttccccatctgctaaag
-ggtcttgtgttcttgatgtgtttgggggggcccttgcagctctaactatatgaggattca
-aattccggctctgcttctcactagctgtgtgaccttgaatatgttactcaagctctctga
-gtcccagttttctcacccataaaacggggctattaataatacctcctattacaggagaga
-tgcaggtcagatacctagtagagtgactgAGAAAATGTTAGCTAGTTGTGTTATCATCAT
-GATCACCATTTCTAGTGTGTGAGTTTGGTTGTGCCTGCTGGAAGGGGCAACAGGGCCGAG
-CCTCCCAGGGTGAGAAAGTTTGGTTTTCTTAGAGACAGACGTTTGTAGGCTGAGCAAGGC
-ATGCGTGCATTTCTGGGAAAACAAAATTAGTTCATTTCCCTCCAAATCCCTGCCTGTGCA
-ACCACCTAAAGCCAGGCTCTGAGTATCACAGTGCTTATAAGTGGTAAACCCACAGGCAGG
-TTTGTGAAAATGAAAATATGCATTTATTTCTGTTCCCAGTTCTGAGAACTACTTCCTGTT
-TCCCTCTAGAGGAAGGCAATGGCTTGTGCACATGCCTGGAGGTGGGAATGTGTGTCATGG
-ACACAAACTGGGGTGGTTATCACTGTGATGTTCCCACTGGCCATGTCTGAATTGTGCACG
-CAATCCTCTGACCATAGCTGATTCACTGGTGTTAACAGACACCTGACGGCAGGCTGGGCA
-CTCAACAGTCTCTATTGGAAATTTGAAACTTGAATGGGGCACACAGACAGAGAGTGGCTG
-GAGATGCATCATTCCTGGCCAGCACCCTAGAGAGGAAAGCCACAGGCCCTGCCCCTGAGC
-TCCCCAGAGATGCCTTTTCCTGTTCTTCCCACAAGAGTACTCGTTTTGGGGGTTTGCTCT
-TCCCTCATCCTGGAAATGCCTTTCAATAAATCCACTGCTGGGCTCCTTGGTTAGTCAGTT
-TTTCGGTGTTTGCCACCCAGTTCACCTTGGCCAATGTGGTGACTAGGGAGACAGCACTGC
-TGGGGGTTAAGGGGAGACTGTGCAATGGAGCAGTGGCCCTCTgtggagtagttctgggca
-gaaagagcactggacccagagtctggttcttcatgatgtactgccatgtgaccttgggca
-aatcacttaacttctctgTCTGGGATGGAACCAGGGGGCACCTTAGTAAGcagatgggga
-cactaaggatcagagagaggaaaggctttacttaaagccacacaacaggtttaggacaga
-cccgggagagctgggccctgcaaatcccagcccTCAGAGGGAAAATTTCCTGGGTTAGGA
-AGCTTATTTCTAATTATCACCAGGACCTGTTTACCCCAGGTGAACAGGGTCCCCAGGCAC
-TTGGCAGATCACAGATTTCTTTCCCAACCAATTGTCACATTTGGCCTTGGCAACAGCATC
-AATGGCCCAGGAGGGGGCtgagtaaactgagcccagagagggacagagtcttgtgcaggg
-tcataccacaagttcatggcagaactagagtctgggccagatctAAAAAAGTGTTGCTTT
-TTGCTCTAAATTTAAGGAGGGTGAATTGGGGGTAGTGGCTAATGAGTTCTCCAGAGGAAT
-TTTTAAACTGTTTGCTTTCATTTTGATGATAATCCTAAACATGTAACTCAAGCATATCAT
-GAATCATCTGCAGAGCCACAGGTAAGTCCTGCCTGAGCTTGCGTTTGGACTTGGGATCAC
-ACTGGCAGCAaataatagcatttgttgagaactaactatggcccaggcactacgctttgc
-attttttatctattttttaaaattttatttaatcctcacaacaaccctataagataaatg
-ccatcagcatccccatttcacagatcaggcagtcaaggtgcagagaggttaaggttaagt
-aacttgaagcaatgttaacagcgagCCTGTGATCTTGCCCACTACACTTTACCATTGTAA
-TCGGAGGAGAAAATGGCAGAGGTGGCTTTGATATGTAAAGATGAATTCCTGCTAAGTGAA
-GGCCAGTGATGCAGAAGTACAGGGTGGGGAGAAATTTCACCATGGGTGAAATGGTGCCAA
-ATGGTGGGAGAACAAAGCCATCATCAGCATGCAGAGTTGGGTGGAAGTGCGTGACAAACC
-CAAACAAAATGGCATCGCAATTGAGTGTCCCACATTCACACTGCTGGTGGCAACTCTGGT
-TTAGCAAAGCAACATCAACCATATCATTAATTAATTAATATTGTTGCATTGATGATATGG
-cagcatagcttaatgcttagggatgcaggcttaaaactcataatttctgacttcaaatgt
-gttttcctcttggcctagtcctcagactatgggcaaatcactcaacctctctaagcctca
-gttttgttcatctttaaaatggaattgtaatagcacctGATagactgctgattgcctatg
-caattcccttcttttcctgttttttgttgaccaaaccctgattttattcccgatggtgat
-atatctagctaagtaagactttattcccagcctctcttacagctactggtggccagcgag
-tggaagttattcagtgagagacttctgaggactatccctagagggggccaatgcatctgg
-gaggaaagcccatatactcttctttctccttcttcctatatggaactcaggcattatggc
-agcagccccagcagccatctaggatcaagaagtgaccttcaggatgaagacacatgataa
-ggatgaagcaacatgaggctggaaggaacctgaaacattgatgataccatagagactgca
-gcagccctgggctgactcttccctgacttttttttttttttttttttttttttaagtcag
-ccttttattttaggacaattttagatgtaagaatcattgcaaagatagtacagagagtgc
-ctgcataccccacacccagtttctcctattattaacatcttataggccaggcgaggtggc
-ttacacctgtaatcccagcactttgggagtccaaggtaggaggatcacttaaggccaaga
-gtttgagaccagcctgggcaacagagcaaggccctcttcctacaaaaataaaaataaaaa
-attgagctgggtgtcatggcataccagtagtcctagttactcaggaggctgaggtggaag
-gattacttgagcccaggagtttggggcttcagtgagctatgatcacaccactgtactcca
-gtgtgggtgacagagcaagaccctgtctgtaaaaaaacccgaaaaccaaaaccagaaaat
-cttatattagggtatgatacatattaaaaccaaaaaatcttatattagggcatggtacat
-atgtcacaatgaatgagccatactgtcattattaactgaaaagcccatacttcattcaga
-tttcctcagtttctccctaataccccttttctgttccaggatcccatccaggctcccaca
-ttacatttagttgtgtctccttaggctccacctggttgtgacggtttcaaagactttcct
-tgtttttgatgaacctcatagttttgaggacaactggtcaggtattttgtaacatgttcc
-tcaatagggatttttctggtgattttcttgtgattagacaggggtgatgtgtttagggag
-gaagaccgcagaggtgaagtgtcaatgtcatcgcttcagatggggggacattctatcaat
-acgacttctcactgtggatgttgaccttgattgctggcacgtttctccactgcaaaatca
-ctgtttctgtcctccattcaacgccatactctttggaagaaagtcactccatgcagcccg
-tgcttaaggagtgggagttatgttccacctcctggagggtgacgcacttaAGCTACTTAA
-GCTAATAAGTATTTTTTATGTAGCAAAAGCTAACAGATAAACAAACCCTTTTGTTTCGTA
-GATCTATGTTATTTGGGTTTTCTATTACATGCAGTCAAACCCAATTTTAAATGGATGCAG
-AATTTATTTCTCAGGGAGGTTGTGATAATTGAATCAGAGAGGCAGGGACAGTACCTACAG
-CAGTGTTTGGGTGAATAAACAGTAACAATAATCATCGTTggccaggtgtggtggctcatg
-cctataatcccagccctttgggaggccaaagccagtggactacttgagcccaggagtttg
-agaccagcctgggcaacttggcaaaaccctgtctctacaaaaaatacaaaagttacctgg
-gcatggtggcacatgtctctagtcccagctacttgggaggctgaggtgggaggatctatt
-gagcctggaaggcagaggttacagtgagctatgattgcatcactgcactccagcctgggt
-gacagagtgagaatctgtctcaaaaaaaaaaaTCATGattattaataacttaattataaa
-taataataattattattagttttataGTGCATTAGTATTTGATTGATAATTTTGTTTCAG
-TCTTTTTAGTTGTTTGGGAACTATAAGCCTAAGGAGTTGATAGCTCACTTCATGAATGCA
-CACAAATAAGTAGTTTACCgtcaatgccctcctaagggcctaagatcaacaggaatgcac
-ctgtagttaaacaagtggttctattactcactgggacaagaaagtgcacagcatggggaa
-ccttggaatgtcttagtgagagtgttagaaaaggcttattataggattggtctcgtgtta
-ggtgacttgaatagggtttgaggatgtggggtttttcttcagattggatgctctcaggaa
-gtgagggtaattatgcagttgcgatcttaacaagtcttgtctatagagaaggcagactct
-ggcaaggctaatgctgtcattgggaaagaagcagcggtcacttgtattagctgggactga
-ggggtgtttggtcattttcgtggcttggaaatgtgcatgatttgtctttgttcagacatg
-attacagagtgttccacttttcgtcttgattcatcaatcactgaggacctcatctgatgt
-tggtgttctggggaatcattaacattggacaggacataagctgttctctgtgcatgttgg
-gctgacttgcagcaacacccagtcctagctgatgactatccaggatggcccctggatgtc
-agggctgctttcctctttctcaATTTCAGTCAACATTAGTGGGTCTGAGAGGATCCCTTC
-CTCCTTTTAAAGCTCTCCATATATTAAGTTGGAGCAACAAGCTCATTCCTGCTCAAACTG
-GGCAGGCATTTTTAGATTCTTTTCTGCTCCCAGAAGTTTTCCTTTCCCATTATTTGGTCT
-TGAGCTGGTCTCAGGAAGAAGTAATGAAGGTGAGAGATCTGCAGTGGGATCCTGGGAAAG
-GTGGCACATGTGGATCACTGAGGCCTGGGCTCGGATGGTGAGGATTTGAAGATTCCCAAA
-GGCCACACCTAAGGGTCACCAGAGGGTgtccagcccccattatccagatgggggaactga
-gacccaggagggaagGGCTCTGTGTTGGGTCCCAAGGTGTGCCATTCCAATTATCAACTG
-CCCTCCCTTACCTGACTGGCAGAGTCCCTTTCTTCCAGTTTGACGGAAAATACTGTTTGG
-CTCTTTTTTTGTGGGATGGAGTGTAGAAATTGGGGAAAAGAAGAAAATATAAAATCTTAC
-ATTAAGCATCCTAAGCCAATTCATGTGGTCGAAGAagcagaaaagcagcagaaaagcagc
-agaaTGCGATGCCAAACACATCCTCTGTAGGCACGTGTGTTATACCAGGTTGCTGCGAGG
-GCCCAGAGGACACATCTGTTGTAGCTGAATAAGTTCCAGTGTTGAACCTCAGCACACACA
-TGCGCATCTGGGCACCTGTGCACAGAGCTTGTATGCACAGAGCAGGAACACATGCATGCT
-ACAAAAGGATCAAGAGTCAAACTCCAAACTGGCTGCCCTTATTGATAACTTCCAGCTGAT
-GGAAGGTGGAAAGGCGAAGGTAGATGTGTTTTGGATATAAAAGGTctgtcttctctgttt
-actgtctatgtgaccttgagcaaattgattgacctctctaagactcagttttctgcaata
-taatatggTTCTCTTCTCTCAGAGTAAGGATGGAGTTCAGTGAGGAAACAGAAATGTAAG
-CATtgcatcattcggaatgctctgggctgcaagtaacagaacaccaactccactggctta
-aatgaaaaagaaattgatcatctAGAGACAGGACTCAGGACCTCAATGATGTCAGTAAAG
-CTCCAGGCCCCTTCTGACCCTCCACTCAACCACTCACTCTCCCACCTCCCTGTCAGATTG
-GTCCCAAATGTGGTTCTCCTGGTGGTCCACACTGGAGTAGCATCCATGCTGTGTAGTGTC
-TTCTCCATCAACAGAAGAGAGAATCTTTGTttttcttttctttcttctttcttttttttt
-tagacagagtcttgctctgtcttctaggctggagtgcagtggtgcgatctcagctcacta
-taacctctgcctcctgtattcaagcaattcttgtgcttcagtctcccaagtagctgggat
-tatgggtgcctgccaccactcctggctgatttttgtatttttagtagagacagggtttca
-tcgtgttgaccaggctggtctcaaactcctgacctcaggtgatccacccgcctcagcctc
-ccaaagtgctgagattacaggcatgagccaccacgcccagccAGCAGAAGAGGTAACTTT
-TCTGTATCCCTGAAACGCTAAGTCTTCCTCTTTAGTATGAGTGAACTAATTGAAGTCACA
-TGACCAGCCCTGGCAGTAGGAACCATGGCCAGGGGAATATCATGTGCTGACTGGCTGCAG
-TTTTGGTCCCTGAACACATCAGTGGCTGGGGGACCCCTTCAGACTAAAGGACCTAGCCCT
-GCAGCTGGGGACTGATATTAGGAAGGGAAAGGGAAAGGGCATGATTCATGTCCCTCACTG
-CTCAGGGTCTTGCTGTGTAGCATCTCTTCTGAGATGTGGGTCAGACAGGGTGTTGGCCAT
-CGCTAGAAAGGACCCCTCCTACAAGGACAAGACTTGAACAGGGATCCTGAAGACTTCTGG
-GGTTTCTATCTAGAGTCCAAATGGGTCTCTAGAGTCAGCCTGTTGACAGGCTGAGTTGAG
-TGGCAGCATCTCTAGTGGATCTGGCTCTCTGCCTGTGACCACTTGTGTGCATGAGCAAGT
-GCCTCACAGACCTGCATGTGTACATGGAAGATGTATTTTTACCTCCATGTTTGCGTCTGT
-AGCAACAAGTATGAAATGCACATACATGTTCATGCACATGTCAATGTACGTGGCTACCAC
-ACAGTAGGTATACTGTACAGTGTAACCATACAGTGTTTCAAATAtgcatatatgttcata
-tatgtgcatatatgCAATATCTGGATAGATGTATATGGCATAATGGCATATTTATATATT
-AATAAATCAATCATTTTAGAGTATTAACTATATATGAGTTATATTATGCCTAAGATATAT
-Taataaaaacaatgtttgtcaagtacttgctatatgccaggtactattctaagcacatat
-gttctaaattaATATATGTATTACTTTAAGGATACATAACCTAGTGTCTTTTTGGGGTCC
-ATGGATGAAGTGTATCTTCACTCACCTTTAATTAAATTCGGTTGTTTCATTCTTCATTTG
-TGAATGTAGGGCATTCACAAATTCACaaattcattctttcaattgtgaatgtagggcaca
-agccacagtagtgtcaggagtgcctggaactttgtcaccattagaaatcatagctatttt
-tgtatcttgttataatgattatagatatctcaaaatattaacagtcatcatttgttttga
-cctaccactgatcttgttatttaatgtattagcaaagaagcatatatagtacaatatcaa
-aactgtgttctttaaAAAAAAAAAAAGTATATATATATATAtgtatatgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgatgaagtcttgctatgttgcccaaggt
-ggccttgaccccctgggctcaagtgatcctctcacttcagcctcccaagtaactgggacC
-CAGCTTAAAATATTTTGATGACAGTATATATATAttttttgagacagagtctcgctctgt
-cacccaggctggagtgcagtggcacaatctcagttcactgcaagctctgcctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacagttgcccgccaccatg
-cctggctaacctttttttgtatttttactagagacggggtttcaccgtgttagccaggat
-ggtctcgatctcctgacctcgtgatccgcccgcctcggtctcctaaattgctgggattat
-aggcgtgagccaccgcgcccggccAatgactgtgtttttaatataatttgtttcattcat
-aatccaatgcatttaattttattttaagcatgtgaagacaccattctgaggaggggtcca
-tggcttcaccagatgccaaagacgcccatgccacagcaaagAAAaattcattgatcaatc
-cttcaatgaccccatgaagcagcagtgttaccagtttgctacagaggggaacctgaggca
-cagggaggttgtgcaacttgtttaaggtcacatagatatcgagtggTTGTGCATTATTAT
-ATCTGTCAGTTGTTTTTATAGCCTATGGGCTGATGTGGGCTTGTCCTTTGTGTCACATCA
-GAAAGCAAGTCTGGTCAATTATTTTCTTTCTCAAGGTTAAGTGAGATCAAGAAAAATAAT
-ACACATATATTGCATGGATTATTTGTGGTCATCATTTGCTAATCCTTATACCTGTGCCAT
-GTTGGATTAATTATTACAGCTTTGTGAGCTGCTTTATTAAGGAGGGGAAGTAGAGTGAAC
-AAATCATGGCAAGTCACTTCACCTCATCTTCTCATTTAAGGATGCTGATACTGGTGTTGC
-CAAGGCGACGCTGTCAGCTTTCGGAAGCATCTTTAAATGGGAGAGGCGAAGGCCCACACA
-GATCGAGGCGGAGGAAAACTCAGAAAAAAGGCTCAAATCCCTCGGCCGCAGAGACAAACC
-ATCCTGGTGGGGACCATCCCTCACCCCCCGCACATGGCCACTTTCTACCTCACCTGTGGT
-GGTTGTCTCTGGGGTGTACTCAGGGAACTCTCTCCCCAGTGTGGAAACTGCCTTTGCTGG
-GAACAACGCAGAGATCTCAGAAATGATGGATCCATCAAGTGCCAGTGGGAGAGACTGAGT
-GGTCTTGGAGGCCTTTCCAGGAAGTTCCTCCTGCCCTTGGTACACGAGTTTGGTGGTAGA
-TGCCCAGATGCCCAGAGTGCTCTGGGAGAGGAAGGCAGCTCACAAATGCAAATGCGCTGG
-AGGTGGTGCTtggctgtgctgccttggatgagaccctttccctctctgagccctaatttc
-ttttttctttttctttttcttttttttttttttttttgagacagagtctggttctatcgc
-ccaggctggagtgcagtgacaagatgtcggctcagtgcaacctccgcctcccggttcaag
-caattcttctgcctcaggctcctgaggagctggggctacaggcatgtgtcaccatgccca
-gctagtttttgtatctttagtagagatggggtttcaccatgttgcccagggtggtcttga
-acttctgagctcaggcaacccaccagccttggcctcccaaagtgctaggattacagacta
-ggagccactgtgcccggTGCCTAATTTCTTCATCACTGAAATGGGAAGAAAACTAACCTG
-GTGCAGGGAGAGGTGACAAGTGTTTTCCATAGGAACCCGCAGATGCAGGTATCCTAGAGG
-CTGGCACCTATGAGCTGTGGCCCCCAGGAGACCCAGTCTAGGCTCGAGACCACACCAGCC
-GTGCCCTCTACAGTGCCTTGTGCTGCCCAGGATCCTCAGGTTGGTCTTGTCTGCAGCCAT
-TGTGAGTCAGCCTCACTGTCAGAAGGGCTTTCAGAGGTTGCTAGGTGCTCTGTCCATGGG
-AAACTGAGGTTCAGAGAGGGCCAGGGGCTCTGATCCAATGGCAGAGCCAGACTGATAACA
-GGGTCTAATATTCCTGGGCAGGACACAGCTGTGCCCTTGATAGTCAGAGGCAATCTGGGA
-TGAACTGGATCCTGGGGTCAGGACCTGGGGACAGGGAGGCCGAGAGAGGGCACAGAGGTG
-GAGAGAAGAGAGATGAGAGCCAGGGACAGGGAACGAGGGAAGGCTGCCTAGCATCCCTGT
-TTCCTGAAGTCAtgacttgggtgtcactgaccccactgctggtgccaggcatgatcatga
-gaccgaggtctggtcaagcagagtaagagtgataagcatagggatggacacaagaccaat
-cctggctgcagaaaatcattcctttactggaatcatggagacgagggagctccccgggtc
-agggatgctgagctgggaggacatgagcctggggctgccagagccttcttgtgaggaaag
-atcctggctgagaatgaagtcaacggggcagatggaggggctgagaggtggagctgacat
-catttgagcctctggatctaacctcacttgcctttacccttagactttccagttatgtga
-gtcaatttattccttAGGGCTAGAATTTCTATCCCTTATACCTGAGTCCTGGCATGGAAG
-AGGAAGGAAGGTAAGAAAGAAGGATGAATATTTAAGAACAGGTGTCTGAggctgggtatg
-gtggctcatgcctgtaatcccagcactttgggaggctgaggcaggtggatcacatgaggc
-caggagtttgagaccagcctggccaacatggtgaaaacccgtttctactaaaaatacaaa
-agttttccgggcgtggtggtaggcgtctgtaatcccattactcaggaggctgaggtagga
-gaatcacttgaaccaggaggcagagattgcagtgatctgagatcatgccactgcactcca
-gcctgggtgacagagtgagactctgtctcaaaaaaataaaataaaaTTACATAAAGAACA
-GGTGTCTGAGGATAACTCAAATCAGCTTCCTGCCCCCTTATAAAATGGGAGTAGAGAGGG
-ACTTGGGCCTTCAACCCACCCAGAGGAGTTCTGTCCCTGGGCCTCACAGCTTTGCCCTGT
-CTCCTCTCTAGCTTGCAGTCAGCCTAGAAACTACAATAGAAAAATAAATGATGTGGATAC
-AAAAATAAAATGCCTTTTCCTCACCTGAGTGCAGGAGAAGGGGCGGCATGTGCTGGGGAA
-TGCCTTCCTCACCCCATTCTCCTCTTTGaggacaaacatttattaggcacctgcttcatg
-ccaggctctattaagaagatgacatacatggtctcatttcctccttgccatagcccagcc
-aggaaggaatattatcatctccattttacagatgggaaaactgaggctttgatgatgtga
-agataactggtgccttgagaggctgagccactggaccaaagtgtcagagctggagcaggt
-ttgtccgactccaaagccctgcccaccacaccacactgcACACAGTAGAGGCTAAATAAA
-GGTCTGCTGGGCAAATGCTGCTTAAGGCGATTTGAGCTCTCTGGGCAGCAATCTGCCCCT
-AAAGATTTCCCATCATGCCTGAAATGCCACCATTAGCAACCATGTCCTTTGAGTCTTGAA
-GGGGAAGAGTGCTAATTCCCAGGAATGAGATCAAAGTCAGTCTGTGCTGGGTTTACTCAG
-GGATCGGCTGAGAGTGGGACTCAGGGCTGGGGCGAGCCAGGGGGATGAAGGGGTCCCATT
-CCCATTGGCTCAGTCTCATCCAGGAGAAAACCTTCTGAGGACAGAGGTGTATCCTGGCGG
-TAGGGCAGGTGGGCTCCTGGCTATGCCTGGGTGTTGGCTGATGACAACAGGGCAGACAGC
-ATGACACAGTGATGGGGGCAGGTGACAGAGTAGCTGTGGATCCTTTCTGACTCCATCCTC
-TGAAAGAAGCTATGAGGGCCCTGGTCTCCCAAACTCAGGCAGAGGCCTTATCTCCTCCCC
-TGCAGCTCCCCACCTACCACCACAGAGGCAGCATCACTGCTGGATGGGGAAGGGAGGGAG
-GCTAGGGGTTAGGGCTTGGAGGCAGAGAGGATCTGGACTTGGAGACAGATGTCCTGCCTA
-ACAGTCCCTGTAATTGAGCCTGGGGGAGTTGAGGTTACAGGGAGTCCTAAGGGAAGCCAC
-CCAGGTAGAGATCAGCTTCCTGGGACTTGAAGGAGCCTTGGAGGACATGAGCCTATAACA
-CAGACAGGGACCTAGTTCTAGACCCTTCTTCAGGGATGGTATCTGTTTTAACTGAAAGGT
-TATTTCCAGTTGTTTTTAGAGGTTGTTTGAGGCTGTCACTGTGGCCCTTGTAGCCAAAAA
-GGGTGAGTATAGCTGGGGTGGGGATGGGGTCGTAGGGCTCCTCCTTATGCCAGGGGAGCA
-CTAGCTTTGTCCAAGAGCATCTACAGTCCTGTGAGATGCTCTGGGACAAACCGAGCCCAT
-TTTCAAATaagtaaatttggagaaagctgcccactctagccccttcatgggtagtcacaa
-ggcacttggccatattaaaggctctgatcagtcctgcagtgaagagtgcctgttcacttt
-gacttaacctgctgtttccTTTTCTCATTGCTCATAGGTACTTTTAGAGACAAGCCATAG
-TTATTCCCTGTGACACATCCTCTAGGACATGCTGGAGGTGAAGGAGCATGTCCTTTTGGG
-TCTCCTAAAGACCCTGAGCTCCAAACATTGGAGCCTAGAAGTGGTGAAGTGGTAAAGCCT
-AGAAGTGGTGAAGTCTAAAGACCCTGAGATCTAGGGTCATTAGAACCTAGAAGTGGTGAA
-GTGTGAAGGGGAAATAATGATTAACCCACCCACTAAGGGGTGGATGCAGCCCCTTCAGAC
-TTGAAAAGAAAGTTCAAGGACATCTCAAGACTAGAAAATCTTGGAACAGGAGCTTAGAAT
-GGGAGATGGCCTTCTTGCCAATCCAAGGGAGAGAACCTGGGCCATCTGGGCAGCTTCCGA
-TGTGCAAATACATTCCCACCTGCCTGCAACCCCACCATTGGTCATGGGAATCAAGTTTGG
-TCTGTTCTCAGCCCATTCAAGGTACTGTGACCCTCAGGCAGGGAGCCCCTGAAGGGGGAG
-GGAGAGAAGAGGGGCGAGGACTACATCAGAGGGATGGGCCCCGAACACCCTCCATGTCAC
-AGACGGAGGGGAGTTGGGGGGCAGATGACCCTTCTGGACTTCTGGGTCAAGGAGGGCTGG
-CTCAGGAAGCCCAGGGTGTCAGGGAAGGCGGTGGCACAGTGTCTTGCATCTGGGTCCAGG
-TTGTCCAGGAGTGCCAAGTCCGAGCTTCTCCTGTGTGGTCCAGCCTCTGGCACAGCTGCT
-CGTTAGATGTCCAAAGGCCGTATCATCATGCGAGAGGCACGCAGTGAGTAGCTGGGGCCC
-TTGAAGTAGTGCCAGCGGATGCCGTCCATCTTGTACTTGTTGTCGGGAGCGTGGTAGTAG
-ACGCCGTTGAGGTTTGACAGGCCACAGGCGTCAAACCACCACCCTGGTGGAAGAGGGAGG
-ACAGGCGCTTGGTGGAGGTGGGAGCCCAGCCAGTGGCAAGAGGGCAGCCCCTGTGTCCCA
-AAGAGAACAAAGACTAATCGGGGCTGTTGCCTCCTCTGGGAAGCCAGCTggctggggatg
-gggctgggtgggagtgggggtggggTGGACAACAGACCCTCTGCTCAGCCGGGGCCTCTA
-GAGGGCAGCAAGGGGCTCTGGCCACTCCTCGAGCCCCCTTGCTCCTCCCGGCCTTCTCCC
-TGAGCCCTTGGCGTCCCTGTCTTCCTCCCTCACTGAACCTGTCTTTCCAGCTCCCCAACC
-TCCCCTCATCGCTCTGCTCACTGCTTTCTAGTGgtctctgtcactctctctgagtctctc
-actctccaggttcatctctttctctcttatggtctctgtgcgtgggtctgtctctgtgtg
-tcccattgtgttcatctttctctgatggtctttgtccctctctgcctttcgtgtctctgg
-ccctCCCTTCCTCTGGGCCCCCATCTTTCACATGCTGTGTTTGTCTCCCGGCCTCTCCTT
-GGGCTAAGTCTTTCTCCCCCATCTCCCTCTGTACTTCTCTGCCCCAGTATAGCTCTCCAT
-CTGCTGCTCAATGACTCTGACAGCCTTGGtgtctctctctttctccatctgtcctctgtg
-tctcagaaggtctctccccctgtctctgttcttcttactttgtctctgtctcCCATTCAC
-CCCACTTCCTGTTCTCTGACCTCTGTGCCTACCAAGGAACACTGCCTGAGCCACAGCTGG
-TGTGGAGCTGCCCCTCTGCCTCCCTCTGGTCTCCTGATCCTGGTTCGGCTTGCCTGGGGT
-TGGGACTGATAGGGTATAGGGTGCCTCCCCCCCGGGGCCCTGCACTCAGTGTTTCTTTAG
-CCTTGTCTCTGAGGAAAACTGGTGGTGCCAGCTTTAGGAGGAGGTGAGACCTGGAGGGGA
-CTTCAAGGACTCAATGGGGGAAGGCACCGAAGGGGCACAGCCAGGTGAGCTTATGGGTGG
-GCAAGGCCCAGACCTGCACCCATCCTCCTGACAGCACCTGGGCGCACAAGAACCTGGGGA
-GGGAATGGGAGTGTCAATCTGGGTGAGCCTGTGGGTGGGCGGAGCTTCACCCCACCCTGC
-ACCTACCTCCAGACATCACTTGGGCACACTTGCAGAGACAGTGGTCGTTGTCTGAGTCAA
-GGGTGCTAAAGCTGGTGTTCTGCAGGACCAGGCTGCTCTGGCGCCCTGCTGAGCCGCTGT
-ACCCGACCACAGAAAGCCTGGAGGCCACCCAGAGGTGGTGGTGGCAGAAGGGCCCAGAGT
-CAGGTTGGGGCTGTGTCGAGCAAGAACTTCCCCAGTGGCTTTGTCCCAGGCTGGGCTTCC
-CCTCCAGGTGTTCTTGGAGGGACAGCCCCAGCCTGGGTGGAGTGCTTGGGCTGTTTCCCT
-TCCTGGATTGCCTTCCCTGCCTGCTGCCTCCCAGGGACAAAGCACTTACTGTATGCCAGG
-CCTCCCCTATCTCACTGAACCTGAGTCTTGGAGAGAAGTGATAATGGTCACAATAATGAT
-AATAATGGCTAATACATATACAtttttttctttagagacagcaacttgctctgttgccag
-gctggagtgcagtggcacaatcacggctcattacaaccttgacctcttgggctcaagcaa
-tcctcccacctcagtctcctgagtaaatgggacaataggcacgggccaccatgcccagct
-aatgtttgtattttttgtaaaatacaaacatagggtctcactatgttgcccaggctggtc
-ttgaacacctgagctcaagcagtctgcctgccttggcctcccaaagcactgggattacag
-atgtgagccaccgtgcccggcAACGTTTCTTTTTCTTTCTTTTTTTTCTATTCTTTGCAT
-CTACTATGtgttcaaagtgctttgcataggttaactcattctcctttaatcctcacaaca
-ccctatttccattttacacatgcgaaaacagaaatcccaagagccaaagaaacctgctca
-agtctcagaatgaatgagggtcagagccacatgccagcctagtgtggcctgacttgggag
-tctacgtgcatttTGTTCCCCAGCTGATGATGATCTGGCAACCCCAGCCCCATCGCACCT
-CCTCACATTCACCCACCTCTTCCAAGAAGCCTTCCCTGACTACACCAGCCCCCATGGATC
-TGGGCTCCAGGGCACCCCAGCTCTGCAGCTTCGACATCTGCTGCCAGCCAGGTGAGGATT
-TCTATTTCTTTGCCAGGCTCTGTGGCCTTGGTGGGCATGTCCAAGCCTgcctggtgatga
-agaccatgagatctgggggcagaaagcctggattcaaattccagctctaccacttagagc
-tgcatggccttggaggattggctcaccccactgagcctcagtttcttcatctgttccagt
-ggtaatgatagtgaaattagcagtgctgccctcgtttattattgatttggtgatgtcagt
-gtgtgaagtgtgcagagcagtgtcacggggtgagtgctcaacattcagtgcttgttatta
-ttTGGCCCTTGGCAGATGGCTGGGCCTGGTTGGAGAGAATGCGGGGTGTTTGTATGGCAG
-GGTTGGGGGAGGCTGCACTGGCAGCTGAAGTAGGGAGCCAATTTGGGAGCAATTAAGAAG
-GTCCTGCTGAggctgggtagggtggctcacgcctgtaatccccgcactttgggaggctga
-ggcaggctgattgcttgagcccaggagttcgagatcagcctgggcaacatagggaaaccc
-tgtttctataaaaaatacaaaaattagctgggcatggtggtgcatgcctgtaattccagc
-tacttgggaggctgaggtgggaaggtcactggtcactggagcctgggaggtctgggaggt
-cagggctgcagtgagctgtgatcatgccactgcactccagcctgggcaacagagtaagcc
-ctgtctcaaaaaaaaaaaaaaaaaaaaagaaGGTCTTGCTGGGTGGAGGCAAGTGGGTGG
-CAGATGTGGCCAGGGCAGCTCAAGGAAGCTCTTGTACCCTCAGGGCAGGGCCTGAGAAAT
-TCCCCAGTGGGAATTCAGAGGGAATACAGAGCCTGGGTATATGGTTGGCTCAGTCCCCAC
-ACCTCCAGTCATAGATTGTGTCTGTCGCCAGGGAAATGAGACTTAATTATTCTCTGTGTA
-GAAAAGACTTGGGAGGCTCCCTCAGCTTCCTTTTAGGCACTTACTATGTCTGGGGATGGG
-AACAGCCGTGCTCCCAGAAAGCAGTCCAGTCAAGGGTGTGAAAGGCTGCCACGAGACAGT
-GATCGTAAtattgtttgctgagcgtttactacatgccaggcactgtgttaatgcttcatg
-tgcagtatctcattcaggcctcatcacaccctttttgaggtaggtatgcctaaagcaccc
-attctacagatgaaaccgtgaagggacttgctcagggtcactcagggaagtagggatgga
-gtcgggatttaagccTTTGCTTTAGTGGCCAGTGGCTTAAATGGGACTCAGCATAGTGTT
-GTAGCTACTCACTGGTCAGGTGTGAGGAGTAGGGGGACATCCAGGGAATTTTTCATTCAG
-CTCTGGACCTTGCATTATCAGGTTGGTATGGATCCCATAAGGAGGGATGTCAGaacctgg
-gcaacatagggaaaccctgtttctataaaaaatacaaaaatcagctgggcatggtagtgc
-atgcctgtaatcccagctacttgggaggctgaggtgggaaggtcactggagcctgggagg
-tctgggaggtcaaggctacagtgagctgtgatcatgccactgcactccagcctgggcaac
-agagtgagaccctgcctcaaaaaaGCCTTTGCTTTGGTGGCCAGTGGCTTAAATGGGACT
-CAGCTGGAGGAAACAGTGGGGGCATATCACTGAGAAGTTCCCAGAAGTGGAATCAGGCAT
-AAAGTTCAGGAGGACAGAGAGTCATTCAGAGATTccttgtggggaagcgaccttcccacc
-agtggaggtattccagcacggctggatgatgattgcaactatggagggaatctatgaaga
-accagatgacacgtgagattttttgcagccctgtgagtgtgaatcCTGGTTCAGAGATAG
-CCAGGACCCAGGCTTATCTAAAAGATCCTTAAATTTCTCTgagaggcaatatcatgttgt
-ggagacatcatgagttttgacagcagggagatctgagttcaaattccagctcatttaact
-tgtaactttgggcaggatacttaaacttggcatctcagtttccatattactaaagtaggt
-acagtaatgcctacttcaaagtgttgtggggaagattaaatggaataatggtgcctggaa
-cacagtaggtgctcaataaatgctagttcCTTTTCCCAAATATACCAAGAACCAGGCTGA
-GGAAGGGGTGAGAAACCTTGATgatcttacaagatcgtcatgtttaagctcatcctgcta
-ttgaagaagcagaagctcagagaagccagactgacttgtccaagttcccaaagcaagctg
-gagcaaggccacaatgagtgcaggaatttcaacttctggcccagggacccttccacccag
-ccCCAGGGCATAGGACAGGCTGGGCAAGTCACCTCCTTTTGCTTCTGGGTCTCTGTAAAA
-AGGCTGACTTGGGGTGACTGACCTTGGAAGACCCCTTCTTGCTCCTCGGATGGCAGCACC
-AATGACATTCTTTCCACTCCACCCAGTGGCTAGGACATGCTGAGTGCTAACCAGCCACCT
-CCAGATCCCATGACGTGCACCCAAATGGGGGACAGATGGTAGGAACAGGAGACACCCAGA
-GACTGACCGTTGGAGCAGACTCTGTAGACACTAGCCTGGGGACCCCAGCCCGCCCACTAG
-CTGAAGACCCCAGCCCCCACAACGGCCTGGGCCCCGAACCCACCTGTATAGCTGGTTCTC
-ACTGCCCAGGTGGAAATGTTCGTACTGGGCATAGGCCTCGTGGCCTTCCCAGTCTTGCAG
-CTCCACACGCAGAGAGTAGGCTGCCCTTCTGGTGAGCTGGTGCACCACTTCATTGCCCAG
-CCAGTGCTCCCCAGCTGGGTCTCCGAAGCCCTATAGGGAGGGGAGCGTGGGGTGAGACTC
-ATGCTGAGGAGGAGGCCATGTCCCTGGCTGAGGAGCTGGGCTGGGCCAGGCTCCAGGGCT
-ACTTATACAAAACCACTGTGCTTAATGATCGAGTTCATAAGTACAGTGTAGGCAGGACTG
-GGAGTAGGAGCCCTCCACCTGCTAGAGGGAAAAGACTAAGGCTTTTGTAAGTGTAAAAGC
-CTGTTAAAAGTTATTGAAATCAcattcctctgaagttcaagaacaggaaaaagtaatatt
-tggtgactacctttggtggagtattgactgggagggggcacaaagtgggcttctggggtg
-ctgggagtgttgtacatctagcactgaatggtggtcacgtggttaaatacatatctaaag
-gctcactgagccttacactttatttgtgcgcttagacacatgtacgttaaacctcaacaa
-aaaTTAAATAAAATATTTCAATCAGCTACATAAATAGTAGAGCAAACTTTGTTCAGTGAC
-AGCGCAGCCACTGCAAGATTTCAGCAACACAGAAATGTAAAACTGAGAGTGTGGGGAATG
-TCATGTCCCAATGCCCTTGGACAGAACAAGAATTCAGCACCAAGGACAGGGGCACACCCA
-AGGCCCGCTCCCCAATTTAGTCACGATGCAATGCGGGTTAGCCTGATGGTTAATATTCAG
-GGTTCTTTTGTGTATTTCTGCACCTGGACACCCTATTCCTCCTTGCCATTTTAATGGTTG
-TTTAAAGCCCAATTAGTTCAAAACACTCATAACTTAATTTGGTATTTATTTTTAAGTATT
-CCTTAAATGAACAGCAAGCAGACGCAAATAATAGAACTGCTGTATCACTTTGTGGGTATC
-TTTTTCTATTTCTTTGGCTTTGAAAACTTTAAGAGCTTTTAAGTATTTTAAGTCAGCTTG
-GCAAAAAATCCTTTATTCAAAACCTAATTAAAAAATTGGAAAACAATCGGGCTTCTCATC
-TGATAAAATACATGTGATCTTTGGGCCTGCAATTCCTCGTTAATGAATCTCTCCTGCAGA
-TATGATCATAGACGTATGAAAAGACAAGAAACTTCATTAAAGCAACGCAGTCAGGGTTGA
-CTGGGGGGATTTTTATTCTGTCTCCTCCTTTGTATTCtttaaaaaattagaaatgtatat
-gtatttttttaaaaaaaattaaaacaaaaataaaGCTAAACTTTTTTTCTTAGAACATAT
-GTCAGAACTTTCAGAAAGAACATTCAAATTCAGGTGATGGGGTCCCATAAAGCAGATGTG
-CACTGTCAGCTTTAGATGAGTTGATTTTTTCTGGGGGAGGAATGAGGGCAAAGCAGTCCC
-CTTCCAACAGCCCAGCCCCAGCCCCAGGTTTCAGAGCAGAATGGCCCCTCCCCAAGGCAG
-CAGGGCTACCTGTTTGTAATCCTTCCAGTTCCGCTGAAAATTCACGGTGCCATTCTCACG
-GCGCTGGATGAGGGTCCACCTGCCTCCACTGCTCTGCAGGTCACAGAACACCTGGAGGGG
-GTGGGCAAGGCACAGCTGGGAGCCCTTGGAGGTAGCCAGAGGCCAGGCCTGTGCTAGCCC
-AAATGTGGCTAAGCAGACAGACCCCCACAGAGCAACAGGTgagcctgggggtcctgggca
-tcagaaagatccaggcttaaattccccacccattgtcatcatttttctaaagtggtgggt
-aaggaatgacctctcagagccttcctctcatttgtaaaatggagattcataccttaacct
-ctttgtgcctcagtctctcatctaccaactggggttgtgaaaattaaacgagatgagtca
-cgtaaagtgtttagaacagtgcctggcagtactaggtaaacggaagctcGACCTCTTTTT
-GTTGAAAGGAGAGGTTAGCAGGTGTGTGAGAAGTGTAAAAGACAACCTGGAGACAAACAG
-AGGCATTCTCCTTAGTATATTAAGAGGGGGTGAAAGGAAATAGAGCAATGgtaatactag
-caatttgagggccgaggagggaggatcgcttgagctcaggagtttcagaccagcctggga
-aacacagggagactttgtccctacaaaatgtttaaaaatattagccaggccatggtggca
-tgtgtctgtggtcccagctacttgggaggctgaggcaggaggatcactcgagcccaggag
-gtcaaggctgcagtgagctgtgatcatgccattgcactccagcctgggcaccagagcaag
-accctgtctcaaaaaaaaaaaGGGAATTATGAAGTAGGAATCTGCTAGTTGTTTCCcttc
-taggcctggctctcagaccctccctcctgacatccgtgctcttctctgtcacccttctta
-tcggatgacttgaccttaaattttaggacaaccttgggagccactgattgaaaatggtgg
-cacctctattagccctggtttctaatttcccacatggagcagaaccccaactcctgcctt
-caactggactatatgtaaactagaaagaaacgtctttgggctaaggccctggaattttgg
-gggttgtttgtaatatcagctatcatcatcttaaccaacacTGAACTATTTTGTGCTGTT
-CCAGTTAAAGCACCTCTGAAGTGATGCTGGTTAAGGATGCACTTCCAACTTTGGGAACTT
-CTGCTTATCCCCACAATCTGATCCCTGACTGCTGGGAAGTCAAAGCCACCCCTACACCTC
-TGGTATTTCAGATACTGGACAAAGCCTGATCCCGATGGGGTGCGGGGTGTCTGTTTGGGA
-AGCCCTTGGCTCAGCACCCTCTAACAGCCACAGTTCCCAGGGAGCCCCCTAACCTTCCTG
-GGCTTCGTTGCATTGGACACCTGGATGGTGTAGACACCACTGGCACTGGCCCCAGAGCGC
-TGGATCTCTGCACAGTCCTGGAACACCTGCTCACCTGCCATTATGAAGGCTGCAAAGGGA
-CAACACAAAAGTCAGTTGGAGGTGGGCAAGGAAAGAGAGAAGGGGCCAAGTGGGCATGCC
-TGCCTGCTTTGTGCCAGGTTCTGGGTTGGGAGGTGCTGGGGACAGGGAGATGAGTCAGAC
-CTgggaagatttcgtagaggaggtgacagtaagctggaacctgtgtaatgagcaggagtt
-gcccagtggagaaggggaaggtgttccaggcggaagaaacagcatatgcaaaggccccaa
-ggtaggaagggccctagtgtgtgcagaggacagGGCATGGGGAGGGGAACTAAGGCTGAG
-GCCAAGGAGAGGAAATGACTCACACCGTGAGAGAGGAGTTGAGACCAGGGAGGCTGCTTG
-CTGTATGATGCAACTGAGAGGGTAGAACAAGGCTGGCACAGAGAAGGTGGGGAAGGAAAA
-GGAGAGACGAAGCTGAGATTTCAGCAGGGCCAAGTCAGCCGTGAGTGCCAGGCTGCGGAG
-CCCAGATTCTCTGGGCTGagaaagagcactctgtccagagtgtggaggggggcctggagg
-ggatgagactcaaagctgggaggccagagaggaggctgctagagttttctgggagagagt
-tactggggcctgaacTCCAGTGAGGCActtcccatttcacagaccaggaaactgaggccc
-aagagtgaggcaactggcccaagggcacacagccaggtaaggcagaacCTTCCTTCTTTG
-GAGCTCCCTTGGGTGGGAAGCTGTGGGCTCCCCTTCATAGCCCACCCTTTTGGCTGTATC
-TCCCTGCTGCCCTGGGCATATGCTCCCTTATTCTGTCCTCCCTTGAAGCTGACTGCTGGC
-CTTAAAGGGCCCCTGTTTCTTCCCTCTGGACTACATGAGATCGGGATAGTATTAATGACT
-AAAACCTACCAGGGGTTTCTAGGCCTGGCCTGGAAAAAGTGACTGTTGACAAACAAAGTG
-CAGAGATTTAAAATCTCCTCTGTCTCAATTAGTGGAATCCAGTTAGAGGTTTGAACTATG
-ATTCTACCAGAATCCAATCTCTCTGGGTAGCCAGGTACCCAGGATGGGGCTAAAATTCCA
-GATGGATAGGTTGTCAACACCAGTGAGGAACCAGGAGGCTACCACAGGGTGGGACTTCCT
-GGTTTGGCTTTACATCTGAACTTCAGGGATCCCAGATCCTGGATCTGGGGCACTTGTCCA
-GAGAAGGCTATTGCTCTCATGTCACAAATGAGATGACTAAGACCCCCAAATCAATTCCAG
-TTCACTCACAAGCATTTCCTGGGCAGTGGAGACCCCTGCCCCACCTGTTGGCACCCCCTC
-AGCTCCCCACAGGGAATTGGAGTCCAGCCAAGCATGAGGAGGCTGTTGGCCTCAAGGTGA
-GCAGGGATGGGCTGAACCTCACCCAGTAAGGCAAGGACAGAGCCAGGGTTGGCCTGAGAT
-TTCCAGCCACCCTTTCCAAGGCTCTGCTCACTGTTATTTTCCTTAGTCTacaacaatatc
-aataacaataacaacaataatatcaacaCAAAAAGTGAAATACTCACCATGTATTGTAGT
-GTTTCCAAGGTGTCATGTAATGCCAGGGGTAGTTTGGGGCCAGGAAAAATATTTTTGGGA
-GGCATAAGAATAGGATGGACTGATATTGATATGCAACAGTTTGATCTGGTCCTCCTCTGA
-ATATCTGGGCTGGTAATTTGTACCAGTTTCCCTCGCTTTtgtgcataggcactgtgctga
-acccttttgtatgcatgaactcatccgattctctgtgcaagaactctatgagattattat
-tcccgttttacaagtaagaaaaattgaggctctgagaagttaaataaatgacttgtatga
-agttccagtgctaattaataagtgaaggagccagggcttgaactccggcccatctgactg
-caaagccagtgcccttcctcctacacATCTTCCTTTGGATTTCCACCACTGAGCATATGT
-AAGGTTGGGCAAACAGCCTGCATGAACAATCGCTGCTTTTATATCATGCACAAGTTTGGT
-CTTTTCTGCCTGTGCCCATGTCCTTGTAACCTTCTGAACCAAACTCCCCAGTGCCTGGGA
-ACATCAGAAGACTTGACTCTCTTCTCCTTTCACTAGCCTCCACCTGACTGGGACAAAGCC
-ATGCAGAGAGCTAGTGCTCCCTTCCTGCTAGACTTCAAGGATGCCTGGTTCCTGTGCCCC
-ATCTCCATCCAGCCCTCTCTTCTACACCTGGTGACTGAGCCTCTCCTTCAGTTTCTCCAT
-CCAGAAGGGGGTGAAAGCAACTGCCTAGTGTCCTTCCCTGGTGATAGTGGAGCACGGGGG
-ACAGGGTGTTTGGGCAAAAGGTGCCCAAGGTGAGGTGCCCAACACAACCTCCTACTCAGA
-CGATTGAGCAGACATTCAGCCTCATCTGGGGACTGGGTTACCAGTGGGTTAGTGGGAGGC
-ATTGGGCCCAGGCCCTGTGCCTTGGGCTGAGCTACAAGAAACCCACACATGGGATGAATT
-CAGGCAGCTCAAGGCCAGGTCTGTGCATACGCCAGTAATAGGTTCAGGTTAATCCACATG
-TCGCGATTTGGAAGGTGTCTACTTTTCCTACCTGTAGCTTCCTTAGGCCTCAAACCCCTA
-CTCAGCTGGGTCTGCCAGACTGAGATGGAGCCAGGGTGGAATCTTCTGCCCTCAAATCCC
-TGTCAGCCCTGGTGGTGCCGGGAGCGCCATCACTATTGGGTCTTAAAGGCTTTCCAGCCT
-TCCACTATGGATCCAGGAGCAGCAGTAGCCCCTTTGGTCTTTCTCTCTCATCAGGACATC
-TCCACTCATGGTTCCAGTCAGAGCTTCTTGAAAGTAGTCCCACTCTGTTCAAAAGCCTCC
-CATGCCCCCTGCTAGCCTCAGGCTAAGAGCCCTTCTCCTTCGCACAGCCTTTGGACCTGT
-CTATTTTTATGGTCTGGAAACTTCAGGAACACTGATAGCTGAGCATCTGGCACATATTAT
-GCACTCAAAAACCATGTATTTCTTTCTCCTTCCCTTTGGGACCCGTAAACCAGGGactgg
-acatttttgcaagagacaggagctgtgactgtgcattcactgctgtatccccagcaccca
-gcactgggcctgccacacagtaagtgcttagtaaatgtttgttgactgagtgaTTGCAGC
-TGGGGCCAAGAATGCCTTGGACACCCCAAGTAGGCCGTGTTAGAAGGAGTCAGTGAGAGC
-CTGGGAGCCCAGCCCAGAATTGTTTTCTTGACCCAGAAGCCAGGGCCAGGGATGCCTCTT
-CACTTCTGTTTGGCCCTCTTGGGCTTAGGGGCAGGGGCATTAAGATGAgagaggtccttg
-gggtgcattgagtctaacctcccagttcctcccattctacagccaggaaaactgaggccc
-agggaggggtaggacaagcccaagAAAGTGGGGCTGGAGAATGAATCCTGGAGACCAAAC
-TTGTCAGTCTGGATTGCTGTTGCCCTCATCCTCGCCTCCAAAACCCatgggtaaactgag
-gccaagagaggggcaggggcatgcccaaggtcacccatggaatcaggggacagggcctgg
-attgggaTTGTTGTTGACGCCATTATTACTGTTTATTGTTGTTTCTATTTCACAGATGGT
-CGGGGAGGGTGGGGCCCGCAATGGCTCCCAGGCGCCCAGAGACCCTGGAGGGTGAGCAGG
-GTCTCCCCTCCCCTCTCCTGCCCGTCTTTAGCCACACTGGGGCGCACACCGCTCACTCAC
-CCGGGGCCGAGGCGTTAGCCCTTTCTTGCACCAGGTGCCGCAACAACACCAGCAGCTGGC
-GCAGGCTGTGCTGCTGGTCCTGCAGGAGGCTGGAGTTGTGCCTGACACCGCGCAGGCCGC
-GCTCGATGTTGGTGAGGGCGGCGCTCTGGCGGCTCAGCGTGTTCAGCAGCTTCGCCTTCT
-TGCTGAGGATGCTGGCCAGCTCCTCCTGCTGCTTGGTCTCCAGGGCCTGCAACCGCTTCT
-CGAGCGCGCTGCGGGGTAGGGGGCGCACAGAGGTGAGCCTGGCATCCTCGCGAAGCACGC
-ACCCCCGCGCGCCTCCCCGGCCCTGGAGTCCCTGCAGCCCGACGATGAGACTCAAGTGTG
-GTGGAACGTCCTGTGCCCACTGTAGGCACAGATTGAGGAGGGGAGAAAAGAGATACCCGG
-CCCTGGAGTAATATAGATTGAGGTTTAGTGGAAGAAAGAGGTGGTGTGGGAGGGACACCA
-GCAACTGGGTAGCTATTATCAAATCCCAACTGTGCTTGCTTTTTGACCCAGCAGTCTACT
-CTCAGGAGTTATCCTCTAGGGAGCATGGTCAAGAATGGCCCTGGGGACTTGCTTGTAATA
-GAAAAACAAACTAACCAACCAACCAAAAAAGATATAGCCTAGATGCCCAAAAGCCAGGAC
-TGGCTGAATCCGTTGCGTTTTGGCGTCCCTGGAAATGTTCCGCAGTCATGAAGGAGGAGG
-CATTTGCACAGAATTGGAAAGATGCCCAGGACTTGGGGCACATCAAGCCTAACCCCATGT
-GTGGCAAGAGAAGAAAGAAAGTATTAATGTAAATAAAGAGAAATGGGGTGAACATATAGG
-AGAAGGCTGGAAAGACCGCAGTGGTGCCTGTGTTTGGGAAGAATATGAAAGAAATTCCCT
-CAAGTGCTGTGACTTCTGCAGAGCAGGTTTGAGTGGATGAAGATGGAGAGGAGGAAGATG
-GGGGCAGGATGGAGGGCCCAACTTTCACTTTTATTTTGTACAGGTTCCTGTTGTCCGATG
-ATATTATAATAATCAAGAGACATTTTTTGTAATGGATTTAGAAGCAAAGAGGAGTTTTTC
-AAAAGAAAGCCTTAGACTCAGCTCTTTCTTTTTGGACATTTTATCCTCCagatttactca
-catgtgtgtgaaatgagatatggaaatgttactcatcgtatcactggttggattagtaaa
-aggctggaagcaacctcaatatccattaactggggactggaggaataaaagcagggacca
-catatggtggagcattataaaggtggagaaaaaaatgagcaagcatgtcATGCAGTTATA
-GAATCTTTCCAAGGTAACTGAATAATAATTTGTAGAAACAAGGTATAAACAAGTAGTAGG
-CTACATTTGGGCTTAAAAAGGATAAAAATGGGAATGTAcagatgctccaaaatgtatgat
-ggggctatgtcctaataaagccatcgtaagttgaaaatgtcctaagtcaaaaactcattt
-aatacacctaacctgctgaacatcctagcttagcctagaccatcttaaacatgcttagaa
-cacttacattagcctgtgattgggcacgatcatctagcacaaaacctattttataacaaa
-atgttgagtagcttatgtaaggtattgatattgtactgaaagagaaaaaccgaatggttg
-tatgggtactcaaagtacggtttctactgcatgtgtatcactttcataccactgttaagt
-cacaaaattgtaagcccaaccattgtaagttagcaatcttctgTATGTATGTGTTTGCAT
-ATTCATAAGAAACCCTGGAATGTCAGCTTAtaggatgtcagcttcacgaggacaggggct
-tttgtctctttgttcacttctgtatccacagtgtctacaatagtgcctgacacatgaaaa
-gagtttgaaaaataattgttggttgaatgaatGGAAGGATACACAAGAAACTAGGAACAG
-TGGCTACCTCTGGCTTGGGTGGGTGGCTGAGAGACAGGGCTGGGAGGGAGACATTTTACT
-GTATATCCACTTGTGCCAACTCATTCTGCAGACTAAGAAATTGAGTCCAGCTAGGGCAGA
-AGAAATTTCCTCTGGACTCCCAATTATGCTGCAGGAAAAGAGAGAATTGGGGCACACTGA
-AATTCTAGAATTCCTGCCCTGTCTTCATGGGCCAAGAGTTTACCGATGACATCCTCCATC
-CTCACTGATTTCTAGACACCTAGTGTTAATTTAGAGTCATTGAAAGTGTCCCAGTCCTTG
-CCACTGAGACCTTGGGTTGGGAGAATAAGAAGATGGGCAGATTGTCATTAATTGCACCCA
-GATTAGAGAGAGCTGGGGGATCTTATGGCCTTATCCTGAACCGGCATGTGAACAACAACA
-TCTTGCCTGATTCACAGGCCTGTGGCTTGTTCAGTGGGTAGATTTTGCCTTCTCCAGAAC
-CCTGACTTTGGCAGCTTTTTTTCTTCACTCAGCTTGAAACTGAGGTGAAATCAGCCTTAG
-CTGCCAGATTTTTCTGCTTTATCTAAACCTCATGACCGCttttttttttttttttttgta
-atttaaaGGGTGTTCCCCTGATGCCCATTTGCTTATAAATGCAAAGACTCTCTGATAGTG
-TGGACAAGAACCTGGTAACTGTGGTTGTTTCTGGGAAAGGAATCGTAGATAGCACCAGAT
-TTATTTATTTGCAAAGAAGTAAAGCCAATAAAGTTTACCggatgaatagtatggtgggtg
-aattagatctcaataaagctgttaaaaTTTACGAGATAAATAaaagaaggaggaaggaag
-gaaggaaggaaggaaagggaaagaaagaaTCAGGGTGTCCTGGGCCCCAGGAAGATGCCT
-ATCCCCTGTCCCACCCAGTGCAGGGGCCAGGCAATGTGTTTGCCTGGCTCCTAGcccagc
-cccgtatccactctcatttccagcctcagtctagactccaaccctggtttcagtccttcc
-ccagcaggggctattcccagctctagtttcagccctaactccCAGGATACCTccttgccc
-caatcctaatccaagctcctaggtctggctgcaggccctatcccagacaccagcccacgt
-ccagcttccggtcctggctccagccccagtcctagccctggctctggtgcctgccctagg
-tcctaaacttgactccagccccagcccctgtcctagtcTGGTGCCAGGTGCCACACCCAC
-CTGTTTTGGCCCTGAAGCTGCTGGAGCTTCTGCCTCTGTAGCAGCAGCTGGTTCTCCAGC
-TTGTTGGTGGACAGAAAGGTCTCTGGCATCTGGGCATCCATTCTTGATGTCTGGTTCAGG
-AGCTGCCCCAGCAAGCAGAAGCAGGTAGGGGGCTGCGTAAGCGCTACAGGAGCCCTGCCC
-AACCACCCACCTGCCCACAGGCCCTGCCACTCCAGAAACTTACCCATTTCCACTCTCCCA
-GTCGTAGTTCCTGTGGTTACTCACTCACAGGCCCTGACTTAAGCTTATTacctgcttcct
-aaatttgcctttctccatcactgcaatggcagctccattctccctgatgcttaggcccca
-ggagctgtcaaccctgtcccccacatccaactcatctgcaggtcctgtcagccttgcctt
-ccaggtggcccctgaccacctctctcctgctctgtggccctcactctggccctggactgc
-tccctcattgcttgcaatctattctctactcagtagcctggggctgcctcttaaaacatg
-tttgctctgttcaaaagcttcctgtggctcccatctcatgtagcggaaatgccccagttc
-tcaccatggcctgcaaggccctatggtgtgatctgtccctatcacttctccagctccttg
-cctgccactctcctcctggtcactccagcatagtggtctcctgatgttcttgaacctgcc
-agcacgtccatcctccctccgggcctttgcacatgctgcatcccttgtctggagcactct
-ctgcagtaagcctggctgcagccctaccttctccatggcccttcctggccttgctgtatg
-agcttgcagctctcatccccccccaccactcccaatgcaccccctctcttgctctctctt
-ccatgctattttctccttagcgctgtcactggctaacatatgcagacatgtgttgcttaa
-tgacggaaagatgttgtaagaaagtcgtcatcatgcaatttcgtcattgtgcaaacatca
-tagtgtgtacttacacaaatctagatggtatagccgcctgcatacctaggctatatgaga
-cagcctattgctcctaagctacaaatccatacagcatgtgactgcacccaatactgtagg
-cagttataacacagtgggaagtatttgtgtatgcatatctaaacacagaaaaggtacaat
-aaaaacagcatacgatactcttatgggactgctgttgtctatgtggcaagttgttgactg
-gaacattaagcagtgcataaccatatatgtcacttatcttttcattttcaggggaagctt
-cacaggagtaggaatgtatgcctgctttgtttcctgctgtatactagacaccagtcttct
-caagcagtgcctggcacaCGGGGGATCAAACAAACAAATGGGCACAAACTTGTGTCTATT
-TGTTATTCACTTTTTCATCCACTGACTTCCCTACCCTTCATTTATTCACTAGTTCCTTCC
-CTGCTCTTTGCTGCTCAGATACCTCTTCTCTCCAAGTCCTTGGCCCCAGAGGCCCAGTGA
-Attgtttcttatccatcttcccctggcacattgtaagtcctctgagggcaagggagctgt
-gctactatacccctcattccagtgcccagcacagacccaggcactgaagttacagaggca
-gaaaagccaagcccagcatccaccccccagggctcatagcttggagagagatagttttat
-gacaagttcatcagggaggagggacccggggggctacaggcccagaggaggccttgaccc
-tactcagggtcagagatcaaggtaagatgactggggCTACGAACCAGCCTGGCCAGCCAC
-AGGCCCTCAGTGCCCACTCAGTCACCCTCTGTTACCTGAGCCTCCATGTCGGTCAGCTTG
-CGGATCTGGGCAGTGGTCTGGTTCAGGAGGCTGGTGCCCAGCTCTAGCATGGGGGCCGTC
-TGATTCTGGGCCATTTGCTGCTGGACCTGCTCCAGCTTCGACCTCAAGATCGTCTTGATG
-GCCCTCTCTAGCTGTGGGAGACCATGGGCTGGGGTCACGGGGGAGGGGCGGGGGAAGCCC
-CCTGTCCCTCCCACGTGTCACCATGGGAGGGCACTGAGCAGCCACTTGAGGCCTCCCTGG
-CTCAGAACATGCCGGGccaggtcaggccaccattacgtcttgcctggactatcccagtag
-atttttccctgggagggatttatatgcctgttttgtctgcctctctgcttccatctttgt
-cccctgcacagtccatcccccactaggcagccagagggatcctgctaaacctaagtcaag
-tcacactcctcctttgctcaaaatctttccagggttcctatctcacgcagaggaaaagcc
-atgactgcaggttcctccgtgactgggcctgccaccacactctcattcctctcctattcc
-cctctccctcactcacttcaatcccgatgcaatggctccatgacatccctctaacgaagc
-aagcatgtgcccacagctgttccctcactgttccctctggaatcctcccccAACCCTGAT
-CCGCATCTGCGTGGCACAcctcctcatgctgtttcagctttcttcataccacttatcacc
-acctgactttttaaaatcactatctctctttttatctgtctgttgtctgtttctctctct
-agaatgtcaattccatgaagccagggacttggttttgctcactgccttgtttctatgttt
-agcacaatgcatggtgcacagtgagtgctcataaatgcgcgttcaatgaattgatGAAAA
-AGGGGAAACAGCAAGGGTCAGAGCACAGCGCCCAATCACATGCCCCTTCACCAGCTTCCT
-CAGGGTGAGTCAGCCAGCAGGGAGTGGGAATGCATCTCTCCCTTGTACAAAGAGTTTGCA
-GGTCCAttggccaagctgtgttttctatcttcagatcccctctatctgccaaatggggct
-ggactggccagtctccaagggttctcccagctctgatgttctgggatcccaCATGCAAAT
-GTTCATTTCTTTGACAGGGCTGCTCTCTTTCCCAAGGGCAGGAGAGCTGGTCTGGCATGA
-CACCAGTATGCTGTTGTAAAGGTGAACAGTGTGTTCTCAGGGCTCGGTGCCTGCAGGCAG
-AGAGCCAGCTCCCCTCCACCATTGCCTCTCCATTCGGCACACATGCTGGCCTCTCACCAT
-GCCCCCCACCCCTGTCCCTGGCTCCTTCCCTTGCCCTCTCACTCAGTCTTTCAGAAGCCA
-GCTGGACAGCTCTCAGGGTCCTTGGGAAGATGGGTGCTCCCCAGGAGAGGTGGTGACCTT
-GGCTCGGGCCAGGCTCCAGCCACTTCCTCCTTCATCTCTTCTCCCTTCTTCCATCTTGAC
-TGTTCACTCCCATCCCTTCCTCACCCTGGAGTGTTTCAAAGGGAGCAAGTTCCATTATCA
-CATCCTGGAGCGGGTGCTTGTGGGCGGTAGTAGTACTGGTTAGAGCTgtgtttctccaag
-tgtggttcttccgtcagcatcagctgagctcattaaaaatgtgaatttccaggtcccacc
-gcagacctcctgaaccagaaactcttaatggtgcccagccaactgtggttaacaacaccc
-ctggctgagtcagatgcctgctcaagtgtgagagcccttgATGCAGAGTAGCAGCAGGGA
-CTGAAGACCAGAGAGACCCCCCTCCTTCTTTCCCTGCATCATCAGCCCACCCCCTCCCTG
-CAGCACACAAACATGCGCTAACAGCTTCCATCTAAAAACTAACTCCACAGCCTCTCTGGC
-TGCTTCTCCAGTTTCTCTGATCTCATCAACACAAAACTTCTACAAGTTGTCTCCATTTTC
-TCACCTTCATACCCACCCTCACTTAAAAAACAACAACAACAACATAACGTTAATAATAAA
-ATGATGTTACGTTTCACACATACAAAAAAGCATAGAggccaggtgcggtggctcacacct
-ataatcccagtactttggaaggctaaggagagtggatcatttgagcccaggagtttgaga
-ccagcctgggcaacatggtgaaactccatctctactaaaaatacaaaaattagccagcca
-tggtggcataagcctgtggtcttagctacccaggagactgaggcaggaggatcgctggag
-cctgggaggtggaggttgcggtgagctgagatgcaccactgcactccagcctgggtaaca
-gagtgagaccgtgtctcaaaaaaaaaaaaaaaGTATAGAGAATAAATATAGCCCATAGTG
-CTCATCCTCCTGTATACCTCCAGTCATGTCTCTCCATCCTGGGAGGTCCCTTTGCCTTTT
-GGCgtctcactgttgcccaggctggagtgcagtgatgtgatcacggctcactgcagcctg
-aaactactggcttcaaacaatcctcccacctcccaaatagctgggacgacaggcgagcac
-caccacgcgcagttCCCCCCTTCGCTCTTTAATTCACCTTGTCATAGATAGCCCTCCTTG
-ACACTGCCCTCAAGGGACActccatcttgcttgacatctcaggagcaatcacctggatgg
-ccactccctgttgctggacgacttccccccaatcctggtttcctcctagcccctaaccac
-ccactctctgactcctcctttacagactcctacacggcagggcccccatggcccagtcct
-gggtccttgtctctatgtacattcactctctaggtcaggggtccttaatgaagaagccac
-aggctccatgaacttgagtgagaaaaaaagatcacattttttgtccactaatctgcaatt
-aaaatttggcatttccttcaattatgagcctaggtcacaaaccacagccatactagcagg
-tcctgagagtcattaccaatagaaatcccaaatattttcatatcacaacacactcttacg
-gtatcttaaaacattgtttttactcaccgggactttggaattatagacatcacacccacc
-actggataatgctatgcctgatcacagattttatttttcatattttgcttatgatttcca
-tattactgagtgttcttatgctttgattttatgcatttctgagaaaggattattaagctt
-caccaggaccagatgccaagaggTCTGAGGATCCAAATGCATCAGGGCCCTGCCCCAGGG
-GCTGAGATCGGTCTTTGGACTTCCACATCCctctgtgctaatggagccatcaccatctcc
-cacccagacttctcccctgcatgtccccaactcgccatctctgcatggtttccaatgagc
-atctcaagcccagtgtgaaactcttcattcctcagctcccatcgcccctgtccctgtaac
-tcccaccccatgcttcgaaatctttcccatctcaggaaatggctccacccagttctgaag
-ccccaaacccagacctcaatcttaacttctctttttcttagcggccacactcaacccact
-agtaagtactgcccactgtgatcccaatttggatttcaaatctgtttactcgccttattc
-tgggccaggctgccctcctctcCATGGGTCTGCCTTTTGTGCCTTCCTGTCTTTAACCCC
-TCTGTCAGCTCCCAGGAGATTCTTTTTTTTTTTtgcagttgcaagatttaatagcatgaa
-atagagtgaaaacagagctcccatacaaagggaggggacccaaagggggttgctgttgct
-ggctcgaatgcctgggtttatatgccaatccttgtctctcccactgtgctctcaggcaat
-agatgattggctatttctttacctcccatttttgcctaattagcattttagtgagctctc
-tgattggttgggtgtgagctaagttgcaagccccgtgtttaaaggtggatgcggtcacct
-tcccagctaggcttagggattctaagttggcctaggaaatccagctagccctgtctctca
-GTccccctctcaacaggaaaacccaagtgctgttggggaggtcagctgatgaccgcacta
-actgcttcctgctgaattagggagtagtaggggtggtgcagttgagatttcctcgggagg
-ggtgccttcgatgtcattaacatcagagcatgggctagcaggctggtccgggggtccgtg
-gtaaatcttagtcatggactgcatgtgagctccCAGGAGATTCTAATGTGTGGCTGGCTG
-GGCCCACCAGCATGGATGAGGACAAATATAGCTGTATCGAGTTTGGTCTCAGACTTTTTC
-ATGCATCATTGACCTCCTAGAACCTAAATTAAAAAGCAGACATCCAGGTACTGAGCACCT
-GCTCCAAGTAGTCAAACAGCATATTCATGCCTGAGGTGAGACTTTCCCAGGcatcttccc
-caagcttctcatttgcctgaacatagacaaactgaggcccagaagtcttgcccaaggtca
-ccatctggcaggCTAGGCTCTAAGACTCCTTGCCTGAGGGCTGCAGAGCTGAGCTGGTGA
-TTCAGGGCAGCTCAGGGTCCCCTCAAGTGACTGGAGCTCCCCAAGCACCTCACTGGTCCC
-CCACTTGTCCTGTGGTTGCAAGTGGCTGGGCAGGGCAAAGGTTACCCACAGCTGGATCCC
-ATCACCCAGTTTGCCACACCCGCCCACCAGCACAGGCCCTGGGATGGATAATCTGGGCCA
-GATGGGCTCAGTTAGGCTGGGCTGGGCTCTGGAGACTAATATTGGCCTGGGTGGTGGGAG
-CTAGGTCTGGCCCATGGCTGAGGCACCAGCTGGAAGGGCAGGGAATGGATCCCAGTGGAG
-GAACTCACCCAGCGTGGGATCTACTTCTCTTGTTTTTTTGGATCTACTTCTCTCTATGCC
-GTGCACCGACTCCAGGATTAGACCTGCCCCTTCTCCATCACTCTCAGGCTGCCGAATTCT
-CAGGCCTATGATGGGGTACAAAGGCCTGACCTTTTGTCACCCTTCCAGCTGGCAAAGAGA
-CTGAGTTTTGGTCCCTGGTCTACTGCCCCATCCCCTTGGCcctgggtttgagttctggct
-ctgccacactttcattgtgggcccttggagactactgtgtttctctgagccccactttac
-agatctgggtcatgggTCAGCACACCCTGCTCCTTGCTGGGGAGAGGGCATTTGCAAAGG
-GTCTTGAAGGAAAAGAAAGAAATTTTCACAGGCAGGGGCTGGGGGAGAGGGGGTGATTCA
-GACAAATAACAGGTGCAGATCCGTGGATGAGCAGCCTCCGTGGCCGAGGAGATCTGCTCA
-AGCCTGCTTCTCTCCTGCATTATTTATATAaaatggacatcaattggtgaatggagaaac
-tgcagtccatccatgcagtggactccattgagcaataaaaaggaaagaaccattgatgtg
-tgcaaacacacagatgaacttcagatggatcatgagtgaaaaatatgcaactccaatggt
-tccatactgtaggagtctatttgtatgactctctaaaaatgtcagaatctgtgattgcca
-gggcctgggtccggggagggggtggggattgattgttaaaggacacaggggagctttttg
-ggatattggcaatgttctatgtcatgattttgctggtggttacataactgtatatgtctg
-tcaaaactcatggaactatatgtgaaaagggtagattttgctgtacgtgggtcatacctc
-agtaaaaaaCAACGCCCCCAACACAAGGTTCTATAAAATGCCGCAGATATACATATGTAA
-CATTAAATAGATCTCCTCCAGTGAACCCCCTCACCCTCTCTGAGTTTCATTCATGTGttc
-attcaggaattatttcttgagcacctactatgtgctcatcctgtattaggtattagataa
-tcagaaatgagcaaaattcgtaaagtttctgattccagggcacttctactaaatatatca
-gttgcattgaaatcttgatgaatgctatgaagaaaataagacagggtaatatgtggggtt
-ggaggcaagtttagccagtatgatggagaaagccccaccagagagggccatctgggctga
-gaggctgagaagaagcaaggtctgggagagtcaggagggagggaattccaggcagaggaa
-aaggcaagtgcagaggccttgaagtgggagcgtgtctggtatttgaggatcaaaatgaag
-ATGGTAACAATGATATGCCCTGCAGCTATCTCTCTTCCATGGAAAATGGTGCATGAGGTT
-CCTGTTTGGGAAATGCATCTTGTCAACTGCAGATAAAAATCAATgcagagagagtagtgc
-tttgtatggatgaagctgtgtgtgaatcacagctcttagcttactggctgtgtgacctta
-ggctggggcctctactggtgtctgagccttttctctaaaatgaagataatcatagctcct
-tcccctgggttgtagggagcattcctgagataaCTCTGGTTGTAGTTACATAATGAACGC
-ATGATAAATTCTGGTATGTCTGGGCCATATCTTACTATGtgtcaggactctgagcccaag
-cctgcgcgtatacatccagatggcctgatgcaactggagaaccacaaaagaagtgaaaat
-ggctggttcctgccttaacggatgacattaccttgtgacattccttctcctggacaataa
-gtctccgtagctccccaccaagcaccttgtgacccctgcccctgcccgccagagaacaac
-cccctttaactgtaattttccactacctacccaaatcctataaaactgcccaccccatct
-cctttttcagactcagtccacctgcacccaggtgattaaaaagctttattgctcacacaa
-agcctgtttggttcacatggacgtgcatgatatttggtgctgaagacccgggacaggagg
-actccttcaggagaccggtcccctgtccttgccctcattccatgaggagatccacctatg
-acctccgatcctcagatcaaacagcccaaggaacatctcaccaatttcaaattgagtaaa
-cggtcttttcactctcttcttcagcctctctcactacccttcaatctccctgtccttcca
-attcgggttcctttttctctctagtagagacaaaggagacacattttatccatggaccca
-aaactgcagcaccggtcatggactcaggaagacagtcttcccttggtgtttaatcactgc
-agggatgcctgccctgatcattcacccacattccattggtgtctgatcaccggggggaca
-cctgccttggtcattcacccACATTCCCTTGGTGGCATGTCAATTGCAGGGACACCTGCT
-TTGGCTGCTCACCCATATTACAGCCCAGGGCTGCTCACCGcccgcttctccgtgtctcta
-gctttctctttaaacttacctcttcactgtggtcaaccttccaccctgcattcccccttc
-ttctcccttagcctgtgttctcaagaacttaaaacctcttcaactcacacctgaactaaa
-acctaaatgccttattttcttctgcaatactgctaggccccagtacaaactcgacaattg
-ttctaaatggccagaaaacagcacttttgatttctccatcttacaagacctggatgattt
-tttgtcaaaaaatgggcaaatggtctgaggtgcctgatgtccaggcattctttcacacat
-tggtccctccctagtctctgctcccaaagcgactcatcccaaatctttttttttctctcc
-tgtctgtttccttccatctccaccccaagctctgagtcctttgaatccttcttttctacg
-gactcatctgacctctcccctcctccctgacgctgctcctcgccaggctgagccaggtcc
-caattcttcctcagcatctgctcccctaccctataatccttctatcacctcccctgctca
-cacccagtctggcttacagtttcgttctgcaactagccctcctcacctgcccaaaaattt
-cctcttaaaaaggtggcttgagctgaaggcacagtcaaggttaatgctcctttttcttta
-tctgacctctcccagatcagttagcatttaggctctttttcatcaaatataaaaacccag
-ccccgttcatggcccacttagcagctaccattagatgcttcacagccctagacccagagg
-ggccagaaggccaccttatccttaatatgtattttattacccaatctgctcccaacatta
-gaaaaagctccaaaaatgagattccggccctcaaaccccacaacaggacttaatgaacct
-tgccttcaaggtgtacaataatagagaagaggcagccaagtggcaacatatttctgagtt
-gcaattactcgcctctgctgtaagagaaaccccagccacatccagcacacaagaacttca
-aaacgcctaagccgcagcagacagttgttcctccaggacctcctcccacaggatcttgct
-tcaagtgctggaaatctggccactgggccaagaaatgtccacagcctgggattcctccta
-agccgtgtcccatctttgcgggaccccactggaaatccaactgtcccactcgcccaccaa
-ccacacccagagcccctggaaatctggcccaaggctgtctgactgactccttcccagatc
-ttctcttcttagctgctgaagactgacactgcctgattgcctcagaagcctcctggacca
-tcacagatgctttaggtaactcttacagtggagggtaagtctgtcccctttttaatcaat
-acagaggctacccactccacattacctacttttcaagggcctgtttcccttgcctccata
-actgttgcgggtattgacggccaggctgctagactccttaaaactccccagctttggtgc
-caactgggacaaaattttttttttttttgagatggagtctctctctattgcccaggctgg
-agtgcagtggcgcgatctcggctcactgcaagctccatctcccaggttcatgccattctc
-ctgcctcagcctcccgagtagctgggactacaggtgcctgccaccacgcctagctaattt
-ttttgtattttttttttagtagagacggggtttcaccgtgttagccaggatattctcgat
-ttcctgacctcgtgatttgcccgcctcggcctcccaaagtgctgggattacaggcatgaa
-ccaccgcccccggcctgggacaacattcttttatgcactcttttttaattatccccacct
-gcccagtacccttattaggccaagacattttaacccggacaagtcttacaggctggtcca
-agatcttcgccttatcaaccaaattgtcttgcctatccaccctgtggtgccaaacccata
-tactctcctatcctcaatacgcccctccacaacccattaatctgttctggatctcaaaga
-tgctttctttactattcctttgcatccttcatcccagcctctcttcggtttcacttggac
-tgaccctgacacccatcagcctcagcaacttacctgggctgtactgccacaaggcttcag
-ggacagcccctattacttcagtcaagccctttctcatgatttactttctttccatcactc
-ccacctactctcccactgaaacttccacctatcaatctcttcccacacaaggcaaatggt
-tcttggactaaggaaaattcctccttccagcctcacaggcccattccattctatcgtcct
-ttcataacctcttctatgtgggttacaagccaccagcccacctcttaaaacctctcattt
-cctttaagacatttaccttgtatttcactccatccttggctaccttccccttgctcttca
-gactctcctcccaggccctcttcttgtttgcttatacccagccctgtaaataacagtgaa
-tggttgcttgtagatactcgacgttttttcatgcaccatgaaaattgaacctcctcctct
-aggaagttaccccatcagtctccattacaacctctgacggctgccaccctagctggatcc
-ctaggagtctgggtacaagaaacctttagtactccttctcatctttttactttgcatttc
-cagttttgcctcgcacaaggtctcttcttcctctgtggatcctctacctacatgtgtcta
-cctgctaattggacaggcacatgcacacaagttttccttactcccaaaattcaatttgca
-aatgagaccgaagagttccctgttcccctcatgacaccaacaGTTCACTACTATTTTGTT
-TTGTTTTTCTTATTATTAATATAAAAAGACAGGAATaggccttgacttactcactgctga
-aaaaggaggactctgaatatttccaaatgaagaaggttgttttcacctaaatcaatctgg
-cctggtatatgacaacataaaaaaactcaaggacagagcccaaaaacttgccagtcaagc
-aaataattacactgaacccccttggacactctctaattggatgtcctaggtcctctcaat
-tcttggtcctttaatacctgtttttctccttctcttattcggaccttgtgacttccattt
-agtttctcaattcacacaaaactgcatccaggccatcaccaatcattctatacgacaaat
-gctccttctaacaaccccacaatgtcaccctttaccccaaaatctttcttcagtttactc
-tctcccactctaggttccgacattgctcctaatcctgctcgaagaagccctgagaaacat
-cacccattatctctccataccacctccaaaaattttcgccaccccaacacttcacctcta
-ttttgttttgtcccaacacttcaccactattttgttttgtttttcttattaatataagaa
-gacaggaatgtcaggcctctgagcccaagcctgcacgtgtacatccagatggcctgatgc
-aactggagaaccacaaaagaagtgaaaatggctggttcctgccttaactgatgacattac
-cttgtgacattccttctcctggacaatgagtctcagaagctcccccactgagcaccttgt
-gacccctgcccctgcccacaagagaacaaccccctttaacgtaattttccattacctacc
-caaatcctataaaactgccccaccccatctccctttgctgactcctttttcggactcagt
-ccacctgcactcaggtgattaaaaagctttattgctcacacaaagcctgtttggtggtct
-cttcacacggacgcacgtgacaCTATGTAGCTGTTAAAAACAATGAGGTTGATggctggg
-catggtggctcacacctgtaatcccatgactttgggaggccaaggtgggtggatcgctta
-agctcaggatttggagaccagcctgggtaacatggtgaaaccttgtgtctactaaaatca
-gaacaaaattagctgaaggtggtggtgcatgcctctagtctcagctacttgcggggctga
-ggcaggaggatggctttagcctaggaggtggttgcagtgagctctgatcatgccactgct
-ctccagcctgggcgacagagcaaaaccctatcttaaaacaaaacaaacaaacaagcaaga
-aTGAGGTTGAGCTACATCAGATGCTGATCTGAAAAGATGTCCCTGTCATGCTTATGAGTA
-AAAAAAGAAACCAAGAGGCAGAACACTATATACAATGTGGATCCATTTGTGTGTAAGAAT
-GATCCAAATGATGTATTTTTATACAAAAACCGAGAAGATCAAACTATTAACAGTAGCGAT
-TTGCTTCAGGGGAGGGGGTTTCAATAGGGTGATGGTGATGGCGTTTTCTTTTTACATTAC
-CTATATTGAAATTGTTTGGATTTTAAAAGTAGAATGAGAGTGTATACAGGTATAATTAAT
-AGAATATTTAACAACTAGTATATAAACACTAGGAGTCCCTAACTGATGTCCTGGACCCcc
-agggatctgtgaatagaattcaaggaacctgtaaacttgcattaaaaaaaaaaggacatg
-cttttcccactagtctctaactgatattaacttttcctgtggtagtgagtatatgccaca
-ggctattacagtggtgatagcagggcctgcagctttgtcactagtagaaaccgcagatac
-tctaatatctcattgcagtgattgcggatatctacgacacattgtgtatactcacctcag
-cctcaaaattatggaaggtacttgacccaccactcagtcttgttattttgtgcattaata
-cagaaataatataggactatatcagaaacctgttttctgttatgttgacatttgcatctc
-aaggcaatttgtttcctttataaatctatgcatttaattttacatttcaaaaaaaaattt
-ttttttctgagagagggtcaccggatgccaaaggaccccaaggtacaggaaaggttaaga
-cccctgAAGGCCTGTCCCACACAAGGTTCCTCACTGGTGTccccagtaggctaccaactc
-tgagagtgcaaggactttgcctgccttCTGGGGCCTGGAAGACTGTCTGGATATTTgtag
-gctctgctgttgaccccaattatagatgggcaaatggaggttcaggctcagagtcacttc
-cctgaggtcacccatcaagttgcagatgctagattcctcctcatgtctactgatttggaa
-ggctgGGAGGTCAGGTCTTGTGGGTGTAAGAGGGTCAAGGCGGGGGCTGGGCGGGTGAAA
-GTGGTGCTTCCCTCACCCAGGGTACGACCCAGGCTTTAGCCTTGCAGCCAGTGAGCCCAG
-AGGATGGGGTGAACCCTGCTGCTGGCTTCTGCCTGTTGACCCAGTTCCTGGGTCTCTGCC
-CAGACTTGTTCCAGAACCAGACCCAAAGCACCAAGGTTTCTGTGAATGGGGGTGGCAtta
-aggaaacttacccttctagttggtcagacccagcctctcagagctgccctgctttccttt
-gtctctctcacatcctgcatccaatctgttgtctctaccctcgggcgcatgcagaatctg
-accacttctgcccaaccttgccacttccaccccagtcccagcccccattgtctctagcag
-ggatcaaagcttccttgatactgtcagcatctgtcattgctccctgggcccccaggctat
-gctccacacatagccagtgacgtcctggtcaacctgtcagattatgaccccctctgctct
-aaaccctgccttgggtcccgtgtggcttagagaggaccaggactccttgcagATTCCTTT
-AGTGAAGAACAAAATTCTTTGCTTTGGAAACAGGTAAAACAGTCCCCAGTGAACAGAGTC
-CAAACCAGGCTGTACTGGGATGGTGTGGGAATTGGGATGAAGCCTGTTCTAGGTCCTAGG
-CTGAACCAAAGCCCCATGGCTGGGGTGGTGCAGGGTGTGGAGATTTGAGCCCGGCCTGAC
-GGTAAAAGGAAACGGGCTTTAGCAGGGATGCCCCAGGGGTAGGAGCCCAGGCAGGGAGAC
-ATCTGGGGAGCAAAGACTTAGTGAGGGGGAGACCTAAATGATGCTCTCagggacctctca
-gctcccatcccctccatttcacagatgggaaaactgaggtcccaatcaggaaaataaagt
-gccagaggctgtacacaggagctaatggccagatctggTGCAGACGTATGAAAATCTGGA
-GGGTCAGATCTTACCTAGCTGTGTGTGTGTGTTTCAACTTAAATGTAAATCTTTGTAATT
-TTATTTTTCGAATGGGTGATATAAACACATTGTTCAAAATTCCAAGGAACAAAAAGGAGT
-GAAGTGAAAAACAAATTTTTCTGTCCCTGCCTCAACCCACAGTTCCCTCCCTACAGGCCA
-CTGAGGGAGGTTCCTGGGTTTCCTTCCAGAGAAACGCTATGCATACTTCTACATCTGCAG
-TAACTGTGTTTCCATCCCACCACCTGCCCTTCAGGCTACAAAAACCTCAGCTTGccattc
-cacacctggcttccttttgcttaacattgttcatagcatgttccacattcatccaggtag
-acttgcctcagcattgtaagctgcttgaaattccatctatgggcctccattgtttgctca
-tctagtcccctctagctgggcctgtaggatgtttccaggctttaacatcaaaaacagggc
-tgctacaaatatccttgtacacctgtcacttaacattcccacaagtctatgtggggaata
-aatcctctgaagtagaattgcttcaaagtagagtgaaatcacacgtttttttggtccttt
-gttttttgaggcagagtcttgctttatcacccaggctggagtgcaatggtgtgatcatgg
-ctcactgcagccttgaattcccaggctcaagcgatcttcccacctcagcctcccaagtat
-ctgggactataggcatgtgccaccaggcccagccaatttttcagtatttttttgtagaga
-ccagggtcttgctttgttgcctcaggctggtctcaaactcctgagctcgagtgatcctcc
-cacctcacctcagcctcccaaaacagttgtgattttgactatcgttaacaaactgccctt
-ggcagaggttatgccTAGTGGTTTCTGCCCCTTTGGAGGAGAGGCCCTAGGGTCTGCAGA
-GGTGGCCACAGGAGCCACAGAGTTGCTTATTGCACCCCCTCCCAATACGCATCCACACCT
-CCCAATCTCAGTAGCACCAAAGCATCTCCCACCAGCTtccttctgacttctaggtctccc
-tgaaaatgtcacctcctctgagaagcattccctgaccacccccactctactccacctgtt
-tatcacagtgtgcactctggcttctacacagtacttcatgccatctgaaatcactttagt
-catttgtcatttgtccaattcccccacgagaagagccccaggagtgcagaggtttgtctg
-ccctgttcatgagcacatcctctatgcctagaatagggctaggcatatgagaggtcctcg
-ataaatatttgtggaaagagcagatGGGTCAGTTTTGTGTAAGGGGCACGAGATTTCCAC
-TGAATAGTTGTTTGGCAGCTAGAAGCAAGTTAGGAGCCTCGAGCCCAGGCCCAGCCACTG
-CTGGAGCCTGTGAGAGGCAAAGGCAGTGGAGACCACAGAGACCAGAGAACAGAGAGCTAA
-CTGGTGCCAGGGCAGAAAGAAAGGGGAAGAAACACCAGCACAGAGATGGGAGGGGCAGGA
-AGGAGGGTTCCCAGGAGGGAGGCCCATGGCAAGGGAGGGAGTCAGCTTGGGGTATCTGCA
-GGAGGAATGTTCTAGAAATGAACAAGACATAGTCTTGGTGCTCATttccttcctccaacc
-aactcattcagatgtgccgagacctgggcatggtgctggggatagagcagctaccagaac
-aggccaggctctgcactGCTGCTGCGGTCTCCCAAGGAAGATATCTAAAGGGCtactctg
-tcccaggcatgaccccaaggccctacaaatacagctcatttagtccttggtgctcccatt
-gtcaccattttacagatgaggaaaggaaggcattgagaagatgagcatcttgcctaagtg
-gcaaagactggatttaaatataggcctttggtctccagagaccacacccttagccactCG
-GTGGGCTGCTtgtggcagctagccttcaggatgaccccagggatcctggtgctcatgccc
-ttgtgtagtcccctctctcaacaagtcaggactggctggcatgactaattagatattgta
-gaaacgttagtgtgacttccttggctaaaccattgcattgtgtcttctgtcttgccctct
-cttggaccacacgctttagaggaagtaggccactatggcctgaggacccttaagcagccc
-ttgggaggaagccatctggaggggaactgaggccttctactcacagccagcgccagctca
-ccagccacaggaggccgagccccagcccaggtcaagccttcagatgagtgcagccctagc
-tgatacctgagtgcaaccacatgaaaaaaaccccaagtcggaactaccttgttaagttgc
-ttcagaattcctgaccctcagaaactatgaaagataagaaatgtttgttgttattttaag
-ctgctaaatgttttagggtaatttgttatgccacaatagataactaatataCTGCTTTTC
-CAGAGCTTATAGAGGTTTAACCCTCTTGCTTCTCTTCTCTGCCATCCCCAGGCCTCAGTT
-TCCTCATTTTGACAATGGGCTGACTTGTGATTTATGAGGGTTGGCCCCTCCTCCTCTGCC
-TTGCTTCTGTCCCCTGGGCCTGCACCAGGCCCTCACCCTGTGGCTCAATGCAGACTGAAA
-TGGTTTGTCTTGTCCTGTCTGAGCAGCTGGGCCCAAGCCTTCCTCATTGTTTTCCTCTCT
-GCAAGACATACTATTGCTTTTCTTCTGGGTCAGGCTCTGGGCAAGCACAGCCAGTGGGCT
-GAGAGCCAGGGGTAGAGAGACTTGGGGACCAACGGGCTCTCACGGAGGGATGAGCTTCTC
-AACCCTAGCTCAACCCTCAATTCTTTGACACAGGCCCAGCGTCTCCAAACATCcagtgtg
-gtctgggcctggagcactgcactgagagtcagcaagcttgctcaatagctttgccatttc
-ctttctctgccagtgatgagtttctctgaacctcagtggcctcattgtttcctccttgca
-gagcgcctggaaggaatagggaaatggccactgggacctgtgttctgtggatctgggcta
-ggattcttgtctgtctggttcatgaggcctagcacagtgcctggcacacagtagtgcctc
-ccatatttgtggaatATTTGGGACTTCCCTGGCTCCTGAGCCTCACCTTTCATGGGGTGG
-CAGGTCCAGTGTTCATCCCAGGTGAAAGGCCACAAGGAGAAGATGAGGAGTGTGGCGGAA
-AGGGCTGCAGAGGGAGGGGAGCAGGGCCTGCCTCTGCCATCTGGACTTGGGAGGGGCTGC
-CAGGGTCCCTGCCTCCTCAGGCTCAGGTATGCCTTTGGTGGTCGTCTATATTTCAACCTT
-GATCTTGGGAGGTGTTTGCGATCGCTCACCTCCCTGACACTTGAAAGTCACAGAATGGAG
-AGGTGTGTCCATTTTGCTTGGcaacatgcttattgaacagttattatgtggtcagcactg
-ttctaaccactaggtatatgaagtccttgcagccaccctccaaggtaggacctgttatcg
-acctattttacagacgaggcacagagaggttaaacaacttgtccaaggacaggtagctct
-tcacaggtgtaaccaggCGGTGCTTCTGCAAGGCCTCTTGGCTAGAGTGATCATGTGACA
-GCGCCCCTGCCCACCCCCCAACCTCACCTCAACTTTGGGAAAATAGGGCAAAGTATGTTC
-TAGACACAGGGAGGCTTTGCTGGGGTATCTCCCCACGTGGCACCAGGCCTTTCTGCCTGT
-ACGACTCCAGTGTGTACCTCttctcttattggatccccagcagcctggaggaaaagggtg
-attgttccccacacaaatgagtaaactaaggcccacaaaggccgagcattactcacagct
-ggtaaaggaagaTTTTTAACTTAATGGCTGAGCTCTTTCTATGTGCCTGTCTTGCCTTCT
-TGGTGGCTGAGGCTGATCCTGCAGATGGGGTGACAGGGATAAGATTAGGGTCAGACAAAG
-ATGGTGGAAGCTGGCTCAGAGGTCCACAGTCTATCAGAGAATGATCCTCAGTGAGGACAG
-GACAGAAAAGTGGCCACATCTCTTCCCAGTCTCCATGGTCCTCCACGGAGAACAGGGTCA
-GGACCAGGGACATCTGtctggctcctggtgagcactccagtctcatcttggccatgctct
-cctcgctctctgcactgtagacacactgaatgccttttgcttttggcccattctaccccc
-agggcctttgcacttgctgtcccgtgtgcctggaatgcttttgcttcctttccctgtctc
-gccactgccaacccagcctttagatctcagctctgtccttcttcctagtgcctccctccc
-tcaaggtcaggcacccattatccacccctagcatctctcggtccctccttcatggcacat
-atcatgattgatcgttgcacatgggaaatcactaggttagttacacccactgctccaggg
-gcaagggggaaggatggtcttccttgctcactactaaatccttgtcacttgcatggcgcc
-tggcgcattgtaagccctcaataaacagtggtggaagggacaaTTAAATGAATGCAGGAA
-TGAATATTCTTACCTGACAAACTAAGTTCAGAGTTGTGTATACACATTTGTGTTTGTGTG
-TGGTGGGGGGCAGGAGTCGGGGGTTGCACATCTACACATAGTCCCAGAATTGAAAGGATG
-CATGATTTTTTCATGACATTTATGGCATGCTATGTATCTTGTTGCCTCTGGAGAGGAGAA
-ACAGGGGTCTCAGctgggtgtcaggaaccctgggttctgggccaactcctgccaccgacc
-cttgggtgaatgtgattgagtcactcccttgcccaggcttagtgttcccatctgtaaaTG
-GTGGGCACAGAGAGGTGGTCTgtgtagtggttaagactgtgggttctggagccagtctgc
-ccgggtacgaactcacctccctcacttcttagctgtgtaaactccctgggcctccgtttc
-cccgcaataaatggggatcataacagtccccaccttttaggatgccacgaggtttatgag
-tcaatgtttataagacacatataaagtgcctggcccagagaaagTCCCATATGTGAATTC
-ACCCCAGCAAAGCACTTATCCCAGAAGACAGAGGAaacaatagtagcatctcctggttct
-ctgtgctggagcagtgccaggcacatcccctgaccagccatttgagcctcacagcaaacc
-caggcgatgtgtgtatcatcacctcaattttatagattgaaaaactgaagctcaggtctt
-tctcatagttacacagctaataaTCTCACAGATGTAAAGTTGAGGGAACAAAAGGAAACT
-ATAGTAAGATATGGATGGTACGACAGGATTCCTTCCTTGCACCGTGAATCCTGGAGTCTT
-Gacgtttactgagcacttactctctgccaggccctgtactgagccccacatgtgcattgc
-ctcatttaatctcctcaataacctgcaaagtagcttctgttagtgtcctcacttcacaga
-taaggaaaccgagtcacagagtggaaaagcaatggtctgagaaggcacagccagtaagca
-gtggagctgggattcagactgagtcaactgggactcagggcctacactcGGCTTCTGTGG
-GATTTGCCCCCAGGCCCTGGGCCAAGAATGGGGTGTGTAATTGTGGGGACACCCAGACTG
-AGCTTCTGGAGCCCCTTAGCTTTTCAGAACGGCCACAGCTGCCTGAGGCCCTACCTGAAT
-CATCCCTGGCAGAAAAGCCCTAGGGAGCCTTGGGCCAAGGGTTCCTGGGGGAAGAAAAAT
-CTAGTAGCTATGGATCTCCCCTTTGGGGACCAGGGTCCTCTATATTTTCCAGGTCCCAGC
-TAATGCCCAGGGACCCATCCACCATGGACATGGCTTATTTATTGGACAGAAAACTGGCTT
-AAGTTCtgagataataggttccggcatcagatggctgaatctgactttgcccttcttggc
-tgtaagatcttgggcaagtcacctaatctcttggtgcctcagtttcctcatctgttagtg
-gacaagcaatcttacttcactgggtcatggtgagaattaaatgccgtaacataaagcacc
-taggacagtgtgtggcatacagtaaatgctcactaaatgagtgcttactcattACGTCAT
-AACTGCTTtttcatcctccactcattctgggaggcacgagtattttgagttccactttag
-agaggagccaattgatatatgtggcttccccgggttcccatagctttgagtggtacccct
-gggacttgacctcctgaccccaaCTTGGTCCTCCCCAGACCCCACAGCCAACTCTCAGGG
-TTCATTCCTGACATTTCAGAGCTGGCTCTGAGGTTATGCAAACAAACTGCGGCCAGAGTC
-TGACTGGAGGTGCAGGCTTAGGGGGCAGACCTGGGGCCCGTTTTCTAACATTTCCTGCCC
-AAGGAGAAGGAGAAGAAGGTCTGTGTACATCCCAGCCTGGCTGAGCTCTAAGGCCAGGGA
-GGAGAGAACTAGAAACATGTGGCCCTGCCCTCTGTGGGATGGCTGGCCAAGCCAGTTGAA
-CAAATAAACCCGTCCTTTTGGGGGAAGTCGTCAGGGGGTCTGCTGCTGCTGGTGCCTGCC
-CTGCACCCCCACCTCATCCCAGGCATGAGCCAGCTGGTCATCCCCAGGCCGAGGGTATCT
-GTGCCAGCTGTTTCCAGGCCCCCTTCTTGGAAAAATCATCCCATTCCTCTAAGAAGCAGA
-TGCTGTTTCCCCCATCCCCCAGTCCCAAACTGCTTAGAAAGGAGCCAGCAGTGAGGTTAG
-GAAATCAAACCCCAAGATATTTTGTTCGGCACCGAGACTCATTTCTTGTTTGGATAACTG
-AAGGCTGAAAATGCCAAGAATTTGTGGGCAGCCTGGGAAGGCTGGGGCAACTGGAACCCT
-GACTCCCAAACCAGGTCAGTTTGGGAGGGTCTCAGGCTGGGCAAGGACCCCACCCTGGGT
-TCCTCCTTGGTGCTCTCTTGACCCACACCCAGTTAGGCAGGGCCTCACAACTGCCAGGCC
-GAGGGGCCCAGTTATTCTGAGGTTTGATGTCAGAGACCTGGAGCAAACAGCAGAGGCTGG
-GGCAGTGCCAGGTTGGGAGGCCCCTGCCCAGCCCCTGACCCCTCTCTGCTTGGCTTTGGG
-TGCAGAGGAGGAAGAGAAAGAGGCCTCGGCTGAGCAGCCAGCTGCAGGGTGGGCATTGGT
-CATTTGGCAGATGTGCCCTGGGTCTTCAGTGTGGACACTCGGGGAGGTAGAGGTGGGAGG
-GATGGCCTTGGGGTGAGAAAAGGAGGAGCTGAGAAAGAGACAGGAAAAGATGCAGGGAGT
-CACTTTGATAGCCAACCAGGAGAGAGAATCAGAGACAGAGACACCCACAGAGTTAGCAAC
-AGTGAGTCAGGGCCACCGCGAGAGCCCCAGGAGAGATCCACAGAGGCAGAGAGACTCAGA
-AATAGAGACAGgctgaccacagtggctcgtgtccgccgtcccagctacttggaagactga
-ggcgggaggatcgcttgagctcaggagttcaaggctgcagtgagctgtgattgcaccatt
-gcaccccagtgtggttgagagagtcagaccttgtctttaggagagagacagagagaggga
-gagagggacagagagagggagagagagacagagagagggagaaagagacagagacagaca
-gagatagacagggagataggcagagagagGGCTGCCATGGACCCCAGGCCAGCAGCTGCT
-GGCTGCTCCCTAAAGGTGAGAAAGTAGTTCTCACCTGCAGTTTCCAGGTGGGGTCAGCCC
-TGCCTCTGGGAGCTCAGAGACTGGGGAAGATGTGCTGCCCTCAGGTGGTGGGGGTGGGCC
-AGAGAGGCTGGGGCTTGTGTCTGGCCCTGGTTTTcctcattctcctcatctgtataatgg
-atcattctgtggggccatgaagagaaggCAGAGTATGGCACTTCTTGGATGGGACACCTG
-GGGCAACTGGGGGAATGGCAGTCACACACGGGAGCCCttattgagcacctgctgtgtgca
-gaggctttctctgctctgcttctcttgaccccacatcaaaggtcaggggtaggtgctgtc
-attctcctcccagcctccggattaggcactgagAGGGAAGGGCCAGCACTGGGTCCTAGA
-GGGAGGGCATGGTGGACAGAGGAGGTCATGTGACTAGCCACTGAGCTGCCCAGCCCAGCT
-AGAGATGCCTGCACTGCAGCCGGCTCTGTCCCCCAACCTCCTCAATATTCCTGCCTGCAG
-CTTCTCATCCATATGAGCGGGGTGGAGCAGAGCCCAGAGCTGACGTGCAGCCCCAGGAGC
-TGGCTCCAGATGGGAGTTACTGGGGCAGGGGCTTTCCaggagcgaggaggaggagagaga
-gggaggcagaaggagggggagagcagggagaagaaagggaaggggagtgcaggggaggag
-gagagtatgaaagaggagagagagagaagaggtgaggCCGGGGCTCTCCCCATGCCTGAT
-GAGCACTGGCAGTAGGACACAGCAAGCTGTATGCTAGGAAAGAGTGCGTATCTGGGGACT
-TGGAAACTCTGCAGTAGAAGGGAGCACCAAGAGCATCCCATCCTCTCTAGATCTTGCTTC
-CCTTGCCTCCTTGACACCTTCCAgagtcaggaaaaagtacctgcagtttgtagtgagaat
-ccagattggctttcactgctacatggctctggcaagtcactttccctctctggcctgttt
-cctcacctgtacactgggggaacaggaGGGGAGTTGGGGGCACAGGCTGAGCAGATGATG
-GCTTCTGGGATTCGCGACAGGAAGGATCTCCCCTGTGTCTGTCTAGATGAACAGAATCTT
-GCTGAGAGCTTGTTCATCCCTAATGGCAatggtgatgatggtgatgatgatgctgatggt
-gCCATTAGATGAGTATTTTAAAACTCTTTTTTTAACTTTTCTGAGATGTTAGAGAAAAAG
-CCAAAAAAAGGCTTTGAGTTTCAGAAGATCTGAGATATGCCTGGACCAAGAGAAGAACCA
-GAGGAAGGTCACAGCCACAGCCACAGAAGGTAGCAAGCACTCCCCACTGGGGACCAGGAG
-TGTCAGAGGGGGCAGAGAGAAATTATTGTTTACATGAACCAAGGGAGACCGAAACCTGCT
-CATCTGTAGCCATTTGGTAAGGAAGTACCTGCAGCCAGGTCAGCTGAACTCCCATATCAG
-AGATCTTAGGCCCTACGGCACTCTACGGTGACCTGACTGACCCTAGCTCAGAATTTTCAG
-GCTAGGTGAATGGATGCCTGGAGAGGACATTCCACCCCAAGCTGAGGCACTGGACCAGGT
-GACCTTCTGATCCTGCAAGCCATCAGTTCAAGCCATCAGCTCTCAGCCAATGTTTCCCAA
-GCATCCGACACCCAGGGGATTCAAAGATGGATGAGAGTGAGAGGTGAGACTTGGGGTAGG
-AGGCCCAGTGGGAGGTGATGACAGCATCCTGGGAAAGATGACGAGGCCTAAGCCAGAAAG
-ATGGACCATGAGAGAAGCCTAGGCCACAGGATGGGCTGGGCCAGCTGCCTGGGGGATAGG
-TGGGAGCCACAGGAAGCCCCCAGGGCACAGCCTGTGGCTGGGTGGTGGTGTCACCCTAAA
-CAGAGACAGACAGGCAGGAGGAGGGTGTTTGGAGAAGAGCAGGGAGTCGTCTCAGGCAGC
-TTTGGAGTTGAGACACCCATGGACCCTCAGGGAGGTGTTGGGGGAGATCCAGGTCATGGG
-TTTTGGGCTCAGGATCCCATCAATGCCAATTTTGTGTCATCACGGAGCAGGATGGAGACC
-TGGGACCTGAGAGATTGGAAGGACATTTATGCATTCATGCattcactcatgctacagaca
-tttattgagtacctactgtgtgttcggcactattctaggccctgggaacccagaagtgag
-caaaagagacatggcgcctgccctctgggagctcacacaccaaaagaaatgtttttaaga
-acattaggtagggataagttctaagaaaaaaaaacacaacaaagccagcagagggacaaa
-gggtggaagaggaaggtggttatttcgtacggggaggacaaggagggcctctggggagat
-ggcgctggagaggataggaggctggggtaagcaaagtgggagtctgggagagggaactcc
-agggagtaagggttcttgcttttattcggatgcatggttagccctgggaggagggagagg
-atgtaacttaggttttgatggggattctttggtctgctgcatggagaacaggaggtgggg
-gccgagtgttagcagggagccaggggggcagccaggacagctatcctgcctggagccaga
-ggtggttGTCAAGCTTGTCTGCTGTTTAATACCTTCTAAAACTCCAGGAATTAGTTCGCA
-TCCTTCATTCCTCAGTCATCGCCCAGACTGTCTCCTGGGTCCCTCTCCCTTTCCTTGGTA
-GCTCTCACTTAGGGACTCTGAAGAGTCCCATCTCAGACCCCCCAGGATGTCTCCTGTACC
-CTCATGCCCCGCCAGGGCCAAGCCTGCTTTGCACACCTCTGTAGTCAGTGCTTCTCCGAG
-GGTACACAATAGGTGCTCACACTGCTGAAAGACGAAAGCATGACAGGGCATTCTACAGCA
-GCCCTGGTcttgggccaaaaccacagtggcatcctcagctccttgcttcctcccactccg
-catccaattcaccagcagagctgatgggctctacctccagaacccaccagaatcttactg
-gccacaccccctcctagccccgttctgctccaggcctccggtaccttgcacctgatggct
-gcagcggccacctctttgggcttcttccttccaccctgcctcctacagtctatgctgttg
-aaatcgaatcacgggtgtctgtctctgctcacaaccttgcagtggctcccatgacactca
-gaacaaaagctgaagtccttccagtggccccccccccagctgcatggcctgccctgctgt
-cacctctcagacctccccgcacccttgctccctctcctctgctccagctacacaggcctt
-cgccccatggttctccaggcacacaccgctgcggatgcattccctcctcacggtcaaaat
-acatgcagctccctttgcagaacgttccctcaaatacctgcctggcccactctatcattt
-cccttgttctctgggttcaaatgtcacctcctctgagaagtactctctaatgatctgacc
-tcaagcagccacccagggccgccacttgccctctttcttcttcattttgcttcaccatct
-gacatagtagattatctcttactgcctctttcccctactagtccagagggagacatacta
-tactgtcgtatccccagcacccaggaaggcttggtccgttcagcccttggtcagggctga
-atggatttctgttggatgaatgaaGGGACGGCAGTTAAAGAGCCAGGTTGCCAGCTGACA
-TTGCCCAATCTTGCTGTGTGGCCTCAGACCCACCCCTGCCCCTCTTTGTGCAGCTCAGAG
-ACAGCCCTCTGTGCTCAGGGAAGGCCTCTTGGATGGACACTCCACCTGCTGATTGTGACA
-GACCCCAAAGCCGCCCTCTGCCCCCTGCAAACCTCCCATGCCCCGTACCTTCTTCAGCCA
-CTGCGTGTTGTTCTGCAGTGCCTGCTCCAGCTGTTTCACCTGCTGGGTGGGCAACTTCCC
-CAGGTGCAGTGGGTTGGCCAGTGATTCTCTCTGGAGGGTGTTGGAGTCCCTGGAGACCTC
-AGGCCCCGGAGGGCAGGGCTCAGACTTGGGCAGCAAGAAGGTGTAGCTACAGTGGCCGTG
-CTGGACTACAAGTGTCTCGCAGCCCCTATCCGCCTCCTGCCTTGTCTGTTGAGCCACAGA
-CATGGTGGCAACCACAAGGAGGAGGCTGCCCTGCAGCATGGCTAGCTGGGAGAGCATCTG
-AAGATGTGTCAATGGCGAGGGATGTCTGCTCAGAGCCCTAGGGGCTGTGCCTGGGATGTC
-CTGCTGCAGCCAACAGTGGCCAGGCTTGCCTGCAGCTGCAGCTACAAACCTCTGTCTGGC
-CGAGCTCTGTCCAGGCAGCTATTTATACTTGCTCTGAATACCACGGCTGCTCTGCTTGCT
-TCCTCTCACCGCCTCCCTCCGGCCCCACCCGACACCCTCTCACCTCTATTCTTCACTCCT
-TCCCTTCCTCCTTCCTCAGTCTTGGTGGCACGTCGCCCTTACCCTAAGCGTGCACCAACC
-TTGCTCTGTCTGCCTCACCTCTGAGCCCTCTGATTATCCAGTGAGGCCTGGCTTCCCTGC
-TGGAGGGGAGGGAAGAAAACAGcacacagacacgcgcacacactcatgcacacactcacg
-agcacacactcacacgcacgctgacacgcacacacattcatgtacacacaAACGCCAAGC
-TCCAATGCTGCCCGCTTTGGAAAACCAAATGCAACTTAACTCTCCCTTCCTGTCTCTGTC
-TTGGTCTCCCTCTTTCCCTCCACCCCCATCCCCTGCCCCCCAAGTCTAAGATCTCAAGTT
-TCAGTCCCGCTGCCATCCCCTTCTCTCCCCGCTGCACCTTCCTCCCTCTGGTTCCATGTT
-AGCGCTTGGAGTACAAGTGACCCCCGGAGAGAGCAGAGGGAGGGGAGGAGGCAGAGGGGT
-GAGGCTGGGGAGGGCCCAGCGAATCCACTTTGCCTCTGGAGACACAGAAAATCCTTCCAA
-GGTGGGGCAAGTGAGCAACCCAGCTGGGAGTTGCTTCCTGTCCTCTCTTCTCCCTCAGGG
-CCAGGGGAAAGTGGTATGCCCCAGGATGGCCCTGGCTTGGTTGCTTGTAACAGTAATGAG
-AAGTTGTCATGTCCTGGGGCAGATTGTCCTGGGGCTGCTGGAGTGGGGATGTGGAGAGGA
-Ggcagtggggagaggaggttggagtgccaggaggctaaccctagatctcgctccccgaca
-gctggccacgagacctagggtgggcagctgtgcctctctgggcctccacaccctgatctg
-taaactgggtaaaccttatctcttgcaggAGGAATGCGTGTGAGTCCTCAGCATGGGGAT
-GGAGAAGTTTTCAGCTTctgggttcaaatcctggctctaccatctaccagctgtatgact
-ttgagtaagtcacttaacctctctgtgccttcatttcctcctgaatgaggaaaataatac
-cacctacttcacatggcatgaaaattaggtgagttagagcaaggttggcacagagcgagc
-actaaataaatattTTCCGTTGTCAATgttatagttgtcattgcacctcccctcccacga
-cccactggagcataaactcctctagggcagggatttgtcCCTGGGGGACATGGTCTCCAG
-GCAGAAGGTGCCCAGGAGTTGGTGGGGCCTTTCCTGCATGGGCTGCCTTTATGTTCTGCC
-AGCTGTTTGGGCTTTTCCTCTCTCCCTGCTTGTTTCCTCAGAGTAGGGGCCAGTCTGGCT
-GTTTAGTATTTTCCTTTTTGTTCTCTCAAATCCCGATAGAGTTTTGAATTGGGGCAGGCT
-GCTTCTGGGCAGCTGTGAACTGTGGTCTCATCTGGGGACTGAGAACATTATACCAGGTGT
-GGGGCTTTTGCAGGCAAAGGAAAAGCAGCTGGTTATCAGCCTCCAGCCTCCCCTGAGCCT
-TCCCACATGCTCTGAGCTCTGCGTGCCCCGCTTGGCCCCAGTTGCCTCAGCTGTAAATGG
-GGTCATAGCACCCTGACCATGTGAGAGTAATGTGGACTGATAGCTTATCACAGCTCTGGG
-TGCAGAGAAGGGCAGTGTGAATGGTGGTCGTCATTATGATTGTCTTGACTGAGCTGCTTG
-ATAATCCCAACGAGgcagttacaccaggccccaagcttagatgggccccatgcttggttt
-acactctgccagcactgtcttgaaattcttaatacatttggaacaaagtactcagcactt
-gcattcttcattgagttccacaaattaggtagcaggccctgCCTGGGAAACATGAGGCTT
-CCCTCATCCCTCACTCTGCTCCTGACCTTACCATCCAATCAGACCTGTTCTTCCAACATG
-ATCCTTTAGATATTTCCCCCTCTGTCACCTCTTCACTACTCAGAATGCtggagccagcac
-atctggatcggaatcttggctttcctgaccccctatttgtgtgccttttgccaagttgcc
-taacctgtctctcagtttcctcttctgtcaaaatagtgatgttacagtggctaaaagacc
-gattcctgcagtgaggttaacacagagcctttcacataatacatgctcaaccagtgacag
-ctgtcatcattACTCCCtgctatgatatgaatgtttgtgtgcccccaaattgatctattg
-aaacttagtcaacaaggtgatggtattagaaggtggggcctttgggagtgaatagctcgt
-gaggactctgccttgggaatgagattaacgctcctatcaaacatgtcctagacagctggc
-cttcccttttgctaggtgacgttgcagtaagaaagcaccgtctatgaagcagggagctct
-caccagacaccagatcggctggtgccttgatcttggaattcccagcctccagaactgtga
-gaaataagtttctgttgtttataagccccccagcttagtgcattttgttatagcaacctg
-aatgggctaagacaCCCCACCATCACTCTCTTAGACCGGGGTGCTTCCTCTCTTGTAGGG
-AGAACAACAGCCTCAGAAGTGAACTCTGGTTAATTGGCCTTTGCTATTGCAACCAGAGTG
-Accttccttccttccttccttccttttttctttctttctttccttcttctctttctttct
-ttctttctccttttttttgacagagtcttgctctgttgtccaggctatagtgcagtggca
-tgatcttggctcactgcaacctccatctccccggttcgcgtgattctcctgcctcagctt
-ccccagtagctgggattacaggcatacgccaccatgcccaactaatttttgtatttttag
-tagagacggtgtttcactatgttgcccaggctggtctcaaactcctgacctcaggtgatc
-cacgcacctcggcctcccaaagttctaggattgcaggtgtgagtcaccatgcccagccca
-gagtgatttttctaagacacaatccagccctgacttctttgtttaaaattcttcagtttt
-gaactccaactctttctgtggtttacaagcccctgccggatgtggcctccattctcatca
-ctgtttccctggcactttataccttatcattTGGAATTGGTTTTACTCCCCCGCATGCTT
-TCCGCCTTCTGAGGCCTCAGTGTCTATGCTCCTAGCAGGAAACTtctgcttaaaaacttc
-cccccacctgtattgtcccagcttcgttctgcctgtcttttgatcttatctcagggatca
-cctcctctgggaaggctttctgcatctgtccctcccacttcaatgggagtaggccttctg
-cctctgggagctcaaaggcccctgcctgcctgtccctcaccaaagcactcatcctgcatt
-agaaaggcttgtttgcaggccttggtcaccgtctagactgaacactcttctaggtttgct
-gtcacactttccatttctgtgtttgttgcctgtcctaaggttaggctcacagtgggtcct
-catgagtgttatgttgaatgaatAGGAGCTGCAGGCCCAAAGCAGAGAGGAAGGCAGTCC
-CCTTTCCTCTCCAGCAGGGGCAGCAGGAAGTTCTGTGTGAGTTGTTCTGAGTGTCTGGCC
-TCCAAATCCTAAAAACAAACCAACCCATGTTGATTTTCCCATTGTCTGCTGCTACCATGG
-AGGTAGAGAACGGAGAATAAACTTATATCCACCTGGATACTTTGGCTTTTGTtcaaatag
-cttgggtaaaaagggaatttattggccaatttaactgaaaattttaggggtatcgagctt
-caggcatggctggatccaggtgctcaaatgatattagattttttttttttcctccaactc
-caggctcttattttccttcatttccttattttcctttgggttcattctgtaagagttccc
-accataatcaccaccactactggcaacagcagctccaatctatcaactcagtaacctctt
-ttaagagtgcctctttcctaatagttcttggaaaagttccagcttgagccgtacagtcat
-tcctgaaccaactattatagccagaggaaggagctactgtggatggtcaggctggatcct
-gtgtccaggcctggagccttggagcaggtcaacctcacaggatcggaagggactaagggt
-ggggtacagtgacgctcaagaaaacctggagtagaatgatcaggaggcgggtggagttgt
-tgggcaTAAAGCACCTGCCTGCCTGCACCCTGACTCTCCATCCCGCCACCCACCAAGTGA
-ACCCACCTCCCGCtcagagctgatggactcttggagtaactagagatgccatggaccctt
-accttgcatttcactcatgaggaaactgatactcagagagggaggccacttgcccagtgt
-tacaTGCTGGAATCTATTTTCCTGGAAGAACAGAACTTCCTGCTCCTAGGAGTGAAGGGT
-GGGAAAACAGGGTCATTCCGGGAGGACCACTTGCCAATTTGGGGTCCTGAAGTACCTGGA
-TCCAAAAGAAGAAGACTGTCCCCAGTCTGAATCTCCCACTCTGGGGAGAGGGTCACTCCT
-GGGTTGTTCCCACAATCCAGCCCTTCTGCCAGCCCCTCCCTTGGCAACTCCTTGCATTTC
-AACACCCTGGATGATCATTGAGGGTTGCACGTGGGGCAGCTGAAACAGACCCCAGGCCTC
-TGGTCCTGTGCTGCTCATGCCCCTGAGGACACTGCCTGGGCATCTCCCAGAGCTACTGAT
-GGCAACATGGCAAGAGCCTGGTGGGAAGCTGTGGGGCCATCGACAACCCCGGGGGATGGT
-CTGTGTGTCCTCAGAAGGTCTGGTGGTGAATCTTGTGCAGCAGACATCATGGTGGCCCCG
-TGAGCCTTTCCACCCAAGACAGAAGTCGGTTGACTGCCCTCCTCCACTTTCTACCAACCC
-AGACCTAGAGCCAAACAGAATTCCTGGATCACAAGGGGCCTAGGGTGGGTTTTGAGGTCA
-CCCTGTGACCCAGGCCCAGCTGTTAAGAGCCCCACATTCCTGATGCTCAATCTTGACTTC
-CCTTCAGTAGAtgagactcagtttcctcatctataacatggagaaaataatccctcactg
-ggaaggcggtggtgGTGGGGTCttccagttactgatactgtgtaacaaagtatccccaca
-tctagtggtttaaagcagtggcaacatctactttactcacaaatctgcaattgtggccag
-gttccctgggaaaagctcaactgtgctccattccgtgtcagctggagcaacttgcaggct
-ggggtttgcatccaaaactcatccactcacatatctgaaacctcagctggggcactcagc
-aaggacaactgcatatggcctcttcatgtggctaggggcttcctcatggcatggtggctg
-cttcccagagcaagcatctcaggagagagatttgggcagaaggtaggtgatctttatgac
-ctagcctcatggatcatgcagggccaagtcctctgtatctagtcaaagaagcaaccacaa
-agtcccactcaagttccaggggaggaagaacagactctacctcttgatgaggaggatcaa
-ggtttcagaagaaggtataggatgggggatagtgttgtggccatttttatttatttattt
-tgtttatttttaaatttttatttatttatttatttttgagaaagagtctccctctgttgc
-ccaggctggagggcagtggtgtgatctcagctcactctaacctctgcctcccgggttcaa
-gcaatgcccgtgcctcagcctcccaagtagttgggattacaggcacatgccaccaagtct
-ggctaatttttgtatttttagtagagacagggtttcaccgcattggccaggctggtctcg
-aactcctgacctcaagtgatccacctgcctcggcctcccaaagtgctggggttacaggta
-tgagccatagtgaccggccTGTTATGGCCATTTTTAGAAAATACAACTGGCCATGGGAGG
-GTCGGATGAGAAAATGCCATTTAAGTGTTTAGCATGTAAGTGCTTGATAGTTGGTAGCTG
-TTATTATTATCTTTGCGATTATTGGAAAGACCCAGCATCTCTTTGCATAAAAATATCCTT
-CAGAACCTGTGAGAGCTAAAGGTGCAGGAGGAAGCAGGATAATTTCCATCAGGGCTGCTG
-GAGAAATTGGCCCAGAAACCCACTGGATTTGTCCCAAGTCACCCAGTGTATCAGCAGCAC
-CCAGTCTGAGCAAGACTGGCCTGGGACATAGCTGCTTCTTCTGTTAGTAACGCTGTTACT
-ACTTCCTGGGGTATCTTCCTTGGCCTCAGCTTCCTCTCTGAACCATGAGAGCATCCTGGC
-TCTGCCTCCTCAGAGGCTGAGGGGATAAGGGCGGAGGACATGCATTCTCTTGGCTGTGCC
-CAGTCTGGGCCACCAGCCATGCCTGTTCTTTCTCAGGCCTGGGGAGCTCGGTTGCCTCTG
-AACCCACATCTGGCACTCCCTCCAGGATATGAAGAATAAGCCTGCCAGGTCAGAGGGCAG
-ATCTATTTTGGAACCTGGGACCCCATAAAGACCCAGAGGACCCTGTGACCGAGAAAACCA
-ACAGGCCCCTCTGTGttttgttttcattaaacaagcacaacatgtccctcatagaaaagc
-cagaaaatacatattggcaagaaagcgaaaataaatgttgcctgtgctctcaccagccag
-aggcaaaaaccatagctaacattttggagttttttccccccaaataattttcctctgcat
-atagatgcatattttttttggtagattttctagcaaaAAAAAAAAAAAATCAACAAACAA
-AGGAATATTGTCTCAACAATTTTTTAATTTTCTTTTACTTACTTTGGATTTTTCTTCTGG
-AAAAAAATTTAGAgccaggcacggtggctcatgcttggaatcccagcactttgggaggcc
-gaggtgggaggatcgcttgagctcaggagttcgagaccattctggccaacatggcaaaac
-cctgtctcttaaaaaaaaaaTACTGAAATCTCCAGACTTCCAATTGGAATTTATGTTggc
-cgggtgtggtggctcatgtctgtaatcccagcactttgggaggccgaggcaggtggatct
-attgaagccaggagttcaagaccagcctggccaacatggtgcaaccctatctctactaaa
-aatacaaaattagccaggcttggtggtacacgcctataatcccagcgactcagaagactg
-agacacgagaaatgcttgagcccaggaggcggaggttgcagtgagccgagatcatgccat
-tgcactccagcctgggagacagagggaaactatttctcaaaaaaaaaaaaaaaaaaaTCA
-GACAAGTGCACAGGATAACAAAATACACCCCCATATAGTCATCACTCCAAGTGGGCCCAT
-GTTAACATTTTGCATATTTGTCTTCGATTGTTAAAACAATGAAATATTACAGGAAATGTC
-AGTATTCCTTATAACTCCTTCTTGGTCTCATTTTCTCTCCCACCCTGCCCataggttcat
-atctaggtatataaataatgtataatatttttgtgttctcaaaacttaagtatatgctgt
-tatactgaatgcgacgtcctgcttatattatattttccagattgatataaatgacacata
-tagatcttgtgaccaaggacattttcttttcactgctgtgcagcattgcattatgtaatt
-tttaactctttatccagtttttggcagatggatatttaaattaattcagttatcttgtta
-ttcctgacaatactgctattaccatcttatatgggaatacttgtgcttacaagcaagggc
-tcctctggggaactaatccaggcatgctcctcctgggtcgtggaatatatgtgctgccag
-cctgaggcagttgccaaattgtgctccaagtctctctgtcgagttaattccagtagggtg
-ccggggtctccatcgctccgcacccctgccatcccttgagatggtcatgctttacctttg
-ttccaatctgatggctgtgaaatcgtacatgtaattacatagcctgctttccctacttaa
-tagtatattacggaactattttcctgtgcagaatattgttctatatgtgggtgtttcaag
-gtggcataagctgaaagcctccattggggtgttgctgggattttcttaaccaattcccta
-ttgttggacaacagggtttgtttTtgtggtaggattgcaaaactgaccacagatgctacc
-cacccctataagcatgctcctttgcagtgtgactctgcagttctccctattaagaggcaa
-agttcacttctccactcccttaatgctgacttgggccatgtgacttgctttggccaatgg
-gacattttcaagcagaggcttgaaaagggcttgtgctctggggcttgctctcttgctgca
-cctggggccctgagaccaccatgtgaatgagtcctggctagcctgagggatgatgagaca
-cacttggccaagtcatcctgtcatcccagctgatactaaaccatccaccagatttgtgag
-tgaggccatcctagaccatctatctagcccagccaaactggtgcggaccagaagcaaagt
-ccagttggcctgcagagatgtgaaaaataaatgttttaagccactaaattttagaggtgg
-tctgttagacagcaagcctgatacaGTTCCACCCAGCATTTtctttgctcaaccagttac
-tggctgggaaccttgggcaagttgctgagccttagttttctcctcagtacaatgggggat
-tacatacgcactcctcaaagtcgttgtgaagattggatgagatggcacctgtCAGTATCA
-CATGGCGGGGACCCCATAACCAGGGGTTCCTCTTTCACATCACGGTGGTCTTAGATGTGA
-CCTGTGACCTTTCTTATTGCTTCTTGGTTCTCCCTGCTGCCTCTTTCTCAAAAATGTACT
-CATCCTTCCAAGTTTTCTGGAGAGTATCAACATGTAAGTGTAAATCACAATCCCTAGTGC
-TCTCCAAGACTTGCAGGTATCTCCTCCTTCCAGGGCCTTCCCTCTTGAAATTAGGCATAG
-Tggctgtgtgcagtggctcatgcctgtaatacaagcactttgggaggccgaagcaggccg
-atcccatgaggccaggagttggagatcagcctggccaacagggcgaaactttgtctctac
-taaaaatacaaaaattcaccgagcgtggtggtgcatgcctgtaatcccagctactcagga
-ggcggaggcatgagaatcgcttgagtctgggaggcggaggtttcagtgagccaagatggc
-accactgcactccacactccagcaagacccggtctcaaaaaaaaaaaaaaagtaaggaaa
-agaaaaAGAAAAGaaaaggagtctccatccagaccccaagagagggtttcgtggatcttg
-cacaggaaagaattcaaggtgagttgcagagtgcactgagaagagatagtttattgaaag
-ctactcagttacagagaaggatgtcctcagaaagcaagaggaagaacgcactgtctttgt
-tttaaactcttctaatgtaggagtcttatctaagtaaaagctaagttatgtctttgtgca
-gacagaccgacagtgtgacagaatccattaccgttgacttaaagaaagttatccttggca
-ttttagtaagtacatcagatcacgacagtaattgttttgaaagcataaattgttatgtga
-tattggaacatctgggcattttgctgtcgtaagagtttactcttgcaggcattattgagc
-agcttccttagccataaacatcttatgactgtgggctgtgattagcaaggaatgtgtctt
-gctagttttaagatagagttgattttaaaatggtgtcaccctagctctcctatgctcctg
-tttcccaaacaTAAtcccccctctacttaagagagaaccctaaatcttaaggggagatga
-aaggtgaaggtcatttttctgtaacttattcctgctgacagtggACGTTGTTGACCTTTG
-GGAGAGAGTTCTCTCATAAGAGTTTGCAGAGAGCCTTGTAGGGAGCCGGGGAAACTCTTC
-ACTTGAATGACATCCCGATGATTTGGTTTAGTAAGTGTAGGGGCAGATAAGCTGCCAGAC
-TATTttatctccgtaatcccatgcaataagtgcaacagaagtaaaaagcacaataaccaa
-tagcaataagtgtgacaacacgaagcatgctaaaaaggaatgccttccaagtgctgggga
-gctggccaaactgtgctgttatgacaggaagtcaattgctgaggtatgagtctctaggga
-gttcatggcctgagatatattatgagagtgaccaggaatatagacacagtgttcagtctt
-gatcaatgcacagattttcccagggctgctgttaatatgtttaaagccatatggctttgt
-aaggacatttgtcttattcgggacgtttcttctgtcagacgggtgatcaccagatgagtg
-ttgttgaaagccacagcagtatgttttgctagggctcccacctgcgattcaacgtctata
-gatgttgcttaaagacagaatatgggcacaggatataaccaccaaaaagtttgtttctgt
-tgcctatcacagaccttgactacttcccagttggtggagagggaatccagatgtgtaagg
-atacatcctagaaggtagggatgaccccaagtgcatcatccagtcaaattgtaaggtgag
-tatggccaactatgagacccacatgcccataaccattcccaaggggaaggatagtcacct
-aaccatagagattcattttgccatcccatccacatttggtcaattgaaaggagagtctga
-ttgcattgttggggtggcagccatccgatactatagatgttggtttgggggtggttactg
-ttgatgaaaagagtcgaactctgtaaaatatttgaagagacttattctgagccaaatatg
-agtgaccatggcctgtgacacagccgtcaggaggtcctgagaacatgtgcccaaggtggt
-tggggcacagcttgattttatacattttagggaggcatgagacatcaatcaaatacattt
-aagaagtacattgatttagttcagaaaggcgggacaactcaaagcggtggggggaaggag
-aggcttccaggctataggtgaacttaaacattttctggttgacaattggttgagtttgtc
-taaagacctacgatcaatagaaaggaaatgtttaggttaagataaaagattgtggagacc
-aaggttcttttgaagtctcatagtagctgccctcagggacaatagatgacaaatatttcc
-tatttagacctttaaaaaggtgctagactcttacttaacctcttcaggattgggagggcc
-tggaagaaaaagatgtagctatgttaatagagattctttacagatgcacatttgtcccca
-caaaggacagctttgcaagaccatttcaaaatatagcaaagaaacatgttttcgggtaaa
-atattttaattttcttccttgtctcataacattatgccagggtcaggtcggaaagtaagt
-cacaatatgtagggttaaataaaacccatctgaggagaatttatggtttgtagggcatga
-ctcccagaccccttagataggaatttggacaagaaaaaaaaaaatcagagcctagtcctc
-ataaccattatgccttccaaggcataagggtactttgcctgataactgaatttggatacc
-tgtcaaccaactgagtccatcatgtatggtatagcctaaggtagggatgctattaagtta
-tttGGGATTAAATGAAGAAGGAATTTCTTGGTTTCGGTGGAGGAAGGGAAGAAAGAGTGG
-TGTGTGTCCTTTTGGAAAAAGGAGAGTACATATTTTCTGTACTCAAATTAGCTGATTGGA
-TATGCCAAGGTAAGCCCGAGGTTGACAAAGTTTGTACCCATTCTGCAAACAGATATCCTC
-CAACTCTATAATAGAGCAAGCTCAACATTAAAACCAGTGGTCTTATTTTCAGAGCATCAC
-TTATCCACTGGATAgctttttctggaagagaagccgtagatccactattggctcacagga
-gtattctggaatggtgatccctgcaccagatgcctgtgggacttcatgagagacaggttt
-aacttgggataaatgtacccaaatatgtaatcccttaagtttaactgtagtaggagtgcc
-tggaagtacatggtagggctctttctattttggggaaagctgatctgcaggggatccctc
-cttccaaggtttcaatagcatgaaatctcctggTCAAacaggagagaatatttatgaaga
-tggtcctgacacatgtatactgaacaaacatgcatgtaacatatgactctgttcacctta
-aggtggagacttaatccttgccaggcatggtcttagatcctgtttataatttgaaatctt
-cttgctataaagtttctattctatcagtcttatgatctctgttttaatgttaatgctggt
-tggttgtgcccgaattccaagagggagaattgtacagcaaggtgtgtttgaccccccagt
-ccctcttcccatcatggccagaaccagttgttcaggatttttaaaaaattattatttcct
-tttgccaagagagaggtccattctgttgggtggcttaggatatttgtttatttattagtt
-taGTTTATGGTATcccattttgtcgaggtgccagaggcagtattgaaggctaagctttta
-ttgtgtcccatatcaatgctggggtggtgtcctacttgccctggtccattacctcccttg
-gtggaacacttatggtcaaggaacttagagtcaaaagacttatagccaatcaaatgttct
-aggccagatgggaatggaggtgagcaggcactcattaaccttaaagcctctttaagcaac
-ataagagccaaaaatcaaaagccagaaggcaaggtataaaattggcttatttagaaattc
-tatgcaagagctactataatcttggtttgtggcaattagctatacaaactcaagaattat
-gtttagctatttagggatctgtgtgcctgtccttgatttggagtgtcagaattaatttta
-ttcctcaaaactggcccttacaatctcatgtgatagtccctgggcatggaggaattgaat
-agtttcaAATTTTGGAGGTAAAACAAAACATAAGGCATTAACAACATTTTAAACAAAAGG
-TCATAAGCCCTGCCTAGTTTTGAGAGTGACAGGAAAGGAAGTTCACAGGTAGCTAAACAT
-TTAAATTATTTAGTATCAAGACATAGAATAAATTATATTATTTCAGATAAAGGCAAAATT
-ATTAAATGAGTCTTAATGTTTTTGAATACAGGActgcctctgtgtcttatggaagcagtt
-tattttgattgtcacttttgtctaggtctaaagatgagactttggtcaacttgagtttgg
-tgtcagatactggcagaagtcagtgccttcttcttttttgggacagagtctcactctgtc
-acccaggctggagtgcagtggcatgatcctggctcactgcaacctccacttaccagcttt
-aagcaattctcatgtctcagccacgcaagcagctgggattacagatgtgcacgtaccacc
-acacctggctgatttttgtatttttagtagaaatagggtttcaccacgttggccaggctg
-gtctcaaactcctggcctcaagtgatctgtctgcctcagcctcccaaagtgataggatta
-taggcatgagacactgtgcctggcagtcagtgccttccttagatgagatattggacccag
-aagtcaaagccctgtaacttaacagcacaaggattagttaatagCACCTGATAAGGATAC
-TTTTGAGGGGGATAGAGTGAGCCCTTTAATTGATGTTCTTCCAATATATGTAATTATCAG
-GCTGGAGGTGGTGATCCTGGAGTTCATGGTCTGACTGGAAGCTGTGAAGACTTACAATCT
-TCAGTGCTTAATTTTTATGGCTTTAGTAAGCCCCAGCAATATGACtaagtcagagactta
-atttaggattttgattttgaagatgtttgttaaagatgttaaaaggctcaaaacatttga
-tcaaaacagaagcacagatcatggtaaaatagcatttactcatttacccaaagtgatcat
-cgaaatactttaaaggcaatacagaaggttacatggatgtaaaaaccttaacccttttaa
-aatctcagtttctttagcaatgaaaaacctaataaagacagcatagaaattatcttgata
-atacataaaatctcagttttttaagccatctactaaaaaagcaaaaaagccctactgcat
-tgtgactacttttacttattggaagctcatttagataaccaggaagtcaaacttgatgaa
-aaaagtgcttgaatttaatcagacacaggaagactgttttcaaggttatgaatatagcag
-gggaatacacgactcctaggaacagcatgagaagttttctgattgcatcaaaaatttaga
-catatcaagaaaagccagtgtacagaatgcagttatactagaggaaaacattgcttttct
-agacctccaagatgcaatatgttagcatttggccataataacagttagaaccagagcagg
-gagaaagttatagaagctgacagaaaaattaaaggagagagttgttatctcaagcattct
-caaagggagaaacagctgaaagctgtttttttcaacagcacagcaacagttgaacttttg
-agatatgattctgagaagttttaaaaagaaaaaggttataaaattaaaggtaagatttcc
-tataatttatttaaagagcatatcaatatcttaagaaaaccttgttttgatgtaagggac
-caatttttagacaaattattataaataatttttttataactaatgatatgcaaaatccct
-tttacaaattcccctttatgacttacatagaccatctacgacatgcttggactctctgac
-ttgtcctgaacttccctctttgctaaacaatcagtcattttactttaggacaaaaattta
-ccatataagactctttttcatataaaattattctcttttctttataacctttcttaccat
-aaatacatcttcatatttataactttctttacatctctctctctcccctacctactggtc
-cctttctaccttgtttcataagtaaacattttcaagttcgtaatttgaattgaccttcaa
-ttcagataacttctgaattagacaaaattatttttttctcagtaatactagatcttGGCA
-GGCTTTTGGCCTCTAACATCACCCAGAGAGAAGCCAAATTAAACAACCTAAGAAGCAAAA
-ATCATCAAGACCAGAAGGAAAATGTTAAGTGTAAACTTCAAAGCATGTGAGCGTAGGGCG
-ACATGTGTCACTACTGAGGCACAGACAGCAAATATGTAGTCATCAAAAGGGACAAGGGGA
-TCAAGAAGCAGTAGGTGCTGGAAAATATCCCTCTGAGCCTCAAACAGTTTATGCATCAGG
-GTGACACTGCAACCCTGGGCCCCTAATGGCAGAAAAACGCCACACAACAGGGTGGCAGCT
-GACCAGAAGGATCCCACAACTCCAGGCTCCCTAGCAGACACAGCCCAAAGGATCCAACAA
-CTCTGAGTGGGGGGCTCCAACCCCTGGGCCCTGAGAATATAAAGGAACATGAGTGTCCCT
-GTGTCTCCTGGGGCTCAGAAGGCTAGGCTGAAAAGTGACAACAAAGGGAAGGGCACTCAC
-CTGCCTGTGAATCCaaaactggaaaaagcaagaaatcctgagctgtttgtcagatgttag
-cattttatagataaagccattctataattttagaaacatgctttcccatatcataaactt
-ttcttaattggaaataacccagacatctgatgagtaatctaaggaaagctgtggaccaaa
-attttgggtaaagtggtctttatggaagttaaaaaaaaaaagatttaaaaaaagatttaa
-agattttttttttaaaGCCTggctgggcatgatggctcctgcctgtaatcccagcacttt
-gggaggccgaggcaggtggatctcttgagaccaggaatttgagagcagtatggggaacat
-agtgagactctgtctctataaaaaattaaaaaaattagctgggtgtggtggtgtgcacct
-gtggtcccgaatacttgggaggctgaggtaggaggatcacttgagcccaggaggttgagg
-ctgcagtgagctgtgattgtgccaccgcattccagcttgggtgacaaagcaaaaccctgt
-ctaaaaaaaaagagaaataaagaataaataaaaGAATACATGAaattaaattttaaaaaa
-gccttttccactttttttccttcagtgtcaaatgaacttctaatgtttccatttcatcta
-gaactgactgaactgcgttaagaaaaataaaatctccaagtagacttgaattagtaatac
-ataaacagtgagtcttatctcaacaccagcagcttaataacagcagatttaaagcaggca
-gaaaagaaaagggagaaatagataagagagctttagaagCAATAATCAGAGGCAAGCATG
-GAAAGTGAAAGTAGCAAACTTCTGGGCTGGCCATACAGAGCTGTCATAAGCCTGCAGTAA
-AGCAAAGGTAACAAGCTGGGAAACGATGAGAATTACAGCATTCCCATACCTGGCAAAGGG
-GACAATATGGATTAGTTCATAGCAAACATCTTGCAAAGCTACTTCCATTTTTCCAAATAT
-ACCCCAGGGGCTCTAACCCCATGGGTCTTTGGGCCTCTGATCTGAGTATTATACCCCAGG
-GCCTCCAACCCTGTGAGTTGGGCCTCTGACTCCATGGGCCAGGCCTCTAGCCTGAGTTTC
-TAGGCAAGTGTCCTTGCCTAAGCCTGACATAGTACACCaagatggacctcacttaccaga
-agcggccaattggtgctgcagactgaatttcttttgcatagggtctcgtcttatgcttcc
-ttcatggtcgctaggaagatgttgccagaaaaggggccatgattcaaaccttaaaaaagg
-gttcttaggcctcacacaagatggaagtcaaggcgagtctcaaagtgcattgagaacaga
-tagtttattgaaagctactcagttacagagaagggtgttctcagaaagcaagaggaggaa
-cacattgtctttgttttaaactcttcttatatatgagtcttattcatgtaaaagctaagc
-tatttctatgtgagtggactgacagtgtgacaaaatccatgactctgttgatttaaagaa
-agttatccttggcattttaatgtgtaagtacaccaaagcatgactataattattttaaaa
-gcacacattgttatgtgacatggaaacatctggacattttgctgtctaggagtttgtcct
-tgcaggtattattaagtggcttccttagctgtgaatatcttatgatcatgggttgtgatt
-gggaaggaatgtgccttgctaactttaagatagagttgattttaaaatggcatcaccctg
-gctctcctatgcttctgtttccctaacaAAGGAATGCCCCTTCCCTCCACACCCCAAGCC
-CCAACCAGCGGGACCTGGAGGTAGGGAAGACAGCATGGGAAGCCCAGCCTGGATTGGAAG
-CAGCAAACATTTGACCATCCCAGCCACAGGGCATGCCTACCCTCTTCTCTCCCTGGACCC
-TGGCCTCGCCTACCGTGGCCATCCTGCTCCCACACTAATCAGAAACTTTCCCCTGGAAAC
-CCGTCCTGGGCCCAGCCTTTGTTTCAGGTCCTCCTCAAGCCAAAGACTTCCTGATGCAAG
-CGCTTCCTCCCTCCAGCCAGGGTGAATTCTGCCCTGTCCTTAGTTGGCTTTTCACATTCA
-CGTTTCCTTGTGATGCTGCTACTCCGGCTATCAGAGTCGGGGGCAGCAGTGCTGAGGCCT
-CCCACCCAACCCCAAGGTGGCAGCAACATCCTTCAAGTTCCCTCCTTCCAGGAAACCATC
-TCTGGCCCCTCACTTCACAGCGTCCTCCCTCCTGTTCTGCACCTGGCATTTAACACATAC
-TGCCCCAATCACTGAGGATGTTGTCACTGTTGGTAATACAAGGAATAACAGCACTGACAA
-CAATCACAGGGTCAACTATGGGAGAGCAAGAGGTTGAGAAAAACAGACTCTGCAGTGATT
-GGATCTGGCTCAtctgagcctgagttttctcacctgtgaaatggggtcagtgtagcatct
-accagccttgtgtagctgctggcagataaaattagatcaatatatatcaccatcagcact
-cagagggctcagtccctggGGACAATTGTGGTTATTATTATTATTATTGTTGCTGCTACT
-ACAGGGAACACTTGCCAAGGCCTTCCTGTGGGCCACTAACTGTGCCCCCACTCTTCCAGA
-TTCACACCCAAAGGAACAGggtgctatgatacccattttgtggttgagaaaaactgagtt
-ccatcaaagtgaggagatgggttcaaggtaccacagttgggacctgaaaagccagCAATG
-CACTAAAGATGTGGGTGACACAAGGCTTGGACCCTAACAGAGCAGACTCTGAGCCCTGAG
-GGTGGAGATCCCAGCCTAGTTCACACTGCTGCACAACCTGGCTGCAGGAGGACAGCCAGT
-CTTGgggctctggcctcggacaacctgggctaatccttccaccttctagctgagtgaacc
-cgggaacatcacttaaccttcttgagctcagtttttgcctttggaaggtgaaataatggt
-ctctaccatgcagggggtgggggaggattagatgggtaagtggatggaaagcttgagccc
-agagcctatgcacagtgggctgctcaggaaggtagAATCATGCAAGCCCAGGCCTAGAAA
-TTCTAAAGGGCAGGCACAGGTTCCCCACAAACATGACCTTGGCAGAATCCGTTTCTGAGA
-GTTGGCAGCAAGAAGAAGTTGTATGGATGACAGAAATTCTCAAATTTGCCTATTTTCTTA
-AAGTGGACATTTAAAAAATTCCACATTGGGGCGGAGGAATGTTCTTAGCCCAGGGATTGC
-TATACATAGGTTCATGCATTTACTATGCGTTGGTTCATCTAAGCccaacctcagggtctt
-tgtatttgctgctccctctgcctggatcactgtttccccagtgggtctcttcctaacatt
-ctagtctaggcttaactatttgcccttcaagagatcttccctgggcaccctataaaaatg
-catccttcacataaactctttctccttttccctactttgtttattcatgctgcttttact
-atctggcatcatattctaaatttatttgtttatctgtttgttgactgccttcttgtctta
-gcctattcaggttggtataacaaattgtcatgaactgggtagtatataaacaacagaaat
-ttgggctgggcacagtggctcaagcctgtaatcccagcactttgagaggacaaggcttga
-ggtcacgagtttgagaccagcctggccaacatggtgaaactctatctccactagaataca
-aaaattagccaggtgtagtggtgcacacctggggtcccagctacttgggagggtgaggca
-gttgaatggcttgaacccgggaggtggaggttgcagtgagccaagatcgagccactgcac
-tccagcctgggcaactgagcgagactccatctcaaaaaaaaaaatttaaaaataaattta
-ttttcacagttctggaagctggaaagtctaaatcaggtcatgggtagattagatgcctac
-tgagggcctgctttctggctctgggagacttttagctgtgtctgcatatggtggaatggg
-taaggggctgctctggggcctctttcataagggcactaattccattcatgagggctccac
-tcccatgacgtggttccctcccaaagtccccacatcctaacactatgacatgggaattaa
-gtttcaacatataaatgttgggaagacgcaaacattcagaacatagcactttcccattag
-attgtgaggataaggactatatctaagccattcacttctatatccctgttgcccactata
-tacctagcatacagtaggtgcttaataaatgtttgaaaaatgggtgaatGAAATATTGTA
-CTTTCTAATTcaagcattttctgagcacctactgtgcaccagggcctgtgctatgggctg
-tatatacagaaatacatcagtgagagtcctcagccctAAGGCCATTGGTCTGAAGAAAAA
-AGAGAAATTGCAACAAGTGCCATAGCAAACACAGCTGGGAAATTCACtgatgtagtttgg
-aggtgtgtctctgctcaaatcatatattgaaatgtaatctgcagtgttggaggtagggcc
-tggtgggaggtgattggataatggaggaggatttctTTTTTTATATCTATcaggaatgca
-aaattaatttaataatcgaaaattactataattcacagactaagacaagaaaagccatac
-gattctctcaccagttgcagaaaaagcatatgatagaattaaacatctttttatgatttt
-ttaaaattatactttaaattctgggatacatgtgcagaatgtgtaggtttgttacatagg
-tatacatgtgccatgttggtttgctgcacccatcaacttgtcatttacattaggtatttc
-tcctaatgctatccctcccccagccccccaccccctgacaggccccagtgtgtaatgttc
-ccctccctgtgtccatgtgttctcattgttcaactcccacttatgagtgagaacatgtgg
-tgtttggttttctgtccttgtgatagtttgctgagaatggtggtttccagcttcatccat
-gtccctgcaaaggacttgaactcatccctttttatggctgcatagtattccatggtgtat
-atgtgccacattttctttatccagtctattattgatggacatttgggttggttccaagtc
-tttgctattgtgaatagtgccacactaagcatatgtgtgcatgtgtctttatagtagcat
-gatttataatcctttgggtatatactcagtaatgggattgctgggtcaaatggtatttct
-agttctagatccttgaggatttgccacggtgtcttccacaatggttgaactaatttacac
-ccccaccaacagtgtaaaagcgttcctatttctcatggaggaggatttctaatgaatggt
-ttcacaccatctccttggtactgtccccatgatagggagggagttcttgtaaaagctggt
-catttaaaagtgtgaggcccccaccgcctctttctcttgctcctgcttcaccaggtgatg
-tgcctgttccccctctgccttccaccaggattggaaacttcctgagacctccccagaagc
-tgatgccaccatgtttgctgtgcagcctacagaaccgtgagccaattaaacctcttttct
-ttataaatgacccagtctcaggtatttctttctggcaatgcaagaacagcctaacacaTT
-CACCTCCAGCTACTGCAAGCATTCATGGGGATGAGTGAAAGGAAGGAGAGAGGTGGCTGC
-TGTGTCGAGGGTTTGCTCTACGACAGGATGGTGCACTTGCCACCTCTGGCTCGATCCACA
-CACTAGcccattttacagattaggcattgggaactcagagaggtgaagtgacttgaccaa
-aagcaaactcatggcagaatgaagactgggaccagggaggcctaattccaaacattgtgt
-gttacctcctctaccacaaggcctctctTGCCCAAGAGAAAGAATAAAGTCCAGCTAAAG
-TGAGCTCAAGCAAAGAAGATATAGATATGTAATTATTATCATTGTTATTACTATTTTTTT
-ctcatgtaacagatacatcaaaaagtagaagccttcaggcatggctggatctagggtctc
-aaacactatcactagaactgctccattcttagAGAGGCTCTCAAGTCAAAGTGACAAGAC
-GGCTGCCTGCCATGCCAGCCTCCCCTCCCCTACTCCCAAAAGACCAAGTCCAGAGGGAAA
-AAGAATGCCTCATAGCAGGCCGTTGAGGTTGGCTAATCTGGCACCCATTCCCATCAGCCT
-CTTCCTGCTACAAAGGCTGTGCAGCCAAACGTccacctttctgaccctcctgcagctggg
-tggccacaggacacagttctggtcaatgagacataagctgaagtttgtggtgagggagag
-cttttgctcctctgataacaggagcagttgtggccagagctgccccttcccatgttgcct
-tgatcacagacatgatatttgaagcacagaccatcttgcaaccaggaggaaaggctgaga
-aaaaaaaagtcctcactattttttagccatgacattgttaagttgctggactcctaactt
-cagacttcttcctaagagaaaaataaacttccaatgttcaagccactgcattaaattcct
-tgttacttgtagctgaaagcattcctgactaatacaACTCTCTGTCTCAGGTCCCTATAA
-AAACCCTGGGAAGGCATCATATTGGTTCTAATGGGGTCATGCTGTCATTCTGCAATGGAC
-TGTGGTGGCCAGCAGAGATGGGATGTGCCAATTGACCACTCCAGTGGCCACCCTTACCAC
-ATAGGCTTCGAGTGGGTAGGGTTGTTCTCCAGCACAAAAGTTAGTAGAGTAGGGAAGTGG
-TGGCTACACTCCCTATACCTCTGAATCAGTGGAGGCAATAAATTCCCTGTTCTTGGCTTA
-AAGTTTCTTCCATCGTTTCCAGGAACATGAAGATATTGACTTATTTATCCTCCAGGATTT
-TTATTTGGAATGTGAGGGGAGGATAATTCAGTGAACAGTCCAAATAGGGGATCTTCCTGG
-GAAAAAAGGACAAGTCATAAAAACTGCATTGAATGCCAGTGTGCACAATGTCCTTTCTGT
-GCCCCAAGACAGTCTCCCTgcatgagttcttgagccagacagacctgagttcaaacccgt
-ctccatcatgcaagtgcgtgggcagcctcgccatgtcacctcacctctctgcacctgcgt
-ctcTAGAACCGGGGGTGGAAGGACCCACTTCAAGGACCCAGTCTTCAAGAAAGAGTGGAC
-CAAGTGCCTCCCCCATGGTGGCCCTTTGACCAGCAGCAACACCCAGAGTGCTTTCTCTGT
-GAACCCTTCCCTGATAATCCCAGAGTCCCAGGGAGAAAATCTGCTCCCATCTGAAGCAGG
-AACCATCCAGCAGTGAGTGaacccactgccatttcctcctgccatgtggctaggccatat
-tccacagcctcccttgcagtcaggagtggccacgtgccttagttccaatccactgcactc
-cttcccctttgatgggtttgatgcacacaggtctgaagacctcagcagccacagtggaag
-atggcagagctgcaggacaccaggagcttgggtcctgaaatctttgtgcgctagagctgc
-tcacttaccaggggcacccatgttgggcttttggtgagtaaggaaaaaacctctttggta
-tttggtgcatggtgcctcttgggcttACGAACGTTACCCACATGCACCGCTTGGGGGGCA
-CCTGTAAAAGTCTGCAGGACGGTCAGCCCGGGAGGACATTCCATGTGGGCACCAGCAAAG
-GCAGAGGGTGGGAGGTGAGGAGGCCTGAAGAGCCAACGGCAGCCACACTGTGGTGTTGGA
-ACCAGATTGTCCTTCAGTCCTCCCGCCTTGACTGCCAGAGAGCAGCCCATGATCACCATC
-ACATCAAGCCTGCAGGCAGGGTAAGAGATTAATAACAATACTAACAACAGTaataatagg
-aggctctgccaatattcaagagaacttaccactcaccagctgcgggctggtttcttccta
-ggcctgatctcatttaatcctcaccatggcccagcaatgaaggccctactgatgtcagtc
-ccattttacagacaagaatacagaggcccatgaggcgtcggaggacattctccaaagGGC
-ATGTTCTTGAGCTCAGCTTCCTTCCAGCACAGCCTTTCATCAGGGCTTGGACCTTCATcc
-cattatatgtccagcattattcataggctgaggacacagaagtgaacaaagtagatagaa
-atctggacctcgaggggctgcgactctagtgggagaaaatgggcaataaacacacaaaca
-cgtaaatatacaaaaggagtttggtgaaggatgagtgacatgaagacagcaggtcaggat
-gctgcggtgggtgaagggaggaggtggtgctgtgcatcttgaggttggaggaaacctctc
-tgacatggagctgaaagtgctgcagcaaacgagtgagccacgtgaagatctggggcaggc
-tgttcctggcagagggaacagcaagtgcaaagtgcaagtgctacggccctgaggctggaa
-ggagcttgtcatgttcaggaacagaaaggagagagcagtgtggctggagtggagtgatgg
-ggggtggggagggatgaggctgcagagggagtgggttgggacaagTGGCAAGTTTTGGTG
-GGCAATGGTGGCAGGGGTAGATGATCCTCCAAAAAGACTCATCTGGATGCCAGCTCTGGG
-GGGTGCAAGGAGGGTATTCCAATGAGGAGAGGAGACAGGGGTTTCAGCCCAAATTTGCCT
-CCCCACTCTCCACTTGACTTAAGCTGCTCCCctctcccttcctttctctcattccctctc
-tctttttctctctctcCAAGTGGAAGCTGGATCCCTAGGGAGGATGAGGCCCGGGCTTGA
-GTCCAGGCACCAACAAGAGCGCGTTCCCACCCTCCCGAAGGTCTGATGTGGAGCAGAGGA
-AAAGAATGGTCCTGATATCACcggaaaaagggtcttatcccatatcgcaagagtgggttc
-ttggatctcacatgggaaagaattcagggtgagttgcagagcatagtgaagttaagatag
-gattagagactaatcaatgacagagtagggcatcctcagaaagcaagaggagaacgtacc
-catttcaagtaccagtgcttgcttatataggcagttaagagtagtgtactctgggctcac
-ccctgtaatcccagcatgttgagcggccaaggcgggcggatcacttgaggctaggagttt
-gggaccagcctgaccaacataatgaaaccctgtctctactaaaaatacaaaaaactagct
-gggcatggtggcctgagcctgtggtcttagctacccaggaggctgaggcaggaggatcgc
-tggagccccgaaggtccaggttgcagtgagatggtgccactgcactccagcctgggtgac
-agagtgagactctgtctcaaaaaaaaaaaaaaaaaaaagaagagtagtgtattctgttac
-aaaggcttatgatcagcttgtgacaggctactagtattgctactttcctatgttactatt
-gattttagcaagaatttatgagtgtactattatctttaaagcaaaacctaTTATTTTATT
-TTTATTTATTTATTTATTTATTTtttgagatggagtcttgctccatcacccaggctggag
-tgcagtggcgcgctctcggctcgctgcaagctccacctcccgggttcacgccattctcct
-gcctcagcctcccgagaagctgggactacaggcacctaccaccacacctggctagttttt
-tttgtatttttagtagagacggggtttcaccgtgttagccaggatgttctcgatctcccg
-acctcaccatctgcctgcctcggcctcccaaagtgctggaattacaggtgtgagccaccg
-cgtccggccgaaacctgttcttaaactaagaatttttttttgttcttaagatattgggac
-attttcataagttctgcgtctttaagtaacatcattaactcgttccctcaaccatgaaca
-tcttgtaaccaagcacgtccacgcccctggaaatgtaacccagcaggtttggcttttctg
-cctttattcaatatggagtcagtctggttaggatgcctttgTCCctgagagtcagtgccc
-tcacagcccctgcccggcctctaacttgctgtgtgacctggagctgatcattcgctctgg
-gcttcccttttctcctctgtttgaggagggagctggtctggtgccaccattttccagctg
-tctgtccttaggcaaattattcagcatccctgtacctcagtttcctcatccatgaaatga
-ggatggcccagttccaggcttacggtgaggattaaatgCACAGTGCCTGGTCTCAGTGGC
-TGCTGGGAATTACCATCATTACTGTTGTTTTGCCATTCTATTGCTATTGCCAGTGTTGCT
-ATTAGTATTCAAAATGCAGATTGGTggctgggtgcagtggctcatgcctgtaatctcagc
-actttgggaggcagaggttagaggatcgcccaggggttcaagaccagcctgggcaacacg
-gtgaaacctgatctctacaaaaaaaaaaatacaaaaattagccaggcatggtggcacgta
-cctgtagaccttacctgaactcaggggggttgaggctgtagtgagctgtgatcgtgccac
-tgcactacagcctgggggacagagtgagacgctgtttaaagaggtttattctgagccaaa
-tgtaagtgatcaagacccgtgacacagccctaagagatcctgagaaaatgtgcccaaggt
-ggttgggttatagcttggttttatacattttatgggtacagaagttacaggcagacatta
-atcaatccatgtagggtgtacattggttttgtcgggaaaggcaggaagcttgaaaagtgg
-gcggcttccaggttataggtgaattcaaagattttctgatcagcaattggttgaaagagt
-taagttattatctaaagacctggaatcaataaaaaggaatgtctgggttaagataagggg
-ttttggagaccaaagttcttattatgcaaatgaagtctgcaggtagcagccttcagagag
-aatagagggtaaaggtcccagactctttgttaaatctctcctgcatcaggaaaagacctg
-gaaagggaaaaggattctctacaggatgtagattttctctacaagagacagagttgtagg
-gccatttcaaaaatatgtcaaagaaatatattttggggtaaaatacttcaatttctttca
-ggtcctgctatctgttgtgtgatgctatatgaggaatttggtatcttattgctacaaaga
-gcatgctttgtcagtcttaagctctctctctctttttttttttttttttttttgagacag
-tgtctctctctgttgcccaggctggagtgcagtggcactaccttggctcactgcagcctc
-cgcctcccaggttccagtgatactcctgcctcagcctcctgagtagctgggattacaggc
-gtgtgccacctcgcctggctaatttgtgtatttttagtagagatggggtttcaccatgtt
-ggccaggctggtcttgaactccgaccttaggtgatctgccgccgtcttggccttccaggc
-gtgagccaccacgacctgccaagctctctgttttcatgataatgctggtcaactgtgcct
-gaattccaaagggaggagggtatgaggcatgcctgatccccactttccatcatggcctga
-actagattttcagggtttgttgggtcccgttggccgagagggaggtccattcagtcagtt
-agggggcttgtaattttatttttggtttacaGTTCTGAGGCCCCTTCTGGCTTTCAGACT
-GGCCTGGTTGCTTCCCATCTGGTCACCTCTCTGTCAGTGTTGGGGATCAGCATTCATCTA
-CCCCACGGATGTTCTGCCTGGAGTGGGGGTGGGAAATGGGACTGGACCTCTCGCCATGGG
-ATGCAGCCAGGCCCTCTCTGCTCAAGCCTTCCAGTGCTCCTCACCCAGACACCCTTCTGC
-AGGGACCCCAGTTTTACTCCCCTGAAAAAGAAAGTTTCCATCAGTAGGAGAAGACAGGAC
-CTGAAATTGTCCCTGAGCCTACATGTCTACTAGGGTAGATATTTTGAAAGCCGGAGAGAG
-GAGGAAGCAGACAGGAAGGAGACGAAACCCCAGGACTGTCTGCTAACTCCAGGAGGACTG
-GTCTTCAGAACCCAGGGGCCCTCCGCATTCCTTCTGCCTCCCTATCTCATCGTAGCTCCT
-GCCCCATCCCCCCACCACTTCTCTCCCCTTTCCTAACTGCGTGCCCTTCTCTCCTCCAGT
-CCAGCCCAGCCCTACTGAAGAACAGCAACTTGAGCTGGTCTTTCTGTGCTCCGCTTGATT
-AAAATGTAGAAGGCACCTCTATCCAGAAGACTTGGCTTGGCCCTAATCACTCCCAGCCCC
-CTTGGCTGAGTGGCCACCCGCTGCTGGCTGCTGTCATCCCACATTGGAAGTGACGGAGGA
-GCAGAAGAACGAGTGGGTCACCAGCCGGTCTTCAGGCTCCCGGGCCAGCATTCAGACTGG
-GCAGGAGGTTTGTGGGTGGAAGGTGAGTTGGGCAGCCCGTCAGCCACTCCTCAGGGCTGG
-ACGGAAatagtgattaggagcatggggtttgatgtcagatggcctggggttgcagcctaa
-ctttgttatttactatctgtgagttaagccctctgggtttcagtttctccatttgtaaaa
-tgggactgatattggaagatgtcctacttagaatggcgcctgagccatcgtaagccctca
-gtgaatCCACTGTAAGACTTCAGCCCCCAGACTCCCACTGTTCCCTTGCCCCAGCTTCCC
-TGCACCTCTCCTGCCACTTCCCTCAAAGTTGCTCTCAGTCAGGCCTTGGGAGCCACAATC
-TGGGAACGAGGACCCTGACATCCCTCTTCACAGCTGTACCCAGCACCAAACAAGTCATCA
-GAGGTTCAAAACACGGAGCCCCTACCATGTGCCAGGCACGGCATGGCATGCCTGCTCTCT
-TTCTAATTTTGATACCGCAATGATTAATTCTGTGAAAAAAGTTCTAGAAGGATATAAGGC
-AAAGAATTAGGTTGTGTTCCGTCCATTCACTCACGGCTCTGCTCCCACGCATGGCTGCGc
-tatgcacactgccctgcagcttcctttgtctgctgcacaatgggctctggacggagccct
-gttggcgcaatgagtgagccctacatcaagcttcgtcatcgctgcatcgctttgcaccgt
-gtggctgggccgccatcagtacagccaactgcctctgatggacatctgggctgcagccag
-attcctcctaacagggcttcagggaaagtcctcctcagcgcctctttgtgcgcatggcac
-atttctctaaggcaggtttctggacatgagactgacgggcagcatgtgctccttacattt
-gggggtcctgtcaatcccctcctctcccgcaggctgttctagactccagcccccatgtga
-gaggatgcctgttgcccTCACTCTTCCATCCTGGCAGTCCCCAGCCTCCTTGCCTCTCTT
-GTTTTCTTGTTCCGATCAGTTCCAGGTGGCCAGAGGGTCGAGACTCATCTCACAGCCGTG
-CAATAGATGCGTGTCTCTCAGTCGGTCAGCTCTGGCTGGGATCAGTGTTTATCTTCATGT
-CGGTGGACACCATCACAGGCACCCGCAAGAATCAGCGATCGACGGGGAAGAGGTTTGGGT
-GCATGGAGGagtgctttgcagtgagggctttggagccttgtgccctgattcaaatcctgg
-ctgtgtcccctgccggttgtgtgacttcggataaattacttgatgtctctgagcataagc
-tgggtcatcagaaaagccaagctagtaagagcacgtagctcagaaggctgctgtaaagtt
-cagatgagttgatatatgctcagtgctggaaagggtgctgggcacattagctgttggtat
-tattTGGGCACCTCCAGCCCAAATAATAATAAAGAGACTAGGAGGGATGTTGGGAGATAT
-CAGATGTTGCTCATTGGAGGCTGTACTGAGTGTGCAGAGAGCTTCAGGGAACCTGGAGCT
-TTGAGAGGTAAAGGAACGTGCCAACTGGAACTAGAAACCCACTGCCGCCTGCAGCTCTCT
-GGGCTGTTTCTCCACATGCACCGTGGGGTTGTTCGGGTCCCACTGGGGAGGGTGGCTGGT
-ATGAGGGTGGCCTGGCCTGGATGTGAAGTGGGATTTCCAAGGCTGGCACTCAGTCCAGAG
-CACGAGCCTTGATGAGGAACAGATGCACTCACAGTCTGGGGTCGCCGCCCTCCCCTCCTC
-CACAGCCCAGGGTTGGGGTGGCGATAGCTTCCAGATGGGCTTGGCTCTTAGTGGGGCCTT
-AAATGACTCCCTCTGAGTCCCTGAGAGGTGGGACTTAGGGCCTCTTCCTTGGTTCTCAAC
-CCCCCTGGCCCTGGGGGATACCTGAGGTAGCTGGGTTCAGGCCAGgtgaccttgggaatg
-ccagccctgctccgagcctcagtttccccatctgagaaacaggcattCTCCATCAAGCTG
-GCTTGGCAGAGCCACTGTGTCCTGTGATAGCTAAAGAGAAACATGAAGGAGGACCAGGAA
-CCCCCAGGAAAGTAGGGTTTCTTTGGTTTTATTTTCTTTTTGTATTTACTTTCTGAATGT
-ATAGTACATATCCATAGCATAAAATTTCAAAGGTACAAAAGGGGTCATAGGTAACAGTAA
-GCCTGTCTCCCACCCCTGCCCTCCAGACACCCAGACCCCTCTTCCCCGAGGCAAAAACCC
-TGTCACCAATTTCTTGAGAATCTGCCCAGAGATACGGTATGCACACATAGGAAtttttta
-cccagtgatgacaaacttcacacacagtatttcacactgtccttttgttactttaacaat
-accctttagagatcttcctatgtcactccataaagtgcttcttttttttttttGGATGCT
-TGGCGAAGATGGTTTCAGAATATTACACAACTTTCAACTGACCAATCAGGATGGGCCCGA
-GCAGTGCACAACCCTACAGTAGTATATGGCTGCTAGCTGGATGCCAGCTCTGTGTCTTTA
-TGGTTCACCATTGCATAGATGGGCCAATTGCAGGGAtgggtaatttataaaggaaagagt
-tttaattgactcacagttccttgtaactggggaggcctcaggaaacctacaatcatggca
-gaaggggaagcaggcacatcttacatggcagcaggcgagagagtgtgtgaagaagcaaag
-ggggaagagccccttaaccagtcttcaagagatgagcaggggctgtttccaacattttgc
-tctttaaaggaaggttgcaatacatacccattttgtacatttgtaggagaatatatgtag
-aataactttctagaagtgaaattgcATTTTacatccatatgtttaaaaaaatatcaattt
-ccaccccctgccatatacaagaattaacttgaaatctaccataaatctaaacgtaaaact
-taaaactgtaaaacttccagacagcaacatggaagggaaatctttgtgaccttgagttag
-gcaaagatttttttaggtactacacaaaaagcataaaccgtaaaagaaaaaaagataaat
-ttgacttaatcaaaattcaaaacttctgctcttcaaatgatgctatcaagaaaatgaaaa
-gacaagccacagattaggtgaagatatttgcaaaagtcatatctgataaaagactcatat
-ccagaatatatattgagtgctttcacaactcaataataagaacaaataatccaataacaa
-atgagaaaaaggtttaaaaagacatttcacccaaaaacagatattgatggcaaaaacaca
-catgaaaagatactcaatgttatcagtcatcagggaaacatatattaaaaccacaacggg
-ctaccactacatacctgttagaagactaacatgaaaaataactgataatacctggagagg
-gtatctaacaactggaacttagaaaaacagtttggtaatttcttataaaatgacccagct
-gtcctactcttaggtacaaagagtaatgcaagagaagtttgtgttttaaaaagaaaaact
-gtaggcaaatatttacagcagcttttctcataatcaccaaaaactggaaataacTGCtgt
-atgagtctagtctcacacagctataaagagactactcgagatgggctaatttataaagta
-aagaggtttaattgactcatagttctgcatggctgggggggcatcaagaagcttacaatc
-atggcagaagggggaagcaggggaagcaggcacgtcttacatggcagcaggtgagagagc
-gtgtgaaggaggtgaaggggaaagagtcccttttaaaaccatcagatcttgtgagaactc
-actcactatcttgagaatagcatggaggaaactgcctccatgatccaatcacctcccgcc
-aggttccacccttgacatgtgggaattatggggattacaatttgagatgagatttgggtg
-aggcaggaggatcacttgaacccaggaggcagaggttgcagtgagctgagatcgtgccac
-tactctgcagcctgcagacagagtgagactgtctcaaaagaaaaaaaaaagaGGTaaaca
-ggtaaagaaaataattttagatcatgataagagttaggaagaaaacattttcaaggcact
-aaatagagaatgatttggagggggtacgatatttaaagaaggttatcagggaaagcctct
-ctgaagaggtaacatttgaactgagatgtagagggagagaaggaactagccatgtggaga
-tctgggggaggagcattccaggcagaggggatagcaagtgcatctgaagaggtaacattt
-gaactgagatgtagagggagagaaggaactagccatgtggagatctgggggaggagcatt
-ccaggcagaggggatagcaagtgcaagggccctgaggccagaatgagtttggtgttttta
-atgaaagaaaaaggccagtgggtggggcaaggaggagagggcaggaggtaaggtcagaga
-aggaatggggaaAGTCTAGCTTGCACCAGCCCTGACATGGGACGAGACACCCTCTATGCC
-CTCGGTCCTGGCGGCTCCTGCTTCCTCCTTTGTGTCCACTCAACATGATGGGTGGGCTTG
-GCCATCCGCAGACCCCTCTTGATGCCCCAGTACCTTCCCTGCCCCGCCCGACAGTGAGGT
-CCAGCCTCCTGAACAGCTCCTCTTGCTTGTCATTGGATTAATGGGCAGGAATTGCTTCTG
-CTTTTTCAAAGCCATTGCCCCCTACCACAGTCCCCTAAGATCATGAAGGTGCgagcaatc
-atacttgaactgttggatgatgaatgcatcactgttgatgtggaggaggctccccagtgt
-gaggactcagagcagggtctcggcctctcacagacctggctgtgtgcttggctccacctc
-ctacgacctagggccctgagcctcagttgcctcacctgtaaaatgcggcaaacaagcaag
-caacaagatgctcaacctcagtagtagtcggagaaacaagagctaaatagcagtgaggca
-caccctttacctccattccctggattagcaaatagtagagtcaggaacttccaagtattc
-atgagggtgtgggcgatgggaattccatgttctgctgctgggtgtttggactggtttagt
-acctaagagcctaagaaagagtatatctgatgacccaggcattttcctcttgagtgtata
-ccccagagaaattctcctgcagctccagaagGAGCCCATTCGAGGTCATGGGTCACTGTG
-ATGGTGTTTGAGGATGTGAGCAGTAGGTGAGAATCCATGTAGATGCCAGGAAAAGCAAAC
-TGCAGGGGCCTCTAAAAAATACCAGATAAGGGATgagtgcggtggctcatgcctgaatcc
-cagcactttgggaggctgaggcaggtgcatcatttgaggtcaggaattcaagaccaacct
-ggccaacacgatgagacccaatttctactaaaaatacaaaaattagccaggtgtggtggt
-gcgcacctattatcccagctactgaggaggctgaggcaggagaattgcttgaatctggga
-gactgaggctgctgtgagccaagatcacaccactgcactccagcctgggcgacagagtga
-gactccatctcaaaaaaataataaaaataaataaataaataaatacaagaataaaatgaa
-taaaaaaccagatgaaaaagaaaaccaaaaagtaaaaataaaaaACACCAGGTGCATGAG
-AGAAAAAAAAAATAGAAGACGGGGAAATCTGTAGCACACGACCATTTCTGTGAttttttt
-tttttttttttttttttttttttttttttgcgacagagtctcactttttcgcccaggctg
-cagtgcagtggcgcaatctcggctcactgcaacctccgcctcctgggttcaagcgattct
-cctgcctcagcctccggagtagttgagattacaggcatgcaccaccacgcccagctaatg
-tttgtatttttagtaaaaacggggtttcgccatgttggccaggctgaactcgaactcccg
-acctccggtgatccacccgcctcagcctttcaaagtgctgggatgacaagcgtgagccac
-caggcccggccCATTTCTATGAATGAAAAAAACTCACAAGCTACAGAACATCCCTACACG
-CGTTAAAAGGATTCACACACATTCAAGCCCAGAGAACAGACTCACAGGAGCAGATGCCTG
-GGGGGAGGGGGAGGGGAAAGGGCAGAAGAGCATCAAGAGCGAAATCCAATTCAATCCAAC
-TGTGCAACAGACAGTTTGCAGAATTGATGAGGATGTTTAACCCAGGTCTTGGCACCCTAA
-GTCCAAGTAAAAAAATAAATACGATACAGCAGGTAAAATGGGGGATGATGGAAGGGtggc
-gatagtagtgcctttctcatggggaaccctcgaggctccgatgagcgaaaccatgcagag
-tgctcagccaggtgcctggcacgcagcaagGTGTCCGGTGCACAGCAGGGCCGCCCAGCT
-GTGAGCGGTGCGTGTATTCTCTCCAGCCTTGAATTCAGGCCTGGCTCCTTCTGCTTCCTG
-GTCAGTGCCGCTCTCTTGTGGCCCATACAGTGACAGGACTTAGACTGAATAGAGATCTGC
-CATGGTCCAAGGTATCTGATGGCGCTTCGGAGGAGGGAAGGGAGGGAGTCACATGGGGGA
-GATAGGATCACCAGAGGCAGATGGGATCACAGGAGGGAGATGGGGTCACAGGAGGAAGAG
-TGACTTCCGATTGGGGAAGAGATGGCGGATCAGATAAGGCCTCCTGGAGAAGGAATGTCT
-AGGCTGAAGGACAGATTCGACTGGGGGTCAAGGGGATTGATGAGCAAATGAAAGAATGaa
-tggagttagaatattgagcatgagcattacttagccctactgtgtgccaaggctttacat
-gcctcatatcatttcgtcctctaccacccctgggaaggcgacttattgcttctgtctcct
-ttgcagctgcaaaaagggaggctcagtgggttagcgactcatccaaagtcaagccgccag
-ctgcacatagagctctgatacacacccaggtcgtgtgactTGCTGGGGGACTCTATCTTC
-TCCACTTTGGGGTGGACTGAGGGACCCCAGTGAGCATAGGTACAGACCACCCCTGAGTCT
-GTCTGGACCATGTGTTAGCAGAAGTTTAATACTACACCTGTGCAGCAGGTGGAGATGGGT
-GGGACCTGTGTGGACGAGAGGAAGTGGATCTTGGGACAGCTACAGCATGCAGCGGCTCAC
-CCCAGGGCTGGACCCTCACTCTTTGGCAGGCAGCTGGGGCACCACACCCAGGGGTTAAAT
-GTGGAGACTCACTTCTTAAGCTAAAGGATGTGTCTGTCTTCAAGGCACTCTCCGAAAAAT
-GCCTCATTTTGGAATTTATGTCAAAGCCATTTAAATCCTTATTAAGAGTATTTAAAGATC
-AGTTTTCAAAATGTCTCCTAAGTATTTCATTTTTGTTTTTCTCGACTTGGTAGTATATTC
-CCATGGCTAAAAATTCAAAAGGGACCAAAGATAAAGGTAAGcctcctctctttccatcca
-ctctaacctctccccacccagagccatcactgttactggtttctagagtgttttgtcacc
-tgtaggttttgtgcattcatgaatcgtacacacgtgtattttccctccttcccgtccccc
-cgcgtgggggcttactatgcgcgctgttctgcaacttgcttttttcacttggcaattcgt
-ctcagggactgccccgtcattgtgtcaaatccttcctcgtggtgcttctcggccatgcgg
-tgttgcactgagtgctgtgacattgtatcgcaatgcctgtcctctagatatttaggatgt
-ttccagcattttgtgatcatacacaggactgcagggaacagctgtgtaagcaggtacact
-tgttctgcagcatgtgggccaggctaattgttatttatttatttatttatttttgagaca
-gaatctcactctttcgcctaggcgggagtgcagtggcgctatctcagctcactgcaagct
-ctgcctcccaggttcacgccattctcctgcgtcagccttctgagtagctgggactacagg
-tgcccgccaccgtgcccggctaatttttttgtattttttaataaagacggggtttcacca
-tgttagccaggatggtctcgatctcctgacctcgtgatccgcctgcctcggcctcccaaa
-gtgctgggattacaggcgtgagccactgcgcctggccctgggccaggctaattggaggat
-gaatccctagaggtggattgctgggtcaggggacatgtgcgctgtgatttgaatagatgt
-caactcaccttctgtagaggctgggtcaagtcaccctctcctgaggaaggtaggggaggg
-tggcggcttacccccacccagcccaggccctgtggtttcattttctttttttttcttttt
-tatggctcttagccaatcagataggtggaaaatggtagctctgtgtggctttattgtcat
-ctaatttgagtaagggtgTTTGGAGTTCCTTTTCTGGATGAGGCATTTTTGCCACACGGG
-GACAGCGCTGAGCCGACGACACGGCAGTGCCGCTCTGGACACGCTGATTCTCCCTGAGGC
-TCATCTTCTCAGGCTGAGTGGGACTGTGCCTGTGGATGCCCGCTCATGGAGTAGTCGCCT
-GGTGGAGGGCAAGGGTTTTGAGTTCCCATTCCACtacttactttctgagcctcggattcc
-ccctctgtaaaaagtggaaagaataatagaacccacttcagatggctctgaggaggatga
-atttaagtttttaatgtgaaatgcttggcacagttcctggctcagagttagtgcttagga
-aatgtttgttGAATGAAGAAATGAAAGAGATataatcatcttaaaaattgtattgagtac
-ttattatgaagcctttctcatgtattcacgtattttaacttcacagtgacaccaagaggg
-gtacttttattatccccctttaaagacaagaaaactgggccgggtgcggtggctcacgcc
-tgtaatcccagcactttgggaggccaaggcaggcgatcacgaggtcagattgagaccagt
-ctggctaacacggtgaaaccccgtctctaccaaaaaatagaaaaaattagccgggcgtgg
-tggtgggcacctgtagtcccagctactcgggaggctgaggcaggagaatggcatgaaccc
-gggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgggcgacaga
-gcgagattccgtctcaaaaaaaaaaaaaaaaaaaaaaagaagatgagaaaactgaggcac
-agggagagatacaggatcttgcctaaaggctcatagctggcgtcactggcggcgacggga
-ttcgtgatcttctgtctgctcttacccacctcacttccctgcctcccactCTAGGAGAGA
-GGTGCCACCATAAACCCCAttccagctgtccattgcatgaaacaacctcctcaacctcag
-aggcataaacaaacaaccattttatcatgttcctgggttctgtggatcaggagttcaggc
-aggataaggtggacagcttctctctgctgggccttcgatgggaggactctgtggctggga
-gggttctgcagtggggggtaaggaggggcagcgggtaaaacagcaaggactagaagaccc
-acttgcgagaaggcttcttcagctacaagtctggCTGGAGGATCCATTCCACCTTGTGGA
-TGGTAGGTTGGCTATGGCTATGGGTGAGGGTGGGAGTCATGGGGGGCTGAGTGGGAGCCA
-TCAGACCCCAGGGCTGAGTCCACATGTTCCAGGATCTGACAGCTTAGGAGGCTTAGCAAT
-TCCAGGGCTGGCGCCCCCATGAATAGCTTctccaggattttgcaagtgctgtttcctccc
-cctccccacccatctcattaacacctcgcactctttaattctcagcttggctatctggtc
-ctggaggaggagctccctaacccctgtatgccttagacaggatatgctagatcctgtcct
-catggaaggtcttatcacattgttggaattgactgtctgcagactgaacgcttggaggac
-aaggcagggtctttatcaccagcacccaggacagtaccaggcacacagtaggcactttat
-gcatattcacggaatgaatgaatGGGTGAGACTGATGGATTTTGAATGACTTGAACTTGA
-GCCTCAGTTTTTCCTCCTAGAAGTTAGCTGGCAACGTAGCTGTGAAGGTGGCAGGAGATA
-GGTGGGAAATGCGAGGTTAGTAAGAGGAATTGGTAGAAAAATGGTAGTTATGATTTATGC
-TGAAGAGAGAAAAGCAAAGGaaattagatattgcacctgaaatgcttagctatgtttggt
-gcagaataggtgctccataaatATAAGATGACGTCATCATCCTCATCCTCATCATTACTA
-TTATTTGTATTATAAGAATGCACATTTCCTGAGTTAGAAGGTCCACATACGATGGCTTGA
-AATTTTCCTCTGggctgggtgcggtcgctcacacctgtcatcccagtactttgggagact
-gaggcaggaggatcgcttgagcccaggagttcaagaccagtctgggcaacatagcaagac
-tctttctctacagataattttaaacatagctgggtattgtggtgtgcatctgtagtccca
-gttacttgggaggctgaggtgggaggatcaactgatccctgcaggtcgaggctgcagtga
-gccgggatcatgtcaccgacctccagtctgggcgatagagctattacccatcttaaaaaa
-caaacaaacaaagacagaaaaaaGAAATTTTCTTCCAAGCGAAAATGGAGAGGTGTAATC
-CCCATAGGTCACCTGGGCCAGATGTCTGGGCAGGAGGTCATGCTCTGAGTCAGATTTCCC
-TTCTGTGCAAGGAAGGACCTGGGACAGGGACCTCTGAGTCTGACACTCTCTGCACAGCTG
-AGAAGGCCATTCAGCTGAAGTCCCCATTGCAACTGTTGTCCTTCAGCCTGAGGCAGTCAG
-TCCTTCGGTCTGAGGCAGCCTGTCCCTTGCCCTCGGCTACCCTCCACCCTGCTCCAGTCC
-TGCTAGGAGAGAACCGCAACACGACCCCGTTTCAGAAATGCGCTCCTTGACAAGCCTGGC
-TGCGACCTGTTCCTGGTTGACTGCCGTCATCCGGTGGCAGCATGTGGGAATGACATGCAG
-GGCTGTGGTGAGGATGAGGATGGAGTGAGCGGGTGGGGGGAACTGCAGAGAGGGCCCTAG
-TGTGGCCCAGTTGGAAGCGGTGACAGGAAGAACCCACCAGGGATTCCTCAGCTCTGGCCA
-AGGGGTTGTTCTCTCCCTCTGGCATAGCATCCAGAAGGCCAATAGCAGCGGAACCTCCCC
-CTGGGCTCTGCCCAGACTGCCTCTCTTTGGCTGTGTGACCTCACCCTGTTTCTGAGCTTC
-TCTGTGAACTTCTCCAAGCTTGGCTTGTAAGAAGGGAGTGGGCGATGCCCACCTGACAGC
-AGAGTCTCCTTCCCAGAGAGGCCCCTCAATCCTCCAGAGAATGTGGGAGAGGCTGGGATT
-TGAAAGGATTGGAGCTGGGGGCAGGGAACGTCTGAGATGGAAAGGTTATAGGAGGGGCTT
-AGGCCCTGAAGAAATTTCATCCTGTAATTTGAAAATATTAAAAAACCACCACAGCCCCCA
-GCTGAGGACAGAGGACCAGGCCCCCCAAGAAGAAAGAACATGGCCAGGGAATTGCAGTAC
-TGGAAACTTCTACCCTTATGTTGGTCTTTTAGAATTGTGAAAATTAGAACGTTCAGCATC
-CTAAAACTGGAATCTTAACAGAAAACACTATATAGtgtatgtatgtgtgtgtgtgtgtgt
-gtgtgtatatatatatatatttatatatatatttatttatataGGggctgggtacagtgg
-ctcatgcctgtaatcccagcactttgggaggctgaggtgggaggatcatttgaggccagg
-agttcaaaactagcctgggtaacatattgagacccccatctctacaaaaaataaaaaatt
-agctgggtgtggtggtgtacacctgtagtcccagctacttgggaggctgaggcaagagga
-ttgcttgaggccaggagtttgaggctgcagtgagttgtgatcgtaccactgcactccaac
-ctgggtgacagatcaagaccctgccaaaaaaaaaaaaaaattaaaaaGATacacacacat
-acacacacacatacaGACTAAACTCTGTAGAATCAGATCATTGAGCCTTGAGGTCAGAAT
-CAGAATTGCAGCTGCAAATCTAGACTCAGCCCTCTGAGCTGGAAGTCATCTGAGAGCCAC
-CTCTCCCCTCAGCTTGTCCTGGAAAGAATGTTTGCTCTCACTGCCTGCTCCTAAACTTGT
-TTGCAATGaatagatctgggggagggccccaaaacctgaatttctaaaaggctccccagg
-ggattctgttgtTGGGTCTTCCAGATTTCGGCAATAGATTTAATTTAGCCAGGCTTcctc
-ttcatcacattcatcacatgggaaaactgaggccccggaaggggaagtgacttgacctgg
-accccatcagatagctggtgacaggctggagctcccacctgtgcctcccaatgccaaggc
-cactctcaccagcagcccagggtgtttAGATGGCCCCGTGGGACTGTCAACCTCCTAGGT
-ACCCCTGGTCCCTGAGACATCTGGTTCGTGAAACTGCGAGGTTCTGGGGATCGAGGTGTC
-ACCCTCTTCTGCCTCTGGCTGAGTCTGCTTCTTGAGAGTAGCCTGGAGGGGCTGAGGGCC
-CCTCCTCTTTTATCAGCTCCCCCCAAGCTGAAACCCCACCCCAATCCCCAATACACTCTG
-ACCCCTCTCAGCCCCAAGCATTCCTGTGAAAACCACTCCACATGTTTTAAATTCTGCTAC
-TCCAAACTCAGCAGTATCATGGTTTTGCAACACCCTCTTGATGCTCAAGAAGCATTTACA
-AGTTTCTTTTCCCTTTATTAAGAAAGTTTTAAAAAAAAGTTAGGGTCTTGAAACAATAAC
-AACGGAGCATTTCAGAGGCACAAACGTTTGCAGAAGAGAAGCTGGTGGCCTGGCCAGGCG
-GAGGAGGGGGCTCTAGCTGTTCTCGGGGAGGTGAGAGCAGGGAAGTCAGAGAGAGGGTGG
-GCCTGCTGGGAGGGGGGGGTTCAGGCCAGGGCTCCCCAGCTGCCAGGTGGAGGGCAGGTC
-TGAGGGTGGGTGCTCTCTTGGGGTCGGGAATGTAATATTTCATCACCTAGAGCCTCTCCC
-CCAGCCTGCTGACCATCTTCCTTCCCCAGGCCACCCCTGGGCCCCTTGGAGCTCCGACTC
-TTGCTTCTCCTGCCCATTCCTGTCCCAGTCACGGAGCCCTACGTGTTCAGGCCAACCAGT
-CACGGCAAATACAAATCCCGTTTCTGAGGATTCCGGGGAGCAGAGCAGGAAGGGGGTGTT
-ATGATGGCAGAAGGATAGGCAGTGAGGACAGACTTGCTTCCAAGCTGGGTCTGACCTGGA
-GACTCCTCCCAGCGTCGTTCCTGCCTAGGGCGAGGGGCGTCACAGCGAAGCACAGATGCT
-CAAGTCACtggtggtgggtgtgggcgagtgtggtggtgggtgtgggggagtgtggtggtg
-ggtgtggggcagtgtggtggtgggtgtgggcgagtgcggtgatgggtgtgggcaagtgtg
-ggggtgggtgtcagcgtgtgggggtgggtgtcagcgagtgtggtggtgggtgtggACGAG
-TGCACGGATCTTCCCTTGCTCCCCACCCACAATTCCCTACATTTCCCCCCTCAAGTGACC
-CCCAAATTCTCCTCTCCACCGTGAATGTGCTGAGCAGAGCCATCAGGCAGAAGCAGAGCC
-TGAAGGCTTCctgtgtgaccctgggcaagccccttccttctcagacctgtttccccaCAT
-GGGCAGGAAGCGCTGAGGTGGGGAACAGAGCTGCTGGATAATCTCAGCTTTCCTTTCCGT
-TTCAGTGGCCTCTTCTGGGCTGGGCAGGTGGATCCCCCAGCAGTGACAGCTCACCTGATC
-CGGCTTGGGAAAAAGGGGCATGGAACCCATGAGAGGGAGGCCTGTGGGGGAGTGCCGATG
-AGGGTGGCAGGCAGCTTGCAGAGGATGCCCTCCAGGGCTGGCTGCCCACCCAGAGGCCAG
-GTTGTGACCCTCCACGGCCAGCTGGGGGAGGTGTCCAAGCCAGGCCTCTGGAAGCCCTGG
-AGCCTTGTCCAGCCAGCTCCTCGGGGTGGCTGGTGGCTGAAGGCTGTGGAAATGGCCTCT
-GGGGACTGTCCAGAGAACCAGGTGCTCACAGCTCAGGGTCCTGGAGCCTCCCCCAGAGCA
-GAAGCAGGGCCTTCAGGATTCACCTGTGCTGTGTCCCAGCTTTGCCCTCTGGAAACCCTT
-TCTCTGCAAAGATGGGGTCAGGGAAAGGCCTGGGAAAAGATGTTTGCTTTCTTTAAGTTG
-TAGATAGAGAAAGCTGCAGGGGAGGGCACAGGCTCATGGTCCCTCTTAAAGTGTGTGTga
-gagggagacaagaggagggagagagagaaggatgcggtgaaggacaggaagaaacacagg
-aagaaagaaaaggaaagataaaagataagtgagaaagaagaggaaggaagggaaggaggg
-agggagaaaggAGAGGAGAATGGAGGTggaagaaataaaggaaataaaaaagaaaaagaa
-agggaaggtagactgacagaaaaatgatagaagggtggaaagaaagagaggaCAAATGGA
-GAAGACAgaggagaaagagtaagaggagaggaggagaaggagcaggaggaggTGTGCAGG
-GGCCGAGGACTAGGACCAGAGAGTCGGGAGAGCCGGCGGTCAGGGCTGCAGGCCGGGCTG
-GCGCGGCCTCACGTCCAGCCTGCGGTCCAGCTTCCTGTCCTTGCGTGGGCGCCGGTCCTT
-CCTGCCCTTCTTCTGGCCGGGGCTCCTCTCTGCAATGAGAGGACAGAGCCCGGTGACCAA
-GGCTGCAGGGCCAGTTAGGTCCTGGGAGCCTCCTCAGTCCTGAAAGACAAGGGTGCCCCA
-CCCACTCCCCAACAACGGGGCTCAGAACATTTGGGCACTGACCTTGCAGTCCCTCCTGTT
-GAGAGTTTGGACCGTGGGCTAAGGTACCCCAAACTGAACCTTTCTCTCTAGGTCTTCAGG
-GAGTGGCGAGGGCCACTAACTTGTTCAGGGCCTTCTTGTGCTGGACATCTGGCTCGGCCA
-GGCCTGCAGGTTCACCTGGGGCCCCCCAATCAGCATGTCGGGTGGCCTCATGGGAGTCCC
-CATGGCTTTCCCCGGCACACTCCTTCCATAGCTGAGCAGGCTCTGTGCTGGACGCTGGAC
-ACCTTTCATCTGTGTCCCTGCACCAACTTCTGCATAACACTGTGGCaacaatacttcagc
-atttagcaagcgctcactgtatgcaggccacagccccaagtgctttatgtatacgaaact
-cacaacagccgagagaggcaggtaGGGTCTGAGCCACACCCAGTCCCGTCTTCTCCAATT
-GTCCTCTCTTTCTCTCCACCCTTCTATCATTTTTCTGTGCCAGGCTACCTTTCCTTTCTT
-TTTCTTCTTTATTTCCTTTATTCCTTCCACCTCCACTCTGGCTGTGCCCGCTGCCCAGGG
-AGTTCTTCTGAGCAGTTGCCTGTCATTGTTATGGACAGGTGAGAAGACCACAGCATGGTT
-GGGAGCAAGGCCAGCCCTAAGTTTCTGCTTTACAAAGTGTCTCCACACCCAGGACATTCT
-CCTACATTGCTTGGGCCCCATTCAGTTCCCCGCAAGGAGCTGTGTGTCCATTTGAACACG
-ATGAACCTGAGGCTCCATGAGTCACTTTCTGAAGGTGCGCAGCGAGGCTGTTAGAGACCC
-TCTGAGCCTAGTGGCAAGGGGAGGGCAGTTTTATTCCTTGGGTGTCAACTATGTGCCCGT
-CTCCCCAAGAGTCAGGGCTGTGGCTCCAGTCCTGGCTCCTTCCTCTGCAGAGCAGAGTCA
-AGGAGCTAAGACCAGGCTACCCACCTCTGGGGCTCCCCACGCCCACTCTGAGCTCTTGGG
-GAGCACTGAGGCCAACTCCCACTCTGAGCTGCAGAGCTGACTGTGCAGGCCTCAGGTAGG
-ACAGCATCTGGAGATGGGGTGTGGGTGCTGCCTGAGTGGCCCTGCCGGCTCTGATGTGGG
-GGTGTGGGGGCCAGTGGCTTTGTGTCCCTACCCCTTCCCTAGGCCTGCCTGCCAGCTGCT
-CATGTacccatccagtcacccacccatccctccacctatttacccacctacacactcacc
-cacctattcacccatctactcacccacctCCATACCCAATGacccatccatccacctagg
-cacccacccatcacctatccatccacctgttcacctatctacctacctacccacccacct
-aatcatccacctacctactcatccacccacctaccctcccatctaccctcctatccaccc
-atctacctacccactcacccaccTGTGCATTCAGCCATCCatccactcatccaacaaata
-ttaactggataccgactatgtgccagactgtgttagaggcactagagagacagctgtgaa
-caaggcagataaagcccttgccgtcactggagatcacactccagtaaggaaaacagacgc
-tgaacaagcaaacacgagaatgagaaggctcatttcagaagggtgcaagtgctaccatgt
-gatatgatggaaaatgactccggggagggggactcctgggaagcctctctgaggaggagc
-cactgcagccaagacctgggtgatgcagggagctacagcggggttgttgcgaggattaga
-gtcatgtttcacagcactaagcacagccagcacatggtagatgctttatgaatgtttgca
-gttattgtGATTATTATTATCCAGGGGAAAAGCTTTCCCCTCATGATTCCCCAACAGCCA
-TTCACCCCCAGCTCTTGGAGCCATGAGAGGTGCCATGTGGTAATGAGTGCAGAAGAACTG
-TCTGCCTCCTGTGTGAGTCCTGCTCTGGCTCTGGGGTCTCTTAGGTTCTCTGGTTCCACC
-TCAACCTCACTCTGTCCTCACCTGCCCAACATGACTCCCAAAGGCTCCTATCTCTGCTAG
-CTGCACTCCCAACCCAAATAGCACAAGTCCTTCTGAAAGAGGAGTGTCcctgagttcaaa
-tcctggctccactatgtcccagctgggtgccccgggtggcctggttccaggtccctcatc
-cttcatcatgactttagattcctctttgcaTGACGAGTTACgtttgaattctaggtctac
-agctccctggctttgtgacccttaggtgagtgactcaacctttctgggcctcagtcccct
-catctgtaaaatggggatagtgctaataacacctaccgcatagcatcactgcgaagatta
-catgagttaacgattatagagaattcggcacagtgcccagTCAACACTGCCAATACTACT
-CACCGTTCACATCTTACCAAGCACACCCTGTGGCCTCTCTTCTATGTAAATCAGTGGTCC
-TTCATAgcccccagaaacattttggaaatacgtgtagtggtcttgaatggcacagtgaag
-ggggttcctgtggcattcagtggacggcaatcgggatccagcgtgggacagtcccccgca
-aagacgagctgtccccctgttccatccagttctctcacatcgtgccccaccctcacgtag
-ctgaaaagtctgcttgctgggagctgaattctgtttgactcatgaataccaattggtttc
-gaacacttccattcactgaagattctagggcactgtgagtgtggtgtcaatcagagatca
-attgggttggaccttactaatcattggtcactgttgggaaatcgcatctctgatggcgat
-gTGGCCACGTACTTGGGGCGCTGACCACGGCCGCGGTCCTCACTGGGATTGTACTTCCCT
-AAGTGTCTGTTGGTATGTTGGGCCAAGCGCTTCCATCAAGAAAtttcttttctttctcct
-ctatattacagttaggacactatactgataaaaaaaaattacctttgcaagtaggccaca
-ttctccatgaacttcattaagaatgataaagagggtattcccaaatccttcttattaaaa
-ggggggtgttcagtttgagagggttgggaactcctgGCCAGCTCAATTTTCCTAATGTAT
-TTGGGACTGAACCCAGCAAGGAAGGCCCTCCTTTGAAAGGACACCAGGGAAGGTGATGTG
-TACTCCACATGATAGTATGGCTAATGGTGGCCTTTCAGGCAGTCTCATAGATACTATTTG
-TGGGGCAGTGATCTGAGTCCGCCCTGTCCCTGTGGGCCTTTCCCACCGCAGCCTCGTGTG
-CCTGTCCTGGGGCTCACCTCCTGGGCAGGGCCTCTGGATGGGACATTTCCTTGACTCAGA
-AAGCACCTGGCAGGTGGCTGCCTCCTCATGCCCAGCCCGGCCAGCCTCTCGTACCCGGCT
-CTCCAGGCCCCAAGCCGAGCCGCAGGTCTTTCCATTGTGTGTGCAGGGGCTCCAGCCGCC
-CCAGGGACCCAGTTCACACTCCCCTGTGGGGTGAAAGGAGagacagacagacagacagac
-agGGTCAGCCGGCAGTGAGGGTCCTTCAGATCCAAGGGCAGGGTTTGAGGGGTTCAGTCC
-TCTGAAGACTGAAGACACCACTTCCACCTGCTAGGAGCAGAGTTATTTATAAGAGCCTGG
-AATGAGAGCGAAACGAATGCATGCACAGACTAATATGGGCCTGAAGCCAGAGCGGCCGAC
-TGTCTAGCTTTAAaggaaaggcttcctggaggaggtgatgtatgagttaaagggagagag
-gggagctcgtcaggtgagaagaaggaagcccattccaggcaggtgtgcaaagccttggga
-gcccggcccaccatgtttgggagatggggcagcctgagttgggagtcaagtctcaggaag
-gcggggacaggagaggaggctggaaggttgcctgggaaGCCCTCAGGACCAGGACACAGG
-TTTTAAACTTGATCATGTGTCTTTGATCAACTTTGGAAGGAAGAAAAAGGAGGCCATGGA
-CATAAAAGTTCTTCATAGGGGGTAATAAAAatacatatatacatgtatatatatatatac
-acacacacacacatatatatatacacatatatatacacacacacacatatatatacacat
-atatatacacacacacacacatatatatatacacatatatacacacatacacacacacac
-acacacacacacacatatatatatatatataCTTTGATTATTTTAAAAGTCCATGAGAAG
-TAGGCACAGAATATGggtagctatgaatactcctattttgtagatttggacactgagacc
-tagagcagaggtttgctaagggaacgcagcaagaggctcacacagcagacacagcaagct
-caagacacagtgggacccagaccttgctAGatacacacatttgacaagtaaagactgagc
-acccagtgtatgccaggtgctattctgggtgctgagggagcagcagcagacaagacagcc
-cagggtctgcaggcctcctggaattcaccatctggacaccgccgtgatgagggaagtgca
-ggcaccgtgggagcccagaagcagcatgggttgggttgtaggggaggaaacccctggact
-gggtcttgaagtgggggtgggatggcggggaaggggagcctagccaggctcagggaggga
-cgggaggtgctccaagtgagggcataaccccagcagagtcccCAGGATGATTTGGCCTGG
-AACTGGGCAAGCCGGAGAATAAGCTCAAACTGAGGAGGAAAAAAATGATGGGGGTGGAAA
-GGCTGGCAGATGGGACAGATTGCCCAGGGCCTGGGTGGGCTCCGCCCAAGGGCAGTggga
-gccactgaagggtcctgggaggaaaagaaattgagcagactatcattgtgaaatactccc
-tctgctgttgagtggagactgggctggagggactgagaaccaaggcgggagacgggcagg
-agctgtggccagaaccctggcgataggcagggggtggcaagagggtgggaagagggcggC
-ACAGAGGACAGAAACAAATGGGTGGGGAGAAAGGGATGAGCTGAATGGTGTGGGTTTGGG
-AGCTTCGTGctgcttcattttcaccccaaagttcttcctaccacccaaaatattatgcat
-ttgttctcaggtgtcgcttctgtctctccactgaaatgtcatgtccttgagtgcagaggc
-tttgtctgttttgttctgtaatgtgtctccagcacctaggaaagtgcctggccatagcag
-atgctctagtagatattttcagagtgaataaatGAACAGATTGGATTGAATATAGGGTGA
-GGGAGAGAGAAGAGTCAACAGCGATGTCTGCATCTCGCGCATGCCACCCAGGGATCAGGG
-AGCTGGTTATTGAAACCCAGAGGAAACCCAGAGGGAGCGTTAGGTGGGGGATGGTGGCAG
-TGGGAGTGGAAAGAAGGCACCCAGAGGGCAGTGGAGGTGAGGATCAGCTGCTCAGGGAGG
-CTGGAGACACGGAGTCAGGGGCCATCAGCAGCTGGAATGACCATGAATGTGAGCCCGGAG
-GGAATGCGTGGGCAGAGAGGCACAGTGTAGATGAGAATGCCAAGGAGCAGCCTAGTGCAG
-GAACGGGAGGGCTCACAGGCAGGAGTGTGACAAGGAGCTGTTAGGAAATAATCAGAGCAG
-TAATAACACTGATactgacacgtactgagcatctactgtgtgctggctgctgtactgagc
-actttaaattgtactaattcactttatcctcataacaattcctccccatgaggtaggctc
-tatgttctattgtctttttttttttctaacgtttggagaaaccgaaggacagagagctga
-ggtggtttgcttaagatcactaaagggtaaggtttagagctaggattggaccccaggcct
-gtcctattccaaaatcagtgctcagccaggtgtggtggctcatacctatactcccaatgc
-tttgggaggctgaggtgggaagaccgcttgagcccaggggcagcctgggcaacatagcaa
-gagcctgtctttacaaaaacataaacgcatagccagctgttgtggtacatgcctgtggtc
-ccagttactcgggaggctgaggcgggaggattctctgagcctaggagtttgaggctgcag
-tgagctatgatcatgccactgcactccagctgggcaacagagtgagaccctatctcaaac
-aaaacaagcaaacaagcaaacaaacaaacaaataaacaTCAGCGCTCTTCTTCTGCACTC
-TGCTGATTCCCTTGGCATTAATAACAATGCCAGTGTTGGTTGTAGTAGTAATCATAGTAA
-TGGCGGTTATGTTGGCTCTAGTGTTTTGCAGTTACTATGTGGAGGTACCCAGTGTACCTG
-ACATGGTGGTGCTGGGCCTTCCCTCACCATATGGCATTCTACTGTAATTTCTTCCAGGGC
-CCCTAACATCTCTCACCAAGCCCCCGCTCCAGGGAGAGGGGAGGGGCAGGGGCAGGGCGG
-GGAGGTCCCCACTCACCCTGGCACTCCCGTGTGTTCTGGTGGGCCAAAGTGCCCGGCGGG
-CAGGTGGGCAGACACTTCCCCTTGTACAAGTAAAACTGCCTCTTGCACCGGATGCAGAAG
-TCCTGGCTGAAGCAGCTCTCACAAGTGGCCCCACATTCTGTAATAGAGCCAGGGACACCC
-CAGGTGAGGGAGACTGCCAAGGATGGGGCCCACTGGGTCTGCCCGAGGTGGAAGGCCCTC
-TGGGTAGCTCCAGGCTTGGTAGCATTTGGGTCAGGACTCAGTGTCTCCTTTGAAGCCCAG
-ACTTGGCCAAGGTCAAACTGGGCTGCATGTGAAGAGAACActccctttctcatttgaggg
-gaggctcagagagagcgagtgacttgcttgaagtcacccgcaaaccagggctggagtgag
-gactccctgcttcttttTCACCTCAGAAATAGTGATAATTTGCCCAAAGTTACAGCAAAA
-ATTAGAGCTTGGAATTAGGACTCCTTTTCCTATTTGagctaagaccagagaaggtgagtt
-acatgcctaaggccacaccacaaactagggtagaAGTGAAAGTTGCCTGTTCTATTAGTG
-CTAATTAAGGCTGAGAGCGGACTGACTTGCCTCGGGCTGCGGAGTCAGCCTGGACACAGG
-CAGGTATCTCAGAGTCTGGGCTTAGACATGCACCTACTTCCCCTCTGTCTGTGCTGGGGT
-GAAAGGGTGGGATCTAAGCCCATGGTGTCTAGGAGCCCAGCACTAGCATAGAACAAGGGA
-GAAGCCACGTACTTTTGCACCTGTTGACCTCCTGGCCGCGGATGCCGAAGTACCCAGGGG
-GACAGTCGTGCAGGCACTTGCCGTACTGGCGGATGCCTTCCCGGCGGATGAACAGGAAGA
-GCCTCTGCTGGCAGGTGGAACAGCCGTTCTCCTCTGAGCAGATGATACAGCCTGTGCAGT
-TGCCCCCCAGGCCAGTGCCCACTGCCCACAAGACCAGGGCAGAAGGAGGGGGAAAGGGAG
-AGAGAGATGGTCAAACCATATATGCGAGCAGCTGAGATGGTCTCATTGGGATAGtaactg
-ggcacatggccacccaaacaaaagactacatttcccaccttcccttacaactagatatgg
-tcatgtgaccaacatctggccaatcagatgtaaggtaaagcagcatgtgacacttcaaga
-aagctgccttaaagggcaggggtgtgccccttgtcgtcccctcatcctttctgttgggtg
-gaatgtgaacgatggctggagcacaagcagccatttcagatcatgaggtggaaactatgt
-cccgtgaggcggtggaaaaatcagataaaaagcacctgggtgcctgaggaaggcagaact
-gctgtaccagctctagcctgcctgtgtagactgttacatgagagagaaatcaacatctat
-cttgcttaaatcactgttatttgaagttttccatcactcacaagcaaacttaatctttac
-CAAAGTAATGTGAATTTTTGAGTGTGTGTGGGTGCACATGATGAGTGGGGTGGGGTGAGA
-CCCTCACCCTCCTGCTGGGTTCCTGAACAATACTCAGCAATACTCCATTTCTCACTGTCA
-CCATCAGCAAGGGCTCCCACCATCATCAGGAATAGCAATGGGAGAAATTTTTTTAAGGAG
-AAAATTTTTTGTTACCCCAGAATTGGCACCCAGGAGCCAAAGCTGGGGAAAAAAGAGGTG
-GAAAATGCTCTAGAATCTTAAGTGAGCCTCTCCCAGGCTCATAAGGAGTCTCTGTTACCC
-TGACCATCACCCCAGGACCCTGATTAAGCTGAACACTTGCAGGGAGGGACTCATGGGAGT
-TAGGGATTGTCAGCCTggccaggcacagtggctcatgcctgtcatcccagcattttggga
-ggccaagatgggagaattgcttgagtccaggagtttgagaccagcctggacaatatggcg
-aggccctgtctctacaaaaaatacaaaaattagccgggtatggtggcacacacctgtagt
-cccagctacttgggaggctaaggtgggaggatcgcctgagcggggaaggctgcagtgagc
-tgtgtttgtgccactgtactccagtcggagagacagagtgaagccatgtttccaataaag
-aagaaaataaaaagaaGTGGACAGCCTAGGGAAGTGAGTTGTGGTGCTGTGACTTTTCCT
-CTGTTCCCAACCCTGCCAACGAAGTGAGGAGATGCCAGAGAAACTCACAAAGACAGGGGG
-TGCCTGCAAGAAGGTGCCAGCATCTCATGCCCTGCTTGGACATAAACTCATGTCCATAGC
-CCTGCGAATCTGCCCCCTTCCCATTCCTCTTTGAACAGAGAAAGGAGACCAGGAGACAGA
-AGGGCAGAGCTGAGGGGAAGAGTGTGATAGAAGAGCCTGCACATCCTTCCCGGCACGTGT
-GAGGGAGTTCTCAGTGGTAAGGGGCACCTTGGGAGCAGCCAGGCTTAGGTGGTATTCCTG
-CTGCCTGGCACAAGAAGGCTGGTTGCTGGGAGGTGCCCCAGCAGTAAGAGGCAGCAGGGG
-AGACCACTGGGAGTAGGAGGTGGGGGAGAGTCAGAAAATGACCAGGTGTCACTAAGTGAC
-AGGAAAGGATAGGGCAGCTTTTGAGAGGCAGCAATTGGGGAAACAGTAAATGGTTTCATG
-TTTATATGTCATTAGGGTCAGACTGGTTAATAATCCGGTTATACACCTTGATTCACCTGA
-GCCCCAAGACCACCCGGCAGGAAACATTCTTGGCTCTCCAGCTCTCAGATGCTCCCCTCT
-TCCTATTGGTGCCCCATCTCCCTTTTAGAGGAATTCCCCATTGTGCAAGGTCCTGATGAA
-ACACATCCTGGCACCTTCCCCCTGGAACAGAAACCAAAAGAGTTCTGGCCCTCCTTTAAG
-TTGGCAGCAGGTGAGAGCTAACGAAAGCCCGGTCAGATACACATTCTGGTGACTCCAGTC
-CTGGGAGTGGGACACAAGAGTGAGGGTCACACAGAAATGGGGTTCATGGTGGAGGCAGGG
-CAGGCTCTCTGCCCAGCCCTGGCTGAGGcctttctctctcccttccatccctcagtccct
-ctgttccttcctccctGCTCCAGCTCTCGGATGAGTACTGCTACTTCCCCAGTCCTCACC
-TTCTGTTCCTTAGATTCGGTGAGGCCCCACATCCTGCTGATAACCCTCTTTCTGTTGCTT
-ATAACTCAGGAGGCTTACTGATCCAGGGTCGTACGGAAGCACACAGTAACTAAAGTGTAC
-CCTGGGATGCTGTTCCCAAGCAAAGTTGGCATTGCCCTCAATTTTCTTGCCCTGGGATAA
-GAAACTGCAACAGGAGAGCAGAATAAAGATTTTTGTGCCTCTGGAGCTGTATACCTGGCA
-GGGATCTGAGGGCAGAGAGCAAGTGTGATGTTGTAAGGGAGATTCCCAGAGCCAGAGAAA
-TAAGAACATCCACTGAGAATTTAGCAGAGTCCGGACTTCTCACTCAgcaaaagattcaga
-ttctgatactacccagagctggcaagaatgagaggaaaccttcgctttttcaccttagat
-aggagtgtaaacttcggggaaaaatctagcagtacctaataaatttggagatGTCTCTTT
-TCTTTTTGTGTTAAAAAGtttttttgtttgttttgttttgttaagacaggatcttgctct
-gtcacccaggctccagtgcagtggcatgatcctaagctcactgcagcctcaaattcctgg
-gctcaagcaatcctcctgcctcagcctcctaagtagctgggactacaggcatgtcccacc
-acaccaagataattttttaaaaacttttgtacagatggtctctctctgtttcccaggctg
-gtcttgaactctggcctcaagtgatcttcctgcctcagggtcccaaagtgttgggattat
-aggcatgagccaccacgactggccTGATGTCTCTTCTAAATGTAACAATTTAGCTTCTGG
-TATATACCCTAGAGcggcagttctcaaactctggcgcacaacagcagctcctagagagct
-tgttagaatataggtccctgggttccacccctggtacgtctgattcagtaggtctgagaa
-tttgtatttctaacaggttcccaggtgatgctgatgctgctggtccagggaccatgctct
-cagaaacactgAcctagagaaacccttgtatatgtgtagaaagagacaaagatatttatt
-gcagcattatttaatagcaaacaactgcaaaaagctaaccctctgccaaaggaatagata
-aatacattgtggtatattcatacaccacagccagataccacatacacaacccagccatga
-taaatgactgaggtagctacagttatcattgtgggcacagctcaaagacggggctgagag
-gaaaaaagcaaggtgcacgatgaatcatatagtaagagccatttatataaagttcaagga
-cctgcaaagcaatattttgtAGCATTTGTGACTTGTAAATATGCATTCAGAGCAGAAGAC
-ATGGGACTAACCAACACTGAATTCAGGATCATGGCACACAAATGtttattatattatttt
-aaattCTTGACTGTAGGTTTGAAATAGTTCACCCTAAAAATGCATAAAGAACAAAAGAAT
-TTAGCCTCTACTGTGTCCTGGGGCAGGAGGAGGCCTACATTCTTTCTTCTCCTTCTCCAC
-TAGCTCCCCTCCCAAGCCCTGTCCCATCCTCAAGCTGAGGTCTTGAGCAGGGGAAGGTGA
-CAAATTCTGAAGACGTGGGACCCGGGTTCCAAGAGCAGTGGAGACTCGTGCCTCTGCACA
-CTttgcccctcgtccactctcccctcatcctcagtagtggaatcctgatttttattttat
-tttttgaggcaaggtcttgctctgccccccaggctgaagtgcagtggcacgaccttggct
-cactgcagcctagacttcccgggctcaagcaatcctccctcctcagcctccctagtagct
-aggactacaggcgtgcaccaccatgcccagctaatctgtgtatttttttgtagagaaatg
-gtttcaccatgtttcccaggccggtctaaaactcctgggctcaagcaatcctcctgtctc
-agactcccaaagtgctgggattacaggcctgagccacagcgcccggctggaaccctgata
-ttaagcggagtttatgtcctctaagactatatttcccaggccctttgcagctatatgtgg
-tcatgtgcttatgccctgaccaatgggatatgagcgggcatgccctgtacagcCCCTTAG
-GAAACGCTGGCACTGTTCTCCTCCCATTTTCCCTTATGCCTGCAGGAGTGCAGGCTTAAG
-AGTGGAGCCATGGCAGATCCAGGAGGCAGAGGGATCTTATAGAAAgacagcttggcgtgg
-ctgtattaacccagggctgcccaccgccgagattctttcctggggaagggaggaaagcat
-tgcccatcttgtttaggtcactgGGCCTTTCTGACGCACACATTGACTGATGATGTCGGG
-TTTTCCGCCATGCAAGGCAGCACAGAGTCATATCAGTGGAGACCAAGTTGCCCTGCGCTG
-TGCCTTGGCGCTGTGTAAGCCCACTGGGCCTGAGAGGCGACCCCACTACCAAAGAGCAAG
-GGGACCCTCAGTTGACTTGTGGTGATCTTTATCACCTGGCAGAATAGGACTTCAAATTAC
-AAATTAATTTAAATTACAGAAAAACAAAGTAGCATTTCCTGAAaaacgaatctgtggaca
-cagactcacaccctgacatggcgttgctgcccattttgcagctgagaaaaaccgagaatc
-aaggaggtgaaacgacatgtccagggtcacacagaattggcaggggtggacccacatcac
-tctgccccacgctgccctctTAGAGCATCTGTCCAGGGCCTCCTGTGTCAGGCAGAGCCT
-GGGGCCATGGGGGTGAGCCACGCATGGCCCCTACCCCTATAGGACAAACAGCCTGGTGGG
-AGGAATTGAAGCCCACAGAAGTGACAGCAAAGCAGGATGAGATAAGGGGTCAAGATGGAG
-ACAAAGCAAAGCTCTTACCACTCTtagaagagcttagaggtcactcagcacaactcctgc
-agtttcactggggacactgaggccagaaggggtggagctttccccaaagtcaggcagcca
-actGCAAAGAAGCCTCAGTCCTCAGTTAGAGTTATAGCACTAtttgttttttgtttgttt
-tattgtttgtttgtttgtttgtttgtttgtttttgagatggagcctcactctgttgccca
-gactggagtgtagtggtgcgatctcagctcactgcaaactccgtctcccaggttcaaacg
-attctcgtgcctcagtctcccgagcagctgggattacaggcacccccaccaagcctagct
-aaatttttttgtatttttagtagagacggggtttcgccatgttggccaggctggtctcga
-cctcctgacctcaAAAAGCTACAGTATATGCTGAAGGCCAAAGAACCCAACAAGCCCCTC
-CCAGGCCTCATAGAGTGCTGGCCCACTGGATGGTGCTTAGCATCCTTCAATACCCTGGTC
-TTTGAAGGTCAATACCCTGGTCTTTGAAGGGTAGTGGCTGTTTCTGGCCTCATCCTCGAC
-CCTGGCAGTTGGCTAGGATGCCCTCTTGTGCCTCTATGTTGTAATGGCACCTCTTGCTTT
-TTGACTTCCGGTAGCCTGTCTGGTGTTTCGTCATGTCTCTGTAACTCATTAGAAAAAGCA
-GTGCTACTGCCTCTCTCTACCCCCTGCCCTAAAGTCACGGGTGCAGGCGCTTGAATGTTC
-ATTCTGTGAATCATCAGTGATGACAAGAGTCTGTAGAGTGCTGCTCTAGAAAGATCCAAA
-CTTGAAGGTTCTTAAACTTGACTGTGATAACAATCTCCAGAGAGGCTTGTAAAGCGTCTG
-CTGTGGGCCAGGAATGTGCACTTTAACAAGTCCAAAATAAATGTAACAGAATTTTGGAAG
-TGTCTTCCCTGTTCACAGTTTCCTTTCCCTGAGAACTGGCCCCAGTAATCCTGTTTGTAG
-GGCATGACTCTGACCCTAACCAATGGCTGTCTCTTCCAGGATGGGCCAATTAGACCATCT
-CTCTCTGGGCTGATGGACAATGGTCTGCGCTGGCCTTGACCTAAGGCGATCTGCAGGTGG
-GAGGGTAGCCTGTTCCAATGCACATGTGTGAGAAGCCTTGGTGGGCACTAGCTAACAGAG
-GCTCTGCTCCTCTGcactctctggcattgaggttcgtgtgctgccatatccacccagatg
-cacttaacctgggcttggccaatcagagcatcaggtccccttgactacagtggttgtagg
-ttcagacacaggctcacatccccacaagagctagtcttggggtttttgctgaggtcaatg
-gatgtgtgtggagatgtgtgtgttttcctttcctctctttggatctaggaggatatagat
-cagagctggtgggtgccacatgagggaagagcctctggagaatggaggccatacagcaga
-aacagagccaagagacacagacaaagaccaaaaagagtcatctgtgcatgtggatccacc
-ctggggatccataaattctctttttttctcaggtcacattgagttaggttttctgtcact
-tgcaaccagatgattcccgactaatacaGAAGTAGAGAGAGAAAAATAAATCAGATGCAG
-AGAGAGAAGCAGCAACCAGAACCTCACGGGCTCCTTGAGACAGAAAAAATTTCTGACTGC
-CTCCCAGTCCTTCCCAAAGCTTGGCTTGTCCCATAGCTCCAAATCCAGTGACTTTTTCAC
-TTGAGCTGGTTTTCTTCTGTCAAATTACAATAAAAATGGATGTAGCTCACTAGACAGCGA
-ACAGATCACGGTGGAGCAGCGCTGCTTTGGCGCGGATGAGGAACCTGGAGCACCACCTAT
-CCAACCTGATCACCCTGGTGCTCCAGGGGACACTGAGGTTCCAGGGAGCACACTTTGAAA
-CCCCCTGGGTCCTTCTACACATCTTGGCCTCTGTCGCTGTCCTCTCCCAGCTGAGATGCA
-CATTTTAAAAGCATTCAAGCTCTAGTTGCAACCTCCCCAAGTTTTCTTGGGCCATCACAG
-TGGATGGCAGGCACCCCATGTAACTTCCATTAACAACTGTCTCCCATAATCAAGACCATC
-CTCCCTCAGTCAAAACACCAGTAGGCCACAAAAGCATGGCCCTGTGTTGCTCCAGCAGCT
-GGAGAGGCTTAGAATGAAATCTGAGTCACTCCATGTTTCCCCAAGCACCCGAGGGATGAG
-TCCAGATTTGGATGTCCATTTTATGGAGAATGAGAGTGGAATCAAACACACCAGATTTGA
-CAGTTTGCAAAGTGATAAAGGCTTATGACAACTCTGAATGCGTGCATTAACCCAGGGTTG
-AGTGATCCATTCATTCATTCATCGACCcattcattcaacaattactgagcccctattctg
-ggtaaggtccagtgctaggACTCAATGGTTATGAGCTTTGGGGCagttgtgtgaccttgg
-gcaaggtactttacctctacaagcctcagtttttccagctgtaaatggggataataatgc
-ttatcttgcagggctgttgtgattaaaggagatggtacgtgaaaaactgttagctcagac
-cacctgcagcaggcatctgataaactgaagctaccattattATATTGAGAATGATGTGTT
-TTCTGCCCTCAAGGGACTTAAAAATCTAAAGACGTGTAACAATGCAGGTTcccaggttga
-tatcctggccccatcactcattgaatgagatccctcgtctctgtgggcctcagtttcccc
-atctgaaaaattgtggcagcaattcctacctccacgtgatttgttatgagggatgtgcaa
-accagcaagcactggcacacagtaggtgctcCTCTGTAAACCTAGGTTCCCTCCCTGTTC
-CCTCACCATCATGACACACAGTGGGACTGTCAACCAACATCTGGACCCTTGTCCTCTTTC
-CCAGGTGAGCAAACAAAAGCCAGAGATGTTGGTGAGGCTGGAAGGAGGCCAGCAGGGTCC
-AGGGACATGGTCTTTTGCCCTCTGGATGGTGAAGTGCTCAGGGCAGAGATACTAGCCAGC
-AGCTTTGGTCCTAGGTGAAGGGCAGGCTTATTCCTTCTTTTGGGAATAGGGAATAACCTG
-TGCCCTTCAAATAAGGGTCCCTAAGCTCAGGTTCACCCACATCCTGAGAACTGCCCCAAG
-CACCTTGTTTCAACAGGAGTCAACGGCTCAACATGTGCAAGTGATCGCTGTATTTTTTTT
-TTCCATTTCAGGGTTTTGAGTGAACTTAGGGTCATCTCTGCCATATCATGCCTTCCATCT
-GCCTTCACTCTGCAGAACTTCCCTGAGGGGTCAAAAATGCAGGGTGACATCTGGGACGCT
-GAAAATGTCATGTTCTCCTAGGCAAGCTCGTCTCCTCAGTAGCCCAGTGAATCTGTCATT
-GAAATTTCCTTAATACCCAAGCCAGAAAGCCTAGCCCCATACATTTTTTTTAAAAAAAAC
-AAGACTAAtttggatagatttctagcatttaaaaaatcaagagatttcacattaaaaagc
-tggaatttgaacttctctggaaaaagtcagaacatctaccaacactgggtctgctgtcac
-agggcagtgagtggttagagttacataaataaggcatatgttccccaggttactgcagac
-cctaccCCTCCCTATTGTATTTCAGATACTGAGGGAAAAGGTCAGCTGCCCTATGTTATC
-ATCCTTGAGCTACATCTTAACACCCACTTCACTCACTCACAATAGAAAACAATGTAGAGc
-aggggttctcaaacttgggcatgcatcagattcacctagagagcctgttaaaaacacagg
-ctgctgggccttaccctagagttgctgattcattaggtctgggcagggcctgagaatccg
-cattgctaacaggttcccaggtgatgctgacctttgctggtcctgggcccacactttgag
-aactactAGTGTGGAACAGGGTTAAgagccagactggttggattgaaatttcagctctgc
-cccttacctttgccatgtgaccttgacccagtgccttaacctcactgtgcttcagttttc
-tcatctgtaaaacaagaatcctcctggctgacctcacaggtgtgctgtggggGCCTGGCA
-GGGCTGACAGTCAAGCGGGTCTCCATGACATCACTGTTACTACCATTATTATCACCACCT
-GCCCTGCCTGTGTTGGCATTTGTGATCCTGGAACTGCTTTGACAATCAGTGCAGAGTTTT
-TGGTTTTGATGCCAACATTTTTGGGGGTAGAGTTTCTTCATAATTGGGGTGTGCCCTGGG
-AAGTGTGTCTTGCATGAGAACATCATGTCATGGTGAACTAAGGATTTAATACAGCTGTCC
-TGGAGGACTCCCCAGGGCTAAGAAGGATGGGGAAAGAGAGAAAGACACCACTGCCCCTGC
-TGAGGTCCCTGCTCTGTCCTTGGGGAGGACCCAGAACCATGCAGGAGGGCCCTACACAGA
-CAGTGCTGGGCAGCGCATCCTCCGATGCCCGCCTGGCAGTGCAGGACGCATGTCACCGAT
-GACCAAGGGAAATAAAAAACATCTGGGCACCCGCCTGCCCACTCAGGCCTCCACATATGG
-GAGGCAGTCGCCACTGCTGGAGGCTTGCTCAGAAGATCCCCCAGCACATTTCTGCCTAGG
-GGTAGATTGCACCATCTCTAGCAAGGGGGTGGGCCCTGGAGATGACTCCCAGCTTAGAGA
-CTCCCTGGGATCAGGGCTAGAGGTCGCTAGCCCACTGGACCCTTCTCAGCACTCAGGAGG
-TGGGGGGACCAGCAGGGCAGAACATTCAGCAGAATGTTGaggttgccttggctttggggc
-ctgacaaaccaccacttcctagctgggtgatattgggcaagtggctttactgttctgagc
-cttggtcttctcttctgtaaaatggggacgatagtagcaaccacctcccaggcagttgtg
-gggatgccatgaactcatctgcgcaaagtgcttagcacagctcacggcagatgaatgagc
-actccattactacttgattCATGAGAGATGCTCCTTTGAGGGCTGGGCCCAGCTTGGCTT
-GCTCACCTTTAAATCCCCACGGCCCTGCACATTGTAGGTGCCCACTGACTACCCATTTGT
-GATTATACCCATTATGCCCATTCATTATTTCTTAAATGAATGCATGAACGGTGGCTCAAT
-AAAGGTTCTCAAAAACTGCTCTCAGGGGGCTCACAGCCTATTTGGGAGGACCAGGCCCAT
-ACGAATGTGGAGAAAGCTGATGACCTCTGCCCAGCAGGGCTCAGAGACAAGTGAAGGACC
-CAGGCAAGGTGGGAGTGAAAGTCCAGAGACTGGAGACATCAGGGGTGGTTTTCTAGGGAG
-GCAGATGTGGGGACAGAAGCTGAGGCCAGGAGCAGGACTAGTTTGTGTAGATGGAAGAAA
-GGTTTCTAAGAGAGGTGAGTACAAGATGATATTGTACTCATTTGGTAGAAAGGGAGGGGC
-TTGAGCAAGGAGCAGATGGCAAATCCCCGCTAAGGTGCCAATACAGGACACCTAAGGGGC
-TAATGGATAAGACCCTCAAAATACAGTAAGAATAGGCacacatccaaaatggaaactttt
-catcctttgccctccaaacctgcttctcctgtccatttcagtcaatggctactccactca
-gggccaaagacttcagcggcatccttgtctcttctctctccctcatatcctactattggc
-ccatcaggaatccggtcagttccacttctgaaatatgtctgggaataatttctccacctt
-tcctgtccctaccccgttccctgctcctgccctgtttccccaccactcaccttccctggc
-catgctggcctcatcctccatgttccccatctgccaagaccactcccaccacaggacctt
-tgcacttgctcttccttttgtctggaatgcccttcccacattcacccgcaaggctccctc
-cctcaaatgtctccttgtggggacaagagtgattccttcttagatactaatttgccacgt
-caactcctgactaaccctgagtccagtaatgcctccaagatgtctagctgaagcattact
-ctctacgtagaaacacttatttgctgcgggtttcacttttcctccaaaacaaaccttgat
-gctgctgcaggaagcataggctatgacacccatagcacaatgtcagtcacctgtgcactc
-ctcccagagcacgcagacctttctccccaagatatgtaagccctgggtctggagagttac
-agcttggagatctacctatcttgaggctgcccaaatcttgctctgttcaaaagttcccca
-actaataaccctttaccaacaaattggaattggctgcctcattctttggtttcccagctc
-cttctgcatttggggtcgctttatgtatacggccctttcacagaacaccccttccctgtg
-atgcccccagacctcttgcctgcagcagcaccacacctacaccctattcctctcccacgt
-cgctatgttcttcatgccatttattcccacctgataggttctaaatttggcaagtgctgt
-tgtctctttcccaccagtgaaagatgagttccaggaaggcagggaTGAGCCACGGCACAC
-TGGACCTTCTCACTTATGCAGCACCTGCCTTCTCACTTAACCAATTCTTTGTTTTATAGC
-TGCTTACCATTCCGCATAGaggggctgcaaaactcatttaggtgctattatcacacccat
-ttcagaaaggaggaaactgaggttcagagcaatgatgctgcttgcccgaggtcacttaat
-aagtggagcagatattcaaacccaggcagtgtgactctgaacctgagggttatcctcagg
-ttgccacactgcAGCCTGGCTACTCAACATATCCCTGTGCGCCTCCTCAGTCCTCCATGC
-AGAGTCCCTTACCTACTGACGCCTTGCTAAGTTCCCAGTGCTGTGCTGAGGCCTTCTTCG
-GTGTCCGCTTGACCTCACCTGAGACAGGAAATTGGCCAAATGGTGGCAGTGCAGGCTGCC
-CCAGGACTGAACATGCCCCCTCTGCATTCCTCATCCATCCTCCCCTCACCCCCAGTAGAG
-AGTGAGCAGATCAATAGGTGTGTGTTCAATCAAGGGGTGAAATGCCCACTCCGTCTCTCA
-AATTCTCCAGGAGTGAGTCTCCTGCCTCGCAGCTGGGACTTGGGGAGGATGAAGAAAAAT
-TACCTGCTAAGTTGCAGCCTCTGCTGGACATTCTGGCCAGAATCCTTTTTAGACGTTGAC
-CTATATGGGCTGGTTGCAGGGGTGGAGAGGGTGGTGGTAAAACCGGGGTTCAAACTCACA
-TTTGTTGATTTCATGGCcagtggtgatctcagatttcaatccccatcagaatcacctgag
-gctgcttattaaaaACAAGAGGTGCTGTCGCCTCTCGACACATGCGGTTGTTTTAACGTT
-TATGGTGTGCCCAGGGTTGTACGTGCATGAACTCAGAGATCTTCAAAAACTGTCCTGTGA
-GATCAGCCAGGgcttcccaaactgtaatatgcacacaaagggatttaactcagggatctt
-gggttaaaatgtagattttgatgctaaagttctggaatggggccagaggtgctgGCCCGA
-GAACTCACTTTAAGAAGCGAGGCGGgagatgctgttatcattcctcattttacggttcag
-gaagtgaaggctcaaagaccaacaattataggtggtggcattagatttaaacccacagct
-gatgaaaccccagactcattctactgtgtcacactgccTTACCCTGTTGGTCTGATGATG
-AACGTGGAGCGGGAAAATGGGAGTGATACTCAAAAGGGGCAACCTggccaggcacagtgg
-ctcacgcctgtaatcccagcacttagggaggctgaggcaggtagatcataggaggcccgg
-agttcgagaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaatc
-agctgggcgtggtggtgcacacctgtaatcccagctactcaggtggctgaggcatgagaa
-acgcttgaatccaggatgcggaggttgcatgagccaagattgcaccactgcactccagcc
-tgggcgacagagtgagacgctgtctcaaaaaagataagatataaaataaaataaaataaa
-aataaaataTCAAATGGGCAACCTGACTCCTTTCGCCACTCATAGGAGGGGCATTTCCCC
-AAGCAGCCTGAGTTGGGGACAGTCCCTGCCAGGCCCAGCATGGCAGAAAAAGGAAGGGCT
-GGGTTCATGTGTGCCCGACATGTGTGTGTTTGGGGGACAGGGGCAGGTATGTGCCGACAC
-ACGAGACCCCTGTCTAAAGGATCTGCCTGTCCCCACATTAAAGCATAGAGAAGGCCTGAG
-CCCCTGCCCTATGCTGGTCCTGCAGGGCTCGGCTGGGGCCCAAATCAGGGGTTGACACAG
-TGAGAACAGGCTGCTGGTGCCTGGCATCCCCCACTTCCCACCCCACATCAACCAAATCTC
-TGCTTCCCCATTCTCCTGGACCTGCCCTGGACCACATCTATTCTGCCCTCCATTAGCTAC
-TCATTAAGAGAAGTTACATTTGTGTTTCTGGTGGGAGCCCTGGGGGTGCTGAGCAGCCCA
-GAGCAACCACTGGTGACCTTCAGAAAAATCATATTAAAGAAAAAAGGGTTGTTTTTGGAT
-TCCTCATCATTCGGCAAGCTGTGCTGGGGGTAGAGCAGCCAGATGAGTTCGGGACCGGGG
-CAGAGAGTCTACCCTCCAGCTGGCTTCTCCAGACCCACCTGCCCAGAGCTAGTGCCCTGT
-TAGCCAGGAACACAGAACTGTCACAAAGCTGTCCTGAGCATGAAACTGTTACCAACCAAT
-CTGTCCGTGGAGTTGTTACAAAACTGTCTTGTGTGTGAAGGTGTCACAATGTTGTCAAGT
-ATGTGACCTTGTATAAGAAATTGTCATGCAATTGTCCTATAGGTAAAACTGCCATGAAGT
-TGTCAAGCATATGCAGTTGCCACTCATTTGAAAAACTACTGGAGAAGAGTTTCTTTTCTT
-TTCATGTATGAGGGACAGGTTTGCTGTGTGGGTGACTTTGAAAAAGTTGCTGACAGGCAC
-TGTGCTTGGCTGCTGCTCCTGTAATAacagcgcccggcacccagtaggtgctcagtgagt
-acttgccgaatgTCTCCTCAGGGCTGCAAAGTAGACTCAGACAGGTTCTGGTTCTTTCAG
-GTGCTGGCTTTGTCCCGTAGTGGGCTGGTCTGATGTGACCTCGGGTAGGTCTGTTGCCTC
-TCGCATCCTCTCTGAGCCTACTTTGGTTGTTGTAAAGTGCCCTGAGGCCTGTGTATGACG
-TGCCCAGCAATACTGGGGACAATAAATGCTGGCTGCTAATTCCCTCTCCCTCTTGTCGGG
-GGTTTATGATTCCTCAGGGCTCTTGATGGTAGCAGAGGCCTCTCGTGGCTCTTTGGGAGG
-CTGTGGAAGCTTCAGCTTTGGCTGAGTAGGACGTCTGCAGTGGCAGGACACCTCCAGCCA
-ATCAGGATGCTCAGTGTCACAGGGATTGGGGGCAACGCCCACCGCTACAAACCCAGGAGG
-CCTCCTCTGGGGAGGATGTGAGCTCCAGGATTCCAGGAAGGGTGGGAGGAAACCTTCTAA
-GGGGAGCTGAAAGCTCGTTGATTCCTAAGATGAGCCCGAGTGAGAAAGGTACCAGGTTTT
-GAAGTTTGTTCTGCAAACGACCTTCTTCACTTTTTTGTGAAGTCCTGCaatcaacagagc
-tcagggctaggaattaggacctttgctcctgtcccaccttggactcagactcattgtatg
-acctttggcagagcacctggagcttcCAAGGGGTGGCAGAGAGTTGGGAATGCAGTTTCC
-TATCGGAAAAGCAGAGCCTTGGTCTTGATAAAGAACTTTTGAACTTTTTCTTAGCCAAGG
-GAGCCTTCCTTTTTGCAAGATGAAATGTGACATGAGAGATCGATTCCTAAAATGAATGAG
-TTGAGCTGCTTTGGCTGAGGCCAGGATGGGGGTGAGGGTGAGCATCTTGAGCTGTCTTTT
-TGGTTTCCTTTGCCTACTTCTAGAGGCAGCCTCTGAGAGCTTGGATACCCCCTAAGGAAC
-CTTTGAACCCCAGAGTTCCACAGTGCTAATGGCTGCAAGGCAGGTGATATAATTTTGTGG
-GACTCTGGAGCCTGGGTTCATTCCCACACtagcttctctgagcattggttttcccgtctg
-taaatggggataacgactatgctcacatgttgtgacagtgtggtaagctggttttgtgtg
-tggcatgccaaaacagggtttggctgacatggggtgcacagcaatgtgggAGCTGCTAGC
-AGTTGTGGATCTCTTCTTTCACAGGCCAGACTGCCTcaacaatcctgcaagatgggtagt
-attatctggtcttgcggacaaggaagctaaggcacagagaaggtaagtaagttgcccaga
-tcccatagctggtgagtggcaaactcaaagccaggcagtctTAGTAACAGATAGTTATTA
-TTATTTTAAGTACTGGGGAGAGTCTAGGCCCCAGAATAGGTCCAAAATAAATACCCTCCT
-CACCTTACATAATTAAGCTCTAAGAAAGCTTAGAAATAggccaggcacggtggttcacac
-ctgtaatcccagcactttgggaggctgaggcgggtggatcatgaggtcaggagttcaaga
-ccagcctgaccaagacggtgaaaccccgtctctactaaaaacacaaaacacctgcaccag
-gtgtggtggtgcgcacctgtaatcccagctacttgggaggctgaggcaggagaatcactt
-gaacctgggcagcagaggttgcagtgagccgagatcatgccactacactccaccctgggc
-gacagagtgagactctgtctcagaaaaaaagaaaGCTGAGAAATATAATCAGCTCCCAGT
-GCTGAGAAGACTTGGGGCCCCACTGCCAGTGAGCATCAGGAAAGGGGGCCAGGTCTAAAA
-GTCAGCGCTGACTGAGGCAGGTCCTTGGTCAGTGTGTCCCTGCCAGTGTTCCTGGGAAAG
-CCCCAGTTCTTCTCAGCCAGCACCCTGGGTACCTGGAGCTTCCAAGGGGTGGCAGAGAGT
-TGGGAATGCAGTTTGGGCCTCCAGCCCAATGCTCCATGCTCCTTGCCCAGTAATCACACC
-TGGCACAAAGTGAGCATCTTCAAGGACCCTATTCTGGGTCTGGTCTCTCCCCATGGGCCT
-TCTTCAACACTCAAATCCTAGTAGTACAAGGGAGAGAGCCCCAGATGTGGACTcttgtcc
-agttctgtgtgtcctcaggcaagtgtctccctgtctctgggcttcagtttctccatctgt
-caaatggatggttaaactcagtgtttctaaaggcccACTGTTCACccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccccatccatccatccatccatccatccatccacccacccacccatctatccatcca
-ctcacccacccatctatccatccatccatccacccatccatccatccaccaacccatcta
-tccatccaatcacccacccatctatccatccaccaacccatctatccatccactcaccca
-cccatctatccatccatccatccacccacccactcatctatccatccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccacccacccatatatccatccactcacccacccatctatccatccatccacccacc
-cactcatctatccatccatccatccatctatccacccacccacccatcatccacccaacc
-atctatccgtccatccatccattcagcagatatttcttgaatatcatctatgtgccaggA
-TCCTTTATTTATTAAAGTTAAAAGACAAATCACAGACCTGTAGAAACATTTTAGAAAGAC
-ATACAAAATCATACTGGATTGGAAATGTAAATTTCCCCAGGACttttgttcaccagtgac
-tctccaatgccatgcatggggccacatgtctactaggtgctctgtaaaatgtttattgga
-tgtaagaatGAATAGGACATATTTTGCTGTTCTAAAGAGAGCTGCCTCCGAGTCTGAGAT
-TGGAGTCAGACATCCTCTCTAGGACTTATTGAGAGGGGGCCAACTATCTTTGTCACCCCC
-ATCCCTGACCTGCCCCACTGCCTCCCCAGCCCATATAAGCCAGTTTCTAAAGAGGATCTA
-AGGAGGATTGGCCAGCAGTGACTGGGGCAGGGTAGGGCACGGCATGCCCCCAACTCCCAA
-GCCCAGGTGGGCTCATGGTTTGGAGGGGAGAAGCTATGAACCAGAGGGAAACAGGCATTC
-CATCCCTTGATTGAACTCACTCTTGTTGATCTGCCCTGTGTCCATTGGGAGTGAGTGGAG
-AATGAATGAGAAATGCAAAAGGGGTGGGGTCTGGCAGAGGCAGCCTGCATTGCCACCATT
-TGACCAATTTCCTGTCAATTTCCTATATTTGGTCAAGTGGACATTGAAGGAGGCTCTTGA
-GCTTAATCTAAGCCATGGTTTTCCAGCCCAAAGGGGCATGAGGCTGTTGAAGTGGGGATG
-GGGTAGTGAGGAAGCTAGGGTGATCTGAAGAGGTCAAGCTCGTGCTCCTTGCTCAGTAAT
-CACACCTGTGTACCAATTAGGCACCTGCCACACGTGGGAGAAAGGGGAGGGCATGGATGG
-AGGCAGAGGAACATTTAGTCCCAGTCCCTCCCTGCTGCTCACTGGTGATGGCCCCAGAGT
-TTTCTAACACCGGGAATTGTGGAGGCCACAGCAGCATCAGGGTAGTGACAGCTGTCTCTA
-TCCCCATTCCTTCTTCTGCTCCCCAACATACAGGGGAGAAATCAACCCAGAGGGAGGAGA
-GAAGAGAATGAGACAGCATGACATATCTCCCTACAGGGCAAATCAGTGGAGTCAGAAGCT
-GAGTCAGGCAGTGATGGGGAAGCAGTGATGGGAAAGGAGAGCTTCAAATCAGACCTGTAT
-TTTAAAAATTCAGCACTGGACTAGGCTTTTTAATAGCTGAAAGTTACCAGAAAGCTTTGA
-GATCTGCCCAAAGTTATTAAGGATTGGAGTTTAAAAATACGACTGTGCATTGGGGGTGGG
-GGGTGGGGGGTGCATGGAAAGCATGCCATGTTTGTAACCCTCTGTTACAACTTCAGTATC
-ATCATTAAGCCAGTTACACACAAAGTAAGCCAAGAAtatccttaatacacaacgagctcc
-tataaatcaataagaaaaaggggaatgatccaagtgtgtggagggagaatgggcaaagac
-attacaaggaatttaaaaaagaaagacaaataggacaataaccatacgcaaagctgttct
-acttccctaagaattttcaaattgaagatgagaacaagaatgaaataccaccatgaccta
-caagatacggaaactgtaaaagactCCGGCACCCTCTTTTGAGAAGGCAATTAGGCAGAG
-TCTATTATCTGTAGCCTGAGGTAGTAACAGcattttacaggaagtgtcctgagttgagag
-aggggtaggcacttgttagaagccacacagtgagtcatgggaggggaggagctagaactc
-agacctctggaTGGGCACCTTTGATTCTTTATCTCCAGCCAGCTGGTCCTCTCTGTCTGG
-GCTAGTGCACAGCCTGGCCCCTGGCCCCTGTCTGGGTAGCCCAGGTCTGCTACATCCATT
-GCTGCACCCTGCTCTGGGCCTGAGGATGGTTGGGGCACTGCTATTCCAAATGACACATCT
-CTTATGATTACCCTGTCCTTCCTAGACAGGAAGCTTTCAATTAGTCCTGCTGGGCAGCAG
-CCTTAGAGGgtagaggtaggactccaaggtttgggatgagacaaacctgttctcaaatcc
-cagccccacctttactccctgggacagttacttaacctcagtttgctcatttgtaaaaGG
-AACACTGTccaggtgcggtggctcacacctgtaatcccagcactttgggaggctgaggtg
-ggaggattacttaaggccaggaatttgagaccagcctgggcaacatagtgagacccttat
-ctctatgaaaataaaaaaaaaaaattagccaggcatggtgatgcgtgcctatagtcccag
-ctactcaggaggctgaggtgggaggactgcttgagcccaagaggtcaaggctgcaatgag
-ctaagatcgtgctattgccctccagtctgggtgacagagagagaccctgtctcaaaaaca
-aacaagattaaaaTGGACACAATCACCCACCCACTGAAAAGCttgttccttccacagata
-tttattgagggcctactatgtgccaggcacttttcaaggcactgcagatacatcagtgaa
-tgagacagaccttcccctcatgaagtttacatcctaagtgggagagggagatcatttcag
-agaacgacagggaattgaatttgggtacacagagtggcaggagggagggcctgggctgcc
-tggaagggcatctctgagatacacaagaaagcactcttggcggagggaccagtgggtaca
-aaagcccagaagcggcaaagaacgtggtgtggaagagagcagcaaggccagagtgcagtg
-actgaggggagagtggtgggtggtgaggtctggaggcagaggggccagacccccaggaca
-catggatgagtttggatggtgctggattttcctggaagtgagttgggaagccactgtggg
-ttgcaagccgaggagtgtctgccaccttgaaagcttctctggtgctgaggggaatggact
-gtggggcaggagtagaagctgggagctcagggtgtatgggctgtggtcattctggtggcc
-tggacgaggctggcagctatgagaagtgggtggatccagggagggtggacagacaagctc
-tgctcatgggttATCATGAAGATTAAAGGGTAAGTGACTCAGTCCACAGTGCAGCACATA
-GCACATGCTAGACAGATCTTAGCTGttttatttatgtatttatttatttttgagacacag
-tcttgctctgtcactcaggctggagtgcagtggtgtgatctcgactcagtgcaacctctg
-cctcccaggttcaagcaattctcctgcctcagcttccctagtagctgggattacaggcac
-ccaccaccatgcctggctaatttttgtaattttagtagagatggggtttcaccatgttag
-tcaggctggtcttgaactcctgacctcaagtgatccacccgactcagcctcccaaagtgc
-tgggataacaggcgagagccactgcgcccagccAGATCTCAGCTTTTAAGAGGCCTAGAC
-CTAGAATCCCATGACTGTGTCTACCCCACAGCCTCCTCCATAAATGCCCCAAATCGCTTC
-TGCCTCTCCTGGTCATTGGTTCAAAATGTGATTCCTTGACCTCTTGTTGCCTCTTGACTT
-TTGCAGCTGCTGGGATGAAGTACTTGTTCTGAGTTCCTCTAGTTGCTATTTTAAGCAGAC
-TGCATACCCTCCGGCCCCCATCTCCCAAGCTGGTGTGAAACCCAAGGCAGTATCTGGGTG
-GCTCCCTAAGTCGTTTTCCAAGTTGAGAATAGGTAGTAGAGTCACCTATTCTCACAACCG
-TGACATTCCACCCAGTCCAGGCTCCCAGACTAACTGCCCAGCCCCTGGAagtagagagat
-gggaggcagcaccaggcagcagggaacccaggtttgagtcccagctctgccaccttgacc
-ctaggaaggccctttgacctctctgagtctctgcacctcttctgcaaaataggaatgatg
-atattaaagaattgcttgcagggtaaagtgaggtaataacctgcggagcacctggctgtg
-tgcccagctcatatggcaaacactcaccaggtaggagGATCCTAAGGTTGTGGGCaatgc
-atacaaagcctctggtgcattgtaggtgctcaataaatggtagGATGCCAGTAGGGAGGA
-GTTGAATGAGAAAAGGGGAAAGAGACCCAGTGCATGGTGGGGGTGGCAGGAACACAGGGA
-GTTGGGGGCTCCACCTTGGAAACCTCTCCTGGCCCTGGGGGCACTATCTCCACCAAACCC
-AAATCCAGGCAGCTAGAGGGACCTGGGCCTGCACAGGCATGGAAATTCTGCACTCACTGT
-TAGtgggcctcagtttcctcatccgcgaagtggaaaccataacccttcttaccCAGTTAT
-AACCTGGATTCTGGGCTGGAACCAAGATAAGCAGCTACAGGCTGTCCTACCCCACCCCCA
-GCTGGAGACGCGGGCCTCTGGGAGCTCTGGCCGATTTTCAAAGGGACCAGAACTGCAAAA
-AACAGAACTAGGCTAATGCTGGCtgagtgttcacagtgtgccaggacctgtgccacccag
-gtccttgtactaaatcattaaaacttgccataaccccacaaggtgggggctacacttact
-ccattggcagggatgagaaaactgaggctcggagaggtaaagggcttggcccaagcattc
-acaggaggagccaggaggaatgcaaaactgagcccagctcctaactACTGGAGAGGAGCC
-TGCCTTGTGGTCCGTCACCCCTCCCTGCCAACCCCTGCCAGCTGGGCTTCCAAAGGCCGA
-CAAATGCTATTTAAAGTCATACGTCTCTCAGGTCCCGAGGCACACCAGGGATGGACCCTA
-AACTGTTTGTGGGGGCAGACAGGAGTTATATCAGCCAAGTGAAGGCAGGAGGGGAAGGCT
-ACTCCAAGTGCCTTTAGTCTGGAACTGTTTGCATTGCAGGGATGGAGCCCTTAGTAGCAA
-CCTCCAGACAGTCAAAAAAGCTGGCTTTGCACACAAACATCCCAAGTGTATGTTttcctt
-cattctttctctttctcttttctttttccttccttccttccttctttccttccttccctc
-cttctttccttcctccctccctccctccttccttcctttctttttctttcttctttcttt
-cTCAGtctctctctctctttccctctctctcttcctGGGGTGGGGAGTTGTTGATGCAAG
-AGAATGAGATGATCCACAAACTGAACTGGTTCAGCCAAAGCAGCCCTCAGCCAGGGGCGA
-GCGGGAAGTGTAAGCTGTTGGCTGAGGATTCTCCTTGTGGGGGATTTTGAGCCCCTGTGG
-GGTGTTGTTCAAGCCAATGTCACTCGCCTCCAGGGGCAGGGAGTCTCCAGCTGATGTCTC
-TCTTAGAGGAAAATTCACTGCTGTTGAGCTTACTACCTCCATCAGAGTAGGGGAAAGGGG
-ACCCCAAGGACAGGGTCTGGCTAGCAGCACATGCTCCGCAGATGCGTGCCAACTGCAGGC
-TGTGATCCTAGGGCACAGTCAGGAAGGGGCGTGGACAGAGGAGCATTGTCGCAACTGAGC
-GTCCCACTAGCGTCCTCAGGAAGGCCCGAGGGCTGCTGCAGCAGCACTAACACTTGGAAG
-AATCCCTCGCGGGAAGGGTGGTCCAATGTTGAGGAGTAGCAGATCCAAGCTCACACTCTG
-GAGTGTGACtttgcttgtttattttaaaagaaggggtctcaccacattgcccgggctggc
-ctcgaactcctgggctcaagccatcctcccacctcagccccgtgagtagctgggatttca
-ggcgagagtcaatgcacctggcTCTGGGGTGACTTCTTGTAAGACCTTCTCATACAGACT
-TTTTAATAAGATCAGAAAACCCAGACCATAAGGCAGAACAAGCCCCCTCTCCCCACTCAA
-AAACCAATGGATTTGACCACACTGACAGCATGGTAAGCAATGATTTCTACTCTCCAAAGG
-TGaggactctacaaagtcagattaaaaaagattttttttgtgtcaaaatgaacatgggat
-tgatatctaggtaatacaaggaagccctacaaattgacaagaaaaattcaggaattccaa
-ttttaaaagtgggaaaaataaaaataaaatgtttaaaaagtgaaaaaataaaatttaaaa
-ttaaaaatcaggtgaataagaattacatgattaaaacaaatttaaacagttaaaataaca
-ttcaaaaacgaaattaagtaacaaaataaaaatttaaaaataaggtataaaaataaagtg
-taaaaatccattcaaataaaaaatacatttgtaaaataatttaaatacattaaaattaat
-aaaaacaaaaatgttaaaaataaaagtaaaatgtttaagtgaaataaaatttaaaaatgt
-aagaatacatgaaagaatttttacgagtaaaataaaaaatcagctatttttaacaatcta
-aagaataaagaaaAACTAATAGAAACATCAAAGGAGAGCAAGGTCTTGCTAGATGGATGC
-TGATGATGTGCTGTGAATTAAGGAGTCCGATTGGCTCAAATGCCTGCAGGGAGGCGGGGG
-AAGTGAATGACGGGGGTGGTGTAGGGAGTGAGAGGGGACGAGGAAGTAAAAGCATGCCCG
-CAGGCAGCATCTGATTCGGTTTTTCCAGCCCGCTGTGGGCAGAGGGCAGGAAGTCAGGCC
-CCATCATGGCTTCCCCCCAAAATAGCCATCACATCATTTATGCATTTGTAATGTGCTGGC
-AACATACGCACACGCACACGGATGCATGTTACATCATCCCATCCTCACTGCCCCATCCTC
-ACTGCTGTCCTCTGAGGTCCACTTTCttttttttttttttttttttgagacggagtttcg
-ctcttgttgcccaggctCTGAGGTCCACtttcatagaggagtgaacagagactcagagag
-ggtgggtcactgtgccacagtcacacagcACTTAGGACCACCCTATCCTCTGAATCTGGC
-ATGCTCAAAATGACCTTCTTTGGATGAGTTAGGTCTGCTGAGCACTTTCAAACAGAGGCA
-GGGCCATCTCTGACATCAGGCTCGAACGTTCTGTACACTAGGAAGAGCCCAACCTCTCCC
-CCCATGACGCATGACAGTTATCaccattaaagaaacactgactgtcttccaggggcgtca
-catgcatagtcatcttgaaaaccatatgaggtagatgctcttattgtccccattgtattg
-acagacaacatcgagattcaggagtcaaatactgtcacccaagcatggcagtaacagaac
-tgggagctgagcccaggactgtccacagcccaaatctcacactccctgcgtggcaccagg
-cCCTTTTAACCGTCATTGATGAGCACTCCCTATGTACCAGCAATGCGTTTGTCTATGTTT
-CATGcctcattttgcaaattagccaacgggggcacagaagggagagatgacctgcccaag
-gtcactcagccagtaagtggcagagccCACAGCCTTCGTGACAGCCTGCCAAGCCCCCAG
-TGCTCATCCGGGACTTGCTAGAGACAGCTGTGCCCACTGGCCAACCCCAGATCAGGCTCA
-GAAGGGCAACTGTGACATTCCTTCTCTTCATGTCTCCACCCTGGCGGATGTGGGCTCTGC
-CATCGGGCTCCAGGGAAAGTGGAGGCTTCCAGTGAAAGGGAGTGGTTTCCCCATGTGGCC
-TGGGTCCTCTGGGCTTGGGAATGCCTCTGTTTTGAGCTGGTGAAACAGAATTTCCCACCC
-CCTCCGCAATGGCACATCAGAGCCCCCACTATGGGCCACAGAGCAAGGGCCCTATGAATC
-ATGCTGCATTACTGCAAGAAATCATTCCAGGGCAGGCAGTGGCGGCCCAGCATGGGACAG
-CAGTGTCCGGGTGGAGTTGGCGTCACCCATCCGGAGATGGGAAGCAGACCATTCCCGAAG
-GGATCTGGAAGAATCTCCGAGGGCGGGGCTGAGGGCAAATGTGTCCTGGATGCTGCTGTT
-CCACCgggctaggaaaaaaagctccagcccacagagacctgggagcacatcacgaccttt
-ccccagcctggctgtgtgtccttggcaagttgattcccctccctgaatgtggaaggcctc
-atctgtagaagagggagaataatagggtcaagccacttcatggggctataatgtgggtAG
-CCTGGGAGGAGGGCtggcatggtggttatggactcaggctttggaatcaattgtctggat
-ggaatcctggtttttgccaaacttactctgccaagctgtgGggtagaaacatgaaattgc
-taatatttggctgtttatgacctagaaaaatggcaactgcatatacttcaaTGAATGTGC
-CTctcttttaactgcttcctcctctgtaaaatgtgggtaataacaggcccctcagagggg
-tgctgtgaggatgaaataagGCTgggaggcaattaagttcagtagttagagctgggctct
-ggggcaaggaaggatttgaaccttggctgagtggccttgggcaaagttacttaaccttcc
-tgtgcctcagttttcttgtctgtaaaataggaatgctactgcccactgcacaggtttatt
-aaggtaatttaatcaattaatacatacaaagtacatagaacagtgtctgAAATTGTTACA
-TAAAAGAATGCAGGTAACATCTGGCATCTCCTGCACCCTCATGTCTACTCACATAAATGC
-TCAACCACGAAACAAAATCCAAAGTGACTTTTGTAAACCTTTGATGCCAATGAAAGTTAA
-GTATTTTTAAAGAAAAAATATGTTTTGGGGAACATACATGTGTGTAGAGATGTAGGTGAG
-GAGTGTGCTCCCCAGGGTCCACCCCCAGGGCTGTTCTATGTCCTGATGGTGCCTATAGCC
-CAAGACTCTGAGGACAGGACTAGCCTTGAGGCCATGATGGCCCCGTGGCTTGGTCTCTTT
-CACAAAATCACACAGCCAAACCTCAGACCCTATGGAGAGGCTCCACTTGCCTAGGTAACT
-CTAGAGGCCCTTAAGAGGCACCCAGCCCTGGGCTGGCCTCTGATTATTAAGAAATTCCTG
-CAGACAGCCTTGGATGTGCGAAAGCCCTCCAGCTTCCATCCTGTCTTAAtttttttttag
-acgaagtcttgttctgtcacccaggctagagtgcagcagtgcaatctcagctcactgcaa
-cctttgctttccaggttcaagtgattctcatgcctcagcctcctgagtagttggtagttg
-ggattacaggtgtgcactaacacacccagctaatttttgtatttttagtagagatggggt
-ttcaccatgttggccaggctggtctcgaactcctggcctcaggtgatctgcctgcctcag
-ccttccaaagtgctgggattacaggcgtgagccactgcgcctggctCCATCCTGTCTTCT
-GACATTTGTCCCAGCCCTGGGAAAAAAGGCAAAGCACACTGAGCATTTCCAAGTCACGCG
-GGGGGAAACTGAGGCTCTGAGAGGCTCTCAACCTATCAGGCTCTGGAGCAGGCTGCCTTC
-CTCTACCAATTCAAGTTTTGCCTTCACCGCTAGTCTCCTgaaccctcacttctactcaca
-gctgggtgaccttgagtaaggtacttccctgcttgagtctccaattttacaaggattggt
-ctcaaaggtctcacttggcctttttggccttatcacttcattattctaGAACCCTTCTCC
-AGAATTTCAGAGAGAAAATGAAAGCTGAATTGCTCTGCAAACTATAAAGTGCTACACAAA
-CAAGAAGGTGGTTAATGGCAGCATTAGATGGGTTTTCAGAAGTCTACCGTAGGCAGGATT
-TGCTGTgggttttggaattaagaagacccagctcacacatgtatttgcgacgttactttg
-gataagccagttcccctctctgaaccaacttccctcttctgtaagctggcggtagaggca
-tatccaccaggcaggactggggtgaggaccaaaggaaaggagcgtgcaaTGTCTGCCACG
-CCCTGGCCGAGCAGAGGTGTTTGATGCAGGAGGAGATTTAGGGCCCCGACACATCATTCC
-ACCTTCCAGGAGCTAAAATCCACACACCTGGGGAATGATGTAGCTGTCAGATTCAGGGCG
-ATTAGAAACAAGCATCTGAACTAAGGCAATTGTTTGgagctccagagacagactctctgg
-gcttacatcccagcacccctgtctgttgctataccacccactgggcctcagtctcctcat
-ctataatataaagatcctcctggaatctgccccttacagctgtcaggagggcctccatta
-ggccatgactgaaaggggctgagcacagAAGATGGGCTCAGCTGGTCCAGCAGCCTCCAC
-ACTATTTTGACAATGGTATCAGTAGACACAGTAGTacacacgtgcacatgcatgcacaca
-ctcacatacatccacatatatgtgcatgcacactcacCCactcatacacccattcacata
-tatgtgtaaactgaaacacatttctcaaaataatagttttcacacttgcaatgcactctg
-atatattctaaaaaggaggttggcaaaaatcgcagcctctggaccaaatttggatgtttt
-tgtgttgcctgtgagctaagaagagtggagtacatgacagattgtatgtggtttgcaagg
-cctaaagtatttactatctgacccttcgcaaaaaatgtttgctgaccccactctatttta
-gtcagtgctattccattccgttctgttccgttccattccattccgttaccattccattcc
-atttcattagaaaatgctggctattgctaaatttattgtcctcacctgctgatgcattgt
-aaacctcagcttggaaaacTTTAAACTAATGGGAGCTTCAGTTTTTTCACCAGATGGGAG
-GATGGATGAACAAACCGTATCCATGTGACACCTTAGCCAAGCAACCTCCCCTCTTTGTCT
-TGGATTCCTCGGCTGAGGCTGAGACCACCACCACCAGCCTGCTCTCAAGGGTGTGTTGAG
-GTGCAGCCTCAGAGGTCTTGTCCATGATGTTCTCATTGACGGATCTCaagagcccaatag
-taaatactttaggctttttgcaccacatacgatctgttgcctattcCAGTATTCTTAGCT
-TGAAGGCCATACAAAAATAGTCCTGTGGCGGCAGAAATGGAGGAACACCCAtctctgctg
-tccttttcaatacccagcccagggcctggcccacaggaaggacccaataagtatttcttC
-ATGGTGATGGTGACTGGAGAGTGGCACCCAAGGCCCTCCATGACGGGACTCTGGCCCAAT
-CTGCAATCAGAACTTCACTTCCTTCGGCCACGCAGTCCCTTGTCCCCTCCACCTGGCCAC
-ACTCTCTCCTCATCCTGCAGAGGTCCTCACCTTACTGCCACCTCTGCCTGACAAAATCCT
-AAATCCTACTCCCCCCGATGGGGTTCCTCTCAGACACTTACACCTTGCAGCCCTGGCAAA
-TCACTGGCATGATTCATTTCTATATCTATTgcacgggcttcggagcctccaaaactctgg
-gtccaggtcctggctcagcagctgtgagctctttggcaggccattgatgctttctgagcc
-tcagttcccgtgtctgggaaataggcataacaCAAGGCAGTGGCAGAGTGAGGACGCGCA
-GCCCCACCTGCACAGCTCCTGGCACATGGCCCGCCTCCCTCCTTCCTCAGTGGCCTCAAT
-CTCAGTGGCCTGAATCTCCTTCAGTGGCTGGGCAGGGGGGTTGGATGGTTTCCGTCCACA
-GGAGAGGGAGGTGGGGCCCCCCGTGGTGGGGCAATGGGATGGAAAAGCAGCATCTCTTTT
-GCACCCAGGCTTGGCTTCAGAACGCTGAGTGGAAGAAGGATGGCAAATGGAGCTCAATTG
-ATTGACCACCTACTATCTGCCAAGCATTCAGATTTCCATTTCTCAACCAGCCCCTATGCT
-ATGAAGAAACCGAAGCCGAGAGACCCAAGGTTACATTCTATTAAGACTCAGCGCCATTCC
-CTCAGCCCTCAATGTCCAGTCATTACCCACCCCTGCCCTGTAGGAATCCCTTTCAGAACT
-ACCCCTGCATCTAAACCTGGCTTCACCTGGATGCCAGCACTCAGGGGACATACTTTGTTC
-GTGCCCAGCGATGGCGCCTGCTTGCCCAGGGCCTGGTGCATCTGTCTGTGTACAGGAGAC
-AGtgctgtctgcctggccctccacaaggggctttgcaatttaaacggaagcatcatattc
-actccacataacaggcctctggagtgggcactgccacagtcaatttacaataaagaaaaa
-caagctcagagagaggagaaggtttgctccggatgcaccacaagcaagaggcagaggtga
-gcttaacccacgtgagaccccactcccttccggtccagggcatgtctgctctgcTGTAAA
-ATGGGAAGGGAAAGTGGTCAAATCCttatgaagcccctactgtgtgcctttggccccctt
-ccctcttggactgcagtaaatcttcccaattgctcagagaggtaggtgtaagttttccca
-tttcacagatggggaagcacggacgggagaaggcatgtggcctgcttaatgtcacatatc
-tagggcaggagagggctcaaggtttgatcccagggctcttcactTTGCCCCTTGCTTGCT
-CAGGTCTAGAAAGATCCAGAAGCTCCATGTGAATGTGGGGGTCCCTCCCCAGAAGGCCTT
-GGATGTCAGGGAAAGTCAGTCACAGGCTGGCATCTCCTCCTTGCCCAAATGGACCTCCAG
-ATCTAGGGATGCGAACCAGGGCCCCCTCACTCTGCCCTACTGTCCCATTGCCAGGACacc
-ccagcatgtttcaaaaaaatgtccccatctggttctgattcatttacacttcattaatca
-acatgctgttttgtaagagacacttgagatccaagaatctttctcaagtcttttacttca
-ttctttcttagaaacagaaaaattgggcttcattaagaCGCAGTGACGCCGGAGCCTGAG
-GAAGGATGGGCCTGTGGGAACCAGGCCTCAAGCAGGCTCAGAGAGGGCAGATGCCAGCCC
-AGCACCTCATTCCTCGGGATTGTGCAGACCTGGCCAAACGCTAAGGCCAAAGACTCAGGC
-ATGGGGGAGGCTGGAGAAAGGTGGGAAAGGGTCATccctctatgttggcagctccccaag
-gacaggcccagggctgctcacctgggtatctccaaggtccccaacacagagcctggcaca
-gaggctgccctgtgaaatgaacaagtgaatgaatgaaGCACTGCCAATACCCAGGTGTTT
-TCAGGACACATTCTCCTGCCAAAGTTAGATAAGGTCAAAGCTGGTAGGACCCTGAGGGAT
-TGTGTACAGAATTTTCCAAGCAGATGCCTTATGAGAAATGGTCTCTGATGTGTAATATGT
-TTGGGAAAGGTCACTCTCTCTCGCtctctttttttttttttttttttgagacagggtctg
-ctctgtcgcccaggctggggtgcagtggcacaatcacggctcactgcagccttgatgtct
-ttcctgggctgaagcgatcctcccacttcggcttcctaagtagctgggactacaggtgtg
-caccaccaccaacatgcctggctattttttgtatttttttatagagacaaaaaatgtatt
-ttttgtagagttttgccatgttgcccaggctggtctcgaactcctgagctcaagctatcc
-tcccatcttggcctcccaaagtgccaggattataggcttgagccatcgcacctggGTTAC
-ACTGTCTGTCTCCACCTCTTCAGCATgctctgataagtctcacagccaagaaatctgcta
-aacccagcatttcccaatctatttgaccagaactCCTGTGGCTGCCTTGCAAAATATGCT
-ACAGGAAGGGTTTATCTAGCTCTGGTCCCCACTGCAGTGCCAGTGGGAAACTGAGGCTAT
-GGGCGGGGGACAGAGAAAATCCACTCACCCAAGGTCACATGATACAACTGGGTCAGGGGT
-GTGACTGAAATCCAAGGCTATCTCCATTGTACCCCAACAAATAAATGGAGCCCTAAGCCT
-CTTCTGAAGATGCTAGGCAGGTGTGTGTCCCAGAGGCAAGAGATCAGGTACTGGAGGAGG
-GATGCTGAGAGCCCCTCACCAAATTGCGGCCATATCCCTACCTCCTCACTGAGCTCCTGG
-GGAGGTGGTGGTGAGCTGTAGATGGGGCGGGGGGCAAAAGGGGCAGGATAGGAATTTTTC
-ATTTTTCTTTAATTTTTTTGTCTTTTTTgagctgagaagcatcttaaagtcttctaaacc
-agctcctttttgttgttgttgttgttgttgagacagagtctcactctgacacccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctctgcctcctgggttcaagcgactct
-cctgcctcagcctcccaagtagctggaattacaggcgcccgccaccacacccagctaatc
-attgtatttttagtaaagacagggtttcatcatgttagccaggctggtctcaaactcctg
-atctcaaatgatccgcctgccttggcctcccaaagtgctggtattacaggcgtgagccac
-cacacctggcctaaaccagctcctctttagatgaggaaactgaggctctgagaagggaag
-ACCAGCACACCTCAGAAGATATCTTCTCAGCATTATgtcaggcagattgggattcgagcc
-tgctttgctactcacctgctgtgcgaccttggacaagtcagtttccttctctgaacctca
-gttccctcatccagaaaacaagcatCTCTCCCCTCCCTCCACTAAGCCACTGTGAGTAGC
-CAAAGACACAGTGGACAGGAAATGAGAATGATTAATACTTACGAGCACCCATTAGGAGCC
-TGTGTCCTTAGCTACTCATCTTGCCCACAATCCTCCTTATGAGCAGGATACTTAAGTAAA
-AGATGGGTTGATGAAGGGAAAGGGGGTTTGTTTGATTTTTTGGTATTGTttagaatggag
-aaagatctcagagatcttctaaaggaccctcagatgggtaaagtgaggattggacaggca
-aagtgacttatccaaagtcactcagttggtaactggggaagctgggatttgaactcagtt
-gacctggctccagagcccatgcccctaactactaAACAAAGGCCATTCACAAAGGAGTGT
-CCCCATAGAGTCCCAAACTCACCCCAGCTCAGCTGAAAACCACACGCCTCTCTAGTCCCT
-TGTCCCACTGTCACAGCAAGAACTGGAGCCTCTTGGGCCACAGTCTCCCCAACCCCATCC
-AATCCCACCTCCCAATTCTCCCACAGCCTCTGTCTGCTTCCTGCTCCGTTCCAGGAGTGA
-CTGTGTCGCTGTAGGGCTTTCACACAAATGGAAGGCCCCAGAGGGCAACCCATCCTCTCT
-CATTTTCCTTCCCCTTTATCCTTGCTCAGACCCGATGCCAGGGCTGGAAAGAGAGAAGAC
-accagctggacaattcagcagttatttaaaccagtctgagccttggaatcccaggcttta
-ttaaaactggacgacccctatgtcatgagcatatagttgggatttgatgagctaggacat
-gaaaaacccgtggcatagtggctggcaTTCGGCTGCTGATCTTAAGAGTGGCACCTGGAG
-GCCAAAGGGCTGCCCAGCTCAGGCAGGCGATTTGCTCACTTGCTCACCCGCTTACCCTTC
-TCTGAGGCACAGGCTCTACCAACTCCTGCTCTGCAGGGACAGCCTCCAACCCACCTTCTG
-AGGATGTTCTGACTCTCACAGCGAGGCTGTGGCATAGGACTCCCAGGTGAGAGCGCATGC
-GGCCCCTGGTACATTTATAATCTGAACCTTGGCTCATCTTCCTAGTGGCCTGAGAGGTGA
-agatggaaaagctgaggctctctgaggggctggacttcttctaggtcatcccctattaga
-ataagtgaacctgaactcaggtctcaggtctggctgaactcaaCATAGGGGGGCCATGGA
-GGATCACTGCCCTCTGGGAGGTGACACCAGGAGTCAGGGTGAGTGATGAGGCTGGGACTG
-GGGCCTCTGGACGCCCAGCCCAAGGCTCTCTATGTCACTTCCTGGCCGAGCATGGATGCT
-TGGAATGGCTTCTACGCCACTGAGTCTGTCTCCTAGTCCCTGTGCCCCGCAGGCTGGCTC
-TTGAGTCTTCTGTCTCTGCACGAAGCCATCCTCCTTTCTGCTGACCATGCGGCTACTACA
-GAGAGCCCTGCTACCCTCTCCCTTCTGGGTGAGTCTCCTTGGCCCACCCTACTCAATGGC
-TCGCTCACTGGGTGCCCTGGAGCCTCAATCTCCCCATCTTAAGTGAGGTTGAGACTCGTC
-TGGAGGAGCGAAGGACCCAGGGCGCCAGGCACCAGGCAGATGCCCCCAGAGCCGCCGCCC
-CCGGTCCTCCGGCCCCCGGTCTGCCCCGCAGCGCCTGCCCGGCCGCCCTGCCCAGCCACC
-CCTTGTACCTTGCTTCTTCCTTCGGTTCAGGGCGAGCATGTCCACGGCGTGGGCGACGAG
-CAGGAGCAGGCAGAGTGGCGCCCGCATCTGGGCAGCCGGATCCGGGCTGGCGCTCCCCAG
-GCGGCCCGACGGCCCAAGGGCCCCACGTcccggcggcggcacggcgggcgcgggggcTGC
-TGTGGGCGCGCCGGGCGCATCCGCCAGGCGCGGGTCGGTCCGGCCGCCAGGTCTAGTGAG
-GGCGTTGGCGGAGCCGGGGCACTGCCCTGGCGGGGAGGAgccggcgcggcgggggcggcg
-cgTTAACCAGCTcggggcccgggagcgcgcgcggggagggggcgggggTCACCCGGGTCG
-GGGCCCTCGAGTTCGATCTGTCCCGCAGCCGGCGGTCTTGCGTCTTTCCCGCCCCCAGCA
-CTGCCCCCGAGCACGTGCACGTGCCCACCGCCAGCCACAGGTACGCACGCGCGCGCAGGT
-ACAGATGCGCGGACACCCGGAGACCCGTACGGTCCCCCGCGCCCTCTCAGCGCCTGTGAT
-TTTCTTTCCCTCCCCCCAGTCCCCTTTCTCTGTCTGTTCCTCCTTCTGGCCCTTAAGGAC
-AACTCCTTGTCTCCTGCTTTCTCGGTCTTTCCGCGGCCCGCGCTCCCCTGCTCTGCCCCC
-GACCCTGCCTGGCTGTTCCTGCATCCTTTACTCTTGCCGGCCGTCTCTCTCTCAGGCTCA
-CTGTCTGTGTCCTCCTGGCTGGGCCTCTGGTTCTCCCTTTTCTCTGTCTCTCCCTTCAAC
-CCCATCTCTCCCCTTCTCCCCTCCTGCAGGGTGGGGTGTTTGCGGGGCTCCTGCTGCCTG
-GCTTTCTCTTTTTCTCTCTACTCTGTCTCATTCTTTTAACAGAGGCCTGAGCCCCTTCTG
-GCCACTAACCCTGAATGTTTCCTGTGCAGTCTGCGGGGATCATCTACTCCGACTCAAAGT
-GACCAGCACCTCATAAATCCACTTGTGACAGGGCTGGGGACCTGGACTGTGTTTCCTCCA
-ACCTTATCACCAGGACTGGGAGCAGCTGGTTCAAGTTTAACCCTTTCAGAGCAAAATTCC
-TCCTTCAACCCGACAGCATGCTCACCTCTCCTGTCACTATAACCACCAAAAACAACAACA
-ATCATGCTagctatcatttgtgaggcatatatggtgggcattgctaagaacttgacatat
-actagagtcttcaaaacaacccaatggtttgggtttgtattctgagtaattccacttttc
-tggggagcaaagggaagctcagagaggccaagtgacttgcccaaggccacacagcaggtc
-agtggcCATTCTGGTCCAGTGCCTGCCCCTCTTAGCCACTTCTCAGGCACAGACTCATCA
-GAATGGAAGAGGCCTTGGAGGGAGGCCTAGAGAAACTTACAGTTGACACTCTCTTGCTGA
-ACAATTGTCCTTCCtttttcttttcttttttttttcttttttttgagatgggttttcact
-ctgtcacccaggctggagtgcaatggcgccatctcggctcactgcaacctctgcctcctg
-ggttcaagtgattctcctgcctcagcctcccaagtagctgggattacaggcacctgccac
-cacacccagctaatttttgtagtttttagtagagacggggtttcaccatgttggccaggc
-tggtcttgaactcctgacctcaagtgatccacctgcctcagcctcccaaagtgctgggac
-tacagacgtgagccaccccacccagccTGTCCTCTTTTTTCCTACATGTGGAGCTTGCTC
-CAAAAGAAATGGAAGGTAAATGCTGGTATCTCCTCCAGCTCCTTCTCCCAGTGCAATGAG
-GGACACTTGAAGGCATGGCAGGGGCAGGGGAAACACACAGAGAGTGTGGCAGCTGAAGGT
-ACAGCCCTGGCCTGGCCATTCTTTCTGTGGGGCCCCAAGAACGCTGGCAGACAACACGGa
-gaacttggtggaatgtcagagacagcccacccaaagtgctccatttcacagatgaggcca
-ctgagccttcaggactggggggtgcctagattaggccacccagtgagtcaaggactgagc
-tgacatgggcatccaggtgtccCATTGTGgtcatcaccatggcctgcaaggacctcttgt
-tctgatatctctgatctcagtctttcccactgccccacccctctctctttagccttagag
-atttcagcccttgaatatttcacaaacaccacaggcctctcacacctctgagcttttcat
-gttgtggggcctctccatggaataccatcctatatcctacctccttcttcactgcctctg
-ctccaggaagccttccctgattctcaggccaggtccagtgcctcctctgggcatccacaa
-tctctttatcacagctctgatcacatcaggtggtaacaatggatgtgtctgttctccttc
-caaactgccatctctttcaagccagagccagacacacagcggtgctcagaatgtttgcat
-aatgagtgcataaataaatgaatggtgaatgaatgaatTCTCCAGATGCACAAGTCTCCC
-AGCCTGTACATGGAATGCAGGTACTTGGAGAAATGAGGTGACCCCAGAAGATCAAGCCTT
-AGGAAAGCGGAGGTCATTCCCTTCCCCACTACCCCCAGTACTGGAGTCTCCAAAGTCCAA
-AGGGGACAGCTTCCATGTGAGCAGGGCCAGAGAGGTCCAATGTGCATTGTGAATTGacag
-ccagccacacggctctgcaggatgaagctgcttaccccttcttgaattttttcccctatt
-tattccccactgcctctgctctagctagcctcgtgtttctcagactcttgtcactcatcc
-tgcggtttttgctgttctctctgcctggaaagtctttccccagatttggggcttgtctcc
-cctcgatgttgcctcctcagagaggccccctgtgaccactccagtaaaacgcaccaccat
-gcactttatcctcttgtcttgctttaccctccgtagtacctgttcatgtctgtcagttcc
-tgtttgcttgtttgtgagttccatgaggacaggaatcttctattttgtccctatgtgcct
-tacactgcagtgattaagacatacttgtggaatggatttttttaaaaaatgagtgaatga
-atAAGCACTCATTCATccatagattcattgtgggacctcaagtactttctgttctcttag
-gctcaatttccccagttgttcaatggcacagatgggattttgtgttctgtgagagcccct
-ttagtgcttccagaattggatatttctagggttcTAAGGCCCAGAACTCAGGGCCCTTCA
-TACCCCAAGATGCTCAGAGGGTGTTTGGTTCTCTAACTATGGGGGCTGTCTGGGCATCTT
-GGCCTGTTATCCAGTTCCCCTACCCCAATACAGGTGCCCAGGGAGGCTAGTGATGCTGAT
-GGCATGCTCTGGCGGGGGGCGGGGAGGGGTGCACCCAAGGGTGTCAGTTAAGGCACCATT
-GTCACAAATAGATGAAGACAGGTATAATGGCTGAAACACACTAAGCTCACAGCATGTGTT
-CCTGATCAGCAGATCCTTCTCTGTGGGATAGCAGGAACTCAGATTCCTTTCAGCTTGTGT
-TCTGCCCTGTTCAGTACCTGGTTTAAAGCTCACCGAGaagggcagggcttatgggaagta
-cagagcctgtctacctatgtcccattggccagaactcagacacacggccacacctacctg
-caagggtgactgggaaatgtagtccagccatgtgccagacaacacacaggaggaaaagca
-agaatttggtgaacatctggccCATTGACCAACGTTGGgccaccctcatttcttgcccca
-gtcatgcagtagctccttcctgtgtctgctctgacccctacaagctcttcttaagcagcc
-agagGACATGTATTATTCATCGGGTGAAGACCAAATTTCTCCTCAGAGATGCAAGGGCTA
-CGTGATGGCCCCTACTAGGGGGCCATCTGCtagggtgaccagctgtctggtttgccaggg
-attgaggggcttcctaggatgCAACGTTGACCTGTGTGTAGCCTTGtataatacaaccac
-aatcaagatatttaaacatacttaaacaagatactaaaacatcatcacaagactccttca
-tggtatccatttatggctccaccctccctctccacttccagtcctaatccctagcaaccg
-ctaatctgttctccatctctgtaatgttttattttttgagacagggtcttgctgtgtcac
-ccaggctgaagtgcagtggcacgatcatggctcactgcagccttgacctcctgggctaaa
-gcttctcctgcctcagctgtgtagcctggactacaggtgcatgccaccatggctggctaa
-ttttttattttttgcagaggtgaggtttcgccatatttcccaggctggtcttgaactcct
-gggctcaagtgattcttccacctcggcttcccaaagtgctgggattataggtgtgaatca
-ccacgcctggcctcccatctctataactgtttttacataaatattgtataatggagtcat
-gcagtatgcatctttttgagatttggctttcttcactcagcacaatttgtttggagattc
-attttagttttgcatgtattagttatttgctttttactgctgagtagtattccaccgtat
-gaatgtaatatagtttgtttaaccattcacccactgaaggacatttgggtattttctagt
-ttttcattattaagaataaaggtgccatgctcacttgtgtataggtttctgtgtatcctc
-tttggtgaaatgtctgtgcatatctttcacacattttaaattggatttttacattactat
-tgtgttttaagagttctatgtatatattctatatagaagttctttgttggttacgtgatt
-tgcaaagcgtgagatttatgtcaaggttcattttgtatttttgtttatttttttatgttt
-ttgtttgtttatttttatgttcgtttttaatttttgtttatttcgaggttcattttttat
-ttttcgtctgcggatgtccaattgctccagtatgctttgatgtaaaagctttatcaaaaa
-ttaattgggcatattggcatggatttattttggggctgtctcctgtattccatgggctat
-gtgtctttctgtctaccaatactacactgtactgattactgtaactatataataaatctt
-gaaattgggtagatggatccttcccactttattcttctttttcaaaattattttagctat
-tctagttcctctgccttttcatatatattttagaataatcttgtttatatctaccaagaa
-tcttgctgtgagtttgattagaattgcattaaacatgtatatgaatttgggaagaattca
-catctttactatattgagtctttcaatccaaaaacatagtatgtctctccatttgtttag
-atcttctttgacttttttaaataaatgttttgtcattttcagcatacaactcctgtgcat
-gttttgttagatttatacctatttccttttttctcccttagaaattatacatggtattct
-attttaaattttgctgtccgtgtgttcattgctagcagatagaaatacaactgatgttcg
-tgtgttgatcttgtatcctagcaccttgctgaactcatatattagttctaggagtatttt
-tgtagatttttttgggttttgcaacattgacaatcatatcaactgcaaatagcgacagtt
-ttctttccttctgatcttgtgccttttgtttcctttacctgctttatcaaacttgctaga
-acttccagccatatgccgagtaagtgtgatgagcatagacatccttgttctcaatcttgc
-ctggttcccaatcttagtgggaaagcattcagtcattcactatgacattagactgtagga
-cttttgtagacactctatatcaccttgaggaagatcctctctattgctacttttctgagc
-attttttaaaattatgaatggctgttgaattttgtcaaatgtttttcctgcacattggta
-taatcatttaatgtttattctttagtctactgatacgatgtattacattgattgattttt
-aagtataaaaccaacctttcttcaatggaataagccccacttggccatggtgtaccattc
-tccattatatactgctgaattctacctactaatattttgctgaggatttttgtgtctaaa
-tccattaagaatattggtctatatttctcttttttgttctgtctttgtctggttttggta
-gcagggtaatgccagccccagtagcaccagaagaacaaggcttactagaatagaattgca
-agggttccaggccaagtgcggtggcctatgcctgtaatcccagcattttgggaggctgag
-gtgggcggatcacttgaggtcaggagttcgagaccagcctggccaacatggtgaaacccc
-atctctattaaaaatacaaaaattagccacgtgtggtggtgcatgccagtaatcccagct
-acttgggaggctgaggcaggagaatcacttgagccctggaggcagaggttgcagtgagcc
-aagatcgtgccattgcactccagtctgggtgacaagagcaagactcctctcaaaaaaaaa
-aaataaataaataattgcaagggttccaacaagtttactgtcattggacctaaagcccac
-aaaagtaaacgagaactcacatgctacatttaaacagggaaactgctgcctgctaaacta
-aagtatgaaataagacctgaagttccaactgatgctaatactaaaatgactcagatgttg
-aaattgtctgacaaggattttaaagcagtcatcataaaaatgctttggcaaggaattatg
-aaatctcttgaaacaaatgaaaacagaaaatctcagcaaagaaatggaagttatataaaa
-ggatcaaacagaaattttagaaatgaaaaataccataactgggggaaaaaactttgctaa
-tggactcattagtacagtggagaagTTCAGtgatggacaaataccccaactctctattga
-atgggcaggatggccggacacataaaacatgccacgctgtctcctgccacaattccccag
-ccctgccatgctgacttcagagggactgagcttcagttgcccacggtgctgtctgggtaa
-cctgtccttcatgggctgcctgcccttcctgtttcactccttatgctccatgctatgctt
-cttgggatcaattctcaaatcaatttcttgaactcaaatccttgtctcagggttggcttc
-tggcaaccccaaaccaagacTAATTCTTACTAATTCTCATGACAACCTATAAGGTATTAC
-AGGTAAAACATGGAACAGCACCTAACCCAGAGTAAGTTCTCACTGGTAACTTTCATGATT
-GGTGCCTCAGTTTTGTTATGTATAAGACAGAGGCATCGAACCCCTCACCCTCTTCCTCTG
-GACTTCTTCTTGTTCTCCTCTTAAATCAAAATCTCTGCAAACCCACCTTTGTTCTTTGTT
-TTACCTGTTCTTTCCCAAGGGAAGGCAAACAGCCTTCTCCCTGTAGGATGCTCAGGCAGA
-CAAAGGAGCTGCTTCAAGCCAGCGCCCCTCCCTCACCAACCCCAGTGGAATCCCAGCCTC
-CACAGTCAGTTGGGTTGTTGTTTTTTATAATACCAGTGTGAAATAAATTGAAAAATTACC
-CATAAAATACAGGTTTTCAGCAGCTGGCCTGAAATTTCTTTCCATAAACAAACAAGTTTA
-AAGAGATGCCTGATGCCACCCGCCAATCCCAAACTTTTATGTCCCCATGTGGCAGTGGGG
-TCTGCCGGGAGATTTGGCCTCCTGGGCAAAGGCAGGCTGCTGGGGGCCACAAGTCACCCC
-TAGGTCTTTGGGGCTGACTTGTACTTCTCAACCGTATCTGTCTGCTCCATGAAGAATCCC
-CCAGACTCATCCCTCATCCCCCAGCTCCTACACTCagcatagacttgggagccaaactgc
-ctggatttgaatcagagatttccacttattcagtgtgacttcaagcaagttacttaatct
-atctctgcctcagtttccccaactgataatgctgataatagtagtacctacttcatagga
-ttgtttgtggattaaattagttaaatatacatgaagttcttaggacatggcacaagacca
-tgctgtataactgttagctattattAGTCGTCCAGGAGGAAGAAAAACTAGGATGGAAGC
-TACAGCAGGAGGCCTAGTGACATTTTGATTTTCCCACAATAAGCTTTCTCTGGAGTTTCC
-TTCAGGGTGTTTACATAAATGCCTGTCCAACACTCTgcagtttgcaaagcttgctacatc
-tgctatctcatttggatcaacatttaagccatggaaggagttaggacagaggttgtgatt
-atccccattacccctagtttacagaagaggaaactgaggcccagtaggtgaattgacttg
-ctcatgatctcaagaaggggtagagccaggaCCCCATTTCTGTAGCTTGAGGATCCGGGA
-CGCATCTTGATTCTTGTCACACACTGAAAGCAGGTCAGAGCCCTCCTGATCCTGCATCGC
-ACACTGAAGCTTGAACCTCATCCTAGACCACAACATAACCCTGGTCTCAGGTGGGGCTCT
-GACCCCATGCTTGACCACAGACTGAAGCCCAGATTAAGCCTCAGTATCGGTTTGAGTCAG
-AACTCTGAATCTCGCTTCACACTAGGCCCTGACTCCAGCCTCAGACTGATTCCTGATCTT
-TGTTATAGGCTGAGTCCTAATCCAGGTCCCATATTGACTCATGATCGTGATTCCACACTG
-TGCCCTAACTCTGGCCCCAGACTGAGCCCCCAGTGGGAGCCTCTAACTTGGAACTCCATC
-TCTAACCCCATCTTGAATCTTTTGTATAAATCCAATTGCCCATCTTCCCCAGGCTTTGGT
-CCATCTACCTGAAAAACAGAGTAGGGAAGAAAGTGCTCAGCACCCTTTGGAGAAGGCCCA
-GGCACCAGAGCAGAATTTACAATCCACCACAGGAAGCAAGACCCTCATCTCATCTCCTGT
-GTTTGCAACTTCCTCCAACTCCACCCCAGCTGGGACAGCCTCAAAGACCCCAGTCCTCCT
-GACGCCAGAACTCTGAGGAGTTCTATTGTTTAGGTGGTTTTCGGTTTTGATTATTTAATA
-CAGTCATTTCTGGTTTTATATTCACAGCTTTGGTCAGCTGGGATAGGGTTTTTCTTCTTC
-CTGTGGTTGAAGTTGTAACACTATTTCAAACAAAGGAAAAATTTTAAAAACAACAGTGAA
-AATATTTTCAAAATATGTTCACAATCAAGTTAATTTCTTGGTAATTGGCTGGGGAAGAGA
-AGGGAAGGACAAAGAGAGATTTTTCATAATGAAGGGACAGCAGTTCTCTGGTGGGCTGGG
-GGACAGCAGGGTGGGGGCCAGCCTTGGGTCTCAGTCTACACAAAGGTGGTAATGGGCTGG
-GGGAGATAGGGATTGGGAGCTGGACCCAGGACAGTGGATGAGAAAAGCCAAGGTCAGGCC
-TCTAAATGTCCCACTCTGGAGGGAGTTAGGACCCGGAGCCTATTTTTCTCTGTGTGCCct
-taattctgggcctcacttttttcatctgtgaaatggattcaataacacctgcccaaggag
-gactcttgaaattaaaagacaaggtggctgcaaagcacccagcacaaggcctgacactga
-ggtgtacaagtaatagtagttGATGCCATCATTATTATTTGTATTCATGGTTTGCCAGCC
-CAGAGGCTgtagaacctggtggtacagggaagcctgagtcagacaacctggattcaagcc
-ccagttgtgccacttactacttatgtgacctccggcaagttgctgagcctctctgacctt
-tggttttctcatccataaaatggggatagtaactgagttgttgtgaggatcgaatgcatg
-actgcatgcaaagcacttagaactgtgcctagtgcatagtcagtgccaagtgtcagctac
-tactATCTGCTCAAAAATATTTCATGCATACCTACTACTTGCAGGTTGTGAATTGATTGA
-TTCTTTTTTCATTACTAAGCACTAACTGTGTGCCAGAGAGCAGTGAGAACCGAAGACACA
-GTAGCTTCTATCAAGGCCCTCATCGCCTGGTGGGAGACTGAGAAGGAAAGAAGGCAATGA
-TGACAAGGTCAAGTAAGTTCTAAAATCCAGGCACAGGGGAGGAGCTGTGGGAGCCTAGGG
-GCAAGGCCAGAGAAGGGTTCACAGGAGTTAAACattcattcattcaacaagtatctactg
-agcactggcccaaggctgaggattcagccaccaccaccacaggtccacatctggccttcc
-tggagcttgcagcctagccggggagacaggaacaatgaagacacacacacttagataaca
-tgatggtggtgatggtgagtgccgcgatgaaaaccaaagccaggggaggggatagagaat
-gacagacatggtcaggggaggcttctctgcaaggtgagcagagatttggataaagtgggg
-gaacgagtcctgtggaggtctggggagggcattccaggtggaggggcagtaaatgcagag
-gcccagaggcctctccatgggctaacgagggaggcagagggagggagggagtggagggag
-caagggtatgtgtaggagggaagcagggcagGAGTGGGAGCACAGTGACTCGCCTGCATG
-TATTCCCAAGGAGATGGGAAGGAGAGGCGAGCAGAGGGGTAAAGGAGAGGAAGCAGGAGC
-TGCCACTTTTGAGAAGCACTGAGAAGAGAAGCAGAGGTGGGTGGGGAGGGGGATGCAGGG
-CCAGGACTGGTGGGCAGGGGCCCTGCAAGCCCTGCTTACTGGAACGGGAGAAGGCTGGGG
-GAGGTGTTCCAACCTTCACAAGCCACAGGCAACCACCGAGTGACATTAGACAGGGAAGGG
-ATGAGATCAGACCCTGGCATTAGAAAGGCTGGAGTTCTGGGTCCTTCATGCTCTCTCCCT
-TAATTCTTACAAGAAcccatttcacaggtggggaaaatagaggtcccagagaggttcagt
-gacttgctccaggtcactctgaaaggacacagatctggctgcctccagctccccctgctc
-cttgagttccctgctgtcttccctggcctctgcctctGGGCCCAAGAACTCCCAGCCCTC
-AGCATCCATGGCCTCCCCCTGGCCCACGAAGTCCTCAGCCACCTCCTTCCTGGAGGGCTC
-AGCCAAAATCAGACTGAGGAAGAAGTGGTGGGCACCCACCTTCTGGCCTTCCTCAGCCCC
-TTATTCCTAGGACCAGTCCCCATCTAGGGGTCCTCACTGCCTCCCTGCAGCCCCTTGAAA
-CTTCTGATCATTCAGCTCCTGGGATGTCCTGGGCAAAGTTATCCAGGCCCAGGTCCCTGG
-CTCGTGGCTCTCCTCTCATTCCCTCAGTGGGTGCCCTGCCCACACCAGGATTGCATTCAC
-CATCCAGGTGCTTGCTGACTCGGgggcaggctgagtgctgatgagttaatgccccccagg
-agcacccctgagtggatgaggatgggagttggtggaaaaacatttcagtcccctcgcccc
-ttgggtgggacagttctgttgccagagttcccagtgggagggatgcccagttgccaacTT
-GATCCTTATCACACCTGTGCTTGCTTCTTTGGGACTGGCTTCCAGGGAATCTATTTGGAC
-GGGAATTCTTGTTTCCAGGTCTGCCAAGATAACTGCCAAGCCTAGTCCATTCTACCTGCA
-AAATAGCTCTCCAACCCTTGCCTCTGTGACTGCCAGGTCTGCCGCAGCCTCCTGCATCTC
-TGTTTGTACTCGTGTAAAGGCCCCCCAAGCTGTCCTCTTGTTTTGCCCTTGCAGTCTACC
-CCTCCTCCCTCCCAAGGAGCCAAAGGGGTTGGGTTTTAAGGAAAACCTGACCATGGCTGC
-CTGCTGTTCTCAGGCTAAACAGCACCCCTGCAAGGCCCACAGGCAGCCCACCTAACCGTT
-TCTCTACATctctgccccaagccacactggtcaccttcccatttttcaaacacatctact
-tatcaccttctcagggcctttgcacttgctgtctcctctggatggaacactcccagtctc
-ccatggttagctcattccaggcttcagttcaaatgtcacctcctcaaagaggccttccct
-gaccatgcgatggaaactcccatccttcaccactacgcttggcttagccctcttagcttt
-gcttcctctcctttgaactgtttcccatgatctgaactagccttgtttgtttgttGTGAT
-GACGATTGAGCCCCCCAAAGCAGAGAACTTGTCTGCACACACTGGGCATCTGGCTGGCTG
-CGGGTGTTGAGCTGTGAGATCGGCTATGTTCTTGCCCTGCTGCAGTTGACCGTCTGGTTG
-GACAGGGGCTGGAGGGATGAACCAGTTGTGGAAAATGCCACAAAGGAAGAGGAGTAACCG
-GCTGCAGGGAGAGTGGGAGGGCACACTCACTTGGGTGGGTGGATTCTGTGTAAGAACAGG
-GACCTAccaaggtgggcagatcacttgaggtcaggagttcaagaccaccctggccaacat
-ggtgaaaccccgtctccactaaaactacaaaaacattagctaggcgtggtggggcacgcc
-tgtgatcccagctacacgggagactgaggcaggagaatcgcttgaacctagaaggcagag
-gttgcagtgagccgcgatcatgccgctgccctccagcctgggtgacaagagtgaaactct
-atctcaaataaataaataaataaataaataaataaataaataaataaaataaaGTGCGGC
-TGCATTTGCCTCCCAGGGCAGCCCAGGTGTAAGCTATACAGCTTGGTGGAATGTCTCCAT
-GGCTTCTAGGGGATGGCCCAAGAGAGTTCCAAACACATCATATTCCAGTGAATGGGactg
-gtcagcccacagccacatggccatgtccagctgcaagggaggctgggaaatgtaatattc
-tgcaggccacccatgtgctcagataaaaataaagagaatattattcaagagaaagggaga
-cagagtgtgggggatgactgatgatccttgccataAGCATCAGCAGGAAACCACCAGCCC
-CCACTTCCCTGTTTCTGCATGTCTGTTATTTGGTCCTTCCTGTGTGTGATGGAGGGAAAG
-ATGGCTGTGTGTGATGGAAAAAAAGATGGTCCTGAATGAGCCTGATTCCACTTCTGGGTT
-CCCACACCCTCTGGTAATTCCCTCCTTTCCCCCGTTTCTGCCCTGTATCTCCTACAGTGT
-CTCCAGCCCTCCTTCACTCCATTTCTCCCTCTCATCATAGACTGTCTTGGAAGTTCTGCC
-TACAAATGTGGCAGCTGCTGTCCCACTCTTCTCTCCATCCCCTCTGGAAGCCTGGCCTCT
-CCCCAACTTCCTGCTCTGTTCTGTAGCTCACTCAGCGAGGACCAGTCCCTCTCTGTCATG
-AGATCCACTTTTTCTCTCCAACCTCCCTGTGGGCCTCTGTCCTGTCAACATCCCTCCTGA
-CACTCTCTGTGACATTTGACCACCTGCTGGAATCAAAGAATGTGGGCTCTGCAATCAGGC
-AGGACAGAAATGaagatgcttcccctttctcagcctcaatgatctcatctgtaaaatggt
-gtgaagaatgtccacTAACTAATTGAAACAAATTTTTATTTGCAGCCATGACATACCATG
-CATTTAAGTAAGCCCATATGAGCACATCTGAAGGCAGTGATAATACAATCAATAATACTA
-CTGGGAGTGCCTAGCTCTTACTGAGTGCTAAGCTCTTCAGCACGTCAGCTCAGAAATGTG
-GCCCCTCCCATGGCCCCGCCTGCACTCTTTTCTCCTTTTTTGCTTAACTTCCCTTTTGTT
-GCTTCTTTCTTGAGTCCATTTTTGGCTCTGTTCTCTCCTCATCTCTGCAGCTTTCCCAAA
-TTCTTTTTTAAAtttttatttatttatgtatgtatttattttgagactgagtttcactct
-tgttgcccagactggagtgcaatagcatgatctcggctcactgaaacctccacctcttgg
-gttcaagtgattcttctgcctcagcctcccaagtagctgggattacaggcgcacaccacc
-ctgctcagctaattactgtatttttagtagagacagggtttcatcatgttggccaggctg
-gtctctaactcctaacctcaggtgatccactcgcctcagcttcccaaagtgctgggatta
-caggcatgagataccacatccagccAGCTCTcccaaatccttttcccagctctgacatgt
-tgccacacttcatctacctggctggacacctccacttgaagtcctgtggacatctcaaac
-ccagggtgtctaaaatagaactcagcctcttcccctgcaggcttCCAACTCTGGAAAGGG
-CCCAACCACCTACCCGCTGGGTCTGTGAGCCAGGccttcctctcaggcccctcctctctt
-cccctggccccagcctccttccccacttccccacccttccccaccccAATGCACATACAG
-TTGCTCAATTGCTAGTCCTCACATACTGCATTGTGTCACCCCACCTGGTCATTGTCCTGC
-CCATGTCCTCTCAGCACTCACCTTTCCATGTCCAAGGAGTCTTCTGCAAACATCTGCAAC
-TGTCTGaagccaaggtgctggagaactaagagagagtccccaagcagccctcagccaatg
-accgatgggaggtggtggataaataccagccccctgccctgagttgggagacctgaggtg
-tgctcttcactgtctcaagaggacctcaatggggctgagctcccgttgcccatattagca
-attcacttattatgcatcagtggcttcagtggtttactgcagtgtcttcattgtctcTGG
-GCCACATAATTTTATGGAAGTCACAGCCCTTCTCTCTAAAGTCCATCTATGAAGCCACTT
-TACCTCTGTTTGAGAAGCACTGGTCTCCAGGATGACATCTATACCCCTTACCTGGCATTC
-AAGGTCAACCTGCTGACTCCACCATGTGTCTACCCTTCCATGctttgctcatgctcttcc
-ctcctgcctgaaatattcatcactttgcttaatgcttgtctgagttgcacctatccttca
-agactcagctcaagttcacttcctccgggaagcctttcAGACCACATTAATCCTTCGAGT
-GTTCCCCACAGCCCCAAGAATCTGCTCCCCACATGTGGCACAAATAGTGCCTTGGGTCTT
-ACCTGGtttgttccttcagcaaaccaaggttaagttagcattttctctgtgcaaggccct
-gagagctgggagagctggagacatgaggtgagtcaacacagaccctgctctgaggtctgg
-gcagtccagtcgaaagacGTCCAGGACATGGGGTTGGGCATTCCAGGCAAGACCATCAAC
-TCTACGAGGAAAGGGATGATTTTAATTCACTATGAGAAATGAGTGAATCATTTATTTTCT
-TAGCTTAAAACAGGGGGTGGACAAGAGACTGACtctggcccaccatctgtttttataaat
-aaagttttattgaaacacaactatatttcttcatgtatcacctatggcctttacactaca
-atgtacgagtaattgtgaaagagaccacgtggaccacaaacactaaaatatttactgttt
-ggacccttatagaagttccctggccctggcttgaaacactaatacttgtttattatttca
-cacagtttctgaaggccagaaatttgggagtggtttagctgggtggttctggctgagggt
-gtctcaggaggttgcagtccgcagggctgtctgagtctcatcataacacagcagctggtt
-tccccAGTGAAGACTTccatgctaggcacctcacacacagcctcatttaatcctcataaa
-catccttaaaggacagctatgattattacctacatttctcagctgaggaaaccagagctc
-agagagaggaagttatttccctaaggcaaggacagacctaggactggagctcaggttcct
-ctgcctccaaagccccgctcctaaccactgggctgtccttctgAGCACCACGGGGTCCCA
-GCAAATGATCTGTGGCTGGGGATCCAGGATCATTGTGATTTGACTCAGATGTCCCTTTGC
-CAGGGATATGGTCCTACTCTCCCTCCAGTTACCTGCTCCACAGGTGGGGTCCACCTTCTT
-TCAGACCCTCTATCAAGTGAGTCAATGGTACTGTCCAATTCCTTCCCAATATCTTTGCCA
-TCCACCCCCACTCTTTTCCAGCCCCACTGCTTCGGTCTTACCTCTGGCCGTCTGGGCTCC
-CATCTAGAGACAAAGTCAGGGGAGGTGATGCTTTCTGCTGATATTCCTTGATTTTTTCCA
-CCTGATTCACTTTCAGCTCTCCTCTGCCCATCCTCTCAGAAGATGGATATGCAAAAAATG
-ACCCCAGAGCCATAGGAAGGCCCCAAATGCATCCCAAAGTACTGCAGATGATACCTCCTG
-ATCAAGCCCTGCTGCTAATCAATCAATAGAATTAATATAATTATACAATTTCATTTATTC
-AGCCTTCTACCTTCACaaatgcctggaccttggtttcaggtaaactggctcgagttcctg
-cttggtctttgccaacatgtgtccatgggcaggtcttagtctttcctttggcctcagcct
-cctcatctcaggattgctagagggggttaaaGGACATTGCATTGTAATTTGCTTGTTTTC
-ACACTTGGTACATAATACTTGCTAGAACCATGATGCAAAGAGCAGTCAGTCCGCATGCTT
-ATAAGGGAAGCAAAGATGTTCAGCATTATAGAATGCATGGCTAACATGGCCCCAAGATGG
-TCCAATGGAAAGCTCTTCTTCTAATCAAATAGTGAACAATCCAGGAATAACCAAAGAAAA
-AGTtcatcttattatttgttttcacagcagctccatgaggcagaattaattttgtgtgtt
-ttgcagatacgggaacagtaggtgagagcatgagtaactcagctcaggtcacacagcagg
-tgggagagaactggaacaagaacccagtgctctttctgctctacccactgacccATCCTC
-TCACGCATCATACACCCATACTCccatccacccaccttcccattcatgcattcacccatt
-cacccaccttccatccatctaccatccaCCACGTACCTACACTCCCATCTACCATCCAAC
-CACATTtccattcacccatcctcccatccatcaaccctccaatccaccacccacagacct
-tcccatccattcatttacccatccacatattcacccaccctcccatccatccatcTACTG
-TCTATCACCTACTCATTTTCCCATCTGCTATTCACCCCCACCCTCCTatccatccattca
-accatccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccat
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-accctccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccac
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-acccTCCACCcatttatttgacagttgctgagagcctactaaccaccaatcactattcca
-ggcactgagatatgactttgagctagacaaagtcttgcttcatggagctcacattttggc
-tgtgaatggcagcaacagacaaataaatacgtagtttacgtgaggtactgcaaagaaaaa
-ataaagcaggggagtgatgtcaggagtaactaaggcaggatggtagtcagggaggtcgtc
-tctgaaacgggacatttgagcagaagcctgaaggaagtgagctccctgacaacttgggag
-aagagaatttcaggcagagagaacagttgtacaaaggcccagtggtaggaatagaaacag
-cttgatgggattaagaatcaacaaaaaggtcattatggatgaagcagaatgagggaggaa
-acccaagccagctcgggcttgatcatggcaggctttgtcagtcactgtgagtaaccagac
-tttatttcaagtgagttggCCAACAGTGTCTCCCCAGTAGTAGAGTGATTGCTCGTCTGC
-CAGAAAAGGGGCACAGAGCTCTGGACATCAATACTTGCCGATCTCTCCTTCATCAGCCAC
-CCAACCCTGGCAACAGTTTTCAATTACACCTGTGAAAACTTGTGGGTTAAACAGCTGAGA
-TCCATGCCTCAGCTTCTATAGGTGATAAGCCTGTCCTTCCTTAGGTAAAGAAAGGAAGGG
-GCGAACCGTCAGtgagcaccattcacataccttagccggttcagcttcaccaccctctga
-aggtgccatcagcagctcccttttgctgaagagtaagcggaggcccagagaggtcatgtg
-gtgtgtgcttgaggtcacatggctgagaggtggcaccagatttgcccaactctcaagtcc
-catagtctaacgtttcactccacTCAGATTCAACCTCCcaagaaattatttgtttgagta
-cctactaggcaccagactcagagtgagaggcagttgcagattcactcagggccagttttg
-gaggccagcttcacaatcacccagcacagcccatctttctacttgtgaggaaacagaggc
-tcagtgaaggaatgcctttcagatcacagagaggatgaagccaggatattcaaacccagc
-ttattttACTACAACTCTATATGGTAGGAAAGAGAAAAGCGCCCATACAATTTCAGTGGC
-TTGACGTGGAGCCTGGCAACAGATGTGTTCTTGGACTGTTGGCTATAAGACAAACCAGCT
-TTCCCCACTGACTGTCACCGTGTTTTGGGAGACAAAGCCTAGGACTTTGGTGTGTCCACC
-GTGGGTCAATAAATGCCCCCAAACAAGCATATCTTGCAAAAGTGGGGACTTATTAATTCA
-TTGATTCGTTTCTTGATTGATCAATTGATTTATATGTCCCTGTTGGACAAAGGGTTTGAG
-GCAGCCTGGGAAGGAAGTGAAGTGTGGAAACTGGTCATCTTCTGTGCTTCTTACATTCCA
-CTCATTGGGAACATCAAAAAATGAAAAAAAAATCCAGCTGCTACATAGCTGGGGAACAAA
-TTCTTGGTATGGAAGTAATTCTGCTAAGGCTAGCCTCCTCAGAGTAATTCCAAATGCTTT
-TCCTATTTTCAAATTTAATTAGGAGACATTTCTGTAGTGTGAGTCATCATTTAATAATGG
-GGGGTGTTTATTAGGGAATGagtggaaagagaacaggacagctggataattcaaatccca
-gttcttcaagtctctggctgtgtgatcttgggtgagccacttcacctctctgaacatcag
-ttttcttgtctttaaattgatatttacctggcaaggtttggggaaggtctcaactagatt
-atgtacataacaagcttgccagtgttagtacataataggtgtttaataaatattaactGC
-CTTCTCTTCCCATTTATTTTCTTATTTGGTCTTCTAAACAACCTTGGGGACCATGATAGG
-TATGTTGTTTGCTTTCTCTAGCATGAAAACAGCCTCCCAGAAACTACTCAGCCAATCCTC
-TGAAATGGTATTTCCGGTCAAATCTGATGCACCTTCTGAGACTTTTTTTTTTTTGTCTTT
-TCCAGTAAAGCCAAGCACATAGTCATTGTTAGTTTTAAAAAATGTATTTGGATGGGGTAT
-GAAGTTCAGAAGAGAAAGACATTCCTGGTTGGGTTATTCAAGCAAGGATCCCTGAAGAAG
-AGATGCTAGCATTTGGCTAGGTGATAGGAAGGGGACAGGAAACAGCAAAAGGCAGGATGT
-GGAGGCAGAATGAGTTGAAAGATGCTGTTATTGAAGGCGATGGTGGTAGTTTATCCCTGA
-AAGCCACCAAGAGCTCAAGAGCAGGAGGGAAGAAGATGAGTTTCTGTTGAAGAAAGACCA
-AAGTCACTCACTGGCTGATTTGTGCTTGGGAGGAGCATCTCTTTCCCCTGCTGATTGGGA
-GTCTTTTGTTTCCCTGGGACAATAGGCACTGGTCACTGAAGAGTGTGTCTGTCCTCCACA
-CTTTCCCATGTTCCTGTCTCTGGGGAACTCCTCCCTGACTCCGAGAGACAGGATGGAGTT
-GTCAATCAAGATGTCTGTCACTTTGCCTACCAGGGGAGAGCTTTCCAAGTGGGGCCCTGT
-TTTTCTGCTGGGGCTATAGGGGAGGGTCTCCATCTTCATGtgtcaggatgtagccttggg
-gctgctggtgtcatatttatgccacatggaatgaagctgtctgaagcaggaaaggatgat
-attaccaagcaaaaagagatgcaaagctgagtgtggacggaggcctgcttctgatcctgt
-ccatgtacttggatcaaaccatgcctgaactccatttggtttgcaccttatggggcaata
-agggaataagtaattctctttgtttattcaacaggatttctgtcacttggcaattctgat
-taatacaGACTTCTGATTAATACAGTTGGCAAATGAGAGACAAGTGATCTCTTcagaaat
-ggacagagcaggaaaggaacccaccaagcatggagaggttgaatgagagtctcttcttcc
-ccattgactcactgcagccctggatcaggttgctgcccttctctgggactcagttttatc
-atctgtgaaatgggCTGCAGTGAGTGGGAAACAAAAtcatttatttatgcccaaccttgt
-tgcaaaaatgatttaagacagcttacaaatgtattaaagccagagattaggaaaagaaag
-agataatgaaattgtgagaagggggagaaaaggtgaactcaaggatgaggttaggttatt
-gaatgcctgctgtaaagttctggacagttgctaaaggtgaacagacaagtttgttctgag
-attctttgtagccaaagcaagaaaaagaaaatgcagttacgtggatttgtaggaaaaaaa
-aaaaaaacaacccggttcctgagaagaagcccaacttttcttagaataaaagtctgaaac
-aattttccttgtggttccccatcaaaaggactttgtgaaataccatgagcaaATATAAAA
-ACCAGAcaggttgagtatcccttatctggaatgcttggaaccagaagtgtttcagataac
-agattcttttggattatggaatatttgcatatacagtcctacctcgggtataggacccaa
-gtctaaacacagaattcattcatgtttcgtgtataccttatacaagttacctgaaggtaa
-ttttatttttctgtgtgttgtgcacctgcattttgactgcaacctgtcacgtgaggtcag
-gtatagagttctctacttgtggcatcatgttggtactcaaaaattttggattttggagca
-ttttcaatttcagattttcaaattacaggtgctcaacATTTAacaggctggggtaaatag
-ttgcaacatatttaatagtcggaggattaaaatccacaataaaataagagctcccacaaa
-tcaataaggacaaaggaaaaaaacactccatcaataaaatgggcaaaaagggataagaac
-acaattcacaataggggaaatAGctatcaaattagaaaaaaatatcagaagaatgggtaa
-tatcagtgttggtcacagtgtggggaaataggcatgctcagacacCttaacttactttta
-gcgtttctcgtcacctgacacaccatatatatacgtctctacgtgttggggatctctctc
-tctgaccagattgcaagttccatgagagtaaggactacctcctcatcactgctgaattcc
-cagaacctagaacagtgtgcccagaacagagtagatccttgataaatatttatcaagtat
-gtgagtCAATAAATAAATGAGTGAATGAATGGACAGTGTGTAAACTGGGGTCATATAttt
-ggcaggcaatttggcaacatttattagaatgaaaatgcacaaacactgatgcagacattc
-ctcctttagccatacgctcgactgagacatacaaatattcaaaggaatgggtcaaagagt
-gtttttgtagtgctgtttaaatggcaaaagttggaaatgacctaaatgccaaacaatact
-acactaataaagttatggtttattctgactgtgaaatattgtgtgttcttctttaaaaaa
-atagtgttttcatactgatgtggtcagatctccaagatacattatcaaaagaaaatagca
-agtcacagaacaataatatgtaacatttacggtaaaaaCAAAACAAACTTTccaggcgca
-gtggctcacgcctgtaatcctaacactttgggaggctgaggcgggtggatcacgaggtca
-ggagattgagactatcctggctaacacggtgaaacctgtctctactaaaaacacagaata
-tcagccaagtgtggtggcacgcacctgtaatcccagctactcgggaggctgaggcaggaa
-aatcacttgaactcgggaggcggaggttgcagtgagtcgagatcacgccactgcacccca
-gcctgggcgacagagagagactccatctcaaacaaacaaacaaaaacaaacaaacaaaaa
-acaccacaaacaaacaaacTCAGTCTGTCTGGTTAGCTAGCTActatctatccatctatc
-tatccatccatccaCTCGCTTACATTGGTCAACCTATCAGTATAAACAAATAGAAACATA
-TCTAGAAGGAAATACCAAGCTGTTAACAGTTCTTCAGAACAAGGGAATAAAATGTGGAGG
-TTTACACAAAGGGCTATTTTTACTTTAAAAATAtatttcagtataatatgcacttaatgt
-gcatagataggttggcaaatgataaagctttacaaactgtatttatccctgtcagcatca
-ctcagatgaagaaagagatatgaccagcaccccagcagccctactgttatcctctcaagg
-aaaactatcactgcccttctattacttttatcaccctagactagttttgctaatttttgg
-actttatataaatagaatcaaaaagtggatacaattttgtatctttcatctttggtgcaa
-tattctgtttatgtgaATATTGCCAAATGGCCTGACACTCCAACCAGTGTGGCAGAAGGC
-CTGTTCCCCCCATGCAGCCACCcaatacattttaactaacctgtagtctgtattttgttc
-agtcccagtaatgtcctttacagctttttttctagtttgggattacatgttgcatgtagt
-tgtcatgtctctttagtatcctttaatctggaacagtttctcagcctttctttgtctttc
-atgatgttggcctttaagaaaaatataggttagttgttttatggaatgtcacatccctca
-ctttgggtttgtgtgatgtctcctcatgattagactgaggttatgcattttgggcaggaa
-tatcttgtaaatgatgctgtgttcttctcagtctatcacattaagaggtacacaatgtca
-atttgtccctttattagtgttaactgatcatttggttaaggtgacatccagtttctccac
-tgtaaagttgtttactttttcttttgtaattaaaaagtaattttaggaagctactttaat
-atctttatctattaaatatccttttccttgtcaaaGCCATGGTATGTTTAAAATGTGaat
-ttctttctaagttcaggggtacatgtgcagatttgttacacaggtaaacatgtgccatgg
-gggtttgttgtacagattatttcattgcccaggtattaagcctagtacccattagttatt
-tttcctgatcctctccctcatcccacgctccaccctccagtaggccccagtgtgtgtcat
-tctcctctgtgtgtccatgtgttctcataatttacctcccacttatgagtgagaacttgt
-ggtatttggttttctgttcctgcattagtttgctaaggataacggcctccagctccatcc
-atgtccctgcaaaggacaggatctccccttttttatggctgcatagtattccatggtgta
-tatgtaccacattttatttatctagtctatcattgatgggcatttaggttgattccatgt
-ctttgatattagtgctgcaatgaacatacagttgcatgtgtcttcatcatagaacaattt
-atatttcttctttttttttgtttgagacagagtcttgctctgttgcccaggctggagtgc
-aatggcacaatctcagctcactgcaacctctgcctcttgggttcaagtgattctcctgca
-ccaccctcccaagtagctgggattacaggtgcccaccagcacttccggctaatttttgta
-tttttagcagaaacggggtttcaccatgttggccaggctagtctcaaattcctaacctca
-agtgatctgcctgccttggcctcccaaagtgttaggattacaggcgtgagccaccgcacc
-tggcctttacattcctttgggtatatacctagtaatgggattgctgggtcgaatgatctt
-tctgtctttaggtctttgaggaatcgccacactgtcttccataatggttgaactaattta
-tactcccaccaacagtgtactgagcattcctttttcttcacaaccctgctagcatctgtt
-attatttgattttttaatagtaaccatcctgactggtgtgagatggtatctcattgtggt
-tttgatttgcatttctctaatgagcaatgatgttgagctttttttcatataattgttggc
-tgcatgtatgtcttcttttgaaaaatgtctgttcatcttctttgctcacttttttaatgg
-ggtagttttcttgtaaatttaagatcctcatagatgctgggtattagactgtggtcagat
-gcataatttgcaaaatttttctcccattctgtaggttgtcactttgttgatagtttcttt
-tgctatgcagaagctctttagtttaattatgtcccatttgtcaatttttgctttcattgc
-aactgcttttggtgtcttcatcatgaaatacttgcccgtgcctatgtcctgaatggtatt
-gcctaagttgttttccaggatttttatagtttgtgttttataAAATGTGAATTTCTTAAT
-TGAGAGTAATGGGAAGCATTTATTCCTGTGCTCCTGAGTCACCGGTTTTCCTTTTTGATG
-AATTTTGATAATCATTTTTTCTCACTAAAATTTAAAGGTTTAATTTTTAAAAACTGAATG
-GTTTAAGCTTAGCCCTATAGTTCTTGAACCATGATTTTAATAATAATGATTTTTTAATCT
-TCATTGCTCTAGCACCTTTAAGAAGGATTCGTTTGAAAATTCACCTGTGTCTCAACCCAG
-GAATAGGCTTGGCCTTCCTTCTCTGATGGCAGCCAGGGAGCTTCCTCCCATATACCGTGC
-CCACGGGAAGGAACAGAAATGCTTCCTGTCACTCCCAGGGGTCTCCAGCTGTCATAAGCT
-GCCAGCTGGAGGTGGTCCAAGCCAAGATTACAGCCGGCCTTTATCCTATAGTTATCACCC
-ACAAATCACCCCCTATCCCCAACCCAGGGGAGTCTCTCTGTCCATTCCATACCCCGGATA
-CTGAACTCAGCTCCAGAACCAGGGACCTCCTGCCCATTCACGATGGCCTTGAGCTCCCAG
-TGCTGTCCCCACCACTCAAGATTGTCCCATACCACCTTTCCCACCCAGCCCAAACCTCAC
-AAGCCAGGTGCATGTGGTGGCCTCTAGGGAAATGAGGTTTCAAGGTATTTTAGCCACAGA
-TCTCTTTGCTCAAATAAAGCCCTACACAGAACCCCAGCCCATTCAACATTTCAAGGTGGA
-GCTGAAATCCTTTGTGGGTTCTATTTTTCTCTCTTTGCAAAGCATTTCCAGCTTGTGGGC
-TGATTGTCATATAATCTAGACAAGTGTTAATTAAAGAAATCACTCAGAGCCTGTATATAC
-AAAAGGTAAAAATTTTAAAATCTTTACAGCTAAAAATATATTTAATGTGGTACATTTAAA
-AATATTTGATACAAGGTGGGGATCCCAAACAAAGAGTGCCAGGGGCCTATGGTGAGCCAA
-CCTCCCACACCTCCCAAATAAATCAGTCATCTGGCTTTGTCTATCTCTACGCTCTTCCTA
-TGAGTGTTATCACACTCAAATTGCATATTGATGGGATTAACCCTTTAAGGTCTCTTTCAC
-TCCACCATTGGCTTAGTGAGGCAATCTAGTCCATCATTGTCTCCCCAGCTCTGAGAAGCG
-AGCACTATCATAAAAGAAAAGAACTATTATACAAGAAAAGATTGCTACAGTGAACTAGAT
-TAATGTTAACAGGCTCCTTGAGGTAAGATGCTAAAAAGCATCAGAATGAATGAGTGAGTC
-GATAAATGAGTGAATCCACACTGTTGCTTATGAGGTCTGTGGGTGATGACGCCCCATGTG
-CATGGCAGTTTCAGAAGGGCTTTCAGGGTTTAGATTCTGGGGAAAGGAATCCACTTCACA
-GACCCTGCTGGTGCCGAGCCACTTCTAAGAGACCAAGGAGCCTGGAGCCACCCCATTCCT
-CCCAGGGGGTGGGGTTAGTTGATGCTGTCTGGTGAGTGACCAATCGCATCAGCACCTCTG
-CTGACCCCATGGGACTCCGCTACCTTCTCTCCTGGACTCCTAAAACTGCCATTTCTCTGA
-GAGGGGGAGGAGGGCTTCTTGCTTCCAAAAGGACTAAGCAGGGTTCTGGCAATGGGGACA
-GGATAGTCGTTCCCTGTGGCAGGCTGATGTACAATGGGATGGTCCTGGGGCCACATCTGG
-GCACAGACCCCCATTATCTTTAATGGTGCTCTTGCCAGGGGGACACTGCAGAGAGGAGTC
-TACCACGAGGAGACCTGCTCTCCCCTCCCAAGCACTGGAGCAACCTTGGCCCTGCCCAga
-aaaaggcagctgtagggaaatggagctgagtttaaatgcccactgggcacttagtagcca
-tgtgaccttgtgtaggtgactcctcctcttcctctctgggcctgagtttcctcctccata
-aaatgaggcagtcatctttgcagctctgcacccacaaagtgccattgtgagggtcaaata
-agtggatgtaaaagggcttgcagagaaccctgcagatggaaggtgGACCTTTATAAGGGA
-GAAATAAAATCTTATTAAGGAGAAAATAAATTCCCAAGAATGAGCTGCCCAGCATCTTTA
-AAAGAAGACTGCAGAGTGGACAGTGCTCAtacctgaaatgttttttttattcctctacca
-gtcagcctcctacacatcccagaggaggcagtgccttccccagaaagccctgccaggctg
-cactctgtcctcccatcctgctgcctccagcacaatgctcatatctgactgtctgtctac
-ctgacatctcccccactggtctggtgctcctttgggaaggaactgtatctgatgcaacca
-ggaatttcagctcttagggcagagtctggcgcatctgaggcacacatcaatattCTGAGC
-CAGACTGACTGGCTAGAGTAGAGCTAATGGTAGAATGTCGGGGGCTGGTGCCTAAGGTTG
-GGGTAACTAAAGACGCAGGCAAGCCTCACACTCCCTTCCTAGAACCTTATCTGATTACTT
-TCTCCATCTAGGTTTGAGACGAGGTCTAGCCGATCCTGCCTACAGGCTGAGTGAAAGCTC
-TTTAAGGTAGgggtgaccagcttttcctggtctgctcaggactttcctggtttgagttct
-aaaacgtcccatttcccaggtaaaccagggcagttggtcatgctaCCTTAGTTACTAATT
-GATTCTCATAGTAGACATTGTAATTACTCACTGATTGTATATTACGCTTCTCCTTCCTCC
-CCCTTTCCCAGGCTGGCAGAGcccatctcttaggacagaggctgaaaacggaagatagtt
-tcccagcctctcttgtggtgaggggttgccatgtgaccgagttttggccaatgagacaaa
-agggaaagtctgctgggaacttctgggaaggggttttttctctctatctaccttcacccc
-ctctttcttcctgctttcggtcgtgagaatgtgatgattagagctgtgacagccatcttg
-tgaccacaaggaaacatccttaccacactctgaggggtaaaacgaaggacagtaaaagct
-cgacactttgatgacattgttgatcctctgaaCGACCCTAGGACttgaacaacattaaaa
-tgttacatgttgtttatcaaaagacatcattagaataacaaaaaggcagcctctgtgctg
-ggagatgatatttgaaatctctccttgaaaaggactcgtatacagaatactcaatgatag
-ataactcagttgttaaaaattggggcaaaacttgaaaagaaactctagaaaagagaaaat
-taaaatggccaataagcaaagcacacaaaaaggtctgaacatcattattcatcagggaaa
-tgcaaattaaaactacagtggggcccgggcctgttggctcatgcctgtaataccagcact
-ttgggaggccgaagcaggcatatcacctgaggttgggagtttgagaccagcccgaccaac
-ttggagaaaccctgtctctactaaaaatacaaaattagctgggcgtggtggcacatgcct
-gtaatcccagctacttgggaggctgaggcaggggaatcacttgaactcgggaggcagagg
-ttgcagtgagctgagatctcaccattgcactccagcctgggtaacaagagcaaaactcca
-tctaaaaaaaaaaaatacaatgggatacaatctcacacttaccagagtggctaaaattaa
-aaacactgaaaatacaaagtgtcggtgaggatgtggagaaactggaactctcatactcta
-gtaatactaataataggagtgtaaatttggacagttgctttggaaaactgctaagcaata
-gctactaaaactaaacacagacttacctgatgaccaggtatttacccaagaaaaataaaa
-acatgtccacaagaagatgtgtatgtagatgatcatagcagctttattcagaacagcaaa
-acacaagaaacaccgccaacgcctgtcaacaaaagaacagaaaagtaagttgtgatatat
-ccatacaatggatgtatatgttattttatgaatatataaaatggatatattggaaatact
-acatggataaaatagttactttttaaactacatagcagtgaaaaagaataaactactgac
-acgtagcaatatggatgaatcttaaaattatattgtgcaaaagaagctagacacaaaaga
-gtacatacagcatgattcatttctatgaagtttaagaatgggcaaaaccattctatgctg
-ttagaagttggttagtggttaccctttgcaatggcaggtggagcagtggggagcagtagc
-tgggaaggaggtatggggatgccaaatgggatgtcaagaatgttctacatcttgatctag
-atcatatacttgcaaaaaattccttcagccattacagctcaagattcgtgtgctttattt
-atgcaatacagcaatctaaaaCATTAAAAAATGAATAATCTCTATGGTTTAAGGCACATT
-TAATCGAGTATTCTGTTACTTGTAGCGAAAAGCACTCTAACACTCCTCAACACAATTTGG
-CGACAGAGGATGTTTGTTGGGTGAGTGATGGTAATACCCGTGGAATAGCATTCTTACAGG
-GAACAGGGCACATTCACGCcattaacacctgtcactctcacttcagtcccaccagggagg
-gtttgttagtttcctctaacagatgaggaaactgaggtccagagaatcgcactgacctgc
-tcagagtcacacaacgagctttttttttttttttttttgagatggagtctcactgtgttg
-cccaggctggagtgcagtggcatgatcttggctcactgcagcctccgcctcccaggttca
-agcaattctctgcctcagcctcccaagtagctgggattacaggtgcccgccaccatgccc
-agctattttttttttcttagtagagagaggttttgccatgttggccaggctggtcttgaa
-ctcctgacctcaagcaatccacctgcctcggtctcccaaagtgctgggattataggcatg
-agccactgtgcccagcctacacagtgagcttttgaccaatctagaatttgggcccaagat
-tgtttaatcccaaacccagtgctctttccgctacacttctctcaccctGGGCACATCCAC
-CAACAACATTTGTTGAACTCCTATTCTGTATACTTCAGGGAAACTTTATCTGGTCTCTAC
-TTCCACTGAGCTTGTGGTCTAGGAGAAGAACAAGAGTTTTATCTAACAATAATAATTGTA
-TTTTTAAGTGCTTACGTTTATTAAATACTTACTATCTCCTAGACCAGCCTTTTTCagtgg
-agtccatgtattgcagagtatactccactgggttgcaagaaaaacaattagtaattctat
-ctgtatatttgatctcatcttttaaaaattttcattttgtgtatatcatataagatgata
-atatattgattgataatatattatgtttttactttgtaaatgtacatattaaatatattg
-ggggcaatgttcaCTGACAAGAATGGGACACCTAAATCTTTAAAGACCCATTGGTCGCCT
-GATCACATGATCCCATCTGGCCCTCATGACACTCCTGAGGACCAGAttttttttgttgtt
-tttagagacagagtttgctatgtcactcaggctgggatgcagtggtacagtgatggctca
-ctgcagccttgaactcctgggctcaaatgttcttcctgcctcagcctcccaaagctctgg
-gattacgggcatgagccaccatgcGTGACTGAGAACCCGATGTGTTGCCCCATGTTACAT
-ATGAAgatacatctttaaggtaatgaatatcccaatcacccagatttaattcttaagcgt
-tgtatacaggtatcaaaatatcacatataccccccaaatatggccaactattgcatgatt
-aaaaaataaaagaaaaaaGAAAAAGAAACCATCTTTAGCAATACCCTTTTAAAAAGTgct
-ttttgtttgtttagctttctttgaacatttgacccaagtcttccctcactcagaaaacca
-ctctgtaaaacatccctcaacatgatttcctcacagacaaacctgtctgataatttaatg
-ctgctgccatttttttttctggagctctgaactttgatgcctatctggactagttttgct
-ctagacttggggcacagataccattaggaattcctttGTCTCTCCTGTGTTGAAACCACA
-GACTGCTATATCTCAGTTCATCATAGAAAATTTACAAAATAAAAGCCACAGAGATTCATT
-Cccctgcctgtgtctaagctcttgtccaagcccctctcacattgactctgggcttggtca
-cgtgacttgctttggccaatggcataatggcaaacatgacacaagcagcagctggaaaat
-tacttgtgcatatgagcctttgccctttcagctctggggaaccctgtgaccacaaccagg
-ctggcagcaaacccaggctggtttgctgaagtataagagaccgatggctaaatcatctct
-gttaccccagctgtgccaagccaaccagcatatatatgtgagtgaggccattgacgacca
-gctgacggcagacacaggagagaagccagccaagaccacatggagcccagcccacgccac
-tactgggctataggttcataagggaataaatggtggccgttttcaggcaatttgttacac
-aggaaaagctCATGGttcctcttcttggtttagttcctctttttggtggagcacagcccc
-tggtagcATGGAAGttttaaaacatgtgcaccaatcctttgacacttgtcccatcagcag
-atagggttcatgacaccttcccttgcttgggcctgtaccttagtaatgcagcaaaagtga
-catggcataacttctgaagataagttagaaaaggccctacagtttccacctggttctcct
-gggacactcactccggggtaagccagccattgaggaagaggtatgagatcaccgtgctgg
-aaaagctacatgtcaacacaccactcaacaatccagtcgagacagccttccagccatctg
-ggccaaaggagccagactggtgagtgatgtcatcttgggccctccagaccagctcatcca
-ccagctgaagaccactaagtgagctccatcaacaccacgtggaacagaatcatcacccag
-ttgcaccctccctcagtttttaacccacaaaattaatccactaattttggtgatggtttg
-tcatgcaacaatagataaccagaTTCTATGCCATGATGGGAAGTTCTGCAGTTTCATTGG
-GAAGTGGCAGGCATTCTGGGACAGAAAAAACTTGGGGTCATTTGTGCAATCTACTGCAca
-gatttttaatctctggtttcttactctctgttccttccagagagcttcttgttcacattt
-tactgctgcaatatctttatcactcaagggatattaattgtaggatttattttaagtttt
-ctcttgttccctggattcttttcttgaagaccttttaccccgccctcatggtttgctttg
-atctctgcacttcatgatagaaatttctaatgatccttggctgtctactcacattaccac
-tctggctggaaactgggtggggagggtggactggtaggcttttgtgtagggtccatgcag
-ggtggttgcatagggctggtgcaaaggggctggttggctttttctgtgatgcactctcct
-cccacccccaattaccgtatctttaggtctttgtcctggaagtggttctccagataattt
-tctgcctggggttggacattctagaatgagacgggtgaagggggctgaagatctcACCTT
-CTctgggcctgatgtttctagttttggagtttctttgttgcctttttttcagagaataaa
-cctccctttgcttgcccagaagtgagtggggttactacctggctgggcaggatgggggtt
-ggggacgtggaggtcccatgctccttgtacagattgctttcaatccccacttcaccagca
-gctcctccaagacctagtagcttcaatttttgaggcctttaggCAAATTGGCTTGTTTCT
-CTATGCAGCAATCCACCCACACAGCAGTCACCTACCCCATCCATTTAGCTTTGACTTTCT
-TCCTCTCGGTTATGTCACTGGCCACTTCATCCATTTCCCTCCTTTGTAGTTCAGGGTTAC
-AAATGTCTCTCGATTTCCTCAAAGACAGAGTTTTTGTTTCTGCTCCTTATTCTTGTTTTG
-GGGAAGTTTTTTGTTTGTTTTTTTCTTTTTTAAGAAGAGAAAAGGAATAGAAATGTCTTT
-AGTCTACTATCTTAAAGCCACCATTTCATTAGAGTTTTAAATGGAAAAAGCACCCTCTTA
-TATTGGACAGAAGTGTGTCAGCAATGTGGGTTTTGTGACTCTTACTGGAGTAAGAGCCTA
-CATTATACGCCAAGGTGGCTTCATGTTCTAGTTTTACAAATGCATTTGATACAGTTAATA
-AAATAGCAAATTATGTATTAAGGAGAATACAGATAAGTCATTGCTGGCTTGGCAGAGAGT
-GGAGAGCAGCCTTGACCAAAAAGCTTAGAGGAGGAAAAGTGGGGTGGAGGCATGAGGTTG
-ACCTGTCCCTGCTAAGTGCCACTGTTTTCAgctcacccctttccacctgcaggtccctgc
-tcagatgccacctccttggaggatccccacccacctgtcactttctctctactaacttgt
-tttatgtctgactgcctgccaatggatttgattgacttatttatctttaggtttgtcgac
-cccactagatcatgggctccatgaccagggggagctttgctttttcacctccatacactc
-ggtgcctgtgagcacctggtacatcagtagatgctcaataaagagttgttgagtgaacaa
-atGAATGAGCCAGTGATTGCGTGGATCCATGTTTTCTATGAGAAGGCAGAGCTCTGAGGA
-CAGACAGAGGCCCAGTGTGCATGAGAAAGTCCTGCTGGCCCAGGCAGTGGCCTAAGAGCT
-GCCTACCATGGCGGTCACTGTTCTTGGGGAACCACAGATGTTTCCCCTCTAATCCCTCCA
-TGGGGACCAGGGGGGCATGAGAATGGGAGAGAACACAAAGTCCCTTTATTCAGGGGAGTG
-GATTCCATCTCAAGACAAATTGTTACCTCCAAGGCCACCAGCCGCCCAGCCGGCCCATCA
-CCATGGCCTCCCTCTTAAGGATGTGGGCACAGGCCCGGCCAGAGCTGAAATTGCCCTGGA
-AACTAGTCTCCCCTTTAATTAACAGGGAGGGCGACCAGGCCTGCTAACGGGGTGGGGTAT
-GGAGTCGGGGTGGGGTCAAGTTCATAAAGTCCCCAAAGAATCAAGGCCTCCTTGTTTATT
-TTCCCGAAAATGTTCCCCATTACCCAGAACAGCATAGGGGCCAAGCAGGCCGCAGGCAGG
-GAAAAAGCTTTAACCTCCCCGCTGCTCAGCTCAGCACATCACTATTTGACTTGCATTTTA
-AAAATAATTACAAACTTAATGAAAAAATAACCTAACCCCCAAACAGGCCAGGGACTCATG
-GCCAGCATTGGCAGGAGCAAGCCCCTGGCAGCTGTGAGGATGAGATGCAAAGGGTATAGA
-GGAACCACTGGAAGACAGGGGACACCCTTTAGATGGACACTCCCTCTCTCTAGCGCCAGC
-TTTGGCTCCCTATTGCCCTTTGTGTCATGCCCAAATGTCTCAGCCCATGTCTTAGAGCCA
-GTTTTACTCAGGCCCTATGTGGAAGACACTGGAACCCAAAGAGGAAAGGAAGTTGCTCAG
-GTTGTGCATTGTGTGGGACCTGATGCAGGTAGTGAGGCTGGTTGGGATGGGTTCTCGGGG
-AAAGAGTGGAGGAAAGTGAGAATGTGTCTCTGTTACCATCTGAGCCCTGGCTGGGTATGG
-CCAACATGCCAGGTAAGCAGCCTTGGGAAGCAGGCACGATGATTATCCATCTTTAATATC
-CCAGGACTTGAGTCCAGGTCTGTCGGGCTTTTAGCCACCACACTAAGTGCTGTAAAAGGA
-GCTGGAGGTAGAAATGAAGTAACAACAATAATaataataagcagctttcatggattgtag
-actatgtgccgtgcactgtgccaagctctttaccatctcttttaatctttgcaataactt
-tatctggtaggtagtgttattgacccattttacaaacgacgcccagagcattggttcaag
-gttgtgcagctgggaaatggcCTGTACTCTTCTACCCTGAGAATAATGCTCTACAGTGAG
-TCAGGGAGTCTtgtgaggtctcaagaacagggaccttgtctgtcttattcacttgtgtgt
-cctcagagcccagaagagagactggcatataatagatatttaatatctgtgttgtgaata
-agaatgaaCAAATGCACCTGGACCTAGAAGTAACTTCCGATGAACCATCCCAGTTCTCCC
-TTCCCCATTCCGGATTATCTTTACTTACCTGGAAGTGAACAAGATATTAAGGGGCTCCAA
-AAGAACTGAGAAATAGAACTTGGTTTGAAAGACAGTAGGGAGCCACAGCAGGTCCTTCAG
-GAATGGAGTTCCAAGCTAGGGGAGTGATGGTCTTCCTGTGTCTTTATGGATTCCAGGAGC
-TAGTCAAGGTCAATGAGCCTTTAGCCAGAAGGTCAAGTTATCCCCAGTGGTAAGTGTTGG
-GGGAAGAGGAGGGCACTTCTCAGGAGTTGAGGGTCCCAAACTTGTCATGCTCATTGGTTT
-TGTGGCTGAGAGTGGCAGGTTCAGGCTGGCCAGCCAGCCTCTTCAGCTTGCCCATGGTAA
-ATCCCATGATCCTGGGTCAAGGACGCCCAAACATGGTATGTCCATAGCCAGCTGACAGAA
-TTCGTATGTCATTGAATCTTTCAACAATGGATTCTTTGAAACTTACAACTCTGGGGCCTT
-TGAGGTCCATCTCAGATTCTGAGGCTGTAGAAACTGTTCATTTTAGAATAATGATAGGTA
-CAAaacatttactgagtacttactactccagacattgtttacaaatatcaacgcctttaa
-tcctcacaaccaccccagaaggtagtaacaatgtgaccccccacttcacagatgtgaaga
-cggaggcactgaaaggtgtaacttgcccagggtcacTGGCCGCCTGGCTCTAAAGCACAC
-AGCACTGCCTCACAGACACTTAAAGTCGTTGAGACTTACACTCTTCAAATTTTAGAATCG
-TAGAAAGTCACAAGGTCAGGATCTTCAAGCCACAGAGTCTTAAAATCATAGCACTTTAGA
-ACCTGCCATCATTGACTCATCAAATTCTGCCGTCATAAAATCTGGGCATGTTATAATCCT
-GGAATTCCAGATTCTTGGGGACTTTTAAGTCAGAGAAGTTTAGatcctgggatattaggc
-ttggattacagaccctagcccagtcctctcatatagcacagggaaactgaggcccacaga
-agtgaCAGAAGTCCAAGAGAGGCAGAGCCTGGTGGATTCAGTGTCATGTTTGGAGGGAGA
-AATCGGAGTGAACAAAGAAAGCCCCTGGGCAGGCAGGAATCTGTTTGTGATTAGCAGTGG
-GTTTTAGTGTTGCCGAGGAATGTACCCAACGTTACCGTTACCCCCGCAGGTTGCTGCCTC
-CTTTCTTCCCCCTCAGATGCCCTCCTCAGAGCCCATCCTGGCCAGACTCAATATCCTGTT
-TCTACCACCAGCAAATTGAATTTTCAGAAGTTGGCCTCCTAACGAAGCCAGCTTAATACG
-TTGGAGGTTTTCTTTGCCTGCATTGCTATTTCTTGGTAGGATGCCTGCTCTTCAGGAGCC
-CAGAGAGGTTTTGCACACTCAAATCACAACGCCAGGAGGGATGAGGGACAGGAACTATGG
-GACAGGTGGCTGGGGGCTTAGATAGACCCAGAGGTGGGaatagaaatggcgtgtctcaag
-ggggaggtgacaggtccacagggacctccgtactgctcaggccacacctgggaatttggg
-ggccttcagtctttcagaaacattaaccaaatggggtttgtttagaggagggatggggag
-agatgggtgggaatcccatgCTCTGGGAGACCTTGAGCGTGGACTAGATGGAAAGAAGCA
-TGAATTCTAAAGTTCAGCCTCTCAGCTACTGCCCCCTTGAAGACAGACATGGGTGGAGCC
-CTGGGGTATAGACCTAAGATTGAATGGTGGAAACTCCATGAAGATTTTGGTTTTATCAAA
-ATCAGTGGTTCTCAggctgggcatggtggctcacacctgtaatcctgaggcgggcaggtc
-acttgagatcaggagttcaagaccagcctggccaacatggtgaaaccccatctctactaa
-aaatacaaaaattagctgggtgtggcatcagacacctgtagtcccagctgctcaggaggc
-tgaggtaggagaattgcatgaacatgggaagcagaggttccagtgagccgagattgcacc
-actgcactccagcctgggcaatagagcaagagcctgtctaaaaaaaaaaaaaaaaaaaaa
-Gcaatggttctcaaagtacagtacagtccagaatctgtggggttcctgagaccattccag
-ggcatccacatggtcaaaactatattcacaacaacactaagacattatttgttcttctaa
-ccctcagtggggttgtccaaagttgatatgacatgtgatgccaccatcactctgatagca
-atgaaaaaaattaatgcaaaaacattcatgatgaacaaaatactaaaactgtaaataaag
-agaagactaatactactgatttttcctttcatctcaggcttcagtgtgaatttttcaaaa
-tattgcattaaaatgtcctaattactgatatttttggcacacaaattttaaacctgaggc
-aagtgcctcgtttaactcactctagtcctggcTGtggatataatccacatcaacagaagc
-ttgttggggtcctcaataatttttaaggatataaagtgtgctgagatgaaaacatttgag
-ggtcactgataaaagggataatgttccatcagctcaaactatccaacaatggaggggatt
-atattccaaggtactgagttcccatcacaaggtgtgtacaaatgggggGATTAAAGGATT
-GGGTGTGGGGAAGAGGCCTAATGTGCAGCATCTCTTGCCCAGGTGCCTCCTGTGGTCCCA
-CCTACCTGGCATCCAATagatcttctcattttcccacttgaaagcttgcaatggtacccc
-actgtgctctgagcaaaaacccacctcttctccatggcctaccaggctctatgtgtcctg
-gccctgtctcccactcttttgcccctagcttgctctgctatccccaacctagcctctttc
-tatttcttcagcatgccaaactctttcttacctagggattttgcacacgctgttccctct
-gcctggaacatcttcctcttcactcttctcatggctgttccttgtatcttctgagtttca
-acttgactgttgcctccaggaaggcttccctgatcaccctatagtaagtaggatttctct
-gacatcatctctcaacctcttttttgcttccttcatggaagtcatcactgcttttttata
-tttacttgttggcatggatggttctcatctattctctccatgagaccatgagctcctcca
-gggcaggaagcctgactgttcagacatggggcctcagcacctgacccagcacctggcatg
-gaggaggcccttgagaagtgtttgttaagcaaataaaCAAATCCTTTatgaattagtgaa
-tgaatgagtaaatgaatgaaAGATTAAACAGAAAAGGCCTCTGACTGCTGATGCTCAGGC
-ACTCACCAGGAAACCCAAAGTAACACAGGTTGTTACTTTGATGAAACATCAGTAACCATG
-GCTGGATAGTGTGTGATGAAGTATTAAGCAGTAAGTGTTTGCCCACTACCCATCAGCGCT
-GATCAAGTTGGAGGAGAGGGAGACTGGCCTGGCTGCAGAAATCTTGGATGAGTTGGGGCT
-TGAACACAAGCCTTCAGGGCTTTGCCAAGGCAGGTTCCCCTGCCTAGTTTCTCTGAAGAT
-TCACATTGTATTCACTGTGAGGGCTCGGCTCAAATAACCCTGCCTCCTATGGCTCTTCCC
-TGACTCTTCTTGGGTAGGGTCGGAACACACCATCCTTGTTCTGGGTGTTATTGTATTAGG
-ATAACCACCCTTGTCTATCACTGATTTGAAGACATTAGCTTATAGAAATGTCCCGACAGT
-ATAGATGTTATCCCAGTTTAGAGATGAGAAAAGTAAAGGTCCCAGAAGAACTTACATTCC
-AGTGGAGGAGACTCATCACGGGCAAAAAACCAAACCCACGTGTTGTGAGTGATAAGAGTT
-AAGGTGAAGAATGTTGCCGCGGAAGAGGAGTGGGGAGACCTCTCTGAGGGATCAAAGAGA
-TGTGGGTACAAATTCCATCTAATAGTGTCAGCTAAAGTTCAGTTAACTGTTACCACTAAC
-AATGAGTTAGCtgttgcttccaggatgtctgtttcacgaggacagggactatgttcactt
-ttctgtccccagcacctagaacagtgaacaacacatagtaggtgttccatgtatggtgtg
-aggtgaataaaGGCCTGCctgcatcaggcgttgtatatgaattattttatttaatctcca
-tggtcagagaggtaagggttatcatccccattttgtagataaggaaatgagggcacagtg
-aagttaaagtctaatgacttacccaagaacacccagatagtaaatggtggagcccgagtt
-ggattcgaatccagtccaatctgtctcgtatcttagccactctcctacacAGccttattc
-tgctcactcactgtgtgaccagggcatattgcctaacctctcatccactgaggatgtcat
-tttctttagcttttgaaataatacccatgtcatagggttactgtgaaagtttggttcagg
-tagagctcttagattcctgtctggcacacagtgaCACCTCTTTTCAGGTGACCCATTCTC
-GTTTGATATTGTCAGCCATTGTGAAATAAGAGGGTATAGAGCAAAGCTTTCCAAATGGAA
-AAACCTGCTATGATTTCTAGAAAGTCTTGGGAAACTTTCTAGATCAGTTATGGAGGTTGC
-AGAGCAGAAGGCCTCAAGGACGAGATGCAAAAACAGCACCCATGCAAGTTGACTTGTAAA
-CTGCTTTCTTCATCCTTTAGGAGGAATTGCCCAagaggcagcatttatggggcatgccca
-gggtctccaggcactgtgctgagggctctgtatcccgtctgtcaatttttcccaactcta
-ttatacagatggcaccactgaggctcagagaggtgaagggacttgcccaaggcctcatag
-tgcatcagaaacagtcaggactcagctcaagaaaaggccccaaagcaagcactcccaacc
-acatgatctaAGACCAGGGAACAAGGGGACAATGAGAGTGAGGGCAGGAAAAACGCTGGA
-AGATGTACCAGAGACTTAGCACTTGACTGATGGCATCTTTCCAGGCCAGTGCCCACCCCT
-CCTCTCCTGGCCTTCTCTTCCACCTCCCACCCTCCTGGGTTCCTGCACCATTTTCTCACT
-GGAGCTCCTGCCATGCCTGTTATCTTCTgttggttcttgggaaaagactctgagatggag
-attggcgtgcagtgggtttattggggagagtgctcaggagtaagaccaatgcaggagtga
-ggaaaacaggcctgggaggagtgaacagctggcacaatggagttacaacagaaatctcag
-tgatcccacaggagctctggagcagagatggcccttcggagctgaaggatcgggtcaggc
-attttttatcatacaccaaccactctttggccacaggctgcacctggaacgaacgtgtcc
-ttgggcagggcaagtccctacagctgagggccattcccggctgggaaatatcagcagctg
-gcagtcccatcagctgggAAGGGTGTCTGATGAGGGAATCCATGCTAGCCCCCAGCCTCC
-TTTCCACCTGTCCACTGTTATCTGACAATAGCGATCATGCCACACTAGCTCACACCGGCA
-GAGCACTGTCTACCTCTCAGGCTCCCTACCACGTCGTGTGGTGTGtggattccctcattc
-catcctcatgacaaccatgagagggggacactttccacatgaggaaacggaggctcagtg
-agatgaagagcttgcccagagtcccaaggtgcaagaatgctgtagctggtattctcaccc
-aagcagtGGGACCTATGGGTCCTATCTTGGTCCCTTATAGAAACTCCTTCCTTTAATCCA
-ACTCGGCACTGAGTCCCCTGGagtcaaagctcctgccctccaaaagttcatcatccagtg
-ggggaagtcaagacatatacactggaaagataagggctggtaagtgctgtgatgagaggt
-gacctgagggtgggtgacagggatgtcctgcccaggaaggcaggtgagacaaagtcagtg
-agttcagcctcagtggatgaggagagtgctgtgggaaggatcggggcagggtgggcttct
-aggcagtgggagcacaggtgcaaagacagagagggtgaaagagAGGGGCCCTCCAGAAAT
-AGGGAGTGGTCTCCTGAGATGACATAGGGGTTTGGGGGAAGGAAAACAAGGTCATCAAGG
-TGGAGGGGCTCCAGCCTCAGGGCCCTGCATGATACAGTCCCTGCCCTTCCGTGAATATTT
-GCTGAACGAATGAATGGTTGGATGGGTGAATGAATCGCTGCTGTGGAGGGTGGATTGGAG
-GTTACAGAGACGGGCAGGGAGACCAGTGGGGGGTCCACAGCAAATGTCCAGGTAAGAGGA
-AATGGGCCCAACTTTGCAGGGACCACAGGGGTGAAGCGATGAGAGAGAGAAAGAGAGAGA
-GGAGCGGAACGCCGCTGGGTGTGGTGACCTAGAGCTTCTGTGGCCCATCTCTCAGTCTCA
-CCCTGTTCCACCTCCATGCCCTGCACCATGCTGCATCCCCTGCCTGGCAGCTTTTTCCTC
-TCCCTCTGCATCTGCAAGTTGCACTGGCTGCCCAAGCTCTGCTTCCTCTAGGAAGTCTTA
-TTGACCAATGCAGCTCTCCCTTACCGTGCAAGGTCACTTCCCATCTCCCTCACAGTTTAA
-CCCTAGCAAACTCCATTTGCAGAGGCCGGTGTTCAAAATGCAATTCTCCAATTTTTGAAT
-GCCAGGCCAACAGGGAAGCATTTAATGCCCTTCAGCAGGGGTATGATGGGATAAGTGTGA
-ATCCATGTATCCCGTACAGGTAGGACCTCTCTGCCCCCATAGTGCCTGCTCGTTAGCCCT
-CTAAGGGAGGCATCTGGTAAATCTGGGCTTGGAGTTTGGAGGATCGGAAACAGGAACGAC
-CTCTCTGGGGACAGTTCTTAAGTTCTAATGGAGCAACTCTTCACAGAGGGACTTGCAAAG
-CTCTTAATTAAAGTTACCATCAGAACAAAGACTCTCTGAAGCAAGAATTTGGACCCCAAT
-GGAGTCCTGAATCCAGGCAACCAAGCTTGCATAAGTGTGCAACACAAAGGCAAATGAGTC
-CCCAAGGAAGAAGAGGCTCCATCCTCAGCTTGCTGCCCTTGTCTGAGGGAAGCACCATGC
-CCTACAGCTGACATTTACTGAGTTTGCATCCGTTgactcttttggttgcagaaaactggc
-tcagacaaaaaggggatttgctggactgaaaaggccaggctggagctatggtgcagcagg
-atctaagggcttaagtgatgtctttagggtggggtttctctccatttttttctgctcagc
-atccttcagaatccacttcattcccagAGTCTATGAAGGTGGGGTGCACAGAGAGAGTCT
-GTTGGACCAGTGTGGTCACACACACACCCTGAACCAAGGAGCACAACACCTGAGTGGCTG
-AGGCTGCAGGGCACGTCCCAGATTACACTGACCAAAGAGTAGGAAAATGTTCCCCATCAG
-AAATTGGTAGAACAGGGAATGGATTCTGGGGAAGTAAGCAATGAACATTATCCGTAAGGG
-CCTActatatggtaagcagctattaatcgctttgccaatttatagttgaggaaacagcct
-cagagaggtgaagtcactctgacagccaggaagtagggaaaagcaagcttggaacgcagc
-tctgtctggtaccagagcTGAGGGTCTGGGGAGCTCCACCATCCTGCTTTCCAGGCAACA
-TCTTTACCCATCTCTGTTTTGGTCCAAGGCACAAAGCTGGTGTCAGATGGCTCTTGGATA
-AGCCTGTGTGGGAAGGACAGATAGATGGGGGTGTGTatggatgaatggattggtgaatgg
-atgaacagcggggtggatggatgggtaggtagaagggtggatggattgctggctgtgtgg
-tttactggctaggtgggtgggtaaattggtatatggttaggtggaagggtggatgtatgg
-ataggtgggtggatgCTTGGGTGAATAAATGAAATGGCAACTGAAAGGACAGGTGGAAGG
-ATGTGTGGGTAACTAGATGGGAGGGTGAATAGAATAATGCTGACATAAGCATTAACAATT
-ATGTCTAGCCTCTTGCCCCTCTCTTCCCAACTGCCTTTTCCAGTGGAAAAATTGAAAATC
-ATGGACCCGGGGAACACATTCCCCTGTGGTCTGTTAATAGAGGCCCAGCAAGGCCAGCCG
-AGGCTGTCAACTCACCCCCCACTAGGACCCTGTCATTAGCCACACTCCCCCAACCCTGCC
-CTTGGGTGGAAGTATGATCTGGTGGGCACTGAGGGGCTGGGCCCATCCAGGCCCCTTATT
-AAGCCTTATTAAGCCCACAGACGGGGAGCAAAAAGGGGAGAAGAACTTTCTCCCAAAGGT
-CAGCTGTTGGAAAAAGAAGGTACAGATGTCTCTGGGGTGGTCGTCTACTCtcaggccaca
-aggaatgtgaaagtttgcctggcccaatctgctctgctgtcttcttgcaggctgggaaac
-tgaggcccatacaggagacaggagggacacacagaagtcgggacagagccagactcaaac
-ctcaggccggctcacagaccatAGCCCAGCCTTTCCCTGAAACAGCCTCAGCATCAACAA
-TGGGGAGGGAAAGGAATGGGCATGAATGGGGCTCCTGCTATATGCCAGGCCCTTGAGCAA
-AGCATTTTCTGTTCATGGAGCCACTGGTCTCCTCTGTATCCCCATGAGTAAAATGGAAGT
-TATGCCTGTCCTGTCACGGattgaacaagcatttgttaaacatctgttatactgtgggcc
-aagcactggtctaggtgccaggaatatggcattaactagccaaacaaggtttctgctttc
-agagagcttactttctagacagtgatagagacagacaaataagtaggtagataaaatgtg
-atatgaagaaaattgaggagtggtatgagatgtacaaggatggaagggacgttctttgga
-tgagatggttgggaagggcctctctgagaaggtgaTCATGGTCAAGGTCATtaattgtcc
-accaagtccattctcccctttgctagtatgtgggcaaagcccacaagtggctgtccaggc
-agggtcaacatttcccagccctatttgcatgcaggtgtggccatgtgactagctcttacc
-aatagaatgggagcagaagtgatgagtgccacatccaggcctagcttttgagaagtgagg
-gagcttcccccatgttcttgttacttttcccctggctgaattcaaatgatggcaagaccc
-caagatagaggagccacaagattagaagagcctggattcctgcatcaccacatggaggag
-agccactcattgccctggcacatccattgcatgagtgagaaataaacttCAGGTGAGACC
-CAAAAGACATGTGATGAACTGGTTaggacattgcaggcagaggaaatagcatgtgcaaaa
-ggctcaaggcagaaccaagcttggcatgttggcacagaaaggataccaatgtggccagaa
-taaatggcacaagaggaggaaatgaggtgaaccatgcaggcagtggcctcagtcaggagt
-ctgtatttcaagtggccccagtggaggtggcgccatcagcagggaagaaataccatgtgg
-ttcatacttggaaaagatccctctggccactgtgcagagatgagttggaaggaggcagga
-atggacacaccagagaggagctggtgcagtcatcctagcctggatgaggctggggacata
-agagtgagtgaacagagtgggtttggatatattttcaagggcttgctgatgggttgtttg
-tggaaggtgaaggaaaCCAAATAACCCACAAGCCATTAAACAAAATCTAATGCAGAAGCC
-AATATATATTAGTAAACACTTTAGGGGTCTCTGTCTAGCTTCTAATCTTCCTTCCCTGAG
-AACCTCCCACTTATGCCTATCTGATAACTCTACTTATCTGATAAACTGGCCCCTCCCCTG
-CCCTAGCTCATGGAGCTGGAGATCGGTCCCTGACTGGGGCTCAGCCAATCAGATCATCCC
-TGGCTGTCAGACCCCAGTGTGTGGCTGGATGGGGAATAGGCTGGGCCCTAGCACTCTCTC
-CTTGATAGAGATGATGGGGTAGGGGGAAGGTCAGCAGCCCAGAAGCTGAGGAAGAATGAA
-CTCTCCAAGGACCACCTACCCATCCCATAGCAGGCGAAACATAGCTGCAAGTGGACTCAA
-CCACCCTCAACCACAATTGGAGCTGCCACCAGCCAAGTGTGGAAAGGGTTGGTCTTTGCA
-GAGCCCTGGACTGGAAGAGGAGAGTGGGTCTCCCAGGGCAGAAAATGGGAGTGGCCAGCT
-CCAATTCTGTGCCTCAGGTTGGGAGACATGATCCTCTGGGTTCTTTCCATACCCTAGACA
-AGGATATTCCTTGTCTGAGCCTAGACAAGTTATTCCCCTGGGAAGGAGGGAGGTGCTTCT
-GTTTCTCCATCTGTCAGGTGGCTGAGtataacagatttcatttccaaaaatggccacagc
-cccctgctcctcatgaaccctgccactctccatcaagagggagagtttatttctcctccc
-ctggagactggcaggactttgtgactgccttgatgaatagaacgcagcagaggtgactgt
-gtaacttccaagggtgggtaagaaaagacaatacagcttctctctggctctttgtcttga
-gacactcaccctgggaaccagacgaccacggtgtaaggaagcccaggccccctggaaaag
-ccagaggtaaatgttctggccgacatttacccagctggggtcccagccaacagtcagcat
-caaccaccagacccatgagggaatcagtccagcccctggccatcaagtcttccatctgag
-gccccagacaccgtggagcacagacaaatctacccactgtgcccttctggattcctgccc
-cacacaatatgtgaatgcaatgaatgactgtttgatgccagtgtgttcaggggtgatggg
-taacgcagcactagatacccagaacGCTGACTCAGGCAGACTCTGCCTCCATGACACCCT
-CCGTGCTAAGCATCTGTTCCATTTCCCCACTGTCCTGAAATTTCCAGACACTCCTCTTTG
-ACAAGCCAGGCTTGGCTATGAGCTGGGGCCTCTCAGGGATCTTCCAAAGATCAGCCGTGG
-AACAAGCCCTGCGGGGAGTTCACTCCCTGGTCAAGAACCTTTGCTAACTCCCCATTTCCC
-CCCATATCAAATCTCAGCTCTTCTACTAGGCTTCCCAGGCCTGTCCTAATCTCCTCCATC
-CTCATGTCTCCCTGAAATGGGCCACAATTCCTCCCTCTGCAGTGTATTAAGAGTGAGAAT
-GTGGGGTTAGATGAGGTGAGGGGAATCGCAGGCTCTGGGAGAGCTTTGAGAGCTAGGCCT
-GAAGCTTTAGAAGGCAGTCttccctcatttagcaaatattgagtcctagtgtgcactacg
-ttctatttacagtgctgggaatacacagctgcacctgctagacataatccctgtcctaaa
-cccatgaggatcatattctcttccacctcagggcctttgcacctgccattctcctaacct
-aaaatctatttcggaagatttgtgtacacctcatcctttatccttccagtctcaccttag
-aagggcctgcctggccaccctctctagtcatccccattgctaattccctttattattatt
-attttttttttgagacagagtctcactctgtcactgaggctggagtgcaatggcacaatc
-ttggctcactgcaacctctgcctcctgggttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattaccggcacatgctgccacacctagctaattttttgtattttagtagag
-acagggtttcaccgtgttcaaggctggtcttgaacttctgagctcaggcaatccacccac
-ctctgcctcccaaggtgctaggattacaggtgtgagccaccatgcctggcctaattccct
-ttactcttaattatatctccctgttcattttctccctaagtcttgaacaacagtatataa
-tctgtgatggctgatttacttgatgtttgtctgacttcccctactagaagtgtcagctcc
-ctgaggcagggactgtgtctgtctcattcactgctgtgtgccagggcatggcacagggcc
-tggcacccaggggtgctctatgactattAAATGTGTGCAGTGTGATGCTGGCTGCACAGT
-GCCTGCTTGCAGCTGGGAAGCTCGCAGTAAGGGGTGATCCTCTCTTTCTCTTCTGCCCTG
-TCTGTGGACATGCCCCATAAACACTCAACAGACTCCCCTCTGTGCCAGGTTCCATGTGGG
-CACCAGCAGCATGTAAGGGCTCAAACACAGTCGCTGGTACTGAAGCAGCTCCCAAATACT
-GGGGCAGGAGACAGATATCCAGCCTGTACTGGATATCTGGGGACATAGTGTAGCTGGTAG
-GGAGAGACGGCACAAAAGTCAGGGCACCAGAGGTCTGCAGTGCCAAATTAGAGTGGAGTA
-AGGACTCCATGCTGAGTAAGGAAAGAAGATCAGGCAGGCACTGGGGAGTACATTGAGGAT
-GGAAAGGAGGGCGATGGAGGCCATCTGGAAGGACGAAAGCGAGTGGTAGCAGGAGAGGCA
-TCTTAGgtatgaccccgggcatgacacgcaacctctctgaatctgtgtccCTGTTGgtat
-aacattctgtgaagcacacaggtcctggagccttcctgggttcaaatcccaccctctgat
-tactcatgaccctcaataagttctttcaacttggtttcttcatctgtaaaatggagatga
-caataatagcacctccccactattgtttcatcaggatcacatgagttaatgcattgaaaa
-cacttagatcggtgccaggcacatggtaagtggtcagtcaacgtGAGCTAGCACTGAAGC
-AGGAGTCACAGTTGCAAAGCACAGACCAGTGCCTGCACGCGCACACAGCAGGCACTCATC
-AGTGAGACGGACCTTCTATCTGCCTCTTACGCTGtaacacatatcaccacccaacatggt
-atttttttgcttatgtgattattgtcccttgcctccaccagaatgtgagctcaatgaggg
-caggggttctgtctcttttgttcccttgcattatccccagagcccagggcagtacttgac
-acatagtaggtgctcagtaagtagttgctgaatgaattcatttctaatttttagttttgt
-gcttggtgcacagcaaatgctcaacaaatgctggtcctcttCACCCCTACCAGCCTCTCC
-ATCCCGTTTCTACCTGCTCCAGGAAGCCCTCTTGGGCCTCGCAGCATCCACCAACCGTCC
-TTCATCCCAGGCTAAGTTCCCCACAGACCCCCTTGGCCCACCTCCCATCTGCTTTATCAT
-GCCTGTGGAGCCAAGGTTCACCTTGTTCCCCGGCACTCCCGCCAGCGTGAGTAAGCATCA
-GCCAGGACCTGGAGAGTAGAACCCACCCAGAGAAGAGCCCCTGCTTCTCTGCCCACCCCA
-GGCCAGAAGTGCTCTTGCCCCTGGACTGGTTTGTCCAGGGAGGTTTTCCAAGTCACTGAG
-AGCCCCATGATCAGATGTCACCAGATCCTCCCACCCCGGCTGCAGGGGCTGCAGTACCAC
-CAGGGCCAGAGCCATCCCCATGCGTGATTTCAACATCTGTAATACTTTCCCCTCTCCTTG
-TGGAATTCCCCCTCCAAATTCCTCCTGCTTCattattagtatatataaaaaataaaaaaa
-ttaaGCTGTCTTAATCATTTTCCATATTAGCTGACAGCCGGTTCCCATATGCCTGGGAGT
-GAGACCACACCTCCTGTTCCCCCCCCCTCCCCGCCCTCTCTGCTGTTCCAAAATGACTAG
-CCCCAAACAAGGCCCAGTTACTGAAAACCCTCTATCTTACAGACTCCGCAGCCCTGACTC
-CTTGGAGTCCTGTCTGGCTGGTGTGGCCCAAGCCAAAAGCAAAGCAGGAAGATTCTCTTA
-TGTCCCCAAAAAGTGCAGACCTCAGGGCTGGGCTGATCAAGGTGCAAATCTCAGTGTCAT
-CACCTACAAACTGGAACTCCACAAACTGCTTTGTCCTGTCCAAgaaagggcacaaattct
-gaagcagacggatctgagttccatctctggaactcagctctgtcaccttgggcgagccag
-ttcaccactctgagcctgagtttcgtcatctgtaaaacggcagaaacaacagcagttacc
-tctcagtgtcacagtgaaaatcaaggagaCTTTGataacagcagtgaacatccactgatc
-ccactgtgtgccaggcactgagccaagccctccctgcctccccctcattgcatctgcaca
-acaacctgctttgcagacagaaacaaagggaccgagatattaaaaatttctccaggacaa
-agaacagggaggtggaggagcaccctgacccaggcccgGCATTTTCAGTTCCACTCGAGA
-GCCTGACCCCCTGGAGATACTCCACAAGTCCTCACCCTTTTCCCCCAGTTTCACCTTGGT
-CTTTCCTCCTCTCATGGTCTTGAGCATGGGCATCAGGGATTGGCAGCACTGTTGTGTCCT
-GTCCCCACTGCCCAACCCCAGTGCCAGGGCTGTGAGCATCAGGAGGGTCGGTAGGAGCCC
-GTGGCCCATGCATGGCAGACTCAGGTGGCCCAGCACCTTGCGGCTGCTCCTAAAAGCACA
-GACACCTGTATTGAAGAGAGGGAAGTTCTGGGTTGAACTTGAACTGATTGAGAATTCCCA
-AGCCAGAGGAGATAGACAACTATGCCAGACCTCAAACTTGAAGATTGTTTTTGTTTTTAT
-TTAACTGAACCAAACTGATTTTTTTCTTCCCCCCGAATTACGAGTGAATCAGTTCATAAT
-AGAAGCCCCCATTATATCTCCTAGATTTTTAACCAAAATATCCAAAAAGAATTGGGCTAA
-CATAGCCACACCATCTTGGAATATGTATATTTATAGTGACATGTCATAAAGACTTCTAGT
-ATTTTGTCTCTACTCTTGATCCAAACTCCAGTGGTTCcggtttctctatattaagtattc
-acgtgctttgcatgtgtcacttttcatccttcagcccttagagggaagtatcattcatct
-tcaacttacagatgaggaaactgagactcaacgtagttaaatgatctgtaagacaaggtt
-ctgaatttgaacataggtctcagctgcagagccatgttattgctaacacagcctctgtat
-ggttctccagaaggcccctgatcCACTAAGAAACAAACCTGTCCCCCAATGCCAGCTGAC
-CCTATCCATGAACCCTCCTCCCTCCAGCCAGACAGGCCTCTGCCCGGAGAGGCAGCATCA
-TCTCCAGCTGcctgtactctcatcccagttcagccattcgccaagcatgacaactcggac
-aagacctttccctcctcagcctgtttcctcctgtgctgaggagaaataaaatcctccatc
-tcccacgctgttctgtgaaatgaagcaatcatgtacctaaagtgcgagcacaTagctggg
-catggtggctcacacctgtaatcccagcactttgggaggctgaggcaggcgtatcacttg
-agcttaggagttcaagaccagcctggtcaacatggcaaaaatccaccacttgagactagg
-atttcaagaccagccgggccaacatggcaaaaacccatacaaaattagctgggcgtggtg
-gcacacacctgtaatcccagctactcaggaggctgaggcacgagaatcacttcaacccac
-gaggcagagcttgcagtgagctgagatggcaccactgcattctggcctgggtgacagagc
-aagactgtctcaaaaaccaaaaacaacaataacaaaaaaaaGGGCTAGCACTTATTTTAC
-TTCTAAACTCTCCAGCCTCAACCCAACGTAAGTGAGGTGCATATAATAGGTGCTCAAGAA
-TTACTCATTGATGATAAAAGCAAGCCTGGAACAacaaaaataagagactgggcagaaata
-ttacaaaacatcagaagtagatccctctggggtggaattatgggtgattttattgtcttc
-ttggtgattttttttttctattttccaaactctcAGCTTGGAAGTATGTTATACTGTGTT
-TTCTAATTGTATGACACTATGAACTATACAATGCACTGTACACCTAATAGCAGTTTTTGA
-GAGGAAAGAACAAAACTACTTCATTGGATTGTAAGACTTGTTCTGATTTTGGTAAAGTTA
-AACTCTGCAGGGCAGGAAGAGTAGAGAGGTGTTTTAGAATCAAGGAAATACATTTGTAAT
-CAAGCAATCAAAGTGGTGGTCTTGGGGGGAGGAGGCTAATAAAATTATTATTGTTAATGT
-TATTATTAtttttgagatggagtctccctctgttgcccaggctggggtgcagtggcatga
-tcttggctcactgtaacctccacctcccgaattcaagcaattatcctgcctcagcctccc
-aagtagctgggactacaggcgcacgccaccatgcctggctaattttttgtattttaggag
-agactgggtttcaccgtgttgctcaagctggtctcaaactcctgagctcaggcaatccac
-ccgcctcggcctccgaaagtgctgggattacaggcatgagccactgaacctggccATAGC
-ATTACTTTTTAAAGGAGGAAGAGGATACAGGCAACTTTTCATTGCTTCCAGAACCTGGAA
-CATCAGCTTAACCTTGCCGGCACACCcagctcacctgggatatttgaaaataaacacaga
-tggccaggccctgtcctggtctgaatggccagcatctctaggctggggcctgggagtctg
-tgttttaaGTGGACACAGCAGATCCTGGGCACTGTATAGTAAATaaatctcctcatccac
-tttctgtctcatcttacagatgggaaatcagaagtccaaccaggggaggtgTTTAGCACT
-CTCCTGCCTGAATGGTGAGGGTGGCCAATCTCTTCCTTCACCCCAAGGGCCTTTCTCAGT
-CCCTGTCACCATCTTACCTCTCCCAGTCCTAGCCCCTTCCCCAGCCTTGCTCTGCCAGCC
-TGGAGCTGTTTCTTCCTTTTCTCCCTAAGGGAGTGTTCCCTGTTCTTAATTAGGGAGACT
-CTGGGTATTTTTGTCTCTTTGAGTACTGCGTTCTGTTGCCAGCAAATAACTTTAAATAGA
-AAAAATATGCCCAAAATTAAACTAGAAAACAGAAATAAATAGGAAGGGGGTGGGCTGAGT
-GTCAGCCTGCCCTTGGTGGAGAGGGTGGGctctgggcctcctttcctgcatctctgccat
-ggagaccatcacagtacccaccttctggggtgctgtgcacatcagacaagaagaggcaca
-cagtacactttgcacagggtgtctAAGTGTCCATTAATATCCAAAGTTACTGGGCACACT
-CGTTGCTTGGATTTTGAGATAATTATGTAGAGAAAATGTCAAGGGGCTCAAAGTCCCCCA
-GTTGACATTTCCCTACCAAGAGCTACTTTTATAACATGCTGCCGGATGTCATTTTCTTAA
-TAGGTACAATTTTAAGAGCAtctctccaccttcttccctaccctagtccaactgttcaca
-gctgaaagagtgaccttccaaaagcctaactcagatcatatgattctttgcctctgaaat
-ttttcaaagctctccattgtctacgaaatgccggcctcagagcctttcaggataggggcc
-atgaagggtctcaaatttcaaatttcatcttcctctaccatcctcctgtcaccctccagc
-cacacagacctgccccttggtccccaaaTGGATGCCCACTTCCTTTTTCCCTAATTGAAA
-GCCAGGGCAGAGTTAGGTTAATCACATGCCTTAGCTCCAGCCACACTTTTGGCACCAGAG
-TGAGACCCCTCCCTTATTTTATGTGTCCCTTTCATGCctcatccctactctcatcccacc
-tctcatccctccctcATGTGGATACCCCCCTAACGTGTTTGGCGTGTGTCTTTAAACATG
-CACGTGCCCTTGGAAAATGTGCAATGTTGTTGTCTGTGTGTATGATTTTAATTTACATAA
-ATGCTATTCATATTATGGCTTCTTACCTTTTTTCCTTGACACTGTCTTGAGATCTAGCCT
-GCATATGTGTGGAATCATCACTTCCAACTGCAGAAGAGTCAGCCACAGGGGGTGTCCTCT
-GTGCTTCCCTGCCCATCGTTCTGGTGCTGGTGGCCTAGGCTACCTCTGACTCCCCACAAC
-AAACCTCTGACTGCTTCTTATGTAAGAGAACACAACGACAGCTCCTGCTTTTTGCATAAC
-GAGCCGTTGTTTAGTAACAAGGGGCAGATGCCTCACTCAAGTGGATTTAGACACAGAGAC
-AAAGAAAGTGTAGATCTAGGTGTTCACTAACTCCTCAGGCAGCTGTCTTTCTCCATCTTA
-TCAATTCCAAGATCCCAGCCTCCCACCTTGGCAACTGCAGGGGAAAAGAAGCTCCCGAAA
-CAGTCCCAGGTGACTTTCTGGACCATAGCCTTTGTGCTGTTTCTTTGACGGTGGGATCTG
-GTTTTGTCCTGGCTTCAGCCTTCCCAGATCCATGTGTTTCAGAGGAAGTGAACTCCAGTC
-TCGGGGtgttatggactgaattcgaaattgtgttgaaaccctaaagcccaatgtggctat
-attagaagacatggtctgaagggaggtaattcaagttaaaggaggtcacgagggtggtat
-ccagtaggactggtgtccttataagaggaagagacatcagagctctctcttcacatagac
-acacagagcagatgccacatgaggacacagtgaggaggtggccatctacaggccagaaag
-gcctcaccagaaaccaaacctgatgacaccttgatcttgaacttccagcctccagaacca
-ggaggaaataaatttctgttgctgaagacacccagtctgcagtattttgttatggtagcc
-caagcagactaatacaGGGAATGAACTGTGATTGGTCTAAGGcaatatttctccattttt
-ttttcattattacccctcattattgacctcctgaagagttgttttaagaatttttttctc
-ctaagagtgcctcccacaaaatatatatatactacagacatatctatttatgtagtgtgg
-tttcttggagggtcacaaacggttgtcatatctaagattttgtcataccttaacctaagc
-taatttttacagccttaggagcaatattgccccattgagaatgcaCTGCCTAAGGCAATG
-TACTTGGTCTgtgattggttagaacatgggcatgtgaggctaatgtagaccatagatgtg
-agagccacagaggaagaaattgtcccttttcacctttggtctttattatggatggacata
-atgcctggatctgcggcagctattttgtgactatgaggacaggctgatatgctttaaatg
-gccaactagtagataaaacctaggccattgttcatatatatatatatatttgagatggaa
-tttcactcttgtcacccaggctgaagttcagtggctcgatctcagttcactgcaacctct
-gcctggttcaagctattcccctgccagagccttcagagtatctgggattacaggcaccca
-ccaccactcccagctaatttttgtatttttagtagagacgacgtttcaccatgttggtca
-ggttggtctcaaactcctgacctcaggtgatccacccacctcggcctcccaaagtgctgg
-gattacatgtgtgagccaccacacccggcccactgatcatatttttgagcaataaaagta
-accagccctgaaactgccctaccacaaactcctccttatgtgaaatgatgcattttcaca
-tttcagcctgttcagctgtgtagtttttgtaattgcagctgaagacattctaacagaTCC
-TGTtctttttcccgtaagttgtaccaaatgttctgaggcagactggcagtgatgggcctg
-gttagtccatgagttcatccccaaaccaatcttgtggccagacttgaatcctgtgcccac
-ccacctttgtagctcagggatgggaaggggtcaaccccacctggactgagaactgggggc
-tgttcctccgagggagatgagggagatacttcccaaagggattgtgaatgctgagagggc
-agaaatgacagctgGGTTTCACATTCACACCATCCCTTCTACATGAAATACCCCATCTCC
-AGCCCAATATACTCCCTCTAGTGCAGCTCAGCATCTCCCTCTTCTGAAAGGTCTCCCCAA
-GACCATGTTGAAATTATCTCTTCTCTTCCAGGTGATGCTCACTGGGGCATTTGTAGTCTA
-CCTCTGCCCTTAAGAGGCCAGTCTTCATGGCATGCAATCattcatgcatccatctaccct
-ccaatcttaattagcaccttctgtagccatccctaggccttggggtgctaagcaagaaaa
-aggcataatttccatcctcaaggatctcacagtccaggggaggaagcaaaactcataggc
-attcatTCGACACACATTTATTCTCTGTATAGATATGAGTAAAATATTGCATATCCTCAA
-GGAAAGGGGGAACTCCCCAGCTAATGGGACAGACAGATGAAGAACAAGTAAGTACAGTGT
-ATAATGAGGTGACAGAAGCCACCACTCATTGCTCTGACTAGGAGGAAACAACAAGATGCC
-TTAGACTCTTTTGGCCAAGGAAAGACACACTAGCTGTGTGAATGCCAGGTGAGCTGGCAT
-CATTTGTCTGGGATAGGGTGCAGTGGAGGCTGTTGAGGCCTGACAGCTTCCCCCTTCACC
-TTACTCCATTGTTTGCCAGGCTCATGCCTGGGAGAACCATATGCATAAGAAGACCTGGAT
-CTTATAGGAAGAAGAAGTGGAAAAGCCAATACCTGACCTCCAGGAATCAGAATTTGtgtt
-gcaggttgggttctatgcaggcagacacgaagacagagtttaggtgcaaggtgtttatta
-ggaatcaatatctggaaaagaaaggggcaggaatcagggttgaggaggaggagatactta
-actgcaatgtgacccagtaaagcgttggtcaacatggtgaggaagttgggagcaagaatt
-atccctcgatagacaccccgttctacatgatgtaattattatgaattacatgcctgtatc
-aaaacatctcatgtaccccataaatatatatatacctactatgtacccacaaaaattaaa
-attaaaaagagttacccctcagagaatcccaaaagatatcaaaatatccagacttttgtc
-tcagccccttcattttgatagttcactattcaccaaatacaggttgccccaggaagggca
-tggcctgggatgaagtggccctctcaagctgaggctaaccttgaaggggctgaagctgaa
-ggctctctgctgaccatgcttccCCCGCCTTCAGCTGTCAAGTCCTTCAGGGTCAGCTCA
-GTTCTGAGTGCCACTTTACTTGGGGTCACTTCTTTGATTCCAAGCAGTTTAACATAATGG
-CAACCACAGTTAGGGAGACCTGTCCTGGTGGATCAGGGTGGCCCAAGCTAAGGTCTGGAG
-GAAAGACGACCCTCAAGAAAAGATGTCTCCTCTGTCCCTCCACCCCATTCATACTAAGGG
-CCATGGGTTCATGGAGAGGGTTTCAGATGGGCACATTATAGGGCTGAGGCTAAAAGTCTC
-TTTGAACCAACTCACACTTGTACAGAAGTGATGCTGTGAGGACTAATGAAaacaagtagc
-atctactgcatgcttaacatacaccaggcactattccaaattttttacccacattagtca
-tttaattctcacattaccctatcagaggaacaatgatGAGCATGGGTATGTAGACCAGAA
-GGAGCTAAAACCCTAGAACACAAGCAGAGGACACCAGTGAGCCCAGGAAAGGCCCTGGGC
-CCCTGGAAGCAGTCTCCTCATCCGCCTGCATGGGCCAGGGTTCAACAGAGGCACCATGTG
-GCTGCAAGAGGCAGAAATGGCTGCAGACTGAGCTCTACTAGTTCCTTCCACTTGATGTTT
-GAATAAAGTCCCTGGAAAACTTGGGGAGATGGGATGAGTATCTCAGCTGGGAACACACCA
-AGACTTCTTAATAAGGCATGGAGAGGCTCAAGCAATTGATTGGAAAGAAAAAAAAAAAAC
-AAAACTAACTCAAGTTGGTAGATTTTACCTGCCATGAGATGTTTGTGAATAGCAGAGCAC
-AGGGTAGAGAGGTCACTGCCAAAGAGCAACTCCCAGTCACCCTTGACATGTGGCATCCCC
-TCTCATGCCTCCACGTCTGCATAAGCTTGGTAATCTTGTGCCCTCTGACACCATTCTCCC
-ACCTGTCACCCCACTCCATTCTGCCCATCAGGATAATGCTGCCACATCCTCCAGGAAGCC
-TTCTCTGGCTGTCCTTCTCCATGACGCTAGGCTCCCCTTCCATCTTCCCACAACTTCATG
-TACCTCCCTCTATCATTTTATTTATCAATCATTCTAGATTTTATGTGTTTATGACTGACT
-TTCCTCCTAGATTATGAGGCAGTATGATTATATTATTTACCTTTCCCACTGTCATGCATT
-CCCATTTATCTCACTCGGCGATTGTCACAACAatgctgcaaactaactaccactaagctc
-agtggcttaaaacaataacttcttctcactcatgggtctgtaggtcagctgggattctgg
-tggtctagactgggctgggctccaggcatgcatgcggatctgctccacgcgtctctcatc
-ctccttgacccacagaagacagctggaagcaggcaggacctcataggctttagctcagag
-ctggtgtgctgtcacttctgcccatgttccatcagccagagcaagtcacatggccaagct
-caacatcaattagatgtggagaaaattgatgagtcatgtggcaaagggcatggatatagg
-aaaaggtgaaaattAGGAATAGTATGATTTACTGTGACACAGATGCTTTCTGGTGAACAC
-CAacctctccaaactcatttcaagacccttcctcatcagcccagtgctcaaggtcaattc
-ctgcaaccttcagccctttgtagcctttcagtcttttgaacacactgtactttttgtctg
-acatacacctttcccatccctttcagatctcagctgagatgtcatctcctcaaagaTTTG
-CATGGCTGTAGGCTTTGCCACCAGGAGATAGTGACCCAACAAACAAGCTTGTATGGGTGA
-GTCCCTGAATCCAAACCCAACCCTGcctggccttgccactcactgctgtgaggccctaag
-aaaatcttatcttttttctactgctgttttcttatctgccaaaagtaaataaaaacaTCT
-TCCCAtatcagttagaaatgcttgcagctgcaagtagcagaacccctaatagtagctaaa
-acaataatatctcacaaactagatgcctggaagcaagaagctccagggctggtttattgg
-ctcagtgatgtaaggacTAAGTGCTCACTCATACCCTCTCATTTCTCCTCCTTCCCTTTC
-CCCATTCTACtaggttggtgcaaaagtaattgtggtttttgccattactttcaatggcaa
-aTTGtggtgcaaaagtagttgtggtttttgccattactttcaatggaaaaaacagcaatt
-acttttgcaccaacagcaaaaacagcaattacttttgcaccaacctTAATATTTCCACAG
-TGTCTTCCCTAAAGTCTCACAGAAGGTTCCCTTTACATTTTACTGGGCAGACATGGATCA
-TATGGCCACTCTAGCAGGAAAGTGAAGTGGGAATGCCAATATCAGGGTTTTGTTGTTGTT
-GTTGTTCAGCCTCCTTTGGGGGAAGCAGCAAACGAGAAGGGGGTAAGAATTGGCTGCTGT
-GTAATCAACTCACAATATCTACTCCTGATCTAACTTTCTACCTCACAGAATTTTTGTGAA
-AATTTGGATTGCCAGTAGCACTCTGAAGGCCACAAGCTTATAAAATAATAATCTACTTTT
-ATTATTATTCATGACTTATTAAGAAAAAATCAATATTGGAAGAGAATAATACTTCGCATT
-TGTTCAACAATGAACTTTCCGAAGGTGAAAGGAAAAGCAATTACTGTCTGAGCCCAGCCT
-GAGTCCCAAGTCCATGCCAAGCGCAAGCCTGCAAGACCATTTCCTCCTCCAGGGACTTGC
-TTCGATTGTGctaaaacagcttctgccaagccaaccaggattgcatgctgccaaatccag
-tactcattttcctgatcttattttatttgaattccctgagcattcaatccagttggcagc
-accctccttgatacatgatcctgtctgggcttctgtatgctcacagccctggttgttcct
-cagtctcctctgctggcttctccccatctacctggtttctagatgccagctgactcagga
-ctcacatgtgagctcctctcctccttcccaccccctatgctctttctgtctcaGGTttct
-caaaccttagcatgcatcaccgtcacagggagggcttgttaacacatagattgctgggtc
-tcactcccacagtgtctgatttcatcgctctagggtgaaacctgaacacttgcatttcta
-acaatttctaggtgatggtgatgatgctggtcctgggaccaccccttgagaacctctCAC
-TGCTCTatctcaaccagtgttgagagccttgtttctcagccttggctgcaaattggaatc
-acccggggtgctttaaaatatggacaccaggatctcatcccccagagattctgattttaa
-tggtctgcattatatcctgggtacctagagttaaaaacctcccccaggtgacttcaacat
-gcaggtaaagttgaaagcccctaatttagatactacttaactgctagtaacacctacatt
-tatttccctctcccagacttgtcctctgagttttagcccagtatgcccaattattcactc
-gatatctccacttacgtgactcacaagcatctgagagttaacacacccaaagtggaagtc
-tgaatcttcacttccaaattgctacttctctatcttccccatctcagcaaacagcaactc
-catccatgtgctgtagtttattggggtaaaaaccttggagttatctttggctcctctctc
-ccctccatgacccatatataatcctttgacatagtctatcggttccacctacaaaacata
-tccctaaattctcctctctgcctgaactgctaacacctacatcagaatatcatcaactct
-ttcctgggtggtctctgcagcatcctcacctccctacttctattctttactccctcgcca
-atgcatcctccaaacagcagccagaatggtctcttaaaatcataaaccagatcatgatac
-accccgatttaaagtcttgcaaaacttcctgtcaccttgggcataaaatctcagctcttg
-ctcatggccagtgagatcctgtcctcttctcaaccttgtctattccgctctctccctggc
-ttagatactccaaacacactggccttccttctgtcccttaaatacattcagttatttctt
-gcatttactatttcattaacctggatttctgttccctttggactctgcttggccagctac
-ctctcatctttcaggtctgcttaagtgtcactgccttaaagtgtctccctgacccgcctg
-ttatgttctatcataagactctatattcttcttagcgcctatcagagttggtgatcattt
-gatttgtaaatatattggtttattatttgtctctctcactagactgtgtgctttgtgagg
-gcaggaaccatgcctgttttggtcacggttgacacctcagtgcccagaagagtgaatgag
-acatagtgggtattcaaaacatacttagggagggagagaaaagaggaagaaaaaggaggg
-aggagaaaggaaggTCTAGTAATACTCAGAGCCCAGGAATTACACACCAGATACCCCTTG
-CTTCTACCCAAGAGGTGGTTCAGATTAGAGATTAGATTTCAAGGCTCCAGCTTGCTAGCT
-CATAACTGCTTCTACTCAAGACGGTCTATTCATGTAGCAAAGTCaaaatgtgaacatgct
-tttaagttccttgacgacaggaattgtggcttgtttactcttctacctggcatttgcaca
-gagcctgggcctgaatgaaagttcagtaaatggttcatgaatgaTTTGAATGGCATTTGC
-CTGAAGGAAATCTAAGAAAGTCTTGCCTTGGTTTCCCCATTAAATGGGGCAAGCAATTCT
-TATCTCCCCTTCCAGAGAGCTGCTGCCAACACAGGGAATCCATCCTGGAAGAAAAGATTG
-GTGGCCACCTGCACCATCAGGTGGAGGGCATCTCTCAGCTGCCCTTGCCACATCTGCAGC
-CCTAAGCTTCCAGGTGACCCCAGTGGACCAGTCTGCCCAGAGCATATCATTAGTTAGGGG
-CACTCTGCAGGAGGATGCCTGCCTTTGCTAGTGCATAGCTAATGTCCCAGGGGGCTTCCT
-CTAATTAAAACCCAAACTGCAATTATAGTTGTGCCAAAGCATGTGCACATGGCGCCACTT
-AAAAGGGACAGATTGACAAGGCGTTAACAACTCCAGAGGCAGCATTGTCCCAGCACCAGG
-TGCTACCAATCATCAAAATTAGAACCAAATGAGTCACTGGGGCTCAAGATACAGTATCCA
-GTGCAGACTAATGGGTGATTCCAAGAAACTTATGAGGATTATTTAAaacacactaactat
-gctccttctacagggcctttgcacttactagtccctgtacttcttcttgcctaactctat
-ttgatctctctcaattatcacctcttctgagacacctgctttgatcacatgaatctctac
-cctgctttatttttcttcttagtgtttattatcatctgatattatatatttgtttTGCGA
-TTGATAGCCCaaaatatgttttaatattgtataaatgtaaaacatatataaatacacaaa
-attttataattttCTGCAATACATATGTATCAAGAAGATACAGCATACACACTAAGGAGG
-GTGTCTTCTTGGGGTTGGGGGTGGTGAGGCAGGGGAATAGAAAGACTGATTCAGAAAGAA
-GAGAGGAACAATAAAAGAACAAATGAGAATATTTATATATCCTGATGACAATAGTGGGCC
-ATTATTTGAAGAGTATGATAAACTTGAATTTTCCTTCCTATCACTTGGTAAACTTGAATT
-ATTCCTCCCTGAAGTTCTGTACTCTGGGAAAAttttcttttttttttttttttggagaca
-gagtcttgctctgtcaccaggctggagtacagtggcacgatctcggctcactgcaacctc
-tgcctcctgggttcaagtgattctcatgcctcagcctcccaagtagctgggattataggc
-acatgccaccacacccagctaatttttgtatttttagtagagacagggtttcaccatgtt
-ggccaggatggtctcgatctcctgacctcatgatctgcccaccttggcctcccagagtgc
-tgggattacaggtgtgagccaccatgcctggccACTCTGGGATAATTTTATTTTGGTTTT
-TAGAAATAACTTTATTGAATATTTTAGTACCAGTAATCTTGCGATAAATTTCAGCCCTGG
-TTTGGTTGTTGTTgttgttgtttttggtctaaagccatcttgattttgcctttatttttg
-aagagtatttttactagatatagaattctaagttgtcaattatgtatattttttcagcac
-tttataaatgttatttcattgtcttctggctttcatcatttctgttgaaaagtctaccat
-cagtcttattgttgctcttctgtaggtaatgtcatttacctctgactacttttaagattt
-ttctctttatttttgtttttcagcagtcttactatgatgttcctatgtataattttctta
-gtatttaccctgcttgggattgtcagagcttcttgagtctgtgggttgatatcttttatc
-agttttgaaaaaattcttagctcttatttctgcaaatattgttaattttgtattcttatc
-ctcaccttctaggactccaaataaatgtatattttttttactaggtcccacatatctatg
-acacattcgtgtattttctattatttttctatgtatactttagtttggacacttttcatt
-tttttaagtgtgctaatcctatcttccactgtatcaaatctctgttaatcccatctgatg
-aatttttgatttcagatattatattttctcattctagaggtatcattttttcttttttat
-agacgctaattttctgatgaaattctccatcttttcaaatattttgtgcatatttttctg
-ttttttaaCATATTAATCTTAGCATGTCAAAGTCATTATCATATACCTGTTTCTATTGTC
-TATTTTATTCTGTTTGTTTTCAGATATGTCCTAGCTTTGGCATAACTAATAATGTTAATA
-GAATGCCACTTATTATACATAATGTAGAGACTCCAGATGATATATTCTTCTAGAGAAGAT
-TTACCCTCTGCTAGGCACAGAGTGGGGCTTATCATCATAAACCAGTCAGGGATTGTACTG
-AGTCAAGACTGTAAGGTAACCCCAGGAAGGTCAGTTTCCCTGTGCTTCAGTCAGTCATAC
-ACTGAACACCTCTTCTCAGAGGCTTTATGCCAAGGTTTATAGCCTCCTGCACCAGGTATC
-CCAGAATCCAGCAAGTGTCTTGAGGGATTAATGAGCCCTCAAGTCTGCCAAAGGCTCTGC
-TGGTTTCTTCCACACTAGTCCAGTGCTGCATAAAACTTGGATTCTCAGCATTCTGCTTTT
-GCCTAGAATTGGAAAATGGTCTGGGGTAAAGAAGCTATATAATTCAGCTTACTCCCCTGC
-TGTTCATTCCTTTCCAGAATTTTAGCAAGTAGTATATTTTTTTCCAATCCTatgatatct
-gacaatgctactatatttctctagtcaatttactcttccatttcctgggcaaccatttca
-ctttctcttatttcttcacatctttgacaccttctttctctcctcacttctaactgacgg
-cttacaaatgaaagcaagtggaatgacaataactttttataaaaacttctacactagtcc
-atcaacacgtctctctaatacttctccctccctctctttctctctctccctttctctctc
-tccatgtgtctgctggatcccatcattctcatctaatcaaggactttgctcctataatca
-tccctccatgaatcattttcctctctctgctaaattattcccataagtggacaaatatac
-cattagtctcccatcttctaaaaagtatataccctcccttgtctcaatatctctgtgcag
-ctacccccacattttgtttcttcccatttgaagcaaaactcctcaaaaattgtatatatt
-cactatcttcattttctttccttctatgccaaacaggttttcctccttcaaagctactct
-catcagggtcaccaaatacctctgcattgccaaatccagaggtcagttcacagacctcgc
-cttacctgattgctcagaagcatttgacactgttctctttgctggttcttcctcatgttc
-tcgacatctgagtgttggagacccccaaaatcagtcctaggactctttcttttccttcta
-tatattccttttacgtgctttccttattctctttgtatataatttaatacctctactggg
-taatttacaaagaaaacaaacttatttctcacagttctagaagctggaaagtccaagatc
-aaggcagcagcatgttcagacgtgtggtgagggctgccctctgcttcctagatggtgcct
-tgatgctgttgtcctccagaggagaggaaatctgtaaattcacatagtggaagatacgga
-attatgaaaaaggaacaaactccctccatcaagctcttttatcagtaccttgatccattc
-tgccctcatggcttaaacacctttcaaaaggccccacttcaacactgttgcattggcaat
-taagtttccaacacacacattttggggaacacattcagaccatagcaacccttttgttca
-gtctcatgattttaaatatcatttatattttatgactctcaaatgattctagccagaaat
-tatctcatgagctctagactctctctacatacccacattaacaGCAACGAAAGCACATTT
-AATCAATTTAACCCAAGGAAGTAATACGATGAGCTCAGGTAATACAGACTGAGACTTCAT
-CCAAGATCACAAGGATGGTATGTGCTAGACTCCAAAGAGATGCCCAAGATTTTGTAAATA
-CCCTTCCCTTCCACAAGAATAGAGTTGTTATTTGGTGTGATTTCTCAGGGAGTTGGGGAG
-ATCTCTTATCAAACTCCCAAATTGCTCTCCAATCTGCTCAAGTTTTCTGAAATGTTGTTG
-tttctgggtcatagcatatgcacatacttactttggttaagttcagccaaattatttctc
-cagaatggctgttccagtctacattctttccagccatgcctgtgggctcttatctccaca
-tctttgccaggtattactagccttttagtttttgcctggttaataaatgtaaagtgctaa
-ttctctgatgttttatttatcatattactaattaatttgagcatctctcacttacttgtt
-ggcttgtttctttttccataaattggtatccatttctcttgccagttttttattatggag
-tatatatatattgccaatttaaaggacttctttgaatattctagTGATTTGTCCCCTGTC
-AATTTTAGAAATTGCAAACATCTCCTAATTTGTCATTAGTCTATTATCTTTGTCTTTATG
-TCTGTCATTTAAGAGAAATCATTTTCCTGTAAATGTTTTAAAActttttattgtaaaata
-aaacacattaaaaatctcacacggcaaatgtttaacttagtaaattattataaactgaac
-cctttaaagtattactcaagtcaagaatataactttgccggccattcagaagcccctccg
-tatgttctatcccaattatagctccctctcccctccaaaagcaatattaccctgactttc
-atatcaatcactttcttgcttcttttatcatccaagtgtgcacccccagacactatggtt
-tagtcttgccATTTAAAAAAATgtttatatgtattttgagtctcttttaatctacaggct
-ccctttccatctcttctctttctttaatattcatctgttgaagaacccaggccatttgac
-ctgtacagagtcccatagtttggaatttgctgattgcaagtcttggtgaagttcaagatt
-cctctgtttaacgtctttactgtaaatggacagctggtccagaggcttcatcaggctcag
-acgctgtgttattttatcatgtggcacattcctatctgggtgcttctctttgagaaggca
-gtgacacttaaagattagatctattgattcattgcggattggaaaaaggggatgttctaa
-ttccattttttttttcattttttttaactggaataattttataaagagacacttttctca
-ctcgccattggttattgttacgaactgaattgtatccctccccaaattcattcattcgtt
-gaaacctagcccccaatgtcactgtacttggatatagggccgctagggaggtagttgagg
-ttaaatgaggtcagaagggtagggtactaatccaataagactggtacccttagcaaacaa
-agagactccagtggtctgtgtccttctctccatacctgcaaagaggaaaggccatatgaa
-gacacaatgagaagtcagccctctgtaagccaggaaggaagactcaccagaaaccacatt
-ttgtggcaccttgattttggacttcccagcctccagaactgtgagaaaataaatttctgt
-tgtttaagccacccattcggcggtattttattttggcagccctagcaaactaacaccatt
-acccaagtggtataattaatacataaaagagaagataactgcttgattctctttatttac
-caggtttcgagataatgaatttgttcctgttatcctccaaaggctaccatttaaattctt
-ttgttattattaaatcatggatttaagtatagtttgtggttttcaatccattgcattttt
-attctaattgacaatcaagttgttccatctttgaacagtaggaagctctttggcttggct
-cctgaggccttttgacttatctcccttagtccttgaagcttctttgtatcttgaatgaca
-aaatattccaggcttgtcctaccttcatatcctgctttaaacctagaatcagccatttct
-tcaaggagtcctgggtccttctaatgagaaattttatttcaagactataatatgaatgct
-agagatgttcactgctcctgggctgctcattaagtctaggcttcttgagtgggcaaagct
-aatatacatatatgtatgtgtgtgtgtgtgtatatatatatatataactcatgaattcat
-actggttcaatgagttcagttctaacttagaactcagattgttcacttaacttcttttac
-actatatttgaatcttttttcttacattctgagaattctggttcttaatatcACAGGGAG
-TGATATAATTAGGATGTCAATAGTCTTTAATTATTTAATTTATCCCATGTTGTACACACA
-ACAATACTACCAATCCTAATTACTGACAACAGTTTAAAAAGTTTTGCATATGCTATTCCA
-TTCCCTCCCCATTTTTATATTTACATAATCAAATAATAAAGCCTTTAATATATAGTCTCT
-ttctggtcttagttccgcaagtgggtatatataaaggctcaaaatcaatctttatattga
-catctctctacttatttgtgttgtctgatgctcatattgt
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta.fai b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta.fai
deleted file mode 100644
index 04a438b..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-chrM	16571	6	60	61
-chr20	1000000	16861	60	61
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/ScreenSamReads.100.input.sam b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/ScreenSamReads.100.input.sam
deleted file mode 100644
index daff721..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/ScreenSamReads.100.input.sam
+++ /dev/null
@@ -1,21 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at SQ	SN:Pf3D7_01	LN:643292	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:6a7e6510bdae0ad38e8bc3aa1adf537f	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_02	LN:947102	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:d34154a67b6b8e10d2d7aea3c83e09e7	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_03	LN:1060087	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:468c14169020248f4e41799de3a4bef5	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_04	LN:1204112	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:9b74fcd8d379f3763a31050acf098f3a	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_05	LN:1343552	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:3d84171954a6768f2a9d93796fe58d9a	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_06	LN:1418244	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:d2f87cf0c3570ae0da5dfd71bd4c506a	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_07	LN:1501717	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:493245de8db9737efb5ce128e6b65661	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_08	LN:1419563	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:1878bd1367b051daff937555e44f41b7	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_09	LN:1541723	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:87f4b581b5db461261b36b5344fe9df4	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_10	LN:1687655	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:a13945591ca5a84710655be93c75d623	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_11	LN:2038337	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:909466c6a0faec815f63b21047beea15	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_12	LN:2271478	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:c4427f71425a56c2e6325089b6bc2b7d	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_13	LN:2895605	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:5c761a4674f0363bb789b5a982952bfc	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_14	LN:3291871	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:03d21468ae712ffe4f1c62d54e4c2e2a	SP:Plasmodium falciparum
- at SQ	SN:M76611	LN:5967	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:ae96d861208f8c5912393e1441319d64	SP:Plasmodium falciparum
- at SQ	SN:PFC10_API_IRAB	LN:34242	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:ea11bbb35c7871b0b47bde08f4e62f59	SP:Plasmodium falciparum
- at RG	ID:61PA6.3	PL:illumina	PU:61PA6AAXX100630.3	LB:Solexa-32208	DT:2010-06-30T00:00:00-0400	SM:Pla HS 07560	CN:BI
- at PG	ID:bwa	PN:bwa	VN:0.5.9-tpx	CL:bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falciparum_3D7.2.sai illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.2.fastq.gz; bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falc [...]
-61PA6AAXX100630:3:100:10921:6024	589	*	0	0	*	*	0	0	AATTCGCCAGACGAGGGGGCCTTTGTCTGTCTTATCGGCTACATGGGAGGCTGGGGCGGGATAGATGC	####################################################################	RG:Z:61PA6.3
-61PA6AAXX100630:3:100:10921:6024	653	*	0	0	*	*	0	0	GCAGCAGCATGGTCTTGGCTCACTGCATCCTATTTCTCCACGTTGCCAGCATTTCTCCAGCCTCAGCC	><//-?,-'=A*558 at -)A9A###############################################	RG:Z:61PA6.3
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/empty.interval_list b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/empty.interval_list
deleted file mode 100644
index 88411fa..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/empty.interval_list
+++ /dev/null
@@ -1,4 +0,0 @@
- at SQ	SN:1	LN:249250621
- at SQ	SN:2	LN:243199373
- at SQ	SN:3	LN:198022430
-1	1	1	+	empty
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.dict b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.dict
deleted file mode 100644
index e30d415..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at SQ	SN:1	LN:249250621
- at SQ	SN:2	LN:243199373
- at SQ	SN:3	LN:198022430
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf
deleted file mode 100644
index 39bed22..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf
+++ /dev/null
@@ -1,53 +0,0 @@
-##fileformat=VCFv4.1
-##ApplyRecalibration="analysis_type=ApplyRecalibration input_file=[] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null do [...]
-##CombineVariants="analysis_type=CombineVariants input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null use [...]
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=VQSRTrancheINDEL99.00to99.90,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -4.1718 <= x < -0.8611">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00+,Description="Truth sensitivity tranche level for INDEL model at VQS Lod < -727.2136">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -727.2136 <= x < -4.1718">
-##FILTER=<ID=VQSRTrancheSNP99.00to99.90,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -25.4561 <= x < 3.2489">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00+,Description="Truth sensitivity tranche level for SNP model at VQS Lod < -38672.7015">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -38672.7015 <= x < -25.4561">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth (reads with MQ=255 or with bad mates are filtered)">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=PL,Number=G,Type=Integer,Description="Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification">
-##FORMAT=<ID=TP,Number=1,Type=Integer,Description="Phred score of the genotype combination and phase given that the genotypes are correct">
-##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=BaseQRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt Vs. Ref base qualities">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth; some reads may have been filtered">
-##INFO=<ID=DS,Number=0,Type=Flag,Description="Were any of the samples downsampled?">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=END,Number=1,Type=Integer,Description="Stop position of the interval">
-##INFO=<ID=FS,Number=1,Type=Float,Description="Phred-scaled p-value using Fisher's exact test to detect strand bias">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with at most two segregating haplotypes">
-##INFO=<ID=InbreedingCoeff,Number=1,Type=Float,Description="Inbreeding coefficient as estimated from the genotype likelihoods per-sample when compared against the Hardy-Weinberg expectation">
-##INFO=<ID=MLEAC,Number=A,Type=Integer,Description="Maximum likelihood expectation (MLE) for the allele counts (not necessarily the same as the AC), for each ALT allele, in the same order as listed">
-##INFO=<ID=MLEAF,Number=A,Type=Float,Description="Maximum likelihood expectation (MLE) for the allele frequency (not necessarily the same as the AF), for each ALT allele, in the same order as listed">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=MQRankSum,Number=1,Type=Float,Description="Z-score From Wilcoxon rank sum test of Alt vs. Ref read mapping qualities">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=RPA,Number=.,Type=Integer,Description="Number of times tandem repeat unit is repeated, for each allele (including reference)">
-##INFO=<ID=RU,Number=1,Type=String,Description="Tandem repeat unit (bases)">
-##INFO=<ID=ReadPosRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt vs. Ref read position bias">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##INFO=<ID=STR,Number=0,Type=Flag,Description="Variant is a short tandem repeat">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##INFO=<ID=set,Number=1,Type=String,Description="Source VCF for the merged record in CombineVariants">
-##PhaseByTransmission="analysis_type=PhaseByTransmission input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog= [...]
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/humgen/gsa-hpprojects/NA12878Collection/bams/CEUTrio.HiSeq.WGS.b37.list] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=[/broad/hptmp/ami/tmp/queueScatterGather/.qlog/CEUTrio.indelcall-sg/temp_020_of_300/scatter.intervals] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_s [...]
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-#CHROM	POS	ID	REF	ALT	QUAL	FILTER	INFO	FORMAT	NA12878	NA12891	NA12892
-1	8216712	rs11121115	A	G	1540.26	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=0.917;DB;DP=131;Dels=0.00;FS=11.67;HaplotypeScore=3.35;MLEAC=3;MLEAF=0.500;MQ=57.74;MQ0=1;MQRankSum=0.427;QD=11.76;ReadPosRankSum=-2.190e-01;SB=-9.390e+02;VQSLOD=5.53;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0/1:23,28:51:99:681,0,668:127	0/1:16,18:34:99:338,0,244:127	0/1:24,22:46:99:560,0,323:127
-1	17032814	rs2773183	T	C	2828.26	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0/1:63,59:122:99:1434,0,1831:127	0/1:53,56:109:99:910,0,871:127	0/1:61,30:91:99:523,0,1257:127
-1	17032818	rs2773183	T	C	2828.26	FILTER	AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0/1:63,59:122:99:1434,0,1831:127	0/1:53,56:109:99:910,0,871:127	0/1:61,30:91:99:523,0,1257:127
-2	1143476	rs4998209	C	T	1483.26	PASS	AC=2;AF=0.333;AN=6;BaseQRankSum=-4.814e+00;DB;DP=189;Dels=0.00;FS=5.61;HaplotypeScore=0.324;MLEAC=2;MLEAF=0.333;MQ=58.36;MQ0=0;MQRankSum=1.58;QD=12.06;ReadPosRankSum=0.326;SB=-9.320e+02;VQSLOD=6.81;culprit=HaplotypeScore	GT:AD:DP:GQ:PL:TP	0|0:66,0:66:99:0,178,2264:127	0|1:33,38:71:99:844,0,1024:127	0|1:26,26:52:99:678,0,719:127
-2	9240279	rs56249990	A	G	3978.01	PASS	AC=3;AF=0.500;AN=6;BaseQRankSum=1.70;DB;DP=213;Dels=0.00;FS=7.83;HaplotypeScore=1.19;MLEAC=3;MLEAF=0.500;MQ=59.40;MQ0=0;MQRankSum=0.143;QD=27.25;ReadPosRankSum=-9.700e-02;SB=-1.991e+03;VQSLOD=9.14;culprit=FS	GT:AD:DP:GQ:PL:TP	0|1:33,42:75:99:1400,0,1031:127	0|0:67,0:67:99:0,178,2277:127	1|1:0,71:71:99:2578,199,0:127
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf.idx b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf.idx
deleted file mode 100644
index f3ca0f9..0000000
Binary files a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf.idx and /dev/null differ
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1_comp.interval_list b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1_comp.interval_list
deleted file mode 100644
index c482660..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1_comp.interval_list
+++ /dev/null
@@ -1,8 +0,0 @@
- at SQ	SN:1	LN:249250621
- at SQ	SN:2	LN:243199373
- at SQ	SN:3	LN:198022430
-1	1	1	+	interval-1
-1	1	2	+	interval-2
-1	3	300	+	interval-3
-2	25	64	+	interval-4
-3	10000000	10000001	+	interval-5
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test2_comp.interval_list b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test2_comp.interval_list
deleted file mode 100644
index b6106fb..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test2_comp.interval_list
+++ /dev/null
@@ -1,7 +0,0 @@
- at SQ	SN:chrM	LN:16571	UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta	M5:d2ed829b8a1628d16cbeee88e88e39eb
- at SQ	SN:chr20	LN:1000000	UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta	M5:b4eac854d70893986ac578c53c2324f1
-chr20	1	1	+	interval-1
-chr20	1	2	+	interval-2
-chr20	3	300	+	interval-3
-chrM	25	64	+	interval-4
-chrM	1000	1001	+	interval-5
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test3_comp.interval_list b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test3_comp.interval_list
deleted file mode 100644
index f2e4b6e..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test3_comp.interval_list
+++ /dev/null
@@ -1,24 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at SQ	SN:Pf3D7_01	LN:643292	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:6a7e6510bdae0ad38e8bc3aa1adf537f	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_02	LN:947102	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:d34154a67b6b8e10d2d7aea3c83e09e7	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_03	LN:1060087	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:468c14169020248f4e41799de3a4bef5	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_04	LN:1204112	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:9b74fcd8d379f3763a31050acf098f3a	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_05	LN:1343552	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:3d84171954a6768f2a9d93796fe58d9a	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_06	LN:1418244	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:d2f87cf0c3570ae0da5dfd71bd4c506a	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_07	LN:1501717	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:493245de8db9737efb5ce128e6b65661	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_08	LN:1419563	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:1878bd1367b051daff937555e44f41b7	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_09	LN:1541723	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:87f4b581b5db461261b36b5344fe9df4	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_10	LN:1687655	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:a13945591ca5a84710655be93c75d623	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_11	LN:2038337	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:909466c6a0faec815f63b21047beea15	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_12	LN:2271478	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:c4427f71425a56c2e6325089b6bc2b7d	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_13	LN:2895605	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:5c761a4674f0363bb789b5a982952bfc	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_14	LN:3291871	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:03d21468ae712ffe4f1c62d54e4c2e2a	SP:Plasmodium falciparum
- at SQ	SN:M76611	LN:5967	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:ae96d861208f8c5912393e1441319d64	SP:Plasmodium falciparum
- at SQ	SN:PFC10_API_IRAB	LN:34242	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:ea11bbb35c7871b0b47bde08f4e62f59	SP:Plasmodium falciparum
- at RG	ID:61PA6.3	PL:illumina	PU:61PA6AAXX100630.3	LB:Solexa-32208	DT:2010-06-30T00:00:00-0400	SM:Pla HS 07560	CN:BI
- at PG	ID:bwa	PN:bwa	VN:0.5.9-tpx	CL:bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falciparum_3D7.2.sai illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.2.fastq.gz; bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falc [...]
-Pf3D7_05	1	1	+	interval-1
-Pf3D7_05	1	2	+	interval-2
-Pf3D7_05	3	300	+	interval-3
-Pf3D7_09	25	64	+	interval-4
-Pf3D7_09	1000	1001	+	interval-5
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test4_comp.interval_list b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test4_comp.interval_list
deleted file mode 100644
index 6c13c83..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test4_comp.interval_list
+++ /dev/null
@@ -1,25 +0,0 @@
- at HD	VN:1.0	SO:queryname
- at SQ	SN:Pf3D7_01	LN:643292	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:6a7e6510bdae0ad38e8bc3aa1adf537f	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_02	LN:947102	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:d34154a67b6b8e10d2d7aea3c83e09e7	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_03	LN:1060087	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:468c14169020248f4e41799de3a4bef5	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_04	LN:1204112	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:9b74fcd8d379f3763a31050acf098f3a	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_05	LN:1343552	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:3d84171954a6768f2a9d93796fe58d9a	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_06	LN:1418244	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:d2f87cf0c3570ae0da5dfd71bd4c506a	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_07	LN:1501717	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:493245de8db9737efb5ce128e6b65661	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_08	LN:1419563	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:1878bd1367b051daff937555e44f41b7	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_09	LN:1541723	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:87f4b581b5db461261b36b5344fe9df4	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_10	LN:1687655	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:a13945591ca5a84710655be93c75d623	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_11	LN:2038337	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:909466c6a0faec815f63b21047beea15	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_12	LN:2271478	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:c4427f71425a56c2e6325089b6bc2b7d	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_13	LN:2895605	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:5c761a4674f0363bb789b5a982952bfc	SP:Plasmodium falciparum
- at SQ	SN:Pf3D7_14	LN:3291871	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:03d21468ae712ffe4f1c62d54e4c2e2a	SP:Plasmodium falciparum
- at SQ	SN:M76611	LN:5967	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:ae96d861208f8c5912393e1441319d64	SP:Plasmodium falciparum
- at SQ	SN:PFC10_API_IRAB	LN:34242	UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta	AS:n/a	M5:ea11bbb35c7871b0b47bde08f4e62f59	SP:Plasmodium falciparum
- at RG	ID:61PA6.3	PL:illumina	PU:61PA6AAXX100630.3	LB:Solexa-32208	DT:2010-06-30T00:00:00-0400	SM:Pla HS 07560	CN:BI
- at PG	ID:bwa	PN:bwa	VN:0.5.9-tpx	CL:bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falciparum_3D7.2.sai illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.2.fastq.gz; bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falc [...]
-Pf3D7_05	1	1	+	interval-1
-Pf3D7_05	1	2	+	interval-2
-Pf3D7_05	3	300	+	interval-3
-Pf3D7_09	25	64	+	interval-4
-Pf3D7_09	1000	1000	+	interval-5
-Pf3D7_11	1	2038337	+	interval-6
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/variantFilter01.js b/src/test/resources/htsjdk/variant/variantFilter01.js
deleted file mode 100644
index 0036477..0000000
--- a/src/test/resources/htsjdk/variant/variantFilter01.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/** get variant having position%2==0 */
-variant.getStart()%2 == 0;
diff --git a/src/test/resources/htsjdk/variant/variantFilter02.js b/src/test/resources/htsjdk/variant/variantFilter02.js
deleted file mode 100644
index c102d25..0000000
--- a/src/test/resources/htsjdk/variant/variantFilter02.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/** prints a VARIATION if two samples at least have a DP>100 */ 
-function myfilterFunction(thevariant)
-    {
-    var samples=header.genotypeSamples;
-    var countOkDp=0;
-
-
-    for(var i=0; i< samples.size();++i)
-        {
-        var sampleName=samples.get(i);
-        if(! variant.hasGenotype(sampleName)) continue;
-        var genotype = thevariant.genotypes.get(sampleName);
-        if( ! genotype.hasDP()) continue;
-        var dp= genotype.getDP();
-        if(dp > 100 ) countOkDp++;
-        }
-    return (countOkDp>2)
-    }
-
-myfilterFunction(variant)
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl
deleted file mode 100755
index 03cee57..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl
deleted file mode 100755
index 44ba163..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl
deleted file mode 100755
index da640ff..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl
deleted file mode 100755
index 400a7ea..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl
deleted file mode 100755
index 963d78a..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl
deleted file mode 100755
index 9f410af..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl
deleted file mode 100755
index 0250bba..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl
deleted file mode 100755
index 46d3ed8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl
deleted file mode 100755
index f5d00e9..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl
deleted file mode 100755
index db03e1d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl
deleted file mode 100755
index 396e1df..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl
deleted file mode 100755
index f21fc9f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl
deleted file mode 100755
index 4306d65..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl
deleted file mode 100755
index f6dc157..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl
deleted file mode 100755
index 4b98ef8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl
deleted file mode 100755
index f6b49fc..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl
deleted file mode 100755
index 221e4b2..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl
deleted file mode 100755
index 6495d0f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl
deleted file mode 100755
index ef053f0..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl
deleted file mode 100755
index 64e4b04..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl
deleted file mode 100755
index 88839a6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl
deleted file mode 100755
index 7cc94c6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl
deleted file mode 100755
index b57af2a..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl
deleted file mode 100755
index 90346a3..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl
deleted file mode 100755
index 150eb2f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl
deleted file mode 100755
index 505eea4..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl
deleted file mode 100755
index 05d283f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl
deleted file mode 100755
index d2f8d41..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl
deleted file mode 100755
index 47f4750..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl
deleted file mode 100755
index 95dbd0b..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl
deleted file mode 100755
index 15c69cb..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl
deleted file mode 100755
index 132eb40..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl
deleted file mode 100755
index 3e662d9..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl
deleted file mode 100755
index 205eacc..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl
deleted file mode 100755
index 48d48d5..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl
deleted file mode 100755
index f8a314e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl
deleted file mode 100755
index 72eb66c..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl
deleted file mode 100755
index c590afb..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl
deleted file mode 100755
index bfd64e9..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl
deleted file mode 100755
index 82d9967..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl
deleted file mode 100755
index 2daedc8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl
deleted file mode 100755
index 2d1d4c0..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl
deleted file mode 100755
index 243835d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl
deleted file mode 100755
index 299ed20..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl
deleted file mode 100755
index 44b0539..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl
deleted file mode 100755
index 15e1360..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl
deleted file mode 100755
index 5602b08..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl
deleted file mode 100755
index c009189..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl
deleted file mode 100755
index 3f9112d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl
deleted file mode 100755
index 5292115..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl
deleted file mode 100755
index 3e5f293..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl
deleted file mode 100755
index fb99bc5..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl
deleted file mode 100755
index befaf8f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl
deleted file mode 100755
index 473910d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C59.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C59.1/s_1_1101.bcl
deleted file mode 100755
index fac5bec..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C59.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl
deleted file mode 100755
index 7f15c76..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C60.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C60.1/s_1_1101.bcl
deleted file mode 100755
index 86e2353..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C60.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C61.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C61.1/s_1_1101.bcl
deleted file mode 100755
index 9831410..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C61.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C62.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C62.1/s_1_1101.bcl
deleted file mode 100755
index bad6be4..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C62.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C63.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C63.1/s_1_1101.bcl
deleted file mode 100755
index 3c2a372..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C63.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C64.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C64.1/s_1_1101.bcl
deleted file mode 100755
index a90bc53..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C64.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C65.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C65.1/s_1_1101.bcl
deleted file mode 100755
index 21b83c8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C65.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C66.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C66.1/s_1_1101.bcl
deleted file mode 100755
index 59c7d45..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C66.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl
deleted file mode 100755
index 80caafc..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl
deleted file mode 100755
index 461909d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl
deleted file mode 100755
index 43b8d87..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/s_1_1101.filter b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/s_1_1101.filter
deleted file mode 100755
index 6f939c0..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/s_1_1101.filter and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/L001/s_1_1101.clocs b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/L001/s_1_1101.clocs
deleted file mode 100755
index 7d39855..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/L001/s_1_1101.clocs and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl
deleted file mode 100755
index 34c6790..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl
deleted file mode 100755
index ebd3bd6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl
deleted file mode 100755
index 30a011e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl
deleted file mode 100755
index c210e60..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl
deleted file mode 100755
index 545a11a..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl
deleted file mode 100755
index 2fef451..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl
deleted file mode 100755
index dea83d8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl
deleted file mode 100755
index 87a0a75..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl
deleted file mode 100755
index fbc27ca..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl
deleted file mode 100755
index acb84a8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl
deleted file mode 100755
index c7a8aa6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl
deleted file mode 100755
index 9c55e8e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl
deleted file mode 100755
index 16dc356..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl
deleted file mode 100755
index d79c014..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl
deleted file mode 100755
index b7acb77..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl
deleted file mode 100755
index c4a16a3..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl
deleted file mode 100755
index dffddf8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl
deleted file mode 100755
index 33009f6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl
deleted file mode 100755
index e41df54..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl
deleted file mode 100755
index c1674bf..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl
deleted file mode 100755
index ddf2c63..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl
deleted file mode 100755
index 2e5753f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl
deleted file mode 100755
index 52f8f1f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl
deleted file mode 100755
index 096299b..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl
deleted file mode 100755
index 154911e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl
deleted file mode 100755
index 2fadbf9..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl
deleted file mode 100755
index 26ffd9b..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl
deleted file mode 100755
index 6bb899a..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl
deleted file mode 100755
index 9ef653f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl
deleted file mode 100755
index e5dc298..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl
deleted file mode 100755
index 3a990cf..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl
deleted file mode 100755
index d4c7ec2..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl
deleted file mode 100755
index 5ae5305..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl
deleted file mode 100755
index 6ec1b8c..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl
deleted file mode 100755
index 1b3bc23..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl
deleted file mode 100755
index b91ab3d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl
deleted file mode 100755
index 72f026e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl
deleted file mode 100755
index f84ee35..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl
deleted file mode 100755
index 28af6d0..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl
deleted file mode 100755
index c668327..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl
deleted file mode 100755
index 70827f0..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl
deleted file mode 100755
index bad8f53..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl
deleted file mode 100755
index ec3a7fa..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl
deleted file mode 100755
index 1820ae6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl
deleted file mode 100755
index e20873b..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl
deleted file mode 100755
index a9d9fa5..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl
deleted file mode 100755
index df8caba..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl
deleted file mode 100755
index e5d4067..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl
deleted file mode 100755
index c3f88ca..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl
deleted file mode 100755
index 35ca65b..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl
deleted file mode 100755
index dcc1994..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl
deleted file mode 100755
index 76d360e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl
deleted file mode 100755
index c0b65db..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl
deleted file mode 100755
index 2458983..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl
deleted file mode 100755
index 6d5d107..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl
deleted file mode 100755
index f248e20..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl
deleted file mode 100755
index 7e21656..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl
deleted file mode 100755
index 359ff7d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/s_1_1101.filter b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/s_1_1101.filter
deleted file mode 100755
index 0ad05bc..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/s_1_1101.filter and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGGTAT.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGGTAT.sam
deleted file mode 100644
index f36c12a..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGGTAT.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.ACAGGTAT	LB:LN_ACAGGTAT	SM:SA_ACAGGTAT	CN:BI
-HiMom:1:1101:1236:2121	77	*	0	0	*	*	0	0	.GGTGCTTCATATCCCTCTAGAGGA	#1=BDDFFHHHHHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1101:1236:2121	141	*	0	0	*	*	0	0	TTGCGCTTACTTTGTAGCCTTCATC	CCCFFFFFHHHHHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1201:1341:2116	77	*	0	0	*	*	0	0	.AGAAGCCCCAGGAGGAAGACAGTC	#1=DDFFFHHHHHHHJIIJJJJJGI	RG:Z:HiMom.1
-HiMom:1:1201:1341:2116	141	*	0	0	*	*	0	0	ATAACAGCGAGACTGGCAACTTAAA	#########################	RG:Z:HiMom.1
-HiMom:1:2101:1063:2206	77	*	0	0	*	*	0	0	TCCTATTCGCCTACACAATTCTCCG	CCCFFFFFHHHHHJJJJJJJHJJJJ	RG:Z:HiMom.1
-HiMom:1:2101:1063:2206	141	*	0	0	*	*	0	0	.TGCTAGGATGAGGATGGATAGTAA	#1=DDDFFHHHHHJHIIJHIIIHHJ	RG:Z:HiMom.1
-HiMom:1:2101:1325:2083	77	*	0	0	*	*	0	0	.CAGAAGAAAGGGCCTTGTCGGAGG	#1=DDDDDHHFHDGI at EEHG:?FA8	RG:Z:HiMom.1
-HiMom:1:2101:1325:2083	141	*	0	0	*	*	0	0	TGTGCTCTTCCGATCTGGAGAAAAA	#########################	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGTTGA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGTTGA.sam
deleted file mode 100644
index e457cdd..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGTTGA.sam
+++ /dev/null
@@ -1,6 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.ACAGTTGA	LB:LN_ACAGTTGA	SM:SA_ACAGTTGA	CN:BI
-HiMom:1:2101:1048:2238	77	*	0	0	*	*	0	0	.CTGCCGTGTCCTGACTTCTGGAAT	#1:B?ADDACF<DCG;EG<FHH at CE	RG:Z:HiMom.1
-HiMom:1:2101:1048:2238	141	*	0	0	*	*	0	0	.GTCACATCGTTGAAGCACTGGATC	#11ADDDB<CFFHCHGDBHGIIIII	RG:Z:HiMom.1
-HiMom:1:2101:1216:2193	77	*	0	0	*	*	0	0	TTTTCTTGGCCTCTGTTTTTTTTTT	BCCFDFFFHHFFHJIGIJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:2101:1216:2193	141	*	0	0	*	*	0	0	AGGCATGACACTGCATTTTAAATAC	@@@DDDDDHFFHHGGDFHFHIIHGG	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACTAAGAC.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACTAAGAC.sam
deleted file mode 100644
index 9b6932a..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACTAAGAC.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.ACTAAGAC	LB:LN_ACTAAGAC	SM:SA_ACTAAGAC	CN:BI
-HiMom:1:1101:1259:2152	77	*	0	0	*	*	0	0	CACCTATAATCCCAGCTACTCCAGA	CCCFFFFFHHHHHJJJJJJIJJJIJ	RG:Z:HiMom.1
-HiMom:1:1101:1259:2152	141	*	0	0	*	*	0	0	ATTTTTATATTTTTTTAGACATAGG	CCCFFFFFGHHHHJJJJIGIIJJJJ	RG:Z:HiMom.1
-HiMom:1:1101:1261:2127	589	*	0	0	*	*	0	0	.TGAAATCTGGATAGGCTGGAGTTA	#0-@@@###################	RG:Z:HiMom.1
-HiMom:1:1101:1261:2127	653	*	0	0	*	*	0	0	TTTTTTTTTTTTTTTTTTTTTTTTT	CCCFFFFFHGHHHJJIFDDDDDDDD	RG:Z:HiMom.1
-HiMom:1:2101:1021:2209	77	*	0	0	*	*	0	0	.GGCCCCACCCTCCTCCAGCACGTC	#1=DDFFFHHHHHJJJJJJHIIHFH	RG:Z:HiMom.1
-HiMom:1:2101:1021:2209	141	*	0	0	*	*	0	0	..GGAAGGCTGCTAGCTGGCCAGAG	##08@>??@@??@?????????>?@	RG:Z:HiMom.1
-HiMom:1:2101:1262:2128	589	*	0	0	*	*	0	0	AGCAGAAGGGCAAAAGCTGGCTTGA	9;<@:@###################	RG:Z:HiMom.1
-HiMom:1:2101:1262:2128	653	*	0	0	*	*	0	0	TCTTGTGGTAACTTTTCTGACACCT	-(---9@;@?:8>?4:>?@######	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/AGGTCGCA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/AGGTCGCA.sam
deleted file mode 100644
index 3797f98..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/AGGTCGCA.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.AGGTCGCA	LB:LN_AGGTCGCA	SM:SA_AGGTCGCA	CN:BI
-HiMom:1:1101:1150:2228	77	*	0	0	*	*	0	0	GCTACTCAGTAGACAGTCCCACCCT	@@CADDDDFCFHHIIIIGGIIGGGI	RG:Z:HiMom.1
-HiMom:1:1101:1150:2228	141	*	0	0	*	*	0	0	ATGGGAGGCGATTCCTAGGGGGTTG	8?=DD8;@BH6DHD<FGGGEIGHIG	RG:Z:HiMom.1
-HiMom:1:1101:1491:2120	77	*	0	0	*	*	0	0	.GGCAGGTGCCCCCACTTGACTCTC	#1?DFFFFGHHHHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1101:1491:2120	141	*	0	0	*	*	0	0	GGCCAGGCTGAACTTCTGAGCTGCT	CCCFFFFFHHHGHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1201:1190:2194	77	*	0	0	*	*	0	0	AACCTGGCGCTAAACCATTCGTAGA	CCCFFFFFHHHHHJJJJJJJJIJJJ	RG:Z:HiMom.1
-HiMom:1:1201:1190:2194	141	*	0	0	*	*	0	0	ACAAACCCTTGTGTCGAGGGCTGAC	CCCFFFFFHHHHHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:2101:1188:2195	77	*	0	0	*	*	0	0	TTAGACCGTCGTGAGACAGGTTAGT	@CCFFFFFHHHHHJJJJJIIEHIJH	RG:Z:HiMom.1
-HiMom:1:2101:1188:2195	141	*	0	0	*	*	0	0	GCACATACACCAAATGTCTGAACCT	CCCFFFFFHHHHHJJJHIJJJJJJJ	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ATTATCAA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ATTATCAA.sam
deleted file mode 100644
index 36d2d52..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ATTATCAA.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.ATTATCAA	LB:LN_ATTATCAA	SM:SA_ATTATCAA	CN:BI
-HiMom:1:1101:1100:2207	77	*	0	0	*	*	0	0	ACGACAGACGTTCTTTCTTTGCTGC	CCCFFFFFHHFHHJIJJJJJHIJJH	RG:Z:HiMom.1
-HiMom:1:1101:1100:2207	141	*	0	0	*	*	0	0	AGGCT............G.......	#########################	RG:Z:HiMom.1
-HiMom:1:1101:1157:2135	77	*	0	0	*	*	0	0	.GGACATTGTAATCATTTCTTACAA	#1=DD?DDHHHHHGGHIIIIIIIII	RG:Z:HiMom.1
-HiMom:1:1101:1157:2135	141	*	0	0	*	*	0	0	TTTAAAGTCTTAATCAAAGATGATA	CCCFFFFFHHHHHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1101:1269:2170	77	*	0	0	*	*	0	0	ACAGTGTGGGAGGCAGACGAAGAGA	@@@DDDDDFA:C at EGA?FD<FFHII	RG:Z:HiMom.1
-HiMom:1:1101:1269:2170	141	*	0	0	*	*	0	0	TTCCAAGCCTGTGCTTTAAGGAAAA	@@<ADBDBDF8DDCFH at GIE@@GGH	RG:Z:HiMom.1
-HiMom:1:1201:1018:2217	589	*	0	0	*	*	0	0	.TTTCTCTGGGCGCAAAGATGTTCA	#07;8=8<<99(:=@@/@7>>6=?>	RG:Z:HiMom.1
-HiMom:1:1201:1018:2217	653	*	0	0	*	*	0	0	.........................	#########################	RG:Z:HiMom.1	XN:i:1
-HiMom:1:1201:1118:2198	77	*	0	0	*	*	0	0	CAAGTGTACAGGATTAGACTGGGTT	BCCFDEBDHHHHHIJJJGIIIJJGH	RG:Z:HiMom.1
-HiMom:1:1201:1118:2198	141	*	0	0	*	*	0	0	AATAAACTTTATTAAAGCAGTTAAA	C at CFFFFFHDHHHGIIIJJJIJJJJ	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAATAGTC.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAATAGTC.sam
deleted file mode 100644
index d598919..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAATAGTC.sam
+++ /dev/null
@@ -1,16 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.CAATAGTC	LB:LN_CAATAGTC	SM:SA_CAATAGTC	CN:BI
-HiMom:1:1101:1316:2126	77	*	0	0	*	*	0	0	.AAAAAAAAAAAAAAAAAAAAAAAA	#1BDFFFFHHHHHJJJJFDDDDDDD	RG:Z:HiMom.1	XN:i:1
-HiMom:1:1101:1316:2126	141	*	0	0	*	*	0	0	TCTTTTTTTTTTTTTTTTTTTTTTT	CCCFFFFFHHHHHJJJJHFDDDDDD	RG:Z:HiMom.1
-HiMom:1:1101:1399:2128	77	*	0	0	*	*	0	0	.TGCCCTTCGTCCTGGGAAACGGGG	#1BDFFFFHHHHHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1101:1399:2128	141	*	0	0	*	*	0	0	ACAAACCCTTGTGTCGAGGGCTGAC	CCCFFFFFHHHHHIJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1201:1054:2151	77	*	0	0	*	*	0	0	.TAGTGCTGGGCACTAAGTAATACC	#4=DDDFFHHHHHJJJJJHIJJJJJ	RG:Z:HiMom.1
-HiMom:1:1201:1054:2151	141	*	0	0	*	*	0	0	GTCAGGCACTGAGAATATATGGGTG	CBCFFFFFHHHHHJJJJJJJJJJEG	RG:Z:HiMom.1
-HiMom:1:1201:1345:2181	77	*	0	0	*	*	0	0	GGATAATCCTATTTATTACCTCAGA	BBBDDFFFHHHHHJJJJJJJJJIJJ	RG:Z:HiMom.1
-HiMom:1:1201:1345:2181	141	*	0	0	*	*	0	0	ATACGGATGTGTTTAGGAGTGGGAC	CCCFFFFFHHHHHIIJJHJFHIJIJ	RG:Z:HiMom.1
-HiMom:1:1201:1392:2184	77	*	0	0	*	*	0	0	TTTCAGATTGGTCATTGTTAGTGTA	??@BDDDEHBHADHHIIEHDHFHFF	RG:Z:HiMom.1
-HiMom:1:1201:1392:2184	141	*	0	0	*	*	0	0	ATCTTTATTCATTTGTATGATCTTA	@@BFFFFFHFFHFHIHIIJIJJJJI	RG:Z:HiMom.1
-HiMom:1:2101:1172:2152	589	*	0	0	*	*	0	0	AACACGGACAAAGGAGTCTAACACG	<<<??8@@#################	RG:Z:HiMom.1
-HiMom:1:2101:1172:2152	653	*	0	0	*	*	0	0	ATCGTTTCTGGGGACTAGTGAGGCG	#########################	RG:Z:HiMom.1
-HiMom:1:2101:1491:2093	77	*	0	0	*	*	0	0	.CTATGCCGATCGGGTGTCCGCACT	#1=DDDDDHHFHHIIEHHHBGHGII	RG:Z:HiMom.1
-HiMom:1:2101:1491:2093	141	*	0	0	*	*	0	0	AGAGACGGGGTCTCGCTATGTTGCC	BCCDFFFFHHHHHJIIJJJJIJIJJ	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAGCGGTA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAGCGGTA.sam
deleted file mode 100644
index e42e715..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAGCGGTA.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.CAGCGGTA	LB:LN_CAGCGGTA	SM:SA_CAGCGGTA	CN:BI
-HiMom:1:1101:1420:2213	77	*	0	0	*	*	0	0	TACCTGGTTGATCCTGCCAGTAGCA	@@CFFFFDDHHGHJGGHIJJIHGBH	RG:Z:HiMom.1
-HiMom:1:1101:1420:2213	141	*	0	0	*	*	0	0	TTCACTGTACCGGCCGTGCGTACTT	@CCFFFFDHHHFGIJJJJJJGHIGG	RG:Z:HiMom.1
-HiMom:1:1201:1364:2113	77	*	0	0	*	*	0	0	.CACTCATTTTCTTATGTGGGATAT	#1=DDFDFHHHHHIJJIFHIIHHHI	RG:Z:HiMom.1
-HiMom:1:1201:1364:2113	141	*	0	0	*	*	0	0	TAAAGAGAGCCAGTGGAGTTACGAC	#########################	RG:Z:HiMom.1
-HiMom:1:2101:1072:2170	77	*	0	0	*	*	0	0	ATCACCGCACTCATTTCCCGCTTCC	CCCFFFFFHHHACEEGHIIBHIIII	RG:Z:HiMom.1
-HiMom:1:2101:1072:2170	141	*	0	0	*	*	0	0	.GGGGAGACAGAGAGGATCAGAAGT	#4=BDDFDHHDFHEGFEGGIJIIIG	RG:Z:HiMom.1
-HiMom:1:2101:1123:2095	77	*	0	0	*	*	0	0	.TGGACAACATGTTCGAGAGCTACA	#1=BBDDDFFFFDGFGIG?F;HHFI	RG:Z:HiMom.1
-HiMom:1:2101:1123:2095	141	*	0	0	*	*	0	0	TCCGCCTCCAGCTTCAGCTTCTCCT	@@@FDDFFHHHHHJHGGJIJJJEHH	RG:Z:HiMom.1
-HiMom:1:2101:1151:2236	589	*	0	0	*	*	0	0	TTAAAGAGGTTCAGGGATGCAGAGT	#########################	RG:Z:HiMom.1
-HiMom:1:2101:1151:2236	653	*	0	0	*	*	0	0	TTTGAAGCCTCTTTATCCTTGGCAT	#########################	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CGCTATGT.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CGCTATGT.sam
deleted file mode 100644
index dc2b3bf..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CGCTATGT.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.CGCTATGT	LB:LN_CGCTATGT	SM:SA_CGCTATGT	CN:BI
-HiMom:1:1101:1291:2150	77	*	0	0	*	*	0	0	CGTGGGGAACCTGGCGCTAAACCAT	@BBFFFFFHHHHHJJJJIJJJJJIJ	RG:Z:HiMom.1
-HiMom:1:1101:1291:2150	141	*	0	0	*	*	0	0	ACAAACCCTTGTGTCGAGGGCTGAC	CCCFFFFFHHFHHIJJJIIIGIJIJ	RG:Z:HiMom.1
-HiMom:1:1101:1314:2233	77	*	0	0	*	*	0	0	GTTTATTGGGGCATTCCTTATCCCA	@??DDDDBDHF>FCHGGGBFAAED9	RG:Z:HiMom.1
-HiMom:1:1101:1314:2233	141	*	0	0	*	*	0	0	AGGAAAGTTGGGCTGACCTGACAGA	@@<DDD;=FBFADBCGDEH?F;FCG	RG:Z:HiMom.1
-HiMom:1:1101:1441:2148	77	*	0	0	*	*	0	0	ACTTTCACCGCTACACGACCGGGGG	CCCFFFFFHGFFHIIFIHJIGGII>	RG:Z:HiMom.1
-HiMom:1:1101:1441:2148	141	*	0	0	*	*	0	0	TTTTGGCTCTAGAGGGGGTAGAGGG	CCCFFFFFHHDFBHIIJJ1?FGHIJ	RG:Z:HiMom.1
-HiMom:1:1201:1043:2246	77	*	0	0	*	*	0	0	.TTCTCGGCTGTCATGTGCAACATT	#1=DDBDFHHHDFFBHGHGHIIJEH	RG:Z:HiMom.1
-HiMom:1:1201:1043:2246	141	*	0	0	*	*	0	0	.GCATCATTTC..GCTTCTCTCTGT	#0;@@??@=@>##22=;@??><@??	RG:Z:HiMom.1
-HiMom:1:1201:1134:2144	77	*	0	0	*	*	0	0	TGCCAGGAAGTGTTTTTTCTGGGTC	@CCFFEFFHHFFFGIJJJJJJJJGH	RG:Z:HiMom.1
-HiMom:1:1201:1134:2144	141	*	0	0	*	*	0	0	AGTGTGAGTAATGGTTGAGAGGTGG	B@?DDDFFFHHGHJHHGFIHHIFGI	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CTGTAATC.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CTGTAATC.sam
deleted file mode 100644
index 2ee594d..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CTGTAATC.sam
+++ /dev/null
@@ -1,14 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.CTGTAATC	LB:LN_CTGTAATC	SM:SA_CTGTAATC	CN:BI
-HiMom:1:1101:1403:2194	77	*	0	0	*	*	0	0	CTAAACAGAGAGAAGGTTTCTCTTT	CCCFFFFFHHHHHJJJFHIJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1101:1403:2194	141	*	0	0	*	*	0	0	ACATGGTGAAACCCTGTCTCTACTA	CCCFFFDDHHHHHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1201:1045:2105	589	*	0	0	*	*	0	0	.TAAAGAGAAATCAAGAATACTATT	#-4@?(@)@@###############	RG:Z:HiMom.1
-HiMom:1:1201:1045:2105	653	*	0	0	*	*	0	0	.TTTTTTTTTT..TTTTTTTTTTTT	#0;@@@@@@@?##0:????????=<	RG:Z:HiMom.1
-HiMom:1:1201:1483:2126	589	*	0	0	*	*	0	0	.TGATAAGGTGTTGCTATGTTACCC	#1:D?DDDDA??2:<CC4:AEDF>?	RG:Z:HiMom.1
-HiMom:1:1201:1483:2126	653	*	0	0	*	*	0	0	GCATGCAGCTGGGTGCTGTGATGCA	@@@DDDBB<DD8F<<CGG?AA?A<F	RG:Z:HiMom.1
-HiMom:1:2101:1011:2102	77	*	0	0	*	*	0	0	.AAACAAAACTGTAGAACTGTGTAT	#1=DDFFFHHHHHJJIJJJIHHHJJ	RG:Z:HiMom.1
-HiMom:1:2101:1011:2102	141	*	0	0	*	*	0	0	.....TCACACATAATTTTAAAATT	#####22@?@@??@@@@@??@@@@@	RG:Z:HiMom.1
-HiMom:1:2101:1245:2154	77	*	0	0	*	*	0	0	TCGTTAAGTATATTCTTAGGTATTT	CCCFFDFFFHFHHIIJJJJJFJJJI	RG:Z:HiMom.1
-HiMom:1:2101:1245:2154	141	*	0	0	*	*	0	0	ACCAATCAGTAGCACCACTATACAC	CCCFFFFFHHHHHJJJJJJIJJJJJ	RG:Z:HiMom.1
-HiMom:1:2101:1386:2105	77	*	0	0	*	*	0	0	.TACTAAAGAAAAAGTTGAAGAACT	#1=DDDFFHHHHHJJGHIJJJJIJJ	RG:Z:HiMom.1
-HiMom:1:2101:1386:2105	141	*	0	0	*	*	0	0	AGGAATTATTCTTCTGCCATAAGGT	B@@DDFFFHGFHHIJJJJJGIGIJH	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GACCAGGA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GACCAGGA.sam
deleted file mode 100644
index 7fbc0a2..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GACCAGGA.sam
+++ /dev/null
@@ -1,16 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.GACCAGGA	LB:LN_GACCAGGA	SM:SA_GACCAGGA	CN:BI
-HiMom:1:1101:1089:2172	77	*	0	0	*	*	0	0	TTCCAGCATGCGGTTTAAGTAGGAT	@CCFDFDBDFBF:<CEBHAFHHICH	RG:Z:HiMom.1
-HiMom:1:1101:1089:2172	141	*	0	0	*	*	0	0	TCCGG....................	:<<??####################	RG:Z:HiMom.1
-HiMom:1:1101:1347:2149	77	*	0	0	*	*	0	0	GAGCAGATCGGAAGAGCACAGATCG	@@@FFDDDHHHHHIJJBGGHJIHEG	RG:Z:HiMom.1
-HiMom:1:1101:1347:2149	141	*	0	0	*	*	0	0	GCTCTTCCGATCTGTGCTCTTCCGA	CCCFFFFFDFHHFIJDGIGGHGIGH	RG:Z:HiMom.1
-HiMom:1:1201:1095:2146	77	*	0	0	*	*	0	0	GCTGAGTCATGTAGTAAGCCTGTGC	BB at FDDDFHHHHHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1201:1095:2146	141	*	0	0	*	*	0	0	ACTGACAACACCAAATGCTGCTAAG	CCCFFFFFHHHHHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1201:1123:2161	589	*	0	0	*	*	0	0	CACTAACTCCTGACCTCAAATAATC	?7?=DD?DD+CDBE>E at EEF@+<CF	RG:Z:HiMom.1
-HiMom:1:1201:1123:2161	653	*	0	0	*	*	0	0	CGTGTGCTCTTCCGATCTGCATACA	===AAAA8AAAA<AAA)@CBA9>A#	RG:Z:HiMom.1
-HiMom:1:1201:1439:2156	77	*	0	0	*	*	0	0	AGCCGCGAGGTGCTGGCGGACTTCC	:;1BDDDAA88A<?<E1C:D#####	RG:Z:HiMom.1
-HiMom:1:1201:1439:2156	141	*	0	0	*	*	0	0	GGAGATTATTTGCCTTGAAGTAAGC	-;(22<>>@>8@>8;@#########	RG:Z:HiMom.1
-HiMom:1:2101:1207:2084	589	*	0	0	*	*	0	0	.TAGATGACCAAAACTTGCAGGGCA	#1:A<?@A+7A=?CBCCBCCBAAAA	RG:Z:HiMom.1
-HiMom:1:2101:1207:2084	653	*	0	0	*	*	0	0	TCACCACTCTTCTGGGCATCCCCTG	@@@DDEDFHHHHHIJIHHGHGGJJJ	RG:Z:HiMom.1
-HiMom:1:2101:1312:2105	77	*	0	0	*	*	0	0	.TTCCCTCAGGATAGCTGGCGCTCT	#1=DDFFFGHGHHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:2101:1312:2105	141	*	0	0	*	*	0	0	GTTGAGAATAGGTTGAGATCGTTTC	@CCFFFDFHHFHDHIJJJJJJJIJJ	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCGTCGA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCGTCGA.sam
deleted file mode 100644
index 60aa17e..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCGTCGA.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.GCCGTCGA	LB:LN_GCCGTCGA	SM:SA_GCCGTCGA	CN:BI
-HiMom:1:1101:1111:2148	77	*	0	0	*	*	0	0	GTGGAGACCACCTCCGAGGCCTTGT	BBCFFFFFHHHHHJJJIJJJJJJJI	RG:Z:HiMom.1
-HiMom:1:1101:1111:2148	141	*	0	0	*	*	0	0	GCGAA.A..........GGACGAC.	#########################	RG:Z:HiMom.1
-HiMom:1:1101:1221:2143	77	*	0	0	*	*	0	0	TTTGGTGGAAATTTTTTGTTATGAT	CCCFFBDBHFD?FBFHIIGGIC at EF	RG:Z:HiMom.1
-HiMom:1:1101:1221:2143	141	*	0	0	*	*	0	0	CAATTGAATGTCTGCACAGCCGCTT	@@@FFFFDHHHHHJJJIIIJGHIJJ	RG:Z:HiMom.1
-HiMom:1:1101:1327:2200	589	*	0	0	*	*	0	0	AGGGGGATCCGCCGGGGGACCACAA	#########################	RG:Z:HiMom.1
-HiMom:1:1101:1327:2200	653	*	0	0	*	*	0	0	GTCATCTGGGCTGTCGACAGGTGTC	@B at FFFFFHHHHGIJJJJJJIFHHI	RG:Z:HiMom.1
-HiMom:1:2101:1122:2136	77	*	0	0	*	*	0	0	GTAGGCGCTCAGCAAATACTTGTCG	@@@DDDD8?<CACEHHBBHDAAFH@	RG:Z:HiMom.1
-HiMom:1:2101:1122:2136	141	*	0	0	*	*	0	0	CTTGCCAGCCTGCAGGCCCCGCGGC	???BBAABDD?DDIID)A:3<EADD	RG:Z:HiMom.1
-HiMom:1:2101:1459:2083	77	*	0	0	*	*	0	0	.CACACGCCACACGGAGCACACTTT	#4=DDFFFHHHHHJJJJJJJJIIJJ	RG:Z:HiMom.1
-HiMom:1:2101:1459:2083	141	*	0	0	*	*	0	0	ATTTCACCAAAATAATCAGAAGGCC	CCCFFFFDBHGHHIGGIJFJJGGFH	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCTAGCC.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCTAGCC.sam
deleted file mode 100644
index 9cdc1b4..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCTAGCC.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.GCCTAGCC	LB:LN_GCCTAGCC	SM:SA_GCCTAGCC	CN:BI
-HiMom:1:1101:1165:2239	77	*	0	0	*	*	0	0	GGCGGAGGCAGCATTTCAGCTGTGA	CCCFFDFFHHHHHIJJIGHHHJHHF	RG:Z:HiMom.1
-HiMom:1:1101:1165:2239	141	*	0	0	*	*	0	0	ATGGAAGTCGAGACAGAAGTGAGAA	#########################	RG:Z:HiMom.1
-HiMom:1:1101:1290:2225	77	*	0	0	*	*	0	0	CTTGGGCGCATGGTGAGGGAGGGAG	@@@FFDDFHDFH??CBEBHHIGDCD	RG:Z:HiMom.1
-HiMom:1:1101:1290:2225	141	*	0	0	*	*	0	0	TCAGTTCACTGGCAAAGACAGTCAC	C@@FBEDDFHFHGIIICEHGDHBHE	RG:Z:HiMom.1
-HiMom:1:1201:1280:2179	77	*	0	0	*	*	0	0	TTCAAGGAATCGTCCTGCCTCAGCC	BCCFFFFFHHHHHJJJJJJJJJJJJ	RG:Z:HiMom.1
-HiMom:1:1201:1280:2179	141	*	0	0	*	*	0	0	GAGGACTGCTTGAGTCCAGGAGTTC	@@BFFDEFGHHHHIFGCHIJJJGGI	RG:Z:HiMom.1
-HiMom:1:1201:1300:2137	77	*	0	0	*	*	0	0	.TGTAATCCCAGCTCTCAGGGAGGC	#1=ADDDDDDDBBA?@AE?E at FE8;	RG:Z:HiMom.1
-HiMom:1:1201:1300:2137	141	*	0	0	*	*	0	0	GCTCTTCCGATCTTTTTTTTAATTT	@@?DDDDDFDHADEHGIGGED3?FD	RG:Z:HiMom.1
-HiMom:1:2101:1023:2237	589	*	0	0	*	*	0	0	.TAAACAGCTTCTGCACAGCCAAAG	#00@@?>=39>9;<412@?######	RG:Z:HiMom.1
-HiMom:1:2101:1023:2237	653	*	0	0	*	*	0	0	..TTTGTTTGAGTTCCTTGTAGATT	##0:=@?>?@???@:>?@??>?;?<	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/N.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/N.sam
deleted file mode 100644
index 5cc7ccf..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/N.sam
+++ /dev/null
@@ -1,34 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.N	LB:LN_N	SM:SA_N	CN:BI
-HiMom:1:1101:1031:2224	589	*	0	0	*	*	0	0	.AATA............T.......	#0;@@####################	BC:Z:NNNNNNNN	RG:Z:HiMom.1
-HiMom:1:1101:1031:2224	653	*	0	0	*	*	0	0	.........................	#########################	BC:Z:NNNNNNNN	RG:Z:HiMom.1	XN:i:1
-HiMom:1:1101:1039:2147	589	*	0	0	*	*	0	0	.CCAA.G..GG....ATGTAA....	#4;@@#4##2<####43@@@@####	BC:Z:NNNNNNNN	RG:Z:HiMom.1
-HiMom:1:1101:1039:2147	653	*	0	0	*	*	0	0	.........................	#########################	BC:Z:NNNNNNNN	RG:Z:HiMom.1	XN:i:1
-HiMom:1:1101:1046:2175	589	*	0	0	*	*	0	0	.TGCC.G.GTT.CG.GGTCTT....	#4;@@####################	BC:Z:NNNNNNNN	RG:Z:HiMom.1
-HiMom:1:1101:1046:2175	653	*	0	0	*	*	0	0	..GGA....................	#########################	BC:Z:NNNNNNNN	RG:Z:HiMom.1
-HiMom:1:1101:1047:2122	589	*	0	0	*	*	0	0	.CTAA.G.ACT.TG.GTGTGC....	#0;@@#4#3@@#3@#2<@@@@####	BC:Z:NNNANNNN	RG:Z:HiMom.1
-HiMom:1:1101:1047:2122	653	*	0	0	*	*	0	0	..TCA....................	#########################	BC:Z:NNNANNNN	RG:Z:HiMom.1
-HiMom:1:1101:1048:2197	589	*	0	0	*	*	0	0	.CTCC.G.TCA.CA.GTGGAG....	#0;?@####################	BC:Z:NNNCNNNN	RG:Z:HiMom.1
-HiMom:1:1101:1048:2197	653	*	0	0	*	*	0	0	..GTG....................	#########################	BC:Z:NNNCNNNN	RG:Z:HiMom.1
-HiMom:1:1101:1065:2193	77	*	0	0	*	*	0	0	GAAGTACGCCCTGCCCCTGGTT.GC	?@@DAADAHHFHBEBEGGHG?####	BC:Z:GAACGATN	RG:Z:HiMom.1
-HiMom:1:1101:1065:2193	141	*	0	0	*	*	0	0	.CTTG....................	#########################	BC:Z:GAACGATN	RG:Z:HiMom.1
-HiMom:1:1101:1162:2207	589	*	0	0	*	*	0	0	ACCTTGAGGAGAACATAAGAGCAAA	#########################	BC:Z:ACAAAATT	RG:Z:HiMom.1
-HiMom:1:1101:1162:2207	653	*	0	0	*	*	0	0	TAAAACTGGGGAAGTTAGAGGAATG	#########################	BC:Z:ACAAAATT	RG:Z:HiMom.1
-HiMom:1:1201:1159:2179	589	*	0	0	*	*	0	0	GTTAGCACAGATATTGGATGAGTGA	#########################	BC:Z:AAAAAAAA	RG:Z:HiMom.1
-HiMom:1:1201:1159:2179	653	*	0	0	*	*	0	0	TTTTTTTTTATTTTTCTAAATACTT	===AA####################	BC:Z:AAAAAAAA	RG:Z:HiMom.1
-HiMom:1:1201:1414:2174	589	*	0	0	*	*	0	0	GCCAAAAAAAAGAACCAGCCCAAGG	#########################	BC:Z:AGAAAAGA	RG:Z:HiMom.1
-HiMom:1:1201:1414:2174	653	*	0	0	*	*	0	0	TTTTTTTTTTTTTTTTTTTTTTTTT	@;@1BDADF????FFEB>B6=BBBB	BC:Z:AGAAAAGA	RG:Z:HiMom.1
-HiMom:1:2101:1040:2208	589	*	0	0	*	*	0	0	.ATGCCCACCTCCCTCCTACGCACC	#########################	BC:Z:ACGAAATC	RG:Z:HiMom.1
-HiMom:1:2101:1040:2208	653	*	0	0	*	*	0	0	.CTGATAGTCACTGAAATGAATTCA	#-0=>(2 at .22@@############	BC:Z:ACGAAATC	RG:Z:HiMom.1
-HiMom:1:2101:1059:2083	77	*	0	0	*	*	0	0	.AAGAGGGGTCAAGAGTTAAACTTA	#1=DDFFFHFHHGIGHGHJJJJJJI	BC:Z:TACCGTCT	RG:Z:HiMom.1
-HiMom:1:2101:1059:2083	141	*	0	0	*	*	0	0	.GAATGTCTTAGAAGGATGCTTCTC	#1=BDDDEHHGHHJJJJJIJJIIJJ	BC:Z:TACCGTCT	RG:Z:HiMom.1
-HiMom:1:2101:1143:2137	77	*	0	0	*	*	0	0	ATGCAGCAGCTGCCACGGAGCACCA	CC at FFDFDFHFHHGIDHEHIGJJJJ	BC:Z:TCCGTCTA	RG:Z:HiMom.1
-HiMom:1:2101:1143:2137	141	*	0	0	*	*	0	0	GCTCTTCAGATCTAGGGGGAACAGC	@@@DD?=DCAFFFHIIDG:EFHIII	BC:Z:TCCGTCTA	RG:Z:HiMom.1
-HiMom:1:2101:1151:2182	589	*	0	0	*	*	0	0	TTGTTTTGGCTTATAATGACAAGAA	;;8-2).2())(<6=@8;?4??>>?	BC:Z:GAAAAAAA	RG:Z:HiMom.1
-HiMom:1:2101:1151:2182	653	*	0	0	*	*	0	0	TTTTTTTTTTTTTTTTTTTTTTTTA	9<<?@?@;5=?##############	BC:Z:GAAAAAAA	RG:Z:HiMom.1
-HiMom:1:2101:1215:2110	77	*	0	0	*	*	0	0	.AATATAATTTGGAGACCCTTTGTT	#1=DDDDDEDDDDIDDBB3ABAB##	BC:Z:AAAAGAAG	RG:Z:HiMom.1
-HiMom:1:2101:1215:2110	141	*	0	0	*	*	0	0	ATCTTTCCCCCATTAAGAACAGCAA	#########################	BC:Z:AAAAGAAG	RG:Z:HiMom.1
-HiMom:1:2101:1285:2105	589	*	0	0	*	*	0	0	.GCGGGGAGCCGGGCGTGGAATGCG	#########################	BC:Z:TATCTCGG	RG:Z:HiMom.1
-HiMom:1:2101:1285:2105	653	*	0	0	*	*	0	0	TGTCTATATCAACCAACACCTCTTC	-(0(():94:9:???##########	BC:Z:TATCTCGG	RG:Z:HiMom.1
-HiMom:1:2101:1450:2134	77	*	0	0	*	*	0	0	AGCACGCTGCCGCGGGACCTGCCCA	?@@AD at DDHFH?DGIIIIG at FGFBF	BC:Z:ACCAGTTG	RG:Z:HiMom.1
-HiMom:1:2101:1450:2134	141	*	0	0	*	*	0	0	ACAAACCCTTGTGTCGAGGGCTGAC	CC at FDFDFFDFHFGIIE1CGGHBGE	BC:Z:ACCAGTTG	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGCAAGTA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGCAAGTA.sam
deleted file mode 100644
index cf5b43d..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGCAAGTA.sam
+++ /dev/null
@@ -1,6 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.TGCAAGTA	LB:LN_TGCAAGTA	SM:SA_TGCAAGTA	CN:BI
-HiMom:1:1101:1242:2170	77	*	0	0	*	*	0	0	ATGGCAGGGCAGAGTTCTGATGAGT	CCCFFFFFHHGGGIFHEIIGIIII?	RG:Z:HiMom.1
-HiMom:1:1101:1242:2170	141	*	0	0	*	*	0	0	GGAAGGAAAAGAAGCACAAGTACAT	@@@DFDFFHHHGHHGIIGJJEHHIG	RG:Z:HiMom.1
-HiMom:1:2101:1163:2222	77	*	0	0	*	*	0	0	GAGCAGGCAAGGAGGACTTCTTGTT	CCCFFFFFGHHHHJJHHIJJJJJIJ	RG:Z:HiMom.1
-HiMom:1:2101:1163:2222	141	*	0	0	*	*	0	0	GAGCGATAATGGTTCTTTTCCTCAC	@@@DFFFFHHHHHJJJJJJJIJJJJ	RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGTAATCA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGTAATCA.sam
deleted file mode 100644
index 5574342..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGTAATCA.sam
+++ /dev/null
@@ -1,8 +0,0 @@
- at HD	VN:1.5	SO:queryname
- at RG	ID:HiMom.1	PL:illumina	PU:HiMom.1.TGTAATCA	LB:LN_TGTAATCA	SM:SA_TGTAATCA	CN:BI
-HiMom:1:1101:1419:2119	77	*	0	0	*	*	0	0	.ATGACTATGGTAACTGAAAGAAAA	#1:A1BDADBFFDFIIIEEHECACF	RG:Z:HiMom.1
-HiMom:1:1101:1419:2119	141	*	0	0	*	*	0	0	ACTTTCCTTTTTTGTTTTACTTTAA	#########################	RG:Z:HiMom.1
-HiMom:1:1201:1208:2132	77	*	0	0	*	*	0	0	.CCTCAATGAGCGGCACTATGGGGG	#1=DDFFFHHHHGJJIJJGHIJGIJ	RG:Z:HiMom.1
-HiMom:1:1201:1208:2132	141	*	0	0	*	*	0	0	CTGTAGAAAGGATGGTCGGGCTCCA	@@CDFFFFGHFHHJIJJGJIBHJJG	RG:Z:HiMom.1
-HiMom:1:1201:1344:2147	77	*	0	0	*	*	0	0	TATCCTCCCTACTATGCCTAGAAGG	=?@DADEFHBHDFG>EFGDHGFGHD	RG:Z:HiMom.1
-HiMom:1:1201:1344:2147	141	*	0	0	*	*	0	0	ACGATTAGTTTTAGCATTGGAGTAG	@<??DDDDFHHHFGGHHIIIGGAGH	RG:Z:HiMom.1
diff --git a/src/test/resources/testng.xml b/src/test/resources/testng.xml
deleted file mode 100644
index 724ee35..0000000
--- a/src/test/resources/testng.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
-
-<suite name="HTSJDK" verbose="2" parallel="methods" thread-count="8" data-provider-thread-count="8">
-
-    <test name="samtools">
-        <packages>
-            <package name="htsjdk.samtools"/>
-        </packages>
-    </test>
-    <test name="tribble">
-        <packages>
-            <package name="htsjdk.tribble"/>
-        </packages>
-    </test>
-    <test name="variant">
-        <packages>
-            <package name="htsjdk.variant"/>
-        </packages>
-    </test>
-</suite>
\ No newline at end of file
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 0000000..dd3ab34
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,70 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+by_default: runtests
+
+TOP ?= $(abspath ..)
+MODULE = test
+
+include $(TOP)/build/Makefile.shell
+
+include $(TOP)/build/Makefile.config
+
+#-------------------------------------------------------------------------------
+# default
+#
+SUBDIRS =       \
+    ktst        \
+    cc          \
+    ext         \
+    judy_test   \
+    kfc         \
+    kfs         \
+    klib        \
+    kfg         \
+    kapp        \
+    kns         \
+    kdb         \
+    kproc       \
+    vdb         \
+    ngs         \
+    ngs-c++     \
+    ngs-java    \
+    ngs-python  \
+    search      \
+    vfs         \
+    sraxf       \
+    vxf         \
+    loader      \
+    krypto      \
+    cipher      \
+
+# common targets for non-leaf Makefiles; must follow a definition of SUBDIRS
+include $(TOP)/build/Makefile.targets
+
+$(SUBDIRS):
+	@ $(MAKE) -C $@
+
+.PHONY: default $(SUBDIRS)
+
diff --git a/test/align/Makefile b/test/align/Makefile
new file mode 100644
index 0000000..c245e5e
--- /dev/null
+++ b/test/align/Makefile
@@ -0,0 +1,56 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+MODULE = test/align
+
+TEST_TOOLS = \
+	test-load-index \
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+clean: stdclean
+#-------------------------------------------------------------------------------
+# test-load-index
+#
+TEST_INDEX_SRC = \
+	indextest
+
+TEST_INDEX_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_INDEX_SRC))
+
+TEST_INDEX_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-vdb
+
+$(TEST_BINDIR)/test-load-index: $(TEST_INDEX_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_INDEX_LIB)
+
diff --git a/test/align/indextest.cpp b/test/align/indextest.cpp
new file mode 100644
index 0000000..01e3b67
--- /dev/null
+++ b/test/align/indextest.cpp
@@ -0,0 +1,113 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for the Loader module
+*/
+#include <ktst/unit_test.hpp>
+
+#include <klib/printf.h>
+
+#include <stdexcept> 
+#include <string>
+
+extern "C" {
+#include <klib/rc.h>
+#include <align/bam.h>
+}
+
+using namespace std;
+
+TEST_SUITE(IndexTestSuite);
+
+class LoaderFixture
+{
+    BAMFile const *bam;
+
+    static std::string BAM_FILE_NAME(void) {
+        return std::string("/panfs/pan1/sra-test/bam/VDB-3148.bam");
+    }
+    static std::string INDEX_FILE_NAME(void) {
+        return BAM_FILE_NAME() + ".bai";
+    }
+public:
+    LoaderFixture()
+    {
+        rc_t const rc = BAMFileMake(&bam, BAM_FILE_NAME().c_str());
+        if (rc != 0)
+            throw std::runtime_error("can't open " + BAM_FILE_NAME());
+    }
+    ~LoaderFixture()
+    {
+        BAMFileRelease(bam);
+    }
+    void testIndex(void) const {
+        rc_t const expected_rc = SILENT_RC(rcAlign, rcIndex, rcReading, rcData, rcExcessive);
+        rc_t const rc = BAMFileOpenIndex(bam, INDEX_FILE_NAME().c_str());
+        if (rc == 0)
+            throw std::runtime_error("Index open was supposed to fail");
+        if (rc != expected_rc)
+            throw std::runtime_error("Index open did not fail with the expected result code; perhaps the test file is missing?");
+    }
+};    
+
+FIXTURE_TEST_CASE ( LoadIndex, LoaderFixture ) 
+{
+    testIndex();
+}
+
+//////////////////////////////////////////// Main
+#include <kapp/args.h>
+#include <klib/out.h>
+#include <kfg/config.h>
+
+extern "C"
+{
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+
+const char UsageDefaultName[] = "test-loader";
+
+rc_t CC UsageSummary (const char * progname)
+{
+    return KOutMsg ( "Usage:\n" "\t%s [options]\n\n", progname );
+}
+
+rc_t CC Usage( const Args* args )
+{
+    return 0;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    return IndexTestSuite(argc, argv);
+}
+
+}
+
diff --git a/test/cc/Makefile b/test/cc/Makefile
new file mode 100644
index 0000000..73e5009
--- /dev/null
+++ b/test/cc/Makefile
@@ -0,0 +1,60 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+MODULE = test/cc
+
+TEST_TOOLS = \
+	test-asm
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(ALL_LIBS) $(TEST_TOOLS)
+
+clean: stdclean
+
+#----------------------------------------------------------------
+# asm-test
+#
+
+ASM_TEST_SRC = \
+	asm-test
+
+ASM_TEST_OBJ = \
+	$(addsuffix .$(OBJX),$(ASM_TEST_SRC))
+
+ASM_TEST_LIB = \
+	-skapp \
+    -sncbi-vdb \
+    -sktst
+
+$(TEST_BINDIR)/test-asm: $(ASM_TEST_OBJ)
+	$(LP) --exe -o $@ $^ $(ASM_TEST_LIB)
+
diff --git a/test/cc/asm-test.cpp b/test/cc/asm-test.cpp
new file mode 100644
index 0000000..7cba437
--- /dev/null
+++ b/test/cc/asm-test.cpp
@@ -0,0 +1,480 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests of functions potentially implemented using asm
+*
+* For now, only cover operations with jumps inside (to test transition from relative offsets to labels)
+*
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <atomic.h>
+#include <atomic32.h>
+#include <arch-impl.h>
+
+TEST_SUITE(AsmTestSuite);
+
+// 32 bit operations
+
+TEST_CASE(a32_read_and_add)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add ( & v, 3 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 5 );
+}
+
+TEST_CASE(a32_add_and_read)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_add_and_read ( & v, 3 ), 5 );
+}
+
+TEST_CASE(a32_read_and_add_lt_true)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_lt ( & v, 3 , 4 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 5 );
+}
+TEST_CASE(a32_read_and_add_lt_false)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_lt ( & v, 3 , 2 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 2 );
+}
+
+TEST_CASE(a32_read_and_add_le_true)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_le ( & v, 3 , 2 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 5 );
+}
+TEST_CASE(a32_read_and_add_le_false)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_le ( & v, 3 , 1 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 2 );
+}
+
+TEST_CASE(a32_read_and_add_eq_true)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_eq ( & v, 3 , 2 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 5 );
+}
+TEST_CASE(a32_read_and_add_eq_false)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_eq ( & v, 3 , 1 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 2 );
+}
+
+TEST_CASE(a32_read_and_add_ne_true)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_ne ( & v, 3 , 1 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 5 );
+}
+TEST_CASE(a32_read_and_add_ne_false)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_ne ( & v, 3 , 2 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 2 );
+}
+
+TEST_CASE(a32_read_and_add_ge_true)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_ge ( & v, 3 , 2 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 5 );
+}
+TEST_CASE(a32_read_and_add_ge_false)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_ge ( & v, 3 , 3 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 2 );
+}
+
+TEST_CASE(a32_read_and_add_gt_true)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_gt ( & v, 3 , 1 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 5 );
+}
+TEST_CASE(a32_read_and_add_gt_false)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_gt ( & v, 3 , 2 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 2 );
+}
+
+TEST_CASE(a32_read_and_add_odd_true)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 1 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_odd ( & v, 3 ), 1 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 4 );
+}
+TEST_CASE(a32_read_and_add_odd_false)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_odd ( & v, 3 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 2 );
+}
+
+TEST_CASE(a32_read_and_add_even_true)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_even ( & v, 3 ), 2 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 5 );
+}
+TEST_CASE(a32_read_and_add_even_false)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 1 );
+    REQUIRE_EQ ( ( int ) atomic32_read_and_add_even ( & v, 3 ), 1 );
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 1 );
+}
+
+TEST_CASE(atomic32_inc_and_test_true)
+{
+    atomic32_t v;
+    atomic32_set ( & v, -1 );
+    REQUIRE ( atomic32_inc_and_test ( & v ) );
+}
+TEST_CASE(atomic32_inc_and_test_false)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 1 );
+    REQUIRE ( ! atomic32_inc_and_test ( & v ) );
+}
+
+TEST_CASE(atomic32_dec_and_test_true)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 1 );
+    REQUIRE ( atomic32_dec_and_test ( & v ) );
+}
+TEST_CASE(atomic32_dec_and_test_false)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 2 );
+    REQUIRE ( ! atomic32_dec_and_test ( & v ) );
+}
+
+TEST_CASE(atomic32_test_and_set_true)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 0 );
+    REQUIRE_EQ ( ( int ) 0, ( int ) atomic32_test_and_set ( & v, 1, 0 ) );  // returns prior value of v
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 1 );
+}
+TEST_CASE(atomic32_test_and_set_false)
+{
+    atomic32_t v;
+    atomic32_set ( & v, 0 );
+    REQUIRE_EQ ( ( int ) 0,  ( int ) atomic32_test_and_set ( & v, 1, 2 ) ); // returns prior value of v
+    REQUIRE_EQ ( ( int ) atomic32_read ( & v ), 0 );
+}
+
+#ifdef USE_GCC_BUILTIN
+#undef USE_GCC_BUILTIN
+TEST_CASE(uint16_lsbit_0_asm)
+{
+    REQUIRE_EQ ( ( int16_t ) -1, uint16_lsbit ( 0 ) );
+}
+TEST_CASE(uint16_lsbit_not_0_asm)
+{
+    REQUIRE_EQ ( ( int16_t ) 1, uint16_lsbit ( 0xfffe ) );
+}
+TEST_CASE(uint32_lsbit_0_asm)
+{
+    REQUIRE_EQ ( ( int32_t ) -1, uint32_lsbit ( 0 ) );
+}
+TEST_CASE(uint32_lsbit_not_0_asm)
+{
+    REQUIRE_EQ ( ( int32_t ) 17, uint32_lsbit ( 0xfffe0000 ) );
+}
+#define USE_GCC_BUILTIN
+TEST_CASE(uint16_lsbit_0_builtin)
+{
+    REQUIRE_EQ ( ( int16_t ) -1, uint16_lsbit ( 0 ) );
+}
+TEST_CASE(uint16_lsbit_not_0_builtin)
+{
+    REQUIRE_EQ ( ( int16_t ) 1, uint16_lsbit ( 0xfffe ) );
+}
+TEST_CASE(uint32_lsbit_0_builtin)
+{
+    REQUIRE_EQ ( ( int32_t ) -1, uint32_lsbit ( 0 ) );
+}
+TEST_CASE(uint32_lsbit_not_0_builtin)
+{
+    REQUIRE_EQ ( ( int32_t ) 17, uint32_lsbit ( 0xfffe0000 ) );
+}
+#else
+#define USE_GCC_BUILTIN
+TEST_CASE(uint16_lsbit_0_asm)
+{
+    REQUIRE_EQ ( ( int16_t ) -1, uint16_lsbit ( 0 ) );
+}
+TEST_CASE(uint16_lsbit_not_0_asm)
+{
+    REQUIRE_EQ ( ( int16_t ) 1, uint16_lsbit ( 0xfffe ) );
+}
+TEST_CASE(uint32_lsbit_0_asm)
+{
+    REQUIRE_EQ ( ( int32_t ) -1, uint32_lsbit ( 0 ) );
+}
+TEST_CASE(uint32_lsbit_not_0_asm)
+{
+    REQUIRE_EQ ( ( int32_t ) 17, uint32_lsbit ( 0xfffe0000 ) );
+}
+#undef USE_GCC_BUILTIN
+TEST_CASE(uint16_lsbit_0_builtin)
+{
+    REQUIRE_EQ ( ( int16_t ) -1, uint16_lsbit ( 0 ) );
+}
+TEST_CASE(uint16_lsbit_not_0_builtin)
+{
+    REQUIRE_EQ ( ( int16_t ) 1, uint16_lsbit ( 0xfffe ) );
+}
+TEST_CASE(uint32_lsbit_0_builtin)
+{
+    REQUIRE_EQ ( ( int32_t ) -1, uint32_lsbit ( 0 ) );
+}
+TEST_CASE(uint32_lsbit_not_0_builtin)
+{
+    REQUIRE_EQ ( ( int32_t ) 17, uint32_lsbit ( 0xfffe0000 ) );
+}
+#endif
+
+
+#if _ARCH_BITS == 64
+
+// 64 bit operations
+
+#include <atomic64.h>
+
+TEST_CASE(a64_read_and_add)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add ( & v, 3 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 5 );
+}
+
+TEST_CASE(a64_add_and_read)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_add_and_read ( & v, 3 ), ( int64_t ) 5 );
+}
+
+TEST_CASE(a64_read_and_add_lt_true)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_lt ( & v, 3 , 4 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 5 );
+}
+TEST_CASE(a64_read_and_add_lt_false)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_lt ( & v, 3 , 2 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 2 );
+}
+
+TEST_CASE(a64_read_and_add_le_true)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_le ( & v, 3 , 2 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 5 );
+}
+TEST_CASE(a64_read_and_add_le_false)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_le ( & v, 3 , 1 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 2 );
+}
+
+TEST_CASE(a64_read_and_add_eq_true)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_eq ( & v, 3 , 2 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 5 );
+}
+TEST_CASE(a64_read_and_add_eq_false)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_eq ( & v, 3 , 1 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 2 );
+}
+
+TEST_CASE(a64_read_and_add_ne_true)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_ne ( & v, 3 , 1 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 5 );
+}
+TEST_CASE(a64_read_and_add_ne_false)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_ne ( & v, 3 , 2 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 2 );
+}
+
+TEST_CASE(a64_read_and_add_ge_true)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_ge ( & v, 3 , 2 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 5 );
+}
+TEST_CASE(a64_read_and_add_ge_false)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_ge ( & v, 3 , 3 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 2 );
+}
+
+TEST_CASE(a64_read_and_add_gt_true)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_gt ( & v, 3 , 1 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 5 );
+}
+TEST_CASE(a64_read_and_add_gt_false)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_gt ( & v, 3 , 2 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ),( int64_t )  2 );
+}
+
+TEST_CASE(a64_read_and_add_odd_true)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 1 );
+    REQUIRE_EQ ( ( int64_t )atomic64_read_and_add_odd ( & v, 3 ), ( int64_t ) 1 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 4 );
+}
+TEST_CASE(a64_read_and_add_odd_false)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_odd ( & v, 3 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 2 );
+}
+
+TEST_CASE(a64_read_and_add_even_true)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_even ( & v, 3 ), ( int64_t ) 2 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 5 );
+}
+TEST_CASE(a64_read_and_add_even_false)
+{
+    atomic64_t v;
+    atomic64_set ( & v, 1 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read_and_add_even ( & v, 3 ), ( int64_t ) 1 );
+    REQUIRE_EQ ( ( int64_t ) atomic64_read ( & v ), ( int64_t ) 1 );
+}
+
+TEST_CASE(a64_test_and_set_ptr_success)
+{
+    atomic_ptr_t v = { (void*)0 };
+    REQUIRE_EQ ( (void*)0, (void*) atomic_test_and_set_ptr ( & v, (void*)1, (void*)0 ) ); // v.ptr == 0; replace and return the old value
+    REQUIRE_EQ ( (void*)1, (void*) v . ptr );
+}
+
+TEST_CASE(a64_test_and_set_ptr_failure)
+{
+    atomic_ptr_t v = { (void*)0 };
+    REQUIRE_EQ ( (void*)0, (void*) atomic_test_and_set_ptr ( & v, (void*)1, (void*)2 ) ); // v.ptr != 2, not changed
+    REQUIRE_EQ ( (void*)0, (void*) v . ptr ); // did not change
+}
+
+#endif
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-asm";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t rc=AsmTestSuite(argc, argv);
+    return rc;
+}
+
+}
+
+
diff --git a/test/cipher/Makefile b/test/cipher/Makefile
new file mode 100644
index 0000000..a246cf1
--- /dev/null
+++ b/test/cipher/Makefile
@@ -0,0 +1,52 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/cipher
+
+ALL_TARGS = \
+
+include $(TOP)/build/Makefile.env
+
+
+# make sure runs are not cached in the user repository when running tests
+ifeq ($(wildcard ../../../asm-trace),)
+	ifeq (,$(VDB_CONFIG))
+		VDB_CONFIG = $(shell pwd)/../only-remote-repository.kfg
+	endif
+endif
+
+
+#-------------------------------------------------------------------------------
+# runtests
+#
+runtests: cipher
+
+cipher:
+	@ export LD_LIBRARY_PATH=$(LIBDIR) ; ./test.sh $(TOP)
+
+.PHONY: cipher
diff --git a/test/cipher/test.sh b/test/cipher/test.sh
new file mode 100755
index 0000000..1aed2aa
--- /dev/null
+++ b/test/cipher/test.sh
@@ -0,0 +1,46 @@
+TOP=$1
+
+if [ $(uname) = "Darwin" ]; then
+    echo "cipher test is turned off on Mac"
+    exit 0
+fi
+
+#installing cipher module into newly created virtual env
+tmp_py_env=$(pwd)/temp_env
+python_bin=$(which python2)
+if [ "$python_bin" == "" ]; then
+    python_bin=$(which python)
+fi
+virtualenv -p $python_bin $tmp_py_env
+. $tmp_py_env/bin/activate
+tmp_cur_dir=$(pwd)
+cd $TOP/libs/cipher/cipher-1.7/
+$tmp_py_env/bin/python setup.py install
+cd $tmp_cur_dir
+unset tmp_cur_dir
+
+echo "Running python cipher test..."
+
+#running cipher test in py virtual env
+rm -f test.in test.enc test.out
+
+for i in {0..10000}
+do
+    echo "Hello world $i" >> test.in
+done
+
+python $TOP/libs/cipher/cipher-1.7/encrypt.py --password=password123 test.in test.enc
+python $TOP/libs/cipher/cipher-1.7/decrypt.py --password=password123 test.enc test.out
+
+diff test.in test.out
+exit_code=$?
+rm test.in test.enc test.out
+
+echo "pyhon cipher test is complete."
+
+# cleanup
+deactivate
+rm -rf $tmp_py_env
+unset tmp_py_env
+
+exit $exit_code
diff --git a/test/judy_test/Makefile b/test/judy_test/Makefile
new file mode 100644
index 0000000..110dcde
--- /dev/null
+++ b/test/judy_test/Makefile
@@ -0,0 +1,58 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/judy_test
+
+TEST_TOOLS = \
+	test-judy
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# test-judy
+#
+JUDYTEST_SRC = \
+	judytest
+
+JUDYTEST_OBJ = \
+	$(addsuffix .$(OBJX),$(JUDYTEST_SRC))
+
+JUDYTEST_LIB = \
+	-skapp \
+	-sncbi-vdb 
+
+$(TEST_BINDIR)/test-judy: $(JUDYTEST_OBJ)
+	$(LD) --exe $(SRCDIR) -o $@ $^ $(JUDYTEST_LIB)
+
diff --git a/test/judy_test/judytest.c b/test/judy_test/judytest.c
new file mode 100644
index 0000000..32ea9ae
--- /dev/null
+++ b/test/judy_test/judytest.c
@@ -0,0 +1,1831 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/vector.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+
+#define OPTION_COUNT    "count"
+#define ALIAS_COUNT     "c"
+
+static const char * count_usage[]     = { "how many items", NULL };
+
+OptDef JudyTestOptions[] =
+{
+/*    name             alias        fkt.  usage-txt,  cnt, needs value, required */
+    { OPTION_COUNT,    ALIAS_COUNT, NULL, count_usage,  1, true,  false }
+};
+
+const char UsageDefaultName[] = "judytest";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+    return KOutMsg ("\n"
+                    "Usage:\n"
+                    "  %s [options]\n"
+                    "\n", progname);
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if ( args == NULL )
+        rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+    else
+        rc = ArgsProgram ( args, &fullpath, &progname );
+
+    if ( rc )
+        progname = fullpath = UsageDefaultName;
+
+    UsageSummary ( progname );
+
+    KOutMsg ( "Options:\n" );
+
+    HelpOptionLine ( ALIAS_COUNT, OPTION_COUNT, "count", count_usage );
+
+    HelpOptionsStandard ();
+    HelpVersion ( fullpath, KAppVersion() );
+    return rc;
+}
+
+
+/* Version  EXTERN
+ *  return 4-part version code: 0xMMmmrrrr, where
+ *      MM = major release
+ *      mm = minor release
+ *    rrrr = bug-fix release
+ */
+ver_t CC KAppVersion ( void )
+{
+    return 0x01010000;
+}
+
+
+static uint32_t get_int_option( const Args *my_args,
+                                const char *name,
+                                const uint32_t def )
+{
+    uint32_t count, res = def;
+    rc_t rc = ArgsOptionCount( my_args, name, &count );
+    if ( ( rc == 0 )&&( count > 0 ) )
+    {
+        const char *s;
+        rc = ArgsOptionValue( my_args, name, 0,  (const void **)&s );
+        if ( rc == 0 ) res = atoi( s );
+    }
+    return res;
+}
+
+
+typedef struct random_numbers
+{
+    uint32_t count;
+    uint64_t *numbers;
+} random_numbers;
+
+
+static bool contains_number( random_numbers *self, const uint32_t up_to, const uint64_t value )
+{
+    uint32_t i;
+    for ( i = 0; i < up_to; ++i )
+    {
+        if ( self->numbers[ i ] == value )
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
+
+static rc_t make_random_numbers( random_numbers *self, const uint32_t count, const uint32_t max )
+{
+    rc_t rc = 0;
+    self->numbers = calloc( count, sizeof *self->numbers );
+    if ( self->numbers == NULL )
+    {
+        rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+    }
+    else
+    {
+        uint32_t i;
+        for ( i = 0; i < count; ++i )
+        {
+            do
+            {
+                self->numbers[ i ] = ( rand() % max ) + 1;
+            } while ( contains_number( self, i, self->numbers[ i ] ) );
+        }
+        self->count = count;
+    }
+    return rc;
+}
+
+
+static void free_random_numbers( random_numbers *self )
+{
+    free( self->numbers );
+}
+
+
+typedef void * ptr;
+typedef const void * const_ptr;
+
+/*
+#define key_and_value( TYPENAME ) \
+typedef struct TYPENAME ## _key_and_value \
+{ \
+    uint64_t key; \
+    TYPENAME value; \
+} TYPENAME ## _key_and_value; \
+
+*/
+
+typedef struct uint64_t_key_and_value
+{
+    uint64_t key;
+    uint64_t value;
+} uint64_t_key_and_value;
+
+
+typedef struct uint32_t_key_and_value
+{
+    uint64_t key;
+    uint32_t value;
+} uint32_t_key_and_value;
+
+
+typedef struct uint16_t_key_and_value
+{
+    uint64_t key;
+    uint16_t value;
+} uint16_t_key_and_value;
+
+
+typedef struct uint8_t_key_and_value
+{
+    uint64_t key;
+    uint8_t value;
+} uint8_t_key_and_value;
+
+
+typedef struct int64_t_key_and_value
+{
+    uint64_t key;
+    int64_t value;
+} int64_t_key_and_value;
+
+
+typedef struct int32_t_key_and_value
+{
+    uint64_t key;
+    int32_t value;
+} int32_t_key_and_value;
+
+
+typedef struct int16_t_key_and_value
+{
+    uint64_t key;
+    int16_t value;
+} int16_t_key_and_value;
+
+
+typedef struct int8_t_key_and_value
+{
+    uint64_t key;
+    int8_t value;
+} int8_t_key_and_value;
+
+
+typedef struct float_key_and_value
+{
+    uint64_t key;
+    float value;
+} float_key_and_value;
+
+
+typedef struct double_key_and_value
+{
+    uint64_t key;
+    double value;
+} double_key_and_value;
+
+
+typedef struct bool_key_and_value
+{
+    uint64_t key;
+    bool value;
+} bool_key_and_value;
+
+
+typedef struct ptr_key_and_value
+{
+    uint64_t key;
+    ptr value;
+} ptr_key_and_value;
+
+
+/*
+#define generic_find( TYPENAME ) \
+static TYPENAME ## _key_and_value * find_ ## TYPENAME( Vector * v, uint64_t key ) \
+{ \
+    TYPENAME ## _key_and_value * res = NULL; \
+    uint32_t i, n = VectorLength( v ); \
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    { \
+        TYPENAME ## _key_and_value * tmp = VectorGet ( v, i ); \
+        if ( tmp != NULL ) \
+        { \
+            if ( tmp->key == key ) \
+            { \
+                res = tmp; \
+            } \
+        } \
+    } \
+    return res; \
+}
+*/
+
+static uint64_t_key_and_value * find_uint64_t( Vector * v, uint64_t key )
+{
+    uint64_t_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        uint64_t_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+static uint32_t_key_and_value * find_uint32_t( Vector * v, uint64_t key )
+{
+    uint32_t_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        uint32_t_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+static uint16_t_key_and_value * find_uint16_t( Vector * v, uint64_t key )
+{
+    uint16_t_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        uint16_t_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+static uint8_t_key_and_value * find_uint8_t( Vector * v, uint64_t key )
+{
+    uint8_t_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        uint8_t_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+static int64_t_key_and_value * find_int64_t( Vector * v, uint64_t key )
+{
+    int64_t_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        int64_t_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+static int32_t_key_and_value * find_int32_t( Vector * v, uint64_t key )
+{
+    int32_t_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        int32_t_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+static int16_t_key_and_value * find_int16_t( Vector * v, uint64_t key )
+{
+    int16_t_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        int16_t_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+static int8_t_key_and_value * find_int8_t( Vector * v, uint64_t key )
+{
+    int8_t_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        int8_t_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+static float_key_and_value * find_float( Vector * v, uint64_t key )
+{
+    float_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        float_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+static double_key_and_value * find_double( Vector * v, uint64_t key )
+{
+    double_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        double_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+static bool_key_and_value * find_bool( Vector * v, uint64_t key )
+{
+    bool_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        bool_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+static ptr_key_and_value * find_ptr( Vector * v, uint64_t key )
+{
+    ptr_key_and_value * res = NULL;
+    uint32_t i, n = VectorLength( v );
+    for ( i = 0; i < n && res == NULL; ++i ) \
+    {
+        ptr_key_and_value * tmp = VectorGet ( v, i );
+        if ( tmp != NULL )
+        {
+            if ( tmp->key == key )
+            {
+                res = tmp;
+            }
+        }
+    }
+    return res;
+}
+
+
+typedef struct lookup_context
+{
+    KVector *v;
+    Vector *control;
+    uint32_t found;
+} lookup_context;
+
+
+static void CC key_and_value_whack( void *item, void *data )
+{
+    free( item );
+}
+
+
+/*
+#define lookup( TYPENAME, LOOKUPFUNC ) \
+static void CC TYPENAME ## _lookup( void *item, void *data ) \
+{ \
+    TYPENAME ## _key_and_value *kv = item; \
+    lookup_context *ctx = data; \
+    TYPENAME value; \
+    if ( LOOKUPFUNC ( ctx->v, kv->key, &value ) == 0 ) \
+    { \
+        if ( kv->value == value ) \
+        { \
+            ( ctx->found )++; \
+        } \
+    } \
+}
+*/
+
+
+static void CC uint64_t_lookup( void * item, void * data )
+{
+    uint64_t_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    uint64_t value;
+    if ( KVectorGetU64 ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+static void CC uint32_t_lookup( void * item, void * data )
+{
+    uint32_t_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    uint32_t value;
+    if ( KVectorGetU32 ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+static void CC uint16_t_lookup( void * item, void * data )
+{
+    uint16_t_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    uint16_t value;
+    if ( KVectorGetU16 ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+static void CC uint8_t_lookup( void * item, void * data )
+{
+    uint8_t_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    uint8_t value;
+    if ( KVectorGetU8 ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+static void CC int64_t_lookup( void * item, void * data )
+{
+    int64_t_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    int64_t value;
+    if ( KVectorGetI64 ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+static void CC int32_t_lookup( void * item, void * data )
+{
+    int32_t_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    int32_t value;
+    if ( KVectorGetI32 ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+static void CC int16_t_lookup( void * item, void * data )
+{
+    int16_t_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    int16_t value;
+    if ( KVectorGetI16 ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+static void CC int8_t_lookup( void * item, void * data )
+{
+    int8_t_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    int8_t value;
+    if ( KVectorGetI8 ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+static void CC float_lookup( void * item, void * data )
+{
+    float_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    float value;
+    if ( KVectorGetF32 ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+static void CC double_lookup( void * item, void * data )
+{
+    double_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    double value;
+    if ( KVectorGetF64 ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+static void CC bool_lookup( void * item, void * data )
+{
+    bool_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    bool value;
+    if ( KVectorGetBool ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+static void CC ptr_lookup( void * item, void * data )
+{
+    ptr_key_and_value *kv = item;
+    lookup_context *ctx = data;
+    ptr value;
+    if ( KVectorGetPtr ( ctx->v, kv->key, &value ) == 0 )
+    {
+        if ( kv->value == value )
+        {
+            ( ctx->found )++;
+        }
+    } 
+}
+
+
+/*
+#define generic_on_visit( TYPENAME, VALUE_TYPE ) \
+static rc_t CC on_visit_ ## TYPENAME ( uint64_t key, VALUE_TYPE value, void *user_data ) \
+{ \
+    lookup_context * ctx = user_data; \
+    TYPENAME ## _key_and_value * kv = find_ ## TYPENAME ( ctx->control, key ); \
+    if ( kv != NULL ) \
+    { \
+        if ( kv->value == (TYPENAME) value ) \
+        { \
+            ctx->found ++; \
+        } \
+        else \
+        { \
+            OUTMSG(( "values %lx vs %lx mismatch\n", (uint64_t)value, (uint64_t)kv->value )); \
+        } \
+    } \
+    else \
+    { \
+        OUTMSG(( "key %lu not found\n", key )); \
+    } \
+    return 0; \
+}
+*/
+
+static rc_t CC on_visit_uint64_t ( uint64_t key, uint64_t value, void *user_data )
+{
+    lookup_context * ctx = user_data;
+    uint64_t_key_and_value * kv = find_uint64_t( ctx->control, key );
+    if ( kv != NULL )
+    {
+        if ( kv->value == value )
+        {
+            ctx->found ++;
+        }
+        else
+        {
+            OUTMSG( ( "values %lx vs %lx mismatch\n", value, kv->value ) );
+        }
+    }
+    else
+    {
+        OUTMSG( ( "key %lu not found\n", key ) );
+    }
+    return 0;
+}
+
+
+static rc_t CC on_visit_uint32_t ( uint64_t key, uint64_t value, void *user_data )
+{
+    lookup_context * ctx = user_data;
+    uint32_t_key_and_value * kv = find_uint32_t( ctx->control, key );
+    if ( kv != NULL )
+    {
+        if ( kv->value == value )
+        {
+            ctx->found ++;
+        }
+        else
+        {
+            OUTMSG( ( "values %lx vs %x mismatch\n", value, kv->value ) );
+        }
+    }
+    else
+    {
+        OUTMSG( ( "key %lu not found\n", key ) );
+    }
+    return 0;
+}
+
+
+static rc_t CC on_visit_uint16_t ( uint64_t key, uint64_t value, void *user_data )
+{
+    lookup_context * ctx = user_data;
+    uint16_t_key_and_value * kv = find_uint16_t( ctx->control, key );
+    if ( kv != NULL )
+    {
+        if ( kv->value == value )
+        {
+            ctx->found ++;
+        }
+        else
+        {
+            OUTMSG( ( "values %lx vs %x mismatch\n", value, kv->value ) );
+        }
+    }
+    else
+    {
+        OUTMSG( ( "key %lu not found\n", key ) );
+    }
+    return 0;
+}
+
+
+static rc_t CC on_visit_uint8_t ( uint64_t key, uint64_t value, void *user_data )
+{
+    lookup_context * ctx = user_data;
+    uint8_t_key_and_value * kv = find_uint8_t( ctx->control, key );
+    if ( kv != NULL )
+    {
+        if ( kv->value == value )
+        {
+            ctx->found ++;
+        }
+        else
+        {
+            OUTMSG( ( "values %lx vs %x mismatch\n", value, kv->value ) );
+        }
+    }
+    else
+    {
+        OUTMSG( ( "key %lu not found\n", key ) );
+    }
+    return 0;
+}
+
+
+static rc_t CC on_visit_int64_t ( uint64_t key, int64_t value, void *user_data )
+{
+    lookup_context * ctx = user_data;
+    int64_t_key_and_value * kv = find_int64_t( ctx->control, key );
+    if ( kv != NULL )
+    {
+        if ( kv->value == value )
+        {
+            ctx->found ++;
+        }
+        else
+        {
+            OUTMSG( ( "values %lx vs %lx mismatch\n", value, kv->value ) );
+        }
+    }
+    else
+    {
+        OUTMSG( ( "key %lu not found\n", key ) );
+    }
+    return 0;
+}
+
+
+static rc_t CC on_visit_int32_t ( uint64_t key, int64_t value, void *user_data )
+{
+    lookup_context * ctx = user_data;
+    int32_t_key_and_value * kv = find_int32_t( ctx->control, key );
+    if ( kv != NULL )
+    {
+        if ( kv->value == value )
+        {
+            ctx->found ++;
+        }
+        else
+        {
+            OUTMSG( ( "values %lx vs %x mismatch\n", value, kv->value ) );
+        }
+    }
+    else
+    {
+        OUTMSG( ( "key %lu not found\n", key ) );
+    }
+    return 0;
+}
+
+
+static rc_t CC on_visit_int16_t ( uint64_t key, int64_t value, void *user_data )
+{
+    lookup_context * ctx = user_data;
+    int16_t_key_and_value * kv = find_int16_t( ctx->control, key );
+    if ( kv != NULL )
+    {
+        if ( kv->value == value )
+        {
+            ctx->found ++;
+        }
+        else
+        {
+            OUTMSG( ( "values %lx vs %x mismatch\n", value, kv->value ) );
+        }
+    }
+    else
+    {
+        OUTMSG( ( "key %lu not found\n", key ) );
+    }
+    return 0;
+}
+
+
+static rc_t CC on_visit_int8_t ( uint64_t key, int64_t value, void *user_data )
+{
+    lookup_context * ctx = user_data;
+    int8_t_key_and_value * kv = find_int8_t( ctx->control, key );
+    if ( kv != NULL )
+    {
+        int8_t v = ( int8_t )value;
+        if ( kv->value == v )
+        {
+            ctx->found ++;
+        }
+        else
+        {
+            OUTMSG( ( "values %lx vs %x mismatch\n", value, kv->value ) );
+        }
+    }
+    else
+    {
+        OUTMSG( ( "key %lu not found\n", key ) );
+    }
+    return 0;
+}
+
+
+static rc_t CC on_visit_double ( uint64_t key, double value, void *user_data )
+{
+    lookup_context * ctx = user_data;
+    double_key_and_value * kv = find_double( ctx->control, key );
+    if ( kv != NULL )
+    {
+        if ( kv->value == value )
+        {
+            ctx->found ++;
+        }
+        else
+        {
+            OUTMSG( ( "values %f vs %f mismatch\n", value, kv->value ) );
+        }
+    }
+    else
+    {
+        OUTMSG( ( "key %lu not found\n", key ) );
+    }
+    return 0;
+}
+
+
+static rc_t CC on_visit_bool ( uint64_t key, bool value, void *user_data )
+{
+    lookup_context * ctx = user_data;
+    bool_key_and_value * kv = find_bool( ctx->control, key );
+    if ( kv != NULL )
+    {
+        if ( kv->value == value )
+        {
+            ctx->found ++;
+        }
+        else
+        {
+            OUTMSG( ( "values %s vs %s mismatch\n", value ? "true" : "false", kv->value ? "true" : "false" ) );
+        }
+    }
+    else
+    {
+        OUTMSG( ( "key %lu not found\n", key ) );
+    }
+    return 0;
+}
+
+
+static rc_t CC on_visit_ptr ( uint64_t key, const_ptr value, void *user_data )
+{
+    lookup_context * ctx = user_data;
+    ptr_key_and_value * kv = find_ptr( ctx->control, key );
+    if ( kv != NULL )
+    {
+        if ( kv->value == value )
+        {
+            ctx->found ++;
+        }
+        else
+        {
+            OUTMSG( ( "values %p vs %p mismatch\n", value, kv->value ) );
+        }
+    }
+    else
+    {
+        OUTMSG( ( "key %lu not found\n", key ) );
+    }
+    return 0;
+}
+
+
+static rc_t perform_uint64_t_test( random_numbers *nrand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: uint64_t - test( count = %u )\n", nrand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < nrand->count && rc == 0; ++i )
+        {
+            uint64_t_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                kv->key = nrand->numbers[ i ];
+                kv->value = (uint64_t)( rand() % ( nrand->count + 1 ) );
+                rc = KVectorSetU64 ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", nrand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, uint64_t_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            ctx.found = 0;
+            ctx.control = &control;
+            rc = KVectorVisitU64( v, false, on_visit_uint64_t, &ctx ); /* */
+            OUTMSG(( "%u values verified\n", ctx.found ));
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t perform_uint32_t_test( random_numbers *nrand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: uint32_t - test( count = %u )\n", nrand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < nrand->count && rc == 0; ++i )
+        {
+            uint32_t_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                kv->key = nrand->numbers[ i ];
+                kv->value = (uint32_t)( rand() % ( nrand->count + 1 ) );
+                rc = KVectorSetU32 ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", nrand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, uint32_t_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            ctx.found = 0;
+            ctx.control = &control;
+            rc = KVectorVisitU64( v, false, on_visit_uint32_t, &ctx ); /* */
+            OUTMSG(( "%u values verified\n", ctx.found ));
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t perform_uint16_t_test( random_numbers *nrand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: uint16_t - test( count = %u )\n", nrand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < nrand->count && rc == 0; ++i )
+        {
+            uint16_t_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                kv->key = nrand->numbers[ i ];
+                kv->value = (uint16_t)( rand() % ( nrand->count + 1 ) );
+                rc = KVectorSetU16 ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", nrand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, uint16_t_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            ctx.found = 0;
+            ctx.control = &control;
+            rc = KVectorVisitU64( v, false, on_visit_uint16_t, &ctx ); /* */
+            OUTMSG(( "%u values verified\n", ctx.found ));
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t perform_uint8_t_test( random_numbers *nrand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: uint8_t - test( count = %u )\n", nrand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < nrand->count && rc == 0; ++i )
+        {
+            uint8_t_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                kv->key = nrand->numbers[ i ];
+                kv->value = (uint8_t)( rand() % ( nrand->count + 1 ) );
+                rc = KVectorSetU8 ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", nrand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, uint8_t_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            ctx.found = 0;
+            ctx.control = &control;
+            rc = KVectorVisitU64( v, false, on_visit_uint8_t, &ctx ); /* */
+            OUTMSG(( "%u values verified\n", ctx.found ));
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t perform_int64_t_test( random_numbers *nrand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: int64_t - test( count = %u )\n", nrand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < nrand->count && rc == 0; ++i )
+        {
+            int64_t_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                kv->key = nrand->numbers[ i ];
+                kv->value = (int64_t)( rand() % ( nrand->count + 1 ) );
+                rc = KVectorSetI64 ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", nrand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, int64_t_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            ctx.found = 0;
+            ctx.control = &control;
+            rc = KVectorVisitI64( v, false, on_visit_int64_t, &ctx ); /* */
+            OUTMSG(( "%u values verified\n", ctx.found ));
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t perform_int32_t_test( random_numbers *nrand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: int32_t - test( count = %u )\n", nrand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < nrand->count && rc == 0; ++i )
+        {
+            int32_t_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                kv->key = nrand->numbers[ i ];
+                kv->value = (int32_t)( rand() % ( nrand->count + 1 ) );
+                rc = KVectorSetI32 ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", nrand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, int32_t_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            ctx.found = 0;
+            ctx.control = &control;
+            rc = KVectorVisitI64( v, false, on_visit_int32_t, &ctx ); /* */
+            OUTMSG(( "%u values verified\n", ctx.found ));
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t perform_int16_t_test( random_numbers *nrand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: int16_t - test( count = %u )\n", nrand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < nrand->count && rc == 0; ++i )
+        {
+            int16_t_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                kv->key = nrand->numbers[ i ];
+                kv->value = (int16_t)( rand() % ( nrand->count + 1 ) );
+                rc = KVectorSetI16 ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", nrand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, int16_t_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            ctx.found = 0;
+            ctx.control = &control;
+            rc = KVectorVisitI64( v, false, on_visit_int16_t, &ctx ); /* */
+            OUTMSG(( "%u values verified\n", ctx.found ));
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t perform_int8_t_test( random_numbers *nrand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: int8_t - test( count = %u )\n", nrand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < nrand->count && rc == 0; ++i )
+        {
+            int8_t_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                kv->key = nrand->numbers[ i ];
+                kv->value = (int8_t)( rand() % ( nrand->count + 1 ) );
+                rc = KVectorSetI8 ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", nrand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, int8_t_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            ctx.found = 0;
+            ctx.control = &control;
+            rc = KVectorVisitI64( v, false, on_visit_int8_t, &ctx ); /* */
+            OUTMSG(( "%u values verified\n", ctx.found ));
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t perform_float_test( random_numbers *nrand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: float - test( count = %u )\n", nrand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < nrand->count && rc == 0; ++i )
+        {
+            float_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                kv->key = nrand->numbers[ i ];
+                kv->value = (float)( rand() % ( nrand->count + 1 ) );
+                rc = KVectorSetF32 ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", nrand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, float_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            /* there is no KVectorVisitF32(), validating with KVectorVisitF64() would fail! */
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t perform_double_test( random_numbers *nrand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: double - test( count = %u )\n", nrand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < nrand->count && rc == 0; ++i )
+        {
+            double_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                kv->key = nrand->numbers[ i ];
+                kv->value = (double)( rand() % ( nrand->count + 1 ) );
+                rc = KVectorSetF64 ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", nrand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, double_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            ctx.found = 0;
+            ctx.control = &control;
+            rc = KVectorVisitF64( v, false, on_visit_double, &ctx ); /* */
+            OUTMSG(( "%u values verified\n", ctx.found ));
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t perform_bool_test( random_numbers *nrand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: bool - test( count = %u )\n", nrand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < nrand->count && rc == 0; ++i )
+        {
+            bool_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                uint32_t rv = rand() % ( nrand->count + 1 );
+                kv->key = nrand->numbers[ i ];
+                kv->value = ( rv & 1 );
+                rc = KVectorSetBool ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", nrand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, bool_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            /* there is no visit-bool */
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t perform_ptr_test( random_numbers *rand ) /* */
+{
+    KVector *v;
+    rc_t rc;
+    OUTMSG(( "KVector: ptr - test( count = %u )\n", rand->count )); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        Vector control;
+        uint32_t i;
+        VectorInit ( &control, 0, 1000 );
+        for ( i = 0; i < rand->count && rc == 0; ++i )
+        {
+            ptr_key_and_value *kv = malloc( sizeof *kv ); /* */
+            if ( kv == NULL )
+            {
+                rc = RC ( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+            }
+            else
+            {
+                kv->key = rand->numbers[ i ];
+                kv->value = kv;
+                rc = KVectorSetPtr ( v, kv->key, kv->value ); /* */
+                if ( rc == 0 )
+                    rc = VectorAppend ( &control, NULL, kv );
+                if ( rc != 0)
+                    free( kv );
+            }
+        }
+        OUTMSG(( "%u key-value-pairs inserted\n", rand->count ));
+        if ( rc == 0 )
+        {
+            lookup_context ctx;
+            ctx.found = 0;
+            ctx.v = v;
+            VectorForEach ( &control, false, ptr_lookup, &ctx ); /* */
+            OUTMSG(( "%u values found\n", ctx.found ));
+
+            ctx.found = 0;
+            ctx.control = &control;
+            rc = KVectorVisitPtr( v, false, on_visit_ptr, &ctx ); /* */
+            OUTMSG(( "%u values verified\n", ctx.found ));
+
+        }
+        VectorWhack ( &control, key_and_value_whack, NULL );
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+    return rc;
+}
+
+
+static rc_t test_prev_single_i32 ( KVector const* v,
+    uint64_t const key, uint64_t const prev_key_ref, int32_t const prev_value_ref )
+{
+    uint64_t prev_key;
+    int32_t prev_value;
+    rc_t rc = KVectorGetPrevI32 ( v, &prev_key, key, &prev_value );
+    if (rc)
+    {
+        OUTMSG(("KVectorGetPrevI32(key=%lu) failed with e...r %R\n", key, rc));
+    }
+    else
+        OUTMSG(("The value previous to key=%lu is (%lu, %d); must be (%lu, %d)%s\n",
+            key, prev_key, prev_value, prev_key_ref, prev_value_ref,
+            prev_key != prev_key_ref || prev_value != prev_value_ref ? " MISMATCH" : ""));
+    return rc;
+}
+
+static rc_t test_next_single_i32 ( KVector const* v,
+    uint64_t const key, uint64_t const next_key_ref, int32_t const next_value_ref )
+{
+    uint64_t next_key;
+    int32_t next_value;
+    rc_t rc = KVectorGetNextI32 ( v, &next_key, key, &next_value );
+    if (rc)
+        OUTMSG(("KVectorGetNextI32(key=%lu) failed with e...r %R\n", key, rc));
+    else
+        OUTMSG(("The value following key=%lu is (%lu, %d); must be (%lu, %d)%s\n",
+            key, next_key, next_value, next_key_ref, next_value_ref,
+            next_key != next_key_ref || next_value != next_value_ref ? " MISMATCH" : ""));
+    return rc;
+}
+
+static rc_t perform_prev_next_i32_test()
+{
+    rc_t rc;
+    KVector *v;
+    OUTMSG(( "KVector: prev element int32 - test\n")); /* */
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        rc = KVectorSetI32 (v, 1, 11 );
+        rc = rc || KVectorSetI32 (v, 2, 22 );
+        rc = rc || KVectorSetI32 (v, 3, 33 );
+        rc = rc || KVectorSetI32 (v, 4, 44 );
+        rc = rc || KVectorSetI32 (v, 0, 100 );
+        rc = rc || KVectorSetI32 (v, 32, 320 );
+        rc = rc || KVectorSetI32 (v, 64, 640 );
+
+        if (rc)
+            OUTMSG(("KVectorSetI32 failed with e...r %R\n", rc));
+        else
+        {
+            test_prev_single_i32 (v, 2, 1, 11);
+            test_prev_single_i32 (v, 1, 0, 100);
+            test_prev_single_i32 (v, 32, 4, 44);
+            test_prev_single_i32 (v, 64, 32, 320);
+            test_prev_single_i32 (v, 0, 0, 0);
+            test_prev_single_i32 (v, 123, 64, 640);
+            test_prev_single_i32 (v, 33, 32, 320);
+
+            OUTMSG(("\n"));
+
+            test_next_single_i32 (v, 2, 3, 33);
+            test_next_single_i32 (v, 1, 2, 22);
+            test_next_single_i32 (v, 32, 64, 640);
+            test_next_single_i32 (v, 64, 0, 0);
+            test_next_single_i32 (v, 0, 1, 11);
+            test_next_single_i32 (v, 123, 0, 0);
+            test_next_single_i32 (v, 33, 64, 640);
+        }
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+
+    return rc;
+}
+
+static rc_t test_prev_single_bool ( KVector const* v,
+    uint64_t key, uint64_t prev_key_ref, bool prev_value_ref )
+{
+    uint64_t prev_key;
+    bool prev_value;
+    rc_t rc = KVectorGetPrevBool ( v, &prev_key, key, &prev_value );
+    if (rc)
+        OUTMSG(("KVectorGetPrevBool(key=%lu) failed with e...r %R\n", key, rc));
+    else
+        OUTMSG(("The value previous to key=%lu is (%lu, %d); must be (%lu, %d)%s\n",
+            key, prev_key, prev_value, prev_key_ref, prev_value_ref,
+            prev_key != prev_key_ref || prev_value != prev_value_ref ? " MISMATCH" : ""));
+    return rc;
+}
+
+static rc_t test_next_single_bool ( KVector const* v,
+    uint64_t key, uint64_t next_key_ref, bool next_value_ref )
+{
+    uint64_t next_key;
+    bool next_value;
+    rc_t rc = KVectorGetNextBool ( v, &next_key, key, &next_value );
+    if (rc)
+        OUTMSG(("KVectorGetNextBool(key=%lu) failed with e...r %R\n", key, rc));
+    else
+        OUTMSG(("The value following key=%lu is (%lu, %d); must be (%lu, %d)%s\n",
+            key, next_key, next_value, next_key_ref, next_value_ref,
+            next_key != next_key_ref || next_value != next_value_ref ? " MISMATCH" : ""));
+    return rc;
+}
+
+static rc_t perform_prev_next_bool_test()
+{
+    rc_t rc;
+    KVector *v;
+    OUTMSG(( "KVector: prev element bool - test\n"));
+    rc = KVectorMake ( &v );
+    if ( rc == 0 )
+    {
+        rc = KVectorSetBool (v, 1, true );
+        rc = rc || KVectorSetBool (v, 2, false );
+        rc = rc || KVectorSetBool (v, 3, true );
+        rc = rc || KVectorSetBool (v, 4, false );
+        rc = rc || KVectorSetBool (v, 0, true );
+        rc = rc || KVectorSetBool (v, 32, false );
+        rc = rc || KVectorSetBool (v, 64, true );
+
+        if (rc)
+            OUTMSG(("KVectorSetBool failed with e...r %R\n", rc));
+        else
+        {
+            test_prev_single_bool (v, 2, 1, true);
+            test_prev_single_bool (v, 1, 0, true);
+            test_prev_single_bool (v, 32, 4, false);
+            test_prev_single_bool (v, 64, 32, false);
+            test_prev_single_bool (v, 0, 4, false);
+            test_prev_single_bool (v, 123, 64, true);
+            test_prev_single_bool (v, 33, 32, false);
+
+            OUTMSG(("\n"));
+
+            test_next_single_bool (v, 2, 3, true);
+            test_next_single_bool (v, 1, 2, false);
+            test_next_single_bool (v, 32, 64, true);
+            test_next_single_bool (v, 64, 0, true);
+            test_next_single_bool (v, 0, 1, true);
+            test_next_single_bool (v, 123, 0, true);
+            test_next_single_bool (v, 33, 64, true);
+        }
+        KVectorRelease ( v );
+    }
+    OUTMSG(( "\n" ));
+
+    return rc;
+}
+
+
+rc_t perform_test( const uint32_t count )
+{
+    random_numbers rnum;
+    rc_t rc = make_random_numbers( &rnum, count, count * 2 );
+    if ( rc != 0 )
+    {
+        OUTMSG(( "error making random numbers %u\n", rc ));
+    }
+    else
+    {
+#if _ARCH_BITS == 64
+        if ( rc == 0 )
+            rc = perform_uint64_t_test( &rnum );
+#endif
+        if ( rc == 0 )
+            rc = perform_uint32_t_test( &rnum );
+        if ( rc == 0 )
+            rc = perform_uint16_t_test( &rnum );
+        if ( rc == 0 )
+            rc = perform_uint8_t_test( &rnum );
+
+#if _ARCH_BITS == 64
+        if ( rc == 0 )
+            rc = perform_int64_t_test( &rnum );
+#endif
+        if ( rc == 0 )
+            rc = perform_int32_t_test( &rnum );
+        if ( rc == 0 )
+            rc = perform_int16_t_test( &rnum );
+        if ( rc == 0 )
+            rc = perform_int8_t_test( &rnum );
+
+        if ( rc == 0 )
+            rc = perform_float_test( &rnum );
+#if _ARCH_BITS == 64
+        if ( rc == 0 )
+            rc = perform_double_test( &rnum );
+#endif
+        if ( rc == 0 )
+            rc = perform_bool_test( &rnum );
+        if ( rc == 0 )
+            rc = perform_ptr_test( &rnum );
+
+        free_random_numbers( &rnum );
+
+        perform_prev_next_i32_test();
+        perform_prev_next_bool_test();
+    }
+
+    return rc;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args * args;
+
+    rc_t rc = ArgsMakeAndHandle ( &args, argc, argv, 1,
+                JudyTestOptions, sizeof ( JudyTestOptions ) / sizeof ( OptDef ) );
+    if ( rc == 0 )
+    {
+        srand ( ( unsigned int ) time(NULL) );
+        rc = perform_test( get_int_option( args, OPTION_COUNT, 10000 ) );
+
+        ArgsWhack ( args );
+    }
+    else
+        OUTMSG( ( "ArgsMakeAndHandle() failed %R\n", rc ) );
+
+    return rc;
+}
diff --git a/test/junit-4.11.jar b/test/junit-4.11.jar
new file mode 100644
index 0000000..4d552a6
Binary files /dev/null and b/test/junit-4.11.jar differ
diff --git a/test/kapp/Makefile b/test/kapp/Makefile
new file mode 100644
index 0000000..a439578
--- /dev/null
+++ b/test/kapp/Makefile
@@ -0,0 +1,169 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+#TODO: update qfiletest
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+MODULE = test/kapp
+
+TEST_TOOLS = \
+    test-qfile \
+    test-kapp
+
+ALL_TOOLS = \
+	env-test-tool \
+	sig-core \
+	report-kns-agent
+    
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+$(ALL_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(ALL_LIBS) $(ALL_TOOLS) $(TEST_TOOLS)
+
+clean: stdclean
+
+std: $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# kapp-test
+#
+ARGS_TEST_SRC = \
+	kapp-test
+
+ARGS_TEST_OBJ = \
+	$(addsuffix .$(OBJX),$(ARGS_TEST_SRC))
+
+ARGS_TEST_LIB = \
+    -sktst \
+	-skapp \
+    -sload \
+    -sncbi-wvdb \
+
+$(TEST_BINDIR)/test-kapp: $(ARGS_TEST_OBJ)
+	$(LP) --exe -o $@ $^ $(ARGS_TEST_LIB)
+
+#-------------------------------------------------------------------------------
+# test-qfile
+#
+QFILETEST_SRC = \
+	qfiletest
+
+QFILETEST_OBJ = \
+	$(addsuffix .$(OBJX),$(QFILETEST_SRC))
+
+QFILETEST_LIB = \
+	-skapp \
+    -sload \
+    -sncbi-wvdb \
+
+
+$(TEST_BINDIR)/test-qfile: $(QFILETEST_OBJ)
+	$(LD) --exe $(SRCDIR) -o $@ $^ $(QFILETEST_LIB)
+
+#-------------------------------------------------------------------------------
+# env-test-tool
+#
+ENV_TEST_SRC = \
+	env-test-tool
+
+ENV_TEST_OBJ = \
+	$(addsuffix .$(OBJX),$(ENV_TEST_SRC))
+
+ENV_TEST_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sload \
+	-lm
+
+$(TEST_BINDIR)/env-test-tool: $(ENV_TEST_OBJ)
+	$(LD) --exe -o $@ $^ $(ENV_TEST_LIB)
+
+#-------------------------------------------------------------------------------
+# sig-core
+#
+SIG_CORE_TEST_SRC = \
+	sig-core
+
+SIG_CORE_TEST_OBJ = \
+	$(addsuffix .$(OBJX),$(SIG_CORE_TEST_SRC))
+
+SIG_CORE_TEST_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sload \
+	-lm
+
+$(TEST_BINDIR)/sig-core: $(SIG_CORE_TEST_OBJ)
+	$(LD) --exe -o $@ $^ $(SIG_CORE_TEST_LIB)
+	
+#-------------------------------------------------------------------------------
+# report-kns-agent
+#
+REPORT_KNS_AGENT_TEST_SRC = \
+	report-kns-agent
+
+REPORT_KNS_AGENT_TEST_OBJ = \
+	$(addsuffix .$(OBJX),$(REPORT_KNS_AGENT_TEST_SRC))
+
+REPORT_KNS_AGENT_TEST_LIB = \
+	-skapp \
+	-sncbi-vdb
+
+$(TEST_BINDIR)/report-kns-agent: $(REPORT_KNS_AGENT_TEST_OBJ)
+	$(LD) --exe -o $@ $^ $(REPORT_KNS_AGENT_TEST_LIB)
+
+#-------------------------------------------------------------------------------
+# scripted tests
+#
+runtests: sig-core-tests kns-agent-tests
+
+sig-core-tests: sig-core
+	@ echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+	@ echo "Running $(SRCDIR)/run-sig-core.sh $(TEST_BINDIR)/sig-core"
+	@ $(SRCDIR)/run-sig-core.sh $(TEST_BINDIR)/sig-core $(HOST_OS) $(BUILD)
+	
+kns-agent-tests: report-kns-agent
+	@ echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+	@ echo "Running kns-agent tests"
+	@ # simple tool name
+	@ export PATH=./tmp/export:$$PATH && $(SRCDIR)/run-kns-agent.sh $(TEST_BINDIR)/report-kns-agent ./tmp/export/a.123.99 a.1.2.3 a.123.99
+	@ export PATH=./tmp/export:$$PATH && $(SRCDIR)/run-kns-agent.sh $(TEST_BINDIR)/report-kns-agent ./tmp/export/abcdefghi abcdefghi.1.2.3 abcdefghi
+	@ # tool path where directory path length >= tool name length
+	@ $(SRCDIR)/run-kns-agent.sh $(TEST_BINDIR)/report-kns-agent ./tmp/path/tool.99.123 tool.1.2.3
+	@ $(SRCDIR)/run-kns-agent.sh $(TEST_BINDIR)/report-kns-agent ./tmp/path/tool tool.1.2.3
+	@ $(SRCDIR)/run-kns-agent.sh $(TEST_BINDIR)/report-kns-agent tmp/path/tool tool.1.2.3
+	@ $(SRCDIR)/run-kns-agent.sh $(TEST_BINDIR)/report-kns-agent ../kapp/tmp/path/tool tool.1.2.3
+	@ $(SRCDIR)/run-kns-agent.sh $(TEST_BINDIR)/report-kns-agent tmp/tool tool.1.2.3
+	@ # tool path where directory path length < tool name length
+	@ $(SRCDIR)/run-kns-agent.sh $(TEST_BINDIR)/report-kns-agent ./tmp/abcdefghi abcdefghi.1.2.3
+	@ $(SRCDIR)/run-kns-agent.sh $(TEST_BINDIR)/report-kns-agent ./tmp/abcdefghi.55.111 abcdefghi.1.2.3
+	@ rm -rf ./tmp/
+	
diff --git a/test/kapp/env-test-tool.c b/test/kapp/env-test-tool.c
new file mode 100644
index 0000000..5a349bc
--- /dev/null
+++ b/test/kapp/env-test-tool.c
@@ -0,0 +1,170 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <assert.h>
+#include <stdio.h>
+
+// TODO: provide short ones
+#define ALIAS_AMD64     NULL
+#define OPTION_AMD64    "amd64"
+static const char* USAGE_AMD64[] = { "require tool to be run under 64-bit environment", NULL };
+
+#define ALIAS_RAM       NULL
+#define OPTION_RAM      "ram"
+static const char* USAGE_RAM[] = { "require system RAM to be at least B", NULL };
+
+OptDef Options[] =
+{                                         /* needs_value, required */
+      { OPTION_AMD64, ALIAS_AMD64, NULL, USAGE_AMD64, 1, false, false }
+    , { OPTION_RAM  , ALIAS_RAM  , NULL, USAGE_RAM  , 1, true , false }
+};
+
+ver_t CC KAppVersion ( void )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-env";
+
+rc_t CC UsageSummary ( const char *progname )
+{
+    return KOutMsg ( "\n"
+                     "Usage:\n"
+                     "  %s [Options]\n"
+                     "\n"
+                     "Summary:\n"
+                     "  Test system environment.\n"
+                     , progname
+        );
+}
+
+rc_t CC Usage ( const Args *args )
+{
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if (args == NULL)
+        rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+    else
+        rc = ArgsProgram (args, &fullpath, &progname);
+    if (rc)
+        progname = fullpath = UsageDefaultName;
+
+    UsageSummary (progname);
+
+    KOutMsg ("Options:\n");
+
+    HelpOptionLine (ALIAS_AMD64, OPTION_AMD64, NULL, USAGE_AMD64);
+    HelpOptionLine (ALIAS_RAM  , OPTION_RAM  , NULL, USAGE_RAM);
+    KOutMsg ("\n");
+
+    HelpOptionsStandard ();
+    HelpVersion ( fullpath, KAppVersion () );
+
+    return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args *args;
+    rc_t rc;
+    do {
+        uint32_t paramc;
+        bool requireAmd64 = false;
+        uint64_t requireRam = 0;
+
+        rc = ArgsMakeAndHandle ( & args, argc, argv, 1, 
+               Options, sizeof Options / sizeof (OptDef) );
+        if ( rc != 0 )
+        {
+            LogErr ( klogErr, rc, "failed to parse arguments" );
+            break;
+        }
+        
+        // TODO: cehck if we need it
+        rc = ArgsParamCount ( args, & paramc );
+        if ( rc != 0 ) {
+            LogErr ( klogInt, rc, "failed to obtain param count" );
+            break;
+        }
+
+        {   // OPTION_AMD64
+            rc = ArgsOptionCount( args, OPTION_AMD64, & paramc );
+            if ( rc ) {
+                LOGERR( klogErr, rc, "Failure to get '" OPTION_AMD64 "' argument" );
+                break;
+            }
+            if ( paramc ) {
+                requireAmd64 = true;
+            }
+        }
+
+        {
+            // OPTION_RAM
+            rc = ArgsOptionCount ( args, OPTION_RAM, & paramc );
+            if ( rc ) {
+                LOGERR ( klogErr, rc, "Failure to get '" OPTION_RAM "' argument" );
+                break;
+            }
+            if ( paramc ) {
+                const char* dummy = NULL;
+                rc = ArgsOptionValue(args, OPTION_RAM, 0, (const void **)&dummy);
+                if ( rc ) {
+                    LOGERR(klogErr, rc, "Failure to get '" OPTION_RAM "' argument");
+                    break;
+                }
+
+                rc = sscanf(dummy, "%llu", &requireRam);
+                if ( rc != 1) 
+                {
+                    LOGMSG(klogErr, "Failure to parse '" OPTION_RAM "' argument value");
+                    break;
+                }
+            }
+
+        }
+       
+        {
+            rc = KAppCheckEnvironment(requireAmd64, requireRam);
+            if (rc != 0 )
+                printf("Invalid environment\n");
+            else
+                printf("Enviroment is fine!\n"); 
+        }
+    } while (false);
+
+    ArgsWhack ( args );
+
+    return rc;
+}
diff --git a/test/kapp/kapp-test.cpp b/test/kapp/kapp-test.cpp
new file mode 100644
index 0000000..6b37bf9
--- /dev/null
+++ b/test/kapp/kapp-test.cpp
@@ -0,0 +1,549 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <cstdlib>
+#include <cstring>
+#include <cstdio>
+
+#include <ktst/unit_test.hpp>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <kapp/loader-file.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/impl.h>
+#include <kapp/queue-file.h>
+#include <kfg/config.h>
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(KAppTestSuite);
+
+const char UsageDefaultName[] = "args-test";
+
+#if ! ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+extern "C"
+{
+    rc_t CC UsageSummary ( const char *progname )
+    {
+        return TestEnv::UsageSummary ( progname );
+    }
+
+    rc_t CC Usage ( const Args *args )
+    {
+        const char* progname = UsageDefaultName;
+        const char* fullpath = UsageDefaultName;
+
+        rc_t rc = (args == NULL) ?
+            RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull):
+            ArgsProgram(args, &fullpath, &progname);
+        if ( rc == 0 )
+            rc = TestEnv::Usage ( progname );
+        return rc;
+    }
+}
+#endif
+
+#define OPTION_TEST "test"
+
+static char arg_append_string[] = "__T__";
+static size_t arg_append_string_len = sizeof arg_append_string / sizeof arg_append_string[0] - 1;
+
+rc_t TestArgConvAppender(const Args * args, uint32_t arg_index, const char * arg, size_t arg_len, void ** result, WhackParamFnP * whack)
+{
+    char * res = (char *)malloc(arg_len + arg_append_string_len + 1);
+    assert(res);
+    
+    memmove(res, arg, arg_len);
+    memmove(res + arg_len, arg_append_string, arg_append_string_len);
+    res[arg_len + arg_append_string_len] = 0;
+    
+    *result = res;
+    
+    return 0;
+}
+
+void WhackArgFile(void * file)
+{
+    KFileRelease(reinterpret_cast<KFile *>(file));
+}
+
+rc_t TestArgConvFileCreator(const Args * args, uint32_t arg_index, const char * arg, size_t arg_len, void ** result, WhackParamFnP * whack)
+{
+    rc_t rc;
+    KDirectory * dir;
+    KFile * file;
+    
+    char * file_path = const_cast<char *>(arg);
+    
+    rc = KDirectoryNativeDir( &dir );
+    if (rc == 0)
+    {
+        KDirectoryRemove(dir, true, "%s", file_path);
+        rc = KDirectoryCreateFile(dir, &file, false, 0664, kcmCreate, "%s", file_path);
+        if (rc == 0)
+        {
+            char buffer[4] = { 'a', 'b', 'c', 'd' };
+            size_t num_written;
+            
+            rc = KFileWriteAll(file, 0, buffer, sizeof buffer / sizeof buffer[0], &num_written);
+            if (rc == 0)
+            {
+                assert(num_written == sizeof buffer / sizeof buffer[0]);
+                
+                *result = file;
+                *whack = WhackArgFile;
+                return 0;
+            }
+            
+            fprintf(stderr, "cannot write test buffer to create file: %s\n", file_path);
+            KFileRelease(file);
+        }
+        else
+        {
+            fprintf(stderr, "cannot create file from argument: %s\n", file_path);
+        }
+        KDirectoryRelease( dir );
+    }
+    
+    return rc;
+}
+
+TEST_CASE(KApp_ArgsMakeParams)
+{
+    int argc;
+    const char * argv[16];
+
+    /* testing params */
+    argc = 6;
+    argv[0] = "test_1";
+    argv[1] = "0";
+    argv[2] = "1";
+    argv[3] = "2";
+    argv[4] = "3";
+    argv[5] = "4";
+
+    Args * args;
+    REQUIRE_RC(ArgsMake (&args));
+    REQUIRE_RC(ArgsParse (args, argc, (char**)argv));
+
+    {
+        uint32_t param_count;
+        uint32_t ix;
+
+        REQUIRE_RC(ArgsParamCount (args, &param_count));
+        REQUIRE_EQ(param_count, (uint32_t)argc-1);
+        for (ix = 0; ix < param_count; ix++)
+        {
+            const char * value;
+            REQUIRE_RC(ArgsParamValue (args, ix, reinterpret_cast<const void**>(&value)));
+            {
+                /* valgrind whines about the line below.  I can't see
+                 * the problem with a uninitialized variable used for
+                 * a conditional jump unless its in libc */
+                REQUIRE_EQ(atoi(value), (int)ix);
+            }
+        }
+    }
+    REQUIRE_RC(ArgsWhack (args));
+}
+
+TEST_CASE(KApp_ArgsMakeParamsConvAppend)
+{
+    ParamDef Parameters[] =
+    {
+        { TestArgConvAppender }
+    };
+    int argc;
+    const char * argv[16];
+    
+    /* testing params */
+    argc = 2;
+    argv[0] = "test_1";
+    argv[1] = "abcd";
+    
+    Args * args;
+    REQUIRE_RC(ArgsMake (&args));
+    REQUIRE_RC(ArgsAddParamArray (args, Parameters, sizeof Parameters / sizeof Parameters[0]));
+    REQUIRE_RC(ArgsParse (args, argc, (char**)argv));
+    
+    {
+        const char * value;
+        uint32_t param_count;
+        
+        REQUIRE_RC(ArgsParamCount (args, &param_count));
+        REQUIRE_EQ(param_count, (uint32_t)argc-1);
+        
+        REQUIRE_RC(ArgsParamValue (args, 0, reinterpret_cast<const void**>(&value)));
+        
+        REQUIRE(memcmp(value, argv[1], 4) == 0);
+        REQUIRE(memcmp(value + 4, arg_append_string, arg_append_string_len + 1) == 0);
+    }
+    REQUIRE_RC(ArgsWhack (args));
+}
+
+TEST_CASE(KApp_ArgsMakeOptions)
+{
+    OptDef Options[] =
+    {                                         /* needs_value, required */
+        { OPTION_TEST, NULL, NULL, NULL, 1, true, false }
+    };
+    int argc;
+    const char * argv[16];
+    
+    /* testing params */
+    argc = 3;
+    argv[0] = "test_2";
+    argv[1] = "--test";
+    argv[2] = "abcd";
+    
+    Args * args;
+    REQUIRE_RC(ArgsMake (&args));
+    REQUIRE_RC(ArgsAddOptionArray (args, Options, sizeof Options / sizeof Options[0]));
+    REQUIRE_RC(ArgsParse (args, argc, (char**)argv));
+    
+    {
+        const char * value;
+        uint32_t count;
+        
+        REQUIRE_RC(ArgsParamCount (args, &count));
+        REQUIRE_EQ(count, (uint32_t)0);
+        
+        REQUIRE_RC(ArgsOptionCount (args, OPTION_TEST, &count));
+        REQUIRE_EQ(count, (uint32_t)1);
+        
+        REQUIRE_RC(ArgsOptionValue (args, OPTION_TEST, 0, reinterpret_cast<const void**>(&value)));
+        REQUIRE_EQ(std::string(value), std::string(argv[2]));
+    }
+    REQUIRE_RC(ArgsWhack (args));
+}
+
+TEST_CASE(KApp_ArgsMakeOptionsConversion)
+{
+    OptDef Options[] =
+    {                                         /* needs_value, required */
+        { OPTION_TEST, NULL, NULL, NULL, 1, true, false, TestArgConvFileCreator }
+    };
+    int argc;
+    const char * argv[16];
+    KDirectory * dir;
+    
+    /* testing params */
+    argc = 3;
+    argv[0] = "test_2";
+    argv[1] = "--test";
+    argv[2] = "file.test";
+    
+    Args * args;
+    REQUIRE_RC(ArgsMake (&args));
+    REQUIRE_RC(ArgsAddOptionArray (args, Options, sizeof Options / sizeof Options[0]));
+    REQUIRE_RC(ArgsParse (args, argc, (char**)argv));
+    
+    {
+        const KFile * file;
+        uint32_t count;
+        uint64_t file_size;
+        
+        REQUIRE_RC(ArgsParamCount (args, &count));
+        REQUIRE_EQ(count, (uint32_t)0);
+        
+        REQUIRE_RC(ArgsOptionCount (args, OPTION_TEST, &count));
+        REQUIRE_EQ(count, (uint32_t)1);
+        
+        REQUIRE_RC(ArgsOptionValue (args, OPTION_TEST, 0, reinterpret_cast<const void**>(&file)));
+        
+        REQUIRE_RC(KFileSize (file, &file_size));
+        
+        REQUIRE_EQ(file_size, (uint64_t)4);
+    }
+    REQUIRE_RC(ArgsWhack (args));
+    
+    REQUIRE_RC(KDirectoryNativeDir ( &dir ));
+    REQUIRE_RC(KDirectoryRemove(dir, true, "%s", argv[2]));
+    REQUIRE_RC(KDirectoryRelease (dir));
+}
+
+#ifndef WINDOWS
+TEST_CASE(KQueueFile_ReadTimeout_FGsleeps)
+{
+    KDirectory *dir;
+    REQUIRE_RC(KDirectoryNativeDir(&dir));
+
+    KFile const* src;
+    REQUIRE_RC(KDirectoryOpenFileRead(dir, &src, "queuefile.data"));
+
+    const size_t BlockSize=10;
+    struct KFile const* qf;
+    const uint32_t timeoutSec=1;
+    // create a queue of 1 short block 
+    REQUIRE_RC(KQueueFileMakeRead(&qf, 0, src, BlockSize*1, BlockSize, timeoutSec*1000));
+
+    char buffer[BlockSize];
+    size_t num_read;
+    uint64_t pos=0;
+    REQUIRE_RC(KFileRead(qf, pos, buffer, BlockSize, &num_read)); REQUIRE_EQ(num_read, BlockSize); pos+=num_read;
+    // now sleep longer than the timeout and make sure the background thread does not seal the queue
+    TestEnv::Sleep(timeoutSec*2);
+    // read the block that has been populated while we slept:
+    REQUIRE_RC(KFileRead(qf, pos, buffer, BlockSize, &num_read)); REQUIRE_EQ(num_read, BlockSize); pos+=num_read;
+    // if queue has been sealed because of the timeout, the second read would return 0 bytes:
+    REQUIRE_RC(KFileRead(qf, pos, buffer, BlockSize, &num_read)); REQUIRE_EQ(num_read, BlockSize); pos+=num_read;
+
+    REQUIRE_RC(KFileRelease(qf));
+    REQUIRE_RC(KFileRelease(src));
+    REQUIRE_RC(KDirectoryRelease(dir));
+}
+
+//// A mock KFile object for imitating slow read on a background thread. Sends its thread to sleep after reading each block.
+struct SleepyReader
+{
+    const static uint64_t Size=10000;
+    const static int SleepSec=1;
+
+    static rc_t MakeFileRead(KFile const** f)
+    {
+        KFile* ret=(KFile*)malloc(sizeof(KFile));
+        ret-> vt = (const KFile_vt*)&vt;
+        ret-> dir = NULL;
+        atomic32_set ( & ret-> refcount, 1 );
+        ret-> read_enabled = 1;
+        ret-> write_enabled = 0;            
+        *f = ret;
+        return 0;
+    }
+    static rc_t CC get_size ( const KFILE_IMPL *self, uint64_t *size ) 
+    { 
+        *size=Size; 
+        return 0; 
+    }
+    static rc_t CC read( const KFILE_IMPL *self, uint64_t pos, void *buffer, size_t bsize, size_t *num_read )
+    {
+        memset(buffer, 1, bsize);
+        *num_read=bsize;
+        TestEnv::Sleep(SleepSec);
+        return 0;
+    }
+    static rc_t CC destroy( KFILE_IMPL *self ) 
+    { 
+        free(self); 
+        return 0; 
+    }
+
+    // the rest of the functions do not matter
+    static struct KSysFile* CC get_sysfile ( const KFILE_IMPL *self, uint64_t *offset ) { *offset=0; return 0; }
+    static rc_t CC random_access ( const KFILE_IMPL *self ) { return 0; } 
+    static rc_t CC set_size ( KFILE_IMPL *self, uint64_t size ) { return 0; }
+    static rc_t CC write( KFILE_IMPL *self, uint64_t pos, const void *buffer, size_t size, size_t *num_writ ) { *num_writ=0; return 0; }
+
+    static KFile_vt_v1 vt;
+};
+KFile_vt_v1 SleepyReader::vt=
+{   1, 0, 
+    SleepyReader::destroy,
+    SleepyReader::get_sysfile,
+    SleepyReader::random_access,
+    SleepyReader::get_size,
+    SleepyReader::set_size,
+    SleepyReader::read,
+    SleepyReader::write
+};
+
+TEST_CASE(KQueueFile_ReadTimeout_BGsleeps)
+{   
+    KFile const* src;
+    REQUIRE_RC(SleepyReader::MakeFileRead(&src)); // this reader will sleep for a second after each block
+
+    const size_t BlockSize=10;
+    struct KFile const* qf;
+    // create a queue of 1 short block 
+    REQUIRE_RC(KQueueFileMakeRead(&qf, 0, src, BlockSize*1, BlockSize, 100)); // a short timeout on the foreground thread
+
+    char buffer[BlockSize];
+    size_t num_read;
+    uint64_t pos=0;
+    REQUIRE_RC(KFileRead(qf, pos, buffer, BlockSize, &num_read)); REQUIRE_EQ(num_read, BlockSize); pos+=num_read;
+    // the background read thread will read the bytes and go to sleep for 1 second
+    // now, read the next block to make sure the foreground read thread recovers from the timeouts
+    REQUIRE_RC(KFileRead(qf, pos, buffer, BlockSize, &num_read)); REQUIRE_EQ(num_read, BlockSize); pos+=num_read;
+
+    REQUIRE_RC(KFileRelease(qf));
+    REQUIRE_RC(KFileRelease(src));
+}
+
+TEST_CASE(KQueueFile_WriteTimeout)
+{   
+    KDirectory *dir;
+    REQUIRE_RC(KDirectoryNativeDir(&dir));
+
+    const char* fileName="queuefile.temp";
+    KFile *dest;
+    REQUIRE_RC(KDirectoryCreateFile(dir, (KFile**)&dest, false, 0664, kcmInit, fileName));
+
+    const size_t BlockSize=10;
+    struct KFile* qf;
+    const uint32_t timeoutSec=1;
+    // create a queue of 1 short block 
+    REQUIRE_RC(KQueueFileMakeWrite(&qf, dest, BlockSize*1, BlockSize, timeoutSec*1000));
+
+    char buffer[BlockSize*2];
+    memset(buffer, 0, sizeof(buffer));
+    size_t num_writ;
+    uint64_t pos=0;
+    REQUIRE_RC(KFileWrite(qf, pos, buffer, BlockSize, &num_writ)); REQUIRE_EQ(num_writ, BlockSize); pos+=num_writ;
+    // now sleep longer than the timeout and make sure the background thread does not seal the queue
+    TestEnv::Sleep(timeoutSec*2);
+    // make sure we can continue writing:
+    REQUIRE_RC(KFileWrite(qf, pos, buffer, BlockSize, &num_writ)); REQUIRE_EQ(num_writ, BlockSize); 
+
+    REQUIRE_RC(KFileRelease(qf));
+    REQUIRE_RC(KFileRelease(dest));
+    REQUIRE_RC(KDirectoryRemove(dir, true, fileName)); 
+    REQUIRE_RC(KDirectoryRelease(dir));
+}
+#endif
+
+class LoaderFileFixture
+{
+public:
+    LoaderFileFixture() 
+    :   wd(0), lf(0)
+    {
+        if ( KDirectoryNativeDir ( & wd ) != 0 )
+            FAIL("KDirectoryNativeDir failed");
+    }
+    ~LoaderFileFixture() 
+    {
+        if ( lf != 0 && KLoaderFile_Release( lf, true ) != 0)
+            FAIL("KLoaderFile_Release failed");
+            
+        if ( !filename.empty() && KDirectoryRemove(wd, true, filename.c_str()) != 0)
+            FAIL("KDirectoryRemove failed");
+
+        if ( KDirectoryRelease ( wd ) != 0 )
+            FAIL("KDirectoryRelease failed");
+    }
+    rc_t CreateFile(const char* p_filename, const char* contents)
+    {   // create and open for read
+        KFile* file;
+        filename=p_filename;
+        rc_t rc=KDirectoryCreateFile(wd, &file, true, 0664, kcmInit, p_filename);
+        if (rc == 0)
+        {
+            size_t num_writ=0;
+            rc=KFileWrite(file, 0, contents, strlen(contents), &num_writ);
+            if (rc == 0)
+            {
+                rc=KFileRelease(file);
+            }
+            else
+            {
+                KFileRelease(file);
+            }
+            file=0;
+        }
+        return KLoaderFile_Make(&lf, wd, p_filename, 0, true);
+    }
+    KDirectory* wd;
+    string filename;
+    const KLoaderFile* lf;
+};
+
+FIXTURE_TEST_CASE(KLoaderFile_eolBeforeEof, LoaderFileFixture)
+{   
+    string input="qqq abcd\n";
+    CreateFile(GetName(), input.c_str());
+    const char* buf = 0;
+    size_t length = 0;
+    REQUIRE_RC(KLoaderFile_Readline(lf, (const void**)&buf, &length));
+    REQUIRE_NOT_NULL(buf);
+    REQUIRE_EQ(input, string(buf, length + 1)); // \n is not included in length but should be in the buffer
+}
+
+
+FIXTURE_TEST_CASE(KLoaderFile_noEolBeforeEof, LoaderFileFixture)
+{   // formerly a bug: if no \n on the last line of a file, the line was lost
+    string input="qqq abcd";
+    CreateFile(GetName(), input.c_str());
+    const char* buf = 0;
+    size_t length = 0;
+    REQUIRE_RC(KLoaderFile_Readline(lf, (const void**)&buf, &length));
+    REQUIRE_NOT_NULL(buf);
+    REQUIRE_EQ(input, string(buf, length));
+}
+
+TEST_CASE(KAppCheckEnvironment_requireAmd64)
+{
+    rc_t rc = KAppCheckEnvironment ( true, 0 );
+#if _ARCH_BITS != 64    
+    REQUIRE_NE ( (int)rc, 0 );
+#else
+    REQUIRE_EQ ( (int)rc, 0 );
+#endif
+}
+
+//////////////////////////////////////////// Main
+
+extern "C"
+{
+
+/* Version  EXTERN
+ *  return 4-part version code: 0xMMmmrrrr, where
+ *      MM = major release
+ *      mm = minor release
+ *    rrrr = bug-fix release
+ */
+ver_t CC KAppVersion (void)
+{
+    return 0;
+}
+
+/* KMain - EXTERN
+ *  executable entrypoint "main" is implemented by
+ *  an OS-specific wrapper that takes care of establishing
+ *  signal handlers, logging, etc.
+ *
+ *  in turn, OS-specific "main" will invoke "KMain" as
+ *  platform independent main entrypoint.
+ *
+ *  "argc" [ IN ] - the number of textual parameters in "argv"
+ *  should never be < 0, but has been left as a signed int
+ *  for reasons of tradition.
+ *
+ *  "argv" [ IN ] - array of NUL terminated strings expected
+ *  to be in the shell-native character set: ASCII or UTF-8
+ *  element 0 is expected to be executable identity or path.
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=KAppTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kapp/qfiletest.c b/test/kapp/qfiletest.c
new file mode 100644
index 0000000..901ae61
--- /dev/null
+++ b/test/kapp/qfiletest.c
@@ -0,0 +1,338 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <kapp/queue-file.h>
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/checksum.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+
+#define OPTION_POS    "pos"
+#define ALIAS_POS     "p"
+
+#define OPTION_QSIZE  "qsize"
+#define ALIAS_QSIZE   "q"
+
+#define OPTION_BSIZE  "bsize"
+#define ALIAS_BSIZE   "b"
+
+#define OPTION_CSIZE  "csize"
+#define ALIAS_CSIZE   "c"
+
+#define OPTION_COUNT  "count"
+#define ALIAS_COUNT   "n"
+
+#define OPTION_POS2   "pos2"
+#define ALIAS_POS2    "2"
+
+static const char * pos_usage[]     = { "where to start reading", NULL };
+static const char * qsize_usage[]     = { "size of queue", NULL };
+static const char * bsize_usage[]     = { "block-size of queue", NULL };
+static const char * csize_usage[]     = { "chunk-size in loop", NULL };
+static const char * count_usage[]     = { "how much bytes total", NULL };
+static const char * pos2_usage[]     = { "2nd position to read at", NULL };
+
+OptDef QfileTestOptions[] =
+{
+/*    name             alias        fkt.  usage-txt,  cnt, needs value, required */
+    { OPTION_POS,      ALIAS_POS,   NULL, pos_usage,    1,   true,        false },
+    { OPTION_QSIZE,    ALIAS_QSIZE, NULL, qsize_usage,  1,   true,        false },
+    { OPTION_BSIZE,    ALIAS_BSIZE, NULL, bsize_usage,  1,   true,        false },
+    { OPTION_CSIZE,    ALIAS_CSIZE, NULL, csize_usage,  1,   true,        false },
+    { OPTION_COUNT,    ALIAS_COUNT, NULL, count_usage,  1,   true,        false },
+    { OPTION_POS2,     ALIAS_POS2,  NULL, pos2_usage,   1,   true,        false }
+};
+
+const char UsageDefaultName[] = "qfiletest";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+    return KOutMsg ("\n"
+                    "Usage:\n"
+                    "  %s [options]\n"
+                    "\n", progname);
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if ( args == NULL )
+        rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+    else
+        rc = ArgsProgram ( args, &fullpath, &progname );
+
+    if ( rc )
+        progname = fullpath = UsageDefaultName;
+
+    UsageSummary ( progname );
+
+    KOutMsg ( "Options:\n" );
+
+    HelpOptionLine ( ALIAS_POS,   OPTION_POS,   "pos",   pos_usage );
+    HelpOptionLine ( ALIAS_QSIZE, OPTION_QSIZE, "qsize", qsize_usage );
+    HelpOptionLine ( ALIAS_BSIZE, OPTION_BSIZE, "bsize", bsize_usage );
+    HelpOptionLine ( ALIAS_CSIZE, OPTION_CSIZE, "csize", csize_usage );
+    HelpOptionLine ( ALIAS_COUNT, OPTION_COUNT, "count", count_usage );
+    HelpOptionLine ( ALIAS_POS2,  OPTION_POS2,  "pos2",  pos2_usage );
+
+    HelpOptionsStandard ();
+    HelpVersion ( fullpath, KAppVersion() );
+    return rc;
+}
+
+
+/* Version  EXTERN
+ *  return 4-part version code: 0xMMmmrrrr, where
+ *      MM = major release
+ *      mm = minor release
+ *    rrrr = bug-fix release
+ */
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+
+
+static uint64_t get_uint64_option( const Args *my_args,
+                                   const char *name,
+                                   const uint64_t def )
+{
+    uint32_t count;
+    uint64_t res = def;
+    rc_t rc = ArgsOptionCount( my_args, name, &count );
+    if ( ( rc == 0 )&&( count > 0 ) )
+    {
+        const char *s;
+        rc = ArgsOptionValue( my_args, name, 0,  (const void **)&s );
+        if ( rc == 0 ) res = strtoull( s, NULL, 10 );
+    }
+    return res;
+}
+
+static uint32_t get_uint32_option( const Args *my_args,
+                                   const char *name,
+                                   const uint32_t def )
+{
+    uint32_t count, res = def;
+    rc_t rc = ArgsOptionCount( my_args, name, &count );
+    if ( ( rc == 0 )&&( count > 0 ) )
+    {
+        const char *s;
+        rc = ArgsOptionValue( my_args, name, 0,  (const void **)&s );
+        if ( rc == 0 ) res = strtoul( s, NULL, 10 );
+    }
+    return res;
+}
+
+
+static rc_t read_loop( const KFile * f, const uint64_t a_pos, const uint64_t count,
+                       const size_t chunk_size, uint8_t digest [ 16 ] )
+{
+    rc_t rc = 0;
+    uint64_t pos = a_pos;
+    uint64_t n_bytes = 0;
+    size_t num_read = 1;
+    MD5State md5;
+
+    char * buffer = malloc( chunk_size );
+    if ( buffer == NULL )
+        return RC( rcExe, rcFile, rcPacking, rcMemory, rcExhausted );
+
+    MD5StateInit ( &md5 );
+    while ( rc == 0 && num_read > 0 )
+    {
+        size_t chunk = chunk_size;
+        
+        if ( ( count > 0 ) && ( ( n_bytes + chunk ) > count ) )
+        {
+            chunk = ( count - n_bytes );
+        }
+
+        OUTMSG(( "about to read from pos %lu\n", pos ));
+        rc = KFileRead ( f, pos, buffer, chunk, &num_read );
+        OUTMSG(( "returned from KFileRead rc = %R, num_read = %zu\n\n", rc, num_read ));
+        if ( rc == 0 && num_read > 0 )
+        {
+            MD5StateAppend ( &md5, buffer, num_read );
+            pos += num_read;
+            n_bytes += num_read;
+            if ( ( count > 0 ) && ( n_bytes >= count ) )
+            {
+                num_read = 0;
+            }
+        }
+    }
+    OUTMSG(( "%lu bytes read total\n", n_bytes ));
+    free( buffer );
+    MD5StateFinish ( &md5, digest );
+
+    return rc;
+}
+
+
+static void print_digest( uint8_t digest [ 16 ] )
+{
+    uint8_t i;
+
+    OUTMSG(( "md5-sum: " ));
+    for ( i = 0; i < 16; ++i )
+        OUTMSG(( "%.02x", digest[ i ] ));
+    OUTMSG(( "\n" ));
+}
+
+
+static rc_t perform_qtest( const KFile *f, const char * filename,
+                           const uint64_t pos, const uint64_t count,
+                           const size_t queue_size, const size_t block_size,
+                           const size_t chunk_size )
+{
+    const KFile * qf;
+    rc_t rc = KQueueFileMakeRead ( &qf, pos, f, queue_size, block_size, 0 );
+    if ( rc != 0 )
+    {
+        OUTMSG(( "KQueueFileMakeRead( '%s' ) failed: %R\n", filename, rc ));
+    }
+    else
+    {
+        uint8_t digest [ 16 ];
+        rc = read_loop( qf, pos, count, chunk_size, digest );
+        KFileRelease( qf );
+        print_digest( digest );
+    }
+    return rc;
+}
+
+
+static rc_t perform_test( const KDirectory *dir, const char * filename,
+                          const uint64_t pos, const uint64_t pos2,
+                          const uint64_t count, const size_t queue_size,
+                          const size_t block_size, const size_t chunk_size )
+{
+    const KFile * f;
+    rc_t rc = KDirectoryOpenFileRead ( dir, &f, filename );
+    if ( rc != 0 )
+    {
+        OUTMSG(( "KDirectoryOpenFileRead( '%s' ) failed: %R\n", filename, rc ));
+    }
+    else
+    {
+        rc = perform_qtest( f, filename, pos, count, queue_size, block_size, chunk_size );
+        if ( rc == 0 && pos2 > 0 )
+        {
+            rc = perform_qtest( f, filename, pos2, count, queue_size, block_size, chunk_size );
+        }
+        KFileRelease( f );
+    }
+    return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args * args;
+
+    rc_t rc = ArgsMakeAndHandle ( &args, argc, argv, 1,
+                QfileTestOptions, sizeof ( QfileTestOptions ) / sizeof ( OptDef ) );
+    if ( rc != 0 )
+    {
+        OUTMSG(( "ArgsMakeAndHandle( ... ) failed: %R\n", rc ));
+    }
+    else
+    {
+        uint32_t arg_count = 0;
+        rc = ArgsParamCount ( args, &arg_count );
+        if ( rc != 0 )
+        {
+            OUTMSG(( "ArgsParamCount( ... ) failed: %R\n", rc ));
+        }
+        else
+        {
+            KDirectory *dir = NULL;
+            uint64_t position = get_uint64_option( args, OPTION_POS, 0 );
+            uint64_t count = get_uint64_option( args, OPTION_COUNT, 0 );
+            uint32_t qsize = get_uint32_option( args, OPTION_QSIZE, 1024 );
+            uint32_t bsize = get_uint32_option( args, OPTION_BSIZE, 0 );
+            uint32_t csize = get_uint32_option( args, OPTION_CSIZE, 1024 );
+            uint64_t pos2 = get_uint64_option( args, OPTION_POS2, 0 );
+
+            OUTMSG(( "start-position : %lu\n", position ));
+            if ( pos2 > 0 )
+            {
+                OUTMSG(( "2nd position   : %lu\n", pos2 ));
+            }
+            if ( count > 0 )
+            {
+                OUTMSG(( "count          : %lu\n", count ));
+            }
+            OUTMSG(( "queue-size     : %u\n",  qsize ));
+            OUTMSG(( "block-size     : %u\n",  bsize ));
+            OUTMSG(( "chunk-size     : %u\n",  csize ));
+
+            rc = KDirectoryNativeDir( &dir );
+            if ( rc != 0 )
+            {
+                OUTMSG(( "KDirectoryNativeDir( ... ) failed: %R\n", rc ));
+            }
+            else
+            {
+                uint32_t i;
+                for ( i = 0; i < arg_count && rc == 0; ++i )
+                {
+                    const char * filename;
+                    rc = ArgsParamValue ( args, i, (const void **)&filename );
+                    if ( rc != 0 )
+                    {
+                        OUTMSG(( "ArgsParamValue( %d ) failed: %R\n", i, rc ));
+                    }
+                    else
+                    {
+                        OUTMSG(( "file to read   : '%s'\n", filename ));
+                        rc = perform_test( dir, filename, position, pos2,
+                                           count, qsize, bsize, csize );
+                    }
+                }
+                KDirectoryRelease( dir );
+            }
+        }
+        ArgsWhack ( args );
+    }
+
+    return rc;
+}
diff --git a/test/kapp/queuefile.data b/test/kapp/queuefile.data
new file mode 100644
index 0000000..25c5a0e
--- /dev/null
+++ b/test/kapp/queuefile.data
@@ -0,0 +1,338 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <kapp/queue-file.h>
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/checksum.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+
+#define OPTION_POS    "pos"
+#define ALIAS_POS     "p"
+
+#define OPTION_QSIZE  "qsize"
+#define ALIAS_QSIZE   "q"
+
+#define OPTION_BSIZE  "bsize"
+#define ALIAS_BSIZE   "b"
+
+#define OPTION_CSIZE  "csize"
+#define ALIAS_CSIZE   "c"
+
+#define OPTION_COUNT  "count"
+#define ALIAS_COUNT   "n"
+
+#define OPTION_POS2   "pos2"
+#define ALIAS_POS2    "2"
+
+static const char * pos_usage[]     = { "where to start reading", NULL };
+static const char * qsize_usage[]     = { "size of queue", NULL };
+static const char * bsize_usage[]     = { "block-size of queue", NULL };
+static const char * csize_usage[]     = { "chunk-size in loop", NULL };
+static const char * count_usage[]     = { "how much bytes total", NULL };
+static const char * pos2_usage[]     = { "2nd position to read at", NULL };
+
+OptDef QfileTestOptions[] =
+{
+/*    name             alias        fkt.  usage-txt,  cnt, needs value, required */
+    { OPTION_POS,      ALIAS_POS,   NULL, pos_usage,    1,   true,        false },
+    { OPTION_QSIZE,    ALIAS_QSIZE, NULL, qsize_usage,  1,   true,        false },
+    { OPTION_BSIZE,    ALIAS_BSIZE, NULL, bsize_usage,  1,   true,        false },
+    { OPTION_CSIZE,    ALIAS_CSIZE, NULL, csize_usage,  1,   true,        false },
+    { OPTION_COUNT,    ALIAS_COUNT, NULL, count_usage,  1,   true,        false },
+    { OPTION_POS2,     ALIAS_POS2,  NULL, pos2_usage,   1,   true,        false }
+};
+
+const char UsageDefaultName[] = "qfiletest";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+    return KOutMsg ("\n"
+                    "Usage:\n"
+                    "  %s [options]\n"
+                    "\n", progname);
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if ( args == NULL )
+        rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+    else
+        rc = ArgsProgram ( args, &fullpath, &progname );
+
+    if ( rc )
+        progname = fullpath = UsageDefaultName;
+
+    UsageSummary ( progname );
+
+    KOutMsg ( "Options:\n" );
+
+    HelpOptionLine ( ALIAS_POS,   OPTION_POS,   "pos",   pos_usage );
+    HelpOptionLine ( ALIAS_QSIZE, OPTION_QSIZE, "qsize", qsize_usage );
+    HelpOptionLine ( ALIAS_BSIZE, OPTION_BSIZE, "bsize", bsize_usage );
+    HelpOptionLine ( ALIAS_CSIZE, OPTION_CSIZE, "csize", csize_usage );
+    HelpOptionLine ( ALIAS_COUNT, OPTION_COUNT, "count", count_usage );
+    HelpOptionLine ( ALIAS_POS2,  OPTION_POS2,  "pos2",  pos2_usage );
+
+    HelpOptionsStandard ();
+    HelpVersion ( fullpath, KAppVersion() );
+    return rc;
+}
+
+
+/* Version  EXTERN
+ *  return 4-part version code: 0xMMmmrrrr, where
+ *      MM = major release
+ *      mm = minor release
+ *    rrrr = bug-fix release
+ */
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+
+
+static uint64_t get_uint64_option( const Args *my_args,
+                                   const char *name,
+                                   const uint64_t def )
+{
+    uint32_t count;
+    uint64_t res = def;
+    rc_t rc = ArgsOptionCount( my_args, name, &count );
+    if ( ( rc == 0 )&&( count > 0 ) )
+    {
+        const char *s;
+        rc = ArgsOptionValue( my_args, name, 0,  (const void **)&s );
+        if ( rc == 0 ) res = strtoull( s, NULL, 10 );
+    }
+    return res;
+}
+
+static uint32_t get_uint32_option( const Args *my_args,
+                                   const char *name,
+                                   const uint32_t def )
+{
+    uint32_t count, res = def;
+    rc_t rc = ArgsOptionCount( my_args, name, &count );
+    if ( ( rc == 0 )&&( count > 0 ) )
+    {
+        const char *s;
+        rc = ArgsOptionValue( my_args, name, 0,  (const void **)&s );
+        if ( rc == 0 ) res = strtoul( s, NULL, 10 );
+    }
+    return res;
+}
+
+
+static rc_t read_loop( const KFile * f, const uint64_t a_pos, const uint64_t count,
+                       const size_t chunk_size, uint8_t digest [ 16 ] )
+{
+    rc_t rc = 0;
+    uint64_t pos = a_pos;
+    uint64_t n_bytes = 0;
+    size_t num_read = 1;
+    MD5State md5;
+
+    char * buffer = malloc( chunk_size );
+    if ( buffer == NULL )
+        return RC( rcExe, rcFile, rcPacking, rcMemory, rcExhausted );
+
+    MD5StateInit ( &md5 );
+    while ( rc == 0 && num_read > 0 )
+    {
+        size_t chunk = chunk_size;
+        
+        if ( ( count > 0 ) && ( ( n_bytes + chunk ) > count ) )
+        {
+            chunk = ( count - n_bytes );
+        }
+
+        OUTMSG(( "about to read from pos %lu\n", pos ));
+        rc = KFileRead ( f, pos, buffer, chunk, &num_read );
+        OUTMSG(( "returned from KFileRead rc = %R, num_read = %zu\n\n", rc, num_read ));
+        if ( rc == 0 && num_read > 0 )
+        {
+            MD5StateAppend ( &md5, buffer, num_read );
+            pos += num_read;
+            n_bytes += num_read;
+            if ( ( count > 0 ) && ( n_bytes >= count ) )
+            {
+                num_read = 0;
+            }
+        }
+    }
+    OUTMSG(( "%lu bytes read total\n", n_bytes ));
+    free( buffer );
+    MD5StateFinish ( &md5, digest );
+
+    return rc;
+}
+
+
+static void print_digest( uint8_t digest [ 16 ] )
+{
+    uint8_t i;
+
+    OUTMSG(( "md5-sum: " ));
+    for ( i = 0; i < 16; ++i )
+        OUTMSG(( "%.02x", digest[ i ] ));
+    OUTMSG(( "\n" ));
+}
+
+
+static rc_t perform_qtest( const KFile *f, const char * filename,
+                           const uint64_t pos, const uint64_t count,
+                           const size_t queue_size, const size_t block_size,
+                           const size_t chunk_size )
+{
+    const KFile * qf;
+    rc_t rc = KQueueFileMakeRead ( &qf, pos, f, queue_size, block_size );
+    if ( rc != 0 )
+    {
+        OUTMSG(( "KQueueFileMakeRead( '%s' ) failed: %R\n", filename, rc ));
+    }
+    else
+    {
+        uint8_t digest [ 16 ];
+        rc = read_loop( qf, pos, count, chunk_size, digest );
+        KFileRelease( qf );
+        print_digest( digest );
+    }
+    return rc;
+}
+
+
+static rc_t perform_test( const KDirectory *dir, const char * filename,
+                          const uint64_t pos, const uint64_t pos2,
+                          const uint64_t count, const size_t queue_size,
+                          const size_t block_size, const size_t chunk_size )
+{
+    const KFile * f;
+    rc_t rc = KDirectoryOpenFileRead ( dir, &f, filename );
+    if ( rc != 0 )
+    {
+        OUTMSG(( "KDirectoryOpenFileRead( '%s' ) failed: %R\n", filename, rc ));
+    }
+    else
+    {
+        rc = perform_qtest( f, filename, pos, count, queue_size, block_size, chunk_size );
+        if ( rc == 0 && pos2 > 0 )
+        {
+            rc = perform_qtest( f, filename, pos2, count, queue_size, block_size, chunk_size );
+        }
+        KFileRelease( f );
+    }
+    return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args * args;
+
+    rc_t rc = ArgsMakeAndHandle ( &args, argc, argv, 1,
+                QfileTestOptions, sizeof ( QfileTestOptions ) / sizeof ( OptDef ) );
+    if ( rc != 0 )
+    {
+        OUTMSG(( "ArgsMakeAndHandle( ... ) failed: %R\n", rc ));
+    }
+    else
+    {
+        uint32_t arg_count = 0;
+        rc = ArgsParamCount ( args, &arg_count );
+        if ( rc != 0 )
+        {
+            OUTMSG(( "ArgsParamCount( ... ) failed: %R\n", rc ));
+        }
+        else
+        {
+            KDirectory *dir = NULL;
+            uint64_t position = get_uint64_option( args, OPTION_POS, 0 );
+            uint64_t count = get_uint64_option( args, OPTION_COUNT, 0 );
+            uint32_t qsize = get_uint32_option( args, OPTION_QSIZE, 1024 );
+            uint32_t bsize = get_uint32_option( args, OPTION_BSIZE, 0 );
+            uint32_t csize = get_uint32_option( args, OPTION_CSIZE, 1024 );
+            uint64_t pos2 = get_uint64_option( args, OPTION_POS2, 0 );
+
+            OUTMSG(( "start-position : %lu\n", position ));
+            if ( pos2 > 0 )
+            {
+                OUTMSG(( "2nd position   : %lu\n", pos2 ));
+            }
+            if ( count > 0 )
+            {
+                OUTMSG(( "count          : %lu\n", count ));
+            }
+            OUTMSG(( "queue-size     : %u\n",  qsize ));
+            OUTMSG(( "block-size     : %u\n",  bsize ));
+            OUTMSG(( "chunk-size     : %u\n",  csize ));
+
+            rc = KDirectoryNativeDir( &dir );
+            if ( rc != 0 )
+            {
+                OUTMSG(( "KDirectoryNativeDir( ... ) failed: %R\n", rc ));
+            }
+            else
+            {
+                uint32_t i;
+                for ( i = 0; i < arg_count && rc == 0; ++i )
+                {
+                    const char * filename;
+                    rc = ArgsParamValue ( args, i, (const void **)&filename );
+                    if ( rc != 0 )
+                    {
+                        OUTMSG(( "ArgsParamValue( %d ) failed: %R\n", i, rc ));
+                    }
+                    else
+                    {
+                        OUTMSG(( "file to read   : '%s'\n", filename ));
+                        rc = perform_test( dir, filename, position, pos2,
+                                           count, qsize, bsize, csize );
+                    }
+                }
+                KDirectoryRelease( dir );
+            }
+        }
+        ArgsWhack ( args );
+    }
+
+    return rc;
+}
diff --git a/test/kapp/report-kns-agent.c b/test/kapp/report-kns-agent.c
new file mode 100644
index 0000000..49eec09
--- /dev/null
+++ b/test/kapp/report-kns-agent.c
@@ -0,0 +1,58 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kns/manager.h>
+
+#include <stdio.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x01020003;
+}
+
+rc_t CC UsageSummary ( const char *progname )
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args *args )
+{
+    return 0;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t rc;
+    const char * user_agent;
+
+    rc = KNSManagerGetUserAgent ( &user_agent );
+    if ( rc == 0 )
+        printf("%s\n", user_agent);
+
+    return rc;
+}
diff --git a/test/kapp/run-kns-agent.sh b/test/kapp/run-kns-agent.sh
new file mode 100755
index 0000000..4b45619
--- /dev/null
+++ b/test/kapp/run-kns-agent.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+TOOL_PATH="$1"
+CREATE_PATH="$2" # a link will be created at that path and the tool will be executed via link
+EXPECTED_TOOL_NAME="$3"
+RUN_PATH="$4" # the tool will be executed via this path. when path is empty, CREATE_PATH is used instead
+
+if [ "$RUN_PATH" = "" ]; then
+	RUN_PATH=$CREATE_PATH
+fi
+
+CREATE_DIR=$(dirname "$CREATE_PATH")
+
+mkdir -p "$CREATE_DIR"
+if [ "$?" != "0" ] ; then
+    echo "cannot create $CREATE_DIR"
+    exit 1
+fi
+
+CMD="ln -fs $TOOL_PATH $CREATE_PATH"
+eval $CMD
+if [ "$?" != "0" ] ; then
+    echo "link creation failed"
+    exit 2
+fi
+
+USER_AGENT=$("$RUN_PATH")
+if [ "$?" != "0" ] ; then
+    echo "tool execution failed"
+    exit 3
+fi
+ACTUAL_TOOL_NAME=$(eval "echo $USER_AGENT | awk '{print \$3}'")
+
+if [ "$EXPECTED_TOOL_NAME" != "$ACTUAL_TOOL_NAME" ] ; then
+    echo "Agent tool name '$ACTUAL_TOOL_NAME' does not match expected '$EXPECTED_TOOL_NAME'"
+    exit 4
+fi
diff --git a/test/kapp/run-sig-core.sh b/test/kapp/run-sig-core.sh
new file mode 100755
index 0000000..2634a45
--- /dev/null
+++ b/test/kapp/run-sig-core.sh
@@ -0,0 +1,116 @@
+#!/bin/bash
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+BINARY_PATH="$1"
+HOST_OS="$2"
+BUILD_TYPE="$3"
+
+SIGQUIT=3
+
+function killFromBackground ()
+{
+    PARENT_PID=$1
+    for I in 1 2 3 4 5
+    do
+        COMMAND="ps -ef|awk '\$3==${PARENT_PID} && \$8==\"${BINARY_PATH}\"  {print \$2}'"
+        eval PID=\`${COMMAND}\`
+        if [ "$PID" = "" ]; then
+            sleep 1
+        else
+            break
+        fi
+    done
+
+    if [ "$PID" != "" ]; then
+        kill -s $SIGQUIT $PID
+    fi
+
+    echo $PID > killed.pid
+}
+
+# Check the environment if core files can be generated
+if [ "$HOST_OS" = "mac" ]; then
+   if [ "`ulimit -c`" = "0" ] || [ "`/usr/sbin/sysctl -n kern.coredump`" != "1" ]; then
+       echo "Core files are disabled. Skipping core file tests"
+       exit 0
+   fi
+
+   if [ ! -d "/core" ]; then
+        echo "/core folder is missing - core files are disabled. Skipping core files tests"
+        exit 0
+   fi
+
+   CORE_FOLDER="/core/"
+elif [ "$HOST_OS" = "linux" ]; then
+   if [ "`ulimit -c`" = "0" ]; then
+       echo "Core files are disabled. Skipping core file tests"
+       exit 0
+   fi
+
+   if [ "`cat /proc/sys/kernel/core_pattern`" != "core" ]; then
+       echo "Unknown core file pattern" 1>&2
+       exit 2
+   fi
+   CORE_FOLDER="./"
+else
+   echo "Should be run from unix-compatible OS" 1>&2
+   exit 1
+fi
+
+# Bash overrides signals in child process if strarting
+# them in background. Lets start it normally and run
+# `kill` command in background.
+killFromBackground $$ &
+$BINARY_PATH 
+
+# Wait for `kill` job
+wait
+
+# Extract PID of binary that we killed
+BINARY_PID=`cat killed.pid`
+rm killed.pid
+
+CORE_FILE="${CORE_FOLDER}core.${BINARY_PID}"
+
+if [ "$BUILD_TYPE" = "dbg" ]; then
+   if [ -f $CORE_FILE ]; then
+       rm $CORE_FILE
+       echo "Success: Core file was generated and was removed"
+       exit 0
+   else
+       echo "Failed: No core file detected" 1>&2
+       exit 3
+   fi
+else
+   if [ -f $CORE_FILE ]; then
+       rm $CORE_FILE 
+       echo "Failed: Core file generated while shouldn't and was removed" 1>&2
+       exit 4
+    else
+       echo "Success: No core file detected"
+       exit 0
+    fi 
+fi
+
diff --git a/test/kapp/sig-core.c b/test/kapp/sig-core.c
new file mode 100644
index 0000000..c1de00c
--- /dev/null
+++ b/test/kapp/sig-core.c
@@ -0,0 +1,101 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <assert.h>
+#include <stdio.h>
+#include <unistd.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "sig-core";
+
+rc_t CC UsageSummary ( const char *progname )
+{
+    return KOutMsg ( "\n"
+                     "Usage:\n"
+                     "  %s [Options]\n"
+                     "\n"
+                     "Summary:\n"
+                     "  Test core generation by killing it with signal.\n"
+		     "  The tool enter into infinite loop after start .\n"
+                     , progname
+        );
+}
+
+rc_t CC Usage ( const Args *args )
+{
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if (args == NULL)
+        rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+    else
+        rc = ArgsProgram (args, &fullpath, &progname);
+    if (rc)
+        progname = fullpath = UsageDefaultName;
+
+    UsageSummary (progname);
+
+    KOutMsg ("Options:\n");
+
+    HelpOptionsStandard ();
+    HelpVersion ( fullpath, KAppVersion () );
+
+    return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args *args;
+    rc_t rc;
+    do {
+        rc = ArgsMakeAndHandle ( & args, argc, argv, 0 );
+        if ( rc != 0 )
+        {
+            LogErr ( klogErr, rc, "failed to parse arguments" );
+            break;
+        }
+        
+        while ( true ) {
+            sleep ( 1000 );
+        }
+    } while (false);
+
+    ArgsWhack ( args );
+
+    return rc;
+}
diff --git a/test/kdb/Makefile b/test/kdb/Makefile
new file mode 100644
index 0000000..c4ebcd4
--- /dev/null
+++ b/test/kdb/Makefile
@@ -0,0 +1,124 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+#TODO: revive test-btree
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+MODULE = test/kdb
+
+TEST_TOOLS = \
+    test-kdb \
+    test-wkdb \
+    test-rowset
+
+include $(TOP)/build/Makefile.env
+
+# make sure runs are not cached in the user repository when running tests
+ifeq ($(wildcard ../../../asm-trace),)
+	ifeq (,$(VDB_CONFIG))
+		VDB_CONFIG = $(shell pwd)/../only-remote-repository.kfg
+	endif
+endif
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(ALL_LIBS) $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# test btree
+#
+TEST_BTREE_SRC = \
+	test-btree
+
+TEST_BTREE_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_BTREE_SRC))
+
+TEST_BTREE_LIB = \
+	-skapp \
+	-sncbi-vdb
+
+$(BINDIR)/test-btree: $(TEST_BTREE_OBJ)
+	$(LD) --exe -o $@ $^ $(TEST_BTREE_LIB)
+	
+#-------------------------------------------------------------------------------
+# test rowset
+#
+TEST_ROWSET_SRC = \
+	rowsettest
+
+TEST_ROWSET_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_ROWSET_SRC))
+
+TEST_ROWSET_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-wvdb
+
+$(TEST_BINDIR)/test-rowset: $(TEST_ROWSET_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_ROWSET_LIB)
+	
+vg_rowset: std
+	$(VALGRIND) $(TEST_BINDIR)/test-rowset
+
+#-------------------------------------------------------------------------------
+# test-kdb
+#
+TEST_KDB_SRC = \
+	kdbtest 
+
+TEST_KDB_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_KDB_SRC))
+
+TEST_KDB_LIB = \
+    -skapp \
+    -sktst \
+	-sncbi-vdb
+
+$(TEST_BINDIR)/test-kdb: $(TEST_KDB_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_KDB_LIB)
+
+#-------------------------------------------------------------------------------
+# test-wkdb
+#
+TEST_WKDB_SRC = \
+	wkdbtest 
+
+TEST_WKDB_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_WKDB_SRC))
+
+TEST_WKDB_LIB = \
+    -skapp \
+    -sktst \
+	-sncbi-wvdb
+
+$(TEST_BINDIR)/test-wkdb: $(TEST_WKDB_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_WKDB_LIB)
+
+wkdb: test-wkdb
+	$(TEST_BINDIR)/test-wkdb
diff --git a/test/kdb/kdbtest.cpp b/test/kdb/kdbtest.cpp
new file mode 100644
index 0000000..3ba1646
--- /dev/null
+++ b/test/kdb/kdbtest.cpp
@@ -0,0 +1,183 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for Kdb interface
+*/
+
+#include <kapp/args.h>
+
+#include <ktst/unit_test.hpp>
+
+#include <sysalloc.h>
+
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/index.h>
+#include <kdb/table.h>
+
+#include <vfs/manager.h>
+
+using namespace std;
+
+static rc_t argsHandler(int argc, char* argv[]);
+TEST_SUITE_WITH_ARGS_HANDLER(KdbTestSuite, argsHandler);
+
+#define KDB_MANAGER_MAKE(mgr, wd) KDBManagerMakeRead((const KDBManager **)mgr, (struct KDirectory const *)wd)
+#include "remote_open_test.cpp"
+
+TEST_CASE(KDBManagerVPathType)
+{
+    string path;
+    { // convert accession "SRR000123" into a file system path
+        VFSManager* vfsmgr;
+        REQUIRE_RC(VFSManagerMake(&vfsmgr));
+        {
+            VPath * vpath;
+            const struct KFile *dummy1;
+            const struct VPath *dummy2;
+            REQUIRE_RC(VFSManagerResolveSpec ( vfsmgr, "SRR000123", &vpath, &dummy1, &dummy2, true));
+            
+            path = ToString(vpath);
+            
+            REQUIRE_RC(KFileRelease(dummy1));
+            REQUIRE_RC(VPathRelease(dummy2));
+            REQUIRE_RC(VPathRelease(vpath));
+        }
+        REQUIRE_RC(VFSManagerRelease(vfsmgr));
+    }
+
+
+    const KDBManager* mgr;
+    REQUIRE_RC(KDBManagerMakeRead(&mgr, NULL));
+
+//cout << path << endl;
+    REQUIRE_EQ((int)kptTable, KDBManagerPathType(mgr, path.c_str()));
+    
+    REQUIRE_RC(KDBManagerRelease(mgr));
+    
+}
+
+// KColumnBlob
+// see same tests on the write side, wkdbtest.cpp
+
+class ColumnBlobReadFixture
+{
+public:
+    ColumnBlobReadFixture()
+    :   m_num_read ( 0 ),
+        m_remaining ( 0 )
+    {
+        const KDBManager* mgr;
+        THROW_ON_RC ( KDBManagerMakeRead ( & mgr, NULL ) );
+        
+        const KTable* tbl;
+        THROW_ON_RC ( KDBManagerOpenTableRead ( mgr, & tbl, "SRR000123" ) );
+        
+        const KColumn* col;
+        THROW_ON_RC ( KTableOpenColumnRead ( tbl, & col, "X" ) );
+        
+        THROW_ON_RC ( KColumnOpenBlobRead ( col, & m_blob, 1 ) );
+        
+        THROW_ON_RC ( KColumnRelease ( col ) );
+        THROW_ON_RC ( KTableRelease ( tbl ) );
+        THROW_ON_RC ( KDBManagerRelease ( mgr ) );
+    }
+    ~ColumnBlobReadFixture()
+    {
+        KColumnBlobRelease ( m_blob );
+    }
+
+    const KColumnBlob*  m_blob;
+    size_t m_num_read;
+    size_t m_remaining;
+};
+
+FIXTURE_TEST_CASE ( ColumnBlobRead_basic, ColumnBlobReadFixture )
+{   
+    const size_t BlobSize = 1882; 
+    const size_t BufSize = 2024; 
+    char buffer [ BufSize ];
+    REQUIRE_RC ( KColumnBlobRead ( m_blob, 0, buffer, BufSize, & m_num_read, & m_remaining ) );
+    REQUIRE_EQ ( BlobSize, m_num_read );
+    REQUIRE_EQ ( (size_t)0, m_remaining );
+}
+
+FIXTURE_TEST_CASE ( ColumnBlobRead_insufficient_buffer, ColumnBlobReadFixture )
+{   
+    const size_t BlobSize = 1882; 
+    const size_t BufSize = 1024; 
+    char buffer [ BufSize ];
+    // first read incomplete
+    REQUIRE_RC ( KColumnBlobRead ( m_blob, 0, buffer, BufSize, & m_num_read, & m_remaining ) );
+    REQUIRE_EQ ( BufSize, m_num_read );
+    REQUIRE_EQ ( BlobSize - BufSize, m_remaining );
+    // the rest comes in on the second read
+    REQUIRE_RC ( KColumnBlobRead ( m_blob, BufSize, buffer, BufSize, & m_num_read, & m_remaining ) );
+    REQUIRE_EQ ( BlobSize - BufSize, m_num_read );
+    REQUIRE_EQ ( (size_t)0, m_remaining );
+}
+
+//////////////////////////////////////////// Main
+static rc_t argsHandler(int argc, char* argv[]) {
+    Args* args = NULL;
+    rc_t rc = ArgsMakeAndHandle(&args, argc, argv, 0, NULL, 0);
+    ArgsWhack(args);
+    return rc;
+}
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+#include <klib/debug.h> // KDbgSetString
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-kdb";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    //assert(!KDbgSetString("KFG"));
+    //assert(!KDbgSetString("VFS"));
+    KConfigDisableUserSettings();
+    rc_t rc=KdbTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kdb/remote_open_test.cpp b/test/kdb/remote_open_test.cpp
new file mode 100644
index 0000000..31f8043
--- /dev/null
+++ b/test/kdb/remote_open_test.cpp
@@ -0,0 +1,304 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* This file is to be #included to read and write side test suites
+* KDB_MANAGER_MAKE has to be #defined depending on the side
+*/
+
+#include <cstdlib>
+#include <fstream>
+#include <stdexcept>
+
+#include <kdb/kdb-priv.h>
+
+#include <kfs/file.h>
+#include <vfs/manager.h>
+#include <vfs/manager-priv.h> /* VFSManagerMakeFromKfg */
+#include <vfs/path.h>
+#include <vfs/resolver.h>
+#include <klib/text.h>
+#include <kfg/config.h>
+
+using namespace std;
+
+static string ToString(const VPath* path)
+{
+    const String * s;
+    if ( VPathMakeString (path, &s) != 0 )
+        throw logic_error ( "ToString(VPath) failed" );
+    string ret = string(s->addr, s->size);
+    free((void*)s);
+    return ret;
+}
+
+TEST_CASE(KDBManagerVPathOpenDB_Local)
+{
+    VPath * path;
+    
+    {
+        VFSManager* vfsmgr;
+        REQUIRE_RC(VFSManagerMake(&vfsmgr));
+        REQUIRE_RC(VFSManagerMakePath(vfsmgr, &path, "./testdb"));
+        REQUIRE_RC(VFSManagerRelease(vfsmgr));
+    }
+
+    {
+        KDBManager* mgr;
+        REQUIRE_RC(KDB_MANAGER_MAKE(&mgr, NULL));
+        const KDatabase * db;
+        REQUIRE_RC(KDBManagerVPathOpenLocalDBRead ( mgr, &db, path ));
+        REQUIRE_NOT_NULL(db);
+        const KTable *tbl;
+        REQUIRE_RC(KDatabaseOpenTableRead(db, &tbl, "SEQUENCE"));
+        REQUIRE_RC(KTableRelease(tbl));
+        REQUIRE_RC(KDatabaseRelease(db));
+        REQUIRE_RC(KDBManagerRelease(mgr));
+    }
+    
+    REQUIRE_RC(VPathRelease(path));
+}
+
+TEST_CASE(KDBManagerVPathOpenDB_Local_Table)
+{
+    VPath * path;
+    
+    {
+        VFSManager* vfsmgr;
+        REQUIRE_RC(VFSManagerMake(&vfsmgr));
+        REQUIRE_RC(VFSManagerMakePath(vfsmgr, &path, "SRR000123"));
+        REQUIRE_RC(VFSManagerRelease(vfsmgr));
+    }
+
+    {
+        KDBManager* mgr;
+        REQUIRE_RC(KDB_MANAGER_MAKE(&mgr, NULL));
+        const KDatabase * db;
+        REQUIRE_RC_FAIL(KDBManagerVPathOpenLocalDBRead ( mgr, &db, path )); // not a database
+        REQUIRE_RC(KDBManagerRelease(mgr));
+    }
+    
+    REQUIRE_RC(VPathRelease(path));
+}
+
+TEST_CASE(KDBManagerVPathOpenDB_Local_BadPath)
+{
+    VPath * path;
+    
+    {
+        VFSManager* vfsmgr;
+        REQUIRE_RC(VFSManagerMake(&vfsmgr));
+        REQUIRE_RC(VFSManagerMakePath(vfsmgr, &path, "xxxxx"));
+        REQUIRE_RC(VFSManagerRelease(vfsmgr));
+    }
+
+    {
+        KDBManager* mgr;
+        REQUIRE_RC(KDB_MANAGER_MAKE(&mgr, NULL));
+        const KDatabase * db;
+        REQUIRE_RC_FAIL(KDBManagerVPathOpenLocalDBRead ( mgr, &db, path )); // not a database
+        REQUIRE_RC(KDBManagerRelease(mgr));
+    }
+    
+    REQUIRE_RC(VPathRelease(path));
+}
+
+class RemoteDBFixture
+{
+public:
+    RemoteDBFixture()
+    : m_vfsmgr(0), m_path(0), m_cache(0)
+    {
+    }
+    
+    ~RemoteDBFixture()
+    {
+        if (m_vfsmgr && VFSManagerRelease(m_vfsmgr) != 0)
+            throw logic_error ( "~RemoteDBFixture: VFSManagerRelease failed" );
+            
+        if (m_path && VPathRelease(m_path) != 0)
+            throw logic_error ( "~RemoteDBFixture: VPathRelease(m_path) failed" );
+            
+        if (m_cache && VPathRelease(m_cache) != 0)
+            throw logic_error ( "~RemoteDBFixture: VPathRelease(m_path) failed" );
+            
+        remove("./root/sra");
+        remove("./root");
+        remove(m_configName.c_str());
+        remove(m_cachedFile.c_str());
+    }
+    
+    void Configure(const string& name)
+    {
+        m_configName = name+".kfg";
+        std::ofstream f(m_configName.c_str()); 
+        f   << "repository/remote/main/CGI/resolver-cgi = \"https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi\"\n"
+            << "repository/user/main/public/root=\"./root\"\n" 
+            << "repository/user/main/public/apps/sra/volumes/sraFlat=\"sra\"\n"; 
+        f.close();
+            
+        KDirectory *wd;
+        if (KDirectoryNativeDir(&wd))
+            throw logic_error ( "RemoteDBFixture::Configure: KDirectoryNativeDir failed" );
+        
+        KConfig *cfg;
+        if (KConfigMake(&cfg, wd))
+            throw logic_error ( "RemoteDBFixture::Configure: KConfigMake failed" );
+
+        if (VFSManagerMakeFromKfg(&m_vfsmgr, cfg))
+            throw logic_error ( "RemoteDBFixture::Configure: VFSManagerMakeFromKfg failed" );
+        
+        if (KConfigRelease(cfg))
+            throw logic_error ( "RemoteDBFixture::Configure: KConfigRelease failed" );
+            
+        if (KDirectoryRelease(wd))
+            throw logic_error ( "RemoteDBFixture::Configure: KDirectoryRelease failed" );
+    }
+    
+    void Resolve(const string& p_accession)
+    {
+        struct VResolver * resolver;
+        if(VFSManagerGetResolver(m_vfsmgr, & resolver))
+            throw logic_error ( "RemoteDBFixture::Resolve: VFSManagerGetResolver failed" );
+
+        VPath * accession;
+        if (VFSManagerMakePath ( m_vfsmgr, &accession, p_accession.c_str() ))
+            throw logic_error ( "RemoteDBFixture::Resolve: VFSManagerMakePath failed" );
+        
+        if (VResolverQuery( resolver, 0, accession, NULL, &m_path, &m_cache))
+            throw logic_error ( "RemoteDBFixture::Resolve: VResolverQuery failed" );
+        
+        //cout << ToString(m_path) << endl; 
+        //cout << ToString(m_cache) << endl; 
+        m_cachedFile = ToString(m_cache);
+        /* make sure cached file does not exist */
+        remove(m_cachedFile.c_str());
+       
+        if (VPathRelease(accession))
+            throw logic_error ( "RemoteDBFixture::Resolve: VPathRelease failed" );
+        if (VResolverRelease(resolver))
+            throw logic_error ( "RemoteDBFixture::Resolve: VResolverRelease failed" );
+    }
+
+    
+protected:
+    string m_configName;
+    
+    VFSManager * m_vfsmgr;
+    const VPath * m_path;
+    const VPath * m_cache;
+    string m_cachedFile;
+};
+
+FIXTURE_TEST_CASE(KDBManagerVPathOpenDB_Remote, RemoteDBFixture)
+{
+    Configure(GetName());
+    Resolve("SRR600096");
+    
+    KDBManager* mgr;
+    REQUIRE_RC(KDB_MANAGER_MAKE(&mgr, NULL));
+    const KDatabase * db;
+    REQUIRE_RC(KDBManagerVPathOpenRemoteDBRead ( mgr, &db, m_path, m_cache ));
+    REQUIRE_NOT_NULL(db);
+    
+    /* read something */
+    const KTable *tbl;
+    REQUIRE_RC(KDatabaseOpenTableRead(db, &tbl, "SEQUENCE"));
+    REQUIRE_RC(KTableRelease(tbl));
+
+    REQUIRE_RC(KDatabaseRelease(db));
+    REQUIRE_RC(KDBManagerRelease(mgr));
+}
+
+FIXTURE_TEST_CASE(KDBManagerVPathOpenDB_Remote_NoCache, RemoteDBFixture)
+{
+    Configure(GetName());
+    Resolve("SRR600096");
+    
+    KDBManager* mgr;
+    REQUIRE_RC(KDB_MANAGER_MAKE(&mgr, NULL));
+    const KDatabase * db;
+    REQUIRE_RC(KDBManagerVPathOpenRemoteDBRead ( mgr, &db, m_path, NULL ));
+    REQUIRE_NOT_NULL(db);
+    
+    /* read something */
+    const KTable *tbl;
+    REQUIRE_RC(KDatabaseOpenTableRead(db, &tbl, "SEQUENCE"));
+    REQUIRE_RC(KTableRelease(tbl));
+
+    REQUIRE_RC(KDatabaseRelease(db));
+    REQUIRE_RC(KDBManagerRelease(mgr));
+}
+
+FIXTURE_TEST_CASE(KDBManagerVPathOpenDB_Remote_Table, RemoteDBFixture)
+{
+    Configure(GetName());
+    Resolve("SRR000123");
+    
+    KDBManager* mgr;
+    REQUIRE_RC(KDB_MANAGER_MAKE(&mgr, NULL));
+    const KDatabase * db;
+    REQUIRE_RC_FAIL(KDBManagerVPathOpenRemoteDBRead ( mgr, &db, m_path, NULL )); // not a database
+    
+    REQUIRE_RC(KDBManagerRelease(mgr));
+}
+
+FIXTURE_TEST_CASE(KDBManagerVPathOpenDB_Remote_BadPath, RemoteDBFixture)
+{
+    Configure(GetName());
+    
+    KDBManager* mgr;
+    REQUIRE_RC(KDB_MANAGER_MAKE(&mgr, NULL));
+    const KDatabase * db;
+
+    REQUIRE_RC(VFSManagerMakePath(m_vfsmgr, (VPath**)&m_path, "xxxx"));
+    REQUIRE_RC_FAIL(KDBManagerVPathOpenRemoteDBRead ( mgr, &db, m_path, NULL )); 
+    
+    REQUIRE_RC(KDBManagerRelease(mgr));
+}
+
+FIXTURE_TEST_CASE(KDBManagerVPathOpenDB_Remote_BadCache, RemoteDBFixture)
+{
+    Configure(GetName());
+    Resolve("SRR600096");
+    
+    KDBManager* mgr;
+    REQUIRE_RC(KDB_MANAGER_MAKE(&mgr, NULL));
+    const KDatabase * db;
+    
+    VPath* cache;
+    REQUIRE_RC(VFSManagerMakePath(m_vfsmgr, &cache, "/dev/null")); // unlikely to be usable
+    REQUIRE_RC(KDBManagerVPathOpenRemoteDBRead ( mgr, &db, m_path, cache )); 
+    REQUIRE_RC(VPathRelease(cache));
+
+    /* read something */
+    const KTable *tbl;
+    REQUIRE_RC(KDatabaseOpenTableRead(db, &tbl, "SEQUENCE")); // works anyway, just not caching
+    REQUIRE_RC(KTableRelease(tbl));
+    
+    REQUIRE_RC(KDatabaseRelease(db));
+    REQUIRE_RC(KDBManagerRelease(mgr));
+}
diff --git a/test/kdb/root/sra/SRR000123.sra.cache b/test/kdb/root/sra/SRR000123.sra.cache
new file mode 100644
index 0000000..3073c39
Binary files /dev/null and b/test/kdb/root/sra/SRR000123.sra.cache differ
diff --git a/test/kdb/rowsettest.cpp b/test/kdb/rowsettest.cpp
new file mode 100644
index 0000000..788686f
--- /dev/null
+++ b/test/kdb/rowsettest.cpp
@@ -0,0 +1,819 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+// allow g++ to find INT64_MAX in stdint.h
+#define __STDC_LIMIT_MACROS
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/xc.h>
+#include <kfs/directory.h>
+#include <kdb/manager.h>
+#include <kdb/table.h>
+#include <kdb/rowset.h>
+
+#include <stdlib.h>
+#include <time.h>
+
+#include <vector>
+#include <set>
+#include <algorithm>
+#include <string>
+
+#define ENTRY \
+    HYBRID_FUNC_ENTRY ( rcDB, rcVector, rcValidating ); \
+    m_ctx = ctx
+
+#define EXIT \
+    REQUIRE ( ! FAILED () ); \
+    Release()
+
+////// additional REQUIRE macros
+
+#define REQUIRE_FAILED() ( REQUIRE ( FAILED () ), CLEAR() )
+
+#define REQUIRE_EXPR(expr) \
+        (expr); \
+        REQUIRE ( !FAILED () )
+
+#define REQUIRE_EXPR_FAILED(expr) \
+        (expr); \
+        REQUIRE_FAILED()
+
+#define THROW_IF_FAILED(msg) \
+        if ( m_ctx -> rc != 0 ) \
+            throw std :: logic_error ( (msg) );
+
+TEST_SUITE(KRowSetTestSuite);
+
+void vector_inserter ( ctx_t ctx, int64_t row_id, void *data )
+{
+    std::vector<int64_t> * rows = (std::vector<int64_t> *) data;
+    rows->push_back ( row_id );
+}
+
+class RowSetFixture
+{
+public:
+    const KCtx*         m_ctx;  // points into the test case's local memory
+    KDirectory*         m_wd;
+    KDBManager*         m_mgr;
+    KTable *            m_table;
+    std::string         m_tableName;
+
+    RowSetFixture()
+    : m_ctx(NULL)
+    , m_table(NULL)
+    , m_tableName("")
+    {
+        THROW_ON_RC ( KDirectoryNativeDir ( & m_wd ) );
+        THROW_ON_RC ( KDBManagerMakeUpdate ( & m_mgr, m_wd ) );
+    }
+
+    virtual ~RowSetFixture()
+    {
+        if ( m_table != NULL && m_tableName != "" )
+            CloseRemoveTable();
+
+        KDBManagerRelease ( m_mgr );
+        KDirectoryRelease ( m_wd );
+    }
+
+    const KTable * GetTable ( const char * name )
+    {
+        if ( m_tableName . empty() )
+            m_tableName = name;
+
+        if ( m_tableName != name )
+            throw std :: invalid_argument ( "name does not match a name of already create table" );
+
+        if ( m_table == NULL )
+            CreateTable ();
+
+        return m_table;
+    }
+
+    void CloseRemoveTable ()
+    {
+        KTableRelease ( m_table );
+        m_table = NULL;
+
+        KDirectoryRemove ( m_wd, true, m_tableName . c_str () );
+        m_tableName = "";
+    }
+
+    int64_t GenerateId ( int64_t range_start, int64_t range_count )
+    {
+        if ( range_start == -1 )
+            range_start = 0;
+
+        if ( range_count == -1 || range_start + range_count < 0 )
+            range_count = INT64_MAX - range_start;
+
+        int64_t generated_id = ((int64_t)rand() << 32) | rand();
+        generated_id &= INT64_MAX; // make sure it is positive
+
+        generated_id = generated_id % range_count;
+        generated_id += range_start;
+
+        return generated_id;
+    }
+
+    /*
+     * "density" - can is a number between -1 and 8.
+     *   -1 means that most probably each row will go to a separate leaf
+     *   0 means that rows might go to same leaves, but those leaves should still not be dense (and store data in array of ranges, not in bitmap)
+     *   from 1 to 8 change density level:
+     *   - 1 means that every (up to) 8k rows go to a each leaf
+     *   - 8 means that every (up to) 65k rows (maximum rows per leaf) will go to each leaf
+     */
+    std::set<int64_t> InsertRandomRows ( KRowSet * rowset, int num_rows, int density )
+    {
+        int64_t range_start = 0;
+        int64_t range_count;
+        std::set<int64_t> inserted_rows_set;
+
+        assert ( num_rows > 0 );
+        assert ( density >= -1 );
+        assert ( density <= 8 );
+
+        if ( density == -1 )
+            range_count = -1;
+        else if ( density == 0 )
+            range_count = ((num_rows - 1) / 5 + 1) * 65536;
+        else
+        {
+            assert ( num_rows > 8 );
+            range_count = ((num_rows - 1) / (8192 * density) + 1) * 65536;
+        }
+
+        for ( int i = 0; i < num_rows; ++i )
+        {
+            int64_t row_id = GenerateId ( range_start, range_count );
+            if ( inserted_rows_set.find( row_id ) ==  inserted_rows_set.end() )
+            {
+                KRowSetAddRowId ( rowset, m_ctx, row_id );
+                THROW_IF_FAILED ( "Failed to insert a row" );
+                inserted_rows_set.insert( row_id );
+            }
+            else
+                --i;
+        }
+
+        return inserted_rows_set;
+    }
+
+    void RunChecks ( const KRowSet * rowset, std::set<int64_t> & inserted_rows_set )
+    {
+        RunChecksInt ( rowset, inserted_rows_set );
+    }
+
+    std::set<int64_t> SetIntersection ( const std::set<int64_t>& set1, const std::set<int64_t>& set2 )
+    {
+        std::set<int64_t> result;
+        std::set_intersection(
+                set1.begin(), set1.end(),
+                set2.begin(), set2.end(),
+                std::inserter(result, result.begin())
+        );
+
+        return result;
+    }
+
+    std::set<int64_t> SetUnion ( const std::set<int64_t>& set1, const std::set<int64_t>& set2 )
+    {
+        std::set<int64_t> result;
+        std::set_union(
+                set1.begin(), set1.end(),
+                set2.begin(), set2.end(),
+                std::inserter(result, result.begin())
+        );
+
+        return result;
+    }
+
+    virtual void Release()
+    {
+        if (m_ctx != 0)
+        {
+
+            m_ctx = 0; // a pointer into the caller's local memory
+        }
+    }
+private:
+    void RunChecksInt ( const KRowSet * rowset, std::set<int64_t> & inserted_rows_set )
+    {
+        std::vector<int64_t> inserted_rows;
+        std::vector<int64_t> returned_rows;
+        uint64_t num_rows;
+
+        KRowSetVisit ( rowset, m_ctx, vector_inserter, (void *)&returned_rows );
+        THROW_IF_FAILED ( "Failed to iterate over rowset" );
+
+        for (std::set<int64_t>::iterator it = inserted_rows_set.begin(); it != inserted_rows_set.end(); ++it)
+        {
+            bool has_row = KRowSetHasRowId ( rowset, m_ctx, *it );
+            THROW_IF_FAILED ( "Failed to check a row in rowset" );
+            if ( ! has_row )
+                FAIL("Row is not found in rowset");
+            inserted_rows . push_back ( *it );
+        }
+
+        num_rows = KRowSetGetNumRowIds( rowset, m_ctx );
+        THROW_IF_FAILED ( "Failed to get number of row ids in rowset" );
+/*
+        // useful in debugging
+        KOutMsg("Inserted rows: %lu, returned rows: %lu\n", inserted_rows.size(), returned_rows.size() );
+        KOutMsg("inserted:\n");
+        for ( int i = 0; i < inserted_rows.size(); ++i )
+        {
+            KOutMsg ( "%d, ", inserted_rows[i] );
+        }
+        KOutMsg("\n");
+        KOutMsg("returned:\n");
+        for ( int i = 0; i < returned_rows.size(); ++i )
+        {
+            KOutMsg ( "%d, ", returned_rows[i] );
+        }
+        KOutMsg("\n");
+*/
+
+        if ( inserted_rows.size() != returned_rows.size() )
+            FAIL("inserted_rows.size() != returned_rows.size()");
+        if ( num_rows != returned_rows.size() )
+            FAIL("num_rows != returned_rows.size()");
+        if ( inserted_rows != returned_rows )
+            FAIL("inserted_rows != returned_rows");
+    }
+
+    void CreateTable ()
+    {
+        THROW_ON_RC ( KDBManagerCreateTable ( m_mgr, & m_table, kcmInit + kcmMD5, m_tableName . c_str() ) );
+    }
+};
+
+
+FIXTURE_TEST_CASE ( KRowSetScatteredRows, RowSetFixture )
+{
+    ENTRY;
+    KRowSet * rowset;
+    std::set<int64_t> inserted_rows_set;
+    bool has_row;
+
+    REQUIRE_EXPR ( rowset = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+
+    REQUIRE_EXPR ( has_row = KRowSetHasRowId ( rowset, ctx, 1 ) );
+    REQUIRE ( ! has_row );
+
+    inserted_rows_set = InsertRandomRows ( rowset, 10000, -1 );
+    RunChecks ( rowset, inserted_rows_set );
+
+    REQUIRE_EXPR ( KRowSetRelease( rowset, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( KRowSetDenseRows, RowSetFixture )
+{
+    ENTRY;
+    KRowSet * rowset;
+    std::set<int64_t> inserted_rows_set;
+
+    REQUIRE_EXPR ( rowset = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+
+    inserted_rows_set = InsertRandomRows ( rowset, 10000, 1 );
+    RunChecks ( rowset, inserted_rows_set );
+
+    REQUIRE_EXPR ( KRowSetRelease( rowset, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( KRowSetSerialRows, RowSetFixture )
+{
+    ENTRY;
+    KRowSet * rowset;
+    std::set<int64_t> inserted_rows_set;
+
+    REQUIRE_EXPR ( rowset = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+
+    for ( int i = 0; i < 20000; ++i )
+    {
+        int64_t row_id = 50000 + i; // row ids will only go to first two leaves
+        REQUIRE_EXPR ( KRowSetAddRowId ( rowset, ctx, row_id) );
+        inserted_rows_set.insert( row_id );
+    }
+    RunChecks ( rowset, inserted_rows_set );
+
+    REQUIRE_EXPR ( KRowSetRelease( rowset, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( KRowSetRowRanges, RowSetFixture )
+{
+    ENTRY;
+    KRowSet * rowset;
+    std::set<int64_t> inserted_rows_set;
+
+    int64_t row_ids[] = { 0, 5, 1, 6, 20, 10, 55, 60, 65, 70, 75, 80, 85, 999,  2001 };
+    uint64_t counts[]  = { 1, 1, 4, 4, 10, 10, 1,  1,  1,  1,  1,  1,  1,  1000, 1000 };
+
+    REQUIRE_EXPR ( rowset = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+
+    for ( size_t i = 0; i < sizeof row_ids / sizeof row_ids[0]; ++i )
+    {
+        int64_t row_id = row_ids[i];
+        uint64_t count = counts[i];
+
+        REQUIRE_EXPR ( KRowSetAddRowIdRange ( rowset, ctx, row_id, count ) );
+        for ( uint64_t j = 0; j < count; ++j )
+            inserted_rows_set.insert( row_id + j );
+    }
+    RunChecks ( rowset, inserted_rows_set );
+
+    REQUIRE_EXPR ( KRowSetRelease( rowset, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( KRowSetRowRangesOverlapDuplicates, RowSetFixture )
+{
+    ENTRY;
+    KRowSet * rowset;
+    std::set<int64_t> inserted_rows_set;
+
+    int64_t row_ids[] = { 5, 10 };
+    uint64_t counts[]  = { 1, 5    };
+
+    int64_t overlap_row_ids[] = { 0, 5, 5, 2, 9, 9, 14 };
+    uint64_t overlap_counts[]  = { 6, 1, 2, 6, 2, 10, 2 };
+
+    REQUIRE_EXPR ( rowset = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+
+    for ( size_t i = 0; i < sizeof row_ids / sizeof row_ids[0]; ++i )
+    {
+        int64_t row_id = row_ids[i];
+        uint64_t count = counts[i];
+
+        REQUIRE_EXPR ( KRowSetAddRowIdRange ( rowset, ctx, row_id, count ) );
+        for ( uint64_t j = 0; j < count; ++j )
+            inserted_rows_set.insert( row_id + j );
+    }
+
+    for ( size_t i = 0; i < sizeof overlap_row_ids / sizeof overlap_row_ids[0]; ++i )
+    {
+        int64_t row_id = overlap_row_ids[i];
+        uint64_t count = overlap_counts[i];
+
+        REQUIRE_EXPR ( KRowSetAddRowIdRange ( rowset, ctx, row_id, count ) );
+        for ( uint64_t j = 0; j < count; ++j )
+            inserted_rows_set.insert( row_id + j );
+    }
+    RunChecks ( rowset, inserted_rows_set );
+
+    REQUIRE_EXPR ( KRowSetRelease( rowset, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( KRowSetRowRangesDenseOverlapDuplicates, RowSetFixture )
+{
+    ENTRY;
+    KRowSet * rowset;
+    std::set<int64_t> inserted_rows_set;
+
+    int64_t row_ids[] = { 0, 5, 10, 15, 20, 25, 30, 35, 40, 1000 };
+    uint64_t counts[]  = { 1, 1, 1,  1,  1,  1,  1,  1,  1,  1    };
+
+    int64_t overlap_row_ids[] = { 500 };
+    uint64_t overlap_counts[]  = { 1000 };
+
+    REQUIRE_EXPR ( rowset = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+
+    for ( size_t i = 0; i < sizeof row_ids / sizeof row_ids[0]; ++i )
+    {
+        int64_t row_id = row_ids[i];
+        uint64_t count = counts[i];
+
+        REQUIRE_EXPR ( KRowSetAddRowIdRange ( rowset, ctx, row_id, count ) );
+        for ( uint64_t j = 0; j < count; ++j )
+            inserted_rows_set.insert( row_id + j );
+    }
+
+    for ( size_t i = 0; i < sizeof overlap_row_ids / sizeof overlap_row_ids[0]; ++i )
+    {
+        int64_t row_id = overlap_row_ids[i];
+        uint64_t count = overlap_counts[i];
+
+        REQUIRE_EXPR ( KRowSetAddRowIdRange ( rowset, ctx, row_id, count ) );
+        for ( uint64_t j = 0; j < count; ++j )
+            inserted_rows_set.insert( row_id + j );
+
+    }
+    RunChecks ( rowset, inserted_rows_set );
+
+    REQUIRE_EXPR ( KRowSetRelease( rowset, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( KRowSetIterator, RowSetFixture )
+{
+    ENTRY;
+
+    KRowSet * rowset;
+
+    int64_t row_id_inserted = 55;
+
+    REQUIRE_EXPR ( rowset = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+    REQUIRE_EXPR ( KRowSetAddRowIdRange ( rowset, ctx, row_id_inserted, 1 ) );
+
+    uint64_t num_rows;
+    REQUIRE_EXPR ( num_rows = KRowSetGetNumRowIds ( rowset, ctx ) );
+    REQUIRE_EQ ( num_rows, (uint64_t)1 );
+
+    int64_t row_id_retrieved;
+    KRowSetIterator * it;
+    REQUIRE_EXPR ( it = KRowSetMakeIterator ( rowset, ctx ) );
+    REQUIRE_EXPR ( KRowSetRelease( rowset, ctx ) );
+    rowset = NULL;
+
+    REQUIRE ( KRowSetIteratorIsValid ( it ) );
+    REQUIRE_EXPR ( row_id_retrieved = KRowSetIteratorGetRowId ( it, ctx ) );
+    REQUIRE_EQ ( row_id_inserted, row_id_retrieved );
+
+    bool has_row;
+    REQUIRE_EXPR ( has_row = KRowSetIteratorNext ( it, ctx ) );
+    REQUIRE ( ! has_row );
+    REQUIRE ( ! KRowSetIteratorIsValid ( it ) );
+    REQUIRE_EXPR_FAILED ( KRowSetIteratorGetRowId ( it, ctx ) );
+    REQUIRE_EXPR_FAILED ( KRowSetIteratorNext ( it, ctx ) );
+
+//    // move forward out of boundaries and then move back
+//    for ( int i = 0; i < move_out_boundaries; ++i )
+//    {
+//        REQUIRE_EXPR_FAILED ( KRowSetIteratorNext( it, ctx ) );
+//        REQUIRE ( !KRowSetIteratorIsValid ( it ) );
+//    }
+//    for ( int i = move_out_boundaries - 1; i >= 0; --i )
+//    {
+//        rc_t rc = KRowSetIteratorPrev( it );
+//        if ( i == 0 )
+//        {
+//            REQUIRE_RC ( rc );
+//        }
+//        else
+//        {
+//            REQUIRE_RC_FAIL ( rc );
+//            REQUIRE ( !KRowSetIteratorIsValid ( it ) );
+//        }
+//    }
+//    REQUIRE ( KRowSetIteratorIsValid ( it ) );
+//    REQUIRE_RC ( KRowSetIteratorRowId ( it, &row_id_retrieved ) );
+//    REQUIRE_EQ ( row_id_inserted, row_id_retrieved );
+//
+//    // move backward out of boundaries and then move back
+//    for ( int i = 0; i < move_out_boundaries; ++i )
+//    {
+//        REQUIRE_RC_FAIL ( KRowSetIteratorPrev( it ) );
+//        REQUIRE ( !KRowSetIteratorIsValid ( it ) );
+//    }
+//    for ( int i = move_out_boundaries - 1; i >= 0; --i )
+//    {
+//        rc_t rc = KRowSetIteratorNext( it );
+//        if ( i == 0 )
+//        {
+//            REQUIRE_RC ( rc );
+//        }
+//        else
+//        {
+//            REQUIRE_RC_FAIL ( rc );
+//            REQUIRE ( !KRowSetIteratorIsValid ( it ) );
+//        }
+//    }
+//    REQUIRE ( KRowSetIteratorIsValid ( it ) );
+//    REQUIRE_RC ( KRowSetIteratorRowId ( it, &row_id_retrieved ) );
+//    REQUIRE_EQ ( row_id_inserted, row_id_retrieved );
+
+    REQUIRE_EXPR ( KRowSetIteratorRelease ( it, ctx ) );
+    EXIT;
+}
+//
+//FIXTURE_TEST_CASE ( KRowSetIteratorMoveForwardAndBackward, RowSetFixture )
+//{
+//    KRowSet * rowset;
+//
+//    int64_t row_ids[] = { 0, 5, 10, 15, 20, 25, 30, 35, 40, 1000, 100000 };
+//
+//    rowset = KTableMakeRowSet ( NULL, ctx );
+//    for ( int i = 0; i < sizeof row_ids / sizeof row_ids[0]; ++i )
+//    {
+//        int64_t row_id = row_ids[i];
+//        bool inserted;
+//
+//        REQUIRE_RC ( KRowSetAddRowId ( rowset, row_id, &inserted ) );
+//        REQUIRE ( inserted );
+//    }
+//
+//    uint64_t num_rows;
+//    REQUIRE_RC ( KRowSetGetNumRowIds ( rowset, &num_rows ) );
+//    REQUIRE_EQ ( num_rows, (uint64_t)sizeof row_ids / sizeof row_ids[0] );
+//
+//    KRowSetIterator * it;
+//    REQUIRE_RC ( KRowSetMakeIterator ( rowset, &it ) );
+//    REQUIRE_RC ( KRowSetRelease( rowset ) );
+//    rowset = NULL;
+//
+//    // move forward
+//    for ( int i = 0; i < sizeof row_ids / sizeof row_ids[0]; ++i )
+//    {
+//        int64_t row_id;
+//
+//        if ( i != 0 )
+//            REQUIRE_RC ( KRowSetIteratorNext( it ) );
+//
+//        REQUIRE ( KRowSetIteratorIsValid ( it ) );
+//        REQUIRE_RC ( KRowSetIteratorRowId ( it, &row_id ) );
+//        REQUIRE_EQ ( row_id, row_ids[i] );
+//    }
+//
+//    // move backward
+//    for ( int i = sizeof row_ids / sizeof row_ids[0] - 1; i >= 0; --i )
+//    {
+//        int64_t row_id;
+//
+//        if ( i != sizeof row_ids / sizeof row_ids[0] - 1 )
+//            REQUIRE_RC ( KRowSetIteratorPrev( it ) );
+//
+//        REQUIRE ( KRowSetIteratorIsValid ( it ) );
+//        REQUIRE_RC ( KRowSetIteratorRowId ( it, &row_id ) );
+//        REQUIRE_EQ ( row_id, row_ids[i] );
+//    }
+//
+//    REQUIRE_RC ( KRowSetIteratorRelease ( it ) );
+//}
+
+FIXTURE_TEST_CASE ( KRowSetIteratorOverEmptySet, RowSetFixture )
+{
+    ENTRY;
+    KRowSet * rowset;
+    REQUIRE_EXPR ( rowset = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+
+    KRowSetIterator * it;
+    REQUIRE_EXPR ( it = KRowSetMakeIterator ( rowset, ctx ) );
+    REQUIRE ( !KRowSetIteratorIsValid ( it ) );
+
+    REQUIRE_EXPR ( KRowSetIteratorRelease( it, ctx ) );
+    REQUIRE_EXPR ( KRowSetRelease( rowset, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( KRowSetIntersectSimpleTest, RowSetFixture )
+{
+    ENTRY;
+    KRowSet * rowset1;
+    KRowSet * rowset2;
+    std::set<int64_t> inserted_rows_set1;
+    std::set<int64_t> inserted_rows_set2;
+
+    REQUIRE_EXPR ( rowset1 = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+    REQUIRE_EXPR ( rowset2 = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+
+    for ( int i = 0; i < 5000; ++i )
+    {
+        int64_t row_id = GenerateId ( -1, -1 );
+        if ( inserted_rows_set1.find( row_id ) ==  inserted_rows_set1.end() )
+        {
+            REQUIRE_EXPR ( KRowSetAddRowId ( rowset1, ctx, row_id) );
+            inserted_rows_set1.insert( row_id );
+            // just don't insert a single row to a second rowset, but otherwise keep them equal
+            if ( i != 0 )
+            {
+                REQUIRE_EXPR ( KRowSetAddRowId ( rowset2, ctx, row_id) );
+                inserted_rows_set2.insert( row_id );
+            }
+        }
+        else
+            --i;
+    }
+
+    KRowSet * rowset_result;
+    REQUIRE_EXPR ( rowset_result = KRowSetIntersect ( ctx, rowset1, rowset2 ) );
+
+    RunChecks ( rowset1, inserted_rows_set1 );
+    RunChecks ( rowset2, inserted_rows_set2 );
+    RunChecks ( rowset_result, inserted_rows_set2 );
+
+    REQUIRE_EXPR ( KRowSetRelease( rowset1, ctx ) );
+    REQUIRE_EXPR ( KRowSetRelease( rowset2, ctx ) );
+    REQUIRE_EXPR ( KRowSetRelease( rowset_result, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( KRowSetIntersectNormalTest, RowSetFixture )
+{
+    ENTRY;
+    // check all 4 combinations of dense/scattered leaves
+    for ( int i = 0; i < 4; ++i )
+    {
+        KRowSet * rowset1;
+        KRowSet * rowset2;
+        KRowSet * rowset_result;
+        std::set<int64_t> inserted_rows_set1;
+        std::set<int64_t> inserted_rows_set2;
+        std::set<int64_t> intersection_set;
+
+        REQUIRE_EXPR ( rowset1 = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+        REQUIRE_EXPR ( rowset2 = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+
+        inserted_rows_set1 = InsertRandomRows ( rowset1, 5000, (i & 1) ? 8 : 0 );
+        inserted_rows_set2 = InsertRandomRows ( rowset2, 5000, (i & 2) ? 8 : 0 );
+
+        RunChecks ( rowset1, inserted_rows_set1 );
+        RunChecks ( rowset2, inserted_rows_set2 );
+
+        REQUIRE_EXPR ( rowset_result = KRowSetIntersect ( ctx, rowset1, rowset2 ) );
+        intersection_set = SetIntersection ( inserted_rows_set1, inserted_rows_set2 );
+
+        RunChecks ( rowset_result, intersection_set );
+        RunChecks ( rowset1, inserted_rows_set1 );
+        RunChecks ( rowset2, inserted_rows_set2 );
+        REQUIRE_EXPR ( KRowSetRelease( rowset_result, ctx ) );
+
+        REQUIRE_EXPR ( rowset_result =  KRowSetIntersect ( ctx, rowset2, rowset1 ) );
+        RunChecks ( rowset_result, intersection_set );
+        RunChecks ( rowset1, inserted_rows_set1 );
+        RunChecks ( rowset2, inserted_rows_set2 );
+
+        REQUIRE_EXPR ( KRowSetRelease( rowset1, ctx ) );
+        REQUIRE_EXPR ( KRowSetRelease( rowset2, ctx ) );
+        REQUIRE_EXPR ( KRowSetRelease( rowset_result, ctx ) );
+    }
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( KRowSetUnionSimpleTest, RowSetFixture )
+{
+    ENTRY;
+    KRowSet * rowset1;
+    KRowSet * rowset2;
+    std::set<int64_t> inserted_rows_set1;
+    std::set<int64_t> inserted_rows_set2;
+
+    REQUIRE_EXPR ( rowset1 = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+    REQUIRE_EXPR ( rowset2 = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+
+    for ( int i = 0; i < 5000; ++i )
+    {
+        int64_t row_id = GenerateId ( -1, -1 );
+        if ( inserted_rows_set1.find( row_id ) ==  inserted_rows_set1.end() )
+        {
+            REQUIRE_EXPR ( KRowSetAddRowId ( rowset1, ctx, row_id) );
+            inserted_rows_set1.insert( row_id );
+            // just don't insert a single row to a second rowset, but otherwise keep them equal
+            if ( i != 0 )
+            {
+                REQUIRE_EXPR ( KRowSetAddRowId ( rowset2, ctx, row_id) );
+                inserted_rows_set2.insert( row_id );
+            }
+        }
+        else
+            --i;
+    }
+
+    KRowSet * rowset_result;
+    REQUIRE_EXPR ( rowset_result = KRowSetUnion ( ctx, rowset1, rowset2 ) );
+
+    RunChecks ( rowset1, inserted_rows_set1 );
+    RunChecks ( rowset2, inserted_rows_set2 );
+    RunChecks ( rowset_result, inserted_rows_set1 );
+
+    REQUIRE_EXPR ( KRowSetRelease( rowset1, ctx ) );
+    REQUIRE_EXPR ( KRowSetRelease( rowset2, ctx ) );
+    REQUIRE_EXPR ( KRowSetRelease( rowset_result, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( KRowSetUnionNormalTest, RowSetFixture )
+{
+    ENTRY;
+    // check all 4 combinations of dense/scattered leaves
+    for ( int i = 0; i < 4; ++i )
+    {
+        KRowSet * rowset1;
+        KRowSet * rowset2;
+        KRowSet * rowset_result;
+        std::set<int64_t> inserted_rows_set1;
+        std::set<int64_t> inserted_rows_set2;
+        std::set<int64_t> union_set;
+
+        REQUIRE_EXPR ( rowset1 = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+        REQUIRE_EXPR ( rowset2 = KTableMakeRowSet ( GetTable ( GetName() ), ctx ) );
+
+        inserted_rows_set1 = InsertRandomRows ( rowset1, 5000, (i & 1) ? 8 : 0 );
+        inserted_rows_set2 = InsertRandomRows ( rowset2, 5000, (i & 2) ? 8 : 0 );
+
+        RunChecks ( rowset1, inserted_rows_set1 );
+        RunChecks ( rowset2, inserted_rows_set2 );
+
+        REQUIRE_EXPR ( rowset_result = KRowSetUnion ( ctx, rowset1, rowset2 ) );
+        union_set = SetUnion ( inserted_rows_set1, inserted_rows_set2 );
+
+        RunChecks ( rowset_result, union_set );
+        RunChecks ( rowset1, inserted_rows_set1 );
+        RunChecks ( rowset2, inserted_rows_set2 );
+        REQUIRE_EXPR ( KRowSetRelease( rowset_result, ctx ) );
+
+        REQUIRE_EXPR ( rowset_result =  KRowSetUnion ( ctx, rowset2, rowset1 ) );
+        RunChecks ( rowset_result, union_set );
+        RunChecks ( rowset1, inserted_rows_set1 );
+        RunChecks ( rowset2, inserted_rows_set2 );
+
+        REQUIRE_EXPR ( KRowSetRelease( rowset1, ctx ) );
+        REQUIRE_EXPR ( KRowSetRelease( rowset2, ctx ) );
+        REQUIRE_EXPR ( KRowSetRelease( rowset_result, ctx ) );
+    }
+    EXIT;
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0;
+}
+
+
+const char UsageDefaultName[] = "test-rowset";
+
+rc_t CC UsageSummary ( const char *progname )
+{
+    return KOutMsg ( "\n"
+                     "Usage:\n"
+                     "  %s [Options] <target>\n"
+                     "\n"
+                     "Summary:\n"
+                     "  test the rowset.\n"
+                     , progname
+        );
+}
+
+rc_t CC Usage ( const Args *args )
+{
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if (args == NULL)
+        rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+    else
+        rc = ArgsProgram (args, &fullpath, &progname);
+    if (rc)
+        progname = fullpath = UsageDefaultName;
+
+    UsageSummary (progname);
+
+    KOutMsg ("Options:\n");
+
+    HelpOptionsStandard ();
+
+    HelpVersion (fullpath, KAppVersion());
+
+    return rc;
+}
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    srand ( time(NULL) );
+    return KRowSetTestSuite(argc, argv);
+}
+
+}
+
diff --git a/test/kdb/test-btree.c b/test/kdb/test-btree.c
new file mode 100644
index 0000000..51254f0
--- /dev/null
+++ b/test/kdb/test-btree.c
@@ -0,0 +1,338 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/* broken test - this added just to make it compile */
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <kfs/directory.h>
+#include <kfs/pagefile.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <kdb/btree.h>
+#include <klib/token.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define USE_EXTERN_TEXT_CMP 0
+
+
+typedef struct test_btree_stat test_btree_stat;
+struct test_btree_stat
+{
+    uint32_t type;
+    uint32_t first_seen;
+    uint32_t count;
+};
+
+static
+void test_btree_stat_report ( const void *key, size_t key_size, KBTreeValue *val, void *ignore )
+{
+    size_t bytes;
+    const test_btree_stat *stat;
+    rc_t rc = KBTreeValueAccessRead ( val, ( const void** ) & stat, & bytes );
+    if ( rc != 0 )
+        LOGERR ( klogInt, rc, "KBTreeValueAccessRead failed" );
+    else if ( bytes != sizeof * stat )
+        LOGMSG ( klogInt, "KBTreeValueAccessRead returned wrong size" );
+    else
+    {
+        printf ( "key: '%.*s'\n", ( int ) key_size, ( const char* ) key );
+        printf ( "  type %u\n", stat -> type );
+        printf ( "  first seen on line %u\n", stat -> first_seen );
+        printf ( "  occurs %u times.\n\n", stat -> count );
+    }
+}
+
+#if USE_EXTERN_TEXT_CMP
+static
+int bt_text_cmp ( const void *a, size_t asize, const void *b, size_t bsize )
+{
+    if ( asize < bsize )
+        return -1;
+    if ( asize > bsize )
+        return 1;
+    return memcmp ( a, b, asize );
+}
+#else
+#define bt_text_cmp NULL
+#endif
+
+static
+rc_t test_readonly1 ( const KDirectory *dir, const KFile *in )
+{
+    const KFile *backing;
+    rc_t rc = KDirectoryOpenFileRead ( dir, & backing, "test-btree.out" );
+    if ( rc == 0 )
+    {
+        const KBTree *bt;
+        rc = KBTreeMakeRead ( & bt, backing, 256 * 1024 * 1024, bt_text_cmp );
+        if ( rc != 0 )
+            LOGERR ( klogInt, rc, "KBTreeMakeRead failed" );
+        else
+        {
+            rc = KBTreeForEach ( bt, false, test_btree_stat_report, NULL );
+            if ( rc != 0 )
+                LOGERR ( klogInt, rc, "KBTreeForEach failed" );
+
+            KBTreeRelease ( bt );
+        }
+
+        KFileRelease ( backing );
+    }
+    return rc;
+}
+
+static
+rc_t test_readonly ( const KDirectory *dir, const KFile *in )
+{
+    rc_t rc;
+
+    rc = test_readonly1 ( dir, in );
+
+    return rc;
+}
+
+static
+rc_t make_text_entry ( KBTree *bt, const char *key, size_t key_size, int id, uint32_t lineno )
+{
+    static int entry = 0;
+
+    KBTreeValue val;
+    bool was_inserted;
+    test_btree_stat *stat;
+    rc_t rc = KBTreeEntry ( bt, & val, & was_inserted, sizeof * stat, key, key_size );
+    ++ entry;
+    if ( rc != 0 )
+    {
+        LOGERR ( klogInt, rc, "KBTreeEntry failed" );
+        printf ( "failed on entry %d\n", entry );
+        fflush ( stdout );
+    }
+    else
+    {
+        size_t bytes;
+        rc = KBTreeValueAccessUpdate ( & val, ( void** ) & stat, & bytes );
+        if ( rc != 0 )
+            LOGERR ( klogInt, rc, "KBTreeValueAccessUpdate failed" );
+        else
+        {
+            if ( bytes != sizeof * stat )
+                rc = -1;
+            else if ( was_inserted )
+            {
+                stat -> type = id;
+                stat -> first_seen = lineno;
+                stat -> count = 1;
+            }
+            else
+            {
+                ++ stat -> count;
+            }
+        }
+
+        KBTreeValueWhack ( & val );
+    }
+    return rc;
+}
+
+static
+rc_t test_update1 ( KDirectory *dir, const KFile *in, const char *path )
+{
+    KFile *out;
+    rc_t rc = KDirectoryCreateFile ( dir, & out, true, 0666, kcmInit, "test-btree.out" );
+    if ( rc == 0 )
+    {
+        size_t pgsize = KPageConstSize ();
+        size_t key_max = ( pgsize > 1024 ) ? 255 : ( pgsize - 8 - 24 ) / 2;
+
+        KBTree *bt;
+        rc = KBTreeMakeUpdate ( & bt, out,
+            256 * 1024 * 1024, false, kbtOpaqueKey,
+            8, sizeof ( test_btree_stat ),
+            1, key_max,
+            sizeof ( test_btree_stat ), sizeof ( test_btree_stat ),
+            bt_text_cmp );
+        if ( rc != 0 )
+            LOGERR ( klogInt, rc, "KBTreeMakeUpdate failed" );
+        else
+        {
+            const KMMap *mm;
+            rc = KMMapMakeRead ( & mm, in );
+            if ( rc == 0 )
+            {
+                const void *addr;
+                rc = KMMapAddrRead ( mm, &addr );
+                if ( rc == 0 )
+                {
+                    size_t size;
+                    rc = KMMapSize ( mm, & size );
+                    if ( rc == 0 )
+                    {
+                        char buffer [ 1024 ];
+
+                        /* have a memory mapped input file, and it's text
+                           ( er, at least that's the idea *. */
+                        KToken t;
+                        KTokenText ttxt;
+                        KTokenSource src;
+                        String sstr, pstr;
+
+                        /* test also assumes ASCII - sorry */
+                        StringInitCString ( & pstr, path );
+                        StringInit ( & sstr, addr, size, ( uint32_t ) size );
+                        KTokenTextInit ( & ttxt, & sstr, & pstr );
+                        KTokenSourceInit ( & src, & ttxt );
+
+                        /* okay, now parse the file */
+                        while ( KTokenizerNext ( kDefaultTokenizer, & src, & t ) -> id != eEndOfInput )
+                        {
+                            switch  ( t . id )
+                            {
+                            case eUntermString:
+                            case eString:
+                            case eUntermEscapedString:
+                            case eEscapedString:
+                                rc = KTokenToString ( & t, buffer, sizeof buffer, & size );
+                                if ( rc != 0 )
+                                    rc = 0;
+                                else
+                                    rc = make_text_entry ( bt, buffer, size, t . id, t . lineno );
+                                break;
+
+                            case eIdent:
+                            case eName:
+                                rc = make_text_entry ( bt, t . str . addr, t . str . size, t . id, t . lineno );
+                                break;
+                            }
+                        }
+                    }
+                }
+
+                KMMapRelease ( mm );
+            }
+
+            KBTreeRelease ( bt );
+        }
+
+        KFileRelease ( out );
+    }
+    return rc;
+}
+
+static
+rc_t test_update ( KDirectory *dir, const KFile *in, const char *path )
+{
+    rc_t rc;
+
+    rc = test_update1 ( dir, in, path );
+
+    return rc;
+}
+
+ver_t CC KAppVersion ( void )
+{
+    return 0;
+}
+
+
+const char UsageDefaultName[] = "vdb-unlock";
+
+rc_t CC UsageSummary ( const char *progname )
+{
+    return KOutMsg ( "\n"
+                     "Usage:\n"
+                     "  %s [Options] <target>\n"
+                     "\n"
+                     "Summary:\n"
+                     "  test the btree.\n"
+                     , progname
+        );
+}
+
+rc_t CC Usage ( const Args *args )
+{
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if (args == NULL)
+        rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+    else
+        rc = ArgsProgram (args, &fullpath, &progname);
+    if (rc)
+        progname = fullpath = UsageDefaultName;
+
+    UsageSummary (progname);
+
+    KOutMsg ("Options:\n");
+
+    HelpOptionsStandard ();
+
+    HelpVersion (fullpath, KAppVersion());
+
+    return rc;
+}
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args *args;
+    rc_t rc = ArgsMakeAndHandle ( & args, argc, argv, 0 );
+    if ( rc != 0 )
+        LogErr ( klogErr, rc, "failed to parse arguments" );
+    else
+    {
+        KDirectory *wd;
+
+        const char *path = "test-btree.c";
+        if ( argc == 2 )
+            path = argv [ 1 ];
+
+        rc = KDirectoryNativeDir ( & wd );
+        if ( rc == 0 )
+        {
+            const KFile *in;
+            rc = KDirectoryOpenFileRead ( wd, & in, path );
+            if ( rc == 0 )
+            {
+                rc = test_update ( wd, in, path );
+                if ( rc == 0 )
+                    rc = test_readonly ( wd, in );
+
+                KFileRelease ( in );
+            }
+
+            KDirectoryRelease ( wd );
+        }
+    }
+    return rc;
+}
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#blank.sam b/test/kdb/testdb/tbl/SEQUENCE/col/dummy
similarity index 100%
rename from src/test/resources/htsjdk/samtools/cram/xx#blank.sam
rename to test/kdb/testdb/tbl/SEQUENCE/col/dummy
diff --git a/test/kdb/wkdbtest.cpp b/test/kdb/wkdbtest.cpp
new file mode 100644
index 0000000..3e07011
--- /dev/null
+++ b/test/kdb/wkdbtest.cpp
@@ -0,0 +1,264 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for Kdb interface
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <sysalloc.h>
+
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/index.h>
+#include <kdb/table.h>
+#include <kdb/column.h>
+#include <kdb/meta.h>
+
+using namespace std;
+
+TEST_SUITE(KdbTestSuite);
+
+#define KDB_MANAGER_MAKE(m_mgr, m_wd) KDBManagerMakeUpdate((KDBManager **)m_mgr, (struct KDirectory *)m_wd)
+#include "remote_open_test.cpp"
+
+class WKDB_Fixture
+{
+public:
+    WKDB_Fixture()
+    {
+        THROW_ON_RC ( KDirectoryNativeDir ( & m_wd ) );
+        THROW_ON_RC ( KDBManagerMakeUpdate ( & m_mgr, m_wd ) );
+    }
+    ~WKDB_Fixture()
+    {
+        KDBManagerRelease ( m_mgr );
+        KDirectoryRelease ( m_wd );
+    }
+    
+    std::string GetColumnMetadata ( const KColumn* p_col, const char* p_metadataName )
+    {
+        const KMetadata *meta;
+        THROW_ON_RC ( KColumnOpenMetadataRead( p_col, &meta ) );
+        const KMDataNode* node;
+        THROW_ON_RC ( KMetadataOpenNodeRead ( meta, & node, p_metadataName ) );
+        size_t num_read;
+        char buf[1024];
+        THROW_ON_RC ( KMDataNodeRead ( node, 0, buf, sizeof buf, & num_read, 0 ) );
+        THROW_ON_RC ( KMDataNodeRelease ( node ) );
+        THROW_ON_RC ( KMetadataRelease ( meta ) );
+        return string ( buf, num_read );
+    }
+    
+    KDirectory* m_wd;
+    KDBManager* m_mgr;
+};
+
+FIXTURE_TEST_CASE ( MissingRows, WKDB_Fixture )
+{   // VDB-177
+    KDirectoryRemove(m_wd, true, GetName());
+    KDatabase* db;
+    REQUIRE_RC(KDBManagerCreateDB(m_mgr, &db, kcmCreate, GetName()));
+ 
+    KIndex *idx;
+    REQUIRE_RC(KDatabaseCreateIndex(db, &idx, kitText, kcmCreate, "index"));
+    
+    REQUIRE_RC(KIndexInsertText(idx, true, "aaaa1", 1));
+    REQUIRE_RC(KIndexInsertText(idx, true, "aaaa3", 3));
+    
+    int64_t start_id;
+    uint64_t id_count;
+    REQUIRE_RC(KIndexFindText (idx, "aaaa1", &start_id, &id_count, NULL, NULL));
+    REQUIRE_EQ(start_id, (int64_t)1);
+    REQUIRE_EQ(id_count, (uint64_t)1);
+    
+    REQUIRE_RC_FAIL(KIndexFindText (idx, "aaaa2", &start_id, &id_count, NULL, NULL));
+    REQUIRE_RC_FAIL(KIndexFindText (idx, "", &start_id, &id_count, NULL, NULL));
+    
+    REQUIRE_RC(KIndexFindText (idx, "aaaa3", &start_id, &id_count, NULL, NULL));
+    REQUIRE_EQ(start_id, (int64_t)3);
+    REQUIRE_EQ(id_count, (uint64_t)1);
+    
+    REQUIRE_RC(KIndexRelease(idx));
+   
+    REQUIRE_RC(KDatabaseRelease(db));
+    KDirectoryRemove(m_wd, true, GetName());
+}
+
+FIXTURE_TEST_CASE ( ColumnMetadataWKDB_Fixture, WKDB_Fixture )
+{
+    KDirectoryRemove(m_wd, true, GetName());
+    
+    const char* TableName = "tbl";
+    const char* ColumnName = "col";
+    const char* MetadataName = "metaname";
+    const char* MetadataValue = "metavalue";
+    
+    {
+        KDatabase* db;
+        REQUIRE_RC(KDBManagerCreateDB(m_mgr, &db, kcmCreate, GetName()));
+     
+        KTable* tbl;
+        REQUIRE_RC ( KDBManagerCreateTable ( m_mgr, & tbl, kcmInit + kcmMD5, TableName ) );
+        
+        KColumn* col;
+        REQUIRE_RC ( KTableCreateColumn ( tbl, & col, kcmInit, kcmMD5, 0, ColumnName ) );
+        
+        KMetadata *meta;
+        REQUIRE_RC ( KColumnOpenMetadataUpdate ( col, &meta ) );
+        
+        KMDataNode* node;
+        REQUIRE_RC ( KMetadataOpenNodeUpdate ( meta, & node, MetadataName ) );
+        
+        REQUIRE_RC ( KMDataNodeWrite ( node, MetadataValue, string_size ( MetadataValue ) ) );
+        
+        REQUIRE_RC ( KMDataNodeRelease ( node ) );
+        
+        REQUIRE_RC ( KMetadataRelease ( meta ) );
+       
+        // can only read after metadata has been released
+        REQUIRE_EQ ( string ( MetadataValue ), GetColumnMetadata ( col, MetadataName ) );
+        
+        REQUIRE_RC ( KColumnRelease ( col ) );
+        REQUIRE_RC ( KTableRelease ( tbl ) );
+        REQUIRE_RC ( KDatabaseRelease ( db ) );
+    }
+    {   // reopen, verify
+        KDatabase* db;
+        REQUIRE_RC ( KDBManagerOpenDBUpdate ( m_mgr, &db, GetName() ) );
+        
+        const KTable* tbl;
+        REQUIRE_RC ( KDBManagerOpenTableRead ( m_mgr, & tbl, TableName ) );
+        
+        const KColumn* col;
+        REQUIRE_RC ( KTableOpenColumnRead ( tbl, & col, ColumnName ) );
+        
+        REQUIRE_EQ ( string ( MetadataValue ), GetColumnMetadata ( col, MetadataName ) );
+        
+        REQUIRE_RC ( KColumnRelease ( col ) );
+        REQUIRE_RC ( KTableRelease ( tbl ) );
+        REQUIRE_RC ( KDatabaseRelease ( db ) );
+    }
+    
+    KDirectoryRemove(m_wd, true, TableName);
+    KDirectoryRemove(m_wd, true, GetName());
+}
+
+// KColumnBlob
+// see same tests on the read side, kdbtest.cpp
+
+class ColumnBlobReadFixture
+{
+public:
+    ColumnBlobReadFixture()
+    :   m_num_read ( 0 ),
+        m_remaining ( 0 )
+    {
+        KDBManager* mgr;
+        THROW_ON_RC ( KDBManagerMakeUpdate( & mgr, NULL ) );
+        
+        const KTable* tbl;
+        THROW_ON_RC ( KDBManagerOpenTableRead ( mgr, & tbl, "SRR000123" ) );
+        
+        const KColumn* col;
+        THROW_ON_RC ( KTableOpenColumnRead ( tbl, & col, "X" ) );
+        
+        THROW_ON_RC ( KColumnOpenBlobRead ( col, & m_blob, 1 ) );
+        
+        THROW_ON_RC ( KColumnRelease ( col ) );
+        THROW_ON_RC ( KTableRelease ( tbl ) );
+        THROW_ON_RC ( KDBManagerRelease ( mgr ) );
+    }
+    ~ColumnBlobReadFixture()
+    {
+        KColumnBlobRelease ( m_blob );
+    }
+
+    const KColumnBlob*  m_blob;
+    size_t m_num_read;
+    size_t m_remaining;
+};
+
+FIXTURE_TEST_CASE ( ColumnBlobRead_basic, ColumnBlobReadFixture )
+{   
+    const size_t BlobSize = 1882; 
+    const size_t BufSize = 2024; 
+    char buffer [ BufSize ];
+    REQUIRE_RC ( KColumnBlobRead ( m_blob, 0, buffer, BufSize, & m_num_read, & m_remaining ) );
+    REQUIRE_EQ ( BlobSize, m_num_read );
+    REQUIRE_EQ ( (size_t)0, m_remaining );
+}
+
+FIXTURE_TEST_CASE ( ColumnBlobRead_insufficient_buffer, ColumnBlobReadFixture )
+{   
+    const size_t BlobSize = 1882; 
+    const size_t BufSize = 1024; 
+    char buffer [ BufSize ];
+    // first read incomplete
+    REQUIRE_RC ( KColumnBlobRead ( m_blob, 0, buffer, BufSize, & m_num_read, & m_remaining ) );
+    REQUIRE_EQ ( BufSize, m_num_read );
+    REQUIRE_EQ ( BlobSize - BufSize, m_remaining );
+    // the rest comes in on the second read
+    REQUIRE_RC ( KColumnBlobRead ( m_blob, BufSize, buffer, BufSize, & m_num_read, & m_remaining ) );
+    REQUIRE_EQ ( BlobSize - BufSize, m_num_read );
+    REQUIRE_EQ ( (size_t)0, m_remaining );
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+#include <klib/debug.h> // KDbgSetString
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-wkdb";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    //assert(!KDbgSetString("KFG"));
+    //assert(!KDbgSetString("VFS"));
+    KConfigDisableUserSettings();
+    rc_t rc=KdbTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kfc/Makefile b/test/kfc/Makefile
new file mode 100644
index 0000000..67c4042
--- /dev/null
+++ b/test/kfc/Makefile
@@ -0,0 +1,57 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+MODULE = test/kfc
+
+TEST_TOOLS = \
+	test-except
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(ALL_LIBS) $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# white-box test
+#
+TEST_SRC = \
+	test-except \
+	kfc \
+    
+TEST_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_SRC))
+
+TEST_LIB = \
+	-sklib
+
+$(TEST_BINDIR)/test-except: $(TEST_OBJ)
+	$(LD) --exe -o $@ $^ $(TEST_LIB)
diff --git a/test/kfc/kfc.c b/test/kfc/kfc.c
new file mode 100644
index 0000000..c53cf6d
--- /dev/null
+++ b/test/kfc/kfc.c
@@ -0,0 +1,29 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "../libs/kfc/xc.c"
+#include "../libs/kfc/except.c"
+#include "../libs/kfc/tstate.c"
diff --git a/test/kfc/test-except.c b/test/kfc/test-except.c
new file mode 100644
index 0000000..e7dd4e8
--- /dev/null
+++ b/test/kfc/test-except.c
@@ -0,0 +1,133 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kfc/extern.h>
+#include <kfc/tstate.h>
+#include <kfc/rsrc.h>
+#include <kfc/ctx.h>
+#include <kfc/except.h>
+#include <kfc/rc.h>
+#include <kfc/xc.h>
+#include <kfc/xcdefs.h>
+#include <klib/text.h>
+
+#include <sysalloc.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+static
+void immediate_error_no_clean ( ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcExe, rcFunction, rcValidating );
+    UNIMPLEMENTED ();
+}
+
+static
+void child_error_no_clean ( ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcExe, rcFunction, rcValidating );
+    immediate_error_no_clean ( ctx );
+}
+
+static
+void immediate_error_clean ( ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcExe, rcFunction, rcValidating );
+    UNIMPLEMENTED ();
+    CLEAR ();
+}
+
+
+static
+void run_test ( KRsrc * rsrc, ctx_t ctx, void ( * test ) ( ctx_t ctx ) )
+{
+    rsrc -> thread = KProcMgrMakeThreadState ( ( void * ) 1 );
+
+    ( * test ) ( ctx );
+
+    KThreadStateWhack ( rsrc -> thread );
+    rsrc -> thread = NULL;
+}
+
+static
+void test_except ( KRsrc * rsrc, ctx_t ctx )
+{
+    FUNC_ENTRY ( ctx, rcExe, rcFunction, rcValidating );
+    run_test ( rsrc, ctx, immediate_error_no_clean );
+    run_test ( rsrc, ctx, child_error_no_clean );
+    ON_FAIL ( run_test ( rsrc, ctx, immediate_error_clean ) ) return;
+}
+
+int main ( int argc, char * argv [] )
+{
+    int status;
+    KRsrc rsrc;
+    KCtx local_ctx, * ctx = & local_ctx;
+    DECLARE_FUNC_LOC ( rcExe, rcFunction, rcValidating ); /* ! */
+
+    memset ( & rsrc, 0, sizeof rsrc );
+
+    memset ( & local_ctx, 0, sizeof local_ctx );
+    local_ctx . rsrc = & rsrc;
+    local_ctx . loc = & s_func_loc;
+
+    TRY ( test_except ( & rsrc, ctx ) )
+    {
+        fprintf ( stderr, "%s - succeeded\n", argv [ 0 ] );
+        status = 0;
+    }
+    CATCH_ALL ()
+    {
+        fprintf ( stderr, "%s - failed\n", argv [ 0 ] );
+        status = 1;
+    }
+
+    return status;
+}
+
+#if WINDOWS
+int CC wmain ( int argc, wchar_t * wargv [] )
+{
+    int i, status;
+    char ** argv = malloc ( argc * sizeof * argv );
+    for ( i = 0; i < argc; ++ i )
+    {
+        size_t src_size, dst_size;
+        uint32_t len = wchar_cvt_string_measure ( wargv [ i ], & src_size, & dst_size );
+        char * dst = malloc ( dst_size + 1 );
+        wchar_cvt_string_copy ( dst, dst_size + 1, wargv [ i ], src_size );
+        argv [ i ] = dst;
+    }
+
+    status = main ( argc, argv );
+
+    for ( i = 0; i < argc; ++ i )
+        free ( argv [ i ] );
+    free ( argv );
+
+    return status;
+}
+#endif
diff --git a/test/kfg/Makefile b/test/kfg/Makefile
new file mode 100644
index 0000000..f90a34c
--- /dev/null
+++ b/test/kfg/Makefile
@@ -0,0 +1,139 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/kfg
+
+TEST_TOOLS = \
+	flat-sra-kfg \
+	wb-test-kfg \
+	test-kfg \
+	test-repository \
+	test-keystore
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# ncbi-home-from-env
+
+ENV_SRC = \
+	ncbi-home-from-env
+
+ENV_OBJ = \
+	$(addsuffix .$(OBJX),$(ENV_SRC))
+
+$(TEST_BINDIR)/ncbi-home-from-env: $(ENV_OBJ)
+	$(LP) --exe -o $@ $^ $(ENV_LIB) 
+
+#-------------------------------------------------------------------------------
+# white-box test
+#
+TEST_SRC = \
+	wb-test-kfg
+
+TEST_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_SRC))
+
+TEST_LIB = \
+	-sktst \
+	-skapp \
+    -sncbi-vdb
+
+$(TEST_BINDIR)/wb-test-kfg: $(TEST_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_LIB)
+
+#-------------------------------------------------------------------------------
+# flat-sra-kfg
+
+FLAT_SRC = \
+	flat-sra-kfg
+
+FLAT_OBJ = \
+	$(addsuffix .$(OBJX),$(FLAT_SRC))
+
+$(TEST_BINDIR)/flat-sra-kfg: $(FLAT_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_LIB)
+
+#-------------------------------------------------------------------------------
+# test-kfg
+#
+TEST_KFG_SRC = \
+	kfgtest 
+
+TEST_KFG_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_KFG_SRC))
+
+TEST_KFG_LIB = \
+	-sktst \
+	-skapp \
+    -sncbi-vdb
+
+$(TEST_BINDIR)/test-kfg: $(TEST_KFG_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_KFG_LIB)
+
+#-------------------------------------------------------------------------------
+# test-repository
+#
+TEST_REPOSITORY_SRC = \
+	repositorytest 
+
+TEST_REPOSITORY_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_REPOSITORY_SRC))
+
+TEST_REPOSITORY_LIB = \
+	-sktst \
+	-skapp \
+    -sncbi-vdb
+
+$(TEST_BINDIR)/test-repository: $(TEST_REPOSITORY_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_REPOSITORY_LIB)
+
+#-------------------------------------------------------------------------------
+# test-keystore
+#
+TEST_KEYSTORE_SRC = \
+	keystoretest 
+
+TEST_KEYSTORE_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_KEYSTORE_SRC))
+
+TEST_KEYSTORE_LIB = \
+	-sktst \
+	-skapp \
+    -sncbi-vdb
+
+$(TEST_BINDIR)/test-keystore: $(TEST_KEYSTORE_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_KEYSTORE_LIB)
+
diff --git a/test/kfg/config.linux.kfg b/test/kfg/config.linux.kfg
new file mode 100644
index 0000000..d7482f2
--- /dev/null
+++ b/test/kfg/config.linux.kfg
@@ -0,0 +1,26 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# no longer doing includes
+kfg/includes = "alt-include"
diff --git a/test/kfg/config.schema.kfg b/test/kfg/config.schema.kfg
new file mode 100644
index 0000000..6b42d1e
--- /dev/null
+++ b/test/kfg/config.schema.kfg
@@ -0,0 +1,25 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+vdb/schema/paths = "/panfs/traces01/trace_software/sdk/interfaces"
diff --git a/test/kfg/config.sra.kfg b/test/kfg/config.sra.kfg
new file mode 100644
index 0000000..d2995ed
--- /dev/null
+++ b/test/kfg/config.sra.kfg
@@ -0,0 +1,29 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# sra servers
+sra/servers = "/panfs/traces01"
+sra/ncbi/volumes = "sra2:sra1:sra0"
+sra/ebi/volumes = "era1:era0"
+sra/ddbj/volumes = "dra0"
diff --git a/test/kfg/flat-sra-kfg.cpp b/test/kfg/flat-sra-kfg.cpp
new file mode 100644
index 0000000..979dec2
--- /dev/null
+++ b/test/kfg/flat-sra-kfg.cpp
@@ -0,0 +1,429 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+
+#include <kapp/args.h> /* ArgsMakeAndHandle */
+#include <kfg/config.h> /* KConfig */
+#include <kfs/directory.h> /* KDirectory */
+#include <kfs/file.h> /* KFileRelease */
+#include <klib/debug.h> /* KDbgSetString */
+#include <kns/kns-mgr-priv.h> /* KNSManagerMakeReliableHttpFile */
+#include <kns/manager.h> /* KNSManagerMake */
+#include <ktst/unit_test.hpp>
+#include <vfs/manager.h> /* VFSManagerRelease */
+#include <vfs/manager-priv.h> /* VFSManagerMakeFromKfg */
+#include <vfs/resolver.h> /* VResolver */
+#include <vfs/path.h> /* VPath */
+#include <climits> /* PATH_MAX */
+
+#define ALL
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+using ncbi::NK::TestCase;
+using std::cerr;
+using std::string;
+
+static rc_t argsHandler(int argc, char* argv[]);
+TEST_SUITE_WITH_ARGS_HANDLER(flatSraKfgTestSuite, argsHandler);
+
+static KNSManager * kns = NULL;
+
+class Test : private TestCase {
+    TestCase *_dad;
+
+    void compare ( const VPath * remote, const string & expected ) {
+        assert ( expected . size ( ) );
+        char buffer [ PATH_MAX ] = "";
+        size_t num_read = 0;
+        REQUIRE_RC( VPathReadUri ( remote, buffer, sizeof buffer, & num_read) );
+        REQUIRE ( num_read );
+        REQUIRE_LT ( num_read, sizeof buffer );
+        REQUIRE_EQ ( buffer [ num_read ], '\0' );
+        REQUIRE_EQ ( expected, string ( buffer ) );
+    }
+
+public:
+    Test(TestCase *dad, const VFSManager * manager, const KConfig * config,
+            const VPath * queryShort, const VPath * queryLong,
+            const string & name, const string & expectedShort = "",
+                                 const string & expectedLong  = "")
+        : TestCase(name), _dad(dad)
+    {
+        rc_t rc = 0;
+
+        VResolver * resolver = NULL;
+        REQUIRE_RC ( VFSManagerMakeResolver ( manager, & resolver, config ) );
+
+        const VPath * remote = NULL;
+        const KFile * f = NULL;
+        if ( expectedShort . size () > 0 ) {
+            REQUIRE_RC ( VResolverQuery ( resolver, eProtocolHttps, queryShort,
+                                          NULL, & remote, NULL ) );
+            compare ( remote, expectedShort );
+            RELEASE ( VPath, remote );
+            REQUIRE_RC ( KNSManagerMakeReliableHttpFile
+                ( kns, & f, NULL, 0x01010000, expectedShort . c_str () ) );
+            RELEASE ( KFile, f );
+        } else {
+            REQUIRE_RC_FAIL ( VResolverQuery
+                ( resolver, 0, queryShort, NULL, & remote, NULL ) );
+        }
+
+        if ( expectedLong . size () > 0 ) {
+            REQUIRE_RC ( VResolverQuery ( resolver, eProtocolHttps, queryLong,
+                         NULL, & remote, NULL ) );
+            compare ( remote, expectedLong );
+            RELEASE ( VPath, remote );
+            REQUIRE_RC ( KNSManagerMakeReliableHttpFile
+                ( kns, & f, NULL, 0x01010000, expectedLong . c_str () ) );
+            RELEASE ( KFile, f );
+        } else {
+            REQUIRE_RC_FAIL ( VResolverQuery
+                ( resolver, 0, queryLong, NULL, & remote, NULL ) );
+        }
+
+
+        RELEASE ( VResolver, resolver );
+
+        REQUIRE_EQ ( rc, 0u );
+
+    }
+
+    ~Test(void) {
+        assert(_dad);
+        _dad->ErrorCounterAdd(GetErrorCounter());
+    }
+};
+
+static const char cgiPath[] = "/repository/remote/main/CGI/resolver-cgi";
+static const char goodCgi[]
+    = "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi";
+static const char badCgi[]
+    = "https://XXX.ncbi.nlm.nih.gov/Traces/names/names.cgi";
+#ifdef ALL
+TEST_CASE(test_sra) {
+    const string newShort
+        ("https://sra-download.ncbi.nlm.nih.gov/srapub/SRR000001");
+    const string newLong
+        ("https://sra-download.ncbi.nlm.nih.gov/srapub/SRR1000254");
+    const string oldShort("https://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/"
+                "reads/ByRun/sra/SRR/SRR000/SRR000001/SRR000001.sra");
+
+    rc_t rc = 0;
+
+    KDirectory * native = NULL;
+    REQUIRE_RC ( KDirectoryNativeDir ( & native ) );
+
+    const KDirectory * dirc = NULL;
+    KConfig * cfg = NULL;
+    VFSManager * mgr = NULL;
+
+    // LOAD OLD CONFIGURATION
+    REQUIRE_RC(KDirectoryOpenDirRead(native, &dirc, false, "flat-sra-kfg/old"));
+    REQUIRE_RC ( KConfigMake ( & cfg, dirc ) );
+    REQUIRE_RC ( VFSManagerMakeFromKfg ( & mgr, cfg ) );
+
+    VPath * queryShort = NULL;
+    REQUIRE_RC ( VFSManagerMakeAccPath ( mgr, & queryShort, "SRR000001" ) );
+
+    VPath * queryLong = NULL;
+    REQUIRE_RC ( VFSManagerMakeAccPath ( mgr, & queryLong, "SRR1000254" ) );
+
+//  const char rootPath [] = "/repository/remote/aux/NCBI/root";
+//  const char newRoot[]  = "https://sra-download.ncbi.nlm.nih.gov";
+
+    // fail using incomplete configuration
+    Test(this, mgr, cfg, queryShort, queryLong, "incomplete-old");
+
+    // resolve using correct cgi
+    REQUIRE_RC ( KConfigWriteString ( cfg, cgiPath, goodCgi ) );
+    Test(this, mgr, cfg, queryShort, queryLong, "cgi-old", newShort, newLong);
+
+    // fail using incorrect cgi
+    REQUIRE_RC ( KConfigWriteString ( cfg, cgiPath, badCgi ) );
+    Test(this, mgr, cfg, queryShort, queryLong, "bad cgi-old");
+
+/* aux repositories are ignored : VDB-3090 
+    // old aux configuration cannot resolve long accession
+    const char oldRoot  []  = "https://ftp-trace.ncbi.nlm.nih.gov/sra";
+    REQUIRE_RC ( KConfigWriteString ( cfg, rootPath, oldRoot ) );
+    Test(this, mgr, cfg, queryShort, queryLong, "aux-old", oldShort);
+*/
+
+    // LOAD NEW CONFIGURATION
+    RELEASE ( VFSManager, mgr );
+    RELEASE ( KConfig, cfg );
+    RELEASE ( KDirectory, dirc );
+
+    REQUIRE_RC(KDirectoryOpenDirRead(native, &dirc, false, "flat-sra-kfg/new"));
+    REQUIRE_RC ( KConfigMake ( & cfg, dirc ) );
+    REQUIRE_RC ( VFSManagerMakeFromKfg ( & mgr, cfg ) );
+
+    // fail using incomplete configuration
+    Test(this, mgr, cfg, queryShort, queryLong, "incomplete-new");
+
+    // resolve using correct cgi
+    REQUIRE_RC ( KConfigWriteString ( cfg, cgiPath, goodCgi ) );
+    Test(this, mgr, cfg, queryShort, queryLong, "cgi-new", newShort, newLong);
+
+    // fail using incorrect cgi
+    REQUIRE_RC ( KConfigWriteString ( cfg, cgiPath, badCgi ) );
+    Test(this, mgr, cfg, queryShort, queryLong, "bad cgi-new");
+
+/* aux repositories are ignored : VDB-3090 
+    // resolve using new aux configuration
+    REQUIRE_RC ( KConfigWriteString ( cfg, rootPath, newRoot ) );
+    Test(this, mgr, cfg, queryShort, queryLong, "aux-new", newShort, newLong);
+*/
+
+    RELEASE ( VFSManager, mgr );
+    RELEASE ( KConfig, cfg );
+    RELEASE ( KDirectory, dirc );
+
+    RELEASE ( VPath, queryLong );
+
+    RELEASE ( VPath, queryShort );
+
+    RELEASE ( KDirectory, native );
+
+    REQUIRE_EQ ( rc, 0u );
+}
+#endif
+
+class Fixture : private TestCase {
+    TestCase *_dad;
+public:
+    Fixture(TestCase *dad, const string & tname,
+             const char * acc, const char * name, const char * value,
+             const char * expected = "" )
+        : TestCase(tname), _dad(dad)
+    {
+        rc_t rc = 0;
+
+        KDirectory * native = NULL;
+        REQUIRE_RC ( KDirectoryNativeDir ( & native ) );
+
+        const KDirectory * dir = NULL;
+        REQUIRE_RC(KDirectoryOpenDirRead
+            (native, &dir, false, "flat-sra-kfg/aux_root"));
+
+        KConfig * cfg;
+        REQUIRE_RC ( KConfigMake ( & cfg, dir ) );
+
+        VFSManager * mgr = NULL;
+        REQUIRE_RC ( VFSManagerMakeFromKfg ( & mgr, cfg ) );
+
+        VPath * query = NULL;
+        if ( string ( value ) == "refseq" ) {
+            REQUIRE_RC ( VFSManagerMakeAccPath
+                ( mgr, & query, "ncbi-acc:%s?vdb-ctx=refseq", acc ) );
+        } else {
+            REQUIRE_RC ( VFSManagerMakeAccPath ( mgr, & query, acc ) );
+        }
+
+        const VPath * remoteCgi = NULL;
+        const VPath * remote = NULL;
+        VResolver * resolver = NULL;
+
+        REQUIRE_RC ( VFSManagerMakeResolver ( mgr, & resolver, cfg ) );
+// fail to resolve using empty config
+        REQUIRE_RC_FAIL ( VResolverQuery
+            ( resolver, 0, query, NULL, & remote, NULL ) );
+        RELEASE ( VResolver, resolver );
+
+// resolve using good cgi
+        REQUIRE_RC ( KConfigWriteString ( cfg, cgiPath, goodCgi ) );
+        REQUIRE_RC ( VFSManagerMakeResolver ( mgr, & resolver, cfg ) );
+
+        REQUIRE_RC ( VResolverQuery
+            ( resolver, 0, query, NULL, & remoteCgi, NULL ) );
+        if ( ! expected ) {
+cerr << "\nTO FIX !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :\n "
+            << "\tVResolverQuery(CGI, " << acc << ") SHOULD FAIL !!!!!!!!!!!\n";
+        }
+
+        RELEASE ( VResolver, resolver );
+
+// fail to resolve using bad cgi
+        REQUIRE_RC ( KConfigWriteString ( cfg, cgiPath, badCgi ) );
+        REQUIRE_RC ( VFSManagerMakeResolver ( mgr, & resolver, cfg ) );
+        REQUIRE_RC_FAIL ( VResolverQuery
+            ( resolver, 0, query, NULL, & remote, NULL ) );
+        RELEASE ( VResolver, resolver );
+
+// resolve using aux configuration
+        REQUIRE_RC ( KConfigWriteString ( cfg, name, value ) );
+        REQUIRE_RC ( VFSManagerMakeResolver ( mgr, & resolver, cfg ) );
+        REQUIRE_RC ( VResolverQuery
+            ( resolver, 0, query, NULL, & remote, NULL ) );
+        if ( ! expected ) {
+cerr << "TO FIX !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :\n "
+            << "\tVResolverQuery(AUX, " << acc << ") SHOULD FAIL !!!!!!!!!!!\n";
+        }
+        RELEASE ( VResolver, resolver );
+
+// compare cgi and aux results
+        char buffer [ PATH_MAX ] = "";
+        size_t num_read = 0;
+        REQUIRE_RC (VPathReadUri(remote, buffer, sizeof buffer, & num_read));
+        REQUIRE ( num_read );
+        REQUIRE_LT ( num_read, sizeof buffer );
+        REQUIRE_EQ ( buffer [ num_read ], '\0' );
+
+        char buffrC [ PATH_MAX ] = "";
+        size_t num_readC = 0;
+        REQUIRE_RC(VPathReadUri(remoteCgi, buffrC, sizeof buffrC, &num_readC) );
+        REQUIRE ( num_readC );
+        REQUIRE_LT ( num_readC, sizeof buffrC );
+        REQUIRE_EQ ( buffrC [ num_readC ], '\0' );
+
+if ((string(acc) != "AAAB01" || string(value) != "refseq")
+  && (num_read == num_readC))
+{ // https://jira.ncbi.nlm.nih.gov/browse/VDB-3046?focusedCommentId=4421122&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-4421122
+        REQUIRE_EQ ( string ( buffer ) , string ( buffrC ) );
+        REQUIRE_EQ ( num_read, num_readC );
+        const KFile * f = NULL;
+        REQUIRE_RC
+            (KNSManagerMakeReliableHttpFile(kns, &f, NULL, 0x01010000, buffer));
+        RELEASE ( KFile, f );
+        if ( string (acc) == "AAAB01.1"
+          && expected && expected [ 0 ] && string ( expected ) != buffer)
+        {
+cerr << "\nTO FIX !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :\n "
+            << acc << "(" << tname << "):\tREAL    : " << buffer << "\n"
+             "                        \tEXPECTED: " << expected << "\n\n";
+        } else {
+            assert ( ! expected || ! expected [ 0 ] );
+            cerr << acc << "(" << tname << "): " << buffer << "\n";
+        }
+} else
+cerr << "\nTO FIX !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :\n "
+            << acc << "(" << tname << "): AUX: " << buffer << "\n"
+                 "                        CGI: " << buffrC << "\n\n";
+
+        RELEASE ( VPath, remote );
+        RELEASE ( VPath, remoteCgi );
+
+        RELEASE ( VPath, query );
+
+        RELEASE ( VFSManager, mgr );
+
+        RELEASE ( KConfig, cfg );
+
+        RELEASE ( KDirectory, dir );
+
+        RELEASE ( KDirectory, native );
+
+        REQUIRE_EQ ( rc, 0u );
+    }
+    ~Fixture(void) {
+        assert ( _dad );
+        rc_t rc = 0;
+        REQUIRE_EQ ( rc, 0u );
+        _dad->ErrorCounterAdd(GetErrorCounter());
+    }
+};
+/* aux repositories are ignored : VDB-3090 
+#ifdef ALL
+TEST_CASE(test_nakmer) {
+    Fixture fixture(this, "nakmer", "GCA_000391885.1_R",
+        "/repository/remote/aux/NCBI/apps/nakmer/volumes/fuseNAKMER", "sadb");
+}
+TEST_CASE(test_nannot) {
+    Fixture fixture(this, "nannot", "NA000000007.1",
+        "/repository/remote/aux/NCBI/apps/nannot/volumes/fuseNANNOT", "sadb");
+}
+#endif
+#ifdef ALL
+TEST_CASE(test_AAAB01_1) {
+    Fixture fixture(this, "refseq AAAB01.1", "AAAB01.1",
+        "/repository/remote/aux/NCBI/apps/refseq/volumes/refseq", "refseq",
+        "https://ftp-trace.ncbi.nlm.nih.gov/sra/refseq/AAAB01" );
+}
+#endif
+#ifdef ALL
+TEST_CASE(test_AAAB01) {
+    Fixture fixture(this, "refseq AAAB01", "AAAB01",
+        "/repository/remote/aux/NCBI/apps/refseq/volumes/refseq", "refseq" );
+}
+#endif
+#ifdef ALL
+TEST_CASE(test_AAAB01000001) {
+    Fixture fixture(this, "refseq AAAB01000001", "AAAB01000001",
+        "/repository/remote/aux/NCBI/apps/refseq/volumes/refseq", "refseq" );
+}
+#endif
+/ * TEST_CASE(test_AAAB01_2) {
+    Fixture fixture(this, "refseq AAAB01.2", "AAAB01.2",
+        "/repository/remote/aux/NCBI/apps/refseq/volumes/refseq", "refseq" );
+} * /
+#ifdef ALL
+TEST_CASE(test_KC702199) {
+    Fixture fixture(this, "refseq KC702199.1", "KC702199.1",
+        "/repository/remote/aux/NCBI/apps/refseq/volumes/refseq", "refseq" );
+}
+#endif
+TEST_CASE(test_WGS) {
+    Fixture fixture(this, "WGS", "AFVF01.1",
+        "/repository/remote/aux/NCBI/apps/wgs/volumes/fuseWGS", "wgs" );
+}
+TEST_CASE(test_WGS_AAAB01) {
+    Fixture fixture(this, "WGS AAAB01", "AAAB01",
+        "/repository/remote/aux/NCBI/apps/wgs/volumes/fuseWGS", "wgs" );
+}
+TEST_CASE(test_WGS_AAAB01_1) {
+    Fixture fixture(this, "WGS AAAB01_1", "AAAB01.1",
+        "/repository/remote/aux/NCBI/apps/wgs/volumes/fuseWGS", "wgs",
+        "https://ftp-trace.ncbi.nlm.nih.gov/sra/wgs/AA/AB/AAAB01.1" );
+}
+TEST_CASE(test_WGS_AAAB01_9) {
+    Fixture fixture(this, "WGS AAAB01_2", "AAAB01.9",
+        "/repository/remote/aux/NCBI/apps/wgs/volumes/fuseWGS", "wgs", NULL );
+}*/
+
+static rc_t argsHandler(int argc, char * argv[]) {
+    Args * args = NULL;
+    rc_t rc = ArgsMakeAndHandle(&args, argc, argv, 0, NULL, 0);
+    ArgsWhack(args);
+    return rc;
+}
+rc_t CC Usage ( const Args * args ) { return 0; }
+const char UsageDefaultName [] = "flat-sra-kfg";
+rc_t CC UsageSummary ( const char * prog_name ) { return 0; }
+extern "C" {
+    ver_t CC KAppVersion ( void ) { return 0; }
+    rc_t CC KMain ( int argc, char *argv [] ) {
+if ( 0 ) assert ( ! KDbgSetString ( "VFS" ) );
+        KConfigDisableUserSettings();
+        rc_t rc = KNSManagerMake(&kns);
+        if (rc == 0) {
+            rc = flatSraKfgTestSuite(argc, argv);
+        }
+        RELEASE(KNSManager, kns);
+        return rc;
+    }
+}
diff --git a/test/kfg/flat-sra-kfg/aux_root/empty.kfg b/test/kfg/flat-sra-kfg/aux_root/empty.kfg
new file mode 100644
index 0000000..0b41a6b
--- /dev/null
+++ b/test/kfg/flat-sra-kfg/aux_root/empty.kfg
@@ -0,0 +1 @@
+/repository/remote/aux/NCBI/root = "http://ftp-trace.ncbi.nlm.nih.gov/sra"
diff --git a/test/kfg/flat-sra-kfg/new/sraFlat.kfg b/test/kfg/flat-sra-kfg/new/sraFlat.kfg
new file mode 100644
index 0000000..b66c665
--- /dev/null
+++ b/test/kfg/flat-sra-kfg/new/sraFlat.kfg
@@ -0,0 +1 @@
+/repository/remote/aux/NCBI/apps/sra/volumes/flat = "srapub"
diff --git a/test/kfg/flat-sra-kfg/old/fuse1000.kfg b/test/kfg/flat-sra-kfg/old/fuse1000.kfg
new file mode 100644
index 0000000..3b9f4cd
--- /dev/null
+++ b/test/kfg/flat-sra-kfg/old/fuse1000.kfg
@@ -0,0 +1 @@
+/repository/remote/aux/NCBI/apps/sra/volumes/fuse1000 = "sra-instant/reads/ByRun/sra"
diff --git a/test/kfg/keystoretest.cpp b/test/kfg/keystoretest.cpp
new file mode 100644
index 0000000..728d8f8
--- /dev/null
+++ b/test/kfg/keystoretest.cpp
@@ -0,0 +1,429 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for KKeyStore interfaces
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/lockfile.h>
+
+#include <kfg/keystore.h>
+#include <kfg/keystore-priv.h>
+#include <kfg/config.h>
+#include <kfg/kfg-priv.h>
+
+#include <klib/text.h>
+
+#include <kproc/thread.h>
+
+#include <fstream>
+#include <stdexcept>
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(KeyStoreTestSuite);
+
+TEST_CASE(KeyStoreMake)
+{
+    KKeyStore* ks = 0;
+    REQUIRE_RC(KKeyStoreMake(&ks, NULL));
+    REQUIRE_NOT_NULL(ks);
+    REQUIRE_RC(KKeyStoreRelease(ks));
+}
+
+class KeyStoreFixture
+{
+public:
+    KeyStoreFixture()
+    : key(0)
+    {
+        if (KConfigMake(&kfg, NULL) != 0)
+           throw logic_error("KeyStoreFixture: KConfigMake failed");
+        if (KKeyStoreMake(&ks, kfg) != 0)
+           throw logic_error("KeyStoreFixture: KKeyStoreMake failed");
+        if (KDirectoryNativeDir(&wd) != 0)
+           throw logic_error("KeyStoreFixture: KDirectoryNativeDir failed");
+    }
+    ~KeyStoreFixture()
+    {
+        if (KEncryptionKeyRelease(key) != 0)
+           throw logic_error("~KeyStoreFixture: KEncryptionKeyRelease failed");
+        if (KDirectoryRelease(wd) != 0)
+           throw logic_error("~KeyStoreFixture: KDirectoryRelease failed");
+        if (KKeyStoreRelease(ks) != 0)
+           throw logic_error("~KeyStoreFixture: KKeyStoreRelease failed");
+        if (KConfigRelease(kfg) != 0)
+           throw logic_error("~KeyStoreFixture: KConfigRelease failed");
+    }
+    void KfgUpdateNode(const char* key, const char* value)
+    {
+        KConfigNode *node;
+        if (KConfigOpenNodeUpdate(kfg, &node, key) != 0)
+            throw logic_error("KfgUpdateNode: KConfigOpenNodeUpdate failed");
+        if (KConfigNodeWrite(node, value, string_measure(value, NULL)) != 0)
+            throw logic_error("KfgUpdateNode: KConfigNodeWrite failed");
+        if (KConfigNodeRelease(node) != 0)
+            throw logic_error("KfgUpdateNode: KConfigNodeRelease failed");
+    }    
+
+    KConfig* kfg;
+    KKeyStore* ks;
+    KDirectory* wd;
+    KEncryptionKey* key;
+};
+
+// NB: strangely enough, KKeyStoreGetKey ignores its 2nd parameter (obj_name)
+
+FIXTURE_TEST_CASE(KeyStoreGetKey_TempFile, KeyStoreFixture)
+{
+    const char tempKey[] = "tempkey from file";
+    {
+        ofstream f(GetName());
+        f << tempKey;
+    }
+
+    const KFile* file;
+    REQUIRE_RC(KDirectoryOpenFileRead(wd, &file, GetName()));
+    
+    REQUIRE_RC(KKeyStoreSetTemporaryKeyFromFile(ks, file));
+    
+    REQUIRE_RC(KKeyStoreGetKey(ks, "boohoo i am ignored here", &key)); 
+    REQUIRE_NOT_NULL(key);
+    REQUIRE_EQ(string(tempKey), string(key->value.addr, key->value.len));
+    
+    // now. ask to forget
+    REQUIRE_RC(KKeyStoreSetTemporaryKeyFromFile(ks, NULL));
+    REQUIRE_RC_FAIL(KKeyStoreGetKey(ks, "boohoo i am ignored here", &key)); 
+    
+    REQUIRE_RC(KFileRelease(file));
+    REQUIRE_RC(KDirectoryRemove(wd, true, GetName()));
+}
+
+FIXTURE_TEST_CASE(KeyStoreGetKey_Kfg_Default, KeyStoreFixture)
+{
+    REQUIRE_RC_FAIL(KKeyStoreGetKey(ks, "", &key));
+}
+
+FIXTURE_TEST_CASE(KeyStoreGetKey_Kfg, KeyStoreFixture)
+{
+    const char tempKey[] = "tempkey from file";
+    {
+        ofstream f(GetName());
+        f << tempKey << endl;
+    }
+    
+    KfgUpdateNode(KFG_KRYPTO_PWFILE, GetName());
+    
+    REQUIRE_RC(KKeyStoreSetConfig(ks, kfg));
+    
+    REQUIRE_RC(KKeyStoreGetKey(ks, NULL, &key));
+    REQUIRE_NOT_NULL(key);
+    REQUIRE_EQ(string(tempKey), string(key->value.addr, key->value.len));
+    
+    REQUIRE_RC(KDirectoryRemove(wd, true, GetName()));
+}
+
+FIXTURE_TEST_CASE(KeyStoreGetKey_Protected, KeyStoreFixture)
+{
+    const char tempKey[] = "another tempkey from file";
+    {
+        ofstream f(GetName());
+        f << tempKey << endl;
+    }
+    
+    KfgUpdateNode("/repository/user/protected/dbGaP-2956/root", ".");
+    KfgUpdateNode("/repository/user/protected/dbGaP-2956/encryption-key-path", GetName());
+
+    REQUIRE_RC(KKeyStoreSetConfig(ks, kfg));
+    
+    REQUIRE_RC(KKeyStoreGetKey(ks, "just give us the current repo's key", &key));
+    REQUIRE_NOT_NULL(key);
+    REQUIRE_EQ(string(tempKey), string(key->value.addr, key->value.len));
+    
+    REQUIRE_RC(KDirectoryRemove(wd, true, GetName()));
+}
+
+FIXTURE_TEST_CASE(KeyStoreGetKeyById_Protected, KeyStoreFixture)
+{
+    const char tempKey[] = "another tempkey from file";
+    {
+        ofstream f(GetName());
+        f << tempKey << endl;
+    }
+    
+    KfgUpdateNode("/repository/user/protected/dbGaP-2956/root", ".");
+    KfgUpdateNode("/repository/user/protected/dbGaP-2956/encryption-key-path",
+        "wrong file!");
+    KfgUpdateNode("/repository/user/protected/dbGaP-2957/root", ".");
+    KfgUpdateNode("/repository/user/protected/dbGaP-2957/encryption-key-path",
+        GetName());
+
+    REQUIRE_RC(KKeyStoreSetConfig(ks, kfg));
+    
+    REQUIRE_RC(KKeyStoreGetKeyByProjectId(ks,
+        "give us the key for 2957", &key, 2957));
+    REQUIRE_NOT_NULL(key);
+    REQUIRE_EQ(string(tempKey), string(key->value.addr, key->value.len));
+    
+    REQUIRE_RC(KDirectoryRemove(wd, true, GetName()));
+}
+
+//
+//  Object Id / Object name bindings
+//
+
+class ObjIdBindingFixture : public KeyStoreFixture 
+{
+public:
+    ObjIdBindingFixture()
+    {
+    }
+    ~ObjIdBindingFixture()
+    {
+        if (bindings.length() != 0 && KDirectoryRemove(wd, true, bindings.c_str()) != 0)
+           throw logic_error("ObjIdBindingFixture::TearDown: KDirectoryRemove failed");   
+    }
+    void SetUp(const string& bindingsFileName)
+    {
+        bindings = string("./") + bindingsFileName;
+        if (KKeyStoreSetBindingsFile(ks, bindings.c_str()) != 0)
+           throw logic_error("ObjIdBindingFixture::SetUp: KeyStoreSetBindingsFile failed");   
+        KDirectoryRemove(wd, true, bindings.c_str());  // does not have to exist
+    }
+    
+    string bindings;
+};
+
+FIXTURE_TEST_CASE(ObjIdRegister, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    String name1;
+    CONST_STRING(&name1, "name1");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 1, &name1));
+    
+    String name2;
+    CONST_STRING(&name2, "name2");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 2, &name2));
+}
+
+FIXTURE_TEST_CASE(ObjIdRegister_Found_Same, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    String name1;
+    CONST_STRING(&name1, "name1");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 1, &name1));
+    
+    String name2;
+    CONST_STRING(&name2, "name2");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 2, &name2));
+    
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 1, &name1)); // same name, no problem
+}
+
+FIXTURE_TEST_CASE(ObjIdRegister_Found_Different, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    String name1;
+    CONST_STRING(&name1, "name1");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 1, &name1));
+    
+    String name2;
+    CONST_STRING(&name2, "name2");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 2, &name2));
+    
+    REQUIRE_RC_FAIL(KKeyStoreRegisterObject(ks, 1, &name2)); // name differs
+}
+
+FIXTURE_TEST_CASE(ObjIdById_Found, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+
+    String name123;
+    CONST_STRING(&name123, "name123");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 123, &name123));
+    
+    String name12;
+    CONST_STRING(&name12, "name12");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 12, &name12));
+    
+    String name1;
+    CONST_STRING(&name1, "name1");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 1, &name1));
+    
+    const String* res;
+    
+    REQUIRE_RC(KKeyStoreGetObjectName(ks, 123, &res));
+    REQUIRE_NOT_NULL(res);
+    REQUIRE_EQ(StringCompare(res, &name123), 0);
+    StringWhack(res);
+    
+    REQUIRE_RC(KKeyStoreGetObjectName(ks, 12, &res));
+    REQUIRE_NOT_NULL(res);
+    REQUIRE_EQ(StringCompare(res, &name12), 0);
+    StringWhack(res);
+    
+    REQUIRE_RC(KKeyStoreGetObjectName(ks, 1, &res));
+    REQUIRE_NOT_NULL(res);
+    REQUIRE_EQ(StringCompare(res, &name1), 0);
+    StringWhack(res);
+}
+
+FIXTURE_TEST_CASE(ObjIdById_NotFound, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    String name100;
+    CONST_STRING(&name100, "name100");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 100, &name100));
+    
+    String name200;
+    CONST_STRING(&name200, "name200");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 200, &name200));
+    
+    const String* res;
+    REQUIRE_RC_FAIL(KKeyStoreGetObjectName(ks, 100200, &res));
+}
+
+FIXTURE_TEST_CASE(ObjId_DefaultLocation, ObjIdBindingFixture)
+{
+    const String* res;
+    REQUIRE_RC_FAIL(KKeyStoreGetObjectName(ks, 1, &res)); // this will fail but set location to default
+    
+    // verify default location
+    String* home;
+    REQUIRE_RC(KConfigReadString(kfg, "NCBI_HOME", &home));
+    REQUIRE_NOT_NULL(home);
+    
+    const char* loc = KKeyStoreGetBindingsFile(ks);
+    REQUIRE_NOT_NULL(loc);
+    REQUIRE_EQ(string(loc), string(home->addr, home->size) + "/objid.mapping"); 
+    StringWhack(home);
+}
+
+FIXTURE_TEST_CASE(ObjIdByName_Found, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    String name11;
+    CONST_STRING(&name11, "name11");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 11, &name11));
+    
+    String name21;
+    CONST_STRING(&name21, "name21");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 21, &name21));
+    
+    String name1;
+    CONST_STRING(&name1, "name1");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 1, &name1));
+    
+    uint32_t id;
+    
+    REQUIRE_RC(VKKeyStoreGetObjectId(ks, &name11, &id));
+    REQUIRE_EQ((uint32_t)11, id);
+
+    REQUIRE_RC(VKKeyStoreGetObjectId(ks, &name21, &id));
+    REQUIRE_EQ((uint32_t)21, id);
+    
+    REQUIRE_RC(VKKeyStoreGetObjectId(ks, &name1, &id));
+    REQUIRE_EQ((uint32_t)1, id);
+}
+FIXTURE_TEST_CASE(ObjIdByName_NotFound, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    String name11;
+    CONST_STRING(&name11, "name11");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 11, &name11));
+    
+    String name21;
+    CONST_STRING(&name21, "name21");
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 21, &name21));
+    
+    String name1;
+    CONST_STRING(&name1, "name1");
+    
+    uint32_t id;
+    
+    REQUIRE_RC_FAIL(VKKeyStoreGetObjectId(ks, &name1, &id));
+}
+
+FIXTURE_TEST_CASE(ObjIdRegister_Lock, ObjIdBindingFixture)
+{   // make sure registration fails while the file is locked
+    SetUp(GetName());
+
+    KFile* lockedFile;
+    REQUIRE_RC(KDirectoryCreateExclusiveAccessFile(wd, &lockedFile, true, 0600, kcmOpen, GetName()));
+    
+    String name11;
+    CONST_STRING(&name11, "name11");
+    REQUIRE_RC_FAIL(KKeyStoreRegisterObject(ks, 11, &name11));
+    
+    REQUIRE_RC(KFileRelease(lockedFile));
+    
+    // now, will work
+    REQUIRE_RC(KKeyStoreRegisterObject(ks, 11, &name11));
+}
+
+//////////////////////////////////////////// Main
+
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-keystore";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=KeyStoreTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kfg/kfgtest.cpp b/test/kfg/kfgtest.cpp
new file mode 100644
index 0000000..bb37b1c
--- /dev/null
+++ b/test/kfg/kfgtest.cpp
@@ -0,0 +1,1030 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for Kfg interface
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <kapp/args.h> /* Args */
+
+#include <kfg/config.h>
+#include <kfg/extern.h>
+#include <kfg/repository.h> /* KConfigImportNgc */
+
+#include <os-native.h>
+
+#if !WINDOWS
+    #include <sys/utsname.h>
+#endif
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <kfs/directory.h>
+#include <kfs/dyload.h>
+#include <kfs/impl.h>
+
+#include <klib/debug.h> /* KDbgSetModConds */
+#include <klib/log.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/writer.h>
+
+#include <stdexcept>
+
+#include <cstdlib>
+#include <cstring>
+
+using namespace std;
+
+#define ALL
+
+static rc_t argsHandler(int argc, char* argv[]);
+TEST_SUITE_WITH_ARGS_HANDLER(KfgTestSuite, argsHandler);
+
+// test fixture for creation and lookup of kfg files
+class KfgFixture
+{
+public:
+    KfgFixture() : wd(0), kfg(0), file(0), path(0), node(0)
+    {
+        if ( KDirectoryNativeDir ( & wd ) != 0 )
+            throw logic_error("KfgFixture: KDirectoryNativeDir failed");
+            
+        if (KConfigMake ( & kfg, NULL ) != 0)
+            throw logic_error("KfgFixture: KConfigMake failed");
+            
+        if (apppath.length() == 0) // first call
+        {
+            if (!GetValue("APPPATH", apppath))
+                throw logic_error("KfgFixture: GetValue failed");
+        }
+    }
+    ~KfgFixture() 
+    {
+        if ( node != 0 && KConfigNodeRelease(node) )
+            throw logic_error("~KfgFixture: KConfigNodeRelease failed");
+        
+        if ( KConfigRelease ( kfg ) != 0 )
+            throw logic_error("~KfgFixture: KConfigRelease failed");
+            
+        if ( KDirectoryRelease ( wd ) != 0 )
+            throw logic_error("~KfgFixture: KDirectoryRelease failed");
+            
+        if ( KFileRelease( file ) != 0 )
+            throw logic_error("~KfgFixture: KFileRelease failed");
+            
+        if ( path && VPathRelease ( path) != 0 )
+            throw logic_error("~KfgFixture: VPathRelease failed");
+    }
+    void CreateFile(const char* name, const char* contents)
+    {
+        if (KDirectoryCreateFile(wd, &file, true, 0664, kcmInit, name) != 0)
+            throw logic_error("CreateFile: KDirectoryCreateFile failed");
+
+        size_t num_writ=0;
+        if (KFileWrite(file, 0, contents, strlen(contents), &num_writ) != 0)
+            throw logic_error("CreateFile: KFileWrite failed");
+
+        if (KFileRelease(file) != 0)
+            throw logic_error("CreateFile: KFileRelease failed");
+        
+        file=0;
+    }
+    
+    void LoadFile(const char* name)
+    {
+        if (KDirectoryOpenFileRead(wd, (const KFile**)&file, name) != 0)
+            throw logic_error("LoadFile: KDirectoryOpenFileRead failed");
+            
+        if (KConfigLoadFile ( kfg, name, file) != 0)
+            throw logic_error("LoadFile: KConfigLoadFile failed");
+
+        if (KFileRelease(file) != 0)
+            throw logic_error("LoadFile: KFileRelease failed");
+            
+        file=0;
+    }
+
+    void CreateAndLoad(const char* name, const char* contents)
+    {
+#ifdef DBG_KFG
+        cout << "26 CreateAndLoad(" << name << ")\n";
+#endif
+        CreateFile(name, contents);
+        LoadFile(name);
+        // the .kfg is not needed anymore
+        if (KDirectoryRemove(wd, true, name) != 0)
+            throw logic_error("CreateAndLoad: KDirectoryRemove failed");
+#ifdef DBG_KFG
+        cout << "32 CreateAndLoad(" << name << ")\n";
+#endif
+    }
+
+    bool GetValue(const char* path, string& value)
+    {
+        const KConfigNode *node;
+        rc_t rc=KConfigOpenNodeRead(kfg, &node, "%.*s", strlen(path), path);
+        if (rc == 0) 
+        {
+            rc = KConfigNodeRead(node, 0, buf, BufSize, &num_read, NULL);
+            if (rc != 0)
+                throw logic_error("GetValue: KConfigNodeRead failed");
+            buf[num_read]=0;
+            value=buf;
+            return KConfigNodeRelease(node) == 0;
+        }
+        return false;
+    }
+    bool ValueMatches(const char* path, const char* value, bool nullAsEmpty=false)
+    {
+        if (nullAsEmpty && value == 0)
+        {
+            value="";
+        }
+        string v;
+        if (GetValue(path, v))
+        {
+            bool ret=true;
+            if (v != string(value, strlen(value)))
+            {
+                cerr << "ValueMatches mismatch: expected='" << value << "', actual='" << v << "'" << endl;
+                ret=false;
+            }
+            return ret;
+        }
+        return false;
+    }
+    void UpdateNode(const char* key, const char* value)
+    {
+        KConfigNode *node;
+        if (KConfigOpenNodeUpdate(kfg, &node, key) != 0)
+            throw logic_error("UpdateNode: KConfigOpenNodeUpdate failed");
+        if (KConfigNodeWrite(node, value, strlen(value)) != 0)
+            throw logic_error("UpdateNode: KConfigNodeWrite failed");
+        if (KConfigNodeRelease(node) != 0)
+            throw logic_error("UpdateNode: KConfigNodeRelease failed");
+    }
+
+    string DirPath(const KDirectory* dir)
+    {
+        char resolved[4097];
+        if (KDirectoryResolvePath(dir, true, resolved, sizeof resolved, ".") == 0)
+        {
+            return string(resolved);
+        }
+        else
+        {
+            return "??";
+        }
+    }
+    string GetHomeDirectory()
+    {   
+        string ret;
+        if (getenv("HOME") != NULL)
+            ret = getenv("HOME");
+        else if (getenv("USERPROFILE") != NULL) // on Windows the value is taken from USERPROFILE
+            ret = getenv("USERPROFILE");
+        
+        if (KDirectoryResolvePath(wd, true, buf, sizeof(buf), ret.c_str()) != 0)
+            throw logic_error("GetHomeDirectory: KDirectoryResolvePath failed");
+        
+        return string(buf);
+    }
+    const KConfigNode* GetNode(const char* path) 
+    {
+        if ( node != 0 && KConfigNodeRelease(node) )
+            throw logic_error("GetNode: KConfigNodeRelease failed");
+        if (KConfigOpenNodeRead(kfg, (const KConfigNode**)&node, path) != 0)
+            throw logic_error("GetNode: KConfigOpenNodeRead failed");
+        return node;
+    }
+    string ReadContent(const string& fileName)
+    {
+        KFile* f;
+        KDirectoryOpenFileRead(wd, (const KFile**)&f, fileName.c_str());
+    
+        if (KFileReadAll ( f, 0, buf, BufSize, &num_read ) != 0)
+           throw logic_error("ReadContent: KFileReadAll failed");   
+           
+        KFileRelease(f);
+        return string(buf, num_read);
+    }    
+    
+    KDirectory* wd;
+    KConfig* kfg;
+    KFile* file;
+    VPath* path;
+    
+    KConfigNode* node;
+    
+    static const int BufSize = 8192;
+    char buf[BufSize];
+    size_t num_read;
+    size_t num_writ;
+
+    static string apppath; // only gets set for the 1st instance of KConfig; save it here for the corresponding test case
+};
+string KfgFixture::apppath; 
+
+///////////////////////////////////////////////// KFG parser test cases
+
+#ifdef ALL
+FIXTURE_TEST_CASE(KConfigLoadFile_should_report_null_inputs, KfgFixture)
+{
+    KFile file;
+    REQUIRE_RC_FAIL(KConfigLoadFile ( 0, "qweert", &file));
+    REQUIRE_RC_FAIL(KConfigLoadFile ( kfg, "qweert", 0));
+}
+
+FIXTURE_TEST_CASE(one_name_value_double_quotes, KfgFixture)
+{
+    CreateAndLoad(GetName(), "name=\"value\"");
+    REQUIRE(ValueMatches("name", "value"));
+}
+
+FIXTURE_TEST_CASE(one_pathname_value_single_quotes, KfgFixture)
+{
+    CreateAndLoad(GetName(), "root/subname/name='val'");
+    REQUIRE(ValueMatches("root/subname/name", "val"));
+}
+
+FIXTURE_TEST_CASE(numeric_pathnames, KfgFixture)
+{   
+    CreateAndLoad(GetName(), " root1/1 = 'val1'\n");
+    REQUIRE(ValueMatches("root1/1", "val1"));
+}
+
+FIXTURE_TEST_CASE(multiple_pathnames, KfgFixture)
+{   // sprinkle some spaces and tabs (only allowed outside pathnames)
+    const char* contents=" root1/subname1/name1 =\t \"val1\"\n"
+                         "root1/subname1/name2 =\t \"val2\"\n"
+                         "\troot1/subname2/name3\t = \"val3\"\n"
+                         "root1/subname2/name4\t = \"val4\"\n"
+                         "root2/subname1/name5 =\t \"val5\"\n"
+                         "root2/subname2/name6 = \"val6\"\n";
+    CreateAndLoad(GetName(), contents);
+
+    REQUIRE(ValueMatches("root1/subname1/name1", "val1"));
+    REQUIRE(ValueMatches("root1/subname1/name2", "val2"));
+    REQUIRE(ValueMatches("root1/subname2/name3", "val3"));
+    REQUIRE(ValueMatches("root1/subname2/name4", "val4"));
+    REQUIRE(ValueMatches("root2/subname1/name5", "val5"));
+    REQUIRE(ValueMatches("root2/subname2/name6", "val6"));
+}
+
+FIXTURE_TEST_CASE(comments, KfgFixture)
+{
+    const char* contents="root1/subname1/name1 ='val1'\n"
+                         "root1/subname1/name2 ='val2'\n"
+                         "#root1/subname1/name1='val11'\n"       // the commented out lines do not override the lines with the same paths above
+                         "/*root1/subname1/name2=\"val12\"*/\n";
+    CreateAndLoad(GetName(), contents);
+
+    REQUIRE(ValueMatches("root1/subname1/name1", "val1"));
+    REQUIRE(ValueMatches("root1/subname1/name2", "val2"));
+}
+
+FIXTURE_TEST_CASE(unescaping_escapes, KfgFixture)
+{   
+    CreateAndLoad(GetName(), "name='\\a'\n");
+    REQUIRE(ValueMatches("name", "\a"));
+}
+
+FIXTURE_TEST_CASE(dots_in_pathnames, KfgFixture)
+{   
+    CreateAndLoad(GetName(), "root.1./subname1.ext='val100'\n");
+    REQUIRE(ValueMatches("root.1./subname1.ext", "val100"));
+}
+
+FIXTURE_TEST_CASE(variable_expansion_simple, KfgFixture)
+{
+    const char* contents="var='value'\n"
+                         "ref=$(var)\n";
+    CreateAndLoad(GetName(), contents);
+
+    REQUIRE(ValueMatches("var", "value"));
+    REQUIRE(ValueMatches("ref", "value"));
+}
+
+FIXTURE_TEST_CASE(variable_expansion_concat, KfgFixture)
+{
+    const char* contents="var1='value1'\n"
+                         "var2='value2'\n"
+                         "ref=\"$(var1)'$(var2)\"\n";
+    CreateAndLoad(GetName(), contents);
+
+    REQUIRE(ValueMatches("ref", "value1'value2"));
+}
+
+FIXTURE_TEST_CASE(variable_expansion_path, KfgFixture)
+{
+    const char* contents="root/var='value'\n"
+                         "ref=$(root/var)\n";
+    CreateAndLoad(GetName(), contents);
+
+    REQUIRE(ValueMatches("ref", "value"));
+}
+
+FIXTURE_TEST_CASE(in_string_variable_expansion_path, KfgFixture)
+{
+    const char* contents="root/var='value'\n"
+                         "ref=\"+$(root/var)+\"\n";
+    CreateAndLoad(GetName(), contents);
+
+    REQUIRE(ValueMatches("ref", "+value+"));
+}
+
+FIXTURE_TEST_CASE(can_reference_keys_across_files, KfgFixture)
+{  
+    const char* contents1="root/var='Value'\n";
+    CreateAndLoad((string(GetName())+"1").c_str(), contents1);
+    const char* contents2="ref=$(root/var)\n";
+    CreateAndLoad((string(GetName())+"2").c_str(), contents2);
+
+    REQUIRE(ValueMatches("ref", "Value"));
+}
+
+FIXTURE_TEST_CASE(long_key, KfgFixture)
+{
+    string key(1025, 'k');
+    CreateAndLoad(GetName(), (key+"='value'").c_str());
+    REQUIRE(ValueMatches(key.c_str(), "value"));
+}
+
+FIXTURE_TEST_CASE(long_path, KfgFixture)
+{
+    string path=string(4097, 'v');
+    string line("k='");
+    line+=path;
+    line+="'";
+    CreateAndLoad(GetName(), line.c_str());
+    REQUIRE(ValueMatches("k", path.c_str()));
+}
+
+///////////////////////////////////////////////// predefined variables
+FIXTURE_TEST_CASE(predef_LIBPATH, KfgFixture)
+{
+#if WINDOWS && !_STATIC
+    // since this program and libkfg.dll live in different directories, they contain separate copies of KConfigMake under Windows, 
+    // so we cannot compare them
+#else
+    const char* contents="var=$(vdb/lib/paths/kfg)\n";
+    CreateAndLoad(GetName(), contents);
+
+    KDyld *dyld;
+    REQUIRE_RC(KDyldMake ( & dyld ));
+    const KDirectory *dir;
+    REQUIRE_RC(KDyldHomeDirectory ( dyld, & dir, ( fptr_t ) KConfigMake ));
+    REQUIRE(ValueMatches("var", DirPath(dir).c_str()));
+    KDirectoryRelease ( dir );
+    KDyldRelease ( dyld );
+#endif
+}
+
+FIXTURE_TEST_CASE(predef_KFGDIR, KfgFixture)
+{
+    CreateAndLoad(GetName(), "var=$(kfg/dir)\n");
+    REQUIRE(ValueMatches("var", DirPath(wd).c_str()));
+}
+FIXTURE_TEST_CASE(predef_KFGNAME, KfgFixture)
+{
+    CreateAndLoad(GetName(), "var=$(kfg/name)\n");
+    REQUIRE(ValueMatches("var", GetName()));
+}
+
+
+FIXTURE_TEST_CASE(predef_ARCHNAME, KfgFixture)
+{
+    CreateAndLoad(GetName(), "var=$(kfg/arch/name)\n");
+    #if WINDOWS
+        REQUIRE(ValueMatches("var", ""));
+    #else
+        struct utsname name;
+        REQUIRE_NE(uname(&name), -1);
+        REQUIRE(ValueMatches("var", name.nodename));
+    #endif
+}
+FIXTURE_TEST_CASE(predef_ARCHBITS, KfgFixture)
+{
+    CreateAndLoad(GetName(), "var=$(kfg/arch/bits)\n");
+    string_printf(buf, sizeof(buf), &num_writ, "%d", _ARCH_BITS);
+    REQUIRE(ValueMatches("var", buf));
+}
+
+FIXTURE_TEST_CASE(predef_OS, KfgFixture)
+{
+    CreateAndLoad(GetName(), "var=$(OS)\n");
+    #if LINUX
+        #define OS "linux"
+    #elif SUN
+        #define OS "sun"    
+    #elif MAC 
+        #define OS "mac"
+    #elif WINDOWS
+        #define OS "win"
+    #endif
+    REQUIRE(ValueMatches("var", OS));
+    #undef OS
+ }
+
+#if 0 // 8/11/14 - no longer distinguishing linkage
+FIXTURE_TEST_CASE(predef_BUILD_LINKAGE, KfgFixture)
+{
+    CreateAndLoad(GetName(), "var=$(BUILD_LINKAGE)\n");
+    #if _STATIC
+        #define BUILD_LINKAGE "STATIC"
+    #else
+        #define BUILD_LINKAGE "DYNAMIC"
+    #endif
+    REQUIRE(ValueMatches("var", BUILD_LINKAGE));
+    #undef BUILD_LINKAGE
+}
+#endif
+
+FIXTURE_TEST_CASE(predef_BUILD, KfgFixture)
+{
+    CreateAndLoad(GetName(), "var=$(BUILD)\n");
+    #if _PROFILING
+        #define BUILD "PROFILE"
+    #else
+        #if _DEBUGGING
+            #define BUILD "DEBUG"
+        #else 
+            #define BUILD "RELEASE"
+        #endif
+    #endif
+    REQUIRE(ValueMatches("var", BUILD));
+    #undef BUILD
+}
+
+#if 0 // only appropriate when invoked by a canonical path ?
+FIXTURE_TEST_CASE(predef_APPPATH, KfgFixture)
+{
+    // REQUIRE_RC(CreateAndLoad(GetName(), "var=$(APPPATH)\n")); 
+    // APPPATH is only set correctly for the 1st instance of KConfig, so we saved it off in the first call to fixture's 
+    // constructor, test here
+    string path(ncbi::NK::GetTestSuite()->argv[0]);
+    string::size_type lastSlash=path.find_last_of("/");
+    if (lastSlash == string::npos)
+    {
+        lastSlash=path.find_last_of("\\");
+    }
+    if (lastSlash != string::npos)
+    {
+        path.erase(lastSlash);
+    }
+    REQUIRE_EQ(strcase_cmp(apppath.c_str(), apppath.length(), 
+                           path.c_str(), path.length(), 
+                           max(apppath.length(), path.length())), 
+               0);
+}
+#endif
+
+FIXTURE_TEST_CASE(predef_APPNAME, KfgFixture)
+{
+    CreateAndLoad(GetName(), "var=$(APPNAME)\n");
+    REQUIRE_RC(LogAppName(buf, sizeof(buf), &num_writ));
+    buf[num_writ]=0;
+    REQUIRE(ValueMatches("var", buf));
+}
+
+FIXTURE_TEST_CASE(predef_PWD, KfgFixture)
+{
+    CreateAndLoad(GetName(), "var=$(PWD)\n");
+    KDirectory* dir;
+    REQUIRE_RC(KDirectoryNativeDir(&dir));
+    REQUIRE(ValueMatches("var", DirPath(dir).c_str()));
+    KDirectoryRelease(dir);
+}
+#endif
+
+#ifdef ALL
+FIXTURE_TEST_CASE(predef_ENV, KfgFixture)
+{
+    const char* contents=
+        "host=$(HOST)\n"
+        "user=$(USER)\n"
+        "vdb_root=$(VDB_ROOT)\n"
+        "vdb_config=$(VDB_CONFIG)\n"
+        "home=$(HOME)\n"
+        "ncbi_home=$(NCBI_HOME)\n"
+        "ncbi_settings=$(NCBI_SETTINGS)\n"
+        ;
+    CreateAndLoad(GetName(), contents);
+    REQUIRE(ValueMatches("host",            getenv("HOST"), true));
+    REQUIRE(ValueMatches("user",            getenv("USER"), true));
+    REQUIRE(ValueMatches("vdb_root",        getenv("VDB_ROOT"), true));
+    REQUIRE(ValueMatches("vdb_config",      getenv("VDB_CONFIG"), true));
+    REQUIRE(ValueMatches("home",            GetHomeDirectory().c_str(), true));
+    REQUIRE(ValueMatches("ncbi_home",       (GetHomeDirectory()+"/.ncbi").c_str(), true));
+    REQUIRE(ValueMatches("ncbi_settings",   (GetHomeDirectory()+"/.ncbi/user-settings.mkfg").c_str(), true));
+}
+#endif
+
+#ifdef ALL
+FIXTURE_TEST_CASE(predef_ENV_direct, KfgFixture)
+{   // can also refer to predefs by their unadorned name
+    REQUIRE(ValueMatches("HOST",            getenv("HOST"), true));
+    REQUIRE(ValueMatches("USER",            getenv("USER"), true));
+    REQUIRE(ValueMatches("VDB_ROOT",        getenv("VDB_ROOT"), true));
+    REQUIRE(ValueMatches("VDB_CONFIG",      getenv("VDB_CONFIG"), true));
+    REQUIRE(ValueMatches("HOME",            GetHomeDirectory().c_str(), true));
+    REQUIRE(ValueMatches("NCBI_HOME",       (GetHomeDirectory()+"/.ncbi").c_str(), true));
+    REQUIRE(ValueMatches("NCBI_SETTINGS",   (GetHomeDirectory()+"/.ncbi/user-settings.mkfg").c_str(), true));
+}
+
+#if 0
+FIXTURE_TEST_CASE(include_files, KfgFixture)
+{  
+#define includeName "include_file"
+    const char* contents1="root/var='Value'\n";
+    CreateFile((GetName()+"1").c_str(), contents1);
+    const char* contents2="include ./" includeName "\n"
+                          "ref=$(root/var)\n";
+    CreateAndLoad((GetName()+"2").c_str(), contents2);
+
+    REQUIRE(ValueMatches("ref", "Value"));
+    REQUIRE_RC(KDirectoryRemove(wd, true, includeName)); 
+}
+#endif
+#endif
+
+///////////////////////////////////////////////// modification and commit
+
+#ifdef ALL
+FIXTURE_TEST_CASE(ChangeCommit, KfgFixture)
+{
+    const char* contents=
+        "one=\"1\"\n"
+        "one/two=\"2\"\n"
+        "one/two/three=\"3\"\n"
+        ;
+    // override NCBI_SETTINGS 
+    const char* LocalSettingsFile = "settings.mkfg";
+    string FullMagicPath = DirPath(wd) + "/" + LocalSettingsFile;
+    CreateAndLoad( GetName(), (string(contents) + "NCBI_SETTINGS=\"" + FullMagicPath + "\"\n").c_str() );
+    
+    // make, commit changes
+    UpdateNode("one", "1+0");
+    UpdateNode("one/two", "0+2");
+    REQUIRE_RC(KConfigCommit(kfg));
+    REQUIRE_RC(KConfigRelease(kfg));
+    
+    // load the changes from the new location
+    REQUIRE_RC(KConfigMake(&kfg,wd));
+    LoadFile(FullMagicPath.c_str());
+    
+    // verify changes
+    REQUIRE(ValueMatches("one", "1+0"));
+    REQUIRE(ValueMatches("one/two", "0+2"));
+    string s;
+    REQUIRE(! GetValue("one/two/three", s)); // unchanged values are not saved
+    
+    REQUIRE_RC(KDirectoryRemove(wd, true, LocalSettingsFile));     
+}
+
+FIXTURE_TEST_CASE(ChangeCommitEscapes, KfgFixture)
+{
+    const char* LocalSettingsFile = "settings.mkfg";
+    string FullMagicPath = DirPath(wd) + "/" + LocalSettingsFile;
+    CreateAndLoad( GetName(), (string() + "NCBI_SETTINGS=\"" + FullMagicPath + "\"\n").c_str() );
+    
+    // make, commit changes
+    UpdateNode("double/quote", "\"");
+    UpdateNode("escaped/hex", "\x0a");
+    REQUIRE_RC(KConfigCommit(kfg));
+    REQUIRE_RC(KConfigRelease(kfg));
+    
+    // load the changes from the new location
+    REQUIRE_RC(KConfigMake(&kfg,wd));
+    LoadFile(FullMagicPath.c_str());
+    
+    // verify changes
+    REQUIRE(ValueMatches("double/quote", "\""));
+    REQUIRE(ValueMatches("escaped/hex", "\x0a"));
+    
+    REQUIRE_RC(KDirectoryRemove(wd, true, LocalSettingsFile));     
+}
+
+FIXTURE_TEST_CASE(DropAllChildren, KfgFixture)
+{
+    CreateAndLoad(GetName(), "parent/one='1'\nparent/two='2'");
+    GetNode("parent");
+    struct KNamelist *children;
+    REQUIRE_RC(KConfigNodeListChildren(node, &children));
+    uint32_t count;
+    REQUIRE_RC(KNamelistCount(children, &count));
+    REQUIRE_EQ(count, (uint32_t)2);
+    KNamelistRelease(children);
+
+    REQUIRE_RC(KConfigNodeDropAll((KConfigNode*)node));
+    REQUIRE_RC(KConfigNodeListChildren(node, &children));
+    REQUIRE_RC(KNamelistCount(children, &count));
+    REQUIRE_EQ(count, (uint32_t)0);
+    KNamelistRelease(children);
+}
+
+FIXTURE_TEST_CASE(FixUserSettings, KfgFixture)
+{   // fix spelling of nodes dbGap-<number> to dbGaP-<number>
+    
+    // read values from a local .mkfg file; 
+    // if anything is changed the new values will be saved in the user's "global" .mkfg
+
+    string mkfgFilename = "./user-settings.mkfg";
+    // fake global settings since we do not want to modify the real ~/.ncbi/user-settings.mkfg
+    string globalMkfgFilename = "./global-settings.mkfg"; 
+
+    REQUIRE_RC(KConfigRelease(kfg));
+    // create the local .mkfg with the old spelling of dbGap;
+    CreateFile(mkfgFilename.c_str(), 
+                    (string("NCBI_SETTINGS=\"") + globalMkfgFilename + "\"\n"
+                     "/repository/user/protected/dbGap-123=\"qq\"\n").c_str());    
+    REQUIRE_RC(KConfigMake ( & kfg, wd )); // this should load the local .mkfg, replace "dbGap" with "dbGaP" and update the global .mkfg
+
+    // verify corrected value in memory
+    REQUIRE(ValueMatches("/repository/user/protected/dbGaP-123", "qq"));
+
+    // verify that user's global mkfg has been updated
+    string globalContent = ReadContent(globalMkfgFilename);
+    REQUIRE_NE(globalContent.find("/repository/user/protected/dbGaP-123 = \"qq\""), string::npos);
+
+    REQUIRE_RC(KDirectoryRemove(wd, true, globalMkfgFilename.c_str()));
+    REQUIRE_RC(KDirectoryRemove(wd, true, mkfgFilename.c_str()));
+}
+
+//////////////////////////////////////////// KConfig Accessors
+
+FIXTURE_TEST_CASE(ConfigAccessBool, KfgFixture)
+{
+    const char* contents=
+        "bool/f=\"FALSE\"\n"
+        "bool/t=\"true\"\n"
+        "bool=\"dunno\"\n"
+        ;
+    CreateAndLoad(GetName(), contents);
+    bool b = true;
+    REQUIRE_RC(KConfigReadBool(kfg, "bool/f", &b));
+    REQUIRE(! b);
+    REQUIRE_RC(KConfigReadBool(kfg, "bool/t", &b));
+    REQUIRE(b);
+    REQUIRE_RC_FAIL(KConfigReadBool(kfg, "bool", &b));
+}
+
+FIXTURE_TEST_CASE(ConfigAccessInt, KfgFixture)
+{
+    const char* contents=
+        "int/i1=\"100\"\n"
+        "int/i2=\"-100000000000\"\n"
+        "int=\"0dunno\"\n"
+        ;
+    CreateAndLoad(GetName(), contents);
+    int64_t i = 0;
+    REQUIRE_RC(KConfigReadI64(kfg, "int/i1", &i));
+    REQUIRE_EQ(i, INT64_C(100));
+    REQUIRE_RC(KConfigReadI64(kfg, "int/i2", &i));
+    REQUIRE_EQ(i, INT64_C(-100000000000));
+    REQUIRE_RC_FAIL(KConfigReadI64(kfg, "int", &i));
+}
+
+FIXTURE_TEST_CASE(ConfigAccessUnsigned, KfgFixture)
+{
+    const char* contents=
+        "uint/i1=\"100000000000\"\n"
+        "uint=\"1dunno\"\n"
+        ;
+    CreateAndLoad(GetName(), contents);
+    uint64_t i = 0;
+    REQUIRE_RC(KConfigReadU64(kfg, "uint/i1", &i));
+    REQUIRE_EQ(i, UINT64_C(100000000000));
+    REQUIRE_RC_FAIL(KConfigReadU64(kfg, "uint", &i));
+}
+
+FIXTURE_TEST_CASE(ConfigAccessF64, KfgFixture)
+{
+    const char* contents=
+        "f64/i1=\"3.14\"\n"
+        "f64=\"2.3dunno\"\n"
+        ;
+    CreateAndLoad(GetName(), contents);
+    double f = 0.0;
+    REQUIRE_RC(KConfigReadF64(kfg, "f64/i1", &f));
+    REQUIRE_CLOSE(f, 3.14, 0.001);
+    REQUIRE_RC_FAIL(KConfigReadF64(kfg, "v64", &f));
+}
+
+FIXTURE_TEST_CASE(ConfigAccessVPath, KfgFixture)
+{
+    // example from vfs/path.h
+    // don't know where this comes from...
+    #define VPATH "ncbi-file:///c/scanned-data/0001/file.sra?enc&pwd-file=/c/Users/JamesMcCoy/ncbi.pwd"
+    
+    const char* contents=
+        "vpath/i1=\"" VPATH "\"\n" 
+        ;
+        
+    CreateAndLoad(GetName(), contents);
+    REQUIRE_RC(KConfigReadVPath(kfg, "vpath/i1", &path));
+    VPathReadUri(path, buf, sizeof(buf), &num_read);
+    REQUIRE_EQ(string(buf), string(VPATH));
+}
+
+FIXTURE_TEST_CASE(ConfigAccessString, KfgFixture)
+{
+    // another change to get rid of C:
+    // also, can't have multiple '?' in query
+    #define STRING "ncbi-file:///c/scanned-data/0001/file.sra?enc&pwd-file=/c/Users/JamesMcCoy/ncbi.pwd"
+    const char* contents=
+        "string/i1=\"" STRING "\"\n" 
+        ;
+        
+    CreateAndLoad(GetName(), contents);
+    String* str;
+    REQUIRE_RC(KConfigReadString(kfg, "string/i1", &str));
+    REQUIRE_NOT_NULL(str);
+    REQUIRE_EQ(string(str->addr), string(STRING));
+    StringWhack(str);
+}
+
+//////////////////////////////////////////// KConfigNode Accessors
+
+FIXTURE_TEST_CASE(ConfigNodeAccessBool, KfgFixture)
+{
+    const char* contents=
+        "bool/f=\"FALSE\"\n"
+        ;
+    CreateAndLoad(GetName(), contents);
+    bool b = true;
+    REQUIRE_RC(KConfigNodeReadBool(GetNode("bool/f"), &b));
+    REQUIRE(! b);
+}
+
+FIXTURE_TEST_CASE(ConfigNodeAccessInt, KfgFixture)
+{
+    const char* contents=
+        "int/i1=\"100\"\n"
+        ;
+    CreateAndLoad(GetName(), contents);
+    int64_t i = 0;
+    REQUIRE_RC(KConfigNodeReadI64(GetNode("int/i1"), &i));
+    REQUIRE_EQ(i, (int64_t)100);
+}
+
+FIXTURE_TEST_CASE(ConfigNodeAccessUnsigned, KfgFixture)
+{
+    const char* contents=
+        "uint/i1=\"100000000000\"\n"
+        ;
+    CreateAndLoad(GetName(), contents);
+    uint64_t i = 0;
+    REQUIRE_RC(KConfigNodeReadU64(GetNode("uint/i1"), &i));
+    REQUIRE_EQ(i, UINT64_C(100000000000));
+}
+
+FIXTURE_TEST_CASE(ConfigNodeAccessF64, KfgFixture)
+{
+    const char* contents=
+        "f64/i1=\"3.14\"\n"
+        ;
+    CreateAndLoad(GetName(), contents);
+    double f = 0.0;
+    REQUIRE_RC(KConfigNodeReadF64(GetNode("f64/i1"), &f));
+    REQUIRE_CLOSE(f, 3.14, 0.001);
+}
+
+FIXTURE_TEST_CASE(ConfigNodeAccessVPath, KfgFixture)
+{
+    // example from vfs/path.h
+    // changing
+    #define VPATH "ncbi-file:///c/scanned-data/0001/file.sra?enc&pwd-file=/c/Users/JamesMcCoy/ncbi.pwd"
+    
+    const char* contents=
+        "vpath/i1=\"" VPATH "\"\n" 
+        ;
+        
+    CreateAndLoad(GetName(), contents);
+    REQUIRE_RC(KConfigNodeReadVPath(GetNode("vpath/i1"), &path));
+    VPathReadUri(path, buf, sizeof(buf), &num_read);
+    REQUIRE_EQ(string(buf), string(VPATH));
+}
+
+FIXTURE_TEST_CASE(ConfigNodeAccessString, KfgFixture)
+{
+    #define STRING "ncbi-file:///c/scanned-data/0001/file.sra?enc&pwd-file=/c/Users/JamesMcCoy/ncbi.pwd"
+    const char* contents=
+        "string/i1=\"" STRING "\"\n" 
+        ;
+     
+    CreateAndLoad(GetName(), contents);
+    String* str;
+    REQUIRE_RC(KConfigNodeReadString(GetNode("string/i1"), &str));
+    REQUIRE_NOT_NULL(str);
+    REQUIRE_EQ(string(str->addr), string(STRING));
+    StringWhack(str);
+}
+#endif
+
+//////////////////////////////////////////// Importing external objects
+
+namespace {
+    class C {
+    public:
+        static void t(const string &ngcPath) {
+        }
+    };
+}
+
+class Cleaner {
+    KDirectory *dir;
+
+    const char *home;
+
+    const bool ncbi;
+    const bool dbGaP;
+    const bool enKey;
+
+    static const char* Ncbi (void) { return  "ncbi"                   ; }
+    static const char* DbGaP(void) { return  "ncbi/dbGaP-2956"        ; }
+    static const char* EnKey(void) { return ".ncbi/dbGaP-2956.enc_key"; }
+
+public:
+    Cleaner(KDirectory *d)
+        : dir(d), home(getenv("HOME"))
+        , ncbi (KDirectoryPathType(dir, "%s/%s", home, Ncbi ()) != kptNotFound)
+        , dbGaP(KDirectoryPathType(dir, "%s/%s", home, DbGaP()) != kptNotFound)
+        , enKey(KDirectoryPathType(dir, "%s/%s", home, EnKey()) != kptNotFound)
+    {}
+
+    ~Cleaner() {
+        if (!dbGaP)
+            KDirectoryRemove(dir, false, "%s/%s", home, DbGaP());
+        if (!ncbi)
+            KDirectoryRemove(dir, false, "%s/%s", home, Ncbi ());
+        if (!enKey)
+            KDirectoryRemove(dir, false, "%s/%s", home, EnKey());
+    }
+};
+
+#ifdef ALL
+FIXTURE_TEST_CASE(KConfigImportNgc_Basic, KfgFixture)
+{
+    string s(GetName());
+    cout << "FIXTURE_TEST_CASE(KConfigImportNgc_Basic) " << s << "\n";
+    TEST_MESSAGE(s);
+    CreateAndLoad(s.c_str(), "\n");
+    TEST_MESSAGE("CreateAndLoad" << " " << s);
+
+    const char* newRepo;
+
+//    KDbgSetModConds(DBG_KFG, DBG_FLAG(DBG_KFG), DBG_FLAG(DBG_KFG));
+
+    TEST_MESSAGE("KConfigImportNgc");
+    string ngcPath("./prj_2956.ngc");
+    C::t(ngcPath);
+    Cleaner cleaner(wd);
+    REQUIRE_RC(KConfigImportNgc(kfg, ngcPath.c_str(), "repos/ngc/", &newRepo));
+    TEST_MESSAGE("KConfigImportNgc(" << ngcPath << ")");
+    // contents of the input file:
+    // id = "2956"
+    // encyption key = "12"
+    // download ticket = "943EF2DF-8C5E-4B8F-9D29-4BE5C1837798"
+    // description = "SRA Test"
+    //
+    // The resulting KConfig subtree:
+    // (root node=) /repository/user/protected/dbGaP-2956/...
+    // .../encryption-key-path = "$(NCBI_HOME)/dbGaP-2956.enc_key"   (creates the file, writes the key into it with \n appended)
+    // .../apps/sra/volumes/sraFlat="sra"
+    // .../cache-enabled = "true"
+    // .../root = "repos/ngc/" ; creates the dir 
+    //
+    // also, creates the following node if it is not present
+    // /repository/remote/protected/CGI/resolver-cgi="https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi"
+    {
+        REQUIRE_RC(KConfigNodeReadVPath(GetNode("/repository/user/protected/dbGaP-2956/encryption-key-path"), &path));    
+        VPathReadPath(path, buf, sizeof(buf), &num_read);    
+        string encFileName = "/dbGaP-2956.enc_key";
+        REQUIRE_EQ(string(buf).rfind(encFileName), num_read - encFileName.size()); // string(buf) ends with encFileName
+        VPathRelease(path);
+        path = 0;
+
+        REQUIRE_EQ(ReadContent(buf), string("12\n"));
+    }
+    
+    {
+        String* str;
+        REQUIRE_RC(KConfigNodeReadString(GetNode("/repository/user/protected/dbGaP-2956/apps/sra/volumes/sraFlat"), &str));    
+        REQUIRE_EQ(string(str->addr), string("sra"));
+        StringWhack(str);
+    }
+
+    {
+        bool b = true;
+        REQUIRE_RC(KConfigNodeReadBool(GetNode("/repository/user/protected/dbGaP-2956/cache-enabled"), &b));
+        REQUIRE(b);
+    }        
+    
+    {
+        REQUIRE_RC(KConfigNodeReadVPath(GetNode("/repository/user/protected/dbGaP-2956/root"), &path));    
+        VPathReadPath(path, buf, sizeof(buf), &num_read);    
+        REQUIRE_EQ(string(buf), string("repos/ngc/"));
+        VPathRelease(path);
+        path = 0;
+        
+        const KDirectory *sub;
+        REQUIRE_RC(KDirectoryOpenDirRead(wd, &sub, false, buf));
+        REQUIRE_RC(KDirectoryRelease(sub));
+        REQUIRE_RC(KDirectoryRemove(wd, true, buf));
+    }
+    
+    {
+        const String* str;
+        REQUIRE_RC(KConfigNodeReadVPath(GetNode("/repository/remote/protected/CGI/resolver-cgi"), &path));    
+        REQUIRE_RC(VPathMakeString(path, &str));    
+        REQUIRE_EQ(string(str->addr), string("https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi"));
+        StringWhack(str);
+    }
+    
+    REQUIRE_EQ(string(newRepo), string("repos/ngc/"));
+    
+    REQUIRE_RC(KDirectoryRemove(wd, true, "repos"));
+}
+#endif
+
+FIXTURE_TEST_CASE(KConfigImportNgc_NullLocation, KfgFixture)
+{
+    CreateAndLoad(GetName(), "\n");
+    const char* newRepo;
+    Cleaner cleaner(wd);
+    REQUIRE_RC(KConfigImportNgc(kfg, "./prj_2956.ngc", NULL, &newRepo));
+    string encDirName = "/ncbi/dbGaP-2956";
+    REQUIRE_EQ(string(newRepo).rfind(encDirName), string(newRepo).size() - encDirName.size()); // string(buf) ends with encDirName
+}
+FIXTURE_TEST_CASE(KConfigImportNgc_NullLocation_NullNewRepo, KfgFixture)
+{
+    CreateAndLoad(GetName(), "\n");
+    Cleaner cleaner(wd);
+    REQUIRE_RC(KConfigImportNgc(kfg, "./prj_2956.ngc", NULL, NULL));
+}
+
+//////////////////////////////////////////// Main
+static rc_t argsHandler(int argc, char* argv[]) {
+    Args* args = NULL;
+    rc_t rc = ArgsMakeAndHandle(&args, argc, argv, 0, NULL, 0);
+    ArgsWhack(args);
+    return rc;
+}
+
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-kfg";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=KfgTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kfg/ncbi-home-from-env.configs/dir1/file.kfg b/test/kfg/ncbi-home-from-env.configs/dir1/file.kfg
new file mode 100644
index 0000000..4eb768e
--- /dev/null
+++ b/test/kfg/ncbi-home-from-env.configs/dir1/file.kfg
@@ -0,0 +1,2 @@
+/refseq/volumes = "ONE-OLD-FILE"
+/ncbi-home-from-env = "ONE-NEW-FILE"
diff --git a/test/kfg/ncbi-home-from-env.configs/dir1/not-user-settings.xml b/test/kfg/ncbi-home-from-env.configs/dir1/not-user-settings.xml
new file mode 100644
index 0000000..2ebd12f
--- /dev/null
+++ b/test/kfg/ncbi-home-from-env.configs/dir1/not-user-settings.xml
@@ -0,0 +1,2 @@
+/refseq/volumes = "ONE-OLD-KFG"
+/ncbi-home-from-env = "ONE-NEW-KFG"
diff --git a/test/kfg/ncbi-home-from-env.configs/dir1/user-settings.mkfg b/test/kfg/ncbi-home-from-env.configs/dir1/user-settings.mkfg
new file mode 100644
index 0000000..80b98c3
--- /dev/null
+++ b/test/kfg/ncbi-home-from-env.configs/dir1/user-settings.mkfg
@@ -0,0 +1,2 @@
+/refseq/volumes = "ONE-OLD-USER"
+/ncbi-home-from-env = "ONE-NEW-USER"
diff --git a/test/kfg/ncbi-home-from-env.configs/dir2/file.kfg b/test/kfg/ncbi-home-from-env.configs/dir2/file.kfg
new file mode 100644
index 0000000..5632692
--- /dev/null
+++ b/test/kfg/ncbi-home-from-env.configs/dir2/file.kfg
@@ -0,0 +1,2 @@
+/refseq/volumes = "TWO-OLD-FILE"
+/ncbi-home-from-env = "TWO-NEW-FILE"
diff --git a/test/kfg/ncbi-home-from-env.configs/dir2/not-user-settings.xml b/test/kfg/ncbi-home-from-env.configs/dir2/not-user-settings.xml
new file mode 100644
index 0000000..599418f
--- /dev/null
+++ b/test/kfg/ncbi-home-from-env.configs/dir2/not-user-settings.xml
@@ -0,0 +1,2 @@
+/refseq/volumes = "TWO-OLD-KFG"
+/ncbi-home-from-env = "TWO-NEW-KFG"
diff --git a/test/kfg/ncbi-home-from-env.configs/dir2/user-settings.mkfg b/test/kfg/ncbi-home-from-env.configs/dir2/user-settings.mkfg
new file mode 100644
index 0000000..adc3163
--- /dev/null
+++ b/test/kfg/ncbi-home-from-env.configs/dir2/user-settings.mkfg
@@ -0,0 +1,2 @@
+/refseq/volumes = "TWO-OLD-USER"
+/ncbi-home-from-env = "TWO-NEW-USER"
diff --git a/test/kfg/ncbi-home-from-env.cpp b/test/kfg/ncbi-home-from-env.cpp
new file mode 100644
index 0000000..3c0fcf6
--- /dev/null
+++ b/test/kfg/ncbi-home-from-env.cpp
@@ -0,0 +1,50 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <climits> /* PATH_MAX */
+#include <cstdlib> // system
+#include <cstring> // strrchr
+ #include <stdio.h>
+
+int main(int argc, char **argv) {
+    char *last = strrchr(argv[0], '/');
+    if (!last)
+        return 1;
+    char *n = strstr(argv[0], "ncbi-vdb");
+    int s = 8;
+    if (!n)
+        return 1;
+    int l = strlen(argv[0]);
+    l -= n - argv[0];
+    int tail = strlen(argv[0]);
+    tail -= last - argv[0];
+    size_t sPfx = n - argv[0];
+    char command[PATH_MAX] = "";
+    sprintf(command,
+        "./ncbi-home-from-env.sh %.*ssra-tools%.*s/../bin/vdb-config",
+        sPfx, argv[0], l - tail - s, n + s);
+    return system(command) != 0;
+}
diff --git a/test/kfg/prj_2956.ngc b/test/kfg/prj_2956.ngc
new file mode 100644
index 0000000..62c8ef8
Binary files /dev/null and b/test/kfg/prj_2956.ngc differ
diff --git a/test/kfg/repositorytest.cpp b/test/kfg/repositorytest.cpp
new file mode 100644
index 0000000..df2773b
--- /dev/null
+++ b/test/kfg/repositorytest.cpp
@@ -0,0 +1,280 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for KRepository interfaces
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <cstring>
+#include <stdexcept>
+
+#include <klib/vector.h>
+
+#include <kfs/directory.h>
+#include <kfs/impl.h>
+
+#include <kfg/config.h>
+#include <kfg/repository.h>
+
+using namespace std;
+
+TEST_SUITE(RepositoryTestSuite);
+
+class RepositoryFixture
+{
+public:
+    RepositoryFixture()
+    : repo(0)
+    {
+        if (KConfigMake(&kfg, NULL) != 0)
+            throw logic_error("RepositoryFixture: KConfigMake failed");
+        if (KConfigMakeRepositoryMgrRead(kfg, (const KRepositoryMgr**)&mgr) != 0)
+            throw logic_error("RepositoryFixture: KConfigMakeRepositoryMgrRead failed");
+        VectorInit(&repos, 0, 0); // in order to be able to whack it when we are done, even if not used by the test case
+        ClearRepositories();
+    }
+    ~RepositoryFixture() 
+    {
+        if (repo && KRepositoryRelease(repo) != 0)
+            throw logic_error("~RepositoryFixture: KRepositoryRelease failed");
+        if (KRepositoryVectorWhack(&repos) != 0)
+            throw logic_error("~RepositoryFixture: KRepositoryVectorWhack failed");
+        if (KRepositoryMgrRelease(mgr) != 0)
+            throw logic_error("~RepositoryFixture: KRepositoryMgrRelease failed");
+        if (KConfigRelease(kfg) != 0)
+            throw logic_error("~RepositoryFixture: KConfigRelease failed");
+    }
+    
+    void UpdateNode(const char* key, const char* value)
+    {
+        KConfigNode *node;
+        if (KConfigOpenNodeUpdate(kfg, &node, key) != 0)
+            throw logic_error("UpdateNode: KConfigOpenNodeUpdate failed");
+        if (KConfigNodeWrite(node, value, strlen(value)) != 0)
+            throw logic_error("UpdateNode: KConfigNodeWrite failed");
+        if (KConfigNodeRelease(node) != 0)
+            throw logic_error("UpdateNode: KConfigNodeRelease failed");
+    }    
+    
+    void ClearRepositories()
+    {
+        KConfigNode *node;
+        if (KConfigOpenNodeUpdate(kfg, &node, "repository") != 0)
+            throw logic_error("ClearRepositories: KConfigOpenNodeUpdate failed");
+        if (KConfigNodeDropAll(node) != 0)
+            throw logic_error("ClearRepositories: KConfigNodeDropAll failed");
+        if (KConfigNodeRelease(node) != 0)
+            throw logic_error("ClearRepositories: KConfigNodeRelease failed");
+    }
+    
+    bool ValidateRepository(const KRepository* r, KRepCategory cat, KRepSubCategory subcat, const char* name)
+    {
+        if (KRepositoryCategory( r ) != cat)
+            return false;
+        if (KRepositorySubCategory( r ) != subcat)
+            return false;
+        if (KRepositoryName( r, buf, BufSize, &num_writ) )
+            return false;
+        if (string(buf, num_writ) != string(name))
+            return false;
+        return true;
+    }
+    
+    KConfig* kfg;
+    KRepositoryMgr* mgr;
+    KRepositoryVector repos;
+    const KRepository* repo;
+    
+    static const int BufSize = 1024;
+    char buf[BufSize];
+    size_t num_writ;
+};
+
+FIXTURE_TEST_CASE(Mgr_MakeRead, RepositoryFixture)
+{
+    REQUIRE_NOT_NULL(mgr);
+}
+FIXTURE_TEST_CASE(Mgr_MakeUpdate, RepositoryFixture)
+{
+    REQUIRE_RC(KRepositoryMgrRelease(mgr)); // remove the default (read-only) mgr
+    mgr = 0;
+    REQUIRE_RC(KConfigMakeRepositoryMgrUpdate(kfg, &mgr));
+    REQUIRE_NOT_NULL(mgr);
+}
+
+// UserRepositories
+FIXTURE_TEST_CASE(Mgr_UserRepositories_NoNode, RepositoryFixture)
+{
+    REQUIRE_RC_FAIL(KRepositoryMgrUserRepositories(mgr, &repos));
+}
+FIXTURE_TEST_CASE(Mgr_UserRepositoriesEmpty, RepositoryFixture)
+{
+    KRepositoryVector v; // using a local vector to make sure it is initialized by the call
+    UpdateNode("/repository/user", "");
+    
+    REQUIRE_RC(KRepositoryMgrUserRepositories(mgr, &v));
+    REQUIRE_EQ(VectorLength(&v), (uint32_t)0);
+
+    REQUIRE_RC(KRepositoryVectorWhack(&v));
+}
+
+FIXTURE_TEST_CASE(Mgr_UserRepositories, RepositoryFixture)
+{
+    // unsorted
+    UpdateNode("/repository/user/main/repo4/", "");
+    UpdateNode("/repository/user/bad/repo7/", ""); // should be ignored
+    UpdateNode("/repository/user/aux/repo1/", "");
+    UpdateNode("/repository/user/protected/repo3/", "");
+    UpdateNode("/repository/user/aux/repo6/", "");
+    UpdateNode("/repository/user/protected/repo5/", "");
+    UpdateNode("/repository/user/main/repo1/", "");
+
+    REQUIRE_RC(KRepositoryMgrUserRepositories(mgr, &repos));
+    REQUIRE_EQ(VectorLength(&repos), (uint32_t)6);
+    
+    // verify the values and that the vector has been sorted on: subcategory(main<aux<protected), name
+    REQUIRE(ValidateRepository(( const KRepository* ) VectorGet ( & repos, 0 ), krepUserCategory, (uint32_t)krepMainSubCategory, "repo1"));
+    REQUIRE(ValidateRepository(( const KRepository* ) VectorGet ( & repos, 5 ), krepUserCategory, (uint32_t)krepProtectedSubCategory, "repo5"));
+}
+
+FIXTURE_TEST_CASE(Mgr_SiteRepositories, RepositoryFixture)
+{
+    // unsorted
+    UpdateNode("/repository/site/main/repo4/", "");
+    UpdateNode("/repository/site/bad/repo7/", ""); // should be ignored
+    UpdateNode("/repository/site/aux/repo1/", "");
+    UpdateNode("/repository/site/protected/repo3/", "");
+    UpdateNode("/repository/site/aux/repo6/", "");
+    UpdateNode("/repository/site/protected/repo5/", "");
+    UpdateNode("/repository/site/main/repo1/", "");
+
+    REQUIRE_RC(KRepositoryMgrSiteRepositories(mgr, &repos));
+    REQUIRE_EQ(VectorLength(&repos), (uint32_t)6);
+    
+    // verify the values and that the vector has been sorted on: subcategory(main<aux<protected), name
+    REQUIRE(ValidateRepository(( const KRepository* ) VectorGet ( & repos, 0 ), krepSiteCategory, (uint32_t)krepMainSubCategory, "repo1"));
+    REQUIRE(ValidateRepository(( const KRepository* ) VectorGet ( & repos, 5 ), krepSiteCategory, (uint32_t)krepProtectedSubCategory, "repo5"));
+}
+
+FIXTURE_TEST_CASE(Mgr_RemoteRepositories, RepositoryFixture)
+{
+    // unsorted
+    UpdateNode("/repository/remote/main/repo4/", "");
+    UpdateNode("/repository/remote/bad/repo7/", ""); // should be ignored
+    UpdateNode("/repository/remote/aux/repo1/", "");
+    UpdateNode("/repository/remote/protected/repo3/", "");
+    UpdateNode("/repository/remote/aux/repo6/", "");
+    UpdateNode("/repository/remote/protected/repo5/", "");
+    UpdateNode("/repository/remote/main/repo1/", "");
+
+    REQUIRE_RC(KRepositoryMgrRemoteRepositories(mgr, &repos));
+    REQUIRE_EQ(VectorLength(&repos), (uint32_t)6);
+    
+    // verify the values and that the vector has been sorted on: subcategory(main<aux<protected), name
+    REQUIRE(ValidateRepository(( const KRepository* ) VectorGet ( & repos, 0 ), krepRemoteCategory, (uint32_t)krepMainSubCategory, "repo1"));
+    REQUIRE(ValidateRepository(( const KRepository* ) VectorGet ( & repos, 5 ), krepRemoteCategory, (uint32_t)krepProtectedSubCategory, "repo5"));
+}
+
+FIXTURE_TEST_CASE(Mgr_GetProtectedRepository_OldSpelling, RepositoryFixture)
+{
+    // only repositories from /repository/user/protected/ are looked at
+    UpdateNode("/repository/user/protected/dbGap-123/", "");
+    UpdateNode("/repository/user/main/dbGap-321/", ""); 
+    UpdateNode("/repository/site/protected/dbGap-321/", "");
+    UpdateNode("/repository/user/protected/dbGap-321/", "");
+    
+    REQUIRE_RC(KRepositoryMgrGetProtectedRepository(mgr, 321, &repo));
+    REQUIRE(ValidateRepository(repo, krepUserCategory, (uint32_t)krepProtectedSubCategory, "dbGap-321"));
+}
+FIXTURE_TEST_CASE(Mgr_GetProtectedRepository, RepositoryFixture)
+{
+    // only repositories from /repository/user/protected/ are looked at
+    UpdateNode("/repository/user/protected/dbGaP-123/", "");
+    UpdateNode("/repository/user/main/dbGaP-321/", ""); 
+    UpdateNode("/repository/site/protected/dbGaP-321/", "");
+    UpdateNode("/repository/user/protected/dbGaP-321/", "");
+    
+    REQUIRE_RC(KRepositoryMgrGetProtectedRepository(mgr, 321, &repo));
+    REQUIRE(ValidateRepository(repo, krepUserCategory, (uint32_t)krepProtectedSubCategory, "dbGaP-321"));
+}
+
+//TODO: KRepositoryMgrCurrentProtectedRepository
+
+// remote repository access
+FIXTURE_TEST_CASE(Mgr_RemoteOnSingle, RepositoryFixture)
+{
+    UpdateNode ( "/repository/remote/main/repo4/", "" );
+    REQUIRE ( KRepositoryMgrHasRemoteAccess ( mgr ) );
+}
+FIXTURE_TEST_CASE(Mgr_RemoteOnMultiple, RepositoryFixture)
+{
+    UpdateNode ( "/repository/remote/main/repo4/", "" );
+    UpdateNode ( "/repository/remote/aux/repo1/disabled", "true" );
+    REQUIRE ( KRepositoryMgrHasRemoteAccess ( mgr ) );
+}
+FIXTURE_TEST_CASE(Mgr_RemoteOff, RepositoryFixture)
+{
+    UpdateNode ( "/repository/remote/main/repo4/disabled", "true" );
+    UpdateNode ( "/repository/remote/aux/repo1/disabled", "true" );
+
+    REQUIRE ( ! KRepositoryMgrHasRemoteAccess ( mgr ) );
+}
+
+
+//////////////////////////////////////////// Main
+
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-kfg";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=RepositoryTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kfg/wb-test-kfg.cpp b/test/kfg/wb-test-kfg.cpp
new file mode 100644
index 0000000..c132226
--- /dev/null
+++ b/test/kfg/wb-test-kfg.cpp
@@ -0,0 +1,628 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for Kfg interface
+*/
+
+#include <kfg/extern.h>
+
+#include <map>
+#include <string>
+#include <cstring>
+#include <sstream>
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/namelist.h>
+
+using namespace std;
+
+TEST_SUITE(KfgWbTestSuite);
+
+//////////////////////////////////////////// tests for flex-generated scanner
+extern "C" {
+#include "../libs/kfg/kfg-parse.h"
+#include "../libs/kfg/config-tokens.h"
+}
+
+// simple symbol table
+class SymbolTable : public map<string, string>
+{
+protected:
+    void Add(const char* name, const char* value)
+    {
+        (*this)[name]=value;
+    }
+
+    static bool lookup_var(void * self, KFGToken* pb)
+    { 
+        const SymbolTable* tab=(const SymbolTable*)self;
+        map<string, string>::const_iterator var=tab->find(string(pb->tokenText+2, pb->tokenLength-3));
+        if (var == tab->end())
+        {
+            return false;
+        }
+        pb->tokenText = var->second.c_str();
+        pb->tokenLength = var->second.length();
+        pb->tokenId = kfgVAR_REF;
+        return true;
+    }
+};
+
+// test fixture for scanner tests
+class KfgScanFixture : public SymbolTable
+{
+public:
+    KfgScanFixture() 
+    {
+        sb.self=this;
+        sb.file="test";
+        sb.look_up_var=lookup_var;
+        sb.buffer=0;
+        sb.scanner=0;
+        sb.report_error=report_error;
+    }
+    ~KfgScanFixture() 
+    {
+        KFGScan_yylex_destroy(&sb);
+    }
+    void InitScan(const char* input, bool trace=false)
+    {
+        KFGScan_yylex_init(&sb, input);
+        KFGScan_set_debug(trace, &sb);
+    }
+    int Scan()
+    {
+        errorMsg.clear();
+
+        KFGScan_yylex(&sym, &sb);
+
+        const char* token=sb.lastToken->tokenText;
+        if (sb.lastToken->tokenId != kfgEND_INPUT && token != 0)
+        {
+            tokenText=string(token, sb.lastToken->tokenLength);
+        }
+        else
+        {
+            tokenText.clear();
+        }
+        return sym.pb.tokenId;
+    }
+    static void report_error(KFGScanBlock* sb, const char* msg)
+    {
+        ((KfgScanFixture*)sb->self)->errorMsg=msg;
+    }
+
+    string MatchToken(const char* token, int expectedId, const char* expectedText, int nextToken=kfgEND_INPUT, bool trace=false, bool keepError=true)
+    {
+        InitScan(token, trace);
+        int id=Scan();
+        if (id != expectedId)
+        {
+            ostringstream os;
+            os << "Scan() returned " << id << ", expected" << expectedId;
+            return os.str();
+        }
+        if (expectedText == 0)
+        {
+            expectedText=token;
+        }
+        if (tokenText != expectedText)
+        {
+            ostringstream os;
+            os << "Scan() returned " << tokenText.c_str() << ", expected" << expectedText;
+            return os.str();
+        }
+
+        // save the errorMsg returned by Scan() from being overwritten, in case the test case is interested in checking it rather than the next one.
+        string errorMsgSaved=errorMsg;
+        id=Scan();
+        if (id != nextToken)
+        {
+            ostringstream os;
+            os << "post-Scan() returned " << id << ", expected" << nextToken;
+            return os.str();
+        }
+        if (keepError)
+        {
+            errorMsg=errorMsgSaved;
+        }
+        return "";
+    }
+    string MatchToken(const char* token, int expectedId, bool trace=false)
+    {
+        return MatchToken(token, expectedId, 0, kfgEND_INPUT, trace);
+    }
+
+    KFGSymbol sym;
+    KFGScanBlock sb;
+    string tokenText;
+    string errorMsg;
+};
+
+FIXTURE_TEST_CASE(KfgScanMultiLineComments, KfgScanFixture)
+{   // C comments with an \n inside are recognized as EOL
+    InitScan("/***\n\n\n*/");
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_LINE);
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+
+FIXTURE_TEST_CASE(KfgScanLineComments, KfgScanFixture)
+{
+    InitScan(
+        "/*********/\n"
+        "#some more stuff\n"
+        "/*========*/");
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_LINE); // C comments without \n inside are skipped
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_LINE); // line comments skipped
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);// not folowed by /n
+}
+
+FIXTURE_TEST_CASE(KfgScanNestedMultiLineComments, KfgScanFixture)
+{   
+    InitScan("/***\n"
+             "/**/\n" // the comment ends here
+             "*/");
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_LINE);
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_LINE);
+    REQUIRE_EQUAL(Scan(), (int)kfgUNRECOGNIZED);
+}
+
+FIXTURE_TEST_CASE(KfgScanIgnoredSymbols, KfgScanFixture)
+{
+    InitScan("\v\r\t\f");
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+
+FIXTURE_TEST_CASE(KfgScanEndOfLine, KfgScanFixture)
+{
+    InitScan("\v\r\t\f\n");
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_LINE);
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+
+FIXTURE_TEST_CASE(KfgScanStrings, KfgScanFixture)
+{   // strings with white space in between
+    InitScan("'str1' \"str2\"");
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING);          REQUIRE_EQUAL(tokenText, std::string("str1"));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING);          REQUIRE_EQUAL(tokenText, std::string("str2"));
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+} 
+
+FIXTURE_TEST_CASE(KfgScanString1, KfgScanFixture)
+{   // ( in string
+    REQUIRE_EQ(MatchToken("'str1('", kfgSTRING, "str1("), string());
+}
+FIXTURE_TEST_CASE(KfgScanString2, KfgScanFixture)
+{   // $ in string
+    REQUIRE_EQ(MatchToken("'a$str2\\\"'", kfgESCAPED_STRING, "a$str2\\\""), string());
+}
+FIXTURE_TEST_CASE(KfgScanString3, KfgScanFixture)
+{   // ) in string
+    REQUIRE_EQ(MatchToken("\"str)3\"", kfgSTRING, "str)3"), string());
+}
+FIXTURE_TEST_CASE(KfgScanString4, KfgScanFixture)
+{   // escaped \n in string
+    REQUIRE_EQ(MatchToken("\"str4\\n'\"", kfgESCAPED_STRING, "str4\\n'"), string());
+}
+FIXTURE_TEST_CASE(KfgScanString5, KfgScanFixture)
+{   // escaped \" in string
+    REQUIRE_EQ(MatchToken("\"\\\"\"", kfgESCAPED_STRING, "\\\""), string());
+}
+
+FIXTURE_TEST_CASE(KfgScanVarRefInStringEscapes1, KfgScanFixture)
+{   // escaped $ in string, case 1
+    REQUIRE_EQ(MatchToken("'\\$'", kfgESCAPED_STRING, "\\$"), string());
+}
+FIXTURE_TEST_CASE(KfgScanVarRefInStringEscapes2, KfgScanFixture)
+{   // escaped $ in string, case 2
+    REQUIRE_EQ(MatchToken("\"$\\$1\"", kfgESCAPED_STRING, "$\\$1"), string());
+}
+FIXTURE_TEST_CASE(KfgScanVarRefInStringEscapes3, KfgScanFixture)
+{   // escaped $( in string
+    REQUIRE_EQ(MatchToken("\"$\\$(ref)\"", kfgESCAPED_STRING, "$\\$(ref)"), string());
+}
+FIXTURE_TEST_CASE(KfgScanVarRefInStringEscapes4, KfgScanFixture)  
+{   // unterminated $( in double quoted string
+    REQUIRE_EQ(MatchToken("\"$(qq\"qq", kfgSTRING, "", kfgSTRING), string());
+    REQUIRE_EQUAL(tokenText, string("$(qq\"qq"));
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+FIXTURE_TEST_CASE(KfgScanVarRefInStringEscapes5, KfgScanFixture)  
+{   // unterminated $( in single quoted string
+    REQUIRE_EQ(MatchToken("'$(qq'qq", kfgSTRING, "", kfgSTRING), string());
+    REQUIRE_EQUAL(tokenText, string("$(qq\'qq"));
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+FIXTURE_TEST_CASE(KfgScanVarRefInStringEscapes6, KfgScanFixture)  
+{   // unterminated $( eats up the rest of the line
+    REQUIRE_EQ(MatchToken("'$(qq zzz", kfgSTRING, "", kfgSTRING), string());
+    REQUIRE_EQUAL(tokenText, string("$(qq zzz"));
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+
+// EOL in strings
+FIXTURE_TEST_CASE(KfgScanUnterminatedString1, KfgScanFixture)
+{
+    REQUIRE_EQ(MatchToken("'st\n", kfgUNTERM_STRING, "st", kfgEND_LINE), string(""));
+    REQUIRE(errorMsg.length() > 0);
+}
+FIXTURE_TEST_CASE(KfgScanUnterminatedString2, KfgScanFixture)
+{
+    REQUIRE_EQ(MatchToken("\"st\n", kfgUNTERM_STRING, "st", kfgEND_LINE), string(""));
+    REQUIRE(errorMsg.length() > 0);
+}
+FIXTURE_TEST_CASE(KfgScanUnterminatedString3, KfgScanFixture)
+{
+    REQUIRE_EQ(MatchToken("'s\\t\n", kfgUNTERM_ESCAPED_STRING, "s\\t", kfgEND_LINE), string(""));
+    REQUIRE(errorMsg.length() > 0);
+}
+FIXTURE_TEST_CASE(KfgScanUnterminatedString4, KfgScanFixture)
+{
+    REQUIRE_EQ(MatchToken("\"s\\t\n", kfgUNTERM_ESCAPED_STRING, "s\\t", kfgEND_LINE), string(""));
+    REQUIRE(errorMsg.length() > 0);
+}
+// EOF in strings
+FIXTURE_TEST_CASE(KfgScanUnterminatedString5, KfgScanFixture)
+{
+    REQUIRE_EQ(MatchToken("'st", kfgUNTERM_STRING, "st"), string(""));
+    REQUIRE(errorMsg.length() > 0);
+}
+FIXTURE_TEST_CASE(KfgScanUnterminatedString6, KfgScanFixture)
+{
+    REQUIRE_EQ(MatchToken("\"st", kfgUNTERM_STRING, "st"), string(""));
+    REQUIRE(errorMsg.length() > 0);
+}
+FIXTURE_TEST_CASE(KfgScanUnterminatedString7, KfgScanFixture)
+{
+    REQUIRE_EQ(MatchToken("'s\\t", kfgUNTERM_ESCAPED_STRING, "s\\t"), string(""));
+    REQUIRE(errorMsg.length() > 0);
+}
+FIXTURE_TEST_CASE(KfgScanUnterminatedString8, KfgScanFixture)
+{
+    REQUIRE_EQ(MatchToken("\"s\\t", kfgUNTERM_ESCAPED_STRING, "s\\t"), string(""));
+    REQUIRE(errorMsg.length() > 0);
+}
+
+FIXTURE_TEST_CASE(KfgScanSimplePathNames, KfgScanFixture)
+{
+    InitScan("a _aBc 9-9 _--.* ");
+    REQUIRE_EQUAL(Scan(), (int)kfgREL_PATH); REQUIRE_EQUAL(tokenText, string("a"));
+    REQUIRE_EQUAL(Scan(), (int)kfgREL_PATH); REQUIRE_EQUAL(tokenText, string("_aBc"));
+    REQUIRE_EQUAL(Scan(), (int)kfgREL_PATH); REQUIRE_EQUAL(tokenText, string("9-9"));
+    REQUIRE_EQUAL(Scan(), (int)kfgREL_PATH); REQUIRE_EQUAL(tokenText, string("_--."));
+    REQUIRE_EQUAL(Scan(), (int)kfgUNRECOGNIZED); 
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+
+FIXTURE_TEST_CASE(KfgScanLongPathNames, KfgScanFixture)
+{
+    InitScan("/a/b/c a/_.- ");
+    REQUIRE_EQUAL(Scan(), (int)kfgABS_PATH); REQUIRE_EQUAL(tokenText, string("/a/b/c"));
+    REQUIRE_EQUAL(Scan(), (int)kfgREL_PATH); REQUIRE_EQUAL(tokenText, string("a/_.-"));
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+
+FIXTURE_TEST_CASE(KfgScanLiterals, KfgScanFixture)
+{
+    REQUIRE_EQ(MatchToken("=", kfgASSIGN), string());
+}
+
+FIXTURE_TEST_CASE(KfgScanVarRefSimple, KfgScanFixture)
+{
+    InitScan("$(ref)");
+    Add("ref", "value");
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("value"));
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+
+FIXTURE_TEST_CASE(KfgScanVarRefUndefined, KfgScanFixture)
+{
+    InitScan("$(reff)");
+    Add("ref", "value");
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE(errorMsg.length() == 0); // undefined vars not reported
+    REQUIRE_EQUAL(tokenText, string(""));
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT); 
+}
+
+FIXTURE_TEST_CASE(KfgScanVarRefInDoubleString, KfgScanFixture)
+{
+    InitScan("\"-$(ref)+\"");
+    Add("ref", "value");
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("-"));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("value"));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("+"));
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+
+FIXTURE_TEST_CASE(KfgScanVarRefInSingleString, KfgScanFixture)
+{
+    InitScan("'-$(ref)+'");
+    Add("ref", "value");
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("-"));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("value"));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("+"));
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+
+FIXTURE_TEST_CASE(KfgScanMultipleVarRefsInString1, KfgScanFixture)
+{
+    InitScan("'-$(ref1)+$(ref2)-'");
+    Add("ref1", "value1");
+    Add("ref2", "value2");
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("-"));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("value1"));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("+"));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("value2"));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("-"));
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+
+FIXTURE_TEST_CASE(KfgScanMultipleVarRefsInString2, KfgScanFixture)
+{
+    InitScan("'$(ref1)$(ref2)'");
+    Add("ref1", "value1");
+    Add("ref2", "value2");
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string(""));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("value1"));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string("value2"));
+    REQUIRE_EQUAL(Scan(), (int)kfgSTRING); REQUIRE_EQUAL(tokenText, string(""));
+    REQUIRE_EQUAL(Scan(), (int)kfgEND_INPUT);
+}
+
+//// bad token cases
+FIXTURE_TEST_CASE(KfgScanVarRefEndFile, KfgScanFixture)
+{   
+    InitScan("$(ref");
+    REQUIRE_EQUAL(Scan(), (int)kfgUNRECOGNIZED); 
+}
+
+FIXTURE_TEST_CASE(KfgScanVarRefInStringEndFile, KfgScanFixture)
+{   // broken var refs inside strings are converted into strings
+    REQUIRE_EQ(MatchToken("'$(ref", kfgSTRING, "", kfgSTRING, false, false), string(""));
+    REQUIRE_EQUAL(tokenText, string("$(ref"));
+    REQUIRE(errorMsg.length() > 0);
+}
+
+FIXTURE_TEST_CASE(KfgScanVarRefInStringEndLine, KfgScanFixture)
+{   // broken var refs inside strings are converted into strings
+    REQUIRE_EQ(MatchToken("\"$(ref\n", kfgSTRING, "", kfgSTRING, false, false), string(""));
+    REQUIRE_EQUAL(tokenText, string("$(ref"));
+    REQUIRE(errorMsg.length() > 0);
+}
+
+//////////////////////////////////////////// tests for bison-generated parser
+
+// test fixture for parser tests
+class KfgParseFixture : public SymbolTable
+{
+public:
+    KfgParseFixture() 
+    {
+    }
+    ~KfgParseFixture() 
+    {
+    }
+    rc_t Parse(const char* input)
+    {
+        KFGParseBlock pb; 
+        KFGScanBlock sb;
+
+        KFGScan_yylex_init(&sb, input);
+
+        pb.write_nvp=write_nvp;
+        
+        sb.self=this;
+        sb.file="test";
+        sb.look_up_var=lookup_var;
+        sb.report_error=report_error;
+        errorMsg.clear();
+        KFG_parse(&pb, &sb);
+
+        KFGScan_yylex_destroy(&sb);
+
+        return 0;
+    }
+
+    static rc_t write_nvp(void * cfg, const char* name, size_t nameLen, VNamelist* values)
+    {
+        uint32_t count;
+        rc_t rc=VNameListCount(values, &count);
+        if (rc != 0)
+        {
+            return rc;
+        }
+        string value;
+        for (uint32_t i=0; i < count; ++i)
+        {
+            const char* val;
+            rc=VNameListGet(values, i, &val);
+            if (rc != 0)
+            {
+                return rc;
+            }
+            value+=string(val, strlen(val));
+        }
+
+        KfgParseFixture* config=(KfgParseFixture*)cfg;
+        (*config)[string(name, nameLen)] = value;
+
+        return 0;
+    }
+
+    static void report_error(KFGScanBlock* sb, const char* msg)
+    {
+        KfgParseFixture* obj=((KfgParseFixture*)sb->self);
+        obj->errorMsg   = msg;
+        obj->errorLine  = sb->lastToken->line_no;
+        obj->errorCol   = sb->lastToken->column_no;
+        const char* token=sb->lastToken->tokenText;
+        obj->errorToken =string(token, sb->lastToken->tokenLength);
+    }
+
+    size_t errorLine;
+    size_t errorCol;
+    string errorToken;
+    string errorMsg;
+};
+
+FIXTURE_TEST_CASE(KfgParseEmptyFile, KfgParseFixture)
+{
+    REQUIRE_RC(Parse(""));
+    REQUIRE_EQ(size(), (size_t)0);
+    REQUIRE_RC(Parse("\n\n"));
+    REQUIRE_EQ(size(), (size_t)0);
+}
+
+FIXTURE_TEST_CASE(KfgParseOneNameValue, KfgParseFixture)
+{
+    REQUIRE_RC(Parse("name = \"value\""));  // no \n before EOF
+    REQUIRE_EQ(size(), (size_t)1);
+    REQUIRE_EQ((*this)["name"], string("value"));
+}
+
+FIXTURE_TEST_CASE(KfgParseMultNameValue, KfgParseFixture)
+{
+    REQUIRE_RC(Parse(
+        "name1 = \"value1\"\n"
+        "name2 = \"value2\"/**\n\n**/"    // comment with \n inside serves as a line end
+        "name3 = \"value3\"\n"
+        ));
+    REQUIRE_EQ(size(), (size_t)3);
+    REQUIRE_EQ((*this)["name1"], string("value1"));
+    REQUIRE_EQ((*this)["name2"], string("value2"));
+    REQUIRE_EQ((*this)["name3"], string("value3"));
+}
+
+FIXTURE_TEST_CASE(KfgParseAbsPath, KfgParseFixture)
+{
+    REQUIRE_RC(Parse("/id/1name/1 = \"value\"\n")); 
+    REQUIRE_EQ(size(), (size_t)1);
+    REQUIRE_EQ((*this)["/id/1name/1"], string("value"));
+}
+
+FIXTURE_TEST_CASE(KfgParseRelPath, KfgParseFixture)
+{
+    REQUIRE_RC(Parse("1/name1/id = \"value\"\n")); 
+    REQUIRE_EQ(size(), (size_t)1);
+    REQUIRE_EQ((*this)["1/name1/id"], string("value"));
+}
+
+FIXTURE_TEST_CASE(KfgParseEscString, KfgParseFixture)
+{
+    REQUIRE_RC(Parse("1/name1/id = \"v\\tlue\"\n")); 
+    REQUIRE_EQ(size(), (size_t)1);
+    REQUIRE_EQ((*this)["1/name1/id"], string("v\tlue")); 
+}
+
+FIXTURE_TEST_CASE(KfgParseVarRefSimple, KfgParseFixture)
+{
+    REQUIRE_RC(Parse(
+        "ref='value'\n"
+        "var = $(ref)"
+        )); 
+    REQUIRE_EQ((*this)["var"], string("value"));
+}
+
+FIXTURE_TEST_CASE(KfgParseVarRefSimpleUndefined, KfgParseFixture)
+{
+    REQUIRE_RC(Parse(
+        "ref='value'\n"
+        "var1 = $(reff)\n"
+        "var2 = $(ref)\n"
+        "var3 = $(var1)"
+        )); 
+    REQUIRE_EQ((*this)["var1"], string("")); 
+    REQUIRE_EQ((*this)["var2"], string("value")); // and recovered from
+    REQUIRE_EQ((*this)["var3"], string("")); // var1 is usable 
+}
+
+FIXTURE_TEST_CASE(KfgParseSyntaxRecovery1, KfgParseFixture)
+{
+    REQUIRE_RC(Parse(
+        "a='q'nn\n" // syntax error (name) and skip to eol
+        "name='val'" // this should parse
+        )); 
+    REQUIRE_EQ(errorLine, (size_t)1); 
+    REQUIRE_EQ(errorCol, (size_t)6);  
+    REQUIRE_EQ(errorToken, string("nn")); 
+    REQUIRE_EQ(errorMsg, string("syntax error")); 
+    REQUIRE_EQ((*this)["name"], string("val")); 
+}
+
+FIXTURE_TEST_CASE(KfgParseSyntaxRecovery2, KfgParseFixture)
+{
+    REQUIRE_RC(Parse(
+        "a='q'%\n"  // syntax error (unrecognized character) and skip to eol
+        "name='val'" // this should parse
+        )); 
+    REQUIRE_EQ(errorLine, (size_t)1); 
+    REQUIRE_EQ(errorCol, (size_t)6);  
+    REQUIRE_EQ(errorToken, string("%")); 
+    REQUIRE_EQ(errorMsg, string("syntax error")); 
+    REQUIRE_EQ((*this)["name"], string("val")); 
+}
+
+FIXTURE_TEST_CASE(KfgParseVarRefPath, KfgParseFixture)
+{
+    REQUIRE_RC(Parse(
+        "ref/sub='value'\n"
+        "var = $(ref/sub)"
+        )); 
+    REQUIRE_EQ((*this)["var"], string("value"));
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "wb-test-kfg";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc = KfgWbTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kfs/Makefile b/test/kfs/Makefile
new file mode 100644
index 0000000..47ea200
--- /dev/null
+++ b/test/kfs/Makefile
@@ -0,0 +1,137 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/kfs
+
+TEST_TOOLS = \
+	test-kfs \
+    test-ramfile \
+    test-resolve \
+    test-cachetee \
+	test-kfs-md5
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# test-kfs
+#
+TEST_KFS_SRC = \
+	kfstest 
+
+TEST_KFS_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_KFS_SRC))
+
+TEST_KFS_LIB = \
+	-lkapp \
+    -sncbi-vdb \
+	-lktst
+
+ifeq (1,$(HAVE_MAGIC))
+	TEST_KFS_LIB += -skff -lmagic
+	CPPFLAGS += -DHAVE_KFF
+endif
+
+$(TEST_BINDIR)/test-kfs: $(TEST_KFS_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_KFS_LIB)
+
+#-------------------------------------------------------------------------------
+# test-kfs-md5
+#
+TEST_MD5_SRC = \
+	md5test 
+
+TEST_MD5_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_MD5_SRC))
+
+TEST_MD5_LIB = \
+	-skapp \
+    -sncbi-vdb \
+	-sktst
+
+$(TEST_BINDIR)/test-kfs-md5: $(TEST_MD5_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_MD5_LIB)
+
+
+#-------------------------------------------------------------------------------
+# test-ramfile
+#
+TEST_RAMFILE_SRC = \
+	ramfiletest 
+
+TEST_RAMFILE_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_RAMFILE_SRC))
+
+TEST_RAMFILE_LIB = \
+	-lkapp \
+    -sncbi-vdb \
+	-lktst
+
+$(TEST_BINDIR)/test-ramfile: $(TEST_RAMFILE_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_RAMFILE_LIB)
+
+#-------------------------------------------------------------------------------
+# test-resolve
+#
+TEST_RESOLVE_SRC = \
+	resolvetest 
+
+TEST_RESOLVE_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_RESOLVE_SRC))
+
+TEST_RESOLVE_LIB = \
+	-lkapp \
+    -sncbi-vdb \
+	-lktst
+
+$(TEST_BINDIR)/test-resolve: $(TEST_RESOLVE_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_RESOLVE_LIB)
+
+#-------------------------------------------------------------------------------
+# test-cachetee
+#
+TEST_CACHETEE_SRC = \
+	cacheteetest
+
+TEST_CACHETEE_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_CACHETEE_SRC))
+
+TEST_CACHETEE_LIB = \
+	-lkapp \
+    -sncbi-vdb \
+	-lktst
+
+$(TEST_BINDIR)/test-cachetee: $(TEST_CACHETEE_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_CACHETEE_LIB)
diff --git a/test/kfs/cacheteetest.cpp b/test/kfs/cacheteetest.cpp
new file mode 100644
index 0000000..be2eab0
--- /dev/null
+++ b/test/kfs/cacheteetest.cpp
@@ -0,0 +1,603 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for cacheteefile
+*/
+
+#include <cstring>
+#include <cstdlib>
+#include <ctime>
+#include <algorithm>
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <kproc/thread.h>
+
+#include <kfs/defs.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/cacheteefile.h>
+
+using namespace std;
+
+#define DATAFILE "org.dat"
+#define CACHEFILE "cache.dat"
+#define CACHEFILE1 "cache.dat.cache"
+#define DATAFILESIZE ( ( 1024 * 1024 ) + 300 )
+#define BLOCKSIZE 128
+
+TEST_SUITE( CacheTeeTests );
+
+// this is not what we are testing...
+
+static uint32_t rand_32( uint32_t min, uint32_t max )
+{
+       double scaled = ( ( double )rand() / RAND_MAX );
+       return ( ( max - min + 1 ) * scaled ) + min;
+}
+
+static rc_t fill_file_with_random_data( KFile * file, size_t file_size )
+{
+	rc_t rc = KFileSetSize( file, file_size );
+	if ( rc == 0 )
+	{
+		uint64_t pos = 0;
+		size_t total = 0;
+		while ( rc == 0 && total < file_size )
+		{
+			uint32_t data[ 512 ];
+			uint32_t i;
+			size_t to_write, num_writ;
+			
+			for ( i = 0; i < 512; ++i ) data[ i ] = rand_32( 0, 0xFFFFFFFF - 1 );
+			to_write = ( file_size - total );
+			if ( to_write > sizeof data ) to_write = sizeof data;
+			rc = KFileWriteAll ( file, pos, data, to_write, &num_writ );
+			if ( rc == 0 )
+			{
+				pos += num_writ;
+				total += num_writ;
+			}
+		}
+	}
+	return rc;
+}
+
+static rc_t create_random_file( const char * filename, uint64_t file_size )
+{
+    KDirectory * dir;
+    rc_t rc = KDirectoryNativeDir( &dir );
+	if ( rc == 0 )
+	{
+		KFile * file;
+		rc = KDirectoryCreateFile ( dir, &file, false, 0664, kcmInit, filename );
+		if ( rc == 0 )
+		{
+			if ( rc == 0 )
+				rc = fill_file_with_random_data( file, file_size );
+			KFileRelease( file );
+		}
+		KDirectoryRelease( dir );
+	}
+	return rc;
+}
+
+
+static rc_t remove_file( const char * filename )
+{
+    KDirectory * dir;
+    rc_t rc = KDirectoryNativeDir( &dir );
+	if ( rc == 0 )
+	{
+		rc = KDirectoryRemove ( dir, true, "%s", filename );
+		KDirectoryRelease( dir );
+	}
+	return rc;
+}
+
+
+static rc_t compare_file_content( const KFile * file1, const KFile * file2, uint64_t pos, size_t bytes )
+{
+	rc_t rc = 0;
+	uint8_t * buffer1 = ( uint8_t * )malloc( bytes );
+	if ( buffer1 == NULL )
+		rc = RC ( rcRuntime, rcBuffer, rcConstructing, rcMemory, rcExhausted );
+	else
+	{
+		uint8_t * buffer2 = ( uint8_t * )malloc( bytes );
+		if ( buffer2 == NULL )
+			rc = RC ( rcRuntime, rcBuffer, rcConstructing, rcMemory, rcExhausted );
+		else
+		{
+			size_t num_read1;
+			rc = KFileReadAll ( file1, pos, buffer1, bytes, &num_read1 );
+			if ( rc == 0 )
+			{
+				size_t num_read2;
+				rc = KFileReadAll ( file2, pos, buffer2, bytes, &num_read2 );
+				if ( rc == 0 )
+				{
+					if ( num_read1 != num_read2 )
+						rc = RC ( rcRuntime, rcBuffer, rcReading, rcMemory, rcInvalid );
+					else
+					{
+						int diff = memcmp( buffer1, buffer2, num_read1 );
+						if ( diff != 0 )
+							rc = RC ( rcRuntime, rcBuffer, rcReading, rcMemory, rcCorrupt );
+					}
+				}
+			}
+			free( buffer2 );
+		}
+		free( buffer1 );
+	}
+	return rc;
+}
+
+
+static rc_t read_partial( const KFile * src, size_t block_size, uint64_t to_read )
+{
+    rc_t rc = 0;
+    uint8_t * buffer = ( uint8_t * )malloc( block_size );
+    if ( buffer == NULL )
+		rc = RC ( rcRuntime, rcBuffer, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+		uint64_t pos = 0;
+		uint64_t total_read = 0;
+		while ( rc == 0 && total_read < to_read )
+		{
+			size_t num_read;
+			if ( block_size > ( to_read - total_read ) )
+				rc = KFileReadAll ( src, pos, buffer, to_read - total_read, &num_read );
+			else
+				rc = KFileReadAll ( src, pos, buffer, block_size, &num_read );
+			if ( rc == 0 )
+			{
+				pos += num_read;
+				total_read += num_read;
+			}
+		}
+        free( buffer );
+    }
+    return rc;
+}
+
+
+static rc_t read_all( const KFile * src, size_t block_size )
+{
+    rc_t rc = 0;
+    uint8_t * buffer = ( uint8_t * )malloc( block_size );
+    if ( buffer == NULL )
+		rc = RC ( rcRuntime, rcBuffer, rcConstructing, rcMemory, rcExhausted );
+    else
+    {
+		uint64_t pos = 0;
+		size_t num_read = 1;
+		while ( rc == 0 && num_read > 0 )
+		{
+			rc = KFileReadAll ( src, pos, buffer, block_size, &num_read );
+			if ( rc == 0 )	pos += num_read;
+		}
+        free( buffer );
+    }
+    return rc;
+}
+
+
+// we create a data-file that we want to wrap ....
+static rc_t prepare_cachetee_tests( void )
+{
+	rc_t rc = create_random_file( DATAFILE, DATAFILESIZE );
+	remove_file( CACHEFILE );
+	remove_file( CACHEFILE1 );
+	return rc;
+}
+
+// we remove everything that was created ...
+static void finish_cachetee_tests( void )
+{
+	remove_file( DATAFILE );
+	remove_file( CACHEFILE );
+	remove_file( CACHEFILE1 );
+}
+
+//////////////////////////////////////////// Test-cases
+
+TEST_CASE( CacheTee_Basic )
+{
+	KOutMsg( "Test: CacheTee_Basic\n" );
+	
+    KDirectory * dir;
+    REQUIRE_RC( KDirectoryNativeDir( &dir ) );
+
+	const KFile * org;
+    REQUIRE_RC( KDirectoryOpenFileRead( dir, &org, "%s", DATAFILE ) );
+	
+	const KFile * tee;
+	REQUIRE_RC( KDirectoryMakeCacheTee ( dir, &tee, org, BLOCKSIZE, "%s", CACHEFILE ) );
+
+	REQUIRE_RC( KFileRelease( tee ) );
+	REQUIRE_RC( KFileRelease( org ) );
+	
+	const KFile * cache;
+	REQUIRE_RC( KDirectoryOpenFileRead( dir, &cache, "%s.cache", CACHEFILE ) );
+	
+	bool is_complete;
+	REQUIRE_RC( IsCacheFileComplete( cache, &is_complete ) );	
+	REQUIRE( !is_complete );
+	
+	float percent;
+	uint64_t bytes_in_cache;
+	REQUIRE_RC( GetCacheCompleteness( cache, &percent, &bytes_in_cache ) );
+	REQUIRE( ( percent == 0.0 ) );
+	REQUIRE( ( bytes_in_cache == 0 ) );
+	
+	REQUIRE_RC( KFileRelease( cache ) );
+	REQUIRE_RC( KDirectoryRelease( dir ) );
+}                                 
+
+
+TEST_CASE( CacheTee_Read )
+{
+	KOutMsg( "Test: CacheTee_Read\n" );
+	
+    KDirectory * dir;
+    REQUIRE_RC( KDirectoryNativeDir( &dir ) );
+
+	const KFile * org;
+    REQUIRE_RC( KDirectoryOpenFileRead( dir, &org, "%s", DATAFILE ) );
+	
+	const KFile * tee;
+	REQUIRE_RC( KDirectoryMakeCacheTee ( dir, &tee, org, BLOCKSIZE, "%s", CACHEFILE ) );
+
+	REQUIRE_RC( compare_file_content( org, tee, 0, 100 ) );						// small read at pos zero
+	REQUIRE_RC( compare_file_content( org, tee, 10, 100 ) );						// small read at pos 10
+	REQUIRE_RC( compare_file_content( org, tee, 1024 * 128, 100 ) );				// small read at block boundary
+	REQUIRE_RC( compare_file_content( org, tee, 100, 1024 * 128 + 500 ) );			// large read crossing block boundary
+	REQUIRE_RC( compare_file_content( org, tee, 200, 1024 * 128 * 3 ) );			// very large read at pos 200
+	REQUIRE_RC( compare_file_content( org, tee, 1024 * 128 * 2 + 10, 100 ) );		// small read after block boundary
+	REQUIRE_RC( compare_file_content( org, tee, 1024 * 128 * 2 - 10, 100 ) );		// small read crossing block boundary	
+	REQUIRE_RC( compare_file_content( org, tee, DATAFILESIZE - 100, 300 ) );		// small read crossing EOF
+	
+	REQUIRE_RC( KFileRelease( tee ) );	
+	REQUIRE_RC( KFileRelease( org ) );
+	REQUIRE_RC( KDirectoryRelease( dir ) );
+}
+
+TEST_CASE( CacheTee_Promoting )
+{
+	KOutMsg( "Test: CacheTee_Promoting\n" );
+	
+	remove_file( CACHEFILE );	// to start with a clean slate on caching...
+	remove_file( CACHEFILE1 );
+
+    KDirectory * dir;
+    REQUIRE_RC( KDirectoryNativeDir( &dir ) );
+
+	const KFile * org;
+    REQUIRE_RC( KDirectoryOpenFileRead( dir, &org, "%s", DATAFILE ) );
+	
+	const KFile * tee;
+	REQUIRE_RC( KDirectoryMakeCacheTee ( dir, &tee, org, BLOCKSIZE, "%s", CACHEFILE ) );
+
+	REQUIRE_RC( read_partial( tee, 1024 * 32, DATAFILESIZE / 2 ) );
+	REQUIRE_RC( KFileRelease( tee ) );
+	
+	const KFile * cache;
+	REQUIRE_RC( KDirectoryOpenFileRead( dir, &cache, "%s.cache", CACHEFILE ) );
+
+	bool is_complete;
+	REQUIRE_RC( IsCacheFileComplete( cache, &is_complete ) );	
+	REQUIRE( !is_complete );
+
+	float percent;
+	REQUIRE_RC( GetCacheCompleteness( cache, &percent, NULL ) );
+	REQUIRE( ( percent >= 50.0 ) );
+
+	REQUIRE_RC( KFileRelease( cache ) );
+
+	remove_file( CACHEFILE1 );
+
+	REQUIRE_RC( KDirectoryMakeCacheTee ( dir, &tee, org, BLOCKSIZE, "%s", CACHEFILE ) );
+	REQUIRE_RC( read_all( tee, 1024 * 32 ) );	//	this should trigger the promotion of the cache file from cache.dat.cache to cache.dat
+	REQUIRE_RC( KFileRelease( tee ) );	
+	
+	REQUIRE_RC( KDirectoryOpenFileRead( dir, &cache, "%s", CACHEFILE ) ); // if we can open this file then, it was promoted...
+	REQUIRE_RC( KFileRelease( cache ) );
+	
+	REQUIRE_RC( KFileRelease( org ) );	
+	REQUIRE_RC( KDirectoryRelease( dir ) );
+}
+
+static rc_t cache_access( int tid, int num_threads, const KFile * origfile, const KFile * cacheteefile )
+{
+    rc_t rc;
+    int i;
+    const int num_chunks = 256;
+    int chunk_pos[num_chunks];
+    int data_size = DATAFILESIZE / num_threads;
+    int data_offset = data_size * (tid - 1);
+    int chunk_size;
+    // last thread should read all remaining bytes
+    if (tid == num_threads)
+        data_size = DATAFILESIZE - data_offset;
+    chunk_size = data_size / num_chunks;
+
+    for ( i = 0; i < num_chunks; ++i )
+    {
+        chunk_pos[i] = i * chunk_size + data_offset;
+    }
+    std::random_shuffle(&chunk_pos[0], &chunk_pos[num_chunks]);
+    for ( i = 0; i < num_chunks; ++i )
+    {
+        rc = compare_file_content( origfile, cacheteefile, chunk_pos[i], chunk_size );
+        if ( rc != 0 )
+            break;
+    }
+    if ( rc == 0 )
+        KOutMsg( "Test: Thread #%d OK\n", tid );
+    else
+        KOutMsg( "Test: Thread #%d failed\n", tid );
+					
+	return rc;
+}
+
+struct ThreadData
+{
+    int tid;
+    int num_threads;
+    const KFile * origfile; // optional
+    const KFile * cacheteefile; // optional
+};
+
+static rc_t CC thread_func( const KThread *self, void *data )
+{
+    ThreadData * td = ( ThreadData * ) data;
+    if ( td->cacheteefile == NULL || td->origfile == NULL )
+    {
+        KDirectory * dir;
+        rc_t rc = KDirectoryNativeDir( &dir );
+        if ( rc == 0 )
+        {
+            const KFile * org;
+            rc = KDirectoryOpenFileRead( dir, &org, "%s", DATAFILE );
+            if ( rc == 0 )
+            {
+                const KFile * tee;
+                rc = KDirectoryMakeCacheTee ( dir, &tee, org, BLOCKSIZE, "%s", CACHEFILE );
+                if ( rc == 0 )
+                {
+                    rc = cache_access( td->tid, td->num_threads, org, tee );
+                    KFileRelease( tee );
+                }
+                KFileRelease( org );
+            }
+            KDirectoryRelease( dir );
+        }
+        return rc;
+    }
+	return cache_access( td->tid, td->num_threads, td->origfile, td->cacheteefile );
+}
+
+TEST_CASE( CacheTee_Multiple_Users_Multiple_Inst )
+{
+	KOutMsg( "Test: CacheTee_Multiple_Users_Multiple_Inst\n" );
+	remove_file( CACHEFILE );	// to start with a clean slate on caching...
+	remove_file( CACHEFILE1 );
+
+	const int n = 8;
+	KThread *t [ n ];
+	ThreadData td [ n ];
+	rc_t rc = 0;
+	for ( int i = 0; i < n && rc == 0; ++i )
+	{
+		td[ i ].tid = i + 1;
+		td[ i ].num_threads = n;
+		td[ i ].origfile = NULL;
+		td[ i ].cacheteefile = NULL;
+		rc = KThreadMake ( &( t[ i ] ), thread_func, &( td[ i ] ) );
+		REQUIRE_RC( rc );
+	}
+	
+	for ( int i = 0; i < n && rc == 0; ++i )
+	{
+		rc_t rc_thread;
+		rc = KThreadWait ( t[ i ], &rc_thread );
+		REQUIRE_RC( rc );
+		REQUIRE_RC( rc_thread );
+		REQUIRE_RC( KThreadRelease ( t[ i ] ) );
+	}
+}
+
+TEST_CASE( CacheTee_Multiple_Users_Single_Inst )
+{
+    KOutMsg( "Test: CacheTee_Multiple_Users_Single_Inst\n" );
+    remove_file( CACHEFILE );   // to start with a clean slate on caching...
+    remove_file( CACHEFILE1 );
+
+    KDirectory * dir;
+    const KFile * org;
+    const KFile * tee;
+    REQUIRE_RC( KDirectoryNativeDir( &dir ) );
+    REQUIRE_RC( KDirectoryOpenFileRead( dir, &org, "%s", DATAFILE ) );
+    REQUIRE_RC( KDirectoryMakeCacheTee ( dir, &tee, org, BLOCKSIZE, "%s", CACHEFILE ) );
+
+    const int n = 8;
+    KThread *t [ n ];
+    ThreadData td [ n ];
+    rc_t rc = 0;
+    for ( int i = 0; i < n && rc == 0; ++i )
+    {
+        td[ i ].tid = i + 1;
+        td[ i ].num_threads = n;
+        td[ i ].origfile = org;
+        td[ i ].cacheteefile = tee;
+        rc = KThreadMake ( &( t[ i ] ), thread_func, &( td[ i ] ) );
+        REQUIRE_RC( rc );
+    }
+
+    for ( int i = 0; i < n && rc == 0; ++i )
+    {
+        rc_t rc_thread;
+        rc = KThreadWait ( t[ i ], &rc_thread );
+        REQUIRE_RC( rc );
+        REQUIRE_RC( rc_thread );
+        REQUIRE_RC( KThreadRelease ( t[ i ] ) );
+    }
+
+    REQUIRE_RC( KFileRelease( tee ) );
+    REQUIRE_RC( KFileRelease( org ) );
+    REQUIRE_RC( KDirectoryRelease( dir ) );
+}
+
+// TODO: fix, this does not work on Windows
+#if !defined(WINDOWS) && !defined(_WIN32)
+TEST_CASE( CacheTee_ReadOnly )
+{
+	KOutMsg( "Test: CacheTee_ReadOnly\n" );
+	remove_file( CACHEFILE );	// to start with a clean slate on caching...
+	remove_file( CACHEFILE1 );
+
+    KDirectory * dir;
+    REQUIRE_RC( KDirectoryNativeDir( &dir ) );
+
+	const KFile * org;
+    REQUIRE_RC( KDirectoryOpenFileRead( dir, &org, "%s", DATAFILE ) );
+
+	/* make a fresh cache-tee and read 100 bytes from it... */
+	const KFile * tee;
+	REQUIRE_RC( KDirectoryMakeCacheTee ( dir, &tee, org, BLOCKSIZE, "%s", CACHEFILE ) );
+	REQUIRE_RC( read_partial( tee, 100, 100 ) );
+	REQUIRE_RC( KFileRelease( tee ) );
+
+	REQUIRE_RC( KDirectorySetAccess ( dir, false, 0, 0222, "%s", CACHEFILE1 ) );
+    
+	/* make a second cache-tee and read all from it... */
+	REQUIRE_RC( KDirectoryMakeCacheTee ( dir, &tee, org, BLOCKSIZE, "%s", CACHEFILE ) );
+	REQUIRE_RC( read_all( tee, 1024 * 32 )	);
+	REQUIRE_RC( KFileRelease( tee ) );
+
+	/* we read all from the tee-file that should have promoted it on Release,
+	   but we made it read only before the creation of the 2nd tee-file
+	   because of that it should not be promoted and not complete */
+	
+	const KFile * cache;
+	REQUIRE_RC_FAIL( KDirectoryOpenFileRead( dir, &cache, "%s", CACHEFILE ) );
+	REQUIRE_RC( KDirectoryOpenFileRead( dir, &cache, "%s", CACHEFILE1 ) );
+	
+	bool is_complete;
+	REQUIRE_RC( IsCacheFileComplete( cache, &is_complete ) );	
+	REQUIRE( !is_complete );
+
+	REQUIRE_RC( KFileRelease( cache ) );		
+	REQUIRE_RC( KFileRelease( org ) );	
+	REQUIRE_RC( KDirectoryRelease( dir ) );
+  
+}
+#endif
+
+TEST_CASE( CacheTee_Multiple_Users_with_Promoting )
+{
+	KOutMsg( "Test: CacheTee_Multiple_Users_with_Promoting\n" );
+	remove_file( CACHEFILE );	// to start with a clean slate on caching...
+	remove_file( CACHEFILE1 );
+
+    KDirectory * dir;
+    REQUIRE_RC( KDirectoryNativeDir( &dir ) );
+
+	const KFile * org;
+    REQUIRE_RC( KDirectoryOpenFileRead( dir, &org, "%s", DATAFILE ) );
+
+	/* make 2 cache-tee's */
+	const KFile * tee1;
+	REQUIRE_RC( KDirectoryMakeCacheTee ( dir, &tee1, org, BLOCKSIZE, "%s", CACHEFILE ) );
+	const KFile * tee2;
+	REQUIRE_RC( KDirectoryMakeCacheTee ( dir, &tee2, org, BLOCKSIZE, "%s", CACHEFILE ) );
+
+	/* read all from tee1 and release it, that will trigger promotion */
+	REQUIRE_RC( read_all( tee1, 1024 * 32 )	);
+	REQUIRE_RC( KFileRelease( tee1 ) );
+
+	/* read a little bit from tee2 and release it, will it corrupt the cache? */	
+	REQUIRE_RC( read_partial( tee2, 100, 100 ) );
+	REQUIRE_RC( KFileRelease( tee2 ) );
+
+	/* the ( newly ) promoted cache file has to be not corrupt */
+	REQUIRE_RC( KDirectoryMakeCacheTee ( dir, &tee1, org, BLOCKSIZE, "%s", CACHEFILE ) );
+	REQUIRE_RC( KFileRelease( tee1 ) );
+
+	/* the .cache - file has to be gone */
+	uint32_t pt = KDirectoryPathType ( dir, "%s", CACHEFILE1 );
+	REQUIRE( pt == kptNotFound );
+	
+	REQUIRE_RC( KFileRelease( org ) );	
+	REQUIRE_RC( KDirectoryRelease( dir ) );
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+
+rc_t CC UsageSummary ( const char * progname )
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "cachetee-test";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    srand(time(NULL));
+    KConfigDisableUserSettings();
+	rc_t rc = prepare_cachetee_tests();
+	if ( rc == 0 )
+	{
+		rc = CacheTeeTests( argc, argv );
+		finish_cachetee_tests();
+	}
+	KOutMsg( "and the result is: %d", rc );
+    return rc;
+}
+
+}
diff --git a/test/kfs/kfstest.cpp b/test/kfs/kfstest.cpp
new file mode 100644
index 0000000..928611e
--- /dev/null
+++ b/test/kfs/kfstest.cpp
@@ -0,0 +1,198 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for Kfs interface
+*/
+
+#include <cstring>
+
+#include <ktst/unit_test.hpp>
+#include <kfs/mmap.h>
+#include <kfs/directory.h>
+#include <kfs/impl.h>
+#include <kfs/tar.h>
+
+#include <kfs/ffext.h>
+#include <kfs/ffmagic.h>
+
+#define class clss
+#include <kfs/fileformat.h>
+#undef class
+
+#include "../../libs/kfs/toc-priv.h"
+
+using namespace std;
+
+TEST_SUITE(KfsTestSuite);
+
+TEST_CASE(KMMapMakeRead_and_KMMapRelease)
+{   // create a temporary file, open it with KMMapMakeRead, close KMMap, try to delete 
+
+    KDirectory *wd;
+    REQUIRE_RC(KDirectoryNativeDir ( & wd ));
+
+    const char* fileName="test.file";
+
+    {   // create temp file, close
+        KFile* file;
+        const char* contents="contents";
+        REQUIRE_RC(KDirectoryCreateFile(wd, &file, true, 0664, kcmInit, fileName));
+        size_t num_writ=0;
+        REQUIRE_RC(KFileWrite(file, 0, contents, strlen(contents), &num_writ));
+        REQUIRE_RC(KFileRelease(file));
+    }
+
+    {   // open, memory-map, close
+        const KFile* file;
+        REQUIRE_RC(KDirectoryOpenFileRead(wd, &file, fileName));
+        const KMMap * mm;
+        REQUIRE_RC(KMMapMakeRead(&mm, file));
+        REQUIRE_RC(KMMapRelease(mm));
+
+        REQUIRE_RC(KFileRelease(file));
+    }
+
+    // now, remove the file
+    // on Windows: used to return ACCESS_DENIED, not removed file 
+    // (cause: no call to UnmapViewOfFile in libs\kfs\win\KMapUnmap)
+    REQUIRE_RC(KDirectoryRemove(wd, false, fileName)); 
+
+    REQUIRE_RC(KDirectoryRelease ( wd ));
+}
+
+#ifdef HAVE_KFF
+
+TEST_CASE(ExtFileFormat)
+{
+    struct KFileFormat* pft;
+    const char format[] = {
+        "ext1\tTestFormat1\n"
+        "ext2\tTestFormat2\n"
+    };
+    const char typeAndClass[] = {
+        "TestFormat1\tTestClass1\n"
+        "TestFormat2\tTestClass2\n"
+    };
+    REQUIRE_RC(KExtFileFormatMake(&pft, format, sizeof(format) - 1, typeAndClass, sizeof(typeAndClass) - 1));
+    
+    KFileFormatType type;
+    KFileFormatClass clss;
+    char descr[1024];
+    size_t length;
+    REQUIRE_RC(KFileFormatGetTypePath(pft, 
+                                      NULL, // ignored
+                                      "qq.ext2", 
+                                      &type, 
+                                      &clss,
+                                      descr, 
+                                      sizeof(descr),
+                                      &length));    
+    REQUIRE_EQ(type, 2);
+    REQUIRE_EQ(clss, 2);
+    REQUIRE_EQ(string(descr, length), string("TestFormat2"));
+    
+    REQUIRE_RC(KFileFormatGetClassDescr(pft, clss, descr, sizeof (descr)));        
+    REQUIRE_EQ(string(descr), string("TestClass2"));
+    REQUIRE_EQ(length, string("TestClass2").length()+1);
+    REQUIRE_RC(KFileFormatRelease(pft));
+}
+
+TEST_CASE(MagicFileFormat)
+{
+    struct KFileFormat* pft;
+    const char magic[] = 
+    {
+        "Generic Format for Sequence Data (SRF)\tSequenceReadFormat\n"
+        "GNU tar archive\tTapeArchive\n"
+    };
+    const char typeAndClass[] = {
+        "SequenceReadFormat\tRead\n"
+        "TapeArchive\tArchive\n"
+    };
+    REQUIRE_RC(KMagicFileFormatMake (&pft, "/usr/share/misc/magic", magic, sizeof(magic) - 1, typeAndClass, sizeof(typeAndClass) - 1));
+    REQUIRE_RC(KFileFormatRelease(pft));
+}
+
+#endif
+
+TEST_CASE(Tar_Parse)
+{
+    KDirectory *dir;
+    REQUIRE_RC(KDirectoryNativeDir(&dir));    
+    
+    const KDirectory *tarDir;
+    REQUIRE_RC(KDirectoryOpenTarArchiveRead(dir, &tarDir, false, "test.tar"));
+    
+    struct KNamelist *list;
+    REQUIRE_RC(KDirectoryList(tarDir, &list, NULL, NULL, NULL));
+    
+    uint32_t count;
+    REQUIRE_RC(KNamelistCount(list, &count));
+    REQUIRE_EQ(count, (uint32_t)2);
+    
+    const char* name;
+    REQUIRE_RC(KNamelistGet(list, 0, &name));
+    REQUIRE_EQ(string(name), string("Makefile"));
+    REQUIRE_RC(KNamelistGet(list, 1, &name));
+    REQUIRE_EQ(string(name), string("kfstest.cpp"));
+    
+    REQUIRE_RC(KNamelistRelease(list));
+    REQUIRE_RC(KDirectoryRelease(tarDir));
+    REQUIRE_RC(KDirectoryRelease(dir));
+}                                 
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-kfs";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=KfsTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kfs/md5test.cpp b/test/kfs/md5test.cpp
new file mode 100644
index 0000000..b71eee0
--- /dev/null
+++ b/test/kfs/md5test.cpp
@@ -0,0 +1,199 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for KMD5File
+*/
+
+#include <cstring>
+#include <cstdio>
+
+#include <ktst/unit_test.hpp>
+
+#include <kfs/directory.h>
+#include <kfs/impl.h>
+#include <kfs/md5.h>
+
+
+#define class clss
+#include <kfs/fileformat.h>
+#undef class
+
+using namespace std;
+
+TEST_SUITE(KMD5FileTestSuite);
+
+TEST_CASE(KMD5WriteFileTruncateAfterChange)
+{
+    KDirectory *wd;
+    REQUIRE_RC(KDirectoryNativeDir ( & wd ));
+
+    const char* filename = "md5test_trunc.file";
+    const char* md5sums_filename = "md5test_sums_trunc.file";
+    const char* contents = "contents";
+
+    {   // create temp file, close
+        KFile* file;
+        REQUIRE_RC( KDirectoryCreateFile(wd, &file, true, 0664, kcmInit, filename) );
+        
+        size_t num_writ;
+        REQUIRE_RC( KFileWrite(file, 0, contents, strlen(contents), &num_writ) );
+        assert(num_writ == strlen(contents));
+        
+        uint64_t file_size;
+        REQUIRE_RC( KFileSize(file, &file_size) );
+        REQUIRE( file_size == strlen(contents) );
+        
+        REQUIRE_RC( KFileRelease(file) );
+    }
+
+    {
+        KFile * file, * md5sums_file;
+        KMD5File * md5_file_obj;
+        KMD5SumFmt * md5sums;
+        
+        REQUIRE_RC( KDirectoryCreateFile(wd, &md5sums_file, true, 0664, kcmInit, md5sums_filename) );
+        REQUIRE_RC( KMD5SumFmtMakeUpdate(&md5sums, md5sums_file) );
+        
+        REQUIRE_RC( KDirectoryOpenFileWrite(wd, &file, true, filename) );
+        
+        REQUIRE_RC( KMD5FileMakeWrite(&md5_file_obj, file, md5sums, filename) );
+        file = KMD5FileToKFile(md5_file_obj);
+        
+        size_t num_writ;
+        REQUIRE_RC( KFileWrite(file, 0, contents, strlen(contents) - 2, &num_writ) );
+        assert(num_writ == strlen(contents) - 2);
+        
+        REQUIRE_RC( KFileRelease(file) );
+        REQUIRE_RC( KMD5SumFmtRelease(md5sums) );
+    }
+    
+    {
+        const KFile * file;
+        REQUIRE_RC( KDirectoryOpenFileRead(wd, &file, filename) );
+        
+        uint64_t file_size;
+        REQUIRE_RC( KFileSize(file, &file_size) );
+        REQUIRE( file_size == strlen(contents) - 2 );
+        
+        REQUIRE_RC( KFileRelease(file) );
+    }
+
+    REQUIRE_RC( KDirectoryRemove(wd, false, filename) );
+    REQUIRE_RC( KDirectoryRemove(wd, false, md5sums_filename) );
+
+    REQUIRE_RC( KDirectoryRelease ( wd ) );
+}
+
+TEST_CASE(KMD5WriteFileNotTruncateWithoutChange)
+{
+    KDirectory *wd;
+    REQUIRE_RC(KDirectoryNativeDir ( & wd ));
+    
+    const char* filename = "md5test_notrunc.file";
+    const char* md5sums_filename = "md5test_sums_notrunc.file";
+    const char* contents = "contents";
+    
+    {   // create temp file, close
+        KFile* file;
+        REQUIRE_RC( KDirectoryCreateFile(wd, &file, true, 0664, kcmInit, filename) );
+        
+        size_t num_writ;
+        REQUIRE_RC( KFileWrite(file, 0, contents, strlen(contents), &num_writ) );
+        assert(num_writ == strlen(contents));
+        
+        uint64_t file_size;
+        REQUIRE_RC( KFileSize(file, &file_size) );
+        REQUIRE( file_size == strlen(contents) );
+        
+        REQUIRE_RC( KFileRelease(file) );
+    }
+    
+    {
+        KFile * file, * md5sums_file;
+        KMD5File * md5_file_obj;
+        KMD5SumFmt * md5sums;
+        
+        REQUIRE_RC( KDirectoryCreateFile(wd, &md5sums_file, true, 0664, kcmInit, md5sums_filename) );
+        REQUIRE_RC( KMD5SumFmtMakeUpdate(&md5sums, md5sums_file) );
+        
+        REQUIRE_RC( KDirectoryOpenFileWrite(wd, &file, true, filename) );
+        
+        REQUIRE_RC( KMD5FileMakeWrite(&md5_file_obj, file, md5sums, filename) );
+        file = KMD5FileToKFile(md5_file_obj);
+        
+        REQUIRE_RC( KFileRelease(file) );
+        REQUIRE_RC( KMD5SumFmtRelease(md5sums) );
+    }
+    
+    {
+        const KFile * file;
+        REQUIRE_RC( KDirectoryOpenFileRead(wd, &file, filename) );
+        
+        uint64_t file_size;
+        REQUIRE_RC( KFileSize(file, &file_size) );
+        REQUIRE( file_size == strlen(contents) );
+        
+        REQUIRE_RC( KFileRelease(file) );
+    }
+    
+    REQUIRE_RC( KDirectoryRemove(wd, false, filename) );
+    REQUIRE_RC( KDirectoryRemove(wd, false, md5sums_filename) );
+    
+    REQUIRE_RC( KDirectoryRelease ( wd ) );
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-kfs-md5";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=KMD5FileTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kfs/ramfiletest.cpp b/test/kfs/ramfiletest.cpp
new file mode 100644
index 0000000..7d0376a
--- /dev/null
+++ b/test/kfs/ramfiletest.cpp
@@ -0,0 +1,199 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for KRamFile
+*/
+#include <cstring>
+#include <ktst/unit_test.hpp>
+#include <kfs/ramfile.h>
+#include <kfs/impl.h>
+#include <klib/out.h>
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+using namespace std;
+
+TEST_SUITE(RamFileTestSuite);
+
+TEST_CASE(KRamFileWrite_simple_write)
+{
+    char input [4 * 1024];
+
+    for (size_t ix = 0; ix < sizeof input;  ++ ix)
+        input [ix] = (char)(' ' + (char)(ix & 0x3F));
+
+    char buffer[4 * 1024 + 1]; // extra for NUL for display purposes
+
+    KFile * wfile;
+
+
+    for (size_t pos = 0; pos < sizeof buffer /* including the +1 */; pos += 100) // skipping a bunch since its working
+    {
+        for (size_t inc = 1; inc < sizeof (input); inc += 50) // faster since its working
+        {
+            for (size_t bsize = 0; bsize <= sizeof input + 1; bsize += inc)
+            {
+                size_t num_writ;
+
+                memset (buffer, 0, sizeof buffer);
+
+                REQUIRE_RC(KRamFileMakeWrite (&wfile, buffer, sizeof buffer - 1));
+                REQUIRE_RC(KFileWrite(wfile, pos, input, bsize, &num_writ));
+                REQUIRE(((bsize<sizeof(input))?bsize:sizeof(input))==num_writ);
+                REQUIRE(memcmp(buffer,input,num_writ) == 0);
+                REQUIRE_RC(KFileRelease(wfile));
+            }
+        }
+    }
+
+}
+
+
+TEST_CASE(KramFileWrite_append_write)
+{
+    char input [4 * 1024];
+
+    for (size_t ix = 0; ix < sizeof input;  ++ ix)
+        input [ix] = (char)(' ' + (char)(ix & 0x3F));
+
+    char buffer[4 * 1024 + 1]; // extra for NUL for display purposes
+
+    KFile * wfile;
+
+    for (size_t pos = 0; pos < sizeof buffer - 1; pos += 200)
+    {
+        for (size_t bsize = 1; bsize < sizeof buffer - 1; bsize += 200)
+        {
+            uint64_t tot_writ = 0;
+            size_t num_writ;
+
+            REQUIRE_RC(KRamFileMakeWrite (&wfile, buffer, sizeof buffer - 1));
+            memset (buffer, 0, sizeof buffer);
+
+            for (size_t off = 0; tot_writ + bsize < sizeof buffer - 1; off += num_writ)
+            {
+                REQUIRE_RC (KFileWrite(wfile, tot_writ, input + off, bsize, &num_writ));
+                REQUIRE(num_writ == bsize);
+                tot_writ += num_writ;
+
+                REQUIRE(memcmp(input,buffer,tot_writ) == 0);
+            }
+
+            REQUIRE_RC(KFileRelease(wfile));            
+        }
+    }
+}
+
+TEST_CASE(KRamFileWrite_oversized_writes)
+{
+    char input [16 * 1024];
+
+    for (size_t ix = 0; ix < sizeof input;  ++ ix)
+        input [ix] = (char)(' ' + (char)(ix & 0x3F));
+
+    char buffer[4 * 1024 + 1];
+
+    KFile * wfile;
+
+    for (size_t max = 1; max <= sizeof buffer - 1; max += 200)
+    {
+        memset (buffer, 0, sizeof buffer);
+        REQUIRE_RC(KRamFileMakeWrite (&wfile, buffer, max));
+
+        for (size_t bsize = (max+1)/2; bsize < sizeof input; bsize+= 150)
+        {
+            size_t num_writ;
+
+            REQUIRE_RC (KFileWrite(wfile, 0, input, bsize, &num_writ));
+            if (bsize > max)
+                REQUIRE(num_writ == max);
+            else
+                REQUIRE(num_writ == bsize);
+
+            REQUIRE(0 == memcmp(buffer, input, num_writ));
+            REQUIRE(0 != memcmp(buffer, input, num_writ+1));
+        }
+        REQUIRE_RC(KFileRelease(wfile));            
+    }
+}
+
+
+TEST_CASE(KRamFileWrite_shift_right)
+{
+    char input [16 * 1024];
+
+    for (size_t ix = 0; ix < sizeof input;  ++ ix)
+        input [ix] = (char)(' ' + (char)(ix & 0x3F));
+
+    char buffer[4 * 1024];
+
+    size_t num_writ;
+
+    KFile * wfile;
+
+    for (size_t bsize = 1; bsize < sizeof buffer; ++bsize)
+    {
+        REQUIRE_RC(KRamFileMakeWrite (&wfile, buffer, sizeof buffer - 1));
+
+        REQUIRE_RC(KFileWrite(wfile, 0, input, bsize, &num_writ));
+        REQUIRE(bsize = num_writ);
+        
+        REQUIRE_RC(KFileRelease(wfile));            
+    }
+    
+}
+
+//////////////////////////////////////////// Main
+
+extern "C"
+{
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+
+rc_t CC UsageSummary (const char * prog_name)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args)
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-kfg";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=RamFileTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kfs/resolvetest.cpp b/test/kfs/resolvetest.cpp
new file mode 100644
index 0000000..bbb86dc
--- /dev/null
+++ b/test/kfs/resolvetest.cpp
@@ -0,0 +1,196 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for KDirectoryResolve
+*/
+#include <cstring>
+#include <ktst/unit_test.hpp>
+#include <kfs/directory.h>
+#include <kfs/impl.h>
+#include <klib/out.h>
+#include <kapp/args.h>
+
+#include <stdexcept>
+
+using namespace std;
+
+TEST_SUITE( ResolveSuite );
+
+class ResolveFixture {
+public:
+    ResolveFixture()
+    : m_dir(0)
+    {
+        if ( KDirectoryNativeDir ( &m_dir ) != 0 )
+           throw logic_error( "ResolveFixture: KDirectoryNativeDir failed");
+    }
+    ~ResolveFixture()
+    {
+        if ( m_dir )
+        {
+            KDirectoryRelease( m_dir );
+        }
+    }
+    
+    char m_resolved[ 4 * 1024 ];
+    KDirectory *m_dir;
+};
+
+// use this in test cases based on ResolveFixture
+#define REQUIRE_RESOLVE(input, result) \
+    REQUIRE_RC( KDirectoryResolvePath ( m_dir, true, m_resolved, sizeof m_resolved, input ) ); \
+    REQUIRE_EQ(string (m_resolved), string (result) );
+
+FIXTURE_TEST_CASE( ResolveTest_Simple, ResolveFixture )
+{
+    REQUIRE_RESOLVE( "/a/22/333", "/a/22/333" );
+}
+
+FIXTURE_TEST_CASE( ResolveTest_DoubleLeading, ResolveFixture )
+{
+    REQUIRE_RC( KDirectoryResolvePath ( m_dir, true, m_resolved, sizeof m_resolved, "//1/22/333" ) );
+#ifdef WINDOWS    
+    REQUIRE_RESOLVE( "//1/22/333", "//1/22/333");
+#else
+    REQUIRE_RESOLVE( "//1/22/333", "/1/22/333");
+#endif
+}
+
+FIXTURE_TEST_CASE( ResolveTest_TrailingSlash, ResolveFixture )
+{
+    REQUIRE_RESOLVE( "/a/22/333/", "/a/22/333" );
+}
+
+FIXTURE_TEST_CASE( ResolveTest_TrailingDotSlash, ResolveFixture )
+{
+    REQUIRE_RESOLVE( "/a/22/333/./", "/a/22/333" );
+}
+
+FIXTURE_TEST_CASE( ResolveTest_CanonizeDoubleDot, ResolveFixture )
+{
+    REQUIRE_RESOLVE( "/a/22/333/../333/", "/a/22/333" );
+}
+
+FIXTURE_TEST_CASE( ResolveTest_CanonizeDoubleSlashDoubleDot, ResolveFixture )
+{
+    REQUIRE_RESOLVE( "/a/22//../333/", "/a/333" );
+}
+
+FIXTURE_TEST_CASE( ResolveTest_TrailingDoubleDot, ResolveFixture )
+{
+    REQUIRE_RESOLVE( "/a/22/333/4444/../", "/a/22/333" );
+}
+
+FIXTURE_TEST_CASE( ResolveTest_DoubleSlash, ResolveFixture )
+{
+    REQUIRE_RESOLVE( "/a/22//333", "/a/22/333" );
+}
+
+FIXTURE_TEST_CASE( ResolveTest_TripleSlash, ResolveFixture )
+{
+    REQUIRE_RESOLVE( "/a/22///333", "/a/22/333" );
+}
+
+FIXTURE_TEST_CASE( ResolveTest_TrailingTripleSlash, ResolveFixture )
+{
+    REQUIRE_RESOLVE( "/a/333///", "/a/333" );
+}
+
+FIXTURE_TEST_CASE( ResolveTest_ShortTrailingTripleSlash, ResolveFixture )
+{
+#ifdef WINDOWS    
+    REQUIRE_RESOLVE( "/a///", "/a/" ); // should not drop the '/' after the drive letter since it is significant
+#else
+    REQUIRE_RESOLVE( "/a///", "/a" ); 
+#endif    
+}
+
+FIXTURE_TEST_CASE( ResolveTest_DotsAgogo, ResolveFixture )
+{
+    REQUIRE_RESOLVE( "/a/././22/./././333/././././/", "/a/22/333" );
+}
+
+FIXTURE_TEST_CASE( ResolveTest_DoubleDotsAgogo, ResolveFixture )
+{
+    REQUIRE_RESOLVE( "/a/22/333/.././../22/333/", "/a/22/333" );
+}
+
+FIXTURE_TEST_CASE( ResolveTest_LeadingDoubleSlash, ResolveFixture )
+{
+#ifdef WINDOWS    
+    REQUIRE_RESOLVE( "//panfs/pan1", "//panfs/pan1" );
+#else
+    REQUIRE_RESOLVE( "//panfs/pan1", "/panfs/pan1" );
+#endif    
+}
+
+FIXTURE_TEST_CASE( ResolveTest_LeadingTripleSlash, ResolveFixture )
+{
+#ifdef WINDOWS    
+    REQUIRE_RESOLVE( "///panfs/pan1", "//panfs/pan1" );
+#else
+    REQUIRE_RESOLVE( "///panfs/pan1", "/panfs/pan1" );
+#endif    
+}
+
+#ifndef WINDOWS    
+FIXTURE_TEST_CASE( ResolveTest_Relative, ResolveFixture )
+{
+    REQUIRE_RC( KDirectoryResolvePath ( m_dir, false, m_resolved, sizeof m_resolved, "/" ) );
+    REQUIRE_EQ( string (m_resolved).substr(0, 9), string ("../../../") );
+}
+#endif
+
+//////////////////////////////////////////// Main
+
+extern "C"
+{
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+
+rc_t CC UsageSummary (const char * prog_name)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args)
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-resolve";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t rc = ResolveSuite( argc, argv );
+    return rc;
+}
+
+}
diff --git a/test/kfs/test.tar b/test/kfs/test.tar
new file mode 100644
index 0000000..e7dc0ca
Binary files /dev/null and b/test/kfs/test.tar differ
diff --git a/test/klib/Makefile b/test/klib/Makefile
new file mode 100644
index 0000000..a3be7f1
--- /dev/null
+++ b/test/klib/Makefile
@@ -0,0 +1,198 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/klib
+
+# WARNING: test-md5append is excluded from TEST_TOOLS since it's supposed
+# to be run manually
+TEST_TOOLS = \
+	test-asm \
+	test-printf \
+	test-log \
+	test-out \
+	test-SraReleaseVersion \
+	test-klib \
+	test-vnamelist
+    
+include $(TOP)/build/Makefile.env
+
+std: $(TEST_TOOLS)
+
+test-md5append $(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# test-asm
+#
+TEST_ASM_SRC = \
+	asm-test
+
+TEST_ASM_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_ASM_SRC))
+    
+TEST_ASM_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sktst \
+
+$(TEST_BINDIR)/test-asm: $(TEST_ASM_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_ASM_LIB)
+    
+#-------------------------------------------------------------------------------
+# test-md5append
+#
+TEST_MD5APPEND_SRC = \
+	md5appendtest
+
+TEST_MD5APPEND_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_MD5APPEND_SRC))
+    
+TEST_MD5APPEND_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sktst \
+
+$(TEST_BINDIR)/test-md5append: $(TEST_MD5APPEND_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_MD5APPEND_LIB)
+    
+#-------------------------------------------------------------------------------
+# test-printf
+#
+TEST_PRINTF_SRC = \
+	printf-test
+
+TEST_PRINTF_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_PRINTF_SRC))
+    
+TEST_PRINTF_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sktst \
+
+$(TEST_BINDIR)/test-printf: $(TEST_PRINTF_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_PRINTF_LIB)
+    
+#-------------------------------------------------------------------------------
+# test-log
+#
+TEST_LOG_SRC = \
+	test-log
+
+TEST_LOG_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_LOG_SRC))
+    
+TEST_LOG_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sktst \
+
+$(TEST_BINDIR)/test-log: $(TEST_LOG_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_LOG_LIB)
+    
+#-------------------------------------------------------------------------------
+# test-SraReleaseVersion
+#
+TEST_SRA_RELEASE_VERSION_SRC = \
+	test-SraReleaseVersion
+
+TEST_SRA_RELEASE_VERSION_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_SRA_RELEASE_VERSION_SRC))
+    
+TEST_SRA_RELEASE_VERSION_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sktst \
+
+
+$(TEST_BINDIR)/test-SraReleaseVersion: $(TEST_SRA_RELEASE_VERSION_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_SRA_RELEASE_VERSION_LIB)
+    
+valgrind_sra_release_version:
+	valgrind --ncbi $(TEST_BINDIR)/test-SraReleaseVersion
+    
+.PHONY: valgrind_SraReleaseVersion
+
+
+#-------------------------------------------------------------------------------
+# test-out
+#
+TEST_OUT_SRC = \
+	test-out
+
+TEST_OUT_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_OUT_SRC))
+
+TEST_OUT_LIB = \
+	-sncbi-vdb \
+	-sktst \
+
+$(TEST_BINDIR)/test-out: $(TEST_OUT_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_OUT_LIB)
+    
+#-------------------------------------------------------------------------------
+# test-klib
+#
+TEST_KLIB_SRC = \
+	test-klib
+
+TEST_KLIB_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_KLIB_SRC))
+
+TEST_KLIB_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sktst \
+
+$(TEST_BINDIR)/test-klib: $(TEST_KLIB_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_KLIB_LIB)
+    
+
+#-------------------------------------------------------------------------------
+# test-vnamelist
+#
+TEST_VNAMELIST_SRC = \
+	test-vnamelist
+
+TEST_VNAMELIST_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_VNAMELIST_SRC))
+
+TEST_VNAMELIST_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sktst \
+
+$(TEST_BINDIR)/test-vnamelist: $(TEST_VNAMELIST_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_VNAMELIST_LIB)
+
+VNAMELIST: test-vnamelist
+	$(TEST_BINDIR)/test-vnamelist
+
diff --git a/test/klib/asm-test.c b/test/klib/asm-test.c
new file mode 100644
index 0000000..7d47b98
--- /dev/null
+++ b/test/klib/asm-test.c
@@ -0,0 +1,114 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <arch-impl.h>
+
+static
+rc_t run ( uint32_t x, uint32_t expected_result )
+{
+    int32_t lsb = uint32_lsbit(x);
+    if (lsb != expected_result)
+    {
+        KOutMsg ( "uint32_lsbit(%u) failed, expected %u, actual %u\n", x, expected_result, lsb );
+        return -1;
+    }
+    return 0;
+}
+
+
+/* Version  EXTERN
+ *  return 4-part version code: 0xMMmmrrrr, where
+ *      MM = major release
+ *      mm = minor release
+ *    rrrr = bug-fix release
+ */
+ver_t CC KAppVersion ( void )
+{
+    return 0;
+}
+
+
+/* Usage
+ *  This function is called when the command line argument
+ *  handling sees -? -h or --help
+ */
+rc_t CC UsageSummary ( const char *progname )
+{
+    return KOutMsg (
+        "\n"
+        "Usage:\n"
+        "  %s [Options]\n"
+        "\n"
+        "Summary:\n"
+        "  Simple test of functions potentially impemented using asm.\n"
+        , progname );
+}
+
+const char UsageDefaultName[] = "asm-test";
+
+rc_t CC Usage ( const Args *args )
+{
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if (args == NULL)
+        rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+    else
+        rc = ArgsProgram (args, &fullpath, &progname);
+
+    UsageSummary (progname);
+
+    KOutMsg ("Options:\n");
+
+    HelpOptionsStandard();
+
+    HelpVersion (fullpath, KAppVersion());
+
+    return rc;
+}
+
+    
+/* KMain
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args *args;
+    rc_t rc = ArgsMakeAndHandle ( & args, argc, argv, 0 );
+    if ( rc == 0 )
+    {
+        rc = run (8, 3);
+        ArgsWhack ( args );
+    }
+
+    return rc;
+}
diff --git a/test/klib/md5appendtest.c b/test/klib/md5appendtest.c
new file mode 100644
index 0000000..68102fe
--- /dev/null
+++ b/test/klib/md5appendtest.c
@@ -0,0 +1,274 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include <klib/rc.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <klib/namelist.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <assert.h>
+
+#if 0
+void add_to_file (KFile * file, KFile * md5, uint64_t * pos)
+{
+    rc_t	rc;
+    uint64_t	word;
+    size_t	written;
+
+    word = *pos;
+
+    rc = KFileWrite (file, word, &word, sizeof (word), &written);
+
+    assert (rc == 0);
+
+    pos = word + written;
+}
+#endif
+
+rc_t	runtest (KDirectory * kdir,const char *  filename)
+{
+    uint64_t		iteration = 0;
+    size_t		written;
+    KFile *		file;
+    KFile *		md5sumfile;
+    KMD5File *  md5file;
+    KMD5SumFmt *	md5sumfmt;
+    char *		md5filename;
+    rc_t		rc = 0;
+    char		c;
+    char		buff [16];
+
+    OUTMSG (("allocate memory for name %s.md5\n", filename));
+    md5filename = malloc (strlen(filename) + 5);
+    if (md5filename == NULL)
+    {
+        OUTMSG (("failure to allocate for md5 filename\n"));
+        return -1;
+    }
+    strcpy (md5filename, filename);
+    strcat (md5filename, ".md5");
+    OUTMSG (("create md5filename is %s\n",md5filename));
+
+
+    OUTMSG (("create %s\n", filename));
+    rc = KDirectoryCreateFile (kdir, &file, true, 0777, kcmInit, filename);
+    if (rc != 0)
+    {
+        OUTMSG (("failure to open %s\n", filename));
+        return rc;
+    }
+
+    rc = KDirectoryCreateFile (kdir, &md5sumfile, true, 0777, kcmInit, md5filename);
+    if (rc != 0)
+    {
+        OUTMSG (("failure to create %s\n", md5filename));
+        return rc;
+    }
+
+    OUTMSG (("make KMD5SumFmtUpdate\n"));
+    rc = KMD5SumFmtMakeUpdate (&md5sumfmt, md5sumfile);
+    if (rc != 0)
+    {
+        OUTMSG (("unable to make KMD5SumFmtUpdate %d\n", rc));
+        return rc;
+    }
+
+    OUTMSG (("make Md5 for write\n"));
+    rc = KMD5FileMakeAppend ( & md5file, file, md5sumfmt, filename );
+    if (rc != 0)
+    {
+        OUTMSG (("unable to create KFileMakeMd5Append %d\n", rc));
+        return rc;
+    }
+    file = KMD5FileToKFile ( md5file );
+    
+    c = ' ';
+    memset (buff, c, sizeof (buff));
+    OUTMSG (("write to file %lu\n", iteration));
+    rc = KFileWrite (file, iteration * sizeof (buff), &buff, sizeof (buff), &written);
+    if (rc != 0)
+    {
+        OUTMSG (("unable to write first iteration\n"));
+        return rc;
+    }
+
+    OUTMSG (("%c %lu\n", buff[0], written));
+
+    /* close all files */
+    rc = KFileRelease (file);
+    if (rc != 0)
+    {
+        OUTMSG (("unable to close md5file %d\n", rc));
+        return rc;
+    }
+    rc = KMD5SumFmtRelease (md5sumfmt);
+    if (rc != 0)
+    {
+        OUTMSG (("unable to close md5 formatter: %d\n", rc));
+        return rc;
+    }
+    
+#if 1
+    for (iteration = 1; iteration < 1024; ++iteration)
+    {
+        rc = KDirectoryOpenFileWrite (kdir, &file, true, filename);
+        if (rc)
+            PLOGERR (klogFatal, (klogFatal, rc, "Couldn't open %s", filename));
+
+        else
+        {
+            rc = KDirectoryOpenFileWrite (kdir, &md5sumfile, true, md5filename);
+            if (rc)
+                PLOGERR (klogFatal, (klogFatal, rc, "Couldn't open %s", md5filename));
+
+            else
+            {
+                rc = KMD5SumFmtMakeUpdate (&md5sumfmt, md5sumfile);
+                if (rc)
+                    LOGERR (klogFatal, rc, "Couldn't make md5sumfmt");
+
+                else
+                {
+                    rc = KMD5FileMakeAppend (&md5file, file, md5sumfmt, filename);
+                    if (rc)
+                        LOGERR (klogFatal, rc, "unable to make KFileMakeMd5Append");
+
+                    else
+                    {
+                        c = (c == '~') ? ' ' : c+1;
+
+                        memset (buff, c, sizeof (buff));
+                        OUTMSG (("%c\n",buff[0]));
+
+                        file = KMD5FileToKFile ( md5file );
+                        rc = KFileWrite (file, iteration * sizeof (buff), &buff, sizeof (buff), &written);
+                        if (rc)
+                            LOGERR (klogFatal, rc, "failed to write");
+                        assert (written == sizeof (buff));
+                        KFileRelease (KMD5FileToKFile (md5file));
+                    }
+                    KMD5SumFmtRelease (md5sumfmt);
+                }
+            }
+/*             rc = KFileRelease (file); */
+        }
+    }
+#endif
+    return rc;
+}
+
+uint32_t CC KAppVersion ( void )
+{
+    return  0;
+}
+
+const char UsageDefaultName[] = "md5appendtest";
+
+rc_t CC UsageSummary (const char * name)
+{
+    return KOutMsg (
+        "Usage:\n"
+        " %s <file>\n"
+        "\n"
+        "    run a test of the KMD5File in append mode\n"
+        "\n", name);
+}
+
+
+rc_t CC Usage ( const Args * args )
+{
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if (args == NULL)
+        rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+    else
+        rc = ArgsProgram (args, &fullpath, &progname);
+    UsageSummary (progname);
+
+    KOutMsg ("Options:\n");
+
+    HelpOptionsStandard();
+ 
+    return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args * args;
+    rc_t rc;
+
+    rc = ArgsMakeAndHandle (&args, argc, argv, 0);
+    if (rc == 0)
+    {
+        uint32_t pcount;
+        const char * filename;
+        KDirectory * kdir;
+
+        do
+        {
+            rc = ArgsParamCount (args, &pcount);
+            if (rc)
+                break;
+            if (pcount != 1)
+            {
+                MiniUsage (args);
+                break;
+            }
+
+            rc = ArgsParamValue (args, 0, (const void **)&filename);
+            if (rc)
+                break;
+
+            /* -----
+             * Mount the native filesystem as root
+             */
+            rc = KDirectoryNativeDir(&kdir);
+            if (rc)
+                break;
+
+            rc = runtest (kdir, filename);
+            KDirectoryRelease (kdir);
+        } while (0);
+    }
+    return rc;
+}
+
+
+
+
diff --git a/test/klib/printf-test.c b/test/klib/printf-test.c
new file mode 100644
index 0000000..03a0615
--- /dev/null
+++ b/test/klib/printf-test.c
@@ -0,0 +1,836 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/printf.h>
+#include <klib/symbol.h>
+#include <klib/text.h>
+#include <klib/time.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <kfg/config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <va_copy.h>
+#include <time.h>
+
+static
+rc_t test_vprintf ( const char *expected, const char *fmt, va_list args )
+{
+    rc_t rc;
+    size_t num_writ;
+    char buff [ 4096 ];
+
+    rc = string_vprintf ( buff, sizeof buff, & num_writ, fmt, args );
+    if ( rc != 0 )
+    {
+        /* report return code */
+        pLogErr ( klogErr, rc, "string_vprintf returned non-zero rc with format '$(fmt)'", "fmt=%s", fmt );
+    }
+    else
+    {
+        size_t buff_size;
+
+        /* verify results. they are:
+           1. string itself
+           2. number of characters in "num_writ"
+        */
+
+        if ( strcmp ( buff, expected ) != 0 )
+        {
+            /* set an appropriate return code */
+            rc = RC ( rcExe, rcString, rcFormatting, rcData, rcIncorrect );
+
+            /* report discrepancy */
+            pLogErr ( klogErr, rc,
+                      "string_vprintf result differs from expected:\n"
+                      "  format   - '$(format)'\n"
+                      "  expected - '$(expected)'\n"
+                      "  observed - '$(observed)'"
+                      , "format=%s,expected=%s,observed=%s"
+                      , fmt
+                      , expected
+                      , buff
+                );
+        }
+
+        buff_size = strlen ( buff );
+        if ( buff_size != num_writ )
+        {
+            /* report discrepancy */
+            pLogMsg ( klogErr,
+                      "string_vprintf size differs from expected:\n"
+                      "  expected - $(expected)\n"
+                      "  observed - $(observed)"
+                      , "expected=%zu,observed=%zu"
+                      , buff_size
+                      , num_writ
+                );
+        }
+#if 1
+        rc = 0;
+#endif
+    }
+
+    return rc;
+}
+
+static
+rc_t test_printf ( const char *expected, const char *fmt, ... )
+{
+    rc_t rc;
+    va_list args;
+    va_start ( args, fmt );
+    rc = test_vprintf ( expected, fmt, args );
+    va_end ( args );
+    return rc;
+}
+
+
+/* NEW TESTING STRATEGY
+
+    6a. size modifier
+        a. NULL ( not given )
+        b. 't' for 8-bit integer
+        c. 'h' for 16 bit integer or 32-bit float
+        d. 'l' for 64-bit integer or long double
+        E. 'z' for size of size_t ( 32 or 64 bit depending upon architecture )
+    6b. time modifier ( do this later )
+
+    So, you'll want functions for each stage. The driving function will invoke
+    the stages with parameters and values.
+*/
+
+static
+rc_t final ( const char *flags, int32_t *field_width, int32_t *precision,
+             char size_modifier, char storage_class, va_list args )
+{
+    rc_t rc;
+    uint32_t i, j, len;
+    va_list arg_copy;
+    char stdcfmt [ 32 ], fmt [ 32 ], expected [ 4096 ];
+
+    /* initialize counters */
+    i = 0;
+
+    /* build format string */
+    fmt [ i ++ ] = '%';
+
+    if ( flags != NULL )
+        i += sprintf ( & fmt [ i ], "%s", flags );
+    if ( field_width != NULL )
+    {
+        if ( field_width [ 0 ] == -1 )
+            fmt [ i ++ ] = '*';
+        else
+            i += sprintf ( & fmt [ i ], "%u", field_width [ 0 ] );
+    }
+    if ( precision != NULL )
+    {
+        fmt [ i ++ ] = '.';
+
+        if ( precision [ 0 ] == -1 )
+            fmt [ i ++ ] = '*';
+        else
+            i += sprintf ( & fmt [ i ], "%u", precision [ 0 ]  );
+    }
+    fmt[i]=0;
+
+    /* duplicate format string */
+    strcpy ( stdcfmt, fmt );
+    j = i;
+
+    /* size modifiers */
+    if ( size_modifier != 0 )
+    {
+        fmt [ i ++ ] = size_modifier;
+
+        switch ( size_modifier )
+        {
+        case 't':
+#if WINDOWS
+            return 0; /* hh does not work as we expect on Windows */
+#endif
+            stdcfmt [ j ++ ] = 'h';
+            stdcfmt [ j ++ ] = 'h';
+            break;
+        case 'z':
+            if ( sizeof ( size_t ) != sizeof ( uint32_t ) )
+                stdcfmt [ j ++ ] = 'l';
+            break;
+        case 'l':
+            if ( sizeof ( long int ) == sizeof ( int32_t ) )
+                stdcfmt [ j ++ ] = size_modifier;
+            /* no break */
+        default:
+            stdcfmt [ j ++ ] = size_modifier;
+        }
+    }
+
+    /* storage class/formatting */
+    fmt [ i ++ ] = storage_class;
+    stdcfmt [ j ++ ] = storage_class;
+
+    /* terminate format strings with NUL */
+    fmt [ i ] = 0;
+    stdcfmt [ j ] = 0;
+
+    /* generate expected string */
+    va_copy ( arg_copy, args );
+    len = vsnprintf ( expected, sizeof expected, stdcfmt, arg_copy );
+    va_end ( arg_copy );
+
+    /* execute test */
+    va_copy ( arg_copy, args );
+    rc = test_vprintf ( expected, fmt, arg_copy );
+    va_end ( arg_copy );
+
+    return rc;
+}
+
+static rc_t thousands_flag ( char *flags, uint32_t num_flags, int32_t *field_width, int32_t *precision,
+                             char size_modifier, char storage_class, va_list args)
+{
+#if 1
+    /* built-in sprintf can't handle this */
+    return final ( flags, field_width, precision, size_modifier, storage_class, args );
+#else
+    rc_t rc;
+
+    /* with nothing */
+    rc = final ( flags, field_width, precision, size_modifier, storage_class, args );
+    if ( rc != 0 )
+        return rc;
+
+    /* with thousands */
+    flags [ num_flags ] = ',';
+    flags [ num_flags + 1 ] = 0;
+    rc = final ( flags, field_width, precision, size_modifier, storage_class, args );
+
+    return rc;
+#endif
+
+}
+static rc_t alternate_flag ( char *flags, uint32_t num_flags, int32_t *field_width, int32_t *precision,
+                             char size_modifier, char storage_class, va_list args)
+{
+    rc_t rc;
+
+
+    /* with nothing */
+    rc = thousands_flag ( flags, num_flags, field_width, precision, size_modifier, storage_class, args );
+    if ( rc != 0 )
+        return rc;
+
+    /* with alternate */
+    flags [ num_flags ] = '#';
+    flags [ num_flags + 1 ] = 0;
+    rc = thousands_flag ( flags, num_flags + 1, field_width, precision, size_modifier, storage_class, args );
+
+    return rc;
+}
+
+static rc_t alignment_flag ( char *flags, uint32_t num_flags, int32_t *field_width, int32_t *precision,
+                             char size_modifier, char storage_class, va_list args)
+{
+    rc_t rc;
+
+    /* with nothing */
+    rc = alternate_flag ( flags, num_flags, field_width, precision, size_modifier, storage_class, args );
+    if ( rc != 0 )
+        return rc;
+
+    /* with left-align */
+    flags [ num_flags ] = '-';
+    flags [ num_flags + 1 ] = 0;
+    rc = alternate_flag ( flags, num_flags + 1, field_width, precision, size_modifier, storage_class, args );
+    if ( rc != 0 )
+        return rc;
+
+    /* with zer-padding left-fill */
+    flags [ num_flags ] = '0';
+    flags [ num_flags + 1 ] = 0;
+    rc = alternate_flag ( flags, num_flags + 1, field_width, precision, size_modifier, storage_class, args );
+    if ( rc != 0 )
+        return rc;
+
+    /* with both left-align and zero-padded left fill */
+    flags [ num_flags ] = '0';
+    flags [ num_flags + 1 ] = '-';
+    flags [ num_flags + 2 ] = 0;
+    rc = alternate_flag ( flags, num_flags + 2, field_width, precision, size_modifier, storage_class, args );
+
+    return rc;
+}
+
+static rc_t sign_flag ( int32_t *field_width, int32_t *precision,
+                        char size_modifier, char storage_class, va_list args)
+{
+    rc_t rc;
+    char flags [ 16 ];
+
+    /* with nothing */
+    flags [ 0 ] = 0;
+    rc = alignment_flag ( flags, 0, field_width, precision, size_modifier, storage_class, args );
+    if ( rc != 0 )
+        return rc;
+
+    /* with space */
+    flags [ 0 ] = ' ';
+    flags [ 1 ] = 0;
+    rc = alignment_flag ( flags, 1, field_width, precision, size_modifier, storage_class, args );
+    if ( rc != 0 )
+        return rc;
+
+    /* with forces + */
+    flags [ 0 ] = '+';
+    flags [ 1 ] = 0; 
+    rc = alignment_flag ( flags, 1, field_width, precision, size_modifier, storage_class, args );
+    if ( rc != 0 )
+        return rc;
+
+    /* with both */
+    flags [ 0 ] = ' ';
+    flags [ 1 ] = '+';
+    flags [ 2 ] = 0;
+    rc = alignment_flag ( flags, 2, field_width, precision, size_modifier, storage_class, args );
+
+    return rc;
+}
+
+/* apply field width */
+static rc_t do_field_width ( int32_t *field_width, int32_t *precision,
+                             char size_modifier, char storage_class, va_list args)
+{
+    rc_t rc;
+    uint32_t i; 
+
+    rc = sign_flag ( NULL, precision, size_modifier, storage_class, args );
+
+    for ( i = 0 ; field_width [ i ] != -2 && rc == 0 ; ++ i )
+        rc = sign_flag ( & field_width [ i ], precision, size_modifier, storage_class, args );
+
+    return rc;
+}
+
+/* apply precision */
+static rc_t do_precision ( int32_t *field_width, int32_t *precision,
+                           char size_modifier, char storage_class, va_list args)
+{
+    rc_t rc;
+    uint32_t i;
+
+    rc = do_field_width ( field_width, NULL, size_modifier, storage_class, args );
+
+    for ( i = 0 ; precision [ i ] != -2 && rc == 0; ++i )
+       rc = do_field_width ( field_width, & precision [ i ], size_modifier, storage_class, args );
+
+    return rc;
+}
+
+
+static rc_t do_size_modifier ( int32_t *field_width, int32_t *precision,
+    const char *size_modifier, char storage_class, va_list args )
+{
+    rc_t rc = 0;
+    uint32_t i;
+
+    for ( i = 0 ; size_modifier [ i ] != 0 && rc == 0; ++ i )
+    {
+        char modifier = size_modifier [ i ];
+        if ( modifier == ' ' )
+            modifier = 0;
+        rc = do_precision ( field_width, precision, modifier, storage_class, args );
+    }
+
+    return rc;
+}
+
+
+static rc_t do_storage_class ( int32_t *field_width, int32_t *precision,
+                               const char *size_modifier, const char *storage_class, va_list args )
+{
+    rc_t rc = 0;
+    uint32_t i;
+
+    for ( i = 0 ; storage_class [ i ] != 0 && rc == 0; ++ i )
+        rc = do_size_modifier ( field_width, precision, size_modifier, storage_class [ i ], args );
+
+    return rc;
+}
+
+
+static rc_t make_initial_test (  int32_t *field_width, int32_t *precision,
+                                 const char *size_modifier, const char *storage_class, ... )
+{
+    rc_t rc;
+
+    va_list args;
+    va_start ( args, storage_class );
+
+    rc = do_storage_class ( field_width, precision, size_modifier, storage_class, args );
+ 
+    va_end ( args );
+    return rc;
+}
+
+static
+rc_t run ( const char *progname )
+{
+    rc_t rc = 0;
+    int32_t i;
+
+    int32_t field_width [ ] = { 2, 5, 9, 10, -2 };
+    int32_t precision [ ] = { 1, 3, 8, 12, -2 };
+    char c [ ] = { "aA!@0{;>" };
+
+    int32_t ext_value [ ] = { -1, -2 };
+    int32_t randValue, randValue_2, randValue_3;
+    double randValue_f;
+
+
+    for ( i = 0 ; i < 8 ; ++ i )
+    {
+        /* create random number */
+        srand ( time ( NULL ) );
+        
+        
+        /* signed integer */
+        if ( rc == 0 )
+        {
+            randValue = rand ();
+            randValue_2 = rand () % 10;
+            randValue_3 = rand () % 5;
+            
+            rc = make_initial_test ( field_width, precision, " ht", "di", randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( ext_value, precision, " ht", "di", randValue_2, randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( field_width, ext_value, " ht", "di", randValue_3, randValue );
+            
+            if ( rc == 0 )
+                rc = make_initial_test ( field_width, precision, "l", "di", ( int64_t ) randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( ext_value, precision, "l", "di", randValue_2, ( int64_t ) randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( field_width, ext_value, "l", "di", randValue_3, ( int64_t ) randValue );
+        }
+        
+        /* unsigned integer */
+        if ( rc == 0 )
+        {
+            rc = make_initial_test ( field_width, precision, " ht", "uxXo", randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( ext_value, precision, " ht", "uxXo", randValue_2, randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( field_width, ext_value, " ht", "uxXo", randValue_3, randValue );
+            
+            if ( rc == 0 )
+                rc = make_initial_test ( field_width, precision, "l", "uxXo", ( uint64_t ) randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( ext_value, precision, "l", "uxXo", randValue_2, ( uint64_t )randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( field_width, ext_value, "l", "uxXo", randValue_3, ( uint64_t ) randValue );
+            
+            if ( rc == 0 )
+                rc = make_initial_test ( field_width, precision, "z", "uxXo", ( size_t ) randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( ext_value, precision, "z", "uxXo", randValue_2, ( size_t ) randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( field_width, ext_value, "z", "uxXo", randValue_3, ( size_t ) randValue );
+        }
+        
+        /* float */
+        if ( rc == 0 )
+        {
+            
+            randValue_f = ( double ) randValue / ( ( randValue % 100 ) + 1 );
+            
+            /*** could use some floating point random numbers here */
+#if 0            
+            rc = make_initial_test ( field_width, precision, " ", "feg", randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( ext_value, precision, " ", "feg", randValue_2, randValue );
+            if ( rc == 0 )
+                rc = make_initial_test ( field_width, ext_value, " ", "feg", randValue_3, randValue );
+#endif            
+
+            if ( rc == 0 )
+                rc = make_initial_test ( field_width, precision, " ", "feg", randValue_f );
+            if ( rc == 0 )
+                rc = make_initial_test ( ext_value, precision, " ", "feg", randValue_2, randValue_f );
+            if ( rc == 0 )
+                rc = make_initial_test ( field_width, ext_value, " ", "feg", randValue_3, randValue_f );
+        }
+        
+        /* character */
+        if ( rc == 0 )
+        {
+            rc = make_initial_test ( field_width, precision, " ", "c", c [ i ] );
+            if ( rc == 0 )
+                rc = test_printf ( "I like 1 embedded % character", "I like %u embedded %% character", 1 );
+        }
+        
+        /* text string */
+        if ( rc == 0 )
+        {
+            rc = make_initial_test ( field_width, precision, " ", "s", "Kurt is having a fit" );
+#if !defined(__SunOS)  &&  !defined(__sun__)
+            /* Solaris printf doesn't cope with NULLs */
+            rc = make_initial_test ( field_width, precision, " ", "s", NULL );
+#endif            
+            rc = make_initial_test ( field_width, precision, " ", "s", "" );
+            rc = make_initial_test ( field_width, precision, " ", "s", "OK" );
+            rc = make_initial_test ( field_width, precision, " ", "s", "1234567890" );
+            rc = make_initial_test ( field_width, precision, " ", "s", "\"`~!@#$%^&*()-_=+[]{}|\\';:?/.,<>" );
+        }
+        
+    } 
+  
+    /* hand written tests */
+
+    {
+    
+        int8_t t [ ] = { -128, -67, 0, 4, 56, 100, 127 };
+        int16_t h  [ ] = { -32768, -2546, -398, -89, 0, 34, 123, 5736, 32767 };
+        int32_t v [ ] = { -2147483648, -45287957, -100001, 45, 0, 106, 7234, 546963874, 2147483647 };
+
+        /*** naked integer literals have type "int" in C, meaning they
+             can't be more than 32 bits. By adding "L" to the end of the
+             literal numeral, the compiler will read them as "long int",
+             which is in fact 64 bits on this machine. on a 32-bit machine,
+             you need type "long long int".
+
+             you can make use of a pre-processor symbol to do this properly - I'll do it below. 
+             */
+        int64_t l [ ] = { INT64_C(-9223372036854775807) - INT64_C(1), INT64_C(-67283678467328376), INT64_C(-2837640198), INT64_C(0),  INT64_C(187267509872), INT64_C(9223372036854775807) }; 
+
+        /* d, i */
+
+        /* 8 bit */
+        test_printf ( "-000128", "%07:0td", t );
+        test_printf ( "  -67"  , "%5:1td", t );
+        test_printf ( "0"      , "%:2td", t );
+        test_printf ( "4    "  , "%-5:3td", t );
+        test_printf ( " 56"    , "% .1:4td", t );
+        test_printf ( "100 "   , "%-4.2:5td", t );
+        test_printf ( "127  "  , "%-05:6td", t );
+        /* 16 bit */
+        test_printf ( "-32768"    , "%.2:0hd", h );
+        test_printf ( "-2546  "   , "%-07:1hd", h );
+        test_printf ( "-398"      , "% :2hd", h );
+        test_printf ( "-0089"     , "%05:3hd", h );
+        test_printf ( "0000"      , "%04:4hd", h );
+        test_printf ( "+34"       , "%+:5hd", h );
+        test_printf ( "+0123"     , "% +05:6hd", h );
+        test_printf ( "5736 "     , "%-05:7hd", h );
+        test_printf ( "     32767", "%10:8hd", h );
+        /* 32 bit */
+        test_printf ( "-2,147,483,648", "%,:0d", v );
+        test_printf ( "-0045287957"   , "%011:1d", v );
+        test_printf ( "-100001 "      , "%-8:2d", v );
+        test_printf ( "45"            , "%0:3d", v );
+        test_printf ( "0"             , "%,:4d", v );
+        test_printf ( "106"           , "%:5d", v );
+        test_printf ( "0,007,234"     , "%,09:6d", v );
+        test_printf ( "546963874"     , "%.3:7d", v );
+        test_printf ( "2147483647"    , "%10:8d", v );
+        /* 64 bit */
+        test_printf ( "-9223372036854775808"    , "%:0ld", l );
+        test_printf ( "-67,283,678,467,328,376" , "%,:1ld", l );
+        test_printf ( "-2837640198         "    , "%-20:2ld", l );
+        test_printf ( "+0"                      , "%+:3ld", l );
+        test_printf ( "00000000187267509872"    , "%020:4ld", l );
+        test_printf ( "9223372036854775807"     , "%.2:5ld", l );
+
+    } 
+
+
+    {
+        /* uxXo */
+
+       uint8_t u_t [ ] = { 0, 128, 255};
+       uint16_t u_h [ ] = { 0, 128, 5378, 65535};
+       uint32_t u_v [ ] = { 0, 847, 7859, 376859, 86742874, 4294967295 };
+       uint64_t u_l [ ] = { 0, 178, 178364, 1783940987, 17836479208762, UINT64_C(18446744073709551615) };
+
+
+       /* 8 bit */
+       test_printf ( "    0", "%5:0tu", u_t );
+       test_printf ( "80"   , "%:1tx", u_t );
+       test_printf ( "0x80" , "%#:1tx", u_t );
+       test_printf ( "377"  , "%:2to", u_t );
+       test_printf ( "0377" , "%#:2to", u_t );
+       /* 16 bit */
+       test_printf ( "0"        , "%#:0hX", u_h );
+       test_printf ( "00128"    , "%05:1hu", u_h );
+       test_printf ( "0x1502"   , "%-#3:2hx", u_h );
+       test_printf ( "000177777", "%#09:3ho", u_h );
+       /* 32 bit */
+       test_printf ( "00000"          , "%05:0u", u_v );
+       test_printf ( "34f"            , "%:1x", u_v );
+       test_printf ( "0X1EB3"         , "%#6:2X", u_v );
+       test_printf ( "1340033"        , "%:3o", u_v );
+       test_printf ( "86742874       ", "%-#15:4u", u_v );
+       test_printf ( "ffffffff"       , "%0:5x", u_v );
+       /* 64 bit */
+       test_printf ( "0    "               , "%-5:0lX", u_l );
+       test_printf ( "0262 "               , "%#-5:1lo", u_l );
+       test_printf ( "178364"              , "%.4:2lu", u_l );
+       test_printf ( "0x006a54c77b"        , "%#012:3lx", u_l );
+       test_printf ( "1038E101DD3A"        , "%.5:4lX", u_l );
+       test_printf ( "18446744073709551615", "%:5lu", u_l );
+
+    }
+
+
+    {
+        /* float */ 
+
+        float f [ ] = { -2.1474836, -45.287957, -10000.1, 0.45, 0, 1.06 };
+        double lf [ ] = { -9223372036854775808.0, -28.37640198 };
+        
+        /* 32 bit */
+        test_printf ( "  -2.15"             , "%7.2:0hf", f );
+        test_printf ( "-00045.288"          , "%010.3:1hf" , f );
+        test_printf ( "-10000.099609"       , "%:2hf", f );
+        test_printf ( "0"                   , "%.0:3hf", f );
+        test_printf ( "0.000"               , "%-5.3:4hf", f );
+        test_printf ( "1.060000    "        , "%-012:5hf", f );
+        /* 64 bit */
+        test_printf ( "-9223372036854775808.000000" , "%:0f", lf );
+        test_printf ( "-28.37640198000000069101", "%2.20:1f", lf );
+    }
+
+
+
+    /* s */
+    test_printf ( "There are too many tests" , "%:s"    , "There are too many tests" );
+    test_printf ( "a"                        , "%:6s"   , "There are too many tests" );
+
+    test_printf ( "There"                    , "%:/5s"  , "There are too many tests" );
+    test_printf ( "too m"                    , "%:*/5s" , 10, "There are too many tests" );
+    test_printf ( "There"                    , "%:/*s"  , 5,"There are too many tests" );
+    test_printf ( " too many tests"          , "%:9/16s", "There are too many tests" );
+    test_printf ( "s"                        , "%:$/5s" , "There are too many tests" );
+    test_printf ( "tests"                    , "%:19/$s", "There are too many tests" );
+
+    test_printf ( "There"                    , "%:0-4s", "There are too many tests" );
+    test_printf ( "There are too many tests" , "%:-s"  , "There are too many tests" );
+    test_printf ( "too many tests"           , "%:10-s", "There are too many tests" );
+    test_printf ( "There are"                , "%:-8s" , "There are too many tests" );
+
+    test_printf ( "e are too many tests"     , "%:*-s" , 4 , "There are too many tests" );
+    test_printf ( "e are too "               , "%:4-*s", 13, "There are too many tests" );
+    test_printf ( "There are t"              , "%:-*s" , 10, "There are too many tests" );
+    test_printf ( "ere a"                    , "%:*-6s", 2 , "There are too many tests" );
+
+    test_printf ( "s"                        , "%:$s"  , "There are too many tests" );
+    test_printf ( "s"                        , "%:$-s" , "There are too many tests" );
+    test_printf ( "s"                        , "%:$-2s", "There are too many tests" );
+    test_printf ( "There are too many tests" , "%:-$s" , "There are too many tests" );
+    test_printf ( "re are too many tests"    , "%:3-$s", "There are too many tests" );
+
+    /* with field width, precision, and flags */
+    test_printf ( "There are too many tests" , "%5:s"       , "There are too many tests" );
+    test_printf ( "                   a"     , "%20:6s"     , "There are too many tests" );
+    test_printf ( "There     "               , "%-10:/5s"   , "There are too many tests" );
+    test_printf ( "     too m"               , "%*:*/5s"    , 10, 10, "There are too many tests" );
+    test_printf ( "The"                      , "%.3:/*s"    , 5,"There are too many tests" );
+    test_printf ( " too"                     , "%*.4:9/16s" , 2,  "There are too many tests" );
+
+    test_printf ( "There"                          , "%-:0-4s", "There are too many tests" );
+    test_printf ( "There are too many tests      " , "%-30:-s", "There are too many tests" );
+    test_printf ( "too       "                     , "%-10.4:10-s" , "There are too many tests" );
+    test_printf ( "There"                          , "%.*:-8s"  , 5, "There are too many tests" );
+    test_printf ( ""                               , "%s", "" );
+
+    {
+        String S;
+        CONST_STRING ( & S, "My Bonnie lies over the ocean" );
+        test_printf ( "My Bo", "%:0-4S", & S );
+    }
+
+    {
+        String str1, str2, str3;
+        KSymbol *sym1, *sym2, *sym3;
+
+        CONST_STRING ( & str1, "outer" );
+        CONST_STRING ( & str2, "inner" );
+        CONST_STRING ( & str3, "leaf" );
+
+        KSymbolMake ( & sym1, & str1, 0, NULL );
+        KSymbolMake ( & sym2, & str2, 0, NULL );
+        KSymbolMake ( & sym3, & str3, 0, NULL );
+
+        sym2 -> dad = sym1;
+        sym3 -> dad = sym2;
+
+        test_printf ( "outer:inner:leaf", "%N", sym3 );
+        test_printf ( "    outer:inner:leaf", "%20N", sym3 );
+        test_printf ( "outer:inner:leaf    ", "%-20N", sym3 );
+        test_printf ( "outer:inner:leaf    ", "%-20.2N", sym3 );
+
+        KSymbolWhack ( & sym3 -> n, NULL );
+        KSymbolWhack ( & sym2 -> n, NULL );
+        KSymbolWhack ( & sym1 -> n, NULL );
+    }
+
+    test_printf ( "version 1", "version %V", 0x1000000 );
+    test_printf ( "version ", "version %.V", 0x1000000 );
+    test_printf ( "version     1", "version %5V", 0x1000000 );
+    test_printf ( "version 1.2", "version %V", 0x1020000 );
+    test_printf ( "version   1.2", "version %5V", 0x1020000 );
+    test_printf ( "version 1.2.3", "version %V", 0x1020003 );
+    test_printf ( "version 1.2.3", "version %5V", 0x1020003 );
+    test_printf ( "version 1.2.3 ", "version %-6V", 0x1020003 );
+    test_printf ( "version 1.0", "version %.2V", 0x1000000 );
+    test_printf ( "version 1.0.0", "version %.3V", 0x1000000 );
+    test_printf ( "version 1.0.0", "version %.4V", 0x1000000 );
+    test_printf ( "version 1.0", "version %#.2V", 0x1000000 );
+
+    /* RC can't be tested due to embedded filename and lineno */
+#if 0
+    rc = RC ( rcExe, rcString, rcFormatting, rcData, rcNoErr );
+    test_printf ( "?", "%#R", rc );
+#endif
+
+    {
+        KTime t;
+        t . year = 2011;
+        t . month = 9;
+        t . day = 28;
+        t . weekday = 5;
+        t . tzoff = -5 * 60;
+        t . hour = 15;
+        t . minute = 2;
+        t . second = 16;
+        t . dst = true;
+
+        test_printf ( "3:02:16 PM", "%T", & t );
+        test_printf ( "03:02:16 PM", "%0T", & t );
+        test_printf ( "Fri Oct 29 2011 3:02:16 PM", "%lT", & t );
+        test_printf ( "Fri Oct 29 2011 3:02:16 PM -5", "%zT", & t );
+        test_printf ( "Oct 29 2011", "%hT", & t );
+    }
+    { /* insufficient buffer; here we have to bypass test_printf since we need a custom buffer size */
+        char buff[10];
+        size_t num_writ;
+        rc = string_printf ( buff, 1, &num_writ, "%s", "0123456789" );
+	    if ( rc == 0 )
+	    {
+    	    pLogErr ( klogErr, rc, "string_vprintf returned zero rc with insufficient buffer", "");
+            rc = -1;
+	    }
+        else
+        {
+            rc = 0;
+        }        
+    }
+
+#if LINUX
+    test_printf ( "Success", "%!", 0 );
+    test_printf ( "Operation not permitted", "%!", 1 );
+#endif
+
+    return rc;
+    
+}
+
+
+/* Version  EXTERN
+ *  return 4-part version code: 0xMMmmrrrr, where
+ *      MM = major release
+ *      mm = minor release 
+ *    rrrr = bug-fix release
+ */
+ver_t CC KAppVersion ( void )
+{
+    return 0;
+}
+
+
+/* Usage
+ *  This function is called when the command line argument
+ *  handling sees -? -h or --help
+ */
+rc_t CC UsageSummary ( const char *progname )
+{
+    return KOutMsg (
+        "\n"
+        "Usage:\n"
+        "  %s [Options]\n"
+        "\n"
+        "Summary:\n"
+        "  Simple test of printf.\n"
+        , progname );
+}
+
+const char UsageDefaultName[] = "time-test";
+
+rc_t CC Usage ( const Args *args )
+{
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if (args == NULL)
+        rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+    else
+        rc = ArgsProgram (args, &fullpath, &progname);
+
+    UsageSummary (progname);
+
+    KOutMsg ("Options:\n");
+
+    HelpOptionsStandard();
+
+    HelpVersion (fullpath, KAppVersion());
+
+    return rc;
+}
+
+    
+/* KMain
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args *args;
+    rc_t rc = ArgsMakeAndHandle ( & args, argc, argv, 0 );
+    if ( rc == 0 )
+    {
+        KConfigDisableUserSettings();
+        rc = run ( argv [ 0 ] );
+        ArgsWhack ( args );
+    }
+
+    return rc;
+}
diff --git a/test/klib/test-SraReleaseVersion.cpp b/test/klib/test-SraReleaseVersion.cpp
new file mode 100644
index 0000000..50615dc
--- /dev/null
+++ b/test/klib/test-SraReleaseVersion.cpp
@@ -0,0 +1,316 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for SraReleaseVersion
+*/
+
+#include <ktst/unit_test.hpp>
+#include <ktst/unit_test_suite.hpp> // REQUIRE_RC
+#include <kapp/args.h>
+#include <klib/sra-release-version.h> /* SraReleaseVersion */
+#include <klib/text.h> /* string_size */
+#include <string.h> /* memset */
+using std::string;
+TEST_SUITE(SraReleaseVersionTestSuite);
+
+class Test : private ncbi::NK::TestCase {
+public:
+    Test(TestCase &dad, const string &s, const char *expected = NULL)
+        : TestCase(s)
+    {
+        if (expected == NULL) {
+            expected = s.c_str();
+        }
+        SraReleaseVersion v;
+        REQUIRE_RC(SraReleaseVersionInit(&v, s.c_str(), s.size()));
+        char buffer[256] = "";
+        size_t num_writ = 0;
+        REQUIRE_RC(
+            SraReleaseVersionPrint(&v, buffer, sizeof buffer, &num_writ));
+        CHECK_EQ(num_writ, string_size(expected));
+        CHECK_EQ(memcmp(expected, buffer, num_writ), 0);
+
+        SraReleaseVersion v2;
+        REQUIRE_RC(SraReleaseVersionInit(&v2, buffer, string_size(buffer)));
+
+        int32_t result = 0;
+        REQUIRE_RC(SraReleaseVersionCmp(&v, &v2, &result));
+        CHECK_EQ(result, 0);
+
+        dad.ErrorCounterAdd(GetErrorCounter());
+    }
+};
+
+TEST_CASE(SraReleaseVersionTest) {
+    int32_t result = 0;
+    SraReleaseVersion v;
+    SraReleaseVersion etalon;
+    memset(&etalon, 0, sizeof etalon);
+    etalon.type = SraReleaseVersion::eSraReleaseVersionTypeFinal;
+
+    REQUIRE_RC(SraReleaseVersionInit(&v, NULL, 0));
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    REQUIRE_RC(SraReleaseVersionInit(&v, "", 0));
+    Test      (*this,                    "", "0.0.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    REQUIRE_RC(SraReleaseVersionInit(&v, "0", 1));
+    Test      (*this,                    "0", "0.0.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x1000000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "1", 1));
+    Test      (*this,                    "1", "1.0.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0xC000000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "12", 2));
+    Test      (*this,                    "12", "12.0.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x1000000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "1.", 2));
+    Test      (*this,                    "1.", "1.0.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "0.", 2));
+    Test      (*this,                    "0.", "0.0.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0xD000000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "13.", 3));
+    Test      (*this,                    "13", "13.0.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x2010000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "2.1", 3));
+    Test      (*this,                    "2.1", "2.1.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x2000000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "2.0", 3));
+    Test      (*this,                    "2.0", "2.0.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0xE010000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "14.1", 4));
+    Test      (*this,                    "14.1", "14.1.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0xE000000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "14.0", 4));
+    Test      (*this,                    "14.0", "14.0.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0xF0A0000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "15.10", 5));
+    Test      (*this,                    "15.10", "15.10.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x2000000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "2.0.", 4));
+    Test      (*this,                    "2.0", "2.0.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x2010000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "2.1.", 4));
+    Test      (*this,                    "2.1.", "2.1.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0xE010000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "14.1.", 5));
+    Test      (*this,                    "14.1.", "14.1.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0xF0A0000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "15.10.", 6));
+    Test      (*this,                    "15.10", "15.10.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x3020001;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "3.2.1", 5));
+    Test      (*this,                    "3.2.1", "3.2.1");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x3020000;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "3.2.0", 5));
+    Test      (*this,                    "3.2.0", "3.2.0");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0xD030002;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "13.3.2", 6));
+    Test      (*this,                    "13.3.2", "13.3.2");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0xC100001;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "12.16.1", 7));
+    Test      (*this,                    "12.16.1", "12.16.1");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x10110012;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "16.17.18", 8));
+    Test      (*this,                    "16.17.18", "16.17.18");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x3020001;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "3.2.1-", 6));
+    Test      (*this,                    "3.2.1-", "3.2.1");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x10110012;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "16.17.18-", 9));
+    Test      (*this,                    "16.17.18-", "16.17.18");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x4030002;
+    etalon.revision = 5;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-5", 7));
+    Test      (*this,                    "4.3.2-5");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x4030002;
+    etalon.revision = 0;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-0", 7));
+    Test      (*this,                    "4.3.2-0", "4.3.2");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x13110012;
+    etalon.revision = 20;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "19.17.18-20", 11));
+    Test      (*this,                    "19.17.18-20");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x4030002;
+    etalon.revision = 0;
+    etalon.type = SraReleaseVersion::eSraReleaseVersionTypeAlpha;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-a", 7));
+    Test      (*this,                    "4.3.2-a");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x13110012;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "19.17.18-a", 10));
+    Test      (*this,                    "19.17.18-a");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x4030002;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-a0", 8));
+    Test      (*this,                    "4.3.2-a0", "4.3.2-a");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x13110012;
+    etalon.revision = 21;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "19.17.18-a21", 12));
+    Test      (*this,                    "19.17.18-a21");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x4030002;
+    etalon.revision = 1;
+    etalon.type = SraReleaseVersion::eSraReleaseVersionTypeBeta;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-b1", 8));
+    Test      (*this,                    "4.3.2-b1");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x4030002;
+    etalon.revision = 0;
+    etalon.type = SraReleaseVersion::eSraReleaseVersionTypeRC;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-rc", 8));
+    Test      (*this,                    "4.3.2-rc");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x13110012;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "19.17.18-rc", 11));
+    Test      (*this,                    "19.17.18-rc");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x4030002;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-rc0", 9));
+    Test      (*this,                    "4.3.2-rc0", "4.3.2-rc");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x4030002;
+    etalon.revision = 1;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-rc1", 9));
+    Test      (*this,                    "4.3.2-rc1");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+
+    etalon.version = 0x13110012;
+    etalon.revision = 21;
+    REQUIRE_RC(SraReleaseVersionInit(&v, "19.17.18-rc21", 13));
+    Test      (*this,                    "19.17.18-rc21");
+    REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
+    CHECK_EQ(result, 0);
+}
+
+//////////////////////////////////////////////////// Main
+extern "C" {
+    ver_t CC KAppVersion(void) { return 0; }
+    rc_t CC Usage(const Args *args) { return 0; }
+    const char UsageDefaultName[] = "test-SraReleaseVersion";
+    rc_t CC UsageSummary(const char *progname) { return 0; }
+
+    rc_t CC KMain(int argc, char *argv[]) {
+        return SraReleaseVersionTestSuite(argc, argv);
+    }
+}
diff --git a/test/klib/test-klib.cpp b/test/klib/test-klib.cpp
new file mode 100644
index 0000000..2f6e5a8
--- /dev/null
+++ b/test/klib/test-klib.cpp
@@ -0,0 +1,1027 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for klib interface
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/sort.h>
+#include <klib/printf.h>
+#include <klib/data-buffer.h>
+#include <klib/log.h>
+#include <klib/num-gen.h>
+#include <klib/text.h>
+#include <klib/misc.h> /* is_user_admin() */
+
+#include <cstdlib>
+#include <cstring>
+#include <stdexcept>
+#include <stdint.h>
+
+using namespace std;
+
+TEST_SUITE(KlibTestSuite);
+
+///////////////////////////////////////////////// text
+
+TEST_CASE ( Klib_text_string_len )
+{
+    // this is ASCII with a character count of 37, byte count of 37
+    const char * str = "Tu estas probando este hoy, no manana";
+    size_t size = strlen ( str );
+    uint32_t length = string_len ( str, size );
+    REQUIRE_EQ ( length, ( uint32_t ) size );
+
+    // this is UTF-8 with a character count of 37, byte count of 41
+    str = "T\303\272 est\303\241s probando \303\251ste hoy, no ma\303\261ana";
+    size = strlen ( str );
+    length = string_len ( str, size );
+    REQUIRE_EQ ( length, ( uint32_t ) ( size - 4 ) );
+}
+
+TEST_CASE ( Klib_text_string_measure )
+{
+    // this is ASCII with a character count of 37, byte count of 37
+    const char * str = "Tu estas probando este hoy, no manana";
+    size_t size = strlen ( str );
+    size_t measure;
+    uint32_t length = string_measure ( str, & measure );
+    REQUIRE_EQ ( measure, size );
+    REQUIRE_EQ ( length, ( uint32_t ) size );
+
+    // this is UTF-8 with a character count of 37, byte count of 41
+    str = "T\303\272 est\303\241s probando \303\251ste hoy, no ma\303\261ana";
+    size = strlen ( str );
+    length = string_measure ( str, & measure );
+    REQUIRE_EQ ( measure, size );
+    REQUIRE_EQ ( length, ( uint32_t ) ( size - 4 ) );
+}
+
+TEST_CASE ( Klib_text_string_copy )
+{
+    char buff64 [ 64 ];
+    const char * str = "Tu estas probando este hoy, no manana";
+    size_t size = strlen ( str );
+    size_t copied = string_copy ( buff64, sizeof buff64, str, size );
+    REQUIRE_EQ ( copied, size );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+
+    char buff32 [ 32 ];
+    copied = string_copy ( buff32, sizeof buff32, str, size );
+    REQUIRE_EQ ( copied, ( size_t ) ( sizeof buff32 ) );
+
+    // this is UTF-8 with a character count of 37, byte count of 41
+    str = "T\303\272 est\303\241s probando \303\251ste hoy, no ma\303\261ana";
+    size = strlen ( str );
+    copied = string_copy ( buff64, sizeof buff64, str, size );
+    REQUIRE_EQ ( copied, size );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+
+    // this is the same string with a split UTF-8 character
+    str = "T\303\272 est\303\241s probando \303\251ste hoy, no ma\303";
+    size = strlen ( str );
+    copied = string_copy ( buff64, sizeof buff64, str, size );
+    REQUIRE_EQ ( copied, size - 1 );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+
+    // test a copy with an embedded NUL
+    const char EN [] = "This is the case of an\000embedded NUL byte";
+    size = sizeof EN - 1;
+    REQUIRE_EQ ( size, ( size_t ) 40 );
+    size = strlen ( EN );
+    REQUIRE_EQ ( size, ( size_t ) 22 );
+    copied = string_copy ( buff64, sizeof buff64, EN, sizeof EN - 1 );
+    REQUIRE_EQ ( copied, size );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+}
+
+TEST_CASE ( Klib_text_string_copy_measure )
+{
+    char buff64 [ 64 ];
+    const char * str = "Tu estas probando este hoy, no manana";
+    size_t size = strlen ( str );
+    size_t copied = string_copy_measure ( buff64, sizeof buff64, str );
+    REQUIRE_EQ ( copied, size );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+
+    char buff32 [ 32 ];
+    copied = string_copy_measure ( buff32, sizeof buff32, str );
+    REQUIRE_EQ ( copied, ( size_t ) ( sizeof buff32 ) );
+
+    // this is UTF-8 with a character count of 37, byte count of 41
+    str = "T\303\272 est\303\241s probando \303\251ste hoy, no ma\303\261ana";
+    size = strlen ( str );
+    copied = string_copy_measure ( buff64, sizeof buff64, str );
+    REQUIRE_EQ ( copied, size );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+
+    // this is the same string with a split UTF-8 character
+    str = "T\303\272 est\303\241s probando \303\251ste hoy, no ma\303";
+    size = strlen ( str );
+    copied = string_copy_measure ( buff64, sizeof buff64, str );
+    REQUIRE_EQ ( copied, size - 1 );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+
+    // test a copy with an embedded NUL
+    const char EN [] = "This is the case of an\000embedded NUL byte";
+    size = sizeof EN - 1;
+    REQUIRE_EQ ( size, ( size_t ) 40 );
+    size = strlen ( EN );
+    REQUIRE_EQ ( size, ( size_t ) 22 );
+    copied = string_copy_measure ( buff64, sizeof buff64, EN );
+    REQUIRE_EQ ( copied, size );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+}
+
+TEST_CASE ( Klib_text_tolower_copy )
+{
+    char buff64 [ 64 ];
+    const char * str = "Tu Estas Probando Este Hoy, No Manana";
+    size_t size = strlen ( str );
+    size_t copied = tolower_copy ( buff64, sizeof buff64, str, size );
+    REQUIRE_EQ ( copied, size );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+    int diff = strcmp ( buff64, "tu estas probando este hoy, no manana" );
+    REQUIRE_EQ ( diff, 0 );
+
+    char buff32 [ 32 ];
+    copied = tolower_copy ( buff32, sizeof buff32, str, size );
+    REQUIRE_EQ ( copied, ( size_t ) ( sizeof buff32 ) );
+    diff = memcmp ( buff64, "tu estas probando este hoy, no manana", copied );
+    REQUIRE_EQ ( diff, 0 );
+
+    // this is UTF-8 with a character count of 37, byte count of 41
+    str = "T\303\272 Est\303\241s Probando \303\211ste Hoy, No Ma\303\261ana";
+    size = strlen ( str );
+    copied = tolower_copy ( buff64, sizeof buff64, str, size );
+    REQUIRE_EQ ( copied, size );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+#if 0
+    std::cout
+        << buff64
+        << '\n'
+        ;
+    diff = strcmp ( buff64, "t\303\272 est\303\241s probando \303\251ste hoy, no ma\303\261ana" );
+    REQUIRE_EQ ( diff, 0 );
+#endif
+
+    // this is the same string with a split UTF-8 character
+    str = "T\303\272 Est\303\241s Probando \303\211ste Hoy, No Ma\303";
+    size = strlen ( str );
+    copied = tolower_copy ( buff64, sizeof buff64, str, size );
+    REQUIRE_EQ ( copied, size - 1 );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+#if 0
+    diff = memcmp ( buff64, "t\303\272 est\303\241s probando \303\251ste hoy, no ma\303\261ana", copied );
+    REQUIRE_EQ ( diff, 0 );
+#endif
+
+    // test a copy with an embedded NUL
+    const char EN [] = "This Is The Case of an\000embedded NUL byte";
+    size = sizeof EN - 1;
+    REQUIRE_EQ ( size, ( size_t ) 40 );
+    size = strlen ( EN );
+    REQUIRE_EQ ( size, ( size_t ) 22 );
+    copied = tolower_copy ( buff64, sizeof buff64, EN, sizeof EN - 1 );
+    REQUIRE_EQ ( copied, size );
+    REQUIRE_EQ ( ( char ) 0, buff64 [ copied ] );
+    diff = memcmp ( buff64, "this is the case of an\000embedded nul byte", copied );
+    REQUIRE_EQ ( diff, 0 );
+}
+
+TEST_CASE ( KLib_text_StringToI64 )
+{
+    rc_t rc;
+    String str;
+    int64_t val;
+
+    CONST_STRING ( & str, "12345678" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, ( int64_t ) 12345678 );
+
+    CONST_STRING ( & str, "   12345678" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, ( int64_t ) 12345678 );
+
+    CONST_STRING ( & str, "   ++12345678" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, ( int64_t ) 12345678 );
+
+    CONST_STRING ( & str, "   ++12345678 " );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC_FAIL ( rc );
+    REQUIRE_EQ ( GetRCObject ( rc ), rcTransfer );
+    REQUIRE_EQ ( GetRCState ( rc ), rcIncomplete );
+    REQUIRE_EQ ( val, ( int64_t ) 12345678 );
+
+    CONST_STRING ( & str, "   ++c12345678 " );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC_FAIL ( rc );
+    REQUIRE_EQ ( GetRCObject ( rc ), ( RCObject ) rcData );
+    REQUIRE_EQ ( GetRCState ( rc ), rcInsufficient );
+    REQUIRE_EQ ( val, ( int64_t ) 0 );
+
+    CONST_STRING ( & str, "   -++-12345678" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, ( int64_t ) 12345678 );
+
+    CONST_STRING ( & str, "   -++12345678" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, ( int64_t ) -12345678 );
+
+    CONST_STRING ( & str, "" );
+    val = StringToI64 ( & str, 0 );
+    REQUIRE_EQ ( val, ( int64_t ) 0 );
+
+    CONST_STRING ( & str, "0" );
+    val = StringToI64 ( & str, 0 );
+    REQUIRE_EQ ( val, ( int64_t ) 0 );
+
+    CONST_STRING ( & str, "1" );
+    val = StringToI64 ( & str, 0 );
+    REQUIRE_EQ ( val, ( int64_t ) 1 );
+
+    CONST_STRING ( & str, "9223372036854775805" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, INT64_C ( 9223372036854775805 ) );
+
+    CONST_STRING ( & str, "9223372036854775807" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, INT64_C ( 9223372036854775807 ) );
+
+    CONST_STRING ( & str, "9223372036854775808" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC_FAIL ( rc );
+    REQUIRE_EQ ( GetRCObject ( rc ), rcRange );
+    REQUIRE_EQ ( GetRCState ( rc ), rcExcessive );
+    REQUIRE_EQ ( val, INT64_C ( 9223372036854775807 ) );
+    val = StringToI64 ( & str, 0 );
+    REQUIRE_EQ ( val, INT64_C ( 9223372036854775807 ) );
+
+    CONST_STRING ( & str, "92233720368547758071" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC_FAIL ( rc );
+    REQUIRE_EQ ( GetRCObject ( rc ), rcRange );
+    REQUIRE_EQ ( GetRCState ( rc ), rcExcessive );
+    REQUIRE_EQ ( val, INT64_C ( 9223372036854775807 ) );
+
+    CONST_STRING ( & str, "-9223372036854775805" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, INT64_C ( -9223372036854775805 ) );
+
+    CONST_STRING ( & str, "-9223372036854775807" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, INT64_C ( -9223372036854775807 ) );
+
+    // the value -9223372036854775808 causes complaint
+    // because it is first parsed as signed, which overflows
+    // and then is negated after the complaint
+    // use -9223372036854775807 - 1
+    // WHY AREN'T INT64_MIN/MAX WORKING?
+
+    CONST_STRING ( & str, "-9223372036854775808" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, INT64_C ( -9223372036854775807 ) - INT64_C ( 1 ) );
+
+    CONST_STRING ( & str, "-9223372036854775809" );
+    val = StringToI64 ( & str, & rc );
+    REQUIRE_RC_FAIL ( rc );
+    REQUIRE_EQ ( GetRCObject ( rc ), rcRange );
+    REQUIRE_EQ ( GetRCState ( rc ), rcExcessive );
+    REQUIRE_EQ ( val, INT64_C ( -9223372036854775807 ) - INT64_C ( 1 ) );
+    val = StringToI64 ( & str, 0 );
+    REQUIRE_EQ ( val, INT64_C ( -9223372036854775807 ) - INT64_C ( 1 ) );
+} 
+
+TEST_CASE ( KLib_text_StringToU64 )
+{
+    rc_t rc;
+    String str;
+    uint64_t val;
+
+    CONST_STRING ( & str, "12345678" );
+    val = StringToU64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, ( uint64_t ) 12345678 );
+
+    CONST_STRING ( & str, "   12345678" );
+    val = StringToU64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, ( uint64_t ) 12345678 );
+
+    CONST_STRING ( & str, "   ++12345678" );
+    val = StringToU64 ( & str, & rc );
+    REQUIRE_RC_FAIL ( rc );
+    REQUIRE_EQ ( GetRCObject ( rc ), ( RCObject ) rcData );
+    REQUIRE_EQ ( GetRCState ( rc ), rcInsufficient );
+    REQUIRE_EQ ( val, ( uint64_t ) 0 );
+
+    CONST_STRING ( & str, "   12345678 " );
+    val = StringToU64 ( & str, & rc );
+    REQUIRE_RC_FAIL ( rc );
+    REQUIRE_EQ ( GetRCObject ( rc ), rcTransfer );
+    REQUIRE_EQ ( GetRCState ( rc ), rcIncomplete );
+    REQUIRE_EQ ( val, ( uint64_t ) 12345678 );
+
+    CONST_STRING ( & str, "" );
+    val = StringToU64 ( & str, 0 );
+    REQUIRE_EQ ( val, ( uint64_t ) 0 );
+
+    CONST_STRING ( & str, "0" );
+    val = StringToU64 ( & str, 0 );
+    REQUIRE_EQ ( val, ( uint64_t ) 0 );
+
+    CONST_STRING ( & str, "1" );
+    val = StringToU64 ( & str, 0 );
+    REQUIRE_EQ ( val, ( uint64_t ) 1 );
+
+    CONST_STRING ( & str, "18446744073709551610" );
+    val = StringToU64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, UINT64_C ( 18446744073709551610 ) );
+
+    CONST_STRING ( & str, "18446744073709551615" );
+    val = StringToU64 ( & str, & rc );
+    REQUIRE_RC ( rc );
+    REQUIRE_EQ ( val, UINT64_C ( 18446744073709551615 ) );
+
+    CONST_STRING ( & str, "18446744073709551616" );
+    val = StringToU64 ( & str, & rc );
+    REQUIRE_RC_FAIL ( rc );
+    REQUIRE_EQ ( GetRCObject ( rc ), rcRange );
+    REQUIRE_EQ ( GetRCState ( rc ), rcExcessive );
+    REQUIRE_EQ ( val, UINT64_C ( 18446744073709551615 ) );
+    val = StringToU64 ( & str, 0 );
+    REQUIRE_EQ ( val, UINT64_C ( 18446744073709551615 ) );
+
+    CONST_STRING ( & str, "184467440737095516151" );
+    val = StringToU64 ( & str, & rc );
+    REQUIRE_RC_FAIL ( rc );
+    REQUIRE_EQ ( GetRCObject ( rc ), rcRange );
+    REQUIRE_EQ ( GetRCState ( rc ), rcExcessive );
+    REQUIRE_EQ ( val, UINT64_C ( 18446744073709551615 ) );
+} 
+
+///////////////////////////////////////////////// ksort 
+
+static char UserData[]="User data";
+
+// this is used by qsort and (indirectly) ksort
+int CC baseCompare( const void* a, const void* b )
+{
+    const char* pa=(const char*)a;
+    const char* pb=(const char*)b;
+    if (*pa < *pb)
+    {
+        return -1;
+    }
+    if (*pa > *pb)
+    {
+        return 1;
+    }
+    return 0;
+}
+// this is used by ksort
+int64_t CC compare( const void* a, const void* b, void *data )
+{
+    // if data is not pointing where we waint it to, do not sort
+    const char* pdata=(const char*)data;
+    if (pdata != 0 && string_cmp(pdata, string_size(pdata), UserData, string_size(UserData), (uint32_t)string_size(UserData)) != 0)
+    {
+        return 0;
+    }
+    return baseCompare(a, b);
+}
+
+TEST_CASE(KLib_ksort_no_elements)
+{
+    char arr[1]={13};
+    ksort(arr, 0, sizeof (char), compare, UserData);
+    // do not crash or change the target
+    REQUIRE_EQ(arr[0], (char)13);
+}
+TEST_CASE(KLib_ksort_one_element)
+{
+    char arr[1]={13};
+    ksort(arr, 1, sizeof (char), compare, UserData);
+    // do not crash or change the target
+    REQUIRE_EQ(arr[0], (char)13);
+}
+
+TEST_CASE(KLib_ksort_simple)
+{
+    const int Size=5;
+    char arr[Size]={2, 4, 1, 0, 3};
+    ksort(arr, Size, sizeof (char), compare, UserData);
+    REQUIRE_EQ(arr[0], (char)0);
+    REQUIRE_EQ(arr[1], (char)1);
+    REQUIRE_EQ(arr[2], (char)2);
+    REQUIRE_EQ(arr[3], (char)3);
+    REQUIRE_EQ(arr[4], (char)4);
+}
+TEST_CASE(KLib_ksort_vs_qsort)
+{
+    const int Size=5;
+    char karr[Size]={2, 4, 1, 0, 3};
+    char qarr[Size];
+    memmove(qarr, karr, sizeof(karr));
+
+    ksort(karr, Size, sizeof (char), compare, 0); // do not pass any user data
+    qsort(qarr, Size, sizeof (char), baseCompare);
+    REQUIRE_EQ(memcmp(karr, qarr, sizeof(karr)), 0);
+}
+
+// an example of a bad function (compating pointers not values, in reverse order) that causes an implementaion of ksort to crash.
+int64_t CC badCompare( const void* a, const void* b, void *data )
+{
+    const char* pa=(const char*)a;
+    const char* pb=(const char*)b;
+    if (pa < pb)
+    {
+        return 1;
+    }
+    if (pa > pb)
+    {
+        return -1;
+    }
+    return 0;
+}
+TEST_CASE(KLib_ksort_problem)
+{
+    const int Size=5;
+    {
+        char arr[Size]={2, 4, 1, 0, 3};
+        ksort(arr, Size, sizeof (char), badCompare, 0);
+        // we just do not want this to crash since the compare function is not working properly and the eventual sort order is undefined
+    }
+}
+
+///////////////////////////////////////////////// macro based ksort 
+
+TEST_CASE(KSORT_simple)
+{
+    char karr[]={2, 4, 1, 0, 3};
+    const int ElemSize = sizeof(karr[0]);
+    const int Size= sizeof(karr) / ElemSize;
+    char qarr[Size];
+    memmove(qarr, karr, sizeof(karr));
+
+#define CMP(a, b) (*(char*)(a) < *(char*)(b) ? -1 : *(char*)(a) > *(char*)(b))
+#define SWAP(a, b, offset, size) 
+    KSORT(karr, Size, ElemSize, 0, ElemSize);
+    ksort(qarr, Size, ElemSize, compare, 0);
+    REQUIRE_EQ(memcmp(karr, qarr, sizeof(karr)), 0);    
+#undef CMP
+#undef SWAP 
+}
+
+static
+int64_t CC cmp_int64_t ( const void *a, const void *b, void *data )
+{
+    const int64_t *ap = (const int64_t *)a;
+    const int64_t *bp = (const int64_t *)b;
+
+    if ( * ap < * bp )
+        return -1;
+    return * ap > * bp;
+}
+
+TEST_CASE(KSORT_int64)
+{
+    int64_t karr[]={2, 4, 1};
+    const int ElemSize = sizeof(karr[0]);
+    const int Size= sizeof(karr) / ElemSize;
+    int64_t qarr[Size];
+    memmove(qarr, karr, sizeof(karr));
+
+    ksort_int64_t (karr, Size);
+    ksort(qarr, Size, ElemSize, cmp_int64_t , 0);
+    REQUIRE_EQ(memcmp(karr, qarr, sizeof(karr)), 0);    
+}
+
+
+///////////////////////////////////////////////// string_printf
+TEST_CASE(KLib_print_uint64)
+{
+    char dst[1024];
+    size_t num_writ;
+    uint64_t val=UINT64_C(1152921504606846976);
+    REQUIRE_RC(string_printf ( dst, sizeof(dst), &num_writ, "%lu", val));
+    REQUIRE_EQ(string( dst, num_writ), string("1152921504606846976"));
+}
+
+#ifndef WINDOWS
+TEST_CASE(KLib_print_problem)
+{
+    char dst[1024];
+    size_t num_writ;
+    double d=1.0;
+    REQUIRE_RC(string_printf ( dst, sizeof(dst), &num_writ, "%.6f", d));
+    REQUIRE_EQ(num_writ, strlen(dst));
+    REQUIRE_EQ(string("1.000000"), string(dst, num_writ));
+}
+#endif
+
+///////////////////////////////////////////////// KDataBuffer
+
+TEST_CASE(KDataBuffer_Make)
+{
+    KDataBuffer src;
+
+    REQUIRE_RC(KDataBufferMake(&src, 13, 9876));
+
+    REQUIRE(src.ignore != 0);
+    REQUIRE(src.base != 0);
+    REQUIRE_EQ((uint64_t)13, src.elem_bits);
+    REQUIRE_EQ((uint64_t)9876, src.elem_count);
+    REQUIRE_EQ((bitsz_t)(13 * 9876), KDataBufferBits(&src));
+    REQUIRE_EQ((uint8_t)src.bit_offset, (uint8_t) 0 ); 
+
+    KDataBufferWhack(&src );
+}
+
+TEST_CASE(KDataBuffer_MakeBytes)
+{
+    KDataBuffer src;
+
+    REQUIRE_RC(KDataBufferMakeBytes(&src, 12));
+
+    REQUIRE_EQ((uint64_t)8, src.elem_bits);
+    REQUIRE_EQ((uint64_t)12, src.elem_count);
+    REQUIRE_EQ((bitsz_t)(12*8), KDataBufferBits(&src));
+    REQUIRE_EQ((size_t)12, KDataBufferBytes(&src));
+    REQUIRE_EQ((uint8_t)src.bit_offset, (uint8_t) 0 ); 
+
+    KDataBufferWhack(&src );
+}
+
+TEST_CASE(KDataBuffer_MakeBits)
+{
+    KDataBuffer src;
+
+    REQUIRE_RC(KDataBufferMakeBits(&src, 8));
+
+    REQUIRE_EQ((uint64_t)1, src.elem_bits);
+    REQUIRE_EQ((uint64_t)8, src.elem_count);
+    REQUIRE_EQ((bitsz_t)(1*8), KDataBufferBits(&src));
+    REQUIRE_EQ((size_t)1, KDataBufferBytes(&src));
+    REQUIRE_EQ((uint8_t)src.bit_offset, (uint8_t) 0 ); 
+
+    KDataBufferWhack(&src );
+}
+
+TEST_CASE(KDataBuffer_MakeBits1)
+{
+    KDataBuffer src;
+    const size_t BIT_SZ = 7896;
+    REQUIRE_RC(KDataBufferMakeBits(&src, BIT_SZ));
+
+    REQUIRE_EQ((uint64_t)1, src.elem_bits);
+    REQUIRE_EQ((uint64_t)BIT_SZ, src.elem_count);
+    REQUIRE_EQ((bitsz_t)(1*BIT_SZ), KDataBufferBits(&src));
+    REQUIRE_EQ((size_t)((1 * BIT_SZ + 7) / 8), KDataBufferBytes(&src));
+    REQUIRE_EQ((uint8_t)src.bit_offset, (uint8_t) 0 ); 
+
+    KDataBufferWhack(&src );
+}
+
+TEST_CASE(KDataBuffer_Sub)
+{
+    KDataBuffer src;
+    KDataBuffer sub;
+
+    const size_t BIT_SZ = 7896;
+    REQUIRE_RC(KDataBufferMakeBits(&src, BIT_SZ));
+
+
+    REQUIRE_RC(KDataBufferSub(&src, &sub, 800, 900 ));
+
+    REQUIRE_EQ(src.elem_bits, sub.elem_bits);
+    REQUIRE_EQ((uint64_t)900, sub.elem_count);
+    REQUIRE_EQ((bitsz_t)(1*900), KDataBufferBits(&sub));
+    REQUIRE_EQ((uint8_t*)sub.base, (uint8_t*) src.base + ( 800 >> 3 ));
+    REQUIRE_EQ((uint64_t)sub.bit_offset, (uint64_t) 0 ); 
+
+    KDataBufferWhack(&src );
+    KDataBufferWhack(&sub );
+}
+
+TEST_CASE(KDataBuffer_Sub1)
+{
+    KDataBuffer src;
+    KDataBuffer sub;
+
+    const size_t BIT_SZ = 7896;
+    REQUIRE_RC(KDataBufferMakeBits(&src, BIT_SZ));
+
+
+    REQUIRE_RC(KDataBufferSub(&src, &sub, 801, 900 ));
+
+    REQUIRE_EQ(src.elem_bits, sub.elem_bits);
+    REQUIRE_EQ((uint64_t)900, sub.elem_count);
+    REQUIRE_EQ((bitsz_t)(1*900), KDataBufferBits(&sub));
+    REQUIRE_EQ((uint8_t*)sub.base, (uint8_t*) src.base + ( 800 >> 3 ));
+    REQUIRE_EQ((uint64_t)sub.bit_offset, (uint64_t)1); 
+
+    KDataBufferWhack(&src );
+    KDataBufferWhack(&sub );
+}
+
+TEST_CASE(KDataBuffer_MakeWritable)
+{
+    KDataBuffer src;
+    KDataBuffer copy;
+
+    REQUIRE_RC(KDataBufferMakeBytes(&src, 12));
+
+    REQUIRE_RC(KDataBufferMakeWritable(&src, &copy));
+
+
+    REQUIRE_EQ(src.elem_bits, copy.elem_bits);
+    REQUIRE_EQ((uint64_t)12, copy.elem_count);
+    REQUIRE_EQ(copy.base, src.base);
+    REQUIRE_EQ((uint64_t)copy.bit_offset, (uint64_t)0); 
+
+    KDataBufferWhack(&src);
+    KDataBufferWhack(&copy);
+}
+
+TEST_CASE(KDataBuffer_MakeWritable1)
+{
+    KDataBuffer src;
+    KDataBuffer sub;
+    KDataBuffer copy;
+
+    REQUIRE_RC(KDataBufferMakeBytes(&src, 256));
+
+    REQUIRE_RC(KDataBufferSub(&src, &sub, 8, 12 ));
+
+    REQUIRE_RC(KDataBufferMakeWritable(&sub, &copy));
+
+    REQUIRE_EQ(src.elem_bits, copy.elem_bits);
+    REQUIRE_EQ((uint64_t)12, sub.elem_count);
+    REQUIRE_EQ((uint64_t)12, copy.elem_count);
+    REQUIRE_NE(sub.base, copy.base);
+    REQUIRE_EQ((uint64_t)copy.bit_offset, (uint64_t)0); 
+
+    KDataBufferWhack(&src );
+    KDataBufferWhack(&sub );
+    KDataBufferWhack(&copy );
+}
+
+TEST_CASE(KDataBuffer_Resize)
+{
+    KDataBuffer src;
+    uint32_t blob_size=4096;
+    REQUIRE_RC(KDataBufferMake(&src, 8, blob_size));
+
+    /* make sub-buffer from input */
+    KDataBuffer dst;
+    uint32_t hdr_size=7;
+    REQUIRE_RC(KDataBufferSub ( &src, &dst, hdr_size, blob_size ));
+    /* cast from 8 into 2 bits */
+    REQUIRE_RC(KDataBufferCast ( &dst, &dst, 2, true ));
+    /* resize to 4 times the original number of elements */
+    REQUIRE_RC(KDataBufferResize ( &dst, (blob_size - hdr_size) * 4 ));
+
+    KDataBufferWhack ( & dst );
+    KDataBufferWhack ( & src );
+}
+
+TEST_CASE(KDataBuffer_Cast_W32Assert)
+{   
+    KDataBuffer src;
+    REQUIRE_RC ( KDataBufferMake ( &src, 64, 1 ) );
+    REQUIRE_RC ( KDataBufferCast ( &src, &src, 64, true ) ); /* used to throw am assert on Win32 */
+    KDataBufferWhack ( & src );
+}
+
+//////////////////////////////////////////// Log
+TEST_CASE(KLog_Formatting)
+{
+    unsigned long status = 161;
+    REQUIRE_RC( pLogErr ( klogInfo, 0, "$(E) - $(C)", "E=%!,C=%u", status, status ) ); // fails on Windows
+}
+
+TEST_CASE(KLog_LevelExplain)
+{
+    char buf[5];
+    size_t num_writ=0;
+    REQUIRE_RC(KLogLevelExplain(klogInfo, buf, sizeof(buf), &num_writ));
+    REQUIRE_EQ(string("info"), string(buf));
+    REQUIRE_EQ(num_writ, strlen(buf));
+}
+TEST_CASE(KLog_LevelExplainNoRoomforNul)
+{
+    char buf[4];
+    size_t num_writ=0;
+    REQUIRE_RC(KLogLevelExplain(klogInfo, buf, sizeof(buf), &num_writ));
+    REQUIRE_EQ(string("info"), string(buf, 4));
+    REQUIRE_EQ(num_writ, (size_t)4);
+}
+TEST_CASE(KLog_LevelExplainInsufficientBuffer)
+{
+    char buf[3];
+    size_t num_writ=0;
+    REQUIRE_RC_FAIL(KLogLevelExplain(klogInfo, buf, sizeof(buf), &num_writ));
+    REQUIRE_EQ(num_writ, (size_t)0);
+}
+
+TEST_CASE(IsUserAnAdminTest) 
+{
+    // TeamCity agents run as admin on some systems but not the others
+#if defined (WINDOWS)
+    if ( getenv ( "TEAMCITY_VERSION" ) != 0 )
+    {
+        REQUIRE ( is_iser_an_admin() );
+    }
+    else
+    {
+        REQUIRE ( !is_iser_an_admin() );
+    }
+#else
+    // Linux or not under TeamCity
+    REQUIRE ( !is_iser_an_admin() );
+#endif
+}
+
+
+
+static const size_t BufSize = 1024;
+// implementation of KWrtWriter for testing purposes
+rc_t CC TestWrtWriter( void * data, const char * buffer, size_t bufsize, size_t * num_writ )
+{
+    size_t nw = string_copy((char*)data, BufSize, buffer, bufsize);
+    if (num_writ != 0)
+        *num_writ = nw;
+    return 0;
+}
+
+TEST_CASE(KLog_DefaultFormatterNull)
+{
+    REQUIRE_RC(KLogFmtWriterGet()(NULL, NULL, 0, NULL, 0, NULL));
+}    
+TEST_CASE(KLog_DefaultFormatterBasic)
+{
+    char buffer[BufSize];
+    KWrtHandler testHandler = {TestWrtWriter, (void*)buffer};
+    wrt_nvp_t args[]={ // ignored
+        {"", ""}
+    };
+    wrt_nvp_t envs[]={ // has to be sorted by key, apparently...
+        {"app", "test"},
+        {"message", "msg"},
+        {"reason", "rc"},
+        {"severity", "bad"},
+        {"timestamp", "time"},
+        {"version", "v1"},
+    };
+    REQUIRE_RC(KLogFmtWriterGet()(NULL, &testHandler, sizeof(args) / sizeof(args[0]), args, sizeof(envs) / sizeof(envs[0]), envs));
+    REQUIRE_EQ(string("time test.v1 bad: rc - msg\n"), string((const char*)testHandler.data));
+}
+
+// implementation of KFmtWriter for testing purposes
+rc_t CC TestFmtWriter ( void* self, KWrtHandler* writer,
+                        size_t argc, const wrt_nvp_t args[],
+                        size_t envc, const wrt_nvp_t envs[] )
+{
+    char buffer[BufSize];
+    size_t num_writ;
+    string_printf(buffer, 
+                  sizeof(buffer), 
+                  & num_writ, 
+                  "%s",
+                  wrt_nvp_find_value(envc, envs, "message"));  
+                  
+    size_t size;
+    return LogFlush(writer, buffer, string_measure(buffer, &size));
+}
+TEST_CASE(KLog_ParamFormatting)
+{
+    char buffer[BufSize];
+    REQUIRE_RC(KLogHandlerSet(TestWrtWriter, buffer));
+    REQUIRE_RC(KLogFmtHandlerSet(TestFmtWriter, 0, buffer));
+    REQUIRE_RC(pLogMsg(klogErr, "message with $(PARAM1) $(P2) etc.", "PARAM1=%s,P2=%s", "parameter1", "param2"));
+    REQUIRE_EQ(string("message with parameter1 param2 etc."), string(buffer));
+}    
+
+//////////////////////////////////////////// num-gen
+#define SHOW_UNIMPLEMENTED 0
+class NumGenFixture
+{
+public:
+    NumGenFixture()
+    : m_ng(0), m_it(0)
+    {
+    }
+    ~NumGenFixture()
+    {
+        if ( m_it && num_gen_iterator_destroy ( m_it ) )
+           throw logic_error ( "NumGenFixture: num_gen_iterator_destroy failed" );
+        
+        if ( m_ng && num_gen_destroy ( m_ng ) != 0 )
+           throw logic_error ( "NumGenFixture: num_gen_destroy failed" );
+    }
+    
+    struct num_gen * m_ng;
+    const struct num_gen_iter * m_it;
+};
+
+FIXTURE_TEST_CASE(num_gen_Make, NumGenFixture)
+{
+    REQUIRE_RC ( num_gen_make ( & m_ng ) );
+    REQUIRE_NOT_NULL ( m_ng );
+}    
+FIXTURE_TEST_CASE(num_gen_MakeFromStr, NumGenFixture)
+{
+    REQUIRE_RC ( num_gen_make_from_str ( & m_ng, "1" ) );
+    REQUIRE_NOT_NULL ( m_ng );
+}    
+
+FIXTURE_TEST_CASE(num_gen_MakeFromEmptyStr, NumGenFixture)
+{
+    REQUIRE_RC_FAIL ( num_gen_make_from_str ( & m_ng, "" ) );
+    REQUIRE_NULL ( m_ng );
+}    
+
+FIXTURE_TEST_CASE(num_gen_MakeFromRange, NumGenFixture)
+{
+    REQUIRE_RC ( num_gen_make_from_range ( & m_ng, 1, 2 ) );
+    REQUIRE_NOT_NULL ( m_ng );
+}    
+FIXTURE_TEST_CASE(num_gen_MakeFromEmptyRange, NumGenFixture)
+{
+    REQUIRE_RC_FAIL( num_gen_make_from_range ( & m_ng, 1, 0 ) );
+    REQUIRE_NULL ( m_ng );
+}    
+
+FIXTURE_TEST_CASE(num_gen_Empty, NumGenFixture)
+{
+    REQUIRE_RC( num_gen_make ( & m_ng ) );
+    REQUIRE ( num_gen_empty ( m_ng ) );
+}    
+
+FIXTURE_TEST_CASE(num_gen_Clear, NumGenFixture)
+{
+    REQUIRE_RC ( num_gen_make_from_range ( & m_ng, 1, 2 ) );
+    REQUIRE ( ! num_gen_empty ( m_ng ) );
+    
+    REQUIRE_RC ( num_gen_clear ( m_ng ) );
+    
+    REQUIRE ( num_gen_empty ( m_ng ) );
+}    
+
+#if SHOW_UNIMPLEMENTED
+FIXTURE_TEST_CASE(num_gen_EmptyRange, NumGenFixture)
+{
+    REQUIRE_RC( num_gen_make_from_range ( & m_ng, 1, 0 ) );
+    REQUIRE_NOT_NULL ( m_ng );
+    REQUIRE ( num_gen_empty ( m_ng ) );
+}    
+#endif
+
+FIXTURE_TEST_CASE(num_gen_IteratorMake, NumGenFixture)
+{
+    REQUIRE_RC ( num_gen_make ( & m_ng ) );
+    REQUIRE_RC ( num_gen_iterator_make( m_ng, &m_it ) );
+}
+
+FIXTURE_TEST_CASE(num_gen_IteratorCount, NumGenFixture)
+{
+    REQUIRE_RC ( num_gen_make_from_range ( & m_ng, 1, 2 ) );
+    REQUIRE_RC ( num_gen_iterator_make( m_ng, &m_it ) );
+    
+    uint64_t count;
+    REQUIRE_RC ( num_gen_iterator_count ( m_it, &count ) );
+    REQUIRE_EQ ( (uint64_t)2, count );
+}
+FIXTURE_TEST_CASE(num_gen_IteratorCountEmpty, NumGenFixture)
+{
+    REQUIRE_RC ( num_gen_make ( & m_ng ) );
+    REQUIRE_RC ( num_gen_iterator_make( m_ng, &m_it ) );
+    
+    uint64_t count;
+    REQUIRE_RC ( num_gen_iterator_count ( m_it, &count ) );
+    REQUIRE_EQ ( (uint64_t)0, count );
+}
+ 
+FIXTURE_TEST_CASE(num_gen_IteratorNext, NumGenFixture)
+{
+    REQUIRE_RC ( num_gen_make_from_range ( & m_ng, 1, 2 ) );
+    REQUIRE_RC ( num_gen_iterator_make( m_ng, &m_it ) );
+    
+    int64_t value;
+    rc_t rc = 0;
+    REQUIRE ( num_gen_iterator_next ( m_it, &value, &rc ) );
+    REQUIRE_EQ ( (int64_t)1, value );
+    REQUIRE_RC ( rc );
+    
+    REQUIRE ( num_gen_iterator_next ( m_it, &value, &rc ) );
+    REQUIRE_EQ ( (int64_t)2, value );
+    REQUIRE_RC ( rc );
+    
+    REQUIRE ( ! num_gen_iterator_next ( m_it, &value, &rc ) );
+    REQUIRE_RC ( rc );
+}
+ 
+//TODO:
+//rc_t num_gen_parse( struct num_gen * self, const char * src );
+//rc_t num_gen_add( struct num_gen * self, const uint64_t first, const uint64_t count );
+//rc_t num_gen_trim( struct num_gen * self, const int64_t first, const uint64_t count );
+//rc_t num_gen_as_string( const struct num_gen * self, char * buffer, size_t buffsize, size_t * written, bool full_info );
+//rc_t num_gen_contains_value( const struct num_gen * self, const uint64_t value );
+//rc_t num_gen_range_check( struct num_gen * self, const int64_t first, const uint64_t count );
+//rc_t num_gen_iterator_percent( const struct num_gen_iter * self, uint8_t fract_digits, uint32_t * value );
+
+// Error reporting
+#if _DEBUGGING
+TEST_CASE(GetUnreadRCInfo_LogRC)
+{   // bug report: only 1 RC is reported at the end of KMane in _DEBUGGING mode
+
+    // create a couple of RCs
+    RC ( rcApp, rcFile, rcConstructing, rcFile, rcNull );
+    RC ( rcXF, rcFunction, rcExecuting, rcParam, rcInvalid );
+    
+    rc_t rc;
+    uint32_t lineno;
+    const char *filename, *function;
+    REQUIRE ( GetUnreadRCInfo ( & rc, & filename, & function, & lineno ) );
+    // bug: call to pLogErr invokes GetRCFunction (and others alike),
+    // which as a side effect changes "last read RC" to equal "last written RC"
+    // causing the subsequent call to GetUnreadRCInfo to return "no more unread RCs"
+    pLogErr ( klogWarn, rc, "$(filename):$(lineno) within $(function)"
+              , "filename=%s,lineno=%u,function=%s"
+              , filename
+              , lineno
+              , function
+              );
+    REQUIRE ( GetUnreadRCInfo ( & rc, & filename, & function, & lineno ) );
+}
+#endif
+
+//////////////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-klib";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=KlibTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/klib/test-log.cpp b/test/klib/test-log.cpp
new file mode 100644
index 0000000..397439e
--- /dev/null
+++ b/test/klib/test-log.cpp
@@ -0,0 +1,317 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for klib/log interface
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+
+using namespace std;
+
+static const size_t BufSize = 1024;
+// implementation of KWrtWriter for testing purposes
+rc_t CC TestWrtWriter( void * data, const char * buffer, size_t bufsize, size_t * num_writ )
+{
+    size_t nw = string_copy((char*)data, BufSize, buffer, bufsize);
+    if (num_writ != 0)
+        *num_writ = nw;
+    return 0;
+}
+
+
+// VDB_1223: logging must perform properly when not initialized from KMane/KMain
+// Start using main(), never call KWrtInit() or KLogInit()
+// call all logging functions, make sure they do not crash
+
+TEST_SUITE(KLogTestSuite);
+
+// Getters working on an implicitly initialized logging
+TEST_CASE(KLog_KLogLevelGet)
+{
+    REQUIRE_EQ((KLogLevel)klogErr, KLogLevelGet());
+}
+
+TEST_CASE(KLog_KLogLevelExplain)
+{
+    char buf[1024];
+    REQUIRE_RC(KLogLevelExplain ( klogErr, buf, sizeof(buf), NULL ));
+    REQUIRE_EQ(string("err"), string(buf));
+}
+
+TEST_CASE(KLog_KLogGetParamStrings)
+{
+    REQUIRE_EQ(string("fatal"), string(KLogGetParamStrings()[0]));
+}
+
+TEST_CASE(KLog_KLogHandlerGet)
+{
+    REQUIRE_NOT_NULL(KLogHandlerGet());
+    REQUIRE_EQ((KWrtWriter)0, KLogHandlerGet()->writer);
+    REQUIRE_NULL(KLogHandlerGet()->data);
+}
+
+TEST_CASE(KLog_KLogLibHandlerGet)
+{
+    REQUIRE_NOT_NULL(KLogLibHandlerGet());
+    REQUIRE_EQ((KWrtWriter)0, KLogLibHandlerGet()->writer);
+    REQUIRE_NULL(KLogLibHandlerGet()->data);
+}
+
+TEST_CASE(KLog_KLogWriterGet)
+{
+    REQUIRE_EQ((KWrtWriter)0, KLogWriterGet());
+}
+
+TEST_CASE(KLog_KLogLibWriterGet)
+{
+    REQUIRE_EQ((KWrtWriter)0, KLogLibWriterGet());
+}
+
+TEST_CASE(KLog_KLogDataGet)
+{
+    REQUIRE_NULL(KLogDataGet());
+}
+
+TEST_CASE(KLog_KLogLibDataGet)
+{
+    REQUIRE_NULL(KLogLibDataGet());
+}
+
+TEST_CASE(KLog_KLogFmtHandlerGet)
+{
+    REQUIRE_NOT_NULL(KLogFmtHandlerGet());
+    REQUIRE_EQ((KFmtWriter)0, KLogFmtHandlerGet()->formatter);
+    REQUIRE_NULL(KLogFmtHandlerGet()->data);
+}
+
+TEST_CASE(KLog_KLogLibFmtHandlerGet)
+{
+    REQUIRE_NOT_NULL(KLogLibFmtHandlerGet());
+    REQUIRE_EQ((KFmtWriter)0, KLogLibFmtHandlerGet()->formatter);
+    REQUIRE_NULL(KLogLibFmtHandlerGet()->data);
+}
+
+TEST_CASE(KLog_KLogLibFmtFlagsGet)
+{
+    KLogFmtFlagsGet();
+}
+
+TEST_CASE(KLog_KLogFmtFlagsGet)
+{
+    KLogLibFmtFlagsGet();
+}
+
+TEST_CASE(KLog_KLogFmtWriterGet)
+{   
+    REQUIRE_NE((KFmtWriter)0, KLogFmtWriterGet());
+}
+
+TEST_CASE(KLog_KLogLibFmtWriterGet)
+{   
+    REQUIRE_NE((KFmtWriter)0, KLogLibFmtWriterGet());
+}
+
+TEST_CASE(KLog_KLogFmtDataGet)
+{   
+    REQUIRE_NULL(KLogFmtDataGet());
+}
+
+TEST_CASE(KLog_KLogLibFmtDataGet)
+{   
+    REQUIRE_NULL(KLogLibFmtDataGet());
+}
+
+// Writers (just make sure they do not crash)
+TEST_CASE(KLog_LogMsg)
+{   
+    REQUIRE_RC(LogMsg(klogFatal, "test"));
+}
+
+TEST_CASE(KLog_LogLibMsg)
+{   
+    REQUIRE_RC(LogLibMsg(klogFatal, "test"));
+}
+
+TEST_CASE(KLog_pLogMsg)
+{   
+    REQUIRE_RC(pLogMsg(klogFatal, "test $(a) $(b)\n", "a=%s,b=%d", "kaboom", 10));
+}
+
+TEST_CASE(KLog_vLogMsg)
+{   
+    va_list l;
+    va_end(l);
+    REQUIRE_RC(vLogMsg(klogFatal, "test $(a) $(b)\n", "a=%s,b=%d", l));
+}
+
+TEST_CASE(KLog_pLogLibMsg)
+{   
+    REQUIRE_RC(pLogLibMsg(klogFatal, "test $(a) $(b)\n", "a=%s,b=%d", "kaboom", 10));
+}
+
+TEST_CASE(KLog_vLogLibMsg)
+{   
+    va_list l;
+    va_end(l);
+    REQUIRE_RC(vLogLibMsg(klogFatal, "test $(a) $(b)\n", "a=%s,b=%d", l));
+}
+
+TEST_CASE(KLog_LogErr)
+{   
+    REQUIRE_RC(LogErr(klogFatal, RC(rcNS,rcFile,rcWriting,rcTimeout,rcExhausted), "bad stuff"));
+}
+
+TEST_CASE(KLog_LogLibErr)
+{   
+    REQUIRE_RC(LogLibErr(klogFatal, RC(rcNS,rcFile,rcWriting,rcTimeout,rcExhausted), "bad stuff"));
+}
+
+TEST_CASE(KLog_pLogErr)
+{   
+    REQUIRE_RC(pLogErr(klogFatal, RC(rcNS,rcFile,rcWriting,rcTimeout,rcExhausted), "bad $(s)", "s=%s", "stuff"));
+}
+
+TEST_CASE(KLog_vLogErr)
+{   
+    va_list l;
+    va_end(l);
+    REQUIRE_RC(vLogErr(klogFatal, RC(rcNS,rcFile,rcWriting,rcTimeout,rcExhausted), "bad $(s)", "s=%s", l));
+}
+
+TEST_CASE(KLog_pLogLibErr)
+{   
+    REQUIRE_RC(pLogLibErr(klogFatal, RC(rcNS,rcFile,rcWriting,rcTimeout,rcExhausted), "bad $(s)", "s=%s", "stuff"));
+}
+
+TEST_CASE(KLog_vLogLibErr)
+{   
+    va_list l;
+    va_end(l);
+    REQUIRE_RC(vLogLibErr(klogFatal, RC(rcNS,rcFile,rcWriting,rcTimeout,rcExhausted), "bad $(s)", "s=%s", l));
+}
+
+// Setters
+TEST_CASE(KLog_KLogLevelSet)
+{
+    REQUIRE_RC(KLogLevelSet(klogInt));
+    REQUIRE_EQ((KLogLevel)klogInt, KLogLevelGet());
+}
+
+TEST_CASE(KLog_KLogLevelAdjust)
+{
+    REQUIRE_RC(KLogLevelSet(klogInt));
+    KLogLevelAdjust(2);
+    REQUIRE_EQ((KLogLevel)klogWarn, KLogLevelGet());
+}
+
+TEST_CASE(KLog_KLogLastErrorCode)
+{   // also KLogLastErrorCode
+    rc_t rc = RC(rcNS,rcFile,rcWriting,rcTimeout,rcExhausted);
+    KLogLastErrorCodeSet(klogErr, rc);
+    REQUIRE_EQ(rc, KLogLastErrorCode());
+}
+
+TEST_CASE(KLog_KLogLastErrorCodeReset)
+{
+    rc_t rc = RC(rcNS,rcFile,rcWriting,rcTimeout,rcExhausted);
+    KLogLastErrorCodeSet(klogErr, rc);
+    KLogLastErrorCodeReset();
+    REQUIRE_EQ((rc_t)0, KLogLastErrorCode());
+}
+
+
+TEST_CASE(KLog_KLogHandlerSet)
+{
+    char buf[BufSize];
+    REQUIRE_RC(KLogHandlerSet(TestWrtWriter, buf));
+    REQUIRE_NOT_NULL(KLogHandlerGet());
+    REQUIRE_EQ((KWrtWriter)TestWrtWriter, KLogHandlerGet()->writer);
+    REQUIRE_EQ((void*)buf, KLogHandlerGet()->data);
+    REQUIRE_RC(KLogHandlerSet(0, 0));
+}
+
+TEST_CASE(KLog_KLogLibHandlerSet)
+{
+    char buf[BufSize];
+    REQUIRE_RC(KLogLibHandlerSet(TestWrtWriter, buf));
+    REQUIRE_NOT_NULL(KLogLibHandlerGet());
+    REQUIRE_EQ((KWrtWriter)TestWrtWriter, KLogLibHandlerGet()->writer);
+    REQUIRE_EQ((void*)buf, KLogLibHandlerGet()->data);
+    REQUIRE_RC(KLogLibHandlerSet(0, 0));
+}
+
+TEST_CASE(KLog_KLogHandlerSetStdOut)
+{
+    REQUIRE_RC(KLogHandlerSetStdOut());
+}
+TEST_CASE(KLog_KLogLibHandlerSetStdOut)
+{
+    REQUIRE_RC(KLogLibHandlerSetStdOut());
+}
+TEST_CASE(KLog_KLogHandlerSetStdErr)
+{
+    REQUIRE_RC(KLogHandlerSetStdErr());
+}
+TEST_CASE(KLog_KLogLibHandlerSetStdErr)
+{
+    REQUIRE_RC(KLogLibHandlerSetStdErr());
+}
+
+TEST_CASE(UninitailizedCrachTest) {
+    REQUIRE_RC_FAIL(LOGMSG
+        (klogErr, "BANG! YOU SHOULD NOT SEE IT: Logger was not initialized"));
+    REQUIRE_RC(KWrtInit("app", 0x01020003));
+    REQUIRE_RC(
+        PLOGMSG(klogWarn, (klogWarn, "Now you see $(a)", "a=%s", "a warning")));
+}
+
+//TODO:
+// KLogFmtFlagsSet    
+// KLogLibFmtFlagsSet 
+// KLogFmtHandlerSet   
+// KLogLibFmtHandlerSet
+// KLogFmtHandlerSetDefault
+// KLogLibFmtHandlerSetDefault
+// KLogInit
+
+//////////////////////////////////////////////////// Main
+extern "C"
+{
+#ifdef WINDOWS
+#define main wmain
+#endif
+int main ( int argc, char *argv [] )
+{
+    rc_t rc=KLogTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/klib/test-out.cpp b/test/klib/test-out.cpp
new file mode 100644
index 0000000..bfc5031
--- /dev/null
+++ b/test/klib/test-out.cpp
@@ -0,0 +1,156 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for klib/out interface
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+
+#include <cstring>
+
+using namespace std;
+
+// VDB_1223: logging must perform properly when not initialized from KMane/KMain
+// Start using main(), never call KWrtInit() or KLogInit()
+// call all logging functions, make sure they do not crash
+
+TEST_SUITE(KOutTestSuite);
+
+// Getters working on an implicitly initialized logging
+TEST_CASE(Out_KOutHandlerGet)
+{
+    REQUIRE_NOT_NULL(KOutHandlerGet());
+}
+
+TEST_CASE(Out_KOutWriterGet)
+{
+    REQUIRE_EQ((KWrtWriter)0, KOutWriterGet());
+}
+
+TEST_CASE(Out_KOutDataGet)
+{
+    REQUIRE_NULL(KOutDataGet());
+}
+
+// Writers (just make sure they do not crash)
+TEST_CASE(Out_KOutMsg)
+{
+    REQUIRE_RC(KOutMsg("i'm a %s out message", "little"));
+}
+
+// Setters
+// TODO:
+// KOutHandlerSet 
+// KOutHandlerSetStdOut 
+// KOutHandlerSetStdErr 
+
+// VDB-1352: short-circuit certain formats in KMsgOut
+rc_t CC writerFn ( void * self, const char * buffer, size_t bufsize, size_t * num_writ )
+{
+    string& res = *(string*)self;
+    res += string(buffer, bufsize);
+    *num_writ = bufsize;
+    return 0; 
+}
+
+TEST_CASE(KOutMsgShortcut_s)
+{
+    string output;
+    REQUIRE_RC(KOutHandlerSet(writerFn, &output));
+    REQUIRE_RC(KOutMsg("%s", "some%string"));
+    REQUIRE_EQ(output, string("some%string"));
+}
+
+TEST_CASE(KOutMsgShortcut_s_sized)
+{   // when precision is less than the NUL-terminated string size, output according to precision
+    string output;
+    REQUIRE_RC(KOutHandlerSet(writerFn, &output));
+    REQUIRE_RC(KOutMsg("%.*s", 5, "some%string"));
+    REQUIRE_EQ(output, string("some%"));
+}
+TEST_CASE(KOutMsgShortcut_s_sized_extra_size)
+{   // when precision is greater than the NUL-terminated string size, output according to precision
+    string output;
+    REQUIRE_RC(KOutHandlerSet(writerFn, &output));
+    REQUIRE_RC(KOutMsg("%.*s", 15, "some%string\0ext"));
+    REQUIRE_EQ(memcmp("some%string\0ext", output.c_str(), 15), 0);
+}
+
+TEST_CASE(KOutMsgShortcut_S)
+{
+    string output;
+    String s;
+    CONST_STRING( &s, "some%string" );
+    REQUIRE_RC(KOutHandlerSet(writerFn, &output));
+    REQUIRE_RC(KOutMsg("%S", &s));
+    REQUIRE_EQ(output, string("some%string"));
+}
+
+TEST_CASE(KOutMsgShortcut_c_ascii)
+{
+    string output;
+    REQUIRE_RC(KOutHandlerSet(writerFn, &output));
+    char ch = 'h';
+    REQUIRE_RC(KOutMsg("%c", ch));
+    REQUIRE_EQ(output, string(&ch, 1));
+}
+TEST_CASE(KOutMsgShortcut_c_utf8)
+{
+    string output;
+    REQUIRE_RC(KOutHandlerSet(writerFn, &output));
+    uint32_t ch = 163; // pound sign
+    REQUIRE_RC(KOutMsg("%c", ch));
+    REQUIRE_EQ(output[0], '\302');
+    REQUIRE_EQ(output[1], '\243');
+}
+
+TEST_CASE(KOutMsgShortcut_no_shortcut)
+{
+    string output;
+    REQUIRE_RC(KOutHandlerSet(writerFn, &output));
+    REQUIRE_RC(KOutMsg("%s\n", "str"));
+    REQUIRE_EQ(output, string("str\n"));
+}
+
+
+//////////////////////////////////////////////////// Main
+extern "C"
+{
+#ifdef WINDOWS
+#define main wmain
+#endif
+int main ( int argc, char *argv [] )
+{
+    rc_t rc=KOutTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/klib/test-vnamelist.cpp b/test/klib/test-vnamelist.cpp
new file mode 100644
index 0000000..e65bed7
--- /dev/null
+++ b/test/klib/test-vnamelist.cpp
@@ -0,0 +1,364 @@
+// ===========================================================================
+//
+//                            PUBLIC DOMAIN NOTICE
+//               National Center for Biotechnology Information
+//
+//  This software/database is a "United States Government Work" under the
+//  terms of the United States Copyright Act.  It was written as part of
+//  the author's official duties as a United States Government employee and
+//  thus cannot be copyrighted.  This software/database is freely available
+//  to the public for use. The National Library of Medicine and the U.S.
+//  Government have not placed any restriction on its use or reproduction.
+//
+//  Although all reasonable efforts have been taken to ensure the accuracy
+//  and reliability of the software and data, the NLM and the U.S.
+//  Government do not and cannot warrant the performance or results that
+//  may be obtained by using this software or data. The NLM and the U.S.
+//  Government disclaim all warranties, express or implied, including
+//  warranties of performance, merchantability or fitness for any particular
+//  purpose.
+//
+//  Please cite the author in any work or product based on this material.
+//
+// ===========================================================================
+
+#include <vdb/manager.h> // VDBManager
+#include <vdb/vdb-priv.h>
+
+#include <ktst/unit_test.hpp> // TEST_CASE
+#include <klib/text.h> 
+#include <klib/out.h> 
+#include <klib/namelist.h> 
+
+#include <sysalloc.h>
+#include <cstdlib>
+#include <stdexcept>
+
+using namespace std;
+
+TEST_SUITE( T_VNamelist )
+
+
+TEST_CASE( VNamelist_1 )
+{
+    VNamelist * list;
+    rc_t rc = VNamelistMake ( &list, 10 );
+    if ( rc != 0 )
+        FAIL( "FAIL: VNamelistMake( 10 ) failed" );
+
+    rc = VNamelistRelease ( list );
+    if ( rc != 0 )
+        FAIL( "FAIL: VNamelistRelease() failed" );
+}
+
+struct on_part_ctx
+{
+    const char ** v;
+    int idx;
+};
+
+static rc_t CC on_part( const String * part, void * data )
+{
+    rc_t rc = 0;
+    struct on_part_ctx * ctx = ( struct on_part_ctx * ) data;
+    std::string p = std::string( part->addr, part->size );
+    std::string c = std::string( ctx->v[ ctx->idx ] );
+    if ( p != c ) rc = -1;
+    ctx->idx++;
+    return rc;
+}
+
+
+rc_t test_String( const char * to_test, const char ** v, int count )
+{
+    String s;
+    struct on_part_ctx ctx;
+    ctx.v = v;
+    ctx.idx = 0;
+    
+    StringInitCString( &s, to_test );
+    rc_t rc = foreach_String_part( &s, ':', on_part, &ctx );
+    if ( rc == 0 && ctx.idx != count ) rc = -1;
+    return rc;
+}
+
+
+rc_t test_pchar( const char * to_test, const char ** v, int count )
+{
+    struct on_part_ctx ctx;
+    ctx.v = v;
+    ctx.idx = 0;
+    
+    rc_t rc = foreach_Str_part( to_test, ':', on_part, &ctx );
+    if ( rc == 0 && ctx.idx != count ) rc = -1;
+    return rc;
+}
+
+static const char * s1 = "string:with:colons";
+static const char * t1[] = { "string", "with", "colons" };
+static const int n1 = 3;
+
+static const char * s2 = "just a string";
+static const char * t2[] = { "just a string" };
+static const int n2 = 1;
+
+static const char * s3 = "with::multiple::colons";
+static const char * t3[] = { "with", "", "multiple", "", "colons" };
+static const int n3 = 5;
+
+static const char * s4 = "::leading:colons";
+static const char * t4[] = { "", "", "leading", "colons" };
+static const int n4 = 4;
+
+static const char * s5 = "trailing:colons::";
+static const char * t5[] = { "trailing", "colons", "", "" };
+static const int n5 = 4;
+
+TEST_CASE( StringSplit )
+{
+    std::cout << "testing String-splitting by callback" << std::endl;
+    
+    rc_t rc = test_String( s1, t1, n1 );
+    if ( rc != 0 )
+        FAIL( "FAIL: foreach_String_part( #1 ) failed" );
+    rc = test_pchar( s1, t1, n1 );
+    if ( rc != 0 )
+        FAIL( "FAIL: foreach_Str_part( #1 ) failed" );
+
+    rc = test_String( s2, t2, n2 );
+    if ( rc != 0 )
+        FAIL( "FAIL: foreach_String_part( #2 ) failed" );
+    rc = test_pchar( s2, t2, n2 );
+    if ( rc != 0 )
+        FAIL( "FAIL: foreach_Str_part( #2 ) failed" );
+
+    rc = test_String( s3, t3, n3 );
+    if ( rc != 0 )
+        FAIL( "FAIL: foreach_String_part( #3) failed" );
+    rc = test_pchar( s3, t3, n3 );
+    if ( rc != 0 )
+        FAIL( "FAIL: foreach_Str_part( #3 ) failed" );
+
+    rc = test_String( s4, t4, n4 );
+    if ( rc != 0 )
+        FAIL( "FAIL: foreach_String_part( #4 ) failed" );
+    rc = test_pchar( s4, t4, n4 );
+    if ( rc != 0 )
+        FAIL( "FAIL: foreach_Str_part( #4 ) failed" );
+
+    rc = test_String( s5, t5, n5 );
+    if ( rc != 0 )
+        FAIL( "FAIL: foreach_String_part( #5 ) failed" );
+    rc = test_pchar( s5, t5, n5 );
+    if ( rc != 0 )
+        FAIL( "FAIL: foreach_Str_part( #5 ) failed" );
+}
+
+
+rc_t insert_String( VNamelist * list, const char * to_test )
+{
+    String s;
+    StringInitCString( &s, to_test );
+    return VNamelistSplitString ( list, &s, ':' );
+}
+
+
+rc_t insert_pchar( VNamelist * list, const char * to_test )
+{
+    return VNamelistSplitStr ( list, to_test, ':' );
+}
+
+
+rc_t check_list( const VNamelist * list, const char ** v, uint32_t count )
+{
+    rc_t rc = 0;
+    uint32_t idx;
+    for ( idx = 0; rc == 0 && idx < count; ++idx )
+    {
+        const char * item;
+        rc = VNameListGet ( list, idx, &item );
+        if ( rc == 0 )
+        {
+            std::string s_item = std::string( item );
+            std::string s_cmp  = std::string( v[ idx ] );
+            if ( s_item.compare( s_cmp ) != 0 )
+                rc = -1;
+        }
+        if ( rc == 0 )
+        {
+            uint32_t lc;
+            rc = VNameListCount ( list, &lc );
+            if ( rc == 0 && lc != count )
+                rc = -1;
+        }
+    }
+    return rc;
+}
+
+
+rc_t test_split_string( const char * to_test, const char ** v, uint32_t count )
+{
+    VNamelist * list;
+    rc_t rc = VNamelistMake ( &list, 10 );
+    if ( rc == 0 )
+    {
+        rc = insert_String( list, to_test );
+        if ( rc == 0 )
+            rc = check_list( list, v, count );
+        if ( rc == 0 )
+            rc = VNamelistRemoveAll( list );
+
+        if ( rc == 0 )
+            rc = insert_pchar( list, to_test );
+        if ( rc == 0 )
+            rc = check_list( list, v, count );
+
+        VNamelistRelease ( list );
+    }
+    return rc;
+}
+
+TEST_CASE( SplitIntoVNamelist )
+{
+    std::cout << "testing String-splitting into existing VNamelist " << std::endl;
+    
+    rc_t rc = test_split_string( s1, t1, n1 );
+    if ( rc != 0 )
+        FAIL( "FAIL: test_split_string( #1 )" );
+
+    rc = test_split_string( s2, t2, n2 );
+    if ( rc != 0 )
+        FAIL( "FAIL: test_split_string( #2 )" );
+
+    rc = test_split_string( s3, t3, n3 );
+    if ( rc != 0 )
+        FAIL( "FAIL: test_split_string( #3 )" );
+
+    rc = test_split_string( s4, t4, n4 );
+    if ( rc != 0 )
+        FAIL( "FAIL: test_split_string( #4 )" );
+
+    rc = test_split_string( s5, t5, n5 );
+    if ( rc != 0 )
+        FAIL( "FAIL: test_split_string( #5 )" );
+        
+}
+
+
+rc_t test_make_from_string( const char * to_test, const char ** v, uint32_t count )
+{
+    String s;
+    StringInitCString( &s, to_test );
+
+    VNamelist * list;
+    rc_t rc = VNamelistFromString( &list, &s, ':' );
+    if ( rc == 0 )
+    {
+        rc = check_list( list, v, count );
+        VNamelistRelease ( list );
+    }
+    
+    if ( rc == 0 )
+    {
+        rc = VNamelistFromStr( &list, to_test, ':' );
+        if ( rc == 0 )
+        {
+            rc = check_list( list, v, count );
+            VNamelistRelease ( list );
+        }
+    }
+    return rc;
+}
+
+
+TEST_CASE( MakeVNamelistFromString )
+{
+    std::cout << "testing String-splitting into new VNamelist " << std::endl;
+    
+    rc_t rc = test_make_from_string( s1, t1, n1 );
+    if ( rc != 0 )
+        FAIL( "FAIL: test_make_from_string( #1 )" );
+
+    rc = test_make_from_string( s2, t2, n2 );
+    if ( rc != 0 )
+        FAIL( "FAIL: test_make_from_string( #2 )" );
+
+    rc = test_make_from_string( s3, t3, n3 );
+    if ( rc != 0 )
+        FAIL( "FAIL: test_make_from_string( #3 )" );
+
+    rc = test_make_from_string( s4, t4, n4 );
+    if ( rc != 0 )
+        FAIL( "FAIL: test_make_from_string( #4 )" );
+
+    rc = test_make_from_string( s5, t5, n5 );
+    if ( rc != 0 )
+        FAIL( "FAIL: test_make_from_string( #5 )" );
+}
+
+rc_t split_join_and_check( const char * to_test )
+{
+    VNamelist * list;
+    rc_t rc = VNamelistFromStr( &list, to_test, ':' );
+    if ( rc == 0 )
+    {
+        const String * joined;
+        rc = VNamelistJoin( list, ':', &joined );
+        if ( rc != 0 )
+            FAIL( "FAIL: VNamelistJoin()" );
+        else
+        {
+            String S2;
+            StringInitCString( &S2, to_test );
+            if ( !StringEqual( joined, &S2 ) )
+                rc = -1;
+            StringWhack ( joined );
+        }
+        VNamelistRelease ( list );
+    }
+    return rc;
+}
+
+TEST_CASE( VNamelistJoining )
+{
+    std::cout << "testing joining VNamelist into one String" << std::endl;
+
+    rc_t rc = split_join_and_check( s1 );
+    if ( rc != 0 )
+        FAIL( "FAIL: split_join_and_check( #1 )" );
+
+    rc = split_join_and_check( s2 );
+    if ( rc != 0 )
+        FAIL( "FAIL: split_join_and_check( #2 )" );
+
+    rc = split_join_and_check( s3 );
+    if ( rc != 0 )
+        FAIL( "FAIL: split_join_and_check( #3 )" );
+
+    rc = split_join_and_check( s4 );
+    if ( rc != 0 )
+        FAIL( "FAIL: split_join_and_check( #4 )" );
+
+    rc = split_join_and_check( s5 );
+    if ( rc != 0 )
+        FAIL( "FAIL: split_join_and_check( #5 )" );
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void ) { return 0x1000000; }
+rc_t CC UsageSummary ( const char * progname ) { return 0; }
+rc_t CC Usage ( const Args * args ) { return 0; }
+const char UsageDefaultName[] = "test-VDB-3060";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t rc = T_VNamelist( argc, argv );
+    return rc;
+}
+
+}
diff --git a/test/kns/KNSManagerSingletonTest.cpp b/test/kns/KNSManagerSingletonTest.cpp
new file mode 100644
index 0000000..01dde09
--- /dev/null
+++ b/test/kns/KNSManagerSingletonTest.cpp
@@ -0,0 +1,69 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kns/manager.h> // KNSManagerRelease
+#include <ktst/unit_test.hpp> // TEST_SUITE
+#include <vfs/manager.h> // VFSManagerMake
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+TEST_SUITE(KNSManagerSingletonTestSuite);
+
+TEST_CASE(VDB_2877) {
+    rc_t rc = 0;
+
+    KNSManager *mgr = NULL;
+    KNSManager *mgr2 = NULL;
+
+    REQUIRE_EQ(mgr, mgr2); 
+
+    REQUIRE_RC(KNSManagerMake(&mgr)); 
+    REQUIRE(mgr); 
+    REQUIRE_NE(mgr, mgr2); 
+
+    VFSManager *vmgr = NULL;
+    REQUIRE_RC(VFSManagerMake(&vmgr));
+    REQUIRE(vmgr); 
+
+    REQUIRE_RC(VFSManagerGetKNSMgr(vmgr, &mgr2));
+    REQUIRE_EQ(mgr, mgr2); 
+
+    RELEASE(KNSManager, mgr2);
+
+    RELEASE(VFSManager, vmgr);
+
+    RELEASE(KNSManager, mgr);
+    REQUIRE_EQ(mgr, mgr2); 
+
+    REQUIRE(!rc);
+}
+
+extern "C" {
+    ver_t CC KAppVersion ( void ) { return 0; }
+    rc_t CC KMain ( int argc, char *argv [] )
+    {    return KNSManagerSingletonTestSuite(argc, argv); }
+}
diff --git a/test/kns/Makefile b/test/kns/Makefile
new file mode 100644
index 0000000..6c809f3
--- /dev/null
+++ b/test/kns/Makefile
@@ -0,0 +1,172 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+MODULE = test/kns
+
+TEST_TOOLS = \
+	KNSManagerSingletonTest \
+	test-kns \
+	test-proxy \
+	test-http \
+	test-http-dropconn \
+
+include $(TOP)/build/Makefile.env
+
+EXT_TOOLS = \
+	test-proxy-with-env
+
+ALL_TOOLS = \
+	$(INT_TOOLS) \
+	$(EXT_TOOLS)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/$@
+
+$(ALL_TOOLS): makedirs
+	@ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(BINDIR)/,$(EXT_TOOLS))
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+clean: stdclean
+
+INCDIRS += -I$(TOP)/libs/kns
+
+#-------------------------------------------------------------------------------
+# white-box test. TODO: combine with the old test/kns/http-test.c, roll into the C++ test-http
+#
+#
+#TEST_SRC = \
+#	wb-http-test
+#
+#TEST_OBJ = \
+#	$(addsuffix .$(OBJX),$(TEST_SRC))
+#
+#TEST_LIB = \
+#	-skapp-norsrc \
+#	-sncbi-vdb \
+#
+#$(TEST_BINDIR)/test-http: $(TEST_OBJ)
+#	$(LD) --exe -o $@ $^ $(TEST_LIB)
+
+KNSTEST_LIB = \
+	-skapp \
+    -sncbi-vdb \
+    -sktst \
+
+#----------------------------------------------------------------
+# KNSManagerSingletonTest
+#
+SINGLETON_SRC = \
+	KNSManagerSingletonTest
+SINGLETON_OBJ = \
+	$(addsuffix .$(OBJX),$(SINGLETON_SRC))
+$(TEST_BINDIR)/KNSManagerSingletonTest: $(SINGLETON_OBJ)
+	$(LP) --exe -o $@ $^ $(KNSTEST_LIB)
+
+#----------------------------------------------------------------
+# test-kns
+#
+KNSTEST_SRC = \
+	knstest
+
+KNSTEST_OBJ = \
+	$(addsuffix .$(OBJX),$(KNSTEST_SRC))
+
+$(TEST_BINDIR)/test-kns: $(KNSTEST_OBJ)
+	$(LP) --exe -o $@ $^ $(KNSTEST_LIB)
+
+kns: test-kns 
+	$(TEST_BINDIR)/test-kns  #-l=all
+
+#----------------------------------------------------------------
+# test-proxy
+#
+PROXYTEST_SRC = \
+	http-client \
+	test-proxy \
+
+PROXYTEST_OBJ = \
+	$(addsuffix .$(OBJX),$(PROXYTEST_SRC))
+
+$(TEST_BINDIR)/test-proxy: $(PROXYTEST_OBJ)
+	$(LP) --exe -o $@ $^ $(KNSTEST_LIB)
+    
+#----------------------------------------------------------------
+# test-http
+#
+HTTPTEST_SRC = \
+	httptest
+
+HTTPTEST_OBJ = \
+	$(addsuffix .$(OBJX),$(HTTPTEST_SRC))
+
+$(TEST_BINDIR)/test-http: $(HTTPTEST_OBJ)
+	$(LP) --exe -o $@ $^ $(KNSTEST_LIB)
+
+http: test-http  
+	$(TEST_BINDIR)/test-http  # -l=all
+    
+#----------------------------------------------------------------
+# test-http-dropconn
+#
+HTTP_DROPCONN_TEST_SRC = \
+	http_dropconnection_test
+
+HTTP_DROPCONN_TEST_OBJ = \
+	$(addsuffix .$(OBJX),$(HTTP_DROPCONN_TEST_SRC))
+
+$(TEST_BINDIR)/test-http-dropconn: $(HTTP_DROPCONN_TEST_OBJ)
+	$(LP) --exe -o $@ $^ $(KNSTEST_LIB)
+
+dropconn: test-http-dropconn  
+	$(TEST_BINDIR)/test-http-dropconn  # -l=all
+    
+#----------------------------------------------------------------
+# test-proxy-with-env
+# 
+TOOL_SRC = \
+	http-client \
+	test-proxy-with-env \
+
+TOOL_OBJ = \
+	$(addsuffix .$(OBJX),$(TOOL_SRC))
+
+$(BINDIR)/test-proxy-with-env: $(TOOL_OBJ)
+	$(LP) --exe -o $@ $^ -L$(VDB_LIBDIR) -L$(VDB_LIBDIR)/../ilib $(KNSTEST_LIB)
diff --git a/test/kns/TestProxy.hpp b/test/kns/TestProxy.hpp
new file mode 100644
index 0000000..f0394f8
--- /dev/null
+++ b/test/kns/TestProxy.hpp
@@ -0,0 +1,227 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfg/config.h> /* KConfigRelease */
+#include <kns/kns-mgr-priv.h> /* KNSManagerMakeConfig */
+#include <kns/manager.h> /* KNSManagerRelease */
+#include <ktst/unit_test_suite.hpp> // TestCase
+
+#include "test-proxy.h" // KNSManagerMakeKEndPointArgsIterator
+
+#define RELEASE( type, obj ) do { rc_t rc2 = type##Release ( obj ); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while ( false )
+
+struct C { // Configuration Helper
+    C ( const std::string & aPath, const std::string & aValue )
+        : path ( aPath )
+        , value ( aValue )
+        , next ( NULL)
+    {}
+
+    ~ C ( void )
+    {
+        delete next;
+        next = NULL;
+    }
+
+    void add ( const std::string & path, const std::string & value )
+    {
+        C * p = this;
+        while ( p -> next != NULL) {
+            p = p -> next;
+        }
+
+        p -> next = new C ( path, value );
+    }
+
+    bool contains ( const std::string & name, const std::string & aValue ) const
+    {
+        const C * c = this;
+        while ( c ) {
+            if ( name == c -> path && aValue == c -> value ) {
+                return true;
+            }
+            c = c -> next;
+        }
+
+        return false;
+    }
+
+    const std::string path;
+    const std::string value;
+
+    C * next;
+};
+
+struct E { // Expected Proxy Values
+    E ( const std::string & aPath, uint16_t aPort )
+        : path ( aPath )
+        , port ( aPort )
+        , next ( NULL )
+    {}
+
+    ~ E ( void )
+    {
+        delete next;
+        next = NULL;
+    }
+
+    void add ( const std::string & path, uint16_t port )
+    {
+        E * p = this;
+        while ( p -> next != NULL) {
+            p = p -> next;
+        }
+
+        p -> next = new E ( path, port );
+    }
+
+    const std::string path;
+    const uint16_t port;
+
+    E * next;
+};
+
+class CKConfig {
+    KConfig * _self;
+
+public:
+    CKConfig ( const C * c = NULL ) : _self (NULL) {
+        rc_t rc = KConfigMake ( & _self, NULL );
+        if ( rc != 0 ) {
+            throw rc;
+        }
+
+        while ( c ) {
+            rc_t rc = KConfigWriteString
+                ( _self, c -> path . c_str (), c -> value . c_str () );
+            if ( rc != 0 ) {
+                throw rc;
+            }
+
+            c = c -> next;
+        }
+    }
+
+    ~CKConfig ( void ) {
+        KConfigRelease ( _self );
+        _self = NULL;
+    }
+
+    KConfig * get ( void ) const {
+        return _self;
+    }
+};
+
+class TestProxy : private ncbi::NK::TestCase {
+    static bool _StringEqual ( const String * a, const String * b ) {
+        assert ( a && b );
+        return ( ( a ) -> len == ( b ) -> len &&
+            memcmp ( ( a ) -> addr, ( b ) -> addr, ( a ) -> len ) == 0 );
+    }
+    TestCase * _dad;
+    CKConfig _kfg;
+    void testProxies ( const KNSManager * mgr, const E * e ) {
+        const HttpProxy * p = KNSManagerGetHttpProxy ( mgr );
+        if ( p != NULL && e == NULL) {
+            REQUIRE ( ! p );
+        }
+        while ( e ) {
+            const String * http_proxy = NULL;
+            uint16_t http_proxy_port = 0;
+            HttpProxyGet ( p, & http_proxy, & http_proxy_port );
+            REQUIRE ( http_proxy );
+            std::string proxy ( http_proxy -> addr, http_proxy -> len );
+            REQUIRE_EQ ( e -> path, proxy );
+            REQUIRE_EQ ( e -> port, http_proxy_port );
+            e = e -> next;
+            p = HttpProxyGetNextHttpProxy ( p );
+            REQUIRE ( ( e && p ) || ( ! e && ! p ) ); 
+        }
+    }
+    void testEndPoints ( const KNSManager * mgr, const E * e, const C * c ) {
+        String aHost;
+        CONST_STRING ( & aHost, "a.host.domain" );
+        uint16_t aPort = 8976;
+        struct KEndPointArgsIterator * i
+            = KNSManagerMakeKEndPointArgsIterator ( mgr, & aHost, aPort );
+        REQUIRE ( i );
+        const String * hostname = NULL;
+        uint16_t port = ~ 0;
+        bool proxy_default_port = true;
+        bool proxy_ep = false;
+        while ( e ) {
+            REQUIRE ( KEndPointArgsIterator_Next ( i,
+                 & hostname, & port, & proxy_default_port, & proxy_ep ) );
+            REQUIRE ( proxy_ep );
+            String host;
+            StringInit ( & host,
+                e -> path. c_str (), e -> path. size (), e -> path. size () );
+            REQUIRE ( StringEqual ( hostname, & host ) );
+            if ( e -> port != 0 ) {
+                REQUIRE_EQ ( port, e -> port );
+                REQUIRE ( ! proxy_default_port );
+            } else {
+                REQUIRE_EQ ( static_cast < int> ( port), 3128 );
+                REQUIRE ( proxy_default_port );
+                REQUIRE ( KEndPointArgsIterator_Next ( i, & hostname,
+                             & port, & proxy_default_port, & proxy_ep ) );
+                REQUIRE ( proxy_ep );
+                REQUIRE ( StringEqual ( hostname, & host ) );
+                REQUIRE_EQ ( static_cast < int> ( port ), 8080 );
+                REQUIRE ( proxy_default_port );
+            }
+            e = e -> next;
+        }
+        if ( c == NULL || ! c -> contains ( "/http/proxy/only", "true" ) ) {
+            REQUIRE (     KEndPointArgsIterator_Next ( i, & hostname,
+                             & port, & proxy_default_port, & proxy_ep ) );
+            REQUIRE ( ! proxy_ep );
+            REQUIRE ( _StringEqual ( hostname, & aHost ) );
+            REQUIRE_EQ ( port, aPort );
+            REQUIRE ( ! proxy_default_port );
+        }
+        REQUIRE ( !   KEndPointArgsIterator_Next ( i,
+                 & hostname, & port, & proxy_default_port, & proxy_ep ) );
+    }
+public:
+    TestProxy
+            ( TestCase * dad, const C * c = NULL, const E * e = NULL )
+        : TestCase ( dad -> GetName () ), _dad ( dad ), _kfg ( c )
+    {
+        rc_t rc = 0;
+        KNSManager * mgr = NULL;
+        REQUIRE_RC ( KNSManagerMakeConfig ( & mgr, _kfg . get () ) );
+        testProxies   ( mgr, e );
+        testEndPoints ( mgr, e, c );
+        RELEASE ( KNSManager, mgr );
+        REQUIRE_RC ( rc );
+    }
+    ~ TestProxy ( void )
+    {   assert ( _dad ); _dad -> ErrorCounterAdd ( GetErrorCounter () ); }
+};
+
+////////////////////////////////////////////////////////////////////////////////
diff --git a/test/kns/http-client.c b/test/kns/http-client.c
new file mode 100644
index 0000000..d69b292
--- /dev/null
+++ b/test/kns/http-client.c
@@ -0,0 +1,17 @@
+#include "../../libs/kns/http-client.c"
+
+const struct KEndPointArgsIterator * KNSManagerMakeKEndPointArgsIterator
+    ( const KNSManager * self, const String * hostname, uint32_t port )
+{
+    static struct KEndPointArgsIterator i;
+    KEndPointArgsIteratorMake ( & i, self, hostname, port );
+    return & i;
+}
+
+bool KEndPointArgsIterator_Next ( KEndPointArgsIterator * self,
+        const String ** hostname, uint16_t * port,
+        bool * proxy_default_port, bool * proxy_ep )
+{
+    return KEndPointArgsIteratorNext
+        ( self, hostname, port, proxy_default_port, proxy_ep);
+}
diff --git a/test/kns/http-test.c b/test/kns/http-test.c
new file mode 100644
index 0000000..984f971
--- /dev/null
+++ b/test/kns/http-test.c
@@ -0,0 +1,368 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/args.h>
+#include <kapp/main.h>
+
+#include <kns/manager.h>
+#include <kns/endpoint.h>
+#include <kns/socket.h>
+#include <kns/stream.h>
+#include <kns/http.h>
+#include <kns/impl.h>
+#include <kns/adapt.h>
+#include <kfg/config.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <klib/text.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/refcount.h>
+#include <klib/container.h>
+
+#include "stream-priv.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <sysalloc.h>
+
+#include "http-priv.h"
+
+
+void URLBlockInitTest ( void )
+{
+    URLBlock b;
+    URLBlockInit ( & b );
+    
+    OUTMSG ( ( "%s - URLBlockInit succeeded.\n"
+               "scheme  : '%S'\n"
+               "host    : '%S'\n"
+               "path    : '%S'\n"
+               "query   : '%S'\n"
+               "fragment: '%S'\n"
+               "port    : '%u'\n\n"
+               , __func__,  & b . scheme, & b . host
+               , & b . path, & b . query, & b . fragment, b . port ) );
+    
+}
+
+
+rc_t ParseUrlTest ( void )
+{
+    rc_t rc;
+    size_t i;
+    
+    static const char *test_urls [] =
+        {
+            /* <scheme>://<host>[:<port>]/<path>[?<query>][#<fragment>]*/
+            /*0*/ "http://www.abc.com/library/index.html?x&y=123&z=test#ignore-me",
+            /*1*/ "http://www.abc.com:123/library/index.html?x&y=123&z=test#ignore-me",
+            /*2*/ "HTTP://www.abc.com:123/library/index.html?x&y=123&z=test#ignore-me",
+            /* <scheme>://<host>[:<port>]/<path>[#<fragment>]*/
+            /*3*/ "http://www.abc.com/library/index.html#ignore-me",
+            /*4*/ "http://www.abc.com:123/library/index.html#ignore-me",
+            /* <scheme>://<host>[:<port>]/<path>[?<query>]*/
+            /*5*/ "http://www.abc.com/library/index.html?x&y=123&z=test",
+            /*6*/ "http://www.abc.com:123/library/index.html?x&y=123&z=test",
+            /* <scheme>://<host>[:<port>]/<path>*/
+            /*7*/ "http://www.abc.com/library/index.html",
+            /*8*/ "http://www.abc.com:80/library/index.html",
+            /* <scheme>://<host>[:<port>]*/
+            /*9*/ "http://www.abc.com",
+            /*10*/ "http://www.abc.com:80",
+            /* /<path>[#fragment]*/
+            /*11*/ "/library/index.html#ignore-me",
+            /* /<path>[?query]*/
+            /*12*/ "/library/index.html?x&y=123&z=test",
+            /*13*/ "///library"
+            
+            
+        };
+    const size_t num_urls = sizeof test_urls / sizeof test_urls [ 0 ];
+    
+    static const char *fail_url [] = 
+        {
+            /*<scheme>:/<path>*/
+            /*0*/ "http:/library/index.html",
+            /*1*/ "http//library/index.html",
+            /*<scheme>:/[#fragment]*/
+            /*2*/ "http:#ignore-me",
+            /*<scheme>:/[#query]*/
+            /*3*/ "http:?x&y=123&z=test",
+            /*<scheme>*/
+            /*4*/ "http",
+            /*5*/ "ftp",
+            /* <host>[:<port>]*/
+            /*6*/ "www.abc.com",
+            /*7*/ "www.abc.com:80",
+            /* <scheme>://<host>[:<port>]*/
+            /*8*/ "ftp://www.abc.com"
+            
+            
+        };
+    const size_t num_fail_urls = sizeof fail_url / sizeof fail_url [ 0 ];
+    
+    for ( i = 0; i < num_urls; ++ i )
+    {
+        URLBlock b;
+        
+        String url;
+        StringInitCString ( & url, test_urls [ i ] );
+        
+        rc  = ParseUrl ( & b, url . addr, url . size );
+        if ( rc == 0 )
+        {
+            /* same as above */
+            OUTMSG ( ( "%s - ParseUrl succeeded -- %d: %s\n"
+                       "scheme  : '%S'\n"
+                       "host    : '%S'\n"
+                       "path    : '%S'\n"
+                       "query   : '%S'\n"
+                       "fragment: '%S'\n"
+                       "port    : '%u'\n\n"
+                       , __func__, i, test_urls [ i ], & b . scheme, & b . host
+                       , & b . path, & b . query, & b . fragment, b . port ) );
+        }
+        else
+        {
+            /* same as above. analyze your code more */
+            OUTMSG (( "%s: ParseUrl failed on iteration: '%d' url: %s\n"
+                      "with rc=%R\n\n", __func__, i, test_urls [ i ], rc ));
+            return rc;
+        }
+    }
+    
+    
+    for ( i = 0; i < num_fail_urls; ++ i )
+    {
+        URLBlock b;
+        
+        String url;
+        StringInitCString ( & url, fail_url [ i ] );
+        
+        rc  = ParseUrl ( & b, url . addr, url . size );
+        if ( rc != 0 )
+        {
+            /* same as above */
+            OUTMSG ( ( "%s - ParseUrl succeeded in catching error-- %d: %s\n"
+                       "scheme  : '%S'\n"
+                       "host    : '%S'\n"
+                       "path    : '%S'\n"
+                       "query   : '%S'\n"
+                       "fragment: '%S'\n"
+                       "port    : '%u'\n\n"
+                       , __func__, i, fail_url [ i ], & b . scheme, & b . host
+                       , & b . path, & b . query, & b . fragment, b . port ) );
+        }
+        else
+        {
+            /* same as above. analyze your code more */
+            OUTMSG (( "%s: ParseUrl failed catching error on iteration: '%d' url: %s\n"
+                      "with rc=%R\n\n", __func__, i, fail_url [ i ], rc ));
+            return rc;
+        }
+    }
+    
+    return rc = 0;
+}
+
+rc_t HttpTest ( const KFile *input )
+{
+
+    KNSManager *mgr;
+
+    rc_t rc = KNSManagerMake ( & mgr );
+    if ( rc == 0 )
+    {
+        KStream *sock;
+        rc = KStreamFromKFilePair ( & sock, input, NULL );
+        if ( rc == 0 )
+        {
+            struct KClientHttp *http;
+
+            String host;
+            CONST_STRING ( & host, "www.ncbi.nlm.nih.gov" );
+
+            rc = KNSManagerMakeHttp ( mgr, & http, sock, 0x01010000, & host, 80 );
+            if ( rc == 0 )
+            {
+                String msg;
+                ver_t version;
+                uint32_t status;
+
+                rc = KHttpGetStatusLine ( http, NULL, &msg, &status, &version );
+                if ( rc != 0 )
+                    OUTMSG (( "%s: KHttpGetStatusLine failed with rc=%R\n", __func__, rc ));
+                else
+                {
+                    bool blank, close_connection;
+                    BSTree hdrs;
+                    OUTMSG (( "%s: KHttpGetStatusLine returned msg='%S', status=%u, version=%V\n",
+                              __func__, & msg, status, version ));
+
+                    BSTreeInit ( & hdrs );
+
+                    for ( blank = close_connection = false; ! blank && rc == 0; )
+                        rc = KHttpGetHeaderLine ( http, NULL, & hdrs, & blank, & close_connection );
+                    
+                    if ( rc != 0 )
+                        OUTMSG (( "%s: KHttpGetHeaderLine failed with rc=%R\n", __func__, rc ));
+                    else
+                    {
+                        const KHttpHeader * hdr;
+                        
+                        OUTMSG (( "%s: KHttpGetStatusLine listing:\n", __func__ ));
+                        for ( hdr = ( const KHttpHeader * ) BSTreeFirst ( & hdrs ); 
+                              hdr != NULL;
+                              hdr = ( const KHttpHeader * ) BSTNodeNext ( & hdr -> dad ) )
+                        {
+                            OUTMSG (( "    name='%S', value='%S'\n", & hdr -> name, & hdr -> value ));
+                        }
+                    }
+
+                    BSTreeWhack ( & hdrs, KHttpHeaderWhack, NULL );
+
+                }
+
+                KHttpRelease ( http );
+            }
+
+            KStreamRelease ( sock );
+        }
+
+        KNSManagerRelease ( mgr );
+    }
+
+    return rc;
+}
+
+rc_t PreHttpTest ( void )
+{
+    KDirectory *dir;
+    rc_t rc = KDirectoryNativeDir ( &dir );
+    if ( rc == 0 )
+    {
+        const KFile *f;
+        rc = KDirectoryOpenFileRead ( dir, &f, "nih_1_out.txt" );
+        if ( rc == 0 )
+        {
+            rc = HttpTest ( f );
+            KFileRelease ( f );
+        }
+
+        KDirectoryRelease ( dir );
+    }
+    return rc;
+}
+
+/* Version  EXTERN
+ *  return 4-part version code: 0xMMmmrrrr, where
+ *      MM = major release
+ *      mm = minor release 
+ *    rrrr = bug-fix release
+ */
+ver_t CC KAppVersion ( void )
+{
+    return 0;
+}
+
+
+/* Usage
+ *  This function is called when the command line argument
+ *  handling sees -? -h or --help
+ */
+rc_t CC UsageSummary ( const char *progname )
+{
+    /*    return KOutMsg (
+        "\n"
+        "Usage:\n"
+        "  %s [Options]\n"
+        "\n"
+        "Summary:\n"
+        "  Simple test of printf.\n"
+        , progname );
+    */
+    return 0;
+}
+
+const char UsageDefaultName[] = "time-test";
+
+rc_t CC Usage ( const Args *args )
+{
+    /*
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if (args == NULL)
+        rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+    else
+        rc = ArgsProgram (args, &fullpath, &progname);
+
+    UsageSummary (progname);
+
+    KOutMsg ("Options:\n");
+
+    HelpOptionsStandard();
+
+    HelpVersion (fullpath, KAppVersion());
+
+    return rc;
+    */
+    return 0;
+}
+
+    
+static
+rc_t run ( const char *progname )
+{
+    rc_t rc = 0;
+
+    URLBlockInitTest ();
+    rc = ParseUrlTest ();
+    rc = PreHttpTest ();      
+
+    return rc;
+}
+
+/* KMain
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args *args;
+    rc_t rc = ArgsMakeAndHandle ( & args, argc, argv, 0 );
+    if ( rc == 0 )
+    {
+        KConfigDisableUserSettings();
+        rc = run ( argv [ 0 ] );
+        ArgsWhack ( args );
+    }
+
+    return rc;
+}
+
diff --git a/test/kns/http_dropconnection_test.cpp b/test/kns/http_dropconnection_test.cpp
new file mode 100644
index 0000000..6b7472f
--- /dev/null
+++ b/test/kns/http_dropconnection_test.cpp
@@ -0,0 +1,437 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for HTTP interfaces
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/debug.h>
+#include <klib/rc.h>
+
+#include <kns/manager.h>
+#include <kns/http.h>
+
+#include <../libs/kns/stream-priv.h>
+#include <../libs/kns/http-priv.h>
+
+#include <kfs/file.h>
+
+#include <sysalloc.h>
+#include <stdexcept>
+#include <cstring>
+#include <list>
+
+TEST_SUITE(HttpTestSuite);
+
+using namespace std;
+using namespace ncbi::NK;
+
+class TestStream;
+#define KSTREAM_IMPL TestStream
+#include <kns/impl.h>
+
+#if _DEBUGGING
+#   define DBG_KNS_ON()  \
+        KDbgSetModConds ( DBG_KNS, DBG_FLAG ( DBG_KNS_HTTP ), DBG_FLAG ( DBG_KNS_HTTP ) );          
+#   define DBG_KNS_OFF() \
+        KDbgSetModConds ( DBG_KNS, DBG_FLAG ( DBG_KNS_HTTP ), ~ DBG_FLAG ( DBG_KNS_HTTP ) );          
+#else
+#   define DBG_KNS_ON()
+#   define DBG_KNS_OFF() 
+#endif
+
+static const string Response_HEAD_OK = "HTTP/1.1 200 OK\nAccept-Ranges: bytes\nContent-Length: 7\n";
+static const string Response_GET_Content = "HTTP/1.1 206 Partial Content\n"
+                                            "Accept-Ranges: bytes\n"
+                                            "Transfer-Encoding: chunked\n"
+                                            "Content-Range: bytes 0-6/7\n" 
+                                            "\n"
+                                            "7\n"
+                                            "content\n";
+                                    
+static rc_t RC_TransferIncomplete = SILENT_RC ( rcNS, rcFile, rcWriting, rcTransfer, rcIncomplete );
+static rc_t RC_Timeout = SILENT_RC ( rcNS, rcStream, rcReading, rcTimeout, rcExhausted );
+
+class TestStream
+{
+public:
+    static KStream_vt_v1 vt;
+
+    static rc_t CC Whack ( KSTREAM_IMPL *self ) 
+    { 
+        if ( TestEnv::verbosity == LogLevel::e_message )
+            cout << "TestStream::Whack() called" << endl;
+        return 0; 
+    }
+    static rc_t CC Read ( const KSTREAM_IMPL *self, void *buffer, size_t bsize, size_t *num_read )
+    { 
+        throw logic_error ( "TestStream::<non-timed>Read called" );
+    }
+    static rc_t CC Write ( KSTREAM_IMPL *self, const void *buffer, size_t size, size_t *num_writ )
+    { 
+        throw logic_error ( "TestStream::<non-timed>Write called" );
+    }
+    static rc_t CC TimedRead ( const KSTREAM_IMPL *self, void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm )
+    { 
+        if ( TestEnv::verbosity == LogLevel::e_message )
+            cout << "TestStream::TimedRead() called" << endl;
+            
+        string response;
+        if ( m_readResponses.size()> 0)
+        {
+            response = m_readResponses.front();
+            m_readResponses.pop_front();
+        }
+        else
+        {
+            throw logic_error ( "TestStream::TimedRead: out of responses" );
+        }
+        
+        if ( response == "DROP" )
+        {
+            num_read = 0;
+            return 0;
+        }
+        if ( response == "TIMEOUT" )
+        {
+            return RC_Timeout;
+        }
+        
+        if ( response.size() >= bsize )
+        {
+            memmove(buffer, response.c_str(), bsize);
+            * num_read = bsize; 
+            response = response.substr(bsize);
+        }
+        else
+        {
+            memmove(buffer, response.c_str(), response.size());
+            * num_read = response.size() + 1;  // include 0-terminator
+            ( ( char * ) buffer ) [ * num_read - 1 ] = 0;
+            response.clear();
+        }
+        if ( TestEnv::verbosity == LogLevel::e_message )
+            cout << "TestStream::TimedRead returned \"" << string((const char*)buffer, * num_read) << "\"" << endl;
+        
+        return 0; 
+    }
+    static rc_t CC TimedWrite ( KSTREAM_IMPL *self, const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm )
+    { 
+        if ( TestEnv::verbosity == LogLevel::e_message )
+            cout << "TestStream::TimedWrite(\"" << string((const char*)buffer, size) << "\") called" << endl;
+            
+        rc_t response;
+        if ( m_writeResponses.size()> 0)
+        {
+            response = m_writeResponses.front();
+            m_writeResponses.pop_front();
+        }
+        else
+        {
+            throw logic_error ( "TestStream::TimedWrite: out of responses" );
+        }
+        
+        if ( response == 0 )
+        {
+            * num_writ = size; 
+            return 0; 
+        }
+        else
+        {
+            * num_writ = 0; 
+            return response; 
+        }
+    }
+
+    static void AddReadResponse ( const string& p_str )
+    {
+        m_readResponses.push_back(p_str);
+    }
+    
+    static void AddWriteRC ( rc_t p_rc )
+    {
+        m_writeResponses.push_back(p_rc);
+    }
+    
+    static list<string> m_readResponses;
+    static list<rc_t> m_writeResponses;
+};
+
+KStream_vt_v1 TestStream::vt =
+{
+    1, 1,
+    TestStream::Whack,
+    TestStream::Read,
+    TestStream::Write,
+    TestStream::TimedRead,
+    TestStream::TimedWrite
+};
+
+list<string> TestStream::m_readResponses;
+list<rc_t> TestStream::m_writeResponses;
+
+class HttpFixture
+{
+public:
+    HttpFixture()
+    : m_mgr(0), m_file(0), m_numRead(0)
+    {
+        if ( KNSManagerMake ( & m_mgr ) != 0 )
+            throw logic_error ( "HttpFixture: KNSManagerMake failed" );
+                
+        if ( KStreamInit ( & m_stream, ( const KStream_vt* ) & TestStream::vt, "TestStream", "", true, true ) != 0 )
+            throw logic_error ( "HttpFixture: KStreamInit failed" );
+            
+        TestStream::m_readResponses.clear();
+        
+        m_reconnected = false;
+        
+#if _DEBUGGING
+    SetClientHttpReopenCallback( Reconnect ); // NB. this hook is only available in DEBUG mode
+#endif        
+    }
+    
+    ~HttpFixture()
+    {
+        if ( m_file && KFileRelease ( m_file ) != 0 )
+            throw logic_error ( "HttpFixture::~HttpFixture KFileRelease failed" );
+            
+        //if ( ! TestStream::m_readResponses.empty() )
+        //    throw logic_error ( "HttpFixture::~HttpFixture not all TestStream::m_readResponses have been consumed" );
+
+        DBG_KNS_OFF();
+        KNSManagerSetVerbose ( m_mgr, false );
+        if ( m_mgr && KNSManagerRelease ( m_mgr ) != 0 )
+            throw logic_error ( "HttpFixture::~HttpFixture KNSManagerRelease failed" );
+    }
+    
+    static string MakeURL(const char* base)
+    {
+        return string("http://") + base + ".com/";
+    }    
+    static struct KStream * Reconnect ()
+    {   
+        m_reconnected = true;
+        return & m_stream; 
+    }
+    
+    void TraceOn()
+    {
+        KNSManagerSetVerbose ( m_mgr, true );
+        DBG_KNS_ON();
+    }
+    
+    void SendReceiveHEAD(const char* p_url)
+    {
+        TestStream::AddWriteRC(0); // send HEAD succeeds
+        TestStream::AddReadResponse ( Response_HEAD_OK ); 
+        if ( KNSManagerMakeHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL ( p_url ) . c_str () ) != 0 )
+            throw logic_error ( "HttpFixture::SendReceiveHEAD KNSManagerMakeHttpFile failed" );
+    }
+    
+    
+    static KStream m_stream;
+    static bool m_reconnected;
+    
+    KNSManager* m_mgr;
+    KFile* m_file;
+    char m_buf[1024];
+    size_t m_numRead;
+};
+
+KStream HttpFixture::m_stream;
+bool HttpFixture::m_reconnected = false;
+
+//////////////////////////
+
+// the tests involving reconnection require Reconnect hook, thus cannot be run in Release build
+#define CAN_USE_RECONNECT_HOOK _DEBUGGING
+
+FIXTURE_TEST_CASE(Http_Normal, HttpFixture)
+{
+    TestStream::AddWriteRC ( 0 ); // send HEAD succeeds
+    TestStream::AddReadResponse ( Response_HEAD_OK ); 
+    REQUIRE_RC ( KNSManagerMakeHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str() ) ); 
+    
+    TestStream::AddWriteRC ( 0 ); // send GET succeeds
+    TestStream::AddReadResponse( Response_GET_Content ); 
+    
+    REQUIRE_RC( KFileTimedRead ( m_file, 0, m_buf, sizeof m_buf, &m_numRead, NULL ) );
+    REQUIRE_EQ( string("content"), string(m_buf, m_numRead) );
+}
+
+// problems with HEAD
+
+FIXTURE_TEST_CASE(HEAD_BadResponse, HttpFixture)
+{
+    TestStream::AddWriteRC(0); // send HEAD succeeds
+    TestStream::AddReadResponse("garbage"); // bad response to HEAD
+    REQUIRE_RC_FAIL ( KNSManagerMakeHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str() ) ); 
+}
+
+FIXTURE_TEST_CASE(HEAD_BrokenConnection, HttpFixture)
+{
+    TestStream::AddWriteRC(0); // send HEAD succeeds
+    TestStream::AddReadResponse(""); // simulates reaction to POLLHUP/POLLRDHUP
+    REQUIRE_RC_FAIL ( KNSManagerMakeHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str() ) ); 
+}
+
+#if CAN_USE_RECONNECT_HOOK
+FIXTURE_TEST_CASE(HEAD_Invalid_Reconnect_Succeed, HttpFixture)
+{
+    TestStream::AddWriteRC ( RC_TransferIncomplete ); // first send HEAD fails
+    TestStream::AddWriteRC ( 0 ); // retry send HEAD succeeds
+    TestStream::AddReadResponse ( Response_HEAD_OK ); 
+    REQUIRE_RC ( KNSManagerMakeHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str() ) ); 
+    REQUIRE ( m_reconnected );
+    
+    // make sure GET works after reconnection
+    TestStream::AddWriteRC ( 0 ); // send GET succeeds
+    TestStream::AddReadResponse( Response_GET_Content ); 
+    
+    REQUIRE_RC( KFileTimedRead ( m_file, 0, m_buf, sizeof m_buf, &m_numRead, NULL ) );
+    REQUIRE_EQ( string("content"), string(m_buf, m_numRead) );
+}
+#endif
+
+#if CAN_USE_RECONNECT_HOOK
+FIXTURE_TEST_CASE(HEAD_Invalid_Reconnect_Fail, HttpFixture)
+{
+    TestStream::AddWriteRC( RC_TransferIncomplete ); // first send HEAD fails
+    TestStream::AddWriteRC( RC_TransferIncomplete ); // retry send HEAD fails
+    REQUIRE_RC_FAIL ( KNSManagerMakeHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str() ) ); 
+    REQUIRE ( m_reconnected );
+}
+#endif
+
+// problems with GET
+
+#if CAN_USE_RECONNECT_HOOK
+FIXTURE_TEST_CASE(GET_Invalid_Reconnect_Succeed, HttpFixture)
+{
+    SendReceiveHEAD(GetName());
+    
+    TestStream::AddWriteRC(0); // send GET succeeds
+    TestStream::AddReadResponse( // broken response to GET
+        "HTTP/1.1 206 Partial Content\n"
+        "Transfer-Encoding: chunked\n"
+        "Content-Range: bytes 0-6/7\n" 
+        "\n");
+    TestStream::AddWriteRC(0); // retry GET succeeds
+    TestStream::AddReadResponse( Response_GET_Content ); 
+    
+    REQUIRE_RC( KFileTimedRead ( m_file, 0, m_buf, sizeof m_buf, &m_numRead, NULL ) );
+    REQUIRE_EQ( string("content"), string(m_buf, m_numRead) );
+    
+    REQUIRE ( m_reconnected );
+}
+#endif
+
+#if CAN_USE_RECONNECT_HOOK
+FIXTURE_TEST_CASE(GET_Failed_Reconnect_Succeed, HttpFixture)
+{
+    SendReceiveHEAD(GetName());
+    
+    TestStream::AddWriteRC( RC_TransferIncomplete ); // send GET fails
+    TestStream::AddWriteRC(0); // retry send GET succeeds
+    TestStream::AddReadResponse( Response_GET_Content ); 
+    
+    REQUIRE_RC( KFileTimedRead ( m_file, 0, m_buf, sizeof m_buf, &m_numRead, NULL ) );
+    REQUIRE_EQ( string("content"), string(m_buf, m_numRead) );
+    
+    REQUIRE ( m_reconnected );
+}
+#endif
+
+#if CAN_USE_RECONNECT_HOOK
+FIXTURE_TEST_CASE(GET_Timedout_Reconnect_Succeed, HttpFixture)
+{
+    SendReceiveHEAD(GetName());
+    
+    TestStream::AddWriteRC(0); // send GET succeeds
+    TestStream::AddReadResponse( "TIMEOUT" ); // response to GET times out
+    TestStream::AddWriteRC(0); // retry GET succeeds
+    TestStream::AddReadResponse( Response_GET_Content ); 
+    REQUIRE_RC ( KFileTimedRead ( m_file, 0, m_buf, sizeof m_buf, &m_numRead, NULL ) );
+    REQUIRE_EQ( string("content"), string(m_buf, m_numRead) );
+    
+    REQUIRE ( m_reconnected );
+}
+#endif
+
+#if CAN_USE_RECONNECT_HOOK
+FIXTURE_TEST_CASE(GET_Read_Failed_Reconnect_Failed, HttpFixture)
+{
+    SendReceiveHEAD(GetName());
+    
+    TestStream::AddWriteRC(0); // send GET succeeds
+    TestStream::AddReadResponse( "TIMEOUT" ); // response to GET times out
+    TestStream::AddWriteRC(0); // reconnect GET succeeds
+    TestStream::AddReadResponse( "TIMEOUT" ); // response to GET times out
+    REQUIRE_RC_FAIL ( KFileTimedRead ( m_file, 0, m_buf, sizeof m_buf, &m_numRead, NULL ) );
+    
+    REQUIRE ( m_reconnected );
+}
+#endif
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+#include <klib/debug.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+const char UsageDefaultName[] = "test-http-dropconn";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+
+	// this makes messages from the test code appear
+	// (same as running the executable with "-l=message")
+	// TestEnv::verbosity = LogLevel::e_message;
+	
+    rc_t rc=HttpTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kns/httptest.cpp b/test/kns/httptest.cpp
new file mode 100644
index 0000000..de374e2
--- /dev/null
+++ b/test/kns/httptest.cpp
@@ -0,0 +1,875 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for HTTP interfaces
+*/
+
+#include <kapp/args.h> // Args
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/debug.h> /* KDbgSetString */
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <kfg/config.h>
+
+#include <kns/manager.h>
+#include <kns/kns-mgr-priv.h>
+#include <kns/http.h>
+
+#include <../libs/kns/mgr-priv.h>
+#include <../libs/kns/http-priv.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/defs.h>
+
+#include <kproc/thread.h>
+
+#include <sysalloc.h>
+#include <stdexcept>
+#include <cstring>
+#include <list>
+#include <sstream>
+
+static rc_t argsHandler ( int argc, char * argv [] );
+TEST_SUITE_WITH_ARGS_HANDLER ( HttpTestSuite, argsHandler );
+
+using namespace std;
+using namespace ncbi::NK;
+
+class TestStream;
+#define KSTREAM_IMPL TestStream
+#include <kns/impl.h>
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+#define ALL
+
+class TestStream
+{
+public:
+    static KStream_vt_v1 vt;
+
+    static rc_t CC Whack ( KSTREAM_IMPL *self ) 
+    { 
+        if ( TestEnv::verbosity == LogLevel::e_message )
+            cout << "TestStream::Whack() called" << endl;
+        return 0; 
+    }
+    static rc_t CC Read ( const KSTREAM_IMPL *self, void *buffer, size_t bsize, size_t *num_read )
+    { 
+        if ( TestEnv::verbosity == LogLevel::e_message )
+            cout << "TestStream::Read() called" << endl;
+        * num_read = 0; 
+        return 0; 
+    }
+    static rc_t CC Write ( KSTREAM_IMPL *self, const void *buffer, size_t size, size_t *num_writ )
+    { 
+        if ( TestEnv::verbosity == LogLevel::e_message )
+            cout << "TestStream::Write() called" << endl;
+        * num_writ = size; 
+        return 0; 
+    }
+    static rc_t CC TimedRead ( const KSTREAM_IMPL *self, void *buffer, size_t bsize, size_t *num_read, struct timeout_t *tm )
+    { 
+        if ( TestEnv::verbosity == LogLevel::e_message )
+            cout << "TestStream::TimedRead() called" << endl;
+            
+        string response;
+        if ( m_responses.size()> 0)
+        {
+            response = m_responses.front();
+            m_responses.pop_front();
+        }
+        
+        if ( response.size() >= bsize )
+        {
+            memmove(buffer, response.c_str(), bsize);
+            * num_read = bsize; 
+            response = response.substr(bsize);
+        }
+        else
+        {
+            memmove(buffer, response.c_str(), response.size());
+            * num_read = response.size();
+            response.clear();
+        }
+        if ( TestEnv::verbosity == LogLevel::e_message )
+            cout << "TestStream::TimedRead returned \"" << string((const char*)buffer, * num_read) << "\"" << endl;
+        
+        return 0; 
+    }
+    static rc_t CC TimedWrite ( KSTREAM_IMPL *self, const void *buffer, size_t size, size_t *num_writ, struct timeout_t *tm )
+    { 
+        if ( TestEnv::verbosity == LogLevel::e_message )
+            cout << "TestStream::TimedWrite(\"" << string((const char*)buffer, size) << "\") called" << endl;
+        * num_writ = size; 
+        return 0; 
+    }
+
+    static void AddResponse ( const string& p_str, bool end_binary = false )
+    {
+        if (end_binary)
+            m_responses.push_back(p_str);
+        else
+            m_responses.push_back(std::string(p_str.c_str(), p_str.size() + 1));
+    }
+    
+    static list<string> m_responses;
+};
+
+KStream_vt_v1 TestStream::vt =
+{
+    1, 1,
+    TestStream::Whack,
+    TestStream::Read,
+    TestStream::Write,
+    TestStream::TimedRead,
+    TestStream::TimedWrite
+};
+
+list<string> TestStream::m_responses;
+
+class HttpFixture
+{
+public:
+    HttpFixture()
+    : m_mgr(0), m_file(0)
+    {
+        if ( KNSManagerMake ( & m_mgr ) != 0 )
+            throw logic_error ( "HttpFixture: KNSManagerMake failed" );
+                
+        if ( KStreamInit ( & m_stream, ( const KStream_vt* ) & TestStream::vt, "TestStream", "", true, true ) != 0 )
+            throw logic_error ( "HttpFixture: KStreamInit failed" );
+            
+        TestStream::m_responses.clear();
+    }
+    
+    ~HttpFixture()
+    {
+        if ( m_mgr && KNSManagerRelease ( m_mgr ) != 0 )
+            throw logic_error ( "HttpFixture::~HttpFixture KNSManagerRelease failed" );
+            
+        if ( m_file && KFileRelease ( m_file ) != 0 )
+            throw logic_error ( "HttpFixture::~HttpFixture KFileRelease failed" );
+            
+        if ( ! TestStream::m_responses.empty() )
+            throw logic_error ( "HttpFixture::~HttpFixture not all TestStream::m_responses have been consumed" );
+    }
+    
+    KConfig* MakeConfig( const char* name, const char* contents )
+    {
+        KDirectory* wd;
+        if ( KDirectoryNativeDir ( & wd ) != 0 )
+            throw logic_error("KfgFixture: KDirectoryNativeDir failed");
+            
+        {
+            KFile* file;    
+            if (KDirectoryCreateFile(wd, &file, true, 0664, kcmInit, name) != 0)
+                throw logic_error("MakeConfig: KDirectoryCreateFile failed");
+
+            size_t num_writ=0;
+            if (KFileWrite(file, 0, contents, strlen(contents), &num_writ) != 0)
+                throw logic_error("MakeConfig: KFileWrite failed");
+
+            if (KFileRelease(file) != 0)
+                throw logic_error("MakeConfig: KFileRelease failed");    
+        }
+        
+        KConfig* ret;
+        {
+            if (KConfigMake ( & ret, wd ) != 0) 
+                throw logic_error("MakeConfig: KConfigMake failed");        
+                
+            KFile* file;    
+            if (KDirectoryOpenFileRead(wd, (const KFile**)&file, name) != 0)
+                throw logic_error("MakeConfig: KDirectoryOpenFileRead failed");
+            
+            if (KConfigLoadFile ( ret, name, file) != 0)
+                throw logic_error("MakeConfig: KConfigLoadFile failed");
+
+            if (KFileRelease(file) != 0)
+                throw logic_error("MakeConfig: KFileRelease failed");
+        }
+        
+        if (KDirectoryRemove(wd, true, name) != 0)
+            throw logic_error("MakeConfig: KDirectoryRemove failed");
+        if (KDirectoryRelease(wd) != 0)
+            throw logic_error("MakeConfig: KDirectoryRelease failed");
+        
+        return ret;
+    }
+    
+    static struct KStream * Reconnect ()
+    {   
+        return & m_stream; 
+    }
+    
+    static string MakeURL(const char* base)
+    {
+        return string("http://") + base + ".com/";
+    }    
+    
+    KNSManager* m_mgr;
+    static KStream m_stream;
+    KFile* m_file;
+};
+
+KStream HttpFixture::m_stream;
+
+#ifdef ALL
+//////////////////////////
+// Regular HTTP 
+FIXTURE_TEST_CASE(Http_Make, HttpFixture)
+{
+    TestStream::AddResponse("HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nContent-Length: 7\r\n");
+    REQUIRE_RC ( KNSManagerMakeHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str() ) );
+    REQUIRE_NOT_NULL ( m_file ) ;
+}
+
+#if 1
+/*FIXME: 100 used to be retried regardless of whether URL is reliable, now it is not, so the test fails */
+FIXTURE_TEST_CASE(Http_Make_Continue_100_Retry, HttpFixture)
+{
+    TestStream::AddResponse("HTTP/1.1 100 continue\r\n");
+    TestStream::AddResponse("HTTP/1.1 100 continue\r\n");
+    TestStream::AddResponse("HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nContent-Length: 7\r\n");
+    REQUIRE_RC ( KNSManagerMakeHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str() ) );
+    REQUIRE_NOT_NULL ( m_file ) ;
+}
+#endif
+
+FIXTURE_TEST_CASE(Http_Make_500_Fail, HttpFixture)
+{   // a regular Http client does not retry
+    TestStream::AddResponse("HTTP/1.1 500 Internal Server Error\r\nContent-Length: 0\r\n");
+    REQUIRE_RC_FAIL ( KNSManagerMakeHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str() ) );
+}
+
+FIXTURE_TEST_CASE(Http_Read, HttpFixture)
+{
+    TestStream::AddResponse("HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nContent-Length: 7\r\n"); // response to HEAD
+    REQUIRE_RC ( KNSManagerMakeHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str() ) );
+    char buf[1024];
+    size_t num_read;
+    TestStream::AddResponse(    // response to GET
+        "HTTP/1.1 206 Partial Content\r\n"
+        "Accept-Ranges: bytes\r\n"
+        "Transfer-Encoding: chunked\r\n"
+        /*"Content-Length: 7\r\n" */ /* bug fix in KClientHttpResultHandleContentRange: used to break if Content-Length was not there */
+        "Content-Range: bytes 0-6/7\r\n"
+        "\r\n"
+        "7\r\n"
+        "content",
+        true
+    );
+    REQUIRE_RC( KFileTimedRead ( m_file, 0, buf, sizeof buf, &num_read, NULL ) );
+    REQUIRE_EQ( string ( "content" ), string ( buf, num_read ) );
+}
+
+struct ReadThreadData
+{
+    int tid;
+    int num_threads;
+    int num_requests;
+    int content_length;
+    const KFile * kHttpFile;
+    const char ** contents;
+};
+
+static rc_t CC read_thread_func( const KThread *self, void *data )
+{
+    rc_t rc;
+    ReadThreadData * td = ( ReadThreadData * ) data;
+    char buf[1024];
+    size_t num_read;
+    assert ( td->content_length <= (int)sizeof buf );
+
+    for ( int i = 0; i < td->num_requests; ++i )
+    {
+        rc = KFileTimedRead ( td->kHttpFile, 0, buf, td->content_length, &num_read, NULL );
+        if ( rc != 0 || num_read == 0 )
+        {
+            LOG(LogLevel::e_fatal_error, "read_thread_func: KFileTimedRead failed on kHttpFile\n");
+            if ( rc == 0 )
+                rc = RC( rcNS, rcFile, rcValidating, rcData, rcEmpty );
+            return rc;
+        }
+
+        std::string read_content = std::string ( buf, num_read );
+        int content_type = read_content[0] - '0';
+        if (content_type < 0 || content_type >= td->num_threads || td->contents[content_type] != read_content)
+        {
+            LOG(LogLevel::e_fatal_error, "read_thread_func: received data is corrupt and/or does not match test data\n");
+            rc = RC( rcNS, rcFile, rcValidating, rcData, rcCorrupt );
+            return rc;
+        }
+    }
+
+    return rc;
+}
+
+FIXTURE_TEST_CASE(Http_Read_Multi_User, HttpFixture)
+{
+    const int num_threads = 8;
+    const int content_length = 256; // has to be at least 256 b, otherwise httpclient will use internal buffer and load 256 b or the whole file from http server instead of partial content
+    const int content_length_total = content_length * num_threads;
+
+    const int num_requests = 1024;
+    const int num_responses_total = num_threads * num_requests;
+
+    const char * contents[] = {
+        "0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+        "1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+        "2ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
+        "3ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
+        "4eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+        "5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+        "6ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg",
+        "7hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"
+    };
+
+    assert( sizeof contents / sizeof *contents == num_threads );
+
+    std::stringstream ss;
+    ss << "HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nContent-Length: " << (content_length_total) << "\r\n";
+    TestStream::AddResponse(ss.str()); // response to HEAD
+    REQUIRE_RC ( KNSManagerMakeHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str() ) );
+
+    for ( int i = 0; i < num_responses_total; ++i )
+    {
+        int content_type = i % num_threads;
+        int range_start = 0;
+        int range_end = content_length - 1;
+        ss.str(std::string());
+        ss << "HTTP/1.1 206 Partial Content\r\n"
+                "Accept-Ranges: bytes\r\n"
+                "Transfer-Encoding: chunked\r\n"
+                "Content-Range: bytes " << range_start << "-" << range_end << "/" << content_length_total << "\r\n"
+                "\r\n"
+                "" << content_length << "\r\n"
+                "" << contents[content_type];
+
+        TestStream::AddResponse(ss.str(), true);    // response to GET
+    }
+
+    KThread *t [ num_threads ];
+    ReadThreadData td [ num_threads ];
+    rc_t thread_rcs [ num_threads ];
+    rc_t rc = 0;
+    for ( int i = 0; i < num_threads; ++i )
+    {
+        td[ i ].tid = i + 1;
+        td[ i ].num_threads = num_threads;
+        td[ i ].num_requests = num_requests;
+        td[ i ].content_length = content_length;
+        td[ i ].kHttpFile = m_file;
+        td[ i ].contents = (const char**)contents;
+        rc = KThreadMake ( &( t[ i ] ), read_thread_func, &( td[ i ] ) );
+        REQUIRE_RC( rc );
+    }
+
+    for ( int i = 0; i < num_threads; ++i )
+    {
+        rc_t rc2 = KThreadWait ( t[ i ], &thread_rcs[i] );
+        if (rc2 != 0)
+        {
+            LOG(LogLevel::e_fatal_error, "KThreadWait failed\n");
+            if (rc == 0)
+                rc = rc2;
+        }
+        rc2 = KThreadRelease ( t[ i ] );
+        if (rc2 != 0)
+        {
+            LOG(LogLevel::e_fatal_error, "KThreadRelease failed\n");
+            if (rc == 0)
+                rc = rc2;
+        }
+    }
+    REQUIRE_RC( rc );
+    for (int i = 0; i < num_threads; ++i)
+    {
+        REQUIRE_RC( thread_rcs[i] );
+    }
+
+
+}
+
+FIXTURE_TEST_CASE(HttpRequest_POST_NoParams, HttpFixture)
+{   // Bug: KClientHttpRequestPOST crashed if request had no parameters
+    KClientHttpRequest *req;
+    KNSManagerMakeClientRequest ( m_mgr, &req, 0x01010000, & m_stream, MakeURL(GetName()).c_str()  );
+
+    KClientHttpResult *rslt;
+    TestStream::AddResponse("HTTP/1.1 200 OK\r\n");
+    REQUIRE_RC ( KClientHttpRequestPOST ( req, & rslt ) );
+    REQUIRE_RC ( KClientHttpResultRelease ( rslt ) );
+
+    REQUIRE_RC ( KClientHttpRequestRelease ( req ) );
+}
+
+
+//////////////////////////
+// HttpRetrySpecs
+
+FIXTURE_TEST_CASE(HttpRetrySpecs_Construct_Defaults, HttpFixture)
+{
+    HttpRetrySpecs rs;
+    KConfig* kfg = MakeConfig( GetName(), "a=\"b\"" );
+    REQUIRE_RC(HttpRetrySpecsInit(&rs, kfg));
+
+    uint8_t  max_retries;
+    const uint16_t *sleep_before_retry;
+    bool open_ended;
+
+    REQUIRE ( HttpGetRetryCodes ( & rs, 502, & max_retries, & sleep_before_retry, & open_ended ) );
+
+    REQUIRE ( ! open_ended );
+    REQUIRE_EQ ( 6, (int)max_retries );
+    REQUIRE_NOT_NULL(sleep_before_retry);
+    REQUIRE_EQ (  0, (int)sleep_before_retry[0] );
+    REQUIRE_EQ (  5, (int)sleep_before_retry[1] );
+    REQUIRE_EQ ( 10, (int)sleep_before_retry[2] );
+    REQUIRE_EQ ( 15, (int)sleep_before_retry[3] );
+    REQUIRE_EQ ( 30, (int)sleep_before_retry[4] );
+    REQUIRE_EQ ( 60, (int)sleep_before_retry[5] );
+
+    REQUIRE_RC(KConfigRelease(kfg));
+    REQUIRE_RC(HttpRetrySpecsDestroy(&rs));
+}
+
+FIXTURE_TEST_CASE(HttpRetrySpecs_Construct_Error, HttpFixture)
+{
+    HttpRetrySpecs rs;
+    REQUIRE_RC_FAIL(HttpRetrySpecsInit(&rs, NULL));
+}
+
+FIXTURE_TEST_CASE(HttpRetrySpecs_Construct, HttpFixture)
+{
+    HttpRetrySpecs rs;
+    KConfig* kfg = MakeConfig( GetName(), "http/reliable/5xx=\"0,1\"\n" "http/reliable/501=\"2,3,4\"\n");
+    REQUIRE_RC(HttpRetrySpecsInit(&rs, kfg));
+
+    uint8_t  max_retries;
+    const uint16_t *sleep_before_retry;
+    bool open_ended;
+
+    REQUIRE ( HttpGetRetryCodes ( & rs, 502, & max_retries, & sleep_before_retry, & open_ended ) );
+    REQUIRE ( ! open_ended );
+    REQUIRE_EQ ( 2, (int)max_retries );
+    REQUIRE_NOT_NULL ( sleep_before_retry );
+    REQUIRE_EQ ( 0, (int)sleep_before_retry[0] );
+    REQUIRE_EQ ( 1, (int)sleep_before_retry[1] );
+
+    REQUIRE ( HttpGetRetryCodes(&rs, 501, &max_retries, & sleep_before_retry, & open_ended) );
+    REQUIRE ( ! open_ended );
+    REQUIRE_EQ ( 3, (int)max_retries );
+    REQUIRE_NOT_NULL ( sleep_before_retry );
+    REQUIRE_EQ ( 2, (int)sleep_before_retry[0] );
+    REQUIRE_EQ ( 3, (int)sleep_before_retry[1] );
+    REQUIRE_EQ ( 4, (int)sleep_before_retry[2] );
+
+    REQUIRE_RC ( KConfigRelease(kfg) );
+    REQUIRE_RC ( HttpRetrySpecsDestroy ( & rs ) );
+}
+
+FIXTURE_TEST_CASE(HttpRetrySpecs_Construct_OpenEnded, HttpFixture)
+{
+    HttpRetrySpecs rs;
+    KConfig* kfg = MakeConfig( GetName(), "http/reliable/5xx=\"0,1+\"\n");
+    REQUIRE_RC(HttpRetrySpecsInit(&rs, kfg));
+
+    uint8_t  max_retries;
+    const uint16_t *sleep_before_retry;
+    bool open_ended;
+
+    REQUIRE ( HttpGetRetryCodes ( & rs, 502, & max_retries, & sleep_before_retry, & open_ended ) );
+    REQUIRE ( open_ended );
+    REQUIRE_EQ ( 2, (int)max_retries );
+    REQUIRE_NOT_NULL ( sleep_before_retry );
+    REQUIRE_EQ ( 0, (int)sleep_before_retry[0] );
+    REQUIRE_EQ ( 1, (int)sleep_before_retry[1] );
+
+    REQUIRE_RC ( KConfigRelease(kfg) );
+    REQUIRE_RC ( HttpRetrySpecsDestroy ( & rs ) );
+}
+
+FIXTURE_TEST_CASE(HttpRetrySpecs_Construct_SleepsDoNotDecrease, HttpFixture)
+{
+    HttpRetrySpecs rs;
+    KConfig* kfg = MakeConfig( GetName(), "http/reliable/5xx=\"0,1,10,5,7\"\n");
+    REQUIRE_RC(HttpRetrySpecsInit(&rs, kfg));
+
+    uint8_t  max_retries;
+    const uint16_t *sleep_before_retry;
+    bool open_ended;
+
+    REQUIRE ( HttpGetRetryCodes ( & rs, 502, & max_retries, & sleep_before_retry, & open_ended ) );
+    REQUIRE ( ! open_ended );
+    REQUIRE_EQ ( 5, (int)max_retries );
+    REQUIRE_NOT_NULL ( sleep_before_retry );
+    REQUIRE_EQ (  0, (int)sleep_before_retry[0] );
+    REQUIRE_EQ (  1, (int)sleep_before_retry[1] );
+    REQUIRE_EQ ( 10, (int)sleep_before_retry[2] ); // set to equal the prior sleep time
+    REQUIRE_EQ ( 10, (int)sleep_before_retry[3] );
+    REQUIRE_EQ ( 10, (int)sleep_before_retry[4] );
+
+    REQUIRE_RC ( KConfigRelease(kfg) );
+    REQUIRE_RC ( HttpRetrySpecsDestroy ( & rs ) );
+}
+
+
+//////////////////////////
+// HttpRetrier
+
+class RetrierFixture : public HttpFixture
+{
+public:
+    static const uint8_t MaxRetries = 10;
+    static const uint32_t MaxTotalWait= 600000;
+
+    ~RetrierFixture()
+    {
+        if ( KHttpRetrierDestroy ( & m_retrier ) != 0 )
+            throw logic_error ( "RetrierFixture::~RetrierFixture KHttpRetrierDestroy failed" );
+    }
+
+    void Configure ( const char* kfg_name, const char* kfg_content, uint8_t max_retries = MaxRetries, uint32_t max_total_wait = MaxTotalWait )
+    {
+        KConfig* kfg = MakeConfig( kfg_name, kfg_content );
+
+        if ( m_mgr && KNSManagerRelease ( m_mgr ) != 0 )
+            throw logic_error ( "RetrierFixture::Configure KNSManagerRelease failed" );
+
+        if ( KNSManagerMakeConfig ( & m_mgr, kfg ) != 0 )
+            throw logic_error ( "RetrierFixture::Configure KNSManagerMakeConfig failed" );
+
+        m_mgr -> maxNumberOfRetriesOnFailureForReliableURLs = max_retries;
+        m_mgr -> maxTotalWaitForReliableURLs_ms = max_total_wait;
+
+        if ( KHttpRetrierInit ( & m_retrier, kfg_name, m_mgr ) != 0 )
+            throw logic_error ( "RetrierFixture::Configure KHttpRetrierInit failed" );
+
+        KConfigRelease ( kfg );
+    }
+
+    KHttpRetrier m_retrier;
+};
+
+FIXTURE_TEST_CASE(HttpRetrier_Construct, RetrierFixture)
+{
+    REQUIRE_RC ( KHttpRetrierInit ( & m_retrier, GetName(), m_mgr ) );
+}
+
+FIXTURE_TEST_CASE(HttpRetrier_NoRetry, RetrierFixture)
+{
+    Configure( GetName(), "http/reliable/501=\"\"\n" );
+
+    REQUIRE ( ! KHttpRetrierWait ( & m_retrier, 501 ) );  // configured to never retry
+    REQUIRE_EQ ( 0u, m_retrier . last_sleep );
+
+    REQUIRE ( ! KHttpRetrierWait ( & m_retrier, 300 ) );  // only 4xx and 5xx retry
+    REQUIRE_EQ ( 0u, m_retrier . last_sleep );
+}
+
+FIXTURE_TEST_CASE(HttpRetrier_RetryDefault4xx, RetrierFixture)
+{
+    REQUIRE_RC ( KHttpRetrierInit ( & m_retrier, GetName(), m_mgr ) );
+
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 400 ) );  // default for 4xx retries
+    REQUIRE_EQ ( 0u, m_retrier . last_sleep );
+}
+
+FIXTURE_TEST_CASE(HttpRetrier_RetryDefault5xx, RetrierFixture)
+{
+    REQUIRE_RC ( KHttpRetrierInit ( & m_retrier, GetName(), m_mgr ) );
+
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 500 ) );  // default for 5xx retries
+    REQUIRE_EQ ( 0u, m_retrier . last_sleep );
+}
+
+FIXTURE_TEST_CASE(HttpRetrier_Retry, RetrierFixture)
+{
+    Configure ( GetName(), "http/reliable/501=\"1,2,3\"\n");
+
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 1u, m_retrier . last_sleep );
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 2u, m_retrier . last_sleep );
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 3u, m_retrier . last_sleep );
+    REQUIRE ( ! KHttpRetrierWait ( & m_retrier, 501 ) );  // out of retries
+}
+
+FIXTURE_TEST_CASE(HttpRetrier_Retry_ExceedMaxRetries, RetrierFixture)
+{
+    Configure ( GetName(), "http/reliable/501=\"1,2,3\"\n", 2 ); // set global max retries to 2
+
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 1u, m_retrier . last_sleep );
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 2u, m_retrier . last_sleep );
+    REQUIRE ( ! KHttpRetrierWait ( & m_retrier, 501 ) );  // globally set max retries overrides config
+}
+FIXTURE_TEST_CASE(HttpRetrier_Retry_DiffStatus, RetrierFixture)
+{
+    Configure ( GetName(), "http/reliable/501=\"1,2,3\"\n" "http/reliable/502=\"4,5,6\"\n", 2 );
+
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 1u, m_retrier . last_sleep );
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 2u, m_retrier . last_sleep );
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 502 ) );  // with a different status, retry count is reset
+    REQUIRE_EQ ( 4u, m_retrier . last_sleep );
+}
+
+FIXTURE_TEST_CASE(HttpRetrier_Retry_ExceedMaxTime, RetrierFixture)
+{
+    Configure ( GetName(), "http/reliable/501=\"200,300,400,400\"\n", MaxRetries, 600 ); // set max total to 600ms
+
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 200u, m_retrier . last_sleep );
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 300u, m_retrier . last_sleep );
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 100u, m_retrier . last_sleep ); // cut short to the total of 600
+    REQUIRE ( ! KHttpRetrierWait ( & m_retrier, 501 ) );  // no more retries
+}
+
+FIXTURE_TEST_CASE(HttpRetrier_Retry_OpenEnded_MaxRetries, RetrierFixture)
+{
+    Configure ( GetName(), "http/reliable/501=\"200,300+\"\n", 4 ); // 300ms until out of retries
+
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 200u, m_retrier . last_sleep );
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 300u, m_retrier . last_sleep ); // 300 ms from now on
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 300u, m_retrier . last_sleep );
+    REQUIRE ( KHttpRetrierWait ( & m_retrier, 501 ) );
+    REQUIRE_EQ ( 300u, m_retrier . last_sleep );
+    REQUIRE ( ! KHttpRetrierWait ( & m_retrier, 501 ) );  // out of retries
+}
+
+//////////////////////////
+// Reliable HTTP file
+
+FIXTURE_TEST_CASE(HttpReliable_Make, HttpFixture)
+{
+    TestStream::AddResponse("HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nContent-Length: 7\r\n");
+    REQUIRE_RC ( KNSManagerMakeReliableHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str()  ) );
+    REQUIRE_NOT_NULL ( m_file ) ;
+}
+#if 0
+/* 100 used to be retried regardless, now it is not, so the test fails */
+FIXTURE_TEST_CASE(HttpReliable_Make_Continue_100_Retry, HttpFixture)
+{
+    TestStream::AddResponse("HTTP/1.1 100 continue\r\n");
+    TestStream::AddResponse("HTTP/1.1 100 continue\r\n");
+    TestStream::AddResponse("HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nContent-Length: 7\r\n");
+    REQUIRE_RC ( KNSManagerMakeReliableHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str()  ) );
+    REQUIRE_NOT_NULL ( m_file ) ;
+}
+#endif
+
+FIXTURE_TEST_CASE(HttpReliable_Make_5xx_retry, HttpFixture)
+{   // use default configuration for 5xx to be retried
+    TestStream::AddResponse("HTTP/1.1 500 Internal Server Error\r\nContent-Length: 0\r\n");
+    TestStream::AddResponse("HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nContent-Length: 7\r\n");
+    REQUIRE_RC ( KNSManagerMakeReliableHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str()  ) );
+    REQUIRE_NOT_NULL ( m_file ) ;
+}
+
+FIXTURE_TEST_CASE(HttpReliable_Make_500_Fail, RetrierFixture)
+{
+    Configure ( GetName(), "http/reliable/500=\"\"\n"); // do not retry 500
+    TestStream::AddResponse("HTTP/1.1 500 Internal Server Error\r\nContent-Length: 0\r\n");
+    REQUIRE_RC_FAIL ( KNSManagerMakeReliableHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str()  ) );
+}
+
+FIXTURE_TEST_CASE(HttpReliable_Make_500_Retry, RetrierFixture)
+{
+    Configure ( GetName(), "http/reliable/500=\"0+\"\n" "http/reliable/5xx=\"\"\n"); // do not retry 5xx, retry 500
+    TestStream::AddResponse("HTTP/1.1 500 Internal Server Error\r\nContent-Length: 0\r\n");
+    TestStream::AddResponse("HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nContent-Length: 7\r\n");
+    REQUIRE_RC ( KNSManagerMakeReliableHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str()  ) );
+    REQUIRE_NOT_NULL ( m_file ) ;
+}
+
+FIXTURE_TEST_CASE(HttpReliable_Make_500_TooManyRetries, RetrierFixture)
+{
+    Configure ( GetName(), "http/reliable/500=\"0\"\n" "http/reliable/5xx=\"\"\n"); // do not retry 5xx, retry 500 once
+    TestStream::AddResponse("HTTP/1.1 500 Internal Server Error\r\nContent-Length: 0\r\n");
+    TestStream::AddResponse("HTTP/1.1 500 Internal Server Error\r\nContent-Length: 0\r\n");
+    REQUIRE_RC_FAIL ( KNSManagerMakeReliableHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str()  ) );
+}
+
+#ifdef _DEBUGGING
+FIXTURE_TEST_CASE(HttpReliable_Read_Retry, HttpFixture)
+{
+    SetClientHttpReopenCallback ( Reconnect ); // this hook is only available in DEBUG mode
+
+    TestStream::AddResponse("HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nContent-Length: 7\r\n"); // response to HEAD
+    REQUIRE_RC ( KNSManagerMakeReliableHttpFile( m_mgr, ( const KFile** ) &  m_file, & m_stream, 0x01010000, MakeURL(GetName()).c_str()  ) );
+    char buf[1024];
+    size_t num_read;
+    TestStream::AddResponse("HTTP/1.1 500 Internal Server Error\r\n"); // response to GET
+    TestStream::AddResponse(
+        "HTTP/1.1 206 Partial Content\r\n"
+        "Accept-Ranges: bytes\r\n"
+        "Transfer-Encoding: chunked\r\n"
+        "Content-Length: 7\r\n"
+        "Content-Range: bytes 0-6/7\r\n"
+        "\r\n"
+        "7\r\n"
+        "content\r\n"
+    );
+    REQUIRE_RC( KFileTimedRead ( m_file, 0, buf, sizeof buf, &num_read, NULL ) );
+    REQUIRE_EQ( string ( "content" ), string ( buf, num_read ) );
+}
+#endif
+
+//////////////////////////
+// Reliable HTTP request
+FIXTURE_TEST_CASE(HttpReliableRequest_Make, HttpFixture)
+{
+    KClientHttpRequest *req;
+    KNSManagerMakeReliableClientRequest ( m_mgr, &req, 0x01010000, & m_stream, MakeURL(GetName()).c_str()  );
+    REQUIRE_NOT_NULL ( req ) ;
+    REQUIRE_RC ( KClientHttpRequestRelease ( req ) );
+}
+
+FIXTURE_TEST_CASE(HttpReliableRequest_POST_5xx_retry, HttpFixture)
+{   // use default configuration for 5xx to be retried
+    KClientHttpRequest *req;
+    KNSManagerMakeReliableClientRequest ( m_mgr, &req, 0x01010000, & m_stream, MakeURL(GetName()).c_str()  );
+
+    TestStream::AddResponse("HTTP/1.1 500 Internal Server Error\r\nContent-Length: 0\r\n"); // response to GET
+    TestStream::AddResponse("HTTP/1.1 200 OK\r\n");
+
+    KClientHttpResult *rslt;
+    REQUIRE_RC ( KClientHttpRequestPOST ( req, & rslt ) );
+
+    REQUIRE_RC ( KClientHttpResultRelease ( rslt ) );
+    REQUIRE_RC ( KClientHttpRequestRelease ( req ) );
+}
+
+#endif
+
+/* VDB-3059: KHttpRequestPOST generates incorrect Content-Length after retry :
+ it makes web server to return 400 Bad Request */
+TEST_CASE(ContentLength) {
+    rc_t rc = 0;
+    KNSManager * kns = NULL;
+    REQUIRE_RC ( KNSManagerMake ( & kns ) );
+
+    uint32_t code = 0;
+    KHttpRequest * req = NULL;
+    KHttpResult * rslt = NULL;
+    KStream * response = NULL;
+
+    /* calling good cgi returns 200 and resolved path */
+    REQUIRE_RC ( KNSManagerMakeReliableClientRequest ( kns, & req, 0x01000000,
+        NULL, "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi" ) ); 
+    REQUIRE_RC ( KHttpRequestAddPostParam ( req, "acc=AAAB01" ) );
+    REQUIRE_RC ( KHttpRequestAddPostParam ( req, "accept-proto=https" ) );
+    REQUIRE_RC ( KHttpRequestAddPostParam ( req, "version=1.2" ) );
+    REQUIRE_RC ( KHttpRequestPOST ( req, & rslt ) );
+    REQUIRE_RC ( KClientHttpResultStatus ( rslt, & code, NULL, 0, NULL ) );
+    REQUIRE_EQ ( code, 200u );
+    REQUIRE_RC ( KHttpResultGetInputStream ( rslt, & response ) );
+    char buffer [ 512 ] = "";
+    size_t num_read = 0;
+    REQUIRE_RC (KStreamRead( response, buffer, sizeof buffer - 1,  &num_read ));
+    REQUIRE_LT ( num_read, sizeof buffer );
+    buffer [ num_read ] = '\0';
+    REQUIRE_EQ ( string ( buffer + num_read - 7 ), string ( "200|ok\n" ) );
+    RELEASE ( KStream, response );
+    RELEASE ( KHttpResult, rslt );
+    RELEASE ( KHttpRequest, req );
+
+    /* calling non-existing cgi returns 404 */
+    REQUIRE_RC ( KNSManagerMakeReliableClientRequest ( kns, & req, 0x01000000,
+        NULL, "https://www.ncbi.nlm.nih.gov/Traces/names/bad.cgi" ) ); 
+    REQUIRE_RC ( KHttpRequestAddPostParam ( req, "acc=AAAB01" ) );
+    REQUIRE_RC ( KHttpRequestPOST ( req, & rslt ) );
+    REQUIRE_RC ( KClientHttpResultStatus ( rslt, & code, NULL, 0, NULL ) );
+    REQUIRE_EQ ( code, 404u );
+    RELEASE ( KHttpResult, rslt );
+    RELEASE ( KHttpRequest, req );
+
+    RELEASE ( KNSManager, kns );
+    REQUIRE_RC ( rc );
+}
+
+//////////////////////////////////////////// Main
+
+static rc_t argsHandler ( int argc, char * argv [] ) {
+    Args * args = NULL;
+    rc_t rc = ArgsMakeAndHandle ( & args, argc, argv, 0, NULL, 0 );
+    ArgsWhack ( args );
+    return rc;
+}
+
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+#include <klib/debug.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+const char UsageDefaultName[] = "test-http";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    if ( 0 ) assert ( ! KDbgSetString ( "VFS" ) );
+
+    KConfigDisableUserSettings();
+
+	// this makes messages from the test code appear
+	// (same as running the executable with "-l=message")
+	// TestEnv::verbosity = LogLevel::e_message;
+	
+    rc_t rc=HttpTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kns/knstest.cpp b/test/kns/knstest.cpp
new file mode 100644
index 0000000..7c635e6
--- /dev/null
+++ b/test/kns/knstest.cpp
@@ -0,0 +1,1095 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for KNS interfaces
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <klib/printf.h>
+
+#include <kproc/timeout.h>
+
+#include <kns/manager.h>
+#include <kns/endpoint.h>
+#include <kns/stream.h>
+#include <kns/adapt.h>
+#include <kns/socket.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <kapp/args.h> /* ArgsMakeAndHandle */
+
+#include <kproc/thread.h>
+#include <kproc/timeout.h>
+
+#include <os-native.h>
+
+#include <sysalloc.h>
+#include <stdexcept>
+#include <cstring>
+#include <algorithm>
+#include <sstream>
+
+static rc_t argsHandler(int argc, char* argv[]);
+TEST_SUITE_WITH_ARGS_HANDLER(KnsTestSuite, argsHandler);
+
+using namespace std;
+using namespace ncbi::NK;
+
+//////////////////////////////////////////// KStream
+class KnsStreamFixture
+{
+public:
+    KnsStreamFixture ()
+        : dir ( 0 ), strm ( 0 ), file ( 0 ), name ("./adapter-test.txt")
+        {
+            write_buffer = "something nice";
+
+            THROW_ON_RC (  KDirectoryNativeDir ( &dir ) );
+            KDirectoryRemove ( dir, true, name );
+            THROW_ON_RC ( KDirectoryCreateFile ( dir, &file, false, 0664, kcmCreate, name ) );
+        }
+    ~KnsStreamFixture ()
+        {                    
+            if ( strm )
+                THROW_ON_RC ( KStreamRelease ( strm ) );
+            if ( file )
+                THROW_ON_RC ( KFileRelease ( file ) );
+            if ( dir )
+            {
+                THROW_ON_RC ( KDirectoryRemove ( dir, true, name ) );
+                THROW_ON_RC ( KDirectoryRelease ( dir ) );
+            }
+        }
+
+    KDirectory *dir;
+    KStream *strm;
+    KFile *file;
+    size_t numRead, numWrit;
+    const char *write_buffer;
+    char read_buffer [ 256 ];
+    const char *name;
+};
+
+FIXTURE_TEST_CASE ( KStreamAdaptersFileWriteOnly, KnsStreamFixture )
+{   
+
+    REQUIRE_RC ( KStreamFromKFilePair ( & strm, NULL, file ) );
+    REQUIRE_RC ( KStreamWrite ( strm, write_buffer, strlen ( write_buffer ), & numWrit ) );
+    
+    KFileRelease ( file );
+
+    REQUIRE_RC ( KDirectoryOpenFileRead ( dir, ( const KFile ** ) & file, name ) );
+    REQUIRE_RC ( KFileRead ( file, 0, read_buffer, sizeof read_buffer, & numRead ) );
+    
+    REQUIRE_EQ ( numRead, numWrit );
+    REQUIRE_EQ ( strncmp ( write_buffer, read_buffer, numRead ), 0 );
+
+}
+
+FIXTURE_TEST_CASE ( KStreamAdaptersFileReadOnly, KnsStreamFixture )
+{   
+
+    REQUIRE_RC ( KFileWrite ( file, 0,  write_buffer, strlen ( write_buffer ), &numWrit ) );
+    
+    KFileRelease ( file );
+
+    REQUIRE_RC ( KDirectoryOpenFileRead ( dir, ( const KFile ** ) & file, name ) );
+    REQUIRE_RC ( KStreamFromKFilePair ( & strm, file, NULL ) );
+    REQUIRE_RC ( KStreamRead ( strm, read_buffer, sizeof read_buffer, & numRead ) );
+    
+    REQUIRE_EQ ( numRead, numWrit );
+    REQUIRE_EQ ( strncmp ( write_buffer, read_buffer, numRead ), 0 );
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////// IPC connections
+
+TEST_CASE(KnsManagerMakeRelease)
+{   
+    KNSManager* mgr;
+    REQUIRE_RC(KNSManagerMake(&mgr)); 
+    REQUIRE_NOT_NULL(mgr);
+    REQUIRE_RC(KNSManagerRelease(mgr)); 
+}
+
+class KnsManagerFixture
+{
+public:
+    KnsManagerFixture()
+    : mgr(0)
+    {
+        THROW_ON_RC ( KNSManagerMake(&mgr) );
+    }
+    ~KnsManagerFixture()
+    {
+        if (mgr)
+            THROW_ON_RC ( KNSManagerRelease(mgr) );
+    }
+    
+    KNSManager* mgr;
+    
+    KEndPoint ep;
+    String name; 
+};
+
+FIXTURE_TEST_CASE(IPCEndpoint_Create, KnsManagerFixture)
+{
+    StringInitCString(&name, GetName());
+    REQUIRE_RC(KNSManagerInitIPCEndpoint(mgr, &ep, &name));
+    REQUIRE_EQ(ep.type, (KEndPointType)epIPC);
+    REQUIRE_EQ(string(ep.u.ipc_name), string(GetName()));
+}
+
+FIXTURE_TEST_CASE(MakeListener, KnsManagerFixture)
+{
+    CONST_STRING(&name, "socket");
+    REQUIRE_RC(KNSManagerInitIPCEndpoint(mgr, &ep, &name));
+    KListener* listener;
+    REQUIRE_RC(KNSManagerMakeListener( mgr, &listener, &ep ));
+    REQUIRE_NOT_NULL(listener);
+    KListenerRelease(listener);
+}   
+
+FIXTURE_TEST_CASE(MakeIPCConnection_NoListener, KnsManagerFixture)
+{
+    CONST_STRING(&name, "socket");
+    REQUIRE_RC(KNSManagerInitIPCEndpoint(mgr, &ep, &name));
+    timeout_t tm;
+    TimeoutInit ( & tm, 0 );
+    KSocket* socket;
+    REQUIRE_RC_FAIL(KNSManagerMakeRetryConnection(mgr, &socket, &tm, NULL, &ep)); /* no server; no retries */
+    REQUIRE_NULL(socket);
+}   
+
+//////////////////////////////////////////// IPC, non-timed reads and writes 
+
+const string SocketName = string("knstest") + TestEnv::GetPidString();
+
+class SocketFixture : public KnsManagerFixture
+{
+// Sets up a server thread. The server thread will:
+// - wait for an incoming message, 
+// - upon receiving the message, convert it to upper case 
+// - send the converted message back
+// - wait for an incoming message "done"
+// - shut down the IPC connection
+
+// Test cases' bodies represent client logic
+// The fixture on the client will send "done" from the destructor and close its IPC connection
+
+public:
+    typedef rc_t (*WorkerThreadFn) ( const KThread *self, void *data );
+    
+	static const size_t MaxMessageSize = 256; // for this suite, we will agree not to send messages longer that this
+    
+public:
+    SocketFixture()
+    : server(0), listener(0), threadWorker(0)
+    {
+        StringInitCString(&name, SocketName.c_str());
+        THROW_ON_RC (KNSManagerInitIPCEndpoint(mgr, &ep, &name) );
+
+        if ( ! TestEnv::in_child_process)
+        {   // start a server thread
+            LOG(LogLevel::e_message, "starting a server" << endl);
+        
+            if (KThreadMake ( &server, ServerThreadFn, this ) != 0 || server == 0)
+                throw logic_error ( "SocketFixture: KThreadMake failed" );
+        }
+        else
+            throw logic_error ( "SocketFixture() called from child" );
+    }
+    ~SocketFixture()
+    {
+        if ( ! TestEnv::in_child_process)
+        {
+            if (server)
+            {
+                LOG(LogLevel::e_message, "server stopping" << endl);    
+
+                THROW_ON_RC ( KThreadCancel(server) );
+                THROW_ON_RC ( KThreadWait(server, NULL) );
+                THROW_ON_RC ( KThreadRelease(server) );
+                THROW_ON_RC ( KThreadRelease(server) );/* for some reason KThread is initialized with refcout = 2 */
+                    
+                if (listener)
+                {   /* shutdown the (possibly blocked) listener */
+                    LOG(LogLevel::e_message, "server releasing the listener" << endl);    
+                    THROW_ON_RC ( KListenerRelease(listener) );
+                }
+            }
+        }
+        else
+            throw logic_error ( "~SocketFixture() called from child" );
+    }
+    static rc_t ServerThreadFn ( const KThread *self, void *data )  
+    {
+        try
+        {
+            SocketFixture* me = (SocketFixture*)data;
+            return me->Listen();
+        }
+        catch (const exception& ex)
+        {
+            cout << "SocketFixture server thread threw " << ex.what() << endl; 
+            throw;
+        }
+    }
+    
+    static string ToUpper(const string& str)
+    {
+        string ret(str);
+        transform(ret.begin(), ret.end(), ret.begin(), ::toupper);
+        return ret;
+    }   
+    
+    rc_t Listen()
+    {   
+        if (KNSManagerMakeListener ( mgr, &listener, &ep ) == 0)
+        {
+            rc_t rc = 0;
+            while (rc == 0)
+            {
+                LOG(LogLevel::e_message, "server listening" << endl);    
+                KSocket* socket;
+                rc = KListenerAccept ( listener, &socket ); // may not return from here if no more incoming connections for this test case
+                if (rc == 0)
+                {
+                    KStream* stream;
+                    THROW_ON_RC ( KSocketGetStream ( socket, & stream ) );
+                    THROW_ON_RC ( KSocketRelease ( socket ) );
+                    
+                    LOG(LogLevel::e_message, "server detected connection, starting worker" << endl);    
+                    KThread* worker;
+                    if (KThreadMake ( &worker, threadWorker == 0 ? DefaultWorkerThreadFn : threadWorker, stream) != 0 || worker == 0)
+                        throw logic_error ( "SocketFixture: KThreadMake failed" );
+                }
+            }
+            LOG(LogLevel::e_message, "server  exiting" << endl);    
+            return rc;
+        }
+        else
+            throw logic_error ( "SocketFixture: KNSMakeListener failed" );
+    }
+    
+    static rc_t DefaultWorkerThreadFn ( const KThread *self, void *data )  
+    {
+        try
+        {   // this server worker converts the incoming message to all uppercase and sends it back
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " starting" << endl);    
+            
+            KStream* stream = (KStream*)data;
+            char localBuf[MaxMessageSize];
+            size_t num;
+            THROW_ON_RC (KStreamTimedRead(stream, localBuf, sizeof(localBuf), &num, NULL) ); // wait forever
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " after KStreamRead(" << string(localBuf, num) << ")" << endl);    
+            
+            for (size_t i = 0 ; i < num; ++i)
+                localBuf[i] = toupper(localBuf[i]);
+                
+            THROW_ON_RC ( KStreamWrite(stream, localBuf, num, &num) );
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " after KStreamWrite" << endl);    
+            
+            // wait until the reader says "done"
+            THROW_ON_RC ( KStreamTimedRead(stream, localBuf, sizeof(localBuf), &num, NULL) ); // wait forever
+
+            string doneMsg(localBuf, num);
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " after KStreamRead = '" << doneMsg << "'" << endl);    
+            if (doneMsg != "done")
+                throw logic_error ( "SocketFixture worker: out of sequence message received: '" + doneMsg + "'" );
+            
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " after KStreamRelease" << endl);    
+
+            THROW_ON_RC ( KStreamRelease(stream) );
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " after KStreamRelease" << endl);    
+        }
+        catch (const exception& ex)
+        {
+            cout << "SocketFixture worker thread threw " << ex.what() << endl; 
+            throw;
+        }
+        LOG(LogLevel::e_message, "worker "  << (void*)self << " exiting" << endl);    
+        return KThreadRelease(self);
+    }
+    
+    void CloseClientStream(KStream* p_stream)
+    {
+        if (p_stream != 0)
+        {
+            // signal to server to shut down the connection
+            string done("done");
+            size_t num;
+            THROW_ON_RC ( KStreamTimedWrite(p_stream, done.c_str(), done.length(), &num, NULL) );
+            THROW_ON_RC ( KStreamRelease(p_stream) );
+        }
+    }
+    
+    KStream* MakeStream( int32_t p_retryTimeout )
+    {
+        timeout_t tm;
+        TimeoutInit ( & tm, p_retryTimeout );
+
+        KSocket* socket;
+        THROW_ON_RC ( KNSManagerMakeRetryConnection(mgr, &socket, &tm, NULL, &ep) );
+        if (socket == 0)
+           throw logic_error ( "MakeStream: KStreamRelease failed" );
+           
+        KStream* stream;
+        THROW_ON_RC ( KSocketGetStream ( socket, & stream ) );
+        if (stream == 0)
+           throw logic_error ( "MakeStream: KStreamRelease failed" );
+        KSocketRelease ( socket );
+        
+        return stream;
+    }
+
+    KThread* server;
+    
+    // created by the listener thread
+    KListener* listener;
+    
+    // may be set by subclasses
+    WorkerThreadFn threadWorker;
+
+    // for use in test cases
+    size_t num;
+    char buf[MaxMessageSize];
+};
+
+PROCESS_FIXTURE_TEST_CASE(IPCEndpoint_Basic, SocketFixture, 0, 5)
+{   // client runs in a child process
+    string content = GetName();
+    
+    KStream* stream = MakeStream ( 50 * 1000 ); /* this might make some retries while the server is setting up */
+    LOG(LogLevel::e_message, "client '" << GetName() << "' after KNSMakeConnection" << endl);    
+    
+    REQUIRE_RC(KStreamWrite(stream, content.c_str(), content.length(), &num));
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    REQUIRE_RC(KStreamTimedRead(stream, buf, sizeof(buf), &num, NULL));
+    LOG(LogLevel::e_message, "client after KStreamRead" << endl);    
+    REQUIRE_EQ(string(buf, num), ToUpper(content));
+    
+    CloseClientStream(stream);
+}
+
+PROCESS_FIXTURE_TEST_CASE(IPCEndpoint_MultipleListeners, SocketFixture, 0, 100) 
+{   // client runs in a child process
+    
+    KStream* stream = MakeStream ( 50 * 1000 ); /* this might make some retries while the server is setting up */
+    LOG(LogLevel::e_message, "client '" << GetName() << "' after KNSMakeConnection1" << endl);    
+
+    TestEnv::Sleep(1); // on Windows 32, when the two calls to KNSManagerMakeConnection follow too closely, sometimes things get messed up
+    
+    KStream* stream2 = MakeStream ( 5 * 1000 ); /* should work from the first try now*/
+    LOG(LogLevel::e_message, "client '" << GetName() << "' after KNSMakeConnection2" << endl);    
+    
+    string content = string(GetName())+"_1";
+    REQUIRE_RC(KStreamWrite(stream, content.c_str(), content.length(), &num));
+    LOG(LogLevel::e_message, "client after KStreamWrite1" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    string content2(string(GetName())+"_2");
+    REQUIRE_RC(KStreamWrite(stream2, content2.c_str(), content2.length(), &num));
+    LOG(LogLevel::e_message, "client after KStreamWrite2" << endl);    
+    REQUIRE_EQ(content2.length(), num);
+    
+    REQUIRE_RC(KStreamTimedRead(stream2, buf, sizeof(buf), &num, NULL));
+    LOG(LogLevel::e_message, "client after KStreamRead2" << endl);    
+    REQUIRE_EQ(string(buf, num), ToUpper(content2));
+    
+    REQUIRE_RC(KStreamTimedRead(stream, buf, sizeof(buf), &num, NULL));
+    LOG(LogLevel::e_message, "client after KStreamRead1" << endl);    
+    REQUIRE_EQ(string(buf, num), ToUpper(content));
+    
+    CloseClientStream(stream);
+    CloseClientStream(stream2);
+}
+
+PROCESS_FIXTURE_TEST_CASE(IPCEndpoint_ReadAll, SocketFixture, 0, 5)
+{   // call ReadAll requesting more bytes than available, see it return only what is available
+    string content = GetName();
+    
+    KStream* stream = MakeStream ( 5 * 1000 );
+    LOG(LogLevel::e_message, "client '" << GetName() << "' after KNSMakeConnection" << endl);    
+    
+    REQUIRE_RC(KStreamWrite(stream, content.c_str(), content.length(), &num));
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    REQUIRE_RC(KStreamReadAll(stream, buf, content.length()*2, &num));
+    REQUIRE_EQ(content.length(), num);
+    
+    CloseClientStream(stream);
+}
+
+//////////////////////////////////////////// IPC, timed reads
+class TimedReadSocketFixture : public SocketFixture
+{
+// Sets up a server thread. The server thread will:
+// - wait for an incoming message, 
+// - upon receiving the message, convert it to upper case 
+// - (this is different from SocketFixture) sleep for SERVER_WRITE_DELAY_MS (the client can time out or wait, depending on the test case)
+// - send the converted message back
+// - wait for an incoming message "done"
+// - shut down the IPC connection
+
+// Test cases' bodies represent client logic
+// (this is different from SocketFixture) Call SetupClient() to initialize timeout value
+// The fixture on the client will send "done" from the destructor and close its IPC connection
+public:
+    static const uint32_t SERVER_WRITE_DELAY_MS = 2000;
+public:
+    TimedReadSocketFixture()
+    : m_stream(0)
+    {
+        threadWorker = StutteringWorkerThreadFn;
+    }
+    ~TimedReadSocketFixture()
+    {
+    }
+	
+	void SetupClient(const string& p_content)
+	{
+        LOG(LogLevel::e_message, "TimedReadSocketFixture::SetupClient(" + p_content + ")" << endl);    
+        StringInitCString(&name, SocketName.c_str());
+        if (KNSManagerInitIPCEndpoint(mgr, &ep, &name) != 0)
+			throw logic_error ( string("TimedReadSocketFixture: SetupClient(") + p_content + "), KNSManagerInitIPCEndpoint failed" );
+
+        m_stream = MakeStream ( 5 * 1000 );
+        LOG(LogLevel::e_message, "client '" << p_content << "' after KNSMakeConnection" << endl);    
+	}
+	void SetupClient(const string& p_content, uint32_t p_timeoutMs)
+	{
+		TimeoutInit(&tm, p_timeoutMs);
+		SetupClient(p_content);
+	}
+	void TeardownClient()
+	{   
+        CloseClientStream(m_stream);
+    }
+
+    static rc_t StutteringWorkerThreadFn ( const KThread *self, void *data )  
+    {
+        try
+        {   // this server worker converts the incoming message to all uppercase, pauses for SERVER_WRITE_DELAY_MS, and sends it back
+            KStream* stream = (KStream*)data;
+            
+            char localBuf[MaxMessageSize];
+            size_t localNumRead;
+            THROW_ON_RC ( KStreamTimedRead(stream, localBuf, sizeof(localBuf), &localNumRead, NULL) ); // wait forever
+            if (localNumRead == 0)
+                throw logic_error ( "TimedReadSocketFixture worker: 0 bytes read" );
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " after KStreamRead(" << string(localBuf, localNumRead) << ")" << endl);    
+            
+            for (size_t i = 0 ; i < localNumRead; ++i)
+                localBuf[i] = toupper(localBuf[i]);
+                
+            // send outgoing message after a pause for SERVER_WRITE_DELAY_MS 
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " sleeping for " << SERVER_WRITE_DELAY_MS << " ms" << endl);    
+            TestEnv::SleepMs(SERVER_WRITE_DELAY_MS);
+
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " writing " << localNumRead << " bytes" << endl);    
+            size_t localNumWrit;
+            THROW_ON_RC ( KStreamWrite(stream, localBuf, localNumRead, &localNumWrit) ); // localNumWrit may be 0 if the client is not reading, as in timeout cases
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " after KStreamWrite" << endl);    
+            
+            // wait until the reader says "done"
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " waiting for 'done'" << endl);    
+            THROW_ON_RC ( KStreamTimedRead(stream, localBuf, sizeof(localBuf), &localNumRead, NULL) ); // wait forever
+            
+            string doneMsg(localBuf, localNumRead);
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " after KStreamRead = '" << doneMsg << "'" << endl);    
+            if (doneMsg != "done")
+                throw logic_error ( "SocketFixture worker: out of sequence message received: '" + doneMsg + "'" );
+
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " closing stream" << endl);    
+            THROW_ON_RC ( KStreamRelease(stream) );
+            LOG(LogLevel::e_message, "worker "  << (void*)self << " after KStreamRelease" << endl);    
+        }
+        catch (const exception& ex)
+        {
+            cout << "TimedReadSocketFixture worker thread threw " << ex.what() << endl; 
+            throw;
+        }
+        LOG(LogLevel::e_message, "worker "  << (void*)self << " exiting" << endl);    
+        return KThreadRelease(self);
+    }
+
+    // for use in test cases
+    KStream* m_stream;
+    timeout_t tm;
+};
+
+////////////////////// 1. KNSManagerMakeConnection (no time-out specified), then use KStreamTimedRead/Write
+PROCESS_FIXTURE_TEST_CASE(TimedRead_NULL_Timeout, TimedReadSocketFixture, 0, 20)
+{   // 1.1. wait indefinitely until the server responds
+    string content = GetName();
+	SetupClient(content);
+	
+    REQUIRE_RC(KStreamTimedWrite(m_stream, content.c_str(), content.length(), &num, NULL)); // waits indefinitely
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    REQUIRE_RC(KStreamTimedRead(m_stream, buf, sizeof(buf), &num, NULL)); // waits indefinitely
+    LOG(LogLevel::e_message, "client after KStreamRead" << endl);    
+    REQUIRE_EQ(string(buf, num), ToUpper(content));
+    
+	TeardownClient();
+}
+
+PROCESS_FIXTURE_TEST_CASE(TimedRead_0_Timeout, TimedReadSocketFixture, 0, 20)
+{   // 1.2. time out immediately when the server has not yet responded
+    string content = GetName();
+	SetupClient(content, 0); /* no wait */
+
+    REQUIRE_RC(KStreamTimedWrite(m_stream, content.c_str(), content.length(), &num, &tm)); // returns immediately if socket is not writeable
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    rc_t rc = (KStreamTimedRead(m_stream, buf, sizeof(buf), &num, &tm)); // returns immediately if no data
+    
+    REQUIRE_RC_FAIL(rc);
+    REQUIRE_EQ(rc, RC(rcNS,rcFile,rcReading,rcTimeout,rcExhausted));
+    LOG(LogLevel::e_message, "client timed out on read, as expected" << endl);    
+
+    TestEnv::SleepMs(SERVER_WRITE_DELAY_MS * 2); // let the server wake up to handle the 'done' message
+	TeardownClient();
+}
+
+PROCESS_FIXTURE_TEST_CASE(TimedRead_Short_Timeout, TimedReadSocketFixture, 0, 20)
+{   // 1.3. time out when the server has not responded quickly enough
+    string content = GetName();
+	SetupClient(content, SERVER_WRITE_DELAY_MS / 2);
+	
+    REQUIRE_RC(KStreamTimedWrite(m_stream, content.c_str(), content.length(), &num, &tm)); // times out if socket is not writeable
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    rc_t rc = (KStreamTimedRead(m_stream, buf, sizeof(buf), &num, &tm)); // returns after timing out
+    REQUIRE_RC_FAIL(rc);
+    REQUIRE_EQ(rc, RC(rcNS,rcFile,rcReading,rcTimeout,rcExhausted));
+    LOG(LogLevel::e_message, "client timed out on read, as expected" << endl);    
+    
+    TestEnv::SleepMs(SERVER_WRITE_DELAY_MS * 2); // let the server wake up to handle the 'done' message
+	TeardownClient();
+}
+
+PROCESS_FIXTURE_TEST_CASE(TimedRead_Long_Timeout, TimedReadSocketFixture, 0, 20)
+{   // 1.4. wait enough time time for the server to respond
+    string content = GetName();
+	SetupClient(content, SERVER_WRITE_DELAY_MS * 2);
+	
+    REQUIRE_RC(KStreamTimedWrite(m_stream, content.c_str(), content.length(), &num, &tm)); // times out if socket is not writeable
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    REQUIRE_RC(KStreamTimedRead(m_stream, buf, sizeof(buf), &num, &tm)); // should not time out
+    LOG(LogLevel::e_message, "client after KStreamRead" << endl);    
+    REQUIRE_EQ(string(buf, num), ToUpper(content));
+
+	TeardownClient();
+}
+
+////////////////////// 2. KNSManagerMakeTimedConnection, then use KStreamRead/Write, or override using TimedRead/Write,
+//////////////////////      or override using KNSManagerSetConnectionTimeouts
+class TimedConnection_ReadSocketFixture : public TimedReadSocketFixture
+{   // same as TimedReadSocketFixture but creates times connections as opposed to 
+    // issuing timed reads/writes
+public:
+	void SetupClient(const string& p_content, int32_t p_readMillis, int32_t p_writeMillis)
+	{   // same as TimedReadSocketFixture::SetupClient but calls KNSManagerMakeTimedConnection instead of KNSManagerMakeConnection
+        StringInitCString(&name, SocketName.c_str());
+        if (KNSManagerInitIPCEndpoint(mgr, &ep, &name) != 0)
+			throw logic_error ( string("TimedConnection_ReadSocketFixture: SetupClient(") + p_content + "), KNSManagerInitIPCEndpoint failed" );
+    
+        m_stream = MakeStreamTimed( 5 * 1000, p_readMillis, p_writeMillis );
+        LOG(LogLevel::e_message, "client '" << p_content << "' after KNSMakeConnection" << endl);    
+	}
+
+    KStream* MakeStreamTimed( int32_t p_retryTimeout, int32_t p_readMillis, int32_t p_writeMillis  )
+    {
+        timeout_t tm;
+        TimeoutInit ( & tm, p_retryTimeout );
+
+        KSocket* socket;
+        THROW_ON_RC ( KNSManagerMakeRetryTimedConnection(mgr, &socket, &tm, p_readMillis, p_writeMillis, NULL, &ep) );
+        if (socket == 0)
+           throw logic_error ( "MakeStreamTimed: KStreamRelease failed" );
+           
+        KStream* stream;
+        THROW_ON_RC ( KSocketGetStream ( socket, & stream ) );
+        if (stream == 0)
+           throw logic_error ( "MakeStreamTimed: KStreamRelease failed" );
+        KSocketRelease ( socket );
+        
+        return stream;
+    }    
+};
+
+PROCESS_FIXTURE_TEST_CASE(TimedConnection_Read_NULL_Timeout, TimedConnection_ReadSocketFixture, 0, 20)
+{   // 2.1. wait indefinitely until the server responds
+    string content = GetName();
+	SetupClient(content, -1, -1); // wait indefinitely
+	
+    REQUIRE_RC(KStreamWrite(m_stream, content.c_str(), content.length(), &num)); 
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl); // waits indefinitely   
+    REQUIRE_EQ(content.length(), num);
+    
+    REQUIRE_RC(KStreamRead(m_stream, buf, sizeof(buf), &num)); // waits indefinitely
+    LOG(LogLevel::e_message, "client after KStreamRead" << endl);    
+    REQUIRE_EQ(string(buf, num), ToUpper(content));
+    
+	TeardownClient();
+}
+PROCESS_FIXTURE_TEST_CASE(TimedConnection_TimedReadOverride_NULL_Timeout, TimedConnection_ReadSocketFixture, 0, 20)
+{   // 2.1.1 wait indefinitely until the server responds
+    string content = GetName();
+	SetupClient(content, 0, 0); // the connection is created as no-wait
+                            // but the reads/writes override that with "wait indefinitely"
+    
+    REQUIRE_RC(KStreamTimedWrite(m_stream, content.c_str(), content.length(), &num, NULL)); // waits indefinitely
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    REQUIRE_RC(KStreamTimedRead(m_stream, buf, sizeof(buf), &num, NULL)); // waits indefinitely
+    LOG(LogLevel::e_message, "client after KStreamRead" << endl);    
+    REQUIRE_EQ(string(buf, num), ToUpper(content));
+    
+	TeardownClient();
+}
+
+PROCESS_FIXTURE_TEST_CASE(TimedConnection_Read_0_Timeout, TimedConnection_ReadSocketFixture, 0, 20)
+{   // 2.2. time out immediately when the server has not yet responded
+    string content = GetName();
+	SetupClient(content, 0, 0); /* no wait */
+
+    REQUIRE_RC(KStreamWrite(m_stream, content.c_str(), content.length(), &num)); // returns immediately if socket is not writeable
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    rc_t rc = (KStreamRead(m_stream, buf, sizeof(buf), &num)); // returns immediately if no data
+    
+    REQUIRE_RC_FAIL(rc);
+    REQUIRE_EQ(rc, RC(rcNS,rcFile,rcReading,rcTimeout,rcExhausted));
+    LOG(LogLevel::e_message, "client timed out on read, as expected" << endl);    
+    
+    TestEnv::SleepMs(SERVER_WRITE_DELAY_MS * 2); // let the server wake up to handle the 'done' message
+	TeardownClient();
+}
+PROCESS_FIXTURE_TEST_CASE(TimedConnection_ReadOverride_0_Timeout, TimedConnection_ReadSocketFixture, 0, 20)
+{   // 2.2.1 time out immediately when the server has not yet responded
+    string content = GetName();
+	SetupClient(content, -1, -1);   // the connection is created as "wait indefinitely"
+    TimeoutInit(&tm, 0);       // but the reads/writes override that with "no wait"
+
+    REQUIRE_RC(KStreamTimedWrite(m_stream, content.c_str(), content.length(), &num, &tm)); // returns immediately if socket is not writeable
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    rc_t rc = (KStreamTimedRead(m_stream, buf, sizeof(buf), &num, &tm)); // returns immediately if no data
+    
+    REQUIRE_RC_FAIL(rc);
+    REQUIRE_EQ(rc, RC(rcNS,rcFile,rcReading,rcTimeout,rcExhausted));
+    LOG(LogLevel::e_message, "client timed out on read, as expected" << endl);    
+    
+    TestEnv::SleepMs(SERVER_WRITE_DELAY_MS * 2); // let the server wake up to handle the 'done' message
+	TeardownClient();
+}
+PROCESS_FIXTURE_TEST_CASE(TimedConnection_SettingsOverride_0_Timeout, TimedConnection_ReadSocketFixture, 0, 20)
+{   // 2.2.2 time out immediately when the server has not yet responded
+    REQUIRE_RC(KNSManagerSetConnectionTimeouts(mgr, 5000, 0, 0)); // override default setting (long time-out) to "no wait"
+    string content = GetName();
+	TimedReadSocketFixture::SetupClient(content); 
+
+    REQUIRE_RC(KStreamWrite(m_stream, content.c_str(), content.length(), &num)); // returns immediately if socket is not writeable
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    rc_t rc = (KStreamRead(m_stream, buf, sizeof(buf), &num)); // returns immediately if no data
+    
+    REQUIRE_RC_FAIL(rc);
+    REQUIRE_EQ(rc, RC(rcNS,rcFile,rcReading,rcTimeout,rcExhausted));
+    LOG(LogLevel::e_message, "client timed out on read, as expected" << endl);    
+    
+    TestEnv::SleepMs(SERVER_WRITE_DELAY_MS * 2); // let the server wake up to handle the 'done' message
+	TeardownClient();
+}
+
+PROCESS_FIXTURE_TEST_CASE(TimedConnection_Read_Short_Timeout, TimedConnection_ReadSocketFixture, 0, 20)
+{   // 2.3. time out when the server has not responded quickly enough
+    string content = GetName();
+	SetupClient(content, SERVER_WRITE_DELAY_MS / 2, SERVER_WRITE_DELAY_MS / 2);
+	
+    REQUIRE_RC(KStreamWrite(m_stream, content.c_str(), content.length(), &num)); // times out if socket is not writeable
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    rc_t rc = (KStreamRead(m_stream, buf, sizeof(buf), &num)); // returns after timing out
+    REQUIRE_RC_FAIL(rc);
+    REQUIRE_EQ(rc, RC(rcNS,rcFile,rcReading,rcTimeout,rcExhausted));
+    LOG(LogLevel::e_message, "client timed out on read, as expected" << endl);    
+    
+    TestEnv::SleepMs(SERVER_WRITE_DELAY_MS * 2); // let the server wake up to handle the 'done' message
+	TeardownClient();
+}
+PROCESS_FIXTURE_TEST_CASE(TimedConnection_ReadOverride_Short_Timeout, TimedConnection_ReadSocketFixture, 0, 20)
+{   // 2.3.1. time out when the server has not responded quickly enough
+    string content = GetName();
+	SetupClient(content, -1, -1);                       // the connection is created as "wait indefinitely"
+    TimeoutInit(&tm, SERVER_WRITE_DELAY_MS / 2);    // but the reads/writes override that with a short time-out
+	
+    REQUIRE_RC(KStreamTimedWrite(m_stream, content.c_str(), content.length(), &num, &tm)); // times out if socket is not writeable
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    rc_t rc = (KStreamTimedRead(m_stream, buf, sizeof(buf), &num, &tm)); // returns after timing out
+    REQUIRE_RC_FAIL(rc);
+    REQUIRE_EQ(rc, RC(rcNS,rcFile,rcReading,rcTimeout,rcExhausted));
+    LOG(LogLevel::e_message, "client timed out on read, as expected" << endl);    
+    
+    TestEnv::SleepMs(SERVER_WRITE_DELAY_MS * 2); // let the server wake up to handle the 'done' message
+	TeardownClient();
+}
+
+PROCESS_FIXTURE_TEST_CASE(TimedConnection_Read_Long_Timeout, TimedConnection_ReadSocketFixture, 0, 20)
+{   // 2.4. wait enough time for the server to respond
+    string content = GetName();
+	SetupClient(content, SERVER_WRITE_DELAY_MS * 2, SERVER_WRITE_DELAY_MS * 2);
+	
+    REQUIRE_RC(KStreamWrite(m_stream, content.c_str(), content.length(), &num)); // times out if socket is not writeable
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    REQUIRE_RC(KStreamRead(m_stream, buf, sizeof(buf), &num)); // should not time out
+    LOG(LogLevel::e_message, "client after KStreamRead" << endl);    
+    REQUIRE_EQ(string(buf, num), ToUpper(content));
+    
+	TeardownClient();
+}
+PROCESS_FIXTURE_TEST_CASE(TimedConnection_ReadOverride_Long_Timeout, TimedConnection_ReadSocketFixture, 0, 20)
+{   // 2.4.1. wait enough time for the server to respond
+    string content = GetName();
+	SetupClient(content, 0, 0);                         // the connection is created as "no wait"
+    TimeoutInit(&tm, SERVER_WRITE_DELAY_MS * 2);    // but the reads/writes override that with a sufficient time-out
+	
+    REQUIRE_RC(KStreamTimedWrite(m_stream, content.c_str(), content.length(), &num, &tm)); // times out if socket is not writeable
+    LOG(LogLevel::e_message, "client after KStreamWrite" << endl);    
+    REQUIRE_EQ(content.length(), num);
+    
+    REQUIRE_RC(KStreamTimedRead(m_stream, buf, sizeof(buf), &num, &tm)); // should not time out
+    LOG(LogLevel::e_message, "client after KStreamRead" << endl);    
+    REQUIRE_EQ(string(buf, num), ToUpper(content));
+    
+	TeardownClient();
+}
+
+//////////////////////////////////////////// IPC, timed writes
+class TimedWriteSocketFixture : public SocketFixture
+{
+// There will be 2 IPC connections between the server and the client, a data channel and a control channel
+// The server will not read from the data channel until the client sends "go" through the control channel
+// The clients will write to the data channel until it overflows (thus setting up subsequent timed writes to wait), 
+//  then send "go" as required by the test case's logic
+public:
+    static const size_t SERVER_WRITE_DELAY_MS = 2000;
+public:
+    TimedWriteSocketFixture()
+    : m_data(0), m_control(0)
+    {
+		go = false;
+        threadWorker = TimedWriteServerFn;
+    }
+    ~TimedWriteSocketFixture()
+    {
+        
+    }
+	
+	void SetupClient(const string& p_name)
+	{
+        StringInitCString(&name, SocketName.c_str());
+        if (KNSManagerInitIPCEndpoint(mgr, &ep, &name) != 0)
+			throw logic_error ( string("TimedWriteSocketFixture: SetupClient(") + p_name + "), KNSManagerInitIPCEndpoint failed" );
+    
+        m_data = MakeStream ( 5 * 1000 );
+        m_control = MakeStream ( 5 * 1000 );
+			
+		// identify data/control channels to the server
+		WriteMessage(m_data, "data");
+		WriteMessage(m_control, "ctrl");
+        
+        LOG(LogLevel::e_message, "client '" << p_name << "' waiting for server to send 'ready'" << endl);    
+        string message = ReadMessage(m_control, 5, -1);
+        if (message != "ready")
+			throw logic_error ( "TimedWriteSocketFixture: ReadMessage('ready') failed" );
+
+        LOG(LogLevel::e_message, "client '" << p_name << "' after KNSMakeConnection" << endl);    
+	}
+    
+	void TeardownClient()
+    {
+        CloseClientStream(m_data);
+        CloseClientStream(m_control);
+    }
+    
+	static string ReadMessage(KStream* p_stream, size_t size = 0, int p_timeoutMs = -1)
+	{
+		char localBuf[MaxMessageSize];
+		size_t num;
+        timeout_t tm;
+        tm.mS = p_timeoutMs;
+		THROW_ON_RC ( KStreamTimedRead(p_stream, localBuf, size == 0 ? sizeof(localBuf) : size, &num, p_timeoutMs == -1 ? NULL : &tm) );
+		
+		return string(localBuf, num);
+	}
+	static bool TryReadMessage(KStream* p_stream)
+	{
+		char localBuf[MaxMessageSize];
+		size_t num;
+        timeout_t tm;
+        tm.mS = 1000; 
+		return KStreamTimedRead(p_stream, localBuf, sizeof(localBuf), &num, &tm) == 0;
+	}
+	static rc_t WriteMessage(KStream* p_stream, const string& p_msg, int p_timeoutMs = -1)
+	{
+		size_t num;
+        timeout_t tm;
+        tm.mS = p_timeoutMs;
+        LOG(LogLevel::e_message, "WriteMessage, timeout=" << p_timeoutMs << "ms" << endl);    
+		return KStreamTimedWrite(p_stream, p_msg.c_str(), p_msg.size(), &num, p_timeoutMs == -1 ? NULL : &tm);
+	}
+
+	static volatile bool go;
+    static rc_t TimedWriteServerFn ( const KThread *self, void *data )  
+    {
+        // this function does not always exit, so using STL string in this function leads to occasional leaks.
+        // for this reason, C strings are used for local variables (STL temporaries seems to be ok)
+        char prefix[1024];
+        string_printf ( prefix, sizeof prefix, NULL, "TimedWriteSocketFixture worker %p: ", (void*)self );
+        
+        try
+        {
+            KStream* stream = (KStream*)data;
+            
+            // local STL string here leaks somehow; use C string for now
+			// string message = ReadMessage(stream, 4, 1000);
+            char message[MaxMessageSize];
+            size_t num;
+            timeout_t tm;
+            tm.mS = 1000;
+            THROW_ON_RC ( KStreamTimedRead(stream, message, 4, &num, &tm) );
+            
+            LOG(LogLevel::e_message, (string(prefix) + " after KStreamRead(" + message + ")\n"));    
+			if (string(message, num) == "data")
+			{	// from now on, wait until control thread allows us to read
+                LOG(LogLevel::e_message, "data thread waiting for 'go'\n");
+				while (!go)
+				{
+                    LOG(LogLevel::e_message, "data thread waiting for 'go'\n");
+					TestEnv::SleepMs(1);
+				}
+                LOG(LogLevel::e_message, "data thread received 'go'\n");
+                // consume the input messages and go away
+                LOG(LogLevel::e_message, "un-flooding data channel\n");
+                size_t every=0;
+				while (TryReadMessage(stream))
+                {
+                    if (every == 0) 
+                    {
+                        LOG(LogLevel::e_message, "still un-flooding data channel...\n");
+                        every=5000;
+                    }
+                    else
+                        --every;
+				}
+                LOG(LogLevel::e_message, "data thread complete\n");
+            }
+			else if (string(message, num) == "ctrl")
+			{	// when received "go", allow the data thread to read
+                WriteMessage(stream, "ready", -1);
+            
+				while (true)
+				{
+					string ctrlMessage = ReadMessage(stream, 4, 10000);
+					if (ctrlMessage == "gogo")
+                    {
+                        LOG(LogLevel::e_message, "control thread received 'gogo'\n");
+						go = true;
+                    }
+					else if (ctrlMessage == "done")
+					{
+                        LOG(LogLevel::e_message, "control thread received 'done'\n");
+						break;
+					}
+				}
+                LOG(LogLevel::e_message, "control thread complete\n");
+			}
+			else
+                throw logic_error ( string(prefix) + "unexpected message\n" );
+				
+			THROW_ON_RC ( KStreamRelease(stream) );
+		}
+        catch (const exception& ex)
+        {
+            cout << (string(prefix) + "threw " + ex.what() +"\n"); 
+            throw;
+        }
+        catch (...)
+        {
+            cout << (string(prefix) + "threw something\n"); 
+            throw;
+        }
+        LOG(LogLevel::e_message, (string(prefix) + " exiting\n"));  
+        return KThreadRelease(self);
+    }
+
+    // for use in test cases (=client code)
+	void FloodDataChannel()
+	{
+        LOG(LogLevel::e_message, "flooding" << endl);    
+		char localBuf[MaxMessageSize];
+        memset(localBuf, 0xab, sizeof(localBuf)); // to keep valgrind happy
+		size_t num;
+        struct timeout_t tm;
+        tm.mS = 0; /* do not wait */
+		while (true)
+		{
+			LOG(LogLevel::e_message, "writing " << MaxMessageSize << " bytes\n");    
+			rc_t rc = KStreamTimedWrite(m_data, localBuf, sizeof(localBuf), &num, &tm);
+			if (rc != 0)
+			{
+				LOG(LogLevel::e_message, "KStreamWrite failed - flooding complete\n");    
+				break;
+			}
+			if (num != sizeof(localBuf))
+			{
+				LOG(LogLevel::e_message, "written " << num << " bytes, expected " << sizeof(localBuf) << endl);    
+				break;
+			}
+		}
+	}
+	
+    KStream* m_data;
+    KStream* m_control;
+};
+
+volatile bool TimedWriteSocketFixture::go = false;
+
+//  1. flood the socket, see KStreamTimedWrite time out
+PROCESS_FIXTURE_TEST_CASE(TimedWrite_Short_Timeout, TimedWriteSocketFixture, 0, 20)
+{   
+	SetupClient(GetName());
+	FloodDataChannel(); // the last WriteMessage(data) failed since nobody is reading from the server side
+    
+    /* important: attempt to write at least as many bytes as a block used by FloodDataChannel , otherwise this write has a chance to succeed */
+	rc_t rc = WriteMessage(m_data, string(MaxMessageSize, 'z'), 0);  /* do not wait */
+    REQUIRE_RC_FAIL(rc);
+    REQUIRE_EQ(rc, RC(rcNS,rcFile,rcWriting,rcTimeout,rcExhausted));
+    
+	REQUIRE_RC(WriteMessage(m_control, "gogo", 0)); // signal the server to start reading
+    // the data channel is no longer flooded; give the server time to empty the pipe and finish
+    TestEnv::SleepMs(100);
+    
+    TeardownClient();
+}
+
+//  2. flood the socket, see KStreamTimedWrite wait indefinitely
+PROCESS_FIXTURE_TEST_CASE(TimedWrite_NULL_Timeout, TimedWriteSocketFixture, 0, 20)
+{
+	SetupClient(GetName());
+	FloodDataChannel(); // the last WriteMessage(data) failed since nobody is reading from the server side
+    
+	REQUIRE_RC(WriteMessage(m_control, "gogo", 0)); // signal the server to start reading
+
+	REQUIRE_RC(WriteMessage(m_data, "something", -1)); // this should wait for the server to un-flood the data channel
+
+    // the data channel is no longer flooded; give the server time to empty the pipe and finish
+    TestEnv::SleepMs(100);
+
+    TeardownClient();
+}
+
+//  TODO: KStreamReadAll, KStreamTimedReadAll, 
+//	TODO: KStreamWriteAll, KStreamTimedWriteAll, 
+
+//  TODO: KStreamReadExactly, KStreamTimedReadExactly
+//  TODO: KStreamWriteExactly, KStreamTimedWriteExactly
+
+//////////////////////////////////////////// Main
+
+static rc_t argsHandler(int argc, char * argv[]) {
+    Args * args = NULL;
+    rc_t rc = ArgsMakeAndHandle(&args, argc, argv, 0, NULL, 0);
+    ArgsWhack(args);
+    return rc;
+}
+
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+#include <klib/debug.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+const char UsageDefaultName[] = "test-kns";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+
+	// uncomment to see messages from socket code
+    // KDbgSetModConds ( DBG_KNS, DBG_FLAG ( DBG_KNS_SOCKET ), DBG_FLAG ( DBG_KNS_SOCKET ) );
+
+	// this makes messages from the test code appear
+	// (same as running the executable with "-l=message")
+	//TestEnv::verbosity = LogLevel::e_message;
+	
+    rc_t rc=KnsTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/kns/nih_1_out.txt b/test/kns/nih_1_out.txt
new file mode 100644
index 0000000..50fca93
--- /dev/null
+++ b/test/kns/nih_1_out.txt
@@ -0,0 +1,277 @@
+HTTP/1.1 200 OK
+Date: Mon, 06 May 2013 20:06:38 GMT
+Server: Apache
+Cache-Control: private
+NCBI-SID: CE8903371880D4E1_0008SID
+Content-Type: text/html; charset=UTF-8
+Set-Cookie: ncbi_sid=CE8903371880D4E1_0008SID; domain=.nih.gov; path=/; expires=Tue, 06 May 2014 20:06:38 GMT
+Set-Cookie: WebEnv=1leg_Y%40CE8903371880D4E1_0008SID; domain=.nlm.nih.gov; path=/; expires=Tue, 07 May 2013 04:06:39 GMT
+Vary: Accept-Encoding
+Transfer-Encoding: chunked
+
+1d76
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head xmlns:xi="http://www.w3.org/2001/XInclude"><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <!-- meta -->
+    <meta name="robots" content="index,nofollow,noarchive" />
+<meta name="ncbi_app" content="entrez" /><meta name="ncbi_db" content="biosample" /><meta name="ncbi_op" content="page_view" /><meta name="ncbi_pdid" content="home" /><meta name="ncbi_sessionid" content="CE8903371880D4E1_0008SID" /><meta name="ncbi_stat" content="false" /><meta name="ncbi_hitstat" content="false" />
+
+    
+    <!-- title -->
+    <title>Home - BioSample - NCBI</title>
+    
+    <!-- Common JS and CSS -->
+    
+		<script type="text/javascript">
+		    var ncbi_startTime = new Date();
+		</script>
+		<script type="text/javascript" src="//static.pubmed.gov/core/jig/1.12.1/js/jig.min.js"></script>
+			
+				<script type="text/javascript" src="/core/lw/2.0/js/esummary.1.js"></script>
+            
+		  
+    
+    <link xmlns="http://www.w3.org/1999/xhtml" type="text/css" rel="stylesheet" href="//static.pubmed.gov/portal/portal3rc.fcgi/3837828/css/3811509/3579733.css" xml:base="http://127.0.0.1/sites/static/header_footer/" /><link xmlns="http://www.w3.org/1999/xhtml" type="text/css" rel="stylesheet" href="//static.pubmed.gov/portal/portal3rc.fcgi/3837828/css/3529739.css" media="print" xml:base="http://127.0.0.1/sites/static/header_footer/" />    
+<link rel="shortcut icon" href="//www.ncbi.nlm.nih.gov/favicon.ico" /><meta name="ncbi_phid" content="CE8903371880D431000000000008E0A9" /><script type="text/javascript"><!--
+var ScriptUrl = 'http://www.ncbi.nlm.nih.gov/biosample';
+var ScriptPath = '/portal/';
+var objHierarchy = {"name":"EntrezSystem2","type":"Layout","realname":"EntrezSystem2",
+"children":[{"name":"EntrezSystem2.PEntrez","type":"Cluster","realname":"EntrezSystem2.PEntrez",
+"children":[{"name":"EntrezSystem2.PEntrez.DbConnector","type":"Portlet","realname":"EntrezSystem2.PEntrez.PEntrez.DbConnector","shortname":"DbConnector"},
+{"name":"EntrezSystem2.PEntrez.ParamContainer","type":"Portlet","realname":"EntrezSystem2.PEntrez.PEntrez.ParamContainer","shortname":"ParamContainer"},
+{"name":"EntrezSystem2.PEntrez.MyNcbi","type":"Portlet","realname":"EntrezSystem2.PEntrez.PEntrez.MyNcbi","shortname":"MyNcbi"},
+{"name":"EntrezSystem2.PEntrez.UserPreferenceUrlParamContainer","type":"Portlet","realname":"EntrezSystem2.PEntrez.PEntrez.UserPreferenceUrlParamContainer","shortname":"UserPreferenceUrlParamContainer"},
+{"name":"EntrezSystem2.PEntrez.GridProperty","type":"Portlet","realname":"EntrezSystem2.PEntrez.PEntrez.GridProperty","shortname":"GridProperty"},
+{"name":"EntrezSystem2.PEntrez.BioSample","type":"Cluster","realname":"EntrezSystem2.PEntrez.BioSample",
+"children":[{"name":"EntrezSystem2.PEntrez.BioSample.NoPortlet","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.NoPortlet","shortname":"NoPortlet"},
+{"name":"EntrezSystem2.PEntrez.BioSample.BioSample_PageController","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.BioSample_PageController","shortname":"BioSample_PageController"},
+{"name":"EntrezSystem2.PEntrez.BioSample.Entrez_SearchBar","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.Entrez_SearchBar","shortname":"Entrez_SearchBar"},
+{"name":"EntrezSystem2.PEntrez.BioSample.Entrez_BotRequest","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.Entrez_BotRequest","shortname":"Entrez_BotRequest"},
+{"name":"EntrezSystem2.PEntrez.BioSample.BioSample_LimitsTab","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.BioSample_LimitsTab","shortname":"BioSample_LimitsTab"},
+{"name":"EntrezSystem2.PEntrez.BioSample.Entrez_Facets","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.Entrez_Facets","shortname":"Entrez_Facets"},
+{"name":"EntrezSystem2.PEntrez.BioSample.Entrez_Clipboard","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.Entrez_Clipboard","shortname":"Entrez_Clipboard"},
+{"name":"EntrezSystem2.PEntrez.BioSample.BioSample_StaticParts","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.BioSample_StaticParts","shortname":"BioSample_StaticParts"},
+{"name":"EntrezSystem2.PEntrez.BioSample.Entrez_Messages","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.Entrez_Messages","shortname":"Entrez_Messages"},
+{"name":"EntrezSystem2.PEntrez.BioSample.NcbiJSCheck","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.NcbiJSCheck","shortname":"NcbiJSCheck"},
+{"name":"EntrezSystem2.PEntrez.BioSample.NCBIFooter_dynamic","type":"Cluster","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.NCBIFooter_dynamic",
+"children":[{"name":"EntrezSystem2.PEntrez.BioSample.NCBIFooter_dynamic.NCBIBreadcrumbs","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.NCBIFooter_dynamic.NCBIBreadcrumbs","shortname":"NCBIBreadcrumbs"},
+{"name":"EntrezSystem2.PEntrez.BioSample.NCBIFooter_dynamic.NCBIHelpDesk","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.NCBIFooter_dynamic.NCBIHelpDesk","shortname":"NCBIHelpDesk"},
+{"name":"EntrezSystem2.PEntrez.BioSample.NCBIFooter_dynamic.NCBIApplog_NoScript_Ping","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.NCBIFooter_dynamic.NCBIApplog_NoScript_Ping","shortname":"NCBIApplog_NoScript_Ping"}]},
+{"name":"EntrezSystem2.PEntrez.BioSample.BrowserCheck","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.Entrez_Database.BrowserCheck","shortname":"BrowserCheck"},
+{"name":"EntrezSystem2.PEntrez.BioSample.BioSample_HomePage","type":"Cluster","realname":"EntrezSystem2.PEntrez.BioSample.BioSample_HomePage",
+"children":[{"name":"EntrezSystem2.PEntrez.BioSample.BioSample_HomePage.BioSample_HomePageContent","type":"Portlet","realname":"EntrezSystem2.PEntrez.BioSample.BioSample_HomePage.BioSample_HomePageContent","shortname":"BioSample_HomePageContent"}]}]}]}]};
+--></script><link type="text/css" rel="stylesheet" href="//static.pubmed.gov/portal/portal3rc.fcgi/3865237/css/3808861/3475386/3841922/3751656/3395415/3316/3609340/14534/3762635/3721621/3858027/12930/3858295/3327743/31867/3734262/3767044/3317918/61817.css" /><link type="text/css" rel="stylesheet" href="//static.pubmed.gov/portal/portal3rc.fcgi/3865237/css/3501913/3529739.css" media="print" /><script type="text/javascript">
+
+var ObjectLinks=[{i:0, ename: "p$ExL", esid:"*", sname: "p$ExL", ssid:"*", dname:"p$el", dsid:"0",m:"CopyValue",p:[],f: function(src, dst) {fn_CopyValue(src, dst);}}]
+
+
+var ActiveNames = {"p$ExL":1, "EntrezSystem2.PEntrez.BioSample.BioSample_PageController.PreviousPageName":0, "EntrezSystem2.PEntrez.DbConnector.Cmd":0, "EntrezSystem2.PEntrez.DbConnector.Db":0, "EntrezSystem2.PEntrez.DbConnector.IdsFromResult":0, "EntrezSystem2.PEntrez.DbConnector.LastDb":0, "EntrezSystem2.PEntrez.DbConnector.LastIdsFromResult":0, "EntrezSystem2.PEntrez.DbConnector.LastQueryKey":0, "EntrezSystem2.PEntrez.DbConnector.LastTabCmd":0, "EntrezSystem2.PEntrez.DbConnector.LinkN [...]
+</script></head>
+    <b
+28a
+ody>
+    	<div class="grid">
+			<div class="col twelve_col nomargin shadow">
+				<form enctype="application/x-www-form-urlencoded" name="EntrezForm" method="post" onsubmit="return false;" action="/biosample" id="EntrezForm">
+					<div xmlns:xi="http://www.w3.org/2001/XInclude">
+    <!-- no javascript message -->
+    <noscript>
+	<p class="nojs">
+	<strong>Warning:</strong>
+	The NCBI web site requires JavaScript to function. 
+	<a href="http://www.ncbi.nlm.nih.gov/corehtml/query/static/unsupported-browser.html#enablejs" title="Learn how to enable JavaScript" target="_blank">more...</a>
+	</p>
+	</noscript>
+    
+    <div xmlns="http://www.w3.org/199
+169a
+9/xhtml" class="universal_header" id="universal_header" xml:base="http://127.0.0.1/sites/static/header_footer/"><ul class="inline_list jig-ncbimenu ui-ncbimenu resources_list" id="navcontent"><li class="ui-ncbimenu-item-leaf ui-ncbimenu-item-first ui-helper-reset ui-ncbimenu-item-no-hlt"><a class="ui-ncbimenu-link-first" href="/" role="banner" title="NCBI Home" id="ncbihome" accesskey="1"><span class="offscreen_noflow">NCBI</span><img src="//static.pubmed.gov/portal/portal3rc.fcgi/383782 [...]
+                        content</a></li><li class="offscreen_noflow ui-ncbimenu-item-skip access"><a href="#navcontent" title="Skip to the navigation" tabindex="0" accesskey="4">Skip to
+                        navigation</a></li><li id="resource-menu" class="topmenu ui-helper-reset ui-ncbimenu-item-first ui-helper-reset"><a class="ui-ncbimenu-first-link-has-submenu ui-ncbimenu-link-first topanchor" href="/guide/all/">Resources</a><ul id="resources-submenu"><li><a href="/guide/all/">All Resources</a></li><li><a href="#chemicals-bioassays">Chemicals & Bioassays</a><ul class="actual-resources-submenu chemicals-bioassays"><li><a href="/biosystems/" title=" Database that [...]
+966
+GenBank: BankIt</a></li><li><a href="/projects/Sequin" title=" Software tool for complex submissions of nucleotide sequences ">GenBank: Sequin</a></li><li><a href="/genbank/tbl2asn2.html" title=" Command-line program for submitting sequence data ">GenBank: tbl2asn</a></li><li><a href="/sutils/protmap.cgi" title=" Maps proteins from a COG/VOG back to its genome ">Genome ProtMap</a></li><li><a href="/projects/gbench/" title=" Stand-alone application for analyzing sequence data ">Genome Wor [...]
+12da
+tural alignments ">Vector Alignment Search Tool (VAST)</a></li><li><a href="/guide/domains-structures/">All Domains & Structures Resources...</a></li></ul></li><li><a href="#genes-expression">Genes & Expression</a><ul class="actual-resources-submenu genes-expression"><li><a href="/biosystems/" title=" Database that groups biomedical literature, small molecules, and sequence data in terms of biological relationships. ">BioSystems</a></li><li><a href="/gap" title=" Genotype/Phenoty [...]
+5a8
+quence Read Archive (SRA)</a></li><li><a href="/sutils/splign" title=" Tool for aligning transcripts to genomic DNA ">Splign</a></li><li><a href="/Traces/trace.cgi" title=" DNA chromatograms, base calls, and quality estimates for single-pass reads. ">Trace Archive</a></li><li><a href="/unists" title=" Database of Sequence Tagged Sites ">UniSTS</a></li><li><a href="/guide/genomes-maps/">All Genomes & Maps Resources...</a></li></ul></li><li><a href="#homology">Homology</a><ul class="ac [...]
+77e
+e" title=" Sets of homologous eukaryotic genes ">HomoloGene</a></li><li><a href="/proteinclusters" title=" Clusters of related proteins from prokaryotes and organelles ">Protein Clusters</a></li><li><a href="/guide/homology/">All Homology Resources...</a></li></ul></li><li><a href="#literature">Literature</a><ul class="actual-resources-submenu literature"><li><a href="/books" title=" Online biomedical books ">Bookshelf</a></li><li><a href="/books/NBK25501/ " title=" URL application progr [...]
+5a2
+sequence similarity ">BLAST (Basic Local Alignment Search Tool)</a></li><li><a href="http://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Web&PAGE_TYPE=BlastDocs&DOC_TYPE=Download" title=" BLAST programs for a local computer ">BLAST (Stand-alone)</a></li><li><a href="/sutils/blink.cgi?mode=query" title=" Pre-computed reports showing proteins with similar sequences ">BLAST Link (BLink)</a></li><li><a href="/cdd" title=" Database of conserved protein domains represented by multiple sequence [...]
+5a8
+nce Analysis</a><ul class="actual-resources-submenu sequence-analysis"><li><a href="http://blast.ncbi.nlm.nih.gov" title=" Tool for finding local regions of sequence similarity ">BLAST (Basic Local Alignment Search Tool)</a></li><li><a href="http://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Web&PAGE_TYPE=BlastDocs&DOC_TYPE=Download" title=" BLAST programs for a local computer ">BLAST (Stand-alone)</a></li><li><a href="/sutils/blink.cgi?mode=query" title=" Pre-computed reports showing p [...]
+5a8
+analysis/">All Sequence Analysis Resources...</a></li></ul></li><li><a href="#taxonomy">Taxonomy</a><ul class="actual-resources-submenu taxonomy"><li><a href="/taxonomy" title=" The NCBI taxonomy tree in Entrez ">Taxonomy</a></li><li><a href="/Taxonomy/Browser/wwwtax.cgi?mode=Root" title=" Displays and links Entrez data to each taxonomic node ">Taxonomy Browser</a></li><li><a href="/Taxonomy/CommonTree/wwwcmt.cgi" title=" Creates custom taxonomic trees ">Taxonomy Common Tree</a></li><li> [...]
+5a8
+ctural variation ">Database of Genomic Structural Variation (dbVar)</a></li><li><a href="/gap" title=" Genotype/Phenotype association studies ">Database of Genotypes and Phenotypes (dbGaP)</a></li><li><a href="/snp" title=" Database of nucleotide sequence polymorphisms ">Database of Single Nucleotide Polymorphisms (dbSNP)</a></li><li><a href="http://www.ncbi.nlm.nih.gov/projects/SNP" title=" The SNP database tools page provides links to the general submission guidelines and to the submis [...]
+5a8
+#howtos">Homology</a></li><li><a href="/guide/literature/#howtos">Literature</a></li><li><a href="/guide/proteins/#howtos">Proteins</a></li><li><a href="/guide/sequence-analysis/#howtos">Sequence Analysis</a></li><li><a href="/guide/taxonomy/#howtos">Taxonomy</a></li><li><a href="/guide/training-tutorials/#howtos">Training & Tutorials</a></li><li><a href="/guide/variation/#howtos">Variation</a></li></ul></li><li class="offscreen_noflow ui-ncbimenu-item-skip access"><a href="/guide/br [...]
+    
+    <div class="header">
+    <!-- logo -->
+    <div class="res_logo"><h1 class="res_name"><a href="/biosample">BioSample</a></h1>
+				<h2 class="res_tagline">National Center for Biotechnology Information</h2></div>
+    <!-- SearchBar -->
+    <div class="search"><div class="search_form"><label for="database" class="offscreen_noflow">Search database</label><select id="database"><option value="gquery">All Databases</option><option value="assembly">Assembly</option><
+3be
+option value="bioproject">BioProject</option><option value="biosample" selected="selected">BioSample</option><option value="biosystems">BioSystems</option><option value="books">Books</option><option value="clinvar">ClinVar</option><option value="clone">Clone</option><option value="cdd">Conserved Domains</option><option value="gap">dbGaP</option><option value="dbvar">dbVar</option><option value="epigenomics">Epigenomics</option><option value="nucest">EST</option><option value="gene">Gene< [...]
+12da
+"nuccore">Nucleotide</option><option value="omia">OMIA</option><option value="omim">OMIM</option><option value="pmc">PMC</option><option value="popset">PopSet</option><option value="probe">Probe</option><option value="protein">Protein</option><option value="proteinclusters">Protein Clusters</option><option value="pcassay">PubChem BioAssay</option><option value="pccompound">PubChem Compound</option><option value="pcsubstance">PubChem Substance</option><option value="pubmed" data-ac_dict=" [...]
+</div>   
+    <input name="EntrezSystem2.PEntrez.BioSample.BioSample_PageController.PreviousPageName" sid="1" type="hidden" value="home" />
+    <div id="maincontent" class="twelve_col col last">
+    <div class="content">
+        <div id="messagearea" class="empty">
+            <div class="error"><div class="browsername">We are sorry, but NCBI web applications do not support your browser and may not function properly.  <a href="/guide/browsers">More information</a></div></div>
+            <ul id="msgportlet" class="messages"></ul>
+            
+        </div>
+        
+        <div>
+    <div><div class="dbheader"><div class="headerimage"></div><div class="headerintro"><h1>BioSample</h1><div class="dbdescription">The BioSample database contains descriptions of biological source materials used in experimental assays.</div></div></div><div class="tier firsttier"><div class="onecol"><div class="firsttier_portlet"><div class="portlet_head"><h2>Using BioSample</h2></div><div class="portlet_content"><ul><li><a href="/books/NBK3837/">Help</a></li><li><a href="https://submit [...]
+    <div class="tier">
+    <!-- 
+    for two one-column width portlets
+    <div class="onecol">
+        <component id="MyHomePagePortlet1" />
+    </div>
+    <div class="onecol lastcol">
+        <component id="MyHomePagePortlet2" />
+    </div>
+    -->
+</div>
+    
+    
+</div>        
+    </div>
+</div>
+    
+    <div id="NCBIFooter_dynamic">
+    <div class="breadcrumbs">You are here: 
+            <span id="breadcrumb_text"><a href="/guide/">NCBI</a>
+                        > <a href="http://www.ncbi.nlm.nih.gov/guide/dna-rna/">DNA & RNA</a>
+                        
+                        > BioSample</span></div>
+    <a id="help-desk-link" class="help_desk" target="_blank" href="/sites/ehelp?&Ncbi_App=entrez&Db=biosample&Page=home&Snapshot=/projects/Sequences/SeqDb at 1.4&Time=2013-05-06T16:06:39-04:00&Host=portal102&Data=JiraApp:BSH;%20NCBI_Phid:CE8903371880D431000000000008E0A9;%20PageURL:http://www.ncbi.nlm.nih.gov/biosample;" onclick="window.open('/sites/ehelp?&Ncbi_App=entrez&Db=biosample&Page=home&Snapshot=/projects/Sequences/SeqDb at 1.4&Time=2013-0 [...]
+d26
+bar=no,top=50,left=200,width=720,height=695');return false;">Write to the Help
+            Desk</a>
+    <noscript><img alt="" src="/stat?jsdisabled=true&ncbi_app=entrez&ncbi_db=biosample&ncbi_pdid=home&ncbi_phid=CE8903371880D431000000000008E0A9" /></noscript>
+</div>
+
+    <div xmlns="http://www.w3.org/1999/xhtml" class="footer" id="footer" xml:base="http://127.0.0.1/sites/static/header_footer/">
+    <!--    <div class="breadcrumbs">You are here: <span id="breadcrumb_text"><a href="#">NCBI</a></span></div>
+        <a id="help-desk-link" class="help_desk" target="_blank">Help Desk</a>-->
+    <div class="subfooter">
+        <h2 class="offscreen_noflow">Simple NCBI Directory</h2>
+        <ul class="foot_list" id="getting_started">
+            <li><h3>Getting Started</h3></li>
+            <!-- removed; hp-250           <li><a href="/guide/all/">Site Map</a></li>-->
+            <li><a href="/Education/">NCBI Education</a></li>
+            <li><a href="/books/NBK3831/">NCBI Help Manual</a></li>
+            <li><a href="/books/NBK21101/">NCBI Handbook</a></li>
+            <li><a href="/guide/training-tutorials/">Training & Tutorials</a></li>
+        </ul>
+        <!-- this section is re-written by an XSLT before output -->
+        <ul class="foot_list" id="resources">
+            <li><h3>Resources</h3></li>
+            <!-- fill this in with categories -->
+        <li><a href="/guide/chemicals-bioassays">Chemicals & Bioassays</a></li><li><a href="/guide/data-software">Data & Software</a></li><li><a href="/guide/dna-rna">DNA & RNA</a></li><li><a href="/guide/domains-structures">Domains & Structures</a></li><li><a href="/guide/genes-expression">Genes & Expression</a></li><li><a href="/guide/genetics-medicine">Genetics & Medicine</a></li><li><a href="/guide/genomes-maps">Genomes & Maps</a></li><li><a href="/guide/h [...]
+        
+        <ul class="foot_list" id="popular">
+            <li><h3>Popular</h3></li>
+            <li><a href="/pubmed/">PubMed</a></li>
+            <li><a href="/nucleotide/">Nucleotide</a></li>
+            <li><a href="http://blast.ncbi.nlm.nih.gov/">BLAST</a></li>
+            <li><a href="http://www.pubmedcentral.nih.gov/" class="newdomain">PubMed Central</a></li>
+            <li><a href="/gene/">Gene</a></li>
+            <li><a href="/books/">Bookshelf</a></li>
+            <li><a href="/protein/">Protein</a></li>
+            <li><a href="/omim/">OMIM</a></li>
+            <li><a href="/genome/">Genome</a></li>
+            <li><a href="/snp/">SNP</a></li>
+            <li><a href="/Structure/">Structure</a></li>
+        </ul>
+        <ul class="foot_list" id="featured">
+            <li><h3>Featured</h3></li>
+            <li><a href="/gtr/">Genetic Testing Registry</a></li>
+            <li><a href="/pubmedhealth/">PubMed Health</a></li>
+            <li><a href="/Genbank/">GenBank</a></li>
+            <li><a href="/refseq/">Reference Sequences</a></li>
+            <li><a href="/mapview/">Map Viewer<
+14bd
+/a></li>
+            <li><a href="/genome/guide/human/">Human Genome</a></li>
+            <li><a href="/genome/guide/mouse/">Mouse Genome</a></li>
+            <li><a href="/genomes/FLU/">Influenza Virus</a></li>
+            <li><a href="/tools/primer-blast/">Primer-BLAST</a></li>
+            <li><a href="/Traces/sra/">Sequence Read Archive</a></li>
+        </ul>
+        <ul class="foot_list" id="info">
+            <li><h3>NCBI Information</h3></li>
+            <li><a href="/About/">About NCBI</a></li>
+            <li><a href="/research/">Research at NCBI</a></li>
+            <li><a href="/books/NBK1969/">NCBI Newsletter</a></li>
+            <li><a href="/Ftp/">NCBI FTP Site</a></li>
+            <li><a class="external" href="http://www.facebook.com/ncbi.nlm">NCBI on Facebook</a></li>
+            <li><a class="external" href="http://www.twitter.com/ncbi">NCBI on Twitter</a></li>
+            <li><a class="external" href="http://www.youtube.com/ncbinlm">NCBI on YouTube</a></li>
+        </ul>
+    </div>
+    <div id="external-disclaimer" class="offscreen_noflow">
+        External link. Please review our <a href="http://www.nlm.nih.gov/privacy.html">privacy policy</a>.
+    </div>    
+    <div id="ncbifooter" class="contact_info">      
+        <div id="footer-contents-right">
+            <div id="nlm_thumb_logo">
+                <a href="http://www.nlm.nih.gov" title="NLM">NLM</a>
+            </div>
+            <div id="nih_thumb_logo">
+                <a href="http://www.nih.gov" title="NIH">NIH</a>
+            </div>
+            <div id="hhs_thumb_logo">
+                <a href="http://www.dhhs.gov" title="DHHS">DHHS</a>
+            </div>
+            <div id="usagov_thumb_logo">
+                <a href="http://www.usa.gov" title="USA.gov">USA.gov</a>
+            </div>         
+        </div>
+        
+        <div id="footer-contents-left">
+            
+            <a href="/About/disclaimer.html">Copyright</a> | <a href="/About/disclaimer.html#disclaimer">Disclaimer</a> |
+            <a href="http://www.nlm.nih.gov/privacy.html" class="newdomain">Privacy</a> | 
+            <a href="/guide/browsers/">Browsers</a> | <a href="http://www.nlm.nih.gov/accessibility.html">Accessibility</a> | <a href="/About/glance/contact_info.html">Contact</a>
+            <p class="address vcard">
+                <span class="url">
+                    <a class="fn url newdomain" href="http://www.ncbi.nlm.nih.gov">National Center for
+                        Biotechnology Information</a>,
+                </span> <span class="org url"><a href="http://www.nlm.nih.gov/">U.S. National Library of Medicine</a></span>
+                <span class="adr">
+                    <span class="street-address">8600 Rockville Pike</span>, <span class="locality">Bethesda</span>
+                    <span class="region">MD</span>, <span class="postal-code">20894</span>
+                    <span class="country-name">USA</span>
+                </span>
+            </p>
+        </div>
+    </div>
+    <script type="text/javascript" src="/portal/portal3rc.fcgi/rlib/js/InstrumentOmnitureBaseJS/InstrumentNCBIBaseJS/InstrumentPageStarterJS.js?v=1"> </script>    
+    <script type="text/javascript" src="/portal/portal3rc.fcgi/static/js/hfjs.js"> </script>
+</div>
+
+</div>
+					<div><input name="EntrezSystem2.PEntrez.DbConnector.Db" sid="1" type="hidden" value="biosample" /><input name="EntrezSystem2.PEntrez.DbConnector.LastDb" sid="1" type="hidden" value="biosample" /><input name="EntrezSystem2.PEntrez.DbConnector.Term" sid="1" type="hidden" value="" /><input name="EntrezSystem2.PEntrez.DbConnector.LastTabCmd" sid="1" type="hidden" value="" /><input name="EntrezSystem2.PEntrez.DbConnector.LastQueryKey" sid="1" type="hidden" value="" /><input name="EntrezS [...]
+				<input type="hidden" name="p$a" id="p$a" /><input type="hidden" name="p$l" id="p$l" value="EntrezSystem2" /><input type="hidden" name="p$st" id="p$st" value="biosample" /><input name="SessionId" id="SessionId" value="CE8903371880D4E1_0008SID" disabled="disabled" type="hidden" /><input name="Snapshot" id="Snapshot" value="/projects/Sequences/SeqDb at 1.4" disabled="disabled" type="hidden" /></form>
+			</div>
+		</div>
+    
+
+<!-- CE8903371880D4E1_0008SID /projects/Sequences/SeqDb at 1.4 portal102 v3.5.1.r392364: Mon, Mar 25 2013 15:07:09 -->
+
+
+<script type='text/javascript' src='/portal/js/portal.js?v3%2E5%2E1%2Er392364%3A+Mon%2C+Mar+25+2013+15%3A07%3A09'></script><script type="text/javascript" src="//static.pubmed.gov/portal/portal3rc.fcgi/3865237/js/3812534/3865793/3812535/3857406/3812291/3805553/3844708/3728312/3783853.js" snapshot="biosample"></script></body>
+</html>
+0
+
diff --git a/test/kns/test-proxy-with-env.cpp b/test/kns/test-proxy-with-env.cpp
new file mode 100644
index 0000000..1c67958
--- /dev/null
+++ b/test/kns/test-proxy-with-env.cpp
@@ -0,0 +1,112 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfs/directory.h> /* KDirectoryRelease */
+#include <ktst/unit_test.hpp> // TEST_SUITE
+
+#include "TestProxy.hpp" // TestProxy
+
+#include <fstream> // ifstream
+#include <sstream> // ostringstream
+
+using std :: ifstream;
+using std :: istringstream;
+using std :: ostringstream;
+using std :: string;
+
+TEST_SUITE ( ProxyWithEnvTestSuite );
+
+TEST_CASE ( TEST_PROXY_FROM_ENV ) {
+    ncbi :: NK :: TestRunner * t ( ncbi :: NK :: GetTestSuite () );
+    assert ( t );
+    REQUIRE_GT ( t -> argc, 1 );
+    assert ( t -> argv );
+    assert ( t -> argv [ 1 ] );
+    const char * testcase ( t -> argv [ 1 ] );
+    REQUIRE ( testcase );
+    C * c = NULL;
+    {
+        ostringstream s;
+        s << testcase << "/config";
+        ifstream myfile ( s . str () . c_str () );
+        string line;
+        while ( getline ( myfile, line) ) {
+            istringstream s ( line );
+            string path, value;
+            s >> path >> value;
+            if ( c == NULL ) {
+                c = new C ( path, value );
+            } else {
+                c -> add ( path, value );
+            }
+        }
+    }
+    E * e = NULL;
+    {
+        ostringstream s;
+        s << testcase << "/expected";
+        ifstream myfile ( s . str () . c_str () );
+        string line;
+        while ( getline ( myfile, line) ) {
+            istringstream s ( line );
+            string host;
+            int port;
+            s >> host >> port;
+            if ( e == NULL ) {
+                e = new E ( host, port );
+            } else {
+                e -> add ( host, port );
+            }
+        }
+    }
+    TestProxy ( this, c, e );
+    delete e;
+    e = NULL;
+    delete c;
+    c = NULL;
+}
+
+extern "C" {
+    ver_t CC KAppVersion ( void ) { return 0; }
+
+#define TODO -1
+
+    rc_t CC KMain ( int argc, char * argv [] )  {
+
+#if 0
+const char name[] = "http_proxy"; char *e= getenv(name); ostringstream s;
+s << "getenv("<<name<<")="<<(e==NULL?"NULL":e)<<"\n";std::cerr <<s.str();
+#endif
+
+        if ( argc == 0 ) {
+            return TODO;
+        }
+
+        KConfigDisableUserSettings ();
+
+        return ProxyWithEnvTestSuite ( argc, argv );
+    }
+}
diff --git a/test/kns/test-proxy.cpp b/test/kns/test-proxy.cpp
new file mode 100644
index 0000000..40a51ad
--- /dev/null
+++ b/test/kns/test-proxy.cpp
@@ -0,0 +1,263 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <ktst/unit_test.hpp> // TEST_SUITE
+
+#include "TestProxy.hpp" // TestProxy
+
+#include <fstream> // ifstream
+#include <sstream> // ostringstream
+
+using std :: ostringstream;
+using std :: string;
+
+class TestRunner : private ncbi :: NK :: TestCase {
+    TestCase * _dad;
+
+public:
+    TestRunner ( TestCase * dad, const string & testcase )
+        : TestCase ( dad -> GetName () )
+        , _dad ( dad )
+    {
+        ostringstream cmd;
+
+        ostringstream s;
+        s << "test-proxy/" << testcase << "/environment";
+        std :: ifstream myfile ( s . str () . c_str () );
+        string line;
+        while ( getline ( myfile, line) ) {
+            cmd << "export " << line << "; ";
+        }
+
+        ncbi :: NK :: TestRunner * t ( ncbi :: NK :: GetTestSuite () );
+        assert ( t );
+        assert ( t -> argv );
+        assert ( t -> argv [ 0 ] );
+        const char * testBin ( t -> argv [ 0 ] );
+        const char * file = strrchr ( testBin, '/' ); 
+        cmd << string ( testBin, file - testBin )
+            << "/../bin/test-proxy-with-env test-proxy/" << testcase;
+
+//std::cerr<<cmd . str ()<<"\n";
+
+        REQUIRE_EQ ( system ( cmd . str (). c_str () ), 0 );
+    }
+
+    ~ TestRunner ( void )
+    {
+        assert ( _dad );
+        _dad -> ErrorCounterAdd ( GetErrorCounter () );
+    }
+};
+
+TEST_SUITE ( ProxyTestSuite );
+
+TEST_CASE ( TEST_NOPROXY ) { // no proxy
+    TestProxy ( this );
+}
+
+TEST_CASE ( TEST_PROXY_1PATH ) { // 1 proxy with port
+    C c ( "/http/proxy/path", "proxy.gov:7678");
+    E e ( "proxy.gov", 7678 );
+    TestProxy ( this, & c, & e );
+}
+
+TEST_CASE ( TEST_PROXY_1PATH_NoPort ) { // 1 proxy without port
+    C c ( "/http/proxy/path", "proxy.gov");
+    E e ( "proxy.gov", 0 );
+    TestProxy ( this, & c, & e );
+}
+
+#ifdef MULTIPLE_PROXIES
+TEST_CASE ( TEST_PROXY_2PATH ) { // 2 proxies with port
+    C c ( "/http/proxy/path", "proxy.gov:7678,proxy2.org:768");
+    E e ( "proxy.gov", 7678 );
+    e . add ( "proxy2.org", 768 );
+    TestProxy ( this, & c, & e );
+}
+TEST_CASE ( TEST_PROXY_2PATH_NoPort ) { // 2 proxies with/without port
+    C c ( "/http/proxy/path", "proxy.gov:7678,proxy2.org");
+    E e ( "proxy.gov", 7678 );
+    e . add ( "proxy2.org", 0 );
+    TestProxy ( this, & c, & e );
+}
+// 2 proxies from config: proxy only, no direct access
+TEST_CASE ( TEST_PROXY_onlyWithoutEnv ) {
+    C c ( 
+     "/http/proxy/path", "port.config.proxy.gov:678,no-port.config.proxy2.org");
+    c . add ( "/http/proxy/only", "true" );
+    E e ( "port.config.proxy.gov", 678 );
+    e . add ( "no-port.config.proxy2.org", 0 );
+    TestProxy ( this, & c, & e );
+}
+#endif
+
+// 1 proxy from config: proxy only, no direct access
+TEST_CASE ( TEST_PROXY_onlyWithoutEnv ) {
+    C c ( "/http/proxy/path", "port.config.proxy.gov:678" );
+    c . add ( "/http/proxy/only", "true" );
+    E e ( "port.config.proxy.gov", 678 );
+    TestProxy ( this, & c, & e );
+}
+
+// error in proxy configuration
+TEST_CASE ( TEST_PROXY_kfgErr ) {
+    C c ( "/http/proxy/path", "port.config.proxy.go:v678" );
+    TestProxy ( this, & c );
+}
+
+#ifndef MULTIPLE_PROXIES
+// comma in proxy configuration
+TEST_CASE ( TEST_PROXY_commaErr ) {
+    C c ( "/http/proxy/path",
+        "port.config.proxy.gov:678,port.config.proxy.gov:67" );
+    TestProxy ( this, & c );
+}
+#endif
+
+TEST_CASE ( TEST_PROXY_NOPROXY_NoENV ) { // no proxy from kfg, no environment
+    TestRunner ( this, "none" );
+}
+
+TEST_CASE ( TEST_PROXY_1PATH_NoENV ) { // 1 proxy from kfg, no environment
+    TestRunner ( this, "no-env" );
+}
+
+// 1 proxy without port, no environment
+TEST_CASE ( TEST_PROXY_1PATH_NoPort_NoENV ) {
+    TestRunner ( this, "no-port-no-env" );
+}
+
+#ifdef MULTIPLE_PROXIES
+TEST_CASE ( TEST_PROXY_2PATH_NoENV ) { // 2 proxies with port, no environment
+    TestRunner ( this, "2-path-no-env" );
+}
+// 2 proxies with/without port, no environment
+TEST_CASE ( TEST_PROXY_2PATH_NoPort_NoENV ) {
+    TestRunner ( this, "2-path-no-port-no-env" );
+}
+#endif
+
+TEST_CASE ( TEST_PROXY_http_proxy ) { // http_proxy from environment
+    TestRunner ( this, "http_proxy" );
+}
+
+#ifdef MULTIPLE_PROXIES // 2 proxies from config, 3 environment variables
+#endif
+TEST_CASE ( TEST_PROXY_all ) { // 1 proxy from config, 3 environment variables
+    TestRunner ( this, "all" );
+}
+
+#ifdef MULTIPLE_PROXIES
+// 2 proxies from config, 3 environment variables : ignore config
+#endif
+// 1 proxy from config, 3 environment variables : ignore config
+TEST_CASE ( TEST_PROXY_env_only ) {
+    TestRunner ( this, "env-only" );
+}
+
+// 1 proxy from config, 3 environment variables : ignore environment
+TEST_CASE ( TEST_PROXY_kfg_only ) {
+    TestRunner ( this, "kfg-only" );
+}
+
+#ifdef MULTIPLE_PROXIES
+// 2 proxies from config, 3 environment variables : config, then environment
+#endif
+// 1 proxy from config, 3 environment variables : config, then environment
+TEST_CASE ( TEST_PROXY_kfg_env ) {
+    TestRunner ( this, "kfg-env" );
+}
+
+#ifdef MULTIPLE_PROXIES
+// 2 proxies from config, 3 environment variables : environment, then config
+#endif
+// 1 proxy from config, 3 environment variables : environment, then config
+TEST_CASE ( TEST_PROXY_env_kfg ) {
+    TestRunner ( this, "env-kfg" );
+}
+
+#ifdef MULTIPLE_PROXIES
+// 2 proxies from config, 3 environment variables : ignore all
+#endif
+// 1 proxy from config, 3 environment variables : ignore all
+TEST_CASE ( TEST_PROXY_ignore ) {
+    TestRunner ( this, "ignore" );
+}
+
+#ifdef MULTIPLE_PROXIES
+// 2 proxies from config, 3 environment variables : proxy/enabled = true
+#endif
+// 1 proxy from config, 3 environment variables : proxy/enabled = true
+TEST_CASE ( TEST_PROXY_enabled ) {
+    TestRunner ( this, "enabled" );
+}
+
+#ifdef MULTIPLE_PROXIES
+// 2 proxies from config, 3 environment variables : proxy/enabled = false
+#endif
+// 1 proxy from config, 3 environment variables : proxy/enabled = false
+TEST_CASE ( TEST_PROXY_disabled ) {
+    TestRunner ( this, "disabled" );
+}
+
+#ifdef MULTIPLE_PROXIES
+// 2 proxies from config, 3 environment variables : proxy only, no direct access
+#endif
+// 1 proxy from config, 3 environment variables : proxy only, no direct access
+TEST_CASE ( TEST_PROXY_onlyWithEnv ) {
+    TestRunner ( this, "proxy-only" );
+}
+
+#ifdef MULTIPLE_PROXIES
+// 2 proxies from config, 3 environment variables : proxy-only=false
+#endif
+// 1 proxy from config, 3 environment variables : proxy-only=false
+TEST_CASE ( TEST_PROXY_notOnlyWithEnv ) {
+    TestRunner ( this, "proxy-not-only" );
+}
+
+// error in congiguration and environment
+TEST_CASE ( TEST_PROXY_error ) {
+    TestRunner ( this, "error" );
+}
+
+#ifndef MULTIPLE_PROXIES
+// comma in proxy configuration
+TEST_CASE ( TEST_PROXY_ENV_commaErr ) {
+    TestRunner ( this, "comma-error" );
+}
+#endif
+
+extern "C" {
+    ver_t CC KAppVersion ( void ) { return 0; }
+    rc_t CC KMain ( int argc, char * argv [] )  {
+        KConfigDisableUserSettings ();
+        return ProxyTestSuite ( argc, argv );
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
diff --git a/test/kns/test-proxy.h b/test/kns/test-proxy.h
new file mode 100644
index 0000000..c741593
--- /dev/null
+++ b/test/kns/test-proxy.h
@@ -0,0 +1,7 @@
+extern "C" {
+    struct KEndPointArgsIterator * KNSManagerMakeKEndPointArgsIterator
+        ( const KNSManager * self, const String * hostname, uint32_t port );
+    bool KEndPointArgsIterator_Next ( KEndPointArgsIterator * self,
+        const String ** hostname, uint16_t * port,
+        bool * proxy_default_port, bool * proxy_ep );
+}
diff --git a/test/kns/test-proxy/2-path-no-env/config b/test/kns/test-proxy/2-path-no-env/config
new file mode 100644
index 0000000..2ad12c4
--- /dev/null
+++ b/test/kns/test-proxy/2-path-no-env/config
@@ -0,0 +1 @@
+/http/proxy/path proxy.gov:7678,proxy2.org:768
diff --git a/test/kns/test-proxy/2-path-no-env/expected b/test/kns/test-proxy/2-path-no-env/expected
new file mode 100644
index 0000000..66ef788
--- /dev/null
+++ b/test/kns/test-proxy/2-path-no-env/expected
@@ -0,0 +1,2 @@
+proxy.gov 7678
+proxy2.org 768
diff --git a/test/kns/test-proxy/2-path-no-port-no-env/config b/test/kns/test-proxy/2-path-no-port-no-env/config
new file mode 100644
index 0000000..a8dc289
--- /dev/null
+++ b/test/kns/test-proxy/2-path-no-port-no-env/config
@@ -0,0 +1 @@
+/http/proxy/path proxy.gov:7678,proxy2.org
diff --git a/test/kns/test-proxy/2-path-no-port-no-env/expected b/test/kns/test-proxy/2-path-no-port-no-env/expected
new file mode 100644
index 0000000..00e19a0
--- /dev/null
+++ b/test/kns/test-proxy/2-path-no-port-no-env/expected
@@ -0,0 +1,2 @@
+proxy.gov 7678
+proxy2.org 0
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/all.MULTIPLE_PROXIES/config b/test/kns/test-proxy/MULTIPLE_PROXIES/all.MULTIPLE_PROXIES/config
new file mode 100644
index 0000000..f817da5
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/all.MULTIPLE_PROXIES/config
@@ -0,0 +1 @@
+/http/proxy/path port.config.proxy.gov:678,no-port.config.proxy2.org
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/all.MULTIPLE_PROXIES/environment b/test/kns/test-proxy/MULTIPLE_PROXIES/all.MULTIPLE_PROXIES/environment
new file mode 100644
index 0000000..2d1acba
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/all.MULTIPLE_PROXIES/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234,no-port.http.proxy
+HTTP_PROXY=no-port.HTTP.proxy,port.HTTP.proxy:567
+all_proxy=no-port.all.proxy,port.all.proxy:89
+ALL_PROXY=port.ALL.proxy:9,no-port.ALL.proxy
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/all.MULTIPLE_PROXIES/expected b/test/kns/test-proxy/MULTIPLE_PROXIES/all.MULTIPLE_PROXIES/expected
new file mode 100644
index 0000000..cf902ec
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/all.MULTIPLE_PROXIES/expected
@@ -0,0 +1,10 @@
+port.config.proxy.gov 678
+no-port.config.proxy2.org 0
+port.http.proxy 1234
+no-port.http.proxy 0
+no-port.HTTP.proxy 0
+port.HTTP.proxy 567
+no-port.all.proxy 0
+port.all.proxy 89
+port.ALL.proxy 9
+no-port.ALL.proxy 0
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/disabled.MULTIPLE_PROXIES/config b/test/kns/test-proxy/MULTIPLE_PROXIES/disabled.MULTIPLE_PROXIES/config
new file mode 100644
index 0000000..a8ef730
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/disabled.MULTIPLE_PROXIES/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678,no-port.config.proxy2.org
+/http/proxy/enabled false
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/disabled.MULTIPLE_PROXIES/environment b/test/kns/test-proxy/MULTIPLE_PROXIES/disabled.MULTIPLE_PROXIES/environment
new file mode 100644
index 0000000..2d1acba
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/disabled.MULTIPLE_PROXIES/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234,no-port.http.proxy
+HTTP_PROXY=no-port.HTTP.proxy,port.HTTP.proxy:567
+all_proxy=no-port.all.proxy,port.all.proxy:89
+ALL_PROXY=port.ALL.proxy:9,no-port.ALL.proxy
diff --git a/src/test/resources/htsjdk/samtools/io/empty.txt b/test/kns/test-proxy/MULTIPLE_PROXIES/disabled.MULTIPLE_PROXIES/expected
similarity index 100%
rename from src/test/resources/htsjdk/samtools/io/empty.txt
rename to test/kns/test-proxy/MULTIPLE_PROXIES/disabled.MULTIPLE_PROXIES/expected
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/enabled.MULTIPLE_PROXIES/config b/test/kns/test-proxy/MULTIPLE_PROXIES/enabled.MULTIPLE_PROXIES/config
new file mode 100644
index 0000000..4ecdb8d
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/enabled.MULTIPLE_PROXIES/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678,no-port.config.proxy2.org
+/http/proxy/enabled true
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/enabled.MULTIPLE_PROXIES/environment b/test/kns/test-proxy/MULTIPLE_PROXIES/enabled.MULTIPLE_PROXIES/environment
new file mode 100644
index 0000000..2d1acba
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/enabled.MULTIPLE_PROXIES/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234,no-port.http.proxy
+HTTP_PROXY=no-port.HTTP.proxy,port.HTTP.proxy:567
+all_proxy=no-port.all.proxy,port.all.proxy:89
+ALL_PROXY=port.ALL.proxy:9,no-port.ALL.proxy
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/enabled.MULTIPLE_PROXIES/expected b/test/kns/test-proxy/MULTIPLE_PROXIES/enabled.MULTIPLE_PROXIES/expected
new file mode 100644
index 0000000..cf902ec
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/enabled.MULTIPLE_PROXIES/expected
@@ -0,0 +1,10 @@
+port.config.proxy.gov 678
+no-port.config.proxy2.org 0
+port.http.proxy 1234
+no-port.http.proxy 0
+no-port.HTTP.proxy 0
+port.HTTP.proxy 567
+no-port.all.proxy 0
+port.all.proxy 89
+port.ALL.proxy 9
+no-port.ALL.proxy 0
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/env-kfg.MULTIPLE_PROXIES/config b/test/kns/test-proxy/MULTIPLE_PROXIES/env-kfg.MULTIPLE_PROXIES/config
new file mode 100644
index 0000000..441f697
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/env-kfg.MULTIPLE_PROXIES/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678,no-port.config.proxy2.org
+/http/proxy/use env,kfg
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/env-kfg.MULTIPLE_PROXIES/environment b/test/kns/test-proxy/MULTIPLE_PROXIES/env-kfg.MULTIPLE_PROXIES/environment
new file mode 100644
index 0000000..2d1acba
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/env-kfg.MULTIPLE_PROXIES/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234,no-port.http.proxy
+HTTP_PROXY=no-port.HTTP.proxy,port.HTTP.proxy:567
+all_proxy=no-port.all.proxy,port.all.proxy:89
+ALL_PROXY=port.ALL.proxy:9,no-port.ALL.proxy
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/env-kfg.MULTIPLE_PROXIES/expected b/test/kns/test-proxy/MULTIPLE_PROXIES/env-kfg.MULTIPLE_PROXIES/expected
new file mode 100644
index 0000000..517bb51
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/env-kfg.MULTIPLE_PROXIES/expected
@@ -0,0 +1,10 @@
+port.http.proxy 1234
+no-port.http.proxy 0
+no-port.HTTP.proxy 0
+port.HTTP.proxy 567
+no-port.all.proxy 0
+port.all.proxy 89
+port.ALL.proxy 9
+no-port.ALL.proxy 0
+port.config.proxy.gov 678
+no-port.config.proxy2.org 0
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/env-only.MULTIPLE_PROXIES/config b/test/kns/test-proxy/MULTIPLE_PROXIES/env-only.MULTIPLE_PROXIES/config
new file mode 100644
index 0000000..cd47172
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/env-only.MULTIPLE_PROXIES/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678,no-port.config.proxy2.org
+/http/proxy/use env
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/env-only.MULTIPLE_PROXIES/environment b/test/kns/test-proxy/MULTIPLE_PROXIES/env-only.MULTIPLE_PROXIES/environment
new file mode 100644
index 0000000..2d1acba
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/env-only.MULTIPLE_PROXIES/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234,no-port.http.proxy
+HTTP_PROXY=no-port.HTTP.proxy,port.HTTP.proxy:567
+all_proxy=no-port.all.proxy,port.all.proxy:89
+ALL_PROXY=port.ALL.proxy:9,no-port.ALL.proxy
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/env-only.MULTIPLE_PROXIES/expected b/test/kns/test-proxy/MULTIPLE_PROXIES/env-only.MULTIPLE_PROXIES/expected
new file mode 100644
index 0000000..4c8213d
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/env-only.MULTIPLE_PROXIES/expected
@@ -0,0 +1,8 @@
+port.http.proxy 1234
+no-port.http.proxy 0
+no-port.HTTP.proxy 0
+port.HTTP.proxy 567
+no-port.all.proxy 0
+port.all.proxy 89
+port.ALL.proxy 9
+no-port.ALL.proxy 0
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/ignore.MULTIPLE_PROXIES/config b/test/kns/test-proxy/MULTIPLE_PROXIES/ignore.MULTIPLE_PROXIES/config
new file mode 100644
index 0000000..acbb179
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/ignore.MULTIPLE_PROXIES/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678,no-port.config.proxy2.org
+/http/proxy/use none
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/ignore.MULTIPLE_PROXIES/environment b/test/kns/test-proxy/MULTIPLE_PROXIES/ignore.MULTIPLE_PROXIES/environment
new file mode 100644
index 0000000..2d1acba
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/ignore.MULTIPLE_PROXIES/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234,no-port.http.proxy
+HTTP_PROXY=no-port.HTTP.proxy,port.HTTP.proxy:567
+all_proxy=no-port.all.proxy,port.all.proxy:89
+ALL_PROXY=port.ALL.proxy:9,no-port.ALL.proxy
diff --git a/src/test/resources/tribble/tmp/.gitignore b/test/kns/test-proxy/MULTIPLE_PROXIES/ignore.MULTIPLE_PROXIES/expected
similarity index 100%
rename from src/test/resources/tribble/tmp/.gitignore
rename to test/kns/test-proxy/MULTIPLE_PROXIES/ignore.MULTIPLE_PROXIES/expected
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/kfg-env.MULTIPLE_PROXIES/config b/test/kns/test-proxy/MULTIPLE_PROXIES/kfg-env.MULTIPLE_PROXIES/config
new file mode 100644
index 0000000..885472e
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/kfg-env.MULTIPLE_PROXIES/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678,no-port.config.proxy2.org
+/http/proxy/use kfg,env
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/kfg-env.MULTIPLE_PROXIES/environment b/test/kns/test-proxy/MULTIPLE_PROXIES/kfg-env.MULTIPLE_PROXIES/environment
new file mode 100644
index 0000000..2d1acba
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/kfg-env.MULTIPLE_PROXIES/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234,no-port.http.proxy
+HTTP_PROXY=no-port.HTTP.proxy,port.HTTP.proxy:567
+all_proxy=no-port.all.proxy,port.all.proxy:89
+ALL_PROXY=port.ALL.proxy:9,no-port.ALL.proxy
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/kfg-env.MULTIPLE_PROXIES/expected b/test/kns/test-proxy/MULTIPLE_PROXIES/kfg-env.MULTIPLE_PROXIES/expected
new file mode 100644
index 0000000..cf902ec
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/kfg-env.MULTIPLE_PROXIES/expected
@@ -0,0 +1,10 @@
+port.config.proxy.gov 678
+no-port.config.proxy2.org 0
+port.http.proxy 1234
+no-port.http.proxy 0
+no-port.HTTP.proxy 0
+port.HTTP.proxy 567
+no-port.all.proxy 0
+port.all.proxy 89
+port.ALL.proxy 9
+no-port.ALL.proxy 0
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-not-only.MULTIPLE_PROXIES/config b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-not-only.MULTIPLE_PROXIES/config
new file mode 100644
index 0000000..d82b7f5
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-not-only.MULTIPLE_PROXIES/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678,no-port.config.proxy2.org
+/http/proxy/only false
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-not-only.MULTIPLE_PROXIES/environment b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-not-only.MULTIPLE_PROXIES/environment
new file mode 100644
index 0000000..2d1acba
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-not-only.MULTIPLE_PROXIES/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234,no-port.http.proxy
+HTTP_PROXY=no-port.HTTP.proxy,port.HTTP.proxy:567
+all_proxy=no-port.all.proxy,port.all.proxy:89
+ALL_PROXY=port.ALL.proxy:9,no-port.ALL.proxy
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-not-only.MULTIPLE_PROXIES/expected b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-not-only.MULTIPLE_PROXIES/expected
new file mode 100644
index 0000000..cf902ec
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-not-only.MULTIPLE_PROXIES/expected
@@ -0,0 +1,10 @@
+port.config.proxy.gov 678
+no-port.config.proxy2.org 0
+port.http.proxy 1234
+no-port.http.proxy 0
+no-port.HTTP.proxy 0
+port.HTTP.proxy 567
+no-port.all.proxy 0
+port.all.proxy 89
+port.ALL.proxy 9
+no-port.ALL.proxy 0
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-only.MILTIPLE_PROXIES/config b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-only.MILTIPLE_PROXIES/config
new file mode 100644
index 0000000..f4072e5
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-only.MILTIPLE_PROXIES/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678,no-port.config.proxy2.org
+/http/proxy/only true
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-only.MILTIPLE_PROXIES/environment b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-only.MILTIPLE_PROXIES/environment
new file mode 100644
index 0000000..2d1acba
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-only.MILTIPLE_PROXIES/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234,no-port.http.proxy
+HTTP_PROXY=no-port.HTTP.proxy,port.HTTP.proxy:567
+all_proxy=no-port.all.proxy,port.all.proxy:89
+ALL_PROXY=port.ALL.proxy:9,no-port.ALL.proxy
diff --git a/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-only.MILTIPLE_PROXIES/expected b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-only.MILTIPLE_PROXIES/expected
new file mode 100644
index 0000000..cf902ec
--- /dev/null
+++ b/test/kns/test-proxy/MULTIPLE_PROXIES/proxy-only.MILTIPLE_PROXIES/expected
@@ -0,0 +1,10 @@
+port.config.proxy.gov 678
+no-port.config.proxy2.org 0
+port.http.proxy 1234
+no-port.http.proxy 0
+no-port.HTTP.proxy 0
+port.HTTP.proxy 567
+no-port.all.proxy 0
+port.all.proxy 89
+port.ALL.proxy 9
+no-port.ALL.proxy 0
diff --git a/test/kns/test-proxy/all/config b/test/kns/test-proxy/all/config
new file mode 100644
index 0000000..f9c2ef3
--- /dev/null
+++ b/test/kns/test-proxy/all/config
@@ -0,0 +1 @@
+/http/proxy/path no-port.config.proxy2.org
diff --git a/test/kns/test-proxy/all/environment b/test/kns/test-proxy/all/environment
new file mode 100644
index 0000000..43e6af5
--- /dev/null
+++ b/test/kns/test-proxy/all/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234
+HTTP_PROXY=no-port.HTTP.proxy
+all_proxy=no-port.all.proxy
+ALL_PROXY=port.ALL.proxy:9
diff --git a/test/kns/test-proxy/all/expected b/test/kns/test-proxy/all/expected
new file mode 100644
index 0000000..0032912
--- /dev/null
+++ b/test/kns/test-proxy/all/expected
@@ -0,0 +1,5 @@
+no-port.config.proxy2.org 0
+no-port.all.proxy 0
+port.ALL.proxy 9
+port.http.proxy 1234
+no-port.HTTP.proxy 0
diff --git a/test/kns/test-proxy/comma-error/environment b/test/kns/test-proxy/comma-error/environment
new file mode 100644
index 0000000..4123a89
--- /dev/null
+++ b/test/kns/test-proxy/comma-error/environment
@@ -0,0 +1 @@
+http_proxy=port.http.proxy:1234,port.http.proxy:123
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kns/test-proxy/comma-error/expected
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kns/test-proxy/comma-error/expected
diff --git a/test/kns/test-proxy/disabled/config b/test/kns/test-proxy/disabled/config
new file mode 100644
index 0000000..469da64
--- /dev/null
+++ b/test/kns/test-proxy/disabled/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678
+/http/proxy/enabled false
diff --git a/test/kns/test-proxy/disabled/environment b/test/kns/test-proxy/disabled/environment
new file mode 100644
index 0000000..43e6af5
--- /dev/null
+++ b/test/kns/test-proxy/disabled/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234
+HTTP_PROXY=no-port.HTTP.proxy
+all_proxy=no-port.all.proxy
+ALL_PROXY=port.ALL.proxy:9
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kns/test-proxy/disabled/expected
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kns/test-proxy/disabled/expected
diff --git a/test/kns/test-proxy/enabled/config b/test/kns/test-proxy/enabled/config
new file mode 100644
index 0000000..f6a15db
--- /dev/null
+++ b/test/kns/test-proxy/enabled/config
@@ -0,0 +1,2 @@
+/http/proxy/path no-port.config.proxy2.org
+/http/proxy/enabled true
diff --git a/test/kns/test-proxy/enabled/environment b/test/kns/test-proxy/enabled/environment
new file mode 100644
index 0000000..0669d2f
--- /dev/null
+++ b/test/kns/test-proxy/enabled/environment
@@ -0,0 +1,4 @@
+http_proxy=no-port.http.proxy
+HTTP_PROXY=port.HTTP.proxy:567
+all_proxy=port.all.proxy:89
+ALL_PROXY=no-port.ALL.proxy
diff --git a/test/kns/test-proxy/enabled/expected b/test/kns/test-proxy/enabled/expected
new file mode 100644
index 0000000..81c1f8c
--- /dev/null
+++ b/test/kns/test-proxy/enabled/expected
@@ -0,0 +1,5 @@
+no-port.config.proxy2.org 0
+port.all.proxy 89
+no-port.ALL.proxy 0
+no-port.http.proxy 0
+port.HTTP.proxy 567
diff --git a/test/kns/test-proxy/env-kfg/config b/test/kns/test-proxy/env-kfg/config
new file mode 100644
index 0000000..f29770e
--- /dev/null
+++ b/test/kns/test-proxy/env-kfg/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678
+/http/proxy/use env,kfg
diff --git a/test/kns/test-proxy/env-kfg/environment b/test/kns/test-proxy/env-kfg/environment
new file mode 100644
index 0000000..43e6af5
--- /dev/null
+++ b/test/kns/test-proxy/env-kfg/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234
+HTTP_PROXY=no-port.HTTP.proxy
+all_proxy=no-port.all.proxy
+ALL_PROXY=port.ALL.proxy:9
diff --git a/test/kns/test-proxy/env-kfg/expected b/test/kns/test-proxy/env-kfg/expected
new file mode 100644
index 0000000..d1c9aeb
--- /dev/null
+++ b/test/kns/test-proxy/env-kfg/expected
@@ -0,0 +1,5 @@
+no-port.all.proxy 0
+port.ALL.proxy 9
+port.http.proxy 1234
+no-port.HTTP.proxy 0
+port.config.proxy.gov 678
diff --git a/test/kns/test-proxy/env-only/config b/test/kns/test-proxy/env-only/config
new file mode 100644
index 0000000..ca70ec4
--- /dev/null
+++ b/test/kns/test-proxy/env-only/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678
+/http/proxy/use env
diff --git a/test/kns/test-proxy/env-only/environment b/test/kns/test-proxy/env-only/environment
new file mode 100644
index 0000000..0669d2f
--- /dev/null
+++ b/test/kns/test-proxy/env-only/environment
@@ -0,0 +1,4 @@
+http_proxy=no-port.http.proxy
+HTTP_PROXY=port.HTTP.proxy:567
+all_proxy=port.all.proxy:89
+ALL_PROXY=no-port.ALL.proxy
diff --git a/test/kns/test-proxy/env-only/expected b/test/kns/test-proxy/env-only/expected
new file mode 100644
index 0000000..d153dfb
--- /dev/null
+++ b/test/kns/test-proxy/env-only/expected
@@ -0,0 +1,4 @@
+port.all.proxy 89
+no-port.ALL.proxy 0
+no-port.http.proxy 0
+port.HTTP.proxy 567
diff --git a/test/kns/test-proxy/error/config b/test/kns/test-proxy/error/config
new file mode 100644
index 0000000..f2351ca
--- /dev/null
+++ b/test/kns/test-proxy/error/config
@@ -0,0 +1 @@
+/http/proxy/path no-port.config.proxy2:org
diff --git a/test/kns/test-proxy/error/environment b/test/kns/test-proxy/error/environment
new file mode 100644
index 0000000..e9b3a52
--- /dev/null
+++ b/test/kns/test-proxy/error/environment
@@ -0,0 +1 @@
+http_proxy=port.http.prox:y1234
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kns/test-proxy/error/expected
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kns/test-proxy/error/expected
diff --git a/test/kns/test-proxy/http_proxy/environment b/test/kns/test-proxy/http_proxy/environment
new file mode 100644
index 0000000..fc650ec
--- /dev/null
+++ b/test/kns/test-proxy/http_proxy/environment
@@ -0,0 +1 @@
+http_proxy=http.proxy:1234
diff --git a/test/kns/test-proxy/http_proxy/expected b/test/kns/test-proxy/http_proxy/expected
new file mode 100644
index 0000000..33af3c4
--- /dev/null
+++ b/test/kns/test-proxy/http_proxy/expected
@@ -0,0 +1 @@
+http.proxy 1234
diff --git a/test/kns/test-proxy/ignore/config b/test/kns/test-proxy/ignore/config
new file mode 100644
index 0000000..09fa173
--- /dev/null
+++ b/test/kns/test-proxy/ignore/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678
+/http/proxy/use none
diff --git a/test/kns/test-proxy/ignore/environment b/test/kns/test-proxy/ignore/environment
new file mode 100644
index 0000000..43e6af5
--- /dev/null
+++ b/test/kns/test-proxy/ignore/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234
+HTTP_PROXY=no-port.HTTP.proxy
+all_proxy=no-port.all.proxy
+ALL_PROXY=port.ALL.proxy:9
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kns/test-proxy/ignore/expected
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kns/test-proxy/ignore/expected
diff --git a/test/kns/test-proxy/kfg-env/config b/test/kns/test-proxy/kfg-env/config
new file mode 100644
index 0000000..ce5350f
--- /dev/null
+++ b/test/kns/test-proxy/kfg-env/config
@@ -0,0 +1,2 @@
+/http/proxy/path no-port.config.proxy2.org
+/http/proxy/use kfg,env
diff --git a/test/kns/test-proxy/kfg-env/environment b/test/kns/test-proxy/kfg-env/environment
new file mode 100644
index 0000000..43e6af5
--- /dev/null
+++ b/test/kns/test-proxy/kfg-env/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234
+HTTP_PROXY=no-port.HTTP.proxy
+all_proxy=no-port.all.proxy
+ALL_PROXY=port.ALL.proxy:9
diff --git a/test/kns/test-proxy/kfg-env/expected b/test/kns/test-proxy/kfg-env/expected
new file mode 100644
index 0000000..0032912
--- /dev/null
+++ b/test/kns/test-proxy/kfg-env/expected
@@ -0,0 +1,5 @@
+no-port.config.proxy2.org 0
+no-port.all.proxy 0
+port.ALL.proxy 9
+port.http.proxy 1234
+no-port.HTTP.proxy 0
diff --git a/test/kns/test-proxy/kfg-only/config b/test/kns/test-proxy/kfg-only/config
new file mode 100644
index 0000000..dcf2a5b
--- /dev/null
+++ b/test/kns/test-proxy/kfg-only/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678
+/http/proxy/use kfg
diff --git a/test/kns/test-proxy/kfg-only/environment b/test/kns/test-proxy/kfg-only/environment
new file mode 100644
index 0000000..43e6af5
--- /dev/null
+++ b/test/kns/test-proxy/kfg-only/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234
+HTTP_PROXY=no-port.HTTP.proxy
+all_proxy=no-port.all.proxy
+ALL_PROXY=port.ALL.proxy:9
diff --git a/test/kns/test-proxy/kfg-only/expected b/test/kns/test-proxy/kfg-only/expected
new file mode 100644
index 0000000..59670de
--- /dev/null
+++ b/test/kns/test-proxy/kfg-only/expected
@@ -0,0 +1 @@
+port.config.proxy.gov 678
diff --git a/test/kns/test-proxy/no-env/config b/test/kns/test-proxy/no-env/config
new file mode 100644
index 0000000..8c4a115
--- /dev/null
+++ b/test/kns/test-proxy/no-env/config
@@ -0,0 +1 @@
+/http/proxy/path proxy.gov:7678
diff --git a/test/kns/test-proxy/no-env/expected b/test/kns/test-proxy/no-env/expected
new file mode 100644
index 0000000..ac57896
--- /dev/null
+++ b/test/kns/test-proxy/no-env/expected
@@ -0,0 +1 @@
+proxy.gov 7678
\ No newline at end of file
diff --git a/test/kns/test-proxy/no-port-no-env/config b/test/kns/test-proxy/no-port-no-env/config
new file mode 100644
index 0000000..d85f020
--- /dev/null
+++ b/test/kns/test-proxy/no-port-no-env/config
@@ -0,0 +1 @@
+/http/proxy/path proxy.gov
diff --git a/test/kns/test-proxy/no-port-no-env/expected b/test/kns/test-proxy/no-port-no-env/expected
new file mode 100644
index 0000000..a6f13ab
--- /dev/null
+++ b/test/kns/test-proxy/no-port-no-env/expected
@@ -0,0 +1 @@
+proxy.gov 0
\ No newline at end of file
diff --git a/test/kns/test-proxy/proxy-not-only/config b/test/kns/test-proxy/proxy-not-only/config
new file mode 100644
index 0000000..41ca345
--- /dev/null
+++ b/test/kns/test-proxy/proxy-not-only/config
@@ -0,0 +1,2 @@
+/http/proxy/path no-port.config.proxy2.org
+/http/proxy/only false
diff --git a/test/kns/test-proxy/proxy-not-only/environment b/test/kns/test-proxy/proxy-not-only/environment
new file mode 100644
index 0000000..0669d2f
--- /dev/null
+++ b/test/kns/test-proxy/proxy-not-only/environment
@@ -0,0 +1,4 @@
+http_proxy=no-port.http.proxy
+HTTP_PROXY=port.HTTP.proxy:567
+all_proxy=port.all.proxy:89
+ALL_PROXY=no-port.ALL.proxy
diff --git a/test/kns/test-proxy/proxy-not-only/expected b/test/kns/test-proxy/proxy-not-only/expected
new file mode 100644
index 0000000..81c1f8c
--- /dev/null
+++ b/test/kns/test-proxy/proxy-not-only/expected
@@ -0,0 +1,5 @@
+no-port.config.proxy2.org 0
+port.all.proxy 89
+no-port.ALL.proxy 0
+no-port.http.proxy 0
+port.HTTP.proxy 567
diff --git a/test/kns/test-proxy/proxy-only/config b/test/kns/test-proxy/proxy-only/config
new file mode 100644
index 0000000..204cdd1
--- /dev/null
+++ b/test/kns/test-proxy/proxy-only/config
@@ -0,0 +1,2 @@
+/http/proxy/path port.config.proxy.gov:678
+/http/proxy/only true
diff --git a/test/kns/test-proxy/proxy-only/environment b/test/kns/test-proxy/proxy-only/environment
new file mode 100644
index 0000000..43e6af5
--- /dev/null
+++ b/test/kns/test-proxy/proxy-only/environment
@@ -0,0 +1,4 @@
+http_proxy=port.http.proxy:1234
+HTTP_PROXY=no-port.HTTP.proxy
+all_proxy=no-port.all.proxy
+ALL_PROXY=port.ALL.proxy:9
diff --git a/test/kns/test-proxy/proxy-only/expected b/test/kns/test-proxy/proxy-only/expected
new file mode 100644
index 0000000..bcb6093
--- /dev/null
+++ b/test/kns/test-proxy/proxy-only/expected
@@ -0,0 +1,5 @@
+port.config.proxy.gov 678
+no-port.all.proxy 0
+port.ALL.proxy 9
+port.http.proxy 1234
+no-port.HTTP.proxy 0
diff --git a/test/kproc/Makefile b/test/kproc/Makefile
new file mode 100644
index 0000000..a1c386b
--- /dev/null
+++ b/test/kproc/Makefile
@@ -0,0 +1,55 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+MODULE = test/kproc
+
+TEST_TOOLS = \
+	test-kproc \
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# test-kproc
+#
+TEST_KPROC_SRC = \
+	kproctest 
+
+TEST_KPROC_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_KPROC_SRC))
+
+TEST_KPROC_LIB = \
+	-skapp \
+	-sktst \
+    -sncbi-vdb
+
+$(TEST_BINDIR)/test-kproc: $(TEST_KPROC_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_KPROC_LIB)
diff --git a/test/kproc/kproctest.cpp b/test/kproc/kproctest.cpp
new file mode 100644
index 0000000..c934da9
--- /dev/null
+++ b/test/kproc/kproctest.cpp
@@ -0,0 +1,1000 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for KProc interfaces
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/rc.h>
+#include <klib/time.h>
+#include <klib/log.h>
+
+#include <atomic32.h>
+#include <os-native.h>
+
+#include <kproc/cond.h>
+#include <kproc/lock.h>
+#include <kproc/thread.h>
+#include <kproc/timeout.h>
+#include <kproc/queue.h>
+
+#include <stdexcept>
+#include <sstream>
+
+#include <cstring> // mamset
+
+using namespace std;
+using namespace ncbi::NK;
+
+extern "C" { static rc_t argsHandler(int argc, char* argv[]); }
+TEST_SUITE_WITH_ARGS_HANDLER(KProcTestSuite, argsHandler);
+
+//TODO: KThread
+
+///////////////////////// KLock
+TEST_CASE( KLock_NULL )
+{
+    REQUIRE_RC_FAIL(KLockMake(NULL));
+}
+
+class KLockFixture
+{
+public:
+    KLockFixture()
+    :   threadRc(0),
+        thread(0),
+        lock(0)
+    {
+        if (KLockMake(&lock) != 0)
+            throw logic_error("KLockFixture: KLockMake failed");
+    }
+    ~KLockFixture()
+    {
+        if (thread != 0 && KThreadRelease(thread) != 0)
+            throw logic_error("~KLockFixture: KThreadRelease failed");
+        if (KLockRelease((const KLock*)lock) != 0)
+            throw logic_error("~KLockFixture: KLockRelease failed");
+    }
+    
+protected:
+    class Thread {
+    public:
+        // danger - this should be an extern "C" function
+        // with CC calling convention on Windows
+        static rc_t KLock_ThreadFn ( const KThread *thread, void *data )
+        {
+            KLockFixture* self = (KLockFixture*)data;
+            
+            LOG(LogLevel::e_message, "KLock_ThreadFn acquiring lock, set threadWaiting to 1" << endl);    
+            atomic32_set ( & self->threadWaiting, 1 );
+            
+            while (KLockAcquire(self->lock) != 0)
+            {
+                TestEnv::SleepMs(1);
+            }
+            LOG(LogLevel::e_message, "KLock_ThreadFn: lock acquired" << endl);    
+            
+            atomic32_set ( & self->threadWaiting, 0 );
+            LOG(LogLevel::e_message, "KLock_ThreadFn: set threadWaiting to 0" << endl);    
+            
+            self->threadRc = KLockUnlock(self->lock);
+            LOG(LogLevel::e_message, "KLock_Timed_ThreadFn: exiting" << endl);    
+            return 0;
+        }
+    };
+    
+    rc_t StartThread()
+    {
+        atomic32_set ( & threadWaiting, 0 );
+        LOG(LogLevel::e_message, "StartThread: set threadWaiting to 0" << endl);    
+
+        threadRc = 0;
+        rc_t rc = KThreadMake(&thread, Thread::KLock_ThreadFn, this);
+        while (threadRc == 0 && !atomic32_read (&threadWaiting))
+        {
+            TestEnv::SleepMs(1);
+        }
+        LOG(LogLevel::e_message, "StartThread: threadWaiting == 1" << endl);    
+        return rc;
+    }
+    
+public:
+    rc_t threadRc;
+    KThread* thread;
+    volatile atomic32_t threadWaiting;
+    timeout_t tm;
+    KLock* lock;
+};
+
+FIXTURE_TEST_CASE(KLock_Acquire, KLockFixture)
+{
+    // lock 
+    REQUIRE_RC(KLockAcquire(lock));
+    // start a thread that tries to lock, see it wait for the lock to become available
+    REQUIRE_RC(StartThread()); // makes sure threadWaiting == 1
+    
+    // unlock, see the thread finish
+    REQUIRE_RC(KLockUnlock(lock));
+    while (atomic32_read (&threadWaiting))
+    {
+        TestEnv::SleepMs(1);
+    }
+
+    REQUIRE_RC(threadRc);
+    LOG(LogLevel::e_message, "KLock_Acquire: done" << endl);    
+}
+
+///////////////////////// KTimedLock
+TEST_CASE( KTimedLock_NULL )
+{
+    REQUIRE_RC_FAIL(KTimedLockMake(NULL));
+}
+
+class KTimedLockFixture
+{
+public:
+    KTimedLockFixture()
+    :   threadRc(0),
+        thread(0),
+        lock(0)
+    {
+        if (KTimedLockMake(&lock) != 0)
+            throw logic_error("KLockFixture: KLockMake failed");
+    }
+    ~KTimedLockFixture()
+    {
+        if (thread != 0 && KThreadRelease(thread) != 0)
+            throw logic_error("~KLockFixture: KThreadRelease failed");
+        if (KLockRelease((const KLock*)lock) != 0)
+            throw logic_error("~KLockFixture: KLockRelease failed");
+    }
+    
+protected:
+    class Thread {
+    public:
+        // danger - this should be an extern "C" function
+        // with CC calling convention on Windows
+        static rc_t KLock_Timed_ThreadFn ( const KThread *thread, void *data )
+        {
+            KTimedLockFixture* self = (KTimedLockFixture*)data;
+            
+            LOG(LogLevel::e_message, "KLock_Timed_ThreadFn acquiring lock, set threadWaiting to 1, timeout = " << self->tm.mS << "ms" << endl);    
+            atomic32_set ( & self->threadWaiting, 1 );
+        
+            self->threadRc = KTimedLockAcquire(self->lock, &self->tm);
+            if (self->threadRc == 0)
+                LOG(LogLevel::e_message, "KLock_Timed_ThreadFn: lock acquired" << endl);    
+            else
+                LOG(LogLevel::e_message, "KLock_Timed_ThreadFn: lock acquire failed" << endl);    
+            
+            LOG(LogLevel::e_message, "KLock_Timed_ThreadFn: set threadWaiting to 0" << endl);    
+            
+            if (self->threadRc == 0)
+                self->threadRc = KTimedLockUnlock(self->lock);
+            LOG(LogLevel::e_message, "KLock_Timed_ThreadFn: exiting" << endl);    
+            atomic32_set ( & self->threadWaiting, 0 );
+            return 0;
+        }
+    };
+    
+    rc_t StartThread(size_t timeout)
+    {
+        rc_t rc = TimeoutInit( &tm, timeout );
+        if ( rc == 0)
+        {
+            atomic32_set ( & threadWaiting, 0 );
+            LOG(LogLevel::e_message, "StartTimedThread: set threadWaiting to 0" << endl);    
+            
+            threadRc = 0;
+            rc = KThreadMake(&thread, Thread::KLock_Timed_ThreadFn, this);
+            while (threadRc == 0 && !atomic32_read (&threadWaiting))
+            {
+                TestEnv::SleepMs(1);
+            }
+            LOG(LogLevel::e_message, "StartTimedThread: threadWaiting == 1" << endl);    
+        }
+        return rc;
+    }
+
+public:    
+    rc_t threadRc;
+    KThread* thread;
+    volatile atomic32_t threadWaiting;
+    timeout_t tm;
+    KTimedLock* lock;
+};
+
+FIXTURE_TEST_CASE(KTimedLock_Acquire, KTimedLockFixture)
+{
+    // lock 
+    REQUIRE_RC(KTimedLockAcquire(lock, NULL));
+    
+    // start a thread that tries to lock
+    LOG(LogLevel::e_message, "TEST_KLock_TimedAcquire: starting thread" << endl);    
+    REQUIRE_RC(StartThread(1000));// makes sure threadWaiting == 1
+
+    // unlock, see the thread finish
+    LOG(LogLevel::e_message, "TEST_KLock_TimedAcquire: unlocking" << endl);    
+    REQUIRE_RC(KTimedLockUnlock(lock));
+    
+    // wait for the thread to finish
+    while (atomic32_read (&threadWaiting))
+    {
+        TestEnv::SleepMs(1);
+    }
+    REQUIRE_RC(threadRc);
+
+    LOG(LogLevel::e_message, "TEST_KLock_TimedAcquire: done" << endl);    
+}
+FIXTURE_TEST_CASE(KTimedLock_Acquire_Timeout, KTimedLockFixture)
+{
+    // lock 
+    REQUIRE_RC(KTimedLockAcquire(lock, NULL));
+    
+    // start a thread that tries to lock, see it time out
+    REQUIRE_RC(StartThread(100));// makes sure threadWaiting == 1
+    
+    // do not unlock, wait for the thread to finish
+    while (atomic32_read (&threadWaiting))
+    {
+        TestEnv::SleepMs(1);
+    }
+    REQUIRE_EQ(threadRc, RC ( rcPS, rcLock, rcLocking, rcTimeout, rcExhausted )); // timed out
+    
+    REQUIRE_RC(KTimedLockUnlock(lock));
+}
+
+///////////////////////// KRWLock
+TEST_CASE( KRWLock_NULL )
+{
+    REQUIRE_RC_FAIL(KRWLockMake(NULL));
+}
+
+class KRWLockFixture
+{
+public:
+    KRWLockFixture()
+    :   threadRc(0),
+        thread(0),
+        lock(0)
+    {
+        atomic32_set ( & threadWaiting, 0 );
+        
+        if (KRWLockMake(&lock) != 0)
+            throw logic_error("KLockFixture: KLockMake failed");
+    }
+    ~KRWLockFixture()
+    {
+        if (thread != 0 && KThreadRelease(thread) != 0)
+            throw logic_error("~KRWLockFixture: KThreadRelease failed");
+        if (KRWLockRelease((const KRWLock*)lock) != 0)
+            throw logic_error("~KRWLockFixture: KLockRelease failed");
+    }
+    
+protected:
+    class Thread {
+    public:
+        static rc_t KRWLock_Reader_ThreadFn ( const KThread *thread, void *data )
+        {
+            KRWLockFixture* self = (KRWLockFixture*)data;
+            atomic32_set( & self->threadWaiting, true );
+            
+            while (KRWLockAcquireShared(self->lock) != 0)
+            {
+                TestEnv::SleepMs(1);
+            }
+            self->threadRc = KRWLockUnlock(self->lock);
+            atomic32_set( & self->threadWaiting, false );
+            return 0;
+        }
+        static rc_t KRWLock_Writer_ThreadFn ( const KThread *thread, void *data )
+        {
+            KRWLockFixture* self = (KRWLockFixture*)data;
+            atomic32_set( & self->threadWaiting, true );
+            
+            LOG(LogLevel::e_message, "KRWLock_Writer_ThreadFn: calling KRWLockAcquireExcl\n");                
+            self->threadRc = KRWLockAcquireExcl(self->lock);
+            LOG(LogLevel::e_message, "KRWLock_Writer_ThreadFn: out of KRWLockAcquireExcl\n");                
+            if (self->threadRc == 0)
+            {
+                LOG(LogLevel::e_message, "KRWLock_Writer_ThreadFn: calling KRWLockUnlock\n");                
+                self->threadRc = KRWLockUnlock(self->lock);
+            }
+            atomic32_set( & self->threadWaiting, false );
+            return 0;
+        }
+        static rc_t KRWLock_ReaderTimed_ThreadFn ( const KThread *thread, void *data )
+        {
+            KRWLockFixture* self = (KRWLockFixture*)data;
+            atomic32_set( & self->threadWaiting, true );
+            
+            self->threadRc = KRWLockTimedAcquireShared(self->lock, &self->tm);
+            if (self->threadRc == 0)
+                self->threadRc = KRWLockUnlock(self->lock);
+            atomic32_set( & self->threadWaiting, false );
+            return 0;
+        }
+        static rc_t KRWLock_WriterTimed_ThreadFn ( const KThread *thread, void *data )
+        {
+            KRWLockFixture* self = (KRWLockFixture*)data;
+            atomic32_set( & self->threadWaiting, true );
+            
+            self->threadRc = KRWLockTimedAcquireExcl(self->lock, &self->tm);
+            if (self->threadRc == 0)
+                self->threadRc = KRWLockUnlock(self->lock);
+            atomic32_set( & self->threadWaiting, false );
+            return 0;
+        }
+    };
+    
+    rc_t StartThread(bool writer)
+    {
+        threadRc = 0;
+        rc_t rc = KThreadMake(&thread, writer ? Thread::KRWLock_Writer_ThreadFn : Thread::KRWLock_Reader_ThreadFn, this);
+        while (!atomic32_read (&threadWaiting))
+        {
+            TestEnv::SleepMs(1);
+        }
+        return rc;
+    }
+    rc_t StartThread(bool writer, size_t timeout)
+    {
+        rc_t rc = TimeoutInit( &tm, timeout );
+        if ( rc == 0)
+        {
+            threadRc = 0;
+            rc = KThreadMake(&thread, writer ? Thread::KRWLock_WriterTimed_ThreadFn : Thread::KRWLock_ReaderTimed_ThreadFn, this);
+            while (!atomic32_read (&threadWaiting))
+            {
+                TestEnv::SleepMs(1);
+            }
+        }
+        return rc;
+    }
+
+    volatile atomic32_t threadWaiting;
+    rc_t threadRc;
+    KThread* thread;
+    timeout_t tm;
+    KRWLock* lock;
+};
+
+FIXTURE_TEST_CASE( KRWLock_ManyReaders, KRWLockFixture )
+{
+    // get multiple read locks
+    REQUIRE_RC(KRWLockAcquireShared(lock));
+    REQUIRE_RC(KRWLockAcquireShared(lock));
+    REQUIRE_RC(KRWLockAcquireShared(lock));
+    //NB: On Linux, KRWLock goes away without a leak even if Unlock is not called.
+    // On Windows, Unlocks are required.
+    KRWLockUnlock(lock);
+    KRWLockUnlock(lock);
+    KRWLockUnlock(lock);
+}
+
+FIXTURE_TEST_CASE( KRWLock_OneWriter, KRWLockFixture )
+{
+    REQUIRE_RC(KRWLockAcquireExcl(lock));
+    //NB: trying to lock again from the same thread errors out on Linux but hangs on Windows
+    //REQUIRE_RC_FAIL(KRWLockAcquireExcl(lock));
+    //REQUIRE_RC_FAIL(KRWLockAcquireShared(lock));
+    //TODO: try to acquire from a different thread
+    
+    REQUIRE_RC(KRWLockUnlock(lock));
+
+    // now, can lock again
+    REQUIRE_RC(KRWLockAcquireShared(lock));
+    REQUIRE_RC(KRWLockUnlock(lock));
+}
+
+FIXTURE_TEST_CASE( KRWLock_WriterWaitsForReader, KRWLockFixture )
+{
+    LOG(LogLevel::e_message, "KRWLock_WriterWaitsForReader: calling KRWLockAcquireShared\n");                
+    REQUIRE_RC(KRWLockAcquireShared(lock));
+    
+    // start a thread that tries to write-lock, see it wait
+    LOG(LogLevel::e_message, "KRWLock_WriterWaitsForReader: starting thread\n");                
+    REQUIRE_RC(StartThread(true));
+    
+    REQUIRE(atomic32_read ( & threadWaiting )); 
+
+    LOG(LogLevel::e_message, "KRWLock_WriterWaitsForReader: calling KRWLockUnlock\n");                
+    REQUIRE_RC(KRWLockUnlock(lock));
+    // let the thread finish
+    while (atomic32_read (&threadWaiting))
+    {
+        TestEnv::SleepMs(1);
+    }
+    REQUIRE(!atomic32_read ( & threadWaiting )); 
+}
+
+FIXTURE_TEST_CASE(KWRLock_Reader_TimedAcquire, KRWLockFixture)
+{
+    // lock 
+    REQUIRE_RC(KRWLockAcquireExcl(lock));
+    
+    // start a thread that tries to lock
+    REQUIRE_RC(StartThread(false, 1000));
+    
+    // see the thread wait
+    REQUIRE(atomic32_read ( & threadWaiting )); 
+    
+    // unlock, see the thread finish
+    REQUIRE_RC(KRWLockUnlock(lock));
+    while (atomic32_read (&threadWaiting))
+    {
+        TestEnv::SleepMs(1);
+    }
+    REQUIRE_RC(threadRc);
+}
+
+FIXTURE_TEST_CASE(KWRLock_Reader_TimedAcquire_Timeout, KRWLockFixture)
+{
+    // lock 
+    REQUIRE_RC(KRWLockAcquireExcl(lock));
+    
+    // start a thread that tries to lock, see it time out
+    REQUIRE_RC(StartThread(false, 500));
+
+    // see the thread time out
+    while (atomic32_read (&threadWaiting))
+    {
+        TestEnv::SleepMs(1);
+    }
+    rc_t req_rc = RC ( rcPS, rcRWLock, rcLocking, rcTimeout, rcExhausted );
+    REQUIRE_EQ(threadRc, req_rc); // timed out
+    
+    REQUIRE_RC(KRWLockUnlock(lock));
+}
+
+FIXTURE_TEST_CASE(KWRLock_Writer_TimedAcquire, KRWLockFixture)
+{
+    // read-lock 
+    REQUIRE_RC(KRWLockAcquireShared(lock));
+    
+    // start a thread that tries to write-lock and see it wait
+    REQUIRE_RC(StartThread(true, 1000));
+    
+    // see the thread wait
+    TestEnv::SleepMs(300);
+    REQUIRE(atomic32_read (&threadWaiting));
+    
+    // unlock, see the thread finish
+    REQUIRE_RC(KRWLockUnlock(lock));
+    while (atomic32_read (&threadWaiting))
+    {
+        TestEnv::SleepMs(1);
+    }
+    REQUIRE_RC(threadRc);
+}
+
+FIXTURE_TEST_CASE(KWRLock_Writer_TimedAcquire_Timeout, KRWLockFixture)
+{
+    // read-lock 
+    REQUIRE_RC(KRWLockAcquireShared(lock));
+    
+    // start a thread that tries to write-lock, see it time out
+    REQUIRE_RC(StartThread(true, 500));
+    
+    // see the thread time out
+    while (atomic32_read (&threadWaiting))
+    {
+        TestEnv::SleepMs(1);
+    }
+    REQUIRE_EQ(threadRc, RC ( rcPS, rcRWLock, rcLocking, rcTimeout, rcExhausted )); // timed out
+    
+    REQUIRE_RC(KRWLockUnlock(lock));
+}
+
+//KCondition
+TEST_CASE( KCondition_NULL )
+{
+    REQUIRE_RC_FAIL(KConditionMake(NULL));
+}
+TEST_CASE( KCondition_MakeRelease )
+{
+    KCondition* cond;
+    REQUIRE_RC(KConditionMake(&cond));
+    REQUIRE_RC(KConditionRelease(cond));
+}
+
+class KConditionFixture
+{
+public:
+    KConditionFixture()
+    :   threadRc(0),
+        thread(0),
+        lock(0),
+        is_signaled(false),
+        do_broadcast(false)
+    {
+        if (KLockMake(&lock) != 0)
+            throw logic_error("KConditionFixture: KLockMake failed");
+        if (KConditionMake(&cond) != 0)
+            throw logic_error("KConditionFixture: KConditionMake failed");
+    }
+    ~KConditionFixture()
+    {
+        if (thread != 0)
+        {
+            if (KThreadWait(thread, NULL) != 0)
+                throw logic_error("~KConditionFixture: KThreadWait failed");
+            if (threadRc != 0)
+                throw logic_error("~KConditionFixture: thread failed, threadRc != 0");
+            if (KThreadRelease(thread) != 0)
+                throw logic_error("~KConditionFixture: KThreadRelease failed");
+        }
+        if (KLockRelease((const KLock*)lock) != 0)
+            throw logic_error("~KConditionFixture: KLockRelease failed");
+        if (KConditionRelease(cond) != 0)
+            throw logic_error("~KConditionFixture: KConditionRelease failed");
+    }
+
+protected:
+    class Thread {
+    public:
+        // danger - this should be an extern "C" function
+        // with CC calling convention on Windows
+        static rc_t KCondition_ThreadFn ( const KThread *thread, void *data )
+        {
+            KConditionFixture* self = (KConditionFixture*)data;
+
+            LOG(LogLevel::e_message, "KCondition_ThreadFn: sleeping" << endl);
+            TestEnv::SleepMs(300);
+            LOG(LogLevel::e_message, "KCondition_ThreadFn: signaling condition" << endl);
+            self->is_signaled = true;
+            if (!self->do_broadcast)
+                self->threadRc = KConditionSignal(self->cond);
+            else
+                self->threadRc = KConditionBroadcast(self->cond);
+
+            LOG(LogLevel::e_message, "KCondition_ThreadFn: exiting" << endl);
+            return 0;
+        }
+    };
+
+    rc_t StartThread()
+    {
+        LOG(LogLevel::e_message, "StartThread: starting thread" << endl);
+
+        threadRc = 0;
+        rc_t rc = KThreadMake(&thread, Thread::KCondition_ThreadFn, this);
+        return rc;
+    }
+
+public:
+    rc_t threadRc;
+    KThread* thread;
+    timeout_t tm;
+    KLock* lock;
+    KCondition* cond;
+    bool is_signaled;
+    bool do_broadcast;
+};
+
+FIXTURE_TEST_CASE( KCondition_TimedWait_Timeout, KConditionFixture )
+{
+    REQUIRE_RC(KLockAcquire(lock));
+    REQUIRE_RC(TimeoutInit(&tm, 100));
+    REQUIRE_RC(KConditionSignal(cond)); // signaling before waiting should not do anything
+    REQUIRE_EQ(KConditionTimedWait(cond, lock, &tm), RC ( rcPS, rcCondition, rcWaiting, rcTimeout, rcExhausted )); // timed out
+
+    REQUIRE_RC(KLockUnlock(lock));
+}
+
+FIXTURE_TEST_CASE( KCondition_TimedWait_Signaled, KConditionFixture )
+{
+    is_signaled = false;
+
+    REQUIRE_RC(KLockAcquire(lock));
+
+    REQUIRE_RC(StartThread());
+    REQUIRE_RC(KConditionWait(cond, lock));
+    REQUIRE(is_signaled == true);
+
+    REQUIRE_RC(KLockUnlock(lock));
+}
+
+FIXTURE_TEST_CASE( KCondition_TimedWait_Signaled_Broadcast, KConditionFixture )
+{
+    is_signaled = false;
+    do_broadcast = true;
+
+    REQUIRE_RC(KLockAcquire(lock));
+
+    REQUIRE_RC(StartThread());
+    REQUIRE_RC(KConditionWait(cond, lock));
+    REQUIRE(is_signaled == true);
+
+    REQUIRE_RC(KLockUnlock(lock));
+}
+
+///////////////////////// KQueue
+TEST_CASE( KQueue_NULL )
+{
+    REQUIRE_RC_FAIL(KQueueMake(NULL, 1));
+}
+
+TEST_CASE(KQueueSimpleTest) {
+    KQueue * queue = NULL;
+    REQUIRE_RC(KQueueMake(&queue, 2));
+
+    void *item = NULL;
+    {   // pushed 2 - popped 2 = ok
+        for (uint64_t i = 1; i < 3; ++i) {
+            item = (void*)i;
+            REQUIRE_RC(KQueuePush(queue, item, NULL));
+        }
+        for (uint64_t i = 1; i < 3; ++i) {
+            uint64_t j = 0;
+            REQUIRE_RC(KQueuePop(queue, &item, NULL));
+            j = (uint64_t)item;
+            REQUIRE_EQ(i, j);
+        }
+    }
+
+    {   // pushed 3 > capacity (failure) - popped 2 (ok)
+        for (uint64_t i = 1; i < 3; ++i) {
+            void *item = (void*)i;
+            REQUIRE_RC(KQueuePush(queue, item, NULL));
+        }
+        REQUIRE_RC_FAIL(KQueuePush(queue, item, NULL));
+        for (uint64_t i = 1; i < 3; ++i) {
+            uint64_t j = 0;
+            void *item = 0;
+            REQUIRE_RC(KQueuePop(queue, &item, NULL));
+            j = (uint64_t)item;
+            REQUIRE_EQ(i, j);
+        }
+    }
+
+    {   // pushed 2 = capacity (ok) - popped 3 >capacity (failure)
+        for (uint64_t i = 1; i < 3; ++i) {
+            void *item = (void*)i;
+            REQUIRE_RC(KQueuePush(queue, item, NULL));
+        }
+        for (uint64_t i = 1; i < 3; ++i) {
+            uint64_t j = 0;
+            void *item = 0;
+            REQUIRE_RC(KQueuePop(queue, &item, NULL));
+            j = (uint64_t)item;
+            REQUIRE_EQ(i, j);
+        }
+        REQUIRE_RC_FAIL(KQueuePop(queue, &item, NULL));
+    }
+
+    REQUIRE_RC(KQueueRelease(queue));
+}
+
+class KQueueFixture
+{
+public:
+    KQueueFixture()
+    :   threadRcs(NULL),
+        threads(NULL),
+        threadsData(NULL),
+        nThreads(32),
+        nStartedThreads(0),
+        sealed(false)
+    {
+        threads = (KThread**)malloc(sizeof(*threads) * nThreads);
+        if (threads == NULL)
+            throw logic_error("KQueueFixture: threads malloc failed");
+        threadsData = (ThreadData*)calloc(nThreads, sizeof(*threadsData));
+        if (threadsData == NULL)
+            throw logic_error("KQueueFixture: threadsData malloc failed");
+        threadRcs = (rc_t*)calloc(nThreads, sizeof(*threadRcs));
+        if (threadRcs == NULL)
+            throw logic_error("KQueueFixture: threadRcs calloc failed");
+        if (KQueueMake(&queue, nThreads) != 0)
+            throw logic_error("KQueueFixture: KQueueMake failed");
+    }
+    ~KQueueFixture()
+    {
+        if (threads != NULL)
+        {
+            for (unsigned i = 0; i < nStartedThreads; ++i)
+            {
+                if (threads[i] != 0 && KThreadRelease(threads[i]) != 0)
+                    throw logic_error("~KQueueFixture: KThreadRelease failed");
+            }
+        }
+        free(threads);
+        free(threadsData);
+        free(threadRcs);
+
+        if (KQueueRelease((const KQueue*)queue) != 0)
+            throw logic_error("~KQueueFixture: KQueueRelease failed");
+    }
+
+protected:
+    struct ThreadData {
+        KQueue * queue;
+        int tid;
+        size_t max_tid;
+        uint32_t timeout_ms;
+        bool is_reader;
+        bool finish; // will stop generating events and seal the queue once detected
+        bool allow_timeout; // if set, we won't treat timeout as an error
+    };
+
+    class Thread {
+    public:
+        // danger - this should be an extern "C" function
+        // with CC calling convention on Windows
+        static rc_t KQueue_ThreadFn ( const KThread *thread, void *data )
+        {
+            ThreadData* td = (ThreadData*)data;
+            rc_t rc = 0;
+            int numOps = 8192;
+
+            for (int i = 0; i < numOps; ++i)
+            {
+                timeout_t tm;
+                timeout_t* tm_p = td->timeout_ms == 0 ? NULL : &tm;
+                void * item;
+                if (tm_p != NULL)
+                rc = TimeoutInit(tm_p, td->timeout_ms);
+                if (rc != 0)
+                {
+                    LOG(LogLevel::e_fatal_error, "KQueue_ThreadFn: TimeoutInit failed\n");
+                    break;
+                }
+                if (td->finish)
+                {
+                    rc = KQueueSeal(td->queue);
+                    if (rc != 0)
+                        LOG(LogLevel::e_fatal_error, "KQueue_ThreadFn: failed to seal queue\n");
+                    break;
+                }
+                else if (td->is_reader)
+                {
+                    rc = KQueuePop(td->queue, &item, tm_p);
+                    if (rc == 0 && (item == NULL || (uint64_t)item > td->max_tid))
+                    {
+                        std::stringstream ss;
+                        ss << "KQueue_ThreadFn: KQueuePop returned invalid item: " << (uint64_t)item << "\n";
+                        LOG(LogLevel::e_fatal_error, ss.str().c_str());
+                        rc = RC(rcExe, rcQueue, rcValidating, rcItem, rcOutofrange);
+                        break;
+                    }
+                }
+                else
+                {
+                    item = reinterpret_cast<void*>(td->tid);
+                    rc = KQueuePush(td->queue, item, tm_p);
+                }
+
+                if (rc != 0)
+                {
+                    if (td->allow_timeout && GetRCObject ( rc ) == (enum RCObject)rcTimeout)
+                        rc = 0;
+                    else if (GetRCObject ( rc ) == (enum RCObject)rcData && GetRCState ( rc ) == rcDone)
+                        break;
+                    else if (GetRCObject ( rc ) == (enum RCObject)rcQueue && GetRCState ( rc ) == rcReadonly)
+                        break;
+                    else
+                    {
+                        LOGERR ( klogFatal, rc, "KQueue_ThreadFn: failed to push/pop to/from queue" );
+                        break;
+                    }
+                }
+
+            }
+
+            return rc;
+        }
+    };
+
+    void StartThread(bool is_reader, bool allow_timeout, uint32_t timeout_ms)
+    {
+        if (nStartedThreads >= nThreads)
+            throw logic_error("StartThread: too many threads requested");
+        if (sealed)
+            throw logic_error("StartThread: cannot start new thread, fixture is already sealed");
+
+        rc_t rc;
+        int tid = nStartedThreads++;
+        ThreadData* td;
+
+        td = &threadsData[tid];
+        td->tid = tid;
+        td->max_tid = nThreads - 1;
+        td->is_reader = is_reader;
+        td->allow_timeout = allow_timeout;
+        td->queue = queue;
+        td->timeout_ms = timeout_ms;
+        rc = KThreadMake(&threads[tid], Thread::KQueue_ThreadFn, td);
+        if (rc != 0)
+            throw logic_error("StartThread: KThreadMake failed");
+    }
+
+    void StartThreads(int numReaders, int numWriters, bool allow_timeout = true, uint32_t timeout_ms = 0)
+    {
+        if (numReaders + numWriters + nStartedThreads > nThreads)
+            throw logic_error("RunThreads: too many threads requested");
+        if (numReaders <= 0)
+            throw logic_error("RunThreads: please specify at least one reader");
+        if (numWriters <= 0)
+            throw logic_error("RunThreads: please specify at least one writer");
+
+        for (int i = 0; i < numReaders; ++i)
+        {
+            StartThread(true, allow_timeout, timeout_ms);
+        }
+        for (int i = 0; i < numWriters; ++i)
+        {
+            StartThread(false, allow_timeout, timeout_ms);
+        }
+    }
+
+    void WaitThreads(bool checkRcs = true)
+    {
+        rc_t rc = 0;
+        sealed = true;
+        for (unsigned i = 0; i < nStartedThreads; ++i)
+        {
+            rc_t rc2 = KThreadWait(threads[i], &threadRcs[i]);
+            if (rc2 != 0)
+            {
+                LOG(LogLevel::e_fatal_error, "KThreadWait: KThreadWait failed\n");
+                if (rc == 0)
+                    rc = rc2;
+            }
+        }
+        if (rc != 0)
+            throw logic_error("WaitThreads: KThreadWait failed");
+        if (checkRcs)
+            CheckThreadsRc();
+
+    }
+    void CheckThreadsRc()
+    {
+        for (unsigned i = 0; i < nStartedThreads; ++i)
+        {
+            if (threadRcs[i] != 0)
+                throw logic_error("CheckThreadsRc: thread returned unexpected exit code");
+        }
+    }
+
+public:
+    rc_t* threadRcs;
+    KThread** threads;
+    ThreadData* threadsData;
+    size_t nThreads;
+    size_t nStartedThreads;
+    KQueue* queue;
+    bool sealed;
+};
+
+FIXTURE_TEST_CASE(KQueue_Single_Reader_Single_Writer, KQueueFixture)
+{
+    StartThreads(1, 1);
+    WaitThreads();
+}
+
+FIXTURE_TEST_CASE(KQueue_Multi_Reader_Single_Writer, KQueueFixture)
+{
+    StartThreads(31, 1);
+    WaitThreads();
+}
+
+FIXTURE_TEST_CASE(KQueue_Single_Reader_Multi_Writer, KQueueFixture)
+{
+    StartThreads(1, 31);
+    WaitThreads();
+}
+
+FIXTURE_TEST_CASE(KQueue_Multi_Reader_Multi_Writer, KQueueFixture)
+{
+    StartThreads(16, 16, false, 5000);
+    WaitThreads();
+}
+
+FIXTURE_TEST_CASE(KQueue_Multi_Reader_Single_Writer_Seal, KQueueFixture)
+{
+    KTimeMs_t timeBefore = KTimeMsStamp();
+    const int numReaders = 31;
+    const int timeoutMs = 5000;
+    StartThreads(numReaders, 1, false, timeoutMs);
+    threadsData[numReaders].finish = true;
+    WaitThreads(false);
+    KTimeMs_t timeAfter = KTimeMsStamp();
+    for (unsigned i = 0; i < nStartedThreads; ++i)
+    {
+        rc_t expectedRc = (i == numReaders) ? 0 : SILENT_RC ( rcCont, rcQueue, rcRemoving, rcData, rcDone );
+        REQUIRE_EQ ( threadRcs[i], expectedRc );
+    }
+    REQUIRE_LT ( (int)(timeAfter - timeBefore), timeoutMs );
+}
+
+FIXTURE_TEST_CASE(KQueue_Single_Reader_Multi_Writer_Seal, KQueueFixture)
+{
+    KTimeMs_t timeBefore = KTimeMsStamp();
+    const int numWriters = 31;
+    const int timeoutMs = 5000;
+    StartThreads(1, numWriters, false, timeoutMs);
+    threadsData[0].finish = true;
+    WaitThreads(false);
+    KTimeMs_t timeAfter = KTimeMsStamp();
+    for (unsigned i = 0; i < nStartedThreads; ++i)
+    {
+        rc_t expectedRc = (i == 0) ? 0 : SILENT_RC ( rcCont, rcQueue, rcInserting, rcQueue, rcReadonly );
+        REQUIRE_EQ ( threadRcs[i], expectedRc );
+    }
+    REQUIRE_LT ( (int)(timeAfter - timeBefore), timeoutMs );
+}
+
+//TODO: KConditionWait, KConditionTimedWait, KConditionSignal, KConditionBroadcast
+
+//TODO: KSemaphore
+//TODO: Timeout
+//TODO: KBarrier (is it used anywhere? is there a Windows implementation?)
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+
+rc_t CC UsageSummary ( const char * progname )
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+
+const char UsageDefaultName[] = "test-kproc";
+
+static rc_t argsHandler(int argc, char* argv[]) {
+    Args* args = NULL;
+    rc_t rc = ArgsMakeAndHandle(&args, argc, argv, 0, NULL, 0);
+    ArgsWhack(args);
+    return rc;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+	// this makes messages from the test code appear
+	// (same as running the executable with "-l=message")
+	//TestEnv::verbosity = LogLevel::e_message;
+    
+    rc_t rc = KProcTestSuite( argc, argv );
+    return rc;
+}
+
+}
diff --git a/test/krypto/Makefile b/test/krypto/Makefile
new file mode 100644
index 0000000..67fb045
--- /dev/null
+++ b/test/krypto/Makefile
@@ -0,0 +1,215 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+MODULE = test/krypto
+
+INT_TOOLS = \
+
+ifeq (linux,$(OS))
+INT_TOOLS += \
+	test-cipher-speed
+endif
+
+TEST_TOOLS = \
+	test-modes \
+	test-encdec \
+	test-reenc \
+#	test-csprng \ --- not even being compiled in ncbi-vdb, skipping for now
+
+ifeq (linux,$(OS))
+TEST_TOOLS += \
+	test-aes-ciphers
+endif
+
+SLOW_TEST_TOOLS= \
+	test-krypto-slow \
+
+EXT_TOOLS =
+
+ALL_TOOLS = \
+	$(INT_TOOLS) \
+	$(EXT_TOOLS) \
+	$(TEST_TOOLS) \
+	$(SLOW_TEST_TOOLS) \
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+	@ $(MAKE_CMD) $(TARGDIR)/std
+
+$(ALL_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+	$(addprefix $(TEST_BINDIR)/,$(ALL_TOOLS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# test encryption modes
+#
+TEST_MODES_SRC = \
+	test-modes
+
+TEST_MODES_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_MODES_SRC))
+
+TEST_MODES_LIB = \
+	-skapp \
+    -sncbi-vdb
+
+$(TEST_BINDIR)/test-modes: $(TEST_MODES_OBJ)
+	$(LD) --exe -o $@ $^ $(TEST_MODES_LIB)
+
+#-------------------------------------------------------------------------------
+# test AES encryption ciphers
+#
+TEST_AES_CIPHERS_SRC = \
+	test-aes-ciphers
+
+TEST_AES_CIPHERS_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_AES_CIPHERS_SRC))
+
+TEST_AES_CIPHERS_LIB = \
+	-skryptotest \
+	-skapp \
+    -sncbi-vdb
+
+$(TEST_BINDIR)/test-aes-ciphers: $(TEST_AES_CIPHERS_OBJ)
+	$(LD) --exe -o $@ $^ $(TEST_AES_CIPHERS_LIB)
+
+#-------------------------------------------------------------------------------
+# test cipher speed
+# run a null cipher and the aes cipher in all implmentations supported on the
+# test machine.
+# Comparing specific two versions will test possible speed gains from verious 
+# optimizations.  Comparing the null cipher (just a copy) versions against each
+# other offer insight into whether vector and vector register optimiztions are
+# beneficial and by how much
+#
+TEST_CIPHER_SPEED_SRC = \
+	test-cipher-speed
+
+TEST_CIPHER_SPEED_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_CIPHER_SPEED_SRC))
+
+TEST_CIPHER_SPEED_LIB = \
+	-skryptotest \
+	-skapp \
+    -sncbi-vdb
+
+$(TEST_BINDIR)/test-cipher-speed: $(TEST_CIPHER_SPEED_OBJ)
+	$(LD) --exe -o $@ $^ $(TEST_CIPHER_SPEED_LIB)
+
+#-------------------------------------------------------------------------------
+# test KCSPRng : cryptographically secure pseudo-random number generator
+#
+TEST_CSPRNG_SRC = \
+	test-csprng
+
+TEST_CSPRNG_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_CSPRNG_SRC))
+
+TEST_CSPRNG_LIB = \
+	-skapp \
+	-sncbi-vdb
+
+
+$(TEST_BINDIR)/test-csprng: $(TEST_CSPRNG_OBJ)
+	$(LD) --exe -o $@ $^ $(TEST_CSPRNG_LIB)
+
+#-------------------------------------------------------------------------------
+# test-encdec
+#
+TEST_ENCDEC_SRC = \
+	test-encdec \
+	test-cmn
+
+TEST_ENCDEC_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_ENCDEC_SRC))
+
+TEST_ENCDEC_LIB = \
+	-skapp \
+    -sncbi-vdb \
+    -sktst
+
+$(TEST_BINDIR)/test-encdec: $(TEST_ENCDEC_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_ENCDEC_LIB)
+
+#-------------------------------------------------------------------------------
+# test-reenc
+#
+TEST_REENC_SRC = \
+	test-reenc \
+	test-cmn
+
+TEST_REENC_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_REENC_SRC))
+
+TEST_REENC_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sktst
+
+$(TEST_BINDIR)/test-reenc: $(TEST_REENC_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_REENC_LIB)
+
+#-------------------------------------------------------------------------------
+# test-krypto-slow
+#
+TEST_KRYPTO_SLOW_SRC = \
+	test-krypto-slow \
+	test-cmn
+
+TEST_KRYPTO_SLOW_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_KRYPTO_SLOW_SRC))
+
+TEST_KRYPTO_SLOW_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sktst
+
+
+$(TEST_BINDIR)/test-krypto-slow: $(TEST_KRYPTO_SLOW_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_KRYPTO_SLOW_LIB)
+
diff --git a/test/krypto/test-aes-ciphers.c b/test/krypto/test-aes-ciphers.c
new file mode 100644
index 0000000..7c582bd
--- /dev/null
+++ b/test/krypto/test-aes-ciphers.c
@@ -0,0 +1,792 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+/*
+ * don't compare inverse cipher when we know we are using 
+ * equivalent inverse cipher
+ */
+#define COMPARE_INV_CIPHER 0
+
+/*
+ * do compare equivalent inverse cipher when we know we are using 
+ * equivalent inverse cipher
+ */
+#define COMPARE_EQ_INV_CIPHER 1
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <krypto/ciphermgr.h>
+#include <krypto/cipher.h>
+#include <krypto/cipher-test.h>
+#include "../../libs/krypto/blockcipher-priv.h"
+#include "../../libs/krypto/cipher-priv.h"
+#include "../../libs/krypto/cipher-impl.h"
+#include "../../libs/krypto/aes-priv.h"
+
+#include <klib/status.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+#include <klib/defs.h>
+
+#include <byteswap.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+/*
+  https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
+
+  http://www.inconteam.com/software-development/41-encryption/55-aes-test-vectors
+*/
+
+const char * types[]
+= 
+{
+    "AES byte",
+    "AES vector",
+    "AES vector register",
+    "AES accelerated(AES-NI)"
+};
+
+static const char * passed_string[] = {"DID NOT MATCH ++++++++++","matched"};
+
+int error_count;
+int test_count;
+int subtype_iterator;
+
+
+bool key_compare (const AES_KEY * control, const AES_KEY * test)
+{
+    uint32_t ix;
+    uint32_t limit;
+    bool passed_rounds = true;
+    bool passed_keys = true;
+
+    passed_rounds = (control->rounds == test->rounds);
+
+    STSMSG (4,("rounds:\t%d : %d\t%s\n", control->rounds, test->rounds,
+               passed_string[passed_rounds]));
+
+    limit = (control->rounds + 1) * 4;
+    for (ix = 0; ix < limit; ++ix)
+    {
+        bool this_key;
+
+        this_key = ((control->rd_key[ix] == bswap_32(test->rd_key[ix])) ||
+                    (control->rd_key[ix] == test->rd_key[ix]));
+
+        passed_keys = passed_keys && this_key;
+
+        STSMSG (4,("rd_key[%d]\t%0.8x : %0.8x\t%s\n",
+                   ix, control->rd_key[ix], test->rd_key[ix],
+                   passed_string[this_key]));
+    }
+
+    return passed_rounds && passed_keys;
+}
+
+
+bool block_compare (const uint8_t control [16], const uint8_t test [16])
+{
+    uint32_t ix;
+    bool passed = true;
+
+    for (ix = 0; ix < 16; ++ix)
+    {
+        bool passed_this;
+
+        passed_this = (control[ix] == test[ix]);
+
+        passed = passed && passed_this;
+
+        STSMSG (4,("byte %u: control %0.2x test %0.2x %s\n",
+                   ix, 
+                   control[ix], test[ix],
+                   passed_string[passed_this]));
+    }
+    return passed;
+}
+
+
+typedef struct key_expansion
+{
+    uint8_t key [32];
+    AES_KEY key_schedule;
+    unsigned Nk;
+} key_expansion;
+
+
+const key_expansion  a_1 = 
+{
+    {
+        0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
+        0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
+    },
+    {
+        {
+            0x16157e2b, 0xa6d2ae28, 0x8815f7ab, 0x3c4fcf09,
+            0x17fefaa0, 0xb12c5488, 0x3939a323, 0x05766c2a,
+            0xf295c2f2, 0x43b9967a, 0x7a803559, 0x7ff65973,
+            0x7d47803d, 0x3efe1647, 0x447e231e, 0x3b887a6d,
+            0x41a544ef, 0x7f5b52a8, 0x3b2571b6, 0x00ad0bdb,
+            0xf8c6d1d4, 0x879d837c, 0xbcb8f2ca, 0xbc15f911,
+            0x7aa3886d, 0xfd3e0b11, 0x4186f9db, 0xfd9300ca,
+            0x0ef7544e, 0xf3c95f5f, 0xb24fa684, 0x4fdca64e,
+            0x2173d2ea, 0xd2ba8db5, 0x60f52b31, 0x2f298d7f,
+            0xf36677ac, 0x21dcfa19, 0x4129d128, 0x6e005c57,
+            0xa8f914d0, 0x8925eec9, 0xc80c3fe1, 0xa60c63b6
+        },
+        10
+    },
+    16
+};
+
+
+const key_expansion a_2 = {
+    { 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
+      0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
+      0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b },
+    { 
+        { 0xf7b0738e, 0x52640eda, 0x2bf310c8, 0xe5799080, /* 0-3 */
+          0xd2eaf862, 0x7b6b2c52, 0xf7910cfe, 0xa5f50224, /* 4-7 */
+          0x8e0612ec, 0x6b7f826c, 0xb9957a0e, 0xc2fe565c, /* 8-11 */
+          0xbdb4b74d, 0x1841b569, 0x9647a785, 0xfd3825e9, /* 12-15 */
+          0x44ad5fe7, 0x865309bb, 0x57f05a48, 0x4fb1ef21, /* 16-19 */
+          0xd9f648a4, 0x24ce6d4d, 0x606332aa, 0xe6303b11, /* 20-23 */
+          0xd57e5ea2, 0x9acfb183, 0x4339f927, 0x67f7946a, /* 24-27 */
+          0x0794a6c0, 0xe1a49dd1, 0xeb8617ec, 0x7149a66f, /* 28-31 */
+          0x32705f48, 0x5587cb22, 0x52136de2, 0xb3b7f033, /* 32-35 */
+          0x28ebbe40, 0x59a2182f, 0x6bd24767, 0x3e558c45, /* 36-39 */
+          0x6c46e1a7, 0xdff11194, 0x0a751f82, 0x53d707ad, /* 40-43 */
+          0x380540ca, 0x0650cc8f, 0x6a162d28, 0xb5e73cbc, /* 44-47 */
+          0x6fa08be9, 0x3c778c44, 0x0472cc8e, 0x02220001  /* 48-51 */
+        },
+        12
+    },
+    24
+};
+
+const key_expansion a_3 = {
+    { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
+      0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
+      0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
+
+      0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 },
+    {    { 0x10eb3d60, 0xbe71ca15, 0xf0ae732b, 0x81777d85,
+           0x072c351f, 0xd708613b, 0xa310982d, 0xf4df1409,
+           0x1154a39b, 0xaf25698e, 0x5f8b1aa5, 0xdefc6720,
+           0x1a9cb0a8, 0xcd94d193, 0x6e8449be, 0x9a5b5db7,
+           0xb8ec9ad5, 0x17c9f35b, 0x4842e9fe, 0x96be8ede,
+           0x8a32a9b5, 0x47a67826, 0x29223198, 0xb3796c2f,
+           0xad812c81, 0xba48dfda, 0xf20a3624, 0x64b4b8fa,
+           0xc9bfc598, 0x8e19bdbe, 0xa73b8c26, 0x1442e009,
+           0xac7b0068, 0x1633dfb2, 0xe439e996, 0x808d516c,
+           0x04e214c8, 0x8afba976, 0x2dc02550, 0x3982c559,
+           0x676913de, 0x715acc6c, 0x956325fa, 0x15ee7496,
+           0x5dca8658, 0xd7312f2e, 0xfaf10a7e, 0xc373cf27,
+           0xab479c74, 0xda1d5018, 0x4f7e75e2, 0x5a900174,
+           0xe3aafaca, 0x349bd5e4, 0xce6adf9a, 0x0d1910bd,
+           0xd19048fe, 0x0b8d18e6, 0x44f36d04, 0x1e636c70, },
+         14
+    },
+    32
+};
+
+bool KeyExpansion (KCipher * cipher, const key_expansion * ke)
+{
+    rc_t rc;
+
+    rc = KCipherSetEncryptKey (cipher, ke->key, ke->Nk);
+    if (rc)
+    {
+        STSMSG (1,("Could not run test"));
+        return false;
+    }
+    else
+    {
+        return (key_compare (&ke->key_schedule, cipher->encrypt_key));
+    }
+}
+
+
+typedef struct cipher_example
+{
+    uint8_t key [16];
+    AES_KEY key_schedule;
+    uint8_t plain [16];
+    uint8_t cipher [16];
+} cipher_example;
+
+const cipher_example b = 
+{
+    { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
+      0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
+    },
+    {
+        { 0x16157e2b, 0xa6d2ae28, 0x8815f7ab, 0x3c4fcf09,
+          0x17fefaa0, 0xb12c5488, 0x3939a323, 0x05766c2a,
+          0xf295c2f2, 0x43b9967a, 0x7a803559, 0x7ff65973,
+          0x7d47803d, 0x3efe1647, 0x447e231e, 0x3b887a6d,
+          0x41a544ef, 0x7f5b52a8, 0x3b2571b6, 0x00ad0bdb,
+          0xf8c6d1d4, 0x879d837c, 0xbcb8f2ca, 0xbc15f911,
+          0x7aa3886d, 0xfd3e0b11, 0x4186f9db, 0xfd9300ca,
+          0x0ef7544e, 0xf3c95f5f, 0xb24fa684, 0x4fdca64e,
+          0x2173d2ea, 0xd2ba8db5, 0x60f52b31, 0x2f298d7f,
+          0xf36677ac, 0x21dcfa19, 0x4129d128, 0x6e005c57,
+          0xa8f914d0, 0x8925eec9, 0xc80c3fe1, 0xa60c63b6 },
+        10
+    },
+    {
+        
+        0x32, 0x43, 0xF6, 0xA8, 0x88, 0x5A, 0x30, 0x8D,
+        0x31, 0x31, 0x98, 0xA2, 0xE0, 0x37, 0x07, 0x34
+    },
+    {
+        0x39, 0x25, 0x84, 0x1D, 0x02, 0xDC, 0x09, 0xFB,
+        0xDC, 0x11, 0x85, 0x97, 0x19, 0x6A, 0x0B, 0x32
+    }
+};
+
+
+bool CipherExample (KCipher * cipher)
+{
+    uint8_t cipher_text [16];
+    rc_t rc;
+    bool passed_key;
+    bool passed_block;
+
+    memset (cipher_text, 0, sizeof cipher_text);
+
+    rc = KCipherSetEncryptKey (cipher, b.key, 128/8);
+    if (rc)
+        ;
+    else
+    {
+        passed_key = key_compare (&b.key_schedule, cipher->encrypt_key);
+        rc = KCipherEncrypt (cipher, b.plain, cipher_text);
+        if (rc)
+            ;
+        else
+        {
+            passed_block = block_compare (b.cipher, cipher_text);
+        }
+    }
+    if (rc)
+    {
+        STSMSG (1,("Could not run test"));
+        return false;
+    }
+    return passed_key && passed_block;
+}
+
+typedef struct example_vectors
+{
+    uint8_t plain [16];
+    uint8_t key [32];
+    uint8_t cipher [16];
+    AES_KEY key_enc;
+    AES_KEY key_dec;
+    AES_KEY key_dec_alt;
+} example_vectors;
+
+
+example_vectors c_1 = 
+{
+    /* Plain text */
+    {
+        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
+    },
+    /* User Key */
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+    },
+    /* Cipher Text */
+    {
+        0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30, 0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a
+    },
+    {
+/* EncKey */
+        {
+
+
+            0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
+            0xfd74aad6, 0xfa72afd2, 0xf178a6da, 0xfe76abd6,
+            0x0bcf92b6, 0xf1bd3d64, 0x00c59bbe, 0xfeb33068,
+            0x4e74ffb6, 0xbfc9c2d2, 0xbf0c596c, 0x41bf6904,
+            0xbcf7f747, 0x033e3595, 0xbc326cf9, 0xfd8d05fd,
+            0xe8a3aa3c, 0xeb9d9fa9, 0x57aff350, 0xaa22f6ad,
+            0x7d0f395e, 0x9692a6f7, 0xc13d55a7, 0x6b1fa30a,
+            0x1a70f914, 0x8ce25fe3, 0x4ddf0a44, 0x26c0a94e,
+            0x35874347, 0xb9651ca4, 0xf4ba16e0, 0xd27abfae,
+            0xd1329954, 0x685785f0, 0x9ced9310, 0x4e972cbe,
+            0x7f1d1113, 0x174a94e3, 0x8ba707f3, 0xc5302b4d
+        },
+        10
+    },
+    {
+/* DecKey */
+        {
+            0x7f1d1113, 0x174a94e3, 0x8ba707f3, 0xc5302b4d,
+            0xd1329954, 0x685785f0, 0x9ced9310, 0x4e972cbe,
+            0x35874347, 0xb9651ca4, 0xf4ba16e0, 0xd27abfae,
+            0x1a70f914, 0x8ce25fe3, 0x4ddf0a44, 0x26c0a94e,
+            0x7d0f395e, 0x9692a6f7, 0xc13d55a7, 0x6b1fa30a,
+            0xe8a3aa3c, 0xeb9d9fa9, 0x57aff350, 0xaa22f6ad,
+            0xbcf7f747, 0x033e3595, 0xbc326cf9, 0xfd8d05fd,
+            0x4e74ffb6, 0xbfc9c2d2, 0xbf0c596c, 0x41bf6904,
+            0x0bcf92b6, 0xf1bd3d64, 0x00c59bbe, 0xfeb33068,
+            0xfd74aad6, 0xfa72afd2, 0xf178a6da, 0xfe76abd6,
+            0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c
+        },
+        10
+    },
+    {
+/* EquivDecKey */
+        {
+            0x7f1d1113, 0x174a94e3, 0x8ba707f3, 0xc5302b4d,
+            0xbe29aa13, 0xf6af8f9c, 0x80f570f7, 0x03bff700,
+            0x63a46213, 0x4886258f, 0x765aff6b, 0x834a87f7,
+            0x74fc828d, 0x2b22479c, 0x3edcdae4, 0xf510789c,
+            0x8d09e372, 0x5fdec511, 0x15fe9d78, 0xcbcca278,
+            0x2710c42e, 0xd2d72663, 0x4a205869, 0xde323f00,
+            0x04f5a2a8, 0xf5c7e24d, 0x98f77e0a, 0x94126769,
+            0x91e3c6c7, 0xf13240e5, 0x6d309c47, 0x0ce51963,
+            0x9902dba0, 0x60d18622, 0x9c02dca2, 0x61d58524,
+            0xf0df568c, 0xf9d35d82, 0xfcd35a80, 0xfdd75986,
+            0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
+        },
+        10
+    }
+};
+
+example_vectors c_2 = 
+{
+    /* Plain text */
+    {
+        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
+    },
+    /* User Key */
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+        0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+    },
+    /* Cipher Text */
+    {
+        0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0, 0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91
+    },
+    {
+/* EncKey */
+        {
+            0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
+            0x13121110, 0x17161514, 0xf9f24658, 0xfef4435c,
+            0xf5fe4a54, 0xfaf04758, 0xe9e25648, 0xfef4435c,
+            0xb349f940, 0x4dbdba1c, 0xb843f048, 0x42b3b710,
+            0xab51e158, 0x55a5a204, 0x41b5ff7e, 0x0c084562,
+            0xb44bb52a, 0xf6f8023a, 0x5da9e362, 0x080c4166,
+            0x728501f5, 0x7e8d4497, 0xcac6f1bd, 0x3c3ef387,
+            0x619710e5, 0x699b5183, 0x9e7c1534, 0xe0f151a3,
+            0x2a37a01e, 0x16095399, 0x779e437c, 0x1e0512ff,
+            0x880e7edd, 0x68ff2f7e, 0x42c88f60, 0x54c1dcf9,
+            0x235f9f85, 0x3d5a8d7a, 0x5229c0c0, 0x3ad6efbe,
+            0x781e60de, 0x2cdfbc27, 0x0f8023a2, 0x32daaed8,
+            0x330a97a4, 0x09dc781a, 0x71c218c4, 0x5d1da4e3
+        },
+        12
+    },
+    {
+/* DecKey */
+        {
+            0x330a97a4, 0x09dc781a, 0x71c218c4, 0x5d1da4e3,
+        },
+        12
+    },
+    {
+/* EquivDecKey */
+        {
+            0x330a97a4, 0x09dc781a, 0x71c218c4, 0x5d1da4e3,
+            0x0dbdbed6, 0x49ea09c2, 0x8073b04d, 0xb91b023e,
+            0xc999b98f, 0x3968b273, 0x9dd8f9c7, 0x728cc685,
+            0xc16e7df7, 0xef543f42, 0x7f317853, 0x4457b714,
+            0x90654711, 0x3b66cf47, 0x8dce0e9b, 0xf0f10bfc,
+            0xb6a8c1dc, 0x7d3f0567, 0x4a195ccc, 0x2e3a42b5,
+            0xabb0dec6, 0x64231e79, 0xbe5f05a4, 0xab038856,
+            0xda7c1bdd, 0x155c8df2, 0x1dab498a, 0xcb97c4bb,
+            0x08f7c478, 0xd63c8d31, 0x01b75596, 0xcf93c0bf,
+            0x10efdc60, 0xce249529, 0x15efdb62, 0xcf20962f,
+            0xdbcb4e4b, 0xdacf4d4d, 0xc7d75257, 0xdecb4949,
+            0x1d181f1a, 0x191c1b1e, 0xd7c74247, 0xdecb4949,
+            0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c
+        },
+        12
+    }
+};
+
+example_vectors c_3 = 
+{
+    /* Plain text */
+    {
+        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
+    },
+    /* User Key */
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+        0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+    },
+    /* Cipher Text */
+    {
+        0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf, 0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89
+    },
+    {
+/* EncKey */
+        {
+            0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
+            0x13121110, 0x17161514, 0x1b1a1918, 0x1f1e1d1c,
+            0x9fc273a5, 0x98c476a1, 0x93ce7fa9, 0x9cc072a5,
+            0xcda85116, 0xdabe4402, 0xc1a45d1a, 0xdeba4006,
+            0xf0df87ae, 0x681bf10f, 0xfbd58ea6, 0x6715fc03,
+            0x48f1e16d, 0x924fa56f, 0x53ebf875, 0x8d51b873,
+            0x7f8256c6, 0x1799a7c9, 0xec4c296f, 0x8b59d56c,
+            0x753ae23d, 0xe7754752, 0xb49ebf27, 0x39cf0754,
+            0x5f90dc0b, 0x48097bc2, 0xa44552ad, 0x2f1c87c1,
+            0x60a6f545, 0x87d3b217, 0x334d0d30, 0x0a820a64,
+            0x1cf7cf7c, 0x54feb4be, 0xf0bbe613, 0xdfa761d2,
+            0xfefa1af0, 0x7929a8e7, 0x4a64a5d7, 0x40e6afb3,
+            0x71fe4125, 0x2500f59b, 0xd5bb1388, 0x0a1c725a,
+            0x99665a4e, 0xe04ff2a9, 0xaa2b577e, 0xeacdf8cd,
+            0xcc79fc24, 0xe97909bf, 0x3cc21a37, 0x36de686d
+        },
+        14
+    },
+    {
+/* DecKey */
+        {
+
+
+            0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c
+        },
+        14
+    },
+    {
+/* EquivDecKey */
+        {
+            0xcc79fc24, 0xe97909bf, 0x3cc21a37, 0x36de686d,
+            0xffd1f134, 0x2faacebf, 0x5fe2e9fc, 0x6e015825,
+            0xeb48165e, 0x0a354c38, 0x46b77175, 0x84e680dc,
+            0x8005a3c8, 0xd07b3f8b, 0x70482743, 0x31e3b1d9,
+            0x138e70b5, 0xe17d5a66, 0x4c823d4d, 0xc251f1a9,
+            0xa37bda74, 0x507e9c43, 0xa03318c8, 0x41ab969a,
+            0x1597a63c, 0xf2f32ad3, 0xadff672b, 0x8ed3cce4,
+            0xf3c45ff8, 0xf3054637, 0xf04d848b, 0xe1988e52,
+            0x9a4069de, 0xe7648cef, 0x5f0c4df8, 0x232cabcf,
+            0x1658d5ae, 0x00c119cf, 0x0348c2bc, 0x11d50ad9,
+            0xbd68c615, 0x7d24e531, 0xb868c117, 0x7c20e637,
+            0x0f85d77f, 0x1699cc61, 0x0389db73, 0x129dc865,
+            0xc940282a, 0xc04c2324, 0xc54c2426, 0xc4482720,
+            0x1d181f1a, 0x191c1b1e, 0x15101712, 0x11141316,
+            0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c
+        },
+        14
+    }
+};
+
+bool ExampleVector (KCipher * cipher, const example_vectors * ev)
+{
+    uint8_t cipher_text [16];
+    uint8_t plain_text [16];
+    uint32_t Nk;
+    rc_t rc;
+    bool passed_enckey;
+    bool passed_deckey;
+    bool passed_enc;
+    bool passed_dec;
+
+    switch (ev->key_enc.rounds)
+    {
+    default:
+        STSMSG (1,("Bad test vector"));
+        return false;
+    case 10:
+        Nk = 16;
+        break;
+    case 12:
+        Nk = 24;
+        break;
+    case 14:
+        Nk = 32;
+        break;
+    }
+
+    memset (cipher_text, 0, sizeof cipher_text);
+    memset (plain_text, 0, sizeof plain_text);
+
+    rc = KCipherSetEncryptKey (cipher, ev->key, Nk);
+    if (rc)
+        ;
+    else
+    {
+        passed_enckey = key_compare (&ev->key_enc, cipher->encrypt_key);
+
+        rc = KCipherSetDecryptKey (cipher, ev->key, Nk);
+        if (rc)
+            ;
+        else
+        {
+#if COMPARE_INV_CIPHER
+            passed_deckey = key_compare (&ev->key_dec, cipher->decrypt_key);
+#endif
+#if COMPARE_EQ_INV_CIPHER
+            passed_deckey = key_compare (&ev->key_dec_alt, cipher->decrypt_key);
+#endif
+
+            rc = KCipherEncrypt (cipher, ev->plain, cipher_text);
+            if (rc)
+                ;
+            else
+            {
+                passed_enc = block_compare (ev->cipher, cipher_text);
+                
+                rc = KCipherDecrypt (cipher, ev->cipher, plain_text);
+                if (rc)
+                    ;
+                else
+                {
+                    passed_dec = block_compare (ev->plain, plain_text);
+                }
+            }
+        }
+    }
+    if (rc)
+    {
+        STSMSG (1,("Could not run test"));
+        return false;
+    }
+    return passed_enckey && passed_deckey && passed_enc && passed_dec;
+}
+
+
+/* ==================================================== */
+
+/* typedef uint8_t VVV __attribute__ ((vector_size (16))); unused and non-portable */ 
+
+bool run_one (KCipher * cipher)
+{
+    bool p_a_1 = true;
+    bool p_a_2 = true;
+    bool p_a_3 = true;
+    bool p_b = true;
+    bool p_c_1 = true;
+    bool p_c_2 = true;
+    bool p_c_3 = true;
+
+    STSMSG (2,("Appendix A - Key Expansion Examples"));
+    STSMSG (3,("A.1 Expansion of a 128-bit Cipher Key"));
+    p_a_1 = KeyExpansion (cipher, &a_1);
+    ++test_count;
+    if (p_a_1 == false)
+    {
+        STSMSG (1,("TEST FAILED"));
+        ++error_count;
+    }
+
+    STSMSG (3,("A.2 Expansion of a 192-bit Cipher Key"));
+    p_a_2 = KeyExpansion (cipher, &a_2);
+    ++test_count;
+    if (p_a_2 == false)
+    {
+        STSMSG (1,("TEST FAILED"));
+        ++error_count;
+    }
+
+    STSMSG (3,("A.3 Expansion of a 256-bit Cipher Key"));
+    p_a_3 = KeyExpansion (cipher, &a_3);
+    ++test_count;
+    if (p_a_3 == false)
+    {
+        STSMSG (1,("TEST FAILED"));
+        ++error_count;
+    }
+
+    STSMSG (2,("Appendix B - Cipher Example"));
+    p_b = CipherExample (cipher);
+    ++test_count;
+    if (p_b == false)
+    {
+        STSMSG (1,("TEST FAILED"));
+        ++error_count;
+    }
+
+    STSMSG (2,("Appendix C - Example Vectors"));
+    STSMSG (3,("C.1 AES-128 (Nk=4, Nr=10)"));
+    p_c_1 = ExampleVector (cipher, &c_1);
+    ++test_count;
+    if (p_c_1 == false)
+    {
+        STSMSG (1,("TEST FAILED"));
+        ++error_count;
+    }
+
+    STSMSG (3,("C.2 AES-192 (Nk=6, Nr=12)"));
+    p_c_2 = ExampleVector (cipher, &c_2);
+    ++test_count;
+    if (p_c_2 == false)
+    {
+        STSMSG (1,("TEST FAILED"));
+        ++error_count;
+    }
+
+    STSMSG (3,("C.3 AES-256 (Nk=8, Nr=14)"));
+    p_c_3= ExampleVector (cipher, &c_3);
+    ++test_count;
+    if (p_c_3 == false)
+    {
+        STSMSG (1,("TEST FAILED"));
+        ++error_count;
+    }
+
+    return p_a_1 && p_a_2 && p_a_3 && p_b && p_c_1 && p_c_2 && p_c_3;
+}
+
+
+rc_t run ()
+{
+    KCipher * cipher;
+    rc_t rc = 0, orc = 0;
+
+#if 1
+    subtype_iterator = 0;
+
+    STSMSG (1, ("======================================================================"));
+    STSMSG (1, ("%d: %s\n", subtype_iterator, types[subtype_iterator]));
+    rc = KCipherTestByteMake (&cipher, kcipher_AES);
+    if (rc == 0)
+    {
+        run_one (cipher);
+        KCipherRelease (cipher);
+    }
+    else if (GetRCState(rc) == rcUnsupported)
+        STSMSG (1, ("Not supported on this machine"));
+    else
+        orc = rc;
+#endif
+#if 1
+    subtype_iterator = 1;
+    STSMSG (1, ("======================================================================"));
+    STSMSG (1, ("%d: %s\n", subtype_iterator, types[subtype_iterator]));
+    rc = KCipherTestVecMake (&cipher, kcipher_AES);
+    if (rc == 0)
+    {
+        run_one (cipher);
+        KCipherRelease (cipher);
+    }
+    else if (GetRCState(rc) == rcUnsupported)
+        STSMSG (1, ("Not supported on this machine"));
+    else
+        orc = rc;
+#endif
+#if 1
+    subtype_iterator = 2;
+    STSMSG (1, ("======================================================================"));
+    STSMSG (1, ("%d: %s\n", subtype_iterator, types[subtype_iterator]));
+    rc = KCipherTestVecRegMake (&cipher, kcipher_AES);
+    if (rc == 0)
+    {
+        run_one (cipher);
+        KCipherRelease (cipher);
+    }
+    else if (GetRCState(rc) == rcUnsupported)
+        STSMSG (1, ("Not supported on this machine"));
+    else
+        orc = rc;
+#endif
+#if 1
+    subtype_iterator = 3;
+    STSMSG (1, ("======================================================================"));
+    STSMSG (1, ("%d: %s\n", subtype_iterator, types[subtype_iterator]));
+    rc = KCipherTestVecAesNiMake (&cipher, kcipher_AES);
+    if (rc == 0)
+    {
+        run_one (cipher);
+        KCipherRelease (cipher);
+    }
+    else if (GetRCState(rc) == rcUnsupported)
+        STSMSG (1, ("Not supported on this machine"));
+    else
+        orc = rc;
+#endif
+    return orc;
+}
+
+
+rc_t CC UsageSummary  (const char * progname)
+{
+    return 0;
+}
+
+
+const char UsageDefaultName[] = "test-aes_ciphers";
+rc_t CC Usage (const Args * args)
+{
+    return KOutMsg ("\n"
+                    "Usage:\n"
+                    "  %s [OPTIONS]\n"
+                    "\n"
+                    "Summary:\n"
+                    "  Test all of the AES Ciphers we support.\n"
+                    "  use -v one or more times for more details.\n"
+                    "  Exit is the number of attempted tests that failed\n",
+                    UsageDefaultName);
+}
+
+
+ver_t CC KAppVersion (void)
+{
+    return 0;
+}
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args * args;
+    rc_t rc;
+
+
+    rc = ArgsMakeAndHandle (&args, argc, argv, 0);
+    if (rc == 0)
+    {
+        STSMSG (3, ("Starting tests",__func__));
+
+        error_count = 0;
+        rc = run();
+    }
+
+    if (error_count)
+        STSMSG (0, ("Failed %d tests of %d run out of 28 possible",error_count, test_count));
+    else
+        STSMSG (0, ("Passed %d tests out of 28 possible\n", test_count));
+    if (rc)
+        LOGERR (klogErr, rc, "Exiting with a failure status");
+    exit (error_count);
+}
diff --git a/test/krypto/test-cipher-speed.c b/test/krypto/test-cipher-speed.c
new file mode 100644
index 0000000..99f1a8e
--- /dev/null
+++ b/test/krypto/test-cipher-speed.c
@@ -0,0 +1,910 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <krypto/ciphermgr.h>
+#include <krypto/cipher.h>
+#include <krypto/cipher-test.h>
+
+#include <klib/status.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+#include <klib/defs.h>
+
+
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+
+/* #define DEFAULT_TIMER (5*60) */
+#define DEFAULT_TIMER (5)
+
+#define OPTION_TIMER  "timer"
+#define ALIAS_TIMER   "t"
+
+const char * timer_usage[] = 
+{ "time per function in seconds", "Default is 5 seconds", NULL };
+
+OptDef Options[] = 
+{
+    { OPTION_TIMER, ALIAS_TIMER, NULL, timer_usage, 1, true, false }
+};
+
+struct KBlockCipher;
+
+const char * cipher_subtypes[] = 
+{
+    "byte",
+    "vector",
+    "vec-reg",
+    "AES-NI"
+/*     "byte", */
+/*     "vector", */
+/*     "vector register", */
+/*     "accelerated(AES-NI)" */
+};
+
+
+const char * cipher_types[] = 
+{
+    "null",
+    "AES"
+/*     "null (copy) cipher", */
+/*     "AES cipher" */
+};
+
+rc_t ((* make_functions[4])(KCipher **, kcipher_type)) = 
+{
+    KCipherTestByteMake,
+    KCipherTestVecMake,
+    KCipherTestVecRegMake,
+    KCipherTestVecAesNiMake
+};
+
+char user_key   [32];
+char cipher_block [32*1024];
+
+
+/* not at all critical that randomness is high */
+void random_cipher_block ()
+{
+    unsigned ix;
+
+    srand (1);
+    
+    for (ix = 0; ix < sizeof cipher_block; ++ix)
+        cipher_block[ix] = (char)rand();
+}
+
+
+rc_t function_timer (rc_t (*function)(KCipher * cipher), KCipher * ciphers[16], uint64_t * pcount, clock_t timer)
+{
+    uint64_t count;
+    rc_t rc = 0;
+    clock_t start;
+    clock_t end;
+    clock_t now;
+
+    random_cipher_block();
+
+    now = start = clock();
+    end = start + (clock_t)(timer * CLOCKS_PER_SEC);
+
+    for (count = 0; now < end; ++count)
+    {
+        rc = function(ciphers[count&15]);
+        if (rc)
+            break;
+        now = clock();
+    }
+    *pcount = count;
+    return rc;
+}
+
+
+rc_t set_encrypt_key_function_128 (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 16)
+        ix = 0;
+   
+    memmove (user_key, cipher_block + ix, sizeof user_key);
+    return KCipherSetEncryptKey (cipher, user_key, 16);
+}
+
+
+rc_t set_encrypt_key_function_192 (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 24)
+        ix = 0;
+
+    memmove (user_key, cipher_block + ix, sizeof user_key);
+    return KCipherSetEncryptKey (cipher, user_key, 24);
+}
+
+
+rc_t set_encrypt_key_function_256 (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 32)
+        ix = 0;
+
+    memmove (user_key, cipher_block + ix, sizeof user_key);
+    return KCipherSetEncryptKey (cipher, user_key, 32);
+}
+
+
+rc_t set_decrypt_key_function_128 (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 16)
+        ix = 0;
+   
+    memmove (user_key, cipher_block + ix, sizeof user_key);
+    return KCipherSetDecryptKey (cipher, user_key, 16);
+}
+
+
+rc_t set_decrypt_key_function_192 (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 24)
+        ix = 0;
+
+    memmove (user_key, cipher_block + ix, sizeof user_key);
+    return KCipherSetDecryptKey (cipher, user_key, 24);
+}
+
+
+rc_t set_decrypt_key_function_256 (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 32)
+        ix = 0;
+
+    memmove (user_key, cipher_block + ix, sizeof user_key);
+    return KCipherSetDecryptKey (cipher, user_key, 32);
+}
+
+
+rc_t encrypt_function (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 16)
+        ix = 0;
+   
+    return KCipherEncrypt (cipher, cipher_block + ix, cipher_block + ix);
+}
+
+
+rc_t decrypt_function (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 16)
+        ix = 0;
+   
+    return KCipherDecrypt (cipher, cipher_block + ix, cipher_block + ix);
+}
+
+
+rc_t ecb_encrypt_function (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 16)
+        ix = 0;
+   
+    return KCipherEncryptECB (cipher, cipher_block, cipher_block, sizeof (cipher_block) / 16);
+}
+
+
+rc_t ecb_decrypt_function (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 16)
+        ix = 0;
+   
+    return KCipherDecryptECB (cipher, cipher_block, cipher_block, sizeof (cipher_block) / 16);
+}
+
+
+rc_t cbc_encrypt_function (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 16)
+        ix = 0;
+   
+    return KCipherEncryptCBC (cipher, cipher_block, cipher_block, sizeof (cipher_block) / 16);
+}
+
+
+rc_t cbc_decrypt_function (KCipher * cipher)
+{
+    static unsigned ix;
+
+    /* just getting some random data - value shouldn't matter much */
+    if (++ix > sizeof cipher_block - 16)
+        ix = 0;
+   
+    return KCipherDecryptCBC (cipher, cipher_block, cipher_block, sizeof (cipher_block) / 16);
+}
+
+
+/* ==================================================== */
+
+uint64_t encrypt_key_128[kcipher_count*4] = {0};
+uint64_t encrypt_key_192[kcipher_count*4] = {0};
+uint64_t encrypt_key_256[kcipher_count*4] = {0};
+uint64_t decrypt_key_128[kcipher_count*4] = {0};
+uint64_t decrypt_key_192[kcipher_count*4] = {0};
+uint64_t decrypt_key_256[kcipher_count*4] = {0};
+uint64_t encrypt_128[kcipher_count*4] = {0};
+uint64_t encrypt_192[kcipher_count*4] = {0};
+uint64_t encrypt_256[kcipher_count*4] = {0};
+uint64_t decrypt_128[kcipher_count*4] = {0};
+uint64_t decrypt_192[kcipher_count*4] = {0};
+uint64_t decrypt_256[kcipher_count*4] = {0};
+uint64_t ecb_encrypt_128[kcipher_count*4] = {0};
+uint64_t ecb_encrypt_192[kcipher_count*4] = {0};
+uint64_t ecb_encrypt_256[kcipher_count*4] = {0};
+uint64_t ecb_decrypt_128[kcipher_count*4] = {0};
+uint64_t ecb_decrypt_192[kcipher_count*4] = {0};
+uint64_t ecb_decrypt_256[kcipher_count*4] = {0};
+uint64_t cbc_encrypt_128[kcipher_count*4] = {0};
+uint64_t cbc_encrypt_192[kcipher_count*4] = {0};
+uint64_t cbc_encrypt_256[kcipher_count*4] = {0};
+uint64_t cbc_decrypt_128[kcipher_count*4] = {0};
+uint64_t cbc_decrypt_192[kcipher_count*4] = {0};
+uint64_t cbc_decrypt_256[kcipher_count*4] = {0};
+
+rc_t run_one (KCipher * ciphers[16], clock_t timer, unsigned ix)
+{
+    rc_t rc;
+
+    encrypt_key_128[ix] = 0;
+    encrypt_key_192[ix] = 0;
+    encrypt_key_256[ix] = 0;
+    decrypt_key_128[ix] = 0;
+    decrypt_key_192[ix] = 0;
+    decrypt_key_256[ix] = 0;
+
+    encrypt_128[ix] = 0;
+    encrypt_192[ix] = 0;
+    encrypt_256[ix] = 0;
+    decrypt_128[ix] = 0;
+    decrypt_192[ix] = 0;
+    decrypt_256[ix] = 0;
+
+    ecb_encrypt_128[ix] = 0;
+    ecb_encrypt_192[ix] = 0;
+    ecb_encrypt_256[ix] = 0;
+    ecb_decrypt_128[ix] = 0;
+    ecb_decrypt_192[ix] = 0;
+    ecb_decrypt_256[ix] = 0;
+
+    cbc_encrypt_128[ix] = 0;
+    cbc_encrypt_192[ix] = 0;
+    cbc_encrypt_256[ix] = 0;
+    cbc_decrypt_128[ix] = 0;
+    cbc_decrypt_192[ix] = 0;
+    cbc_decrypt_256[ix] = 0;
+
+    KStsMsg ("There will be %u seconds between outputs", timer);
+    KStsMsg ("set_encrypt_key_function_128");
+    rc = function_timer(set_encrypt_key_function_128, ciphers, encrypt_key_128+ix, timer);
+    if (rc)
+        KStsMsg ("failed to run set_encrypt_key_function_128\n");
+    else
+    {
+        KStsMsg ("set_decrypt_key_function_128");
+        rc = function_timer(set_decrypt_key_function_128, ciphers, decrypt_key_128+ix, timer);
+        if (rc)
+            KStsMsg ("failed to run set_decrypt_key_function_128\n");
+        else
+        {
+            KStsMsg ("encrypt_function");
+            rc = function_timer(encrypt_function, ciphers, encrypt_128+ix, timer);
+            if (rc)
+                KStsMsg ("failed to run encrypt_function\n");
+            else
+            {
+
+                KStsMsg ("decrypt_function");
+                rc = function_timer(decrypt_function, ciphers, decrypt_128+ix, timer);
+                if (rc)
+                    KStsMsg ("failed to run decrypt_function\n");
+                else
+                {
+                    KStsMsg ("ecb_encrypt_function");
+                    rc = function_timer(ecb_encrypt_function, ciphers, ecb_encrypt_128+ix, timer);
+                    if (rc)
+                        KStsMsg ("failed to run ecb_encrypt_function\n");
+                    else
+                    {
+
+                        KStsMsg ("ecb_decrypt_function");
+                        rc = function_timer(ecb_decrypt_function, ciphers, ecb_decrypt_128+ix, timer);
+                        if (rc)
+                            KStsMsg ("failed to run ecb_decrypt_function\n");
+                        else
+                        {
+                            KStsMsg ("cbc_encrypt_function");
+                            rc = function_timer(cbc_encrypt_function, ciphers, cbc_encrypt_128+ix, timer);
+                            if (rc)
+                                KStsMsg ("failed to run cbc_encrypt_function\n");
+                            else
+                            {
+                                KStsMsg ("cbc_decrypt_function\n");
+                                rc = function_timer(cbc_decrypt_function, ciphers, cbc_decrypt_128+ix, timer);
+                                if (rc)
+                                    KStsMsg ("failed to run cbc_decrypt_function\n");
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    KStsMsg ("set_encrypt_key_function_192\n");
+    rc = function_timer(set_encrypt_key_function_192, ciphers, encrypt_key_192+ix, timer);
+    if (rc)
+        KStsMsg ("failed to run set_encrypt_key_function_192\n");
+    else
+    {
+        KStsMsg ("set_decrypt_key_function_192\n");
+        rc = function_timer(set_decrypt_key_function_192, ciphers, decrypt_key_192+ix, timer);
+        if (rc)
+            KStsMsg ("failed to run set_decrypt_key_function_192\n");
+        else
+        {
+            KStsMsg ("encrypt_function\n");
+            rc = function_timer(encrypt_function, ciphers, encrypt_192+ix, timer);
+            if (rc)
+                KStsMsg ("failed to run encrypt_function\n");
+            else
+            {
+                KStsMsg ("decrypt_function\n");
+                rc = function_timer(decrypt_function, ciphers, decrypt_192+ix, timer);
+                if (rc)
+                    KStsMsg ("failed to run decrypt_function\n");
+                else
+                {
+                    KStsMsg ("ecb_encrypt_function\n");
+                    rc = function_timer(ecb_encrypt_function, ciphers, ecb_encrypt_192+ix, timer);
+                    if (rc)
+                        KStsMsg ("failed to run ecb_encrypt_function\n");
+                    else
+                    {
+                        KStsMsg ("ecb_decrypt_function\n");
+                        rc = function_timer(ecb_decrypt_function, ciphers, ecb_decrypt_192+ix, timer);
+                        if (rc)
+                            KStsMsg ("failed to run ecb_decrypt_function\n");
+                        else
+                        {
+                            KStsMsg ("cbc_encrypt_function\n");
+                            rc = function_timer(cbc_encrypt_function, ciphers, cbc_encrypt_192+ix, timer);
+                            if (rc)
+                                KStsMsg ("failed to run cbc_encrypt_function\n");
+                            else
+                            {
+                                KStsMsg ("cbc_decrypt_function\n");
+                                rc = function_timer(cbc_decrypt_function, ciphers, cbc_decrypt_192+ix, timer);
+                                if (rc)
+                                    KStsMsg ("failed to run cbc_decrypt_function\n");
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    KStsMsg ("set_encrypt_key_function_256\n");
+    rc = function_timer(set_encrypt_key_function_256, ciphers, encrypt_key_256+ix, timer);
+    if (rc)
+        KStsMsg ("failed to run set_encrypt_key_function_256\n");
+    else
+    {
+        KStsMsg ("set_decrypt_key_function_256\n");
+        rc = function_timer(set_decrypt_key_function_256, ciphers, decrypt_key_256+ix, timer);
+        if (rc)
+            KStsMsg ("failed to run set_decrypt_key_function_256\n");
+        else
+        {
+            KStsMsg ("encrypt_function\n");
+            rc = function_timer(encrypt_function, ciphers, encrypt_256+ix, timer);
+            if (rc)
+                KStsMsg ("failed to run encrypt_function\n");
+            else
+            {
+                KStsMsg ("decrypt_function\n");
+                rc = function_timer(decrypt_function, ciphers, decrypt_256+ix, timer);
+                if (rc)
+                    KStsMsg ("failed to rundecrypt_function\n");
+                else
+                {
+                    KStsMsg ("ecb_encrypt_function\n");
+                    rc = function_timer(ecb_encrypt_function, ciphers, ecb_encrypt_256+ix, timer);
+                    if (rc)
+                        KStsMsg ("failed to run ecb_encrypt_function\n");
+                    else
+                    {
+
+                        KStsMsg ("ecb_decrypt_function\n");  
+                        rc = function_timer(ecb_decrypt_function, ciphers, ecb_decrypt_256+ix, timer);
+                        if (rc)
+                            KStsMsg ("failed to run ecb_decrypt_function\n");
+                        else
+                        {
+                            KStsMsg ("cbc_encrypt_function\n");
+                            rc = function_timer(cbc_encrypt_function, ciphers, cbc_encrypt_256+ix, timer);
+                            if (rc)
+                                KStsMsg ("failed to run cbc_encrypt_function\n");
+                            else
+                            {
+                                KStsMsg ("cbc_decrypt_function\n");
+                                rc = function_timer(cbc_decrypt_function, ciphers, cbc_decrypt_256+ix, timer);
+                                if (rc)
+                                    KStsMsg ("failed to run cbc_decrypt_function\n");
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+void run (clock_t timer)
+{
+    kcipher_type cipher_type;
+
+    for (cipher_type = 0; cipher_type < kcipher_count; ++cipher_type)
+    {
+        uint32_t cipher_subtype;
+
+        for (cipher_subtype = 0; cipher_subtype < 4; ++cipher_subtype)
+        {
+            KCipher * ciphers[16];
+            unsigned ix;
+            rc_t rc;
+
+            for (ix = 0; ix < 16; ++ix)
+                ciphers[ix] = NULL;
+
+            for (ix = 0; ix < 16; ++ix)
+            {
+                rc = make_functions[cipher_subtype](&ciphers[ix], cipher_type);
+                if (GetRCState(rc) == rcUnsupported)
+                {
+                    KOutMsg ("Not supported on this machine: test not run\n");
+                    ciphers[ix] = NULL;
+                    break;
+                }
+                else if (rc)
+                {
+                    KOutMsg ("Failure creating cipher: test not run\n");
+                    ciphers[ix] = NULL;
+                    break;
+                }
+            }
+            if (rc == 0)
+            {
+                KStsMsg ("Testing the %s cipher in the %s implementation",
+                         cipher_types[cipher_type],cipher_subtypes[cipher_subtype]);
+                rc = run_one (ciphers, timer, cipher_type * 4 + cipher_subtype);
+            }
+            for (ix = 0; ix < 16; ++ix)
+            {
+                KCipherRelease (ciphers[ix]);
+            }
+        }
+    }
+    KOutMsg ("%14s\t%s-%s\t%s-%s\t%s-%s\t%s-%s\t%s-%s\t%s-%s\t%s-%s\t%s-%s\n",
+             " ",
+             cipher_types[0],cipher_subtypes[0],
+             cipher_types[0],cipher_subtypes[1],
+             cipher_types[0],cipher_subtypes[2],
+             cipher_types[0],cipher_subtypes[3],
+             cipher_types[1],cipher_subtypes[0],
+             cipher_types[1],cipher_subtypes[1],
+             cipher_types[1],cipher_subtypes[2],
+             cipher_types[1],cipher_subtypes[3]);
+
+    KOutMsg ("encrypt_key_128\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             encrypt_key_128[0],encrypt_key_128[1],encrypt_key_128[2],
+             encrypt_key_128[3],encrypt_key_128[4],encrypt_key_128[5],
+             encrypt_key_128[6],encrypt_key_128[7]);
+    KOutMsg ("encrypt_key_192\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             encrypt_key_192[0],encrypt_key_192[1],encrypt_key_192[2],
+             encrypt_key_192[3],encrypt_key_192[4],encrypt_key_192[5],
+             encrypt_key_192[6],encrypt_key_192[7]);
+    KOutMsg ("encrypt_key_256\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             encrypt_key_256[0],encrypt_key_256[1],encrypt_key_256[2],
+             encrypt_key_256[3],encrypt_key_256[4],encrypt_key_256[5],
+             encrypt_key_256[6],encrypt_key_256[7]);
+    KOutMsg ("decrypt_key_128\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             decrypt_key_128[0],decrypt_key_128[1],decrypt_key_128[2],
+             decrypt_key_128[3],decrypt_key_128[4],decrypt_key_128[5],
+             decrypt_key_128[6],decrypt_key_128[7]);
+    KOutMsg ("decrypt_key_192\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             decrypt_key_192[0],decrypt_key_192[1],decrypt_key_192[2],
+             decrypt_key_192[3],decrypt_key_192[4],decrypt_key_192[5],
+             decrypt_key_192[6],decrypt_key_192[7]);
+    KOutMsg ("decrypt_key_256\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             decrypt_key_256[0],decrypt_key_256[1],decrypt_key_256[2],
+             decrypt_key_256[3],decrypt_key_256[4],decrypt_key_256[5],
+             decrypt_key_256[6],decrypt_key_256[7]);
+
+    KOutMsg ("encrypt_128\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             encrypt_128[0],encrypt_128[1],encrypt_128[2],
+             encrypt_128[3],encrypt_128[4],encrypt_128[5],
+             encrypt_128[6],encrypt_128[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (encrypt_128[0]*16.0/(1024*1024))/timer,
+             (encrypt_128[1]*16.0/(1024*1024))/timer,
+             (encrypt_128[2]*16.0/(1024*1024))/timer,
+             (encrypt_128[3]*16.0/(1024*1024))/timer,
+             (encrypt_128[4]*16.0/(1024*1024))/timer,
+             (encrypt_128[5]*16.0/(1024*1024))/timer,
+             (encrypt_128[6]*16.0/(1024*1024))/timer,
+             (encrypt_128[7]*16.0/(1024*1024))/timer);
+
+    KOutMsg ("encrypt_192\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             encrypt_192[0],encrypt_192[1],encrypt_192[2],
+             encrypt_192[3],encrypt_192[4],encrypt_192[5],
+             encrypt_192[6],encrypt_192[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (encrypt_192[0]*16.0/(1024*1024))/timer,
+             (encrypt_192[1]*16.0/(1024*1024))/timer,
+             (encrypt_192[2]*16.0/(1024*1024))/timer,
+             (encrypt_192[3]*16.0/(1024*1024))/timer,
+             (encrypt_192[4]*16.0/(1024*1024))/timer,
+             (encrypt_192[5]*16.0/(1024*1024))/timer,
+             (encrypt_192[6]*16.0/(1024*1024))/timer,
+             (encrypt_192[7]*16.0/(1024*1024))/timer);
+
+    KOutMsg ("encrypt_256\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             encrypt_256[0],encrypt_256[1],encrypt_256[2],
+             encrypt_256[3],encrypt_256[4],encrypt_256[5],
+             encrypt_256[6],encrypt_256[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (encrypt_256[0]*16.0/(1024*1024))/timer,
+             (encrypt_256[1]*16.0/(1024*1024))/timer,
+             (encrypt_256[2]*16.0/(1024*1024))/timer,
+             (encrypt_256[3]*16.0/(1024*1024))/timer,
+             (encrypt_256[4]*16.0/(1024*1024))/timer,
+             (encrypt_256[5]*16.0/(1024*1024))/timer,
+             (encrypt_256[6]*16.0/(1024*1024))/timer,
+             (encrypt_256[7]*16.0/(1024*1024))/timer);
+
+    KOutMsg ("decrypt_128\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             decrypt_128[0],decrypt_128[1],decrypt_128[2],
+             decrypt_128[3],decrypt_128[4],decrypt_128[5],
+             decrypt_128[6],decrypt_128[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (decrypt_128[0]*16.0/(1024*1024))/timer,
+             (decrypt_128[1]*16.0/(1024*1024))/timer,
+             (decrypt_128[2]*16.0/(1024*1024))/timer,
+             (decrypt_128[3]*16.0/(1024*1024))/timer,
+             (decrypt_128[4]*16.0/(1024*1024))/timer,
+             (decrypt_128[5]*16.0/(1024*1024))/timer,
+             (decrypt_128[6]*16.0/(1024*1024))/timer,
+             (decrypt_128[7]*16.0/(1024*1024))/timer);
+
+    KOutMsg ("decrypt_192\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             decrypt_192[0],decrypt_192[1],decrypt_192[2],
+             decrypt_192[3],decrypt_192[4],decrypt_192[5],
+             decrypt_192[6],decrypt_192[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (decrypt_192[0]*16.0/(1024*1024))/timer,
+             (decrypt_192[1]*16.0/(1024*1024))/timer,
+             (decrypt_192[2]*16.0/(1024*1024))/timer,
+             (decrypt_192[3]*16.0/(1024*1024))/timer,
+             (decrypt_192[4]*16.0/(1024*1024))/timer,
+             (decrypt_192[5]*16.0/(1024*1024))/timer,
+             (decrypt_192[6]*16.0/(1024*1024))/timer,
+             (decrypt_192[7]*16.0/(1024*1024))/timer);
+
+    KOutMsg ("decrypt_256\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             decrypt_256[0],decrypt_256[1],decrypt_256[2],
+             decrypt_256[3],decrypt_256[4],decrypt_256[5],
+             decrypt_256[6],decrypt_256[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (decrypt_256[0]*16.0/(1024*1024))/timer,
+             (decrypt_256[1]*16.0/(1024*1024))/timer,
+             (decrypt_256[2]*16.0/(1024*1024))/timer,
+             (decrypt_256[3]*16.0/(1024*1024))/timer,
+             (decrypt_256[4]*16.0/(1024*1024))/timer,
+             (decrypt_256[5]*16.0/(1024*1024))/timer,
+             (decrypt_256[6]*16.0/(1024*1024))/timer,
+             (decrypt_256[7]*16.0/(1024*1024))/timer);
+
+    KOutMsg ("ecb_encrypt_128\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             ecb_encrypt_128[0],ecb_encrypt_128[1],ecb_encrypt_128[2],
+             ecb_encrypt_128[3],ecb_encrypt_128[4],ecb_encrypt_128[5],
+             ecb_encrypt_128[6],ecb_encrypt_128[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (ecb_encrypt_128[0]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_128[1]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_128[2]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_128[3]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_128[4]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_128[5]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_128[6]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_128[7]*sizeof(cipher_block)/(1024*1024))/timer);
+
+    KOutMsg ("ecb_encrypt_192\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             ecb_encrypt_192[0],ecb_encrypt_192[1],ecb_encrypt_192[2],
+             ecb_encrypt_192[3],ecb_encrypt_192[4],ecb_encrypt_192[5],
+             ecb_encrypt_192[6],ecb_encrypt_192[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (ecb_encrypt_192[0]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_192[1]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_192[2]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_192[3]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_192[4]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_192[5]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_192[6]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_192[7]*sizeof(cipher_block)/(1024*1024))/timer);
+
+    KOutMsg ("ecb_encrypt_256\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             ecb_encrypt_256[0],ecb_encrypt_256[1],ecb_encrypt_256[2],
+             ecb_encrypt_256[3],ecb_encrypt_256[4],ecb_encrypt_256[5],
+             ecb_encrypt_256[6],ecb_encrypt_256[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (ecb_encrypt_256[0]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_256[1]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_256[2]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_256[3]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_256[4]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_256[5]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_256[6]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_encrypt_256[7]*sizeof(cipher_block)/(1024*1024))/timer);
+
+    KOutMsg ("ecb_decrypt_128\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             ecb_decrypt_128[0],ecb_decrypt_128[1],ecb_decrypt_128[2],
+             ecb_decrypt_128[3],ecb_decrypt_128[4],ecb_decrypt_128[5],
+             ecb_decrypt_128[6],ecb_decrypt_128[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (ecb_decrypt_128[0]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_128[1]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_128[2]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_128[3]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_128[4]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_128[5]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_128[6]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_128[7]*sizeof(cipher_block)/(1024*1024))/timer);
+
+    KOutMsg ("ecb_decrypt_192\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             ecb_decrypt_192[0],ecb_decrypt_192[1],ecb_decrypt_192[2],
+             ecb_decrypt_192[3],ecb_decrypt_192[4],ecb_decrypt_192[5],
+             ecb_decrypt_192[6],ecb_decrypt_192[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (ecb_decrypt_192[0]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_192[1]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_192[2]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_192[3]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_192[4]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_192[5]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_192[6]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_192[7]*sizeof(cipher_block)/(1024*1024))/timer);
+
+    KOutMsg ("ecb_decrypt_256\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             ecb_decrypt_256[0],ecb_decrypt_256[1],ecb_decrypt_256[2],
+             ecb_decrypt_256[3],ecb_decrypt_256[4],ecb_decrypt_256[5],
+             ecb_decrypt_256[6],ecb_decrypt_256[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (ecb_decrypt_256[0]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_256[1]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_256[2]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_256[3]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_256[4]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_256[5]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_256[6]*sizeof(cipher_block)/(1024*1024))/timer,
+             (ecb_decrypt_256[7]*sizeof(cipher_block)/(1024*1024))/timer);
+
+    KOutMsg ("cbc_encrypt_128\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             cbc_encrypt_128[0],cbc_encrypt_128[1],cbc_encrypt_128[2],
+             cbc_encrypt_128[3],cbc_encrypt_128[4],cbc_encrypt_128[5],
+             cbc_encrypt_128[6],cbc_encrypt_128[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (cbc_encrypt_128[0]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[1]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[2]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[3]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[4]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[5]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[6]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[7]*sizeof(cipher_block)/(1024*1024))/timer);
+
+    KOutMsg ("cbc_encrypt_192\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             cbc_encrypt_192[0],cbc_encrypt_192[1],cbc_encrypt_192[2],
+             cbc_encrypt_192[3],cbc_encrypt_192[4],cbc_encrypt_192[5],
+             cbc_encrypt_192[6],cbc_encrypt_192[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (cbc_encrypt_128[0]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[1]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[2]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[3]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[4]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[5]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[6]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_encrypt_128[7]*sizeof(cipher_block)/(1024*1024))/timer);
+
+    KOutMsg ("cbc_encrypt_256\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             cbc_encrypt_256[0],cbc_encrypt_256[1],cbc_encrypt_256[2],
+             cbc_encrypt_256[3],cbc_encrypt_256[4],cbc_encrypt_256[5],
+             cbc_encrypt_256[6],cbc_encrypt_256[7]);
+    KOutMsg ("cbc_decrypt_128\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             cbc_decrypt_128[0],cbc_decrypt_128[1],cbc_decrypt_128[2],
+             cbc_decrypt_128[3],cbc_decrypt_128[4],cbc_decrypt_128[5],
+             cbc_decrypt_128[6],cbc_decrypt_128[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (cbc_decrypt_128[0]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_128[1]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_128[2]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_128[3]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_128[4]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_128[5]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_128[6]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_128[7]*sizeof(cipher_block)/(1024*1024))/timer);
+
+    KOutMsg ("cbc_decrypt_192\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             cbc_decrypt_192[0],cbc_decrypt_192[1],cbc_decrypt_192[2],
+             cbc_decrypt_192[3],cbc_decrypt_192[4],cbc_decrypt_192[5],
+             cbc_decrypt_192[6],cbc_decrypt_192[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (cbc_decrypt_192[0]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_192[1]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_192[2]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_192[3]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_192[4]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_192[5]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_192[6]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_192[7]*sizeof(cipher_block)/(1024*1024))/timer);
+
+    KOutMsg ("cbc_decrypt_256\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\t%10lu\n",
+             cbc_decrypt_256[0],cbc_decrypt_256[1],cbc_decrypt_256[2],
+             cbc_decrypt_256[3],cbc_decrypt_256[4],cbc_decrypt_256[5],
+             cbc_decrypt_256[6],cbc_decrypt_256[7]);
+    KOutMsg ("MB/s       \t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n\n",
+             (cbc_decrypt_256[0]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_256[1]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_256[2]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_256[3]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_256[4]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_256[5]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_256[6]*sizeof(cipher_block)/(1024*1024))/timer,
+             (cbc_decrypt_256[7]*sizeof(cipher_block)/(1024*1024))/timer);
+}
+
+
+rc_t CC UsageSummary  (const char * progname)
+{
+    return KOutMsg ("\n"
+                    "Usage:\n"
+                    "  %s [OPTIONS]\n"
+                    "\n"
+                    "Summary:\n"
+                    "  Run a null (copy) cipher and the AES cipher in all\n"
+                    "  modes supported on this machine.  Encrypt a block of\n"
+                    "  32KB a number of times for each mode and compute an\n"
+                    "  expected throughput for each mode. Expected long delays\n"
+                    "  of no output for long timer values\n",
+                    progname);
+}
+
+
+const char UsageDefaultName[] = "test-cipher-throughput";
+rc_t CC Usage (const Args * args)
+{
+    rc_t rc;
+
+    rc = UsageSummary (UsageDefaultName);
+    if (rc == 0)
+    {
+        KOutMsg ("Options:\n");
+        HelpOptionLine (ALIAS_TIMER, OPTION_TIMER, "seconds", timer_usage);
+        HelpOptionsStandard();
+    }
+    return rc;
+}
+
+
+ver_t CC KAppVersion (void)
+{
+    return 0;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args * args;
+    rc_t rc;
+
+    rc = KStsHandlerSetStdErr();
+    if (rc == 0)
+    {
+        rc = ArgsMakeAndHandle (&args, argc, argv, 1, Options, sizeof Options / sizeof (Options[0]));
+        if (rc == 0)
+        {
+            clock_t timer;
+            uint32_t pcount;
+
+            rc = ArgsOptionCount (args, OPTION_TIMER, &pcount);
+            if (rc == 0)
+            {
+                if (pcount == 0)
+                    timer = 5*60;
+                else
+                {
+                    const char * pc;
+
+                    rc = ArgsOptionValue (args, OPTION_TIMER, 0, (const void **)&pc);
+                    if (rc == 0)
+                    {
+                        timer = (clock_t)AsciiToU64 (pc, NULL, NULL);
+                    }
+                }
+            }
+            if (rc == 0)
+                run (timer);
+        }
+    }
+
+    if (rc)
+        LOGERR (klogErr, rc, "Exiting with a failure status");
+    return rc;
+}
diff --git a/test/krypto/test-cmn.cpp b/test/krypto/test-cmn.cpp
new file mode 100644
index 0000000..9ae9940
--- /dev/null
+++ b/test/krypto/test-cmn.cpp
@@ -0,0 +1,359 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <krypto/encfile-priv.h>
+
+#include <assert.h>
+#include <string.h>
+
+#include "test-cmn.hpp"
+
+/**
+ * Common functions to tests krypto lib
+ */
+
+rc_t CC
+TOpenPtFile ( struct KDirectory * current_dir, const char * path, TFileOpenMode mode, struct KFile ** out_file )
+{
+    rc_t rc;
+    struct KFile * file;
+    
+    rc = 0;
+    file = NULL;
+    
+    assert ( path );
+    assert ( out_file );
+    
+    * out_file = NULL;
+    
+    switch (mode)
+    {
+        case TFileOpenMode_Read:
+            rc = KDirectoryOpenFileRead ( current_dir, (const struct KFile **)& file, path );
+            break;
+            
+        case TFileOpenMode_Write:
+            rc = KDirectoryOpenFileWrite ( current_dir, & file, false, path );
+            break;
+            
+        case TFileOpenMode_ReadWrite:
+            rc = KDirectoryOpenFileWrite ( current_dir, & file, true, path );
+            break;
+            
+        default:
+            assert(false);
+    }
+        
+    if (rc == 0)
+    {
+        * out_file = file;
+    }
+    
+    return rc;
+}   /* TOpenPtFile () */
+
+rc_t CC
+TCreatePtFile ( struct KDirectory * current_dir, const char * path, TFileOpenMode mode, struct KFile ** out_file )
+{
+    rc_t rc;
+    struct KFile * file;
+    
+    rc = 0;
+    file = NULL;
+    
+    assert ( path );
+    assert ( out_file );
+    
+    * out_file = NULL;
+    
+    switch (mode)
+    {
+        case TFileOpenMode_Write:
+            rc = KDirectoryCreateFile ( current_dir, & file, false, 0644, kcmParents|kcmOpen, path );
+            break;
+                
+        case TFileOpenMode_ReadWrite:
+            rc = KDirectoryCreateFile ( current_dir, & file, true, 0644, kcmParents|kcmOpen, path );
+            break;
+                
+        case TFileOpenMode_Read:
+        default:
+            assert(false);
+    }
+        
+    if (rc == 0)
+    {
+        * out_file = file;
+    }
+    
+    return rc;
+}   /* TCreatePtFile () */
+
+rc_t CC
+TOpenEncFile ( struct KDirectory * current_dir, const char * path, TFileOpenMode mode, const KKey * enc_key, struct KFile ** out_file )
+{
+    rc_t rc;
+    struct KFile * pt_file, * enc_file;
+    
+    rc = 0;
+    pt_file = NULL;
+    enc_file = NULL;
+    
+    assert ( out_file );
+    
+    * out_file = NULL;
+    
+    rc = TOpenPtFile (current_dir, path, mode, &pt_file);
+    if (rc == 0)
+    {
+        switch (mode)
+        {
+            case TFileOpenMode_Read:
+                rc = KEncFileMakeRead ( (const struct KFile **)&enc_file, (const struct KFile *)pt_file, enc_key );
+                break;
+                
+            case TFileOpenMode_Write:
+                rc = KEncFileMakeWrite ( &enc_file, pt_file, enc_key );
+                break;
+                
+            case TFileOpenMode_ReadWrite:
+                rc = KEncFileMakeUpdate ( &enc_file, pt_file, enc_key );
+                break;
+                
+            default:
+                assert(false);
+        }
+        
+        if (rc == 0)
+        {
+            *out_file = enc_file;
+        }
+        KFileRelease ( pt_file );
+    }
+    
+    return rc;
+}   /* TOpenEncFile () */
+
+rc_t CC
+TCreateEncFile ( struct KDirectory * current_dir, const char * path, TFileOpenMode mode, const KKey * enc_key, struct KFile ** out_file )
+{
+    rc_t rc;
+    struct KFile * pt_file, * enc_file;
+    
+    rc = 0;
+    pt_file = NULL;
+    enc_file = NULL;
+    
+    assert ( out_file );
+    
+    * out_file = NULL;
+    
+    rc = TCreatePtFile (current_dir, path, mode, &pt_file);
+    if (rc == 0)
+    {
+        switch (mode)
+        {
+            case TFileOpenMode_Write:
+                rc = KEncFileMakeWrite ( &enc_file, pt_file, enc_key );
+                break;
+                
+            case TFileOpenMode_ReadWrite:
+                rc = KEncFileMakeUpdate ( &enc_file, pt_file, enc_key );
+                break;
+                
+            case TFileOpenMode_Read:
+            default:
+                assert(false);
+        }
+        
+        if (rc == 0)
+        {
+            *out_file = enc_file;
+        }
+        KFileRelease ( pt_file );
+    }
+    
+    return rc;
+}   /* TCreateEncFile () */
+
+rc_t CC
+TFillFile ( struct KFile * file, const uint8_t* filler, size_t filler_size, uint64_t content_size )
+{
+    rc_t rc = 0;
+    
+    if (content_size == 0)
+    {
+        // do nothing
+        return rc;
+    }
+    
+    const size_t buffer_size = 32*1024;
+    
+    uint8_t buffer[buffer_size];
+    size_t filler_sizes_in_buffer = buffer_size / filler_size;
+    
+    assert(buffer_size % filler_size == 0);
+    assert(buffer_size / filler_size  > 0);
+
+    for (size_t i = 0; i < filler_sizes_in_buffer; ++i)
+    {
+        memmove(buffer + i*filler_size, filler, filler_size);
+    }
+
+    uint64_t num_written_total = 0;
+    size_t num_written;
+    while (num_written_total < content_size)
+    {
+        size_t to_write = content_size - num_written_total;
+        if (to_write > buffer_size)
+        {
+            to_write = buffer_size;
+        }
+        rc = KFileWriteAll ( file, num_written_total, buffer, to_write, &num_written );
+        if (rc != 0)
+        {
+            break;
+        }
+        
+        assert(num_written == to_write);
+        num_written_total += num_written;
+    }
+    
+    return rc;
+}
+
+rc_t CC
+TCheckFileContent ( struct KFile * file, const uint8_t* filler, size_t filler_size )
+{
+    rc_t rc = 0;
+    
+    uint64_t content_size;
+    rc = KFileSize ( file, &content_size );
+    if (rc != 0)
+    {
+        return rc;
+    }
+    
+    if (content_size == 0)
+    {
+        // do nothing
+        return rc;
+    }
+    
+    const size_t buffer_size = 32*1024;
+    
+    uint8_t buffer[buffer_size], reference_buffer[buffer_size];
+    size_t filler_sizes_in_buffer = buffer_size / filler_size;
+    
+    assert(buffer_size % filler_size == 0);
+    assert(buffer_size / filler_size  > 0);
+    
+    for (size_t i = 0; i < filler_sizes_in_buffer; ++i)
+    {
+        memmove(reference_buffer + i*filler_size, filler, filler_size);
+    }
+    
+    uint64_t num_read_total = 0;
+    size_t num_read;
+    while (num_read_total < content_size)
+    {
+        size_t to_read = content_size - num_read_total;
+        if (to_read > buffer_size)
+        {
+            to_read = buffer_size;
+        }
+        rc = KFileReadAll ( file, num_read_total, buffer, to_read, &num_read );
+        if (rc != 0)
+        {
+            break;
+        }
+        
+        assert(num_read == to_read);
+        
+        if (memcmp(reference_buffer, buffer, num_read) != 0)
+        {
+            return RC( rcKrypto, rcFile, rcValidating, rcEncryption, rcCorrupt );
+        }
+        
+        num_read_total += num_read;
+    }
+    
+    return rc;
+}
+
+rc_t CC
+TCopyFile ( struct KFile * file_dst, struct KFile * file_src )
+{
+    rc_t rc = 0;
+    
+    uint64_t size_src;
+    rc = KFileSize ( file_src, &size_src );
+    if (rc != 0)
+    {
+        return rc;
+    }
+    
+    if (size_src == 0)
+    {
+        // do nothing
+        return rc;
+    }
+    
+    const size_t buffer_size = 32*1024;
+    
+    uint8_t buffer[buffer_size];
+   
+    uint64_t num_copied_total = 0;
+    size_t num_read, num_written;
+    while (num_copied_total < size_src)
+    {
+        size_t to_copy = size_src - num_copied_total;
+        if (to_copy > buffer_size)
+        {
+            to_copy = buffer_size;
+        }
+        rc = KFileReadAll ( file_src, num_copied_total, buffer, to_copy, &num_read );
+        if (rc != 0)
+        {
+            break;
+        }
+        assert(num_read == to_copy);
+        rc = KFileWriteAll ( file_dst, num_copied_total, buffer, to_copy, &num_written );
+        if (rc != 0)
+        {
+            break;
+        }
+        assert(num_written == to_copy);
+        
+        num_copied_total += num_written;
+    }
+    
+    return rc;
+}
diff --git a/test/krypto/test-cmn.hpp b/test/krypto/test-cmn.hpp
new file mode 100644
index 0000000..5934699
--- /dev/null
+++ b/test/krypto/test-cmn.hpp
@@ -0,0 +1,90 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/**
+ * Common functions/types to tests krypto lib
+ */
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <krypto/encfile-priv.h>
+
+#define BLOCK_32K_SIZE (32*1024)
+
+#if defined(__APPLE__)
+#define TMP_FOLDER "temp_mac"
+#else
+#define TMP_FOLDER "temp_linux"
+#endif
+
+enum TFileOpenMode
+{
+    TFileOpenMode_Read,
+    TFileOpenMode_Write,
+    TFileOpenMode_ReadWrite
+};
+
+struct KFile;
+
+/**
+ * Create/open plain text file
+ */
+rc_t CC
+TOpenPtFile ( struct KDirectory * current_dir, const char * path, TFileOpenMode mode, struct KFile ** out_file );
+rc_t CC
+TCreatePtFile ( struct KDirectory * current_dir, const char * path, TFileOpenMode mode, struct KFile ** out_file );
+
+/**
+ * Create/open encrypted file
+ */
+rc_t CC
+TOpenEncFile ( struct KDirectory * current_dir, const char * path, TFileOpenMode mode, const KKey * enc_key, struct KFile ** out_file );
+rc_t CC
+TCreateEncFile ( struct KDirectory * current_dir, const char * path, TFileOpenMode mode, const KKey * enc_key, struct KFile ** out_file );
+
+/**
+ * Fill "file" from pos 0 to "content_size"-1 with content defined by "filler" pattern
+ */
+rc_t CC
+TFillFile ( struct KFile * file, const uint8_t* filler, size_t filler_size, uint64_t content_size );
+
+/**
+ * Read "file" from beginning to the end and make sure that its content matches "filler" pattern
+ */
+rc_t CC
+TCheckFileContent ( struct KFile * file, const uint8_t* filler, size_t filler_size );
+
+/**
+ * Copies content from "file_src" to "file_dst"
+ */
+rc_t CC
+TCopyFile ( struct KFile * file_dst, struct KFile * file_src );
+
+inline uint64_t CC
+TEncSizeFromPtSize ( uint64_t pt_size )
+{
+    return ((pt_size + BLOCK_32K_SIZE - 1 ) / BLOCK_32K_SIZE) * sizeof(KEncFileBlock) + sizeof(KEncFileHeader) + sizeof(KEncFileFooter);
+}
diff --git a/test/krypto/test-csprng.c b/test/krypto/test-csprng.c
new file mode 100644
index 0000000..d0281a4
--- /dev/null
+++ b/test/krypto/test-csprng.c
@@ -0,0 +1,230 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <krypto/rng.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+
+/* #include <kfs/directory.h> */
+/* #include <kfs/file.h> */
+
+/* #include <kxml/xml.h> */
+
+/* #include <string.h> */
+
+/*
+ * not intended to be pretty.
+ * not intended to be slick.
+ * not intended to make tools like valgrind happy.
+ *
+ * This does not REALLY test the quality of the RNG; it's just
+ * a development test and a "did I break it" test.
+ *
+ * It just spews lines of random bytes.  These could be gathered
+ * and analyzed with another tool such as the one from NIST.  Perhaps
+ * a bit of change to the output format might be needed for that.
+ */
+
+static
+rc_t run()
+{
+    KRng * rng;
+    rc_t rc;
+
+    rc = KCSPRngMake (&rng);
+    if (rc)
+        LOGERR (klogErr, rc, "failed to make RNG");
+    else
+    {
+        uint32_t ix;
+
+        OUTMSG (("KCSPRng with no seed\n"));
+        
+        for (ix = 0; ix < 10; ++ix)
+        {
+            uint8_t buff [8];
+            uint32_t num_read;
+
+            rc = KRngRead (rng, buff, sizeof (buff), &num_read);
+            if (rc)
+                PLOGERR (klogErr,
+                         (klogErr, rc, "error in read '$u' from KRng",
+                          "u=%lu", ix));
+            else
+            {
+                OUTMSG (( "%4.4d: %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n",
+                          ix,
+                          buff[0], buff[1], buff[2], buff[3],
+                          buff[4], buff[5], buff[6], buff[7]));
+            }
+        }
+
+        KRngRelease (rng);
+
+        rc = KCSPRngMake (&rng);
+        if (rc)
+            LOGERR (klogErr, rc, "failed to make RNG");
+        else
+        {
+            uint32_t ix;
+
+
+            /* this is using system seed from us */
+            rc = KRngSeed (rng);
+            if (rc)
+                LOGERR (klogErr, rc, "error running KRngSeed");
+            else
+            {
+                OUTMSG (("KCSPRng with seed\n"));
+        
+                for (ix = 0; ix < 10; ++ix)
+                {
+                    uint8_t buff [8];
+                    uint32_t num_read;
+
+                    rc = KRngRead (rng, buff, sizeof (buff), &num_read);
+                    if (rc)
+                        PLOGERR (klogErr,
+                                 (klogErr, rc, "error in read '$u' from KRng",
+                                  "u=%lu", ix));
+                    else
+                    {
+                        OUTMSG (( "%4.4d: %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n",
+                                  ix,
+                                  buff[0], buff[1], buff[2], buff[3],
+                                  buff[4], buff[5], buff[6], buff[7]));
+                    }
+                }
+                {
+                    uint8_t reseed [1024];
+
+                    reseed[0] = 0xAA;
+
+                    for (ix = 1; ix < sizeof (reseed); ++ix)
+                        reseed[ix] = reseed[ix-1] ^ (uint8_t)ix;
+
+                    /* this is using reseed from us */
+                    rc = KRngReseed (rng, reseed, sizeof (reseed));
+                    if (rc)
+                        LOGERR (klogErr, rc, "error running KRngReseed");
+                    else
+                    {
+                        OUTMSG (("KCSPRng with reseed\n"));
+
+                        for (ix = 0; ix < 10; ++ix)
+                        {
+                            uint8_t buff [8];
+                            uint32_t num_read;
+
+                            rc = KRngRead (rng, buff, sizeof (buff), &num_read);
+                            if (rc)
+                                PLOGERR (klogErr,
+                                         (klogErr, rc, "error in read '$u' from KRng",
+                                          "u=%lu", ix));
+                            else
+                            {
+                                OUTMSG (( "%4.4d: %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n",
+                                          ix,
+                                          buff[0], buff[1], buff[2], buff[3],
+                                          buff[4], buff[5], buff[6], buff[7]));
+                            }
+                        }
+                    }        
+                }
+            }        
+            KRngRelease (rng);
+        }
+    }
+    return 0;
+}
+
+rc_t CC UsageSummary (const char * progname)
+{
+    return KOutMsg (
+        "\n"
+        "Usage:\n"
+        "  %s [OPTIONS]\n"
+        "\n"
+        "Summary:\n"
+        "  Test the KCSPRng type.\n",
+        progname);
+}
+
+
+const char UsageDefaultName [] = "test-csprng";
+rc_t CC Usage (const Args * args)
+{
+    const char * progname = UsageDefaultName;
+    const char * fullpath = UsageDefaultName;
+    rc_t rc;
+
+    if (args == NULL)
+        rc = RC (rcExe, rcArgv, rcAccessing, rcSelf, rcNull);
+    else
+        rc = ArgsProgram (args, &fullpath, &progname);
+
+    UsageSummary (progname);
+
+    KOutMsg ("Options:\n");
+
+    HelpOptionsStandard();
+
+    HelpVersion (fullpath, KAppVersion());
+
+    return rc;
+}
+
+
+ver_t CC KAppVersion (void)
+{
+    return 0;
+}
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args * args;
+    rc_t rc;
+
+    rc = ArgsMakeAndHandle (&args, argc, argv, 0);
+    if (rc == 0)
+    {
+
+        rc = run();
+        if (rc)
+            LOGERR (klogErr, rc, "Exiting failure");
+        else
+            STSMSG (0, ("Exiting okay\n"));
+    }
+
+    if (rc)
+        LOGERR (klogErr, rc, "Exiting status");
+    else
+        STSMSG (0, ("Exiting status (%R)\n", rc));
+    return rc;
+}
diff --git a/test/krypto/test-encdec.cpp b/test/krypto/test-encdec.cpp
new file mode 100644
index 0000000..83739bd
--- /dev/null
+++ b/test/krypto/test-encdec.cpp
@@ -0,0 +1,607 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/**
+ * Unit tests for KEncDecTestSuite
+ */
+
+#include <ktst/unit_test.hpp>
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+#include <krypto/encfile-priv.h>
+#include <krypto/reencfile.h>
+#include <kfs/impl.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+#include "test-cmn.hpp"
+
+#include <string.h>
+#include <stdio.h>
+
+TEST_SUITE(KEncDecTestSuite);
+
+TEST_CASE(KEncryptDecrypt)
+{
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char enc_file_path_fmt [] = TMP_FOLDER "/enc_file%llu";
+
+    KFile * enc_file, * pt_file;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    uint64_t file_sizes_n_32k[] = { 0, 1, 2, 10, 46, 51 };
+    int8_t file_size_variants[] = { -2, -1, 0, 1, 2 };
+    
+    const uint8_t* file_fillers[] = { (const uint8_t *)"\0", (const uint8_t *)"\1\2\3\0" };
+    size_t file_fillers_sizes[] = { 1, 4 };
+    
+    assert( sizeof file_fillers / sizeof file_fillers[0] == sizeof file_fillers_sizes / sizeof file_fillers_sizes[0] );
+    
+    for (size_t filler_index = 0; filler_index < sizeof file_fillers / sizeof file_fillers[0]; ++filler_index )
+    {
+        printf("filler pattern: ");
+        for (size_t i = 0; i < file_fillers_sizes[filler_index]; ++i)
+        {
+            printf("0x%X ", file_fillers[filler_index][i]);
+        }
+        printf("\n");
+        for (size_t i = 0; i < sizeof file_sizes_n_32k / sizeof file_sizes_n_32k[0]; ++i)
+        {
+            for (size_t j = 0; j < sizeof file_size_variants / sizeof file_size_variants[0]; ++j)
+            {
+                if (file_sizes_n_32k[i] == 0 && file_size_variants[j] <= 0)
+                {
+                    continue;
+                }
+                
+                uint64_t file_size = file_sizes_n_32k[i] * BLOCK_32K_SIZE + file_size_variants[j];
+                
+                char file_path[1024];
+                sprintf(file_path, enc_file_path_fmt, file_size);
+                
+                printf("encrypting/decrypting file %s, size: %llu, i: %zu, j: %zu\n", file_path, file_size, i, j);
+                
+                // create file
+                REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_ReadWrite, &key, &enc_file ) );
+                
+                // write file
+                REQUIRE_RC ( TFillFile( enc_file, file_fillers[filler_index], file_fillers_sizes[filler_index], file_size ) );
+                
+                uint64_t size_data_actual;
+                REQUIRE_RC ( KFileSize ( enc_file, &size_data_actual ) );
+                
+                // check content size
+                REQUIRE ( file_size == size_data_actual );
+              
+                REQUIRE_RC ( KFileRelease ( enc_file ) );
+                
+                // check raw file size and checksums
+                REQUIRE_RC ( TOpenPtFile ( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+                
+                uint64_t size_raw;
+                REQUIRE_RC ( KFileSize ( pt_file, &size_raw ) );
+                REQUIRE ( size_raw == TEncSizeFromPtSize(size_data_actual) );
+                
+                REQUIRE_RC ( KEncFileValidate( pt_file ) );
+                
+                REQUIRE_RC ( KFileRelease ( pt_file ) );
+                
+                // check file content
+                REQUIRE_RC ( TOpenEncFile( current_dir, file_path, TFileOpenMode_Read, &key, &enc_file ) );
+                
+                REQUIRE_RC ( TCheckFileContent( enc_file, file_fillers[filler_index], file_fillers_sizes[filler_index] ) );
+                
+                REQUIRE_RC ( KFileRelease ( enc_file ) );
+            }
+        }
+    }
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KDecryptZeroRawSize)
+{
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/zero_size_file_to_dec";
+
+    KFile * enc_file, * pt_file;
+    
+    uint64_t file_size;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    // create file
+    REQUIRE_RC ( TCreatePtFile( current_dir, file_path, TFileOpenMode_ReadWrite, &pt_file ) );
+    REQUIRE_RC ( KFileSize ( pt_file, &file_size ) );
+    REQUIRE ( file_size == 0 );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    LOGMSG ( klogWarn, "Expect errors after this line:" );
+    REQUIRE ( TOpenEncFile( current_dir, file_path, TFileOpenMode_Read, &key, &enc_file ) == RC( rcKrypto, rcFile, rcConstructing, rcSize, rcIncorrect ) );
+    LOGMSG ( klogWarn, "No more errors are expected" );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KDecryptZeroContentSizeRW)
+{
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/zero_content_rw_file_to_dec";
+
+    KFile * enc_file, * pt_file;
+    
+    uint64_t file_size;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_ReadWrite, &key, &enc_file ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    // check raw size
+    REQUIRE_RC ( TOpenPtFile( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+    REQUIRE_RC ( KFileSize ( pt_file, &file_size ) );
+    REQUIRE ( file_size == sizeof(KEncFileHeader) + sizeof(KEncFileFooter) );
+    REQUIRE_RC ( KEncFileValidate( pt_file ) );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    // check enc open
+    REQUIRE_RC ( TOpenEncFile( current_dir, file_path, TFileOpenMode_Read, &key, &enc_file ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KDecryptZeroContentSizeWOnly)
+{
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/zero_content_w_file_to_dec";
+
+    KFile * enc_file, * pt_file;
+    
+    uint64_t file_size;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, "temp"
+#if defined(__APPLE__)
+        "mac");
+#else
+        "linux");
+#endif
+    
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_Write, &key, &enc_file ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    // check raw size
+    REQUIRE_RC ( TOpenPtFile( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+    REQUIRE_RC ( KFileSize ( pt_file, &file_size ) );
+    REQUIRE ( file_size == sizeof(KEncFileHeader) + sizeof(KEncFileFooter) );
+    REQUIRE_RC ( KEncFileValidate( pt_file ) );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    // check enc open
+    REQUIRE_RC ( TOpenEncFile( current_dir, file_path, TFileOpenMode_Read, &key, &enc_file ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+
+TEST_CASE(KDectryptOnlyHeader)
+{
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/file_only_header";
+
+    KFile * enc_file, * pt_file;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_Write, &key, &enc_file ) );
+    REQUIRE_RC ( TFillFile( enc_file, (const uint8_t *)"\0\1", 2, 500 ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    // truncate it to header size
+    REQUIRE_RC ( TOpenPtFile ( current_dir, file_path, TFileOpenMode_ReadWrite, &pt_file ) );
+    REQUIRE_RC ( KFileSetSize ( pt_file, sizeof(KEncFileHeader) ) );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    LOGMSG ( klogWarn, "Expect errors after this line:" );
+    REQUIRE ( TOpenEncFile( current_dir, file_path, TFileOpenMode_Read, &key, &enc_file ) == RC( rcKrypto, rcFile, rcConstructing, rcSize, rcIncorrect ) );
+    LOGMSG ( klogWarn, "No more errors are expected" );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KDectryptWithoutFooter)
+{
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/file_no_footer";
+    KFile * enc_file, * pt_file;
+    
+    uint64_t file_size;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_Write, &key, &enc_file ) );
+    REQUIRE_RC ( TFillFile( enc_file, (const uint8_t *)"\0\1", 2, 500 ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    // truncate footer
+    REQUIRE_RC ( TOpenPtFile ( current_dir, file_path, TFileOpenMode_ReadWrite, &pt_file ) );
+    REQUIRE_RC ( KFileSize ( pt_file, &file_size ) );
+    REQUIRE_RC ( KFileSetSize ( pt_file, file_size - sizeof(KEncFileFooter) ) );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    LOGMSG ( klogWarn, "Expect errors after this line:" );
+    REQUIRE ( TOpenEncFile( current_dir, file_path, TFileOpenMode_Read, &key, &enc_file ) == RC( rcKrypto, rcFile, rcConstructing, rcSize, rcIncorrect ) );
+    LOGMSG ( klogWarn, "No more errors are expected" );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KDectryptCorruptHeader)
+{
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/file_corrupt_header";
+
+    KFile * enc_file, * pt_file;
+    
+    const size_t buffer_size = sizeof(KEncFileHeader);
+    size_t num_written;
+    uint8_t buffer[buffer_size];
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_Write, &key, &enc_file ) );
+    REQUIRE_RC ( TFillFile( enc_file, (const uint8_t *)"\0\1", 2, 500 ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    // corrupt header
+    REQUIRE_RC ( TOpenPtFile ( current_dir, file_path, TFileOpenMode_ReadWrite, &pt_file ) );
+    REQUIRE_RC ( KFileReadAll ( pt_file, 0, buffer, buffer_size, &num_written ) );
+    buffer[0] ^= 4;
+    REQUIRE_RC ( KFileWriteAll ( pt_file, 0, buffer, buffer_size, &num_written ) );
+    assert(buffer_size == num_written);
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    LOGMSG ( klogWarn, "Expect errors after this line:" );
+    REQUIRE ( TOpenEncFile( current_dir, file_path, TFileOpenMode_Read, &key, &enc_file ) == RC( rcFS, rcFile, rcConstructing, rcHeader, rcInvalid ) );
+    LOGMSG ( klogWarn, "No more errors are expected" );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KDectryptCorruptFooterCrc)
+{
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/file_corrupt_footer_crc";
+
+    KFile * enc_file, * pt_file;
+
+    uint64_t file_size;
+    const size_t buffer_size = sizeof(KEncFileFooter);
+    size_t num_written, num_read;
+    uint8_t buffer[buffer_size];
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_Write, &key, &enc_file ) );
+    REQUIRE_RC ( TFillFile( enc_file, (const uint8_t *)"\0\1", 2, 500 ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    // corrupt footer
+    REQUIRE_RC ( TOpenPtFile ( current_dir, file_path, TFileOpenMode_ReadWrite, &pt_file ) );
+    REQUIRE_RC ( KFileSize ( pt_file, &file_size ) );
+    REQUIRE_RC ( KFileReadAll ( pt_file, file_size - buffer_size, buffer, buffer_size, &num_read ) );
+    assert(buffer_size == num_read);
+    ((KEncFileFooter*)&buffer)->crc_checksum ^= 4;
+    REQUIRE_RC ( KFileWriteAll ( pt_file, file_size - buffer_size, buffer, buffer_size, &num_written ) );
+    assert(buffer_size == num_written);
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    REQUIRE_RC ( TOpenPtFile( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+    LOGMSG ( klogWarn, "Expect errors after this line:" );
+    REQUIRE ( KEncFileValidate( pt_file ) == RC(rcKrypto, rcFile, rcValidating, rcChecksum, rcCorrupt) );
+    LOGMSG ( klogWarn, "No more errors are expected" );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KDectryptCorruptFooterBlockCount)
+{
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/file_corrupt_footer_block_count";
+
+    KFile * enc_file, * pt_file;
+    
+    uint64_t file_size;
+    const size_t buffer_size = sizeof(KEncFileFooter);
+    size_t num_written, num_read;
+    uint8_t buffer[buffer_size];
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_Write, &key, &enc_file ) );
+    REQUIRE_RC ( TFillFile( enc_file, (const uint8_t *)"\0\1", 2, 500 ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    // corrupt footer
+    REQUIRE_RC ( TOpenPtFile ( current_dir, file_path, TFileOpenMode_ReadWrite, &pt_file ) );
+    REQUIRE_RC ( KFileSize ( pt_file, &file_size ) );
+    REQUIRE_RC ( KFileReadAll ( pt_file, file_size - buffer_size, buffer, buffer_size, &num_read ) );
+    assert(buffer_size == num_read);
+    ((KEncFileFooter*)&buffer)->block_count ^= 4;
+    REQUIRE_RC ( KFileWriteAll ( pt_file, file_size - buffer_size, buffer, buffer_size, &num_written ) );
+    assert(buffer_size == num_written);
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    REQUIRE_RC ( TOpenPtFile( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+    LOGMSG ( klogWarn, "Expect errors after this line:" );
+    REQUIRE ( KEncFileValidate( pt_file ) == RC(rcKrypto, rcFile, rcValidating, rcSize, rcIncorrect) );
+    LOGMSG ( klogWarn, "No more errors are expected" );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KDectryptCorruptBlockStruct)
+{
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/file_corrupt_block_struct";
+
+    KFile * enc_file, * pt_file;
+    
+    uint64_t file_size;
+    const size_t buffer_size = sizeof(KEncFileBlock);
+    size_t num_written, num_read;
+    uint8_t buffer[buffer_size];
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_Write, &key, &enc_file ) );
+    REQUIRE_RC ( TFillFile( enc_file, (const uint8_t *)"\0\1", 2, 500 ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    // corrupt block struct
+    REQUIRE_RC ( TOpenPtFile ( current_dir, file_path, TFileOpenMode_ReadWrite, &pt_file ) );
+    REQUIRE_RC ( KFileSize ( pt_file, &file_size ) );
+    REQUIRE_RC ( KFileReadAll ( pt_file, file_size - sizeof(KEncFileFooter) - buffer_size, buffer, buffer_size, &num_read ) );
+    assert(buffer_size == num_read);
+    buffer[0] ^= 4;
+    REQUIRE_RC ( KFileWriteAll ( pt_file, file_size - sizeof(KEncFileFooter) - buffer_size, buffer, buffer_size, &num_written ) );
+    assert(buffer_size == num_written);
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    REQUIRE_RC ( TOpenPtFile( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+    LOGMSG ( klogWarn, "Expect errors after this line:" );
+    REQUIRE ( KEncFileValidate( pt_file ) == RC(rcKrypto, rcFile, rcValidating, rcChecksum, rcCorrupt) );
+    LOGMSG ( klogWarn, "No more errors are expected" );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KDectryptCorruptBlockData)
+{
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/file_corrupt_block_data";
+
+    KFile * enc_file, * pt_file;
+    
+    uint64_t file_size;
+    const size_t buffer_size = sizeof(KEncFileBlock);
+    size_t num_written, num_read;
+    uint8_t buffer[buffer_size];
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_Write, &key, &enc_file ) );
+    REQUIRE_RC ( TFillFile( enc_file, (const uint8_t *)"\0\1", 2, 500 ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    // corrupt block struct
+    REQUIRE_RC ( TOpenPtFile ( current_dir, file_path, TFileOpenMode_ReadWrite, &pt_file ) );
+    REQUIRE_RC ( KFileSize ( pt_file, &file_size ) );
+    REQUIRE_RC ( KFileReadAll ( pt_file, file_size - sizeof(KEncFileFooter) - buffer_size, buffer, buffer_size, &num_read ) );
+    assert(buffer_size == num_read);
+    ((KEncFileBlock*)&buffer)->data[0] ^= 4;
+    REQUIRE_RC ( KFileWriteAll ( pt_file, file_size - sizeof(KEncFileFooter) - buffer_size, buffer, buffer_size, &num_written ) );
+    assert(buffer_size == num_written);
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+
+    REQUIRE_RC ( TOpenPtFile( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+    LOGMSG ( klogWarn, "Expect errors after this line:" );
+    REQUIRE ( KEncFileValidate( pt_file ) == RC(rcKrypto, rcFile, rcValidating, rcChecksum, rcCorrupt) );
+    LOGMSG ( klogWarn, "No more errors are expected" );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+
+TEST_CASE(KDectryptInvalidKey)
+{
+    const char pw1 [] = "first pw";
+    const char pw2 [] = "second pw";
+    KKey key1, key2;
+    REQUIRE_RC (KKeyInitUpdate (&key1, kkeyAES128, pw1, strlen (pw1)));
+    REQUIRE_RC (KKeyInitUpdate (&key2, kkeyAES128, pw2, strlen (pw2)));
+    
+    const char file_path [] = TMP_FOLDER "/enc_file_invalid_key";
+
+    KFile * enc_file;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_Write, &key1, &enc_file ) );
+    REQUIRE_RC ( TFillFile( enc_file, (const uint8_t *)"\0\1", 2, 500 ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    REQUIRE_RC ( TOpenEncFile( current_dir, file_path, TFileOpenMode_Read, &key2, &enc_file ) );
+    LOGMSG ( klogWarn, "Expect errors after this line:" );
+    REQUIRE ( TCheckFileContent( enc_file, (const uint8_t *)"\0\1", 2 ) == RC( rcKrypto, rcFile, rcValidating, rcEncryption, rcCorrupt ) );
+    LOGMSG ( klogWarn, "No more errors are expected" );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+//////////////////////////////////////////// Main
+
+extern "C"
+{
+    
+    ver_t CC KAppVersion ( void )
+    {
+        return 0x1000000;
+    }
+    
+    rc_t CC UsageSummary (const char * prog_name)
+    {
+        return 0;
+    }
+    
+    rc_t CC Usage ( const Args * args)
+    {
+        return 0;
+    }
+    
+    const char UsageDefaultName[] = "test-encdec";
+    
+    rc_t CC KMain ( int argc, char *argv [] )
+    {
+        KConfigDisableUserSettings();
+        rc_t rc=KEncDecTestSuite(argc, argv);
+        return rc;
+    }
+    
+}
\ No newline at end of file
diff --git a/test/krypto/test-krypto-slow.cpp b/test/krypto/test-krypto-slow.cpp
new file mode 100644
index 0000000..0237bd8
--- /dev/null
+++ b/test/krypto/test-krypto-slow.cpp
@@ -0,0 +1,401 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/**
+ * Unit tests for KReencTestSuite
+ */
+
+#include <ktst/unit_test.hpp>
+
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+#include <krypto/encfile-priv.h>
+#include <krypto/reencfile.h>
+#include <kfs/impl.h>
+#include <klib/rc.h>
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+#include "test-cmn.hpp"
+
+#include <string.h>
+#include <stdio.h>
+
+TEST_SUITE(KKryptoSlowTestSuite);
+
+// check for file sizes which can only fit into 64-bit
+TEST_CASE(KReencryptBigSparseFile)
+{
+    rc_t rc;
+    bool space_exhausted = false;
+    
+    const char pw2 [] = "second pw";
+    KKey key_reenc;
+    REQUIRE_RC (KKeyInitUpdate (&key_reenc, kkeyAES128, pw2, strlen (pw2)));
+    
+    const char file_path [] = TMP_FOLDER "/big_file";
+
+    const char file_path_reenc [] = TMP_FOLDER "/big_file_reenc";
+
+    KFile * pt_file, *reenc_file, * reenc_pt_file;
+    
+    uint64_t file_size = 5LL * 1024 * 1024 * 1024;
+    uint64_t pt_size, reenc_size;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    // create file
+    REQUIRE_RC ( TCreatePtFile( current_dir, file_path, TFileOpenMode_Write, &pt_file ) );
+    REQUIRE_RC ( KFileSetSize( pt_file, file_size ) );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    REQUIRE_RC ( TOpenPtFile( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+    REQUIRE_RC ( KEncryptFileMakeRead( (const KFile **)&reenc_file, (const KFile *)pt_file, &key_reenc ) );
+    
+    REQUIRE_RC ( KFileSize ( pt_file, &pt_size ) );
+    REQUIRE_RC ( KFileSize ( reenc_file, &reenc_size ) );
+    
+    REQUIRE ( reenc_size == TEncSizeFromPtSize(pt_size) );
+    
+    REQUIRE_RC ( TCreatePtFile( current_dir, file_path_reenc, TFileOpenMode_Write, &reenc_pt_file ) );
+    
+    rc = TCopyFile( reenc_pt_file, reenc_file );
+    if (rc != 0 && GetRCObject(rc) == rcStorage && GetRCState(rc) == rcExhausted)
+    {
+        space_exhausted = true;
+        printf("WARNING! Test failed due to absence of free FS space - SKIPPING\n");
+    }
+    else
+    {
+        REQUIRE_RC ( rc );
+    }
+    
+    REQUIRE_RC ( KFileRelease ( reenc_pt_file ) );
+    REQUIRE_RC ( KFileRelease ( reenc_file ) );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    if ( !space_exhausted )
+    {
+        // check file content
+        REQUIRE_RC ( TOpenEncFile( current_dir, file_path_reenc, TFileOpenMode_Read, &key_reenc, &reenc_file ) );
+        
+        REQUIRE_RC ( TCheckFileContent( reenc_file, (const uint8_t *)"\0", 1 ) );
+        
+        REQUIRE_RC ( KFileRelease ( reenc_file ) );
+    }
+
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KReencrypt4GbMarginsSparseFiles)
+{
+    rc_t rc;
+    bool space_exhausted = false;
+    
+    const char pw2 [] = "second pw";
+    KKey key_reenc;
+    REQUIRE_RC (KKeyInitUpdate (&key_reenc, kkeyAES128, pw2, strlen (pw2)));
+    
+    const char file_path [] = TMP_FOLDER "/big_4gb_file";
+
+    const char file_path_reenc [] = TMP_FOLDER "/big_4gb_file_reenc";
+
+    KFile * pt_file, *reenc_file, * reenc_pt_file;
+    
+    uint64_t file_size = 4LL * 1024 * 1024 * 1024;
+    uint64_t pt_size, reenc_size;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    int8_t size_variants[] = { -1, 1 };
+    for (size_t i = 0; i < sizeof size_variants / sizeof size_variants[0]; ++i )
+    {
+        // just in case if it still there
+        KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+        
+        // create file
+        REQUIRE_RC ( TCreatePtFile( current_dir, file_path, TFileOpenMode_Write, &pt_file ) );
+        REQUIRE_RC ( KFileSetSize( pt_file, file_size + size_variants[i] ) );
+        REQUIRE_RC ( KFileRelease ( pt_file ) );
+        
+        REQUIRE_RC ( TOpenPtFile( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+        REQUIRE_RC ( KEncryptFileMakeRead( (const KFile **)&reenc_file, (const KFile *)pt_file, &key_reenc ) );
+        
+        REQUIRE_RC ( KFileSize ( pt_file, &pt_size ) );
+        REQUIRE_RC ( KFileSize ( reenc_file, &reenc_size ) );
+        
+        REQUIRE ( file_size + size_variants[i] == pt_size );
+        REQUIRE ( reenc_size == TEncSizeFromPtSize(pt_size) );
+        
+        REQUIRE_RC ( TCreatePtFile( current_dir, file_path_reenc, TFileOpenMode_Write, &reenc_pt_file ) );
+        rc = TCopyFile( reenc_pt_file, reenc_file );
+        if (rc != 0 && GetRCObject(rc) == rcStorage && GetRCState(rc) == rcExhausted)
+        {
+            space_exhausted = true;
+            printf("WARNING! Test failed due to absence of free FS space - SKIPPING\n");
+        }
+        else
+        {
+            REQUIRE_RC ( rc );
+        }
+        
+        REQUIRE_RC ( KFileRelease ( reenc_pt_file ) );
+        REQUIRE_RC ( KFileRelease ( reenc_file ) );
+        REQUIRE_RC ( KFileRelease ( pt_file ) );
+        
+        if ( !space_exhausted )
+        {
+            // check file content
+            REQUIRE_RC ( TOpenEncFile( current_dir, file_path_reenc, TFileOpenMode_Read, &key_reenc, &reenc_file ) );
+            
+            REQUIRE_RC ( TCheckFileContent( reenc_file, (const uint8_t *)"\0", 1 ) );
+            
+            REQUIRE_RC ( KFileRelease ( reenc_file ) );
+        }
+        
+        KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+        if ( space_exhausted )
+        {
+            break;
+        }
+    }
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KEncDecBigFile)
+{
+    rc_t rc;
+    bool space_exhausted = false;
+    
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/enc_big_file";
+
+    KFile * enc_file, * pt_file;
+    
+    uint64_t file_size = 5LL * 1024 * 1024 * 1024;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_ReadWrite, &key, &enc_file ) );
+    
+    // write file
+    rc = TFillFile( enc_file, (const uint8_t *)"\1\5", 2, file_size );
+    if (rc != 0 && GetRCObject(rc) == rcStorage && GetRCState(rc) == rcExhausted)
+    {
+        space_exhausted = true;
+        printf("WARNING! Test failed due to absence of free FS space - SKIPPING\n");
+    }
+    else
+    {
+        REQUIRE_RC ( rc );
+    }
+    
+    uint64_t size_data_actual;
+    if ( !space_exhausted )
+    {
+        REQUIRE_RC ( KFileSize ( enc_file, &size_data_actual ) );
+        
+        // check content size
+        REQUIRE ( file_size == size_data_actual );
+    }
+    rc = KFileRelease ( enc_file );
+    if (!space_exhausted )
+    {
+        // we write file footer when closing file, which may fail too
+        if (rc != 0 && GetRCObject(rc) == rcStorage && GetRCState(rc) == rcExhausted)
+        {
+            space_exhausted = true;
+            printf("WARNING! Test failed due to absence of free FS space - SKIPPING\n");
+        }
+        else
+        {
+            REQUIRE_RC ( rc );
+        }
+    }
+    
+    if ( !space_exhausted )
+    {
+        // check plaintext file size and checksums
+        REQUIRE_RC ( TOpenPtFile ( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+        
+        uint64_t size_pt;
+        REQUIRE_RC ( KFileSize ( pt_file, &size_pt ) );
+        REQUIRE ( size_pt == TEncSizeFromPtSize(size_data_actual) );
+        
+        REQUIRE_RC ( KEncFileValidate( pt_file ) );
+        
+        REQUIRE_RC ( KFileRelease ( pt_file ) );
+        
+        // check file content
+        REQUIRE_RC ( TOpenEncFile( current_dir, file_path, TFileOpenMode_Read, &key, &enc_file ) );
+        
+        REQUIRE_RC ( TCheckFileContent( enc_file, (const uint8_t *)"\1\5", 2 ) );
+        
+        REQUIRE_RC ( KFileRelease ( enc_file ) );
+    }
+
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KEncDec4GbMarginsFiles)
+{
+    rc_t rc;
+    bool space_exhausted = false;
+ 
+    const char pw [] = "first pw";
+    KKey key;
+    REQUIRE_RC (KKeyInitUpdate (&key, kkeyAES128, pw, strlen (pw)));
+    
+    const char file_path [] = TMP_FOLDER "/enc_4gb_file";
+
+    KFile * enc_file, * pt_file;
+    
+    uint64_t file_size = 4LL * 1024 * 1024 * 1024;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    int8_t size_variants[] = { -1, 1 };
+    for (size_t i = 0; i < sizeof size_variants / sizeof size_variants[0]; ++i )
+    {
+        // just in case if it still there
+        KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+        
+        // create file
+        REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_ReadWrite, &key, &enc_file ) );
+        
+        // write file
+        rc = TFillFile( enc_file, (const uint8_t *)"\4\3", 2, file_size );
+        if (rc != 0 && GetRCObject(rc) == rcStorage && GetRCState(rc) == rcExhausted)
+        {
+            space_exhausted = true;
+            printf("WARNING! Test failed due to absence of free FS space - SKIPPING\n");
+        }
+        else
+        {
+            REQUIRE_RC ( rc );
+        }
+        
+        uint64_t size_data_actual;
+        if ( !space_exhausted )
+        {
+            REQUIRE_RC ( KFileSize ( enc_file, &size_data_actual ) );
+            
+            // check content size
+            REQUIRE ( file_size == size_data_actual );
+        }
+        rc = KFileRelease ( enc_file );
+        if ( !space_exhausted )
+        {
+            if (rc != 0 && GetRCObject(rc) == rcStorage && GetRCState(rc) == rcExhausted)
+            {
+                // we write file footer when closing file, which may fail too
+                space_exhausted = true;
+                printf("WARNING! Test failed due to absence of free FS space - SKIPPING\n");
+            }
+            else
+            {
+                REQUIRE_RC ( rc );
+            }
+        }
+        
+        if ( !space_exhausted )
+        {
+            // check plaintext file size and checksums
+            REQUIRE_RC ( TOpenPtFile ( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+            
+            uint64_t size_pt;
+            REQUIRE_RC ( KFileSize ( pt_file, &size_pt ) );
+            REQUIRE ( size_pt == TEncSizeFromPtSize(size_data_actual) );
+            
+            REQUIRE_RC ( KEncFileValidate( pt_file ) );
+            
+            REQUIRE_RC ( KFileRelease ( pt_file ) );
+            
+            // check file content
+            REQUIRE_RC ( TOpenEncFile( current_dir, file_path, TFileOpenMode_Read, &key, &enc_file ) );
+            
+            REQUIRE_RC ( TCheckFileContent( enc_file, (const uint8_t *)"\4\3", 2 ) );
+            
+            REQUIRE_RC ( KFileRelease ( enc_file ) );
+        }
+        
+        KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+        if ( space_exhausted )
+        {
+            break;
+        }
+    }
+    
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+//////////////////////////////////////////// Main
+
+extern "C"
+{
+    
+    ver_t CC KAppVersion ( void )
+    {
+        return 0x1000000;
+    }
+    
+    rc_t CC UsageSummary (const char * prog_name)
+    {
+        return 0;
+    }
+    
+    rc_t CC Usage ( const Args * args)
+    {
+        return 0;
+    }
+    
+    const char UsageDefaultName[] = "test-krypto-slow";
+    
+    rc_t CC KMain ( int argc, char *argv [] )
+    {
+        KConfigDisableUserSettings();
+        ncbi::NK::TestEnv::SetVerbosity(ncbi::NK::LogLevel::e_all);
+        rc_t rc=KKryptoSlowTestSuite(argc, argv);
+        return rc;
+    }
+    
+}
\ No newline at end of file
diff --git a/test/krypto/test-modes.c b/test/krypto/test-modes.c
new file mode 100644
index 0000000..0fb13eb
--- /dev/null
+++ b/test/krypto/test-modes.c
@@ -0,0 +1,1261 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <krypto/ciphermgr.h>
+#include <krypto/cipher.h>
+
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+#include <klib/defs.h>
+
+
+#include <string.h>
+
+static int num_errors = 0;
+
+/*
+  https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
+
+  http://www.inconteam.com/software-development/41-encryption/55-aes-test-vectors
+*/
+
+uint8_t AES_ECB_128_key[16] =
+{
+    0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
+    0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
+};
+
+uint8_t  AES_ECB_128_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+
+uint8_t  AES_ECB_128_cipher[4][16] =
+{
+    {
+        0x3a, 0xd7, 0x7b, 0xb4, 0x0d, 0x7a, 0x36, 0x60,
+        0xa8, 0x9e, 0xca, 0xf3, 0x24, 0x66, 0xef, 0x97
+    },
+    {
+        0xf5, 0xd3, 0xd5, 0x85, 0x03, 0xb9, 0x69, 0x9d,
+        0xe7, 0x85, 0x89, 0x5a, 0x96, 0xfd, 0xba, 0xaf
+    },
+    {
+        0x43, 0xb1, 0xcd, 0x7f, 0x59, 0x8e, 0xce, 0x23,
+        0x88, 0x1b, 0x00, 0xe3, 0xed, 0x03, 0x06, 0x88
+    },
+    {
+        0x7b, 0x0c, 0x78, 0x5e, 0x27, 0xe8, 0xad, 0x3f,
+        0x82, 0x23, 0x20, 0x71, 0x04, 0x72, 0x5d, 0xd4
+    }
+};
+
+uint8_t AES_ECB_192_key[24] =
+{
+    0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
+    0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
+    0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
+};
+
+uint8_t  AES_ECB_192_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+
+uint8_t  AES_ECB_192_cipher[4][16] =
+{
+    {
+        0xbd, 0x33, 0x4f, 0x1d, 0x6e, 0x45, 0xf2, 0x5f,
+        0xf7, 0x12, 0xa2, 0x14, 0x57, 0x1f, 0xa5, 0xcc
+    },
+    {
+        0x97, 0x41, 0x04, 0x84, 0x6d, 0x0a, 0xd3, 0xad,
+        0x77, 0x34, 0xec, 0xb3, 0xec, 0xee, 0x4e, 0xef
+    },
+    {
+        0xef, 0x7a, 0xfd, 0x22, 0x70, 0xe2, 0xe6, 0x0a,
+        0xdc, 0xe0, 0xba, 0x2f, 0xac, 0xe6, 0x44, 0x4e
+    },
+    {
+        0x9a, 0x4b, 0x41, 0xba, 0x73, 0x8d, 0x6c, 0x72,
+        0xfb, 0x16, 0x69, 0x16, 0x03, 0xc1, 0x8e, 0x0e
+    }
+};
+ 
+uint8_t AES_ECB_256_key[32] = 
+{
+    0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
+    0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
+    0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
+    0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
+};
+
+uint8_t AES_ECB_256_test[4][16] = 
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {   
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+
+uint8_t AES_ECB_256_cipher[4][16] = 
+{
+    {
+        0xf3, 0xee, 0xd1, 0xbd, 0xb5, 0xd2, 0xa0, 0x3c,
+        0x06, 0x4b, 0x5a, 0x7e, 0x3d, 0xb1, 0x81, 0xf8
+    },
+    {
+        0x59, 0x1c, 0xcb, 0x10, 0xd4, 0x10, 0xed, 0x26,
+        0xdc, 0x5b, 0xa7, 0x4a, 0x31, 0x36, 0x28, 0x70
+    },
+    {
+        0xb6, 0xed, 0x21, 0xb9, 0x9c, 0xa6, 0xf4, 0xf9,
+        0xf1, 0x53, 0xe7, 0xb1, 0xbe, 0xaf, 0xed, 0x1d
+    },
+    {
+        0x23, 0x30, 0x4b, 0x7a, 0x39, 0xf9, 0xf3, 0xff,
+        0x06, 0x7d, 0x8d, 0x8f, 0x9e, 0x24, 0xec, 0xc7
+    }
+};
+
+uint8_t AES_CBC_128_key[16] =
+{
+    0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
+    0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
+};
+
+uint8_t AES_CBC_128_ivec[4][16] =
+{
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+    },
+    {
+        0x76, 0x49, 0xAB, 0xAC, 0x81, 0x19, 0xB2, 0x46,
+        0xCE, 0xE9, 0x8E, 0x9B, 0x12, 0xE9, 0x19, 0x7D
+    },
+    {
+        0x50, 0x86, 0xCB, 0x9B, 0x50, 0x72, 0x19, 0xEE,
+        0x95, 0xDB, 0x11, 0x3A, 0x91, 0x76, 0x78, 0xB2
+    },
+    {
+        0x73, 0xBE, 0xD6, 0xB8, 0xE3, 0xC1, 0x74, 0x3B,
+        0x71, 0x16, 0xE6, 0x9E, 0x22, 0x22, 0x95, 0x16
+    }
+};
+uint8_t AES_CBC_128_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_CBC_128_cipher[4][16] =
+{
+    {
+        0x76, 0x49, 0xab, 0xac, 0x81, 0x19, 0xb2, 0x46,
+        0xce, 0xe9, 0x8e, 0x9b, 0x12, 0xe9, 0x19, 0x7d
+    },
+    {
+        0x50, 0x86, 0xcb, 0x9b, 0x50, 0x72, 0x19, 0xee,
+        0x95, 0xdb, 0x11, 0x3a, 0x91, 0x76, 0x78, 0xb2
+    },
+    {
+        0x73, 0xbe, 0xd6, 0xb8, 0xe3, 0xc1, 0x74, 0x3b,
+        0x71, 0x16, 0xe6, 0x9e, 0x22, 0x22, 0x95, 0x16
+    },
+    {
+        0x3f, 0xf1, 0xca, 0xa1, 0x68, 0x1f, 0xac, 0x09,
+        0x12, 0x0e, 0xca, 0x30, 0x75, 0x86, 0xe1, 0xa7
+    }
+};
+
+uint8_t AES_CBC_192_key[24] =
+{
+    0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
+    0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
+    0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
+};
+
+uint8_t AES_CBC_192_ivec[4][16] =
+{
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+    },
+    {
+        0x4F, 0x02, 0x1D, 0xB2, 0x43, 0xBC, 0x63, 0x3D,
+        0x71, 0x78, 0x18, 0x3A, 0x9F, 0xA0, 0x71, 0xE8
+    },
+    {
+        0xB4, 0xD9, 0xAD, 0xA9, 0xAD, 0x7D, 0xED, 0xF4,
+        0xE5, 0xE7, 0x38, 0x76, 0x3F, 0x69, 0x14, 0x5A
+    },
+    {
+        0x57, 0x1B, 0x24, 0x20, 0x12, 0xFB, 0x7A, 0xE0,
+        0x7F, 0xA9, 0xBA, 0xAC, 0x3D, 0xF1, 0x02, 0xE0
+    }
+};
+uint8_t AES_CBC_192_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_CBC_192_cipher[4][16] =
+{
+    {
+        0x4f, 0x02, 0x1d, 0xb2, 0x43, 0xbc, 0x63, 0x3d,
+        0x71, 0x78, 0x18, 0x3a, 0x9f, 0xa0, 0x71, 0xe8
+    },
+    {
+        0xb4, 0xd9, 0xad, 0xa9, 0xad, 0x7d, 0xed, 0xf4, 
+        0xe5, 0xe7, 0x38, 0x76, 0x3f, 0x69, 0x14, 0x5a
+    },
+    {
+        0x57, 0x1b, 0x24, 0x20, 0x12, 0xfb, 0x7a, 0xe0,
+        0x7f, 0xa9, 0xba, 0xac, 0x3d, 0xf1, 0x02, 0xe0
+    },
+    {
+        0x08, 0xb0, 0xe2, 0x79, 0x88, 0x59, 0x88, 0x81,
+        0xd9, 0x20, 0xa9, 0xe6, 0x4f, 0x56, 0x15, 0xcd
+    }
+};
+
+uint8_t AES_CBC_256_key[32] =
+{
+    0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
+    0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
+    0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
+    0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
+};
+
+uint8_t AES_CBC_256_ivec[4][16] =
+{
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+    },
+    {
+        0xF5, 0x8C, 0x4C, 0x04, 0xD6, 0xE5, 0xF1, 0xBA,
+        0x77, 0x9E, 0xAB, 0xFB, 0x5F, 0x7B, 0xFB, 0xD6
+    },
+    {
+        0x9C, 0xFC, 0x4E, 0x96, 0x7E, 0xDB, 0x80, 0x8D,
+        0x67, 0x9F, 0x77, 0x7B, 0xC6, 0x70, 0x2C, 0x7D
+    },
+    {
+        0x39, 0xF2, 0x33, 0x69, 0xA9, 0xD9, 0xBA, 0xCF,
+        0xA5, 0x30, 0xE2, 0x63, 0x04, 0x23, 0x14, 0x61
+    }
+};
+uint8_t AES_CBC_256_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_CBC_256_cipher[4][16] =
+{
+    {
+        0xf5, 0x8c, 0x4c, 0x04, 0xd6, 0xe5, 0xf1, 0xba,
+        0x77, 0x9e, 0xab, 0xfb, 0x5f, 0x7b, 0xfb, 0xd6
+    },
+    {
+        0x9c, 0xfc, 0x4e, 0x96, 0x7e, 0xdb, 0x80, 0x8d,
+        0x67, 0x9f, 0x77, 0x7b, 0xc6, 0x70, 0x2c, 0x7d
+    },
+    {
+        0x39, 0xf2, 0x33, 0x69, 0xa9, 0xd9, 0xba, 0xcf,
+        0xa5, 0x30, 0xe2, 0x63, 0x04, 0x23, 0x14, 0x61
+    },
+    {
+        0xb2, 0xeb, 0x05, 0xe2, 0xc3, 0x9b, 0xe9, 0xfc,
+        0xda, 0x6c, 0x19, 0x07, 0x8c, 0x6a, 0x9d, 0x1b
+    }
+};
+
+/* ==================================================== */
+uint8_t AES_CFB_128_key[16] =
+{
+    0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
+    0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
+};
+
+uint8_t AES_CFB_128_ivec[4][16] =
+{
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+    },
+    {
+        0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
+        0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A
+    },
+    {
+        0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
+        0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B
+    },
+    {
+        0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
+        0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF
+    }
+};
+uint8_t AES_CFB_128_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_CFB_128_cipher[4][16] =
+{
+    {
+        0x3b, 0x3f, 0xd9, 0x2e, 0xb7, 0x2d, 0xad, 0x20,
+        0x33, 0x34, 0x49, 0xf8, 0xe8, 0x3c, 0xfb, 0x4a
+    },
+    {
+        0xc8, 0xa6, 0x45, 0x37, 0xa0, 0xb3, 0xa9, 0x3f,
+        0xcd, 0xe3, 0xcd, 0xad, 0x9f, 0x1c, 0xe5, 0x8b
+    },
+    {
+        0x26, 0x75, 0x1f, 0x67, 0xa3, 0xcb, 0xb1, 0x40,
+        0xb1, 0x80, 0x8c, 0xf1, 0x87, 0xa4, 0xf4, 0xdf
+    },
+    {
+        0xc0, 0x4b, 0x05, 0x35, 0x7c, 0x5d, 0x1c, 0x0e,
+        0xea, 0xc4, 0xc6, 0x6f, 0x9f, 0xf7, 0xf2, 0xe6
+    }
+};
+
+uint8_t AES_CFB_192_key[24] =
+{
+    0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
+    0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
+    0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
+};
+
+uint8_t AES_CFB_192_ivec[4][16] =
+{
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+    },
+    {
+        0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
+        0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74
+    },
+    {
+        0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
+        0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A
+    },
+    {
+        0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
+        0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9
+    }
+};
+uint8_t AES_CFB_192_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_CFB_192_cipher[4][16] =
+{
+    {
+        0xcd, 0xc8, 0x0d, 0x6f, 0xdd, 0xf1, 0x8c, 0xab,
+        0x34, 0xc2, 0x59, 0x09, 0xc9, 0x9a, 0x41, 0x74
+    },
+    {
+        0x67, 0xce, 0x7f, 0x7f, 0x81, 0x17, 0x36, 0x21,
+        0x96, 0x1a, 0x2b, 0x70, 0x17, 0x1d, 0x3d, 0x7a
+    },
+    {
+        0x2e, 0x1e, 0x8a, 0x1d, 0xd5, 0x9b, 0x88, 0xb1,
+        0xc8, 0xe6, 0x0f, 0xed, 0x1e, 0xfa, 0xc4, 0xc9
+    },
+    {
+        0xc0, 0x5f, 0x9f, 0x9c, 0xa9, 0x83, 0x4f, 0xa0,
+        0x42, 0xae, 0x8f, 0xba, 0x58, 0x4b, 0x09, 0xff
+    }
+};
+
+uint8_t AES_CFB_256_key[32] =
+{
+    0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
+    0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
+    0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
+    0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
+};
+
+uint8_t AES_CFB_256_ivec[4][16] =
+{
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+    },
+    {
+        0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
+        0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60
+    },
+    {
+        0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
+        0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B
+    },
+    {
+        0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
+        0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9
+    }
+};
+uint8_t AES_CFB_256_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_CFB_256_cipher[4][16] =
+{
+    {
+        0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
+        0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60
+    },
+    {
+        0x39, 0xff, 0xed, 0x14, 0x3b, 0x28, 0xb1, 0xc8,
+        0x32, 0x11, 0x3c, 0x63, 0x31, 0xe5, 0x40, 0x7b
+    },
+    {
+        0xdf, 0x10, 0x13, 0x24, 0x15, 0xe5, 0x4b, 0x92,
+        0xa1, 0x3e, 0xd0, 0xa8, 0x26, 0x7a, 0xe2, 0xf9
+    },
+    {
+        0x75, 0xa3, 0x85, 0x74, 0x1a, 0xb9, 0xce, 0xf8,
+        0x20, 0x31, 0x62, 0x3d, 0x55, 0xb1, 0xe4, 0x71
+    }
+};
+/* ==================================================== */
+uint8_t AES_OFB_128_key[16] =
+{
+    0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
+    0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
+};
+
+uint8_t AES_OFB_128_ivec[4][16] =
+{
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+    },
+    {
+        0x50, 0xFE, 0x67, 0xCC, 0x99, 0x6D, 0x32, 0xB6,
+        0xDA, 0x09, 0x37, 0xE9, 0x9B, 0xAF, 0xEC, 0x60
+    },
+    {
+        0xD9, 0xA4, 0xDA, 0xDA, 0x08, 0x92, 0x23, 0x9F,
+        0x6B, 0x8B, 0x3D, 0x76, 0x80, 0xE1, 0x56, 0x74
+    },
+    {
+        0xA7, 0x88, 0x19, 0x58, 0x3F, 0x03, 0x08, 0xE7,
+        0xA6, 0xBF, 0x36, 0xB1, 0x38, 0x6A, 0xBF, 0x23
+    }
+};
+uint8_t AES_OFB_128_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_OFB_128_cipher[4][16] =
+{
+    {
+        0x3b, 0x3f, 0xd9, 0x2e, 0xb7, 0x2d, 0xad, 0x20,
+        0x33, 0x34, 0x49, 0xf8, 0xe8, 0x3c, 0xfb, 0x4a
+    },
+    {
+        0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
+        0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25
+    },
+    {
+        0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
+        0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc
+    },
+    {
+        0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
+        0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e
+    }
+};
+
+uint8_t AES_OFB_192_key[24] =
+{
+    0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
+    0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
+    0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
+};
+
+uint8_t AES_OFB_192_ivec[4][16] =
+{
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+    },
+    {
+        0xA6, 0x09, 0xB3, 0x8D, 0xF3, 0xB1, 0x13, 0x3D,
+        0xDD, 0xFF, 0x27, 0x18, 0xBA, 0x09, 0x56, 0x5E
+    },
+    {
+        0x52, 0xEF, 0x01, 0xDA, 0x52, 0x60, 0x2F, 0xE0,
+        0x97, 0x5F, 0x78, 0xAC, 0x84, 0xBF, 0x8A, 0x50
+    },
+    {
+        0xBD, 0x52, 0x86, 0xAC, 0x63, 0xAA, 0xBD, 0x7E,
+        0xB0, 0x67, 0xAC, 0x54, 0xB5, 0x53, 0xF7, 0x1D
+    }
+};
+uint8_t AES_OFB_192_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_OFB_192_cipher[4][16] =
+{
+    {
+        0xcd, 0xc8, 0x0d, 0x6f, 0xdd, 0xf1, 0x8c, 0xab,
+        0x34, 0xc2, 0x59, 0x09, 0xc9, 0x9a, 0x41, 0x74
+    },
+    {
+        0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
+        0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01
+    },
+    {
+        0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
+        0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2
+    },
+    {
+        0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
+        0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a
+    }
+};
+
+uint8_t AES_OFB_256_key[32] =
+{
+    0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
+    0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
+    0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
+    0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
+};
+
+uint8_t AES_OFB_256_ivec[4][16] =
+{
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+    },
+    {
+        0xB7, 0xBF, 0x3A, 0x5D, 0xF4, 0x39, 0x89, 0xDD,
+        0x97, 0xF0, 0xFA, 0x97, 0xEB, 0xCE, 0x2F, 0x4A
+    },
+    {
+        0xE1, 0xC6, 0x56, 0x30, 0x5E, 0xD1, 0xA7, 0xA6,
+        0x56, 0x38, 0x05, 0x74, 0x6F, 0xE0, 0x3E, 0xDC
+    },
+    {
+        0x41, 0x63, 0x5B, 0xE6, 0x25, 0xB4, 0x8A, 0xFC,
+        0x16, 0x66, 0xDD, 0x42, 0xA0, 0x9D, 0x96, 0xE7
+    }
+};
+uint8_t AES_OFB_256_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_OFB_256_cipher[4][16] =
+{
+    {
+        0xdc, 0x7e, 0x84, 0xbf, 0xda, 0x79, 0x16, 0x4b,
+        0x7e, 0xcd, 0x84, 0x86, 0x98, 0x5d, 0x38, 0x60
+    },
+    {
+        0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
+        0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d
+    },
+    {
+        0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
+        0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08
+    },
+    {
+        0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
+        0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84
+    }
+};
+
+/* ==================================================== */
+uint8_t AES_CTR_128_key[16] =
+{
+    0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
+    0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
+};
+
+uint8_t AES_CTR_128_ivec[16] =
+{
+    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+uint8_t AES_CTR_128_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_CTR_128_cipher[4][16] =
+{
+    {
+        0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26,
+        0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce
+    },
+    {
+        0x98, 0x06, 0xf6, 0x6b, 0x79, 0x70, 0xfd, 0xff,
+        0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff, 0xfd, 0xff
+    },
+    {
+        0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5, 0xd3, 0x5e,
+        0x5b, 0x4f, 0x09, 0x02, 0x0d, 0xb0, 0x3e, 0xab
+    },
+    {
+        0x1e, 0x03, 0x1d, 0xda, 0x2f, 0xbe, 0x03, 0xd1,
+        0x79, 0x21, 0x70, 0xa0, 0xf3, 0x00, 0x9c, 0xee
+    }
+};
+
+uint8_t AES_CTR_192_key[24] =
+{
+    0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
+    0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
+    0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
+};
+
+uint8_t AES_CTR_192_ivec[16] =
+{
+    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+uint8_t AES_CTR_192_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_CTR_192_cipher[4][16] =
+{
+    {
+        0x1a, 0xbc, 0x93, 0x24, 0x17, 0x52, 0x1c, 0xa2,
+        0x4f, 0x2b, 0x04, 0x59, 0xfe, 0x7e, 0x6e, 0x0b
+    },
+    {
+        0x09, 0x03, 0x39, 0xec, 0x0a, 0xa6, 0xfa, 0xef,
+        0xd5, 0xcc, 0xc2, 0xc6, 0xf4, 0xce, 0x8e, 0x94
+    },
+    {
+        0x1e, 0x36, 0xb2, 0x6b, 0xd1, 0xeb, 0xc6, 0x70,
+        0xd1, 0xbd, 0x1d, 0x66, 0x56, 0x20, 0xab, 0xf7
+    },
+    {
+        0x4f, 0x78, 0xa7, 0xf6, 0xd2, 0x98, 0x09, 0x58,
+        0x5a, 0x97, 0xda, 0xec, 0x58, 0xc6, 0xb0, 0x50
+    }
+};
+
+uint8_t AES_CTR_256_key[32] =
+{
+    0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
+    0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
+    0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
+    0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
+};
+
+uint8_t AES_CTR_256_ivec[16] =
+{
+    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+uint8_t AES_CTR_256_test[4][16] =
+{
+    {
+        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
+    },
+    {
+        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51
+    },
+    {
+        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef
+    },
+    {
+        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
+    }
+};
+uint8_t AES_CTR_256_cipher[4][16] =
+{
+    {
+        0x60, 0x1e, 0xc3, 0x13, 0x77, 0x57, 0x89, 0xa5,
+        0xb7, 0xa7, 0xf5, 0x04, 0xbb, 0xf3, 0xd2, 0x28
+    },
+    {   
+        0xf4, 0x43, 0xe3, 0xca, 0x4d, 0x62, 0xb5, 0x9a,
+        0xca, 0x84, 0xe9, 0x90, 0xca, 0xca, 0xf5, 0xc5
+    },
+    {   
+        0x2b, 0x09, 0x30, 0xda, 0xa2, 0x3d, 0xe9, 0x4c,
+        0xe8, 0x70, 0x17, 0xba, 0x2d, 0x84, 0x98, 0x8d
+    },
+    {   
+        0xdf, 0xc9, 0xc5, 0x8d, 0xb6, 0x7a, 0xad, 0xa6,
+        0x13, 0xc2, 0xdd, 0x08, 0x45, 0x79, 0x41, 0xa6
+    }
+};
+/* ==================================================== */
+rc_t run ()
+{
+    KCipherManager * manager;
+    rc_t rc;
+
+    rc = KCipherManagerMake (&manager);
+    if (rc == 0)
+    {
+        KCipher * cipher;
+
+        rc = KCipherManagerMakeCipher (manager, &cipher, kcipher_AES);
+        if (rc == 0)
+        {
+            /* AES ECB 128 */
+            KOutMsg ("AES ECB 128\n");
+            rc = KCipherSetEncryptKey (cipher, AES_ECB_128_key, sizeof AES_ECB_128_key);
+            if (rc == 0)
+            {
+                rc = KCipherSetDecryptKey (cipher, AES_ECB_128_key, sizeof AES_ECB_128_key);
+                if (rc == 0)
+                {
+                    unsigned int index;
+
+                    for (index = 0; index < (sizeof AES_ECB_128_test / sizeof AES_ECB_128_test[0]); ++index)
+                    {
+                        uint8_t etemp [16];
+                        uint8_t dtemp [16];
+
+                        rc = KCipherEncryptECB (cipher, AES_ECB_128_test[index], etemp, sizeof AES_ECB_128_test[0] / sizeof etemp);
+                        if (rc == 0)
+                        {
+                            rc = KCipherDecryptECB (cipher, AES_ECB_128_cipher[index], dtemp, sizeof AES_ECB_128_cipher[0] / sizeof dtemp);
+                            if (rc == 0)
+                            {
+                                if (memcmp (AES_ECB_128_test[index], dtemp, sizeof dtemp) != 0)
+                                {
+                                    KOutMsg ("Failed AES ECB 128 encrypt #%u\n", index);
+                                    ++num_errors;
+                                }
+                                if (memcmp (AES_ECB_128_cipher[index], etemp, sizeof etemp) != 0)
+                                {
+                                    KOutMsg ("Failed AES ECB 128 decrypt test #%u\n", index);
+                                    ++num_errors;
+                                }
+                            }
+                        }
+                    }
+                }
+            }           
+
+            /* AES ECB 192 */
+            KOutMsg ("AES ECB 192\n");
+            rc = KCipherSetEncryptKey (cipher, AES_ECB_192_key, sizeof AES_ECB_192_key);
+            if (rc == 0)
+            {
+                rc = KCipherSetDecryptKey (cipher, AES_ECB_192_key, sizeof AES_ECB_192_key);
+                if (rc == 0)
+                {
+                    unsigned int index;
+
+                    for (index = 0; index < (sizeof AES_ECB_192_test / sizeof AES_ECB_192_test[0]); ++index)
+                    {
+                        uint8_t etemp [16];
+                        uint8_t dtemp [16];
+
+                        rc = KCipherEncryptECB (cipher, AES_ECB_192_test[index], etemp, sizeof AES_ECB_192_test[0] / sizeof etemp);
+                        if (rc == 0)
+                        {
+                            rc = KCipherDecryptECB (cipher, AES_ECB_192_cipher[index], dtemp, sizeof AES_ECB_192_cipher[0] / sizeof dtemp);
+                            if (rc == 0)
+                            {
+                                if (memcmp (AES_ECB_192_test[index], dtemp, sizeof dtemp) != 0)
+                                {
+                                    KOutMsg ("Failed AES ECB 192 encrypt #%u\n", index);
+                                    ++num_errors;
+                                }
+                                if (memcmp (AES_ECB_192_cipher[index], etemp, sizeof etemp) != 0)
+                                {
+                                    KOutMsg ("Failed AES ECB 192 decrypt test #%u\n", index);
+                                    ++num_errors;
+                                }
+                            }
+                        }
+                    }
+                }
+            }           
+
+            /* AES ECB 256 */
+            KOutMsg ("AES ECB 256\n");
+            rc = KCipherSetEncryptKey (cipher, AES_ECB_256_key, sizeof AES_ECB_256_key);
+            if (rc == 0)
+            {
+                rc = KCipherSetDecryptKey (cipher, AES_ECB_256_key, sizeof AES_ECB_256_key);
+                if (rc == 0)
+                {
+                    unsigned int index;
+
+                    for (index = 0; index < (sizeof AES_ECB_256_test / sizeof AES_ECB_256_test[0]); ++index)
+                    {
+                        uint8_t etemp [16];
+                        uint8_t dtemp [16];
+
+                        rc = KCipherEncryptECB (cipher, AES_ECB_256_test[index], etemp, sizeof AES_ECB_256_test[0] / sizeof etemp);
+                        if (rc == 0)
+                        {
+                            rc = KCipherDecryptECB (cipher, AES_ECB_256_cipher[index], dtemp, sizeof AES_ECB_256_cipher[0] / sizeof dtemp);
+                            if (rc == 0)
+                            {
+                                if (memcmp (AES_ECB_256_test[index], dtemp, sizeof dtemp) != 0)
+                                {
+                                    KOutMsg ("Failed AES ECB 256 encrypt #%u\n", index);
+                                    ++num_errors;
+                                }
+                                if (memcmp (AES_ECB_256_cipher[index], etemp, sizeof etemp) != 0)
+                                {
+                                    KOutMsg ("Failed AES ECB 256 decrypt test #%u\n", index);
+                                    ++num_errors;
+                                }
+                            }
+                        }
+                    }
+                }
+            }           
+
+
+            /* AES CBC 128 */
+            KOutMsg ("AES CBC 128\n");
+            rc = KCipherSetEncryptKey (cipher, AES_CBC_128_key, sizeof AES_CBC_128_key);
+            if (rc == 0)
+            {
+                rc = KCipherSetDecryptKey (cipher, AES_CBC_128_key, sizeof AES_CBC_128_key);
+                if (rc == 0)
+                {
+                    rc = KCipherSetEncryptIVec (cipher, AES_CBC_128_ivec);
+                    if (rc == 0)
+                    {
+                        rc = KCipherSetDecryptIVec (cipher, AES_CBC_128_ivec);
+                        if (rc == 0)
+                        {
+                            unsigned int index;
+
+                            for (index = 0; index < (sizeof AES_CBC_128_test / sizeof AES_CBC_128_test[0]); ++index)
+                            {
+                                uint8_t etemp [16];
+                                uint8_t dtemp [16];
+
+                                rc = KCipherEncryptCBC (cipher, AES_CBC_128_test[index], etemp, sizeof AES_CBC_128_test[0] / sizeof etemp);
+                                if (rc == 0)
+                                {
+                                    rc = KCipherDecryptCBC (cipher, AES_CBC_128_cipher[index], dtemp, sizeof AES_CBC_128_cipher[0] / sizeof dtemp);
+                                    if (rc == 0)
+                                    {
+                                        if (memcmp (AES_CBC_128_test[index], dtemp, sizeof dtemp) != 0)
+                                        {
+                                            KOutMsg ("Failed AES CBC 128 encrypt #%u\n", index);
+                                            ++num_errors;
+                                        }
+                                        if (memcmp (AES_CBC_128_cipher[index], etemp, sizeof etemp) != 0)
+                                        {
+                                            KOutMsg ("Failed AES CBC 128 decrypt test #%u\n", index);
+                                            ++num_errors;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }           
+
+            /* AES CBC 192 */
+            KOutMsg ("AES CBC 192\n");
+            rc = KCipherSetEncryptKey (cipher, AES_CBC_192_key, sizeof AES_CBC_192_key);
+            if (rc == 0)
+            {
+                rc = KCipherSetDecryptKey (cipher, AES_CBC_192_key, sizeof AES_CBC_192_key);
+                if (rc == 0)
+                {
+                    rc = KCipherSetEncryptIVec (cipher, AES_CBC_128_ivec);
+                    if (rc == 0)
+                    {
+                        rc = KCipherSetDecryptIVec (cipher, AES_CBC_128_ivec);
+                        if (rc == 0)
+                        {
+                            unsigned int index;
+
+                            for (index = 0; index < (sizeof AES_CBC_192_test / sizeof AES_CBC_192_test[0]); ++index)
+                            {
+                                uint8_t etemp [16];
+                                uint8_t dtemp [16];
+
+                                rc = KCipherEncryptCBC (cipher, AES_CBC_192_test[index], etemp, sizeof AES_CBC_192_test[0] / sizeof etemp );
+                                if (rc == 0)
+                                {
+                                    rc = KCipherDecryptCBC (cipher, AES_CBC_192_cipher[index], dtemp, sizeof AES_CBC_192_cipher[0] / sizeof dtemp);
+                                    if (rc == 0)
+                                    {
+                                        if (memcmp (AES_CBC_192_test[index], dtemp, sizeof dtemp) != 0)
+                                        {
+                                            KOutMsg ("Failed AES CBC 192 encrypt #%u\n", index);
+                                            ++num_errors;
+                                        }
+                                        if (memcmp (AES_CBC_192_cipher[index], etemp, sizeof etemp) != 0)
+                                        {
+                                            KOutMsg ("Failed AES CBC 192 decrypt test #%u\n", index);
+                                            ++num_errors;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }           
+
+            /* AES CBC 256 */
+            KOutMsg ("AES CBC 256\n");
+            rc = KCipherSetEncryptKey (cipher, AES_CBC_256_key, sizeof AES_CBC_256_key);
+            if (rc == 0)
+            {
+                rc = KCipherSetDecryptKey (cipher, AES_CBC_256_key, sizeof AES_CBC_256_key);
+                if (rc == 0)
+                {
+                    rc = KCipherSetEncryptIVec (cipher, AES_CBC_256_ivec);
+                    if (rc == 0)
+                    {
+                        rc = KCipherSetDecryptIVec (cipher, AES_CBC_256_ivec);
+                        if (rc == 0)
+                        {
+                            unsigned int index;
+
+                            for (index = 0; index < (sizeof AES_CBC_256_test / sizeof AES_CBC_256_test[0]); ++index)
+                            {
+                                uint8_t etemp [16];
+                                uint8_t dtemp [16];
+
+                                rc = KCipherEncryptCBC (cipher, AES_CBC_256_test[index], etemp, sizeof AES_CBC_256_test[0] / sizeof etemp);
+                                if (rc == 0)
+                                {
+                                    rc = KCipherDecryptCBC (cipher, AES_CBC_256_cipher[index], dtemp, sizeof AES_CBC_256_cipher[0] / sizeof dtemp);
+                                    if (rc == 0)
+                                    {
+                                        if (memcmp (AES_CBC_256_test[index], dtemp, sizeof dtemp) != 0)
+                                        {
+                                            KOutMsg ("Failed AES CBC 256 encrypt #%u\n", index);
+                                            ++num_errors;
+                                        }
+                                        if (memcmp (AES_CBC_256_cipher[index], etemp, sizeof etemp) != 0)
+                                        {
+                                            KOutMsg ("Failed AES CBC 256 decrypt test #%u\n", index);
+                                            ++num_errors;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }           
+
+            KCipherRelease (cipher);
+        }
+        KCipherManagerRelease (manager);
+    }
+    return rc;
+}
+
+
+rc_t CC UsageSummary  (const char * progname)
+{
+    return KOutMsg ("\n"
+                    "Usage:\n"
+                    "  %s [OPTIONS]\n"
+                    "\n"
+                    "Summary:\n"
+                    "  Test the KXTocDir type.\n",
+                    progname);
+}
+const char UsageDefaultName[] = "test-modes";
+rc_t CC Usage (const Args * args)
+{
+    return 0;
+}
+/* { */
+/*     const char * progname = UsageDefaultName; */
+/*     const char * fullpath = UsageDefaultName; */
+/*     rc_t rc = 0; */
+
+/*     rc = ArgsProgram (args, &fullpath, &progname); */
+/*     if (rc == 0) */
+/*     { */
+/*         assert (args); */
+/*         summary (UsageDefaultName); */
+/*         HelpOptionsStandard (); */
+/*     } */
+/*     return rc; */
+/* } */
+
+/* MINIUSAGE(def_name) */
+
+
+ver_t CC KAppVersion (void)
+{
+    return 0;
+}
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args * args;
+    rc_t rc;
+
+    rc = ArgsMakeAndHandle (&args, argc, argv, 0);
+    if (rc == 0)
+    {
+        rc = run();
+        ArgsRelease (args);
+    }
+
+    if (rc == 0 && num_errors != 0)
+    {
+        rc = RC(rcKrypto, rcBuffer, rcValidating, rcEncryption, rcIncorrect);
+    }
+    
+    if (rc)
+        LOGERR (klogErr, rc, "Exiting status");
+    else
+        STSMSG (0, ("Exiting okay\n"));
+
+    return rc;
+}
+
+
diff --git a/test/krypto/test-reenc.cpp b/test/krypto/test-reenc.cpp
new file mode 100644
index 0000000..8fac678
--- /dev/null
+++ b/test/krypto/test-reenc.cpp
@@ -0,0 +1,376 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/**
+ * Unit tests for KReencTestSuite
+ */
+
+#include <ktst/unit_test.hpp>
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+#include <krypto/encfile-priv.h>
+#include <krypto/reencfile.h>
+#include <kfs/impl.h>
+#include <klib/rc.h>
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+#include "test-cmn.hpp"
+
+#include <string.h>
+#include <stdio.h>
+
+TEST_SUITE(KReencTestSuite);
+
+TEST_CASE(KReEncryptEncFile)
+{
+    const char pw1 [] = "first pw";
+    const char pw2 [] = "second pw";
+    KKey key_enc, key_reenc;
+    REQUIRE_RC (KKeyInitUpdate (&key_enc, kkeyAES128, pw1, strlen (pw1)));
+    REQUIRE_RC (KKeyInitUpdate (&key_reenc, kkeyAES256, pw2, strlen (pw2)));
+    
+    const char enc_file_path_fmt [] = TMP_FOLDER "/file_enc%llu";
+
+    const char reenc_file_path_fmt [] = TMP_FOLDER "/file_reenc%llu";
+
+    KFile * enc_file, * reenc_file, * reenc_pt_file, * enc_pt_file;
+    
+    uint64_t enc_pt_size, reenc_size;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    uint64_t file_sizes_n_32k[] = { 0, 1, 2, 10, 46, 51 };
+    int8_t file_size_variants[] = { -2, -1, 0, 1, 2 };
+    
+    const uint8_t* file_fillers[] = { (const uint8_t *)"\3\5\1\7" };
+    size_t file_fillers_sizes[] = { 4 };
+    
+    assert( sizeof file_fillers / sizeof file_fillers[0] == sizeof file_fillers_sizes / sizeof file_fillers_sizes[0] );
+    
+    for (size_t filler_index = 0; filler_index < sizeof file_fillers / sizeof file_fillers[0]; ++filler_index )
+    {
+        printf("filler pattern: ");
+        for (size_t i = 0; i < file_fillers_sizes[filler_index]; ++i)
+        {
+            printf("0x%X ", file_fillers[filler_index][i]);
+        }
+        printf("\n");
+        for (size_t i = 0; i < sizeof file_sizes_n_32k / sizeof file_sizes_n_32k[0]; ++i)
+        {
+            for (size_t j = 0; j < sizeof file_size_variants / sizeof file_size_variants[0]; ++j)
+            {
+                if (file_sizes_n_32k[i] == 0 && file_size_variants[j] <= 0)
+                {
+                    continue;
+                }
+                
+                uint64_t file_size = file_sizes_n_32k[i] * BLOCK_32K_SIZE + file_size_variants[j];
+                
+                char file_path[1024];
+                char file_path_reenc[1024];
+                
+                sprintf(file_path, enc_file_path_fmt, file_size);
+                sprintf(file_path_reenc, reenc_file_path_fmt, file_size);
+                
+                printf("reencrypting encrypted file %s, size: %llu, i: %zu, j: %zu\n", file_path, file_size, i, j);
+    
+                // create file
+                REQUIRE_RC ( TCreateEncFile( current_dir, file_path, TFileOpenMode_Write, &key_enc, &enc_file ) );
+                REQUIRE_RC ( TFillFile( enc_file, file_fillers[filler_index], file_fillers_sizes[filler_index], file_size ) );
+                REQUIRE_RC ( KFileRelease ( enc_file ) );
+                
+                REQUIRE_RC ( TOpenPtFile( current_dir, file_path, TFileOpenMode_Read, &enc_pt_file ) );
+                REQUIRE_RC ( KReencFileMakeRead( (const KFile **)&reenc_file, (const KFile *)enc_pt_file, &key_enc, &key_reenc ) );
+                
+                REQUIRE_RC ( KFileSize ( enc_pt_file, &enc_pt_size ) );
+                REQUIRE_RC ( KFileSize ( reenc_file, &reenc_size ) );
+                
+                REQUIRE ( reenc_size == enc_pt_size ) ;
+                
+                REQUIRE_RC ( TCreatePtFile( current_dir, file_path_reenc, TFileOpenMode_Write, &reenc_pt_file ) );
+                REQUIRE_RC ( TCopyFile( reenc_pt_file, reenc_file ) );
+                
+                REQUIRE_RC ( KFileRelease ( reenc_pt_file ) );
+                REQUIRE_RC ( KFileRelease ( reenc_file ) );
+                REQUIRE_RC ( KFileRelease ( enc_pt_file ) );
+                
+                REQUIRE_RC ( TOpenPtFile( current_dir, file_path_reenc, TFileOpenMode_Read, &reenc_pt_file ) );
+                REQUIRE_RC ( KEncFileValidate( reenc_pt_file ) );
+                REQUIRE_RC ( KFileRelease ( reenc_pt_file ) );
+                
+                // check file content
+                REQUIRE_RC ( TOpenEncFile( current_dir, file_path_reenc, TFileOpenMode_Read, &key_reenc, &reenc_file ) );
+                
+                REQUIRE_RC ( TCheckFileContent( reenc_file, file_fillers[filler_index], file_fillers_sizes[filler_index] ) );
+                
+                REQUIRE_RC ( KFileRelease ( reenc_file ) );
+                
+            }
+        }
+    }
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KReEncryptPtFile)
+{
+    const char pw2 [] = "second pw";
+    KKey key_reenc;
+    REQUIRE_RC (KKeyInitUpdate (&key_reenc, kkeyAES256, pw2, strlen (pw2)));
+    
+    const char file_path_fmt [] = TMP_FOLDER "/file%llu";
+
+    const char reenc_file_path_fmt [] = TMP_FOLDER "/file_reenc%llu";
+
+    KFile * pt_file, *reenc_file, * reenc_pt_file;
+    
+    uint64_t pt_size, reenc_size;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    uint64_t file_sizes_n_32k[] = { 0, 1, 2, 10, 46, 51 };
+    int8_t file_size_variants[] = { -2, -1, 0, 1, 2 };
+    
+    const uint8_t* file_fillers[] = { (const uint8_t *)"\1\5\3\7" };
+    size_t file_fillers_sizes[] = { 4 };
+    
+    assert( sizeof file_fillers / sizeof file_fillers[0] == sizeof file_fillers_sizes / sizeof file_fillers_sizes[0] );
+    
+    for (size_t filler_index = 0; filler_index < sizeof file_fillers / sizeof file_fillers[0]; ++filler_index )
+    {
+        printf("filler pattern: ");
+        for (size_t i = 0; i < file_fillers_sizes[filler_index]; ++i)
+        {
+            printf("0x%X ", file_fillers[filler_index][i]);
+        }
+        printf("\n");
+        for (size_t i = 0; i < sizeof file_sizes_n_32k / sizeof file_sizes_n_32k[0]; ++i)
+        {
+            for (size_t j = 0; j < sizeof file_size_variants / sizeof file_size_variants[0]; ++j)
+            {
+                if (file_sizes_n_32k[i] == 0 && file_size_variants[j] <= 0)
+                {
+                    continue;
+                }
+                
+                uint64_t file_size = file_sizes_n_32k[i] * BLOCK_32K_SIZE + file_size_variants[j];
+                
+                char file_path[1024];
+                char file_path_reenc[1024];
+                
+                sprintf(file_path, file_path_fmt, file_size);
+                sprintf(file_path_reenc, reenc_file_path_fmt, file_size);
+                
+                printf("reencrypting NOT encrypted file %s, size: %llu, i: %zu, j: %zu\n", file_path, file_size, i, j);
+                
+                // create file
+                REQUIRE_RC ( TCreatePtFile( current_dir, file_path, TFileOpenMode_Write, &pt_file ) );
+                REQUIRE_RC ( TFillFile( pt_file, file_fillers[filler_index], file_fillers_sizes[filler_index], file_size ) );
+                REQUIRE_RC ( KFileRelease ( pt_file ) );
+                
+                REQUIRE_RC ( TOpenPtFile( current_dir, file_path, TFileOpenMode_Read, &pt_file ) );
+                REQUIRE_RC ( KEncryptFileMakeRead( (const KFile **)&reenc_file, (const KFile *)pt_file, &key_reenc ) );
+                
+                REQUIRE_RC ( KFileSize ( pt_file, &pt_size ) );
+                REQUIRE_RC ( KFileSize ( reenc_file, &reenc_size ) );
+                
+                REQUIRE ( file_size == pt_size );
+                REQUIRE ( reenc_size == TEncSizeFromPtSize(pt_size) );
+                
+                REQUIRE_RC ( TCreatePtFile( current_dir, file_path_reenc, TFileOpenMode_Write, &reenc_pt_file ) );
+                REQUIRE_RC ( TCopyFile( reenc_pt_file, reenc_file ) );
+                
+                REQUIRE_RC ( KFileRelease ( reenc_pt_file ) );
+                REQUIRE_RC ( KFileRelease ( reenc_file ) );
+                REQUIRE_RC ( KFileRelease ( pt_file ) );
+                
+                // check file content
+                REQUIRE_RC ( TOpenEncFile( current_dir, file_path_reenc, TFileOpenMode_Read, &key_reenc, &reenc_file ) );
+                
+                REQUIRE_RC ( TCheckFileContent( reenc_file, file_fillers[filler_index], file_fillers_sizes[filler_index] ) );
+                
+                REQUIRE_RC ( KFileRelease ( reenc_file ) );
+                
+            }
+        }
+    }
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KReencryptZeroContentSizeEncFile)
+{
+    const char pw1 [] = "first pw";
+    const char pw2 [] = "second pw";
+    KKey key_enc, key_reenc;
+    REQUIRE_RC (KKeyInitUpdate (&key_enc, kkeyAES128, pw1, strlen (pw1)));
+    REQUIRE_RC (KKeyInitUpdate (&key_reenc, kkeyAES256, pw2, strlen (pw2)));
+    
+    const char enc_file_path [] = TMP_FOLDER "/zero_content_file_to_reenc";
+
+    const char reenc_file_path [] = TMP_FOLDER "/reenc_zero_content_file";
+
+    KFile * enc_file, * enc_pt_file, * reenc_file, * reenc_pt_file;
+    
+    uint64_t enc_pt_size, reenc_size;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    // create file
+    REQUIRE_RC ( TCreateEncFile( current_dir, enc_file_path, TFileOpenMode_Write, &key_enc, &enc_file ) );
+    REQUIRE_RC ( KFileRelease ( enc_file ) );
+    
+    REQUIRE_RC ( TOpenPtFile( current_dir, enc_file_path, TFileOpenMode_Read, &enc_pt_file ) );
+    REQUIRE_RC ( KReencFileMakeRead( (const KFile **)&reenc_file, (const KFile *)enc_pt_file, &key_enc, &key_reenc ) );
+    
+    REQUIRE_RC ( KFileSize ( enc_pt_file, &enc_pt_size ) );
+    REQUIRE_RC ( KFileSize ( reenc_file, &reenc_size ) );
+    
+    REQUIRE ( reenc_size == enc_pt_size ) ;
+    
+    REQUIRE_RC ( TCreatePtFile( current_dir, reenc_file_path, TFileOpenMode_Write, &reenc_pt_file ) );
+    REQUIRE_RC ( TCopyFile( reenc_pt_file, reenc_file ) );
+    
+    REQUIRE_RC ( KFileRelease ( reenc_pt_file ) );
+    REQUIRE_RC ( KFileRelease ( reenc_file ) );
+    REQUIRE_RC ( KFileRelease ( enc_pt_file ) );
+    
+    REQUIRE_RC ( TOpenPtFile( current_dir, reenc_file_path, TFileOpenMode_Read, &reenc_pt_file ) );
+    REQUIRE_RC ( KEncFileValidate( reenc_pt_file ) );
+    REQUIRE_RC ( KFileRelease ( reenc_pt_file ) );
+    
+    // check file content
+    REQUIRE_RC ( TOpenEncFile( current_dir, reenc_file_path, TFileOpenMode_Read, &key_reenc, &reenc_file ) );
+    REQUIRE_RC ( KFileSize ( reenc_file, &reenc_size ) );
+    REQUIRE ( reenc_size == 0 );
+    REQUIRE_RC ( KFileRelease ( reenc_file ) );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+TEST_CASE(KReencryptZeroContentSizePtFile)
+{
+    const char pw2 [] = "second pw";
+    KKey key_reenc;
+    REQUIRE_RC (KKeyInitUpdate (&key_reenc, kkeyAES256, pw2, strlen (pw2)));
+    
+    const char pt_file_path [] = TMP_FOLDER "/zero_content_file_to_reenc_pt";
+
+    const char reenc_file_path [] = TMP_FOLDER "/reenc_zero_content_file_pt";
+
+    KFile * pt_file, * reenc_file, * reenc_pt_file;
+    
+    uint64_t pt_size, reenc_size;
+    
+    struct KDirectory * current_dir;
+    REQUIRE_RC ( KDirectoryNativeDir ( &current_dir ) );
+    
+    // just in case if it still there
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    // create file
+    REQUIRE_RC ( TCreatePtFile( current_dir, pt_file_path, TFileOpenMode_Write, &pt_file ) );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    REQUIRE_RC ( TOpenPtFile( current_dir, pt_file_path, TFileOpenMode_Read, &pt_file ) );
+    REQUIRE_RC ( KEncryptFileMakeRead( (const KFile **)&reenc_file, (const KFile *)pt_file, &key_reenc ) );
+    
+    REQUIRE_RC ( KFileSize ( pt_file, &pt_size ) );
+    REQUIRE_RC ( KFileSize ( reenc_file, &reenc_size ) );
+    
+    REQUIRE ( reenc_size == pt_size + sizeof(KEncFileHeader) + sizeof(KEncFileFooter) ) ;
+    
+    REQUIRE_RC ( TCreatePtFile( current_dir, reenc_file_path, TFileOpenMode_Write, &reenc_pt_file ) );
+    REQUIRE_RC ( TCopyFile( reenc_pt_file, reenc_file ) );
+    
+    REQUIRE_RC ( KFileRelease ( reenc_pt_file ) );
+    REQUIRE_RC ( KFileRelease ( reenc_file ) );
+    REQUIRE_RC ( KFileRelease ( pt_file ) );
+    
+    REQUIRE_RC ( TOpenPtFile( current_dir, reenc_file_path, TFileOpenMode_Read, &reenc_pt_file ) );
+    REQUIRE_RC ( KEncFileValidate( reenc_pt_file ) );
+    REQUIRE_RC ( KFileRelease ( reenc_pt_file ) );
+    
+    // check file content
+    REQUIRE_RC ( TOpenEncFile( current_dir, reenc_file_path, TFileOpenMode_Read, &key_reenc, &reenc_file ) );
+    REQUIRE_RC ( KFileSize ( reenc_file, &reenc_size ) );
+    REQUIRE ( reenc_size == 0 );
+    REQUIRE_RC ( KFileRelease ( reenc_file ) );
+    
+    KDirectoryRemove ( current_dir, true, TMP_FOLDER );
+    
+    REQUIRE_RC ( KDirectoryRelease ( current_dir ) );
+}
+
+//////////////////////////////////////////// Main
+
+extern "C"
+{
+    
+    ver_t CC KAppVersion ( void )
+    {
+        return 0x1000000;
+    }
+    
+    rc_t CC UsageSummary (const char * prog_name)
+    {
+        return 0;
+    }
+    
+    rc_t CC Usage ( const Args * args)
+    {
+        return 0;
+    }
+    
+    const char UsageDefaultName[] = "test-reenc";
+    
+    rc_t CC KMain ( int argc, char *argv [] )
+    {
+        KConfigDisableUserSettings();
+        rc_t rc=KReencTestSuite(argc, argv);
+        return rc;
+    }
+    
+}
\ No newline at end of file
diff --git a/test/ktst/Makefile b/test/ktst/Makefile
new file mode 100644
index 0000000..793fb88
--- /dev/null
+++ b/test/ktst/Makefile
@@ -0,0 +1,60 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/ktst
+
+TEST_TOOLS = \
+	test-ktst
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# test-ktst
+#
+TEST_KFG_SRC = \
+	ktsttest 
+
+TEST_KFG_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_KFG_SRC))
+
+TEST_KFG_LIB = \
+	-skapp \
+    -sncbi-vdb \
+    -sktst
+
+
+$(TEST_BINDIR)/test-ktst: $(TEST_KFG_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_KFG_LIB)
+
diff --git a/test/ktst/ktsttest.cpp b/test/ktst/ktsttest.cpp
new file mode 100644
index 0000000..fdb9240
--- /dev/null
+++ b/test/ktst/ktsttest.cpp
@@ -0,0 +1,186 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for Ktst interface
+*/
+
+#include <ktst/unit_test.hpp>
+
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+#include <kapp/args.h>
+#endif
+
+#include <csignal>
+
+using namespace std;
+using namespace ncbi::NK;
+
+static rc_t argsHandler(int argc, char* argv[]);
+TEST_SUITE_WITH_ARGS_HANDLER(KtstTestSuite, argsHandler);
+
+static
+rc_t 
+RcSuccess()
+{
+    return 0;
+}
+static
+rc_t 
+RcFail()
+{
+    return 1;
+}
+
+TEST_CASE(Parameter)
+{
+#if ALLOW_TESTING_CODE_TO_RELY_UPON_CODE_BEING_TESTED
+    uint32_t count=1;
+    REQUIRE_RC(ArgsParamCount(TestEnv::GetArgs(), &count));
+    REQUIRE_EQ(count, 0u);
+#endif
+}
+
+TEST_CASE(Requires)
+{
+    REQUIRE(1);
+    CHECK(1);
+
+    CHECK_CLOSE(1.0, 2.0, 1.99);
+    REQUIRE_CLOSE(1.0, -1.0, 2.01);
+
+    CHECK_EQUAL(1, 1);    
+    CHECK_EQ(2.0, 2.0);
+    REQUIRE_EQUAL(-1, -1);
+    REQUIRE_EQ(-11.0f, -11.0f);
+    REQUIRE_NE((const char*)"qq", (const char*)1);
+
+    CHECK_NE(2.0, 2.01);
+    REQUIRE_NE(-1.f, -1.1f);
+
+    CHECK_GE(1, 1);
+    REQUIRE_GE(1, -1);
+
+    CHECK_GT(1, 0);
+    REQUIRE_GT(1, -1);
+
+    CHECK_LE(1, 10);
+    REQUIRE_LE(-1, -1);
+
+    CHECK_LT(1.0f, 2.0f);
+    REQUIRE_LT(-111.0f, 2.0f);
+
+    CHECK_RC(RcSuccess());
+    REQUIRE_RC(RcSuccess());
+
+    CHECK_RC_FAIL(RcFail());
+    REQUIRE_RC_FAIL(RcFail());
+
+    CHECK_NULL((int*)0);
+    REQUIRE_NULL((char*)0);
+
+    CHECK_NOT_NULL((float*)1);
+    REQUIRE_NOT_NULL((double*)10);
+}
+
+TEST_CASE(ParentProcess)
+{
+	REQUIRE(!TestEnv::in_child_process);
+}
+PROCESS_TEST_CASE(ChildProcessOk, 0, 0)
+{
+	REQUIRE(TestEnv::in_child_process);
+    TEST_MESSAGE("ChildProcessOk: no failures in a child process");
+    REQUIRE_EQ(0, 0); // make sure REQUIRE* macros are working
+    // just exit without errors
+}
+
+PROCESS_TEST_CASE(ChildProcessFail, TestEnv::TEST_CASE_FAILED, 0)
+{
+    FAIL("ChildProcessFail: failure in a child process");
+    // exit(255) means test case threw a C++ exception
+}
+
+PROCESS_TEST_CASE(ChildProcessAbort, SIGFPE, 0)
+{
+    TEST_MESSAGE("ChildProcessAbort: aborting child process");
+    raise(SIGFPE);
+}
+
+PROCESS_TEST_CASE(ChildProcessTimeout, TestEnv::TEST_CASE_TIMED_OUT, 1)
+{   
+    TEST_MESSAGE("ChildProcessTimeout: sleeping in the child process");
+    TestEnv::Sleep(2);
+    TEST_MESSAGE("ChildProcessTimeout: did not time out!!");
+    raise(SIGSEGV);
+}
+
+static bool argHandlerCalled = false;
+static rc_t argsHandler(int argc, char* argv[]) 
+{
+    argHandlerCalled = true;
+    return 0;
+}
+
+TEST_CASE(ArgHandlerCalled)
+{
+    REQUIRE(argHandlerCalled);
+}
+
+//TODO: test FIXTURE_TEST_CASE, PROCESS_FIXTURE_TEST_CASE
+//TODO: test GET_GLOBAL_FIXTURE
+//TODO: test REQUIRE_THROW, THROW_ON_RC
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+
+const char UsageDefaultName[] = "test-kfg";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t rc=KtstTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/loader/Makefile b/test/loader/Makefile
new file mode 100644
index 0000000..ddf3b7e
--- /dev/null
+++ b/test/loader/Makefile
@@ -0,0 +1,58 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+MODULE = test/loader
+
+TEST_TOOLS = \
+	test-loader \
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+clean: stdclean
+#-------------------------------------------------------------------------------
+# test-loader
+#
+TEST_LOADER_SRC = \
+	loadertest \
+	sequence-writer
+
+TEST_LOADER_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_LOADER_SRC))
+
+TEST_LOADER_LIB = \
+	-skapp \
+    -sktst \
+    -sncbi-wvdb \
+    -sload \
+
+$(TEST_BINDIR)/test-loader: $(TEST_LOADER_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_LOADER_LIB)
+
diff --git a/test/loader/loadertest.cpp b/test/loader/loadertest.cpp
new file mode 100644
index 0000000..2fe1f42
--- /dev/null
+++ b/test/loader/loadertest.cpp
@@ -0,0 +1,407 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for the Loader module
+*/
+#include <ktst/unit_test.hpp>
+
+#include <klib/printf.h>
+
+#include <kdb/meta.h>
+
+#include <kapp/loader-meta.h>
+#include <kapp/main.h>
+
+#include <vdb/manager.h> // VDBManager
+#include <vdb/database.h> 
+#include <vdb/schema.h> /* VSchemaRelease */
+
+#include <stdexcept> 
+#include <fstream>
+
+extern "C" {
+#include <loader/sequence-writer.h>
+}
+
+using namespace std;
+
+TEST_SUITE(LoaderTestSuite);
+
+class LoaderFixture
+{
+public:
+    LoaderFixture()
+    :   m_db ( 0 ),
+        m_cursor ( 0 ),
+        m_keepDatabase ( false )
+    {
+    }
+    ~LoaderFixture()
+    {
+        RemoveDatabase();
+    }
+    
+    void RemoveDatabase()
+    {
+        CloseDatabase();
+        if ( ! m_databaseName . empty () && ! m_keepDatabase )
+        {
+            KDirectory* wd;
+            KDirectoryNativeDir ( & wd );
+            KDirectoryRemove ( wd, true, m_databaseName . c_str() );
+            KDirectoryRelease ( wd );
+        }
+    }
+    
+    void OpenDatabase()
+    {
+        CloseDatabase();
+        
+        VDBManager * vdb;
+        THROW_ON_RC ( VDBManagerMakeUpdate ( & vdb, NULL ) );
+        THROW_ON_RC ( VDBManagerOpenDBUpdate ( vdb, &m_db, NULL, m_databaseName . c_str() ) );
+        THROW_ON_RC( VDBManagerRelease ( vdb ) );
+    }
+    
+    void InitDatabase ( const char * schemaFile, const char * schemaSpec )
+    {
+        RemoveDatabase();
+        
+        VDBManager* mgr;
+        THROW_ON_RC ( VDBManagerMakeUpdate ( & mgr, NULL ) );
+        VSchema* schema;
+        THROW_ON_RC ( VDBManagerMakeSchema ( mgr, & schema ) );
+        THROW_ON_RC ( VSchemaParseFile(schema, "%s", schemaFile ) );
+        
+        THROW_ON_RC ( VDBManagerCreateDB ( mgr, 
+                                          & m_db, 
+                                          schema, 
+                                          schemaSpec, 
+                                          kcmInit + kcmMD5, 
+                                          "%s", 
+                                          m_databaseName . c_str() ) );
+                                          
+        THROW_ON_RC ( VSchemaRelease ( schema ) );
+        THROW_ON_RC ( VDBManagerRelease ( mgr ) );
+    }
+    
+    void CloseDatabase()
+    {
+        if ( m_db != 0 )
+        {
+            VDatabaseRelease ( m_db );
+            m_db = 0;
+        }
+        if ( m_cursor != 0 )
+        {
+            VCursorRelease ( m_cursor );
+            m_cursor = 0;
+        }
+    }
+    
+    void OpenCursor( const char* p_table, const char* p_column )
+    {
+        OpenDatabase();
+        const VTable * tbl;
+        THROW_ON_RC ( VDatabaseOpenTableRead ( m_db, &tbl, p_table ) );
+        THROW_ON_RC ( VTableCreateCursorRead ( tbl, & m_cursor ) );
+        
+        uint32_t idx;
+        THROW_ON_RC ( VCursorAddColumn ( m_cursor, &idx, p_column ) );
+        THROW_ON_RC ( VCursorOpen ( m_cursor ) );
+        THROW_ON_RC ( VTableRelease ( tbl ) );
+    }
+    
+    template < typename T > T GetValue ( const char* p_table, const char* p_column, uint64_t p_row )
+    {
+        OpenCursor( p_table, p_column ); 
+        THROW_ON_RC ( VCursorSetRowId ( m_cursor, p_row ) );
+        THROW_ON_RC ( VCursorOpenRow ( m_cursor ) );
+            
+        T ret;
+        uint32_t num_read;
+        THROW_ON_RC ( VCursorRead ( m_cursor, 1, 8 * sizeof ret, &ret, 1, &num_read ) );
+        THROW_ON_RC ( VCursorCloseRow ( m_cursor ) );
+        return ret;
+    }
+    
+    template < typename T, int Count > bool GetValue ( const char* p_table, const char* p_column, uint64_t p_row, T ret[Count] )
+    {
+        OpenCursor( p_table, p_column ); 
+        THROW_ON_RC ( VCursorSetRowId ( m_cursor, p_row ) );
+        THROW_ON_RC ( VCursorOpenRow ( m_cursor ) );
+            
+        uint32_t num_read;
+        THROW_ON_RC ( VCursorRead ( m_cursor, 1, 8 * sizeof ( T ), ret, Count, &num_read ) );
+        if ( num_read != Count )
+            throw logic_error("LoaderFixture::GetValueU32(): VCursorRead failed");
+        
+        THROW_ON_RC ( VCursorCloseRow ( m_cursor ) );
+        return ret;
+    }
+    
+    std::string GetMetadata ( const std::string& p_node, const std::string& p_attr )
+    {
+        const KMetadata *meta;
+        THROW_ON_RC ( VDatabaseOpenMetadataRead ( m_db, &meta ) );
+    
+        const KMDataNode *node;
+        THROW_ON_RC ( KMetadataOpenNodeRead ( meta, &node, p_node.c_str() ) );
+            
+        size_t num_read;
+        char attr [ 256 ];
+        THROW_ON_RC ( KMDataNodeReadAttr ( node, p_attr.c_str(), attr, sizeof attr, & num_read ) );
+        THROW_ON_RC ( KMDataNodeRelease ( node ) );
+        THROW_ON_RC ( KMetadataRelease ( meta ) );
+        return string ( attr, num_read );
+    }
+    
+    void CreateFile ( const string& p_name, const string& p_content )
+    {
+        ofstream out( p_name . c_str() );
+        out << p_content;
+    }
+    
+    
+    string          m_databaseName;
+    VDatabase *     m_db;
+    const VCursor * m_cursor;
+    bool            m_keepDatabase;
+};    
+
+template<> std::string LoaderFixture::GetValue ( const char* p_table, const char* p_column, uint64_t p_row )
+{
+    OpenCursor( p_table, p_column ); 
+    THROW_ON_RC ( VCursorSetRowId ( m_cursor, p_row ) );
+    THROW_ON_RC ( VCursorOpenRow ( m_cursor ) );
+        
+    char buf[1024];
+    uint32_t num_read;
+    THROW_ON_RC ( VCursorRead ( m_cursor, 1, 8, &buf, sizeof buf, &num_read ) );
+    THROW_ON_RC ( VCursorCloseRow ( m_cursor ) );
+    return string ( buf, num_read );
+}
+
+#if SHOW_UNIMPLEMENTED
+FIXTURE_TEST_CASE ( SequenceWriter_Write, LoaderFixture ) 
+{
+    m_databaseName = GetName();
+    InitDatabase ( "./sequencewriter.vschema", "NCBI:align:db:fastq";);
+    
+    const string Sequence = "AC";
+    const string SpotName = "name1";
+    const string SpotGroup = "spotgroup1";
+    const uint8_t qual[2] = {10,20};
+//m_keepDatabase = true;
+
+    {
+        SequenceWriter wr;
+        
+        REQUIRE_NOT_NULL ( SequenceWriterInit ( & wr, m_db ) );
+
+        uint32_t readStart = 0;
+        uint32_t readLen = Sequence . size();
+        uint8_t orientation = 0;
+        uint8_t is_bad = 0;
+        uint8_t alignmentCount = 0;
+        bool aligned = false;
+        uint64_t ti = 0;
+        
+        SequenceRecord rec;
+        rec . seq = (char*) Sequence . c_str ();
+        rec . qual = (uint8_t*) qual;
+        rec . readStart = & readStart;
+        rec . readLen = & readLen;
+        rec . orientation = & orientation;
+        rec . is_bad = & is_bad;
+        rec . alignmentCount = & alignmentCount;
+        rec . spotGroup = (char*) SpotGroup . c_str();
+        rec . aligned = & aligned;
+        rec . cskey = (char*)"";
+        rec . ti = & ti;
+        rec . spotName = (char*) SpotName . c_str();
+        rec . keyId = 1;
+        rec . spotGroupLen = SpotGroup . size();;
+        rec . spotNameLen = SpotName . size();
+        rec . numreads = 1;
+
+        REQUIRE_RC ( KDataBufferMake ( & rec.storage, 8, 0 ) );
+        
+        REQUIRE_RC ( SequenceWriteRecord ( & wr, 
+                                           & rec,
+                                           false, 
+                                           false, 
+                                           SRA_PLATFORM_454,
+                                           false,
+                                           false,
+                                           false,
+                                           "0",
+                                           false,
+                                           true
+                                          ) );
+        REQUIRE_RC ( SequenceDoneWriting ( & wr ) );
+        SequenceWhack ( & wr, true );
+        REQUIRE_RC ( SequenceRecordWhack ( & rec ) );
+    
+        CloseDatabase();
+    }
+    
+    // read, validate
+    REQUIRE_EQ ( Sequence, GetValue<string> ( "SEQUENCE", "CMP_READ", 1 ) );    
+    REQUIRE_EQ ( SpotName, GetValue<string> ( "SEQUENCE", "NAME", 1 ) );    
+    REQUIRE_EQ ( SpotGroup, GetValue<string> ( "SEQUENCE", "SPOT_GROUP", 1 ) );    
+    {
+        uint8_t q[2] = { 0, 0 };
+        bool req = GetValue < uint8_t, 2 > ( "SEQUENCE", "QUALITY", 1, q );
+        REQUIRE ( req );
+        REQUIRE_EQ ( (int)qual[0], (int)q[0] );
+        REQUIRE_EQ ( (int)qual[1], (int)q[1] );
+    }
+}
+#endif
+
+FIXTURE_TEST_CASE ( LoaderMeta_Write, LoaderFixture ) 
+{
+    m_databaseName = GetName();
+    
+    string schemaFile = string ( GetName() ) + ".vschema";
+    CreateFile ( schemaFile, string ( "table table1 #1.0.0 { column ascii column1; }; database database1 #1 { table table1 #1 TABLE1; } ;" ).c_str() ); 
+    InitDatabase ( schemaFile.c_str(), "database1");
+    
+    const string FormatterName = "fmt_name";
+    const string LoaderName = "test-loader";
+
+    {
+        struct KMetadata* meta;
+        REQUIRE_RC ( VDatabaseOpenMetadataUpdate ( m_db, &meta ) );
+        KMDataNode *node;
+        REQUIRE_RC ( KMetadataOpenNodeUpdate ( meta, &node, "/" ) );
+        
+        // this is the one we are testing
+        REQUIRE_RC ( KLoaderMeta_Write ( node, LoaderName.c_str(), __DATE__, FormatterName.c_str(), KAppVersion() ) );
+        
+        REQUIRE_RC ( KMDataNodeRelease ( node ) );
+        REQUIRE_RC ( KMetadataRelease ( meta ) );
+    
+        CloseDatabase();
+    }
+    
+    // read, validate
+    OpenDatabase (); 
+    REQUIRE_EQ ( FormatterName,  GetMetadata ( "SOFTWARE/formatter", "name" ) );
+
+    // extract the program name from path the same way it's done in ncbi-vdb/libs/kapp/loader-meta.c:KLoaderMeta_Write
+    REQUIRE_EQ ( LoaderName, GetMetadata ( "SOFTWARE/loader", "name" ) );
+    REQUIRE_EQ ( string ( __DATE__), GetMetadata ( "SOFTWARE/loader", "date" ) );
+    {   // the "old" KLoaderMeta_Write sets versions of loader and formatter to the same value
+        char buf[265];
+        string_printf ( buf, sizeof buf, NULL, "%V", KAppVersion() ); // same format as in ncbi-vdb/libs/kapp/loader-meta.c:MakeVersion()
+        REQUIRE_EQ ( string ( buf ), GetMetadata ( "SOFTWARE/formatter", "vers" ) );
+        REQUIRE_EQ ( string ( buf ), GetMetadata ( "SOFTWARE/loader", "vers" ) );
+    }
+    
+    std::remove ( schemaFile . c_str() );
+}
+
+FIXTURE_TEST_CASE ( LoaderMeta_WriteWithVersion, LoaderFixture ) 
+{
+    m_databaseName = GetName();
+    string schemaFile = string ( GetName() ) + ".vschema";
+    CreateFile ( schemaFile, string ( "table table1 #1.0.0 { column ascii column1; }; database database1 #1 { table table1 #1 TABLE1; } ;" ).c_str() ); 
+    InitDatabase ( schemaFile.c_str(), "database1");
+    
+    const string FormatterName = "fmt_name";
+    const string LoaderName = "test-loader";
+    const ver_t  LoaderVersion = ( 1 << 24 ) | ( 2 << 16 ) | 0x0003; 
+
+    {
+        struct KMetadata* meta;
+        REQUIRE_RC ( VDatabaseOpenMetadataUpdate ( m_db, &meta ) );
+        KMDataNode *node;
+        REQUIRE_RC ( KMetadataOpenNodeUpdate ( meta, &node, "/" ) );
+        
+        // this is the one we are testing
+        REQUIRE_RC ( KLoaderMeta_WriteWithVersion ( node, LoaderName.c_str(), __DATE__, LoaderVersion, FormatterName.c_str(), KAppVersion() ) );
+        
+        REQUIRE_RC ( KMDataNodeRelease ( node ) );
+        REQUIRE_RC ( KMetadataRelease ( meta ) );
+    
+        CloseDatabase();
+    }
+    
+    // read, validate
+    OpenDatabase (); 
+    REQUIRE_EQ ( FormatterName,  GetMetadata ( "SOFTWARE/formatter", "name" ) );
+
+    // extract the program name from path the same way it's done in ncbi-vdb/libs/kapp/loader-meta.c:KLoaderMeta_Write
+    REQUIRE_EQ ( LoaderName, GetMetadata ( "SOFTWARE/loader", "name" ) );
+    REQUIRE_EQ ( string ( __DATE__), GetMetadata ( "SOFTWARE/loader", "date" ) );
+    {   // KLoaderMeta_WriteWithVersion sets versions of loader and formatter apart
+        char buf[265];
+        string_printf ( buf, sizeof buf, NULL, "%V", KAppVersion() ); 
+        REQUIRE_EQ ( string ( buf ), GetMetadata ( "SOFTWARE/formatter", "vers" ) );
+        string_printf ( buf, sizeof buf, NULL, "%V", LoaderVersion ); 
+        REQUIRE_EQ ( string ( buf ), GetMetadata ( "SOFTWARE/loader", "vers" ) );
+    }
+    
+    std::remove ( schemaFile . c_str() );
+}
+
+//////////////////////////////////////////// Main
+#include <kapp/args.h>
+#include <klib/out.h>
+#include <kfg/config.h>
+
+extern "C"
+{
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+
+const char UsageDefaultName[] = "test-loader";
+
+rc_t CC UsageSummary (const char * progname)
+{
+    return KOutMsg ( "Usage:\n" "\t%s [options]\n\n", progname );
+}
+
+rc_t CC Usage( const Args* args )
+{
+    return 0;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=LoaderTestSuite(argc, argv);
+    return rc;
+}
+
+}
+
diff --git a/test/loader/sequence-writer.c b/test/loader/sequence-writer.c
new file mode 100644
index 0000000..a646059
--- /dev/null
+++ b/test/loader/sequence-writer.c
@@ -0,0 +1,366 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <vdb/database.h>
+
+#include <kdb/manager.h>
+
+#include <insdc/sra.h>
+#include <insdc/insdc.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include <align/writer-sequence.h>
+
+#include <loader/sequence-writer.h>
+#include <loader/common-reader.h>
+
+/* MARK: SequenceWriter Object */
+
+SequenceWriter *SequenceWriterInit(SequenceWriter *self, VDatabase *db) {
+    memset(self, 0, sizeof(*self));
+    self->db = db;
+    VDatabaseAddRef(db);
+    return self;
+}
+
+rc_t SequenceWriteRecord(SequenceWriter *self,
+                         SequenceRecord const *rec,
+                         bool color,
+                         bool isDup,
+                         INSDC_SRA_platform_id platform,
+                         bool keepMismatchQual,
+                         bool no_real_output,
+                         bool hasTI,
+                         char const *QualQuantizer
+                         )
+{
+    rc_t rc = 0;
+    uint8_t nreads = rec->numreads;
+    unsigned i;
+    unsigned seqLen;
+    int64_t dummyRowId;
+    
+    uint8_t readInfo[4096];
+    void *h_readInfo = NULL;
+    
+    INSDC_coord_zero *readStart = (void *)readInfo;
+    INSDC_coord_len *readLen;
+    uint8_t *alcnt;
+    INSDC_SRA_xread_type *readType;
+    INSDC_SRA_read_filter *readFilter;
+    bool *mask = NULL;
+    size_t const elemSize = sizeof(alcnt[0]) + sizeof(readType[0])
+                          + sizeof(readStart[0]) + sizeof(readLen[0])
+                          + sizeof(readFilter[0]);
+    
+    TableWriterSeqData data;
+
+    for (i = seqLen = 0; i != nreads; ++i) {
+        seqLen += rec->readLen[i];
+    }
+    
+    if (nreads * elemSize + keepMismatchQual * seqLen * sizeof(mask[0]) > sizeof(readInfo))
+    {
+        h_readInfo = malloc(nreads * elemSize + keepMismatchQual * seqLen * sizeof(mask[0]));
+        if (h_readInfo == NULL)
+            return RC(rcAlign, rcTable, rcWriting, rcMemory, rcExhausted);
+        readStart = h_readInfo;
+    }
+    readLen = (INSDC_coord_len *)&readStart[nreads];
+    alcnt = (uint8_t *)&readLen[nreads];
+    readType = (INSDC_SRA_xread_type *)&alcnt[nreads];
+    readFilter = (INSDC_SRA_read_filter *)&readType[nreads];
+    
+    if (keepMismatchQual) {
+        mask = (bool *)&readFilter[nreads];
+        
+        for (i = 0; i != seqLen; ++i) {
+            mask[i] = (rec->qual[i] & 0x80) != 0;
+        }
+    }
+    
+    for (i = 0; i != nreads; ++i) {
+        alcnt[i] = rec->aligned[i] ? 1 : 0;
+        readLen[i] = rec->readLen[i];
+        readStart[i] = rec->readStart[i];
+        readType[i] = readLen[i] ? SRA_READ_TYPE_BIOLOGICAL : SRA_READ_TYPE_TECHNICAL;
+        switch ( rec->orientation[i] )
+        {
+            case ReadOrientationForward:
+                readType[i] |= SRA_READ_TYPE_FORWARD;
+                break;
+            case ReadOrientationReverse:
+                readType[i] |= SRA_READ_TYPE_REVERSE;
+                break;
+            case ReadOrientationUnknown:
+            default:
+                break;
+        }
+        readFilter[i] = isDup ? SRA_READ_FILTER_CRITERIA
+                      : rec->is_bad[i] ? SRA_READ_FILTER_REJECT : SRA_READ_FILTER_PASS;
+    }
+
+    memset(&data, 0, sizeof(data));
+    
+    data.sequence.buffer = rec->seq;
+    data.sequence.elements = seqLen;
+    
+    data.quality.buffer = rec->qual;
+    data.quality.elements = seqLen;
+    
+    if (keepMismatchQual) {
+        data.no_quantize_mask.buffer = mask;
+        data.no_quantize_mask.elements = seqLen;
+    }
+    
+    data.alignment_count.buffer = alcnt;
+    data.alignment_count.elements = nreads;
+    
+    data.nreads = nreads;
+    
+    data.read_type.buffer = readType;
+    data.read_type.elements = nreads;
+    
+    data.read_start.buffer = readStart;
+    data.read_start.elements = nreads;
+    
+    data.read_len.buffer = readLen;
+    data.read_len.elements = nreads;
+    
+    data.tmp_key_id = rec->keyId;
+    
+    data.spot_group.buffer = rec->spotGroup;
+    data.spot_group.elements = rec->spotGroupLen;
+    
+    data.cskey.buffer = rec->cskey;
+    data.cskey.elements = nreads;
+    
+    data.read_filter.buffer = readFilter;
+    data.read_filter.elements = nreads;
+    
+    data.platform.buffer = &platform;
+    data.platform.elements = 1;
+    
+    data.ti.buffer = rec->ti;
+    data.ti.elements = nreads;
+    
+    data.spot_name.buffer = rec->spotName;
+    data.spot_name.elements = rec->spotNameLen;
+    
+    if (!no_real_output) {
+        if (self->tbl == NULL) {
+            int csoption = (color ? ewseq_co_ColorSpace : 0);
+
+            if(hasTI) csoption |= ewseq_co_TI;
+            
+            rc = TableWriterSeq_Make(&self->tbl, self->db,
+                                     csoption | ewseq_co_NoLabelData | ewseq_co_SpotGroup /*| ewseq_co_SpotName*/, QualQuantizer);
+        }
+        if (rc == 0) {
+            rc = TableWriterSeq_Write(self->tbl, &data, &dummyRowId);
+        }
+    }
+    
+    if (h_readInfo)
+        free(h_readInfo);
+    
+    return rc;
+}
+
+rc_t SequenceDoneWriting(SequenceWriter *self)
+{
+    return TableWriterSeq_TmpKeyStart(self->tbl);
+}
+
+rc_t SequenceReadKey(const SequenceWriter *cself, int64_t row, uint64_t *keyId)
+{
+    return TableWriterSeq_TmpKey(cself->tbl, row, keyId);
+}
+
+rc_t SequenceUpdateAlignData(SequenceWriter *self, int64_t rowId, unsigned nreads,
+                             int64_t const primeId[/* nreads */],
+                             uint8_t const algnCnt[/* nreads */])
+{
+    TableWriterData data[2];
+    
+    data[0].buffer = primeId; data[0].elements = nreads;
+    data[1].buffer = algnCnt; data[1].elements = nreads;
+    
+    return TableWriterSeq_WriteAlignmentData(self->tbl, rowId, &data[0], &data[1]);
+}
+
+void SequenceWhack(SequenceWriter *self, bool commit) {
+    uint64_t dummyRows;
+    /* rc_t rc; */
+    
+    VDatabaseRelease(self->db);
+    
+    if (self->tbl == NULL)
+        return;
+    
+    /* rc = */ TableWriterSeq_Whack(self->tbl, commit, &dummyRows);
+}
+
+/* MARK: SequenceRecord Object */
+static
+rc_t SequenceRecordResize(SequenceRecord *self,
+                          KDataBuffer *storage,
+                          unsigned numreads,
+                          unsigned seqLen)
+{
+    size_t sz;
+    rc_t rc;
+    
+    sz = seqLen * (sizeof(self->seq[0]) + sizeof(self->qual[0])) +
+         numreads * (sizeof(self->ti) +
+                     sizeof(self->readStart[0]) +
+                     sizeof(self->readLen[0]) +
+                     sizeof(self->aligned[0]) + 
+                     sizeof(self->orientation[0]) +
+                     sizeof(self->alignmentCount[0]) +
+                     sizeof(self->cskey[0])
+                     );
+    storage->elem_bits = 8;
+    rc = KDataBufferResize(storage, sz);
+    if (rc)
+        return rc;
+    self->numreads = numreads;
+    
+    self->ti = (uint64_t *)storage->base;
+    self->readStart = (uint32_t *)&self->ti[numreads];
+    self->readLen = (uint32_t *)&self->readStart[numreads];
+    self->aligned = (bool *)&self->readLen[numreads];
+    self->orientation = (uint8_t *)&self->aligned[numreads];
+    self->is_bad = (uint8_t *)&self->orientation[numreads];
+    self->alignmentCount = (uint8_t *)&self->is_bad[numreads];
+    self->cskey = (char *)&self->alignmentCount[numreads];
+    self->seq = (char *)&self->cskey[numreads];
+    self->qual = (uint8_t *)&self->seq[seqLen];
+
+    self->spotGroup = NULL;
+    self->spotGroupLen = 0;
+    self->spotName = NULL;
+    self->spotNameLen = 0;
+    
+    return 0;
+}
+
+rc_t SequenceRecordInit(SequenceRecord *self, unsigned numreads, unsigned readLen[])
+{
+    unsigned i;
+    unsigned seqlen = 0;
+    rc_t rc;
+    
+    for (i = 0; i != numreads; ++i) {
+        seqlen += readLen[i];
+    }
+    rc = SequenceRecordResize(self, &self->storage, numreads, seqlen);
+    if (rc)
+        return rc;
+    memset(self->storage.base, 0, KDataBufferBytes(&self->storage));
+    
+    for (seqlen = 0, i = 0; i != numreads; ++i) {
+        self->readLen[i] = readLen[i];
+        self->readStart[i] = seqlen;
+        seqlen += readLen[i];
+    }
+    self->numreads = numreads;
+    memset(self->cskey, 'T', numreads);
+    return 0;
+}
+
+rc_t SequenceRecordAppend(SequenceRecord *self,
+                          const SequenceRecord *other
+                          )
+{
+    /* save the locations of the original data */
+    unsigned const seq = (uint8_t const *)self->seq - (uint8_t const *)self->storage.base;
+    unsigned const qual = (uint8_t const *)self->qual - (uint8_t const *)self->storage.base;
+    unsigned const cskey = (uint8_t const *)self->cskey - (uint8_t const *)self->storage.base;
+    unsigned const alignmentCount = (uint8_t const *)self->alignmentCount - (uint8_t const *)self->storage.base;
+    unsigned const is_bad = (uint8_t const *)self->is_bad - (uint8_t const *)self->storage.base;
+    unsigned const orientation = (uint8_t const *)self->orientation - (uint8_t const *)self->storage.base;
+    unsigned const aligned = (uint8_t const *)self->aligned - (uint8_t const *)self->storage.base;
+    unsigned const ti = (uint8_t const *)self->ti - (uint8_t const *)self->storage.base;
+    unsigned const readLen = (uint8_t const *)self->readLen - (uint8_t const *)self->storage.base;
+/*    unsigned const readStart = (uint8_t const *)self->readStart - (uint8_t const *)self->storage.base;*/
+
+    rc_t rc;
+    unsigned seqlen;
+    unsigned otherSeqlen;
+    unsigned i;
+    unsigned numreads = self->numreads;
+    
+    for (seqlen = 0, i = 0; i != numreads; ++i) {
+        seqlen += self->readLen[i];
+    }
+    for (otherSeqlen = 0, i = 0; i != other->numreads; ++i) {
+        otherSeqlen += other->readLen[i];
+    }
+
+    rc = SequenceRecordResize(self, &self->storage, self->numreads + other->numreads, seqlen + otherSeqlen);
+    if (rc)
+        return rc;
+    /* this needs to be reverse order from assignment in Resize function
+     * these regions can overlap
+     */
+    memmove(self->qual,             &((uint8_t const *)self->storage.base)[qual],              seqlen);
+    memmove(self->seq,              &((uint8_t const *)self->storage.base)[seq],               seqlen);
+    memmove(self->cskey,            &((uint8_t const *)self->storage.base)[cskey],             numreads * sizeof(self->cskey[0]));
+    memmove(self->alignmentCount,   &((uint8_t const *)self->storage.base)[alignmentCount],    numreads * sizeof(self->alignmentCount[0]));
+    memmove(self->is_bad,           &((uint8_t const *)self->storage.base)[is_bad],            numreads * sizeof(self->is_bad[0]));
+    memmove(self->orientation,      &((uint8_t const *)self->storage.base)[orientation],       numreads * sizeof(self->orientation[0]));
+    memmove(self->aligned,          &((uint8_t const *)self->storage.base)[aligned],           numreads * sizeof(self->aligned[0]));
+    memmove(self->readLen,          &((uint8_t const *)self->storage.base)[readLen],           numreads * sizeof(self->readLen[0]));
+    memmove(self->ti,               &((uint8_t const *)self->storage.base)[ti],                numreads * sizeof(self->ti[0]));
+    
+    memmove(&self->ti[numreads],             other->ti,              other->numreads * sizeof(self->ti[0]));
+    memmove(&self->readLen[numreads],        other->readLen,         other->numreads * sizeof(self->readLen[0]));
+    memmove(&self->aligned[numreads],        other->aligned,         other->numreads * sizeof(self->aligned[0]));
+    memmove(&self->orientation[numreads],    other->orientation,     other->numreads * sizeof(self->orientation[0]));
+    memmove(&self->is_bad[numreads],         other->is_bad,          other->numreads * sizeof(self->is_bad[0]));
+    memmove(&self->alignmentCount[numreads], other->alignmentCount,  other->numreads * sizeof(self->alignmentCount[0]));
+    memmove(&self->cskey[numreads],          other->cskey,           other->numreads * sizeof(self->cskey[0]));
+    memmove(&self->seq[seqlen],              other->seq,             otherSeqlen);
+    memmove(&self->qual[seqlen],             other->qual,            otherSeqlen);
+    
+    for (i = 0, seqlen = 0; i != self->numreads; ++i) {
+        self->readStart[i] = seqlen;
+        seqlen += self->readLen[i];
+    }
+    
+    return 0;
+}
diff --git a/test/loader/sequencewriter.vschema b/test/loader/sequencewriter.vschema
new file mode 100755
index 0000000..350fa9c
--- /dev/null
+++ b/test/loader/sequencewriter.vschema
@@ -0,0 +1,47 @@
+include 'ncbi/sra.vschema';
+include 'align/seq.vschema';
+
+extern function
+INSDC:4na:bin NCBI:align:seq_restore_read #1 ( INSDC:4na:bin cmp_rd, I64 align_id,
+        INSDC:coord:len read_len, INSDC:SRA:xread_type rd_type )
+    = ALIGN:seq_restore_read;
+
+table NCBI:align:tbl:seq #1.0.0 =
+    NCBI:tbl:base_space #2.0.3,
+    NCBI:tbl:phred_quality #2.0.4,
+    NCBI:align:tbl:cmp_base_space #1,
+    NCBI:SRA:tbl:spotdesc #1.0.2,
+    NCBI:SRA:tbl:stats #1.2.0
+{
+    // 128K
+    column default limit = 131072;
+
+    // gets primary record in alignment table (size of column is NREADS)
+    // if sorted - should used special encoding
+    extern column <I64> izip_encoding PRIMARY_ALIGNMENT_ID;
+
+    INSDC:coord:zero trim_start = < INSDC:coord:zero > echo < 0 > ();
+    INSDC:coord:len trim_len = _spot_len;
+
+    // size is NREADS
+    extern column < U8 > zip_encoding ALIGNMENT_COUNT;
+
+    // allow NAME to be set externally. otherwise, auto-generate name from row-id
+    physical column < ascii > zip_encoding .NAME = name_in;
+    ascii name_in = NAME;
+    ascii out_name_fmt = .NAME | < ascii > echo < '$R' > ();
+
+    // temparary column
+    extern column < U64 > izip_encoding TMP_KEY_ID;
+
+    // restored  READ
+    INSDC:4na:bin out_dcmp_4na_bin
+        = NCBI:align:seq_restore_read (out_cmp_4na_bin, .PRIMARY_ALIGNMENT_ID, .READ_LEN, .READ_TYPE);
+
+    extern column < U64 > izip_encoding TI;
+};
+
+database NCBI:align:db:alignment_sorted #1.3
+{
+    table NCBI:align:tbl:seq #1.0 SEQUENCE;
+};
diff --git a/test/ngs-c++/CSRA1PileupTest.cpp b/test/ngs-c++/CSRA1PileupTest.cpp
new file mode 100644
index 0000000..60f56de
--- /dev/null
+++ b/test/ngs-c++/CSRA1PileupTest.cpp
@@ -0,0 +1,742 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS Pileup interface, CSRA1 based implementation
+*/
+
+#include <ngs/ncbi/NGS.hpp>
+
+#include <ktst/unit_test.hpp>
+
+#include <sysalloc.h>
+#include <assert.h>
+#include <memory.h> // memset
+#include <stdio.h>
+
+#include <sstream>
+
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsCsra1PileupCppTestSuite);
+
+TEST_CASE(CSRA1_PileupIterator_GetDepth)
+{
+    char const db_path[] = "SRR341578";
+
+    std::vector <uint32_t> vecDepthSlice, vecDepthEntire, vecRef;
+
+    int64_t const pos_start = 20017;
+    uint64_t const len = 5;
+
+    vecRef.push_back(1); // 20017
+    vecRef.push_back(0); // 20018
+    vecRef.push_back(1); // 20019
+    vecRef.push_back(1); // 20020
+    vecRef.push_back(3); // 20021
+
+    {
+        ngs::ReadCollection run = ncbi::NGS::openReadCollection (db_path);
+        ngs::ReferenceIterator ri = run.getReferences ();
+
+        ri.nextReference ();
+        ri.nextReference ();
+
+        ngs::PileupIterator pi = ri.getPileups ( ngs::Alignment::primaryAlignment );
+
+        uint64_t ref_pos = 0;
+        for (; pi.nextPileup (); ++ ref_pos)
+        {
+            if ( ref_pos >= (uint64_t)pos_start && ref_pos < (uint64_t)pos_start + len )
+                vecDepthEntire.push_back ( pi.getPileupDepth () );
+        }
+    }
+    {
+        ngs::ReadCollection run = ncbi::NGS::openReadCollection (db_path);
+        ngs::ReferenceIterator ri = run.getReferences ();
+
+        ri.nextReference ();
+        ri.nextReference ();
+
+        ngs::PileupIterator pi = ri.getPileupSlice ( pos_start, len, ngs::Alignment::primaryAlignment );
+
+        uint64_t ref_pos = (uint64_t)pos_start;
+        for (; pi.nextPileup (); ++ ref_pos)
+        {
+            if ( ref_pos >= (uint64_t)pos_start && ref_pos < (uint64_t)pos_start + len )
+                vecDepthSlice.push_back ( pi.getPileupDepth () );
+        }
+    }
+
+    REQUIRE_EQ ( vecRef.size(), vecDepthEntire.size() );
+    REQUIRE_EQ ( vecRef.size(), vecDepthSlice.size() );
+
+    for ( size_t i = 0; i < (size_t)len; ++i )
+    {
+        REQUIRE_EQ ( vecRef [i], vecDepthEntire [i] );
+        REQUIRE_EQ ( vecRef [i], vecDepthSlice [i] );
+    }
+}
+
+
+TEST_CASE(CSRA1_PileupEventIterator_GetType)
+{
+    char const db_path[] = "SRR341578";
+
+    int64_t const pos_start = 20022;
+    uint64_t const len = 1;
+
+    ngs::ReadCollection run = ncbi::NGS::openReadCollection (db_path);
+    ngs::ReferenceIterator ri = run.getReferences ();
+
+    ri.nextReference ();
+    ri.nextReference ();
+
+    ngs::PileupEvent::PileupEventType arrRefEvents [] =
+    {
+        (ngs::PileupEvent::PileupEventType)(ngs::PileupEvent::mismatch | ngs::PileupEvent::alignment_minus_strand),
+        ngs::PileupEvent::mismatch,
+        ngs::PileupEvent::mismatch,
+        (ngs::PileupEvent::PileupEventType)(ngs::PileupEvent::mismatch | ngs::PileupEvent::alignment_start),
+        (ngs::PileupEvent::PileupEventType)(ngs::PileupEvent::mismatch | ngs::PileupEvent::alignment_minus_strand  | ngs::PileupEvent::alignment_start),
+        (ngs::PileupEvent::PileupEventType)(ngs::PileupEvent::mismatch | ngs::PileupEvent::alignment_start)
+    };
+
+    ngs::PileupIterator pi = ri.getPileupSlice ( pos_start, len, ngs::Alignment::primaryAlignment );
+
+    for (; pi.nextPileup (); )
+    {
+        REQUIRE_EQ ( pi.getPileupDepth(), (uint32_t)6 );
+        for (size_t i = 0; pi.nextPileupEvent (); ++i)
+        {
+            REQUIRE_EQ ( pi.getEventType (), arrRefEvents [i] );
+        }
+    }
+}
+
+struct PileupEventStruct
+{
+    ngs::PileupEvent::PileupEventType event_type;
+    ngs::PileupEvent::PileupEventType next_event_type;
+    uint32_t repeat_count, next_repeat_count;
+    int mapping_quality;
+    char alignment_base;
+    bool deletion_after_this_pos;
+    ngs::String insertion_bases;
+};
+
+struct PileupLine
+{
+    typedef std::vector <PileupEventStruct> TEvents;
+
+    uint32_t depth;
+    TEvents vecEvents;
+};
+
+void print_line (
+    PileupLine const& line,
+    char const* name,
+    int64_t pos_start,
+    int64_t pos,
+    ngs::String const& strRefSlice,
+    std::ostream& os)
+{
+    os
+        << name
+        << "\t" << (pos + 1)    // + 1 to be like sra-pileup - 1-based position
+        << "\t" << strRefSlice [pos - pos_start]
+        << "\t" << line.depth
+        << "\t";
+
+    for (PileupLine::TEvents::const_iterator cit = line.vecEvents.begin(); cit != line.vecEvents.end(); ++ cit)
+    {
+        PileupEventStruct const& pileup_event = *cit;
+
+        ngs::PileupEvent::PileupEventType eventType = pileup_event.event_type;
+
+        if ( ( eventType & ngs::PileupEvent::alignment_start ) != 0 )
+        {
+            int32_t c = pileup_event.mapping_quality + 33;
+            if ( c > '~' ) { c = '~'; }
+            if ( c < 33 ) { c = 33; }
+
+            os << "^" << (char)(c);
+        }
+
+        bool reverse = ( eventType & ngs::PileupEvent::alignment_minus_strand ) != 0;
+
+        switch ( eventType & 7 )
+        {
+        case ngs::PileupEvent::match:
+            os << (reverse ? "," : ".");
+            break;
+        case ngs::PileupEvent::mismatch:
+            os
+                << (reverse ?
+                (char)tolower( pileup_event.alignment_base )
+                : (char)toupper( pileup_event.alignment_base ));
+            break;
+        case ngs::PileupEvent::deletion:
+            os << (reverse ? "<" : ">");
+            break;
+        }
+
+        if ( pileup_event.insertion_bases.size() != 0 )
+        {
+            bool next_reverse = ( pileup_event.next_event_type & ngs::PileupEvent::alignment_minus_strand ) != 0;
+            os
+                << "+"
+                << pileup_event.insertion_bases.size();
+
+            for ( uint32_t i = 0; i < pileup_event.insertion_bases.size(); ++i )
+            {
+                os
+                    << (next_reverse ?
+                    (char)tolower(pileup_event.insertion_bases[i])
+                    : (char)toupper(pileup_event.insertion_bases[i]));
+            }
+        }
+
+
+        if ( pileup_event.deletion_after_this_pos )
+        {
+            uint32_t count = pileup_event.next_repeat_count;
+            os << "-" << count;
+
+            for ( uint32_t i = 0; i < count; ++i )
+            {
+                os
+                    << (reverse ?
+                    (char)tolower(strRefSlice [pos - pos_start + i + 1]) // + 1 means "deletion is at the NEXT position"
+                    : (char)toupper(strRefSlice [pos - pos_start + i + 1])); // + 1 means "deletion is at the NEXT position"
+            }
+
+        }
+
+        if ( ( eventType & ngs::PileupEvent::alignment_stop ) != 0 )
+            os << "$";
+    }
+    os << std::endl;
+}
+
+void clear_line ( PileupLine& line )
+{
+    line.depth = 0;
+    line.vecEvents.clear ();
+}
+
+void mark_line_as_starting_deletion ( PileupLine& line, uint32_t repeat_count, size_t alignment_index )
+{
+    PileupEventStruct& pileup_event = line.vecEvents [ alignment_index ];
+    if ( ( pileup_event.event_type & 7 ) != ngs::PileupEvent::deletion)
+    {
+        pileup_event.next_repeat_count = repeat_count;
+        pileup_event.deletion_after_this_pos = true;
+    }
+}
+
+void mark_line_as_starting_insertion ( PileupLine& line, ngs::String const& insertion_bases, size_t alignment_index, ngs::PileupEvent::PileupEventType next_event_type )
+{
+    PileupEventStruct& pileup_event = line.vecEvents [ alignment_index ];
+    pileup_event.insertion_bases = insertion_bases;
+    pileup_event.next_event_type = next_event_type;
+}
+
+void mimic_sra_pileup (
+            char const* db_path,
+            char const* ref_name,
+            ngs::Alignment::AlignmentCategory category,
+            int64_t const pos_start, uint64_t const len,
+            std::ostream& os)
+{
+    ngs::ReadCollection run = ncbi::NGS::openReadCollection (db_path);
+    ngs::Reference r = run.getReference ( ref_name );
+    ngs::String const& canonical_name = r.getCanonicalName ();
+
+    // in strRefSlice we want to have bases to report current base and deletions
+    // for current base it would be enough to have only slice [pos_start, len]
+    // but for deletions we might have situation when we want
+    // to report a deletion that goes beyond (pos_start + len) on the reference
+    // so we have to read some bases beyond our slice end
+    ngs::String strRefSlice = r.getReferenceBases ( pos_start, len + 10000 );
+
+    ngs::PileupIterator pi = r.getPileupSlice ( pos_start, len, category );
+
+    PileupLine line_prev, line_curr;
+
+    // maps current line alignment vector index to
+    // previous line alignment vector index
+    // mapAlignmentIdx[i] contains adjustment for index, not the absolute value
+    std::vector <int64_t> mapAlignmentIdxPrev, mapAlignmentIdxCurr;
+
+    int64_t pos = pos_start;
+    for (; pi.nextPileup (); ++ pos)
+    {
+        line_curr.depth = pi.getPileupDepth ();
+        line_curr.vecEvents.reserve (line_curr.depth);
+        mapAlignmentIdxCurr.reserve (line_curr.depth);
+
+        int64_t current_stop_count = 0; // number of encountered stops
+        bool increased_stop_count = false; // we have increased count (skipped position) on the last step
+
+        for (; pi.nextPileupEvent (); )
+        {
+            PileupEventStruct pileup_event;
+
+            pileup_event.deletion_after_this_pos = false;
+            pileup_event.event_type = pi.getEventType ();
+
+            if ( ( pileup_event.event_type & ngs::PileupEvent::alignment_start ) != 0 )
+                pileup_event.mapping_quality = pi.getMappingQuality();
+
+            if ((pileup_event.event_type & 7) == ngs::PileupEvent::mismatch)
+                pileup_event.alignment_base = pi.getAlignmentBase();
+
+            if (increased_stop_count)
+            {
+                if (pileup_event.event_type & ngs::PileupEvent::alignment_stop)
+                {
+                    ++current_stop_count;
+                    mapAlignmentIdxCurr [mapAlignmentIdxCurr.size() - 1] = current_stop_count;
+                }
+                else
+                    increased_stop_count = false;
+            }
+            else
+            {
+                if (pileup_event.event_type & ngs::PileupEvent::alignment_stop)
+                {
+                    ++current_stop_count;
+                    increased_stop_count = true;
+                }
+                mapAlignmentIdxCurr.push_back ( current_stop_count );
+            }
+
+            if ( pos != pos_start )
+            {
+                // here in mapAlignmentIdxPrev we have already initialized
+                // indicies for line_prev
+                // so we can find corresponding alignment by doing:
+                // int64_t idx = line_curr.vecEvents.size()
+                // line_prev.vecEvents [ idx + mapAlignmentIdxPrev [idx] ]
+
+                size_t idx_curr_align = line_curr.vecEvents.size();
+
+                if (mapAlignmentIdxPrev.size() > idx_curr_align)
+                {
+                    if ((pileup_event.event_type & 7) == ngs::PileupEvent::deletion)
+                        mark_line_as_starting_deletion ( line_prev, pi.getEventRepeatCount(), mapAlignmentIdxPrev [idx_curr_align] + idx_curr_align );
+                    if ( pileup_event.event_type & ngs::PileupEvent::insertion )
+                        mark_line_as_starting_insertion ( line_prev, pi.getInsertionBases().toString(), mapAlignmentIdxPrev [idx_curr_align] + idx_curr_align, pileup_event.event_type );
+                }
+            }
+
+            line_curr.vecEvents.push_back ( pileup_event );
+        }
+
+        if ( pos != pos_start ) // there is no line_prev for the first line - nothing to print
+        {
+            // print previous line
+            print_line ( line_prev, canonical_name.c_str(), pos_start, pos - 1, strRefSlice, os );
+        }
+
+        line_prev = line_curr;
+        mapAlignmentIdxPrev = mapAlignmentIdxCurr;
+
+        clear_line ( line_curr );
+        mapAlignmentIdxCurr.clear();
+    }
+    // TODO: if the last line should contain insertion or deletion start ([-+]<number><seq>)
+    // we have to look ahead 1 more position to be able to discover this and
+    // modify line_prev, but if the last line is the very last one for the whole
+    // reference - we shouldn't do that. This all isn't implemented yet in this function
+    print_line ( line_prev, canonical_name.c_str(), pos_start, pos - 1, strRefSlice, os );
+}
+
+TEST_CASE(CSRA1_PileupEventIterator_AdjacentIndels)
+{
+    // This test crashed in CSRA1_PileupEvent.c because of
+    // insertion followed by deletion (see vdb-dump SRR1164787 -T PRIMARY_ALIGNMENT -R 209167)
+    // So now this test has to just run with no crashes to be considered as passed successfully
+
+    char const db_path[] = "SRR1164787";
+    char const ref_name[] = "chr1";
+
+    int64_t const pos_start = 1386093;
+    int64_t const pos_end = 9999999;
+    uint64_t const len = (uint64_t)(pos_end - pos_start + 1);
+
+    std::ostringstream sstream;
+
+    mimic_sra_pileup ( db_path, ref_name, ngs::Alignment::primaryAlignment, pos_start, len, sstream );
+}
+
+TEST_CASE(CSRA1_PileupEventIterator_DeletionAndEnding)
+{
+
+    //sra-pileup SRR497541 -r "Contig307.Contig78.Contig363_2872688_2872915.Contig307.Contig78.Contig363_1_2872687":106436-106438 -s -n
+    // There should be no "g-3taa$" for the position 106438, only "g$" must be there
+
+    char const db_path[] = "SRR497541";
+    char const ref_name[] = "Contig307.Contig78.Contig363_2872688_2872915.Contig307.Contig78.Contig363_1_2872687";
+
+    int64_t const pos_start = 106436-1;
+    int64_t const pos_end = 106438 - 1;
+    uint64_t const len = (uint64_t)(pos_end - pos_start + 1);
+
+    std::ostringstream sstream;
+    std::ostringstream sstream_ref;
+
+    sstream_ref << ref_name << "\t106436\tT\t106\tC$C$,$.,$,$,$,$.-5TATAA.-5TATAA,-5tataa.-5TATAA.-5TATAA.$.-5TATAA.-5TATAA,-5tataa.-5TATAA,-5tataa,-5tataa.-5TATAA,-5tataa,-5tataa.-5TATAA,-5tataa,-5tataa,-5tataa,-5tataa.-5TATAA.-5TATAA,-5tataa.-5TATAA,-5tataa,$.-5TATAA,-5tataa,,-5tataa,$.-5TATAA,-5tataa,-5tataa.-5TATAA,-5tataa.$.$.-5TATAA.-5TATAA.-5TATAA.-5TATAA,-5tataa.-5TATAA.-5TATAA.-5TATAA.-5TATAA.-5TATAA.-5TATAA.-5TATAA,-5tataa.-5TATAA,-5tataa,-5tataa,-5tataa.-5TATAA.$,-5tataa.-5TAT [...]
+    sstream_ref << ref_name << "\t106437\tT\t92\tC$>><>>>><><<><<><<<<>><><><c<><<><>>>><>>>>>>><><<<><>>>><<<><<><<>>><>>>><<><>>><<<<<<>><<," << std::endl;
+    sstream_ref << ref_name << "\t106438\tA\t91\t>><>>>><><<><<><<<<>><><><g$<><<><>>>><>>>>>>><><<<><>>>><<<><<><<>>><>>>><<><>>><<<<<<>><<," << std::endl;
+
+    mimic_sra_pileup ( db_path, ref_name, ngs::Alignment::primaryAlignment, pos_start, len, sstream );
+
+    REQUIRE_EQ ( sstream.str (), sstream_ref.str () );
+}
+
+TEST_CASE(CSRA1_PileupEventIterator_LongDeletions)
+{
+
+    //SRR1113221 "chr4" 10204 10208
+    // 1. At the position 10205 we want to have the full lenght (6) deletion
+    // 2. Previously we had a misplaced insertion at the position 10204 (+3att)
+
+    char const db_path[] = "SRR1113221";
+
+    int64_t const pos_start = 10204-1;
+    int64_t const pos_end = 10208 - 1;
+    uint64_t const len = (uint64_t)(pos_end - pos_start + 1);
+
+    // The output must be the same as for "sra-pileup SRR1113221 -r "chr4":10204-10208 -s -n"
+    std::ostringstream sstream;
+    std::ostringstream sstream_ref;
+
+    sstream_ref << "NC_000004.11\t10204\tT\t37\ta,$c+2tc,,+3att.$.$.+2TT.,,.......,..<......,...g...^!." << std::endl;
+    sstream_ref << "NC_000004.11\t10205\tC\t37\t,$,t+3ttt,..,t.......,A.<....-6TCGGCT.-6TCGGCT.,...,....^$,^!.^$." << std::endl;
+    sstream_ref << "NC_000004.11\t10206\tT\t40\t,,,$..a$g$....$.$N.,..,...-6CGGCTG>>.,...-6CGGCTGa....,..^$.^$.^%.^$." << std::endl;
+    sstream_ref << "NC_000004.11\t10207\tC\t40\t,$,$.$.$.....,..,..>>>.,..>t-6ggctgc...+2TC.,......^$.^$.^$.^$.^A." << std::endl;
+    sstream_ref << "NC_000004.11\t10208\tG\t39\t.....,..,..>>>.,..><....,...........^$,^M.^$." << std::endl;
+
+    mimic_sra_pileup ( db_path, "chr4", ngs::Alignment::primaryAlignment, pos_start, len, sstream );
+
+    REQUIRE_EQ ( sstream.str (), sstream_ref.str () );
+}
+
+
+TEST_CASE(CSRA1_PileupEventIterator_Deletion)
+{
+    // deletions
+    char const db_path[] = "SRR341578";
+
+    int64_t const pos_start = 2427;
+    int64_t const pos_end = 2428;
+    uint64_t const len = (uint64_t)(pos_end - pos_start + 1);
+
+    // The output must be the same as for "sra-pileup SRR341578 -r NC_011752.1:2428-2429 -s -n"
+    std::ostringstream sstream;
+    std::ostringstream sstream_ref;
+
+    sstream_ref << "NC_011752.1\t2428\tG\t34\t..,.,.-1A.-1A.-1A.-1A.-1A.-1A,-1a,-1a.-1A,-1a,-1a.-1A.-1A.-1A,-1a,-1a,-1a,-1a.-1A,-1a,-1a.-1A,-1a.-1A.-1A,-1a.^F,^F," << std::endl;
+    sstream_ref << "NC_011752.1\t2429\tA\t34\t.$.$,$.,>>>>>><<><<>>><<<<><<><>><Ggg" << std::endl;
+
+    mimic_sra_pileup ( db_path, "gi|218511148|ref|NC_011752.1|", ngs::Alignment::all, pos_start, len, sstream );
+
+    REQUIRE_EQ ( sstream.str (), sstream_ref.str () );
+}
+
+TEST_CASE(CSRA1_PileupEventIterator_Insertion)
+{
+    // simple matches, mismatch, insertion, mapping quality
+    char const db_path[] = "SRR341578";
+
+    int64_t const pos_start = 2017;
+    int64_t const pos_end = 2018;
+    uint64_t const len = (uint64_t)(pos_end - pos_start + 1);
+
+    // The output must be the same as for "sra-pileup SRR341578 -r NC_011752.1:2018-2019 -s -n"
+    std::ostringstream sstream;
+    std::ostringstream sstream_ref;
+
+    sstream_ref << "NC_011752.1\t2018\tT\t17\t.....,,A,,..+2CA..^F.^F.^:N" << std::endl;
+    sstream_ref << "NC_011752.1\t2019\tC\t19\t.....,,.,,.......^F.^F," << std::endl;
+
+    mimic_sra_pileup ( db_path, "gi|218511148|ref|NC_011752.1|", ngs::Alignment::all, pos_start, len, sstream );
+
+    REQUIRE_EQ ( sstream.str (), sstream_ref.str () );
+}
+
+TEST_CASE(CSRA1_PileupEventIterator_TrickyInsertion)
+{
+    // the insertion occurs in 1 or more previous chunks but not the current
+
+    char const db_path[] = "SRR341578";
+
+    int64_t const pos_start = 380000;
+    int64_t const pos_end = 380001;
+    uint64_t const len = (uint64_t)(pos_end - pos_start + 1);
+
+    // The output must be the same as for "sra-pileup SRR341578 -r NC_011748.1:380001-380002 -s -n"
+    std::ostringstream sstream;
+    std::ostringstream sstream_ref;
+
+    sstream_ref << "NC_011748.1\t380001\tT\t61\t....,,...,......,,...,,.....,,..,.,,,,...,,,,,,,+2tc.,.....G....," << std::endl;
+    sstream_ref << "NC_011748.1\t380002\tT\t61\t.$.$.$.$,$,$...,......,,...,,.....,,A.,.,,,,...,,,,,,,.,.....G....," << std::endl;
+
+    mimic_sra_pileup ( db_path, "gi|218693476|ref|NC_011748.1|", ngs::Alignment::primaryAlignment, pos_start, len, sstream );
+
+    REQUIRE_EQ ( sstream.str (), sstream_ref.str () );
+}
+
+
+TEST_CASE(CSRA1_PileupIterator_StartingZeros)
+{
+    // this is transition from depth == 0 to depth == 1
+    // initial code had different output for primaryAlignments vs all
+
+    int64_t const pos_start = 19374;
+    int64_t const pos_end = 19375;
+    uint64_t const len = (uint64_t)(pos_end - pos_start + 1); //3906625;
+
+    // when requesting category == all, the output must be the same as with
+    // primaryAlignments
+    // reference output: sra-pileup SRR833251 -r "gi|169794206|ref|NC_010410.1|":19375-19376 -s -n
+
+    std::ostringstream sstream;
+    std::ostringstream sstream_ref;
+
+    sstream_ref << "gi|169794206|ref|NC_010410.1|\t19375\tC\t0\t" << std::endl;
+    sstream_ref << "gi|169794206|ref|NC_010410.1|\t19376\tA\t1\t^!." << std::endl;
+
+    mimic_sra_pileup ( "SRR833251", "gi|169794206|ref|NC_010410.1|", ngs::Alignment::all, pos_start, len, sstream );
+
+    REQUIRE_EQ ( sstream.str (), sstream_ref.str () );
+}
+
+TEST_CASE(CSRA1_PileupIterator_MapQuality)
+{
+    // different mapping quality
+    // there was a bug caused by usage of char c instead int32_t c
+    // in printing code inside mimic_sra_pileup
+
+    int64_t const pos_start = 183830-1;
+    int64_t const pos_end = pos_start;
+    uint64_t const len = (uint64_t)(pos_end - pos_start + 1);
+
+    std::ostringstream sstream;
+    std::ostringstream sstream_ref;
+
+    sstream_ref << "gi|169794206|ref|NC_010410.1|\t183830\tA\t1\t^~," << std::endl;
+
+    mimic_sra_pileup ( "SRR833251", "gi|169794206|ref|NC_010410.1|", ngs::Alignment::all, pos_start, len, sstream );
+
+    REQUIRE_EQ ( sstream.str (), sstream_ref.str () );
+}
+
+TEST_CASE(CSRA1_PileupIterator_Depth)
+{
+    // if ngs::Alignment::all is used here
+    // there will be discrepancy with sra-pileup
+
+    int64_t const pos_start = 519533-1;
+    int64_t const pos_end = pos_start;
+    uint64_t const len = (uint64_t)(pos_end - pos_start + 1);
+
+    std::ostringstream sstream;
+    std::ostringstream sstream_ref;
+
+    sstream_ref << "gi|169794206|ref|NC_010410.1|\t519533\tC\t1\t," << std::endl;
+
+    mimic_sra_pileup ( "SRR833251", "gi|169794206|ref|NC_010410.1|", ngs::Alignment::primaryAlignment, pos_start, len, sstream );
+
+    REQUIRE_EQ ( sstream.str (), sstream_ref.str () );
+}
+
+TEST_CASE(CSRA1_PileupIterator_TrailingInsertion)
+{
+    // Loaders sometimes fail and produce a run with trailing insertions
+    // Like now (2015-06-29) SRR1652532 for SRR1652532.PA.97028
+
+    int64_t const pos_start = 42406728-1;
+    int64_t const pos_end = 42406732;
+    uint64_t const len = (uint64_t)(pos_end - pos_start + 1);
+
+    // reference output: sra-pileup SRR1652532 -r "CM000671.1":42406728-42406732 -s -n
+
+    // as of 2015-06-25, this command causes sra-pileup to crash, so
+    // we don't compare our output with one of sra-pileup
+    // and only checking that this test doesn't crash
+
+    std::ostringstream sstream;
+    //std::ostringstream sstream_ref;
+
+    //sstream_ref << "gi|169794206|ref|NC_010410.1|\t19375\tC\t0\t" << std::endl;
+    //sstream_ref << "gi|169794206|ref|NC_010410.1|\t19376\tA\t1\t^!." << std::endl;
+
+    mimic_sra_pileup ( "SRR1652532", "CM000671.1", ngs::Alignment::all, pos_start, len, sstream );
+
+    //std::cout << sstream.str() << std::endl;
+
+    //REQUIRE_EQ ( sstream.str (), sstream_ref.str () );
+}
+
+#if 0 /* TODO: this test needs to be investigated later */
+TEST_CASE(CSRA1_PileupIterator_FalseMismatch)
+{
+    // here is two problems:
+    // 1. at the position 19726231 GetEventType returns "mismatch"
+    //    but the base == 'C' for both reference and alignment
+    // 2. ngs code doesn't report deletion in the beginning of both lines
+    //    and also it reports depths: 1 and 3, while sra-pileup returns 2 and 4
+    // And also it produces a lot of warnings in stderr in the debug version
+
+    // Update:
+    // (1) reproduced in pileup-stats -v -a primary -x 2 -e 2 SRR1652532 -o SRR1652532.out
+    //     due to the bug in new pileup code - need to start not from position 19726231
+    //     but ~25 before that
+    // (2). still remains
+    // 3. if one uncomments REQUIRE_EQ in the end a lot of debug warning appear in the stderr
+
+    int64_t const pos_start = 19726231-1;
+    int64_t const pos_end = pos_start + 1;
+    uint64_t const len = (uint64_t)(pos_end - pos_start + 1);
+
+    std::ostringstream sstream;
+    std::ostringstream sstream_ref;
+
+    // sra-pileup SRR1652532 -r CM000663.1:19726231-19726232 -s -n -t p
+
+    sstream_ref << "CM000663.1\t19726231\tG\t2\t<." << std::endl;
+    sstream_ref << "CM000663.1\t19726232\tC\t4\t<.^:,^H," << std::endl;
+
+    mimic_sra_pileup ( "SRR1652532", "CM000663.1", ngs::Alignment::primaryAlignment, pos_start, len, sstream );
+
+    //std::cout << sstream.str() << std::endl;
+
+    //REQUIRE_EQ ( sstream.str (), sstream_ref.str () );
+}
+#endif
+
+uint64_t pileup_test_all_functions (
+            char const* db_path,
+            char const* ref_name,
+            ngs::Alignment::AlignmentCategory category,
+            int64_t const pos_start, uint64_t const len)
+{
+    uint64_t ret = 0;
+
+    ngs::ReadCollection run = ncbi::NGS::openReadCollection (db_path);
+    ngs::Reference r = run.getReference ( ref_name );
+
+    // in strRefSlice we want to have bases to report current base and deletions
+    // for current base it would be enough to have only slice [pos_start, len]
+    // but for deletions we might have situation when we want
+    // to report a deletion that goes beyond (pos_start + len) on the reference
+    // so we have to read some bases beyond our slice end
+    ngs::String strRefSlice = r.getReferenceBases ( pos_start, len + 100);
+
+    ngs::PileupIterator pi = r.getPileupSlice ( pos_start, len, category );
+
+    int64_t pos = pos_start;
+    for (; pi.nextPileup (); ++ pos)
+    {
+        ret += 1000000;
+
+        size_t event_count = 0;
+        for (; pi.nextPileupEvent () && pos % 17 != 0; ++ event_count)
+        {
+            //ngs::Alignment alignment = pi.getAlignment();
+            //ret += (uint64_t)(alignment.getAlignmentLength() + alignment.getAlignmentPosition());
+
+            ret += (uint64_t)pi.getAlignmentBase();
+            ret += (uint64_t)pi.getAlignmentPosition();
+            ret += (uint64_t)pi.getAlignmentQuality();
+            ret += (uint64_t)pi.getEventIndelType();
+            ret += (uint64_t)pi.getEventRepeatCount();
+            ret += (uint64_t)pi.getEventType();
+            ret += (uint64_t)pi.getFirstAlignmentPosition();
+            ret += (uint64_t)pi.getInsertionBases().size();
+            ret += (uint64_t)pi.getInsertionQualities().size();
+            ret += (uint64_t)pi.getLastAlignmentPosition();
+            ret += (uint64_t)pi.getMappingQuality();
+            ret += (uint64_t)pi.getPileupDepth();
+            ret += (uint64_t)pi.getReferenceBase();
+            ret += (uint64_t)pi.getReferencePosition();
+            ret += (uint64_t)pi.getReferenceSpec().size();
+
+            if ( (event_count + 1) % 67 == 0 )
+            {
+                ret += 100000;
+                pi.resetPileupEvent();
+                break;
+            }
+        }
+    }
+
+    return ret;
+}
+
+TEST_CASE(CSRA1_PileupIterator_TestAllFunctions)
+{
+    uint64_t ret = 0;
+    ret = pileup_test_all_functions ( "SRR822962", "chr2"/*"NC_000002.11"*/, ngs::Alignment::all, 0, 20000 );
+    // this magic sum was taken from an observed result,
+    // but due to a bug in "resetPileupEvent()", is likely to be wrong
+    // resetting the magic sum to what is being returned now.
+    REQUIRE_EQ ( ret, (uint64_t)/*46433887435*/ /*46436925309*/ 46436941625 );
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs_csra1pileup-c++";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t rc=NgsCsra1PileupCppTestSuite(argc, argv);
+    return rc;
+}
+
+}
+
diff --git a/test/ngs-c++/CSRA1_ReadCollection_test.cpp b/test/ngs-c++/CSRA1_ReadCollection_test.cpp
new file mode 100644
index 0000000..9ce23e8
--- /dev/null
+++ b/test/ngs-c++/CSRA1_ReadCollection_test.cpp
@@ -0,0 +1,252 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS interface, CSRA1 based implementation, ReadCollection class
+*/
+
+/**
+* This file is to be #included into a test suite
+*/
+
+#include <klib/text.h>
+
+//TODO: getReads (categories)
+//TODO: getReadCount (categories)
+//TODO: getReadGroups
+//TODO: error cases
+
+// Open
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_Open, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly );
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_Open_Failed, CSRA1_Fixture)
+{
+    REQUIRE_THROW ( ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( string(CSRA1_PrimaryOnly) + "_BS" ) );
+}
+
+// Read collection functions
+
+TEST_CASE (CSRA1_ReadCollection_GetName)
+{
+    ngs::String name1, name2;
+    {
+        ngs::ReadCollection run = ncbi::NGS::openReadCollection ("./SRR611340");
+        name1 = run.getName();
+        char const* pNoSlash = string_rchr( name1.c_str(), name1.length(), '/' );
+        REQUIRE ( pNoSlash == NULL );
+    }
+    {
+        ngs::ReadCollection run = ncbi::NGS::openReadCollection ("SRR611340");
+        name2 = run.getName();
+    }
+    REQUIRE_EQ ( name1, name2 );
+}
+
+// READS
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReads, CSRA1_Fixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getReads ( ngs :: Read :: all ); 
+} 
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReads_Filtered, CSRA1_Fixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getReads ( ngs :: Read :: unaligned ); 
+} 
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReadRange, CSRA1_Fixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getReadRange ( 100, 200 ); 
+} 
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetRead, CSRA1_Fixture)
+{
+    ngs :: Read read = getRead ( string ( CSRA1_PrimaryOnly ) + ".R.1" ); 
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetRead_IdTooHigh, CSRA1_Fixture)
+{
+    REQUIRE_THROW ( ngs :: Read read = 
+                        ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getRead ( string ( CSRA1_PrimaryOnly ) + ".R.2280634" ) );
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetRead_IdTooLow, CSRA1_Fixture)
+{
+    REQUIRE_THROW ( ngs :: Read read = 
+                        ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getRead ( string ( CSRA1_PrimaryOnly ) + ".R.0" ) );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_ReadCount, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly );
+    REQUIRE_EQ( (uint64_t)2280633, run . getReadCount() ); 
+}    
+
+// REFERENCE
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReference, CSRA1_Fixture)
+{
+    ngs :: Reference ref = getReference ( "supercont2.1" ); 
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_HasReference, CSRA1_Fixture)
+{
+    REQUIRE ( hasReference ( "supercont2.1" ) ); 
+    REQUIRE ( ! hasReference ( "non-existent acc" ) ); 
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReference_Failed, CSRA1_Fixture)
+{
+    REQUIRE_THROW ( ngs :: Reference ref = getReference ( "supercnut2.1" ) ); 
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReferences, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly );
+    ngs :: ReferenceIterator refIt = run . getReferences ();
+}
+
+// ALIGNMENT
+
+// GetAlignment
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignment_Primary, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly );
+    ngs :: Alignment al = run . getAlignment ( string ( CSRA1_PrimaryOnly ) + ".PA.1" );
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignment_Primary_OutOfRange_Low, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly );
+    REQUIRE_THROW ( ngs :: Alignment al = run . getAlignment ( string ( CSRA1_PrimaryOnly ) + ".PA.0" ) );
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignment_Primary_OutOfRange_High, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly );
+    REQUIRE_THROW ( run . getAlignment ( string ( CSRA1_PrimaryOnly ) + ".PA.3987703" ) );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignment_Secondary, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary );
+    ngs :: Alignment al = run . getAlignment ( string ( CSRA1_WithSecondary ) + ".SA.169" );
+    REQUIRE_EQ( ngs :: Alignment :: secondaryAlignment, al . getAlignmentCategory() );
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignment_Secondary_OutOfRange, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary );
+    REQUIRE_THROW ( ngs :: Alignment al = run . getAlignment ( string ( CSRA1_WithSecondary ) + ".SA.179" ) );
+}
+
+// GetAlignments
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignments_Primary, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator alIt = getAlignments ( ngs :: Alignment :: primaryAlignment );
+    REQUIRE( alIt . nextAlignment() );
+    REQUIRE_EQ( ngs :: Alignment :: primaryAlignment, alIt . getAlignmentCategory() );
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignments_Secondary, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator alIt = getAlignments ( ngs :: Alignment :: secondaryAlignment );
+    REQUIRE( alIt . nextAlignment() );
+    REQUIRE_EQ( ngs :: Alignment :: secondaryAlignment, alIt . getAlignmentCategory() );
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignments_All, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator alIt = getAlignments ( ngs :: Alignment :: all );
+    REQUIRE( alIt . nextAlignment() );
+    REQUIRE_EQ( ngs :: Alignment :: primaryAlignment, alIt . getAlignmentCategory() );
+}
+
+// GetAlignmentCount
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentCount_Secondary, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary );
+    REQUIRE_EQ( (uint64_t)178, run . getAlignmentCount() );
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentCount_Secondary_CategoryAll, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary );
+    REQUIRE_EQ( (uint64_t)178, run . getAlignmentCount( ngs :: Alignment :: all ) );
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentCount_Secondary_CategoryPrimary, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary );
+    REQUIRE_EQ( (uint64_t)168, run . getAlignmentCount( ngs :: Alignment :: primaryAlignment ) );
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentCount_Secondary_CategorySecondary, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary );
+    REQUIRE_EQ( (uint64_t)10, run . getAlignmentCount( ngs :: Alignment :: secondaryAlignment ) );
+}
+
+// GetAlignmentRange
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_All, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary );
+    ngs :: AlignmentIterator alIt = run . getAlignmentRange ( 168, 2 ); // both in primary and secondary tables
+    REQUIRE ( alIt . nextAlignment() );
+    REQUIRE_EQ( string ( CSRA1_WithSecondary ) + ".PA.168", alIt . getAlignmentId () . toString () );
+    REQUIRE_EQ( ngs :: Alignment :: primaryAlignment, alIt . getAlignmentCategory() );
+    REQUIRE ( alIt . nextAlignment() );
+    REQUIRE_EQ( string ( CSRA1_WithSecondary ) + ".SA.169", alIt . getAlignmentId () . toString () );
+    REQUIRE_EQ( ngs :: Alignment :: secondaryAlignment, alIt . getAlignmentCategory() );
+    REQUIRE ( ! alIt . nextAlignment() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_FilteredAll, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary );
+    ngs :: AlignmentIterator alIt = run . getAlignmentRange ( 168, 2, ngs :: Alignment :: all ); // both in primary and secondary tables
+    REQUIRE ( alIt . nextAlignment() );
+    REQUIRE_EQ( string ( CSRA1_WithSecondary ) + ".PA.168", alIt . getAlignmentId () . toString () );
+    REQUIRE_EQ( ngs :: Alignment :: primaryAlignment, alIt . getAlignmentCategory() );
+    REQUIRE ( alIt . nextAlignment() );
+    REQUIRE_EQ( string ( CSRA1_WithSecondary ) + ".SA.169", alIt . getAlignmentId () . toString () );
+    REQUIRE_EQ( ngs :: Alignment :: secondaryAlignment, alIt . getAlignmentCategory() );
+    REQUIRE ( ! alIt . nextAlignment() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRangeFiltered_Primary, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary );
+    ngs :: AlignmentIterator alIt = run . getAlignmentRange ( 168, 2, ngs :: Alignment :: primaryAlignment ); 
+    REQUIRE ( alIt . nextAlignment() );
+    REQUIRE_EQ( string ( CSRA1_WithSecondary ) + ".PA.168", alIt . getAlignmentId () . toString () );
+    REQUIRE_EQ( ngs :: Alignment :: primaryAlignment, alIt . getAlignmentCategory() );
+    REQUIRE ( ! alIt . nextAlignment() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRangeFiltered_Secondary, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary );
+    ngs :: AlignmentIterator alIt = run . getAlignmentRange ( 168, 2, ngs :: Alignment :: secondaryAlignment ); 
+    REQUIRE ( alIt . nextAlignment() );
+    REQUIRE_EQ( string ( CSRA1_WithSecondary ) + ".SA.169", alIt . getAlignmentId () . toString () );
+    REQUIRE_EQ( ngs :: Alignment :: secondaryAlignment, alIt . getAlignmentCategory() );
+    REQUIRE ( ! alIt . nextAlignment() );
+}
+
diff --git a/test/ngs-c++/CSRA1test.cpp b/test/ngs-c++/CSRA1test.cpp
new file mode 100644
index 0000000..88d1e4e
--- /dev/null
+++ b/test/ngs-c++/CSRA1test.cpp
@@ -0,0 +1,1105 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS interface, CSRA1 based implementation
+*/
+
+#include "ngsfixture.hpp"
+#include <stdint.h>
+
+#include <sstream>
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsCsra1CppTestSuite);
+
+class CSRA1_Fixture : public NgsFixture
+{
+public:
+    static const char* CSRA1_PrimaryOnly;
+    static const char* CSRA1_WithSecondary;
+    static const char* CSRA1_WithGroups;
+    static const char* CSRA1_NoReadGroups;
+    static const char* CSRA1_WithCircularRef;
+    static const char* CSRA1_WithCircularRef2;
+    static const char* CSRA1_SingleFragmentPerSpot;
+
+public:
+    CSRA1_Fixture()
+    {
+    }
+    ~CSRA1_Fixture()
+    {
+    }
+
+    ngs :: ReadIterator getReads ( ngs :: Read :: ReadCategory cat = ngs :: Read :: all )
+    {
+        return NgsFixture :: getReads ( CSRA1_PrimaryOnly, cat );
+    }
+    ngs :: Read getRead ( const ngs :: String& p_id)
+    {
+        return NgsFixture :: getRead ( CSRA1_PrimaryOnly, p_id );
+    }
+    ngs :: Read getFragment (const ngs :: String& p_readId, uint32_t p_fragIdx)
+    {
+        return NgsFixture :: getFragment ( CSRA1_PrimaryOnly, p_readId, p_fragIdx );
+    }
+    ngs :: Reference getReference ( const char* spec )
+    {
+        return NgsFixture :: getReference ( CSRA1_PrimaryOnly, spec );
+    }
+    bool hasReference ( const char* spec )
+    {
+        return NgsFixture :: hasReference ( CSRA1_PrimaryOnly, spec );
+    }
+    ngs :: ReferenceIterator getReferences ()
+    {
+        return NgsFixture :: getReferences ( CSRA1_PrimaryOnly );
+    }
+    ngs :: AlignmentIterator getAlignments( ngs :: Alignment :: AlignmentCategory category = ngs :: Alignment :: all )
+    {
+        return ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary ) . getAlignments ( category );
+    }
+};
+const char* CSRA1_Fixture::CSRA1_PrimaryOnly           = "SRR1063272";
+const char* CSRA1_Fixture::CSRA1_WithSecondary         = "SRR833251";
+const char* CSRA1_Fixture::CSRA1_WithGroups            = "SRR822962";
+const char* CSRA1_Fixture::CSRA1_NoReadGroups          = "SRR1237962";
+const char* CSRA1_Fixture::CSRA1_WithCircularRef       = "SRR1769246";
+const char* CSRA1_Fixture::CSRA1_WithCircularRef2      = "SRR821492";
+const char* CSRA1_Fixture::CSRA1_SingleFragmentPerSpot = "SRR2096940";
+
+#include "CSRA1_ReadCollection_test.cpp"
+
+///// Read
+//TODO: error cases
+
+FIXTURE_TEST_CASE(CSRA1_Read_ReadId, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string ( CSRA1_PrimaryOnly ) + ".R.1", getRead ( string ( CSRA1_PrimaryOnly ) + ".R.1" ) . getReadId() . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Read_ReadName, CSRA1_Fixture)
+{
+    REQUIRE_EQ( ngs :: String( "1" ), getRead ( string ( CSRA1_PrimaryOnly ) + ".R.1" ) . getReadName() . toString() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Read_ReadGroup, CSRA1_Fixture)
+{
+    REQUIRE_EQ( ngs :: String("C1ELY.6"), getRead ( string ( CSRA1_PrimaryOnly ) + ".R.1" ) . getReadGroup() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Read_getNumFragments, CSRA1_Fixture)
+{
+    REQUIRE_EQ( ( uint32_t ) 2, getRead ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.1" ) . getNumFragments() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Read_ReadCategory_FullyAligned, CSRA1_Fixture)
+{
+    REQUIRE_EQ( ngs :: Read :: fullyAligned, getRead ( string ( CSRA1_PrimaryOnly ) + ".R.1" ) . getReadCategory() );
+}
+FIXTURE_TEST_CASE(CSRA1_Read_ReadCategory_PartiallyAligned, CSRA1_Fixture)
+{
+    REQUIRE_EQ( ngs :: Read :: partiallyAligned, getRead ( string ( CSRA1_PrimaryOnly ) + ".R.3" ) . getReadCategory() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Read_getReadBases, CSRA1_Fixture)
+{
+    ngs :: String bases = getRead ( string ( CSRA1_PrimaryOnly ) + ".R.1" ) . getReadBases () . toString ();
+    ngs :: String expected("ACTCGACATTCTGCCTTCGACCTATCTTTCTCCTCTCCCAGTCATCGCCCAGTAGAATTACCAGGCAATGAACCAGGGCC"
+                           "TTCCATCCCAACGGCACAGCAAAGGTATGATACCTGAGATGTTGCGGGATGGTGGGTTTGTGAGGAGATGGCCACGCAGG"
+                           "CAAGGTCTTTTGGAATGGTTCACTGTTGGAGTGAACCCATAT");
+    REQUIRE_EQ( expected, bases );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Read_getSubReadBases_Offset, CSRA1_Fixture)
+{
+    ngs :: String bases = getRead ( string ( CSRA1_PrimaryOnly ) + ".R.1" ) . getReadBases ( 160 ) . toString( );
+    ngs :: String expected("CAAGGTCTTTTGGAATGGTTCACTGTTGGAGTGAACCCATAT");
+    REQUIRE_EQ( expected, bases );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Read_getSubReadBases_OffsetLength, CSRA1_Fixture)
+{
+    ngs :: String bases = getRead ( string ( CSRA1_PrimaryOnly ) + ".R.1" ) . getReadBases ( 160, 10 ) . toString ();
+    ngs :: String expected("CAAGGTCTTT");
+    REQUIRE_EQ( expected, bases );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Read_getReadQualities, CSRA1_Fixture)
+{
+    ngs :: String quals = getRead ( string ( CSRA1_PrimaryOnly ) + ".R.1" ) . getReadQualities() . toString ();
+    ngs :: String expected("@@CDDBDFFBFHFIEEFGIGGHIEHIGIGGFGEGAFDHIIIIIGGGDFHII;=BF at FEHGIEEH?AHHFHFFFFDC5'5="
+                           "?CC?ADCD at AC??9BDDCDB<@@@DDADDFFHGHIIDHFFHDEFEHIIGHIIDGGGFHIJIGAGHAH=;DGEGEEEDDDB"
+                           "<ABBD;ACDDDCBCCCDD at CCDDDCDCDBDD@ACC>A@?>C3");
+    REQUIRE_EQ( expected, quals );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Read_getSubReadQualities_Offset, CSRA1_Fixture)
+{
+    ngs :: String quals = getRead ( string ( CSRA1_PrimaryOnly ) + ".R.1" ) . getReadQualities( 160 ) . toString ();
+    ngs :: String expected("<ABBD;ACDDDCBCCCDD at CCDDDCDCDBDD@ACC>A@?>C3");
+    REQUIRE_EQ( expected, quals );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Read_getSubReadQualities_OffsetLength, CSRA1_Fixture)
+{
+    ngs :: String quals = getRead ( string ( CSRA1_PrimaryOnly ) + ".R.1" ) . getReadQualities( 160, 10 ) . toString ();
+    ngs :: String expected("<ABBD;ACDD");
+    REQUIRE_EQ( expected, quals );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Read_fragmentIsAligned_MultiFragmentsPerPartiallyAlignedSpot, CSRA1_Fixture)
+{
+    ngs :: Read read = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getRead ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.3" );
+    REQUIRE_EQ( true, read.fragmentIsAligned( 0 ) );
+    REQUIRE_EQ( false, read.fragmentIsAligned( 1 ) );
+}
+
+///// ReadIterator
+//TODO: read category selection
+//TODO: range on a collection that represents a slice (read[0].id != 1)
+//TODO: range and filtering
+//TODO: ReadIterator over a ReadGroup (use a ReadGroup that is not immediately at the beginning of the run)
+//TODO: ReadIterator over a ReadIterator, to allow creation of a sub-iterator
+//TODO: ReadIterator returning less than the range requested
+//TODO: error cases (?)
+FIXTURE_TEST_CASE(CSRA1_ReadIterator_NoReadBeforeNext, CSRA1_Fixture)
+{
+    ngs :: ReadIterator readIt = getReads ();
+    // accessing the read through an iterator before a call to nextRead() throws
+    REQUIRE_THROW ( readIt . getReadId() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadIterator_Open_All, CSRA1_Fixture)
+{
+    ngs :: ReadIterator readIt = getReads ();
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.1", readIt . getReadId() . toString () );
+}
+
+#if SHOW_UNIMPLEMENTED
+FIXTURE_TEST_CASE(CSRA1_ReadIterator_Open_Filtered, CSRA1_Fixture)
+{
+    ngs :: ReadIterator readIt = getReads ( ngs :: Read :: partiallyAligned );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.3", readIt . getReadId() . toString () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.5", readIt . getReadId() . toString () );
+}
+#endif
+
+FIXTURE_TEST_CASE(CSRA1_ReadIterator_Next, CSRA1_Fixture)
+{
+    ngs :: ReadIterator readIt = getReads ();
+    REQUIRE( readIt . nextRead () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.2", readIt . getReadId() . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadIterator_End, CSRA1_Fixture)
+{
+    ngs :: ReadIterator readIt = getReads ();
+    ngs :: String lastId;
+    while (readIt . nextRead ())
+    {
+        lastId = readIt . getReadId() . toString ();
+    }
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.2280633", lastId );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadIterator_BeyondEnd, CSRA1_Fixture)
+{
+    ngs :: ReadIterator readIt = getReads ();
+    while (readIt . nextRead ())
+    {
+    }
+    REQUIRE_THROW( readIt . getReadId(); );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadIterator_Range, CSRA1_Fixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getReadRange ( 10, 5 );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.10", readIt . getReadId() . toString () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.11", readIt . getReadId() . toString () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.12", readIt . getReadId() . toString () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.13", readIt . getReadId() . toString () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.14", readIt . getReadId() . toString () );
+    REQUIRE( ! readIt . nextRead () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadIterator_EmptyRange, CSRA1_Fixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly );
+    ngs :: ReadIterator readIt = run . getReadRange ( run . getReadCount() + 1, 5 );
+    REQUIRE_THROW ( readIt . getReadId(); );
+    REQUIRE ( ! readIt . nextRead () );
+}
+
+///// Fragment
+//TODO: error cases
+FIXTURE_TEST_CASE(CSRA1_Fragment_NoFragmentBeforeNext, CSRA1_Fixture)
+{
+    ngs :: Read read = getRead ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.1" );
+    REQUIRE_THROW( read . getFragmentId() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Fragment_Id, CSRA1_Fixture)
+{
+    ngs :: Read read = getRead ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.1" );
+    REQUIRE ( read . nextFragment() );
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".FR0.1", read . getFragmentId() . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Fragment_getFragmentBases, CSRA1_Fixture)
+{
+    ngs :: String expected("AAGGTATGATACCTGAGATGTTGCGGGATGGTGGGTTTGTGAGGAGATGGCCACGCAGGCAAGGTCTTTTGGAATGGTTCACTGTTGGAGTGAACCCATAT");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.1", 2 ) . getFragmentBases () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Fragment_getSubFragmentBases_Offset, CSRA1_Fixture)
+{
+    ngs :: String expected("ACTGTTGGAGTGAACCCATAT");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.1", 2 ) . getFragmentBases ( 80 ) . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Fragment_getSubFragmentBases_OffsetLength, CSRA1_Fixture)
+{
+    ngs :: String expected("ACTGTT");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.1", 2 ) . getFragmentBases ( 80, 6 ) . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Fragment_getFragmentQualities, CSRA1_Fixture)
+{
+    ngs :: String expected("@@@DDADDFFHGHIIDHFFHDEFEHIIGHIIDGGGFHIJIGAGHAH=;DGEGEEEDDDB<ABBD;ACDDDCBCCCDD at CCDDDCDCDBDD@ACC>A@?>C3");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.1", 2 ) . getFragmentQualities () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Fragment_getSubFragmentQualities_Offset, CSRA1_Fixture)
+{
+    ngs :: String expected("DDDCDCDBDD at ACC>A@?>C3");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.1", 2 ) . getFragmentQualities ( 80 ) . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Fragment_getSubFragmentQualities_OffsetLength, CSRA1_Fixture)
+{
+    ngs :: String expected("DDDCDC");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.1", 2 ) . getFragmentQualities ( 80, 6 ) . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Fragment_isPaired_MultiFragmentsPerAlignedSpot, CSRA1_Fixture)
+{
+    ngs :: Read read = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getRead ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.1" );
+    read.nextFragment();
+    REQUIRE_EQ( true, read.isPaired() );
+    read.nextFragment();
+    REQUIRE_EQ( true, read.isPaired() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Fragment_isPaired_MultiFragmentsPerPartiallyAlignedSpot, CSRA1_Fixture)
+{
+    ngs :: Read read = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getRead ( ngs :: String ( CSRA1_PrimaryOnly ) + ".R.3" );
+    read.nextFragment();
+    REQUIRE_EQ( true, read.isPaired() );
+    read.nextFragment();
+    REQUIRE_EQ( true, read.isPaired() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Fragment_isPaired_SingleFragmentPerSpot, CSRA1_Fixture)
+{
+    ngs :: Read read = ncbi :: NGS :: openReadCollection ( CSRA1_SingleFragmentPerSpot ) . getRead ( ngs :: String ( CSRA1_SingleFragmentPerSpot ) + ".R.1" );
+    read.nextFragment();
+    REQUIRE_EQ( false, read.isPaired() );
+}
+
+//TODO: getFragmentQualities on an accession with QUALITY column of type phred_33 (and phred_64, if there can be one)
+
+///// Reference
+//TODO: getAlignmentSlice
+//TODO: getPileups
+//TODO: getPileupRange
+//TODO: error cases
+FIXTURE_TEST_CASE(CSRA1_Reference_CommonName, CSRA1_Fixture)
+{   // SRR1199225
+    const char* name = "supercont2.1";
+    REQUIRE_EQ( ngs :: String ( name ), getReference ( name ). getCommonName () );
+}
+FIXTURE_TEST_CASE(CSRA1_Reference_CanonicalName, CSRA1_Fixture)
+{
+    const char* name = "chr7";
+    const char* canoName = "NC_000007.13";
+    REQUIRE_EQ( ngs :: String ( canoName ), ncbi :: NGS :: openReadCollection ( "SRR821492" ) . getReference ( name ). getCanonicalName () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_IsCircular_No, CSRA1_Fixture)
+{
+    REQUIRE( ! getReference ( "supercont2.1" ). getIsCircular () );
+}
+FIXTURE_TEST_CASE(CSRA1_Reference_IsCircular_Yes, CSRA1_Fixture)
+{
+    REQUIRE( ncbi :: NGS :: openReadCollection ( "SRR821492" ) . getReference ( "chrM" ) . getIsCircular () );
+}
+
+static uint64_t CSRA1_ReferenceLength = (uint64_t)2291499l;
+FIXTURE_TEST_CASE(CSRA1_Reference_GetLength, CSRA1_Fixture)
+{
+    REQUIRE_EQ( CSRA1_ReferenceLength, getReference ( "supercont2.1" ). getLength () );
+}
+
+
+static uint64_t CSRA1_ReferenceLength_VDB_2832 = (uint64_t)49711204;
+FIXTURE_TEST_CASE(CSRA1_Reference_GetLength_VDB_2832, CSRA1_Fixture)
+{
+    REQUIRE_EQ( CSRA1_ReferenceLength_VDB_2832, ncbi :: NGS :: openReadCollection ( "SRR2073063" ) . getReference ( "NC_016101.1" ). getLength () );
+    REQUIRE_EQ( CSRA1_ReferenceLength_VDB_2832, ncbi :: NGS :: openReadCollection ( "SRR2073063" ) . getReference ( "Gm14" ). getLength () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceBases_All, CSRA1_Fixture)
+{
+    ngs :: String str = getReference ( "supercont2.1" ). getReferenceBases ( 0 );
+    REQUIRE_EQ( (size_t)CSRA1_ReferenceLength, str . size () );
+    REQUIRE_EQ( string("GAATTCT"), str . substr (0, 7) );
+    REQUIRE_EQ( string("ATCTG"), str . substr (str.size() - 5, 5) );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceBases_Offset_1, CSRA1_Fixture)
+{   // offset points into the first chunk of the reference
+    ngs :: String str = getReference ( "supercont2.1" ). getReferenceBases ( 1000 );
+    REQUIRE_EQ( CSRA1_ReferenceLength - 1000, (uint64_t) str . size () );
+    REQUIRE_EQ( string("TCCATTC"), str . substr (0, 7) );
+    REQUIRE_EQ( string("ATCTG"), str . substr (str.size() - 5, 5) );
+}
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceBases_Offset_2, CSRA1_Fixture)
+{   // offset points into the second chunk of the reference
+    ngs :: String str = getReference ( "supercont2.1" ). getReferenceBases ( 7000 );
+    REQUIRE_EQ( CSRA1_ReferenceLength - 7000, (uint64_t) str . size () );
+    REQUIRE_EQ( string("CCTGTCC"), str . substr (0, 7) );
+    REQUIRE_EQ( string("ATCTG"), str . substr (str.size() - 5, 5) );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceBases_OffsetLength_1, CSRA1_Fixture)
+{   // offset points into the first chunk of the reference
+    ngs :: String str = getReference ( "supercont2.1" ). getReferenceBases ( 2000, 10 );
+    REQUIRE_EQ( ngs::String ( "GGGCAAATGA" ), str );
+}
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceBases_OffsetLength_2, CSRA1_Fixture)
+{   // offset points into the second chunk of the reference
+    ngs :: Reference ref = getReference ( "supercont2.1" );
+    ngs :: String str = ref . getReferenceBases ( 9000, 10 );
+    REQUIRE_EQ( ngs::String ( "GCGCTATGAC" ), str );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceChunk_All, CSRA1_Fixture)
+{
+    ngs :: Reference ref = getReference ( "supercont2.1" );
+    ngs :: StringRef str = ref . getReferenceChunk ( 0 );
+    REQUIRE_EQ( (size_t)20000, str . size () );
+    REQUIRE_EQ( string("GAATTCT"), str . substr (0, 7) . toString () );
+    REQUIRE_EQ( string("CATCA"), str . substr (str.size() - 5, 5) . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceChunk_Offset, CSRA1_Fixture)
+{
+    ngs :: Reference ref = getReference ( "supercont2.1" );
+    ngs :: StringRef str = ref . getReferenceChunk ( 1000 );
+    REQUIRE_EQ( (size_t)19000, str . size () );
+    REQUIRE_EQ( string("TCCATTC"), str . substr (0, 7) . toString () );
+    REQUIRE_EQ( string("CATCA"), str . substr (str.size() - 5, 5) . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceChunk_OffsetLength, CSRA1_Fixture)
+{   // offset points into the first chunk of the reference
+    ngs :: Reference ref = getReference ( "supercont2.1" );
+    REQUIRE_EQ( ngs::String ( "GGGCAAATGA" ), ref . getReferenceChunk ( 2000, 10 ) . toString ());
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetAlignment, CSRA1_Fixture)
+{
+    ngs :: Alignment al = getReference ( "supercont2.1" ). getAlignment( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" );
+    REQUIRE_EQ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1", al . getAlignmentId () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetAlignments, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator al = getReference ( "supercont2.1" ). getAlignments ( ngs :: Alignment :: all );
+}
+
+///// ReferenceIterator
+FIXTURE_TEST_CASE(CSRA1_ReferenceIterator_NoObjectBeforeNextOpen, CSRA1_Fixture)
+{
+    ngs :: ReferenceIterator refIt = getReferences();
+    // dereferencing the iterator without calling Next() throws
+    REQUIRE_THROW ( refIt . getCommonName() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReferenceIterator_Open, CSRA1_Fixture)
+{
+    ngs :: ReferenceIterator refIt = getReferences();
+    REQUIRE( refIt . nextReference () );
+    REQUIRE_EQ( string("supercont2.1"), refIt . getCommonName() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReferenceIterator_Next, CSRA1_Fixture)
+{
+    ngs :: ReferenceIterator refIt = getReferences();
+    REQUIRE( refIt . nextReference () );
+    REQUIRE( refIt . nextReference () );
+    REQUIRE_EQ( string("supercont2.2"), refIt . getCommonName() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReferenceIterator_End, CSRA1_Fixture)
+{
+    ngs :: ReferenceIterator refIt = getReferences();
+    string lastName;
+    while (refIt . nextReference ())
+    {
+        lastName = refIt . getCommonName();
+        //cout << " lastName " << refIt . getLength () << endl;
+    }
+    REQUIRE_EQ( string("supercont2.14"), lastName );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReferenceIterator_BeyondEnd, CSRA1_Fixture)
+{
+    ngs :: ReferenceIterator refIt = getReferences();
+    while (refIt . nextReference ())
+    {
+    }
+    REQUIRE_THROW ( refIt . getCommonName(); );
+}
+
+///// Alignment
+//TODO: CG's EVIDENCE?
+//TODO: add tests for missing optional columns
+//TODO: getRNAOrientatation__Present
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getAlignmentId, CSRA1_Fixture)
+{
+    REQUIRE_EQ( ngs :: String ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getAlignmentId() . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getReferenceSpec, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("supercont2.1"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getReferenceSpec () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getMappingQuality, CSRA1_Fixture)
+{
+    REQUIRE_EQ( 60,
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getMappingQuality () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getReferenceBases, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("ACTCGACATTCTGTCTTCGACCTATCTTTCTCCTCTCCCAGTCATCGCCCAGTAGAATTACCAGGCAATGAACCACGGCCTTTCATCCCAACGGCACAGCA"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getReferenceBases () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getReadGroup, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("C1ELY.6"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getReadGroup () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getReadGroup_Empty, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string(""),
+                ncbi :: NGS :: openReadCollection ( CSRA1_NoReadGroups ) . getAlignment ( ngs :: String ( CSRA1_NoReadGroups ) + ".PA.1" ) . getReadGroup () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getReadId, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string ( CSRA1_PrimaryOnly ) + ".R.165753",
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.5" ) . getReadId () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getFragmentId, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string ( CSRA1_PrimaryOnly ) + ".FA0.1",
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getFragmentId () . toString ());
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getFragmentBases, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("TGGATGCTCTGGAAAATCTGAAAAGTGGTGTTTGTAAGGTTTGCTGGCTGCCCATATACCACATGGATGATGGGGCTTTCCATTTTAATGTTGAAGGAGGA"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.4" ) . getFragmentBases () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getFragmentQualities, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("######AA>55;5(;63;;3@;A9??;6..73CDCIDA>DCB>@B=;@B?;;ADAB<DD?1*>@C9:EC?2++A3+F4EEB<E>EEIEDC2?C:;AB+==1"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.4" ) . getFragmentQualities () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getClippedFragmentBases, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("CTTCAACATTAAAATGGAAAGCCCCATCATCCATGTGGTATATGGGCAGCCAGCAAACCTTACAAACACCACTTTTCAGATTTTCCAGAGCATCCA"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.4" ) . getClippedFragmentBases () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getClippedFragmentQualities, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("#AA>55;5(;63;;3@;A9??;6..73CDCIDA>DCB>@B=;@B?;;ADAB<DD?1*>@C9:EC?2++A3+F4EEB<E>EEIEDC2?C:;AB+==1"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.4" ) . getClippedFragmentQualities () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getAlignedFragmentBases, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("AAGGTATGATACCTGAGATGTTGCGGGATGGTGGGTTTGTGAGGAGATGGCCACGCAGGCAAGGTCTTTTGGAATGGTTCACTGTTGGAGTGAACCCATAT"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.2" ) . getFragmentBases () . toString () );
+    REQUIRE_EQ( string("ATATGGGTTCACTCCAACAGTGAACCATTCCAAAAGACCTTGCCTGCGTGGCCATCTCCTCACAAACCCACCATCCCGCAACATCTCAGGTATCATACCTT"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.2" ) . getAlignedFragmentBases () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getAlignmentCategory, CSRA1_Fixture)
+{
+    REQUIRE_EQ( ngs :: Alignment :: primaryAlignment,
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getAlignmentCategory() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getAlignmentPosition, CSRA1_Fixture)
+{
+    REQUIRE_EQ( (int64_t)85, //REF_POS
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getAlignmentPosition () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getReferencePositionProjectionRange, CSRA1_Fixture)
+{
+    uint64_t res = ncbi::NGS::openReadCollection ("SRR1597772").getAlignment("SRR1597772.PA.6").getReferencePositionProjectionRange(11601);
+    REQUIRE( res == 1 );
+
+    res = ncbi::NGS::openReadCollection("SRR1597895").getAlignment("SRR1597895.PA.26088399").getReferencePositionProjectionRange(234668879);
+    REQUIRE( res == (uint64_t)-1 ); // out of bounds
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getReferencePositionProjectionRangeI, CSRA1_Fixture)
+{
+    uint64_t res = ncbi::NGS::openReadCollection ("SRR1597772").getAlignment("SRR1597772.PA.6").getReferencePositionProjectionRange(11692);
+    REQUIRE( res == ((uint64_t)84 << 32 | 5) );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getReferencePositionProjectionRangeD, CSRA1_Fixture)
+{
+    uint64_t res = ncbi::NGS::openReadCollection ("SRR1597772").getAlignment("SRR1597772.PA.6").getReferencePositionProjectionRange(11667);
+    REQUIRE( res == ((uint64_t)65 << 32) );
+    res = ncbi::NGS::openReadCollection ("SRR1597772").getAlignment("SRR1597772.PA.6").getReferencePositionProjectionRange(11669);
+    REQUIRE( res == ((uint64_t)65 << 32) );
+    res = ncbi::NGS::openReadCollection ("SRR1597772").getAlignment("SRR1597772.PA.6").getReferencePositionProjectionRange(11672);
+    REQUIRE( res == ((uint64_t)65 << 32) );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getAlignmentLength, CSRA1_Fixture)
+{
+    REQUIRE_EQ( (uint64_t)101, //REF_LEN or length(RAW_READ)
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getAlignmentLength () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getIsReversedOrientation_False, CSRA1_Fixture)
+{
+    REQUIRE( ! ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getIsReversedOrientation () );
+}
+FIXTURE_TEST_CASE(CSRA1_Alignment_getIsReversedOrientation_True, CSRA1_Fixture)
+{
+    REQUIRE( ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.2" ) . getIsReversedOrientation () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getSoftClip_None, CSRA1_Fixture)
+{
+    REQUIRE_EQ( 0, ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getSoftClip ( ngs :: Alignment :: clipLeft ) );
+    REQUIRE_EQ( 0, ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getSoftClip ( ngs :: Alignment :: clipRight ) );
+}
+FIXTURE_TEST_CASE(CSRA1_Alignment_getSoftClip_Left, CSRA1_Fixture)
+{
+    REQUIRE_EQ( 5, ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.4" ) . getSoftClip ( ngs :: Alignment :: clipLeft ) );
+    REQUIRE_EQ( 0, ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.4" ) . getSoftClip ( ngs :: Alignment :: clipRight ) );
+}
+FIXTURE_TEST_CASE(CSRA1_Alignment_getSoftClip_Right, CSRA1_Fixture)
+{
+    REQUIRE_EQ( 0,  ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.10" ) . getSoftClip ( ngs :: Alignment :: clipLeft ) );
+    REQUIRE_EQ( 13, ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.10" ) . getSoftClip ( ngs :: Alignment :: clipRight ) );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getTemplateLength, CSRA1_Fixture)
+{
+    REQUIRE_EQ( (uint64_t)201,
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getTemplateLength () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getShortCigar_Unclipped, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("5S96M"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.4" ) . getShortCigar ( false ) . toString () );
+}
+FIXTURE_TEST_CASE(CSRA1_Alignment_getShortCigar_Clipped, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("96M"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.4" ) . getShortCigar ( true ) . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getLongCigar_Unclipped, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("5S1X8=1X39=1X46="),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.4" ) . getLongCigar ( false ) . toString () );
+}
+FIXTURE_TEST_CASE(CSRA1_Alignment_getLongCigar_Clipped, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("1X8=1X39=1X46="),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.4" ) . getLongCigar ( true ) . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getRNAOrientation_Missing, CSRA1_Fixture)
+{
+    REQUIRE_EQ( '?',
+                ncbi :: NGS :: openReadCollection ( CSRA1_NoReadGroups ) . getAlignment ( ngs :: String ( CSRA1_NoReadGroups ) + ".PA.1" ) . getRNAOrientation() );
+}
+
+// Mate alignment
+FIXTURE_TEST_CASE(CSRA1_Alignment_hasMate_Primary_NoMate, CSRA1_Fixture)
+{
+    REQUIRE( ! ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.99" ) . hasMate () );
+}
+FIXTURE_TEST_CASE(CSRA1_Alignment_hasMate_Primary_YesMate, CSRA1_Fixture)
+{
+    REQUIRE( ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . hasMate () );
+}
+FIXTURE_TEST_CASE(CSRA1_Alignment_hasMate_Secondary, CSRA1_Fixture)
+{
+    REQUIRE( ! ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary ) . getAlignment ( ngs :: String ( CSRA1_WithSecondary ) + ".SA.169" ) . hasMate () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getMateAlignmentId_Primary, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string ( CSRA1_PrimaryOnly ) + ".PA.2",
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getMateAlignmentId () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getMateAlignmentId_Missing, CSRA1_Fixture)
+{
+    REQUIRE_THROW ( ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.99" ) . getMateAlignmentId (); );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getMateAlignmentId_SecondaryThrows, CSRA1_Fixture)
+{
+    REQUIRE_THROW( ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary ) . getAlignment ( ngs :: String ( CSRA1_WithSecondary ) + ".SA.172" ) . getMateAlignmentId (); );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getMateAlignment, CSRA1_Fixture)
+{
+    ngs :: Alignment al = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getMateAlignment ();
+    REQUIRE_EQ ( string ( CSRA1_PrimaryOnly ) + ".PA.2", al . getAlignmentId () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getMateAlignment_Missing, CSRA1_Fixture)
+{
+    REQUIRE_THROW ( ngs :: Alignment al = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( "99" ) . getMateAlignment (); );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getMateAlignment_SecondaryThrows, CSRA1_Fixture)
+{
+    REQUIRE_THROW( ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary ) . getAlignment ( ngs :: String ( CSRA1_WithSecondary ) + ".SA.169" ) . getMateAlignment (); );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getMateReferenceSpec, CSRA1_Fixture)
+{
+    REQUIRE_EQ( string("supercont2.1"),
+                ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getMateReferenceSpec () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_getMateIsReversedOrientation_True, CSRA1_Fixture)
+{
+    REQUIRE( ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" ) . getMateIsReversedOrientation () );
+}
+FIXTURE_TEST_CASE(CSRA1_Alignment_getMateIsReversedOrientation_False, CSRA1_Fixture)
+{
+    REQUIRE( ! ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.2" ) . getMateIsReversedOrientation () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_isPaired_MultiFragmentsPerSpot, CSRA1_Fixture)
+{
+    ngs :: ReadCollection readCollection = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly );
+    ngs :: Alignment alignment = readCollection . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.1" );
+    REQUIRE_EQ( true, alignment.isPaired() );
+
+    alignment = readCollection . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.2" );
+    REQUIRE_EQ( true, alignment.isPaired() );
+
+    // has unaligned mate
+    alignment = readCollection . getAlignment ( ngs :: String ( CSRA1_PrimaryOnly ) + ".PA.6" );
+    REQUIRE_EQ( true, alignment.isPaired() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Alignment_isPaired_SingleFragmentPerSpot, CSRA1_Fixture)
+{
+    ngs :: ReadCollection readCollection = ncbi :: NGS :: openReadCollection ( CSRA1_SingleFragmentPerSpot );
+    ngs :: Alignment alignment = readCollection . getAlignment ( ngs :: String ( CSRA1_SingleFragmentPerSpot ) + ".PA.1" );
+    REQUIRE_EQ( false, alignment.isPaired() );
+}
+
+
+///// AlignmentIterator from ReadCollection
+//TODO: CG's EVIDENCE?
+
+FIXTURE_TEST_CASE(CSRA1_AlignmentIterator_NoAlignmentBeforeNext, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator it = getAlignments ();
+    REQUIRE_THROW( it . getAlignmentId () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_AlignmentIterator_PrimaryOnOpen, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator it = getAlignments ();
+    REQUIRE( it . nextAlignment () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_WithSecondary ) + ".PA.1", it . getAlignmentId () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_AlignmentIterator_Next, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator it = getAlignments ();
+    REQUIRE( it . nextAlignment () );
+    REQUIRE( it . nextAlignment () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_WithSecondary ) + ".PA.2", it . getAlignmentId () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_AlignmentIterator_Next_Switch_To_Secondary, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator it = ncbi :: NGS :: openReadCollection ( CSRA1_WithSecondary ) . getAlignmentRange ( 168, 2, ngs :: Alignment :: all );
+    REQUIRE( it . nextAlignment () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_WithSecondary ) + ".PA.168", it . getAlignmentId () . toString () );
+    REQUIRE( it . nextAlignment () );
+    REQUIRE_EQ( ngs :: String ( CSRA1_WithSecondary ) + ".SA.169", it . getAlignmentId () . toString () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_AlignmentIterator_BeyondEnd, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator it = getAlignments ();
+    while ( it . nextAlignment() )
+    {
+    }
+    REQUIRE_THROW ( it . getAlignmentId (); );
+}
+
+FIXTURE_TEST_CASE(CSRA1_AlignmentIterator_Empty, CSRA1_Fixture)
+{
+    // the next line should not throw
+    ngs :: AlignmentIterator it = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getAlignments ( ngs :: Alignment :: secondaryAlignment );
+    REQUIRE_THROW ( it . getAlignmentId(); );
+}
+
+FIXTURE_TEST_CASE(CSRA1_AlignmentIterator_Primary, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator it = getAlignments ( ngs :: Alignment :: primaryAlignment );
+    REQUIRE( it . nextAlignment() );
+    size_t count = 1;
+    while ( it . nextAlignment() )
+    {
+        REQUIRE_EQ( ngs :: Alignment :: primaryAlignment, it . getAlignmentCategory() );
+        ++count;
+        ostringstream str;
+        str << CSRA1_WithSecondary << ".PA." << count;
+        REQUIRE_EQ( str . str (), it . getAlignmentId() . toString () );
+    }
+    REQUIRE_EQ( (size_t)168, count);
+}
+
+FIXTURE_TEST_CASE(CSRA1_AlignmentIterator_Secondary, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator it = getAlignments ( ngs :: Alignment :: secondaryAlignment );
+    REQUIRE( it . nextAlignment() );
+    size_t count = 0;
+    while ( it . nextAlignment() )
+    {
+        REQUIRE_EQ( ngs :: Alignment :: secondaryAlignment, it . getAlignmentCategory() );
+        ++count;
+    }
+    REQUIRE_EQ( (size_t)9, count);
+}
+
+FIXTURE_TEST_CASE(CSRA1_AlignmentIterator_All, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator it = getAlignments ( ngs :: Alignment :: all );
+    REQUIRE( it . nextAlignment() );
+    size_t count = 1;
+    while ( it . nextAlignment() )
+    {
+        if ( it . getAlignmentCategory()  == ngs :: Alignment :: secondaryAlignment )
+        {
+            break;
+        }
+        ++count;
+    }
+    REQUIRE_EQ( (size_t)168, count);
+    /* switched over to secondary alignments */
+    while ( it . nextAlignment() )
+    {
+        REQUIRE_EQ( ngs :: Alignment :: secondaryAlignment, it . getAlignmentCategory() );
+        ++count;
+    }
+    REQUIRE_EQ( (size_t)177, count);
+}
+
+///// AlignmentIterator from Reference (ReferenceWindow)
+FIXTURE_TEST_CASE(CSRA1_ReferenceWindow, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator it = NgsFixture :: getReference ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" )
+                                                             . getAlignments ( ngs :: Alignment :: all );
+    REQUIRE ( it . nextAlignment () );
+
+    // the first 2 secondary alignments' locations on the list: #34, #61
+    size_t count = 1;
+    while ( it . nextAlignment() )
+    {
+        if ( it . getAlignmentCategory()  == ngs :: Alignment :: secondaryAlignment )
+            break;
+        ++count;
+    }
+    REQUIRE_EQ( (size_t)34, count);
+    while ( it . nextAlignment() )
+    {
+        if ( it . getAlignmentCategory()  == ngs :: Alignment :: secondaryAlignment )
+            break;
+        ++count;
+    }
+    REQUIRE_EQ( (size_t)61, count);
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReferenceWindow_Slice, CSRA1_Fixture)
+{
+    ngs :: AlignmentIterator it = NgsFixture :: getReference ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" )
+                                                             . getAlignmentSlice ( 516000, 100000 );
+
+    REQUIRE ( it . nextAlignment () );
+    REQUIRE_EQ ( ngs :: String ( CSRA1_WithSecondary ) + ".PA.33", it. getAlignmentId () . toString () );
+    REQUIRE ( it . nextAlignment () );
+    REQUIRE_EQ ( ngs :: String ( CSRA1_WithSecondary ) + ".PA.34", it. getAlignmentId () . toString () );
+    REQUIRE ( it . nextAlignment () );
+    REQUIRE_EQ ( ngs :: String ( CSRA1_WithSecondary ) + ".SA.169", it. getAlignmentId () . toString () );
+    REQUIRE ( it . nextAlignment () );
+    REQUIRE_EQ ( ngs :: String ( CSRA1_WithSecondary ) + ".PA.35", it. getAlignmentId () . toString () );
+
+    REQUIRE ( ! it . nextAlignment () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReferenceWindow_Slice_Filtered_Start_Within_Slice, CSRA1_Fixture)
+{
+    ngs :: Reference ref = ncbi :: NGS :: openReadCollection ( CSRA1_WithCircularRef ) . getReference ( "NC_012920.1" );
+    int64_t sliceStart = 1000;
+    ngs :: AlignmentIterator it = ref . getFilteredAlignmentSlice ( sliceStart, 200, ngs :: Alignment :: all, ngs :: Alignment :: startWithinSlice, 0 );
+
+    REQUIRE ( it . nextAlignment () );
+    REQUIRE_LE ( sliceStart, it.getAlignmentPosition() );
+}
+FIXTURE_TEST_CASE(CSRA1_ReferenceWindow_Slice_Unfiltered_Start_Before_Slice, CSRA1_Fixture)
+{
+    ngs :: Reference ref = ncbi :: NGS :: openReadCollection ( CSRA1_WithCircularRef ) . getReference ( "NC_012920.1" );
+    int64_t sliceStart = 1000;
+    ngs :: AlignmentIterator it = ref . getFilteredAlignmentSlice ( sliceStart, 200, ngs :: Alignment :: all, (ngs::Alignment::AlignmentFilter)0, 0 );
+
+    REQUIRE ( it . nextAlignment () );
+    REQUIRE_GT ( sliceStart, it.getAlignmentPosition() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReferenceWindow_Slice_Filtered_Wraparound, CSRA1_Fixture)
+{
+    ngs :: Reference ref = ncbi :: NGS :: openReadCollection ( CSRA1_WithCircularRef2 ) . getReference ( "chrM" );
+    int64_t sliceStart = 5;
+    ngs :: AlignmentIterator it = ref . getFilteredAlignmentSlice ( sliceStart, 100, ngs :: Alignment :: all, (ngs::Alignment::AlignmentFilter)0, 0 );
+
+    REQUIRE ( it . nextAlignment () );
+
+    // the first returned alignment starts before the start of the circular reference, overlaps with slice
+    int64_t pos = it.getAlignmentPosition();
+    REQUIRE_LT ( sliceStart + 100, pos );
+
+    // check for overlap with the slice
+    uint64_t refLen = ref . getLength();
+    pos -= ( int64_t ) refLen;
+    REQUIRE_GT ( ( int64_t ) 0, pos );
+    REQUIRE_GE ( ( int64_t ) (pos + it . getAlignmentLength()), sliceStart );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReferenceWindow_Slice_Filtered_Wraparound_StartWithinSlice, CSRA1_Fixture)
+{
+    // when startWithinSlice filter is specified, it removes wraparound alignments as well
+    ngs :: Reference ref = ncbi :: NGS :: openReadCollection ( CSRA1_WithCircularRef2 ) . getReference ( "chrM" );
+    int64_t sliceStart = 5;
+    ngs :: AlignmentIterator it = ref . getFilteredAlignmentSlice ( sliceStart, 100, ngs :: Alignment :: all, ngs :: Alignment :: startWithinSlice, 0 );
+
+    REQUIRE ( it . nextAlignment () );
+
+    // the first returned alignment starts inside the slice
+    int64_t pos = it.getAlignmentPosition();
+    REQUIRE_LE ( sliceStart, pos );
+    REQUIRE_LT ( pos, sliceStart + 100 );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReferenceWindow_Slice_Filtered_NoWraparound, CSRA1_Fixture)
+{
+    // when startWithinSlice filter is specified, it removes wraparound alignments as well
+    ngs :: Reference ref = ncbi :: NGS :: openReadCollection ( CSRA1_WithCircularRef2 ) . getReference ( "chrM" );
+    int64_t sliceStart = 5;
+    ngs :: AlignmentIterator it = ref . getFilteredAlignmentSlice ( sliceStart, 100, ngs :: Alignment :: all, ngs :: Alignment :: noWraparound, 0 );
+
+    REQUIRE ( it . nextAlignment () );
+
+    // the first returned sliceStart starts outside the slice but does not wrap around
+    REQUIRE_GT ( sliceStart, it.getAlignmentPosition() );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReferenceWindow_Slice_Filtered_NoWraparound_StartWithinSlice, CSRA1_Fixture)
+{
+    // when startWithinSlice filter is specified, it removes wraparound alignments as well
+    ngs :: Reference ref = ncbi :: NGS :: openReadCollection ( CSRA1_WithCircularRef2 ) . getReference ( "chrM" );
+    int64_t sliceStart = 5;
+    ngs :: AlignmentIterator it = ref . getFilteredAlignmentSlice ( sliceStart, 100, ngs :: Alignment :: all, (ngs::Alignment::AlignmentFilter) (ngs :: Alignment :: noWraparound | ngs :: Alignment :: startWithinSlice), 0 );
+
+    REQUIRE ( it . nextAlignment () );
+
+    // the first returned alignment starts inside the slice
+    int64_t pos = it.getAlignmentPosition();
+    REQUIRE_LE ( sliceStart, pos );
+    REQUIRE_LT ( pos, sliceStart + 100 );
+}
+
+FIXTURE_TEST_CASE(CSRA1_Filter_SEQ_SPOT_ID_0, CSRA1_Fixture)
+{
+    // we should filter out secondary alignments with SEQ_SPOT_ID == 0
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( "seq_spot_id_0.sra" );
+    ngs :: Reference reference = run . getReference ( "NC_016088.2" );
+
+    ngs :: AlignmentIterator alignmentIterator = run.getAlignmentRange ( 145, 2, ngs :: Alignment :: all );
+
+    REQUIRE ( alignmentIterator.nextAlignment() );
+    REQUIRE_EQ ( ngs :: String ( "seq_spot_id_0.PA.145" ), alignmentIterator . getAlignmentId() . toString () );
+    REQUIRE ( !alignmentIterator.nextAlignment() );
+
+    alignmentIterator = reference . getFilteredAlignmentSlice ( 29446335, 10, ngs :: Alignment :: all, ngs :: Alignment :: startWithinSlice, 0 );
+    REQUIRE ( !alignmentIterator.nextAlignment() );
+
+    REQUIRE_THROW ( run . getAlignment ( "seq_spot_id_0.SA.146" ) );
+    REQUIRE_THROW ( reference . getAlignment ( "seq_spot_id_0.SA.146" ) );
+}
+
+/////TODO: Pileup
+//TODO: getReferenceSpec
+//TODO: getReferencePosition
+//TODO: getPileupEvents
+//TODO: getPileupDepth
+
+/////TODO: PileupIterator
+
+/////TODO: PileupEvent
+//TODO: getReferenceSpec
+//TODO: getReferencePosition
+//TODO: getMappingQuality
+//TODO: getAlignmentId
+//TODO: getAlignment
+//TODO: getAlignmentPosition
+//TODO: getFirstAlignmentPosition
+//TODO: getLastAlignmentPosition
+//TODO: getEventType
+//TODO: getAlignmentBase
+//TODO: getAlignmentQuality
+//TODO: getInsertionBases
+//TODO: getInsertionQualities
+//TODO: getDeletionCount
+
+/////TODO: PileupEventIterator
+
+///// ReadGroup
+FIXTURE_TEST_CASE(CSRA1_ReadGroup_GetName, CSRA1_Fixture)
+{
+    ngs :: ReadGroup rg = ncbi :: NGS :: openReadCollection ( CSRA1_PrimaryOnly ) . getReadGroup ( "C1ELY.6" );
+    REQUIRE_EQ ( ngs :: String("C1ELY.6"), rg . getName () );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadGroup_HasReadGroup, CSRA1_Fixture)
+{
+    REQUIRE ( ncbi::NGS::openReadCollection( CSRA1_PrimaryOnly ).hasReadGroup( "C1ELY.6" ) );
+    REQUIRE ( ! ncbi::NGS::openReadCollection( CSRA1_PrimaryOnly ).hasReadGroup( "non-existent read group" ) );
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadGroup_GetStatistics, CSRA1_Fixture)
+{
+    ngs :: ReadGroup rg = ncbi :: NGS :: openReadCollection ( CSRA1_WithGroups ) . getReadGroup ( "GS57510-FS3-L03" );
+    ngs :: Statistics stats = rg . getStatistics ();
+
+    REQUIRE_EQ ( (uint64_t)34164461870, stats . getAsU64 ( "BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)34164461870, stats . getAsU64 ( "BIO_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)488063741,   stats . getAsU64 ( "SPOT_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)5368875807,  stats . getAsU64 ( "SPOT_MAX" ) );
+    REQUIRE_EQ ( (uint64_t)4880812067,  stats . getAsU64 ( "SPOT_MIN" ) );
+}
+
+/////TODO: ReadGroupIterator
+FIXTURE_TEST_CASE(CSRA1_ReadGroupIterator_AfterNext, CSRA1_Fixture)
+{
+    ngs :: ReadGroupIterator rg = ncbi :: NGS :: openReadCollection ( "ERR730927" ) . getReadGroups ();
+    REQUIRE ( rg . nextReadGroup () );
+    REQUIRE_EQ ( string ( "1#72" ),  rg . getName () );
+}
+
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs_csra1-c++";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=NgsCsra1CppTestSuite(argc, argv);
+    return rc;
+}
+
+}
+
diff --git a/test/ngs-c++/Makefile b/test/ngs-c++/Makefile
new file mode 100644
index 0000000..fc5fabf
--- /dev/null
+++ b/test/ngs-c++/Makefile
@@ -0,0 +1,139 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/ngs-c++
+
+TEST_TOOLS = \
+    test-ngs_sra-c++ \
+    test-ngs_sradb-c++ \
+    test-ngs_csra1-c++ \
+	test-ngs_csra1pileup-c++ \
+
+
+include $(TOP)/build/Makefile.env
+
+ifeq (,$(NGS_LIBDIR))
+
+$(TEST_TOOLS):
+	@true
+
+runtests:
+	@ echo "NGS C++ tests are not run since NGS library does not appear to be installed"
+
+else
+
+
+# make sure runs are not cached in the user repository when running tests
+ifeq ($(wildcard ../../../asm-trace),)
+	ifeq (,$(VDB_CONFIG))
+		VDB_CONFIG = $(shell pwd)/../only-remote-repository.kfg
+	endif
+endif
+
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# common defs
+#
+INCDIRS += -I$(NGS_INCDIR)
+
+TEST_NGS_CPP_LIB = \
+	-sncbi-ngs-c++ \
+	-sncbi-vdb \
+	-skapp \
+    -sktst \
+    -L$(NGS_LIBDIR) \
+	-sngs-c++ \
+
+#-------------------------------------------------------------------------------
+# test-ngs_sra-c++
+#
+TEST_NGS_SRA_CPP_SRC = \
+	SRAtest
+
+TEST_NGS_SRA_CPP_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_SRA_CPP_SRC))
+
+$(TEST_BINDIR)/test-ngs_sra-c++: $(TEST_NGS_SRA_CPP_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_CPP_LIB)
+
+sra: test-ngs_sra-c++
+	$(TEST_BINDIR)/$^
+
+#-------------------------------------------------------------------------------
+# test-ngs_sradb-c++
+#
+TEST_NGS_SRADB_CPP_SRC = \
+	SRADBtest
+
+TEST_NGS_SRADB_CPP_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_SRADB_CPP_SRC))
+
+$(TEST_BINDIR)/test-ngs_sradb-c++: $(TEST_NGS_SRADB_CPP_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_CPP_LIB)
+
+sradb: test-ngs_sradb-c++
+	$(TEST_BINDIR)/$^
+
+#-------------------------------------------------------------------------------
+# test-ngs_csra1-c++
+#
+TEST_NGS_CSRA1_CPP_SRC = \
+	CSRA1test
+
+TEST_NGS_CSRA1_CPP_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_CSRA1_CPP_SRC))
+
+$(TEST_BINDIR)/test-ngs_csra1-c++: $(TEST_NGS_CSRA1_CPP_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_CPP_LIB)
+
+csra1: test-ngs_csra1-c++
+	$(TEST_BINDIR)/$^
+
+#-------------------------------------------------------------------------------
+# test-ngs_csra1pileup-c++
+#
+TEST_NGS_CSRA1PILEUP_CPP_SRC = \
+	CSRA1PileupTest
+
+TEST_NGS_CSRA1PILEUP_CPP_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_CSRA1PILEUP_CPP_SRC))
+
+$(TEST_BINDIR)/test-ngs_csra1pileup-c++: $(TEST_NGS_CSRA1PILEUP_CPP_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_CPP_LIB)
+
+pileup: test-ngs_csra1pileup-c++
+	$(TEST_BINDIR)/$^
+
+endif
diff --git a/test/ngs-c++/NGStest.cpp b/test/ngs-c++/NGStest.cpp
new file mode 100644
index 0000000..40aa964
--- /dev/null
+++ b/test/ngs-c++/NGStest.cpp
@@ -0,0 +1,71 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS interface
+*/
+
+#include <ngs/StringRef.hpp>
+
+#include <ktst/unit_test.hpp>
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsCppTestSuite);
+
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs-c++";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t rc=NgsCppTestSuite(argc, argv);
+    return rc;
+}
+
+}
+
+
diff --git a/test/ngs-c++/SRADBtest.cpp b/test/ngs-c++/SRADBtest.cpp
new file mode 100644
index 0000000..49a00e4
--- /dev/null
+++ b/test/ngs-c++/SRADBtest.cpp
@@ -0,0 +1,536 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS interface, SRA DB based implementation
+*/
+
+#include "ngsfixture.hpp"
+
+#include <ngs/Statistics.hpp>
+
+#include <klib/text.h>
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsSradbCppTestSuite);
+
+class SRADBFixture : public NgsFixture
+{
+public:
+    static const char* SRADB_Accession;
+    
+public:
+    SRADBFixture()
+    {
+    }
+    ~SRADBFixture()
+    {
+    }
+
+    ngs :: ReadIterator getReads ( ngs :: Read :: ReadCategory cat = ngs :: Read :: all )
+    {
+        return NgsFixture :: getReads ( SRADB_Accession, cat ); 
+    }
+    ngs :: Read getRead ( const ngs :: String& p_id)
+    {
+        return NgsFixture :: getRead ( SRADB_Accession, p_id ); 
+    }
+    ngs :: Read getFragment (const ngs :: String& p_readId, uint32_t p_fragIdx)
+    {
+        return NgsFixture :: getFragment ( SRADB_Accession, p_readId, p_fragIdx );
+    }
+    ngs :: Reference getReference ( const char* spec )
+    {
+        return NgsFixture :: getReference ( SRADB_Accession, spec ); 
+    }
+};
+const char* SRADBFixture::SRADB_Accession = "SRR600096";
+
+///// ReadCollection
+//TODO: getReadRange (categories)
+//TODO: getReadCount (categories)
+//TODO: getReadGroups
+//TODO: error cases
+
+
+TEST_CASE (SRADB_ReadCollection_GetName)
+{
+    ngs::String name1, name2;
+    {
+        ngs::ReadCollection run = ncbi::NGS::openReadCollection ("./SRR600096");
+        name1 = run.getName();
+        char const* pNoSlash = string_rchr( name1.c_str(), name1.length(), '/' );
+        REQUIRE ( pNoSlash == NULL );
+    }
+    {
+        ngs::ReadCollection run = ncbi::NGS::openReadCollection ("SRR600096");
+        name2 = run.getName();
+    }
+    REQUIRE_EQ ( name1, name2 );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_Open, SRADBFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRADB_Accession );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_Open_Failed, SRADBFixture)
+{
+    REQUIRE_THROW ( ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( string(SRADB_Accession) + "_BS" ) );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReads, SRADBFixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReads ( ngs :: Read :: all ); 
+} 
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReads_Filtered, SRADBFixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReads ( ngs :: Read :: unaligned ); 
+} 
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReadRange, SRADBFixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReadRange ( 100, 200 ); 
+} 
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetRead, SRADBFixture)
+{
+    ngs :: Read read = getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ); 
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetRead_Failed, SRADBFixture)
+{
+    REQUIRE_THROW ( ngs :: Read read = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getRead ( "notthere" ) );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReference_Failed, SRADBFixture)
+{
+    REQUIRE_THROW ( ngs :: Reference ref = getReference ( "anything" ) );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_ReadCount, SRADBFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRADB_Accession );
+    REQUIRE_EQ( (uint64_t)16, run . getReadCount() ); 
+}    
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_Getreferences, SRADBFixture)
+{
+    ngs :: ReferenceIterator refIt = NgsFixture :: getReferences ( SRADB_Accession );  // always an empty iterator
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetAlignment, SRADBFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRADB_Accession );
+    REQUIRE_THROW ( ngs :: Alignment align = run . getAlignment ( "1" ) );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetAlignmentCount, SRADBFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRADB_Accession );
+    REQUIRE_EQ( (uint64_t)0, run . getAlignmentCount() );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetAlignmentCountFiltered, SRADBFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRADB_Accession );
+    REQUIRE_EQ( (uint64_t)0, run . getAlignmentCount( ngs :: Alignment :: all ) );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetAlignmentRange, SRADBFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRADB_Accession );
+    REQUIRE ( ! run . getAlignmentRange ( 1, 2 ) . nextAlignment () );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetAlignmentRangeFiltered, SRADBFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRADB_Accession );
+    REQUIRE ( ! run . getAlignmentRange ( 1, 2, ngs :: Alignment :: all ) . nextAlignment () );
+}
+
+///// Read
+//TODO: error cases
+
+FIXTURE_TEST_CASE(SRADB_Read_ReadId, SRADBFixture)
+{
+    REQUIRE_EQ( ngs :: String ( SRADB_Accession ) + ".R.1", getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ) . getReadId() . toString () ); 
+}
+
+FIXTURE_TEST_CASE(SRADB_Read_ReadName, SRADBFixture)
+{
+    REQUIRE_EQ( string ( "1" ), getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ) . getReadName() . toString() );
+}
+
+FIXTURE_TEST_CASE(SRADB_Read_ReadGroup, SRADBFixture)
+{
+    REQUIRE_EQ( ngs :: String("A1DLC.1"), getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ). getReadGroup() );
+}
+
+FIXTURE_TEST_CASE(SRADB_Read_getNumFragments, SRADBFixture)
+{
+    REQUIRE_EQ( ( uint32_t ) 2, getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ) . getNumFragments() ); 
+}
+
+FIXTURE_TEST_CASE(SRADB_Read_ReadCategory, SRADBFixture)
+{
+    REQUIRE_EQ( ngs :: Read :: unaligned, getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ). getReadCategory() );
+}
+
+FIXTURE_TEST_CASE(SRADB_Read_getReadBases, SRADBFixture)
+{
+    ngs :: String bases = getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ) . getReadBases () . toString (); 
+    ngs :: String expected(
+        "TACGGAGGGGGCTAGCGTTGCTCGGAATTACTGGGCGTAAAGGGCGCGTAGGCGGACAGTTAAGTCGGGGGTGAAAGCCCCGGGCTCAACCTCGGAATTG"
+        "CCTTCGATACTGGCTGGCTTGAGTACGGTAGAGGGGGGTGGAACTCCTAGTGTAGAGGTGAAATTCGTAGAGATTCCTGTTTGCTCCCCACGCTTTCGCG"
+        "CCTCAGCGTCAGTAACGGTCCAGTGTGTCGCCTTCGCCACTGGTACTCTTCCTGCTATCTACGCATCTCATTCTACACACGTCGCGCGCCACACCTCTCT"
+        "AACACACGTGACACAGCCACTCTCTGCCGTTACTTCGCTGCTCTGCCGCC"
+    );
+    REQUIRE_EQ( expected, bases );    
+}
+
+FIXTURE_TEST_CASE(SRADB_Read_getSubReadBases_Offset, SRADBFixture)
+{
+    ngs :: String bases = getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ) . getReadBases ( 300 ) . toString( ); 
+    ngs :: String expected("AACACACGTGACACAGCCACTCTCTGCCGTTACTTCGCTGCTCTGCCGCC");
+    REQUIRE_EQ( expected, bases );    
+}
+
+FIXTURE_TEST_CASE(SRADB_Read_getSubReadBases_OffsetLength, SRADBFixture)
+{
+    ngs :: String bases = getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ) . getReadBases ( 300, 6 ) . toString (); 
+    ngs :: String expected("AACACA");
+    REQUIRE_EQ( expected, bases );    
+}
+
+FIXTURE_TEST_CASE(SRADB_Read_getReadQualities, SRADBFixture)
+{
+    ngs :: String quals = getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ) . getReadQualities() . toString (); 
+    ngs :: String expected(
+        "====,<==@7<@<@@@CEE=CCEECCEEEEFFFFEECCCEEF=EEDDCCDCEEDDDDDEEEEDDEE*=))9;;=EE(;?E(4;<<;<<EEEE;--'9<;?"
+        "EEE=;E=EE<E=EE<9(9EE;(6<?E#################################################?????BBBBDDDDDBBDEEFFFEE7"
+        "CHH58E=EECCEG///75,5CF-5A5-5C at FEEDFDEE:E--55----5,@@@,,5,5@=?7?#####################################"
+        "##################################################"
+    );
+    REQUIRE_EQ( expected, quals );    
+}
+
+FIXTURE_TEST_CASE(SRADB_Read_getSubReadQualities_Offset, SRADBFixture)
+{
+    ngs :: String quals = getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ) . getReadQualities( 300 ) . toString (); 
+    ngs :: String expected("##################################################");
+    REQUIRE_EQ( expected, quals );    
+}
+
+FIXTURE_TEST_CASE(SRADB_Read_getSubReadQualities_OffsetLength, SRADBFixture)
+{
+    ngs :: String quals = getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" ) . getReadQualities( 200, 10 ) . toString (); 
+    ngs :: String expected("CHH58E=EEC");
+    REQUIRE_EQ( expected, quals );    
+}
+
+///// ReadIterator
+//TODO: read category selection
+//TODO: range on a collection that represents a slice (read[0].id != 1)
+//TODO: range and filtering
+//TODO: empty range 
+//TODO: ReadIterator over a ReadGroup (use a ReadGroup that is not immediately at the beginning of the run)
+//TODO: ReadIterator over a ReadIterator, to allow creation of a sub-iterator
+//TODO: ReadIterator returning less than the range requested
+//TODO: error cases (?)
+FIXTURE_TEST_CASE(SRADB_ReadIterator_NoReadBeforeNext, SRADBFixture)
+{
+    ngs :: ReadIterator readIt = getReads (); 
+    // accessing the read through an iterator before a call to nextRead() throws
+    REQUIRE_THROW ( readIt . getReadId() );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadIterator_Open_All, SRADBFixture)
+{
+    ngs :: ReadIterator readIt = getReads (); 
+    REQUIRE( readIt . nextRead () );
+    
+    REQUIRE_EQ( ngs :: String ( ngs :: String ( SRADB_Accession ) + ".R.1" ), readIt . getReadId() . toString() ); 
+}
+
+#if SHOW_UNIMPLEMENTED
+FIXTURE_TEST_CASE(SRADB_ReadIterator_Open_Filtered, SRADBFixture)
+{
+    ngs :: ReadIterator readIt = getReads ( ngs :: Read :: partiallyAligned ); 
+    REQUIRE( readIt . nextRead () );
+
+    REQUIRE_EQ( ngs :: String ( SRADB_Accession ) + ".R.5", readIt . getReadId() . toString () ); 
+}
+#endif
+
+FIXTURE_TEST_CASE(SRADB_ReadIterator_Next, SRADBFixture)
+{
+    ngs :: ReadIterator readIt = getReads (); 
+    REQUIRE( readIt . nextRead () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRADB_Accession ) + ".R.2", readIt . getReadId() . toString() ); 
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadIterator_End, SRADBFixture)
+{
+    ngs :: ReadIterator readIt = getReads (); 
+    ngs :: String lastId;
+    while (readIt . nextRead ())
+    {
+        lastId = readIt . getReadId() . toString ();
+    }
+    REQUIRE_EQ( ngs :: String ( SRADB_Accession ) + ".R.16", lastId ); 
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadIterator_BeyondEnd, SRADBFixture)
+{
+    ngs :: ReadIterator readIt = getReads (); 
+    while (readIt . nextRead ())
+    {
+    }
+    REQUIRE_THROW ( readIt . getReadId() );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadIterator_Range, SRADBFixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReadRange ( 10, 5 ); 
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRADB_Accession ) + ".R.10", readIt . getReadId() . toString() ); 
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRADB_Accession ) + ".R.11", readIt . getReadId() . toString() ); 
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRADB_Accession ) + ".R.12", readIt . getReadId() . toString() ); 
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRADB_Accession ) + ".R.13", readIt . getReadId() . toString() ); 
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRADB_Accession ) + ".R.14", readIt . getReadId() . toString() ); 
+    REQUIRE( ! readIt . nextRead () );
+}
+
+
+///// Fragment
+//TODO: error cases
+FIXTURE_TEST_CASE(SRADB_Fragment_NoFragmentBeforeNext, SRADBFixture)
+{
+    ngs :: Read read = getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" );
+    REQUIRE_THROW( read . getFragmentId() );
+}
+
+FIXTURE_TEST_CASE(SRADB_Fragment_Id, SRADBFixture)
+{
+    ngs :: Read read = getRead ( ngs :: String ( SRADB_Accession ) + ".R.1" );
+    REQUIRE ( read . nextFragment() );
+    REQUIRE_EQ( ngs :: String ( SRADB_Accession ) + ".FR0.1",  read . getFragmentId() . toString () );
+}
+
+FIXTURE_TEST_CASE(SRADB_WGS_Fragment_Id, SRADBFixture)
+{
+    ngs :: Read read = NgsFixture :: getRead ( "ALWZ01", ngs :: String ( "ALWZ01" ) + ".R.1" );
+    REQUIRE ( read . nextFragment() );
+    REQUIRE_EQ( ngs :: String ( "ALWZ01" ) + ".FR0.1",  read . getFragmentId() . toString () );
+}
+
+FIXTURE_TEST_CASE(SRADB_Fragment_getFragmentBases, SRADBFixture)
+{
+    ngs :: String expected(
+        "CCTGTTTGCTCCCCACGCTTTCGCGCCTCAGCGTCAGTAACGGTCCAGTGTGTCGCCTTCGCCACTGGTACTCTTCCTGCTATCTACGCATCTCATTCTA"
+        "CACACGTCGCGCGCCACACCTCTCTAACACACGTGACACAGCCACTCTCTGCCGTTACTTCGCTGCTCTGCCGCC"
+    );
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( SRADB_Accession ) + ".R.1", 2 ) . getFragmentBases () . toString () );    
+}
+
+FIXTURE_TEST_CASE(SRADB_Fragment_getSubFragmentBases_Offset, SRADBFixture)
+{
+    ngs :: String expected("CACACGTCGCGCGCCACACCTCTCTAACACACGTGACACAGCCACTCTCTGCCGTTACTTCGCTGCTCTGCCGCC");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( SRADB_Accession ) + ".R.1", 2 ) . getFragmentBases ( 100 ) . toString () );    
+}
+
+FIXTURE_TEST_CASE(SRADB_Fragment_getSubFragmentBases_OffsetLength, SRADBFixture)
+{
+    ngs :: String expected("CACACG");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( SRADB_Accession ) + ".R.1", 2 ) . getFragmentBases ( 100, 6 ) . toString () );    
+}
+
+FIXTURE_TEST_CASE(SRADB_Fragment_getFragmentQualities, SRADBFixture)
+{
+    ngs :: String expected(
+        "?????BBBBDDDDDBBDEEFFFEE7CHH58E=EECCEG///75,5CF-5A5-5C at FEEDFDEE:E--55----5,@@@,,5,5@=?7?############"
+        "###########################################################################"
+    );
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( SRADB_Accession ) + ".R.1", 2 ) . getFragmentQualities () . toString () );    
+}
+
+FIXTURE_TEST_CASE(SRADB_Fragment_getSubFragmentQualities_Offset, SRADBFixture)
+{
+    ngs :: String expected("###########################################################################");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( SRADB_Accession ) + ".R.1", 2 ) . getFragmentQualities ( 100 ) . toString () );    
+}
+
+FIXTURE_TEST_CASE(SRADB_Fragment_getSubFragmentQualities_OffsetLength, SRADBFixture)
+{
+    ngs :: String expected("5,5@=?");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( SRADB_Accession ) + ".R.1", 2 ) . getFragmentQualities ( 80, 6 ) . toString () );    
+}
+
+/////ReferenceIterator
+FIXTURE_TEST_CASE(SRADB_ReferenceIterator_Open, SRADBFixture)
+{
+    ngs :: ReferenceIterator refIt = NgsFixture :: getReferences ( SRADB_Accession );  // always an empty iterator
+    REQUIRE_THROW ( refIt . getCommonName() );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReferenceIterator_Next, SRADBFixture)
+{
+    ngs :: ReferenceIterator refIt = NgsFixture :: getReferences ( SRADB_Accession );  // always an empty iterator
+    REQUIRE( ! refIt . nextReference () );
+}
+
+/////AlignmentIterator
+FIXTURE_TEST_CASE(SRADB_AlignmentIterator_Open, SRADBFixture)
+{
+    ngs :: AlignmentIterator alIt = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) .  getAlignments ( ngs :: Alignment :: all );  // always an empty iterator
+    REQUIRE_THROW ( alIt . getAlignmentId () );
+}
+
+FIXTURE_TEST_CASE(SRADB_AlignmentIterator_Next, SRADBFixture)
+{
+    ngs :: AlignmentIterator alIt = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) .  getAlignments ( ngs :: Alignment :: all );  // always an empty iterator
+    REQUIRE( ! alIt . nextAlignment () );
+}
+
+/////TODO: PileupIterator
+
+///// ReadGroup
+FIXTURE_TEST_CASE(SRADB_ReadGroup_GetName, SRADBFixture)
+{
+    ngs :: ReadGroup rg = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReadGroup ( "A1DLC.1" );
+    REQUIRE_EQ ( ngs :: String("A1DLC.1"), rg . getName () );
+}
+FIXTURE_TEST_CASE(SRADB_HasReadGroup, SRADBFixture)
+{
+    REQUIRE ( ncbi::NGS::openReadCollection( SRADB_Accession ).hasReadGroup ( "A1DLC.1" ) );
+    REQUIRE ( ! ncbi::NGS::openReadCollection( SRADB_Accession ).hasReadGroup ( "non-existent read group" ) );
+}
+FIXTURE_TEST_CASE(SRADB_ReadGroup_GetStatistics, SRADBFixture)
+{
+    ngs :: ReadGroup rg = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReadGroup ( "A1DLC.1" );
+    ngs :: Statistics stats = rg . getStatistics ();
+}
+
+/////TODO: ReadGroupIterator
+
+///// Statistics
+FIXTURE_TEST_CASE(SRADB_ReadGroup_GetStatistics_getValueType, SRADBFixture)
+{
+    ngs :: ReadGroup rg = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReadGroup ( "A1DLC.1" );
+    ngs :: Statistics stats = rg . getStatistics ();
+
+    REQUIRE_EQ ( ngs :: Statistics :: uint64, stats . getValueType ( "BASE_COUNT" ) );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadGroup_GetStatistics_getAsU64, SRADBFixture)
+{
+    ngs :: ReadGroup rg = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReadGroup ( "A1DLC.1" );
+    ngs :: Statistics stats = rg . getStatistics ();
+
+    REQUIRE_EQ ( (uint64_t)5600, stats . getAsU64 ( "BASE_COUNT" ) );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadGroup_GetStatistics_getAsI64, SRADBFixture)
+{
+    ngs :: ReadGroup rg = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReadGroup ( "A1DLC.1" );
+    ngs :: Statistics stats = rg . getStatistics ();
+
+    REQUIRE_EQ ( (int64_t)5600, stats . getAsI64 ( "BASE_COUNT" ) );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadGroup_GetStatistics_getAsDouble, SRADBFixture)
+{
+    ngs :: ReadGroup rg = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReadGroup ( "A1DLC.1" );
+    ngs :: Statistics stats = rg . getStatistics ();
+
+    REQUIRE_EQ ( 5600.0, stats . getAsDouble ( "BASE_COUNT" ) );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadGroup_GetStatistics_nextPath, SRADBFixture)
+{
+    ngs :: ReadGroup rg = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReadGroup ( "A1DLC.1" );
+    ngs :: Statistics stats = rg . getStatistics ();
+
+    REQUIRE_EQ ( string("BIO_BASE_COUNT"), stats . nextPath ( "BASE_COUNT" ) );
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadGroup_GetStatistics_iteration, SRADBFixture)
+{
+    ngs :: ReadGroup rg = ncbi :: NGS :: openReadCollection ( SRADB_Accession ) . getReadGroup ( "A1DLC.1" );
+    ngs :: Statistics stats = rg . getStatistics ();
+
+	string path = stats . nextPath ( "" );
+    REQUIRE_EQ ( string("BASE_COUNT"), path );
+	path = stats . nextPath ( path );
+    REQUIRE_EQ ( string("BIO_BASE_COUNT"), path );
+	path = stats . nextPath ( path );
+    REQUIRE_EQ ( string("SPOT_COUNT"), path );
+	path = stats . nextPath ( path );
+    REQUIRE_EQ ( string("SPOT_MAX"), path );
+	path = stats . nextPath ( path );
+    REQUIRE_EQ ( string("SPOT_MIN"), path );
+	path = stats . nextPath ( path );
+    REQUIRE_EQ ( string(), path );
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs_sradb-c++";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t rc=NgsSradbCppTestSuite(argc, argv);
+    return rc;
+}
+
+}
+
+
diff --git a/test/ngs-c++/SRAtest.cpp b/test/ngs-c++/SRAtest.cpp
new file mode 100644
index 0000000..26a9cfc
--- /dev/null
+++ b/test/ngs-c++/SRAtest.cpp
@@ -0,0 +1,478 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS interface, SRA table based implementation
+*/
+
+#include "ngsfixture.hpp"
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsSraCppTestSuite);
+
+class SRAFixture : public NgsFixture
+{
+public:
+    static const char* SRA_Accession;
+
+public:
+    SRAFixture()
+    {
+    }
+    ~SRAFixture()
+    {
+    }
+
+    ngs :: ReadIterator getReads ( ngs :: Read :: ReadCategory cat = ngs :: Read :: all )
+    {
+        return NgsFixture :: getReads ( SRA_Accession, cat );
+    }
+    ngs :: Read getRead ( const ngs :: String& p_id)
+    {
+        return NgsFixture :: getRead ( SRA_Accession, p_id );
+    }
+    ngs :: Reference getReference ( const char* spec )
+    {
+        return NgsFixture :: getReference ( SRA_Accession, spec );
+    }
+    ngs :: Fragment getFragment ( const ngs :: String& p_readId, uint32_t p_fragIdx )
+    {
+        return NgsFixture :: getFragment ( SRA_Accession, p_readId, p_fragIdx );
+    }
+};
+const char* SRAFixture::SRA_Accession = "SRR000001";
+
+///// String
+TEST_CASE(SRA_String_StringRefScope)
+{
+    char const* p;
+    size_t size;
+
+    ngs::ReadCollection read_coll = ncbi::NGS::openReadCollection( "SRR618508" );
+    ngs::Reference ref = read_coll.getReference("NC_000002.11");
+    {
+        ngs::StringRef str_ref = ref.getReferenceChunk(20001);
+
+        p = str_ref.data();
+        size = str_ref.size();
+    }
+
+
+    // data under p are still available for the current implementation
+    for (size_t i = 0; i < size; ++i)
+    {
+        // force the compiler not to optimize this loop
+        if ( p[i] == '!' )
+            std::cout << "SRA_String_StringRefScope works" << std::endl;
+    }
+}
+
+///// ReadCollection
+//TODO: getReadRange (categories)
+//TODO: getReadCount (categories)
+//TODO: getReadGroups
+//TODO: error cases
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_Open, SRAFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRA_Accession );
+}
+FIXTURE_TEST_CASE(SRA_ReadCollection_Open_Failed, SRAFixture)
+{
+    REQUIRE_THROW ( ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( string(SRA_Accession) + "_BS" ) );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetName, SRAFixture)
+{
+    REQUIRE_EQ ( ngs :: String ( SRA_Accession ), ncbi :: NGS :: openReadCollection ( SRA_Accession ) . getName () );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReads, SRAFixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( SRA_Accession ) . getReads ( ngs :: Read :: all );
+}
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReads_Filtered, SRAFixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( SRA_Accession ) . getReads ( ngs :: Read :: unaligned );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReadRange, SRAFixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( SRA_Accession ) . getReadRange ( 100, 200 );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetRead, SRAFixture)
+{
+    ngs :: Read read = getRead ( string ( SRA_Accession ) + ".R.1" );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetRead_Failed, SRAFixture)
+{
+    REQUIRE_THROW ( ngs :: Read read = ncbi :: NGS :: openReadCollection ( SRA_Accession ) . getRead ( "notaread" ) );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_ReadCount, SRAFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRA_Accession );
+    REQUIRE_EQ( (uint64_t)470985, run . getReadCount() );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReference_Failed, SRAFixture)
+{
+    REQUIRE_THROW ( ngs :: Reference ref = getReference ( "supercnut2.1" ) );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReferences, SRAFixture)
+{
+    ngs :: ReferenceIterator refIt = NgsFixture :: getReferences ( SRA_Accession );  // always an empty iterator
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetAlignment, SRAFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRA_Accession );
+    REQUIRE_THROW ( ngs :: Alignment align = run . getAlignment ( "1" ) );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetAlignmentCount, SRAFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRA_Accession );
+    REQUIRE_EQ( (uint64_t)0, run . getAlignmentCount() );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetAlignmentCountFiltered, SRAFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRA_Accession );
+    REQUIRE_EQ( (uint64_t)0, run . getAlignmentCount( ngs :: Alignment :: all ) );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetAlignmentRange, SRAFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRA_Accession );
+    REQUIRE ( ! run . getAlignmentRange ( 1, 2 ) . nextAlignment () );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetAlignmentRangeFiltered, SRAFixture)
+{
+    ngs :: ReadCollection run = ncbi :: NGS :: openReadCollection ( SRA_Accession );
+    REQUIRE ( ! run . getAlignmentRange ( 1, 2, ngs :: Alignment :: all ) . nextAlignment () );
+}
+
+///// ReadIterator
+//TODO: read category selection
+//TODO: range on a collection that represents a slice (read[0].id != 1)
+//TODO: range and filtering
+//TODO: empty range
+//TODO: ReadIterator over a ReadGroup (use a ReadGroup that is not immediately at the beginning of the run)
+//TODO: ReadIterator over a ReadIterator, to allow creation of a sub-iterator
+//TODO: ReadIterator returning less than the range requested
+//TODO: error cases (?)
+FIXTURE_TEST_CASE(SRA_ReadIterator_NoReadBeforeNext, SRAFixture)
+{
+    ngs :: ReadIterator readIt = getReads ();
+    // accessing the read through an iterator before a call to nextRead() throws
+    REQUIRE_THROW ( readIt . getReadId() );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadIterator_Open_All, SRAFixture)
+{
+    ngs :: ReadIterator readIt = getReads ();
+    REQUIRE( readIt . nextRead () );
+    ngs :: StringRef sref = readIt . getReadId();
+    ngs :: String id =  sref . toString ();
+    REQUIRE_EQ( ngs :: String ( SRA_Accession ) + ".R.1", id );
+}
+
+#if SHOW_UNIMPLEMENTED
+FIXTURE_TEST_CASE(SRA_ReadIterator_Open_Filtered, SRAFixture)
+{
+    ngs :: ReadIterator readIt = getReads ( ngs :: Read :: partiallyAligned );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( (int64_t)5, readIt . getReadId() );
+}
+#endif
+
+FIXTURE_TEST_CASE(SRA_ReadIterator_Next, SRAFixture)
+{
+    ngs :: ReadIterator readIt = getReads ();
+    REQUIRE( readIt . nextRead () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRA_Accession ) + ".R.2", readIt . getReadId() . toString () );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadIterator_End, SRAFixture)
+{
+    ngs :: ReadIterator readIt = getReads ();
+    ngs :: String lastId;
+    while (readIt . nextRead ())
+    {
+        lastId = readIt . getReadId() . toString ();
+    }
+    REQUIRE_EQ( ngs :: String ( SRA_Accession ) + ".R.470985", lastId );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadIterator_BeyondEnd, SRAFixture)
+{
+    ngs :: ReadIterator readIt = getReads ();
+    while (readIt . nextRead ())
+    {
+    }
+    REQUIRE_THROW ( readIt . getReadId() );
+}
+
+FIXTURE_TEST_CASE(SRA_ReadIterator_Range, SRAFixture)
+{
+    ngs :: ReadIterator readIt = ncbi :: NGS :: openReadCollection ( SRA_Accession ) . getReadRange ( 10, 5 );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRA_Accession ) + ".R.10", readIt . getReadId() . toString () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRA_Accession ) + ".R.11", readIt . getReadId() . toString () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRA_Accession ) + ".R.12", readIt . getReadId() . toString () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRA_Accession ) + ".R.13", readIt . getReadId() . toString () );
+    REQUIRE( readIt . nextRead () );
+    REQUIRE_EQ( ngs :: String ( SRA_Accession ) + ".R.14", readIt . getReadId() . toString () );
+    REQUIRE( ! readIt . nextRead () );
+}
+
+/////TODO: Read
+//TODO: error cases
+
+FIXTURE_TEST_CASE(SRA_Read_ReadId, SRAFixture)
+{
+    REQUIRE_EQ( ngs :: String ( SRA_Accession ) + ".R.1", getRead ( ngs :: String ( SRA_Accession ) + ".R.1" ) . getReadId() . toString () );
+}
+
+FIXTURE_TEST_CASE(SRA_Read_getNumFragments, SRAFixture)
+{
+    REQUIRE_EQ( ( uint32_t ) 2, getRead ( ngs :: String ( SRA_Accession ) + ".R.2" ) . getNumFragments() );
+}
+
+FIXTURE_TEST_CASE(SRA_Read_ReadName, SRAFixture)
+{
+    REQUIRE_EQ( ngs :: String("EM7LVYS02FOYNU"), getRead ( ngs :: String ( SRA_Accession ) + ".R.1" ) . getReadName() . toString() );
+}
+
+FIXTURE_TEST_CASE(SRA_Read_ReadGroup, SRAFixture)
+{   //TODO: find an accession with non-empty read groups
+    REQUIRE_EQ( ngs :: String(""), getRead ( ngs :: String ( SRA_Accession ) + ".R.1" ). getReadGroup() );
+}
+
+FIXTURE_TEST_CASE(SRA_Read_ReadCategory, SRAFixture)
+{
+    REQUIRE_EQ( ngs :: Read :: unaligned, getRead ( ngs :: String ( SRA_Accession ) + ".R.1" ). getReadCategory() );
+}
+
+FIXTURE_TEST_CASE(SRA_Read_getReadBases, SRAFixture)
+{
+    ngs :: String bases = getRead ( ngs :: String ( SRA_Accession ) + ".R.1" ) . getReadBases () . toString ();
+    ngs :: String expected(
+        "TCAGATTCTCCTAGCCTACATCCGTACGAGTTAGCGTGGGATTACGAGGTGCACACCATTTCATTCCGTACGGGTAAATT"
+        "TTTGTATTTTTAGCAGACGGCAGGGTTTCACCATGGTTGACCAACGTACTAATCTTGAACTCCTGACCTCAAGTGATTTG"
+        "CCTGCCTTCAGCCTCCCAAAGTGACTGGGTATTACAGATGTGAGCGAGTTTGTGCCCAAGCCTTATAAGTAAATTTATAA"
+        "ATTTACATAATTTAAATGACTTATGCTTAGCGAAATAGGGTAAG"
+    );
+    REQUIRE_EQ( expected, bases );
+}
+
+FIXTURE_TEST_CASE(SRA_Read_getReadBases_Offset, SRAFixture)
+{
+    ngs :: String bases = getRead ( ngs :: String ( SRA_Accession ) + ".R.1" ) . getReadBases ( 200 ) . toString( );
+    ngs :: String expected(
+        "TGAGCGAGTTTGTGCCCAAGCCTTATAAGTAAATTTATAAATTTACATAATTTAAATGACTTATGCTTAGCGAAATAGGGTAAG"
+    );
+    REQUIRE_EQ( expected, bases );
+}
+
+FIXTURE_TEST_CASE(SRA_Read_getReadBases_OffsetLength, SRAFixture)
+{
+    ngs :: String bases = getRead ( ngs :: String ( SRA_Accession ) + ".R.1" ) . getReadBases ( 200, 6 ) . toString ();
+    ngs :: String expected("TGAGCG");
+    REQUIRE_EQ( expected, bases );
+}
+
+FIXTURE_TEST_CASE(SRA_Read_getReadQualities, SRAFixture)
+{
+    ngs :: String quals = getRead ( ngs :: String ( SRA_Accession ) + ".R.1" ) . getReadQualities() . toString ();
+    ngs :: String expected(
+        "=<8<85)9=9/3-8?68<7=8<3657747==49==+;FB2;A;5:'*>69<:74)9.;C?+;<B<B;(<';FA/;C>*GC"
+        "8/%9<=GC8.#=2:5:16D==<EA2EA.;5=44<;2C=5;@73&<<2;5;6+9<?776+:24'26:7,<9A;=:;0C>*6"
+        "?7<<C=D=<52?:9CA2CA23<2<;3CA12:A<9414<7<<6;99<2/=9#<;9B at 27.;=6>:77>:1<A>+CA138?<"
+        ")C at 2166:A<B?->:%<<9<;33<;6?9;<;4=:%<$CA1+1%1");
+    REQUIRE_EQ( expected, quals );
+}
+
+FIXTURE_TEST_CASE(SRA_Read_getReadQualities_Offset, SRAFixture)
+{
+    ngs :: String quals = getRead ( ngs :: String ( SRA_Accession ) + ".R.1" ) . getReadQualities( 200 ) . toString ();
+    ngs :: String expected(
+        "<6;99<2/=9#<;9B at 27.;=6>:77>:1<A>+CA138?<)C at 2166:A<B?->:%<<9<;33<;6?9;<;4=:%<$CA1+1%1"
+    );
+    REQUIRE_EQ( expected, quals );
+}
+
+FIXTURE_TEST_CASE(SRA_Read_getReadQualities_OffsetLength, SRAFixture)
+{
+    ngs :: String quals = getRead ( ngs :: String ( SRA_Accession ) + ".R.1" ) . getReadQualities( 200, 10 ) . toString ();
+    ngs :: String expected("<6;99<2/=9");
+    REQUIRE_EQ( expected, quals );
+}
+
+///// FragmentIterator
+FIXTURE_TEST_CASE(SRA_FragmentIterator_Next_and_Beyond, SRAFixture)
+{
+    ngs :: Read read = getRead ( ngs :: String ( SRA_Accession ) + ".R.2" );
+    // 2 fragments total
+    REQUIRE ( read . nextFragment () ); // still on first fragment
+    REQUIRE ( read . nextFragment () );
+    REQUIRE ( ! read . nextFragment () );
+    REQUIRE ( ! read . nextFragment () ); // past the end
+}
+
+///// Fragment
+//TODO: error cases
+
+FIXTURE_TEST_CASE(SRA_Fragment_Id, SRAFixture)
+{
+    ngs :: Read read = getRead ( ngs :: String ( SRA_Accession ) + ".R.2" );
+
+    REQUIRE ( read . nextFragment () );
+    REQUIRE_EQ ( string ( SRA_Accession ) + ".FR0.2", read . getFragmentId() . toString () );
+
+    REQUIRE ( read . nextFragment () );
+    REQUIRE_EQ ( string ( SRA_Accession ) + ".FR1.2", read . getFragmentId() . toString () );
+}
+
+FIXTURE_TEST_CASE(SRA_Fragment_getFragmentBases, SRAFixture)
+{
+    ngs :: String expected(
+        "ACAGACTCAACCTGCATAATAAATAACATTGAAACTTAGTTTCCTTCTTGGGCTTTCGGTGAGAAAACATAAGTTAAAAC"
+        "TGAGCGGGCTGGCAAGGCN"
+    );
+    REQUIRE_EQ( expected,
+                getFragment ( ngs :: String ( SRA_Accession ) + ".R.2", 2 ) . getFragmentBases () . toString ()
+    );
+}
+
+FIXTURE_TEST_CASE(SRA_Fragment_getSubFragmentBases_Offset, SRAFixture)
+{
+    ngs :: String expected("GGCAAGGCN");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( SRA_Accession ) + ".R.2", 2 ) . getFragmentBases ( 90 ) . toString () );
+}
+
+FIXTURE_TEST_CASE(SRA_Fragment_getSubFragmentBases_OffsetLength, SRAFixture)
+{
+    ngs :: String expected("GGCAAG");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( SRA_Accession ) + ".R.2", 2 ) . getFragmentBases ( 90, 6 ) . toString () );
+}
+
+FIXTURE_TEST_CASE(SRA_Fragment_getFragmentQualities, SRAFixture)
+{
+    ngs :: String expected(
+        "<=::=<8=D=C<<<<<<A=;CA1<=7<;A<;CA1<@:<9>;&>7;4<>7CA0<C at 0:<5<;:<CA7+:7<@9<B=CA7+<"
+        "<99<:B?.<;:2<A<A;:!"
+    );
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( SRA_Accession ) + ".R.2", 2 ) . getFragmentQualities () . toString () );
+}
+
+FIXTURE_TEST_CASE(SRA_Fragment_getSubFragmentQualities_Offset, SRAFixture)
+{
+    ngs :: String expected(":2<A<A;:!");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( SRA_Accession ) + ".R.2", 2 ) . getFragmentQualities ( 90 ) . toString () );
+}
+
+FIXTURE_TEST_CASE(SRA_Fragment_getSubFragmentQualities_OffsetLength, SRAFixture)
+{
+    ngs :: String expected(":2<A<A");
+    REQUIRE_EQ( expected, getFragment ( ngs :: String ( SRA_Accession ) + ".R.2", 2 ) . getFragmentQualities ( 90, 6 ) . toString () );
+}
+
+/////ReferenceIterator
+FIXTURE_TEST_CASE(SRA_ReferenceIterator_Open, SRAFixture)
+{
+    ngs :: ReferenceIterator refIt = ncbi :: NGS :: openReadCollection ( SRA_Accession ) . getReferences ();  // always an empty iterator
+    REQUIRE_THROW ( refIt . getCommonName() );
+}
+
+FIXTURE_TEST_CASE(SRA_ReferenceIterator_Next, SRAFixture)
+{
+    ngs :: ReferenceIterator refIt = ncbi :: NGS :: openReadCollection ( SRA_Accession ) .  getReferences ();  // always an empty iterator
+    REQUIRE( ! refIt . nextReference () );
+}
+
+/////AlignmentIterator
+FIXTURE_TEST_CASE(SRA_AlignmentIterator_Open, SRAFixture)
+{
+    ngs :: AlignmentIterator alIt = ncbi :: NGS :: openReadCollection ( SRA_Accession ) .  getAlignments ( ngs :: Alignment :: all );  // always an empty iterator
+    REQUIRE_THROW ( alIt . getAlignmentId () );
+}
+
+FIXTURE_TEST_CASE(SRA_AlignmentIterator_Next, SRAFixture)
+{
+    ngs :: AlignmentIterator alIt = ncbi :: NGS :: openReadCollection ( SRA_Accession ) .  getAlignments ( ngs :: Alignment :: all );  // always an empty iterator
+    REQUIRE( ! alIt . nextAlignment () );
+}
+
+/////TODO: ReadGroup
+//TODO: getName
+//TODO: getRead
+//TODO: getReads
+
+/////TODO: ReadGroupIterator
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs_sra-c++";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t rc=NgsSraCppTestSuite(argc, argv);
+    return rc;
+}
+
+}
+
+
diff --git a/test/ngs-c++/SRR600096 b/test/ngs-c++/SRR600096
new file mode 100644
index 0000000..4a4f343
Binary files /dev/null and b/test/ngs-c++/SRR600096 differ
diff --git a/test/ngs-c++/SRR611340 b/test/ngs-c++/SRR611340
new file mode 100644
index 0000000..313a248
Binary files /dev/null and b/test/ngs-c++/SRR611340 differ
diff --git a/test/ngs-c++/ngsfixture.hpp b/test/ngs-c++/ngsfixture.hpp
new file mode 100644
index 0000000..0ed5e30
--- /dev/null
+++ b/test/ngs-c++/ngsfixture.hpp
@@ -0,0 +1,93 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngsfixture_
+#define _h_ngsfixture_
+
+/**
+* Unit tests for NGS C++ interface, common definitions
+*/
+
+#include <ngs/ncbi/NGS.hpp>
+
+#include <ktst/unit_test.hpp>
+
+#include <sysalloc.h>
+#include <assert.h>
+
+#define SHOW_UNIMPLEMENTED 0
+
+class NgsFixture
+{
+public:
+    NgsFixture()
+    : suppress_errors(false)
+    {
+    }
+    
+    ~NgsFixture()
+    {
+    }
+
+    ngs :: ReadIterator getReads ( const char* acc, ngs :: Read :: ReadCategory cat )
+    {
+        return ncbi :: NGS :: openReadCollection ( acc ) . getReads ( cat ); 
+    }
+    ngs :: Read getRead (const char* acc, const ngs :: String& p_id)
+    {
+        return ncbi :: NGS :: openReadCollection ( acc ). getRead ( p_id ); 
+    }
+    ngs :: Read getFragment (const char* acc, const ngs :: String& p_readId, uint32_t p_fragIdx)
+    {
+        ngs :: Read read = getRead ( acc, p_readId );
+        assert ( p_fragIdx != 0 );
+        while ( p_fragIdx > 0 )
+        {
+            read . nextFragment ();
+            -- p_fragIdx;
+        }
+    
+        return read;
+    }
+
+    ngs :: Reference getReference ( const char* acc, const char* spec )
+    {
+        return ncbi :: NGS :: openReadCollection ( acc ) . getReference ( spec ); 
+    }
+    bool hasReference ( const char* acc, const char* spec )
+    {
+        return ncbi :: NGS :: openReadCollection ( acc ) . hasReference ( spec ); 
+    }
+    ngs :: ReferenceIterator getReferences ( const char* acc )
+    {
+        return ncbi :: NGS :: openReadCollection ( acc ) . getReferences (); 
+    }
+    
+    bool suppress_errors;
+};
+
+#endif
+
diff --git a/test/ngs-c++/seq_spot_id_0.sra b/test/ngs-c++/seq_spot_id_0.sra
new file mode 100644
index 0000000..83ac4c3
Binary files /dev/null and b/test/ngs-c++/seq_spot_id_0.sra differ
diff --git a/test/ngs-c++/valgrind.suppress b/test/ngs-c++/valgrind.suppress
new file mode 100644
index 0000000..f79a7a4
--- /dev/null
+++ b/test/ngs-c++/valgrind.suppress
@@ -0,0 +1,12 @@
+{
+   static_cached_KDirectory_in_KConfig_find_home_directory
+   Memcheck:Leak
+    ...
+   fun:find_home_directory
+}
+{
+   vt_cache
+   Memcheck:Leak
+   fun:calloc
+   fun:_ZN3ngs7Resolve*
+}
diff --git a/test/ngs-java/Makefile b/test/ngs-java/Makefile
new file mode 100644
index 0000000..500bb6a
--- /dev/null
+++ b/test/ngs-java/Makefile
@@ -0,0 +1,125 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/ngs-java
+
+JARS = \
+	ngs_jtest
+
+ALL_TARGS = \
+	$(JARS)
+
+include $(TOP)/build/Makefile.env
+
+ifeq (,$(NGS_JAVA_JAR))
+
+$(ALL_TARGS):
+	@true 
+	
+runtests:
+	@ echo "NGS Java tests are not run since ngs-java library does not appear to be installed"
+
+else
+ifeq (,$(NGS_LIBDIR))
+
+$(ALL_TARGS):
+	@true 
+	
+runtests:
+	@ echo "NGS Java tests are not run since ngs-sdk library does not appear to be installed"
+
+else
+
+JUNIT_JAR = $(SRCDIR)/../junit-4.11.jar
+
+CLASSPATH = $(NGS_JAVA_JAR):$(JUNIT_JAR)
+
+$(JARS): makejdirs
+	@ $(MAKE_CMD) $(TEST_CLSPATH)/$@
+
+.PHONY: $(JARS)
+
+clean: stdclean
+
+%.class: %.java
+	javac $^ -d $(CLASSDIR) -classpath $(CLASSPATH)
+    
+#-------------------------------------------------------------------------------
+# tests for ncbi-ngs
+#
+NGS_SRC = \
+	ngs_test_lib_load \
+	ngs_test_CSRA1
+    
+NGS_CLS = \
+	$(addsuffix .class,$(NGS_SRC))
+
+# use standard java System.loadLibrary
+VARS += -Dvdb.System.loadLibrary=1
+
+# remove all found JNI DLL-s
+#VARS += -Dvdb.deleteLibraries=1
+
+# custom load library search
+#VARS += -Dvdb.loadLibraryLocations=W
+
+#VARS += -Dvdb.log=FINEST
+
+#J=/net/pan1/sra-test/local/jdk1.7.0_51/bin/
+
+$(TEST_CLSPATH)/ngs_jtest: $(NGS_CLS)
+
+.PHONY: $(TEST_CLSPATH)/ngs_jtest
+
+#-------------------------------------------------------------------------------
+# runtests
+#
+
+runtests: $(JARS) test
+
+JAVABITS=-d$(BITS)
+
+# make sure runs are not cached in the user repository when running tests
+ifeq ($(wildcard ../../../asm-trace),)
+	ifeq (,$(VDB_CONFIG))
+		VDB_CONFIG = $(shell pwd)/../only-remote-repository.kfg
+	endif
+endif
+
+test: $(NGS_CLS)
+	@ echo Run $(CLASSDIR)/$(NGS_SRC)
+	@ echo java $(JAVABITS) -cp $(CLASSDIR):$(CLASSPATH) -Dvdb.System.loadLibrary=1 -Djava.library.path=$(NGS_LIBDIR):$(LIBDIR) org.junit.runner.JUnitCore gov.nih.nlm.ncbi.ngs.ngs_test_lib_load
+	@ export VDB_CONFIG=$(VDB_CONFIG) ; \
+		java $(JAVABITS) -cp $(CLASSDIR):$(CLASSPATH) -Dvdb.System.loadLibrary=1 -Djava.library.path=$(NGS_LIBDIR):$(LIBDIR) org.junit.runner.JUnitCore gov.nih.nlm.ncbi.ngs.ngs_test_lib_load
+	@ echo java $(JAVABITS) -cp $(CLASSDIR):$(CLASSPATH) -Dvdb.System.loadLibrary=1 -Djava.library.path=$(NGS_LIBDIR):$(LIBDIR) org.junit.runner.JUnitCore ngs_test_CSRA1
+	@ export VDB_CONFIG=$(VDB_CONFIG) ; \
+		java $(JAVABITS) -cp $(CLASSDIR):$(CLASSPATH) -Dvdb.System.loadLibrary=1 -Djava.library.path=$(NGS_LIBDIR):$(LIBDIR) org.junit.runner.JUnitCore ngs_test_CSRA1  
+
+endif    
+endif
diff --git a/test/ngs-java/build.xml b/test/ngs-java/build.xml
new file mode 100644
index 0000000..9aa106b
--- /dev/null
+++ b/test/ngs-java/build.xml
@@ -0,0 +1,53 @@
+<project>
+
+    <!-- This file is currently for use on Windows; Linux/Mac builds are run via gmake -->
+    <property environment="env"/>
+    <property name="Platform"       value="x64" />
+    <property name="Configuration"  value="Debug" />
+    <property name="Output"         value="${basedir}..\..\..\..\OUTDIR" />
+    <property name="MSVS"           value="2013" />
+    
+    <condition property="PlatformToolset" value="v100" else="v120">
+        <equals arg1="${MSVS}" arg2="2010"/>
+    </condition>    
+    <property name="vdb.dir"        value="${Output}\ncbi-vdb\win\${PlatformToolset}\${Platform}\${Configuration}\bin" />
+    <property name="ngs.dir"        value="${Output}\ngs-sdk\win\${PlatformToolset}\${Platform}\${Configuration}\bin" />
+    
+    <property name="classes.dir" value="${vdb.dir}\..\test\ngs-java" />
+    
+    <target name="clean">
+        <delete dir="${classes.dir}"/>
+    </target>
+
+    <target name="compile">
+        <mkdir dir="${classes.dir}"/>
+        <javac includeantruntime="false" srcdir="${basedir}" includes="ngs_test_lib_load.java ngs_test_CSRA1.java" destdir="${classes.dir}" > 
+            <classpath>
+                <pathelement location="${Output}\ngs-java\jar\ngs-java.jar" />
+                <pathelement location="${basedir}\..\junit-4.11.jar" />
+            </classpath>
+        </javac>
+    </target>
+
+    <condition property="JVMbits" value="64" else="32">
+        <equals arg1="${Platform}" arg2="x64"/>
+    </condition>    
+    
+    <target name="runtests" depends="compile" >
+        <java classname="org.junit.runner.JUnitCore" fork="true" failonerror="true">
+            <classpath>
+                <pathelement location="${classes.dir}" />
+                <pathelement location="${Output}\ngs-java\jar\ngs-java.jar" />
+                <pathelement location="${basedir}\..\junit-4.11.jar" />
+            </classpath>
+            <sysproperty key="java.library.path" path="${vdb.dir};${ngs.dir}" />
+            <sysproperty key="vdb.System.loadLibrary" value="1" />
+            <sysproperty key="vdb.log" value="FINEST" />
+            <jvmarg value="-d${JVMbits}" />
+        	<arg value="gov.nih.nlm.ncbi.ngs.ngs_test_lib_load" />
+        	<arg value="ngs_test_CSRA1" />
+        </java>
+    </target>
+    
+
+</project>
diff --git a/test/ngs-java/ngs_test_CSRA1.java b/test/ngs-java/ngs_test_CSRA1.java
new file mode 100644
index 0000000..e38d055
--- /dev/null
+++ b/test/ngs-java/ngs_test_CSRA1.java
@@ -0,0 +1,963 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+
+
+import static org.junit.Assert.fail;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+import org.junit.Test;
+
+import ngs.ReadCollection;
+import ngs.ReadGroupIterator;
+import ngs.Statistics;
+import ngs.Alignment;
+import ngs.ErrorMsg;
+
+import gov.nih.nlm.ncbi.ngs.NGS;
+
+//  The purpose of this suite is to verify integration of Java/JNI/C code, 
+//  for which running through just one type of archive is enough. 
+//  Thus these tests are not replicated for SRA and SRADB 
+//  archives, unlike in the C-level test suites
+public class ngs_test_CSRA1 {
+
+// ReadCollection
+    String PrimaryOnly           = "SRR1063272";
+    String WithSecondary         = "SRR833251";
+    String WithGroups            = "SRR822962";
+    String WithCircularRef       = "SRR1769246";
+    String SingleFragmentPerSpot = "SRR2096940";
+    
+    @Test
+    public void open_success() throws ngs.ErrorMsg
+    {
+        ngs.ReadCollection run = NGS . openReadCollection ( PrimaryOnly );
+    }
+    
+    @Test
+    public void open_fail()
+    {
+        try
+        {
+            ngs.ReadCollection run = NGS . openReadCollection ( "SRRsomejunk" );
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}        
+    }
+    
+    @Test
+    public void ReadCollection_getName() throws ngs.ErrorMsg
+    {
+        assertEquals ( PrimaryOnly, NGS . openReadCollection ( PrimaryOnly ) . getName () );
+    }
+    
+    @Test
+    public void ReadCollection_getReadGroup() throws ngs.ErrorMsg
+    {
+        ngs.ReadGroup gr = NGS . openReadCollection ( PrimaryOnly ) . getReadGroup ( "C1ELY.6" );
+    }
+    
+    @Test
+    public void ReadCollection_getReadGroups() throws ngs.ErrorMsg
+    {
+        ngs.ReadGroupIterator it = NGS . openReadCollection ( PrimaryOnly ) . getReadGroups ();
+    }
+    
+    @Test
+    public void ReadCollection_getReferences() throws ngs.ErrorMsg
+    {
+        ngs.ReferenceIterator it = NGS . openReadCollection ( PrimaryOnly ) . getReferences ();
+    }
+    
+    @Test
+    public void ReadCollection_getReference() throws ngs.ErrorMsg
+    {
+        ngs.Reference ref = NGS . openReadCollection ( PrimaryOnly ) . getReference ( "supercont2.1" );
+    }
+
+    @Test
+    public void ReadCollection_hasReference() throws ngs.ErrorMsg
+    {
+        assert ( NGS . openReadCollection ( PrimaryOnly ) . hasReference ( "supercont2.1" ) );
+        assert ( ! NGS . openReadCollection ( PrimaryOnly ) . hasReference ( "non-existent acc" ) );
+    }
+    
+    @Test
+    public void ReadCollection_getAlignment() throws ngs.ErrorMsg
+    {
+        ngs.Alignment al = NGS . openReadCollection ( PrimaryOnly ) . getAlignment( PrimaryOnly + ".PA.1" );
+    }
+    
+    @Test
+    public void ReadCollection_getAlignments_Primary() throws ngs.ErrorMsg
+    {
+        ngs.AlignmentIterator alIt = NGS . openReadCollection ( PrimaryOnly ) . getAlignments( Alignment . primaryAlignment );
+    }
+    @Test
+    public void ReadCollection_getAlignments_Secondary() throws ngs.ErrorMsg
+    {
+        ngs.AlignmentIterator alIt = NGS . openReadCollection ( PrimaryOnly ) . getAlignments( Alignment . secondaryAlignment );
+    }
+    @Test
+    public void ReadCollection_getAlignments_all() throws ngs.ErrorMsg
+    {
+        ngs.AlignmentIterator alIt = NGS . openReadCollection ( PrimaryOnly ) . getAlignments( Alignment . all );
+    }
+
+    @Test
+    public void ReadCollection_getAlignmentCount_PrimaryOnly() throws ngs.ErrorMsg
+    {
+        assertEquals ( 3987701, NGS . openReadCollection ( PrimaryOnly ) . getAlignmentCount () );
+    }
+    @Test
+    public void ReadCollection_getAlignmentCount_PrimaryOnly_Primary() throws ngs.ErrorMsg
+    {
+        assertEquals ( 3987701, NGS . openReadCollection ( PrimaryOnly ) . getAlignmentCount ( Alignment . primaryAlignment ) );
+    }
+    @Test
+    public void ReadCollection_getAlignmentCount_PrimaryOnly_Secondary() throws ngs.ErrorMsg
+    {
+        assertEquals ( 0, NGS . openReadCollection ( PrimaryOnly ) . getAlignmentCount ( Alignment . secondaryAlignment ) );
+    }
+    @Test
+    public void ReadCollection_getAlignmentCount_PrimaryOnly_All() throws ngs.ErrorMsg
+    {
+        assertEquals ( 3987701, NGS . openReadCollection ( PrimaryOnly ) . getAlignmentCount ( Alignment . all ) );
+    }
+    
+    @Test
+    public void ReadCollection_getAlignmentCount_WithSecondary() throws ngs.ErrorMsg
+    {
+        assertEquals ( 178, NGS . openReadCollection ( WithSecondary ) . getAlignmentCount () );
+    }
+    @Test
+    public void ReadCollection_getAlignmentCount_WithSecondary_Primary() throws ngs.ErrorMsg
+    {
+        assertEquals ( 168, NGS . openReadCollection ( WithSecondary ) . getAlignmentCount ( Alignment . primaryAlignment ) );
+    }
+    @Test
+    public void ReadCollection_getAlignmentCount_WithSecondary_Secondary() throws ngs.ErrorMsg
+    {
+        assertEquals ( 10, NGS . openReadCollection ( WithSecondary ) . getAlignmentCount ( Alignment . secondaryAlignment ) );
+    }
+    @Test
+    public void ReadCollection_getAlignmentCount_WithSecondary_All() throws ngs.ErrorMsg
+    {
+        assertEquals ( 178, NGS . openReadCollection ( WithSecondary ) . getAlignmentCount ( Alignment . all ) );
+    }
+    
+    @Test
+    public void ReadCollection_getAlignmentRange() throws ngs.ErrorMsg
+    {   // straddling primary and secondary alignments
+        ngs . AlignmentIterator alIt = NGS . openReadCollection ( WithSecondary ) . getAlignmentRange ( 166, 5 );
+        assertTrue ( alIt . nextAlignment () );
+        assertEquals ( WithSecondary + ".PA.166", alIt . getAlignmentId () );
+    }
+    
+    @Test
+    public void ReadCollection_getRead () throws ngs.ErrorMsg
+    {   
+        ngs . Read read = NGS . openReadCollection ( PrimaryOnly ) . getRead ( PrimaryOnly + ".R.1" );
+        assertEquals ( PrimaryOnly + ".R.1", read . getReadId () );
+    }
+
+    @Test
+    public void ReadCollection_getReads () throws ngs.ErrorMsg
+    {   
+        ngs . ReadIterator readIt = NGS . openReadCollection ( PrimaryOnly ) . getReads( ngs . Read . all );
+        assertTrue ( readIt . nextRead () );
+        assertEquals ( PrimaryOnly + ".R.1", readIt . getReadId () );
+    }
+    
+    @Test
+    public void ReadCollection_getReadCount () throws ngs.ErrorMsg
+    {   
+        assertEquals ( 2280633, NGS . openReadCollection ( PrimaryOnly ) . getReadCount () );
+    }
+    
+    @Test
+    public void ReadCollection_getReadRange () throws ngs.ErrorMsg
+    {   
+        ngs . ReadIterator readIt = NGS . openReadCollection ( PrimaryOnly ) . getReadRange ( 2, 3 );
+        assertTrue ( readIt . nextRead () );
+        assertEquals ( PrimaryOnly + ".R.2", readIt . getReadId () );
+    }
+
+// Read 
+
+    ngs.Read getRead ( String id ) throws ngs.ErrorMsg
+    {
+        ngs.ReadCollection run = NGS . openReadCollection ( PrimaryOnly );
+        return run . getRead(id);
+    }
+    
+    @Test
+    public void Read_getReadCategory_full() throws ngs.ErrorMsg
+    {
+        assertEquals( ngs . Read . fullyAligned, getRead( PrimaryOnly + ".R.1" ) . getReadCategory() );
+    }
+    @Test
+    public void Read_getReadCategory_partial() throws ngs.ErrorMsg
+    {
+        assertEquals( ngs . Read . partiallyAligned, getRead( PrimaryOnly + ".R.3" ) . getReadCategory() );
+    }
+    
+    @Test
+    public void Read_getNumFragments() throws ngs.ErrorMsg
+    {
+        assertEquals( 2, getRead( PrimaryOnly + ".R.1" ) . getNumFragments() );
+    }
+    
+    @Test
+    public void Read_fragmentIsAligned_partial() throws ngs.ErrorMsg
+    {
+        ngs . Read read = NGS . openReadCollection ( PrimaryOnly ) . getRead ( PrimaryOnly + ".R.3" );
+        assertEquals( true, read.fragmentIsAligned( 0 ) );
+        assertEquals( false, read.fragmentIsAligned( 1 ) );
+    }
+
+// FragmentIterator
+    @Test
+    public void FragmentIterator_ThrowsBeforeNext() throws ngs.ErrorMsg
+    {
+        try 
+        {
+            getRead( PrimaryOnly + ".R.1" ) . getFragmentId();
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}        
+    }
+    @Test
+    public void FragmentIterator_Next() throws ngs.ErrorMsg
+    {
+        ngs . Read read = getRead( PrimaryOnly + ".R.1" );
+        assertTrue ( read . nextFragment () );
+        read . getReadCategory(); // does not throw
+    }
+
+    @Test
+    public void Read_getFragmentId() throws ngs.ErrorMsg
+    {
+        ngs . Read read = getRead( PrimaryOnly + ".R.1" );
+        assertTrue ( read . nextFragment () );
+        assertEquals( PrimaryOnly + ".FR0.1", read . getFragmentId () );
+    }
+    
+    @Test
+    public void getFragmentBases() throws ngs.ErrorMsg
+    {
+        ngs . Read read = getRead( PrimaryOnly + ".R.1" );
+        assertTrue ( read . nextFragment () );
+        assertTrue ( read . nextFragment () );
+        assertEquals( "GGTA", read . getFragmentBases ( 2, 4 ) );
+    }
+    
+    @Test
+    public void getFragmentQualities() throws ngs.ErrorMsg
+    {
+        ngs . Read read = getRead( PrimaryOnly + ".R.1" );
+        assertTrue ( read . nextFragment () );
+        assertTrue ( read . nextFragment () );
+        assertEquals( "@DDA", read . getFragmentQualities ( 2, 4 ) );
+    }
+
+    
+// Alignment
+    
+    ngs.Alignment getAlignment ( String id ) throws ngs.ErrorMsg
+    {
+        ngs.ReadCollection run = NGS . openReadCollection ( PrimaryOnly );
+        return run . getAlignment(id);
+    }
+    ngs.Alignment getSecondaryAlignment ( String id ) throws ngs.ErrorMsg
+    {
+        ngs.ReadCollection run = NGS . openReadCollection ( WithSecondary );
+        return run . getAlignment(id);
+    }
+
+    @Test
+    public void Alignment_getAlignmentId() throws ngs.ErrorMsg
+    {
+        assertEquals( PrimaryOnly + ".PA.1", getAlignment ( PrimaryOnly + ".PA.1" ).getAlignmentId() );
+    }
+    
+    @Test
+    public void Alignment_getReferenceSpec() throws ngs.ErrorMsg
+    {
+        assertEquals( "supercont2.1", getAlignment ( PrimaryOnly + ".PA.1" ).getReferenceSpec() );
+    }
+
+    @Test
+    public void Alignment_getMappingQuality() throws ngs.ErrorMsg
+    {
+        assertEquals( 60, getAlignment ( PrimaryOnly + ".PA.1" ).getMappingQuality() );
+    }
+    
+    @Test
+    public void Alignment_getReferenceBases() throws ngs.ErrorMsg
+    {
+        assertEquals( "ACTCGACATTCTGTCTTCGACCTATCTTTCTCCTCTCCCAGTCATCGCCCAGTAGAATTACCAGGCAATGAACCACGGCCTTTCATCCCAACGGCACAGCA", 
+                      getAlignment ( PrimaryOnly + ".PA.1" ).getReferenceBases() );
+    }
+    
+    @Test
+    public void Alignment_getReadGroup() throws ngs.ErrorMsg
+    {
+        assertEquals( "C1ELY.6", getAlignment ( PrimaryOnly + ".PA.1" ).getReadGroup() );
+    }
+    
+    @Test
+    public void Alignment_getReadId() throws ngs.ErrorMsg
+    {
+        assertEquals( PrimaryOnly + ".R.165753", getAlignment ( PrimaryOnly + ".PA.5" ).getReadId() );
+    }
+
+    @Test
+    public void Alignment_getFragmentId() throws ngs.ErrorMsg
+    {
+        assertEquals( PrimaryOnly + ".FA0.1", getAlignment ( PrimaryOnly + ".PA.1" ) . getFragmentId () );
+    }
+    
+    @Test
+    public void Alignment_getFragmentBases_Raw() throws ngs.ErrorMsg
+    {
+        assertEquals( "TGGATGCTCTGGAAAATCTGAAAAGTGGTGTTTGTAAGGTTTGCTGGCTGCCCATATACCACATGGATGATGGGGCTTTCCATTTTAATGTTGAAGGAGGA", 
+                      getAlignment ( PrimaryOnly + ".PA.4" ).getFragmentBases () );
+    }
+    
+    @Test
+    public void Alignment_getFragmentQualities_Raw() throws ngs.ErrorMsg
+    {
+        assertEquals( "######AA>55;5(;63;;3@;A9??;6..73CDCIDA>DCB>@B=;@B?;;ADAB<DD?1*>@C9:EC?2++A3+F4EEB<E>EEIEDC2?C:;AB+==1", 
+                      getAlignment ( PrimaryOnly + ".PA.4" ).getFragmentQualities () );
+    }
+    
+    @Test
+    public void Alignment_getFragmentBases_Clipped() throws ngs.ErrorMsg
+    {
+        assertEquals( "CTTCAACATTAAAATGGAAAGCCCCATCATCCATGTGGTATATGGGCAGCCAGCAAACCTTACAAACACCACTTTTCAGATTTTCCAGAGCATCCA", 
+                      getAlignment ( PrimaryOnly + ".PA.4" ).getClippedFragmentBases () );
+    }
+    
+    @Test
+    public void Alignment_getFragmentQualities_Clipped() throws ngs.ErrorMsg
+    {
+        assertEquals( "#AA>55;5(;63;;3@;A9??;6..73CDCIDA>DCB>@B=;@B?;;ADAB<DD?1*>@C9:EC?2++A3+F4EEB<E>EEIEDC2?C:;AB+==1", 
+                      getAlignment ( PrimaryOnly + ".PA.4" ).getClippedFragmentQualities () );
+    }
+
+    @Test
+    public void Alignment_getAlignedFragmentBases() throws ngs.ErrorMsg
+    {
+        assertEquals( "ATATGGGTTCACTCCAACAGTGAACCATTCCAAAAGACCTTGCCTGCGTGGCCATCTCCTCACAAACCCACCATCCCGCAACATCTCAGGTATCATACCTT", 
+                      getAlignment ( PrimaryOnly + ".PA.2" ).getAlignedFragmentBases () );
+    }
+    
+    @Test
+    public void Alignment_getAlignmentCategory() throws ngs.ErrorMsg
+    {
+        assertEquals( ngs . Alignment . primaryAlignment, getAlignment ( PrimaryOnly + ".PA.4" ).getAlignmentCategory () );
+    }
+    
+    @Test
+    public void Alignment_getAlignmentPosition() throws ngs.ErrorMsg
+    {
+        assertEquals( 85, getAlignment ( PrimaryOnly + ".PA.1" ).getAlignmentPosition () );
+    }
+    
+    @Test
+    public void Alignment_getAlignmentLength() throws ngs.ErrorMsg
+    {
+        assertEquals( 101, getAlignment ( PrimaryOnly + ".PA.1" ).getAlignmentLength () );
+    }
+    
+    @Test
+    public void Alignment_getIsReversedOrientation_False() throws ngs.ErrorMsg
+    {
+        assertFalse( getAlignment ( PrimaryOnly + ".PA.1" ).getIsReversedOrientation () );
+    }
+    @Test
+    public void Alignment_getIsReversedOrientation_True() throws ngs.ErrorMsg
+    {
+        assertTrue( getAlignment ( PrimaryOnly + ".PA.2" ).getIsReversedOrientation () );
+    }
+    
+    @Test
+    public void Alignment_getSoftClip_None() throws ngs.ErrorMsg
+    {
+        ngs . Alignment al = getAlignment ( PrimaryOnly + ".PA.1" );
+        assertEquals( 0, al . getSoftClip ( ngs . Alignment . clipLeft ) );
+        assertEquals( 0, al . getSoftClip ( ngs . Alignment . clipRight ) );
+    }
+    @Test
+    public void Alignment_getSoftClip_Left() throws ngs.ErrorMsg
+    {
+        ngs . Alignment al = getAlignment ( PrimaryOnly + ".PA.4" );
+        assertEquals( 5, al . getSoftClip ( ngs . Alignment . clipLeft ) );
+        assertEquals( 0, al . getSoftClip ( ngs . Alignment . clipRight ) );
+    }
+    @Test
+    public void Alignment_getSoftClip_Right() throws ngs.ErrorMsg
+    {
+        ngs . Alignment al = getAlignment ( PrimaryOnly + ".PA.10" );
+        assertEquals( 0,  al . getSoftClip ( ngs . Alignment . clipLeft ) );
+        assertEquals( 13, al . getSoftClip ( ngs . Alignment . clipRight ) );
+    }
+    
+    @Test
+    public void Alignment_getTemplateLength() throws ngs.ErrorMsg
+    {
+        assertEquals( 201, getAlignment ( PrimaryOnly + ".PA.1" ).getTemplateLength () );
+    }
+    
+    @Test
+    public void Alignment_getShortCigar_Unclipped() throws ngs.ErrorMsg
+    {
+        assertEquals( "5S96M", getAlignment ( PrimaryOnly + ".PA.4" ).getShortCigar ( false ) );
+    }
+    @Test
+    public void Alignment_getShortCigar_Clipped() throws ngs.ErrorMsg
+    {
+        assertEquals( "96M", getAlignment ( PrimaryOnly + ".PA.4" ).getShortCigar ( true ) );
+    }
+
+    @Test
+    public void Alignment_getLongCigar_Unclipped() throws ngs.ErrorMsg
+    {
+        assertEquals( "5S1X8=1X39=1X46=", getAlignment ( PrimaryOnly + ".PA.4" ).getLongCigar ( false ) );
+    }
+    @Test
+    public void Alignment_getLongCigar_Clipped() throws ngs.ErrorMsg
+    {
+        assertEquals( "1X8=1X39=1X46=", getAlignment ( PrimaryOnly + ".PA.4" ).getLongCigar ( true ) );
+    }
+    
+    @Test
+    public void Alignment_hasMate_Primary_No() throws ngs.ErrorMsg
+    {
+        assertFalse( getAlignment ( PrimaryOnly + ".PA.99" ) . hasMate ( ) );
+    }
+    @Test
+    public void Alignment_hasMate_Primary_Yes() throws ngs.ErrorMsg
+    {
+        assertTrue( getAlignment ( PrimaryOnly + ".PA.1" ) . hasMate ( ) );
+    }
+    @Test
+    public void Alignment_hasMate_Secondary() throws ngs.ErrorMsg
+    {
+        assertFalse( getSecondaryAlignment ( WithSecondary + ".SA.169" ) . hasMate ( ) );
+    }
+
+    @Test
+    public void Alignment_getMateAlignmentId() throws ngs.ErrorMsg
+    {
+        assertEquals ( PrimaryOnly + ".PA.2", getAlignment ( PrimaryOnly + ".PA.1" ) . getMateAlignmentId ( ) );
+    }
+    @Test
+    public void Alignment_getMateAlignmentId_Missing() throws ngs.ErrorMsg
+    {
+        try
+        {
+            getAlignment ( PrimaryOnly + ".PA.99" ) . getMateAlignmentId ( );
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}        
+    }
+    @Test
+    public void Alignment_getMateAlignmentId_SecondaryThrows() throws ngs.ErrorMsg
+    {
+        try
+        {
+            getSecondaryAlignment ( WithSecondary + ".SA.172" ) . getMateAlignmentId ( );
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}        
+    }
+    
+    @Test
+    public void Alignment_getMateAlignment() throws ngs.ErrorMsg
+    {
+        assertEquals ( PrimaryOnly + ".PA.2",  getAlignment ( PrimaryOnly + ".PA.1" ) . getMateAlignment () . getAlignmentId () );
+    }
+    @Test
+    public void Alignment_getMateAlignment_Missing() throws ngs.ErrorMsg
+    {
+        try 
+        {
+            getAlignment ( PrimaryOnly + ".PA.99" ) . getMateAlignment ();
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}        
+    }
+    @Test
+    public void Alignment_getMateAlignment_SecondaryThrows() throws ngs.ErrorMsg
+    {
+        try 
+        {
+            getSecondaryAlignment ( WithSecondary +".SA.172" ) . getMateAlignment ();
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}        
+    }
+    
+    @Test
+    public void Alignment_getMateReferenceSpec() throws ngs.ErrorMsg
+    {
+        assertEquals ( "supercont2.1",  getAlignment ( PrimaryOnly + ".PA.1" ) . getMateReferenceSpec () );
+    }
+    
+    @Test
+    public void Alignment_getMateIsReversedOrientation_Yes() throws ngs.ErrorMsg
+    {
+        assertTrue( getAlignment ( PrimaryOnly + ".PA.1" ) . getMateIsReversedOrientation () );
+    }
+    @Test
+    public void Alignment_getMateIsReversedOrientation_No() throws ngs.ErrorMsg
+    {
+        assertFalse( getAlignment ( PrimaryOnly + ".PA.2" ) . getMateIsReversedOrientation () );
+    }
+    
+    @Test
+    public void Alignment_isPaired_MultiFragmentsPerSpot() throws ngs.ErrorMsg
+    {
+        ngs . ReadCollection readCollection = NGS . openReadCollection ( PrimaryOnly );
+        ngs . Alignment alignment = readCollection . getAlignment ( PrimaryOnly + ".PA.1" );
+        assertTrue( alignment.isPaired() );
+        
+        alignment = readCollection . getAlignment ( PrimaryOnly + ".PA.2" );
+        assertTrue( alignment.isPaired() );
+        
+        // has unaligned mate
+        alignment = readCollection . getAlignment ( PrimaryOnly + ".PA.6" );
+        assertTrue( alignment.isPaired() );
+    }
+    
+    @Test
+    public void Alignment_isPaired_SingleFragmentPerSpot() throws ngs.ErrorMsg
+    {
+        ngs . ReadCollection readCollection = NGS . openReadCollection ( SingleFragmentPerSpot );
+        ngs . Alignment alignment = readCollection . getAlignment ( SingleFragmentPerSpot + ".PA.1" );
+        assertFalse( alignment.isPaired() );
+    }
+
+
+// ReferenceSequence
+    public ngs . ReferenceSequence getReferenceSequence() throws ngs.ErrorMsg
+    {
+        return NGS . openReferenceSequence ( "NC_011752.1" );
+    }
+
+    @Test
+    public void ReferenceSequence_getCanonicalName () throws ngs.ErrorMsg
+    {
+        assertEquals ( "gi|218511148|ref|NC_011752.1|", getReferenceSequence () . getCanonicalName () );
+    }
+    
+    @Test
+    public void ReferenceSequence_getIsCircular_Yes() throws ngs.ErrorMsg
+    {
+        assertTrue( getReferenceSequence () . getIsCircular () );
+    }
+    
+    @Test
+    public void ReferenceSequence_getLength() throws ngs.ErrorMsg
+    {
+        assertEquals ( 72482, getReferenceSequence () . getLength() );
+    }
+    
+    @Test
+    public void ReferenceSequence_getReferenceBases() throws ngs.ErrorMsg
+    {
+        assertEquals ( "ATAAA", getReferenceSequence () . getReferenceBases ( 72482 - 5 ) );
+    }
+    @Test
+    public void ReferenceSequence_getReferenceBases_Length() throws ngs.ErrorMsg
+    {
+        assertEquals ( "TACA", getReferenceSequence () . getReferenceBases ( 4998, 4 ) );
+    }
+    
+    @Test
+    public void ReferenceSequence_getReferenceChunk() throws ngs.ErrorMsg
+    {
+        assertEquals ( "TAATA", getReferenceSequence () . getReferenceChunk ( 5000 - 5, 5 ) );
+    }
+    @Test
+    public void ReferenceSequence_getReferenceChunk_Length () throws ngs.ErrorMsg
+    {
+        assertEquals ( "TAATA", getReferenceSequence () . getReferenceChunk ( 5000 - 5, 10 ) );
+    }
+
+
+// Reference
+    public ngs . Reference getReference() throws ngs.ErrorMsg
+    {
+        return NGS . openReadCollection ( PrimaryOnly ) . getReference ( "supercont2.1" );
+    }
+
+    @Test
+    public void Reference_getCommonName () throws ngs.ErrorMsg
+    {
+        assertEquals ( "supercont2.1", getReference () . getCommonName () );
+    }
+    
+    @Test
+    public void Reference_getCanonicalName () throws ngs.ErrorMsg
+    {
+        assertEquals ( "NC_000007.13", NGS . openReadCollection ( "SRR821492" ) . getReference ( "chr7" ) . getCanonicalName () );
+    }
+    
+    @Test
+    public void Reference_getIsCircular_No() throws ngs.ErrorMsg
+    {
+        assertFalse( getReference () . getIsCircular () );
+    }
+    @Test
+    public void Reference_getIsCircular_Yes() throws ngs.ErrorMsg
+    {
+        assertTrue( NGS . openReadCollection ( "SRR821492" ) . getReference ( "chrM" ) . getIsCircular () );
+    }
+    
+    @Test
+    public void Reference_getLength() throws ngs.ErrorMsg
+    {
+        assertEquals ( 2291499l, getReference () . getLength() );
+    }
+    
+    @Test
+    public void Reference_getReferenceBases() throws ngs.ErrorMsg
+    {
+        assertEquals ( "ATCTG", getReference () . getReferenceBases ( 2291499l - 5 ) );
+    }
+    @Test
+    public void Reference_getReferenceBases_Length() throws ngs.ErrorMsg
+    {
+        assertEquals ( "GCGCTATGAC", getReference () . getReferenceBases ( 9000, 10 ) );
+    }
+    
+    @Test
+    public void Reference_getReferenceChunk() throws ngs.ErrorMsg
+    {
+        assertEquals ( "CTAGG", getReference () . getReferenceChunk ( 5000 - 5, 5 ) );
+    }
+    @Test
+    public void Reference_getReferenceChunk_Length () throws ngs.ErrorMsg
+    {
+        assertEquals ( "GCGCTATGAC", getReference () . getReferenceChunk ( 9000, 10 ) );
+    }
+    
+    @Test
+    public void Reference_getAlignment() throws ngs.ErrorMsg
+    {
+        assertEquals ( PrimaryOnly + ".PA.1", getReference () . getAlignment ( PrimaryOnly + ".PA.1" ) . getAlignmentId () );
+    }
+    
+//TODO: getPileups
+//TODO: getPileupSlice
+//TODO: getPileupSlice_Filtered
+
+// ReferenceIterator
+
+    @Test
+    public void ReferenceIterator_ThrowBeforeNext() throws ngs.ErrorMsg
+    {
+        ngs.ReferenceIterator it = NGS . openReadCollection ( PrimaryOnly ) . getReferences ();
+        try 
+        {
+            it . getCommonName ();
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}        
+    }
+    
+    @Test
+    public void ReferenceIterator_Next() throws ngs.ErrorMsg
+    {
+        ngs.ReferenceIterator it = NGS . openReadCollection ( PrimaryOnly ) . getReferences ();
+        assertTrue ( it . nextReference () );
+        assertEquals ( "supercont2.1", it . getCommonName () );
+    }
+    
+// AlignmentIterator from Reference (ReferenceWindow)
+    @Test
+    public void ReferenceWindow () throws ngs.ErrorMsg
+    {
+        ngs.AlignmentIterator it = NGS . openReadCollection ( WithSecondary ) 
+                                        . getReference ( "gi|169794206|ref|NC_010410.1|" )
+                                        . getAlignments ( ngs . Alignment . all ); 
+        assertTrue ( it . nextAlignment () );  
+    
+        // the first 2 secondary alignments' locations on the list: #34, #61
+        long count = 1;
+        while ( it . nextAlignment() )
+        {
+            if ( it . getAlignmentCategory()  == ngs . Alignment . secondaryAlignment )
+                break;
+            ++count;
+        }
+        assertEquals ( 34, count);    
+        while ( it . nextAlignment() )
+        {
+            if ( it . getAlignmentCategory()  == ngs . Alignment . secondaryAlignment )
+                break;
+            ++count;
+        }
+        assertEquals ( 61, count);    
+    }
+    
+    @Test
+    public void ReferenceWindow_Slice () throws ngs.ErrorMsg
+    {
+        ngs.AlignmentIterator it = NGS . openReadCollection ( WithSecondary ) 
+                                        . getReference ( "gi|169794206|ref|NC_010410.1|" )
+                                        . getAlignmentSlice ( 516000, 100000 ); 
+        assertTrue ( it . nextAlignment () );  
+        assertEquals ( WithSecondary + ".PA.33", it. getAlignmentId () );
+        assertTrue ( it . nextAlignment () );  
+        assertEquals ( WithSecondary + ".PA.34", it. getAlignmentId () );
+        assertTrue ( it . nextAlignment () );  
+        assertEquals ( WithSecondary + ".SA.169", it. getAlignmentId () ); //secondary
+        assertTrue ( it . nextAlignment () );  
+        assertEquals ( WithSecondary + ".PA.35", it. getAlignmentId () );
+        assertFalse ( it . nextAlignment () );  
+    }
+   
+    @Test
+    public void ReferenceWindow_Slice_Filtered_Category () throws ngs.ErrorMsg
+    {
+        ngs.AlignmentIterator it = NGS . openReadCollection ( WithSecondary ) 
+                                        . getReference ( "gi|169794206|ref|NC_010410.1|" )
+                                        . getAlignmentSlice ( 516000, 100000, ngs . Alignment . primaryAlignment ); 
+        assertTrue ( it . nextAlignment () );  
+        assertEquals ( WithSecondary + ".PA.33", it. getAlignmentId () );
+        assertTrue ( it . nextAlignment () );  
+        assertEquals ( WithSecondary + ".PA.34", it. getAlignmentId () );
+        assertTrue ( it . nextAlignment () );  
+        assertEquals ( WithSecondary + ".PA.35", it. getAlignmentId () ); // no secondary
+        assertFalse ( it . nextAlignment () );  
+    }
+    
+    @Test
+    public void ReferenceWindow_Slice_Filtered_Start_Within_Slice () throws ngs.ErrorMsg
+    {
+        ngs.Reference ref = NGS . openReadCollection ( WithCircularRef )
+                                 . getReference ( "NC_012920.1" );
+        ngs.AlignmentIterator it = ref . getFilteredAlignmentSlice ( 0, ref.getLength(), Alignment . all, Alignment . startWithinSlice, 0 );
+    
+        assertTrue ( it . nextAlignment () );
+        long numberOfFilteredAlignments = 1;
+        long lastAlignmentPosition = it.getAlignmentPosition();
+        while ( it . nextAlignment () ) {
+            long currentPosition = it.getAlignmentPosition();
+            
+            String errorMsg = "Sorting violated. Last position (" + lastAlignmentPosition + ") is higher than current one (" + currentPosition + ")";
+            assertTrue ( errorMsg, lastAlignmentPosition <= currentPosition );
+            
+            lastAlignmentPosition = currentPosition;
+            numberOfFilteredAlignments++;
+        }
+        
+        it = ref . getFilteredAlignmentSlice ( 0, ref.getLength(), Alignment . all, 0, 0 );
+        long numberOfUnfilteredAlignments = 0;
+        while ( it . nextAlignment () ) {
+            numberOfUnfilteredAlignments++;
+        }
+        
+        assertEquals ( numberOfUnfilteredAlignments, 12317 );
+        assertEquals ( numberOfFilteredAlignments, 12316 );
+    }
+    
+    // ReadGroup
+    @Test
+    public void ReadGroup_getName () throws ngs.ErrorMsg
+    {
+        ngs.ReadGroup gr = NGS . openReadCollection ( PrimaryOnly ) . getReadGroup ( "C1ELY.6" );
+        assertEquals( "C1ELY.6", gr . getName () );
+    }
+    @Test
+    public void ReadGroup_has () throws ngs.ErrorMsg
+    {
+        assert ( NGS.openReadCollection( PrimaryOnly ).hasReadGroup ( "C1ELY.6" ) );
+        assert ( ! NGS.openReadCollection( PrimaryOnly ).hasReadGroup ( "non-existent read-group" ) );
+    }
+    @Test
+    public void ReadGroup_getStatistics() throws ngs.ErrorMsg
+    {
+        ngs.ReadGroup gr = NGS . openReadCollection ( WithGroups ) . getReadGroup ( "GS57510-FS3-L03" );
+
+        ngs . Statistics stats = gr . getStatistics ();
+    
+        assertEquals ( 34164461870L, stats . getAsU64 ( "BASE_COUNT" ) );
+        assertEquals ( 34164461870L, stats . getAsU64 ( "BIO_BASE_COUNT" ) );
+        assertEquals ( 488063741L,   stats . getAsU64 ( "SPOT_COUNT" ) );
+        assertEquals ( 5368875807L,  stats . getAsU64 ( "SPOT_MAX" ) );
+        assertEquals ( 4880812067L,  stats . getAsU64 ( "SPOT_MIN" ) );        
+    }
+
+/* ReadGroup no longer supports Reads
+    @Test
+    public void ReadGroup_getRead () throws ngs.ErrorMsg
+    {
+        ngs.ReadGroup gr = NGS . openReadCollection ( PrimaryOnly ) . getReadGroup ( "C1ELY.6" );
+        ngs.Read r = gr . getRead ( PrimaryOnly + ".R.1" );
+        assertEquals ( "C1ELY.6", r . getReadGroup () );
+    }
+    
+    @Test
+    public void ReadGroup_getReads () throws ngs.ErrorMsg
+    {
+        ngs.ReadGroup gr = NGS . openReadCollection ( PrimaryOnly ) . getReadGroup ( "C1ELY.6" );
+        ngs.ReadIterator r = gr . getReads ( ngs . Read . partiallyAligned );
+    }
+*/
+    
+    // ReadGroupIterator
+    @Test
+    public void ReadGroupIterator_ThrowBeforeNext() throws ngs.ErrorMsg
+    {
+        ngs.ReadGroupIterator it = NGS . openReadCollection ( PrimaryOnly ) . getReadGroups ();
+        try 
+        {
+            it . getName ();
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}        
+    }
+    
+    @Test
+    public void ReadGroupIterator_Next() throws ngs.ErrorMsg
+    {
+        ngs.ReadGroupIterator it = NGS . openReadCollection ( PrimaryOnly ) . getReadGroups ();
+        assertTrue ( it . nextReadGroup () );
+        String name = it . getName ();
+/*
+        ngs.ReadIterator r = it . getReads ( ngs . Read . all );
+        assertTrue ( r . nextRead () );
+        assertEquals ( name, r . getReadGroup () );
+*/
+    }    
+    
+    @Test
+    public void ReadCollection_openReadCollection_null() throws ngs.ErrorMsg
+    {
+    	try 
+        {
+    		NGS.openReadCollection(null);
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}   
+    }
+    
+    @Test
+    public void ReadCollection_setAppVersion_null() throws ngs.ErrorMsg
+    {
+		NGS.setAppVersionString(null);
+    }
+    
+    @Test
+    public void ReadCollection_openReferenceSequence_null() throws ngs.ErrorMsg
+    {
+    	try 
+        {
+    		NGS.openReferenceSequence(null);
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}   
+    }
+    
+    @Test
+    public void ReadCollection_isValid_null() throws ngs.ErrorMsg
+    {
+    	try 
+        {
+    		NGS.isValid(null);
+            fail();
+        }
+        catch ( NullPointerException e ) {}   
+    }
+    
+    @Test
+    public void ReadCollection_hasReadGroup_null() throws ngs.ErrorMsg
+    {
+    	try 
+        {
+    		ReadCollection run = NGS.openReadCollection(PrimaryOnly);
+            run.hasReadGroup(null);
+        }
+        catch ( ngs.ErrorMsg e ) 
+    	{
+        	fail();
+        }   
+    }
+    
+    @Test
+    public void ReadCollection_hasReference_null() throws ngs.ErrorMsg
+    {
+    	try 
+        {
+    		ReadCollection run = NGS.openReadCollection(PrimaryOnly);
+    		run.hasReference(null);
+        }
+        catch ( ngs.ErrorMsg e ) 
+    	{
+        	fail();
+    	}   
+    }
+    
+    @Test
+    public void ReadCollection_getReference_null() throws ngs.ErrorMsg
+    {
+    	try 
+        {
+    		ReadCollection run = NGS.openReadCollection(PrimaryOnly);
+    		run.getReference(null);
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}   
+    }
+    
+    @Test
+    public void ReadCollection_getAlignment_null() throws ngs.ErrorMsg
+    {
+    	try 
+        {
+    		ReadCollection run = NGS.openReadCollection(PrimaryOnly);
+    		run.getAlignment(null);
+            fail();
+        }
+        catch ( ngs.ErrorMsg e ) {}   
+    }
+    
+    @Test
+    public void ReadCollection_ReadGroup_Statistics_getValueType_null() throws ngs.ErrorMsg
+    {
+		ReadCollection run = NGS.openReadCollection(PrimaryOnly);
+		ReadGroupIterator rgIt = run.getReadGroups();
+        rgIt.nextReadGroup();
+        Statistics st = rgIt.getStatistics();
+        st.getValueType(null);
+    }
+}
diff --git a/test/ngs-java/ngs_test_lib_load.java b/test/ngs-java/ngs_test_lib_load.java
new file mode 100644
index 0000000..0f3c93b
--- /dev/null
+++ b/test/ngs-java/ngs_test_lib_load.java
@@ -0,0 +1,246 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+
+
+package gov.nih.nlm.ncbi.ngs;
+
+import static org.junit.Assert.fail;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+import gov.nih.nlm.ncbi.ngs.LibManager;
+import gov.nih.nlm.ncbi.ngs.Logger;
+import gov.nih.nlm.ncbi.ngs.Version;
+import gov.nih.nlm.ncbi.ngs.error.LibraryIncompatibleVersionError;
+import gov.nih.nlm.ncbi.ngs.error.LibraryLoadError;
+import gov.nih.nlm.ncbi.ngs.error.LibraryNotFoundError;
+import gov.nih.nlm.ncbi.ngs.error.cause.ConnectionProblemCause;
+import gov.nih.nlm.ncbi.ngs.error.cause.DownloadDisabledCause;
+import gov.nih.nlm.ncbi.ngs.error.cause.InvalidLibraryCause;
+import gov.nih.nlm.ncbi.ngs.error.cause.JvmErrorCause;
+import gov.nih.nlm.ncbi.ngs.error.cause.OutdatedJarCause;
+import gov.nih.nlm.ncbi.ngs.error.cause.PrereleaseReqLibCause;
+import gov.nih.nlm.ncbi.ngs.error.cause.UnsupportedArchCause;
+import org.junit.Test;
+import org.junit.Before;
+import org.junit.After;
+
+import ngs.ReadCollection;
+import ngs.Alignment;
+import ngs.ErrorMsg;
+
+import gov.nih.nlm.ncbi.ngs.NGS;
+
+import java.lang.String;
+import java.lang.System;
+import java.lang.Throwable;
+import java.util.TreeMap;
+
+//The purpose of this suite is to verify native library load code,
+//including testing various error cases.
+public class ngs_test_lib_load {
+    static String test_lib = "test_lib";
+    static String test_lib_ver = "1.1.0";
+    LibManager libManager;
+    Logger.Level savedLogLevel;
+    String savedSysLoadLibrary;
+    String savedSysNoLibDownload;
+
+    @Before
+    public void saveSysVars() {
+        savedLogLevel = Logger.getLevel();
+        savedSysLoadLibrary = System.getProperty("vdb.System.loadLibrary");
+        savedSysNoLibDownload = System.getProperty("vdb.System.noLibraryDownload");
+    }
+
+    @Before
+    public void setupEnv() {
+        Logger.setLevel(Logger.Level.OFF);
+        System.setProperty("vdb.System.loadLibrary", "0");
+    }
+
+    @After
+    public void restoreSysVars() {
+        Logger.setLevel(savedLogLevel);
+        sysSetProp("vdb.System.loadLibrary", savedSysLoadLibrary);
+        sysSetProp("vdb.System.noLibraryDownload", savedSysNoLibDownload);
+    }
+
+    private void sysSetProp(String name, String value) {
+        if (value != null)
+            System.setProperty(name, value);
+        else
+            System.clearProperty(name);
+    }
+
+    private void createLibManager() {
+        libManager = new LibManager(
+                new String[] { test_lib },
+                new String[] { test_lib_ver }
+        );
+        libManager.mocksEnabled = true;
+        libManager.mockLocationVersions = new TreeMap();
+    }
+
+    private Throwable loadAndCatch(String libName) {
+        Throwable exception = null;
+        try {
+            libManager.loadLibrary(test_lib);
+        } catch (Throwable e) {
+            exception = e;
+        }
+        return exception;
+    }
+
+    @Test
+    public void LibManagerMock_Ok()
+    {
+        createLibManager();
+        libManager.mockLocationVersions.put(LibManager.Location.LIBPATH, new Version(test_lib_ver));
+        libManager.mockLoadedLibraryVersion = test_lib_ver;
+
+        assertEquals(loadAndCatch(test_lib), null);
+    }
+
+    @Test
+    public void LibManagerMock_NotFound_NoDownload()
+    {
+        System.setProperty("vdb.System.noLibraryDownload", "1");
+        createLibManager();
+        Throwable e = loadAndCatch(test_lib);
+        assertNotNull(e);
+        assertEquals(LibraryNotFoundError.class, e.getClass());
+        assertNotNull(e.getCause());
+        assertEquals(DownloadDisabledCause.class, e.getCause().getClass());
+    }
+
+    @Test
+    public void LibManagerMock_NotFound_DownloadFail()
+    {
+        createLibManager();
+        libManager.mockDownloadStatus = DownloadManager.DownloadResult.FAILED;
+
+        Throwable e = loadAndCatch(test_lib);
+        assertNotNull(e);
+        assertEquals(LibraryNotFoundError.class, e.getClass());
+        assertNotNull(e.getCause());
+        assertEquals(ConnectionProblemCause.class, e.getCause().getClass());
+    }
+
+    @Test
+    public void LibManagerMock_NotFound_DownloadUnsupportedOs()
+    {
+        createLibManager();
+        libManager.mockDownloadStatus = DownloadManager.DownloadResult.UNSUPPORTED_OS;
+
+        Throwable e = loadAndCatch(test_lib);
+        assertNotNull(e);
+        assertEquals(LibraryNotFoundError.class, e.getClass());
+        assertNotNull(e.getCause());
+        assertEquals(UnsupportedArchCause.class, e.getCause().getClass());
+    }
+
+    @Test
+    public void LibManagerMock_LoadFailed_BadDownloadFile()
+    {
+        createLibManager();
+        libManager.mockDownloadStatus = DownloadManager.DownloadResult.SUCCESS;
+        libManager.mockLoadException = new UnsatisfiedLinkError();
+
+        Throwable e = loadAndCatch(test_lib);
+        assertNotNull(e);
+        assertEquals(LibraryLoadError.class, e.getClass());
+        assertNotNull(e.getCause());
+        assertEquals(JvmErrorCause.class, e.getCause().getClass());
+    }
+
+    @Test
+    public void LibManagerMock_LoadFailed_GetVersionFailed()
+    {
+        createLibManager();
+        libManager.mockDownloadStatus = DownloadManager.DownloadResult.SUCCESS;
+
+        Throwable e = loadAndCatch(test_lib);
+        assertNotNull(e);
+        assertEquals(LibraryLoadError.class, e.getClass());
+        assertNotNull(e.getCause());
+        assertEquals(InvalidLibraryCause.class, e.getCause().getClass());
+    }
+
+    @Test
+    public void LibManagerMock_IncompatibleVers_DownloadDisabled()
+    {
+        System.setProperty("vdb.System.noLibraryDownload", "1");
+        String incompVersions[] = new String[] { "0.0.1", "1.0.0", "2.0.0" };
+        for (String version : incompVersions) {
+            createLibManager();
+            libManager.mockLocationVersions.put(LibManager.Location.LIBPATH, new Version(version));
+            libManager.mockLoadedLibraryVersion = version;
+
+            Throwable e = loadAndCatch(test_lib);
+            assertNotNull(e);
+            assertEquals(LibraryIncompatibleVersionError.class, e.getClass());
+            assertNotNull(e.getCause());
+            assertEquals(DownloadDisabledCause.class, e.getCause().getClass());
+        }
+    }
+
+    @Test
+    public void LibManagerMock_IncompatibleVers_DownloadPrereleaseVers()
+    {
+        String incompVersions[] = new String[] { "0.0.1", "1.0.0" };
+        for (String version : incompVersions) {
+            createLibManager();
+            libManager.mockDownloadStatus = DownloadManager.DownloadResult.SUCCESS;
+            libManager.mockLocationVersions.put(LibManager.Location.DOWNLOAD, new Version(version));
+            libManager.mockLoadedLibraryVersion = version;
+
+            Throwable e = loadAndCatch(test_lib);
+            assertNotNull(e);
+            assertEquals(LibraryIncompatibleVersionError.class, e.getClass());
+            assertNotNull(e.getCause());
+            assertEquals(PrereleaseReqLibCause.class, e.getCause().getClass());
+        }
+    }
+
+    @Test
+    public void LibManagerMock_IncompatibleVers_Download_OutdatedJar()
+    {
+        String version = "2.0.0";
+        createLibManager();
+        libManager.mockDownloadStatus = DownloadManager.DownloadResult.SUCCESS;
+        libManager.mockLocationVersions.put(LibManager.Location.DOWNLOAD, new Version(version));
+        libManager.mockLoadedLibraryVersion = version;
+
+        Throwable e = loadAndCatch(test_lib);
+        assertNotNull(e);
+        assertEquals(LibraryIncompatibleVersionError.class, e.getClass());
+        assertNotNull(e.getCause());
+        assertEquals(OutdatedJarCause.class, e.getCause().getClass());
+    }
+}
\ No newline at end of file
diff --git a/test/ngs-python/Makefile b/test/ngs-python/Makefile
new file mode 100644
index 0000000..9b3b9c1
--- /dev/null
+++ b/test/ngs-python/Makefile
@@ -0,0 +1,57 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/ngs-python
+
+ALL_TARGS = \
+
+include $(TOP)/build/Makefile.env
+
+
+# make sure runs are not cached in the user repository when running tests
+ifeq ($(wildcard ../../../asm-trace),)
+	ifeq (,$(VDB_CONFIG))
+		VDB_CONFIG = $(shell pwd)/../only-remote-repository.kfg
+	endif
+endif
+
+
+#-------------------------------------------------------------------------------
+# runtests
+#
+runtests: pytest
+
+pytest:
+	python -c "from ngs import NGS" \
+		&& export VDB_CONFIG=$(VDB_CONFIG) ; export NGS_PY_DOWNLOAD_LIBRARY=0; \
+			unset NGS_PY_LIBRARY_PATH; \
+			export LD_LIBRARY_PATH=$(LIBDIR):$(NGS_LIBDIR):$$LD_LIBRARY_PATH; \
+			python tests.py \
+		|| echo "NGS Python tests are not run since ngs module does not appear to be installed"
+
+.PHONY: pytest
diff --git a/test/ngs-python/build.xml b/test/ngs-python/build.xml
new file mode 100644
index 0000000..b4fcc8a
--- /dev/null
+++ b/test/ngs-python/build.xml
@@ -0,0 +1,41 @@
+<project>
+
+    <!-- This file is currently for use on Windows; Linux/Mac builds are run via gmake -->
+    <property environment="env"/>
+    <property name="Platform"       value="x64" />
+    <property name="Configuration"  value="Debug" />
+    <property name="Output"         value="${basedir}\..\..\..\OUTDIR" />
+    <property name="MSVS"           value="2013" />
+    
+    <condition property="PlatformToolset" value="v100" else="v120">
+        <equals arg1="${MSVS}" arg2="2010"/>
+    </condition>    
+    <property name="vdb.dir"        value="${Output}\ncbi-vdb\win\${PlatformToolset}\${Platform}\${Configuration}\bin" />
+    <property name="ngs.dir"        value="${Output}\ngs-sdk\win\${PlatformToolset}\${Platform}\${Configuration}\bin" />
+    
+    <property name="ngs-source.dir" value="${basedir}\..\..\..\ngs" />
+    
+    <!-- Set this to full path to Python if not in PATH already 
+        make sure that
+            python -c "import platform;print (platform.architecture()[0])" = "32bit" or "64bit" 
+        as needed for the platform
+    -->
+    <property name="python.exe"     value="python" />
+	
+    <target name="install">
+        <exec executable="${python.exe}" dir="${ngs-source.dir}\ngs-python" failonerror="true" >
+            <arg value="setup.py" />
+            <arg value="install" />
+            <arg value="--user" />
+        </exec>
+    </target>
+
+    <target name="runtests" depends="install">
+        <exec executable="${python.exe}" failonerror="true">
+            <env key="Path" value="${vdb.dir};${ngs.dir};${env.Path}"/>            
+            <env key="NGS_PY_DOWNLOAD_LIBRARY" value="0"/>
+            <arg value="tests.py" />
+        </exec>
+    </target>
+    
+</project>
diff --git a/test/ngs-python/tests.py b/test/ngs-python/tests.py
new file mode 100644
index 0000000..7748d8f
--- /dev/null
+++ b/test/ngs-python/tests.py
@@ -0,0 +1,506 @@
+import unittest
+from ngs import NGS
+from ngs.ErrorMsg import ErrorMsg
+from ngs.ReadCollection import ReadCollection
+from ngs.ReferenceSequence import ReferenceSequence
+from ngs.Alignment import Alignment
+from ngs.Read import Read
+
+PrimaryOnly           = "SRR1063272"
+WithSecondary         = "SRR833251"
+WithGroups            = "SRR822962"
+WithCircularRef       = "SRR1769246"
+SingleFragmentPerSpot = "SRR2096940";
+
+def getRead(id):
+    run = NGS.openReadCollection(PrimaryOnly)
+    return run.getRead(id)
+
+def getAlignment(id):
+    run = NGS.openReadCollection(PrimaryOnly)
+    return run.getAlignment(id)
+    
+def getSecondaryAlignment(id):
+    run = NGS.openReadCollection(WithSecondary)
+    return run.getAlignment(id)
+
+def getReference():
+    return NGS.openReadCollection(PrimaryOnly).getReference("supercont2.1")
+
+def getReferenceSequence():
+    return NGS.openReferenceSequence("NC_011752.1")
+    
+class Tests(unittest.TestCase):
+    
+    def fail(self):
+        self.assertTrue(False)
+    
+    def test_open_success(self):
+        run = NGS.openReadCollection(PrimaryOnly)
+    
+    def test_open_fail(self):
+        try:
+            run = NGS.openReadCollection("SRRsomejunk")
+            self.fail()
+        except ErrorMsg:
+            pass
+
+    def test_ReadCollection_getName(self):
+        self.assertEqual(PrimaryOnly, NGS.openReadCollection(PrimaryOnly).getName())
+    
+    def test_ReadCollection_getReadGroup(self):
+        gr = NGS.openReadCollection(PrimaryOnly).getReadGroup("C1ELY.6")
+    
+    def test_ReadCollection_getReadGroups(self):
+        it = NGS.openReadCollection(PrimaryOnly).getReadGroups()
+    
+    def test_ReadCollection_getReferences(self):
+        it = NGS.openReadCollection(PrimaryOnly).getReferences()
+    
+    def test_ReadCollection_getReference(self):
+        ref = NGS.openReadCollection(PrimaryOnly).getReference("supercont2.1")
+
+    def test_ReadCollection_hasReference(self):
+        assert ( NGS.openReadCollection(PrimaryOnly).hasReference("supercont2.1") )
+        assert ( not NGS.openReadCollection(PrimaryOnly).hasReference("non-existent acc") )
+
+    def test_ReadCollection_getAlignment(self):
+        al = NGS.openReadCollection(PrimaryOnly).getAlignment(PrimaryOnly + ".PA.1")
+    
+    def test_ReadCollection_getAlignments_Primary(self):
+        alIt = NGS.openReadCollection(PrimaryOnly).getAlignments(Alignment.primaryAlignment)
+
+    def test_ReadCollection_getAlignments_Secondary(self):
+        alIt = NGS.openReadCollection(PrimaryOnly).getAlignments(Alignment.secondaryAlignment)
+
+    def test_ReadCollection_getAlignments_all(self):
+        alIt = NGS.openReadCollection(PrimaryOnly).getAlignments(Alignment.all)
+
+    def test_ReadCollection_getAlignmentCount_PrimaryOnly(self):
+        self.assertEqual(3987701, NGS.openReadCollection(PrimaryOnly).getAlignmentCount())
+
+    def test_ReadCollection_getAlignmentCount_PrimaryOnly_Primary(self):
+        self.assertEqual(3987701, NGS.openReadCollection(PrimaryOnly).getAlignmentCount(Alignment.primaryAlignment))
+
+    def test_ReadCollection_getAlignmentCount_PrimaryOnly_Secondary(self):
+        self.assertEqual(0, NGS.openReadCollection(PrimaryOnly).getAlignmentCount(Alignment.secondaryAlignment))
+
+    def test_ReadCollection_getAlignmentCount_PrimaryOnly_All(self):
+        self.assertEqual(3987701, NGS.openReadCollection(PrimaryOnly).getAlignmentCount(Alignment.all))
+
+    def test_ReadCollection_getAlignmentCount_WithSecondary(self):
+        self.assertEqual(178, NGS.openReadCollection(WithSecondary).getAlignmentCount())
+
+    def test_ReadCollection_getAlignmentCount_WithSecondary_Primary(self):
+        self.assertEqual(168, NGS.openReadCollection(WithSecondary).getAlignmentCount(Alignment.primaryAlignment))
+
+    def test_ReadCollection_getAlignmentCount_WithSecondary_Secondary(self):
+        self.assertEqual(10, NGS.openReadCollection(WithSecondary).getAlignmentCount(Alignment.secondaryAlignment))
+
+    def test_ReadCollection_getAlignmentCount_WithSecondary_All(self):
+        self.assertEqual(178, NGS.openReadCollection(WithSecondary).getAlignmentCount(Alignment.all))
+    
+    def test_ReadCollection_getAlignmentRange(self):
+        # straddling primary and secondary alignments
+        alIt = NGS.openReadCollection(WithSecondary).getAlignmentRange(166, 5)
+        self.assertTrue(alIt.nextAlignment())
+        self.assertEqual(WithSecondary + ".PA.166", alIt.getAlignmentId())
+    
+    def test_ReadCollection_getRead(self):
+        read = NGS.openReadCollection(PrimaryOnly).getRead(PrimaryOnly + ".R.1")
+        self.assertEqual(PrimaryOnly + ".R.1", read.getReadId())
+
+    def test_ReadCollection_getReads(self):
+        readIt = NGS.openReadCollection(PrimaryOnly).getReads(Read.all)
+        self.assertTrue(readIt.nextRead())
+        self.assertEqual(PrimaryOnly + ".R.1", readIt.getReadId())
+
+    def test_ReadCollection_getReadCount(self):
+        self.assertEqual(2280633, NGS.openReadCollection(PrimaryOnly).getReadCount())
+
+    def test_ReadCollection_getReadRange(self):
+        readIt = NGS.openReadCollection(PrimaryOnly).getReadRange(2, 3)
+        self.assertTrue(readIt.nextRead())
+        self.assertEqual(PrimaryOnly + ".R.2", readIt.getReadId())
+
+
+# Read 
+
+    def test_Read_getReadCategory_full(self):
+        self.assertEqual(Read.fullyAligned, getRead(PrimaryOnly + ".R.1").getReadCategory())
+        
+    def test_Read_getReadCategory_partial(self):
+        self.assertEqual(Read.partiallyAligned, getRead(PrimaryOnly + ".R.3").getReadCategory())
+    
+    def test_Read_getNumFragments(self):
+        self.assertEqual(2, getRead(PrimaryOnly + ".R.1").getNumFragments())
+    
+    def test_Read_fragmentIsAligned_partial(self):
+        read = NGS.openReadCollection(PrimaryOnly).getRead(PrimaryOnly + ".R.3")
+        self.assertEqual(True, read.fragmentIsAligned(0))
+        self.assertEqual(False, read.fragmentIsAligned(1))
+    
+# FragmentIterator
+    def test_FragmentIterator_ThrowsBeforeNext(self):
+        try:
+            getRead(PrimaryOnly + ".R.1").getFragmentId()
+            self.fail()
+        except ErrorMsg:
+            pass
+
+    def test_FragmentIterator_Next(self):
+        read = getRead(PrimaryOnly + ".R.1")
+        self.assertTrue(read.nextFragment())
+        read.getReadCategory() # does not throw
+
+# Fragment
+    def test_Read_getFragmentId(self):
+        read = getRead(PrimaryOnly + ".R.1")
+        self.assertTrue(read.nextFragment())
+        self.assertEqual(PrimaryOnly + ".FR0.1", read.getFragmentId())
+
+    def test_getFragmentBases(self):
+        read = getRead(PrimaryOnly + ".R.1")
+        self.assertTrue(read.nextFragment())
+        self.assertTrue(read.nextFragment())
+        self.assertEqual("GGTA", read.getFragmentBases(2, 4));
+
+    def test_getFragmentQualities(self):
+        read = getRead(PrimaryOnly + ".R.1")
+        self.assertTrue(read.nextFragment())
+        self.assertTrue(read.nextFragment())
+        self.assertEqual("@DDA", read.getFragmentQualities(2, 4))
+
+    
+# Alignment
+    
+    def test_Alignment_getAlignmentId(self):
+        self.assertEqual(PrimaryOnly + ".PA.1", getAlignment(PrimaryOnly + ".PA.1").getAlignmentId())
+    
+    def test_Alignment_getReferenceSpec(self):
+        self.assertEqual("supercont2.1", getAlignment(PrimaryOnly + ".PA.1").getReferenceSpec())
+
+    def test_Alignment_getMappingQuality(self):
+        self.assertEqual(60, getAlignment(PrimaryOnly + ".PA.1").getMappingQuality())
+    
+    def test_Alignment_getReferenceBases(self):
+        self.assertEqual("ACTCGACATTCTGTCTTCGACCTATCTTTCTCCTCTCCCAGTCATCGCCCAGTAGAATTACCAGGCAATGAACCACGGCCTTTCATCCCAACGGCACAGCA", 
+                      getAlignment(PrimaryOnly + ".PA.1").getReferenceBases())
+    
+    def test_Alignment_getReadGroup(self):
+        self.assertEqual("C1ELY.6", getAlignment(PrimaryOnly + ".PA.1").getReadGroup())
+    
+    def test_Alignment_getReadId(self):
+        self.assertEqual(PrimaryOnly + ".R.165753", getAlignment(PrimaryOnly + ".PA.5").getReadId())
+
+    def test_Alignment_getFragmentId(self):
+        self.assertEqual(PrimaryOnly + ".FA0.1", getAlignment(PrimaryOnly + ".PA.1").getFragmentId())
+    
+    def test_Alignment_getFragmentBases_Raw(self):
+        self.assertEqual("TGGATGCTCTGGAAAATCTGAAAAGTGGTGTTTGTAAGGTTTGCTGGCTGCCCATATACCACATGGATGATGGGGCTTTCCATTTTAATGTTGAAGGAGGA", 
+                      getAlignment(PrimaryOnly + ".PA.4").getFragmentBases())
+    
+    def test_Alignment_getFragmentQualities_Raw(self):
+        self.assertEqual("######AA>55;5(;63;;3@;A9??;6..73CDCIDA>DCB>@B=;@B?;;ADAB<DD?1*>@C9:EC?2++A3+F4EEB<E>EEIEDC2?C:;AB+==1", 
+                      getAlignment(PrimaryOnly + ".PA.4").getFragmentQualities())
+    
+    def test_Alignment_getFragmentBases_Clipped(self):
+        self.assertEqual("CTTCAACATTAAAATGGAAAGCCCCATCATCCATGTGGTATATGGGCAGCCAGCAAACCTTACAAACACCACTTTTCAGATTTTCCAGAGCATCCA", 
+                      getAlignment(PrimaryOnly + ".PA.4").getClippedFragmentBases())
+    
+    def test_Alignment_getFragmentQualities_Clipped(self):
+        self.assertEqual("#AA>55;5(;63;;3@;A9??;6..73CDCIDA>DCB>@B=;@B?;;ADAB<DD?1*>@C9:EC?2++A3+F4EEB<E>EEIEDC2?C:;AB+==1", 
+                      getAlignment(PrimaryOnly + ".PA.4").getClippedFragmentQualities())
+
+    def test_Alignment_getAlignedFragmentBases(self):
+        self.assertEqual("ATATGGGTTCACTCCAACAGTGAACCATTCCAAAAGACCTTGCCTGCGTGGCCATCTCCTCACAAACCCACCATCCCGCAACATCTCAGGTATCATACCTT", 
+                      getAlignment(PrimaryOnly + ".PA.2").getAlignedFragmentBases())
+    
+    def test_Alignment_getAlignmentCategory(self):
+        self.assertEqual(Alignment.primaryAlignment, getAlignment(PrimaryOnly + ".PA.4").getAlignmentCategory())
+    
+    def test_Alignment_getAlignmentPosition(self):
+        self.assertEqual(85, getAlignment(PrimaryOnly + ".PA.1").getAlignmentPosition())
+    
+    def test_Alignment_getAlignmentLength(self):
+        self.assertEqual(101, getAlignment(PrimaryOnly + ".PA.1").getAlignmentLength())
+    
+    def test_Alignment_getIsReversedOrientation_False(self):
+        self.assertFalse(getAlignment(PrimaryOnly + ".PA.1").getIsReversedOrientation())
+
+    def test_Alignment_getIsReversedOrientation_True(self):
+        self.assertTrue(getAlignment(PrimaryOnly + ".PA.2").getIsReversedOrientation())
+    
+    def test_Alignment_getSoftClip_None(self):
+        al = getAlignment(PrimaryOnly + ".PA.1")
+        self.assertEqual(0, al.getSoftClip(Alignment.clipLeft))
+        self.assertEqual(0, al.getSoftClip(Alignment.clipRight))
+        
+    def test_Alignment_getSoftClip_Left(self):
+        al = getAlignment(PrimaryOnly + ".PA.4")
+        self.assertEqual(5, al.getSoftClip(Alignment.clipLeft))
+        self.assertEqual(0, al.getSoftClip(Alignment.clipRight))
+        
+    def test_Alignment_getSoftClip_Right(self):
+        al = getAlignment(PrimaryOnly + ".PA.10")
+        self.assertEqual(0,  al.getSoftClip(Alignment.clipLeft))
+        self.assertEqual(13, al.getSoftClip(Alignment.clipRight))
+    
+    def test_Alignment_getTemplateLength(self):
+        self.assertEqual(201, getAlignment(PrimaryOnly + ".PA.1").getTemplateLength())
+    
+    def test_Alignment_getShortCigar_Unclipped(self):
+        self.assertEqual("5S96M", getAlignment(PrimaryOnly + ".PA.4").getShortCigar(False))
+        
+    def test_Alignment_getShortCigar_Clipped(self):
+        self.assertEqual("96M", getAlignment(PrimaryOnly + ".PA.4").getShortCigar(True))
+
+    def test_Alignment_getLongCigar_Unclipped(self):
+        self.assertEqual("5S1X8=1X39=1X46=", getAlignment(PrimaryOnly + ".PA.4").getLongCigar(False))
+
+    def test_Alignment_getLongCigar_Clipped(self):
+        self.assertEqual("1X8=1X39=1X46=", getAlignment(PrimaryOnly + ".PA.4").getLongCigar(True))
+    
+    def test_Alignment_hasMate_Primary_No(self):
+        self.assertFalse(getAlignment(PrimaryOnly + ".PA.99").hasMate())
+
+    def test_Alignment_hasMate_Primary_Yes(self):
+        self.assertTrue(getAlignment(PrimaryOnly + ".PA.1").hasMate())
+        
+    def test_Alignment_hasMate_Secondary(self):
+        self.assertFalse(getSecondaryAlignment(WithSecondary + ".SA.169").hasMate())
+
+    def test_Alignment_getMateAlignmentId(self):
+        self.assertEqual(PrimaryOnly + ".PA.2", getAlignment(PrimaryOnly + ".PA.1").getMateAlignmentId())
+        
+    def test_Alignment_getMateAlignmentId_Missing(self):
+        try:
+            getAlignment(PrimaryOnly + ".PA.99").getMateAlignmentId()
+            self.fail()
+        except ErrorMsg:
+            pass
+        
+    def test_Alignment_getMateAlignmentId_SecondaryThrows(self):
+        try:
+            getSecondaryAlignment(WithSecondary + ".SA.172").getMateAlignmentId()
+            self.fail()
+        except ErrorMsg:
+            pass
+    
+    def test_Alignment_getMateAlignment(self):
+        self.assertEqual(PrimaryOnly + ".PA.2", getAlignment(PrimaryOnly + ".PA.1").getMateAlignment().getAlignmentId())
+        
+    def test_Alignment_getMateAlignment_Missing(self):
+        try:
+            getAlignment(PrimaryOnly + ".PA.99").getMateAlignment()
+            self.fail()
+        except ErrorMsg:
+            pass
+
+    def test_Alignment_getMateAlignment_SecondaryThrows(self):
+        try:
+            getSecondaryAlignment(WithSecondary +".SA.172").getMateAlignment ()
+            self.fail()
+        except ErrorMsg:
+            pass
+    
+    def test_Alignment_getMateReferenceSpec(self):
+        self.assertEqual("supercont2.1",  getAlignment(PrimaryOnly + ".PA.1").getMateReferenceSpec())
+    
+    def test_Alignment_getMateIsReversedOrientation_Yes(self):
+        self.assertTrue(getAlignment(PrimaryOnly + ".PA.1").getMateIsReversedOrientation())
+
+    def test_Alignment_getMateIsReversedOrientation_No(self):
+        self.assertFalse(getAlignment(PrimaryOnly + ".PA.2").getMateIsReversedOrientation())
+    
+    def test_Alignment_isPaired_MultiFragmentsPerSpot(self):
+        readCollection = NGS.openReadCollection(PrimaryOnly)
+        alignment = readCollection.getAlignment(PrimaryOnly + ".PA.1")
+        self.assertTrue(alignment.isPaired())
+        
+        alignment = readCollection.getAlignment(PrimaryOnly + ".PA.2")
+        self.assertTrue(alignment.isPaired())
+        
+        # has unaligned mate
+        alignment = readCollection.getAlignment (PrimaryOnly + ".PA.6")
+        self.assertTrue(alignment.isPaired())
+    
+    def test_Alignment_isPaired_SingleFragmentPerSpot(self):
+        readCollection = NGS.openReadCollection(SingleFragmentPerSpot)
+        alignment = readCollection.getAlignment(SingleFragmentPerSpot + ".PA.1")
+        self.assertFalse(alignment.isPaired())
+
+# ReferenceSequence
+    def test_ReferenceSequence_getCanonicalName(self):
+        self.assertEqual("gi|218511148|ref|NC_011752.1|", getReferenceSequence().getCanonicalName())
+    
+    def test_ReferenceSequence_getIsCircular_Yes(self):
+        self.assertTrue(getReferenceSequence().getIsCircular())
+    
+    def test_ReferenceSequence_getLength(self):
+        self.assertEqual(72482, getReferenceSequence().getLength())
+    
+    def test_ReferenceSequence_getReferenceBases(self):
+        self.assertEqual("ATAAA", getReferenceSequence().getReferenceBases(72482 - 5))
+
+    def test_ReferenceSequence_getReferenceBases_Length(self):
+        self.assertEqual("TACA", getReferenceSequence().getReferenceBases(4998, 4))
+    
+    def test_ReferenceSequence_getReferenceChunk(self):
+        self.assertEqual("TAATA", getReferenceSequence().getReferenceChunk(5000 - 5, 5))
+
+    def test_ReferenceSequence_getReferenceChunk_Length (self):
+        self.assertEqual("TAATA", getReferenceSequence().getReferenceChunk(5000 - 5, 10))
+        
+# Reference
+    def test_Reference_getCommonName(self):
+        self.assertEqual("supercont2.1", getReference().getCommonName())
+    
+    def test_Reference_getCanonicalName(self):
+        self.assertEqual("NC_000007.13", NGS.openReadCollection("SRR821492").getReference("chr7").getCanonicalName())
+    
+    def test_Reference_getIsCircular_No(self):
+        self.assertFalse(getReference().getIsCircular())
+
+    def test_Reference_getIsCircular_Yes(self):
+        self.assertTrue(NGS.openReadCollection("SRR821492").getReference("chrM").getIsCircular())
+    
+    def test_Reference_getLength(self):
+        self.assertEqual(2291499, getReference().getLength())
+    
+    def test_Reference_getReferenceBases(self):
+        self.assertEqual("ATCTG", getReference().getReferenceBases(2291499 - 5))
+
+    def test_Reference_getReferenceBases_Length(self):
+        self.assertEqual("GCGCTATGAC", getReference().getReferenceBases(9000, 10))
+    
+    def test_Reference_getReferenceChunk(self):
+        self.assertEqual("CTAGG", getReference().getReferenceChunk(5000 - 5, 5))
+
+    def test_Reference_getReferenceChunk_Length (self):
+        self.assertEqual("GCGCTATGAC", getReference().getReferenceChunk(9000, 10))
+    
+    def test_Reference_getAlignment(self):
+        self.assertEqual(PrimaryOnly + ".PA.1", getReference().getAlignment(PrimaryOnly + ".PA.1").getAlignmentId())
+    
+#TODO: getAlignmentCount
+#TODO: getAlignmentCount_Filtered
+
+#TODO: getPileups
+#TODO: getPileupRange
+#TODO: getPileupRange_Filtered
+
+# ReferenceIterator
+
+    def test_ReferenceIterator_ThrowBeforeNext(self):
+        it = NGS.openReadCollection(PrimaryOnly).getReferences()
+        try:
+            it.getCommonName()
+            self.fail()
+        except ErrorMsg:
+            pass
+    
+    def test_ReferenceIterator_Next(self):
+        it = NGS.openReadCollection(PrimaryOnly).getReferences()
+        self.assertTrue(it.nextReference())
+        self.assertEqual("supercont2.1", it.getCommonName())
+    
+# AlignmentIterator from Reference (ReferenceWindow)
+    def test_ReferenceWindow(self):
+        it = NGS.openReadCollection(WithSecondary).getReference("gi|169794206|ref|NC_010410.1|").getAlignments(Alignment.all) 
+        self.assertTrue(it.nextAlignment())  
+    
+        # the first 2 secondary alignments' locations on the list: #34, #61
+        count = 1;
+        while it.nextAlignment():
+            if it.getAlignmentCategory() == Alignment.secondaryAlignment:
+                break
+            count += 1
+
+        self.assertEqual(34, count)    
+        while it.nextAlignment():
+            if it.getAlignmentCategory() == Alignment.secondaryAlignment:
+                break
+            count += 1
+
+        self.assertEqual(61, count)
+    
+    def test_ReferenceWindow_Slice(self):
+        it = NGS.openReadCollection(WithSecondary).getReference("gi|169794206|ref|NC_010410.1|").getAlignmentSlice(516000, 100000) 
+        self.assertTrue(it.nextAlignment())  
+        self.assertEqual(WithSecondary + ".PA.33", it.getAlignmentId())
+        self.assertTrue(it.nextAlignment())  
+        self.assertEqual(WithSecondary + ".PA.34", it.getAlignmentId())
+        self.assertTrue(it.nextAlignment())  
+        self.assertEqual(WithSecondary + ".SA.169", it.getAlignmentId()) #secondary
+        self.assertTrue(it.nextAlignment())  
+        self.assertEqual(WithSecondary + ".PA.35", it.getAlignmentId())
+        self.assertFalse(it.nextAlignment())  
+   
+    def test_ReferenceWindow_Slice_Filtered_Category (self):
+        it = NGS.openReadCollection(WithSecondary).getReference("gi|169794206|ref|NC_010410.1|").getAlignmentSlice(516000, 100000, Alignment.primaryAlignment) 
+        self.assertTrue(it.nextAlignment())  
+        self.assertEqual(WithSecondary + ".PA.33", it. getAlignmentId())
+        self.assertTrue(it.nextAlignment())  
+        self.assertEqual(WithSecondary + ".PA.34", it. getAlignmentId())
+        self.assertTrue(it.nextAlignment())  
+        self.assertEqual(WithSecondary + ".PA.35", it. getAlignmentId()) # no secondary
+        self.assertFalse(it.nextAlignment())
+    
+    def test_ReferenceWindow_Slice_Filtered_Start_Within_Slice (self):
+        ref = NGS.openReadCollection(WithCircularRef).getReference("NC_012920.1")
+        it = ref.getFilteredAlignmentSlice(0, ref.getLength(), Alignment.all, Alignment.startWithinSlice, 0)
+    
+        self.assertTrue(it.nextAlignment())
+        lastAlignmentPosition = it.getAlignmentPosition()
+        while it.nextAlignment():
+            currentPosition = it.getAlignmentPosition()
+            errorMsg = "Sorting violated. Last position (" + str(lastAlignmentPosition) + ") is higher than current one (" + str(currentPosition) + ")"
+            self.assertTrue ( lastAlignmentPosition <= currentPosition, errorMsg )
+            lastAlignmentPosition = currentPosition
+    
+    # ReadGroup
+    def test_ReadGroup_getName(self):
+        gr = NGS.openReadCollection(PrimaryOnly).getReadGroup("C1ELY.6")
+        self.assertEqual("C1ELY.6", gr.getName())
+
+    def test_ReadGroup_has(self):
+        assert ( NGS.openReadCollection(PrimaryOnly).hasReadGroup("C1ELY.6") )
+        assert ( not NGS.openReadCollection(PrimaryOnly).hasReadGroup("non-existent read group") )
+
+    def test_ReadGroup_getStatistics(self):
+        gr = NGS.openReadCollection(WithGroups).getReadGroup("GS57510-FS3-L03")
+
+        stats = gr.getStatistics()
+    
+        self.assertEqual(34164461870, stats.getAsU64("BASE_COUNT"))
+        self.assertEqual(34164461870, stats.getAsU64("BIO_BASE_COUNT"))
+        self.assertEqual(488063741,   stats.getAsU64("SPOT_COUNT"))
+        self.assertEqual(5368875807,  stats.getAsU64("SPOT_MAX"))
+        self.assertEqual(4880812067,  stats.getAsU64("SPOT_MIN"))
+
+    # def test_ReadGroup_getRead(self):
+        # gr = NGS.openReadCollection(PrimaryOnly).getReadGroup("C1ELY.6")
+        # r = gr.getRead(PrimaryOnly + ".R.1")
+        # self.assertEqual("C1ELY.6", r.getReadGroup())
+    
+    # def test_ReadGroup_getReads(self):
+        # gr = NGS.openReadCollection(PrimaryOnly).getReadGroup("C1ELY.6")
+        # r = gr.getReads(Read.partiallyAligned)
+    
+    # ReadGroupIterator
+    def test_ReadGroupIterator_ThrowBeforeNext(self):
+        it = NGS.openReadCollection(PrimaryOnly).getReadGroups()
+        try:
+            it.getName()
+            self.fail()
+        except ErrorMsg:
+            pass
+    
+    def test_ReadGroupIterator_Next(self):
+        it = NGS.openReadCollection(PrimaryOnly).getReadGroups();
+        self.assertTrue(it.nextReadGroup());
+        name = it.getName();
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/test/ngs/Makefile b/test/ngs/Makefile
new file mode 100644
index 0000000..a479010
--- /dev/null
+++ b/test/ngs/Makefile
@@ -0,0 +1,216 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/ngs
+
+TEST_TOOLS = \
+    test-ngs \
+    test-ngs_sra \
+ 	test-ngs_sradb \
+ 	test-ngs_csra1 \
+ 	test-ngs_csra1_readcollection \
+    test-ngs_csra1_refwin \
+    test-ngs_csra1_pileup \
+    test-ngs_reference \
+    test-ngs_fragmentblob \
+
+include $(TOP)/build/Makefile.env
+
+
+# make sure runs are not cached in the user repository when running tests
+ifeq ($(wildcard ../../../asm-trace),)
+	ifeq (,$(VDB_CONFIG))
+		VDB_CONFIG = $(shell pwd)/../only-remote-repository.kfg
+	endif
+endif
+
+$(TEST_TOOLS) $(SLOW_TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS) $(SLOW_TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# common definitions
+#
+INCDIRS +=  -I$(TOP)/libs/ngs
+
+TEST_NGS_LIB = \
+	-sncbi-vdb \
+	-skapp \
+    -sktst
+
+#-------------------------------------------------------------------------------
+# ngs-makedb
+# Create test databases for use in other suites
+NGS_MAKEDB_SRC = \
+	ngstest_makedb
+
+NGS_MAKEDB_OBJ = \
+	$(addsuffix .$(OBJX),$(NGS_MAKEDB_SRC))
+
+NGS_MAKEDB_LIB = \
+    -skapp \
+	-sktst \
+    -sncbi-wvdb
+
+$(TEST_BINDIR)/ngs-makedb: $(NGS_MAKEDB_OBJ)
+	$(LP) --exe -o $@ $^ $(NGS_MAKEDB_LIB)
+
+makedb: $(TEST_BINDIR)/ngs-makedb
+	cd $(SRCDIR)/data; $(TEST_BINDIR)/ngs-makedb
+
+#-------------------------------------------------------------------------------
+# test-ngs
+#
+TEST_NGS_SRC = \
+	ngstest
+
+TEST_NGS_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_SRC))
+
+$(TEST_BINDIR)/test-ngs: $(TEST_NGS_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_LIB)
+
+ngs: test-ngs
+	$(TEST_BINDIR)/$^
+
+#-------------------------------------------------------------------------------
+# test-ngs_sra
+#
+TEST_NGS_SRA_SRC = \
+	ngstest_sra
+
+TEST_NGS_SRA_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_SRA_SRC))
+
+$(TEST_BINDIR)/test-ngs_sra: $(TEST_NGS_SRA_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_LIB)
+
+sra: test-ngs_sra
+	$(TEST_BINDIR)/$^
+
+#-------------------------------------------------------------------------------
+# test-ngs_sradb
+#
+TEST_NGS_SRADB_SRC = \
+	ngstest_sradb
+
+TEST_NGS_SRADB_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_SRADB_SRC))
+
+$(TEST_BINDIR)/test-ngs_sradb: $(TEST_NGS_SRADB_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_LIB)
+
+sradb: test-ngs_sradb
+	$(TEST_BINDIR)/$^
+
+#-------------------------------------------------------------------------------
+# test-ngs_csra1
+#
+TEST_NGS_CSRA1_SRC = \
+	ngstest_csra1
+
+TEST_NGS_CSRA1_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_CSRA1_SRC))
+
+$(TEST_BINDIR)/test-ngs_csra1: $(TEST_NGS_CSRA1_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_LIB)
+
+csra1: test-ngs_csra1
+	$(TEST_BINDIR)/$^
+
+#-------------------------------------------------------------------------------
+# test-ngs_csra1_readcollection
+#
+TEST_NGS_CSRA1_READCOLLECTION_SRC = \
+	ngstest_csra1_readcollection
+
+TEST_NGS_CSRA1_READCOLLECTION_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_CSRA1_READCOLLECTION_SRC))
+
+$(TEST_BINDIR)/test-ngs_csra1_readcollection: $(TEST_NGS_CSRA1_READCOLLECTION_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_LIB)
+
+#-------------------------------------------------------------------------------
+# test-ngs_csra1_refwin
+#
+TEST_NGS_CSRA1_REFWIN_SRC = \
+	ngstest_csra1_refwin
+
+TEST_NGS_CSRA1_REFWIN_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_CSRA1_REFWIN_SRC))
+
+$(TEST_BINDIR)/test-ngs_csra1_refwin: $(TEST_NGS_CSRA1_REFWIN_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_LIB)
+
+refwin: test-ngs_csra1_refwin
+	$(TEST_BINDIR)/$^
+
+#-------------------------------------------------------------------------------
+# test-ngs_csra1_pileup
+#
+TEST_NGS_CSRA1_PILEUP_SRC = \
+	ngstest_csra1_pileup
+
+TEST_NGS_CSRA1_PILEUP_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_CSRA1_PILEUP_SRC))
+
+$(TEST_BINDIR)/test-ngs_csra1_pileup: $(TEST_NGS_CSRA1_PILEUP_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_LIB)
+
+#-------------------------------------------------------------------------------
+# test-ngs_reference
+#
+TEST_NGS_REFERENCE_SRC = \
+	ngstest_reference
+
+TEST_NGS_REFERENCE_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_REFERENCE_SRC))
+
+$(TEST_BINDIR)/test-ngs_reference: $(TEST_NGS_REFERENCE_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_NGS_LIB)
+
+reference: test-ngs_reference
+	$(TEST_BINDIR)/$^
+
+#-------------------------------------------------------------------------------
+# test-ngs_fragmentblob
+#
+TEST_NGS_SRC = \
+	ngstest_fragmentblob
+
+TEST_NGS_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_NGS_SRC))
+
+$(TEST_BINDIR)/test-ngs_fragmentblob: $(TEST_NGS_OBJ) makedb
+	$(LP) --exe -o $@ $^ $(TEST_NGS_LIB)
+
+fragmentblob: test-ngs_fragmentblob
+	cd $(SRCDIR); $(TEST_BINDIR)/$^
diff --git a/test/ngs/data/.gitignore b/test/ngs/data/.gitignore
new file mode 100644
index 0000000..43753d2
--- /dev/null
+++ b/test/ngs/data/.gitignore
@@ -0,0 +1 @@
+SparseFragmentBlobs
diff --git a/test/ngs/data/SysPathTest/md/cur b/test/ngs/data/SysPathTest/md/cur
new file mode 100644
index 0000000..a4c548a
Binary files /dev/null and b/test/ngs/data/SysPathTest/md/cur differ
diff --git a/test/ngs/data/SysPathTest/md5 b/test/ngs/data/SysPathTest/md5
new file mode 100644
index 0000000..23a0920
--- /dev/null
+++ b/test/ngs/data/SysPathTest/md5
@@ -0,0 +1 @@
+e632416bc831c3052cf4bc591d569651 *md/cur
diff --git a/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/data b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/data
new file mode 100644
index 0000000..422b42c
Binary files /dev/null and b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/data differ
diff --git a/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx
new file mode 100644
index 0000000..0a37ea2
Binary files /dev/null and b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx differ
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx0
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx0
diff --git a/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx1 b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx1
new file mode 100644
index 0000000..4a0b075
Binary files /dev/null and b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx1 differ
diff --git a/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx2 b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx2
new file mode 100644
index 0000000..8970933
Binary files /dev/null and b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/idx2 differ
diff --git a/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/md/cur b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/md/cur
new file mode 100644
index 0000000..76b1009
Binary files /dev/null and b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/md/cur differ
diff --git a/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/md5 b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/md5
new file mode 100644
index 0000000..1933b3c
--- /dev/null
+++ b/test/ngs/data/SysPathTest/tbl/SEQUENCE/col/READ/md5
@@ -0,0 +1,6 @@
+6fd353b18b12ea9f51247e16c2a4a0d5 *md/cur
+0387b26b33dd31382152f87027ee9c90 *idx
+af0e3b0ce3ba8aea4adcdc6c6107dd25 *idx1
+d41d8cd98f00b204e9800998ecf8427e *idx0
+5f3b15a8f2d8cd31205e2bce7a0270c0 *idx2
+9f89f40e67feb07c68a4b4ee176288b4 *data
diff --git a/test/ngs/data/SysPathTest/tbl/SEQUENCE/md/cur b/test/ngs/data/SysPathTest/tbl/SEQUENCE/md/cur
new file mode 100644
index 0000000..4ec6114
Binary files /dev/null and b/test/ngs/data/SysPathTest/tbl/SEQUENCE/md/cur differ
diff --git a/test/ngs/data/SysPathTest/tbl/SEQUENCE/md5 b/test/ngs/data/SysPathTest/tbl/SEQUENCE/md5
new file mode 100644
index 0000000..36a701b
--- /dev/null
+++ b/test/ngs/data/SysPathTest/tbl/SEQUENCE/md5
@@ -0,0 +1 @@
+5273d66b808595e261380b3b56584188 *md/cur
diff --git a/test/ngs/ngs_c_fixture.hpp b/test/ngs/ngs_c_fixture.hpp
new file mode 100644
index 0000000..b31f183
--- /dev/null
+++ b/test/ngs/ngs_c_fixture.hpp
@@ -0,0 +1,180 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ngs_c_fixture_
+#define _h_ngs_c_fixture_
+
+/**
+* Unit tests for NGS C interface, common definitions
+*/
+
+#include <sysalloc.h>
+
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+#include <ktst/unit_test.hpp>
+
+#include <kfc/xcdefs.h>
+#include <kfc/except.h>
+
+#include <kfc/ctx.h>
+#include <kfc/rsrc.h>
+
+#include "NGS_ReadCollection.h"
+#include "NGS_Read.h"
+#include "NGS_ReadGroup.h"
+#include "NGS_Reference.h"
+#include "NGS_Alignment.h"
+#include "NGS_Statistics.h"
+
+#include <NGS_String.h>
+
+#define SHOW_UNIMPLEMENTED 0
+
+#define ENTRY \
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing ); \
+    m_ctx = ctx; \
+
+#define ENTRY_ACC(acc) \
+    ENTRY; \
+    m_acc = acc; \
+    m_coll = NGS_ReadCollectionMake ( ctx, acc );
+
+#define ENTRY_GET_READ(acc, readNo) \
+    ENTRY_ACC(acc); \
+    GetRead(readNo);
+
+#define ENTRY_GET_REF(acc,ref) \
+    ENTRY_ACC(acc); \
+    GetReference ( ref );
+
+#define EXIT \
+    REQUIRE ( ! FAILED () ); \
+    Release()
+
+////// additional REQUIRE macros
+
+#define REQUIRE_FAILED() ( REQUIRE ( FAILED () ), CLEAR() )
+
+// use for NGS calls returning NGS_String*
+#define REQUIRE_STRING(exp, call) \
+{\
+    string str = toString ( call, ctx, true );\
+    REQUIRE ( ! FAILED () );\
+    REQUIRE_EQ ( string(exp), str);\
+}
+
+//////
+
+std :: string
+toString ( const NGS_String* str, ctx_t ctx, bool release_source = false )
+{
+    if ( str == 0 )
+    {
+        throw std :: logic_error ( "toString ( NULL ) called" );
+    }
+    std :: string ret = std::string ( NGS_StringData ( str, ctx ), NGS_StringSize ( str, ctx ) );
+    if ( release_source )
+    {
+        NGS_StringRelease ( str, ctx );
+    }
+    return ret;
+}
+
+class NGS_C_Fixture
+{
+public:
+    NGS_C_Fixture()
+    : m_ctx(0), m_coll(0), m_read(0), m_readGroup (0), m_ref (0)
+    {
+    }
+    ~NGS_C_Fixture()
+    {
+    }
+
+    virtual void Release()
+    {
+        if (m_ctx != 0)
+        {
+            if (m_coll != 0)
+            {
+                NGS_RefcountRelease ( ( NGS_Refcount* ) m_coll, m_ctx );
+            }
+            if (m_read != 0)
+            {
+                NGS_ReadRelease ( m_read, m_ctx );
+            }
+            if (m_readGroup != 0)
+            {
+                NGS_ReadGroupRelease ( m_readGroup, m_ctx );
+            }
+            if (m_ref != 0)
+            {
+                NGS_ReferenceRelease ( m_ref, m_ctx );
+            }
+            m_ctx = 0; // a pointer into the caller's local memory
+        }
+    }
+
+    std::string ReadId(int64_t id) const
+    {
+        std::ostringstream s;
+        s << m_acc << ".R." << id;
+        return s . str ();
+    }
+    void GetRead(const std::string & id)
+    {
+        m_read = NGS_ReadCollectionGetRead ( m_coll, m_ctx, id.c_str() );
+        if (m_read != 0)
+        {   // initialize the fragment iterator
+            NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, m_ctx );
+        }
+    }
+    void GetRead(int64_t id)
+    {
+        GetRead ( ReadId ( id ) );
+    }
+
+    void GetReference(const char* name)
+    {
+        m_ref = NGS_ReadCollectionGetReference ( m_coll, m_ctx, name );
+        if ( m_ctx -> rc != 0 || m_ref == 0 )
+            throw std :: logic_error ( "GetReference() failed" );
+    }
+
+    const KCtx*         m_ctx;  // points into the test case's local memory
+    std::string         m_acc;
+    NGS_ReadCollection* m_coll;
+    NGS_Read*           m_read;
+    NGS_ReadGroup*      m_readGroup;
+    NGS_Reference*      m_ref;
+};
+
+#endif
+
diff --git a/test/ngs/ngstest.cpp b/test/ngs/ngstest.cpp
new file mode 100644
index 0000000..0f11578
--- /dev/null
+++ b/test/ngs/ngstest.cpp
@@ -0,0 +1,956 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for low-level NGS functions
+*/
+
+// suppress macro max from windows.h
+#define NOMINMAX
+
+#include "ngs_c_fixture.hpp"
+
+#include <kfc/xc.h>
+
+#include <SRA_ReadGroupInfo.h>
+#include <SRA_Statistics.h>
+#include <NGS_Cursor.h>
+#include <SRA_Read.h>
+
+#include <NGS_Id.h>
+
+#include <klib/namelist.h>
+
+#include <kfg/kfg-priv.h>
+#include <kfg/repository.h>
+
+#include <vdb/table.h>
+#include <vdb/database.h>
+#include <vdb/blob.h>
+
+#include <stdexcept>
+#include <cstring>
+#include <limits>
+#include <cmath>
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsTestSuite);
+
+const char* SRA_Accession = "SRR000001";
+const char* SRA_Accession_WithReadGroups = "SRR006061";
+const char* SRADB_Accession_WithBamHeader = "SRR600096";
+
+class ReadGroupInfo_Fixture : public NGS_C_Fixture
+{
+public:
+    ReadGroupInfo_Fixture()
+    : m_tbl(0), m_rgi(0)
+    {
+    }
+    ~ReadGroupInfo_Fixture()
+    {
+    }
+
+    void MakeSRA( const char* acc )
+    {
+        if ( m_tbl != 0 )
+            VTableRelease ( m_tbl );
+        if ( VDBManagerOpenTableRead ( m_ctx -> rsrc -> vdb, & m_tbl, NULL, acc ) != 0 )
+            throw logic_error ("ReadGroupInfo_Fixture::MakeSRA VDBManagerOpenTableRead failed");
+
+        if (m_rgi != 0 )
+            SRA_ReadGroupInfoRelease ( m_rgi, m_ctx );
+        m_rgi = SRA_ReadGroupInfoMake ( m_ctx, m_tbl );
+    }
+    void MakeSRADB( const char* acc )
+    {
+        if ( m_tbl != 0 )
+            VTableRelease ( m_tbl );
+        const VDatabase* db;
+        if ( VDBManagerOpenDBRead ( m_ctx -> rsrc -> vdb, & db, NULL, acc ) != 0 )
+            throw logic_error ("ReadGroupInfo_Fixture::MakeSRADB VDBManagerOpenTableRead failed");
+        if ( VDatabaseOpenTableRead ( db, & m_tbl, "SEQUENCE" ) != 0 )
+            throw logic_error ("ReadGroupInfo_Fixture::MakeSRADB VDatabaseOpenTableRead failed");
+
+        VDatabaseRelease ( db );
+
+        if (m_rgi != 0 )
+            SRA_ReadGroupInfoRelease ( m_rgi, m_ctx );
+        m_rgi = SRA_ReadGroupInfoMake ( m_ctx, m_tbl );
+    }
+
+    virtual void Release()
+    {
+        if (m_ctx != 0)
+        {
+            if (m_rgi != 0)
+                SRA_ReadGroupInfoRelease ( m_rgi, m_ctx );
+            if ( m_tbl != 0 )
+                VTableRelease ( m_tbl );
+        }
+        NGS_C_Fixture :: Release ();
+    }
+
+    const VTable*               m_tbl;
+    const SRA_ReadGroupInfo*    m_rgi;
+};
+
+
+FIXTURE_TEST_CASE ( ReadGroupInfo_Make, ReadGroupInfo_Fixture )
+{
+    ENTRY;
+    MakeSRA ( SRA_Accession_WithReadGroups );
+
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( m_rgi );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( ReadGroupInfo_Count, ReadGroupInfo_Fixture )
+{
+    ENTRY;
+    MakeSRA ( SRA_Accession_WithReadGroups );
+
+    REQUIRE_EQ ( (uint32_t)144, m_rgi -> count );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( ReadGroupInfo_Access, ReadGroupInfo_Fixture )
+{
+    ENTRY;
+    MakeSRA ( SRA_Accession_WithReadGroups );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_NOT_NULL ( m_rgi -> groups [ 2 ] . name );
+    REQUIRE_EQ ( string ( "S104_V2" ), toString ( m_rgi -> groups [ 2 ] . name,    ctx ) );
+
+    REQUIRE_NULL ( m_rgi -> groups [ 2 ] . bam_LB );
+    REQUIRE_NULL ( m_rgi -> groups [ 2 ] . bam_SM );
+
+    REQUIRE_EQ ( (uint64_t)3263,        m_rgi -> groups [ 2 ] . min_row );
+    REQUIRE_EQ ( (uint64_t)6140,        m_rgi -> groups [ 2 ] . max_row );
+    REQUIRE_EQ ( (uint64_t)2878,        m_rgi -> groups [ 2 ] . row_count );
+    REQUIRE_EQ ( (uint64_t)759518,      m_rgi -> groups [ 2 ] . base_count );
+    REQUIRE_EQ ( (uint64_t)653032,      m_rgi -> groups [ 2 ] . bio_base_count );
+
+    EXIT;
+}
+#if SHOW_UNIMPLEMENTED
+FIXTURE_TEST_CASE ( ReadGroupInfo_BamHeader, ReadGroupInfo_Fixture )
+{
+    ENTRY;
+    MakeSRADB ( SRADB_Accession_WithBamHeader );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_NOT_NULL ( m_rgi -> groups [ 0 ] . name );
+    REQUIRE_EQ ( string ( "A1DLC.1" ), toString ( m_rgi -> groups [ 0 ] . name, ctx ) );
+
+    REQUIRE_NOT_NULL ( m_rgi -> groups [ 0 ] . bam_LB );
+    REQUIRE_EQ ( string ( "Solexa-112136" ), toString ( m_rgi -> groups [ 0 ] . bam_LB,  ctx ) );
+
+    REQUIRE_NOT_NULL ( m_rgi -> groups [ 0 ] . bam_SM );
+    REQUIRE_EQ ( string ( "12341_SN_05_1" ), toString ( m_rgi -> groups [ 0 ] . bam_SM,  ctx ) );
+
+    EXIT;
+}
+#endif
+FIXTURE_TEST_CASE ( ReadGroupInfo_Find_Found, ReadGroupInfo_Fixture )
+{
+    ENTRY;
+    MakeSRA ( SRA_Accession_WithReadGroups );
+
+    NGS_String * s = NGS_StringMake ( ctx, "S104_V2", strlen ( "S104_V2" ) );
+    REQUIRE_EQ ( (uint32_t)2, SRA_ReadGroupInfoFind ( m_rgi, ctx, NGS_StringData(s, ctx), NGS_StringSize(s, ctx) ) );
+    REQUIRE ( ! FAILED () );
+    NGS_StringRelease ( s, ctx );
+
+    EXIT;
+}
+
+
+#if 0
+FIXTURE_TEST_CASE ( ReadGroupInfo_PrintAll, ReadGroupInfo_Fixture )
+{
+    ENTRY;
+    MakeSRA ( SRA_Accession_WithReadGroups );
+//    MakeSRA ( "SRR000001" );
+
+    for ( uint32_t  i = 0; i < m_rgi -> count; ++i )
+    {
+        const NGS_String * name = m_rgi -> groups [ i ] . name;
+        REQUIRE_NOT_NULL ( name );
+        cout << NGS_StringData ( name, ctx ) << " "
+             << m_rgi -> groups [ i ] . min_row         << " "
+             << m_rgi -> groups [ i ] . max_row         << " "
+             << m_rgi -> groups [ i ] . row_count       << " "
+             << m_rgi -> groups [ i ] . base_count      << " "
+             << m_rgi -> groups [ i ] . bio_base_count  << " "
+             << endl;
+    }
+
+    EXIT;
+}
+#endif
+
+// NGS_Id
+
+class Id_Fixture : public NGS_C_Fixture
+{
+public:
+    Id_Fixture()
+    : run ( 0 ), id ( 0 )
+    {
+    }
+    ~Id_Fixture()
+    {
+    }
+
+    void Release()
+    {
+        if (m_ctx != 0)
+        {
+            if (run != 0)
+                NGS_StringRelease ( run, m_ctx );
+            if (id != 0)
+                NGS_StringRelease ( id, m_ctx );
+        }
+        NGS_C_Fixture :: Release ();
+    }
+
+    void MakeId ( enum NGS_Object object, int64_t rowId )
+    {
+        run  = NGS_StringMake ( m_ctx, "run", strlen ( "run" ) );
+        id = NGS_IdMake ( m_ctx, run, object, rowId );
+    }
+    void MakeFragmentId ( bool alignment, int64_t rowId, uint32_t frag_num )
+    {
+        run  = NGS_StringMake ( m_ctx, "run", strlen ( "run" ) );
+        id = NGS_IdMakeFragment ( m_ctx, run, alignment, rowId, frag_num);
+    }
+
+    NGS_String * run;
+    NGS_String * id;
+};
+
+
+//TODO: error cases
+
+FIXTURE_TEST_CASE(NGS_IdMake_Read, Id_Fixture)
+{
+    ENTRY;
+
+    MakeId ( NGSObject_Read, 12345678 );
+    REQUIRE_EQ ( string ( "run.R.12345678" ), string ( NGS_StringData ( id, ctx ), NGS_StringSize ( id, ctx ) ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(NGS_IdMake_Primary, Id_Fixture)
+{
+    ENTRY;
+
+    MakeId ( NGSObject_PrimaryAlignment, 12345678 );
+    REQUIRE_EQ ( string ( "run.PA.12345678" ), string ( NGS_StringData ( id, ctx ), NGS_StringSize ( id, ctx ) ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(NGS_IdMake_Secondary, Id_Fixture)
+{
+    ENTRY;
+
+    MakeId ( NGSObject_SecondaryAlignment, 12345678 );
+    REQUIRE_EQ ( string ( "run.SA.12345678" ), string ( NGS_StringData ( id, ctx ), NGS_StringSize ( id, ctx ) ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(NGS_IdMake_ReadFragment, Id_Fixture)
+{
+    ENTRY;
+
+    MakeFragmentId ( false, 12345678, 1 );
+    REQUIRE_EQ ( string ( "run.FR1.12345678" ), string ( NGS_StringData ( id, ctx ), NGS_StringSize ( id, ctx ) ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(NGS_IdMake_AlignmentFragment, Id_Fixture)
+{
+    ENTRY;
+
+    MakeFragmentId ( true, 12345678, 2 );
+    REQUIRE_EQ ( string ( "run.FA2.12345678" ), string ( NGS_StringData ( id, ctx ), NGS_StringSize ( id, ctx ) ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(NGS_Id_Parse_Read, Id_Fixture)
+{
+    ENTRY;
+
+    MakeId ( NGSObject_Read, 12345678 );
+    struct NGS_Id parsed = NGS_IdParse ( NGS_StringData(id, ctx), NGS_StringSize(id, ctx), ctx );
+    REQUIRE_EQ ( string ( "run" ), string ( parsed . run . addr, parsed . run . len ) );
+    REQUIRE_EQ ( (int32_t)NGSObject_Read, parsed . object );
+    REQUIRE_EQ ( (int64_t)12345678, parsed . rowId );
+    REQUIRE_EQ ( (uint32_t)0, parsed . fragId );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(NGS_Id_Parse_Primary, Id_Fixture)
+{
+    ENTRY;
+
+    MakeId ( NGSObject_PrimaryAlignment, 12345678 );
+    struct NGS_Id parsed = NGS_IdParse ( NGS_StringData(id, ctx), NGS_StringSize(id, ctx), ctx );
+    REQUIRE_EQ ( string ( "run" ), string ( parsed . run . addr, parsed . run . len ) );
+    REQUIRE_EQ ( (int32_t)NGSObject_PrimaryAlignment, parsed . object );
+    REQUIRE_EQ ( (int64_t)12345678, parsed . rowId );
+    REQUIRE_EQ ( (uint32_t)0, parsed . fragId );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(NGS_Id_Parse_Secondary, Id_Fixture)
+{
+    ENTRY;
+
+    MakeId ( NGSObject_SecondaryAlignment, 12345678 );
+    struct NGS_Id parsed = NGS_IdParse ( NGS_StringData(id, ctx), NGS_StringSize(id, ctx), ctx );
+    REQUIRE_EQ ( string ( "run" ), string ( parsed . run . addr, parsed . run . len ) );
+    REQUIRE_EQ ( (int32_t)NGSObject_SecondaryAlignment, parsed . object );
+    REQUIRE_EQ ( (int64_t)12345678, parsed . rowId );
+    REQUIRE_EQ ( (uint32_t)0, parsed . fragId );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(NGS_Id_Parse_ReadFragment, Id_Fixture)
+{
+    ENTRY;
+
+    MakeFragmentId ( false, 12345678, 1 );
+    struct NGS_Id parsed = NGS_IdParse ( NGS_StringData(id, ctx), NGS_StringSize(id, ctx), ctx );
+    REQUIRE_EQ ( string ( "run" ), string ( parsed . run . addr, parsed . run . len ) );
+    REQUIRE_EQ ( (int32_t)NGSObject_ReadFragment, parsed . object );
+    REQUIRE_EQ ( (int64_t)12345678, parsed . rowId );
+    REQUIRE_EQ ( (uint32_t)1, parsed . fragId );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(NGS_Id_Parse_AlignmentFragment, Id_Fixture)
+{
+    ENTRY;
+
+    MakeFragmentId ( true, 12345678, 2 );
+    struct NGS_Id parsed = NGS_IdParse ( NGS_StringData(id, ctx), NGS_StringSize(id, ctx), ctx );
+    REQUIRE_EQ ( string ( "run" ), string ( parsed . run . addr, parsed . run . len ) );
+    REQUIRE_EQ ( (int32_t)NGSObject_AlignmentFragment, parsed . object );
+    REQUIRE_EQ ( (int64_t)12345678, parsed . rowId );
+    REQUIRE_EQ ( (uint32_t)2, parsed . fragId );
+
+    EXIT;
+}
+
+// NGS_Statistics
+//TODO: decide whether to allow overwriting
+//TODO: type conversions
+
+TEST_CASE(NGS_Statistics_Make)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_AddU64)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddU64 ( stats, ctx, "path", 1 );
+	REQUIRE_EQ ( ( uint32_t ) NGS_StatisticValueType_UInt64, NGS_StatisticsGetValueType ( stats, ctx, "path" ) );
+    REQUIRE_EQ ( (uint64_t)1, NGS_StatisticsGetAsU64 ( stats, ctx, "path" ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_AddI64)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddI64 ( stats, ctx, "path", -12 );
+	REQUIRE_EQ ( ( uint32_t ) NGS_StatisticValueType_Int64, NGS_StatisticsGetValueType ( stats, ctx, "path" ) );
+    REQUIRE_EQ ( (int64_t)-12, NGS_StatisticsGetAsI64 ( stats, ctx, "path" ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_AddString)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    const char* cstr = "blah";
+    NGS_String * str = NGS_StringMake ( ctx, cstr, strlen ( cstr ) );
+    NGS_StatisticsAddString ( stats, ctx, "path", str );
+	REQUIRE_EQ ( ( uint32_t ) NGS_StatisticValueType_String, NGS_StatisticsGetValueType ( stats, ctx, "path" ) );
+    REQUIRE_EQ ( string ( cstr ), toString ( NGS_StatisticsGetAsString ( stats, ctx, "path" ), ctx, true ) );
+
+    NGS_StringRelease ( str, ctx );
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_AddDouble)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddDouble ( stats, ctx, "path", 3.1415926 );
+	REQUIRE_EQ ( ( uint32_t ) NGS_StatisticValueType_Real, NGS_StatisticsGetValueType ( stats, ctx, "path" ) );
+    REQUIRE_EQ ( 3.1415926, NGS_StatisticsGetAsDouble ( stats, ctx, "path" ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_AddNotANumber)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddDouble ( stats, ctx, "path", std::numeric_limits<double>::quiet_NaN() );
+    REQUIRE_FAILED ();
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_OverwriteU64)
+{   // currently, an attempt to overwrite a path throws
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddU64 ( stats, ctx, "path", 1 );
+    NGS_StatisticsAddU64 ( stats, ctx, "path", 2 );
+    REQUIRE_FAILED ();
+
+    REQUIRE_EQ ( (uint64_t)1, NGS_StatisticsGetAsU64 ( stats, ctx, "path" ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_FindFound)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddU64 ( stats, ctx, "path1", 1 );
+    NGS_StatisticsAddU64 ( stats, ctx, "path2", 2 );
+    NGS_StatisticsAddU64 ( stats, ctx, "path3", 3 );
+
+    REQUIRE_EQ ( (uint64_t)1, NGS_StatisticsGetAsU64 ( stats, ctx, "path1" ) );
+    REQUIRE_EQ ( (uint64_t)2, NGS_StatisticsGetAsU64 ( stats, ctx, "path2" ) );
+    REQUIRE_EQ ( (uint64_t)3, NGS_StatisticsGetAsU64 ( stats, ctx, "path3" ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+
+TEST_CASE(NGS_Statistics_FindNotFound)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddU64 ( stats, ctx, "path1", 1 );
+    NGS_StatisticsAddU64 ( stats, ctx, "path2", 2 );
+    NGS_StatisticsAddU64 ( stats, ctx, "path3", 3 );
+
+    NGS_StatisticsGetAsU64 ( stats, ctx, "path4" );
+    REQUIRE_FAILED ();
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+
+TEST_CASE(NGS_Statistics_Iterate)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddU64 ( stats, ctx, "path3", 3 );
+    NGS_StatisticsAddU64 ( stats, ctx, "path1", 1 );
+    NGS_StatisticsAddU64 ( stats, ctx, "path2", 2 );
+
+    const char* path;
+    REQUIRE ( NGS_StatisticsNextPath ( stats, ctx, "", & path ) );
+    REQUIRE_EQ ( string ( "path1" ), string ( path ) );
+
+    REQUIRE ( NGS_StatisticsNextPath ( stats, ctx, "path1", & path ) );
+    REQUIRE_EQ ( string ( "path2" ), string ( path ) );
+
+    REQUIRE ( NGS_StatisticsNextPath ( stats, ctx, "path2", & path ) );
+    REQUIRE_EQ ( string ( "path3" ), string ( path ) );
+
+    REQUIRE ( ! NGS_StatisticsNextPath ( stats, ctx, "path3", & path ) );
+    REQUIRE_NULL ( path );
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionU64)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddU64 ( stats, ctx, "path", 1 );
+    REQUIRE_EQ ( (int64_t)1, NGS_StatisticsGetAsI64 ( stats, ctx, "path" ) );
+    REQUIRE_EQ ( 1.0, NGS_StatisticsGetAsDouble( stats, ctx, "path" ) );
+    REQUIRE_EQ ( string ( "1" ), toString ( NGS_StatisticsGetAsString( stats, ctx, "path" ), ctx , true ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionU64_Error)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    // MAX_U64 throws when reading as I64
+    NGS_StatisticsAddU64 ( stats, ctx, "path", std::numeric_limits<uint64_t>::max() );
+    NGS_StatisticsGetAsI64 ( stats, ctx, "path" );
+    REQUIRE_FAILED ();
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionI64)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddI64 ( stats, ctx, "path", 1 );
+    REQUIRE_EQ ( (uint64_t)1, NGS_StatisticsGetAsU64 ( stats, ctx, "path" ) );
+    REQUIRE_EQ ( 1.0, NGS_StatisticsGetAsDouble( stats, ctx, "path" ) );
+    REQUIRE_EQ ( string ( "1" ), toString ( NGS_StatisticsGetAsString( stats, ctx, "path" ), ctx , true ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionI64_Error)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    // negatives throw when reading as U64
+    NGS_StatisticsAddI64 ( stats, ctx, "path", -1 );
+    NGS_StatisticsGetAsU64 ( stats, ctx, "path" );
+    REQUIRE_FAILED ();
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionReal)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddDouble ( stats, ctx, "path", 3.14 );
+
+    // GetAsU64 truncates
+    REQUIRE_EQ ( (uint64_t)3, NGS_StatisticsGetAsU64 ( stats, ctx, "path" ) );
+    // GetAsI64 truncates
+    REQUIRE_EQ ( (int64_t)3, NGS_StatisticsGetAsI64 ( stats, ctx, "path" ) );
+    // GetAsString converts with a default precision */
+    REQUIRE_EQ ( string ( "3.140000" ), toString ( NGS_StatisticsGetAsString( stats, ctx, "path" ), ctx , true ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionReal_Negative)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    NGS_StatisticsAddDouble ( stats, ctx, "path", -1.1 );
+    // GetAsU64 throws
+    NGS_StatisticsGetAsU64( stats, ctx, "path" );
+    REQUIRE_FAILED ();
+    // GetAsI64 truncates
+    REQUIRE_EQ ( (int64_t)-1, NGS_StatisticsGetAsI64 ( stats, ctx, "path" ) );
+    // GetAsString converts with a default precision */
+    REQUIRE_EQ ( string ( "-1.100000" ), toString ( NGS_StatisticsGetAsString( stats, ctx, "path" ), ctx , true ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionReal_ErrorSize)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    // throws when too big for a 64 bit number
+    NGS_StatisticsAddDouble ( stats, ctx, "path", std::numeric_limits<double>::max() );
+    NGS_StatisticsGetAsU64( stats, ctx, "path" );
+    REQUIRE_FAILED ();
+    NGS_StatisticsGetAsI64( stats, ctx, "path" );
+    REQUIRE_FAILED ();
+
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionString)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    const char* cstr = "   \t3.14"; /* leading space is ok */
+    NGS_String * str = NGS_StringMake ( ctx, cstr, strlen ( cstr ) );
+    NGS_StatisticsAddString ( stats, ctx, "path", str );
+
+    // GetAsU64 truncates
+    REQUIRE_EQ ( (uint64_t)3, NGS_StatisticsGetAsU64 ( stats, ctx, "path" ) );
+    // GetAsI64 truncates
+    REQUIRE_EQ ( (int64_t)3, NGS_StatisticsGetAsI64 ( stats, ctx, "path" ) );
+    REQUIRE_EQ ( 3.14, NGS_StatisticsGetAsDouble( stats, ctx, "path" ) );
+
+//TODO: more conversions to real
+// "  +3.14"
+// "  -3.14"
+// "  -3E2"
+// "  -3e2"
+// "  -3.14e2"
+// "  -0xF.0"
+// "  -0xF.0P2" binary exponent P/p might not work on MSVS (MSVS doc on strtod mentions D/d without explanation)
+// "  -0xFp2"
+// "  -0xFp-2"
+// "  INf"
+// "  iNFiNiTY"
+// "  NAN"
+// "  nAn"
+// "  naN(blah)"
+
+    NGS_StringRelease ( str, ctx );
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionString_BigUInt)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    const char* cstr = "18446744073709551615"; // std::numeric_limits<uint64_t>::max()
+    NGS_String * str = NGS_StringMake ( ctx, cstr, strlen ( cstr ) );
+    NGS_StatisticsAddString ( stats, ctx, "path", str );
+
+    REQUIRE_EQ ( std::numeric_limits<uint64_t>::max(), NGS_StatisticsGetAsU64 ( stats, ctx, "path" ) );
+
+    NGS_StringRelease ( str, ctx );
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionString_BigUInt_Error)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    const char* cstr = "18446744073709551616"; // std::numeric_limits<uint64_t>::max() + 1
+    NGS_String * str = NGS_StringMake ( ctx, cstr, strlen ( cstr ) );
+    NGS_StatisticsAddString ( stats, ctx, "path", str );
+
+    NGS_StatisticsGetAsU64 ( stats, ctx, "path" );
+    REQUIRE_FAILED ();
+
+    NGS_StringRelease ( str, ctx );
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionString_BigInt)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    const char* cstr = "9223372036854775807"; // std::numeric_limits<int64_t>::max()
+    NGS_String * str = NGS_StringMake ( ctx, cstr, strlen ( cstr ) );
+    NGS_StatisticsAddString ( stats, ctx, "path", str );
+
+    REQUIRE_EQ ( std::numeric_limits<int64_t>::max(), NGS_StatisticsGetAsI64 ( stats, ctx, "path" ) );
+
+    NGS_StringRelease ( str, ctx );
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionString_BigInt_Error)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    const char* cstr = "9223372036854775808"; // std::numeric_limits<int64_t>::max() + 1
+    NGS_String * str = NGS_StringMake ( ctx, cstr, strlen ( cstr ) );
+    NGS_StatisticsAddString ( stats, ctx, "path", str );
+
+    NGS_StatisticsGetAsI64 ( stats, ctx, "path" );
+    REQUIRE_FAILED ();
+
+    NGS_StringRelease ( str, ctx );
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+TEST_CASE(NGS_Statistics_ConversionString_TrailingSpace)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_Statistics * stats = SRA_StatisticsMake ( ctx );
+
+    const char* cstr = "   \t3.14 \t\n  "; /* trailing space is an error*/
+    NGS_String * str = NGS_StringMake ( ctx, cstr, strlen ( cstr ) );
+    NGS_StatisticsAddString ( stats, ctx, "path", str );
+
+    NGS_StatisticsGetAsDouble( stats, ctx, "path" );
+    REQUIRE_FAILED ();
+
+    NGS_StringRelease ( str, ctx );
+    NGS_StatisticsRelease ( stats, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+//////////////////////////////////////////// Errors opening read collection
+
+#define BAD_ACCESSION "that refuses to open"
+TEST_CASE(NGS_FailedToOpen)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+
+    NGS_ReadCollectionMake ( ctx, BAD_ACCESSION);
+    REQUIRE ( ctx_xc_isa ( ctx, xcTableOpenFailed ) );
+
+    KConfig* kfg;
+    REQUIRE_RC ( KConfigMakeLocal ( &kfg, NULL ) );
+    const KRepositoryMgr* repoMgr;
+    REQUIRE_RC ( KConfigMakeRepositoryMgrRead ( kfg, &repoMgr ) );
+    if ( KRepositoryMgrHasRemoteAccess ( repoMgr ) )
+    {
+        string startsWith = "Cannot open accession '" BAD_ACCESSION "', rc = RC";
+        REQUIRE_EQ ( startsWith, string ( WHAT () ) . substr ( 0, startsWith . size () ) );
+    }
+    else
+    {
+        string startsWith = "Cannot open accession '" BAD_ACCESSION "', rc = RC";
+        string what = WHAT ();
+        REQUIRE_EQ ( startsWith, what . substr ( 0, startsWith . size () ) );
+        string endsWith = "Note: remote access is disabled in the configuration";
+        REQUIRE_EQ ( endsWith, what . substr ( what . size() - endsWith . size () ) );
+    }
+    REQUIRE_FAILED ();
+    REQUIRE_RC ( KRepositoryMgrRelease ( repoMgr ) );
+}
+
+//////////////////////////////////////////// Open read collection using system path
+
+#ifdef WIN32
+#define SYSPATH_ACCESSION ".\\data\\SysPathTest"
+#else
+#define SYSPATH_ACCESSION "./data/SysPathTest"
+#endif
+TEST_CASE(NGS_OpenBySysPath)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+    NGS_ReadCollection * readColl = NGS_ReadCollectionMake( ctx, SYSPATH_ACCESSION );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( readColl );
+    NGS_ReadCollectionRelease ( readColl, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+
+//////////////////////////////////////////// NGS_Cursor
+
+class NGSCursorFixture : public NGS_C_Fixture
+{
+public:
+    NGSCursorFixture()
+    : m_cursor ( 0 )
+    {
+    }
+
+    ~NGSCursorFixture()
+    {
+    }
+
+    virtual void Release()
+    {
+        if (m_ctx != 0)
+        {
+            NGS_CursorRelease ( m_cursor, m_ctx );
+        }
+        NGS_C_Fixture :: Release ();
+    }
+
+    void MakeCursor ( const string& p_acc, const string& p_table, const char * col_specs[], uint32_t num_cols )
+    {
+        const VDatabase *db;
+        THROW_ON_RC ( VDBManagerOpenDBRead ( m_ctx -> rsrc -> vdb, & db, NULL, "%s", p_acc . c_str () ) );
+
+        VTable* tbl;
+        THROW_ON_RC ( VDatabaseOpenTableRead ( db, (const VTable**)&tbl, p_table . c_str () ) );
+
+        m_cursor = NGS_CursorMake ( m_ctx, tbl, col_specs, num_cols ); // this will add the first column to the cursor
+
+        THROW_ON_RC ( VTableRelease ( tbl ) );
+        THROW_ON_RC ( VDatabaseRelease ( db ) );
+    }
+
+    const NGS_Cursor* m_cursor;
+};
+
+FIXTURE_TEST_CASE ( NGS_CursorMakeDB_fails, NGSCursorFixture )
+{
+    ENTRY;
+    const VDatabase *db;
+    THROW_ON_RC ( VDBManagerOpenDBRead ( m_ctx -> rsrc -> vdb, & db, NULL, "%s", SRADB_Accession_WithBamHeader ) );
+
+    NGS_String* runName = NGS_StringMake ( ctx, SRADB_Accession_WithBamHeader, string_size ( SRADB_Accession_WithBamHeader ) );
+    m_cursor = NGS_CursorMakeDb ( m_ctx, db, runName, "bad table", sequence_col_specs, seq_NUM_COLS );
+    REQUIRE ( FAILED () );
+    REQUIRE_NULL ( m_cursor );
+    // make sure RC is reported
+    REQUIRE ( string ( WHAT () ) . find ( "rc =" ) != string :: npos);
+    CLEAR ();
+
+    NGS_StringRelease ( runName, ctx );
+
+    REQUIRE_RC ( VDatabaseRelease ( db ) );
+    EXIT;
+}
+
+
+FIXTURE_TEST_CASE ( NGS_Cursor_GetColumnIndex_adds_column, NGSCursorFixture )
+{
+    ENTRY;
+    MakeCursor ( SRADB_Accession_WithBamHeader, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ); // this will add the first column (READ) to the cursor
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( m_cursor );
+
+    REQUIRE_NE ( (uint32_t)0, NGS_CursorGetColumnIndex ( m_cursor, ctx, seq_READ_LEN ) ); // this should add the column we are requesting to the cursor
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_Cursor_Leak_when_Make_fails, NGSCursorFixture )
+{   // use valgrind to detect the absence of a leak
+    ENTRY;
+
+    const char * bogus_col_specs [] = { "not a column at all!" };
+    MakeCursor ( SRADB_Accession_WithBamHeader, "SEQUENCE", bogus_col_specs, 1 );
+    REQUIRE ( FAILED () );
+    REQUIRE_NULL ( m_cursor );
+    CLEAR();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_Cursor_GetVBlob, NGSCursorFixture )
+{
+    ENTRY;
+    MakeCursor ( SRADB_Accession_WithBamHeader, "SEQUENCE", sequence_col_specs, seq_NUM_COLS ); // this will add the first column (READ) to the cursor
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( m_cursor );
+
+    const int64_t rowId = 10;
+    const struct VBlob* blob = NGS_CursorGetVBlob ( m_cursor, ctx, rowId, seq_READ );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( blob );
+
+    int64_t first;
+    uint64_t count;
+    REQUIRE_RC ( VBlobIdRange ( blob, &first, &count ) );
+    REQUIRE_LE ( first, rowId );
+    REQUIRE_GT ( (int64_t)( first + count ), rowId );
+
+    REQUIRE_RC ( VBlobRelease ( blob ) );
+
+    EXIT;
+}
+
+//////////////////////////////////////////// Main
+
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t m_coll=NgsTestSuite(argc, argv);
+    return m_coll;
+}
+
+}
+
diff --git a/test/ngs/ngstest_csra1.cpp b/test/ngs/ngstest_csra1.cpp
new file mode 100644
index 0000000..643c651
--- /dev/null
+++ b/test/ngs/ngstest_csra1.cpp
@@ -0,0 +1,1365 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS C interface, CSRA1 archives
+*/
+
+#include "ngs_c_fixture.hpp"
+
+#include <limits.h>
+
+#include <klib/printf.h>
+
+#include <kdb/manager.h>
+
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+
+#include "CSRA1_Reference.h"
+#include "NGS_Pileup.h"
+#include "NGS_FragmentBlobIterator.h"
+#include "NGS_FragmentBlob.h"
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsCsra1TestSuite);
+
+const char* CSRA1_PrimaryOnly   = "SRR1063272";
+const char* CSRA1_WithSecondary = "SRR833251";
+const char* CSRA1_WithGroups = "SRR822962";
+const char* CSRA1_WithCircularReference = "SRR1769246";
+const char* CSRA1_Older = "SRR353866";
+
+#define ENTRY_GET_ALIGN(acc, alignNo) \
+    ENTRY_ACC(acc); \
+    GetAlignment(alignNo);
+
+class CSRA1_Fixture : public NGS_C_Fixture
+{
+public:
+    CSRA1_Fixture()
+    : m_align(0)
+    {
+    }
+    ~CSRA1_Fixture()
+    {
+    }
+
+    virtual void Release()
+    {
+        if (m_ctx != 0)
+        {
+            if (m_align != 0)
+            {
+                NGS_AlignmentRelease ( m_align, m_ctx );
+            }
+        }
+        NGS_C_Fixture :: Release ();
+    }
+
+
+    void GetAlignment ( uint64_t id, bool primary = true )
+    {
+        stringstream str;
+        str << toString ( NGS_ReadCollectionGetName ( m_coll, m_ctx ), m_ctx, true ) << ( primary ? ".PA." : ".SA.") << id;
+        m_align = NGS_ReadCollectionGetAlignment ( m_coll, m_ctx, str . str () . c_str () );
+        if ( m_ctx -> rc != 0 || m_align == 0 )
+            throw std :: logic_error ( "GetAlignment() failed" );
+    }
+
+    NGS_Alignment*      m_align;
+};
+
+// NGS_Read
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGetReadName, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "1", NGS_ReadGetReadName ( m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGetReadId, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( ReadId ( 1 ),  NGS_ReadGetReadId ( m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGetReadGroup, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "C1ELY.6",  NGS_ReadGetReadGroup ( m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGetReadCategory_Aligned, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+
+    enum NGS_ReadCategory cat = NGS_ReadGetReadCategory ( m_read, ctx );
+    REQUIRE_EQ ( NGS_ReadCategory_fullyAligned, cat );
+
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGetReadCategory_Partial, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 3 );
+
+    enum NGS_ReadCategory cat = NGS_ReadGetReadCategory ( m_read, ctx );
+    REQUIRE_EQ ( NGS_ReadCategory_partiallyAligned, cat );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGetReadSequence_Full, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+
+    string expected ("ACTCGACATTCTGCCTTCGACCTATCTTTCTCCTCTCCCAGTCATCGCCCAGTAGAATTACCAGGCAATGAACCAGGGCCTTCCATCCCAACGGCACAGC"
+                     "AAAGGTATGATACCTGAGATGTTGCGGGATGGTGGGTTTGTGAGGAGATGGCCACGCAGGCAAGGTCTTTTGGAATGGTTCACTGTTGGAGTGAACCCAT"
+                     "AT");
+    REQUIRE_STRING( expected,  NGS_ReadGetReadSequence ( m_read, ctx, 0, (size_t)-1 ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGetReadSequence_PartialNoLength, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "AT",  NGS_ReadGetReadSequence ( m_read, ctx, 200, (size_t)-1 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGetReadSequence_PartialLength, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "CATA", NGS_ReadGetReadSequence ( m_read, ctx, 197, 4 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGetReadQualities_Full, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+
+    string expected (
+        "@@CDDBDFFBFHFIEEFGIGGHIEHIGIGGFGEGAFDHIIIIIGGGDFHII;=BF at FEHGIEEH?AHHFHFFFFDC5'5=?CC?ADCD at AC??9BDDCDB"
+        "<@@@DDADDFFHGHIIDHFFHDEFEHIIGHIIDGGGFHIJIGAGHAH=;DGEGEEEDDDB<ABBD;ACDDDCBCCCDD at CCDDDCDCDBDD@ACC>A@?>"
+        "C3");
+    REQUIRE_STRING ( expected, NGS_ReadGetReadQualities ( m_read, ctx, 0, (size_t)-1 ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGetReadQualities_PartialNoLength, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "C3", NGS_ReadGetReadQualities ( m_read, ctx, 200, (size_t)-1 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGetReadQualities_PartialLength, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "@?>C", NGS_ReadGetReadQualities ( m_read, ctx, 197, 4 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadNumFragments, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+
+    uint32_t num = NGS_ReadNumFragments ( m_read, ctx );
+    REQUIRE_EQ ( (uint32_t)2, num );
+
+    EXIT;
+}
+
+// NGS_Fragment (through an NGS_Read object)
+FIXTURE_TEST_CASE(CSRA1_NGS_NoFragmentBeforeNext, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    m_read = NGS_ReadCollectionGetRead ( m_coll, ctx, ReadId ( 1 ) . c_str () );
+
+    // no access to a Fragment before a call to NGS_FragmentIteratorNext
+    REQUIRE_NULL ( NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_FragmentGetId, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".FR0.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_FragmentGetSequence_Full, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+
+    string expected = "ACTCGACATTCTGCCTTCGACCTATCTTTCTCCTCTCCCAGTCATCGCCCAGTAGAATTACCAGGCAATGAACCAGGGCC"
+                      "TTCCATCCCAACGGCACAGCA";
+    REQUIRE_STRING( expected,  NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 0, (size_t)-1 ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_FragmentGetSequence_PartialNoLength, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "TTCCATCCCAACGGCACAGCA",  NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 80, (size_t)-1 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_FragmentGetSequence_PartialLength, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "TTCC", NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 80, 4 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_FragmentGetQualities_Full, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+    string expected = "@@CDDBDFFBFHFIEEFGIGGHIEHIGIGGFGEGAFDHIIIIIGGGDFHII;=BF at FEHGIEEH?AHHFHFFFFDC5'5=?CC?ADCD at AC??9BDDCDB<";
+    REQUIRE_STRING ( expected, NGS_FragmentGetQualities ( (NGS_Fragment*)m_read, ctx, 0, (size_t)-1 ) );
+    EXIT;
+}
+
+// Iteration over Fragments
+FIXTURE_TEST_CASE(CSRA1_NGS_FragmentIteratorNext, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 ); // calls NGS_FragmentIteratorNext
+
+    REQUIRE_STRING ( string( CSRA1_PrimaryOnly ) + ".FR0.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE_STRING ( string( CSRA1_PrimaryOnly ) + ".FR1.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_FragmentIteratorNext_SingleFragment, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( "ERR055323", 1 );
+    REQUIRE_STRING ( "ERR055323.FR0.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_FragmentIteratorNext_NullRead, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, false ); // will return an empty iterator
+    REQUIRE_NULL ( NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_FragmentIteratorNext_BeyondEnd, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_PrimaryOnly, 1 );
+
+    REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+
+    EXIT;
+}
+
+// Iteration over Reads
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReads_Next, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    // on the first read
+    REQUIRE_STRING ( ReadId ( 1 ), NGS_ReadGetReadId ( m_read, ctx ) );
+
+    // iterate over fragments
+    {
+        REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) ); // position on the first fragment
+        REQUIRE_STRING ( string( CSRA1_PrimaryOnly ) + ".FR0.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+        REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+        REQUIRE_STRING ( string( CSRA1_PrimaryOnly ) + ".FR1.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+        REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+    }
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    // on the second read
+    REQUIRE_STRING ( ReadId ( 2 ), NGS_ReadGetReadId ( m_read, ctx ) );
+
+    {
+        REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) ); // position on the first fragment
+        REQUIRE_STRING ( string( CSRA1_PrimaryOnly ) + ".FR0.2", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+        REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+        REQUIRE_STRING ( string( CSRA1_PrimaryOnly ) + ".FR1.2", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+        REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+    }
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_GetReadsIteratorNext_BeyondEnd, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, false, false, false);
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+// Iteration over a range of Reads
+FIXTURE_TEST_CASE(CSRA1_ReadRange_NoReadBeforeNext, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 3, 2, true, true, true );
+    REQUIRE ( ! FAILED () && m_read );
+
+    // no access to a Read before a call to NGS_FragmentIteratorNext
+    REQUIRE_NULL ( NGS_ReadGetReadId ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReadRange, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 3, 2, true, true, true );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE_STRING ( ReadId ( 3 ), NGS_ReadGetReadId ( m_read, ctx ) );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE_STRING ( ReadId ( 4 ), NGS_ReadGetReadId ( m_read, ctx ) );
+
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReadRange_Empty, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 6000000, 2, true, true, true );
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReadRange_Filtered, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 1, 2000000, false, false, true );
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    enum NGS_ReadCategory cat = NGS_ReadGetReadCategory ( m_read, ctx );
+    REQUIRE_EQ ( NGS_ReadCategory_unaligned, cat );
+
+    EXIT;
+}
+
+// NGS_Fragment (through an NGS_Alignment object)
+FIXTURE_TEST_CASE(CSRA1_NoAlignmentFragmentBeforeNext, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+
+    m_align = NGS_ReadCollectionGetAlignments ( m_coll, m_ctx, true, true );
+    // no access to a Fragment before a call to NGS_FragmentIteratorNext
+    REQUIRE_NULL ( NGS_FragmentGetId ( (NGS_Fragment*)m_align, ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentFragmentGetId, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 5 );
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".FA1.5", NGS_FragmentGetId ( (NGS_Fragment*)m_align, ctx ) );
+                                                                // NB. alignment #5 refers to read #165753
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentFragmentGetSequence, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "TCGAC", NGS_FragmentGetSequence ( (NGS_Fragment*)m_align, ctx, 2, 5 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentFragmentGetQualities, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "CDDBD", NGS_FragmentGetQualities ( (NGS_Fragment*)m_align, ctx, 2, 5 ) );
+    EXIT;
+}
+
+// NGS_Alignment
+//TODO: secondary alignments
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetAlignmentId, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( string( CSRA1_PrimaryOnly ) + ".PA.1", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetReferenceSpec, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( string( "supercont2.1" ), NGS_AlignmentGetReferenceSpec ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetMappingQuality, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_EQ( 60, NGS_AlignmentGetMappingQuality( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetReferenceBases, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "ACTCGACATTCTGTCTTCGACCTATCTTTCTCCTCTCCCAGTCATCGCCCAGTAGAATTACCAGGCAATGAACCACGGCCTTTCATCCCAACGGCACAGCA",
+                     NGS_AlignmentGetReferenceBases( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetReadGroup, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "C1ELY.6", NGS_AlignmentGetReadGroup( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetReadId, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 5 );
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".R.165753", NGS_AlignmentGetReadId ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentIsPrimary_Yes, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 5 );
+    REQUIRE( NGS_AlignmentIsPrimary ( m_align, ctx ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentIsPrimary_No, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_WithSecondary );
+    GetAlignment(175, false);
+    REQUIRE( ! NGS_AlignmentIsPrimary ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentIsFirst_Yes, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE( NGS_AlignmentIsFirst ( m_align, ctx ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentIsFirst_No, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 2 );
+    REQUIRE( ! NGS_AlignmentIsFirst ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetAlignmentPosition, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_EQ ( (int64_t)85, NGS_AlignmentGetAlignmentPosition ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetAlignmentLength, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_EQ ( (uint64_t)101, NGS_AlignmentGetAlignmentLength ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetIsReversedOrientation_False, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE ( ! NGS_AlignmentGetIsReversedOrientation ( m_align, ctx ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetIsReversedOrientation_True, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 2 );
+    REQUIRE ( NGS_AlignmentGetIsReversedOrientation ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetSoftClip_None, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_EQ ( 0, NGS_AlignmentGetSoftClip ( m_align, ctx, true ) );
+    REQUIRE_EQ ( 0, NGS_AlignmentGetSoftClip ( m_align, ctx, false ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetSoftClip_Left, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 4 );
+    REQUIRE_EQ ( 5, NGS_AlignmentGetSoftClip ( m_align, ctx, true ) );
+    REQUIRE_EQ ( 0, NGS_AlignmentGetSoftClip ( m_align, ctx, false ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetSoftClip_Right, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 10 );
+    REQUIRE_EQ ( 0, NGS_AlignmentGetSoftClip ( m_align, ctx, true ) );
+    REQUIRE_EQ ( 13, NGS_AlignmentGetSoftClip ( m_align, ctx, false ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetTemplateLength, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_EQ ( (uint64_t)201, NGS_AlignmentGetTemplateLength ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetMateAlignment, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+
+    NGS_Alignment* mate = NGS_AlignmentGetMateAlignment ( m_align, ctx );
+    REQUIRE ( ! FAILED () && mate );
+
+    // mate is alignment #2
+    REQUIRE_STRING ( string( CSRA1_PrimaryOnly ) + ".FA1.2", NGS_FragmentGetId( (NGS_Fragment*)mate, ctx ) );
+
+    NGS_AlignmentRelease ( mate, ctx );
+
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetClippedFragmentQualities, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 4 );
+    REQUIRE_STRING ( "#AA>55;5(;63;;3@;A9??;6..73CDCIDA>DCB>@B=;@B?;;ADAB<DD?1*>@C9:EC?2++A3+F4EEB<E>EEIEDC2?C:;AB+==1",
+                     NGS_AlignmentGetClippedFragmentQualities ( m_align, ctx ));
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetAlignedFragmentBases, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 2 );
+    REQUIRE_STRING ( "ATATGGGTTCACTCCAACAGTGAACCATTCCAAAAGACCTTGCCTGCGTGGCCATCTCCTCACAAACCCACCATCCCGCAACATCTCAGGTATCATACCTT",
+                     NGS_AlignmentGetAlignedFragmentBases ( m_align, ctx ));
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetShortCigar_Unclipped, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 4 );
+    REQUIRE_STRING ( "5S96M", NGS_AlignmentGetShortCigar ( m_align, ctx, false ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetShortCigar_Clipped, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 4 );
+    REQUIRE_STRING ( "96M", NGS_AlignmentGetShortCigar ( m_align, ctx, true ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetLongCigar_Unclipped, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 4 );
+    REQUIRE_STRING ( "5S1X8=1X39=1X46=", NGS_AlignmentGetLongCigar ( m_align, ctx, false ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetLongCigar_Clipped, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 4 );
+    REQUIRE_STRING ( "1X8=1X39=1X46=", NGS_AlignmentGetLongCigar ( m_align, ctx, true ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentHasMate_Primary_NoMate, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 99 );
+    REQUIRE ( ! NGS_AlignmentHasMate ( m_align, ctx ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentHasMate_Primary_YesMate, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE ( NGS_AlignmentHasMate ( m_align, ctx ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentHasMate_Secondary, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    GetAlignment ( 169, false );
+    REQUIRE ( ! NGS_AlignmentHasMate ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetMateAlignmentId_Primary, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".PA.2", NGS_AlignmentGetMateAlignmentId ( m_align, ctx ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetMateAlignmentId_Missing, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 99 );
+    NGS_AlignmentGetMateAlignmentId ( m_align, ctx );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetMateAlignmentId_Secondary, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    GetAlignment ( 172, false );
+    NGS_AlignmentGetMateAlignmentId ( m_align, ctx );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetMateReferenceSpec, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE_STRING ( "supercont2.1", NGS_AlignmentGetMateReferenceSpec ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetMateReferenceSpec_OlderSchema, CSRA1_Fixture)
+{   // VDB-3065: for older accessions mate reference spec is in a different column
+    ENTRY_GET_ALIGN( CSRA1_Older, 1 );
+    REQUIRE_STRING ( "AAAB01006027.1", NGS_AlignmentGetMateReferenceSpec ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetMateIsReversedOrientation_True, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 1 );
+    REQUIRE ( NGS_AlignmentGetMateIsReversedOrientation ( m_align, ctx ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_AlignmentGetMateIsReversedOrientation_False, CSRA1_Fixture)
+{
+    ENTRY_GET_ALIGN( CSRA1_PrimaryOnly, 2 );
+    REQUIRE ( ! NGS_AlignmentGetMateIsReversedOrientation ( m_align, ctx ) );
+    EXIT;
+}
+
+// NGS_Reference
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetCommonName, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1");
+    REQUIRE_STRING ( "supercont2.1", NGS_ReferenceGetCommonName ( m_ref, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetCanonicalName, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( "SRR821492", "chr7" );
+    const char* canoName = "NC_000007.13";
+    REQUIRE_STRING ( canoName, NGS_ReferenceGetCanonicalName ( m_ref, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceIsCircular_Yes, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( "SRR821492", "chrM" );
+    REQUIRE ( NGS_ReferenceGetIsCircular ( m_ref, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceIsCircular_No, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    REQUIRE ( ! NGS_ReferenceGetIsCircular ( m_ref, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetLength, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    REQUIRE_EQ ( (uint64_t)2291499l, NGS_ReferenceGetLength ( m_ref, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetFirstRowId, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    REQUIRE_EQ ( (int64_t)1, CSRA1_Reference_GetFirstRowId ( m_ref, ctx ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetLastRowId, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    REQUIRE_EQ ( (int64_t)459, CSRA1_Reference_GetLastRowId ( m_ref, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetBases_Full, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    string bases = toString ( NGS_ReferenceGetBases( m_ref, ctx, 0, -1 ), ctx, true );
+    REQUIRE_EQ ( NGS_ReferenceGetLength ( m_ref, ctx ), ( uint64_t ) bases. size () );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetBases, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    REQUIRE_STRING ( "CCTGTCC", NGS_ReferenceGetBases( m_ref, ctx, 7000, 7 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetAlignment_Primary, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    m_align = NGS_ReferenceGetAlignment ( m_ref, ctx, ( string ( CSRA1_PrimaryOnly ) + ".PA.1" ) . c_str () );
+    REQUIRE ( ! FAILED () && m_align );
+
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".PA.1", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetAlignments_PrimaryOnly_Primary, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, false );
+    REQUIRE ( ! FAILED () && m_align );
+
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".PA.1", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetAlignments_PrimaryOnly_Secondary, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, false, true );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetAlignments_WithSecondary_Primary, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, false);
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".PA.1", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetAlignments_WithSecondary_Secondary, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, false, true );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".SA.169", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+
+    EXIT;
+}
+
+
+// ReferenceGetAlignments on circular references
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetAlignments_Circular_Wraparound, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_WithCircularReference, "NC_012920.1" );
+
+    const bool wants_primary = true;
+    const bool wants_secondary = true;
+    const uint32_t no_filters = 0;
+    const int32_t no_map_qual = 0;
+
+    m_align = NGS_ReferenceGetFilteredAlignments ( m_ref, ctx, wants_primary, wants_secondary, no_filters, no_map_qual );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+
+    // by default, the first returned alignment starts before the start of the circular reference
+    REQUIRE_EQ ( (int64_t)16477, NGS_AlignmentGetAlignmentPosition ( m_align, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetAlignments_Circular_NoWraparound, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_WithCircularReference, "NC_012920.1" );
+
+    const bool wants_primary = true;
+    const bool wants_secondary = true;
+    const uint32_t filters = NGS_AlignmentFilterBits_no_wraparound;
+    const int32_t no_map_qual = 0;
+
+    m_align = NGS_ReferenceGetFilteredAlignments ( m_ref, ctx, wants_primary, wants_secondary, filters, no_map_qual );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+
+    // with a no-wraparound filter, the first returned alignment starts at/after the start of the circular reference
+    REQUIRE_EQ ( (int64_t)5, NGS_AlignmentGetAlignmentPosition ( m_align, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetFilteredAlignmentSlice_FullReference_Wraparound_Count, CSRA1_Fixture )
+{
+    ENTRY_GET_REF( CSRA1_WithCircularReference, "NC_012920.1" );
+
+    const bool wants_primary = true;
+    const bool wants_secondary = true;
+    const uint32_t no_filters = 0;
+    const int32_t no_map_qual = 0;
+
+    m_align = NGS_ReferenceGetFilteredAlignmentSlice ( m_ref, ctx, 0, NGS_ReferenceGetLength ( m_ref, ctx ), wants_primary, wants_secondary, no_filters, no_map_qual );
+    REQUIRE ( ! FAILED () && m_align );
+
+    uint64_t count = 0;
+    while ( NGS_AlignmentIteratorNext ( m_align, ctx ) )
+    {
+        ++count;
+    }
+    REQUIRE_EQ ( (uint64_t) 12317, count );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetFilteredAlignmentSlice_FullReference_NoWraparound_Count, CSRA1_Fixture )
+{
+    ENTRY_GET_REF( CSRA1_WithCircularReference, "NC_012920.1" );
+
+    const bool wants_primary = true;
+    const bool wants_secondary = true;
+    const uint32_t filters = NGS_AlignmentFilterBits_no_wraparound;
+    const int32_t no_map_qual = 0;
+
+    m_align = NGS_ReferenceGetFilteredAlignmentSlice ( m_ref, ctx, 0, NGS_ReferenceGetLength ( m_ref, ctx ), wants_primary, wants_secondary, filters, no_map_qual );
+    REQUIRE ( ! FAILED () && m_align );
+
+    int64_t lastPos = 0;
+    uint64_t count = 0;
+    while ( NGS_AlignmentIteratorNext ( m_align, ctx ) )
+    {
+        ++count;
+        int64_t newPos = NGS_AlignmentGetAlignmentPosition ( m_align, ctx );
+        REQUIRE_LE ( lastPos, newPos );
+        lastPos = newPos;
+    }
+    REQUIRE_EQ ( (uint64_t) 12316, count );
+
+    EXIT;
+}
+
+// NGS_ReferenceGetChunk
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetChunk_Empty, CSRA1_Fixture)
+{   // offset beyond the end of reference
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    REQUIRE_STRING ( "", NGS_ReferenceGetChunk ( m_ref, ctx, 30000000, 10) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceChunk_All, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    NGS_String * chunk = NGS_ReferenceGetChunk ( m_ref, ctx, 0, (size_t)-1 );
+    REQUIRE_EQ( (size_t)20000, NGS_StringSize ( chunk, ctx ) );
+
+    string str = string ( NGS_StringData ( chunk, ctx ), NGS_StringSize ( chunk, ctx ) );
+    REQUIRE_EQ( string("GAATTCT"), str . substr (0, 7) );
+    REQUIRE_EQ( string("CATCA"), str . substr ( str.size() - 5, 5 ) );
+
+    NGS_StringRelease ( chunk, ctx );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceChunk_Offset_1, CSRA1_Fixture)
+{   // offset points into the first blob of REFERENCE.READ
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    NGS_String * chunk = NGS_ReferenceGetChunk ( m_ref, ctx, 1000, (size_t)-1 );
+    REQUIRE_EQ( (size_t)19000, NGS_StringSize ( chunk, ctx ) ); // first blob's size is 20000
+
+    string str = string ( NGS_StringData ( chunk, ctx ), NGS_StringSize ( chunk, ctx ) );
+    REQUIRE_EQ( string("TCCATTC"), str . substr (0, 7) );
+    REQUIRE_EQ( string("CATCA"), str . substr (str.size() - 5, 5) );
+
+    NGS_StringRelease ( chunk, ctx );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceChunk_Offset_2, CSRA1_Fixture)
+{   // offset points into the second blob of REFERENCE.READ
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    NGS_String * chunk = NGS_ReferenceGetChunk ( m_ref, ctx, 22000, (size_t)-1 );
+    REQUIRE_EQ( (size_t)3000, NGS_StringSize ( chunk, ctx ) ); // second blob's size is 5000
+
+    string str = string ( NGS_StringData ( chunk, ctx ), NGS_StringSize ( chunk, ctx ) );
+    REQUIRE_EQ( string("CTCAGAT"), str . substr (0, 7)  );
+    REQUIRE_EQ( string("TATTC"), str . substr (str.size() - 5, 5) );
+
+    NGS_StringRelease ( chunk, ctx );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceChunk_OffsetLength_1, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    NGS_String * chunk = NGS_ReferenceGetChunk ( m_ref, ctx, 2000, 10 );
+    REQUIRE_EQ( string ( "GGGCAAATGA" ), string ( NGS_StringData ( chunk, ctx ), NGS_StringSize ( chunk, ctx ) ) );
+    NGS_StringRelease ( chunk, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceChunk_OffsetLength_2, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    NGS_String * chunk = NGS_ReferenceGetChunk ( m_ref, ctx, 20020, 10 );
+    REQUIRE_EQ( string ( "ACATGACGGA" ), string ( NGS_StringData ( chunk, ctx ), NGS_StringSize ( chunk, ctx ) ) );
+    NGS_StringRelease ( chunk, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceChunk_OffsetLength_ReturnShorter, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    NGS_String * chunk = NGS_ReferenceGetChunk ( m_ref, ctx, 19995, 200 ); // only 5 bases left in this blob
+    REQUIRE_EQ( string ( "CATCA" ), string ( NGS_StringData ( chunk, ctx ), NGS_StringSize ( chunk, ctx ) ) );
+    NGS_StringRelease ( chunk, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_Reference_GetReferenceChunk_Chunks_Vs_Blobs, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( "SRR600094", "NC_000022.10" );
+
+    NGS_String * full = NGS_ReferenceGetBases ( m_ref, ctx, 0, (uint64_t)-1 );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( full );
+    REQUIRE_EQ ( (uint64_t)NGS_ReferenceGetLength ( m_ref, ctx ), (uint64_t)NGS_StringSize ( full, ctx ) );
+
+    size_t offset=0;
+    while ( offset < NGS_StringSize ( full, ctx ) )
+    {
+        NGS_String * chunk = NGS_ReferenceGetChunk ( m_ref, ctx, offset, 5000 );
+        REQUIRE ( ! FAILED () );
+        REQUIRE_NOT_NULL ( chunk );
+        size_t chunkSize = NGS_StringSize ( chunk, ctx );
+        REQUIRE_EQ ( string ( NGS_StringData ( full, ctx ) + offset, chunkSize ), string ( NGS_StringData ( chunk, ctx ), chunkSize ) );
+        NGS_StringRelease ( chunk, ctx );
+        offset += chunkSize;
+    }
+
+    NGS_StringRelease ( full, ctx );
+
+    EXIT;
+}
+
+//
+
+FIXTURE_TEST_CASE(CSRA1_NGS_Reference_SharedCursor, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    NGS_Reference* ref2 = NGS_ReadCollectionGetReference ( m_coll, ctx, "supercont2.2" );
+
+    string name = toString ( NGS_ReferenceGetCommonName ( m_ref, ctx), ctx, true );
+    string name2 = toString ( NGS_ReferenceGetCommonName ( ref2, ctx), ctx, true );
+
+    REQUIRE_NE ( name, name2 );
+
+    NGS_ReferenceRelease ( ref2, m_ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetStats, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    NGS_Statistics * stats = NGS_ReferenceGetStatistics ( m_ref, ctx );
+    REQUIRE ( ! FAILED () );
+
+    // Reference stats are empty for now
+    const char* path;
+    REQUIRE ( ! NGS_StatisticsNextPath ( stats, ctx, "", &path ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetPileups, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    NGS_Pileup* pileup = NGS_ReferenceGetPileups( m_ref, ctx, true, false);
+    REQUIRE ( ! FAILED () && pileup );
+
+    NGS_PileupRelease ( pileup, ctx );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetPileupSlice, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    NGS_Pileup* pileup = NGS_ReferenceGetPileupSlice( m_ref, ctx, 500, 10, true, false);
+    REQUIRE ( ! FAILED () && pileup );
+
+    NGS_PileupRelease ( pileup, ctx );
+    EXIT;
+}
+
+// Iteration over References
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceIterator_GetLength_1, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    NGS_Reference* refIt = NGS_ReadCollectionGetReferences ( m_coll, m_ctx );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_EQ ( NGS_ReferenceGetLength ( refIt, ctx ), NGS_ReferenceGetLength ( m_ref, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    NGS_ReferenceRelease ( refIt, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceIterator_GetLength_2, CSRA1_Fixture)
+{   // bug report: after a 1-chunk reference, the next reference in an iterator report wrong length
+    ENTRY_ACC( "SRR1121656" );
+    m_ref = NGS_ReadCollectionGetReferences ( m_coll, m_ctx );
+
+    bool checked = false;
+    while ( NGS_ReferenceIteratorNext ( m_ref, ctx ) )
+    {
+        if ( string ( "GL000207.1" ) == toString ( NGS_ReferenceGetCommonName ( m_ref, ctx ), ctx, true ) )
+        {
+            REQUIRE_EQ ( (uint64_t)4262, NGS_ReferenceGetLength ( m_ref, ctx ) );
+        }
+        else if ( string ( "GL000226.1" ) == toString ( NGS_ReferenceGetCommonName ( m_ref, ctx ), ctx, true ) )
+        {
+            REQUIRE_EQ ( (uint64_t)15008, NGS_ReferenceGetLength ( m_ref, ctx ) );
+            checked = true;
+            break;
+        }
+    }
+    REQUIRE ( checked );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceIterator_GetFirstRowId, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    NGS_Reference* refIt = NGS_ReadCollectionGetReferences ( m_coll, m_ctx );
+
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)1, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)460, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)785, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)1101, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)1318, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)1681, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)1966, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)2246, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)2526, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)2764, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)2976, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)3289, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)3444, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)3596, CSRA1_Reference_GetFirstRowId ( refIt, ctx ) );
+    REQUIRE ( ! NGS_ReferenceIteratorNext ( refIt, ctx ) );
+
+    NGS_ReferenceRelease ( refIt, ctx );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceIterator_GetLastRowId, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( CSRA1_PrimaryOnly, "supercont2.1" );
+    NGS_Reference* refIt = NGS_ReadCollectionGetReferences ( m_coll, m_ctx );
+
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)459, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)784, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)1100, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)1317, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)1680, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)1965, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)2245, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)2525, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)2763, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)2975, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)3288, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)3443, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)3595, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( NGS_ReferenceIteratorNext ( refIt, ctx ) );
+    REQUIRE_EQ ( (int64_t)3781, CSRA1_Reference_GetLastRowId ( refIt, ctx ) );
+    REQUIRE ( ! NGS_ReferenceIteratorNext ( refIt, ctx ) );
+
+    NGS_ReferenceRelease ( refIt, ctx );
+    EXIT;
+}
+
+
+
+// ReadGroups
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGroupGetName, CSRA1_Fixture)
+{
+    ENTRY_ACC(CSRA1_PrimaryOnly);
+    const char * name = "C1ELY.6";
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, name );
+    REQUIRE ( ! FAILED () && m_readGroup );
+    REQUIRE_STRING ( name, NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_HasReadGroup, CSRA1_Fixture)
+{
+    ENTRY_ACC(CSRA1_PrimaryOnly);
+    const char * name = "C1ELY.6";
+    REQUIRE ( NGS_ReadCollectionHasReadGroup ( m_coll, ctx, name ) && ! FAILED() );
+    REQUIRE ( ! NGS_ReadCollectionHasReadGroup ( m_coll, ctx, "non-existent read group" ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGroupGetStats, CSRA1_Fixture)
+{
+    ENTRY_ACC(CSRA1_WithGroups);
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "GS57510-FS3-L03" );
+
+    NGS_Statistics * stats = NGS_ReadGroupGetStatistics ( m_readGroup, ctx );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_EQ ( (uint64_t)34164461870, NGS_StatisticsGetAsU64 ( stats, ctx, "BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)34164461870, NGS_StatisticsGetAsU64 ( stats, ctx, "BIO_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)488063741,   NGS_StatisticsGetAsU64 ( stats, ctx, "SPOT_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)5368875807,  NGS_StatisticsGetAsU64 ( stats, ctx, "SPOT_MAX" ) );
+    REQUIRE_EQ ( (uint64_t)4880812067,  NGS_StatisticsGetAsU64 ( stats, ctx, "SPOT_MIN" ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+
+    EXIT;
+}
+
+// parsing BAM_HEADER: (tab-separated), for CSRA1_PrimaryOnly:
+//   "@RG  ID:C1ELY.6      PL:illumina     PU:C1ELYACXX121221.6.ATTCTAGG   LB:Pond-203140  PI:0"
+//   "DT:2012-12-21T00:00:00-0500     SM:Cryptococcus neoformans var. grubii MW-RSA913        CN:BI"
+//
+// SAM/BAM Read group line (@RG), tags:
+// ID (required):   Read group identifier. Each @RG line must have a unique ID. The value of ID is used in the RG
+//                  tags of alignment records. Must be unique among all read groups in header section. Read group
+//                  IDs may be modified when merging SAM files in order to handle collisions.
+// CN:  Name of sequencing center producing the read.
+// DS:  Description.
+// DT:  Date the run was produced (ISO8601 date or date/time).
+// FO:  Flow order. The array of nucleotide bases that correspond to the nucleotides used for each row of each read. Multi-base
+//      rows are encoded in IUPAC format, and non-nucleotide rows by various other characters. Format: /\*|[ACMGRSVTWYHKDBN]+/
+// KS:  The array of nucleotide bases that correspond to the key sequence of each read.
+// LB:  Library.
+// PG:  Programs used for processing the read group.
+// PI:  Predicted median insert size.
+// PL:  Platform/technology used to produce the reads. Valid values: CAPILLARY, LS454, ILLUMINA, SOLID, HELICOS, IONTORRENT and PACBIO.
+// PU:  Platform unit (e.g. rowcell-barcode.lane for Illumina or slide for SOLiD). Unique identifier.
+// SM:  Sample. Use pool name where a pool is being sequenced
+
+
+// Iteration over ReadGroups
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGroupIterator_NoReadGroupBeforeNext, CSRA1_Fixture)
+{
+    ENTRY_ACC(CSRA1_PrimaryOnly);
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+    REQUIRE ( ! FAILED () && m_readGroup );
+    NGS_ReadGroupGetName ( m_readGroup, ctx );
+    REQUIRE_FAILED( );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGroupIterator_AfterNext, CSRA1_Fixture)
+{
+    ENTRY_ACC(CSRA1_WithGroups);
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( "GS46253-FS3-L03", NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( "GS54387-FS3-L01", NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadGroupNext_BeyondEnd, CSRA1_Fixture)
+{
+    ENTRY_GET_READ( CSRA1_WithGroups, 1 );
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+
+    size_t count = 0;
+    while ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) )
+    {
+        REQUIRE ( ! FAILED () );
+        ++count;
+    }
+
+    REQUIRE_EQ ( (size_t)13, count );
+
+    NGS_ReadGroupGetName ( m_readGroup, ctx );
+    REQUIRE_FAILED( );
+
+    REQUIRE ( ! NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+
+    EXIT;
+}
+
+TEST_CASE(CSRA1_NGS_ReadCollectionHasReference)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+
+    NGS_ReadCollection* read_coll = NGS_ReadCollectionMake ( ctx, CSRA1_PrimaryOnly );
+
+    REQUIRE ( read_coll != NULL );
+    REQUIRE ( NGS_ReadCollectionHasReference ( read_coll, ctx, "supercont2.2" ) );
+    REQUIRE ( ! NGS_ReadCollectionHasReference ( read_coll, ctx, "non-existent acc" ) );
+
+    NGS_ReadCollectionRelease ( read_coll, ctx );
+}
+
+// Fragment Blobs
+
+FIXTURE_TEST_CASE(CSRA1_GetFragmentBlobs, CSRA1_Fixture)
+{
+    ENTRY_ACC(CSRA1_PrimaryOnly);
+
+    NGS_FragmentBlobIterator* blobIt = NGS_ReadCollectionGetFragmentBlobs ( m_coll, ctx );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( blobIt );
+
+    NGS_FragmentBlob* blob = NGS_FragmentBlobIteratorNext ( blobIt, ctx );
+
+    REQUIRE_EQ ( (uint64_t)808, NGS_FragmentBlobSize ( blob, ctx ) );
+
+    NGS_FragmentBlobRelease ( blob, ctx );
+    NGS_FragmentBlobIteratorRelease ( blobIt, ctx );
+
+    EXIT;
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs_csra1";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    return NgsCsra1TestSuite(argc, argv);
+}
+
+}
+
diff --git a/test/ngs/ngstest_csra1_pileup.cpp b/test/ngs/ngstest_csra1_pileup.cpp
new file mode 100644
index 0000000..a8a2199
--- /dev/null
+++ b/test/ngs/ngstest_csra1_pileup.cpp
@@ -0,0 +1,577 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS C interface, CSRA1 archives, Pileup-related functions
+*/
+
+#include "ngs_c_fixture.hpp"
+
+#include "NGS_Pileup.h"
+#include "NGS_PileupEvent.h"
+
+#include <kdb/manager.h>
+
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+
+#include <klib/printf.h>
+
+#include <limits.h>
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsCsra1PileupTestSuite);
+
+const char* CSRA1_PrimaryOnly   = "SRR1063272";
+const char* CSRA1_WithSecondary = "SRR833251";
+const char* CSRA1_WithCircularReference = "SRR821492";
+
+#define ENTRY_GET_PILEUP(acc,ref) \
+    ENTRY_GET_REF(acc,ref) \
+    m_pileup = NGS_ReferenceGetPileups( m_ref, ctx, true, false); \
+    REQUIRE ( ! FAILED () && m_pileup );
+
+#define ENTRY_GET_PILEUP_NEXT(acc,ref) \
+    ENTRY_GET_PILEUP(acc,ref) \
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    
+#define ENTRY_GET_PILEUP_SLICE(acc,ref,offset,size) \
+    ENTRY_GET_REF(acc,ref) \
+    m_pileup = NGS_ReferenceGetPileupSlice( m_ref, ctx, offset, size, true, false); \
+    REQUIRE ( ! FAILED () && m_pileup );
+
+#define ENTRY_GET_PILEUP_SLICE_NEXT(acc,ref,offset,size) \
+    ENTRY_GET_PILEUP_SLICE(acc,ref,offset,size); \
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    
+class CSRA1_Fixture : public NGS_C_Fixture
+{
+public:
+    CSRA1_Fixture()
+    : m_pileup (0)
+    {
+    }
+
+    virtual void Release()
+    {
+        if (m_ctx != 0)
+        {
+            if ( m_pileup != 0 )
+            {
+                NGS_PileupRelease ( m_pileup, m_ctx );
+            }
+        }
+        NGS_C_Fixture :: Release ();
+    }
+    
+    void Advance ( uint32_t count )
+    {
+        while ( count > 0 )
+        {
+            if  ( ! NGS_PileupIteratorNext ( m_pileup, m_ctx ) )
+                throw std :: logic_error ( "CSRA1_Fixture::Advance : NGS_PileupIteratorNext() failed" );
+            --count;
+        }
+    }
+    
+    void PrintAll ()
+    {
+        HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+        while (NGS_PileupIteratorNext ( m_pileup, ctx ))
+        {
+            int64_t pos = NGS_PileupGetReferencePosition ( m_pileup, ctx );
+            if  ( FAILED () )
+                throw std :: logic_error ( "CSRA1_Fixture::PrintAll : NGS_PileupGetReferencePosition() failed" );
+            unsigned int depth = NGS_PileupGetPileupDepth ( m_pileup, ctx );
+            if  ( FAILED () )
+                throw std :: logic_error ( "CSRA1_Fixture::PrintAll : NGS_PileupGetPileupDepth() failed" );
+            string ref = toString ( NGS_PileupGetReferenceSpec ( m_pileup, ctx ), ctx, true );
+            if  ( FAILED () )
+                throw std :: logic_error ( "CSRA1_Fixture::PrintAll : NGS_PileupGetReferenceSpec() failed" );
+            if ( depth != 0 )
+                cout <<  ref << "\t" << pos << "\t" << depth << endl;
+        }
+    }
+
+    
+    NGS_Pileup*     m_pileup;
+};
+
+//// PileupIterator, full non-circular reference
+
+// no access before a call to NGS_PileupIteratorNext():
+
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_NoAccessBeforeNext_PileupGetReferenceSpec, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    REQUIRE_NULL ( NGS_PileupGetReferenceSpec ( m_pileup, ctx ) ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_NoAccessBeforeNext_PileupGetReferencePosition, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    NGS_PileupGetReferencePosition ( m_pileup, ctx ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_NoAccessBeforeNext_PileupGetReferenceBase, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    REQUIRE_EQ ( (char)0, NGS_PileupGetReferenceBase ( m_pileup, ctx ) ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_NoAccessBeforeNext_PileupGetPileupDepth, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    NGS_PileupGetPileupDepth ( m_pileup, ctx ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+
+// access after a call to NGS_PileupIteratorNext():
+
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_AccessAfterNext_PileupGetReferenceSpec, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_NEXT ( CSRA1_PrimaryOnly, "supercont2.1" );
+    REQUIRE_STRING ( "supercont2.1", NGS_PileupGetReferenceSpec ( m_pileup, ctx ) ); 
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_AccessAfterNext_PileupGetReferencePosition, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_NEXT ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    REQUIRE_EQ ( (int64_t)0, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE ( ! FAILED () );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_AccessAfterNext_PileupGetReferenceBase, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_NEXT ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    char base = NGS_PileupGetReferenceBase ( m_pileup, ctx ); 
+    //REQUIRE ( ! FAILED () && base != 0 );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_AccessAfterNext_PileupGetPileupDepth, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_NEXT ( CSRA1_PrimaryOnly, "supercont2.1" );
+    REQUIRE_EQ ( (unsigned int)0, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    EXIT;
+}
+
+// no access after the end of iteration
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_NoAccessAfterEnd_PileupGetReferenceSpec, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+    while ( NGS_PileupIteratorNext ( m_pileup, ctx ) ) {}
+
+    REQUIRE_NULL ( NGS_PileupGetReferenceSpec ( m_pileup, ctx ) ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_NoAccessAfterEnd_PileupGetReferencePosition, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+    while ( NGS_PileupIteratorNext ( m_pileup, ctx ) ) {}
+    
+    NGS_PileupGetReferencePosition ( m_pileup, ctx ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_NoAccessAfterEnd_PileupGetReferenceBase, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+    while ( NGS_PileupIteratorNext ( m_pileup, ctx ) ) {}
+
+    REQUIRE_EQ ( (char)0, NGS_PileupGetReferenceBase ( m_pileup, ctx ) ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_NoAccessAfterEnd_PileupGetPileupDepth, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+    while ( NGS_PileupIteratorNext ( m_pileup, ctx ) ) {}
+
+    NGS_PileupGetPileupDepth ( m_pileup, ctx ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_NoAccessAfterEnd_PileupIteratorNext, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+    while ( NGS_PileupIteratorNext ( m_pileup, ctx ) ) {}
+
+    REQUIRE ( ! NGS_PileupIteratorNext ( m_pileup, ctx ) ); 
+    
+    EXIT;
+}
+
+// regular operation
+
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_PileupGetReferencePosition, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_NEXT ( CSRA1_PrimaryOnly, "supercont2.1" );
+    
+    REQUIRE_EQ ( (int64_t)0, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (int64_t)1, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (int64_t)2, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_PileupGetPileupDepth_1, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    Advance(85);
+
+    REQUIRE_EQ ( (int64_t)84, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE_EQ ( (unsigned int)0, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+
+    Advance(1);
+
+    REQUIRE_EQ ( (int64_t)85, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE_EQ ( (unsigned int)1, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_PileupGetPileupDepth_2, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    Advance(186);
+    REQUIRE_EQ ( (int64_t)185, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE_EQ ( (unsigned int)2, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_PileupGetPileupDepth_3, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    Advance(5491);
+
+    REQUIRE_EQ ( (int64_t)5490, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE_EQ ( (unsigned int)2, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+
+    Advance(1);
+
+    REQUIRE_EQ ( (int64_t)5491, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE_EQ ( (unsigned int)3, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    
+    EXIT;
+}
+
+#if 0
+FIXTURE_TEST_CASE(CSRA1_PileupIterator_PrintOut, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP( CSRA1_PrimaryOnly, "supercont2.1" );
+    PrintAll ();
+    EXIT;
+}
+#endif
+
+//// PileupIterator, non-circular reference slice
+
+// no access before a call to NGS_PileupIteratorNext():
+
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_NoAccessBeforeNext_PileupGetReferenceSpec, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+
+    REQUIRE_NULL ( NGS_PileupGetReferenceSpec ( m_pileup, ctx ) ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_NoAccessBeforeNext_PileupGetReferencePosition, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+
+    NGS_PileupGetReferencePosition ( m_pileup, ctx ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_NoAccessBeforeNext_PileupGetReferenceBase, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+
+    REQUIRE_EQ ( (char)0, NGS_PileupGetReferenceBase ( m_pileup, ctx ) ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_NoAccessBeforeNext_PileupGetPileupDepth, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+
+    NGS_PileupGetPileupDepth ( m_pileup, ctx ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+
+// access after a call to NGS_PileupIteratorNext():
+
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_AccessAfterNext_PileupGetReferenceSpec, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE_NEXT( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+    REQUIRE_STRING ( "supercont2.1", NGS_PileupGetReferenceSpec ( m_pileup, ctx ) ); 
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_AccessAfterNext_PileupGetReferencePosition, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE_NEXT( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+
+    REQUIRE_EQ ( (int64_t)5431, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE ( ! FAILED () );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_AccessAfterNext_PileupGetReferenceBase, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE_NEXT( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+
+    char base = NGS_PileupGetReferenceBase ( m_pileup, ctx ); 
+    //REQUIRE ( ! FAILED () && base != 0 );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_AccessAfterNext_PileupGetPileupDepth, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE_NEXT( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+    REQUIRE_EQ ( (unsigned int)1, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    EXIT;
+}
+
+// no access after the end of iteration:
+
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_NoAccessAfterEnd_PileupGetReferenceSpec, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+    while ( NGS_PileupIteratorNext ( m_pileup, ctx ) ) {}
+
+    REQUIRE_NULL ( NGS_PileupGetReferenceSpec ( m_pileup, ctx ) ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_NoAccessAfterEnd_PileupGetReferencePosition, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+    while ( NGS_PileupIteratorNext ( m_pileup, ctx ) ) {}
+
+    NGS_PileupGetReferencePosition ( m_pileup, ctx ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_NoAccessAfterEnd_PileupGetReferenceBase, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+    while ( NGS_PileupIteratorNext ( m_pileup, ctx ) ) {}
+
+    REQUIRE_EQ ( (char) 0, NGS_PileupGetReferenceBase ( m_pileup, ctx ) ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_NoAccessAfterEnd_PileupGetPileupDepth, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( CSRA1_PrimaryOnly, "supercont2.1", 5431, 4 );
+    while ( NGS_PileupIteratorNext ( m_pileup, ctx ) ) {}
+
+    NGS_PileupGetPileupDepth ( m_pileup, ctx ); 
+    REQUIRE_FAILED ();
+    
+    EXIT;
+}
+
+// regular operation
+
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_PileupGetReferencePosition, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( CSRA1_PrimaryOnly, "supercont2.1", 5431, 2 );
+    
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (int64_t)5431, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (int64_t)5432, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE ( ! NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_PileupGetPileupDepth_NoFiltering, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( CSRA1_PrimaryOnly, "supercont2.1", 404, 4 );
+
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (unsigned int)1, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (unsigned int)1, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (unsigned int)2, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (unsigned int)2, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    REQUIRE ( ! NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_PileupIteratorSlice_PileupGetPileupDepth_WithFiltering, CSRA1_Fixture)
+{   // alignments marked as rejected are not included into pileup depth counts
+    ENTRY_GET_PILEUP_SLICE( CSRA1_PrimaryOnly, "supercont2.1", 5505, 4 );
+
+// positions 5505-5508 match a rejected alignment; with filtering turned off the reported depths would be 3, 3, 4, 4.
+
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (unsigned int)2, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (unsigned int)2, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (unsigned int)3, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (unsigned int)3, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    REQUIRE ( ! NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    
+    EXIT;
+}
+//TODO: alignment filtering-related schema variations
+// no RD_FILTER physically exists in either PRIMARY_ALIGNMENT or SEQUENCE (no filtering) 
+//      (use VTableListPhysColumns) (NB. READ_FILTER may be present but virtual!)
+// RD_FILTER physically exists in PRIMARY_ALIGNMENT
+// RD_FILTER_CACHE appears to exist virtually in PRIMARY_ALIGNMENT:
+// RD_FILTER physically exists in SEQUENCE and RD_FILTER_CACHE does not exist in PRIMARY_ALIGNMENT
+
+////TODO: PileupIterator, full circular reference 
+////TODO: PileupIterator, circular reference slice
+
+// discrepancies with sra-pileup
+
+#if SHOW_UNIMPLEMENTED
+FIXTURE_TEST_CASE(CSRA1_Pileup_ExtraPileupReported, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( "SRR833251", "gi|169794206|ref|NC_010410.1|", 19416, 2 );
+    // sra-pileup stops at position 19417 (0-based), ngs-pileup at position 19418
+
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (int64_t)19416, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE_EQ ( (unsigned int)1, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (int64_t)19417, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE_EQ ( (unsigned int)0, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    REQUIRE ( ! NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_Pileup_ExtraEventReported, CSRA1_Fixture)
+{
+    ENTRY_GET_PILEUP_SLICE( "SRR1063272", "supercont2.1", 12979, 1 );
+    // at position 12980 (0-based) sra-pileup reports depth of 15, ngs-pileup 16
+
+    REQUIRE ( NGS_PileupIteratorNext ( m_pileup, ctx ) );
+    REQUIRE_EQ ( (int64_t)12979, NGS_PileupGetReferencePosition ( m_pileup, ctx ) ); 
+    REQUIRE_EQ ( (unsigned int)15, NGS_PileupGetPileupDepth ( m_pileup, ctx ) ); 
+    
+    EXIT;
+}
+#endif
+
+//// PileupEvent
+
+//TODO: NGS_PileupEventGetReferenceSpec
+//TODO: NGS_PileupEventGetReferencePosition
+//TODO: NGS_PileupEventGetMappingQuality
+//TODO: NGS_PileupEventGetAlignmentId
+//TODO: NGS_PileupEventGetAlignment
+//TODO: NGS_PileupEventGetAlignmentPosition
+//TODO: NGS_PileupEventGetFirstAlignmentPosition
+//TODO: NGS_PileupEventGetLastAlignmentPosition
+//TODO: NGS_PileupEventGetEventType
+//TODO: NGS_PileupEventGetAlignmentBase
+//TODO: NGS_PileupEventGetAlignmentQuality
+//TODO: NGS_PileupEventGetInsertionBases
+//TODO: NGS_PileupEventGetInsertionQualities
+//TODO: NGS_PileupEventGetDeletionCount
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs_csra1_pileup";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t m_coll=NgsCsra1PileupTestSuite(argc, argv);
+    return m_coll;
+}
+
+}
+
diff --git a/test/ngs/ngstest_csra1_readcollection.cpp b/test/ngs/ngstest_csra1_readcollection.cpp
new file mode 100644
index 0000000..205b171
--- /dev/null
+++ b/test/ngs/ngstest_csra1_readcollection.cpp
@@ -0,0 +1,739 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS C interface, ReadCollection-related functions, CSRA1 archives
+*/
+
+#include "ngs_c_fixture.hpp"
+
+#include <CSRA1_ReadCollection.h>
+
+#include <NGS_Cursor.h>
+
+#include <kdb/manager.h>
+
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+
+#include <klib/printf.h>
+
+#include <limits.h>
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsCsra1ReadCollectionTestSuite);
+
+const char* CSRA1_PrimaryOnly   = "SRR1063272";
+const char* CSRA1_WithSecondary = "SRR833251";
+
+class CSRA1_Fixture : public NGS_C_Fixture
+{
+public:
+    CSRA1_Fixture()
+    : m_align(0)
+    {
+    }
+    ~CSRA1_Fixture()
+    {
+    }
+    
+    virtual void Release()
+    {
+        if (m_ctx != 0)
+        {
+            if (m_align != 0)
+            {
+                NGS_AlignmentRelease ( m_align, m_ctx );
+            }
+        }
+        NGS_C_Fixture :: Release ();
+    }
+    
+    
+    NGS_Alignment*      m_align;
+};
+
+// CSRA1_ReadCollection
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_Open, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    REQUIRE_NOT_NULL(m_coll);
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetName, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    REQUIRE_STRING ( CSRA1_PrimaryOnly, NGS_ReadCollectionGetName ( m_coll, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetRead, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    m_read = NGS_ReadCollectionGetRead ( m_coll, ctx, ReadId ( 1 )  . c_str () );
+    REQUIRE_NOT_NULL ( m_read );
+    EXIT;
+}
+
+const uint64_t GetReadCount_Total       = 2280633;
+const uint64_t GetReadCount_Unaligned   =  246555;
+const uint64_t GetReadCount_Aligned     = GetReadCount_Total - GetReadCount_Unaligned; // 2034078
+const uint64_t GetReadCount_FullyAligned = 1953623;
+const uint64_t GetReadCount_PartiallyAligned = GetReadCount_Aligned - GetReadCount_FullyAligned; // 80455
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReadCount_All, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    REQUIRE_EQ( GetReadCount_Total, NGS_ReadCollectionGetReadCount ( m_coll, ctx, true, true, true ) ); 
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReadCount_Unaligned, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    REQUIRE_EQ( GetReadCount_Unaligned, NGS_ReadCollectionGetReadCount ( m_coll, ctx, false, false, true ) ); 
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReadCount_Aligned, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    REQUIRE_EQ( GetReadCount_Aligned, NGS_ReadCollectionGetReadCount ( m_coll, ctx, true, true, false ) ); 
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReadCount_FullyAligned, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    REQUIRE_EQ( GetReadCount_FullyAligned, NGS_ReadCollectionGetReadCount ( m_coll, ctx, true, false, false ) ); 
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReadCount_PartiallyAligned, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    REQUIRE_EQ( GetReadCount_PartiallyAligned, NGS_ReadCollectionGetReadCount ( m_coll, ctx, false, true, false ) ); 
+    EXIT;
+}
+
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReads_All, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+    REQUIRE ( ! FAILED () && m_read );
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReads_Aligned, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, false, false);
+    REQUIRE ( ! FAILED () && m_read );
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_EQ ( NGS_ReadCategory_fullyAligned, NGS_ReadGetReadCategory ( m_read, ctx ) );
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReads_Partial, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, false, true, false);
+    REQUIRE ( ! FAILED () && m_read );
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_EQ ( NGS_ReadCategory_partiallyAligned, NGS_ReadGetReadCategory ( m_read, ctx ) );
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReads_Unaligned, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, false, false, true);
+    REQUIRE ( ! FAILED () && m_read );
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_EQ ( NGS_ReadCategory_unaligned, NGS_ReadGetReadCategory ( m_read, ctx ) );
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetReads_None, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, false, false, false);
+    REQUIRE ( ! FAILED () && m_read );
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionGetReadRange, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 2, 3, true, true, true );
+    REQUIRE_NOT_NULL ( m_read );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignment, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    m_align = NGS_ReadCollectionGetAlignment ( m_coll, ctx, ( string ( CSRA1_PrimaryOnly ) + ".PA.1" ) . c_str () );
+    REQUIRE_NOT_NULL ( m_align );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignment_IdLow, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    REQUIRE_NULL ( NGS_ReadCollectionGetAlignment ( m_coll, ctx, ( string ( CSRA1_PrimaryOnly ) + ".PA.0" ) . c_str () ) );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignment_Secondary, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_WithSecondary );
+    m_align = NGS_ReadCollectionGetAlignment ( m_coll, ctx, ( string ( CSRA1_WithSecondary ) + ".SA.169" ) . c_str () );
+    REQUIRE_NOT_NULL ( m_align );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".SA.169", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionGetReference, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    m_ref = NGS_ReadCollectionGetReference ( m_coll, ctx, "supercont2.1" );
+    REQUIRE_NOT_NULL ( m_ref );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionGetReferences, CSRA1_Fixture)
+{
+    ENTRY_ACC( CSRA1_PrimaryOnly );
+    m_ref = NGS_ReadCollectionGetReferences ( m_coll, ctx );
+    REQUIRE_NOT_NULL ( m_ref );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionGetReadGroups, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_PrimaryOnly);
+    
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+    REQUIRE ( ! FAILED () && m_readGroup );
+
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionGetReadGroup_NotFound, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_PrimaryOnly);
+    REQUIRE_NULL ( NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "wontfindme" ) );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+    
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionGetReadGroup_WithGroups_DefaultNotFound, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_PrimaryOnly);
+    REQUIRE_NULL ( NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "" ) );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+    
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionGetReadGroup_WithGroups_Found, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_PrimaryOnly);
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "C1ELY.6");
+    REQUIRE_NOT_NULL ( m_readGroup );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionHasReadGroup_NotFound, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_PrimaryOnly);
+    REQUIRE ( ! NGS_ReadCollectionHasReadGroup ( m_coll, ctx, "wontfindme" ) );
+    EXIT;
+}
+    
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionHasReadGroup_WithGroups_DefaultNotFound, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_PrimaryOnly);
+    REQUIRE ( ! NGS_ReadCollectionHasReadGroup ( m_coll, ctx, "" ) );
+    EXIT;
+}
+    
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionHasReadGroup_WithGroups_Found, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_PrimaryOnly);
+    REQUIRE ( NGS_ReadCollectionHasReadGroup ( m_coll, ctx, "C1ELY.6") );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionGetAlignments_All, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_WithSecondary);
+    
+    m_align = NGS_ReadCollectionGetAlignments ( m_coll, ctx, true, true );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( NGS_AlignmentIsPrimary ( m_align, ctx ) );
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionGetAlignments_FilteredPrimary, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_WithSecondary);
+    
+    m_align = NGS_ReadCollectionGetAlignments ( m_coll, ctx, true, false );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( NGS_AlignmentIsPrimary ( m_align, ctx ) );
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionGetAlignments_FilteredSecondary, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_WithSecondary);
+    
+    m_align = NGS_ReadCollectionGetAlignments ( m_coll, ctx, false, true );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( ! NGS_AlignmentIsPrimary ( m_align, ctx ) );
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollectionGetAlignments_FilteredNone, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_WithSecondary);
+    
+    m_align = NGS_ReadCollectionGetAlignments ( m_coll, ctx, false, false );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentCount_Primary_None, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_PrimaryOnly );
+    REQUIRE_EQ( (uint64_t)0, NGS_ReadCollectionGetAlignmentCount ( m_coll, ctx, false, false) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentCount_Primary_All, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_PrimaryOnly );
+    REQUIRE_EQ( (uint64_t)3987701, NGS_ReadCollectionGetAlignmentCount ( m_coll, ctx, true, true) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentCount_Primary_CategoryPrimary, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_PrimaryOnly );
+    REQUIRE_EQ( (uint64_t)3987701, NGS_ReadCollectionGetAlignmentCount ( m_coll, ctx, true, false) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentCount_Primary_CategorySecondary, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_PrimaryOnly );
+    REQUIRE_EQ( (uint64_t)0, NGS_ReadCollectionGetAlignmentCount ( m_coll, ctx, false, true) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentCount_Secondary_All, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    REQUIRE_EQ( (uint64_t)178, NGS_ReadCollectionGetAlignmentCount ( m_coll, ctx, true, true) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentCount_Secondary_CategoryPrimary, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    REQUIRE_EQ( (uint64_t)168, NGS_ReadCollectionGetAlignmentCount ( m_coll, ctx, true, false) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentCount_Secondary_CategorySecondary, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    REQUIRE_EQ( (uint64_t)10, NGS_ReadCollectionGetAlignmentCount ( m_coll, ctx, false, true) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_Primary, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_PrimaryOnly );
+    
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 3, 2, true, true );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".PA.3", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".PA.4", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_PrimarySingle, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_PrimaryOnly );
+    
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 4, 1, true, true );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".PA.4", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_PrimaryOutOfRange_CutLow, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_PrimaryOnly );
+
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 0, 13, true, true );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".PA.1", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_PrimaryOutOfRangeHigh, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_PrimaryOnly );
+
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 3987702, 1, true, true );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_PrimaryOutOfRange_CutHigh, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_PrimaryOnly );
+
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 3987701, 2, true, true );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".PA.3987701", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_Secondary, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 170, 2, true, true );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".SA.170", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".SA.171", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_SecondarySingle, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 174, 1, true, true );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".SA.174", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_SecondaryOutOfRangeHigh, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 179, 1, true, true );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_SecondaryOutOfRange_CutHigh, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 178, 4, true, true );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".SA.178", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRange_All, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 167, 4, true, true );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".PA.167", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".PA.168", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".SA.169", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".SA.170", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRangeFiltered_Primary, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 167, 4, true, false );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".PA.167", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".PA.168", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRangeFiltered_Secondary, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 167, 4, false, true );
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".SA.169", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( string ( CSRA1_WithSecondary ) + ".SA.170", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_ReadCollection_GetAlignmentRangeFiltered_None, CSRA1_Fixture)
+{
+    ENTRY_ACC ( CSRA1_WithSecondary );
+    
+    m_align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 167, 4, false, false);
+    REQUIRE ( ! FAILED () && m_align );
+    
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(NGS_ReadCollection_MakeAlignmentCursor_Reuse, CSRA1_Fixture)
+{   // if an exclusive cursor is requested, the currently open cursor is returned if it is not in use
+    ENTRY_ACC ( CSRA1_WithSecondary );
+
+    // create and release a non-exclusive cursor
+    const NGS_Cursor* c1 = CSRA1_ReadCollectionMakeAlignmentCursor ( ( CSRA1_ReadCollection * ) m_coll, ctx, true, false );
+    REQUIRE ( ! FAILED () && c1 );
+    NGS_CursorRelease ( c1, ctx );
+    REQUIRE ( ! FAILED () );
+    
+    // request an exclusive cursor, verify that it is the same one as former c1
+    const NGS_Cursor* c2 = CSRA1_ReadCollectionMakeAlignmentCursor ( ( CSRA1_ReadCollection * ) m_coll, ctx, true, true );
+    REQUIRE ( ! FAILED () && c2 );
+    REQUIRE_EQ ( c1, c2 );
+    
+    // request another non-exclusive cursor, make sure it is a new one
+    c1 = CSRA1_ReadCollectionMakeAlignmentCursor ( ( CSRA1_ReadCollection * ) m_coll, ctx, true, false );
+    REQUIRE ( ! FAILED () && c1 );
+    REQUIRE_NE ( c1, c2 );
+
+    NGS_CursorRelease ( c2, ctx );
+    REQUIRE ( ! FAILED () );
+    NGS_CursorRelease ( c1, ctx );
+    
+    EXIT;
+}
+FIXTURE_TEST_CASE(NGS_ReadCollection_MakeAlignmentCursor_New, CSRA1_Fixture)
+{   // if an exclusive cursor is requested, a new cursor is created if the currently open one is in use
+    ENTRY_ACC ( CSRA1_WithSecondary );
+
+    // create a non-exclusive cursor
+    const NGS_Cursor* c1 = CSRA1_ReadCollectionMakeAlignmentCursor ( ( CSRA1_ReadCollection * ) m_coll, ctx, true, false );
+    REQUIRE ( ! FAILED () && c1 );
+    
+    // request an exclusive cursor, verify that it is not c1
+    const NGS_Cursor* c2 = CSRA1_ReadCollectionMakeAlignmentCursor ( ( CSRA1_ReadCollection * ) m_coll, ctx, true, true );
+    REQUIRE ( ! FAILED () && c2 );
+    REQUIRE_NE ( c1, c2 );
+    NGS_CursorRelease ( c2, ctx );
+    REQUIRE ( ! FAILED () );
+    
+    // request a non-exclusive cursor, verify that it is the same as c1
+    c2 = CSRA1_ReadCollectionMakeAlignmentCursor ( ( CSRA1_ReadCollection * ) m_coll, ctx, true, false );
+    REQUIRE ( ! FAILED () && c2 );
+    REQUIRE_EQ ( c1, c2 );
+    
+    NGS_CursorRelease ( c2, ctx );
+    REQUIRE ( ! FAILED () );
+    NGS_CursorRelease ( c1, ctx );
+    
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReadCollectionGetStats, CSRA1_Fixture)
+{   
+    ENTRY_ACC(CSRA1_WithSecondary);
+    
+    NGS_Statistics * stats = NGS_ReadCollectionGetStatistics ( m_coll, ctx );
+    REQUIRE ( ! FAILED () );
+    
+    REQUIRE_EQ ( (uint64_t)615696,  NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)615696,  NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/BIO_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)598728,  NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/CMP_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)3048,    NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/SPOT_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)3048,    NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/SPOT_MAX" ) );
+    REQUIRE_EQ ( (uint64_t)1,       NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/SPOT_MIN" ) );
+
+    REQUIRE_EQ ( (uint64_t)3936291, NGS_StatisticsGetAsU64 ( stats, ctx, "REFERENCE/BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)3936291, NGS_StatisticsGetAsU64 ( stats, ctx, "REFERENCE/BIO_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)3936291, NGS_StatisticsGetAsU64 ( stats, ctx, "REFERENCE/CMP_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)788,     NGS_StatisticsGetAsU64 ( stats, ctx, "REFERENCE/SPOT_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)788,     NGS_StatisticsGetAsU64 ( stats, ctx, "REFERENCE/SPOT_MAX" ) );
+    REQUIRE_EQ ( (uint64_t)1,       NGS_StatisticsGetAsU64 ( stats, ctx, "REFERENCE/SPOT_MIN" ) );
+    
+    REQUIRE_EQ ( (uint64_t)16968,   NGS_StatisticsGetAsU64 ( stats, ctx, "PRIMARY_ALIGNMENT/BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)16968,   NGS_StatisticsGetAsU64 ( stats, ctx, "PRIMARY_ALIGNMENT/BIO_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)168,     NGS_StatisticsGetAsU64 ( stats, ctx, "PRIMARY_ALIGNMENT/SPOT_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)168,     NGS_StatisticsGetAsU64 ( stats, ctx, "PRIMARY_ALIGNMENT/SPOT_MAX" ) );
+    REQUIRE_EQ ( (uint64_t)1,       NGS_StatisticsGetAsU64 ( stats, ctx, "PRIMARY_ALIGNMENT/SPOT_MIN" ) );
+    
+    REQUIRE_EQ ( (uint64_t)1010,    NGS_StatisticsGetAsU64 ( stats, ctx, "SECONDARY_ALIGNMENT/BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)1010,    NGS_StatisticsGetAsU64 ( stats, ctx, "SECONDARY_ALIGNMENT/BIO_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)10,      NGS_StatisticsGetAsU64 ( stats, ctx, "SECONDARY_ALIGNMENT/SPOT_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)10,      NGS_StatisticsGetAsU64 ( stats, ctx, "SECONDARY_ALIGNMENT/SPOT_MAX" ) );
+    REQUIRE_EQ ( (uint64_t)1,       NGS_StatisticsGetAsU64 ( stats, ctx, "SECONDARY_ALIGNMENT/SPOT_MIN" ) );
+    
+    NGS_StatisticsRelease ( stats, ctx );
+    
+    EXIT;
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs_csra1_readcollection";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t m_coll=NgsCsra1ReadCollectionTestSuite(argc, argv);
+    return m_coll;
+}
+
+}
+
diff --git a/test/ngs/ngstest_csra1_refwin.cpp b/test/ngs/ngstest_csra1_refwin.cpp
new file mode 100644
index 0000000..f403ce0
--- /dev/null
+++ b/test/ngs/ngstest_csra1_refwin.cpp
@@ -0,0 +1,824 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS C interface, CSRA1 archives, ReferenceWindow-related functions
+*/
+
+#include "ngs_c_fixture.hpp"
+
+#include <kdb/manager.h>
+
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+
+#include <klib/printf.h>
+
+#include <limits.h>
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsCsra1RefWinTestSuite);
+
+const char* CSRA1_PrimaryOnly   = "SRR1063272";
+const char* CSRA1_WithSecondary = "SRR833251";
+const char* CSRA1_WithCircularReference = "SRR821492";
+
+class CSRA1_Fixture : public NGS_C_Fixture
+{
+public:
+    CSRA1_Fixture()
+    : m_align (0)
+    {
+    }
+    ~CSRA1_Fixture()
+    {
+    }
+    virtual void Release()
+    {
+        if (m_ctx != 0)
+        {
+            if (m_align != 0)
+            {
+                NGS_AlignmentRelease ( m_align, m_ctx );
+            }
+        }
+        NGS_C_Fixture :: Release ();
+    }
+
+    void GetAlignment(uint64_t id)
+    {
+        stringstream str;
+        str << id;
+        m_align = NGS_ReadCollectionGetAlignment ( m_coll, m_ctx, str . str () . c_str () );
+    }
+    void SkipAlignments ( size_t num, bool print = false )
+    {
+        for (size_t i = 0; i < num; ++i)
+        {
+            if ( ! NGS_AlignmentIteratorNext ( m_align, m_ctx ) )
+                throw logic_error ("premature end of iterator");
+            if ( m_ctx -> rc != 0 )
+                throw logic_error ("NGS_AlignmentIteratorNext failed");
+
+            if (print)
+                cout << toString ( NGS_AlignmentGetAlignmentId ( m_align, m_ctx ), m_ctx, true ) << endl;
+        }
+    }
+    void PrintAlignment ()
+    {
+        cout << "id=" << toString ( NGS_AlignmentGetAlignmentId ( m_align, m_ctx ), m_ctx, true )
+             << " pos=" << NGS_AlignmentGetAlignmentPosition ( m_align, m_ctx )
+             << " len=" << NGS_AlignmentGetAlignmentLength ( m_align, m_ctx )
+             << ( NGS_AlignmentIsPrimary ( m_align, m_ctx ) ? " PRI" : " SEC" )
+             << " mapq=" << NGS_AlignmentGetMappingQuality( m_align, m_ctx )
+             << endl;
+    }
+
+    bool NextId (const string& p_expected)
+    {
+        if ( ! NGS_AlignmentIteratorNext ( m_align, m_ctx ) || m_ctx -> rc != 0 )
+        {
+            cout << "NextId: NGS_AlignmentIteratorNext FAILED" << endl;
+            return false;
+        }
+        string actual = toString ( NGS_AlignmentGetAlignmentId ( m_align, m_ctx ), m_ctx, true );
+        if ( p_expected !=  actual )
+        {
+            cout << "NextId: expected '" << p_expected << "', actual '" << actual << "'" <<endl;
+            return false;
+        }
+        return m_ctx -> rc == 0;
+    }
+
+    bool VerifyOrder()
+    {
+        uint64_t prevPos = 0;
+        uint64_t prevLen = 0;
+        bool     prevIsPrimary = true;
+        int      prevMapq = 0;
+        while ( NGS_AlignmentIteratorNext ( m_align, m_ctx ) )
+        {
+            uint64_t newPos = NGS_AlignmentGetAlignmentPosition ( m_align, m_ctx );
+            uint64_t newLen = NGS_AlignmentGetAlignmentLength ( m_align, m_ctx );
+            bool     newIsPrimary = NGS_AlignmentIsPrimary ( m_align, m_ctx );
+            int      newMapq = NGS_AlignmentGetMappingQuality( m_align, m_ctx );
+            if (prevPos > newPos)
+            {
+                PrintAlignment();
+                return false;
+            }
+            if ( prevPos == newPos )
+            {
+                if ( prevLen < newLen )
+                {
+                    PrintAlignment();
+                    return false;
+                }
+                if ( prevLen == newLen )
+                {
+                    if ( ! ( prevIsPrimary || ! newIsPrimary) )
+                    {
+                        PrintAlignment();
+                        return false;
+                    }
+                    if ( prevIsPrimary == newIsPrimary )
+                    {
+                        if ( prevMapq < newMapq )
+                        {
+                            PrintAlignment();
+                            return false;
+                        }
+                    }
+                }
+            }
+            prevPos = newPos;
+            prevLen = newLen;
+            prevIsPrimary = newIsPrimary;
+            prevMapq = newMapq;
+        }
+        return true;
+    }
+
+    NGS_Alignment*      m_align;
+};
+
+// ReferenceWindow as an Alignment
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_NoAccessBeforeNext, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, false );
+
+    REQUIRE_NULL ( NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_AlignmentGetReferenceSpec ( m_align, ctx ) );
+    REQUIRE_FAILED ();
+    NGS_AlignmentGetMappingQuality ( m_align, ctx );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_AlignmentGetReadGroup ( m_align, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_AlignmentGetReadId ( m_align, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_AlignmentGetClippedFragmentBases ( m_align, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_AlignmentGetClippedFragmentQualities ( m_align, ctx ) );
+    REQUIRE_FAILED ();
+    NGS_AlignmentIsPrimary ( m_align, ctx );
+    REQUIRE_FAILED ();
+    NGS_AlignmentGetAlignmentPosition ( m_align, ctx );
+    REQUIRE_FAILED ();
+    NGS_AlignmentGetAlignmentLength ( m_align, ctx );
+    REQUIRE_FAILED ();
+    NGS_AlignmentGetIsReversedOrientation ( m_align, ctx );
+    REQUIRE_FAILED ();
+    NGS_AlignmentGetSoftClip ( m_align, ctx, true );
+    REQUIRE_FAILED ();
+    NGS_AlignmentGetTemplateLength ( m_align, ctx );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_AlignmentGetShortCigar ( m_align, ctx, true ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_AlignmentGetLongCigar ( m_align, ctx, true ) );
+    REQUIRE_FAILED ();
+    NGS_AlignmentIsFirst ( m_align, ctx );
+    REQUIRE_FAILED ();
+
+    REQUIRE ( ! NGS_AlignmentHasMate ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () ); /* HasMate does not throw */
+
+    REQUIRE_NULL ( NGS_AlignmentGetMateAlignmentId ( m_align, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_AlignmentGetMateAlignment ( m_align, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_AlignmentGetMateReferenceSpec ( m_align, ctx ) );
+    REQUIRE_FAILED ();
+    NGS_AlignmentGetMateIsReversedOrientation ( m_align, ctx );
+    REQUIRE_FAILED ();
+
+    // fragment functions
+    REQUIRE_NULL ( NGS_FragmentGetId ( (NGS_Fragment*)m_align, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_FragmentGetSequence ( (NGS_Fragment*)m_align, ctx, 2, 5 ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_FragmentGetQualities ( (NGS_Fragment*)m_align, ctx, 2, 5 ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_AccessAfterNext, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, false );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".PA.1", NGS_AlignmentGetAlignmentId ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( "supercont2.1", NGS_AlignmentGetReferenceSpec ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_EQ ( 60, NGS_AlignmentGetMappingQuality ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( "C1ELY.6", NGS_AlignmentGetReadGroup ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".R.1", NGS_AlignmentGetReadId ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( "ACTCGACATTCTGCCTTCGACCTATCTTTCTCCTCTCCCAGTCATCGCCCAGTAGAATTACCAGGCAATGAACCAGGGCCTTCCATCCCAACGGCACAGCA",
+                     NGS_AlignmentGetClippedFragmentBases ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( "@@CDDBDFFBFHFIEEFGIGGHIEHIGIGGFGEGAFDHIIIIIGGGDFHII;=BF at FEHGIEEH?AHHFHFFFFDC5'5=?CC?ADCD at AC??9BDDCDB<",
+                     NGS_AlignmentGetClippedFragmentQualities ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( NGS_AlignmentIsPrimary ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_EQ ( (int64_t)85, NGS_AlignmentGetAlignmentPosition ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_EQ ( (uint64_t)101, NGS_AlignmentGetAlignmentLength ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( ! NGS_AlignmentGetIsReversedOrientation ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_EQ ( (int)0, NGS_AlignmentGetSoftClip ( m_align, ctx, true ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_EQ ( (uint64_t)201, NGS_AlignmentGetTemplateLength ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( "101M", NGS_AlignmentGetShortCigar ( m_align, ctx, true ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( "13=1X61=1X6=1X18=", NGS_AlignmentGetLongCigar ( m_align, ctx, true ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( NGS_AlignmentHasMate ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".PA.2", NGS_AlignmentGetMateAlignmentId ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    NGS_Alignment * mate = NGS_AlignmentGetMateAlignment ( m_align, ctx );
+    REQUIRE_NOT_NULL ( mate );
+    REQUIRE ( ! FAILED () );
+    NGS_RefcountRelease ( NGS_AlignmentToRefcount ( mate ) , ctx );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( "supercont2.1", NGS_AlignmentGetMateReferenceSpec ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( NGS_AlignmentGetMateIsReversedOrientation ( m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    NGS_AlignmentIsFirst ( m_align, ctx );
+    REQUIRE ( ! FAILED () );
+
+    // fragment functions
+    REQUIRE_STRING ( string ( CSRA1_PrimaryOnly ) + ".FA0.1", NGS_FragmentGetId ( (NGS_Fragment*)m_align, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING (  "ACTCG",  NGS_FragmentGetSequence ( (NGS_Fragment*)m_align, ctx, 0, 5 ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( "@@CDD",  NGS_FragmentGetQualities ( (NGS_Fragment*)m_align, ctx, 0, 5 ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_align, ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+// Iteration over a ReferenceWindow
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Primary, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, false );
+
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".PA.1") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".PA.2") );
+    // etc
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Primary_Only, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, false );
+
+    // skip to where a secondary alignment which would show up, between primary alignments 34 and 35
+    SkipAlignments( 33 );
+
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".PA.34") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".PA.35") );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Secondary, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, false, true );
+
+
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.169") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.170") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.171") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.172") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.173") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.174") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.175") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.176") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.177") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.178") );
+
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_PrimaryAndSecondary, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, true );
+
+    // skip to where a secondary alignment is expected, between primary alignments 34 and 35
+    SkipAlignments( 33 );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".PA.34") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.169") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".PA.35") );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Sort, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, true );
+
+    // secondary 170 should go before primary 62
+    SkipAlignments( 61 ); /*skip over 60 primary and 1 secondary */
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".PA.61") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.170") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".PA.62") );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_FullPrimary_Order, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, false );
+    REQUIRE ( VerifyOrder() );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_FullSecondary_Order, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, false, true );
+    REQUIRE ( VerifyOrder() );
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_FullAll_Order, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, true );
+    REQUIRE ( VerifyOrder() );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Empty, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( "SRR960954", "gi|296100371|ref|NC_014121.1|" );
+
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, 0, 20000, false, false );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_OutOfBounds, CSRA1_Fixture)
+{
+    ENTRY_GET_REF( "SRR960954", "gi|296100371|ref|NC_014121.1|" );
+
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, NGS_ReferenceGetLength ( m_ref, ctx ), 1, true, true );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, 517000, 100000, true, true );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".PA.34") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".SA.169") );
+    REQUIRE ( NextId ( string ( CSRA1_WithSecondary ) + ".PA.35") );
+
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Order, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, 517000, 100000, true, true );
+    REQUIRE ( VerifyOrder() );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_NoSecondary, CSRA1_Fixture)
+{   // VDB-2658: exception when there is no REFERENCE.SECONDARY_ALIGNMENT_IDS column
+    const char* accesssion = "SRR644545";
+    ENTRY_GET_REF ( accesssion, "NC_000004.11" );
+
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, 0, 100000, true, true );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( NextId ( string ( accesssion ) + ".PA.1") );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Overlap_Primary, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_PrimaryOnly, "supercont2.1" );
+
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, 10000, 100, true, true );
+    REQUIRE ( ! FAILED () );
+
+    // 2 primary alignments start in the previous chunk and overlap with the chunk starting at 10000
+    REQUIRE ( NextId ( string ( CSRA1_PrimaryOnly ) + ".PA.96") );
+    REQUIRE ( NextId ( string ( CSRA1_PrimaryOnly ) + ".PA.97") );
+
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Overlap_Primary_Order, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_PrimaryOnly, "supercont2.1" );
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, 10000, 100, true, true );
+    REQUIRE ( VerifyOrder() );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Overlap_Secondary, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( "SRR960954", "gi|296100371|ref|NC_014121.1|" );
+
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, 4020000, 100, true, true );
+    REQUIRE ( ! FAILED () );
+
+    // a secondary alignment starts in the previous chunk and overlaps with the chunk starting at 4020000
+    REQUIRE ( NextId ( string ( "SRR960954.SA.1384") ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Overlap_PrimaryAndSecondary, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( "ERR225922", "2" );
+
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, 203895000, 100, true, true );
+    REQUIRE ( ! FAILED () );
+
+    // several primary and secondary alignments start in the previous chunk and overlap with the chunk starting at 203895000
+                                    // pos, len, mapq
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7023")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7024")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7025")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7026")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7028")    ) );    // 203894959, 76, 60 (higher MAPQ than 7027, same pos/len)
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7027")    ) );    // 203894959, 76, 60
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7029")    ) );    // 203894961, 76, 60 (same as 45681 but primary)
+    REQUIRE ( NextId ( string ( "ERR225922.SA.45681")   ) );   // 203894961, 76, 60 (same as 7029 but secondary; id=45521+160 )
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7030")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7031")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7032")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7033")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.SA.45682")   ) );   // (id=45,521+161)
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, m_ctx ) );
+
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Overlap_PrimaryAndSecondary_Cutoff, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( "ERR225922", "2" );
+
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, 203895050, 100, true, true ); // increase offset by 50 bases
+    REQUIRE ( ! FAILED () );
+
+    // compared to the test above, alignments that do not reach 50+ bases into the chunk are excluded
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7032")  ) );
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7033")  ) );
+    REQUIRE ( NextId ( string ( "ERR225922.SA.45682") ) ); // 45,521+161
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, m_ctx ) );
+
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Overlap_PrimaryAndSecondary_FullCutoff, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( "ERR225922", "2" );
+
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, 203895150, 100, true, true ); // increase offset to exclude all overlaps
+    REQUIRE ( ! FAILED () );
+
+    // none of the alignments reach 150+ bases into the chunk
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, m_ctx ) );
+
+    EXIT;
+}
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Filtered, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( "ERR225922", "2" );
+
+    const bool wants_primary = true;
+    const bool wants_secondary = true;
+#pragma message ( "filtering did not work prior to today's changes. I have set filter bits to allow this test to pass. the test should be fixed so that filters are set to the two desired flags." )
+    const uint32_t filters = NGS_AlignmentFilterBits_pass_bad | NGS_AlignmentFilterBits_pass_dups |
+        NGS_AlignmentFilterBits_no_wraparound | NGS_AlignmentFilterBits_start_within_window;
+    const int32_t no_map_qual = 0;
+
+    m_align = NGS_ReferenceGetFilteredAlignmentSlice ( m_ref, ctx, 203894961, 100, wants_primary, wants_secondary, filters, no_map_qual ); // only the ones that start within the window
+    REQUIRE ( ! FAILED () );
+
+    // only the alignments starting inside the slice (203894961)
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7029")    ) );    // 203894961, 76, 60 (same as 45681 but primary)
+    REQUIRE ( NextId ( string ( "ERR225922.SA.45681")   ) );   // 203894961, 76, 60 (same as 7029 but secondary; id=45521+160 )
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7030")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7031")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7032")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.PA.7033")    ) );
+    REQUIRE ( NextId ( string ( "ERR225922.SA.45682")   ) );   // (id=45,521+161)
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( m_align, m_ctx ) );
+
+    EXIT;
+}
+
+// FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Overlap_LookbackMoreThanOneChunk, CSRA1_Fixture)
+// FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Overlap_LookbackDiffersForPrimaryAndSecondary, CSRA1_Fixture)
+// FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Slice_Overlap_DefaultLookback, CSRA1_Fixture)
+
+// circular reference
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Circular, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithCircularReference, "chrM" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, true );
+    REQUIRE ( ! FAILED () );
+
+    // chrM is 16569 bases long          // pos, len, mapq
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511855081") );   // 16528, 42, 0   // last base 16528+42-1 = 16569 (mod 16569 = #0 in 0-based coord)
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511855600") );   // 16529, 41, 66
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511855598") );   // 16529, 41, 35
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511855595") );   // 16529, 41, 28
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511855597") );   // 16529, 41, 4
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511855596") );   // 16529, 41, 0
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511855599") );   // 16529, 41, 0
+
+    // ...
+
+    // TODO: make sure alignments do not reappear at the end of iteration!
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_Circular_Slice, CSRA1_Fixture)
+{
+    ENTRY_GET_REF ( CSRA1_WithCircularReference, "chrM" );
+
+    m_align = NGS_ReferenceGetAlignmentSlice ( m_ref, ctx, 1, 100, true, true );
+    REQUIRE ( ! FAILED () );
+                                         // pos, len, mapq
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511856243") );   // -39, 41, 56
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511856241") );   // -39, 41, 0
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511856242") );   // -39, 41, 0
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511857002") );   // -38, 40, 74
+    REQUIRE ( NextId ( string ( CSRA1_WithCircularReference ) + ".PA.4511857001") );   // -38, 40, 70
+
+    // ...
+
+    EXIT;
+}
+
+// NGS_ReferenceGetFilteredAlignmentSlice
+
+uint64_t SliceOffset = 5;
+uint64_t SliceLength = 100;
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetFilteredAlignmentSlice_Wraparound, CSRA1_Fixture )
+{   // wraparound alignments overlapping with a slice
+    ENTRY_GET_REF( CSRA1_WithCircularReference, "chrM" );
+
+    const bool wants_primary = true;
+    const bool wants_secondary = true;
+#pragma message ( "filtering did not work prior to today's changes. I have set filter bits to allow this test to pass. the test should be fixed so that filters are set to the two desired flags." )
+    const uint32_t no_filters = NGS_AlignmentFilterBits_pass_bad | NGS_AlignmentFilterBits_pass_dups;
+    const int32_t no_map_qual = 0;
+
+    m_align = NGS_ReferenceGetFilteredAlignmentSlice ( m_ref, ctx, SliceOffset, SliceLength, wants_primary, wants_secondary, no_filters, no_map_qual );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+
+    // the first returned alignment starts before the start of the circular reference, overlaps with slice
+    int64_t pos = NGS_AlignmentGetAlignmentPosition ( m_align, ctx );
+    REQUIRE_LT ( ( int64_t ) ( SliceOffset + SliceLength ), pos );
+
+    // check for overlap with the slice
+    uint64_t refLen = NGS_ReferenceGetLength ( m_ref, ctx );
+    pos -= ( int64_t ) refLen;
+    REQUIRE_GT ( ( int64_t ) 0, pos );
+    REQUIRE_GE ( pos + NGS_AlignmentGetAlignmentLength( m_align, ctx ), SliceOffset );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetFilteredAlignmentSlice_Wraparound_StartInWindow, CSRA1_Fixture )
+{   // when StartInWindow filter is specified, it removes wraparound alignments as well
+    ENTRY_GET_REF( CSRA1_WithCircularReference, "chrM" );
+
+    const bool wants_primary = true;
+    const bool wants_secondary = true;
+#pragma message ( "filtering did not work prior to today's changes. I have set filter bits to allow this test to pass. the test should be fixed so that filters are set to the two desired flags." )
+    const uint32_t filters = NGS_AlignmentFilterBits_pass_bad | NGS_AlignmentFilterBits_pass_dups |
+        NGS_AlignmentFilterBits_start_within_window;
+    const int32_t no_map_qual = 0;
+
+    m_align = NGS_ReferenceGetFilteredAlignmentSlice ( m_ref, ctx, SliceOffset, SliceLength, wants_primary, wants_secondary, filters, no_map_qual );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+
+    // the first returned alignment starts inside the slice
+    int64_t pos = NGS_AlignmentGetAlignmentPosition ( m_align, ctx );
+    REQUIRE_LE ( ( int64_t ) SliceOffset, pos );
+    REQUIRE_LT ( pos, ( int64_t ) ( SliceOffset + SliceLength ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetFilteredAlignmentSlice_NoWraparound, CSRA1_Fixture )
+{   // only removes wraparound alignments, not the ones starting before the slice
+    ENTRY_GET_REF( CSRA1_WithCircularReference, "chrM" );
+
+    const bool wants_primary = true;
+    const bool wants_secondary = true;
+#pragma message ( "filtering did not work prior to today's changes. I have set filter bits to allow this test to pass. the test should be fixed so that filters are set to the two desired flags." )
+    const uint32_t filters = NGS_AlignmentFilterBits_pass_bad | NGS_AlignmentFilterBits_pass_dups |
+        NGS_AlignmentFilterBits_no_wraparound;
+    const int32_t no_map_qual = 0;
+
+    m_align = NGS_ReferenceGetFilteredAlignmentSlice ( m_ref, ctx, SliceOffset, SliceLength, wants_primary, wants_secondary, filters, no_map_qual );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+
+    // the first returned alignment starts outside the slice but does not wrap around
+    REQUIRE_GT ( ( int64_t ) SliceOffset, NGS_AlignmentGetAlignmentPosition ( m_align, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceGetFilteredAlignmentSlice_NoWraparound_StartInWindow, CSRA1_Fixture )
+{   // when StartInWindow filter is specified, it removes wraparound alignments as well
+    ENTRY_GET_REF( CSRA1_WithCircularReference, "chrM" );
+
+    const bool wants_primary = true;
+    const bool wants_secondary = true;
+#pragma message ( "filtering did not work prior to today's changes. I have set filter bits to allow this test to pass. the test should be fixed so that filters are set to the two desired flags." )
+    const uint32_t filters = NGS_AlignmentFilterBits_pass_bad | NGS_AlignmentFilterBits_pass_dups |
+        NGS_AlignmentFilterBits_no_wraparound | NGS_AlignmentFilterBits_start_within_window;
+    const int32_t no_map_qual = 0;
+
+    m_align = NGS_ReferenceGetFilteredAlignmentSlice ( m_ref, ctx, SliceOffset, SliceLength, wants_primary, wants_secondary, filters, no_map_qual );
+    REQUIRE ( ! FAILED () && m_align );
+    REQUIRE ( NGS_AlignmentIteratorNext ( m_align, ctx ) );
+
+    // the first returned alignment starts inside the slice
+    int64_t pos = NGS_AlignmentGetAlignmentPosition ( m_align, ctx );
+    REQUIRE_LE ( ( int64_t ) SliceOffset, pos );
+    REQUIRE_LT ( pos, ( int64_t ) ( SliceOffset + SliceLength ) );
+
+    EXIT;
+}
+
+
+
+#if 0
+FIXTURE_TEST_CASE(CSRA1_NGS_ReferenceWindow_PrintEmAll_1, CSRA1_Fixture)
+{
+//    ENTRY_GET_REF ( "SRR960954" , "gi|296100371|ref|NC_014121.1|" );
+//    ENTRY_GET_REF ( "SRR822962" , "chr2" );
+//    ENTRY_GET_REF ( CSRA1_WithSecondary, "gi|169794206|ref|NC_010410.1|" );
+//    ENTRY_GET_REF ( CSRA1_PrimaryOnly, "supercont2.1" );
+    ENTRY_GET_REF ( CSRA1_WithCircularReference, "chrM" );
+
+    m_align = NGS_ReferenceGetAlignments ( m_ref, ctx, true, true );
+
+    uint64_t prevPos = 0;
+    uint64_t prevLen = 0;
+    bool     prevIsPrimary = true;
+    int      prevMapq = 0;
+    while ( NGS_AlignmentIteratorNext ( m_align, ctx ) )
+    {
+
+        uint64_t newPos = NGS_AlignmentGetAlignmentPosition ( m_align, m_ctx );
+        uint64_t newLen = NGS_AlignmentGetAlignmentLength ( m_align, m_ctx );
+        bool     newIsPrimary = NGS_AlignmentIsPrimary ( m_align, m_ctx );
+        int      newMapq = NGS_AlignmentGetMappingQuality( m_align, m_ctx );
+
+        PrintAlignment ();
+
+/*        REQUIRE_LE (prevPos, newPos);
+        if ( prevPos == newPos )
+        {
+            REQUIRE_GE ( prevLen, newLen );
+            if ( prevLen == newLen )
+            {
+                REQUIRE ( prevIsPrimary || ! newIsPrimary);
+                if ( prevIsPrimary == newIsPrimary )
+                {
+                    REQUIRE_GE ( prevMapq, newMapq );
+                }
+            }
+        }*/
+        prevPos = newPos;
+        prevLen = newLen;
+        prevIsPrimary = newIsPrimary;
+        prevMapq = newMapq;
+    }
+
+    EXIT;
+}
+#endif
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs_csra1_refwin";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t m_coll=NgsCsra1RefWinTestSuite(argc, argv);
+    return m_coll;
+}
+
+}
+
diff --git a/test/ngs/ngstest_fragmentblob.cpp b/test/ngs/ngstest_fragmentblob.cpp
new file mode 100644
index 0000000..54e9991
--- /dev/null
+++ b/test/ngs/ngstest_fragmentblob.cpp
@@ -0,0 +1,597 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for low-level NGS functions
+*/
+
+// suppress macro max from windows.h
+#define NOMINMAX
+
+#include "ngs_c_fixture.hpp"
+
+#include <NGS_Cursor.h>
+#include <SRA_Read.h>
+#include <NGS_FragmentBlob.h>
+#include <NGS_FragmentBlobIterator.h>
+
+#include <vdb/table.h>
+#include <vdb/database.h>
+
+#include <stdexcept>
+#include <cstring>
+#include <limits>
+#include <cmath>
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsFragmentBlobTestSuite);
+
+const char* SRA_Accession = "SRR000001";
+
+//////////////////////////////////////////// NGS_FragmentBlob
+
+class FragmentBlobFixture : public NGS_C_Fixture
+{
+public:
+    FragmentBlobFixture ()
+    :   m_tbl ( 0 ),
+        m_curs ( 0 ),
+        m_blob ( 0 )
+    {
+    }
+
+    void MakeBlob ( const char* acc, int64_t rowId )
+    {
+        if ( m_tbl != 0 )
+        {
+            VTableRelease ( m_tbl );
+        }
+        if ( VDBManagerOpenTableRead ( m_ctx -> rsrc -> vdb, & m_tbl, NULL, acc ) != 0 )
+        {
+            throw logic_error ("FragmentBlobFixture::MakeBlob VDBManagerOpenTableRead failed");
+        }
+        m_curs = NGS_CursorMake ( m_ctx, m_tbl, sequence_col_specs, seq_NUM_COLS );
+        if ( m_curs == 0 )
+        {
+            throw logic_error ("FragmentBlobFixture::MakeBlob NGS_CursorMake failed");
+        }
+        NGS_String* run = NGS_StringMake ( m_ctx, acc, string_size ( acc ) );
+        m_blob = NGS_FragmentBlobMake ( m_ctx, run, m_curs, rowId );
+        NGS_StringRelease ( run, m_ctx );
+        if ( m_blob == 0 )
+        {
+            throw logic_error ("FragmentBlobFixture::MakeBlob NGS_FragmentBlobMake failed");
+        }
+    }
+    virtual void Release()
+    {
+        if (m_ctx != 0)
+        {
+            if ( m_blob != 0 )
+            {
+                NGS_FragmentBlobRelease ( m_blob, m_ctx );
+            }
+            if ( m_curs != 0 )
+            {
+                NGS_CursorRelease ( m_curs, m_ctx );
+            }
+            if ( m_tbl != 0 )
+            {
+                VTableRelease ( m_tbl );
+            }
+        }
+        NGS_C_Fixture :: Release ();
+    }
+
+    const VTable* m_tbl;
+    const NGS_Cursor* m_curs;
+    struct NGS_FragmentBlob* m_blob;
+};
+
+TEST_CASE ( NGS_FragmentBlobMake_BadCursor)
+{
+    HYBRID_FUNC_ENTRY ( rcSRA, rcRow, rcAccessing );
+
+    NGS_String* run = NGS_StringMake ( ctx, "", 0 );
+    REQUIRE ( ! FAILED () );
+
+    struct NGS_FragmentBlob * blob = NGS_FragmentBlobMake ( ctx, run, NULL, 1 );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( blob );
+
+    NGS_StringRelease ( run, ctx );
+    REQUIRE ( ! FAILED () );
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobMake_NullRunName, FragmentBlobFixture )
+{
+    ENTRY;
+
+    REQUIRE_RC ( VDBManagerOpenTableRead ( m_ctx -> rsrc -> vdb, & m_tbl, NULL, SRA_Accession ) );
+    m_curs = NGS_CursorMake ( m_ctx, m_tbl, sequence_col_specs, seq_NUM_COLS );
+    REQUIRE_NOT_NULL ( m_curs );
+
+    struct NGS_FragmentBlob * blob = NGS_FragmentBlobMake ( ctx, NULL, m_curs, 1 );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( blob );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobMake_BadRowId, FragmentBlobFixture )
+{
+    ENTRY;
+    REQUIRE_RC ( VDBManagerOpenTableRead ( m_ctx -> rsrc -> vdb, & m_tbl, NULL, SRA_Accession ) );
+    m_curs = NGS_CursorMake ( m_ctx, m_tbl, sequence_col_specs, seq_NUM_COLS );
+    REQUIRE_NOT_NULL ( m_curs );
+    NGS_String* run = NGS_StringMake ( m_ctx, SRA_Accession, string_size ( SRA_Accession ) );
+
+    m_blob = NGS_FragmentBlobMake ( m_ctx, run, m_curs, -1 ); // bad row Id
+    REQUIRE_FAILED ();
+
+    NGS_StringRelease ( run, m_ctx );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlob_RowRange, FragmentBlobFixture )
+{
+    ENTRY;
+    MakeBlob ( SRA_Accession, 1 );
+
+    int64_t first = 0;
+    uint64_t count = 0;
+    NGS_FragmentBlobRowRange ( m_blob, m_ctx, & first, & count );
+    REQUIRE_EQ ( (int64_t)1, first );
+    REQUIRE_EQ ( (uint64_t)4, count );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobMake_DuplicateRelease, FragmentBlobFixture )
+{
+    ENTRY;
+    MakeBlob ( SRA_Accession, 1 );
+
+    // Duplicate
+    NGS_FragmentBlob* anotherBlob = NGS_FragmentBlobDuplicate ( m_blob, m_ctx );
+    REQUIRE_NOT_NULL ( anotherBlob );
+    // Release
+    NGS_FragmentBlobRelease ( anotherBlob, m_ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobMake_Data_BadArg, FragmentBlobFixture )
+{
+    ENTRY;
+
+    REQUIRE_NULL ( NGS_FragmentBlobData ( NULL, m_ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+FIXTURE_TEST_CASE ( NGS_FragmentBlobMake_Data, FragmentBlobFixture )
+{
+    ENTRY;
+    MakeBlob ( SRA_Accession, 1 );
+
+    const void* data = NGS_FragmentBlobData ( m_blob, m_ctx );
+    REQUIRE_NOT_NULL ( data );
+    REQUIRE_EQ ( string ( "TCAGAT" ), string ( (const char*)data, 6 ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobMake_Size_BadArg, FragmentBlobFixture )
+{
+    ENTRY;
+
+    NGS_FragmentBlobSize ( NULL, m_ctx );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+FIXTURE_TEST_CASE ( NGS_FragmentBlobMake_Size, FragmentBlobFixture )
+{
+    ENTRY;
+    MakeBlob ( SRA_Accession, 1 );
+
+    REQUIRE_EQ ( (uint64_t)1080, NGS_FragmentBlobSize ( m_blob, m_ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobMake_InfoByOffset_BadSelf, FragmentBlobFixture )
+{
+    ENTRY;
+
+    int64_t rowId;
+    uint64_t fragStart;
+    uint64_t baseCount;
+    int32_t bioNumber;
+    NGS_FragmentBlobInfoByOffset ( NULL, ctx, 0, & rowId, & fragStart, & baseCount, & bioNumber );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+// TODO: NULL for optional parameters
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobMake_InfoByOffset_Biological, FragmentBlobFixture )
+{
+    ENTRY;
+    MakeBlob ( SRA_Accession, 1 );
+
+    int64_t rowId;
+    uint64_t fragStart;
+    uint64_t baseCount;
+    int32_t bioNumber;
+    // offset 300 is in row 2 which starts at 284 and consists of 4 fragments:
+    // technical, start 284, len 4
+    // biological #0, start 288, len 115 <== expect to see this for offset 300
+    // technical, start 403, len 44
+    // biological #1, start 447, len 99
+    NGS_FragmentBlobInfoByOffset ( m_blob, ctx, 300, & rowId, & fragStart, & baseCount, & bioNumber );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_EQ ( (int64_t)2, rowId );
+    REQUIRE_EQ ( (uint64_t)288, fragStart );
+    REQUIRE_EQ ( (uint64_t)115, baseCount );
+    REQUIRE_EQ ( (int32_t)0, bioNumber );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobMake_InfoByOffset_Technical, FragmentBlobFixture )
+{
+    ENTRY;
+    MakeBlob ( SRA_Accession, 1 );
+
+    int64_t rowId;
+    uint64_t fragStart;
+    uint64_t baseCount;
+    int32_t bioNumber;
+    // offset 300 is in row 2 which starts at 284 and consists of 4 fragments:
+    // technical, start 284, len 4
+    // biological #0, start 288, len 115
+    // technical, start 403, len 44  <== expect to see this for offset 410
+    // biological #1, start 447, len 99
+    NGS_FragmentBlobInfoByOffset ( m_blob, ctx, 410, & rowId, & fragStart, & baseCount, & bioNumber );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_EQ ( (int64_t)2, rowId );
+    REQUIRE_EQ ( (uint64_t)403, fragStart );
+    REQUIRE_EQ ( (uint64_t)44, baseCount );
+    REQUIRE_EQ ( (int32_t)-1, bioNumber );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobMake_InfoByOffset_WithRepeat, FragmentBlobFixture )
+{   // VDB-3026, VDB-2809
+    ENTRY;
+
+    // In SRR341578.SEQUENCE, rows 197317 and 197318 have identical values in the READ column
+    // we test correct handling of the repeat count in the row map by providing an offset
+    // that points into the second of the two rows
+    const int64_t RepeatedRowId = 197318;
+    const uint64_t OffsetIntoRepeatedRowId = 8889;
+    const char* acc = "SRR341578";
+
+    const VDatabase *db;
+    REQUIRE_RC ( VDBManagerOpenDBRead ( m_ctx -> rsrc -> vdb, & db, NULL, acc ) );
+    REQUIRE_RC ( VDatabaseOpenTableRead ( db, & m_tbl, "SEQUENCE" ) );
+    REQUIRE_RC ( VDatabaseRelease ( db ) );
+
+    m_curs = NGS_CursorMake ( m_ctx, m_tbl, sequence_col_specs, seq_NUM_COLS );
+    REQUIRE_NOT_NULL ( m_curs );
+
+    // The blob-making code in vdb is very-very smart and decides on the size of the blob
+    // to create based on the access patterns.
+    // If we specify our rowId directly, we will get a one-row blob. We want
+    // more than one row so that repeat count is > 1. So, we walk from 1 up to our RepeatedRowId
+    // to make sure we got a bigger blob:
+    {
+        NGS_String* run = NGS_StringMake ( m_ctx, acc, string_size ( acc ) );
+        int64_t rowId = 1;
+        while ( ! FAILED () )
+        {
+            m_blob = NGS_FragmentBlobMake ( m_ctx, run, m_curs, rowId );
+            int64_t first = 0;
+            uint64_t count = 0;
+            NGS_FragmentBlobRowRange ( m_blob, m_ctx, & first, & count );
+            if ( first + (int64_t)count > RepeatedRowId )
+            {
+                break; // m_blob is what we need
+            }
+            NGS_FragmentBlobRelease ( m_blob, m_ctx );
+            rowId += count;
+        }
+        NGS_StringRelease ( run, m_ctx );
+    }
+
+    {   // verify access to the second of 2 repeated cells
+        int64_t rowId;
+        uint64_t fragStart;
+        uint64_t baseCount;
+        int32_t bioNumber;
+        NGS_FragmentBlobInfoByOffset ( m_blob, ctx, OffsetIntoRepeatedRowId, & rowId, & fragStart, & baseCount, & bioNumber );
+        REQUIRE ( ! FAILED () );
+        REQUIRE_EQ ( RepeatedRowId, rowId );
+        REQUIRE_EQ ( (uint64_t)8888, fragStart );
+        REQUIRE_EQ ( (uint64_t)101, baseCount );
+        REQUIRE_EQ ( (int32_t)0, bioNumber );
+    }
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlob_MakeFragmentId, FragmentBlobFixture )
+{
+    ENTRY;
+    MakeBlob ( SRA_Accession, 1 );
+
+    NGS_String* id = NGS_FragmentBlobMakeFragmentId ( m_blob, ctx, 2, 1 );
+    REQUIRE_EQ ( string ( SRA_Accession ) + ".FR1.2", string ( NGS_StringData ( id, ctx ), NGS_StringSize ( id, ctx ) ) );
+    NGS_StringRelease ( id, ctx );
+
+    EXIT;
+}
+
+//////////////////////////////////////////// NGS_FragmentBlobIterator
+
+class BlobIteratorFixture : public NGS_C_Fixture
+{
+public:
+    BlobIteratorFixture ()
+    :   m_tbl ( 0 ),
+        m_blobIt ( 0 )
+    {
+    }
+
+    void MakeSRA( const char* acc )
+    {
+        if ( m_tbl != 0 )
+            VTableRelease ( m_tbl );
+        if ( VDBManagerOpenTableRead ( m_ctx -> rsrc -> vdb, & m_tbl, NULL, acc ) != 0 )
+            throw logic_error ("BlobIteratorFixture::MakeSRA VDBManagerOpenTableRead failed");
+    }
+    void MakeIterator( const char* acc )
+    {
+        MakeSRA ( acc );
+        NGS_String* run = NGS_StringMake ( m_ctx, acc, string_size ( acc ) );
+        m_blobIt = NGS_FragmentBlobIteratorMake ( m_ctx, run, m_tbl );
+        NGS_StringRelease ( run, m_ctx );
+    }
+    virtual void Release()
+    {
+        if (m_ctx != 0)
+        {
+            if ( m_blobIt != 0 )
+            {
+                NGS_FragmentBlobIteratorRelease ( m_blobIt, m_ctx );
+            }
+            if ( m_tbl != 0 )
+            {
+                VTableRelease ( m_tbl );
+            }
+        }
+        NGS_C_Fixture :: Release ();
+    }
+
+    const VTable* m_tbl;
+    struct NGS_FragmentBlobIterator* m_blobIt;
+};
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobIterator_BadMake, BlobIteratorFixture )
+{
+    ENTRY;
+
+    NGS_String* run = NGS_StringMake ( m_ctx, "", 0 );
+    REQUIRE ( ! FAILED () );
+
+    struct NGS_FragmentBlobIterator* blobIt = NGS_FragmentBlobIteratorMake ( ctx, run, NULL );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( blobIt );
+    NGS_StringRelease ( run, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobIterator_CreateRelease, BlobIteratorFixture )
+{
+    ENTRY;
+    MakeSRA ( SRA_Accession );
+
+    NGS_String* run = NGS_StringMake ( m_ctx, SRA_Accession, string_size ( SRA_Accession ) );
+    REQUIRE ( ! FAILED () );
+    struct NGS_FragmentBlobIterator* blobIt = NGS_FragmentBlobIteratorMake ( m_ctx, run, m_tbl );
+    REQUIRE ( ! FAILED () );
+    NGS_StringRelease ( run, m_ctx );
+    REQUIRE_NOT_NULL ( blobIt );
+    REQUIRE ( ! FAILED () );
+    // Release
+    NGS_FragmentBlobIteratorRelease ( blobIt, m_ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobIterator_DuplicateRelease, BlobIteratorFixture )
+{
+    ENTRY;
+    MakeIterator ( SRA_Accession );
+
+    // Duplicate
+    struct NGS_FragmentBlobIterator* anotherBlobIt = NGS_FragmentBlobIteratorDuplicate ( m_blobIt, m_ctx );
+    REQUIRE_NOT_NULL ( anotherBlobIt );
+    // Release
+    NGS_FragmentBlobIteratorRelease ( anotherBlobIt, m_ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobIterator_Next, BlobIteratorFixture )
+{
+    ENTRY;
+    MakeIterator ( SRA_Accession );
+
+    struct NGS_FragmentBlob* blob = NGS_FragmentBlobIteratorNext ( m_blobIt, m_ctx );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( blob );
+    NGS_FragmentBlobRelease ( blob, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobIterator_HasMore, BlobIteratorFixture )
+{
+    ENTRY;
+    MakeIterator ( SRA_Accession );
+
+    REQUIRE ( NGS_FragmentBlobIteratorHasMore ( m_blobIt, m_ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    EXIT;
+}
+
+#if VDB_3075_has_been_fixed
+FIXTURE_TEST_CASE ( NGS_FragmentBlobIterator_FullScan, BlobIteratorFixture )
+{
+    ENTRY;
+    MakeIterator ( SRA_Accession );
+
+    uint32_t count = 0;
+    while ( NGS_FragmentBlobIteratorHasMore ( m_blobIt, m_ctx ) )
+    {
+        struct NGS_FragmentBlob* blob = NGS_FragmentBlobIteratorNext ( m_blobIt, m_ctx );
+        REQUIRE_NOT_NULL ( blob );
+        NGS_FragmentBlobRelease ( blob, ctx );
+        ++count;
+    }
+    REQUIRE_EQ ( (uint32_t)243, count);
+    REQUIRE_NULL ( NGS_FragmentBlobIteratorNext ( m_blobIt, m_ctx ) );
+
+    EXIT;
+}
+#endif
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobIterator_SparseTable, BlobIteratorFixture )
+{
+    ENTRY;
+    MakeIterator ( "./data/SparseFragmentBlobs" );
+    // only row 1 and 10 are present
+
+    REQUIRE ( NGS_FragmentBlobIteratorHasMore ( m_blobIt, m_ctx ) );
+    {
+        struct NGS_FragmentBlob* blob = NGS_FragmentBlobIteratorNext ( m_blobIt, m_ctx );
+        REQUIRE_NOT_NULL ( blob );
+        int64_t first = 0;
+        uint64_t count = 0;
+        NGS_FragmentBlobRowRange ( blob, m_ctx, & first, & count );
+        REQUIRE_EQ ( (int64_t)1, first );
+        REQUIRE_EQ ( (uint64_t)1, count );
+        NGS_FragmentBlobRelease ( blob, ctx );
+    }
+
+    REQUIRE ( NGS_FragmentBlobIteratorHasMore ( m_blobIt, m_ctx ) );
+    {
+        struct NGS_FragmentBlob* blob = NGS_FragmentBlobIteratorNext ( m_blobIt, m_ctx );
+        REQUIRE_NOT_NULL ( blob );
+        int64_t first = 0;
+        uint64_t count = 0;
+        NGS_FragmentBlobRowRange ( blob, m_ctx, & first, & count );
+        REQUIRE_EQ ( (int64_t)10, first );
+        REQUIRE_EQ ( (uint64_t)1, count );
+        NGS_FragmentBlobRelease ( blob, ctx );
+    }
+
+    REQUIRE ( ! NGS_FragmentBlobIteratorHasMore ( m_blobIt, m_ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE ( NGS_FragmentBlobIterator_IteratorRetreats, BlobIteratorFixture )
+{   // VDB-2809: NGS_FragmentBlobIterator returns overlapping blobs on CSRA1 accessions
+    ENTRY;
+    const char* acc = "SRR833251";
+    const VDatabase *db;
+    REQUIRE_RC ( VDBManagerOpenDBRead ( m_ctx -> rsrc -> vdb, & db, NULL, acc ) );
+    REQUIRE_RC ( VDatabaseOpenTableRead ( db, & m_tbl, "SEQUENCE" ) );
+    REQUIRE_RC ( VDatabaseRelease ( db ) );
+
+    NGS_String* run = NGS_StringMake ( m_ctx, acc, string_size ( acc ) );
+    m_blobIt = NGS_FragmentBlobIteratorMake ( m_ctx, run, m_tbl );
+    NGS_StringRelease ( run, m_ctx );
+
+    int64_t rowId = 1;
+    while (true)
+    {
+        struct NGS_FragmentBlob* blob = NGS_FragmentBlobIteratorNext ( m_blobIt, m_ctx );
+        if ( blob == 0 )
+        {
+            break;
+        }
+        int64_t first = 0;
+        uint64_t count = 0;
+        NGS_FragmentBlobRowRange ( blob, m_ctx, & first, & count );
+        REQUIRE_EQ ( rowId, first );
+        NGS_FragmentBlobRelease ( blob, ctx );
+        rowId = first + count;
+    }
+
+    EXIT;
+}
+
+//////////////////////////////////////////// Main
+
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t m_coll=NgsFragmentBlobTestSuite(argc, argv);
+    return m_coll;
+}
+
+}
+
diff --git a/test/ngs/ngstest_makedb.cpp b/test/ngs/ngstest_makedb.cpp
new file mode 100644
index 0000000..c7daf11
--- /dev/null
+++ b/test/ngs/ngstest_makedb.cpp
@@ -0,0 +1,196 @@
+// ===========================================================================
+//
+//                            PUBLIC DOMAIN NOTICE
+//               National Center for Biotechnology Information
+//
+//  This software/database is a "United States Government Work" under the
+//  terms of the United States Copyright Act.  It was written as part of
+//  the author's official duties as a United States Government employee and
+//  thus cannot be copyrighted.  This software/database is freely available
+//  to the public for use. The National Library of Medicine and the U.S.
+//  Government have not placed any restriction on its use or reproduction.
+//
+//  Although all reasonable efforts have been taken to ensure the accuracy
+//  and reliability of the software and data, the NLM and the U.S.
+//  Government do not and cannot warrant the performance or results that
+//  may be obtained by using this software or data. The NLM and the U.S.
+//  Government disclaim all warranties, express or implied, including
+//  warranties of performance, merchantability or fitness for any particular
+//  purpose.
+//
+//  Please cite the author in any work or product based on this material.
+//
+// ===========================================================================
+
+#include <vdb/manager.h> // VDBManager
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h> /* VSchemaRelease */
+#include <vdb/vdb-priv.h>
+
+#include <sra/sraschema.h> // VDBManagerMakeSRASchema
+
+#include <kdb/meta.h>
+#include <kdb/table.h>
+
+#include <klib/rc.h>
+
+#include <ktst/unit_test.hpp> // TEST_CASE
+
+#include <sysalloc.h>
+
+#include <sstream>
+#include <cstdlib>
+
+using namespace std;
+
+/*
+ * We will compile this test file first in read/write mode, create DB and
+ * run tests using libncbi-wvdb library; then use  the database(s) it created
+ * in other test suites
+ */
+
+TEST_SUITE( NgsMakeDbSuite )
+
+const string ScratchDir = "./";
+
+class VDB_Fixture
+{
+public:
+    VDB_Fixture()
+    : m_table ( 0 )
+    {
+        THROW_ON_RC ( KDirectoryNativeDir ( & m_wd ) );
+        THROW_ON_RC ( VDBManagerMakeUpdate ( & m_mgr, m_wd ) );
+    }
+    ~VDB_Fixture()
+    {
+        if ( m_table != 0 )
+        {
+            VTableRelease ( m_table );
+        }
+        VDBManagerRelease ( m_mgr );
+        KDirectoryRelease ( m_wd );
+    }
+
+    void RemoveDatabase()
+    {
+        if ( ! m_tableName . empty () )
+        {
+            KDirectoryRemove ( m_wd, true, m_tableName . c_str () );
+        }
+    }
+
+    VCursor* MakeCursor()
+    {
+        const string schemaText =
+            "typedef ascii INSDC:dna:text;\n"
+            "typedef U32 INSDC:coord:len;\n"
+            "typedef U8 INSDC:SRA:xread_type;\n"
+            "table SEQUENCE #1\n"
+            "{\n"
+            "    column INSDC:dna:text READ;\n"
+            "    column INSDC:coord:len READ_LEN;\n"
+            "    column INSDC:SRA:xread_type READ_TYPE;\n"
+            "};\n"
+        ;
+        const char * schemaSpec = "SEQUENCE";
+
+        // make table
+        VSchema* schema;
+        THROW_ON_RC ( VDBManagerMakeSchema ( m_mgr, & schema ) );
+        THROW_ON_RC ( VSchemaParseText(schema, NULL, schemaText . c_str(), schemaText . size () ) );
+
+        THROW_ON_RC ( VDBManagerCreateTable ( m_mgr,
+                                              & m_table,
+                                              schema,
+                                              schemaSpec,
+                                              kcmInit + kcmMD5,
+                                              "%s",
+                                              m_tableName . c_str () ) );
+        THROW_ON_RC ( VSchemaRelease ( schema ) );
+
+        // make cursor
+        VCursor* ret;
+        THROW_ON_RC ( VTableCreateCursorWrite ( m_table, & ret, kcmInsert ) );
+
+        THROW_ON_RC ( VCursorAddColumn ( ret, & read_colIdx, "READ" ) );
+        THROW_ON_RC ( VCursorAddColumn ( ret, & read_len_colIdx, "READ_LEN" ) );
+        THROW_ON_RC ( VCursorAddColumn ( ret, & read_type_colIdx, "READ_TYPE" ) ); // 1 = biological
+
+        return ret;
+    }
+
+    void AddRow( VCursor* p_cursor, int64_t p_rowId, const string& p_read )
+    {
+        THROW_ON_RC ( VCursorSetRowId ( p_cursor, p_rowId ) );
+        THROW_ON_RC ( VCursorOpenRow ( p_cursor ) );
+        THROW_ON_RC ( VCursorWrite ( p_cursor, read_colIdx, 8, p_read.c_str(), 0, p_read.size() ) );
+        uint32_t u32=p_read.size();
+        THROW_ON_RC ( VCursorWrite ( p_cursor, read_len_colIdx, 32, &u32, 0, 1 ) );
+        uint8_t u8=1;
+        THROW_ON_RC ( VCursorWrite ( p_cursor, read_type_colIdx, 8, &u8, 0, 1 ) );
+        THROW_ON_RC ( VCursorCommitRow ( p_cursor ) );
+        THROW_ON_RC ( VCursorCloseRow ( p_cursor ) );
+        THROW_ON_RC ( VCursorFlushPage ( p_cursor ) );
+    }
+
+    KDirectory* m_wd;
+
+    VDBManager* m_mgr;
+    string m_tableName;
+
+    VTable* m_table;
+
+    uint32_t read_colIdx;
+    uint32_t read_len_colIdx;
+    uint32_t read_type_colIdx;
+};
+
+FIXTURE_TEST_CASE ( SparseFragmentBlobs, VDB_Fixture)
+{
+    RemoveDatabase();
+    m_tableName = ScratchDir + GetName();
+    VCursor* cursor = MakeCursor();
+
+    REQUIRE_RC ( VCursorOpen ( cursor ) );
+
+    // add rows, with sufficient gaps in between to create NULL blobs
+    AddRow ( cursor, 1, "ACGT" );
+    AddRow ( cursor, 10, "AACGT" );
+
+    REQUIRE_RC ( VCursorCommit ( cursor ) );
+    REQUIRE_RC ( VCursorRelease ( cursor ) );
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "ngs-make-db";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=NgsMakeDbSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/ngs/ngstest_reference.cpp b/test/ngs/ngstest_reference.cpp
new file mode 100644
index 0000000..54dfa00
--- /dev/null
+++ b/test/ngs/ngstest_reference.cpp
@@ -0,0 +1,158 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS C interface, reference accessions
+*/
+
+#include "ngs_c_fixture.hpp"
+
+#include <string.h>
+
+#include <ktst/unit_test.hpp>
+
+#include <kfc/xc.h>
+
+#include "NGS_ReferenceSequence.h"
+#include "NGS_String.h"
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsReferenceTestSuite);
+
+FIXTURE_TEST_CASE(SRA_Reference_Open, NGS_C_Fixture)
+{
+    ENTRY;
+    const char* SRA_Reference = "NC_000001.10";
+    NGS_ReferenceSequence * ref = NGS_ReferenceSequenceMake ( ctx, SRA_Reference );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( ref );
+    NGS_ReferenceSequenceRelease ( ref, ctx );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_Reference_Open_FailsOnNonReference, NGS_C_Fixture)
+{
+    ENTRY;
+    const char* SRA_Accession = "SRR000001";
+    REQUIRE_NULL ( NGS_ReferenceSequenceMake ( ctx, SRA_Accession ) );
+    REQUIRE ( ctx_xc_isa ( ctx, xcTableOpenFailed )  );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(EBI_Reference_Open_EBI_MD5, NGS_C_Fixture)
+{
+/* The following request should success it order to this test to work:
+http://www.ebi.ac.uk/ena/cram/md5/ffd6aeffb54ade3d28ec7644afada2e9
+Otherwise CALL_TO_EBI_RESOLVER_FAILS is set
+and this test is expected to fail */
+    const bool CALL_TO_EBI_RESOLVER_FAILS = false;
+
+    ENTRY;
+    const char* EBI_Accession = "ffd6aeffb54ade3d28ec7644afada2e9";
+
+    if ( CALL_TO_EBI_RESOLVER_FAILS ) {
+    }
+
+    NGS_ReferenceSequence * ref = NGS_ReferenceSequenceMake ( ctx, EBI_Accession );
+
+    if ( CALL_TO_EBI_RESOLVER_FAILS ) {
+        REQUIRE ( FAILED () );
+        REQUIRE_NULL ( ref );
+        LOG(ncbi::NK::LogLevel::e_error,
+            "CANNOT TEST EBI ACCESSION BECAUSE THEIR SITE DOES NOT RESPOND!\n");
+        LOG(ncbi::NK::LogLevel::e_error, "NOW EXPECTING AN ERROR MESSAGE ...");
+        return;
+    }
+
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( ref );
+
+    NGS_String* bases = NGS_ReferenceSequenceGetBases ( ref, ctx, 4, 16 );
+
+    REQUIRE ( strcmp (NGS_StringData ( bases, ctx ), "CTTTCTGACCGAAATT") == 0 );
+
+    REQUIRE_EQ ( NGS_ReferenceSequenceGetLength(ref, ctx), (uint64_t)784333 );
+
+    // to suppress the warning of unused function - call toString
+    toString ( bases, ctx );
+
+    NGS_StringRelease ( bases, ctx );
+    NGS_ReferenceSequenceRelease ( ref, ctx );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(EBI_Reference_Open_EBI_ACC, NGS_C_Fixture)
+{
+    ENTRY;
+    const char* EBI_Accession = "U12345.1";
+    NGS_ReferenceSequence * ref = NGS_ReferenceSequenceMake ( ctx, EBI_Accession );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( ref );
+
+    NGS_String* bases = NGS_ReferenceSequenceGetBases ( ref, ctx, 4, 16 );
+    REQUIRE ( strcmp (NGS_StringData ( bases, ctx ), "CCGCTATCAATATACT") == 0 );
+
+    REQUIRE_EQ ( NGS_ReferenceSequenceGetLength(ref, ctx), (uint64_t)426 );
+
+    NGS_StringRelease ( bases, ctx );
+    NGS_ReferenceSequenceRelease ( ref, ctx );
+    EXIT;
+}
+
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs_sra";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t m_coll=NgsReferenceTestSuite(argc, argv);
+    return m_coll;
+}
+
+}
+
diff --git a/test/ngs/ngstest_sra.cpp b/test/ngs/ngstest_sra.cpp
new file mode 100644
index 0000000..f8371f4
--- /dev/null
+++ b/test/ngs/ngstest_sra.cpp
@@ -0,0 +1,1071 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS C interface, SRA archives
+*/
+
+#include <klib/debug.h> // KDbgSetString
+
+#include "ngs_c_fixture.hpp"
+#include <ktst/unit_test.hpp>
+
+#include "NGS_ReadCollection.h"
+#include "NGS_FragmentBlobIterator.h"
+#include "NGS_FragmentBlob.h"
+
+#include <kdb/manager.h>
+
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+
+#include <klib/printf.h>
+
+#include <limits.h>
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsSraTestSuite);
+
+const char* SRA_Accession = "SRR000001";
+const char* SRA_Accession_WithReadGroups = "SRR006061";
+uint64_t SRA_Accession_ReadCount = 470985;
+
+class SRA_Fixture : public NGS_C_Fixture { };
+
+// SRA_ReadCollection
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_Open, SRA_Fixture)
+{
+    ENTRY;
+    m_coll = NGS_ReadCollectionMake ( ctx, SRA_Accession );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( m_coll );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_Open_FailsOnReference, SRA_Fixture)
+{
+    ENTRY;
+    const char* SRA_Reference = "NC_000001.10";
+    REQUIRE_NULL ( NGS_ReadCollectionMake ( ctx, SRA_Reference ) );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReadCount, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    REQUIRE_EQ ( SRA_Accession_ReadCount, NGS_ReadCollectionGetReadCount ( m_coll, ctx, true, true, true ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetRead, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    m_read = NGS_ReadCollectionGetRead ( m_coll, ctx, ReadId ( 1 ) . c_str () );
+    REQUIRE_NOT_NULL ( m_read );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReads_All, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+    REQUIRE_NOT_NULL ( m_read );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReads_Filtered_Aligned, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, false);
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReads_Filtered_Unaligned, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, false, false, true);
+    REQUIRE ( ! FAILED () && m_read );
+    uint64_t count = 0;
+    while ( NGS_ReadIteratorNext ( m_read, ctx ) )
+    {
+        REQUIRE ( NGS_ReadGetReadCategory ( m_read, ctx ) == NGS_ReadCategory_unaligned && ! FAILED () );
+        ++count;
+    }
+    REQUIRE_EQ ( SRA_Accession_ReadCount, count );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetReadRange, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 2, 3, true, true, true );
+    REQUIRE_NOT_NULL ( m_read );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetName, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    REQUIRE_STRING ( SRA_Accession, NGS_ReadCollectionGetName ( m_coll, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetReferences, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    NGS_Reference * ref = NGS_ReadCollectionGetReferences ( m_coll, ctx );
+    REQUIRE ( ! FAILED () && ref );
+
+    REQUIRE_NULL ( NGS_ReferenceGetCommonName ( ref, ctx ) );
+    REQUIRE_FAILED();
+
+    REQUIRE ( ! NGS_ReferenceIteratorNext ( ref, ctx ) );
+
+    NGS_ReferenceRelease ( ref, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetReference, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    REQUIRE_NULL ( NGS_ReadCollectionGetReference ( m_coll, ctx, "wont find me anyways" ) );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetAlignments, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    NGS_Alignment * align = NGS_ReadCollectionGetAlignments ( m_coll, ctx, true, true );
+    REQUIRE ( ! FAILED () && align );
+
+    REQUIRE_NULL ( NGS_AlignmentGetReferenceSpec ( align, ctx ) );
+    REQUIRE_FAILED ();
+
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( align, ctx ) );
+
+    NGS_AlignmentRelease ( align, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetAlignment, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    REQUIRE_NULL ( NGS_ReadCollectionGetAlignment ( m_coll, ctx, ReadId ( 1 ) . c_str () ) );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetAlignmentCount, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    REQUIRE_EQ ( (uint64_t)0, NGS_ReadCollectionGetAlignmentCount ( m_coll, ctx, true, true ) );
+    EXIT;
+}
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetAlignmentRange, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    NGS_Alignment * align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 1, 2, true, true );
+    REQUIRE ( ! FAILED () && align );
+
+    REQUIRE_NULL ( NGS_AlignmentGetReferenceSpec ( align, ctx ) );
+    REQUIRE_FAILED ();
+
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( align, ctx ) );
+
+    NGS_AlignmentRelease ( align, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetReadGroups_NoGroups, SRA_Fixture)
+{   // in some SRA archives, a single read group including the whole run
+    ENTRY_ACC(SRA_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+    REQUIRE ( ! FAILED () && m_readGroup );
+
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( ! NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetReadGroups_WithGroups, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+    REQUIRE ( ! FAILED () && m_readGroup );
+
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+
+    // etc
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetReadGroup_NotFound, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    REQUIRE_NULL ( NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "wontfindme" ) );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetReadGroup_NoGroups_DefaultFound_ByEmptyString, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "" );
+    REQUIRE_NOT_NULL ( m_readGroup );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetReadGroup_WithGroups_DefaultFound, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "" );
+    REQUIRE_NOT_NULL ( m_readGroup );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetReadGroup_WithGroups_Found, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "S77_V2");
+    REQUIRE_NOT_NULL ( m_readGroup );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionHasReadGroup_NotFound, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    REQUIRE ( ! NGS_ReadCollectionHasReadGroup ( m_coll, ctx, "wontfindme" ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionHasReadGroup_NoGroups_DefaultFound_ByEmptyString, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    REQUIRE ( NGS_ReadCollectionHasReadGroup ( m_coll, ctx, "" ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionHasReadGroup_WithGroups_DefaultFound, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+    REQUIRE ( NGS_ReadCollectionHasReadGroup ( m_coll, ctx, "" ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionHasReadGroup_WithGroups_Found, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+    REQUIRE ( NGS_ReadCollectionHasReadGroup ( m_coll, ctx, "S77_V2") );
+    EXIT;
+}
+
+// NGS_Read
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadGetReadName, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    REQUIRE_STRING ( "EM7LVYS02FOYNU", NGS_ReadGetReadName ( m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadGetReadId, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    REQUIRE_STRING ( ReadId ( 1 ), NGS_ReadGetReadId ( m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadGetReadGroup_Default, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    REQUIRE_STRING ( "", NGS_ReadGetReadGroup ( m_read, ctx ));
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadGetReadGroup, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession_WithReadGroups, 1);
+    REQUIRE_STRING ( "S103_V2", NGS_ReadGetReadGroup ( m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadGetReadCategory, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+
+    enum NGS_ReadCategory cat = NGS_ReadGetReadCategory ( m_read, ctx );
+    REQUIRE_EQ ( NGS_ReadCategory_unaligned, cat );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadGetReadSequence_Full, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+
+    string expected (
+        "TCAGATTCTCCTAGCCTACATCCGTACGAGTTAGCGTGGGATTACGAGGTGCACACCATTTCATTCCGTACGGGTAAATT"
+        "TTTGTATTTTTAGCAGACGGCAGGGTTTCACCATGGTTGACCAACGTACTAATCTTGAACTCCTGACCTCAAGTGATTTG"
+        "CCTGCCTTCAGCCTCCCAAAGTGACTGGGTATTACAGATGTGAGCGAGTTTGTGCCCAAGCCTTATAAGTAAATTTATAA"
+        "ATTTACATAATTTAAATGACTTATGCTTAGCGAAATAGGGTAAG");
+    REQUIRE_STRING ( expected, NGS_ReadGetReadSequence ( m_read, ctx, 0, (size_t)-1 ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadGetReadSequence_PartialNoLength, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    string expected ("TGAGCGAGTTTGTGCCCAAGCCTTATAAGTAAATTTATAAATTTACATAATTTAAATGACTTATGCTTAGCGAAATAGGGTAAG" );
+    REQUIRE_STRING ( expected,  NGS_ReadGetReadSequence ( m_read, ctx, 200, (size_t)-1 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadGetReadSequence_PartialLength, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    string expected ("TGAGCGAGTT");
+    REQUIRE_STRING ( expected, NGS_ReadGetReadSequence ( m_read, ctx, 200, 10 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadGetReadQualities_Full, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+
+    string expected (
+        "=<8<85)9=9/3-8?68<7=8<3657747==49==+;FB2;A;5:'*>69<:74)9.;C?+;<B<B;(<';FA/;C>*GC"
+        "8/%9<=GC8.#=2:5:16D==<EA2EA.;5=44<;2C=5;@73&<<2;5;6+9<?776+:24'26:7,<9A;=:;0C>*6"
+        "?7<<C=D=<52?:9CA2CA23<2<;3CA12:A<9414<7<<6;99<2/=9#<;9B at 27.;=6>:77>:1<A>+CA138?<"
+        ")C at 2166:A<B?->:%<<9<;33<;6?9;<;4=:%<$CA1+1%1");
+    REQUIRE_STRING ( expected, NGS_ReadGetReadQualities ( m_read, ctx, 0, (size_t)-1 ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadGetReadQualities_PartialNoLength, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    string expected ( "<6;99<2/=9#<;9B at 27.;=6>:77>:1<A>+CA138?<)C at 2166:A<B?->:%<<9<;33<;6?9;<;4=:%<$CA1+1%1" );
+    REQUIRE_STRING ( expected, NGS_ReadGetReadQualities ( m_read, ctx, 200, (size_t)-1 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadGetReadQualities_PartialLength, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    REQUIRE_STRING ( "<6;99<2/=9", NGS_ReadGetReadQualities ( m_read, ctx, 200, 10 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadNumFragments, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    uint32_t num = NGS_ReadNumFragments ( m_read, ctx );
+    REQUIRE_EQ ( (uint32_t)1, num ); // VDB-3132: only count non-empty fragments
+    EXIT;
+}
+
+// NGS_Fragment (through an NGS_Read object)
+FIXTURE_TEST_CASE(SRA_NGS_NoFragmentBeforeNext, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetRead ( m_coll, ctx, ReadId ( 1 ) . c_str () );
+
+    // no access to a Fragment before a call to NGS_FragmentIteratorNext
+    REQUIRE_NULL ( NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 0, 1 ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_FragmentGetQualities ( (NGS_Fragment*)m_read, ctx, 0, 1 ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_FragmentGetId, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    REQUIRE_STRING ( string( SRA_Accession ) + ".FR0.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_FragmentGetSequence_Full, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    string expected =
+        "ATTCTCCTAGCCTACATCCGTACGAGTTAGCGTGGGATTACGAGGTGCACACCATTTCATTCCGTACGGGTAAATTTTTG"
+        "TATTTTTAGCAGACGGCAGGGTTTCACCATGGTTGACCAACGTACTAATCTTGAACTCCTGACCTCAAGTGATTTGCCTG"
+        "CCTTCAGCCTCCCAAAGTGACTGGGTATTACAGATGTGAGCGAGTTTGTGCCCAAGCCTTATAAGTAAATTTAT"
+        "AAATTTACATAATTTAAATGACTTATGCTTAGCGAAATAGGGTAAG";
+    REQUIRE_STRING ( expected, NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 0, (size_t)-1 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_FragmentGetSequence_PartialNoLength, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    REQUIRE_STRING (
+        "TATTTTTAGCAGACGGCAGGGTTTCACCATGGTTGACCAACGTACTAATCTTGAACTCCTGACCTCAAGTGATTTGCCTG"
+        "CCTTCAGCCTCCCAAAGTGACTGGGTATTACAGATGTGAGCGAGTTTGTGCCCAAGCCTTATAAGTAAATTTAT"
+        "AAATTTACATAATTTAAATGACTTATGCTTAGCGAAATAGGGTAAG",
+        NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 80, (size_t)-1 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_FragmentGetSequence_PartialLength, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    REQUIRE_STRING ( "TATT",  NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 80, 4 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_FragmentGetQualities_Full, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);
+    string expected =
+        "85)9=9/3-8?68<7=8<3657747==49==+;FB2;A;5:'*>69<:74)9.;C?+;<B<B;(<';FA/;C>*GC8/%9"
+        "<=GC8.#=2:5:16D==<EA2EA.;5=44<;2C=5;@73&<<2;5;6+9<?776+:24'26:7,<9A;=:;0C>*6?7<<"
+        "C=D=<52?:9CA2CA23<2<;3CA12:A<9414<7<<6;99<2/=9#<;9B at 27.;=6>:77>:1<A>+CA138?<)C at 2"
+        "166:A<B?->:%<<9<;33<;6?9;<;4=:%<$CA1+1%1";
+    REQUIRE_STRING ( expected,  NGS_FragmentGetQualities ( (NGS_Fragment*)m_read, ctx, 0, (size_t)-1 ) );
+    EXIT;
+}
+
+// Iteration over Fragments
+FIXTURE_TEST_CASE(SRA_NGS_FragmentIteratorNext, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 2); // calls NGS_FragmentIteratorNext
+
+    REQUIRE_STRING ( string ( SRA_Accession ) + ".FR0.2", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+    REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( string ( SRA_Accession ) + ".FR1.2", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_FragmentIteratorNext_SkipEmpty, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1); // calls NGS_FragmentIteratorNext
+
+    REQUIRE_STRING ( string ( SRA_Accession ) + ".FR0.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+    // VDB-3132: skip empty FR1.1
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_FragmentIterator_NullRead, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, false ); // will return an empty iterator
+    REQUIRE ( ! FAILED () );
+
+    NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 0, 1 ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_FragmentGetQualities ( (NGS_Fragment*)m_read, ctx, 0, 1 ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_FragmentIteratorNext_BeyondEnd, SRA_Fixture)
+{
+    ENTRY_GET_READ(SRA_Accession, 1);  // calls NGS_FragmentIteratorNext
+    // row 1 contains only 1 non-empty bio fragment
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    // no access through the iterator after the end
+    NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 0, 1 ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_FragmentGetQualities ( (NGS_Fragment*)m_read, ctx, 0, 1 ) );
+    REQUIRE_FAILED ();
+
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+
+    EXIT;
+}
+
+// Iteration over Reads
+FIXTURE_TEST_CASE(SRA_ReadIterator_NoReadBeforeNext, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+    REQUIRE ( ! FAILED () && m_read );
+    // no access to a Read before a call to NGS_FragmentIteratorNext
+    REQUIRE_NULL ( NGS_ReadGetReadId ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_ReadGetReadName ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_ReadGetReadId ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_ReadGetReadGroup ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+    NGS_ReadGetReadCategory ( m_read, ctx );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_ReadGetReadSequence ( m_read, ctx, 0, 1 ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_ReadGetReadQualities ( m_read, ctx, 0, 1 ) );
+    REQUIRE_FAILED ();
+    NGS_ReadNumFragments ( m_read, ctx );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReads_Next, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    // on the first m_read
+    REQUIRE_STRING ( ReadId ( 1 ),  NGS_ReadGetReadId ( m_read, ctx ) );
+
+    {   // iterate over fragments
+        REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) ); // position on the first fragment
+        REQUIRE ( ! FAILED () );
+
+        REQUIRE_STRING ( string ( SRA_Accession ) + ".FR0.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+        // the second bio read is empty and not reported
+        REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+        REQUIRE ( ! FAILED () );
+    }
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+    // on the second m_read
+    REQUIRE_STRING ( ReadId ( 2 ),  NGS_ReadGetReadId ( m_read, ctx ) );
+
+    {   // iterate over fragments
+        REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) ); // position on the first fragment
+        REQUIRE ( ! FAILED () );
+
+        REQUIRE_STRING ( string ( SRA_Accession ) + ".FR0.2", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+        REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+        REQUIRE ( ! FAILED () );
+
+        REQUIRE_STRING ( string ( SRA_Accession ) + ".FR1.2", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+        REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+        REQUIRE ( ! FAILED () );
+    }
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReads_None, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, false );
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_GetReadsIteratorNext_BeyondEnd, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, false ); // empty
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    // no access through the iterator after the end
+    REQUIRE_NULL ( NGS_ReadGetReadId ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_ReadGetReadName ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_ReadGetReadId ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_ReadGetReadGroup ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+    NGS_ReadGetReadCategory ( m_read, ctx );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_ReadGetReadSequence ( m_read, ctx, 0, 1 ) );
+    REQUIRE_FAILED ();
+    REQUIRE_NULL ( NGS_ReadGetReadQualities ( m_read, ctx, 0, 1 ) );
+    REQUIRE_FAILED ();
+    NGS_ReadNumFragments ( m_read, ctx );
+    REQUIRE_FAILED ();
+
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_NGS_ReadIteratorGetCount, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+
+    REQUIRE_EQ( SRA_Accession_ReadCount, NGS_ReadIteratorGetCount ( m_read, ctx ) );
+    // read count does not change after Next()
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE_EQ( SRA_Accession_ReadCount, NGS_ReadIteratorGetCount ( m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReads_NumFragments, SRA_Fixture)
+{    // bug report: NumFreagment increases with each call to NGS_ReadIteratorNext
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) ); // skip row 1 which has only 1 non-empty bio fragment
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    REQUIRE_STRING ( ReadId ( 2 ),  NGS_ReadGetReadId ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_EQ ( (uint32_t)2, NGS_ReadNumFragments ( m_read, ctx ) );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_EQ ( (uint32_t)2, NGS_ReadNumFragments ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    EXIT;
+}
+
+// Iteration over a range of Reads
+FIXTURE_TEST_CASE(SRA_ReadRange_NoReadBeforeNext, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 3, 2, true, true, true );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( m_read );
+    // no access to a Read before a call to NGS_FragmentIteratorNext
+    REQUIRE_NULL ( NGS_ReadGetReadId ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReadRange, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 3, 2, true, true, true );
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( ReadId ( 3 ),  NGS_ReadGetReadId ( m_read, ctx ) );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( ReadId ( 4 ),  NGS_ReadGetReadId ( m_read, ctx ) );
+
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReadRange_Empty, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 6000000, 2, true, true, true );
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+FIXTURE_TEST_CASE(SRA_ReadCollection_GetReadRange_Filtered, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 1, 200000, true, true, false);
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+// ReadGroup
+
+FIXTURE_TEST_CASE(SRA_ReadGroupGetName_Default, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "" );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( "", NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+
+    EXIT;
+}
+
+#if READ_GROUP_SUPPORTS_READS
+FIXTURE_TEST_CASE(SRA_ReadGroupGetReads_NoGroups, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "" );
+
+    m_read = NGS_ReadGroupGetReads ( m_readGroup, ctx, true, true, true );
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( ReadId ( 1 ),  NGS_ReadGetReadId ( m_read, ctx ) );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( ReadId ( 2 ),  NGS_ReadGetReadId ( m_read, ctx ) );
+
+    EXIT;
+}
+#endif
+
+#if READ_GROUP_SUPPORTS_READS
+FIXTURE_TEST_CASE(SRA_ReadGroupGetReads_WithGroups, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "S77_V2" );
+    REQUIRE ( ! FAILED () );
+
+    m_read = NGS_ReadGroupGetReads ( m_readGroup, ctx, true, true, true );
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( ReadId ( 29 ),  NGS_ReadGetReadId ( m_read, ctx ) );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( ReadId ( 30 ),  NGS_ReadGetReadId ( m_read, ctx ) );
+    // etc
+
+    EXIT;
+}
+#endif
+
+#if READ_GROUP_SUPPORTS_READS
+FIXTURE_TEST_CASE(SRA_ReadGroupGetReads_Filtered, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "" );
+
+    m_read = NGS_ReadGroupGetReads ( m_readGroup, ctx, true, true, false ); // no unaligned
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) ); // no reads
+
+    EXIT;
+}
+#endif
+
+#if READ_GROUP_SUPPORTS_READS
+FIXTURE_TEST_CASE(SRA_ReadGroupGetRead, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "" );
+
+    m_read = NGS_ReadGroupGetRead ( m_readGroup, ctx, ReadId ( 1 ) . c_str () );
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE_STRING ( ReadId ( 1 ),  NGS_ReadGetReadId ( m_read, ctx ) );
+
+    EXIT;
+}
+#endif
+
+#if READ_GROUP_SUPPORTS_READS
+FIXTURE_TEST_CASE(SRA_ReadGroupGetRead_WrongReadGroup, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "S77_V2" ); // reads 29 through 125
+
+    REQUIRE_NULL ( NGS_ReadGroupGetRead ( m_readGroup, ctx, ReadId ( 126 ) . c_str () ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+#endif
+
+FIXTURE_TEST_CASE(SRA_ReadGroupGetStatistics_default, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "" );
+    REQUIRE ( ! FAILED () );
+    NGS_Statistics * stats = NGS_ReadGroupGetStatistics ( m_readGroup, ctx );
+    REQUIRE ( ! FAILED () && stats );
+
+	NGS_StatisticsRelease ( stats, ctx );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadGroupGetStatistics_named, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "S77_V2" ); // reads 29 through 125
+    REQUIRE ( ! FAILED () && m_readGroup );
+    NGS_Statistics * stats = NGS_ReadGroupGetStatistics ( m_readGroup, ctx );
+    REQUIRE ( ! FAILED () && stats );
+
+	NGS_StatisticsRelease ( stats, ctx );
+    EXIT;
+}
+
+
+// Iteration over ReadGroups
+
+FIXTURE_TEST_CASE(SRA_ReadGroupIterator_NoGroupBeforeNext, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+    REQUIRE ( ! FAILED () && m_readGroup );
+
+    REQUIRE_NULL ( NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+    REQUIRE_FAILED ();
+
+#if READ_GROUP_SUPPORTS_READS
+    REQUIRE_NULL ( NGS_ReadGroupGetRead ( m_readGroup, ctx, ReadId ( 1 ) . c_str () ) );
+    REQUIRE_FAILED ();
+
+    REQUIRE_NULL ( NGS_ReadGroupGetReads ( m_readGroup, ctx, true, true, true ) );
+    REQUIRE_FAILED ();
+#endif
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadGroupIterator_NoGroups_AfterNext, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+    REQUIRE ( ! FAILED () && m_readGroup );
+
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( "", NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadGroupIterator_WithGroups_AfterNext, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+    REQUIRE ( ! FAILED () && m_readGroup );
+
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    // iteration is in the alphanumeric order, as stored in the metadata
+    REQUIRE_STRING ( "S100_V2", NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( "S103_V2", NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( "S104_V2", NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+
+    // etc
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadGroupIterator_BeyondEnd, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+    REQUIRE ( ! FAILED () && m_readGroup );
+
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( ! NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_NULL ( NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+// Statistics
+
+FIXTURE_TEST_CASE(SRA_ReadCollectionGetStatistics, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+
+    NGS_Statistics * stats = NGS_ReadCollectionGetStatistics ( m_coll, ctx );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_EQ ( (uint64_t)132958771,   NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)114588308,   NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/BIO_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)496499,      NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/SPOT_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)496499,      NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/SPOT_MAX" ) );
+    REQUIRE_EQ ( (uint64_t)1,           NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/SPOT_MIN" ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRA_ReadGroupGetStatistics, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession_WithReadGroups);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "S77_V2" );
+    REQUIRE ( ! FAILED () );
+
+    NGS_Statistics * stats = NGS_ReadGroupGetStatistics ( m_readGroup, ctx );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_EQ ( (uint64_t)25920,   NGS_StatisticsGetAsU64 ( stats, ctx, "BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)22331,   NGS_StatisticsGetAsU64 ( stats, ctx, "BIO_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)97,      NGS_StatisticsGetAsU64 ( stats, ctx, "SPOT_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)125,     NGS_StatisticsGetAsU64 ( stats, ctx, "SPOT_MAX" ) );
+    REQUIRE_EQ ( (uint64_t)29,      NGS_StatisticsGetAsU64 ( stats, ctx, "SPOT_MIN" ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+
+    EXIT;
+}
+
+// Fragment Blobs
+
+FIXTURE_TEST_CASE(SRA_GetFragmentBlobs, SRA_Fixture)
+{
+    ENTRY_ACC(SRA_Accession);
+
+    NGS_FragmentBlobIterator* blobIt = NGS_ReadCollectionGetFragmentBlobs ( m_coll, ctx );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( blobIt );
+
+    NGS_FragmentBlob* blob = NGS_FragmentBlobIteratorNext ( blobIt, ctx );
+
+    REQUIRE_EQ ( (uint64_t)1080, NGS_FragmentBlobSize ( blob, ctx ) );
+
+    NGS_FragmentBlobRelease ( blob, ctx );
+    NGS_FragmentBlobIteratorRelease ( blobIt, ctx );
+
+    EXIT;
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs_sra";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    //assert(!KDbgSetString("KFG"));
+    //assert(!KDbgSetString("VFS"));
+    rc_t m_coll=NgsSraTestSuite(argc, argv);
+    return m_coll;
+}
+
+}
+
diff --git a/test/ngs/ngstest_sradb.cpp b/test/ngs/ngstest_sradb.cpp
new file mode 100644
index 0000000..9b71717
--- /dev/null
+++ b/test/ngs/ngstest_sradb.cpp
@@ -0,0 +1,866 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS C interface, SRADB archives
+*/
+
+#include "ngs_c_fixture.hpp"
+
+#include <limits.h>
+
+#include <klib/printf.h>
+
+#include <kdb/manager.h>
+
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+
+#include "NGS_FragmentBlobIterator.h"
+#include "NGS_FragmentBlob.h"
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsSradbTestSuite);
+
+const char* SRADB_Accession = "SRR600096";
+uint64_t SRADB_Accession_ReadCount = 16;
+
+class SRADB_Fixture : public NGS_C_Fixture {};
+
+// SRADB_ReadCollection
+FIXTURE_TEST_CASE(SRADB_ReadCollection_Open, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    REQUIRE_NOT_NULL ( m_coll);
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReadCount, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    REQUIRE_EQ ( SRADB_Accession_ReadCount, NGS_ReadCollectionGetReadCount ( m_coll, ctx, true, true, true ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetRead, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    m_read = NGS_ReadCollectionGetRead ( m_coll, ctx, ReadId ( 1 ) . c_str () );
+    REQUIRE_NOT_NULL ( m_read );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReads, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+    REQUIRE_NOT_NULL ( m_read );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReads_Filtered_Aligned, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, false);
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReads_Filtered_Unaligned, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, false, false, true);
+    REQUIRE ( ! FAILED () && m_read );
+
+    uint64_t count = 0;
+    while ( NGS_ReadIteratorNext ( m_read, ctx ) )
+    {
+        REQUIRE ( NGS_ReadGetReadCategory ( m_read, ctx ) == NGS_ReadCategory_unaligned && ! FAILED () );
+        ++count;
+    }
+    REQUIRE_EQ ( SRADB_Accession_ReadCount, count );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetReadRange, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 2, 3, true, true, true );
+    REQUIRE_NOT_NULL ( m_read );
+    EXIT;
+}
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReadRange_Filtered, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 1, 200000, true, true, false);
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetName, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    REQUIRE_STRING ( SRADB_Accession, NGS_ReadCollectionGetName ( m_coll, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetReferences, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    NGS_Reference* ref = NGS_ReadCollectionGetReferences ( m_coll, ctx );
+    REQUIRE ( ! FAILED () && ref);
+
+    REQUIRE_NULL ( NGS_ReferenceGetCommonName ( ref, ctx ) );
+    REQUIRE_FAILED ();
+
+    REQUIRE ( ! NGS_ReferenceIteratorNext ( ref, ctx ) );
+
+    NGS_ReferenceRelease ( ref, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetReference, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    REQUIRE_NULL ( NGS_ReadCollectionGetReference ( m_coll, ctx, "wont find me anyways" ) );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetAlignments, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    NGS_Alignment* align = NGS_ReadCollectionGetAlignments ( m_coll, ctx, true, true );
+    REQUIRE ( ! FAILED () && align );
+
+    REQUIRE_NULL ( NGS_AlignmentGetReferenceSpec ( align, ctx ) );
+    REQUIRE_FAILED ();
+
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( align, ctx ) );
+
+    NGS_AlignmentRelease ( align, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetAlignment, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    REQUIRE_NULL ( NGS_ReadCollectionGetAlignment ( m_coll, ctx, "1" ) );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetAlignmentCount, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    REQUIRE_EQ ( (uint64_t)0, NGS_ReadCollectionGetAlignmentCount ( m_coll, ctx, true, true ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetAlignmentRange, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    NGS_Alignment* align = NGS_ReadCollectionGetAlignmentRange ( m_coll, ctx, 1, 2, true, true );
+    REQUIRE ( ! FAILED () && align);
+
+    REQUIRE_NULL ( NGS_AlignmentGetReferenceSpec ( align, ctx ) );
+    REQUIRE_FAILED ();
+
+    REQUIRE ( ! NGS_AlignmentIteratorNext ( align, ctx ) );
+
+    NGS_AlignmentRelease ( align, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetReadGroups, SRADB_Fixture)
+{   // in SRADB archives, a single read group including the whole run
+    ENTRY_ACC(SRADB_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+    REQUIRE ( ! FAILED () && m_readGroup );
+
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE ( ! NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetReadGroup_NotFound, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    REQUIRE_NULL ( NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "wontfindme" ) );
+    REQUIRE_FAILED ();
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetReadGroup_Found, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "A1DLC.1" );
+    REQUIRE_NOT_NULL ( m_readGroup );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionHasReadGroup_NotFound, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    REQUIRE ( ! NGS_ReadCollectionHasReadGroup ( m_coll, ctx, "wontfindme" ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollectionHasReadGroup_Found, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    REQUIRE ( NGS_ReadCollectionHasReadGroup ( m_coll, ctx, "A1DLC.1" ) );
+    EXIT;
+}
+
+// NGS_Read
+
+FIXTURE_TEST_CASE(SRADB_NGS_ReadGetReadName, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+    REQUIRE_STRING ( string ( "1" ),  NGS_ReadGetReadName ( m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_ReadGetReadId, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+    REQUIRE_STRING ( ReadId ( 1 ), NGS_ReadGetReadId ( m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_ReadGetReadGroup, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+    REQUIRE_STRING ( string ( "A1DLC.1" ),  NGS_ReadGetReadGroup ( m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_ReadGetReadCategory, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+
+    enum NGS_ReadCategory cat = NGS_ReadGetReadCategory ( m_read, ctx );
+    REQUIRE_EQ ( NGS_ReadCategory_unaligned, cat );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_ReadGetReadSequence_Full, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+
+    string expected (
+        "TACGGAGGGGGCTAGCGTTGCTCGGAATTACTGGGCGTAAAGGGCGCGTAGGCGGACAGTTAAGTCGGGGGTGAAAGCCCCGGGCTCAACCTCGGAATTG"
+        "CCTTCGATACTGGCTGGCTTGAGTACGGTAGAGGGGGGTGGAACTCCTAGTGTAGAGGTGAAATTCGTAGAGATTCCTGTTTGCTCCCCACGCTTTCGCG"
+        "CCTCAGCGTCAGTAACGGTCCAGTGTGTCGCCTTCGCCACTGGTACTCTTCCTGCTATCTACGCATCTCATTCTACACACGTCGCGCGCCACACCTCTCT"
+        "AACACACGTGACACAGCCACTCTCTGCCGTTACTTCGCTGCTCTGCCGCC"
+    );
+    REQUIRE_STRING( expected,  NGS_ReadGetReadSequence ( m_read, ctx, 0, (size_t)-1 ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_ReadGetReadSequence_PartialNoLength, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+    string expected ("AACACACGTGACACAGCCACTCTCTGCCGTTACTTCGCTGCTCTGCCGCC");
+    REQUIRE_STRING( expected,  NGS_ReadGetReadSequence ( m_read, ctx, 300, (size_t)-1 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_ReadGetReadSequence_PartialLength, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+    REQUIRE_STRING ( "AACACA",  NGS_ReadGetReadSequence ( m_read, ctx, 300, 6 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_ReadGetReadQualities_Full, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+
+    string expected(
+        "====,<==@7<@<@@@CEE=CCEECCEEEEFFFFEECCCEEF=EEDDCCDCEEDDDDDEEEEDDEE*=))9;;=EE(;?E(4;<<;<<EEEE;--'9<;?"
+        "EEE=;E=EE<E=EE<9(9EE;(6<?E#################################################?????BBBBDDDDDBBDEEFFFEE7"
+        "CHH58E=EECCEG///75,5CF-5A5-5C at FEEDFDEE:E--55----5,@@@,,5,5@=?7?#####################################"
+        "##################################################"
+    );
+    REQUIRE_STRING ( expected,  NGS_ReadGetReadQualities ( m_read, ctx, 0, (size_t)-1 ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_ReadGetReadQualities_PartialNoLength, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+    string expected("##################################################");
+    REQUIRE_STRING ( expected,  NGS_ReadGetReadQualities ( m_read, ctx, 300, (size_t)-1 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_ReadGetReadQualities_PartialLength, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+    REQUIRE_STRING ( "CHH58E=EEC",  NGS_ReadGetReadQualities ( m_read, ctx, 200, 10 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_ReadNumFragments, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+
+    uint32_t num = NGS_ReadNumFragments ( m_read, ctx );
+    REQUIRE_EQ ( (uint32_t)2, num );
+
+    EXIT;
+}
+
+// NGS_Fragment (through an NGS_Read object)
+FIXTURE_TEST_CASE(SRADB_NGS_NoFragmentBeforeNext, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetRead ( m_coll, ctx, ReadId ( 1 ) . c_str () );
+    REQUIRE ( ! FAILED () );
+    // no access to a Fragment before a call to NGS_FragmentIteratorNext
+    REQUIRE_NULL ( NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_FragmentGetId, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+    REQUIRE_STRING ( string( SRADB_Accession ) + ".FR0.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_FragmentGetSequence_Full, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+
+    REQUIRE ( ! FAILED () );
+    string expected(
+        "TACGGAGGGGGCTAGCGTTGCTCGGAATTACTGGGCGTAAAGGGCGCGTAGGCGGACAGTTAAGTCGGGGGTGAAAGCCCCGGGCTCAACCTCGGAATTG"
+        "CCTTCGATACTGGCTGGCTTGAGTACGGTAGAGGGGGGTGGAACTCCTAGTGTAGAGGTGAAATTCGTAGAGATT"
+    );
+    REQUIRE_STRING ( expected,  NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 0, (size_t)-1 ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_FragmentGetSequence_PartialNoLength, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+    string expected = "CCTTCGATACTGGCTGGCTTGAGTACGGTAGAGGGGGGTGGAACTCCTAGTGTAGAGGTGAAATTCGTAGAGATT";
+    REQUIRE_STRING ( expected,  NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 100, (size_t)-1 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_FragmentGetSequence_PartialLength, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+    REQUIRE_STRING ( "CCTT",  NGS_FragmentGetSequence ( (NGS_Fragment*)m_read, ctx, 100, 4 ) );
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_FragmentGetQualities_Full, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+
+    string expected(
+        "====,<==@7<@<@@@CEE=CCEECCEEEEFFFFEECCCEEF=EEDDCCDCEEDDDDDEEEEDDEE*=))9;;=EE(;?E(4;<<;<<EEEE;--'9<;?"
+        "EEE=;E=EE<E=EE<9(9EE;(6<?E#################################################"
+    );
+    REQUIRE_STRING ( expected,  NGS_FragmentGetQualities ( (NGS_Fragment*)m_read, ctx, 0, (size_t)-1 ) );
+
+    EXIT;
+}
+
+// Iteration over Fragments
+FIXTURE_TEST_CASE(SRADB_NGS_FragmentIteratorNext, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1); // calls NGS_FragmentIteratorNext
+
+    REQUIRE_STRING ( string( SRADB_Accession ) + ".FR0.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+    REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( string( SRADB_Accession ) + ".FR1.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_FragmentIteratorNext_NullRead, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, false ); // will return an empty iterator
+    REQUIRE ( ! FAILED () );
+
+    NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_FragmentIteratorNext_BeyondEnd, SRADB_Fixture)
+{
+    ENTRY_GET_READ(SRADB_Accession, 1);
+
+    REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+
+    EXIT;
+}
+
+// Iteration over Reads
+FIXTURE_TEST_CASE(SRADB_ReadIterator_NoReadBeforeNext, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+    REQUIRE ( ! FAILED () && m_read );
+    // no access to a Read before a call to NGS_FragmentIteratorNext
+    REQUIRE_NULL ( NGS_ReadGetReadId ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReads_Next, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    // on the first m_read
+    REQUIRE_STRING ( ReadId ( 1 ), NGS_ReadGetReadId ( m_read, ctx ) );
+
+    {   // iterate over fragments
+        REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) ); // position on the first fragment
+        REQUIRE ( ! FAILED () );
+
+        REQUIRE_STRING ( string( SRADB_Accession ) + ".FR0.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+        REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+        REQUIRE ( ! FAILED () );
+
+        REQUIRE_STRING ( string( SRADB_Accession ) + ".FR1.1", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+        REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+        REQUIRE ( ! FAILED () );
+    }
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+    // on the second m_read
+    REQUIRE_STRING ( ReadId ( 2 ), NGS_ReadGetReadId ( m_read, ctx ) );
+
+    {   // iterate over fragments
+        REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) ); // position on the first fragment
+        REQUIRE ( ! FAILED () );
+
+        REQUIRE_STRING ( string( SRADB_Accession ) + ".FR0.2", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+        REQUIRE ( NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+        REQUIRE ( ! FAILED () );
+
+        REQUIRE_STRING ( string( SRADB_Accession ) + ".FR1.2", NGS_FragmentGetId ( (NGS_Fragment*)m_read, ctx ) );
+
+        REQUIRE ( ! NGS_FragmentIteratorNext ( (NGS_Fragment*)m_read, ctx ) );
+        REQUIRE ( ! FAILED () );
+    }
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReads_All, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+    // on the first m_read
+    string id = toString ( NGS_ReadGetReadId ( m_read, ctx ), ctx, true );
+    while ( NGS_ReadIteratorNext ( m_read, ctx ) )
+    {
+        REQUIRE ( ! FAILED () );
+        id = toString ( NGS_ReadGetReadId ( m_read, ctx ), ctx, true );
+        REQUIRE ( ! FAILED () );
+    }
+    REQUIRE_EQ ( ReadId ( SRADB_Accession_ReadCount ), id );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReads_None, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, false );
+    REQUIRE ( ! FAILED () && m_read );
+
+    NGS_ReadGetReadId ( m_read, ctx );
+    REQUIRE_FAILED ();
+
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_NGS_GetReadsIteratorNext_BeyondEnd, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, false ); // empty
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+// Iteration over a range of Reads
+FIXTURE_TEST_CASE(SRADB_ReadRange_NoReadBeforeNext, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 3, 2, true, true, true );
+    REQUIRE ( ! FAILED () && m_read );
+    // no access to a Read before a call to NGS_FragmentIteratorNext
+    REQUIRE_NULL ( NGS_ReadGetReadId ( m_read, ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReadRange, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 3, 2, true, true, true );
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( ReadId ( 3 ), NGS_ReadGetReadId ( m_read, ctx ) );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( ReadId ( 4 ), NGS_ReadGetReadId ( m_read, ctx ) );
+
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadCollection_GetReadRange_Empty, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_read = NGS_ReadCollectionGetReadRange ( m_coll, ctx, 6000000, 2, true, true, true );
+    REQUIRE ( ! FAILED () );
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) );
+
+    EXIT;
+}
+
+// ReadGroup
+
+FIXTURE_TEST_CASE(SRA_ReadGroupGetName, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "A1DLC.1" );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( "A1DLC.1", NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+
+    EXIT;
+}
+
+
+#if READ_GROUP_SUPPORTS_READS
+FIXTURE_TEST_CASE(SRA_ReadGroupGetReads, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "A1DLC.1" );
+
+    m_read = NGS_ReadGroupGetReads ( m_readGroup, ctx, true, true, true );
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( ReadId ( 1 ), NGS_ReadGetReadId ( m_read, ctx ) );
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_STRING ( ReadId ( 2 ), NGS_ReadGetReadId ( m_read, ctx ) );
+
+    EXIT;
+}
+#endif
+
+#if READ_GROUP_SUPPORTS_READS
+FIXTURE_TEST_CASE(SRA_ReadGroupGetReads_Filtered, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "A1DLC.1" );
+
+    m_read = NGS_ReadGroupGetReads ( m_readGroup, ctx, true, true, false ); // no unaligned
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE ( ! NGS_ReadIteratorNext ( m_read, ctx ) ); // no reads
+
+    EXIT;
+}
+#endif
+
+#if READ_GROUP_SUPPORTS_READS
+FIXTURE_TEST_CASE(SRA_ReadGroupGetRead, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "A1DLC.1" );
+
+    m_read = NGS_ReadGroupGetRead ( m_readGroup, ctx, ReadId ( 3 ) . c_str () );
+    REQUIRE ( ! FAILED () && m_read );
+
+    REQUIRE_STRING ( ReadId ( 3 ), NGS_ReadGetReadId ( m_read, ctx ) );
+
+    EXIT;
+}
+#endif
+
+// Iteration over ReadGroups
+
+FIXTURE_TEST_CASE(SRADB_ReadGroupIterator_NoGroupBeforeNext, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+
+    REQUIRE_NULL ( NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+    REQUIRE_FAILED ();
+
+#if READ_GROUP_SUPPORTS_READS
+    REQUIRE_NULL ( NGS_ReadGroupGetRead ( m_readGroup, ctx, ReadId ( 3 ) . c_str () ) );
+    REQUIRE_FAILED ();
+
+    REQUIRE_NULL ( NGS_ReadGroupGetReads ( m_readGroup, ctx, true, true, true ) );
+    REQUIRE_FAILED ();
+#endif
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadGroupIterator_AfterNext, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_STRING ( "A1DLC.1", NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+
+    EXIT;
+}
+
+
+FIXTURE_TEST_CASE(SRADB_ReadGroupIterator_BeyondEnd, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+    m_readGroup = NGS_ReadCollectionGetReadGroups ( m_coll, ctx );
+    REQUIRE ( NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+
+    REQUIRE ( ! NGS_ReadGroupIteratorNext ( m_readGroup, ctx ) );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_NULL ( NGS_ReadGroupGetName ( m_readGroup, ctx ) );
+    REQUIRE_FAILED ();
+
+    EXIT;
+}
+
+// Statistics
+FIXTURE_TEST_CASE(SRADB_ReadCollectionGetStatistics, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    NGS_Statistics * stats = NGS_ReadCollectionGetStatistics ( m_coll, ctx );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_EQ ( (uint64_t)5600,    NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)5600,    NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/BIO_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)16,      NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/SPOT_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)16,      NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/SPOT_MAX" ) );
+    REQUIRE_EQ ( (uint64_t)1,       NGS_StatisticsGetAsU64 ( stats, ctx, "SEQUENCE/SPOT_MIN" ) );
+
+    const char* bam =
+        "@HD\tVN:1.0\tSO:queryname\n"
+        "@RG\tID:A1DLC.1\tPL:illumina\tPU:A1DLC120809.1.AATGAGCCCACG\tLB:Solexa-112136\tPI:393\tDT:2012-08-09T00:00:00-0400\tSM:12341_SN_05_1\tCN:BI\n"
+        "@PG\tID:bwa.negative.screen\tPN:bwa\tVN:0.5.9-tpx\tCL:bwa aln Screening.negative.Homo_sapiens_GRCh37.1_p5.fasta"
+        " -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.G21523.A1DLC120809.1.Illumina_P7-Bonijeci.BI6212661.negative.Screening.negative.Homo_sapiens_GRCh37.1_p5.2.sai"
+        " illuminaReadGroupBamScreening.G21523.A1DLC120809.1.Illumina_P7-Bonijeci.BI6212661.negative.2.fastq.gz; bwa aln Screening.negative.Homo_sapiens_GRCh37.1_p5.fasta -q 5 -l 32 -k 2"
+        " -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.G21523.A1DLC120809.1.Illumina_P7-Bonijeci.BI6212661.negative.Screening.negative.Homo_sapiens_GRCh37.1_p5.1.sai"
+        " illuminaReadGroupBamScreening.G21523.A1DLC120809.1.Illumina_P7-Bonijeci.BI6212661.negative.1.fastq.gz; bwa sampe -t $NSLOTS -T -P -a 589 -f"
+        " illuminaReadGroupBamScreening.G21523.A1DLC120809.1.Illumina_P7-Bonijeci.BI6212661.negative.Screening.negative.Homo_sapiens_GRCh37.1_p5.aligned_bwa.sam"
+        " Screening.negative.Homo_sapiens_GRCh37.1_p5.fasta illuminaReadGroupBamScreening.G21523.A1DLC120809.1.Illumina_P7-Bonijeci.BI6212661.negative.Screening.negative.Homo_sapiens_GRCh37.1_p5.1.sai"
+        " illuminaReadGroupBamScreening.G21523.A1DLC120809.1.Illumina_P7-Bonijeci.BI6212661.negative.Screening.negative.Homo_sapiens_GRCh37.1_p5.2.sai"
+        " illuminaReadGroupBamScreening.G21523.A1DLC120809.1.Illumina_P7-Bonijeci.BI6212661.negative.1.fastq.gz illuminaReadGroupBamScreening.G21523.A1DLC120809.1.Illumina_P7-Bonijeci.BI6212661.negative.2.fastq.gz\n";
+
+    REQUIRE_STRING ( string ( bam ), NGS_StatisticsGetAsString ( stats, ctx, "BAM_HEADER" ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(SRADB_ReadGroupGetStatistics, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    m_readGroup = NGS_ReadCollectionGetReadGroup ( m_coll, ctx, "A1DLC.1" );
+    REQUIRE ( ! FAILED () );
+
+    NGS_Statistics * stats = NGS_ReadGroupGetStatistics ( m_readGroup, ctx );
+    REQUIRE ( ! FAILED () );
+
+    REQUIRE_EQ ( (uint64_t)5600,    NGS_StatisticsGetAsU64 ( stats, ctx, "BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)5600,    NGS_StatisticsGetAsU64 ( stats, ctx, "BIO_BASE_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)16,      NGS_StatisticsGetAsU64 ( stats, ctx, "SPOT_COUNT" ) );
+    REQUIRE_EQ ( (uint64_t)16,      NGS_StatisticsGetAsU64 ( stats, ctx, "SPOT_MAX" ) );
+    REQUIRE_EQ ( (uint64_t)1,       NGS_StatisticsGetAsU64 ( stats, ctx, "SPOT_MIN" ) );
+
+    NGS_StatisticsRelease ( stats, ctx );
+
+    EXIT;
+}
+
+FIXTURE_TEST_CASE(PACBIO_ThrowsOnGetReadId, SRADB_Fixture)
+{   // VDB-2668
+    ENTRY_ACC("SRR287782");
+
+    m_read = NGS_ReadCollectionGetReads ( m_coll, ctx, true, true, true );
+    REQUIRE_NOT_NULL ( m_read );
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE_STRING ( "SRR287782.R.1", NGS_ReadGetReadName ( m_read, ctx ) ); // VDB-2668: throws "no NAME-column found"
+
+    REQUIRE ( NGS_ReadIteratorNext ( m_read, ctx ) );
+    REQUIRE_STRING ( "SRR287782.R.2", NGS_ReadGetReadName ( m_read, ctx ) ); // VDB-2668, review: does not update on Next
+
+    EXIT;
+}
+
+// Fragment Blobs
+
+FIXTURE_TEST_CASE(SRADB_GetFragmentBlobs, SRADB_Fixture)
+{
+    ENTRY_ACC(SRADB_Accession);
+
+    NGS_FragmentBlobIterator* blobIt = NGS_ReadCollectionGetFragmentBlobs ( m_coll, ctx );
+    REQUIRE ( ! FAILED () );
+    REQUIRE_NOT_NULL ( blobIt );
+
+    NGS_FragmentBlob* blob = NGS_FragmentBlobIteratorNext ( blobIt, ctx );
+
+    REQUIRE_EQ ( (uint64_t)5600, NGS_FragmentBlobSize ( blob, ctx ) );
+
+    NGS_FragmentBlobRelease ( blob, ctx );
+    NGS_FragmentBlobIteratorRelease ( blobIt, ctx );
+
+    EXIT;
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs_sra";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t m_coll=NgsSradbTestSuite(argc, argv);
+    return m_coll;
+}
+
+}
+
diff --git a/test/ngs/valgrind.suppress b/test/ngs/valgrind.suppress
new file mode 100644
index 0000000..929ce5b
--- /dev/null
+++ b/test/ngs/valgrind.suppress
@@ -0,0 +1,16 @@
+{
+   static_cached_KDirectory_in_KConfig_find_home_directory
+   Memcheck:Leak
+    ...
+   fun:find_home_directory
+}
+{
+   first_time_ctx_recover
+   Memcheck:Leak
+   ...
+   fun:KConfigMake
+   fun:rsrc_init
+   fun:KRsrcGlobalInit
+   fun:get_tls_ctx
+   fun:ctx_recover
+}
\ No newline at end of file
diff --git a/test/only-remote-repository.kfg b/test/only-remote-repository.kfg
new file mode 100644
index 0000000..b5e95a1
--- /dev/null
+++ b/test/only-remote-repository.kfg
@@ -0,0 +1,2 @@
+/repository/remote/main/CGI/resolver-cgi = "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi"
+/repository/user/main/public/cache-enabled = "false"
diff --git a/test/search/Makefile b/test/search/Makefile
new file mode 100644
index 0000000..5cff1cd
--- /dev/null
+++ b/test/search/Makefile
@@ -0,0 +1,61 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/search
+
+TEST_TOOLS = \
+	test-agrep
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# test-agrep
+#
+TEST_AGREP_SRC = \
+	test-agrep agrep-main search-vdb
+
+TEST_AGREP_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_AGREP_SRC))
+
+TEST_AGREP_LIB = \
+	-skapp \
+	-sncbi-vdb \
+	-sktst
+
+$(TEST_BINDIR)/test-agrep: $(TEST_AGREP_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_AGREP_LIB)
+
+agrep: test-agrep
+	$(TEST_BINDIR)/$^
diff --git a/test/search/PerfCounter.h b/test/search/PerfCounter.h
new file mode 100644
index 0000000..ff081be
--- /dev/null
+++ b/test/search/PerfCounter.h
@@ -0,0 +1,211 @@
+// PerfCounter.h
+
+#ifndef countof
+#define countof(arr) (sizeof(arr)/sizeof(arr[0]))
+#endif
+#include <stdio.h>
+
+#ifndef _WIN32
+#include <time.h>
+
+static struct ::timespec timespec_substract(struct ::timespec const& left, struct ::timespec const& right)
+{
+    struct ::timespec res;
+    if ((left.tv_nsec - right.tv_nsec) < 0)
+    {
+        res.tv_sec = left.tv_sec - right.tv_sec - 1;
+        res.tv_nsec = 1000000000 + left.tv_nsec - right.tv_nsec;
+    }
+    else
+    {
+        res.tv_sec = left.tv_sec - right.tv_sec;
+        res.tv_nsec = left.tv_nsec - right.tv_nsec;
+    }
+    return res;
+}
+
+static struct ::timespec timespec_add(struct ::timespec const& x, struct ::timespec const& y)
+{
+    struct ::timespec res;
+    if ((x.tv_nsec + y.tv_nsec) >= 1000000000)
+    {
+        res.tv_sec = x.tv_sec + y.tv_sec + 1;
+        res.tv_nsec = x.tv_nsec + y.tv_nsec - 1000000000;
+    }
+    else
+    {
+        res.tv_sec = x.tv_sec + y.tv_sec;
+        res.tv_nsec = x.tv_nsec + y.tv_nsec;
+    }
+    return res;
+}
+
+static bool timespec_is_zero(struct ::timespec const& x)
+{
+    return !(x.tv_sec || x.tv_nsec);
+}
+
+class CPerfCounter
+{
+    struct ::timespec m_nLastStarted;
+    struct ::timespec m_nCount;
+	long long m_nMeasureCount; // how many times Resume[/Pause] was called
+	char m_szName[32];
+public:
+	CPerfCounter(char const* pszName) : m_nMeasureCount(0)
+	{
+        m_nLastStarted.tv_sec = 0;
+        m_nLastStarted.tv_nsec = 0;
+
+        m_nCount.tv_sec = 0;
+        m_nCount.tv_nsec = 0;
+
+		strncpy(m_szName, pszName, countof(m_szName));
+		m_szName[countof(m_szName) - 1] = 0;
+	}
+    struct ::timespec const& GetTotalCount() const
+	{
+		return m_nCount;
+	}
+    size_t GetSimpleCount() const
+    {
+        return (size_t)(m_nCount.tv_sec*1000000000 + m_nCount.tv_nsec);
+    }
+    double GetSeconds() const
+    {
+        return m_nCount.tv_sec + m_nCount.tv_nsec/1000000000.;
+    }
+
+	void Resume()
+	{	
+		if (timespec_is_zero(m_nLastStarted))
+        {
+            ::clock_gettime(CLOCK_REALTIME, &m_nLastStarted);
+            ++m_nMeasureCount;
+        }
+		else
+			printf("ERROR: the counter [%s] has been resumed already\n", m_szName);
+	}
+	void Pause()
+	{
+		if (!timespec_is_zero(m_nLastStarted))
+		{
+            struct ::timespec nCurrent;
+            ::clock_gettime(CLOCK_REALTIME, &nCurrent);
+            m_nCount = timespec_add(m_nCount, timespec_substract(nCurrent, m_nLastStarted));
+			m_nLastStarted.tv_sec = 0;
+            m_nLastStarted.tv_nsec = 0;
+		}
+		else
+			printf("ERROR: the counter [%s] has been paused already\n", m_szName);
+	}
+	void Print() const
+	{
+        printf("[%s]: %ld.%09ld s; measure count=%lld%s\n", m_szName, GetTotalCount().tv_sec, GetTotalCount().tv_nsec,
+			m_nMeasureCount, !timespec_is_zero(m_nLastStarted) ? " (still running)" : "");
+	}
+	void Reset()
+	{
+        m_nLastStarted.tv_sec = 0;
+        m_nLastStarted.tv_nsec = 0;
+
+        m_nCount.tv_sec = 0;
+        m_nCount.tv_nsec = 0;
+
+		m_nMeasureCount = 0;
+	}
+};
+#else
+//#include <undefwin.h>
+#include <Windows.h>
+class CPerfCounter
+{
+	__int64 m_nLastStarted;
+	__int64 m_nCount;
+	__int64 m_nMeasureCount; // how many times Resume[/Pause] was called
+	char m_szName[32];
+public:
+	CPerfCounter(char const* pszName) : m_nLastStarted(0), m_nCount(0), m_nMeasureCount(0)
+	{
+		strncpy(m_szName, pszName, countof(m_szName));
+		m_szName[countof(m_szName) - 1] = 0;
+	}
+	CPerfCounter(char const* pszName, __int64 nLastStarted, __int64 nCount, __int64 nMeasureCount) : m_nLastStarted(nLastStarted), m_nCount(nCount), m_nMeasureCount(nMeasureCount)
+	{
+		strncpy(m_szName, pszName, countof(m_szName));
+		m_szName[countof(m_szName) - 1] = 0;
+	}
+	__int64 GetTotalCount() const
+	{
+		if (!m_nLastStarted)
+			return m_nCount;
+		else
+		{
+			__int64 nCurrent = 0;
+			::QueryPerformanceCounter((LARGE_INTEGER*)(&nCurrent));
+			return m_nCount + nCurrent - m_nLastStarted;
+		}
+	}
+    size_t GetSimpleCount() const
+    {
+        return (size_t)GetTotalCount();
+    }
+
+    double GetSeconds() const
+    {
+        __int64 nFreq = 0;
+        ::QueryPerformanceFrequency((LARGE_INTEGER*)(&nFreq));
+        return nFreq ? (double)GetTotalCount()/(double)nFreq : -1.;
+    }
+
+	void Resume()
+	{	
+		if (!m_nLastStarted)
+		{
+			::QueryPerformanceCounter((LARGE_INTEGER*)(&m_nLastStarted));
+			++m_nMeasureCount;
+		}
+		else
+			printf("ERROR: the counter [%s] has been resumed already\n", m_szName);
+	}
+	void Pause()
+	{
+		if (m_nLastStarted)
+		{
+			__int64 nCurrent = 0;
+			::QueryPerformanceCounter((LARGE_INTEGER*)(&nCurrent));
+			m_nCount += nCurrent - m_nLastStarted;
+			m_nLastStarted = 0;
+		}
+		else
+			printf("ERROR: the counter [%s] has been paused already\n", m_szName);
+	}
+	void Print() const
+	{
+		__int64 nFreq = 0;
+		::QueryPerformanceFrequency((LARGE_INTEGER*)(&nFreq));
+		printf("[%s]: %I64d (%I64d ms); measure count=%I64d%s\n", m_szName, GetTotalCount(), GetTotalCount()/(nFreq/1000),
+			m_nMeasureCount, m_nLastStarted ? " (still running)" : "");
+	}
+	void Reset()
+	{
+		m_nLastStarted = 0;
+		m_nCount = 0;
+		m_nMeasureCount = 0;
+	}
+};
+#endif
+
+class CPCount
+{
+	CPerfCounter& m_count;
+public:
+	CPCount(CPerfCounter& count) : m_count(count)
+	{
+		m_count.Resume();
+	}
+	~CPCount()
+	{
+		m_count.Pause();
+	}
+};
\ No newline at end of file
diff --git a/test/search/agrep-main.c b/test/search/agrep-main.c
new file mode 100644
index 0000000..846bf8d
--- /dev/null
+++ b/test/search/agrep-main.c
@@ -0,0 +1,346 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#define index strchr
+#include <search/extern.h>
+#include <sysalloc.h>
+#include "../../libs/search/search-priv.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+/*#include <unistd.h>*/
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <vdb/manager.h> /* VDBManager */
+#include <vdb/table.h> /* VTable */
+#include <vdb/cursor.h> /* VCursor */
+
+
+#ifndef min
+#define min(a, b) ((b) < (a) ? (b) : (a))
+#endif
+
+
+typedef struct AgrepBestMatch
+{
+    int32_t nScore;
+    int32_t indexStart;
+    int32_t nMatchLength;
+} AgrepBestMatch;
+
+typedef struct agrepinfo {
+    char const* buf;
+    int32_t linenum;
+    size_t original_length;
+    AgrepBestMatch* pBestMatch;
+} agrepinfo;
+
+
+rc_t agrep_callback_find_best( void const* cbinfo_void, AgrepMatch const* match, AgrepContinueFlag *cont )
+{
+    agrepinfo const* cbinfo = (agrepinfo *)cbinfo_void;
+    *cont = AGREP_CONTINUE;
+    if (cbinfo->pBestMatch->nScore > match->score)
+    {
+        cbinfo->pBestMatch->nScore = match->score;
+        cbinfo->pBestMatch->indexStart = match->position;
+        cbinfo->pBestMatch->nMatchLength = match->length;
+    }
+
+    return 0;
+}
+
+rc_t agrep_callback( void const* cbinfo_void, AgrepMatch const* match, AgrepContinueFlag *cont )
+{
+    agrepinfo const* cbinfo = (agrepinfo *)cbinfo_void;
+    int32_t const nLine = cbinfo->linenum;
+    int32_t const indexStart = match->position;
+    int32_t const nMatchLength = match->length;
+    size_t const nOriginalLen = cbinfo->original_length;
+    char const* pszBuf = cbinfo->buf;
+    int const bIsCutInBetween = (indexStart + nMatchLength) > nOriginalLen;
+    *cont = AGREP_CONTINUE;
+
+    printf("line=%d, pos=%d, len=%d, end=%d, score=%d: %.*s%s%.*s\n",
+        nLine, indexStart, nMatchLength,
+        (indexStart + nMatchLength) % (int32_t)nOriginalLen,
+        match->score,
+        (int)(min(nMatchLength, nOriginalLen - indexStart)), pszBuf + indexStart,
+        bIsCutInBetween ? "|" : "",
+        (int)(bIsCutInBetween ? nMatchLength - (nOriginalLen - indexStart) : 0), pszBuf);
+    return 0;
+}
+
+
+rc_t agrep_2na_callback( void const* cbinfo, AgrepMatch const* match, AgrepContinueFlag *cont )
+{
+    char const* p;
+    static char *buf = NULL;
+    static int32_t buflen = 0;
+    int32_t i;
+
+    *cont = AGREP_CONTINUE;
+    if (buf == NULL || buflen < match->length) {
+        free(buf);
+        buf = malloc(match->length+1);
+        buflen = match->length;
+    }
+    p = ((agrepinfo const *)cbinfo)->buf + match->position;
+    for (i=0; i<match->length; i++) {
+        buf[i] = "ACGTN"[(size_t)p[i]];
+    }
+    buf[match->length] = '\0';
+
+    /* TODO: this probably requires the same processing as in agrep_callback */
+    printf("%d,%d,%d: %s\n", ((agrepinfo const *)cbinfo)->linenum, match->position, match->score, buf);
+    return 0;
+}
+
+
+#define BUF_SIZE 4096
+
+LIB_EXPORT int32_t CC agrep ( AgrepFlags alg, char const* pattern, FILE* fp, int32_t print, 
+        int32_t printcontext, int32_t k, int32_t findall, int32_t simulate )
+{
+    AgrepParams *self = NULL;
+    int32_t count;
+    size_t len;
+    AgrepFlags mode = alg;
+    AgrepMatch match;
+    agrepinfo info;
+    char szBuf[BUF_SIZE];
+
+    AgrepCallArgs args;
+
+    int32_t linenum = 0;
+    char const* na = "ACGTN";
+    size_t const nPatternSize = strlen(pattern);
+    size_t const nBufSize = BUF_SIZE;
+    size_t const nMaxTextLen = nBufSize-nPatternSize-1;
+    size_t nExtendBufSize;
+
+    int32_t i;
+
+    AgrepMake(&self, mode, pattern);
+
+    count = 0;
+
+    while (!feof(fp) && fgets(szBuf, nMaxTextLen, fp))
+    {
+        ++linenum;
+        len = strlen(szBuf);
+        if (szBuf[len-1] == '\n')
+        {
+            szBuf[len-1] = '\0';
+            --len;
+        }
+
+        /* Make szBuf somewhat circular to be able to find pattern cut in between */
+        nExtendBufSize = nPatternSize <= len ? nPatternSize : len;
+        memmove(szBuf+len, szBuf, nExtendBufSize - 1);
+        szBuf[len + nExtendBufSize - 1] = '\0';
+
+        if (simulate)
+        {
+            for (i = 0; szBuf[i]; ++i)
+            {
+                if (NULL != index(na, szBuf[i]))
+                {
+                    szBuf[i] = index(na, szBuf[i]) - na;
+                }
+            }
+        }
+        
+        if (findall)
+        {
+            AgrepBestMatch best_match = {9999, 0, 0}; /* TODO: it's not C89*/
+
+            info.buf = szBuf;
+            info.linenum = linenum;
+            info.original_length = len;
+            info.pBestMatch = &best_match;
+
+            args.self = self;
+            args.threshold = k;
+            args.buf = szBuf;
+            args.buflen = len + nPatternSize;
+            args.cb = simulate ? agrep_2na_callback : agrep_callback_find_best;
+            args.cbinfo = (void *)&info;
+
+            AgrepFindAll(&args);
+
+            if (!simulate) /* output best match */
+            {
+                printf("line=%d, pos=%d, len=%d, end=%d, score=%d: %.*s%s%.*s\n",
+                    linenum, best_match.indexStart, best_match.nMatchLength,
+                    (best_match.indexStart + best_match.nMatchLength) % (int32_t)len,
+                    best_match.nScore,
+                    (int)(min(best_match.nMatchLength, (int32_t)len - best_match.indexStart)), szBuf + best_match.indexStart,
+                    (best_match.indexStart + best_match.nMatchLength) > (int32_t)len ? "|" : "",
+                    (int)((best_match.indexStart + best_match.nMatchLength) > (int32_t)len ? best_match.nMatchLength - ((int32_t)len - best_match.indexStart) : 0), szBuf);
+            }
+        }
+        else if (AgrepFindFirst(self, k, szBuf, len + nPatternSize, &match))
+        {
+            ++count;
+            if (print)
+            {
+                printf("%s\n", szBuf);
+            }
+            if (printcontext)
+            {
+                printf("%.*s\n", match.length, szBuf + match.position);
+            }
+        }
+    }
+
+    return count;
+}
+
+int main_agrep_test( int ac, char const** av )
+{
+    char const* file;
+    FILE *fp;
+    int32_t count;
+    int32_t slow = 0;
+    char const* pattern;
+    int32_t print = 1;
+    int32_t printcontext = 0;
+    char *digits = "0123456789";
+    int32_t k=0;
+    AgrepFlags alg = AGREP_ALG_WUMANBER | AGREP_EXTEND_BETTER | AGREP_LEFT_MAINTAIN_SCORE;
+    AgrepFlags mode = 0;
+    int32_t findall = 0;
+    int32_t simulate = 0;
+
+    while (ac > 2 && av[1][0] == '-') {
+        if (!strcmp("--4na", av[1])) {
+            mode |= AGREP_PATTERN_4NA;
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp("--extend", av[1])) {
+            mode |= AGREP_EXTEND_SAME;
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp("--better", av[1])) {
+            mode |= AGREP_EXTEND_BETTER;
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp("--maintain", av[1])) {
+            mode |= AGREP_LEFT_MAINTAIN_SCORE;
+            ac--; av++;
+            continue;
+        }
+
+        if (!strcmp("--anchor", av[1])) {
+            mode |= AGREP_ANCHOR_LEFT;
+            ac--; av++;
+            continue;
+        }
+        
+        if (!strcmp("--2na", av[1])) {
+            simulate = 1;
+            mode |= AGREP_TEXT_EXPANDED_2NA | AGREP_PATTERN_4NA;
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp("-a", av[1])) {
+            findall = 1;
+            printcontext = 1;
+            ac--; av++;
+            continue;
+        }
+        if (NULL != index(digits, av[1][1])) {
+            k = atoi(++av[1]);
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp(av[1], "--myers")) {
+            alg = AGREP_ALG_MYERS;
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp(av[1], "--dp")) {
+            alg = AGREP_ALG_DP;
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp(av[1], "--myersunlimited")) {
+            alg = AGREP_ALG_MYERS_UNLTD;
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp(av[1], "--myersunltd")) {
+            alg = AGREP_ALG_MYERS_UNLTD;
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp(av[1], "--wu")) {
+            alg = AGREP_ALG_WUMANBER;
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp(av[1], "--wumanber")) {
+            alg = AGREP_ALG_WUMANBER;
+            ac--; av++;
+            continue;
+        }
+
+        if (!strcmp(av[1], "--slow")) {
+            slow = 1;
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp(av[1], "-c")) {
+            print = 0;
+            ac--; av++;
+            continue;
+        }
+        if (!strcmp(av[1], "-x")) {
+            printcontext = 1;
+            print = 0;
+            ac--; av++;
+            continue;
+        }
+        fprintf(stderr, "Unknown switch: %s\n", av[1]);
+        ac--; av++;
+    }
+
+    pattern = av[1];
+    file = av[2];
+  
+    mode |= AGREP_MODE_ASCII; /* since we open file in text mode, force AGREP_MODE_ASCII */
+    fp = fopen(file, "r");
+    count = agrep(alg|mode, pattern, fp, print, printcontext, k, findall, simulate);
+
+    fclose(fp);
+
+    return 0;
+}
diff --git a/test/search/search-vdb.cpp b/test/search/search-vdb.cpp
new file mode 100644
index 0000000..3d233c1
--- /dev/null
+++ b/test/search/search-vdb.cpp
@@ -0,0 +1,512 @@
+// search-vdb.cpp
+
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "search-vdb.h"
+
+#include <sysalloc.h>
+
+#include <search/extern.h>
+#include <search/grep.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <set>
+#include <algorithm>
+
+#ifndef min
+#define min(a, b) ((b) < (a) ? (b) : (a))
+#endif
+
+#define RELEASE_VDB_HANDLE(Type, pObject)\
+    {\
+        if (pObject)\
+        {\
+            ::Type##Release(pObject);\
+            pObject = NULL;\
+        }\
+    }
+
+namespace VDBSearchTest
+{
+    // Structures required for libs/search
+
+    struct agrepinfo
+    {
+        AgrepBestMatch* pBestMatch; // TODO: remove this redundant reference and use AgrepBestMatch directly
+    };
+
+    // callback required for libs/search
+    rc_t agrep_callback_find_best(void const* cbinfo_void, ::AgrepMatch const* match, ::AgrepContinueFlag* cont)
+    {
+        agrepinfo const* cbinfo = (agrepinfo*)cbinfo_void;
+        *cont = AGREP_CONTINUE;
+        if (cbinfo->pBestMatch->nScore > match->score && match->position < cbinfo->pBestMatch->nTrimLen)
+        {
+            cbinfo->pBestMatch->nScore = match->score;
+            cbinfo->pBestMatch->indexStart = match->position;
+            cbinfo->pBestMatch->nMatchLength = match->length;
+        }
+
+        return 0;
+    }
+
+/////////////////////////////////////////////////////////////////
+
+    CFindLinker::CFindLinker()
+        : m_pVDBManager(NULL), m_pVDBTable(NULL)
+    {
+    }
+
+    CFindLinker::~CFindLinker()
+    {
+        ReleaseVDB();
+    }
+
+    void CFindLinker::ReleaseVDB()
+    {
+        cursorRead.Release();
+        //cursorWrite.Release();
+        RELEASE_VDB_HANDLE(VTable,     m_pVDBTable);
+
+        if (m_pVDBManager)
+        {
+            //rc_t rc = ::VDBManagerLock(m_pVDBManager, m_sTableName.c_str());
+            //PROCESS_RC_WARNING(rc, "VDBManagerLock");
+        }
+
+        RELEASE_VDB_HANDLE(VDBManager, m_pVDBManager);
+    }
+
+    bool CFindLinker::InitVDBRead(char const* pszTableName)
+    {
+        rc_t rc = 0;
+        m_sTableName = pszTableName;
+
+        rc = ::VDBManagerMakeRead(const_cast<const VDBManager**>(&m_pVDBManager), NULL);
+        //rc = ::VDBManagerMakeUpdate(&m_pVDBManager, NULL);
+        PROCESS_RC_ERROR(rc, "VDBManagerMakeRead");
+
+        rc = ::VDBManagerOpenTableRead(m_pVDBManager, const_cast<const VTable**>(&m_pVDBTable), NULL, pszTableName);
+        PROCESS_RC_ERROR(rc, "VDBManagerOpenTableRead");
+
+        rc = ::VTableCreateCursorRead(m_pVDBTable, &cursorRead.PtrConstRef());
+        PROCESS_RC_ERROR(rc, "VTableCreateCursorRead");
+
+        //std::cout << "Opened table \"" << pszTableName << "\"" << std::endl;
+
+        return true;
+    }
+
+#if 0
+    bool CFindLinker::InitVDB(char const* pszTableName)
+    {
+        rc_t rc = 0;
+        m_sTableName = pszTableName;
+
+        rc = ::VDBManagerMakeUpdate(&m_pVDBManager, NULL);
+        PROCESS_RC_ERROR(rc, "VDBManagerMakeUpdate");
+
+        rc = ::VDBManagerUnlock(m_pVDBManager, pszTableName);
+        PROCESS_RC_WARNING(rc, "VDBManagerUnlock");
+
+        rc = ::VDBManagerOpenTableUpdate(m_pVDBManager, &m_pVDBTable, NULL, pszTableName);
+        PROCESS_RC_ERROR(rc, "VDBManagerOpenTableUpdate");
+
+        rc = ::VTableCreateCursorRead(m_pVDBTable, &cursorRead.PtrConstRef());
+        PROCESS_RC_ERROR(rc, "VTableCreateCursorRead");
+
+        rc = ::VTableCreateCursorWrite(m_pVDBTable, &cursorWrite.PtrRef(), kcmInsert);
+        PROCESS_RC_ERROR(rc, "VTableCreateCursorWrite");
+
+        //std::cout << "Opened table \"" << pszTableName << "\"" << std::endl;
+
+        return true;
+    }
+#endif
+
+    bool CFindLinker::InitColumnIndex()
+    {
+        char const* ColumnNamesRead[] = {
+            COLUMN_READ
+            ,COLUMN_READ_START
+            ,COLUMN_READ_LEN
+            ,COLUMN_TRIM_START
+            ,COLUMN_TRIM_LEN
+        };
+        //char const* ColumnNamesWrite[] = {
+        //    COLUMN_READ_START
+        //    ,COLUMN_READ_LEN
+        //};
+
+        return cursorRead.InitColumnIndex(ColumnNamesRead, countof(ColumnNamesRead));
+                //&& cursorWrite.InitColumnIndex(ColumnNamesWrite, countof(ColumnNamesWrite));
+
+    }
+
+    bool CFindLinker::OpenCursor()
+    {
+        rc_t rc = ::VCursorOpen(cursorRead.PtrConstRef());
+        PROCESS_RC_ERROR(rc, "VCursorOpen");
+        return true;
+    }
+
+    char const* PrepareReadForSearch(char const* pszRead, size_t nReadBufSize, size_t nLinkerLen, int32_t nTrimStart, int32_t nTrimLen, char* pszReadTrimmed, size_t nReadTrimmedSize)
+    {
+        size_t nTrimmedLen = min((size_t)nTrimLen, nReadTrimmedSize - 1);
+        strncpy(pszReadTrimmed, pszRead + nTrimStart, nTrimmedLen);
+        pszReadTrimmed[nTrimmedLen] = '\0';
+
+        size_t nExtendBufSize = min(nLinkerLen, nTrimmedLen);
+        if (nTrimmedLen + nExtendBufSize > nReadTrimmedSize)
+            nExtendBufSize = nReadTrimmedSize - nTrimmedLen;
+
+        memmove(pszReadTrimmed + nTrimmedLen, pszReadTrimmed, nExtendBufSize - 1);
+        pszReadTrimmed[nTrimmedLen + nExtendBufSize - 1] = '\0';
+        return pszReadTrimmed;
+    }
+
+    void PrintCharRange(char const* pszStr, size_t nCount)
+    {
+        for (size_t i = 0; i < nCount; ++i)
+        {
+            std::cout << pszStr[i];
+        }
+    }
+
+    void PrintFindBestResult(AgrepBestMatch const& bm, int64_t idRow, int32_t nTrimStart, int32_t nTrimLen, size_t nLinkerLen, char const* pszReadTrimmed, char const* pszRead, char const* pszLinker)
+    {
+        std::cout << std::endl
+            << "row_id=" << idRow;
+        if (bm.nScore == AgrepBestMatch::NOT_FOUND)
+        {
+            std::cout << " (NOT FOUND)";
+        }
+        else
+        {
+            std::cout << std::endl
+            << COLUMN_READ << " [" << nTrimStart << ", " << (nTrimStart + nTrimLen) << "]: " << pszRead << std::endl
+            << "Linker found: " << pszLinker
+            << ", start=" << bm.indexStart + nTrimStart << ", len=" << bm.nMatchLength
+            << ", end=" << (bm.indexStart + bm.nMatchLength) % nTrimLen + nTrimStart
+            << ", score=" << bm.nScore << " (" << (int)(100. * (double)bm.nScore/nLinkerLen) << "%): ";
+
+            PrintCharRange(pszReadTrimmed + bm.indexStart, min(bm.nMatchLength, nTrimLen - bm.indexStart));
+            bool bCutInBetween = (bm.indexStart + bm.nMatchLength) > nTrimLen;
+            if (bCutInBetween)
+            {
+                std::cout << "|";
+                PrintCharRange(pszReadTrimmed, bm.nMatchLength - (nTrimLen - bm.indexStart));
+            }
+        }
+        std::cout << std::endl;
+    }
+
+    enum CFindLinker::SearchResult CFindLinker::SearchSingleRow(::AgrepFlags flags, int64_t idRow)
+    {
+        size_t const BUF_SIZE = 4096;
+        char szRead[BUF_SIZE], szReadTrimmed[BUF_SIZE];
+        uint32_t nItemsRead, nReadLen, nLinkerLen;
+        int32_t bufReadLen[4], bufReadStart[4], nTrimStart, nTrimLen;
+
+        if (!ReadItems(idRow, COLUMN_READ,            szRead,      countof(szRead), &nReadLen))
+            return CFindLinker::SEARCH_RESULT_ERROR;
+
+        if (!ReadItems(idRow, COLUMN_READ_START,      bufReadStart,   countof(bufReadStart), &nItemsRead))
+            return CFindLinker::SEARCH_RESULT_ERROR;
+        //std::cout << "items read = " << nItemsRead << std::endl;
+        //assert(nItemsRead == countof(bufReadStart));
+        //int32_t nVDBLinkerStart = bufReadStart[2];
+
+        if (!ReadItems(idRow, COLUMN_READ_LEN,        bufReadLen,   countof(bufReadLen), &nItemsRead))
+            return CFindLinker::SEARCH_RESULT_ERROR;
+        //assert(nItemsRead == countof(bufReadLen));
+        //int32_t nVDBLinkerLen = bufReadLen[2];
+
+        if (!ReadItems(idRow, COLUMN_TRIM_START,      &nTrimStart, 1, &nItemsRead))
+            return CFindLinker::SEARCH_RESULT_ERROR;
+
+        if (!ReadItems(idRow, COLUMN_TRIM_LEN,        &nTrimLen,   1, &nItemsRead))
+            return CFindLinker::SEARCH_RESULT_ERROR;
+        // fix case when trim is not set properly (len == 0)
+        if (nTrimLen == 0)
+        {
+            nTrimStart = 0;
+            nTrimLen = nReadLen;
+        }
+
+        static char const* arrLinkers[] = {
+            "GTTGGAACCGAAAGGGTTTGAATTCAAACCCTTTCGGTTCCAAC"
+            ,"TCGTATAACTTCGTATAATGTATGCTATACGAAGTTATTACG"
+            ,"CGTAATAACTTCGTATAGCATACATTATACGAAGTTATACGA"
+        };
+
+        // TODO: do something with hardcoded flags
+        static CAgrepMyersSearch arrLinkerSearch[] = {
+            CAgrepMyersSearch(AGREP_MODE_ASCII|AGREP_ALG_MYERS,  arrLinkers[0])
+            ,CAgrepMyersSearch(AGREP_MODE_ASCII|AGREP_ALG_MYERS, arrLinkers[1])
+            ,CAgrepMyersSearch(AGREP_MODE_ASCII|AGREP_ALG_MYERS, arrLinkers[2])
+        };
+
+        AgrepBestMatch bmBest = {AgrepBestMatch::NOT_FOUND, 0, 0};
+        char const* pszBestLinker = NULL;
+
+        for (size_t iLinker = 0; iLinker < countof(arrLinkers); ++iLinker)
+        {
+            char const* pszLinker = arrLinkers[iLinker];
+            nLinkerLen = strlen(pszLinker);
+
+            // Make szBuf somewhat circular to be able to find pattern cut in between
+            // And also here we enforce using trimmed region of the pszRead
+            char const* pszReadTrimmed = PrepareReadForSearch(szRead, countof(szRead), nLinkerLen, nTrimStart, nTrimLen, szReadTrimmed, countof(szReadTrimmed));;
+            AgrepBestMatch bm = {AgrepBestMatch::NOT_FOUND, 0, 0, nTrimLen};
+
+            arrLinkerSearch[iLinker].FindBest(pszReadTrimmed, countof(szRead)-nTrimStart, idRow, nTrimLen, &bm);
+
+            if (bm.nScore != AgrepBestMatch::NOT_FOUND)
+            {
+                if (bmBest.nScore == AgrepBestMatch::NOT_FOUND || bm.nScore < bmBest.nScore)
+                {
+                    bmBest = bm;
+                    pszBestLinker = pszLinker;
+                }
+            }
+        }
+
+        if (bmBest.nScore != AgrepBestMatch::NOT_FOUND)
+        {
+            //std::cout << "id=" << idRow << ", linker=\"" << pszBestLinker << "\", start=" << bmBest.indexStart << ", read=\"" << szRead << "\"" << std::endl;
+            nLinkerLen = strlen(pszBestLinker);
+
+            double nScoreAgrep = (double)bmBest.nScore/nLinkerLen;
+            if (0.22 < nScoreAgrep && nScoreAgrep < 0.333)
+            {
+                size_t start;
+                size_t len = FindLongestCommonSubstring(szReadTrimmed, pszBestLinker, nTrimLen+nLinkerLen, nLinkerLen, &start, NULL);
+                double nScoreSubstr = (double)len/nLinkerLen;
+                char szBuf[512] = "";
+                string_printf(szBuf, countof(szBuf), NULL, "start=%zu, len=%zu: \"%.*s\", %d%%", start, len, len, szReadTrimmed+start, (int)(100.*nScoreSubstr));
+                if (nScoreSubstr > 0.3)
+                {
+                    PrintFindBestResult(bmBest, idRow, nTrimStart, nTrimLen, strlen(pszBestLinker), szReadTrimmed, szRead, pszBestLinker);
+                    std::cout << "Approved by substring search: " << szBuf << std::endl;
+                }
+                else
+                {
+                    bmBest.nScore = AgrepBestMatch::NOT_FOUND;
+                    //PrintFindBestResult(bmBest, idRow, nTrimStart, nTrimLen, strlen(pszBestLinker), szReadTrimmed, szRead, pszBestLinker);
+                    //std::cout << "Declined by substring search: " << szBuf << std::endl;
+                }
+
+            }
+            else
+                PrintFindBestResult(bmBest, idRow, nTrimStart, nTrimLen, strlen(pszBestLinker), szReadTrimmed, szRead, pszBestLinker);
+
+
+            // Write results
+            //std::cout
+            //    << "Stored start: " << nVDBLinkerStart << std::endl
+            //    << "Stored end:   " << nVDBLinkerLen << std::endl
+            //    << "New start:    " << bmBest.indexStart + nTrimStart << std::endl
+            //    << "New len:      " << bmBest.nMatchLength << std::endl;
+
+            //rc_t rc = ::VCursorOpenRow(cursorWrite.PtrRef());
+            //PROCESS_RC_WARNING(rc, "VCursorOpenRow [for writing]")
+            //if (rc == 0)
+            //{
+            //    bufReadStart[2] = bmBest.indexStart + nTrimStart;
+            //    bufReadLen[2] = bmBest.nMatchLength;
+            //    rc = ::VCursorWrite(cursorWrite.PtrRef(), cursorRead.GetColumnIndex(COLUMN_READ_START), 8 * sizeof(bufReadStart[0]), bufReadStart, 0, countof(bufReadStart));
+            //    PROCESS_RC_WARNING(rc, "VCursorWrite (start)")
+            //    rc = ::VCursorWrite(cursorWrite.PtrRef(), cursorRead.GetColumnIndex(COLUMN_READ_LEN), 8 * sizeof(bufReadLen[0]), bufReadLen, 0, countof(bufReadLen));
+            //    PROCESS_RC_WARNING(rc, "VCursorWrite (len)")
+            //}
+            //if (rc == 0)
+            //{
+            //    rc = ::VCursorCommitRow(cursorWrite.PtrRef());
+            //    PROCESS_RC_WARNING(rc, "VCursorCommitRow")
+            //}
+            //if (rc == 0)
+            //{
+            //    rc = ::VCursorCloseRow(cursorWrite.PtrRef());
+            //    PROCESS_RC_WARNING(rc, "VCursorCloseRow")
+            //}
+
+        }
+
+        return bmBest.nScore == AgrepBestMatch::NOT_FOUND ?
+            CFindLinker::SEARCH_RESULT_NOT_FOUND : CFindLinker::SEARCH_RESULT_FOUND;
+    }
+
+    bool CFindLinker::Run(::AgrepFlags flags, char const* pszTableName)
+    {
+        if (!InitVDBRead(pszTableName))
+            return false;
+
+        if (!InitColumnIndex())
+            return false;
+
+        if (!OpenCursor())
+            return false;
+
+        int64_t idRow = 0;
+        uint64_t nRowCount = 0;
+
+        rc_t rc = ::VCursorIdRange(cursorRead.PtrConstRef(), 0, &idRow, &nRowCount);
+        PROCESS_RC_ERROR(rc, "VCursorIdRange");
+
+        size_t nCountFound = 0;
+        // Trying random row ids to figure out if it worth full scan to find linkers
+        std::set<int64_t> arrIDsToTry;
+        
+        size_t const nTrialSize = min(100, nRowCount);
+        size_t nThreshold = 0.25*nTrialSize;
+        bool bDoTrial = (nRowCount >= nTrialSize*1000.);
+        bDoTrial = false; // TODO: debug
+
+        if (bDoTrial)
+        {
+            // generating nTrialSize unique ids to try
+
+            while (arrIDsToTry.size() < nTrialSize)
+            {
+                arrIDsToTry.insert((double)rand()/(double)RAND_MAX*nRowCount);
+            }
+            // Trial scan of random rows
+
+            for (std::set<int64_t>::const_iterator cit = arrIDsToTry.begin(); cit != arrIDsToTry.end(); ++cit)
+            {
+                int64_t const& id = *cit;
+                enum CFindLinker::SearchResult search_res = SearchSingleRow(flags, id);
+                if (search_res == CFindLinker::SEARCH_RESULT_ERROR)
+                    return false;
+                else if (search_res == CFindLinker::SEARCH_RESULT_FOUND)
+                    ++nCountFound;
+
+                if (nCountFound >= nThreshold)
+                    break;
+            }
+        }
+
+        if (nCountFound >= nThreshold || !bDoTrial)
+        {
+            nCountFound = 0;
+            for (/*nRowCount = min(10, nRowCount)*/; (uint64_t)idRow < nRowCount; ++idRow )
+            {
+                enum CFindLinker::SearchResult search_res = SearchSingleRow(flags, idRow);
+                if (search_res == CFindLinker::SEARCH_RESULT_ERROR)
+                    return false;
+                else if (search_res == CFindLinker::SEARCH_RESULT_FOUND)
+                    ++nCountFound;
+            }
+            std::cout
+                << "Run \"" << pszTableName
+                << "\": found " << nCountFound << "/" << nRowCount
+                << " (" << (int)(100.*nCountFound/(double)nRowCount)  << "%)" << std::endl;
+
+        }
+        else
+        {
+            std::cout
+                << "SKIPPED (row count: " << nRowCount << "): Run \"" << pszTableName
+                << "\": found " << nCountFound << "/" << arrIDsToTry.size()
+                << " (" << (int)(100.*nCountFound/(double)arrIDsToTry.size())  << "%)" << std::endl;
+        }
+
+        ReleaseVDB();
+        return true;
+    }
+
+    /////////////////////////////
+    CAgrepMyersSearch::CAgrepMyersSearch(::AgrepFlags flags, char const* pszLinker)
+        : m_nLinkerLen (strlen(pszLinker))
+    {
+        ::AgrepMake(&m_self, flags, pszLinker);
+    }
+    CAgrepMyersSearch::~CAgrepMyersSearch()
+    {
+        ::AgrepWhack(m_self);
+    }
+
+    void CAgrepMyersSearch::FindBest(char const* pszReadTrimmed, size_t nReadBufSize, int64_t idRow, int32_t nTrimLen, AgrepBestMatch* pBestMatch) const
+    {
+        // Initializing Agrep structures
+        agrepinfo info = {pBestMatch};
+
+        ::AgrepCallArgs args;
+
+        args.self      = m_self;
+        args.threshold = (int32_t)(0.33*m_nLinkerLen);
+        args.buf       = pszReadTrimmed;
+        args.buflen    = min(nTrimLen + m_nLinkerLen, nReadBufSize);
+        args.cb        = agrep_callback_find_best;
+        args.cbinfo    = (void*)&info;
+
+        // Run the search algorithm
+        ::AgrepFindAll(&args);
+    }
+
+///////////////////////////////////////
+
+    CVDBCursor::CVDBCursor() : m_pVDBCursor(NULL)
+    {
+    }
+    CVDBCursor::~CVDBCursor()
+    {
+        Release();
+    }
+    void CVDBCursor::Release()
+    {
+        RELEASE_VDB_HANDLE(VCursor, m_pVDBCursor);
+    }
+
+    VCursor*& CVDBCursor::PtrRef()
+    {
+        return m_pVDBCursor;
+    }
+    VCursor const*& CVDBCursor::PtrConstRef()
+    {
+        return const_cast<VCursor const*&>(m_pVDBCursor);
+    }
+
+    bool CVDBCursor::InitColumnIndex(char const* const* ColumnNames, size_t nCount)
+    {
+        for (size_t i = 0; i < nCount; ++i)
+        {
+            rc_t rc = ::VCursorAddColumn(m_pVDBCursor, &m_mapColumnIndex[ColumnNames[i]], ColumnNames[i] );
+            PROCESS_RC_WARNING(rc, ColumnNames[i]);
+        }
+        return true;
+    }
+    uint32_t CVDBCursor::GetColumnIndex(char const* pszColumnName) const
+    {
+        MapColumnIndex::const_iterator cit = m_mapColumnIndex.find(pszColumnName);
+        assert(cit != m_mapColumnIndex.end());
+        return (*cit).second;
+    }
+}
\ No newline at end of file
diff --git a/test/search/search-vdb.h b/test/search/search-vdb.h
new file mode 100644
index 0000000..3abcf2c
--- /dev/null
+++ b/test/search/search-vdb.h
@@ -0,0 +1,229 @@
+// search-vdb.h
+
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _SEARCH_VDB_H_
+#define _SEARCH_VDB_H_
+
+#include <string>
+#include <map>
+#include <iostream>
+
+#include "../../libs/search/search-priv.h"
+
+#include <vdb/manager.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <klib/printf.h>
+
+#ifndef countof
+#define countof(arr) (sizeof(arr)/sizeof(arr[0]))
+#endif
+
+#define PROCESS_RC_ERROR(rc, descr)\
+    {\
+        if (rc)\
+        {\
+            char szBufErr[512] = "";\
+            rc_t res = string_printf(szBufErr, countof(szBufErr), NULL, "ERROR: %s failed with error 0x%08x (%d) [%R]", descr, rc, rc, rc);\
+            if (res == rcBuffer || res == rcInsufficient)\
+                szBufErr[countof(szBufErr) - 1] = '\0';\
+            std::cout << szBufErr << std::endl;\
+            return false;\
+        }\
+    }
+
+#define PROCESS_RC_WARNING(rc, descr)\
+    {\
+        if (rc)\
+        {\
+            char szBufErr[512] = "";\
+            rc_t res = string_printf(szBufErr, countof(szBufErr), NULL, "WARNING: %s failed with error 0x%08x (%d) [%R]", descr, rc, rc, rc);\
+            if (res == rcBuffer || res == rcInsufficient)\
+                szBufErr[countof(szBufErr) - 1] = '\0';\
+            std::cout << szBufErr << std::endl;\
+        }\
+    }
+
+#if 0
+namespace SearchTimeTest
+{
+
+#ifdef WIN32
+    typedef int time_res_t;
+#else
+    typedef size_t time_res_t;
+#endif
+
+    time_res_t TimeTest(char const* TableName, int enumAlgorithm);
+}
+#endif
+
+namespace VDBSearchTest
+{
+    /* remove trailing '\n' from char reads */
+    template<typename T> class CPostReadAction
+    {
+        T* m_pBuf;
+        uint32_t m_nCount;
+    public:
+        CPostReadAction(T* pBuf, uint32_t nCount) : m_pBuf(pBuf), m_nCount(nCount) {}
+        void operator()() const;
+    };
+    template<typename T> inline void CPostReadAction<T>::operator()() const
+    {
+    }
+    template<> inline void CPostReadAction<char>::operator()() const
+    {
+        m_pBuf[m_nCount] = '\0';
+    }
+    template<> inline void CPostReadAction<unsigned char>::operator()() const
+    {
+        m_pBuf[m_nCount] = '\0';
+    }
+
+    char const COLUMN_READ[]            = "READ";
+    char const COLUMN_READ_2NA_PACKED[] = "(INSDC:2na:packed)READ";
+    char const COLUMN_READ_2NA_BIN[]    = "(INSDC:2na:bin)READ";
+//    char const COLUMN_READ_4NA_PACKED[] = "(INSDC:4na:packed)READ";
+//    char const COLUMN_READ_4NA_BIN[]    = "(INSDC:4na:bin)READ";
+    char const COLUMN_LINKER_SEQUENCE[] = "LINKER_SEQUENCE";
+    char const COLUMN_READ_START[]      = "READ_START";
+    char const COLUMN_READ_LEN[]        = "READ_LEN";
+    char const COLUMN_TRIM_START[]      = "TRIM_START";
+    char const COLUMN_TRIM_LEN[]        = "TRIM_LEN";
+
+/////////////////////
+    struct AgrepBestMatch
+    {
+        enum {NOT_FOUND = 9999};
+
+        int32_t nScore;
+        int32_t indexStart;
+        int32_t nMatchLength;
+
+        int32_t nTrimLen;
+    };
+
+    class CAgrepMyersSearch // this class is to reuse allocated AgrepParams instead of malloc/free it for every search
+    {
+    public:
+        CAgrepMyersSearch(::AgrepFlags flags, char const* pszLinker);
+        CAgrepMyersSearch(CAgrepMyersSearch const& rhs);
+        CAgrepMyersSearch& operator=(CAgrepMyersSearch const& rhs);
+
+        ~CAgrepMyersSearch();
+
+        void FindBest(char const* pszReadTrimmed, size_t nReadBufSize, int64_t idRow, int32_t nTrimLen, AgrepBestMatch* pBestMatch) const;
+        void FindBest2NAPacked(unsigned char const* p2NAPacked, size_t nReadBufSize, int64_t idRow, int32_t nTrimLen, AgrepBestMatch* pBestMatch) const;
+    private:
+        ::AgrepParams* m_self;
+        size_t m_nLinkerLen;
+    };
+
+    class CVDBCursor
+    {
+    public:
+
+        CVDBCursor();
+        CVDBCursor(CVDBCursor const& o);
+        CVDBCursor& operator=(CVDBCursor const& o);
+        ~CVDBCursor();
+
+        VCursor*& PtrRef();
+        VCursor const*& PtrConstRef();
+
+        bool InitColumnIndex(char const* const* ColumnNames, size_t nCount);
+        uint32_t GetColumnIndex(char const* pszColumnName) const;
+
+        void Release();
+
+    private:
+        typedef std::map<std::string, uint32_t> MapColumnIndex;
+        MapColumnIndex m_mapColumnIndex;
+
+        VCursor* m_pVDBCursor;
+    };
+
+    class CFindLinker
+    {
+    public:
+#if 0
+#ifdef WIN32
+        friend int ::SearchTimeTest::TimeTest(char const* TableName, int enumAlgorithm);
+#else
+        friend size_t ::SearchTimeTest::TimeTest(char const* TableName, int enumAlgorithm);
+#endif
+#endif
+
+        CFindLinker();
+        ~CFindLinker();
+
+        bool Run(::AgrepFlags flags, char const* pszTableName);
+
+    private:
+        VDBManager*       m_pVDBManager;
+        VTable*           m_pVDBTable;
+
+        CVDBCursor cursorRead;
+        CVDBCursor cursorWrite;
+
+        std::string m_sTableName;
+
+        typedef std::map<std::string, uint32_t> MapColumnIndex;
+        MapColumnIndex m_mapColumnIndex;
+
+        enum SearchResult
+        {
+            SEARCH_RESULT_ERROR
+            ,SEARCH_RESULT_NOT_FOUND
+            ,SEARCH_RESULT_FOUND
+        };
+
+        bool InitVDB(char const* pszTableName);
+        bool InitVDBRead(char const* pszTableName);
+        void ReleaseVDB();
+        bool InitColumnIndex();
+        bool OpenCursor();
+        enum SearchResult SearchSingleRow(::AgrepFlags flags, int64_t idRow);
+
+    public:
+        template<typename T> bool ReadItems(int64_t idRow, char const* pszColumnName, T* pBuf, uint32_t nBufLen, uint32_t* pnItemsRead)
+        {
+            uint32_t idxCol = cursorRead.GetColumnIndex(pszColumnName);
+
+            rc_t rc = ::VCursorReadDirect(cursorRead.PtrConstRef(), idRow, idxCol, 8*sizeof(T), pBuf, nBufLen, pnItemsRead);
+            PROCESS_RC_ERROR(rc, "VCursorReadDirect")
+
+            CPostReadAction<T>(pBuf, *pnItemsRead)();
+
+            return true;
+        }
+    };
+}
+
+#endif
\ No newline at end of file
diff --git a/test/search/test-agrep.cpp b/test/search/test-agrep.cpp
new file mode 100644
index 0000000..8176470
--- /dev/null
+++ b/test/search/test-agrep.cpp
@@ -0,0 +1,928 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for search
+*/
+
+#include <ktst/unit_test.hpp>
+#include <kapp/main.h> /* KMain */
+
+//#include <../libs/search/search-priv.h>
+#include <search/nucstrstr.h>
+#include <search/smith-waterman.h>
+
+#include <stdexcept>
+#include <limits>
+
+#include <stdio.h>
+
+#include "search-vdb.h"
+#include <search/ref-variation.h>
+
+#undef max
+
+using namespace std;
+
+static rc_t argsHandler(int argc, char* argv[]);
+TEST_SUITE_WITH_ARGS_HANDLER(TestSuiteSearch, argsHandler);
+
+static rc_t argsHandler(int argc, char* argv[]) {
+    Args* args = NULL;
+    rc_t rc = ArgsMakeAndHandle(&args, argc, argv, 0, NULL, 0);
+    ArgsWhack(args);
+    return rc;
+}
+
+void trim_eol(char* psz)
+{
+    size_t len = strlen(psz);
+    if (psz[len - 2] == '\n' || psz[len - 2] == '\r')
+        psz[len - 2] = '\0';
+    else if (psz[len - 1] == '\n' || psz[len - 1] == '\r')
+        psz[len - 1] = '\0';
+}
+
+#if 0
+#include "PerfCounter.h"
+#include <klib/checksum.h>
+
+TEST_CASE(TempCRC)
+{
+    std::cout << "Testing crc32 speed..." << std::endl;
+    size_t const size = (size_t)10 << 20;
+    char* buf = new char [size];
+    CPerfCounter counter( "CRC32" );
+
+    for ( size_t i = 0; i < size; ++i )
+    {
+        buf[i] = i;
+    }
+
+    size_t const ALIGN_BYTES = _ARCH_BITS / 8;
+
+    printf ("allocated %saligned (address=%p)\n", (int)((size_t)buf % ALIGN_BYTES) ? "un" : "", buf);
+
+    size_t offset = 2;
+    uint32_t crc32;
+
+    {
+        CPCount count(counter);
+        crc32 = ::CRC32 ( 0, buf + offset, size - offset );
+    }
+
+    printf ("Caclulated CRC32: 0x%08X (%.2lf MB/s)\n", crc32, (size >> 20)/counter.GetSeconds());
+
+    delete[]buf;
+}
+#endif
+
+class AgrepFixture
+{
+public:
+	AgrepFixture()
+	: agrep_params ( 0 )
+	{
+	}
+	~AgrepFixture()
+	{
+		::AgrepWhack ( agrep_params );
+	}
+	
+	rc_t Setup ( const char* pattern, AgrepFlags flags )
+	{
+		pattern_len = strlen ( pattern );
+		return ::AgrepMake ( & agrep_params, AGREP_MODE_ASCII | flags, pattern );
+	}
+	
+	bool FindFirst ( const string& text, int32_t threshold )
+	{
+		return ::AgrepFindFirst ( agrep_params, threshold, text . c_str (), text . size (), & match_info ) != 0;	
+	}
+
+	bool FindBest ( const string& text, int32_t threshold )
+	{
+		return ::AgrepFindBest ( agrep_params, threshold, text . c_str (), text . size (), & match_info ) != 0;	
+	}
+
+
+public:	
+	size_t pattern_len;
+	::AgrepParams* agrep_params;
+    ::AgrepMatch match_info;
+};
+
+FIXTURE_TEST_CASE ( AgrepDPTest, AgrepFixture )
+{
+    REQUIRE_RC ( Setup ( "MATCH", AGREP_ALG_DP ) );
+
+    // Complete match
+    {
+        REQUIRE ( FindFirst ( "MATCH", 0 ) );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length );
+        REQUIRE_EQ ( 0, match_info.position );
+        REQUIRE_EQ ( 0, match_info.score );
+    }
+
+    // Complete substring match
+    {
+        REQUIRE ( FindFirst ( "xxMATCHvv", 0 ) );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length );
+        REQUIRE_EQ ( 2, match_info.position );
+        REQUIRE_EQ ( 0, match_info.score );
+    }
+    // 1 Deletion
+    {
+        REQUIRE ( FindFirst ( "xxxMACHvv", 1 ) );
+        REQUIRE_EQ ( pattern_len - 1, (size_t)match_info.length );
+        REQUIRE_EQ ( 3, match_info.position );
+        REQUIRE_EQ ( 1, match_info.score );
+    }
+
+    // 2 Insertions
+    {
+        REQUIRE ( FindFirst ( "xxxMAdTCaHvv", 2 ) );
+        REQUIRE_EQ ( pattern_len + 2, (size_t)match_info.length );
+        REQUIRE_EQ ( 3, match_info.position );
+        REQUIRE_EQ ( 2, match_info.score );
+    }
+
+    // 3 Mismatches
+    {
+        REQUIRE ( FindFirst ( "xATxx", 5 ) );
+        REQUIRE_EQ ( pattern_len /*2*/, (size_t)match_info.length ); // FIXME: 2 looks correct here
+        REQUIRE_EQ ( 0, match_info.position );                       // 1
+        REQUIRE_EQ ( 3, match_info.score );                          // 2
+    }
+    
+    // Best match
+    {
+        REQUIRE ( FindBest ( "MTCH__MITCH_MTACH_MATCH_MATCH", 1 ) );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length );
+        REQUIRE_EQ ( 18, match_info.position );
+        REQUIRE_EQ ( 0, match_info.score );
+    }
+    // First match
+    {
+        REQUIRE ( FindFirst ( "MTCH__MITCH_MTACH_MATCH_MATCH", 1 ) );
+        REQUIRE_EQ ( pattern_len - 1, (size_t)match_info.length );
+        REQUIRE_EQ ( 0, match_info.position );
+        REQUIRE_EQ ( 1, match_info.score );
+    }
+
+    // Match anything
+    {
+        // threshold >= pattern_len seems to specify that a complete mismatch is acceptable
+        // by implementation, the algorithm reports the result to be "found" at the tail portion of the reference string
+        // for this degenerate case, the expected behavior is not clear, so I'll just document the reality here:
+        const string text = "xyzvuwpiuuuu";
+        REQUIRE ( FindFirst ( "xyzvuwpiuuuu", pattern_len ) );
+        REQUIRE_EQ ( pattern_len + 1, (size_t)match_info.length );
+        REQUIRE_EQ ( text . size () - ( pattern_len + 1 ), (size_t)match_info.position );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.score );
+    }
+
+    // Not found
+    {
+        REQUIRE ( ! FindFirst ( "xyzvuwpiu", 4 ) );
+    }
+}
+
+FIXTURE_TEST_CASE ( AgrepWumanberTest, AgrepFixture )
+{
+    REQUIRE_RC ( Setup ( "MATCH", AGREP_ALG_WUMANBER ) );
+	
+    // Complete match
+    {
+        REQUIRE ( FindFirst ( "MATCH", 0 ) );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length );
+        REQUIRE_EQ ( 0, match_info.position );
+        REQUIRE_EQ ( 0, match_info.score );
+    }
+
+    // Complete substring match
+    {
+        REQUIRE ( FindFirst ( "xxMATCHvv", 0 ) );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length );
+        REQUIRE_EQ ( 2, match_info.position );
+        REQUIRE_EQ ( 0, match_info.score );
+    }
+    // 1 Deletion
+    {
+        REQUIRE ( FindFirst ( "xxxMACHvv", 1 ) );
+        REQUIRE_EQ ( pattern_len - 1, (size_t)match_info.length );
+        REQUIRE_EQ ( 3, match_info.position );
+        REQUIRE_EQ ( 1, match_info.score );
+    }
+
+    // 2 Insertions
+    {
+        REQUIRE ( FindFirst ( "xxxMAdTCaHvv", 2 ) );
+        REQUIRE_EQ ( pattern_len + 2, (size_t)match_info.length );
+        REQUIRE_EQ ( 3, match_info.position );
+        REQUIRE_EQ ( 2, match_info.score );
+    }
+
+    // 3 Mismatches
+    {
+        REQUIRE ( FindFirst ( "xATxx", 5 ) );
+        REQUIRE_EQ ( pattern_len /*2*/, (size_t)match_info.length ); // FIXME: 2 looks correct here
+        REQUIRE_EQ ( 0, match_info.position );                       // 1   
+        REQUIRE_EQ ( 3, match_info.score );                          // 2
+    }
+    
+    // Best match
+    {
+        REQUIRE ( FindBest ( "MTCH__MITCH_MTACH_MATCH_MATCH", 1 ) );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length );
+        REQUIRE_EQ ( 18, match_info.position );
+        REQUIRE_EQ ( 0, match_info.score );
+    }
+    // First match
+    {
+        REQUIRE ( FindFirst ( "MTCH__MITCH_MTACH_MATCH_MATCH", 1 ) );
+        REQUIRE_EQ ( pattern_len - 1, (size_t)match_info.length );
+        REQUIRE_EQ ( 0, match_info.position );
+        REQUIRE_EQ ( 1, match_info.score );
+    }
+
+    // Match anything
+    {   // threshold >= pattern_len seems to specify that a complete mismatch is acceptable
+        const string text = "xyzvuwpiuuuu";
+        REQUIRE ( FindFirst ( text, pattern_len ) );
+        REQUIRE_EQ ( text . size (), (size_t)match_info.length ); 
+        REQUIRE_EQ ( 0, match_info.position );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.score );
+    }
+
+    // Not found
+    {
+        REQUIRE ( ! FindFirst ( "xyzvuwpiu", 4 ) );
+    }
+}
+
+FIXTURE_TEST_CASE ( AgrepMyersTest, AgrepFixture )
+{
+    REQUIRE_RC ( Setup ( "MATCH", AGREP_ALG_MYERS ) );
+	
+    // Complete match
+    {
+        REQUIRE ( FindFirst ( "MATCH", 0 ) );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length );
+        REQUIRE_EQ ( 0, match_info.position );
+        REQUIRE_EQ ( 0, match_info.score );
+    }
+
+    // Complete substring match
+    {
+        REQUIRE ( FindFirst ( "xxMATCHvv", 0 ) );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length );
+        REQUIRE_EQ ( 2, match_info.position );
+        REQUIRE_EQ ( 0, match_info.score );
+    }
+    // 1 Deletion
+    {
+        REQUIRE ( FindFirst ( "xxxMACHvv", 1 ) );
+        REQUIRE_EQ ( pattern_len - 1, (size_t)match_info.length );
+        REQUIRE_EQ ( 3, match_info.position );
+        REQUIRE_EQ ( 1, match_info.score );
+    }
+
+    // 2 Insertions
+    {
+        REQUIRE ( FindFirst ( "xxxMAdTCaHvv", 2 ) );
+//        REQUIRE_EQ ( pattern_len + 2, (size_t)match_info.length );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length ); //FIXME: different from other algorithms
+        REQUIRE_EQ ( 3, match_info.position );
+        REQUIRE_EQ ( 2, match_info.score );
+    }
+
+    // 3 Mismatches
+    {
+        REQUIRE ( FindFirst ( "xATxx", 5 ) );
+        REQUIRE_EQ ( 2, match_info.length  ); 
+        REQUIRE_EQ ( 1, match_info.position ); 
+        REQUIRE_EQ ( 3, match_info.score );
+    }
+    
+    // Best match
+    {
+        REQUIRE ( FindBest ( "MTCH__MITCH_MTACH_MATCH_MATCH", 1 ) );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length );
+        REQUIRE_EQ ( 18, match_info.position );
+        REQUIRE_EQ ( 0, match_info.score );
+    }
+    // First match
+    {
+        REQUIRE ( FindFirst ( "MTCH__MITCH_MTACH_MATCH_MATCH", 1 ) );
+        REQUIRE_EQ ( pattern_len - 1, (size_t)match_info.length );
+        REQUIRE_EQ ( 0, match_info.position );
+        REQUIRE_EQ ( 1, match_info.score );
+    }
+
+    // Match anything
+    {   // threshold >= pattern_len seems to specify that a complete mismatch is acceptable
+        const string text = "xyzvuwpiuuuu";
+        REQUIRE ( FindFirst ( text, pattern_len ) );
+//        REQUIRE_EQ ( text . size (), (size_t)match_info.length ); 
+        REQUIRE_EQ ( 1, match_info.length ); //FIXME: different from other algorithms
+        REQUIRE_EQ ( 0, match_info.position );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.score );
+    }
+
+    // Not found
+    {
+        REQUIRE ( ! FindFirst ( "xyzvuwpiu", 4 ) );
+    }
+}
+
+FIXTURE_TEST_CASE ( AgrepMyersUnltdTest, AgrepFixture )
+{
+    REQUIRE_RC ( Setup ( "MATCH", AGREP_ALG_MYERS_UNLTD ) );
+	
+    // Complete match
+    {
+        REQUIRE ( FindFirst ( "MATCH", 0 ) );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length );
+        REQUIRE_EQ ( 0, match_info.position );
+        REQUIRE_EQ ( 0, match_info.score );
+    }
+
+    // Complete substring match
+    {
+        REQUIRE ( FindFirst ( "xxMATCHvv", 0 ) );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.length );
+        REQUIRE_EQ ( 2, match_info.position );
+        REQUIRE_EQ ( 0, match_info.score );
+    }
+    // 1 Deletion
+    {
+        REQUIRE ( FindFirst ( "xxxMACHvv", 1 ) );
+        REQUIRE_EQ ( pattern_len - 1, (size_t)match_info.length );
+        REQUIRE_EQ ( 3, match_info.position );
+        REQUIRE_EQ ( 1, match_info.score );
+    }
+
+    // 2 Insertions
+    {
+        REQUIRE ( FindFirst ( "xxxMAdTCaHvv", 2 ) );
+//        REQUIRE_EQ ( pattern_len + 2, (size_t)match_info.length );
+        REQUIRE_EQ ( (size_t)pattern_len - 1, (size_t)match_info.length ); //FIXME: different from other algorithms
+        REQUIRE_EQ ( (int32_t)3, match_info.position );
+        REQUIRE_EQ ( (int32_t)2, match_info.score );
+    }
+
+    // 3 Mismatches
+    {
+        REQUIRE ( FindFirst ( "xATxx", 5 ) );
+        REQUIRE_EQ ( 2, match_info.length ); 
+        REQUIRE_EQ ( 1, match_info.position ); 
+        REQUIRE_EQ ( 3, match_info.score );
+    }
+    
+    // Best match
+    {
+        REQUIRE ( FindBest ( "MTCH__MITCH_MTACH_MATCH_MATCH", 1 ) );
+        REQUIRE ( (size_t)match_info.length == pattern_len );
+        REQUIRE ( match_info.position == 18 );
+        REQUIRE ( match_info.score == 0 );
+    }
+    // First match
+    {
+        REQUIRE ( FindFirst ( "MTCH__MITCH_MTACH_MATCH_MATCH", 1 ) );
+        REQUIRE ( (size_t)match_info.length == pattern_len - 1 );
+        REQUIRE ( match_info.position == 0 );
+        REQUIRE ( match_info.score == 1 );
+    }
+
+    // Match anything
+    {   // threshold >= pattern_len seems to specify that a complete mismatch is acceptable
+        const string text = "xyzvuwpiuuuu";
+        REQUIRE ( FindFirst ( text, pattern_len ) );
+//        REQUIRE_EQ ( text . size (), (size_t)match_info.length ); 
+        REQUIRE_EQ ( 1, match_info.length ); //FIXME: different from other algorithms
+        REQUIRE_EQ ( 0, match_info.position );
+        REQUIRE_EQ ( pattern_len, (size_t)match_info.score );
+    }
+
+    // Not found
+    {
+        REQUIRE ( ! FindFirst ( "xyzvuwpiu", 4 ) );
+    }
+}
+
+
+TEST_CASE(SearchCompare)
+{
+    //std::cout << "This is search algorithm time comparison test" << std::endl << std::endl;
+    std::cout << "SearchCompare test is currently OFF" << std::endl;
+
+    /*
+    TimeTest("SRR067432", SearchTimeTest::ALGORITHM_AGREP);
+    TimeTest("SRR067432", SearchTimeTest::ALGORITHM_LCS_DP);
+    TimeTest("SRR067432", SearchTimeTest::ALGORITHM_NUCSTRSTR);
+    TimeTest("SRR067432", SearchTimeTest::ALGORITHM_LCS_SAIS);*/
+
+    //std::cout << std::endl << "Time comparison test acomplished" << std::endl;
+}
+
+TEST_CASE(TestCaseAgrep)
+{
+    std::cout << "TestCaseAgrep test is currently OFF" << std::endl;
+    //VDBSearchTest::CFindLinker().Run(AGREP_MODE_ASCII|AGREP_ALG_MYERS, "SRR067432");//"SRR068408");
+    //VDBSearchTest::CFindLinker().Run(AGREP_MODE_ASCII|AGREP_ALG_MYERS, "SRR067408_extr");
+
+/*
+    char const pszRunNamesFile[] = "454Runs.txt";
+    FILE* fRuns = fopen(pszRunNamesFile, "r");
+    if (!fRuns)
+    {
+        printf("Failed to open file: %s\n", pszRunNamesFile);
+        return;
+    }
+    bool bSkipping = true;
+    for (; !feof(fRuns); )
+    {
+        char szRuns[512] = "";
+        char* psz = fgets(szRuns, sizeof(szRuns), fRuns);
+        if (!psz)
+            break;
+        trim_eol(psz);
+        if (bSkipping && !strcmp(psz, "SRR067408"))
+        {
+            bSkipping = false;
+        }
+        if (bSkipping)
+            continue;
+        VDBSearchTest::CFindLinker().Run(AGREP_MODE_ASCII|AGREP_ALG_MYERS, psz);
+    }*/
+}
+
+// Fgrep
+
+static void RunFgrep ( FgrepFlags p_alg )
+{   // VDB-2669: creates uninitialized memory
+    Fgrep* fg;
+    const char* queries[] = { "RRRRRAH" };
+    if ( FgrepMake ( & fg, FGREP_MODE_ASCII | p_alg, queries, 1 ) ) // this used to leave uninitialized memory ...
+        throw logic_error ( "RunFgrep: FgrepMake() failed" );
+    
+    const std::string str ( 1000, 'A' );
+    FgrepMatch matchinfo;
+    if ( 0 != FgrepFindFirst ( fg, str . data (), str . size (), & matchinfo ) ) // ... the use of which showed up in valgrind here, and sometimes caused a crash
+        throw logic_error ( "RunFgrep: FgrepFindFirst() found a false match" );
+    
+    FgrepFree ( fg );
+}
+
+TEST_CASE ( DumbGrep_Crash )
+{
+    RunFgrep ( FGREP_ALG_DUMB );
+}
+
+TEST_CASE ( BoyerMooreGrep_Crash )
+{
+    RunFgrep ( FGREP_ALG_BOYERMOORE );
+}
+
+TEST_CASE ( AhoGrep_Crash )
+{
+    RunFgrep ( FGREP_ALG_AHOCORASICK );
+}
+
+// Smith-Waterman
+
+class SmithWatermanFixture
+{
+public:
+	SmithWatermanFixture()
+	:  m_self ( 0 ),
+       m_pattern_len ( 0 )
+	{
+	}
+	~SmithWatermanFixture()
+	{
+		::SmithWatermanWhack ( m_self );
+	}
+	
+	rc_t Setup ( const string& p_query )
+	{
+        m_pattern_len = p_query . size (); 
+		return ::SmithWatermanMake ( & m_self, p_query . data() );
+	}
+	
+	bool FindFirst ( const string& p_text, uint32_t p_threshold = numeric_limits<uint32_t>::max() )
+	{
+		return ::SmithWatermanFindFirst ( m_self,  p_threshold, p_text . c_str (), p_text . size (), & m_match_info ) == 0;	
+	}
+
+public:	
+	::SmithWaterman*       m_self;
+	size_t                 m_pattern_len;
+    ::SmithWatermanMatch   m_match_info;
+};
+
+FIXTURE_TEST_CASE ( SmithWatermanTest, SmithWatermanFixture )
+{
+    REQUIRE_RC ( Setup ( "MATCH" ) );
+
+    // VDB-3034: crash on query of length 0, when called right after initialization of the search object
+    {
+        REQUIRE(!FindFirst(""));
+    }
+
+	// threshold in FirstMatch varies from 0 (a complete mismatch is acceptable) to 2*m_pattern_len (perfect match)
+    
+    // Complete match
+    {
+        REQUIRE ( FindFirst ( "MATCH" ) );
+        REQUIRE_EQ ( m_pattern_len,  ( size_t ) m_match_info.length );
+        REQUIRE_EQ ( 0, m_match_info.position );
+        REQUIRE_EQ ( 2 * m_pattern_len, ( size_t ) m_match_info.score );
+    }
+    // Complete substring match
+    {
+        REQUIRE ( FindFirst ( "xxMATCHvv", 0 ) );
+        REQUIRE_EQ ( m_pattern_len, (size_t)m_match_info.length );
+        REQUIRE_EQ ( 2, m_match_info.position );
+        REQUIRE_EQ ( 2 * m_pattern_len, ( size_t ) m_match_info.score );
+    }
+    // 1 Deletion
+    {
+        REQUIRE ( FindFirst ( "xxxMACHvv", 7 ) );
+        REQUIRE_EQ ( m_pattern_len - 1, (size_t)m_match_info.length );
+        REQUIRE_EQ ( 3, m_match_info.position );
+        REQUIRE_EQ ( 7, m_match_info.score );
+    }
+
+    // 2 Insertions
+    {
+        REQUIRE ( FindFirst ( "xxxMAdTCaHvv", 8 ) );
+        REQUIRE_EQ ( m_pattern_len + 2, (size_t)m_match_info.length );
+        REQUIRE_EQ ( 3, m_match_info.position );
+        REQUIRE_EQ ( 8, m_match_info.score );
+    }
+
+    // 3 Mismatches
+    {
+        REQUIRE ( FindFirst ( "xATxx", 4 ) );
+        REQUIRE_EQ ( 2, m_match_info.length );
+        REQUIRE_EQ ( 1, m_match_info.position );
+        REQUIRE_EQ ( 4, m_match_info.score );
+    }
+    
+    // First match
+    {
+        REQUIRE ( FindFirst ( "MTCH__MITCH_MTACH_MATCH_MATCH" ) );
+        REQUIRE_EQ ( m_pattern_len, (size_t)m_match_info.length );
+        REQUIRE_EQ ( 18, m_match_info.position );
+        REQUIRE_EQ ( 2 * m_pattern_len,  (size_t)m_match_info.score );
+    }
+
+    // Match anything
+    {   // threshold is from 0 (a complete mismatch is acceptable) to 2*m_pattern_len (perfect match)
+        const string text = "xyzvuwpiuuuu";
+        REQUIRE ( FindFirst ( text, 0 ) );
+        REQUIRE_EQ ( 0, m_match_info.length ); 
+        REQUIRE_EQ ( 0, m_match_info.position );
+        REQUIRE_EQ ( 0, m_match_info.score );
+    }
+
+    // Not found
+    {
+        REQUIRE ( ! FindFirst ( "xyzvuwpiu", 1 ) );
+    }
+
+}
+
+// Ref-Variation
+#if 0
+static 
+void 
+PrintMatrix ( const INSDC_dna_text* p_ref, const INSDC_dna_text* p_query, const int p_matrix[], size_t p_rows, size_t p_cols )
+{
+    cout << "    ";
+    while ( *p_query )
+    {
+        cout << " " << *p_query;
+        ++p_query;
+    }
+    cout << endl;
+    for ( size_t i = 0; i < p_rows - 1; ++i ) // skip row 0 ( all 0s )
+    {
+        cout << i << " " << p_ref[i] << ": ";
+        for ( size_t j = 0; j < p_cols - 1; ++j ) // skip the 0 at the start
+        {
+            cout << p_matrix [ ( i + 1 ) * p_cols + j + 1 ] << " ";
+        }
+        cout << endl;
+    }
+}
+#endif
+
+TEST_CASE ( RefVariation_crash)
+{
+    RefVariation* self;
+    INSDC_dna_text ref[] = "ACGTACGTACGTACGTACGTACGTACGTACGT";
+    REQUIRE_RC_FAIL ( RefVariationIUPACMake ( &self, ref, string_size ( ref ), 0, 0, "", 0, ::refvarAlgSW ) );
+}
+
+#ifdef _WIN32
+#define PRSIZET "I"
+#else
+#define PRSIZET "z"
+#endif
+
+string print_refvar_obj (::RefVariation const* obj)
+{
+    size_t allele_len = 0, allele_start = 0, allele_len_on_ref = 0;
+    char const* allele = NULL;
+    ::RefVariationGetAllele( obj, & allele, & allele_len, & allele_start );
+    ::RefVariationGetAlleleLenOnRef ( obj, & allele_len_on_ref );
+
+    //printf ("<no ref name>:%"PRSIZET"u:%"PRSIZET"u:%.*s\n", allele_start, allele_len_on_ref, (int)allele_len, allele);
+        
+    return string ( allele, allele_len );
+}
+
+#undef PRSIZET
+
+
+string vrefvar_bounds (::RefVarAlg alg, char const* ref,
+    size_t ref_len, size_t pos, size_t len_on_ref,
+    char const* query, size_t query_len)
+{
+
+    ::RefVariation* obj;
+
+    rc_t rc = ::RefVariationIUPACMake ( & obj, ref, ref_len, pos, len_on_ref, query, query_len, alg );
+
+    string ret = print_refvar_obj ( obj );
+
+    if ( rc == 0 )
+        ::RefVariationRelease( obj );
+        
+    return ret;
+}
+
+string vrefvar_bounds_n(::RefVarAlg alg)
+{
+    //                  01234567890123456789
+    char const ref[] = "NNNNNNNNNNTAACCCTAAC";
+    //                       CCCCTTAGG-
+
+    size_t pos = 5, len_on_ref = 10;
+    char const query[] = "CCCCTTAGG";
+
+    return vrefvar_bounds ( alg, ref, strlen(ref), pos, len_on_ref, query, strlen(query) );
+}
+
+string vrefvar_bounds_0(::RefVarAlg alg)
+{
+    //                  01234567890123456789
+    char const ref[] = "TAACCCTAAC";
+    //                  TTAGG-
+
+    size_t pos = 0, len_on_ref = 5;
+    char const query[] = "TAGG";
+
+    return vrefvar_bounds ( alg, ref, strlen(ref), pos, len_on_ref, query, strlen(query) );
+}
+
+string vrefvar_bounds_N0(::RefVarAlg alg)
+{
+    //                  01234567890123456789
+    char const ref[] = "NNNNNTAACCCTAAC";
+    //                  CCCCTTTAGG-
+
+    size_t pos = 0, len_on_ref = 10;
+    char const query[] = "CCCCTTAGG";
+
+    return vrefvar_bounds ( alg, ref, strlen(ref), pos, len_on_ref, query, strlen(query) );
+}
+
+TEST_CASE ( RefVariation_bounds_N )
+{
+    //printf ("TODO: this test is derived from the real example which hangs up now (2015-12-14):\n");
+    //printf ("echo \"67068302 NC_000001.10:9995:10:CCCCTTAGG\" | var-expand --algorithm=sw\n");
+    
+    REQUIRE_EQ ( string ( "NNNNNCCCCTTAGGCTAA" ), vrefvar_bounds_n ( ::refvarAlgSW ) );
+    REQUIRE_EQ ( string ( "CCCCTTAGGC" ), vrefvar_bounds_n ( ::refvarAlgRA ) );
+
+    REQUIRE_EQ ( string ( "AGGC" ), vrefvar_bounds_0 ( ::refvarAlgSW ) );
+    REQUIRE_EQ ( string ( "TAGG" ), vrefvar_bounds_0 ( ::refvarAlgRA ) );
+
+    REQUIRE_EQ ( string ( "CCCCTTAGGCTAA" ), vrefvar_bounds_N0 ( ::refvarAlgSW ) );
+    REQUIRE_EQ ( string ( "CCCCTTAGGC" ), vrefvar_bounds_N0 ( ::refvarAlgRA ) );
+}
+
+// Nucstrstr
+static 
+void 
+ConvertAsciiTo2NAPacked ( const string& p_read, unsigned char* pBuf2NA, size_t nBuf2NASize )
+{
+    static unsigned char map [ 1 << ( sizeof ( char ) * 8 ) ];
+    map['A'] = map['a'] = 0;
+    map['C'] = map['c'] = 1;
+    map['G'] = map['g'] = 2;
+    map['T'] = map['t'] = 3;
+    
+    static size_t shiftLeft [ 4 ] = { 6, 4, 2, 0 };
+
+    fill ( pBuf2NA, pBuf2NA + nBuf2NASize, 0 );
+    
+    for ( size_t iChar = 0; iChar < p_read . size (); ++iChar )
+    {
+        size_t iByte = iChar / 4;
+        if ( iByte > nBuf2NASize )
+        {
+            assert ( false );
+            break;
+        }
+
+        pBuf2NA[iByte] |= map [ size_t ( p_read [ iChar ] ) ] << shiftLeft [ iChar % 4 ];
+    }
+}
+
+static
+int
+RunNucStrtr ( const string& p_ref, const string& p_query, bool p_positional )
+{
+    unsigned char buf2na [ 1024 ];
+    ConvertAsciiTo2NAPacked ( p_ref, buf2na, sizeof ( buf2na ) );
+    
+    NucStrstr *nss;
+    if ( NucStrstrMake ( & nss, p_positional ? 1 : 0, p_query . c_str (), p_query . size () ) != 0 )
+        throw logic_error ( "RunNucStrtr: NucStrstrMake() failed" );
+    unsigned int selflen = 0u;
+    // NB: for now, all searches start are from the beginning ( nucstrstr.h says "may be >= 4"; not sure what that means )
+    const unsigned int pos = 0;
+    int ret = NucStrstrSearch ( nss, ( const void * ) buf2na, pos, p_ref . size () - pos, & selflen );
+    NucStrstrWhack ( nss );
+    return ret;
+}
+
+TEST_CASE ( Nucstrstr_NonPositional_NotFound )
+{
+    REQUIRE_EQ ( 0, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGT", "ACTA", false ) );
+}
+
+TEST_CASE ( Nucstrstr_NonPositional_Found_AtStart )
+{
+    REQUIRE_NE ( 0, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGT", "ACGTACGTACG", false ) );
+}
+
+TEST_CASE ( Nucstrstr_NonPositional_Found_InMiddle )
+{
+    REQUIRE_NE ( 0, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGT", "GTACGTACG", false ) );
+}
+
+TEST_CASE ( Nucstrstr_Positional_NoExpr_NotFound )
+{
+    REQUIRE_EQ ( 0, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGT", "ACCGT", true ) );
+}
+
+TEST_CASE ( Nucstrstr_Positional_NoExpr_Found_AtStart )
+{
+    REQUIRE_EQ ( 1, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGT", "ACGTACGTACG", true ) );
+}
+
+TEST_CASE ( Nucstrstr_Positional_NoExpr_Found_InMiddle )
+{
+    REQUIRE_EQ ( 4, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGT", "TACGTACG", true ) );
+}
+
+TEST_CASE ( Nucstrstr_Positional_Not_False )
+{
+    REQUIRE_EQ ( 0, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGT", "!TACGTACG", true ) );
+}
+TEST_CASE ( Nucstrstr_Positional_Not_True )
+{   // "!" returns only 0 or 1, not the position
+    REQUIRE_EQ ( 1, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGT", "!AG", true ) );
+}
+
+TEST_CASE ( Nucstrstr_Positional_Caret_Found )
+{   
+    REQUIRE_EQ ( 1, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGT", "^AC", true ) );
+}
+TEST_CASE ( Nucstrstr_Positional_Caret_NotFound )
+{   
+    REQUIRE_EQ ( 0, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGT", "^C", true ) );
+}
+
+TEST_CASE ( Nucstrstr_Positional_Dollar_Found )
+{   
+    REQUIRE_EQ ( 33, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGTTGCA", "TGCA$", true ) );
+}
+TEST_CASE ( Nucstrstr_Positional_Dollar_NotFound )
+{   
+    REQUIRE_EQ ( 0, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGTTGCAA", "TGCA$", true ) );
+}
+
+TEST_CASE ( Nucstrstr_Positional_OR_Found_1 )
+{   
+    REQUIRE_EQ ( 4, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGTTGCA", "TGAA|TACG", true ) );
+}
+TEST_CASE ( Nucstrstr_Positional_OR_Found_2 )
+{   
+    REQUIRE_EQ ( 4, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGTTGCA", "TGAA||TACG", true ) );
+}
+TEST_CASE ( Nucstrstr_Positional_OR_Found_FirstMatchPositionReported )
+{   
+    REQUIRE_EQ ( 2, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGTTGCA", "TGAA|CGT|TACG", true ) );
+}
+TEST_CASE ( Nucstrstr_Positional_OR_NotFound )
+{   
+    REQUIRE_EQ ( 0, RunNucStrtr ( "ACGTACGTACGTACGTACGTACGTACGTACGTTGCA", "TGAA|TACA", true ) );
+}
+
+TEST_CASE ( Nucstrstr_Positional_AND_Found_LastMatchPositionReported )
+{   
+    REQUIRE_EQ ( 4, RunNucStrtr ( "ACGTACGT", "CGTA&TACG", true ) );
+}
+TEST_CASE ( Nucstrstr_Positional_AND_NotFound )
+{   
+    REQUIRE_EQ ( 0, RunNucStrtr ( "ACGTACGT", "TACG&TACA", true ) );
+}
+
+TEST_CASE ( Nucstrstr_Positional_AND_OR_Found_1 )
+{   
+    REQUIRE_EQ ( 3, RunNucStrtr ( "ACGTACGT", "CGTA&TACC|GTAC", true ) );
+}
+TEST_CASE ( Nucstrstr_Positional_AND_OR_Found_2 )
+{   
+    REQUIRE_EQ ( 3, RunNucStrtr ( "ACGTACGT", "CGTA&(TACC|GTAC)", true ) );
+}
+TEST_CASE ( Nucstrstr_Positional_AND_OR_Found_3 )
+{   
+    REQUIRE_EQ ( 2, RunNucStrtr ( "ACGTACGT", "(TACC|GTAC)&&CGTA", true ) );
+}
+
+TEST_CASE ( Nucstrstr_Positional_AND_OR_NOT_NotFound )
+{   
+    REQUIRE_EQ ( 0, RunNucStrtr ( "ACGTACGT", "(TACC|GTAC)&&!CGTA", true ) );
+}
+TEST_CASE ( Nucstrstr_Positional_AND_OR_NOT_Found )
+{   
+    REQUIRE_EQ ( 1, RunNucStrtr ( "ACGTACGT", "(TACC|GTAC)&&!CATA", true ) );
+}
+
+TEST_CASE ( Nucstrstr_Positional_Error )
+{   
+    REQUIRE_THROW ( RunNucStrtr ( "ACGTACGT", "(TACC", true ) );
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-search";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc = TestSuiteSearch(argc, argv);
+    return rc;
+}
+
+} // end of extern "C"
diff --git a/test/sraxf/Makefile b/test/sraxf/Makefile
new file mode 100644
index 0000000..3083aee
--- /dev/null
+++ b/test/sraxf/Makefile
@@ -0,0 +1,60 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/sraxf
+
+TEST_TOOLS = \
+	test-fix_read_seg \
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#----------------------------------------------------------------
+# fix_read_seg-test
+#
+
+SRATEST_SRC = \
+	fix_read_seg-test
+
+SRATEST_OBJ = \
+	$(addsuffix .$(OBJX),$(SRATEST_SRC))
+
+SRATEST_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-vdb \
+
+$(TEST_BINDIR)/test-fix_read_seg: $(SRATEST_OBJ)
+	$(LP) --exe -o $@ $^ $(SRATEST_LIB)
+
diff --git a/test/sraxf/fix_read_seg-test.cpp b/test/sraxf/fix_read_seg-test.cpp
new file mode 100644
index 0000000..561d41d
--- /dev/null
+++ b/test/sraxf/fix_read_seg-test.cpp
@@ -0,0 +1,131 @@
+#include <klib/text.h> /* uint16_t */
+#include <assert.h>
+#include <math.h>
+
+#include <ktst/unit_test.hpp> /* TEST_SUITE */
+#include <kapp/main.h> /* KAppVersion */
+
+#include <os-native.h> /* lround on Windows, uint16_t */
+#include <string.h> /* memset */
+
+#include "../../libs/sraxf/fix_read_seg_impl.h"
+
+ver_t CC KAppVersion ( void ) { return 0; }
+rc_t CC Usage ( const Args * args ) { return 0; }
+const char UsageDefaultName[] = "";
+rc_t UsageSummary (const char * progname) { return 0; }
+
+TEST_SUITE(FixReadSegTestSuite);
+
+TEST_CASE(_0_reads) {
+    uint16_t rs_src[] = { 0 };
+    uint32_t nreads = 0;
+    uint32_t rs_dst[] = { 0 };
+    fix_read_seg_impl(rs_src, nreads, 0, rs_dst);
+}
+
+TEST_CASE(_1_empty_read) {
+    uint16_t rs_src[] = { 0, 0 };
+    uint32_t nreads = 1;
+    uint32_t rs_dst[] = { 0, 0 };
+    fix_read_seg_impl(rs_src, nreads, 0, rs_dst);
+}
+
+TEST_CASE(_1_read) {
+    uint16_t rs_src[] = { 2, 0 };
+    uint32_t nreads = 1;
+    uint32_t spot_len = 1;
+    uint32_t dst[] = { 1, 0 };
+    fix_read_seg_impl(rs_src, nreads, spot_len, dst);
+    CHECK_EQ(dst[0], (uint32_t)0);
+    CHECK_EQ(dst[1], (uint32_t)1);
+}
+
+TEST_CASE(total_0_read_2) {
+    uint16_t rs_src[] = { 9, 0, 8, 0 };
+    uint32_t nreads = 2;
+    uint32_t spot_len = 1;
+    uint32_t dst[] = { 2, 2, 2, 2 };
+    fix_read_seg_impl(rs_src, nreads, spot_len, dst);
+    CHECK_EQ(dst[0], (uint32_t)0);
+    CHECK_EQ(dst[1], (uint32_t)1);
+    CHECK_EQ(dst[2], (uint32_t)1);
+    CHECK_EQ(dst[3], (uint32_t)0);
+
+    spot_len = 2;
+    memset(dst, 2, sizeof dst);
+    fix_read_seg_impl(rs_src, nreads, spot_len, dst);
+    CHECK_EQ(dst[0], (uint32_t)0);
+    CHECK_EQ(dst[1], (uint32_t)1);
+    CHECK_EQ(dst[2], (uint32_t)1);
+    CHECK_EQ(dst[3], (uint32_t)1);
+}
+
+TEST_CASE(total_eq_spotlen_read_1) {
+    uint16_t rs_src[] = { 9, 1 };
+    uint32_t nreads = 1;
+    uint32_t spot_len = 1;
+    uint32_t dst[] = { 2, 2, 2, 2 };
+    fix_read_seg_impl(rs_src, nreads, spot_len, dst);
+    CHECK_EQ(dst[0], (uint32_t)0);
+    CHECK_EQ(dst[1], (uint32_t)1);
+}
+
+TEST_CASE(total_eq_spotlen_read_2) {
+    uint16_t rs_src[] = { 9, 1, 8, 2 };
+    uint32_t nreads = 2;
+    uint32_t spot_len = 3;
+    uint32_t dst[] = { 7, 7, 7, 7 };
+    fix_read_seg_impl(rs_src, nreads, spot_len, dst);
+    CHECK_EQ(dst[0], (uint32_t)0);
+    CHECK_EQ(dst[1], (uint32_t)1);
+    CHECK_EQ(dst[2], (uint32_t)1);
+    CHECK_EQ(dst[3], (uint32_t)2);
+}
+
+TEST_CASE(total_gt_spotlen_read_1) {
+    uint16_t rs_src[] = { 9, 9 };
+    uint32_t nreads = 1;
+    uint32_t spot_len = 1;
+    uint32_t dst[] = { 7, 7, 7, 7 };
+    fix_read_seg_impl(rs_src, nreads, spot_len, dst);
+    CHECK_EQ(dst[0], (uint32_t)0);
+    CHECK_EQ(dst[1], (uint32_t)1);
+}
+
+TEST_CASE(total_gt_spotlen_read_2) {
+    uint16_t rs_src[] = { 9, 9, 8, 9 };
+    uint32_t nreads = 2;
+    uint32_t spot_len = 1;
+    uint32_t dst[] = { 7, 7, 7, 7 };
+    fix_read_seg_impl(rs_src, nreads, spot_len, dst);
+    CHECK_EQ(dst[0], (uint32_t)0);
+    CHECK_EQ(dst[1], (uint32_t)1);
+    CHECK_EQ(dst[2], (uint32_t)1);
+    CHECK_EQ(dst[3], (uint32_t)0);
+}
+
+TEST_CASE(total_lt_spotlen_read_1) {
+    uint16_t rs_src[] = { 9, 1 };
+    uint32_t nreads = 1;
+    uint32_t spot_len = 9;
+    uint32_t dst[] = { 7, 7, 7, 7 };
+    fix_read_seg_impl(rs_src, nreads, spot_len, dst);
+    CHECK_EQ(dst[0], (uint32_t)0);
+    CHECK_EQ(dst[1], (uint32_t)9);
+}
+
+TEST_CASE(total_lt_spotlen_read_2) {
+    uint16_t rs_src[] = { 9, 1, 8, 1 };
+    uint32_t nreads = 2;
+    uint32_t spot_len = 9;
+    uint32_t dst[] = { 7, 7, 7, 7 };
+    fix_read_seg_impl(rs_src, nreads, spot_len, dst);
+    CHECK_EQ(dst[0], (uint32_t)0);
+    CHECK_EQ(dst[1], (uint32_t)1);
+    CHECK_EQ(dst[2], (uint32_t)1);
+    CHECK_EQ(dst[3], (uint32_t)8);
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{ return FixReadSegTestSuite(argc, argv); }
diff --git a/test/vdb/.gitignore b/test/vdb/.gitignore
new file mode 100644
index 0000000..65eef93
--- /dev/null
+++ b/test/vdb/.gitignore
@@ -0,0 +1 @@
+db
diff --git a/test/vdb/Makefile b/test/vdb/Makefile
new file mode 100644
index 0000000..a2c2848
--- /dev/null
+++ b/test/vdb/Makefile
@@ -0,0 +1,246 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/vdb
+
+TEST_TOOLS = \
+	test-vdb \
+	test-wvdb \
+	test-dependencies \
+	test-sparse-col-rw \
+	test-sparse-col-rd \
+	test-blob-val \
+	test-VDB-3060 \
+	test-VDB-3061
+    
+include $(TOP)/build/Makefile.env
+
+
+# make sure runs are not cached in the user repository when running tests
+ifeq ($(wildcard ../../../asm-trace),)
+	ifeq (,$(VDB_CONFIG))
+		VDB_CONFIG = $(shell pwd)/../only-remote-repository.kfg
+	endif
+endif
+
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+runtests: setup 
+
+setup:
+	@ mkdir -p db
+
+.PHONY: $(TEST_TOOLS) setup
+
+clean: stdclean
+
+
+#-------------------------------------------------------------------------------
+# test-vdb
+#
+TEST_VDB_SRC = \
+	test-vdb
+
+TEST_VDB_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_VDB_SRC))
+
+TEST_VDB_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-vdb \
+
+$(TEST_BINDIR)/test-vdb: $(TEST_VDB_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_VDB_LIB)
+
+vdb: test-vdb
+	$(TEST_BINDIR)/test-vdb    
+
+valgrind_vdb: std
+	valgrind --ncbi --show-reachable=no $(TEST_BINDIR)/test-vdb    
+
+#-------------------------------------------------------------------------------
+# test-dependencies
+#
+TEST_DEPS_SRC = \
+	test-dependencies
+
+TEST_DEPS_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_DEPS_SRC))
+
+TEST_DEPS_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-vdb \
+
+$(TEST_BINDIR)/test-dependencies: $(TEST_DEPS_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_DEPS_LIB)
+
+valgrind_deps: std
+	valgrind --ncbi --show-reachable=no $(TEST_BINDIR)/test-dependencies    
+
+#-------------------------------------------------------------------------------
+# test-wvdb
+#
+TEST_WVDB_SRC = \
+	test-wvdb
+
+TEST_WVDB_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_WVDB_SRC))
+
+TEST_WVDB_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-wvdb \
+
+$(TEST_BINDIR)/test-wvdb: $(TEST_WVDB_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_WVDB_LIB)
+
+wvdb: test-wvdb
+	$(TEST_BINDIR)/test-wvdb    
+
+valgrind_wvdb: std
+	valgrind --ncbi --show-reachable=no $(TEST_BINDIR)/test-wvdb    
+
+#-------------------------------------------------------------------------------
+# test-sparse-col
+#  We will compile the same test file first in read/write mode, create DB and
+#  run tests using libncbi-wvdb library; then compile the same test with -DREAD_ONLY 
+#  and link it against read-only lincbi-vdb library
+TEST_SPARSE_COL_SRC = \
+	test-sparse-col
+
+TEST_SPARSE_COL_OBJ_RW = \
+	$(addsuffix .$(OBJX),$(TEST_SPARSE_COL_SRC)-rw)
+	
+TEST_SPARSE_COL_OBJ_RD = \
+	$(addsuffix .$(OBJX),$(TEST_SPARSE_COL_SRC)-rd)
+
+TEST_SPARSE_COL_LIB = \
+	-skapp \
+	-sktst \
+
+$(TEST_SPARSE_COL_OBJ_RW): $(TEST_SPARSE_COL_SRC).cpp
+	$(CP) -o $@ $(OPT) $< $(LOC_INFO) -D__file_ext__=cpp
+
+$(TEST_SPARSE_COL_OBJ_RD): $(TEST_SPARSE_COL_SRC).cpp
+	$(CP) -o $@ $(OPT) $< $(LOC_INFO) -D__file_ext__=cpp -DREAD_ONLY	
+
+$(TEST_BINDIR)/test-sparse-col-rw: $(TEST_SPARSE_COL_OBJ_RW)
+	$(LP) --exe -o $@ $^ $(TEST_SPARSE_COL_LIB) -sncbi-wvdb
+
+$(TEST_BINDIR)/test-sparse-col-rd: $(TEST_SPARSE_COL_OBJ_RD)
+	$(LP) --exe -o $@ $^ $(TEST_SPARSE_COL_LIB) -sncbi-vdb
+
+sparse-col: test-sparse-col-rw test-sparse-col-rd
+	$(TEST_BINDIR)/test-sparse-col-rw
+	$(TEST_BINDIR)/test-sparse-col-rd
+
+valgrind_sparse-col: std
+	valgrind --ncbi --show-reachable=no $(TEST_BINDIR)/test-sparse-col-rw
+	valgrind --ncbi --show-reachable=no $(TEST_BINDIR)/test-sparse-col-rd   
+	
+#-------------------------------------------------------------------------------
+# test-blob-val
+#
+TEST_BLOB_VAL_SRC = \
+	test-blob-val
+
+TEST_BLOB_VAL_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_BLOB_VAL_SRC))
+	
+TEST_BLOB_VAL_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-vdb \
+
+$(TEST_BINDIR)/test-blob-val: $(TEST_BLOB_VAL_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_BLOB_VAL_LIB)
+
+blob-val: test-blob-val
+	$(TEST_BINDIR)/test-blob-val
+
+#-------------------------------------------------------------------------------
+# SYS-224064
+#
+SYS_224064_SRC = \
+	SYS-224064
+
+SYS_224064_OBJ = \
+	$(addsuffix .$(OBJX),$(SYS_224064_SRC))
+
+SYS_224064_LIB = \
+	-sncbi-vdb \
+
+$(TEST_BINDIR)/SYS-224064: $(SYS_224064_OBJ)
+	$(LP) --exe -o $@ $^ $(SYS_224064_LIB)
+
+SYS-224064: makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+
+#-------------------------------------------------------------------------------
+# VDB-3060
+#
+VDB_3060_SRC = \
+	test-VDB-3060
+
+VDB_3060_OBJ = \
+	$(addsuffix .$(OBJX),$(VDB_3060_SRC))
+
+VDB_3060_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-vdb
+
+$(TEST_BINDIR)/test-VDB-3060: $(VDB_3060_OBJ)
+	$(LP) --exe -o $@ $^ $(VDB_3060_LIB)
+
+VDB-3060: test-VDB-3060
+	$(TEST_BINDIR)/test-VDB-3060
+
+#-------------------------------------------------------------------------------
+# VDB-3061
+#
+VDB_3061_SRC = \
+	test-VDB-3061
+
+VDB_3061_OBJ = \
+	$(addsuffix .$(OBJX),$(VDB_3061_SRC))
+
+VDB_3061_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-vdb
+
+$(TEST_BINDIR)/test-VDB-3061: $(VDB_3061_OBJ)
+	$(LP) --exe -o $@ $^ $(VDB_3061_LIB)
+
+VDB-3061: test-VDB-3061
+	$(TEST_BINDIR)/test-VDB-3061
diff --git a/test/vdb/SYS-224064.cpp b/test/vdb/SYS-224064.cpp
new file mode 100644
index 0000000..ec2ae39
--- /dev/null
+++ b/test/vdb/SYS-224064.cpp
@@ -0,0 +1,237 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/manager.h>
+#include <vdb/database.h> 
+#include <vdb/table.h> 
+#include <vdb/cursor.h> 
+#include <vdb/vdb-priv.h>
+#include <sra/sraschema.h> // VDBManagerMakeSRASchema
+#include <vdb/schema.h> /* VSchemaRelease */
+
+#include <ktst/unit_test.hpp> // TEST_CASE
+#include <kfg/config.h> 
+#include <klib/printf.h>
+
+#include <iostream>
+#include <string>
+
+#define NCBI_TRACES01_PATH "/panfs/traces01"
+
+static
+std :: string print_err ( const char * expr, rc_t rc )
+{
+    size_t num_writ;
+    char buffer [ 4096 ];
+    rc_t rc2 = string_printf ( buffer, sizeof buffer, & num_writ, "%s: rc = %R", expr, rc );
+    if ( rc2 != 0 )
+        return std :: string ( "wow!" );
+    return std :: string ( buffer, num_writ );
+}
+
+#define CALL( x ) \
+    if ( ( rc = x ) != 0 ) throw print_err ( #x, rc )
+
+#define _ASSERT( x ) \
+    if ( ! ( x ) ) throw std :: string ( # x )
+
+using namespace std;
+
+int LowLevelTest(void)
+{
+    rc_t rc = 0;
+
+    cout << "LowLevelTest for memory overuse..." << endl;
+    const char* file_name = NCBI_TRACES01_PATH
+        "/compress/1KG/CEU/NA12249/exome.ILLUMINA.MOSAIK.csra";
+    const VDBManager* mgr = 0;
+    CALL(VDBManagerMakeRead(&mgr, 0));
+        
+    const VDatabase* db = 0;
+    CALL(VDBManagerOpenDBRead(mgr, &db, 0, file_name));
+        
+    const VTable* ref_table = 0;
+    CALL(VDatabaseOpenTableRead(db, &ref_table, "REFERENCE"));
+    
+    const VCursor* ref_cursor = 0;
+    CALL(VTableCreateCursorRead(ref_table, &ref_cursor));
+    CALL(VCursorPermitPostOpenAdd(ref_cursor));
+    CALL(VCursorOpen(ref_cursor));
+    
+    uint32_t align_column;
+    CALL(VCursorAddColumn(ref_cursor, &align_column, "PRIMARY_ALIGNMENT_IDS"));
+    
+    const VTable* align_table = 0;
+    CALL(VDatabaseOpenTableRead(db, &align_table, "PRIMARY_ALIGNMENT"));
+
+    const VCursor* align_cursor = 0;
+    CALL(VTableCreateCursorRead(align_table, &align_cursor));
+    CALL(VCursorPermitPostOpenAdd(align_cursor));
+    CALL(VCursorOpen(align_cursor));
+    
+    uint32_t spot_id_column;
+    CALL(VCursorAddColumn(align_cursor, &spot_id_column,
+                          "SEQ_SPOT_ID"));
+    uint32_t read_id_column;
+    CALL(VCursorAddColumn(align_cursor, &read_id_column,
+                          "SEQ_READ_ID"));
+
+    const VTable* seq_table = 0;
+    CALL(VDatabaseOpenTableRead(db, &seq_table, "SEQUENCE"));
+
+    const VCursor* seq_cursor = 0;
+    CALL(VTableCreateCursorRead(seq_table, &seq_cursor));
+    CALL(VCursorPermitPostOpenAdd(seq_cursor));
+    CALL(VCursorOpen(seq_cursor));
+    
+    uint32_t trim_len_column;
+    CALL(VCursorAddColumn(seq_cursor, &trim_len_column, "TRIM_LEN"));
+    
+    for ( int64_t ref_row = 582444; ref_row <= 582444; ++ref_row ) {
+        const int64_t* align_rows = 0;
+        size_t align_count = 0;
+        {
+            const void* data;
+            uint32_t bit_offset, bit_length;
+            uint32_t elem_count;
+            CALL(VCursorCellDataDirect(ref_cursor, ref_row,
+                                       align_column,
+                                       &bit_length, &data, &bit_offset,
+                                       &elem_count));
+            _ASSERT(bit_length == 8*sizeof(int64_t));
+            _ASSERT(bit_offset == 0);
+            align_rows = static_cast<const int64_t*>(data);
+            align_count = elem_count;
+        }
+        
+        for ( size_t i = 0; i < align_count; ++i ) {
+            int64_t align_row = align_rows[i];
+            int64_t spot_id = 0;
+            uint32_t read_id = 0;
+            {
+                const void* data;
+                uint32_t bit_offset, bit_length;
+                uint32_t elem_count;
+                CALL(VCursorCellDataDirect(align_cursor, align_row,
+                                           spot_id_column,
+                                           &bit_length, &data, &bit_offset,
+                                           &elem_count));
+                _ASSERT(bit_length == 8*sizeof(int64_t));
+                _ASSERT(bit_offset == 0);
+                _ASSERT(elem_count == 1);
+                spot_id = *static_cast<const int64_t*>(data);
+                _ASSERT(spot_id);
+            }
+            {
+                const void* data;
+                uint32_t bit_offset, bit_length;
+                uint32_t elem_count;
+                CALL(VCursorCellDataDirect(align_cursor, align_row,
+                                           read_id_column,
+                                           &bit_length, &data, &bit_offset,
+                                           &elem_count));
+                _ASSERT(bit_length == 8*sizeof(uint32_t));
+                _ASSERT(bit_offset == 0);
+                _ASSERT(elem_count == 1);
+                read_id = *static_cast<const uint32_t*>(data);
+                _ASSERT(read_id);
+            }
+
+            uint32_t trim_len = 0;
+            if ( 1 )
+            {
+                const void* data;
+                uint32_t bit_offset, bit_length;
+                uint32_t elem_count;
+                CALL(VCursorCellDataDirect(seq_cursor, spot_id,
+                                           trim_len_column,
+                                           &bit_length, &data, &bit_offset,
+                                           &elem_count));
+                _ASSERT(bit_length == 8*sizeof(uint32_t));
+                _ASSERT(bit_offset == 0);
+                _ASSERT(elem_count == 1);
+                trim_len = *static_cast<const uint32_t*>(data);
+            }
+
+            cout << " " << align_row << ":" << spot_id << "." << read_id
+                 << endl;
+        }
+    }
+    CALL(VCursorRelease(seq_cursor));
+    CALL(VTableRelease(seq_table));
+    CALL(VCursorRelease(align_cursor));
+    CALL(VTableRelease(align_table));
+    CALL(VCursorRelease(ref_cursor));
+    CALL(VTableRelease(ref_table));
+    CALL(VDatabaseRelease(db));
+    CALL(VDBManagerRelease(mgr));
+    cout << "LowLevelTest done" << endl;
+    return 0;
+}
+
+int main ( int argc, char * argv [] )
+{
+    int status = 7;
+
+    try
+    {
+        status = LowLevelTest ();
+    }
+    catch ( std :: string & x )
+    {
+        std :: cerr
+            << "failed: "
+            << x
+            << endl
+            ;
+    }
+    catch ( const char x [] )
+    {
+        std :: cerr
+            << "failed: "
+            << x
+            << endl
+            ;
+    }
+    catch ( std :: exception & x )
+    {
+        std :: cerr
+            << "failed: "
+            << x . what ()
+            << endl
+            ;
+    }
+    catch ( ... )
+    {
+        std :: cerr
+            << "failed: "
+            << "unknown exception"
+            << endl
+            ;
+    }
+
+    return status;
+}
diff --git a/test/vdb/db/blob_val_inv_chsum.sra b/test/vdb/db/blob_val_inv_chsum.sra
new file mode 100644
index 0000000..5585592
Binary files /dev/null and b/test/vdb/db/blob_val_inv_chsum.sra differ
diff --git a/test/vdb/kfg/empty/empty.kfg b/test/vdb/kfg/empty/empty.kfg
new file mode 100644
index 0000000..831f76c
--- /dev/null
+++ b/test/vdb/kfg/empty/empty.kfg
@@ -0,0 +1 @@
+repository/remote/main/CGI/resolver-cgi = "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi"
diff --git a/test/vdb/kfg/linux/test-dependencies.kfg b/test/vdb/kfg/linux/test-dependencies.kfg
new file mode 100644
index 0000000..3a0e575
--- /dev/null
+++ b/test/vdb/kfg/linux/test-dependencies.kfg
@@ -0,0 +1,3 @@
+repository/site/main/tracearc/apps/sra/volumes/ncbi = "sra17:sra16:sra15:sra14:sra13:sra12:sra11:sra10:sra9:sra8:sra7:sra6:sra5:sra4:sra3:sra2:sra1:sra0"
+repository/site/main/tracearc/apps/refseq/volumes/refseq = "refseq"
+repository/site/main/tracearc/root = "/netmnt/traces04"
diff --git a/test/vdb/test-VDB-3060.cpp b/test/vdb/test-VDB-3060.cpp
new file mode 100644
index 0000000..67a5e4b
--- /dev/null
+++ b/test/vdb/test-VDB-3060.cpp
@@ -0,0 +1,411 @@
+// ===========================================================================
+//
+//                            PUBLIC DOMAIN NOTICE
+//               National Center for Biotechnology Information
+//
+//  This software/database is a "United States Government Work" under the
+//  terms of the United States Copyright Act.  It was written as part of
+//  the author's official duties as a United States Government employee and
+//  thus cannot be copyrighted.  This software/database is freely available
+//  to the public for use. The National Library of Medicine and the U.S.
+//  Government have not placed any restriction on its use or reproduction.
+//
+//  Although all reasonable efforts have been taken to ensure the accuracy
+//  and reliability of the software and data, the NLM and the U.S.
+//  Government do not and cannot warrant the performance or results that
+//  may be obtained by using this software or data. The NLM and the U.S.
+//  Government disclaim all warranties, express or implied, including
+//  warranties of performance, merchantability or fitness for any particular
+//  purpose.
+//
+//  Please cite the author in any work or product based on this material.
+//
+// ===========================================================================
+
+#include <vdb/manager.h> // VDBManager
+#include <kdb/manager.h> // KDBManager
+#include <kdb/kdb-priv.h>
+#include <vdb/vdb-priv.h>
+
+#include <ktst/unit_test.hpp> // TEST_CASE
+#include <vfs/path.h>
+#include <vfs/manager.h>
+#include <klib/text.h> 
+#include <klib/out.h> 
+#include <klib/printf.h> 
+#include <kfs/directory.h> 
+#include <kfg/config.h> 
+
+#include <sysalloc.h>
+#include <cstdlib>
+#include <stdexcept>
+
+using namespace std;
+
+TEST_SUITE( VDB_3060 )
+
+std::string original_value = std::string( "" );
+
+const VDBManager * vdb_mgr = NULL;
+VFSManager * vfs_mgr = NULL;
+
+static rc_t make_global_managers( void )
+{
+    rc_t rc = VDBManagerMakeRead( &vdb_mgr, NULL );
+    if ( rc != 0 )
+        std::cout << "VDB-3060.VdbFixture: VDBManagerMakeRead() failed" << std::endl;
+    else
+    {
+        rc = VFSManagerMake ( &vfs_mgr );
+        if ( rc != 0 )
+            std::cout << "VdbFixture: VFSManagerMake() failed" << std::endl;
+    }
+    return rc;
+}
+
+static void release_global_managers( void )
+{
+    VFSManagerRelease ( vfs_mgr );
+    VDBManagerRelease ( vdb_mgr );
+}
+
+
+/*
+    test VDBManagerGetCacheRoot() with invalid and valid parameters
+    print the currently stored value
+    store this value in the global: original_value
+*/
+TEST_CASE( GetCacheRoot_1 )
+{
+    VPath const * vpath = NULL;
+    rc_t rc = VDBManagerGetCacheRoot( NULL, &vpath );
+    if ( rc == 0 )
+        FAIL( "FAIL: VDBManagerGetCacheRoot( NULL, &vpath ) succeed" );
+    rc = VDBManagerGetCacheRoot( vdb_mgr, NULL );
+    if ( rc == 0 )
+        FAIL( "FAIL: VDBManagerGetCacheRoot( mgr, NULL ) succeed" );
+    rc = VDBManagerGetCacheRoot( vdb_mgr, &vpath );
+    if ( rc != 0 )
+        FAIL( "FAIL: VDBManagerGetCacheRoot( mgr, &vpath ) failed" );
+    if ( vpath == NULL )
+        FAIL( "FAIL: VDBManagerGetCacheRoot( mgr, &vpath ) returned vpath == NULL " );
+
+    String const * spath = NULL;
+    rc = VPathMakeString ( vpath, &spath );
+    if ( rc != 0 )
+        FAIL( "FAIL: VPathMakeString( vpath, &spatch ) failed" );
+    
+    original_value = std::string( spath->addr, spath->size );
+    std::cout << "original value: " << original_value << std::endl;
+    
+    if ( spath != NULL )
+        StringWhack( spath );
+
+    if ( vpath != NULL )
+        VPathRelease( vpath );
+}
+
+const char other_path[] = "/some/other/path";
+
+/*
+    test VDBManagerSetCacheRoot() with invalid and valid parameters
+    set the value to "/home/raetzw/somepath"
+*/
+TEST_CASE( SetCacheRoot_1 )
+{
+    rc_t rc = VDBManagerSetCacheRoot( vdb_mgr, NULL );
+    if ( rc == 0 )
+        FAIL( "FAIL: VDBManagerSetCacheRoot( mgr, NULL ) succeed" );
+
+    VPath * vpath;
+    rc = VFSManagerMakePath ( vfs_mgr, &vpath, other_path );
+    if ( rc != 0 )
+        FAIL( "FAIL: VFSManagerMakePath() failed" );
+        
+    rc = VDBManagerSetCacheRoot( NULL, vpath );
+    if ( rc == 0 )
+        FAIL( "FAIL: VDBManagerSetCacheRoot( NULL, vpath ) succeed" );
+        
+    rc = VDBManagerSetCacheRoot( vdb_mgr, vpath );
+    if ( rc != 0 )
+        FAIL( "FAIL: VDBManagerSetCacheRoot( mgr, vpath ) failed" );
+
+    if ( vpath != NULL )
+        VPathRelease( vpath );
+}
+
+
+/*
+    call VDBManagerGetCacheRoot() to verify that the new value
+    is indeed the value we did set in the test-case above
+*/
+TEST_CASE( GetCacheRoot_2 )
+{
+    VPath const * vpath = NULL;
+    rc_t rc = VDBManagerGetCacheRoot( vdb_mgr, &vpath );
+    if ( rc != 0 )
+        FAIL( "FAIL: VDBManagerGetCacheRoot( mgr, &vpath ) failed" );
+    if ( vpath == NULL )
+        FAIL( "FAIL: VDBManagerGetCacheRoot( mgr, &vpath ) returned vpath == NULL " );
+
+    String const * spath = NULL;
+    rc = VPathMakeString ( vpath, &spath );
+    if ( rc != 0 )
+        FAIL( "FAIL: VPathMakeString( vpath, &spatch ) failed" );
+    
+    std::string s1 = std::string( spath->addr, spath->size );
+    std::string s2 = std::string( other_path );
+    std::cout << "after setting different value: " << s1;
+    if ( s1 == s2 )
+        std::cout << " - as expected" << std::endl;
+    else
+    {
+        std::cout << " - we did not expected this!" << std::endl;
+        FAIL( "FAIL: unexpected value after setting a new cache-root" );
+    }
+    
+    if ( spath != NULL )
+        StringWhack( spath );
+
+    if ( vpath != NULL )
+        VPathRelease( vpath );
+}
+
+
+/*
+    put the value stored in the global 'original_value' back in place
+*/
+TEST_CASE( SetCacheRoot_2 )
+{
+    VPath * vpath;
+    rc_t rc = VFSManagerMakePath ( vfs_mgr, &vpath, original_value.c_str() );
+    if ( rc != 0 )
+        FAIL( "FAIL: VFSManagerMakePath() failed" );
+        
+    rc = VDBManagerSetCacheRoot( vdb_mgr, vpath );
+    if ( rc != 0 )
+        FAIL( "FAIL: VDBManagerSetCacheRoot( mgr, vpath ) failed" );
+
+    if ( vpath != NULL )
+        VPathRelease( vpath );
+}
+
+
+/*
+    check if the original value is back in place
+*/
+TEST_CASE( GetCacheRoot_3 )
+{
+    VPath const * vpath = NULL;
+    rc_t rc = VDBManagerGetCacheRoot( vdb_mgr, &vpath );
+    if ( rc != 0 )
+        FAIL( "FAIL: VDBManagerGetCacheRoot( mgr, &vpath ) failed" );
+    if ( vpath == NULL )
+        FAIL( "FAIL: VDBManagerGetCacheRoot( mgr, &vpath ) returned vpath == NULL " );
+
+    String const * spath = NULL;
+    rc = VPathMakeString ( vpath, &spath );
+    if ( rc != 0 )
+        FAIL( "FAIL: VPathMakeString( vpath, &spath ) failed" );
+    
+    std::string s = std::string( spath->addr, spath->size );
+    std::cout << "reverted to original value of: " << s << std::endl;
+
+    if ( s != original_value )
+        FAIL( "FAIL: did not restore original value" );
+        
+    if ( spath != NULL )
+        StringWhack( spath );
+
+    if ( vpath != NULL )
+        VPathRelease( vpath );
+}
+
+TEST_CASE( two_managers )
+{
+    const VDBManager * vdb_mgr2 = NULL;
+    VPath const * vpath1 = NULL;
+    VPath const * vpath2 = NULL;
+    VPath * vpath_new = NULL;
+    String const * spath1 = NULL;
+    String const * spath2 = NULL;
+    rc_t rc;
+    
+    rc = VFSManagerMakePath ( vfs_mgr, &vpath_new, "something_different" );
+    if ( rc != 0 )
+        FAIL( "FAIL: VFSManagerMakePath( vpath_new ) failed" );
+
+    rc = VDBManagerMakeRead( &vdb_mgr2, NULL );
+    if ( rc != 0 )
+        FAIL( "FAIL: VDBManagerMakeRead( &vdb_mgr2 ) failed" );
+
+    rc = VDBManagerSetCacheRoot( vdb_mgr2, vpath_new );
+    if ( rc != 0 )
+        FAIL( "FAIL: VDBManagerSetCacheRoot( vdb_mgr, vpath_new ) failed" );
+
+    rc = VDBManagerGetCacheRoot( vdb_mgr, &vpath1 );
+    if ( rc != 0 )
+        FAIL( "FAIL: VDBManagerGetCacheRoot( vdb_mgr, &vpath1 ) failed" );
+
+    rc = VDBManagerGetCacheRoot( vdb_mgr2, &vpath2 );
+    if ( rc != 0 )
+        FAIL( "FAIL: VDBManagerGetCacheRoot( vdb_mgr1, &vpath2 ) failed" );
+
+    rc = VPathMakeString ( vpath1, &spath1 );
+    if ( rc != 0 )
+        FAIL( "FAIL: VPathMakeString( vpath1, &spath1 ) failed" );
+
+    rc = VPathMakeString ( vpath2, &spath2 );
+    if ( rc != 0 )
+        FAIL( "FAIL: VPathMakeString( vpath2, &spath2 ) failed" );
+
+    std::string s1 = std::string( spath1->addr, spath1->size );
+    std::string s2 = std::string( spath2->addr, spath2->size );
+    if ( s1 != s2 )
+        FAIL( "FAIL: cache-root values do not match" );
+    else
+        std::cout << "cache-root values are the same" << std::endl;
+        
+    if ( spath1 != NULL ) StringWhack( spath1 );
+    if ( spath2 != NULL ) StringWhack( spath2 );
+    if ( vpath_new != NULL ) VPathRelease( vpath_new );    
+    if ( vpath1 != NULL ) VPathRelease( vpath1 );
+    if ( vpath2 != NULL ) VPathRelease( vpath2 );
+    if ( vdb_mgr2 != NULL ) VDBManagerRelease ( vdb_mgr2 );
+}
+
+TEST_CASE( root_tmp )
+{
+    std::cout << "testing root-tmp" << std::endl;
+
+    const KDBManager * kdb_mgr = NULL;
+    rc_t rc = VDBManagerGetKDBManagerRead( vdb_mgr, &kdb_mgr) ;
+    if ( rc != 0 )
+        FAIL( "FAIL: VDBManagerGetKDBManagerRead() failed" );
+
+    VFSManager * vfs_mgr_1 = NULL;
+    rc = KDBManagerGetVFSManager( kdb_mgr, &vfs_mgr_1 );
+    if ( rc != 0 )
+        FAIL( "FAIL: KDBManagerGetVFSManager() failed" );
+    
+    VPath * vpath = NULL;
+    rc = VFSManagerMakeSysPath( vfs_mgr_1, &vpath, "/tmp1" );
+    if ( rc != 0 )
+        FAIL( "FAIL: VFSManagerMakeSysPath() failed" );
+        
+    rc = VDBManagerSetCacheRoot( vdb_mgr, vpath );
+    if ( rc != 0 )
+        FAIL( "FAIL: VDBManagerSetCacheRoot( mgr, vpath ) failed" );
+
+    if ( vpath != NULL ) VPathRelease( vpath );
+    if ( vfs_mgr_1 != NULL ) VFSManagerRelease ( vfs_mgr_1 );
+    if ( kdb_mgr != NULL ) KDBManagerRelease ( kdb_mgr );
+
+}
+
+char * org_home;
+const char HomeSub[] = "test_root_history";
+char new_home[ 1024 ];
+char new_home_buffer[ 1024 ]; /* buffer for putenv has to stay alive! */
+
+
+rc_t write_root( KConfig *cfg, const char * base, const char * cat, const char * sub_cat )
+{
+    char key[ 256 ];
+    size_t num_writ;
+    rc_t rc = string_printf ( key, sizeof key, &num_writ, "/repository/user/%s/%s/root", cat, sub_cat );
+    if ( rc == 0 )
+    {
+        char value[ 256 ];
+        rc = string_printf ( value, sizeof value, &num_writ, "%s/ncbi/%s", base, sub_cat );
+        if ( rc == 0 )
+            rc = KConfigWriteString( cfg, key, value );
+    }
+    return rc;
+}
+
+
+rc_t write_dflt_path( KConfig *cfg, const char * base )
+{
+    char value[ 256 ];
+    size_t num_writ;
+    rc_t rc = string_printf ( value, sizeof value, &num_writ, "%s/ncbi", base );
+    if ( rc == 0 )
+        rc = KConfigWriteString( cfg, "/repository/user/default-path", value );
+    return rc;
+}
+
+rc_t create_test_config( const char * base )
+{
+    KConfig *cfg;
+    rc_t rc = KConfigMake ( &cfg, NULL );
+    if ( rc == 0 )
+    {
+        rc = write_root( cfg, base, "main", "public" );
+        if ( rc == 0 )
+            rc = write_root( cfg, base, "protected", "dbGaP-2956" );
+        if ( rc == 0 )
+            rc = write_root( cfg, base, "protected", "dbGaP-4831" );
+        if ( rc == 0 )
+            rc = write_dflt_path( cfg, base );
+        if ( rc == 0 )
+            rc = KConfigCommit ( cfg );
+        KConfigRelease ( cfg );
+    }
+    return rc;
+}
+
+rc_t prepare_test( const char * sub )
+{
+    org_home = getenv( "HOME" );
+    size_t num_writ;
+    rc_t rc = string_printf ( new_home, sizeof new_home, &num_writ, "%s/%s", org_home, sub );
+    if ( rc == 0 )
+        rc = string_printf ( new_home_buffer, sizeof new_home_buffer, &num_writ, "HOME=%s", new_home );
+    if ( rc == 0 )
+        rc = putenv( new_home_buffer );
+    if ( rc == 0 )
+        rc = create_test_config( org_home );
+    return rc;
+}
+
+void finish_test()
+{
+    /* clear the temp. home-directory */
+    KDirectory * dir;
+    rc_t rc = KDirectoryNativeDir( &dir );
+    if ( rc == 0 )
+    {
+        rc = KDirectoryRemove( dir, true, "%s/%s", org_home, HomeSub );
+        KDirectoryRelease( dir );
+    }
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void ) { return 0x1000000; }
+rc_t CC UsageSummary ( const char * progname ) { return 0; }
+rc_t CC Usage ( const Args * args ) { return 0; }
+const char UsageDefaultName[] = "test-VDB-3060";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t rc = prepare_test( HomeSub );
+    if ( rc == 0 )
+    {
+        rc = make_global_managers();
+        if ( rc == 0 )
+        {
+            rc = VDB_3060( argc, argv );
+            release_global_managers();
+        }
+    }
+    finish_test();
+    return rc;
+}
+
+}
diff --git a/test/vdb/test-VDB-3061.cpp b/test/vdb/test-VDB-3061.cpp
new file mode 100644
index 0000000..05dcfce
--- /dev/null
+++ b/test/vdb/test-VDB-3061.cpp
@@ -0,0 +1,250 @@
+// ===========================================================================
+//
+//                            PUBLIC DOMAIN NOTICE
+//               National Center for Biotechnology Information
+//
+//  This software/database is a "United States Government Work" under the
+//  terms of the United States Copyright Act.  It was written as part of
+//  the author's official duties as a United States Government employee and
+//  thus cannot be copyrighted.  This software/database is freely available
+//  to the public for use. The National Library of Medicine and the U.S.
+//  Government have not placed any restriction on its use or reproduction.
+//
+//  Although all reasonable efforts have been taken to ensure the accuracy
+//  and reliability of the software and data, the NLM and the U.S.
+//  Government do not and cannot warrant the performance or results that
+//  may be obtained by using this software or data. The NLM and the U.S.
+//  Government disclaim all warranties, express or implied, including
+//  warranties of performance, merchantability or fitness for any particular
+//  purpose.
+//
+//  Please cite the author in any work or product based on this material.
+//
+// ===========================================================================
+
+#include <vdb/manager.h> // VDBManager
+#include <vdb/vdb-priv.h>
+
+#include <ktst/unit_test.hpp> // TEST_CASE
+#include <vfs/path.h>
+#include <vfs/manager.h>
+#include <klib/text.h> 
+#include <klib/out.h> 
+#include <klib/printf.h>
+#include <klib/time.h> 
+#include <kfs/directory.h>
+#include <kfs/file.h> 
+#include <kfg/config.h> 
+
+#include <sysalloc.h>
+#include <cstdlib>
+#include <stdexcept>
+
+using namespace std;
+
+TEST_SUITE( VDB_3061 )
+
+char new_home[ 4096 ];
+
+static rc_t create_cache_file( KDirectory * dir, const char * path, const char * sub, const char * name, int64_t age )
+{
+    KFile * f;
+    rc_t rc = KDirectoryCreateFile( dir, &f, false, 0775, kcmInit, "%s/ncbi/%s/%s", path, sub, name );
+    if ( rc == 0 )
+    {
+        KFileRelease( f );
+        
+        KTime_t date = KTimeStamp() - age;
+        rc = KDirectorySetDate ( dir, false, date, "%s/ncbi/%s/%s", path, sub, name );
+    }
+    return rc;
+}
+
+static rc_t create_repo_dirs( KDirectory * dir, const char * path, const char * sub, uint32_t age )
+{
+    rc_t rc = KDirectoryCreateDir( dir, 0775, kcmInit | kcmParents, "%s/ncbi/%s/files", path, sub );
+    if ( rc == 0 )
+        rc = KDirectoryCreateDir( dir, 0775, kcmInit | kcmParents, "%s/ncbi/%s/nannot", path, sub );
+    if ( rc == 0 )
+        rc = KDirectoryCreateDir( dir, 0775, kcmInit | kcmParents, "%s/ncbi/%s/refseq", path, sub );
+    if ( rc == 0 )
+        rc = KDirectoryCreateDir( dir, 0775, kcmInit | kcmParents, "%s/ncbi/%s/sra", path, sub );
+    if ( rc == 0 )
+        rc = KDirectoryCreateDir( dir, 0775, kcmInit | kcmParents, "%s/ncbi/%s/wgs", path, sub );
+    if ( rc == 0 )
+        rc = create_cache_file( dir, path, sub, "/sra/file1.txt", 60 * 60 * 24 * age  );
+    return rc;
+}
+
+
+TEST_CASE( CLEAR_CACHE )
+{
+    /* create a repository-structure equivalent to the config-values, with 3 files in it */
+    KDirectory * dir;
+    REQUIRE_RC( KDirectoryNativeDir( &dir ) );
+    REQUIRE_RC( create_repo_dirs( dir, new_home, "public", 10 ) ); /* 10 days old */
+    REQUIRE_RC( create_repo_dirs( dir, new_home, "dbGaP-2956", 4 ) ); /* 4 days old */
+    REQUIRE_RC( create_repo_dirs( dir, new_home, "dbGaP-4831", 5 ) ); /* 5 days old*/
+    REQUIRE_RC( KDirectoryRelease ( dir ) );
+    
+    /* we run the new function VDBManagerDeleteCacheOlderThan() with a 5-day threshold */
+    const VDBManager * vdb_mgr;
+    REQUIRE_RC( VDBManagerMakeRead( &vdb_mgr, NULL ) );
+    REQUIRE_RC( VDBManagerDeleteCacheOlderThan ( vdb_mgr, 5 ) );
+    REQUIRE_RC( VDBManagerRelease ( vdb_mgr ) );
+
+    /* now the 10 day old one should have disappeared, the other 2 are still there */
+    REQUIRE_RC( KDirectoryNativeDir( &dir ) );
+    uint32_t pt1 = KDirectoryPathType( dir, "%s/ncbi/public/sra/file1.txt", new_home );
+    REQUIRE_EQ( pt1, (uint32_t)kptNotFound );
+    uint32_t pt2 = KDirectoryPathType( dir, "%s/ncbi/dbGaP-2956/sra/file1.txt", new_home );
+    REQUIRE_EQ( pt2, (uint32_t)kptFile );
+    uint32_t pt3 = KDirectoryPathType( dir, "%s/ncbi/dbGaP-4831/sra/file1.txt", new_home );
+    REQUIRE_EQ( pt3, (uint32_t)kptFile );
+    REQUIRE_RC( KDirectoryRelease ( dir ) );
+}
+
+static rc_t write_root( KConfig *cfg, const char * base, const char * cat, const char * sub_cat )
+{
+    char key[ 256 ];
+    size_t num_writ;
+    rc_t rc = string_printf ( key, sizeof key, &num_writ, "/repository/user/%s/%s/root", cat, sub_cat );
+    if ( rc == 0 )
+    {
+        char value[ 256 ];
+        rc = string_printf ( value, sizeof value, &num_writ, "%s/ncbi/%s", base, sub_cat );
+        if ( rc == 0 )
+            rc = KConfigWriteString( cfg, key, value );
+    }
+    return rc;
+}
+
+
+static rc_t write_dflt_path( KConfig *cfg, const char * base )
+{
+    char value[ 256 ];
+    size_t num_writ;
+    rc_t rc = string_printf ( value, sizeof value, &num_writ, "%s/ncbi", base );
+    if ( rc == 0 )
+        rc = KConfigWriteString( cfg, "/repository/user/default-path", value );
+    return rc;
+}
+
+#ifdef WINDOWS
+static char * convert_sys_path( const char * sys_path )
+{
+    char * res = NULL;
+    VFSManager * vfs_mgr;
+    rc_t rc = VFSManagerMake ( &vfs_mgr );
+    if ( rc == 0 )
+    {
+        VPath * p;
+        rc = VFSManagerMakeSysPath ( vfs_mgr, &p, sys_path );
+        if ( rc == 0 )
+        {
+            const String * S;
+            rc = VPathMakeString( p, &S );
+            if ( rc == 0 )
+                res = string_dup ( S->addr, S->size );
+            VPathRelease( p );
+        }
+        VFSManagerRelease( vfs_mgr );
+    }
+    return res;
+}
+#endif
+
+static rc_t create_test_config( KConfig **cfg, const char * base )
+{
+    rc_t rc = KConfigMake ( cfg, NULL );
+    if ( rc == 0 )
+    {
+#ifdef WINDOWS
+        const char * cfg_base = convert_sys_path( base );
+#else
+        const char * cfg_base = base;
+#endif
+        if ( cfg_base != NULL )
+        {
+            rc = write_root( *cfg, cfg_base, "main", "public" );
+            if ( rc == 0 )
+                rc = write_root( *cfg, cfg_base, "protected", "dbGaP-2956" );
+            if ( rc == 0 )
+                rc = write_root( *cfg, cfg_base, "protected", "dbGaP-4831" );
+            if ( rc == 0 )
+                rc = write_dflt_path( *cfg, cfg_base );
+#ifdef WINDOWS
+            free( ( void * ) cfg_base );
+#endif
+        }
+    }
+    return rc;
+}
+
+char * org_home;
+char new_home_buffer[ 4096 ]; /* buffer for putenv has to stay alive! */
+
+static rc_t prepare_test( KConfig **cfg, const char * sub )
+{
+	size_t num_writ;
+#ifdef WINDOWS
+    org_home = getenv ( "USERPROFILE" );
+    rc_t rc = string_printf ( new_home, sizeof new_home, &num_writ, "%s\\%s", org_home, sub );
+#else
+	org_home = getenv( "HOME" );
+    rc_t rc = string_printf ( new_home, sizeof new_home, &num_writ, "%s/%s", org_home, sub );
+#endif
+    if ( rc == 0 )
+#ifdef WINDOWS
+        rc = string_printf ( new_home_buffer, sizeof new_home_buffer, &num_writ, "HOME=%s", new_home );
+#else
+        rc = string_printf ( new_home_buffer, sizeof new_home_buffer, &num_writ, "USERPROFILE=%s", new_home );
+#endif
+    if ( rc == 0 )
+        rc = putenv( new_home_buffer );
+    if ( rc == 0 )
+        rc = create_test_config( cfg, new_home );
+    return rc;
+}
+
+void finish_test( const char * sub )
+{
+    /* clear the temp. home-directory */
+    KDirectory * dir;
+    rc_t rc = KDirectoryNativeDir( &dir );
+    if ( rc == 0 )
+    {
+#ifdef WINDOWS
+        rc = KDirectoryRemove( dir, true, "%s/%s", org_home, sub );
+#else
+        rc = KDirectoryRemove( dir, true, "%s\\%s", org_home, sub );
+#endif
+        rc = KDirectoryRemove( dir, true, "%s", new_home );
+        KDirectoryRelease( dir );
+    }
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void ) { return 0x1000000; }
+rc_t CC UsageSummary ( const char * progname ) { return 0; }
+rc_t CC Usage ( const Args * args ) { return 0; }
+const char UsageDefaultName[] = "test-VDB-3060";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    const char HomeSub[] = "test_root_history";
+    KConfig *cfg;
+    rc_t rc = prepare_test( &cfg, HomeSub );
+    if ( rc == 0 )
+        rc = VDB_3061( argc, argv );
+    finish_test( HomeSub );
+    KConfigRelease ( cfg );
+    return rc;
+}
+
+}
diff --git a/test/vdb/test-blob-val.cpp b/test/vdb/test-blob-val.cpp
new file mode 100644
index 0000000..4a143de
--- /dev/null
+++ b/test/vdb/test-blob-val.cpp
@@ -0,0 +1,185 @@
+// ===========================================================================
+//
+//                            PUBLIC DOMAIN NOTICE
+//               National Center for Biotechnology Information
+//
+//  This software/database is a "United States Government Work" under the
+//  terms of the United States Copyright Act.  It was written as part of
+//  the author's official duties as a United States Government employee and
+//  thus cannot be copyrighted.  This software/database is freely available
+//  to the public for use. The National Library of Medicine and the U.S.
+//  Government have not placed any restriction on its use or reproduction.
+//
+//  Although all reasonable efforts have been taken to ensure the accuracy
+//  and reliability of the software and data, the NLM and the U.S.
+//  Government do not and cannot warrant the performance or results that
+//  may be obtained by using this software or data. The NLM and the U.S.
+//  Government disclaim all warranties, express or implied, including
+//  warranties of performance, merchantability or fitness for any particular
+//  purpose.
+//
+//  Please cite the author in any work or product based on this material.
+//
+// ===========================================================================
+
+#include <vdb/manager.h> // VDBManager
+#include <vdb/database.h> 
+#include <vdb/table.h> 
+#include <vdb/cursor.h> 
+#include <vdb/schema.h> /* VSchemaRelease */
+#include <vdb/vdb-priv.h>
+
+extern "C" {
+    #include <../libs/vdb/table-priv.h>
+}
+
+#include <kdb/meta.h>
+#include <kdb/table.h>
+
+#include <klib/rc.h>
+
+#include <ktst/unit_test.hpp> // TEST_CASE
+
+#include <sysalloc.h>
+
+#include <sstream>
+#include <cstdlib>
+
+using namespace std;
+
+TEST_SUITE( BlobValidationTestSuite )
+
+class VDB_Fixture
+{
+public:
+    VDB_Fixture()
+    : m_rdb(NULL)
+    {
+        THROW_ON_RC ( KDirectoryNativeDir ( & m_wd ) );
+        THROW_ON_RC ( VDBManagerMakeRead ( & m_mgr, m_wd ) );
+    }
+    ~VDB_Fixture()
+    {
+        VDBManagerRelease ( m_mgr );
+        KDirectoryRelease ( m_wd );
+    }
+
+    const VCursor* OpenSequenceTblCursor ()
+    {
+        assert ( m_rdb == NULL );
+
+        // MakeDatabase
+        {
+            const VDBManager* mgr;
+            THROW_ON_RC ( VDBManagerMakeRead ( & mgr, NULL ) );
+
+            THROW_ON_RC ( VDBManagerOpenDBRead ( mgr,
+                                              & m_rdb,
+                                              NULL,
+                                              "%s",
+                                              m_databaseName . c_str () ) );
+            THROW_ON_RC ( VDBManagerRelease ( mgr ) );
+        }
+
+        // MakeCursor
+        const VCursor* cursor;
+        {
+            THROW_ON_RC ( VDatabaseOpenTableRead( m_rdb, & m_tbl, "%s", "SEQUENCE" ) );
+            THROW_ON_RC ( VTableCreateCursorRead ( m_tbl, & cursor ) );
+
+        }
+
+        return cursor;
+    }
+
+    void Release ( const VCursor* cursor )
+    {
+        THROW_ON_RC ( VCursorRelease ( cursor ) );
+        THROW_ON_RC ( VTableRelease ( m_tbl ) );
+        THROW_ON_RC ( VDatabaseRelease ( m_rdb ) );
+        m_rdb = NULL;
+    }
+
+
+    KDirectory* m_wd;
+
+    const VDBManager* m_mgr;
+    string m_databaseName;
+
+    const VDatabase* m_rdb;
+    const VTable* m_tbl;
+};
+
+FIXTURE_TEST_CASE ( BlobValidationDisabled, VDB_Fixture)
+{
+    m_databaseName = "./db/blob_val_inv_chsum.sra";
+
+    uint32_t columnIdx;
+    uint32_t elem_bits;
+    const uint32_t *col_data;
+    uint32_t boff;
+    uint32_t row_len;
+    const VCursor * cursor;
+    // open cursor, disable validation, make sure we can read data
+    cursor = OpenSequenceTblCursor();
+    REQUIRE_RC ( VCursorAddColumn ( cursor, & columnIdx, "READ_LEN" ) );
+    REQUIRE_RC ( VCursorOpen ( cursor ) );
+    ((VTable*)m_tbl)->blob_validation = false;
+    REQUIRE_RC ( VCursorCellDataDirect ( cursor, 1, columnIdx, &elem_bits, (const void**)&col_data, &boff, &row_len ) );
+    REQUIRE_EQ ( (int)row_len, 2 );
+    REQUIRE_EQ ( (int)col_data[0], 60 );
+    REQUIRE_EQ ( (int)col_data[1], 50 );
+    Release ( cursor );
+}
+
+FIXTURE_TEST_CASE ( BlobValidationEnabled, VDB_Fixture)
+{
+    m_databaseName = "./db/blob_val_inv_chsum.sra";
+
+    uint32_t columnIdx;
+    uint32_t elem_bits;
+    const uint32_t *col_data;
+    uint32_t boff;
+    uint32_t row_len;
+    const VCursor * cursor;
+    // open cursor, enable validation, make sure error is thrown, because blob checksum is set to 0
+    cursor = OpenSequenceTblCursor();
+    REQUIRE_RC ( VCursorAddColumn ( cursor, & columnIdx, "READ_LEN" ) );
+    REQUIRE_RC ( VCursorOpen ( cursor ) );
+    ((VTable*)m_tbl)->blob_validation = true;
+    REQUIRE_RC_FAIL ( VCursorCellDataDirect ( cursor, 1, columnIdx, &elem_bits, (const void**)&col_data, &boff, &row_len ) );
+    Release ( cursor );
+}
+
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h> 
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-blob-val";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=BlobValidationTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/vdb/test-dependencies.cpp b/test/vdb/test-dependencies.cpp
new file mode 100644
index 0000000..3ea7c30
--- /dev/null
+++ b/test/vdb/test-dependencies.cpp
@@ -0,0 +1,452 @@
+#include <ktst/unit_test.hpp> // TEST_SUITE
+
+#include <kapp/args.h> // KAppVersion
+
+#include <klib/debug.h>
+
+#include <vdb/vdb-priv.h> // VDBManagerMakeReadWithVFSManager
+#include <vdb/manager.h> // VDBManager
+#include <vdb/database.h> /* VDatabase */
+#include <vdb/dependencies.h> /* VDBDependencies */
+#include <vdb/schema.h> /* VSchema */
+
+#include <kfg/config.h> // KConfigDisableUserSettings
+
+#include <vfs/manager.h> // VFSManager
+#include <vfs/manager-priv.h> // VFSManagerGetConfig
+#include <vfs/resolver.h> // VResolverRelease
+#include <vfs/path.h> // VPathMake
+
+#include <kfs/file.h> // KFileRelease
+
+#include <sra/sraschema.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h> // free
+
+#include <stdio.h> // puts
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+class DepFixture {
+    rc_t StringRelease(String *self) {
+        free(self);
+        return 0;
+    }
+protected:
+    DepFixture(const char *path)
+        : mgr(NULL)
+        , vmgr(NULL)
+        , resolver(NULL)
+        , siteless(false)
+    {
+        rc_t rc = 0;
+
+        KDirectory *wd = NULL;
+        if (KDirectoryNativeDir(&wd)) {
+            FAIL("failed to KDirectoryNativeDir");
+        }
+
+        const KDirectory *dir = NULL;
+        KConfig *cfg = NULL;
+
+        if (KDirectoryOpenDirRead(wd, &dir, false, path)) {
+            FAIL("failed to KDirectoryOpenDirRead()");
+        }
+        if (KConfigMake(&cfg, dir)) {
+            FAIL("failed to KConfigMake()");
+        }
+        RELEASE(KDirectory, dir);
+        if (VFSManagerMakeFromKfg(&vmgr, cfg)) {
+            FAIL("failed to VFSManagerMakeFromKfg()");
+        }
+        if (VFSManagerGetResolver(vmgr, &resolver)) {
+            FAIL("failed to VFSManagerGetResolver");
+        }
+
+        String *result = NULL;
+        rc = KConfigReadString(cfg, "repository/site/main/tracearc/root",
+            &result);
+        if (rc != 0) {
+            if (rc == SILENT_RC(rcKFG, rcNode, rcOpening, rcPath, rcNotFound)) {
+                rc = 0;
+                siteless = true;
+            }
+            else {
+                FAIL(
+              "failed to KConfigReadString(repository/site/main/tracearc/root)");
+            }
+        }
+        else {
+            assert(result);
+            KPathType t = KDirectoryPathType(wd, result->addr);
+            if (t != kptDir) {
+                siteless = true;
+            }
+        }
+        RELEASE(String, result);
+
+        RELEASE(KConfig, cfg);
+        if (VDBManagerMakeReadWithVFSManager(&mgr, NULL, vmgr)) {
+            FAIL("failed to VDBManagerMakeReadWithVFSManager()");
+        }
+
+        RELEASE(KDirectory, wd);
+    }
+
+    ~DepFixture(void) {
+        rc_t rc = 0;
+        RELEASE(VResolver, resolver);
+        RELEASE(VDBManager, mgr);
+        RELEASE(VFSManager, vmgr);
+    }
+public:
+    const VDBManager *mgr;
+    VFSManager *vmgr;
+    VResolver *resolver;
+    bool siteless;
+};
+class EmptyFixture : public DepFixture {
+public:
+    EmptyFixture() : DepFixture("kfg/empty") {}
+};
+
+class RefseqFixture : public DepFixture {
+
+  #if LINUX
+    #define PATH "kfg/linux"
+  #elif MAC
+    #define PATH "kfg/mac"
+  #elif WINDOWS
+    #define PATH "kfg/win"
+  #endif
+
+public:
+    RefseqFixture() : DepFixture(PATH) {}
+};
+
+static rc_t argsHandler(int argc, char* argv[]);
+TEST_SUITE_WITH_ARGS_HANDLER(TestDependenciesSuite, argsHandler);
+
+FIXTURE_TEST_CASE(TestNoDeps, RefseqFixture) {
+    if (siteless) {
+        TEST_MESSAGE("Test skipped because site repository does not exist");
+        return;
+    }
+
+    rc_t rc = 0;
+
+    const VDatabase *db = NULL;
+    const char SRR600096[] = "SRR600096";
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, NULL, SRR600096));
+    RELEASE(VDatabase, db);
+
+    VPath* acc = NULL;
+    REQUIRE_RC(VFSManagerMakePath(vmgr, &acc, SRR600096));
+    const VPath *local = NULL;
+    REQUIRE_RC(VResolverLocal(resolver, acc, &local));
+    RELEASE(VPath, acc);
+    const String *s = NULL;
+    REQUIRE_RC(VPathMakeString(local, &s));
+    REQUIRE(s && s->addr);
+
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, NULL, s->addr));
+
+    const VDBDependencies *dep = NULL;
+
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, true));
+    uint32_t count = 1;
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)0);
+    RELEASE(VDBDependencies, dep);
+
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, false));
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)0);
+    RELEASE(VDBDependencies, dep);
+
+    RELEASE(VDatabase, db);
+    free(const_cast<String*>(s));
+    RELEASE(VPath, local);
+}
+
+FIXTURE_TEST_CASE(Test1NoDep, EmptyFixture) {
+    rc_t rc = 0;
+
+    const char SRR619505[] = "SRR619505";
+
+    VPath *acc = NULL;
+    REQUIRE_RC(VFSManagerMakePath(vmgr, &acc, SRR619505));
+    const VPath *local = NULL;
+    REQUIRE_RC_FAIL(VResolverLocal(resolver, acc, &local));
+    RELEASE(VPath, acc);
+
+    const VDatabase *db = NULL;
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, NULL, SRR619505));
+
+    const VDBDependencies *dep = NULL;
+
+    //                                             missing
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, true));
+    uint32_t count = 1;
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)1);
+    RELEASE(VDBDependencies, dep);
+
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, false));
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)1);
+    RELEASE(VDBDependencies, dep);
+
+    RELEASE(VDatabase, db);
+    RELEASE(VPath, local);
+}
+
+FIXTURE_TEST_CASE(TestManyNoDep, EmptyFixture) {
+    rc_t rc = 0;
+
+    const char SRR543323[] = "SRR543323";
+
+    VPath* acc = NULL;
+    REQUIRE_RC(VFSManagerMakePath(vmgr, &acc, SRR543323));
+    const VPath *local = NULL;
+    REQUIRE_RC_FAIL(VResolverLocal(resolver, acc, &local));
+    RELEASE(VPath, acc);
+
+	struct VSchema *schema;
+	REQUIRE_RC(VDBManagerMakeSRASchema(mgr, &schema));
+
+    const VDatabase *db = NULL;
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, schema, SRR543323));
+    REQUIRE_RC(VSchemaRelease(schema));
+
+    const VDBDependencies *dep = NULL;
+
+    //                                             missing
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, true));
+    uint32_t count = 1;
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)21);
+    RELEASE(VDBDependencies, dep);
+
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, false));
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)21);
+    RELEASE(VDBDependencies, dep);
+
+    RELEASE(VDatabase, db);
+    RELEASE(VPath, local);
+}
+
+FIXTURE_TEST_CASE(TestDoubleNoDep, EmptyFixture) {
+    rc_t rc = 0;
+
+    const char SRR353827[] = "SRR353827";
+
+    VPath* acc = NULL;
+    REQUIRE_RC(VFSManagerMakePath(vmgr, &acc, SRR353827));
+    const VPath *local = NULL;
+    REQUIRE_RC_FAIL(VResolverLocal(resolver, acc, &local));
+    RELEASE(VPath, acc);
+
+    const VDatabase *db = NULL;
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, NULL, SRR353827));
+
+    const VDBDependencies *dep = NULL;
+
+    //                                             missing
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, true));
+    uint32_t count = 1;
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)1);
+    RELEASE(VDBDependencies, dep);
+
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, false));
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)2);
+    RELEASE(VDBDependencies, dep);
+
+    RELEASE(VDatabase, db);
+    RELEASE(VPath, local);
+}
+
+FIXTURE_TEST_CASE(TestDoubleYesDep, RefseqFixture) {
+    if (siteless) {
+        TEST_MESSAGE("Test skipped because site repository does not exist");
+        return;
+    }
+
+    rc_t rc = 0;
+
+    const VDatabase *db = NULL;
+    const char SRR353827[] = "SRR353827";
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, NULL, SRR353827));
+    RELEASE(VDatabase, db);
+
+    VPath* acc = NULL;
+    REQUIRE_RC(VFSManagerMakePath(vmgr, &acc, SRR353827));
+    const VPath *local = NULL;
+    REQUIRE_RC(VResolverLocal(resolver, acc, &local));
+    RELEASE(VPath, acc);
+    const String *s = NULL;
+    REQUIRE_RC(VPathMakeString(local, &s));
+    REQUIRE(s && s->addr);
+
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, NULL, s->addr));
+
+    const VDBDependencies *dep = NULL;
+
+    //                                             missing
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, true));
+    uint32_t count = 1;
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)0);
+    RELEASE(VDBDependencies, dep);
+
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, false));
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)2);
+    RELEASE(VDBDependencies, dep);
+
+    RELEASE(VDatabase, db);
+    free(const_cast<String*>(s));
+    RELEASE(VPath, local);
+}
+
+FIXTURE_TEST_CASE(TestManyYesDep, RefseqFixture) {
+    if (siteless) {
+        TEST_MESSAGE("Test skipped because site repository does not exist");
+        return;
+    }
+
+    rc_t rc = 0;
+
+    const VDatabase *db = NULL;
+    const char SRR543323[] = "SRR543323";
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, NULL, SRR543323));
+    RELEASE(VDatabase, db);
+
+    VPath* acc = NULL;
+    REQUIRE_RC(VFSManagerMakePath(vmgr, &acc, SRR543323));
+    const VPath *local = NULL;
+    REQUIRE_RC(VResolverLocal(resolver, acc, &local));
+    RELEASE(VPath, acc);
+    const String *s = NULL;
+    REQUIRE_RC(VPathMakeString(local, &s));
+    REQUIRE(s && s->addr);
+
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, NULL, s->addr));
+
+    const VDBDependencies *dep = NULL;
+
+    //                                             missing
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, true));
+    uint32_t count = 1;
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)0);
+    RELEASE(VDBDependencies, dep);
+
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, false));
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)21);
+    RELEASE(VDBDependencies, dep);
+
+    RELEASE(VDatabase, db);
+    free(const_cast<String*>(s));
+    RELEASE(VPath, local);
+}
+
+FIXTURE_TEST_CASE(Test1YesDep, RefseqFixture) {
+    if (siteless) {
+        TEST_MESSAGE("Test skipped because site repository does not exist");
+        return;
+    }
+
+    rc_t rc = 0;
+
+    const VDatabase *db = NULL;
+    const char SRR619505[] = "SRR619505";
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, NULL, SRR619505));
+    RELEASE(VDatabase, db);
+
+    VPath* acc = NULL;
+    REQUIRE_RC(VFSManagerMakePath(vmgr, &acc, SRR619505));
+    const VPath *local = NULL;
+    REQUIRE_RC(VResolverLocal(resolver, acc, &local));
+    RELEASE(VPath, acc);
+    const String *s = NULL;
+    REQUIRE_RC(VPathMakeString(local, &s));
+    REQUIRE(s && s->addr);
+
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, NULL, s->addr));
+
+    const VDBDependencies *dep = NULL;
+
+    //                                             missing
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, true));
+    uint32_t count = 1;
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)0);
+    RELEASE(VDBDependencies, dep);
+
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, false));
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)1);
+    RELEASE(VDBDependencies, dep);
+
+    RELEASE(VDatabase, db);
+    free(const_cast<String*>(s));
+    RELEASE(VPath, local);
+}
+
+FIXTURE_TEST_CASE(Test1LocalDep, EmptyFixture) {
+    rc_t rc = 0;
+
+    const char SRR413283[] = "SRR413283";
+
+    VPath* acc = NULL;
+    REQUIRE_RC(VFSManagerMakePath(vmgr, &acc, SRR413283));
+    const VPath *local = NULL;
+    REQUIRE_RC_FAIL(VResolverLocal(resolver, acc, &local));
+    RELEASE(VPath, acc);
+
+    const VDatabase *db = NULL;
+    REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, NULL, SRR413283));
+
+    const VDBDependencies *dep = NULL;
+
+    //                                             missing
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, true));
+    uint32_t count = 1;
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)0);
+    RELEASE(VDBDependencies, dep);
+
+    REQUIRE_RC(VDatabaseListDependencies(db, &dep, false));
+    REQUIRE_RC(VDBDependenciesCount(dep, &count));
+    CHECK_EQUAL(count, (uint32_t)1);
+    RELEASE(VDBDependencies, dep);
+
+    RELEASE(VDatabase, db);
+    RELEASE(VPath, local);
+}
+
+static rc_t argsHandler(int argc, char* argv[]) {
+    Args* args = NULL;
+    rc_t rc = ArgsMakeAndHandle(&args, argc, argv, 0, NULL, 0);
+    ArgsWhack(args);
+    return rc;
+}
+
+extern "C" {
+    ver_t CC KAppVersion(void) { return 0x1000000; }
+    const char UsageDefaultName[] = "test-dependencies";
+    rc_t CC UsageSummary(const char *progname) { return 0; }
+    rc_t CC Usage(const Args *args) { return 0; }
+    rc_t CC KMain(int argc, char *argv[]) {
+        KConfigDisableUserSettings();
+        return TestDependenciesSuite(argc, argv);
+    }
+}
diff --git a/test/vdb/test-sparse-col.cpp b/test/vdb/test-sparse-col.cpp
new file mode 100644
index 0000000..f1858d6
--- /dev/null
+++ b/test/vdb/test-sparse-col.cpp
@@ -0,0 +1,358 @@
+// ===========================================================================
+//
+//                            PUBLIC DOMAIN NOTICE
+//               National Center for Biotechnology Information
+//
+//  This software/database is a "United States Government Work" under the
+//  terms of the United States Copyright Act.  It was written as part of
+//  the author's official duties as a United States Government employee and
+//  thus cannot be copyrighted.  This software/database is freely available
+//  to the public for use. The National Library of Medicine and the U.S.
+//  Government have not placed any restriction on its use or reproduction.
+//
+//  Although all reasonable efforts have been taken to ensure the accuracy
+//  and reliability of the software and data, the NLM and the U.S.
+//  Government do not and cannot warrant the performance or results that
+//  may be obtained by using this software or data. The NLM and the U.S.
+//  Government disclaim all warranties, express or implied, including
+//  warranties of performance, merchantability or fitness for any particular
+//  purpose.
+//
+//  Please cite the author in any work or product based on this material.
+//
+// ===========================================================================
+
+#include <vdb/manager.h> // VDBManager
+#include <vdb/database.h> 
+#include <vdb/table.h> 
+#include <vdb/cursor.h> 
+#include <vdb/schema.h> /* VSchemaRelease */
+#include <vdb/vdb-priv.h>
+
+#include <sra/sraschema.h> // VDBManagerMakeSRASchema
+
+#include <kdb/meta.h>
+#include <kdb/table.h>
+
+#include <klib/rc.h>
+
+#include <ktst/unit_test.hpp> // TEST_CASE
+
+#include <sysalloc.h>
+
+#include <sstream>
+#include <cstdlib>
+
+using namespace std;
+
+/*
+ * We will compile this test file first in read/write mode, create DB and
+ * run tests using libncbi-wvdb library; then compile it again, but with -DREAD_ONLY
+ * and link it against read-only lincbi-vdb library and run tests
+ *
+ * NB: rw mode test creates DB, rd mode deletes it.
+ */
+
+TEST_SUITE( SparseColTestSuite )
+
+const string ScratchDir = "./db/";
+
+class VDB_Fixture
+{
+public:
+    VDB_Fixture()
+#if !READ_ONLY
+    : m_wdb(NULL), m_rdb(NULL)
+#else
+    : m_rdb(NULL)
+#endif
+    {
+        THROW_ON_RC ( KDirectoryNativeDir ( & m_wd ) );
+#if !READ_ONLY
+        THROW_ON_RC ( VDBManagerMakeUpdate ( & m_mgr, m_wd ) );
+#else
+        THROW_ON_RC ( VDBManagerMakeRead ( & m_mgr, m_wd ) );
+#endif
+    }
+    ~VDB_Fixture()
+    {
+#if READ_ONLY
+        RemoveDatabase ();
+#endif
+        VDBManagerRelease ( m_mgr );
+        KDirectoryRelease ( m_wd );
+    }
+    void RemoveDatabase()
+    {   
+        if ( ! m_databaseName . empty () )
+        {
+            KDirectoryRemove ( m_wd, true, m_databaseName . c_str () );
+        }
+    }
+    
+#if !READ_ONLY
+    VCursor* CreateDatabase()
+    {
+        const string schemaText =
+        "table t1 #1\n"
+        "{\n"
+        "    column ascii COL1;\n"
+        "    column ascii COL2;\n"
+        "};\n"
+
+        "database db #1\n"
+        "{\n"
+        "    table t1 #1 T1;\n"
+        "};\n"
+        ;
+        const char * schemaSpec = "db";
+
+        assert ( m_wdb == NULL );
+
+        // MakeDatabase
+        {
+            VDBManager* mgr;
+            THROW_ON_RC ( VDBManagerMakeUpdate ( & mgr, NULL ) );
+            VSchema* schema;
+            THROW_ON_RC ( VDBManagerMakeSchema ( mgr, & schema ) );
+            THROW_ON_RC ( VSchemaParseText(schema, NULL, schemaText . c_str(), schemaText . size () ) );
+
+            THROW_ON_RC ( VDBManagerCreateDB ( mgr,
+                                              & m_wdb,
+                                              schema,
+                                              schemaSpec,
+                                              kcmInit + kcmMD5,
+                                              "%s",
+                                              m_databaseName . c_str () ) );
+            THROW_ON_RC ( VSchemaRelease ( schema ) );
+            THROW_ON_RC ( VDBManagerRelease ( mgr ) );
+        }
+
+        // MakeCursor
+        VCursor* cursor;
+        {
+            VTable* table;
+            THROW_ON_RC ( VDatabaseCreateTable ( m_wdb, & table, "T1", kcmCreate | kcmMD5, "%s", "T1" ) );
+            THROW_ON_RC ( VTableCreateCursorWrite ( table, & cursor, kcmInsert ) );
+            THROW_ON_RC ( VTableRelease ( table ) );
+        }
+
+        return cursor;
+    }
+
+    void CommitDatabase ( VCursor * cursor )
+    {
+        assert ( m_wdb != NULL );
+
+        THROW_ON_RC ( VCursorCommit ( cursor ) );    // this returns rcVDB,rcBlob,rcValidating,rcBlob,rcCorrupt if the schema does not support
+                                                        // writing to the LABEL column from the code
+        THROW_ON_RC ( VCursorRelease ( cursor ) );
+
+        THROW_ON_RC ( VDatabaseRelease ( m_wdb ) );
+
+        m_wdb = NULL;
+    }
+
+    void WriteRow ( VCursor * cursor, uint32_t column_idx, int64_t row_id, std::string data )
+    {
+        THROW_ON_RC ( VCursorSetRowId ( cursor, row_id ) );
+        THROW_ON_RC ( VCursorOpenRow ( cursor ) );
+        THROW_ON_RC ( VCursorWrite ( cursor, column_idx, 8, data.c_str(), 0, data.size() ) );
+        THROW_ON_RC ( VCursorCommitRow ( cursor ) );
+        THROW_ON_RC ( VCursorCloseRow ( cursor ) );
+        THROW_ON_RC ( VCursorFlushPage ( cursor ) );
+    }
+#endif
+
+    const VCursor* OpenDatabaseRead ()
+    {
+        assert ( m_rdb == NULL );
+
+        // MakeDatabase
+        {
+#if !READ_ONLY
+            VDBManager* mgr;
+            THROW_ON_RC ( VDBManagerMakeUpdate ( & mgr, NULL ) );
+#else
+            const VDBManager* mgr;
+            THROW_ON_RC ( VDBManagerMakeRead ( & mgr, NULL ) );
+#endif
+
+            THROW_ON_RC ( VDBManagerOpenDBRead ( mgr,
+                                              & m_rdb,
+                                              NULL,
+                                              "%s",
+                                              m_databaseName . c_str () ) );
+            THROW_ON_RC ( VDBManagerRelease ( mgr ) );
+        }
+
+        // MakeCursor
+        const VCursor* cursor;
+        {
+            const VTable* table;
+            THROW_ON_RC ( VDatabaseOpenTableRead( m_rdb, & table, "%s", "T1" ) );
+            THROW_ON_RC ( VTableCreateCursorRead ( table, & cursor ) );
+            THROW_ON_RC ( VTableRelease ( table ) );
+        }
+
+        return cursor;
+    }
+
+    void ReleaseDatabase ( const VCursor* cursor )
+    {
+        THROW_ON_RC ( VCursorRelease ( cursor ) );
+
+        THROW_ON_RC ( VDatabaseRelease ( m_rdb ) );
+    }
+
+#if !READ_ONLY
+    void WriteColumn ( int64_t rows[], int rows_size, const char * col, bool static_col )
+    {
+        uint32_t columnIdx;
+        RemoveDatabase();
+
+        VCursor * wcursor = CreateDatabase();
+
+        // AddColumns
+        THROW_ON_RC ( VCursorAddColumn ( wcursor, & columnIdx, "%s", col ) );
+        THROW_ON_RC ( VCursorOpen ( wcursor ) );
+
+        for ( int i = 0; i < rows_size; ++i)
+        {
+            int64_t row_id = rows[i];
+            ostringstream out;
+            out << row_id;
+
+            WriteRow ( wcursor, columnIdx, row_id, static_col ? "abcd" : out.str() );
+        }
+
+        CommitDatabase(wcursor);
+    }
+#endif
+
+    void RunChecks ( int64_t rows[], int rows_size, const char * col )
+    {
+        uint32_t columnIdx;
+        const VCursor * rcursor = OpenDatabaseRead();
+        THROW_ON_RC ( VCursorAddColumn ( rcursor, & columnIdx, "%s", col ) );
+        THROW_ON_RC ( VCursorOpen ( rcursor ) );
+
+        int64_t row_id;
+        THROW_ON_RC ( VCursorRowId ( rcursor, &row_id ) );
+        if ( rows[0] != row_id )
+            FAIL("rows[i] != row_id");
+
+        for ( int i = 1; i < rows_size; ++i) {
+            THROW_ON_RC ( VCursorFindNextRowId ( rcursor, 0, &row_id ) );
+            if ( rows[i] != row_id )
+                FAIL("rows[i] != row_id");
+
+            THROW_ON_RC ( VCursorRowId ( rcursor, &row_id ) );
+
+            THROW_ON_RC ( VCursorFindNextRowIdDirect ( rcursor, 0, row_id + 1, &row_id ) );
+            if ( rows[i] != row_id )
+                FAIL("rows[i] != row_id");
+
+            THROW_ON_RC ( VCursorSetRowId ( rcursor, row_id ) );
+        }
+        ReleaseDatabase(rcursor);
+    }
+
+
+
+
+    KDirectory* m_wd;
+
+#if READ_ONLY
+    const
+#endif
+    VDBManager* m_mgr;
+    string m_databaseName;
+
+#if !READ_ONLY
+    VDatabase* m_wdb;
+#endif
+    const VDatabase* m_rdb;
+};
+
+FIXTURE_TEST_CASE ( SparseColNormal, VDB_Fixture)
+{
+    int64_t rows[] = { 3, 4, 5, 100, 1000000 };
+    int rows_size = sizeof rows / sizeof rows[0];
+
+    m_databaseName = ScratchDir + GetName();
+
+#if !READ_ONLY
+    WriteColumn ( rows, rows_size, "COL1", false );
+#endif
+
+    RunChecks ( rows, rows_size, "COL1" );
+}
+
+FIXTURE_TEST_CASE ( SparseColStatic, VDB_Fixture)
+{
+    int64_t rows[] = { 2, 3, 4, 5 };
+    int rows_size = sizeof rows / sizeof rows[0];
+
+    m_databaseName = ScratchDir + GetName();
+
+#if !READ_ONLY
+    WriteColumn ( rows, rows_size, "COL1", true );
+#endif
+
+    RunChecks ( rows, rows_size, "COL1" );
+}
+
+FIXTURE_TEST_CASE ( SparseColEmpty, VDB_Fixture)
+{
+    m_databaseName = ScratchDir + GetName();
+
+#if !READ_ONLY
+    int64_t rows[] = { 2, 3, 4, 5 };
+    int rows_size = sizeof rows / sizeof rows[0];
+
+    WriteColumn ( rows, rows_size, "COL1", true );
+#endif
+
+    const VCursor * rcursor = OpenDatabaseRead();
+    REQUIRE_RC ( VCursorOpen ( rcursor ) );
+
+    rc_t rc;
+    int64_t row_id;
+    rc = VCursorFindNextRowId ( rcursor, 0, &row_id );
+    if ( rc == 0 || GetRCState ( rc ) != rcEmpty || GetRCObject ( rc ) != rcCursor )
+        FAIL("expected to fail with rcCursor rcNotFound");
+}
+
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h> 
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-sparse-col";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=SparseColTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/vdb/test-vdb.cpp b/test/vdb/test-vdb.cpp
new file mode 100644
index 0000000..ade9640
--- /dev/null
+++ b/test/vdb/test-vdb.cpp
@@ -0,0 +1,624 @@
+// ===========================================================================
+//
+//                            PUBLIC DOMAIN NOTICE
+//               National Center for Biotechnology Information
+//
+//  This software/database is a "United States Government Work" under the
+//  terms of the United States Copyright Act.  It was written as part of
+//  the author's official duties as a United States Government employee and
+//  thus cannot be copyrighted.  This software/database is freely available
+//  to the public for use. The National Library of Medicine and the U.S.
+//  Government have not placed any restriction on its use or reproduction.
+//
+//  Although all reasonable efforts have been taken to ensure the accuracy
+//  and reliability of the software and data, the NLM and the U.S.
+//  Government do not and cannot warrant the performance or results that
+//  may be obtained by using this software or data. The NLM and the U.S.
+//  Government disclaim all warranties, express or implied, including
+//  warranties of performance, merchantability or fitness for any particular
+//  purpose.
+//
+//  Please cite the author in any work or product based on this material.
+//
+// ===========================================================================
+
+#include <vdb/manager.h> // VDBManager
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/blob.h>
+#include <vdb/vdb-priv.h>
+#include <vdb/blob.h>
+#include <sra/sraschema.h> // VDBManagerMakeSRASchema
+#include <vdb/schema.h> /* VSchemaRelease */
+
+extern "C" {
+    #include <../libs/vdb/blob-priv.h>
+    #include <../libs/vdb/page-map.h>
+}
+
+#include <ktst/unit_test.hpp> // TEST_CASE
+#include <kfg/config.h>
+
+#include <sysalloc.h>
+#include <cstdlib>
+#include <stdexcept>
+
+using namespace std;
+
+TEST_SUITE( VdbTestSuite )
+
+extern "C" rc_t VDBManagerRunPeriodicTasks(const VDBManager*);
+
+TEST_CASE( VdbMgr ) {
+    const VDBManager *mgr = NULL;
+    rc_t rc = VDBManagerMakeRead(NULL, NULL);
+    if (rc == 0)
+        FAIL( "FAIL: VDBManagerMakeRead(NULL) succeed" );
+
+    rc = VDBManagerMakeRead(&mgr, NULL);
+    if (rc != 0)
+        FAIL( "failed to make VDB manager" );
+
+    rc = VDBManagerAddRef(mgr);
+    if (rc != 0)
+        FAIL( "failed to AddRef VDB manager" );
+
+    rc = VDBManagerRelease(mgr);
+    if (rc != 0)
+        FAIL( "failed to release VDB manager" );
+
+    rc = VDBManagerVersion(mgr, NULL);
+    if (rc == 0)
+        FAIL( "FAIL: VDBManagerVersion(mgr, NULL) succeed" );
+
+    uint32_t version = 0;
+    rc = VDBManagerVersion(NULL, &version);
+    if (rc == 0)
+        FAIL( "FAIL: VDBManagerVersion(NULL) succeed" );
+
+    rc = VDBManagerVersion(mgr, &version);
+    if (rc == 0)
+        CHECK_GE( version, (uint32_t)0x2000000 );
+    else
+        FAIL( "failed to get VDB manager Version" );
+
+    rc = VDBManagerRunPeriodicTasks(NULL);
+    if (rc == 0)
+        FAIL( "FAIL: VDBManagerRunPeriodicTasks(NULL) succeed" );
+
+    rc = VDBManagerRunPeriodicTasks(mgr);
+    if (rc != 0)
+        FAIL( "failed VDBManagerRunPeriodicTasks" );
+
+    // In the following, NULL and "" are interpreted as "."
+
+    // VDBManagerAddSchemaIncludePath
+    REQUIRE_RC(VDBManagerAddSchemaIncludePath(mgr, NULL));
+    REQUIRE_RC(VDBManagerAddSchemaIncludePath(mgr, ""));
+#ifndef WINDOWS
+    REQUIRE_RC(VDBManagerAddSchemaIncludePath(mgr, "/"));
+    REQUIRE_RC(VDBManagerAddSchemaIncludePath(mgr, "/usr"));
+#else
+    REQUIRE_RC_FAIL(VDBManagerAddSchemaIncludePath(mgr, "/"));
+    REQUIRE_RC_FAIL(VDBManagerAddSchemaIncludePath(mgr, "/usr"));
+#endif
+
+    // VDBManagerAddLoadLibraryPath
+    REQUIRE_RC(VDBManagerAddLoadLibraryPath(mgr, NULL));
+    REQUIRE_RC(VDBManagerAddLoadLibraryPath(mgr, ""));
+#ifndef WINDOWS
+    REQUIRE_RC(VDBManagerAddLoadLibraryPath(mgr, "/"));
+    REQUIRE_RC(VDBManagerAddLoadLibraryPath(mgr, "/usr"));
+#else
+    REQUIRE_RC_FAIL(VDBManagerAddLoadLibraryPath(mgr, "/"));
+    REQUIRE_RC_FAIL(VDBManagerAddLoadLibraryPath(mgr, "/usr"));
+#endif
+    //
+
+    struct Test { int i; };
+    Test t;
+    t.i = 12345;
+    rc = VDBManagerGetUserData(mgr, NULL);
+    if (rc == 0)
+        FAIL( "FAIL: VDBManagerGetUserData(mgr, NULL) succeed" );
+    void *data = NULL;
+    rc = VDBManagerGetUserData(NULL, &data);
+    if (rc == 0)
+        FAIL( "FAIL: VDBManagerGetUserData(NULL) succeed" );
+    rc = VDBManagerGetUserData(mgr, &data);
+    if (rc != 0)
+        FAIL( "failed VDBManagerGetUserData" );
+    if (data != NULL)
+        FAIL( "VDBManagerGetUserData != NULL" );
+
+    rc = VDBManagerSetUserData(NULL, &t, free);
+    if (rc == 0)
+        FAIL( "FAIL: VDBManagerSetUserData(NULL) succeed" );
+    rc = VDBManagerSetUserData(mgr, &t, NULL);
+    if (rc != 0)
+        FAIL( "failed VDBManagerSetUserData" );
+    rc = VDBManagerGetUserData(mgr, &data);
+    if (rc != 0)
+        FAIL( "failed VDBManagerGetUserData after Set" );
+    if (data == NULL)
+        FAIL( "VDBManagerGetUserData == NULL after Get" );
+    else {
+        Test *r = static_cast<Test*>(data);
+        CHECK_EQUAL( r->i, 12345 );
+    }
+
+    Test *pt = static_cast<Test*>(malloc(sizeof *pt));
+    rc = VDBManagerSetUserData(mgr, pt, free);
+    if (rc != 0)
+        FAIL( "failed VDBManagerSetUserData(free)" );
+
+    //
+    rc = VDBManagerRelease(mgr);
+    if (rc != 0)
+        FAIL( "failed to release VDB manager" );
+    mgr = NULL;
+
+}
+#if 0
+//#if _ARCH_BITS != 32
+TEST_CASE(SimultaneousCursors)
+{   // SRA-1669 WGS ALWZ01 cannot open multiple cursors with SEQUENCE.CONTIG_NAME column simultaneously (Win32)
+
+    for ( int i = 0; i < 1; ++i ) {
+        const VDBManager* mgr = 0;
+        REQUIRE_RC(VDBManagerMakeRead(&mgr, 0));
+        const VDatabase* db = 0;
+        REQUIRE_RC(VDBManagerOpenDBRead(mgr, &db, 0, "ALWZ01"));
+        const VTable* table = 0;
+        REQUIRE_RC(VDatabaseOpenTableRead(db, &table, "SEQUENCE"));
+        const size_t CURSOR_CNT = 10;
+        const VCursor* cursors[CURSOR_CNT] = {};
+        for ( size_t i = 0; i < CURSOR_CNT; ++i ) {
+            const VCursor* cursor = 0;
+            REQUIRE_RC(VTableCreateCursorRead(table, &cursor));
+            cursors[i] = cursor;
+            REQUIRE_RC(VCursorPermitPostOpenAdd(cursor));
+            REQUIRE_RC(VCursorOpen(cursor));
+            uint32_t col_index;
+            REQUIRE_RC(VCursorAddColumn(cursor, &col_index, "CONTIG_NAME"));
+        }
+        for ( size_t i = 0; i < CURSOR_CNT; ++i ) {
+            REQUIRE_RC(VCursorRelease(cursors[i]));
+        }
+        REQUIRE_RC(VTableRelease(table));
+        REQUIRE_RC(VDatabaseRelease(db));
+        REQUIRE_RC(VDBManagerRelease(mgr));
+    }
+}
+#endif
+
+class VdbFixture
+{
+public:
+    VdbFixture()
+    : mgr(0), curs(0), col_idx(~0)
+    {
+        if ( VDBManagerMakeRead(&mgr, NULL) != 0 )
+            throw logic_error ( "VdbFixture: VDBManagerMakeRead failed" );
+    }
+
+    ~VdbFixture()
+    {
+        if ( mgr && VDBManagerRelease ( mgr ) != 0 )
+            throw logic_error ( "~VdbFixture: VDBManagerRelease failed" );
+        if ( curs && VCursorRelease ( curs ) != 0 )
+            throw logic_error ( "~VdbFixture: VCursorRelease failed" );
+    }
+
+    rc_t Setup( const char * acc, const char* column = "READ_LEN" )
+    {
+        const VDatabase *db = NULL;
+        rc_t rc = VDBManagerOpenDBRead ( mgr, &db, NULL, acc );
+        rc_t rc2;
+
+        const VTable *tbl = NULL;
+        if (rc == 0)
+        {
+            rc = VDatabaseOpenTableRead ( db, &tbl, "SEQUENCE" );
+        }
+        else
+        {
+            rc = VDBManagerOpenTableRead ( mgr, &tbl, NULL, acc );
+            if (rc != 0)
+            {
+                VSchema *schema = NULL;
+                rc = VDBManagerMakeSRASchema(mgr, &schema);
+                if ( rc != 0 )
+                {
+                    return rc;
+                }
+
+                rc = VDBManagerOpenTableRead ( mgr, &tbl, schema, acc );
+
+                rc2 = VSchemaRelease ( schema );
+                if ( rc == 0 )
+                    rc = rc2;
+            }
+        }
+
+        if ( rc == 0 )
+        {
+            rc = VTableCreateCursorRead(tbl, &curs);
+            if ( rc == 0 )
+            {
+                col_idx = ~0;
+                rc = VCursorAddColumn ( curs, &col_idx, column );
+                if ( rc == 0 )
+                {
+                    rc = VCursorOpen(curs);
+                }
+            }
+        }
+
+        rc2 = VTableRelease ( tbl );
+        if ( rc == 0 )
+            rc = rc2;
+
+        if ( db != NULL )
+        {
+            rc2 = VDatabaseRelease ( db );
+            if ( rc == 0 )
+               rc = rc2;
+        }
+
+        return rc;
+    }
+
+    bool CheckBlobRange ( int64_t p_rowId, int64_t p_first, uint64_t p_count )
+    {
+        THROW_ON_RC ( VCursorSetRowId ( curs, p_rowId ) );
+        THROW_ON_RC ( VCursorOpenRow ( curs ) );
+
+        struct VBlob const *blob;
+        THROW_ON_RC ( VCursorGetBlob ( curs, &blob, col_idx ) );
+
+        bool ret = true;
+
+        int64_t first;
+        uint64_t count;
+        THROW_ON_RC ( VBlobIdRange ( blob, &first, &count ) );
+        if ( p_first != first )
+        {
+            cout << "CheckBlobRange(" << p_rowId << " ) : expected first = " << p_first << ", actual = " << first << endl;
+            ret = false;
+        }
+        if ( p_count != count )
+        {
+            cout << "CheckBlobRange(" << p_rowId << " ) : expected count = " << p_count << ", actual = " << count << endl;
+            ret = false;
+        }
+
+        THROW_ON_RC ( VCursorCloseRow (curs ) );
+        THROW_ON_RC ( VBlobRelease ( (struct VBlob *) blob ) );
+        return ret;
+    }
+
+
+    const VDBManager * mgr;
+    const VCursor * curs;
+    uint32_t col_idx;
+};
+
+FIXTURE_TEST_CASE(TestCursorIsStatic_SingleRowRun1, VdbFixture)
+{
+    REQUIRE_RC ( Setup ( "SRR002749", "READ_LEN" ) );
+    bool is_static = false;
+    REQUIRE_RC ( VCursorIsStaticColumn ( curs, col_idx, &is_static) );
+    REQUIRE ( is_static );
+}
+FIXTURE_TEST_CASE(TestCursorIsStatic_VariableREAD_LEN, VdbFixture)
+{
+    REQUIRE_RC ( Setup ( "SRR050566", "READ_LEN" ) );
+    bool is_static = true;
+    REQUIRE_RC ( VCursorIsStaticColumn ( curs, col_idx, &is_static) );
+    REQUIRE ( ! is_static );
+}
+#if 0
+FIXTURE_TEST_CASE(TestCursorIsStatic_SingleRowRun2, VdbFixture)
+{
+    REQUIRE_RC ( Setup ( "SRR053325", "READ_LEN" ) );
+    bool is_static = false;
+    REQUIRE_RC ( VCursorIsStaticColumn ( curs, col_idx, &is_static) );
+    REQUIRE ( is_static );
+}
+#endif
+FIXTURE_TEST_CASE(TestCursorIsStatic_FixedREAD_LEN_MultipleRows, VdbFixture)
+{
+    REQUIRE_RC ( Setup ( "SRR125365", "READ_LEN" ) );
+    bool is_static = false;
+    REQUIRE_RC ( VCursorIsStaticColumn ( curs, col_idx, &is_static) );
+    REQUIRE ( is_static );
+}
+FIXTURE_TEST_CASE(TestCursorIsStatic_DB_FixedREAD_LEN_MultipleRows, VdbFixture)
+{
+    REQUIRE_RC ( Setup ( "SRR600096", "READ_LEN" ) );
+    bool is_static = false;
+    REQUIRE_RC ( VCursorIsStaticColumn ( curs, col_idx, &is_static) );
+    REQUIRE ( is_static );
+}
+FIXTURE_TEST_CASE(TestCursorIsStatic_DB_VariableREAD_LEN_MultipleRows, VdbFixture)
+{
+    REQUIRE_RC ( Setup ( "SRR619505", "READ_LEN" ) );
+    bool is_static = true;
+    REQUIRE_RC ( VCursorIsStaticColumn ( curs, col_idx, &is_static) );
+    REQUIRE ( ! is_static );
+}
+
+/////////////////// VBlob
+
+FIXTURE_TEST_CASE(VCursor_GetBlob_SRA, VdbFixture)
+{   // multiple fragments per row (some are technical), multiple rows per blob
+    REQUIRE_RC ( Setup ( "SRR000123", "READ" ) );
+    REQUIRE_RC ( VCursorOpen (curs ) );
+
+    {
+        REQUIRE_RC ( VCursorSetRowId (curs, 1 ) );
+        REQUIRE_RC ( VCursorOpenRow (curs ) );
+
+        struct VBlob const *blob;
+        REQUIRE_RC ( VCursorGetBlob ( curs, &blob, col_idx ) );
+
+        int64_t first;
+        uint64_t count;
+        REQUIRE_RC ( VBlobIdRange ( blob, &first, &count ) );
+        REQUIRE_EQ ( (int64_t)1, first );
+        REQUIRE_EQ ( (uint64_t)4, count );
+
+        REQUIRE_EQ ( (size_t)858, BlobBufferBytes ( blob ) );
+
+        //TODO: use row map to convert an offset into a rowId
+        REQUIRE_NOT_NULL ( blob->pm );
+        REQUIRE ( ! blob->pm->random_access );
+        REQUIRE_EQ ( (int)PageMap::eBlobPageMapOptimizedNone, (int)blob->pm->optimized );
+
+        REQUIRE_EQ ( (pm_size_t)4, blob->pm->leng_recs ); // not expanded ?
+        REQUIRE_NOT_NULL ( blob->pm->length );   // array of lengths, size blob->pm->leng_recs
+        REQUIRE_EQ ( (elem_count_t)157, blob->pm->length[0] );
+        REQUIRE_EQ ( (elem_count_t)280, blob->pm->length[1] );
+        REQUIRE_EQ ( (elem_count_t)168, blob->pm->length[2] );
+        REQUIRE_EQ ( (elem_count_t)253, blob->pm->length[3] );
+
+        REQUIRE_NOT_NULL ( blob->pm->leng_run ); // array of run lengths, size blob->pm->leng_recs
+        REQUIRE_EQ ( (row_count_t)1, blob->pm->leng_run[0] );
+        REQUIRE_EQ ( (row_count_t)1, blob->pm->leng_run[1] );
+        REQUIRE_EQ ( (row_count_t)1, blob->pm->leng_run[2] );
+        REQUIRE_EQ ( (row_count_t)1, blob->pm->leng_run[3] );
+        //NOTE: very unlikely to happen for READ column, but if leng_run > 1, the corresponding fragments should all appear in the search results
+
+        REQUIRE_EQ ( (pm_size_t)4, blob->pm->data_recs );
+
+        REQUIRE_EQ ( (row_count_t)4,  blob->pm->row_count );
+        REQUIRE_EQ ( (row_count_t)0,  blob->pm->pre_exp_row_count );
+
+        REQUIRE_RC ( VCursorCloseRow (curs ) );
+        REQUIRE_RC ( VBlobRelease ( (struct VBlob *) blob ) );
+    }
+
+    {
+        REQUIRE_RC ( VCursorSetRowId (curs, 5 ) );
+        REQUIRE_RC ( VCursorOpenRow (curs ) );
+
+        struct VBlob const *blob;
+
+        int64_t first;
+        uint64_t count;
+        REQUIRE_RC ( VCursorGetBlob ( curs, &blob, col_idx ) );
+        REQUIRE_RC ( VBlobIdRange ( blob, &first, &count ) );
+        REQUIRE_EQ ( (int64_t)5, first );
+        REQUIRE_EQ ( (uint64_t)4, count );
+
+        REQUIRE_EQ ( (size_t)1221, BlobBufferBytes ( blob ) );
+
+        //TODO: use row map to convert an offset into a rowId
+
+        REQUIRE_RC ( VCursorCloseRow (curs ) );
+        REQUIRE_RC ( VBlobRelease ( (struct VBlob *) blob ) );
+    }
+}
+
+FIXTURE_TEST_CASE(VCursor_GetBlob_WGS, VdbFixture)
+{   // single fragment per row, multiple rows per blob
+    REQUIRE_RC ( Setup ( "ALWZ01", "READ" ) );
+    REQUIRE_RC ( VCursorOpen (curs ) );
+
+    {
+        REQUIRE_RC ( VCursorSetRowId (curs, 1 ) );
+        REQUIRE_RC ( VCursorOpenRow (curs ) );
+
+        struct VBlob const *blob;
+        REQUIRE_RC ( VCursorGetBlob ( curs, &blob, col_idx ) );
+
+        int64_t first;
+        uint64_t count;
+        REQUIRE_RC ( VBlobIdRange ( blob, &first, &count ) );
+        REQUIRE_EQ ( (int64_t)1, first );
+        REQUIRE_EQ ( (uint64_t)4, count );
+
+        REQUIRE_EQ ( (size_t)948, BlobBufferBytes ( blob ) );
+
+        //TODO: use row map to convert an offset into a rowId
+        REQUIRE_NOT_NULL ( blob->pm );
+        REQUIRE ( ! blob->pm->random_access );
+        REQUIRE_EQ ( (int)PageMap::eBlobPageMapOptimizedNone, (int)blob->pm->optimized );
+
+        REQUIRE_EQ ( (pm_size_t)4, blob->pm->leng_recs ); // not expanded ?
+        REQUIRE_NOT_NULL ( blob->pm->length );   // array of lengths, size blob->pm->leng_recs
+        REQUIRE_EQ ( (elem_count_t)227, blob->pm->length[0] );
+        REQUIRE_EQ ( (elem_count_t)245, blob->pm->length[1] );
+        REQUIRE_EQ ( (elem_count_t)211, blob->pm->length[2] );
+        REQUIRE_EQ ( (elem_count_t)265, blob->pm->length[3] );
+
+        REQUIRE_NOT_NULL ( blob->pm->leng_run ); // array of run lengths, size blob->pm->leng_recs
+        REQUIRE_EQ ( (row_count_t)1, blob->pm->leng_run[0] );
+        REQUIRE_EQ ( (row_count_t)1, blob->pm->leng_run[1] );
+        REQUIRE_EQ ( (row_count_t)1, blob->pm->leng_run[2] );
+        REQUIRE_EQ ( (row_count_t)1, blob->pm->leng_run[3] );
+        //NOTE: very unlikely to happen for READ column, but if leng_run > 1, the corresponding fragments should all appear in the search results
+
+        REQUIRE_EQ ( (pm_size_t)4, blob->pm->data_recs );
+
+        REQUIRE_EQ ( (row_count_t)4,  blob->pm->row_count );
+        REQUIRE_EQ ( (row_count_t)0,  blob->pm->pre_exp_row_count );
+
+        REQUIRE_RC ( VCursorCloseRow (curs ) );
+        REQUIRE_RC ( VBlobRelease ( (struct VBlob *) blob ) );
+    }
+
+    {
+        REQUIRE_RC ( VCursorSetRowId (curs, 5 ) );
+        REQUIRE_RC ( VCursorOpenRow (curs ) );
+
+        struct VBlob const *blob;
+
+        int64_t first;
+        uint64_t count;
+        REQUIRE_RC ( VCursorGetBlob ( curs, &blob, col_idx ) );
+        REQUIRE_RC ( VBlobIdRange ( blob, &first, &count ) );
+        REQUIRE_EQ ( (int64_t)5, first );
+        REQUIRE_EQ ( (uint64_t)4, count );
+
+        REQUIRE_EQ ( (size_t)1184, BlobBufferBytes ( blob ) );
+
+        //TODO: use row map to convert an offset into a rowId
+
+        REQUIRE_RC ( VCursorCloseRow (curs ) );
+        REQUIRE_RC ( VBlobRelease ( (struct VBlob *) blob ) );
+    }
+}
+
+FIXTURE_TEST_CASE(VCursor_GetBlob_SequentialAccess, VdbFixture)
+{   // VDB-2858: sequential access to blobs broken
+    REQUIRE_RC ( Setup ( "ALAI01", "READ" ) );
+    REQUIRE_RC ( VCursorOpen (curs ) );
+
+    int64_t first;
+    uint64_t count;
+
+    REQUIRE_RC ( VCursorIdRange (curs, 0, &first, &count ) );
+
+    int64_t rowId = 1;
+    while (true)
+    {
+        REQUIRE_RC ( VCursorSetRowId ( curs, rowId ) );
+        REQUIRE_RC ( VCursorOpenRow ( curs ) );
+
+        struct VBlob const *blob;
+        if ( VCursorGetBlob ( curs, &blob, col_idx ) != 0 )
+        {
+            break;
+        }
+
+        REQUIRE_RC ( VBlobIdRange ( blob, &first, &count ) );
+        REQUIRE_EQ ( rowId, first );
+
+        REQUIRE_RC ( VCursorCloseRow (curs ) );
+        REQUIRE_RC ( VBlobRelease ( (struct VBlob *) blob ) );
+
+        rowId += count;
+    }
+}
+
+FIXTURE_TEST_CASE(VCursor_GetBlob_RandomAccess, VdbFixture)
+{
+    REQUIRE_RC ( Setup ( "SRR000001", "READ" ) );
+    REQUIRE_RC ( VCursorOpen (curs ) );
+
+    // when accessing randomly, blob sizes stay very small
+    REQUIRE ( CheckBlobRange ( 1, 1, 4 ) );
+    REQUIRE ( CheckBlobRange ( 1000, 1000, 1 ) );
+    REQUIRE ( CheckBlobRange ( 14, 14, 1 ) );
+    REQUIRE ( CheckBlobRange ( 1200, 1200, 1 ) );
+    REQUIRE ( CheckBlobRange ( 14000, 14000, 1 ) );
+    REQUIRE ( CheckBlobRange ( 14001, 14001, 4 ) ); // sequential access starts growing the blob
+    REQUIRE ( CheckBlobRange ( 1400, 1400, 1 ) ); // back to random
+    REQUIRE ( CheckBlobRange ( 140000, 140000, 1 ) );
+    REQUIRE ( CheckBlobRange ( 14001, 14001, 1 ) );
+}
+
+FIXTURE_TEST_CASE(PageMapIterator_WGS, VdbFixture)
+{   // single fragment per row, multiple rows per blob
+    REQUIRE_RC ( Setup ( "ALWZ01", "READ" ) );
+    REQUIRE_RC ( VCursorOpen (curs ) );
+
+    {
+        REQUIRE_RC ( VCursorSetRowId (curs, 1 ) );
+        REQUIRE_RC ( VCursorOpenRow (curs ) );
+
+        struct VBlob const *blob;
+        REQUIRE_RC ( VCursorGetBlob ( curs, &blob, col_idx ) );
+
+        PageMapIterator pmIt;
+        REQUIRE_RC ( PageMapNewIterator ( (const PageMap*)blob->pm, &pmIt, 0, 4 ) );
+        REQUIRE_EQ ( (elem_count_t)227, PageMapIteratorDataLength ( &pmIt ) );
+        REQUIRE_EQ ( (elem_count_t)0, PageMapIteratorDataOffset ( &pmIt ) );
+        REQUIRE_EQ ( (row_count_t)1, PageMapIteratorRepeatCount ( &pmIt ) );
+
+        REQUIRE ( PageMapIteratorNext ( &pmIt ) );
+        REQUIRE_EQ ( (elem_count_t)245, PageMapIteratorDataLength ( &pmIt ) );
+        REQUIRE_EQ ( (elem_count_t)227, PageMapIteratorDataOffset ( &pmIt ) );
+        REQUIRE_EQ ( (row_count_t)1, PageMapIteratorRepeatCount ( &pmIt ) );
+
+        REQUIRE ( PageMapIteratorNext ( &pmIt ) );
+        REQUIRE_EQ ( (elem_count_t)211, PageMapIteratorDataLength ( &pmIt ) );
+        REQUIRE_EQ ( (elem_count_t)227+245, PageMapIteratorDataOffset ( &pmIt ) );
+        REQUIRE_EQ ( (row_count_t)1, PageMapIteratorRepeatCount ( &pmIt ) );
+
+        REQUIRE ( PageMapIteratorNext ( &pmIt ) );
+        REQUIRE_EQ ( (elem_count_t)265, PageMapIteratorDataLength ( &pmIt ) );
+        REQUIRE_EQ ( (elem_count_t)227+245+211, PageMapIteratorDataOffset ( &pmIt ) );
+        REQUIRE_EQ ( (row_count_t)1, PageMapIteratorRepeatCount ( &pmIt ) );
+
+        REQUIRE ( ! PageMapIteratorNext ( &pmIt ) );
+
+        REQUIRE_RC ( VCursorCloseRow (curs ) );
+        REQUIRE_RC ( VBlobRelease ( (struct VBlob *) blob ) );
+    }
+}
+
+FIXTURE_TEST_CASE ( VCursor_FindNextRowIdDirect, VdbFixture )
+{
+    REQUIRE_RC ( Setup ( "SRR000001", "READ" ) );
+    REQUIRE_RC ( VCursorOpen (curs ) );
+    int64_t next;
+    REQUIRE_RC ( VCursorFindNextRowIdDirect ( curs, col_idx, 1, & next ) );
+    REQUIRE_EQ ( (int64_t)1, next ) ;
+    REQUIRE_RC ( VCursorFindNextRowIdDirect ( curs, col_idx, 2, & next ) );
+    REQUIRE_EQ ( (int64_t)2, next ) ; // VDB-3075: next == 1
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-vdb";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=VdbTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/vdb/test-wvdb.cpp b/test/vdb/test-wvdb.cpp
new file mode 100644
index 0000000..8e6ef6e
--- /dev/null
+++ b/test/vdb/test-wvdb.cpp
@@ -0,0 +1,520 @@
+// ===========================================================================
+//
+//                            PUBLIC DOMAIN NOTICE
+//               National Center for Biotechnology Information
+//
+//  This software/database is a "United States Government Work" under the
+//  terms of the United States Copyright Act.  It was written as part of
+//  the author's official duties as a United States Government employee and
+//  thus cannot be copyrighted.  This software/database is freely available
+//  to the public for use. The National Library of Medicine and the U.S.
+//  Government have not placed any restriction on its use or reproduction.
+//
+//  Although all reasonable efforts have been taken to ensure the accuracy
+//  and reliability of the software and data, the NLM and the U.S.
+//  Government do not and cannot warrant the performance or results that
+//  may be obtained by using this software or data. The NLM and the U.S.
+//  Government disclaim all warranties, express or implied, including
+//  warranties of performance, merchantability or fitness for any particular
+//  purpose.
+//
+//  Please cite the author in any work or product based on this material.
+//
+// ===========================================================================
+
+#include <klib/log.h>
+
+#include <vdb/manager.h> // VDBManager
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h> /* VSchemaRelease */
+#include <vdb/vdb-priv.h>
+
+#include <sra/sraschema.h> // VDBManagerMakeSRASchema
+
+#include <kdb/meta.h>
+#include <kdb/table.h>
+
+#include <ktst/unit_test.hpp> // TEST_CASE
+
+#include <sysalloc.h>
+
+#include <sstream>
+#include <cstdlib>
+
+using namespace std;
+
+TEST_SUITE( WVdbTestSuite )
+
+const string ScratchDir = "./db/";
+
+class WVDB_Fixture
+{
+public:
+    WVDB_Fixture()
+    : m_db ( 0 )
+    {
+    }
+    ~WVDB_Fixture()
+    {
+        if ( m_db )
+        {
+            VDatabaseRelease ( m_db );
+        }
+        RemoveDatabase();
+    }
+
+    void RemoveDatabase ()
+    {
+        if ( ! m_databaseName . empty () )
+        {
+            KDirectory* wd;
+            KDirectoryNativeDir ( & wd );
+            KDirectoryRemove ( wd, true, m_databaseName . c_str () );
+            KDirectoryRelease ( wd );
+        }
+    }
+
+    void MakeDatabase ( const string& p_schemaText, const string& p_schemaSpec )
+    {
+        RemoveDatabase();
+
+        VDBManager* mgr;
+        THROW_ON_RC ( VDBManagerMakeUpdate ( & mgr, NULL ) );
+        VSchema* schema;
+        THROW_ON_RC ( VDBManagerMakeSchema ( mgr, & schema ) );
+        THROW_ON_RC ( VSchemaParseText(schema, NULL, p_schemaText . c_str(), p_schemaText . size () ) );
+
+        THROW_ON_RC ( VDBManagerCreateDB ( mgr,
+                                          & m_db,
+                                          schema,
+                                          p_schemaSpec . c_str (),
+                                          kcmInit + kcmMD5,
+                                          "%s",
+                                          m_databaseName . c_str () ) );
+        THROW_ON_RC ( VSchemaRelease ( schema ) );
+        THROW_ON_RC ( VDBManagerRelease ( mgr ) );
+    }
+
+    string m_databaseName;
+    VDatabase* m_db;
+};
+
+// this test case is not very useful but is here as a blueprint for other write-side tests
+FIXTURE_TEST_CASE ( BlobCorruptOnCommit, WVDB_Fixture)
+{
+    m_databaseName = ScratchDir + GetName();
+    RemoveDatabase();
+
+    const string schemaText =
+"function < type T > T echo #1.0 < T val > ( * any row_len ) = vdb:echo;\n"
+"table spotdesc #1\n"
+"{\n"
+"    extern column ascii LABEL = out_label;\n"
+"};\n"
+"table reference #1 = spotdesc #1\n"
+"{\n"
+
+//  this will break the test
+//"    ascii out_label = < ascii > echo < \"reference\" > ();\n"
+
+// this will work
+"    physical column ascii .LABEL = in_label;\n"
+"    ascii in_label = LABEL;\n"
+"    ascii out_label = .LABEL | < ascii > echo < 'label' > ();\n"
+
+"};\n"
+"database db #1\n"
+"{\n"
+"    table reference #1 REFERENCE;\n"
+"};\n"
+;
+    const char * schemaSpec = "db";
+    MakeDatabase ( schemaText, schemaSpec );
+
+    // MakeCursor
+    VCursor* cursor;
+    {
+        VTable* table;
+        REQUIRE_RC ( VDatabaseCreateTable ( m_db, & table, "REFERENCE", kcmCreate | kcmMD5, "%s", "REFERENCE" ) );
+        REQUIRE_RC ( VTableCreateCursorWrite ( table, & cursor, kcmInsert ) );
+        REQUIRE_RC ( VTableRelease ( table ) );
+    }
+
+    // AddColumns
+    uint32_t columnIdx;
+    REQUIRE_RC ( VCursorAddColumn ( cursor, & columnIdx, "%s", "LABEL" ) );
+
+    REQUIRE_RC ( VCursorOpen ( cursor  ) );
+
+    for ( int i = 0; i < 4096; ++i)
+    {
+        ostringstream out;
+        out << rand();
+
+        REQUIRE_RC ( VCursorOpenRow ( cursor ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, columnIdx, 8, out.str().c_str(), 0, out.str().size() ) );
+        REQUIRE_RC ( VCursorCommitRow ( cursor ) );
+        REQUIRE_RC ( VCursorCloseRow ( cursor ) );
+
+        //REQUIRE_RC ( VCursorFlushPage ( cursor ) ); // kaboom
+    }
+
+    REQUIRE_RC ( VCursorCommit ( cursor ) );    // this returns rcVDB,rcBlob,rcValidating,rcBlob,rcCorrupt if the schema does not support
+                                                // writing to the LABEL column from the code
+    REQUIRE_RC ( VCursorRelease ( cursor ) );
+}
+
+FIXTURE_TEST_CASE ( ColumnOpenMetadata, WVDB_Fixture )
+{   // setting column metadata in a freshly created VDatabase
+    m_databaseName = ScratchDir + GetName();
+    RemoveDatabase();
+
+    string schemaText = "table table1 #1.0.0 { column ascii column1; };"
+                        "database root_database #1 { table table1 #1 TABLE1; } ;";
+
+    const char* TableName = "TABLE1";
+    const char* ColumnName = "column1";
+
+    MakeDatabase ( schemaText, "root_database" );
+
+    {
+        VTable* table;
+        REQUIRE_RC ( VDatabaseCreateTable ( m_db , & table, TableName, kcmInit + kcmMD5, TableName ) );
+
+        VCursor* cursor;
+        REQUIRE_RC ( VTableCreateCursorWrite ( table, & cursor, kcmInsert ) );
+        uint32_t column_idx;
+        REQUIRE_RC ( VCursorAddColumn ( cursor, & column_idx, ColumnName ) );
+        REQUIRE_RC ( VCursorOpen ( cursor ) );
+
+        // need to insert 2 rows with different values to make the column physical
+        REQUIRE_RC ( VCursorOpenRow ( cursor ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx, 8, "blah", 0, 4 ) );
+        REQUIRE_RC ( VCursorCommitRow ( cursor ) );
+        REQUIRE_RC ( VCursorCloseRow ( cursor ) );
+
+        REQUIRE_RC ( VCursorOpenRow ( cursor ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx, 8, "eeee", 0, 4 ) );
+        REQUIRE_RC ( VCursorCommitRow ( cursor ) );
+        REQUIRE_RC ( VCursorCloseRow ( cursor ) );
+
+        REQUIRE_RC ( VCursorCommit ( cursor ) );
+
+        REQUIRE_RC ( VCursorRelease ( cursor ) );
+        REQUIRE_RC ( VTableRelease ( table ) );
+    }
+    // update the column's metadata without re-opening the database
+    {
+        VTable* table;
+        REQUIRE_RC ( VDatabaseOpenTableUpdate ( m_db , & table, TableName ) );
+        KTable* ktbl;
+        REQUIRE_RC ( VTableOpenKTableUpdate ( table, & ktbl ) );
+        KColumn* col;
+        REQUIRE_RC ( KTableOpenColumnUpdate ( ktbl, & col, ColumnName ) );
+
+        // finally, open the metadata
+        KMetadata *meta;
+        REQUIRE_RC ( KColumnOpenMetadataUpdate ( col, &meta ) );
+
+        KMDataNode* node;
+        REQUIRE_RC ( KMetadataOpenNodeUpdate ( meta, & node, "key" ) );
+        const char* MetadataValue = "metavalue";
+        REQUIRE_RC ( KMDataNodeWrite ( node, MetadataValue, string_size ( MetadataValue ) ) );
+        REQUIRE_RC ( KMDataNodeRelease ( node ) );
+
+        REQUIRE_RC ( KMetadataRelease ( meta ) );
+        REQUIRE_RC ( KColumnRelease ( col ) );
+        REQUIRE_RC ( KTableRelease ( ktbl ) );
+        REQUIRE_RC ( VTableRelease ( table ) );
+    }
+}
+
+FIXTURE_TEST_CASE ( VTableDropColumn_PhysicalColumn, WVDB_Fixture )
+{
+    m_databaseName = ScratchDir + GetName();
+    RemoveDatabase();
+
+    string schemaText = "table table1 #1.0.0 { column ascii column1; column ascii column2; };"
+                        "database root_database #1 { table table1 #1 TABLE1; } ;";
+
+    const char* TableName = "TABLE1";
+    const char* ColumnName1 = "column1";
+    const char* ColumnName2 = "column2";
+
+    MakeDatabase ( schemaText, "root_database" );
+    {
+        VTable* table;
+        REQUIRE_RC ( VDatabaseCreateTable ( m_db , & table, TableName, kcmInit + kcmMD5, TableName ) );
+
+        VCursor* cursor;
+        REQUIRE_RC ( VTableCreateCursorWrite ( table, & cursor, kcmInsert ) );
+        uint32_t column_idx1;
+        uint32_t column_idx2;
+        REQUIRE_RC ( VCursorAddColumn ( cursor, & column_idx1, ColumnName1 ) );
+        REQUIRE_RC ( VCursorAddColumn ( cursor, & column_idx2, ColumnName2 ) );
+        REQUIRE_RC ( VCursorOpen ( cursor ) );
+
+        // need to insert 2 rows with different values to make the column physical
+        REQUIRE_RC ( VCursorOpenRow ( cursor ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx1, 8, "blah", 0, 4 ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx2, 8, "blah", 0, 4 ) );
+        REQUIRE_RC ( VCursorCommitRow ( cursor ) );
+        REQUIRE_RC ( VCursorCloseRow ( cursor ) );
+
+        REQUIRE_RC ( VCursorOpenRow ( cursor ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx1, 8, "eeee", 0, 4 ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx2, 8, "eeee", 0, 4 ) );
+        REQUIRE_RC ( VCursorCommitRow ( cursor ) );
+        REQUIRE_RC ( VCursorCloseRow ( cursor ) );
+
+        REQUIRE_RC ( VCursorCommit ( cursor ) );
+
+        REQUIRE_RC ( VCursorRelease ( cursor ) );
+        REQUIRE_RC ( VTableRelease ( table ) );
+    }
+    // drop column1
+    {
+        VTable* table;
+        REQUIRE_RC ( VDatabaseOpenTableUpdate ( m_db , & table, TableName ) );
+        REQUIRE_RC ( VTableDropColumn ( table, ColumnName1 ) );
+        REQUIRE_RC ( VTableRelease ( table ) );
+    }
+    // finally, check resulted db
+    {
+        VTable* table;
+        REQUIRE_RC ( VDatabaseOpenTableUpdate ( m_db , & table, TableName ) );
+        const VCursor* cursor;
+        REQUIRE_RC ( VTableCreateCursorRead ( (const VTable*) table, & cursor ) );
+        uint32_t column_idx1;
+        uint32_t column_idx2;
+        REQUIRE_RC ( VCursorOpen ( cursor ) );
+
+        KLogLevel logLevel = KLogLevelGet();
+        REQUIRE_RC ( KLogLevelSet ( klogFatal ) );
+        REQUIRE_RC_FAIL ( VCursorAddColumn ( cursor, & column_idx1, ColumnName1 ) );
+        REQUIRE_RC ( KLogLevelSet ( logLevel ) );
+        REQUIRE_RC ( VCursorAddColumn ( cursor, & column_idx2, ColumnName2 ) );
+
+        REQUIRE_RC ( VCursorRelease ( cursor ) );
+        REQUIRE_RC ( VTableRelease ( table ) );
+    }
+}
+
+FIXTURE_TEST_CASE ( CreateTableInNestedDatabase, WVDB_Fixture )
+{   // VDB-1617: VDatabaseOpenTableRead inside a nested database segfaults
+    m_databaseName = ScratchDir + GetName();
+    string schemaText =
+        "table table1 #1.0.0 { column ascii column1; };"
+        "database database0 #1 { table table1 #1 TABLE1; } ;"
+        "database db #1 { database database0 #1 SUBDB; } ;" ;
+
+    // Create the database and the table
+    MakeDatabase ( schemaText, "db" );
+    {   // make nested database and a table in it
+        VDatabase* subdb;
+        REQUIRE_RC ( VDatabaseCreateDB ( m_db, & subdb, "SUBDB", kcmInit + kcmMD5, "SUBDB" ) );
+
+        VTable *tbl;
+        REQUIRE_RC ( VDatabaseCreateTable ( subdb, & tbl, "TABLE1", kcmInit + kcmMD5, "TABLE1" ) );
+
+        REQUIRE_RC ( VTableRelease ( tbl ) );
+        REQUIRE_RC ( VDatabaseRelease ( subdb ) );
+    }
+    REQUIRE_RC ( VDatabaseRelease ( m_db ) );
+
+    // Re-open the database, try to open the table
+    {
+        VDBManager * mgr;
+        VDatabase  * subdb;
+        const VTable * tbl;
+
+        REQUIRE_RC ( VDBManagerMakeUpdate ( & mgr, NULL ) );
+        REQUIRE_RC ( VDBManagerOpenDBUpdate ( mgr,
+                                              & m_db,
+                                              NULL,
+                                              "%s",
+                                              m_databaseName . c_str () ) );
+        REQUIRE_RC ( VDatabaseOpenDBUpdate ( m_db, & subdb, "SUBDB" ) );
+
+        // open the nested database and a table in it
+        REQUIRE_RC ( VDatabaseOpenTableRead ( subdb, & tbl, "%s", "TABLE1" ) ); // segfault no more...
+        REQUIRE_RC ( VTableRelease ( tbl ) );
+
+        REQUIRE_RC ( VDatabaseRelease ( subdb ) );
+        REQUIRE_RC ( VDBManagerRelease ( mgr ) );
+    }
+}
+
+FIXTURE_TEST_CASE ( VTableDropColumn_MetadataColumn_VDB_2735, WVDB_Fixture )
+{
+    m_databaseName = ScratchDir + GetName();
+    RemoveDatabase();
+
+    string schemaText = "table table1 #1.0.0 { column ascii column1; column ascii column2; };"
+                        "database root_database #1 { table table1 #1 TABLE1; } ;";
+
+    const char* TableName = "TABLE1";
+    const char* ColumnName1 = "column1";
+    const char* ColumnName2 = "column2";
+
+    MakeDatabase ( schemaText, "root_database" );
+    {
+        VTable* table;
+        REQUIRE_RC ( VDatabaseCreateTable ( m_db , & table, TableName, kcmInit + kcmMD5, TableName ) );
+
+        VCursor* cursor;
+        REQUIRE_RC ( VTableCreateCursorWrite ( table, & cursor, kcmInsert ) );
+        uint32_t column_idx1;
+        uint32_t column_idx2;
+        REQUIRE_RC ( VCursorAddColumn ( cursor, & column_idx1, ColumnName1 ) );
+        REQUIRE_RC ( VCursorAddColumn ( cursor, & column_idx2, ColumnName2 ) );
+        REQUIRE_RC ( VCursorOpen ( cursor ) );
+
+        // need to insert 2 rows with same values to keep the column in metadata
+        REQUIRE_RC ( VCursorOpenRow ( cursor ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx1, 8, "blah", 0, 4 ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx2, 8, "blah", 0, 4 ) );
+        REQUIRE_RC ( VCursorCommitRow ( cursor ) );
+        REQUIRE_RC ( VCursorCloseRow ( cursor ) );
+
+        REQUIRE_RC ( VCursorOpenRow ( cursor ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx1, 8, "blah", 0, 4 ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx2, 8, "blah", 0, 4 ) );
+        REQUIRE_RC ( VCursorCommitRow ( cursor ) );
+        REQUIRE_RC ( VCursorCloseRow ( cursor ) );
+
+        REQUIRE_RC ( VCursorCommit ( cursor ) );
+
+        REQUIRE_RC ( VCursorRelease ( cursor ) );
+        REQUIRE_RC ( VTableRelease ( table ) );
+    }
+    // drop column1
+    {
+        VTable* table;
+        REQUIRE_RC ( VDatabaseOpenTableUpdate (m_db , & table, TableName ) );
+        REQUIRE_RC ( VTableDropColumn ( table, ColumnName1 ) );
+        REQUIRE_RC ( VTableRelease ( table ) );
+    }
+    // finally, check resulted db
+    {
+        VTable* table;
+        REQUIRE_RC ( VDatabaseOpenTableUpdate ( m_db , & table, TableName ) );
+        const VCursor* cursor;
+        REQUIRE_RC ( VTableCreateCursorRead ( (const VTable*) table, & cursor ) );
+        uint32_t column_idx1;
+        uint32_t column_idx2;
+        REQUIRE_RC ( VCursorOpen ( cursor ) );
+
+        KLogLevel logLevel = KLogLevelGet();
+        REQUIRE_RC ( KLogLevelSet ( klogFatal ) );
+        REQUIRE_RC_FAIL ( VCursorAddColumn ( cursor, & column_idx1, ColumnName1 ) );
+        REQUIRE_RC ( KLogLevelSet ( logLevel ) );
+        REQUIRE_RC ( VCursorAddColumn ( cursor, & column_idx2, ColumnName2 ) );
+
+        REQUIRE_RC ( VCursorRelease ( cursor ) );
+        REQUIRE_RC ( VTableRelease ( table ) );
+    }
+}
+
+FIXTURE_TEST_CASE ( VCursor_FindNextRowIdDirect, WVDB_Fixture )
+{
+    m_databaseName = ScratchDir + GetName();
+    RemoveDatabase();
+
+    string schemaText = "table table1 #1.0.0 { column ascii column1; };"
+                        "database root_database #1 { table table1 #1 TABLE1; } ;";
+
+    const char* TableName = "TABLE1";
+    const char* ColumnName = "column1";
+
+    MakeDatabase ( schemaText, "root_database" );
+    {
+        VTable* table;
+        REQUIRE_RC ( VDatabaseCreateTable ( m_db , & table, TableName, kcmInit + kcmMD5, TableName ) );
+
+        VCursor* cursor;
+        REQUIRE_RC ( VTableCreateCursorWrite ( table, & cursor, kcmInsert ) );
+        uint32_t column_idx;
+        REQUIRE_RC ( VCursorAddColumn ( cursor, & column_idx, ColumnName ) );
+        REQUIRE_RC ( VCursorOpen ( cursor ) );
+
+        // insert some rows
+        REQUIRE_RC ( VCursorOpenRow ( cursor ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx, 8, "blah", 0, 4 ) );
+        REQUIRE_RC ( VCursorCommitRow ( cursor ) );
+        REQUIRE_RC ( VCursorCloseRow ( cursor ) );
+
+        REQUIRE_RC ( VCursorOpenRow ( cursor ) );
+        REQUIRE_RC ( VCursorWrite ( cursor, column_idx, 8, "eeee", 0, 4 ) );
+        REQUIRE_RC ( VCursorCommitRow ( cursor ) );
+        REQUIRE_RC ( VCursorCloseRow ( cursor ) );
+
+        REQUIRE_RC ( VCursorCommit ( cursor ) );
+
+        REQUIRE_RC ( VCursorRelease ( cursor ) );
+        REQUIRE_RC ( VTableReindex ( table ) );
+        REQUIRE_RC ( VTableRelease ( table ) );
+    }
+    REQUIRE_RC ( VDatabaseRelease ( m_db ) );
+
+    {   // reopen
+        VDBManager * mgr;
+        REQUIRE_RC ( VDBManagerMakeUpdate ( & mgr, NULL ) );
+        VDBManagerOpenDBRead ( mgr, (const VDatabase**)& m_db, NULL, m_databaseName . c_str () );
+
+        const VTable* table;
+        REQUIRE_RC ( VDatabaseOpenTableRead ( m_db , & table, TableName ) );
+
+        const VCursor* cursor;
+        REQUIRE_RC ( VTableCreateCursorRead ( table, & cursor ) );
+
+        uint32_t column_idx;
+        REQUIRE_RC ( VCursorAddColumn ( cursor, & column_idx, ColumnName ) );
+        REQUIRE_RC ( VCursorOpen ( cursor ) );
+
+        int64_t next;
+        REQUIRE_RC ( VCursorFindNextRowIdDirect ( cursor, column_idx, 1, & next ) );
+        REQUIRE_EQ ( (int64_t)1, next ) ;
+        REQUIRE_RC ( VCursorFindNextRowIdDirect ( cursor, column_idx, 2, & next ) );
+        REQUIRE_EQ ( (int64_t)2, next ) ; // VDB-3075: next == 1
+
+        REQUIRE_RC ( VCursorRelease ( cursor ) );
+        REQUIRE_RC ( VTableRelease ( table ) );
+    }
+
+}
+
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "test-wvdb";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=WVdbTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/vfs/Makefile b/test/vfs/Makefile
new file mode 100644
index 0000000..9ac91a2
--- /dev/null
+++ b/test/vfs/Makefile
@@ -0,0 +1,141 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/vfs
+
+TEST_TOOLS = \
+    redirect-rejected-names-cgi-http-to-https \
+    test-caching \
+    test-vfsmanager \
+    test-path-c \
+    test-path \
+    test-resolver
+
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# C test on VPath (aka test-vfs on Windows)
+#
+
+TEST_SRC = \
+	path-test
+
+TEST_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_SRC))
+
+TEST_LIB = \
+	-skapp \
+	-sncbi-vdb \
+
+$(TEST_BINDIR)/test-path-c: $(TEST_OBJ)
+	$(LD) --exe -o $@ $^ $(TEST_LIB)
+
+#----------------------------------------------------------------
+# C++ test on VPath
+#
+
+PATHTEST_SRC = \
+	pathtest 
+
+PATHTEST_OBJ = \
+	$(addsuffix .$(OBJX),$(PATHTEST_SRC))
+
+PATHTEST_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-vdb \
+
+$(TEST_BINDIR)/test-path: $(PATHTEST_OBJ)
+	$(LP) --exe -o $@ $^ $(PATHTEST_LIB)
+
+#----------------------------------------------------------------
+HTTPS_SRC = \
+	redirect-rejected-names-cgi-http-to-https
+
+HTTPS_OBJ = \
+	$(addsuffix .$(OBJX),$(HTTPS_SRC))
+
+$(TEST_BINDIR)/redirect-rejected-names-cgi-http-to-https: $(HTTPS_OBJ)
+	$(LP) --exe -o $@ $^ $(PATHTEST_LIB)
+
+#----------------------------------------------------------------
+# test-caching
+
+CACHING_SRC = \
+	test-caching
+
+CACHING_OBJ = \
+	$(addsuffix .$(OBJX),$(CACHING_SRC))
+
+$(TEST_BINDIR)/test-caching: $(CACHING_OBJ)
+	$(LP) --exe -o $@ $^ $(PATHTEST_LIB)
+
+#----------------------------------------------------------------
+# C++ test on VFSManager
+#
+
+MANAGERTEST_SRC = \
+	managertest 
+
+MANAGERTEST_OBJ = \
+	$(addsuffix .$(OBJX),$(MANAGERTEST_SRC))
+
+MANAGERTEST_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-vdb \
+
+$(TEST_BINDIR)/test-vfsmanager: $(MANAGERTEST_OBJ)
+	$(LP) --exe -o $@ $^ $(MANAGERTEST_LIB)
+
+
+#----------------------------------------------------------------
+# C++ test on VResolver
+#
+
+RESOLVERTEST_SRC = \
+	resolvertest 
+
+RESOLVERTEST_OBJ = \
+	$(addsuffix .$(OBJX),$(RESOLVERTEST_SRC))
+
+RESOLVERTEST_LIB = \
+	-skapp \
+	-sktst \
+	-sncbi-vdb \
+
+$(TEST_BINDIR)/test-resolver: $(RESOLVERTEST_OBJ)
+	$(LP) --exe -o $@ $^ $(RESOLVERTEST_LIB)
diff --git a/test/vfs/caching-kfg/incomplete.kfg b/test/vfs/caching-kfg/incomplete.kfg
new file mode 100644
index 0000000..31db5ff
--- /dev/null
+++ b/test/vfs/caching-kfg/incomplete.kfg
@@ -0,0 +1,4 @@
+/repository/remote/main/CGI/resolver-cgi = "http://www.ncbi.nlm.nih.gov/Traces/names/names.cgi"
+/TEST_ROOT = "/tmp/$(USER)"
+/TEST_SUBROOT = "$(TEST_ROOT)/$(BUILD)"
+/repository/user/main/public/root = "$(TEST_SUBROOT)/test-caching"
diff --git a/test/vfs/managertest.cpp b/test/vfs/managertest.cpp
new file mode 100644
index 0000000..dee82c7
--- /dev/null
+++ b/test/vfs/managertest.cpp
@@ -0,0 +1,490 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for VFSManager interface
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <vfs/manager.h>
+#include <vfs/manager-priv.h>
+#include <vfs/path.h>
+
+#include <kfg/config.h>
+#include <kfg/keystore.h>
+#include <kfg/kfg-priv.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <cstdlib>
+#include <stdexcept>
+
+#include <string.h>
+
+#include <sysalloc.h>
+
+TEST_SUITE(VManagerTestSuite);
+
+using namespace std;
+
+const char* pwFileName="pwfile";
+const char* password = "password";
+
+class MgrFixture
+{
+public:
+    static const int BufSize = 1024;
+
+public:
+    MgrFixture()
+        : wd ( 0 )
+        , mgr ( 0 )
+        , vpath(0)
+        , num_read(0)
+        , num_writ ( 0 )
+    {
+        if (KDirectoryNativeDir ( &wd ) != 0)
+           throw logic_error("MgrFixture: KDirectoryNativeDir failed");   
+    
+        if (VFSManagerMake(&mgr) != 0 || mgr == 0)
+           throw logic_error("MgrFixture: VFSManagerMake failed");    
+        
+        // stick a reference to our pwfile into the VFSManager's configuration 
+        // (no easy way to do that through putenv that would work on Windows dynamic since
+        // vfs.dll would have its own copy of environment)
+        const KConfig* kfg = VFSManagerGetConfig(mgr);
+        if (!kfg)
+           throw logic_error("MgrFixture: VFSManagerGetConfig failed");    
+        KConfigNode* node;
+        if (KConfigOpenNodeUpdate((KConfig*)kfg, &node, KFG_KRYPTO_PWFILE) != 0)
+           throw logic_error("MgrFixture: KConfigOpenNodeUpdate failed");    
+           
+        if (KConfigNodeWrite(node, pwFileName, strlen(pwFileName)) != 0)
+           throw logic_error("MgrFixture: KConfigNodeWrite failed");   
+        if (KConfigNodeRelease(node) != 0)
+           throw logic_error("MgrFixture: KConfigNodeRelease failed");   
+
+        // make sure pwfile contains the correct password (some tests might update it)
+        CreateFile(pwFileName, password);
+    }
+    ~MgrFixture()
+    {
+        if (KDirectoryRemove(wd, true, pwFileName))
+           throw logic_error("~MgrFixture: KDirectoryRemove failed");   
+        if (vpath && VPathRelease(vpath) != 0)
+           throw logic_error("~MgrFixture: VPathRelease failed");
+        if (mgr && VFSManagerRelease(mgr) != 0)
+           throw logic_error("~MgrFixture: VFSManagerRelease failed");
+        if (KDirectoryRelease(wd) != 0)
+           throw logic_error("~MgrFixture: KDirectoryRelease failed");   
+    }
+    
+    void CreateFile(const string& name, const string& content)
+    {
+        KFile* f;
+        if (KDirectoryCreateFile(wd, &f, false, 0660, kcmInit, name.c_str()) != 0)
+           throw logic_error("CreateFile: KDirectoryCreateFile failed");   
+        if (KFileWrite(f, 0, content.c_str(), content.size(), &num_writ) != 0 || num_writ != content.size())
+           throw logic_error("CreateFile: KDirectoryOpenFileWrite failed");   
+        if (KFileRelease(f) != 0)
+           throw logic_error("CreateFile: KFileRelease failed");   
+    }
+    string ReadContent(const KFile* file)
+    {
+        if (KFileReadAll ( file, 0, buf, BufSize, &num_read ) != 0)
+           throw logic_error("ReadContent: KFileReadAll failed");   
+        return string(buf, num_read);
+    }
+
+    KDirectory* wd;
+    VFSManager* mgr;
+    VPath* vpath;
+
+    // for use in KFileReadAll et al
+    char buf[BufSize];
+    size_t num_read;
+    size_t num_writ;
+};
+
+TEST_CASE(Make_Basic)
+{
+    VFSManager* mgr;
+    REQUIRE_RC(VFSManagerMake(&mgr));
+    REQUIRE_RC(VFSManagerRelease(mgr));
+}
+
+/////////////// Accessing encrypted objects
+string protectedFileContent = "contents of a single-file object";
+
+FIXTURE_TEST_CASE(OpenFileRead_Decrypt, MgrFixture)
+{
+    REQUIRE_RC(VFSManagerMakePath ( mgr, &vpath, "./ncbi/protected1/SRR999997.ncbi_enc")); // an encrypted copy of ./ncbi/protected1/SRR999997
+    
+    // read contents of an encrypted file
+    const KFile *f;
+    REQUIRE_RC(VFSManagerOpenFileReadDecrypt (mgr, &f, vpath));    
+    
+    REQUIRE_EQ(protectedFileContent, ReadContent(f));
+
+    REQUIRE_RC(KFileRelease(f));
+}
+FIXTURE_TEST_CASE(OpenDirRead_Decrypt, MgrFixture)
+{
+    REQUIRE_RC(VFSManagerMakePath ( mgr, &vpath, "./ncbi_enc")); // this is an encrypted kar archive of directory ./ncbi
+    
+    const KDirectory *dir;
+    REQUIRE_RC(VFSManagerOpenDirectoryReadDirectoryRelativeDecrypt (mgr, wd, &dir, vpath));    
+    
+    // read contents of a file inside an encrypted archive
+    const KFile *f;
+    KDirectoryOpenFileRead(dir, &f, "protected1/SRR999997");
+    REQUIRE_EQ(protectedFileContent, ReadContent(f));
+    REQUIRE_RC(KFileRelease(f));
+    
+    REQUIRE_RC(KDirectoryRelease(dir));
+}
+
+FIXTURE_TEST_CASE(CreateFile_Encrypt, MgrFixture)
+{
+    string uri = string("ncbi-file:") + GetName() + "?enc&pwfile=pwfile";
+    REQUIRE_RC(VFSManagerMakePath ( mgr, &vpath, uri.c_str())); 
+    
+    // create with encryption
+    KFile* f;
+    REQUIRE_RC(VFSManagerCreateFile(mgr, &f, false, 0660, kcmInit, vpath));
+    string content="this is supposed to be encrypted";
+    REQUIRE_RC(KFileWrite(f, 0, content.c_str(), content.size(), &num_writ));
+    REQUIRE_EQ(content.size(), num_writ);
+    REQUIRE_RC(KFileRelease(f));
+    
+    // open as unencrypted - should fail
+    KDirectoryOpenFileRead(wd, (const KFile**)&f, GetName());
+    REQUIRE_NE(content, ReadContent(f));
+    REQUIRE_RC(KFileRelease(f));
+    
+    // open as encrypted
+    REQUIRE_RC(VFSManagerOpenFileReadDecrypt (mgr, (const KFile**)&f, vpath));    
+    REQUIRE_EQ(content, ReadContent(f));
+    REQUIRE_RC(KFileRelease(f));
+    
+    REQUIRE_RC(KDirectoryRemove(wd, true, GetName()));
+}
+
+FIXTURE_TEST_CASE(OpenFileWriteFile_Encrypt_NotEncrypted, MgrFixture)
+{   // attempt to open an unencrypted file for encypted writing
+    // create unencrypted
+    CreateFile(GetName(), "garbage");
+
+    string uri = string("ncbi-file:") + GetName() + "?enc&pwfile=pwfile";
+    REQUIRE_RC(VFSManagerMakePath ( mgr, &vpath, uri.c_str())); 
+
+    // open as encrypted - fail
+    KFile* f;
+    // this will output an error message from KEncFileMakeIntValidSize:
+    REQUIRE_RC_FAIL(VFSManagerOpenFileWrite(mgr, &f, false, vpath)); 
+    REQUIRE_RC(KFileRelease(f));
+
+    REQUIRE_RC(KDirectoryRemove(wd, true, GetName()));
+}
+
+FIXTURE_TEST_CASE(OpenFileWriteFile_Encrypt, MgrFixture)
+{   // open an encrypted file for encypted writing
+    string uri = string("ncbi-file:") + GetName() + "?enc&pwfile=pwfile";
+    REQUIRE_RC(VFSManagerMakePath ( mgr, &vpath, uri.c_str())); 
+
+    // create encrypted
+    KFile* f;
+    REQUIRE_RC(VFSManagerCreateFile(mgr, &f, false, 0660, kcmInit, vpath));
+    string content="old encrypted content";
+    REQUIRE_RC(KFileWrite(f, 0, content.c_str(), content.size(), &num_writ));
+    REQUIRE_EQ(content.size(), num_writ);
+    REQUIRE_RC(KFileRelease(f));
+
+    // open, overwrite
+    REQUIRE_RC(VFSManagerOpenFileWrite(mgr, &f, false, vpath));
+    content="new and shiny and encrypted";
+    REQUIRE_RC(KFileWrite(f, 0, content.c_str(), content.size(), &num_writ));
+    REQUIRE_EQ(content.size(), num_writ);
+    REQUIRE_RC(KFileRelease(f));
+    
+    // open as unencrypted - fail
+    KDirectoryOpenFileRead(wd, (const KFile**)&f, GetName());
+    REQUIRE_NE(content, ReadContent(f));
+    REQUIRE_RC(KFileRelease(f));
+    
+    // open as encrypted
+    REQUIRE_RC(VFSManagerOpenFileReadDecrypt (mgr, (const KFile**)&f, vpath));    
+    REQUIRE_EQ(content, ReadContent(f));
+    REQUIRE_RC(KFileRelease(f));
+
+    REQUIRE_RC(KDirectoryRemove(wd, true, GetName()));
+}
+
+/////////////// Managing password file
+FIXTURE_TEST_CASE(GetKryptoPassword, MgrFixture)
+{
+    REQUIRE_RC(VFSManagerGetKryptoPassword(mgr, buf, BufSize, &num_read));
+    REQUIRE_EQ(string("password"), string(buf, num_read));
+}
+
+FIXTURE_TEST_CASE(UpdateKryptoPassword_NoOutput, MgrFixture)
+{
+    string newPwd("new_pwd1");
+    rc_t rc = VFSManagerUpdateKryptoPassword(mgr, newPwd.c_str(), newPwd.size(), 0, 0);
+// directory permissions are not looked at on Windows    
+#if !WINDOWS    
+    REQUIRE_EQ(rc, RC(rcVFS, rcEncryptionKey, rcUpdating, rcDirectory, rcExcessive));
+#else
+    REQUIRE_EQ(rc, (rc_t)0);
+#endif    
+
+    REQUIRE_RC(VFSManagerGetKryptoPassword(mgr, buf, BufSize, &num_read));
+    REQUIRE_EQ(newPwd, string(buf, num_read));
+}
+FIXTURE_TEST_CASE(UpdateKryptoPassword_Output, MgrFixture)
+{
+    string newPwd("new_pwd2");
+    // VFSManagerUpdateKryptoPassword returns the directory containing the password file,
+    // to help instruct user to chmod if permissions are too lax
+    rc_t rc = VFSManagerUpdateKryptoPassword(mgr, newPwd.c_str(), newPwd.size(), buf, BufSize);
+// directory permissions are not looked at on Windows    
+#if !WINDOWS    
+    REQUIRE_EQ(rc, RC(rcVFS, rcEncryptionKey, rcUpdating, rcDirectory, rcExcessive));
+#else
+    REQUIRE_EQ(rc, (rc_t)0);
+#endif    
+    REQUIRE_EQ(string("."), string(buf));
+    
+    REQUIRE_RC(VFSManagerGetKryptoPassword(mgr, buf, BufSize, &num_read));
+    REQUIRE_EQ(newPwd, string(buf, num_read));
+}
+
+//TODO: VFSManagerWGAValidateHack
+
+//
+//  Object Id / Object name bindings
+//
+
+class ObjIdBindingFixture : public MgrFixture 
+{
+public:
+    static char bindings[1024];
+    
+    ObjIdBindingFixture()
+    {
+    }
+    ~ObjIdBindingFixture()
+    {
+        const char* bFile = VFSManagerGetBindingsFile(mgr);
+        if (bFile != NULL)
+            KDirectoryRemove(wd, true, bFile);
+        VFSManagerSetBindingsFile(mgr, NULL);
+    }
+    void SetUp(const string& bindingsFileName)
+    {
+        string bFile = string("./") + bindingsFileName;
+        if (string_copy(bindings, sizeof(bindings), bFile.c_str(), bFile.length()) != bFile.length())
+           throw logic_error("ObjIdBindingFixture::SetUp: string_copy failed");   
+        VFSManagerSetBindingsFile(mgr, bindings);
+        KDirectoryRemove(wd, true, bindings);
+    }
+    rc_t Register(uint32_t id, const char* uri)
+    {
+        VPath* p;
+        if (VFSManagerMakePath(mgr, &p, uri) != 0)
+           throw logic_error("ObjIdBindingFixture::Register: VFSManagerMakePath failed");   
+        rc_t rc = VFSManagerRegisterObject(mgr, id, p);
+        if (VPathRelease(p) != 0)
+           throw logic_error("ObjIdBindingFixture::Register: VPathRelease failed");   
+        return rc;
+    }
+    rc_t GetById(uint32_t id, string& uri)
+    {
+        VPath* vp;
+        rc_t rc = VFSManagerGetObject(mgr, id, &vp);
+        if (rc == 0)
+        {
+            if (vp == 0)
+                throw logic_error("ObjIdBindingFixture::GetById: VFSManagerGetObject returned NULL");   
+                
+            const String* p;
+            if (VPathMakeString(vp, &p) != 0 || p == 0)
+                throw logic_error("ObjIdBindingFixture::GetById: VPathMakeString failed");   
+                
+            uri = string(p->addr, p->size);
+            
+            free((void*)p);
+            if (VPathRelease(vp) != 0)
+                throw logic_error("ObjIdBindingFixture::GetById: VPathRelease failed");   
+        }
+        return rc;
+    }
+    rc_t GetByUri(const string& uri, uint32_t& id)
+    {
+        VPath* p;
+        if (VFSManagerMakePath(mgr, &p, uri.c_str()) != 0)
+            throw logic_error("ObjIdBindingFixture::GetByUri: VFSManagerMakePath failed"); 
+        rc_t rc = VFSManagerGetObjectId(mgr, p, &id);
+        if (VPathRelease(p) != 0)
+            throw logic_error("ObjIdBindingFixture::GetById: VPathRelease failed");   
+        return rc;
+    }
+};
+
+char ObjIdBindingFixture::bindings[];
+
+FIXTURE_TEST_CASE(ObjIdRegister, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    REQUIRE_RC(Register(1, "ncbi-acc:acc1"));
+    REQUIRE_RC(Register(2, "ncbi-file:acc2"));
+}
+FIXTURE_TEST_CASE(ObjIdRegister_Found_Same, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    REQUIRE_RC(Register(1, "ncbi-acc:acc1"));
+    REQUIRE_RC(Register(2, "ncbi-file:acc2"));
+    REQUIRE_RC(Register(1, "ncbi-acc:acc1")); // same name, no problem
+}
+FIXTURE_TEST_CASE(ObjIdRegister_Found_Different, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    REQUIRE_RC(Register(1, "ncbi-acc:acc1"));
+    REQUIRE_RC(Register(2, "ncbi-file:acc2"));
+    REQUIRE_RC_FAIL(Register(1, "ncbi-acc:acc11")); // name differs
+}
+FIXTURE_TEST_CASE(ObjIdById_Found, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    REQUIRE_RC(Register(123, "ncbi-file:acc123"));
+    REQUIRE_RC(Register(12, "ncbi-acc:acc12"));
+    REQUIRE_RC(Register(1, "ncbi-acc:acc1"));
+    
+    string uri;
+    
+    REQUIRE_RC(GetById(123, uri));
+    REQUIRE_EQ(uri, string("ncbi-file:acc123"));
+    
+    REQUIRE_RC(GetById(12, uri));
+    REQUIRE_EQ(uri, string("ncbi-acc:acc12"));
+    
+    REQUIRE_RC(GetById(1, uri));
+    REQUIRE_EQ(uri, string("ncbi-acc:acc1"));
+}
+FIXTURE_TEST_CASE(ObjIdById_NotFound, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    REQUIRE_RC(Register(100, "ncbi-acc:acc1"));
+    REQUIRE_RC(Register(200, "ncbi-file:acc2"));
+    
+    string uri;
+    
+    REQUIRE_RC_FAIL(GetById(100200, uri));
+}
+FIXTURE_TEST_CASE(ObjId_DefaultLocation, ObjIdBindingFixture)
+{
+    VFSManagerSetBindingsFile(mgr, NULL);
+    REQUIRE_RC_FAIL(VFSManagerGetObject(mgr, 1, &vpath)); // this will fail but set VFSManagerBindings to default
+    const char* bindings = VFSManagerGetBindingsFile(mgr);
+    REQUIRE_NOT_NULL(bindings);
+    
+    // verify default location
+    String* home;
+    REQUIRE_RC(KConfigReadString(VFSManagerGetConfig(mgr), "NCBI_HOME", &home));
+    REQUIRE_NOT_NULL(home);
+    REQUIRE_EQ(string(bindings), string(home->addr, home->size) + "/objid.mapping"); 
+    StringWhack(home);
+}
+
+FIXTURE_TEST_CASE(ObjIdByName_Found, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    REQUIRE_RC(Register(11, "ncbi-acc:acc11"));
+    REQUIRE_RC(Register(21, "ncbi-file:acc21"));
+    REQUIRE_RC(Register(1, "ncbi-acc:acc1"));
+    
+    uint32_t id;
+    
+    REQUIRE_RC(GetByUri(string("ncbi-acc:acc11"), id));
+    REQUIRE_EQ((uint32_t)11, id);
+
+    REQUIRE_RC(GetByUri(string("ncbi-file:acc21"), id));
+    REQUIRE_EQ((uint32_t)21, id);
+    
+    REQUIRE_RC(GetByUri(string("ncbi-acc:acc1"), id));
+    REQUIRE_EQ((uint32_t)1, id);
+}
+FIXTURE_TEST_CASE(ObjIdByName_NotFound, ObjIdBindingFixture)
+{
+    SetUp(GetName());
+    
+    REQUIRE_RC(Register(1, "ncbi-acc:acc1"));
+    REQUIRE_RC(Register(2, "ncbi-file:acc2"));
+    
+    uint32_t id;
+    REQUIRE_RC_FAIL(GetByUri(string("ncbi-acc:acc2"), id));
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+const char UsageDefaultName[] = "test-manager";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=VManagerTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/test/vfs/ncbi/protected1/SRR999997 b/test/vfs/ncbi/protected1/SRR999997
new file mode 100644
index 0000000..2d8b9a7
--- /dev/null
+++ b/test/vfs/ncbi/protected1/SRR999997
@@ -0,0 +1 @@
+contents of a single-file object
\ No newline at end of file
diff --git a/test/vfs/ncbi/protected1/SRR999997.ncbi_enc b/test/vfs/ncbi/protected1/SRR999997.ncbi_enc
new file mode 100644
index 0000000..f039593
Binary files /dev/null and b/test/vfs/ncbi/protected1/SRR999997.ncbi_enc differ
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/vfs/ncbi/public/refseq/YYZZ99
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/vfs/ncbi/public/refseq/YYZZ99
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/vfs/ncbi/public/refseq/ZZ999999.9
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/vfs/ncbi/public/refseq/ZZ999999.9
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/vfs/ncbi/public/sra/SRR999998.sra
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/vfs/ncbi/public/sra/SRR999998.sra
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/vfs/ncbi/public/wgs/YYZZ99
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/vfs/ncbi/public/wgs/YYZZ99
diff --git a/test/vfs/ncbi_enc b/test/vfs/ncbi_enc
new file mode 100644
index 0000000..f16fe6b
Binary files /dev/null and b/test/vfs/ncbi_enc differ
diff --git a/test/vfs/path-test.c b/test/vfs/path-test.c
new file mode 100644
index 0000000..2290580
--- /dev/null
+++ b/test/vfs/path-test.c
@@ -0,0 +1,765 @@
+/*===========================================================================
+ *
+ *                            PUBLIC DOMAIN NOTICE
+ *               National Center for Biotechnology Information
+ *
+ *  This software/database is a "United States Government Work" under the
+ *  terms of the United States Copyright Act.  It was written as part of
+ *  the author's official duties as a United States Government employee and
+ *  thus cannot be copyrighted.  This software/database is freely available
+ *  to the public for use. The National Library of Medicine and the U.S.
+ *  Government have not placed any restriction on its use or reproduction.
+ *
+ *  Although all reasonable efforts have been taken to ensure the accuracy
+ *  and reliability of the software and data, the NLM and the U.S.
+ *  Government do not and cannot warrant the performance or results that
+ *  may be obtained by using this software or data. The NLM and the U.S.
+ *  Government disclaim all warranties, express or implied, including
+ *  warranties of performance, merchantability or fitness for any particular
+ *  purpose.
+ *
+ *  Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vfs/extern.h>
+
+#undef LIB_EXPORT
+#define LIB_EXPORT /* ignore me */
+#undef VFS_EXTERN
+#define VFS_EXTERN /* ignore me */
+
+#include "../libs/vfs/path.c"
+
+#include <klib/out.h>
+#include <klib/status.h> /* STSMSG */
+
+#include <kfg/config.h>
+#include <kapp/args.h>
+#include <kapp/main.h>
+
+static
+const char *VPathGetAccTypeStr ( const VPath * self )
+{
+    switch ( self -> acc_code >> 8 )
+    {
+    case 0x000:
+        return "";
+
+    case 0x015:
+    case 0x026:
+    case 0x106:
+    case 0x126:
+        return " ( appREFSEQ )";
+
+    case 0x109:
+        if ( ( self -> acc_code & 0xF ) != 0 )
+                return " ( appNANNOT )";
+        if ( self -> path . addr [ 0 ] == 'G' &&
+             self -> path . addr [ 1 ] == 'C' &&
+             ( self -> path . addr [ 2 ] == 'A' || self -> path . addr [ 2 ] == 'F' ) &&
+             self -> path . addr [ 3 ] == '_' )
+        {
+            return " ( appNANNOT )";
+        }
+        return " ( appREFSEQ )";
+
+    case 0x036:
+    case 0x037:
+    case 0x038:
+    case 0x039:
+        if ( ( (self -> acc_code >> 4) & 0xF ) == 0 )
+            return " ( appSRA )";
+            
+        {
+            const char pileup_ext[] = ".pileup";
+            size_t pileup_ext_size = sizeof( pileup_ext ) / sizeof( pileup_ext[0] ) - 1;
+            size_t path_size = self -> path . size;
+            
+            
+            if ( path_size > pileup_ext_size && memcmp(&self -> path . addr[path_size - pileup_ext_size], pileup_ext, pileup_ext_size) == 0)
+            {
+                return " ( appSRAPileup )";
+            }
+        }
+            
+        return " ( appAny )";
+
+    case 0x042:
+    case 0x048:
+    case 0x049:
+    case 0x142:
+    case 0x148:
+    case 0x149:
+        return " ( appWGS )";
+
+    case 0x029:
+        if ( self -> acc_code == 0x02910 )
+        {
+            if ( self -> path . addr [ 0 ] == 'N' &&
+                 self -> path . addr [ 1 ] == 'A' )
+            {
+                return " ( appNANNOT )";
+            }
+        }
+
+        /* no break */
+    default:
+        return " ( unrecognized )";
+    }
+}
+
+
+static
+const char *VPathGetSchemeTypeStr ( const VPath * self )
+{
+    switch ( self -> scheme_type )
+    {
+#define CASE( x ) \
+        case x: return # x
+
+    CASE ( vpuri_none );
+    CASE ( vpuri_not_supported );
+    CASE ( vpuri_ncbi_file );
+    CASE ( vpuri_file );
+    CASE ( vpuri_ncbi_acc );
+    CASE ( vpuri_http );
+    CASE ( vpuri_ftp );
+    CASE ( vpuri_ncbi_legrefseq );
+    CASE ( vpuri_ncbi_obj );
+    CASE ( vpuri_fasp );
+
+#undef CASE
+    }
+
+    return "<INVALID>";
+}
+
+
+static
+const char *VPathGetPathTypeStr ( const VPath * self )
+{
+    switch ( self -> path_type )
+    {
+#define CASE( x ) \
+        case x: return # x
+
+    CASE ( vpInvalid );
+    CASE ( vpOID );
+    CASE ( vpAccession );
+    CASE ( vpNameOrOID );
+    CASE ( vpNameOrAccession );
+    CASE ( vpName );
+    CASE ( vpRelPath );
+    CASE ( vpFullPath );
+    CASE ( vpUNCPath );
+    CASE ( vpHostName );
+    CASE ( vpEndpoint );
+
+#undef CASE
+    }
+
+    return "<INVALID>";
+}
+
+
+static
+const char *VPathGetHostTypeStr ( const VPath * self )
+{
+    switch ( self -> host_type )
+    {
+#define CASE( x ) \
+        case x: return # x
+
+    CASE ( vhDNSName );
+    CASE ( vhIPv4 );
+    CASE ( vhIPv6 );
+
+#undef CASE
+    }
+
+    return "<INVALID>";
+}
+
+static
+void VPathDisplay ( const VPath * self )
+{
+    if ( self == NULL ) {
+        STSMSG(1, ( "<null>\n" ) );
+        STSMSG(1, ( "\n" ) );
+    }
+    else
+    {
+        size_t num_read;
+        char buffer [ 8192 ];
+        rc_t rc = VPathReadUri ( self, buffer, sizeof buffer, & num_read );
+        uint32_t size = ( rc == 0 ) ? ( uint32_t ) num_read
+            : ( GetRCState ( rc ) == rcInsufficient ) ? sizeof buffer : 0;
+
+        STSMSG(1, ("data        :  %lu bits, %lu bytes ( including NUL )\n"
+            , self -> data . elem_bits, self -> data . elem_count));
+        STSMSG(1, ("scheme      : '%S' ( size = %zu, len = %u )\n"
+            , & self -> scheme, self -> scheme . size, self -> scheme . len));
+        STSMSG(1, ("auth        : '%S' ( size = %zu, len = %u )\n"
+            , & self -> auth, self -> auth . size, self -> auth . len));
+        STSMSG(1, ("host        : '%S' ( size = %zu, len = %u )\n"
+            , & self -> host, self -> host . size, self -> host . len));
+        STSMSG(1, ("portname    : '%S' ( size = %zu, len = %u )\n"
+        , & self -> portname, self -> portname . size, self -> portname . len));
+        STSMSG(1, ("path        : '%S' ( size = %zu, len = %u )\n"
+        , & self -> path, self -> path . size, self -> path . len));
+        STSMSG(1, ("query       : '%S' ( size = %zu, len = %u )\n"
+            , & self -> query, self -> query . size, self -> query . len));
+        STSMSG(1, ("fragment    : '%S' ( size = %zu, len = %u )\n"
+            , & self -> fragment, self -> fragment . size, self -> fragment . len));
+        STSMSG(1, ("obj_id      :  %u\n", self -> obj_id));
+        STSMSG(1, ("acc_code    :  0x%X%s\n"
+            , self -> acc_code, VPathGetAccTypeStr ( self )));
+        STSMSG(1, ("ipv4        :  %u.%u.%u.%u\n"
+            , ( self -> ipv4 >> 24 ) & 0xFF, ( self -> ipv4 >> 16 ) & 0xFF,
+                ( self -> ipv4 >> 8 ) & 0xFF, ( self -> ipv4 >> 0 ) & 0xFF));
+        STSMSG(1, ("ipv6        :  %04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X\n"
+                   , self -> ipv6 [ 0 ], self -> ipv6 [ 1 ], self -> ipv6 [ 2 ], self -> ipv6 [ 3 ],
+                     self -> ipv6 [ 4 ], self -> ipv6 [ 5 ], self -> ipv6 [ 6 ], self -> ipv6 [ 7 ]));
+        STSMSG(1, ("portnum     :  %u\n"                   , self -> portnum));
+
+        STSMSG(1, ("scheme_type :  %u ( %s )\n"
+            , self -> scheme_type, VPathGetSchemeTypeStr ( self )));
+        STSMSG(1, ("path_type   :  %u ( %s )\n"
+            , self -> path_type, VPathGetPathTypeStr ( self )));
+        STSMSG(1, ("host_type   :  %u ( %s )\n"
+            , self -> host_type, VPathGetHostTypeStr ( self )));
+        STSMSG(1, ("from_uri    :  %s\n"
+            , self -> from_uri ? "true" : "false"));
+        STSMSG(1, ("\n"));
+        STSMSG(1, ("read back   : '%.*s' ( rc = %R, num_read = %zu )\n"
+            , size, buffer, rc, num_read));
+        STSMSG(1, ("\n"));
+    }
+}
+
+static
+rc_t ParseUrlTest ( const VFSManager * vfs )
+{
+    rc_t rc;
+    size_t i;
+    
+    static const char *test_urls [] =
+    {
+        /* accessions */
+        "SRR123456",
+        "SRR1234567",
+        "SRR12345678",
+        "SRR123456789",
+        "SRR123456.pileup",
+        "SRR1234567.pileup",
+        "SRR12345678.pileup",
+        "SRR123456789.pileup",
+        "J01415",
+        "J01415.2",
+        "CM000071",
+        "CM000039.2",
+        "NC_000012.10",
+        "NW_003315935.1",
+        "GPC_000000393.1",
+        "AAAB01",
+        "AAAA01000001",
+        "NZ_AAEW01",
+        "NZ_AAEW01000001",
+        "NA000008777.1",
+
+        "SRRR876",
+        "SRR000123.sra",
+
+        "ncbi-acc:SRR000123",
+        "ncbi-acc:NZ_AAEW01000001",
+
+        "ncbi-obj:12345",
+        "ncbi-obj:00123",
+        "123456",
+        "0987655",
+
+        "GCA_012345678.1",
+        "GCA_012345678.1_S",
+
+        /* <scheme>://<host>[:<port>]/<path>[?<query>][#<fragment>]*/
+        /*0*/ "http://www.abc.com/library/index.html?x&y=123&z=test#ignore-me",
+        /*1*/ "http://www.abc.com:123/library/index.html?x&y=123&z=test#ignore-me",
+        /*2*/ "HTTP://www.abc.com:123/library/index.html?x&y=123&z=test#ignore-me",
+
+        /* <scheme>://<host>[:<port>]/<path>[#<fragment>]*/
+        /*3*/ "http://www.abc.com/library/index.html#ignore-me",
+        /*4*/ "http://www.abc.com:123/library/index.html#ignore-me",
+
+        /* <scheme>://<host>[:<port>]/<path>[?<query>]*/
+        /*5*/ "http://www.abc.com/library/index.html?x&y=123&z=test",
+        /*6*/ "http://www.abc.com:123/library/index.html?x&y=123&z=test",
+
+        /* <scheme>://<host>[:<port>]/<path>*/
+        /*7*/ "http://www.abc.com/library/index.html",
+        /*8*/ "http://www.abc.com:80/library/index.html",
+
+        /* <scheme>://<host>[:<port>]*/
+        /*9*/ "http://www.abc.com",
+        /*10*/ "http://www.abc.com:80",
+
+        /* /<path>[#fragment]*/
+        /*11*/ "/library/index.html#ignore-me",
+
+        /* /<path>[?query]*/
+        /*12*/ "/library/index.html?x&y=123&z=test",
+        /*13*/ "///library",
+
+        /* having a login */
+        "ftp://anonftp@ftp.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByRun/sra/SRR/SRR053/SRR053325/SRR053325.sra",
+
+        /* having the fasp weirdness */
+        "fasp://anonftp@ftp.ncbi.nlm.nih.gov:/sra/sra-instant/reads/ByRun/sra/SRR/SRR053/SRR053325/SRR053325.sra",
+
+        /* some unc paths */
+        "//this/is/a/really/nice/UNC/path",
+        "ncbi-file://here/is/another",
+        "ncbi-file://here/is/yet/another#fraggy-the-bear",
+
+        /* now what does this produce, and why? */
+        "ncbi-file:///c/scanned-data/0001/file.sra?enc&pwd-file=/c/Users/JamesMcCoy/ncbi.pwd",
+
+        /* modification to accept bad paths because the FS does */
+        "/path/10315_3#63.bam"
+    };
+    const size_t num_urls = sizeof test_urls / sizeof test_urls [ 0 ];
+    
+    static const char *fail_url [] = 
+    {
+        /*<scheme>:/<path>*/
+        /*0*/ "http:/library/index.html",
+        /*1*/ "http//library/index.html",
+
+        /*<scheme>:/[#fragment]*/
+        /*2*/ "http:#ignore-me",
+
+        /*<scheme>:/[#query]*/
+        /*3*/ "http:?x&y=123&z=test",
+
+        /*<scheme>*/
+        /*4*/ "http",
+        /*5*/ "ftp",
+
+        /* <host>[:<port>]*/
+        /*6*/ "www.abc.com",
+        /*7*/ "www.abc.com:80",
+
+        /* <scheme>://<host>[:<port>]*/
+        /*8*/ "ftp://www.abc.com"
+        
+            
+    };
+    const size_t num_fail_urls = sizeof fail_url / sizeof fail_url [ 0 ];
+    
+    static const char *sys_path [] = 
+    {
+#if WINDOWS
+        "C:\\Program Files\\Wonderful\\Bob-o-matic",
+#endif
+        "//this/is/a/really/nice/UNC/path",
+        "SRR000123"
+    };
+    const size_t num_sys_paths = sizeof sys_path / sizeof sys_path [ 0 ];
+    
+    for ( i = 0; i < num_urls; ++ i )
+    {
+        VPath *vpath;
+        
+        String url;
+        StringInitCString ( & url, test_urls [ i ] );
+        
+        rc  = VFSManagerMakePath ( vfs, & vpath, "%S", & url );
+        if ( rc == 0 )
+        {
+            STSMSG(1,  ( "%s - VFSManagerMakePath succeeded -- %zu: %S\n"
+                       , __func__, i, & url ) );
+            VPathDisplay ( vpath );
+            VPathRelease ( vpath );
+        }
+        else
+        {
+            STSMSG(1, ( "%s: VFSManagerMakePath failed on iteration: '%zu' url: %S\n", __func__, i, & url));
+            STSMSG(1, ( "with rc=%R\n", rc));
+            STSMSG(1, ( "\n" ));
+            STSMSG(1, ( "%s: VFSManagerMakePath failed on iteration: '%zu' url: %S\n", __func__, i, & url ));
+            STSMSG(1, ( "with rc=%R\n", rc ));
+            STSMSG(1, ( "\n" ));
+            return rc;
+        }
+    }
+    
+    
+    for ( i = 0; i < num_fail_urls; ++ i )
+    {
+        VPath *vpath;
+        
+        String url;
+        StringInitCString ( & url, fail_url [ i ] );
+        
+        rc  = VFSManagerMakePath ( vfs, & vpath, "%S", & url );
+        if ( rc != 0 )
+        {
+            STSMSG(1,  ( "%s - VFSManagerMakePath succeeded in catching error-- %zu: %S\n", __func__, i, & url));
+            STSMSG(1,  ( "with rc=%R\n", rc ));
+            STSMSG(1, ( "\n" ));
+        }
+        else
+        {
+            STSMSG(1, ( "%s: VFSManagerMakePath failed catching error on iteration: '%zu' url: %S\n"
+                       , __func__, i, & url ) );
+            VPathDisplay ( vpath );
+            VPathRelease ( vpath );
+        }
+    }
+
+    for ( i = 0; i < num_sys_paths; ++ i )
+    {
+        VPath *vpath;
+
+        size_t num_read;
+        char buffer [ 4096 ];
+        
+        String sys;
+        StringInitCString ( & sys, sys_path [ i ] );
+        
+        rc  = VFSManagerMakeSysPath ( vfs, & vpath, sys_path [ i ] );
+        if ( rc == 0 )
+        {
+            STSMSG(1,  ( "%s - VFSManagerMakeSysPath succeeded -- %zu: %S\n"
+                       , __func__, i, & sys ) );
+            VPathDisplay ( vpath );
+            rc = VPathReadSysPath ( vpath, buffer, sizeof buffer, & num_read );
+            STSMSG(1,  ( "read sys    : '%.*s' ( rc = %R, num_read = %zu )\n"
+                       , ( uint32_t ) num_read, buffer
+                       , rc
+                       , num_read
+                 ) );
+            STSMSG(1,  ( "\n" ));
+
+            VPathRelease ( vpath );
+        }
+        else
+        {
+            STSMSG(1, ( "%s: VFSManagerMakeSysPath failed on iteration: '%zu' path: %S\n", __func__, i, & sys ));
+            STSMSG(1, ( "with rc=%R\n", rc ));
+            STSMSG(1,  ( "\n" ));
+            return rc;
+        }
+    }
+    
+    return 0;
+}
+
+static
+rc_t ModifyPathTest ( const VFSManager * vfs )
+{
+    rc_t rc;
+    size_t i;
+    static const char *test_urls [] =
+    {
+        /* simple accessions */
+        "SRR123456",
+        "SRR123456.pileup",
+        "NZ_AAEW01000001",
+        "NA000008777.1",
+        "GCA_012345678.1_S",
+
+        /* oid */
+        "ncbi-obj:123456",
+
+        /* names */
+        "SRR000123.sra",
+        "123456",
+
+        /* urls */
+        "http://www.abc.com/library/index.html",
+        "http://www.abc.com/library/index.html?x&y=123&z=test#ignore-me",
+
+        /* having auth portion */
+        "ftp://anonftp@ftp.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByRun/sra/SRR/SRR053/SRR053325/SRR053325.sra",
+
+        /* unc */
+        "//this/is/a/really/nice/UNC/path",
+        "ncbi-file://here/is/another",
+        "ncbi-file://here/is/yet/another#fraggy-the-bear",
+
+        /* degenerate fs paths */
+        "/path/10315_3#63.bam"
+    };
+    const size_t num_urls = sizeof test_urls / sizeof test_urls [ 0 ];
+
+    static const char *fail_url [] = 
+    {
+        /* host */
+        "http://www.abc.com",
+        "http://www.abc.com:80"
+    };
+    const size_t num_fail_urls = sizeof fail_url / sizeof fail_url [ 0 ];
+
+    static const char *test_ext [] =
+    {
+        ".vdbcache",
+        "_underscore_ext",
+        "",
+        NULL
+    };
+    const size_t num_ext = sizeof test_ext / sizeof test_ext [ 0 ];
+    
+    for ( i = 0; i < num_urls; ++ i )
+    {
+        VPath * orig;
+        
+        String url;
+        StringInitCString ( & url, test_urls [ i ] );
+        
+        rc  = VFSManagerMakePath ( vfs, & orig, "%S", & url );
+        if ( rc == 0 )
+        {
+            size_t j;
+            for ( j = 0; j < num_ext; ++ j )
+            {
+                VPath * vpath;
+                rc = VFSManagerMakePathWithExtension ( vfs, & vpath, orig, test_ext [ j ] );
+                if ( rc == 0 )
+                {
+                    STSMSG(1,  ( "%s - VFSManagerMakePathWithExtension succeeded -- %zu:%zu: '%S' + '%s'\n"
+                               , __func__, i, j, & url, test_ext [ j ] ) );
+                    VPathDisplay ( vpath );
+                    VPathRelease ( vpath );
+                }
+                else
+                {
+                    STSMSG(1, ( "%s: VFSManagerMakePathWithExtension failed on iteration: '%zu:%zu' url: '%S' + '%s'\n", __func__, i, j, & url, test_ext [ j ]));
+                    STSMSG(1, ( "with rc=%R\n", rc ));
+                    STSMSG(1, ( "\n" ));
+                    return rc;
+                }
+            }
+
+            VPathRelease ( orig );
+        }
+    }
+    
+    for ( i = 0; i < num_fail_urls; ++ i )
+    {
+        VPath * orig;
+        
+        String url;
+        StringInitCString ( & url, fail_url [ i ] );
+        
+        rc  = VFSManagerMakePath ( vfs, & orig, "%S", & url );
+        if ( rc == 0 )
+        {
+            size_t j;
+            for ( j = 0; j < num_ext; ++ j )
+            {
+                VPath * vpath;
+                rc = VFSManagerMakePathWithExtension ( vfs, & vpath, orig, test_ext [ j ] );
+                if ( rc != 0 )
+                {
+                    STSMSG(1,  ( "%s - VFSManagerMakePathWithExtension properly caught error -- %zu:%zu: '%S' + '%s'\n", __func__, i, j, & url, test_ext [ j ]));
+                    STSMSG(1,  ( "with rc=%R\n", rc ) );
+                    STSMSG(1,  ( "\n" ) );
+                    rc = 0;
+                }
+                else
+                {
+                    STSMSG(1, ( "%s: VFSManagerMakePathWithExtension failed to catch error on iteration: '%zu:%zu' url: '%S' + '%s'\n"
+                              , __func__, i, j, & url, test_ext [ j ] ));
+                    VPathDisplay ( vpath );
+                    VPathRelease ( vpath );
+                }
+            }
+
+            VPathRelease ( orig );
+        }
+    }
+
+    return 0;
+}
+
+static
+rc_t ExtractAccessionTest ( const VFSManager * vfs )
+{
+    rc_t rc;
+    size_t i;
+    static const char *test_urls [] =
+    {
+        /* simple accessions */
+        "SRR123456",
+        "SRR123456.pileup",
+        "NZ_AAEW01000001",
+        "NA000008777.1",
+        "GCA_012345678.1_S",
+
+        /* oid */
+        "ncbi-obj:123456",
+
+        /* names */
+        "SRR000123.sra",
+        "SRR000123.sra.ncbi_enc",
+        "SRR000123.vdbcache",
+        "SRR000123.pileup.sra",
+        "SRR000123.pileup.sra.ncbi_enc",
+        "SRR000123.pileup.vdbcache",
+
+        /* unc */
+        "//this/is/a/really/nice/UNC/path",
+        "ncbi-file://here/is/another",
+        "ncbi-file://here/is/yet/another#fraggy-the-bear",
+
+        "ftp://anonftp@ftp.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByRun/sra/SRR/SRR053/SRR053325/SRR053325.sra",
+        "ncbi-file://here/is/yet/another/NA000008777.1.vdbcache#fraggy-the-bear"
+    };
+    const size_t num_urls = sizeof test_urls / sizeof test_urls [ 0 ];
+
+    static const char *fail_url [] = 
+    {
+        /* urls */
+        "http://www.abc.com/library/index.html",
+        "http://www.abc.com/library/index.html?x&y=123&z=test#ignore-me",
+
+        /* host */
+        "http://www.abc.com",
+        "http://www.abc.com:80",
+
+        /* degenerate fs paths */
+        "123456",
+        "/path/10315_3#63.bam"
+    };
+    const size_t num_fail_urls = sizeof fail_url / sizeof fail_url [ 0 ];
+    
+    for ( i = 0; i < num_urls; ++ i )
+    {
+        VPath * orig;
+
+        String url;
+        StringInitCString ( & url, test_urls [ i ] );
+
+        rc  = VFSManagerMakePath ( vfs, & orig, "%S", & url );
+        if ( rc == 0 )
+        {
+            VPath * vpath;
+            rc = VFSManagerExtractAccessionOrOID ( vfs, & vpath, orig );
+            if ( rc == 0 )
+            {
+                STSMSG(1,  ( "%s - VFSManagerExtractAccessionOrOID succeeded -- %zu: '%S'\n"
+                           , __func__, i, & url ) );
+                VPathDisplay ( vpath );
+                VPathRelease ( vpath );
+            }
+            else
+            {
+                STSMSG(1, ( "%s: VFSManagerExtractAccessionOrOID failed on iteration: '%zu' url: '%S'\n", __func__, i, & url));
+                STSMSG(1, ( "with rc=%R\n", rc ));
+                STSMSG(1, ( "\n" ));
+                return rc;
+            }
+
+            VPathRelease ( orig );
+        }
+    }
+
+    for ( i = 0; i < num_fail_urls; ++ i )
+    {
+        VPath * orig;
+
+        String url;
+        StringInitCString ( & url, fail_url [ i ] );
+
+        rc  = VFSManagerMakePath ( vfs, & orig, "%S", & url );
+        if ( rc == 0 )
+        {
+            VPath * vpath;
+            rc = VFSManagerExtractAccessionOrOID ( vfs, & vpath, orig );
+            if ( rc != 0 )
+            {
+                STSMSG(1,  ( "%s - VFSManagerExtractAccessionOrOID properly caught error -- %zu: '%S'\n", __func__, i, & url));
+                STSMSG(1,  ( "with rc=%R\n", rc ) );
+                STSMSG(1,  ( "\n" ) );
+                rc = 0;
+            }
+            else
+            {
+                STSMSG(1, ( "%s: VFSManagerExtractAccessionOrOID failed to catch error on iteration: '%zu' url: '%S'\n"
+                          , __func__, i, & url ));
+                VPathDisplay ( vpath );
+                VPathRelease ( vpath );
+            }
+
+            VPathRelease ( orig );
+        }
+    }
+
+    return 0;
+}
+
+
+/* Version  EXTERN
+ *  return 4-part version code: 0xMMmmrrrr, where
+ *      MM = major release
+ *      mm = minor release 
+ *    rrrr = bug-fix release
+ */
+ver_t CC KAppVersion ( void )
+{
+    return 0;
+}
+
+
+/* Usage
+ *  This function is called when the command line argument
+ *  handling sees -? -h or --help
+ */
+rc_t CC UsageSummary ( const char *progname )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "path-test";
+
+rc_t CC Usage ( const Args *args )
+{
+    return 0;
+}
+
+    
+static
+rc_t run ( const char *progname )
+{
+    VFSManager * vfs;
+    rc_t rc = VFSManagerMake ( & vfs );
+    if ( rc == 0 )
+    {
+        rc = ParseUrlTest ( vfs );
+        if ( rc == 0 )
+            rc = ModifyPathTest ( vfs );
+        if ( rc == 0 )
+            rc = ExtractAccessionTest ( vfs );
+        VFSManagerRelease ( vfs );
+    }
+    return rc;
+}
+
+/* KMain
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    Args *args;
+    rc_t rc = ArgsMakeAndHandle ( & args, argc, argv, 0 );
+    if ( rc == 0 )
+    {
+        KConfigDisableUserSettings ();
+        rc = run ( argv [ 0 ] );
+        ArgsWhack ( args );
+    }
+
+    return rc;
+}
diff --git a/test/vfs/pathtest.cpp b/test/vfs/pathtest.cpp
new file mode 100644
index 0000000..0095b77
--- /dev/null
+++ b/test/vfs/pathtest.cpp
@@ -0,0 +1,737 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+
+/**
+* Unit tests for VPath interface
+*/
+
+
+#include "../../libs/vfs/path-priv.h"
+
+#include <klib/text.h>
+
+#include <ktst/unit_test.hpp>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/path-priv.h>
+
+#include <stdexcept>
+
+#include <cstdlib>
+
+#include <climits> /* PATH_MAX */
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#include <sysalloc.h>
+
+
+#define IGNORE_FAILURE_VDB_1551 0
+
+
+TEST_SUITE(VPathTestSuite);
+
+using namespace std;
+
+class PathFixture
+{
+public:
+    PathFixture()
+        : path(0)
+        , vfs ( 0 )
+    {
+        rc_t rc = VFSManagerMake ( & vfs );
+        if ( rc != 0 )
+            throw logic_error ( "PathFixture: VFSManagerMake failed" );
+    }
+    ~PathFixture()
+    {
+        VFSManagerRelease ( vfs );
+        if (path && VPathRelease(path) != 0)
+           throw logic_error("~PathFixture: VPathRelease failed");
+    }
+    string PathToString(const string& p_path)
+    {
+        if (VFSManagerMakePath(vfs, &path, p_path.c_str()))
+           throw logic_error("PathToString: VPathMake failed");
+        const String* uri;
+        if ( VPathMakeString(path, &uri) != 0 )
+           throw logic_error("PathToString: VPathMakeString failed");
+        
+        string ret = string(uri->addr, uri->size);
+        
+        free((void*)uri);
+        if (VPathRelease(path))
+           throw logic_error("PathToString: VPathRelease failed");
+        path = 0;
+          
+        return ret;
+    }
+    
+    VPath* path;
+    VFSManager * vfs;
+    
+    static const int BufSize = 1024;
+    char buf[BufSize]; 
+    size_t num_read;
+};
+
+FIXTURE_TEST_CASE(ReadPath, PathFixture)
+{
+    REQUIRE_RC(VFSManagerMakePath ( vfs, &path, "ncbi-file:qq?enc"));
+
+    REQUIRE_RC(VPathReadPath(path, buf, BufSize, &num_read));
+    REQUIRE_EQ(string(buf, num_read), string("qq"));
+}
+
+FIXTURE_TEST_CASE(MakeStringPlain, PathFixture)
+{
+    string filename = "filename";
+    REQUIRE_EQ(PathToString(filename), filename);
+}
+
+FIXTURE_TEST_CASE(MakeStringScheme, PathFixture)
+{
+    string filename = "ncbi-acc:filename";
+    REQUIRE_EQ(PathToString(filename), filename);
+}
+
+FIXTURE_TEST_CASE(MakeStringBadScheme, PathFixture)
+{
+    string filename = "ncbi-file:filename";
+    REQUIRE_EQ(PathToString(filename), filename);
+}
+
+FIXTURE_TEST_CASE(GetScheme, PathFixture)
+{
+    REQUIRE_RC(VFSManagerMakePath ( vfs, &path, "ncbi-file:qq?enc"));
+
+    String sch;
+    REQUIRE_RC(VPathGetScheme(path, &sch));
+    REQUIRE_EQ(string(sch.addr, sch.size), string("ncbi-file"));
+}
+
+FIXTURE_TEST_CASE(GetScheme_t, PathFixture)
+{
+    REQUIRE_RC(VFSManagerMakePath ( vfs, &path, "ncbi-file:qq?enc"));
+
+    VPUri_t uri_type;
+    REQUIRE_RC(VPathGetScheme_t(path, &uri_type));
+    REQUIRE_EQ(uri_type, (VPUri_t)vpuri_ncbi_file);
+}
+
+FIXTURE_TEST_CASE(GetScheme_NcbiObj, PathFixture)
+{
+    REQUIRE_RC(VFSManagerMakePath ( vfs, &path, "ncbi-obj:12/1/345"));
+    
+    VPUri_t uri_type;
+    REQUIRE_RC(VPathGetScheme_t(path, &uri_type));
+    REQUIRE_EQ(uri_type, (VPUri_t)vpuri_ncbi_obj);
+
+    String sch;
+    REQUIRE_RC(VPathGetScheme(path, &sch));
+    REQUIRE_EQ(string(sch.addr, sch.size), string("ncbi-obj"));
+    
+    REQUIRE_RC(VPathReadPath(path, buf, BufSize, &num_read));
+    REQUIRE_EQ(string(buf, num_read), string("12/1/345"));
+}
+
+#if WINDOWS
+
+//  VPathMakeSysPath
+
+FIXTURE_TEST_CASE( VFS_Native2Internal_1, PathFixture )
+{
+    cout << "VFSManagerMakeSysPath(native) -> VPathMakeString(internal)\n";
+    REQUIRE_RC(
+        VFSManagerMakeSysPath( vfs, &path, "C:\\somepath\\somefile.something"));
+    
+    const String *uri = NULL;
+    REQUIRE_RC( VPathMakeString( path, &uri ) );
+    REQUIRE_NOT_NULL( uri );
+    REQUIRE_EQ( string( "/C/somepath/somefile.something" ),
+                string( uri->addr, uri->size ) );
+}
+
+FIXTURE_TEST_CASE( VFS_Native2Internal_2, PathFixture )
+{
+    cout << "VFSManagerMakeSysPath(native) -> VPathReadPath(internal)" << endl;
+    REQUIRE_RC( VFSManagerMakeSysPath ( vfs, &path, "C:\\somepath\\somefile.something" ) );
+
+    char buffer[ 1024 ];
+    size_t num_writ;
+    REQUIRE_RC( VPathReadPath( path, buffer, sizeof buffer, &num_writ ) );
+    REQUIRE_EQ( string( "/C/somepath/somefile.something" ), string ( buffer, num_writ ) );
+}
+
+FIXTURE_TEST_CASE(VFS_Native2InternalNetwork, PathFixture) {
+    const string n("\\\\abc\\def\\ghi\\000379\\SRR388696");
+    const string p("//abc/def/ghi/000379/SRR388696");
+
+    {
+        REQUIRE_RC(VFSManagerMakeSysPath(vfs, &path, n.c_str()));
+
+        const String *uri = NULL;
+        REQUIRE_RC(VPathMakeString(path, &uri));
+        REQUIRE_NOT_NULL(uri);
+#if IGNORE_FAILURE_VDB_1551
+        REQUIRE_EQ(p, string(uri->addr, uri->size));
+#endif
+
+        char buffer[PATH_MAX] = "";
+        size_t num_writ = 0;
+        REQUIRE_RC(VPathReadPath(path, buffer, sizeof buffer, &num_writ));
+#if IGNORE_FAILURE_VDB_1551
+        REQUIRE_EQ(p, string(buffer, num_writ));
+#endif
+
+        REQUIRE_RC(VPathRelease(path));
+        path = NULL;
+    }
+    {
+        REQUIRE_RC( VFSManagerMakePath(vfs, &path, p.c_str()));
+
+        const String *uri = NULL;
+        REQUIRE_RC(VPathMakeSysPath(path, &uri));
+        REQUIRE_NOT_NULL(uri);
+#if IGNORE_FAILURE_VDB_1551
+        REQUIRE_EQ(n, string(uri->addr, uri->size));
+
+        char buffer[PATH_MAX] = "";
+        size_t num_writ = 0;
+        REQUIRE_RC(VPathReadSysPath(path, buffer, sizeof buffer, &num_writ));
+        REQUIRE_EQ(n, string(buffer, num_writ));
+#endif
+    }
+}
+
+//  VPathMakePath
+
+FIXTURE_TEST_CASE( VFS_Internal2Native_1, PathFixture )
+{
+    cout << "VFSManagerMakePath(internal) -> VPathReadSysPath(native)" << endl;
+    REQUIRE_RC( VFSManagerMakePath ( vfs, &path, "/C/somepath/somefile.something" ) );
+
+    const String * uri;
+    REQUIRE_RC( VPathMakeSysPath( path, &uri ) );
+    REQUIRE_NOT_NULL( uri );
+    REQUIRE_EQ( string( "C:\\somepath\\somefile.something" ), string ( uri->addr, uri->size ) );
+}
+
+FIXTURE_TEST_CASE( VFS_Internal2Native_2, PathFixture )
+{
+    cout << "VFSManagerMakePath(internal) -> VPathReadSysPath(native)" << endl;
+    REQUIRE_RC( VFSManagerMakePath ( vfs, &path, "/C/somepath/somefile.something" ) );
+
+    char buffer[ 1024 ];
+    size_t num_writ;
+    REQUIRE_RC( VPathReadSysPath( path, buffer, sizeof buffer, &num_writ ) );
+    REQUIRE_EQ( string( "C:\\somepath\\somefile.something" ), string ( buffer, num_writ ) );
+}
+
+#endif // WINDOWS
+
+//TODO:
+//  VPathGetPath
+
+// Functions from path-priv.h
+    
+FIXTURE_TEST_CASE(Option_Encrypt, PathFixture)
+{
+    REQUIRE_RC(VFSManagerMakePath ( vfs, &path, "ncbi-file:qq?enc"));
+    
+    REQUIRE_RC(VPathOption (path, vpopt_encrypted, buf, BufSize, &num_read));
+    REQUIRE_EQ(num_read, (size_t)0);
+}
+
+//TODO:
+// VPathMakeFmt
+// VPathMakeVFmt
+// VPathMakeRelative 
+// VPathMakeRelativeFmt 
+// VPathVMakeRelativeFmt 
+// VPathMakeCurrentPath 
+// VPathMakeURI 
+// VPathGetCWD
+
+FIXTURE_TEST_CASE(MarkHighReliability, PathFixture)
+{
+    REQUIRE_RC ( VFSManagerMakePath ( vfs, &path, "ncbi-file:qq?enc" ) );
+    REQUIRE ( ! VPathIsHighlyReliable ( path ) );
+    
+    REQUIRE_RC ( VPathMarkHighReliability(path, true) );
+    REQUIRE ( VPathIsHighlyReliable ( path ) );
+    
+    REQUIRE_RC ( VPathMarkHighReliability(path, false) );
+    REQUIRE ( ! VPathIsHighlyReliable ( path ) );
+}
+
+FIXTURE_TEST_CASE(NAME_SERVER_PROTECTED_HTTP, PathFixture) {
+    {
+#define HOST "gap-download.ncbi.nlm.nih.gov"
+#define PATH "/1234ABCD-22BB-CC33-4C4C-D5E6F7890A1B/SRR123456.sra"
+#define URL "http://" HOST PATH
+#define TIC "1A2B3C4D-2B3C-4D5E-6F78-90A1B23C4D5E"
+        String download_ticket, url;
+        CONST_STRING(&download_ticket, TIC);
+        CONST_STRING(&url, URL);
+        REQUIRE_RC(VPathMakeFmt(&path, "%S?tic=%S", &url, &download_ticket));
+        REQUIRE(path);
+    }
+/*  {   TODO VFSManagerExtractAccessionOrOID should extract SRR123456
+        VPath *acc_or_oid = NULL;
+        REQUIRE_RC(VFSManagerExtractAccessionOrOID(vfs, &acc_or_oid, path));
+        REQUIRE(acc_or_oid);
+        REQUIRE_RC(VPathRelease(acc_or_oid));
+        acc_or_oid = NULL;
+    }*/
+    REQUIRE(!VPathIsAccessionOrOID(path));
+    REQUIRE(VPathIsFSCompatible(path));
+    REQUIRE(VPathFromUri(path));
+    REQUIRE(!VPathIsHighlyReliable(path));
+
+    size_t num_read = 0;
+    {
+        const string e(URL "?tic=" TIC);
+        char buffer[4096] = "";
+        REQUIRE_RC(VPathReadUri(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+        {
+            const String *str = NULL;
+            REQUIRE_RC(VPathMakeUri(path, &str));
+            REQUIRE(str);
+            REQUIRE_EQ(string(str->addr), e);
+            REQUIRE_EQ(str->size, e.size());
+            REQUIRE_EQ(str->size, (size_t)str->len);
+            free(const_cast<String*>(str));
+        }
+        {
+            const String *str = NULL;
+            REQUIRE_RC(VPathMakeString(path, &str));
+            REQUIRE(str);
+            REQUIRE_EQ(string(str->addr), e);
+            REQUIRE_EQ(str->size, e.size());
+            REQUIRE_EQ(str->size, (size_t)str->len);
+            free(const_cast<String*>(str));
+        }
+    }
+    {
+        char buffer[4096] = "";
+        const string e("http");
+        REQUIRE_RC(VPathReadScheme(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+        {
+            String str;
+            REQUIRE_RC(VPathGetScheme(path, &str));
+            REQUIRE_EQ(string(str.addr, 0, str.len), e);
+            REQUIRE_EQ(str.size, e.size());
+            REQUIRE_EQ(str.size, (size_t)str.len);
+        }
+    }
+    {
+        char buffer[4096] = "";
+        const string e;
+        REQUIRE_RC(VPathReadAuth(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+        {
+            String str;
+            REQUIRE_RC(VPathGetAuth(path, &str));
+            REQUIRE(! str.addr);
+            REQUIRE_EQ(str.size, e.size());
+            REQUIRE_EQ(str.size, (size_t)str.len);
+        }
+    }
+    {
+        char buffer[4096] = "";
+        const string e(HOST);
+        REQUIRE_RC(VPathReadHost(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+        {
+            String str;
+            REQUIRE_RC(VPathGetHost(path, &str));
+            REQUIRE_EQ(string(str.addr, 0, str.len), e);
+            REQUIRE_EQ(str.size, e.size());
+            REQUIRE_EQ(str.size, (size_t)str.len);
+        }
+    }
+    {
+        char buffer[4096] = "";
+        const string e;
+        REQUIRE_RC(VPathReadPortName(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+        {
+            String str;
+            REQUIRE_RC(VPathGetPortName(path, &str));
+            REQUIRE(! str.addr);
+            REQUIRE_EQ(str.size, e.size());
+            REQUIRE_EQ(str.size, (size_t)str.len);
+            REQUIRE( ! VPathGetPortNum(path));
+        }
+    }
+    {
+        char buffer[4096] = "";
+        const string e(PATH);
+        REQUIRE_RC(VPathReadPath(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+        {
+            String str;
+            REQUIRE_RC(VPathGetPath(path, &str));
+            REQUIRE_EQ(string(str.addr, 0, str.len), e);
+            REQUIRE_EQ(str.size, e.size());
+            REQUIRE_EQ(str.size, (size_t)str.len);
+        }
+    }
+    {
+        char buffer[4096] = "";
+        const string e(PATH);
+        REQUIRE_RC(VPathReadSysPath(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+        {
+            const String *s = NULL;
+            REQUIRE_RC(VPathMakeSysPath(path, &s));
+            REQUIRE(s);
+            REQUIRE_EQ(string(s->addr), e);
+            REQUIRE_EQ(s->size, e.size());
+            REQUIRE_EQ(s->size, (size_t)s->len);
+            free(const_cast<String*>(s));
+        }
+    }
+    {
+        char buffer[4096] = "";
+        const string e("tic=" TIC);
+        REQUIRE_RC(VPathReadQuery(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size()); REQUIRE_EQ(string(buffer), e);
+        {
+            String str;
+            REQUIRE_RC(VPathGetQuery(path, &str));
+            REQUIRE_EQ(string(str.addr, 0, str.len), e);
+            REQUIRE_EQ(str.size, e.size());
+            REQUIRE_EQ(str.size, (size_t)str.len);
+        }
+    }
+    {
+        char buffer[4096] = "";
+        const string e(TIC);
+        REQUIRE_RC
+            (VPathReadParam(path, "tic", buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size()); REQUIRE_EQ(string(buffer), e);
+        {
+            String str;
+            REQUIRE_RC(VPathGetParam(path, "tic", &str));
+            REQUIRE_EQ(string(str.addr, 0, str.len), e);
+            REQUIRE_EQ(str.size, e.size());
+            REQUIRE_EQ(str.size, (size_t)str.len);
+        }
+    }
+        REQUIRE(num_read);
+    {
+        char buffer[4096] = "";
+        const string e;
+        REQUIRE_RC_FAIL
+            (VPathReadParam(path, "ti", buffer, sizeof buffer, &num_read));
+        REQUIRE(! num_read);
+        {
+            String str;
+            REQUIRE_RC_FAIL(VPathGetParam(path, "ti", &str));
+        }
+    }
+    {
+        char buffer[4096] = "";
+        const string e;
+        REQUIRE_RC(VPathReadFragment(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size()); REQUIRE_EQ(string(buffer), e);
+        {
+            String str;
+            REQUIRE_RC(VPathGetFragment(path, &str));
+            REQUIRE_EQ(str.addr, (const char*)NULL);
+            REQUIRE_EQ(str.size, e.size());
+            REQUIRE_EQ(str.size, (size_t)str.len);
+        }
+    }
+
+    REQUIRE( ! VPathGetOid(path));
+}
+
+FIXTURE_TEST_CASE(NAME_SERVER_PROTECTED_FASP, PathFixture) {
+    {
+#undef URL
+#define URL "fasp://dbtest@gap-download.ncbi.nlm.nih.gov:data/sracloud/1234ABCD-22BB-CC33-4C4C-D5E6F7890A1B/SRR123456.sra"
+        String download_ticket, url;
+        CONST_STRING(&download_ticket, TIC);
+        CONST_STRING(&url, URL);
+        REQUIRE_RC(VPathMakeFmt(&path, "%S?tic=%S", &url, &download_ticket));
+        REQUIRE(path);
+    }
+    {
+        const string e(URL "?tic=" TIC);
+        char buffer[4096] = "";
+        size_t num_read = 0;
+        REQUIRE_RC(VPathReadUri(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+}
+
+FIXTURE_TEST_CASE(FILENAME, PathFixture) {
+#undef PATH
+#define PATH "file.txt"
+    REQUIRE_RC(VFSManagerMakePath(vfs, &path, "%s", PATH));
+    REQUIRE(path);
+    {
+        char buffer[4096] = "";
+        const string e("file");
+        REQUIRE_RC(VPathReadScheme(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+    {
+        char buffer[4096] = "";
+        const string e(PATH);
+        REQUIRE_RC(VPathReadPath(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+}
+
+FIXTURE_TEST_CASE(SPACE_IN_FILENAME, PathFixture) {
+#undef PATH
+#define PATH "file elif.txt"
+    REQUIRE_RC(VFSManagerMakePath(vfs, &path, "%s", PATH));
+    REQUIRE(path);
+    {
+        char buffer[4096] = "";
+        const string e("file");
+        REQUIRE_RC(VPathReadScheme(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+    {
+        char buffer[4096] = "";
+        const string e(PATH);
+        REQUIRE_RC(VPathReadPath(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+}
+
+FIXTURE_TEST_CASE(CYRYLLIC_WIN_IN_FILENAME, PathFixture) {
+#undef PATH
+#define PATH "./:OJDF800"
+    REQUIRE_RC(VFSManagerMakePath(vfs, &path, "%s", PATH));
+    REQUIRE(path);
+    {
+        char buffer[4096] = "";
+        const string e("file");
+        REQUIRE_RC(VPathReadScheme(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+    {
+        char buffer[4096] = "";
+        const string e(PATH);
+        REQUIRE_RC(VPathReadPath(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+}
+
+FIXTURE_TEST_CASE(CYRYLLIC_IN_FILENAME, PathFixture) {
+#undef PATH
+//   #define PATH "��.txt"
+#define PATH "\xC4\xB0\xB9\xBB.txt"
+    REQUIRE_RC(VFSManagerMakePath(vfs, &path, "%s", PATH));
+    REQUIRE(path);
+    {
+        char buffer[4096] = "";
+        const string e("file");
+        REQUIRE_RC(VPathReadScheme(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+    {
+        char buffer[4096] = "";
+        const string e(PATH);
+        REQUIRE_RC(VPathReadPath(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+}
+
+FIXTURE_TEST_CASE(TAB_IN_FILENAME, PathFixture) {
+#undef PATH
+#define PATH "file\telif.txt"
+    REQUIRE_RC(VFSManagerMakePath(vfs, &path, "%s", PATH));
+    REQUIRE(path);
+    {
+        char buffer[4096] = "";
+        const string e("file");
+        REQUIRE_RC(VPathReadScheme(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+    {
+        char buffer[4096] = "";
+        const string e(PATH);
+        REQUIRE_RC(VPathReadPath(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+}
+
+FIXTURE_TEST_CASE(POUNT_IN_FILENAME, PathFixture) {
+#undef PATH
+#define PATH "./file#elif.txt"
+    REQUIRE_RC(VFSManagerMakePath(vfs, &path, "%s", PATH));
+    REQUIRE(path);
+    {
+        char buffer[4096] = "";
+        const string e("file");
+        REQUIRE_RC(VPathReadScheme(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+    {
+        char buffer[4096] = "";
+        const string e(PATH);
+        REQUIRE_RC(VPathReadPath(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+}
+
+FIXTURE_TEST_CASE(QUESTION_IN_FILENAME, PathFixture) {
+#undef PATH
+#define PATH "./file?elif.txt"
+    REQUIRE_RC(VFSManagerMakePath(vfs, &path, "%s", PATH));
+    REQUIRE(path);
+    {
+        char buffer[4096] = "";
+        const string e("file");
+        REQUIRE_RC(VPathReadScheme(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+    {
+        char buffer[4096] = "";
+        const string e(PATH);
+        REQUIRE_RC(VPathReadPath(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+}
+
+FIXTURE_TEST_CASE(COLON_IN_FILENAME, PathFixture) {
+#undef PATH
+#define PATH "./file:elif.txt"
+    REQUIRE_RC(VFSManagerMakePath(vfs, &path, "%s", PATH));
+    REQUIRE(path);
+    {
+        char buffer[4096] = "";
+        const string e("file");
+        REQUIRE_RC(VPathReadScheme(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+    {
+        char buffer[4096] = "";
+        const string e(PATH);
+        REQUIRE_RC(VPathReadPath(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+}
+
+FIXTURE_TEST_CASE(UTF8_FILENAME, PathFixture) {
+#undef PATH
+#define PATH "f\xD0\xA4" "e.txt"
+    REQUIRE_RC(VFSManagerMakePath(vfs, &path, "%s", PATH));
+    REQUIRE(path);
+    {
+        char buffer[4096] = "";
+        const string e("file");
+        REQUIRE_RC(VPathReadScheme(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+    {
+        char buffer[4096] = "";
+        const string e(PATH);
+        REQUIRE_RC(VPathReadPath(path, buffer, sizeof buffer, &num_read));
+        REQUIRE_EQ(num_read, e.size());
+        REQUIRE_EQ(string(buffer), e);
+    }
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <klib/rc.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+const char UsageDefaultName[] = "test-path";
+
+static void clear_recorded_errors( void )
+{
+    rc_t rc;
+    const char * filename;
+    const char * funcname;
+    uint32_t line_nr;
+    while ( GetUnreadRCInfo ( &rc, &filename, &funcname, &line_nr ) )
+    {
+    }
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    rc_t rc=VPathTestSuite(argc, argv);
+    clear_recorded_errors();
+    return rc;
+}
+
+}
diff --git a/test/vfs/redirect-rejected-names-cgi-http-to-https.cpp b/test/vfs/redirect-rejected-names-cgi-http-to-https.cpp
new file mode 100644
index 0000000..192fa6e
--- /dev/null
+++ b/test/vfs/redirect-rejected-names-cgi-http-to-https.cpp
@@ -0,0 +1,213 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+
+
+#include <kapp/args.h> /* ArgsMakeAndHandle */
+
+#include <kfg/config.h> /* KConfig */
+
+#include <kfs/directory.h> /* KDirectory */
+
+#include <klib/debug.h> /* KDbgSetString */
+#include <klib/rc.h>
+
+#include <kns/http.h> /* KClientHttpRequest */
+#include <kns/manager.h> /* KNSManager */
+
+#include <vfs/manager.h> /* VFSManager */
+#include <vfs/manager-priv.h> /* VFSManagerMakeFromKfg */
+#include <vfs/path.h> /* VPath */
+#include <vfs/resolver.h> /* VResolver */
+
+#include "../../libs/kns/http-priv.h" /* KNSManagerMakeClientHttpInt */
+
+#include <ktst/unit_test.hpp>
+
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+
+extern "C" { void TESTING_VDB_3162 ( void ); }
+
+
+using std::cerr;
+
+
+static rc_t argsHandler(int argc, char* argv[]);
+TEST_SUITE_WITH_ARGS_HANDLER(VResolverTestSuite, argsHandler);
+
+
+typedef enum {
+    e200,
+    e403,
+} EForbidden;
+
+class Test : protected ncbi :: NK :: TestCase {
+    TestCase * _dad;
+public:
+    Test ( const std :: string & description, TestCase * dad,
+            EForbidden forbidden, const char * name, const char * url,
+            bool fail = false )
+        : TestCase ( name ), _dad ( dad )
+    {
+        rc_t rc = 0;
+
+        DBGMSG ( DBG_VFS, DBG_FLAG ( DBG_VFS ), ( "TESTING %s\n", name ) );
+
+        KDirectory * native  = NULL;
+        REQUIRE_RC ( KDirectoryNativeDir ( & native ) );
+
+        const KDirectory * dir = NULL;
+        REQUIRE_RC ( KDirectoryOpenDirRead ( native,
+            &dir, false, "redirect-rejected-names-cgi-http-to-https" ) );
+
+        KConfig * cfg = NULL;
+        REQUIRE_RC ( KConfigMake ( & cfg, dir ) );
+        REQUIRE_RC ( KConfigWriteString
+            ( cfg, "repository/remote/main/CGI/resolver-cgi", url ) );
+
+        VFSManager * vfs = NULL;
+        REQUIRE_RC ( VFSManagerMakeFromKfg ( & vfs, cfg ) );
+
+        VResolver * resolver = NULL;
+        REQUIRE_RC ( VFSManagerGetResolver ( vfs, & resolver ) );
+
+        VPath * query = NULL;
+        REQUIRE_RC ( VFSManagerMakePath ( vfs, & query, "SRR000001" ) );
+
+        const VPath * remote = NULL;
+
+        if ( forbidden == e403 ) {
+#ifdef VDB_3162
+            TESTING_VDB_3162 ();
+#endif
+        }
+
+#ifdef VDB_3162
+        if ( fail )
+            REQUIRE_RC_FAIL
+                ( VResolverQuery ( resolver, 0, query, 0, & remote, 0 ) );
+        else
+#endif
+        {
+            KNSManager * mgr = NULL;
+            REQUIRE_RC ( VFSManagerGetKNSMgr ( vfs, & mgr ) );
+            KClientHttpRequest * req = NULL;
+            if ( KNSManagerMakeClientRequest
+                    ( mgr, & req, 0x01010000, NULL, url )
+                ==  SILENT_RC
+                    ( rcNS, rcNoTarg, rcValidating, rcConnection, rcNotFound ) )
+            {
+                std::cerr << "Skipped test of not found " << url << "\n";
+            } else {
+                REQUIRE_RC
+                    ( VResolverQuery ( resolver, 0, query, 0, & remote, 0 ) );
+            }
+            RELEASE ( KClientHttpRequest, req );
+            RELEASE ( KNSManager, mgr );
+        }
+        RELEASE ( VPath, query );
+
+        RELEASE ( VPath, remote );
+
+        RELEASE ( VResolver, resolver );
+
+        RELEASE ( VFSManager, vfs );
+
+        RELEASE ( KConfig, cfg );
+
+        RELEASE ( KDirectory, dir );
+
+        RELEASE ( KDirectory, native );
+
+        REQUIRE ( ! rc );
+    }
+    ~Test ( void ) {
+        assert( _dad );
+        _dad -> ErrorCounterAdd ( GetErrorCounter () );
+    }
+};
+
+TEST_CASE(TEST) {
+
+#define RESOLVER_CGI_HEAD "test.ncbi.nlm.nih."
+
+#ifdef VDB_3162
+#else
+    DBGMSG ( DBG_VFS, DBG_FLAG ( DBG_VFS ),
+        ( "Simulation 403 in VFS library was DISABLED\n\n" ) );
+#endif
+    Test ( "Called over HTTP: retry over HTTPS after 403", this, e403 , "HTTP",
+        "http://" RESOLVER_CGI_HEAD "gov/Traces/names/names.cgi" );
+    Test ( "Called over htTP: retry over https after 403", this, e403 , "htTP",
+        "hTtP://" RESOLVER_CGI_HEAD "gov/Traces/names/names.cgi" );
+    Test ( "Called over http to GOV: retry over HTTPS after 403",
+        this, e403 , "http-gOv",
+        "http://" RESOLVER_CGI_HEAD "GoV/Traces/names/names.cgi" );
+
+    Test ( "Called over HTTPS: got 200", this, e200, "HTTPS",
+       "https://" RESOLVER_CGI_HEAD "gov/Traces/names/names.cgi" );
+    Test ( "Called over httPS: got 200", this, e200, "httPS",
+       "httPS://" RESOLVER_CGI_HEAD "gov/Traces/names/names.cgi" );
+    Test ( "Called over HTTPS to Gov: got 200", this, e200, "https to Gov",
+       "https://" RESOLVER_CGI_HEAD "GoV/Traces/names/names.cgi" );
+
+#if NOW_NAMES_CGI_ALWAYS_RETURNS_403_WHEN_ASKED_FOR_HTTP 
+    Test (
+        "Called over HTTP: fail after 403 - not retrying non-government sites",
+        this, e403, "HTTP, not government",
+        "http://www/Traces/names/names.cgi", true );
+    DBGMSG ( DBG_VFS, DBG_FLAG ( DBG_VFS ), ( "\n" ) );
+    Test (
+        "Called over htTP: fail after 403 - not retrying non-government sites",
+        this, e403, "htTP, not government",
+        "htTP://www/Traces/names/names.cgi", true );
+#endif
+
+    DBGMSG ( DBG_VFS, DBG_FLAG ( DBG_VFS ), ( "\n" ) );
+    Test ( "Called over HTTPS: fail after 403", this, e403, "403 by HTTPS",
+       "https://" RESOLVER_CGI_HEAD "gov/Traces/names/names.cgi", true );
+    DBGMSG ( DBG_VFS, DBG_FLAG ( DBG_VFS ), ( "\n" ) );
+    Test ( "Called over httPS: fail after 403", this, e403, "403 by httPS",
+       "httPS://" RESOLVER_CGI_HEAD "gov/Traces/names/names.cgi", true );
+}
+
+
+static rc_t argsHandler(int argc, char* argv[]) {
+    return ArgsMakeAndHandle ( NULL, argc, argv, 0, NULL, 0 );
+}
+
+extern "C" {
+    ver_t CC KAppVersion ( void                     ) { return 0; }
+    rc_t CC UsageSummary ( const char     * progname) { return 0; }
+    rc_t CC Usage        ( const struct Args * args ) { return 0; }
+    const char UsageDefaultName[] = "redirect-rejected-names-cgi-http-to-https";
+    rc_t CC KMain ( int argc, char *argv [] ) {
+        if ( 0 ) assert ( ! KDbgSetString ( "VFS" ) );
+        return VResolverTestSuite ( argc, argv );
+    }
+}
diff --git a/test/vfs/redirect-rejected-names-cgi-http-to-https/incomplete.kfg b/test/vfs/redirect-rejected-names-cgi-http-to-https/incomplete.kfg
new file mode 100644
index 0000000..21731b3
--- /dev/null
+++ b/test/vfs/redirect-rejected-names-cgi-http-to-https/incomplete.kfg
@@ -0,0 +1 @@
+foo = "bar"
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/vfs/repo/wgs/WGS/YY/ZZ/YYZZ10
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/vfs/repo/wgs/WGS/YY/ZZ/YYZZ10
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/vfs/repo/wgs/WGS/YY/ZZ/YYZZ99
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/vfs/repo/wgs/WGS/YY/ZZ/YYZZ99
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/vfs/repo/wgs2/WGS/YY/ZZ/YYZZ20
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/vfs/repo/wgs2/WGS/YY/ZZ/YYZZ20
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/vfs/repo/wgs2/WGS/YY/ZZ/YYZZ99
similarity index 100%
rename from src/main/java/htsjdk/tribble/util/ftp/.gitignore
rename to test/vfs/repo/wgs2/WGS/YY/ZZ/YYZZ99
diff --git a/test/vfs/resolvertest.cpp b/test/vfs/resolvertest.cpp
new file mode 100644
index 0000000..6c63893
--- /dev/null
+++ b/test/vfs/resolvertest.cpp
@@ -0,0 +1,344 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+
+/**
+* Unit tests for VResolver interface
+*/
+
+
+#include <klib/text.h>
+
+#include <ktst/unit_test.hpp>
+
+#include <kfg/config.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <vfs/manager.h>
+#include <vfs/manager-priv.h> /* VFSManagerMakeFromKfg */
+#include <vfs/resolver.h>
+#include <vfs/path.h>
+
+#include <cstdlib>
+#include <fstream>
+#include <stdexcept>
+
+#include <climits> /* PATH_MAX */
+
+#include <sysalloc.h>
+
+TEST_SUITE(VResolverTestSuite);
+
+using namespace std;
+
+static string ToString(const VPath* path)
+{
+    const String * s;
+    if ( VPathMakeString (path, &s) != 0 )
+        throw logic_error ( "ToString(VPath) failed" );
+    string ret = string(s->addr, s->size);
+    free((void*)s);
+    return ret;
+}
+
+class ResolverFixture
+{
+public:
+    ResolverFixture()
+        : vfs ( 0 )
+        , resolver ( 0 )
+        , query ( 0 )
+        , local ( 0 )
+        , remote ( 0 )
+        , cache ( 0 )
+    {
+        rc_t rc = VFSManagerMake ( & vfs );
+        if ( rc != 0 )
+            throw logic_error ( "ResolverFixture: VFSManagerMake failed" );
+        rc = VFSManagerGetResolver ( vfs, & resolver );
+        if ( rc != 0 )
+            throw logic_error ( "ResolverFixture: VFSManagerGetResolver failed" );
+    }
+
+    ~ResolverFixture()
+    {
+        VResolverRelease ( resolver );
+        VFSManagerRelease ( vfs );
+    }
+    
+    VFSManager * vfs;
+    VResolver * resolver;
+    VPath * query;
+    const VPath * local;
+    const VPath * remote;
+    const VPath * cache;
+};
+
+FIXTURE_TEST_CASE ( VDB_2936_resolve_local_WGS_without_version, ResolverFixture )
+{
+    String acc;
+    CONST_STRING ( & acc, "JBBO01" );
+
+    REQUIRE_RC ( VFSManagerMakePath ( vfs, & query, "%S", & acc ) );
+    try
+    {
+        rc_t rc2 = VResolverQuery ( resolver, eProtocolHttp, query, & local, 0, 0 );
+        if ( rc2 == 0 )
+        {
+            try
+            {
+                String path;
+                REQUIRE_RC ( VPathGetPath ( local, & path ) );
+                if ( path . size > acc . size )
+                    REQUIRE_EQ ( path . addr [ path . size - acc . size - 1 ], '/' );
+                else
+                    REQUIRE_EQ ( path . size, acc . size );
+
+                String sub;
+                StringSubstr ( & path, & sub, path . len - acc . len, 0 );
+                REQUIRE_EQ ( StringCompare ( & acc, & sub ), ( int ) 0 );
+            }
+            catch ( ... )
+            {
+                VPathRelease ( local ); local = 0;
+                throw;
+            }
+
+            VPathRelease ( local ); local = 0;
+        }
+    }
+    catch ( ... )
+    {
+        VPathRelease ( query ); query = 0;
+        throw;
+    }
+
+    VPathRelease ( query ); query = 0;
+}
+
+FIXTURE_TEST_CASE ( VDB_2936_resolve_local_WGS_with_version, ResolverFixture )
+{
+    String acc;
+    CONST_STRING ( & acc, "JBBO01.1" );
+
+    REQUIRE_RC ( VFSManagerMakePath ( vfs, & query, "%S", & acc ) );
+    try
+    {
+        rc_t rc2 = VResolverQuery ( resolver, eProtocolHttp, query, & local, 0, 0 );
+        if ( rc2 == 0 )
+        {
+            try
+            {
+                String path;
+                REQUIRE_RC ( VPathGetPath ( local, & path ) );
+                if ( path . size > acc . size )
+                    REQUIRE_EQ ( path . addr [ path . size - acc . size - 1 ], '/' );
+                else
+                    REQUIRE_EQ ( path . size, acc . size );
+
+                String sub;
+                StringSubstr ( & path, & sub, path . len - acc . len, 0 );
+                REQUIRE_EQ ( StringCompare ( & acc, & sub ), ( int ) 0 );
+            }
+            catch ( ... )
+            {
+                VPathRelease ( local ); local = 0;
+                throw;
+            }
+
+            VPathRelease ( local ); local = 0;
+        }
+    }
+    catch ( ... )
+    {
+        VPathRelease ( query ); query = 0;
+        throw;
+    }
+
+    VPathRelease ( query ); query = 0;
+}
+
+class ResolverFixtureCustomConfig
+{
+public:
+    ResolverFixtureCustomConfig()
+        : vfs ( 0 )
+        , resolver ( 0 )
+    {
+    }
+
+    ~ResolverFixtureCustomConfig()
+    {
+        if (vfs && VFSManagerRelease(vfs) != 0)
+            throw logic_error ( "~ResolverFixtureCustomConfig: VFSManagerRelease failed" );
+
+        if (resolver && VResolverRelease(resolver) != 0)
+            throw logic_error ( "~ResolverFixtureCustomConfig: VResolverRelease failed" );
+
+        remove(m_configName.c_str());
+    }
+
+    void Configure(const string& name, const string& config_content)
+    {
+        m_configName = name+".kfg";
+        std::ofstream f(m_configName.c_str());
+        f   << config_content;
+        f.close();
+
+        KDirectory *wd;
+        if (KDirectoryNativeDir(&wd))
+            throw logic_error ( "ResolverFixtureCustomConfig::Configure: KDirectoryNativeDir failed" );
+
+        KConfig *cfg;
+        if (KConfigMake(&cfg, wd))
+            throw logic_error ( "ResolverFixtureCustomConfig::Configure: KConfigMake failed" );
+
+        if (VFSManagerMakeFromKfg(&vfs, cfg))
+            throw logic_error ( "ResolverFixtureCustomConfig::Configure: VFSManagerMakeFromKfg failed" );
+
+        if (VFSManagerGetResolver ( vfs, & resolver ))
+            throw logic_error ( "ResolverFixtureCustomConfig::Configure: VFSManagerGetResolver failed" );
+
+        if (KConfigRelease(cfg))
+            throw logic_error ( "ResolverFixtureCustomConfig::Configure: KConfigRelease failed" );
+
+        if (KDirectoryRelease(wd))
+            throw logic_error ( "ResolverFixtureCustomConfig::Configure: KDirectoryRelease failed" );
+    }
+
+    string Resolve(const string& p_accession)
+    {
+        VPath * query;
+        const VPath * local;
+        string result;
+        if ( VFSManagerMakePath ( vfs, & query, "%s", p_accession.c_str() ) )
+            throw logic_error ( "ResolverFixtureCustomConfig::Resolve: VFSManagerMakePath failed" );
+        try
+        {
+            if ( VResolverQuery ( resolver, eProtocolHttp, query, & local, 0, 0 ) )
+                throw logic_error ( "ResolverFixtureCustomConfig::Resolve: VResolverQuery failed" );
+            try
+            {
+                result = ToString(local);
+            }
+            catch ( ... )
+            {
+                VPathRelease ( local ); local = 0;
+                throw;
+            }
+
+            VPathRelease ( local ); local = 0;
+        }
+        catch ( ... )
+        {
+            VPathRelease ( query ); query = 0;
+            throw;
+        }
+
+        VPathRelease ( query ); query = 0;
+        return result;
+    }
+
+    VFSManager * vfs;
+    VResolver * resolver;
+
+    string m_configName;
+};
+
+FIXTURE_TEST_CASE(VDB_2963_resolve_local_new_wgs, ResolverFixtureCustomConfig)
+{
+    string config =
+            "repository/user/main/public/root=\"./repo\"\n"
+            "repository/user/main/public/apps/wgs/volumes/wgs=\"wgs\"\n"
+            "repository/user/main/public/apps/wgs/volumes/wgs2=\"wgs2\"\n"
+            ;
+    Configure(GetName(), config);
+
+    REQUIRE_EQ ( Resolve ( "YYZZ99" ), string("./repo/wgs2/WGS/YY/ZZ/YYZZ99") );
+    REQUIRE_EQ ( Resolve ( "YYZZ20" ), string("./repo/wgs2/WGS/YY/ZZ/YYZZ20") );
+    REQUIRE_EQ ( Resolve ( "YYZZ10" ), string("./repo/wgs/WGS/YY/ZZ/YYZZ10") );
+}
+
+FIXTURE_TEST_CASE(VDB_2963_resolve_local_no_new_wgs, ResolverFixtureCustomConfig)
+{
+    string config =
+            "repository/user/main/public/root=\"./repo\"\n"
+            "repository/user/main/public/apps/wgs/volumes/wgs=\"wgs\"\n"
+            ;
+    Configure(GetName(), config);
+
+    REQUIRE_EQ ( Resolve ( "YYZZ99" ), string("./repo/wgs/WGS/YY/ZZ/YYZZ99") );
+    REQUIRE_EQ ( Resolve ( "YYZZ10" ), string("./repo/wgs/WGS/YY/ZZ/YYZZ10") );
+
+    try {
+        Resolve ( "YYZZ20" );
+        REQUIRE ( false ); // should throw earlier
+    } catch (...) { }
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <klib/rc.h>
+
+    ver_t CC KAppVersion ( void )
+    {
+        return 0x1000000;
+    }
+
+    rc_t CC UsageSummary (const char * progname)
+    {
+        return 0;
+    }
+
+    rc_t CC Usage ( const Args * args )
+    {
+        return 0;
+    }
+
+    const char UsageDefaultName[] = "test-resolver";
+
+    static void clear_recorded_errors ( void )
+    {
+        rc_t rc;
+        const char * filename;
+        const char * funcname;
+        uint32_t line_nr;
+        while ( GetUnreadRCInfo ( &rc, &filename, &funcname, &line_nr ) )
+        {
+        }
+    }
+
+    rc_t CC KMain ( int argc, char *argv [] )
+    {
+        rc_t rc = VResolverTestSuite ( argc, argv );
+        clear_recorded_errors();
+        return rc;
+    }
+
+}
diff --git a/test/vfs/test-caching.cpp b/test/vfs/test-caching.cpp
new file mode 100644
index 0000000..31e5426
--- /dev/null
+++ b/test/vfs/test-caching.cpp
@@ -0,0 +1,615 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfg/config.h> /* KConfig */
+#include <kfs/directory.h> /* KDirectory */
+#include <ktst/unit_test.hpp> // TEST_SUITE
+#include <sra/sraschema.h> // VDBManagerMakeSRASchema
+#include <vdb/cursor.h> /* VCursor */
+#include <vdb/manager.h> /* VDBManager */
+#include <vdb/table.h> /* VTable */
+#include <vdb/vdb-priv.h> /* VDBManagerMakeReadWithVFSManager */
+#include <vfs/manager.h> /* VFSManager */
+#include <vfs/manager-priv.h> /* VFSManagerMakeFromKfg */
+#include <vfs/resolver.h> /* VResolverCacheEnable */
+#include <vdb/database.h> /* VDatabase */
+#include <vdb/schema.h> /* VSchema */
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+    if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+rc_t StringRelease ( String * self ) { free ( self ); return 0; }
+
+TEST_SUITE(CachingSuite);
+
+typedef enum {
+/* SETTERS */
+    eNone                            =      0,
+    eAppsRefseq                      =      1,
+    eAppsSra                         =      2,
+    eAppsWgs                         =      4,
+    
+    eUserCacheDisabledSetFalse       =   0x20, //                 10b
+    eUserCacheDisabledSetTrue        =   0x30, //                 11b
+
+    eUserPublicCacheEnabledSetFalse  =   0x80, //               1000b
+    eUserPublicCacheEnabledSetTrue   =   0xC0, //               1100b
+
+    eUserPublicDisabledSetFalse      =  0x200, //            10 0000b
+    eUserPublicDisabledSetTrue       =  0x300, //            11 0000b
+
+    eAppRefseqDisabledSetFalse       =  0x800, //          1000 0000b
+    eAppRefseqDisabledSetTrue        =  0xC00, //          1100 0000b
+
+    eAppSraDisabledSetFalse          = 0x2000, //       10 0000 0000b
+    eAppSraDisabledSetTrue           = 0x3000, //       11 0000 0000b
+
+    eAppRefseqCacheEnabledSetFalse   = 0x8000, //     1000 0000 0000b
+    eAppRefseqCacheEnabledSetTrue    = 0xC000, //     1100 0000 0000b
+
+    eAppSraCacheEnabledSetFalse      =0x20000, //  10 0000 0000 0000b
+    eAppSraCacheEnabledSetTrue       =0x30000, //  11 0000 0000 0000b
+
+    eResolverAlwaysEnable            =0x40000, // 100 0000 0000 0000b
+    eResolverAlwaysDisable           =0x80000, //1000 0000 0000 0000b
+
+/* GETTERS */
+    eUserCacheDisabled = eUserCacheDisabledSetFalse,
+    eUserCacheDisabledTrue           =   0x10,  //                 1
+
+    eUserPublicCacheEnabled = eUserPublicCacheEnabledSetFalse,
+    eUserPublicCacheEnabledTrue      =   0x40,  //               100b
+
+    eUserPublicDisabled = eUserPublicDisabledSetFalse,
+    eUserPublicDisabledTrue          =  0x100,  //             1 000b
+
+    eAppRefseqDisabled = eAppRefseqDisabledSetFalse,
+    eAppRefseqDisabledTrue           =  0x400,  //           100 000b
+
+    eAppSraDisabled = eAppSraDisabledSetFalse,
+    eAppSraDisabledTrue              = 0x1000,  //      01 0000 0000b
+
+    eAppRefseqCacheEnabled = eAppRefseqCacheEnabledSetFalse,
+    eAppRefseqCacheEnabledTrue       = 0x4000,  //     100 0000 0000b
+
+    eAppSraCacheEnabled = eAppSraCacheEnabledSetFalse,
+    eAppSraCacheEnabledTrue          =0x10000,  //  1 0000 0000 0000b
+} E;
+
+class SET {
+public:
+    static rc_t set ( KConfig * self, int e ) {
+        if ( e == 0 ){
+            return 0;
+        }
+        rc_t rc = 0;
+        if ( e & eAppsRefseq ) {
+            rc = KConfigWriteString ( self,
+               "/repository/user/main/public/apps/refseq/volumes/refseq",
+                "refseq" );
+        }
+        if ( e & eAppsSra ) {
+            rc = KConfigWriteString ( self,
+               "/repository/user/main/public/apps/sra/volumes/sraFlat", "sra" );
+        }
+        if ( e & eAppsWgs ) {
+            rc = KConfigWriteString ( self,
+               "/repository/user/main/public/apps/wgs/volumes/wgsFlat", "wgs" );
+        }
+        if ( rc == 0 && e & eUserCacheDisabled ) {
+            const char * v = e & eUserCacheDisabledTrue ? "true" : "false";
+            rc = KConfigWriteString ( self,
+                "/repository/user/cache-disabled", v );
+        }
+        if ( rc == 0 && e & eUserPublicCacheEnabled ) {
+            const char * v = e & eUserPublicCacheEnabledTrue ? "true" : "false";
+            rc = KConfigWriteString ( self,
+                "/repository/user/main/public/cache-enabled", v );
+        }
+        if ( rc == 0 && e & eUserPublicDisabled ) {
+            const char * v = e & eUserPublicDisabledTrue ? "true" : "false";
+            rc = KConfigWriteString ( self,
+                "/repository/user/main/public/disabled", v );
+        }
+        if ( rc == 0 && e & eAppRefseqDisabled ) {
+            const char * v = e & eAppRefseqDisabledTrue ? "true" : "false";
+            rc = KConfigWriteString ( self,
+                "/repository/user/main/public/apps/refseq/disabled", v );
+        }
+        if ( rc == 0 && e & eAppSraDisabled ) {
+            const char * v = e & eAppSraDisabledTrue ? "true" : "false";
+            rc = KConfigWriteString ( self,
+                "/repository/user/main/public/apps/sra/disabled", v );
+        }
+        if ( rc == 0 && e & eAppRefseqCacheEnabled ) {
+            const char * v = e & eAppRefseqCacheEnabledTrue ? "true" : "false";
+            rc = KConfigWriteString ( self,
+                "/repository/user/main/public/apps/refseq/cache-enabled", v );
+        }
+        if ( rc == 0 && e & eAppSraCacheEnabled ) {
+            const char * v = e & eAppSraCacheEnabledTrue ? "true" : "false";
+            rc = KConfigWriteString ( self,
+                "/repository/user/main/public/apps/sra/cache-enabled", v );
+        }
+        return rc;
+    }
+
+    static rc_t set ( const VFSManager * self, int e ) {
+        if ( ( e & eResolverAlwaysEnable ) && ( e & eResolverAlwaysDisable ) ) {
+            assert (0);
+        }
+        if ( e & eResolverAlwaysEnable ) {
+            return enbl ( self, vrAlwaysEnable );
+        }
+        else if ( e & eResolverAlwaysDisable ) {
+            return enbl ( self, vrAlwaysDisable );
+        }
+        else {
+            return 0;
+        }
+    }
+
+    static rc_t resetSingleton ( const VFSManager * self ) {
+        return enbl ( self, vrUseConfig ); // VResolverEnableState IS STICKY !!!
+    }
+
+private:
+    static rc_t enbl ( const VFSManager * self,  VResolverEnableState enable ) {
+        VResolver * resolver = NULL;
+        rc_t rc = VFSManagerGetResolver ( self, & resolver );
+        if ( rc == 0 ) {
+            VResolverCacheEnable ( resolver, enable );
+        }
+        RELEASE ( VResolver, resolver );
+        return rc;
+    }
+};
+
+typedef enum {
+    eRefseq,
+    eSra,
+    eWgs,
+} EType;
+
+class Test : protected ncbi::NK::TestCase {
+    TestCase * _dad;
+
+public:
+    Test ( TestCase * dad, bool caching, int v, EType type )
+        : TestCase ( dad -> GetName () ), _dad ( dad )
+    {
+#define WGS "AFVF01"
+        const char * acc = type == eRefseq ? "KC702199.1" :
+                           type == eSra    ? "SRR053325" : WGS ".1"; 
+        rc_t rc = 0;
+        KDirectory * native  = NULL;
+        REQUIRE_RC ( KDirectoryNativeDir ( & native ) );
+        const KDirectory * dir = NULL;
+        REQUIRE_RC
+            ( KDirectoryOpenDirRead ( native, &dir, false, "caching-kfg" ) );
+        KConfig * cfg = NULL;
+        REQUIRE_RC ( KConfigMake ( & cfg, dir ) );
+        REQUIRE_RC ( SET :: set ( cfg, v ) );
+//KConfigPrint(cfg, 0);
+        String * test_root = NULL;
+        REQUIRE_RC ( KConfigReadString ( cfg, "/TEST_ROOT", & test_root ) );
+        String * user_root = NULL;
+        REQUIRE_RC ( KConfigReadString
+            ( cfg, "/repository/user/main/public/root", & user_root ) );
+
+        // KConfigReadString creates NULL-terminated strings
+        REQUIRE ( user_root );
+        REQUIRE_RC ( KDirectoryRemove ( native, true, user_root -> addr ) );
+
+        VFSManager * vfs = NULL;
+
+        REQUIRE_RC ( VFSManagerMakeFromKfg ( & vfs, cfg ) );
+        REQUIRE_RC ( SET :: resetSingleton ( vfs ) );
+
+        REQUIRE_RC ( SET :: set ( vfs, v ) );
+        const VDBManager * mgr = NULL;
+        REQUIRE_RC ( VDBManagerMakeReadWithVFSManager ( & mgr, NULL, vfs ) );
+        VSchema * schema = NULL;
+        REQUIRE_RC ( VDBManagerMakeSRASchema ( mgr, & schema ) );
+
+        // KConfigReadString creates NULL-terminated strings
+        REQUIRE ( user_root ); 
+        REQUIRE_EQ ( KDirectoryPathType ( native, user_root -> addr ),
+                     ( KPathType ) kptNotFound );
+        const VDatabase * db = NULL;
+        const VTable * tbl = NULL;
+        if ( type == eWgs ) {
+            REQUIRE_RC ( VDBManagerOpenDBRead ( mgr, & db, NULL, acc ) );
+        }
+        else {
+            REQUIRE_RC ( VDBManagerOpenTableRead ( mgr, & tbl, schema, acc ) );
+        }
+
+        // KConfigReadString creates NULL-terminated strings
+        REQUIRE ( user_root ); 
+        if ( caching ) {
+            REQUIRE_EQ ( KDirectoryPathType ( native, user_root -> addr ),
+                         ( KPathType ) kptDir );
+            switch ( type ) {
+            case eRefseq:
+                REQUIRE_EQ ( KDirectoryPathType ( native, "%s/refseq/%s.cache",
+                             user_root -> addr, acc ), ( KPathType ) kptFile );
+                break;
+            case eSra:
+                REQUIRE_EQ ( KDirectoryPathType ( native, "%s/sra/%s.sra.cache",
+                             user_root -> addr, acc ), ( KPathType ) kptFile );
+                break;
+            case eWgs:
+                REQUIRE_EQ ( KDirectoryPathType ( native, "%s/wgs/%s.cache",
+                             user_root -> addr, WGS ), ( KPathType ) kptFile );
+                break;
+            default:
+                assert ( 0 ) ;
+                break;
+            }
+        }
+        else {
+            REQUIRE_EQ ( KDirectoryPathType ( native, user_root -> addr ),
+                         ( KPathType ) kptNotFound );
+        }
+        RELEASE ( VDatabase, db );
+        RELEASE ( VSchema, schema );
+        RELEASE ( VTable, tbl );
+
+        REQUIRE_RC ( SET :: resetSingleton ( vfs ) );
+        RELEASE ( VFSManager, vfs );
+
+        RELEASE ( VDBManager, mgr );
+        RELEASE ( KDirectory, dir );
+
+        // KConfigReadString creates NULL-terminated strings
+        REQUIRE ( user_root ); 
+        REQUIRE_RC ( KDirectoryRemove ( native, true, user_root -> addr ) );
+        REQUIRE_EQ ( KDirectoryPathType ( native, user_root -> addr ),
+                     ( KPathType ) kptNotFound );
+
+        RELEASE ( String, user_root );
+        REQUIRE_RC ( KConfigReadString ( cfg, "/TEST_SUBROOT", & user_root ) );
+
+        // KConfigReadString creates NULL-terminated strings
+        REQUIRE ( user_root );
+        REQUIRE_RC ( KDirectoryRemove ( native, false, user_root -> addr ) );
+        RELEASE ( String, user_root );
+
+        // KConfigReadString creates NULL-terminated strings
+        REQUIRE ( test_root ); 
+        KDirectoryRemove ( native, false, test_root -> addr );
+        // might fail when there is another test build running parallelly
+
+        RELEASE ( String, test_root );
+        RELEASE ( KConfig, cfg );
+        RELEASE ( KDirectory, native );
+        REQUIRE_RC ( rc );
+}
+
+  ~Test ( void ) {
+      assert( _dad );
+      _dad->ErrorCounterAdd(GetErrorCounter());
+    }
+};
+
+class NonCaching : private Test {
+public:
+    NonCaching ( TestCase * dad, int v = eNone, EType type = eSra )
+        : Test ( dad, false, v, type )
+    {}
+};
+
+class Caching : private Test {
+public:
+    Caching (TestCase * dad, int v, EType type = eSra )
+        : Test ( dad, true, v, type )
+    {}
+};
+
+TEST_CASE ( SRR_INCOMPLETE_USER_REPO ) {
+    NonCaching ( this );
+}
+TEST_CASE ( REFSEQ_INCOMPLETE_USER_REPO ) {
+    NonCaching ( this, eNone, eRefseq );
+}
+TEST_CASE ( WGS_INCOMPLETE_USER_REPO ) {
+    NonCaching ( this, eNone, eWgs );
+}
+
+TEST_CASE ( REFSEQ_BAD_APP_IN_USER_REPO ) {
+    NonCaching ( this, eAppsSra , eRefseq );
+}
+TEST_CASE ( WGS_BAD_APP_IN_USER_REPO ) {
+    NonCaching ( this, eAppsSra , eWgs );
+}
+
+TEST_CASE ( SRR_COMPLETE_USER_REPO ) {
+    Caching ( this, eAppsSra );
+}
+TEST_CASE ( REFSEQ_COMPLETE_USER_REPO ) {
+    Caching ( this, eAppsRefseq, eRefseq );
+}
+TEST_CASE ( WGS_COMPLETE_USER_REPO ) {
+    Caching ( this, eAppsWgs, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_DISABLED_BY_VDB_CONFIG_GRF ) {
+    NonCaching ( this, eAppsSra | eUserCacheDisabledSetTrue );
+}
+TEST_CASE ( REFSEQ_CASHING_DISABLED_BY_VDB_CONFIG_GRF ) {
+    NonCaching ( this, eAppsRefseq | eUserCacheDisabledSetTrue, eRefseq );
+}
+TEST_CASE ( WGS_DISABLED_BY_VDB_CONFIG_GRF ) {
+    NonCaching ( this, eAppsWgs | eUserCacheDisabledSetTrue, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_ENABLED_BY_VDB_CONFIG_GRF ) {
+    Caching ( this, eAppsSra | eUserCacheDisabledSetFalse );
+}
+TEST_CASE ( REFSEQ_CASHING_ENABLED_BY_VDB_CONFIG_GRF ) {
+    Caching ( this, eAppsRefseq | eUserCacheDisabledSetFalse, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_ENABLED_BY_VDB_CONFIG_GRF ) {
+    Caching ( this, eAppsWgs | eUserCacheDisabledSetFalse, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_ENABLED_BY_VDB_CONFIG_TXT ) {
+    Caching ( this, eAppsSra | eUserPublicCacheEnabledSetTrue );
+}
+TEST_CASE ( REFSEQ_CASHING_ENABLED_BY_VDB_CONFIG_TXT ) {
+    Caching ( this, eAppsRefseq | eUserPublicCacheEnabledSetTrue, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_ENABLED_BY_VDB_CONFIG_TXT ) {
+    Caching ( this, eAppsWgs | eUserPublicCacheEnabledSetTrue, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_DISABLED_BY_VDB_CONFIG_TXT ) {
+    NonCaching ( this, eAppsSra | eUserPublicCacheEnabledSetFalse );
+}
+TEST_CASE ( REFSEQ_CASHING_DISABLED_BY_VDB_CONFIG_TXT ) {
+    NonCaching ( this, eAppsRefseq | eUserPublicCacheEnabledSetFalse, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_DISABLED_BY_VDB_CONFIG_TXT ) {
+    NonCaching ( this, eAppsWgs | eUserPublicCacheEnabledSetFalse, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_ENABLED_BY_VDB_CONFIG_TXT_AND_GRF ) {
+    Caching ( this, eAppsSra | eUserCacheDisabledSetFalse |
+                               eUserPublicCacheEnabledSetTrue );
+}
+TEST_CASE ( REFSEQ_CASHING_ENABLED_BY_VDB_CONFIG_TXT_AND_GRF ) {
+    Caching ( this, eAppsRefseq | eUserCacheDisabledSetFalse |
+                                  eUserPublicCacheEnabledSetTrue, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_ENABLED_BY_VDB_CONFIG_TXT_AND_GRF ) {
+    Caching ( this, eAppsWgs | eUserCacheDisabledSetFalse |
+                               eUserPublicCacheEnabledSetTrue, eWgs );
+}
+
+TEST_CASE ( SRR_USER_REPO_DISABLED ) {
+    NonCaching ( this, eAppsSra | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetTrue );
+}
+TEST_CASE ( REFSEQ_USER_REPO_DISABLED ) {
+    NonCaching ( this, eAppsRefseq | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetTrue, eRefseq );
+}
+TEST_CASE ( WGS_USER_REPO_DISABLED ) {
+    NonCaching ( this, eAppsWgs | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetTrue, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_AND_REPO_ENABLED ) {
+    Caching ( this, eAppsSra | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse );
+}
+TEST_CASE ( REFSEQ_CASHING_AND_REPO_ENABLED ) {
+    Caching ( this, eAppsRefseq | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_AND_REPO_ENABLED ) {
+    Caching ( this, eAppsWgs | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_AND_REPO_ENABLED_DISABLE_REFSEQ_APP ) {
+    Caching ( this, eAppsSra | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetTrue );
+}
+TEST_CASE ( REFSEQ_CASHING_AND_REPO_ENABLED_DISABLE_REFSEQ_APP ) {
+    NonCaching ( this, eAppsRefseq | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetTrue, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_AND_REPO_ENABLED_DISABLE_REFSEQ_APP ) {
+    Caching ( this, eAppsWgs | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetTrue, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_AND_REPO_ENABLED_DISABLE_SRA_APP ) {
+    NonCaching ( this, eAppsSra | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppSraDisabledSetTrue );
+}
+TEST_CASE ( REFSEQ_CASHING_AND_REPO_ENABLED_DISABLE_SRA_APP ) {
+    Caching ( this, eAppsRefseq | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppSraDisabledSetTrue, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_AND_REPO_ENABLED_DISABLE_SRA_APP ) {
+    Caching ( this, eAppsWgs | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppSraDisabledSetTrue, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_AND_REPO_ENABLED_DISABLE_SRA_APP_CACHE ) {
+    NonCaching ( this, eAppsSra | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppSraCacheEnabledSetFalse );
+}
+TEST_CASE ( REFSEQ_CASHING_AND_REPO_ENABLED_DISABLE_SRA_APP_CACHE ) {
+    Caching ( this, eAppsRefseq | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppSraCacheEnabledSetTrue | eAppSraCacheEnabledSetFalse, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_AND_REPO_ENABLED_DISABLE_SRA_APP_CACHE ) {
+    Caching ( this, eAppsWgs | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppSraCacheEnabledSetTrue | eAppSraCacheEnabledSetFalse, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_ENABLED_BY_VDB_CONFIG_GRF_DISABLED_BY_TXT ) {
+    NonCaching ( this, eAppsSra | eUserCacheDisabledSetFalse |
+                                  eUserPublicCacheEnabledSetFalse );
+}
+TEST_CASE ( REFSEQ_CASHING_ENABLED_BY_VDB_CONFIG_GRF_DISABLED_BY_TXT ) {
+    NonCaching ( this, eAppsRefseq | eUserCacheDisabledSetFalse |
+                                     eUserPublicCacheEnabledSetFalse, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_ENABLED_BY_VDB_CONFIG_GRF_DISABLED_BY_TXT ) {
+    NonCaching ( this, eAppsWgs | eUserCacheDisabledSetFalse |
+                                  eUserPublicCacheEnabledSetFalse, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_DISABLED_BY_VDB_CONFIG_TXT_AND_GRF ) {
+     NonCaching ( this, eAppsSra | eUserCacheDisabledSetTrue |
+                                   eUserPublicCacheEnabledSetFalse );
+}
+TEST_CASE ( REFSEQ_CASHING_DISABLED_BY_VDB_CONFIG_TXT_AND_GRF ) {
+    NonCaching ( this, eAppsRefseq | eUserCacheDisabledSetTrue |
+                                     eUserPublicCacheEnabledSetFalse, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_DISABLED_BY_VDB_CONFIG_TXT_AND_GRF ) {
+    NonCaching ( this, eAppsWgs | eUserCacheDisabledSetTrue |
+                                  eUserPublicCacheEnabledSetFalse, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_DISABLED_BY_VDB_CONFIG_GRF_ENABLED_BY_TXT ) {
+     NonCaching ( this, eAppsSra | eUserCacheDisabledSetTrue |
+                                   eUserPublicCacheEnabledSetTrue );
+}
+TEST_CASE ( REFSEQ_CASHING_DISABLED_BY_VDB_CONFIG_GRF_ENABLED_BY_TXT ) {
+    NonCaching ( this, eAppsRefseq | eUserCacheDisabledSetTrue |
+                                     eUserPublicCacheEnabledSetTrue, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_DISABLED_BY_VDB_CONFIG_GRF_ENABLED_BY_TXT ) {
+    NonCaching ( this, eAppsWgs | eUserCacheDisabledSetTrue |
+                                  eUserPublicCacheEnabledSetTrue, eWgs );
+}
+
+TEST_CASE ( SRR_APP_DISABLED ) {
+    NonCaching ( this, eAppsSra | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetFalse | eAppSraDisabledSetTrue |
+        eAppRefseqCacheEnabledSetTrue | eAppSraCacheEnabledSetTrue );
+}
+TEST_CASE ( REFSEQ_SRR_APP_DISABLED ) {
+    Caching ( this, eAppsRefseq | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetFalse | eAppSraDisabledSetTrue |
+        eAppRefseqCacheEnabledSetTrue | eAppSraCacheEnabledSetTrue, eRefseq );
+}
+
+TEST_CASE ( SRR_APP_DISABLED_ALWASY_ENABLE ) {
+    NonCaching ( this, eAppsSra | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetFalse | eAppSraDisabledSetTrue |
+        eAppRefseqCacheEnabledSetTrue | eAppSraCacheEnabledSetTrue |
+        eResolverAlwaysEnable );
+}
+
+TEST_CASE ( SRR_CASHING_AND_REPO_AND_APP_ENABLED ) {
+    Caching ( this, eAppsSra | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetFalse | eAppSraDisabledSetFalse |
+        eAppRefseqCacheEnabledSetTrue | eAppSraCacheEnabledSetTrue );
+}
+TEST_CASE ( REFSEQ_CASHING_AND_REPO_AND_APP_ENABLED ) {
+    Caching ( this, eAppsRefseq | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetFalse | eAppSraDisabledSetFalse |
+        eAppRefseqCacheEnabledSetTrue | eAppSraCacheEnabledSetTrue, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_AND_REPO_AND_APP_ENABLED ) {
+    Caching ( this, eAppsWgs | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetFalse | eAppSraDisabledSetFalse |
+        eAppRefseqCacheEnabledSetTrue | eAppSraCacheEnabledSetTrue, eWgs );
+}
+
+TEST_CASE ( SRR_CASHING_ALWAYS_DISABLE ) {
+    NonCaching ( this, eAppsSra | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetFalse | eAppSraDisabledSetFalse |
+        eAppRefseqCacheEnabledSetTrue | eAppSraCacheEnabledSetTrue |
+        eResolverAlwaysDisable );
+}
+TEST_CASE ( REFSEQ_CASHING_ALWAYS_DISABLE ) {
+    NonCaching ( this, eAppsRefseq | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetFalse | eAppSraDisabledSetFalse |
+        eAppRefseqCacheEnabledSetTrue | eAppSraCacheEnabledSetTrue |
+        eResolverAlwaysDisable, eRefseq );
+}
+TEST_CASE ( WGS_CASHING_ALWAYS_DISABLE ) {
+    NonCaching ( this, eAppsWgs | eUserCacheDisabledSetFalse |
+        eUserPublicCacheEnabledSetTrue | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetFalse | eAppSraDisabledSetFalse |
+        eAppRefseqCacheEnabledSetTrue | eAppSraCacheEnabledSetTrue |
+        eResolverAlwaysDisable, eWgs );
+}
+
+TEST_CASE ( SRR_NON_CACHING ) {
+    NonCaching ( this, eAppsSra | eUserCacheDisabledSetTrue |
+        eUserPublicCacheEnabledSetFalse | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetTrue | eAppSraDisabledSetFalse |
+        eAppRefseqCacheEnabledSetFalse | eAppSraCacheEnabledSetFalse );
+}
+TEST_CASE ( SRR_ALWAYS_ENABLE ) {
+    Caching ( this, eAppsSra | eUserCacheDisabledSetTrue |
+        eUserPublicCacheEnabledSetFalse | eUserPublicDisabledSetFalse |
+        eAppRefseqDisabledSetTrue | eAppSraDisabledSetFalse |
+        eAppRefseqCacheEnabledSetFalse | eAppSraCacheEnabledSetFalse |
+        eResolverAlwaysEnable );
+}
+
+TEST_CASE ( REFSEQ_APP_CACHE_DISABLE ) {
+    NonCaching ( this, eAppsRefseq | eAppRefseqCacheEnabledSetFalse, eRefseq );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+extern "C" {
+    ver_t CC KAppVersion ( void ) {
+        return 0;
+    }
+    rc_t CC KMain ( int argc, char * argv [] ) {
+        return CachingSuite ( argc, argv );
+    }
+}
diff --git a/test/vxf/Makefile b/test/vxf/Makefile
new file mode 100644
index 0000000..dbba80c
--- /dev/null
+++ b/test/vxf/Makefile
@@ -0,0 +1,83 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/vxf
+
+TEST_TOOLS = \
+	wb-test-vxf \
+	vdb-2915-test
+    
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+	@ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# white-box test
+#
+TEST_SRC = \
+	wb-test-vxf \
+	wb-irzip-impl
+
+TEST_OBJ = \
+	$(addsuffix .$(OBJX),$(TEST_SRC))
+
+TEST_LIBS = \
+    -skapp \
+    -sktst \
+	-sncbi-vdb \
+	-sxml2 \
+	-sm
+
+$(TEST_BINDIR)/wb-test-vxf: $(TEST_OBJ)
+	$(LP) --exe -o $@ $^ $(TEST_LIBS)
+
+
+#-------------------------------------------------------------------------------
+# vdb-2915
+#
+VDB_2915_SRC = \
+	VDB-2915
+
+VDB_2915_OBJ = \
+	$(addsuffix .$(OBJX),$(VDB_2915_SRC))
+
+VDB_2915_LIBS = \
+    -skapp \
+    -sktst \
+	-sncbi-wvdb \
+	-sxml2 \
+	-sm
+
+$(TEST_BINDIR)/vdb-2915-test: $(VDB_2915_OBJ)
+	$(LP) --exe -o $@ $^ $(VDB_2915_LIBS)
+
diff --git a/test/vxf/VDB-2915.cpp b/test/vxf/VDB-2915.cpp
new file mode 100644
index 0000000..fe4276a
--- /dev/null
+++ b/test/vxf/VDB-2915.cpp
@@ -0,0 +1,508 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <vdb/manager.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+#include <vdb/vdb-priv.h>
+
+#include <kfg/config.h>
+#include <vfs/manager.h>
+#include <vfs/manager-priv.h>
+
+#include <kdb/table.h>
+
+#include <ktst/unit_test.hpp>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <sstream>
+#include <cstdlib>
+#include <algorithm>
+#include <iterator>
+#include <sysalloc.h>
+
+using namespace std;
+
+TEST_SUITE( VDB_2915_TEST_SUITE );
+
+/* --------------------------------------------------------------------------
+There was a problem in the irzip, izip and fzip encoding :
+
+If the data was too random, the library was not able to load the data.
+
+The reason for that was a copy-paste error which has now been fixed.
+
+This test creates a temporary output-tabe, and tries to load random
+data into it. This has to succeed!
+--------------------------------------------------------------------------*/
+
+const string ScratchDir = "./";
+
+/*
+typedef union
+{
+  float f;
+  struct
+  {
+    unsigned int mantisa : 23;
+    unsigned int exponent : 8;
+    unsigned int sign : 1;
+  } parts;
+} double_cast;
+
+static float random_float( void )
+{
+    double_cast x;
+    x.parts.mantisa = rand() & 0x7FFFFF;
+    x.parts.exponent = rand() & 0xFF;
+    x.parts.sign = rand() & 0x1;
+    return x.f;
+}
+
+static void fill_random_float_buffer( float * buffer, size_t value_count )
+{
+    for ( size_t i = 0; i < value_count; ++i )
+        buffer[ i ] = random_float();
+}
+*/
+
+static int32_t rand_int32()
+{
+    int32_t res = rand();
+    if ( rand() & 1 ) res *= -1;
+    return res;
+}
+
+/*
+static int64_t rand_int64()
+{
+    int64_t res = rand();
+    res *= rand();
+    if ( rand() & 1 ) res *= -1;
+    return res;
+}
+
+static uint64_t rand_uint64()
+{
+    uint64_t res = rand();
+    res *= rand();
+    res &= 0x0FFFFFFFFFFFFFFF; // JOJOBA: kinda strange :)
+    // res &= 0x7FFFFFFFFFFFFFFF;
+    return res;
+}
+*/
+
+class WVDB_Fixture
+{
+    KDirectory * _wd;
+    KConfig * _cfg;
+public:
+    WVDB_Fixture() : _wd ( NULL ), _cfg ( NULL ), m_remove( false )
+        , m_tableName( "RANDOM_DATA" ), m_table( 0 ), m_cursor( 0 )
+    {
+        THROW_ON_RC( KDirectoryNativeDir( &_wd ) );
+        
+        const KDirectory * dir = NULL;
+        THROW_ON_RC
+            ( KDirectoryOpenDirRead ( _wd, &dir, false, "local_config" ) );
+        
+        THROW_ON_RC( KConfigMake ( &_cfg, dir ) );
+        
+        KConfigPrint( _cfg, 0 ); /* for test */
+
+        THROW_ON_RC( KDirectoryRelease( dir ) );
+    }
+    
+    ~WVDB_Fixture()
+    {
+        if ( m_cursor ) { VCursorRelease( m_cursor ); }
+        if ( m_table ) { VTableRelease( m_table ); }
+        if ( m_remove ) { RemoveTable(); }
+        KConfigRelease( _cfg );
+        KDirectoryRelease( _wd );        
+    }
+
+    void RemoveTable()
+    {
+        if ( ! m_tableName . empty () )
+        {
+            KDirectoryRemove( _wd, true, m_tableName.c_str() );
+        }
+    }
+
+    void MakeTable( const string& p_schemaText, const string& p_schemaSpec )
+    {
+        RemoveTable();
+
+        struct VFSManager * vfs_mgr;
+        THROW_ON_RC( VFSManagerMakeFromKfg ( &vfs_mgr, _cfg ) );
+        
+        VDBManager * mgr;
+        THROW_ON_RC
+            ( VDBManagerMakeUpdateWithVFSManager ( &mgr, _wd, vfs_mgr ) );
+        
+        VSchema *schema;
+        THROW_ON_RC( VDBManagerMakeSchema ( mgr, &schema ) );
+        THROW_ON_RC( VSchemaParseText( schema, NULL, p_schemaText.c_str(), p_schemaText.size() ) );
+        THROW_ON_RC( VDBManagerCreateTable( mgr,
+                                            &m_table,
+                                            schema,
+                                            p_schemaSpec.c_str(),
+                                            kcmInit + kcmMD5,
+                                            "%s",
+                                            m_tableName.c_str() ) );
+        THROW_ON_RC( VTableCreateCursorWrite( m_table, &m_cursor, kcmInsert ) );
+        THROW_ON_RC( VSchemaRelease( schema ) );
+        THROW_ON_RC( VDBManagerRelease( mgr ) );
+        THROW_ON_RC( VFSManagerRelease( vfs_mgr ) );
+    }
+
+    void OpenTable()
+    {
+        VDBManager * mgr;
+        THROW_ON_RC( VDBManagerMakeUpdate ( &mgr, NULL ) );
+        THROW_ON_RC( VDBManagerOpenTableRead( mgr,
+                                              ( const VTable ** )&m_table,
+                                              NULL,
+                                              "%s",
+                                              m_tableName.c_str() ) );
+        THROW_ON_RC( VTableCreateCursorRead( m_table, ( const VCursor ** )&m_cursor ) );
+        THROW_ON_RC( VDBManagerRelease( mgr ) );
+    }
+    
+    bool m_remove;
+    string m_tableName;
+    VTable * m_table;
+    VCursor * m_cursor;
+};
+
+/*
+        we have to exclude 64-bit tests, because the write-lib is broken for irzip
+        if feed with random data
+*/
+
+FIXTURE_TEST_CASE ( LOAD_RANDOM_DATA, WVDB_Fixture )
+{
+    RemoveTable();
+    
+    string schemaText = "version 1;"
+                        "include 'vdb/vdb.vschema';"
+                        "table A_TABLE #1.0"
+                        "{"
+                        "   column < U8 > izip_encoding CU1;"
+                        "   column U8 RU1;"
+                        "   column < U16 > izip_encoding CU2;"
+                        "   column U16 RU2;"
+                        "   column < U32 > izip_encoding CU3;"
+                        "   column U32 RU3;"
+                        "   column < U64 > izip_encoding CU4;"
+                        "   column U64 RU4;"
+                        
+                        "   column < I8 > izip_encoding CI1;"
+                        "   column I8 RI1;"                        
+                        "   column < I16 > izip_encoding CI2;"
+                        "   column I16 RI2;"
+                        "   column < I32 > izip_encoding CI3;"
+                        "   column I32 RI3;"
+                        "   column < I64 > izip_encoding CI4;"
+                        "   column I64 RI4;"
+                        "};";
+
+    REQUIRE_RC( KOutMsg( "creating table '%s'\n", m_tableName.c_str() ) );
+    
+    MakeTable ( schemaText, "A_TABLE" );
+    
+    uint32_t cu1, cu2, cu3 /*, cu4 */;
+    uint32_t ru1, ru2, ru3 /*, ru4 */;
+
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &cu1, "%s", "CU1" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &cu2, "%s", "CU2" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &cu3, "%s", "CU3" ) );
+    /* REQUIRE_RC ( VCursorAddColumn ( m_cursor, &cu4, "%s", "CU4" ) ); */
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ru1, "%s", "RU1" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ru2, "%s", "RU2" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ru3, "%s", "RU3" ) );
+    /* REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ru4, "%s", "RU4" ) ); */
+
+    uint32_t ci1, ci2, ci3 /*, ci4 */;
+    uint32_t ri1, ri2, ri3 /*, ri4 */;
+
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ci1, "%s", "CI1" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ci2, "%s", "CI2" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ci3, "%s", "CI3" ) );
+    /* REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ci4, "%s", "CI4" ) ); */
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ri1, "%s", "RI1" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ri2, "%s", "RI2" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ri3, "%s", "RI3" ) );
+    /* REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ri4, "%s", "RI4" ) ); */
+
+    REQUIRE_RC ( VCursorOpen ( m_cursor ) );
+
+    srand( 123456 );
+    
+    size_t i, j;
+    for ( i = 1; i <= 512; ++i )
+    {
+        REQUIRE_RC ( VCursorOpenRow ( m_cursor ) );
+        
+        {
+            uint8_t b[ 1024 ];
+            for ( j = 0; j < 1024; ++j ) b[ j ] = rand() & 0xFF;
+            REQUIRE_RC ( VCursorWrite ( m_cursor, cu1, 8, b, 0, 1024 ) );
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ru1, 8, b, 0, 1024 ) );
+        }
+        
+        {
+            int8_t b[ 1024 ];
+            for ( j = 0; j < 1024; ++j ) b[ j ] = rand() & 0xFF;
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ci1, 8, b, 0, 1024 ) );
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ri1, 8, b, 0, 1024 ) );
+        }
+
+        {
+            uint16_t b[ 1024 ];
+            for ( j = 0; j < 1024; ++j ) b[ j ] = rand() & 0xFFFF;
+            REQUIRE_RC ( VCursorWrite ( m_cursor, cu2, 16, b, 0, 1024 ) );
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ru2, 16, b, 0, 1024 ) );
+        }
+
+        {
+            int16_t b[ 1024 ];
+            for ( j = 0; j < 1024; ++j ) b[ j ] = rand() & 0xFFFF;
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ci2, 16, b, 0, 1024 ) );
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ri2, 16, b, 0, 1024 ) );
+        }
+
+        {
+            uint32_t b[ 1024 ];
+            for ( j = 0; j < 1024; ++j ) b[ j ] = rand();
+            REQUIRE_RC ( VCursorWrite ( m_cursor, cu3, 32, b, 0, 1024 ) );
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ru3, 32, b, 0, 1024 ) );
+        }
+        
+        {
+            int32_t b[ 1024 ];
+            for ( j = 0; j < 1024; ++j ) b[ j ] = rand_int32();
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ci3, 32, b, 0, 1024 ) );
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ri3, 32, b, 0, 1024 ) );
+        }
+
+        /*
+        {
+            uint64_t b[ 1024 ];
+            for ( j = 0; j < 1024; ++j ) b[ j ] = rand_uint64();
+            REQUIRE_RC ( VCursorWrite ( m_cursor, cu4, 64, b, 0, 1024 ) );
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ru4, 64, b, 0, 1024 ) );
+        }
+
+        {
+            int64_t b[ 1024 ];
+            for ( j = 0; j < 1024; ++j ) b[ j ] = rand_int64();
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ci4, 64, b, 0, 1024 ) );
+            REQUIRE_RC ( VCursorWrite ( m_cursor, ri4, 64, b, 0, 1024 ) );
+        }
+        */
+        
+        REQUIRE_RC ( VCursorCommitRow ( m_cursor ) );
+        REQUIRE_RC ( VCursorCloseRow ( m_cursor ) );
+    }
+    REQUIRE_RC ( VCursorCommit ( m_cursor ) );
+}
+
+FIXTURE_TEST_CASE ( CHECK_RANDOM_DATA, WVDB_Fixture )
+{
+    OpenTable();
+
+    REQUIRE_RC( KOutMsg( "verify table '%s'\n", m_tableName.c_str() ) );
+    
+    uint32_t cu1, cu2, cu3 /*, cu4 */;
+    uint32_t ru1, ru2, ru3 /*, ru4 */;
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &cu1, "%s", "CU1" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &cu2, "%s", "CU2" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &cu3, "%s", "CU3" ) );
+    /* REQUIRE_RC ( VCursorAddColumn ( m_cursor, &cu4, "%s", "CU4" ) ); */
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ru1, "%s", "RU1" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ru2, "%s", "RU2" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ru3, "%s", "RU3" ) );
+    /* REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ru4, "%s", "RU4" ) ); */
+
+    uint32_t ci1, ci2, ci3 /*, ci4 */;
+    uint32_t ri1, ri2, ri3 /*, ri4 */;
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ci1, "%s", "CI1" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ci2, "%s", "CI2" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ci3, "%s", "CI3" ) );
+    /* REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ci4, "%s", "CI4" ) ); */
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ri1, "%s", "RI1" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ri2, "%s", "RI2" ) );
+    REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ri3, "%s", "RI3" ) );
+    /* REQUIRE_RC ( VCursorAddColumn ( m_cursor, &ri4, "%s", "RI4" ) ); */
+
+    REQUIRE_RC ( VCursorOpen ( m_cursor ) );
+    
+    for ( int64_t i = 1; i <= 512; ++i )
+    {
+        uint32_t c_bits, r_bits, c_boff, r_boff, c_len, r_len;
+        {
+            uint8_t * c;
+            uint8_t * r;
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, cu1, &c_bits, ( const void** )&c, &c_boff, &c_len ) );
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ru1, &r_bits, ( const void** )&r, &r_boff, &r_len ) );
+            REQUIRE_EQ ( c_bits, ( uint32_t )8 );
+            REQUIRE_EQ ( r_bits, ( uint32_t )8 );
+            REQUIRE_EQ ( c_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( r_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( c_len, ( uint32_t )1024 );
+            REQUIRE_EQ ( r_len, ( uint32_t )1024 );
+            REQUIRE ( std::equal( c, c + 1024, r ) );
+        }
+
+        {
+            int8_t * c;
+            int8_t * r;
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ci1, &c_bits, ( const void** )&c, &c_boff, &c_len ) );
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ri1, &r_bits, ( const void** )&r, &r_boff, &r_len ) );
+            REQUIRE_EQ ( c_bits, ( uint32_t )8 );
+            REQUIRE_EQ ( r_bits, ( uint32_t )8 );
+            REQUIRE_EQ ( c_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( r_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( c_len, ( uint32_t )1024 );
+            REQUIRE_EQ ( r_len, ( uint32_t )1024 );
+            REQUIRE ( std::equal( c, c + 1024, r ) );
+        }
+        
+        {
+            uint16_t * c;
+            uint16_t * r;
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, cu2, &c_bits, ( const void** )&c, &c_boff, &c_len ) );
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ru2, &r_bits, ( const void** )&r, &r_boff, &r_len ) );
+            REQUIRE_EQ ( c_bits, ( uint32_t )16 );
+            REQUIRE_EQ ( r_bits, ( uint32_t )16 );
+            REQUIRE_EQ ( c_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( r_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( c_len, ( uint32_t )1024 );
+            REQUIRE_EQ ( r_len, ( uint32_t )1024 );
+            REQUIRE ( std::equal( c, c + 1024, r ) );
+        }
+        
+        {
+            int16_t * c;
+            int16_t * r;
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ci2, &c_bits, ( const void** )&c, &c_boff, &c_len ) );
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ri2, &r_bits, ( const void** )&r, &r_boff, &r_len ) );
+            REQUIRE_EQ ( c_bits, ( uint32_t )16 );
+            REQUIRE_EQ ( r_bits, ( uint32_t )16 );
+            REQUIRE_EQ ( c_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( r_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( c_len, ( uint32_t )1024 );
+            REQUIRE_EQ ( r_len, ( uint32_t )1024 );
+            REQUIRE ( std::equal( c, c + 1024, r ) );
+        }
+
+        {
+            uint32_t * c;
+            uint32_t * r;
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, cu3, &c_bits, ( const void** )&c, &c_boff, &c_len ) );
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ru3, &r_bits, ( const void** )&r, &r_boff, &r_len ) );
+            REQUIRE_EQ ( c_bits, ( uint32_t )32 );
+            REQUIRE_EQ ( r_bits, ( uint32_t )32 );
+            REQUIRE_EQ ( c_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( r_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( c_len, ( uint32_t )1024 );
+            REQUIRE_EQ ( r_len, ( uint32_t )1024 );
+            REQUIRE ( std::equal( c, c + 1024, r ) );
+        }
+
+        {
+            int32_t * c;
+            int32_t * r;
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ci3, &c_bits, ( const void** )&c, &c_boff, &c_len ) );
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ri3, &r_bits, ( const void** )&r, &r_boff, &r_len ) );
+            REQUIRE_EQ ( c_bits, ( uint32_t )32 );
+            REQUIRE_EQ ( r_bits, ( uint32_t )32 );
+            REQUIRE_EQ ( c_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( r_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( c_len, ( uint32_t )1024 );
+            REQUIRE_EQ ( r_len, ( uint32_t )1024 );
+            REQUIRE ( std::equal( c, c + 1024, r ) );
+        }
+
+        /*
+        {
+            uint64_t * c;
+            uint64_t * r;
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, cu4, &c_bits, ( const void** )&c, &c_boff, &c_len ) );
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ru4, &r_bits, ( const void** )&r, &r_boff, &r_len ) );
+            REQUIRE_EQ ( c_bits, ( uint32_t )64 );
+            REQUIRE_EQ ( r_bits, ( uint32_t )64 );
+            REQUIRE_EQ ( c_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( r_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( c_len, ( uint32_t )1024 );
+            REQUIRE_EQ ( r_len, ( uint32_t )1024 );
+            REQUIRE ( std::equal( c, c + 1024, r ) );
+        }
+
+        {
+            int64_t * c;
+            int64_t * r;
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ci4, &c_bits, ( const void** )&c, &c_boff, &c_len ) );
+            REQUIRE_RC ( VCursorCellDataDirect ( m_cursor, i, ri4, &r_bits, ( const void** )&r, &r_boff, &r_len ) );
+            REQUIRE_EQ ( c_bits, ( uint32_t )64 );
+            REQUIRE_EQ ( r_bits, ( uint32_t )64 );
+            REQUIRE_EQ ( c_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( r_boff, ( uint32_t )0 );
+            REQUIRE_EQ ( c_len, ( uint32_t )1024 );
+            REQUIRE_EQ ( r_len, ( uint32_t )1024 );
+            REQUIRE ( std::equal( c, c + 1024, r ) );
+        }
+        */
+    }
+    
+    m_remove = true;
+}
+
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void ) { return 0x1000000; }
+rc_t CC UsageSummary ( const char * progname ) { return 0; }
+rc_t CC Usage ( const Args * args ){ return 0; }
+
+const char UsageDefaultName[] = "vdb_2915_testwb-test-vxf";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc = VDB_2915_TEST_SUITE( argc, argv );
+    return rc;
+}
+
+}
diff --git a/test/vxf/local_config/local.kfg b/test/vxf/local_config/local.kfg
new file mode 100644
index 0000000..9c77995
--- /dev/null
+++ b/test/vxf/local_config/local.kfg
@@ -0,0 +1,2 @@
+/vdb/schema/paths="$(PWD)/../../interfaces"
+/repository/remote/main/CGI/resolver-cgi = "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi"
diff --git a/test/vxf/wb-irzip-impl.c b/test/vxf/wb-irzip-impl.c
new file mode 100644
index 0000000..4e834eb
--- /dev/null
+++ b/test/vxf/wb-irzip-impl.c
@@ -0,0 +1,88 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "wb-irzip-impl.h"
+
+/* this generates many pairs of encode/decode functions for different datatypes */
+#define iunzip_func_v0 test_iunzip_func_v0
+#define vdb_izip test_vdb_izip
+#define vdb_iunzip test_vdb_iunzip
+
+#include "../libs/vxf/irzip.c"
+
+#define STYPE uint64_t
+rc_t doEncode_u64(uint8_t dst[], size_t dsize, size_t *used, int64_t *Min, int64_t *Slope, uint8_t *series_count,uint8_t *planes, const STYPE Y[], unsigned N)
+{
+    return encode_u64(dst, dsize, used, Min, Slope, series_count, planes, Y, N);
+}
+rc_t doDecode_u64(STYPE Y[], unsigned N, int64_t* min, int64_t* slope, uint8_t series_count, uint8_t planes, const uint8_t src[], size_t ssize)
+{
+    return decode_u64(Y, N, min, slope, series_count, planes, src, ssize);
+}
+#undef STYPE 
+
+#define STYPE uint32_t
+rc_t doEncode_u32(uint8_t dst[], size_t dsize, size_t *used, int64_t *Min, int64_t *Slope, uint8_t *series_count,uint8_t *planes, const STYPE Y[], unsigned N)
+{
+    return encode_u32(dst, dsize, used, Min, Slope, series_count, planes, Y, N);
+}
+rc_t doDecode_u32(STYPE Y[], unsigned N, int64_t* min, int64_t* slope, uint8_t series_count, uint8_t planes, const uint8_t src[], size_t ssize)
+{
+    return decode_u32(Y, N, min, slope, series_count, planes, src, ssize);
+}
+#undef STYPE 
+
+#define STYPE int32_t
+rc_t doEncode_i32(uint8_t dst[], size_t dsize, size_t *used, int64_t *Min, int64_t *Slope, uint8_t *series_count,uint8_t *planes, const STYPE Y[], unsigned N)
+{
+    return encode_i32(dst, dsize, used, Min, Slope, series_count, planes, Y, N);
+}
+rc_t doDecode_i32(STYPE Y[], unsigned N, int64_t* min, int64_t* slope, uint8_t series_count, uint8_t planes, const uint8_t src[], size_t ssize)
+{
+    return decode_i32(Y, N, min, slope, series_count, planes, src, ssize);
+}
+#undef STYPE 
+
+#define STYPE int64_t
+rc_t doEncode_i64(uint8_t dst[], size_t dsize, size_t *used, int64_t *Min, int64_t *Slope, uint8_t *series_count,uint8_t *planes, const STYPE Y[], unsigned N)
+{
+    return encode_i64(dst, dsize, used, Min, Slope, series_count, planes, Y, N);
+}
+rc_t doDecode_i64(STYPE Y[], unsigned N, int64_t* min, int64_t* slope, uint8_t series_count, uint8_t planes, const uint8_t src[], size_t ssize)
+{
+    return decode_i64(Y, N, min, slope, series_count, planes, src, ssize);
+}
+#undef STYPE 
+
+rc_t CC iunzip_func_v0(
+                      void *Self,
+                      const VXformInfo *info,
+                      VBlobResult *dst,
+                      const VBlobData *src
+                      )
+{
+    return RC ( rcVDB, rcFunction, rcExecuting, rcInterface, rcUnsupported ); /* should not be hit in this test */
+}
diff --git a/test/vxf/wb-irzip-impl.h b/test/vxf/wb-irzip-impl.h
new file mode 100644
index 0000000..ca57297
--- /dev/null
+++ b/test/vxf/wb-irzip-impl.h
@@ -0,0 +1,56 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_irzip_impl_
+#define _h_irzip_impl_
+
+#include <klib/rc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* uint64 */
+rc_t doEncode_u64(uint8_t dst[], size_t dsize, size_t *used, int64_t *Min, int64_t *Slope, uint8_t *series_count,uint8_t *planes, const uint64_t Y[], unsigned N);
+rc_t doDecode_u64(uint64_t Y[], unsigned N, int64_t* min, int64_t* slope, uint8_t series_count, uint8_t planes, const uint8_t src[], size_t ssize);
+
+/* int64 */
+rc_t doEncode_i64(uint8_t dst[], size_t dsize, size_t *used, int64_t *Min, int64_t *Slope, uint8_t *series_count,uint8_t *planes, const int64_t Y[], unsigned N);
+rc_t doDecode_i64(int64_t Y[], unsigned N, int64_t* min, int64_t* slope, uint8_t series_count, uint8_t planes, const uint8_t src[], size_t ssize);
+
+/* uint32 */
+rc_t doEncode_u32(uint8_t dst[], size_t dsize, size_t *used, int64_t *Min, int64_t *Slope, uint8_t *series_count,uint8_t *planes, const uint32_t Y[], unsigned N);
+rc_t doDecode_u32(uint32_t  Y[], unsigned N, int64_t* min, int64_t* slope, uint8_t series_count, uint8_t planes, const uint8_t src[], size_t ssize);
+
+/* int32 */
+rc_t doEncode_i32(uint8_t dst[], size_t dsize, size_t *used, int64_t *Min, int64_t *Slope, uint8_t *series_count,uint8_t *planes, const int32_t Y[], unsigned N);
+rc_t doDecode_i32(int32_t  Y[], unsigned N, int64_t* min, int64_t* slope, uint8_t series_count, uint8_t planes, const uint8_t src[], size_t ssize);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/test/vxf/wb-test-vxf.cpp b/test/vxf/wb-test-vxf.cpp
new file mode 100644
index 0000000..6711998
--- /dev/null
+++ b/test/vxf/wb-test-vxf.cpp
@@ -0,0 +1,268 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <ktst/unit_test.hpp>
+
+TEST_SUITE(VxfTestSuite);
+
+#include "wb-irzip-impl.h"
+
+////////////////////////////////////////// IZIP encoding tests
+
+// test fixture for scanner tests
+class EncoderFixture
+{
+public:
+    EncoderFixture()
+    : dSize(BufSize), used(0), series_count(0), planes(0)
+    {
+        min[0] = min[1] = 0;
+        slope[0] = slope[1] = 0;
+    }
+
+    static const int BufSize = 102400;
+    uint8_t dst[BufSize];
+    size_t dSize;
+    size_t used;
+    int64_t min[2];
+    int64_t slope[2];
+    uint8_t series_count;
+    uint8_t planes;
+};
+
+#define ARR_SIZE(a) (sizeof(a) / sizeof(a[0]))
+
+#define REQUIRE_EQ_ARR(a, b, size)  \
+    for (size_t i=0; i < size; ++i) \
+    {                               \
+        REQUIRE_EQUAL(a[i], b[i]);  \
+    }
+
+// exposes an assert failure when encoding unsigned 64 bit integers (#VDB-539), case 1
+FIXTURE_TEST_CASE(IRZIP_u64_assert1, EncoderFixture)
+{
+    uint64_t y[]={
+        UINT64_C(353878216), 
+        UINT64_C(353878152), 
+        UINT64_C(353877873), 
+        UINT64_C(353877162), 
+        UINT64_C(353876785), 
+        UINT64_C(353875727), 
+        UINT64_C(353874605), 
+        UINT64_C(353873979), 
+        UINT64_C(353873604), 
+        UINT64_C(353872503)
+    };
+    uint64_t decoded[ARR_SIZE(y)];
+    REQUIRE_RC(doEncode_u64(dst, dSize, &used, min, slope, &series_count, &planes, y, ARR_SIZE(y)));
+    REQUIRE_RC(doDecode_u64(decoded, ARR_SIZE(y), min, slope, series_count, planes, dst, used));
+    REQUIRE_EQ_ARR(y, decoded, ARR_SIZE(y));
+}
+
+// exposes an assert failure when encoding unsigned 64 bit integers (#VDB-539), case 2
+FIXTURE_TEST_CASE(IRZIP_u64_assert2, EncoderFixture)
+{
+    uint64_t y[]={
+        UINT64_C(353878216), 
+        UINT64_C(353878152), 
+        UINT64_C(        0), 
+        UINT64_C(        0), 
+        UINT64_C(        0), 
+        UINT64_C(        0), 
+        UINT64_C(        0), 
+        UINT64_C(        0), 
+        UINT64_C(        0), 
+        UINT64_C(        0)
+    };
+    uint64_t decoded[ARR_SIZE(y)];
+    REQUIRE_RC(doEncode_u64(dst, dSize, &used, min, slope, &series_count, &planes, y, ARR_SIZE(y)));
+    REQUIRE_RC(doDecode_u64(decoded, ARR_SIZE(y), min, slope, series_count, planes, dst, used));
+    REQUIRE_EQ_ARR(y, decoded, ARR_SIZE(y));
+}
+
+// tries to expose the same assert failure as above (#VDB-539), using 32 bit integers (#VDB-539), case 1
+FIXTURE_TEST_CASE(IRZIP_u32_assert1, EncoderFixture)
+{
+    uint32_t y[]={
+        78216, 
+        78152, 
+        77873, 
+        77162, 
+        76785, 
+        75727, 
+        74605, 
+        73979, 
+        73604, 
+        72503
+    };
+    uint32_t decoded[ARR_SIZE(y)];
+    REQUIRE_RC(doEncode_u32(dst, dSize, &used, min, slope, &series_count, &planes, y, ARR_SIZE(y)));
+    REQUIRE_RC(doDecode_u32(decoded, ARR_SIZE(y), min, slope, series_count, planes, dst, used));
+    REQUIRE_EQ_ARR(y, decoded, ARR_SIZE(y));
+}
+
+// tries to expose the same assert failure as above (#VDB-539), using 32 bit integers (#VDB-539), case 2
+FIXTURE_TEST_CASE(IRZIP_u32_assert2, EncoderFixture)
+{
+    uint32_t y[]={
+        78216, 
+        78152, 
+        0, 
+        0, 
+        0, 
+        0, 
+        0, 
+        0, 
+        0, 
+        0
+    };
+    uint32_t decoded[ARR_SIZE(y)];
+    REQUIRE_RC(doEncode_u32(dst, dSize, &used, min, slope, &series_count, &planes, y, ARR_SIZE(y)));
+    REQUIRE_RC(doDecode_u32(decoded, ARR_SIZE(y), min, slope, series_count, planes, dst, used));
+    REQUIRE_EQ_ARR(y, decoded, ARR_SIZE(y));
+}
+
+// exposes an assert failure when encoding unsigned 64 bit integers, case 3
+FIXTURE_TEST_CASE(IRZIP_u64_assert3, EncoderFixture)
+{
+    uint64_t y[]={
+        UINT64_C( 388750),
+        UINT64_C( 490295),
+        UINT64_C( 813277),
+        UINT64_C( 725540),
+        UINT64_C(  85294),
+        UINT64_C( 178363),
+        UINT64_C(1607062),
+        UINT64_C( 825545),
+        UINT64_C( 474451),
+        UINT64_C( 745337),
+    };
+    uint64_t decoded[ARR_SIZE(y)];
+    REQUIRE_RC(doEncode_u64(dst, dSize, &used, min, slope, &series_count, &planes, y, ARR_SIZE(y)));
+    REQUIRE_RC(doDecode_u64(decoded, ARR_SIZE(y), min, slope, series_count, planes, dst, used));
+    REQUIRE_EQ_ARR(y, decoded, ARR_SIZE(y));
+}
+
+// exposes an assert failure when encoding unsigned 64 bit integers, case 4
+FIXTURE_TEST_CASE(IRZIP_u64_assert4, EncoderFixture)
+{
+    uint64_t y[]={
+        UINT64_C(    2800167),
+        UINT64_C(47247557592),
+        UINT64_C(64427423880),
+        UINT64_C(30067744899),
+        UINT64_C(64427423881),
+        UINT64_C(21477638667),
+        UINT64_C( 8592622326),
+        UINT64_C(12887443839),
+        UINT64_C( 8592622323),
+        UINT64_C(12887443837),
+        UINT64_C(     773768),
+        UINT64_C(60132272802),
+        UINT64_C(25772592326),
+        UINT64_C( 4297746473),
+        UINT64_C(21477638660),
+    };
+    uint64_t decoded[ARR_SIZE(y)];
+    REQUIRE_RC(doEncode_u64(dst, dSize, &used, min, slope, &series_count, &planes, y, ARR_SIZE(y)));
+    REQUIRE_RC(doDecode_u64(decoded, ARR_SIZE(y), min, slope, series_count, planes, dst, used));
+    REQUIRE_EQ_ARR(y, decoded, ARR_SIZE(y));
+}
+
+
+// encoding/decoding of signed 64 bit integers
+FIXTURE_TEST_CASE(IRZIP_i64_assert1, EncoderFixture)
+{
+    int64_t y[]={
+        INT64_C( 353878216), 
+        INT64_C(-353878152), 
+        INT64_C( 353877873), 
+        INT64_C(-353877162), 
+        INT64_C(-353876785), 
+        INT64_C( 353875727), 
+        INT64_C(-353874605), 
+        INT64_C( 353873979), 
+        INT64_C(-353873604), 
+        INT64_C( 353872503)
+    };
+    int64_t decoded[ARR_SIZE(y)];
+    REQUIRE_RC(doEncode_i64(dst, dSize, &used, min, slope, &series_count, &planes, y, ARR_SIZE(y)));
+    REQUIRE_RC(doDecode_i64(decoded, ARR_SIZE(y), min, slope, series_count, planes, dst, used));
+    REQUIRE_EQ_ARR(y, decoded, ARR_SIZE(y));
+}
+
+// encoding/decoding of signed 32 bit integers
+FIXTURE_TEST_CASE(IRZIP_i32_assert1, EncoderFixture)
+{
+    int32_t y[]={
+        78216, 
+        78152, 
+        -77873, 
+        -77162, 
+        -76785, 
+        75727, 
+        74605, 
+        -73979, 
+        -73604, 
+        72503
+    };
+    int32_t decoded[ARR_SIZE(y)];
+    REQUIRE_RC(doEncode_i32(dst, dSize, &used, min, slope, &series_count, &planes, y, ARR_SIZE(y)));
+    REQUIRE_RC(doDecode_i32(decoded, ARR_SIZE(y), min, slope, series_count, planes, dst, used));
+    REQUIRE_EQ_ARR(y, decoded, ARR_SIZE(y));
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+    return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+    return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+    return 0;
+}
+
+const char UsageDefaultName[] = "wb-test-vxf";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+    KConfigDisableUserSettings();
+    rc_t rc=VxfTestSuite(argc, argv);
+    return rc;
+}
+
+}
diff --git a/vdb3/itf/kfc/array.hpp b/vdb3/itf/kfc/array.hpp
new file mode 100644
index 0000000..6c14354
--- /dev/null
+++ b/vdb3/itf/kfc/array.hpp
@@ -0,0 +1,127 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_array_
+#define _hpp_vdb3_kfc_array_
+
+#ifndef _hpp_vdb3_kfc_memory_
+#include <kfc/memory.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_except_
+#include <kfc/except.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+
+
+    /*------------------------------------------------------------------
+     * OpaqueArray
+     *  represents a container addressable by ordinal
+     */
+    class OpaqueArray
+    {
+    public:
+
+        // the number of elements actively stored
+        count_t length () const;
+
+    protected:
+
+        // the storage capacity
+        bytes_t size () const;
+
+        // implement read or r/w access to object
+        void * access ( index_t offset, const bytes_t & elem_size );
+        const void * access ( index_t offset, const bytes_t & elem_size ) const;
+
+        // assignment
+        void assign ( const OpaqueArray & r );
+
+        // C++
+        OpaqueArray ();
+        OpaqueArray ( const OpaqueArray & r );
+        OpaqueArray ( const OpaqueArray & r, caps_t reduce );
+        ~ OpaqueArray ();
+
+        // factory
+        OpaqueArray ( Mem & m, const bytes_t & elem_size );
+        OpaqueArray ( const Mem & m, const bytes_t & elem_size );
+
+    private:
+
+        Mem m;
+        count_t cnt;
+    };
+
+
+
+    /*------------------------------------------------------------------
+     * Array < T >
+     *  represents a container addressable by ordinal index
+     */
+    template < class T >
+    class Array : public OpaqueArray
+    {
+    public:
+
+        // element size
+        bytes_t elem_size () const
+        { return bytes_t (  sizeof ( T ) ); }
+
+        // array capacity
+        count_t capacity () const
+        { return OpaqueArray :: size () / sizeof ( T ); }
+
+        // access
+        T & operator [] ( index_t idx )
+        { return * ( T * ) access ( idx * sizeof ( T ), sizeof ( T ) ); }
+        const T & operator [] ( index_t idx ) const
+        { return * ( const T * ) access ( idx * sizeof ( T ), sizeof ( T ) ); }
+
+        // C++
+        Array () {}
+        Array ( const Array < T > & a )
+            : OpaqueArray ( a ) {}
+        void operator = ( const Array < T > & a )
+            { OpaqueArray :: assign ( a ); }
+        Array ( const Array < T > & a, caps_t reduce )
+            : OpaqueArray ( a, reduce ) {}
+
+        // creation from a memory block
+        Array ( Mem & m )
+            : OpaqueArray ( m, sizeof ( T ) ) {}
+        Array ( const Mem & m )
+            : OpaqueArray ( m, sizeof ( T ) ) {}
+    };
+}
+
+#endif // _hpp_vdb3_kfc_array_
diff --git a/vdb3/itf/kfc/atomic-ia32.hpp b/vdb3/itf/kfc/atomic-ia32.hpp
new file mode 100644
index 0000000..88b54e2
--- /dev/null
+++ b/vdb3/itf/kfc/atomic-ia32.hpp
@@ -0,0 +1,500 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_atomic_ia32_
+#define _hpp_vdb3_kfc_atomic_ia32_
+
+#ifndef _hpp_vdb3_kfc_atomic_
+#error "do not include this file directly"
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * atomic_t < I32 >
+     * atomic_t < U32 >
+     *  universal to all Intel/AMD architectures
+     *  particular to either 32-bit ( inc and dec )
+     *  or to sign ( compared read_and_add )
+     */
+
+    /* inc
+     *  requires "incl" rather than "incq"
+     */
+    template <> inline
+    void atomic_t < I32 > :: inc ()
+    {
+        __asm__ __volatile__
+        (
+        "lock;"
+            "incl %0"
+            : "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+    }
+
+    template <> inline
+    void atomic_t < U32 > :: inc ()
+    {
+        __asm__ __volatile__
+        (
+        "lock;"
+            "incl %0"
+            : "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+    }
+
+    /* dec
+     *  requires "decl" rather than "decq"
+     */
+    template <> inline
+    void atomic_t < I32 > :: dec ()
+    {
+        __asm__ __volatile__
+        (
+        "lock;"
+            "decl %0"
+            : "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+    }
+
+    template <> inline
+    void atomic_t < U32 > :: dec ()
+    {
+        __asm__ __volatile__
+        (
+        "lock;"
+            "decl %0"
+            : "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+    }
+
+    /* inc_and_test
+     *  "incl" vs "incq"
+     */
+    template <> inline
+    bool atomic_t < I32 > :: inc_and_test ()
+    {
+        bool rtn;
+        __asm__ __volatile__
+        (
+        "lock;"
+            "incl %1;"
+            "sete %0"
+            : "=r" ( rtn ), "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+        return rtn;
+    }
+
+    template <> inline
+    bool atomic_t < U32 > :: inc_and_test ()
+    {
+        bool rtn;
+        __asm__ __volatile__
+        (
+        "lock;"
+            "incl %1;"
+            "sete %0"
+            : "=r" ( rtn ), "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+        return rtn;
+    }
+
+    /* dec_and_test
+     *  "decl" vs "decq"
+     */
+    template <> inline
+    bool atomic_t < I32 > :: dec_and_test ()
+    {
+        bool rtn;
+        __asm__ __volatile__
+        (
+        "lock;"
+            "decl %1;"
+            "sete %0"
+            : "=r" ( rtn ), "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+        return rtn;
+    }
+
+    template <> inline
+    bool atomic_t < U32 > :: dec_and_test ()
+    {
+        bool rtn;
+        __asm__ __volatile__
+        (
+        "lock;"
+            "decl %1;"
+            "sete %0"
+            : "=r" ( rtn ), "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+        return rtn;
+    }
+
+    /* read_and_add_cc
+     *  these are universal for size,
+     *  but need differentiation based upon sign
+     *  since sign cannot be specified apart from size,
+     *  generate 2 specializations of each
+     */
+    template <> inline
+    I32 atomic_t < I32 > :: read_and_add_lt ( I32 cmp, I32 val )
+    {
+        I32 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jge 2f;"           // skip if rtn >= cmp signed
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    U32 atomic_t < U32 > :: read_and_add_lt ( U32 cmp, U32 val )
+    {
+        U32 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jae 2f;"           // skip if rtn >= cmp unsigned
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    I32 atomic_t < I32 > :: read_and_add_le ( I32 cmp, I32 val )
+    {
+        I32 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jg 2f;"            // skip if rtn > cmp signed
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    U32 atomic_t < U32 > :: read_and_add_le ( U32 cmp, U32 val )
+    {
+        U32 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "ja 2f;"            // skip if rtn > cmp unsigned
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    I32 atomic_t < I32 > :: read_and_add_ge ( I32 cmp, I32 val )
+    {
+        I32 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jl 2f;"            // skip if rtn < cmp signed
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    U32 atomic_t < U32 > :: read_and_add_ge ( U32 cmp, U32 val )
+    {
+        U32 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jb 2f;"            // skip if rtn < cmp unsigned
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    I32 atomic_t < I32 > :: read_and_add_gt ( I32 cmp, I32 val )
+    {
+        I32 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jle 2f;"           // skip if rtn <= cmp signed
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    U32 atomic_t < U32 > :: read_and_add_gt ( U32 cmp, U32 val )
+    {
+        U32 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jbe 2f;"           // skip if rtn <= cmp unsigned
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    /*------------------------------------------------------------------
+     * atomic_t < T >
+     *  universal to all Intel/AMD architectures
+     */
+
+    template < class T > inline
+    T atomic_t < T > :: read () const
+    {
+        // on Intel/AMD, the read is already atomic
+        return counter;
+    }
+
+    template < class T > inline
+    void atomic_t < T > :: set ( T val )
+    {
+        // on Intel/AMD, the write here is already atomic
+        counter = val;
+    }
+
+    template < class T > inline
+    T atomic_t < T > :: read_and_add ( T val )
+    {
+        T rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "mov %3, %1;"
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template < class T > inline
+    T atomic_t < T > :: add_and_read ( T val )
+    {
+        T rtn, cmp;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "mov %3, %1;"
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b"
+            : "=&a" ( cmp ), "=&r" ( rtn )
+            : "r" ( & this -> counter ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template < class T > inline
+    void atomic_t < T > :: add ( T val )
+    {
+        // Intel/AMD architecture favors read_and_add
+        // because of the way cmpxchg works
+        read_and_add ( val );
+    }
+
+    template < class T > inline
+    bool atomic_t < T > :: test_and_inc ()
+    {
+        // Intel/AMD architecture does not do pretest and inc
+        // but it does do pre-read and add
+        return read_and_add ( 1 ) == 0;
+    }
+
+
+    template < class T > inline
+    T atomic_t < T > :: test_and_set ( T cmp, T val )
+    {
+        T rtn;
+        __asm__ __volatile__
+        (
+        "lock;"
+            "cmpxchg %3, (%1)"
+            : "=a" ( rtn )
+            : "r" ( & this -> counter ), "a" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template < class T > inline
+    T atomic_t < T > :: read_and_add_eq ( T cmp, T val )
+    {
+        T rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"
+            "mov %4, %1;"
+            "jne 2f;"
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template < class T > inline
+    T atomic_t < T > :: read_and_add_ne ( T cmp, T val )
+    {
+        T rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"
+            "mov %4, %1;"
+            "je 2f;"
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template < class T > inline
+    atomic_t < T > :: atomic_t ( const atomic_t < T > & a )
+        : counter ( a . read () )
+    {
+    }
+
+    template < class T > inline
+    void atomic_t < T > :: operator = ( const atomic_t < T > & a )
+    {
+        set ( a . read () );
+    }
+}
+
+#endif // _hpp_vdb3_kfc_atomic_ia32_
diff --git a/vdb3/itf/kfc/atomic-x86_64.hpp b/vdb3/itf/kfc/atomic-x86_64.hpp
new file mode 100644
index 0000000..72f7d40
--- /dev/null
+++ b/vdb3/itf/kfc/atomic-x86_64.hpp
@@ -0,0 +1,356 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_atomic_x86_64_
+#define _hpp_vdb3_kfc_atomic_x86_64_
+
+#ifndef _hpp_vdb3_kfc_atomic_
+#error "do not include this file directly"
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * atomic_t < I64 >
+     * atomic_t < U64 >
+     *  universal to all Intel/AMD architectures
+     *  particular to either 64-bit ( inc and dec )
+     *  or to sign ( compared read_and_add )
+     */
+
+    /* inc
+     *  requires "incq" rather than "incl"
+     */
+    template <> inline
+    void atomic_t < I64 > :: inc ()
+    {
+        __asm__ __volatile__
+        (
+        "lock;"
+            "incq %0"
+            : "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+    }
+
+    template <> inline
+    void atomic_t < U64 > :: inc ()
+    {
+        __asm__ __volatile__
+        (
+        "lock;"
+            "incq %0"
+            : "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+    }
+
+    /* dec
+     *  requires "decq" rather than "decl"
+     */
+    template <> inline
+    void atomic_t < I64 > :: dec ()
+    {
+        __asm__ __volatile__
+        (
+        "lock;"
+            "decq %0"
+            : "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+    }
+
+    template <> inline
+    void atomic_t < U64 > :: dec ()
+    {
+        __asm__ __volatile__
+        (
+        "lock;"
+            "decq %0"
+            : "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+    }
+
+    /* inc_and_test
+     *  "incq" vs "incl"
+     */
+    template <> inline
+    bool atomic_t < I64 > :: inc_and_test ()
+    {
+        bool rtn;
+        __asm__ __volatile__
+        (
+        "lock;"
+            "incq %1;"
+            "sete %0"
+            : "=r" ( rtn ), "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+        return rtn;
+    }
+
+    template <> inline
+    bool atomic_t < U64 > :: inc_and_test ()
+    {
+        bool rtn;
+        __asm__ __volatile__
+        (
+        "lock;"
+            "incq %1;"
+            "sete %0"
+            : "=r" ( rtn ), "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+        return rtn;
+    }
+
+    /* dec_and_test
+     *  "decq" vs "decl"
+     */
+    template <> inline
+    bool atomic_t < I64 > :: dec_and_test ()
+    {
+        bool rtn;
+        __asm__ __volatile__
+        (
+        "lock;"
+            "decq %1;"
+            "sete %0"
+            : "=r" ( rtn ), "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+        return rtn;
+    }
+
+    template <> inline
+    bool atomic_t < U64 > :: dec_and_test ()
+    {
+        bool rtn;
+        __asm__ __volatile__
+        (
+        "lock;"
+            "decq %1;"
+            "sete %0"
+            : "=r" ( rtn ), "=m" ( this -> counter )
+            : "m" ( this -> counter )
+
+        );
+        return rtn;
+    }
+
+    /* read_and_add_cc
+     *  these are universal for size,
+     *  but need differentiation based upon sign
+     *  since sign cannot be specified apart from size,
+     *  generate 2 specializations of each
+     */
+    template <> inline
+    I64 atomic_t < I64 > :: read_and_add_lt ( I64 cmp, I64 val )
+    {
+        I64 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jge 2f;"           // skip if rtn >= cmp signed
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    U64 atomic_t < U64 > :: read_and_add_lt ( U64 cmp, U64 val )
+    {
+        U64 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jnc 2f;"           // skip if rtn >= cmp unsigned
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    I64 atomic_t < I64 > :: read_and_add_le ( I64 cmp, I64 val )
+    {
+        I64 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jg 2f;"            // skip if rtn > cmp signed
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    U64 atomic_t < U64 > :: read_and_add_le ( U64 cmp, U64 val )
+    {
+        U64 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %0, %3;"       // cmp - rtn ( NB! )
+            "mov %4, %1;"
+            "jc 2f;"            // skip if cmp < rtn unsigned
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    I64 atomic_t < I64 > :: read_and_add_ge ( I64 cmp, I64 val )
+    {
+        I64 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jl 2f;"            // skip if rtn < cmp signed
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    U64 atomic_t < U64 > :: read_and_add_ge ( U64 cmp, U64 val )
+    {
+        U64 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jc 2f;"            // skip if rtn < cmp unsigned
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    I64 atomic_t < I64 > :: read_and_add_gt ( I64 cmp, I64 val )
+    {
+        I64 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %3, %0;"       // rtn - cmp
+            "mov %4, %1;"
+            "jle 2f;"           // skip if rtn <= cmp signed
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+
+    template <> inline
+    U64 atomic_t < U64 > :: read_and_add_gt ( U64 cmp, U64 val )
+    {
+        U64 rtn, sum;
+        __asm__ __volatile__
+        (
+            "mov (%2), %0;"
+        "1:"
+            "cmp %0, %3;"       // cmp - rtn ( NB! )
+            "mov %4, %1;"
+            "jnc 2f;"           // skip if cmp >= rtn unsigned
+            "add %0, %1;"
+        "lock;"
+            "cmpxchg %1, (%2);"
+            "jne 1b;"
+        "2:"
+            : "=&a" ( rtn ), "=&r" ( sum )
+            : "r" ( & this -> counter ), "r" ( cmp ), "r" ( val )
+        );
+        return rtn;
+    }
+}
+
+#endif // _hpp_vdb3_kfc_atomic_x86_64_
diff --git a/vdb3/itf/kfc/atomic.hpp b/vdb3/itf/kfc/atomic.hpp
new file mode 100644
index 0000000..76d7ee2
--- /dev/null
+++ b/vdb3/itf/kfc/atomic.hpp
@@ -0,0 +1,133 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_atomic_
+#define _hpp_vdb3_kfc_atomic_
+
+#ifndef _hpp_vdb3_kfc_defs_
+#include <kfc/defs.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * atomic_t < T >
+     *  an atomicly accessed/modified integer
+     */
+    template < class T >
+    class atomic_t
+    {
+    public:
+
+        // return counter;
+        T read () const;
+        // counter = val;
+        void set ( T val );
+
+        // counter += 1;
+        void inc ();
+        // counter -= 1;
+        void dec ();
+        // return ++ counter == 0;
+        bool inc_and_test ();
+        // return -- counter == 0;
+        bool dec_and_test ();
+        // return counter ++ = 0;
+        bool test_and_inc ();
+
+        // ret = counter; if ( counter == cmp ) counter = val; return ret;
+        T test_and_set ( T cmp, T val );
+
+        // counter += val;
+        void add ( T val );
+        // ret = counter; counter += val; return ret;
+        T read_and_add ( T val );
+        // return counter += val;
+        T add_and_read ( T val );
+
+        // ret = counter; if ( counter < cmp ) counter =+ val; return ret;
+        T read_and_add_lt ( T cmp, T val );
+        // ret = counter; if ( counter <= cmp ) counter = val; return ret;
+        T read_and_add_le ( T cmp, T val );
+        // ret = counter; if ( counter == cmp ) counter = val; return ret;
+        T read_and_add_eq ( T cmp, T val );
+        // ret = counter; if ( counter != cmp ) counter = val; return ret;
+        T read_and_add_ne ( T cmp, T val );
+        // ret = counter; if ( counter >= cmp ) counter = val; return ret;
+        T read_and_add_ge ( T cmp, T val );
+        // ret = counter; if ( counter > cmp ) counter = val; return ret;
+        T read_and_add_gt ( T cmp, T val );
+
+        // subtraction versions
+        inline void sub ( T val ) { add ( - val ); }
+        inline T read_and_sub ( T val )
+        { return read_and_add ( - val ); }
+        inline T sub_and_read ( T val )
+        { return add_and_read ( - val ); }
+        inline T read_and_sub_lt ( T cmp, T val )
+        { return read_and_add_lt ( cmp, - val ); }
+        inline T read_and_sub_le ( T cmp, T val )
+        { return read_and_add_le ( cmp, - val ); }
+        inline T read_and_sub_eq ( T cmp, T val )
+        { return read_and_add_eq ( cmp, - val ); }
+        inline T read_and_sub_ne ( T cmp, T val )
+        { return read_and_add_ne ( cmp, - val ); }
+        inline T read_and_sub_ge ( T cmp, T val )
+        { return read_and_add_ge ( cmp, - val ); }
+        inline T read_and_sub_gt ( T cmp, T val )
+        { return read_and_add_gt ( cmp, - val ); }
+
+        // C++ operator overloads
+        inline void operator ++ () { inc (); }
+        inline void operator -- () { dec (); }
+        inline void operator = ( T val ) { set ( val ); }
+        inline void operator += ( T val ) { add ( val ); }
+        inline void operator -= ( T val ) { add ( - val ); }
+        inline operator T () const { return read (); }
+
+        atomic_t ( T val )
+            : counter ( val ) {}
+
+        atomic_t ( const atomic_t < T > & a );
+        void operator = ( const atomic_t < T > & a );
+
+    private:
+
+        volatile T counter;
+    };
+}
+
+#if defined x86_64
+#include <kfc/atomic-x86_64.hpp>
+#include <kfc/atomic-ia32.hpp>
+#elif defined i686 || defined i386
+#include <kfc/atomic-ia32.hpp>
+#else
+#error "no implementation exists for the target architecture"
+#endif
+
+#endif // _hpp_vdb3_kfc_atomic_
diff --git a/vdb3/itf/kfc/callstk.hpp b/vdb3/itf/kfc/callstk.hpp
new file mode 100644
index 0000000..a5d395c
--- /dev/null
+++ b/vdb3/itf/kfc/callstk.hpp
@@ -0,0 +1,117 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_callstk_
+#define _hpp_vdb3_kfc_callstk_
+
+#ifndef _hpp_vdb3_kfc_defs_
+#include <kfc/defs.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards and externs
+     */
+
+    class CallStk;
+    extern __thread CallStk const * callstk;
+
+
+    /*------------------------------------------------------------------
+     * SrcLoc
+     *  a structure to identify source file
+     */
+    struct SrcLoc
+    {
+        const char * mod;
+        const char * file;
+        const char * ext;
+    };
+
+    // an automatic mechanism for
+    // creating a single static object per source
+#ifndef SRC_LOC_DEFINED
+#define SRC_LOC_DEFINED
+    static SrcLoc s_src_loc = { __mod__, __file__, __fext__ };
+#endif
+
+
+    /*------------------------------------------------------------------
+     * CallStk
+     *  identifies location of current frame
+     *  chained to caller
+     */
+    class CallStk
+    {
+    public:
+
+        // when caller == 0, represents top frame of stack
+        const CallStk * caller;
+
+        // stack depth
+        // declared "volatile" to keep optimizer from pruning
+        count_t depth;
+
+        // function location
+        const SrcLoc & src;
+        const char volatile * func;
+
+        // stacking constructor/destructor
+        CallStk ( const SrcLoc & sloc, const char * fname )
+            : caller ( callstk )
+            , depth ( callstk -> depth + 1 )
+            , src ( sloc )
+            , func ( fname )
+        {
+            callstk = this;
+        }
+
+        ~ CallStk ()
+        {
+            callstk = caller;
+        }
+
+
+    protected:
+
+        // special per-thread constructor
+        CallStk ( const SrcLoc & sloc );
+
+    };
+
+
+    /*------------------------------------------------------------------
+     * FUNC_ENTRY
+     *  macro to create stack frame linked with caller
+     *  uses GCC __PRETTY_FUNCTION__ to produce function signature
+     */
+#define FUNC_ENTRY()                                                                  \
+    vdb3 :: CallStk local_stack_frame ( vdb3 :: s_src_loc, __PRETTY_FUNCTION__ )
+}
+
+#endif // _hpp_vdb3_kfc_callstk_
diff --git a/vdb3/itf/kfc/caps.hpp b/vdb3/itf/kfc/caps.hpp
new file mode 100644
index 0000000..e0d168b
--- /dev/null
+++ b/vdb3/itf/kfc/caps.hpp
@@ -0,0 +1,59 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_caps_
+#define _hpp_vdb3_kfc_caps_
+
+#ifndef _hpp_vdb3_kfc_defs_
+#include <kfc/defs.hpp>
+#endif
+
+namespace vdb3
+{
+    // access object data
+    const caps_t CAP_READ           = ( 1 <<  0 );
+    const caps_t CAP_WRITE          = ( 1 <<  1 );
+    const caps_t CAP_RDWR           = CAP_READ | CAP_WRITE;
+
+    // access a property
+    const caps_t CAP_PROP_READ      = ( 1 <<  2 );
+    const caps_t CAP_PROP_WRITE     = ( 1 <<  3 );
+    const caps_t CAP_PROP_RDWR      = CAP_PROP_READ | CAP_PROP_WRITE;
+
+    // resize memory
+    const caps_t CAP_RESIZE         = ( 1 <<  4 );
+
+    // subrange memory
+    const caps_t CAP_SUBRANGE       = ( 1 <<  5 );
+
+    // specific rights
+    const caps_t CAP_CAST           = ( 1 <<  6 );
+    const caps_t CAP_ALLOC          = ( 1 <<  7 );
+    const caps_t CAP_EXECUTE        = ( 1 <<  8 );
+    const caps_t CAP_SUSPEND        = ( 1 <<  9 );
+}
+
+#endif // _hpp_vdb3_kfc_caps_
diff --git a/vdb3/itf/kfc/defs.hpp b/vdb3/itf/kfc/defs.hpp
new file mode 100644
index 0000000..2ce995b
--- /dev/null
+++ b/vdb3/itf/kfc/defs.hpp
@@ -0,0 +1,113 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_defs_
+#define _hpp_vdb3_kfc_defs_
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include <assert.h>
+
+namespace vdb3
+{
+
+    // raw integer number types
+    typedef int8_t I8;
+    typedef int16_t I16;
+    typedef int32_t I32;
+    typedef int64_t I64;
+
+    // raw natural number types
+    typedef uint8_t U8;
+    typedef uint16_t U16;
+    typedef uint32_t U32;
+    typedef uint64_t U64;
+
+    // raw real number types
+    typedef float F32;
+    typedef double F64;
+
+    // raw character types
+    typedef char ascii, UTF8;
+    typedef U32 UTF32;
+
+    // raw capabilities
+    typedef U64 caps_t;
+    typedef U64 rcaps_t;
+
+    // an item count
+    typedef U64 count_t;
+
+    // an ordinal index
+    typedef I64 index_t;
+
+    // size of an item in bits
+    class bitsz_t;
+
+    // size of an item in bytes
+    class bytes_t;
+
+    // a timeout
+    class timeout_t;
+
+    // a data type
+    class type_t;
+
+    // a multi-part version number
+    class vers_t;
+
+    // even though I generally hate this kind of thing,
+    // it will make some portions of the code more readable
+    // look for interface declarations and implementations
+#undef interface
+#define interface struct
+#undef implements
+#define implements public
+}
+
+// turn the value of a pp-symbol into a string
+#define stringize( tok ) tok_to_string ( tok )
+#define tok_to_string( tok ) # tok
+
+// generate string values for SrcLoc
+#if ! defined __mod__ && defined __mod_path__
+#define __mod__ stringize ( __mod_path__ )
+#endif
+
+#if ! defined __file__ && defined __file_name__
+#define __file__ stringize ( __file_name__ )
+#endif
+
+#if ! defined __fext__ && defined __file_ext__
+#define __fext__ stringize ( __file_ext__ )
+#endif
+
+#ifndef _hpp_vdb3_kfc_integer_
+#include "integer.hpp"
+#endif
+
+#endif // _hpp_vdb3_kfc_defs_
diff --git a/vdb3/itf/kfc/except.hpp b/vdb3/itf/kfc/except.hpp
new file mode 100644
index 0000000..d43d54b
--- /dev/null
+++ b/vdb3/itf/kfc/except.hpp
@@ -0,0 +1,174 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_except_
+#define _hpp_vdb3_kfc_except_
+
+#ifndef _hpp_vdb3_kfc_defs_
+#include <kfc/defs.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_string_
+#include <kfc/string.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * exception
+     *  captures the type of exception and a description
+     */
+    class exception
+    {
+    public:
+
+#ifndef _hpp_vdb3_kfc_string_
+        const char * what () const
+        { return msg; }
+#else
+        // report basically what went wrong into a string
+        const String & what () const
+        { return msg; }
+
+        // report where the exception occurred
+        // assembles module, file, line and function
+        String where () const;
+
+        // report entire stack trace
+        String stack_trace () const;
+
+        // return the constant module name
+        String module () const;
+
+        // return the constant file name
+        String file () const;
+
+        // return the constant file extension
+        String ext () const;
+
+        // return the constant function name
+        String func () const;
+#endif
+
+        // return the line number where exception was thrown
+        U32 line () const
+        { return lineno; }
+
+        // public destructor
+        ~ exception ();
+
+    protected:
+
+#ifdef _hpp_vdb3_kfc_string_
+        exception ( U32 lineno, const String & msg );
+#else
+        exception ( U32 lineno, const char * msg );
+#endif
+
+#ifdef _hpp_vdb3_kfc_string_
+        String msg;
+#else
+        const char * msg;
+#endif
+#ifdef _hpp_vdb3_kfc_memory_
+        Mem stk;
+#endif
+        U32 lineno;
+    };
+
+
+    /*------------------------------------------------------------------
+     * XC_DECLARE
+     *  provides a simple means of declaring a new exception type
+     */
+#ifdef _hpp_vdb3_kfc_string_
+#define XC_DECLARE( new_xc, parent_xc )                            \
+    struct new_xc : parent_xc                                      \
+    { new_xc ( vdb3 :: U32 lineno, const vdb3 :: String & msg )    \
+          : parent_xc ( lineno, msg ) {} }
+#else
+#define XC_DECLARE( new_xc, parent_xc )                            \
+    struct new_xc : parent_xc                                      \
+    { new_xc ( vdb3 :: U32 lineno, const char * msg )              \
+          : parent_xc ( lineno, msg ) {} }
+#endif
+
+    XC_DECLARE ( logic_err, exception );
+    XC_DECLARE ( runtime_err, exception );
+    XC_DECLARE ( usage_err, exception );
+    XC_DECLARE ( abuse_err, exception );
+    XC_DECLARE ( xc_internal_err, logic_err );
+    XC_DECLARE ( xc_unimplemented_err, xc_internal_err );
+    XC_DECLARE ( xc_bounds_err, logic_err );
+    XC_DECLARE ( xc_div_zero_err, logic_err );
+    XC_DECLARE ( xc_caps_violation_err, logic_err );
+    XC_DECLARE ( xc_caps_over_extended_err, xc_internal_err );
+    XC_DECLARE ( xc_rcaps_violation_err, logic_err );
+    XC_DECLARE ( xc_program_state_violation, xc_internal_err );
+    XC_DECLARE ( xc_bad_fmt_err, logic_err );
+    XC_DECLARE ( xc_param_err, logic_err );
+    XC_DECLARE ( xc_null_param_err, xc_param_err );
+    XC_DECLARE ( xc_null_self_err, logic_err );
+    XC_DECLARE ( xc_unsupported_interface_err, logic_err );
+    XC_DECLARE ( xc_references_exhausted_err, runtime_err );
+    XC_DECLARE ( xc_zombie_object_err, logic_err );
+    XC_DECLARE ( xc_elem_size_err, logic_err );
+    XC_DECLARE ( xc_no_mem, runtime_err );
+    XC_DECLARE ( xc_mem_quota, xc_no_mem );
+
+
+    /*------------------------------------------------------------------
+     * THROW
+     *  throws an exception of the given type
+     *  allocates a string to copy data
+     *  provides line number for xc_loc_t
+     */
+#ifdef _hpp_vdb3_kfc_string_
+#define THROW( xc, ... )                                     \
+    throw xc ( __LINE__,                                     \
+        vdb3 :: StringBuffer ( __VA_ARGS__ ) . to_str () )
+#else
+#define THROW( xc, fmt, ... )                                \
+    throw xc ( __LINE__, fmt )
+#endif
+
+    /*------------------------------------------------------------------
+     * CONST_THROW
+     *  throws an exception of the given type
+     *  embeds a string constant with no allocation
+     *  provides line number for xc_loc_t
+     */
+#ifdef _hpp_vdb3_kfc_string_
+#define CONST_THROW( xc, msg )                  \
+    throw xc ( __LINE__, CONST_STRING ( msg ) )
+#else
+#define CONST_THROW( xc, msg )                  \
+    throw xc ( __LINE__, msg )
+#endif
+}
+
+#endif // _hpp_vdb3_kfc_except_
diff --git a/vdb3/itf/kfc/fd.hpp b/vdb3/itf/kfc/fd.hpp
new file mode 100644
index 0000000..96c4ba0
--- /dev/null
+++ b/vdb3/itf/kfc/fd.hpp
@@ -0,0 +1,102 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_fd_
+#define _hpp_vdb3_kfc_fd_
+
+#ifndef _hpp_vdb3_kfc_refcount_
+#include <kfc/refcount.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_stream_
+#include <kfc/stream.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+
+
+    /*------------------------------------------------------------------
+     * exceptions
+     */
+
+
+    /*------------------------------------------------------------------
+     * FileDescImpl
+     *  a Unix file-descriptor
+     */
+    class FileDescImpl : public Refcount
+        , implements StreamItf
+    {
+    public:
+
+        // StreamItf
+        virtual bytes_t read ( const bytes_t & num_bytes,
+            Mem & dst, const bytes_t & start );
+        virtual bytes_t write ( const bytes_t & num_bytes,
+            const Mem & src, const bytes_t & start );
+        virtual bytes_t get_mtu () const;
+
+        // C++
+        ~ FileDescImpl ();
+
+    private:
+
+        FileDescImpl ( int fd, bool owned );
+
+        int fd;
+        bool owned;
+
+        friend class PrimordFDMgr;
+    };
+
+
+    /*------------------------------------------------------------------
+     * FileDesc
+     *  a reference to a Unix file-descriptor
+     */
+    class FileDesc : public Ref < FileDescImpl >
+    {
+    public:
+
+        FileDesc ();
+        FileDesc ( const FileDesc & r );
+        void operator = ( const FileDesc & r );
+        FileDesc ( const FileDesc & r, caps_t reduce );
+
+    private:
+
+        FileDesc ( FileDescImpl * obj, caps_t caps );
+
+        friend interface FDMgrItf;
+    };
+}
+
+#endif // _hpp_vdb3_kfc_fd_
diff --git a/vdb3/itf/kfc/fdmgr.hpp b/vdb3/itf/kfc/fdmgr.hpp
new file mode 100644
index 0000000..ad29cdb
--- /dev/null
+++ b/vdb3/itf/kfc/fdmgr.hpp
@@ -0,0 +1,95 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_fdmgr_
+#define _hpp_vdb3_kfc_fdmgr_
+
+#ifndef _hpp_vdb3_kfc_ref_
+#include <kfc/ref.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+    class FileDesc;
+    class FDMgr;
+    class FileDescImpl;
+
+
+    /*------------------------------------------------------------------
+     * exceptions
+     */
+
+
+    /*------------------------------------------------------------------
+     * FDMgrItf
+     *  file descriptor manager
+     *  an inverted bit of logic that tries to control the number
+     *  of Unix file descriptors in use
+     */
+    interface FDMgrItf
+    {
+
+        // make from an open file descriptor
+        virtual FileDesc make ( int fd, caps_t caps, bool owned ) = 0;
+
+    protected:
+
+        static FileDesc make_fd_ref ( FileDescImpl * obj, caps_t caps );
+        FDMgr make_fdmgr_ref ( Refcount * obj, caps_t caps );
+    };
+
+
+    /*------------------------------------------------------------------
+     * FDMgr
+     *  file descriptor manager reference
+     */
+    class FDMgr : public Ref < FDMgrItf >
+    {
+    public:
+
+        // make from an open file descriptor
+        FileDesc make ( int fd, caps_t caps, bool owned = false ) const;
+
+        // C++
+        FDMgr ();
+        FDMgr ( const FDMgr & r );
+        void operator = ( const FDMgr & r );
+        FDMgr ( const FDMgr & r, caps_t reduce );
+
+    private:
+
+        // factory
+        FDMgr ( Refcount * obj, FDMgrItf * itf, caps_t caps );
+
+        friend interface FDMgrItf;
+    };
+}
+
+#endif // _hpp_vdb3_kfc_fdmgr_
diff --git a/vdb3/itf/kfc/integer.hpp b/vdb3/itf/kfc/integer.hpp
new file mode 100644
index 0000000..0a44fab
--- /dev/null
+++ b/vdb3/itf/kfc/integer.hpp
@@ -0,0 +1,191 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_integer_
+#define _hpp_vdb3_kfc_integer_
+
+#ifndef _hpp_vdb3_kfc_defs_
+#include <kfc/defs.hpp>
+#endif
+
+#ifndef ALLOW_RAW_CONSTANTS
+#define ALLOW_RAW_CONSTANTS 1
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+    class bitsz_t;
+
+
+    /*------------------------------------------------------------------
+     * integer_t
+     *  a semantically typed integer
+     *  generally capable of most things
+     *  that can be done with an integer
+     */
+    template < class IT, class VT >
+    class integer_t
+    {
+    public:
+
+        // conversion to raw number
+        operator VT () const
+        { return val; }
+        VT value () const
+        { return val; }
+
+        // arithmetic
+        IT operator + ( const IT & i ) const
+        { return IT ( val + i . val ); }
+        IT operator - ( const IT & i ) const
+        { return IT ( val - i . val ); }
+        IT operator * ( const IT & i ) const
+        { return IT ( val * i . val ); }
+        IT operator / ( const IT & i ) const;
+        IT operator % ( const IT & i ) const;
+
+        // updating arithmetic
+        IT & operator += ( const IT & i )
+        { val += i . val; return * ( IT * ) this; }
+        IT & operator -= ( const IT & i )
+        { val -= i . val; return * ( IT * ) this; }
+        IT & operator *= ( const IT & i )
+        { val *= i . val; return * ( IT * ) this; }
+        IT & operator /= ( const IT & i );
+        IT & operator %= ( const IT & i );
+
+        IT & operator ++ ()
+        { ++ val; return * ( IT * ) this; }
+        IT & operator -- ()
+        { -- val; return * ( IT * ) this; }
+
+        // equality and relational operators
+        bool operator == ( const IT & i ) const
+        { return val == i . val; }
+        bool operator != ( const IT & i ) const
+        { return val != i . val; }
+        bool operator <= ( const IT & i ) const
+        { return val <= i . val; }
+        bool operator >= ( const IT & i ) const
+        { return val >= i . val; }
+        bool operator < ( const IT & i ) const
+        { return val < i . val; }
+        bool operator > ( const IT & i ) const
+        { return val > i . val; }
+
+#if ALLOW_RAW_CONSTANTS
+        IT operator + ( VT i ) const
+        { return IT ( val + i ); }
+        IT operator - ( VT i ) const
+        { return IT ( val - i ); }
+        IT operator * ( VT i ) const
+        { return IT ( val * i ); }
+        IT operator / ( VT i ) const;
+        IT operator % ( VT i ) const;
+        IT & operator += ( VT i )
+        { val += i; return * ( IT * ) this; }
+        IT & operator -= ( VT i )
+        { val -= i; return * ( IT * ) this; }
+        IT & operator *= ( VT i )
+        { val *= i; return * ( IT * ) this; }
+        IT & operator /= ( VT i );
+        IT & operator %= ( VT i );
+        bool operator == ( VT i ) const
+        { return val == i; }
+        bool operator != ( VT i ) const
+        { return val != i; }
+        bool operator <= ( VT i ) const
+        { return val <= i; }
+        bool operator >= ( VT i ) const
+        { return val >= i; }
+        bool operator < ( VT i ) const
+        { return val < i; }
+        bool operator > ( VT i ) const
+        { return val > i; }
+
+        IT & operator = ( VT i )
+        { val = i; return * ( IT * ) this; }
+#endif
+
+        integer_t ()
+            : val ( 0 ) {}
+        ~ integer_t ()
+            { val = 0; }
+
+        integer_t ( VT i )
+            : val ( i ) {}
+        integer_t ( IT & i )
+            : val ( i . val ) {}
+        IT & operator = ( IT & i )
+            { val = i . val; return * ( IT * ) this; }
+
+    private:
+
+        VT val;
+    };
+
+    /*------------------------------------------------------------------
+     * bytes_t
+     *  a semantically typed integer
+     *  represents the size of some entity in bytes
+     */
+    class bytes_t : public integer_t < bytes_t, U64 >
+    {
+    public:
+
+        bytes_t () {}
+        bytes_t ( U64 bytes )
+            : integer_t < bytes_t, U64 > ( bytes ) {}
+        explicit bytes_t ( const bytes_t & bytes )
+            : integer_t < bytes_t, U64 > ( bytes ) {}
+        explicit bytes_t ( const bitsz_t & bits );
+    };
+
+
+    /*------------------------------------------------------------------
+     * bitsz_t
+     *  a semantically typed integer
+     *  represents the size of some entity in bits
+     */
+    class bitsz_t : public integer_t < bitsz_t, U64 >
+    {
+    public:
+
+        bitsz_t () {}
+        bitsz_t ( U64 bits )
+            : integer_t < bitsz_t, U64 > ( bits ) {}
+        explicit bitsz_t ( const bitsz_t & bits )
+            : integer_t < bitsz_t, U64 > ( bits ) {}
+        explicit bitsz_t ( const bytes_t & bytes );
+    };
+
+}
+
+#endif // _hpp_vdb3_kfc_integer_
diff --git a/vdb3/itf/kfc/log.hpp b/vdb3/itf/kfc/log.hpp
new file mode 100644
index 0000000..b3f46f5
--- /dev/null
+++ b/vdb3/itf/kfc/log.hpp
@@ -0,0 +1,118 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_log_
+#define _hpp_vdb3_kfc_log_
+
+#ifndef _hpp_vdb3_kfc_ref_
+#include <kfc/ref.hpp>
+#endif
+
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+    class Log;
+    class Refcount;
+    interface LoggerItf;
+
+
+    /*------------------------------------------------------------------
+     * LogLevel
+     *  mimic unix syslog
+     */
+    enum LogLevel
+    {
+        log_emerg = 1,
+        log_alert,
+        log_crit,
+        log_err,
+        log_warning,
+        log_notice,
+        log_info
+    };
+
+    /*------------------------------------------------------------------
+     * LoggerItf
+     */
+    interface LoggerItf
+    {
+        // perform the formatting of the message
+        // transfer it to the task log stream
+        virtual void msg ( LogLevel priority, const char * fmt, va_list args ) = 0;
+
+    protected:
+
+        Log make_ref ( Refcount * obj, caps_t caps );
+
+    private:
+
+        static void * cast ( Refcount * obj );
+
+        friend class Log;
+    };
+
+    /*------------------------------------------------------------------
+     * Log
+     *  logging formatter
+     *  handles output to the log stream
+     */
+    class Log : public Ref < LoggerItf >
+    {
+    public:
+
+        // log level
+        LogLevel get_level () const
+        { return lvl; }
+        void set_level ( LogLevel level );
+
+        // log message
+        void msg ( LogLevel priority, const char * fmt, ... ) const;
+        void vmsg ( LogLevel priority, const char * fmt, va_list args ) const;
+
+        // C++
+        Log ();
+        Log ( const Log & r );
+        void operator = ( const Log & r );
+        Log ( const Log & r, caps_t reduce );
+        ~ Log ();
+
+    private:
+
+        // factory
+        Log ( Refcount * obj, LoggerItf * itf, caps_t caps );
+
+        LogLevel lvl;
+
+        friend interface LoggerItf;
+    };
+
+}
+
+#endif // _hpp_vdb3_kfc_log_
diff --git a/vdb3/itf/kfc/memmgr.hpp b/vdb3/itf/kfc/memmgr.hpp
new file mode 100644
index 0000000..8f4ae7b
--- /dev/null
+++ b/vdb3/itf/kfc/memmgr.hpp
@@ -0,0 +1,133 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_memmgr_
+#define _hpp_vdb3_kfc_memmgr_
+
+#ifndef _hpp_vdb3_kfc_except_
+#include <kfc/except.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_refcount_
+#include <kfc/refcount.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_ref_
+#include <kfc/ref.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+    class Mem;
+    class MemMgr;
+    class Memory;
+    class Refcount;
+    interface MemoryItf;
+
+
+    /*------------------------------------------------------------------
+     * exceptions
+     */
+
+
+    /*------------------------------------------------------------------
+     * MemMgrItf
+     *  memory manager interface
+     */
+    interface MemMgrItf : public Refcount
+    {
+        // allocate memory
+        virtual Mem alloc ( const bytes_t & size, bool clear ) = 0;
+
+        // make a block of constant memory
+        virtual Mem make_const ( const void * ptr, const bytes_t & size ) = 0;
+
+        // support for C++ new and delete
+        void * _new ( size_t bytes );
+        static void _delete ( void * ptr );
+
+    protected:
+
+        // allocate raw memory
+        virtual void * _alloc ( const bytes_t & size, bool clear ) = 0;
+
+        // resize or reallocate raw memory
+        virtual void * _resize ( void * ptr, const bytes_t & old_size,
+            const bytes_t & new_size, bool clear ) = 0;
+
+        // free raw memory
+        virtual void _free ( void * ptr, const bytes_t & size ) = 0;
+
+        // create MemMgr reference using friend status
+        MemMgr make_mmgr_ref ( Refcount * obj, caps_t caps );
+
+        // create Mem reference using friend status
+        static Mem make_mem_ref ( Refcount * obj, MemoryItf * itf, caps_t caps );
+
+        friend class Memory;
+    };
+
+
+    /*------------------------------------------------------------------
+     * MemMgr
+     *  memory manager reference
+     */
+    class MemMgr : public Ref < MemMgrItf >
+    {
+    public:
+
+        // allocate memory 
+        Mem alloc ( const bytes_t & size, bool clear ) const;
+
+        // make a block of constant memory
+        Mem make_const ( const void * ptr, const bytes_t & size ) const;
+
+        // C++
+        MemMgr ();
+        MemMgr ( const MemMgr & r );
+        void operator = ( const MemMgr & r );
+        MemMgr ( const MemMgr & r, caps_t reduce );
+
+    private:
+
+        // support for "new" and "delete" operators
+        void * _new ( size_t bytes ) const;
+        void _delete ( void * ptr ) const;
+
+        // initialization by memmgr_t
+        MemMgr ( Refcount * obj, MemMgrItf * itf, caps_t caps );
+
+        friend interface MemMgrItf;
+        friend class Refcount;
+    };
+
+}
+
+#endif // _hpp_vdb3_kfc_memmgr_
diff --git a/vdb3/itf/kfc/memory.hpp b/vdb3/itf/kfc/memory.hpp
new file mode 100644
index 0000000..e1a6760
--- /dev/null
+++ b/vdb3/itf/kfc/memory.hpp
@@ -0,0 +1,149 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_memory_
+#define _hpp_vdb3_kfc_memory_
+
+#ifndef _hpp_vdb3_kfc_refcount_
+#include <kfc/refcount.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_ref_
+#include <kfc/ref.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+    interface MemMgrItf;
+    struct CopyUntilRslt;
+
+
+    /*------------------------------------------------------------------
+     * MemoryItf
+     *  an interface representing a block of storage
+     */
+    interface MemoryItf : public Refcount
+    {
+
+        // change the size of the memory allocation
+        virtual void resize ( const bytes_t & new_size, bool clear ) = 0;
+
+    protected:
+
+        // TEMPORARY - this allows us to access mapped memory
+        // it will not necessarily work for all memory types,
+        // and specifically may require having Mem work with
+        // offsets and sizes rather than pointers.
+        virtual void * get_mapped_memory ( bytes_t * size ) const = 0;
+
+        MemMgrItf * get_mmgr () const;
+
+        static void * cast ( Refcount * obj );
+
+        friend class Mem;
+    };
+
+
+    /*------------------------------------------------------------------
+     * Mem
+     *  an object representing a range of address space
+     */
+    class Mem : public Ref < MemoryItf >
+    {
+    public:
+
+        // size of allocation
+        bytes_t size () const;
+
+        // search for a byte
+        index_t find_first ( U8 byte ) const;
+        index_t find_first ( U8 byte, index_t offset ) const;
+        index_t find_first ( U8 byte, index_t offset, const bytes_t & size ) const;
+
+        // return a subrange of memory
+        Mem subrange ( index_t offset ) const;
+        Mem subrange ( index_t offset, const bytes_t & size ) const;
+
+        // alter memory size
+        void resize ( const bytes_t & size, bool clear );
+
+        // transfer data between memory ranges
+        bytes_t copy ( const bytes_t & amount, index_t dst_offset,
+            const Mem & src, index_t src_offset );
+        CopyUntilRslt copy_until ( const bytes_t & amount, U8 stop_byte,
+            index_t dst_offset, const Mem & src, index_t src_offset );
+
+        // fill memory with repeats of single byte
+        bytes_t fill ( count_t repeat, index_t offset, U8 byte );
+
+        // comparison
+        bool operator == ( const Mem & m ) const;
+        bool operator != ( const Mem & m ) const;
+
+        // C++
+        Mem ();
+        ~ Mem ();
+        Mem ( const Mem & r );
+        void operator = ( const Mem & r );
+        Mem ( const Mem & r, caps_t reduce );
+
+        // dynamic
+        Mem ( const OpaqueRef & r );
+
+    private:
+
+        // factory
+        Mem ( Refcount * obj, MemoryItf * itf, caps_t caps );
+#if 0
+        Mem ( const void * ptr, const bytes_t & size );
+#endif
+        void * ptr;
+        bytes_t bytes;
+
+        friend interface MemMgrItf;
+
+        friend class ConstString;
+        friend class OpaquePtr;
+        friend class OpaqueArray;
+    };
+
+    struct CopyUntilRslt
+    {
+        bytes_t num_copied;
+        bool stop_byte_found;
+
+        CopyUntilRslt () {}
+        CopyUntilRslt ( const bytes_t & b, bool f )
+            : num_copied ( b ), stop_byte_found ( f ) {}
+    };
+
+}
+
+#endif // _hpp_vdb3_kfc_memory_
diff --git a/vdb3/itf/kfc/ptr.hpp b/vdb3/itf/kfc/ptr.hpp
new file mode 100644
index 0000000..70f6338
--- /dev/null
+++ b/vdb3/itf/kfc/ptr.hpp
@@ -0,0 +1,174 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_ptr_
+#define _hpp_vdb3_kfc_ptr_
+
+#ifndef _hpp_vdb3_kfc_memory_
+#include <kfc/memory.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_except_
+#include <kfc/except.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * exceptions
+     */
+    XC_DECLARE ( xc_ptr_space_err, logic_err );
+    XC_DECLARE ( xc_ptr_size_err, xc_elem_size_err );
+
+
+    /*------------------------------------------------------------------
+     * OpaquePtr
+     *  type-opaque pointer
+     *  does all the actual work
+     */
+    class OpaquePtr
+    {
+    protected:
+
+        // implement read or r/w access to object
+        void * access ( const bytes_t & elem_size );
+        const void * access ( const bytes_t & elem_size ) const;
+        void * access ( index_t offset, const bytes_t & elem_size );
+        const void * access ( index_t offset, const bytes_t & elem_size ) const;
+
+        // increment and decrement
+        void increment ( index_t offset );
+        void decrement ( index_t offset );
+
+        // arithmetic - defined for two pointers on same mem
+        index_t difference ( const OpaquePtr & p, const bytes_t & elem_size ) const;
+
+        // comparison
+        bool equal ( const OpaquePtr & p ) const;
+        bool above ( const OpaquePtr & p ) const;
+        bool below ( const OpaquePtr & p ) const;
+
+        // assignment
+        void assign ( const OpaquePtr & p );
+
+        // construct from raw memory and element size
+        OpaquePtr ( Mem & m, const bytes_t & elem_size );
+        OpaquePtr ( const Mem & m, const bytes_t & elem_size );
+
+        // C++
+        OpaquePtr ( const OpaquePtr & p );
+        OpaquePtr ( const OpaquePtr & p, caps_t reduce );
+        ~ OpaquePtr ();
+
+    private:
+
+        Mem m;
+        index_t adj;
+    };
+
+
+    /*------------------------------------------------------------------
+     * Ptr < T >
+     *  a typed pointer
+     *  obtains all of its actual behavior from OpaquePtr
+     */
+    template < class T >
+    class Ptr : OpaquePtr
+    {
+    public:
+
+        // access
+        T & operator * ()
+        { return * ( T * ) access ( sizeof ( T ) ); }
+        const T & operator * () const
+        { return * ( const T * ) access ( sizeof ( T ) ); }
+        T & operator [] ( index_t idx )
+        { return * ( T * ) access ( idx * sizeof ( T ), sizeof ( T ) ); }
+        const T & operator [] ( index_t idx ) const
+        { return * ( const T * ) access ( idx * sizeof ( T ), sizeof ( T ) ); }
+
+        // increment/decrement - NOT returning ref, no postfix
+        void operator ++ ()
+        { increment ( sizeof ( T ) ); }
+        void operator -- ()
+        { decrement ( sizeof ( T ) ); }
+
+        // arithmetic - again not returning ref
+        void operator += ( index_t offset )
+        { increment ( offset * sizeof ( T ) ); }
+        void operator -= ( index_t offset )
+        { decrement ( offset * sizeof ( T ) ); }
+
+        // more arithmetic
+        Ptr < T > operator + ( index_t offset ) const
+        {
+            Ptr < T > p ( * this );
+            p += offset;
+            return p;
+        }
+        Ptr < T > operator - ( index_t offset ) const
+        {
+            Ptr < T > p ( * this );
+            p -= offset;
+            return p;
+        }
+
+        // difference - defined for two pointers on same mem
+        index_t operator - ( const Ptr < T > & p ) const
+        { return difference ( p, sizeof ( T ) ); }
+
+        // equality and relational operators
+        bool operator == ( const Ptr < T > & p ) const
+        { return equal ( p ); }
+        bool operator != ( const Ptr < T > & p ) const
+        { return ! equal ( p ); }
+        bool operator <= ( const Ptr < T > & p ) const
+        { return ! above ( p ); }
+        bool operator >= ( const Ptr < T > & p ) const
+        { return ! below ( p ); }
+        bool operator < ( const Ptr < T > & p ) const
+        { return below ( p ); }
+        bool operator > ( const Ptr < T > & p ) const
+        { return above ( p ); }
+
+        // C++
+        Ptr ( const Ptr < T > & p )
+            : OpaquePtr ( p ) {}
+        void operator = ( const Ptr < T > & p )
+            { OpaquePtr :: assign ( p ); }
+        Ptr ( const Ptr < T > & p, caps_t reduce )
+            : OpaquePtr ( p, reduce ) {}
+
+        // creation from a memory block
+        Ptr ( Mem & m )
+            : OpaquePtr ( m, sizeof ( T ) ) {}
+        Ptr ( const Mem & m )
+            : OpaquePtr ( m, sizeof ( T ) ) {}
+    };
+}
+
+#endif // _hpp_vdb3_kfc_ptr_
diff --git a/vdb3/itf/kfc/ref.hpp b/vdb3/itf/kfc/ref.hpp
new file mode 100644
index 0000000..744e4b7
--- /dev/null
+++ b/vdb3/itf/kfc/ref.hpp
@@ -0,0 +1,155 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_ref_
+#define _hpp_vdb3_kfc_ref_
+
+#ifndef _hpp_vdb3_kfc_defs_
+#include <kfc/defs.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+    class Refcount;
+
+
+    /*------------------------------------------------------------------
+     * OpaqueRef
+     *  type-opaque reference
+     *  does all the actual work
+     */
+    class OpaqueRef
+    {
+    protected:
+
+        // ensure at least the required caps
+        // throws an exception otherwise
+        void test_caps ( caps_t required ) const;
+
+        // dynamic casting support
+        static void * cast ( const OpaqueRef & from,
+            void * ( * cast_func ) ( Refcount * obj ) );
+
+        // throws an exception describing the cast
+        static void bad_cast ( const OpaqueRef & from, const char * func, U32 lineno );
+
+        // create a null reference
+        // can only be repaired by assignment
+        OpaqueRef ();
+
+        // release the object
+        ~ OpaqueRef ();
+
+        // standard initialization and assignment
+        OpaqueRef ( const OpaqueRef & r );
+        void operator = ( const OpaqueRef & r );
+
+        // reduced capability initialization
+        OpaqueRef ( const OpaqueRef & r, caps_t reduce );
+        
+        // factory initialization
+        OpaqueRef ( Refcount * obj, caps_t caps );
+
+    private:
+
+        // the object is reference-counted
+        Refcount * obj;
+
+        // we store object capabilities
+        caps_t caps;
+
+    };
+
+
+    /*------------------------------------------------------------------
+     * Ref < T >
+     *  a typed reference
+     *  obtains all of its actual behavior from OpaqueRef
+     */
+    template < class T >
+    class Ref : public OpaqueRef
+    {
+    public:
+
+        // test for null
+        bool null_ref () const
+        { return itf == 0; }
+        bool operator ! () const
+        { return itf == 0; }
+
+    protected:
+
+        T * get_itf ( caps_t required ) const
+        {
+            test_caps ( required );
+            return itf;
+        }
+
+        Ref ()
+            : itf ( 0 ) {}
+        ~ Ref ()
+        { itf = 0; }
+
+        Ref ( const Ref < T > & r )
+            : OpaqueRef ( r )
+            , itf ( r . itf ) {}
+        Ref ( const Ref < T > & r, caps_t reduce )
+            : OpaqueRef ( r, reduce )
+            , itf ( r . itf ) {}
+        Ref ( T * obj, caps_t caps )
+            : OpaqueRef ( obj, caps )
+            , itf ( obj ) {}
+        Ref ( Refcount * obj, T * _itf, caps_t caps )
+            : OpaqueRef ( obj, caps )
+            , itf ( _itf ) {}
+
+        void operator = ( const Ref < T > & r )
+        {
+            OpaqueRef :: operator = ( r );
+            itf = r . itf;
+        }
+
+        // dynamic casting
+        Ref ( const OpaqueRef & r, void * ( * cast_func ) ( Refcount * obj ) )
+            : OpaqueRef ( r )
+            , itf ( ( T * ) OpaqueRef :: cast ( r, cast_func ) )
+        {
+            if ( itf == 0 )
+                OpaqueRef :: bad_cast ( r, __PRETTY_FUNCTION__, __LINE__ );
+        }
+
+    private:
+
+        T * itf;
+    };
+
+}
+
+#endif // _hpp_vdb3_kfc_ref_
diff --git a/vdb3/itf/kfc/refcount.hpp b/vdb3/itf/kfc/refcount.hpp
new file mode 100644
index 0000000..c04bc65
--- /dev/null
+++ b/vdb3/itf/kfc/refcount.hpp
@@ -0,0 +1,94 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_refcount_
+#define _hpp_vdb3_kfc_refcount_
+
+#ifndef _hpp_vdb3_kfc_atomic_
+#include <kfc/atomic.hpp>
+#endif
+
+#include <new>
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+    interface MemMgrItf;
+
+
+    /*------------------------------------------------------------------
+     * Refcount
+     *  base for reference-counted objects
+     */
+    class Refcount
+    {
+    public:
+
+        // interface to current MemMgr
+        void * operator new ( std :: size_t bytes );
+
+        // return the count at any given moment
+        // if the object can be shared between threads,
+        // only a count of 1 is meaningful
+        count_t getCount () const
+        { return count_t ( ( U64 ) count ); }
+
+    protected:
+
+        // interface to embedded MemMgr
+        void operator delete ( void * ptr );
+
+        Refcount ();
+        virtual ~ Refcount ();
+
+    private:
+
+        // reference count manipulation
+        // null-safe
+        Refcount * duplicate ();
+        void release ();
+
+        // memory manager that made this object
+        MemMgrItf * mmgr;
+
+        // object size
+        size_t obj_size;
+
+        // reference count
+        atomic_t < U64 > count;
+
+        friend class PrimordMemMgr;
+        friend class OpaqueRef;
+        friend interface MemoryItf;
+        friend interface MemMgrItf;
+    };
+    
+}
+
+#endif // _hpp_vdb3_kfc_refcount_
diff --git a/vdb3/itf/kfc/rsrc.hpp b/vdb3/itf/kfc/rsrc.hpp
new file mode 100644
index 0000000..8396378
--- /dev/null
+++ b/vdb3/itf/kfc/rsrc.hpp
@@ -0,0 +1,150 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_rsrc_
+#define _hpp_vdb3_kfc_rsrc_
+
+#ifndef _hpp_vdb3_kfc_memmgr_
+#include <kfc/memmgr.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_timemgr_
+#include <kfc/timemgr.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_fdmgr_
+#include <kfc/fdmgr.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_log_
+#include <kfc/log.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_stream_
+#include <kfc/stream.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards and externs
+     */
+
+    class Rsrc;
+    extern __thread Rsrc const * rsrc;
+
+
+    /*------------------------------------------------------------------
+     * rcaps_t
+     *  resource manager capabilities
+     */
+    const rcaps_t RCAP_MMGR    = ( 1 <<  0 );
+    const rcaps_t RCAP_TMMGR   = ( 1 <<  1 );
+    const rcaps_t RCAP_FDMGR   = ( 1 <<  2 );
+    const rcaps_t RCAP_LOG     = ( 1 <<  3 );
+    const rcaps_t RCAP_ERR     = ( 1 <<  4 );
+    const rcaps_t RCAP_ALL     = ( 1 <<  5 ) - 1;
+
+
+    /*------------------------------------------------------------------
+     * RsrcBase
+     *  implements a destructor
+     */
+    class RsrcBase
+    {
+    public:
+
+        ~ RsrcBase ();
+    };
+
+
+    /*------------------------------------------------------------------
+     * Rsrc
+     *  block of resource manager references
+     */
+    class Rsrc : public RsrcBase
+    {
+    public:
+
+        /* RESOURCE MANAGERS
+         */
+
+        // memory manager is required for nearly everything
+        MemMgr mmgr;
+
+        // time manager is fundamental
+        TimeMgr tmmgr;
+
+        // file descriptors
+        FDMgr fdmgr;
+
+
+        /* ENVIRONMENT
+         */
+
+        // logging formatter
+        Log log;
+
+        // streams
+        Stream err;
+
+        /* C++
+         */
+
+        // clone current resources with potential reduction
+        Rsrc ( rcaps_t mgrs );
+
+        // cloning is allowed at any time
+        Rsrc ( const Rsrc & rsrc );
+        void operator = ( const Rsrc & rsrc );
+
+        ~ Rsrc ();
+
+    protected:
+
+        // one-shot
+        // allowed once per process
+        Rsrc ( const MemMgr & pmmgr, const char * ident );
+
+    };
+
+
+    /*------------------------------------------------------------------
+     * TopRsrc
+     *  block of resource manager references
+     */
+    class TopRsrc : public Rsrc
+    {
+    public:
+
+        // create and stack process resources
+        TopRsrc ( const char * ident );
+
+    };
+}
+
+#endif // _hpp_vdb3_kfc_rsrc_
diff --git a/vdb3/itf/kfc/stream.hpp b/vdb3/itf/kfc/stream.hpp
new file mode 100644
index 0000000..58d36a1
--- /dev/null
+++ b/vdb3/itf/kfc/stream.hpp
@@ -0,0 +1,135 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_stream_
+#define _hpp_vdb3_kfc_stream_
+
+#ifndef _hpp_vdb3_kfc_ref_
+#include <kfc/ref.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_except_
+#include <kfc/except.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+    class Mem;
+    class Stream;
+    class Refcount;
+
+
+    /*------------------------------------------------------------------
+     * exceptions
+     */
+    XC_DECLARE ( xc_transfer_incomplete_err, runtime_err );
+
+
+    /*------------------------------------------------------------------
+     * StreamItf
+     *  an interface representing a stream of bytes ( bits? )
+     */
+    interface StreamItf
+    {
+
+        // traditional writing operation
+        virtual bytes_t read ( const bytes_t & amount,
+            Mem & dst, const bytes_t & dst_offset );
+        virtual bytes_t write ( const bytes_t & amount,
+            const Mem & src, const bytes_t & src_offset );
+
+        // indicate the preferred chunk size
+        virtual bytes_t get_mtu () const = 0;
+
+    protected:
+
+        Stream make_ref ( Refcount * obj, caps_t caps );
+
+    private:
+
+        static void * cast ( Refcount * obj );
+
+        friend class Stream;
+    };
+
+
+    /*------------------------------------------------------------------
+     * Stream
+     *  an object representing a stream of bytes ( bits? )
+     */
+    class Stream : public Ref < StreamItf >
+    {
+    public:
+
+        // copy from source
+        // return the number of bytes actually copied
+        bytes_t copy ( const Stream & src ) const;
+        bytes_t copy ( const bytes_t & amount,
+            const Stream & src ) const;
+        bytes_t copy_all ( const Stream & src ) const;
+        bytes_t copy_all ( const bytes_t & amount,
+            const Stream & src ) const;
+
+        // read data into a memory buffer
+        bytes_t read ( Mem & dst, index_t dst_offset = 0 ) const;
+        bytes_t read ( const bytes_t & amount,
+            Mem & dst, index_t dst_offset ) const;
+        bytes_t read_all ( Mem & dst, index_t dst_offset = 0 ) const;
+        bytes_t read_all ( const bytes_t & amount,
+            Mem & dst, index_t dst_offset ) const;
+
+        // write data from memory buffer
+        bytes_t write ( const Mem & src, index_t src_offset = 0 ) const;
+        bytes_t write ( const bytes_t & amount,
+            const Mem & src, index_t src_offset ) const;
+        bytes_t write_all ( const Mem & src, index_t src_offset = 0 ) const;
+        bytes_t write_all ( const bytes_t & amount,
+            const Mem & src, index_t src_offset ) const;
+
+        // C++
+        Stream ();
+        Stream ( const Stream & r );
+        void operator = ( const Stream & r );
+        Stream ( const Stream & r, caps_t reduce );
+
+        // dynamic
+        Stream ( const OpaqueRef & r );
+
+    private:
+
+        // factory
+        Stream ( Refcount * obj, StreamItf * itf, caps_t caps );
+
+        friend interface StreamItf;
+    };
+
+}
+
+#endif // _hpp_vdb3_kfc_stream_
diff --git a/vdb3/itf/kfc/string.hpp b/vdb3/itf/kfc/string.hpp
new file mode 100644
index 0000000..ef108ff
--- /dev/null
+++ b/vdb3/itf/kfc/string.hpp
@@ -0,0 +1,252 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_string_
+#define _hpp_vdb3_kfc_string_
+
+#ifndef _hpp_vdb3_kfc_memory_
+#include <kfc/memory.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+    class StreamBuffer;
+    class StringPair;
+    class StringBuffer;
+
+
+    /*------------------------------------------------------------------
+     * String
+     *  an immutable string object
+     */
+    class String
+    {
+    public:
+
+        // length in characters
+        count_t length () const
+        { return len; }
+
+        // size in bytes
+        bytes_t size () const
+        { return mem . size (); }
+
+        // access underlying mem
+        const Mem & to_mem () const
+        { return mem; }
+
+        // search for a character
+        index_t find_first ( UTF32 ch ) const;
+        index_t find_first ( UTF32 ch, index_t offset ) const;
+        index_t find_first ( UTF32 ch, index_t offset, count_t len ) const;
+
+        // create substring
+        String substr ( index_t offset ) const;
+        String substr ( index_t offset, count_t length ) const;
+
+        // split string at separator point
+        // removes separator if width is given
+        StringPair split ( index_t offset ) const;
+        StringPair split ( index_t offset, count_t sep_width ) const;
+
+        // convert to upper-case
+        String toupper () const;
+
+        // trim white-space at both ends
+        String trim () const;
+
+        // comparison
+        bool operator == ( const String & s ) const;
+        bool operator != ( const String & s ) const;
+
+        // C++
+        String ();
+        String ( const String & s );
+        void operator = ( const String & s );
+        String ( const String & s, caps_t reduce );
+        ~ String ();
+
+    protected:
+
+        // create from ConstString or StringBuffer
+        String ( const Mem & m, const bytes_t & ascii_size, count_t len );
+
+    private:
+
+        // the string memory is stored here
+        Mem mem;
+
+        // the number of bytes containing ascii-only characters
+        // when ascii_size == size (), string is 100% ascii
+        bytes_t ascii_size;
+
+        // the number of characters in string
+        // when ascii_size == len, string is 100% ascii
+        count_t len;
+
+        friend class StringBuffer;
+        friend class NULTermString;
+    };
+
+
+    /*------------------------------------------------------------------
+     * StringPair
+     */
+    struct StringPair
+    {
+        String left, right;
+
+        StringPair () {}
+        StringPair ( const String & l, const String r )
+            : left ( l ), right ( r ) {}
+    };
+
+
+    /*------------------------------------------------------------------
+     * ConstString
+     *  create a String from constant data
+     */
+    class ConstString : public String
+    {
+    public:
+
+        ConstString ( const char * text, size_t bytes );
+    };
+
+#define CONST_STRING( str )                      \
+    vdb3 :: ConstString ( str, sizeof str - 1 )
+
+
+    /*------------------------------------------------------------------
+     * NULTermString
+     *  create a string that is NUL-terminated,
+     *  and sports a cast to const char *
+     *  for use with native OS
+     */
+    class NULTermString : public String
+    {
+    public:
+
+        // supports nasty cast to NUL-terminated string
+        operator const char * () const;
+
+        NULTermString ( const String & str );
+        void operator = ( const String & str );
+    };
+
+
+    /*------------------------------------------------------------------
+     * StringBuffer
+     *  an editible string object
+     */
+    class StringBuffer
+    {
+    public:
+
+        count_t length () const
+        { return len; }
+
+        bytes_t size () const
+        { return bytes; }
+
+        bytes_t capacity () const
+        { return buffer . size (); }
+
+        String to_str () const;
+
+        // forward search
+        // returns < 0 if not found
+        // returns 0..length()-1 if found
+        index_t find_first ( UTF32 ch ) const;
+        index_t find_first ( UTF32 ch, index_t starting_pos ) const;
+
+        // replace existing contents with new value
+        StringBuffer & assign ( const String & s );
+        StringBuffer & assign ( const StringBuffer & s );
+        StringBuffer & assign ( const char * fmt, ... );
+        StringBuffer & vassign ( const char * fmt, va_list args );
+
+        // append text to buffer
+        StringBuffer & append ( const String & s );
+        StringBuffer & append ( const StringBuffer & s );
+        StringBuffer & append ( const char * fmt, ... );
+        StringBuffer & vappend ( const char * fmt, va_list args );
+
+        // append repeated character
+        StringBuffer & append ( UTF32 ch );
+        StringBuffer & append ( UTF32 ch, count_t repeat );
+
+        // contents from a buffer
+        bool assign_until ( const bytes_t & limit, UTF32 stop_ch, StreamBuffer & src );
+        bool append_until ( const bytes_t & limit, UTF32 stop_ch, StreamBuffer & src );
+
+        // truncate to empty content
+        void reset ();
+
+        // trim white-space at both ends
+        void trim ();
+
+        // trim end-of-line, if any
+        // returns true if found ( and therefore trimmed )
+        bool trim_eoln ();
+
+        // convert to upper case
+        void toupper ();
+
+        // operators
+        StringBuffer & operator  = ( const String & s )        { return assign ( s ); }
+        StringBuffer & operator  = ( const StringBuffer & s ) { return assign ( s ); }
+        StringBuffer & operator += ( const String & s )        { return append ( s ); }
+        StringBuffer & operator += ( const StringBuffer & s ) { return append ( s ); }
+
+        StringBuffer ();
+        ~ StringBuffer ();
+
+        StringBuffer ( const Mem & buffer );
+
+        StringBuffer ( const char * fmt, ... );
+        StringBuffer ( const char * fmt, va_list args );
+
+    private:
+
+        size_t fappend_simple ( const char * fmt, va_list args, size_t idx );
+        size_t fappend_long ( const char * fmt, va_list args, size_t idx );
+        void resize ( const bytes_t & size );
+
+        StringBuffer ( const StringBuffer & s );
+
+        Mem buffer;
+        bytes_t bytes;
+        bytes_t ascii_size;
+        count_t len;
+    };
+}
+
+#endif // _hpp_vdb3_kfc_str_
diff --git a/vdb3/itf/kfc/syserr.hpp b/vdb3/itf/kfc/syserr.hpp
new file mode 100644
index 0000000..47d704a
--- /dev/null
+++ b/vdb3/itf/kfc/syserr.hpp
@@ -0,0 +1,57 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_syserr_
+#define _hpp_vdb3_kfc_syserr_
+
+#ifndef _hpp_vdb3_kfc_string_
+#include <kfc/string.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+
+
+    /*------------------------------------------------------------------
+     * functions
+     */
+
+    // returns a system error string
+    String SysErr( int errno );
+
+    // throws a runtime error
+    void ThrowOSErr( U32 lineno, const String & func_name, int err_code )
+        __attribute__ ( ( noreturn ) );
+
+#define THROW_OSERR( func_name, err_code ) \
+    ThrowOSErr( __LINE__, CONST_STRING ( # func_name ), err_code )
+}
+
+#endif // _hpp_vdb3_kfc_syserr_
diff --git a/vdb3/itf/kfc/task-impl.hpp b/vdb3/itf/kfc/task-impl.hpp
new file mode 100644
index 0000000..5adb01c
--- /dev/null
+++ b/vdb3/itf/kfc/task-impl.hpp
@@ -0,0 +1,139 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_task_impl_
+#define _hpp_vdb3_kfc_task_impl_
+
+#ifndef _hpp_vdb3_kfc_except_
+#include <kfc/except.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_refcount_
+#include <kfc/refcount.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_task_
+#include <kfc/task.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_rsrc_
+#include <kfc/rsrc.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_atomic_
+#include <kfc/atomic.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards and externs
+     */
+
+
+    /*------------------------------------------------------------------
+     * exceptions
+     */
+
+
+    /*------------------------------------------------------------------
+     * TaskImpl
+     */
+    class TaskImpl : public Refcount
+        , implements TaskItf
+    {
+    public:
+
+        // gives task time to run on a thread
+        // returns true if task is or has completed
+        virtual bool run ();
+
+        // ask task to cooperatively suspend its execution
+        virtual void suspend ();
+
+        // checkpointing and restoration
+        // TBD - these have to be given an object for saving state
+        virtual void checkpoint ();
+        virtual void restart ();
+
+        ~ TaskImpl ();
+
+    protected:
+
+        // called to perform any initialization
+        // in preparation for first run
+        // returns true if successful
+        virtual bool prepare ();
+
+        // run the task until suspended or complete
+        // return true upon completion
+        virtual bool execute () = 0;
+
+        // resume the task until suspended again or complete
+        // return true upon completion
+        virtual bool resume ();
+
+        // checkpointing operations
+        virtual void save ();
+        virtual void restore ();
+
+
+        // construction
+        TaskImpl ();
+        TaskImpl ( rcaps_t caps );
+
+        // resetting resource managers
+        void set_rsrc ( const Rsrc & rsrc );
+
+        // allow task to set state to complete
+        void set_complete ();
+
+    private:
+
+        enum task_state_t
+        {
+            ts_unprepared,
+            ts_updating,
+            ts_preparing,
+            ts_presuspend,
+            ts_initial,
+            ts_ready,
+            ts_suspended,
+            ts_running,
+            ts_suspending,
+            ts_complete,
+
+            // force enum to be 32 bits
+            ts_invalid = 0xFFFFFFFF
+        };
+
+        Rsrc task_rsrc;
+        atomic_t < task_state_t > state;
+    };
+}
+
+#endif // _hpp_vdb3_kfc_task_impl_
diff --git a/vdb3/itf/kfc/task.hpp b/vdb3/itf/kfc/task.hpp
new file mode 100644
index 0000000..c82db3d
--- /dev/null
+++ b/vdb3/itf/kfc/task.hpp
@@ -0,0 +1,124 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_task_
+#define _hpp_vdb3_kfc_task_
+
+#ifndef _hpp_vdb3_kfc_exceot_
+#include <kfc/except.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_ref_
+#include <kfc/ref.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards and externs
+     */
+    class Task;
+    class Refcount;
+
+
+    /*------------------------------------------------------------------
+     * exceptions
+     */
+    XC_DECLARE ( xc_task_busy_err, runtime_err );
+    XC_DECLARE ( xc_task_invalid_err, xc_internal_err );
+
+
+    /*------------------------------------------------------------------
+     * TaskItf
+     */
+    interface TaskItf
+    {
+
+        // gives task time to run on a thread
+        // returns true if task is or has completed
+        virtual bool run () = 0;
+
+        // ask task to cooperatively suspend its execution
+        virtual void suspend () = 0;
+
+        // checkpointing and restoration
+        // TBD - these have to be given an object for saving state
+        virtual void checkpoint () = 0;
+        virtual void restart () = 0;
+
+    protected:
+
+        // creating a Task object
+        Task make_ref ( Refcount * obj, caps_t caps );
+
+    private:
+
+        static void * cast ( Refcount * obj );
+
+        friend class Task;
+    };
+
+
+    /*------------------------------------------------------------------
+     * Task
+     */
+    class Task : Ref < TaskItf >
+    {
+    public:
+
+        // gives task time to run on a thread
+        // returns true if the task is or has completed
+        bool run ();
+
+        // ask task to cooperatively suspend its execution
+        void suspend ();
+
+        // checkpointing and restoration
+        // TBD - these have to be given an object for saving state
+        void checkpoint ();
+        void restart ();
+
+        // C++
+        Task ();
+        Task ( const Task & r );
+        void operator = ( const Task & r );
+        Task ( const Task & r, caps_t reduce );
+
+        // dynamic
+        Task ( const OpaqueRef & r );
+
+    private:
+
+        // construct a task reference
+        Task ( Refcount * obj, TaskItf * itf, caps_t caps );
+
+        friend class TaskItf;
+
+    };
+}
+
+#endif // _hpp_vdb3_kfc_task_
diff --git a/vdb3/itf/kfc/time.hpp b/vdb3/itf/kfc/time.hpp
new file mode 100644
index 0000000..5adecf9
--- /dev/null
+++ b/vdb3/itf/kfc/time.hpp
@@ -0,0 +1,299 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_time_
+#define _hpp_vdb3_kfc_time_
+
+#ifndef _hpp_vdb3_kfc_atomic_
+#include <kfc/atomic.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+    class nS_t;
+    class uS_t;
+    class mS_t;
+    class seconds_t;
+
+
+    /*------------------------------------------------------------------
+     * tm_base_t
+     *  basic inline operations for time quantities
+     */
+    template < class T >
+    class tm_base_t
+    {
+    public:
+
+        // conversion to raw number
+        operator I64 () const
+        { return val; }
+
+        // arithmetic
+        T operator + ( const T & tm ) const
+        { return T ( val + tm . val ); }
+        T operator - ( const T & tm ) const
+        { return T ( val - tm . val ); }
+        T operator * ( I64 m ) const
+        { return T ( val * m ); }
+        T operator / ( I64 d ) const;
+        T operator % ( I64 d ) const;
+
+        // updating arithmetic
+        T & operator += ( const T & tm )
+        { val += tm . val; return * ( T * ) this; }
+        T & operator -= ( const T & tm )
+        { val -= tm . val; return * ( T * ) this; }
+        T & operator *= ( I64 m )
+        { val *= m; return * ( T * ) this; }
+        T & operator /= ( I64 d );
+        T & operator %= ( I64 d );
+
+        // equality and relational operators
+        bool operator == ( const T & tm ) const
+        { return val == tm . val; }
+        bool operator != ( const T & tm ) const
+        { return val != tm . val; }
+        bool operator <= ( const T & tm ) const
+        { return val <= tm . val; }
+        bool operator >= ( const T & tm ) const
+        { return val >= tm . val; }
+        bool operator < ( const T & tm ) const
+        { return val < tm . val; }
+        bool operator > ( const T & tm ) const
+        { return val > tm . val; }
+
+    protected:
+
+        // constructors
+        tm_base_t ( I64 v )
+            : val ( v ) {}
+
+        // for good measure
+        ~ tm_base_t ()
+        { val = 0; }
+
+        I64 val;
+        
+    };
+
+
+    /*------------------------------------------------------------------
+     * nS_t
+     *  represents nano-seconds
+     */
+    class nS_t : public tm_base_t < nS_t >
+    {
+    public:
+
+
+        // declare uninitialized
+        nS_t () : tm_base_t < nS_t > ( 0 ) {}
+
+        // create from raw integer
+        nS_t ( I64 tm ) : tm_base_t < nS_t > ( tm ) {}
+        void operator = ( I64 tm ) { val = tm; }
+
+        // create from another nS_t
+        nS_t ( const nS_t & tm ) : tm_base_t < nS_t > ( tm . val ) {}
+        void operator = ( const nS_t & tm ) { val = tm . val; }
+
+        // create from uS_t
+        nS_t ( const uS_t & tm );
+        void operator = ( const uS_t & tm );
+
+        // create from mS_t
+        nS_t ( const mS_t & tm );
+        void operator = ( const mS_t & tm );
+
+        // create from seconds
+        nS_t ( const seconds_t & tm );
+        void operator = ( const seconds_t & tm );
+    };
+
+
+    /*------------------------------------------------------------------
+     * uS_t
+     *  represents micro-seconds
+     */
+    class uS_t : public tm_base_t < uS_t >
+    {
+    public:
+
+
+        // declare uninitialized
+        uS_t () : tm_base_t < uS_t > ( 0 ) {}
+
+        // create from raw integer
+        uS_t ( I64 tm ) : tm_base_t < uS_t > ( tm ) {}
+        void operator = ( I64 tm ) { val = tm; }
+
+        // create from another uS_t
+        uS_t ( const uS_t & tm ) : tm_base_t < uS_t > ( tm . val ) {}
+        void operator = ( const uS_t & tm ) { val = tm . val; }
+
+        // create from nS_t
+        uS_t ( const nS_t & tm );
+        void operator = ( const nS_t & tm );
+
+        // create from mS_t
+        uS_t ( const mS_t & tm );
+        void operator = ( const mS_t & tm );
+
+        // create from seconds
+        uS_t ( const seconds_t & tm );
+        void operator = ( const seconds_t & tm );
+    };
+
+
+    /*------------------------------------------------------------------
+     * mS_t
+     *  represents milli-seconds
+     */
+    class mS_t : public tm_base_t < mS_t >
+    {
+    public:
+
+
+        // declare uninitialized
+        mS_t () : tm_base_t < mS_t > ( 0 ) {}
+
+        // create from raw integer
+        mS_t ( I64 tm ) : tm_base_t < mS_t > ( tm ) {}
+        void operator = ( I64 tm ) { val = tm; }
+
+        // create from another mS_t
+        mS_t ( const mS_t & tm ) : tm_base_t < mS_t > ( tm . val ) {}
+        void operator = ( const mS_t & tm ) { val = tm . val; }
+
+        // create from nS_t
+        mS_t ( const nS_t & tm );
+        void operator = ( const nS_t & tm );
+
+        // create from uS_t
+        mS_t ( const uS_t & tm );
+        void operator = ( const uS_t & tm );
+
+        // create from seconds
+        mS_t ( const seconds_t & tm );
+        void operator = ( const seconds_t & tm );
+    };
+
+
+    /*------------------------------------------------------------------
+     * seconds_t
+     *  represents whole seconds
+     */
+    class seconds_t : public tm_base_t < seconds_t >
+    {
+    public:
+
+
+        // declare uninitialized
+        seconds_t () : tm_base_t < seconds_t > ( 0 ) {}
+
+        // create from raw integer
+        seconds_t ( I64 tm ) : tm_base_t < seconds_t > ( tm ) {}
+        void operator = ( I64 tm ) { val = tm; }
+
+        // create from another seconds_t
+        seconds_t ( const seconds_t & tm ) : tm_base_t < seconds_t > ( tm . val ) {}
+        void operator = ( const seconds_t & tm ) { val = tm . val; }
+
+        // create from nS_t
+        seconds_t ( const nS_t & tm );
+        void operator = ( const nS_t & tm );
+
+        // create from uS_t
+        seconds_t ( const uS_t & tm );
+        void operator = ( const uS_t & tm );
+
+        // create from mS_t
+        seconds_t ( const mS_t & tm );
+        void operator = ( const mS_t & tm );
+    };
+
+
+    /*------------------------------------------------------------------
+     * timestamp_t
+     *  
+     */
+    class timestamp_t : public nS_t
+    {
+    public:
+
+        timestamp_t () {}
+        timestamp_t ( const timestamp_t & tm )
+            : nS_t ( tm ) {}
+        void operator = ( const timestamp_t & tm )
+        { nS_t :: operator = ( tm ); }
+
+    private:
+
+        timestamp_t ( const nS_t & tm ) : nS_t ( tm ) {}
+
+        friend interface TimeMgrItf;
+    };
+
+
+    /*------------------------------------------------------------------
+     * timeout_t
+     *  represents a time period in mS for triggering events
+     *  NB - this class has OS manifest dependencies
+     */
+    class timeout_t
+    {
+    public:
+
+        // constructor to capture timeout delay
+        timeout_t ( const nS_t & delay );
+
+        // public destructor
+        ~ timeout_t ();
+
+        // initialization and copy
+        timeout_t ( const timeout_t & tm );
+        void operator = ( const timeout_t & tm );
+
+    private:
+
+        // called to prepare "to" for POSIX
+        void prepare () const;
+
+        nS_t delay;
+#if UNIX
+        mutable timestamp_t to;
+        mutable atomic_t < U32 > prepared;
+#endif
+        friend interface TimeMgrItf;
+    };
+}
+
+#endif // _hpp_vdb3_kfc_time_
diff --git a/vdb3/itf/kfc/timemgr.hpp b/vdb3/itf/kfc/timemgr.hpp
new file mode 100644
index 0000000..2180923
--- /dev/null
+++ b/vdb3/itf/kfc/timemgr.hpp
@@ -0,0 +1,94 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_timemgr_
+#define _hpp_vdb3_kfc_timemgr_
+
+#ifndef _hpp_vdb3_kfc_ref_
+#include <kfc/ref.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+    class nS_t;
+    class TimeMgr;
+    class timeout_t;
+    class Refcount;
+    class timestamp_t;
+
+
+    /*------------------------------------------------------------------
+     * TimeMgrItf
+     *  time manager
+     */
+    interface TimeMgrItf
+    {
+
+        virtual timestamp_t cur_time () const = 0;
+        void prepare_timeout ( const timeout_t & tm ) const;
+
+    protected:
+
+        static timestamp_t make_timestamp ( const nS_t & nS );
+        TimeMgr make_tmmgr_ref ( Refcount * obj, caps_t caps );
+    };
+
+
+    /*------------------------------------------------------------------
+     * TimeMgr
+     *  time manager reference
+     */
+    class TimeMgr : public Ref < TimeMgrItf >
+    {
+    public:
+
+        // return the current time
+        timestamp_t cur_time () const;
+
+        // given a timeout, prepare it for use with OS
+        // under POSIX, this may convert a time delay to absolute time
+        void prepare_timeout ( const timeout_t & tm ) const;
+
+        // C++
+        TimeMgr ();
+        TimeMgr ( const TimeMgr & r );
+        void operator = ( const TimeMgr & r );
+        TimeMgr ( const TimeMgr & r, caps_t reduce );
+
+    private:
+
+        // factory
+        TimeMgr ( Refcount * obj, TimeMgrItf * itf, caps_t caps );
+
+        friend interface TimeMgrItf;
+    };
+}
+
+#endif // _hpp_vdb3_kfc_timemgr_
diff --git a/vdb3/itf/kfc/vers.hpp b/vdb3/itf/kfc/vers.hpp
new file mode 100644
index 0000000..a10d420
--- /dev/null
+++ b/vdb3/itf/kfc/vers.hpp
@@ -0,0 +1,101 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_vers_
+#define _hpp_vdb3_kfc_vers_
+
+#ifndef _hpp_vdb3_kfc_defs_
+#include <kfc/defs.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards and externs
+     */
+
+
+    /*------------------------------------------------------------------
+     * vers_t
+     */
+    class vers_t
+    {
+    public:
+
+        U32 maj () const
+            { return ( U8 ) ( val >> 24 ); }
+
+        U32 min () const
+        { return ( U8 ) ( val >> 16 ); }
+
+        U32 rel () const
+        { return ( U8 ) ( val >> 8 ); }
+
+        U32 post () const
+        { return ( U8 ) ( val >> 0 ); }
+
+        U32 maj_min () const
+        { return ( U16 ) ( val >> 16 ); }
+
+        U32 maj_min_rel () const
+        { return ( val >> 8 ); }
+
+        U32 full () const
+        { return val; }
+
+        bool operator == ( const vers_t & v ) const
+        { return val == v . val; }
+        bool operator != ( const vers_t & v ) const
+        { return val != v . val; }
+        bool operator <  ( const vers_t & v ) const
+        { return val < v . val; }
+        bool operator <= ( const vers_t & v ) const
+        { return val <= v . val; }
+        bool operator >= ( const vers_t & v ) const
+        { return val >= v . val; }
+        bool operator >  ( const vers_t & v ) const
+        { return val > v . val; }
+
+        vers_t ();
+        vers_t ( U32 maj );
+        vers_t ( U32 maj, U32 min );
+        vers_t ( U32 maj, U32 min, U32 rel );
+        vers_t ( U32 maj, U32 min, U32 rel, U32 post );
+
+        vers_t ( const vers_t & vers )
+            : val ( vers . val ) {}
+        void operator = ( const vers_t & vers )
+            { val = vers . val; }
+
+    private:
+
+        U32 val;
+
+    };
+}
+
+#endif // _hpp_vdb3_kfc_rsrc_
diff --git a/vdb3/src/kfc/Makefile b/vdb3/src/kfc/Makefile
new file mode 100644
index 0000000..44b80b7
--- /dev/null
+++ b/vdb3/src/kfc/Makefile
@@ -0,0 +1,88 @@
+# ===========================================================================
+#
+#                            PUBLIC DOMAIN NOTICE
+#               National Center for Biotechnology Information
+#
+#  This software/database is a "United States Government Work" under the
+#  terms of the United States Copyright Act.  It was written as part of
+#  the author's official duties as a United States Government employee and
+#  thus cannot be copyrighted.  This software/database is freely available
+#  to the public for use. The National Library of Medicine and the U.S.
+#  Government have not placed any restriction on its use or reproduction.
+#
+#  Although all reasonable efforts have been taken to ensure the accuracy
+#  and reliability of the software and data, the NLM and the U.S.
+#  Government do not and cannot warrant the performance or results that
+#  may be obtained by using this software or data. The NLM and the U.S.
+#  Government disclaim all warranties, express or implied, including
+#  warranties of performance, merchantability or fitness for any particular
+#  purpose.
+#
+#  Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../../..)
+include $(TOP)/build/Makefile.config
+
+# repairs to Makefile.config
+INCDIRS = -I. -I$(TOP)/vdb3/itf
+
+OBJFILES = \
+	$(KFC_OBJ)
+
+INTLIBS = \
+	vdb3-kfc
+
+EXTLIBS =   \
+
+TARGETS =      \
+	$(INTLIBS) \
+	$(EXTLIBS)
+
+# kernel-like facilities
+KFC_SRC =    \
+	rsrc     \
+	pfdmgr   \
+	fdmgr    \
+	fd       \
+	stream   \
+	plogger  \
+	log      \
+	ptimemgr \
+	pmemmgr  \
+	syserr   \
+	string   \
+	timemgr  \
+	time     \
+	ptr      \
+	array    \
+	memmgr   \
+	memory   \
+	ref      \
+	refcount \
+	integer  \
+	except   \
+	callstk
+
+# object files
+KFC_OBJ = \
+	$(addprefix $(OBJDIR)/,$(addsuffix .$(LOBX),$(KFC_SRC)))
+
+all std: $(TARGETS)
+
+compile: $(OBJDIR) $(OBJFILES)
+
+clean:
+	rm -rf $(ILIBDIR)/$(LPFX)ngs-disp* $(OBJDIR)
+
+.PHONY: default all std $(TARGETS)
+
+vdb3-kfc: $(ILIBDIR) $(OBJDIR) $(ILIBDIR)/$(LPFX)vdb3-kfc.$(LIBX)
+
+# rule to produce the static library
+$(ILIBDIR)/$(LPFX)vdb3-kfc.$(LIBX): $(KFC_OBJ)
+	$(AR) $@ $^
diff --git a/vdb3/src/kfc/array.cpp b/vdb3/src/kfc/array.cpp
new file mode 100644
index 0000000..5fe2f52
--- /dev/null
+++ b/vdb3/src/kfc/array.cpp
@@ -0,0 +1,152 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/array.hpp>
+#include <kfc/memmgr.hpp>
+#include <kfc/caps.hpp>
+#include <kfc/except.hpp>
+#include <kfc/callstk.hpp>
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * OpaqueArray
+     *  represents a container addressable by ordinal
+     */
+
+    count_t OpaqueArray :: length () const
+    {
+        return cnt;
+    }
+
+    bytes_t OpaqueArray :: size () const
+    {
+        return m . bytes;
+    }
+
+    void * OpaqueArray :: access ( index_t offset, const bytes_t & elem_size )
+    {
+        if ( offset < 0 || ( U64 ) offset + elem_size > m . bytes )
+        {
+            FUNC_ENTRY ();
+
+            bool okay = false;
+            if ( offset >= 0 )
+            {
+                // try to resize the storage
+            }
+
+            if ( ! okay )
+            {
+                THROW ( xc_bounds_err, "memory read/write access of %lu bytes at index %ld"
+                        , ( U64 ) elem_size
+                        , offset / elem_size
+                    );
+            }
+        }
+
+        return ( void* ) ( ( char* ) m . ptr + offset );
+    }
+
+    const void * OpaqueArray :: access ( index_t offset, const bytes_t & elem_size ) const
+    {
+        if ( offset < 0 || ( U64 ) offset + elem_size > m . bytes )
+        {
+            FUNC_ENTRY ();
+            THROW ( xc_bounds_err, "memory read access of %lu bytes at index %ld"
+                    , ( U64 ) elem_size
+                    , offset / elem_size
+                );
+        }
+
+        return ( const void* ) ( ( const char* ) m . ptr + offset );
+    }
+
+    void OpaqueArray :: assign ( const OpaqueArray & r )
+    {
+        FUNC_ENTRY ();
+        m = r . m;
+        cnt = r . cnt;
+    }
+
+    OpaqueArray :: OpaqueArray ()
+        : cnt ( 0 )
+    {
+    }
+
+    OpaqueArray :: OpaqueArray ( const OpaqueArray & r )
+        : m ( r . m )
+        , cnt ( r . cnt )
+    {
+    }
+
+    OpaqueArray :: OpaqueArray ( const OpaqueArray & r, caps_t reduce )
+        : m ( r . m )
+        , cnt ( r . cnt )
+    {
+    }
+
+    OpaqueArray :: ~ OpaqueArray ()
+    {
+        cnt = 0;
+    }
+
+    OpaqueArray :: OpaqueArray ( Mem & _m, const bytes_t & elem_size )
+        : m ( _m )
+        , cnt ( 0 )
+    {
+        FUNC_ENTRY ();
+        m . get_itf ( CAP_RDWR );
+
+        if ( elem_size == ( U64 ) 0 )
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        if ( elem_size != ( U64 ) 1 )
+        {
+            if ( ( U64 ) m . bytes % elem_size != ( U64 ) 0 )
+                CONST_THROW ( xc_elem_size_err, "memory block is not an integral multiple of array element size" );
+        }
+    }
+
+    OpaqueArray :: OpaqueArray ( const Mem & _m, const bytes_t & elem_size )
+        : m ( _m )
+        , cnt ( 0 )
+    {
+        FUNC_ENTRY ();
+        m . get_itf ( CAP_READ );
+
+        if ( elem_size == ( U64 ) 0 )
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        cnt = ( U64 ) _m . bytes;
+        if ( elem_size != ( U64 ) 1 )
+        {
+            if ( ( U64 ) m . bytes % elem_size != ( U64 ) 0 )
+                CONST_THROW ( xc_elem_size_err, "memory block is not an integral multiple of array element size" );
+            cnt /= ( U64 ) elem_size;
+        }
+    }
+
+}
diff --git a/vdb3/src/kfc/callstk.cpp b/vdb3/src/kfc/callstk.cpp
new file mode 100644
index 0000000..a644462
--- /dev/null
+++ b/vdb3/src/kfc/callstk.cpp
@@ -0,0 +1,60 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/callstk.hpp>
+#include <kfc/except.hpp>
+#include <kfc/rsrc.hpp>
+
+#ifndef _hpp_vdb3_kfc_except_
+#define THROW( xc, fmt, ... ) \
+    throw fmt
+#define CONST_THROW( xc, msg ) \
+    throw msg
+#endif
+
+namespace vdb3
+{
+
+    __thread CallStk const * callstk;
+
+    CallStk :: CallStk ( const SrcLoc & sloc )
+        : caller ( callstk )
+        , depth ( 0 )
+        , src ( sloc )
+        , func ( "" )
+    {
+        if ( callstk != 0 )
+        {
+#ifdef _hpp_vdb3_kfc_rsrc_
+            assert ( rsrc != 0 );
+            FUNC_ENTRY ();
+#endif
+            CONST_THROW ( xc_program_state_violation, "not at top of call stack" );
+        }
+
+        callstk = this;
+    }
+}
diff --git a/vdb3/src/kfc/except.cpp b/vdb3/src/kfc/except.cpp
new file mode 100644
index 0000000..91d7c3e
--- /dev/null
+++ b/vdb3/src/kfc/except.cpp
@@ -0,0 +1,222 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define SRC_LOC_DEFINED
+#include <kfc/except.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/array.hpp>
+#include <kfc/ptr.hpp>
+
+#include <string.h>
+#include <ctype.h>
+
+namespace vdb3
+{
+    struct func_loc_t : SrcLoc
+    {
+        const char * mod;
+        const char * file;
+        const char * ext;
+        const char * func;
+
+        void operator = ( const CallStk & stkfrm )
+        {
+            mod = stkfrm . src . mod;
+            file = stkfrm . src . file;
+            ext = stkfrm . src . ext;
+            func = ( const char * ) stkfrm . func;
+        }
+    };
+
+#ifdef _hpp_vdb3_kfc_string_
+    static
+    String extract_method_name ( const char * pretty_func )
+    {
+        U64 i;
+        for ( i = 0; pretty_func [ i ] != 0; ++ i )
+        {
+            int ch = pretty_func [ i ];
+            if ( isalpha ( ch ) || ch == '_' )
+            {
+                U64 start = i;
+                for ( ++ i; pretty_func [ i ] != 0; ++ i )
+                {
+                    ch = pretty_func [ i ];
+                    if ( ! isalnum ( ch ) && ch != '_' )
+                    {
+                        if ( ch != ':' || pretty_func [ i + 1 ] != ':' )
+                            break;
+                        if ( isdigit ( pretty_func [ i + 2 ] ) )
+                            break;
+                        ++ i;
+                    }
+                }
+
+                if ( ch == '(' )
+                    return ConstString ( & pretty_func [ start ], i - start );
+                if ( ch == 0 )
+                    -- i;
+            }
+        }
+        return ConstString ( pretty_func, i );
+    }
+
+    String exception :: where () const
+    {
+        if ( stk . size () == ( U64 ) 0 )
+            return CONST_STRING ( "<no-stack>" );
+
+        if ( rsrc == 0 )
+            return CONST_STRING ( "<no-mem>" );
+
+        const Array < func_loc_t > a = stk;
+        const func_loc_t & loc = a [ 0 ];
+
+        ConstString m ( loc . mod, strlen ( loc . mod ) );
+        ConstString f ( loc . file, strlen ( loc . file ) );
+        ConstString x ( loc . ext, strlen ( loc . ext ) );
+        String fn ( extract_method_name ( loc . func ) );
+        //const_str_t fn ( loc . func, strlen ( loc . func ) );
+
+        StringBuffer sb ( "%s/%s.%s:%u %s", & m, & f, & x, lineno, & fn );
+        return sb . to_str ();
+    }
+
+    String exception :: stack_trace () const
+    {
+        count_t depth = stk . size () / sizeof ( func_loc_t );
+
+        if ( stk . size () == ( U64 ) 0 )
+            return CONST_STRING ( "<no-stack>" );
+
+        if ( rsrc == 0 )
+            return CONST_STRING ( "<no-mem>" );
+
+        StringBuffer sb;
+        Array < const func_loc_t > a = stk;
+
+        for ( count_t i = 0; i < depth; ++ i )
+        {
+            const func_loc_t & loc = a [ i ];
+
+            ConstString m ( loc . mod, strlen ( loc . mod ) );
+            ConstString f ( loc . file, strlen ( loc . file ) );
+            ConstString x ( loc . ext, strlen ( loc . ext ) );
+            String fn ( extract_method_name ( loc . func ) );
+            //const_str_t fn ( loc . func, strlen ( loc . func ) );
+
+            if ( i == 0 )
+                sb . append ( "  %s/%s.%s:%u %s\n", & m, & f, & x, lineno, & fn );
+            else
+                sb . append ( "  %s/%s.%s %s\n", & m, & f, & x, & fn );
+        }
+
+        // this is optional...
+        sb . trim_eoln ();
+
+        return sb . to_str ();
+    }
+
+    String exception :: module () const
+    {
+        if ( stk . size () == ( U64 ) 0 )
+            return CONST_STRING ( "<no-stack>" );
+
+        const Array < func_loc_t > a = stk;
+        const char * text = a [ 0 ] . mod;
+
+        return ConstString ( text, strlen ( text ) );
+    }
+
+    String exception :: file () const
+    {
+        if ( stk . size () == ( U64 ) 0 )
+            return CONST_STRING ( "<no-stack>" );
+
+        const Array < func_loc_t > a = stk;
+        const char * text = a [ 0 ] . file;
+
+        return ConstString ( text, strlen ( text ) );
+    }
+
+    String exception :: ext () const
+    {
+        if ( stk . size () == ( U64 ) 0 )
+            return CONST_STRING ( "<no-stack>" );
+
+        const Array < func_loc_t > a = stk;
+        const char * text = a [ 0 ] . ext;
+
+        return ConstString ( text, strlen ( text ) );
+    }
+
+    String exception :: func () const
+    {
+        if ( stk . size () == ( U64 ) 0 )
+            return CONST_STRING ( "<no-stack>" );
+
+        const Array < func_loc_t > a = stk;
+        const char * text = a [ 0 ] . func;
+
+        return ConstString ( text, strlen ( text ) );
+    }
+#endif
+
+    exception :: ~ exception ()
+    {
+    }
+
+#ifndef _hpp_vdb3_kfc_string_
+    exception :: exception ( U32 line, const char * m )
+        : msg ( m )
+        , lineno ( line )
+    {
+    }
+#else
+    exception :: exception ( U32 line, const String & m )
+        : msg ( m )
+        , lineno ( line )
+    {
+        if ( rsrc != 0 && callstk != 0 )
+        {
+            size_t frm_bytes = callstk -> depth * sizeof ( func_loc_t );
+            if ( callstk -> depth != 0 ) try
+            {
+                Mem stk_tmp = rsrc -> mmgr . alloc ( frm_bytes, true );
+                Ptr < func_loc_t > p = stk_tmp;
+                for ( const CallStk * s = callstk; s -> depth != 0; ++ p, s = s -> caller )
+                    * p = * s;
+                stk = stk_tmp;
+            }
+            catch ( ... )
+            {
+            }
+        }
+    }
+#endif
+
+}
diff --git a/vdb3/src/kfc/fd.cpp b/vdb3/src/kfc/fd.cpp
new file mode 100644
index 0000000..f9b3bf0
--- /dev/null
+++ b/vdb3/src/kfc/fd.cpp
@@ -0,0 +1,204 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/fd.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/caps.hpp>
+#include <kfc/except.hpp>
+#include <kfc/syserr.hpp>
+#include <kfc/array.hpp>
+
+#if UNIX
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#else
+#error "unsupported target platform"
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * FileDescImpl
+     *  a Unix file-descriptor
+     */
+
+    // StreamItf
+    bytes_t FileDescImpl :: read ( const bytes_t & num_bytes,
+        Mem & dst, const bytes_t & start )
+    {
+        FUNC_ENTRY ();
+
+        // parameters have already been checked
+        assert ( start < dst . size () );
+        assert ( start + num_bytes <= dst . size () );
+
+        // interfacing with native OS requires exceptional access
+        Array < U8 > a = dst;
+        void * addr = & a [ start ];
+
+#if UNIX
+        ssize_t num_read = 0;
+        while ( 1 )
+        {
+            num_read = :: read ( fd, addr, ( size_t ) ( U64 ) num_bytes );
+            if ( num_read >= 0 )
+                break;
+
+            int _fd = fd;
+            int status = errno;
+            switch ( status )
+            {
+            case EINTR:
+                break;
+            case EBADF:
+                fd = -1;
+                owned = false;
+                THROW ( xc_param_err, "bad fd: %d", _fd );
+            case EFAULT:
+                // super-internal error, wow.
+                THROW ( xc_internal_err, "bad address from meory: 0x016X", ( U64 ) addr );
+            case EAGAIN:
+                // this is essentially a timeout error
+            case EINVAL:
+            case EIO:
+            case EISDIR:
+            default:
+                THROW_OSERR ( read, status );
+            }
+        }
+
+        return bytes_t ( num_read );
+#endif
+    }
+
+    bytes_t FileDescImpl :: write ( const bytes_t & num_bytes,
+        const Mem & src, const bytes_t & start )
+    {
+        FUNC_ENTRY ();
+
+        // parameters have already been checked
+        assert ( start < src . size () );
+        assert ( start + num_bytes <= src . size () );
+
+        // interfacing with native OS requires exceptional access
+        const Array < U8 > a = src;
+        const void * addr = & a [ start ];
+
+#if UNIX
+        ssize_t num_writ = 0;
+        while ( 1 )
+        {
+            num_writ = :: write ( fd, addr, ( size_t ) ( U64 ) num_bytes );
+            if ( num_writ >= 0 )
+                break;
+
+            int _fd = fd;
+            int status = errno;
+            switch ( status )
+            {
+            case EINTR:
+                break;
+            case ENOSPC:
+                THROW ( xc_no_mem, "attempt to write %lu bytes exceeds volume limits", ( U64 ) num_bytes );
+            case EFBIG:
+                THROW ( xc_bounds_err, "attempt to write %lu bytes exceeds limit", ( U64 ) num_bytes );
+            case EBADF:
+                fd = -1;
+                owned = false;
+                THROW ( xc_param_err, "bad fd: %d", _fd );
+            case EFAULT:
+                // super-internal error, wow.
+                THROW ( xc_internal_err, "bad address from meory: 0x016X", ( U64 ) addr );
+            case EAGAIN:
+                // this is essentially a timeout error
+            case EINVAL:
+            case EIO:
+            case EISDIR:
+            default:
+                THROW_OSERR ( write, status );
+            }
+        }
+
+        return bytes_t ( num_writ );
+#endif
+    }
+
+    bytes_t FileDescImpl :: get_mtu () const
+    {
+        FUNC_ENTRY ();
+
+        // TBD - determine proper MTU for device
+        return bytes_t ( 4096 );
+    }
+
+    // C++
+    FileDescImpl :: FileDescImpl ( int _fd, bool _owned )
+        : fd ( _fd )
+        , owned ( _owned )
+    {
+        assert ( _fd >= 0 );
+    }
+
+    FileDescImpl :: ~ FileDescImpl ()
+    {
+        if ( owned )
+            close ( fd );
+    }
+
+
+    /*------------------------------------------------------------------
+     * FileDesc
+     *  a reference to a Unix file-descriptor
+     */
+
+    FileDesc :: FileDesc ()
+    {
+    }
+
+    FileDesc :: FileDesc ( const FileDesc & r )
+        : Ref < FileDescImpl > ( r )
+    {
+    }
+
+    void FileDesc :: operator = ( const FileDesc & r )
+    {
+        Ref < FileDescImpl > :: operator = ( r );
+    }
+
+    FileDesc :: FileDesc ( const FileDesc & r, caps_t reduce )
+        : Ref < FileDescImpl > ( r, reduce )
+    {
+    }
+
+    FileDesc :: FileDesc ( FileDescImpl * obj, caps_t caps )
+        : Ref < FileDescImpl > ( obj, caps )
+    {
+    }
+
+}
diff --git a/vdb3/src/kfc/fdmgr.cpp b/vdb3/src/kfc/fdmgr.cpp
new file mode 100644
index 0000000..d981f22
--- /dev/null
+++ b/vdb3/src/kfc/fdmgr.cpp
@@ -0,0 +1,101 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/fdmgr.hpp>
+#include <kfc/fd.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/except.hpp>
+#include <kfc/caps.hpp>
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * FDMgrItf
+     *  file descriptor manager
+     *  an inverted bit of logic that tries to control the number
+     *  of Unix file descriptors in use
+     */
+
+    FileDesc FDMgrItf :: make_fd_ref ( FileDescImpl * obj, caps_t caps )
+    {
+        return FileDesc ( obj, caps );
+    }
+
+    FDMgr FDMgrItf :: make_fdmgr_ref ( Refcount * obj, caps_t caps )
+    {
+        return FDMgr ( obj, this, caps );
+    }
+
+
+    /*------------------------------------------------------------------
+     * FDMgr
+     *  file descriptor manager reference
+     */
+
+
+    FileDesc FDMgr :: make ( int fd, caps_t caps, bool owned ) const
+    {
+        FUNC_ENTRY ();
+
+        // should examine the fd to be open, etc.
+        if ( fd < 0 )
+            THROW ( xc_param_err, "bad fd: %d", fd );
+
+        // limit caps
+        caps &= CAP_PROP_READ | CAP_PROP_WRITE | CAP_RDWR | CAP_RESIZE;
+
+        // ask manager to create one
+        FDMgrItf * itf = get_itf ( CAP_ALLOC );
+        return itf -> make ( fd, caps, owned );
+    }
+
+    FDMgr :: FDMgr ()
+    {
+    }
+
+    FDMgr :: FDMgr ( const FDMgr & r )
+        : Ref < FDMgrItf > ( r )
+    {
+    }
+
+    void FDMgr :: operator = ( const FDMgr & r )
+    {
+        Ref < FDMgrItf > :: operator = ( r );
+    }
+
+    FDMgr :: FDMgr ( const FDMgr & r, caps_t reduce )
+        : Ref < FDMgrItf > ( r, reduce )
+    {
+    }
+
+    FDMgr :: FDMgr ( Refcount * obj, FDMgrItf * itf, caps_t caps )
+        : Ref < FDMgrItf > ( obj, itf, caps )
+    {
+    }
+
+}
diff --git a/vdb3/src/kfc/integer.cpp b/vdb3/src/kfc/integer.cpp
new file mode 100644
index 0000000..61f8315
--- /dev/null
+++ b/vdb3/src/kfc/integer.cpp
@@ -0,0 +1,137 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/defs.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/except.hpp>
+
+namespace vdb3
+{
+
+    template < class IT, class VT >
+    IT integer_t < IT, VT > :: operator / ( const IT & i ) const
+    {
+        if ( i . val == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+        return IT ( val / i . val );
+    }
+
+    template < class IT, class VT >
+    IT integer_t < IT, VT > :: operator % ( const IT & i ) const
+    {
+        if ( i . val == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+        return IT ( val % i . val );
+    }
+
+    template < class IT, class VT >
+    IT & integer_t < IT, VT > :: operator /= ( const IT & i )
+    {
+        if ( i . val == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+
+        val /= i . val;
+        return * ( IT * ) this;
+    }
+
+    template < class IT, class VT >
+    IT & integer_t < IT, VT > :: operator %= ( const IT & i )
+    {
+        if ( i . val == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+
+        val %= i . val;
+        return * ( IT * ) this;
+    }
+
+#if ALLOW_RAW_CONSTANTS
+
+    template < class IT, class VT >
+    IT integer_t < IT, VT > :: operator / ( VT i ) const
+    {
+        if ( i == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+        return IT ( val / i );
+    }
+
+    template < class IT, class VT >
+    IT integer_t < IT, VT > :: operator % ( VT i ) const
+    {
+        if ( i == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+        return IT ( val % i );
+    }
+
+    template < class IT, class VT >
+    IT & integer_t < IT, VT > :: operator /= ( VT i )
+    {
+        if ( i == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+
+        val /= i;
+        return * ( IT * ) this;
+    }
+
+    template < class IT, class VT >
+    IT & integer_t < IT, VT > :: operator %= ( VT i )
+    {
+        if ( i == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+
+        val %= i;
+        return * ( IT * ) this;
+    }
+
+#endif
+
+    template class integer_t < bytes_t, U64 >;
+    template class integer_t < bitsz_t, U64 >;
+    
+}
diff --git a/vdb3/src/kfc/log.cpp b/vdb3/src/kfc/log.cpp
new file mode 100644
index 0000000..cffed96
--- /dev/null
+++ b/vdb3/src/kfc/log.cpp
@@ -0,0 +1,142 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/log.hpp>
+#include <kfc/refcount.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/caps.hpp>
+
+namespace vdb3
+{
+
+    // not valid for setting level, used internally
+    const LogLevel log_disabled = ( LogLevel ) 0;
+    const LogLevel dflt_log_level = log_info;
+
+    /*------------------------------------------------------------------
+     * LoggerItf
+     */
+
+    Log LoggerItf :: make_ref ( Refcount * obj, caps_t caps )
+    {
+        return Log ( obj, this, caps );
+    }
+
+    void * LoggerItf :: cast ( Refcount * obj )
+    {
+        return ( void * )  dynamic_cast < LoggerItf * > ( obj );
+    }
+
+
+    /*------------------------------------------------------------------
+     * Log
+     *  logging formatter
+     *  handles output to the log stream
+     */
+
+    void Log :: set_level ( LogLevel level )
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_PROP_WRITE );
+
+        if ( level >= log_emerg && level <= log_info )
+            lvl = level;
+    }
+
+    // log message
+    void Log :: msg ( LogLevel priority, const char * fmt, ... ) const
+    {
+        if ( priority <= lvl )
+        {
+            FUNC_ENTRY ();
+
+            va_list args;
+            va_start ( args, fmt );
+
+            try
+            {
+                LoggerItf * logger = get_itf ( CAP_WRITE );
+                logger -> msg ( priority, fmt, args );
+            }
+            catch ( ... )
+            {
+                va_end ( args );
+                throw;
+            }
+
+            va_end ( args );
+        }
+    }
+
+    void Log :: vmsg ( LogLevel priority, const char * fmt, va_list args ) const
+    {
+        if ( priority <= lvl )
+        {
+            FUNC_ENTRY ();
+
+            LoggerItf * logger = get_itf ( CAP_WRITE );
+            logger -> msg ( priority, fmt, args );
+        }
+    }
+
+    // C++
+    Log :: Log ()
+        : lvl ( log_disabled )
+    {
+    }
+
+    Log :: Log ( const Log & r )
+        : Ref < LoggerItf > ( r )
+        , lvl ( r . lvl )
+    {
+    }
+
+    void Log :: operator = ( const Log & r )
+    {
+        FUNC_ENTRY ();
+        Ref < LoggerItf > :: operator = ( r );
+        lvl = r . lvl;
+    }
+
+    Log :: Log ( const Log & r, caps_t reduce )
+        : Ref < LoggerItf > ( r, reduce )
+        , lvl ( r . lvl )
+    {
+    }
+
+    // factory
+    Log :: Log ( Refcount * obj, LoggerItf * itf, caps_t caps )
+        : Ref < LoggerItf > ( obj, itf, caps )
+        , lvl ( dflt_log_level )
+    {
+    }
+
+    Log :: ~ Log ()
+    {
+        lvl = log_disabled;
+    }
+
+}
diff --git a/vdb3/src/kfc/memmgr.cpp b/vdb3/src/kfc/memmgr.cpp
new file mode 100644
index 0000000..4a625ff
--- /dev/null
+++ b/vdb3/src/kfc/memmgr.cpp
@@ -0,0 +1,162 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/memmgr.hpp>
+#include <kfc/memory.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/caps.hpp>
+#include <kfc/callstk.hpp>
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * MemMgrItf
+     *  memory manager interface
+     */
+
+    // support for C++ new and delete
+    void * MemMgrItf :: _new ( size_t bytes )
+    {
+        FUNC_ENTRY ();
+
+        // allocate new object plus header size
+        Refcount * obj = ( Refcount * ) _alloc ( bytes, true );
+        obj -> mmgr = ( MemMgrItf * ) duplicate ();
+        obj -> obj_size = bytes;
+
+        // return allocation
+        return ( void * ) obj;
+    }
+
+    void MemMgrItf :: _delete ( void * ptr )
+    {
+        Refcount * obj;
+
+        if ( ( size_t ) ptr >= sizeof * obj )
+        {
+            FUNC_ENTRY ();
+
+            // convert pointer back to Refcount
+            obj = ( Refcount * ) ptr;
+
+            // recover the original memory manager interface
+            MemMgrItf * self = obj -> mmgr;
+            assert ( self != 0 );
+
+            // free the memory
+            self -> _free ( ( void * ) obj, obj -> obj_size );
+
+            // detach from memmgr
+            self -> release ();
+        }
+    }
+
+    MemMgr MemMgrItf :: make_mmgr_ref ( Refcount * obj, caps_t caps )
+    {
+        // TBD - can set max capabilities here
+        return MemMgr ( obj, this, caps );
+    }
+
+    Mem MemMgrItf :: make_mem_ref ( Refcount * obj, MemoryItf * itf, caps_t caps )
+    {
+        // TBD - can set max capabilities here
+        return Mem ( obj, itf, caps );
+    }
+
+
+    /*------------------------------------------------------------------
+     * MemMgr
+     *  memory manager reference
+     */
+
+    // allocate memory 
+    Mem MemMgr :: alloc ( const bytes_t & size, bool clear ) const
+    {
+        FUNC_ENTRY ();
+        MemMgrItf * itf = get_itf ( CAP_ALLOC );
+        return itf -> alloc ( size, clear );
+    }
+
+
+    // make a block of constant memory
+    Mem MemMgr :: make_const ( const void * ptr, const bytes_t & size ) const
+    {
+        FUNC_ENTRY ();
+
+        if ( ptr == 0 && size != ( U64 ) 0 )
+        {
+            if ( rsrc == 0 )
+                throw "null const memory block";
+            THROW ( xc_null_param_err, "null pointer with size %lu", ( U64 ) size );
+        }
+
+        MemMgrItf * itf = get_itf ( CAP_ALLOC );
+        return itf -> make_const ( ptr, size );
+    }
+
+    // C++
+    MemMgr :: MemMgr ()
+    {
+    }
+
+    MemMgr :: MemMgr ( const MemMgr & r )
+        : Ref < MemMgrItf > ( r )
+    {
+    }
+
+    void MemMgr :: operator = ( const MemMgr & r )
+    {
+        Ref < MemMgrItf > :: operator = ( r );
+    }
+
+    MemMgr :: MemMgr ( const MemMgr & r, caps_t reduce )
+        : Ref < MemMgrItf > ( r, reduce )
+    {
+    }
+
+    // support for "new" and "delete" operators
+    void * MemMgr :: _new ( size_t bytes ) const
+    {
+        FUNC_ENTRY ();
+        MemMgrItf * itf = get_itf ( CAP_ALLOC );
+        return itf -> _new ( bytes );
+    }
+
+    void MemMgr :: _delete ( void * ptr ) const
+    {
+        FUNC_ENTRY ();
+        return MemMgrItf :: _delete ( ptr );
+    }
+
+    // initialization by MemMgrItf
+    MemMgr :: MemMgr ( Refcount * obj, MemMgrItf * itf, caps_t caps )
+        : Ref < MemMgrItf > ( obj, itf, caps )
+    {
+    }
+
+
+}
diff --git a/vdb3/src/kfc/memory.cpp b/vdb3/src/kfc/memory.cpp
new file mode 100644
index 0000000..d9eb807
--- /dev/null
+++ b/vdb3/src/kfc/memory.cpp
@@ -0,0 +1,392 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/memory.hpp>
+#include <kfc/memmgr.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/except.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/caps.hpp>
+
+#include <string.h>
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * MemoryItf
+     *  an interface representing a block of storage
+     */
+
+    MemMgrItf * MemoryItf :: get_mmgr () const
+    {
+        return mmgr;
+    }
+
+    void * MemoryItf :: cast ( Refcount * obj )
+    {
+        return ( void * ) dynamic_cast < MemoryItf * > ( obj );
+    }
+
+
+    /*------------------------------------------------------------------
+     * Mem
+     *  an object representing a range of address space
+     */
+
+    bytes_t Mem :: size () const
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_PROP_READ );
+        return bytes;
+    }
+
+    index_t Mem :: find_first ( U8 byte ) const
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_READ );
+
+        void * loc = memchr ( ptr, byte, bytes );
+        if ( loc != 0 )
+            return ( char * ) loc - ( char * ) ptr;
+
+        return ( I64 ) -1;
+    }
+
+    index_t Mem :: find_first ( U8 byte, index_t offset ) const
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_READ );
+
+        if ( offset < ( I64 ) 0 || ( U64 ) offset >= bytes )
+            return -1;
+
+        const char * p = ( const char * ) ptr;
+        void * loc = memchr ( & p [ offset ], byte, bytes - ( U64 ) offset );
+        if ( loc != 0 )
+            return ( const char * ) loc - p;
+
+        return ( I64 ) -1;
+    }
+
+    index_t Mem :: find_first ( U8 byte, index_t offset, const bytes_t & _sz ) const
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_READ );
+
+        size_t sz = _sz;
+
+        if ( offset < ( I64 ) 0 || ( U64 ) offset >= bytes )
+            return -1;
+
+        if ( sz + offset > bytes )
+            sz = bytes - ( U64 ) offset;
+
+        const char * p = ( const char * ) ptr;
+        void * loc = memchr ( & p [ offset ], byte, sz );
+        if ( loc != 0 )
+            return ( const char * ) loc - p;
+
+        return ( I64 ) -1;
+    }
+
+    Mem Mem :: subrange ( index_t offset ) const
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_SUBRANGE );
+
+        Mem m ( * this );
+        if ( offset < ( I64 ) 0 || ( U64 ) offset >= bytes )
+        {
+            m . ptr = ( void* ) & ( ( char* ) ptr ) [ bytes ];
+            m . bytes = ( U64 ) 0;
+        }
+        else
+        {
+            m . ptr = ( void* ) & ( ( char* ) ptr ) [ offset ];
+            m . bytes = ( U64 ) bytes - ( U64 ) offset;
+        }
+
+        return m;
+    }
+
+    Mem Mem :: subrange ( index_t offset, const bytes_t & _sz ) const
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_SUBRANGE );
+
+        U64 sz = _sz;
+
+        Mem m ( * this );
+
+        if ( offset < ( I64 ) 0 || ( U64 ) offset >= bytes )
+        {
+            m . ptr = ( void* ) & ( ( char* ) ptr ) [ bytes ];
+            m . bytes = ( U64 ) 0;
+        }
+        else
+        {
+            U64 b = ( U64 ) bytes - ( U64 ) offset;
+            if ( sz > b )
+                sz = b;
+
+            m . ptr = ( void* ) & ( ( char* ) ptr ) [ offset ];
+            m . bytes = sz;
+        }
+
+        return m;
+    }
+
+    void Mem :: resize ( const bytes_t & sz, bool clear )
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_RESIZE );
+
+        // early cheap detection of noop
+        if ( sz == bytes )
+            return;
+
+        // a null ref can be resized to allocate
+        if ( ptr == 0 )
+        {
+            assert ( bytes == ( U64 ) 0 );
+#ifdef _hpp_vdb3_rsrc_
+            * this = rsrc -> mmgr . alloc ( sz, clear );
+#else
+            CONST_THROW ( xc_unimplemented_err, "unimplemented" );
+#endif
+        }
+        else
+        {
+            assert ( bytes != ( U64 ) 0 );
+
+            MemoryItf * itf = get_itf ( CAP_RESIZE );
+
+            // there are cases when the obj can be null
+            if ( itf == 0 )
+            {
+#ifdef _hpp_vdb3_rsrc_
+                // ref represents constant data, not heap data
+                Mem tmp = rsrc -> mmgr . alloc ( sz, false );
+
+                // copy in data from self
+                bytes_t num_writ = tmp . copy ( bytes, 0, * this, 0 );
+                if ( bytes >= sz )
+                    assert ( num_writ == sz );
+                else
+                {
+                    assert ( num_writ == bytes );
+                    if ( clear )
+                    {
+                        bytes_t num_zeroed = tmp . fill ( ( U64 ) sz - bytes, ( I64 ) ( U64 ) num_writ, 0 );
+                        assert ( num_writ + num_zeroed == sz );
+                    }
+                }
+
+                * this = tmp;
+#else
+                CONST_THROW ( xc_unimplemented_err, "unimplemented" );
+#endif
+            }
+            else
+            {
+                // normal case
+                itf -> resize ( sz, clear );
+                ptr = itf -> get_mapped_memory ( & bytes );
+            }
+        }
+    }
+
+    bytes_t Mem :: copy ( const bytes_t & _amount,
+        index_t dst_offset, const Mem & src, index_t src_offset )
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_WRITE );
+        src . test_caps ( CAP_READ );
+
+        U64 amount = _amount;
+
+        if ( dst_offset < 0 || ( U64 ) dst_offset >= bytes ||
+             src_offset < 0 || ( U64 ) src_offset >= src . bytes )
+            return bytes_t ( 0 );
+
+        if ( amount + dst_offset > bytes )
+            amount = ( U64 ) bytes - dst_offset;
+        if ( amount + src_offset > src . bytes )
+            amount = ( U64 ) src . bytes - src_offset;
+
+        if ( amount != 0 )
+        {
+            char * dp = ( char * ) ptr;
+            const char * sp = ( const char * ) src . ptr;
+            memmove ( & dp [ dst_offset ], & sp [ src_offset ], ( size_t ) amount );
+        }
+
+        return bytes_t ( amount );
+    }
+
+    CopyUntilRslt Mem :: copy_until ( const bytes_t & _amount,
+        U8 stop_byte, index_t dst_offset, const Mem & src, index_t src_offset )
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_WRITE );
+        src . test_caps ( CAP_READ );
+
+        U64 amount = _amount;
+        bool found = false;
+
+        if ( dst_offset < 0 || ( U64 ) dst_offset >= bytes ||
+             src_offset < 0 || ( U64 ) src_offset >= src . bytes )
+            return CopyUntilRslt ( 0, false );
+
+        if ( amount + dst_offset > bytes )
+            amount = ( U64 ) bytes - dst_offset;
+        if ( amount + src_offset > src . bytes )
+            amount = ( U64 ) src . bytes - src_offset;
+
+        if ( amount != 0 )
+        {
+            U8 * dp = ( U8 * ) ptr + dst_offset;
+            const U8 * sp = ( const U8 * ) src . ptr + src_offset;
+            for ( U64 i = 0; i < amount; ++ i )
+            {
+                if ( ( dp [ i ] = sp [ i ] ) == stop_byte )
+                {
+                    amount = i + 1;
+                    found = true;
+                    break;
+                }
+            }
+        }
+
+        return CopyUntilRslt ( amount, found );
+    }
+
+    bytes_t Mem :: fill ( count_t repeat, index_t offset, U8 byte )
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_WRITE );
+
+        if ( offset < 0 || ( U64 ) offset >= bytes )
+            return bytes_t ( 0 );
+
+        if ( repeat + offset > bytes )
+            repeat = ( U64 ) bytes - offset;
+
+        if ( repeat != 0 )
+        {
+            char * p = ( char * ) ptr;
+            memset ( & p [ offset ], byte, ( size_t ) repeat );
+        }
+
+        return bytes_t ( repeat );
+    }
+
+    bool Mem :: operator == ( const Mem & m ) const
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_READ );
+        m . test_caps ( CAP_READ );
+
+        if ( bytes == m . bytes )
+        {
+            if ( ptr == m . ptr )
+                return true;
+            return memcmp ( ptr, m . ptr, bytes ) == 0;
+        }
+
+        return false;
+    }
+
+    bool Mem :: operator != ( const Mem & m ) const
+    {
+        FUNC_ENTRY ();
+        test_caps ( CAP_READ );
+        m . test_caps ( CAP_READ );
+
+        if ( bytes == m . bytes )
+        {
+            if ( ptr == m . ptr )
+                return false;
+            return memcmp ( ptr, m . ptr, bytes ) != 0;
+        }
+
+        return true;
+    }
+
+    Mem :: Mem ()
+        : ptr ( 0 )
+        , bytes ( 0 )
+    {
+    }
+
+    Mem :: ~ Mem ()
+    {
+        ptr = 0;
+        bytes = 0;
+    }
+
+    Mem :: Mem ( const Mem & r )
+        : Ref < MemoryItf > ( r )
+        , ptr ( r . ptr )
+        , bytes ( r . bytes )
+    {
+    }
+
+    void Mem :: operator = ( const Mem & r )
+    {
+        Ref < MemoryItf > :: operator = ( r );
+        ptr = r . ptr;
+        bytes = r . bytes;
+    }
+
+    Mem :: Mem ( const Mem & r, caps_t reduce )
+        : Ref < MemoryItf > ( r, reduce )
+        , ptr ( r . ptr )
+        , bytes ( r . bytes )
+    {
+    }
+
+    Mem :: Mem ( Refcount * obj, MemoryItf * itf, caps_t caps )
+        : Ref < MemoryItf > ( obj, itf, caps )
+        , ptr ( 0 )
+        , bytes ( 0 )
+    {
+        if ( itf != 0 )
+            ptr = itf -> get_mapped_memory ( & bytes );
+    }
+
+#if 0
+    Mem :: Mem ( const void * _ptr, const bytes_t & sz )
+        : Ref < MemoryItf > ( 0, CAP_READ | CAP_PROP_READ | CAP_CAST )
+        , ptr ( ( void * ) _ptr )
+        , bytes ( sz )
+    {
+        if ( _ptr == 0 )
+            bytes = ( U64 ) 0;
+    }
+#endif
+}
diff --git a/vdb3/src/kfc/pfdmgr.cpp b/vdb3/src/kfc/pfdmgr.cpp
new file mode 100644
index 0000000..9fb794d
--- /dev/null
+++ b/vdb3/src/kfc/pfdmgr.cpp
@@ -0,0 +1,64 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pfdmgr.hpp"
+#include <kfc/fd.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/except.hpp>
+#include <kfc/caps.hpp>
+
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * PrimordFDMgr
+     */
+
+    FDMgr PrimordFDMgr :: make_primordial ()
+    {
+        FUNC_ENTRY ();
+        PrimordFDMgr * obj = new PrimordFDMgr;
+        return obj -> make_fdmgr_ref ( obj, CAP_ALLOC );
+    }
+
+    FileDesc PrimordFDMgr :: make ( int fd, caps_t caps, bool owned )
+    {
+        FUNC_ENTRY ();
+        FileDescImpl * obj = new FileDescImpl ( fd, owned );
+        return FDMgrItf :: make_fd_ref ( obj, caps );
+    }
+
+    PrimordFDMgr :: PrimordFDMgr ()
+    {
+    }
+
+    PrimordFDMgr :: ~ PrimordFDMgr ()
+    {
+    }
+
+}
diff --git a/vdb3/src/kfc/pfdmgr.hpp b/vdb3/src/kfc/pfdmgr.hpp
new file mode 100644
index 0000000..f787e60
--- /dev/null
+++ b/vdb3/src/kfc/pfdmgr.hpp
@@ -0,0 +1,68 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_pfdmgr_
+#define _hpp_vdb3_kfc_pfdmgr_
+
+#ifndef _hpp_vdb3_kfc_refcount_
+#include <kfc/refcount.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_fdmgr_
+#include <kfc/fdmgr.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * forwards
+     */
+
+
+    /*------------------------------------------------------------------
+     * exceptions
+     */
+
+
+    /*------------------------------------------------------------------
+     * PrimordFDMgr
+     */
+    class PrimordFDMgr : public Refcount
+         , implements FDMgrItf
+    {
+    public:
+
+        static FDMgr make_primordial ();
+
+        virtual FileDesc make ( int fd, caps_t caps, bool owned );
+
+        PrimordFDMgr ();
+        ~ PrimordFDMgr ();
+    };
+}
+
+#endif // _hpp_vdb3_kfc_pfdmgr_
diff --git a/vdb3/src/kfc/plogger.cpp b/vdb3/src/kfc/plogger.cpp
new file mode 100644
index 0000000..3f38463
--- /dev/null
+++ b/vdb3/src/kfc/plogger.cpp
@@ -0,0 +1,148 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "plogger.hpp"
+#include <kfc/callstk.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/string.hpp>
+#include <kfc/caps.hpp>
+
+#if UNIX
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#else
+#error "unsupported target platform"
+#endif
+
+namespace vdb3
+{
+    Log plogger_t :: make ( const char * ident )
+    {
+        FUNC_ENTRY ();
+
+        // going to record a "hostname procname[pid]"
+        StringBuffer hostproc;
+
+        // create a newline
+        ConstString newline ( "\n", 1 );
+#if UNIX
+        // hostname
+        char namebuf [ 512 ];
+        int status = gethostname ( namebuf, sizeof namebuf );
+        if ( status != 0 )
+        {
+            strncpy ( namebuf, "<HOST-UNKNOWN>", sizeof namebuf );
+            status = 0;
+        }
+        ConstString hostname ( namebuf, strlen ( namebuf ) );
+
+        // process id
+        pid_t pid = getpid ();
+
+        // process name
+        if ( ident == 0 || ident [ 0 ] == 0 )
+            hostproc . append ( "%s[%d]", & hostname, pid );
+        else
+        {
+            const char * leaf = strrchr ( ident, '/' );
+            if ( leaf ++ == 0 )
+                leaf = ident;
+            ConstString procname ( leaf, strlen ( leaf ) );
+
+            hostproc . append ( "%s %s[%d]", & hostname, & procname, pid );
+        }
+#endif
+
+        plogger_t * obj = new plogger_t ( hostproc . to_str (), newline );
+        return obj ->  make_ref ( obj, CAP_WRITE );
+    }
+
+    void plogger_t :: msg ( LogLevel priority, const char * fmt, va_list args )
+    {
+        // guard against /dev/null
+        if ( ! rsrc -> err )
+            return;
+
+        FUNC_ENTRY ();
+
+        static const char * months [ 12 ] =
+        {
+            "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+            "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+        };
+
+#if UNIX
+        // timestamp
+        // TBD - this should be entirely through timemgr
+#warning "timestamp should be via TimeMgrItf"
+        time_t secs = time ( 0 );
+        struct tm tm = * localtime ( & secs );
+
+        // create month string
+        assert ( tm . tm_mon >= 0 && tm . tm_mon < 12 );
+        ConstString month ( months [ tm . tm_mon ], 3 );
+
+        // timestamp: 'Sep 25 10:49:18'
+        // print timestamp, host&process[pid]
+        StringBuffer buffer ( "%s %2d %02d:%02d:%02d %s: "
+                              , & month
+                              , tm . tm_mday
+                              , tm . tm_hour
+                              , tm . tm_min
+                              , tm . tm_sec
+                              , & hostproc
+            );
+#endif
+    
+        // print message
+        if ( fmt != 0 && fmt [ 0 ] != 0 )
+            buffer . vappend ( fmt, args );
+
+        // trim off trailing white-space
+        buffer . trim ();
+
+        // end with newline
+        buffer += newline;
+
+        // extract memory from string
+        String str = buffer . to_str ();
+
+        // copy to log stream
+        rsrc -> err . write_all ( str . to_mem () );
+    }
+
+    plogger_t :: plogger_t ( const String & ident, const String & nl )
+        : hostproc ( ident )
+        , newline ( nl )
+    {
+    }
+
+    plogger_t :: ~ plogger_t ()
+    {
+    }
+}
diff --git a/vdb3/src/kfc/plogger.hpp b/vdb3/src/kfc/plogger.hpp
new file mode 100644
index 0000000..c52564c
--- /dev/null
+++ b/vdb3/src/kfc/plogger.hpp
@@ -0,0 +1,72 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_plogger_
+#define _hpp_vdb3_kfc_plogger_
+
+#ifndef _hpp_vdb3_kfc_refcount_
+#include <kfc/refcount.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_log_
+#include <kfc/log.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_string_
+#include <kfc/string.hpp>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * plogger_t
+     *  simulates syslog-style output
+     */
+    class plogger_t : public Refcount
+        , implements LoggerItf
+    {
+    public:
+
+        // make the primoridal logger with argv[0]
+        static Log make ( const char * ident );
+
+        // format the output a la syslog
+        virtual void msg ( LogLevel priority, const char * fmt, va_list args );
+
+        ~ plogger_t ();
+
+    private:
+
+        plogger_t ( const String & hostproc, const String & newline );
+
+        String hostproc;
+        String newline;
+    };
+
+}
+
+#endif // _hpp_vdb3_kfc_plogger_
diff --git a/vdb3/src/kfc/pmemmgr.cpp b/vdb3/src/kfc/pmemmgr.cpp
new file mode 100644
index 0000000..c4d53d8
--- /dev/null
+++ b/vdb3/src/kfc/pmemmgr.cpp
@@ -0,0 +1,315 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pmemmgr.hpp"
+#include <kfc/memory.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/caps.hpp>
+#include <kfc/rsrc.hpp>
+
+#include <stdlib.h>
+#include <string.h>
+
+#if UNIX
+#include <sys/resource.h>
+#endif
+
+namespace vdb3
+{
+
+    const caps_t CONST_MEM_CAPS
+        = CAP_PROP_READ
+        | CAP_READ
+        | CAP_SUBRANGE
+        | CAP_CAST
+        ;
+
+    const caps_t NEW_MEM_CAPS
+        = CONST_MEM_CAPS
+        | CAP_WRITE
+        | CAP_RESIZE
+        ;
+
+
+    /*------------------------------------------------------------------
+     * const_memory_t
+     *  an object representing a range of address space
+     */
+    class const_memory_t : implements MemoryItf
+    {
+    public:
+
+        virtual void resize ( const bytes_t & new_size, bool clear );
+        const_memory_t ( const void * ptr, const bytes_t & size );
+        ~ const_memory_t ();
+
+    protected:
+
+        virtual void * get_mapped_memory ( bytes_t * size ) const;
+
+        const void * ptr;
+        bytes_t size;
+    };
+
+    void const_memory_t :: resize ( const bytes_t & new_size, bool clear )
+    {
+        FUNC_ENTRY ();
+        CONST_THROW ( xc_internal_err, "should never be called" );
+    }
+
+    const_memory_t :: const_memory_t ( const void * _ptr, const bytes_t & _size )
+        : ptr ( _ptr )
+        , size ( _size )
+    {
+    }
+
+    const_memory_t :: ~ const_memory_t ()
+    {
+        ptr = 0;
+        size = ( U64 ) 0;
+    }
+
+    void * const_memory_t :: get_mapped_memory ( bytes_t * _size ) const
+    {
+        if ( _size != 0 )
+            * _size = size;
+        return ( void * ) ptr;
+    }
+
+
+    /*------------------------------------------------------------------
+     * Memory
+     *  an object representing a range of address space
+     */
+    class Memory : public const_memory_t
+    {
+    public:
+
+        virtual void resize ( const bytes_t & new_size, bool clear );
+        Memory ( void * ptr, const bytes_t & size );
+        ~ Memory ();
+    };
+
+    void Memory :: resize ( const bytes_t & new_size, bool clear )
+    {
+        FUNC_ENTRY ();
+
+        MemMgrItf * mmgr = get_mmgr ();
+        assert ( mmgr != 0 );
+
+        assert ( ptr != 0 );
+        assert ( new_size != size );
+
+        ptr = mmgr -> _resize ( ( void * ) ptr, size, new_size, clear );
+        size = new_size;
+    }
+
+    Memory :: Memory ( void * _ptr, const bytes_t & _size )
+        : const_memory_t ( _ptr, _size )
+    {
+    }
+
+    Memory :: ~ Memory ()
+    {
+        FUNC_ENTRY ();
+
+        MemMgrItf * mmgr = get_mmgr ();
+        assert ( mmgr != 0 );
+
+        mmgr -> _free ( ( void * ) ptr, size );
+    }
+
+
+    /*------------------------------------------------------------------
+     * PrimordMemMgr
+     */
+
+    MemMgr PrimordMemMgr :: make_primordial ()
+    {
+        assert ( callstk != 0 );
+        FUNC_ENTRY ();
+
+        // allow for the very first call
+        static atomic_t < I32 > latch = 0;
+        if ( latch . test_and_set ( 0, 1 ) != 0 )
+        {
+            const char msg [] = "primordial memory manager exists";
+            if ( rsrc == 0 )
+                throw msg;
+            CONST_THROW ( xc_program_state_violation, msg );
+        }
+
+        // determine system memory quota
+        size_t quota = ~ ( size_t ) 0;
+#if UNIX
+        struct rlimit rlim;
+        int status = getrlimit ( RLIMIT_AS, & rlim );
+        if ( status == 0 )
+            quota = rlim . rlim_cur;
+#endif
+
+        // allocate the object memory
+        PrimordMemMgr * obj;
+        obj = ( PrimordMemMgr * ) calloc ( 1, sizeof * obj );
+        if ( obj == 0 )
+            throw "out of memory allocating primordial memory manager";
+
+        // construct the primordial mmgr
+        new ( obj ) PrimordMemMgr ( quota, quota - sizeof * obj );
+
+        // embed self into object
+        // DO NOT STORE DUPLICATE
+        // as this would introduce a cycle
+        obj -> mmgr = obj;
+        obj -> obj_size = sizeof * obj;
+
+        // create the reference
+        return obj -> make_mmgr_ref ( obj, CAP_RDWR | CAP_ALLOC );
+    }
+
+
+    /* alloc
+     */
+    Mem PrimordMemMgr :: alloc ( const bytes_t & size, bool clear )
+    {
+        FUNC_ENTRY ();
+
+        // allocate a raw block
+        void * block = ( size == ( U64 ) 0 ) ? 0 : _alloc ( size, clear );
+
+        // create the memory object
+        Memory * obj = new Memory ( block, size );
+
+        // create the reference
+        return make_mem_ref ( obj, obj, NEW_MEM_CAPS );
+    }
+
+    Mem PrimordMemMgr :: make_const ( const void * ptr, const bytes_t & size )
+    {
+        FUNC_ENTRY ();
+
+        // create the const memory object
+        const_memory_t * obj = new const_memory_t ( ptr, size );
+
+        // create the reference
+        return make_mem_ref ( obj, obj, CONST_MEM_CAPS );
+    }
+
+    void * PrimordMemMgr :: _alloc ( const bytes_t & size, bool clear )
+    {
+        FUNC_ENTRY ();
+
+        size_t bytes = size;
+
+        // allocate from quota
+        if ( avail . read_and_sub_ge ( size, size ) < size )
+            THROW ( xc_mem_quota, "memory quota exhausted allocating %lu bytes", ( U64 ) size );
+
+        // allocate using process memory manager
+        void * ptr = clear ? calloc ( 1, bytes ) : malloc ( bytes );
+        if ( ptr == 0 )
+        {
+            // return bytes to quota
+            avail += bytes;
+
+            // failure
+            THROW ( xc_no_mem, "process memory exhausted allocating %zu bytes", bytes );
+        }
+
+       return ptr;
+
+    }
+
+    void * PrimordMemMgr :: _resize ( void * old_ptr, const bytes_t & old_size, const bytes_t & new_size, bool clear )
+    {
+        FUNC_ENTRY ();
+
+        // nothing to do if there is no size change
+        if ( old_size == new_size )
+            return old_ptr;
+
+        // check for quota
+        if ( ( avail + old_size ) < new_size )
+            THROW ( xc_mem_quota, "memory quota exhausted reallocating %lu to %lu bytes", ( U64 ) old_size, ( U64 ) new_size );
+
+        size_t new_bytes = new_size;
+
+        // not supposed to be called with bad values
+        assert ( old_ptr != 0 || old_size == ( U64 ) 0 );
+
+        // reallocate using process memory manager
+        // alternatively, we could always allocate and copy, destroying old
+        void * new_ptr = realloc ( old_ptr, new_bytes );
+        if ( new_ptr == 0 )
+            THROW ( xc_no_mem, "process memory exhausted reallocating %lu to %lu bytes", ( U64 ) old_size, ( U64 ) new_size );
+
+        // update bytes remaining
+        if ( old_size > new_size )
+            avail += old_size - new_size;
+        else
+        {
+            avail -= new_size - old_size;
+
+            // clear extended area
+            if ( clear )
+                memset ( & ( ( char* ) new_ptr ) [ old_size ], 0, new_size - old_size );
+        }
+
+        return new_ptr;
+    }
+
+    void PrimordMemMgr :: _free ( void * ptr, const bytes_t & size )
+    {
+        // not supposed to be called with bad values
+        assert ( ptr != 0 || size == ( U64 ) 0 );
+
+        // return to the process memory manager
+        // alternatively, could clear before free
+        free ( ptr );
+
+        // update bytes remaining
+        if ( ( void * ) this != ptr )
+            avail += size;
+    }
+
+    PrimordMemMgr :: PrimordMemMgr ( const bytes_t & q, const bytes_t & a )
+        : quota ( q )
+        , avail ( a )
+    {
+    }
+
+    PrimordMemMgr :: ~ PrimordMemMgr ()
+    {
+        // TBD - can test if avail != quota
+        quota = 0;
+        avail = 0;
+    }
+
+    void PrimordMemMgr :: operator delete ( void * ptr )
+    {
+        free ( ptr );
+    }
+}
diff --git a/vdb3/src/kfc/pmemmgr.hpp b/vdb3/src/kfc/pmemmgr.hpp
new file mode 100644
index 0000000..23b654a
--- /dev/null
+++ b/vdb3/src/kfc/pmemmgr.hpp
@@ -0,0 +1,75 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_pmemmgr_
+#define _hpp_vdb3_kfc_pmemmgr_
+
+#ifndef _hpp_vdb3_kfc_memmgr_
+#include <kfc/memmgr.hpp>
+#endif
+
+#include <new>
+
+namespace vdb3
+{
+
+
+    /*------------------------------------------------------------------
+     * PrimordMemMgr
+     *  primordial memory manager
+     */
+    class PrimordMemMgr : implements MemMgrItf
+    {
+    public:
+
+        static MemMgr make_primordial ();
+
+        virtual Mem alloc ( const bytes_t & size, bool clear );
+        virtual Mem make_const ( const void * ptr, const bytes_t & size );
+
+    protected:
+
+        virtual void * _alloc ( const bytes_t & size, bool clear );
+        virtual void * _resize ( void * ptr, const bytes_t & old_size,
+            const bytes_t & new_size, bool clear );
+        virtual void _free ( void * ptr, const bytes_t & size );
+
+        PrimordMemMgr ( const bytes_t & quota, const bytes_t & avail );
+        ~ PrimordMemMgr ();
+
+    private:
+
+        void * operator new ( std :: size_t bytes, void * ptr )
+        { return ptr; }
+        void operator delete ( void * ptr );
+
+        bytes_t quota;
+        atomic_t < U64 > avail;
+    };
+
+}
+
+#endif // _hpp_vdb3_kfc_pmemmgr_
diff --git a/vdb3/src/kfc/ptimemgr.cpp b/vdb3/src/kfc/ptimemgr.cpp
new file mode 100644
index 0000000..3ee8eea
--- /dev/null
+++ b/vdb3/src/kfc/ptimemgr.cpp
@@ -0,0 +1,81 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "ptimemgr.hpp"
+#include <kfc/time.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/caps.hpp>
+#include <kfc/syserr.hpp>
+
+#if UNIX
+#include <sys/time.h>
+#include <errno.h>
+#else
+#error "unsupported target platform"
+#endif
+
+namespace vdb3
+{
+
+
+    /*------------------------------------------------------------------
+     * ptimemgr_t
+     *  primordial time manager
+     */
+
+    TimeMgr PrimordTimeMgr :: make_primordial ()
+    {
+        FUNC_ENTRY ();
+        PrimordTimeMgr * obj = new PrimordTimeMgr;
+        return obj -> make_tmmgr_ref ( obj, CAP_READ );
+    }
+
+    timestamp_t PrimordTimeMgr :: cur_time () const
+    {
+        FUNC_ENTRY ();
+
+#if UNIX
+        struct timeval tv;
+        int status =  gettimeofday ( & tv, 0 );
+        if ( status != 0 )
+            THROW_OSERR ( gettimeofday, errno );
+
+        seconds_t sec = tv . tv_sec;
+        uS_t uS = tv . tv_usec;
+        uS += sec;
+
+        return make_timestamp ( uS );
+#else
+#error no implementation for cur_time on this platform
+#endif
+    }
+
+    PrimordTimeMgr :: PrimordTimeMgr ()
+    {
+    }
+
+}
diff --git a/vdb3/src/kfc/ptimemgr.hpp b/vdb3/src/kfc/ptimemgr.hpp
new file mode 100644
index 0000000..65befb2
--- /dev/null
+++ b/vdb3/src/kfc/ptimemgr.hpp
@@ -0,0 +1,64 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_vdb3_kfc_ptimemgr_
+#define _hpp_vdb3_kfc_ptimemgr_
+
+#ifndef _hpp_vdb3_kfc_refcount_
+#include <kfc/refcount.hpp>
+#endif
+
+#ifndef _hpp_vdb3_kfc_timemgr_
+#include <kfc/timemgr.hpp>
+#endif
+
+#include <new>
+
+namespace vdb3
+{
+
+
+    /*------------------------------------------------------------------
+     * PrimordTimeMgr
+     *  primordial time manager
+     */
+    class PrimordTimeMgr : public Refcount
+        , implements TimeMgrItf
+    {
+    public:
+
+        static TimeMgr make_primordial ();
+
+        virtual timestamp_t cur_time () const;
+
+    private:
+
+        PrimordTimeMgr ();
+    };
+
+}
+
+#endif // _hpp_vdb3_kfc_ptimemgr_
diff --git a/vdb3/src/kfc/ptr.cpp b/vdb3/src/kfc/ptr.cpp
new file mode 100644
index 0000000..2279d35
--- /dev/null
+++ b/vdb3/src/kfc/ptr.cpp
@@ -0,0 +1,206 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/ptr.hpp>
+#include <kfc/memmgr.hpp>
+#include <kfc/caps.hpp>
+#include <kfc/except.hpp>
+#include <kfc/callstk.hpp>
+
+namespace vdb3
+{
+
+    // implement read or r/w access to object
+    void * OpaquePtr :: access ( const bytes_t & elem_size )
+    {
+        if ( adj < ( I64 ) 0 || elem_size + ( U64 ) adj > m . bytes )
+        {
+            FUNC_ENTRY ();
+            THROW ( xc_bounds_err, "read/write memory access of %lu bytes", ( U64 ) elem_size );
+        }
+
+        return ( void* ) ( ( char* ) m . ptr + adj );
+    }
+
+    const void * OpaquePtr :: access ( const bytes_t & elem_size ) const
+    {
+        if ( adj < ( I64 ) 0 || elem_size + ( U64 ) adj > m . bytes )
+        {
+            FUNC_ENTRY ();
+            THROW ( xc_bounds_err, "read memory access of %lu bytes", ( U64 ) elem_size );
+        }
+
+        return ( const void* ) ( ( const char* ) m . ptr + adj );
+    }
+
+    void * OpaquePtr :: access ( index_t offset, const bytes_t & elem_size )
+    {
+        index_t new_adj ( adj + offset );
+        if ( new_adj < ( I64 ) 0 || elem_size + ( U64 ) new_adj > m . bytes )
+        {
+            FUNC_ENTRY ();
+            THROW ( xc_bounds_err, "read/write memory access of %lu bytes", ( U64 ) elem_size );
+        }
+
+        return ( void* ) ( ( char* ) m . ptr + new_adj );
+    }
+
+    const void * OpaquePtr :: access ( index_t offset, const bytes_t & elem_size ) const
+    {
+        index_t new_adj ( adj + offset );
+        if ( new_adj < ( I64 ) 0 || elem_size + ( U64 ) new_adj > m . bytes )
+        {
+            FUNC_ENTRY ();
+            THROW ( xc_bounds_err, "read memory access of %lu bytes", ( U64 ) elem_size );
+        }
+
+        return ( const void* ) ( ( const char* ) m . ptr + new_adj );
+    }
+
+    // increment and decrement
+    void OpaquePtr :: increment ( index_t offset )
+    {
+        adj += offset;
+    }
+
+    void OpaquePtr :: decrement ( index_t offset )
+    {
+        adj -= offset;
+    }
+
+    // difference - defined for two pointers on same mem
+    index_t OpaquePtr :: difference ( const OpaquePtr & p, const bytes_t & elem_size ) const
+    {
+        FUNC_ENTRY ();
+
+        // test if both mem blocks are identical
+        if ( m . ptr == p . m . ptr &&
+             m . bytes == p . m . bytes )
+        {
+            if ( elem_size == ( U64 ) 0 )
+                CONST_THROW ( xc_div_zero_err, "divide by zero" );
+            return index_t ( ( ( I64 ) adj - p . adj ) / ( U64 ) elem_size );
+        }
+
+        // have to derive overlap, and both pointers must be within
+        const char * l1 = ( const char* ) m . ptr;
+        const char * l2 = ( const char* ) p . m . ptr;
+        const char * r1 = l1 + m . bytes;
+        const char * r2 = l2 + p . m . bytes;
+        const char * p1 = l1 + adj;
+        const char * p2 = l2 + p . adj;
+
+        const char * left = ( l1 >= l2 ) ? l1 : l2;
+        const char * right = ( r1 <= r2 ) ? r1 : r2;
+        if ( left >= right )
+            CONST_THROW ( xc_ptr_space_err, "pointer difference between disjoint memory spaces" );
+
+        if ( p1 < left || p1 > right ||
+             p2 < left || p2 > right )
+            CONST_THROW ( xc_ptr_space_err, "pointer difference between disjoint memory spaces" );
+
+        // now, the pointers can be compared
+        if ( elem_size == ( U64 ) 0 )
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        return index_t ( ( p1 - p2 ) / ( U64 ) elem_size );
+    }
+
+    // comparison
+    bool OpaquePtr :: equal ( const OpaquePtr & p ) const
+    {
+        FUNC_ENTRY ();
+        return difference ( p, 1 ) == ( I64 ) 0;
+    }
+
+    bool OpaquePtr :: above ( const OpaquePtr & p ) const
+    {
+        FUNC_ENTRY ();
+        return difference ( p, 1 ) > ( I64 ) 0;
+    }
+
+    bool OpaquePtr :: below ( const OpaquePtr & p ) const
+    {
+        FUNC_ENTRY ();
+        return difference ( p, 1 ) < ( I64 ) 0;
+    }
+
+    // assignment
+    void OpaquePtr :: assign ( const OpaquePtr & p )
+    {
+        m = p . m;
+        adj = p . adj;
+    }
+
+    OpaquePtr :: OpaquePtr ( Mem & _m, const bytes_t & elem_size )
+        : m ( _m )
+        , adj ( 0 )
+    {
+        FUNC_ENTRY ();
+        m . get_itf ( CAP_RDWR );
+
+        if ( elem_size == ( U64 ) 0 )
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        if ( elem_size != ( U64 ) 1 )
+        {
+            if ( ( U64 ) m . bytes % elem_size != ( U64 ) 0 )
+                CONST_THROW ( xc_ptr_size_err, "memory block is not an integral multiple of pointer element size" );
+        }
+    }
+
+    OpaquePtr :: OpaquePtr ( const Mem & _m, const bytes_t & elem_size )
+        : m ( _m )
+        , adj ( 0 )
+    {
+        FUNC_ENTRY ();
+        m . get_itf ( CAP_READ );
+
+        if ( elem_size == ( U64 ) 0 )
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        if ( elem_size != ( U64 ) 1 )
+        {
+            if ( ( U64 ) m . bytes % elem_size != ( U64 ) 0 )
+                CONST_THROW ( xc_ptr_size_err, "memory block is not an integral multiple of pointer element size" );
+        }
+    }
+
+    OpaquePtr :: OpaquePtr ( const OpaquePtr & p )
+        : m ( p . m )
+        , adj ( p . adj )
+    {
+    }
+
+    OpaquePtr :: OpaquePtr ( const OpaquePtr & p, caps_t reduce )
+        : m ( p . m, reduce )
+        , adj ( p . adj )
+    {
+    }
+
+    OpaquePtr :: ~ OpaquePtr ()
+    {
+        adj = 0;
+    }
+
+}
diff --git a/vdb3/src/kfc/ref.cpp b/vdb3/src/kfc/ref.cpp
new file mode 100644
index 0000000..be7f170
--- /dev/null
+++ b/vdb3/src/kfc/ref.cpp
@@ -0,0 +1,140 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/ref.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/except.hpp>
+#include <kfc/refcount.hpp>
+
+#include <typeinfo>
+#include <string.h>
+
+namespace vdb3
+{
+
+    // construct a src_loc for hpp
+    static SrcLoc hpp_src_loc =
+    {
+        __mod__, __file__, "hpp"
+    };
+
+    static inline
+    size_t safe_strlen ( const char * str )
+    {
+        if ( str != 0 )
+            return strlen ( str );
+        return 0;
+    }
+
+    /*------------------------------------------------------------------
+     * OpaqueRef
+     *  type-opaque reference
+     *  does all the actual work
+     */
+
+    void OpaqueRef :: test_caps ( caps_t required ) const
+    {
+        // test caps against required
+        if ( ( caps & required ) != required )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_caps_violation_err, "insufficient capabilities for this operation" );
+        }
+    }
+
+    void * OpaqueRef :: cast ( const OpaqueRef & from,
+        void * ( * cast_func ) ( Refcount * obj ) )
+    {
+        FUNC_ENTRY ();
+        assert ( cast_func != 0 );
+        return ( * cast_func ) ( from . obj );
+    }
+
+    // throws an exception describing the cast
+    void OpaqueRef :: bad_cast ( const OpaqueRef & from, const char * func, U32 lineno )
+    {
+        if ( from . obj != 0 )
+        {
+            // push hpp onto call stack
+            CallStk hpp ( hpp_src_loc, func );
+            ConstString func_str ( func, safe_strlen ( func ) );
+
+            // get actual type of object
+            const char * obj_class = typeid ( * from . obj ) . name ();
+            ConstString obj_class_str ( obj_class, safe_strlen ( obj_class ) );
+
+            // create the message string
+            StringBuffer msg ( "constructor '%s' failed to cast "
+                               "from implementation type '%s'",
+                               & func_str, & obj_class_str );
+
+            // now throw the exception
+            throw xc_unsupported_interface_err ( lineno, msg . to_str () );
+        }
+    }
+
+    OpaqueRef :: OpaqueRef ()
+        : obj ( 0 )
+        , caps ( 0 )
+    {
+    }
+
+    OpaqueRef :: ~ OpaqueRef ()
+    {
+        obj -> release ();
+        obj = 0;
+        caps = 0;
+    }
+
+    OpaqueRef :: OpaqueRef ( const OpaqueRef & r )
+        : obj ( r . obj -> duplicate () )
+        , caps ( r . caps )
+    {
+    }
+
+    void OpaqueRef :: operator = ( const OpaqueRef & r )
+    {
+        if ( obj != r . obj )
+        {
+            Refcount * dup = r . obj -> duplicate ();
+            obj -> release ();
+            obj = dup;
+        }
+        caps = r . caps;
+    }
+
+    OpaqueRef :: OpaqueRef ( const OpaqueRef & r, caps_t reduce )
+        : obj ( r . obj -> duplicate () )
+        , caps ( r . caps & ~ reduce )
+    {
+    }
+
+    OpaqueRef :: OpaqueRef ( Refcount * o, caps_t c )
+        : obj ( o -> duplicate () )
+        , caps ( c )
+    {
+    }
+}
diff --git a/vdb3/src/kfc/refcount.cpp b/vdb3/src/kfc/refcount.cpp
new file mode 100644
index 0000000..c17224f
--- /dev/null
+++ b/vdb3/src/kfc/refcount.cpp
@@ -0,0 +1,113 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/refcount.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/atomic.hpp>
+#include <kfc/except.hpp>
+#include <kfc/memory.hpp>
+#include <kfc/memmgr.hpp>
+#include <kfc/rsrc.hpp>
+
+#ifndef _hpp_vdb3_kfc_memmgr_
+#include <stdlib.h>
+#endif
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * Refcount
+     *  base for reference-counted objects
+     */
+
+    void * Refcount :: operator new ( size_t bytes )
+    {
+        FUNC_ENTRY ();
+#if ! defined _hpp_vdb3_kfc_rsrc_ || ! defined _hpp_vdb3_kfc_memmgr_
+        return calloc ( 1, bytes );
+#else
+        assert ( rsrc != 0 );
+        return rsrc -> mmgr . _new ( bytes );
+#endif
+    }
+
+    void Refcount :: operator delete ( void * ptr )
+    {
+#ifndef _hpp_vdb3_kfc_memmgr_
+        free ( ptr );
+#else
+        assert ( rsrc != 0 );
+        return rsrc -> mmgr . _delete ( ptr );
+#endif
+    }
+
+    Refcount :: Refcount ()
+        : count ( 0 )
+    {
+    }
+
+    Refcount :: ~ Refcount ()
+    {
+        count = 0;
+    }
+
+    Refcount * Refcount :: duplicate ()
+    {
+        if ( this != 0 )
+        {
+            if ( count . inc_and_test () )
+            {
+                -- count;
+                FUNC_ENTRY ();
+                CONST_THROW ( xc_references_exhausted_err, "all available references to this object have been exhausted" );
+            }
+        }
+        return this;
+    }
+
+    void Refcount :: release ()
+    {
+        if ( this != 0 )
+        {
+            // if ( count >= 1 ) count -= 1;
+            switch ( count . read_and_sub_ge ( 1, 1 ) )
+            {
+            case 1:
+            {
+                FUNC_ENTRY ();
+                delete this;
+                break;
+            }
+            case 0:
+            {
+                FUNC_ENTRY ();
+                CONST_THROW ( xc_zombie_object_err, "attempt to release a zombie object" );
+            }}
+        }
+    }
+
+}
diff --git a/vdb3/src/kfc/rsrc.cpp b/vdb3/src/kfc/rsrc.cpp
new file mode 100644
index 0000000..08ae36e
--- /dev/null
+++ b/vdb3/src/kfc/rsrc.cpp
@@ -0,0 +1,141 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/rsrc.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/except.hpp>
+#include <kfc/caps.hpp>
+#include <kfc/array.hpp>
+#include "pmemmgr.hpp"
+#include "ptimemgr.hpp"
+#include "pfdmgr.hpp"
+#include "plogger.hpp"
+
+#if UNIX
+#include <kfc/fd.hpp>
+#else
+#error "unsupported target platform"
+#endif
+
+#include <stdio.h>
+
+namespace vdb3
+{
+
+    __thread Rsrc const * rsrc;
+
+    RsrcBase :: ~ RsrcBase ()
+    {
+        if ( rsrc == ( const Rsrc * ) this )
+            rsrc = 0;
+    }
+
+    Rsrc :: Rsrc ( rcaps_t mgrs )
+    {
+        if ( rsrc == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_program_state_violation, "at top of call stack" );
+        }
+
+        mmgr = rsrc -> mmgr;
+
+        if ( ( mgrs & RCAP_TMMGR ) != 0 )
+            tmmgr = rsrc -> tmmgr;
+
+        if ( ( mgrs & RCAP_FDMGR ) != 0 )
+            fdmgr = rsrc -> fdmgr;
+
+        if ( ( mgrs & RCAP_LOG ) != 0 )
+            log = rsrc -> log;
+
+        if ( ( mgrs & RCAP_ERR ) != 0 )
+            err = rsrc -> err;
+    }
+
+
+    Rsrc :: Rsrc ( const Rsrc & rsrc )
+        : mmgr ( rsrc . mmgr )
+        , tmmgr ( rsrc . tmmgr )
+        , fdmgr ( rsrc . fdmgr )
+        , log ( rsrc . log )
+        , err ( rsrc . err )
+    {
+    }
+
+    void Rsrc :: operator = ( const Rsrc & rsrc )
+    {
+        mmgr = rsrc . mmgr;
+        tmmgr = rsrc . tmmgr;
+        fdmgr = rsrc . fdmgr;
+        log = rsrc . log;
+        err = rsrc . err;
+    }
+
+    Rsrc :: ~ Rsrc ()
+    {
+    }
+
+    Rsrc :: Rsrc ( const MemMgr & pmmgr, const char * ident )
+        : mmgr ( pmmgr )
+    {
+        // one-shot latch
+        if ( rsrc != 0 )
+        {
+            assert ( callstk != 0 );
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_program_state_violation, "not at top of call stack" );
+        }
+        rsrc = this;
+
+        try
+        {
+            // create obligatory resources
+            tmmgr = PrimordTimeMgr :: make_primordial ();
+            fdmgr = PrimordFDMgr :: make_primordial ();
+            log = plogger_t :: make ( ident );
+#if UNIX
+            FileDesc fd2 = fdmgr . make ( 2, CAP_WRITE );
+            err = Stream ( fd2 );
+#endif
+        }
+        catch ( exception & x )
+        {
+            NULTermString what = x . what ();
+            fprintf ( stderr, "ERROR: %s:\n", ( const char * ) what );
+#if _DEBUGGING
+            NULTermString stk = x . stack_trace ();
+            fprintf ( stderr, "%s\n", ( const char * ) stk );
+#endif
+        }
+    }
+
+    TopRsrc :: TopRsrc ( const char * ident )
+        : Rsrc ( PrimordMemMgr :: make_primordial (), ident )
+    {
+    }
+
+}
diff --git a/vdb3/src/kfc/stream.cpp b/vdb3/src/kfc/stream.cpp
new file mode 100644
index 0000000..07c9603
--- /dev/null
+++ b/vdb3/src/kfc/stream.cpp
@@ -0,0 +1,395 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/stream.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/except.hpp>
+#include <kfc/caps.hpp>
+#include <kfc/rsrc.hpp>
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * StreamItf
+     *  an interface representing a stream of bytes ( bits? )
+     */
+
+    bytes_t StreamItf :: read ( const bytes_t & num_bytes,
+        Mem & dst, const bytes_t & start )
+    {
+        // should never have had the capabilities to issue message
+        // so this is an unsupported capability
+        // that should not have been granted
+        CONST_THROW ( xc_caps_over_extended_err, "unsupported read message" );
+    }
+
+    bytes_t StreamItf :: write ( const bytes_t & num_bytes,
+        const Mem & src, const bytes_t & start )
+    {
+        // should never have had the capabilities to issue message
+        // so this is an unsupported capability
+        // that should not have been granted
+        CONST_THROW ( xc_caps_over_extended_err, "unsupported write message" );
+    }
+
+    Stream StreamItf :: make_ref ( Refcount * obj, caps_t caps )
+    {
+        return Stream ( obj, this, caps );
+    }
+
+    void * StreamItf :: cast ( Refcount * obj )
+    {
+        return ( void * ) dynamic_cast < StreamItf * > ( obj );
+    }
+
+
+    /*------------------------------------------------------------------
+     * Stream
+     *  an object representing a stream of bytes ( bits? )
+     */
+
+    const U64 dflt_mtu = 128 * 1024;
+
+    // copy from source
+    // return the number of bytes actually copied
+    bytes_t Stream :: copy ( const Stream & src ) const
+    {
+        FUNC_ENTRY ();
+
+        // a null ref should act like nothing was there
+        // the behavior of /dev/null is a different concept
+        if ( null_ref () )
+            return bytes_t ( 0 );
+
+        // access stream
+        StreamItf * itf = get_itf ( CAP_PROP_READ | CAP_WRITE );
+
+        // allocate buffer
+        bytes_t mtu = itf -> get_mtu ();
+        Mem buffer = rsrc -> mmgr . alloc ( mtu, false );
+
+        // read from source
+        bytes_t num_read = src . read ( mtu, buffer, 0 );
+        if ( num_read == ( U64 ) 0 )
+            return num_read;
+
+        // write everything read
+        return write_all ( num_read, buffer, 0 );
+
+    }
+
+    bytes_t Stream :: copy ( const bytes_t & num_bytes, const Stream & src ) const
+    {
+        FUNC_ENTRY ();
+
+        // a null ref should act like nothing was there
+        // the behavior of /dev/null is a different concept
+        if ( null_ref () )
+            return bytes_t ( 0 );
+
+        // access stream
+        StreamItf * itf = get_itf ( CAP_PROP_READ | CAP_WRITE );
+
+        // allocate buffer
+        bytes_t mtu = itf -> get_mtu ();
+        if ( num_bytes < mtu )
+            mtu = num_bytes;
+        Mem buffer = rsrc -> mmgr . alloc ( mtu, false );
+
+        // read from source
+        bytes_t num_read = src . read ( mtu, buffer, 0 );
+        if ( num_read == ( U64 ) 0 )
+            return num_read;
+
+        // write everything read
+        return write_all ( num_read, buffer, 0 );
+    }
+
+    bytes_t Stream :: copy_all ( const Stream & src ) const
+    {
+        FUNC_ENTRY ();
+
+        // a null ref should act like nothing was there
+        // the behavior of /dev/null is a different concept
+        if ( null_ref () )
+            return bytes_t ( 0 );
+
+        // access stream
+        StreamItf * itf = get_itf ( CAP_PROP_READ | CAP_WRITE );
+
+        // allocate buffer
+        bytes_t mtu = itf -> get_mtu ();
+        Mem buffer = rsrc -> mmgr . alloc ( mtu, false );
+
+        // read from source
+        bytes_t num_read = src . read ( mtu, buffer, 0 );
+        if ( num_read == ( U64 ) 0 )
+            return num_read;
+
+        // write everything read
+        bytes_t total = write_all ( num_read, buffer, 0 );
+        assert ( total == num_read );
+
+        // enter loop to copy until end of stream
+        while ( 1 )
+        {
+            num_read = src . read ( mtu, buffer, 0 );
+            if ( num_read == ( U64 ) 0 )
+                break;
+
+            bytes_t num_writ = write_all ( num_read, buffer, 0 );
+            assert ( num_writ == num_read );
+            total += num_writ;
+        }
+
+        return total;
+    }
+
+    bytes_t Stream :: copy_all ( const bytes_t & num_bytes, const Stream & src ) const
+    {
+        FUNC_ENTRY ();
+
+        // a null ref should act like nothing was there
+        // the behavior of /dev/null is a different concept
+        if ( null_ref () )
+            return bytes_t ( 0 );
+
+        // access stream
+        StreamItf * itf = get_itf ( CAP_PROP_READ | CAP_WRITE );
+
+        // allocate buffer
+        bytes_t mtu = itf -> get_mtu ();
+        if ( num_bytes < mtu )
+            mtu = num_bytes;
+        Mem buffer = rsrc -> mmgr . alloc ( mtu, false );
+
+        // read from source
+        bytes_t num_read = src . read ( mtu, buffer, 0 );
+        if ( num_read == ( U64 ) 0 )
+            return num_read;
+
+        // write everything read
+        bytes_t total = write_all ( num_read, buffer, 0 );
+        assert ( total == num_read );
+
+        // enter loop to copy until end of stream
+        while ( 1 )
+        {
+            // TBD - must read with non-blocking timeout
+            num_read = src . read ( mtu, buffer, 0 );
+            if ( num_read == ( U64 ) 0 )
+                break;
+
+            bytes_t num_writ = write_all ( num_read, buffer, 0 );
+            assert ( num_writ == num_read );
+            total += num_writ;
+        }
+
+        return total;
+    }
+
+    bytes_t Stream :: read ( Mem & dst, index_t start ) const
+    {
+        FUNC_ENTRY ();
+
+        if ( start < 0 )
+            THROW ( xc_param_err, "bad start index: %ld", start );
+
+        bytes_t size = dst . size ();
+        if ( ( U64 ) start >= size )
+            return bytes_t ( 0 );
+
+        bytes_t to_read = size - ( U64 ) start;
+
+        if ( null_ref () )
+            return bytes_t ( 0 );
+
+        StreamItf * itf = get_itf ( CAP_PROP_READ | CAP_READ );
+
+        bytes_t mtu = itf -> get_mtu ();
+        if ( mtu < to_read )
+            to_read = mtu;
+
+        return itf -> read ( to_read, dst, start );
+    }
+
+    bytes_t Stream :: read ( const bytes_t & num_bytes, Mem & dst, index_t start ) const
+    {
+        FUNC_ENTRY ();
+
+        if ( start < 0 )
+            THROW ( xc_param_err, "bad start index: %ld", start );
+
+        bytes_t size = dst . size ();
+        if ( ( U64 ) start >= size )
+            return bytes_t ( 0 );
+
+        bytes_t to_read = size - ( U64 ) start;
+        if ( to_read > num_bytes )
+            to_read = num_bytes;
+
+        if ( null_ref () )
+            return bytes_t ( 0 );
+
+        StreamItf * itf = get_itf ( CAP_PROP_READ | CAP_READ );
+
+        bytes_t mtu = itf -> get_mtu ();
+        if ( mtu < to_read )
+            to_read = mtu;
+
+        return itf -> read ( to_read, dst, start );
+    }
+
+    bytes_t Stream :: write ( const Mem & src, index_t start ) const
+    {
+        FUNC_ENTRY ();
+
+        if ( start < 0 )
+            THROW ( xc_param_err, "bad start index: %ld", start );
+
+        bytes_t size = src . size ();
+        if ( ( U64 ) start >= size )
+            return bytes_t ( 0 );
+
+        bytes_t to_write = size - ( U64 ) start;
+
+        if ( null_ref () )
+            return bytes_t ( 0 );
+
+        StreamItf * itf = get_itf ( CAP_WRITE );
+
+        bytes_t mtu = itf -> get_mtu ();
+        if ( mtu < to_write )
+            to_write = mtu;
+
+        return itf -> write ( to_write, src, start );
+    }
+
+    bytes_t Stream :: write_all ( const Mem & src, index_t start ) const
+    {
+        FUNC_ENTRY ();
+
+        if ( start < 0 )
+            THROW ( xc_param_err, "bad start index: %ld", start );
+
+        bytes_t size = src . size ();
+        if ( ( U64 ) start >= size )
+            return bytes_t ( 0 );
+
+        bytes_t all_bytes = size - ( U64 ) start;
+
+        if ( null_ref () )
+            THROW ( xc_null_self_err, "wrote 0 of %lu bytes", ( U64 ) all_bytes );
+
+        StreamItf * itf = get_itf ( CAP_WRITE );
+
+        bytes_t mtu = itf -> get_mtu ();
+        bytes_t to_write = ( mtu < all_bytes ) ? mtu : all_bytes;
+
+        bytes_t total = itf -> write ( to_write, src, start );
+        while ( total < all_bytes )
+        {
+            to_write = all_bytes - total;
+            if ( mtu < to_write )
+                to_write = mtu;
+            bytes_t num_writ = itf -> write ( to_write, src, start + ( U64 ) total );
+            if ( num_writ == ( U64 ) 0 )
+                THROW ( xc_transfer_incomplete_err, "wrote %lu of %lu bytes", ( U64 ) total, ( U64 ) all_bytes );
+            total += num_writ;
+        }
+
+        return total;
+    }
+
+    bytes_t Stream :: write_all ( const bytes_t & num_bytes, const Mem & src, index_t start ) const
+    {
+        FUNC_ENTRY ();
+
+        if ( start < 0 )
+            THROW ( xc_param_err, "bad start index: %ld", start );
+
+        bytes_t size = src . size ();
+        if ( ( U64 ) start >= size )
+            return bytes_t ( 0 );
+
+        bytes_t all_bytes = size - ( U64 ) start;
+        if ( all_bytes > num_bytes )
+            all_bytes = num_bytes;
+
+        if ( null_ref () )
+            THROW ( xc_null_self_err, "wrote 0 of %lu bytes", ( U64 ) all_bytes );
+
+        StreamItf * itf = get_itf ( CAP_WRITE );
+
+        bytes_t mtu = itf -> get_mtu ();
+        bytes_t to_write = ( mtu < all_bytes ) ? mtu : all_bytes;
+
+        bytes_t total = itf -> write ( to_write, src, start );
+        while ( total < all_bytes )
+        {
+            to_write = all_bytes - total;
+            if ( mtu < to_write )
+                to_write = mtu;
+            bytes_t num_writ = itf -> write ( to_write, src, start + ( U64 ) total );
+            if ( num_writ == ( U64 ) 0 )
+                THROW ( xc_transfer_incomplete_err, "wrote %lu of %lu bytes", ( U64 ) total, ( U64 ) all_bytes );
+            total += num_writ;
+        }
+
+        return total;
+    }
+
+    Stream :: Stream ()
+    {
+    }
+
+    Stream :: Stream ( const Stream & r )
+        : Ref < StreamItf > ( r )
+    {
+    }
+
+    void Stream :: operator = ( const Stream & r )
+    {
+        Ref < StreamItf > :: operator = ( r );
+    }
+
+    Stream :: Stream ( const Stream & r, caps_t reduce )
+        : Ref < StreamItf > ( r, reduce )
+    {
+    }
+
+    Stream :: Stream ( const OpaqueRef & r )
+        : Ref < StreamItf > ( r, StreamItf :: cast )
+    {
+    }
+
+    Stream :: Stream ( Refcount * obj, StreamItf * itf, caps_t caps )
+        : Ref < StreamItf > ( obj, itf, caps )
+    {
+    }
+    
+}
diff --git a/vdb3/src/kfc/string.cpp b/vdb3/src/kfc/string.cpp
new file mode 100644
index 0000000..26a2b3e
--- /dev/null
+++ b/vdb3/src/kfc/string.cpp
@@ -0,0 +1,1324 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/string.hpp>
+#include <kfc/caps.hpp>
+#include <kfc/memmgr.hpp>
+#include <kfc/except.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/array.hpp>
+#include <kfc/ptr.hpp>
+
+#include <string.h>
+#include <ctype.h>
+
+// TEMPORARY
+#include <stdio.h>
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * String
+     *  an immutable string object
+     */
+
+
+    // search for a character
+    index_t String :: find_first ( UTF32 ch ) const
+    {
+        FUNC_ENTRY ();
+
+        // if character and we are both ascii
+        if ( ch < 128 && mem . size () == ascii_size )
+            return mem . find_first ( ( U8 ) ch );
+
+        // UTF-8 operation
+        CONST_THROW ( xc_unimplemented_err, "UTF8" );
+    }
+
+    index_t String :: find_first ( UTF32 ch, index_t offset ) const
+    {
+        FUNC_ENTRY ();
+
+        // if index is invalid
+        if ( offset < 0 || ( count_t ) offset >= len )
+            return -1;
+
+        // if character and we are both ascii
+        if ( ch < 128 && mem . size () == ascii_size )
+            return mem . find_first ( ( U8 ) ch, offset );
+
+        // UTF-8 operation
+        CONST_THROW ( xc_unimplemented_err, "UTF8" );
+    }
+
+    index_t String :: find_first ( UTF32 ch, index_t offset, count_t _length ) const
+    {
+        FUNC_ENTRY ();
+
+        // if index is invalid
+        if ( offset < 0 || ( count_t ) offset >= len )
+            return -1;
+
+        // limit length
+        if ( _length + offset > len )
+            _length = len - offset;
+
+        // if character and we are both ascii
+        if ( ch < 128 && mem . size () == ascii_size )
+            return mem . find_first ( ( U8 ) ch, offset, _length );
+
+        // UTF-8 operation
+        CONST_THROW ( xc_unimplemented_err, "UTF8" );
+    }
+
+    String String :: substr ( index_t offset ) const
+    {
+        FUNC_ENTRY ();
+
+        // if index is invalid
+        if ( offset < 0 || ( count_t ) offset >= len )
+            return String ();
+
+        // new length
+        count_t _length = len - offset;
+
+        // detect all-ASCII characters
+        if ( mem . size () == ascii_size )
+        {
+            // can treat index as a byte offset
+            Mem m = mem . subrange ( offset, _length );
+            return String ( m, _length, _length );
+        }
+
+        // UTF-8 operation
+        // TBD - may need to have friend access
+        CONST_THROW ( xc_unimplemented_err, "UTF8" );
+    }
+
+    String String :: substr ( index_t offset, count_t _length ) const
+    {
+        FUNC_ENTRY ();
+
+        // if index is invalid
+        if ( offset < 0 || ( count_t ) offset >= len )
+            return String ();
+
+        // limit length
+        if ( _length + offset > len )
+            _length = len - offset;
+
+        // detect all-ASCII characters
+        if ( _length + offset <= ascii_size )
+        {
+            // can treat index as a byte offset
+            Mem m = mem . subrange ( offset, _length );
+            return String ( m, _length, _length );
+        }
+
+        // UTF-8 operation
+        // TBD - may need to have friend access
+        CONST_THROW ( xc_unimplemented_err, "UTF8" );
+    }
+
+    // split string at separator point
+    // removes separator if width is given
+    StringPair String :: split ( index_t offset ) const
+    {
+        FUNC_ENTRY ();
+
+        if ( offset < 0 )
+            return StringPair ( * this, String () );
+
+        String left = substr ( 0, offset );
+        String right = substr ( offset );
+
+        return StringPair ( left, right );
+    }
+
+    StringPair String :: split ( index_t offset, count_t sep_width ) const
+    {
+        FUNC_ENTRY ();
+
+        if ( offset < 0 )
+            return StringPair ( * this, String () );
+
+        String left = substr ( 0, offset );
+        String right = substr ( offset + sep_width );
+        return StringPair ( left, right );
+    }
+
+    String String :: toupper () const
+    {
+        FUNC_ENTRY ();
+
+        if ( mem . size () == ascii_size )
+        {
+            StringBuffer copy ( rsrc -> mmgr . alloc ( ascii_size, false ) );
+            copy . append ( * this );
+            copy . toupper ();
+            return copy . to_str ();
+        }
+
+        // UTF-8 operation
+        // TBD - may need to have friend access
+        CONST_THROW ( xc_unimplemented_err, "UTF8" );
+    }
+
+    String String :: trim () const
+    {
+        FUNC_ENTRY ();
+
+        String trimmed = * this;
+
+        if ( len == 0 )
+            return trimmed;
+
+        // access the character data
+        Ptr < ascii > start = mem;
+        Ptr < ascii > p = start;
+
+        // trim from end
+        bytes_t bytes = trimmed . mem . size ();
+        for ( p += ( I64 ) ( U64 ) bytes - 1; isspace ( * p ); -- p )
+        {
+            -- trimmed . len;
+            if ( trimmed . ascii_size == bytes )
+                -- trimmed . ascii_size;
+            if ( -- bytes == ( U64 ) 0 )
+                return String ();
+        }
+
+        // trim from start
+        for ( p = start; isspace ( * p ); ++ p )
+        {
+            -- trimmed . len;
+            if ( trimmed . ascii_size != ( U64 ) 0 )
+                -- trimmed . ascii_size;
+            if ( -- bytes == ( U64 ) 0 )
+                return String ();
+        }
+
+        index_t offset = p - start;
+        Mem m = trimmed . mem . subrange ( offset, bytes );
+        trimmed . mem = m;
+
+        return trimmed;
+    }
+
+    bool String :: operator == ( const String & s ) const
+    {
+        FUNC_ENTRY ();
+
+        if ( len == s . len && ascii_size == s . ascii_size )
+            return mem == s . mem;
+
+        return false;
+    }
+
+    bool String :: operator != ( const String & s ) const
+    {
+        FUNC_ENTRY ();
+
+        if ( len == s . len && ascii_size == s . ascii_size )
+            return mem != s . mem;
+
+        return true;
+    }
+
+    String :: String ()
+        : ascii_size ( 0 )
+        , len ( 0 )
+    {
+    }
+
+    String :: ~ String ()
+    {
+        ascii_size = 0;
+        len = 0;
+    }
+
+    String :: String ( const String & s )
+        : mem ( s . mem )
+        , ascii_size ( s . ascii_size )
+        , len ( s . len )
+    {
+    }
+
+    void String :: operator = ( const String & s )
+    {
+        mem = s . mem;
+        ascii_size = s . ascii_size;
+        len = s . len;
+    }
+
+    String :: String ( const String & s, caps_t reduce )
+        : mem ( s . mem, reduce )
+        , ascii_size ( s . ascii_size )
+        , len ( s . len )
+    {
+    }
+
+    String :: String ( const Mem & m, const bytes_t & ascii_sz, count_t _len )
+        : mem ( m, CAP_WRITE | CAP_RESIZE )
+        , ascii_size ( ascii_sz )
+        , len ( _len )
+    {
+        // ascii_sz <= _len <= sz
+        assert ( ( ascii_sz <= _len ) && ( _len <= m . size () ) );
+        // ascii_sz == m . size () || ( ascii_sz < _len < m . size () )
+        assert ( ( ascii_sz == m . size () ) || ( ascii_sz < _len && _len < m . size () ) );
+    }
+
+
+    /*------------------------------------------------------------------
+     * ConstString
+     *  create a String from constant data
+     */
+
+    ConstString :: ConstString ( const char * text, size_t bytes )
+        : String ( rsrc -> mmgr . make_const ( ( const void * ) text, bytes ), bytes, bytes )
+    {
+    }
+
+
+    /*------------------------------------------------------------------
+     * StringBuffer
+     *  an editible string object
+     */
+
+    String StringBuffer :: to_str () const
+    {
+        FUNC_ENTRY ();
+
+        Mem m = buffer . subrange ( 0, bytes );
+        return String ( m, ascii_size, len );
+    }
+
+    index_t StringBuffer :: find_first ( UTF32 ch ) const
+    {
+        FUNC_ENTRY ();
+
+        // if finding an ascii character ( i.e. byte )
+        if ( ch < 128 )
+        {
+            // if string is 100% ascii, then byte offsets == char idx
+            if ( ascii_size == bytes )
+                return buffer . find_first ( ( U8 ) ch );
+        }
+
+        // UTF-8 operation
+        // TBD - may need to have friend access
+        CONST_THROW ( xc_unimplemented_err, "UTF8" );
+    }
+
+    index_t StringBuffer :: find_first ( UTF32 ch, index_t starting_pos ) const
+    {
+        FUNC_ENTRY ();
+
+        // if finding an ascii character ( i.e. byte )
+        if ( ch < 128 )
+        {
+            // if string is 100% ascii, then byte offsets == char idx
+            if ( ascii_size == bytes )
+                return buffer . find_first ( ( U8 ) ch, starting_pos );
+        }
+
+        // UTF-8 operation
+        // TBD - may need to have friend access
+        CONST_THROW ( xc_unimplemented_err, "UTF8" );
+    }
+
+    StringBuffer & StringBuffer :: assign ( const String & s )
+    {
+        FUNC_ENTRY ();
+
+        // become empty
+        bytes = 0;
+        ascii_size = 0;
+        len = 0;
+
+        // append
+        return append ( s );
+    }
+
+    StringBuffer & StringBuffer :: assign ( const StringBuffer & s )
+    {
+        FUNC_ENTRY ();
+
+        // become empty
+        bytes = 0;
+        ascii_size = 0;
+        len = 0;
+
+        // append
+        return append ( s );
+    }
+
+    StringBuffer & StringBuffer :: assign ( const char * fmt, ... )
+    {
+        FUNC_ENTRY ();
+
+        // become empty
+        bytes = 0;
+        ascii_size = 0;
+        len = 0;
+
+        // append
+        va_list args;
+        va_start ( args, fmt );
+        vappend ( fmt, args );
+        va_end ( args );
+
+        return * this;
+    }
+
+    StringBuffer & StringBuffer :: vassign ( const char * fmt, va_list args )
+    {
+        FUNC_ENTRY ();
+
+        // become empty
+        bytes = 0;
+        ascii_size = 0;
+        len = 0;
+
+        // append
+        return vappend ( fmt, args );
+    }
+
+    StringBuffer & StringBuffer :: append ( const String & s )
+    {
+        FUNC_ENTRY ();
+
+        bytes_t amount = s . size ();
+        resize ( bytes + amount );
+
+        bytes += buffer . copy ( amount, bytes, s . mem, 0 );
+        if ( ascii_size == len )
+            ascii_size += s . ascii_size;
+        len += s . len;
+
+        return * this;
+    }
+
+    StringBuffer & StringBuffer :: append ( const StringBuffer & s )
+    {
+        FUNC_ENTRY ();
+
+        size_t amount = s . size ();
+        resize ( bytes + amount );
+
+        bytes += buffer . copy ( amount, bytes, s . buffer, 0 );
+        if ( ascii_size == len )
+            ascii_size += s . ascii_size;
+        len += s . len;
+
+        return * this;
+    }
+
+    StringBuffer & StringBuffer :: append ( const char * fmt, ... )
+    {
+        FUNC_ENTRY ();
+
+        va_list args;
+        va_start ( args, fmt );
+        vappend ( fmt, args );
+        va_end ( args );
+
+        return * this;
+    }
+
+    StringBuffer & StringBuffer :: vappend ( const char * fmt, va_list args )
+    {
+        // no harm, no foul
+        if ( fmt == 0 )
+            return * this;
+
+        FUNC_ENTRY ();
+
+        // loop over format
+        for ( size_t i = 0;; ++ i )
+        {
+            // search for '%'
+            size_t start;
+            bool end = true;
+            for ( start = i; fmt [ i ] != 0; ++ i )
+            {
+                if ( fmt [ i ] == '%' )
+                {
+                    end = false;
+                    break;
+                }
+            }
+
+            // append whatever literal string was given
+            if ( start < i )
+            {
+                ConstString s ( & fmt [ start ], i - start );
+                append ( s );
+            }
+
+            // detect end of fmt string
+            if ( end )
+                break;
+
+            // handle escaped percent sign
+            if ( fmt [ ++ i ] == '%' )
+            {
+                append ( '%' );
+            }
+            else if ( isalpha ( fmt [ i ] ) )
+            {
+                // handle simple substitution printf item
+                i = fappend_simple ( fmt, args, i );
+            }
+            else
+            {
+                // handle longer format printf item
+                i = fappend_long ( fmt, args, i );
+            }
+        }
+
+        return * this;
+    }
+
+    StringBuffer & StringBuffer :: append ( UTF32 ch )
+    {
+        return append ( ch, 1 );
+    }
+
+    StringBuffer & StringBuffer :: append ( UTF32 ch, count_t repeat )
+    {
+        FUNC_ENTRY ();
+
+        if ( ch >= 128 )
+        {
+            // UTF-8 operation
+            // TBD - may need to have friend access
+            CONST_THROW ( xc_unimplemented_err, "UTF8" );
+        }
+        else if ( ch != 0 )
+        {
+            resize ( bytes + repeat );
+            bytes += buffer . fill ( repeat, ( I64 ) ( U64 ) bytes, ( U8 ) ch );
+            if ( ascii_size == len )
+                ascii_size += repeat;
+            len += repeat;
+        }
+
+        return * this;
+    }
+
+    void StringBuffer :: reset ()
+    {
+        bytes = 0;
+        ascii_size = 0;
+        len = 0;
+    }
+
+    void StringBuffer :: trim ()
+    {
+        if ( bytes == ( U64 ) 0 )
+            return;
+
+        FUNC_ENTRY ();
+
+        // access the character data
+        Ptr < ascii > start = buffer;
+        Ptr < ascii > p = start;
+
+        // trim from end
+        for ( p += ( I64 ) ( U64 ) bytes - 1; isspace ( * p ); -- p )
+        {
+            -- len;
+            if ( ascii_size == bytes )
+                -- ascii_size;
+            if ( -- bytes == ( U64 ) 0 )
+                return;
+        }
+
+        // trim from start
+        for ( p = start; isspace ( * p ); ++ p )
+        {
+            -- len;
+            if ( ascii_size != ( U64 ) 0 )
+                -- ascii_size;
+            if ( -- bytes == ( U64 ) 0 )
+                return;
+        }
+
+        // if start was moved
+        index_t offset = p - start;
+        if ( offset > ( I64 ) 0 )
+        {
+            {
+                // create offset to start
+                Mem m = buffer . subrange ( offset );
+                buffer = m;
+            }
+
+            // resize to force discard
+            buffer . resize ( ( ( U64 ) bytes + 4095 ) & ~ ( U64 ) 4095, true );
+        }
+    }
+
+    bool StringBuffer :: trim_eoln ()
+    {
+        FUNC_ENTRY ();
+
+        bool trimmed = false;
+
+        if ( bytes != ( U64 ) 0 )
+        {
+            // access character data
+            Ptr < ascii > p = buffer;
+
+            // must end with '\n'
+            if ( p [ ( U64 ) bytes - 1 ] == '\n' )
+            {
+                // going to trim
+                trimmed = true;
+
+                // detect CRLF
+                if ( ( U64 ) bytes >= 2 && p [ ( U64 ) bytes - 2 ] == '\r' )
+                {
+                    len -= ( U64 ) 2;
+                    if ( ascii_size == bytes )
+                        ascii_size -= ( U64 ) 2;
+                    bytes -= ( U64 ) 2;
+                }
+                else
+                {
+                    len -= ( U64 ) 1;
+                    if ( ascii_size == bytes )
+                        ascii_size -= ( U64 ) 1;
+                    bytes -= ( U64 ) 1;
+                }
+            }
+        }
+
+        return trimmed;
+    }
+
+    void StringBuffer :: toupper ()
+    {
+        FUNC_ENTRY ();
+
+        // UTF-8 operation
+        if ( bytes != ascii_size )
+            CONST_THROW ( xc_unimplemented_err, "UTF8" );
+
+        Array < char > a = buffer;
+        for ( count_t i = 0; i < len; ++ i )
+        {
+            char ch = a [ i ];
+            a [ i ] = :: toupper ( ch );
+        }
+    }
+
+    StringBuffer :: StringBuffer ()
+        : buffer ( rsrc -> mmgr . alloc ( 0, false ) )
+        , bytes ( 0 )
+        , ascii_size ( 0 )
+        , len ( 0 )
+    {
+    }
+
+    StringBuffer :: ~ StringBuffer ()
+    {
+        reset ();
+    }
+
+    StringBuffer :: StringBuffer ( const Mem & m )
+        : buffer ( m )
+        , bytes ( 0 )
+        , ascii_size ( 0 )
+        , len ( 0 )
+    {
+    }
+
+    StringBuffer :: StringBuffer ( const char * fmt, ... )
+        : buffer ( rsrc -> mmgr . alloc ( 0, false ) )
+        , bytes ( 0 )
+        , ascii_size ( 0 )
+        , len ( 0 )
+    {
+        FUNC_ENTRY ();
+
+        va_list args;
+        va_start ( args, fmt );
+        vappend ( fmt, args );
+        va_end ( args );
+    }
+
+    StringBuffer :: StringBuffer ( const char * fmt, va_list args )
+        : buffer ( rsrc -> mmgr . alloc ( 0, false ) )
+        , bytes ( 0 )
+        , ascii_size ( 0 )
+        , len ( 0 )
+    {
+        FUNC_ENTRY ();
+
+        vappend ( fmt, args );
+    }
+
+    size_t StringBuffer :: fappend_simple ( const char * fmt, va_list args, size_t i )
+    {
+        FUNC_ENTRY ();
+
+        I64 i64;
+        U64 u64;
+        //F64 f64;
+        UTF32 ch;
+        U32 j, base;
+        bool neg = false;
+        const String * str;
+        ascii num [ 256 ];
+
+        const ascii * chmap = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+        // simple argument, no formatting
+        switch ( fmt [ i ] )
+        {
+        case 'u':
+            u64 = va_arg ( args, U32 );
+
+        cvt_decimal_int:
+            base = 10;
+
+        cvt_integer:
+            j = sizeof num;
+            if ( u64 == 0 )
+                num [ -- j ] = '0';
+            else do
+            {
+                num [ -- j ] = chmap [ u64 % base ];
+                u64 /= base;
+            }
+            while ( u64 != 0 );
+
+            if ( neg )
+                num [ -- j ] = '-';
+
+            {
+                ConstString nstr ( & num [ j ], sizeof num - j );
+                append ( nstr );
+            }
+            break;
+
+        case 'l':
+            switch ( fmt [ ++ i ] )
+            {
+            case 'u':
+                u64 = va_arg ( args, U64 );
+                goto cvt_decimal_int;
+                
+            case 'd':
+            case 'i':
+                i64 = va_arg ( args, I64 );
+                if ( i64 >= 0 )
+                {
+                    u64 = i64;
+                    goto cvt_decimal_int;
+                }
+                u64 = -i64;
+                neg = true;
+                goto cvt_decimal_int;
+
+            case 'X':
+                chmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+            case 'x':
+                u64 = va_arg ( args, U64 );
+                base = 16;
+                goto cvt_integer;
+
+            case 'o':
+                u64 = va_arg ( args, U64 );
+                base = 8;
+                goto cvt_integer;
+
+            case 'b':
+                u64 = va_arg ( args, U64 );
+                base = 2;
+                goto cvt_integer;
+
+            default:
+                THROW ( xc_bad_fmt_err, "expected one of [udiXxob] after length modifier 'l' but found '%c'", fmt [ i ] );
+            }
+            break;
+
+        case 'z':
+            switch ( fmt [ ++ i ] )
+            {
+            case 'u':
+                u64 = va_arg ( args, size_t );
+                goto cvt_decimal_int;
+
+            case 'X':
+                chmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+            case 'x':
+                u64 = va_arg ( args, size_t );
+                base = 16;
+                goto cvt_integer;
+
+            case 'o':
+                u64 = va_arg ( args, size_t );
+                base = 8;
+                goto cvt_integer;
+
+            case 'b':
+                u64 = va_arg ( args, size_t );
+                base = 2;
+                goto cvt_integer;
+
+            default:
+                THROW ( xc_bad_fmt_err, "expected one of [uXxob] after length modifier 'z' but found '%c'", fmt [ i ] );
+            }
+            break;
+
+        case 'd':
+        case 'i':
+            i64 = va_arg ( args, I32 );
+            if ( i64 >= 0 )
+            {
+                u64 = i64;
+                goto cvt_decimal_int;
+            }
+            u64 = -i64;
+            neg = true;
+            goto cvt_decimal_int;
+
+        case 'X':
+            chmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+        case 'x':
+            u64 = va_arg ( args, U32 );
+            base = 16;
+            goto cvt_integer;
+
+        case 'o':
+            u64 = va_arg ( args, U32 );
+            base = 8;
+            goto cvt_integer;
+            
+        case 'b':
+            u64 = va_arg ( args, U32 );
+            base = 2;
+            goto cvt_integer;
+
+        case 's':
+            str = va_arg ( args, const String * );
+            if ( str == 0 )
+                append ( CONST_STRING ( "(null)" ) );
+            else
+                append ( * str );
+            break;
+
+        case 'c':
+            ch = va_arg ( args, UTF32 );
+            append ( ch );
+            break;
+
+        case 'f':
+        case 'e':
+        case 'g':
+        {
+            // TBD
+            char fmt2 [ 2 ];
+            fmt2 [ 0 ] = fmt [ i ];
+            fmt2 [ 1 ] = 0;
+            j = vsnprintf ( num, sizeof num, fmt2, args );
+            ConstString fstr ( num, j );
+            append ( fstr );
+            break;
+        }
+
+        case 'h':
+            switch ( fmt [ ++ i ] )
+            {
+            case 'u':
+                u64 = ( U16 ) va_arg ( args, U32 );
+                goto cvt_decimal_int;
+
+            case 'd':
+            case 'i':
+                i64 = ( I16 ) va_arg ( args, I32 );
+                if ( i64 >= 0 )
+                {
+                    u64 = i64;
+                    goto cvt_decimal_int;
+                }
+                u64 = -i64;
+                neg = true;
+                goto cvt_decimal_int;
+                
+            case 'X':
+                chmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+            case 'x':
+                u64 = ( U16 ) va_arg ( args, U32 );
+                base = 16;
+                goto cvt_integer;
+
+            case 'o':
+                u64 = ( U16 ) va_arg ( args, U32 );
+                base = 8;
+                goto cvt_integer;
+
+            case 'b':
+                u64 = ( U16 ) va_arg ( args, U32 );
+                base = 2;
+                goto cvt_integer;
+
+            default:
+                THROW ( xc_bad_fmt_err, "expected one of [udiXxob] after length modifier 'h' but found '%c'", fmt [ i ] );
+            }
+            break;
+
+        case 't':
+            switch ( fmt [ ++ i ] )
+            {
+            case 'u':
+                u64 = ( U8 ) va_arg ( args, U32 );
+                goto cvt_decimal_int;
+                
+            case 'd':
+            case 'i':
+                i64 = ( I8 ) va_arg ( args, I32 );
+                if ( i64 >= 0 )
+                {
+                    u64 = i64;
+                    goto cvt_decimal_int;
+                }
+                u64 = -i64;
+                neg = true;
+                goto cvt_decimal_int;
+
+            case 'X':
+                chmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+            case 'x':
+                u64 = ( U8 ) va_arg ( args, U32 );
+                base = 16;
+                goto cvt_integer;
+
+            case 'o':
+                u64 = ( U8 ) va_arg ( args, U32 );
+                base = 8;
+                goto cvt_integer;
+
+            case 'b':
+                u64 = ( U8 ) va_arg ( args, U32 );
+                base = 2;
+                goto cvt_integer;
+                
+            default:
+                THROW ( xc_bad_fmt_err, "expected one of [udiXxob] after length modifier 't' but found '%c'", fmt [ i ] );
+            }
+            break;
+        }
+
+        return i;
+    }
+
+    size_t StringBuffer :: fappend_long ( const char * fmt, va_list args, size_t i )
+    {
+        FUNC_ENTRY ();
+
+        I64 i64;
+        U64 u64;
+        F64 f64;
+        UTF32 ch;
+        U32 j, k, base;
+        const String * str;
+        ascii num [ 256 ];
+
+        const ascii * chmap = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+        // perform a full format
+        ascii use_sign = 0;
+        ascii padding = ' ';
+        U64 digits = 0;
+        bool left_align = false;
+        bool comma_separate = false;
+        bool alternate = false;
+
+        // FLAGS
+        while ( 1 )
+        {
+            switch ( fmt [ i ] )
+            {
+            case '-':
+                left_align = true;
+                padding = ' ';
+                ++ i;
+                continue;
+            case '+':
+                use_sign = '+';
+                ++ i;
+                continue;
+            case ' ':
+                if ( use_sign != '+' )
+                    use_sign = ' ';
+                ++ i;
+                continue;
+            case '0':
+                if ( ! left_align )
+                    padding = '0';
+                ++ i;
+                continue;
+            case ',':
+            case '\'':
+                comma_separate = true;
+                ++ i;
+                continue;
+            case '#':
+                alternate = true;
+                ++ i;
+                continue;
+            }
+
+            break;
+        }
+
+        // zero padding is weird if comma-separating
+        if ( comma_separate )
+            padding = ' ';
+
+        // FIELD WIDTH
+        U64 min_field_width = 0;
+        if ( fmt [ i ] == '*' )
+        {
+            min_field_width = va_arg ( args, size_t );
+            ++ i;
+        }
+        else for ( ; isdigit ( fmt [ i ] ); ++ i )
+        {
+            min_field_width *= 10;
+            min_field_width += fmt [ i ] - '0';
+        }
+
+        // PRECISION
+        U64 precision = 0;
+        bool have_precision = false;
+        if ( fmt [ i ] == '.' )
+        {
+            padding = ' ';
+            have_precision = true;
+            if ( fmt [ i ] == '*' )
+            {
+                precision = va_arg ( args, size_t );
+                ++ i;
+            }
+            else for ( ; isdigit ( fmt [ i ] ); ++ i )
+            {
+                precision *= 10;
+                precision += fmt [ i ] - '0';
+            }
+        }
+
+        // STORAGE SIZE
+        U8 arg_size = sizeof ( U32 );
+        bool date_time_zone = false;
+        switch ( fmt [ i ] )
+        {
+        case 't':
+            arg_size = sizeof ( U8 );
+            ++ i;
+            break;
+        case 'h':
+            arg_size = sizeof ( U16 );
+            ++ i;
+            break;
+        case 'l':
+            arg_size = sizeof ( U64 );
+            ++ i;
+            break;
+        case 'z':
+            date_time_zone = true;
+            arg_size = sizeof ( size_t );
+            ++ i;
+            break;
+        }
+
+        // ARGUMENT
+        switch ( fmt [ i ] )
+        {
+        case 'u':
+        case 'X':
+        case 'x':
+        case 'o':
+        case 'b':
+            use_sign = 0;
+            switch ( arg_size )
+            {
+            case 1:
+                u64 = ( U8 ) va_arg ( args, U32 );
+                break;
+            case 2:
+                u64 = ( U16 ) va_arg ( args, U32 );
+                break;
+            case 4:
+                u64 = va_arg ( args, U32 );
+                break;
+            case 8:
+                u64 = va_arg ( args, U64 );
+                break;
+            }
+            break;
+
+        case 'd':
+        case 'i':
+            switch ( arg_size )
+            {
+            case 1:
+                i64 = ( I8 ) va_arg ( args, I32 );
+                break;
+            case 2:
+                i64 = ( I16 ) va_arg ( args, I32 );
+                break;
+            case 4:
+                i64 = va_arg ( args, I32 );
+                break;
+            case 8:
+                i64 = va_arg ( args, I64 );
+                break;
+            }
+
+            if ( i64 < 0 )
+            {
+                u64 = - i64;
+                use_sign = '-';
+            }
+            else
+            {
+                if ( i64 == 0 )
+                    use_sign = 0;
+                u64 = i64;
+            }
+            break;
+        }
+
+        // FORMAT
+        U32 comma_mag = 3;
+        ascii comma = ',';
+        //bool floating_comma = false;
+        U64 field_width, total_field_width;
+        switch ( fmt [ i ] )
+        {
+        case 'u':
+        case 'd':
+        case 'i':
+            base = 10;
+
+        l_cvt_integer:
+
+            j = sizeof num;
+            if ( u64 == 0 )
+            {
+                num [ -- j ] = '0';
+                digits = 1;
+            }
+            else if ( comma_separate )
+            {
+                for ( k = 0, digits = 0; u64 != 0; ++ digits, ++ k )
+                {
+                    if ( k == comma_mag )
+                    {
+                        num [ -- j ] = comma;
+                        k = 0;
+                    }
+                    num [ -- j ] = chmap [ u64 % base ];
+                    u64 /= base;
+                }
+                for ( ; digits < precision && j != 0; ++ digits, ++ k )
+                {
+                    if ( k == comma_mag )
+                    {
+                        num [ -- j ] = comma;
+                        k = 0;
+                        if ( j == 0 )
+                            break;
+                    }
+                    num [ -- j ] = 0;
+                }
+            }
+            else for ( digits = 0; u64 != 0; ++ digits )
+            {
+                num [ -- j ] = chmap [ u64 % base ];
+                u64 /= base;
+            }
+
+            field_width = sizeof num - j;
+
+        insert_num:
+
+            total_field_width = field_width + ( use_sign != 0 );
+
+            if ( left_align )
+            {
+                if ( use_sign != 0 )
+                    append ( use_sign );
+
+                append ( ConstString ( & num [ j ], field_width ) );
+ 
+                if ( total_field_width < min_field_width )
+                    append ( ' ', min_field_width - total_field_width );
+            }
+            else
+            {
+                // check sign and padding
+                if ( use_sign != 0 && padding == '0' )
+                {
+                    append ( use_sign );
+                    use_sign = 0;
+                }
+
+                // apply padding
+                if ( total_field_width < min_field_width )
+                    append ( padding, min_field_width - total_field_width );
+
+                // sign again
+                if ( use_sign != 0 )
+                    append ( use_sign );
+
+                // now the numeral
+                append ( ConstString ( & num [ j ], field_width ) );
+            }
+
+            break;
+
+
+        case 'X':
+            chmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+        case 'x':
+            base = 16;
+            comma_mag = 4;
+            goto l_cvt_integer;
+        case 'o':
+            base = 8;
+            goto l_cvt_integer;
+        case 'b':
+            base = 2;
+            comma_mag = 8;
+            goto l_cvt_integer;
+
+        case 's':
+        {
+            String null_str = CONST_STRING ( "(null)" );
+            str = va_arg ( args, const String * );
+            if ( str == 0 )
+                str = & null_str;
+
+            field_width = str -> length ();
+            if ( field_width >= min_field_width )
+            {
+                append ( * str );
+            }
+            else if ( left_align )
+            {
+                append ( * str );
+                append ( ' ', min_field_width - field_width );
+            }
+            else
+            {
+                append ( ' ', min_field_width - field_width );
+                append ( * str );
+            }
+
+            break;
+        }
+
+        case 'c':
+            ch = va_arg ( args, UTF32 );
+
+            field_width = 1;
+            if ( field_width >= min_field_width )
+            {
+                append ( ch );
+            }
+            else if ( left_align )
+            {
+                append ( ch );
+                append ( ' ', min_field_width - field_width );
+            }
+            else
+            {
+                append ( ' ', min_field_width - field_width );
+                append ( ch );
+            }
+            break;
+
+        case 'f':
+        case 'e':
+        case 'g':
+        {
+            f64 = va_arg ( args, F64 );
+            if ( f64 < 0 )
+            {
+                use_sign = '-';
+                f64 = - f64;
+            }
+
+            char fmt2 [ 16 ];
+            j = 0;
+            if ( alternate )
+                fmt2 [ j ++ ] = '#';
+            if ( min_field_width != 0 )
+                j += snprintf ( & fmt2 [ j ], sizeof fmt2 - j, "%u", ( U32 ) min_field_width );
+            if ( have_precision )
+            {
+                fmt2 [ j ++ ] = '.';
+                if ( precision != 0 )
+                    j += snprintf ( & fmt2 [ j ], sizeof fmt2 - j, "%u", ( U32 ) precision );
+            }
+            fmt2 [ j ++ ] = fmt [ i ];
+            fmt2 [ j ] = 0;
+
+            field_width = snprintf ( num, sizeof num, fmt2, f64 );
+            j = 0;
+            goto insert_num;
+        }
+
+        default:
+            // TBD - extract UTF32 character
+            THROW ( xc_bad_fmt_err, "expected one of [udiXxobscfeg] but found '%c'", fmt [ i ] );
+        }
+
+        return i;
+    }
+
+    void StringBuffer :: resize ( const bytes_t & new_size )
+    {
+        if ( new_size > buffer . size () )
+        {
+            FUNC_ENTRY ();
+
+            U64 rounded_size = ( ( U64 ) new_size + 4095 ) & ~ ( U64 ) 4095;
+            buffer . resize ( rounded_size, true );
+        }
+    }
+    
+}
diff --git a/vdb3/src/kfc/syserr.cpp b/vdb3/src/kfc/syserr.cpp
new file mode 100644
index 0000000..f240386
--- /dev/null
+++ b/vdb3/src/kfc/syserr.cpp
@@ -0,0 +1,97 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/syserr.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/except.hpp>
+
+#if UNIX
+#include <string.h>
+#else
+#error "unsupported target platform"
+#endif
+
+namespace vdb3
+{
+
+    static
+    String tmp_syserr ( int err_code, char * buffer, size_t bsize )
+    {
+#if UNIX
+        // get the error string from libc
+        strerror_r ( err_code, buffer, bsize );
+
+        // turn it into a temporary ConstString
+        return ConstString ( buffer, strlen ( buffer ) );
+#endif
+    }
+
+    // returns a system error string
+    String SysErr( int err_code )
+    {
+        // get SysErras a tmp ConstString
+        char buffer [ 4096 ];
+        String str = tmp_syserr ( err_code, buffer, sizeof buffer );
+
+        // allocate memory for a copy
+        Mem m = rsrc -> mmgr . alloc ( str . size (), false );
+
+        // create a string buffer
+        StringBuffer sb ( m );
+
+        // copy in the string
+        sb . append ( str );
+
+        // now return the safe string
+        return sb . to_str ();
+    }
+
+    // throws a runtime error
+    void ThrowOSErr( U32 lineno, const String & func_name, int err_code )
+    {
+        String msg;
+
+        try
+        {
+            // get SysErras a tmp ConstString
+            char buffer [ 4096 ];
+            String str = tmp_syserr ( err_code, buffer, sizeof buffer );
+
+            // create a string buffer
+            StringBuffer sb ( "%s() returned %d: '%s'", & func_name, err_code, & str );
+
+            msg = sb . to_str ();
+        }
+        catch ( ... )
+        {
+            msg = CONST_STRING ( "<error creating SysErrstring>" );
+        }
+
+        // throw exception
+        throw runtime_err ( lineno, msg );
+    }
+
+}
diff --git a/vdb3/src/kfc/task-impl.cpp b/vdb3/src/kfc/task-impl.cpp
new file mode 100644
index 0000000..e07b3ac
--- /dev/null
+++ b/vdb3/src/kfc/task-impl.cpp
@@ -0,0 +1,352 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb3/task-impl.hpp>
+#include <vdb3/callstk.hpp>
+#include <vdb3/except.hpp>
+#include <vdb3/caps.hpp>
+
+#include <string.h>
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * rsrc_stk_t
+     *  a class of general utility, but for now private to task
+     */
+    class rsrc_stk_t
+    {
+    public:
+
+        rsrc_stk_t ( const Rsrc * new_rsrc )
+            : old_rsrc ( rsrc )
+        { rsrc = new_rsrc; }
+
+        ~ rsrc_stk_t ()
+        { rsrc = old_rsrc; }
+
+    private:
+
+        const Rsrc * volatile old_rsrc;
+    };
+
+    /*------------------------------------------------------------------
+     * TaskImpl
+     */
+
+    bool TaskImpl :: run ()
+    {
+        FUNC_ENTRY ();
+
+        for ( task_state_t cur = state . read (); cur != ts_complete; )
+        {
+            // hold this value for comparison of our assumption
+            task_state_t cmp = cur;
+            task_state_t trans = ts_invalid;
+
+            switch ( cur )
+            {
+            case ts_unprepared:
+
+                // going to enter preparation state
+                trans = ts_preparing;
+                cur = state . test_and_set ( cmp, trans );
+                if ( cur == cmp )
+                {
+                    // this thread now has exclusive ability to prepare task
+                    cur = cmp = trans;
+                    {
+                        rsrc_stk_t stk ( & task_rsrc );
+                        prepare ();
+                    }
+
+                    // preparation completed
+                    // transition to initial run state
+                    trans = ts_initial;
+
+                    cur = state . test_and_set ( cmp, trans );
+                    if ( cur == ts_presuspend )
+                        cur = state . test_and_set ( cmp = cur, trans );
+
+                }
+                break;
+
+            case ts_updating:
+                CONST_THROW ( xc_task_busy_err, "task is currently being updated" );
+
+            case ts_preparing:
+            case ts_presuspend:
+                CONST_THROW ( xc_task_busy_err, "task is currently preparing" );
+
+            case ts_initial:
+            case ts_ready:
+            case ts_suspended:
+
+                // going to enter running state
+                trans = ts_running;
+                cur = state . test_and_set ( cmp, trans );
+                if ( cur == cmp )
+                {
+                    cur = trans;
+
+                    // this thread now has exclusive ability to run task
+                    bool done = false;
+                    {
+                        // push task resources onto stack
+                        rsrc_stk_t stk ( & task_rsrc );
+
+                        // run/resume the task
+                        done = ( cmp == ts_suspended ) ? resume () : execute ();
+                    }
+
+                    // the run completed
+                    // transition based upon indication of done
+                    trans = done ? ts_complete : ts_ready;
+
+                    // clean up state
+                    cur = state . test_and_set ( cmp = cur, trans );
+                    if ( cur == ts_suspending )
+                        cur = state . test_and_set ( cmp = cur, trans );
+
+                    // execution was successful, regardless of final state
+                    return done;
+                }
+                break;
+
+            case ts_running:
+            case ts_suspending:
+                CONST_THROW ( xc_task_busy_err, "task is currently executing" );
+
+            default:
+                assert ( cur != ts_complete );
+                THROW ( xc_task_invalid_err, "task is in an invalid state: ( 0x%X )", state . read () );
+            }
+
+            if ( cur == cmp )
+                cur = trans;
+        }
+
+        return true;
+    }
+
+    void TaskImpl :: suspend ()
+    {
+        FUNC_ENTRY ();
+
+        for ( task_state_t cur = state . read (); cur != ts_complete; )
+        {
+            task_state_t cmp = cur;
+            task_state_t trans = ts_invalid;
+
+            switch ( cur )
+            {
+            case ts_unprepared:
+                return;
+
+            case ts_updating:
+                CONST_THROW ( xc_task_busy_err, "task is currently being updated" );
+
+            case ts_preparing:
+                trans = ts_presuspend;
+                cur = state . test_and_set ( cmp, trans );
+                break;
+
+            case ts_presuspend:
+            case ts_initial:
+                return;
+
+            case ts_ready:
+                trans = ts_suspended;
+                cur = state . test_and_set ( cmp, trans );
+                break;
+
+            case ts_suspended:
+                return;
+
+            case ts_running:
+                trans = ts_suspending;
+                cur = state . test_and_set ( cmp, trans );
+                break;
+
+            case ts_suspending:
+                return;
+
+            default:
+                assert ( cur != ts_complete );
+                THROW ( xc_task_invalid_err, "task is in an invalid state: ( 0x%X )", cur );
+            }
+
+            if ( cur == cmp )
+                cur = trans;
+        }
+    }
+
+    void TaskImpl :: checkpoint ()
+    {
+        FUNC_ENTRY ();
+
+        // the task must be in initial or suspended state
+
+        CONST_THROW ( xc_unimplemented_err, "unimplemented" );
+    }
+
+    void TaskImpl :: restart ()
+    {
+        FUNC_ENTRY ();
+
+        // the task must be in initial or suspended state
+
+        CONST_THROW ( xc_unimplemented_err, "unimplemented" );
+    }
+
+    TaskImpl :: ~ TaskImpl ()
+    {
+    }
+
+    bool TaskImpl :: prepare ()
+    {
+        // nothing to do
+        return true;
+    }
+
+    bool TaskImpl :: resume ()
+    {
+        FUNC_ENTRY ();
+
+        // nothing special about this resume
+        // just run the task
+        return execute ();
+    }
+
+    void TaskImpl :: save ()
+    {
+        // no state to save
+    }
+
+    void TaskImpl :: restore ()
+    {
+        // no state to be restored
+    }
+
+    TaskImpl :: TaskImpl ()
+        : task_rsrc ( RCAP_ALL )
+        , state ( ts_unprepared )
+    {
+    }
+
+    TaskImpl :: TaskImpl ( rcaps_t caps )
+        : task_rsrc ( caps )
+        , state ( ts_unprepared )
+    {
+    }
+
+    void TaskImpl :: set_rsrc ( const Rsrc & rsrc )
+    {
+        FUNC_ENTRY ();
+
+        for ( task_state_t cur = state . read (); cur != ts_complete; )
+        {
+            task_state_t cmp = cur;
+            task_state_t trans = ts_invalid;
+
+            switch ( cur )
+            {
+            case ts_preparing:
+            case ts_presuspend:
+            case ts_running:
+            case ts_suspending:
+
+                trans = ts_updating;
+                cur = state . test_and_set ( cmp, trans );
+                if ( cur == cmp )
+                {
+                    cur = trans;
+                    try
+                    {
+                        task_rsrc = rsrc;
+                    }
+                    catch ( ... )
+                    {
+                        state = cmp;
+                        throw;
+                    }
+
+                    state = cmp;
+                    return;
+                }
+                break;
+
+            case ts_unprepared:
+            case ts_updating:
+            case ts_initial:
+            case ts_ready:
+            case ts_suspended:
+                CONST_THROW ( xc_program_state_violation, "cannot set task resources in current state" );
+
+            default:
+                THROW ( xc_task_invalid_err, "task is in an invalid state: ( 0x%X )", cur );
+            }
+
+            if ( cur == cmp )
+                cur = trans;
+        }
+    }
+
+    void TaskImpl :: set_complete ()
+    {
+        FUNC_ENTRY ();
+
+        for ( task_state_t cur = state . read (); cur != ts_complete; )
+        {
+            task_state_t cmp = cur;
+            task_state_t trans = ts_invalid;
+
+            switch ( cur )
+            {
+            case ts_preparing:
+            case ts_presuspend:
+            case ts_running:
+            case ts_suspending:
+                trans = ts_complete;
+                cur = state . test_and_set ( cur, trans );
+                break;
+
+            case ts_unprepared:
+            case ts_initial:
+            case ts_ready:
+            case ts_suspended:
+                CONST_THROW ( xc_program_state_violation, "cannot set task resources in current state" );
+
+            default:
+                THROW ( xc_task_invalid_err, "task is in an invalid state: ( 0x%X )", cur );
+            }
+
+            if ( cur == cmp )
+                cur = trans;
+        }
+    }
+}
diff --git a/vdb3/src/kfc/task.cpp b/vdb3/src/kfc/task.cpp
new file mode 100644
index 0000000..b195176
--- /dev/null
+++ b/vdb3/src/kfc/task.cpp
@@ -0,0 +1,109 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb3/task.hpp>
+#include <vdb3/caps.hpp>
+#include <vdb3/callstk.hpp>
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * TaskItf
+     */
+
+    Task TaskItf :: make_ref ( Refcount * obj, caps_t caps )
+    {
+        return Task ( obj, this, caps );
+    }
+
+    void * TaskItf :: cast ( Refcount * obj )
+    {
+        return ( void * ) dynamic_cast < TaskItf * > ( obj );
+    }
+
+    /*------------------------------------------------------------------
+     * Task
+     */
+
+    bool Task :: run ()
+    {
+        FUNC_ENTRY ();
+        TaskItf * itf = get_itf ( CAP_EXECUTE );
+        return itf -> run ();
+    }
+
+    void Task :: suspend ()
+    {
+        FUNC_ENTRY ();
+        TaskItf * itf = get_itf ( CAP_SUSPEND );
+        itf -> suspend ();
+    }
+
+    void Task :: checkpoint ()
+    {
+        FUNC_ENTRY ();
+        TaskItf * itf = get_itf ( CAP_READ );
+        itf -> checkpoint ();
+    }
+
+    void Task :: restart ()
+    {
+        FUNC_ENTRY ();
+        TaskItf * itf = get_itf ( CAP_WRITE );
+        itf -> restart ();
+    }
+
+    Task :: Task ()
+    {
+    }
+
+    Task :: Task ( const Task & r )
+        : Ref < TaskItf > ( r )
+    {
+    }
+
+    void Task :: operator = ( const Task & r )
+    {
+        Ref < TaskItf > :: operator = ( r );
+    }
+
+    Task :: Task ( const Task & r, caps_t reduce )
+        : Ref < TaskItf > ( r, reduce )
+    {
+    }
+
+    Task :: Task ( const OpaqueRef & r )
+        : Ref < TaskItf > ( r, TaskItf :: cast )
+    {
+    }
+
+    Task :: Task ( Refcount * obj, TaskItf * itf, caps_t caps )
+        : Ref < TaskItf > ( obj, itf, caps )
+    {
+    }
+
+}
diff --git a/vdb3/src/kfc/time.cpp b/vdb3/src/kfc/time.cpp
new file mode 100644
index 0000000..8f0a5b4
--- /dev/null
+++ b/vdb3/src/kfc/time.cpp
@@ -0,0 +1,290 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/time.hpp>
+#include <kfc/timemgr.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/callstk.hpp>
+
+namespace vdb3
+{
+
+    template < class T >
+    I64 round ( const T & tm, I64 d )
+    {
+        I64 val = tm;
+        if ( val >= 0 )
+            return ( val + ( d / 2 ) ) / d;
+        return ( val - ( d / 2 ) ) / d;
+    }
+
+
+    /*------------------------------------------------------------------
+     * tm_base_t
+     */
+
+    template < class T >
+    T tm_base_t < T > :: operator / ( I64 d ) const
+    {
+        if ( d == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+        return T ( val / d );
+    }
+
+    template < class T >
+    T tm_base_t < T > :: operator % ( I64 d ) const
+    {
+        if ( d == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+        return T ( val % d );
+    }
+
+    template < class T >
+    T & tm_base_t < T > :: operator /= ( I64 d )
+    {
+        if ( d == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+        val /= d;
+        return * ( T * ) this;
+    }
+
+    template < class T >
+    T & tm_base_t < T > :: operator %= ( I64 d )
+    {
+        if ( d == 0 )
+        {
+            FUNC_ENTRY ();
+            CONST_THROW ( xc_div_zero_err, "divide by zero" );
+        }
+        val %= d;
+        return * ( T * ) this;
+    }
+
+
+    /*------------------------------------------------------------------
+     * nS_t
+     *  represents nano-seconds
+     */
+
+    nS_t :: nS_t ( const uS_t & tm )
+        : tm_base_t < nS_t > ( ( I64 ) tm * 1000 )
+    {
+    }
+
+    void nS_t :: operator = ( const uS_t & tm )
+    {
+        val = ( I64 ) tm * 1000;
+    }
+
+    nS_t :: nS_t ( const mS_t & tm )
+        : tm_base_t < nS_t > ( ( I64 ) tm * 1000000 )
+    {
+    }
+
+    void nS_t :: operator = ( const mS_t & tm )
+    {
+        val = ( I64 ) tm * 1000000;
+    }
+
+    nS_t :: nS_t ( const seconds_t & tm )
+        : tm_base_t < nS_t > ( ( I64 ) tm * 1000000000 )
+    {
+    }
+
+    void nS_t :: operator = ( const seconds_t & tm )
+    {
+        val = ( I64 ) tm * 1000000000;
+    }
+
+
+
+    /*------------------------------------------------------------------
+     * uS_t
+     *  represents micro-seconds
+     */
+
+    uS_t :: uS_t ( const nS_t & tm )
+        : tm_base_t < uS_t > ( round ( tm, 1000 ) )
+    {
+    }
+
+    void uS_t :: operator = ( const nS_t & tm )
+    {
+        val = round ( tm, 1000 );
+    }
+
+    uS_t :: uS_t ( const mS_t & tm )
+        : tm_base_t < uS_t > ( ( I64 ) tm * 1000 )
+    {
+    }
+
+    void uS_t :: operator = ( const mS_t & tm )
+    {
+        val = ( I64 ) tm * 1000;
+    }
+
+    uS_t :: uS_t ( const seconds_t & tm )
+        : tm_base_t < uS_t > ( ( I64 ) tm * 1000000 )
+    {
+    }
+
+    void uS_t :: operator = ( const seconds_t & tm )
+    {
+        val = ( I64 ) tm * 1000000;
+    }
+
+
+
+    /*------------------------------------------------------------------
+     * mS_t
+     *  represents milli-seconds
+     */
+    mS_t :: mS_t ( const nS_t & tm )
+        : tm_base_t < mS_t > ( round ( tm, 1000000 ) )
+    {
+    }
+
+    void mS_t :: operator = ( const nS_t & tm )
+    {
+        val = round ( tm, 1000000 );
+    }
+
+    mS_t :: mS_t ( const uS_t & tm )
+        : tm_base_t < mS_t > ( round ( tm, 1000 ) )
+    {
+    }
+
+    void mS_t :: operator = ( const uS_t & tm )
+    {
+        val = round ( tm, 1000 );
+    }
+
+    mS_t :: mS_t ( const seconds_t & tm )
+        : tm_base_t < mS_t > ( ( I64 ) tm * 1000 )
+    {
+    }
+
+    void mS_t :: operator = ( const seconds_t & tm )
+    {
+        val = ( I64 ) tm * 1000;
+    }
+
+
+
+    /*------------------------------------------------------------------
+     * seconds_t
+     *  represents whole seconds
+     */
+    seconds_t :: seconds_t ( const nS_t & tm )
+        : tm_base_t < seconds_t > ( round ( tm, 1000000000 ) )
+    {
+    }
+
+    void seconds_t :: operator = ( const nS_t & tm )
+    {
+        val = round ( tm, 1000000000 );
+    }
+
+    seconds_t :: seconds_t ( const uS_t & tm )
+        : tm_base_t < seconds_t > ( round ( tm, 1000000 ) )
+    {
+    }
+
+    void seconds_t :: operator = ( const uS_t & tm )
+    {
+        val = round ( tm, 1000000 );
+    }
+
+    seconds_t :: seconds_t ( const mS_t & tm )
+        : tm_base_t < seconds_t > ( round ( tm, 1000 ) )
+    {
+    }
+
+    void seconds_t :: operator = ( const mS_t & tm )
+    {
+        val = round ( tm, 1000 );
+    }
+
+
+    /*------------------------------------------------------------------
+     * timeout_t
+     *  represents a time period in mS for triggering events
+     *  NB - this class has OS manifest dependencies
+     */
+
+    timeout_t :: timeout_t ( const nS_t & _delay )
+        : delay ( _delay )
+#if UNIX
+        , prepared ( 0 )
+#endif
+    {
+    }
+
+    timeout_t :: ~ timeout_t ()
+    {
+#if UNIX
+        prepared = 0;
+#endif
+    }
+
+    timeout_t :: timeout_t ( const timeout_t & tm )
+        : delay ( tm . delay )
+#if UNIX
+        , to ( tm . to )
+        , prepared ( tm . prepared )
+#endif
+    {
+    }
+
+    void timeout_t :: operator = ( const timeout_t & tm )
+    {
+        delay = tm . delay;
+#if UNIX
+        to = tm . to;
+        prepared = tm . prepared;
+#endif
+    }
+
+    void timeout_t :: prepare () const
+    {
+#if UNIX
+        // only POSIX timeouts need preparation
+        if ( prepared . test_and_set ( 0, 1 ) == 0 )
+        {
+            rsrc -> tmmgr . prepare_timeout ( * this );
+        }
+#endif
+    }
+}
diff --git a/vdb3/src/kfc/timemgr.cpp b/vdb3/src/kfc/timemgr.cpp
new file mode 100644
index 0000000..b17e91a
--- /dev/null
+++ b/vdb3/src/kfc/timemgr.cpp
@@ -0,0 +1,105 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/timemgr.hpp>
+#include <kfc/time.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/rsrc.hpp>
+#include <kfc/caps.hpp>
+
+
+namespace vdb3
+{
+
+
+    /*------------------------------------------------------------------
+     * TimeMgrItf
+     *  time manager
+     */
+
+    void TimeMgrItf :: prepare_timeout ( const timeout_t & tm ) const
+    {
+#if UNIX
+        FUNC_ENTRY ();
+
+        // POSIX needs to add the delay to current time
+        // to produce an absolute timeout
+        timestamp_t cur = cur_time ();
+
+        // as funny as this looks, we have mutable members
+        tm . to = tm . delay + cur;
+#endif
+    }
+
+    timestamp_t TimeMgrItf :: make_timestamp ( const nS_t & nS )
+    {
+        return timestamp_t ( nS );
+    }
+
+    TimeMgr TimeMgrItf :: make_tmmgr_ref ( Refcount * obj, caps_t caps )
+    {
+        return TimeMgr ( obj, this, caps );
+    }
+
+
+    /*------------------------------------------------------------------
+     * TimeMgr
+     *  time manager reference
+     */
+
+    timestamp_t TimeMgr :: cur_time () const
+    {
+        FUNC_ENTRY ();
+        TimeMgrItf * itf = get_itf ( CAP_READ );
+        return itf -> cur_time ();
+    }
+
+    void TimeMgr :: prepare_timeout ( const timeout_t & tm ) const
+    {
+        FUNC_ENTRY ();
+        TimeMgrItf * itf = get_itf ( CAP_READ );
+        itf -> prepare_timeout ( tm );
+    }
+
+    TimeMgr :: TimeMgr ()
+    {
+    }
+
+    TimeMgr :: TimeMgr ( const TimeMgr & r )
+        : Ref < TimeMgrItf > ( r )
+    {
+    }
+
+    void TimeMgr :: operator = ( const TimeMgr & r )
+    {
+        Ref < TimeMgrItf > :: operator = ( r );
+    }
+
+    TimeMgr :: TimeMgr ( Refcount * obj, TimeMgrItf * itf, caps_t caps )
+        : Ref < TimeMgrItf > ( obj, itf, caps )
+    {
+    }
+}
diff --git a/vdb3/src/kfc/vers.cpp b/vdb3/src/kfc/vers.cpp
new file mode 100644
index 0000000..32ba2af
--- /dev/null
+++ b/vdb3/src/kfc/vers.cpp
@@ -0,0 +1,85 @@
+/*===========================================================================
+*
+*                            PUBLIC DOMAIN NOTICE
+*               National Center for Biotechnology Information
+*
+*  This software/database is a "United States Government Work" under the
+*  terms of the United States Copyright Act.  It was written as part of
+*  the author's official duties as a United States Government employee and
+*  thus cannot be copyrighted.  This software/database is freely available
+*  to the public for use. The National Library of Medicine and the U.S.
+*  Government have not placed any restriction on its use or reproduction.
+*
+*  Although all reasonable efforts have been taken to ensure the accuracy
+*  and reliability of the software and data, the NLM and the U.S.
+*  Government do not and cannot warrant the performance or results that
+*  may be obtained by using this software or data. The NLM and the U.S.
+*  Government disclaim all warranties, express or implied, including
+*  warranties of performance, merchantability or fitness for any particular
+*  purpose.
+*
+*  Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfc/vers.hpp>
+#include <kfc/callstk.hpp>
+#include <kfc/except.hpp>
+
+namespace vdb3
+{
+
+    /*------------------------------------------------------------------
+     * vers_t
+     */
+    vers_t :: vers_t ()
+        : val ( 0 )
+    {
+    }
+
+    vers_t :: vers_t ( U32 maj )
+        : val ( maj << 24 )
+    {
+        FUNC_ENTRY ();
+        if ( maj > 255 )
+            THROW ( xc_bounds_err, "major version = %u", maj );
+    }
+
+    vers_t :: vers_t ( U32 maj, U32 min )
+        : val ( ( maj << 24 ) | ( min << 16 ) )
+    {
+        FUNC_ENTRY ();
+        if ( maj > 255 )
+            THROW ( xc_bounds_err, "major version = %u", maj );
+        if ( min > 255 )
+            THROW ( xc_bounds_err, "minor version = %u", min );
+    }
+
+    vers_t :: vers_t ( U32 maj, U32 min, U32 rel )
+        : val ( ( maj << 24 ) | ( min << 16 ) | ( rel << 8 ) )
+    {
+        FUNC_ENTRY ();
+        if ( maj > 255 )
+            THROW ( xc_bounds_err, "major version = %u", maj );
+        if ( min > 255 )
+            THROW ( xc_bounds_err, "minor version = %u", min );
+        if ( rel > 255 )
+            THROW ( xc_bounds_err, "release component = %u", rel );
+    }
+
+    vers_t :: vers_t ( U32 maj, U32 min, U32 rel, U32 post )
+        : val ( ( maj << 24 ) | ( min << 16 ) | ( rel << 8 ) | post )
+    {
+        FUNC_ENTRY ();
+        if ( maj > 255 )
+            THROW ( xc_bounds_err, "major version = %u", maj );
+        if ( min > 255 )
+            THROW ( xc_bounds_err, "minor version = %u", min );
+        if ( rel > 255 )
+            THROW ( xc_bounds_err, "release component = %u", rel );
+        if ( post > 255 )
+            THROW ( xc_bounds_err, "post-release component = %u", post );
+    }
+}

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



More information about the debian-med-commit mailing list